ZGlmZiAtLWdpdCBhL0NPUkUvQkFQL2luYy9iYXBBcGkuaCBiL0NPUkUvQkFQL2luYy9iYXBBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU2Y2EyCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvaW5jL2JhcEFwaS5oCkBAIC0wLDAgKzEsMjk0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgV0xBTl9RQ1RfV0xBTkJBUF9ICisjZGVmaW5lIFdMQU5fUUNUX1dMQU5CQVBfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICBXIEwgQSBOICAgQiBUIC0gQSBNIFAgIFAgQSBMICAgTCBBIFkgRSBSIAorICAgICAgICAgICAgICAgICAgICAgICBFIFggVCBFIFIgTiBBIEwgIEEgUCBJCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgCitERVNDUklQVElPTgorICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSSBleHBvc2VkIGJ5IHRoZSB3bGFuIEJULUFNUCBQQUwgbGF5ZXIgCisgIG1vZHVsZS4KKyAgCisgICAgICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6IC9jeWdkcml2ZS9kL0J1aWxkcy9NNzIwMUpTRENBQVBBRDUyMjQwQi9XTS9wbGF0Zm9ybS9tc203MjAwL1NyYy9Ecml2ZXJzL1NEL0NsaWVudERyaXZlcnMvV0xBTi9RQ1RfQlRBTVBfUlNOL0NPUkUvQkFQL2luYy9iYXBBcGkuaCx2IDEuMjEgMjAwOS8wMy8wOSAwODo1ODoyNiBqem11ZGEgRXhwIGp6bXVkYSAkICREYXRlVGltZTogJCAkQXV0aG9yOiBqem11ZGEgJAorCisKK3doZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDcvMDEvMDggICAgamV6ICAgICBDcmVhdGVkIG1vZHVsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUyBGT1IgTU9EVUxFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAidm9zX2FwaS5oIiAKKyNpbmNsdWRlICJ2b3NfcGFja2V0LmgiIAorLy9JIG5lZWQgdGhlIFRMIHR5cGVzIGFuZCBBUEkKKyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIgorCisvKiBCVC1BTVAgUEFMIEFQSSBzdHJ1Y3R1cmUgdHlwZXMgIC0gRnJhbWVzQyBnZW5lcmF0ZWQgKi8gCisjaW5jbHVkZSAiYnRhbXBIQ0kuaCIgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworICNlbmRpZiAKKyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgSENJIEludGVyZmFjZSBzdXBwb3J0ZWQKKyAqIAorICogICBIZXJlIHdlIGxpc3QgdGhlIEhDSSBDb21tYW5kcyBhbmQgRXZlbnRzIHdoaWNoIG91ciA4MDIuMTEgQlQtQU1QIFBBTAorICogICBzdXBwb3J0cy4KKyAqIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFN1cHBvcnRlZCBIQ0kgQ29tbWFuZHMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAgIAorI2lmIDAKKy8qKiBCVCB2My4wIExpbmsgQ29udHJvbCBjb21tYW5kcyAqLworICAgIEJUQU1QX1RMVl9IQ0lfQ1JFQVRFX1BIWVNJQ0FMX0xJTktfQ01ELAorICAgIEJUQU1QX1RMVl9IQ0lfQUNDRVBUX1BIWVNJQ0FMX0xJTktfQ01ELAorICAgIEJUQU1QX1RMVl9IQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LX0NNRCwKKyAgICBCVEFNUF9UTFZfSENJX0NSRUFURV9MT0dJQ0FMX0xJTktfQ01ELAorICAgIEJUQU1QX1RMVl9IQ0lfQUNDRVBUX0xPR0lDQUxfTElOS19DTUQsCisgICAgQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DTUQsCisgICAgQlRBTVBfVExWX0hDSV9MT0dJQ0FMX0xJTktfQ0FOQ0VMX0NNRCwKKyAgICBCVEFNUF9UTFZfSENJX0ZMT1dfU1BFQ19NT0RJRllfQ01ELAorLyoKK0hvc3QgQ29udHJvbGxlciBhbmQgQmFzZWJhbmQgQ29tbWFuZHMKKyovCisgICAgQlRBTVBfVExWX0hDSV9SRVNFVF9DTUQsCisgICAgQlRBTVBfVExWX0hDSV9TRVRfRVZFTlRfTUFTS19DTUQsCisgICAgQlRBTVBfVExWX0hDSV9GTFVTSF9DTUQsCisgICAgQlRBTVBfVExWX0hDSV9SRUFEX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVRfQ01ELAorICAgIEJUQU1QX1RMVl9IQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVF9DTUQsCisgICAgQlRBTVBfVExWX0hDSV9SRUFEX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVF9DTUQsCisgICAgQlRBTVBfVExWX0hDSV9XUklURV9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVRfQ01ELAorLyogdjMuMCBIb3N0IENvbnRyb2xsZXIgYW5kIEJhc2ViYW5kIENvbW1hbmRzICovCisgICAgQlRBTVBfVExWX0hDSV9SRUFEX0xPR0lDQUxfTElOS19BQ0NFUFRfVElNRU9VVF9DTUQsCisgICAgQlRBTVBfVExWX0hDSV9XUklURV9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVRfQ01ELAorICAgIEJUQU1QX1RMVl9IQ0lfU0VUX0VWRU5UX01BU0tfUEFHRV8yX0NNRCwKKyAgICBCVEFNUF9UTFZfSENJX1JFQURfTE9DQVRJT05fREFUQV9DTUQsCisgICAgQlRBTVBfVExWX0hDSV9XUklURV9MT0NBVElPTl9EQVRBX0NNRCwKKyAgICBCVEFNUF9UTFZfSENJX1JFQURfRkxPV19DT05UUk9MX01PREVfQ01ELAorICAgIEJUQU1QX1RMVl9IQ0lfV1JJVEVfRkxPV19DT05UUk9MX01PREVfQ01ELAorICAgIEJUQU1QX1RMVl9IQ0lfUkVBRF9CRVNUX0VGRk9SVF9GTFVTSF9UT19DTUQsCisgICAgQlRBTVBfVExWX0hDSV9XUklURV9CRVNUX0VGRk9SVF9GTFVTSF9UT19DTUQsCisvKiogb3Bjb2RlIGRlZmluaXRpb24gZm9yIHRoaXMgY29tbWFuZCBmcm9tIEFNUCBIQ0kgQ1IgRDlyNCBtYXJrdXAgKi8KKyAgICBCVEFNUF9UTFZfSENJX1NFVF9TSE9SVF9SQU5HRV9NT0RFX0NNRCwKKy8qIEVuZCBvZiB2My4wIEhvc3QgQ29udHJvbGxlciBhbmQgQmFzZWJhbmQgQ29tbWFuZHMgKi8KKy8qCitJbmZvcm1hdGlvbmFsIFBhcmFtZXRlcnMKKyovCisgICAgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT05fQ01ELAorICAgIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9TVVBQT1JURURfQ09NTUFORFNfQ01ELAorICAgIEJUQU1QX1RMVl9IQ0lfUkVBRF9CVUZGRVJfU0laRV9DTUQsCisvKiB2My4wIEluZm9ybWF0aW9uYWwgY29tbWFuZHMgKi8KKyAgICBCVEFNUF9UTFZfSENJX1JFQURfREFUQV9CTE9DS19TSVpFX0NNRCwKKy8qCitTdGF0dXMgUGFyYW1ldGVycworKi8KKyAgICBCVEFNUF9UTFZfSENJX1JFQURfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUl9DTUQsCisgICAgQlRBTVBfVExWX0hDSV9SRVNFVF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSX0NNRCwKKyAgICBCVEFNUF9UTFZfSENJX1JFQURfTElOS19RVUFMSVRZX0NNRCwKKyAgICBCVEFNUF9UTFZfSENJX1JFQURfUlNTSV9DTUQsCisgICAgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX0FNUF9JTkZPUk1BVElPTl9DTUQsCisgICAgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX0FNUF9BU1NPQ19DTUQsCisgICAgQlRBTVBfVExWX0hDSV9XUklURV9SRU1PVEVfQU1QX0FTU09DX0NNRCwKKy8qCitEZWJ1ZyBDb21tYW5kcworKi8KKyAgICBCVEFNUF9UTFZfSENJX1JFQURfTE9PUEJBQ0tfTU9ERV9DTUQsCisgICAgQlRBTVBfVExWX0hDSV9XUklURV9MT09QQkFDS19NT0RFX0NNRCwKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBTdXBwb3J0ZWQgSENJIEV2ZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAKKyNpZiAwCisvKiogQlQgZXZlbnRzICovCisgICAgQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5ULAorICAgIEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9TVEFUVVNfRVZFTlQsCisgICAgQlRBTVBfVExWX0hDSV9IQVJEV0FSRV9FUlJPUl9FVkVOVCwKKyAgICBCVEFNUF9UTFZfSENJX0ZMVVNIX09DQ1VSUkVEX0VWRU5ULAorICAgIEJUQU1QX1RMVl9IQ0lfTE9PUEJBQ0tfQ09NTUFORF9FVkVOVCwKKyAgICBCVEFNUF9UTFZfSENJX0RBVEFfQlVGRkVSX09WRVJGTE9XX0VWRU5ULAorICAgIEJUQU1QX1RMVl9IQ0lfUU9TX1ZJT0xBVElPTl9FVkVOVCwKKy8qKiBCVCB2My4wIGV2ZW50cyAqLworICAgIEJUQU1QX1RMVl9IQ0lfR0VORVJJQ19BTVBfTElOS19LRVlfTk9USUZJQ0FUSU9OX0VWRU5ULAorICAgIEJUQU1QX1RMVl9IQ0lfUEhZU0lDQUxfTElOS19DT01QTEVURV9FVkVOVCAsCisgICAgQlRBTVBfVExWX0hDSV9DSEFOTkVMX1NFTEVDVEVEX0VWRU5UICwKKyAgICBCVEFNUF9UTFZfSENJX0RJU0NPTk5FQ1RfUEhZU0lDQUxfTElOS19DT01QTEVURV9FVkVOVCAsCisgICAgQlRBTVBfVExWX0hDSV9QSFlTSUNBTF9MSU5LX0xPU1NfV0FSTklOR19FVkVOVCAsCisgICAgQlRBTVBfVExWX0hDSV9QSFlTSUNBTF9MSU5LX1JFQ09WRVJZX0VWRU5UICwKKyAgICBCVEFNUF9UTFZfSENJX0xPR0lDQUxfTElOS19DT01QTEVURV9FVkVOVCAsCisgICAgQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DT01QTEVURV9FVkVOVCAsCisgICAgQlRBTVBfVExWX0hDSV9GTE9XX1NQRUNfTU9ESUZZX0NPTVBMRVRFX0VWRU5UICwKKyAgICBCVEFNUF9UTFZfSENJX1NIT1JUX1JBTkdFX01PREVfQ0hBTkdFX0NPTVBMRVRFX0VWRU5UICwKKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIERlZmluZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUGFja2V0IHR5cGUgZGVmaW5lcyBmb3IgdGhlIEFNUCB0byBQQUwgcGFja2V0IGVuY2Fwc3VsYXRpb24uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAgIAorI2RlZmluZSBXTEFOQkFQX0hDSV9DT01NQU5EX1BBQ0tFVCAgICAgIDB4MDEgICAgIC8qKjwgSENJIGNvbW1hbmQgcGFja2V0IHR5cGUsIGNoYXJhY3Rlcml6aW5nIHBhY2tldCB0eXBlcyBvdmVyIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlQgYW5kIFJTMjMyIHRyYW5zcG9ydHMgKi8KKyNkZWZpbmUgV0xBTkJBUF9IQ0lfQUNMX0RBVEFfUEFDS0VUICAgICAweDAyICAgICAvKio8IEhDSSBBQ0wgZGF0YSBwYWNrZXQgdHlwZSwgY2hhcmFjdGVyaXppbmcgcGFja2V0IHR5cGVzIG92ZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVCBhbmQgUlMyMzIgdHJhbnNwb3J0cyAqLworI2RlZmluZSBXTEFOQkFQX0hDSV9TQ09fREFUQV9QQUNLRVQgICAgIDB4MDMgICAgIC8qKjwgSENJIFNDTyBkYXRhIHBhY2tldCB0eXBlLCBjaGFyYWN0ZXJpemluZyBwYWNrZXQgdHlwZXMgb3ZlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUIGFuZCBSUzIzMiB0cmFuc3BvcnRzICovCisjZGVmaW5lIFdMQU5CQVBfSENJX0VWRU5UX1BBQ0tFVCAgICAgICAgMHgwNCAgICAgLyoqPCBIQ0kgZXZlbnQgcGFja2V0IHR5cGUsIGNoYXJhY3Rlcml6aW5nIHBhY2tldCB0eXBlcyBvdmVyIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlQgYW5kIFJTMjMyIHRyYW5zcG9ydHMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEhDSSBEYXRhIHBhY2tldCBzaXplIGxpbWl0YXRpb24uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAgIAorI2RlZmluZSBXTEFOQkFQX01BWF84MDIxMV9QQUxfUERVX1NJWkUgICAgICAgICAgICAgICAgMTQ5MgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBIQ0kgRmxvdyBDb250cm9sIE1vZGVzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAKKyNkZWZpbmUgV0xBTkJBUF9GTE9XX0NPTlRST0xfTU9ERV9QQUNLRVRfQkFTRUQgICAgICAgIDB4MDAKKyNkZWZpbmUgV0xBTkJBUF9GTE9XX0NPTlRST0xfTU9ERV9CTE9DS19CQVNFRCAgICAgICAgIDB4MDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQlQgImFzc2lnbmVkIG51bWJlcnMiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAgIAorLy8gUXVhbGNvbW0gQ29tcGFueSBJRAorI2RlZmluZSBXTEFOQkFQX1FVQUxDT01NX0NPTVBBTllfSUQgICAgICAgICAgICAgICAgICAgICAyOQorCisvLyBIQ0kgSW50ZXJmYWNlIHZlcnNpb24gCisvLyBQYXJhbWV0ZXIgTmFtZSAgICAgICAgICAgICAgIEFzc2lnbmVkIFZhbHVlcyAKKy8vIEhDSV9WZXJzaW9uICAgICAgICAgICAgICAgICAgMCAgPT4gQmx1ZXRvb3RoIEhDSSBTcGVjaWZpY2F0aW9uIDEuMEIgCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgID0+IEJsdWV0b290aCBIQ0kgU3BlY2lmaWNhdGlvbiAxLjEgCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgID0+IEJsdWV0b290aCBIQ0kgU3BlY2lmaWNhdGlvbiAxLjIgCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgID0+IEJsdWV0b290aCBIQ0kgU3BlY2lmaWNhdGlvbiAyLjAgCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgID0+IEJsdWV0b290aCBIQ0kgU3BlY2lmaWNhdGlvbiAyLjEgCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgID0+IEJsdWV0b290aCBIQ0kgU3BlY2lmaWNhdGlvbiAzLjAgCisjZGVmaW5lIFdMQU5CQVBfSENJX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdMQU5CQVBfSENJX1JFVklTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIAorI2RlZmluZSBXTEFOQkFQX1BBTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTEFOQkFQX1BBTF9TVUJWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorCisvLyBBTVAgZGV2aWNlIHN0YXR1cyAKKyNkZWZpbmUgV0xBTkJBUF9IQ0lfQU1QX1NUQVRVU19QT1dFUkVEX0RPV04gICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgV0xBTkJBUF9IQ0lfQU1QX1NUQVRVU19OT1RfU0hBUkVEICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgV0xBTkJBUF9IQ0lfQU1QX1NUQVRVU19TSEFSRUQgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgV0xBTkJBUF9IQ0lfQU1QX1NUQVRVU19SRVNFUlZFRCAgICAgICAgICAgICAgICAgIDB4MDMKKworLy8gQUNMIFBhY2tldCB0eXBlcyAoQU1QIG9ubHkgdXNlcyAweDAzKSAKKyNkZWZpbmUgV0xBTkJBUF9IQ0lfUEtUX1NUQVJUX05PTl9GTFVTSCAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgV0xBTkJBUF9IQ0lfUEtUX0NPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgV0xBTkJBUF9IQ0lfUEtUX1NUQVJUX0ZMVVNIICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgV0xBTkJBUF9IQ0lfUEtUX0FNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQlQtQU1QIFBBTCBzdXBwb3J0ZWQgY29tbWFuZHMgZGVmaW5lcyAKKworICBUaGUgU3VwcG9ydGVkIENvbW1hbmRzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGxpc3RzIHdoaWNoIEhDSSBjb21tYW5kcyB0aGUgCitsb2NhbCBjb250cm9sbGVyIHN1cHBvcnRzLiBJdCBpcyBpbXBsaWVkIHRoYXQgaWYgYSBjb21tYW5kIGlzIGxpc3RlZCBhcyAKK3N1cHBvcnRlZCwgdGhlIGZlYXR1cmUgdW5kZXJseWluZyB0aGF0IGNvbW1hbmQgaXMgYWxzbyBzdXBwb3J0ZWQuCisgIFRoZSBTdXBwb3J0ZWQgQ29tbWFuZHMgaXMgYSA2NCBvY3RldCBiaXQgZmllbGQuIElmIGEgYml0IGlzIHNldCB0byAxLCB0aGVuIAordGhpcyBjb21tYW5kIGlzIHN1cHBvcnRlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAKKy8vICAgIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcKKworI2RlZmluZSBXTEFOQkFQX1BBTF9TVVBQT1JURURfSENJX0NNRFMgeyAgXAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MGMsIFwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDg4LCAweDNjLCBcCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwNywgXAorICAgIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIFwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCBcCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgXAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIFwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwICBcCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEJULUFNUCBQQUwgInN0YXR1cyIgYW5kICJyZWFzb24iIGVycm9yIGNvZGUgZGVmaW5lcyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgCisjZGVmaW5lIFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkgLyogU3VjY2Vzcy4gU2VjdGlvbiAzLjEuNyAqLworCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfVU5LTk9XTl9IQ0lfQ01ORCAgICAgICAgICAgICAgICAoMHgwMSkgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX05PX0NOQ1QgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDIpICAvKiBBTVAgSENJIFNlY3Rpb24gNy4xLjM5ICovCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfSEFSRFdBUkVfRkFJTFVSRSAgICAgICAgICAgICAgICAoMHgwMykgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfUEFHRV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAoMHgwNCkgIAorLyogU2VjdGlvbiAzLjEuMTAgaGFzIHRoaXMgbWlzLWlkZW50aWZpZWQgYXMgMHgwOCAgKi8gCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfQVVUSEVOVF9GQUlMVVJFICAgICAgICAgICAgICAgICAoMHgwNSkgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX0tFWV9NSVNTSU5HICAgICAgICAgICAgICAgICAgICAgKDB4MDYpIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX01FTU9SWV9GVUxMICAgICAgICAgICAgICAgICAgICAgKDB4MDcpIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX0NOQ1RfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgKDB4MDgpICAvKiBTZWN0aW9uIDMuMS44ICovCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfTUFYX05VTV9DTkNUUyAgICAgICAgICAgICAgICAgICAoMHgwOSkgIC8qIFNlY3Rpb24gMy4xLjggKi8gICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9NQVhfTlVNX1NDT19DTkNUUyAgICAgICAgICAgICAgICgweDBhKSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX01BWF9OVU1fQUNMX0NOQ1RTICAgICAgICAgICAgICAgKDB4MGIpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfQ01ORF9ESVNBTExPV0VEICAgICAgICAgICAgICAgICAoMHgwYykgIC8qIFNlY3Rpb24gNC4xICovICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX0hPU1RfUkVKX1JFU09VUkNFUyAgICAgICAgICAgICAgKDB4MGQpICAvKiBTZWN0aW9uIDMuMS43ICovIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX0hPU1RfUkVKX1NFQ1VSSVRZICAgICAgICAgICAgICAgKDB4MGUpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfSE9TVF9SRUpfUEVSU09OQUxfREVWICAgICAgICAgICAoMHgwZikgICAgICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9IT1NUX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICgweDEwKSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX1VOU1VQUE9SVF9GRUFUX1BBUkFNICAgICAgICAgICAgKDB4MTEpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfSU5WQUxJRF9IQ0lfQ01ORF9QQVJBTSAgICAgICAgICAoMHgxMikgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX1RFUk1fQ05DVF9VU0VSX0VOREVEICAgICAgICAgICAgKDB4MTMpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfVEVSTV9DTkNUX0xPV19SRVNPVVJDRSAgICAgICAgICAoMHgxNCkgICAgICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9URVJNX0NOQ1RfUE9XRVJfT0ZGICAgICAgICAgICAgICgweDE1KSAgICAgIAorLyogU2VjdGlvbiAzLjEuOSBoYXMgYSBjb250cmFkaWN0b3J5IHNlbWFudGljcyBvZiAiZmFpbGVkIGNvbm5lY3Rpb24iICovICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVCAgICAgICAgICAgICAgKDB4MTYpIC8qIFNlY3Rpb24gMy4xLjggKi8gIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX1JFUEVBVEVEX0FUVEVNUFRTICAgICAgICAgICAgICAgKDB4MTcpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfUEFJUklOR19OT1RfQUxMT1dFRCAgICAgICAgICAgICAoMHgxOCkgICAgICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9VTktOT1dOX0xNUF9QRFUgICAgICAgICAgICAgICAgICgweDE5KSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX1VOU1VQUE9SVEVEX1JFTU9URV9GRUFUICAgICAgICAgKDB4MWEpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfU0NPX1JFSiAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxYikgICAgICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9TQ09fSU5URVJWQUxfUkVKICAgICAgICAgICAgICAgICgweDFjKSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX1NDT19BSVJfTU9ERV9SRUogICAgICAgICAgICAgICAgKDB4MWQpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfSU5WQUxJRF9MTVBfUEFSQU1FVEVSICAgICAgICAgICAoMHgxZSkgICAgICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9VTlNQRUNJRklFRF9FUlJPUiAgICAgICAgICAgICAgICgweDFmKSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX1VOU1VQUE9SVEVEX0xNUF9QQVJBTSAgICAgICAgICAgKDB4MjApICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfUk9MRV9DSEFOR0VfTk9UX0FMTE9XRUQgICAgICAgICAoMHgyMSkgICAgICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9MTVBfUkVTUE9OU0VfVElNRU9VVCAgICAgICAgICAgICgweDIyKSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX0xNUF9FUlJPUl9UUkFOU19DT0xMSVNJT04gICAgICAgKDB4MjMpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfTE1QX1BEVV9OT1RfQUxMT1dFRCAgICAgICAgICAgICAoMHgyNCkgICAgICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9FTkNSWVBUSU9OX01PREVfTk9UX0FDQ0VQVEFCTEUgICgweDI1KSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX1VOSVRfS0VZX1VTRUQgICAgICAgICAgICAgICAgICAgKDB4MjYpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfUU9TX0lTX05PVF9TVVBQT1JURUQgICAgICAgICAgICAoMHgyNykgICAgICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9JTlNUQU5UX1BBU1NFRCAgICAgICAgICAgICAgICAgICgweDI4KSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX1VOSVRfS0VZX1BBSVJJTkdfVU5TVVBQT1JURUQgICAgKDB4MjkpICAgICAgCisKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9ESUZGRVJFTlRfVFJBTlNfQ09MTElTSU9OICAgICAgICgweDJBKSAgICAgIAorCisvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyQikgKi8KKworI2RlZmluZSBXTEFOQkFQX0VSUk9SX1FPU19VTkFDQ0VQVEFCTEVfUEFSQU1FVEVSICAgICAgKDB4MkMpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfUU9TX1JFSkVDVEVEICAgICAgICAgICAgICAgICAgICAoMHgyRCkgICAgICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9DSEFOTkVMX0NMQVNTSUZJQ0FUSU9OX05TICAgICAgICgweDJFKSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX0lOU1VGRklDSUVOVF9TRUNVUklUWSAgICAgICAgICAgKDB4MkYpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfUEFSTV9PVVRfT0ZfTUFOREFUT1JZX1JBTkdFICAgICAoMHgzMCkgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMxKSAqLworCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfUk9MRV9TV0lUQ0hfUEVORElORyAgICAgICAgICAgICAoMHgzMikgICAgICAKKworLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzMpICovCisKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9SRVNFUlZFRF9TTE9UX1ZJT0xBVElPTiAgICAgICAgICgweDM0KSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX1JPTEVfU1dJVENIX0ZBSUxFRCAgICAgICAgICAgICAgKDB4MzUpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfRUlSX1RPT19MQVJHRSAgICAgICAgICAgICAgICAgICAoMHgzNikgICAgICAKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9TU1BfTk9UX1NVUFBPUlRFRF9CWV9IT1NUICAgICAgICgweDM3KSAgICAgIAorI2RlZmluZSBXTEFOQkFQX0VSUk9SX0hPU1RfQlVTWV9QQUlSSU5HICAgICAgICAgICAgICAgKDB4MzgpICAgICAgCisjZGVmaW5lIFdMQU5CQVBfRVJST1JfTk9fU1VJVEFCTEVfQ0hBTk5FTCAgICAgICAgICAgICAoMHgzOSkKKyNkZWZpbmUgV0xBTkJBUF9FUlJPUl9DT05UUk9MTEVSX0JVU1kgICAgICAgICAgICAgICAgICgweDNBKSAgICAgIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgRXZlbnRfTWFza19QYWdlXzIgZGVmaW5lcyBmb3IgZXZlbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0xBTkJBUF9FVkVOVF9NQVNLX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMCAvL05vIGV2ZW50cyBzcGVjaWZpZWQgKGRlZmF1bHQpCisjZGVmaW5lIFdMQU5CQVBfRVZFTlRfTUFTS19QSFlfTElOS19DT01QTEVURV9FVkVOVCAweDAwMDAwMDAwMDAwMDAwMDEgLy9QaHlzaWNhbCBMaW5rIENvbXBsZXRlIEV2ZW50CisjZGVmaW5lIFdMQU5CQVBfRVZFTlRfTUFTS19DSEFOTkVMX1NFTEVDVEVEX0VWRU5UICAweDAwMDAwMDAwMDAwMDAwMDIgLy9DaGFubmVsIFNlbGVjdGVkIEV2ZW50CisjZGVmaW5lIFdMQU5CQVBfRVZFTlRfTUFTS19ESVNDX1BIWV9MSU5LX0VWRU5UICAgICAweDAwMDAwMDAwMDAwMDAwMDQgLy9EaXNjb25uZWN0aW9uIFBoeXNpY2FsIExpbmsgRXZlbnQKKyNkZWZpbmUgV0xBTkJBUF9FVkVOVF9NQVNLX1BIWV9MSU5LX0xPU1NfRUFSTFlfV0FSTklOR19FVkVOVCAweDAwMDAwMDAwMDAwMDAwMDggLy9QaHlzaWNhbCBMaW5rIExvc3MgRWFybHkgV2FybmluZyBFdmVudAorI2RlZmluZSBXTEFOQkFQX0VWRU5UX01BU0tfUEhZX0xJTktfUkVDT1ZFUllfRVZFTlQgMHgwMDAwMDAwMDAwMDAwMDEwIC8vUGh5c2ljYWwgTGluayBSZWNvdmVyeSBFdmVudAorI2RlZmluZSBXTEFOQkFQX0VWRU5UX01BU0tfTE9HX0xJTktfQ09NUExFVEVfRVZFTlQgMHgwMDAwMDAwMDAwMDAwMDIwIC8vTG9naWNhbCBMaW5rIENvbXBsZXRlIEV2ZW50CisjZGVmaW5lIFdMQU5CQVBfRVZFTlRfTUFTS19ESVNDX0xPR19MSU5LX0NPTVBMRVRFX0VWRU5UIDB4MDAwMDAwMDAwMDAwMDA0MCAvL0Rpc2Nvbm5lY3Rpb24gTG9naWNhbCBMaW5rIENvbXBsZXRlIEV2ZW50CisjZGVmaW5lIFdMQU5CQVBfRVZFTlRfTUFTS19GTE9XX1NQRUNfTU9EX0NPTVBMRVRFX0VWRU5UIDB4MDAwMDAwMDAwMDAwMDA4MCAvL0Zsb3cgU3BlYyBNb2RpZnkgQ29tcGxldGUgRXZlbnQKKyNkZWZpbmUgV0xBTkJBUF9FVkVOVF9NQVNLX05VTV9DT01QTEVURURfREFUQV9CTE9DS1NfRVZFTlQgMHgwMDAwMDAwMDAwMDAwMTAwIC8vTnVtYmVyIG9mIENvbXBsZXRlZCBEYXRhIEJsb2NrcyBFdmVudAorI2RlZmluZSBXTEFOQkFQX0VWRU5UX01BU0tfQU1QX1NUQVJUX1RFU1RfRVZFTlQgICAgMHgwMDAwMDAwMDAwMDAwMjAwIC8vQU1QIFN0YXJ0IFRlc3QgRXZlbnQKKyNkZWZpbmUgV0xBTkJBUF9FVkVOVF9NQVNLX0FNUF9URVNUX0VORF9FVkVOVCAgICAgIDB4MDAwMDAwMDAwMDAwMDQwMCAvL0FNUCBUZXN0IEVuZCBFdmVudAorI2RlZmluZSBXTEFOQkFQX0VWRU5UX01BU0tfQU1QX1JDVlJfUkVQT1JUX0VWRU5UICAgMHgwMDAwMDAwMDAwMDAwODAwIC8vQU1QIFJlY2VpdmVyIFJlcG9ydCBFdmVudAorI2RlZmluZSBXTEFOQkFQX0VWRU5UX01BU0tfU0hPUlRfUkFOR0VfTU9ERV9DSEFOR0VfQ09NUExFVEVfRVZFTlQgMHgwMDAwMDAwMDAwMDAxMDAwIC8vU2hvcnQgUmFuZ2UgTW9kZSBDaGFuZ2UgQ29tcGxldGUgRXZlbnQKKyNkZWZpbmUgV0xBTkJBUF9FVkVOVF9NQVNLX0FNUF9TVEFUVVNfQ0hBTkdFX0VWRU5UIDB4MDAwMDAwMDAwMDAwMjAwMCAvL0FNUCBTdGF0dXMgQ2hhbmdlIEV2ZW50CisjZGVmaW5lIFdMQU5CQVBfRVZFTlRfTUFTS19SRVNFUlZFRCAgICAgICAgICAgICAgICAweEZGRkZGRkZGRkZGRkMwMDAgLy9SZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUeXBlZGVmcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9wYXF1ZSBCQVAgaGFuZGxlIFR5cGUgRGVjbGFyYXRpb24gCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdl9QVk9JRF90IHRCdGFtcEhhbmRsZSwgKnB0QnRhbXBIYW5kbGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEJBUCBwZXItc2Vzc2lvbiBDb250ZXh0IERhdGEgVHlwZSBEZWNsYXJhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBNb3ZlIHRoaXMgdG8gYmFwSW50ZXJuYWwuaCwgd2hlcmUgaXQgYmVsb25ncy4KKy8vIEZvciBub3csIGl0IGlzIGp1c3QgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHBlciBhcHBsaWNhdGlvbiBjb250ZXh0LgorLy90eXBlZGVmIHN0cnVjdCBzQnRhbXBDb250ZXh0IHRCdGFtcFNlc3NDdHg7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSENJIEV2ZW50IHVuaW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAgIAordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wSENJX0V2ZW50IHsKKyAgICB2X1U4X3QgIGJhcEhDSUV2ZW50Q29kZTsgIC8qIFRoZSBldmVudCBjb2RlLiAgVG8gZGlzLWFtYmlndWF0ZS4gKi8KKyAgICB1bmlvbiB7IAorICAgICAgICB0QnRhbXBUTFZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCAgYnRhbXBDaGFubmVsU2VsZWN0ZWRFdmVudDsKKyAgICAgICAgdEJ0YW1wVExWSENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQgYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudCA7CisgICAgICAgIHRCdGFtcFRMVkhDSV9Db21tYW5kX1N0YXR1c19FdmVudCBidGFtcENvbW1hbmRTdGF0dXNFdmVudCA7CisgICAgICAgIHRCdGFtcFRMVkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudCBidGFtcERhdGFCdWZmZXJPdmVyZmxvd0V2ZW50IDsKKyAgICAgICAgdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50IGJ0YW1wRGlzY29ubmVjdExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudCA7CisgICAgICAgIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgYnRhbXBEaXNjb25uZWN0UGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudCA7CisgICAgICAgIC8qIEZsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQgaXMgZ2VuZXJhdGVkIGFmdGVyIHRoZSBmbG93IHNwZWMgbW9kaWZ5IGNtZCBjb21wbGV0ZXMgKi8KKyAgICAgICAgdEJ0YW1wVExWSENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQgYnRhbXBGbG93U3BlY01vZGlmeUNvbXBsZXRlRXZlbnQgOworICAgICAgICAvKiBBc3luY2hyb25vdXMgRmx1c2hfT2NjdXJyZWQgRXZlbnQgQ0FOIEFMU08gQkUgZ2VuZXJhdGVkIGFmdGVyIHRoZSBmbHVzaCBjbWQgY29tcGxldGVzICovCisgICAgICAgIHRCdGFtcFRMVkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCBidGFtcEZsdXNoT2NjdXJyZWRFdmVudCA7CisgICAgICAgIHRCdGFtcFRMVkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQgYnRhbXBHZW5lcmljQU1QTGlua0tleU5vdGlmaWNhdGlvbkV2ZW50IDsKKyAgICAgICAgdEJ0YW1wVExWSENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50IGJ0YW1wSGFyZHdhcmVFcnJvckV2ZW50IDsKKyAgICAgICAgdEJ0YW1wVExWSENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCBidGFtcExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudCA7CisgICAgICAgIHRCdGFtcFRMVkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50IGJ0YW1wTG9vcGJhY2tDb21tYW5kRXZlbnQgOworICAgICAgICB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCBidGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQgOworICAgICAgICB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQgYnRhbXBQaHlzaWNhbExpbmtMb3NzV2FybmluZ0V2ZW50IDsKKyAgICAgICAgdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnQgYnRhbXBQaHlzaWNhbExpbmtSZWNvdmVyeUV2ZW50IDsKKyAgICAgICAgdEJ0YW1wVExWSENJX1Fvc19WaW9sYXRpb25fRXZlbnQgYnRhbXBRb3NWaW9sYXRpb25FdmVudCA7CisgICAgICAgIHRCdGFtcFRMVkhDSV9TaG9ydF9SYW5nZV9Nb2RlX0NoYW5nZV9Db21wbGV0ZV9FdmVudCBidGFtcFNob3J0UmFuZ2VNb2RlQ2hhbmdlQ29tcGxldGVFdmVudCA7CisgICAgICAgIHRCdGFtcFRMVkhDSV9OdW1fQ29tcGxldGVkX1BrdHNfRXZlbnQgYnRhbXBOdW1PZkNvbXBsZXRlZFBrdHNFdmVudDsKKyAgICAgICAgdEJ0YW1wVExWSENJX051bV9Db21wbGV0ZWRfRGF0YV9CbG9ja3NfRXZlbnQgYnRhbXBOdW1PZkNvbXBsZXRlZERhdGFCbG9ja3NFdmVudDsKKyAgICAgICAgdEJ0YW1wVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50IGJ0YW1wRW5oYW5jZWRGbHVzaENvbXBsZXRlRXZlbnQgOworICAgIH0gdTsKK30gdEJ0YW1wSENJX0V2ZW50LCAqdHBCdGFtcEhDSV9FdmVudDsKKworLyogODAyLjMgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAvKiBEZXN0aW5hdGlvbiBhZGRyZXNzIGZpZWxkICovCisgdl9VOF90ICAgdkRBW1ZPU19NQUNfQUREUl9TSVpFXTsKKworIC8qIFNvdXJjZSBhZGRyZXNzIGZpZWxkICovCisgdl9VOF90ICAgdlNBW1ZPU19NQUNfQUREUl9TSVpFXTsKKworIC8qIExlbmd0aCBmaWVsZCAqLworIHZfVTE2X3QgIHVzTGVuVHlwZTsgIC8qIE51bSBieXRlcyBpbiBpbmZvIGZpZWxkIChpLmUuLCBleGNsdWRlIDgwMi4zIGhkcikgKi8KKyAgICAgICAgICAgICAgICAgICAgICAvKiBNYXggbGVuZ3RoIDE1MDAgKDB4NWRjKSAoV2hhdCBhYm91dCAweDVlZT8gVGhhdAorICAgICAgICAgICAgICAgICAgICAgICAqIGluY2x1ZGVzIDgwMi4zIEhlYWRlciBhbmQgRkNTLikgKi8KK31XTEFOQkFQXzgwMjNIZWFkZXJUeXBlOworCisKKy8qIAorICogQSBsaXN0IG9mIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgbXNncyB3aGljaCB3aWxsIGJlIAorICogc2lnbmFsbGVkIGJ5IHRoZSBFdmVudCBDYWxsYmFjayAKKyAqLyAKKyNpZiAwCisvKiBUaGUgdEJ0YW1wVExWSENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQgc3RydWN0dXJlIGluY2x1ZGVzIGVhY2ggb2YgdGhlc2UqLworLyogSENJIFJlc2V0OiBzdGF0dXMgKi8KKy8qIEhDSSBGbHVzaDogc3RhdHVzLCBsb2dfbGlua19oYW5kbGUgKi8KKworI2VuZGlmCisKKy8qIAorICogQ29tbWFuZCBDb21wbGV0ZSBldmVudCBtc2dzIHdoaWNoIHdpbGwgYmUgZm9ybWVkIGJ5IHRoZSBjYWxsZXIgCisgKiBOb3cgYW4gaW52b2NhdGlvbiBvZiBidGFtcFBhY2tUbHZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCgpCisgKiBzdXBwb3J0cyBnZW5lcmF0aW5nIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgbWVzc2FnZXMgZm9yIGFsbCBjb21tYW5kcy4uLiAgCisgKi8KKy8qIFRoZSB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCBzdHJ1Y3R1cmUgaW5jbHVkZXMgZWFjaCBvZiB0aGVzZSovCisjaWYgMAorLyogSENJIENhbmNlbCBMb2dpY2FsIExpbms6IHN0YXR1cywgcGh5X2xpbmtfaGFuZGxlLCB0eF9mbG93X3NwZWNfaWQgKi8KKy8qIEhDSSBTZXQgRXZlbnQgTWFzazogc3RhdHVzICovCisvKiBIQ0kgUmVhZCBDb25uZWN0aW9uIEFjY2VwdCBUaW1lb3V0OiBzdGF0dXMsIGNvbm5lY3Rpb25fYWNjZXB0X3RpbWVvdXQgKi8KKy8qIEhDSSBXcml0ZSBDb25uZWN0aW9uIEFjY2VwdCBUaW1lb3V0OiAgc3RhdHVzICovCisvKiBIQ0kgUmVhZCBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXQ6IHN0YXR1cywgbG9nX2xpbmtfaGFuZGxlICg4IHNpZyBiaXRzIG9ubHkpLCBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQgKi8KKy8qIEhDSSBXcml0ZSBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXQ6IHN0YXR1cywgbG9nX2xpbmtfaGFuZGxlICg4IGJpdHMgc2lnIG9ubHkpICovCisvKiBIQ0kgUmVhZCBMb2dpY2FsIExpbmsgQWNjZXB0IFRpbWVvdXQ6IHN0YXR1cywgbG9naWNhbF9saW5rX2FjY2VwdF90aW1lb3V0ICovCisvKiBIQ0kgV3JpdGUgTG9naWNhbCBMaW5rIEFjY2VwdCBUaW1lb3V0OiAgc3RhdHVzICovCisvKiBIQ0kgU2V0IEV2ZW50IE1hc2sgUGFnZSAyOiBzdGF0dXMgKi8KKy8qIEhDSSBSZWFkIExvY2F0aW9uIERhdGE6IHN0YXR1cywgbG9jX2RvbWFpbl9hd2FyZSwgbG9jX2RvbWFpbiwgbG9jX29wdGlvbnMgKi8KKy8qIEhDSSBXcml0ZSBMb2NhdGlvbiBEYXRhOiAgc3RhdHVzICovCisvKiBIQ0kgUmVhZCBGbG93IENvbnRyb2wgTW9kZTogc3RhdHVzLCBmbG93X2NvbnRyb2xfbW9kZSAqLworLyogSENJIFdyaXRlIEZsb3cgQ29udHJvbCBNb2RlOiAgc3RhdHVzICovCisvKiBIQ0kgUmVhZCBCZXN0IEVmZm9ydCBGbHVzaCBUaW1lb3V0OiBzdGF0dXMsIChsb2dpY2FsX2xpbmtfaGFuZGxlID8gTm8hKSwgYmVzdF9lZmZvcnRfZmx1c2hfdGltZW91dCAqLworLyogSENJIFdyaXRlIEJlc3QgRWZmb3J0IEZsdXNoIFRpbWVvdXQ6ICBzdGF0dXMgKi8KKy8qIEhDSSBTZXQgU2hvcnQgUmFuZ2UgTW9kZTogIHN0YXR1cyAqLworLyogSENJIFJlYWQgTG9jYWwgVmVyc2lvbiBJbmZvOiBzdGF0dXMsIEhDX0hDSV9WZXJzaW9uLCBIQ19IQ0lfUmV2aXNpb24sIEhDX1BBTF9WZXJzaW9uLCBIQ19NYW51ZmFjX05hbWUsIEhDX1BBTF9TdWJfVmVyc2lvbiAqLworLyogSENJIFJlYWQgTG9jYWwgc3VwcG9ydGVkIGNvbW1hbmRzOiBzdGF0dXMsIEhDX1N1cHBvcnRfQ21kcyAqLworLyogSENJIFJlYWQgQnVmZmVyIFNpemU6ICAgIHN0YXR1cywgSENfQUNMX0RhdGFfUGFja2V0X0xlbmd0aCwgIEhDX1NDT19QYWNrZXRfTGVuZ3RoLCAgSENfVG90YWxfTnVtX0FDTF9QYWNrZXRzLCBIQ19Ub3RhbF9OdW1fU0NPX1BhY2tldHMgKi8KKy8qIEhDSSBSZWFkIERhdGEgQmxvY2sgU2l6ZTogICBzdGF0dXMsIEhDX01heF9BQ0xfRGF0YV9QYWNrZXRfTGVuZ3RoLCAgSENfRGF0YV9CbG9ja19MZW5ndGgsIEhDX1RvdGFsX051bV9EYXRhX0Jsb2NrcyAqLworLyogSENJIFJlYWQgRmFpbGVkIENvbnRhY3QgQ291bnRlcjogc3RhdHVzLCBsb2dfbGlua19oYW5kbGUsICpwRmFpbGVkQ29udGFjdENvdW50ZXIgKi8KKy8qIEhDSSBSZXNldCBGYWlsZWQgQ29udGFjdCBDb3VudGVyOiBzdGF0dXMsIGxvZ19saW5rX2hhbmRsZSAqLworLyogSENJIFJlYWQgTGluayBRdWFsaXR5OiBzdGF0dXMsIGxvZ19saW5rX2hhbmRsZSg/WWVzIT8pLCBsaW5rX3F1YWxpdHkgKi8KKy8qIEhDSSBSZWFkIFJTU0k6IHN0YXR1cywgcGh5X2xpbmtfaGFuZGxlLCByc3NpICovCisvKiBIQ0kgUmVhZCBMb2NhbCBBTVAgSW5mbzogc3RhdHVzLCBIQ19BTVBfU3RhdHVzLCBIQ19Ub3RhbF9CVywgSENfTWF4X0d1YXJhbnRlZWRfQlcsIEhDX01pbl9MYXRlbmN5LCBIQ19NYXhfUERVX1NpemUsIEhDX0NvbnRyb2xsZXJfVHlwZSwgSENfUEFMX0NhcGFiaWxpdGllcywgIEhDX0FNUF9Bc3NvY19MZW5ndGgsICBIQ19NYXhfRmx1c2hfVGltZW91dCwgSENfQkVfRmx1c2hfVGltZW91dCAqLworLyogSENJIFJlYWQgTG9jYWwgQU1QIEFzc29jOiAgc3RhdHVzLCBwaHlfbGlua19oYW5kbGUsIEFNUCBBU1NPQyByZW1haW5pbmcgbGVuZ3RoIChqdXN0IGFjdHVhbCBsZW5ndGgsIGluIHByYWN0aWNlKSwgQU1QIEFTU09DIGZyYWdtZW50IChieXRlIHN0cmluZykgKi8gCisvKiAgd2hlcmUgQU1QIEFzc29jIGNvbnNpc3RzIG9mOiAgIEhDX21hY19hZGRyLCAgcHJlZiBjaGFubmVsIChIQ19wcmVmX2NvdW50cnksIEhDX3ByZWZfdHJpcGxldHMpLCBDbmN0IGNoYW5uZWwgKEhDX2NuY3RfY291bnRyeSwgIEhDX2NuY3RfdHJpcGxldHMpLCBIQ19wYWxfY2FwYWJpbGl0aWVzLCBIQ19wYWxfdmVyc2lvbiAqLyAKKy8qIEhDSSBXcml0ZSBSZW1vdGUgQU1QIEFzc29jOiAgc3RhdHVzLCBwaHlfbGlua19oYW5kbGUgKi8KKy8qIEhDSSBSZWFkIExvb3BiYWNrIE1vZGU6IHN0YXR1cywgbG9vcGJhY2tfbW9kZSAqLworLyogSENJIFdyaXRlIExvb3BiYWNrIE1vZGU6ICBzdGF0dXMgKi8KKworI2VuZGlmCisKKy8qIEJUIEFNUCBjb25maWd1cmF0aW9uIGl0ZW1zICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAvKiB1c2VyIHByZWZlcnJlZCBjaGFubmVsIG9uIHdoaWNoIHdlIHN0YXJ0IHRoZSBsaW5rICovCisgdl9VOF90ICAgdWNQcmVmZXJyZWRDaGFubmVsOworCit9V0xBTkJBUF9Db25maWdUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRG9jdW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFZPU1MgaW50ZXJmYWNlcyAtIERldmljZSBpbml0aWFsaXphdGlvbiAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9PcGVuCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGF0IGRyaXZlciBpbml0aWFsaXphdGlvbiAodm9zX29wZW4pLiBCQVAgd2lsbCBpbml0aWFsaXplIAorICAgIGFsbCBpdHMgaW50ZXJuYWwgcmVzb3VyY2VzIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjYWxsIHRvIHN0YXJ0IHRvIAorICAgIHJlZ2lzdGVyIHdpdGggdGhlIG90aGVyIG1vZHVsZXMuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIEJBUCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIEJBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX09wZW4KKyggCisgIHZfUFZPSURfdCAgcHZvc0dDdHggCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9TdGFydAorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBhcyBwYXJ0IG9mIHRoZSBvdmVyYWxsIHN0YXJ0IHByb2NlZHVyZSAodm9zX3N0YXJ0KS4gQkFQIHdpbGwgCisgICAgdXNlIHRoaXMgY2FsbCB0byByZWdpc3RlciB3aXRoIFRMIGFzIHRoZSBCQVAgZW50aXR5IGZvciAKKyAgICBCVC1BTVAgUlNOIGZyYW1lcy4gCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gQkFQJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gQkFQIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgICBPdGhlciBjb2RlcyBjYW4gYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgYSBCQUwgZmFpbHVyZTsKKyAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5CQVBfU3RhcnQKKyggCisgIHZfUFZPSURfdCAgcHZvc0dDdHggCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9TdG9wCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGJ5IHZvc19zdG9wIHRvIHN0b3Agb3BlcmF0aW9uIGluIEJBUCwgYmVmb3JlIGNsb3NlLiBCQVAgd2lsbCBzdXNwZW5kIGFsbCAKKyAgICBCVC1BTVAgUHJvdG9jb2wgQWRhcHRpb24gTGF5ZXIgb3BlcmF0aW9uIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjbG9zZSAKKyAgICByZXF1ZXN0IHRvIGNsZWFuIHVwIGl0cyByZXNvdXJjZXMuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIEJBUCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIEJBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX1N0b3AKKyggCisgIHZfUFZPSURfdCAgcHZvc0dDdHggCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9DbG9zZQorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBieSB2b3NfY2xvc2UgZHVyaW5nIGdlbmVyYWwgZHJpdmVyIGNsb3NlIHByb2NlZHVyZS4gQkFQIHdpbGwgY2xlYW4gdXAgCisgICAgYWxsIHRoZSBpbnRlcm5hbCByZXNvdXJjZXMuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIEJBUCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIEJBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX0Nsb3NlCisoIAorICB2X1BWT0lEX3QgIHB2b3NHQ3R4IAorKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSEREIGludGVyZmFjZXMgLSBQZXIgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24gCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfR2V0TmV3SG5kbAorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBieSBIREQgYXQgZHJpdmVyIG9wZW4gKEJTTF9PcGVuKS4gQkFQIHdpbGwgaW5pdGlhbGl6ZSAKKyAgICBhbGxvY2F0ZSBhIHBlci1pbnN0YW5jZSAiZmlsZSBoYW5kbGUiIGVxdWl2YWxlbnQgZm9yIHRoaXMgc3BlY2lmaWMKKyAgICBvcGVuIGNhbGwuIAorICAgIAorICAgIFRoZXJlIHNob3VsZCBvbmx5IGV2ZXIgYmUgb25lIGNhbGwgdG8gQlNMX09wZW4uICBTaW5jZSAKKyAgICB0aGUgb3BlbiBhcHAgdXNlciBpcyB0aGUgQlQgc3RhY2suCisgICAgCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgaEJ0YW1wSGFuZGxlOiAgIEhhbmRsZSB0byByZXR1cm4gYnRhbXBIYW5kbGUgdmFsdWUgaW4uCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBCQVAgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9HZXROZXdIbmRsCisoIAorICBwdEJ0YW1wSGFuZGxlICpoQnRhbXBIYW5kbGUgIC8qIEhhbmRsZSB0byByZXR1cm4gYnRhbXBIYW5kbGUgdmFsdWUgaW4gICovIAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfUmVsZWFzZUhuZGwKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgSEREIGF0IGRyaXZlciBjbG9zZSAoQlNMX0Nsb3NlKS4gQkFQIHdpbGwgcmVjbGFpbSAoaW52YWxpZGF0ZSkgCisgICAgdGhlICJmaWxlIGhhbmRsZSIgcGFzc2VkIGludG8gdGhpcyBjYWxsLgorICAgIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiAgIGJ0YW1wSGFuZGxlIHZhbHVlIHRvIGludmFsaWRhdGUuCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBidGFtcEhhbmRsZSBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX1JlbGVhc2VIbmRsCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlICAvKiBidGFtcCBoYW5kbGUgdmFsdWUgdG8gcmVsZWFzZSAgKi8gCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBIREQgaW50ZXJmYWNlcyAtIERhdGEgcGxhbmUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBIREQgRGF0YSBjYWxsYmFja3MgCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgKCpXTEFOQkFQX1NUQUZldGNoUGt0Q0JUeXBlKSgpIAorCisgIERFU0NSSVBUSU9OICAgCisgICAgVHlwZSBvZiB0aGUgZmV0Y2ggcGFja2V0IGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCBCQVAgYnkgSERELiAKKyAgICAKKyAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIEJBUCBpbW1lZGlhdGVseSB1cG9uIHRoZSB1bmRlcmx5aW5nIAorICAgIFdMQU5UTF9TVEFGZXRjaFBrdENCVHlwZSByb3V0aW5lIGJlaW5nIGNhbGxlZC4gIFdoaWNoIGlzIGNhbGxlZCBieQorICAgIFRMIHdoZW4gdGhlIHNjaGVkdWxpbmcgYWxnb3JpdGhtcyBhbGxvd3MgZm9yIHRyYW5zbWlzc2lvbiBvZiBhbm90aGVyIAorICAgIHBhY2tldCB0byB0aGUgbW9kdWxlLiAKKyAgICAKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGhlcmUgdG8gIndyYXAiIG9yIGFic3RyYWN0IFdMQU5UTF9TVEFGZXRjaFBrdENCVHlwZS4KKyAgICBCZWNhdXNlIHRoZSBCQVAtc3BlY2lmaWMgSEREICJzaGltIiBsYXllciAoQlNMKSBkb2Vzbid0IGtub3cgYW55dGhpbmcgCisgICAgYWJvdXQgU1RBSWRzLCBvciBvdGhlciBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IFRMLiAgCisKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwSGRkSGRsOiAgICAgICAgVGhlIEhERChCU0wpIHNwZWNpZmljIGNvbnRleHQgZm9yIHRoaXMgYXNzb2NpYXRpb24uCisgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgU1RBSWQgcGFzc2VkIHRvIG1lIGJ5IFRMIGluIFdMQU5UTF9TVEFGZXRjaENCVHlwZQorICAgICAgICAgICAgICAgICAgICB0byByZXRyZWl2ZSB0aGlzIHZhbHVlLgorCisgICAgSU4vT1VUCisgICAgcHVjQUM6ICAgICAgICAgIGFjY2VzcyBjYXRlZ29yeSByZXF1ZXN0ZWQgYnkgVEwsIGlmIEhERCBkb2VzIG5vdCBoYXZlIAorICAgICAgICAgICAgICAgICAgICBwYWNrZXRzIG9uIHRoaXMgQUMgaXQgY2FuIGNob29zZSB0byBzZXJ2aWNlIGFub3RoZXIgQUMgCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGluIHRoZSBvcmRlciBvZiBwcmlvcml0eQorCisgICAgT1VUCisgICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgVk9TUyBkYXRhIGJ1ZmZlciB0aGF0IHdhcyB0cmFuc21pdHRlZCAKKyAgICB0bE1ldGFJbmZvOiAgICBtZXRhIGluZm8gcmVsYXRlZCB0byB0aGUgZGF0YSBmcmFtZQorCisKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBWT1NfU1RBVFVTICgqV0xBTkJBUF9TVEFGZXRjaFBrdENCVHlwZSkoIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1BWT0lEX3QgICAgICAgICAgICAgcEhkZEhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDRW51bVR5cGUgICAgIHVjQUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfdCoqICAgICAgICAgICB2b3NEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01ldGFJbmZvVHlwZSogIHRsTWV0YUluZm8pOworCisgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgICgqV0xBTkJBUF9TVEFSeENCVHlwZSkoICkKKworICBERVNDUklQVElPTiAgIAorICAgIFR5cGUgb2YgdGhlIHJlY2VpdmUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIEJBUCBieSBIREQuIAorICAgIAorICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgQkFQIGltbWVkaWF0ZWx5IHVwb24gdGhlIHVuZGVybHlpbmcgCisgICAgV0xBTlRMX1NUQVJ4Q0JUeXBlIHJvdXRpbmUgYmVpbmcgY2FsbGVkLiAgV2hpY2ggaXMgY2FsbGVkIGJ5CisgICAgVEwgdG8gbm90aWZ5IHdoZW4gYSBwYWNrZXQgd2FzIHJlY2VpdmVkIGZvciBhIHJlZ2lzdGVyZWQgU1RBLgorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBIZGRIZGw6ICAgICAgICBUaGUgSEREKEJTTCkgc3BlY2lmaWMgY29udGV4dCBmb3IgdGhpcyBhc3NvY2lhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBTVEFJZCBwYXNzZWQgdG8gbWUgYnkgVEwgaW4gV0xBTlRMX1NUQVJ4Q0JUeXBlCisgICAgICAgICAgICAgICAgICAgIHRvIHJldHJpZXZlIHRoaXMgdmFsdWUuCisKKyAgICB2b3NEYXRhQnVmZjogICAgcG9pbnRlciB0byB0aGUgVk9TUyBkYXRhIGJ1ZmZlciB0aGF0IHdhcyByZWNlaXZlZAorICAgICAgICAgICAgICAgICAgICAoaXQgbWF5IGJlIGEgbGlua2VkIGxpc3QpIAorICAgIHBSeE1ldGFJbmZvOiAgICBSeCBtZXRhIGluZm8gcmVsYXRlZCB0byB0aGUgZGF0YSBmcmFtZQorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBWT1NfU1RBVFVTICgqV0xBTkJBUF9TVEFSeENCVHlwZSkoIHZfUFZPSURfdCAgICAgIHBIZGRIZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X3QqICAgICAgICAgdm9zRGF0YUJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUnhNZXRhSW5mb1R5cGUqIHBSeE1ldGFJbmZvKTsKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgICgqV0xBTkJBUF9UeENvbXBDQlR5cGUpKCkKKworICBERVNDUklQVElPTiAgIAorICAgIFR5cGUgb2YgdGhlIHR4IGNvbXBsZXRlIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCBCQVAgYnkgSERELiAKKyAgICAKKyAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIEJBUCBpbW1lZGlhdGVseSB1cG9uIHRoZSB1bmRlcmx5aW5nIAorICAgIFdMQU5UTF9UeENvbXBDQlR5cGUgcm91dGluZSBiZWluZyBjYWxsZWQuICBXaGljaCBpcyBjYWxsZWQgYnkKKyAgICBUTCB0byBub3RpZnkgd2hlbiBhIHRyYW5zbWlzc2lvbiBmb3IgYSBwYWNrZXQgaGFzIGVuZGVkLgorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBIZGRIZGw6ICAgICAgICBUaGUgSEREKEJTTCkgc3BlY2lmaWMgY29udGV4dCBmb3IgdGhpcyBhc3NvY2lhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPDxIb3cgZG8gSSByZXRyaWV2ZSB0aGlzIGZyb20gcHZvc0dDdHg/IFdoaWNoIGlzIGFsbCAKKyAgICAgICAgICAgICAgICAgICAgdGhlIFRMIFdMQU5UTF9UeENvbXBDQlR5cGUgcm91dGluZSBwcm92aWRlcyBtZS4+PgorICAgIHZvc0RhdGFCdWZmOiAgICBwb2ludGVyIHRvIHRoZSBWT1NTIGRhdGEgYnVmZmVyIHRoYXQgd2FzIHRyYW5zbWl0dGVkIAorICAgIHdUeFNUQXR1czogICAgICBzdGF0dXMgb2YgdGhlIHRyYW5zbWlzc2lvbiAKKworICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBWT1NfU1RBVFVTICgqV0xBTkJBUF9UeENvbXBDQlR5cGUpKCB2X1BWT0lEX3QgICAgICBwSGRkSGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfdCogICAgIHZvc0RhdGFCdWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19TVEFUVVMgICAgIHdUeFNUQXR1cyApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBIREQgRGF0YSBwbGFuZSBBUEkgIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1JlZ2lzdGVyRGF0YVBsYW5lCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhlIEhERCBjYWxscyB0aGlzIHJvdXRpbmUgdG8gcmVnaXN0ZXIgdGhlICJkYXRhIHBsYW5lIiByb3V0aW5lcworICAgIGZvciBUeCwgUngsIGFuZCBUeCBjb21wbGV0ZSB3aXRoIEJULUFNUC4gIEZvciBub3csIHdpdGggb25seSBvbmUKKyAgICBwaHlzaWNhbCBhc3NvY2lhdGlvbiBzdXBwb3J0ZWQgYXQgYSB0aW1lLCB0aGlzIENPVUxEIGJlIGNhbGxlZCAKKyAgICBieSBIREQgYXQgdGhlIHNhbWUgdGltZSBhcyBXTEFOQkFQX0dldE5ld0huZGwuICBCdXQsIGluIGdlbmVyYWwKKyAgICBpdCBuZWVkcyB0byBiZSBjYWxsZWQgdXBvbiBlYWNoIG5ldyBwaHlzaWNhbCBsaW5rIGVzdGFibGlzaG1lbnQuCisgICAgCisgICAgVGhpcyByZWdpc3RyYXRpb24gaXMgcmVhbGx5IHR3byBwYXJ0LiAgVGhlIHJvdXRpbmVzIHRoZW1zZWx2ZXMgYXJlCisgICAgcmVnaXN0ZXJlZCBoZXJlLiAgQnV0LCB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSBCU0wgY29udGV4dCBhbmQgdGhlCisgICAgYWN0dWFsIHBoeXNpY2FsIGxpbmsgdGFrZXMgcGxhY2UgZHVyaW5nIFdMQU5CQVBfUGh5c2ljYWxMaW5rQ3JlYXRlLiAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogVGhlIEJULUFNUCBQQUwgaGFuZGxlIHJldHVybmVkIGluIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIEJBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX1JlZ2lzdGVyRGF0YVBsYW5lCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLCAgLyogQlRBTVAgY29udGV4dCAqLyAKKyAgV0xBTkJBUF9TVEFGZXRjaFBrdENCVHlwZSBwZm5CdGFtcEZldGNoUGt0Q0IsIAorICBXTEFOQkFQX1NUQVJ4Q0JUeXBlIHBmbkJ0YW1wX1NUQVJ4Q0IsCisgIFdMQU5CQVBfVHhDb21wQ0JUeXBlIHBmbkJ0YW1wVHhDb21wQ0IsCisgIC8vIHBoeV9saW5rX2hhbmRsZSwgb2YgY291cnNlLCBkb2Vzbid0IGNvbWUgdW50aWwgbXVjaCBsYXRlci4gIEF0IFBoeXNpY2FsIExpbmsgY3JlYXRlLgorICB2X1BWT0lEX3QgICAgICBwSGRkSGRsICAgLyogQlNMIHNwZWNpZmljIGNvbnRleHQgKi8KKyk7CisvLyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfWGxhdGVUeERhdGFQa3QKKworICBERVNDUklQVElPTiAKKworICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgd2hlbiBpdCBoYXMgYSBIQ0kgRGF0YSBQYWNrZXQgYW5kIGl0IHdhbnRzIAorICAgIHRvIHRyYW5zbGF0ZSBpdCBpbnRvIGEgODAyLjMgTExDIGZyYW1lIC0gcmVhZHkgdG8gc2VuZCB1c2luZyBUTC4KKworCisgIFBBUkFNRVRFUlMgCisKKyAgICBidGFtcEhhbmRsZTogVGhlIEJULUFNUCBQQUwgaGFuZGxlIHJldHVybmVkIGluIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwaHlfbGlua19oYW5kbGU6IFVzZWQgYnkgQkFQIHRvIGluZGVudGlmeSB0aGUgV0xBTiBhc3NvYy4gKFN0YUlkKSAKKworICAgIHB1Y0FDOiAgICAgICBQb2ludGVyIHRvIHJldHVybiB0aGUgYWNjZXNzIGNhdGVnb3J5IAorICAgIHZvc0RhdGFCdWZmOiBUaGUgZGF0YSBidWZmZXIgY29udGFpbmluZyB0aGUgQlQtQU1QIHBhY2tldCB0byBiZSAKKyAgICAgICAgICAgICAgICAgdHJhbnNsYXRlZCB0byBhbiA4MDIuMyBMTEMgZnJhbWUKKyAgICB0bE1ldGFJbmZvOiAgcmV0dXJuIG1ldGEgaW5mbyBnbGVhbmVkIGZyb20gdGhlIG91dGdvaW5nIGZyYW1lLCBoZXJlLgorICAgCisgIFJFVFVSTiBWQUxVRQorCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZCAKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBCQVAgaGFuZGxlIGlzIE5VTEwgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOQkFQX1hsYXRlVHhEYXRhUGt0CisoIAorICBwdEJ0YW1wSGFuZGxlICAgICBidGFtcEhhbmRsZSwgIC8qIFVzZWQgYnkgQkFQIHRvIGlkZW50aWZ5IHRoZSBhY3R1YWwgc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZXJlZm9yZSBhZGRyZXNzZXMgKi8gCisgIHZfVThfdCAgICAgICAgICAgIHBoeV9saW5rX2hhbmRsZSwgIC8qIFVzZWQgYnkgQkFQIHRvIGluZGVudGlmeSB0aGUgV0xBTiBhc3NvYy4gKFN0YUlkKSAqLworICBXTEFOVExfQUNFbnVtVHlwZSAgICAgICAgICAgKnB1Y0FDLCAgICAgICAgLyogUmV0dXJuIHRoZSBBQyBoZXJlICovCisgIFdMQU5UTF9NZXRhSW5mb1R5cGUgICp0bE1ldGFJbmZvLCAvKiBSZXR1cm4gdGhlIE1ldGFJbmZvIGhlcmUuIEFuIGFzc2lzdCB0byBXTEFOQkFQX1NUQUZldGNoUGt0Q0JUeXBlICovCisgIHZvc19wa3RfdCAgICAgICAgKnZvc0RhdGFCdWZmCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfWGxhdGVSeERhdGFQa3QKKworICBERVNDUklQVElPTiAKKworICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSA4MDIuMyAoVEwvVU1BIGhhcyAKKyAgICBYbGF0ZWQgZnJvbSA4MDIuMTEpIGZyYW1lIGZyb20gVEwgYW5kIGl0IHdhbnRzIHRvIGZvcm0gYSAKKyAgICBCVCBIQ0kgRGF0YSBQYWNrZXQgLSByZWFkeSB0byBzaWduYWwgdXAgdG8gdGhlIEJUIHN0YWNrIGFwcGxpY2F0aW9uLgorCisKKyAgUEFSQU1FVEVSUyAKKworICAgIGJ0YW1wSGFuZGxlOiBUaGUgQlQtQU1QIFBBTCBoYW5kbGUgcmV0dXJuZWQgaW4gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHB1Y0FDOiAgICAgICBQb2ludGVyIHRvIHJldHVybiB0aGUgYWNjZXNzIGNhdGVnb3J5IAorICAgIHZvc0RhdGFCdWZmOiBUaGUgZGF0YSBidWZmZXIgY29udGFpbmluZyB0aGUgODAyLjMgZnJhbWUgdG8gYmUgCisgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWQgdG8gQlQgSENJIERhdGEgUGFja2V0CisgICAKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIEJBUCBoYW5kbGUgaXMgTlVMTCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5CQVBfWGxhdGVSeERhdGFQa3QKKyggCisgIHB0QnRhbXBIYW5kbGUgICAgIGJ0YW1wSGFuZGxlLCAKKyAgdl9VOF90ICAgICAgICAgICAgcGh5X2xpbmtfaGFuZGxlLCAgLyogVXNlZCBieSBCQVAgdG8gaW5kZW50aWZ5IHRoZSBXTEFOIGFzc29jLiAoU3RhSWQpICovCisgIFdMQU5UTF9BQ0VudW1UeXBlICAgICAgICAgICAqcHVjQUMsICAgICAgICAvKiBSZXR1cm4gdGhlIEFDIGhlcmUuIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyBuZWVkZWQgKi8KKyAgdm9zX3BrdF90ICAgICAgICAqdm9zRGF0YUJ1ZmYKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9TVEFQa3RQZW5kaW5nCisKKyAgREVTQ1JJUFRJT04gCisKKyAgICBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIHdoZW4gYSBwYWNrZXQgaXMgcGVuZGluZyB0cmFuc21pc3Npb24gaW4gaXRzIAorICAgIHF1ZXVlcy4gSEREIHVzZXMgdGhpcyBpbnN0ZWFkIG9mIFdMQU5UTF9TVEFQa3RQZW5kaW5nIGJlY2F1c2UgaGUgaXMKKyAgICBub3QgYXdhcmUgb2YgdGhlIG1hcHBpbmcgZnJvbSBzZXNzaW9uIHRvIFNUQSBJRC4KKworICBERVBFTkRFTkNJRVMgCisKKyAgICBIREQgbXVzdCBoYXZlIGNhbGxlZCBXTEFOQkFQX0dldE5ld0huZGwgYmVmb3JlIGNhbGxpbmcgdGhpcyBBUEkuCisKKyAgUEFSQU1FVEVSUyAKKworICAgIGJ0YW1wSGFuZGxlOiBUaGUgQlQtQU1QIFBBTCBoYW5kbGUgcmV0dXJuZWQgaW4gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgICAgICAgICAgICAgICBCU0wgY2FuIG9idGFpbiB0aGlzIGZyb20gdGhlIHBoeXNpY2FsIGhhbmRsZSB2YWx1ZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgZG93bmdvaW5nIEhDSSBEYXRhIFBhY2tldC4gSGUsIGFmdGVyIGFsbCwgd2FzIHRoZXJlCisgICAgICAgICAgICAgICAgIHdoZW4gdGhlIFBoeXNpY2FsTGluayB3YXMgY3JlYXRlZC4gSGUga25ldyB0aGUgYnRhbXBIYW5kbGUgCisgICAgICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGJ5IFdMQU5CQVBfR2V0TmV3SG5kbC4gSGUga25vd3MgYXMgd2VsbCwgaGlzCisgICAgICAgICAgICAgICAgIG93biBwSGRkSGRsIChzZWUgbmV4dCkuCisgICAgcGh5X2xpbmtfaGFuZGxlOiBVc2VkIGJ5IEJBUCB0byBpbmRlbnRpZnkgdGhlIFdMQU4gYXNzb2MuIChTdGFJZCkKKyAgICB1Y0FjOiAgICAgICAgVGhlIGFjY2VzcyBjYXRlZ29yeSBmb3IgdGhlIHBlbmRpbmcgZnJhbWUKKyAgIAorICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgQkFQIGhhbmRsZSBpcyBOVUxMICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTkJBUF9TVEFQa3RQZW5kaW5nIAorKCAKKyAgcHRCdGFtcEhhbmRsZSAgYnRhbXBIYW5kbGUsICAvKiBVc2VkIGJ5IEJBUCB0byBpZGVudGlmeSB0aGUgYXBwIGNvbnRleHQgYW5kIFZPU1MgY3R4ICghPykgKi8gCisgIHZfVThfdCAgICAgICAgIHBoeV9saW5rX2hhbmRsZSwgIC8qIFVzZWQgYnkgQkFQIHRvIGluZGVudGlmeSB0aGUgV0xBTiBhc3NvYy4gKFN0YUlkKSAqLworICBXTEFOVExfQUNFbnVtVHlwZSB1Y0FjICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYSBUTCB0eXBlIGluIGJhcEFwaS5oICovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgQlQtQU1QIFBBTCBIQ0kgRXZlbnQgY2FsbGJhY2sgdHlwZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICAoKnRwV0xBTl9CQVBFdmVudENCKSgpIAorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGNhbGxiYWNrIGZvciBBTEwgYXN5bmNocm9ub3VzIGV2ZW50cy4gCisgICAgSW5jbHVkaW5nIEV2ZW50cyByZXN1bHRpbmcgZnJvbToKKyAgICAgKiBIQ0kgQ3JlYXRlIFBoeXNpY2FsIExpbmssIAorICAgICAqIERpc2Nvbm5lY3QgUGh5c2ljYWwgTGluaywgCisgICAgICogQ3JlYXRlIExvZ2ljYWwgTGluaywKKyAgICAgKiBGbG93IFNwZWMgTW9kaWZ5LCAKKyAgICAgKiBIQ0kgUmVzZXQsCisgICAgICogSENJIEZsdXNoLC4uLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcEhkZEhkbDogICAgIFRoZSBIREQoQlNMKSBzcGVjaWZpYyBjb250ZXh0IGZvciB0aGlzIGFzc29jaWF0aW9uLgorICAgICAgICAgICAgICAgICBCU0wgZ2V0cyB0aGlzIGZyb20gdGhlIGRvd25nb2luZyBwYWNrZXRzIFBoeXNpY2FsIGhhbmRsZQorICAgICAgICAgICAgICAgICB2YWx1ZS4gCisgICAgcEJhcEhDSUV2ZW50OiAgcG9pbnRlciB0byB0aGUgdW5pb24gb2YgIkhDSSBFdmVudCIgc3RydWN0dXJlcy4gIENvbnRhaW5zIGFsbCBpbmZvIAorICAgICAgICAgICAgICAgICAgIG5lZWRlZCBmb3IgSENJIGV2ZW50LgorICAgIGFzc29jX3NwZWNpZmljX2V2ZW50OiAgZmxhZyBpbmRpY2F0ZXMgYXNzb2Mtc3BlY2lmaWMgKDEpIG9yIGdsb2JhbCAoMCkgZXZlbnQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lFdmVudCBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgVk9TX1NUQVRVUyAoKnRwV0xBTl9CQVBFdmVudENCKQorKAorICB2X1BWT0lEX3QgICAgICBwSGRkSGRsLCAgIC8qIHRoaXMgY291bGQgcmVmZXIgdG8gZWl0aGVyIHRoZSBCU0wgcGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0aW9uIGNvbnRleHQgd2hpY2ggZ290IHBhc3NlZCBpbiBkdXJpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgZGF0YSBwbGFuZSBPUiB0aGUgQlNMIHBlciBhcHBsaWNhdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0IHBhc3NlZCBpbiBkdXJpbmcgcmVnaXN0ZXIgQkFQIGNhbGxiYWNrcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBzZXR0aW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgYmVsb3cgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQncyBsaWtlIGVhY2ggb2YgdXMgaXMgdXNpbmcgdGhlIG90aGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3V5cyByZWZlcmVuY2Ugd2hlbiBpbnZva2luZyBoaW0uICovCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50LCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworICB2X0JPT0xfdCBhc3NvY19zcGVjaWZpY19ldmVudCAvKiBGbGFnIHRvIGluZGljYXRlIGdsb2JhbCBvciBhc3NvYy1zcGVjaWZpYyBldmVudCAqLworKTsgICAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBIQ0kgRXZlbnQgQ2FsbGJhY2sgUmVnaXN0cmF0aW9uIHJvdXRpbmUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlZ2lzdGVyQkFQQ2FsbGJhY2tzKCkgCisKKyAgREVTQ1JJUFRJT04gCisgICAgUmVnaXN0ZXIgdGhlIEJBUCAiRXZlbnQiIGNhbGxiYWNrcy4KKyAgICBSZXR1cm4gdGhlIHBlciBpbnN0YW5jZSBoYW5kbGUuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogVGhlIEJULUFNUCBQQUwgaGFuZGxlIHJldHVybmVkIGluIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJRXZlbnRDQjogIHBvaW50ZXIgdG8gdGhlIEV2ZW50IGNhbGxiYWNrCisgICAgcEFwcEhkbDogIFRoZSBjb250ZXh0IHBhc3NlZCBpbiBieSBjYWxsZXIuIChJLkUuLCBCU0wgYXBwIHNwZWNpZmljIGNvbnRleHQuKQorCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJRXZlbnRDQiBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWdpc3RlckJBUENhbGxiYWNrcyAKKyggCisgIHB0QnRhbXBIYW5kbGUgICAgICAgICAgIGJ0YW1wSGFuZGxlLCAvKiBCU0wgdXNlcyBteSBoYW5kbGUgdG8gdGFsayB0byBtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsKCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCdzIGxpa2UgZWFjaCBvZiB1cyBpcyB1c2luZyB0aGUgb3RoZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBndXlzIHJlZmVyZW5jZSB3aGVuIGludm9raW5nIGhpbS4gKi8KKyAgdHBXTEFOX0JBUEV2ZW50Q0IgICAgICAgcEJhcEhDSUV2ZW50Q0IsIC8qSW1wbGVtZW50cyB0aGUgY2FsbGJhY2sgZm9yIEFMTCBhc3luY2hyb25vdXMgZXZlbnRzLiAqLyAKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcEFwcEhkbCAgLy8gUGVyLWFwcCBCU0wgY29udGV4dAorKTsKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgUHJvY2VkdXJhbCBBUEkKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQlQgdjMuMCBMaW5rIENvbnRyb2wgY29tbWFuZHMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRWFjaCBvZiB0aGUgbmV4dCBlaWdodCBjb21tYW5kIHJlc3VsdCBpbiBhc3luY2hyb25vdXMgZXZlbnRzIChlLmcuLCAgCisgICAgSENJX1BIWVNJQ0FMX0xJTktfQ09NUExFVEVfRVZFTlQsIEhDSV9MT0dJQ0FMX0xJTktfQ09NUExFVEVfRVZFTlQsIGV0Yy4uLikKKyAgICBUaGVzZSBhcmUgc2lnbmFsbGVkIHRocnUgdGhlIGV2ZW50IGNhbGxiYWNrLiAoSS5FLiwgKCp0cFdMQU5fQkFQRXZlbnRDQikuKQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUGh5c2ljYWxMaW5rQ3JlYXRlKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIENyZWF0ZSBQaHlzaWNhbCBMaW5rIGNvbW1hbmQKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgICAgICAgICAgICAgIFdMQU5CQVBfR2V0TmV3SG5kbCBoYXMgdG8gYmUgY2FsbGVkIGJlZm9yZSBldmVyeSBjYWxsIHRvIAorICAgICAgICAgICAgICAgICBXTEFOX0JBUFBoeXNpY2FsTGlua0NyZWF0ZS4gU2luY2UgdGhlIGNvbnRleHQgaXMgcGVyIAorICAgICAgICAgICAgICAgICBwaHlzaWNhbCBsaW5rLgorICAgIHBCYXBIQ0lQaHlzTGlua0NyZWF0ZTogIHBvaW50ZXIgdG8gdGhlICJIQ0kgQ3JlYXRlIFBoeXNpY2FsIExpbmsiIFN0cnVjdHVyZS4KKyAgICBwSGRkSGRsOiAgVGhlIGNvbnRleHQgcGFzc2VkIGluIGJ5IHRoZSBjYWxsZXIuIChlLmcuLCBCU0wgc3BlY2lmaWMgY29udGV4dCkKKworICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgU3RhdHVzIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lQaHlzTGlua0NyZWF0ZSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBQaHlzaWNhbExpbmtDcmVhdGUgCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kICAgKnBCYXBIQ0lQaHlzTGlua0NyZWF0ZSwKKyAgdl9QVk9JRF90ICAgICAgcEhkZEhkbCwgICAvKiBCU0wgcGFzc2VzIGluIGl0cyBzcGVjaWZpYyBjb250ZXh0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW5kIEkgZ2V0IHBoeV9saW5rX2hhbmRsZSBmcm9tIHRoZSBDb21tYW5kICovCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFBoeXNpY2FsTGlua0FjY2VwdCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBBY2NlcHQgUGh5c2ljYWwgTGluayBjb21tYW5kCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lQaHlzTGlua0FjY2VwdDogIHBvaW50ZXIgdG8gdGhlICJIQ0kgQWNjZXB0IFBoeXNpY2FsIExpbmsiIFN0cnVjdHVyZS4KKyAgICBwSGRkSGRsOiAgVGhlIGNvbnRleHQgcGFzc2VkIGluIGJ5IHRoZSBjYWxsZXIuIChlLmcuLCBCU0wgc3BlY2lmaWMgY29udGV4dCkKKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgU3RhdHVzIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lQaHlzTGlua0FjY2VwdCBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBQaHlzaWNhbExpbmtBY2NlcHQgCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kICAgKnBCYXBIQ0lQaHlzTGlua0FjY2VwdCwKKyAgdl9QVk9JRF90ICAgICAgcEhkZEhkbCwgICAvKiBCU0wgcGFzc2VzIGluIGl0cyBzcGVjaWZpYyBjb250ZXh0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW5kIEkgZ2V0IHBoeV9saW5rX2hhbmRsZSBmcm9tIHRoZSBDb21tYW5kICovCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFBoeXNpY2FsTGlua0Rpc2Nvbm5lY3QoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgRGlzY29ubmVjdCBQaHlzaWNhbCBMaW5rIGNvbW1hbmQKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSVBoeXNMaW5rRGlzY29ubmVjdDogIHBvaW50ZXIgdG8gdGhlICJIQ0kgRGlzY29ubmVjdCBQaHlzaWNhbCBMaW5rIiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIHN0YXR1cyBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIFN0YXR1cyBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUGh5c0xpbmtEaXNjb25uZWN0IGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFBoeXNpY2FsTGlua0Rpc2Nvbm5lY3QgCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCAgICpwQmFwSENJUGh5c0xpbmtEaXNjb25uZWN0LAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBMb2dpY2FsTGlua0NyZWF0ZSgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBDcmVhdGUgTG9naWNhbCBMaW5rIGNvbW1hbmQKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSUxvZ0xpbmtDcmVhdGU6ICBwb2ludGVyIHRvIHRoZSAiSENJIENyZWF0ZSBMb2dpY2FsIExpbmsiIFN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgU3RhdHVzIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lMb2dMaW5rQ3JlYXRlIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUExvZ2ljYWxMaW5rQ3JlYXRlCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQgICAqcEJhcEhDSUxvZ0xpbmtDcmVhdGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUExvZ2ljYWxMaW5rQWNjZXB0KCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIEFjY2VwdCBMb2dpY2FsIExpbmsgY29tbWFuZAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJTG9nTGlua0FjY2VwdDogIHBvaW50ZXIgdG8gdGhlICJIQ0kgQWNjZXB0IExvZ2ljYWwgTGluayIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBzdGF0dXMgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBTdGF0dXMgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSUxvZ0xpbmtBY2NlcHQgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQTG9naWNhbExpbmtBY2NlcHQKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZCAgICpwQmFwSENJTG9nTGlua0FjY2VwdCwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQTG9naWNhbExpbmtEaXNjb25uZWN0KCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIERpc2Nvbm5lY3QgTG9naWNhbCBMaW5rIGNvbW1hbmQKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSUxvZ0xpbmtEaXNjb25uZWN0OiAgcG9pbnRlciB0byB0aGUgIkhDSSBEaXNjb25uZWN0IExvZ2ljYWwgTGluayIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBzdGF0dXMgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBTdGF0dXMgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSUxvZ0xpbmtEaXNjb25uZWN0IGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUExvZ2ljYWxMaW5rRGlzY29ubmVjdAorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZCAgICpwQmFwSENJTG9nTGlua0Rpc2Nvbm5lY3QsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUExvZ2ljYWxMaW5rQ2FuY2VsKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIENhbmNlbCBMb2dpY2FsIExpbmsgY29tbWFuZAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJTG9nTGlua0NhbmNlbDogIHBvaW50ZXIgdG8gdGhlICJIQ0kgQ2FuY2VsIExvZ2ljYWwgTGluayIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgICAgICAgICAgICAgICAoQlRXLCB0aGUgcmVxdWlyZWQgIkhDSSBMb2dpY2FsIExpbmsgQ29tcGxldGUgRXZlbnQiIAorICAgICAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBCQVAgc3RhdGUgbWFjaGluZSBhbmQgc2VudCB1cCAKKyAgICAgICAgICAgICAgICB2aWEgdGhlICgqdHBXTEFOX0JBUEV2ZW50Q0IpLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lMb2dMaW5rQ2FuY2VsIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUExvZ2ljYWxMaW5rQ2FuY2VsCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQgICAqcEJhcEhDSUxvZ0xpbmtDYW5jZWwsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUEZsb3dTcGVjTW9kaWZ5KCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIE1vZGlmeSBMb2dpY2FsIExpbmsgY29tbWFuZAorICAgIFByb2R1Y2VzIGFuIGFzeW5jaHJvbm91cyBmbG93IHNwZWMgbW9kaWZ5IGNvbXBsZXRlIGV2ZW50LiBUaHJvdWdoIHRoZSAKKyAgICBldmVudCBjYWxsYmFjay4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSUZsb3dTcGVjTW9kaWZ5OiAgcG9pbnRlciB0byB0aGUgIkhDSSBGbG93IFNwZWMgTW9kaWZ5IiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIHN0YXR1cyBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIFN0YXR1cyBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJRmxvd1NwZWNNb2RpZnkgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQRmxvd1NwZWNNb2RpZnkKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCAgICpwQmFwSENJRmxvd1NwZWNNb2RpZnksCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKiBIb3N0IENvbnRyb2xsZXIgYW5kIEJhc2ViYW5kIENvbW1hbmRzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVzZXQoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVzZXQgY29tbWFuZC4KKyAgICBQcm9kdWNlcyBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gVGhyb3VnaCB0aGUgCisgICAgY29tbWFuZCBjb21wbGV0ZSBjYWxsYmFjay4gIChJLkUuLCAoKnRwV0xBTl9CQVBFdmVudENCKS4pCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZXNldAorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZQorKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBTZXRFdmVudE1hc2soKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgU2V0IEV2ZW50IE1hc2sgY29tbWFuZC4gIFRoZXJlIGlzIG5vIG5lZWQgZm9yIAorICAgIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJU2V0RXZlbnRNYXNrOiAgcG9pbnRlciB0byB0aGUgIkhDSSBTZXQgRXZlbnQgTWFzayIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lTZXRFdmVudE1hc2sgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQU2V0RXZlbnRNYXNrCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kICAgKnBCYXBIQ0lTZXRFdmVudE1hc2ssCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUEZsdXNoKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIEZsdXNoIGNvbW1hbmQKKyAgICBQcm9kdWNlcyBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gVGhyb3VnaCB0aGUgCisgICAgZXZlbnQgY2FsbGJhY2suIEFuZCBhbiBhc3luY2hyb25vdXMgRmx1c2ggb2NjdXJyZWQgZXZlbnQuIEFsc28gdGhyb3VnaCB0aGUgCisgICAgZXZlbnQgY2FsbGJhY2suCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lGbHVzaDogIHBvaW50ZXIgdG8gdGhlICJIQ0kgRmx1c2giIFN0cnVjdHVyZS4KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lGbHVzaCBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBGbHVzaAorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX0ZsdXNoX0NtZCAgICAgKnBCYXBIQ0lGbHVzaAorKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9FbmhhbmNlZEJBUEZsdXNoKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIEVuaGFuY2VkIEZsdXNoIGNvbW1hbmQKKyAgICBQcm9kdWNlcyBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gVGhyb3VnaCB0aGUgY29tbWFuZCBzdGF0dXMgCisgICAgZXZlbnQgY2FsbGJhY2suIEFuZCBhbiBhc3luY2hyb25vdXMgRW5oYW5jZWQgRmx1c2ggQ29tcGxldGUgZXZlbnQuIAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJRmx1c2g6ICBwb2ludGVyIHRvIHRoZSAiSENJIEVuaGFuY2VkIEZsdXNoIiBTdHJ1Y3R1cmUuCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lGbHVzaCBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9FbmhhbmNlZEJBUEZsdXNoCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kICAgICAqcEJhcEhDSUZsdXNoLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIENvbm5lY3Rpb24gQWNjZXB0IFRpbWVvdXQgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZENvbm5lY3Rpb25BY2NlcHRUaW1lb3V0IGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dAorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nICJSZWFkIiBDb21tYW5kIENvbXBsZXRlICovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFdyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgV3JpdGUgQ29ubmVjdGlvbiBBY2NlcHQgVGltZW91dCBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0OiAgcG9pbnRlciB0byB0aGUgIkhDSSBDb25uZWN0aW9uIEFjY2VwdCBUaW1lb3V0IiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVdyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQV3JpdGVDb25uZWN0aW9uQWNjZXB0VGltZW91dAorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kICAgKnBCYXBIQ0lXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0LAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIExpbmsgU3VwZXJ2aXNpb24gVGltZW91dCBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dCBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dAorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgLyogT25seSA4IGJpdHMgKHBoeV9saW5rX2hhbmRsZSkgb2YgdGhpcyBsb2dfbGlua19oYW5kbGUgYXJlIHZhbGlkLiAqLworICB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kICpwQmFwSENJUmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXQsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBXcml0ZSBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXQgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0OiAgcG9pbnRlciB0byB0aGUgIkhDSSBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXQiIFN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0IGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dAorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQgICAqcEJhcEhDSVdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dCwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKyk7CisKKy8qIHYzLjAgSG9zdCBDb250cm9sbGVyIGFuZCBCYXNlYmFuZCBDb21tYW5kcyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVhZExvZ2ljYWxMaW5rQWNjZXB0VGltZW91dCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIExvZ2ljYWwgTGluayBBY2NlcHQgVGltZW91dCBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lSZWFkTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0IGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlYWRMb2dpY2FsTGlua0FjY2VwdFRpbWVvdXQKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0KCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFdyaXRlIExvZ2ljYWwgTGluayBBY2NlcHQgVGltZW91dCBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lXcml0ZUxvZ2ljYWxMaW5rQWNjZXB0VGltZW91dDogIHBvaW50ZXIgdG8gdGhlICJIQ0kgTG9naWNhbCBMaW5rIEFjY2VwdCBUaW1lb3V0IiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0IGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0CisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCAgICpwQmFwSENJV3JpdGVMb2dpY2FsTGlua0FjY2VwdFRpbWVvdXQsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFNldEV2ZW50TWFza1BhZ2UyKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFNldCBFdmVudCBNYXNrIFBhZ2UgMiBjb21tYW5kLiAgVGhlcmUgaXMgbm8gbmVlZCBmb3IgCisgICAgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lTZXRFdmVudE1hc2tQYWdlMjogIHBvaW50ZXIgdG8gdGhlICJIQ0kgU2V0IEV2ZW50IE1hc2sgUGFnZSAyIiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVNldEV2ZW50TWFza1BhZ2UyIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFNldEV2ZW50TWFza1BhZ2UyCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZCAgICpwQmFwSENJU2V0RXZlbnRNYXNrUGFnZTIsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRMb2NhdGlvbkRhdGEoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBMb2NhdGlvbiBEYXRhIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVJlYWRMb2NhdGlvbkRhdGEgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVhZExvY2F0aW9uRGF0YQorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nICJSZWFkIiBDb21tYW5kIENvbXBsZXRlKi8KKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQV3JpdGVMb2NhdGlvbkRhdGEoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgV3JpdGUgTG9jYXRpb24gRGF0YSBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lXcml0ZUxvY2F0aW9uRGF0YTogIHBvaW50ZXIgdG8gdGhlICJIQ0kgV3JpdGUgTG9jYXRpb24gRGF0YSIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lXcml0ZUxvY2F0aW9uRGF0YSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBXcml0ZUxvY2F0aW9uRGF0YQorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kICAgKnBCYXBIQ0lXcml0ZUxvY2F0aW9uRGF0YSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKyk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZWFkRmxvd0NvbnRyb2xNb2RlKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlYWQgRmxvdyBDb250cm9sIE1vZGUgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZEZsb3dDb250cm9sTW9kZSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkRmxvd0NvbnRyb2xNb2RlCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgIlJlYWQiIENvbW1hbmQgQ29tcGxldGUqLworKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBXcml0ZUZsb3dDb250cm9sTW9kZSgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBXcml0ZSBGbG93IENvbnRyb2wgTW9kZSBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lXcml0ZUZsb3dDb250cm9sTW9kZTogIHBvaW50ZXIgdG8gdGhlICJIQ0kgV3JpdGUgRmxvdyBDb250cm9sIE1vZGUiIFN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJV3JpdGVGbG93Q29udHJvbE1vZGUgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQV3JpdGVGbG93Q29udHJvbE1vZGUKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQgICAqcEJhcEhDSVdyaXRlRmxvd0NvbnRyb2xNb2RlLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZWFkQmVzdEVmZm9ydEZsdXNoVGltZW91dCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIEJlc3QgRWZmb3J0IEZsdXNoIFRpbWVvdXQgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZEJFRmx1c2hUTyBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkQmVzdEVmZm9ydEZsdXNoVGltZW91dAorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgLyogVGhlIGxvZ19saW5rX2hhbmxkZSBpZGVudGlmaWVzIHdoaWNoIGxvZ2ljYWwgbGluaydzIEJFIFRPKi8KKyAgdEJ0YW1wVExWSENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQgICAqcEJhcEhDSVJlYWRCRUZsdXNoVE8sCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFdyaXRlQmVzdEVmZm9ydEZsdXNoVGltZW91dCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBXcml0ZSBCZXN0IEVmZm9ydCBGbHVzaCBUTyBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lXcml0ZUJFRmx1c2hUTzogIHBvaW50ZXIgdG8gdGhlICJIQ0kgV3JpdGUgQkUgRmx1c2ggVE8iIFN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJV3JpdGVCRUZsdXNoVE8gaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQV3JpdGVCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0CisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQgICAqcEJhcEhDSVdyaXRlQkVGbHVzaFRPLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFNldFNob3J0UmFuZ2VNb2RlKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFNldCBTaG9ydCBSYW5nZSBNb2RlIGNvbW1hbmQuICBUaGVyZSBpcyBubyBuZWVkIGZvciAKKyAgICBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSVNob3J0UmFuZ2VNb2RlOiAgcG9pbnRlciB0byB0aGUgIkhDSSBTZXQgU2hvcnQgUmFuZ2UgTW9kZSIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lTaG9ydFJhbmdlTW9kZSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBTZXRTaG9ydFJhbmdlTW9kZQorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZCAgICpwQmFwSENJU2hvcnRSYW5nZU1vZGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQVmVuZG9yU3BlY2lmaWNDbWQwKCkKKworICBERVNDUklQVElPTgorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgVmVuZG9yIFNwZWNpZmljIENvbW1hbmQgMCAoT0dGIDB4M2YsIE9DRiAweDAwMDApLgorICAgIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gaGFzCisgICAgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTCisgICAgTkEuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4KKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSUV2ZW50IGlzIE5VTEwKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisKKyAgU0lERSBFRkZFQ1RTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUworV0xBTl9CQVBWZW5kb3JTcGVjaWZpY0NtZDAKKygKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQVmVuZG9yU3BlY2lmaWNDbWQxKCkKKworICBERVNDUklQVElPTgorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgVmVuZG9yIFNwZWNpZmljIENvbW1hbmQgMSAoT0dGIDB4M2YsIE9DRiAweDAwMDEpLgorICAgIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gaGFzCisgICAgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTCisgICAgTkEuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4KKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSUV2ZW50IGlzIE5VTEwKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisKKyAgU0lERSBFRkZFQ1RTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUworV0xBTl9CQVBWZW5kb3JTcGVjaWZpY0NtZDEKKygKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKyk7CisKKy8qIEVuZCBvZiB2My4wIEhvc3QgQ29udHJvbGxlciBhbmQgQmFzZWJhbmQgQ29tbWFuZHMgKi8KKworCisvKiBJbmZvcm1hdGlvbmFsIFBhcmFtZXRlcnMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZWFkTG9jYWxWZXJzaW9uSW5mbygpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIExvY2FsIFZlcnNpb24gSW5mbyBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIC8vIFRoZXJlIGFyZSByZWFsbHkgbm8gaW5wdXQgcGFyYW1ldGVycyBpbiB0aGlzIGNvbW1hbmQuICAKKyAgICAvLyBKdXN0IHRoZSBjb21tYW5kIG9wY29kZSBpdHNlbGYgaXMgc3VmZmljaWVudC4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZExvY2FsVmVyc2lvbkluZm8gaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVhZExvY2FsVmVyc2lvbkluZm8KKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRMb2NhbFN1cHBvcnRlZENtZHMoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBMb2NhbCBTdXBwb3J0ZWQgQ29tbWFuZHMuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgLy8gVGhlcmUgYXJlIHJlYWxseSBubyBpbnB1dCBwYXJhbWV0ZXJzIGluIHRoaXMgY29tbWFuZC4gIAorICAgIC8vIEp1c3QgdGhlIGNvbW1hbmQgb3Bjb2RlIGl0c2VsZiBpcyBzdWZmaWNpZW50LgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lSZWFkTG9jYWxTdXBwb3J0ZWRDbWRzIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlYWRMb2NhbFN1cHBvcnRlZENtZHMKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRCdWZmZXJTaXplKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlYWQgQnVmZmVyIFNpemUgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZEJ1ZmZlclNpemUgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVhZEJ1ZmZlclNpemUKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWREYXRhQmxvY2tTaXplKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlYWQgRGF0YSBCbG9jayBTaXplIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVJlYWREYXRhQmxvY2tTaXplIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlYWREYXRhQmxvY2tTaXplCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgIlJlYWQiIENvbW1hbmQgQ29tcGxldGUqLworKTsKKworLyoKK1N0YXR1cyBQYXJhbWV0ZXJzCisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRGYWlsZWRDb250YWN0Q291bnRlcigpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIEZhaWxlZCBDb250YWN0IENvdW50ZXIgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyOiAgcG9pbnRlciB0byB0aGUgIkhDSSBSZWFkIEZhaWxlZCBDb250YWN0IENvdW50ZXIiIHN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgcEZhaWxlZENvbnRhY3RDb3VudGVyIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlYWRGYWlsZWRDb250YWN0Q291bnRlcgorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQgICpwQmFwSENJUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgIlJlYWQiIENvbW1hbmQgQ29tcGxldGUqLworKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZXNldEZhaWxlZENvbnRhY3RDb3VudGVyKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlc2V0IEZhaWxlZCBDb250YWN0IENvdW50ZXIgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJUmVzZXRGYWlsZWRDb250YWN0Q291bnRlcjogIHBvaW50ZXIgdG8gdGhlICJIQ0kgUmVzZXQgRmFpbGVkIENvbnRhY3QgQ291bnRlciIgc3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lSZXNldEZhaWxlZENvbnRhY3RDb3VudGVyIGlzIE5VTEwKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVzZXRGYWlsZWRDb250YWN0Q291bnRlcgorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kICpwQmFwSENJUmVzZXRGYWlsZWRDb250YWN0Q291bnRlciwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVhZExpbmtRdWFsaXR5KCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlYWQgTGluayBRdWFsaXR5IGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSVJlYWRMaW5rUXVhbGl0eTogIHBvaW50ZXIgdG8gdGhlICJIQ0kgUmVhZCBMaW5rIFF1YWxpdHkiIHN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZExpbmtRdWFsaXR5IG9yIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMaW5rUXVhbGl0eSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkTGlua1F1YWxpdHkKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9SZWFkX0xpbmtfUXVhbGl0eV9DbWQgKnBCYXBIQ0lSZWFkTGlua1F1YWxpdHksCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRSU1NJKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlYWQgUlNTSSBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lSZWFkUlNTSTogIHBvaW50ZXIgdG8gdGhlICJIQ0kgUmVhZCBSU1NJIiBzdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVJlYWRSU1NJIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgcEJhcEhDSVJTU0kgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVhZFJTU0kKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9SZWFkX1JTU0lfQ21kICpwQmFwSENJUmVhZFJTU0ksCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRMb2NhbEFNUEluZm8oKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBMb2NhbCBBTVAgSW5mb3JtYXRpb24gY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJUmVhZExvY2FsQU1QSW5mbzogIHBvaW50ZXIgdG8gdGhlICJIQ0kgUmVhZCBMb2NhbCBBTVAgSW5mbyIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lSZWFkTG9jYWxBTVBJbmZvIG9yIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMb2NhbEFNUEluZm8gaXMgTlVMTAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkTG9jYWxBTVBJbmZvCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kICpwQmFwSENJUmVhZExvY2FsQU1QSW5mbywKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVhZExvY2FsQU1QQXNzb2MoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBMb2NhbCBBTVAgQXNzb2MgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJUmVhZExvY2FsQU1QQXNzb2M6ICBwb2ludGVyIHRvIHRoZSAiSENJIFJlYWQgTG9jYWwgQU1QIEFzc29jIiBTdHJ1Y3R1cmUuCisgICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVJlYWRMb2NhbEFNUEFzc29jIAorICAgICAgICAgICAgICAgICAgICAgICAgKG9yIHBCYXBIQ0lMb2NhbEFNUEFzc29jKSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkTG9jYWxBTVBBc3NvYworKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCAgICpwQmFwSENJUmVhZExvY2FsQU1QQXNzb2MsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFdyaXRlUmVtb3RlQU1QQXNzb2MoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgV3JpdGUgUmVtb3RlIEFNUCBBc3NvYyBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lXcml0ZVJlbW90ZUFNUEFzc29jOiAgcG9pbnRlciB0byB0aGUgIkhDSSBXcml0ZSBSZW1vdGUgQU1QIEFzc29jIiBTdHJ1Y3R1cmUuCisgICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lXcml0ZVJlbW90ZUFNUEFzc29jIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFdyaXRlUmVtb3RlQU1QQXNzb2MKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZCAgICpwQmFwSENJV3JpdGVSZW1vdGVBTVBBc3NvYywKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKyk7CisKKy8qCitEZWJ1ZyBDb21tYW5kcworKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZWFkTG9vcGJhY2tNb2RlKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlYWQgTG9vcGJhY2sgTW9kZSBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lSZWFkTG9vcGJhY2tNb2RlOiAgcG9pbnRlciB0byB0aGUgIkhDSSBSZWFkIExvb3BiYWNrIE1vZGUiLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lSZWFkTG9vcGJhY2tNb2RlIG9yIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMb29wYmFja01vZGUgaXMgTlVMTC4KKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVhZExvb3BiYWNrTW9kZQorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQgICpwQmFwSENJUmVhZExvb3BiYWNrTW9kZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQV3JpdGVMb29wYmFja01vZGUoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgV3JpdGUgTG9vcGJhY2sgTW9kZSBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lXcml0ZUxvb3BiYWNrTW9kZTogIHBvaW50ZXIgdG8gdGhlICJIQ0kgV3JpdGUgTG9vcGJhY2sgTW9kZSIgU3RydWN0dXJlLgorICAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJV3JpdGVMb29wYmFja01vZGUgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQV3JpdGVMb29wYmFja01vZGUKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZCAgICpwQmFwSENJV3JpdGVMb29wYmFja01vZGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQU2V0Q29uZmlnKCkKKworICBERVNDUklQVElPTiAKKyAgICAgVGhlIGZ1bmN0aW9uIHVwZGF0ZXMgc29tZSBjb25maWd1cmF0aW9uIGZvciBCQVAgbW9kdWxlIGluIFNNRSBkdXJpbmcgU01FcworICAgICBjbG9zZSAtPiBvcGVuIHNlcXVlbmNlLgorICAgCisgICAgIEJBUCBhcHBsaWVzIHRoZSBuZXcgY29uZmlndXJhdGlvbiBhdCB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KKworCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJUmVhZFJTU0k6ICBwb2ludGVyIHRvIHRoZSAiSENJIFJlYWQgUlNTSSIgc3RydWN0dXJlLgorICAgCisgICAgSU4KKyAgICBwQ29uZmlnOiBhIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0eXBlZGVmIHN0cnVjdCBXTEFOQkFQX0NvbmZpZ1R5cGUuCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcENvbmZpZyBvciBidGFtcEhhbmRsZSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBTZXRDb25maWcKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIFdMQU5CQVBfQ29uZmlnVHlwZSAqcENvbmZpZworKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX0dldEFjRnJvbVR4RGF0YVBrdAorCisgIERFU0NSSVBUSU9OIAorCisgICAgSEREIHdpbGwgY2FsbCB0aGlzIEFQSSB3aGVuIGl0IGhhcyBhIEhDSSBEYXRhIFBhY2tldCAoU0tCKSBhbmQgaXQgd2FudHMgCisgICAgdG8gZmluZCBBQyB0eXBlIG9mIHRoZSBkYXRhIGZyYW1lIGZyb20gdGhlIEhDSSBoZWFkZXIgb24gdGhlIGRhdGEgcGt0CisgICAgLSB0byBiZSBzZW5kIHVzaW5nIFRMLgorCisKKyAgUEFSQU1FVEVSUyAKKworICAgIGJ0YW1wSGFuZGxlOiBUaGUgQlQtQU1QIFBBTCBoYW5kbGUgcmV0dXJuZWQgaW4gV0xBTkJBUF9HZXROZXdIbmRsLgorIAorICAgIHBIY2lEYXRhOiBQb2ludGVyIHRvIHRoZSBIQ0kgZGF0YSBmcmFtZQorIAorICAgIHB1Y0FDOiAgICAgICBQb2ludGVyIHRvIHJldHVybiB0aGUgYWNjZXNzIGNhdGVnb3J5IAorICAgCisgIFJFVFVSTiBWQUxVRQorCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZCAKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBCQVAgaGFuZGxlIGlzIE5VTEwgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOQkFQX0dldEFjRnJvbVR4RGF0YVBrdAorKCAKKyAgcHRCdGFtcEhhbmRsZSAgICAgYnRhbXBIYW5kbGUsICAvKiBVc2VkIGJ5IEJBUCB0byBpZGVudGlmeSB0aGUgYWN0dWFsIHNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVyZWZvcmUgYWRkcmVzc2VzICovCisgIHZvaWQgICAgICAgICAgICAgICpwSGNpRGF0YSwgICAgIC8qIFBvaW50ZXIgdG8gdGhlIEhDSSBkYXRhIGZyYW1lICovCisgIFdMQU5UTF9BQ0VudW1UeXBlICpwdWNBQyAgICAgICAgLyogUmV0dXJuIHRoZSBBQyBoZXJlICovCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUEdldE1hc2soKQorCisgIERFU0NSSVBUSU9OIAorICAgICBUaGUgZnVuY3Rpb24gZ2V0cyB0aGUgdXBkYXRlZCBldmVudCBtYXNrIGZyb20gQkFQIGNvcmUuCisgICAKKworCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICAKKyAgIAorICAgIElOCisgICAgcEV2ZW50X21hc2tfcGFnZV8yOiBhIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiA4IGJ5dGVzLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBFdmVudF9tYXNrX3BhZ2VfMiBvciBidGFtcEhhbmRsZSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMKK1dMQU5fQkFQR2V0TWFzayggcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwgCisgICAgICAgICAgICAgICAgIHZfVThfdCAgICAgICAqcEV2ZW50X21hc2tfcGFnZV8yKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBEaXNjb25uZWN0KCkKKworICBERVNDUklQVElPTiAKKyAgICAgVGhlIGZ1bmN0aW9uIHRvIHJlcXVlc3QgdG8gQkFQIGNvcmUgdG8gZGlzY29ubmVjdCBjdXJyZWNudCBBTVAgY29ubmVjdGlvbi4KKyAgIAorCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIGJ0YW1wSGFuZGxlIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUERpc2Nvbm5lY3QKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUKKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQU2Vzc2lvbk9uKCkKKworICBERVNDUklQVElPTiAKKyAgICAgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrIGZyb20gQkFQIGNvcmUgaWYgQU1QIGNvbm5lY3Rpb24gaXMgdXAgcmlnaHQgbm93LgorICAgCisKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1RSVUU6ICBBTVAgY29ubmVjdGlvbiBpcyBvbiAKKyAgICBWT1NfRkFMU0U6IEFNUCBjb25uZWN0aW9uIGlzIG5vdCBvbgorICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9CT09MX3QgV0xBTl9CQVBTZXNzaW9uT24KKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUKKyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworIH0KKyNlbmRpZiAKKworCisjZW5kaWYgLyogI2lmbmRlZiBXTEFOX1FDVF9XTEFOQkFQX0ggKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvaW5jL2J0YW1wSENJLmggYi9DT1JFL0JBUC9pbmMvYnRhbXBIQ0kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2QzZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvaW5jL2J0YW1wSENJLmgKQEAgLTAsMCArMSwyMTIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBCVEFNUEhDSV9ICisjZGVmaW5lIEJUQU1QSENJX0gKKworLyoqCisgICogXGZpbGUgYnRhbXBIQ0kuaAorICAqCisgICogXGJyaWVmIFN0cnVjdHVyZXMsIGZ1bmN0aW9uIHByb3RvdHlwZXMgJiBkZWZpbml0aW9ucworICAqIGZvciB3b3JraW5nIHdpdGggODAyLjExIEZyYW1lcworICAqCisgICoKKyAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZC4KKyAgKgorICAqCisgICogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSAnZnJhbWVzYycKKyAgKiBNb24gTWFyIDAyIDE0OjA2OjE0IDIwMDkgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGUocyk6CisgICoKKyAgKiBidGFtcEhDSS5mcm1zCisgICogCisgICogUExFQVNFIERPTidUIEVESVQgVEhJUyBGSUxFIEJZIEhBTkQhCisgICoKKyAgKiBJbnN0ZWFkLCBwbGVhc2UgdXBkYXRlIHRoZSBpbnB1dCBmaWxlcyAmIHJlLXJ1bgorICAqICdmcmFtZXNjJyAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gJ2ZyYW1lc2MnICYgdGhlCisgICogZnJhbWVzIGxhbmd1YWdlLCAgcnVuICdmcmFtZXNjIC0taGVscCcuCisgICoKKyAgKgorICAqLworCisKKyNkZWZpbmUgV0xBTkJBUF9NQVhfTE9HX0xJTktTIDE2ICAvKiBMb2dpY2FsIGxpbmtzIGFyZSBhc3NpZ25lZCBieSBCQVAgKi8KKworCisjaWYgMAorCisvKiAgQ2FsbGluZyBjb252ZW50aW9uczogVGhlIEdlbmVyYWwgZm9ybWF0IG9mIHRoZSBVbnBhY2sgYW5kIFBhY2sgcm91dGluZXMgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFVucGFja19YeHhNZXNzYWdlCisKKyAgREVTQ1JJUFRJT04gCisgICAgVW5wYWNrIGZyb20gYSBNZXNzYWdlIGJ1ZmZlciBpbnRvIGEgc3RydWN0dXJlZCB0eXBlLiAKKworCisgIERFUEVOREVOQ0lFUyAKKworCisgIFBBUkFNRVRFUlMgCisgCisKKyAgICBJTgorICAgIHZvaWQgKiA6ICAgICAgIGhhbEhhbmRsZSAocGFzc2VkIGRvd24gdG8gdGhlIE1BQyBsYXllciBhbmQgYmVsb3cpCisgICAgdl9VOF90KiA6ICAgICAgUG9pbnRlciB0byB0aGUgc291cmNlIG1lc3NhZ2UgYnVmZmVyCisgICAgdl9VMTZfdCA6ICAgICAgTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSBidWZmZXIuCisgICAgdFh4eE1lc3NhZ2UqIDogUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGluIHdoaWNoIHRvIHJldHVybiB0aGUgdW5wYWNrZWQgdmFsdWVzLgorICAgCisgIFJFVFVSTiBWQUxVRQorCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorIAorCisgIFNJREUgRUZGRUNUUyAKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1UzMl90IFVucGFja19YeHhNZXNzYWdlKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0WHh4TWVzc2FnZSopOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBQYWNrX1h4eE1lc3NhZ2UKKworICBERVNDUklQVElPTiAKKyAgICBQYWNrIHRoZSBkYXRhIGZyb20gYSBzdHJ1Y3R1cmUgaW50byBhIE1lc3NhZ2UgYnVmZmVyLiAKKworCisgIERFUEVOREVOQ0lFUyAKKworCisgIFBBUkFNRVRFUlMgCisKKworICAgIElOCisgICAgdm9pZCAqIDogICAgICAgaGFsSGFuZGxlIChwYXNzZWQgZG93biB0byB0aGUgTUFDIGxheWVyIGFuZCBiZWxvdykKKyAgICB0WHh4TWVzc2FnZSogOiBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgZnJvbSB3aGljaCB0byBvYnRhaW4gdmFsdWVzLgorICAgIHZfVThfdCogOiAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1lc3NhZ2UgYnVmZmVyLgorICAgIHZfVTMyX3QgOiAgICAgIExlbmd0aCBpbiBieXRlcyBvZiB0aGUgZGVzdGluYXRpb24gbWVzc2FnZSBidWZmZXIuCisgICAgdl9VMzJfdCogOiAgICAgUG9pbnRlciB0byByZXR1cm4gdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIGVuY29kZWQgbWVzc2FnZSBidWZmZXIgaW4uCisKKworICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICBTSURFIEVGRkVDVFMgCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1UzMl90IFBhY2tfWHh4TWVzc2FnZSh2b2lkICosIHRYeHhNZXNzYWdlKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCisjZW5kaWYKKyAKKwordHlwZWRlZiB2X1UzMl90IHRCVEFNUF9VNjRbMl07CisKKyNpZiBkZWZpbmVkICggX01TQ19WRVIgKQorIyAgIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0MjE0KSAvKiBub25zdGFuZGFyZCBleHRlbnNpb24gdXNlZCAqLworI2VuZGlmIC8qIE1pY3Jvc29mdCBDL0MrKyAgICAgICAgICAgICBiaXQgZmllbGQgdHlwZXMgb3RoZXIgdGhhbiBpbnQgKi8KKworLyoKKyAqIEZyYW1lcyBSZXR1cm4gQ29kZXM6CisgKgorICogU3VjY2VzcyBpcyBpbmRpY2F0ZWQgYnkgYSByZXR1cm4gdmFsdWUgb2YgemVyby4gIEZhaWx1cmUgaXMgaW5kaWNhdGVkCisgKiBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGhpZ2ggYml0LiAgV2FybmluZ3MgZW5jb3VudGVyZWQgaW4gdGhlIGNvdXJzZQorICogb2YgYSBzdWNjZXNzZnVsIHBhcnNlIGFyZSBpbmRpY2F0ZWQgYnkgdmFyaW91cyBiaXRzIGluIHRoZSBsb3dlciAzMQorICogYmVpbmcgdHVybmVkIG9uLgorICoKKyAqIEZvciBpbnN0YW5jZSwgYSByZXR1cm4gdmFsdWUgb2YgMHgwMDAwMDAwYSB3b3VsZCBpbmRpY2F0ZSB0aGF0IHRoZQorICogcGFyc2Ugc3VjY2VlZGVkLCBidXQgdGhhdCBhIG1hbmRhdG9yeSBJRSB3YXNuJ3QgcHJlc2VudCwgYW5kIHNvbWUgSUUKKyAqIHdhcyBmb3VuZCB0byBiZSBjb3JydXB0LgorICoKKyAqCisgKi8KKworI2RlZmluZSBCVEFNUF9QQVJTRV9TVUNDRVNTICAgICAgICAgKCAweDAwMDAwMDAwICkKKyNkZWZpbmUgQlRBTVBfVU5LTk9XTl9JRVMgICAgICAgICAgICggMHgwMDAwMDAwMSApCisjZGVmaW5lIEJUQU1QX01BTkRBVE9SWV9JRV9NSVNTSU5HICAoIDB4MDAwMDAwMDIgKQorI2RlZmluZSBCVEFNUF9JTkNPTVBMRVRFX0lFICAgICAgICAgKCAweDAwMDAwMDA0ICkKKyNkZWZpbmUgQlRBTVBfU0tJUFBFRF9CQURfSUUgICAgICAgICggMHgwMDAwMDAwOCApCisjZGVmaW5lIEJUQU1QX0xBU1RfSUVfVE9PX0xPTkcgICAgICAoIDB4MDAwMDAwMTAgKQorI2RlZmluZSBCVEFNUF9EVVBMSUNBVEVfSUUgICAgICAgICAgKCAweDAwMDAwMDIwICkKKyNkZWZpbmUgQlRBTVBfQkFEX0ZJWEVEX1ZBTFVFICAgICAgICggMHgwMDAwMDA0MCApCisjZGVmaW5lIEJUQU1QX0lOQ09NUExFVEVfVExWICAgICAgICAoIDB4MDAwMDAwODAgKQorI2RlZmluZSBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEggICAgKCAweDAwMDAwMTAwICkKKyNkZWZpbmUgQlRBTVBfU0tJUFBFRF9CQURfVExWICAgICAgICggMHgwMDAwMDIwMCApCisjZGVmaW5lIEJUQU1QX1VOS05PV05fVExWUyAgICAgICAgICAoIDB4MDAwMDA0MDAgKQorI2RlZmluZSBCVEFNUF9MQVNUX1RMVl9UT09fTE9ORyAgICAgKCAweDAwMDAwODAwICkKKyNkZWZpbmUgQlRBTVBfSU5URVJOQUxfRVJST1IgICAgICAgICggMHgxMDAwMDAwMSApCisjZGVmaW5lIEJUQU1QX01JU1NJTkdfRklYRURfRklFTEQgICAoIDB4MTAwMDAwMDIgKQorI2RlZmluZSBCVEFNUF9CQURfSU5QVVRfQlVGRkVSICAgICAgKCAweDEwMDAwMDAzICkKKyNkZWZpbmUgQlRBTVBfQkFEX09VVFBVVF9CVUZGRVIgICAgICggMHgxMDAwMDAwNCApCisjZGVmaW5lIEJUQU1QX0JVRkZFUl9PVkVSRkxPVyAgICAgICAoIDB4MTAwMDAwMDUgKQorI2RlZmluZSBCVEFNUF9NQU5EQVRPUllfVExWX01JU1NJTkcgKCAweDAwMDAxMDAwICkKKyNkZWZpbmUgQlRBTVBfRkFJTEVEKGNvZGUpICAgICAgICAgICggKGNvZGUpICYgMHgxMDAwMDAwMCApCisjZGVmaW5lIEJUQU1QX1dBUk5FRChjb2RlKSAgICAgICAgICAoICggKCAwID09IChjb2RlKSApICYgMHgxMDAwMDAwMCApICYmIGNvZGUpCisjZGVmaW5lIEJUQU1QX1NVQ0NFRURFRChjb2RlKSAgICAgICAoIChjb2RlKSA9PSAwICkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUTFZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIElEIDMgKDB4MDAwMykKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIGNvdW50cnlbM107CisgICAgdl9VOF90ICAgICAgIG51bV90cmlwbGV0czsKKyAgICB2X1U4X3QgICAgICAgdHJpcGxldHNbMl1bM107Cit9IHRCdGFtcFRMVkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbDsKKworI2RlZmluZSBCVEFNUF9UTFZfQU1QX0FTU09DX0NPTk5FQ1RFRF9DSEFOTkVMICggMyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0FNUF9BU1NPQ19DT05ORUNURURfQ0hBTk5FTF9NSU5fTEVOICggNSApCisKKyNkZWZpbmUgQlRBTVBfVExWX0FNUF9BU1NPQ19DT05ORUNURURfQ0hBTk5FTF9NQVhfTEVOICggMTEgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsKHZvaWQgKiwgdEJ0YW1wVExWQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsKHZvaWQgKiwgdEJ0YW1wVExWQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMSAoMHgwMDAxKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWQU1QX0Fzc29jX01BQ19BZGRyIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgbWFjX2FkZHJbNl07Cit9IHRCdGFtcFRMVkFNUF9Bc3NvY19NQUNfQWRkcjsKKworI2RlZmluZSBCVEFNUF9UTFZfQU1QX0FTU09DX01BQ19BRERSICggMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0FNUF9BU1NPQ19NQUNfQUREUl9NSU5fTEVOICggOCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0FNUF9BU1NPQ19NQUNfQUREUl9NQVhfTEVOICggOCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2QU1QX0Fzc29jX01BQ19BZGRyKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZBTVBfQXNzb2NfTUFDX0FkZHIqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZBTVBfQXNzb2NfTUFDX0FkZHIodm9pZCAqLCB0QnRhbXBUTFZBTVBfQXNzb2NfTUFDX0FkZHIqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZBTVBfQXNzb2NfTUFDX0FkZHIodm9pZCAqLCB0QnRhbXBUTFZBTVBfQXNzb2NfTUFDX0FkZHIqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA0ICgweDAwMDQpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VMzJfdCAgICAgIHBhbF9jYXBhYmlsaXRpZXM7Cit9IHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzOworCisjZGVmaW5lIEJUQU1QX1RMVl9BTVBfQVNTT0NfUEFMX0NBUEFCSUxJVElFUyAoIDQgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9BTVBfQVNTT0NfUEFMX0NBUEFCSUxJVElFU19NSU5fTEVOICggNiApCisKKyNkZWZpbmUgQlRBTVBfVExWX0FNUF9BU1NPQ19QQUxfQ0FQQUJJTElUSUVTX01BWF9MRU4gKCA2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyh2b2lkICosIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXModm9pZCAqLCB0QnRhbXBUTFZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDUgKDB4MDAwNSkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkFNUF9Bc3NvY19QQUxfVmVyc2lvbiB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIHBhbF92ZXJzaW9uOworICAgIHZfVTE2X3QgICAgICBwYWxfQ29tcGFueUlEOworICAgIHZfVTE2X3QgICAgICBwYWxfc3VidmVyc2lvbjsKK30gdEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9WZXJzaW9uOworCisjZGVmaW5lIEJUQU1QX1RMVl9BTVBfQVNTT0NfUEFMX1ZFUlNJT04gKCA1ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfQU1QX0FTU09DX1BBTF9WRVJTSU9OX01JTl9MRU4gKCA3ICkKKworI2RlZmluZSBCVEFNUF9UTFZfQU1QX0FTU09DX1BBTF9WRVJTSU9OX01BWF9MRU4gKCA3ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZBTVBfQXNzb2NfUEFMX1ZlcnNpb24odm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfVmVyc2lvbiopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbih2b2lkICosIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfVmVyc2lvbiosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbih2b2lkICosIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfVmVyc2lvbiosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDIgKDB4MDAwMikKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0IHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgY291bnRyeVszXTsKKyAgICB2X1U4X3QgICAgICAgbnVtX3RyaXBsZXRzOworICAgIHZfVThfdCAgICAgICB0cmlwbGV0c1s1XVszXTsKK30gdEJ0YW1wVExWQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3Q7CisKKyNkZWZpbmUgQlRBTVBfVExWX0FNUF9BU1NPQ19QUkVGRVJSRURfQ0hBTk5FTF9MSVNUICggMiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0FNUF9BU1NPQ19QUkVGRVJSRURfQ0hBTk5FTF9MSVNUX01JTl9MRU4gKCA1ICkKKworI2RlZmluZSBCVEFNUF9UTFZfQU1QX0FTU09DX1BSRUZFUlJFRF9DSEFOTkVMX0xJU1RfTUFYX0xFTiAoIDIwICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdCh2b2lkICosIHRCdGFtcFRMVkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0Kiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3Qodm9pZCAqLCB0QnRhbXBUTFZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDYgKDB4MDAwNikKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkZsb3dfU3BlYyB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIGZsb3dfc3BlY19pZDsKKyAgICB2X1U4X3QgICAgICAgc2VydmljZV90eXBlOworICAgIHZfVTE2X3QgICAgICBtYXhfc2R1OworICAgIHZfVTMyX3QgICAgICBzZHVfaW50ZXJfYXJyaXZhbDsKKyAgICB2X1UzMl90ICAgICAgYWNjZXNzX2xhdGVuY3k7CisgICAgdl9VMzJfdCAgICAgIGZsdXNoX3RpbWVvdXQ7Cit9IHRCdGFtcFRMVkZsb3dfU3BlYzsKKworI2RlZmluZSBCVEFNUF9UTFZfRkxPV19TUEVDICggNiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0ZMT1dfU1BFQ19NSU5fTEVOICggMTggKQorCisjZGVmaW5lIEJUQU1QX1RMVl9GTE9XX1NQRUNfTUFYX0xFTiAoIDE4ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZGbG93X1NwZWModm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkZsb3dfU3BlYyopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkZsb3dfU3BlYyh2b2lkICosIHRCdGFtcFRMVkZsb3dfU3BlYyosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkZsb3dfU3BlYyh2b2lkICosIHRCdGFtcFRMVkZsb3dfU3BlYyosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDEwODEgKDB4MDQzOSkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIHBoeV9saW5rX2hhbmRsZTsKKyAgICB2X1U4X3QgICAgICAgdHhfZmxvd19zcGVjWzE4XTsKKyAgICB2X1U4X3QgICAgICAgcnhfZmxvd19zcGVjWzE4XTsKK30gdEJ0YW1wVExWSENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfQUNDRVBUX0xPR0lDQUxfTElOS19DTUQgKCAxMDgxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX0FDQ0VQVF9MT0dJQ0FMX0xJTktfQ01EX01JTl9MRU4gKCAzOSApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9BQ0NFUFRfTE9HSUNBTF9MSU5LX0NNRF9NQVhfTEVOICggMzkgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMTA3OCAoMHgwNDM2KQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIHBoeV9saW5rX2hhbmRsZTsKKyAgICB2X1U4X3QgICAgICAga2V5X2xlbmd0aDsKKyAgICB2X1U4X3QgICAgICAga2V5X3R5cGU7CisgICAgdl9VOF90ICAgICAgIGtleV9tYXRlcmlhbFszMl07Cit9IHRCdGFtcFRMVkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9BQ0NFUFRfUEhZU0lDQUxfTElOS19DTUQgKCAxMDc4ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX0FDQ0VQVF9QSFlTSUNBTF9MSU5LX0NNRF9NSU5fTEVOICggNSApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9BQ0NFUFRfUEhZU0lDQUxfTElOS19DTURfTUFYX0xFTiAoIDM3ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDY1ICgweDAwNDEpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIHBoeV9saW5rX2hhbmRsZTsKK30gdEJ0YW1wVExWSENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9DSEFOTkVMX1NFTEVDVEVEX0VWRU5UICggNjUgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfQ0hBTk5FTF9TRUxFQ1RFRF9FVkVOVF9NSU5fTEVOICggMyApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9DSEFOTkVMX1NFTEVDVEVEX0VWRU5UX01BWF9MRU4gKCAzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCh2b2lkICosIHRCdGFtcFRMVkhDSV9DaGFubmVsX1NlbGVjdGVkX0V2ZW50Kiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDE0ICgweDAwMGUpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIG51bV9oY2lfY29tbWFuZF9wYWNrZXRzOworICAgIHZfVTE2X3QgICAgICBjb21tYW5kX29wY29kZTsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCBzdGF0dXM7CisgICAgICAgIH0gUmVzZXQ7IC8qIGNvbW1hbmRfb3Bjb2RlID0gYzAzICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICAgICAgdl9VMTZfdCBsb2dfbGlua19oYW5kbGU7CisgICAgICAgIH0gRmx1c2g7IC8qIGNvbW1hbmRfb3Bjb2RlID0gYzA4ICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICAgICAgdl9VOF90IHBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgICAgIHZfVThfdCB0eF9mbG93X3NwZWNfaWQ7CisgICAgICAgIH0gTG9naWNhbF9MaW5rX0NhbmNlbDsgLyogY29tbWFuZF9vcGNvZGUgPSA0M2IgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCBzdGF0dXM7CisgICAgICAgIH0gU2V0X0V2ZW50X01hc2s7IC8qIGNvbW1hbmRfb3Bjb2RlID0gYzA1ICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICAgICAgdl9VMTZfdCBjb25uZWN0aW9uX2FjY2VwdF90aW1lb3V0OworICAgICAgICB9IFJlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVE87IC8qIGNvbW1hbmRfb3Bjb2RlID0gYzE1ICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICB9IFdyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RPOyAvKiBjb21tYW5kX29wY29kZSA9IGMxNiAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdl9VOF90IHN0YXR1czsKKyAgICAgICAgICAgIHZfVTE2X3QgbG9nX2xpbmtfaGFuZGxlOworICAgICAgICAgICAgdl9VMTZfdCBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQ7CisgICAgICAgIH0gUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RPOyAvKiBjb21tYW5kX29wY29kZSA9IGMzNiAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdl9VOF90IHN0YXR1czsKKyAgICAgICAgICAgIHZfVTE2X3QgbG9nX2xpbmtfaGFuZGxlOworICAgICAgICB9IFdyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVE87IC8qIGNvbW1hbmRfb3Bjb2RlID0gYzM3ICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICAgICAgdl9VMTZfdCBsb2dpY2FsX2xpbmtfYWNjZXB0X3RpbWVvdXQ7CisgICAgICAgIH0gUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RPOyAvKiBjb21tYW5kX29wY29kZSA9IGM2MSAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdl9VOF90IHN0YXR1czsKKyAgICAgICAgfSBXcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RPOyAvKiBjb21tYW5kX29wY29kZSA9IGM2MiAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdl9VOF90IHN0YXR1czsKKyAgICAgICAgfSBTZXRfRXZlbnRfTWFza19QYWdlXzI7IC8qIGNvbW1hbmRfb3Bjb2RlID0gYzYzICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICAgICAgdl9VOF90IGxvY19kb21haW5fYXdhcmU7CisgICAgICAgICAgICB2X1U4X3QgbG9jX2RvbWFpblszXTsKKyAgICAgICAgICAgIHZfVThfdCBsb2Nfb3B0aW9uczsKKyAgICAgICAgfSBSZWFkX0xvY2F0aW9uX0RhdGE7IC8qIGNvbW1hbmRfb3Bjb2RlID0gMzE3MiAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdl9VOF90IHN0YXR1czsKKyAgICAgICAgfSBXcml0ZV9Mb2NhdGlvbl9EYXRhOyAvKiBjb21tYW5kX29wY29kZSA9IDMxNzMgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCBzdGF0dXM7CisgICAgICAgICAgICB2X1U4X3QgZmxvd19jb250cm9sX21vZGU7CisgICAgICAgIH0gUmVhZF9GbG93X0NvbnRyb2xfTW9kZTsgLyogY29tbWFuZF9vcGNvZGUgPSAzMTc0ICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICB9IFdyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlOyAvKiBjb21tYW5kX29wY29kZSA9IDMxNzUgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCBzdGF0dXM7CisgICAgICAgICAgICB2X1UzMl90IGJlc3RfZWZmb3J0X2ZsdXNoX3RpbWVvdXQ7CisgICAgICAgIH0gUmVhZF9CRV9GbHVzaF9UTzsgLyogY29tbWFuZF9vcGNvZGUgPSAzMTc3ICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICB9IFdyaXRlX0JFX0ZsdXNoX1RPOyAvKiBjb21tYW5kX29wY29kZSA9IDMxNzggKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCBzdGF0dXM7CisgICAgICAgIH0gU2V0X1Nob3J0X1JhbmdlX01vZGU7IC8qIGNvbW1hbmRfb3Bjb2RlID0gMzE3OSAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdl9VOF90IHN0YXR1czsKKyAgICAgICAgICAgIHZfVThfdCBIQ19IQ0lfVmVyc2lvbjsKKyAgICAgICAgICAgIHZfVTE2X3QgSENfSENJX1JldmlzaW9uOworICAgICAgICAgICAgdl9VOF90IEhDX1BBTF9WZXJzaW9uOworICAgICAgICAgICAgdl9VMTZfdCBIQ19NYW51ZmFjX05hbWU7CisgICAgICAgICAgICB2X1UxNl90IEhDX1BBTF9TdWJfVmVyc2lvbjsKKyAgICAgICAgfSBSZWFkX0xvY2FsX1ZlcnNpb25fSW5mbzsgLyogY29tbWFuZF9vcGNvZGUgPSA0MDk3ICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICAgICAgdl9VOF90IEhDX1N1cHBvcnRfQ21kc1s2NF07CisgICAgICAgIH0gUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kczsgLyogY29tbWFuZF9vcGNvZGUgPSA0MDk4ICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICAgICAgdl9VMTZfdCBIQ19BQ0xfRGF0YV9QYWNrZXRfTGVuZ3RoOworICAgICAgICAgICAgdl9VOF90IEhDX1NDT19QYWNrZXRfTGVuZ3RoOworICAgICAgICAgICAgdl9VMTZfdCBIQ19Ub3RhbF9OdW1fQUNMX1BhY2tldHM7CisgICAgICAgICAgICB2X1UxNl90IEhDX1RvdGFsX051bV9TQ09fUGFja2V0czsKKyAgICAgICAgfSBSZWFkX0J1ZmZlcl9TaXplOyAvKiBjb21tYW5kX29wY29kZSA9IDQxMDEgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCBzdGF0dXM7CisgICAgICAgICAgICB2X1UxNl90IEhDX01heF9BQ0xfRGF0YV9QYWNrZXRfTGVuZ3RoOworICAgICAgICAgICAgdl9VMTZfdCBIQ19EYXRhX0Jsb2NrX0xlbmd0aDsKKyAgICAgICAgICAgIHZfVTE2X3QgSENfVG90YWxfTnVtX0RhdGFfQmxvY2tzOworICAgICAgICB9IFJlYWRfRGF0YV9CbG9ja19TaXplOyAvKiBjb21tYW5kX29wY29kZSA9IDQxMDYgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCBzdGF0dXM7CisgICAgICAgICAgICB2X1UxNl90IGxvZ19saW5rX2hhbmRsZTsKKyAgICAgICAgICAgIHZfVTE2X3QgZmFpbGVkX2NvbnRhY3RfY291bnRlcjsKKyAgICAgICAgfSBSZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXI7IC8qIGNvbW1hbmRfb3Bjb2RlID0gNTEyMSAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdl9VOF90IHN0YXR1czsKKyAgICAgICAgICAgIHZfVTE2X3QgbG9nX2xpbmtfaGFuZGxlOworICAgICAgICB9IFJlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXI7IC8qIGNvbW1hbmRfb3Bjb2RlID0gNTEyMiAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdl9VOF90IHN0YXR1czsKKyAgICAgICAgICAgIHZfVTE2X3QgbG9nX2xpbmtfaGFuZGxlOworICAgICAgICAgICAgdl9VOF90IGxpbmtfcXVhbGl0eTsKKyAgICAgICAgfSBSZWFkX0xpbmtfUXVhbGl0eTsgLyogY29tbWFuZF9vcGNvZGUgPSA1MTIzICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICAgICAgLyogMiBieXRlcyBoYW5kbGUgdG8gY29tcGx5IHdpdGggc3BlYywgKGxvd2VyIGJ5dGUgdmFsaWQpICovCisgICAgICAgICAgICB2X1UxNl90IHBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgICAgIHZfUzdfdCByc3NpOworICAgICAgICB9IFJlYWRfUlNTSTsgLyogY29tbWFuZF9vcGNvZGUgPSA1MTI1ICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICAgICAgdl9VOF90IEhDX0FNUF9TdGF0dXM7CisgICAgICAgICAgICB2X1UzMl90IEhDX1RvdGFsX0JXOworICAgICAgICAgICAgdl9VMzJfdCBIQ19NYXhfR3VhcmFudGVlZF9CVzsKKyAgICAgICAgICAgIHZfVTMyX3QgSENfTWluX0xhdGVuY3k7CisgICAgICAgICAgICB2X1UzMl90IEhDX01heF9QRFVfU2l6ZTsKKyAgICAgICAgICAgIHZfVThfdCBIQ19Db250cm9sbGVyX1R5cGU7CisgICAgICAgICAgICB2X1UxNl90IEhDX1BBTF9DYXBhYmlsaXRpZXM7CisgICAgICAgICAgICB2X1UxNl90IEhDX0FNUF9Bc3NvY19MZW5ndGg7CisgICAgICAgICAgICB2X1UzMl90IEhDX01heF9GbHVzaF9UaW1lb3V0OworICAgICAgICAgICAgdl9VMzJfdCBIQ19CRV9GbHVzaF9UaW1lb3V0OworICAgICAgICB9IFJlYWRfTG9jYWxfQU1QX0luZm87IC8qIGNvbW1hbmRfb3Bjb2RlID0gNTEyOSAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdl9VOF90IHN0YXR1czsKKyAgICAgICAgICAgIHZfVThfdCBwaHlfbGlua19oYW5kbGU7CisgICAgICAgICAgICB2X1UxNl90IHJlbWFpbmluZ19sZW5ndGg7CisgICAgICAgICAgICB2X1U4X3QgQU1QX2Fzc29jX2ZyYWdtZW50WzI0OF07CisgICAgICAgIH0gUmVhZF9SZWFkX0xvY2FsX0FNUF9Bc3NvYzsgLyogY29tbWFuZF9vcGNvZGUgPSA1MTMwICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB2X1U4X3Qgc3RhdHVzOworICAgICAgICAgICAgdl9VOF90IHBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgfSBXcml0ZV9SZW1vdGVfQU1QX0Fzc29jOyAvKiBjb21tYW5kX29wY29kZSA9IDUxMzEgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCBzdGF0dXM7CisgICAgICAgICAgICB2X1U4X3QgbG9vcGJhY2tfbW9kZTsKKyAgICAgICAgfSBSZWFkX0xvb3BiYWNrX01vZGU7IC8qIGNvbW1hbmRfb3Bjb2RlID0gNjE0NSAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdl9VOF90IHN0YXR1czsKKyAgICAgICAgfSBXcml0ZV9Mb29wYmFja19Nb2RlOyAvKiBjb21tYW5kX29wY29kZSA9IDYxNDYgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCBzdGF0dXM7CisgICAgICAgIH0gVmVuZG9yX1NwZWNpZmljX0NtZF8wOyAvKiBjb21tYW5kX29wY29kZSA9IGZjMDAgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCBzdGF0dXM7CisgICAgICAgIH0gVmVuZG9yX1NwZWNpZmljX0NtZF8xOyAvKiBjb21tYW5kX29wY29kZSA9IGZjMDEgKi8KKyAgICB9IGNjX2V2ZW50OworfSB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfQ09NUExFVEVfRVZFTlQgKCAxNCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UX01JTl9MRU4gKCA2ICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfQ09NUExFVEVfRVZFTlRfTUFYX0xFTiAoIDI1NyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9Db21tYW5kX0NvbXBsZXRlX0V2ZW50Kik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9Db21tYW5kX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAxNSAoMHgwMDBmKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50IHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgc3RhdHVzOworICAgIHZfVThfdCAgICAgICBudW1faGNpX2NvbW1hbmRfcGFja2V0czsKKyAgICB2X1UxNl90ICAgICAgY29tbWFuZF9vcGNvZGU7Cit9IHRCdGFtcFRMVkhDSV9Db21tYW5kX1N0YXR1c19FdmVudDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfU1RBVFVTX0VWRU5UICggMTUgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9TVEFUVVNfRVZFTlRfTUlOX0xFTiAoIDYgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9TVEFUVVNfRVZFTlRfTUFYX0xFTiAoIDYgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Db21tYW5kX1N0YXR1c19FdmVudCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50Kik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50Kiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50Kiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMTA4MCAoMHgwNDM4KQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgcGh5X2xpbmtfaGFuZGxlOworICAgIHZfVThfdCAgICAgICB0eF9mbG93X3NwZWNbMThdOworICAgIHZfVThfdCAgICAgICByeF9mbG93X3NwZWNbMThdOworfSB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9DUkVBVEVfTE9HSUNBTF9MSU5LX0NNRCAoIDEwODAgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfQ1JFQVRFX0xPR0lDQUxfTElOS19DTURfTUlOX0xFTiAoIDM5ICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0NSRUFURV9MT0dJQ0FMX0xJTktfQ01EX01BWF9MRU4gKCAzOSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAxMDc3ICgweDA0MzUpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgcGh5X2xpbmtfaGFuZGxlOworICAgIHZfVThfdCAgICAgICBrZXlfbGVuZ3RoOworICAgIHZfVThfdCAgICAgICBrZXlfdHlwZTsKKyAgICB2X1U4X3QgICAgICAga2V5X21hdGVyaWFsWzMyXTsKK30gdEJ0YW1wVExWSENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0NSRUFURV9QSFlTSUNBTF9MSU5LX0NNRCAoIDEwNzcgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfQ1JFQVRFX1BIWVNJQ0FMX0xJTktfQ01EX01JTl9MRU4gKCA1ICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0NSRUFURV9QSFlTSUNBTF9MSU5LX0NNRF9NQVhfTEVOICggMzcgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMjYgKDB4MDAxYSkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIGxpbmtfdHlwZTsKK30gdEJ0YW1wVExWSENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50OworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfREFUQV9CVUZGRVJfT1ZFUkZMT1dfRVZFTlQgKCAyNiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9EQVRBX0JVRkZFUl9PVkVSRkxPV19FVkVOVF9NSU5fTEVOICggMyApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9EQVRBX0JVRkZFUl9PVkVSRkxPV19FVkVOVF9NQVhfTEVOICggMyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50KHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAxMDgyICgweDA0M2EpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1UxNl90ICAgICAgbG9nX2xpbmtfaGFuZGxlOworfSB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTktfQ01EICggMTA4MiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DTURfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTktfQ01EX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDcwICgweDAwNDYpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBzdGF0dXM7CisgICAgdl9VMTZfdCAgICAgIGxvZ19saW5rX2hhbmRsZTsKKyAgICB2X1U4X3QgICAgICAgcmVhc29uOworfSB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DT01QTEVURV9FVkVOVCAoIDcwICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX0RJU0NPTk5FQ1RfTE9HSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UX01JTl9MRU4gKCA2ICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0RJU0NPTk5FQ1RfTE9HSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UX01BWF9MRU4gKCA2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCh2b2lkICosIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCh2b2lkICosIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDEwNzkgKDB4MDQzNykKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgcGh5X2xpbmtfaGFuZGxlOworICAgIHZfVThfdCAgICAgICByZWFzb247Cit9IHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LX0NNRCAoIDEwNzkgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LX0NNRF9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTktfQ01EX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDY2ICgweDAwNDIpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50IHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgc3RhdHVzOworICAgIHZfVThfdCAgICAgICBwaHlfbGlua19oYW5kbGU7CisgICAgdl9VOF90ICAgICAgIHJlYXNvbjsKK30gdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0RJU0NPTk5FQ1RfUEhZU0lDQUxfTElOS19DT01QTEVURV9FVkVOVCAoIDY2ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX0RJU0NPTk5FQ1RfUEhZU0lDQUxfTElOS19DT01QTEVURV9FVkVOVF9NSU5fTEVOICggNSApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTktfQ09NUExFVEVfRVZFTlRfTUFYX0xFTiAoIDUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50Kiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMTA4NCAoMHgwNDNjKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1UxNl90ICAgICAgbG9nX2xpbmtfaGFuZGxlOworICAgIHZfVThfdCAgICAgICBiZV9hZ2dyX2NvdW50ZXI7CisgICAgdl9VOF90ICAgICAgIHR4X2Zsb3dfc3BlY1sxOF07CisgICAgdl9VOF90ICAgICAgIHJ4X2Zsb3dfc3BlY1sxOF07Cit9IHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0ZMT1dfU1BFQ19NT0RJRllfQ01EICggMTA4NCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9GTE9XX1NQRUNfTU9ESUZZX0NNRF9NSU5fTEVOICggNDEgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfRkxPV19TUEVDX01PRElGWV9DTURfTUFYX0xFTiAoIDQxICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9DbWQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDcxICgweDAwNDcpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIHN0YXR1czsKKyAgICB2X1UxNl90ICAgICAgbG9nX2xpbmtfaGFuZGxlOworfSB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0ZMT1dfU1BFQ19NT0RJRllfQ09NUExFVEVfRVZFTlQgKCA3MSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9GTE9XX1NQRUNfTU9ESUZZX0NPTVBMRVRFX0VWRU5UX01JTl9MRU4gKCA1ICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0ZMT1dfU1BFQ19NT0RJRllfQ09NUExFVEVfRVZFTlRfTUFYX0xFTiAoIDUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NvbXBsZXRlX0V2ZW50KHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NvbXBsZXRlX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudCh2b2lkICosIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NvbXBsZXRlX0V2ZW50Kiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMzA4MCAoMHgwYzA4KQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX0ZsdXNoX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VMTZfdCAgICAgIGxvZ19saW5rX2hhbmRsZTsKK30gdEJ0YW1wVExWSENJX0ZsdXNoX0NtZDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0ZMVVNIX0NNRCAoIDMwODAgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfRkxVU0hfQ01EX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0ZMVVNIX0NNRF9NQVhfTEVOICggNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0ZsdXNoX0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX0ZsdXNoX0NtZCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9GbHVzaF9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRmx1c2hfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0ZsdXNoX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9GbHVzaF9DbWQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAxNyAoMHgwMDExKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX0ZsdXNoX09jY3VycmVkX0V2ZW50IHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1UxNl90ICAgICAgbG9nX2xpbmtfaGFuZGxlOworfSB0QnRhbXBUTFZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9GTFVTSF9PQ0NVUlJFRF9FVkVOVCAoIDE3ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX0ZMVVNIX09DQ1VSUkVEX0VWRU5UX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0ZMVVNIX09DQ1VSUkVEX0VWRU5UX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCh2b2lkICosIHRCdGFtcFRMVkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCh2b2lkICosIHRCdGFtcFRMVkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDMxNjcgKDB4MEM1RikKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9FbmhhbmNlZF9GbHVzaF9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVTE2X3QgICAgICBsb2dfbGlua19oYW5kbGU7CisgICAgdl9VOF90ICAgICAgIHBhY2tldF90eXBlOworfSB0QnRhbXBUTFZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfRU5IQU5DRURfRkxVU0hfQ01EICggMzE2NyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9FTkhBTkNFRF9GTFVTSF9DTURfTUlOX0xFTiAoIDUgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfRU5IQU5DRURfRkxVU0hfQ01EX01BWF9MRU4gKCA1ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0VuaGFuY2VkX0ZsdXNoX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9FbmhhbmNlZF9GbHVzaF9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDU3ICgweDAwMzkpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfRW5oYW5jZWRfRmx1c2hfQ29tcGxldGVfRXZlbnQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVTE2X3QgICAgICBsb2dfbGlua19oYW5kbGU7Cit9IHRCdGFtcFRMVkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZV9FdmVudDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0VOSEFOQ0VEX0ZMVVNIX0NPTVBMRVRFX0VWRU5UICggNTcgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfRU5IQU5DRURfRkxVU0hfQ09NUExFVEVfRVZFTlRfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfRU5IQU5DRURfRkxVU0hfQ09NUExFVEVfRVZFTlRfTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZV9FdmVudCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50Kik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50Kiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50Kiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisvLyBJRCA2MiAoMHgwMDNlKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIGJkX2FkZHJbNl07CisgICAgdl9VOF90ICAgICAgIGdlbmVyaWNfYW1wX2xpbmtfa2V5WzMyXTsKKyAgICB2X1U4X3QgICAgICAga2V5X3R5cGU7Cit9IHRCdGFtcFRMVkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9HRU5FUklDX0FNUF9MSU5LX0tFWV9OT1RJRklDQVRJT05fRVZFTlQgKCA2MiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9HRU5FUklDX0FNUF9MSU5LX0tFWV9OT1RJRklDQVRJT05fRVZFTlRfTUlOX0xFTiAoIDQxICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0dFTkVSSUNfQU1QX0xJTktfS0VZX05PVElGSUNBVElPTl9FVkVOVF9NQVhfTEVOICggNDEgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50Kiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMTYgKDB4MDAxMCkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIGhhcmR3YXJlX2NvZGU7Cit9IHRCdGFtcFRMVkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0hBUkRXQVJFX0VSUk9SX0VWRU5UICggMTYgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfSEFSRFdBUkVfRVJST1JfRVZFTlRfTUlOX0xFTiAoIDMgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfSEFSRFdBUkVfRVJST1JfRVZFTlRfTUFYX0xFTiAoIDMgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50Kik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50Kiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50Kiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMTA4MyAoMHgwNDNiKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX0xvZ2ljYWxfTGlua19DYW5jZWxfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgcGh5X2xpbmtfaGFuZGxlOworICAgIHZfVThfdCAgICAgICB0eF9mbG93X3NwZWNfaWQ7Cit9IHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0xPR0lDQUxfTElOS19DQU5DRUxfQ01EICggMTA4MyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9MT0dJQ0FMX0xJTktfQ0FOQ0VMX0NNRF9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9MT0dJQ0FMX0xJTktfQ0FOQ0VMX0NNRF9NQVhfTEVOICggNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0xvZ2ljYWxfTGlua19DYW5jZWxfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA2OSAoMHgwMDQ1KQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIHN0YXR1czsKKyAgICB2X1UxNl90ICAgICAgbG9nX2xpbmtfaGFuZGxlOworICAgIHZfVThfdCAgICAgICBwaHlfbGlua19oYW5kbGU7CisgICAgdl9VOF90ICAgICAgIGZsb3dfc3BlY19pZDsKK30gdEJ0YW1wVExWSENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX0xPR0lDQUxfTElOS19DT01QTEVURV9FVkVOVCAoIDY5ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX0xPR0lDQUxfTElOS19DT01QTEVURV9FVkVOVF9NSU5fTEVOICggNyApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9MT0dJQ0FMX0xJTktfQ09NUExFVEVfRVZFTlRfTUFYX0xFTiAoIDcgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50Kiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMjUgKDB4MDAxOSkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50IHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgaGNpX2NvbW1hbmRfcGFja2V0WzY0XTsKK30gdEJ0YW1wVExWSENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9MT09QQkFDS19DT01NQU5EX0VWRU5UICggMjUgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfTE9PUEJBQ0tfQ09NTUFORF9FVkVOVF9NSU5fTEVOICggNjYgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfTE9PUEJBQ0tfQ09NTUFORF9FVkVOVF9NQVhfTEVOICggNjYgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50KHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudCh2b2lkICosIHRCdGFtcFRMVkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50Kiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNjQgKDB4MDA0MCkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50IHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgc3RhdHVzOworICAgIHZfVThfdCAgICAgICBwaHlfbGlua19oYW5kbGU7CisgICAgdl9VOF90ICAgICAgIGNoX251bWJlcjsKK30gdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9QSFlTSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UICggNjQgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUEhZU0lDQUxfTElOS19DT01QTEVURV9FVkVOVF9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9QSFlTSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCh2b2lkICosIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50Kiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDY3ICgweDAwNDMpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBwaHlfbGlua19oYW5kbGU7CisgICAgdl9VOF90ICAgICAgIHJlYXNvbjsKK30gdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfTG9zc19XYXJuaW5nX0V2ZW50OworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUEhZU0lDQUxfTElOS19MT1NTX1dBUk5JTkdfRVZFTlQgKCA2NyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9QSFlTSUNBTF9MSU5LX0xPU1NfV0FSTklOR19FVkVOVF9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9QSFlTSUNBTF9MSU5LX0xPU1NfV0FSTklOR19FVkVOVF9NQVhfTEVOICggNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfTG9zc19XYXJuaW5nX0V2ZW50KHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA2OCAoMHgwMDQ0KQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBwaHlfbGlua19oYW5kbGU7Cit9IHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50OworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUEhZU0lDQUxfTElOS19SRUNPVkVSWV9FVkVOVCAoIDY4ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX1BIWVNJQ0FMX0xJTktfUkVDT1ZFUllfRVZFTlRfTUlOX0xFTiAoIDMgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUEhZU0lDQUxfTElOS19SRUNPVkVSWV9FVkVOVF9NQVhfTEVOICggMyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50Kik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAzMCAoMHgwMDFlKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1Fvc19WaW9sYXRpb25fRXZlbnQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVTE2X3QgICAgICBsb2dfbGlua19oYW5kbGU7Cit9IHRCdGFtcFRMVkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50OworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUU9TX1ZJT0xBVElPTl9FVkVOVCAoIDMwICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX1FPU19WSU9MQVRJT05fRVZFTlRfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUU9TX1ZJT0xBVElPTl9FVkVOVF9NQVhfTEVOICggNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1Fvc19WaW9sYXRpb25fRXZlbnQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50Kik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1Fvc19WaW9sYXRpb25fRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUW9zX1Zpb2xhdGlvbl9FdmVudCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX1Fvc19WaW9sYXRpb25fRXZlbnQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAzMTc3ICgweDBjNjkpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VMTZfdCAgICAgIGxvZ19saW5rX2hhbmRsZTsKK30gdEJ0YW1wVExWSENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVRfQ01EICggMzE3NyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVRfQ01EX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVF9DTURfTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNDEwMSAoMHgxMDA1KQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1JlYWRfQnVmZmVyX1NpemVfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKK30gdEJ0YW1wVExWSENJX1JlYWRfQnVmZmVyX1NpemVfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9CVUZGRVJfU0laRV9DTUQgKCA0MTAxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfQlVGRkVSX1NJWkVfQ01EX01JTl9MRU4gKCAyICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfQlVGRkVSX1NJWkVfQ01EX01BWF9MRU4gKCAyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDMwOTMgKDB4MGMxNSkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKK30gdEJ0YW1wVExWSENJX1JlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVRfQ01EICggMzA5MyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVRfQ01EX01JTl9MRU4gKCAyICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVF9DTURfTUFYX0xFTiAoIDIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNDEwNiAoMHgxMDBhKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7Cit9IHRCdGFtcFRMVkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0RBVEFfQkxPQ0tfU0laRV9DTUQgKCA0MTA2ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfREFUQV9CTE9DS19TSVpFX0NNRF9NSU5fTEVOICggMiApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0RBVEFfQkxPQ0tfU0laRV9DTURfTUFYX0xFTiAoIDIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9EYXRhX0Jsb2NrX1NpemVfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9EYXRhX0Jsb2NrX1NpemVfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNTEyMSAoMHgxNDAxKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVTE2X3QgICAgICBsb2dfbGlua19oYW5kbGU7Cit9IHRCdGFtcFRMVkhDSV9SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSX0NNRCAoIDUxMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSX0NNRF9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJfQ01EX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDMxNzQgKDB4MGM2NikKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9SZWFkX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7Cit9IHRCdGFtcFRMVkhDSV9SZWFkX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfRkxPV19DT05UUk9MX01PREVfQ01EICggMzE3NCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0ZMT1dfQ09OVFJPTF9NT0RFX0NNRF9NSU5fTEVOICggMiApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0ZMT1dfQ09OVFJPTF9NT0RFX0NNRF9NQVhfTEVOICggMiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9GbG93X0NvbnRyb2xfTW9kZV9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9GbG93X0NvbnRyb2xfTW9kZV9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9GbG93X0NvbnRyb2xfTW9kZV9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9GbG93X0NvbnRyb2xfTW9kZV9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9GbG93X0NvbnRyb2xfTW9kZV9DbWQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA1MTIzICgweDE0MDMpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1UxNl90ICAgICAgbG9nX2xpbmtfaGFuZGxlOworfSB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MSU5LX1FVQUxJVFlfQ01EICggNTEyMyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xJTktfUVVBTElUWV9DTURfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MSU5LX1FVQUxJVFlfQ01EX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xpbmtfUXVhbGl0eV9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDMxMjYgKDB4MGMzNikKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVTE2X3QgICAgICBsb2dfbGlua19oYW5kbGU7Cit9IHRCdGFtcFRMVkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVF9DTUQgKCAzMTI2ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUX0NNRF9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVF9DTURfTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNTEzMCAoMHgxNDBhKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIHBoeV9saW5rX2hhbmRsZTsKKyAgICB2X1UxNl90ICAgICAgbGVuZ3RoX3NvX2ZhcjsKKyAgICB2X1UxNl90ICAgICAgbWF4X3JlbW90ZV9hbXBfYXNzb2NfbGVuZ3RoOworfSB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9BTVBfQVNTT0NfQ01EICggNTEzMCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX0FNUF9BU1NPQ19DTURfTUlOX0xFTiAoIDcgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9BTVBfQVNTT0NfQ01EX01BWF9MRU4gKCA3ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9Bc3NvY19DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDUxMjkgKDB4MTQwOSkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworfSB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9BTVBfSU5GT1JNQVRJT05fQ01EICggNTEyOSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX0FNUF9JTkZPUk1BVElPTl9DTURfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9BTVBfSU5GT1JNQVRJT05fQ01EX01BWF9MRU4gKCAyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDQwOTggKDB4MTAwMikKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7Cit9IHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzX0NtZDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0NNRFNfQ01EICggNDA5OCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9DTURTX0NNRF9NSU5fTEVOICggMiApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9DTURTX0NNRF9NQVhfTEVOICggMiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA0MDk3ICgweDEwMDEpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKK30gdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfTE9DQUxfVkVSU0lPTl9JTkZPX0NNRCAoIDQwOTcgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9WRVJTSU9OX0lORk9fQ01EX01JTl9MRU4gKCAyICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfTE9DQUxfVkVSU0lPTl9JTkZPX0NNRF9NQVhfTEVOICggMiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZWFkX0xvY2FsX1ZlcnNpb25fSW5mb19DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX1ZlcnNpb25fSW5mb19DbWQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAzMTcyICgweDBjNjQpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7Cit9IHRCdGFtcFRMVkhDSV9SZWFkX0xvY2F0aW9uX0RhdGFfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBVElPTl9EQVRBX0NNRCAoIDMxNzIgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBVElPTl9EQVRBX0NNRF9NSU5fTEVOICggMiApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FUSU9OX0RBVEFfQ01EX01BWF9MRU4gKCAyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2F0aW9uX0RhdGFfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDMxNjkgKDB4MGM2MSkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworfSB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVRfQ01EICggMzE2OSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xPR0lDQUxfTElOS19BQ0NFUFRfVElNRU9VVF9DTURfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVRfQ01EX01BWF9MRU4gKCAyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1JlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDYxNDUgKDB4MTgwMSkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKK30gdEJ0YW1wVExWSENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xPT1BCQUNLX01PREVfQ01EICggNjE0NSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX0xPT1BCQUNLX01PREVfQ01EX01JTl9MRU4gKCAyICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFQURfTE9PUEJBQ0tfTU9ERV9DTURfTUFYX0xFTiAoIDIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNTEyNSAoMHgxNDA1KQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1JlYWRfUlNTSV9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVTE2X3QgICAgICBsb2dfbGlua19oYW5kbGU7Cit9IHRCdGFtcFRMVkhDSV9SZWFkX1JTU0lfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9SU1NJX0NNRCAoIDUxMjUgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVBRF9SU1NJX0NNRF9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRUFEX1JTU0lfQ01EX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9SU1NJX0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfUlNTSV9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9SU1NJX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX1JTU0lfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfUlNTSV9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9SU1NJX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDMwNzUgKDB4MGMwMykKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9SZXNldF9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworfSB0QnRhbXBUTFZIQ0lfUmVzZXRfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVTRVRfQ01EICggMzA3NSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9SRVNFVF9DTURfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVTRVRfQ01EX01BWF9MRU4gKCAyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVzZXRfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVzZXRfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1Jlc2V0X0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZXNldF9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVzZXRfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1Jlc2V0X0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDUxMjIgKDB4MTQwMikKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VMTZfdCAgICAgIGxvZ19saW5rX2hhbmRsZTsKK30gdEJ0YW1wVExWSENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfUkVTRVRfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUl9DTUQgKCA1MTIyICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJfQ01EX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1JFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJfQ01EX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVzZXRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCopOworCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDMwNzcgKDB4MGMwNSkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9TZXRfRXZlbnRfTWFza19DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBldmVudF9tYXNrWzhdOworfSB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfU0VUX0VWRU5UX01BU0tfQ01EICggMzA3NyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9TRVRfRVZFTlRfTUFTS19DTURfTUlOX0xFTiAoIDEwICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1NFVF9FVkVOVF9NQVNLX0NNRF9NQVhfTEVOICggMTAgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19DbWQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9TZXRfRXZlbnRfTWFza19DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX0NtZCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9TZXRfRXZlbnRfTWFza19DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMzE3MSAoMHgwYzYzKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBldmVudF9tYXNrX3BhZ2VfMls4XTsKK30gdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9TRVRfRVZFTlRfTUFTS19QQUdFXzJfQ01EICggMzE3MSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9TRVRfRVZFTlRfTUFTS19QQUdFXzJfQ01EX01JTl9MRU4gKCAxMCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9TRVRfRVZFTlRfTUFTS19QQUdFXzJfQ01EX01BWF9MRU4gKCAxMCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQodm9pZCAqLCB2X1U4X3QqLHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9TZXRfRXZlbnRfTWFza19QYWdlXzJfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9TZXRfRXZlbnRfTWFza19QYWdlXzJfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAzMTc5ICgweDBjNmIpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgcGh5X2xpbmtfaGFuZGxlOworICAgIHZfVThfdCAgICAgICBzaG9ydF9yYW5nZV9tb2RlOworfSB0QnRhbXBUTFZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfU0VUX1NIT1JUX1JBTkdFX01PREVfQ01EICggMzE3OSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9TRVRfU0hPUlRfUkFOR0VfTU9ERV9DTURfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfU0VUX1NIT1JUX1JBTkdFX01PREVfQ01EX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9TZXRfU2hvcnRfUmFuZ2VfTW9kZV9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDc2ICgweDAwNGMpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGVfRXZlbnQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBzdGF0dXM7CisgICAgdl9VOF90ICAgICAgIHBoeV9saW5rX2hhbmRsZTsKKyAgICB2X1U4X3QgICAgICAgc2hvcnRfcmFuZ2VfbW9kZTsKK30gdEJ0YW1wVExWSENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50OworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfU0hPUlRfUkFOR0VfTU9ERV9DSEFOR0VfQ09NUExFVEVfRVZFTlQgKCA3NiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9TSE9SVF9SQU5HRV9NT0RFX0NIQU5HRV9DT01QTEVURV9FVkVOVF9NSU5fTEVOICggNSApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9TSE9SVF9SQU5HRV9NT0RFX0NIQU5HRV9DT01QTEVURV9FVkVOVF9NQVhfTEVOICggNSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGVfRXZlbnQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGVfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGVfRXZlbnQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGVfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGVfRXZlbnQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAzMTc4ICgweDBjNmEpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVTE2X3QgICAgICBsb2dfbGlua19oYW5kbGU7CisgICAgdl9VMzJfdCAgICAgIGJlc3RfZWZmb3J0X2ZsdXNoX3RpbWVvdXQ7Cit9IHRCdGFtcFRMVkhDSV9Xcml0ZV9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1dSSVRFX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVRfQ01EICggMzE3OCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9XUklURV9CRVNUX0VGRk9SVF9GTFVTSF9USU1FT1VUX0NNRF9NSU5fTEVOICggOCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9XUklURV9CRVNUX0VGRk9SVF9GTFVTSF9USU1FT1VUX0NNRF9NQVhfTEVOICggOCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAzMDk0ICgweDBjMTYpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVTE2X3QgICAgICBjb25uZWN0aW9uX2FjY2VwdF90aW1lb3V0OworfSB0QnRhbXBUTFZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9XUklURV9DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VUX0NNRCAoIDMwOTQgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVF9DTURfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVF9DTURfTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMzE3NSAoMHgwYzY3KQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIGZsb3dfY29udHJvbF9tb2RlOworfSB0QnRhbXBUTFZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfRkxPV19DT05UUk9MX01PREVfQ01EICggMzE3NSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9XUklURV9GTE9XX0NPTlRST0xfTU9ERV9DTURfTUlOX0xFTiAoIDMgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfRkxPV19DT05UUk9MX01PREVfQ01EX01BWF9MRU4gKCAzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDMxMjcgKDB4MGMzNykKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kIHsKKyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1UxNl90ICAgICAgbG9nX2xpbmtfaGFuZGxlOworICAgIHZfVTE2X3QgICAgICBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQ7Cit9IHRCdGFtcFRMVkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUX0NNRCAoIDMxMjcgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUX0NNRF9NSU5fTEVOICggNiApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9XUklURV9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVRfQ01EX01BWF9MRU4gKCA2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDMxNzMgKDB4MGM2NSkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIGxvY19kb21haW5fYXdhcmU7CisgICAgdl9VOF90ICAgICAgIGxvY19kb21haW5bM107CisgICAgdl9VOF90ICAgICAgIGxvY19vcHRpb25zOworfSB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9XUklURV9MT0NBVElPTl9EQVRBX0NNRCAoIDMxNzMgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTE9DQVRJT05fREFUQV9DTURfTUlOX0xFTiAoIDcgKQorCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTE9DQVRJT05fREFUQV9DTURfTUFYX0xFTiAoIDcgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMzE3MCAoMHgwYzYyKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVTE2X3QgICAgICBsb2dpY2FsX2xpbmtfYWNjZXB0X3RpbWVvdXQ7Cit9IHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUX0NNRCAoIDMxNzAgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUX0NNRF9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9XUklURV9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVRfQ01EX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCh2b2lkICosIHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCosIHZfVTMyX3QqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDYxNDYgKDB4MTgwMikKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgdl9VOF90ICAgICAgIGxvb3BiYWNrX21vZGU7Cit9IHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1dSSVRFX0xPT1BCQUNLX01PREVfQ01EICggNjE0NiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9XUklURV9MT09QQkFDS19NT0RFX0NNRF9NSU5fTEVOICggMyApCisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9XUklURV9MT09QQkFDS19NT0RFX0NNRF9NQVhfTEVOICggMyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kKHZvaWQgKiwgdl9VOF90Kix2X1UxNl90LCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQqKTsKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA1MTMxICgweDE0MGIpCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBwaHlfbGlua19oYW5kbGU7CisgICAgdl9VMTZfdCAgICAgIGxlbmd0aF9zb19mYXI7CisgICAgdl9VMTZfdCAgICAgIGFtcF9hc3NvY19yZW1haW5pbmdfbGVuZ3RoOworICAgIHZfVThfdCAgICAgICBhbXBfYXNzb2NfZnJhZ21lbnRbMjQ4XTsKK30gdEJ0YW1wVExWSENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQ19DTUQgKCA1MTMxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBCVEFNUF9UTFZfSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0NfQ01EX01JTl9MRU4gKCA3ICkKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0NfQ01EX01BWF9MRU4gKCAyNTUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZCh2b2lkICosIHZfVThfdCosdl9VMTZfdCwgdEJ0YW1wVExWSENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kKik7CisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kKiwgdl9VMzJfdCopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNjQ1MTIgKDB4ZmMwMCkKK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9WZW5kb3JfU3BlY2lmaWNfQ21kXzAgeworICAgIHZfVThfdCAgICAgICBwcmVzZW50OworfSB0QnRhbXBUTFZIQ0lfVmVuZG9yX1NwZWNpZmljXzBfQ21kOworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfVkVORE9SX1NQRUNJRklDX0NNRF8wICggNjQ1MTIgKQorCisvLyBJRCA2NDUxMyAoMHhmYzAxKQordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX1ZlbmRvcl9TcGVjaWZpY19DbWRfMSB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7Cit9IHRCdGFtcFRMVkhDSV9WZW5kb3JfU3BlY2lmaWNfMV9DbWQ7CisKKyNkZWZpbmUgQlRBTVBfVExWX0hDSV9WRU5ET1JfU1BFQ0lGSUNfQ01EXzEgKCA2NDUxMyApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluZm9ybWF0aW9uIEVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnJhbWVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wQU1QX0FTU09DeworICAgIHRCdGFtcFRMVkFNUF9Bc3NvY19NQUNfQWRkciBBTVBfQXNzb2NfTUFDX0FkZHI7CisgICAgdEJ0YW1wVExWQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QgQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3Q7CisgICAgdEJ0YW1wVExWQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsIEFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbDsKKyAgICB0QnRhbXBUTFZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyBBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllczsKKyAgICB0QnRhbXBUTFZBTVBfQXNzb2NfUEFMX1ZlcnNpb24gQU1QX0Fzc29jX1BBTF9WZXJzaW9uOworfSB0QnRhbXBBTVBfQVNTT0M7CisKKyNkZWZpbmUgQlRBTVBfQU1QX0FTU09DICggMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tBTVBfQVNTT0Modm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMzJfdCBuQnVmLCB0QnRhbXBBTVBfQVNTT0MgKnBGcm0pOwordl9VMzJfdCBidGFtcFBhY2tBTVBfQVNTT0Modm9pZCAqIHBDdHgsIHRCdGFtcEFNUF9BU1NPQyAqcEZybSwgdl9VOF90ICpwQnVmLCB2X1UzMl90IG5CdWYsIHZfVTMyX3QgKnBuQ29uc3VtZWQpOwordl9VMzJfdCBidGFtcEdldFBhY2tlZEFNUF9BU1NPQ1NpemUodm9pZCAqIHBDdHgsIHRCdGFtcEFNUF9BU1NPQyAqcEZybSwgdl9VMzJfdCAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKworLyogSENJIE51bWJlciBvZiBDb21wbGV0ZWQgUGFja2V0cyBFdmVudCovCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBUTFZIQ0lfTnVtX0NvbXBsZXRlZF9Qa3RzX0V2ZW50Cit7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgLyogCisgICAgICBUaGUgbnVtYmVyIG9mIENvbm5lY3Rpb24gSGFuZGxlcyBhbmQgTnVtX0RhdGFfUGFja2V0cworICAgICAgcGFyYW1ldGVycyBwYWlycyBjb250YWluZWQgaW4gdGhpcyBldmVudC5SYW5nZTogMC0yNTUKKyAgICAqLworCisgICAgdl9VOF90ICAgbnVtX2hhbmRsZXM7CisKKyAgICAvKiAKKyAgICAgIFNpemUgLCBOdW1iZXIgb2YgSGFuZGxlcyAqIDIgT2N0ZXRzLFJhbmdlOiAweDAwMDAtMHgwRUZGIAorICAgICovCisgICAgdl9VMTZfdCAgY29ubl9oYW5kbGVzW1dMQU5CQVBfTUFYX0xPR19MSU5LU107ICAKKworICAgIC8qIAorICAgICAgVGhlIG51bWJlciBvZiBIQ0kgRGF0YSBQYWNrZXRzIHRoYXQgaGF2ZSBiZWVuIGNvbXBsZXRlZCAodHJhbnNtaXR0ZWQKKyAgICAgIG9yIGZsdXNoZWQpIGZvciB0aGUgYXNzb2NpYXRlZCBDb25uZWN0aW9uIEhhbmRsZSBzaW5jZSB0aGUgcHJldmlvdXMgdGltZQorICAgICAgdGhlIGV2ZW50IHdhcyByZXR1cm5lZC5SYW5nZSBmb3IgTjogMHgwMDAwLTB4RkZGRgorICAgICovCisgICAgdl9VMTZfdCAgbnVtX2NvbXBsZXRlZF9wa3RzW1dMQU5CQVBfTUFYX0xPR19MSU5LU107IAorfSB0QnRhbXBUTFZIQ0lfTnVtX0NvbXBsZXRlZF9Qa3RzX0V2ZW50OworCisjZGVmaW5lIEJUQU1QX1RMVl9IQ0lfTlVNX09GX0NPTVBMRVRFRF9QS1RTX0VWRU5UICggMTkgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9OdW1fQ29tcGxldGVkX1BrdHNfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfTnVtX0NvbXBsZXRlZF9Qa3RzX0V2ZW50Kiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX051bV9Db21wbGV0ZWRfUGt0c19FdmVudCh2b2lkICosIHRCdGFtcFRMVkhDSV9OdW1fQ29tcGxldGVkX1BrdHNfRXZlbnQqLCB2X1UzMl90Kik7CisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIEZsb3cgU1BlYyovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9GTE9XX1NQRUNfVExWX0xFTiAgICAgICAgICAxNgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKKy8qIEhDSSBOdW1iZXIgb2YgQ29tcGxldGVkIERhdGEgQmxvY2tzIEV2ZW50Ki8KK3R5cGVkZWYgc3RydWN0IHNCdGFtcFRMVkhDSV9OdW1fQ29tcGxldGVkX0RhdGFfQmxvY2tzX0V2ZW50Cit7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgLyogCisgICAgICBUb3RhbCBudW1iZXIgb2YgZGF0YSBibG9jayBidWZmZXJzIGF2YWlsYWJsZSBpbiB0aGUgQ29udHJvbGxlciBmb3IgdGhlCisgICAgICBzdG9yYWdlIG9mIGRhdGEgcGFja2V0cyBzY2hlZHVsZWQgZm9yIHRyYW5zbWlzc2lvbi4gVGhpcyBpbmRpY2F0ZXMKKyAgICAgIHRoZSBleGlzdGluZyB2YWx1ZSBpcyB1bmNoYW5nZWQsIG9yIGluY3JlYXNlZCwgb3IgcmVkdWNlZCBieSB1cCB0bworICAgICAgdGhlIHN1bSBvZiB0aGUgTnVtX09mX0NvbXBsZXRlZF9CbG9ja3MgdmFsdWVzIGluIHRoaXMgY29tbWFuZAorICAgICovCisKKyAgICB2X1UxNl90ICAgdG90YWxfbnVtX2RhdGFfYmxvY2tzOworCisgICAgLyogCisgICAgICBUaGUgbnVtYmVyIG9mIENvbm5lY3Rpb24gSGFuZGxlcyBhbmQgTnVtX0RhdGFfUGFja2V0cworICAgICAgcGFyYW1ldGVycyBwYWlycyBjb250YWluZWQgaW4gdGhpcyBldmVudC5SYW5nZTogMC0yNTUKKyAgICAqLworCisgICAgdl9VOF90ICAgbnVtX2hhbmRsZXM7CisKKyAgICAvKiAKKyAgICAgIFNpemUgLCBOdW1iZXIgb2YgSGFuZGxlcyAqIDIgT2N0ZXRzLFJhbmdlOiAweDAwMDAtMHgwRUZGIAorICAgICovCisgICAgdl9VMTZfdCAgY29ubl9oYW5kbGVzW1dMQU5CQVBfTUFYX0xPR19MSU5LU107ICAKKworICAgIC8qIAorICAgICAgVGhlIG51bWJlciBvZiBIQ0kgRGF0YSBQYWNrZXRzIHRoYXQgaGF2ZSBiZWVuIGNvbXBsZXRlZCAodHJhbnNtaXR0ZWQKKyAgICAgIG9yIGZsdXNoZWQpIGZvciB0aGUgYXNzb2NpYXRlZCBDb25uZWN0aW9uIEhhbmRsZSBzaW5jZSB0aGUgcHJldmlvdXMgdGltZQorICAgICAgdGhlIGV2ZW50IHdhcyByZXR1cm5lZC5SYW5nZSBmb3IgTjogMHgwMDAwLTB4RkZGRgorICAgICovCisgICAgdl9VMTZfdCAgbnVtX2NvbXBsZXRlZF9wa3RzW1dMQU5CQVBfTUFYX0xPR19MSU5LU107IAorCisgICAgLyogCisgICAgICBUaGUgbnVtYmVyIG9mIGRhdGEgYmxvY2tzIHRoYXQgaGF2ZSBiZWVuIGZyZWVkIGZvciB0aGUgYXNzb2NpYXRlZAorICAgICAgSGFuZGxlIHNpbmNlIHRoZSBwcmV2aW91cyB0aW1lIHRoYXQgYSBOdW1iZXIgT2YgQ29tcGxldGVkIERhdGEKKyAgICAgIEJsb2NrcyBldmVudCBwcm92aWRlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIEhhbmRsZS4KKyAgICAgIFJhbmdlIGZvciBOOiAweDAwMDAtMHhGRkZGCisgICAgKi8KKyAgICB2X1UxNl90ICBudW1fY29tcGxldGVkX2Jsb2Nrc1tXTEFOQkFQX01BWF9MT0dfTElOS1NdOyAKKworfSB0QnRhbXBUTFZIQ0lfTnVtX0NvbXBsZXRlZF9EYXRhX0Jsb2Nrc19FdmVudDsKKworI2RlZmluZSBCVEFNUF9UTFZfSENJX05VTV9PRl9DT01QTEVURURfREFUQV9CTE9DS1NfRVZFTlQgKCA3MiApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX051bV9Db21wbGV0ZWRfRGF0YV9CbG9ja3NfRXZlbnQodm9pZCAqLCB0QnRhbXBUTFZIQ0lfTnVtX0NvbXBsZXRlZF9EYXRhX0Jsb2Nrc19FdmVudCosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9OdW1fQ29tcGxldGVkX0RhdGFfQmxvY2tzX0V2ZW50KHZvaWQgKiwgdEJ0YW1wVExWSENJX051bV9Db21wbGV0ZWRfRGF0YV9CbG9ja3NfRXZlbnQqLCB2X1UzMl90Kik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKworI2VuZGlmIC8qIEJUQU1QSENJX0ggKi8KKworCmRpZmYgLS1naXQgYS9DT1JFL0JBUC9zcmMvYmFwQXBpRGF0YS5jIGIvQ09SRS9CQVAvc3JjL2JhcEFwaURhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODc1ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcEFwaURhdGEuYwpAQCAtMCwwICsxLDEyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgYiBhIHAgQSBwIGkgRCBhIHQgYSAuIEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIE9WRVJWSUVXOgorICAKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBCQVAgbW9kdWxlcworICAicGxhdGZvcm0gaW5kZXBlbmRlbnQiIERhdGEgcGF0aCBmdW5jdGlvbnMuCisgIAorICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIE9OTFkgYnkgb3RoZXIgCisgIFdMQU4gbW9kdWxlcyAoSEREKSB0aGF0IHByb3Blcmx5IHJlZ2lzdGVyIHdpdGggdGhlIEJBUCBMYXllciBpbml0aWFsbHkuCisKKyAgREVQRU5ERU5DSUVTOiAKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4gCisgIAorICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAgJEhlYWRlcjogL2N5Z2RyaXZlL2UvQnVpbGRzL003MjAxSlNEQ0FBUEFENTIyNDBCL1dNL3BsYXRmb3JtL21zbTcyMDAvU3JjL0RyaXZlcnMvU0QvQ2xpZW50RHJpdmVycy9XTEFOL1FDVC9DT1JFL0JBUC9zcmMvYmFwQXBpRGF0YS5jLHYgMS40IDIwMDgvMTEvMTAgMjI6MzQ6MjIganptdWRhIEV4cCBqem11ZGEgJCREYXRlVGltZSQkQXV0aG9yOiBqem11ZGEgJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjAwOC0wOS0xNSAgICBqZXogICAgIENyZWF0ZWQgbW9kdWxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIgorI2luY2x1ZGUgInZvc190cmFjZS5oIgorLy9JIG5lZWQgdGhlIFRMIHR5cGVzIGFuZCBBUEkKKyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIgorCisjaW5jbHVkZSAid2xhbl9xY3RfaGFsLmgiCisKKy8qIEJULUFNUCBQQUwgQVBJIGhlYWRlciBmaWxlICovIAorI2luY2x1ZGUgImJhcEFwaS5oIiAKKyNpbmNsdWRlICJiYXBJbnRlcm5hbC5oIiAKKyNpbmNsdWRlICJiYXBBcGlUaW1lci5oIgorCisvLyNkZWZpbmUgQkFQX0RFQlVHCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qRW5kaWFuLW5lc3MgZGVmaW5pdGlvbnMqLworCisjdW5kZWYgQkFQX0xJVFRMRV9CSVRfRU5ESUFOCisjZGVmaW5lIEJBUF9MSVRUTEVfQklUX0VORElBTgorCisvKkxMQyBoZWFkZXIgZGVmaW5pdGlvbnMqLworCisvKiBMZW5ndGggb2YgdGhlIExMQyBoZWFkZXIqLworI2RlZmluZSBXTEFOQkFQX0xMQ19IRUFERVJfTEVOICAgOCAKKyNpZiAwCisvKk9mZnNldCBvZiB0aGUgT1VJIGZpZWxkIGluc2lkZSB0aGUgTExDL1NOQVAgaGVhZGVyKi8KKyNkZWZpbmUgV0xBTkJBUF9MTENfT1VJX09GRlNFVCAgICAgICAgICAgICAgICAgMworCisvKlNpemUgb2YgdGhlIE9VSSB0eXBlIGZpZWxkIGluc2lkZSB0aGUgTExDL1NOQVAgaGVhZGVyKi8KKyNkZWZpbmUgV0xBTkJBUF9MTENfT1VJX1NJWkUgICAgICAgICAgICAgICAgICAgMworCisvKk9mZnNldCBvZiB0aGUgcHJvdG9jb2wgdHlwZSBmaWVsZCBpbnNpZGUgdGhlIExMQy9TTkFQIGhlYWRlciovCisjZGVmaW5lIFdMQU5CQVBfTExDX1BST1RPX1RZUEVfT0ZGU0VUICBXTEFOQkFQX0xMQ19PVUlfT0ZGU0VUICsgIFdMQU5CQVBfTExDX09VSV9TSVpFCisKKy8qU2l6ZSBvZiB0aGUgcHJvdG9jb2wgdHlwZSBmaWVsZCBpbnNpZGUgdGhlIExMQy9TTkFQIGhlYWRlciovCisjZGVmaW5lIFdMQU5CQVBfTExDX1BST1RPX1RZUEVfU0laRSAgICAgICAgICAgIDIKKyNlbmRpZgorCisvKkJULUFNUCBwcm90b2NvbCB0eXBlIHZhbHVlcyovCisvKkJULUFNUCBwYWNrZXQgb2YgdHlwZSBkYXRhKi8KKyNkZWZpbmUgV0xBTkJBUF9CVF9BTVBfVFlQRV9EQVRBICAgICAgIDB4MDAwMQorCisvKkJULUFNUCBwYWNrZXQgb2YgdHlwZSBhY3Rpdml0eSByZXBvcnQqLworI2RlZmluZSBXTEFOQkFQX0JUX0FNUF9UWVBFX0FSICAgICAgICAgMHgwMDAyCisKKy8qQlQtQU1QIHBhY2tldCBvZiB0eXBlIHNlY3VyaXR5IGZyYW1lKi8KKyNkZWZpbmUgV0xBTkJBUF9CVF9BTVBfVFlQRV9TRUMgICAgICAgIDB4MDAwMworCisvKjgwMi4zIGhlYWRlciBkZWZpbml0aW9ucyovCisjZGVmaW5lICBXTEFOQkFQXzgwMl8zX0hFQURFUl9MRU4gICAgICAgICAgICAgMTQKKworLyogT2Zmc2V0IG9mIERBIGZpZWxkIGluIGEgODAyLjMgaGVhZGVyKi8KKyNkZWZpbmUgIFdMQU5CQVBfODAyXzNfSEVBREVSX0RBX09GRlNFVCAgICAgICAgMAorCisvLypCVC1BTVAgcGFja2V0IExMQyBPVUkgdmFsdWUqLworY29uc3Qgdl9VOF90IFdMQU5CQVBfQlRfQU1QX09VSVtdID0gIHsweDAwLCAweDE5LCAweDU4IH07CisKKy8qTExDIGhlYWRlciB2YWx1ZSovCitzdGF0aWMgdl9VOF90IFdMQU5CQVBfTExDX0hFQURFUltdID0gIHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweDAwIH07CisKKy8qIEhDSSBoZWFkZXIgZGVmaW5pdGlvbnMqLworCisvLyBEZWZpbmUgdGhlIGxlbmd0aCBvZiB0aGUgQUNMIGRhdGEgcGFja2V0IEhDSSBoZWFkZXIKKyNkZWZpbmUgV0xBTkJBUF9IQ0lfQUNMX0hFQURFUl9MRU4gICAgNAorCisvLyBEZWJ1ZyByZWxhdGVkIGRlZmluZXMKKy8vI2RlZmluZSBEQkdMT0cgcHJpbnRmCisjZGVmaW5lIERVTVBMT0dfT04KKyNpZmRlZiBEVU1QTE9HX09OCisjZGVmaW5lIERVTVBMT0cobiwgbmFtZTEsIG5hbWUyLCBhU3RyLCBzaXplKSBcCisgICAgaWYgKDEpIFwKK3tcCisgICAgaW50IGk7XAorICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJWQuICVzOiAlcyA9IFxuIiwgbiwgbmFtZTEsIG5hbWUyKTsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIFwKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiUyLjJ4JXMiLCAoKHVuc2lnbmVkIGNoYXIgKilhU3RyKVtpXSwgaSAlIDE2ID09IDE1ID8gIlxuIiA6ICIgIik7IFwKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIlxuIik7IFwKK30KKyNlbHNlCisjZGVmaW5lIERVTVBMT0cobiwgbmFtZTEsIG5hbWUyLCBhU3RyLCBzaXplKQorI2VuZGlmCisKKyNpZiAwCisvLyBEZWJ1ZyByZWxhdGVkIGRlZmluZXMKKyNkZWZpbmUgREJHTE9HIHByaW50ZgorI2RlZmluZSBEVU1QTE9HCisjaWYgZGVmaW5lZCBEVU1QTE9HCisjZGVmaW5lIERVTVBMT0cobiwgbmFtZTEsIG5hbWUyLCBhU3RyLCBzaXplKSBcCisgICAgaWYgKDEpIFwKK3tcCisgICAgaW50IGk7XAorICAgIERCR0xPRygiJWQuICVzOiAlcyA9IFxuIiwgbiwgbmFtZTEsIG5hbWUyKTsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIFwKKyAgICAgICAgREJHTE9HKCIlMi4yeCVzIiwgKCh1bnNpZ25lZCBjaGFyICopYVN0cilbaV0sIGkgJSAxNiA9PSAxNSA/ICJcbiIgOiAiICIpOyBcCisgICAgREJHTE9HKCJcbiIpOyBcCit9CisjZWxzZQorI2RlZmluZSBEVU1QTE9HKG4sIG5hbWUxLCBuYW1lMiwgYVN0ciwgc2l6ZSkKKyNlbmRpZgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gRG9uJ3Qgd2UgaGF2ZSB0aGlzIHR5cGUgZGVmaW5lZCBzb21ld2hlcmU/CisjaWYgMAorLyogODAyLjMgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAvKiBEZXN0aW5hdGlvbiBhZGRyZXNzIGZpZWxkICovCisgdl9VOF90ICAgdkRBW1ZPU19NQUNfQUREUl9TSVpFXTsKKworIC8qIFNvdXJjZSBhZGRyZXNzIGZpZWxkICovCisgdl9VOF90ICAgdlNBW1ZPU19NQUNfQUREUl9TSVpFXTsKKworIC8qIExlbmd0aCBmaWVsZCAqLworIHZfVTE2X3QgIHVzTGVuVHlwZTsgIC8qIE51bSBieXRlcyBpbiBpbmZvIGZpZWxkIChpLmUuLCBleGNsdWRlIDgwMi4zIGhkcikgKi8KKyAgICAgICAgICAgICAgICAgICAgICAvKiBNYXggbGVuZ3RoIDE1MDAgKDB4NWRjKSAoV2hhdCBhYm91dCAweDVlZT8gVGhhdAorICAgICAgICAgICAgICAgICAgICAgICAqIGluY2x1ZGVzIDgwMi4zIEhlYWRlciBhbmQgRkNTLikgKi8KK31XTEFOQkFQXzgwMjNIZWFkZXJUeXBlOworI2VuZGlmCisKKy8qKgorICogXGJyaWVmIEhDSSBBQ0wgRGF0YSBwYWNrZXQgZm9ybWF0CisgKgorICogICAgIDAgICAgICA3IDggICAgICAxNSAxNiAgICAyMyAyNCAgICAzMQorICogICAgKy0tLS0tLS0tKy0tLS0rLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKKyAqICAgIHwgcGh5XyAgIHxsb2dffCBQQi98ICAgRGF0YSBUb3RhbCAgICB8CisgKiAgICB8IGxpbmtfICB8bG5rX3wgQkMgfCAgICAgIExlbmd0aCAgICAgfAorICogICAgfCBoYW5kbGUgfGhuZGx8RmxhZ3wgICAgICAgICAgICAgICAgIHwKKyAqICAgICstLS0tLS0tLSstLS0tKy0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgIHwKKyAqICAgIH4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+CisgKiAgICArLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworICoKKyAqICBOQjogCisgKiAgVGhpcyBpcyBpbiBsaXR0bGUtZW5kaWFuCisgKiAgMSkgcGh5X2xpbmtfaGFuZGxlIGlzIHRoZSBmaXJzdCA4IGJpdHMKKyAqICAyKSBsb2dfbGlua19oYW5kbGUgaXMgdGhlIG5leHQgNCBiaXRzIAorICogIDMpIFBCIGZsYWcgaXMgdGhlIG5leHQgMiBiaXRzCisgKiAgNCkgQkMgZmxhZ3MgaXMgdGhlIG5leHQgMiBiaXRzCisgKiAgNSkgVG90YWwgbGVuZ3RoIG9mIHRoZSBkYXRhIGZpZWxkIGlzIHRoZSBuZXh0IDE2IGJpdHMKKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgCit7CisKKyNpZm5kZWYgQkFQX0xJVFRMRV9CSVRfRU5ESUFOCisKKyAgIHZfVThfdCBwaHlMaW5rSGFuZGxlOyAvKiBkbyBJIGhhdmUgdG8gcmV2ZXJzZSB0aGUgYnl0ZT8gSSB0aGluayBzby4uLiAqLworCisgICB2X1U4X3QgQkNGbGFnIDoyOworICAgdl9VOF90IFBCRmxhZyA6MjsKKyAgIHZfVThfdCBsb2dMaW5rSGFuZGxlIDo0OworCisgICB2X1UxNl90IGRhdGFMZW5ndGg7ICAvKiBkbyBJIGhhdmUgdG8gcmV2ZXJzZSBlYWNoIGJ5dGU/IGFuZCB0aGVuIHJldmVyc2UgdGhlIHR3byBieXRlcz8gIEkgdGhpbmsgc28uLi4gKi8KKworI2Vsc2UKKworICAgdl9VOF90IHBoeUxpbmtIYW5kbGU7CisKKyAgIHZfVThfdCBsb2dMaW5rSGFuZGxlIDo0OworICAgdl9VOF90IFBCRmxhZyA6MjsKKyAgIHZfVThfdCBCQ0ZsYWcgOjI7CisKKyAgIHZfVTE2X3QgZGF0YUxlbmd0aDsgIC8qIE1heCBsZW5ndGggV0xBTkJBUF9NQVhfODAyMTFfUEFMX1BEVV9TSVpFICgxNDkyKSAqLworCisjZW5kaWYKKworfSBXTEFOQkFQX0hDSUFDTEhlYWRlclR5cGU7CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdsb2JhbCBEYXRhIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgVmFyaWFibGUgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbGl6ZWQgRnVuY3Rpb24gRGVmaW5pdGlvbnMKKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEb2N1bWVudGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBXTEFOQkFQX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUgICAgMTYKKyNkZWZpbmUgV0xBTkJBUF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFICAgIDQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1hsYXRlVHhEYXRhUGt0CisKKyAgREVTQ1JJUFRJT04gCisKKyAgICBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIHdoZW4gaXQgaGFzIGEgSENJIERhdGEgUGFja2V0IGFuZCBpdCB3YW50cyAKKyAgICB0byB0cmFuc2xhdGUgaXQgaW50byBhIDgwMi4zIExMQyBmcmFtZSAtIHJlYWR5IHRvIHNlbmQgdXNpbmcgVEwuCisKKworICBQQVJBTUVURVJTIAorCisgICAgYnRhbXBIYW5kbGU6IFRoZSBCVC1BTVAgUEFMIGhhbmRsZSByZXR1cm5lZCBpbiBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcGh5X2xpbmtfaGFuZGxlOiBVc2VkIGJ5IEJBUCB0byBpbmRlbnRpZnkgdGhlIFdMQU4gYXNzb2MuIChTdGFJZCkgCisKKyAgICBwdWNBQzogICAgICAgUG9pbnRlciB0byByZXR1cm4gdGhlIGFjY2VzcyBjYXRlZ29yeSAKKyAgICB2b3NEYXRhQnVmZjogVGhlIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIEJULUFNUCBwYWNrZXQgdG8gYmUgCisgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWQgdG8gYW4gODAyLjMgTExDIGZyYW1lCisgICAgdGxNZXRhSW5mbzogIHJldHVybiBtZXRhIGluZm8gZ2xlYW5lZCBmcm9tIHRoZSBvdXRnb2luZyBmcmFtZSwgaGVyZS4KKyAgIAorICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgQkFQIGhhbmRsZSBpcyBOVUxMICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTkJBUF9YbGF0ZVR4RGF0YVBrdAorKCAKKyAgICBwdEJ0YW1wSGFuZGxlICAgICBidGFtcEhhbmRsZSwgIC8qIFVzZWQgYnkgQkFQIHRvIGlkZW50aWZ5IHRoZSBhY3R1YWwgc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlcmVmb3JlIGFkZHJlc3NlcyAqLyAKKyAgICB2X1U4X3QgICAgICAgICAgICBwaHlfbGlua19oYW5kbGUsICAvKiBVc2VkIGJ5IEJBUCB0byBpbmRlbnRpZnkgdGhlIFdMQU4gYXNzb2MuIChTdGFJZCkgKi8KKyAgICBXTEFOVExfQUNFbnVtVHlwZSAgICAqcHVjQUMsICAgICAgICAvKiBSZXR1cm4gdGhlIEFDIGhlcmUgKi8KKyAgICBXTEFOVExfTWV0YUluZm9UeXBlICAqdGxNZXRhSW5mbywgLyogUmV0dXJuIHRoZSBNZXRhSW5mbyBoZXJlLiBBbiBhc3Npc3QgdG8gV0xBTkJBUF9TVEFGZXRjaFBrdENCVHlwZSAqLworICAgIHZvc19wa3RfdCAgICAgICAgKnZvc0RhdGFCdWZmCispCit7CisgICAgcHRCdGFtcENvbnRleHQgICAgICAgICAgIHBCdGFtcEN0eCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7IAorICAgIHRwQnRhbXBMb2dMaW5rQ3R4ICAgICAgICBwTG9nTGlua0NvbnRleHQ7CisgICAgV0xBTkJBUF84MDIzSGVhZGVyVHlwZSAgIHc4MDIzSGVhZGVyOworICAgIFdMQU5CQVBfSENJQUNMSGVhZGVyVHlwZSBoY2lBQ0xIZWFkZXI7CisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIGF1Y0xMQ0hlYWRlcltXTEFOQkFQX0xMQ19IRUFERVJfTEVOXTsKKyAgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzOworICAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y1NUQUlkOyAgLyogVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgKi8KKyAgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgcEhkZEhkbDsgLyogSGFuZGxlIHRvIHJldHVybiBCU0wgY29udGV4dCBpbiAqLworICAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICBoZWFkZXJMZW5ndGg7ICAvKiBUaGUgODAyLjMgZnJhbWUgbGVuZ3RoKi8KKyAgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgcHJvdG9UeXBlID0gV0xBTkJBUF9CVF9BTVBfVFlQRV9EQVRBOyAgLyogVGhlIHByb3RvY29sIHR5cGUgYnl0ZXMqLworICAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTYW5pdHkgY2hlY2sgcGFyYW1zCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggTlVMTCA9PSBwQnRhbXBDdHgpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIGhhbmRsZSB2YWx1ZSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLy8gSGVyZSwgSSBoYXZlIHRvIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGFuIAorICAgIC8vIEhDSSBBQ0wgRGF0YSBwYWNrZXQgdGhhdCBJIGFtIGJlaW5nIGhhbmRlZC4gCisgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wb3BfaGVhZCggdm9zRGF0YUJ1ZmYsICZoY2lBQ0xIZWFkZXIsIFdMQU5CQVBfSENJX0FDTF9IRUFERVJfTEVOKTsKKworICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIldMQU4gQkFQOiBGYWlsZWQgdG8gcG9wIEhDSSBBQ0wgaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyk7CisKKyAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgICB9CisKKyAgICAvLyBKRVowODEwMDM6IFJlbW92ZSB0aGlzIGFmdGVyIGRlYnVnZ2luZyAKKyAgICAvLyBTYW5pdHkgY2hlY2sgdGhlIHBoeV9saW5rX2hhbmRsZSB2YWx1ZSAKKworICAgIGlmICggcGh5X2xpbmtfaGFuZGxlICE9IGhjaUFDTEhlYWRlci5waHlMaW5rSGFuZGxlICkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gQkFQOiBwaHlfbGlua19oYW5kbGUgbWlzbWF0Y2ggaW4gJXMgcGh5X2xpbmtfaGFuZGxlPSVkIGhjaUFDTEhlYWRlci5waHlMaW5rSGFuZGxlPSVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBoeV9saW5rX2hhbmRsZSwgaGNpQUNMSGVhZGVyLnBoeUxpbmtIYW5kbGUpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgIH0KKworCisgICAgLyogTG9va3VwIHRoZSBTdGFJZCB1c2luZyB0aGUgcGh5X2xpbmtfaGFuZGxlIGFuZCB0aGUgQkFQIGNvbnRleHQgKi8gCisKKyAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX0dldFN0YUlkRnJvbUxpbmtDdHggKCAKKyAgICAgICAgICAgIGJ0YW1wSGFuZGxlLCAgLyogYnRhbXBIYW5kbGUgdmFsdWUgaW4gICovIAorICAgICAgICAgICAgcGh5X2xpbmtfaGFuZGxlLCAgLyogcGh5X2xpbmtfaGFuZGxlIHZhbHVlIGluICovCisgICAgICAgICAgICAmdWNTVEFJZCwgIC8qIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpICovCisgICAgICAgICAgICAmcEhkZEhkbCk7IC8qIEhhbmRsZSB0byByZXR1cm4gQlNMIGNvbnRleHQgKi8KKyAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZXRyaWV2ZSBTVEEgSWQgZnJvbSBCQVAgY29udGV4dCBhbmQgcGh5X2xpbmtfaGFuZGxlIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvLyBKRVowODEwMDM6IFJlbW92ZSB0aGlzIGFmdGVyIGRlYnVnZ2luZyAKKyAgICAvLyBTYW5pdHkgY2hlY2sgdGhlIGxvZ19saW5rX2hhbmRsZSB2YWx1ZSAKKyAgICBpZiAoIUJUQU1QX1ZBTElEX0xPR19MSU5LKCBoY2lBQ0xIZWFkZXIubG9nTGlua0hhbmRsZSkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICJXTEFOIEJBUDogSW52YWxpZCBsb2dpY2FsIGxpbmsgaGFuZGxlICglZCkgaW4gJXMuIENvcnJlY3RlZC4iLCAKKyAgICAgICAgICAgICAgICBoY2lBQ0xIZWFkZXIubG9nTGlua0hhbmRsZSwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIC8vIEpFWjA5MDEyMzogSW5zdXJlIHRoYXQgdGhlIGxvZ2ljYWwgbGluayB2YWx1ZSBpcyBnb29kCisgICAgICAgIGhjaUFDTEhlYWRlci5sb2dMaW5rSGFuZGxlID0gMTsKKyAgICAgICAgLy9yZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgIH0KKworICAgIC8qIFVzZSB0aGUgbG9nX2xpbmtfaGFuZGxlIHRvIHJldHJpZXZlIHRoZSBsb2dpY2FsIGxpbmsgY29udGV4dCAqLyAKKyAgICAvKiBKRVowODEwMDY6IGFic3RyYWN0IHRoaXMgd2l0aCBhIHByb2MuICBTbyB5b3UgY2FuIGNoYW5nZSB0aGUgaW1wbCBsYXRlciAqLyAKKyAgICBwTG9nTGlua0NvbnRleHQgPSAmKHBCdGFtcEN0eC0+YnRhbXBMb2dMaW5rQ3R4WyBoY2lBQ0xIZWFkZXIubG9nTGlua0hhbmRsZSBdKTsKKworICAgIC8vIEpFWjA4MTAwMzogUmVtb3ZlIHRoaXMgYWZ0ZXIgZGVidWdnaW5nIAorICAgIC8vIFNhbml0eSBjaGVjayB0aGUgbG9nX2xpbmtfaGFuZGxlIHZhbHVlIAorICAgIC8vIEpFWjA4MTExMzogSSBjaGFuZ2VkIHRoaXMgdG8gZmFpbCBvbiBhbiBVTk9DQ1VQSUVEIGVudHJ5IAorICAgIGlmICggcExvZ0xpbmtDb250ZXh0LT5wcmVzZW50ICE9IFZPU19UUlVFKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiV0xBTiBCQVA6IEludmFsaWQgbG9naWNhbCBsaW5rIGVudHJ5IGluICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBBQyBhbmQgTWV0YUluZm8KKworICAgIC8vIE5vdyBjb3B5IHRoZSBBQyB2YWx1ZXMgZnJvbSB0aGUgTG9naWNhbCBMaW5rIGNvbnRleHQKKyAgICAqcHVjQUMgPSBwTG9nTGlua0NvbnRleHQtPmJ0YW1wQUM7CisgICAgLy8gTm93IGNvcHkgdGhlIHZhbHVlcyBmcm9tIHRoZSBMb2dpY2FsIExpbmsgY29udGV4dCB0byB0aGUgTWV0YUluZm8gCisgICAgdGxNZXRhSW5mby0+dWNUSUQgPSBwTG9nTGlua0NvbnRleHQtPnVjVElEOworICAgIHRsTWV0YUluZm8tPnVjVVAgPSBwTG9nTGlua0NvbnRleHQtPnVjVVA7CisgICAgdGxNZXRhSW5mby0+dWNJc0VhcG9sID0gVk9TX0ZBTFNFOworICAgIHRsTWV0YUluZm8tPnVjRGlzYWJsZUZybVh0bCA9IFZPU19GQUxTRTsKKyAgICB0bE1ldGFJbmZvLT51Y0JjYXN0ID0gVk9TX0ZBTFNFOyAvKiBoY2lBQ0xIZWFkZXIuQkNGbGFnOyAqLyAvKiBEb24ndCBJIHdhbnQgdG8gdXNlIHRoZSBCQ0ZsYWc/ICovCisgICAgdGxNZXRhSW5mby0+dWNNY2FzdCA9IFZPU19GQUxTRTsKKyAgICB0bE1ldGFJbmZvLT51Y1R5cGUgPSAweDAwOyAgLyogV2hhdCBpcyB0aGlzIHJlYWxseSA/PyAqLworLy8gICAgdGxNZXRhSW5mby0+dXNUaW1lU3RhbXAgPSAweDAwOyAgLyogUmF2aSwgc2hvdWxkbid0IHlvdSBiZSBzZXR0aW5nIHRoaXM/ICBJdCdzIGluIHRoZSBWT1MgcGFja2V0LiAgKi8KKworICAgIC8vIEZvcm0gdGhlIDgwMi4zIGhlYWRlcgorCisgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHBCdGFtcEN0eC0+cGVlcl9tYWNfYWRkciwgVk9TX01BQ19BRERSX1NJWkUpOworICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCBwQnRhbXBDdHgtPnNlbGZfbWFjX2FkZHIsIFZPU19NQUNfQUREUl9TSVpFKTsKKyAgICAKKyAgICAvKiBOb3cgdGhpcyBsZW5ndGggcGFzc2VkIGRvd24gaW4gSENJLi4uaXMgaW4gbGl0dGxlLWVuZGlhbiAqLworICAgIGhlYWRlckxlbmd0aCA9IHZvc19sZTE2X3RvX2NwdShoY2lBQ0xIZWFkZXIuZGF0YUxlbmd0aCk7ICAKKyAgICBoZWFkZXJMZW5ndGggKz0gV0xBTkJBUF9MTENfSEVBREVSX0xFTjsgIAorICAgIC8qIE5vdyB0aGUgODAyLjMgbGVuZ3RoIGZpZWxkIGlzIGJpZy1lbmRpYW4/ISAqLworICAgIHc4MDIzSGVhZGVyLnVzTGVuVHlwZSA9IHZvc19jcHVfdG9fYmUxNihoZWFkZXJMZW5ndGgpOworCisgICAgLyogTm93IGFkanVzdCB0aGUgcHJvdG9jb2wgdHlwZSBieXRlcyovCisgICAgcHJvdG9UeXBlID0gdm9zX2NwdV90b19iZTE2KCBwcm90b1R5cGUpOworCisgICAgLyogTm93IGZvcm0gdGhlIExMQyBoZWFkZXIgKi8KKyAgICB2b3NfbWVtX2NvcHkoYXVjTExDSGVhZGVyLCAKKyAgICAgICAgICAgIFdMQU5CQVBfTExDX0hFQURFUiwgIAorICAgICAgICAgICAgc2l6ZW9mKFdMQU5CQVBfTExDX0hFQURFUikpOworICAgIHZvc19tZW1fY29weSgmYXVjTExDSGVhZGVyW1dMQU5CQVBfTExDX09VSV9PRkZTRVRdLCAKKyAgICAgICAgICAgIFdMQU5CQVBfQlRfQU1QX09VSSwgIAorICAgICAgICAgICAgV0xBTkJBUF9MTENfT1VJX1NJWkUpOworICAgIHZvc19tZW1fY29weSgmYXVjTExDSGVhZGVyW1dMQU5CQVBfTExDX1BST1RPX1RZUEVfT0ZGU0VUXSwgCisgICAgICAgICAgICAmcHJvdG9UeXBlLCAgLy9XTEFOQkFQX0JUX0FNUF9UWVBFX0RBVEEKKyAgICAgICAgICAgIFdMQU5CQVBfTExDX1BST1RPX1RZUEVfU0laRSk7CisgCisgICAgLyogUHVzaCBvbiB0aGUgTExDIGhlYWRlciAqLworICAgIHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCAKKyAgICAgICAgICAgIGF1Y0xMQ0hlYWRlciwgCisgICAgICAgICAgICBXTEFOQkFQX0xMQ19IRUFERVJfTEVOKTsgIAorCisgICAgLyogUHVzaCBvbiB0aGUgODAyLjMgaGVhZGVyICovCisgICAgdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsICZ3ODAyM0hlYWRlciwgc2l6ZW9mKHc4MDIzSGVhZGVyKSk7CisKKworICAgIC8qU2V0IHRoZSBsb2dpY2FsIGxpbmsgaGFuZGxlIGFzIHVzZXIgZGF0YSBzbyB0aGF0IHdlIGNhbiByZXRyaWV2ZSBpdCBvbiAKKyAgICAgIFR4IENvbXBsZXRlICovCisgICAgdmFsdWUgPSAodl9VMzJfdCloY2lBQ0xIZWFkZXIubG9nTGlua0hhbmRsZTsKKyAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfQkFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1ZPSURfdCAqKXZhbHVlKTsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LypXTEFOQkFQX1hsYXRlVHhEYXRhUGt0Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX0dldEFjRnJvbVR4RGF0YVBrdAorCisgIERFU0NSSVBUSU9OIAorCisgICAgSEREIHdpbGwgY2FsbCB0aGlzIEFQSSB3aGVuIGl0IGhhcyBhIEhDSSBEYXRhIFBhY2tldCAoU0tCKSBhbmQgaXQgd2FudHMgCisgICAgdG8gZmluZCBBQyB0eXBlIG9mIHRoZSBkYXRhIGZyYW1lIGZyb20gdGhlIEhDSSBoZWFkZXIgb24gdGhlIGRhdGEgcGt0CisgICAgLSB0byBiZSBzZW5kIHVzaW5nIFRMLgorCisKKyAgUEFSQU1FVEVSUyAKKworICAgIGJ0YW1wSGFuZGxlOiBUaGUgQlQtQU1QIFBBTCBoYW5kbGUgcmV0dXJuZWQgaW4gV0xBTkJBUF9HZXROZXdIbmRsLgorIAorICAgIHBIY2lEYXRhOiBQb2ludGVyIHRvIHRoZSBIQ0kgZGF0YSBmcmFtZQorIAorICAgIHB1Y0FDOiAgICAgICBQb2ludGVyIHRvIHJldHVybiB0aGUgYWNjZXNzIGNhdGVnb3J5IAorICAgCisgIFJFVFVSTiBWQUxVRQorCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZCAKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBCQVAgaGFuZGxlIGlzIE5VTEwgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOQkFQX0dldEFjRnJvbVR4RGF0YVBrdAorKCAKKyAgcHRCdGFtcEhhbmRsZSAgICAgYnRhbXBIYW5kbGUsICAvKiBVc2VkIGJ5IEJBUCB0byBpZGVudGlmeSB0aGUgYWN0dWFsIHNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVyZWZvcmUgYWRkcmVzc2VzICovCisgIHZvaWQgICAgICAgICAgICAgICpwSGNpRGF0YSwgICAgIC8qIFBvaW50ZXIgdG8gdGhlIEhDSSBkYXRhIGZyYW1lICovCisgIFdMQU5UTF9BQ0VudW1UeXBlICpwdWNBQyAgICAgICAgLyogUmV0dXJuIHRoZSBBQyBoZXJlICovCispCit7CisgICAgcHRCdGFtcENvbnRleHQgICAgICAgICAgIHBCdGFtcEN0eDsgCisgICAgdHBCdGFtcExvZ0xpbmtDdHggICAgICAgIHBMb2dMaW5rQ29udGV4dDsKKyAgICBXTEFOQkFQX0hDSUFDTEhlYWRlclR5cGUgaGNpQUNMSGVhZGVyOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNhbml0eSBjaGVjayBwYXJhbXMKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCggTlVMTCA9PSBidGFtcEhhbmRsZSkgfHwgKE5VTEwgPT0gcEhjaURhdGEpIHx8IChOVUxMID09IHB1Y0FDKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHBhcmFtcyBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgIHBCdGFtcEN0eCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisKKyAgICB2b3NfbWVtX2NvcHkoICZoY2lBQ0xIZWFkZXIsIHBIY2lEYXRhLCBXTEFOQkFQX0hDSV9BQ0xfSEVBREVSX0xFTik7CisgICAgLy8gU2FuaXR5IGNoZWNrIHRoZSBsb2dfbGlua19oYW5kbGUgdmFsdWUgCisgICAgaWYgKCFCVEFNUF9WQUxJRF9MT0dfTElOSyggaGNpQUNMSGVhZGVyLmxvZ0xpbmtIYW5kbGUpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiV0xBTiBCQVA6IEludmFsaWQgbG9naWNhbCBsaW5rIGhhbmRsZSAoJWQpIGluICVzIiwgCisgICAgICAgICAgICAgICAgaGNpQUNMSGVhZGVyLmxvZ0xpbmtIYW5kbGUsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgIH0KKworICAgIC8qIFVzZSB0aGUgbG9nX2xpbmtfaGFuZGxlIHRvIHJldHJpZXZlIHRoZSBsb2dpY2FsIGxpbmsgY29udGV4dCAqLyAKKyAgICAvKiBKRVowODEwMDY6IGFic3RyYWN0IHRoaXMgd2l0aCBhIHByb2MuICBTbyB5b3UgY2FuIGNoYW5nZSB0aGUgaW1wbCBsYXRlciAqLyAKKyAgICBwTG9nTGlua0NvbnRleHQgPSAmKHBCdGFtcEN0eC0+YnRhbXBMb2dMaW5rQ3R4WyBoY2lBQ0xIZWFkZXIubG9nTGlua0hhbmRsZSBdKTsKKworICAgIC8vIFNhbml0eSBjaGVjayB0aGUgbG9nX2xpbmtfaGFuZGxlIHZhbHVlIAorICAgIC8vIEpFWjA4MTExMzogSSBjaGFuZ2VkIHRoaXMgdG8gZmFpbCBvbiBhbiBVTk9DQ1VQSUVEIGVudHJ5IAorICAgIGlmICggcExvZ0xpbmtDb250ZXh0LT5wcmVzZW50ICE9IFZPU19UUlVFKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiV0xBTiBCQVA6IEludmFsaWQgbG9naWNhbCBsaW5rIGVudHJ5IGluICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBBQworCisgICAgLy8gTm93IGNvcHkgdGhlIEFDIHZhbHVlcyBmcm9tIHRoZSBMb2dpY2FsIExpbmsgY29udGV4dAorICAgICpwdWNBQyA9IHBMb2dMaW5rQ29udGV4dC0+YnRhbXBBQzsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9YbGF0ZVJ4RGF0YVBrdAorCisgIERFU0NSSVBUSU9OIAorCisgICAgSEREIHdpbGwgY2FsbCB0aGlzIEFQSSB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIDgwMi4zIChUTC9VTUEgaGFzIAorICAgIFhsYXRlZCBmcm9tIDgwMi4xMSkgZnJhbWUgZnJvbSBUTCBhbmQgaXQgd2FudHMgdG8gZm9ybSBhIAorICAgIEJUIEhDSSBEYXRhIFBhY2tldCAtIHJlYWR5IHRvIHNpZ25hbCB1cCB0byB0aGUgQlQgc3RhY2sgYXBwbGljYXRpb24uCisKKworICBQQVJBTUVURVJTIAorCisgICAgYnRhbXBIYW5kbGU6IFRoZSBCVC1BTVAgUEFMIGhhbmRsZSByZXR1cm5lZCBpbiBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcHVjQUM6ICAgICAgIFBvaW50ZXIgdG8gcmV0dXJuIHRoZSBhY2Nlc3MgY2F0ZWdvcnkgCisgICAgdm9zRGF0YUJ1ZmY6IFRoZSBkYXRhIGJ1ZmZlciBjb250YWluaW5nIHRoZSA4MDIuMyBmcmFtZSB0byBiZSAKKyAgICAgICAgICAgICAgICAgdHJhbnNsYXRlZCB0byBCVCBIQ0kgRGF0YSBQYWNrZXQKKyAgIAorICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgQkFQIGhhbmRsZSBpcyBOVUxMICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTkJBUF9YbGF0ZVJ4RGF0YVBrdAorKCAKKyAgcHRCdGFtcEhhbmRsZSAgICAgYnRhbXBIYW5kbGUsIAorICB2X1U4X3QgICAgICAgICAgICBwaHlfbGlua19oYW5kbGUsICAvKiBVc2VkIGJ5IEJBUCB0byBpbmRlbnRpZnkgdGhlIFdMQU4gYXNzb2MuIChTdGFJZCkgKi8KKyAgV0xBTlRMX0FDRW51bVR5cGUgICpwdWNBQywgICAgICAgIC8qIFJldHVybiB0aGUgQUMgaGVyZS4gSSBkb24ndCB0aGluayB0aGlzIGlzIG5lZWRlZCAqLworICB2b3NfcGt0X3QgICAgICAgICp2b3NEYXRhQnVmZgorKQoreworICAgIFdMQU5CQVBfODAyM0hlYWRlclR5cGUgIHc4MDIzSGVhZGVyOworICAgIFdMQU5CQVBfSENJQUNMSGVhZGVyVHlwZSBoY2lBQ0xIZWFkZXI7CisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIGF1Y0xMQ0hlYWRlcltXTEFOQkFQX0xMQ19IRUFERVJfTEVOXTsKKyAgICBwdEJ0YW1wQ29udGV4dCAgICAgICAgICAgcEJ0YW1wQ3R4ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsgCisgICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgIHZvc1N0YXR1czsKKyAgICAvL3ZfUFZPSURfdCAgICAgICAgICAgICAgICBwSGRkSGRsOyAvKiBIYW5kbGUgdG8gcmV0dXJuIEJTTCBjb250ZXh0IGluICovCisgICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIGhjaURhdGFMZW5ndGg7ICAvKiBUaGUgSENJIHBhY2tldCBkYXRhIGxlbmd0aCovCisgICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHByb3RvVHlwZSA9IFdMQU5CQVBfQlRfQU1QX1RZUEVfREFUQTsgIC8qIFRoZSBwcm90b2NvbCB0eXBlIGJ5dGVzKi8KKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNhbml0eSBjaGVjayBwYXJhbXMKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBOVUxMID09IHBCdGFtcEN0eCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBCQVAgaGFuZGxlIHZhbHVlIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvLyBIZXJlLCBJIGhhdmUgdG8gbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYW4gCisgICAgLy8gODAyLjMgaGVhZGVyIGZvbGxvd2VkIGJ5IGFuIExMQy9TTkFQIHBhY2tldC4gCisgICAgdm9zX21lbV9zZXQoICZ3ODAyM0hlYWRlciwgc2l6ZW9mKHc4MDIzSGVhZGVyKSwgMCApOworICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCAmdzgwMjNIZWFkZXIsIHNpemVvZih3ODAyM0hlYWRlcikpOworCisgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiV0xBTiBCQVA6IEZhaWxlZCB0byBwb3AgODAyLjMgaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyk7CisKKyAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgICB9CisKKyAgICAvLyBIZXJlLCBpcyB0aGF0IExMQy9TTkFQIGhlYWRlci4gCisgICAgLy8gV2l0aCB0aGUgQlQgU0lHIE9VSSB0aGF0IEkgYW0gYmVpbmcgaGFuZGVkLiAKKyAgICB2b3NfbWVtX3NldCggYXVjTExDSGVhZGVyLCBXTEFOQkFQX0xMQ19IRUFERVJfTEVOLCAwICk7CisgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wb3BfaGVhZCggdm9zRGF0YUJ1ZmYsIGF1Y0xMQ0hlYWRlciwgV0xBTkJBUF9MTENfSEVBREVSX0xFTik7CisKKyAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJXTEFOIEJBUDogRmFpbGVkIHRvIHBvcCBMTEMvU05BUCBoZWFkZXIgZnJvbSBwYWNrZXQgJWQiLAorICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKTsKKworICAgICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgIH0KKworI2lmZGVmIEJBUF9ERUJVRworICAgIC8vIEpFWjA4MTAwMzogUmVtb3ZlIHRoaXMgYWZ0ZXIgZGVidWdnaW5nIAorICAgIC8vIFNob3VsZCBJIGRvdWJsZSBjaGVjayB0aGF0IEkgYW0gZ2V0dGluZyB0aGUgQlQgU0lHIE9VSSA/CisgICAgaWYgKCAhKHZvc19tZW1fY29tcGFyZSggYXVjTExDSGVhZGVyLCAKKyAgICAgICAgICAgICBXTEFOQkFQX0xMQ19IRUFERVIsICAKKyAgICAgICAgICAgICBzaXplb2YoV0xBTkJBUF9MTENfSEVBREVSKSAgCisgICAgICAgICAgICAgLSBXTEFOQkFQX0xMQ19PVUlfU0laRSkgIC8qIERvbid0IGNoZWNrIHRoZSBsYXN0IHRocmVlIGJ5dGVzIGhlcmUgKi8gCisgICAgICAgICAmJiB2b3NfbWVtX2NvbXBhcmUoICZhdWNMTENIZWFkZXJbV0xBTkJBUF9MTENfT1VJX09GRlNFVF0sIAorICAgICAgICAgICAgICh2X1ZPSURfdCopV0xBTkJBUF9CVF9BTVBfT1VJLCAgCisgICAgICAgICAgICAgV0xBTkJBUF9MTENfT1VJX1NJWkUpKSkgIC8qIGNoZWNrIHRoZW0gaGVyZSAqLyAKKyAgICB7CisKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgTExDIGhlYWRlciBmb3IgQlQtQU1QIHBhY2tldCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorI2VuZGlmIC8vQkFQX0RFQlVHCisKKyAgICAvKiBOb3cgYWRqdXN0IHRoZSBwcm90b2NvbCB0eXBlIGJ5dGVzKi8KKyAgICBwcm90b1R5cGUgPSB2b3NfY3B1X3RvX2JlMTYoIHByb3RvVHlwZSk7CisgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBhIGRhdGEgZnJhbWUgb3Igb3RoZXIsIGludGVybmFsIHRvIEJBUCwgdHlwZS4uLgorICAgIC8vIHdlIGFyZSBvbmx5IGhhbmRsaW5nIGRhdGEgZnJhbWVzIGluIGhlcmUuLi4KKyAgICAvLyBUaGUgb3RoZXJzIChTZWN1cml0eSBhbmQgQVIpIGFyZSBoYW5kbGVkIGJ5IFRMcyBCQVAgY2xpZW50IEFQSS4gCisgICAgLy8gKFZlcmlmeSB3aXRoIFRMKQorICAgIGlmICggISh2b3NfbWVtX2NvbXBhcmUoICZhdWNMTENIZWFkZXJbV0xBTkJBUF9MTENfUFJPVE9fVFlQRV9PRkZTRVRdLCAKKyAgICAgICAgICAgICZwcm90b1R5cGUsICAvL1dMQU5CQVBfQlRfQU1QX1RZUEVfREFUQQorICAgICAgICAgICAgV0xBTkJBUF9MTENfUFJPVE9fVFlQRV9TSVpFKSkpIAorICAgIHsKKworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCAobm9uLWRhdGEpIGZyYW1lIHR5cGUgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworI2lmZGVmIEJBUF9ERUJVRworICAgIC8vIEpFWjA4MTAwMzogUmVtb3ZlIHRoaXMgYWZ0ZXIgZGVidWdnaW5nIAorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNhbml0eSBjaGVjayB0aGUgTUFDIGFkZHJlc3MgaW4gdGhlIHBoeXNpY2FsIGxpbmsgY29udGV4dCAKKyAgICAgICAgYWdhaW5zdCB0aGUgdmFsdWUgaW4gdGhlIGluY29taW5nIFJ4IEZyYW1lLgorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoICEodm9zX21lbV9jb21wYXJlKCB3ODAyM0hlYWRlci52REEsIHBCdGFtcEN0eC0+c2VsZl9tYWNfYWRkciwgVk9TX01BQ19BRERSX1NJWkUpCisgICAgJiYgdm9zX21lbV9jb21wYXJlKCB3ODAyM0hlYWRlci52U0EsIHBCdGFtcEN0eC0+cGVlcl9tYWNfYWRkciwgVk9TX01BQ19BRERSX1NJWkUpKSkgCisgICAgeworCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJNQUMgYWRkcmVzcyBtaXNtYXRjaCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorI2VuZGlmIC8vQkFQX0RFQlVHCisKKyAgICAvKiBObyBsb29rdXAgaXMgbmVlZGVkLiAgQmVjYXVzZSBUTCBoYXMgYWxyZWFkeSB0b2xkIFdMQU5CQVBfU1RBUnhDQiAKKyAgICAgKiB0aGUgU3RhSWQuICBBbmQgSSB0b2xkIFdMQU5CQVBfU1RBUnhDQlR5cGUgdGhlIGNvcnJlc3BvbmRpbmcgQlNMIGNvbnRleHQgCisgICAgICogV2hpY2ggaGUgdXNlZCB0byBsb29rdXAgdGhlIHBoeV9saW5rX2hhbmRsZSB2YWx1ZS4gCisgICAgICovIAorCisKKyAgICAvLyBTdGFydCBmaWxsaW5nIGluIHRoZSBIQ0kgaGVhZGVyIAorICAgIGhjaUFDTEhlYWRlci5waHlMaW5rSGFuZGxlID0gcGh5X2xpbmtfaGFuZGxlOworCisgICAgLy8gQ29udGludWUgZmlsbGluZyBpbiB0aGUgSENJIGhlYWRlciAKKyAgICAvL0pFWjEwMDkxMzogT24gUnggdGhlIExvZ2ljYWwgTGluayBpcyBBTFdBWVMgMC4gU2VlIFZvbCAyLCBTZWMgRSwgNS40LjIgb2Ygc3BlYy4KKyAgICBoY2lBQ0xIZWFkZXIubG9nTGlua0hhbmRsZSA9IDA7CisgICAgaGNpQUNMSGVhZGVyLlBCRmxhZyA9IFdMQU5CQVBfSENJX1BLVF9BTVA7CisgICAgaGNpQUNMSGVhZGVyLkJDRmxhZyA9IDA7CisKKyAgICAvKiBOb3cgdGhlIGxlbmd0aCBmaWVsZCBpcyBiaWctZW5kaWFuPyEgKi8KKyAgICBoY2lEYXRhTGVuZ3RoID0gIHZvc19iZTE2X3RvX2NwdSh3ODAyM0hlYWRlci51c0xlblR5cGUpOworICAgIC8qIE1heCBsZW5ndGggV0xBTkJBUF9NQVhfODAyMTFfUEFMX1BEVV9TSVpFICgxNDkyKSAqLworICAgIGhjaURhdGFMZW5ndGggLT0gV0xBTkJBUF9MTENfSEVBREVSX0xFTjsKKyAgICAvKiBUaGUgSENJIHBhY2tldCBkYXRhIGxlbmd0aCBpcyBMaXR0bGUtZW5kaWFuICovCisgICAgaGNpQUNMSGVhZGVyLmRhdGFMZW5ndGggPSB2b3NfY3B1X3RvX2xlMTYoaGNpRGF0YUxlbmd0aCk7ICAKKworICAgIC8qIFJldHVybiB0aGUgQUMgaGVyZS4gCisgICAgICogKEkgY2FuJ3QgYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkgdG8gZmlndXJlIG91dCB3aGF0IGl0IGlzLikKKyAgICAgKi8KKyAgICAqcHVjQUMgPSAwOyAgICAgICAgCisKKyAgICAvKiBQdXNoIG9uIHRoZSBIQ0kgaGVhZGVyICovCisgICAgdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsICZoY2lBQ0xIZWFkZXIsIFdMQU5CQVBfSENJX0FDTF9IRUFERVJfTEVOKTsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5CQVBfWGxhdGVSeERhdGFQa3QgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9TVEFGZXRjaFBrdENCIAorCisgIERFU0NSSVBUSU9OICAgCisgICAgVGhlIGZldGNoIHBhY2tldCBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwuIAorICAgIAorICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgVEwgd2hlbiB0aGUgc2NoZWR1bGluZyBhbGdvcml0aG1zIGFsbG93cyBmb3IgCisgICAgdHJhbnNtaXNzaW9uIG9mIGFub3RoZXIgcGFja2V0IHRvIHRoZSBtb2R1bGUuIAorICAgIEl0IHdpbGwgYmUgY2FsbGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBCQUwgZmV0Y2ggdHJhbnNtaXQgcGFja2V0IAorICAgIGZ1bmN0aW9uLCBpbml0aWF0ZWQgYnkgdGhlIGJ1cyBsb3dlciBsYXllci4gCisKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSAKKyAgICAgICAgICAgICAgICAgICAgdG8gVEwncyBvciBIREQncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgCisgICAgICAgICAgICAgICAgICAgIGZyb20gaXRzIGNvbnRleHQgCisKKyAgICBJTi9PVVQKKyAgICBwdWNTVEFJZDogICAgICAgdGhlIElkIG9mIHRoZSBzdGF0aW9uIGZvciB3aGljaCBUTCBpcyByZXF1ZXN0aW5nIGEgCisgICAgICAgICAgICAgICAgICAgIHBhY2tldCwgaW4gY2FzZSBIREQgZG9lcyBub3QgbWFpbnRhaW4gcGVyIHN0YXRpb24gCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlcyBpdCBjYW4gZ2l2ZSB0aGUgbmV4dCBwYWNrZXQgaW4gaXRzIHF1ZXVlIAorICAgICAgICAgICAgICAgICAgICBhbmQgcHV0IGluIHRoZSByaWdodCB2YWx1ZSBmb3IgdGhlIAorICAgIHB1Y0FDOiAgICAgICAgICBhY2Nlc3MgY2F0ZWdvcnkgcmVxdWVzdGVkIGJ5IFRMLCBpZiBIREQgZG9lcyBub3QgaGF2ZSAKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0cyBvbiB0aGlzIEFDIGl0IGNhbiBjaG9vc2UgdG8gc2VydmljZSBhbm90aGVyIEFDIAorICAgICAgICAgICAgICAgICAgICBxdWV1ZSBpbiB0aGUgb3JkZXIgb2YgcHJpb3JpdHkKKworICAgIE9VVAorICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIFZPU1MgZGF0YSBidWZmZXIgdGhhdCB3YXMgdHJhbnNtaXR0ZWQgCisgICAgdGxNZXRhSW5mbzogICAgbWV0YSBpbmZvIHJlbGF0ZWQgdG8gdGhlIGRhdGEgZnJhbWUKKworCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9TVEFGZXRjaFBrdENCIAorKCAKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QqICAgICAgICAgICAgICAgcHVjU1RBSWQsCisgIHZfVThfdCAgICAgICAgICAgICAgICB1Y0FDLAorICB2b3NfcGt0X3QqKiAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCisgIFdMQU5UTF9NZXRhSW5mb1R5cGUqICB0bE1ldGFJbmZvCispCit7CisgICAgVk9TX1NUQVRVUyAgICB2b3NTdGF0dXM7IAorICAgIHB0QnRhbXBIYW5kbGUgYmFwSGRsOyAgLyogaG9sZHMgcHRCdGFtcEhhbmRsZSB2YWx1ZSByZXR1cm5lZCAgKi8gCisgICAgcHRCdGFtcENvbnRleHQgYmFwQ29udGV4dDsgLyogSG9sZHMgdGhlIGJ0YW1wQ29udGV4dCB2YWx1ZSByZXR1cm5lZCAqLyAKKyAgICB2X1BWT0lEX3QgICAgIHBIZGRIZGw7IC8qIEhhbmRsZSB0byByZXR1cm4gQlNMIGNvbnRleHQgaW4gKi8KKworICAgIC8qIExvb2t1cCB0aGUgQlNMIGFuZCBCQVAgY29udGV4dHMgdXNpbmcgdGhlIFN0YUlkICovIAorCisgICAgdm9zU3RhdHVzID0gV0xBTkJBUF9HZXRDdHhGcm9tU3RhSWQgKCAKKyAgICAgICAgICAgICpwdWNTVEFJZCwgIC8qIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpICovCisgICAgICAgICAgICAmYmFwSGRsLCAgLyogImhhbmRsZSIgdG8gcmV0dXJuIHB0QnRhbXBIYW5kbGUgdmFsdWUgaW4gICovIAorICAgICAgICAgICAgJmJhcENvbnRleHQsICAvKiAiaGFuZGxlIiB0byByZXR1cm4gcHRCdGFtcENvbnRleHQgdmFsdWUgaW4gICovIAorICAgICAgICAgICAgJnBIZGRIZGwpOyAvKiAiaGFuZGxlIiB0byByZXR1cm4gQlNMIGNvbnRleHQgaW4gKi8KKyAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSAKKyAgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldHJpZXZlIEJTTCBvciBCQVAgY29udGV4dCBmcm9tIFNUQSBJZCBpbiBXTEFOQkFQX1NUQUZldGNoUGt0Q0IiKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogSW52b2tlIHRoZSBjYWxsYmFjayB0aGF0IEJTTCByZWdpc3RlcmVkIHdpdGggbWUgKi8gCisgICAgdm9zU3RhdHVzID0gKCpiYXBDb250ZXh0LT5wZm5CdGFtcEZldGNoUGt0Q0IpKCAKKyAgICAgICAgICAgIHBIZGRIZGwsIAorICAgICAgICAgICAgKFdMQU5UTF9BQ0VudW1UeXBlKSAgIHVjQUMsIC8qIHR5cGVjYXN0IGl0IGZvciBub3cgKi8gCisgICAgICAgICAgICB2b3NEYXRhQnVmZiwgCisgICAgICAgICAgICB0bE1ldGFJbmZvKTsgICAgCisgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiQ2FsbGJhY2sgcmVnaXN0ZXJlZCBieSBCU0wgZmFpbGVkIHRvIGZldGNoIHBrdCBpbiBXTEFOTkJBUF9TVEFGZXRjaFBrdENCIik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30gLyogV0xBTkJBUF9TVEFGZXRjaFBrdENCICovIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1NUQVJ4Q0IKKworICBERVNDUklQVElPTiAgIAorICAgIFRoZSByZWNlaXZlIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCBUTC4gCisgICAgCisgICAgVEwgd2lsbCBjYWxsIHRoaXMgdG8gbm90aWZ5IHRoZSBjbGllbnQgd2hlbiBhIHBhY2tldCB3YXMgcmVjZWl2ZWQgCisgICAgZm9yIGEgcmVnaXN0ZXJlZCBTVEEuCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gCisgICAgICAgICAgICAgICAgICAgIFRMJ3Mgb3IgSEREJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gCisgICAgICAgICAgICAgICAgICAgIGl0cyBjb250ZXh0IAorICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIFZPU1MgZGF0YSBidWZmZXIgdGhhdCB3YXMgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgICAgKGl0IG1heSBiZSBhIGxpbmtlZCBsaXN0KSAKKyAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBpZAorICAgIHBSeE1ldGFJbmZvOiAgIG1ldGEgaW5mbyBmb3IgdGhlIHJlY2VpdmVkIHBhY2tldChzKSAKKyAgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9TVEFSeENCCisoIAorICB2X1BWT0lEX3QgICAgICAgICAgcHZvc0dDdHgsCisgIHZvc19wa3RfdCogICAgICAgICB2b3NEYXRhQnVmZiwKKyAgdl9VOF90ICAgICAgICAgICAgIHVjU1RBSWQsCisgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSogcFJ4TWV0YUluZm8KKykKK3sKKyAgICBWT1NfU1RBVFVTICAgIHZvc1N0YXR1czsgCisgICAgcHRCdGFtcEhhbmRsZSBiYXBIZGw7ICAvKiBob2xkcyBwdEJ0YW1wSGFuZGxlIHZhbHVlIHJldHVybmVkICAqLyAKKyAgICBwdEJ0YW1wQ29udGV4dCBiYXBDb250ZXh0OyAvKiBIb2xkcyB0aGUgYnRhbXBDb250ZXh0IHZhbHVlIHJldHVybmVkICovIAorICAgIHZfUFZPSURfdCAgICAgcEhkZEhkbDsgLyogSGFuZGxlIHRvIHJldHVybiBCU0wgY29udGV4dCBpbiAqLworICAgIHB0QnRhbXBIYW5kbGUgICAgICAgICAgICBidGFtcEhhbmRsZTsKKyAgICBXTEFOQkFQXzgwMjNIZWFkZXJUeXBlICAgdzgwMjNIZWFkZXI7CisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIGF1Y0xMQ0hlYWRlcltXTEFOQkFQX0xMQ19IRUFERVJfTEVOXTsKKyAgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgcHJvdG9UeXBlIDsKKyAgICB2X1NJWkVfdCAgICAgICAgICAgICAgICAgbGxjSGVhZGVyTGVuID0gV0xBTkJBUF9MTENfSEVBREVSX0xFTiA7CisgICAgCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIkluIFdMQU5CQVBfU1RBUnhDQiIpOworCisgICAgLyogTG9va3VwIHRoZSBCU0wgYW5kIEJBUCBjb250ZXh0cyB1c2luZyB0aGUgU3RhSWQgKi8gCisKKyAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX0dldEN0eEZyb21TdGFJZCAoIAorICAgICAgICAgICAgdWNTVEFJZCwgIC8qIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpICovCisgICAgICAgICAgICAmYmFwSGRsLCAgLyogImhhbmRsZSIgdG8gcmV0dXJuIHB0QnRhbXBIYW5kbGUgdmFsdWUgaW4gICovIAorICAgICAgICAgICAgJmJhcENvbnRleHQsICAvKiAiaGFuZGxlIiB0byByZXR1cm4gcHRCdGFtcENvbnRleHQgdmFsdWUgaW4gICovIAorICAgICAgICAgICAgJnBIZGRIZGwpOyAvKiAiaGFuZGxlIiB0byByZXR1cm4gQlNMIGNvbnRleHQgaW4gKi8KKyAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSAKKyAgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldHJpZXZlIEJTTCBvciBCQVAgY29udGV4dCBmcm9tIFNUQSBJZCBpbiBXTEFOQkFQX1NUQVJ4Q0IiKTsKKyAgICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKworICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NEYXRhQnVmZiwgc2l6ZW9mKHc4MDIzSGVhZGVyKSwgKHZfVk9JRF90ICopYXVjTExDSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGxjSGVhZGVyTGVuKTsKKworICAgIGlmICggTlVMTCA9PSBhdWNMTENIZWFkZXIvKkxMQyBIZWFkZXIqLyApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldMQU5CQVBfU1RBUnhDQjpDYW5ub3QgZXh0cmFjdCBMTEMgaGVhZGVyIik7CisgICAgICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgIAorICAgIHZvc19tZW1fY29weSgmcHJvdG9UeXBlLCZhdWNMTENIZWFkZXJbV0xBTkJBUF9MTENfUFJPVE9fVFlQRV9PRkZTRVRdLFdMQU5CQVBfTExDX1BST1RPX1RZUEVfU0laRSk7CisgICAgcHJvdG9UeXBlID0gdm9zX2JlMTZfdG9fY3B1KHByb3RvVHlwZSk7CisgICAgCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IHJlY2VpdmVkIDogJWQsID0+IEJBUCIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICBwcm90b1R5cGUpOworICAgIAorICAgIGlmKFdMQU5CQVBfQlRfQU1QX1RZUEVfREFUQSA9PSBwcm90b1R5cGUpCisgICAgeworICAgICAgICBpZiAoYmFwQ29udGV4dC0+YmFwTGlua1N1cGVydmlzaW9uVGltZXJJbnRlcnZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVzZXQgTGluayBTdXBlcnZpc2lvbiB0aW1lciAqLworICAgICAgICAgICAgLy92b3NTdGF0dXMgPSBXTEFOQkFQX1N0b3BMaW5rU3VwZXJ2aXNpb25UaW1lcihiYXBDb250ZXh0KTsgCisgICAgICAgICAgICAvL3Zvc1N0YXR1cyA9IFdMQU5CQVBfU3RhcnRMaW5rU3VwZXJ2aXNpb25UaW1lcihiYXBDb250ZXh0LDcwMDApOworICAgICAgICAgICAgYmFwQ29udGV4dC0+ZGF0YVBrdFBlbmRpbmcgPSBWT1NfVFJVRTsvL0luZGljYXRpb24gZm9yIExpbmtTdXBlcnZpc2lvbiBtb2R1bGUgdGhhdCBkYXRhIGlzIHBlbmRpbmcgCisgICAgICAgICAgICAvKiBJbnZva2UgdGhlIGNhbGxiYWNrIHRoYXQgQlNMIHJlZ2lzdGVyZWQgd2l0aCBtZSAqLyAKKyAgICAgICAgICAgIHZvc1N0YXR1cyA9ICgqYmFwQ29udGV4dC0+cGZuQnRhbXBfU1RBUnhDQikoIAorICAgICAgICAgICAgICAgIHBIZGRIZGwsCisgICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCisgICAgICAgICAgICAgICAgcFJ4TWV0YUluZm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICAiV0xBTkJBUF9TVEFSeENCOmJhcExpbmtTdXBlcnZpc2lvblRpbWVySW50ZXJ2YWwgaXMgMCIpOworICAgICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KKyAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpbmsgU3VwZXJ2aXNpb24gcGFja2V0IHJlY2VpdmVkIG92ZXIgVEw6ICVkLCA9PiBCQVAiLAorICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLHByb3RvVHlwZSk7CisgICAgICAgICAgYnRhbXBIYW5kbGUgPSAocHRCdGFtcEhhbmRsZSliYXBDb250ZXh0OyAKKyAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX1J4UHJvY0xzUGt0KAorICAgICAgICAgICAgICAgICAgICAgICAgYnRhbXBIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBiYXBDb250ZXh0LT5waHlfbGlua19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b3NEYXRhQnVmZgorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9ICAKKworICAgIHJldHVybiB2b3NTdGF0dXM7Cit9IC8qIFdMQU5CQVBfU1RBUnhDQiAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfVHhDb21wQ0IKKworICBERVNDUklQVElPTiAgIAorICAgIFRoZSB0eCBjb21wbGV0ZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwuIAorICAgIAorICAgIFRMIHdpbGwgY2FsbCB0aGlzIHRvIG5vdGlmeSB0aGUgY2xpZW50IHdoZW4gYSB0cmFuc21pc3Npb24gZm9yIGEgCisgICAgcGFja2V0ICBoYXMgZW5kZWQuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIAorICAgICAgICAgICAgICAgICAgICBUTC9IQUwvUEUvQkFQL0hERCBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSAKKyAgICAgICAgICAgICAgICAgICAgaXRzIGNvbnRleHQgCisgICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgVk9TUyBkYXRhIGJ1ZmZlciB0aGF0IHdhcyB0cmFuc21pdHRlZCAKKyAgICB3VHhTVEF0dXM6ICAgICAgc3RhdHVzIG9mIHRoZSB0cmFuc21pc3Npb24gCisKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX1R4Q29tcENCCisoIAorICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKKyAgdm9zX3BrdF90KiAgICAgdm9zRGF0YUJ1ZmYsCisgIFZPU19TVEFUVVMgICAgIHdUeFNUQXR1cyAKKykKK3sKKyAgICBWT1NfU1RBVFVTICAgIHZvc1N0YXR1czsgCisgICAgcHRCdGFtcEhhbmRsZSBiYXBIZGw7ICAvKiBob2xkcyBwdEJ0YW1wSGFuZGxlIHZhbHVlIHJldHVybmVkICAqLyAKKyAgICBwdEJ0YW1wQ29udGV4dCBiYXBDb250ZXh0OyAvKiBIb2xkcyB0aGUgYnRhbXBDb250ZXh0IHZhbHVlIHJldHVybmVkICovIAorICAgIHZfUFZPSURfdCAgICAgcEhkZEhkbDsgLyogSGFuZGxlIHRvIHJldHVybiBCU0wgY29udGV4dCBpbiAqLworICAgIHZfUFZPSURfdCAgICAgIHB2bG9nTGlua0hhbmRsZSA9IE5VTEw7CisgICAgdl9VMzJfdCAgICAgICB2YWx1ZTsKKworICAgIFdMQU5CQVBfSENJQUNMSGVhZGVyVHlwZSBoY2lBQ0xIZWFkZXI7CisKKyAgICAvKiByZXRyaWV2ZSB0aGUgQlNMIGFuZCBCQVAgY29udGV4dHMgKi8gCisKKyAgICAvKiBJIGRvbid0IHJlYWxseSBrbm93IGhvdyB0byBkbyB0aGlzIC0gaW4gdGhlIGdlbmVyYWwgY2FzZS4gKi8KKyAgICAvKiBTbywgZm9yIG5vdywgSSB3aWxsIGp1c3QgdXNlIHNvbWV0aGluZyB0aGF0IHdvcmtzLiAqLworICAgIC8qIChJbiBnZW5lcmFsLCBJIHdpbGwgaGF2ZSB0byBrZWVwIGEgbGlzdCBvZiB0aGUgb3V0c3RhbmRpbmcgdHJhbnNtaXQgKi8KKyAgICAvKiBidWZmZXJzLCBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hpY2ggYXNzb2MgdGhleSBhcmUgd2l0aC4pICovCisgICAgLy92b3NTdGF0dXMgPSBXTEFOQkFQX0dldEN0eEZyb21TdGFJZCAoIAorICAgIC8vICAgICAgICB1Y1NUQUlkLCAgLyogVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgKi8KKyAgICAvLyAgICAgICAgJmJhcEhkbCwgIC8qICJoYW5kbGUiIHRvIHJldHVybiBwdEJ0YW1wSGFuZGxlIHZhbHVlIGluICAqLyAKKyAgICAvLyAgICAgICAgJmJhcENvbnRleHQsICAvKiAiaGFuZGxlIiB0byByZXR1cm4gcHRCdGFtcENvbnRleHQgdmFsdWUgaW4gICovIAorICAgIC8vICAgICAgICAmcEhkZEhkbCk7IC8qICJoYW5kbGUiIHRvIHJldHVybiBCU0wgY29udGV4dCBpbiAqLworICAgIC8qIFRlbXBvcmFyaWx5IHdlIGRvIHRoZSBmb2xsb3dpbmcqLyAKKyAgICAvL2JhcEhkbCA9ICZidGFtcEN0eDsKKyAgICBiYXBIZGwgPSAodl9QVk9JRF90KWdwQnRhbXBDdHg7CisgICAgLyogVHlwZWNhc3QgdGhlIGhhbmRsZSBpbnRvIGEgY29udGV4dC4gV29ya3MgYXMgd2UgaGF2ZSBvbmx5IG9uZSBsaW5rKi8gCisgICAgYmFwQ29udGV4dCA9ICgocHRCdGFtcENvbnRleHQpIGJhcEhkbCk7ICAKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBTYW5pdHkgY2hlY2sgcGFyYW1zCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJJbnZhbGlkIHZvc0RhdGFCdWZmIHZhbHVlIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICBpZiAoIE5VTEwgPT0gYmFwQ29udGV4dCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIkludmFsaWQgYmFwQ29udGV4dCB2YWx1ZSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggdm9zRGF0YUJ1ZmYgKTsgCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgcEhkZEhkbCA9IGJhcENvbnRleHQtPnBIZGRIZGw7CisgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIAorICAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmV0cmlldmUgQlNMIG9yIEJBUCBjb250ZXh0IGZyb20gU1RBIElkIGluIFdMQU5CQVBfVHhDb21wQ0IiKTsKKyAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggdm9zRGF0YUJ1ZmYgKTsgCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qR2V0IHRoZSBsb2dpY2FsIGxpbmsgaGFuZGxlIGZyb20gdGhlIHZvcyB1c2VyIGRhdGEqLworICAgIHZvc19wa3RfZ2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9CQVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB2bG9nTGlua0hhbmRsZSk7CisKKyAgICB2YWx1ZSA9ICh2X1UzMl90KXB2bG9nTGlua0hhbmRsZTsKKyAgICBoY2lBQ0xIZWFkZXIubG9nTGlua0hhbmRsZSA9IHZhbHVlOworCisjaWZkZWYgQkFQX0RFQlVHCisgICAgLyogVHJhY2UgdGhlIGJhcENvbnRleHQgcmVmZXJlbmNlZC4gKi8KKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAiV0xBTiBCQVAgQ29udGV4dCBNb25pdG9yOiBiYXBDb250ZXh0IHZhbHVlID0gJXAgaW4gJXM6JWQuIHZvc0RhdGFCdWZmPSVwIiwgYmFwQ29udGV4dCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgdm9zRGF0YUJ1ZmYgKTsKKyNlbmRpZiAvL0JBUF9ERUJVRworCisgICAgLy8gU2FuaXR5IGNoZWNrIHRoZSBsb2dfbGlua19oYW5kbGUgdmFsdWUgCisvLyBKRVoxMDA3MjI6IFRlbXBvcmFyeSBjaGFuZ2VzLgorICAgIGlmIChCVEFNUF9WQUxJRF9MT0dfTElOSyggaGNpQUNMSGVhZGVyLmxvZ0xpbmtIYW5kbGUpKQorICAgIHsKKyAgICAgICB2b3NfYXRvbWljX2luY3JlbWVudF9VMzIoCisgICAgICAgICAgICZiYXBDb250ZXh0LT5idGFtcExvZ0xpbmtDdHhbaGNpQUNMSGVhZGVyLmxvZ0xpbmtIYW5kbGVdLnVUeFBrdENvbXBsZXRlZCk7CisvLyAgICAgICAgICAgJmJhcENvbnRleHQtPmJ0YW1wTG9nTGlua0N0eFswXS51VHhQa3RDb21wbGV0ZWQpOworLy8gICAgICAgdm9zX2F0b21pY19pbmNyZW1lbnRfVTMyKAorLy8gICAgICAgICAgICZiYXBDb250ZXh0LT5idGFtcExvZ0xpbmtDdHhbMV0udVR4UGt0Q29tcGxldGVkKTsKKyAgICB9IGVsc2UgCisgICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW4gJXM6JWQ6IEludmFsaWQgbG9naWNhbCBsaW5rIGhhbmRsZTogJWQiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBoY2lBQ0xIZWFkZXIubG9nTGlua0hhbmRsZSk7CisgICAgfQorCisgICAgLyogSW52b2tlIHRoZSBjYWxsYmFjayB0aGF0IEJTTCByZWdpc3RlcmVkIHdpdGggbWUgKi8gCisgICAgdm9zU3RhdHVzID0gKCpiYXBDb250ZXh0LT5wZm5CdGFtcFR4Q29tcENCKSggCisgICAgICAgICAgICBwSGRkSGRsLAorICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCisgICAgICAgICAgICB3VHhTVEF0dXMpOworCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30gLyogV0xBTkJBUF9UeENvbXBDQiAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9SZWdpc3RlckRhdGFQbGFuZQorCisgIERFU0NSSVBUSU9OIAorICAgIFRoZSBIREQgY2FsbHMgdGhpcyByb3V0aW5lIHRvIHJlZ2lzdGVyIHRoZSAiZGF0YSBwbGFuZSIgcm91dGluZXMKKyAgICBmb3IgVHgsIFJ4LCBhbmQgVHggY29tcGxldGUgd2l0aCBCVC1BTVAuICBGb3Igbm93LCB3aXRoIG9ubHkgb25lCisgICAgcGh5c2ljYWwgYXNzb2NpYXRpb24gc3VwcG9ydGVkIGF0IGEgdGltZSwgdGhpcyBDT1VMRCBiZSBjYWxsZWQgCisgICAgYnkgSEREIGF0IHRoZSBzYW1lIHRpbWUgYXMgV0xBTkJBUF9HZXROZXdIbmRsLiAgQnV0LCBpbiBnZW5lcmFsCisgICAgaXQgbmVlZHMgdG8gYmUgY2FsbGVkIHVwb24gZWFjaCBuZXcgcGh5c2ljYWwgbGluayBlc3RhYmxpc2htZW50LgorICAgIAorICAgIFRoaXMgcmVnaXN0cmF0aW9uIGlzIHJlYWxseSB0d28gcGFydC4gIFRoZSByb3V0aW5lcyB0aGVtc2VsdmVzIGFyZQorICAgIHJlZ2lzdGVyZWQgaGVyZS4gIEJ1dCwgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgQlNMIGNvbnRleHQgYW5kIHRoZQorICAgIGFjdHVhbCBwaHlzaWNhbCBsaW5rIHRha2VzIHBsYWNlIGR1cmluZyBXTEFOQkFQX1BoeXNpY2FsTGlua0NyZWF0ZS4gCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IFRoZSBCVC1BTVAgUEFMIGhhbmRsZSByZXR1cm5lZCBpbiBXTEFOQkFQX0dldE5ld0huZGwuCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBCQVAgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9SZWdpc3RlckRhdGFQbGFuZQorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwgIC8qIEJUQU1QIGNvbnRleHQgKi8gCisgIFdMQU5CQVBfU1RBRmV0Y2hQa3RDQlR5cGUgcGZuQnRhbXBGZXRjaFBrdENCLCAKKyAgV0xBTkJBUF9TVEFSeENCVHlwZSBwZm5CdGFtcF9TVEFSeENCLAorICBXTEFOQkFQX1R4Q29tcENCVHlwZSBwZm5CdGFtcFR4Q29tcENCLAorICAvLyBwaHlfbGlua19oYW5kbGUsIG9mIGNvdXJzZSwgZG9lc24ndCBjb21lIHVudGlsIG11Y2ggbGF0ZXIuICBBdCBQaHlzaWNhbCBMaW5rIGNyZWF0ZS4KKyAgdl9QVk9JRF90ICAgICAgcEhkZEhkbCAgIC8qIEJTTCBzcGVjaWZpYyBjb250ZXh0ICovCispCit7CisgICAgcHRCdGFtcENvbnRleHQgcEJ0YW1wQ3R4ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsgCisKKyAgCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFNhbml0eSBjaGVjayBwYXJhbXMKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIE5VTEwgPT0gcEJ0YW1wQ3R4KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJBUCBoYW5kbGUgdmFsdWUgaW4gV0xBTkJBUF9SZWdpc3RlckRhdGFQbGFuZSIpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8vIEluY2x1ZGUgdGhlIEhERCBCQVAgU2hpbSBMYXllciBjYWxsYmFja3MgZm9yIEZldGNoLCBUeENvbXAsIGFuZCBSeFBrdAorICAgIHBCdGFtcEN0eC0+cGZuQnRhbXBGZXRjaFBrdENCID0gcGZuQnRhbXBGZXRjaFBrdENCOyAKKyAgICBwQnRhbXBDdHgtPnBmbkJ0YW1wX1NUQVJ4Q0IgPSBwZm5CdGFtcF9TVEFSeENCOworICAgIHBCdGFtcEN0eC0+cGZuQnRhbXBUeENvbXBDQiA9IHBmbkJ0YW1wVHhDb21wQ0I7CisKKyAgICAvLyAoUmlnaHQgbm93LCB0aGVyZSBpcyBvbmx5IG9uZSkKKyAgICBwQnRhbXBDdHgtPnBIZGRIZGwgPSBwSGRkSGRsOworICAgIC8qIFNldCB0aGUgZGVmYXVsdCBkYXRhIHRyYW5zZmVyIG1vZGUgKi8gCisgICAgcEJ0YW1wQ3R4LT51Y0RhdGFUcmFmZmljTW9kZSA9IFdMQU5CQVBfRkxPV19DT05UUk9MX01PREVfQkxPQ0tfQkFTRUQ7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOQkFQX1JlZ2lzdGVyRGF0YVBsYW5lICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1NUQVBrdFBlbmRpbmcKKworICBERVNDUklQVElPTiAKKworICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgd2hlbiBhIHBhY2tldCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbiBpbiBpdHMgCisgICAgcXVldWVzLiBIREQgdXNlcyB0aGlzIGluc3RlYWQgb2YgV0xBTlRMX1NUQVBrdFBlbmRpbmcgYmVjYXVzZSBoZSBpcworICAgIG5vdCBhd2FyZSBvZiB0aGUgbWFwcGluZyBmcm9tIHNlc3Npb24gdG8gU1RBIElELgorCisgIERFUEVOREVOQ0lFUyAKKworICAgIEhERCBtdXN0IGhhdmUgY2FsbGVkIFdMQU5CQVBfR2V0TmV3SG5kbCBiZWZvcmUgY2FsbGluZyB0aGlzIEFQSS4KKworICBQQVJBTUVURVJTIAorCisgICAgYnRhbXBIYW5kbGU6IFRoZSBCVC1BTVAgUEFMIGhhbmRsZSByZXR1cm5lZCBpbiBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgICAgICAgICAgICAgIEJTTCBjYW4gb2J0YWluIHRoaXMgZnJvbSB0aGUgcGh5c2ljYWwgaGFuZGxlIHZhbHVlIGluIHRoZQorICAgICAgICAgICAgICAgICBkb3duZ29pbmcgSENJIERhdGEgUGFja2V0LiBIZSwgYWZ0ZXIgYWxsLCB3YXMgdGhlcmUKKyAgICAgICAgICAgICAgICAgd2hlbiB0aGUgUGh5c2ljYWxMaW5rIHdhcyBjcmVhdGVkLiBIZSBrbmV3IHRoZSBidGFtcEhhbmRsZSAKKyAgICAgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgYnkgV0xBTkJBUF9HZXROZXdIbmRsLiBIZSBrbm93cyBhcyB3ZWxsLCBoaXMKKyAgICAgICAgICAgICAgICAgb3duIHBIZGRIZGwgKHNlZSBuZXh0KS4KKyAgICBwaHlfbGlua19oYW5kbGU6IFVzZWQgYnkgQkFQIHRvIGluZGVudGlmeSB0aGUgV0xBTiBhc3NvYy4gKFN0YUlkKQorICAgIHVjQWM6ICAgICAgICBUaGUgYWNjZXNzIGNhdGVnb3J5IGZvciB0aGUgcGVuZGluZyBmcmFtZQorICAgCisgIFJFVFVSTiBWQUxVRQorCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZCAKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBCQVAgaGFuZGxlIGlzIE5VTEwgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOQkFQX1NUQVBrdFBlbmRpbmcgCisoIAorICBwdEJ0YW1wSGFuZGxlICBidGFtcEhhbmRsZSwgIC8qIFVzZWQgYnkgQkFQIHRvIGlkZW50aWZ5IHRoZSBhcHAgY29udGV4dCBhbmQgVk9TUyBjdHggKCE/KSAqLyAKKyAgdl9VOF90ICAgICAgICAgcGh5X2xpbmtfaGFuZGxlLCAgLyogVXNlZCBieSBCQVAgdG8gaW5kZW50aWZ5IHRoZSBXTEFOIGFzc29jLiAoU3RhSWQpICovCisgIFdMQU5UTF9BQ0VudW1UeXBlIHVjQWMgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhIFRMIHR5cGUgaW4gYmFwQXBpLmggKi8KKykKK3sKKyAgICBWT1NfU1RBVFVTICAgICB2b3NTdGF0dXM7IAorICAgIHB0QnRhbXBDb250ZXh0IHBCdGFtcEN0eCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7IAorICAgIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4OworICAgIHZfVThfdCAgICAgICAgIHVjU1RBSWQ7ICAvKiBUaGUgU3RhSWQgKHVzZWQgYnkgVEwsIFBFLCBhbmQgSEFMKSAqLworICAgIHZfUFZPSURfdCAgICAgIHBIZGRIZGw7IC8qIEhhbmRsZSB0byByZXR1cm4gQlNMIGNvbnRleHQgaW4gKi8KKworICAKKyNpZmRlZiBCQVBfREVCVUcKKyAgICAvKiBUcmFjZSB0aGUgdEJ0YW1wQ3R4IGJlaW5nIHBhc3NlZCBpbi4gKi8KKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAiV0xBTiBCQVAgQ29udGV4dCBNb25pdG9yOiBwQnRhbXBDdHggdmFsdWUgPSAlcCBpbiAlczolZCIsIHBCdGFtcEN0eCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyApOworI2VuZGlmIC8vQkFQX0RFQlVHCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgU2FuaXR5IGNoZWNrIHBhcmFtcworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggTlVMTCA9PSBwQnRhbXBDdHgpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJJbnZhbGlkIEJBUCBoYW5kbGUgdmFsdWUgaW4gV0xBTkJBUF9TVEFQa3RQZW5kaW5nIik7IAorICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8vIFJldHJpZXZlIHRoZSBWT1NTIGNvbnRleHQKKyAgICBwdm9zR0N0eCA9IHBCdGFtcEN0eC0+cHZvc0dDdHg7CisgCisgICAgLyogTG9va3VwIHRoZSBTdGFJZCB1c2luZyB0aGUgcGh5X2xpbmtfaGFuZGxlIGFuZCB0aGUgQkFQIGNvbnRleHQgKi8gCisKKyAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX0dldFN0YUlkRnJvbUxpbmtDdHggKCAKKyAgICAgICAgICAgIGJ0YW1wSGFuZGxlLCAgLyogYnRhbXBIYW5kbGUgdmFsdWUgaW4gICovIAorICAgICAgICAgICAgcGh5X2xpbmtfaGFuZGxlLCAgLyogcGh5X2xpbmtfaGFuZGxlIHZhbHVlIGluICovCisgICAgICAgICAgICAmdWNTVEFJZCwgIC8qIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpICovCisgICAgICAgICAgICAmcEhkZEhkbCk7IC8qIEhhbmRsZSB0byByZXR1cm4gQlNMIGNvbnRleHQgKi8KKyAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSAKKyAgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldHJpZXZlIFNUQSBJZCBmcm9tIEJBUCBjb250ZXh0IGFuZCBwaHlfbGlua19oYW5kbGUgaW4gV0xBTkJBUF9TVEFQa3RQZW5kaW5nIik7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworCisgICAgLy8gTGV0IFRMIGtub3cgd2UgaGF2ZSBhIHBhY2tldCB0byBzZW5kLi4uCisgICAgdm9zU3RhdHVzID0gV0xBTlRMX1NUQVBrdFBlbmRpbmcoIAorICAgICAgICAgICAgcHZvc0dDdHgsCisgICAgICAgICAgICB1Y1NUQUlkLAorICAgICAgICAgICAgdWNBYyk7CisgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVHg6IFBhY2tldCByZWplY3RlZCBieSBUTCBpbiBXTEFOQkFQX1NUQVBrdFBlbmRpbmciKTsKKyAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgICB9ICAgICAgICAgICAgCisgICAgcEJ0YW1wQ3R4LT5kYXRhUGt0UGVuZGluZyA9IFZPU19UUlVFOy8vSW5kaWNhdGlvbiBmb3IgTGlua1N1cGVydmlzaW9uIG1vZHVsZSB0aGF0IGRhdGEgaXMgcGVuZGluZyAKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOQkFQX1NUQVBrdFBlbmRpbmcgKi8gCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVnaXN0ZXJCQVBDYWxsYmFja3MoKSAKKworICBERVNDUklQVElPTiAKKyAgICBSZWdpc3RlciB0aGUgQkFQICJFdmVudCIgY2FsbGJhY2tzLgorICAgIFJldHVybiB0aGUgcGVyIGluc3RhbmNlIGhhbmRsZS4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBUaGUgQlQtQU1QIFBBTCBoYW5kbGUgcmV0dXJuZWQgaW4gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lFdmVudENCOiAgcG9pbnRlciB0byB0aGUgRXZlbnQgY2FsbGJhY2sKKyAgICBwQXBwSGRsOiAgVGhlIGNvbnRleHQgcGFzc2VkIGluIGJ5IGNhbGxlci4gKEkuRS4sIEJTTCBhcHAgc3BlY2lmaWMgY29udGV4dC4pCisKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lFdmVudENCIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlZ2lzdGVyQkFQQ2FsbGJhY2tzIAorKCAKKyAgcHRCdGFtcEhhbmRsZSAgICAgICAgICAgYnRhbXBIYW5kbGUsIC8qIEJTTCB1c2VzIG15IGhhbmRsZSB0byB0YWxrIHRvIG1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0J3MgbGlrZSBlYWNoIG9mIHVzIGlzIHVzaW5nIHRoZSBvdGhlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGd1eXMgcmVmZXJlbmNlIHdoZW4gaW52b2tpbmcgaGltLiAqLworICB0cFdMQU5fQkFQRXZlbnRDQiAgICAgICBwQmFwSENJRXZlbnRDQiwgLypJbXBsZW1lbnRzIHRoZSBjYWxsYmFjayBmb3IgQUxMIGFzeW5jaHJvbm91cyBldmVudHMuICovIAorICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwQXBwSGRsICAvLyBQZXItYXBwIEJTTCBjb250ZXh0CispCit7CisgICAgcHRCdGFtcENvbnRleHQgcEJ0YW1wQ3R4ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsgCisKKyAgCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFNhbml0eSBjaGVjayBwYXJhbXMKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIE5VTEwgPT0gcEJ0YW1wQ3R4KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJBUCBoYW5kbGUgdmFsdWUgaW4gV0xBTl9CQVBSZWdpc3RlckJBUENhbGxiYWNrcyIpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8vIFNhdmUgdGhlIEV2ZW50IGNhbGxiYWNrIAorICAgIHBCdGFtcEN0eC0+cEJhcEhDSUV2ZW50Q0IgPSBwQmFwSENJRXZlbnRDQjsgCisKKyAgICAvLyAoUmlnaHQgbm93LCB0aGVyZSBpcyBvbmx5IG9uZSkKKyAgICBwQnRhbXBDdHgtPnBBcHBIZGwgPSBwQXBwSGRsOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogV0xBTl9CQVBSZWdpc3RlckJBUENhbGxiYWNrcyAqLworCisKZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBBcGlEZWJ1Zy5jIGIvQ09SRS9CQVAvc3JjL2JhcEFwaURlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzMzRlMwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvQkFQL3NyYy9iYXBBcGlEZWJ1Zy5jCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIGIgYSBwIEEgcCBpIEQgZSBiIHUgZyAuIEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIE9WRVJWSUVXOgorICAKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBCQVAgbW9kdWxlcworICBEZWJ1ZyBmdW5jdGlvbnMuCisgIAorICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIE9OTFkgYnkgb3RoZXIgCisgIFdMQU4gbW9kdWxlcyAoSEREKSB0aGF0IHByb3Blcmx5IHJlZ2lzdGVyIHdpdGggdGhlIEJBUCBMYXllciBpbml0aWFsbHkuCisKKyAgREVQRU5ERU5DSUVTOiAKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4gCisgIAorICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAgJEhlYWRlcjogL2N5Z2RyaXZlL2UvQnVpbGRzL003MjAxSlNEQ0FBUEFENTIyNDBCL1dNL3BsYXRmb3JtL21zbTcyMDAvU3JjL0RyaXZlcnMvU0QvQ2xpZW50RHJpdmVycy9XTEFOL1FDVC9DT1JFL0JBUC9zcmMvYmFwQXBpRGVidWcuYyx2IDEuMiAyMDA4LzExLzEwIDIyOjM3OjU4IGp6bXVkYSBFeHAganptdWRhICQkRGF0ZVRpbWUkJEF1dGhvcjoganptdWRhICQKKworCisgIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwMDgtMDktMTUgICAgamV6ICAgICBDcmVhdGVkIG1vZHVsZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8jaW5jbHVkZSAid2xhbl9xY3RfdGwuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKworLyogQlQtQU1QIFBBTCBBUEkgaGVhZGVyIGZpbGUgKi8gCisjaW5jbHVkZSAiYmFwQXBpLmgiIAorI2luY2x1ZGUgImJhcEludGVybmFsLmgiIAorCisvLworLy8jZGVmaW5lIEJBUF9ERUJVRworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsaXplZCBGdW5jdGlvbiBEZWZpbml0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorRGVidWcgQ29tbWFuZHMKKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVhZExvb3BiYWNrTW9kZSgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIExvb3BiYWNrIE1vZGUgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJUmVhZExvb3BiYWNrTW9kZTogIHBvaW50ZXIgdG8gdGhlICJIQ0kgUmVhZCBMb29wYmFjayBNb2RlIi4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZExvb3BiYWNrTW9kZSBvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQmFwSENJTG9vcGJhY2tNb2RlIGlzIE5VTEwuCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlYWRMb29wYmFja01vZGUKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kICAqcEJhcEhDSVJlYWRMb29wYmFja01vZGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispCit7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFJlYWRMb29wYmFja01vZGUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBXcml0ZUxvb3BiYWNrTW9kZSgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBXcml0ZSBMb29wYmFjayBNb2RlIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSVdyaXRlTG9vcGJhY2tNb2RlOiAgcG9pbnRlciB0byB0aGUgIkhDSSBXcml0ZSBMb29wYmFjayBNb2RlIiBTdHJ1Y3R1cmUuCisgICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lXcml0ZUxvb3BiYWNrTW9kZSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBXcml0ZUxvb3BiYWNrTW9kZQorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kICAgKnBCYXBIQ0lXcml0ZUxvb3BiYWNrTW9kZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKykKK3sKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQV3JpdGVMb29wYmFja01vZGUgKi8KKworCisKKworCmRpZmYgLS1naXQgYS9DT1JFL0JBUC9zcmMvYmFwQXBpRXh0LmMgYi9DT1JFL0JBUC9zcmMvYmFwQXBpRXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExYmNhYgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvQkFQL3NyYy9iYXBBcGlFeHQuYwpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBiIGEgcCBBIHAgaSBFIHggdCAuIEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIE9WRVJWSUVXOgorICAKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlcworICByZXF1aXJlZCBieSB0aGUgV0xBTiBCQVAgbW9kdWxlLiAgSXQgaXMgY3VycmVudGx5IGEgdGVtcG9yYXJ5IAorICByZXNwb3NpdG9yeSBmb3IgQVBJIHJvdXRpbmVzIHdoaWNoIHNob3VsZCBiZSBmdXJuaXNoZWQgYnkgQ1NSCisgIG9yIFRMLCBidXQgYXJlbid0IHlldCBpbXBsZW1lbnRlZC4KKyAgCisgIFRoZSBmdW5jdGlvbnMgcHJvdmlkZSBieSB0aGlzIG1vZHVsZSBhcmUgY2FsbGVkIGJ5IHRoZSByZXN0IG9mIAorICB0aGUgQlQtQU1QIFBBTCBtb2R1bGUuCisKKyAgREVQRU5ERU5DSUVTOiAKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4gCisgIAorICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAgJEhlYWRlcjogL2N5Z2RyaXZlL2UvQnVpbGRzL003MjAxSlNEQ0FBUEFENTIyNDBCL1dNL3BsYXRmb3JtL21zbTcyMDAvU3JjL0RyaXZlcnMvU0QvQ2xpZW50RHJpdmVycy9XTEFOL1FDVC9DT1JFL0JBUC9zcmMvYmFwQXBpRXh0LmMsdiAxLjEgMjAwOC8xMS8yMSAyMDoyODoxOCBqem11ZGEgRXhwIGp6bXVkYSAkJERhdGVUaW1lJCRBdXRob3I6IGp6bXVkYSAkCisKKworICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMDA4LTEwLTIyICAgIGpleiAgICAgQ3JlYXRlZCBtb2R1bGUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vIEkgdGhpbmsgdGhpcyBwdWxscyBpbiBldmVyeXRoaW5nCisjaW5jbHVkZSAiYmFwQXBpRXh0LmgiCisKKy8vI2RlZmluZSBCQVBfREVCVUcKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHbG9iYWwgRGF0YSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEV4dGVybmFsIGRlY2xhcmF0aW9ucyBmb3IgZ2xvYmFsIGNvbnRleHQgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsaXplZCBGdW5jdGlvbiBEZWZpbml0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFV0aWxpdHkgRnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX0dldEN1cnJlbnRDaGFubmVsCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2xlYXIgb3V0IGFsbCBmaWVsZHMgaW4gdGhlIEJBUCBjb250ZXh0LgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBCdGFtcEN0eDogICBwb2ludGVyIHRvIHRoZSBCQVAgY29udHJvbCBibG9jaworICAgIGNoYW5uZWw6ICAgICBjdXJyZW50IGNvbmZpZ3VyZWQgY2hhbm5lbCBudW1iZXIuCisgICAgYWN0aXZlRmxhZzogIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZXJlIGlzIGFuIGFjdGl2ZSBsaW5rLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcmV0dXJuIGNoYW5uZWwgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9HZXRDdXJyZW50Q2hhbm5lbAorKCAKKyAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCwKKyAgdl9VMzJfdCAqY2hhbm5lbCwgLy8gcmV0dXJuIGN1cnJlbnQgY2hhbm5lbCBoZXJlCisgIHZfVTMyX3QgKmFjdGl2ZUZsYWcgICAvLyByZXR1cm4gYWN0aXZlIGZsYWcgaGVyZQorKQoreworICAvL3ZfVTMyX3QgY2JfZW5hYmxlZDsKKyAgdEhhbEhhbmRsZSBoYWxIYW5kbGU7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgQkFQIGNvbnRyb2wgYmxvY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGlmICgoIE5VTEwgPT0gcEJ0YW1wQ3R4ICkgfHwgKE5VTEwgPT0gY2hhbm5lbCkgfHwgKE5VTEwgPT0gYWN0aXZlRmxhZykpCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJBUCBwb2ludGVyIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgaGFsSGFuZGxlID0gIFZPU19HRVRfSEFMX0NCKHBCdGFtcEN0eC0+cHZvc0dDdHgpOworCisgIGlmKE5VTEwgPT0gaGFsSGFuZGxlKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJoYWxIYW5kbGUgaXMgTlVMTCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBpZiAoY2NtQ2ZnR2V0SW50KGhhbEhhbmRsZSwgV05JX0NGR19DVVJSRU5UX0NIQU5ORUwsIGNoYW5uZWwpIAorICAgICAgICAgICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkdldCBDRkcgZmFpbGVkIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgKmFjdGl2ZUZsYWcgID0gRkFMU0U7ICAvLyByZXR1cm4gYWN0aXZlIGZsYWcgaGVyZQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTkJBUF9HZXRDdXJyZW50Q2hhbm5lbCAqLworCisKZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBBcGlFeHQuaCBiL0NPUkUvQkFQL3NyYy9iYXBBcGlFeHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjE4MDcxCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcEFwaUV4dC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBXTEFOX1FDVF9XTEFOQkFQX0FQSV9FWFRfSAorI2RlZmluZSBXTEFOX1FDVF9XTEFOQkFQX0FQSV9FWFRfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICBXIEwgQSBOICAgQiBUIC0gQSBNIFAgIFAgQSBMICAgTCBBIFkgRSBSIAorICAgICAgICAgICAgICAgICAgICAgICBFIFggVCBFIFIgTiBBIEwgIEEgUCBJCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgCitERVNDUklQVElPTgorICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSXMgdXNlZCBieSB0aGUgd2xhbiBCVC1BTVAgUEFMIGxheWVyIAorICBtb2R1bGUuCisgIAorICAgICAgCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAkSGVhZGVyOiAvY3lnZHJpdmUvZS9CdWlsZHMvTTcyMDFKU0RDQUFQQUQ1MjI0MEIvV00vcGxhdGZvcm0vbXNtNzIwMC9TcmMvRHJpdmVycy9TRC9DbGllbnREcml2ZXJzL1dMQU4vUUNUL0NPUkUvQkFQL3NyYy9iYXBBcGlFeHQuaCx2IDEuMSAyMDA4LzExLzIxIDIwOjI5OjEzIGp6bXVkYSBFeHAganptdWRhICQgJERhdGVUaW1lOiAkICRBdXRob3I6IGp6bXVkYSAkCisKKword2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxMC8yMi8wOCAgICBqZXogICAgIENyZWF0ZWQgbW9kdWxlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTIEZPUiBNT0RVTEUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vIFBpY2sgdXAgYWxsIHRoZSBCVC1BTVAgaW50ZXJuYWwgZGVmaW5pdGlvbnMgCisvLyBBbmQgdW5kZXJseWluZyBzdXBwb3J0aW5nIHR5cGVzLiAoSW5jbHVkaW5nIFZPU1MsIENTUiwgYW5kLi4uKQorI2luY2x1ZGUgImJhcEludGVybmFsLmgiIAorCisvKiBQaWNrIHVwIHRoZSBTSVJJVVMgYW5kIEhBTCB0eXBlcyAqLyAKKy8vIEFscmVhZHkgdGFrZW4gY2FyZSBvZiwgYWJvdmUgCisvLyNpbmNsdWRlICJzaXJBcGkuaCIKKy8vI2luY2x1ZGUgImhhbFR5cGVzLmgiCisKKy8qIFBpY2sgdXAgdGhlIENDTSBBUEkgZGVmJ24gKi8gCisjaW5jbHVkZSAiY2NtQXBpLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworICNlbmRpZiAKKyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRGVmaW5lcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBUZW1wb3JhcnkgCisvLyNkZWZpbmUgQkFQX0RFQlVHCisKKy8vIEhvdyBkbyBJIGdldCBCQVAgY29udGV4dCBmcm9tIHZvc3MgY29udGV4dD8gCisvLyNkZWZpbmUgVk9TX0dFVF9CQVBfQ0IoY3R4KSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfQkFQLCBjdHgpIAorLy8gSG93IGRvIEkgZ2V0IGhhbEhhbmRsZSBmcm9tIHZvc3MgY29udGV4dD8gCisvLyNkZWZpbmUgVk9TX0dFVF9IQUxfQ0IoY3R4KSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfSEFMLCBjdHgpIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUeXBlZGVmcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRXh0ZXJuYWwgZGVjbGFyYXRpb25zIGZvciBnbG9iYWwgY29udGV4dCAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEZ1bmN0aW9uIHByb3RvdHlwZXMgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVXRpbGl0eSBGdW5jdGlvbiBwcm90b3R5cGVzIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX0dldEN1cnJlbnRDaGFubmVsCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2xlYXIgb3V0IGFsbCBmaWVsZHMgaW4gdGhlIEJBUCBjb250ZXh0LgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBCdGFtcEN0eDogICBwb2ludGVyIHRvIHRoZSBCQVAgY29udHJvbCBibG9jaworICAgIGNoYW5uZWw6ICAgICBjdXJyZW50IGNvbmZpZ3VyZWQgY2hhbm5lbCBudW1iZXIuCisgICAgYWN0aXZlRmxhZzogIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZXJlIGlzIGFuIGFjdGl2ZSBsaW5rLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcmV0dXJuIGNoYW5uZWwgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9HZXRDdXJyZW50Q2hhbm5lbAorKCAKKyAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCwKKyAgdl9VMzJfdCAqY2hhbm5lbCwgLy8gcmV0dXJuIGN1cnJlbnQgY2hhbm5lbCBoZXJlCisgIHZfVTMyX3QgKmFjdGl2ZUZsYWcgICAvLyByZXR1cm4gYWN0aXZlIGZsYWcgaGVyZQorKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKKyB9CisjZW5kaWYgCisKKworI2VuZGlmIC8qICNpZm5kZWYgV0xBTl9RQ1RfV0xBTkJBUF9BUElfRVhUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcEFwaUhDQkIuYyBiL0NPUkUvQkFQL3NyYy9iYXBBcGlIQ0JCLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjNTRhZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvQkFQL3NyYy9iYXBBcGlIQ0JCLmMKQEAgLTAsMCArMSwxNjkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIGIgYSBwIEEgcCBpIEggQyBCIEIgLiBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBPVkVSVklFVzoKKyAgCisgIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gQkFQIG1vZHVsZXMKKyAgSG9zdCBDb250cm9sbGVyIGFuZCBCYXNlYmFuZCBmdW5jdGlvbnMuCisgIAorICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIE9OTFkgYnkgb3RoZXIgCisgIFdMQU4gbW9kdWxlcyAoSEREKSB0aGF0IHByb3Blcmx5IHJlZ2lzdGVyIHdpdGggdGhlIEJBUCBMYXllciBpbml0aWFsbHkuCisKKyAgREVQRU5ERU5DSUVTOiAKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4gCisgIAorICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAgJEhlYWRlcjogL3Byai9xY3QvYXN3L2VuZ2J1aWxkcy9zY2wvdXNlcnMwMi9qem11ZGEvQW5kcm9pZC9hbXBCbHVlWl82L0NPUkUvQkFQL3NyYy9iYXBBcGlIQ0JCLmMsdiAxLjcgMjAxMS8wNS8wNiAwMDo1OToyNyBqem11ZGEgRXhwIGp6bXVkYSAkJERhdGVUaW1lJCRBdXRob3I6IGp6bXVkYSAkCisKKworICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMDA4LTA5LTE1ICAgIGpleiAgICAgQ3JlYXRlZCBtb2R1bGUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKworLy8gUGljayB1cCB0aGUgc21lIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBBUEkKKyNpbmNsdWRlICJzbWVfQXBpLmgiCisKKy8qIEJULUFNUCBQQUwgQVBJIGhlYWRlciBmaWxlICovIAorI2luY2x1ZGUgImJhcEFwaS5oIiAKKyNpbmNsdWRlICJiYXBJbnRlcm5hbC5oIiAKKworLy8jZGVmaW5lIEJBUF9ERUJVRworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsaXplZCBGdW5jdGlvbiBEZWZpbml0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qIEhvc3QgQ29udHJvbGxlciBhbmQgQmFzZWJhbmQgQ29tbWFuZHMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZXNldCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZXNldCBjb21tYW5kLgorICAgIFByb2R1Y2VzIGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiBUaHJvdWdoIHRoZSAKKyAgICBjb21tYW5kIGNvbXBsZXRlIGNhbGxiYWNrLiAgKEkuRS4sICgqdHBXTEFOX0JBUEV2ZW50Q0IpLikKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlc2V0CisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlCispCit7CisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzOworICAgIHRCdGFtcEhDSV9FdmVudCBiYXBIQ0lFdmVudDsgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOworICAgIHRIYWxIYW5kbGUgICAgIGhIYWwgPSBOVUxMOworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7IAorCisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovIAorICAgIGlmIChidGFtcEhhbmRsZSA9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJidGFtcEhhbmRsZSBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvKiBQZXJmb3JtIGEgInJlc2V0IiAqLyAKKyAgICBoSGFsID0gVk9TX0dFVF9IQUxfQ0IoYnRhbXBDb250ZXh0LT5wdm9zR0N0eCk7CisgICAgaWYgKE5VTEwgPT0gaEhhbCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiaEhhbCBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8vY3NyUm9hbURpc2Nvbm5lY3QoKTsKKyAgICBzbWVfUm9hbURpc2Nvbm5lY3QoaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIC8vIERhbmxpbiwgd2hlcmUgYXJlIHRoZSByaWNoZXIgcmVhc29uIGNvZGVzPworICAgICAgICAgICAgICAgICAgICAgICAvLyBJIHdhbnQgdG8gYmUgYWJsZSB0byBjb252ZXkgZXZlcnl0aGluZyA4MDIuMTEgc3VwcG9ydHMuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisKKyAgICAvKiBOZWVkIHRvIHJlc2V0IHRoZSB0aW1lcnMgYXMgd2VsbCovCisgICAgLyogQ29ubmVjdGlvbiBBY2NlcHQgVGltZXIgaW50ZXJ2YWwqLworICAgIGJ0YW1wQ29udGV4dC0+YmFwQ29ubmVjdGlvbkFjY2VwdFRpbWVySW50ZXJ2YWwgPSBXTEFOQkFQX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQ7ICAKKyAgICAvKiBMaW5rIFN1cGVydmlzaW9uIFRpbWVyIGludGVydmFsKi8KKyAgICBidGFtcENvbnRleHQtPmJhcExpbmtTdXBlcnZpc2lvblRpbWVySW50ZXJ2YWwgPSBXTEFOQkFQX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVDsgIAorICAgIC8qIExvZ2ljYWwgTGluayBBY2NlcHQgVGltZXIgaW50ZXJ2YWwqLworICAgIGJ0YW1wQ29udGV4dC0+YmFwTG9naWNhbExpbmtBY2NlcHRUaW1lckludGVydmFsID0gV0xBTkJBUF9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVQ7ICAKKyAgICAvKiBCZXN0IEVmZm9ydCBGbHVzaCB0aW1lciBpbnRlcnZhbCovCisgICAgYnRhbXBDb250ZXh0LT5iYXBCRUZsdXNoVGltZXJJbnRlcnZhbCA9IFdMQU5CQVBfQkVfRkxVU0hfVElNRU9VVDsgIAorCisKKyAgICAvKiBGb3JtIGFuZCBpbW1lZGlhdGVseSByZXR1cm4gdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuLi4gKi8gCisgICAgYmFwSENJRXZlbnQuYmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5wcmVzZW50ID0gMTsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jb21tYW5kX29wY29kZSAKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX1JFU0VUX0NNRDsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVzZXQuc3RhdHVzIAorICAgICAgICA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICB2b3NTdGF0dXMgPSAoKmJ0YW1wQ29udGV4dC0+cEJhcEhDSUV2ZW50Q0IpIAorICAgICAgICAoICAKKyAgICAgICAgIC8vYnRhbXBDb250ZXh0LT5wSGRkSGRsLCAgIC8qIHRoaXMgcmVmZXJzIHRvIHRoZSBCU0wgcGVyIGNvbm5lY3Rpb24gY29udGV4dCAqLworICAgICAgICAgYnRhbXBDb250ZXh0LT5wQXBwSGRsLCAgIC8qIHRoaXMgcmVmZXJzIHRoZSBCU0wgcGVyIGFwcGxpY2F0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgICZiYXBIQ0lFdmVudCwgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgIFZPU19GQUxTRSAvKiBGbGFnIHRvIGluZGljYXRlIGFzc29jLXNwZWNpZmljIGV2ZW50ICovIAorICAgICAgICApOworCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30gLyogV0xBTl9CQVBSZXNldCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFNldEV2ZW50TWFzaygpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBTZXQgRXZlbnQgTWFzayBjb21tYW5kLiAgVGhlcmUgaXMgbm8gbmVlZCBmb3IgCisgICAgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lTZXRFdmVudE1hc2s6ICBwb2ludGVyIHRvIHRoZSAiSENJIFNldCBFdmVudCBNYXNrIiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVNldEV2ZW50TWFzayBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBTZXRFdmVudE1hc2sKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9TZXRfRXZlbnRfTWFza19DbWQgICAqcEJhcEhDSVNldEV2ZW50TWFzaywKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKykKK3sKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQU2V0RXZlbnRNYXNrICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQRmx1c2goKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgRmx1c2ggY29tbWFuZAorICAgIFByb2R1Y2VzIGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiBUaHJvdWdoIHRoZSAKKyAgICBldmVudCBjYWxsYmFjay4gQW5kIGFuIGFzeW5jaHJvbm91cyBGbHVzaCBvY2N1cnJlZCBldmVudC4gQWxzbyB0aHJvdWdoIHRoZSAKKyAgICBldmVudCBjYWxsYmFjay4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSUZsdXNoOiAgcG9pbnRlciB0byB0aGUgIkhDSSBGbHVzaCIgU3RydWN0dXJlLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSUZsdXNoIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUEZsdXNoCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfRmx1c2hfQ21kICAgICAqcEJhcEhDSUZsdXNoCispCit7CisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzOworICAgIHRCdGFtcEhDSV9FdmVudCBiYXBIQ0lFdmVudDsgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7IAorCisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovIAorICAgIGlmIChidGFtcEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qIEZvcm0gYW5kIGltbWVkaWF0ZWx5IHJldHVybiB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4uLiAqLyAKKyAgICBiYXBIQ0lFdmVudC5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfQ09NUExFVEVfRVZFTlQ7CisgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSAxOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNvbW1hbmRfb3Bjb2RlIAorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfRkxVU0hfQ01EOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5GbHVzaC5zdGF0dXMKKyAgICAgICAgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworCisgICAgdm9zU3RhdHVzID0gKCpidGFtcENvbnRleHQtPnBCYXBIQ0lFdmVudENCKSAKKyAgICAgICAgKCAgCisgICAgICAgICAvL2J0YW1wQ29udGV4dC0+cEhkZEhkbCwgICAvKiB0aGlzIHJlZmVycyB0byB0aGUgQlNMIHBlciBjb25uZWN0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgIGJ0YW1wQ29udGV4dC0+cEFwcEhkbCwgICAvKiB0aGlzIHJlZmVycyB0aGUgQlNMIHBlciBhcHBsaWNhdGlvbiBjb250ZXh0ICovCisgICAgICAgICAmYmFwSENJRXZlbnQsIC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICBWT1NfRkFMU0UgLyogRmxhZyB0byBpbmRpY2F0ZSBhc3NvYy1zcGVjaWZpYyBldmVudCAqLyAKKyAgICAgICAgKTsKKworICAgIHJldHVybiB2b3NTdGF0dXM7Cit9IC8qIFdMQU5fQkFQRmx1c2ggKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9FbmhhbmNlZEJBUEZsdXNoKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIEVuaGFuY2VkIEZsdXNoIGNvbW1hbmQKKyAgICBQcm9kdWNlcyBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gVGhyb3VnaCB0aGUgY29tbWFuZCBzdGF0dXMgCisgICAgZXZlbnQgY2FsbGJhY2suIEFuZCBhbiBhc3luY2hyb25vdXMgRW5oYW5jZWQgRmx1c2ggQ29tcGxldGUgZXZlbnQuIAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJRmx1c2g6ICBwb2ludGVyIHRvIHRoZSAiSENJIEVuaGFuY2VkIEZsdXNoIiBTdHJ1Y3R1cmUuCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lGbHVzaCBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9FbmhhbmNlZEJBUEZsdXNoCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kICAgICAqcEJhcEhDSUZsdXNoLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworCispCit7CisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRCdGFtcEhDSV9FdmVudCBiYXBIQ0lFdmVudDsgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQ7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsgCisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovIAorICAgIGlmICgoTlVMTCA9PSBidGFtcEhhbmRsZSkgfHwgKE5VTEwgPT0gcEJhcEhDSUV2ZW50KSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgYnRhbXBDb250ZXh0ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsKKyAgICAvKiBGb3JtIGFuZCByZXR1cm4gdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50Li4uICovCisgICAgYmFwSENJRXZlbnQuYmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX1NUQVRVU19FVkVOVDsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnByZXNlbnQgPSAxOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuY29tbWFuZF9vcGNvZGUKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX0VOSEFOQ0VEX0ZMVVNIX0NNRDsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnN0YXR1cyA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBGb3JtIGFuZCBpbW1lZGlhdGVseSByZXR1cm4gdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuLi4gKi8gCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0VOSEFOQ0VEX0ZMVVNIX0NPTVBMRVRFX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcEVuaGFuY2VkRmx1c2hDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcEVuaGFuY2VkRmx1c2hDb21wbGV0ZUV2ZW50LmxvZ19saW5rX2hhbmRsZSA9IAorICAgICAgICBwQmFwSENJRmx1c2gtPmxvZ19saW5rX2hhbmRsZTsKKworICAgIHZvc1N0YXR1cyA9ICgqYnRhbXBDb250ZXh0LT5wQmFwSENJRXZlbnRDQikgCisgICAgICAgICggIAorICAgICAgICAgLy9idGFtcENvbnRleHQtPnBIZGRIZGwsICAgLyogdGhpcyByZWZlcnMgdG8gdGhlIEJTTCBwZXIgY29ubmVjdGlvbiBjb250ZXh0ICovCisgICAgICAgICBidGFtcENvbnRleHQtPnBBcHBIZGwsICAgLyogdGhpcyByZWZlcnMgdGhlIEJTTCBwZXIgYXBwbGljYXRpb24gY29udGV4dCAqLworICAgICAgICAgJmJhcEhDSUV2ZW50LCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgVk9TX0ZBTFNFIC8qIEZsYWcgdG8gaW5kaWNhdGUgYXNzb2Mtc3BlY2lmaWMgZXZlbnQgKi8gCisgICAgICAgICk7CisKKyAgICByZXR1cm4gdm9zU3RhdHVzOworfSAvKiBXTEFOX0VuaGFuY2VkQkFQRmx1c2ggKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZWFkQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBDb25uZWN0aW9uIEFjY2VwdCBUaW1lb3V0IGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dCBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSAqLworKQoreworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7CisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKChOVUxMID09IGJ0YW1wSGFuZGxlKSB8fCAoTlVMTCA9PSBwQmFwSENJRXZlbnQpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvKiBGaWxsIGluIHRoZSBwYXJhbWV0ZXJzIGZvciBjb21tYW5kIGNvbXBsZXRlIGV2ZW50Li4uICovIAorICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSBUUlVFOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jb21tYW5kX29wY29kZSAKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX1JFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVF9DTUQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UTy5zdGF0dXMKKyAgICAgICAgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVE8uY29ubmVjdGlvbl9hY2NlcHRfdGltZW91dAorICAgICAgICA9IGJ0YW1wQ29udGV4dC0+YmFwQ29ubmVjdGlvbkFjY2VwdFRpbWVySW50ZXJ2YWw7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFdyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgV3JpdGUgQ29ubmVjdGlvbiBBY2NlcHQgVGltZW91dCBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0OiAgcG9pbnRlciB0byB0aGUgIkhDSSBDb25uZWN0aW9uIEFjY2VwdCBUaW1lb3V0IiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVdyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQV3JpdGVDb25uZWN0aW9uQWNjZXB0VGltZW91dAorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kICAgKnBCYXBIQ0lXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0LAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKQoreworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7CisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKChOVUxMID09IGJ0YW1wSGFuZGxlKSB8fCAoTlVMTCA9PSBwQmFwSENJV3JpdGVDb25uZWN0aW9uQWNjZXB0VGltZW91dCkKKyAgICAgICAgfHwgKE5VTEwgPT0gcEJhcEhDSUV2ZW50KSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgdGhlIGFsbG93ZWQgdGltZW91dCBpbnRlcnZhbCByYW5nZSAqLworICAgIGlmICgocEJhcEhDSVdyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQtPmNvbm5lY3Rpb25fYWNjZXB0X3RpbWVvdXQgPgorICAgICAgICAgV0xBTkJBUF9DT05fQUNDRVBUX1RJTUVPVVRfTUFYX1JBTkdFKSB8fCAKKyAgICAgICAgKHBCYXBIQ0lXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0LT5jb25uZWN0aW9uX2FjY2VwdF90aW1lb3V0IDwKKyAgICAgICAgIFdMQU5CQVBfQ09OX0FDQ0VQVF9USU1FT1VUX01JTl9SQU5HRSkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJPdXQgb2YgcmFuZ2UgZm9yIGNvbm5lY3Rpb24gYWNjZXB0IHRpbWVvdXQgcGFyYW1ldGVycyBpbiAlcyIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVE8uc3RhdHVzCisgICAgICAgICAgICA9IFdMQU5CQVBfRVJST1JfSU5WQUxJRF9IQ0lfQ01ORF9QQVJBTTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU2F2ZSB0aGUgUGh5c2ljYWwgbGluayBjb25uZWN0aW9uIGFjY2VwdCB0aW1lb3V0IHZhbHVlICovCisgICAgICAgIGJ0YW1wQ29udGV4dC0+YmFwQ29ubmVjdGlvbkFjY2VwdFRpbWVySW50ZXJ2YWwgPSAKKyAgICAgICAgICAgIHBCYXBIQ0lXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0LT5jb25uZWN0aW9uX2FjY2VwdF90aW1lb3V0OworCisgICAgICAgIC8qIFJldHVybiBzdGF0dXMgZm9yIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgKi8KKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVE8uc3RhdHVzCisgICAgICAgICAgICA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyogRmlsbCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgY29tbWFuZCBjb21wbGV0ZSBldmVudC4uLiAqLyAKKyAgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9DT01QTEVURV9FVkVOVDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5wcmVzZW50ID0gVFJVRTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY29tbWFuZF9vcGNvZGUgCisgICAgICAgID0gQlRBTVBfVExWX0hDSV9XUklURV9DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VUX0NNRDsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQV3JpdGVDb25uZWN0aW9uQWNjZXB0VGltZW91dCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXQoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXQgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXQgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXQKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIC8qIE9ubHkgOCBiaXRzIChwaHlfbGlua19oYW5kbGUpIG9mIHRoaXMgbG9nX2xpbmtfaGFuZGxlIGFyZSB2YWxpZC4gKi8KKyAgdEJ0YW1wVExWSENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCAqcEJhcEhDSVJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0LAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgIlJlYWQiIENvbW1hbmQgQ29tcGxldGUqLworKQoreworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisgICAgdl9VOF90ICAgICAgICAgcGh5TGlua0hhbmRsZTsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoKE5VTEwgPT0gYnRhbXBIYW5kbGUpIHx8IChOVUxMID09IHBCYXBIQ0lSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dCkgfHwKKyAgICAgICAgKE5VTEwgPT0gcEJhcEhDSUV2ZW50KSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgdGhlIHBoeWlzY2FsIGxpbmsgaGFuZGxlIGV4dHJhY3RlZCBmcm9tCisgICAgICAgbG9naWNhbCBsaW5rIGhhbmRsZSAobG93ZXIgYnl0ZSB2YWxpZCkgKi8KKyAgICBwaHlMaW5rSGFuZGxlID0gKHZfVThfdCkgcEJhcEhDSVJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0LT5sb2dfbGlua19oYW5kbGU7CisKKyAgICBpZiAocGh5TGlua0hhbmRsZSAhPSBidGFtcENvbnRleHQtPnBoeV9saW5rX2hhbmRsZSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGh5c2ljYWwgbGluayBoYW5kbGUgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVE8ubGlua19zdXBlcnZpc2lvbl90aW1lb3V0CisgICAgICAgICAgICA9IDB4MDA7IC8qIEludmFsaWQgdmFsdWUgKi8KKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RPLmxvZ19saW5rX2hhbmRsZQorICAgICAgICAgICAgPSBwQmFwSENJUmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXQtPmxvZ19saW5rX2hhbmRsZTsKKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RPLnN0YXR1cworICAgICAgICAgICAgPSBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTGlua19TdXBlcnZpc2lvbl9UTy5saW5rX3N1cGVydmlzaW9uX3RpbWVvdXQKKyAgICAgICAgICAgID0gYnRhbXBDb250ZXh0LT5iYXBMaW5rU3VwZXJ2aXNpb25UaW1lckludGVydmFsOworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVE8ubG9nX2xpbmtfaGFuZGxlCisgICAgICAgICAgICA9IHBCYXBIQ0lSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dC0+bG9nX2xpbmtfaGFuZGxlOworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVE8uc3RhdHVzCisgICAgICAgICAgICA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyogRmlsbCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgY29tbWFuZCBjb21wbGV0ZSBldmVudC4uLiAqLyAKKyAgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9DT01QTEVURV9FVkVOVDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5wcmVzZW50ID0gVFJVRTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY29tbWFuZF9vcGNvZGUgCisgICAgICAgID0gQlRBTVBfVExWX0hDSV9SRUFEX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVF9DTUQ7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFdyaXRlIExpbmsgU3VwZXJ2aXNpb24gVGltZW91dCBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQ6ICBwb2ludGVyIHRvIHRoZSAiSENJIExpbmsgU3VwZXJ2aXNpb24gVGltZW91dCIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0CisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCAgICpwQmFwSENJV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0LAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKQoreworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisgICAgdl9VOF90ICAgICAgICAgcGh5TGlua0hhbmRsZTsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoKE5VTEwgPT0gYnRhbXBIYW5kbGUpIHx8IChOVUxMID09IHBCYXBIQ0lXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQpIHx8CisgICAgICAgIChOVUxMID09IHBCYXBIQ0lFdmVudCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qIFZhbGlkYXRlIHRoZSBwaHlpc2NhbCBsaW5rIGhhbmRsZSBleHRyYWN0ZWQgZnJvbQorICAgICAgIGxvZ2ljYWwgbGluayBoYW5kbGUgKGxvd2VyIGJ5dGUgdmFsaWQpICovCisgICAgcGh5TGlua0hhbmRsZSA9ICh2X1U4X3QpIHBCYXBIQ0lXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQtPmxvZ19saW5rX2hhbmRsZTsKKworICAgIGlmIChwaHlMaW5rSGFuZGxlICE9IGJ0YW1wQ29udGV4dC0+cGh5X2xpbmtfaGFuZGxlKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBQaHlzaWNhbCBsaW5rIGhhbmRsZSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LldyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVE8ubG9nX2xpbmtfaGFuZGxlCisgICAgICAgICAgICA9IHBCYXBIQ0lXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQtPmxvZ19saW5rX2hhbmRsZTsKKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UTy5zdGF0dXMKKyAgICAgICAgICAgID0gV0xBTkJBUF9FUlJPUl9JTlZBTElEX0hDSV9DTU5EX1BBUkFNOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBTYXZlIHRoZSBMUyB0aW1lb3V0IGludGVydmFsICovCisgICAgICAgIGJ0YW1wQ29udGV4dC0+YmFwTGlua1N1cGVydmlzaW9uVGltZXJJbnRlcnZhbCA9CisgICAgICAgICAgICBwQmFwSENJV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0LT5saW5rX3N1cGVydmlzaW9uX3RpbWVvdXQ7CisKKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UTy5sb2dfbGlua19oYW5kbGUKKyAgICAgICAgICAgID0gcEJhcEhDSVdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dC0+bG9nX2xpbmtfaGFuZGxlOworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RPLnN0YXR1cworICAgICAgICAgICAgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIC8qIEZpbGwgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuLi4gKi8gCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfQ09NUExFVEVfRVZFTlQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQucHJlc2VudCA9IFRSVUU7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNvbW1hbmRfb3Bjb2RlIAorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUX0NNRDsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0ICovCisKKy8qIHYzLjAgSG9zdCBDb250cm9sbGVyIGFuZCBCYXNlYmFuZCBDb21tYW5kcyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVhZExvZ2ljYWxMaW5rQWNjZXB0VGltZW91dCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIExvZ2ljYWwgTGluayBBY2NlcHQgVGltZW91dCBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lSZWFkTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0IGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlYWRMb2dpY2FsTGlua0FjY2VwdFRpbWVvdXQKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSovCispCit7CisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoKE5VTEwgPT0gYnRhbXBIYW5kbGUpIHx8IChOVUxMID09IHBCYXBIQ0lFdmVudCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qIEZpbGwgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuLi4gKi8gCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfQ09NUExFVEVfRVZFTlQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQucHJlc2VudCA9IFRSVUU7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNvbW1hbmRfb3Bjb2RlIAorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVRfQ01EOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UTy5zdGF0dXMKKyAgICAgICAgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UTy5sb2dpY2FsX2xpbmtfYWNjZXB0X3RpbWVvdXQKKyAgICAgICAgPSBidGFtcENvbnRleHQtPmJhcExvZ2ljYWxMaW5rQWNjZXB0VGltZXJJbnRlcnZhbDsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQUmVhZExvZ2ljYWxMaW5rQWNjZXB0VGltZW91dCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0KCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFdyaXRlIExvZ2ljYWwgTGluayBBY2NlcHQgVGltZW91dCBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lXcml0ZUxvZ2ljYWxMaW5rQWNjZXB0VGltZW91dDogIHBvaW50ZXIgdG8gdGhlICJIQ0kgTG9naWNhbCBMaW5rIEFjY2VwdCBUaW1lb3V0IiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0IGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0CisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCAgICpwQmFwSENJV3JpdGVMb2dpY2FsTGlua0FjY2VwdFRpbWVvdXQsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispCit7CisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoKE5VTEwgPT0gYnRhbXBIYW5kbGUpIHx8IChOVUxMID09IHBCYXBIQ0lXcml0ZUxvZ2ljYWxMaW5rQWNjZXB0VGltZW91dCkKKyAgICAgICAgfHwgKE5VTEwgPT0gcEJhcEhDSUV2ZW50KSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgdGhlIGFsbG93ZWQgdGltZW91dCBpbnRlcnZhbCByYW5nZSAqLworICAgIGlmICgocEJhcEhDSVdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0LT5sb2dpY2FsX2xpbmtfYWNjZXB0X3RpbWVvdXQgPgorICAgICAgICAgV0xBTkJBUF9DT05fQUNDRVBUX1RJTUVPVVRfTUFYX1JBTkdFKSB8fCAKKyAgICAgICAgKHBCYXBIQ0lXcml0ZUxvZ2ljYWxMaW5rQWNjZXB0VGltZW91dC0+bG9naWNhbF9saW5rX2FjY2VwdF90aW1lb3V0IDwKKyAgICAgICAgIFdMQU5CQVBfQ09OX0FDQ0VQVF9USU1FT1VUX01JTl9SQU5HRSkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJPdXQgb2YgcmFuZ2UgZm9yIGxvZ2ljYWwgY29ubmVjdGlvbiBhY2NlcHQgdGltZW91dCBwYXJhbWV0ZXJzIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RPLnN0YXR1cworICAgICAgICAgICAgPSBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFNhdmUgdGhlIFBoeXNpY2FsIGxpbmsgY29ubmVjdGlvbiBhY2NlcHQgdGltZW91dCB2YWx1ZSAqLworICAgICAgICBidGFtcENvbnRleHQtPmJhcExvZ2ljYWxMaW5rQWNjZXB0VGltZXJJbnRlcnZhbCA9IAorICAgICAgICAgICAgcEJhcEhDSVdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0LT5sb2dpY2FsX2xpbmtfYWNjZXB0X3RpbWVvdXQ7CisKKyAgICAgICAgLyogUmV0dXJuIHN0YXR1cyBmb3IgY29tbWFuZCBjb21wbGV0ZSBldmVudCAqLworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RPLnN0YXR1cworICAgICAgICAgICAgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIC8qIEZpbGwgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuLi4gKi8gCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfQ09NUExFVEVfRVZFTlQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQucHJlc2VudCA9IFRSVUU7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNvbW1hbmRfb3Bjb2RlIAorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfV1JJVEVfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUX0NNRDsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQV3JpdGVMb2dpY2FsTGlua0FjY2VwdFRpbWVvdXQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBTZXRFdmVudE1hc2tQYWdlMigpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBTZXQgRXZlbnQgTWFzayBQYWdlIDIgY29tbWFuZC4gIFRoZXJlIGlzIG5vIG5lZWQgZm9yIAorICAgIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJU2V0RXZlbnRNYXNrUGFnZTI6ICBwb2ludGVyIHRvIHRoZSAiSENJIFNldCBFdmVudCBNYXNrIFBhZ2UgMiIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lTZXRFdmVudE1hc2tQYWdlMiBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBTZXRFdmVudE1hc2tQYWdlMgorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQgICAqcEJhcEhDSVNldEV2ZW50TWFza1BhZ2UyLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKQoreworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7CisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKChOVUxMID09IGJ0YW1wSGFuZGxlKSB8fCAoTlVMTCA9PSBwQmFwSENJU2V0RXZlbnRNYXNrUGFnZTIpCisgICAgICAgIHx8IChOVUxMID09IHBCYXBIQ0lFdmVudCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworCisgICAgLyogU2F2ZSBhd2F5IHRoZSBldmVudCBtYXNrICovCisgICAgdm9zX21lbV9jb3B5KCAgCisgICAgICAgICAgICBidGFtcENvbnRleHQtPmV2ZW50X21hc2tfcGFnZV8yLCAKKyAgICAgICAgICAgIHBCYXBIQ0lTZXRFdmVudE1hc2tQYWdlMi0+ZXZlbnRfbWFza19wYWdlXzIsIAorICAgICAgICAgICAgOCApOworCisgICAgLyogUmV0dXJuIHN0YXR1cyBmb3IgY29tbWFuZCBjb21wbGV0ZSBldmVudCAqLworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlNldF9FdmVudF9NYXNrX1BhZ2VfMi5zdGF0dXMKKyAgICAgICAgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworCisgICAgLyogRmlsbCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgY29tbWFuZCBjb21wbGV0ZSBldmVudC4uLiAqLyAKKyAgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9DT01QTEVURV9FVkVOVDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5wcmVzZW50ID0gVFJVRTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY29tbWFuZF9vcGNvZGUgCisgICAgICAgID0gQlRBTVBfVExWX0hDSV9TRVRfRVZFTlRfTUFTS19QQUdFXzJfQ01EOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogV0xBTl9CQVBTZXRFdmVudE1hc2tQYWdlMiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRMb2NhdGlvbkRhdGEoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBMb2NhdGlvbiBEYXRhIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVJlYWRMb2NhdGlvbkRhdGEgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVhZExvY2F0aW9uRGF0YQorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nICJSZWFkIiBDb21tYW5kIENvbXBsZXRlKi8KKykKK3sKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQ7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7CisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKChOVUxMID09IGJ0YW1wSGFuZGxlKSB8fCAoTlVMTCA9PSBwQmFwSENJRXZlbnQpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOworCisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9Mb2NhdGlvbl9EYXRhLmxvY19kb21haW5fYXdhcmUKKyAgICAgICAgPSBidGFtcENvbnRleHQtPmJ0YW1wX0xvY2F0aW9uX0RhdGFfSW5mby5sb2NfZG9tYWluX2F3YXJlOworCisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9Mb2NhdGlvbl9EYXRhLmxvY19vcHRpb25zCisgICAgICAgID0gYnRhbXBDb250ZXh0LT5idGFtcF9Mb2NhdGlvbl9EYXRhX0luZm8ubG9jX29wdGlvbnM7CisKKyAgICB2b3NfbWVtX2NvcHkoICAKKyAgICAgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTG9jYXRpb25fRGF0YS5sb2NfZG9tYWluLAorICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9Mb2NhdGlvbl9EYXRhX0luZm8ubG9jX2RvbWFpbiwgCisgICAgICAgICAgICAzICk7CisKKyAgICAvKiBSZXR1cm4gc3RhdHVzIGZvciBjb21tYW5kIGNvbXBsZXRlIGV2ZW50ICovCisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9Mb2NhdGlvbl9EYXRhLnN0YXR1cworICAgICAgICA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBGaWxsIGluIHRoZSBwYXJhbWV0ZXJzIGZvciBjb21tYW5kIGNvbXBsZXRlIGV2ZW50Li4uICovIAorICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSBUUlVFOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jb21tYW5kX29wY29kZSAKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX1JFQURfTE9DQVRJT05fREFUQV9DTUQ7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFJlYWRMb2NhdGlvbkRhdGEgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBXcml0ZUxvY2F0aW9uRGF0YSgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBXcml0ZSBMb2NhdGlvbiBEYXRhIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSVdyaXRlTG9jYXRpb25EYXRhOiAgcG9pbnRlciB0byB0aGUgIkhDSSBXcml0ZSBMb2NhdGlvbiBEYXRhIiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVdyaXRlTG9jYXRpb25EYXRhIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFdyaXRlTG9jYXRpb25EYXRhCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWQgICAqcEJhcEhDSVdyaXRlTG9jYXRpb25EYXRhLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKQoreworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dDsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoKE5VTEwgPT0gYnRhbXBIYW5kbGUpIHx8IChOVUxMID09IHBCYXBIQ0lXcml0ZUxvY2F0aW9uRGF0YSkKKyAgICAgICAgfHwgKE5VTEwgPT0gcEJhcEhDSUV2ZW50KSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgYnRhbXBDb250ZXh0ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsKKworICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfTG9jYXRpb25fRGF0YV9JbmZvLmxvY19kb21haW5fYXdhcmUgPSAKKyAgICAgICAgcEJhcEhDSVdyaXRlTG9jYXRpb25EYXRhLT5sb2NfZG9tYWluX2F3YXJlOworICAgIAorICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfTG9jYXRpb25fRGF0YV9JbmZvLmxvY19vcHRpb25zID0gCisgICAgICAgIHBCYXBIQ0lXcml0ZUxvY2F0aW9uRGF0YS0+bG9jX29wdGlvbnM7CisKKyAgICB2b3NfbWVtX2NvcHkoICAKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfTG9jYXRpb25fRGF0YV9JbmZvLmxvY19kb21haW4sIAorICAgICAgICAgICAgcEJhcEhDSVdyaXRlTG9jYXRpb25EYXRhLT5sb2NfZG9tYWluLCAKKyAgICAgICAgICAgIDMgKTsKKworICAgIC8qIFJldHVybiBzdGF0dXMgZm9yIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgKi8KKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5Xcml0ZV9Mb2NhdGlvbl9EYXRhLnN0YXR1cworICAgICAgICA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBGaWxsIGluIHRoZSBwYXJhbWV0ZXJzIGZvciBjb21tYW5kIGNvbXBsZXRlIGV2ZW50Li4uICovIAorICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSBUUlVFOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jb21tYW5kX29wY29kZSAKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX1dSSVRFX0xPQ0FUSU9OX0RBVEFfQ01EOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogV0xBTl9CQVBXcml0ZUxvY2F0aW9uRGF0YSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVhZEZsb3dDb250cm9sTW9kZSgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIEZsb3cgQ29udHJvbCBNb2RlIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVJlYWRGbG93Q29udHJvbE1vZGUgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVhZEZsb3dDb250cm9sTW9kZQorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nICJSZWFkIiBDb21tYW5kIENvbXBsZXRlKi8KKykKK3sKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoKE5VTEwgPT0gYnRhbXBIYW5kbGUpIHx8IChOVUxMID09IHBCYXBIQ0lFdmVudCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qIEZpbGwgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuLi4gKi8gCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfQ09NUExFVEVfRVZFTlQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQucHJlc2VudCA9IFRSVUU7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNvbW1hbmRfb3Bjb2RlIAorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfUkVBRF9GTE9XX0NPTlRST0xfTU9ERV9DTUQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9GbG93X0NvbnRyb2xfTW9kZS5zdGF0dXMKKyAgICAgICAgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfRmxvd19Db250cm9sX01vZGUuZmxvd19jb250cm9sX21vZGUKKyAgICAgICAgPSBXTEFOQkFQX0ZMT1dfQ09OVFJPTF9NT0RFX0JMT0NLX0JBU0VEOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogV0xBTl9CQVBSZWFkRmxvd0NvbnRyb2xNb2RlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQV3JpdGVGbG93Q29udHJvbE1vZGUoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgV3JpdGUgRmxvdyBDb250cm9sIE1vZGUgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJV3JpdGVGbG93Q29udHJvbE1vZGU6ICBwb2ludGVyIHRvIHRoZSAiSENJIFdyaXRlIEZsb3cgQ29udHJvbCBNb2RlIiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVdyaXRlRmxvd0NvbnRyb2xNb2RlIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFdyaXRlRmxvd0NvbnRyb2xNb2RlCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kICAgKnBCYXBIQ0lXcml0ZUZsb3dDb250cm9sTW9kZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKykKK3sKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQV3JpdGVGbG93Q29udHJvbE1vZGUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZWFkQmVzdEVmZm9ydEZsdXNoVGltZW91dCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIEJlc3QgRWZmb3J0IEZsdXNoIFRpbWVvdXQgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZEJFRmx1c2hUTyBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkQmVzdEVmZm9ydEZsdXNoVGltZW91dAorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgLyogVGhlIGxvZ19saW5rX2hhbmxkZSBpZGVudGlmaWVzIHdoaWNoIGxvZ2ljYWwgbGluaydzIEJFIFRPKi8KKyAgdEJ0YW1wVExWSENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQgICAqcEJhcEhDSVJlYWRCRUZsdXNoVE8sCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSovCispCit7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFJlYWRCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQV3JpdGVCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0KCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFdyaXRlIEJlc3QgRWZmb3J0IEZsdXNoIFRPIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSVdyaXRlQkVGbHVzaFRPOiAgcG9pbnRlciB0byB0aGUgIkhDSSBXcml0ZSBCRSBGbHVzaCBUTyIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lXcml0ZUJFRmx1c2hUTyBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBXcml0ZUJlc3RFZmZvcnRGbHVzaFRpbWVvdXQKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9Xcml0ZV9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCAgICpwQmFwSENJV3JpdGVCRUZsdXNoVE8sCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispCit7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFdyaXRlQmVzdEVmZm9ydEZsdXNoVGltZW91dCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQU2V0U2hvcnRSYW5nZU1vZGUoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgU2V0IFNob3J0IFJhbmdlIE1vZGUgY29tbWFuZC4gIFRoZXJlIGlzIG5vIG5lZWQgZm9yIAorICAgIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJU2hvcnRSYW5nZU1vZGU6ICBwb2ludGVyIHRvIHRoZSAiSENJIFNldCBTaG9ydCBSYW5nZSBNb2RlIiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVNob3J0UmFuZ2VNb2RlIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFNldFNob3J0UmFuZ2VNb2RlCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kICAgKnBCYXBIQ0lTaG9ydFJhbmdlTW9kZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKykKK3sKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOworICAgIEJUQU1QRlNNX0lOU1RBTkNFREFUQV9UICppbnN0YW5jZVZhciA9ICYoYnRhbXBDb250ZXh0LT5iYXBQaHlzTGlua01hY2hpbmUpOworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICIlczogYnRhbXBIYW5kbGUgdmFsdWU6ICV4IiwgX19GVU5DVElPTl9fLCAgYnRhbXBIYW5kbGUpOworCisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovCisgICAgaWYgKChOVUxMID09IGJ0YW1wSGFuZGxlKSB8fCAoTlVMTCA9PSBwQmFwSENJRXZlbnQpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvKiBWYWxpZGF0ZSB0aGUgQkFQIHN0YXRlIHRvIGFjY2VwdCB0aGUgU2hvcnQgUmFuZ2UgTW9kZSBzZXQgcmVxdWVzdDsKKyAgICAgICBTUk0gc2V0IHJlcXVlc3RzIGFyZSBhbGxvd2VkIG9ubHkgaW4gQ09OTkVDVEVEIHN0YXRlICovCisKKyAgICAvKiBGb3JtIGFuZCByZXR1cm4gdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50Li4uICovCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfU1RBVFVTX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5wcmVzZW50ID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5jb21tYW5kX29wY29kZQorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfU0VUX1NIT1JUX1JBTkdFX01PREVfQ01EOworCisgICAgaWYgKENPTk5FQ1RFRCAhPSBpbnN0YW5jZVZhci0+c3RhdGVWYXIpCisgICAgeworICAgICAgICAvKiBTaG9ydCBSYW5nZSBNb2RlIHJlcXVlc3QgaW4gaW52YWxpZCBzdGF0ZSAqLworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0KKyAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfQ01ORF9ESVNBTExPV0VEOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIH0KKyAgICBlbHNlIGlmIChwQmFwSENJU2hvcnRSYW5nZU1vZGUtPnBoeV9saW5rX2hhbmRsZSAhPSBidGFtcENvbnRleHQtPnBoeV9saW5rX2hhbmRsZSkKKyAgICB7CisgICAgICAgLyogSW52YWxpZCBQaHlzaWNhbCBsaW5rIGhhbmRsZSAqLworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0KKyAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfTk9fQ05DVDsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZSBpZiAocEJhcEhDSVNob3J0UmFuZ2VNb2RlLT5zaG9ydF9yYW5nZV9tb2RlID4gMHgwMSkKKyAgICB7CisgICAgICAgIC8qIEludmFsaWQgbW9kZSByZXF1ZXN0ZWQgKi8KKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnN0YXR1cyA9CisgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnN0YXR1cyA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBTZW5kIHRoZSBDb21tYW5kIFN0YXR1cyBldmVudCAoc3VjY2VzcykgaGVyZSwgc2luY2UgQ2hhbmdlIENvbXBsZXRlIGlzIG5leHQgKi8KKyAgICAoKmJ0YW1wQ29udGV4dC0+cEJhcEhDSUV2ZW50Q0IpCisgICAgICAgICgKKyAgICAgICAgIGJ0YW1wQ29udGV4dC0+cEhkZEhkbCwgICAvKiB0aGlzIHJlZmVycyB0byB0aGUgQlNMIHBlciBjb25uZWN0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgIHBCYXBIQ0lFdmVudCwgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgIFZPU19GQUxTRSAvKiBGbGFnIHRvIGluZGljYXRlIGFzc29jLXNwZWNpZmljIGV2ZW50ICovCisgICAgICAgICk7CisKKyAgICAvKiBGb3JtYXQgdGhlIFNob3J0IFJhbmdlIE1vZGUgQ29tcGxldGUgZXZlbnQgdG8gcmV0dXJuLi4uICovIAorICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9TSE9SVF9SQU5HRV9NT0RFX0NIQU5HRV9DT01QTEVURV9FVkVOVDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBTaG9ydFJhbmdlTW9kZUNoYW5nZUNvbXBsZXRlRXZlbnQucHJlc2VudCA9IDE7CisKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBTaG9ydFJhbmdlTW9kZUNoYW5nZUNvbXBsZXRlRXZlbnQuc3RhdHVzID0KKyAgICAgICAgV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsgLyogQXNzdW1wdGlvbiBmb3Igbm93ICovCisKKyAgICAvKiBUaGUgaW5wdXQgcGFyYW1ldGVycyB3aWxsIGdvIG91dCBpbiB0aGUgQ0MgRXZlbnQgKi8KKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBTaG9ydFJhbmdlTW9kZUNoYW5nZUNvbXBsZXRlRXZlbnQucGh5X2xpbmtfaGFuZGxlID0KKyAgICAgICAgcEJhcEhDSVNob3J0UmFuZ2VNb2RlLT5waHlfbGlua19oYW5kbGU7CisKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBTaG9ydFJhbmdlTW9kZUNoYW5nZUNvbXBsZXRlRXZlbnQuc2hvcnRfcmFuZ2VfbW9kZSA9CisgICAgICAgIHBCYXBIQ0lTaG9ydFJhbmdlTW9kZS0+c2hvcnRfcmFuZ2VfbW9kZTsgLyogQXNzdW1wdGlvbiBmb3Igbm93ICovCisKKyAgICAvKiBJZiB0aGUgcmVxdWVzdGVkIHNldHRpbmcgaXMgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc2V0dGluZy4uLiAqLworICAgIGlmIChwQmFwSENJU2hvcnRSYW5nZU1vZGUtPnNob3J0X3JhbmdlX21vZGUgIT0gYnRhbXBDb250ZXh0LT5waHlfbGlua19zcm0pCisgICAgeworICAgICAgICAvKiAuLi4gdGhlbiBjaGFuZ2UgdGhlIFNSTSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZS4KKyAgICAgICAgICogSWYgdGhlIGF0dGVtcHQgZmFpbHMsIHRoZSBhc3N1bXB0aW9ucyBhYm92ZSBuZWVkIHRvIGJlIGNvcnJlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgICNpZiAwCisgICAgICAgIC8vIFN1Z2dlc3RlZCBBUEksIG5lZWRzIHRvIGJlIGNyZWF0ZWQKKyAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBIQUxTZXRTaG9ydFJhbmdlTW9kZShwQmFwSENJU2hvcnRSYW5nZU1vZGUtPnNob3J0X3JhbmdlX21vZGUpKQorICAgICAgICAjZWxzZQorICAgICAgICBpZiAoMCkKKyAgICAgICAgI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcFNob3J0UmFuZ2VNb2RlQ2hhbmdlQ29tcGxldGVFdmVudC5zdGF0dXMgPQorICAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfSEFSRFdBUkVfRkFJTFVSRTsKKyAgICAgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcFNob3J0UmFuZ2VNb2RlQ2hhbmdlQ29tcGxldGVFdmVudC5zaG9ydF9yYW5nZV9tb2RlID0KKyAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPnBoeV9saW5rX3NybTsgLyogU3dpdGNoIGJhY2sgdG8gY3VycmVudCB2YWx1ZSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBTUk0gc2V0dGluZyBmb3IgdGhpcyBwaHlzaWNhbCBsaW5rLCBzaW5jZSBpdCB3b3JrZWQgKi8KKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+cGh5X2xpbmtfc3JtID0gcEJhcEhDSVNob3J0UmFuZ2VNb2RlLT5zaG9ydF9yYW5nZV9tb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogV0xBTl9CQVBTZXRTaG9ydFJhbmdlTW9kZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFZlbmRvclNwZWNpZmljQ21kMCgpCisKKyAgREVTQ1JJUFRJT04KKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFZlbmRvciBTcGVjaWZpYyBDb21tYW5kIDAgKE9HRiAweDNmLCBPQ0YgMHgwMDAwKS4KKyAgICBUaGVyZSBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIGhhcworICAgIGJlZW4gY29tcGxldGVkLgorCisgICAgVGhlIGNvbW1hbmQgaXMgcmVjZWl2ZWQgd2hlbjoKKyAgICAtIFRoZSBBMk1QIENyZWF0ZSBQaHkgTGluayBSZXNwb25zZSBoYXMgYmVlbiByeCdkIGJ5IHRoZSBCbHVldG9vdGggc3RhY2sgKGluaXRpYXRvcikKKworICBERVBFTkRFTkNJRVMKKyAgICBOQS4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LgorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZworICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJRXZlbnQgaXMgTlVMTAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKworICBTSURFIEVGRkVDVFMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTCitXTEFOX0JBUFZlbmRvclNwZWNpZmljQ21kMAorKAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKQoreworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisgICAgQlRBTVBGU01fSU5TVEFOQ0VEQVRBX1QgKmluc3RhbmNlVmFyID0gJihidGFtcENvbnRleHQtPmJhcFBoeXNMaW5rTWFjaGluZSk7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7CisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8KKyAgICBpZiAoKE5VTEwgPT0gYnRhbXBIYW5kbGUpIHx8IChOVUxMID09IHBCYXBIQ0lFdmVudCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qIFZhbGlkYXRlIHRoZSBCQVAgc3RhdGUgdG8gYWNjZXB0IHRoZSBWZW5kb3IgU3BlY2lmaWMgQ21kIDA6CisgICAgICAgdGhpcyBpcyBvbmx5IGFsbG93ZWQgZm9yIHRoZSBCVF9JTklUSUFUT1IgaW4gdGhlIENPTk5FQ1RJTkcgc3RhdGUgKi8KKworICAgIC8qIEZvcm0gYW5kIHJldHVybiB0aGUgY29tbWFuZCBzdGF0dXMgZXZlbnQuLi4gKi8KKyAgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9TVEFUVVNfRVZFTlQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnByZXNlbnQgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LmNvbW1hbmRfb3Bjb2RlCisgICAgICAgID0gQlRBTVBfVExWX0hDSV9WRU5ET1JfU1BFQ0lGSUNfQ01EXzA7CisKKyAgICBpZiAoIChCVF9JTklUSUFUT1IgIT0gYnRhbXBDb250ZXh0LT5CQVBEZXZpY2VSb2xlKSB8fAorICAgICAgICAgKENPTk5FQ1RJTkcgIT0gaW5zdGFuY2VWYXItPnN0YXRlVmFyKSApCisgICAgeworICAgICAgICAvKiBWZW5kb3IgU3BlY2lmaWMgQ29tbWFuZCAwIGhhcHBlbmVkIGluIGludmFsaWQgc3RhdGUgKi8KKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnN0YXR1cyA9CisgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0NNTkRfRElTQUxMT1dFRDsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvKiBTaWduYWwgQlQgQ29leGlzdGVuY2UgY29kZSBpbiBmaXJtd2FyZSB0byBwcmVmZXIgV0xBTiAqLworICAgIFdMQU5CQVBfTmVlZEJUQ29leFByaW9yaXR5KGJ0YW1wQ29udGV4dCwgMSk7CisKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0gV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsKKworICAgIC8qIFNlbmQgdGhlIENvbW1hbmQgU3RhdHVzIGV2ZW50IChzdWNjZXNzKSBoZXJlLCBzaW5jZSBDb21tYW5kIENvbXBsZXRlIGlzIG5leHQgKi8KKyAgICAoKmJ0YW1wQ29udGV4dC0+cEJhcEhDSUV2ZW50Q0IpCisgICAgICAgICgKKyAgICAgICAgIGJ0YW1wQ29udGV4dC0+cEhkZEhkbCwgICAvKiB0aGlzIHJlZmVycyB0byB0aGUgQlNMIHBlciBjb25uZWN0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgIHBCYXBIQ0lFdmVudCwgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgIFZPU19GQUxTRSAvKiBGbGFnIHRvIGluZGljYXRlIGFzc29jLXNwZWNpZmljIGV2ZW50ICovCisgICAgICAgICk7CisKKyAgICAvKiBGb3JtYXQgdGhlIFZlbmRvciBTcGVjaWZpYyBDb21tYW5kIDAgQ29tcGxldGUgZXZlbnQgdG8gcmV0dXJuLi4uICovCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfQ09NUExFVEVfRVZFTlQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQucHJlc2VudCA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNvbW1hbmRfb3Bjb2RlCisgICAgICAgID0gQlRBTVBfVExWX0hDSV9WRU5ET1JfU1BFQ0lGSUNfQ01EXzA7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuVmVuZG9yX1NwZWNpZmljX0NtZF8wLnN0YXR1cworICAgICAgICA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFZlbmRvclNwZWNpZmljQ21kMCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFZlbmRvclNwZWNpZmljQ21kMSgpCisKKyAgREVTQ1JJUFRJT04KKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFZlbmRvciBTcGVjaWZpYyBDb21tYW5kIDEgKE9HRiAweDNmLCBPQ0YgMHgwMDAxKS4KKyAgICBUaGVyZSBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIGhhcworICAgIGJlZW4gY29tcGxldGVkLgorCisgICAgVGhlIGNvbW1hbmQgaXMgcmVjZWl2ZWQgd2hlbjoKKyAgICAtIEhDSSB3YW50cyB0byBlbmFibGUgdGVzdGFiaWxpdHkKKworICBERVBFTkRFTkNJRVMKKyAgICBOQS4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LgorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZworICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJRXZlbnQgaXMgTlVMTAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKworICBTSURFIEVGRkVDVFMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTCitXTEFOX0JBUFZlbmRvclNwZWNpZmljQ21kMQorKAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKQoreworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7CisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8KKyAgICBpZiAoKE5VTEwgPT0gYnRhbXBIYW5kbGUpIHx8IChOVUxMID09IHBCYXBIQ0lFdmVudCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworCisgICAgYnRhbXBDb250ZXh0LT5idGFtcF9hc3luY19sb2dpY2FsX2xpbmtfY3JlYXRlID0gVFJVRTsKKworCisgICAgLyogRm9ybWF0IHRoZSBWZW5kb3IgU3BlY2lmaWMgQ29tbWFuZCAxIENvbXBsZXRlIGV2ZW50IHRvIHJldHVybi4uLiAqLworICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jb21tYW5kX29wY29kZQorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfVkVORE9SX1NQRUNJRklDX0NNRF8xOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlZlbmRvcl9TcGVjaWZpY19DbWRfMS5zdGF0dXMKKyAgICAgICAgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogV0xBTl9CQVBWZW5kb3JTcGVjaWZpY0NtZDEgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgREVTQ1JJUFRJT04gICAKKyAgICBDYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwgZm9yIEJBUCwgdGhpcyBpcyByZXF1aXJlZCBpbiBvcmRlciBmb3IKKyAgICBUTCB0byBpbmZvcm0gQkFQLCB0aGF0IHRoZSBmbHVzaCBvcGVyYXRpb24gcmVxdWVzdGVkIGhhcyBiZWVuIGNvbXBsZXRlZC4gCisgICAgCisgICAgVGhlIHJlZ2lzdGVyZWQgcmVjZXB0aW9uIGNhbGxiYWNrIGlzIGJlaW5nIHRyaWdnZXJlZCBieSBUTCB3aGVuZXZlciBhIAorICAgIGZyYW1lIFNJUl9UTF9IQUxfRkxVU0hfQUNfUlNQIGlzIHJlY2VpdmVkIGJ5IFRMIGZyb20gSEFMLgorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgIHVjU3RhSWQ6ICAgICAgICBzdGF0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0ZWQgdmFsdWUKKyAgICB1Y1RpZDogICAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgdHNwZWMgCisgICAgc3RhdHVzOiAgICAgICAgIHN0YXR1cyBvZiB0aGUgRmx1c2ggb3BlcmF0aW9uCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIFdMQU5CQVBfVExGbHVzaENvbXBDYWxsYmFjaworKCAKKyAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKKyAgdl9VOF90ICAgICAgICB1Y1N0YUlkLCAKKyAgdl9VOF90ICAgICAgICB1Y1RJRCwgCisgIHZfVThfdCAgICAgICAgc3RhdHVzCispCit7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvLyBXTEFOQkFQX1RMRmx1c2hDb21wQ2FsbGJhY2sKKworCisvKiBFbmQgb2YgdjMuMCBIb3N0IENvbnRyb2xsZXIgYW5kIEJhc2ViYW5kIENvbW1hbmRzICovCisKKworIAorCisKZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBBcGlJbmZvLmMgYi9DT1JFL0JBUC9zcmMvYmFwQXBpSW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDNjODQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYmFwQXBpSW5mby5jCkBAIC0wLDAgKzEsNjA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIGIgYSBwIEEgcCBpIEkgbiBmIG8gLiBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBPVkVSVklFVzoKKyAgCisgIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gQkFQIG1vZHVsZXMKKyAgSW5mb3JtYXRpb24gZnVuY3Rpb25zLgorICAKKyAgVGhlIGZ1bmN0aW9ucyBleHRlcm5hbGl6ZWQgYnkgdGhpcyBtb2R1bGUgYXJlIHRvIGJlIGNhbGxlZCBPTkxZIGJ5IG90aGVyIAorICBXTEFOIG1vZHVsZXMgKEhERCkgdGhhdCBwcm9wZXJseSByZWdpc3RlciB3aXRoIHRoZSBCQVAgTGF5ZXIgaW5pdGlhbGx5LgorCisgIERFUEVOREVOQ0lFUzogCisKKyAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuIAorICAKKyAgCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgICRIZWFkZXI6IC9jeWdkcml2ZS9jL0Ryb3Bib3gvTTcyMDFKU0RDQUFQQUQ1MjI0MEIvV00vcGxhdGZvcm0vbXNtNzIwMC9TcmMvRHJpdmVycy9TRC9DbGllbnREcml2ZXJzL1dMQU4vUUNUX0JUQU1QX1BBTC9DT1JFL0JBUC9zcmMvYmFwQXBpSW5mby5jLHYgMS4yIDIwMDgvMTEvMTAgMjI6NTU6MjQganptdWRhIEV4cCBqem11ZGEgJCREYXRlVGltZSQkQXV0aG9yOiBqem11ZGEgJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjAwOC0wOS0xNSAgICBqZXogICAgIENyZWF0ZWQgbW9kdWxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIgorI2luY2x1ZGUgInZvc190cmFjZS5oIgorI2luY2x1ZGUgInNtZV9BcGkuaCIKKy8qIEJULUFNUCBQQUwgQVBJIGhlYWRlciBmaWxlICovIAorI2luY2x1ZGUgImJhcEFwaS5oIiAKKyNpbmNsdWRlICJiYXBJbnRlcm5hbC5oIiAKKworLy8jZGVmaW5lIEJBUF9ERUJVRworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsaXplZCBGdW5jdGlvbiBEZWZpbml0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qIEluZm9ybWF0aW9uYWwgUGFyYW1ldGVycyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRMb2NhbFZlcnNpb25JbmZvKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlYWQgTG9jYWwgVmVyc2lvbiBJbmZvIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgLy8gVGhlcmUgYXJlIHJlYWxseSBubyBpbnB1dCBwYXJhbWV0ZXJzIGluIHRoaXMgY29tbWFuZC4gIAorICAgIC8vIEp1c3QgdGhlIGNvbW1hbmQgb3Bjb2RlIGl0c2VsZiBpcyBzdWZmaWNpZW50LgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lSZWFkTG9jYWxWZXJzaW9uSW5mbyBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkTG9jYWxWZXJzaW9uSW5mbworKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nICJSZWFkIiBDb21tYW5kIENvbXBsZXRlKi8KKykKK3sKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoYnRhbXBIYW5kbGUgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnRhbXBIYW5kbGUgdmFsdWU6ICV4IiwgX19GVU5DVElPTl9fLCAgYnRhbXBIYW5kbGUpOyAKKworCisgICAgLyogRm9ybWF0IHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IHRvIHJldHVybi4uLiAqLyAKKyAgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9DT01QTEVURV9FVkVOVDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5wcmVzZW50ID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY29tbWFuZF9vcGNvZGUgCisgICAgICAgID0gQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT19DTUQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm8uc3RhdHVzIAorICAgICAgICA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm8uSENfSENJX1ZlcnNpb24KKyAgICAgICAgPSBXTEFOQkFQX0hDSV9WRVJTSU9OOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTG9jYWxfVmVyc2lvbl9JbmZvLkhDX0hDSV9SZXZpc2lvbgorICAgICAgICA9IFdMQU5CQVBfSENJX1JFVklTSU9OOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTG9jYWxfVmVyc2lvbl9JbmZvLkhDX1BBTF9WZXJzaW9uCisgICAgICAgID0gV0xBTkJBUF9QQUxfVkVSU0lPTjsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xvY2FsX1ZlcnNpb25fSW5mby5IQ19NYW51ZmFjX05hbWUKKyAgICAgICAgPSBXTEFOQkFQX1FVQUxDT01NX0NPTVBBTllfSUQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm8uSENfUEFMX1N1Yl9WZXJzaW9uCisgICAgICAgID0gV0xBTkJBUF9QQUxfU1VCVkVSU0lPTjsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQUmVhZExvY2FsVmVyc2lvbkluZm8gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZWFkTG9jYWxTdXBwb3J0ZWRDbWRzKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlYWQgTG9jYWwgU3VwcG9ydGVkIENvbW1hbmRzLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIC8vIFRoZXJlIGFyZSByZWFsbHkgbm8gaW5wdXQgcGFyYW1ldGVycyBpbiB0aGlzIGNvbW1hbmQuICAKKyAgICAvLyBKdXN0IHRoZSBjb21tYW5kIG9wY29kZSBpdHNlbGYgaXMgc3VmZmljaWVudC4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZExvY2FsU3VwcG9ydGVkQ21kcyBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkTG9jYWxTdXBwb3J0ZWRDbWRzCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgIlJlYWQiIENvbW1hbmQgQ29tcGxldGUqLworKQoreworICAgIHZfVThfdCBzdXBwb3J0ZWRDbWRzW10gPSBXTEFOQkFQX1BBTF9TVVBQT1JURURfSENJX0NNRFM7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoYnRhbXBIYW5kbGUgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnRhbXBIYW5kbGUgdmFsdWU6ICV4IiwgX19GVU5DVElPTl9fLCAgYnRhbXBIYW5kbGUpOyAKKworCisgICAgLyogRm9ybWF0IHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IHRvIHJldHVybi4uLiAqLyAKKyAgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9DT01QTEVURV9FVkVOVDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5wcmVzZW50ID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY29tbWFuZF9vcGNvZGUgCisgICAgICAgID0gQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9DTURTX0NNRDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzLnN0YXR1cyAKKyAgICAgICAgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworICAgIC8qIFJldHVybiB0aGUgc3VwcG9ydGVkIGNvbW1hbmRzIGJpdG1hc2sgKi8gCisgICAgdm9zX21lbV9jb3B5KCAKKyAgICAgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHMuSENfU3VwcG9ydF9DbWRzLAorICAgICAgICAgICAgc3VwcG9ydGVkQ21kcywKKyAgICAgICAgICAgIHNpemVvZiggc3VwcG9ydGVkQ21kcykpOyAgICAKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQUmVhZExvY2FsU3VwcG9ydGVkQ21kcyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRCdWZmZXJTaXplKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlYWQgQnVmZmVyIFNpemUgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJUmVhZEJ1ZmZlclNpemU6ICBwb2ludGVyIHRvIHRoZSAiSENJIFJlYWQgQnVmZmVyIFNpemUiIFN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZEJ1ZmZlclNpemUgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVhZEJ1ZmZlclNpemUKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSovCispCit7CisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovIAorICAgIGlmIChidGFtcEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7IAorCisKKyAgICAvKiBGb3JtYXQgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgdG8gcmV0dXJuLi4uICovIAorICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jb21tYW5kX29wY29kZSAKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX1JFQURfQlVGRkVSX1NJWkVfQ01EOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfQnVmZmVyX1NpemUuc3RhdHVzIAorICAgICAgICA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisgICAgLyogUmV0dXJuIHRoZSBzdXBwb3J0ZWQgQnVmZmVyIHNpemVzICovIAorICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfQnVmZmVyX1NpemUuSENfQUNMX0RhdGFfUGFja2V0X0xlbmd0aAorICAgICAgICA9IFdMQU5CQVBfTUFYXzgwMjExX1BBTF9QRFVfU0laRTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0J1ZmZlcl9TaXplLkhDX1NDT19QYWNrZXRfTGVuZ3RoCisgICAgICAgID0gMDsgLyogSW52YWxpZCBhc3NpZ25tZW50IHRvIFVpbnQ4LCBtYWtlcyAwICovCisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9CdWZmZXJfU2l6ZS5IQ19Ub3RhbF9OdW1fQUNMX1BhY2tldHMKKyAgICAgICAgPSAxNjsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0J1ZmZlcl9TaXplLkhDX1RvdGFsX051bV9TQ09fUGFja2V0cworICAgICAgICA9IDA7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFJlYWRCdWZmZXJTaXplICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVhZERhdGFCbG9ja1NpemUoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBEYXRhIEJsb2NrIFNpemUgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZERhdGFCbG9ja1NpemUgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUmVhZERhdGFCbG9ja1NpemUKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyAiUmVhZCIgQ29tbWFuZCBDb21wbGV0ZSovCispCit7CisgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICBpZiAoKGJ0YW1wSGFuZGxlID09IE5VTEwpIHx8IChOVUxMID09IHBCYXBIQ0lFdmVudCkpCisgICB7CisgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7IAorCisKKyAgIC8qIEZvcm1hdCB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudCB0byByZXR1cm4uLi4gKi8gCisgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9DT01QTEVURV9FVkVOVDsKKyAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSAxOworICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY29tbWFuZF9vcGNvZGUgCisgICAgICAgPSBCVEFNUF9UTFZfSENJX1JFQURfREFUQV9CTE9DS19TSVpFX0NNRDsKKyAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfRGF0YV9CbG9ja19TaXplLnN0YXR1cyAKKyAgICAgICA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisgICAvKiBSZXR1cm4gdGhlIHN1cHBvcnRlZCBCbG9jayBzaXplcyAqLyAKKyAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfRGF0YV9CbG9ja19TaXplLkhDX0RhdGFfQmxvY2tfTGVuZ3RoCisgICAgICAgPSBXTEFOQkFQX01BWF84MDIxMV9QQUxfUERVX1NJWkU7CisgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0RhdGFfQmxvY2tfU2l6ZS5IQ19NYXhfQUNMX0RhdGFfUGFja2V0X0xlbmd0aAorICAgICAgID0gV0xBTkJBUF9NQVhfODAyMTFfUEFMX1BEVV9TSVpFOworICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9EYXRhX0Jsb2NrX1NpemUuSENfVG90YWxfTnVtX0RhdGFfQmxvY2tzCisgICAgICAgPSAxNjsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQUmVhZERhdGFCbG9ja1NpemUgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFNldENvbmZpZygpCisKKyAgREVTQ1JJUFRJT04gCisgICAgIFRoZSBmdW5jdGlvbiB1cGRhdGVzIHNvbWUgY29uZmlndXJhdGlvbiBmb3IgQkFQIG1vZHVsZSBpbiBTTUUgZHVyaW5nIFNNRXMKKyAgICAgY2xvc2UgLT4gb3BlbiBzZXF1ZW5jZS4KKyAgIAorICAgICBCQVAgYXBwbGllcyB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gYXQgdGhlIG5leHQgdHJhbnNhY3Rpb24uCisKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSVJlYWRSU1NJOiAgcG9pbnRlciB0byB0aGUgIkhDSSBSZWFkIFJTU0kiIHN0cnVjdHVyZS4KKyAgIAorICAgIElOCisgICAgcENvbmZpZzogYSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdHlwZWRlZiBzdHJ1Y3QgV0xBTkJBUF9Db25maWdUeXBlLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBDb25maWcgb3IgYnRhbXBIYW5kbGUgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQU2V0Q29uZmlnCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICBXTEFOQkFQX0NvbmZpZ1R5cGUgKnBDb25maWcKKykKK3sKKyAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dDsKKyAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgIGlmICgoTlVMTCA9PSBidGFtcEhhbmRsZSl8fCAoTlVMTCA9PSBwQ29uZmlnKSkgCisgICB7CisgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisgICBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOyAvKiBidGFtcENvbnRleHQgdmFsdWUgKi8gCisKKyAgIGJ0YW1wQ29udGV4dC0+Y29uZmlnLnVjUHJlZmVycmVkQ2hhbm5lbCA9IHBDb25maWctPnVjUHJlZmVycmVkQ2hhbm5lbDsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQR2V0TWFzaygpCisKKyAgREVTQ1JJUFRJT04gCisgICAgIFRoZSBmdW5jdGlvbiBnZXRzIHRoZSB1cGRhdGVkIGV2ZW50IG1hc2sgZnJvbSBCQVAgY29yZS4KKyAgIAorCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIAorICAgCisgICAgSU4KKyAgICBwRXZlbnRfbWFza19wYWdlXzI6IGEgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIDggYnl0ZXMuCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcEV2ZW50X21hc2tfcGFnZV8yIG9yIGJ0YW1wSGFuZGxlIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUworV0xBTl9CQVBHZXRNYXNrKCBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLCAKKyAgICAgICAgICAgICAgICAgdl9VOF90ICAgICAgICpwRXZlbnRfbWFza19wYWdlXzIpCit7CisgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQ7CisgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICBpZiAoKE5VTEwgPT0gYnRhbXBIYW5kbGUpfHwgKE5VTEwgPT0gcEV2ZW50X21hc2tfcGFnZV8yKSkgCisgICB7CisgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisgICBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOyAvKiBidGFtcENvbnRleHQgdmFsdWUgKi8gCisKKyAgIHZvc19tZW1fY29weSggcEV2ZW50X21hc2tfcGFnZV8yLCAKKyAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5ldmVudF9tYXNrX3BhZ2VfMiwgCisgICAgICAgICAgICAgICAgIDggKTsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQRGlzY29ubmVjdCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgIFRoZSBmdW5jdGlvbiB0byByZXF1ZXN0IHRvIEJBUCBjb3JlIHRvIGRpc2Nvbm5lY3QgY3VycmVjbnQgQU1QIGNvbm5lY3Rpb24uCisgICAKKworCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBidGFtcEhhbmRsZSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBEaXNjb25uZWN0CisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlCispCit7CisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsKKyAgICB0V0xBTl9CQVBFdmVudCBiYXBFdmVudDsgLyogU3RhdGUgbWFjaGluZSBldmVudCAqLworICAgIHZfVThfdCBzdGF0dXM7ICAgIC8qIHJldHVybiB0aGUgQlQtQU1QIHN0YXR1cyBoZXJlICovCisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzOworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsgCisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKGJ0YW1wSGFuZGxlID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgImJ0YW1wSGFuZGxlIGlzIE5VTEwgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLyAKKyAgICBiYXBFdmVudC5ldmVudCA9IGVXTEFOX0JBUF9NQUNfSU5ESUNBVEVTX01FRElBX0RJU0NPTk5FQ1RJT047CisgICAgYmFwRXZlbnQucGFyYW1zID0gTlVMTDsKKworCisgICAgLyogSGFuZGxlIGV2ZW50ICovIAorICAgIHZvc1N0YXR1cyA9IGJ0YW1wRnNtKGJ0YW1wQ29udGV4dCwgJmJhcEV2ZW50LCAmc3RhdHVzKTsKKworCisgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLyAKKyAgICBiYXBFdmVudC5ldmVudCA9ICBlV0xBTl9CQVBfTUFDX1JFQURZX0ZPUl9DT05ORUNUSU9OUzsKKyAgICBiYXBFdmVudC5wYXJhbXMgPSBOVUxMOworCisgICAgICAgIC8qIEhhbmRsZSBldmVudCAqLyAKKyAgICB2b3NTdGF0dXMgPSBidGFtcEZzbShidGFtcENvbnRleHQsICZiYXBFdmVudCwgJnN0YXR1cyk7CisKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQU2Vzc2lvbk9uKCkKKworICBERVNDUklQVElPTiAKKyAgICAgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrIGZyb20gQkFQIGNvcmUgaWYgQU1QIGNvbm5lY3Rpb24gaXMgdXAgcmlnaHQgbm93LgorICAgCisKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfVFJVRTogIEFNUCBjb25uZWN0aW9uIGlzIG9uIAorICAgIFZPU19GQUxTRTogQU1QIGNvbm5lY3Rpb24gaXMgbm90IG9uCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X0JPT0xfdCBXTEFOX0JBUFNlc3Npb25PbgorKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZQorKQoreworICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsgCisKKyAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgIGlmIChidGFtcEhhbmRsZSA9PSBOVUxMKSAKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJidGFtcEhhbmRsZSBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgIC8vPz8gc2hhbGwgd2Ugc2F5IHRydWUgb3IgZmFsc2UKKyAgICAgICByZXR1cm4gVk9TX0ZBTFNFOworICAgfQorCisgICByZXR1cm4gYnRhbXBDb250ZXh0LT5idGFtcF9zZXNzaW9uX29uOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcEFwaUxpbmtDbnRsLmMgYi9DT1JFL0JBUC9zcmMvYmFwQXBpTGlua0NudGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTJhMzNkCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcEFwaUxpbmtDbnRsLmMKQEAgLTAsMCArMSwxOTM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIGIgYSBwIEEgcCBpIEwgaSBuIGsgQyBuIHQgbCAuIEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIE9WRVJWSUVXOgorICAKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBCQVAgbW9kdWxlcworICBMaW5rIENvbnRyb2wgZnVuY3Rpb25zLgorICAKKyAgVGhlIGZ1bmN0aW9ucyBleHRlcm5hbGl6ZWQgYnkgdGhpcyBtb2R1bGUgYXJlIHRvIGJlIGNhbGxlZCBPTkxZIGJ5IG90aGVyIAorICBXTEFOIG1vZHVsZXMgKEhERCkgdGhhdCBwcm9wZXJseSByZWdpc3RlciB3aXRoIHRoZSBCQVAgTGF5ZXIgaW5pdGlhbGx5LgorCisgIERFUEVOREVOQ0lFUzogCisKKyAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuIAorICAKKyAgCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgICRIZWFkZXI6IC9ob21lL2xhYnVzZXIvYW1wQmx1ZVpfMi9DT1JFL0JBUC9zcmMvYmFwQXBpTGlua0NudGwuYyx2IDEuMSAyMDEwLzEwLzIzIDIzOjQwOjI4IGxhYnVzZXIgRXhwIGxhYnVzZXIgJCREYXRlVGltZSQkQXV0aG9yOiBsYWJ1c2VyICQKKworCisgIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwMDgtMDktMTUgICAgamV6ICAgICBDcmVhdGVkIG1vZHVsZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8jaW5jbHVkZSAid2xhbl9xY3RfdGwuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKy8vIFBpY2sgdXAgdGhlIENTUiBjYWxsYmFjayBkZWZpbml0aW9uCisjaW5jbHVkZSAiY3NyQXBpLmgiCisKKy8qIEJULUFNUCBQQUwgQVBJIGhlYWRlciBmaWxlICovIAorI2luY2x1ZGUgImJhcEFwaS5oIiAKKyNpbmNsdWRlICJiYXBJbnRlcm5hbC5oIiAKKyNpbmNsdWRlICJidGFtcEZzbS5oIgorCisvLyNkZWZpbmUgQkFQX0RFQlVHCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHbG9iYWwgRGF0YSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIFZhcmlhYmxlIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRXh0ZXJuYWxpemVkIEZ1bmN0aW9uIERlZmluaXRpb25zCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRG9jdW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfUm9hbUNhbGxiYWNrKCkKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsYmFjayBmb3IgUm9hbSAoY29ubmVjdGlvbiBzdGF0dXMpIEV2ZW50cyAgCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICAgIHBDb250ZXh0OiAgaXMgdGhlIHBDb250ZXh0IHBhc3NlZCBpbiB3aXRoIHRoZSByb2FtIHJlcXVlc3QKKyAgICAgIHBDc3JSb2FtSW5mbzogaXMgYSBwb2ludGVyIHRvIGEgdENzclJvYW1JbmZvLCBzZWUgZGVmaW5pdGlvbiBvZiBlUm9hbUNtZFN0YXR1cyBhbmQKKyAgICAgIGVSb2FtQ21kUmVzdWx0OiBmb3IgZGV0YWlsIHZhbGlkIG1lbWJlcnMuIEl0IG1heSBiZSBOVUxMCisgICAgICByb2FtSWQ6IGlzIHRvIGlkZW50aWZ5IHRoZSBjYWxsYmFjayByZWxhdGVkIHJvYW0gcmVxdWVzdC4gMCBtZWFucyB1bnNvbGljaXRlZAorICAgICAgcm9hbVN0YXR1czogaXMgYSBmbGFnIGluZGljYXRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgY2FsbGJhY2sKKyAgICAgIHJvYW1SZXN1bHQ6IGlzIHRoZSByZXN1bHQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgZUhhbFN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAwCitlQ1NSX1JPQU1fUkVTVUxUX1dEU19TVEFSVEVEIAorI2RlZmluZSBlV0xBTl9CQVBfTUFDX1NUQVJUX0JTU19TVUNDRVNTIC8qIGJhcFJvYW1Db21wbGV0ZUNhbGxiYWNrIHdpdGggZUNTUl9ST0FNX1JFU1VMVF9XRFNfU1RBUlRFRCAqLworCitlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUgCitlQ1NSX1JPQU1fUkVTVUxUX05PVF9BU1NPQ0lBVEVECisjZGVmaW5lIGVXTEFOX0JBUF9NQUNfU1RBUlRfRkFJTFMgLyogYmFwUm9hbUNvbXBsZXRlQ2FsbGJhY2sgd2l0aCBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUgb3IgZUNTUl9ST0FNX1JFU1VMVF9OT1RfQVNTT0NJQVRFRCAqLworCitlQ1NSX1JPQU1fUkVTVUxUX1dEU19BU1NPQ0lBVEVECisjZGVmaW5lIGVXTEFOX0JBUF9NQUNfQ09OTkVDVF9DT01QTEVURUQgLyogYmFwUm9hbUNvbXBsZXRlQ2FsbGJhY2sgd2l0aCBlQ1NSX1JPQU1fUkVTVUxUX1dEU19BU1NPQ0lBVEVEICovCisKKworZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFIAorZUNTUl9ST0FNX1JFU1VMVF9OT1RfQVNTT0NJQVRFRCAKKyNkZWZpbmUgZVdMQU5fQkFQX01BQ19DT05ORUNUX0ZBSUxFRCAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSBvciBlQ1NSX1JPQU1fUkVTVUxUX05PVF9BU1NPQ0lBVEVEICovCisKKworZUNTUl9ST0FNX1JFU1VMVF9XRFNfQVNTT0NJQVRJT05fSU5ECisjZGVmaW5lIGVXTEFOX0JBUF9NQUNfQ09OTkVDVF9JTkRJQ0FUSU9OIC8qIGJhcFJvYW1Db21wbGV0ZUNhbGxiYWNrIHdpdGggZUNTUl9ST0FNX1JFU1VMVF9XRFNfQVNTT0NJQVRJT05fSU5EICovCisKKworZUNTUl9ST0FNX1JFU1VMVF9LRVlfU0VUIAorI2RlZmluZSBlV0xBTl9CQVBfTUFDX0tFWV9TRVRfU1VDQ0VTUyAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfS0VZX1NFVCAqLworCisKK2VDU1JfUk9BTV9SRVNVTFRfV0RTX0RJU0FTU09DX0lORAorI2RlZmluZSBlV0xBTl9CQVBfTUFDX0lORElDQVRFU19NRURJQV9ESVNDT05ORUNUSU9OIC8qIGJhcFJvYW1Db21wbGV0ZUNhbGxiYWNrIHdpdGggZUNTUl9ST0FNX1JFU1VMVF9XRFNfRElTQVNTT0NfSU5EICovCisKKworZUNTUl9ST0FNX1JFU1VMVF9XRFNfU1RPUFBFRAorI2RlZmluZSBlV0xBTl9CQVBfTUFDX1JFQURZX0ZPUl9DT05ORUNUSU9OUyAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUT1BQRUQgKi8KKworI2VuZGlmIC8vMAorCisKK2VIYWxTdGF0dXMKK1dMQU5CQVBfUm9hbUNhbGxiYWNrCisoCisgIHZvaWQgKnBDb250ZXh0LCAKKyAgdENzclJvYW1JbmZvICpwQ3NyUm9hbUluZm8sCisgIHRBTklfVTMyIHJvYW1JZCwgCisgIGVSb2FtQ21kU3RhdHVzIHJvYW1TdGF0dXMsIAorICBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0CispCit7CisgICAgZUhhbFN0YXR1cyAgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsgCisgICAgLyogYnRhbXBDb250ZXh0IHZhbHVlICovICAgIAorICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgcENvbnRleHQ7IAorICAgIHRXTEFOX0JBUEV2ZW50IGJhcEV2ZW50OyAvKiBTdGF0ZSBtYWNoaW5lIGV2ZW50ICovCisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOyAKKyAgICB2X1U4X3Qgc3RhdHVzOyAgICAvKiByZXR1cm4gdGhlIEJULUFNUCBzdGF0dXMgaGVyZSAqLworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBiZWZvcmUgc3dpdGNoIG9uIHJvYW1TdGF0dXMgPSAlZCIsIF9fRlVOQ1RJT05fXywgcm9hbVN0YXR1cyk7CisKKyAgICBzd2l0Y2ggKHJvYW1TdGF0dXMpIHsKKyAgICAgICAgLy9KRVowODExMTA6IEZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3aXRoIEluZnJhIFNUQSBhcyBCVCBTVEEsIHRoaXMgCisgICAgICAgIC8vYWN0dWFsbHkgdGFrZXMgY2FyZSBvZiB0aGUgImVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUQVJURUQiIGNhc2UsIAorICAgICAgICAvL2JlbG93LCBiZXR0ZXIgdGhhbiAiZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1NUQVJURUQiLiAgCisgICAgICAgIC8vY2FzZSBlQ1NSX1JPQU1fUk9BTUlOR19TVEFSVDogCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX0FTU09DSUFUSU9OX1NUQVJUOiAKKyAgICAgICAgICAgIC8qIGJhcFJvYW1Db21wbGV0ZUNhbGxiYWNrIHdpdGggZUNTUl9ST0FNX1JFU1VMVF9XRFNfU1RBUlRFRCAqLworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUk9BTUlOR19TVEFSVCIsIHJvYW1SZXN1bHQpOyAgIAorICAgICAgICAgICAgLy8gVGhpcyBvbmx5IGdldHMgY2FsbGVkIHdoZW4gQ1NSIGRlY2lkZXMgdG8gcm9hbSBvbiBpdHMgb3duIC0gZHVlIHRvIGxvc3RsaW5rLiAKKyNpZiAwCisgICAgICAgICAgICBpZiAoKHBDc3JSb2FtSW5mbykgJiYgKHBDc3JSb2FtSW5mby0+cENvbm5lY3RlZFByb2ZpbGUpICYmIChwQ3NyUm9hbUluZm8tPnBDb25uZWN0ZWRQcm9maWxlLT5wQnNzRGVzYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGJzc2lkLmV0aGVyX2FkZHJfb2N0ZXQsIHBDc3JSb2FtSW5mby0+cENvbm5lY3RlZFByb2ZpbGUtPnBCc3NEZXNjLT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7IAorICAgICAgICAgICAgICAgIGFwcGxlODAyMTFJbnRlcmZhY2UtPndpbGxSb2FtKCZic3NpZCk7ICAvLyBSZXR1cm4gcmVzdWx0IGlzbid0IHNpZ25pZmljYW50IAorICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogd2lsbFJvYW0gcmV0dXJuc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLzAKKyAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLyAKKyAgICAgICAgICAgIGJhcEV2ZW50LmV2ZW50ID0gZVdMQU5fQkFQX01BQ19TVEFSVF9CU1NfU1VDQ0VTUzsgCisgICAgICAgICAgICBiYXBFdmVudC5wYXJhbXMgPSBwQ3NyUm9hbUluZm87CisgICAgICAgICAgICBiYXBFdmVudC51MSA9IHJvYW1TdGF0dXM7CisgICAgICAgICAgICBiYXBFdmVudC51MiA9IHJvYW1SZXN1bHQ7CisKKyAgICAgICAgICAgIC8qIEhhbmRsZSBldmVudCAqLyAKKyAgICAgICAgICAgIHZvc1N0YXR1cyA9IGJ0YW1wRnNtKGJ0YW1wQ29udGV4dCwgJmJhcEV2ZW50LCAmc3RhdHVzKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fU0VUX0tFWV9DT01QTEVURToKKyAgICAgICAgICAgIC8qIGJhcFJvYW1Db21wbGV0ZUNhbGxiYWNrIHdpdGggZUNTUl9ST0FNX1NFVF9LRVlfQ09NUExFVEUgKi8KKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1TdGF0dXMgPSAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1NFVF9LRVlfQ09NUExFVEUiLCByb2FtU3RhdHVzKTsgICAKKworICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovIAorICAgICAgICAgICAgYmFwRXZlbnQuZXZlbnQgPSBlV0xBTl9CQVBfTUFDX0tFWV9TRVRfU1VDQ0VTUzsgCisgICAgICAgICAgICBiYXBFdmVudC5wYXJhbXMgPSBwQ3NyUm9hbUluZm87CisgICAgICAgICAgICBiYXBFdmVudC51MSA9IHJvYW1TdGF0dXM7CisgICAgICAgICAgICBiYXBFdmVudC51MiA9IHJvYW1SZXN1bHQ7CisKKyAgICAgICAgICAgIC8qIEhhbmRsZSBldmVudCAqLyAKKyAgICAgICAgICAgIHZvc1N0YXR1cyA9IGJ0YW1wRnNtKGJ0YW1wQ29udGV4dCwgJmJhcEV2ZW50LCAmc3RhdHVzKTsKKyAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9ESVNBU1NPQ0lBVEVEOiAKKyAgICAgICAgICAgIC8qIGJhcFJvYW1Db21wbGV0ZUNhbGxiYWNrIHdpdGggZUNTUl9ST0FNX0RJU0FTU09DSUFURUQgKi8KKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1TdGF0dXMgPSAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX0RJU0FTU09DSUFURUQiLCByb2FtU3RhdHVzKTsgICAKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fTE9TVExJTks6CisgICAgICAgICAgICAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9MT1NUTElOSyAqLworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVN0YXR1cyA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fTE9TVExJTksiLCByb2FtU3RhdHVzKTsgICAKKworICAgICAgICAgICAgaWYgKHJvYW1SZXN1bHQgIT0gZUNTUl9ST0FNX1JFU1VMVF9OT05FKSB7CisgICAgICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovIAorICAgICAgICAgICAgICAgIGJhcEV2ZW50LmV2ZW50ID0gZVdMQU5fQkFQX01BQ19SRUFEWV9GT1JfQ09OTkVDVElPTlM7IAorICAgICAgICAgICAgICAgIGJhcEV2ZW50LnBhcmFtcyA9IHBDc3JSb2FtSW5mbzsKKyAgICAgICAgICAgICAgICBiYXBFdmVudC51MSA9IHJvYW1TdGF0dXM7CisgICAgICAgICAgICAgICAgYmFwRXZlbnQudTIgPSByb2FtUmVzdWx0OyAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiBIYW5kbGUgZXZlbnQgKi8gCisgICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gYnRhbXBGc20oYnRhbXBDb250ZXh0LCAmYmFwRXZlbnQsICZzdGF0dXMpOworICAgICAgICAgICAgfQorICAKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIHVuc3VwcG9ydGVkIENTUiByb2FtU3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJvYW1TdGF0dXMpOworCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGJlZm9yZSBzd2l0Y2ggb24gcm9hbVJlc3VsdCA9ICVkIiwgX19GVU5DVElPTl9fLCByb2FtUmVzdWx0KTsKKworICAgIHN3aXRjaCAocm9hbVJlc3VsdCkgeworICAgICAgICAvL0pFWjA4MTExMDogQ29tbWVudGVkIG91dCBmb3IgdGVzdGluZy4gVGVzdCByZWxpZXMgdXBvbiBJQlNTLiAKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfU1RBUlRFRDogIAorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfU1RBUlRFRCIsIHJvYW1SZXN1bHQpOyAgIAorICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUQVJURUQ6IAorICAgICAgICAgICAgLyogYmFwUm9hbUNvbXBsZXRlQ2FsbGJhY2sgd2l0aCBlQ1NSX1JPQU1fUkVTVUxUX1dEU19TVEFSVEVEICovCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUQVJURUQiLCByb2FtUmVzdWx0KTsgICAKKworICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovIAorICAgICAgICAgICAgYmFwRXZlbnQuZXZlbnQgPSBlV0xBTl9CQVBfTUFDX1NUQVJUX0JTU19TVUNDRVNTOyAKKyAgICAgICAgICAgIGJhcEV2ZW50LnBhcmFtcyA9IHBDc3JSb2FtSW5mbzsKKyAgICAgICAgICAgIGJhcEV2ZW50LnUxID0gcm9hbVN0YXR1czsKKyAgICAgICAgICAgIGJhcEV2ZW50LnUyID0gcm9hbVJlc3VsdDsKKworICAgICAgICAgICAgLyogSGFuZGxlIGV2ZW50ICovIAorICAgICAgICAgICAgdm9zU3RhdHVzID0gYnRhbXBGc20oYnRhbXBDb250ZXh0LCAmYmFwRXZlbnQsICZzdGF0dXMpOworICAKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vSkVaMDgxMTEwOiBDb21tZW50ZWQgb3V0IGZvciB0ZXN0aW5nLiBUZXN0IHJlbGllcyB1cG9uIElCU1MuIAorICAgICAgICAvL0pFWjA4MTExMDogQnV0IEkgY2Fubm90IHJlbHkgdXBvbiBJQlNTIGZvciB0aGUgaW5pdGlhbCB0ZXN0aW5nLiAKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkU6IAorICAgICAgICAvL2Nhc2UgZUNTUl9ST0FNX1JFU1VMVF9OT1RfQVNTT0NJQVRFRDoKKyAgICAgICAgLy9jYXNlIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19TVEFSVF9GQUlMRUQ6CisgICAgICAgICAgICAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSBvciBlQ1NSX1JPQU1fUkVTVUxUX05PVF9BU1NPQ0lBVEVEICovCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSIsIHJvYW1SZXN1bHQpOyAgIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX1dEU19TVEFSVF9GQUlMRUQ6CisgICAgICAgICAgICAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUQVJUX0ZBSUxFRCAqLworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX1dEU19TVEFSVF9GQUlMRUQiLCByb2FtUmVzdWx0KTsgICAKKworICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovIAorICAgICAgICAgICAgLyogSSBkb24ndCB0aGluayBJIHNob3VsZCBzaWduYWwgYSBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUgCisgICAgICAgICAgICAgKiBhcyBhIGVXTEFOX0JBUF9NQUNfU1RBUlRfRkFJTFMKKyAgICAgICAgICAgICAqLyAKKyAgICAgICAgICAgIGJhcEV2ZW50LmV2ZW50ID0gZVdMQU5fQkFQX01BQ19TVEFSVF9GQUlMUzsgCisgICAgICAgICAgICBiYXBFdmVudC5wYXJhbXMgPSBwQ3NyUm9hbUluZm87CisgICAgICAgICAgICBiYXBFdmVudC51MSA9IHJvYW1TdGF0dXM7CisgICAgICAgICAgICBiYXBFdmVudC51MiA9IHJvYW1SZXN1bHQ7CisKKyAgICAgICAgICAgIC8qIEhhbmRsZSBldmVudCAqLyAKKyAgICAgICAgICAgIHZvc1N0YXR1cyA9IGJ0YW1wRnNtKGJ0YW1wQ29udGV4dCwgJmJhcEV2ZW50LCAmc3RhdHVzKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy9KRVowODExMTA6IENvbW1lbnRlZCBvdXQgZm9yIHRlc3RpbmcuIFRoaXMgaGFuZGxlcyBib3RoIEluZnJhIFNUQSBhbmQgSUJTUyBTVEEuCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX0NPTk5FQ1Q6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9SRVNVTFRfSUJTU19DT05ORUNUIiwgcm9hbVJlc3VsdCk7ICAgCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9BU1NPQ0lBVEVEOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQiLCByb2FtUmVzdWx0KTsgICAKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX1dEU19BU1NPQ0lBVEVEOgorICAgICAgICAgICAgLyogYmFwUm9hbUNvbXBsZXRlQ2FsbGJhY2sgd2l0aCBlQ1NSX1JPQU1fUkVTVUxUX1dEU19BU1NPQ0lBVEVEICovCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9SRVNVTFRfV0RTX0FTU09DSUFURUQiLCByb2FtUmVzdWx0KTsgICAKKworICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovIAorICAgICAgICAgICAgYmFwRXZlbnQuZXZlbnQgPSBlV0xBTl9CQVBfTUFDX0NPTk5FQ1RfQ09NUExFVEVEOworICAgICAgICAgICAgYmFwRXZlbnQucGFyYW1zID0gcENzclJvYW1JbmZvOworICAgICAgICAgICAgYmFwRXZlbnQudTEgPSByb2FtU3RhdHVzOworICAgICAgICAgICAgYmFwRXZlbnQudTIgPSByb2FtUmVzdWx0OworCisgICAgICAgICAgICAvKiBIYW5kbGUgZXZlbnQgKi8gCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBidGFtcEZzbShidGFtcENvbnRleHQsICZiYXBFdmVudCwgJnN0YXR1cyk7CisgIAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy9KRVowODExMTA6IENvbW1lbnRlZCBvdXQgZm9yIHRlc3RpbmcuIFRlc3QgcmVsaWVzIHVwb24gSUJTUy4gCisgICAgICAgIC8vSkVaMDgxMTEwOiBCdXQgSSBjYW5ub3QgcmVseSB1cG9uIElCU1MgZm9yIHRoZSBpbml0aWFsIHRlc3RpbmcuIAorICAgICAgICAvL2Nhc2UgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFOiAKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfU1RBUlRfRkFJTEVEOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfU1RBUlRfRkFJTEVEIiwgcm9hbVJlc3VsdCk7ICAgCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9OT1RfQVNTT0NJQVRFRDoKKyAgICAgICAgICAgIC8qIGJhcFJvYW1Db21wbGV0ZUNhbGxiYWNrIHdpdGggZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFIG9yIGVDU1JfUk9BTV9SRVNVTFRfTk9UX0FTU09DSUFURUQgKi8KKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1SZXN1bHQgPSAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9OT1RfQVNTT0NJQVRFRCIsIHJvYW1SZXN1bHQpOyAgIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX1dEU19OT1RfQVNTT0NJQVRFRDoKKyAgICAgICAgICAgIC8qIGJhcFJvYW1Db21wbGV0ZUNhbGxiYWNrIHdpdGggZUNTUl9ST0FNX1JFU1VMVF9XRFNfTk9UX0FTU09DSUFURUQgKi8KKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1SZXN1bHQgPSAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9XRFNfTk9UX0FTU09DSUFURUQiLCByb2FtUmVzdWx0KTsgICAKKworICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovIAorICAgICAgICAgICAgYmFwRXZlbnQuZXZlbnQgPSBlV0xBTl9CQVBfTUFDX0NPTk5FQ1RfRkFJTEVEOyAKKyAgICAgICAgICAgIGJhcEV2ZW50LnBhcmFtcyA9IHBDc3JSb2FtSW5mbzsKKyAgICAgICAgICAgIGJhcEV2ZW50LnUxID0gcm9hbVN0YXR1czsKKyAgICAgICAgICAgIGJhcEV2ZW50LnUyID0gcm9hbVJlc3VsdDsKKworICAgICAgICAgICAgLyogSGFuZGxlIGV2ZW50ICovIAorICAgICAgICAgICAgdm9zU3RhdHVzID0gYnRhbXBGc20oYnRhbXBDb250ZXh0LCAmYmFwRXZlbnQsICZzdGF0dXMpOworICAKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vSkVaMDgxMTEwOiBJIHRoaW5rIEkgaGF2ZSB0byBjaGVjayBmb3IgdGhlIGJzc1R5cGUgdG8KKyAgICAgICAgLy9kaWZmZXJlbnRpYXRlIGJldHdlZW4gSUJTUyBTdGFydCBhbmQgSUJTUyBKb2luIHN1Y2Nlc3MuICAKKyAgICAgICAgLy9jYXNlIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19DT05ORUNUOgorICAgICAgICAgICAgLy9WT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9SRVNVTFRfSUJTU19DT05ORUNUIiwgcm9hbVJlc3VsdCk7ICAgCisKKyAgICAgICAgLy9KRVowODExMTA6IENvbW1lbnRlZCBvdXQgZm9yIHRlc3RpbmcuIFRlc3QgcmVsaWVzIHVwb24gSUJTUy4gCisgICAgICAgIC8vIE5vIGxvbmdlciBjb21tZW50ZWQgb3V0LiAKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX1dEU19BU1NPQ0lBVElPTl9JTkQ6CisgICAgICAgICAgICAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfV0RTX0FTU09DSUFUSU9OX0lORCAqLworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX1dEU19BU1NPQ0lBVElPTl9JTkQiLCByb2FtUmVzdWx0KTsgICAKKworICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovIAorICAgICAgICAgICAgYmFwRXZlbnQuZXZlbnQgPSBlV0xBTl9CQVBfTUFDX0NPTk5FQ1RfSU5ESUNBVElPTjsKKyAgICAgICAgICAgIGJhcEV2ZW50LnBhcmFtcyA9IHBDc3JSb2FtSW5mbzsKKyAgICAgICAgICAgIGJhcEV2ZW50LnUxID0gcm9hbVN0YXR1czsKKyAgICAgICAgICAgIGJhcEV2ZW50LnUyID0gcm9hbVJlc3VsdDsKKworICAgICAgICAgICAgLyogSGFuZGxlIGV2ZW50ICovIAorICAgICAgICAgICAgdm9zU3RhdHVzID0gYnRhbXBGc20oYnRhbXBDb250ZXh0LCAmYmFwRXZlbnQsICZzdGF0dXMpOworICAKKyAgICAgICAgICAgIC8qIElmIEJBUCBkb2Vzbid0IGxpa2UgdGhlIGluY29taW5nIGFzc29jaWF0aW9uLCBzaWduYWwgU01FL0NTUiAqLyAKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1MpIAorICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgIAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy9KRVowODExMTA6IE5vdCBzdXBwb3J0ZWQgaW4gU01FIGFuZCBDU1IsIHlldC4gCisjaWYgMAorICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfS0VZX1NFVDogCisgICAgICAgICAgICAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfS0VZX1NFVCAqLworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0tFWV9TRVQiLCByb2FtUmVzdWx0KTsgICAKKworICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovIAorICAgICAgICAgICAgYmFwRXZlbnQuZXZlbnQgPSBlV0xBTl9CQVBfTUFDX0tFWV9TRVRfU1VDQ0VTUzsgCisgICAgICAgICAgICBiYXBFdmVudC5wYXJhbXMgPSBwQ3NyUm9hbUluZm87CisgICAgICAgICAgICBiYXBFdmVudC51MSA9IHJvYW1TdGF0dXM7CisgICAgICAgICAgICBiYXBFdmVudC51MiA9IHJvYW1SZXN1bHQ7CisKKyAgICAgICAgICAgIC8qIEhhbmRsZSBldmVudCAqLyAKKyAgICAgICAgICAgIHZvc1N0YXR1cyA9IGJ0YW1wRnNtKGJ0YW1wQ29udGV4dCwgJmJhcEV2ZW50LCAmc3RhdHVzKTsKKyAgCisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLzAKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfRElTQVNTT0NfSU5EOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0RJU0FTU09DX0lORCIsIHJvYW1SZXN1bHQpOyAgIAorICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfV0RTX0RJU0FTU09DSUFURUQ6CisgICAgICAgICAgICAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfV0RTX0RJU0FTU09DSUFURUQgKi8KKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1SZXN1bHQgPSAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9XRFNfRElTQVNTT0NJQVRFRCIsIHJvYW1SZXN1bHQpOyAgIAorCisgICAgICAgICAgICAvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8gCisgICAgICAgICAgICBiYXBFdmVudC5ldmVudCA9ICBlV0xBTl9CQVBfTUFDX0lORElDQVRFU19NRURJQV9ESVNDT05ORUNUSU9OOyAKKyAgICAgICAgICAgIGJhcEV2ZW50LnBhcmFtcyA9IHBDc3JSb2FtSW5mbzsKKyAgICAgICAgICAgIGJhcEV2ZW50LnUxID0gcm9hbVN0YXR1czsKKyAgICAgICAgICAgIGJhcEV2ZW50LnUyID0gcm9hbVJlc3VsdDsKKworICAgICAgICAgICAgLyogSGFuZGxlIGV2ZW50ICovIAorICAgICAgICAgICAgdm9zU3RhdHVzID0gYnRhbXBGc20oYnRhbXBDb250ZXh0LCAmYmFwRXZlbnQsICZzdGF0dXMpOworICAKKyAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLyAKKyAgICAgICAgICAgIGJhcEV2ZW50LmV2ZW50ID0gIGVXTEFOX0JBUF9NQUNfUkVBRFlfRk9SX0NPTk5FQ1RJT05TOworICAgICAgICAgICAgYmFwRXZlbnQucGFyYW1zID0gcENzclJvYW1JbmZvOworICAgICAgICAgICAgYmFwRXZlbnQudTEgPSByb2FtU3RhdHVzOworICAgICAgICAgICAgYmFwRXZlbnQudTIgPSByb2FtUmVzdWx0OworCisgICAgICAgICAgICAvKiBIYW5kbGUgZXZlbnQgKi8gCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBidGFtcEZzbShidGFtcENvbnRleHQsICZiYXBFdmVudCwgJnN0YXR1cyk7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vSkVaMDgxMTEwOiBDb21tZW50ZWQgb3V0IGZvciB0ZXN0aW5nLiBUZXN0IHJlbGllcyB1cG9uIElCU1MuIAorICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19JTkFDVElWRToKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1SZXN1bHQgPSAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9JQlNTX0lOQUNUSVZFIiwgcm9hbVJlc3VsdCk7ICAgCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9XRFNfU1RPUFBFRDoKKyAgICAgICAgICAgIC8qIGJhcFJvYW1Db21wbGV0ZUNhbGxiYWNrIHdpdGggZUNTUl9ST0FNX1JFU1VMVF9XRFNfU1RPUFBFRCAqLworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX1dEU19TVE9QUEVEIiwgcm9hbVJlc3VsdCk7ICAgCisKKyAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLyAKKyAgICAgICAgICAgIGJhcEV2ZW50LmV2ZW50ID0gZVdMQU5fQkFQX01BQ19SRUFEWV9GT1JfQ09OTkVDVElPTlM7IAorICAgICAgICAgICAgYmFwRXZlbnQucGFyYW1zID0gcENzclJvYW1JbmZvOworICAgICAgICAgICAgYmFwRXZlbnQudTEgPSByb2FtU3RhdHVzOworICAgICAgICAgICAgYmFwRXZlbnQudTIgPSByb2FtUmVzdWx0OworCisgICAgICAgICAgICAvKiBIYW5kbGUgZXZlbnQgKi8gCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBidGFtcEZzbShidGFtcENvbnRleHQsICZiYXBFdmVudCwgJnN0YXR1cyk7CisgIAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgdW5zdXBwb3J0ZWQgQ1NSIHJvYW1SZXN1bHQgPSAlZCIsIF9fRlVOQ1RJT05fXywgcm9hbVJlc3VsdCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmIDAKKyAgICBzd2l0Y2ggKHJvYW1SZXN1bHQpIHsKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfQ09OTkVDVDoKKyAgICAgICAgICAgIC8vIHdlIGhhdmUgYW4gSUJTUyBjb25uZWN0aW9uLi4uCisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgc3RhdGUKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+bUFzc29jaWF0ZWRTdGF0dXMgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5tQXNzb2NpYXRlZCA9IFZPU19UUlVFOworICAgICAgICAgICAgLy8gdXBkYXRlICJhc3NvY0Jzc2lkIiB3aXRoIHRoZSBCU1NJRCBvZiB0aGUgSUJTUworICAgICAgICAgICAgaWYgKHBDc3JSb2FtSW5mbykgCisgICAgICAgICAgICAgICAgbWVtY3B5KGJ0YW1wQ29udGV4dC0+YXNzb2NCc3NpZCwgcENzclJvYW1JbmZvLT5wZWVyTWFjT3JCc3NpZEZvcklCU1MsIDYpOworCisgICAgICAgICAgICAvLyBXZSBtdXN0IHVwZGF0ZSB0aGUgc3lzdGVtIHJvbGUgdG8gbWF0Y2ggdGhhdCBvZiB0aGUKKyAgICAgICAgICAgIC8vIGxvd2VyIGxheWVycyBpbiBjYXNlIHRoZSB1cHBlciBsYXllcnMgZGVjaWRlZCB0byB0cnkKKyAgICAgICAgICAgIC8vIGpvaW5pbmcgdGhlIG5ldHdvcmsgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSBpZiB0aGUKKyAgICAgICAgICAgIC8vIGluaXRpYWwgam9pbiBpbiBJQlNTIG1vZGUgZmFpbHMuICBBbmRyZWFzIFdvbGYKKyAgICAgICAgICAgIC8vIChhd29sZkBhcHBsZS5jb20pIGV4cGxhaW5zIHRoZSBiZWhhdmlvciBhcyBmb2xsb3dzOgorICAgICAgICAgICAgLy8gIklmIHRoZSBjbGllbnQgYXR0ZW1wdHMgdG8gam9pbiBhbiBvcGVuIG5ldHdvcmsgYW5kIGl0IGZhaWxzIAorICAgICAgICAgICAgLy8gb24gdGhlIGZpcnN0IGF0dGVtcHQsIGl0IHJldmVydHMgYmFjayB0byBiLW9ubHkgbW9kZS4gVGhpcworICAgICAgICAgICAgLy8gd29ya2Fyb3VuZCB3YXMgc3BlY2lmaWNhbGx5IHB1dCBpbiBwbGFjZSB0byBhbGxvdyB0aGUgY2xpZW50CisgICAgICAgICAgICAvLyB0byBhc3NvY2lhdGUgdG8gc29tZSB0aGlyZCBwYXJ0eSBiLW9ubHkgaW5mcmFzdHJ1Y3R1cmUgQVBzLgorICAgICAgICAgICAgLy8gSXQgZGlkIG5vdCB0YWtlIElCU1MgaW50byBhY2NvdW50LCBpdCBzZWVtcyB0aGF0IHRoZSBmYWxsYmFjaworICAgICAgICAgICAgLy8gYWx3YXlzIGZvcmNlcyBpbmZyYXN0cnVjdHVyZS4iIAorCisgICAgICAgICAgICBidGFtcENvbnRleHQtPnN5c3RlbVJvbGUgPSBlU1lTVEVNX1NUQV9JTl9JQlNTX1JPTEU7CisKKyAgICAgICAgICAgIGlmIChtTGlua1N0YXR1cyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB0aGUgZmxvdyBvZiBkYXRhCisgICAgICAgICAgICAgICAgREJHTE9HKCIlczogbWFya2luZyBsaW5rIGFzIHVwIGluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfQ09OTkVDVCIpOworICAgICAgICAgICAgICAgIG1MaW5rU3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAoKElPODAyMTFJbnRlcmZhY2UqKSBtTmV0d29ya0lGKS0+c2V0TGlua1N0YXRlKGtJTzgwMjExTmV0d29ya0xpbmtVcCk7CisgICAgICAgICAgICAgICAgb3V0cHV0UXVldWUtPnNldENhcGFjaXR5KFRSQU5TTUlUX1FVRVVFX1NJWkUpOworICAgICAgICAgICAgICAgIG91dHB1dFF1ZXVlLT5zdGFydCgpOworICAgICAgICAgICAgICAgIC8vIExldCB0aGVtIGtub3cgd2UgYXJlIHJlYWR5CisgICAgICAgICAgICAgICAgKChJTzgwMjExSW50ZXJmYWNlKikgbU5ldHdvcmtJRiktPnBvc3RNZXNzYWdlKEFQUExFODAyMTFfTV9BU1NPQ19ET05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBsaW5rIGlzIGFscmVhZHkgdXAgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9SRVNVTFRfSUJTU19DT05ORUNUIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19JTkFDVElWRToKKyAgICAgICAgICAgIC8vIHdlIGhhdmUgbm8gbW9yZSBJQlNTIHBlZXJzLCBzbyBkaXNhYmxlIHRoZSBmbG93IG9mIGRhdGEKKyAgICAgICAgICAgIGlmIChtTGlua1N0YXR1cyAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR0xPRygiJXM6IG1hcmtpbmcgbGluayBhcyBkb3duIGluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfSU5BQ1RJVkUiKTsKKyAgICAgICAgICAgICAgICBtTGlua1N0YXR1cyA9ICh0QU5JX1U4KSAwOworICAgICAgICAgICAgICAgIC8vIEpFWjA3MDYyNzogUmV2aXNpdCA/CisgICAgICAgICAgICAgICAgKChJTzgwMjExSW50ZXJmYWNlKikgbU5ldHdvcmtJRiktPnNldExpbmtTdGF0ZShrSU84MDIxMU5ldHdvcmtMaW5rRG93bik7CisgICAgICAgICAgICAgICAgb3V0cHV0UXVldWUtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRRdWV1ZS0+c2V0Q2FwYWNpdHkoMCk7CisKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb3VyIHN0YXRlCisgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5tQXNzb2NpYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR0xPRygiJXM6IGxpbmsgYWxyZWFkeSBkb3duIGluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfSU5BQ1RJVkUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQ6CisgICAgICAgICAgICBidGFtcENvbnRleHQtPm1Bc3NvY2lhdGVkU3RhdHVzID0gQVBQTEU4MDIxMV9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+bUFzc29jaWF0ZWQgPSB0cnVlOworCisgICAgICAgICAgICBpZiAoKHBDc3JSb2FtSW5mbykgJiYgKHBDc3JSb2FtSW5mby0+cEJzc0Rlc2MpKSB7CisgICAgICAgICAgICAgICAgY2NwQ3NyVG9BcHBsZVNjYW5SZXN1bHQobVBNYWNPYmplY3QsIHBDc3JSb2FtSW5mby0+cEJzc0Rlc2MsICZzY2FuUmVzdWx0KTsgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogU2F2ZSBhd2F5IHRoZSBJRXMgdXNlZCBieSB0aGUgQVAgKi8KKyAgICAgICAgICAgICAgICBjY3BDc3JUb0Fzc29jQXBpZWRhdGEoIG1QTWFjT2JqZWN0LCBwQ3NyUm9hbUluZm8tPnBCc3NEZXNjLCAmKGJ0YW1wQ29udGV4dC0+YXBpZWRhdGEpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoQnNzaWRDaGFuZ2VkKCh0Q3NyQnNzaWQqKSBidGFtcENvbnRleHQtPmFzc29jQnNzaWQsIChldGhlcl9hZGRyKikgc2NhblJlc3VsdC5hc3JfYnNzaWQpKSB7IAorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnRhbXBDb250ZXh0LT5hc3NvY0Jzc2lkLCBzY2FuUmVzdWx0LmFzcl9ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgICAgICgoSU84MDIxMUludGVyZmFjZSopIG1OZXR3b3JrSUYpLT5wb3N0TWVzc2FnZShBUFBMRTgwMjExX01fQlNTSURfQ0hBTkdFRCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKChJTzgwMjExSW50ZXJmYWNlKikgbU5ldHdvcmtJRiktPnBvc3RNZXNzYWdlKEFQUExFODAyMTFfTV9BU1NPQ19ET05FKTsKKworICAgICAgICAgICAgaWYgKG1MaW5rU3RhdHVzID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbUxpbmtTdGF0dXMgPSAodEFOSV9VOCkgMTsKKyAgICAgICAgICAgICAgICAoKElPODAyMTFJbnRlcmZhY2UqKSBtTmV0d29ya0lGKS0+c2V0TGlua1N0YXRlKGtJTzgwMjExTmV0d29ya0xpbmtVcCk7CisgICAgICAgICAgICAgICAgREJHTE9HKCIlczogbWFya2luZyBsaW5rIGFzIHVwIGluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQiKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRRdWV1ZS0+c2V0Q2FwYWNpdHkoVFJBTlNNSVRfUVVFVUVfU0laRSk7CisgICAgICAgICAgICAgICAgb3V0cHV0UXVldWUtPnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHTE9HKCIlczogbGluayBpcyBhbHJlYWR5IHVwIGluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfTk9UX0FTU09DSUFURUQ6CisgICAgICAgICAgICBidGFtcENvbnRleHQtPm1Bc3NvY2lhdGVkU3RhdHVzID0gQVBQTEU4MDIxMV9TVEFUVVNfVU5BVkFJTEFCTEU7CisgICAgICAgICAgICBidGFtcENvbnRleHQtPm1Bc3NvY2lhdGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChtTGlua1N0YXR1cyAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR0xPRygiJXM6IG1hcmtpbmcgbGluayBhcyBkb3duIGluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX05PVF9BU1NPQ0lBVEVEIik7CisgICAgICAgICAgICAgICAgbUxpbmtTdGF0dXMgPSAodEFOSV9VOCkgMDsKKyAgICAgICAgICAgICAgICAoKElPODAyMTFJbnRlcmZhY2UqKSBtTmV0d29ya0lGKS0+c2V0TGlua1N0YXRlKGtJTzgwMjExTmV0d29ya0xpbmtEb3duKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBsaW5rIGFscmVhZHkgZG93biBpbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9OT1RfQVNTT0NJQVRFRCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIAorICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRToKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+bUFzc29jaWF0ZWRTdGF0dXMgPSBBUFBMRTgwMjExX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5tQXNzb2NpYXRlZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAobUxpbmtTdGF0dXMgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBtYXJraW5nIGxpbmsgYXMgZG93biBpbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFIik7CisgICAgICAgICAgICAgICAgbUxpbmtTdGF0dXMgPSAodEFOSV9VOCkgMDsKKyAgICAgICAgICAgICAgICAoKElPODAyMTFJbnRlcmZhY2UqKSBtTmV0d29ya0lGKS0+c2V0TGlua1N0YXRlKGtJTzgwMjExTmV0d29ya0xpbmtEb3duKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBsaW5rIGFscmVhZHkgZG93biBpbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9ESVNBU1NPQ19JTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5tQXNzb2NpYXRlZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKG1MaW5rU3RhdHVzICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBtYXJraW5nIGxpbmsgYXMgZG93biBpbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9ESVNBU1NPQ19JTkQiKTsKKyAgICAgICAgICAgICAgICAgICAgbUxpbmtTdGF0dXMgPSAodEFOSV9VOCkgMDsKKyAgICAgICAgICAgICAgICAgICAgKChJTzgwMjExSW50ZXJmYWNlKikgbU5ldHdvcmtJRiktPnNldExpbmtTdGF0ZShrSU84MDIxMU5ldHdvcmtMaW5rRG93bik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERCR0xPRygiJXM6IGxpbmsgYWxyZWFkeSBkb3duIGluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0RJU0FTU09DX0lORCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vaWYgKHBDc3JSb2FtSW5mbykgIC8vIEZvciBub3csIGxlYXZlIHRoaXMgY29tbWVudGVkIG91dC4gVW50aWwgQ1NSIGNoYW5nZXMgaW50ZWdyYXRlZC4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBzZXQgdGhlIHJlYXNvbiBhbmQgc3RhdHVzIGNvZGVzLiAgCisgICAgICAgICAgICAgICAgICAgIC8vIEFjdHVhbGx5LCB0aGUgInJlc3VsdCBjb2RlIiBmaWVsZCBpbiB0aGUgdFNpclNtZURpc2Fzc29jSW5kIHNob3VsZCBiZSBuYW1lZCByZWFzb25Db2RlIGFuZCBOT1Qgc3RhdHVzQ29kZS4gIAorICAgICAgICAgICAgICAgICAgICAvLyAiUmVhc29uIENvZGVzIiBhcmUgZm91bmQgaW4gRGlzQXNzb2Mgb3IgRGVBdXRoIEluZC4gIlN0YXR1cyBDb2RlIiBmaWVsZHMgYXJlIGZvdW5kIGluIFJzcCBNZ210IEZyYW1lLiAgCisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3csIHdlIGFyZSBnb2luZyB0byBoYXZlIHRvIChwYWluZnVsbHkpIG1hcCB0aGUgb25seSAicmVzdWx0IGNvZGUiIHR5cGUgaW5mb3JtYXRpb24gd2UgaGF2ZSAKKyAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGF0IEFMTCBmcm9tIExJTS9DU1IuICBBbmQgdGhhdCBpcyB0aGUgc3RhdHVzQ29kZSBmaWVsZCBvZiB0eXBlIHRTaXJSZXN1bHRDb2RlcyAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBCVFcsIHRTaXJSZXN1bHRDb2RlcyBpcyB0aGUgQ09NUExFVEVMWSBXUk9ORyBUWVBFIGZvciB0aGlzICJyZXN1bHQgY29kZSIgZmllbGQuIEl0IFNIT1VMRCBiZSAKKyAgICAgICAgICAgICAgICAgICAgLy8gb2YgdHlwZSB0U2lyTWFjUmVhc29uQ29kZXMuICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIFJpZ2h0IG5vdywgd2UgZG9uJ3QgZXZlbiBoYXZlIHRoYXQuICBTbywgSSBoYXZlIHRvIGp1c3QgbWFrZSB1cCBzb21lICJyZWFzb24gY29kZSIgdGhhdCBJIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJldGVuZCBJIGZvdW5kIGluIHRoZSBpbmNvbWluZyBEaXNBc3NvYyBJbmRpY2F0aW9uLiAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vYnRhbXBDb250ZXh0LT5zdGF0dXNDb2RlID0gKCh0cFNpclNtZURpc2Fzc29jSW5kKSBwQ2FsbGJhY2tJbmZvKS0+c3RhdHVzQ29kZTsgLy8gdFNpclJlc3VsdENvZGVzICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vYnRhbXBDb250ZXh0LT5yZWFzb25Db2RlID0gKCh0cFNpclNtZURpc2Fzc29jSW5kKSBwQ2FsbGJhY2tJbmZvKS0+c3RhdHVzQ29kZTsgLy8gdFNpclJlc3VsdENvZGVzICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+cmVhc29uQ29kZSA9ICh0QU5JX1UxNikgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OOyAvL3RBTklfVTE2IC8vIHRTaXJNYWNSZWFzb25Db2RlcyAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPmRlQXV0aFJlYXNvbkNvZGUgPSAwOyAvLyB0QU5JX1UxNiAgIC8vIGVTSVJfU01FX0RFQVVUSF9GUk9NX1BFRVIgCisgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZG4ndCB0aGUgbmV4dCBsaW5lIHJlYWxseSB1c2UgYSB0QU5JX1UxNj8gLy8wOyAvLyB0QU5JX1UxNiAgIC8vIGVTSVJfU01FX0RJU0FTU09DX0ZST01fUEVFUgorICAgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPmRpc2Fzc29jUmVhc29uQ29kZSA9IGJ0YW1wQ29udGV4dC0+cmVhc29uQ29kZTsgLy8gdFNpck1hY1JlYXNvbkNvZGVzIAorICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyByZW1lbWJlciB0aGUgcGVlciB3aG8ganVzdCBkaXNhc3NvYydkIHVzCisgICAgICAgICAgICAgICAgICAgIC8vbWVtY3B5KGJ0YW1wQ29udGV4dC0+cGVlck1hY0FkZHIsIHBDc3JSb2FtSW5mby0+cGVlck1hY09yQnNzaWRGb3JJQlNTLCA2KTsKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0RFQVVUSF9JTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5tQXNzb2NpYXRlZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKG1MaW5rU3RhdHVzICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBtYXJraW5nIGxpbmsgYXMgZG93biBpbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9ERUFVVEhfSU5EIik7CisgICAgICAgICAgICAgICAgICAgIG1MaW5rU3RhdHVzID0gKHRBTklfVTgpIDA7CisgICAgICAgICAgICAgICAgICAgICgoSU84MDIxMUludGVyZmFjZSopIG1OZXR3b3JrSUYpLT5zZXRMaW5rU3RhdGUoa0lPODAyMTFOZXR3b3JrTGlua0Rvd24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBsaW5rIGFscmVhZHkgZG93biBpbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9ERUFVVEhfSU5EIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9pZiAocENzclJvYW1JbmZvKSAgLy8gRm9yIG5vdywgbGVhdmUgdGhpcyBjb21tZW50ZWQgb3V0LiBVbnRpbCBDU1IgY2hhbmdlcyBpbnRlZ3JhdGVkLgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm93IHNldCB0aGUgcmVhc29uIGFuZCBzdGF0dXMgY29kZXMuICAKKyAgICAgICAgICAgICAgICAgICAgLy8gQWN0dWFsbHksIHRoZSAicmVzdWx0IGNvZGUiIGZpZWxkIGluIHRoZSB0U2lyU21lRGVhdXRoSW5kIHNob3VsZCBiZSBuYW1lZCByZWFzb25Db2RlIGFuZCBOT1Qgc3RhdHVzQ29kZS4gIAorICAgICAgICAgICAgICAgICAgICAvLyAiUmVhc29uIENvZGVzIiBhcmUgZm91bmQgaW4gRGlzQXNzb2Mgb3IgRGVBdXRoIEluZC4gIlN0YXR1cyBDb2RlIiBmaWVsZHMgYXJlIGZvdW5kIGluIFJzcCBNZ210IEZyYW1lLiAgCisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3csIHdlIGFyZSBnb2luZyB0byBoYXZlIHRvIChwYWluZnVsbHkpIG1hcCB0aGUgb25seSAicmVzdWx0IGNvZGUiIHR5cGUgaW5mb3JtYXRpb24gd2UgaGF2ZSAKKyAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGF0IEFMTCBmcm9tIExJTS9DU1IuICBBbmQgdGhhdCBpcyB0aGUgc3RhdHVzQ29kZSBmaWVsZCBvZiB0eXBlIHRTaXJSZXN1bHRDb2RlcyAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBCVFcsIHRTaXJSZXN1bHRDb2RlcyBpcyB0aGUgQ09NUExFVEVMWSBXUk9ORyBUWVBFIGZvciB0aGlzICJyZXN1bHQgY29kZSIgZmllbGQuIEl0IFNIT1VMRCBiZSAKKyAgICAgICAgICAgICAgICAgICAgLy8gb2YgdHlwZSB0U2lyTWFjUmVhc29uQ29kZXMuICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIFJpZ2h0IG5vdywgd2UgZG9uJ3QgZXZlbiBoYXZlIHRoYXQuICBTbywgSSBoYXZlIHRvIGp1c3QgbWFrZSB1cCBzb21lICJyZWFzb24gY29kZSIgdGhhdCBJIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJldGVuZCBJIGZvdW5kIGluIHRoZSBpbmNvbWluZyBEZUF1dGggSW5kaWNhdGlvbi4gICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvL2J0YW1wQ29udGV4dC0+c3RhdHVzQ29kZSA9ICgodHBTaXJTbWVEZWF1dGhJbmQpIHBDYWxsYmFja0luZm8pLT5zdGF0dXNDb2RlOyAvLyB0U2lyUmVzdWx0Q29kZXMgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy9idGFtcENvbnRleHQtPnJlYXNvbkNvZGUgPSAoKHRwU2lyU21lRGVhdXRoSW5kKSBwQ2FsbGJhY2tJbmZvKS0+c3RhdHVzQ29kZTsgLy8gdFNpclJlc3VsdENvZGVzICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+cmVhc29uQ29kZSA9ICh0QU5JX1UxNikgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OOyAvL3RBTklfVTE2IC8vIHRTaXJNYWNSZWFzb25Db2RlcyAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPmRpc2Fzc29jUmVhc29uQ29kZSA9IDA7IC8vIHRBTklfVTE2ICAgLy8gZVNJUl9TTUVfRElTQVNTT0NfRlJPTV9QRUVSIAorICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGRuJ3QgdGhlIG5leHQgbGluZSByZWFsbHkgdXNlIGEgdEFOSV9VMTY/IC8vMDsgLy8gdEFOSV9VMTYgICAvLyBlU0lSX1NNRV9ERUFVVEhfRlJPTV9QRUVSCisgICAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+ZGVBdXRoUmVhc29uQ29kZSA9IGJ0YW1wQ29udGV4dC0+cmVhc29uQ29kZTsgLy8gdFNpck1hY1JlYXNvbkNvZGVzIAorICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyByZW1lbWJlciB0aGUgcGVlciB3aG8ganVzdCBkZS1hdXRoJ2QgdXMKKyAgICAgICAgICAgICAgICAgICAgLy9tZW1jcHkoYnRhbXBDb250ZXh0LT5wZWVyTWFjQWRkciwgKCh0cFNpclNtZURlYXV0aEluZCkgcENhbGxiYWNrSW5mbyktPnBlZXJNYWNBZGRyLCA2KTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfVU5JQ0FTVDogCisKKyAgICAgICAgICAgIC8vaWYgKGVDU1JfUk9BTV9NSUNfRVJST1JfSU5EID09IHJvYW1TdGF0dXMpICAvLyBNYWtlIHN1cmUKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgaWYgKGJ0YW1wQ29udGV4dC0+bVRLSVBDb3VudGVyTWVhc3VyZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoKElPODAyMTFJbnRlcmZhY2UqKSBtTmV0d29ya0lGKS0+cG9zdE1lc3NhZ2UoQVBQTEU4MDIxMV9NX01JQ19FUlJPUl9VQ0FTVCk7IAorICAgICAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBUS0lQIENvdW50ZXJtZWFzdXJlcyBpbiBlZmZlY3QgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9SRVNVTFRfTUlDX0VSUk9SX1VOSUNBU1QiKTsgCisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgIERCR0xPRygiJXM6IFRLSVAgQ291bnRlcm1lYXN1cmVzIGRpc2FibGVkIGluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9VTklDQVNUIik7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfR1JPVVA6IAorCisgICAgICAgICAgICAvL2lmIChlQ1NSX1JPQU1fTUlDX0VSUk9SX0lORCA9PSByb2FtU3RhdHVzKSAgLy8gTWFrZSBzdXJlCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIGlmIChidGFtcENvbnRleHQtPm1US0lQQ291bnRlck1lYXN1cmVzKQorICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICgoSU84MDIxMUludGVyZmFjZSopIG1OZXR3b3JrSUYpLT5wb3N0TWVzc2FnZShBUFBMRTgwMjExX01fTUlDX0VSUk9SX01DQVNUKTsgCisgICAgICAgICAgICAgICAgICAgIERCR0xPRygiJXM6IFRLSVAgQ291bnRlcm1lYXN1cmVzIGluIGVmZmVjdCBpbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfR1JPVVAiKTsgCisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgIERCR0xPRygiJXM6IFRLSVAgQ291bnRlcm1lYXN1cmVzIGRpc2FibGVkIGluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9HUk9VUCIpOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAocm9hbVN0YXR1cykgeworICAgICAgICBjYXNlIGVDU1JfUk9BTV9ST0FNSU5HX1NUQVJUOiAKKyAgICAgICAgICAgIERCR0xPRygiJXM6IEluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUk9BTUlOR19TVEFSVCIpOworICAgICAgICAgICAgLy8gVGhpcyBvbmx5IGdldHMgY2FsbGVkIHdoZW4gQ1NSIGRlY2lkZXMgdG8gcm9hbSBvbiBpdHMgb3duIC0gZHVlIHRvIGxvc3RsaW5rLiAKKyAgICAgICAgICAgIC8vIEFwcGxlIHN0aWxsIG5lZWRzIHRvIGJlIHRvbGQuCisgICAgICAgICAgICBpZiAoKHBDc3JSb2FtSW5mbykgJiYgKHBDc3JSb2FtSW5mby0+cENvbm5lY3RlZFByb2ZpbGUpICYmIChwQ3NyUm9hbUluZm8tPnBDb25uZWN0ZWRQcm9maWxlLT5wQnNzRGVzYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGJzc2lkLmV0aGVyX2FkZHJfb2N0ZXQsIHBDc3JSb2FtSW5mby0+cENvbm5lY3RlZFByb2ZpbGUtPnBCc3NEZXNjLT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7IAorICAgICAgICAgICAgICAgIGFwcGxlODAyMTFJbnRlcmZhY2UtPndpbGxSb2FtKCZic3NpZCk7ICAvLyBSZXR1cm4gcmVzdWx0IGlzbid0IHNpZ25pZmljYW50IAorICAgICAgICAgICAgICAgIERCR0xPRygiJXM6IHdpbGxSb2FtIHJldHVybnNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9TSE9VTERfUk9BTToKKyAgICAgICAgICAgIGlmICgocENzclJvYW1JbmZvKSAmJiAocENzclJvYW1JbmZvLT5wQnNzRGVzYykpIHsKKyAgICAgICAgICAgICAgICAvLyBwQ2FsbGJhY2tJbmZvIHBvaW50cyB0byB0aGUgQlNTIGRlc2MuIENvbnZlcnQgdG8gQXBwbGUgU2NhbiBSZXN1bHQuCisgICAgICAgICAgICAgICAgaGFsU3RhdHVzID0gY2NwQ3NyVG9BcHBsZVNjYW5SZXN1bHQoIAorICAgICAgICAgICAgICAgICAgICAgICAgbVBNYWNPYmplY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgcENzclJvYW1JbmZvLT5wQnNzRGVzYywgCisgICAgICAgICAgICAgICAgICAgICAgICAmc2NhblJlc3VsdCk7IAorICAgICAgICAgICAgICAgIGlmICggaGFsU3RhdHVzICE9IDAgKSAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgcm9hbUFjY2VwdGVkID0gYXBwbGU4MDIxMUludGVyZmFjZS0+c2hvdWxkUm9hbSgmc2NhblJlc3VsdCk7ICAvLyBSZXR1cm4gcmVzdWx0IGlzIGNydWNpYWwKKyAgICAgICAgICAgICAgICBpZiAocm9hbUFjY2VwdGVkID09IHRydWUpIHsgCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSByb2FtIGlzIGFjY2VwdGFibGUsIHJldHVybiBTVUNDRVNTIAorICAgICAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBzaG91bGRSb2FtIHJldHVybnMgXCJhY2NlcHRhYmxlXCJcbiIsIF9fRlVOQ1RJT05fXyk7CisvLyNpZiAwCisgICAgICAgICAgICAgICAgICAgIC8vIEFjdHVhbGx5LCBiZWZvcmUgcmV0dXJuaW5nLCBpbW1lZGlhdGVseSBzaWduYWwgd2lsbFJvYW0KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgQ1NSIGJ1Zy4gIEV2ZW50dWFsbHksIHdoZW4gCisgICAgICAgICAgICAgICAgICAgIC8vIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9TVEFSVCBnZXRzIGNhbGxlZCBXSVRIIGNhbGxiYWNrIHBhcmFtIHAxCisgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50aW5nIHRvIGEgdEJzc0Rlc2NyaXB0aW9uLCB0aGlzIHdvcmstYXJvdW5kIGNhbiBiZSByZW1vdmVkLgorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnNzaWQuZXRoZXJfYWRkcl9vY3RldCwgcENzclJvYW1JbmZvLT5wQnNzRGVzYy0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOyAKKyAgICAgICAgICAgICAgICAgICAgYXBwbGU4MDIxMUludGVyZmFjZS0+d2lsbFJvYW0oJmJzc2lkKTsgIC8vIFJldHVybiByZXN1bHQgaXNuJ3Qgc2lnbmlmaWNhbnQgCisgICAgICAgICAgICAgICAgICAgIERCR0xPRygiJXM6IHdpbGxSb2FtIChjYWxsZWQgb3V0IG9mIG9yZGVyKSByZXR1cm5zXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICBEQkdMT0coIiAgICB3aXRoIEJTU0lEID0gIiBNQUNfQUREUl9TVFJJTkcoYnNzaWQuZXRoZXJfYWRkcl9vY3RldCkpOworLy8jZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSByb2FtIGlzIE5PVCBhY2NlcHRhYmxlLCByZXR1cm4gRkFJTFVSRQorICAgICAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBzaG91bGRSb2FtIHJldHVybnMgXCJOT1QgYWNjZXB0YWJsZVwiXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9ESVNBU1NPQ0lBVEVEOgorICAgICAgICAgICAgLy9pZiAoZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQgPT0gcm9hbVJlc3VsdCB8fCBlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUiA9PSByb2FtUmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+bUFzc29jaWF0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChtTGlua1N0YXR1cyAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHTE9HKCIlczogbWFya2luZyBsaW5rIGFzIGRvd24gaW4gJXNcbiIsIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9ESVNBU1NPQ0lBVEVEIik7CisgICAgICAgICAgICAgICAgICAgIG1MaW5rU3RhdHVzID0gKHRBTklfVTgpIDA7CisgICAgICAgICAgICAgICAgICAgICgoSU84MDIxMUludGVyZmFjZSopIG1OZXR3b3JrSUYpLT5zZXRMaW5rU3RhdGUoa0lPODAyMTFOZXR3b3JrTGlua0Rvd24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBsaW5rIGFscmVhZHkgZG93biBpbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX0RJU0FTU09DSUFURUQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9MT1NUTElOSzoKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+bUFzc29jaWF0ZWRTdGF0dXMgPSBBUFBMRTgwMjExX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5tQXNzb2NpYXRlZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAobUxpbmtTdGF0dXMgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBtYXJraW5nIGxpbmsgYXMgZG93biBpbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX0xPU1RMSU5LIik7CisgICAgICAgICAgICAgICAgbUxpbmtTdGF0dXMgPSAodEFOSV9VOCkgMDsKKyAgICAgICAgICAgICAgICAoKElPODAyMTFJbnRlcmZhY2UqKSBtTmV0d29ya0lGKS0+c2V0TGlua1N0YXRlKGtJTzgwMjExTmV0d29ya0xpbmtEb3duKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdMT0coIiVzOiBsaW5rIGFscmVhZHkgZG93biBpbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX0xPU1RMSU5LIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9TVEFSVDoKKyAgICAgICAgICAgIERCR0xPRygiJXM6IEluICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fQVNTT0NJQVRJT05fU1RBUlQiKTsKKyNpZiAwCisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByaWdodCBwbGFjZSB0byBjYWxsIHdpbGxSb2FtIC0gZm9yIGFuICJpbml0aWFsIiBhc3NvY2lhdGlvbi4KKyAgICAgICAgICAgIC8vIEJ1dCwgdW5mb3J0dW5hdGVseSwgd2hlbiBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fU1RBUlQgZ2V0cyBjYWxsZWQsIAorICAgICAgICAgICAgLy8gaXQgZG9lc24ndCBoYXZlIGEgcG9pbnRlciB0byB0aGUgdEJzc0Rlc2NyaXB0aW9uIGluIHRoZSByb2FtaW5nIGNhbGxiYWNrIAorICAgICAgICAgICAgLy8gcm91dGluZXMgcGFyYW1ldGVyIHAxIChwQ2FsbGJhY2tJbmZvIGluIFNldFdleHRTdGF0ZSkuICAgU28sIGRvbid0IHVzZSB0aGlzIGNvZGUsIHlldC4KKyAgICAgICAgICAgIGlmICgocENzclJvYW1JbmZvKSAmJiAocENzclJvYW1JbmZvLT5wQnNzRGVzYykgeworICAgICAgICAgICAgICAgIG1lbWNweShic3NpZC5ldGhlcl9hZGRyX29jdGV0LCBwQ3NyUm9hbUluZm8tPnBCc3NEZXNjLT5ic3NJZCwgNik7IAorICAgICAgICAgICAgICAgIGFwcGxlODAyMTFJbnRlcmZhY2UtPndpbGxSb2FtKCZic3NpZCk7ICAvLyBSZXR1cm4gcmVzdWx0IGlzbid0IHNpZ25pZmljYW50IAorICAgICAgICAgICAgICAgIERCR0xPRygiJXM6IHdpbGxSb2FtIHJldHVybnNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgREJHTE9HKCIgICAgd2l0aCBCU1NJRCA9ICIgTUFDX0FERFJfU1RSSU5HKGJzc2lkLmV0aGVyX2FkZHJfb2N0ZXQpKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLzAKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT046CisgICAgICAgICAgICBEQkdMT0coIiVzOiBJbiAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX01JQ19FUlJPUl9JTkQ6ICAgLy8gSGFuZGxlZCBpbiBlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9VTklDQVNUIGFuZCBHUk9VUCwgYWJvdmUKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fQ0FOQ0VMTEVEOgorICAgICAgICBjYXNlIGVDU1JfUk9BTV9ST0FNSU5HX0NPTVBMRVRJT046CisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1NDQU5fRk9VTkRfTkVXX0JTUzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvLzAKKworICAgIHJldHVybiBoYWxTdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgUHJvY2VkdXJhbCBBUEkKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQlQgdjMuMCBMaW5rIENvbnRyb2wgY29tbWFuZHMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRWFjaCBvZiB0aGUgbmV4dCBlaWdodCBjb21tYW5kIHJlc3VsdCBpbiBhc3luY2hyb25vdXMgZXZlbnRzIChlLmcuLCAgCisgICAgSENJX1BIWVNJQ0FMX0xJTktfQ09NUExFVEVfRVZFTlQsIEhDSV9MT0dJQ0FMX0xJTktfQ09NUExFVEVfRVZFTlQsIGV0Yy4uLikKKyAgICBUaGVzZSBhcmUgc2lnbmFsbGVkIHRocnUgdGhlIGV2ZW50IGNhbGxiYWNrLiAoSS5FLiwgKCp0cFdMQU5fQkFQRXZlbnRDQikuKQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUGh5c2ljYWxMaW5rQ3JlYXRlKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIENyZWF0ZSBQaHlzaWNhbCBMaW5rIGNvbW1hbmQKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgICAgICAgICAgICAgIFdMQU5CQVBfR2V0TmV3SG5kbCBoYXMgdG8gYmUgY2FsbGVkIGJlZm9yZSBldmVyeSBjYWxsIHRvIAorICAgICAgICAgICAgICAgICBXTEFOX0JBUFBoeXNpY2FsTGlua0NyZWF0ZS4gU2luY2UgdGhlIGNvbnRleHQgaXMgcGVyIAorICAgICAgICAgICAgICAgICBwaHlzaWNhbCBsaW5rLgorICAgIHBCYXBIQ0lQaHlzTGlua0NyZWF0ZTogIHBvaW50ZXIgdG8gdGhlICJIQ0kgQ3JlYXRlIFBoeXNpY2FsIExpbmsiIFN0cnVjdHVyZS4KKyAgICBwSGRkSGRsOiAgVGhlIGNvbnRleHQgcGFzc2VkIGluIGJ5IHRoZSBjYWxsZXIuIChlLmcuLCBCU0wgc3BlY2lmaWMgY29udGV4dCkKKworICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgU3RhdHVzIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lQaHlzTGlua0NyZWF0ZSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBQaHlzaWNhbExpbmtDcmVhdGUgCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kICAgKnBCYXBIQ0lQaHlzTGlua0NyZWF0ZSwKKyAgdl9QVk9JRF90ICAgICAgcEhkZEhkbCwgICAvKiBCU0wgcGFzc2VzIGluIGl0cyBzcGVjaWZpYyBjb250ZXh0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW5kIEkgZ2V0IHBoeV9saW5rX2hhbmRsZSBmcm9tIHRoZSBDb21tYW5kICovCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispCit7CisgICAgdFdMQU5fQkFQRXZlbnQgYmFwRXZlbnQ7IC8qIFN0YXRlIG1hY2hpbmUgZXZlbnQgKi8KKyAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXM7CisgICAgLyogSSBhbSB1c2luZyBidGFtcENvbnRleHQsIGluc3RlYWQgb2YgcEJhcFBoeXNMaW5rTWFjaGluZSAqLyAKKyAgICAvL3RXTEFOX0JBUGJhcFBoeXNMaW5rTWFjaGluZSAqcEJhcFBoeXNMaW5rTWFjaGluZTsKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOyAvKiBidGFtcENvbnRleHQgdmFsdWUgKi8gCisgICAgdl9VOF90IHN0YXR1czsgICAgLyogcmV0dXJuIHRoZSBCVC1BTVAgc3RhdHVzIGhlcmUgKi8KKyAgICBCVEFNUEZTTV9JTlNUQU5DRURBVEFfVCAqaW5zdGFuY2VWYXIgPSAmKGJ0YW1wQ29udGV4dC0+YmFwUGh5c0xpbmtNYWNoaW5lKTsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoKHBCYXBIQ0lQaHlzTGlua0NyZWF0ZSA9PSBOVUxMKSB8fCAoTlVMTCA9PSBidGFtcENvbnRleHQpKQorICAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgsIHBCYXBIQ0lQaHlzTGlua0NyZWF0ZSBpcyAleCIsIAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSwgcEJhcEhDSVBoeXNMaW5rQ3JlYXRlKTsgCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnRhbXBIYW5kbGUgdmFsdWU6ICV4IiwgX19GVU5DVElPTl9fLCAgYnRhbXBIYW5kbGUpOyAKKworICAgIGlmKERJU0NPTk5FQ1RFRCAhPSBpbnN0YW5jZVZhci0+c3RhdGVWYXIpCisgICAgeworICAgICAgIC8qIENyZWF0ZS9BY2NlcHQgUGh5IGxpbmsgcmVxdWVzdCBpbiBpbnZhbGlkIHN0YXRlICovCisgICAgICAgIHN0YXR1cyA9IFdMQU5CQVBfRVJST1JfTUFYX05VTV9DTkNUUzsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8gCisgICAgICAgIGJhcEV2ZW50LmV2ZW50ID0gZVdMQU5fQkFQX0hDSV9QSFlTSUNBTF9MSU5LX0NSRUFURTsKKyAgICAgICAgYmFwRXZlbnQucGFyYW1zID0gcEJhcEhDSVBoeXNMaW5rQ3JlYXRlOworICAgICAgICAvL2JhcEV2ZW50LmNhbGxiYWNrID0gcEJhcEhDSVBoeXNMaW5rQ3JlYXRlQ0I7CisKKyAgICAgICAgLyogQWxsb2NhdGUgYSBuZXcgc3RhdGUgbWFjaGluZSBpbnN0YW5jZSAqLyAKKyAgICAgICAgLyogVGhlcmUgd2lsbCBvbmx5IGV2ZXIgYmUgb25lIG9mIHRoZXNlIChOQjogRG9uJ3QgYXNzdW1lIHRoaXMuKSAqLworICAgICAgICAvKiBTbyBmb3Igbm93IHRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgc3RydWN0dXJlICovIAorICAgICAgICAvKiAoV2l0aCBhbGwgc3RhdGUgc2V0IHRvIGluaXRpYWwgdmFsdWVzKSAqLworICAgICAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX0NyZWF0ZU5ld1BoeUxpbmtDdHggKCAKKyAgICAgICAgICAgICAgICBidGFtcEhhbmRsZSwgCisgICAgICAgICAgICAgICAgcEJhcEhDSVBoeXNMaW5rQ3JlYXRlLT5waHlfbGlua19oYW5kbGUsIC8qICBJIGdldCBwaHlfbGlua19oYW5kbGUgZnJvbSB0aGUgQ29tbWFuZCAqLworICAgICAgICAgICAgICAgIHBIZGRIZGwsICAgLyogQlNMIHBhc3NlcyBpbiBpdHMgc3BlY2lmaWMgY29udGV4dCAqLworICAgICAgICAgICAgICAgICZidGFtcENvbnRleHQsIC8qIEhhbmRsZSB0byByZXR1cm4gcGVyIGFzc29jIGJ0YW1wQ29udGV4dCB2YWx1ZSBpbiAgKi8gCisgICAgICAgICAgICAgICAgQlRfSU5JVElBVE9SKTsgLyogQlRfSU5JVElBVE9SICovIAorCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnRhbXBDb250ZXh0IHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wQ29udGV4dCk7IAorCisgICAgICAgIC8qIEhhbmRsZSBldmVudCAqLyAKKyAgICAgICAgdm9zU3RhdHVzID0gYnRhbXBGc20oYnRhbXBDb250ZXh0LCAmYmFwRXZlbnQsICZzdGF0dXMpOworICAgIH0KKyAgCisgICAgICAgIC8qIEZvcm1hdCB0aGUgY29tbWFuZCBzdGF0dXMgZXZlbnQgdG8gcmV0dXJuLi4uICovIAorICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX1NUQVRVU19FVkVOVDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQucHJlc2VudCA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnN0YXR1cyA9IHN0YXR1czsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5jb21tYW5kX29wY29kZSAKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX0NSRUFURV9QSFlTSUNBTF9MSU5LX0NNRDsKKworICAgIC8qIC4uLiAqLyAKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQUGh5c2ljYWxMaW5rQ3JlYXRlICovIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFBoeXNpY2FsTGlua0FjY2VwdCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBBY2NlcHQgUGh5c2ljYWwgTGluayBjb21tYW5kCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lQaHlzTGlua0FjY2VwdDogIHBvaW50ZXIgdG8gdGhlICJIQ0kgQWNjZXB0IFBoeXNpY2FsIExpbmsiIFN0cnVjdHVyZS4KKyAgICBwSGRkSGRsOiAgVGhlIGNvbnRleHQgcGFzc2VkIGluIGJ5IHRoZSBjYWxsZXIuIChlLmcuLCBCU0wgc3BlY2lmaWMgY29udGV4dCkKKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgU3RhdHVzIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lQaHlzTGlua0FjY2VwdCBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBQaHlzaWNhbExpbmtBY2NlcHQgCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kICAgKnBCYXBIQ0lQaHlzTGlua0FjY2VwdCwKKyAgdl9QVk9JRF90ICAgICAgcEhkZEhkbCwgICAvKiBCU0wgcGFzc2VzIGluIGl0cyBzcGVjaWZpYyBjb250ZXh0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW5kIEkgZ2V0IHBoeV9saW5rX2hhbmRsZSBmcm9tIHRoZSBDb21tYW5kICovCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispCit7CisgICAgdFdMQU5fQkFQRXZlbnQgYmFwRXZlbnQ7IC8qIFN0YXRlIG1hY2hpbmUgZXZlbnQgKi8KKyAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXM7CisgICAgLyogSSBhbSB1c2luZyBidGFtcENvbnRleHQsIGluc3RlYWQgb2YgcEJhcFBoeXNMaW5rTWFjaGluZSAqLyAKKyAgICAvL3RXTEFOX0JBUGJhcFBoeXNMaW5rTWFjaGluZSAqcEJhcFBoeXNMaW5rTWFjaGluZTsKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOyAvKiBidGFtcENvbnRleHQgdmFsdWUgKi8gCisgICAgdl9VOF90IHN0YXR1czsgICAgLyogcmV0dXJuIHRoZSBCVC1BTVAgc3RhdHVzIGhlcmUgKi8KKyAgICBCVEFNUEZTTV9JTlNUQU5DRURBVEFfVCAqaW5zdGFuY2VWYXI7CisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKChwQmFwSENJUGh5c0xpbmtBY2NlcHQgPT0gTlVMTCkgfHwgKE5VTEwgPT0gYnRhbXBDb250ZXh0KSkKKyAgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogYnRhbXBIYW5kbGUgdmFsdWU6ICV4LCBwQmFwSENJUGh5c0xpbmtBY2NlcHQgaXMgJXgiLCAKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAgYnRhbXBIYW5kbGUsIHBCYXBIQ0lQaHlzTGlua0FjY2VwdCk7IAorICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsgCisKKyAgICBpbnN0YW5jZVZhciA9ICYoYnRhbXBDb250ZXh0LT5iYXBQaHlzTGlua01hY2hpbmUpOworICAgIGlmKERJU0NPTk5FQ1RFRCAhPSBpbnN0YW5jZVZhci0+c3RhdGVWYXIpCisgICAgeworICAgICAgIC8qIENyZWF0ZS9BY2NlcHQgUGh5IGxpbmsgcmVxdWVzdCBpbiBpbnZhbGlkIHN0YXRlICovCisgICAgICAgIHN0YXR1cyA9IFdMQU5CQVBfRVJST1JfTUFYX05VTV9DTkNUUzsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8gCisgICAgICAgIGJhcEV2ZW50LmV2ZW50ID0gZVdMQU5fQkFQX0hDSV9QSFlTSUNBTF9MSU5LX0FDQ0VQVDsKKyAgICAgICAgYmFwRXZlbnQucGFyYW1zID0gcEJhcEhDSVBoeXNMaW5rQWNjZXB0OworICAgICAgICAvL2JhcEV2ZW50LmNhbGxiYWNrID0gcEJhcEhDSVBoeXNMaW5rQWNjZXB0Q0I7CisKKyAgICAgICAgLyogQWxsb2NhdGUgYSBuZXcgc3RhdGUgbWFjaGluZSBpbnN0YW5jZSAqLyAKKyAgICAgICAgLyogVGhlcmUgd2lsbCBvbmx5IGV2ZXIgYmUgb25lIG9mIHRoZXNlIChOQjogRG9uJ3QgYXNzdW1lIHRoaXMuKSAqLworICAgICAgICAvKiBTbyBmb3Igbm93IHRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgc3RydWN0dXJlICovIAorICAgICAgICAvKiAoV2l0aCBhbGwgc3RhdGUgc2V0IHRvIGluaXRpYWwgdmFsdWVzKSAqLworICAgICAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX0NyZWF0ZU5ld1BoeUxpbmtDdHggKCAKKyAgICAgICAgICAgICAgICBidGFtcEhhbmRsZSwgCisgICAgICAgICAgICAgICAgcEJhcEhDSVBoeXNMaW5rQWNjZXB0LT5waHlfbGlua19oYW5kbGUsIC8qICBJIGdldCBwaHlfbGlua19oYW5kbGUgZnJvbSB0aGUgQ29tbWFuZCAqLworICAgICAgICAgICAgICAgIHBIZGRIZGwsICAgLyogQlNMIHBhc3NlcyBpbiBpdHMgc3BlY2lmaWMgY29udGV4dCAqLworICAgICAgICAgICAgICAgICZidGFtcENvbnRleHQsIC8qIEhhbmRsZSB0byByZXR1cm4gcGVyIGFzc29jIGJ0YW1wQ29udGV4dCB2YWx1ZSBpbiAgKi8gCisgICAgICAgICAgICAgICAgQlRfUkVTUE9OREVSKTsgLyogQlRfUkVTUE9OREVSICovIAorCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnRhbXBDb250ZXh0IHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wQ29udGV4dCk7IAorCisgICAgICAgIC8qIEhhbmRsZSBldmVudCAqLyAKKyAgICAgICAgdm9zU3RhdHVzID0gYnRhbXBGc20oYnRhbXBDb250ZXh0LCAmYmFwRXZlbnQsICZzdGF0dXMpOworICAKKyAgICB9CisgICAgLyogRm9ybWF0IHRoZSBjb21tYW5kIHN0YXR1cyBldmVudCB0byByZXR1cm4uLi4gKi8gCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfU1RBVFVTX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5wcmVzZW50ID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0gc3RhdHVzOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LmNvbW1hbmRfb3Bjb2RlIAorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfQUNDRVBUX1BIWVNJQ0FMX0xJTktfQ01EOworCisgICAgLyogLi4uICovIAorCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogV0xBTl9CQVBQaHlzaWNhbExpbmtBY2NlcHQgKi8gCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUGh5c2ljYWxMaW5rRGlzY29ubmVjdCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBEaXNjb25uZWN0IFBoeXNpY2FsIExpbmsgY29tbWFuZAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJUGh5c0xpbmtEaXNjb25uZWN0OiAgcG9pbnRlciB0byB0aGUgIkhDSSBEaXNjb25uZWN0IFBoeXNpY2FsIExpbmsiIFN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgU3RhdHVzIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lQaHlzTGlua0Rpc2Nvbm5lY3QgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQUGh5c2ljYWxMaW5rRGlzY29ubmVjdCAKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kICAgKnBCYXBIQ0lQaHlzTGlua0Rpc2Nvbm5lY3QsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispCit7CisgICAgdFdMQU5fQkFQRXZlbnQgYmFwRXZlbnQ7IC8qIFN0YXRlIG1hY2hpbmUgZXZlbnQgKi8KKyAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXM7CisgICAgLyogSSBhbSB1c2luZyBidGFtcENvbnRleHQsIGluc3RlYWQgb2YgcEJhcFBoeXNMaW5rTWFjaGluZSAqLyAKKyAgICAvL3RXTEFOX0JBUGJhcFBoeXNMaW5rTWFjaGluZSAqcEJhcFBoeXNMaW5rTWFjaGluZTsKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOyAvKiBidGFtcENvbnRleHQgdmFsdWUgKi8gCisgICAgdl9VOF90IHN0YXR1czsgICAgLyogcmV0dXJuIHRoZSBCVC1BTVAgc3RhdHVzIGhlcmUgKi8KKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAocEJhcEhDSVBoeXNMaW5rRGlzY29ubmVjdCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnRhbXBIYW5kbGUgdmFsdWU6ICV4IiwgX19GVU5DVElPTl9fLCAgYnRhbXBIYW5kbGUpOyAKKworICAgIC8qIFZhbGlkYXRlIHRoZSBQaHlzaWNhbCBsaW5rIGhhbmRsZSAqLworICAgIGlmIChwQmFwSENJUGh5c0xpbmtEaXNjb25uZWN0LT5waHlfbGlua19oYW5kbGUgIT0gYnRhbXBDb250ZXh0LT5waHlfbGlua19oYW5kbGUpIAorICAgIHsKKyAgICAgICAgLyogRm9ybWF0IHRoZSBjb21tYW5kIHN0YXR1cyBldmVudCB0byByZXR1cm4uLi4gKi8gCisgICAgICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX1NUQVRVU19FVkVOVDsKKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnByZXNlbnQgPSAxOworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0gV0xBTkJBUF9FUlJPUl9OT19DTkNUOworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuY29tbWFuZF9vcGNvZGUKKyAgICAgICAgICAgID0gQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTktfQ01EOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLyAKKyAgICBiYXBFdmVudC5ldmVudCA9IGVXTEFOX0JBUF9IQ0lfUEhZU0lDQUxfTElOS19ESVNDT05ORUNUOworICAgIGJhcEV2ZW50LnBhcmFtcyA9IHBCYXBIQ0lQaHlzTGlua0Rpc2Nvbm5lY3Q7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IGJ0YW1wQ29udGV4dCB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcENvbnRleHQpOyAKKworICAgIC8qIEhhbmRsZSBldmVudCAqLyAKKyAgICB2b3NTdGF0dXMgPSBidGFtcEZzbShidGFtcENvbnRleHQsICZiYXBFdmVudCwgJnN0YXR1cyk7CisgIAorICAgICAgICAvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8gCisgICAgYmFwRXZlbnQuZXZlbnQgPSAgZVdMQU5fQkFQX01BQ19SRUFEWV9GT1JfQ09OTkVDVElPTlM7CisgICAgYmFwRXZlbnQucGFyYW1zID0gcEJhcEhDSVBoeXNMaW5rRGlzY29ubmVjdDsKKworICAgICAgICAvKiBIYW5kbGUgZXZlbnQgKi8gCisgICAgdm9zU3RhdHVzID0gYnRhbXBGc20oYnRhbXBDb250ZXh0LCAmYmFwRXZlbnQsICZzdGF0dXMpOworCisKKyAgICAvKiBGb3JtYXQgdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50IHRvIHJldHVybi4uLiAqLyAKKyAgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9TVEFUVVNfRVZFTlQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnByZXNlbnQgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5zdGF0dXMgPSBzdGF0dXM7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuY29tbWFuZF9vcGNvZGUKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX0RJU0NPTk5FQ1RfUEhZU0lDQUxfTElOS19DTUQ7CisKKyAgICAvKiAuLi4gKi8gCisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFBoeXNpY2FsTGlua0Rpc2Nvbm5lY3QgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBMb2dpY2FsTGlua0NyZWF0ZSgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBDcmVhdGUgTG9naWNhbCBMaW5rIGNvbW1hbmQKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSUxvZ0xpbmtDcmVhdGU6ICBwb2ludGVyIHRvIHRoZSAiSENJIENyZWF0ZSBMb2dpY2FsIExpbmsiIFN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgU3RhdHVzIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lMb2dMaW5rQ3JlYXRlIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUExvZ2ljYWxMaW5rQ3JlYXRlCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQgICAqcEJhcEhDSUxvZ0xpbmtDcmVhdGUsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispCit7CisgICAgdEJ0YW1wSENJX0V2ZW50IGJhcEhDSUV2ZW50OyAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1czsKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOworICAgIHZfVTE2X3QgbG9nX2xpbmtfaW5kZXggPSAwOworICAgIEJUQU1QRlNNX0lOU1RBTkNFREFUQV9UICppbnN0YW5jZVZhciA9ICYoYnRhbXBDb250ZXh0LT5iYXBQaHlzTGlua01hY2hpbmUpOworICAgIFZPU19TVEFUVVMgIHJldHZhbDsKKyAgICB2X1UxNl90IGluZGV4X2Zvcl9sb2dMaW5rQ3R4ID0gMDsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworCisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovIAorICAgIGlmIChidGFtcEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAocEJhcEhDSUxvZ0xpbmtDcmVhdGUgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnRhbXBIYW5kbGUgdmFsdWU6ICV4IiwgX19GVU5DVElPTl9fLCAgYnRhbXBIYW5kbGUpOyAKKworICAgIC8qIFZhbGlkYXRlIHRoZSBCQVAgc3RhdGUgdG8gYWNjZXB0IHRoZSBsb2dpY2FsIGxpbmsgcmVxdWVzdAorICAgICAgIExvZ2ljYWwgTGluayBjcmVhdGUvYWNjZXB0IHJlcXVlc3RzIGFyZSBhbGxvd2VkIG9ubHkgaW4KKyAgICAgICBDT05ORUNURUQgc3RhdGUgKi8KKyAgICAvKiBGb3JtIGFuZCBpbW1lZGlhdGVseSByZXR1cm4gdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50Li4uICovIAorICAgIGJhcEhDSUV2ZW50LmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9TVEFUVVNfRVZFTlQ7CisgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5wcmVzZW50ID0gMTsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LmNvbW1hbmRfb3Bjb2RlIAorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfQ1JFQVRFX0xPR0lDQUxfTElOS19DTUQ7CisKKyAgICByZXR2YWwgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICBpZihESVNDT05ORUNURUQgPT0gaW5zdGFuY2VWYXItPnN0YXRlVmFyKQorICAgIHsKKyAgICAgICAvKiBDcmVhdGUgTG9naWNhbCBsaW5rIHJlcXVlc3QgaW4gaW52YWxpZCBzdGF0ZSAqLworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID0KKyAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfQ01ORF9ESVNBTExPV0VEOworICAgICAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnN0YXR1cyA9IFdMQU5CQVBfRVJST1JfTk9fQ05DVDsKKworICAgIH0KKyAgICBlbHNlIGlmIChDT05ORUNURUQgIT0gaW5zdGFuY2VWYXItPnN0YXRlVmFyKQorICAgIHsKKyAgICAgICAgLyogQ3JlYXRlIExvZ2ljYWwgbGluayByZXF1ZXN0IGluIGludmFsaWQgc3RhdGUgKi8KKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wTG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cyA9CisgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0NNTkRfRElTQUxMT1dFRDsKKyAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5zdGF0dXMgPSBXTEFOQkFQX0VSUk9SX0NNTkRfRElTQUxMT1dFRDsKKyAgICB9CisgICAgZWxzZSBpZiAocEJhcEhDSUxvZ0xpbmtDcmVhdGUtPnBoeV9saW5rX2hhbmRsZSAhPSBidGFtcENvbnRleHQtPnBoeV9saW5rX2hhbmRsZSkKKyAgICB7CisgICAgICAgLyogSW52YWxpZCBQaHlzaWNhbCBsaW5rIGhhbmRsZSAqLworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID0KKyAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfSU5WQUxJRF9IQ0lfQ01ORF9QQVJBTTsKKyAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5zdGF0dXMgPSBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX3N0YXRlID0gV0xBTl9CQVBMb2dMaW5rSW5Qcm9ncmVzczsKKworICAgICAgICBpZiggVFJVRSA9PSBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19jYW5jZWxfcGVuZGluZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPQorICAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfTk9fQ05DVDsKKyAgICAgICAgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0gV0xBTkJBUF9FUlJPUl9OT19DTkNUOworICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9sb2dpY2FsX2xpbmtfc3RhdGUgPSBXTEFOX0JBUExvZ0xpbmtDbG9zZWQ7CisgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19jYW5jZWxfcGVuZGluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogSWYgYnRhbXBfYXN5bmNfbG9naWNhbF9saW5rX2NyZWF0ZSBpcyBzZXQsIHdlIHdpbGwgc2VyYWxpemUgdGhlIHJlcQorICAgICAgICAgICAgICAgb24gTUMgdGhyZWFkICYgaGFuZGxlIGl0IHRoZXJlIGFmdGVyOyBJZiB0aGUgYWJvdmUgZmxhZyBpcyBub3Qgc2V0CisgICAgICAgICAgICAgICByZXNwb25kIHRvIEhDSSB0aGUgc3luYyB3YXkgYXMgYmVmb3JlICovCisgICAgICAgICAgICBpZihGQUxTRSA9PSBidGFtcENvbnRleHQtPmJ0YW1wX2FzeW5jX2xvZ2ljYWxfbGlua19jcmVhdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgbG9naWNhbCBsaW5rIGluZGV4IGZvciB0aGVzZSBmbG93IHNwZWNzICovCisgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IFdMQU5CQVBfQ3JlYXRlTmV3TG9nTGlua0N0eCggCisgICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LCAvKiBwZXIgYXNzb2MgYnRhbXBDb250ZXh0IHZhbHVlICovIAorICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMb2dMaW5rQ3JlYXRlLT5waHlfbGlua19oYW5kbGUsIC8qICBJIGdldCBwaHlfbGlua19oYW5kbGUgZnJvbSB0aGUgQ29tbWFuZCAqLworICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMb2dMaW5rQ3JlYXRlLT50eF9mbG93X3NwZWMsIC8qICBJIGdldCB0eF9mbG93X3NwZWMgZnJvbSB0aGUgQ29tbWFuZCAqLworICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMb2dMaW5rQ3JlYXRlLT5yeF9mbG93X3NwZWMsIC8qICBJIGdldCByeF9mbG93X3NwZWMgZnJvbSB0aGUgQ29tbWFuZCAqLworICAgICAgICAgICAgICAgICAgICZsb2dfbGlua19pbmRleCAvKiAgUmV0dXJuIHRoZSBsb2dpY2FsIGxpbmsgaW5kZXggaGVyZSAqLworICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIGZsb3cgc3BlYyBmb3JtYXQgKi8KKyAgICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9JTlZBTElEX0hDSV9DTU5EX1BBUkFNOworICAgICAgICAgICAgICAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5zdGF0dXMgPSBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19zdGF0ZSA9IFdMQU5fQkFQTG9nTGlua0Nsb3NlZDsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5zdGF0dXMgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworCisgICAgICAgICAgICAgICAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wTG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cyA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9sb2dpY2FsX2xpbmtfc3RhdGUgPSBXTEFOX0JBUExvZ0xpbmtPcGVuOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9sb2dpY2FsX2xpbmtfcmVxX2luZm8ucGh5TGlua0hhbmRsZSA9IAorICAgICAgICAgICAgICAgICAgICBwQmFwSENJTG9nTGlua0NyZWF0ZS0+cGh5X2xpbmtfaGFuZGxlOworICAgICAgICAgICAgICAgIHZvc19tZW1fY29weShidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19yZXFfaW5mby50eEZsb3dTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmFwSENJTG9nTGlua0NyZWF0ZS0+dHhfZmxvd19zcGVjLCAxOCk7CisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX3JlcV9pbmZvLnJ4Rmxvd1NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMb2dMaW5rQ3JlYXRlLT5yeF9mbG93X3NwZWMsIDE4KTsKKyAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2FzeW5jX2xvZ2ljYWxfbGlua19jcmVhdGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBidGFtcEVzdGFibGlzaExvZ0xpbmsoYnRhbXBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVk9TX1NUQVRVU19FX0JVU1k7Ly90aGlzIHdpbGwgbWFrZSBzdXJlIGV2ZW50IGNvbXBsZXRlIGlzIG5vdCBzZW50IHRvIEhDSQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfSU5WQUxJRF9IQ0lfQ01ORF9QQVJBTTsKKyAgICAgICAgICAgICAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5zdGF0dXMgPSBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX3N0YXRlID0gV0xBTl9CQVBMb2dMaW5rQ2xvc2VkOworICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvc1N0YXR1cyA9ICgqYnRhbXBDb250ZXh0LT5wQmFwSENJRXZlbnRDQikgCisgICAgICAgICAgICAgICAgKCAgCisgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+cEhkZEhkbCwgICAvKiB0aGlzIHJlZmVycyB0byB0aGUgQlNMIHBlciBjb25uZWN0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgICAgICAgICAgJmJhcEhDSUV2ZW50LCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICBWT1NfVFJVRSAvKiBGbGFnIHRvIGluZGljYXRlIGFzc29jLXNwZWNpZmljIGV2ZW50ICovIAorICAgICAgICAgICAgICAgICk7CisKKyAgICBpbmRleF9mb3JfbG9nTGlua0N0eCA9IGxvZ19saW5rX2luZGV4ID4+IDg7CisgICAgLyogRm9ybWF0IHRoZSBMb2dpY2FsIExpbmsgQ29tcGxldGUgZXZlbnQgdG8gcmV0dXJuLi4uICovIAorICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9MT0dJQ0FMX0xJTktfQ09NUExFVEVfRVZFTlQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wTG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSAxOworCisgICAgLyogIFJldHVybiB0aGUgbG9naWNhbCBsaW5rIGluZGV4IGhlcmUgKi8KKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQubG9nX2xpbmtfaGFuZGxlIAorICAgICAgICA9IGxvZ19saW5rX2luZGV4OworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5waHlfbGlua19oYW5kbGUgCisgICAgICAgID0gcEJhcEhDSUxvZ0xpbmtDcmVhdGUtPnBoeV9saW5rX2hhbmRsZTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQuZmxvd19zcGVjX2lkCisgICAgICAgID0gYnRhbXBDb250ZXh0LT5idGFtcExvZ0xpbmtDdHhbaW5kZXhfZm9yX2xvZ0xpbmtDdHhdLmJ0YW1wRmxvd1NwZWMuZmxvd19zcGVjX2lkOworCisgICAgLyogLi4uICovIAorCisgICAgcmV0dXJuIHJldHZhbDsKK30gLyogV0xBTl9CQVBMb2dpY2FsTGlua0NyZWF0ZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUExvZ2ljYWxMaW5rQWNjZXB0KCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIEFjY2VwdCBMb2dpY2FsIExpbmsgY29tbWFuZAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJTG9nTGlua0FjY2VwdDogIHBvaW50ZXIgdG8gdGhlICJIQ0kgQWNjZXB0IExvZ2ljYWwgTGluayIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBzdGF0dXMgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBTdGF0dXMgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSUxvZ0xpbmtBY2NlcHQgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQTG9naWNhbExpbmtBY2NlcHQKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZCAgICpwQmFwSENJTG9nTGlua0FjY2VwdCwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKykKK3sKKyAgICB0QnRhbXBIQ0lfRXZlbnQgYmFwSENJRXZlbnQ7IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzOworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisgICAgdl9VMTZfdCBsb2dfbGlua19pbmRleCA9IDA7CisgICAgQlRBTVBGU01fSU5TVEFOQ0VEQVRBX1QgKmluc3RhbmNlVmFyID0gJihidGFtcENvbnRleHQtPmJhcFBoeXNMaW5rTWFjaGluZSk7CisgICAgVk9TX1NUQVRVUyAgcmV0dmFsOworICAgIHZfVTE2X3QgaW5kZXhfZm9yX2xvZ0xpbmtDdHg7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoYnRhbXBIYW5kbGUgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKHBCYXBIQ0lMb2dMaW5rQWNjZXB0ID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IGJ0YW1wSGFuZGxlIHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIGJ0YW1wSGFuZGxlKTsgCisKKyAgICAvKiBWYWxpZGF0ZSB0aGUgQkFQIHN0YXRlIHRvIGFjY2VwdCB0aGUgbG9naWNhbCBsaW5rIHJlcXVlc3QKKyAgICAgICBMb2dpY2FsIExpbmsgY3JlYXRlL2FjY2VwdCByZXF1ZXN0cyBhcmUgYWxsb3dlZCBvbmx5IGluCisgICAgICAgQ09OTkVDVEVEIHN0YXRlICovCisgICAgLyogRm9ybSBhbmQgaW1tZWRpYXRlbHkgcmV0dXJuIHRoZSBjb21tYW5kIHN0YXR1cyBldmVudC4uLiAqLyAKKyAgICBiYXBIQ0lFdmVudC5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfU1RBVFVTX0VWRU5UOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQucHJlc2VudCA9IDE7CisgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5jb21tYW5kX29wY29kZSAKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX0FDQ0VQVF9MT0dJQ0FMX0xJTktfQ01EOworCisgICAgcmV0dmFsID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgaWYoRElTQ09OTkVDVEVEID09IGluc3RhbmNlVmFyLT5zdGF0ZVZhcikKKyAgICB7CisgICAgICAgLyogQ3JlYXRlIExvZ2ljYWwgbGluayByZXF1ZXN0IGluIGludmFsaWQgc3RhdGUgKi8KKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wTG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cyA9CisgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0NNTkRfRElTQUxMT1dFRDsKKyAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5zdGF0dXMgPSBXTEFOQkFQX0VSUk9SX05PX0NOQ1Q7CisKKyAgICB9CisgICAgZWxzZSBpZiAoQ09OTkVDVEVEICE9IGluc3RhbmNlVmFyLT5zdGF0ZVZhcikKKyAgICB7CisgICAgICAgIC8qIENyZWF0ZSBMb2dpY2FsIGxpbmsgcmVxdWVzdCBpbiBpbnZhbGlkIHN0YXRlICovCisgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPQorICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9DTU5EX0RJU0FMTE9XRUQ7CisgICAgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0gV0xBTkJBUF9FUlJPUl9DTU5EX0RJU0FMTE9XRUQ7CisgICAgfQorICAgIGVsc2UgaWYgKHBCYXBIQ0lMb2dMaW5rQWNjZXB0LT5waHlfbGlua19oYW5kbGUgIT0gYnRhbXBDb250ZXh0LT5waHlfbGlua19oYW5kbGUpCisgICAgeworICAgICAgIC8qIEludmFsaWQgUGh5c2ljYWwgbGluayBoYW5kbGUgKi8KKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wTG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cyA9CisgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0gV0xBTkJBUF9FUlJPUl9JTlZBTElEX0hDSV9DTU5EX1BBUkFNOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19zdGF0ZSA9IFdMQU5fQkFQTG9nTGlua0luUHJvZ3Jlc3M7CisgICAgICAgIGlmKCBUUlVFID09IGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX2NhbmNlbF9wZW5kaW5nICkKKyAgICAgICAgeworICAgICAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wTG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cyA9CisgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9OT19DTkNUOworICAgICAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5zdGF0dXMgPSBXTEFOQkFQX0VSUk9SX05PX0NOQ1Q7CisgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19zdGF0ZSA9IFdMQU5fQkFQTG9nTGlua0Nsb3NlZDsKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX2NhbmNlbF9wZW5kaW5nID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiBidGFtcF9hc3luY19sb2dpY2FsX2xpbmtfY3JlYXRlIGlzIHNldCwgd2Ugd2lsbCBzZXJhbGl6ZSB0aGUgcmVxCisgICAgICAgICAgICAgICBvbiBNQyB0aHJlYWQgJiBoYW5kbGUgaXQgdGhlcmUgYWZ0ZXI7IElmIHRoZSBhYm92ZSBmbGFnIGlzIG5vdCBzZXQKKyAgICAgICAgICAgICAgIHJlc3BvbmQgdG8gSENJIHRoZSBzeW5jIHdheSBhcyBiZWZvcmUgKi8KKyAgICAgICAgICAgIGlmKEZBTFNFID09IGJ0YW1wQ29udGV4dC0+YnRhbXBfYXN5bmNfbG9naWNhbF9saW5rX2NyZWF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIGxvZ2ljYWwgbGluayBpbmRleCBmb3IgdGhlc2UgZmxvdyBzcGVjcyAqLworICAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IFdMQU5CQVBfQ3JlYXRlTmV3TG9nTGlua0N0eCggCisgICAgICAgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQsIC8qIHBlciBhc3NvYyBidGFtcENvbnRleHQgdmFsdWUgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICBwQmFwSENJTG9nTGlua0FjY2VwdC0+cGh5X2xpbmtfaGFuZGxlLCAvKiAgSSBnZXQgcGh5X2xpbmtfaGFuZGxlIGZyb20gdGhlIENvbW1hbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMb2dMaW5rQWNjZXB0LT50eF9mbG93X3NwZWMsIC8qICBJIGdldCB0eF9mbG93X3NwZWMgZnJvbSB0aGUgQ29tbWFuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcEJhcEhDSUxvZ0xpbmtBY2NlcHQtPnJ4X2Zsb3dfc3BlYywgLyogIEkgZ2V0IHJ4X2Zsb3dfc3BlYyBmcm9tIHRoZSBDb21tYW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICAmbG9nX2xpbmtfaW5kZXggLyogIFJldHVybiB0aGUgbG9naWNhbCBsaW5rIGluZGV4IGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIGZsb3cgc3BlYyBmb3JtYXQgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wTG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgICAgICAgICAgICAgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0gV0xBTkJBUF9FUlJPUl9JTlZBTElEX0hDSV9DTU5EX1BBUkFNOworICAgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19zdGF0ZSA9IFdMQU5fQkFQTG9nTGlua0Nsb3NlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgICAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnN0YXR1cyA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAgICAgICAgICAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wTG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cyA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX3N0YXRlID0gV0xBTl9CQVBMb2dMaW5rT3BlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9sb2dpY2FsX2xpbmtfcmVxX2luZm8ucGh5TGlua0hhbmRsZSA9IAorICAgICAgICAgICAgICAgICAgICBwQmFwSENJTG9nTGlua0FjY2VwdC0+cGh5X2xpbmtfaGFuZGxlOworICAgICAgICAgICAgICAgIHZvc19tZW1fY29weShidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19yZXFfaW5mby50eEZsb3dTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmFwSENJTG9nTGlua0FjY2VwdC0+dHhfZmxvd19zcGVjLCAxOCk7CisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX3JlcV9pbmZvLnJ4Rmxvd1NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMb2dMaW5rQWNjZXB0LT5yeF9mbG93X3NwZWMsIDE4KTsKKyAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2FzeW5jX2xvZ2ljYWxfbGlua19jcmVhdGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBidGFtcEVzdGFibGlzaExvZ0xpbmsoYnRhbXBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVk9TX1NUQVRVU19FX0JVU1k7Ly90aGlzIHdpbGwgbWFrZSBzdXJlIGV2ZW50IGNvbXBsZXRlIGlzIG5vdCBzZW50IHRvIEhDSQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfSU5WQUxJRF9IQ0lfQ01ORF9QQVJBTTsKKyAgICAgICAgICAgICAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5zdGF0dXMgPSBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX3N0YXRlID0gV0xBTl9CQVBMb2dMaW5rQ2xvc2VkOworICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2b3NTdGF0dXMgPSAoKmJ0YW1wQ29udGV4dC0+cEJhcEhDSUV2ZW50Q0IpIAorICAgICAgICAgICAgKCAgCisgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5wSGRkSGRsLCAgIC8qIHRoaXMgcmVmZXJzIHRvIHRoZSBCU0wgcGVyIGNvbm5lY3Rpb24gY29udGV4dCAqLworICAgICAgICAgICAgICZiYXBIQ0lFdmVudCwgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICBWT1NfVFJVRSAvKiBGbGFnIHRvIGluZGljYXRlIGFzc29jLXNwZWNpZmljIGV2ZW50ICovIAorICAgICAgICAgICAgICk7CisKKyAgICBpbmRleF9mb3JfbG9nTGlua0N0eCA9IGxvZ19saW5rX2luZGV4ID4+IDg7CisKKyAgICAvKiBGb3JtYXQgdGhlIExvZ2ljYWwgTGluayBDb21wbGV0ZSBldmVudCB0byByZXR1cm4uLi4gKi8gCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0xPR0lDQUxfTElOS19DT01QTEVURV9FVkVOVDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQucHJlc2VudCA9IDE7CisgICAgLyogIFJldHVybiB0aGUgbG9naWNhbCBsaW5rIGluZGV4IGhlcmUgKi8KKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQubG9nX2xpbmtfaGFuZGxlIAorICAgICAgICA9IGxvZ19saW5rX2luZGV4OworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5waHlfbGlua19oYW5kbGUgCisgICAgICAgID0gcEJhcEhDSUxvZ0xpbmtBY2NlcHQtPnBoeV9saW5rX2hhbmRsZTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQuZmxvd19zcGVjX2lkCisgICAgICAgID0gYnRhbXBDb250ZXh0LT5idGFtcExvZ0xpbmtDdHhbaW5kZXhfZm9yX2xvZ0xpbmtDdHhdLmJ0YW1wRmxvd1NwZWMuZmxvd19zcGVjX2lkOworCisgICAgLyogLi4uICovIAorCisgICAgcmV0dXJuIHJldHZhbDsKK30gLyogV0xBTl9CQVBMb2dpY2FsTGlua0FjY2VwdCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUExvZ2ljYWxMaW5rRGlzY29ubmVjdCgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBEaXNjb25uZWN0IExvZ2ljYWwgTGluayBjb21tYW5kCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lMb2dMaW5rRGlzY29ubmVjdDogIHBvaW50ZXIgdG8gdGhlICJIQ0kgRGlzY29ubmVjdCBMb2dpY2FsIExpbmsiIFN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgU3RhdHVzIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lMb2dMaW5rRGlzY29ubmVjdCBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBMb2dpY2FsTGlua0Rpc2Nvbm5lY3QKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQgICAqcEJhcEhDSUxvZ0xpbmtEaXNjb25uZWN0LAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKQoreworICAgIHRCdGFtcEhDSV9FdmVudCAgICAgYmFwSENJRXZlbnQ7IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgcHRCdGFtcENvbnRleHQgICAgICBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOworICAgIHRwQnRhbXBMb2dMaW5rQ3R4ICAgcExvZ0xpbmtDb250ZXh0OworICAgIFZPU19TVEFUVVMgICAgICAgICAgcmV0dmFsID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHZfVThfdCAgICAgICAgICAgICAgbG9nX2xpbmtfaW5kZXg7CisKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKCBOVUxMID09IHBCYXBIQ0lMb2dMaW5rRGlzY29ubmVjdCApIHx8CisgICAgICAgICggTlVMTCA9PSBidGFtcENvbnRleHQpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiQ3JpdGljYWwgZXJyb3I6IEludmFsaWQgaW5wdXQgcGFyYW1ldGVyIG9uICVzIiwgCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsgCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7IAorICAgIH0KKworICAgIC8qIERlcml2ZSBsb2dpY2FsIGxpbmsgaW5kZXggZnJvbSBoYW5kbGUgKi8KKyAgICBsb2dfbGlua19pbmRleCA9ICgocEJhcEhDSUxvZ0xpbmtEaXNjb25uZWN0LT5sb2dfbGlua19oYW5kbGUpID4+IDgpOworCisgICAgaWYoIGxvZ19saW5rX2luZGV4ID4gV0xBTkJBUF9NQVhfTE9HX0xJTktTICkKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICJDcml0aWNhbCBlcnJvcjogSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXIgb24gJXMiLCAKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7IAorICAgICAgICAvKiBGaWxsIGluIHRoZSBldmVudCBjb2RlIHRvIHByb3BhZ2F0ZSB0aGUgZXZlbnQgbm90aWZpY2F0aW9uIHRvIEJSTQorICAgICAgICAgICBCUk0gZ2VuZXJhdGVzIHRoZSBDb21tYW5kIHN0YXR1cyBFdmVudCBiYXNlZCBvbiB0aGlzLiovCisgICAgICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DT01QTEVURV9FVkVOVDsKKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wRGlzY29ubmVjdExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5wcmVzZW50ID0gMTsKKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wRGlzY29ubmVjdExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPQorICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9JTlZBTElEX0hDSV9DTU5EX1BBUkFNOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOyAKKworICAgIH0KKworI2lmZGVmIEJBUF9ERUJVRworICAvKiBUcmFjZSB0aGUgdEJ0YW1wQ3R4IGJlaW5nIHBhc3NlZCBpbi4gKi8KKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICJXTEFOIEJBUCBDb250ZXh0IE1vbml0b3I6IGJ0YW1wQ29udGV4dCB2YWx1ZSA9ICV4IGluICVzOiVkIiwgYnRhbXBDb250ZXh0LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fICk7CisjZW5kaWYgLy9CQVBfREVCVUcKKworICAgIGJhcEhDSUV2ZW50LmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9TVEFUVVNfRVZFTlQ7CisgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5wcmVzZW50ID0gMTsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LmNvbW1hbmRfb3Bjb2RlIAorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTktfQ01EOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZJWE1FOiBWYWxpZGF0ZSB0aGUgTG9naWNhbCBMaW5rIGhhbmRsZSwgR2VuZXJhdGlvbiBhbmQgZnJlZWluZy4uLgorICAgIEhlcmUgdGhlIExvZ2ljYWwgbGluayBpcyBub3QgdmFsaWRhdGVkIGFuZCBhc3N1bWVkIHRoYXQgaXQgaXMgY29ycmVjdCB0by4gCisgICAgZ2V0IHRoZSBMb2dpY2FsIGxpbmsgY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcExvZ0xpbmtDb250ZXh0ID0gCisgICAgJihidGFtcENvbnRleHQtPmJ0YW1wTG9nTGlua0N0eFtsb2dfbGlua19pbmRleF0pOworICAgIAorICAgIC8vIFZhbGlkYXRlIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYWN0aXZlLgorICAgIGlmICgoVk9TX0ZBTFNFID09IHBMb2dMaW5rQ29udGV4dC0+cHJlc2VudCkgfHwKKyAgICAgICAgKHBCYXBIQ0lMb2dMaW5rRGlzY29ubmVjdC0+bG9nX2xpbmtfaGFuZGxlICE9IHBMb2dMaW5rQ29udGV4dC0+bG9nX2xpbmtfaGFuZGxlKSkKKyAgICB7CisgICAgICAgIC8qIElmIHN0YXR1cyBpcyBmYWlsZWQsIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBsYXllciBnZW5lcmF0ZXMgdGhlCisgICAgICAgICAgIGNvbW1hbmQgc3RhdHVzIGV2ZW50IHdpdGggcHJvcGVyIHN0YXR1cyAqLworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBEaXNjb25uZWN0TG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cyA9CisgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0gV0xBTkJBUF9FUlJPUl9OT19DTkNUOworICAgICAgICByZXR2YWwgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyNpZmRlZiBCQVBfREVCVUcKKyAgICAgICAgLyogTG9nIHRoZSBlcnJvci4gKi8KKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczolZCBJbnZhbGlkIExvZ2ljYWwgTGluayBoYW5kbGUoc2hvdWxkIGJlKSA9ICVkKCVkKSIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICAKKyAgICAgICAgICAgICAgICBwQmFwSENJTG9nTGlua0Rpc2Nvbm5lY3QtPmxvZ19saW5rX2hhbmRsZSwgcExvZ0xpbmtDb250ZXh0LT5sb2dfbGlua19oYW5kbGUpOworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiBMb2dpY2FsIExpbmsgaW5kZXggPSAlZCIsIGxvZ19saW5rX2luZGV4KTsKKyNlbmRpZiAvL0JBUF9ERUJVRworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBGb3JtIGFuZCByZXR1cm4gdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50Li4uICovIAorICAgICAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnN0YXR1cyA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcERpc2Nvbm5lY3RMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzIAorICAgICAgICAgICAgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworICAgIAorCisgICAgICAgIHBMb2dMaW5rQ29udGV4dC0+cHJlc2VudCAgICAgICAgID0gVk9TX0ZBTFNFOyAKKyAgICAgICAgcExvZ0xpbmtDb250ZXh0LT51VHhQa3RDb21wbGV0ZWQgPSAwOworICAgICAgICBwTG9nTGlua0NvbnRleHQtPmxvZ19saW5rX2hhbmRsZSA9IDA7CisgICAgICAgIC8qIERlY3JlbWVudCB0aGUgdG90YWwgbG9naWNhbCBsaW5rIGNvdW50ICovCisgICAgICAgIGJ0YW1wQ29udGV4dC0+dG90YWxfbG9nX2xpbmtfaW5kZXgtLTsKKyAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9sb2dpY2FsX2xpbmtfc3RhdGUgPSBXTEFOX0JBUExvZ0xpbmtDbG9zZWQ7CisgICAgfQorICAgIAorICAgIC8qIE5vdGlmeSB0aGUgQ29tbWFuZCBzdGF0dXMgRXZlbnQgKi8KKyAgICAoKmJ0YW1wQ29udGV4dC0+cEJhcEhDSUV2ZW50Q0IpIAorICAgICAgICAoICAKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+cEhkZEhkbCwgICAvKiB0aGlzIHJlZmVycyB0byB0aGUgQlNMIHBlciBjb25uZWN0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgICAgICZiYXBIQ0lFdmVudCwgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgIFZPU19UUlVFIC8qIEZsYWcgdG8gaW5kaWNhdGUgYXNzb2Mtc3BlY2lmaWMgZXZlbnQgKi8gCisgICAgICAgICk7CisKKyAgICAvKiBGb3JtYXQgdGhlIExvZ2ljYWwgTGluayBDb21wbGV0ZSBldmVudCB0byByZXR1cm4uLi4gKi8gCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0RJU0NPTk5FQ1RfTE9HSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcERpc2Nvbm5lY3RMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQucHJlc2VudCA9IDE7CisgICAgLyogIFJldHVybiB0aGUgbG9naWNhbCBsaW5rIGluZGV4IGhlcmUgKi8KKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBEaXNjb25uZWN0TG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LmxvZ19saW5rX2hhbmRsZSAKKyAgICAgICAgPSBwQmFwSENJTG9nTGlua0Rpc2Nvbm5lY3QtPmxvZ19saW5rX2hhbmRsZTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBEaXNjb25uZWN0TG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LnJlYXNvbiAKKyAgICAgICAgPSBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVDsKKworICAgIHJldHVybiByZXR2YWw7Cit9IC8qIFdMQU5fQkFQTG9naWNhbExpbmtEaXNjb25uZWN0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQTG9naWNhbExpbmtDYW5jZWwoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgQ2FuY2VsIExvZ2ljYWwgTGluayBjb21tYW5kCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lMb2dMaW5rQ2FuY2VsOiAgcG9pbnRlciB0byB0aGUgIkhDSSBDYW5jZWwgTG9naWNhbCBMaW5rIiBTdHJ1Y3R1cmUuCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgICAgICAgICAgICAgIChCVFcsIHRoZSByZXF1aXJlZCAiSENJIExvZ2ljYWwgTGluayBDb21wbGV0ZSBFdmVudCIgCisgICAgICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQgYnkgdGhlIEJBUCBzdGF0ZSBtYWNoaW5lIGFuZCBzZW50IHVwIAorICAgICAgICAgICAgICAgIHZpYSB0aGUgKCp0cFdMQU5fQkFQRXZlbnRDQikuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSUxvZ0xpbmtDYW5jZWwgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQTG9naWNhbExpbmtDYW5jZWwKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZCAgICpwQmFwSENJTG9nTGlua0NhbmNlbCwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKykKK3sKKyAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dDsKKyAgIEJUQU1QRlNNX0lOU1RBTkNFREFUQV9UICppbnN0YW5jZVZhcjsKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKChidGFtcEhhbmRsZSA9PSBOVUxMKSB8fCAocEJhcEhDSUxvZ0xpbmtDYW5jZWwgPT0gTlVMTCkgfHwgCisgICAgICAgIChwQmFwSENJRXZlbnQgPT0gTlVMTCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IE51bGwgUGFyYW1ldGVycyBOb3QgYWxsb3dlZCIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisgICAgaW5zdGFuY2VWYXIgPSAmKGJ0YW1wQ29udGV4dC0+YmFwUGh5c0xpbmtNYWNoaW5lKTsKKworICAgIC8qIEZvcm0gYW5kIGltbWVkaWF0ZWx5IHJldHVybiB0aGUgY29tbWFuZCBzdGF0dXMgZXZlbnQuLi4gKi8gCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfQ09NUExFVEVfRVZFTlQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQucHJlc2VudCA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY29tbWFuZF9vcGNvZGUgPQorICAgICAgICBCVEFNUF9UTFZfSENJX0xPR0lDQUxfTElOS19DQU5DRUxfQ01EOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKworICAgIGlmIChwQmFwSENJTG9nTGlua0NhbmNlbC0+cGh5X2xpbmtfaGFuZGxlICE9IGJ0YW1wQ29udGV4dC0+cGh5X2xpbmtfaGFuZGxlKSAKKyAgICB7CisgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LkxvZ2ljYWxfTGlua19DYW5jZWwuc3RhdHVzID0KKyAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfTk9fQ05DVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogQXMgdGhlIGxvZ2ljYWwgbGluayBjcmVhdGUgaXMgcmV0dXJuZWQgaW1tZWRpYXRlbHksIHRoZSBsb2dpY2FsIGxpbmsgaXMKKyAgICAgICAgICAgY3JlYXRlZCBhbmQgc28gY2FuY2VsIGNhbiBub3QgcmV0dXJuIHN1Y2Nlc3MuCisgICAgICAgICAgIEFuZCBpdCByZXR1cm5zIFdMQU5CQVBfRVJST1JfTk9fQ05DVCBpZiBub3QgY29ubmVjdGVkIG9yCisgICAgICAgICAgIFdMQU5CQVBfRVJST1JfTUFYX05VTV9BQ0xfQ05DVFMgaWYgY29ubmVjdGVkICovCisgICAgICAgIGlmKFdMQU5fQkFQTG9nTGlua0Nsb3NlZCA9PSBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19zdGF0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgLyogQ2FuY2VsIExvZ2ljYWwgbGluayByZXF1ZXN0IGluIGludmFsaWQgc3RhdGUgKi8KKyAgICAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuTG9naWNhbF9MaW5rX0NhbmNlbC5zdGF0dXMgPQorICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9OT19DTkNUOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoV0xBTl9CQVBMb2dMaW5rT3BlbiA9PSBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19zdGF0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgLyogQ2FuY2VsIExvZ2ljYWwgbGluayByZXF1ZXN0IGluIGNvbmVjdGVkIHN0YXRlICovCisgICAgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LkxvZ2ljYWxfTGlua19DYW5jZWwuc3RhdHVzID0KKyAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfTUFYX05VTV9BQ0xfQ05DVFM7ICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoV0xBTl9CQVBMb2dMaW5rSW5Qcm9ncmVzcyA9PSBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19zdGF0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgLyogQ2FuY2VsIExvZ2ljYWwgbGluayByZXF1ZXN0IGluIHByb2dyZXNzIHN0YXRlLCBuZWVkIHRvIGZhaWwgbG9naWNhbCBsaW5rCisgICAgICAgICAgICBjcmVhdGlvbiBhcyB3ZWxsICovCisgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19jYW5jZWxfcGVuZGluZyA9IFRSVUU7CisgICAgICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5Mb2dpY2FsX0xpbmtfQ2FuY2VsLnN0YXR1cyA9CisgICAgICAgICAgICAgICAgV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5Mb2dpY2FsX0xpbmtfQ2FuY2VsLnN0YXR1cyA9CisgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9OT19DTkNUOworICAgICAgICB9CisgICAgfQorICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LkxvZ2ljYWxfTGlua19DYW5jZWwucGh5X2xpbmtfaGFuZGxlID0KKyAgICAgICAgcEJhcEhDSUxvZ0xpbmtDYW5jZWwtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAvKiBTaW5jZSB0aGUgc3RhdHVzIGlzIG5vdCBzdWNjZXNzLCB0aGUgVHggZmxvdyBzcGVjIElkIGlzIG5vdCBtZWFuaW5nZnVsIGFuZAorICAgICAgIGZpbGxpbmcgd2l0aCAwICovCisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuTG9naWNhbF9MaW5rX0NhbmNlbC50eF9mbG93X3NwZWNfaWQgPSAKKyAgICAgICAgcEJhcEhDSUxvZ0xpbmtDYW5jZWwtPnR4X2Zsb3dfc3BlY19pZDsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQTG9naWNhbExpbmtDYW5jZWwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBGbG93U3BlY01vZGlmeSgpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBNb2RpZnkgTG9naWNhbCBMaW5rIGNvbW1hbmQKKyAgICBQcm9kdWNlcyBhbiBhc3luY2hyb25vdXMgZmxvdyBzcGVjIG1vZGlmeSBjb21wbGV0ZSBldmVudC4gVGhyb3VnaCB0aGUgCisgICAgZXZlbnQgY2FsbGJhY2suCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lGbG93U3BlY01vZGlmeTogIHBvaW50ZXIgdG8gdGhlICJIQ0kgRmxvdyBTcGVjIE1vZGlmeSIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBzdGF0dXMgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBTdGF0dXMgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSUZsb3dTcGVjTW9kaWZ5IGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUEZsb3dTcGVjTW9kaWZ5CisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9DbWQgICAqcEJhcEhDSUZsb3dTcGVjTW9kaWZ5LAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKQoreworICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIGluZGV4X2Zvcl9sb2dMaW5rSGFuZGxlID0gMDsKKyAgIHB0QnRhbXBDb250ZXh0ICAgICAgICAgICBidGFtcENvbnRleHQ7CisgICB0cEJ0YW1wTG9nTGlua0N0eCAgICAgICAgcExvZ0xpbmtDb250ZXh0OworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgIHJldHZhbDsKKyAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB0QnRhbXBIQ0lfRXZlbnQgICAgICAgICAgYmFwSENJRXZlbnQ7IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKyAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgIGlmICgoYnRhbXBIYW5kbGUgPT0gTlVMTCkgfHwgKHBCYXBIQ0lGbG93U3BlY01vZGlmeSA9PSBOVUxMKSB8fCAKKyAgICAgICAocEJhcEhDSUV2ZW50ID09IE5VTEwpKQorICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgIiVzOiBOdWxsIFBhcmFtZXRlcnMgTm90IGFsbG93ZWQiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOworCisgICBpbmRleF9mb3JfbG9nTGlua0hhbmRsZSA9IHBCYXBIQ0lGbG93U3BlY01vZGlmeS0+bG9nX2xpbmtfaGFuZGxlID4+IDg7IC8qICBSZXR1cm4gdGhlIGxvZ2ljYWwgbGluayBpbmRleCBoZXJlICovCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIiAlczppbmRleF9mb3JfbG9nTGlua0hhbmRsZT0lZCIsIF9fRlVOQ1RJT05fXyxpbmRleF9mb3JfbG9nTGlua0hhbmRsZSk7CisKKyAgIGJhcEhDSUV2ZW50LmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9TVEFUVVNfRVZFTlQ7CisgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnByZXNlbnQgPSAxOworICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LmNvbW1hbmRfb3Bjb2RlIAorICAgICAgID0gQlRBTVBfVExWX0hDSV9GTE9XX1NQRUNfTU9ESUZZX0NNRDsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRXZhbHVhdGUgdGhlIFR4IGFuZCBSeCBGbG93IHNwZWNpZmljYXRpb24gZm9yIHRoaXMgbG9naWNhbCBsaW5rLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgZmxvdyBzcGVjcyB3aXRoIHNlcnZpY2UgdHlwZXMgb2YgQkUgKDB4MDEpIAorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBOb3cgY29uZmlndXJlIHRoZSBMb2dpY2FsIExpbmsgY29udGV4dC4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBwTG9nTGlua0NvbnRleHQgPSAmKGJ0YW1wQ29udGV4dC0+YnRhbXBMb2dMaW5rQ3R4W2luZGV4X2Zvcl9sb2dMaW5rSGFuZGxlXSk7CisKKyAgIC8qIEV4dHJhY3QgVHggZmxvdyBzcGVjIGludG8gdGhlIGNvbnRleHQgc3RydWN0dXJlICovCisgICByZXR2YWwgPSBidGFtcFVucGFja1RsdkZsb3dfU3BlYygodm9pZCAqKWJ0YW1wQ29udGV4dCwgcEJhcEhDSUZsb3dTcGVjTW9kaWZ5LT50eF9mbG93X3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0JBUF9QQUxfRkxPV19TUEVDX1RMVl9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExvZ0xpbmtDb250ZXh0LT5idGFtcEZsb3dTcGVjKTsKKyAgIGlmIChyZXR2YWwgIT0gQlRBTVBfUEFSU0VfU1VDQ0VTUykKKyAgIHsKKyAgICAgLyogRmxvdyBzcGVjIHBhcnNpbmcgZmFpbGVkLCByZXR1cm4gZmFpbHVyZSAqLworICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wRmxvd1NwZWNNb2RpZnlDb21wbGV0ZUV2ZW50LnN0YXR1cyA9CisgICAgICAgICBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0gV0xBTkJBUF9FUlJPUl9JTlZBTElEX0hDSV9DTU5EX1BBUkFNOworICAgfQorICAgZWxzZQorICAgeworICAgICAgYmFwSENJRXZlbnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5zdGF0dXMgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wRmxvd1NwZWNNb2RpZnlDb21wbGV0ZUV2ZW50LnN0YXR1cyAKKyAgICAgICAgICA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIH0KKyAgICAgICAgICAgLyogTm90aWZ5IHRoZSBDb21tYW5kIHN0YXR1cyBFdmVudCAqLworICAgdm9zU3RhdHVzID0gICAKKyAgICAgICgqYnRhbXBDb250ZXh0LT5wQmFwSENJRXZlbnRDQikgCisgICAgICAgICAgKCAgCisgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+cEhkZEhkbCwgICAvKiB0aGlzIHJlZmVycyB0byB0aGUgQlNMIHBlciBjb25uZWN0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgICAgJmJhcEhDSUV2ZW50LCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICBWT1NfVFJVRSAvKiBGbGFnIHRvIGluZGljYXRlIGFzc29jLXNwZWNpZmljIGV2ZW50ICovIAorICAgICAgICAgICk7CisKKyAgIC8qIEZvcm0gYW5kIGltbWVkaWF0ZWx5IHJldHVybiB0aGUgY29tbWFuZCBzdGF0dXMgZXZlbnQuLi4gKi8gCisgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfRkxPV19TUEVDX01PRElGWV9DT01QTEVURV9FVkVOVDsKKyAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcEZsb3dTcGVjTW9kaWZ5Q29tcGxldGVFdmVudC5wcmVzZW50ID0gMTsKKyAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcEZsb3dTcGVjTW9kaWZ5Q29tcGxldGVFdmVudC5sb2dfbGlua19oYW5kbGUgPSAKKyAgICAgIHBCYXBIQ0lGbG93U3BlY01vZGlmeS0+bG9nX2xpbmtfaGFuZGxlOworCisgICByZXR1cm4gdm9zU3RhdHVzOworfSAvKiBXTEFOX0JBUEZsb3dTcGVjTW9kaWZ5ICovCisKKwordm9pZCBXTEFOX0JBUEVzdGFibGlzaExvZ2ljYWxMaW5rKHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCkKK3sKKyAgICB0QnRhbXBIQ0lfRXZlbnQgYmFwSENJRXZlbnQ7IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgdl9VMTZfdCAgICAgICAgIGxvZ19saW5rX2luZGV4ID0gMDsKKyAgICB2X1UxNl90ICAgICAgICAgaW5kZXhfZm9yX2xvZ0xpbmtDdHggPSAwOworICAgIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBpZiAoYnRhbXBDb250ZXh0ID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIiVzOiBOdWxsIFBhcmFtZXRlcnMgTm90IGFsbG93ZWQiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCBUUlVFID09IGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX2NhbmNlbF9wZW5kaW5nICkKKyAgICB7CisgICAgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQuc3RhdHVzID0gV0xBTkJBUF9FUlJPUl9OT19DTkNUOworICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19zdGF0ZSA9IFdMQU5fQkFQTG9nTGlua0Nsb3NlZDsKKyAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9sb2dpY2FsX2xpbmtfY2FuY2VsX3BlbmRpbmcgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgYSBsb2dpY2FsIGxpbmsgaW5kZXggZm9yIHRoZXNlIGZsb3cgc3BlY3MgKi8KKyAgICAgICAgdm9zU3RhdHVzID0gV0xBTkJBUF9DcmVhdGVOZXdMb2dMaW5rQ3R4KCAKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dCwgLyogcGVyIGFzc29jIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX3JlcV9pbmZvLnBoeUxpbmtIYW5kbGUsIC8qICBJIGdldCBwaHlfbGlua19oYW5kbGUgZnJvbSB0aGUgQ29tbWFuZCAqLworICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9sb2dpY2FsX2xpbmtfcmVxX2luZm8udHhGbG93U3BlYywgLyogIEkgZ2V0IHR4X2Zsb3dfc3BlYyBmcm9tIHRoZSBDb21tYW5kICovCisgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19yZXFfaW5mby5yeEZsb3dTcGVjLCAvKiAgSSBnZXQgcnhfZmxvd19zcGVjIGZyb20gdGhlIENvbW1hbmQgKi8KKyAgICAgICAgICAgICZsb2dfbGlua19pbmRleCAvKiAgUmV0dXJuIHRoZSBsb2dpY2FsIGxpbmsgaW5kZXggaGVyZSAqLworICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEludmFsaWQgZmxvdyBzcGVjIGZvcm1hdCAqLworICAgICAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPSBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX2xvZ2ljYWxfbGlua19zdGF0ZSA9IFdMQU5fQkFQTG9nTGlua0Nsb3NlZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID0gV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX3N0YXRlID0gV0xBTl9CQVBMb2dMaW5rT3BlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpbmRleF9mb3JfbG9nTGlua0N0eCA9IGxvZ19saW5rX2luZGV4ID4+IDg7CisgICAgLyogRm9ybWF0IHRoZSBMb2dpY2FsIExpbmsgQ29tcGxldGUgZXZlbnQgdG8gcmV0dXJuLi4uICovIAorICAgIGJhcEhDSUV2ZW50LmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfTE9HSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQucHJlc2VudCA9IDE7CisKKyAgICAvKiAgUmV0dXJuIHRoZSBsb2dpY2FsIGxpbmsgaW5kZXggaGVyZSAqLworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQubG9nX2xpbmtfaGFuZGxlIAorICAgICAgICA9IGxvZ19saW5rX2luZGV4OworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQucGh5X2xpbmtfaGFuZGxlIAorICAgICAgICA9IGJ0YW1wQ29udGV4dC0+YnRhbXBfbG9naWNhbF9saW5rX3JlcV9pbmZvLnBoeUxpbmtIYW5kbGU7CisgICAgYmFwSENJRXZlbnQudS5idGFtcExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5mbG93X3NwZWNfaWQKKyAgICAgICAgPSBidGFtcENvbnRleHQtPmJ0YW1wTG9nTGlua0N0eFtpbmRleF9mb3JfbG9nTGlua0N0eF0uYnRhbXBGbG93U3BlYy5mbG93X3NwZWNfaWQ7CisKKyAgICB2b3NTdGF0dXMgPSAoKmJ0YW1wQ29udGV4dC0+cEJhcEhDSUV2ZW50Q0IpIAorICAgICggIAorICAgICBidGFtcENvbnRleHQtPnBIZGRIZGwsICAgLyogdGhpcyByZWZlcnMgdG8gdGhlIEJTTCBwZXIgY29ubmVjdGlvbiBjb250ZXh0ICovCisgICAgICZiYXBIQ0lFdmVudCwgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgVk9TX1RSVUUgLyogRmxhZyB0byBpbmRpY2F0ZSBhc3NvYy1zcGVjaWZpYyBldmVudCAqLyAKKyAgICAgKTsKKyAgICByZXR1cm47Cit9CisKKworCmRpZmYgLS1naXQgYS9DT1JFL0JBUC9zcmMvYmFwQXBpTGlua1N1cGVydmlzaW9uLmMgYi9DT1JFL0JBUC9zcmMvYmFwQXBpTGlua1N1cGVydmlzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0NmUxMgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvQkFQL3NyYy9iYXBBcGlMaW5rU3VwZXJ2aXNpb24uYwpAQCAtMCwwICsxLDYzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBiIGEgcCBBIHAgaSBMaW5rU3VwZXJ2aXNpb24gLiBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBPVkVSVklFVzoKKyAgCisgIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gQkFQIG1vZHVsZXMKKyAgInBsYXRmb3JtIGluZGVwZW5kZW50IiBEYXRhIHBhdGggZnVuY3Rpb25zLgorICAKKyAgVGhlIGZ1bmN0aW9ucyBleHRlcm5hbGl6ZWQgYnkgdGhpcyBtb2R1bGUgYXJlIHRvIGJlIGNhbGxlZCBPTkxZIGJ5IG90aGVyIAorICBXTEFOIG1vZHVsZXMgKEhERCkgdGhhdCBwcm9wZXJseSByZWdpc3RlciB3aXRoIHRoZSBCQVAgTGF5ZXIgaW5pdGlhbGx5LgorCisgIERFUEVOREVOQ0lFUzogCisKKyAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuIAorICAKKyAgCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKworICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMDA4LTAzLTI1ICAgIGFydWx2ICAgICBDcmVhdGVkIG1vZHVsZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8jaW5jbHVkZSAid2xhbl9xY3RfdGwuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKy8vSSBuZWVkIHRoZSBUTCB0eXBlcyBhbmQgQVBJCisjaW5jbHVkZSAid2xhbl9xY3RfdGwuaCIKKworLyogQlQtQU1QIFBBTCBBUEkgaGVhZGVyIGZpbGUgKi8gCisjaW5jbHVkZSAiYmFwQXBpLmgiIAorI2luY2x1ZGUgImJhcEludGVybmFsLmgiCisjaW5jbHVkZSAiYmFwQXBpVGltZXIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAxCisvLypCVC1BTVAgcGFja2V0IExMQyBPVUkgdmFsdWUqLworc3RhdGljIGNvbnN0IHZfVThfdCBXTEFOQkFQX0JUX0FNUF9PVUlbXSA9ICB7MHgwMCwgMHgxOSwgMHg1OCB9OworCisvKkxMQyBoZWFkZXIgdmFsdWUqLworc3RhdGljIHZfVThfdCBXTEFOQkFQX0xMQ19IRUFERVJbXSA9ICB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsaXplZCBGdW5jdGlvbiBEZWZpbml0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUworV0xBTkJBUF9BY3F1aXJlTFNQYWNrZXQoIHB0QnRhbXBDb250ZXh0IHBCdGFtcEN0eCwgdm9zX3BrdF90ICoqcHBQYWNrZXQsIHZfVTE2X3Qgc2l6ZSwgdEFOSV9CT09MRUFOIGlzTHNSZXEgKQoreworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgIHZvc19wa3RfdCAqcFBhY2tldDsKKyAgICBXTEFOQkFQXzgwMjNIZWFkZXJUeXBlICAgdzgwMjNIZWFkZXI7CisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIGF1Y0xMQ0hlYWRlcltXTEFOQkFQX0xMQ19IRUFERVJfTEVOXTsKKyAgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgaGVhZGVyTGVuZ3RoOyAgLyogVGhlIDgwMi4zIGZyYW1lIGxlbmd0aCovCisgICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHByb3RvVHlwZTsKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgKnBEYXRhID0gTlVMTDsKKyAgICAgCisKKyAgICBpZihpc0xzUmVxKQorICAgIHsKKyAgICAgICAgcHJvdG9UeXBlID0gV0xBTlRMX0JUX0FNUF9UWVBFX0xTX1JFUTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJvdG9UeXBlID0gV0xBTlRMX0JUX0FNUF9UWVBFX0xTX1JFUDsKKyAgICB9ICAgIAorCisgICAgLy9JZiBzdWNjZXNzLCB2b3NUeExzUGFja2V0IGlzIHRoZSBwYWNrZXQgYW5kIHBEYXRhIHBvaW50cyB0byB0aGUgaGVhZC4KKyAgIHZvc1N0YXR1cyA9IHZvc19wa3RfZ2V0X3BhY2tldCggJnBQYWNrZXQsIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCxzaXplLCAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19UUlVFLCBOVUxMLCBOVUxMICk7CisgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICB7CisgICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHBQYWNrZXQsICh2X1ZPSURfdCAqKSZwRGF0YSwgc2l6ZSApOworICAgICAgIGlmKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBmYWlsZWQgdG8gcmVzZXJ2ZSBzaXplID0gJWRcbiIsX19GVU5DVElPTl9fLCBzaXplICk7CisgICAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOworICAgICAgIH0KKyAgIH0KKworICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU5CQVBfTGlua1N1cGVydmlzaW9uVGltZXJIYW5kbGVyIGZhaWxlZCB0byBnZXQgdm9zX3BrdFxuIiApOworICAgICAgIHJldHVybiB2b3NTdGF0dXM7CisgICB9CisKKyAgICAgICAgIC8vIEZvcm0gdGhlIDgwMi4zIGhlYWRlcgorICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHBCdGFtcEN0eC0+cGVlcl9tYWNfYWRkciwgVk9TX01BQ19BRERSX1NJWkUpOworICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHBCdGFtcEN0eC0+c2VsZl9tYWNfYWRkciwgVk9TX01BQ19BRERSX1NJWkUpOworCisgICBoZWFkZXJMZW5ndGggPSBXTEFOQkFQX0xMQ19IRUFERVJfTEVOOworICAgICAgICAvKiBOb3cgdGhlIDgwMi4zIGxlbmd0aCBmaWVsZCBpcyBiaWctZW5kaWFuPyEgKi8KKyAgIHc4MDIzSGVhZGVyLnVzTGVuVHlwZSA9IHZvc19jcHVfdG9fYmUxNihoZWFkZXJMZW5ndGgpOyAKKyAgICAgICAgCisgICAvKiBOb3cgYWRqdXN0IHRoZSBwcm90b2NvbCB0eXBlIGJ5dGVzKi8KKyAgIHByb3RvVHlwZSA9IHZvc19jcHVfdG9fYmUxNiggcHJvdG9UeXBlKTsKKyAgICAgICAgIC8qIE5vdyBmb3JtIHRoZSBMTEMgaGVhZGVyICovCisgICB2b3NfbWVtX2NvcHkoYXVjTExDSGVhZGVyLCAKKyAgICAgICAgICAgIFdMQU5CQVBfTExDX0hFQURFUiwgIAorICAgICAgICAgICAgc2l6ZW9mKFdMQU5CQVBfTExDX0hFQURFUikpOworICAgdm9zX21lbV9jb3B5KCZhdWNMTENIZWFkZXJbV0xBTkJBUF9MTENfT1VJX09GRlNFVF0sIAorICAgICAgICAgICAgV0xBTkJBUF9CVF9BTVBfT1VJLCAgCisgICAgICAgICAgICBXTEFOQkFQX0xMQ19PVUlfU0laRSk7CisgICB2b3NfbWVtX2NvcHkoJmF1Y0xMQ0hlYWRlcltXTEFOQkFQX0xMQ19QUk9UT19UWVBFX09GRlNFVF0sIAorICAgICAgICAgICAgJnByb3RvVHlwZSwgIC8vV0xBTkJBUF9CVF9BTVBfVFlQRV9MU19SRVEKKyAgICAgICAgICAgIFdMQU5CQVBfTExDX1BST1RPX1RZUEVfU0laRSk7CisgCisgICAgICAgIC8qIFB1c2ggb24gdGhlIExMQyBoZWFkZXIgKi8KKyAgIHZvc19wa3RfcHVzaF9oZWFkKHBQYWNrZXQsIAorICAgICAgICAgICAgYXVjTExDSGVhZGVyLCAKKyAgICAgICAgICAgIFdMQU5CQVBfTExDX0hFQURFUl9MRU4pOyAgCisKKyAgICAgICAgLyogUHVzaCBvbiB0aGUgODAyLjMgaGVhZGVyICovCisgICB2b3NfcGt0X3B1c2hfaGVhZChwUGFja2V0LCAmdzgwMjNIZWFkZXIsIHNpemVvZih3ODAyM0hlYWRlcikpOworICAgKnBwUGFja2V0ID0gcFBhY2tldDsKKyAgIHJldHVybiB2b3NTdGF0dXM7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfSW5pdExpbmtTdXBlcnZpc2lvbgorCisgIERFU0NSSVBUSU9OIAorCisgICAgVGhpcyBBUEkgd2lsbCBiZSBjYWxsZWQgd2hlbiBMaW5rIFN1cGVydmlzaW9uIG1vZHVsZSBpcyB0byBiZSBpbml0aWFsaXplZCB3aGVuIGNvbm5lY3RlZCBhdCBCQVAKKworICBQQVJBTUVURVJTIAorCisgICAgYnRhbXBIYW5kbGU6IFRoZSBCVC1BTVAgUEFMIGhhbmRsZSByZXR1cm5lZCBpbiBXTEFOQkFQX0dldE5ld0huZGwuCisgICAKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIEJBUCBoYW5kbGUgaXMgTlVMTCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgVFhfTFNfREFUQUxFTiAgIDMyCisKK1ZPU19TVEFUVVMKK1dMQU5CQVBfSW5pdExpbmtTdXBlcnZpc2lvbgorKCAKKyAgcHRCdGFtcEhhbmRsZSAgICAgYnRhbXBIYW5kbGUKKykKK3sKKyAgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHB0QnRhbXBDb250ZXh0ICAgICAgICAgICBwQnRhbXBDdHggPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOworICAgIHZvc19wa3RfdCAgICAgICAgICAgICAgICAqcExTUmVxUGFja2V0OyAKKyAgICB2b3NfcGt0X3QgICAgICAgICAgICAgICAgKnBMU1JlcFBhY2tldDsgCisgICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgICBsc1BrdGxuOyAKKworICAgIGlmICggTlVMTCA9PSBwQnRhbXBDdHgpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIGhhbmRsZSB2YWx1ZSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisjaWYgMCAgICAKKyAgICAvKiBJbml0aWFsaXplIExpbmsgc3VwZXJ2aXNpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICB2b3NfbWVtX3NldChwTHNJbmZvLCBzaXplb2YodEJ0YW1wTFMpLDApOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBTdGF0aWMgVHggRGF0YSAqLworICAgIHBMc0luZm8tPnBUeFBrdERhdGEgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodEJ0YW1wTHNQa3REYXRhKStUWF9MU19EQVRBTEVOKTsKKworICAgIC8qIEluaXRpYWxpemUgU3RhdGljIGRhdGEgZm9yIExTIHBrdCBUeCAqLworICAgIHBMc0luZm8tPnBUeFBrdERhdGEtPkJ1ZkxlbiA9IFRYX0xTX0RBVEFMRU47CisgICAgdm9zX21lbV9jb3B5ICgmcExzSW5mby0+cFR4UGt0RGF0YS0+cEJ1ZiwgTHNUeERhdGEsIHBMc0luZm8tPnBUeFBrdERhdGEtPkJ1Zkxlbik7CisjZW5kaWYKKyAgICBwQnRhbXBDdHgtPmxzUmVxUGt0UGVuZGluZyA9IFZPU19GQUxTRTsKKyAgICBwQnRhbXBDdHgtPnJldHJpZXMgPSAwOworCisgICAgdm9zU3RhdHVzID0gV0xBTkJBUF9BY3F1aXJlTFNQYWNrZXQoIHBCdGFtcEN0eCwgJnBMU1JlcVBhY2tldCwzMiwgVFJVRSApOworICAgIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgICB7CisgICAgICAgIHBCdGFtcEN0eC0+bHNSZXFQYWNrZXQgPSBwTFNSZXFQYWNrZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOkFjcXVpcmVMU1BhY2tldCBmYWlsZWRcbiIsX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHBCdGFtcEN0eC0+bHNSZXFQYWNrZXQgPSBOVUxMOworICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsgICAKKyAgICB9CisKKyAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX0FjcXVpcmVMU1BhY2tldCggcEJ0YW1wQ3R4LCAmcExTUmVwUGFja2V0LDMyLEZBTFNFICk7CisgICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgcEJ0YW1wQ3R4LT5sc1JlcFBhY2tldCA9IHBMU1JlcFBhY2tldDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6QWNxdWlyZUxTUGFja2V0IGZhaWxlZFxuIixfX0ZVTkNUSU9OX18pOworICAgICAgICAgcEJ0YW1wQ3R4LT5sc1JlcFBhY2tldCA9IE5VTEw7CisgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOyAgIAorICAgIH0gICAgICAgIAorCisgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aChwQnRhbXBDdHgtPmxzUmVwUGFja2V0LCZsc1BrdGxuKTsgCisKKyAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSAKKyAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOnZvc19wa3RfZ2V0X2xlbmd0aCBlcnJvciIsX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgIHBCdGFtcEN0eC0+bHNQa3RsbiA9IGxzUGt0bG47CisKKyAgICAvKiBTdGFydCBMaW5rIFN1cGVydmlzaW9uIFRpbWVyIGlmIG5vdCBjb25maWd1cmVkIGZvciBpbmZpbml0ZSAqLworICAgIGlmIChwQnRhbXBDdHgtPmJhcExpbmtTdXBlcnZpc2lvblRpbWVySW50ZXJ2YWwpCisgICAgeworICAgICAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX1N0YXJ0TGlua1N1cGVydmlzaW9uVGltZXIgKHBCdGFtcEN0eCwKKyAgICAgICAgICAgICAgICAgICBwQnRhbXBDdHgtPmJhcExpbmtTdXBlcnZpc2lvblRpbWVySW50ZXJ2YWwgKiBXTEFOQkFQX0JSRURSX0JBU0VCQU5EX1NMT1RfVElNRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOk5vIExTIGNvbmZpZ3VyZWQgZm9yIGluZmluaXRlIixfX0ZVTkNUSU9OX18pOworICAgIH0KKyAgIAorICAgIHJldHVybiB2b3NTdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9EZUluaXRMaW5rU3VwZXJ2aXNpb24KKworICBERVNDUklQVElPTiAKKworICAgIFRoaXMgQVBJIHdpbGwgYmUgY2FsbGVkIHdoZW4gTGluayBTdXBlcnZpc2lvbiBtb2R1bGUgaXMgdG8gYmUgc3RvcHBlZCBhZnRlciBkaXNjb25uZWN0ZWQgYXQgQkFQIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBidGFtcEhhbmRsZTogVGhlIEJULUFNUCBQQUwgaGFuZGxlIHJldHVybmVkIGluIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgIAorICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgQkFQIGhhbmRsZSBpcyBOVUxMICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTkJBUF9EZUluaXRMaW5rU3VwZXJ2aXNpb24KKyggCisgIHB0QnRhbXBIYW5kbGUgICAgIGJ0YW1wSGFuZGxlIAorKQoreworICAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgcHRCdGFtcENvbnRleHQgICAgICAgICAgIHBCdGFtcEN0eCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7CisKKyAgICBpZiAoIE5VTEwgPT0gcEJ0YW1wQ3R4KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJBUCBoYW5kbGUgdmFsdWUgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJJbjogJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICB2b3NTdGF0dXMgPSBXTEFOQkFQX1N0b3BMaW5rU3VwZXJ2aXNpb25UaW1lcihwQnRhbXBDdHgpOworCisgICAKKyAgICAvKkZyZWUgdGhlIHZvcyBwYWNrZXQqLworICAgIGlmICggcEJ0YW1wQ3R4LT5sc1JlcFBhY2tldCApCisgICAgeworICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBCdGFtcEN0eC0+bHNSZXBQYWNrZXQpOworICAgICAgcEJ0YW1wQ3R4LT5sc1JlcFBhY2tldCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKCBwQnRhbXBDdHgtPmxzUmVxUGFja2V0ICkKKyAgICB7CisgICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQocEJ0YW1wQ3R4LT5sc1JlcVBhY2tldCk7CisgICAgICBwQnRhbXBDdHgtPmxzUmVxUGFja2V0ID0gTlVMTDsgCisgICAgfQorICAgIAorCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1J4UHJvY0xzUGt0CisKKyAgREVTQ1JJUFRJT04gCisKKyAgICBUaGlzIEFQSSB3aWxsIGJlIGNhbGxlZCB3aGVuIExpbmsgU3VwZXJ2aXNpb24gZnJhbWVzIGFyZSByZWNlaXZlZCBhdCBCQVAKKworICBQQVJBTUVURVJTIAorCisgICAgYnRhbXBIYW5kbGU6IFRoZSBCVC1BTVAgUEFMIGhhbmRsZSByZXR1cm5lZCBpbiBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcHVjQUM6ICAgICAgIFBvaW50ZXIgdG8gcmV0dXJuIHRoZSBhY2Nlc3MgY2F0ZWdvcnkgCisgICAgdm9zRGF0YUJ1ZmY6IFRoZSBkYXRhIGJ1ZmZlciBjb250YWluaW5nIHRoZSA4MDIuMyBmcmFtZSB0byBiZSAKKyAgICAgICAgICAgICAgICAgdHJhbnNsYXRlZCB0byBCVCBIQ0kgRGF0YSBQYWNrZXQKKyAgIAorICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgQkFQIGhhbmRsZSBpcyBOVUxMICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTkJBUF9SeFByb2NMc1BrdAorKCAKKyAgcHRCdGFtcEhhbmRsZSAgICAgYnRhbXBIYW5kbGUsIAorICB2X1U4X3QgICAgICAgICAgICBwaHlfbGlua19oYW5kbGUsICAvKiBVc2VkIGJ5IEJBUCB0byBpbmRlbnRpZnkgdGhlIFdMQU4gYXNzb2MuIChTdGFJZCkgKi8KKyAgdl9VMTZfdCAgICAgICAgICAgIFJ4UHJvdG9UeXBlLCAgICAgLyogUHJvdG9jb2wgVHlwZSBmcm9tIHRoZSBmcmFtZSByZWNlaXZlZCAqLworICB2b3NfcGt0X3QgICAgICAgICAqdm9zUnhMc0J1ZmYKKykKK3sKKyAgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzOworICAgIHB0QnRhbXBDb250ZXh0ICAgICAgICAgICBwQnRhbXBDdHggPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOworICAgIFdMQU5CQVBfODAyM0hlYWRlclR5cGUgICB3ODAyM0hlYWRlcjsKKyAgICB2X1NJWkVfdCAgICAgICAgICAgICAgICAgSGVhZGVyTGVuID0gc2l6ZW9mKHc4MDIzSGVhZGVyKTsKKworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU2FuaXR5IGNoZWNrIHBhcmFtcworICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIE5VTEwgPT0gcEJ0YW1wQ3R4KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJBUCBoYW5kbGUgdmFsdWUgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJJbiAlcyBSZWNlaXZlZCBSeFByb3RvVHlwZT0leCIsIF9fRlVOQ1RJT05fXyxSeFByb3RvVHlwZSk7CisgICAgCisgICAgdm9zX3BrdF9leHRyYWN0X2RhdGEodm9zUnhMc0J1ZmYsMCwodl9WT0lEX3QqKSZ3ODAyM0hlYWRlciwmSGVhZGVyTGVuKTsKKyAgICBpZiAoICEodm9zX21lbV9jb21wYXJlKCB3ODAyM0hlYWRlci52REEsIHBCdGFtcEN0eC0+c2VsZl9tYWNfYWRkciwgVk9TX01BQ19BRERSX1NJWkUpCisgICAgJiYgdm9zX21lbV9jb21wYXJlKCB3ODAyM0hlYWRlci52U0EsIHBCdGFtcEN0eC0+cGVlcl9tYWNfYWRkciwgVk9TX01BQ19BRERSX1NJWkUpKSkKKyAgICB7CisKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIk1BQyBhZGRyZXNzIG1pc21hdGNoIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvKkZyZWUgdGhlIHZvcyBwYWNrZXQqLworICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggdm9zUnhMc0J1ZmYgKTsKKyAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZyZWUgVk9TIHBhY2tldCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAKKyAgICAvKiBSZXNldCBMaW5rIFN1cGVydmlzaW9uIHRpbWVyICovCisgICAgaWYgKFJ4UHJvdG9UeXBlID09ICBXTEFOVExfQlRfQU1QX1RZUEVfTFNfUkVQKQorICAgIHsgCisgICAgICAgIHBCdGFtcEN0eC0+bHNSZXFQa3RQZW5kaW5nID0gRkFMU0U7CisgICAgICAgIHBCdGFtcEN0eC0+cmV0cmllcyA9IDA7CisgICAgICAgIGlmIChwQnRhbXBDdHgtPmJhcExpbmtTdXBlcnZpc2lvblRpbWVySW50ZXJ2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlc3RhcnQgdGhlIExTIHRpbWVyICovCisgICAgICAgICAgICBXTEFOQkFQX1N0b3BMaW5rU3VwZXJ2aXNpb25UaW1lcihwQnRhbXBDdHgpOworICAgICAgICAgICAgdm9zU3RhdHVzID0gV0xBTkJBUF9TdGFydExpbmtTdXBlcnZpc2lvblRpbWVyIChwQnRhbXBDdHgsCisgICAgICAgICAgICAgICAgICAgcEJ0YW1wQ3R4LT5iYXBMaW5rU3VwZXJ2aXNpb25UaW1lckludGVydmFsICogV0xBTkJBUF9CUkVEUl9CQVNFQkFORF9TTE9UX1RJTUUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoUnhQcm90b1R5cGUgPT0gV0xBTlRMX0JUX0FNUF9UWVBFX0xTX1JFUSkKKyAgICB7CisgICAgICAgIGlmIChwQnRhbXBDdHgtPmJhcExpbmtTdXBlcnZpc2lvblRpbWVySW50ZXJ2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlc3RhcnQgdGhlIExTIHRpbWVyICovCisgICAgICAgICAgICBXTEFOQkFQX1N0b3BMaW5rU3VwZXJ2aXNpb25UaW1lcihwQnRhbXBDdHgpOworICAgICAgICAgICAgdm9zU3RhdHVzID0gV0xBTkJBUF9TdGFydExpbmtTdXBlcnZpc2lvblRpbWVyIChwQnRhbXBDdHgsCisgICAgICAgICAgICAgICAgICAgcEJ0YW1wQ3R4LT5iYXBMaW5rU3VwZXJ2aXNpb25UaW1lckludGVydmFsICogV0xBTkJBUF9CUkVEUl9CQVNFQkFORF9TTE9UX1RJTUUpOworICAgICAgICB9CisgICAgICAgIHBCdGFtcEN0eC0+cFBhY2tldCA9IHBCdGFtcEN0eC0+bHNSZXBQYWNrZXQ7CisgICAgICAgIC8vIEhhbmRsZSBMUyByZXAgZnJhbWUKKyAgICAgICAgdm9zU3RhdHVzID0gV0xBTkJBUF9UeExpbmtTdXBlcnZpc2lvbiggYnRhbXBIYW5kbGUsIHBoeV9saW5rX2hhbmRsZSwgcEJ0YW1wQ3R4LT5wUGFja2V0LCBXTEFOVExfQlRfQU1QX1RZUEVfTFNfUkVQKTsKKyAgICB9CisgICAKKyAgICByZXR1cm4gdm9zU3RhdHVzOyAKKworfQorCisvKiBUeCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgTFMgcGFja2V0ICovCitzdGF0aWMgVk9TX1NUQVRVUyBXTEFOQkFQX1R4TGlua1N1cGVydmlzaW9uQ0IKKygKKyAgICB2X1BWT0lEX3QgICBwdm9zR0N0eCwKKyAgICB2b3NfcGt0X3QgICAqcFBhY2tldCwKKyAgICBWT1NfU1RBVFVTICByZXRTdGF0dXMKKykKK3sKKyAgICBWT1NfU1RBVFVTICAgICB2b3NTdGF0dXM7CisgICAgcHRCdGFtcENvbnRleHQgYmFwQ29udGV4dDsgLyogSG9sZHMgdGhlIGJ0YW1wQ29udGV4dCB2YWx1ZSByZXR1cm5lZCAqLyAKKyAgICB2b3NfcGt0X3QgICAgICAgICAgICAgICAgKnBMU1BhY2tldDsgCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiVHhDb21wQ0IgcmVhY2hlZCBmb3IgTFMgUGt0Iik7CisKKyAgICAvKiBHZXQgdGhlIEJUIEFNUCBjb250ZXh0IGZyb20gdGhlIGdsb2JhbCAqLworICAgIGJhcENvbnRleHQgPSBncEJ0YW1wQ3R4OworCisgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MgKHJldFN0YXR1cykpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJUeENvbXBDQjpUcmFuc21pdCBzdGF0dXMgRmFpbHVyZSIpOworICAgIH0KKworICAgIGlmICggcFBhY2tldCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiV0xBTkJBUF9UeENvbXBDQiBiYWQgaW5wdXRcbiIgKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworCisgICAgLyogUmV0dXJuIHRoZSBwYWNrZXQgJiByZWFsbG9jYXRlICovCisgICAgCisgICAgaWYoIHBQYWNrZXQgPT0gYmFwQ29udGV4dC0+bHNSZXFQYWNrZXQgKQorICAgIHsKKyAgICAgICAgdm9zU3RhdHVzID0gV0xBTkJBUF9BY3F1aXJlTFNQYWNrZXQoIGJhcENvbnRleHQsICZwTFNQYWNrZXQsMzIsIFRSVUUgKTsKKyAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICAgeworICAgICAgICAgICAgYmFwQ29udGV4dC0+bHNSZXFQYWNrZXQgPSBwTFNQYWNrZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOkFjcXVpcmVMU1BhY2tldCBmYWlsZWRcbiIsX19GVU5DVElPTl9fKTsKKyAgICAgICAgIGJhcENvbnRleHQtPmxzUmVxUGFja2V0ID0gTlVMTDsKKyAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7ICAgCisgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX0FjcXVpcmVMU1BhY2tldCggYmFwQ29udGV4dCwgJnBMU1BhY2tldCwzMiwgRkFMU0UgKTsKKyAgICAgICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBiYXBDb250ZXh0LT5sc1JlcFBhY2tldCA9IHBMU1BhY2tldDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczpBY3F1aXJlTFNQYWNrZXQgZmFpbGVkXG4iLF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgYmFwQ29udGV4dC0+bHNSZXBQYWNrZXQgPSBOVUxMOworICAgICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7ICAgCisgICAgICAgIH0KKyAgICB9CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiJXM6UmV0dXJuZWQgVm9zIFBhY2tldDoleFxuIixfX0ZVTkNUSU9OX18sIHBQYWNrZXQgKTsKKworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOworCisgICAgcmV0dXJuIChWT1NfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1R4TGlua1N1cGVydmlzaW9uCisKKyAgREVTQ1JJUFRJT04gCisKKyAgICBUaGlzIEFQSSB3aWxsIGJlIGNhbGxlZCB0byBwcm9jZXNzIExpbmsgU3VwZXJ2aXNpb24gUmVxdWVzdCByZWNlaXZlZAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBidGFtcEhhbmRsZTogVGhlIEJULUFNUCBQQUwgaGFuZGxlIHJldHVybmVkIGluIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwdWNBQzogICAgICAgUG9pbnRlciB0byByZXR1cm4gdGhlIGFjY2VzcyBjYXRlZ29yeSAKKyAgICB2b3NEYXRhQnVmZjogVGhlIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDgwMi4zIGZyYW1lIHRvIGJlIAorICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkIHRvIEJUIEhDSSBEYXRhIFBhY2tldAorICAgCisgIFJFVFVSTiBWQUxVRSAgICAgCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIEJBUCBoYW5kbGUgaXMgTlVMTCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5CQVBfVHhMaW5rU3VwZXJ2aXNpb24KKyggCisgIHB0QnRhbXBIYW5kbGUgICAgIGJ0YW1wSGFuZGxlLCAKKyAgdl9VOF90ICAgICAgICAgICAgcGh5X2xpbmtfaGFuZGxlLCAgLyogVXNlZCBieSBCQVAgdG8gaW5kZW50aWZ5IHRoZSBXTEFOIGFzc29jLiAoU3RhSWQpICovCisgIHZvc19wa3RfdCAgICAgICAgICpwUGFja2V0LAorICB2X1UxNl90ICAgICAgICAgICBwcm90b1R5cGUKKykKK3sKKyAgICBwdEJ0YW1wQ29udGV4dCAgICAgICAgICAgICBwQnRhbXBDdHggPSAocHRCdGFtcENvbnRleHQpYnRhbXBIYW5kbGU7CisgICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgcHZvc0dDdHg7CisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZDsgIC8qIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpICovCisgICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgcEhkZEhkbDsgLyogSGFuZGxlIHRvIHJldHVybiBCU0wgY29udGV4dCBpbiAqLworICAgIFdMQU5UTF9NZXRhSW5mb1R5cGUgICAgICAgIG1ldGFJbmZvOworCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkluICA6ICVzIHByb3RvVHlwZT0leCIsIF9fRlVOQ1RJT05fXyxwcm90b1R5cGUpOworCisgICAgICAgIC8vIFJldHJpZXZlIHRoZSBWT1NTIGNvbnRleHQKKyAgICBwdm9zR0N0eCA9IHBCdGFtcEN0eC0+cHZvc0dDdHg7CisKKyAgICAvKiBMb29rdXAgdGhlIFN0YUlkIHVzaW5nIHRoZSBwaHlfbGlua19oYW5kbGUgYW5kIHRoZSBCQVAgY29udGV4dCAqLyAKKworICAgIHZvc1N0YXR1cyA9IFdMQU5CQVBfR2V0U3RhSWRGcm9tTGlua0N0eCAoIAorICAgICAgICAgICAgYnRhbXBIYW5kbGUsICAvKiBidGFtcEhhbmRsZSB2YWx1ZSBpbiAgKi8gCisgICAgICAgICAgICBwaHlfbGlua19oYW5kbGUsICAvKiBwaHlfbGlua19oYW5kbGUgdmFsdWUgaW4gKi8KKyAgICAgICAgICAgICZ1Y1NUQUlkLCAgLyogVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgKi8KKyAgICAgICAgICAgICZwSGRkSGRsKTsgLyogSGFuZGxlIHRvIHJldHVybiBCU0wgY29udGV4dCAqLworICAgIAorICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIAorICAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldHJpZXZlIFNUQSBJZCBmcm9tIEJBUCBjb250ZXh0IGFuZCBwaHlfbGlua19oYW5kbGUgaW4gV0xBTkJBUF9UeExpbktTdXBlcnZpc2lvblJlcSIpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICB2b3NfbWVtX3plcm8oICZtZXRhSW5mbywgc2l6ZW9mKCBXTEFOVExfTWV0YUluZm9UeXBlICkgKTsKKyAgICAKKyAgICBtZXRhSW5mby51Y1RJRCA9IDB4MDAgOworICAgIG1ldGFJbmZvLnVjVVAgPSAweDAwOworICAgIG1ldGFJbmZvLnVjSXNFYXBvbCA9ICBWT1NfRkFMU0U7Ly9Ob3RpZnkgVEwgdGhhdCB0aGlzIGlzIE5PVCBhbiBFQVBPTCBmcmFtZQorICAgIG1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCA9IFZPU19GQUxTRTsKKyAgICBtZXRhSW5mby51Y1R5cGUgPSAweDAwOworICAgIHBCdGFtcEN0eC0+bWV0YUluZm8gPSBtZXRhSW5mbzsKKyAgICAKKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfVHhCQVBGcm0oIHB2b3NHQ3R4LCBwUGFja2V0LCAmbWV0YUluZm8sIFdMQU5CQVBfVHhMaW5rU3VwZXJ2aXNpb25DQiApOworICAgIGlmKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVHg6IFBhY2tldCByZWplY3RlZCBieSBUTCBpbiBXTEFOQkFQX1R4TGlua1N1cGVydmlzaW9uUmVxIik7CisgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CisgICAgfQorICAgIAorICAgIGlmKHByb3RvVHlwZSA9PSAgV0xBTlRMX0JUX0FNUF9UWVBFX0xTX1JFUSkKKyAgICB7CisgICAgICAgIHBCdGFtcEN0eC0+bHNSZXFQa3RQZW5kaW5nID0gVFJVRTsKKyAgICAgICAgcEJ0YW1wQ3R4LT5yZXRyaWVzKys7CisgICAgfQorICAgCisgICAgaWYgKHBCdGFtcEN0eC0+YmFwTGlua1N1cGVydmlzaW9uVGltZXJJbnRlcnZhbCkKKyAgICB7CisgICAgICAgIC8qIFJlc3RhcnQgdGhlIExTIHRpbWVyICovCisgICAgICAgIFdMQU5CQVBfU3RvcExpbmtTdXBlcnZpc2lvblRpbWVyKHBCdGFtcEN0eCk7CisgICAgICAgIHZvc1N0YXR1cyA9IFdMQU5CQVBfU3RhcnRMaW5rU3VwZXJ2aXNpb25UaW1lciAocEJ0YW1wQ3R4LAorICAgICAgICAgICAgICAgcEJ0YW1wQ3R4LT5iYXBMaW5rU3VwZXJ2aXNpb25UaW1lckludGVydmFsICogV0xBTkJBUF9CUkVEUl9CQVNFQkFORF9TTE9UX1RJTUUpOworICAgIH0KKworICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXTEFOQkFQX1R4TGlua1N1cGVydmlzaW9uUmVxIGZhaWxlZCB0byBTdGFydCBMaW5rU3VwZXJ2aXNpb24gVGltZXJcbiIgKTsKKyAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgIH0KKyAgIAorICAgcmV0dXJuIHZvc1N0YXR1czsKK30gLyogV0xBTkJBUF9SeExpbmtTdXBlcnZpc2lvblJlcSAqLworCisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcEFwaVN0YXR1cy5jIGIvQ09SRS9CQVAvc3JjL2JhcEFwaVN0YXR1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YTNlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYmFwQXBpU3RhdHVzLmMKQEAgLTAsMCArMSw4NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgYiBhIHAgQSBwIGkgUyB0IGEgdCB1IHMgLiBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBPVkVSVklFVzoKKyAgCisgIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gQkFQIG1vZHVsZXMKKyAgU3RhdHVzIGZ1bmN0aW9ucy4KKyAgCisgIFRoZSBmdW5jdGlvbnMgZXh0ZXJuYWxpemVkIGJ5IHRoaXMgbW9kdWxlIGFyZSB0byBiZSBjYWxsZWQgT05MWSBieSBvdGhlciAKKyAgV0xBTiBtb2R1bGVzIChIREQpIHRoYXQgcHJvcGVybHkgcmVnaXN0ZXIgd2l0aCB0aGUgQkFQIExheWVyIGluaXRpYWxseS4KKworICBERVBFTkRFTkNJRVM6IAorCisgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LiAKKyAgCisgIAorICBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICAkSGVhZGVyOiAvY3lnZHJpdmUvZC9CdWlsZHMvTTcyMDFKU0RDQUFQQUQ1MjI0MEIvV00vcGxhdGZvcm0vbXNtNzIwMC9TcmMvRHJpdmVycy9TRC9DbGllbnREcml2ZXJzL1dMQU4vUUNUX0JUQU1QX1JTTi9DT1JFL0JBUC9zcmMvYmFwQXBpU3RhdHVzLmMsdiAxLjcgMjAwOS8wMy8wOSAwODo0NTowNCBqem11ZGEgRXhwIGp6bXVkYSAkJERhdGVUaW1lJCRBdXRob3I6IGp6bXVkYSAkCisKKworICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMDA4LTA5LTE1ICAgIGpleiAgICAgQ3JlYXRlZCBtb2R1bGUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vI2luY2x1ZGUgIndsYW5fcWN0X3RsLmgiCisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisKKy8qIEJULUFNUCBQQUwgQVBJIGhlYWRlciBmaWxlICovIAorI2luY2x1ZGUgImJhcEFwaS5oIiAKKyNpbmNsdWRlICJiYXBJbnRlcm5hbC5oIiAKKworLy8jZGVmaW5lIEJBUF9ERUJVRworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsaXplZCBGdW5jdGlvbiBEZWZpbml0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorU3RhdHVzIFBhcmFtZXRlcnMKKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBhY3R1YWwgSENJIFJlYWQgRmFpbGVkIENvbnRhY3QgQ291bnRlciBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lSZWFkRmFpbGVkQ29udGFjdENvdW50ZXI6ICBwb2ludGVyIHRvIHRoZSAiSENJIFJlYWQgRmFpbGVkIENvbnRhY3QgQ291bnRlciIgc3RydWN0dXJlLgorICAgIHBGYWlsZWRDb250YWN0Q291bnRlcjogIHBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlIGZvciB0aGUgIkZhaWxlZCBDb250YWN0IENvdW50ZXIiCisgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVJlYWRGYWlsZWRDb250YWN0Q291bnRlciBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIHBGYWlsZWRDb250YWN0Q291bnRlciBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkRmFpbGVkQ29udGFjdENvdW50ZXIKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kICAqcEJhcEhDSVJlYWRGYWlsZWRDb250YWN0Q291bnRlciwKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nICJSZWFkIiBDb21tYW5kIENvbXBsZXRlKi8KKykKK3sKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVzZXRGYWlsZWRDb250YWN0Q291bnRlcigpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZXNldCBGYWlsZWQgQ29udGFjdCBDb3VudGVyIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSVJlc2V0RmFpbGVkQ29udGFjdENvdW50ZXI6ICBwb2ludGVyIHRvIHRoZSAiSENJIFJlc2V0IEZhaWxlZCBDb250YWN0IENvdW50ZXIiIHN0cnVjdHVyZS4KKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVzZXRGYWlsZWRDb250YWN0Q291bnRlciBpcyBOVUxMCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlc2V0RmFpbGVkQ29udGFjdENvdW50ZXIKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCAqcEJhcEhDSVJlc2V0RmFpbGVkQ29udGFjdENvdW50ZXIsCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispCit7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFJlc2V0RmFpbGVkQ29udGFjdENvdW50ZXIgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZWFkTGlua1F1YWxpdHkoKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBMaW5rIFF1YWxpdHkgY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJUmVhZExpbmtRdWFsaXR5OiAgcG9pbnRlciB0byB0aGUgIkhDSSBSZWFkIExpbmsgUXVhbGl0eSIgc3RydWN0dXJlLgorICAgIHBCYXBIQ0lMaW5rUXVhbGl0eTogIHBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlIGZvciB0aGUgIkxpbmsgUXVhbGl0eSIKKyAgIAorICAgIElOL09VVAorICAgIHBCYXBIQ0lFdmVudDogIFJldHVybiBldmVudCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuIAorICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyAKKyAgICAgICAgICAgICAgICB0aGUgQ29tbWFuZCBDb21wbGV0ZSBldmVudCB1cCB0aGUgSENJIGludGVyZmFjZS4pCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZExpbmtRdWFsaXR5IG9yIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMaW5rUXVhbGl0eSBpcyBOVUxMIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkTGlua1F1YWxpdHkKKyggCisgIHB0QnRhbXBIYW5kbGUgYnRhbXBIYW5kbGUsCisgIHRCdGFtcFRMVkhDSV9SZWFkX0xpbmtfUXVhbGl0eV9DbWQgKnBCYXBIQ0lSZWFkTGlua1F1YWxpdHksCisgIHRwQnRhbXBIQ0lfRXZlbnQgcEJhcEhDSUV2ZW50IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyovCispCit7CisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsKKyAgICB2X1U4X3QgICAgICAgICBwaHlMaW5rSGFuZGxlOworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICIlczogYnRhbXBIYW5kbGUgdmFsdWU6ICV4IiwgX19GVU5DVElPTl9fLCAgYnRhbXBIYW5kbGUpOworCisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovIAorICAgIGlmICgoTlVMTCA9PSBidGFtcEhhbmRsZSkgfHwgKE5VTEwgPT0gcEJhcEhDSVJlYWRMaW5rUXVhbGl0eSkgfHwKKyAgICAgICAgKE5VTEwgPT0gcEJhcEhDSUV2ZW50KSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgdGhlIHBoeXNpY2FsIGxpbmsgaGFuZGxlIGV4dHJhY3RlZCBmcm9tCisgICAgICAgaW5wdXQgcGFyYW1ldGVyLiBUaGlzIHBhcmFtZXRlciBoYXMgMiBieXRlcyBmb3IgcGh5c2ljYWwgaGFuZGxlCisgICAgICAgKG9ubHkgbG93ZXIgYnl0ZSB2YWxpZCkgKi8KKyAgICBwaHlMaW5rSGFuZGxlID0gKHZfVThfdCkgcEJhcEhDSVJlYWRMaW5rUXVhbGl0eS0+bG9nX2xpbmtfaGFuZGxlOworCisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9MaW5rX1F1YWxpdHkubG9nX2xpbmtfaGFuZGxlCisgICAgICAgID0gcGh5TGlua0hhbmRsZTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xpbmtfUXVhbGl0eS5saW5rX3F1YWxpdHkgPSAwOworCisgICAgaWYgKHBoeUxpbmtIYW5kbGUgIT0gYnRhbXBDb250ZXh0LT5waHlfbGlua19oYW5kbGUpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBoeXNpY2FsIGxpbmsgaGFuZGxlIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9MaW5rX1F1YWxpdHkuc3RhdHVzCisgICAgICAgICAgICA9IFdMQU5CQVBfRVJST1JfSU5WQUxJRF9IQ0lfQ01ORF9QQVJBTTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogR2V0IHRoZSBMaW5rIHF1YWxpdHkgaW5kaWNhdGlvbiBzdGF0dXMgZnJvbSBjb250cm9sIGJsb2NrLgorICAgICAgICAgICBMaW5rIHF1YWxpdHkgdmFsdWUgaXMgYmVpbmcgdXBkYXRlZCBvbiB0aGUgU01FIGNhbGxiYWNrICovCisgICAgICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTGlua19RdWFsaXR5LmxpbmtfcXVhbGl0eQorICAgICAgICAgICAgPSBidGFtcENvbnRleHQtPmxpbmtfcXVhbGl0eTsKKworICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xpbmtfUXVhbGl0eS5zdGF0dXMKKyAgICAgICAgICAgID0gV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvKiBGaWxsIGluIHRoZSBwYXJhbWV0ZXJzIGZvciBjb21tYW5kIGNvbXBsZXRlIGV2ZW50Li4uICovIAorICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSBUUlVFOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jb21tYW5kX29wY29kZSAKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX1JFQURfTElOS19RVUFMSVRZX0NNRDsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIFdMQU5fQkFQUmVhZExpbmtRdWFsaXR5ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQUmVhZFJTU0koKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBSU1NJIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSVJlYWRSU1NJOiAgcG9pbnRlciB0byB0aGUgIkhDSSBSZWFkIFJTU0kiIHN0cnVjdHVyZS4KKyAgICBwQmFwSENJUlNTSTogIHBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlIGZvciB0aGUgIlJTU0kiLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lSZWFkUlNTSSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lSU1NJIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlYWRSU1NJCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfUmVhZF9SU1NJX0NtZCAqcEJhcEhDSVJlYWRSU1NJLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKQoreworICAgIFZPU19TVEFUVVMgICAgIHZvc1N0YXR1czsKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpIGJ0YW1wSGFuZGxlOworICAgIHZfVThfdCAgICAgICAgIHBoeUxpbmtIYW5kbGU7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7CisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKChOVUxMID09IGJ0YW1wSGFuZGxlKSB8fCAoTlVMTCA9PSBwQmFwSENJUmVhZFJTU0kpIHx8CisgICAgICAgIChOVUxMID09IHBCYXBIQ0lFdmVudCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qIFZhbGlkYXRlIHRoZSBwaHlzaWNhbCBsaW5rIGhhbmRsZSBleHRyYWN0ZWQgZnJvbQorICAgICAgIGlucHV0IHBhcmFtZXRlci4gVGhpcyBwYXJhbWV0ZXIgaGFzIDIgYnl0ZXMgZm9yIHBoeXNpY2FsIGhhbmRsZQorICAgICAgIChvbmx5IGxvd2VyIGJ5dGUgdmFsaWQpICovCisgICAgcGh5TGlua0hhbmRsZSA9ICh2X1U4X3QpIHBCYXBIQ0lSZWFkUlNTSS0+bG9nX2xpbmtfaGFuZGxlOworCisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9SU1NJLnBoeV9saW5rX2hhbmRsZQorICAgICAgICA9IHBoeUxpbmtIYW5kbGU7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9SU1NJLnJzc2kgPSAwOworCisgICAgaWYgKHBoeUxpbmtIYW5kbGUgIT0gYnRhbXBDb250ZXh0LT5waHlfbGlua19oYW5kbGUpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBoeXNpY2FsIGxpbmsgaGFuZGxlIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9SU1NJLnN0YXR1cworICAgICAgICAgICAgPSBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEdldCB0aGUgUlNTSSB2YWx1ZSBmb3IgdGhpcyBzdGF0aW9uIChwaHlzaWNhbCBsaW5rKSAqLworICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfR2V0UnNzaShidGFtcENvbnRleHQtPnB2b3NHQ3R4LCBidGFtcENvbnRleHQtPnVjU1RBSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAmcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9SU1NJLnJzc2kpOworCisgICAgICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBHZXRSc3NpIHN1Y2Nlc3MsIGluZGljYXRlIHRoZSB0byB1cHBlciBsYXllciAqLworICAgICAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9SU1NJLnN0YXR1cworICAgICAgICAgICAgICAgID0gV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFQSSBmYWlsZWQsIGluZGljYXRlIHVuc3BlY2lmaWVkIGVycm9yIHRvIHVwcGVyIGxheWVyICovCisgICAgICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX1JTU0kuc3RhdHVzCisgICAgICAgICAgICAgICAgPSBXTEFOQkFQX0VSUk9SX1VOU1BFQ0lGSUVEX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRmlsbCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgY29tbWFuZCBjb21wbGV0ZSBldmVudC4uLiAqLyAKKyAgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9DT01QTEVURV9FVkVOVDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5wcmVzZW50ID0gVFJVRTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY29tbWFuZF9vcGNvZGUgCisgICAgICAgID0gQlRBTVBfVExWX0hDSV9SRUFEX1JTU0lfQ01EOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogV0xBTl9CQVBSZWFkUlNTSSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOX0JBUFJlYWRMb2NhbEFNUEluZm8oKQorCisgIERFU0NSSVBUSU9OIAorICAgIEltcGxlbWVudHMgdGhlIGFjdHVhbCBIQ0kgUmVhZCBMb2NhbCBBTVAgSW5mb3JtYXRpb24gY29tbWFuZC4gIFRoZXJlIAorICAgIGlzIG5vIG5lZWQgZm9yIGEgY2FsbGJhY2sgYmVjYXVzZSB3aGVuIHRoaXMgY2FsbCByZXR1cm5zIHRoZSBhY3Rpb24gCisgICAgaGFzIGJlZW4gY29tcGxldGVkLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwQmFwSENJUmVhZExvY2FsQU1QSW5mbzogIHBvaW50ZXIgdG8gdGhlICJIQ0kgUmVhZCBMb2NhbCBBTVAgSW5mbyIgU3RydWN0dXJlLgorICAgCisgICAgSU4vT1VUCisgICAgcEJhcEhDSUV2ZW50OiAgUmV0dXJuIGV2ZW50IHZhbHVlIGZvciB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudC4gCisgICAgICAgICAgICAgICAgKFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIAorICAgICAgICAgICAgICAgIHRoZSBDb21tYW5kIENvbXBsZXRlIGV2ZW50IHVwIHRoZSBIQ0kgaW50ZXJmYWNlLikKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIHBCYXBIQ0lSZWFkTG9jYWxBTVBJbmZvIG9yIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBCYXBIQ0lMb2NhbEFNUEluZm8gaXMgTlVMTAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIAorV0xBTl9CQVBSZWFkTG9jYWxBTVBJbmZvCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kICpwQmFwSENJUmVhZExvY2FsQU1QSW5mbywKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKykKK3sKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKGJ0YW1wSGFuZGxlID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovIAorICAgIGlmIChwQmFwSENJUmVhZExvY2FsQU1QSW5mbyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnRhbXBIYW5kbGUgdmFsdWU6ICV4IiwgX19GVU5DVElPTl9fLCAgYnRhbXBIYW5kbGUpOyAKKworCisgICAgLyogRm9ybWF0IHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IHRvIHJldHVybi4uLiAqLyAKKyAgICBwQmFwSENJRXZlbnQtPmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfQ09NTUFORF9DT01QTEVURV9FVkVOVDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5wcmVzZW50ID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY29tbWFuZF9vcGNvZGUgCisgICAgICAgID0gQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX0FNUF9JTkZPUk1BVElPTl9DTUQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9Mb2NhbF9BTVBfSW5mby5zdGF0dXMgCisgICAgICAgID0gV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX0FNUF9TdGF0dXMKKyAgICAgICAgPSBXTEFOQkFQX0hDSV9BTVBfU1RBVFVTX05PVF9TSEFSRUQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9Mb2NhbF9BTVBfSW5mby5IQ19Ub3RhbF9CVworICAgICAgICA9IDI0MDAwOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uSENfTWF4X0d1YXJhbnRlZWRfQlcKKyAgICAgICAgPSAxMjAwMDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX01pbl9MYXRlbmN5CisgICAgICAgID0gMTAwOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uSENfTWF4X1BEVV9TaXplCisgICAgICAgID0gV0xBTkJBUF9NQVhfODAyMTFfUEFMX1BEVV9TSVpFOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uSENfQ29udHJvbGxlcl9UeXBlIAorICAgICAgICA9IDE7CisjaWYgMAorQU1QIEluZm8gUEFMX0NhcGFiaWxpdGllczogU2l6ZTogMiBPY3RldHMKKworVmFsdWUgICAgUGFyYW1ldGVyIERlc2NyaXB0aW9uCisweFhYWFggICBCaXQgMDogIlNlcnZpY2UgVHlwZSA9IEd1YXJhbnRlZWQiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgUEFMID0gMAorICAgICAgICAgICAgICAgICJTZXJ2aWNlIFR5cGUgPSBHdWFyYW50ZWVkIiBpcyBzdXBwb3J0ZWQgYnkgUEFMID0gMQorICAgICAgICAgQml0cyAxNS0xOiBSZXNlcnZlZCAoc2hhbGwgYmUgc2V0IHRvIDApCisgICAgICAgICAoU2VlIEVGUyBpbiBHZW5lcmljIEFNUCBGSVBEIFsxXSkKKyNlbmRpZiAvLzAKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX1BBTF9DYXBhYmlsaXRpZXMKKyAgICAgICAgPSAweDAwOyAvLyB3YXMgMHgwMy4gQ29tcGxldGVseSB3cm9uZy4KKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX0FNUF9Bc3NvY19MZW5ndGgKKyAgICAgICAgPSAyNDg7CisgICAgICAgIC8vPSA0MDsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX01heF9GbHVzaF9UaW1lb3V0CisgICAgICAgID0gMTAwMDA7ICAvLzEwOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uSENfQkVfRmx1c2hfVGltZW91dAorICAgICAgICA9IDEwMDAwOyAvLzg7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFJlYWRMb2NhbEFNUEluZm8gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRlVOQ1RJT04gICAgV0xBTl9CQVBSZWFkTG9jYWxBTVBBc3NvYygpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBSZWFkIExvY2FsIEFNUCBBc3NvYyBjb21tYW5kLiAgVGhlcmUgCisgICAgaXMgbm8gbmVlZCBmb3IgYSBjYWxsYmFjayBiZWNhdXNlIHdoZW4gdGhpcyBjYWxsIHJldHVybnMgdGhlIGFjdGlvbiAKKyAgICBoYXMgYmVlbiBjb21wbGV0ZWQuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogcG9pbnRlciB0byB0aGUgQkFQIGhhbmRsZS4gIFJldHVybmVkIGZyb20gV0xBTkJBUF9HZXROZXdIbmRsLgorICAgIHBCYXBIQ0lSZWFkTG9jYWxBTVBBc3NvYzogIHBvaW50ZXIgdG8gdGhlICJIQ0kgUmVhZCBMb2NhbCBBTVAgQXNzb2MiIFN0cnVjdHVyZS4KKyAgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJUmVhZExvY2FsQU1QQXNzb2MgCisgICAgICAgICAgICAgICAgICAgICAgICAob3IgcEJhcEhDSUxvY2FsQU1QQXNzb2MpIGlzIE5VTEwgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyAgCitXTEFOX0JBUFJlYWRMb2NhbEFNUEFzc29jCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlLAorICB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kICAgKnBCYXBIQ0lSZWFkTG9jYWxBTVBBc3NvYywKKyAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkaW5nIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKykKK3sKKyAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXM7CisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsgLyogYnRhbXBDb250ZXh0IHZhbHVlICovIAorICAgIHRIYWxIYW5kbGUgaEhhbDsKKyAgICB0QnRhbXBBTVBfQVNTT0MgYnRhbXBfQVNTT0M7IAorICAgIHZfVTMyX3QgbkNvbnN1bWVkID0gMDsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworCisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovIAorICAgIGlmICgocEJhcEhDSVJlYWRMb2NhbEFNUEFzc29jID09IE5VTEwpIHx8IChOVUxMID09IGJ0YW1wSGFuZGxlKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJwYXJhbSBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKyAgICBoSGFsID0gVk9TX0dFVF9IQUxfQ0IoYnRhbXBDb250ZXh0LT5wdm9zR0N0eCk7CisgICAgaWYgKE5VTEwgPT0gaEhhbCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiaEhhbCBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7IAorCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAiSW4gJXMsIHBoeV9saW5rX2hhbmRsZSA9ICVkIiwgX19GVU5DVElPTl9fLCAKKyAgICAgICAgICAgIHBCYXBIQ0lSZWFkTG9jYWxBTVBBc3NvYy0+cGh5X2xpbmtfaGFuZGxlKTsgCisKKyAgICAvKiBVcGRhdGUgdGhlIE1BQyBhZGRyZXNzIGFuZCBTU0lEIGlmIGluIGNhc2UgdGhlIFJlYWQgTG9jYWwgQU1QIEFzc29jCisgICAgICogUmVxdWVzdCBpcyBtYWRlIGJlZm9yZSBDcmVhdGUgUGh5c2ljYWwgTGluayBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBXTEFOQkFQX1JlYWRNYWNDb25maWcgKGJ0YW1wQ29udGV4dCk7CisKKyAgICAvKiBGaWxsIGluIHRoZSBjb250ZW50cyBvZiBhbiBBTVBfQXNzb2Mgc3RydWN0dXJlIGluIHByZXBhcmF0aW9uCisgICAgICogZm9yIFBhY2tpbmcgaXQgaW50byB0aGUgQU1QX2Fzc29jX2ZyYWdtZW50IGZpZWxkIG9mIHRoZSBSZWFkIAorICAgICAqIExvY2FsIEFNUCBBc3NvYyBDb21tYW5kIENvbXBsZXRlIEV2ZW50IAorICAgICAqLyAKKyAgICAvKiBSZXR1cm4gdGhlIGxvY2FsIE1BQyBhZGRyZXNzICovIAorICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19NQUNfQWRkci5wcmVzZW50ID0gMTsKKyAgICB2b3NfbWVtX2NvcHkoIAorICAgICAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX01BQ19BZGRyLm1hY19hZGRyLCAgIAorICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZWxmX21hY19hZGRyLCAKKyAgICAgICAgICAgIHNpemVvZihidGFtcENvbnRleHQtPnNlbGZfbWFjX2FkZHIpKTsgCisKKyAgICAvKlNhdmUgdGhlIGxvY2FsIEFNUCBhc3NvYyBpbmZvKi8KKyAgICB2b3NfbWVtX2NvcHkoYnRhbXBDb250ZXh0LT5idGFtcF9BTVBfQXNzb2MuSENfbWFjX2FkZHIsCisgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+c2VsZl9tYWNfYWRkciwgCisgICAgICAgICAgICAgICAgIHNpemVvZihidGFtcENvbnRleHQtPnNlbGZfbWFjX2FkZHIpKTsgCisKKworICAgIC8qIEpFWjA5MDMwMzogVGhpcyBsb2dpYyBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIGNoYW5uZWwgbGlzdCB3aXRoIHRoZSAqLyAKKyAgICAvKiBzZWxlY3RlZCBjaGFubmVsLCBpZiB3ZSBoYXZlIG9uZS4gKi8KKyAgICAvL2lmIChidGFtcENvbnRleHQtPmNoYW5uZWwpICAKKyAgICBpZiAoMSkgIAorICAgIHsgCisgICAgICAgIC8qIFJldHVybiB0aGUgbG9jYWwgUHJlZmVycmVkIENoYW5uZWwgTGlzdCAqLyAKKyAgICAgICAgLyogUmV0dXJuIGJvdGggdGhlIFJlZ3VsYXRvcnkgSW5mbyBhbmQgb25lIGNoYW5uZWwgbGlzdCAqLyAKKyAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QucHJlc2VudCA9IDE7IAorICAgICAgICBtZW1jcHkgKGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LmNvdW50cnksICJYWFgiLCAzKTsgCisgICAgICAgIC8qU2F2ZSB0aGUgbG9jYWwgQU1QIGFzc29jIGluZm8qLworICAgICAgICB2b3NfbWVtX2NvcHkoYnRhbXBDb250ZXh0LT5idGFtcF9BTVBfQXNzb2MuSENfcHJlZl9jb3VudHJ5LCAiWFhYIiwgMyk7CisKKyAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QubnVtX3RyaXBsZXRzID0gMjsgCisgICAgICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LnRyaXBsZXRzWzBdWzBdID0gMjAxOyAKKyAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QudHJpcGxldHNbMF1bMV0gPSAyNTQ7IAorICAgICAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC50cmlwbGV0c1swXVsyXSA9IDA7IAorCisgICAgICAgIGlmICgoIEJUX0lOSVRJQVRPUiA9PSBidGFtcENvbnRleHQtPkJBUERldmljZVJvbGUgKSAmJgorICAgICAgICAgICAgKCAwICE9IGJ0YW1wQ29udGV4dC0+Y2hhbm5lbCApKQorICAgICAgICB7CisgICAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QudHJpcGxldHNbMV1bMF0gPSBidGFtcENvbnRleHQtPmNoYW5uZWw7CisgICAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QudHJpcGxldHNbMV1bMV0gPSAweDAxOyAvL3dlIGFyZSBBUCAtIHdlIHN0YXJ0IG9uIHRoZWlyIDFzdCBwcmVmZXJyZWQgY2hhbm5lbCAKKyAgICAgICAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC50cmlwbGV0c1sxXVsyXSA9IDB4MTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnRhbXBDb250ZXh0LT5jb25maWcudWNQcmVmZXJyZWRDaGFubmVsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LnRyaXBsZXRzWzFdWzBdID0gYnRhbXBDb250ZXh0LT5jb25maWcudWNQcmVmZXJyZWRDaGFubmVsOworICAgICAgICAgICAgICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LnRyaXBsZXRzWzFdWzFdID0gCisgICAgICAgICAgICAgICAgICAgIDB4MEIgLSBidGFtcENvbnRleHQtPmNvbmZpZy51Y1ByZWZlcnJlZENoYW5uZWwgKyAxOyAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QudHJpcGxldHNbMV1bMF0gPSAweDAxOyAKKyAgICAgICAgICAgICAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC50cmlwbGV0c1sxXVsxXSA9IDB4MEI7IC8vYWxsIGNoYW5uZWxzIGZvciAxIHRvIDExIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC50cmlwbGV0c1sxXVsyXSA9IDB4MTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgCisgICAgeyAKKyAgICAgICAgLyogUmV0dXJuIHRoZSBsb2NhbCBQcmVmZXJyZWQgQ2hhbm5lbCBMaXN0ICovIAorICAgICAgICAvKiBSZXR1cm4gb25seSB0aGUgUmVndWxhdG9yeSBJbmZvICovIAorICAgICAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC5wcmVzZW50ID0gMTsgCisgICAgICAgIG1lbWNweSAoYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QuY291bnRyeSwgIlhYWCIsIDMpOyAKKyAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QubnVtX3RyaXBsZXRzID0gMTsgCisgICAgICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LnRyaXBsZXRzWzBdWzBdID0gMjAxOyAKKyAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QudHJpcGxldHNbMF1bMV0gPSAyNTQ7IAorICAgICAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC50cmlwbGV0c1swXVsyXSA9IDA7CisKKyAgICB9ICAKKworICAgIC8qU2F2ZSB0aGUgbG9jYWwgQU1QIGFzc29jIGluZm8qLworICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfQU1QX0Fzc29jLkhDX3ByZWZfbnVtX3RyaXBsZXRzICAgPSBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC5udW1fdHJpcGxldHM7CisgICAgYnRhbXBDb250ZXh0LT5idGFtcF9BTVBfQXNzb2MuSENfcHJlZl90cmlwbGV0c1swXVswXSA9IGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LnRyaXBsZXRzWzBdWzBdOworICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfQU1QX0Fzc29jLkhDX3ByZWZfdHJpcGxldHNbMF1bMV0gPSBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC50cmlwbGV0c1swXVsxXTsgCisgICAgYnRhbXBDb250ZXh0LT5idGFtcF9BTVBfQXNzb2MuSENfcHJlZl90cmlwbGV0c1swXVsyXSA9IGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LnRyaXBsZXRzWzBdWzJdOworICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfQU1QX0Fzc29jLkhDX3ByZWZfdHJpcGxldHNbMV1bMF0gPSBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC50cmlwbGV0c1sxXVswXTsKKyAgICBidGFtcENvbnRleHQtPmJ0YW1wX0FNUF9Bc3NvYy5IQ19wcmVmX3RyaXBsZXRzWzFdWzFdID0gYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QudHJpcGxldHNbMV1bMV07IAorICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfQU1QX0Fzc29jLkhDX3ByZWZfdHJpcGxldHNbMV1bMl0gPSBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC50cmlwbGV0c1sxXVsyXTsKKworICAgIC8qIEFsc28sIGF0IHRoaXMgcG9pbnQsIGxpZSBhbmQgdGVsbCB0aGUgb3RoZXIgc2lkZSB3ZSBhcmUgY29ubmVjdGVkIG9uICovCisgICAgLyogdGhlIG9uZSBjaGFubmVsIHdlIHN1cHBvcnQuIEkgaG9wZSB0aGlzIGNvbnZpbmNlcyB0aGUgcGVlciBhcyBCVC1BTVAgQVAgKi8KKyAgICAvKiBXZSByZWFsbHkgd2FudCBoaW0gdG8gdXNlIG91ciBjaGFubmVsLiAgU2luY2Ugd2Ugb25seSBzdXBwb3J0IG9uZS4qLyAKKyAgICAvKiBSZXR1cm4gdGhlIGxvY2FsIENvbm5lY3RlZCBDaGFubmVsICovIAorICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbC5wcmVzZW50ID0gMTsgCisgICAgbWVtY3B5IChidGFtcF9BU1NPQy5BTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwuY291bnRyeSwgIlhYWCIsIDMpOyAKKyAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwubnVtX3RyaXBsZXRzID0gMjsgCisgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLnRyaXBsZXRzWzBdWzBdID0gMjAxOyAKKyAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwudHJpcGxldHNbMF1bMV0gPSAyNTQ7IAorICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbC50cmlwbGV0c1swXVsyXSA9IDA7IAorICAgIC8vYnRhbXBfQVNTT0MuQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLnRyaXBsZXRzWzFdWzBdID0gMHgwMTsgCisgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLnRyaXBsZXRzWzFdWzBdID0gKDAgIT0gYnRhbXBDb250ZXh0LT5jaGFubmVsKT9idGFtcENvbnRleHQtPmNoYW5uZWw6MHgwMTsgCisgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLnRyaXBsZXRzWzFdWzFdID0gMHgwMTsgCisgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLnRyaXBsZXRzWzFdWzJdID0gMHgxMTsKKworCisgICAgLyogUmV0dXJuIHRoZSBsb2NhbCBQQUwgQ2FwYWJpbGl0aWVzICovIAorICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzLnByZXNlbnQgPSAxOworCisjaWYgMAorQU1QIEFTU09DIFBhbCBDYXBhYmlsaXRpZXM6IFNpemU6IDQgT2N0ZXRzCisKKyAgIFZhbHVlICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgICAgIDQgICAgICAgICAgICAgICBUeXBlSUQgZm9yIDgwMi4xMSBQQUwgQ2FwYWJpbGl0aWVzCisKKyAgICAgNCAgICAgICAgICAgICAgIExlbmd0aAorCisgICAweFhYWFhYWFhYICAgICAgICBCaXQgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAwIHNpZ25pZmllcyB0aGUgUEFMIGlzIG5vdCBjYXBhYmxlIG9mIHV0aWxpemluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgQWN0aXZpdHkgUmVwb3J0cworICAgICAgICAgICAgICAgICAgICAgICAgIDEgc2lnbmlmaWVzIHRoZSBQQUwgaXMgY2FwYWJsZSBvZiB1dGlsaXppbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIEFjdGl2aXR5IFJlcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgIEJpdCAxOgorICAgICAgICAgICAgICAgICAgICAgICAgIDAgc2lnbmlmaWVzIHRoZSBQQUwgaXMgbm90IGNhcGFibGUgb2YgdXRpbGl6aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsaW5nIGluZm9ybWF0aW9uIHNlbnQgaW4gYW4gQWN0aXZpdHkgUmVwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgMSBzaWduaWZpZXMgdGhlIFBBTCBpcyBjYXBhYmxlIG9mIHV0aWxpemluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGluZyBpbmZvcm1hdGlvbiBzZW50IGluIGFuIEFjdGl2aXR5IFJlcG9ydAorICAgICAgICAgICAgICAgICAgICAgQml0cyAyLi4zMSBSZXNlcnZlZAorCisjZW5kaWYgLy8wCisKKyAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcy5wYWxfY2FwYWJpbGl0aWVzIAorLy8gICAgICAgID0gYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3BhbF9jYXBhYmlsaXRpZXM7IAorICAgICAgICAvLz0gMHgwMzsKKyAgICAgICAgPSAweDAwOworCisgICAgLyogUmV0dXJuIHRoZSBsb2NhbCBQQUwgVmVyc2lvbiAqLyAKKyAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUEFMX1ZlcnNpb24ucHJlc2VudCA9IDE7CisKKyAgICAvKiBSZXR1cm4gdGhlIHZlcnNpb24gYW5kIGNvbXBhbnkgSUQgZGF0YSAqLyAKKyAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUEFMX1ZlcnNpb24ucGFsX3ZlcnNpb24gPSBXTEFOQkFQX1BBTF9WRVJTSU9OOworICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QQUxfVmVyc2lvbi5wYWxfQ29tcGFueUlEID0gV0xBTkJBUF9RVUFMQ09NTV9DT01QQU5ZX0lEOyAgLy8gUXVhbGNvbW0gQ29tcGFueSBJRAorICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QQUxfVmVyc2lvbi5wYWxfc3VidmVyc2lvbiA9IFdMQU5CQVBfUEFMX1NVQlZFUlNJT047CisKKyAgICAvL1BhY2sgdGhlIEFNUCBBc3NvYyBzdHJ1Y3R1cmUKKyAgICB2b3NTdGF0dXMgPSBidGFtcFBhY2tBTVBfQVNTT0MoCisgICAgICAgICAgICBoSGFsLCAKKyAgICAgICAgICAgICZidGFtcF9BU1NPQywgCisgICAgICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX1JlYWRfTG9jYWxfQU1QX0Fzc29jLkFNUF9hc3NvY19mcmFnbWVudCwgCisgICAgICAgICAgICAyNDgsIAorICAgICAgICAgICAgJm5Db25zdW1lZCk7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IG5Db25zdW1lZCB2YWx1ZTogJWQiLCBfX0ZVTkNUSU9OX18sICBuQ29uc3VtZWQpOyAKKworICAgIC8qIEZvcm1hdCB0aGUgY29tbWFuZCBjb21wbGV0ZSBldmVudCB0byByZXR1cm4uLi4gKi8gCisgICAgcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX0NPTU1BTkRfQ09NUExFVEVfRVZFTlQ7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQucHJlc2VudCA9IDE7CisgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNvbW1hbmRfb3Bjb2RlIAorICAgICAgICA9IEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9BTVBfQVNTT0NfQ01EOworICAgIC8qVmFsaWRhdGUgdGhlIFBoeXNpY2FsIGhhbmRsZSovCisgICAgaWYocEJhcEhDSVJlYWRMb2NhbEFNUEFzc29jLT5waHlfbGlua19oYW5kbGUgIT0gCisgICAgICAgYnRhbXBDb250ZXh0LT5waHlfbGlua19oYW5kbGUpIHsgCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICIlczogV3JvbmcgUGh5c2ljYWwgTGluayBoYW5kbGUgaW4gUmVhZCBMb2NhbCBBTVAgQXNzb2MgY21kOiBjdXJyZW50OiAleCwgbmV3OiAleCIsIF9fRlVOQ1RJT05fXywgIAorICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+cGh5X2xpbmtfaGFuZGxlLCAKKyAgICAgICAgICAgICAgICBwQmFwSENJUmVhZExvY2FsQU1QQXNzb2MtPnBoeV9saW5rX2hhbmRsZSk7CisKKyAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQuY2NfZXZlbnQuUmVhZF9SZWFkX0xvY2FsX0FNUF9Bc3NvYy5zdGF0dXMKKyAgICAgICAgICAgID0gV0xBTkJBUF9FUlJPUl9OT19DTkNUOworICAgIH0gZWxzZQorICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX1JlYWRfTG9jYWxfQU1QX0Fzc29jLnN0YXR1cyAKKyAgICAgICAgICAgID0gV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5SZWFkX1JlYWRfTG9jYWxfQU1QX0Fzc29jLnBoeV9saW5rX2hhbmRsZSAKKyAgICAgICAgPSBwQmFwSENJUmVhZExvY2FsQU1QQXNzb2MtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAvKiBXZSB3aWxsIGZpdCBpbiBvbmUgZnJhZ21lbnQsIHNvIHJlbWFpbmluZyBpcyBleGFjdGx5IGVxdWFsIHRvIGVuY29kZWQgc2l6ZSovIAorICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LlJlYWRfUmVhZF9Mb2NhbF9BTVBfQXNzb2MucmVtYWluaW5nX2xlbmd0aCAKKyAgICAgICAgPSBuQ29uc3VtZWQ7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiBXTEFOX0JBUFJlYWRMb2NhbEFNUEFzc29jICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5fQkFQV3JpdGVSZW1vdGVBTVBBc3NvYygpCisKKyAgREVTQ1JJUFRJT04gCisgICAgSW1wbGVtZW50cyB0aGUgYWN0dWFsIEhDSSBXcml0ZSBSZW1vdGUgQU1QIEFzc29jIGNvbW1hbmQuICBUaGVyZSAKKyAgICBpcyBubyBuZWVkIGZvciBhIGNhbGxiYWNrIGJlY2F1c2Ugd2hlbiB0aGlzIGNhbGwgcmV0dXJucyB0aGUgYWN0aW9uIAorICAgIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiBwb2ludGVyIHRvIHRoZSBCQVAgaGFuZGxlLiAgUmV0dXJuZWQgZnJvbSBXTEFOQkFQX0dldE5ld0huZGwuCisgICAgcEJhcEhDSVdyaXRlUmVtb3RlQU1QQXNzb2M6ICBwb2ludGVyIHRvIHRoZSAiSENJIFdyaXRlIFJlbW90ZSBBTVAgQXNzb2MiIFN0cnVjdHVyZS4KKyAgICAKKyAgICBJTi9PVVQKKyAgICBwQmFwSENJRXZlbnQ6ICBSZXR1cm4gZXZlbnQgdmFsdWUgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAKKyAgICAgICAgICAgICAgICAoVGhlIGNhbGxlciBvZiB0aGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgdXAgdGhlIEhDSSBpbnRlcmZhY2UuKQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcEJhcEhDSVdyaXRlUmVtb3RlQU1QQXNzb2MgaXMgTlVMTCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICAKK1dMQU5fQkFQV3JpdGVSZW1vdGVBTVBBc3NvYworKCAKKyAgcHRCdGFtcEhhbmRsZSBidGFtcEhhbmRsZSwKKyAgdEJ0YW1wVExWSENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kICAgKnBCYXBIQ0lXcml0ZVJlbW90ZUFNUEFzc29jLAorICB0cEJ0YW1wSENJX0V2ZW50IHBCYXBIQ0lFdmVudCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRpbmcgQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMqLworKQoreworICAgIHRXTEFOX0JBUEV2ZW50IGJhcEV2ZW50OyAvKiBTdGF0ZSBtYWNoaW5lIGV2ZW50ICovCisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzOworICAgIHRCdGFtcEhDSV9FdmVudCBiYXBIQ0lFdmVudDsKKworICAgIC8qIEkgYW0gdXNpbmcgYnRhbXBDb250ZXh0LCBpbnN0ZWFkIG9mIHBCYXBQaHlzTGlua01hY2hpbmUgKi8gCisgICAgLy90V0xBTl9CQVBiYXBQaHlzTGlua01hY2hpbmUgKnBCYXBQaHlzTGlua01hY2hpbmU7CisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0ID0gKHB0QnRhbXBDb250ZXh0KSBidGFtcEhhbmRsZTsgLyogYnRhbXBDb250ZXh0IHZhbHVlICovIAorICAgIHZfVThfdCBzdGF0dXM7ICAgIC8qIHJldHVybiB0aGUgQlQtQU1QIHN0YXR1cyBoZXJlICovCisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKHBCYXBIQ0lXcml0ZVJlbW90ZUFNUEFzc29jID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBidGFtcEhhbmRsZSB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcEhhbmRsZSk7IAorCisgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovIAorICAgIGJhcEV2ZW50LmV2ZW50ID0gZVdMQU5fQkFQX0hDSV9XUklURV9SRU1PVEVfQU1QX0FTU09DOworICAgIGJhcEV2ZW50LnBhcmFtcyA9IHBCYXBIQ0lXcml0ZVJlbW90ZUFNUEFzc29jOworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBidGFtcENvbnRleHQgdmFsdWU6ICV4IiwgX19GVU5DVElPTl9fLCAgYnRhbXBDb250ZXh0KTsgCisKKyAgICAvKiBIYW5kbGUgZXZlbnQgKi8gCisgICAgdm9zU3RhdHVzID0gYnRhbXBGc20oYnRhbXBDb250ZXh0LCAmYmFwRXZlbnQsICZzdGF0dXMpOworICAKKyAgICAvKiBGb3JtYXQgdGhlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgdG8gcmV0dXJuLi4uICovIAorICAgIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSAxOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50Lm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gMTsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jb21tYW5kX29wY29kZSAKKyAgICAgICAgPSBCVEFNUF9UTFZfSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0NfQ01EOworICAgIHBCYXBIQ0lFdmVudC0+dS5idGFtcENvbW1hbmRDb21wbGV0ZUV2ZW50LmNjX2V2ZW50LldyaXRlX1JlbW90ZV9BTVBfQXNzb2Muc3RhdHVzIAorICAgICAgICA9IHN0YXR1czsKKyAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kQ29tcGxldGVFdmVudC5jY19ldmVudC5Xcml0ZV9SZW1vdGVfQU1QX0Fzc29jLnBoeV9saW5rX2hhbmRsZSAKKyAgICAgICAgPSBwQmFwSENJV3JpdGVSZW1vdGVBTVBBc3NvYy0+cGh5X2xpbmtfaGFuZGxlOworCisgICAgaWYoV0xBTkJBUF9FUlJPUl9OT19TVUlUQUJMRV9DSEFOTkVMID09IHN0YXR1cykKKyAgICB7CisgICAgICAgIC8qIEZvcm1hdCB0aGUgUGh5c2ljYWwgTGluayBDb21wbGV0ZSBldmVudCB0byByZXR1cm4uLi4gKi8gCisgICAgICAgIGJhcEhDSUV2ZW50LmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfUEhZU0lDQUxfTElOS19DT01QTEVURV9FVkVOVDsKKyAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQucHJlc2VudCA9IDE7CisgICAgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBQaHlzaWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQucGh5X2xpbmtfaGFuZGxlIAorICAgICAgICAgICAgPSBidGFtcENvbnRleHQtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgYmFwSENJRXZlbnQudS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQuY2hfbnVtYmVyIAorICAgICAgICAgICAgPSAwOworICAgIAorICAgICAgICB2b3NTdGF0dXMgPSAoKmJ0YW1wQ29udGV4dC0+cEJhcEhDSUV2ZW50Q0IpIAorICAgICAgICAgICAgKCAgCisgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5wSGRkSGRsLCAgIC8qIHRoaXMgcmVmZXJzIHRoZSBCU0wgcGVyIGFwcGxpY2F0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgICAgICAmYmFwSENJRXZlbnQsIC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgICAgVk9TX1RSVUUgLyogRmxhZyB0byBpbmRpY2F0ZSBhc3NvYy1zcGVjaWZpYyBldmVudCAqLyAKKyAgICAgICAgICAgICk7CisgICAgfQorCisgICAgLyogLi4uICovIAorCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogV0xBTl9CQVBXcml0ZVJlbW90ZUFNUEFzc29jICovCisKKworCisKKworCmRpZmYgLS1naXQgYS9DT1JFL0JBUC9zcmMvYmFwQXBpVGltZXIuYyBiL0NPUkUvQkFQL3NyYy9iYXBBcGlUaW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTUwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYmFwQXBpVGltZXIuYwpAQCAtMCwwICsxLDEwMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgYiBhIHAgQSBwIGkgVCBpIG0gZSByIC4gQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgT1ZFUlZJRVc6CisgIAorICBUaGlzIHNvZnR3YXJlIHVuaXQgaG9sZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0aW1lciByb3V0aW5lcworICByZXF1aXJlZCBieSB0aGUgV0xBTiBCQVAgbW9kdWxlLiAgCisgIAorICBUaGUgZnVuY3Rpb25zIHByb3ZpZGUgYnkgdGhpcyBtb2R1bGUgYXJlIGNhbGxlZCBieSB0aGUgcmVzdCBvZiAKKyAgdGhlIEJULUFNUCBQQUwgbW9kdWxlLgorCisgIERFUEVOREVOQ0lFUzogCisKKyAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuIAorICAKKyAgCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgICRIZWFkZXI6IC9ob21lL2xhYnVzZXIvYnRhbXAtbGFiZWw5L0NPUkUvQkFQL3NyYy9iYXBBcGlUaW1lci5jLHYgMS41IDIwMTAvMDkvMDQgMDA6MTQ6MzcgbGFidXNlciBFeHAgbGFidXNlciAkJERhdGVUaW1lJCRBdXRob3I6IGxhYnVzZXIgJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjAwOC0xMC0yMyAgICBqZXogICAgIENyZWF0ZWQgbW9kdWxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBJIHRoaW5rIHRoaXMgcHVsbHMgaW4gZXZlcnl0aGluZworI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgImJhcEFwaVRpbWVyLmgiCisKKy8vI2RlZmluZSBCQVBfREVCVUcKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdMQU5fQkFQX1RYX1BLVF9NT05JVE9SX1RJTUUgMTAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdsb2JhbCBEYXRhIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRXh0ZXJuYWwgZGVjbGFyYXRpb25zIGZvciBnbG9iYWwgY29udGV4dCAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIDEKKy8vKkJULUFNUCBwYWNrZXQgTExDIE9VSSB2YWx1ZSovCitzdGF0aWMgY29uc3Qgdl9VOF90IFdMQU5CQVBfQlRfQU1QX09VSVtdID0gIHsweDAwLCAweDE5LCAweDU4IH07CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsaXplZCBGdW5jdGlvbiBEZWZpbml0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFV0aWxpdHkgRnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX0luaXRDb25uZWN0aW9uQWNjZXB0VGltZXIKKworICBERVNDUklQVElPTiAKKyAgICBJbml0aWFsaXplIHRoZSBDb25uZWN0aW9uIEFjY2VwdCBUaW1lci4KKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwQnRhbXBDdHg6ICAgcG9pbnRlciB0byB0aGUgQkFQIGNvbnRyb2wgYmxvY2sKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5CQVBfSW5pdENvbm5lY3Rpb25BY2NlcHRUaW1lcgorKCAKKyAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eAorKQoreworICBWT1NfU1RBVFVTICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayBCQVAgY29udHJvbCBibG9jayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgaWYgKCBOVUxMID09IHBCdGFtcEN0eCApIAorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiSW52YWxpZCBCQVAgcG9pbnRlciBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qSW5pdGlhbGl6ZSB0aGUgdGltZXIgKi8KKyAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX2luaXQoIAorICAgICAgICAgICZwQnRhbXBDdHgtPmJhcENvbm5lY3Rpb25BY2NlcHRUaW1lciwKKyAgICAgICAgICBWT1NfVElNRVJfVFlQRV9TVywgLyogdXNlIHRoaXMgdHlwZSAqLworICAgICAgICAgIFdMQU5CQVBfQ29ubmVjdGlvbkFjY2VwdFRpbWVySGFuZGxlciwKKyAgICAgICAgICBwQnRhbXBDdHgpOworICAgCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTkJBUF9Jbml0Q29ubmVjdGlvbkFjY2VwdFRpbWVyICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX0RlaW5pdENvbm5lY3Rpb25BY2NlcHRUaW1lcgorCisgIERFU0NSSVBUSU9OIAorICAgIERlc3Ryb3kgdGhlIENvbm5lY3Rpb24gQWNjZXB0IFRpbWVyLgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBCdGFtcEN0eDogICBwb2ludGVyIHRvIHRoZSBCQVAgY29udHJvbCBibG9jaworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9EZWluaXRDb25uZWN0aW9uQWNjZXB0VGltZXIKKyggCisgIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgKKykKK3sKKyAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgQkFQIGNvbnRyb2wgYmxvY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGlmICggTlVMTCA9PSBwQnRhbXBDdHggKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKkluaXRpYWxpemUgYW5kIHRoZW4gU3RhcnQgdGhlIHRpbWVyICovCisgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9kZXN0cm95ICggCisgICAgICAgICAgJnBCdGFtcEN0eC0+YmFwQ29ubmVjdGlvbkFjY2VwdFRpbWVyICk7CisgICAKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOQkFQX0RlaW5pdENvbm5lY3Rpb25BY2NlcHRUaW1lciAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9TdGFydENvbm5lY3Rpb25BY2NlcHRUaW1lcgorCisgIERFU0NSSVBUSU9OIAorICAgIFN0YXJ0IHRoZSBDb25uZWN0aW9uIEFjY2VwdCBUaW1lci4KKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwQnRhbXBDdHg6ICAgcG9pbnRlciB0byB0aGUgQkFQIGNvbnRyb2wgYmxvY2sKKyAgICBpbnRlcnZhbDogICAgdGltZSBpbnRlcnZhbC4KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5CQVBfU3RhcnRDb25uZWN0aW9uQWNjZXB0VGltZXIKKyggCisgIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgsCisgIHZfVTMyX3QgaW50ZXJ2YWwKKykKK3sKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgQkFQIGNvbnRyb2wgYmxvY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGlmICggTlVMTCA9PSBwQnRhbXBDdHggKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKlN0YXJ0IHRoZSBjb25uZWN0aW9uIGFjY2VwdCB0aW1lciovCisgIHZvc190aW1lcl9zdGFydCggCisgICAgICAgICAgJnBCdGFtcEN0eC0+YmFwQ29ubmVjdGlvbkFjY2VwdFRpbWVyLAorICAgICAgICAgIGludGVydmFsKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5CQVBfU3RhcnRDb25uZWN0aW9uQWNjZXB0VGltZXIgKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9TdG9wQ29ubmVjdGlvbkFjY2VwdFRpbWVyIAorCisgIERFU0NSSVBUSU9OIAorICAgIFN0b3AgdGhlIENvbm5lY3Rpb24gQWNjZXB0IFRpbWVyLgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBCdGFtcEN0eDogICBwb2ludGVyIHRvIHRoZSBCQVAgY29udHJvbCBibG9jaworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9TdG9wQ29ubmVjdGlvbkFjY2VwdFRpbWVyIAorKCAKKyAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eAorKQoreworICBWT1NfU1RBVFVTICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgQkFQIGNvbnRyb2wgYmxvY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGlmICggTlVMTCA9PSBwQnRhbXBDdHggKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKlN0b3AgdGhlIHRpbWVyICovCisgIHZvc1N0YXR1cyA9ICB2b3NfdGltZXJfc3RvcCggCisgICAgICAgICAgICZwQnRhbXBDdHgtPmJhcENvbm5lY3Rpb25BY2NlcHRUaW1lcik7CisgCisgICAKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOQkFQX1N0b3BDb25uZWN0aW9uQWNjZXB0VGltZXIgKi8gCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9Db25uZWN0aW9uQWNjZXB0VGltZXJIYW5kbGVyCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHZvcyB0aW1lciBmb3IgdGhlIENvbm5lY3Rpb24KKyAgICBBY2NlcHQgdGltZXIgCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgdXNlckRhdGE6ICAgICAgcG9pbnRlciBjYW4gYmUgdXNlZCB0byByZXRyaXZlIHRoZSBCVC1BTVAgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBOb25lCisgICAgICAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9WT0lEX3QgCitXTEFOQkFQX0Nvbm5lY3Rpb25BY2NlcHRUaW1lckhhbmRsZXIKKyggCisgIHZfUFZPSURfdCB1c2VyRGF0YSAKKykKK3sKKyAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCA9IChwdEJ0YW1wQ29udGV4dCl1c2VyRGF0YTsKKyAgdFdMQU5fQkFQRXZlbnQgYmFwRXZlbnQ7IC8qIFN0YXRlIG1hY2hpbmUgZXZlbnQgKi8KKyAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICB2X1U4X3Qgc3RhdHVzOyAgICAvKiByZXR1cm4gdGhlIEJULUFNUCBzdGF0dXMgaGVyZSAqLworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcEJ0YW1wQ3R4ICkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gQkFQOiBGYXRhbCBlcnJvciBpbiAlcyIsIF9fRlVOQ1RJT05fXyApOworICAgICBWT1NfQVNTRVJUKDApOworICAgICByZXR1cm47IAorICB9CisKKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZlZWQgdGhpcyB0aW1lb3V0IHRvIHRoZSBCVEFNUCBGU00gCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8gCisgIGJhcEV2ZW50LmV2ZW50ID0gZVdMQU5fQkFQX1RJTUVSX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQ7CisgIGJhcEV2ZW50LnBhcmFtcyA9IE5VTEw7CisKKyAgLyogSGFuZGxlIGV2ZW50ICovIAorICB2b3NTdGF0dXMgPSBidGFtcEZzbShwQnRhbXBDdHgsICZiYXBFdmVudCwgJnN0YXR1cyk7CisKKyAgLyogTm93IHRyYW5zaXRpb24gdG8gZnVsbHkgZGlzY29ubmVjdGVkIGFuZCBub3RpZnkgcGh5IGxpbmsgZGlzY29ubmVjdCovIAorICBiYXBFdmVudC5ldmVudCA9ICBlV0xBTl9CQVBfTUFDX1JFQURZX0ZPUl9DT05ORUNUSU9OUzsKKyAgYmFwRXZlbnQucGFyYW1zID0gTlVMTDsKKworICAvKiBIYW5kbGUgZXZlbnQgKi8gCisgIHZvc1N0YXR1cyA9IGJ0YW1wRnNtKHBCdGFtcEN0eCwgJmJhcEV2ZW50LCAmc3RhdHVzKTsKKworCit9LypXTEFOQkFQX0Nvbm5lY3Rpb25BY2NlcHRUaW1lckhhbmRsZXIqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9Jbml0TGlua1N1cGVydmlzaW9uVGltZXIKKworICBERVNDUklQVElPTiAKKyAgICBJbml0aWFsaXplIHRoZSBMaW5rIFN1cGVydmlzaW9uIFRpbWVyLgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBCdGFtcEN0eDogICBwb2ludGVyIHRvIHRoZSBCQVAgY29udHJvbCBibG9jaworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9Jbml0TGlua1N1cGVydmlzaW9uVGltZXIKKyggCisgIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgKKykKK3sKKyAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgQkFQIGNvbnRyb2wgYmxvY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGlmICggTlVMTCA9PSBwQnRhbXBDdHggKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKkluaXRpYWxpemUgdGhlIHRpbWVyICovCisgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9pbml0KCAKKyAgICAgICAgICAmcEJ0YW1wQ3R4LT5iYXBMaW5rU3VwZXJ2aXNpb25UaW1lciwKKyAgICAgICAgICBWT1NfVElNRVJfVFlQRV9TVywgLyogdXNlIHRoaXMgdHlwZSAqLworICAgICAgICAgIFdMQU5CQVBfTGlua1N1cGVydmlzaW9uVGltZXJIYW5kbGVyLAorICAgICAgICAgIHBCdGFtcEN0eCk7CisgICAKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOQkFQX0luaXRMaW5rU3VwZXJ2aXNpb25UaW1lciAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9EZWluaXRMaW5rU3VwZXJ2aXNpb25UaW1lcgorCisgIERFU0NSSVBUSU9OIAorICAgIERlc3Ryb3kgdGhlIExpbmsgU3VwZXJ2aXNpb24gVGltZXIuCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcEJ0YW1wQ3R4OiAgIHBvaW50ZXIgdG8gdGhlIEJBUCBjb250cm9sIGJsb2NrCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX0RlaW5pdExpbmtTdXBlcnZpc2lvblRpbWVyCisoIAorICBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4CispCit7CisgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIEJBUCBjb250cm9sIGJsb2NrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICBpZiAoIE5VTEwgPT0gcEJ0YW1wQ3R4ICkgCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJBUCBwb2ludGVyIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLypJbml0aWFsaXplIGFuZCB0aGVuIFN0YXJ0IHRoZSB0aW1lciAqLworICB2b3NTdGF0dXMgPSB2b3NfdGltZXJfZGVzdHJveSAoIAorICAgICAgICAgICZwQnRhbXBDdHgtPmJhcExpbmtTdXBlcnZpc2lvblRpbWVyICk7CisgICAKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOQkFQX0RlaW5pdExpbmtTdXBlcnZpc2lvblRpbWVyICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1N0YXJ0TGlua1N1cGVydmlzaW9uVGltZXIKKworICBERVNDUklQVElPTiAKKyAgICBTdGFydCB0aGUgTGlua1N1cGVydmlzaW9uVGltZXIgVGltZXIuCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcEJ0YW1wQ3R4OiAgIHBvaW50ZXIgdG8gdGhlIEJBUCBjb250cm9sIGJsb2NrCisgICAgaW50ZXJ2YWw6ICAgIHRpbWUgaW50ZXJ2YWwuCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX1N0YXJ0TGlua1N1cGVydmlzaW9uVGltZXIKKyggCisgIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgsCisgIHZfVTMyX3QgaW50ZXJ2YWwKKykKK3sKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgQkFQIGNvbnRyb2wgYmxvY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGlmICggTlVMTCA9PSBwQnRhbXBDdHggKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICB2b3NfdGltZXJfc3RhcnQoIAorICAgICAgICAgICZwQnRhbXBDdHgtPmJhcExpbmtTdXBlcnZpc2lvblRpbWVyLAorICAgICAgICAgIGludGVydmFsKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5CQVBfU3RhcnRMaW5rU3VwZXJ2aXNpb25UaW1lciAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9TdG9wTGlua1N1cGVydmlzaW9uVGltZXIgCisKKyAgREVTQ1JJUFRJT04gCisgICAgU3RvcCB0aGUgTGlua1N1cGVydmlzaW9uIFRpbWVyLgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBCdGFtcEN0eDogICBwb2ludGVyIHRvIHRoZSBCQVAgY29udHJvbCBibG9jaworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9TdG9wTGlua1N1cGVydmlzaW9uVGltZXIgCisoIAorICBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4CispCit7CisgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayBCQVAgY29udHJvbCBibG9jayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgaWYgKCBOVUxMID09IHBCdGFtcEN0eCApIAorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiSW52YWxpZCBCQVAgcG9pbnRlciBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qU3RvcCB0aGUgdGltZXIgKi8KKyAgdm9zU3RhdHVzID0gIHZvc190aW1lcl9zdG9wKCAKKyAgICAgICAgICAgJnBCdGFtcEN0eC0+YmFwTGlua1N1cGVydmlzaW9uVGltZXIpOworIAorICAgCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTkJBUF9TdG9wTGlua1N1cGVydmlzaW9uVGltZXIgKi8gCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfTGlua1N1cGVydmlzaW9uVGltZXJIYW5kbGVyCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHZvcyB0aW1lciBmb3IgdGhlIExpbmtTdXBlcnZpc2lvbiB0aW1lciAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB1c2VyRGF0YTogICAgICBwb2ludGVyIGNhbiBiZSB1c2VkIHRvIHJldHJpdmUgdGhlIEJULUFNUCBjb250ZXh0IAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIE5vbmUKKyAgICAgICAgIAorICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1ZPSURfdCAKK1dMQU5CQVBfTGlua1N1cGVydmlzaW9uVGltZXJIYW5kbGVyCisoIAorICB2X1BWT0lEX3QgdXNlckRhdGEgCispCit7CisgICAgcHRCdGFtcENvbnRleHQgICAgICAgICAgIHBCdGFtcEN0eCA9ICAgICAgKHB0QnRhbXBDb250ZXh0KXVzZXJEYXRhOworICAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBwdEJ0YW1wSGFuZGxlICAgICAgICAgICAgYnRhbXBIYW5kbGUgPSAgICAocHRCdGFtcEhhbmRsZSl1c2VyRGF0YTsKKyAgICB0V0xBTl9CQVBFdmVudCAgICAgICAgICAgYmFwRXZlbnQ7IC8qIFN0YXRlIG1hY2hpbmUgZXZlbnQgKi8KKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgcGh5X2xpbmtfaGFuZGxlOworCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBOVUxMID09IHBCdGFtcEN0eCApCisgICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiV0xBTiBCQVA6IEZhdGFsIGVycm9yIGluICVzIiwgX19GVU5DVElPTl9fICk7CisgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICByZXR1cm47IAorICAgIH0KKworICAgIHBoeV9saW5rX2hhbmRsZSA9IHBCdGFtcEN0eC0+cGh5X2xpbmtfaGFuZGxlOworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gQkFQOkluIExpbmtTdXBlcnZpc2lvbiBUaW1lciBoYW5kbGVyICVzIiwgX19GVU5DVElPTl9fICk7CisKKyAgICBpZihwQnRhbXBDdHgtPmRhdGFQa3RQZW5kaW5nID09IFZPU19UUlVFKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiJXM6IERhdGEgc2Vlbi4gRG8gbm90aGluZyIsIF9fRlVOQ1RJT05fXyApOworCisgICAgICAgIHBCdGFtcEN0eC0+ZGF0YVBrdFBlbmRpbmcgPSBWT1NfRkFMU0U7CisgICAgICAgIHBCdGFtcEN0eC0+bHNSZXFQa3RQZW5kaW5nID0gVk9TX0ZBTFNFOworICAgICAgICBwQnRhbXBDdHgtPnJldHJpZXMgPSAwOworICAgICAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX1N0b3BMaW5rU3VwZXJ2aXNpb25UaW1lcihwQnRhbXBDdHgpOworICAgICAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX1N0YXJ0TGlua1N1cGVydmlzaW9uVGltZXIgKHBCdGFtcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgcEJ0YW1wQ3R4LT5iYXBMaW5rU3VwZXJ2aXNpb25UaW1lckludGVydmFsICogV0xBTkJBUF9CUkVEUl9CQVNFQkFORF9TTE9UX1RJTUUpOworCisgICAgICAgIC8vRGF0YSBpcyBzZWVuLiBvciBvdXIgcHJldmlvdXMgcGFja2V0IGlzIG5vdCB5ZXQgZmV0Y2hlZCBieSBUTC5Eb24ndCBkbyBhbnkgdGhpbmcuSnVzdCByZXR1cm47CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSBpZigocEJ0YW1wQ3R4LT5sc1JlcVBrdFBlbmRpbmcgPT0gVk9TX1RSVUUgKSAKKyAgICAgICAgICAgICYmIChwQnRhbXBDdHgtPnJldHJpZXMgPT0gV0xBTkJBUF9MSU5LX1NVUEVSVklTSU9OX1JFVFJJRVMpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiIyMjIyMjIyMjV0xBTiBCQVA6IExpbmtTdXBlcnZpc2lvbiBUaW1lZCBPVVQjIyMjIyMjIyAlcyIsIF9fRlVOQ1RJT05fXyApOworCisgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmVlZCB0aGlzIHRpbWVvdXQgdG8gdGhlIEJUQU1QIEZTTSAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLyAKKyAgICAgICAgLyogSkVaMTEwMzA3OiBXaGljaCBzaG91bGQgdGhpcyBiZT8gKi8gCisgICAgICAgIC8vYmFwRXZlbnQuZXZlbnQgPWVXTEFOX0JBUF9IQ0lfUEhZU0lDQUxfTElOS19ESVNDT05ORUNUOworICAgICAgICBiYXBFdmVudC5ldmVudCA9ZVdMQU5fQkFQX01BQ19JTkRJQ0FURVNfTUVESUFfRElTQ09OTkVDVElPTjsKKyAgICAgICAgYmFwRXZlbnQucGFyYW1zID0gTlVMTDsKKworICAgICAgICAvKiBIYW5kbGUgZXZlbnQgKi8gCisgICAgICAgIHZvc1N0YXR1cyA9IGJ0YW1wRnNtKHBCdGFtcEN0eCwgJmJhcEV2ZW50LCAodl9VOF90ICopJnZvc1N0YXR1cyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgIAorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICIlczogUmVzZW5kIHRoZSBMUyBwYWNrZXQiLCBfX0ZVTkNUSU9OX18gKTsKKworICAgICAgICAvKiBJZiB3ZSBoYXZlIHRyYW5zbWl0IHBrdCBwZW5kaW5nIGFuZCB0aGUgdGltZSBvdXQgb2NjdXJyZWQscmVzZW5kIHRoZSBscyBwYWNrZXQgKi8KKyAgICAgICAgV0xBTkJBUF9TdG9wTGlua1N1cGVydmlzaW9uVGltZXIocEJ0YW1wQ3R4KTsKKyAgICAgICAgcEJ0YW1wQ3R4LT5wUGFja2V0ID0gcEJ0YW1wQ3R4LT5sc1JlcVBhY2tldDsKKyAgICAgICAgdm9zU3RhdHVzID0gV0xBTkJBUF9UeExpbmtTdXBlcnZpc2lvbiggYnRhbXBIYW5kbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfbGlua19oYW5kbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnRhbXBDdHgtPnBQYWNrZXQgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQlRfQU1QX1RZUEVfTFNfUkVRKTsKKyAgICB9CisgICAgCit9LypXTEFOQkFQX0xpbmtTdXBlcnZpc2lvblRpbWVySGFuZGxlciovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1N0YXJ0VHhQYWNrZXRNb25pdG9yVGltZXIKKworICBERVNDUklQVElPTiAKKyAgICBTdGFydCB0aGUgVHggUGFja2V0IE1vbml0b3IgVGltZXIuCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcEJ0YW1wQ3R4OiAgIHBvaW50ZXIgdG8gdGhlIEJBUCBjb250cm9sIGJsb2NrCisgICAgaW50ZXJ2YWw6ICAgIHRpbWUgaW50ZXJ2YWwuCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX1N0YXJ0VHhQYWNrZXRNb25pdG9yVGltZXIKKyggCisgIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgKKykKK3sKKyAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICB2X1UzMl90ICAgICB1SW50ZXJ2YWwgPSBXTEFOX0JBUF9UWF9QS1RfTU9OSVRPUl9USU1FOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayBCQVAgY29udHJvbCBibG9jayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggTlVMTCA9PSBwQnRhbXBDdHggKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKlN0YXJ0IHRoZSB0aW1lciAqLworICB2b3NTdGF0dXMgPSB2b3NfdGltZXJfc3RhcnQoICZwQnRhbXBDdHgtPmJhcFR4UGt0TW9uaXRvclRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ZXJ2YWwpOworCisgIHJldHVybiB2b3NTdGF0dXM7Cit9LyogV0xBTkJBUF9TdGFydFR4UGFja2V0TW9uaXRvclRpbWVyICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfU3RvcFR4UGFja2V0TW9uaXRvclRpbWVyIAorCisgIERFU0NSSVBUSU9OIAorICAgIFN0b3AgdGhlIFR4IFBhY2tldCBNb25pdG9yIFRpbWVyLgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBCdGFtcEN0eDogICBwb2ludGVyIHRvIHRoZSBCQVAgY29udHJvbCBibG9jaworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9TdG9wVHhQYWNrZXRNb25pdG9yVGltZXIgCisoIAorICBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4CispCit7CisgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayBCQVAgY29udHJvbCBibG9jayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggTlVMTCA9PSBwQnRhbXBDdHggKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKlN0b3AgdGhlIHRpbWVyICovCisgIHZvc1N0YXR1cyA9ICB2b3NfdGltZXJfc3RvcCggJnBCdGFtcEN0eC0+YmFwVHhQa3RNb25pdG9yVGltZXIpOworIAorICAgCisgIHJldHVybiB2b3NTdGF0dXM7Cit9LyogV0xBTkJBUF9TdG9wVHhQYWNrZXRNb25pdG9yVGltZXIgKi8gCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfU2VuZENvbXBsZXRlZFBrdHNFdmVudAorCisgIERFU0NSSVBUSU9OIAorICAgIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHNlbmRpbmcgdGhlIE5VTV9PRl9DT01QTEVURURfUEtUU19FVkVOVCB0byBIQ0kgCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcEJ0YW1wQ3R4OiAgIHBvaW50ZXIgdG8gdGhlIEJBUCBjb250cm9sIGJsb2NrIAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIE5vbmUKKyAgICAgICAgIAorICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1ZPSURfdCAKK1dMQU5CQVBfU2VuZENvbXBsZXRlZFBrdHNFdmVudAorKCAKKyAgcHRCdGFtcENvbnRleHQgICAgIHBCdGFtcEN0eCAKKykKK3sKKyAgdl9VOF90ICAgICAgICAgICAgIGksIGo7CisgIHRCdGFtcEhDSV9FdmVudCAgICBiYXBIQ0lFdmVudDsgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgdl9VMzJfdCAgICAgICAgICAgIHVUeENvbXBsZXRlZCAgICA9IDA7IAorICB0cEJ0YW1wTG9nTGlua0N0eCAgcExvZ0xpbmtDb250ZXh0ID0gTlVMTDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisgICAgLyogRm9ybWF0IHRoZSBOdW1iZXIgb2YgY29tcGxldGVkIHBhY2tldHMgZXZlbnQgKi8gCisgIGJhcEhDSUV2ZW50LmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfTlVNX09GX0NPTVBMRVRFRF9QS1RTX0VWRU5UOworICBiYXBIQ0lFdmVudC51LmJ0YW1wTnVtT2ZDb21wbGV0ZWRQa3RzRXZlbnQubnVtX2hhbmRsZXMgPSAwOworCisgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiBMTCBzdGlsbCBleGlzdHMsIGlmIFRSVUUgZ2VuZXJhdGUgbnVtX3BrdF9ldmVudCBhbmQKKyAgICByZXN0YXJ0IHRoZSB0aW1lciAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgV0xBTkJBUF9NQVhfTE9HX0xJTktTIDsgaSsrKSAKKyAgeworICAgICBwTG9nTGlua0NvbnRleHQgPSAmcEJ0YW1wQ3R4LT5idGFtcExvZ0xpbmtDdHhbaV07CisgICAgIGlmICggcExvZ0xpbmtDb250ZXh0LT5wcmVzZW50ICkgCisgICAgIHsKKyAgICAgICB1VHhDb21wbGV0ZWQgPSBwTG9nTGlua0NvbnRleHQtPnVUeFBrdENvbXBsZXRlZDsKKyAgICAgICBiYXBIQ0lFdmVudC51LmJ0YW1wTnVtT2ZDb21wbGV0ZWRQa3RzRXZlbnQuY29ubl9oYW5kbGVzW2pdID0KKyAgICAgICAgICAgcExvZ0xpbmtDb250ZXh0LT5sb2dfbGlua19oYW5kbGU7CisgICAgICAgYmFwSENJRXZlbnQudS5idGFtcE51bU9mQ29tcGxldGVkUGt0c0V2ZW50Lm51bV9jb21wbGV0ZWRfcGt0c1tqXSA9CisgICAgICAgICAgIHVUeENvbXBsZXRlZDsKKworICAgICAgIGorKzsKKworICAgICAgIHZvc19hdG9taWNfZGVjcmVtZW50X1UzMl9ieV92YWx1ZSgodl9VMzJfdCAqKSAmcExvZ0xpbmtDb250ZXh0LT51VHhQa3RDb21wbGV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1UzMl90KSB1VHhDb21wbGV0ZWQpOworCisgICAgICAgaWYgKHVUeENvbXBsZXRlZCkgeyAKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgIndsYW4gYmFwOiAlcyBMb2cgTGluayBoYW5kbGUgLSAlZCBObyBPZiBQa3RzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIAorICAgICAgICAgICAgICAgICAgcExvZ0xpbmtDb250ZXh0LT5sb2dfbGlua19oYW5kbGUsIHVUeENvbXBsZXRlZCk7ICAKKyAgICAgICB9CisgICAgIH0KKyAgfQorCisgIC8qIEluZGljYXRlIG9ubHkgaWYgYXQgbGVhc3Qgb25lIGxvZ2ljYWwgbGluayBpcyBwcmVzZW50IGFuZCBudW1iZXIgb2YKKyAgICAgY29tcGxldGVkIHBhY2tldHMgaXMgbm9uIHplcm8gKi8KKyAgaWYgKGogJiYgdVR4Q29tcGxldGVkKQorICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gQkFQOiBJbmRpY2F0aW5nIE51bSBDb21wbGV0ZWQgcGFja2V0cyBFdmVudCIpOworCisgICAgICAvKmlzc3VlIG51bV9wa3RfZXZlbnQgZm9yIHVUeENvbXBsZXRlZCovCisgICAgICBiYXBIQ0lFdmVudC51LmJ0YW1wTnVtT2ZDb21wbGV0ZWRQa3RzRXZlbnQubnVtX2hhbmRsZXMgPSBqOworICAgICAgKCpwQnRhbXBDdHgtPnBCYXBIQ0lFdmVudENCKQorICAgICAgKAorICAgICAgICAgICBwQnRhbXBDdHgtPnBIZGRIZGwsICAgLyogdGhpcyByZWZlcnMgdGhlIEJTTCBwZXIgYXBwbGljYXRpb24gY29udGV4dCAqLworICAgICAgICAgICAmYmFwSENJRXZlbnQsIC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICAgIFZPU19UUlVFIC8qIEZsYWcgdG8gaW5kaWNhdGUgYXNzb2Mtc3BlY2lmaWMgZXZlbnQgKi8gCisgICAgICApOworICB9CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfU2VuZENvbXBsZXRlZERhdGFCbGtzRXZlbnQKKworICBERVNDUklQVElPTiAKKyAgICBVdGlsaXR5IGZ1bmN0aW9uIGZvciBzZW5kaW5nIHRoZSBOVU1fT0ZfQ09NUExFVEVEX0RBVEFfQkxPQ0tTX0VWRU5UIHRvIEhDSSAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwQnRhbXBDdHg6ICAgcG9pbnRlciB0byB0aGUgQkFQIGNvbnRyb2wgYmxvY2sgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgTm9uZQorICAgICAgICAgCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfVk9JRF90IAorV0xBTkJBUF9TZW5kQ29tcGxldGVkRGF0YUJsa3NFdmVudAorKCAKKyAgcHRCdGFtcENvbnRleHQgICAgIHBCdGFtcEN0eCAKKykKK3sKKyAgdl9VOF90ICAgICAgICAgICAgIGksIGo7CisgIHRCdGFtcEhDSV9FdmVudCAgICBiYXBIQ0lFdmVudDsgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgdl9VMzJfdCAgICAgICAgICAgIHVUeENvbXBsZXRlZCAgICA9IDA7IAorICB0cEJ0YW1wTG9nTGlua0N0eCAgcExvZ0xpbmtDb250ZXh0ID0gTlVMTDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisgICAgLyogRm9ybWF0IHRoZSBOdW1iZXIgb2YgY29tcGxldGVkIGRhdGEgYmxvY2tzIGV2ZW50ICovIAorICBiYXBIQ0lFdmVudC5iYXBIQ0lFdmVudENvZGUgPSBCVEFNUF9UTFZfSENJX05VTV9PRl9DT01QTEVURURfREFUQV9CTE9DS1NfRVZFTlQ7CisgIGJhcEhDSUV2ZW50LnUuYnRhbXBOdW1PZkNvbXBsZXRlZERhdGFCbG9ja3NFdmVudC5udW1faGFuZGxlcyA9IDA7CisKKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIGlmIExMIHN0aWxsIGV4aXN0cywgaWYgVFJVRSBnZW5lcmF0ZSBudW1fZGF0YV9ibG9ja3NfZXZlbnQgYW5kCisgICAgcmVzdGFydCB0aGUgdGltZXIgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IFdMQU5CQVBfTUFYX0xPR19MSU5LUyA7IGkrKykgCisgIHsKKyAgICAgcExvZ0xpbmtDb250ZXh0ID0gJnBCdGFtcEN0eC0+YnRhbXBMb2dMaW5rQ3R4W2ldOworICAgICBpZiAoIHBMb2dMaW5rQ29udGV4dC0+cHJlc2VudCApIAorICAgICB7CisgICAgICAgdVR4Q29tcGxldGVkID0gcExvZ0xpbmtDb250ZXh0LT51VHhQa3RDb21wbGV0ZWQ7CisgICAgICAgYmFwSENJRXZlbnQudS5idGFtcE51bU9mQ29tcGxldGVkRGF0YUJsb2Nrc0V2ZW50LmNvbm5faGFuZGxlc1tqXSA9CisgICAgICAgICAgIHBMb2dMaW5rQ29udGV4dC0+bG9nX2xpbmtfaGFuZGxlOworICAgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBOdW1PZkNvbXBsZXRlZERhdGFCbG9ja3NFdmVudC5udW1fY29tcGxldGVkX3BrdHNbal0gPQorICAgICAgICAgICB1VHhDb21wbGV0ZWQ7CisgICAgICAgYmFwSENJRXZlbnQudS5idGFtcE51bU9mQ29tcGxldGVkRGF0YUJsb2Nrc0V2ZW50Lm51bV9jb21wbGV0ZWRfYmxvY2tzW2pdID0KKyAgICAgICAgICAgdVR4Q29tcGxldGVkOworICAgICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBOdW1PZkNvbXBsZXRlZERhdGFCbG9ja3NFdmVudC50b3RhbF9udW1fZGF0YV9ibG9ja3MgPSAxNjsKKworICAgICAgIGorKzsKKworICAgICAgIHZvc19hdG9taWNfZGVjcmVtZW50X1UzMl9ieV92YWx1ZSgodl9VMzJfdCAqKSAmcExvZ0xpbmtDb250ZXh0LT51VHhQa3RDb21wbGV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1UzMl90KSB1VHhDb21wbGV0ZWQpOworCisgICAgICAgaWYgKHVUeENvbXBsZXRlZCkgeyAKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgIndsYW4gYmFwOiAlcyBMb2cgTGluayBoYW5kbGUgLSAlZCBObyBPZiBQa3RzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIAorICAgICAgICAgICAgICAgICAgcExvZ0xpbmtDb250ZXh0LT5sb2dfbGlua19oYW5kbGUsIHVUeENvbXBsZXRlZCk7ICAKKyAgICAgICB9CisgICAgIH0KKyAgfQorCisgIC8qIEluZGljYXRlIG9ubHkgaWYgYXQgbGVhc3Qgb25lIGxvZ2ljYWwgbGluayBpcyBwcmVzZW50IGFuZCBudW1iZXIgb2YKKyAgICAgY29tcGxldGVkIGRhdGEgYmxvY2tzIGlzIG5vbiB6ZXJvICovCisgIGlmIChqICYmIHVUeENvbXBsZXRlZCkKKyAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXTEFOIEJBUDogSW5kaWNhdGluZyBOdW0gQ29tcGxldGVkIERhdGEgQmxvY2tzIEV2ZW50Iik7CisKKyAgICAgIC8qaXNzdWUgbnVtX2RhdGFfYmxvY2tzX2V2ZW50IGZvciB1VHhDb21wbGV0ZWQqLworICAgICAgYmFwSENJRXZlbnQudS5idGFtcE51bU9mQ29tcGxldGVkRGF0YUJsb2Nrc0V2ZW50Lm51bV9oYW5kbGVzID0gajsKKyAgICAgICgqcEJ0YW1wQ3R4LT5wQmFwSENJRXZlbnRDQikKKyAgICAgICgKKyAgICAgICAgICAgcEJ0YW1wQ3R4LT5wSGRkSGRsLCAgIC8qIHRoaXMgcmVmZXJzIHRoZSBCU0wgcGVyIGFwcGxpY2F0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgICAgJmJhcEhDSUV2ZW50LCAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgICAgICAgICBWT1NfVFJVRSAvKiBGbGFnIHRvIGluZGljYXRlIGFzc29jLXNwZWNpZmljIGV2ZW50ICovIAorICAgICAgKTsKKyAgfQorCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1R4UGFja2V0TW9uaXRvckhhbmRsZXIKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggdm9zIHRpbWVyIGZvciB0aGUgVHggUGFja2V0IE1vbml0b3IgCisgICAgVGltZXIuCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgdXNlckRhdGE6ICAgICAgcG9pbnRlciBjYW4gYmUgdXNlZCB0byByZXRyaXZlIHRoZSBCVC1BTVAgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBOb25lCisgICAgICAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9WT0lEX3QgCitXTEFOQkFQX1R4UGFja2V0TW9uaXRvckhhbmRsZXIKKyggCisgIHZfUFZPSURfdCB1c2VyRGF0YSAKKykKK3sKKyAgcHRCdGFtcENvbnRleHQgICAgIHBCdGFtcEN0eCAgICAgICA9IChwdEJ0YW1wQ29udGV4dCl1c2VyRGF0YTsKKyAgQlRBTVBGU01fSU5TVEFOQ0VEQVRBX1QgKmluc3RhbmNlVmFyID0gJnBCdGFtcEN0eC0+YmFwUGh5c0xpbmtNYWNoaW5lOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcEJ0YW1wQ3R4ICkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gQkFQOiBGYXRhbCBlcnJvciBpbiAlcyIsIF9fRlVOQ1RJT05fXyApOworICAgICBWT1NfQVNTRVJUKDApOworICAgICByZXR1cm47IAorICB9CisKKyNpZiAwIC8vQkFQX0RFQlVHCisgIC8qIFRyYWNlIHRoZSB0QnRhbXBDdHggYmVpbmcgcGFzc2VkIGluLiAqLworICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIldMQU4gQkFQIENvbnRleHQgTW9uaXRvcjogcEJ0YW1wQ3R4IHZhbHVlID0gJXggaW4gJXM6JWQiLCBwQnRhbXBDdHgsIF9fRlVOQ1RJT05fXywgX19MSU5FX18gKTsKKyNlbmRpZiAvL0JBUF9ERUJVRworCisgIGlmKFdMQU5CQVBfRkxPV19DT05UUk9MX01PREVfQkxPQ0tfQkFTRUQgPT0gcEJ0YW1wQ3R4LT51Y0RhdGFUcmFmZmljTW9kZSkKKyAgICAgeworICAgIFdMQU5CQVBfU2VuZENvbXBsZXRlZERhdGFCbGtzRXZlbnQocEJ0YW1wQ3R4KTsKKyAgICAgICB9CisgIGVsc2UKKyAgeworICAgIFdMQU5CQVBfU2VuZENvbXBsZXRlZFBrdHNFdmVudChwQnRhbXBDdHgpOworICB9CisKKyAgLyogUmVzdGFydCB0aGUgUGFja2V0IG1vbml0b3JpbmcgdGltZXIgaWYgc3RpbGwgUGh5c2ljYWwgbGluaworICAgKiBpcyBwcmVzZW50LiAKKyAgICogSXQgaXMgcG9zc2libGUgdGhhdCB3aGVuIHRoZSBwaHlzaWNhbCBsaW5rIGlzIHRlYXIgZG93biwgCisgICAqIHRpbWVyIHN0YXJ0IHJlcXVlc3QgaXMgaW4gUSBhbmQgY291bGQgc3RhcnQgYWdhaW4uIAorICAgKi8KKyAgaWYgKENPTk5FQ1RFRCA9PSBpbnN0YW5jZVZhci0+c3RhdGVWYXIpCisgIHsKKyAgICBXTEFOQkFQX1N0YXJ0VHhQYWNrZXRNb25pdG9yVGltZXIocEJ0YW1wQ3R4KTsKKyAgfQorfS8qV0xBTkJBUF9UeFBhY2tldE1vbml0b3JIYW5kbGVyKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcEFwaVRpbWVyLmggYi9DT1JFL0JBUC9zcmMvYmFwQXBpVGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDg2ZGFiCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcEFwaVRpbWVyLmgKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFdMQU5fUUNUX1dMQU5CQVBfQVBJX1RJTUVSX0gKKyNkZWZpbmUgV0xBTl9RQ1RfV0xBTkJBUF9BUElfVElNRVJfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICBXIEwgQSBOICAgQiBUIC0gQSBNIFAgIFAgQSBMICAgTCBBIFkgRSBSIAorICAgICAgICAgICAgICAgICAgICBUIEkgTSBFIFIgIFMgRSBSIFYgSSBDIEUgUyAgQSBQIEkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAKK0RFU0NSSVBUSU9OCisgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgdGltZXIgQVBJcyB1c2VkIGJ5IHRoZSB3bGFuIEJULUFNUCBQQUwgbGF5ZXIgCisgIG1vZHVsZS4KKyAgCisgICAgICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6IC9jeWdkcml2ZS9lL0J1aWxkcy9NNzIwMUpTRENBQVBBRDUyMjQwQi9XTS9wbGF0Zm9ybS9tc203MjAwL1NyYy9Ecml2ZXJzL1NEL0NsaWVudERyaXZlcnMvV0xBTi9RQ1QvQ09SRS9CQVAvc3JjL2JhcEFwaVRpbWVyLmgsdiAxLjEgMjAwOC8xMS8yMSAyMDozMDoyMCBqem11ZGEgRXhwIGp6bXVkYSAkICREYXRlVGltZTogJCAkQXV0aG9yOiBqem11ZGEgJAorCisKK3doZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTAvMjMvMDggICAgamV6ICAgICBDcmVhdGVkIG1vZHVsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUyBGT1IgTU9EVUxFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBQaWNrIHVwIGFsbCB0aGUgQlQtQU1QIGludGVybmFsIGRlZmluaXRpb25zIAorLy8gQW5kIHVuZGVybHlpbmcgc3VwcG9ydGluZyB0eXBlcy4gKEluY2x1ZGluZyBWT1NTLCBDU1IsIGFuZC4uLikKKyNpbmNsdWRlICJiYXBJbnRlcm5hbC5oIiAKKworLyogUGljayB1cCB0aGUgU0lSSVVTIGFuZCBIQUwgdHlwZXMgKi8gCisvLyBBbHJlYWR5IHRha2VuIGNhcmUgb2YsIGFib3ZlIAorLy8jaW5jbHVkZSAic2lyQXBpLmgiCisvLyNpbmNsdWRlICJoYWxUeXBlcy5oIgorCisvKiBQaWNrIHVwIHRoZSBDQ00gQVBJIGRlZiduICovIAorI2luY2x1ZGUgImNjbUFwaS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyAjZW5kaWYgCisgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIERlZmluZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gVGVtcG9yYXJ5IAorLy8jZGVmaW5lIEJBUF9ERUJVRworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFR5cGVkZWZzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBFeHRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIGdsb2JhbCBjb250ZXh0IAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRnVuY3Rpb24gcHJvdG90eXBlcyAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBVdGlsaXR5IEZ1bmN0aW9uIHByb3RvdHlwZXMgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIDAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1N0YXJ0Q29ubmVjdGlvbkFjY2VwdFRpbWVyCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2xlYXIgb3V0IGFsbCBmaWVsZHMgaW4gdGhlIEJBUCBjb250ZXh0LgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBCdGFtcEN0eDogICBwb2ludGVyIHRvIHRoZSBCQVAgY29udHJvbCBibG9jaworICAgIGludGVydmFsOiAgICB0aW1lIGludGVydmFsLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9TdGFydENvbm5lY3Rpb25BY2NlcHRUaW1lcgorKCAKKyAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCwKKyAgdl9VMzJfdCBpbnRlcnZhbAorKTsKKyNlbmRpZiAvLyAwCisKKy8qIENvbm5lY3Rpb24gQWNjZXB0IHRpbWVyKi8KK1ZPU19TVEFUVVMgV0xBTkJBUF9Jbml0Q29ubmVjdGlvbkFjY2VwdFRpbWVyIAorICAgICggcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCk7CisKK1ZPU19TVEFUVVMgV0xBTkJBUF9EZWluaXRDb25uZWN0aW9uQWNjZXB0VGltZXIKKyAgICAoIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgpOworCitWT1NfU1RBVFVTIFdMQU5CQVBfU3RhcnRDb25uZWN0aW9uQWNjZXB0VGltZXIgCisgICAgKHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgsIHZfVTMyX3QgaW50ZXJ2YWwpOworCitWT1NfU1RBVFVTIFdMQU5CQVBfU3RvcENvbm5lY3Rpb25BY2NlcHRUaW1lciAKKyAgICAoIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgpOworCit2X1ZPSURfdCBXTEFOQkFQX0Nvbm5lY3Rpb25BY2NlcHRUaW1lckhhbmRsZXIgCisgICAgKCB2X1BWT0lEX3QgdXNlckRhdGEgKTsKKworLyogTGluayBTdXBlcnZpc2lvbiB0aW1lciovCitWT1NfU1RBVFVTIFdMQU5CQVBfSW5pdExpbmtTdXBlcnZpc2lvblRpbWVyIAorICAgICggcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCk7CisKK1ZPU19TVEFUVVMgV0xBTkJBUF9EZWluaXRMaW5rU3VwZXJ2aXNpb25UaW1lciAKKyAgICAoIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgpOworCitWT1NfU1RBVFVTIFdMQU5CQVBfU3RhcnRMaW5rU3VwZXJ2aXNpb25UaW1lciAKKyAgICAocHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCwgdl9VMzJfdCBpbnRlcnZhbCk7CisKK1ZPU19TVEFUVVMgV0xBTkJBUF9TdG9wTGlua1N1cGVydmlzaW9uVGltZXIgCisgICAgKCBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4KTsKKwordl9WT0lEX3QgV0xBTkJBUF9MaW5rU3VwZXJ2aXNpb25UaW1lckhhbmRsZXIgCisgICAgKCB2X1BWT0lEX3QgdXNlckRhdGEgKTsKKworLyogTG9naWNhbCBMaW5rIEFjY2VwdCB0aW1lciovCitWT1NfU1RBVFVTIFdMQU5CQVBfSW5pdExvZ2ljYWxMaW5rQWNjZXB0VGltZXIgCisgICAgKCBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4KTsKKworVk9TX1NUQVRVUyBXTEFOQkFQX0RlaW5pdExvZ2ljYWxMaW5rQWNjZXB0VGltZXIgCisgICAgKCBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4KTsKKworVk9TX1NUQVRVUyBXTEFOQkFQX1N0YXJ0TG9naWNhbExpbmtBY2NlcHRUaW1lciAKKyAgICAocHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCwgdl9VMzJfdCBpbnRlcnZhbCk7CisKK1ZPU19TVEFUVVMgV0xBTkJBUF9TdG9wTG9naWNhbExpbmtBY2NlcHRUaW1lciAKKyAgICAoIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgpOworCit2X1ZPSURfdCBXTEFOQkFQX0xvZ2ljYWxMaW5rQWNjZXB0VGltZXJIYW5kbGVyIAorICAgICggdl9QVk9JRF90IHVzZXJEYXRhICk7CisKKy8qIEJlc3QgRWZmb3J0IEZsdXNoIHRpbWVyKi8KK1ZPU19TVEFUVVMgV0xBTkJBUF9Jbml0QkVGbHVzaFRpbWVyIAorICAgICggcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCk7CisKK1ZPU19TVEFUVVMgV0xBTkJBUF9EZWluaXRCRUZsdXNoVGltZXIgCisgICAgKCBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4KTsKKworVk9TX1NUQVRVUyBXTEFOQkFQX1N0YXJ0QkVGbHVzaFRpbWVyIAorICAgIChwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4LCB2X1UzMl90IGludGVydmFsKTsKKworVk9TX1NUQVRVUyBXTEFOQkFQX1N0b3BCRUZsdXNoVGltZXIgCisgICAgKCBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4KTsKKwordl9WT0lEX3QgV0xBTkJBUF9CRUZsdXNoVGltZXJIYW5kbGVyIAorICAgICggdl9QVk9JRF90IHVzZXJEYXRhICk7CisKKy8qIFR4IFBhY2tldCBtb25pdG9yIHRpbWVyIGhhbmRsZXIgKi8KK3ZfVk9JRF90IAorV0xBTkJBUF9UeFBhY2tldE1vbml0b3JIYW5kbGVyCisoIAorICB2X1BWT0lEX3QgdXNlckRhdGEgCispOworCisvKiBUeCBQYWNrZXQgbW9uaXRvciBzdGFydCB0aW1lciAqLworVk9TX1NUQVRVUyAKK1dMQU5CQVBfU3RhcnRUeFBhY2tldE1vbml0b3JUaW1lcgorKCAKKyAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eAorKTsKKworLyogVHggUGFja2V0IG1vbml0b3Igc3RvcCB0aW1lciAqLworVk9TX1NUQVRVUyAKK1dMQU5CQVBfU3RvcFR4UGFja2V0TW9uaXRvclRpbWVyIAorKCAKKyAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eAorKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgfQorI2VuZGlmIAorCisKKyNlbmRpZiAvKiAjaWZuZGVmIFdMQU5fUUNUX1dMQU5CQVBfQVBJX1RJTUVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcEludGVybmFsLmggYi9DT1JFL0JBUC9zcmMvYmFwSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2ZkYzAzCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcEludGVybmFsLmgKQEAgLTAsMCArMSwxMzEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBXTEFOX1FDVF9XTEFOQkFQX0lOVEVSTkFMX0gKKyNkZWZpbmUgV0xBTl9RQ1RfV0xBTkJBUF9JTlRFUk5BTF9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgIFcgTCBBIE4gICBCIFQgLSBBIE0gUCAgUCBBIEwgICBMIEEgWSBFIFIgCisgICAgICAgICAgICAgICAgICAgICAgIEkgTiBUIEUgUiBOIEEgTCAgQSBQIEkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAKK0RFU0NSSVBUSU9OCisgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW50ZXJuYWwgQVBJIGV4cG9zZWQgYnkgdGhlIHdsYW4gQlQtQU1QIFBBTCBsYXllciAKKyAgbW9kdWxlLgorICAKKyAgICAgIAorICBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjogL2hvbWUvbGFidXNlci9hbXBCbHVlWl8yL0NPUkUvQkFQL3NyYy9iYXBJbnRlcm5hbC5oLHYgMS4zIDIwMTAvMDcvMTIgMjA6NDA6MTggbGFidXNlciBFeHAgbGFidXNlciAkICREYXRlVGltZTogJCAkQXV0aG9yOiBsYWJ1c2VyICQKKworCit3aGVuICAgICAgICB3aG8gICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA5LzE1LzA4ICAgIGpleiAgICAgQ3JlYXRlZCBtb2R1bGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMgRk9SIE1PRFVMRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInZvc19hcGkuaCIgCisjaW5jbHVkZSAidm9zX3BhY2tldC5oIiAKKworLy8gUGljayB1cCB0aGUgQ1NSIEFQSSBkZWZpbml0aW9ucworI2luY2x1ZGUgImNzckFwaS5oIgorCisvKiBCVC1BTVAgUEFMIEFQSSBzdHJ1Y3R1cmUgdHlwZXMgIC0gRnJhbWVzQyBnZW5lcmF0ZWQgKi8gCisjaW5jbHVkZSAiYnRhbXBIQ0kuaCIgCisjaW5jbHVkZSAiYmFwQXBpLmgiIAorCisvLyBQaWNrIHVwIHRoZSBCVEFNUCBGU00gZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJmc21EZWZzLmgiCisvLyNpbmNsdWRlICJidGFtcEZzbS5oIgorI2luY2x1ZGUgImJ0YW1wRnNtX2V4dC5oIgorI2luY2x1ZGUgImJhcFJzbjgwMjF4RnNtLmgiCisjaW5jbHVkZSAiYmFwUnNuRXJyb3JzLmgiCisKKyNpbmNsdWRlICJjc3JBcGkuaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKyNpbmNsdWRlICJ3bmlBcGkuaCIKKyNpbmNsdWRlICJwYWxBcGkuaCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworICNlbmRpZiAKKyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRGVmaW5lcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBUZW1wb3Jhcnkgc28gdGhhdCBJIGNhbiBjb21waWxlCisvLyNkZWZpbmUgVk9TX01PRFVMRV9JRF9CQVAgOQorLy8gVGVtcG9yYXJ5IAorLy8jZGVmaW5lIEJBUF9ERUJVRworCisvLyBVc2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIHNlY3VyaXR5IG9uIHRoZSBCVC1BTVAgbGluayAKKyNkZWZpbmUgV0xBTkJBUF9TRUNVUklUWV9FTkFCTEVEX1NUQVRFIFZPU19UUlVFCisKKy8vIEhvdyBkbyBJIGdldCBCQVAgY29udGV4dCBmcm9tIHZvc3MgY29udGV4dD8gCisjZGVmaW5lIFZPU19HRVRfQkFQX0NCKGN0eCkgdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0JBUCwgY3R4KSAKKy8vIEhvdyBkbyBJIGdldCBoYWxIYW5kbGUgZnJvbSB2b3NzIGNvbnRleHQ/IAorI2RlZmluZSBWT1NfR0VUX0hBTF9DQihjdHgpIHZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9TTUUsIGN0eCkgCisKKy8vIERlZmF1bHQgdGltZW91dCB2YWx1ZXMgKGluIEJSL0VEUiBiYXNlYmFuZCBzbG90cykKKy8vIFBoeXNpY2FsIExpbmsgQ29ubmVjdGlvbiBBY2NlcHQgVGltZXIgaW50ZXJ2YWwgKDB4MUZBMCAqIDAuNjI1ID0gNS4wNiBzZWMpCisvKiBjaG9zZSB0byBkb3VibGUgaXQgdG8gM0ZGRiBhcyB3ZSBzYXcgY29ubiB0aW1lb3V0IGluIGxhYiovCisvLyNkZWZpbmUgV0xBTkJBUF9DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VUICAweEZGRkYKKy8vIFNldCBkZWZhdWx0IHRvIDB4MUY0MC4gIFdoaWNoIGlzIH41IHNlY3MuCisjZGVmaW5lIFdMQU5CQVBfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCAgMHgxRjQwCisKKy8qIExpbmsgU3VwZXJ2aXNpb24gVGltZXIgaW50ZXJ2YWwgKDB4N0QwMCAqIDAuNjI1ID0gMjAgc2VjKSAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVAorI2RlZmluZSBXTEFOQkFQX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVCAgIDB4N0QwMAorI2Vsc2UKKyNkZWZpbmUgV0xBTkJBUF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQgICAweDNFODAgIC8vIDEwIHNlY29uZHMKKyNlbmRpZgorI2RlZmluZSBXTEFOQkFQX0xJTktfU1VQRVJWSVNJT05fUkVUUklFUyAgIDIKKworLyogTG9naWNhbCBMaW5rIEFjY2VwdCBUaW1lciBpbnRlcnZhbCAoMHgxRkEwICogMC42MjUgPSA1LjA2IHNlYykqLworI2RlZmluZSBXTEFOQkFQX0xPR0lDQUxfTElOS19BQ0NFUFRfVElNRU9VVCAweDFGNDAKKworLyogQlIvRURSIGJhc2ViYW5kIDEgc2xvdCB0aW1lIHBlcmlvZCAqLworI2RlZmluZSBXTEFOQkFQX0JSRURSX0JBU0VCQU5EX1NMT1RfVElNRSAgMSAvLyAwLjYyNQorCisvKiBNYXhpbXVtIGFsbG93ZWQgcmFuZ2UgZm9yIGNvbm5lY3Rpb24gYWNjZXB0IHRpbWVvdXQgaW50ZXJ2YWwgKi8KKyNkZWZpbmUgV0xBTkJBUF9DT05fQUNDRVBUX1RJTUVPVVRfTUFYX1JBTkdFICAweEI1NDAKKworLyogTWluaW11bSBhbGxvd2VkIHJhbmdlIGZvciBjb25uZWN0aW9uIGFjY2VwdCB0aW1lb3V0IGludGVydmFsICovCisjZGVmaW5lIFdMQU5CQVBfQ09OX0FDQ0VQVF9USU1FT1VUX01JTl9SQU5HRSAgIDB4MDEKKworLyogQmVzdCBFZmZvcnQgRmx1c2ggdGltZXIgaW50ZXJ2YWwqLworI2RlZmluZSBXTEFOQkFQX0JFX0ZMVVNIX1RJTUVPVVQgMTAKKworLyogTGVuZ3RoIG9mIHRoZSBMTEMgaGVhZGVyKi8KKyNkZWZpbmUgV0xBTkJBUF9MTENfSEVBREVSX0xFTiAgIDggCisKKy8qU2l6ZSBvZiB0aGUgcHJvdG9jb2wgdHlwZSBmaWVsZCBpbnNpZGUgdGhlIExMQy9TTkFQIGhlYWRlciovCisjZGVmaW5lIFdMQU5CQVBfTExDX1BST1RPX1RZUEVfU0laRSAgICAgICAgICAgIDIKKworLypTaXplIG9mIHRoZSBPVUkgdHlwZSBmaWVsZCBpbnNpZGUgdGhlIExMQy9TTkFQIGhlYWRlciovCisjZGVmaW5lIFdMQU5CQVBfTExDX09VSV9TSVpFICAgICAgICAgICAgICAgICAgIDMKKworLypPZmZzZXQgb2YgdGhlIE9VSSBmaWVsZCBpbnNpZGUgdGhlIExMQy9TTkFQIGhlYWRlciovCisjZGVmaW5lIFdMQU5CQVBfTExDX09VSV9PRkZTRVQgICAgICAgICAgICAgICAgIDMKKworLypPZmZzZXQgb2YgdGhlIHByb3RvY29sIHR5cGUgZmllbGQgaW5zaWRlIHRoZSBMTEMvU05BUCBoZWFkZXIqLworI2RlZmluZSBXTEFOQkFQX0xMQ19QUk9UT19UWVBFX09GRlNFVCAgV0xBTkJBUF9MTENfT1VJX09GRlNFVCArICBXTEFOQkFQX0xMQ19PVUlfU0laRQorCisjZGVmaW5lIFdMQU5CQVBfTUFYX05VTV9UUklQTEVUUyAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBXTEFOQkFQX01BWF9TSVpFX1RSSVBMRVRTICAgICAgICAgICAgICAzCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUeXBlZGVmcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUeXBlIERlY2xhcmF0aW9ucyAtIEZvciBpbnRlcm5hbCBCQVAgY29udGV4dCBpbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBIQ0lfQnVmZmVyX1NpemUgeworLy8gICAgdl9VOF90ICAgICAgIHByZXNlbnQ7CisgICAgLyogRDlyMTQgc2F5cyBNYXg4MDIxMVBBTFBEVVNpemUgMTQ5MiAqLworICAgIHZfVTE2X3QgICAgICBIQ19BQ0xfRGF0YV9QYWNrZXRfTGVuZ3RoOyAgCisgICAgdl9VOF90ICAgICAgIEhDX1NDT19QYWNrZXRfTGVuZ3RoOworICAgIHZfVTE2X3QgICAgICBIQ19Ub3RhbF9OdW1fQUNMX1BhY2tldHM7CisgICAgdl9VMTZfdCAgICAgIEhDX1RvdGFsX051bV9TQ09fUGFja2V0czsKK30gdEJ0YW1wSENJX0J1ZmZlcl9TaXplOworCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBIQ0lfRGF0YV9CbG9ja19TaXplIHsKKy8vICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBzdGF0dXM7CisgICAgLyogRDlyMTQgc2F5cyBNYXg4MDIxMVBBTFBEVVNpemUgMTQ5MiAqLworICAgIHZfVTE2X3QgICAgICBIQ19NYXhfQUNMX0RhdGFfUGFja2V0X0xlbmd0aDsgIAorICAgIHZfVTE2X3QgICAgICBIQ19EYXRhX0Jsb2NrX0xlbmd0aDsKKyAgICB2X1UxNl90ICAgICAgSENfVG90YWxfTnVtX0RhdGFfQmxvY2tzOworfSB0QnRhbXBIQ0lfRGF0YV9CbG9ja19TaXplOworCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBIQ0lfVmVyc2lvbl9JbmZvIHsKKy8vICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBIQ19IQ0lfVmVyc2lvbjsKKyAgICB2X1UxNl90ICAgICAgSENfSENJX1JldmlzaW9uOyAgCisgICAgdl9VOF90ICAgICAgIEhDX1BBTF9WZXJzaW9uOyAgLyogZm9yIDgwMi4xMSBBTVA6IDB4MDEgKi8KKyAgICB2X1UxNl90ICAgICAgSENfUEFMX1N1Yl9WZXJzaW9uOyAvKiBmb3IgODAyLjExIEFNUDogVmVuZG9yIHNwZWNpZmljICovIAorICAgIHZfVTE2X3QgICAgICBIQ19NYW51ZmFjX05hbWU7IC8qIFNlZSBCVCBhc3NpZ25lZCBudW1iZXJzICovICAKK30gdEJ0YW1wSENJX1ZlcnNpb25fSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wSENJX1N1cHBvcnRlZF9DbWRzIHsKKy8vICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBIQ19TdXBwb3J0X0NtZHNbNjRdOyAvKiBhIGJpdG1hc2sgb2YgY21kcyAqLworfSB0QnRhbXBIQ0lfU3VwcG9ydGVkX0NtZHM7CisKK3R5cGVkZWYgc3RydWN0IHNCdGFtcEhDSV9BTVBfSW5mbyB7CisvLyAgICB2X1U4X3QgICAgICAgcHJlc2VudDsKKyAgICB2X1U4X3QgICAgICAgSENfQU1QX1N0YXR1czsgLyogKi8KKyAgICB2X1UzMl90ICAgICAgSENfVG90YWxfQlc7IC8qIGNvbWJpbmVkIHVwbGluayBhbmQgZG93bmxpbmsgKi8KKyAgICB2X1UzMl90ICAgICAgSENfTWF4X0d1YXJhbnRlZWRfQlc7IC8qIHVwcGVyIGJvdW5kICovCisgICAgdl9VMzJfdCAgICAgIEhDX01pbl9MYXRlbmN5OyAvKiBBTVAgSENJIGxhdGVuY3kgKyBESUZTICsgQ1dNaW4gKi8KKyAgICB2X1UzMl90ICAgICAgSENfTWF4X1BEVV9TaXplOyAvKiBFcXVhbCB0byBNYXg4MDIxMVBBTFBEVVNpemUgKi8KKyAgICB2X1U4X3QgICAgICAgSENfQ29udHJvbGxlcl9UeXBlOyAvKiAweDAxIGZvciA4MDIuMTEgQlQtQU1QIFBBTCAgKi8KKyAgICB2X1UxNl90ICAgICAgSENfUEFMX0NhcGFiaWxpdGllczsgIC8qIEJpdCAwOiAwID0gTm8gR3VhcmFudGVlOyAxID0gR3VhcmFudGVlICovCisgICAgdl9VMTZfdCAgICAgIEhDX0FNUF9Bc3NvY19MZW5ndGg7ICAvKiBMZW5ndGggb2YgQU1QIEFzc29jIEluZm8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVxdWFsIHRvIE1heDgwMjExQU1QQVNTT0NMZW4gKDY3MikgKi8KKyAgICB2X1UxNl90ICAgICAgSENfTWF4X0ZsdXNoX1RpbWVvdXQ7ICAvKiBNYXhpbXVtIHRpbWUgVHggYXR0ZW1wdGVkLiAwIGlzIGluZiByZXRyeSAqLworICAgIHZfVTE2X3QgICAgICBIQ19CRV9GbHVzaF9UaW1lb3V0OyAgLyogTWF4aW11bSB0aW1lIEJFIFR4IGF0dGVtcHRlZC4gMCBpcyBpbmYgcmV0cnkgKi8KK30gdEJ0YW1wSENJX0FNUF9JbmZvOworCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBIQ0lfQU1QX0Fzc29jIHsKKy8vICAgIHZfVThfdCAgICAgICBwcmVzZW50OworICAgIHZfVThfdCAgICAgICBIQ19jbmN0X2NvdW50cnlbM107ICAgLyogQ29ubmVjdGVkIGNoYW5uZWwgKi8KKyAgICB2X1U4X3QgICAgICAgSENfY25jdF9udW1fdHJpcGxldHM7CisgICAgdl9VOF90ICAgICAgIEhDX2NuY3RfdHJpcGxldHNbV0xBTkJBUF9NQVhfTlVNX1RSSVBMRVRTXVtXTEFOQkFQX01BWF9TSVpFX1RSSVBMRVRTXTsKKyAgICB2X1U4X3QgICAgICAgSENfbWFjX2FkZHJbNl07CisgICAgdl9VMzJfdCAgICAgIEhDX3BhbF9jYXBhYmlsaXRpZXM7CisgICAgdl9VOF90ICAgICAgIEhDX3ByZWZfY291bnRyeVszXTsgICAvKiBQcmVmZXJyZWQgY2hhbm5lbHMgKi8KKyAgICB2X1U4X3QgICAgICAgSENfcHJlZl9udW1fdHJpcGxldHM7CisgICAgdl9VOF90ICAgICAgIEhDX3ByZWZfdHJpcGxldHNbV0xBTkJBUF9NQVhfTlVNX1RSSVBMRVRTXVtXTEFOQkFQX01BWF9TSVpFX1RSSVBMRVRTXTsKKyAgICB2X1U4X3QgICAgICAgSENfcGFsX3ZlcnNpb247CisgICAgdl9VMTZfdCAgICAgIEhDX3BhbF9Db21wYW55SUQ7CisgICAgdl9VMTZfdCAgICAgIEhDX3BhbF9zdWJ2ZXJzaW9uOworfSAgdEJ0YW1wSENJX0FNUF9Bc3NvYywgKnRwQnRhbXBIQ0lfQU1QX0Fzc29jIDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wVExWSENJX0xvY2F0aW9uX0RhdGFfSW5mbyB7CisgICAgdl9VOF90ICAgICAgIGxvY19kb21haW5fYXdhcmU7CisgICAgdl9VOF90ICAgICAgIGxvY19kb21haW5bM107CisgICAgdl9VOF90ICAgICAgIGxvY19vcHRpb25zOworfSB0QnRhbXBUTFZIQ0lfTG9jYXRpb25fRGF0YV9JbmZvOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUeXBlIERlY2xhcmF0aW9ucyAtIEZvciBCQVAgbG9naWNhbCBsaW5rIGNvbnRleHQgaW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wTG9nTGlua0N0eCB7CisgICAgdl9VOF90ICAgICAgIHByZXNlbnQ7ICAvKiBJbiB1c2U/ICovCisKKyAgICB2X1U4X3QgICAgICAgbG9nX2xpbmtfaW5kZXg7ICAvKiBzbWFsbCBpbnRlZ2VyICg8MTYpIHZhbHVlIGFzc2lnbmVkIGJ5IHVzICovCisgICAgdl9VMTZfdCAgICAgIGxvZ19saW5rX2hhbmRsZTsgIC8qIDggYml0cyBvZiBwaHlfbGlua19oYW5kbGUgYW5kIG91ciBpbmRleCAqLworCisgICAgLyogVGhlIGZsb3cgc3BlYyAoRnJvbSBzZWN0aW9uIDUuNiBvZiBHZW5lcmljIEFNUCBzcGVjKSAgKi8KKyAgICB0QnRhbXBUTFZGbG93X1NwZWMgYnRhbXBGbG93U3BlYzsgICAKKworICAgIC8qIFRoZSBBY2Nlc3MgY2F0ZWdvcnkgICovCisgICAgV0xBTlRMX0FDRW51bVR5cGUgYnRhbXBBQzsgICAKKworICAgIC8qIFRoZSBUSUQgICovCisgICAgdl9VOF90ICAgIHVjVElEOworCisgICAgLyogVVAgb2YgdGhlIHBhY2tldCBiZWluZyBzZW50ICovCisgICAgdl9VOF90ICAgIHVjVVA7CisKKyAgICAvKk51bWJlciBvZiBwYWNrZXRzIGNvbXBsZXRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIG51bSBwa3QgY29tcGxldGUgZXZlbnQgCisgICAgICB3YXMgaXNzdWVkKi8KKyAgICB2X1UzMl90ICAgdVR4UGt0Q29tcGxldGVkOyAgICAKKworfSAgdEJ0YW1wTG9nTGlua0N0eCwgKnRwQnRhbXBMb2dMaW5rQ3R4IDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVHlwZSBEZWNsYXJhdGlvbnMgLSBRT1MgcmVsYXRlZAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBCVC1BTVAgUU9TIGNvbmZpZyAqLwordHlwZWRlZiBzdHJ1Y3Qgc0J0YW1wUW9zQ2ZnIHsKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIGJXbW1Jc0VuYWJsZWQ7Cit9IHRCdGFtcFFvc0NmZzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgT3BhcXVlIEJBUCBjb250ZXh0IFR5cGUgRGVjbGFyYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gV2Ugd2VyZSBvbmx5IHVzaW5nIHRoaXMgc3ludGF4LCB3aGVuIHRoaXMgd2FzIHRydWx5IG9wYXF1ZS4gCisvLyAoSS5FLiwgaXQgd2FzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgZmlsZS4pCisvL3R5cGVkZWYgc3RydWN0IHNCdGFtcENvbnRleHQgdEJ0YW1wQ29udGV4dCwgKnB0QnRhbXBDb250ZXh0OworCisKKy8vIFZhbGlkaXR5IGNoZWNrIHRoZSBsb2dpY2FsIGxpbmsgdmFsdWUgCisjZGVmaW5lIEJUQU1QX1ZBTElEX0xPR19MSU5LKGEpICggYSA+IDAgJiYgYSA8IFdMQU5CQVBfTUFYX0xPR19MSU5LUyA/IDEgOiAwKSAgCisKKy8qIEluc3RhbmNlIGRhdGEgZGVmaW5pdGlvbiBvZiBzdGF0ZSBtYWNoaW5lICovCisvLyBNb3ZlZCBoZXJlIGZyb20gdGhlIEJUQU1QIEZTTSBkZWZpbml0aW9ucyBpbiBidGFtcEZzbS5oCit0eXBlZGVmIHN0cnVjdHsKKyAgQlRBTVBGU01fRU5UUllfRkxBR19UIGRpc2Nvbm5lY3RlZEVudHJ5OworICBCVEFNUEZTTV9TVEFURVZBUl9UIHN0YXRlVmFyOworICBCVEFNUEZTTV9JTlNUX0lEX1QgaW5zdF9pZDsKK30gQlRBTVBGU01fSU5TVEFOQ0VEQVRBX1Q7CisKKy8qIEJULUFNUCBkZXZpY2Ugcm9sZSAqLwordHlwZWRlZiBlbnVteworICAgIEJUX1JFU1BPTkRFUiwKKyAgICBCVF9JTklUSUFUT1IKK30gdFdMQU5fQkFQUm9sZTsKKworLyogQlQtQU1QIGRldmljZSByb2xlICovCit0eXBlZGVmIGVudW17CisgICAgV0xBTl9CQVBMb2dMaW5rQ2xvc2VkLAorICAgIFdMQU5fQkFQTG9nTGlua09wZW4sCisgICAgV0xBTl9CQVBMb2dMaW5rSW5Qcm9ncmVzcywKK30gdFdMQU5fQkFQTG9nTGlua1N0YXRlOworCit0eXBlZGVmIHN0cnVjdHsKKyAgICB2X1U4X3QgICAgICAgcGh5TGlua0hhbmRsZTsKKyAgICB2X1U4X3QgICAgICAgdHhGbG93U3BlY1sxOF07CisgICAgdl9VOF90ICAgICAgIHJ4Rmxvd1NwZWNbMThdOworfSB0QnRhbXBMb2dMaW5rUmVxSW5mbzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgQkFQIGNvbnRleHQgRGF0YSBUeXBlIERlY2xhcmF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyN1bmRlZiBCVEFNUF9NVUxUSVBMRV9QSFlfTElOS1MKK3R5cGVkZWYgc3RydWN0IHNCdGFtcENvbnRleHQgeworI2lmbmRlZiBCVEFNUF9NVUxUSVBMRV9QSFlfTElOS1MKKworICAgIC8vIEluY2x1ZGUgdGhlIGVuY2xvc2luZyBWT1NTIGNvbnRleHQgaGVyZQorICAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgcHZvc0dDdHg7IAorCisgICAgLy8gIGluY2x1ZGUgdGhlIHBoeSBsaW5rIHN0YXRlIG1hY2hpbmUgc3RydWN0dXJlIGhlcmUKKyAgICB0V0xBTl9CQVBiYXBQaHlzTGlua01hY2hpbmUgICBiYXBQaHlzTGlua01hY2hpbmU7CisKKyAgICAvLyBCQVAgZGV2aWNlIHJvbGUKKyAgICB0V0xBTl9CQVBSb2xlICAgICAgICAgICAgIEJBUERldmljZVJvbGU7CisgICAgLy8gSW5jbHVkZSB0aGUgU01FKENTUikgc2Vzc2lvbklkIGhlcmUKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDsKKworICAgIC8vIEFjdHVhbCBzdG9yYWdlIGZvciBBUCBhbmQgc2VsZiAoU1RBKSBTU0lEIAorICAgIC8vdFNpck1hY1NTaWQgICAgICAgICAgICAgICBTU0lEWzJdOworICAgIHRDc3JTU0lESW5mbyAgICAgICAgICAgICAgU1NJRExpc3RbMl07CisgICAgLy8gQWN0dWFsIHN0b3JhZ2UgZm9yIEFQIGJzc2lkIAorICAgIHRDc3JCc3NpZCAgICAgICAgICAgICAgICAgYnNzaWQ7CisgICAgLy8gSW5jbHVkZSB0aGUgU01FKENTUikgY29udGV4dCBoZXJlCisgICAgdENzclJvYW1Qcm9maWxlICAgICAgICAgICBjc3JSb2FtUHJvZmlsZTsgCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICBjc3JSb2FtSWQ7CisKKyAgICAvLyBRT1MgY29uZmlnCisgICAgdEJ0YW1wUW9zQ2ZnICAgICAgICAgICAgICBiYXBRb3NDZmc7CisKKyAgICAvKkZsYWcgZm9yIHNpZ25hbGluZyBpZiBzZWN1cml0eSBpcyBlbmFibGVkKi8KKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIHVjU2VjRW5hYmxlZDsKKworICAgIC8vIGFzc29jaWF0ZWQgYm9vbGVhbiBmbGFnCisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBtQXNzb2NpYXRlZDsKKyAgICAvLyBhc3NvY2lhdGVkIHN0YXR1cyAKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIG1Bc3NvY2lhdGVkU3RhdHVzOworICAgIHRDc3JCc3NpZCAgICAgICAgICAgICAgICAgYXNzb2NCc3NpZDsgIAorICAgIHRCc3NTeXN0ZW1Sb2xlICAgICAgICAgICAgc3lzdGVtUm9sZTsgCisKKyAgICAvLyBvd24gU1NJRCAgCisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBvd25Tc2lkWzMyXTsKKyAgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgIG93blNzaWRMZW47CisKKyAgICAvLyBpbmNvbWluZyBBc3NvYyBTU0lEICAKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIGFzc29jU3NpZFszMl07CisgICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICBhc3NvY1NzaWRMZW47CisKKyAgICAvLyBnTmVlZFBoeXNMaW5rQ29tcEV2ZW50CisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBnTmVlZFBoeXNMaW5rQ29tcEV2ZW50OworICAgIC8vIGdQaHlzTGlua1N0YXR1cyAKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIGdQaHlzTGlua1N0YXR1czsKKyAgICAvLyBnRGlzY1JlcXVlc3RlZAorICAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgZ0Rpc2NSZXF1ZXN0ZWQ7CisgICAgLy8gZ0Rpc2NSZWFzb24gCisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBnRGlzY1JlYXNvbjsKKworICAgIC8vIEluY2x1ZGUgdGhlIEJTTCBwZXItYXBwbGljYXRpb24gY29udGV4dCBoZXJlCisgICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICBwQXBwSGRsOyAgLy8gUGVyLWFwcCBCU0wgY29udGV4dAorICAgIC8vIEluY2x1ZGUgdGhlIEJTTCBwZXItYXNzb2NpYXRpb24gY29udGV4dHMgaGVyZS4KKyAgICAvLyAoUmlnaHQgbm93LCB0aGVyZSBpcyBvbmx5IG9uZSkKKyAgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgIHBIZGRIZGw7CisgICAgLyogOCBiaXRzIG9mIHBoeV9saW5rX2hhbmRsZSBpZGVudGlmaWVzIHRoaXMgYXNzb2NpYXRpb24gKi8KKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIHBoeV9saW5rX2hhbmRsZTsgIAorICAgIC8vIFNob3J0IFJhbmdlIE1vZGUgc2V0dGluZyBmb3IgdGhpcyBwaHlzaWNhbCBsaW5rCisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBwaHlfbGlua19zcm07CisKKyAgICAvLyBJbmNsdWRlIHRoZSBrZXkgbWF0ZXJpYWwgZm9yIHRoaXMgcGh5c2ljYWwgbGluaworICAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBrZXlfbGVuZ3RoOworICAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAga2V5X21hdGVyaWFsWzMyXTsKKyAgICAKKyAgICAvKiBQaHlzaWNhbCBsaW5rIHF1YWxpdHkgc3RhdHVzCisgICAgICAgQWZ0ZXIgdGhlIHBoeXNpY2FsIGxpbmsgaXMgdXAsIFNNRSBpbmRpY2F0ZXMgdGhlIGxpbmsgcXVhbGl0eSB0aHJvdWdoCisgICAgICAgY2FsbGJhY2suIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgdG8gdXBwZXIgbGF5ZXIgb24gcmVxdWVzdC4KKyAgICAgICAqLworICAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgbGlua19xdWFsaXR5OworICAgIAorICAgIC8qIENvbm5lY3Rpb24gQWNjZXB0IHRpbWVyKi8KKyAgICB2b3NfdGltZXJfdCAgICAgICAgICAgICAgIGJhcENvbm5lY3Rpb25BY2NlcHRUaW1lcjsgCisgICAgLyogTGluayBTdXBlcnZpc2lvbiB0aW1lciovCisgICAgdm9zX3RpbWVyX3QgICAgICAgICAgICAgICBiYXBMaW5rU3VwZXJ2aXNpb25UaW1lcjsgCisgICAgLyogTG9naWNhbCBMaW5rIEFjY2VwdCB0aW1lciovCisgICAgdm9zX3RpbWVyX3QgICAgICAgICAgICAgICBiYXBMb2dpY2FsTGlua0FjY2VwdFRpbWVyOyAKKyAgICAvKiBCZXN0IEVmZm9ydCBGbHVzaCB0aW1lciovCisgICAgdm9zX3RpbWVyX3QgICAgICAgICAgICAgICBiYXBCRUZsdXNoVGltZXI7IAorCisgICAgLyogVFggUGFja2V0IE1vbml0b3JpbmcgdGltZXIqLworICAgIHZvc190aW1lcl90ICAgICAgICAgICAgICAgYmFwVHhQa3RNb25pdG9yVGltZXI7IAorCisgICAgLyogQ29ubmVjdGlvbiBBY2NlcHQgVGltZXIgaW50ZXJ2YWwgKGluIEJSL0VEUiBiYXNlYmFuZCBzbG90cykKKyAgICAgKiBJbnRlcnZhbCBsZW5ndGggPSBOICogMC42MjUgbXNlYyAoMSBCUi9FRFIgYmFzZWJhbmQgc2xvdCkKKyAgICAgKi8KKyAgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgIGJhcENvbm5lY3Rpb25BY2NlcHRUaW1lckludGVydmFsOyAKKworICAgIC8qIExpbmsgU3VwZXJ2aXNpb24gVGltZXIgaW50ZXJ2YWwgKGluIEJSL0VEUiBiYXNlYmFuZCBzbG90cykgKi8KKyAgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgIGJhcExpbmtTdXBlcnZpc2lvblRpbWVySW50ZXJ2YWw7IAorCisgICAgLyogTG9naWNhbCBMaW5rIEFjY2VwdCBUaW1lciBpbnRlcnZhbCAoaW4gQlIvRURSIGJhc2ViYW5kIHNsb3RzKSAqLworICAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICAgYmFwTG9naWNhbExpbmtBY2NlcHRUaW1lckludGVydmFsOyAKKworICAgIC8qIEJlc3QgRWZmb3J0IEZsdXNoIHRpbWVyIGludGVydmFsKi8KKyAgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgIGJhcEJFRmx1c2hUaW1lckludGVydmFsOyAKKworICAgIC8vIEluY2x1ZGUgdGhlIGN1cnJlbnQgY2hhbm5lbCBoZXJlCisgICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICBjaGFubmVsOworCisgICAgLy8gSW5jbHVkZSB0aGUgYXNzb2NpYXRpb25zIFNUQSBJZAorICAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgdWNTVEFJZDsKKworICAgIC8vIEluY2x1ZGUgdGhlIGFzc29jaWF0aW9ucyBNQUMgYWRkcmVzc2VzCisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBzZWxmX21hY19hZGRyWzZdOworICAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgcGVlcl9tYWNfYWRkcls2XTsKKworICAgIC8vIFRoZSBhcnJheSBvZiBsb2dpY2FsIGxpbmtzCisgICAgLyogdGhlIGxhc3Qgc21hbGwgaW50ZWdlciAoPDE2KSB2YWx1ZSBhc3NpZ25lZCBieSB1cyAqLworICAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgY3VycmVudF9sb2dfbGlua19pbmRleDsgLyogYXNzaWduZWQgbW9kIDE2ICovICAKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIHRvdGFsX2xvZ19saW5rX2luZGV4OyAvKiBzaG91bGQgbmV2ZXIgYmUgPjE2ICovICAKKyAgICAvKiBUaGUgYWN0dWFsIGFycmF5ICovCisgICAgdEJ0YW1wTG9nTGlua0N0eCAgICAgICAgICBidGFtcExvZ0xpbmtDdHhbV0xBTkJBUF9NQVhfTE9HX0xJTktTXTsgIAorICAgIAorICAgIC8vIEluY2x1ZGUgdGhlIEhERCBCQVAgU2hpbSBMYXllciBjYWxsYmFja3MgZm9yIEZldGNoLCBUeENvbXAsIGFuZCBSeFBrdAorICAgIFdMQU5CQVBfU1RBRmV0Y2hQa3RDQlR5cGUgcGZuQnRhbXBGZXRjaFBrdENCOworICAgIFdMQU5CQVBfU1RBUnhDQlR5cGUgICAgICAgcGZuQnRhbXBfU1RBUnhDQjsKKyAgICBXTEFOQkFQX1R4Q29tcENCVHlwZSAgICAgIHBmbkJ0YW1wVHhDb21wQ0I7CisKKyAgICAvKiBJbXBsZW1lbnRzIHRoZSBjYWxsYmFjayBmb3IgQUxMIGFzeW5jaHJvbm91cyBldmVudHMuICovIAorICAgIHRwV0xBTl9CQVBFdmVudENCICAgICAgICAgcEJhcEhDSUV2ZW50Q0I7CisKKyAgICAvLyBTYXZlIFBhZ2UyIG9mIHRoZSBldmVudCBtYXNrLiAgCisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBldmVudF9tYXNrX3BhZ2VfMls4XTsKKworICAgIC8vIEluY2x1ZGUgdGhlIExvY2FsIEFzc29jIHN0cnVjdHVyZS4KKyAgICAvLyAoVGhpcyBnZXRzIGZpbGxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIEl0IGlzIHVzZWQsIGZvciBleGFtcGxlLCB0byAKKyAgICAvLyBvYnRhaW4gdGhlIGxvY2FsIE1BQyBhZGRyZXNzIGZvciBmb3JtaW5nIHRoZSA4MDIuMyBmcmFtZS4pIAorICAgIC8vIDw8V2h5IGRvbid0IEkganVzdCBwdWxsIG91dCB0aGUgaW5kaXZpZCBmaWVsZHMgSSBuZWVkPyAgTGlrZSBNQUMgYWRkci4+PgorICAgIHRCdGFtcEhDSV9BTVBfQXNzb2MgICAgICAgYnRhbXBfQU1QX0Fzc29jOworCisgICAgLy8gUmVtb3RlIEFNUCBBc3NvYworICAgIHRCdGFtcEhDSV9BTVBfQXNzb2MgICAgICAgYnRhbXBfUmVtb3RlX0FNUF9Bc3NvYzsKKworICAgIHRCdGFtcFRMVkhDSV9Mb2NhdGlvbl9EYXRhX0luZm8gIGJ0YW1wX0xvY2F0aW9uX0RhdGFfSW5mbzsKKworICAgIHVuaW9uCisgICAgeworICAgICAgICB0QXV0aFJzbkZzbSBhdXRoRnNtOworICAgICAgICB0U3VwcFJzbkZzbSBzdXBwRnNtOworICAgIH11RnNtOworICAgIC8vTGlua1N1cGVydmlzaW9uIHBhY2tldAorICAgIHRBTklfQk9PTEVBTiBsc1JlcVBrdFBlbmRpbmc7CisgICAgdEFOSV9CT09MRUFOIGRhdGFQa3RQZW5kaW5nOworICAgIHRBTklfVTggcmV0cmllczsKKyAgICB2b3NfcGt0X3QgKnBQYWNrZXQ7CisgICAgdm9zX3BrdF90ICpsc1JlcVBhY2tldDsKKyAgICB2b3NfcGt0X3QgKmxzUmVwUGFja2V0OworICAgIHZfVTE2X3QgICAgbHNQa3RsbjsKKyAgICB2X1UxNl90ICAgIGxzUGVuZGluZzsKKyAgICBXTEFOVExfTWV0YUluZm9UeXBlICBtZXRhSW5mbzsgICAKKyAgICB0QU5JX0JPT0xFQU4gaXNCYXBTZXNzaW9uT3BlbjsKKworICAgIHRXTEFOX0JBUExvZ0xpbmtTdGF0ZSAgYnRhbXBfbG9naWNhbF9saW5rX3N0YXRlOworCisgICAgdEJ0YW1wTG9nTGlua1JlcUluZm8gICBidGFtcF9sb2dpY2FsX2xpbmtfcmVxX2luZm87CisKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgICAgIGJ0YW1wX2FzeW5jX2xvZ2ljYWxfbGlua19jcmVhdGU7CisKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgICAgIGJ0YW1wX2xvZ2ljYWxfbGlua19jYW5jZWxfcGVuZGluZzsKKworICAgIHRBTklfQk9PTEVBTiAgICAgICAgICAgYnRhbXBfc2Vzc2lvbl9vbjsKKworI2Vsc2UgLy8gZGVmaW5lZChCVEFNUF9NVUxUSVBMRV9QSFlfTElOS1MpCisKKyAgICAvLyBJbmNsdWRlIHRoZSBlbmNsb3NpbmcgVk9TUyBjb250ZXh0IGhlcmUKKyAgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgIHB2b3NHQ3R4OyAKKworICAgIC8vICAgIGluY2x1ZGUgdGhlIHN0YXRlIG1hY2hpbmUgc3RydWN0dXJlIGhlcmUKKworICAgIC8vIEluY2x1ZGUgdGhlIEJTTCBwZXItYXBwbGljYXRpb24gY29udGV4dCBoZXJlCisgICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICBwQXBwSGRsOyAgLy8gUGVyLWFwcCBCU0wgY29udGV4dAorICAgIC8vIEluY2x1ZGUgdGhlIEJTTCBwZXItYXNzb2NpYXRpb24gY29udGV4dHMgaGVyZS4KKyAgICAvLyAoUmlnaHQgbm93LCB0aGVyZSBpcyBvbmx5IG9uZSkKKyAgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgIHBIZGRIZGw7CisgICAgLyogOCBiaXRzIG9mIHBoeV9saW5rX2hhbmRsZSBpZGVudGlmaWVzIHRoaXMgYXNzb2NpYXRpb24gKi8KKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIHBoeV9saW5rX2hhbmRsZTsgIAorICAgIC8vIFNob3J0IFJhbmdlIE1vZGUgc2V0dGluZyBmb3IgdGhpcyBwaHlzaWNhbCBsaW5rCisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBwaHlfbGlua19zcm07CisKKyAgICAvLyBJbmNsdWRlIHRoZSBhc3NvY2lhdGlvbnMgU1RBIElkCisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkOworCisgICAgLy8gSW5jbHVkZSB0aGUgYXNzb2NpYXRpb25zIE1BQyBhZGRyZXNzZXMKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIHNlbGZfbWFjX2FkZHJbNl07CisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBwZWVyX21hY19hZGRyWzZdOworCisgICAgLy8gVGhlIGFycmF5IG9mIGxvZ2ljYWwgbGlua3MKKyAgICAvKiB0aGUgbGFzdCBzbWFsbCBpbnRlZ2VyICg8MTYpIHZhbHVlIGFzc2lnbmVkIGJ5IHVzICovCisgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2xvZ19saW5rX2luZGV4OyAvKiBhc3NpZ25lZCBtb2QgMTYgKi8gIAorICAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgdG90YWxfbG9nX2xpbmtfaW5kZXg7IC8qIHNob3VsZCBuZXZlciBiZSA+MTYgKi8gIAorICAgIC8qIFRoZSBhY3R1YWwgYXJyYXkgKi8KKyAgICB0QnRhbXBMb2dMaW5rQ3R4ICAgICAgICAgIGJ0YW1wTG9nTGlua0N0eFtXTEFOQkFQX01BWF9MT0dfTElOS1NdOyAgCisgICAgCisgICAgLy8gSW5jbHVkZSB0aGUgSEREIEJBUCBTaGltIExheWVyIGNhbGxiYWNrcyBmb3IgRmV0Y2gsIFR4Q29tcCwgYW5kIFJ4UGt0CisgICAgV0xBTkJBUF9TVEFGZXRjaFBrdENCVHlwZSBwZm5CdGFtcEZldGNoUGt0Q0I7CisgICAgV0xBTkJBUF9TVEFSeENCVHlwZSAgICAgICBwZm5CdGFtcF9TVEFSeENCOworICAgIFdMQU5CQVBfVHhDb21wQ0JUeXBlICAgICAgcGZuQnRhbXBUeENvbXBDQjsKKworICAgIC8qIEltcGxlbWVudHMgdGhlIGNhbGxiYWNrIGZvciBBTEwgYXN5bmNocm9ub3VzIGV2ZW50cy4gKi8gCisgICAgdHBXTEFOX0JBUEV2ZW50Q0IgICAgICAgICBwQmFwSENJRXZlbnRDQjsKKworICAgIC8vIEluY2x1ZGUgdGhlIExvY2FsIEFzc29jIHN0cnVjdHVyZS4KKyAgICAvLyAoVGhpcyBnZXRzIGZpbGxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIEl0IGlzIHVzZWQsIGZvciBleGFtcGxlLCB0byAKKyAgICAvLyBvYnRhaW4gdGhlIGxvY2FsIE1BQyBhZGRyZXNzIGZvciBmb3JtaW5nIHRoZSA4MDIuMyBmcmFtZS4pIAorICAgIC8vIDw8V2h5IGRvbid0IEkganVzdCBwdWxsIG91dCB0aGUgaW5kaXZpZCBmaWVsZHMgSSBuZWVkPyAgTGlrZSBNQUMgYWRkci4+PgorICAgIHRCdGFtcEhDSV9BTVBfQXNzb2MgICAgICAgYnRhbXBfQU1QX0Fzc29jOworICAgIC8vTGlua1N1cGVydmlzaW9uIHBhY2tldCAKKyAgICB0QU5JX0JPT0xFQU4gbHNSZXFQa3RQZW5kaW5nOyAgIAorICAgIHRBTklfVTggcmV0cmllczsKKyAgICB2b3NfcGt0X3QgKnBQYWNrZXQ7CisgICAgdm9zX3BrdF90ICpsc1JlcVBhY2tldDsKKyAgICB2b3NfcGt0X3QgKmxzUmVwUGFja2V0OworICAgIHZfVTE2X3QgICAgbHNQa3RsbjsKKyAgICBXTEFOVExfTWV0YUluZm9UeXBlKiAgbWV0YUluZm87IAorICAgIHRBTklfQk9PTEVBTiBpc0JhcFNlc3Npb25PcGVuOworICAgIC8vRW5kIG9mIExpbmtTdXBlcnZpc2lvbiBwYWNrZXQKKyNlbmRpZiAvL0JUQU1QX01VTFRJUExFX1BIWV9MSU5LUworICAgIFdMQU5CQVBfQ29uZmlnVHlwZSAgIGNvbmZpZzsKKyAgICAvKm11bHRpcGxlIGRhdGEgc3RydWN0dXJlcyBnZXR0aW5nIGFjY2Vzc2VkL3dyaXR0ZW4gZnJvbSBib3RoIG5vcnRoICYgc291dGgKKyAgICBib3VuZCBlbnRpdGllcy4gVG8gYXZvaWQgbXVsdGlwbGUgYWNjZXNzLCBuZWVkIGEgbG9jayovCisgICAgdm9zX2xvY2tfdCAgICAgICAgICAgYmFwTG9jazsKKyAgICAvLyBFaXRoZXIgQmxvY2sgbW9kZSBvciBQa3QgbW9kZQorICAgIHZfVThfdCAgICAgICAgICAgICAgIHVjRGF0YVRyYWZmaWNNb2RlOworfSpwdEJ0YW1wQ29udGV4dDsgCisvL3RCdGFtcENvbnRleHQsICpwdEJ0YW1wQ29udGV4dDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IHNCdGFtcExzUGt0RGF0YSB7CisgICAgdl9VMzJfdCAgICBCdWZMZW47CisgICAgdl9VOF90ICAgICBwQnVmWzFdOyAvLyBwdHIgdG8gRGF0YSBCdWZmZXIKK310QnRhbXBMc1BrdERhdGEsICpwdEJ0YW1wTHNQa3REYXRhOworCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBMc1BrdCB7CisgICAgdl9VOF90ICAgICBTcmNNYWNbNl07CisgICAgdl9VOF90ICAgICBEc3RNYWNbNl07CisgICAgdEJ0YW1wTHNQa3REYXRhIERhdGE7Cit9IHRCdGFtcExzUGt0LCAqcHRCdGFtcExzUGt0OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBCQVAgcGVyLXNlc3Npb24gQ29udGV4dCBEYXRhIFR5cGUgRGVjbGFyYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gRm9yIG5vdywgaXQgaXMganVzdCB0aGUgc2FtZSB0aGluZyBhcyB0aGUgcGVyIGFwcGxpY2F0aW9uIGNvbnRleHQuCit0eXBlZGVmIHN0cnVjdCBzQnRhbXBDb250ZXh0IHRCdGFtcFNlc3NDdHg7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEJBUCBzdGF0ZSBtYWNoaW5lIGV2ZW50IGRlZmluaXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVGhlIGV2ZW50IHN0cnVjdHVyZSAqLyAKK3R5cGVkZWYgc3RydWN0IHNXTEFOX0JBUEV2ZW50IHsKKyAgICB2X1UzMl90ICAgZXZlbnQ7ICAvKiBTdGF0ZSBtYWNoaW5lIGlucHV0IGV2ZW50IG1lc3NhZ2UgKi8KKyAgICB2X1BWT0lEX3QgcGFyYW1zOyAgLyogQSBWT0lEIHBvaW50ZXIgdHlwZSBmb3IgYWxsIHBvc3NpYmxlIGlucHV0cyAqLworICAgIHZfVTMyX3QgICB1MTsgIC8qIGludHJvZHVjZWQgdG8gaGFuZGxlIGNzclJvYW1Db21wbGV0ZUNhbGxiYWNrIHJvYW1TdGF0dXMgKi8KKyAgICB2X1UzMl90ICAgdTI7ICAvKiBpbnRyb2R1Y2VkIHRvIGhhbmRsZSBjc3JSb2FtQ29tcGxldGVDYWxsYmFjayByb2FtUmVzdWx0ICovCit9IHRXTEFOX0JBUEV2ZW50LCAqcHRXTEFOX0JBUEV2ZW50OyAKKyAKKy8vIFBpY2sgdXAgdGhlIEJUQU1QIEZTTSBkZWZpbml0aW9ucworI2luY2x1ZGUgImJ0YW1wRnNtLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRXh0ZXJuYWwgZGVjbGFyYXRpb25zIGZvciBnbG9iYWwgY29udGV4dCAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gIFRoZSBtYWluIHBlci1QaHlzaWNhbCBMaW5rIChwZXIgV0xBTiBhc3NvY2lhdGlvbikgY29udGV4dC4KKy8vZXh0ZXJuIHRCdGFtcENvbnRleHQgYnRhbXBDdHg7CitleHRlcm4gcHRCdGFtcENvbnRleHQgIGdwQnRhbXBDdHg7CisKKy8vICBJbmNsdWRlIHRoZSBMb2NhbCBBTVAgSW5mbyBzdHJ1Y3R1cmUuCitleHRlcm4gdEJ0YW1wSENJX0FNUF9JbmZvICAgICAgICBidGFtcEhDSV9BTVBfSW5mbzsKKy8vICBJbmNsdWRlIHRoZSBMb2NhbCBEYXRhIEJsb2NrIFNpemUgaW5mbyBzdHJ1Y3R1cmUuCitleHRlcm4gdEJ0YW1wSENJX0RhdGFfQmxvY2tfU2l6ZSBidGFtcEhDSV9EYXRhX0Jsb2NrX1NpemU7CisvLyAgSW5jbHVkZSB0aGUgTG9jYWwgVmVyc2lvbiBpbmZvIHN0cnVjdHVyZS4KK2V4dGVybiB0QnRhbXBIQ0lfVmVyc2lvbl9JbmZvICAgYnRhbXBIQ0lfVmVyc2lvbl9JbmZvOworLy8gIEluY2x1ZGUgdGhlIExvY2FsIFN1cHBvcnRlZCBDbWRzIGluZm8gc3RydWN0dXJlLgorZXh0ZXJuIHRCdGFtcEhDSV9TdXBwb3J0ZWRfQ21kcyAgYnRhbXBIQ0lfU3VwcG9ydGVkX0NtZHM7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRnVuY3Rpb24gcHJvdG90eXBlcyAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBJIGRvbid0IHRoaW5rIGFueSBvZiB0aGlzIGlzIG5lZWRlZCAqLworCisvKiBUTCBkYXRhIHBhdGggY2FsbGJhY2tzIHBhc3NlZCBpbnRvIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1NUQUZldGNoUGt0Q0IgCisKKyAgREVTQ1JJUFRJT04gICAKKyAgICBUaGUgZmV0Y2ggcGFja2V0IGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCBUTC4gCisgICAgCisgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBUTCB3aGVuIHRoZSBzY2hlZHVsaW5nIGFsZ29yaXRobXMgYWxsb3dzIGZvciAKKyAgICB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQgdG8gdGhlIG1vZHVsZS4gCisgICAgSXQgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIEJBTCBmZXRjaCB0cmFuc21pdCBwYWNrZXQgCisgICAgZnVuY3Rpb24sIGluaXRpYXRlZCBieSB0aGUgYnVzIGxvd2VyIGxheWVyLiAKKworCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIAorICAgICAgICAgICAgICAgICAgICB0byBUTCdzIG9yIEhERCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCAKKyAgICAgICAgICAgICAgICAgICAgZnJvbSBpdHMgY29udGV4dCAKKworICAgIElOL09VVAorICAgIHB1Y1NUQUlkOiAgICAgICB0aGUgSWQgb2YgdGhlIHN0YXRpb24gZm9yIHdoaWNoIFRMIGlzIHJlcXVlc3RpbmcgYSAKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0LCBpbiBjYXNlIEhERCBkb2VzIG5vdCBtYWludGFpbiBwZXIgc3RhdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgcXVldWVzIGl0IGNhbiBnaXZlIHRoZSBuZXh0IHBhY2tldCBpbiBpdHMgcXVldWUgCisgICAgICAgICAgICAgICAgICAgIGFuZCBwdXQgaW4gdGhlIHJpZ2h0IHZhbHVlIGZvciB0aGUgCisgICAgcHVjQUM6ICAgICAgICAgIGFjY2VzcyBjYXRlZ29yeSByZXF1ZXN0ZWQgYnkgVEwsIGlmIEhERCBkb2VzIG5vdCBoYXZlIAorICAgICAgICAgICAgICAgICAgICBwYWNrZXRzIG9uIHRoaXMgQUMgaXQgY2FuIGNob29zZSB0byBzZXJ2aWNlIGFub3RoZXIgQUMgCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGluIHRoZSBvcmRlciBvZiBwcmlvcml0eQorCisgICAgT1VUCisgICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgVk9TUyBkYXRhIGJ1ZmZlciB0aGF0IHdhcyB0cmFuc21pdHRlZCAKKyAgICB0bE1ldGFJbmZvOiAgICBtZXRhIGluZm8gcmVsYXRlZCB0byB0aGUgZGF0YSBmcmFtZQorCisKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX1NUQUZldGNoUGt0Q0IgCisoIAorICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCisgIHZfVThfdCogICAgICAgICAgICAgICBwdWNTVEFJZCwKKyAgdl9VOF90ICAgICAgICAgICAgICAgIHVjQUMsCisgIHZvc19wa3RfdCoqICAgICAgICAgICB2b3NEYXRhQnVmZiwKKyAgV0xBTlRMX01ldGFJbmZvVHlwZSogIHRsTWV0YUluZm8KKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfU1RBUnhDQgorCisgIERFU0NSSVBUSU9OICAgCisgICAgVGhlIHJlY2VpdmUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIFRMLiAKKyAgICAKKyAgICBUTCB3aWxsIGNhbGwgdGhpcyB0byBub3RpZnkgdGhlIGNsaWVudCB3aGVuIGEgcGFja2V0IHdhcyByZWNlaXZlZCAKKyAgICBmb3IgYSByZWdpc3RlcmVkIFNUQS4KKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byAKKyAgICAgICAgICAgICAgICAgICAgVEwncyBvciBIREQncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSAKKyAgICAgICAgICAgICAgICAgICAgaXRzIGNvbnRleHQgCisgICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgVk9TUyBkYXRhIGJ1ZmZlciB0aGF0IHdhcyByZWNlaXZlZAorICAgICAgICAgICAgICAgICAgICAoaXQgbWF5IGJlIGEgbGlua2VkIGxpc3QpIAorICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIGlkCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9TVEFSeENCCisoCisgIHZfUFZPSURfdCAgICAgICAgICAgICAgcHZvc0dDdHgsIAorICB2b3NfcGt0X3QqICAgICAgICAgICAgIHZvc0RhdGFCdWZmLAorICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjU1RBSWQsIAorICBXTEFOVExfUnhNZXRhSW5mb1R5cGUqIHBSeE1ldGFJbmZvCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1R4Q29tcENCCisKKyAgREVTQ1JJUFRJT04gICAKKyAgICBUaGUgdHggY29tcGxldGUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIFRMLiAKKyAgICAKKyAgICBUTCB3aWxsIGNhbGwgdGhpcyB0byBub3RpZnkgdGhlIGNsaWVudCB3aGVuIGEgdHJhbnNtaXNzaW9uIGZvciBhIAorICAgIHBhY2tldCAgaGFzIGVuZGVkLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byAKKyAgICAgICAgICAgICAgICAgICAgVEwvSEFML1BFL0JBUC9IREQgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gCisgICAgICAgICAgICAgICAgICAgIGl0cyBjb250ZXh0IAorICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIFZPU1MgZGF0YSBidWZmZXIgdGhhdCB3YXMgdHJhbnNtaXR0ZWQgCisgICAgd1R4U1RBdHVzOiAgICAgIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXNzaW9uIAorCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9UeENvbXBDQgorKCAKKyAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCisgIHZvc19wa3RfdCogICAgIHZvc0RhdGFCdWZmLAorICBWT1NfU1RBVFVTICAgICB3VHhTVEF0dXMgCispOworCisvKiBDYWxsYmFja3MgUmVnaXN0ZXJlZCB3aXRoIFRMIGJ5IFdMQU5UTF9SZWdpc3RlckJBUENsaWVudCAqLworCisvKiBSU04gQ2FsbGJhY2sgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgREVTQ1JJUFRJT04gICAKKyAgICBUaGUgcmVjZWl2ZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwgZm9yIEJBUC4gCisgICAgCisgICAgVGhlIHJlZ2lzdGVyZWQgcmVjZXB0aW9uIGNhbGxiYWNrIGlzIGJlaW5nIHRyaWdnZXJlZCBieSBUTCB3aGVuZXZlciBhIAorICAgIGZyYW1lIHdhcyByZWNlaXZlZCBhbmQgaXQgd2FzIGZpbHRlcmVkIGFzIGEgbm9uLWRhdGEgQlQgQU1QIHBhY2tldC4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdk9TUyBidWZmZXIgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgcGFja2V0OyAKKyAgICAgICAgICAgICAgICAgICAgbm8gY2hhaW5pbmcgd2lsbCBiZSBkb25lIG9uIHRoaXMgcGF0aCAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1dMQU5UTF9CQVBSeENCVHlwZSBXTEFOQkFQX1RMUnNuUnhDYWxsYmFjaworKAorIHZfUFZPSURfdCAgICAgICAgIHB2b3NHQ3R4LAorIHZvc19wa3RfdCogICAgICAgIHZvc0RhdGFCdWZmCispOyAKKworLyogRmx1c2ggY29tcGxldGUgQ2FsbGJhY2sgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgREVTQ1JJUFRJT04gICAKKyAgICBDYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwgZm9yIEJBUCwgdGhpcyBpcyByZXF1aXJlZCBpbm9yZGVyIGZvcgorICAgIFRMIHRvIGluZm9ybSBCQVAsIHRoYXQgdGhlIGZsdXNoIG9wZXJhdGlvbiByZXF1ZXN0ZWQgaGFzIGJlZW4gY29tcGxldGVkLiAKKyAgICAKKyAgICBUaGUgcmVnaXN0ZXJlZCByZWNlcHRpb24gY2FsbGJhY2sgaXMgYmVpbmcgdHJpZ2dlcmVkIGJ5IFRMIHdoZW5ldmVyIGEgCisgICAgZnJhbWUgU0lSX1RMX0hBTF9GTFVTSF9BQ19SU1AgaXMgcmVjZWl2ZWQgYnkgVEwgZnJvbSBIQUwuCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgdWNTdGFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQorICAgIHVjVGlkOiAgICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSB0c3BlYyAKKyAgICBzdGF0dXM6ICAgICAgICAgc3RhdHVzIG9mIHRoZSBGbHVzaCBvcGVyYXRpb24KKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgV0xBTkJBUF9UTEZsdXNoQ29tcENhbGxiYWNrCisoIAorICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgIHVjU3RhSWQsIAorICB2X1U4X3QgICAgICAgIHVjVElELCAKKyAgdl9VOF90ICAgICAgICBzdGF0dXMKKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIENTUiBSb2FtIChDb25uZWN0aW9uIFN0YXR1cykgY2FsbGJhY2sgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfUm9hbUNhbGxiYWNrKCkKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsYmFjayBmb3IgUm9hbSAoY29ubmVjdGlvbiBzdGF0dXMpIEV2ZW50cyAgCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICAgIHBDb250ZXh0OiAgaXMgdGhlIHBDb250ZXh0IHBhc3NlZCBpbiB3aXRoIHRoZSByb2FtIHJlcXVlc3QKKyAgICAgIHBQYXJhbTogaXMgYSBwb2ludGVyIHRvIGEgdENzclJvYW1JbmZvLCBzZWUgZGVmaW5pdGlvbiBvZiBlUm9hbUNtZFN0YXR1cyBhbmQKKyAgICAgIGVSb2FtQ21kUmVzdWx0OiBmb3IgZGV0YWlsIHZhbGlkIG1lbWJlcnMuIEl0IG1heSBiZSBOVUxMCisgICAgICByb2FtSWQ6IGlzIHRvIGlkZW50aWZ5IHRoZSBjYWxsYmFjayByZWxhdGVkIHJvYW0gcmVxdWVzdC4gMCBtZWFucyB1bnNvbGljaXRlZAorICAgICAgcm9hbVN0YXR1czogaXMgYSBmbGFnIGluZGljYXRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgY2FsbGJhY2sKKyAgICAgIHJvYW1SZXN1bHQ6IGlzIHRoZSByZXN1bHQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBlSEFMX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cworV0xBTkJBUF9Sb2FtQ2FsbGJhY2sKKygKKyAgdm9pZCAqcENvbnRleHQsIAorICB0Q3NyUm9hbUluZm8gKnBDc3JSb2FtSW5mbywKKyAgdEFOSV9VMzIgcm9hbUlkLCAKKyAgZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1cywgCisgIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQKKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFV0aWxpdHkgRnVuY3Rpb24gcHJvdG90eXBlcyAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9DbGVhbkNCCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2xlYXIgb3V0IGFsbCBmaWVsZHMgaW4gdGhlIEJBUCBjb250ZXh0LgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBCdGFtcEN0eDogIHBvaW50ZXIgdG8gdGhlIEJBUCBjb250cm9sIGJsb2NrCisgICAgZnJlZUZsYWc6ICAgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gZnJlZSBhbnkgYWxsb2NhdGlvbnMuCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBCQVAgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9DbGVhbkNCCisoIAorICBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4LAorICB2X1UzMl90IGZyZWVGbGFnIC8vIDAgLypkbyBub3QgZW1wdHkqLyk7CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9HZXRDdHhGcm9tU3RhSWQKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgaW5zaWRlIHRoZSBCVC1BTVAgUEFMIChCQVApIGxheWVyIHdoZW5ldmVyIHdlIG5lZWQgZWl0aGVyIHRoZQorICAgIEJTTCBjb250ZXh0IG9yIHRoZSBCVEFNUCBjb250ZXh0IGZyb20gdGhlIFN0YUlkLgorICAgIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHVjU1RBSWQ6ICAgVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgCisgICAKKyAgICBPVVQKKyAgICBoQnRhbXBIYW5kbGU6IEhhbmRsZSAocG9pbnRlciB0byBhIHBvaW50ZXIpIHRvIHJldHVybiB0aGUgCisgICAgICAgICAgICAgICAgICBidGFtcEhhbmRsZSB2YWx1ZSBpbi4KKyAgICBoSGRkSGRsOiAgICAgIEhhbmRsZSB0byByZXR1cm4gdGhlIEJTTCBjb250ZXh0IHBvaW50ZXIgaW4uCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgTlVMTCBwb2ludGVyOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5CQVBfR2V0Q3R4RnJvbVN0YUlkCisoIAorICB2X1U4X3QgICAgICAgICB1Y1NUQUlkLCAgLyogVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgKi8KKyAgcHRCdGFtcEhhbmRsZSAqaEJ0YW1wSGFuZGxlLCAgLyogSGFuZGxlIHRvIHJldHVybiBwZXIgYXBwIGJ0YW1wSGFuZGxlIHZhbHVlIGluICAqLyAKKyAgcHRCdGFtcENvbnRleHQgKmhCdGFtcENvbnRleHQsIC8qIEhhbmRsZSB0byByZXR1cm4gcGVyIGFzc29jIGJ0YW1wQ29udGV4dCB2YWx1ZSBpbiAgKi8gCisgIHZfUFZPSURfdCAgICAgKmhIZGRIZGwgLyogSGFuZGxlIHRvIHJldHVybiBCU0wgY29udGV4dCBpbiAqLworKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfR2V0U3RhSWRGcm9tTGlua0N0eAorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBpbnNpZGUgdGhlIEJULUFNUCBQQUwgKEJBUCkgbGF5ZXIgd2hlbmV2ZXIgd2UgbmVlZCB0aGUKKyAgICBTdGFJZCAob3IgaEhkZEhkbCkgZnJvbSB0aGUgQlRBTVAgY29udGV4dCBhbmQgcGh5X2xpbmtfaGFuZGxlLgorICAgIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGhCdGFtcEhhbmRsZTogSGFuZGxlIChwb2ludGVyIHRvIGEgcG9pbnRlcikgdG8gcmV0dXJuIHRoZSAKKyAgICAgICAgICAgICAgICAgIGJ0YW1wSGFuZGxlIHZhbHVlIGluLgorICAgIHBoeV9saW5rX2hhbmRsZTogcGh5c2ljYWwgbGluayBoYW5kbGUgdmFsdWUuIFVuaXF1ZSBwZXIgYXNzb2MuIAorICAgIAorICAgIE9VVAorICAgIHB1Y1NUQUlkOiAgIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpIAorICAgIGhIZGRIZGw6ICAgSGFuZGxlIHRvIHJldHVybiB0aGUgQlNMIGNvbnRleHQgcG9pbnRlciBpbi4KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBOVUxMIHBvaW50ZXI7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9HZXRTdGFJZEZyb21MaW5rQ3R4CisoIAorICBwdEJ0YW1wSGFuZGxlICBidGFtcEhhbmRsZSwgIC8qIGJ0YW1wSGFuZGxlIHZhbHVlIGluICAqLyAKKyAgdl9VOF90ICAgICAgICAgcGh5X2xpbmtfaGFuZGxlLCAgLyogcGh5X2xpbmtfaGFuZGxlIHZhbHVlIGluICovCisgIHZfVThfdCAgICAgICAgKnB1Y1NUQUlkLCAgLyogVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgKi8KKyAgdl9QVk9JRF90ICAgICAqaEhkZEhkbCAvKiBIYW5kbGUgdG8gcmV0dXJuIEJTTCBjb250ZXh0ICovCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9DcmVhdGVOZXdQaHlMaW5rQ3R4CisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGluIG9yZGVyIHRvIGNyZWF0ZSAob3IgdXBkYXRlKSBhIEJBUCBQaHlzaWNhbCBMaW5rICJjb250ZXh0IgorICAgIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGJ0YW1wSGFuZGxlOiAgICAgQkFQIGFwcCBjb250ZXh0IGhhbmRsZQorICAgIHBoeV9saW5rX2hhbmRsZTogcGh5X2xpbmtfaGFuZGxlIGZyb20gdGhlIENvbW1hbmQgCisgICAgcEhkZEhkbDogICAgICAgICBCU0wgcGFzc2VzIGluIGl0cyBzcGVjaWZpYyBjb250ZXh0CisgICAgCisgICAgT1VUCisgICAgaEJ0YW1wQ29udGV4dDogIEhhbmRsZSAocG9pbnRlciB0byBhIHBvaW50ZXIpIHRvIHJldHVybiB0aGUgCisgICAgICAgICAgICAgICAgICAgIHBlciAiUGh5IExpbmsiIHB0QnRhbXBDb250ZXh0IHZhbHVlIGluLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIE5VTEwgcG9pbnRlcjsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX0NyZWF0ZU5ld1BoeUxpbmtDdHgKKyggCisgIHB0QnRhbXBIYW5kbGUgIGJ0YW1wSGFuZGxlLAorICB2X1U4X3QgICAgICAgICBwaHlfbGlua19oYW5kbGUsIC8qICBJIGdldCBwaHlfbGlua19oYW5kbGUgZnJvbSB0aGUgQ29tbWFuZCAqLworICB2X1BWT0lEX3QgICAgICBwSGRkSGRsLCAgIC8qIEJTTCBwYXNzZXMgaW4gaXRzIHNwZWNpZmljIGNvbnRleHQgKi8KKyAgcHRCdGFtcENvbnRleHQgKmhCdGFtcENvbnRleHQsIC8qIEhhbmRsZSB0byByZXR1cm4gcGVyIGFzc29jIGJ0YW1wQ29udGV4dCB2YWx1ZSBpbiAgKi8gCisgIHRXTEFOX0JBUFJvbGUgIEJBUERldmljZVJvbGUgIC8qIE5lZWRlZCB0byBkZXRlcm1pbmUgd2hpY2ggTUFDIGFkZHJlc3MgdG8gdXNlIGZvciBzZWxmIE1BQyAgKi8KKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1VwZGF0ZVBoeUxpbmtDdHhTdGFJZAorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCB0byB1cGRhdGUgdGhlIFNUQUlkIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBQaHlzaWNhbCBMaW5rICJjb250ZXh0IgorICAgIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBCdGFtcENvbnRleHQ6ICAgcHRCdGFtcENvbnRleHQgdG8gdXBkYXRlLgorICAgIHVjU1RBSWQ6ICAgICAgICAgVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgCisgICAgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgTlVMTCBwb2ludGVyOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5CQVBfVXBkYXRlUGh5TGlua0N0eFN0YUlkCisoIAorICBwdEJ0YW1wQ29udGV4dCBwQnRhbXBDb250ZXh0LCAvKiBidGFtcENvbnRleHQgdmFsdWUgaW4gICovIAorICB2X1U4X3QgICAgICAgICB1Y1NUQUlkCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9DcmVhdGVOZXdMb2dMaW5rQ3R4CisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGluIG9yZGVyIHRvIGFsbG9jYXRlIGEgQkFQIExvZ2ljYWwgTGluayAiY29udGV4dCIgYW5kICJpbmRleCIKKyAgICAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwQnRhbXBDb250ZXh0OiAgUG9pbnRlciB0byB0aGUgcHRCdGFtcENvbnRleHQgdmFsdWUgaW4uCisgICAgcGh5X2xpbmtfaGFuZGxlOiBwaHlfbGlua19oYW5kbGUgaW52b2x2ZWQgCisgICAgCisgICAgT1VUCisgICAgcExvZ19saW5rX2hhbmRsZTogcmV0dXJuIHRoZSBsb2dfbGlua19oYW5kbGUgaGVyZSAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBOVUxMIHBvaW50ZXI7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9DcmVhdGVOZXdMb2dMaW5rQ3R4CisoIAorICBwdEJ0YW1wQ29udGV4dCBwQnRhbXBDb250ZXh0LCAvKiBwb2ludGVyIHRvIHRoZSBwZXIgYXNzb2MgYnRhbXBDb250ZXh0IHZhbHVlICovIAorICB2X1U4X3QgICAgICAgICBwaHlfbGlua19oYW5kbGUsIC8qICBJIGdldCBwaHlfbGlua19oYW5kbGUgZnJvbSB0aGUgQ29tbWFuZCAqLworICB2X1U4X3QgICAgICAgICB0eF9mbG93X3NwZWNbMThdLAorICB2X1U4X3QgICAgICAgICByeF9mbG93X3NwZWNbMThdLAorICB2X1UxNl90ICAgICAgICAgKnBMb2dfbGlua19oYW5kbGUgLyogIFJldHVybiB0aGUgbG9naWNhbCBsaW5rIGluZGV4IGhlcmUgKi8KKyk7CisKKyAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9wbWNGdWxsUHdyUmVxQ0IKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsYmFjayBwcm92aWRlIHRvIFBNQyBpbiB0aGUgcG1jUmVxdWVzdEZ1bGxQb3dlciBBUEkuIAorICAgIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGNhbGxiYWNrQ29udGV4dDogIFRoZSB1c2VyIHBhc3NlZCBpbiBhIGNvbnRleHQgdG8gaWRlbnRpZnkgCisgICAgc3RhdHVzOiAgICAgICAgICAgVGhlIGhhbFN0YXR1cyAKKyAgICAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBOb25lCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCAKK1dMQU5CQVBfcG1jRnVsbFB3clJlcUNCCisoIAorICB2b2lkICpjYWxsYmFja0NvbnRleHQsIAorICBlSGFsU3RhdHVzIHN0YXR1cworKTsKKyAgCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfUnhQcm9jTHNQa3QKKworICBERVNDUklQVElPTiAKKworICAgIFRoaXMgQVBJIHdpbGwgYmUgY2FsbGVkIHdoZW4gTGluayBTdXBlcnZpc2lvbiBmcmFtZXMgYXJlIHJlY2VpdmVkIGF0IEJBUAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBidGFtcEhhbmRsZTogVGhlIEJULUFNUCBQQUwgaGFuZGxlIHJldHVybmVkIGluIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwdWNBQzogICAgICAgUG9pbnRlciB0byByZXR1cm4gdGhlIGFjY2VzcyBjYXRlZ29yeSAKKyAgICBSeFByb3RvVHlwZTogUHJvdG9jb2wgdHlwZSBvZiBSZWNlaXZlZCBQYWNrZXQKKyAgICB2b3NEYXRhQnVmZjogVGhlIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDgwMi4zIGZyYW1lIHRvIGJlIAorICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkIHRvIEJUIEhDSSBEYXRhIFBhY2tldAorICAgCisgIFJFVFVSTiBWQUxVRQorCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZCAKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBCQVAgaGFuZGxlIGlzIE5VTEwgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOQkFQX1J4UHJvY0xzUGt0CisoIAorICBwdEJ0YW1wSGFuZGxlICAgICBidGFtcEhhbmRsZSwgCisgIHZfVThfdCAgICAgICAgICAgIHBoeV9saW5rX2hhbmRsZSwgIC8qIFVzZWQgYnkgQkFQIHRvIGluZGVudGlmeSB0aGUgV0xBTiBhc3NvYy4gKFN0YUlkKSAqLworICB2X1UxNl90ICAgICAgICAgICAgUnhQcm90b1R5cGUsICAgICAvKiBQcm90b2NvbCBUeXBlIGZyb20gdGhlIGZyYW1lIHJlY2VpdmVkICovCisgIHZvc19wa3RfdCAgICAgICAgICp2b3NSeExzQnVmZgorKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1R4TGlua1N1cGVydmlzaW9uUmVxKCkKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBMaW5rU3VwZXJ2aXNpb24gVHggUmVxdWVzdCBwcm9jZWR1cmUuVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBBUElzIHRoYXQgd2FudAorICAgIHRvIHRyYW5zbWl0IExpbmtTdXBlcnZpc2lvbiBQYWNrZXRzICAKKyAgICBDYWxscyBQa3RQZW5kaW5nIENCIHRvIGluZGljYXRlIGEgcGFja2V0IGlzIHBlbmRpbmcgZm9yIHRyYW5zbWlzc2lvbgorICAgIAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6IHBvaW50ZXIgdG8gdGhlIEJBUCBoYW5kbGUuICBSZXR1cm5lZCBmcm9tIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgICBwaHlfbGlua19oYW5kbGU6IFVzZWQgYnkgQkFQIHRvIGluZGVudGlmeSB0aGUgV0xBTiBhc3NvYy4gKFN0YUlkKQorICAgIHZvc0RhdGFCdWZmOlRoZSBhY3R1YWwgcGFja2V0IGJlaW5nIHNlbnQgaW4gVHggcmVxdWVzdAorICAgIHByb3RvVHlwZSA6IHNwZWNpZmllcyBpZiBpdCBpcyBhIExTIFJFUSBvciBMUyBSRVAgcGFja2V0IAorICAgIAorICAgICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBGYWlsdXJlIG9mIFRyYW5zbWl0IHByb2NlZHVyZSAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTCitXTEFOQkFQX1R4TGlua1N1cGVydmlzaW9uCisoIAorICBwdEJ0YW1wSGFuZGxlICAgICBidGFtcEhhbmRsZSwgCisgIHZfVThfdCAgICAgICAgICAgIHBoeV9saW5rX2hhbmRsZSwgIC8qIFVzZWQgYnkgQkFQIHRvIGluZGVudGlmeSB0aGUgV0xBTiBhc3NvYy4gKFN0YUlkKSAqLworICB2b3NfcGt0X3QgICAgICAgICAqdm9zRGF0YUJ1ZmYsCisgIHZfVTE2X3QgICAgICAgICAgIHByb3RvVHlwZQorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfUmVhZE1hY0NvbmZpZworCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgTUFDIGNvbmZpZyAoQWRkcmVzcyBhbmQgU1NJRCB0byBCVC1BTVAgY29udGV4dAorICAgICAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gQkFQJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIE5vbmUKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkCitXTEFOQkFQX1JlYWRNYWNDb25maWcKKyggCisgIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHggCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9OZWVkQlRDb2V4UHJpb3JpdHkKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgY2F1c2UgYSBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gQlRDIGZpcm13YXJlCisgICAgaWYgYSBjaGFuZ2UgaW4gcHJpb3JpdHkgaGFzIG9jY3VycmVkLiAgKEZyb20gQU1QJ3MgcG9pbnQtb2Ytdmlldy4pCisgICAgICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBIQUwncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgTm9uZQorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQKK1dMQU5CQVBfTmVlZEJUQ29leFByaW9yaXR5CisoIAorICBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4LCAKKyAgdl9VMzJfdCAgICAgICAgIG5lZWRDb2V4UHJpb3JpdHkKKyk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfUnhDYWxsYmFjaworCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFRMIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYWxsIGZyYW1lcyBleGNlcHQgZm9yIERhdGEgZnJhbWVzCisgICAgICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBCQVAncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICBwUGFja2V0ICAgICAgICAgVm9zIHBhY2tldAorICAgIGZyYW1lVHlwZSAgICAgICBGcmFtZSB0eXBlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgTm9uZQorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTkJBUF9SeENhbGxiYWNrCisoCisgICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsIAorICAgIHZvc19wa3RfdCAgICAgICAgICAgICAgKnBQYWNrZXQsCisgICAgV0xBTlRMX0JBUEZyYW1lRW51bVR5cGUgZnJhbWVUeXBlCispOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9Jbml0TGlua1N1cGVydmlzaW9uCisKKyAgREVTQ1JJUFRJT04gCisKKyAgICBUaGlzIEFQSSB3aWxsIGJlIGNhbGxlZCB3aGVuIExpbmsgU3VwZXJ2aXNpb24gbW9kdWxlIGlzIHRvIGJlIGluaXRpYWxpemVkIHdoZW4gY29ubmVjdGVkIGF0IEJBUAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBidGFtcEhhbmRsZTogVGhlIEJULUFNUCBQQUwgaGFuZGxlIHJldHVybmVkIGluIFdMQU5CQVBfR2V0TmV3SG5kbC4KKyAgIAorICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgQkFQIGhhbmRsZSBpcyBOVUxMICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBUWF9MU19EQVRBTEVOICAgMzIKKworVk9TX1NUQVRVUworV0xBTkJBUF9Jbml0TGlua1N1cGVydmlzaW9uCisoIAorICBwdEJ0YW1wSGFuZGxlICAgICBidGFtcEhhbmRsZQorKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfRGVJbml0TGlua1N1cGVydmlzaW9uCisKKyAgREVTQ1JJUFRJT04gCisKKyAgICBUaGlzIEFQSSB3aWxsIGJlIGNhbGxlZCB3aGVuIExpbmsgU3VwZXJ2aXNpb24gbW9kdWxlIGlzIHRvIGJlIHN0b3BwZWQgYWZ0ZXIgZGlzY29ubmVjdGVkIGF0IEJBUCAKKworICBQQVJBTUVURVJTIAorCisgICAgYnRhbXBIYW5kbGU6IFRoZSBCVC1BTVAgUEFMIGhhbmRsZSByZXR1cm5lZCBpbiBXTEFOQkFQX0dldE5ld0huZGwuCisgICAKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIEJBUCBoYW5kbGUgaXMgTlVMTCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5CQVBfRGVJbml0TGlua1N1cGVydmlzaW9uCisoIAorICBwdEJ0YW1wSGFuZGxlICAgICBidGFtcEhhbmRsZSAKKyk7CisKK3ZvaWQgV0xBTl9CQVBFc3RhYmxpc2hMb2dpY2FsTGluayhwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQpOworCisgI2lmZGVmIF9fY3BsdXNwbHVzCisgfQorCisKKyNlbmRpZiAKKworCisjZW5kaWYgLyogI2lmbmRlZiBXTEFOX1FDVF9XTEFOQkFQX0lOVEVSTkFMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcE1vZHVsZS5jIGIvQ09SRS9CQVAvc3JjL2JhcE1vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhY2RlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYmFwTW9kdWxlLmMKQEAgLTAsMCArMSwxMzk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIGIgYSBwIE0gbyBkIHUgbCBlIC4gQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgT1ZFUlZJRVc6CisgIAorICBUaGlzIHNvZnR3YXJlIHVuaXQgaG9sZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXTEFOIEJBUCBtb2R1bGVzCisgIE1vZHVsZSBzdXBwb3J0IGZ1bmN0aW9ucy4gSXQgaXMgYWxzbyB3aGVyZSB0aGUgZ2xvYmFsIEJBUCBtb2R1bGUKKyAgY29udGV4dCwgYW5kIHBlci1pbnN0YW5jZSAocmV0dXJuZWQgaW4gQkFQX09wZW4gZGV2aWNlIG9wZW4pIGNvbnRleHRzLiAKKyAgCisgIFRoZSBmdW5jdGlvbnMgZXh0ZXJuYWxpemVkIGJ5IHRoaXMgbW9kdWxlIGFyZSB0byBiZSBjYWxsZWQgYnkgdGhlIGRldmljZQorICBzcGVjaWZpYyBCQVAgU2hpbSBMYXllciAoQlNMKSAoaW4gSEREKSB3aGljaCBpbXBsZW1lbnRzIGEgc3RyZWFtIGRldmljZSBvbiBhCisgIHBhcnRpY3VsYXIgcGxhdGZvcm0uCisKKyAgREVQRU5ERU5DSUVTOiAKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4gCisgIAorICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAgJEhlYWRlcjogL2hvbWUvbGFidXNlci9hbXBCbHVlWl8yL0NPUkUvQkFQL3NyYy9iYXBNb2R1bGUuYyx2IDEuMSAyMDEwLzA3LzEyIDE5OjA1OjM1IGxhYnVzZXIgRXhwIGxhYnVzZXIgJCREYXRlVGltZSQkQXV0aG9yOiBsYWJ1c2VyICQKKworCisgIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwMDgtMDktMTUgICAgamV6ICAgICBDcmVhdGVkIG1vZHVsZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gUHVsbCBpbiBzb21lIG1lc3NhZ2UgdHlwZXMgdXNlZCBieSBCVEMKKyNpbmNsdWRlICJzaXJQYXJhbXMuaCIKKy8vI2luY2x1ZGUgImhhbEZ3QXBpLmgiCisgCisjaW5jbHVkZSAid2xhbl9xY3RfdGwuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKy8vIFBpY2sgdXAgdGhlIHNtZSBjYWxsYmFjayByZWdpc3RyYXRpb24gQVBJCisjaW5jbHVkZSAic21lX0FwaS5oIgorI2luY2x1ZGUgImNjbUFwaS5oIgorCisvKiBCVC1BTVAgUEFMIEFQSSBoZWFkZXIgZmlsZSAqLyAKKyNpbmNsdWRlICJiYXBBcGkuaCIgCisjaW5jbHVkZSAiYmFwSW50ZXJuYWwuaCIgCisKKy8vIFBpY2sgdXAgdGhlIEJUQU1QIFJTTiBkZWZpbml0aW9ucworI2luY2x1ZGUgImJhcFJzblR4UnguaCIKKy8vI2luY2x1ZGUgImFzc2VydC5oIiAKKyNpbmNsdWRlICJiYXBBcGlUaW1lci5oIgorCisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9MSU5VWCkgfHwgZGVmaW5lZChBTklfT1NfVFlQRV9BTkRST0lEKQorI2luY2x1ZGUgImJhcF9oZGRfbWFpbi5oIgorI2VuZGlmCisKKy8vI2RlZmluZSBCQVBfREVCVUcKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8jZGVmaW5lIFZPU19HRVRfQkFQX0NCKGN0eCkgdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0JBUCwgY3R4KSAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHbG9iYWwgRGF0YSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyAgaW5jbHVkZSB0aGUgcGh5IGxpbmsgc3RhdGUgbWFjaGluZSBzdHJ1Y3R1cmUgaGVyZQorc3RhdGljIHRXTEFOX0JBUGJhcFBoeXNMaW5rTWFjaGluZSBiYXBQaHlzTGlua01hY2hpbmVJbml0aWFsIAorICAgID0gQlRBTVBGU01fSU5TVEFOQ0VEQVRBX0lOSVQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEV4dGVybmFsIGRlY2xhcmF0aW9ucyBmb3IgZ2xvYmFsIGNvbnRleHQgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vICBObyEgIEdldCB0aGlzIGZyb20gVk9TLgorLy8gIFRoZSBtYWluIHBlci1QaHlzaWNhbCBMaW5rIChwZXIgV0xBTiBhc3NvY2lhdGlvbikgY29udGV4dC4KKy8vdEJ0YW1wQ29udGV4dCBidGFtcEN0eDsKK3B0QnRhbXBDb250ZXh0ICBncEJ0YW1wQ3R4ID0gTlVMTDsgCisKKy8vICBJbmNsdWRlIHRoZSBMb2NhbCBBTVAgSW5mbyBzdHJ1Y3R1cmUuCit0QnRhbXBIQ0lfQU1QX0luZm8gICAgICAgIGJ0YW1wSENJX0FNUF9JbmZvOworLy8gIEluY2x1ZGUgdGhlIExvY2FsIERhdGEgQmxvY2sgU2l6ZSBpbmZvIHN0cnVjdHVyZS4KK3RCdGFtcEhDSV9EYXRhX0Jsb2NrX1NpemUgYnRhbXBIQ0lfRGF0YV9CbG9ja19TaXplOworLy8gIEluY2x1ZGUgdGhlIExvY2FsIFZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUuCit0QnRhbXBIQ0lfVmVyc2lvbl9JbmZvICAgYnRhbXBIQ0lfVmVyc2lvbl9JbmZvOworLy8gIEluY2x1ZGUgdGhlIExvY2FsIFN1cHBvcnRlZCBDbWRzIGluZm8gc3RydWN0dXJlLgordEJ0YW1wSENJX1N1cHBvcnRlZF9DbWRzICBidGFtcEhDSV9TdXBwb3J0ZWRfQ21kczsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcEJ0U3RhT3duTWFjQWRkcltXTklfQ0ZHX0JTU0lEX0xFTl07CisKKyAvKkJULUFNUCBTU0lEOyBwZXIgc3BlYyBzaG91bGQgaGF2ZSB0aGlzIGZvcm1hdDogIkFNUC0wMC0wYS1mNS0wNC0wNS0wOCIgKi8KKyNkZWZpbmUgV0xBTl9CQVBfU1NJRF9NQVhfTEVOIDIxIAorc3RhdGljIGNoYXIgcEJ0U3RhT3duU3NpZFtXTEFOX0JBUF9TU0lEX01BWF9MRU5dOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsaXplZCBGdW5jdGlvbiBEZWZpbml0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9PcGVuCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGF0IGRyaXZlciBpbml0aWFsaXphdGlvbiAodm9zX29wZW4pLiBCQVAgd2lsbCBpbml0aWFsaXplIAorICAgIGFsbCBpdHMgaW50ZXJuYWwgcmVzb3VyY2VzIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjYWxsIHRvIHN0YXJ0IHRvIAorICAgIHJlZ2lzdGVyIHdpdGggdGhlIG90aGVyIG1vZHVsZXMuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIEJBUCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIEJBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX09wZW4KKyggCisgIHZfUFZPSURfdCAgcHZvc0dDdHggCispCit7CisgIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHggPSBOVUxMOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBbGxvY2F0ZSAoYW5kIHNhbml0eSBjaGVjaz8hKSBCQVAgY29udHJvbCBibG9jayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHZvc19hbGxvY19jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX0JBUCwgKHZfVk9JRF90KiopJnBCdGFtcEN0eCwgc2l6ZW9mKHRCdGFtcENvbnRleHQpKTsKKworICBwQnRhbXBDdHggPSBWT1NfR0VUX0JBUF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwQnRhbXBDdHggKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOQkFQX09wZW4iKTsKKyAgICAgICAgICAgICAgICAgLy8iRmFpbGVkIHRvIGFsbG9jYXRlIEJBUCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTkJBUF9PcGVuIik7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2xlYW4gdXAgQkFQIGNvbnRyb2wgYmxvY2ssIGluaXRpYWxpemUgYWxsIHZhbHVlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5CQVBfT3BlbiIpOworCisgIFdMQU5CQVBfQ2xlYW5DQihwQnRhbXBDdHgsIDAgLypkbyBub3QgZW1wdHkqLyk7CisKKyAgLy8gU2V0dXAgdGhlICJsaW5rIGJhY2siIHRvIHRoZSBWT1NTIGNvbnRleHQKKyAgcEJ0YW1wQ3R4LT5wdm9zR0N0eCA9IHB2b3NHQ3R4OworICAgCisgIC8vIFN0b3JlIGEgcG9pbnRlciB0byB0aGUgQkFQIGNvbnRleHQgcHJvdmlkZWQgYnkgVk9TUworICBncEJ0YW1wQ3R4ID0gcEJ0YW1wQ3R4OworICAKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBbGxvY2F0ZSBpbnRlcm5hbCByZXNvdXJjZXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOQkFQX09wZW4gKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9TdGFydAorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBhcyBwYXJ0IG9mIHRoZSBvdmVyYWxsIHN0YXJ0IHByb2NlZHVyZSAodm9zX3N0YXJ0KS4gQkFQIHdpbGwgCisgICAgdXNlIHRoaXMgY2FsbCB0byByZWdpc3RlciB3aXRoIFRMIGFzIHRoZSBCQVAgZW50aXR5IGZvciAKKyAgICBCVC1BTVAgUlNOIGZyYW1lcy4gCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gQkFQJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gQkFQIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgICBPdGhlciBjb2RlcyBjYW4gYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgYSBCQUwgZmFpbHVyZTsKKyAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5CQVBfU3RhcnQKKyggCisgIHZfUFZPSURfdCAgcHZvc0dDdHggCispCit7CisgIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHggPSBOVUxMOyAKKyAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1czsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgICBFeHRyYWN0IEJBUCBjb250cm9sIGJsb2NrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcEJ0YW1wQ3R4ID0gVk9TX0dFVF9CQVBfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcEJ0YW1wQ3R4ICkgCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOQkFQX1N0YXJ0Iik7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUmVnaXN0ZXIgd2l0aCBUTCBhcyBhbiBCVC1BTVAgUlNOICBjbGllbnQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJXTEFOQkFQX1N0YXJ0IFRMIHJlZ2lzdGVyIik7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSZWdpc3RlciB3aXRoIENTUiBmb3IgUm9hbSAoY29ubmVjdGlvbiBzdGF0dXMpIEV2ZW50cyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJXTEFOQkFQX1N0YXJ0IENTUiBSZWdpc3RlciIpOworCisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgQkFQIFR4IHBhY2tldCBtb25pdG9yIHRpbWVyICovCisgIFdMQU5CQVBfSW5pdENvbm5lY3Rpb25BY2NlcHRUaW1lciAocEJ0YW1wQ3R4ICk7CisgIFdMQU5CQVBfSW5pdExpbmtTdXBlcnZpc2lvblRpbWVyKHBCdGFtcEN0eCk7CisKKyAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX2luaXQoIAorICAgICAgICAgICZwQnRhbXBDdHgtPmJhcFR4UGt0TW9uaXRvclRpbWVyLAorICAgICAgICAgIFZPU19USU1FUl9UWVBFX1NXLCAvKiB1c2UgdGhpcyB0eXBlICovCisgICAgICAgICAgV0xBTkJBUF9UeFBhY2tldE1vbml0b3JIYW5kbGVyLAorICAgICAgICAgIHBCdGFtcEN0eCk7CisKKyAgdm9zU3RhdHVzID0gdm9zX2xvY2tfaW5pdCgmcEJ0YW1wQ3R4LT5iYXBMb2NrKTsKKyAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJMb2NrIEluaXQgRmFpbCIpOworICB9CisKKyAgcmV0dXJuIHZvc1N0YXR1czsKK30vKiBXTEFOQkFQX1N0YXJ0ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX1N0b3AKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgdm9zX3N0b3AgdG8gc3RvcCBvcGVyYXRpb24gaW4gQkFQLCBiZWZvcmUgY2xvc2UuIEJBUCB3aWxsIHN1c3BlbmQgYWxsIAorICAgIEJULUFNUCBQcm90b2NvbCBBZGFwdGlvbiBMYXllciBvcGVyYXRpb24gYW5kIHdpbGwgd2FpdCBmb3IgdGhlIGNsb3NlIAorICAgIHJlcXVlc3QgdG8gY2xlYW4gdXAgaXRzIHJlc291cmNlcy4gCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gQkFQJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gQkFQIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5CQVBfU3RvcAorKCAKKyAgdl9QVk9JRF90ICBwdm9zR0N0eCAKKykKK3sKKyAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCA9IE5VTEw7IAorICBWT1NfU1RBVFVTICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgRXh0cmFjdCBCQVAgY29udHJvbCBibG9jayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBCdGFtcEN0eCA9IFZPU19HRVRfQkFQX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBCdGFtcEN0eCApIAorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiSW52YWxpZCBCQVAgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5CQVBfU3RvcCIpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFN0b3AgQkFQIChkZS1yZWdpc3RlciBSU04gaGFuZGxlciE/KSAgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b3NTdGF0dXMgPSBXTEFOQkFQX0RlaW5pdENvbm5lY3Rpb25BY2NlcHRUaW1lcihwQnRhbXBDdHgpOworICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiQ291bGRuJ3QgZGVzdHJveSAgYmFwQ29ubmVjdGlvbkFjY2VwdFRpbWVyIik7CisgIH0KKworICB2b3NTdGF0dXMgPSBXTEFOQkFQX0RlaW5pdExpbmtTdXBlcnZpc2lvblRpbWVyKHBCdGFtcEN0eCk7CisgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJDb3VsZG4ndCBkZXN0cm95ICBiYXBMaW5rU3VwZXJ2aXNpb25UaW1lciIpOworICB9CisKKyAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX2Rlc3Ryb3kgKCAKKyAgICAmcEJ0YW1wQ3R4LT5iYXBUeFBrdE1vbml0b3JUaW1lciApOworICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiQ291bGRuJ3QgZGVzdHJveSAgYmFwVHhQa3RNb25pdG9yVGltZXIiKTsKKyAgfQorICB2b3NfbG9ja19kZXN0cm95KCZwQnRhbXBDdHgtPmJhcExvY2spOworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5CQVBfU3RvcCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9DbG9zZQorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBieSB2b3NfY2xvc2UgZHVyaW5nIGdlbmVyYWwgZHJpdmVyIGNsb3NlIHByb2NlZHVyZS4gQkFQIHdpbGwgY2xlYW4gdXAgCisgICAgYWxsIHRoZSBpbnRlcm5hbCByZXNvdXJjZXMuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIEJBUCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIEJBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX0Nsb3NlCisoIAorICB2X1BWT0lEX3QgIHB2b3NHQ3R4IAorKQoreworICBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4ID0gTlVMTDsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgRXh0cmFjdCBCQVAgY29udHJvbCBibG9jayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBCdGFtcEN0eCA9IFZPU19HRVRfQkFQX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBCdGFtcEN0eCApIAorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiSW52YWxpZCBCQVAgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5CQVBfQ2xvc2UiKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDbGVhbnVwIEJBUCBjb250cm9sIGJsb2NrLiAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJXTEFOQkFQX0Nsb3NlIik7CisgIFdMQU5CQVBfQ2xlYW5DQihwQnRhbXBDdHgsIDEgLyogZW1wdHkgcXVldWVzL2xpc3RzL3BrdHMgaWYgYW55Ki8pOworI2lmIChkZWZpbmVkKEFOSV9PU19UWVBFX0xJTlVYKSB8fCBkZWZpbmVkKEFOSV9PU19UWVBFX0FORFJPSUQpKSYmIGRlZmluZWQoV0xBTl9CVEFNUF9GRUFUVVJFKQorICBCU0xfRGVpbml0KHB2b3NHQ3R4KTsKKyNlbmRpZgorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZyZWUgQkFQIGNvbnRleHQgZnJvbSBWT1NTIGdsb2JhbCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfQkFQLCBwQnRhbXBDdHgpOworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5CQVBfQ2xvc2UgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSEREIGludGVyZmFjZXMgLSBQZXIgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24gCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfR2V0TmV3SG5kbAorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBieSBIREQgYXQgZHJpdmVyIG9wZW4gKEJTTF9PcGVuKS4gQkFQIHdpbGwgaW5pdGlhbGl6ZSAKKyAgICBhbGxvY2F0ZSBhIHBlci1pbnN0YW5jZSAiZmlsZSBoYW5kbGUiIGVxdWl2YWxlbnQgZm9yIHRoaXMgc3BlY2lmaWMKKyAgICBvcGVuIGNhbGwuIAorICAgIAorICAgIFRoZXJlIHNob3VsZCBvbmx5IGV2ZXIgYmUgb25lIGNhbGwgdG8gQlNMX09wZW4uICBTaW5jZSAKKyAgICB0aGUgb3BlbiBhcHAgdXNlciBpcyB0aGUgQlQgc3RhY2suCisgICAgCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgaEJ0YW1wSGFuZGxlOiAgIEhhbmRsZSB0byByZXR1cm4gYnRhbXBIYW5kbGUgdmFsdWUgaW4uCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBCQVAgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK1ZPU19TVEFUVVMgCitXTEFOQkFQX0dldE5ld0huZGwKKyggCisgICBwdEJ0YW1wSGFuZGxlICpoQnRhbXBIYW5kbGUgIC8qIEhhbmRsZSB0byByZXR1cm4gYnRhbXBIYW5kbGUgdmFsdWUgaW4gICovIAorKQoreworICBwdEJ0YW1wQ29udGV4dCAgYnRhbXBDb250ZXh0ID0gTlVMTDsgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIHBhcmFtcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBOVUxMID09IGhCdGFtcEhhbmRsZSkgCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJBUCBoYW5kbGUgcG9pbnRlciBpbiBXTEFOQkFQX0dldE5ld0huZGwiKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyNpZm5kZWYgQlRBTVBfTVVMVElQTEVfUEhZX0xJTktTCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIHRoZSBCQVAgY29udHJvbCBibG9jayBwb2ludGVyIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBOVUxMID09IGdwQnRhbXBDdHggKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBCQVAgcG9pbnRlciBpbiBXTEFOQkFQX0dldE5ld0huZGwiKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLy8qaEJ0YW1wSGFuZGxlID0gKHB0QnRhbXBIYW5kbGUpICZidGFtcEN0eDsgCisgIC8qIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHRCdGFtcENvbnRleHQgc3RydWN0dXJlIC0gYWxsb2NhdGVkIGJ5IFZPUyBmb3IgdXMgKi8gCisgICpoQnRhbXBIYW5kbGUgPSAocHRCdGFtcEhhbmRsZSkgZ3BCdGFtcEN0eDsgCisgIGJ0YW1wQ29udGV4dCA9IGdwQnRhbXBDdHg7IAorCisgIC8qIFVwZGF0ZSB0aGUgTUFDIGFkZHJlc3MgYW5kIFNTSUQgaWYgaW4gY2FzZSB0aGUgUmVhZCBMb2NhbCBBTVAgQXNzb2MKKyAgICogUmVxdWVzdCBpcyBtYWRlIGJlZm9yZSBDcmVhdGUgUGh5c2ljYWwgTGluayBjcmVhdGlvbi4KKyAgICovCisgIFdMQU5CQVBfUmVhZE1hY0NvbmZpZyAoYnRhbXBDb250ZXh0KTsKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbHNlIC8vIGRlZmluZWQoQlRBTVBfTVVMVElQTEVfUEhZX0xJTktTKQorI2VuZGlmIC8vQlRBTVBfTVVMVElQTEVfUEhZX0xJTktTCit9LyogV0xBTkJBUF9HZXROZXdIbmRsICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfUmVsZWFzZUhuZGwKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgSEREIGF0IGRyaXZlciBvcGVuIChCU0xfQ2xvc2UpLiBCQVAgd2lsbCByZWNsYWltIChpbnZhbGlkYXRlKSAKKyAgICB0aGUgImZpbGUgaGFuZGxlIiBwYXNzZWQgaW50byB0aGlzIGNhbGwuCisgICAgCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgYnRhbXBIYW5kbGU6ICAgYnRhbXBIYW5kbGUgdmFsdWUgdG8gaW52YWxpZGF0ZS4KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBidGFtcEhhbmRsZSBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX1JlbGVhc2VIbmRsCisoIAorICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlICAvKiBidGFtcCBoYW5kbGUgdmFsdWUgdG8gcmVsZWFzZSAgKi8gCispCit7CisgIC8qIG9idGFpbiBidGFtcCBDb250ZXh0ICAqLyAKKyAgcHRCdGFtcENvbnRleHQgIGJ0YW1wQ29udGV4dCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7IAorICB0SGFsSGFuZGxlIGhhbEhhbmRsZTsKKyAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayBwYXJhbXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggTlVMTCA9PSBidGFtcEhhbmRsZSkgCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJBUCBoYW5kbGUgdmFsdWUgaW4gV0xBTkJBUF9SZWxlYXNlSG5kbCIpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKiBKRVowODEwMDE6IFRPRE86IE1ham9yOiAqLyAKKyAgLyogQ2hlY2sgdG8gc2VlIGlmIGFueSB3aXJlbGVzcyBhc3NvY2lhdGlvbnMgYXJlIHN0aWxsIGFjdGl2ZSAqLworICAvKiAuLi5pZiBzbywgSSBoYXZlIHRvIGNhbGwgCisgICAqIHNtZV9Sb2FtRGlzY29ubmVjdChWT1NfR0VUX0hBTF9DQihidGFtcEhhbmRsZS0+cHZvc0dDdHgpLCAKKyAgICogICAgICAgIGJ0YW1wSGFuZGxlLT5zZXNzaW9uSWQsIAorICAgKiAgICAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsgCisgICAqIG9uIGFsbCBvZiB0aGVtICAqLyAKKworICBoYWxIYW5kbGUgPSBWT1NfR0VUX0hBTF9DQihidGFtcENvbnRleHQtPnB2b3NHQ3R4KTsKKyAgaWYoTlVMTCA9PSBoYWxIYW5kbGUpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImhhbEhhbmRsZSBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIGlmKCBidGFtcENvbnRleHQtPmlzQmFwU2Vzc2lvbk9wZW4gPT0gVFJVRSApCisgIHsKKyAgICBoYWxTdGF0dXMgPSBzbWVfQ2xvc2VTZXNzaW9uKGhhbEhhbmRsZSwgCisgICAgICAgICAgICBidGFtcENvbnRleHQtPnNlc3Npb25JZCwgTlVMTCwgTlVMTCk7CisgICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBoYWxTdGF0dXMpCisgICAgeworICAgICAgYnRhbXBDb250ZXh0LT5pc0JhcFNlc3Npb25PcGVuID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgLyogcmVsZWFzZSB0aGUgYnRhbXBIYW5kbGUgICovIAorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTkJBUF9SZWxlYXNlSG5kbCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFV0aWxpdHkgRnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX0NsZWFuQ0IKKworICBERVNDUklQVElPTiAKKyAgICBDbGVhciBvdXQgYWxsIGZpZWxkcyBpbiB0aGUgQkFQIGNvbnRleHQuCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcEJ0YW1wQ3R4OiAgcG9pbnRlciB0byB0aGUgQkFQIGNvbnRyb2wgYmxvY2sKKyAgICBmcmVlRmxhZzogICBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBmcmVlIGFueSBhbGxvY2F0aW9ucy4KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIEJBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX0NsZWFuQ0IKKyggCisgIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHgsCisgIHZfVTMyX3QgZnJlZUZsYWcgLy8gMCAvKmRvIG5vdCBlbXB0eSovKTsKKykKK3sKKyAgdl9VMTZfdCAgICAgICAgIGk7IC8qIExvZ2ljYWwgTGluayBpbmRleCAqLworICB0cEJ0YW1wTG9nTGlua0N0eCAgcExvZ0xpbmtDb250ZXh0ID0gTlVMTDsKKyAKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgQkFQIGNvbnRyb2wgYmxvY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGlmICggTlVMTCA9PSBwQnRhbXBDdHggKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgaW4gV0xBTkJBUF9DbGVhbkNCIik7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2xlYW4gdXAgQkFQIGNvbnRyb2wgYmxvY2ssIGluaXRpYWxpemUgYWxsIHZhbHVlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5CQVBfQ2xlYW5DQiIpOworCisgIC8vIEZpcnN0LCBjbGVhciBvdXQgRVZFUllUSElORyBpbiB0aGUgQlQtQU1QIGNvbnRleHQKKyAgdm9zX21lbV9zZXQoIHBCdGFtcEN0eCwgc2l6ZW9mKCAqcEJ0YW1wQ3R4KSwgMCk7CisKKyAgcEJ0YW1wQ3R4LT5wdm9zR0N0eCA9IE5VTEw7CisKKyAgLy8gSW5pdGlhbGl6ZSBwaHlzaWNhbCBsaW5rIHN0YXRlIG1hY2hpbmUgdG8gRElTQ09OTkVDVEVEIHN0YXRlCisgIC8vcEJ0YW1wQ3R4LT5iYXBQaHlzTGlua01hY2hpbmUgPSBCVEFNUEZTTV9JTlNUQU5DRURBVEFfSU5JVDsKKyAgIAorICAvLyBJbml0aWFsaXplIHBoeXNpY2FsIGxpbmsgc3RhdGUgbWFjaGluZSB0byBESVNDT05ORUNURUQgc3RhdGUKKyAgdm9zX21lbV9jb3B5KCAKKyAgICAgICAgICAmcEJ0YW1wQ3R4LT5iYXBQaHlzTGlua01hY2hpbmUsCisgICAgICAgICAgJmJhcFBoeXNMaW5rTWFjaGluZUluaXRpYWwsICAgLyogQlRBTVBGU01fSU5TVEFOQ0VEQVRBX0lOSVQ7ICovCisgICAgICAgICAgc2l6ZW9mKCBwQnRhbXBDdHgtPmJhcFBoeXNMaW5rTWFjaGluZSkpOworCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogSW5pdGlhbGl6aW5nIFN0YXRlOiAlZCIsIF9fRlVOQ1RJT05fXywgYmFwUGh5c0xpbmtNYWNoaW5lSW5pdGlhbC5zdGF0ZVZhcik7ICAgCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogSW5pdGlhbGl6ZWQgU3RhdGU6ICVkIiwgX19GVU5DVElPTl9fLCAgcEJ0YW1wQ3R4LT5iYXBQaHlzTGlua01hY2hpbmUuc3RhdGVWYXIpOyAKKworICAvL1ZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnRhbXBDb250ZXh0IHZhbHVlOiAleCIsIF9fRlVOQ1RJT05fXywgIHBCdGFtcEN0eCk7IAorI2lmZGVmIEJBUF9ERUJVRworICAvKiBUcmFjZSB0aGUgdEJ0YW1wQ3R4IGJlaW5nIHBhc3NlZCBpbi4gKi8KKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICJXTEFOIEJBUCBDb250ZXh0IE1vbml0b3I6IHBCdGFtcEN0eCB2YWx1ZSA9ICV4IGluICVzOiVkIiwgcEJ0YW1wQ3R4LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fICk7CisjZW5kaWYgLy9CQVBfREVCVUcKKworCisgIHBCdGFtcEN0eC0+c2Vzc2lvbklkID0gMDsKKyAgcEJ0YW1wQ3R4LT5wQXBwSGRsID0gTlVMTDsgLy8gUGVyLWFwcCBCU0wgY29udGV4dAorICBwQnRhbXBDdHgtPnBIZGRIZGwgPSBOVUxMOyAvLyBQZXItYXBwIEJTTCBjb250ZXh0CisgIC8qIDggYml0cyBvZiBwaHlfbGlua19oYW5kbGUgaWRlbnRpZmllcyB0aGlzIGFzc29jaWF0aW9uICovCisgIHBCdGFtcEN0eC0+cGh5X2xpbmtfaGFuZGxlID0gMDsgIAorICBwQnRhbXBDdHgtPmNoYW5uZWwgPSAwOyAKKyAgcEJ0YW1wQ3R4LT5CQVBEZXZpY2VSb2xlID0gQlRfUkVTUE9OREVSOyAgCisgIHBCdGFtcEN0eC0+dWNTVEFJZCA9IDA7ICAKKworICAvLyBnTmVlZFBoeXNMaW5rQ29tcEV2ZW50CisgIHBCdGFtcEN0eC0+Z05lZWRQaHlzTGlua0NvbXBFdmVudCA9IFZPU19GQUxTRTsKKyAgLy8gZ1BoeXNMaW5rU3RhdHVzIAorICBwQnRhbXBDdHgtPmdQaHlzTGlua1N0YXR1cyA9IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1M7CisgIC8vIGdEaXNjUmVxdWVzdGVkCisgIHBCdGFtcEN0eC0+Z0Rpc2NSZXF1ZXN0ZWQgPSBWT1NfRkFMU0U7CisgIC8vIGdEaXNjUmVhc29uIAorICBwQnRhbXBDdHgtPmdEaXNjUmVhc29uID0gV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsKKworICAvKiBDb25uZWN0aW9uIEFjY2VwdCBUaW1lciBpbnRlcnZhbCovCisgIHBCdGFtcEN0eC0+YmFwQ29ubmVjdGlvbkFjY2VwdFRpbWVySW50ZXJ2YWwgPSBXTEFOQkFQX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQ7ICAKKyAgLyogTGluayBTdXBlcnZpc2lvbiBUaW1lciBpbnRlcnZhbCovCisgIHBCdGFtcEN0eC0+YmFwTGlua1N1cGVydmlzaW9uVGltZXJJbnRlcnZhbCA9IFdMQU5CQVBfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUOyAgCisgIC8qIExvZ2ljYWwgTGluayBBY2NlcHQgVGltZXIgaW50ZXJ2YWwqLworICBwQnRhbXBDdHgtPmJhcExvZ2ljYWxMaW5rQWNjZXB0VGltZXJJbnRlcnZhbCA9IFdMQU5CQVBfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUOyAgCisgIC8qIEJlc3QgRWZmb3J0IEZsdXNoIHRpbWVyIGludGVydmFsKi8KKyAgcEJ0YW1wQ3R4LT5iYXBCRUZsdXNoVGltZXJJbnRlcnZhbCA9IFdMQU5CQVBfQkVfRkxVU0hfVElNRU9VVDsgIAorCisgIC8vIEluY2x1ZGUgdGhlIGFzc29jaWF0aW9ucyBNQUMgYWRkcmVzc2VzCisgIHZvc19tZW1fY29weSggCisgICAgICAgICAgcEJ0YW1wQ3R4LT5zZWxmX21hY19hZGRyLCAKKyAgICAgICAgICBwQnRTdGFPd25NYWNBZGRyLCAgIC8qIFdoZXJlIGRvIEkgZ2V0IHRoZSBjdXJyZW50IE1BQyBhZGRyZXNzPyAqLworICAgICAgICAgIHNpemVvZihwQnRhbXBDdHgtPnNlbGZfbWFjX2FkZHIpKTsgCisKKyAgdm9zX21lbV9zZXQoIAorICAgICAgICAgIHBCdGFtcEN0eC0+cGVlcl9tYWNfYWRkciwgCisgICAgICAgICAgc2l6ZW9mKHBCdGFtcEN0eC0+cGVlcl9tYWNfYWRkciksCisgICAgICAgICAgMCk7IAorCisgIC8vIFRoZSBhcnJheSBvZiBsb2dpY2FsIGxpbmtzCisgIHBCdGFtcEN0eC0+Y3VycmVudF9sb2dfbGlua19pbmRleCA9IDA7ICAvKiBhc3NpZ25lZCBtb2QgMTYgKi8gIAorICBwQnRhbXBDdHgtPnRvdGFsX2xvZ19saW5rX2luZGV4ID0gMDsgIC8qIHNob3VsZCBuZXZlciBiZSA+MTYgKi8gIAorCisgIC8vIENsZWFyIHVwIHRoZSBhcnJheSBvZiBsb2dpY2FsIGxpbmtzCisgIGZvciAoaSA9IDA7IGkgPCBXTEFOQkFQX01BWF9MT0dfTElOS1MgOyBpKyspIAorICB7CisgICAgIHBMb2dMaW5rQ29udGV4dCA9ICZwQnRhbXBDdHgtPmJ0YW1wTG9nTGlua0N0eFtpXTsKKyAgICAgcExvZ0xpbmtDb250ZXh0LT5wcmVzZW50ID0gMDsgCisgICAgIHBMb2dMaW5rQ29udGV4dC0+dVR4UGt0Q29tcGxldGVkID0gMDsKKyAgICAgcExvZ0xpbmtDb250ZXh0LT5sb2dfbGlua19oYW5kbGUgPSAwOworICB9CisKKworICAvLyBJbmNsdWRlIHRoZSBIREQgQkFQIFNoaW0gTGF5ZXIgY2FsbGJhY2tzIGZvciBGZXRjaCwgVHhDb21wLCBhbmQgUnhQa3QKKyAgcEJ0YW1wQ3R4LT5wZm5CdGFtcEZldGNoUGt0Q0IgPSBOVUxMOyAgIAorICBwQnRhbXBDdHgtPnBmbkJ0YW1wX1NUQVJ4Q0IgPSBOVUxMOyAgIAorICBwQnRhbXBDdHgtPnBmbkJ0YW1wVHhDb21wQ0IgPSBOVUxMOyAgIAorICAvKiBJbXBsZW1lbnRzIHRoZSBjYWxsYmFjayBmb3IgQUxMIGFzeW5jaHJvbm91cyBldmVudHMuICovIAorICBwQnRhbXBDdHgtPnBCYXBIQ0lFdmVudENCID0gTlVMTDsgICAKKworICAvKiBTZXQgdGhlIGRlZmF1bHQgZm9yIGV2ZW50IG1hc2sgKi8gCisgIHZvc19tZW1fc2V0KCAKKyAgICAgICAgICBwQnRhbXBDdHgtPmV2ZW50X21hc2tfcGFnZV8yLCAKKyAgICAgICAgICBzaXplb2YocEJ0YW1wQ3R4LT5ldmVudF9tYXNrX3BhZ2VfMiksCisgICAgICAgICAgMCk7IAorCisgIC8qIFNldCB0aGUgZGVmYXVsdCBmb3IgbG9jYXRpb24gZGF0YS4gKi8gCisgIHBCdGFtcEN0eC0+YnRhbXBfTG9jYXRpb25fRGF0YV9JbmZvLmxvY19vcHRpb25zID0gMHg1ODsgICAKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGRhdGEgdHJhbnNmZXIgbW9kZSAqLyAKKyAgcEJ0YW1wQ3R4LT51Y0RhdGFUcmFmZmljTW9kZSA9IFdMQU5CQVBfRkxPV19DT05UUk9MX01PREVfQkxPQ0tfQkFTRUQ7CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOQkFQX0NsZWFuQ0IgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfR2V0Q3R4RnJvbVN0YUlkCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGluc2lkZSB0aGUgQlQtQU1QIFBBTCAoQkFQKSBsYXllciB3aGVuZXZlciB3ZSBuZWVkIGVpdGhlciB0aGUKKyAgICBCU0wgY29udGV4dCBvciB0aGUgQlRBTVAgY29udGV4dCBmcm9tIHRoZSBTdGFJZC4KKyAgICAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB1Y1NUQUlkOiAgIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpIAorICAgCisgICAgT1VUCisgICAgaEJ0YW1wSGFuZGxlOiBIYW5kbGUgKHBvaW50ZXIgdG8gYSBwb2ludGVyKSB0byByZXR1cm4gdGhlIAorICAgICAgICAgICAgICAgICAgYnRhbXBIYW5kbGUgdmFsdWUgaW4uCisgICAgaEhkZEhkbDogICAgICBIYW5kbGUgdG8gcmV0dXJuIHRoZSBCU0wgY29udGV4dCBwb2ludGVyIGluLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIE5VTEwgcG9pbnRlcjsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX0dldEN0eEZyb21TdGFJZAorKCAKKyAgdl9VOF90ICAgICAgICAgdWNTVEFJZCwgIC8qIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpICovCisgIHB0QnRhbXBIYW5kbGUgKmhCdGFtcEhhbmRsZSwgIC8qIEhhbmRsZSB0byByZXR1cm4gcGVyIGFwcCBidGFtcEhhbmRsZSB2YWx1ZSBpbiAgKi8gCisgIHB0QnRhbXBDb250ZXh0ICpoQnRhbXBDb250ZXh0LCAvKiBIYW5kbGUgdG8gcmV0dXJuIHBlciBhc3NvYyBidGFtcENvbnRleHQgdmFsdWUgaW4gICovIAorICB2X1BWT0lEX3QgICAgICpoSGRkSGRsIC8qIEhhbmRsZSB0byByZXR1cm4gQlNMIGNvbnRleHQgaW4gKi8KKykKK3sKKyNpZm5kZWYgQlRBTVBfTVVMVElQTEVfUEhZX0xJTktTCisKKyAgICAvKiBGb3Igbm93LCB3ZSBrbm93IHRoZXJlIGlzIG9ubHkgb25lIGFwcGxpY2F0aW9uIGNvbnRleHQgKi8gCisgICAgLyogLi4uYW5kIG9ubHkgb25lIHBoeXNpY2FsIGxpbmsgY29udGV4dCAqLyAKKyAgICAvLypoQnRhbXBIYW5kbGUgPSAmKChwdEJ0YW1wQ29udGV4dCkgYnRhbXBDdHgpOyAgCisgICAgLy8qaEJ0YW1wSGFuZGxlID0gJmJ0YW1wQ3R4OyAgCisgICAgKmhCdGFtcEhhbmRsZSA9ICh2X1ZPSURfdCopZ3BCdGFtcEN0eDsgIAorICAKKyAgICAvLypoQnRhbXBDb250ZXh0ID0gJmJ0YW1wQ3R4OworICAgICpoQnRhbXBDb250ZXh0ID0gZ3BCdGFtcEN0eDsKKworICAgIC8qIEhhbmRsZSB0byByZXR1cm4gQlNMIGNvbnRleHQgaW4gKi8KKyAgICAvLypoSGRkSGRsID0gYnRhbXBDdHgucEhkZEhkbDsgIAorICAgICpoSGRkSGRsID0gZ3BCdGFtcEN0eC0+cEhkZEhkbDsgIAorCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbHNlIC8vIGRlZmluZWQoQlRBTVBfTVVMVElQTEVfUEhZX0xJTktTKQorCisjZW5kaWYgLy9CVEFNUF9NVUxUSVBMRV9QSFlfTElOS1MKK30vKiBXTEFOQkFQX0dldEN0eEZyb21TdGFJZCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9HZXRTdGFJZEZyb21MaW5rQ3R4CisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGluc2lkZSB0aGUgQlQtQU1QIFBBTCAoQkFQKSBsYXllciB3aGVuZXZlciB3ZSBuZWVkIHRoZQorICAgIFN0YUlkIChvciBoSGRkSGRsKSBmcm9tIHRoZSBCVEFNUCBjb250ZXh0IGFuZCBwaHlfbGlua19oYW5kbGUuCisgICAgCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgaEJ0YW1wSGFuZGxlOiBIYW5kbGUgKHBvaW50ZXIgdG8gYSBwb2ludGVyKSB0byByZXR1cm4gdGhlIAorICAgICAgICAgICAgICAgICAgYnRhbXBIYW5kbGUgdmFsdWUgaW4uCisgICAgcGh5X2xpbmtfaGFuZGxlOiBwaHlzaWNhbCBsaW5rIGhhbmRsZSB2YWx1ZS4gVW5pcXVlIHBlciBhc3NvYy4gCisgICAgCisgICAgT1VUCisgICAgcHVjU1RBSWQ6ICAgVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgCisgICAgaEhkZEhkbDogICBIYW5kbGUgdG8gcmV0dXJuIHRoZSBCU0wgY29udGV4dCBwb2ludGVyIGluLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIE5VTEwgcG9pbnRlcjsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX0dldFN0YUlkRnJvbUxpbmtDdHgKKyggCisgIHB0QnRhbXBIYW5kbGUgIGJ0YW1wSGFuZGxlLCAgLyogYnRhbXBIYW5kbGUgdmFsdWUgaW4gICovIAorICB2X1U4X3QgICAgICAgICBwaHlfbGlua19oYW5kbGUsICAvKiBwaHlfbGlua19oYW5kbGUgdmFsdWUgaW4gKi8KKyAgdl9VOF90ICAgICAgICAqcHVjU1RBSWQsICAvKiBUaGUgU3RhSWQgKHVzZWQgYnkgVEwsIFBFLCBhbmQgSEFMKSAqLworICB2X1BWT0lEX3QgICAgICpoSGRkSGRsIC8qIEhhbmRsZSB0byByZXR1cm4gQlNMIGNvbnRleHQgKi8KKykKK3sKKyNpZm5kZWYgQlRBTVBfTVVMVElQTEVfUEhZX0xJTktTCisgICAgcHRCdGFtcENvbnRleHQgICAgICAgICAgIHBCdGFtcEN0eCA9IChwdEJ0YW1wQ29udGV4dCkgYnRhbXBIYW5kbGU7IAorICAgIAorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNhbml0eSBjaGVjayBwYXJhbXMKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBOVUxMID09IHBCdGFtcEN0eCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBCQVAgaGFuZGxlIHZhbHVlIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvKiBTaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBwaHlzaWNhbCBsaW5rLi4ud2UgaGF2ZSBzdG9yZWQgYWxsCisgICAgICogdGhlIHBoeXNpY2FsIGxpbmsgc3BlY2lmaWMgY29udGV4dCBpbiB0aGUgYXBwbGljYXRpb24gY29udGV4dCAKKyAgICAgKi8gCisgICAgLyogVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgKi8KKyAgICAqcHVjU1RBSWQgPSBwQnRhbXBDdHgtPnVjU1RBSWQ7ICAKKworICAgIC8qIEhhbmRsZSB0byByZXR1cm4gQlNMIGNvbnRleHQgKi8KKyAgICAqaEhkZEhkbCA9IHBCdGFtcEN0eC0+cEhkZEhkbDsgIAorCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbHNlIC8vIGRlZmluZWQoQlRBTVBfTVVMVElQTEVfUEhZX0xJTktTKQorCisjZW5kaWYgLy9CVEFNUF9NVUxUSVBMRV9QSFlfTElOS1MKK30vKiBXTEFOQkFQX0dldFN0YUlkRnJvbUxpbmtDdHggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfQ3JlYXRlTmV3UGh5TGlua0N0eAorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBpbiBvcmRlciB0byBjcmVhdGUgKG9yIHVwZGF0ZSkgYSBCQVAgUGh5c2ljYWwgTGluayAiY29udGV4dCIKKyAgICAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBidGFtcEhhbmRsZTogICAgIEJBUCBhcHAgY29udGV4dCBoYW5kbGUKKyAgICBwaHlfbGlua19oYW5kbGU6IHBoeV9saW5rX2hhbmRsZSBmcm9tIHRoZSBDb21tYW5kIAorICAgIHBIZGRIZGw6ICAgICAgICAgQlNMIHBhc3NlcyBpbiBpdHMgc3BlY2lmaWMgY29udGV4dAorICAgIAorICAgIE9VVAorICAgIGhCdGFtcENvbnRleHQ6ICBIYW5kbGUgKHBvaW50ZXIgdG8gYSBwb2ludGVyKSB0byByZXR1cm4gdGhlIAorICAgICAgICAgICAgICAgICAgICBwZXIgIlBoeSBMaW5rIiBwdEJ0YW1wQ29udGV4dCB2YWx1ZSBpbi4KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBOVUxMIHBvaW50ZXI7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTkJBUF9DcmVhdGVOZXdQaHlMaW5rQ3R4CisoIAorICBwdEJ0YW1wSGFuZGxlICBidGFtcEhhbmRsZSwKKyAgdl9VOF90ICAgICAgICAgcGh5X2xpbmtfaGFuZGxlLCAvKiAgSSBnZXQgcGh5X2xpbmtfaGFuZGxlIGZyb20gdGhlIENvbW1hbmQgKi8KKyAgdl9QVk9JRF90ICAgICAgcEhkZEhkbCwgICAvKiBCU0wgcGFzc2VzIGluIGl0cyBzcGVjaWZpYyBjb250ZXh0ICovCisgIHB0QnRhbXBDb250ZXh0ICpoQnRhbXBDb250ZXh0LCAvKiBIYW5kbGUgdG8gcmV0dXJuIHBlciBhc3NvYyBidGFtcENvbnRleHQgdmFsdWUgaW4gICovIAorICB0V0xBTl9CQVBSb2xlICBCQVBEZXZpY2VSb2xlCispCit7CisjaWZuZGVmIEJUQU1QX01VTFRJUExFX1BIWV9MSU5LUworICBwdEJ0YW1wQ29udGV4dCAgcEJ0YW1wQ3R4ID0gZ3BCdGFtcEN0eDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyogUmVhZCBhbmQgU2V0IE1BQyBhZGRyZXNzIGFuZCBTU0lEIHRvIEJULUFNUCBjb250ZXh0ICovCisgIFdMQU5CQVBfUmVhZE1hY0NvbmZpZyAocEJ0YW1wQ3R4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZvciBub3csIHByZXN1bWUgc2VjdXJpdHkgaXMgbm90IGVuYWJsZWQuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBCdGFtcEN0eC0+dWNTZWNFbmFibGVkID0gV0xBTkJBUF9TRUNVUklUWV9FTkFCTEVEX1NUQVRFOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSW5pdGlhbCBTaG9ydCBSYW5nZSBNb2RlIGZvciB0aGlzIHBoeXNpY2FsIGxpbmsgaXMgJ2Rpc2FibGVkJworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwQnRhbXBDdHgtPnBoeV9saW5rX3NybSA9IDA7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDbGVhciBvdXQgdGhlIGxvZ2ljYWwgbGlua3MuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBCdGFtcEN0eC0+Y3VycmVudF9sb2dfbGlua19pbmRleCA9IDA7CisgIHBCdGFtcEN0eC0+dG90YWxfbG9nX2xpbmtfaW5kZXggPSAwOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTm93IGNvbmZpZ3VyZSB0aGUgcm9hbWluZyBwcm9maWxlIGxpbmtzLiBUbyBTU0lEIGFuZCBic3NpZC4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLy8gV2UgaGF2ZSByb29tIGZvciB0d28gU1NJRHMuICAKKyAgcEJ0YW1wQ3R4LT5jc3JSb2FtUHJvZmlsZS5TU0lEcy5udW1PZlNTSURzID0gMTsgLy8gVGhpcyBpcyB0cnVlIGZvciBub3cuICAKKyAgcEJ0YW1wQ3R4LT5jc3JSb2FtUHJvZmlsZS5TU0lEcy5TU0lETGlzdCA9IHBCdGFtcEN0eC0+U1NJRExpc3Q7ICAvL0FycmF5IG9mIHR3byAgCisgIHBCdGFtcEN0eC0+Y3NyUm9hbVByb2ZpbGUuU1NJRHMuU1NJRExpc3RbMF0uU1NJRC5sZW5ndGggPSAwOworICBwQnRhbXBDdHgtPmNzclJvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0WzBdLmhhbmRvZmZQZXJtaXR0ZWQgPSBWT1NfRkFMU0U7CisgIHBCdGFtcEN0eC0+Y3NyUm9hbVByb2ZpbGUuU1NJRHMuU1NJRExpc3RbMF0uc3NpZEhpZGRlbiA9IFZPU19GQUxTRTsKKworICBwQnRhbXBDdHgtPmNzclJvYW1Qcm9maWxlLkJTU0lEcy5udW1PZkJTU0lEcyA9IDE7IC8vIFRoaXMgaXMgdHJ1ZSBmb3Igbm93LiAgCisgIHBCdGFtcEN0eC0+Y3NyUm9hbVByb2ZpbGUuQlNTSURzLmJzc2lkID0gJnBCdGFtcEN0eC0+YnNzaWQ7ICAKKworICAvLyBOb3cgY29uZmlndXJlIHRoZSBhdXRoIHR5cGUgaW4gdGhlIHJvYW1pbmcgcHJvZmlsZS4gVG8gb3Blbi4KKyAgLy9wQnRhbXBDdHgtPmNzclJvYW1Qcm9maWxlLkF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07IC8vIG9wZW4gaXMgdGhlIGRlZmF1bHQgIAorICAvL3BCdGFtcEN0eC0+Y3NyUm9hbVByb2ZpbGUubmVnb3RpYXRlZEF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07IC8vIG9wZW4gaXMgdGhlIGRlZmF1bHQgIAorICBwQnRhbXBDdHgtPmNzclJvYW1Qcm9maWxlLm5lZ290aWF0ZWRBdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX1JTTl9QU0s7ICAgCisgIHBCdGFtcEN0eC0+Y3NyUm9hbVByb2ZpbGUubmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM7ICAKKworICBwQnRhbXBDdHgtPnBoeV9saW5rX2hhbmRsZSA9IHBoeV9saW5rX2hhbmRsZTsKKyAgLyogRm9yIG5vdywgd2Uga25vdyB0aGVyZSBpcyBvbmx5IG9uZSBwaHlzaWNhbCBsaW5rIGNvbnRleHQgKi8gCisgIC8vKmhCdGFtcENvbnRleHQgPSAmYnRhbXBDdHg7CisKKyAgcEJ0YW1wQ3R4LT5wSGRkSGRsID0gcEhkZEhkbDsKKworICAqaEJ0YW1wQ29udGV4dCA9IHBCdGFtcEN0eDsKKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiQnRhbXAgQ3R4dCA9ICV4IiwgcEJ0YW1wQ3R4KTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworI2Vsc2UgLy8gZGVmaW5lZChCVEFNUF9NVUxUSVBMRV9QSFlfTElOS1MpCisKKyNlbmRpZiAvL0JUQU1QX01VTFRJUExFX1BIWV9MSU5LUworfS8qIFdMQU5CQVBfQ3JlYXRlTmV3UGh5TGlua0N0eCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTkJBUF9VcGRhdGVQaHlMaW5rQ3R4U3RhSWQKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgdG8gdXBkYXRlIHRoZSBTVEFJZCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggUGh5c2ljYWwgTGluayAiY29udGV4dCIKKyAgICAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwQnRhbXBDb250ZXh0OiAgIHB0QnRhbXBDb250ZXh0IHRvIHVwZGF0ZS4KKyAgICB1Y1NUQUlkOiAgICAgICAgIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpIAorICAgIAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIE5VTEwgcG9pbnRlcjsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOQkFQX1VwZGF0ZVBoeUxpbmtDdHhTdGFJZAorKCAKKyAgcHRCdGFtcENvbnRleHQgcEJ0YW1wQ29udGV4dCwgLyogYnRhbXBDb250ZXh0IHZhbHVlIGluICAqLyAKKyAgdl9VOF90ICAgICAgICAgdWNTVEFJZAorKQoreworI2lmbmRlZiBCVEFNUF9NVUxUSVBMRV9QSFlfTElOS1MKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNhbml0eSBjaGVjayBwYXJhbXMKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBOVUxMID09IHBCdGFtcENvbnRleHQpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIGhhbmRsZSB2YWx1ZSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgKi8KKyAgICBwQnRhbXBDb250ZXh0LT51Y1NUQUlkID0gdWNTVEFJZDsgIAorCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbHNlIC8vIGRlZmluZWQoQlRBTVBfTVVMVElQTEVfUEhZX0xJTktTKQorCisjZW5kaWYgLy9CVEFNUF9NVUxUSVBMRV9QSFlfTElOS1MKK30vKiBXTEFOQkFQX1VwZGF0ZVBoeUxpbmtDdHhTdGFJZCAqLworCit2X1U4X3QgCitiYXBBbGxvY05leHRMb2dMaW5rSW5kZXgKKyggCisgIHB0QnRhbXBDb250ZXh0IHBCdGFtcENvbnRleHQsIC8qIFBvaW50ZXIgdG8gdGhlIHBlciBhc3NvYyBidGFtcENvbnRleHQgdmFsdWUgKi8gCisgIHZfVThfdCAgICAgICAgIHBoeV9saW5rX2hhbmRsZSAvKiAgSSBnZXQgcGh5X2xpbmtfaGFuZGxlIGZyb20gdGhlIENvbW1hbmQgKi8KKykKK3sKKyAgcmV0dXJuICsrKHBCdGFtcENvbnRleHQtPmN1cnJlbnRfbG9nX2xpbmtfaW5kZXgpICUgV0xBTkJBUF9NQVhfTE9HX0xJTktTOyAKK30vKiBiYXBBbGxvY05leHRMb2dMaW5rSW5kZXggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfQ3JlYXRlTmV3TG9nTGlua0N0eAorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBpbiBvcmRlciB0byBhbGxvY2F0ZSBhIEJBUCBMb2dpY2FsIExpbmsgImNvbnRleHQiIGFuZCAiaW5kZXgiCisgICAgCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcEJ0YW1wQ29udGV4dDogIFBvaW50ZXIgdG8gdGhlIHB0QnRhbXBDb250ZXh0IHZhbHVlIGluLgorICAgIHBoeV9saW5rX2hhbmRsZTogcGh5X2xpbmtfaGFuZGxlIGludm9sdmVkIAorICAgIAorICAgIE9VVAorICAgIHBMb2dfbGlua19oYW5kbGU6IHJldHVybiB0aGUgbG9nX2xpbmtfaGFuZGxlIGhlcmUgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgTlVMTCBwb2ludGVyOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5CQVBfQ3JlYXRlTmV3TG9nTGlua0N0eAorKCAKKyAgcHRCdGFtcENvbnRleHQgcEJ0YW1wQ29udGV4dCwgLyogUG9pbnRlciB0byB0aGUgcGVyIGFzc29jIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAKKyAgdl9VOF90ICAgICAgICAgcGh5X2xpbmtfaGFuZGxlLCAvKiAgSSBnZXQgcGh5X2xpbmtfaGFuZGxlIGZyb20gdGhlIENvbW1hbmQgKi8KKyAgdl9VOF90ICAgICAgICAgdHhfZmxvd19zcGVjWzE4XSwKKyAgdl9VOF90ICAgICAgICAgcnhfZmxvd19zcGVjWzE4XSwKKyAgdl9VMTZfdCAgICAgICAgICpwTG9nX2xpbmtfaGFuZGxlIC8qICBSZXR1cm4gdGhlIGxvZ2ljYWwgbGluayBpbmRleCBoZXJlICovCispCit7CisjaWZuZGVmIEJUQU1QX01VTFRJUExFX1BIWV9MSU5LUworICB2X1UxNl90ICAgICAgICAgaTsgLyogTG9naWNhbCBMaW5rIGluZGV4ICovCisgIHRwQnRhbXBMb2dMaW5rQ3R4ICAgICAgICBwTG9nTGlua0NvbnRleHQ7CisgIHZfVTMyX3QgICAgICAgICByZXR2YWw7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRm9yIG5vdywgYWxsb2NhdGUgdGhlIGxvZ2ljYWwgbGlua3Mgc2VyaWFsbHkuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGkgPSBwQnRhbXBDb250ZXh0LT5jdXJyZW50X2xvZ19saW5rX2luZGV4IAorICAgICAgPSBiYXBBbGxvY05leHRMb2dMaW5rSW5kZXgocEJ0YW1wQ29udGV4dCwgcGh5X2xpbmtfaGFuZGxlKTsKKyAgcEJ0YW1wQ29udGV4dC0+dG90YWxfbG9nX2xpbmtfaW5kZXgrKzsgCisKKyAgKnBMb2dfbGlua19oYW5kbGUgPSAoaSA8PCA4KSArICggdl9VMTZfdCApIHBoeV9saW5rX2hhbmRsZSA7IC8qICBSZXR1cm4gdGhlIGxvZ2ljYWwgbGluayBpbmRleCBoZXJlICovCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAiICVzOipwTG9nX2xpbmtfaGFuZGxlPSV4IiwgX19GVU5DVElPTl9fLCpwTG9nX2xpbmtfaGFuZGxlKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV2YWx1YXRlIHRoZSBUeCBhbmQgUnggRmxvdyBzcGVjaWZpY2F0aW9uIGZvciB0aGlzIGxvZ2ljYWwgbGluay4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLy8gQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBmbG93IHNwZWNzIHdpdGggc2VydmljZSB0eXBlcyBvZiBCRSAoMHgwMSkgCisKKyNpZmRlZiBCQVBfREVCVUcKKyAgLyogVHJhY2UgdGhlIHRCdGFtcEN0eCBiZWluZyBwYXNzZWQgaW4uICovCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAiV0xBTiBCQVAgQ29udGV4dCBNb25pdG9yOiBwQnRhbXBDb250ZXh0IHZhbHVlID0gJXggaW4gJXM6JWQiLCBwQnRhbXBDb250ZXh0LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fICk7CisjZW5kaWYgLy9CQVBfREVCVUcKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE5vdyBjb25maWd1cmUgdGhlIExvZ2ljYWwgTGluayBjb250ZXh0LgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwTG9nTGlua0NvbnRleHQgPSAmKHBCdGFtcENvbnRleHQtPmJ0YW1wTG9nTGlua0N0eFtpXSk7CisKKyAgLyogRXh0cmFjdCBUeCBmbG93IHNwZWMgaW50byB0aGUgY29udGV4dCBzdHJ1Y3R1cmUgKi8KKyAgcmV0dmFsID0gYnRhbXBVbnBhY2tUbHZGbG93X1NwZWMoKHZvaWQgKilwQnRhbXBDb250ZXh0LCB0eF9mbG93X3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fQkFQX1BBTF9GTE9XX1NQRUNfVExWX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMb2dMaW5rQ29udGV4dC0+YnRhbXBGbG93U3BlYyk7CisgIGlmIChyZXR2YWwgIT0gQlRBTVBfUEFSU0VfU1VDQ0VTUykKKyAgeworICAgIC8qIEZsb3cgc3BlYyBwYXJzaW5nIGZhaWxlZCwgcmV0dXJuIGZhaWx1cmUgKi8KKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0JBRE1TRzsKKyAgfQorCisgIC8qIFNhdmUgdGhlIExvZ2ljYWwgbGluayBoYW5kbGUgaW4gdGhlIGxvZ2ljYWwgbGluayBjb250ZXh0CisgICAgIEFzIG9mIG5vdywgb25seSB0aGUgaW5kZXggaXMgc2F2ZWQgYXMgbG9naWNhbCBsaW5rIGhhbmRsZSBzaW5jZQorICAgICBzYW1lIGlzIHJldHVybmVkIGluIHRoZSBldmVudC4KKyAgICAgRklYTUU6IERlY2lkZSB3aGV0aGVyIHRoaXMgaW5kZXggaGFzIHRvIGJlIGNvbWJpbmVkIHdpdGggcGh5c2ljYWwKKyAgICAgbGluayBoYW5kbGUgdG8gZ2VuZXJhdGUgdGhlIExvZ2ljYWwgbGluayBoYW5kbGUuCisgICAgICovCisgIHBMb2dMaW5rQ29udGV4dC0+bG9nX2xpbmtfaGFuZGxlID0gKnBMb2dfbGlua19oYW5kbGU7CisKKyAgLy8gTWFyayB0aGlzIGVudHJ5IGFzIE9DQ1VQSUVEIAorICBwTG9nTGlua0NvbnRleHQtPnByZXNlbnQgPSBWT1NfVFJVRTsKKyAgLy8gTm93IGluaXRpYWxpemUgdGhlIExvZ2ljYWwgTGluayBjb250ZXh0CisgIHBMb2dMaW5rQ29udGV4dC0+YnRhbXBBQyA9IDE7CisgIC8vIE5vdyBpbml0aWFsaXplIHRoZSB2YWx1ZXMgaW4gdGhlIExvZ2ljYWwgTGluayBjb250ZXh0CisgIHBMb2dMaW5rQ29udGV4dC0+dWNUSUQgPSAwOyAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgQkUgVElEICgweDAwKQorICBwTG9nTGlua0NvbnRleHQtPnVjVVAgPSAwOworICBwTG9nTGlua0NvbnRleHQtPnVUeFBrdENvbXBsZXRlZCA9IDA7CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbHNlIC8vIGRlZmluZWQoQlRBTVBfTVVMVElQTEVfUEhZX0xJTktTKQorCisjZW5kaWYgLy9CVEFNUF9NVUxUSVBMRV9QSFlfTElOS1MKK30vKiBXTEFOQkFQX0NyZWF0ZU5ld0xvZ0xpbmtDdHggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfcG1jRnVsbFB3clJlcUNCCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGJhY2sgcHJvdmlkZSB0byBQTUMgaW4gdGhlIHBtY1JlcXVlc3RGdWxsUG93ZXIgQVBJLiAKKyAgICAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBjYWxsYmFja0NvbnRleHQ6ICBUaGUgdXNlciBwYXNzZWQgaW4gYSBjb250ZXh0IHRvIGlkZW50aWZ5IAorICAgIHN0YXR1czogICAgICAgICAgIFRoZSBoYWxTdGF0dXMgCisgICAgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgTm9uZQorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgCitXTEFOQkFQX3BtY0Z1bGxQd3JSZXFDQgorKCAKKyAgdm9pZCAqY2FsbGJhY2tDb250ZXh0LCAKKyAgZUhhbFN0YXR1cyBzdGF0dXMKKykKK3sKKworfS8qIFdMQU5CQVBfcG1jRnVsbFB3clJlcUNCICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfUmVhZE1hY0NvbmZpZworCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgTUFDIGNvbmZpZyAoQWRkcmVzcyBhbmQgU1NJRCB0byBCVC1BTVAgY29udGV4dAorICAgICAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gQkFQJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIE5vbmUKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkCitXTEFOQkFQX1JlYWRNYWNDb25maWcKKyggCisgIHB0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHggCispCit7CisgIHRBTklfVTMyICAgICAgICBsZW4gPSBXTklfQ0ZHX0JTU0lEX0xFTjsKKyAgdEhhbEhhbmRsZSAgICAgIHBNYWMgPSBOVUxMOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGVtcG9yYXJ5IG1ldGhvZCB0byBnZXQgdGhlIHNlbGYgTUFDIGFkZHJlc3MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKE5VTEwgPT0gcEJ0YW1wQ3R4KSAKKyAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJwQnRhbXBDdHggaXMgTlVMTCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgIHJldHVybjsKKyAgfQorCisgIHBNYWMgPSAodEhhbEhhbmRsZSl2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfU01FLCBwQnRhbXBDdHgtPnB2b3NHQ3R4KTsKKyAgaWYgKE5VTEwgPT0gcE1hYykgCisgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAicE1hYyBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgcmV0dXJuOworICB9CisKKyAgY2NtQ2ZnR2V0U3RyKCBwTWFjLCBXTklfQ0ZHX1NUQV9JRCwgcEJ0U3RhT3duTWFjQWRkciwgJmxlbiApOworCisgIFZPU19BU1NFUlQoIFdOSV9DRkdfQlNTSURfTEVOID09IGxlbiApOworICAKKyAgLyogRm9ybSB0aGUgU1NJRCBmcm9tIE1hYyBhZGRyZXNzICovCisgIFZPU19TTlBSSU5URiggcEJ0U3RhT3duU3NpZCwgV0xBTl9CQVBfU1NJRF9NQVhfTEVOLAorICAgICAgICAgICAgIkFNUC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeCIsCisgICAgICAgICAgICBwQnRTdGFPd25NYWNBZGRyWzBdLCBwQnRTdGFPd25NYWNBZGRyWzFdLCBwQnRTdGFPd25NYWNBZGRyWzJdLCAKKyAgICAgICAgICAgIHBCdFN0YU93bk1hY0FkZHJbM10sIHBCdFN0YU93bk1hY0FkZHJbNF0sIHBCdFN0YU93bk1hY0FkZHJbNV0pOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2V0IHRoZSBNQUMgYWRkcmVzcyBmb3IgdGhpcyBpbnN0YW5jZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b3NfbWVtX2NvcHkoIAorICAgICAgICAgIHBCdGFtcEN0eC0+c2VsZl9tYWNfYWRkciwgCisgICAgICAgICAgcEJ0U3RhT3duTWFjQWRkciwKKyAgICAgICAgICBzaXplb2YocEJ0YW1wQ3R4LT5zZWxmX21hY19hZGRyKSk7IAorIAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNldCBvdXIgU1NJRCB2YWx1ZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwQnRhbXBDdHgtPm93blNzaWRMZW4gPSAyMTsgCisgIHZvc19tZW1fY29weSgKKyAgICAgICAgICBwQnRhbXBDdHgtPm93blNzaWQsIAorICAgICAgICAgIHBCdFN0YU93blNzaWQsCisgICAgICAgICAgcEJ0YW1wQ3R4LT5vd25Tc2lkTGVuKTsgCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOQkFQX05lZWRCVENvZXhQcmlvcml0eQorCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBjYXVzZSBhIG1lc3NhZ2UgdG8gYmUgc2VudCB0byBCVEMgZmlybXdhcmUKKyAgICBpZiBhIGNoYW5nZSBpbiBwcmlvcml0eSBoYXMgb2NjdXJyZWQuICAoRnJvbSBBTVAncyBwb2ludC1vZi12aWV3LikKKworICBERVBFTkRFTkNJRVMgCisKKyAgUEFSQU1FVEVSUyAKKworICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIEhBTCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBOb25lCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8gR2xvYmFsCitzdGF0aWMgaW50IGdCYXBDb2V4UHJpb3JpdHkgPSAwOworCit2b2lkCitXTEFOQkFQX05lZWRCVENvZXhQcmlvcml0eQorKCAKKyAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCwgCisgIHZfVTMyX3QgICAgICAgICBuZWVkQ29leFByaW9yaXR5CispCit7CisgIHRIYWxIYW5kbGUgICAgICBwTWFjID0gTlVMTDsKKyAgdFNtZUJ0QW1wRXZlbnQgIGJ0QW1wRXZlbnQ7CisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJldHJpZXZlIHRoZSBwTWFjIChIQUwgY29udGV4dCkKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcE1hYyA9ICh0SGFsSGFuZGxlKXZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9TTUUsIHBCdGFtcEN0eC0+cHZvc0dDdHgpOworCisgIC8vIElzIHJlLWVudHJhbmN5IHByb3RlY3Rpb24gbmVlZGVkIGZvciB0aGlzPworICBpZiAobmVlZENvZXhQcmlvcml0eSAhPSBnQmFwQ29leFByaW9yaXR5KSB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAiQ2FsbGluZyAlcyB3aXRoIG5lZWRDb2V4UHJpb3JpdHk9JWQuIiwgX19GVU5DVElPTl9fLCBuZWVkQ29leFByaW9yaXR5KTsKKyAKKyAgICBnQmFwQ29leFByaW9yaXR5ID0gbmVlZENvZXhQcmlvcml0eTsKKyAgICBzd2l0Y2ggKCBuZWVkQ29leFByaW9yaXR5KQorICAgIHsKKyAgICAgIGNhc2UgMDogIC8qIElkbGUgKi8KKyAgICAgICAgICBidEFtcEV2ZW50LmJ0QW1wRXZlbnRUeXBlID0gQlRBTVBfRVZFTlRfQ09OTkVDVElPTl9URVJNSU5BVEVEOworICAgICAgICAgIHBCdGFtcEN0eC0+YnRhbXBfc2Vzc2lvbl9vbiA9IEZBTFNFOworICAgICAgICAgIHNtZV9zZW5kQlRBbXBFdmVudChwTWFjLCBidEFtcEV2ZW50KTsKKworICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDE6ICAvKiBBc3NvY2lhdGluZyAqLworICAgICAgICAgIGJ0QW1wRXZlbnQuYnRBbXBFdmVudFR5cGUgPSBCVEFNUF9FVkVOVF9DT05ORUNUSU9OX1NUQVJUOworICAgICAgICAgIHBCdGFtcEN0eC0+YnRhbXBfc2Vzc2lvbl9vbiA9IFRSVUU7CisgICAgICAgICAgc21lX3NlbmRCVEFtcEV2ZW50KHBNYWMsIGJ0QW1wRXZlbnQpOworCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjogIC8qIFBvc3QtYXNzb2MgKi8KKyAgICAgICAgICBidEFtcEV2ZW50LmJ0QW1wRXZlbnRUeXBlID0gQlRBTVBfRVZFTlRfQ09OTkVDVElPTl9TVE9QOworICAgICAgICAgIHNtZV9zZW5kQlRBbXBFdmVudChwTWFjLCBidEFtcEV2ZW50KTsKKworICAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIENvZXhpc3RlbmNlIHByaW9yaXR5IHJlcXVlc3Q6ICVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5lZWRDb2V4UHJpb3JpdHkpOworICAgIH0KKworICB9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5CQVBfUnhDYWxsYmFjaworCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFRMIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYWxsIGZyYW1lcyBleGNlcHQgZm9yIERhdGEgZnJhbWVzCisgICAgICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBCQVAncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICBwUGFja2V0ICAgICAgICAgVm9zIHBhY2tldAorICAgIGZyYW1lVHlwZSAgICAgICBGcmFtZSB0eXBlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgTm9uZQorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTkJBUF9SeENhbGxiYWNrCisoCisgICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsIAorICAgIHZvc19wa3RfdCAgICAgICAgICAgICAgKnBQYWNrZXQsCisgICAgV0xBTlRMX0JBUEZyYW1lRW51bVR5cGUgZnJhbWVUeXBlCispCit7CisgICAgcHRCdGFtcENvbnRleHQgIHBCdGFtcEN0eCA9IE5VTEw7IAorCisgICAgcEJ0YW1wQ3R4ID0gVk9TX0dFVF9CQVBfQ0IocHZvc0dDdHgpOworICAgIGlmICggTlVMTCA9PSBwQnRhbXBDdHggKSAKKyAgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiSW52YWxpZCBCQVAgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5CQVBfU3RhcnQiKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgc3dpdGNoIChmcmFtZVR5cGUpCisgICAgeworICAgICAgY2FzZSBXTEFOVExfQlRfQU1QX1RZUEVfTFNfUkVROiAgLyogRmFsbCB0aHJvdWdoICovCisgICAgICBjYXNlIFdMQU5UTF9CVF9BTVBfVFlQRV9MU19SRVA6CisgICAgICB7CisgICAgICAgICAgLyogTGluayBzdXBlcnZpc2lvbiBmcmFtZSwgcHJvY2VzcyB0aGlzIGZyYW1lICovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICIlczogbGluayBTdXBlcnZpc2lvbiBwYWNrZXQgcmVjZWl2ZWQgb3ZlciBUTDogJWQsID0+IEJBUCIsCisgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZyYW1lVHlwZSk7CisgICAgICAgICAgV0xBTkJBUF9SeFByb2NMc1BrdCgocHRCdGFtcEhhbmRsZSlwQnRhbXBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ0YW1wQ3R4LT5waHlfbGlua19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWNrZXQpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFdMQU5UTF9CVF9BTVBfVFlQRV9BUjogLyogRmFsbCB0aHJvdWdoICovCisgICAgICBjYXNlIFdMQU5UTF9CVF9BTVBfVFlQRV9TRUM6CisgICAgICB7CisgICAgICAgICAgLyogQ2FsbCB0aGUgUlNOIGNhbGxiYWNrIGhhbmRsZXIgKi8KKyAgICAgICAgICBiYXBSc25SeENhbGxiYWNrIChwdm9zR0N0eCwgcFBhY2tldCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgZnJhbWV0eXBlIGZyb20gVEw6ICVkLCA9PiBCQVAiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZnJhbWVUeXBlKTsKKyAgICB9CisKKyAgICByZXR1cm4gKCBWT1NfU1RBVFVTX1NVQ0NFU1MgKTsKK30KZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBSc244MDIxeEF1dGhGc20uYyBiL0NPUkUvQkFQL3NyYy9iYXBSc244MDIxeEF1dGhGc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzg5ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcFJzbjgwMjF4QXV0aEZzbS5jCkBAIC0wLDAgKzEsMTYxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBXb29kc2lkZSBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogJEZpbGU6IC8vZGVwb3Qvc29mdHdhcmUvcHJvamVjdHMvZmVhdHVyZV9icmFuY2hlcy9nZW41X3BoYXNlMS9vcy9saW51eC9jbGFzc2ljL2FwL2FwcHMvc3NtL2F1dGg4MDIxeC9hbmk4MDIxeEF1dGhSc25Gc20uYyAkCisgKgorICogQ29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBSU04gRUFQT0wtS2V5IEZTTSBvbiB0aGUKKyAqIGF1dGhlbnRpY2F0b3Igc2lkZS4gVGhpcyBpcyBiYXNlZCBvbiA4MDIuMTFpLgorICoKKyAqIEF1dGhvcjogICAgICBNYXlhbmsgRC4gVXBhZGh5YXkKKyAqIERhdGU6ICAgICAgICAxOS1EZWNlbWJlci0yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICBNb2RpZmllZCBieSAgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJiYXBSc25Tc21TZXJ2aWNlcy5oIgorI2luY2x1ZGUgImJhcFJzblNzbUVhcG9sLmgiCisjaW5jbHVkZSAiYmFwUnNuRXJyb3JzLmgiCisjaW5jbHVkZSAiYmFwSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJiYXBSc244MDIxeEZzbS5oIgorI2luY2x1ZGUgImJhcFJzbjgwMjF4QXV0aEZzbS5oIgorI2luY2x1ZGUgInZvc191dGlscy5oIgorI2luY2x1ZGUgInZvc19tZW1vcnkuaCIKKyNpbmNsdWRlICJ2b3NfdGltZXIuaCIKKyNpbmNsdWRlICJiYXBSc25UeFJ4LmgiCisjaW5jbHVkZSAiYmFwUnNuU3NtQWVzS2V5V3JhcC5oIgorI2luY2x1ZGUgImJ0YW1wRnNtLmgiCisKKy8vIFRoZSBkaWZmZXJlbnQgc3RhdGVzIHRoYXQgdGhpcyBGU00gdHJhbnNpdGlvbnMgdGhyb3VnaAorI2RlZmluZSBESVNDT05ORUNUICAgICAgICAgICAwCisjZGVmaW5lIERJU0NPTk5FQ1RFRCAgICAgICAgIDEKKyNkZWZpbmUgSU5JVElBTElaRSAgICAgICAgICAgMgorI2RlZmluZSBBVVRIRU5USUNBVElPTiAgICAgICAzCisjZGVmaW5lIEFVVEhFTlRJQ0FUSU9OXzIgICAgIDQKKyNkZWZpbmUgR0VUX1BTSyAgICAgICAgICAgICAgNSAgIAorI2RlZmluZSBHRVRfRUFQX0tFWSAgICAgICAgICA2CisjZGVmaW5lIFBUS19TVEFSVCAgICAgICAgICAgIDcKKyNkZWZpbmUgUFRLX0lOSVRfTkVHTyAgICAgICAgOAorI2RlZmluZSBQVEtfSU5JVF9ORUdPX1RYICAgICA5CisjZGVmaW5lIFBUS19JTklUX0RPTkUgICAgICAgMTAKKyNkZWZpbmUgVVBEQVRFX0tFWVNfUkVRICAgICAxMQorI2RlZmluZSBJTlRFR19GQUlMVVJFICAgICAgIDEyCisjZGVmaW5lIEtFWV9VUERBVEUgICAgICAgICAgMTMKKyNkZWZpbmUgTlVNX1NUQVRFUyAoS0VZX1VQREFURSArIDEpCisKKworCitzdGF0aWMgdEF1dGhSc25Gc21Db25zdHMgYXV0aENvbnN0cyA9IHsgMjAwMCwgMyB9OyAgLy90aW1lb3V0LCByZXRyeSBsaW1pdAorc3RhdGljIHZfVThfdCBhbmlTc21JZVJzbk91aVtdID0gQU5JX1NTTV9JRV9SU05fT1VJOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RhdGljIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgCitpbnQgemVyb091dFB0ayh0QXV0aFJzbkZzbSAqZnNtKTsKK3N0YXRpYyAKK2ludCBzdG9wQWxsVGltZXJzKHRBdXRoUnNuRnNtICpmc20pOworCitzdGF0aWMKK2ludCBjaGVja01pYyh0QXV0aFJzbkZzbSAqZnNtLCAKKyAgICAgICAgICAgICB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqZGF0YSk7CisKK3N0YXRpYyAKK2ludCBjaGVja0xvY2FsUmVwbGF5Q291bnRlcih0QXV0aFJzbkZzbSAqZnNtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqZGF0YSk7CitzdGF0aWMgCitpbnQgY2hlY2tQZWVyUmVwbGF5Q291bnRlcih0QXV0aFJzbkZzbSAqZnNtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICpkYXRhKTsKKworc3RhdGljIGludCBjaGVja0luZm9FbGVtZW50KHRBdXRoUnNuRnNtICpmc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGEgKmRhdGEpOworCitzdGF0aWMKK2ludCBkZXJpdmVQdGsodEF1dGhSc25Gc20gKmZzbSwgCisgICAgICAgICAgICAgIHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICpkYXRhKTsKKworCitzdGF0aWMgaW50IGNoZWNrVHJhbnNpdGlvbih0QXV0aFJzbkZzbSAqZnNtLCB2b2lkICphcmcpOworCitzdGF0aWMgaW50Citnb3RvU3RhdGVJbml0KHRBdXRoUnNuRnNtICpmc20pOworCitzdGF0aWMgdm9pZCBtc2cyVGltZXJDYWxsYmFjayggdm9pZCAqICk7CitzdGF0aWMgdm9pZCBtc2c0VGltZXJDYWxsYmFjayggdm9pZCAqICk7CisKK3N0YXRpYyBpbnQgYXV0aFJzblJ4RnJhbWVIYW5kbGVyKCB2X1BWT0lEX3QgcHZvc0dDdHgsIHZvc19wa3RfdCAqcFBhY2tldCApOworc3RhdGljIGludCBhdXRoUnNuVHhDb21wbGV0ZUhhbmRsZXIoIHZfUFZPSURfdCBwdm9zR0N0eCwgdm9zX3BrdF90ICpwUGFja2V0LCBWT1NfU1RBVFVTIHJldFN0YXR1cyApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9ucyBGb3J3YXJkIERlY2xhcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgYXV0aFJzbkF1dGhTdGFydEV2ZW50SGFuZGxlciggdEF1dGhSc25Gc20gKmZzbSApOworaW50IGF1dGhSc25BdXRoRGlzY29uRXZlbnRIYW5kbGVyKCB0QXV0aFJzbkZzbSAqZnNtICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgZXhwb3J0ZWQgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBhdXRoUnNuRnNtSW5pdAorICoKKyAqIEZVTkNUSU9OOgorICogSW5pdGlhbGl6ZXMgdGhlIGNvbnN0YW50cyBhbmQgdGhlIGNhbGxiYWNrcyBuZWVkZWQgYnkgdGhpcyBGU00KKyAqIG1vZHVsZS4KKyAqCisgKiBAcGFyYW0gY29uc3RzIHRoZSB2YXJpb3VzIGNvbnN0YW50IHZhbHVlcyBuZWVkZWQgYnkgdGhpcyBGU00KKyAqIEBwYXJhbSBjYiBjYWxsYmFja3MgdG8gdGhlIHZhcmlvdXMgcHJvY2VkdXJlcyBuZWVkZWQgYnkgdGhpcyBGU00KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYXV0aFJzbkZzbUluaXQodEF1dGhSc25Gc21Db25zdHMgKmNvbnN0c0luKQoreworICAgIC8vIFRPRE86IFJlYWQgdGhlIGNvbnN0YW50cyBpbiBmcm9tIGNvbmZpZworICAgIC8vIGF1dGhDb25zdHMgPSAqY29uc3RzSW47CisgICAgYXV0aENvbnN0cy50aW1lb3V0UGVyaW9kID0gMjAwMDsgICAgLy9tcworICAgIGF1dGhDb25zdHMubWF4VHJpZXMgPSAzOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhdXRoUnNuRnNtQ3JlYXRlCisgKgorICogRlVOQ1RJT04KKyAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIHN0YXRlIG9mIGFuIFJTTiBrZXkgRlNNIGluc3RhbmNlIGZvcgorICogdGhlIGdpdmVuIFNUQSBjb250ZXh0LgorICogCisgKiBAcGFybSBzdGFDdHggdGhlIFNUQSBjb250ZXh0IHdob3NlIGluc3RhbmNlIGlzIGJlaW5nIGNyZWF0ZWQKKyAqIEBwYXJhbSBwc2tCYXNlZCBwYXNzIGluIGVBTklfQk9PTEVBTl9UUlVFIGlzIHRoaXMgU1RBIGlzIHRvIGJlCisgKiBhdXRoZW50aWNhdGVkIGJhc2VkIG9uIGEgcHJlLXNoYXJlZCBrZXkgYXMgb3Bwb3NlZCB0byBFQVAuCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2F1dGhSc25Gc21DcmVhdGUodEJ0YW1wQ29udGV4dCAqY3R4KQoreworICAgIGludCByZXRWYWwgPSBBTklfT0s7CisgICAgdEF1dGhSc25Gc20gKmZzbSA9ICZjdHgtPnVGc20uYXV0aEZzbTsKKworICAgIC8vIEZpcnN0LCBjbGVhciBldmVyeXRoaW5nIG91dAorICAgIHZvc19tZW1femVybyggZnNtLCBzaXplb2YodEF1dGhSc25Gc20pKTsKKworICAgIGlmKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBiYXBSc25SZWdpc3RlclR4UnhDYWxsYmFja3MoIGF1dGhSc25UeENvbXBsZXRlSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFJzblJ4RnJhbWVIYW5kbGVyICkgKSApCisgICAgeworICAgICAgICByZXR1cm4gQU5JX0VSUk9SOworICAgIH0KKworICAgIGlmKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBiYXBSc25SZWdpc3RlclJ4Q2FsbGJhY2soIGN0eC0+cHZvc0dDdHggKSApICkKKyAgICB7CisgICAgICAgIHJldHVybiBBTklfRVJST1I7CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgdGhlIHN0YXRpb24gY29udGV4dAorICAgIGZzbS0+c3RhQ3R4ID0gKHRTdGFDb250ZXh0ICopdm9zX21lbV9tYWxsb2MoIHNpemVvZih0U3RhQ29udGV4dCkgKTsKKyAgICBpZiAoZnNtLT5zdGFDdHggPT0gTlVMTCkgCisgICAgeworICAgICAgICByZXRWYWwgPSBBTklfRV9NQUxMT0NfRkFJTEVEOworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIC8vIENsZWFyIG91dCB0aGUgc3RhdGlvbiBjb250ZXh0CisgICAgdm9zX21lbV96ZXJvKCBmc20tPnN0YUN0eCwgc2l6ZW9mKHRTdGFDb250ZXh0KSApOworICAgIAorICAgIGZzbS0+Y3R4ID0gY3R4OworICAgIGZzbS0+c3RhQ3R4LT5hdXRoUnNuRnNtID0gZnNtOworICAgIC8vT25seSBzdXBwb3J0IENDTVAKKyAgICBmc20tPnN0YUN0eC0+cHdDaXBoZXJUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworCisgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc190aW1lcl9pbml0KCAmZnNtLT5tc2cyVGltZXIsIFZPU19USU1FUl9UWVBFX1NXLCBtc2cyVGltZXJDYWxsYmFjaywgZnNtICkgKSApCisgICAgeworICAgICAgICByZXRWYWwgPSBBTklfRV9NQUxMT0NfRkFJTEVEOworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc190aW1lcl9pbml0KCAmZnNtLT5tc2c0VGltZXIsIFZPU19USU1FUl9UWVBFX1NXLCBtc2c0VGltZXJDYWxsYmFjaywgZnNtICkgKSApCisgICAgeworICAgICAgICByZXRWYWwgPSBBTklfRV9NQUxMT0NfRkFJTEVEOworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0QWxsb2NhdGVFeHBsaWNpdCgmZnNtLT5sYXN0RWFwb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05fTUFYX1BBQ0tFVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUFQT0xfVFhfSEVBREVSX1NJWkUgKTsKKyAgICBpZiAocmV0VmFsICE9IEFOSV9PSykgCisgICAgeworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgYW5pQXNmUGFja2V0QWxsb2NhdGUoJmZzbS0+c3RhQ3R4LT5wbWspOworICAgIGlmIChmc20tPnN0YUN0eC0+cG1rID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgcmV0VmFsID0gQU5JX0VfTUFMTE9DX0ZBSUxFRDsKKyAgICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGFuaUFzZlBhY2tldEFsbG9jYXRlRXhwbGljaXQoJmZzbS0+c3RhQ3R4LT5pZVN0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTl9JRV9NQVhfUEFDS0VUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05fSUVfSEVBREVSX1NJWkUgKTsKKyAgICBpZiAoZnNtLT5zdGFDdHgtPmllU3RhID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgcmV0VmFsID0gQU5JX0VfTUFMTE9DX0ZBSUxFRDsKKyAgICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGZzbS0+Y3J5cHRIYW5kbGUgPSAwOworICAgIGlmKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NfY3J5cHRvX2luaXQoICZmc20tPmNyeXB0SGFuZGxlICkgKSApCisgICAgeworICAgICAgICByZXRWYWwgPSBBTklfRV9GQUlMRUQ7CisgICAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBmc20tPmN1cnJlbnRTdGF0ZSA9IElOSVRJQUxJWkU7CisgICAgZ290b1N0YXRlSW5pdChmc20pOworCisgICAgLy9XZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGhlcmUgYmVjYXVzZSBpdCBpcyBjb25uZWN0ZWQgYXQgdGhpcyB0aW1lCisgICAgYXV0aFJzbkZzbVByb2Nlc3NFdmVudCggZnNtLCBSU05fRlNNX0FVVEhfU1RBUlQsIE5VTEwgKTsKKworICAgIHJldHVybiBBTklfT0s7CisKKyBlcnJvcjoKKyAgICBhdXRoUnNuRnNtRnJlZShjdHgpOworCisgICAgcmV0dXJuIHJldFZhbDsKKyAgICAKK30KKworLyoqCisgKiBhdXRoUnNuRnNtRnJlZQorICoKKyAqIEZVTkNUSU9OCisgKiBGcmVlcyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIFJTTiBLZXkgRlNNIGluIGEgU1RBIGNvbnRleHQuIElmIHRoZQorICogUlNOIEtleSBGU00gaXMgbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gdGhpcyBpcyBhbiBlcnJvci4KKyAqIAorICogQHBhcmFtIGN0eCB0aGUgU1RBIGNvbnRleHQgd2hvc2UgRlNNIGluc3RhbmNlIGlzIHRvIGJlIGZyZWVkCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2F1dGhSc25Gc21GcmVlKHRCdGFtcENvbnRleHQgKmN0eCkKK3sKKyAgICB0QXV0aFJzbkZzbSAqZnNtID0gJmN0eC0+dUZzbS5hdXRoRnNtOworCisgICAgVk9TX0FTU0VSVChmc20pOworCisgICAgaWYoIGZzbS0+Y3J5cHRIYW5kbGUpCisgICAgeworICAgICAgICB2b3NfY3J5cHRvX2RlaW5pdCggZnNtLT5jcnlwdEhhbmRsZSApOworICAgIH0KKyAgICAgCisgICAgYmFwUnNuQ2xlYXJUeFJ4Q2FsbGJhY2tzKCk7IAorCisgICAgaWYgKCBmc20tPnN0YUN0eCApCisgICAgeworICAgICAgICBmc20tPnN0YUN0eC0+YXV0aFJzbkZzbSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKCBWT1NfVElNRVJfU1RBVEVfVU5VU0VEICE9IGZzbS0+bXNnMlRpbWVyLnN0YXRlICkgdm9zX3RpbWVyX2Rlc3Ryb3koICZmc20tPm1zZzJUaW1lciApOworICAgIGlmICggVk9TX1RJTUVSX1NUQVRFX1VOVVNFRCAhPSBmc20tPm1zZzRUaW1lci5zdGF0ZSApIHZvc190aW1lcl9kZXN0cm95KCAmZnNtLT5tc2c0VGltZXIgKTsKKworICAgIGlmIChmc20tPmxhc3RFYXBvbCkKKyAgICB7ICAgIAorICAgICAgICBhbmlBc2ZQYWNrZXRGcmVlKGZzbS0+bGFzdEVhcG9sKTsKKyAgICAgICAgZnNtLT5sYXN0RWFwb2wgPSBOVUxMOyAKKyAgICB9CisKKyAgICBpZiggZnNtLT5zdGFDdHggKQorICAgIHsKKyAgICAgICAgaWYoIGZzbS0+c3RhQ3R4LT5wbWsgKQorICAgICAgICB7CisgICAgICAgICAgICBhbmlBc2ZQYWNrZXRGcmVlKCBmc20tPnN0YUN0eC0+cG1rICk7CisgICAgICAgICAgICBmc20tPnN0YUN0eC0+cG1rID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgIHZvc19tZW1fZnJlZShmc20tPnN0YUN0eCk7CisgICAgICAgZnNtLT5zdGFDdHggPSBOVUxMOyAKKyAgICB9CisKKyAgICB2b3NfbWVtX3plcm8oIGZzbSwgc2l6ZW9mKHRBdXRoUnNuRnNtKSApOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhdXRoUnNuRnNtUHJvY2Vzc0V2ZW50CisgKgorICogRlVOQ1RJT04KKyAqIFBhc3NlcyBhbiBldmVudCB0byB0aGUgUlNOIGtleSBGU00gaW5zdGFuY2UgZm9yIGltbWVkaWF0ZSBwcm9jZXNzaW5nLgorICogCisgKiBAcGFyYW0gZnNtIHRoZSBSU04gS2V5IEZTTSBpbnN0YW5jZQorICogQHBhcmFtIGV2ZW50SWQgdGhlIEFBRyBldmVudCB0byBwcm9jZXNzCisgKiBAcGFyYW0gYXJnIGFuIG9wdGlvbmFsIGFyZ3VtZW50IGZvciB0aGlzIGV2ZW50CisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2F1dGhSc25Gc21Qcm9jZXNzRXZlbnQodEF1dGhSc25Gc20gKmZzbSwgdFJzbkZzbUV2ZW50IGV2ZW50SWQsIHZvaWQgKmFyZykKK3sKKyAgICBWT1NfQVNTRVJUKGZzbSk7CisKKyAgICBzd2l0Y2ggKGV2ZW50SWQpIHsKKyAgICBjYXNlIFJTTl9GU01fVElNRVJfRVhQSVJFRDoKKyAgICAgICAgLy8gUHJvY2VlZCBzdHJhaWdodCB0byBjaGVja1RyYW5zaXRpb24KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU05fRlNNX0FVVEhfU1RBUlQ6CisgICAgICAgIGZzbS0+YXV0aFJlcSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICBhdXRoUnNuQXV0aFN0YXJ0RXZlbnRIYW5kbGVyKGZzbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNOX0ZTTV9FQVBPTF9GUkFNRV9BVkFJTEFCTEU6CisgICAgICAgIGZzbS0+ZWFwb2xBdmFpbCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTTl9GU01fRElTQ09OTkVDVDoKKyAgICAgICAgZnNtLT5kaXNjb25uZWN0ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIGF1dGhSc25BdXRoRGlzY29uRXZlbnRIYW5kbGVyKGZzbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNOX0ZTTV9JTlRFR19GQUlMRUQ6CisgICAgICAgIGZzbS0+aW50ZWdGYWlsZWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJVbmtub3duIGV2ZW50IGZvciBBdXRoIFJTTiBLZXkgRnNtOiAlZFxuIiwgZXZlbnRJZCk7CisgICAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICAgICAgcmV0dXJuIEFOSV9FX0lMTEVHQUxfQVJHOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjaGVja1RyYW5zaXRpb24oZnNtLCBhcmcpOworCisgICAgcmV0dXJuIEFOSV9PSzs7Cit9CisKKworaW50CithdXRoUnNuQXV0aFN0YXJ0RXZlbnRIYW5kbGVyKHRBdXRoUnNuRnNtICpmc20pCit7CisgICAgc3RhdGljIHZfVThfdCBidGFtcFN0YVJTTklFW10gPSB7MHgzMCwgMHgxNCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwZiwgMHhhYywgMHgwNCwgMHgwMSwgMHgwMCwgCisgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsIDB4MDAsIDB4MDAgfTsKKyAgICAvLyBDb3B5IHJlcXVpcmVkIGluZm8KKyAgICB2b3NfbWVtX2NvcHkoICZmc20tPnN0YUN0eC0+YXV0aE1hYywgZnNtLT5jdHgtPnNlbGZfbWFjX2FkZHIsIDYpOworICAgIHZvc19tZW1fY29weSggJmZzbS0+c3RhQ3R4LT5zdXBwTWFjLCBmc20tPmN0eC0+cGVlcl9tYWNfYWRkciwgNik7CisgICAgYW5pQXNmUGFja2V0QXBwZW5kQnVmZmVyKCBmc20tPnN0YUN0eC0+cG1rLCBmc20tPmN0eC0+a2V5X21hdGVyaWFsLCBmc20tPmN0eC0+a2V5X2xlbmd0aCk7CisKKyAgICBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIoIGZzbS0+c3RhQ3R4LT5pZVN0YSwgYnRhbXBTdGFSU05JRSwgc2l6ZW9mKGJ0YW1wU3RhUlNOSUUpKTsKKyAgICByZXR1cm4gQU5JX09LOworfQorCitpbnQKK2F1dGhSc25BdXRoRGlzY29uRXZlbnRIYW5kbGVyKHRBdXRoUnNuRnNtICpmc20pCit7CisgICAgLy8gRnJlZSBTdGFjdHggLj8KKyAgICByZXR1cm4gQU5JX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBzdGF0aWMgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK2dvdG9TdGF0ZUluaXQodEF1dGhSc25Gc20gKmZzbSkKK3sKKyAgICBmc20tPmN1cnJlbnRTdGF0ZSA9IElOSVRJQUxJWkU7CisKKyAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gYSBnbG9iYWwgcG9zaXRpb24gd2hpY2ggYXBwbGllcyB0byBXRVAgYXMKKyAgICAvLyB3ZWxsIAorICAgIC8vaW5pdEdsb2JhbEtleXMgPSBlQU5JX0JPT0xFQU5fRkFMU0U7IAorCisgICAgZnNtLT5hdXRoUmVxID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGZzbS0+ZWFwb2xBdmFpbCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBmc20tPmRpc2Nvbm5lY3QgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgZnNtLT5pbnRlZ0ZhaWxlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKworICAgIGZzbS0+bnVtVHJpZXMgPSAwOworCisgICAgLy8gQ3JlYXRlIHR3byByZXBsYXkgY291bnRlcidzLi5vbmUgZm9yIG91ciByZXF1ZXN0cywgYW5kIGFub3RoZXIKKyAgICAvLyBmb3IgU1RBJ3MgcmVxdWVzdHMuIEluaXRpYWxpemUgdGhlIGZpcnN0IG9uZSByYW5kb21seS4KKyAgICBhbmlTc21SZXBsYXlDdHJDcmVhdGUoZnNtLT5jcnlwdEhhbmRsZSwgJmZzbS0+c3RhQ3R4LT5sb2NhbFJlcGxheUN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9FQVBPTF9LRVlfUlNOX1JTQ19TSVpFLCAwKTsKKyAgICBhbmlTc21SZXBsYXlDdHJDcmVhdGUoZnNtLT5jcnlwdEhhbmRsZSwgJmZzbS0+c3RhQ3R4LT5wZWVyUmVwbGF5Q3RyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX0VBUE9MX0tFWV9SU05fUlNDX1NJWkUsIDApOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworc3RhdGljIGludAorZ290b1N0YXRlQXV0aGVudGljYXRpb24odEF1dGhSc25Gc20gKmZzbSkKK3sKKyAgICBmc20tPmN1cnJlbnRTdGF0ZSA9IEFVVEhFTlRJQ0FUSU9OOworCisgICAgemVyb091dFB0ayhmc20pOworICAgIGZzbS0+YXV0aFJlcSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKworICAgIGNoZWNrVHJhbnNpdGlvbihmc20sIE5VTEwpOyAvLyBVQ1QgcnVsZQorCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworc3RhdGljIGludAorZ290b1N0YXRlQXV0aGVudGljYXRpb24yKHRBdXRoUnNuRnNtICpmc20pCit7CisgICAgZnNtLT5jdXJyZW50U3RhdGUgPSBBVVRIRU5USUNBVElPTl8yOworCisgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc19yYW5kX2dldF9ieXRlcyggZnNtLT5jcnlwdEhhbmRsZSwgZnNtLT5hTm9uY2UsIEFOSV9FQVBPTF9LRVlfUlNOX05PTkNFX1NJWkUgKSApICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICJnb3RvU3RhdGVBdXRoZW50aWNhdGlvbjIgZmFpbCB0byBnZXQgcmFuZG9tIG51bWJlci4gRGlzY29ubmVjdFxuIiApOworICAgICAgICBiYXBBdXRoRGlzY29ubmVjdCggZnNtLT5jdHggKTsKKyAgICAgICAgcmV0dXJuIEFOSV9FUlJPUjsKKyAgICB9CisgICAgZnNtLT5udW1UcmllcyA9IDA7CisKKyAgICBjaGVja1RyYW5zaXRpb24oZnNtLCBOVUxMKTsgLy8gVUNUIHJ1bGUKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKKworc3RhdGljIGludAorZ290b1N0YXRlR2V0UHNrKHRBdXRoUnNuRnNtICpmc20pCit7CisgICAgLy9UaGlzIGlzIHNpbXBseSBhIHRyYW5zYWN0aW9uIGJlY2F1c2Ugd2UgYWxyZWFkeSBoYXZlIHRoZSBQTUsuIFdlIGFsd2F5cyBkby4KKyAgICBmc20tPmN1cnJlbnRTdGF0ZSA9IEdFVF9QU0s7CisKKyAgICBmc20tPm51bVRyaWVzID0gMDsKKyAgICAKKyAgICBjaGVja1RyYW5zaXRpb24oZnNtLCBOVUxMKTsKKyAgICAKKyAgICByZXR1cm4gQU5JX09LOworfQorCitzdGF0aWMgaW50Citnb3RvU3RhdGVQdGtTdGFydCh0QXV0aFJzbkZzbSAqZnNtKQoreworICAgIHRBbmlFYXBvbFJzbktleURlc2MgdHhEZXNjOworICAgIGludCByZXRWYWw7CisKKyAgICBmc20tPm1zZzJUaW1lT3V0ID0gVk9TX0ZBTFNFOworICAgIGZzbS0+Y3VycmVudFN0YXRlID0gUFRLX1NUQVJUOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IHBhY2tldCBpZiB3ZSBkb24ndCBoYXZlIG9uZSB0byByZXRyYW5zbWl0CisgICAgLy9pZiAoYW5pQXNmUGFja2V0R2V0TGVuKGZzbS0+bGFzdEVhcG9sKSA9PSAwKSAKKyNpZiAwICAgIAorICAgIGlmKCBmc20tPmxhc3RFYXBvbCApCisgICAgeworICAgICAgICBhbmlBc2ZQYWNrZXRGcmVlKCBmc20tPmxhc3RFYXBvbCApOworICAgICAgICBmc20tPmxhc3RFYXBvbCA9IE5VTEw7CisKKyAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBbGxvY2F0ZUV4cGxpY2l0KCZmc20tPmxhc3RFYXBvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTl9NQVhfUEFDS0VUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQVBPTF9UWF9IRUFERVJfU0laRSApOworI2VuZGlmICAgIAorICAgIGFuaUFzZlBhY2tldEVtcHR5RXhwbGljaXQoZnNtLT5sYXN0RWFwb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUFQT0xfVFhfSEVBREVSX1NJWkUpOworICAgIC8vfQorICAgLy8gaWYgKDEpIAorICAgIC8veworCisgICAgICAgIHZvc19tZW1femVybyggJnR4RGVzYywgc2l6ZW9mKHR4RGVzYykgKTsKKworICAgICAgICAvLyBUaGUgS2V5IEluZm9ybWF0aW9uIGJpdHMuLi4KKyAgICAgICAgaWYgKGZzbS0+c3RhQ3R4LT5wd0NpcGhlclR5cGUgPT0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTKSAKKyAgICAgICAgeworICAgICAgICAgICAgdHhEZXNjLmluZm8ua2V5RGVzY1ZlcnMgPSBBTklfRUFQT0xfS0VZX0RFU0NfVkVSU19BRVM7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEFOSV9FX0lMTEVHQUxfQVJHOworICAgICAgICB9CisgICAgICAgIHR4RGVzYy5pbmZvLnVuaWNhc3RGbGFnID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIHR4RGVzYy5pbmZvLmFja0ZsYWcgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKworICAgICAgICAvLyBUaGUgb3RoZXIgZmllbGRzLi4uCisgICAgICAgIHR4RGVzYy5rZXlMZW4gPSBhYWdHZXRLZXlNYXRlcmlhbExlbihmc20tPnN0YUN0eC0+cHdDaXBoZXJUeXBlKTsKKyAgICAgICAgYW5pU3NtUmVwbGF5Q3RyTmV4dChmc20tPnN0YUN0eC0+bG9jYWxSZXBsYXlDdHIsIHR4RGVzYy5yZXBsYXlDb3VudGVyKTsKKyAgICAgICAgdm9zX21lbV9jb3B5KHR4RGVzYy5rZXlOb25jZSwgZnNtLT5hTm9uY2UsIHNpemVvZih0eERlc2Mua2V5Tm9uY2UpKTsKKworICAgICAgICByZXRWYWwgPSBhbmlFYXBvbFdyaXRlS2V5KGZzbS0+Y3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNtLT5sYXN0RWFwb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNtLT5zdGFDdHgtPnN1cHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNtLT5zdGFDdHgtPmF1dGhNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX0VBUE9MX0tFWV9ERVNDX1RZUEVfUlNOX05FVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHhEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisjaWYgMAorICAgIH0gCisgICAgZWxzZSB7CisgICAgICAgIHJldHJhbnNtaXQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB9CisjZW5kaWYgICAgCisKKyAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBiYXBSc25TZW5kRWFwb2xGcmFtZSggZnNtLT5jdHgtPnB2b3NHQ3R4LCBmc20tPmxhc3RFYXBvbCApICkgKQorICAgIHsKKyAgICAgICAgcmV0VmFsID0gQU5JX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL3dlIGZhaWwgdG8gc2VuZCB0aGUgZWFwb2wgZnJhbWUgZGlzY29ubmVjdAorICAgICAgICBiYXBBdXRoRGlzY29ubmVjdCggZnNtLT5jdHggKTsKKyAgICAgICAgcmV0VmFsID0gQU5JX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBpbnQKK2dvdG9TdGF0ZVB0a0luaXROZWdvKHRBdXRoUnNuRnNtICpmc20sIHZvaWQgKmFyZykKK3sKKyAgICBmc20tPmN1cnJlbnRTdGF0ZSA9IFBUS19JTklUX05FR087CisKKyAgICAvLyBSZXBsYXkgY291bnRlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB3aGVuIHdlIGNyZWF0ZSBhCisgICAgLy8gbmV3IHBhY2tldAorCisgICAgZnNtLT5udW1UcmllcyA9IDA7CisgICAgYW5pQXNmUGFja2V0RW1wdHlFeHBsaWNpdChmc20tPmxhc3RFYXBvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQVBPTF9UWF9IRUFERVJfU0laRSk7CisKKyAgICBjaGVja1RyYW5zaXRpb24oZnNtLCBhcmcpOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLy8gVXNlIHRoaXMgb25seSB3aXRoIHRydXN0ZWQgSUUgbGlrZSB0aGUgb25lIHdlIGdlbmVyYXRlZCBsb2NhbGx5CitzdGF0aWMgaW50CitnZXRSc25JZUZyb21BZHZlcnRpemVkSWVzKHRBdXRoUnNuRnNtICpmc20sIHZfVThfdCAqKnJzbkllKQoreworICAgIGludCByZXRWYWwgPSBBTklfRV9JTExFR0FMX0FSRzsKKyAgICB2X1U4X3QgKnB0ciA9IGZzbS0+YWR2ZXJ0aXplZFJzbkllOworCisgICAgaWYgKCpwdHIgPT0gQU5JX1NTTV9JRV9SU05fRUxFTV9JRCkgCisgICAgeworICAgICAgICByZXRWYWwgPSAqKHB0ciArIDEpICsgMjsgLy8gVGhlIEwgZmllbGQgZnJvbSB0aGUgVExWICsgMkIgVEwKKyAgICAgICAgKnJzbkllID0gcHRyOworICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKKy8vIFVzZSB0aGlzIG9ubHkgd2l0aCB0cnVzdGVkIElFIGxpa2UgdGhlIG9uZSB3ZSBnZW5lcmF0ZWQgbG9jYWxseQorc3RhdGljIHZvaWQKK2FkZFBhZCggCisgICAgdl9VOF90ICpkYXRhQnl0ZXMsCisgICAgaW50IGRhdGFMZW4sCisgICAgaW50IHBhZExlbikKK3sKKyAgICBpbnQgaTsKKworICAgIC8vIFRoZSBmaXJzdCBieXRlIG9mIHBhZGRpbmcgaXMgMHhkZC4gIFRoZSByZXN0IGFyZSAweDAwJ3MKKyAgICAvLyBTZWUgODAyLjExaSBzZWN0aW9uIDguNS4yIHN1YnNlY3Rpb24gIktleSBEYXRhIEVuY2Fwc3VsYXRpb24iCisKKyAgICBmb3IgKCBpPWRhdGFMZW4gOyBpIDwgZGF0YUxlbitwYWRMZW47IGkrKykgCisgICAgeworICAgICAgICBpZiAoIGkgPT0gZGF0YUxlbiApIAorICAgICAgICB7CisgICAgICAgICAgICBkYXRhQnl0ZXNbaV0gPSAweGRkOworICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFCeXRlc1tpXSA9IDB4MDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKgorICogYWFnQXBwZW5kR3JvdXBLZXlGb3JSc24KKyAqCisgKiBBcHBlbmRzIHRoZSBncm91cCBrZXkgdG8gdGhlIHBhY2tldCBpbiB0aGUgUlNOIGtleSBlbmNhcHVsYXRpb24gZm9ybWF0LgorICoKKyAqIEBwYXJhbSBwYWNrZXQgLSB0aGUgcGFja2V0IHRvIGFwcGVuZCB0bworICogQHBhcmFtIHJhZGlvSWQgLSB0aGUgcmFkaW8gd2hvc2UgZ3JvdXAga2V5IG5lZWRzIHRvIGJlIGFwcGVuZGVkCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCisjZGVmaW5lIFNUQVRJQ19XRVBfS0VZX0xFTiAxNgorI2RlZmluZSBHUk9VUF9LRVlfSUQgMAorI2RlZmluZSBBTklfU1NNX0lFX1JTTl9LRVlfREFUQV9FTkNBUFNfSUQgICAgICAgMHhERAorI2RlZmluZSBBTklfU1NNX0lFX1JTTl9HUk9VUF9LRVlfREFUQV9FTkNBUFNfSUQgMQorCitpbnQKK2FhZ0FwcGVuZEdyb3VwS2V5Rm9yUnNuKHRBbmlQYWNrZXQgKnBhY2tldCkKK3sKKyNpZiAwCisgICAgdEFuaVBhY2tldCAqZ3JvdXBLZXkgPSBOVUxMOworI2Vsc2UKKyAgICB0QU5JX1U4IGdyb3VwS2V5W10gPSB7MHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCwgMHgwOSwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNX07CisjZW5kaWYKKyAgICB0QU5JX1U4ICpncm91cEtleUJ5dGVzID0gTlVMTDsKKyAgICB0QU5JX1U4ICpsZW5QdHIgPSBOVUxMOworICAgIHRBTklfVTggKmVuZFB0ciA9IE5VTEw7CisgICAgaW50IGdyb3VwS2V5TGVuOworICAgIGludCByZXRWYWw7CisKKyNpZiAwCisgICAgZ3JvdXBLZXkgPSBBQUdfR1JPVVBfS0VZKHJhZGlvSWQpOworICAgIGlmIChncm91cEtleSA9PSBOVUxMKSB7CisgICAgICAgIEFOSV9BQUdfTE9HX0UoIkdyb3VwIGtleSBpcyBub3QgeWV0IHNldCBvbiByYWRpbyAlZCwgaWQgJWQhIiwKKyAgICAgICAgICAgICAgICAgICAgICByYWRpb0lkLCBBQUdfR1JPVVBfS0VZX0lEKHJhZGlvSWQpKTsKKyAgICAgICAgYXNzZXJ0KDAgJiYgIkdyb3VwIGtleSBpcyBzdGlsbCBOVUxMISIpOworICAgICAgICByZXR1cm4gQU5JX0VfRkFJTEVEOworICAgIH0KKworICAgIGdyb3VwS2V5TGVuID0gYW5pQXNmUGFja2V0R2V0Qnl0ZXMoZ3JvdXBLZXksICZncm91cEtleUJ5dGVzKTsKKyAgICBDSEVDS19OT19FUlJPUihncm91cEtleUxlbik7CisKKyAgICBpZiAoYWFnQ29uZmlnLmxvZ0xldmVsID49IExPR19JTkZPKSB7CisgICAgICAgIEFOSV9BQUdfTE9HX0QoIldpbGwgZW5jYXBzdWxhdGUgZ3JvdXAga2V5IGJ5dGVzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBhbmlBc2ZIZXhTdHIoZ3JvdXBLZXlCeXRlcywgZ3JvdXBLZXlMZW4pKTsKKyAgICB9CisjZWxzZQorICAgIGdyb3VwS2V5Qnl0ZXMgPSBncm91cEtleTsKKworICAgIGdyb3VwS2V5TGVuID0gU1RBVElDX1dFUF9LRVlfTEVOOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEFkZCB0aGUga2V5IGRhdGEgZW5jYXBzdWxhdGlvbiBuZWVkZWQgZm9yIFJTTi9XUEEyCisgICAgICovCisKKyAgICAvLyBUaGUgSUUgSUQKKyAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmQ4KHBhY2tldCwgQU5JX1NTTV9JRV9SU05fS0VZX0RBVEFfRU5DQVBTX0lEKTsKKyAgICAvL0NIRUNLX05PX0VSUk9SKHJldFZhbCk7CisKKyAgICAvLyBPYnRhaW4gdGhlIHBvc2l0aW9uIGZvciB0aGUgbGVuZ3RoCisgICAgYW5pQXNmUGFja2V0R2V0Qnl0ZXNGcm9tVGFpbChwYWNrZXQsICZsZW5QdHIpOworCisgICAgLy8gV3JpdGUgb3V0IGEgZHVtbXkgbGVuZ3RoIC0gd2UnbGwgZmlsbCB0aGlzIGluIGxhdGVyLiBJdCB3aWxsIGJlIAorICAgIC8vIDYgYnl0ZXMgbW9yZSB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIEdUSworICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEFwcGVuZDgocGFja2V0LCAwKTsKKyAgICAvL0NIRUNLX05PX0VSUk9SKHJldFZhbCk7CisKKyAgICAvLyBDb3B5IHRoZSBSU04gT1VJCisgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0QXBwZW5kQnVmZmVyKHBhY2tldCwgYW5pU3NtSWVSc25PdWksIHNpemVvZihhbmlTc21JZVJzbk91aSkpOworICAgIC8vQ0hFQ0tfTk9fRVJST1IocmV0VmFsKTsKKworICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIGtleSB0eXBlIGlzIGdyb3VwIGtleQorICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEFwcGVuZDgocGFja2V0LCBBTklfU1NNX0lFX1JTTl9HUk9VUF9LRVlfREFUQV9FTkNBUFNfSUQpOworICAgIC8vQ0hFQ0tfTk9fRVJST1IocmV0VmFsKTsKKyAKKyAgICAvLyBDb3B5IHRoZSBrZXktaWQgdG8gdGhlIGZpcnN0IHR3byBiaXRzIG9mIHRoZSBuZXh0IGJ5dGUKKyAgICAvLyBDb3B5IHRoZSBUeCBiaXQgdGhlIHRoaXJkIGJpdCBvZiB0aGUgc2FtZSBieXRlCisgICAgLy8gKEhlcmUsIEkgYXNzdW1lIHRoZSBHcm91cCBLZXkgaXMgdG8gYmUgdXNlZCBmb3IgYm90aCBTVEEgVHggYW5kIFJ4KQorICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEFwcGVuZDgoCisgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICBHUk9VUF9LRVlfSUQgKTsKKyAgICAgICAgICAgIC8vQUFHX0dST1VQX0tFWV9JRChyYWRpb0lkKSApOworICAgIC8vQ0hFQ0tfTk9fRVJST1IocmV0VmFsKTsKKworICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldE1vdmVSaWdodChwYWNrZXQsIDEpOyAvLyBSZXNlcnZlZCBiaXRzICgxIGJ5dGUpCisgICAgLy9DSEVDS19OT19FUlJPUihyZXRWYWwpOworCisgICAgLy8gQ29weSB0aGUgcmVhbCBrZXkgYnl0ZXMKKyAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIocGFja2V0LCBncm91cEtleUJ5dGVzLCBncm91cEtleUxlbik7CisgICAgLy9DSEVDS19OT19FUlJPUihyZXRWYWwpOworICAgIAorICAgIC8vIENhbGN1bGF0ZSBhbmQgZW50ZXIgdGhlIGxlbmd0aCBvZiB0aGUgZW50aXJlIGVuY29kaW5nCisgICAgYW5pQXNmUGFja2V0R2V0Qnl0ZXNGcm9tVGFpbChwYWNrZXQsICZlbmRQdHIpOworICAgICpsZW5QdHIgPSBlbmRQdHIgLSAobGVuUHRyICsgMSkgOyAvLyBzdWJ0cmFjdCBvbmUgdG8gYXZvaWQgdGFpbAorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIGludAorZ290b1N0YXRlUHRrSW5pdE5lZ29UeCh0QXV0aFJzbkZzbSAqZnNtKQoreworICAgIHRBbmlFYXBvbFJzbktleURlc2MgdHhEZXNjOworICAgIHZfQk9PTF90IHJldHJhbnNtaXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdl9VOF90ICpyc25XcGFJZSA9IE5VTEw7CisgICAgaW50IHJzbldwYUllTGVuOworICAgIHN0YXRpYyB0QW5pUGFja2V0ICprZXlEYXRhID0gTlVMTDsKKyAgICAvLyBUaGUgbG9uZ2VzdCBsZW5ndGguLi50aGUgZXh0cmEgOCBieXRlcyBhY2NvdW50IGZvciBSU04ga2V5IGRhdGEKKyAgICAvLyBlbmNhcHN1bGF0aW9uCisgICAgdl9VOF90IHBhZGRlZEdyb3VwS2V5RW5jYXBzWzEwMjRdOworICAgIGludCBwYWRMZW4gPSAwOworICAgIHZfVThfdCAqZ3JvdXBLZXlCeXRlczsKKyAgICBpbnQgZ3JvdXBLZXlMZW47CisgICAgdl9VOF90ICp3cmFwcGVkS2V5ID0gTlVMTDsKKyAgICAvLyBWYXJpYWJsZXMgdXNlZCBmb3IgUkM0IEdUSyB3cmFwCisgICAgLy92X1U4X3Qga2V5SXZbQU5JX0VBUE9MX0tFWV9SU05fSVZfU0laRV07CisgICAgLy92X1UzMl90IGtleUl2THNiOworICAgIGludCByZXRWYWwgPSAwOworCisgICAgLy9pbnZhbGlkYXRlIHRoaXMKKyAgICBmc20tPm1zZzRUaW1lT3V0ID0gVk9TX0ZBTFNFOworICAgIGZzbS0+Y3VycmVudFN0YXRlID0gUFRLX0lOSVRfTkVHT19UWCA7CisKKyAgICBpZiAoa2V5RGF0YSA9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBwYWNrZXQgdGhlIGZpcnN0IHRpbWUgYXJvdW5kIHRoYXQgeW91IGVudGVyCisgICAgICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEFsbG9jYXRlRXhwbGljaXQoJmtleURhdGEsIDEwMjQsIDEwKTsKKyAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfQorICAgIH0gCisgICAgZWxzZSB7CisgICAgICAgIC8vIEp1c3QgZW1wdHkgb3V0IHRoZSBwYWNrZXQKKyAgICAgICAgYW5pQXNmUGFja2V0RW1wdHlFeHBsaWNpdChrZXlEYXRhLCAxMCk7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFQVBPTCBmcmFtZSBpZiB3ZSBkb24ndCBoYXZlIG9uZSB0byByZXRyYW5zbWl0CisgICAgICAgIC8vaWYgKGFuaUFzZlBhY2tldEdldExlbihmc20tPmxhc3RFYXBvbCkgPT0gMCkgCisjaWYgMAorICAgICAgICBpZiggZnNtLT5sYXN0RWFwb2wgKQorICAgICAgICAgeworICAgICAgICAgICAgIGFuaUFzZlBhY2tldEZyZWUoIGZzbS0+bGFzdEVhcG9sICk7CisgICAgICAgICAgICAgZnNtLT5sYXN0RWFwb2wgPSBOVUxMOworCisgICAgICAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0QWxsb2NhdGVFeHBsaWNpdCgmZnNtLT5sYXN0RWFwb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05fTUFYX1BBQ0tFVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUFQT0xfVFhfSEVBREVSX1NJWkUgKTsKKyNlbmRpZiAgICAgCisgICAgICAgICAgICAgYW5pQXNmUGFja2V0RW1wdHlFeHBsaWNpdChmc20tPmxhc3RFYXBvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQVBPTF9UWF9IRUFERVJfU0laRSk7CisgICAgICAvLyAgfQorCisgICAgICAgIGlmICgxKSAKKyAgICAgICAgeworCisgICAgICAgICAgICB2b3NfbWVtX3plcm8oICZ0eERlc2MsIHNpemVvZih0eERlc2MpICk7CisKKyAgICAgICAgICAgIC8vIFRoZSBLZXkgSW5mb3JtYXRpb24gYml0cy4uLgorICAgICAgICAgICAgaWYgKGZzbS0+c3RhQ3R4LT5wd0NpcGhlclR5cGUgPT0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eERlc2MuaW5mby5rZXlEZXNjVmVycyA9IEFOSV9FQVBPTF9LRVlfREVTQ19WRVJTX0FFUzsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eERlc2MuaW5mby5rZXlEZXNjVmVycyA9IEFOSV9FQVBPTF9LRVlfREVTQ19WRVJTX1JDNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR4RGVzYy5pbmZvLnVuaWNhc3RGbGFnID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICB0eERlc2MuaW5mby5pbnN0YWxsRmxhZyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgdHhEZXNjLmluZm8uYWNrRmxhZyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgdHhEZXNjLmluZm8ubWljRmxhZyA9IGVBTklfQk9PTEVBTl9UUlVFOworCisgICAgICAgICAgICB0eERlc2Mua2V5TGVuID0gYWFnR2V0S2V5TWF0ZXJpYWxMZW4oZnNtLT5zdGFDdHgtPnB3Q2lwaGVyVHlwZSk7CisgICAgICAgICAgICBhbmlTc21SZXBsYXlDdHJOZXh0KGZzbS0+c3RhQ3R4LT5sb2NhbFJlcGxheUN0ciwgdHhEZXNjLnJlcGxheUNvdW50ZXIpOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KHR4RGVzYy5rZXlOb25jZSwgZnNtLT5hTm9uY2UsIHNpemVvZih0eERlc2Mua2V5Tm9uY2UpKTsKKworICAgICAgICAgICAgLy8gQWRkIHRoZSBSU04gSUUgKGJ1dCBub3QgYW55IFdQQSBJRSkKKyAgICAgICAgICAgIHJzbldwYUllTGVuID0gZ2V0UnNuSWVGcm9tQWR2ZXJ0aXplZEllcyhmc20sICZyc25XcGFJZSk7CisKKyAgICAgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByc25XcGFJZUxlbikgKSBicmVhazsKKworICAgICAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0QXBwZW5kQnVmZmVyKGtleURhdGEsIHJzbldwYUllLCByc25XcGFJZUxlbik7CisgICAgICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICAgICAgLy8gQWRkIHRoZSBSU04gZ3JvdXAga2V5IGVuY2Fwc3VsYXRpb24KKyAgICAgICAgICAgIHJldFZhbCA9IGFhZ0FwcGVuZEdyb3VwS2V5Rm9yUnNuICgga2V5RGF0YSApOworCisgICAgICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICAgICAgZ3JvdXBLZXlMZW4gPSBhbmlBc2ZQYWNrZXRHZXRCeXRlcyhrZXlEYXRhLCAmZ3JvdXBLZXlCeXRlcyk7CisgICAgICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggZ3JvdXBLZXlMZW4gKSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IEFOSV9FX0ZBSUxFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHhEZXNjLmluZm8uc2VjdXJlRmxhZyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgdHhEZXNjLmluZm8uZW5jS2V5RGF0YUZsYWcgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKworICAgICAgICAgICAgaWYgKCBmc20tPnN0YUN0eC0+cHdDaXBoZXJUeXBlID09IGVDU1JfRU5DUllQVF9UWVBFX0FFUyApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogVXNlIHRoZSBBRVMga2V5IHdyYXAgYWxnb3JpdGhtIGlmIGVpdGhlciBvbmUgb2YgdGhlIHBhaXJ3aXNlCisgICAgICAgICAgICAgICAgICoga2V5IG9yIHRoZSBncm91cCBrZXkgaXMgYW4gQUVTIGtleS4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIElmIHRoZSBrZXkgYmVpbmcgc2VudCBpcyBub3QgYSBtdWx0aXBsZSBvZgorICAgICAgICAgICAgICAgICAqIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUsIHRoZW4gcGFkIGl0IHdpdGgKKyAgICAgICAgICAgICAgICAgKiB6ZXJvZXMuIGUuZy4sIGlmIHdlIGFyZSBzZW5kaW5nIGEgV0VQIGtleSBvZiA1IG9yIDEzCisgICAgICAgICAgICAgICAgICogYnl0ZXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFFUyBLZXkgV3JhcCBpbnZva2VkLiBncm91cEtleUxlbiA9ICVkIiwgZ3JvdXBLZXlMZW4pOworCisgICAgICAgICAgICAgICAgcGFkTGVuID0gZ3JvdXBLZXlMZW4gJSBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFOworICAgICAgICAgICAgICAgIGlmIChwYWRMZW4gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYWRMZW4gPSBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFIC0gcGFkTGVuOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVmb3JlIEFFUyBLZXkgV3JhcDogcGFkTGVuID0gJWQiLCBwYWRMZW4pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChncm91cEtleUxlbiArIHBhZExlbiA+IHNpemVvZihwYWRkZWRHcm91cEtleUVuY2FwcykpIHsKKyNpZiAwCisgICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZW5jb2RlIGdyb3VwIGtleSBlbmNhcHN1bGF0aW9uIG9mIGxlbiAlZCBhbmQgY2lwaGVyIHR5cGUgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gc2VuZCB0byAlcyAlcyAoYWlkICVkLCByYWRpbyAlZCwgdXNlciAlcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cEtleUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pU3NtSW50R2V0Q2lwaGVyU3RyKEFBR19HUk9VUF9DSVBIRVIoZnNtLT5jdHgtPnJhZGlvSWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZzbS0+Y3R4LT5icEluZGljYXRvciA/ICJCUCIgOiAiU1RBIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaUFzZkhleFN0cihmc20tPmN0eC0+c3VwcE1hYywgc2l6ZW9mKHRBbmlNYWNBZGRyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+Y3R4LT5haWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+Y3R4LT5yYWRpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYWdHZXRTdGFVc2VySWQoZnNtLT5jdHgpKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IEFOSV9FX0ZBSUxFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBPSywgYWZ0ZXIgeW91IGNvbXB1dGUgdGhlIHBhZCBsZW5ndGgsIHlvdSBuZWVkIHRvIAorICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHBhZGRpbmcgIC0gMHhkZCBmb2xsb3dlZCBieSAweDAwJ3MKKyAgICAgICAgICAgICAgICAgICAgYWRkUGFkKCBncm91cEtleUJ5dGVzICwgZ3JvdXBLZXlMZW4gLCBwYWRMZW4gKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBwYWRkaW5nIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICBncm91cEtleUxlbiArPSBwYWRMZW47CisgICAgICAgICAgICAgICAgICAgIC8vIElNTUVESUFURUxZIGFkanVzdCB0aGUgcGFja2V0IHNpemUgdG8gcmVmbGVjdCB0aGUgcGFkIAorICAgICAgICAgICAgICAgICAgICBhbmlBc2ZQYWNrZXRNb3ZlUmlnaHQoa2V5RGF0YSwgcGFkTGVuKTsgCisgICAgICAgICAgICAgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwpICkgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlZm9yZSBBRVMgS2V5IFdyYXA6IHBhZGRlZCBncm91cEtleUxlbiA9ICVkIiwgZ3JvdXBLZXlMZW4pOworCisgICAgICAgICAgICAgICAgcmV0VmFsID0gYW5pU3NtQWVzS2V5V3JhcChmc20tPmNyeXB0SGFuZGxlLCBncm91cEtleUJ5dGVzLCBncm91cEtleUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3RhQ3R4LT5wdGsgKyBBTklfRUFQT0xfS0VZX1JTTl9NSUNfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9FQVBPTF9LRVlfUlNOX0VOQ19LRVlfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3cmFwcGVkS2V5KTsKKyAgICAgICAgICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsKSApIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIFRoaXMgZG9lc24ndCB3b3JrLi4uCisgICAgICAgICAgICAgICAgLy9ncm91cEtleUJ5dGVzID0gd3JhcHBlZEtleTsKKyAgICAgICAgICAgICAgICAvL2dyb3VwS2V5TGVuICs9IEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkU7CisgICAgICAgICAgICAgICAgLy8gLi4uaGVyZSBpcyB0aGUgcmlnaHQgd2F5IHRvIGRvIGl0CisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBsZW5ndGggb2YgdGhlIHByZXBlbmRlZCBJViBBWzBdCisgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gd3JhcHBlZEtleSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBncm91cEtleUxlbiArPSBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFOworICAgICAgICAgICAgICAgIG1lbWNweSggZ3JvdXBLZXlCeXRlcywgd3JhcHBlZEtleSwgZ3JvdXBLZXlMZW4pOworICAgICAgICAgICAgICAgIC8vIEZyZWUgdGhlIGFycmF5IHVzZWQgdG8gaG9sZCB0aGUgd3JhcHBlZCBrZXkKKyAgICAgICAgICAgICAgICBpZiAod3JhcHBlZEtleSkgdm9zX21lbV9mcmVlKCB3cmFwcGVkS2V5KTsKKyAgICAgICAgICAgICAgICAvLyBJTU1FRElBVEVMWSBhZGp1c3QgdGhlIHBhY2tldCBzaXplIHRvIHJlZmxlY3QgdGhlIElWIAorICAgICAgICAgICAgICAgIGFuaUFzZlBhY2tldE1vdmVSaWdodChrZXlEYXRhLCBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkF1dGggUkM0IEtleSBXcmFwIGludm9rZWQuIGdyb3VwS2V5TGVuID0gJWQiLCBncm91cEtleUxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eERlc2Mua2V5RGF0YUxlbiA9IGFuaUFzZlBhY2tldEdldEJ5dGVzKGtleURhdGEsICZ0eERlc2Mua2V5RGF0YSk7CisKKyAgICAgICAgICAgIHJldFZhbCA9IGFuaUVhcG9sV3JpdGVLZXkoZnNtLT5jcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNtLT5sYXN0RWFwb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3RhQ3R4LT5zdXBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc20tPnN0YUN0eC0+YXV0aE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX0VBUE9MX0tFWV9ERVNDX1RZUEVfUlNOX05FVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR4RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNtLT5zdGFDdHgtPnB0aywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NSX0FFU19LRVlfTEVOKTsKKyAgICAgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwpICkgYnJlYWs7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0cmFuc21pdCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggYmFwUnNuU2VuZEVhcG9sRnJhbWUoIGZzbS0+Y3R4LT5wdm9zR0N0eCwgZnNtLT5sYXN0RWFwb2wgKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0VmFsID0gQU5JX09LOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy93ZSBmYWlsIHRvIHNlbmQgdGhlIGVhcG9sIGZyYW1lIGRpc2Nvbm5lY3QKKyAgICAgICAgICAgIGJhcEF1dGhEaXNjb25uZWN0KCBmc20tPmN0eCApOworICAgICAgICAgICAgcmV0VmFsID0gQU5JX0VSUk9SOworICAgICAgICB9CisKKyAgICB9d2hpbGUoIDAgKTsKKworICAgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBpbnQKK2dvdG9TdGF0ZVB0a0luaXREb25lKHRBdXRoUnNuRnNtICpmc20sIHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICpkYXRhKQoreworICAgIGludCByZXRWYWw7CisgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyAqcnhEZXNjOworICAgIHRDc3JSb2FtU2V0S2V5IHNldEtleUluZm87CisKKyAgICBmc20tPmN1cnJlbnRTdGF0ZSA9IFBUS19JTklUX0RPTkU7CisKKyAgICByeERlc2MgPSBkYXRhLT5rZXlEZXNjOworCisgICAgdm9zX21lbV96ZXJvKCAmc2V0S2V5SW5mbywgc2l6ZW9mKCB0Q3NyUm9hbVNldEtleSApICk7CisgICAgc2V0S2V5SW5mby5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworICAgIHNldEtleUluZm8ua2V5RGlyZWN0aW9uID0gZVNJUl9UWF9SWDsKKyAgICB2b3NfbWVtX2NvcHkoIHNldEtleUluZm8ucGVlck1hYywgZnNtLT5zdGFDdHgtPnN1cHBNYWMsIHNpemVvZiggdEFuaU1hY0FkZHIgKSApOworICAgIHNldEtleUluZm8ucGFlUm9sZSA9IDA7IC8vdGhpcyBpcyBhIHN1cHBsaWNhbnQKKyAgICBzZXRLZXlJbmZvLmtleUlkID0gMDsgICAvL2Fsd2F5cworICAgIHNldEtleUluZm8ua2V5TGVuZ3RoID0gQ1NSX0FFU19LRVlfTEVOOyAKKyAgICB2b3NfbWVtX2NvcHkoIHNldEtleUluZm8uS2V5LCAodl9VOF90ICopZnNtLT5zdGFDdHgtPnB0ayArICgyICogQ1NSX0FFU19LRVlfTEVOICksIENTUl9BRVNfS0VZX0xFTiApOworICAgIC8vZnNtLT5zdXBwQ3R4LT5wdGsgY29udGFpbnMgdGhlIDMgMTYtYnl0ZXMga2V5cy4gV2UgbmVlZCB0aGUgbGFzdCBvbmUuCisgICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggYmFwU2V0S2V5KCBmc20tPmN0eC0+cHZvc0dDdHgsICZzZXRLZXlJbmZvICkgKSApCisgICAgeworICAgICAgICAvL0RvbmUKKyAgICAgICAgYW5pQXNmUGFja2V0RW1wdHlFeHBsaWNpdChmc20tPmxhc3RFYXBvbCwgRUFQT0xfVFhfSEVBREVSX1NJWkUpOworICAgICAgICByZXRWYWwgPSBBTklfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkF1dGg6IGdvdG9TdGF0ZVB0a0luaXREb25lIGZhaWwgdG8gc2V0IGtleVxuIiApOworICAgICAgICByZXRWYWwgPSBBTklfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIGludAorZ290b1N0YXRlVXBkYXRlS2V5c1JlcSh0QXV0aFJzbkZzbSAqZnNtLCB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqZGF0YSkKK3sKKyAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyeERlc2M7CisKKyAgICBmc20tPmN1cnJlbnRTdGF0ZSA9IFVQREFURV9LRVlTX1JFUTsKKworICAgIHJ4RGVzYyA9IGRhdGEtPmtleURlc2M7CisKKyAgICBhbmlTc21SZXBsYXlDdHJVcGRhdGUoZnNtLT5zdGFDdHgtPnBlZXJSZXBsYXlDdHIsIHJ4RGVzYy0+cmVwbGF5Q291bnRlcik7CisKKyAgICBjaGVja1RyYW5zaXRpb24oZnNtLCBkYXRhKTsKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKK3N0YXRpYyBpbnQKK2dvdG9TdGF0ZUludGVnRmFpbHVyZSh0QXV0aFJzbkZzbSAqZnNtLCB0U2lyTWljRmFpbHVyZUluZm8gKm1pY0ZhaWx1cmVJbmZvKQoreworICAgIGZzbS0+Y3VycmVudFN0YXRlID0gSU5URUdfRkFJTFVSRTsKKworICAgIGZzbS0+aW50ZWdGYWlsZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICBjaGVja1RyYW5zaXRpb24oZnNtLCBOVUxMKTsgLy8gVUNUCisKKyAgICByZXR1cm4gQU5JX09LOworfQorCitzdGF0aWMgaW50Citnb3RvU3RhdGVLZXlVcGRhdGUodEF1dGhSc25Gc20gKmZzbSkKK3sKKyAgICBmc20tPmN1cnJlbnRTdGF0ZSA9IEtFWV9VUERBVEU7CisKKyAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NfcmFuZF9nZXRfYnl0ZXMoZnNtLT5jcnlwdEhhbmRsZSwgZnNtLT5hTm9uY2UsIEFOSV9FQVBPTF9LRVlfUlNOX05PTkNFX1NJWkUpICkgKQorICAgIHsKKworICAgICAgICAvLyBSZXBsYXkgY291bnRlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB3aGVuIHdlIGNyZWF0ZSBhCisgICAgICAgIC8vIG5ldyBwYWNrZXQKKyAgICAgICAgCisgICAgICAgIGNoZWNrVHJhbnNpdGlvbihmc20sIE5VTEwpOyAvLyBVQ1QKKworICAgICAgICByZXR1cm4gQU5JX09LOworICAgIH0KKyAgICByZXR1cm4gQU5JX0VSUk9SOworfQorCitzdGF0aWMgaW50Citnb3RvU3RhdGVEaXNjb25uZWN0KHRBdXRoUnNuRnNtICpmc20pCit7CisgICAgZnNtLT5jdXJyZW50U3RhdGUgPSBESVNDT05ORUNUOworCisgICAgLy9XaGF0IGVsc2UgZG8gd2UgbmVlZCB0byBjbGVhbiB1cD8gT3IgQkFQIHdpbGwgY2FsbCBvdXIgdmxlYW51cCBmdW5jdGlvbj8KKworICAgIC8vIEZTTSBkb2VzIG5vdCBleGlzdCBhZnRlciB0aGlzLi4uCisgICAgYmFwQXV0aERpc2Nvbm5lY3QoIGZzbS0+Y3R4ICk7CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCitzdGF0aWMgCitpbnQgemVyb091dFB0ayh0QXV0aFJzbkZzbSAqZnNtKQoreworICAgIHJldHVybiBBTklfT0s7Cit9CisKK3N0YXRpYyAKK2ludCBzdG9wQWxsVGltZXJzKHRBdXRoUnNuRnNtICpmc20pCit7CisgICAgdm9zX3RpbWVyX3N0b3AoICZmc20tPm1zZzJUaW1lciApOworICAgIHZvc190aW1lcl9zdG9wKCAmZnNtLT5tc2c0VGltZXIgKTsKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKK3N0YXRpYworaW50IGRlcml2ZVB0ayh0QXV0aFJzbkZzbSAqZnNtLCB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqZGF0YSkKK3sKKyAgICB2X1UzMl90IHByZkxlbjsKKyAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyeERlc2M7CisKKyAgICBWT1NfQVNTRVJUKGZzbS0+c3RhQ3R4LT5wbWspOworCisgICAgc3dpdGNoIChmc20tPnN0YUN0eC0+cHdDaXBoZXJUeXBlKSAKKyAgICB7CisgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM6CisgICAgICAgIHByZkxlbiA9IEFBR19SU05fUFRLX1BSRl9MRU5fQ0NNUDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIkF1dGggY2Fubm90IGdlbmVyYXRlIFBUSyBmb3IgaW52YWxpZCBhbGdvcml0aG0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZnNtLT5zdGFDdHgtPnB3Q2lwaGVyVHlwZSk7CisgICAgICAgIHJldHVybiBBTklfRV9JTExFR0FMX0FSRzsKKyAgICAgICAgYnJlYWs7CisgICAgfTsKKworICAgIHJ4RGVzYyA9ICh0QW5pRWFwb2xSc25LZXlEZXNjICopIGRhdGEtPmtleURlc2M7CisgICAgcmV0dXJuIGFhZ1B0a1ByZihmc20tPmNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgZnNtLT5zdGFDdHgtPnB0aywKKyAgICAgICAgICAgICAgICAgICAgIHByZkxlbiwKKyAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3RhQ3R4LT5wbWssCisgICAgICAgICAgICAgICAgICAgICBmc20tPnN0YUN0eC0+YXV0aE1hYywKKyAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3RhQ3R4LT5zdXBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgZnNtLT5hTm9uY2UsCisgICAgICAgICAgICAgICAgICAgICByeERlc2MtPmtleU5vbmNlKTsKK30KKworc3RhdGljIGludCAKK2NoZWNrTWljKHRBdXRoUnNuRnNtICpmc20sIAorICAgICAgICAgdEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGEgKmRhdGEpCit7CisgICAgaW50IHJldFZhbDsKKworICAgIHJldFZhbCA9IGFuaUVhcG9sS2V5Q2hlY2tNaWMoZnNtLT5jcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPmVhcG9sRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+a2V5RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3RhQ3R4LT5wdGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1JfQUVTX0tFWV9MRU4pOworCisgICAgaWYgKHJldFZhbCA9PSBBTklfRV9NSUNfRkFJTEVEKSAKKyAgICB7CisKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIkF1dGggZmFpbGVkIEVBUE9MLU1JQyBjaGVjayBpbiBwYWlyd2lzZSBrZXkgZXhjaGFuZ2UhXG4iKTsgCisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIGludCAKK2NoZWNrTG9jYWxSZXBsYXlDb3VudGVyKHRBdXRoUnNuRnNtICpmc20sIAorICAgICAgICAgICAgICAgICAgICAgICAgdEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGEgKmRhdGEpCit7CisgICAgaW50IHJldFZhbCA9IEFOSV9FX05VTExfVkFMVUU7CisgICAgaW50IGNtcDsKKyAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyeERlc2M7CisgICAgCisgICAgcnhEZXNjID0gZGF0YS0+a2V5RGVzYzsKKyAgICBpZiggcnhEZXNjICkKKyAgICB7CisgICAgICAgIGNtcCA9IGFuaVNzbVJlcGxheUN0ckNtcChmc20tPnN0YUN0eC0+bG9jYWxSZXBsYXlDdHIsIHJ4RGVzYy0+cmVwbGF5Q291bnRlcik7CisKKyAgICAgICAgLy8gVGhlIFNUQSBzaG91bGQgaGF2ZSBzZW50IGJhY2sgdGhlIHNhbWUgcmVwbGF5IGN0ciBhcyBpbiBvdXIgcmVxdWVzdAorICAgICAgICBpZiAoY21wICE9IDApIAorICAgICAgICB7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfRV9SRVBMQVlfQ0hFQ0tfRkFJTEVEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0VmFsID0gQU5JX09LOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIAoraW50IGNoZWNrUGVlclJlcGxheUNvdW50ZXIodEF1dGhSc25Gc20gKmZzbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqZGF0YSkKK3sKKyAgICBpbnQgcmV0VmFsID0gQU5JX0VfTlVMTF9WQUxVRTsKKyAgICBpbnQgY21wOworICAgIHRBbmlFYXBvbFJzbktleURlc2MgKnJ4RGVzYzsKKyAgICAKKyAgICByeERlc2MgPSBkYXRhLT5rZXlEZXNjOworICAgIGlmKCByeERlc2MgKQorICAgIHsKKyAgICAgICAgY21wID0gYW5pU3NtUmVwbGF5Q3RyQ21wKGZzbS0+c3RhQ3R4LT5wZWVyUmVwbGF5Q3RyLCByeERlc2MtPnJlcGxheUNvdW50ZXIpOworCisgICAgICAgIC8vIFRoZSBTVEEgc2hvdWxkIGhhdmUgc2VudCBhIG5ld2VyIHJlcGxheSBjdHIgdGhhbiBpdHMgb2xkCisgICAgICAgIC8vIHJlcXVlc3QuIFRoZSBmaXJzdCBtZXNzYWdlIGlzIGV4ZW1wdGVkIGZyb20gdGhlIGNoZWNrLgorICAgICAgICBpZiAoZnNtLT5zdGFDdHgtPnBhc3RGaXJzdFBlZXJSZXF1ZXN0ICYmIGNtcCA+PSAwKSAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0VmFsID0gQU5JX0VfUkVQTEFZX0NIRUNLX0ZBSUxFRDsKKyAgICAgICAgfQorCisgICAgICAgIGZzbS0+c3RhQ3R4LT5wYXN0Rmlyc3RQZWVyUmVxdWVzdCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tJbmZvRWxlbWVudCh0QXV0aFJzbkZzbSAqZnNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICpkYXRhKQoreworICAgIHRBbmlFYXBvbFJzbktleURlc2MgKmRlc2M7CisgICAgdl9VOF90ICppZVN0YUJ5dGVzOworICAgIGludCBpZVN0YUxlbjsKKworICAgIGRlc2MgPSAodEFuaUVhcG9sUnNuS2V5RGVzYyAqKSBkYXRhLT5rZXlEZXNjOworICAgIGlmKCBkZXNjICkKKyAgICB7CisgICAgICAgIGllU3RhTGVuID0gYW5pQXNmUGFja2V0R2V0Qnl0ZXMoZnNtLT5zdGFDdHgtPmllU3RhLCAmaWVTdGFCeXRlcyk7CisgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCBpZVN0YUxlbiApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGllU3RhTGVuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChkZXNjLT5rZXlEYXRhTGVuICE9IGllU3RhTGVuKSB8fAorICAgICAgICAgICAgKCAhdm9zX21lbV9jb21wYXJlKGRlc2MtPmtleURhdGEsIGllU3RhQnl0ZXMsIGllU3RhTGVuLTIpICkpIAorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGggU1RBIHNlbnQgaW5jb25zaXN0ZW50IFJTTiBJRSFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFOSV9FX0ZBSUxFRDsKKyAgICAgICAgfQorICAgICAgICAvLyBDb3B5IFJTTiBJRQorICAgICAgICAvL3Zvc19tZW1fY29weShmc20tPmFkdmVydGl6ZWRSc25JZSwgZGVzYy0+a2V5RGF0YSwgaWVTdGFMZW4pOworICAgICAgICB2b3NfbWVtX2NvcHkoZnNtLT5hZHZlcnRpemVkUnNuSWUsIGllU3RhQnl0ZXMsIGllU3RhTGVuKTsKKworICAgICAgICByZXR1cm4gQU5JX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQU5JX0VfTlVMTF9WQUxVRTsKKyAgICB9CisKK30KKworc3RhdGljIAoraW50IGNoZWNrVHJhbnNpdGlvbih0QXV0aFJzbkZzbSAqZnNtLCB2b2lkICphcmcpCit7CisgICAgaW50IHJldFZhbDsKKyAgICB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqZGF0YTsKKyAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyeERlc2M7CisgICAgdFNpck1pY0ZhaWx1cmVJbmZvICptaWNGYWlsdXJlSW5mbzsKKworICAgIGlmIChmc20tPmRpc2Nvbm5lY3QpIAorICAgIHsKKyAgICAgICAgc3RvcEFsbFRpbWVycyhmc20pOworICAgICAgICBnb3RvU3RhdGVEaXNjb25uZWN0KGZzbSk7CisgICAgICAgIHJldHVybiBBTklfT0s7CisgICAgfQorCisgICAgaWYgKGZzbS0+YXV0aFJlcSkgCisgICAgeworICAgICAgICBzdG9wQWxsVGltZXJzKGZzbSk7CisgICAgICAgIGdvdG9TdGF0ZUF1dGhlbnRpY2F0aW9uKGZzbSk7CisgICAgICAgIHJldHVybiBBTklfT0s7CisgICAgfQorCisgICAgc3dpdGNoIChmc20tPmN1cnJlbnRTdGF0ZSkgCisgICAgeworICAgIGNhc2UgSU5JVElBTElaRToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVVRIRU5USUNBVElPTjoKKyAgICAgICAgZ290b1N0YXRlQXV0aGVudGljYXRpb24yKGZzbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVUSEVOVElDQVRJT05fMjoKKyAgICAgICAgZ290b1N0YXRlR2V0UHNrKCBmc20gKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHRVRfUFNLOgorICAgICAgICAvL1dlIGFsd2F5cyBoYXZlIFBNSyBvdGhlcndpc2UgQkFQIHdvbid0IGxldCB1cyBoZXJlCisgICAgICAgIGdvdG9TdGF0ZVB0a1N0YXJ0KGZzbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFRLX1NUQVJUOgorICAgICAgICBpZiAoIGZzbS0+ZWFwb2xBdmFpbCApIAorICAgICAgICB7CisgICAgICAgICAgICBmc20tPmVhcG9sQXZhaWwgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICBpZiAoTlVMTCA9PSBhcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZyBpcyBOVUxMLCBleGl0aW5nIGNoZWNrVHJhbnNpdGlvbigpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFOSV9FX0ZBSUxFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEgPSAodEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGEgKikgYXJnOworICAgICAgICAgICAgcmV0VmFsID0gY2hlY2tMb2NhbFJlcGxheUNvdW50ZXIoZnNtLCBkYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKQorICAgICAgICAgICAgICAgIHJldHVybiBBTklfT0s7IC8vIENhbGxlciBzaG91bGQgbm90IGZhaWwKKyAgICAgICAgICAgIHJldFZhbCA9IGRlcml2ZVB0ayhmc20sIGRhdGEpOworICAgICAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGggZGVyaXZlUHRrIGZhaWxlZCB3aXRoIGNvZGUgJWQhXG4iLCByZXRWYWwpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXRWYWwgPSBjaGVja01pYyhmc20sIGRhdGEpOworICAgICAgICAgICAgaWYgKHJldFZhbCAhPSBBTklfT0spIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhcEF1dGhEaXNjb25uZWN0KCBmc20tPmN0eCApOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXRWYWwgPSBnb3RvU3RhdGVQdGtJbml0TmVnbyhmc20sIGFyZyk7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UgaWYgKCBmc20tPm1zZzJUaW1lT3V0ICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmc20tPm51bVRyaWVzIDw9IGF1dGhDb25zdHMubWF4VHJpZXMpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGggUmV0cmFuc21pdHRpbmcgRUFQT0wtS2V5IE1zZzFcbiIpOworICAgICAgICAgICAgICAgIC8vIFN0YXkgaW4gdGhlIHNhbWUgc3RhdGUgYnV0IHJlcGVhdCBhY3Rpb25zCisgICAgICAgICAgICAgICAgZ290b1N0YXRlUHRrU3RhcnQoZnNtKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXRoIGZhaWxlZCB0byByZWN2IEVBUE9MLUtleSBNc2cyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3RpbmcuLi5cbiIpOworCisgICAgICAgICAgICAgICAgZ290b1N0YXRlRGlzY29ubmVjdChmc20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFRLX0lOSVRfTkVHTzoKKyAgICAgICAgaWYgKE5VTEwgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJhcmcgaXMgTlVMTCwgZXhpdGluZyBjaGVja1RyYW5zaXRpb24oKSIpOworICAgICAgICAgICAgcmV0dXJuIEFOSV9FX0ZBSUxFRDsKKyAgICAgICAgfQorICAgICAgICBkYXRhID0gKHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICopIGFyZzsKKyAgICAgICAgcmV0VmFsID0gY2hlY2tJbmZvRWxlbWVudChmc20sIGRhdGEpOworICAgICAgICBpZiAocmV0VmFsICE9IEFOSV9PSykgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG9TdGF0ZURpc2Nvbm5lY3QoZnNtKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBnb3RvU3RhdGVQdGtJbml0TmVnb1R4KGZzbSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQVEtfSU5JVF9ORUdPX1RYOgorICAgICAgICBpZiAoZnNtLT5lYXBvbEF2YWlsKSAKKyAgICAgICAgeworICAgICAgICAgICAgZnNtLT5lYXBvbEF2YWlsID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgaWYgKE5VTEwgPT0gYXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmcgaXMgTlVMTCwgZXhpdGluZyBjaGVja1RyYW5zaXRpb24oKSIpOworICAgICAgICAgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhID0gKHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICopIGFyZzsKKyAgICAgICAgICAgIHJldFZhbCA9IGNoZWNrTG9jYWxSZXBsYXlDb3VudGVyKGZzbSwgZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0VmFsICE9IEFOSV9PSykKKyAgICAgICAgICAgICAgICByZXR1cm4gQU5JX09LOyAvLyBDYWxsZXIgc2hvdWxkIG5vdCBmYWlsCisgICAgICAgICAgICByZXRWYWwgPSBjaGVja01pYyhmc20sIGRhdGEpOworICAgICAgICAgICAgaWYgKHJldFZhbCAhPSBBTklfT0spIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhcEF1dGhEaXNjb25uZWN0KCBmc20tPmN0eCApOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXRWYWwgPSBnb3RvU3RhdGVQdGtJbml0RG9uZShmc20sIGRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKCBmc20tPm1zZzRUaW1lT3V0ICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmc20tPm51bVRyaWVzIDw9IGF1dGhDb25zdHMubWF4VHJpZXMpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGggcmV0cmFuc21pdHRpbmcgRUFQT0wtS2V5IE1zZzMgXG4iKTsKKyAgICAgICAgICAgICAgICAvLyBTdGF5IGluIHRoZSBzYW1lIHN0YXRlIGJ1dCByZXBlYXQgYWN0aW9ucworICAgICAgICAgICAgICAgIGdvdG9TdGF0ZVB0a0luaXROZWdvVHgoZnNtKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXRoIGZhaWxlZCB0byByZWN2IEVBUE9MLUtleSBNc2c0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3RpbmcuLi5cbiIgKTsKKworICAgICAgICAgICAgICAgIGdvdG9TdGF0ZURpc2Nvbm5lY3QoZnNtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFBUS19JTklUX0RPTkU6CisgICAgICAgIGlmIChmc20tPmVhcG9sQXZhaWwpIHsKKworICAgICAgICAgICAgZnNtLT5lYXBvbEF2YWlsID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgaWYgKE5VTEwgPT0gYXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmcgaXMgTlVMTCwgZXhpdGluZyBjaGVja1RyYW5zaXRpb24oKSIpOworICAgICAgICAgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhID0gKHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICopIGFyZzsKKyAgICAgICAgICAgIHJ4RGVzYyA9ICh0QW5pRWFwb2xSc25LZXlEZXNjICopIGRhdGEtPmtleURlc2M7CisKKyAgICAgICAgICAgIGlmIChyeERlc2MtPmluZm8ucmVxdWVzdEZsYWcpIAorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgcmV0VmFsID0gY2hlY2tQZWVyUmVwbGF5Q291bnRlcihmc20sIGRhdGEpOworICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU5JX09LOyAvLyBDYWxsZXIgc2hvdWxkIG5vdCBmYWlsCisKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBjaGVja01pYyhmc20sIGRhdGEpOworICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJhcEF1dGhEaXNjb25uZWN0KCBmc20tPmN0eC0+cHZvc0dDdHggKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBnb3RvU3RhdGVVcGRhdGVLZXlzUmVxKGZzbSwgYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSBpZiAoZnNtLT5pbnRlZ0ZhaWxlZCkgeworCisgICAgICAgICAgICBtaWNGYWlsdXJlSW5mbyA9ICh0U2lyTWljRmFpbHVyZUluZm8gKikgYXJnOworICAgICAgICAgICAgZ290b1N0YXRlSW50ZWdGYWlsdXJlKGZzbSwgYXJnKTsKKworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVVBEQVRFX0tFWVNfUkVROgorCisgICAgICAgIGlmIChOVUxMID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiYXJnIGlzIE5VTEwsIGV4aXRpbmcgY2hlY2tUcmFuc2l0aW9uKCkiKTsKKyAgICAgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisgICAgICAgIH0KKyAgICAgICAgZGF0YSA9ICh0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqKSBhcmc7CisgICAgICAgIHJ4RGVzYyA9ICh0QW5pRWFwb2xSc25LZXlEZXNjICopIGRhdGEtPmtleURlc2M7CisKKyAgICAgICAgaWYgKHJ4RGVzYy0+aW5mby5lcnJvckZsYWcpIAorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIHdhcyBnZW5lcmF0ZWQgYnkgYSB1bmljYXN0IHBhY2tldCBzZW50IGZyb20gdGhlIEFQIHRvIHRoZSBTVEEvQlAuCisgICAgICAgICAgICAgKiBUaGUgVFggYWRkcmVzcyBpcyB0aGUgQVAncyBhZGRyZXNzLiBUaGUgc3JjIGFkZHJlc3MgaXMgbG9zdC4KKyAgICAgICAgICAgICAqIElmIHRoZSBTVEEgaXMgYSBCUCwgdGhlbiB0aGUgdHJ1ZSBkc3QgaXMgbG9zdC4gV2Ugd2lsbCB0cmVhdAorICAgICAgICAgICAgICogdGhlIGRzdCBmaWVsZCBhcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVwb3J0ZXIgb2YgdGhlIE1JQyBmYWlsdXJlLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIG1pY0ZhaWx1cmVJbmZvID0gKHRTaXJNaWNGYWlsdXJlSW5mbyAqKSB2b3NfbWVtX21hbGxvYyggc2l6ZW9mKHRTaXJNaWNGYWlsdXJlSW5mbykgKTsKKyAgICAgICAgICAgIGlmKCBOVUxMID09IG1pY0ZhaWx1cmVJbmZvICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgQXV0aFJzbkZzbTogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZnNtLT5jdXJyZW50U3RhdGUpOworICAgICAgICAgICAgICAgIHJldHVybiBBTklfRV9NQUxMT0NfRkFJTEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b3NfbWVtX2NvcHkobWljRmFpbHVyZUluZm8tPnRhTWFjQWRkciwgZnNtLT5zdGFDdHgtPmF1dGhNYWMsIHNpemVvZih0QW5pTWFjQWRkcikpOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KG1pY0ZhaWx1cmVJbmZvLT5kc3RNYWNBZGRyLCBmc20tPnN0YUN0eC0+c3VwcE1hYywgc2l6ZW9mKHRBbmlNYWNBZGRyKSk7CisgICAgICAgICAgICBtaWNGYWlsdXJlSW5mby0+bXVsdGljYXN0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgLy8gQ29weSB3aGF0ZXZlciBzZXF1ZW5jZSBudW1iZXIgY2FtZSBpbiB0aGUgRUFQT0wta2V5IG1lc3NhZ2UKKyAgICAgICAgICAgIHZvc19tZW1fY29weShtaWNGYWlsdXJlSW5mby0+VFNDLCByeERlc2MtPmtleVJlY3ZTZXFDb3VudGVyLCBTSVJfQ0lQSEVSX1NFUV9DVFJfU0laRSk7CisgICAgICAgICAgICBnb3RvU3RhdGVJbnRlZ0ZhaWx1cmUoZnNtLCBtaWNGYWlsdXJlSW5mbyk7CisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUobWljRmFpbHVyZUluZm8pOworICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRCRDogVW50ZXN0ZWQuIFdoeSBhcmUgbG9jYWwgYU5vbmNlIGFuZCBsb2NhbCByZXBseUN0ciBub3QgaW5jcmVtZW50ZWQgaW4gc3BlYz8KKyAgICAgICAgICAgIGdvdG9TdGF0ZVB0a1N0YXJ0KGZzbSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFR19GQUlMVVJFOgorICAgICAgICBnb3RvU3RhdGVLZXlVcGRhdGUoZnNtKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlfVVBEQVRFOgorICAgICAgICBnb3RvU3RhdGVQdGtTdGFydChmc20pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiTm90aGluZyB0byBkbyBpbiB0aGlzIHN0YXRlIGZvciBBdXRoUnNuRnNtOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmc20tPmN1cnJlbnRTdGF0ZSk7CisgICAgICAgIC8vIENhdGNoIGFsbCBmb3Igc3RhdGVzIHRoYXQgbmVlZCBubyBjaGFuZ2U6CisgICAgICAgIC8vICAgICAgICBhc3NlcnQoZUFOSV9CT09MRUFOX0ZBTFNFICYmICJJbGxlZ2FsIEF1dGhSc25Gc20gc3RhdGUhIik7CisgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisgICAgfQorCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworCitzdGF0aWMgdm9pZCBtc2cyVGltZXJDYWxsYmFjayggdm9pZCAqcHYgKQoreworICAgIHRBdXRoUnNuRnNtICpmc20gPSAodEF1dGhSc25Gc20gKilwdjsKKyAgICBpZiAoTlVMTCA9PSBmc20pIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgImZzbSBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9Pbmx5IHdoZW4gd2FpdGluZyBmb3IgbXNnMgorICAgIGlmKCBQVEtfU1RBUlQgPT0gZnNtLT5jdXJyZW50U3RhdGUgKQorICAgIHsKKyAgICAgICAgZnNtLT5tc2cyVGltZU91dCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIH0KKyAgICAvL1dlIG1heSBuZWVkIHRvIHN5bmNocm9uaXplIHRoaXMgY2FsbAorICAgIGF1dGhSc25Gc21Qcm9jZXNzRXZlbnQoIGZzbSwgUlNOX0ZTTV9USU1FUl9FWFBJUkVELCBOVUxMICk7Cit9CisKK3N0YXRpYyB2b2lkIG1zZzRUaW1lckNhbGxiYWNrKCB2b2lkICpwdiApCit7CisgICAgdEF1dGhSc25Gc20gKmZzbSA9ICh0QXV0aFJzbkZzbSAqKXB2OworICAgIGlmIChOVUxMID09IGZzbSkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiZnNtIGlzIE5VTEwgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL09ubHkgd2hlbiB3ZSBhcmUgd2FpdGluZyBmb3IgbXNnNAorICAgIGlmKCBQVEtfSU5JVF9ORUdPX1RYID09IGZzbS0+Y3VycmVudFN0YXRlICkKKyAgICB7CisgICAgICAgIGZzbS0+bXNnNFRpbWVPdXQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB9CisgICAgLy9XZSBtYXkgbmVlZCB0byBzeW5jaHJvbml6ZSB0aGlzIGNhbGwKKyAgICBhdXRoUnNuRnNtUHJvY2Vzc0V2ZW50KCBmc20sIFJTTl9GU01fVElNRVJfRVhQSVJFRCwgTlVMTCApOworfQorCisKKy8vCisvL1RoaXMgZnVuY3Rpb24gYWx3YXN5IGFzc3VtZSB0aGUgaW5jb21pbmcgdm9zX3BhY2tldCBpcyA4MDJfMyBmcmFtZS4KK3N0YXRpYyBpbnQgYXV0aFJzblJ4RnJhbWVIYW5kbGVyKCB2X1BWT0lEX3QgcHZvc0dDdHgsIHZvc19wa3RfdCAqcFBhY2tldCApCit7CisgICAgaW50IHJldFZhbCA9IEFOSV9FUlJPUjsKKyAgICB0QW5pUGFja2V0ICpwQW5pUGFja2V0OworICAgIHRCdGFtcENvbnRleHQgKmN0eDsKKyAgICB0QXV0aFJzbkZzbSAqZnNtOworCisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovIAorICAgIGlmICgocHZvc0dDdHggPT0gTlVMTCkgfHwgKE5VTEwgPT0gcFBhY2tldCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAicGFyYW0gaXMgTlVMTCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICBjdHggPSAodEJ0YW1wQ29udGV4dCAqKVZPU19HRVRfQkFQX0NCKCBwdm9zR0N0eCApOworICAgIGlmIChOVUxMID09IGN0eCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiY3R4IGlzIE5VTEwgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisgICAgZnNtID0gJmN0eC0+dUZzbS5hdXRoRnNtOworICAgIGlmIChOVUxMID09IGZzbSkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiZnNtIGlzIE5VTEwgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIC8vVG9ETzogV2UgbmVlZCB0byBzeW5jaHJvbml6ZSB0aGlzLiBGb3Igbm93LCB1c2UgdGhlIHNpbXBsZXN0IGZvcm0sIGRyb3AgdGhlIHBhY2tldCBjb21lcyBsYXRlci4KKyAgICAgICAgaWYoIGZzbS0+ZlJlY2VpdmluZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiICoqKioqKmF1dGhSc25SeEZyYW1lSGFuZGxlciByZWNlaXZlIGVhcG9sIHBhY2tldCB3aGlsZSBwcm9jZXNzaW5nLiBEcm9wIHRoZSBuZXcgY29tZXJcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZzbS0+ZlJlY2VpdmluZyA9IFZPU19UUlVFOworICAgICAgICByZXRWYWwgPSBiYXBSc25Gb3JtUGt0RnJvbVZvc1BrdCggJnBBbmlQYWNrZXQsIHBQYWNrZXQgKTsKKyAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkgYnJlYWs7CisgICAgICAgIC8vTm93IHdlIGNhbiBwcm9jZXNzIHRoZSBlYXBvbCBmcmFtZQorICAgICAgICAvL2hhbmRsZXIgd2lsbCBmcmVlIHRoZSBwQW5pUGFja2V0CisgICAgICAgIGJhcFJzbkVhcG9sSGFuZGxlciggZnNtLCBwQW5pUGFja2V0LCBWT1NfVFJVRSApOworICAgIH13aGlsZSggMCApOworCisgICAgZnNtLT5mUmVjZWl2aW5nID0gVk9TX0ZBTFNFOworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOworCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworCitzdGF0aWMgaW50IGF1dGhSc25UeENvbXBsZXRlSGFuZGxlciggdl9QVk9JRF90IHB2b3NHQ3R4LCB2b3NfcGt0X3QgKnBQYWNrZXQsIFZPU19TVEFUVVMgcmV0U3RhdHVzICkKK3sKKyAgICB0QnRhbXBDb250ZXh0ICpjdHggPSAodEJ0YW1wQ29udGV4dCAqKVZPU19HRVRfQkFQX0NCKCBwdm9zR0N0eCApOworICAgIHRBdXRoUnNuRnNtICpmc207CisKKyAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBQYWNrZXQgKTsKKyAgICBpZiAoTlVMTCA9PSBjdHgpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgImN0eCBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gQU5JX0VSUk9SOworICAgIH0KKworICAgIGZzbSA9ICZjdHgtPnVGc20uYXV0aEZzbTsKKyAgICBpZiAoTlVMTCA9PSBmc20pIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgImZzbSBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gQU5JX0VSUk9SOworICAgIH0KKworICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFN0YXR1cyApICkKKyAgICB7CisgICAgICAgIC8vTm8gbmVlZCB0byBkbyBhbnl0aGluZy4gUmV0cmFuc21pdCBpcyBoYW5kbGVkIGJ5IHRpbWVvdXQKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIkF1dGg6IFRMIFR4IGNvbXBsZXRlIHdpdGggZXJyb3IgJWQgY3VycmVudCBzdGF0ZSBpcyAlZCBcbiIsIHJldFN0YXR1cywgZnNtLT5jdXJyZW50U3RhdGUgKTsKKyAgICB9CisgICAgaWYoIFBUS19TVEFSVCA9PSBmc20tPmN1cnJlbnRTdGF0ZSApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICIgQXV0aDogc3RhcnQgbXNnMiB0aW1lclxuIiApOworICAgICAgICAvL1N0YXJ0IG1zZzJUaW1lcgorICAgICAgICBmc20tPm51bVRyaWVzKys7CisgICAgICAgIHZvc190aW1lcl9zdG9wKCAmZnNtLT5tc2cyVGltZXIgKTsKKyAgICAgICAgdm9zX3RpbWVyX3N0YXJ0KCZmc20tPm1zZzJUaW1lciwgYXV0aENvbnN0cy50aW1lb3V0UGVyaW9kKTsKKyAgICB9CisgICAgZWxzZSBpZiggKCBQVEtfSU5JVF9ORUdPID09IGZzbS0+Y3VycmVudFN0YXRlICkgfHwgCisgICAgICAgICggUFRLX0lOSVRfTkVHT19UWCA9PSBmc20tPmN1cnJlbnRTdGF0ZSApICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgIiBBdXRoOiBzdGFydCBtc2c0IHRpbWVyXG4iICk7CisgICAgICAgIGZzbS0+bnVtVHJpZXMrKzsKKyAgICAgICAgdm9zX3RpbWVyX3N0b3AoICZmc20tPm1zZzRUaW1lciApOworICAgICAgICB2b3NfdGltZXJfc3RhcnQoJmZzbS0+bXNnNFRpbWVyLCBhdXRoQ29uc3RzLnRpbWVvdXRQZXJpb2QpOworICAgIH0KKworICAgIHJldHVybiBBTklfT0s7Cit9CisKKworc3RhdGljIGludAorYXV0aEVhcG9sS2V5SGFuZGxlciggdEF1dGhSc25Gc20gKmZzbSwgdEFuaVBhY2tldCAqZWFwb2xGcmFtZSwgdEFuaU1hY0FkZHIgc3RhTWFjICkKK3sKKyAgICBpbnQgcmV0VmFsOworCisgICAgaW50IGRlc2NUeXBlOworICAgIHZvaWQgKmtleURlc2M7CisgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyAqcnNuRGVzYzsKKyAgICB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSBkYXRhOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHJldFZhbCA9IGFuaUVhcG9sUGFyc2VLZXkoZWFwb2xGcmFtZSwgJmRlc2NUeXBlLCAma2V5RGVzYyk7CisgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwgKSApIGJyZWFrOworCisgICAgICAgIGlmICgoZGVzY1R5cGUgPT0gQU5JX0VBUE9MX0tFWV9ERVNDX1RZUEVfUlNOX05FVykgCisgICAgICAgICAgICAgICAgfHwgKGRlc2NUeXBlID09IEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX1JTTikpIAorICAgICAgICB7CisgICAgICAgICAgICByc25EZXNjID0gKHRBbmlFYXBvbFJzbktleURlc2MgKikga2V5RGVzYzsKKyAgICAgICAgICAgIGRhdGEua2V5RGVzYyA9IGtleURlc2M7CisgICAgICAgICAgICBkYXRhLmVhcG9sRnJhbWUgPSBlYXBvbEZyYW1lOworICAgICAgICAgICAgLy8gUGFzcyBvbiB0aGUgZXZlbnQgdG8gdGhlIFJTTiBGU00gb25seSBpZiBpdCBpcyBmb3IgYSBwYWlyd2lzZSBrZXkKKyAgICAgICAgICAgIGlmIChyc25EZXNjLT5pbmZvLnVuaWNhc3RGbGFnKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBhdXRoUnNuRnNtUHJvY2Vzc0V2ZW50KGZzbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05fRlNNX0VBUE9MX0ZSQU1FX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL05vdCB3b3JyeSBhYm91dCBHVEsgc3R1ZmYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkdvdCB1bmV4cGVjdGVkIGxlZ2FjeSA4MDIuMXggUkM0IEtleSBtZXNzYWdlIFxuIiApOworICAgICAgICAgICAgcmV0VmFsID0gQU5JX0VfRkFJTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9d2hpbGUoIDAgKTsKKworICAgIGFuaUVhcG9sS2V5RnJlZURlc2MoZGVzY1R5cGUsIGtleURlc2MpOworICAgIHJldHVybiByZXRWYWw7Cit9CisKKwordm9pZCBhdXRoRWFwb2xIYW5kbGVyKCB0QXV0aFJzbkZzbSAqZnNtLCB0QW5pUGFja2V0ICplYXBvbEZyYW1lLAorICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBkc3RNYWMsIAorICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBzcmNNYWMsCisgICAgICAgICAgICAgICAgIHZfVThfdCAqdHlwZSkKK3sKKyAgICBzd2l0Y2ggKCp0eXBlKSAKKyAgICB7CisgICAgY2FzZSBBTklfRUFQT0xfVFlQRV9TVEFSVDoKKyAgICAgICAgLy9ObyBkb2luZyBhbnl0aGluZyBiZWNhdXNlIHdlIG9ubHkgc3VwcG9ydCBXUEEyLVBTSworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFOSV9FQVBPTF9UWVBFX0xPR09GRjoKKyAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTklfRUFQT0xfVFlQRV9LRVk6CisgICAgICAgIGF1dGhFYXBvbEtleUhhbmRsZXIoZnNtLCBlYXBvbEZyYW1lLCBzcmNNYWMpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiQXV0aDogRUFQT0wgdHlwZSBub3QgaW1wbGVtZW50ZWQ6IDB4JS4yeFxuIiwgKnR5cGUpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9DT1JFL0JBUC9zcmMvYmFwUnNuODAyMXhBdXRoRnNtLmggYi9DT1JFL0JBUC9zcmMvYmFwUnNuODAyMXhBdXRoRnNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ3ZDIwNwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvQkFQL3NyYy9iYXBSc244MDIxeEF1dGhGc20uaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFdvb2RzaWRlIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAkRmlsZTogLy9kZXBvdC9zb2Z0d2FyZS9wcm9qZWN0cy9mZWF0dXJlX2JyYW5jaGVzL2dlbjVfcGhhc2UxL29zL2xpbnV4L2NsYXNzaWMvYXAvYXBwcy9zc20vYXV0aDgwMjF4L2FuaTgwMjF4QXV0aFJzbkZzbS5oICQKKyAqCisgKiBDb250YWlucyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBSU04gRUFQT0wtS2V5IEZTTSBvbiB0aGUKKyAqIGF1dGhlbnRpY2F0b3Igc2lkZS4gVGhpcyBpcyBiYXNlZCBvbiA4MDIuMTFpLgorICoKKyAqIEF1dGhvcjogICAgICBNYXlhbmsgRC4gVXBhZGh5YXkKKyAqIERhdGU6ICAgICAgICAxOS1EZWNlbWJlci0yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICBNb2RpZmllZCBieSAgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpZm5kZWYgX19BQUdfQVVUSF9SU05fRlNNX0gKKyNkZWZpbmUgX19BQUdfQVVUSF9SU05fRlNNX0gKKworI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgInZvc190aW1lci5oIgorCisjaW5jbHVkZSAiYmFwSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJiYXBSc244MDIxeEZzbS5oIgorCisKKworLyoqCisgKiBhdXRoUnNuRnNtSW5pdAorICoKKyAqIEZVTkNUSU9OOgorICogSW5pdGlhbGl6ZXMgdGhlIGNvbnN0YW50cyBhbmQgdGhlIGNhbGxiYWNrcyBuZWVkZWQgYnkgdGhpcyBGU00KKyAqIG1vZHVsZS4KKyAqCisgKiBAcGFyYW0gY29uc3RzIHRoZSB2YXJpb3VzIGNvbnN0YW50IHZhbHVlcyBuZWVkZWQgYnkgdGhpcyBGU00KKyAqIEBwYXJhbSBjYiBjYWxsYmFja3MgdG8gdGhlIHZhcmlvdXMgcHJvY2VkdXJlcyBuZWVkZWQgYnkgdGhpcyBGU00KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYXV0aFJzbkZzbUluaXQodEF1dGhSc25Gc21Db25zdHMgKmNvbnN0cyk7CisKKy8qKgorICogYXV0aFJzbkZzbUNyZWF0ZQorICoKKyAqIEZVTkNUSU9OCisgKiBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBzdGF0ZSBvZiBhbiBSU04ga2V5IEZTTSBpbnN0YW5jZSBmb3IKKyAqIHRoZSBnaXZlbiBTVEEgY29udGV4dC4KKyAqIAorICogQHBhcm0gY3R4IHRoZSBTVEEgY29udGV4dCB3aG9zZSBpbnN0YW5jZSBpcyBiZWluZyBjcmVhdGVkCisgKiBAcGFyYW0gcHNrQmFzZWQgcGFzcyBpbiBlQU5JX0JPT0xFQU5fVFJVRSBpcyB0aGlzIFNUQSBpcyB0byBiZQorICogYXV0aGVudGljYXRlZCBiYXNlZCBvbiBhIHByZS1zaGFyZWQga2V5IGFzIG9wcG9zZWQgdG8gRUFQLgorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithdXRoUnNuRnNtQ3JlYXRlKHRCdGFtcENvbnRleHQgKmN0eCk7CisKKworCitpbnQKK2F1dGhSc25Gc21TZXRQbWsodFN0YUNvbnRleHQgKmN0eCwgdl9VOF90ICpwbWspOworCisjZW5kaWYgLy9fX0FBR19BVVRIX1JTTl9GU01fSApkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcFJzbjgwMjF4RnNtLmggYi9DT1JFL0JBUC9zcmMvYmFwUnNuODAyMXhGc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjJjN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcFJzbjgwMjF4RnNtLmgKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogV29vZHNpZGUgTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICRGaWxlOiAvL2RlcG90L3NvZnR3YXJlL3Byb2plY3RzL2ZlYXR1cmVfYnJhbmNoZXMvZ2VuNV9waGFzZTEvb3MvbGludXgvY2xhc3NpYy9hcC9hcHBzL3NzbS9hdXRoODAyMXgvYW5pODAyMXhGc20uaCAkCisgKiBDb250YWlucyB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgQXV0aCBBZ2VudCdzIEZTTSdzIHRvIHdvcmsuCisgKgorICogQXV0aG9yOiAgICAgIE1heWFuayBELiBVcGFkaHlheQorICogRGF0ZTogICAgICAgIDIxLUp1bmUtMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgTW9kaWZpZWQgYnkgICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaWZuZGVmIF9fQUFHX0ZTTV9IXworI2RlZmluZSBfX0FBR19GU01fSF8KKworI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgInZvc190cmFjZS5oIgorI2luY2x1ZGUgInZvc190aW1lci5oIgorI2luY2x1ZGUgPGJhcFJzblNzbVJlcGxheUN0ci5oPgorI2luY2x1ZGUgPGJhcFJzbkFzZlBhY2tldC5oPgorI2luY2x1ZGUgPGJhcFJzblNzbUVhcG9sLmg+CisjaW5jbHVkZSAiYmFwUnNuODAyMXhQcmYuaCIKKy8vI2luY2x1ZGUgImJhcEludGVybmFsLmgiCisjaW5jbHVkZSAiY3NyQXBpLmgiCisKK3R5cGVkZWYgc3RydWN0IHNCdGFtcENvbnRleHQgdEJ0YW1wQ29udGV4dDsKK3R5cGVkZWYgc3RydWN0IHRTdGFDb250ZXh0IHRTdGFDb250ZXh0OwordHlwZWRlZiBzdHJ1Y3QgdFN1cHBDb250ZXh0IHRTdXBwQ29udGV4dDsKKworI2RlZmluZSBSU05fTUFYX1BBQ0tFVF9TSVpFIDUxMgorI2RlZmluZSBSU05fODAyMTFfS0VZX0xFTiAgICAxNgorI2RlZmluZSBSU05fSUVfTUFYX1BBQ0tFVF9TSVpFIDI1NgorI2RlZmluZSBSU05fSUVfSEVBREVSX1NJWkUgMAorI2RlZmluZSBBQ0NUR19TRVNTSU9OX0lEX1NJWkUgOAorI2RlZmluZSBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFIDggLy8gQnl0ZXMKKworI2RlZmluZSAgQkFQX1NFVF9SU05fS0VZICAgMQorI2RlZmluZSAgQkFQX1JFU0VUX1JTTl9LRVkgIDAgCisKKworI2RlZmluZSBBQUdfQUNMX0xPT0tVUF9ORUVERUQoY3R4KSBcCisgICAgICAgICAgICAoKGN0eCktPmF1dGhUeXBlID09IGVBTklfU1NNX0FUX05PTkUgfHwgXAorICAgICAgICAgICAgIChjdHgpLT5hdXRoVHlwZSA9PSBlQU5JX1NTTV9BVF9SU05fUFNLIHx8IFwKKyAgICAgICAgICAgICAoY3R4KS0+YXV0aFR5cGUgPT0gZUFOSV9TU01fQVRfU0hBUkVEX0tFWSkKKworI2RlZmluZSBBQUdfQUNMX0xPT0tVUF9QRU5ESU5HKGN0eCkgXAorICAgICAgICAgICAgKChjdHgpLT5hY2xMb29rdXBGc20gIT0gTlVMTCAmJiAoY3R4KS0+cmFkaXVzSW5mby5yZXEgIT0gTlVMTCkKKworI2RlZmluZSBBQUdfU1RBX0FXQUlUSU5HX0NMRUFOVVAoY3R4KSBcCisgICAgICAgICAgICAoKGN0eCktPnNzaWQgPT0gTlVMTCkKKworI2RlZmluZSBBQUdfTUFSS19TVEFfQVNfQVdBSVRJTkdfQ0xFQU5VUChjdHgpIFwKKyAgICAgICAgICAgICgoY3R4KS0+c3NpZCA9IE5VTEwpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEF1dGhSc25Gc20gc3RydWN0dXJlOgorICoqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB0YWdBdXRoUnNuRnNtIAoreworICAgIHZfVThfdCBjdXJyZW50U3RhdGU7CisgICAgCisgICAgdEJ0YW1wQ29udGV4dCAqY3R4OworICAgIHRTdGFDb250ZXh0ICpzdGFDdHg7IAorCisgICAgLy8gVmFyaWFibGVzIHVzZWQgZm9yIEVBUE9MLUtleSBtZXNzYWdlcworICAgIHZfVThfdCBhTm9uY2VbQU5JX0VBUE9MX0tFWV9SU05fTk9OQ0VfU0laRV07CisgICAgdl9VOF90IHNOb25jZVtBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFXTsKKyAKKyAgICAvLyBGbGFncyBzZXQgYnkgZXh0ZXJuYWwgZXZlbnRzCisgICAgdl9VOF90IGF1dGhSZXE7CisgICAgdl9VOF90IGVhcG9sQXZhaWw7CisgICAgdl9VOF90IGRpc2Nvbm5lY3Q7CisgICAgdl9VOF90IGludGVnRmFpbGVkOworICAgIHZfVThfdCBwbWtBdmFpbGFibGU7CisKKyAgICAvLyBWYXJpYWJsZXMgbWFpbnRhaW5lZCBpbnRlcm5hbGx5CisgICAgdl9VOF90IG51bVRyaWVzOworICAgIHRBbmlQYWNrZXQgKmxhc3RFYXBvbDsgIC8vVHgKKyAgICB2X0JPT0xfdCBmUmVjZWl2aW5nOworICAgIHZfVTMyX3QgY3J5cHRIYW5kbGU7CisKKyAgICAvLyBUaW1lcnMgdXNlZC4uYWx0ZXJuYXRlIHRoZW0gaW4gZGlmZmVyZW50IHN0YXRlcworICAgIHZvc190aW1lcl90IG1zZzJUaW1lcjsKKyAgICB2b3NfdGltZXJfdCBtc2c0VGltZXI7CisgICAgdl9CT09MX3QgbXNnMlRpbWVPdXQ7CisgICAgdl9CT09MX3QgbXNnNFRpbWVPdXQ7CisgICAgdl9VOF90IGFkdmVydGl6ZWRSc25JZVsyNTZdOworfSB0QXV0aFJzbkZzbTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICogU3VwcFJzbkZzbSBzdHJ1Y3R1cmU6CisgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgdGFnU3VwcFJzbkZzbSB7CisKKyAgICB2X1U4X3QgY3VycmVudFN0YXRlOworICAgIAorICAgIHRCdGFtcENvbnRleHQgKmN0eDsKKyAgICB0U3VwcENvbnRleHQgKnN1cHBDdHg7CisKKyAgICAvLyBWYXJpYWJsZXMgdXNlZCBmb3IgRUFQT0wtS2V5IG1lc3NhZ2VzCisgICAgdEFuaVNzbVJlcGxheUN0ciAqbG9jYWxSZXBsYXlDdHI7CisgICAgdEFuaVNzbVJlcGxheUN0ciAqcGVlclJlcGxheUN0cjsKKyAgICB2X1U4X3QgYU5vbmNlW0FOSV9FQVBPTF9LRVlfUlNOX05PTkNFX1NJWkVdOworICAgIHZfVThfdCBzTm9uY2VbQU5JX0VBUE9MX0tFWV9SU05fTk9OQ0VfU0laRV07CisKKyAgICAvLyBGbGFncyBzZXQgYnkgZXh0ZXJuYWwgZXZlbnRzCisgICAgdl9VOF90IGF1dGhSZXE7CisgICAgdl9VOF90IHBta0F2YWlsOworICAgIHZfVThfdCBlYXBvbEF2YWlsOworICAgIHZfVThfdCBpbnRlZ0ZhaWxlZDsKKyAgICB2X1U4X3QgdXBkYXRlS2V5czsKKworICAgIC8vIFZhcmlhYmxlcyBtYWludGFpbmVkIGludGVybmFsbHkKKyAgICBpbnQgbnVtVHJpZXM7CisgICAgdEFuaVBhY2tldCAqbGFzdEVhcG9sOworICAgIHZfQk9PTF90IGZSZWNlaXZpbmc7CisgICAgdl9VMzJfdCBjcnlwdEhhbmRsZTsKK30gdFN1cHBSc25Gc207CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0FhZ1pvbmVFbnRyeSB0QWFnWm9uZUVudHJ5OwordHlwZWRlZiBzdHJ1Y3Qgc0FhZ1NzaWRFbnRyeSB0QWFnU3NpZEVudHJ5OworCit0eXBlZGVmIGVudW0KK3sKKyAgICAvL0ludGVybmFsIHRvIFJTTgorICAgIC8vVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgUlNOknMgdGltZXJzCisgICAgUlNOX0ZTTV9USU1FUl9FWFBJUkVELCAgCisgICAgLy9CQVAgdXNlIHRoaXMgZXZlbnQgdG8gaW5mb3JtIGF1dGgvc3VwcCB0byBzdGFydCBwcm9jZXNzaW5nCisgICAgLy9hdXRoZW50aWNhdGlvbi4gV2hlbiBCQVAgc2VuZCB0aGlzIGV2ZW50IHRvIFJTTiwgaXQgaXMgcHJlc3VtZWQgCisgICAgLy90aGF0IHRoZSBQTUsgaXMgYXZhaWxhYmxlLgorICAgIFJTTl9GU01fQVVUSF9TVEFSVCwgICAgCisgICAgLy9JbnRlcm5hbCB0byBSU04KKyAgICAvL1RoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBSeCByb3V0aW5lIHdoZW4gY2FsbGVkIGJ5IFRMCisgICAgUlNOX0ZTTV9FQVBPTF9GUkFNRV9BVkFJTEFCTEUsICAKKyAgICAvL0JBUCB1c2UgdGhpcyBldmVudCB0byBpbmZvcm0gUlNOIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgbG9zdCAgCisgICAgUlNOX0ZTTV9ESVNDT05ORUNULCAgICAKKyAgICAvL0ludGVybmFsIHRvIFJTTgorICAgIC8vVGhpcyBldmVudCBoYW5ucGVucyB3aGVuIFJTTiBkZXRlY3Qga2V5IGludGVncmF0eSBjaGVjayBmYWlscworICAgIFJTTl9GU01fSU5URUdfRkFJTEVELCAgCisKK310UnNuRnNtRXZlbnQ7CisKKy8qKgorICogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGFuIEVBUCBtZXNzYWdlIHRoYXQgd2FzIGxhc3QgcmVjZWl2ZWQgb3IKKyAqIEVBUE9MIG1lc3NhZ2VzIHRoYXQgd2VyZSBsYXN0IHNlbnQuCisgKgorICogMS4gRUFQIG1lc3NhZ2VzIGxhc3QgcmVjZWl2ZWQgYXJlIHN0cmlwcGVkIG91dCBvZiB0aGVpciBvdXRlcgorICogICAgZW5jYXBzdWxhdGlvbiB3aGljaCBtYXkgYmUgZWl0aGVyIEVBUE9MIG9yIFJBRElVUywgYW5kIGFyZQorICogICAgcHJlc2VydmVkIHdpdGhpbiB0aGlzIHN0cnVjdHVyZSBmb3IgdGhlIGxpZmV0aW1lIG9mIG9uZSBldmVudDoKKyAqICAgICAgICAtIEVBUE9MX01FU1NBR0VfQVZBSUxBQkxFICA9PiBwcm9jZXNzIGFuZCBzZW5kIHRvIFJBRElVUworICogICAgICAgIC0gUkFESVVTX01FU1NBR0VfQVZBSUxBQkxFID0+IHByb2Nlc3MgYW5kIHNlbmQgdG8gU1RBCisgKiAgICBXaGVuIHRoZSBldmVudCBpcyBmdWxseSBoYW5kbGVkLCB0aGUgaW5jb21pbmcgcGFja2V0IGlzIGZyZWVkLAorICogICAgdGhlcmVmb3JlLCB0aGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIG5vIGxvbmdlciB2YWxpZC4KKyAqCisgKiAyLiBFQVBPTCBtZXNzYWdlcyBsYXN0IHNlbnQgYXJlIHN0b3JlZCBpbiB0aGVpciBlbnRpcmV0eS4gVGhleSBhcmUKKyAqICAgICBjcmVhdGVkIGFuZCBkZWxldGUgYSBsaXR0bGUgZGlmZmVyZW50bHkgb24gdGhlIEFQIGFuZCBCUCBzaWRlczoKKyAqICAgICAgIC0gQVAgc2lkZTogVGhlIEVBUE9MIG1lc3NhZ2UgY29udGFpbnMgdGhlIGxhc3QgRUFQIG1lc3NhZ2UKKyAqICAgICB0aGF0IHdhcyBzZW50IHRvIHRoZSBTVEEuIEFzIHNvb24gYXMgYSBuZXcgRUFQIG1lc3NhZ2UgYXJyaXZlcworICogICAgIGZyb20gUkFESVVTLCB0aGlzIEVBUE9MIG1lc2FnZSBpcyBmcmVlZCBiZWNhdXNlIGEgbmV3IG9uZSB3aWxsCisgKiAgICAgYmUgZ2VuZXJhdGVkLgorICogICAgICAgLSBCUCBzaWRlOiBUaGUgRUFQT0wgbWVzc2FnZSBjb250YWlucyB0aGUgbGFzdCBFQVAgbWVzc2FnZQorICogICAgIGdlbmVyYXRlZCBieSB0aGUgbG9jYWwgc3VwcGxpY2FudC4gQXMgc29vbiBhcyBhIG5ldyBFQVBPTAorICogICAgIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLCB0aGlzIG9uZSBpcyBmcmVlZCBhbmQgdGhlIG5ldyBvbmUgaXMKKyAqICAgICBzdG9yZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHRFYXBJbmZvIAorCit7CisgICAgdEFuaVBhY2tldCAqbWVzc2FnZTsKKyAgICB2X1U4X3QgaWQ7Cit9IHRFYXBJbmZvOworCisKK3R5cGVkZWYgZW51bSBlQW5pU3NtQXV0aFN0YXRlIHsKKyAgICBlQU5JX1NTTV9BVVRIX1NUQVRFX0lOSVQgPSAwLAorICAgIGVBTklfU1NNX0FTX1BXX0tFWV9DT05GX0FXQUlURUQsCisgICAgZUFOSV9TU01fQVNfUFdfS0VZX1NFVCwKK30gdEFuaVNzbUF1dGhTdGF0ZTsKKworCisvKioKKyAqIFRoZSBTdGF0aW9uJ3MgY29udGV4dCBpcyBzdG9yZWQgaW4gdGhpcyBzdHJ1Y3R1cmUuIEl0IGNvbnRhaW5zCisgKiBwb2ludGVycyB0byB0aGUgRlNNJ3MgdXNlZCBieSB0aGUgU1RBICh3aGljaCBpbiB0dXJuIHBvaW50IGJhY2sgdG8KKyAqIHRoZSBjb250ZXh0KS4gSXQgYWxzbyBjb250YWlucyB0aGUgdHJhbnNpZW50IGV2ZW50IGRhdGEgbGlrZQorICogRUFQLU1lc3NhZ2UgYW5kIFJBRElVUyBzdGF0ZSB0aGF0IGlzIG9idGFpbmVkIGZyb20gdmFyaW91cyBuZXR3b3JrCisgKiBwYWNrZXRzLgorICovCitzdHJ1Y3QgdFN0YUNvbnRleHQgeworCisgICAgLy8gU1RBIGlkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uCisgICAgdEFuaU1hY0FkZHIgc3VwcE1hYzsKKyAgICB2X0JPT0xfdCBicEluZGljYXRvcjsKKworICAgIC8vIExvY2FsIGFzc29jaWF0aW9uIHBvaW50CisgICAgdEFuaU1hY0FkZHIgYXV0aE1hYzsKKyAgICB2X1U4X3Qgc3NpZE5hbWVbU0lSX01BQ19NQVhfU1NJRF9MRU5HVEggKyAxXTsgICAgCisgICAgdEFhZ1NzaWRFbnRyeSAqc3NpZDsKKworICAgIC8vIFRoZSBkaWZmZXJlbnQgRlNNJ3MgdGhhdCBjYW4gYmUgaW5zdGFudGlhdGVkIGZvciB0aGUgU1RBCisgICAgdEF1dGhSc25Gc20gKmF1dGhSc25Gc207CisKKyAgICAvLyBLZXlzIGRlcml2ZWQgZm9yIFNUQQorICAgIHZfVThfdCBwdGtbQUFHX1BSRl9NQVhfT1VUUFVUX1NJWkVdOworICAgIHRBbmlQYWNrZXQgKnBtazsgLy8gTVMtTVBQRS1SZWN2LUtleQorICAgIHRBbmlQYWNrZXQgKnNlcnZlcktleTsgLy8gTVMtTVBQRS1TZW5kLUtleQorICAgIHZfVThfdCBrZXlJZDsKKworICAgIC8vIFNUQSBjb250ZXh0IHRpbWVycworICAgIHZfVTMyX3QgIHNlc3Npb25UaW1lb3V0OworICAgIHZvc190aW1lcl90IHJlQXV0aFRpbWVyOworICAgIHZvc190aW1lcl90IHNlc3Npb25DbGVhbnVwVGltZXI7CisKKyAgICAvLyBSYWRpdXMgQXV0aGVudGljYXRpb24gYXR0cmlidXRlcworICAgIHZfVThfdCAqYXV0aENsYXNzQXR0cjsKKworICAgIC8vIE1pc2MuIGF1dGhlbnRpY2F0aW9uIHJlbGF0ZWQgc3RhdGUKKyAgICBlQ3NyQXV0aFR5cGUgYXV0aFR5cGU7CisgICAgZUNzckVuY3J5cHRpb25UeXBlIHB3Q2lwaGVyVHlwZTsKKyAgICB0QW5pUGFja2V0ICppZVN0YTsKKyAgICB0QW5pU3NtQXV0aFN0YXRlIGF1dGhTdGF0ZTsKKyAgICB2X0JPT0xfdCBwcm1Mb29rdXBJblByb2dyZXNzOworICAgIHZfQk9PTF90IGZpcnN0VGltZUF1dGg7CisgICAgdl9CT09MX3Qgc2VjdXJlTGluazsgLy8gNC13YXkgaC9zIHJlcXVyaWVzIHRoaXMgdG8gYmUgMCBhdCBzdGFydHVwIG9yIG9uIE1JQyBmYWlsdXJlcworICAgIHRBbmlTc21SZXBsYXlDdHIgKmxvY2FsUmVwbGF5Q3RyOworICAgIHRBbmlTc21SZXBsYXlDdHIgKnBlZXJSZXBsYXlDdHI7IC8vIEdvZXMgaGFuZCBpbiBoYW5kIHdpdGggZmxhZyBiZWxvdworICAgIHZfQk9PTF90IHBhc3RGaXJzdFBlZXJSZXF1ZXN0OyAvLyBGb3IgdXNlIHdpdGggcGVlciByZXBsYXkgY291bnRlcgorCisgICAgdEFuaVBhY2tldCAqY2FjaGVkUG1rOyAvLyBNUy1NUFBFLVJlY3YtS2V5CisgICAgdEFuaVBhY2tldCAqY2FjaGVkU2VydmVyS2V5OyAvLyBNUy1NUFBFLVNlbmQtS2V5CisgICAgdl9VOF90IGNhY2hlZEtleUlkOworCit9OworCisKK3N0cnVjdCB0U3VwcENvbnRleHQgeworCisgICAgLy8gQVAgKHBlZXIpIGlkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uCisgICAgdEFuaU1hY0FkZHIgYXV0aE1hYzsKKyAgICB2X1U4X3QgKnNzaWRTdHI7CisKKyAgICAvLyBMb2NhbCBhc3NvY2lhdGlvbiBwb2ludAorICAgIHRBbmlNYWNBZGRyIHN1cHBNYWM7CisKKyAgICAvLyBLZXlzIGRlcml2ZWQgb24gc3VwcGxpY2FudAorICAgIHZfVThfdCBwdGtbQUFHX1BSRl9NQVhfT1VUUFVUX1NJWkVdOworICAgIHZfVThfdCBwd0tleUxlbjsgLy8gIyBvZiBieXRlcyBvZiBQVEsgdG8gc2VuZCB0byBMSU0KKyAgICB0QW5pUGFja2V0ICpwbWs7IC8vIE1TLU1QUEUtUmVjdi1LZXkKKyAgICB0QW5pUGFja2V0ICpzZXJ2ZXJLZXk7IC8vIE1TLU1QUEUtU2VuZC1LZXkKKworICAgIC8vIE1pc2MuIGF1dGhlbnRpY2F0aW9uIHJlbGF0ZWQgc3RhdGUKKyAgICBlQ3NyQXV0aFR5cGUgYXV0aFR5cGU7CisgICAgZUNzckVuY3J5cHRpb25UeXBlIHB3Q2lwaGVyVHlwZTsKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgZ3JwQ2lwaGVyVHlwZTsKKyAgICB0QW5pUGFja2V0ICppZUJwOworICAgIHRBbmlQYWNrZXQgKmllQXA7CisgICAgdl9CT09MX3QgZmlyc3RUaW1lQXV0aDsKKworfTsKKwordHlwZWRlZiBzdHJ1Y3QgdEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGEgeworICAgIHZvaWQgKmtleURlc2M7CisgICAgdEFuaVBhY2tldCAqZWFwb2xGcmFtZTsKK30gdEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGE7CisKK3R5cGVkZWYgc3RydWN0IHRBbmlBYWdUaW1lckV2ZW50RGF0YSB7CisgICAgdm9zX3RpbWVyX3QgdGltZXI7CisgICAgdm9pZCAqYXBwRGF0YTsKK30gdEFuaUFhZ1RpbWVyRXZlbnREYXRhOworCisKKy8qKgorICogQ2FsbGJhY2sgZnVudGlvbiB0aGF0IHNldHMgc29tZSBzdGF0dXMgZm9yIGEgZ2l2ZW4gU1RBIGNvbnRleHQsCisgKiBlLmcuLCB0aGUgc3RhdHVzIG9mIHRoZSBjb250cm9sbGVkIHBvcnQuCisgKi8KKyNpZiAwCit0eXBlZGVmIGludCAoKnRBYWdTZXRTdGF0dXMpKHRTdGFDb250ZXh0ICpjdHgpOworCit0eXBlZGVmIGludCAoKnRBYWdUeEVhcG9sU3VwcCkodFN1cHBDb250ZXh0ICpjdHgpOwordHlwZWRlZiBpbnQgKCp0QWFnU2V0U3RhdHVzU3VwcCkodFN1cHBDb250ZXh0ICpjdHgpOwordHlwZWRlZiBpbnQgKCp0QWFnU2VuZEV2ZW50VG9Gc21TdXBwKSh0U3VwcENvbnRleHQgKmN0eCk7CisjZW5kaWYKKworLyoqCisgKiBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHBvc3RzIGEgWFhYX1RJTUVSX0VYUElSRUQgZXZlbnQgd2hlbiBhIHRpbWVyCisgKiBnb2VzIG9mZi4gWFhYIHJlcHJlc2VudHMgdGhlIGtpbmQgb2YgdGltZXIgdGhhdCBjYXVzZWQgdGhlIGV2ZW50LgorICovCit0eXBlZGVmIHZvaWQgKCp0QWFnVGltZXJDYWxsYmFjaykodm9pZCAqZGF0YSk7CisKKy8qKgorICogQ2FsbGJhY2tzIHByb3ZpZGVkIHRvIHRoZSBHcm91cEtleUZzbSBtb2R1bGUgZnJvbSB0aGUgRlNNIE1hbmFnZXIKKyAqIG1vZHVsZSBzbyB0aGF0IGl0IGNhbiBhY2Nlc3MgcHJvY2VkdXJlcyBuZWVkZWQgZm9yIG5ldHdvcmsKKyAqIHRyYW5zbWlzc2lvbiwgaW50ZXItRlNNIHNpZ25hbGxpbmcsIGFuZCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIG1haW4KKyAqIGFwcGxpY2F0aW9uLgorICovCisvKnR5cGVkZWYgc3RydWN0IHRHcm91cEtleUZzbUNhbGxiYWNrcyB7CisgICAgaW50ICgqZ2V0RGVmYXVsdFdlcEtleUlkKSh2X1UzMl90IHJhZGlvSWQpOworICAgIGludCAoKmNvcHlEZWZhdWx0V2VwS2V5KSh2X1UzMl90IHJhZGlvSWQpOworICAgIGludCAoKnVwZGF0ZUFsbFN0YSkodl9VMzJfdCByYWRpb0lkKTsKK30gdEdyb3VwS2V5RnNtQ2FsbGJhY2tzOyovCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIGNvbnRhbnRzIHVzZWQgYnkgdGhlIEF1dGhGc20gYXMgZGVmaW5lZCBpbgorICogWzgwMi4xWF0uCisgKi8KK3R5cGVkZWYgc3RydWN0IHRBdXRoRnNtQ29uc3RzIHsKKyAgICAvLyBBbW91bnQgb2YgdGltZSB0byBpZ25vcmUgYSBtaXNiZWhhdmluZyBTVEEKKyAgICB2X1UxNl90IHF1aWV0UGVyaW9kOworICAgIC8vIE51bWJlciBvZiByZWF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIGFsbG93ZWQgYmVmb3JlIGlnbm9yaW5nIFNUQQorICAgIHZfVThfdCByZUF1dGhNYXg7CisgICAgLy8gQW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3IgcmVzcG9uc2UgZnJvbSBTVEEKKyAgICB2X1UxNl90IHR4UGVyaW9kOworfSB0QXV0aEZzbUNvbnN0czsKKworCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIGNvbnN0YW50cyB1c2VkIGJ5IHRoZSBBdXRoUnNuRnNtIGFzIGRlZmluZWQgaW4KKyAqIFs4MDIuMTFpXS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdEF1dGhSc25Gc21Db25zdHMgeworICAgIHZfVTMyX3QgdGltZW91dFBlcmlvZDsKKyAgICB2X1UzMl90IG1heFRyaWVzOworfSB0QXV0aFJzbkZzbUNvbnN0czsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBjb250YW50cyB1c2VkIGJ5IHRoZSBTdXBwRnNtIGFzIGRlZmluZWQgaW4KKyAqIFs4MDIuMVhdLgorICovCit0eXBlZGVmIHN0cnVjdCB0U3VwcEZzbUNvbnN0cyB7CisgICAgdl9VMTZfdCBhdXRoUGVyaW9kOworICAgIHZfVTE2X3QgaGVsZFBlcmlvZDsKKyAgICB2X1UxNl90IHN0YXJ0UGVyaW9kOworICAgIHZfVThfdCBtYXhTdGFydDsgICAgCit9IHRTdXBwRnNtQ29uc3RzOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBjb25zdGFudHMgdXNlZCBieSB0aGUgU3VwcFJzbkZzbSBhcyBkZWZpbmVkIGluCisgKiBbODAyLjExaV0uCisgKi8KK3R5cGVkZWYgc3RydWN0IHRTdXBwUnNuRnNtQ29uc3RzIHsKKyAgICB2X1UzMl90IHRpbWVvdXRQZXJpb2Q7CisgICAgdl9VMzJfdCBtYXhUcmllczsKK30gdFN1cHBSc25Gc21Db25zdHM7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgY29uc3RhbnRzIHVzZWQgYnkgdGhlIEF1dGhSc25Hcm91cEtleUZzbSBhcworICogZGVmaW5lZCBpbiBbODAyLjExaV0uCisgKi8KK3R5cGVkZWYgc3RydWN0IHRBdXRoUnNuR3JvdXBLZXlGc21Db25zdHMgeworICAgIHZfVTMyX3QgdGltZW91dFBlcmlvZDsKKyAgICB2X1UzMl90IG1heFRyaWVzOworfSB0QXV0aFJzbkdyb3VwS2V5RnNtQ29uc3RzOworCisvKioKKyAqIGF1dGhSc25Gc21GcmVlCisgKgorICogRlVOQ1RJT04KKyAqIEZyZWVzIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgUlNOIEtleSBGU00gaW4gYSBTVEEgY29udGV4dC4gSWYgdGhlCisgKiBSU04gS2V5IEZTTSBpcyBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiB0aGlzIGlzIGFuIGVycm9yLgorICogCisgKiBAcGFyYW0gY3R4IHRoZSBTVEEgY29udGV4dCB3aG9zZSBGU00gaW5zdGFuY2UgaXMgdG8gYmUgZnJlZWQKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYXV0aFJzbkZzbUZyZWUodEJ0YW1wQ29udGV4dCAqY3R4KTsKKworLyoqCisgKiBhdXRoUnNuRnNtUHJvY2Vzc0V2ZW50CisgKgorICogRlVOQ1RJT04KKyAqIFBhc3NlcyBhbiBldmVudCB0byB0aGUgUlNOIGtleSBGU00gaW5zdGFuY2UgZm9yIGltbWVkaWF0ZSBwcm9jZXNzaW5nLgorICogCisgKiBAcGFyYW0gZnNtIHRoZSBSU04gS2V5IEZTTSBpbnN0YW5jZQorICogQHBhcmFtIGV2ZW50SWQgdGhlIEFBRyBldmVudCB0byBwcm9jZXNzCisgKiBAcGFyYW0gYXJnIGFuIG9wdGlvbmFsIGFyZ3VtZW50IGZvciB0aGlzIGV2ZW50CisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2F1dGhSc25Gc21Qcm9jZXNzRXZlbnQodEF1dGhSc25Gc20gKmZzbSwgdFJzbkZzbUV2ZW50IGV2ZW50SWQsIHZvaWQgKmFyZyk7CisKKworLyoqCisgKiBzdXBwRnNtQ3JlYXRlCisgKgorICogRlVOQ1RJT04KKyAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIHN0YXRlIG9mIGFuIFN1cHBGc20gaW5zdGFuY2UgZm9yIHRoZQorICogZ2l2ZW4gU1RBIGNvbnRleHQuCisgKiAKKyAqIEBwYXJtIGN0eCB0aGUgc3VwcGxpY2FudCBjb250ZXh0IHdob3NlIFN1cHBGc20gaXMgYmVpbmcgY3JlYXRlZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CitzdXBwUnNuRnNtQ3JlYXRlKHRCdGFtcENvbnRleHQgKmN0eCk7CisKKy8qKgorICogc3VwcEZzbUZyZWUKKyAqCisgKiBGVU5DVElPTgorICogRnJlZXMgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBTdXBwRnNtLgorICogCisgKiBAcGFyYW0gc3VwcEN0eCB0aGUgc3VwcGxpY2FudCBjb250ZXh0IHdob3NlIHN1cHBGc20gaXMgdG8gYmUgZnJlZWQKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorc3VwcFJzbkZzbUZyZWUodEJ0YW1wQ29udGV4dCAqY3R4KTsKKworLyoqCisgKiBzdXBwRnNtUHJvY2Vzc0V2ZW50CisgKgorICogRlVOQ1RJT04KKyAqIFBhc3NlcyBhbiBldmVudCB0byB0aGUgc3VwcEZzbSBmb3IgaW1tZWRpYXRlIHByb2Nlc3NpbmcuCisgKiAKKyAqIE5vdGU6IFRoZSBwZXJ0aW5lbnQgZXZlbnQgZGF0YSBpcyBhbHJlYWR5IHN0b3JlZCBpbiB0aGUgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gc3VwcEZzbSB0aGUgc3VwcEZzbQorICogQHBhcmFtIGV2ZW50SWQgdGhlIEFBRyBldmVudCB0byBwcm9jZXNzCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK3N1cHBSc25Gc21Qcm9jZXNzRXZlbnQodFN1cHBSc25Gc20gKmZzbSwgdFJzbkZzbUV2ZW50IGV2ZW50SWQsIHZvaWQgKmFyZyk7CisKKyNlbmRpZiAvLyBfX0FBR19GU01fSF8KZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBSc244MDIxeFByZi5jIGIvQ09SRS9CQVAvc3JjL2JhcFJzbjgwMjF4UHJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjZjg2MwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvQkFQL3NyYy9iYXBSc244MDIxeFByZi5jCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFdvb2RzaWRlIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAkRmlsZTogLy9kZXBvdC9zb2Z0d2FyZS9wcm9qZWN0cy9mZWF0dXJlX2JyYW5jaGVzL2dlbjVfcGhhc2UxL29zL2xpbnV4L2NsYXNzaWMvYXAvYXBwcy9zc20vYXV0aDgwMjF4L2FuaTgwMjF4UHJmLmMgJAorICoKKyAqIENvbnRhaW5zIGRlZmluaXRpb25zIGZvciByb3V0aW5lcyB0byBjYWxjdWxhdGUgdGhlIDgwMi4xMWkgUFJGCisgKiBmdW5jdGlvbnMuCisgKgorICogQXV0aG9yOiAgTWF5YW5rIEQuIFVwYWRoeWF5CisgKiBEYXRlOiAgICAxOS1NYXJjaC0yMDAzCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgIE1vZGlmaWVkIGJ5IE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyojaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YW5pU3NtU2hhMS5oPgorKi8KKyNpbmNsdWRlICJ2b3NfdXRpbHMuaCIKKyNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCisjaW5jbHVkZSAiYmFwUnNuODAyMXhQcmYuaCIKKyNpbmNsdWRlICJiYXBSc25FcnJvcnMuaCIKKy8vI2luY2x1ZGUgImFuaTgwMjF4VXRpbHMuaCIKKworI2RlZmluZSBBQUdfUFRLX1BSRl9BRERfUEFSQU0gMTU5CisjZGVmaW5lIEFBR19QVEtfUFJGX0RJVl9QQVJBTSAxNjAKKworI2RlZmluZSBBQUdfUFRLX1BSRl9DT05TVCAiUGFpcndpc2Uga2V5IGV4cGFuc2lvbiIKKyNkZWZpbmUgQUFHX1BUS19QUkZfQ09OU1RfTEVOIDIyCisKKyNkZWZpbmUgQUFHX1BUS19QUkZfTE1fUE9TIDAKKyNkZWZpbmUgQUFHX1BUS19QUkZfSE1fUE9TIDYKKyNkZWZpbmUgQUFHX1BUS19QUkZfTE5fUE9TIDEyCisjZGVmaW5lIEFBR19QVEtfUFJGX0hOX1BPUyBBQUdfUFRLX1BSRl9MTl9QT1MgKyBBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFCisKKyNkZWZpbmUgQUFHX1BUS19QUkZfVEVYVF9MRU4gQUFHX1BUS19QUkZfSE5fUE9TICsgQU5JX0VBUE9MX0tFWV9SU05fTk9OQ0VfU0laRQorCisjZGVmaW5lIEFBR19HVEtfUFJGX0NPTlNUICJHcm91cCBrZXkgZXhwYW5zaW9uIgorI2RlZmluZSBBQUdfR1RLX1BSRl9DT05TVF9MRU4gMTkKKworI2RlZmluZSBBQUdfR1RLX1BSRl9NQUNfUE9TIDAKKyNkZWZpbmUgQUFHX0dUS19QUkZfTk9OQ0VfUE9TIDYKKworI2RlZmluZSBBQUdfR1RLX1BSRl9URVhUX0xFTiBBQUdfR1RLX1BSRl9OT05DRV9QT1MgKyBBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFCisKKy8qKgorICogYWFnR2V0S2V5TWF0ZXJpYWxMZW4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIFBUSyB0aGF0IGhhdmUgdG8gYmUgcHJvdmlkZWQgdG8KKyAqIHRoZSBNQUMgbGF5ZXIgZm9yIGEgZ2l2ZW4gY2lwaGVyIHR5cGUuCisgKgorICogQHBhcmFtIGNpcGhlclR5cGUgdGhlIGNpcGhlci10eXBlCisgKgorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGtleSBtYXRlcmlhbCBmb3IgdGhpcyBjaXBoZXIgdHlwZSwKKyAqIG9yIDAgZm9yIGludmFsaWQgY2lwaGVyIHR5cGVzLgorICovCitpbnQKK2FhZ0dldEtleU1hdGVyaWFsTGVuKGVDc3JFbmNyeXB0aW9uVHlwZSBjaXBoZXJUeXBlKQoreworICAgIHN3aXRjaCAoY2lwaGVyVHlwZSkgeworICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQUVTOgorICAgICAgICByZXR1cm4gQUFHX1JTTl9LRVlfTUFURVJJQUxfTEVOX0NDTVA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgICAgICBicmVhazsKKyAgICB9OworfQorCisvKioKKyAqIGFhZ1B0a1ByZgorICoKKyAqIFRoZSBQUkYgdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIHBhaXJ3aXNlIHRlbXBvcmFsIGtleSB1bmRlciBJRUVFCisgKiA4MDIuMTFpLgorICoKKyAqIEBwYXJhbSByZXN1bHQgYSBmaXhlZCBzaXplIGFycmF5IHdoZXJlIHRoZSBvdXRwdXRpcyBzdG9yZWQuIFNob3VsZAorICogaGF2ZSBlbm91Z2ggcGxhY2UgZm9yIHRoZSBTSEEtMSBvdmVyZmxvdy4KKyAqIEBwYXJhbSBwcmZMZW4gdGhlIG51bWJlciBvZiBCSVRTIGRlc2lyZWQgZnJvbSB0aGUgUFJGIHJlc3VsdAorICogQHBhcmFtIHBtayB0aGUgcGFpcndpc2UgbWFzdGVyLWtleQorICogQHBhcmFtIGF1dGhBZGRyIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgYXV0aGVudGljYXRvcgorICogQHBhcmFtIHN1cHBBZGRyIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgc3VwcGxpY2FudAorICogQHBhcmFtIGFOb25jZSB0aGUgbm9uY2UgZ2VuZXJhdGVkIGJ5IHRoZSBhdXRoZW50aWNhdG9yCisgKiBAcGFyYW0gc05vbmNlIHRoZSBub25jZSBnZW5lcmF0ZWQgYnkgdGhlIHN1cHBsaWNhbnQKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYWFnUHRrUHJmKHZfVTMyX3QgY3J5cHRIYW5kbGUsCisgICAgICAgICAgdl9VOF90IHJlc3VsdFtBQUdfUFJGX01BWF9PVVRQVVRfU0laRV0sCisgICAgICAgICAgdl9VMzJfdCBwcmZMZW4sCisgICAgICAgICAgdEFuaVBhY2tldCAqcG1rLCAKKyAgICAgICAgICB0QW5pTWFjQWRkciBhdXRoQWRkciwKKyAgICAgICAgICB0QW5pTWFjQWRkciBzdXBwQWRkciwKKyAgICAgICAgICB2X1U4X3QgYU5vbmNlW0FOSV9FQVBPTF9LRVlfUlNOX05PTkNFX1NJWkVdLAorICAgICAgICAgIHZfVThfdCBzTm9uY2VbQU5JX0VBUE9MX0tFWV9SU05fTk9OQ0VfU0laRV0pCit7CisgICAgdl9VOF90ICpsb3dNYWM7CisgICAgdl9VOF90ICpoaWdoTWFjOworICAgIHZfVThfdCAqbG93Tm9uY2U7CisgICAgdl9VOF90ICpoaWdoTm9uY2U7CisKKyAgICB2X1U4X3QgKmtleUJ5dGVzOworICAgIGludCBrZXlMZW47CisKKyAgICB2X1U4X3QgdGV4dFtBQUdfUFRLX1BSRl9URVhUX0xFTl07CisKKyAgICAvL0Nhbm5vdCB1c2Ugdm9zcyBmdW5jdGlvbiBoZXJlIGJlY2F1c2Ugdm9zX21lbV9jb21wYXJlIGRvZXNuJ3QgdGVsbCB3aGloYyBpcyBsYXJnZXIKKyAgICBpZiAodm9zX21lbV9jb21wYXJlMihhdXRoQWRkciwgc3VwcEFkZHIsIHNpemVvZih0QW5pTWFjQWRkcikpIDwgMCkgeworICAgICAgICBsb3dNYWMgPSBhdXRoQWRkcjsKKyAgICAgICAgaGlnaE1hYyA9IHN1cHBBZGRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvd01hYyA9IHN1cHBBZGRyOworICAgICAgICBoaWdoTWFjID0gYXV0aEFkZHI7CisgICAgfQorCisgICAgaWYgKHZvc19tZW1fY29tcGFyZTIoYU5vbmNlLCBzTm9uY2UsIEFOSV9FQVBPTF9LRVlfUlNOX05PTkNFX1NJWkUpIDwgMCkgeworICAgICAgICBsb3dOb25jZSA9IGFOb25jZTsKKyAgICAgICAgaGlnaE5vbmNlID0gc05vbmNlOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvd05vbmNlID0gc05vbmNlOworICAgICAgICBoaWdoTm9uY2UgPSBhTm9uY2U7CisgICAgfQorCisgICAgdm9zX21lbV9jb3B5KHRleHQgKyBBQUdfUFRLX1BSRl9MTV9QT1MsIGxvd01hYywgc2l6ZW9mKHRBbmlNYWNBZGRyKSk7CisgICAgdm9zX21lbV9jb3B5KHRleHQgKyBBQUdfUFRLX1BSRl9ITV9QT1MsIGhpZ2hNYWMsIHNpemVvZih0QW5pTWFjQWRkcikpOworICAgIHZvc19tZW1fY29weSh0ZXh0ICsgQUFHX1BUS19QUkZfTE5fUE9TLCBsb3dOb25jZSwgQU5JX0VBUE9MX0tFWV9SU05fTk9OQ0VfU0laRSk7CisgICAgdm9zX21lbV9jb3B5KHRleHQgKyBBQUdfUFRLX1BSRl9ITl9QT1MsIGhpZ2hOb25jZSwgQU5JX0VBUE9MX0tFWV9SU05fTk9OQ0VfU0laRSk7CisKKyAgICBrZXlMZW4gPSBhbmlBc2ZQYWNrZXRHZXRCeXRlcyhwbWssICZrZXlCeXRlcyk7CisgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIGtleUxlbiApICkKKyAgICB7CisgICAgICAgIHJldHVybiBrZXlMZW47CisgICAgfQorCisgICAgcmV0dXJuIGFhZ1ByZihjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgIHJlc3VsdCwgCisgICAgICAgICAgICAgICAgICBrZXlCeXRlcywga2V5TGVuLCAKKyAgICAgICAgICAgICAgICAgICh2X1U4X3QgKilBQUdfUFRLX1BSRl9DT05TVCwgQUFHX1BUS19QUkZfQ09OU1RfTEVOLAorICAgICAgICAgICAgICAgICAgdGV4dCwgc2l6ZW9mKHRleHQpLAorICAgICAgICAgICAgICAgICAgcHJmTGVuKTsKK30KKworLyoqCisgKiBhYWdHdGtQcmYKKyAqCisgKiBUaGUgUFJGIHVzZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBncm91cCB0ZW1wb3JhbCBrZXkgdW5kZXIgSUVFRQorICogODAyLjExaS4KKyAqCisgKiBAcGFyYW0gcmVzdWx0IGEgZml4ZWQgc2l6ZSBhcnJheSB3aGVyZSB0aGUgb3V0cHV0aXMgc3RvcmVkLiBTaG91bGQKKyAqIGhhdmUgZW5vdWdoIHBsYWNlIGZvciB0aGUgU0hBLTEgb3ZlcmZsb3cuCisgKiBAcGFyYW0gcHJmTGVuIHRoZSBudW1iZXIgb2YgQklUUyBkZXNpcmVkIGZyb20gdGhlIFBSRiByZXN1bHQKKyAqIEBwYXJhbSBnbWsgdGhlIGdyb3VwIG1hc3Rlci1rZXkKKyAqIEBwYXJhbSBhdXRoQWRkciB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGF1dGhlbnRpY2F0b3IKKyAqIEBwYXJhbSBnTm9uY2UgdGhlIG5vbmNlIGdlbmVyYXRlZCBieSB0aGUgYXV0aGVudGljYXRvciBmb3IgdGhpcyBwdXJwb3NlCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FhZ0d0a1ByZih2X1UzMl90IGNyeXB0SGFuZGxlLAorICAgICAgICAgIHZfVThfdCByZXN1bHRbQUFHX1BSRl9NQVhfT1VUUFVUX1NJWkVdLAorICAgICAgICAgIHZfVTMyX3QgcHJmTGVuLAorICAgICAgICAgIHZfVThfdCBnbWtbQUFHX1JTTl9HTUtfU0laRV0sCisgICAgICAgICAgdEFuaU1hY0FkZHIgYXV0aEFkZHIsCisgICAgICAgICAgdl9VOF90IGdOb25jZVtBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFXSkKK3sKKyAgICB2X1U4X3QgdGV4dFtBQUdfR1RLX1BSRl9URVhUX0xFTl07CisKKyAgICB2b3NfbWVtX2NvcHkodGV4dCArIEFBR19HVEtfUFJGX01BQ19QT1MsIGF1dGhBZGRyLCBzaXplb2YodEFuaU1hY0FkZHIpKTsKKyAgICB2b3NfbWVtX2NvcHkodGV4dCArIEFBR19HVEtfUFJGX05PTkNFX1BPUywgZ05vbmNlLCBBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFKTsKKworICAgIHJldHVybiBhYWdQcmYoY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICByZXN1bHQsCisgICAgICAgICAgICAgICAgICBnbWssIEFBR19SU05fR01LX1NJWkUsCisgICAgICAgICAgICAgICAgICAodl9VOF90ICopQUFHX0dUS19QUkZfQ09OU1QsIEFBR19HVEtfUFJGX0NPTlNUX0xFTiwKKyAgICAgICAgICAgICAgICAgIHRleHQsIHNpemVvZih0ZXh0KSwKKyAgICAgICAgICAgICAgICAgIHByZkxlbik7CisKK30KKworLyoqCisgKiBhYWdQcmYKKyAqCisgKiBUaGUgcmF3IFBSRiBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgaW4gSUVFRSA4MDIuMTFpLgorICoKKyAqIEBwYXJhbSByZXN1bHQgYSBmaXhlZCBzaXplIGFycmF5IHdoZXJlIHRoZSBvdXRwdXRpcyBzdG9yZWQuIFNob3VsZAorICogaGF2ZSBlbm91Z2ggcGxhY2UgZm9yIHRoZSBTSEEtMSBvdmVyZmxvdy4KKyAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byB1c2UgaW4gdGhlIFBSRgorICogQHBhcmFtIGtleUxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkKKyAqIEBwYXJhbSBhIHRoZSBwYXJhbWV0ZXIgQSB3aGljaCBpcyB1c3VhbGx5IGEgdW5pcXVlIGxhYmVsCisgKiBAcGFyYW0gYUxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBwYXJhbWV0ZXIgQQorICogQCBwYXJhbSBiIHRoZSBwYXJhbWV0ZXIgQgorICogQHBhcmFtIGJMZW4gdGhlIGxlbmd0aCBvZiBwYXJhbWV0ZXIgQgorICogQHBhcmFtIHByZkxlbiB0aGUgbnVtYmVyIHRvIEJJVFMgZGVzaXJlZCBmcm9tIHRoZSBQUkYgcmVzdWx0CisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FhZ1ByZih2X1UzMl90IGNyeXB0SGFuZGxlLAorICAgICAgIHZfVThfdCByZXN1bHRbQUFHX1BSRl9NQVhfT1VUUFVUX1NJWkVdLAorICAgICAgIHZfVThfdCAqa2V5LCB2X1U4X3Qga2V5TGVuLAorICAgICAgIHZfVThfdCAqYSwgdl9VOF90IGFMZW4sCisgICAgICAgdl9VOF90ICpiLCB2X1U4X3QgYkxlbiwKKyAgICAgICB2X1UzMl90IHByZkxlbikKK3sKKyAgICBzdGF0aWMgdl9VOF90IHkgPSAwOworCisgICAgdl9VOF90ICpobWFjVGV4dCA9IE5VTEw7CisgICAgdl9VOF90ICpyZXN1bHRPZmZzZXQgPSByZXN1bHQ7CisgICAgaW50IG51bUxvb3BzOworICAgIGludCBsb29wQ3RyUG9zOworICAgIGludCBpLCByZXRWYWw9MDsKKworICAgIGhtYWNUZXh0ID0gdm9zX21lbV9tYWxsb2MoIGFMZW4gKyBiTGVuICsgMiApOworICAgIGlmKCBOVUxMID09IGhtYWNUZXh0ICkKKyAgICB7CisgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworICAgIH0KKworICAgIHZvc19tZW1fY29weShobWFjVGV4dCArIDAsIGEsIGFMZW4pOworICAgIGhtYWNUZXh0W2FMZW5dID0geTsKKyAgICB2b3NfbWVtX2NvcHkoaG1hY1RleHQgKyBhTGVuICsgMSwgYiwgYkxlbik7CisgICAgbG9vcEN0clBvcyA9IGFMZW4gKyAxICsgYkxlbjsKKworICAgIG51bUxvb3BzID0gcHJmTGVuICsgQUFHX1BUS19QUkZfQUREX1BBUkFNOworICAgIG51bUxvb3BzIC89IEFBR19QVEtfUFJGX0RJVl9QQVJBTTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1Mb29wczsgaSsrKSAKKyAgICB7CisgICAgICAgIFZPU19BU1NFUlQoKHJlc3VsdE9mZnNldCAtIHJlc3VsdCArIFZPU19ESUdFU1RfU0hBMV9TSVpFKQorICAgICAgICAgICAgICAgPD0gQUFHX1BSRl9NQVhfT1VUUFVUX1NJWkUpOworICAgICAgICBobWFjVGV4dFtsb29wQ3RyUG9zXSA9IGk7CisgICAgICAgIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc19zaGExX2htYWNfc3RyKGNyeXB0SGFuZGxlLCBobWFjVGV4dCwgbG9vcEN0clBvcyArIDEsIGtleSwga2V5TGVuLCByZXN1bHRPZmZzZXQpICkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gVk9TX0RJR0VTVF9TSEExX1NJWkU7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfT0s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b3NfbWVtX2ZyZWUoaG1hY1RleHQpOworCisgICAgcmV0dXJuIHJldFZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcFJzbjgwMjF4UHJmLmggYi9DT1JFL0JBUC9zcmMvYmFwUnNuODAyMXhQcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNjZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcFJzbjgwMjF4UHJmLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogV29vZHNpZGUgTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICRGaWxlOiAvL2RlcG90L3NvZnR3YXJlL3Byb2plY3RzL2ZlYXR1cmVfYnJhbmNoZXMvZ2VuNV9waGFzZTEvb3MvbGludXgvY2xhc3NpYy9hcC9hcHBzL3NzbS9hdXRoODAyMXgvYW5pODAyMXhQcmYuaCAkCisgKgorICogQ29udGFpbnMgZGVjbGFyYXRpb25zIGZvciByb3V0aW5lcyB0byBjYWxjdWxhdGUgdGhlIDgwMi4xMWkgUFJGCisgKiBmdW5jdGlvbnMuCisgKgorICogQXV0aG9yOiAgTWF5YW5rIEQuIFVwYWRoeWF5CisgKiBEYXRlOiAgICAxOS1NYXJjaC0yMDAzCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgIE1vZGlmaWVkIGJ5IE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfX0FBR19QUkZfSF8KKyNkZWZpbmUgX19BQUdfUFJGX0hfCisKKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlIDxiYXBSc25Bc2ZQYWNrZXQuaD4KKyNpbmNsdWRlIDxiYXBSc25Tc21FYXBvbC5oPgorI2luY2x1ZGUgImNzckFwaS5oIgorCisKKy8qCisgKiBEZWZpbmUgdGhlIG1heGltdW0gc2l6ZSBuZWVkZWQgZm9yIHRoZSByZXN1bHQgYXJyYXkgc28gdGhhdCBTSEEtMQorICogb3ZlcmZsb3cgaXMgYWNjb3VudGVkIGZvci4KKyAqLworI2RlZmluZSBBQUdfUFJGX01BWF9PVVRQVVRfU0laRSA4MAorCisjZGVmaW5lIEFBR19SU05fUFRLX1RLMV9PRkZTRVQgXAorICAgIChBQUdfUlNOX0VBUE9MX01JQ19LRVlfTEVOICsgQUFHX1JTTl9FQVBPTF9FTkNfS0VZX0xFTikKKworLy8gUGFpcndpc2Uga2V5IHJlbGF0ZWQgZGVmaW5pdGlvbnMuLi4KKworI2RlZmluZSBBQUdfUlNOX1BUS19QUkZfTEVOX1RLSVAgICA1MTIgLy9iaXRzCisjZGVmaW5lIEFBR19SU05fUFRLX1BSRl9MRU5fQ0NNUCAgIDM4NCAvL2JpdHMKKyNkZWZpbmUgQUFHX1JTTl9QVEtfUFJGX0xFTl9XRVAxMDQgMzg0IC8vYml0cworI2RlZmluZSBBQUdfUlNOX1BUS19QUkZfTEVOX1dFUDQwICAzODQgLy9iaXRzCisKKy8vIEdyb3VwIGtleSByZWxhdGVkIGRlZmluaXRpb25zLi4uCisKKyNkZWZpbmUgQUFHX1JTTl9HTUtfU0laRSAxNgorCisjZGVmaW5lIEFBR19SU05fR1RLX1BSRl9MRU5fVEtJUCAgIDI1NiAvL2JpdHMKKyNkZWZpbmUgQUFHX1JTTl9HVEtfUFJGX0xFTl9DQ01QICAgMTI4IC8vYml0cworI2RlZmluZSBBQUdfUlNOX0dUS19QUkZfTEVOX1dFUDEwNCAxMjggLy9iaXRzCisjZGVmaW5lIEFBR19SU05fR1RLX1BSRl9MRU5fV0VQNDAgIDEyOCAvL2JpdHMKKworLy8gS2V5IG1hdGVyaWFsIGxlbmd0aCB0aGF0IGlzIHNlbnQgdG8gdGhlIE1BQyBsYXllci4uLgorCisjZGVmaW5lIEFBR19SU05fS0VZX01BVEVSSUFMX0xFTl9DQ01QICAgMTYKKyNkZWZpbmUgQUFHX1JTTl9LRVlfTUFURVJJQUxfTEVOX1RLSVAgICAzMgorI2RlZmluZSBBQUdfUlNOX0tFWV9NQVRFUklBTF9MRU5fV0VQMTA0IDEzCisjZGVmaW5lIEFBR19SU05fS0VZX01BVEVSSUFMX0xFTl9XRVA0MCAgNQorCisvKioKKyAqIGFhZ0dldEtleU1hdGVyaWFsTGVuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBQVEsgdGhhdCBoYXZlIHRvIGJlIHByb3ZpZGVkIHRvCisgKiB0aGUgTUFDIGxheWVyIGZvciBhIGdpdmVuIGNpcGhlciB0eXBlLgorICoKKyAqIEBwYXJhbSBjaXBoZXJUeXBlIHRoZSBjaXBoZXItdHlwZQorICoKKyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBrZXkgbWF0ZXJpYWwgZm9yIHRoaXMgY2lwaGVyIHR5cGUsCisgKiBvciAwIGZvciBpbnZhbGlkIGNpcGhlciB0eXBlcy4KKyAqLworaW50CithYWdHZXRLZXlNYXRlcmlhbExlbihlQ3NyRW5jcnlwdGlvblR5cGUgY2lwaGVyVHlwZSk7CisKKy8qKgorICogYWFnUHRrUHJmCisgKgorICogVGhlIFBSRiB1c2VkIGZvciBjYWxjdWxhdGluZyB0aGUgcGFpcndpc2UgdGVtcG9yYWwga2V5IHVuZGVyIElFRUUKKyAqIDgwMi4xMWkuCisgKgorICogQHBhcmFtIHJlc3VsdCBhIGZpeGVkIHNpemUgYXJyYXkgd2hlcmUgdGhlIG91dHB1dGlzIHN0b3JlZC4gU2hvdWxkCisgKiBoYXZlIGVub3VnaCBwbGFjZSBmb3IgdGhlIFNIQS0xIG92ZXJmbG93LgorICogQHBhcmFtIHByZkxlbiB0aGUgbnVtYmVyIG9mIEJJVFMgZGVzaXJlZCBmcm9tIHRoZSBQUkYgcmVzdWx0CisgKiBAcGFyYW0gcG1rIHRoZSBwYWlyd2lzZSBtYXN0ZXIta2V5CisgKiBAcGFyYW0gYXV0aEFkZHIgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBhdXRoZW50aWNhdG9yCisgKiBAcGFyYW0gc3VwcEFkZHIgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBzdXBwbGljYW50CisgKiBAcGFyYW0gYU5vbmNlIHRoZSBub25jZSBnZW5lcmF0ZWQgYnkgdGhlIGF1dGhlbnRpY2F0b3IKKyAqIEBwYXJhbSBzTm9uY2UgdGhlIG5vbmNlIGdlbmVyYXRlZCBieSB0aGUgc3VwcGxpY2FudAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithYWdQdGtQcmYodl9VMzJfdCBjcnlwdEhhbmRsZSwKKyAgICAgICAgICB2X1U4X3QgcmVzdWx0W0FBR19QUkZfTUFYX09VVFBVVF9TSVpFXSwKKyAgICAgICAgICB2X1UzMl90IHByZkxlbiwKKyAgICAgICAgICB0QW5pUGFja2V0ICpwbWssIAorICAgICAgICAgIHRBbmlNYWNBZGRyIGF1dGhBZGRyLAorICAgICAgICAgIHRBbmlNYWNBZGRyIHN1cHBBZGRyLAorICAgICAgICAgIHZfVThfdCBhTm9uY2VbQU5JX0VBUE9MX0tFWV9SU05fTk9OQ0VfU0laRV0sCisgICAgICAgICAgdl9VOF90IHNOb25jZVtBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFXSk7CisKKworLyoqCisgKiBhYWdHdGtQcmYKKyAqCisgKiBUaGUgUFJGIHVzZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBncm91cCB0ZW1wb3JhbCBrZXkgdW5kZXIgSUVFRQorICogODAyLjExaS4KKyAqCisgKiBAcGFyYW0gcmVzdWx0IGEgZml4ZWQgc2l6ZSBhcnJheSB3aGVyZSB0aGUgb3V0cHV0aXMgc3RvcmVkLiBTaG91bGQKKyAqIGhhdmUgZW5vdWdoIHBsYWNlIGZvciB0aGUgU0hBLTEgb3ZlcmZsb3cuCisgKiBAcGFyYW0gcHJmTGVuIHRoZSBudW1iZXIgb2YgQklUUyBkZXNpcmVkIGZyb20gdGhlIFBSRiByZXN1bHQKKyAqIEBwYXJhbSBnbWsgdGhlIGdyb3VwIG1hc3Rlci1rZXkKKyAqIEBwYXJhbSBhdXRoQWRkciB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGF1dGhlbnRpY2F0b3IKKyAqIEBwYXJhbSBnTm9uY2UgdGhlIG5vbmNlIGdlbmVyYXRlZCBieSB0aGUgYXV0aGVudGljYXRvciBmb3IgdGhpcyBwdXJwb3NlCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FhZ0d0a1ByZih2X1UzMl90IGNyeXB0SGFuZGxlLAorICAgICAgICAgIHZfVThfdCByZXN1bHRbQUFHX1BSRl9NQVhfT1VUUFVUX1NJWkVdLAorICAgICAgICAgIHZfVTMyX3QgcHJmTGVuLAorICAgICAgICAgIHZfVThfdCBnbWtbQUFHX1JTTl9HTUtfU0laRV0sCisgICAgICAgICAgdEFuaU1hY0FkZHIgYXV0aEFkZHIsCisgICAgICAgICAgdl9VOF90IGdOb25jZVtBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFXSk7CisKKy8qKgorICogYWFnUHJmCisgKgorICogVGhlIHJhdyBQUkYgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIGluIElFRUUgODAyLjExaS4KKyAqCisgKiBAcGFyYW0gcmVzdWx0IGEgZml4ZWQgc2l6ZSBhcnJheSB3aGVyZSB0aGUgb3V0cHV0aXMgc3RvcmVkLiBTaG91bGQKKyAqIGhhdmUgZW5vdWdoIHBsYWNlIGZvciB0aGUgU0hBLTEgb3ZlcmZsb3cuCisgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gdXNlIGluIHRoZSBQUkYKKyAqIEBwYXJhbSBrZXlMZW4gdGhlIGxlbmd0aCBvZiB0aGUga2V5CisgKiBAcGFyYW0gYSB0aGUgcGFyYW1ldGVyIEEgd2hpY2ggaXMgdXN1YWxseSBhIHVuaXF1ZSBsYWJlbAorICogQHBhcmFtIGFMZW4gdGhlIGxlbmd0aCBvZiB0aGUgcGFyYW1ldGVyIEEKKyAqIEAgcGFyYW0gYiB0aGUgcGFyYW1ldGVyIEIKKyAqIEBwYXJhbSBiTGVuIHRoZSBsZW5ndGggb2YgcGFyYW1ldGVyIEIKKyAqIEBwYXJhbSBwcmZMZW4gdGhlIG51bWJlciB0byBCSVRTIGRlc2lyZWQgZnJvbSB0aGUgUFJGIHJlc3VsdAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithYWdQcmYodl9VMzJfdCBjcnlwdEhhbmRsZSwKKyAgICAgICB2X1U4X3QgcmVzdWx0W0FBR19QUkZfTUFYX09VVFBVVF9TSVpFXSwKKyAgICAgICB2X1U4X3QgKmtleSwgdl9VOF90IGtleUxlbiwKKyAgICAgICB2X1U4X3QgKmEsIHZfVThfdCBhTGVuLAorICAgICAgIHZfVThfdCAqYiwgdl9VOF90IGJMZW4sCisgICAgICAgdl9VMzJfdCBwcmZMZW4pOworCisjZW5kaWYgLy9fX0FBR19QUkZfSF8KZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBSc244MDIxeFN1cHBSc25Gc20uYyBiL0NPUkUvQkFQL3NyYy9iYXBSc244MDIxeFN1cHBSc25Gc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YThhNGNiCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcFJzbjgwMjF4U3VwcFJzbkZzbS5jCkBAIC0wLDAgKzEsMTE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBXb29kc2lkZSBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogJEZpbGU6IC8vZGVwb3Qvc29mdHdhcmUvcHJvamVjdHMvZmVhdHVyZV9icmFuY2hlcy9nZW41X3BoYXNlMS9vcy9saW51eC9jbGFzc2ljL2FwL2FwcHMvc3NtL2F1dGg4MDIxeC9hbmk4MDIxeFN1cHBSc25Gc20uYyAkCisgKgorICogQ29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBSU04gRUFQT0wtS2V5IEZTTSBvbiB0aGUKKyAqIHN1cHBsaWNhbnQgc2lkZS4gVGhpcyBpcyBiYXNlZCBvbiA4MDIuMTFpLgorICoKKyAqIEF1dGhvcjogICAgICBNYXlhbmsgRC4gVXBhZGh5YXkKKyAqIERhdGU6ICAgICAgICAxOS1EZWNlbWJlci0yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICBNb2RpZmllZCBieSAgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJiYXBSc25Tc21TZXJ2aWNlcy5oIgorI2luY2x1ZGUgImJhcFJzblNzbUVhcG9sLmgiCisjaW5jbHVkZSAiYmFwUnNuRXJyb3JzLmgiCisjaW5jbHVkZSAiYmFwUnNuODAyMXhTdXBwUnNuRnNtLmgiCisjaW5jbHVkZSAidm9zX3V0aWxzLmgiCisjaW5jbHVkZSAiYmFwUnNuVHhSeC5oIgorI2luY2x1ZGUgImJ0YW1wRnNtLmgiCisKKy8vIFRoZSBkaWZmZXJlbnQgc3RhdGVzIHRoYXQgdGhpcyBGU00gdHJhbnNpdGlvbnMgdGhyb3VnaAorI2RlZmluZSBJTklUSUFMSVpFICAgICAgICAgICAwCisjZGVmaW5lIEFVVEhFTlRJQ0FUSU9OICAgICAgIDEKKyNkZWZpbmUgR09UX1BNSyAgICAgICAgICAgICAgMgorI2RlZmluZSBTVEFfS0VZX1NUQVJUICAgICAgICAzCisjZGVmaW5lIFNUQV9LRVlfU0VUICAgICAgICAgIDQKKyNkZWZpbmUgS0VZX1VQREFURSAgICAgICAgICAgNSAgIAorI2RlZmluZSBSRUtFWV9NU0cgICAgICAgICAgICA2CisjZGVmaW5lIEdST1VQX0tFWV9TRVQgICAgICAgIDcKKyNkZWZpbmUgTlVNX1NUQVRFUyAoR1JPVVBfS0VZX1NFVCArIDEpCisKKworc3RhdGljIHRTdXBwUnNuRnNtQ29uc3RzIHN1cHBDb25zdHMgPSB7IDIwMDAsIDMgfTsgICAgLy90aW1lb3V0LCByZXRyeSBsaW1pdAorCitpbnQgZ1JlYWRUb1NldEtleSA9IDA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RhdGljIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgCitpbnQgemVyb091dFB0ayh0U3VwcFJzbkZzbSAqZnNtKTsKKworc3RhdGljCitpbnQgY2hlY2tNaWModFN1cHBSc25Gc20gKmZzbSwgCisgICAgICAgICAgICAgdEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGEgKmRhdGEsCisgICAgICAgICAgICAgdl9CT09MX3QgcHdLZXlFeGNoYW5nZSk7CisKK3N0YXRpYyBpbnQgY2hlY2tJbmZvRWxlbWVudCh0U3VwcFJzbkZzbSAqZnNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICpkYXRhKTsKKworc3RhdGljCitpbnQgY2hlY2tQZWVyUmVwbGF5Q291bnRlcih0U3VwcFJzbkZzbSAqZnNtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgKnJldHJhbnNtaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCBhY3R1YWxNaWNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgcmVUeE1pY0ZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK3N0YXRpYworaW50IGRlcml2ZVB0ayh0U3VwcFJzbkZzbSAqZnNtLCAKKyAgICAgICAgICAgICAgdEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGEgKmRhdGEpOworCitzdGF0aWMgCitpbnQgY2hlY2tUcmFuc2l0aW9uKHRTdXBwUnNuRnNtICpmc20sIHZvaWQgKmFyZyk7CisKK3N0YXRpYyBpbnQKK2dvdG9TdGF0ZUluaXQodFN1cHBSc25Gc20gKmZzbSk7CisKK3N0YXRpYyBpbnQgc3VwcFJzblJ4RnJhbWVIYW5kbGVyKCB2X1BWT0lEX3QgcHZvc0dDdHgsIHZvc19wa3RfdCAqcFBhY2tldCApOworc3RhdGljIGludCBzdXBwUnNuVHhDb21wbGV0ZUhhbmRsZXIoIHZfUFZPSURfdCBwdm9zR0N0eCwgdm9zX3BrdF90ICpwUGFja2V0LCBWT1NfU1RBVFVTIHJldFN0YXR1cyApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW50ZXJuYWwgRnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBzdXBwUnNuQXV0aFN0YXJ0RXZlbnRIYW5kbGVyKHRTdXBwUnNuRnNtICpmc20pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIGV4cG9ydGVkIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogc3VwcFJzbkZzbUluaXQKKyAqCisgKiBGVU5DVElPTjoKKyAqIEluaXRpYWxpemVzIHRoZSBjb25zdGFudHMgYW5kIHRoZSBjYWxsYmFja3MgbmVlZGVkIGJ5IHRoaXMgRlNNCisgKiBtb2R1bGUuCisgKgorICogQHBhcmFtIGNiIGNhbGxiYWNrcyB0byB0aGUgdmFyaW91cyBwcm9jZWR1cmVzIG5lZWRlZCBieSB0aGlzIEZTTQorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CitzdXBwUnNuRnNtSW5pdCh2b2lkKQoreworICAgIC8vIFRPRE86IFJlYWQgdGhlIGNvbnN0YW50cyBpbiBmcm9tIGNvbmZpZworICAgIC8vIGNvbnN0cyA9IGNvbnN0c0luOworICAgIHN1cHBDb25zdHMudGltZW91dFBlcmlvZCA9IDIwMDA7CisgICAgc3VwcENvbnN0cy5tYXhUcmllcyA9IDM7CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCisvKioKKyAqIHN1cHBSc25Gc21DcmVhdGUKKyAqCisgKiBGVU5DVElPTgorICogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyB0aGUgc3RhdGUgb2YgYW4gUlNOIGtleSBGU00gaW5zdGFuY2UgZm9yCisgKiB0aGUgZ2l2ZW4gQlAgY29udGV4dC4KKyAqIAorICogQHBhcm0gY3R4IHRoZSBCUCBjb250ZXh0IHdob3NlIGluc3RhbmNlIGlzIGJlaW5nIGNyZWF0ZWQKKyAqIEBwYXJhbSBwc2tCYXNlZCBwYXNzIGluIGVBTklfQk9PTEVBTl9UUlVFIGlzIHRoaXMgQlAgaXMgdG8gYmUKKyAqIGF1dGhlbnRpY2F0ZWQgYmFzZWQgb24gYSBwcmUtc2hhcmVkIGtleSBhcyBvcHBvc2VkIHRvIEVBUC4KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorc3VwcFJzbkZzbUNyZWF0ZSh0QnRhbXBDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHJldFZhbCA9IEFOSV9PSzsKKyAgICB0U3VwcFJzbkZzbSAqZnNtID0gJmN0eC0+dUZzbS5zdXBwRnNtOworCisgICAgLy8gRmlyc3QsIGNsZWFyIGV2ZXJ5dGhpbmcgb3V0CisgICAgdm9zX21lbV96ZXJvKCBmc20sIHNpemVvZih0U3VwcFJzbkZzbSkpOworCisgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIGJhcFJzblJlZ2lzdGVyVHhSeENhbGxiYWNrcyggc3VwcFJzblR4Q29tcGxldGVIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwUnNuUnhGcmFtZUhhbmRsZXIgKSApICkKKyAgICB7CisgICAgICAgIHJldHVybiBBTklfRVJST1I7CisgICAgfQorCisgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIGJhcFJzblJlZ2lzdGVyUnhDYWxsYmFjayggY3R4LT5wdm9zR0N0eCApICkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFOSV9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSB0aGUgc3VwcGxpY2FudCBjb250ZXh0CisgICAgZnNtLT5zdXBwQ3R4ID0gKHRTdXBwQ29udGV4dCAqKXZvc19tZW1fbWFsbG9jKCBzaXplb2YodFN1cHBDb250ZXh0KSApOworICAgIGlmIChmc20tPnN1cHBDdHggPT0gTlVMTCkgCisgICAgeworICAgICAgICByZXRWYWwgPSBBTklfRV9NQUxMT0NfRkFJTEVEOworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIC8vIENsZWFyIG91dCB0aGUgc3VwcGxpY2FudCBjb250ZXh0CisgICAgdm9zX21lbV96ZXJvKCBmc20tPnN1cHBDdHgsIHNpemVvZih0U3VwcENvbnRleHQpKTsKKworICAgIGZzbS0+Y3R4ID0gY3R4OworICAgIC8vT25seSBzdXBwb3J0IENDTVAKKyAgICBmc20tPnN1cHBDdHgtPnB3Q2lwaGVyVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0FFUzsKKworICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEFsbG9jYXRlRXhwbGljaXQoJmZzbS0+bGFzdEVhcG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOX01BWF9QQUNLRVRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVBUE9MX1RYX0hFQURFUl9TSVpFKTsKKyAgICBpZiAocmV0VmFsICE9IEFOSV9PSykgCisgICAgeworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgYW5pQXNmUGFja2V0QWxsb2NhdGUoJmZzbS0+c3VwcEN0eC0+cG1rKTsKKyAgICBpZiAoZnNtLT5zdXBwQ3R4LT5wbWsgPT0gTlVMTCkgCisgICAgeworICAgICAgICByZXRWYWwgPSBBTklfRV9NQUxMT0NfRkFJTEVEOworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZnNtLT5zdXBwQ3R4LT5pZUFwID0gTlVMTDsgCisKKyAgICBmc20tPmNyeXB0SGFuZGxlID0gMDsKKyAgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zX2NyeXB0b19pbml0KCAmZnNtLT5jcnlwdEhhbmRsZSApICkgKQorICAgIHsKKyAgICAgICAgcmV0VmFsID0gQU5JX0VfRkFJTEVEOworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgfQorCisgICAgZnNtLT5jdXJyZW50U3RhdGUgPSBJTklUSUFMSVpFOworICAgIGdvdG9TdGF0ZUluaXQoZnNtKTsKKworICAgIHN1cHBSc25Gc21Qcm9jZXNzRXZlbnQoIGZzbSwgUlNOX0ZTTV9BVVRIX1NUQVJULCBOVUxMICk7CisKKyAgICByZXR1cm4gQU5JX09LOworCisgZXJyb3I6CisgICAgc3VwcFJzbkZzbUZyZWUoIGN0eCApOworCisgICAgcmV0dXJuIHJldFZhbDsKKyAgICAKK30KKworLyoqCisgKiBzdXBwUnNuRnNtRnJlZQorICoKKyAqIEZVTkNUSU9OCisgKiBGcmVlcyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIFJTTiBLZXkgRlNNIGluIGEgQlAgY29udGV4dC4gSWYgdGhlCisgKiBSU04gS2V5IEZTTSBpcyBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiB0aGlzIGlzIGFuIGVycm9yLgorICogCisgKiBAcGFyYW0gY3R4IHRoZSBCUCBjb250ZXh0IHdob3NlIEZTTSBpbnN0YW5jZSBpcyB0byBiZSBmcmVlZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CitzdXBwUnNuRnNtRnJlZSh0QnRhbXBDb250ZXh0ICpjdHgpCit7CisgICAgdFN1cHBSc25Gc20gKmZzbTsKKworICAgIGZzbSA9ICZjdHgtPnVGc20uc3VwcEZzbTsKKworICAgIGlmKCBmc20tPmNyeXB0SGFuZGxlICkKKyAgICB7ICAKKyAgICAgICAgdm9zX2NyeXB0b19kZWluaXQoIGZzbS0+Y3J5cHRIYW5kbGUgKTsKKyAgICB9CisKKyAgICBiYXBSc25DbGVhclR4UnhDYWxsYmFja3MoKTsgCisKKyAgICBpZiAoZnNtLT5sYXN0RWFwb2wpCisgICAgICAgIGFuaUFzZlBhY2tldEZyZWUoZnNtLT5sYXN0RWFwb2wpOworCisgICAgaWYoIGZzbS0+c3VwcEN0eCApCisgICAgeworICAgICAgICBpZiAoIGZzbS0+c3VwcEN0eC0+cG1rICkKKyAgICAgICAgeworICAgICAgICAgICAgYW5pQXNmUGFja2V0RnJlZShmc20tPnN1cHBDdHgtPnBtayk7CisgICAgICAgIH0KKyAgICAgICAgdm9zX21lbV9mcmVlKCBmc20tPnN1cHBDdHggKTsKKyAgICB9CisKKyAgICAvLyBGaW5hbGx5LCBjbGVhciBldmVyeXRoaW5nIG91dAorICAgIHZvc19tZW1femVybyggZnNtLCBzaXplb2YodFN1cHBSc25Gc20pKTsKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKKy8qKgorICogc3VwcFJzbkZzbVByb2Nlc3NFdmVudAorICoKKyAqIEZVTkNUSU9OCisgKiBQYXNzZXMgYW4gZXZlbnQgdG8gdGhlIFJTTiBrZXkgRlNNIGluc3RhbmNlIGZvciBpbW1lZGlhdGUgcHJvY2Vzc2luZy4KKyAqIAorICogQHBhcmFtIGZzbSB0aGUgUlNOIEtleSBGU00gaW5zdGFuY2UKKyAqIEBwYXJhbSBldmVudElkIHRoZSBBQUcgZXZlbnQgdG8gcHJvY2VzcworICogQHBhcmFtIGFyZyBhbiBvcHRpb25hbCBhcmd1bWVudCBmb3IgdGhpcyBldmVudAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CitzdXBwUnNuRnNtUHJvY2Vzc0V2ZW50KHRTdXBwUnNuRnNtICpmc20sIHRSc25Gc21FdmVudCBldmVudElkLCB2b2lkICphcmcpCit7CisKKyAgICBzd2l0Y2ggKGV2ZW50SWQpIAorICAgIHsKKyAgICBjYXNlIFJTTl9GU01fVElNRVJfRVhQSVJFRDoKKyAgICAgICAgLy8gUHJvY2VlZCBzdHJhaWdodCB0byBjaGVja1RyYW5zaXRpb24KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU05fRlNNX0FVVEhfU1RBUlQ6CisgICAgICAgIGZzbS0+YXV0aFJlcSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICBzdXBwUnNuQXV0aFN0YXJ0RXZlbnRIYW5kbGVyKGZzbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNOX0ZTTV9FQVBPTF9GUkFNRV9BVkFJTEFCTEU6CisgICAgICAgIGZzbS0+ZWFwb2xBdmFpbCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTTl9GU01fSU5URUdfRkFJTEVEOgorICAgICAgICBmc20tPmludGVnRmFpbGVkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIlN1cHAgdW5rbm93biBldmVudCBmb3IgU3VwcEZzbTogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJZCk7CisgICAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICAgICAgcmV0dXJuIEFOSV9FX0lMTEVHQUxfQVJHOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjaGVja1RyYW5zaXRpb24oZnNtLCBhcmcpOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworaW50CitzdXBwUnNuQXV0aFN0YXJ0RXZlbnRIYW5kbGVyKHRTdXBwUnNuRnNtICpmc20pCit7CisgICAgLy8gQ29weSByZXF1aXJlZCBpbmZvCisgICAgdm9zX21lbV9jb3B5KCAmZnNtLT5zdXBwQ3R4LT5hdXRoTWFjLCBmc20tPmN0eC0+cGVlcl9tYWNfYWRkciwgNik7CisgICAgdm9zX21lbV9jb3B5KCAmZnNtLT5zdXBwQ3R4LT5zdXBwTWFjLCBmc20tPmN0eC0+c2VsZl9tYWNfYWRkciwgNik7CisgICAgYW5pQXNmUGFja2V0QXBwZW5kQnVmZmVyKCBmc20tPnN1cHBDdHgtPnBtaywgZnNtLT5jdHgtPmtleV9tYXRlcmlhbCwgZnNtLT5jdHgtPmtleV9sZW5ndGgpOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgc3RhdGljIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50Citnb3RvU3RhdGVJbml0KHRTdXBwUnNuRnNtICpmc20pCit7CisgICAgZnNtLT5jdXJyZW50U3RhdGUgPSBJTklUSUFMSVpFOworCisgICAgZnNtLT5hdXRoUmVxID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGZzbS0+ZWFwb2xBdmFpbCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBmc20tPmludGVnRmFpbGVkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGZzbS0+cG1rQXZhaWwgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICAvLyBDcmVhdGUgdHdvIHJlcGxheSBjb3VudGVyJ3MuLm9uZSBmb3Igb3VyIHJlcXVlc3RzLCBhbmQgYW5vdGhlcgorICAgIC8vIGZvciBTVEEncyByZXF1ZXN0cy4gSW5pdGlhbGl6ZSB0aGUgZmlyc3Qgb25lIHJhbmRvbWx5LgorICAgIGFuaVNzbVJlcGxheUN0ckNyZWF0ZShmc20tPmNyeXB0SGFuZGxlLCAmZnNtLT5sb2NhbFJlcGxheUN0ciwgQU5JX0VBUE9MX0tFWV9SU05fUlNDX1NJWkUsIDApOworICAgIGFuaVNzbVJlcGxheUN0ckNyZWF0ZShmc20tPmNyeXB0SGFuZGxlLCAmZnNtLT5wZWVyUmVwbGF5Q3RyLCBBTklfRUFQT0xfS0VZX1JTTl9SU0NfU0laRSwgMCk7CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCitzdGF0aWMgaW50Citnb3RvU3RhdGVBdXRoZW50aWNhdGlvbih0U3VwcFJzbkZzbSAqZnNtKQoreworICAgIGZzbS0+Y3VycmVudFN0YXRlID0gQVVUSEVOVElDQVRJT047CisKKyAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NfcmFuZF9nZXRfYnl0ZXMoIGZzbS0+Y3J5cHRIYW5kbGUsIGZzbS0+c05vbmNlLCBBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFICkgKSApCisgICAgeworICAgICAgICB6ZXJvT3V0UHRrKGZzbSk7CisgICAgICAgIC8vIFRPRE86IFplcm8gb3V0IGFsbCBHVEsncworICAgICAgICBmc20tPmF1dGhSZXEgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIC8vLy8vZ2V0UG1rKGZzbS0+c3VwcEN0eCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIlN1cHAgZmFpbCB0byByYW5kb20gbnVtYmVyXG4iICk7CisgICAgICAgIHJldHVybiBBTklfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworc3RhdGljIGludAorZ290b1N0YXRlR290UG1rKHRTdXBwUnNuRnNtICpmc20pCit7CisgICAgZnNtLT5jdXJyZW50U3RhdGUgPSBHT1RfUE1LOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworc3RhdGljIGludAorZ290b1N0YXRlU3RhS2V5U3RhcnQodFN1cHBSc25Gc20gKmZzbSwgCisgICAgICAgICAgICAgICAgICAgICB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IHJldHJhbnNtaXQpCit7CisgICAgaW50IHJldFZhbDsKKyAgICB0QW5pRWFwb2xSc25LZXlEZXNjIHR4RGVzYzsKKyAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyeERlc2M7CisgICAgc3RhdGljIHZfVThfdCBidGFtcFJTTklFW10gPSB7MHgzMCwgMHgxNCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwZiwgMHhhYywgMHgwNCwgMHgwMSwgMHgwMCwgCisgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsIDB4MDAsIDB4MDAgfTsKKworICAgIGZzbS0+Y3VycmVudFN0YXRlID0gU1RBX0tFWV9TVEFSVDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBFQVBPTCBmcmFtZSBpZiB3ZSBkb24ndCBoYXZlIHRvIHJldHJhbnNtaXQKKyAgIC8vIGlmICghcmV0cmFuc21pdCkgCisgICAgLy97CisKKyAgICAgICAgcnhEZXNjID0gZGF0YS0+a2V5RGVzYzsKKyAgICAgICAgaWYoIE5VTEwgPT0gcnhEZXNjKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQU5JX0VfTlVMTF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBhbmlBc2ZQYWNrZXRFbXB0eUV4cGxpY2l0KCBmc20tPmxhc3RFYXBvbCwgRUFQT0xfVFhfSEVBREVSX1NJWkUgKTsKKyAgICAgICAgcmV0VmFsID0gZGVyaXZlUHRrKGZzbSwgZGF0YSk7CisgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJTdXBwIGRlcml2ZVB0ayBmYWlsZWQgd2l0aCBjb2RlICVkIVxuIiwgcmV0VmFsKTsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0KKworICAgICAgICB2b3NfbWVtX3plcm8oICZ0eERlc2MsIHNpemVvZih0eERlc2MpICk7CisKKyAgICAgICAgLy8gVGhlIEtleSBJbmZvcm1hdGlvbiBiaXRzLi4uCisgICAgICAgIGlmIChmc20tPnN1cHBDdHgtPnB3Q2lwaGVyVHlwZSA9PSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVMpIAorICAgICAgICB7CisgICAgICAgICAgICB0eERlc2MuaW5mby5rZXlEZXNjVmVycyA9IEFOSV9FQVBPTF9LRVlfREVTQ19WRVJTX0FFUzsKKyAgICAgICAgfQorICAgICAgICB0eERlc2MuaW5mby51bmljYXN0RmxhZyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICB0eERlc2MuaW5mby5taWNGbGFnID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIHR4RGVzYy5rZXlMZW4gPSAwOyAvL1JTTl84MDIxMV9LRVlfTEVOOworCisgICAgICAgIC8vIFNlbmQgYmFjayB0aGUgc2FtZSByZXBsYXlDdHIgdGhhdCB0aGUgYXV0aGVudGljYXRvciBzZW50CisgICAgICAgIHZvc19tZW1fY29weSh0eERlc2MucmVwbGF5Q291bnRlciwgCisgICAgICAgICAgICAgICByeERlc2MtPnJlcGxheUNvdW50ZXIsIAorICAgICAgICAgICAgICAgc2l6ZW9mKHR4RGVzYy5yZXBsYXlDb3VudGVyKSk7CisKKyAgICAgICAgdm9zX21lbV9jb3B5KHR4RGVzYy5rZXlOb25jZSwgZnNtLT5zTm9uY2UsIHNpemVvZih0eERlc2Mua2V5Tm9uY2UpKTsKKyAgICAgICAgdHhEZXNjLmtleURhdGFMZW4gPSBzaXplb2YoYnRhbXBSU05JRSk7Ly9hbmlBc2ZQYWNrZXRHZXRCeXRlcyhmc20tPnN1cHBDdHgtPmllQnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJnR4RGVzYy5rZXlEYXRhKTsgICAgCisgICAgICAgIHR4RGVzYy5rZXlEYXRhID0gYnRhbXBSU05JRTsKKyAgICAgICAgcmV0VmFsID0gYW5pRWFwb2xXcml0ZUtleShmc20tPmNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+bGFzdEVhcG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3VwcEN0eC0+YXV0aE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc20tPnN1cHBDdHgtPnN1cHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX0VBUE9MX0tFWV9ERVNDX1RZUEVfUlNOX05FVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHhEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3VwcEN0eC0+cHRrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1JfQUVTX0tFWV9MRU4pOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJTdXBwIGdvdG9TdGF0ZVN0YUtleVN0YXJ0IGZhaWwgdG8gd3JpdGUga2V5ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisgICAgLy99CisgCisgICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggYmFwUnNuU2VuZEVhcG9sRnJhbWUoIGZzbS0+Y3R4LT5wdm9zR0N0eCwgZnNtLT5sYXN0RWFwb2wgKSApICkKKyAgICB7CisgICAgICAgIHJldFZhbCA9IEFOSV9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0VmFsID0gQU5JX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBpbnQKK2dvdG9TdGF0ZVN0YUtleVNldCh0U3VwcFJzbkZzbSAqZnNtLCAKKyAgICAgICAgICAgICAgICAgICB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCByZXRyYW5zbWl0KQoreworICAgIGludCByZXRWYWw9MDsKKyAgICB0QW5pRWFwb2xSc25LZXlEZXNjIHR4RGVzYzsKKyAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyeERlc2MgPSBOVUxMOworICAgIAorICAgIGZzbS0+Y3VycmVudFN0YXRlID0gU1RBX0tFWV9TRVQ7CisKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKKyAgICAgICAgcmV0dXJuIEFOSV9PSzsKKyAgICB9CisgICAgCisgICAgLy8gQ3JlYXRlIGEgbmV3IEVBUE9MIGZyYW1lIGlmIHdlIGRvbid0IGhhdmUgdG8gcmV0cmFuc21pdAorICAgIGlmICghcmV0cmFuc21pdCkgCisgICAgeworICAgICAgICAvLyBGaXJzdCBjaGVjayB0aGUgSUUgdGhhdCB0aGUgQVAgc2VudAorICAgICAgICByZXRWYWwgPSBjaGVja0luZm9FbGVtZW50KGZzbSwgZGF0YSk7CisgICAgICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKSAKKyAgICAgICAgeworICAgICAgICAgICAgLy9GSVhfUlNOIGFhZ1NldFN1cHBGYWlsdXJlQW5kQ2xlYW51cChmc20tPnN1cHBDdHgpOworCisgICAgICAgICAgICAvLyBGU00gZG9lcyBub3QgZXhpc3QgYWZ0ZXIgdGhpcy4uLgorCisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEVBUE9MIGZyYW1lCisKKyAgICAgICAgcnhEZXNjID0gZGF0YS0+a2V5RGVzYzsKKyAgICAgICAgaWYoIE5VTEwgPT0gcnhEZXNjICkKKyAgICAgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgICAgICAgIGFuaUFzZlBhY2tldEVtcHR5RXhwbGljaXQoZnNtLT5sYXN0RWFwb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVBUE9MX1RYX0hFQURFUl9TSVpFICk7CisKKyAgICAgICAgdm9zX21lbV96ZXJvKCAmdHhEZXNjLCBzaXplb2YodHhEZXNjKSApOworCisgICAgICAgIC8vIFRoZSBLZXkgSW5mb3JtYXRpb24gYml0cy4uLgorICAgICAgICBpZiAoZnNtLT5zdXBwQ3R4LT5wd0NpcGhlclR5cGUgPT0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTKSAKKyAgICAgICAgeworICAgICAgICAgICAgdHhEZXNjLmluZm8ua2V5RGVzY1ZlcnMgPSBBTklfRUFQT0xfS0VZX0RFU0NfVkVSU19BRVM7CisgICAgICAgIH0KKworICAgICAgICB0eERlc2MuaW5mby51bmljYXN0RmxhZyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICB0eERlc2MuaW5mby5taWNGbGFnID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIHR4RGVzYy5pbmZvLnNlY3VyZUZsYWcgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgdHhEZXNjLmtleUxlbiA9IDA7IC8vUlNOXzgwMjExX0tFWV9MRU47CisKKyAgICAgICAgLy8gU2VuZCBiYWNrIHRoZSBzYW1lIHJlcGxheUN0ciB0aGF0IHRoZSBhdXRoZW50aWNhdG9yIHNlbnQKKyAgICAgICAgdm9zX21lbV9jb3B5KHR4RGVzYy5yZXBsYXlDb3VudGVyLCAKKyAgICAgICAgICAgICAgIHJ4RGVzYy0+cmVwbGF5Q291bnRlciwgCisgICAgICAgICAgICAgICBzaXplb2YodHhEZXNjLnJlcGxheUNvdW50ZXIpKTsKKworICAgICAgICByZXRWYWwgPSBhbmlFYXBvbFdyaXRlS2V5KGZzbS0+Y3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNtLT5sYXN0RWFwb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNtLT5zdXBwQ3R4LT5hdXRoTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3VwcEN0eC0+c3VwcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNtLT5zdXBwQ3R4LT5wdGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NSX0FFU19LRVlfTEVOKTsKKyAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBnUmVhZFRvU2V0S2V5ID0gQkFQX1NFVF9SU05fS0VZOworICAgIGlmKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBiYXBSc25TZW5kRWFwb2xGcmFtZSggZnNtLT5jdHgtPnB2b3NHQ3R4LCBmc20tPmxhc3RFYXBvbCApICkgKQorICAgIHsKKyAgICAgICAgLyogbWFraW5nIGl0IGdsb2JhbCB0byBhY2Nlc3MgaW4gYmFwVHhSeCBmaWxlICovCisjaWYgMAorICAgICAgICB0Q3NyUm9hbVNldEtleSBzZXRLZXlJbmZvOworCisKKyAgICAgICAgdm9zX21lbV96ZXJvKCAmc2V0S2V5SW5mbywgc2l6ZW9mKCB0Q3NyUm9hbVNldEtleSApICk7CisgICAgICAgIHNldEtleUluZm8uZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0FFUzsKKyAgICAgICAgc2V0S2V5SW5mby5rZXlEaXJlY3Rpb24gPSBlU0lSX1RYX1JYOworICAgICAgICB2b3NfbWVtX2NvcHkoIHNldEtleUluZm8ucGVlck1hYywgZnNtLT5zdXBwQ3R4LT5hdXRoTWFjLCBzaXplb2YoIHRBbmlNYWNBZGRyICkgKTsKKyAgICAgICAgc2V0S2V5SW5mby5wYWVSb2xlID0gMDsgLy90aGlzIGlzIGEgc3VwcGxpY2FudAorICAgICAgICBzZXRLZXlJbmZvLmtleUlkID0gMDsgICAvL2Fsd2F5cworICAgICAgICBzZXRLZXlJbmZvLmtleUxlbmd0aCA9IENTUl9BRVNfS0VZX0xFTjsgCisgICAgICAgIHZvc19tZW1fY29weSggc2V0S2V5SW5mby5LZXksICh2X1U4X3QgKilmc20tPnN1cHBDdHgtPnB0ayArICgyICogQ1NSX0FFU19LRVlfTEVOICksIENTUl9BRVNfS0VZX0xFTiApOworICAgICAgICAvL2ZzbS0+c3VwcEN0eC0+cHRrIGNvbnRhaW5zIHRoZSAzIDE2LWJ5dGVzIGtleXMuIFdlIG5lZWQgdGhlIGxhc3Qgb25lLgorICAgICAgICAvKgorICAgICAgICAgIFdlIHdpbGwgbW92ZSB0aGUgU2V0IGtleSB0byBFQVBPTCBDb21wbGV0aW9uIGhhbmRsZXIuIFdlIGZvdW5kIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbQorICAgICAgICAgIHNlbmRpbmcgRUFQT0wgZnJhbWUgYW5kIHNldHRpbmcgS2V5ICovCisKKworICAgICAgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggYmFwU2V0S2V5KCBmc20tPmN0eC0+cHZvc0dDdHgsICZzZXRLZXlJbmZvICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiBTdXBwOiBnb3RvU3RhdGVTdGFLZXlTZXQgZmFpbCB0byBzZXQga2V5XG4iICk7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfRVJST1I7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBnUmVhZFRvU2V0S2V5ID0gQkFQX1JFU0VUX1JTTl9LRVk7CisgICAgICAgIHJldFZhbCA9IEFOSV9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgaW50Citnb3RvU3RhdGVHcm91cEtleVNldCh0U3VwcFJzbkZzbSAqZnNtLCAKKyAgICAgICAgICAgICAgICAgICAgIHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICpkYXRhKQoreworICAgIGludCByZXRWYWw7CisgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyB0eERlc2M7CisgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyAqcnhEZXNjOworCisgICAgaW50IGdyb3VwS2V5TGVuOworICAgIAorICAgIGZzbS0+Y3VycmVudFN0YXRlID0gR1JPVVBfS0VZX1NFVDsKKyAgICAKKyAgICBkbworICAgIHsKKyAgICAgICAgcnhEZXNjID0gKHRBbmlFYXBvbFJzbktleURlc2MgKikgZGF0YS0+a2V5RGVzYzsKKyAgICAgICAgaWYoIE5VTEwgPT0gcnhEZXNjKSAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0VmFsID0gQU5JX0VfTlVMTF9WQUxVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJ4RGVzYy0+a2V5RGF0YUxlbiA9PSAwIHx8IHJ4RGVzYy0+a2V5RGF0YSA9PSBOVUxMKSAKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiU3VwcDogQVAgc2VudCBubyBncm91cCBrZXkgaW4gZ3JvdXAgRUFQT0wtS2V5IG1lc3NhZ2UhXG4iICk7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfRV9JTExFR0FMX0FSRzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCByeERlc2MtPmluZm8ua2V5RGVzY1ZlcnMgPT0gQU5JX0VBUE9MX0tFWV9ERVNDX1ZFUlNfQUVTICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdyb3VwS2V5TGVuID0gcnhEZXNjLT5rZXlEYXRhTGVuIC0gQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRTsKKyAgICAgICAgICAgIGlmKCBncm91cEtleUxlbiA8PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAiU3VwcDogQVAgc2VudCBHVEsgdG9vIHNob3J0XG4iICk7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gQU5JX0VfSUxMRUdBTF9BUkc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiU3VwcDogQVAgc2VudCB1bnN1cHBvcnRlZCBrZXlEZXNjVmVyICVkIVxuIiwgcnhEZXNjLT5pbmZvLmtleURlc2NWZXJzICk7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfRV9JTExFR0FMX0FSRzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWx3YXlzIGNyZWF0ZSBhIG5ldyBFQVBPTCBmcmFtZQorCisgICAgICAgIGFuaUFzZlBhY2tldEVtcHR5RXhwbGljaXQoIGZzbS0+bGFzdEVhcG9sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQVBPTF9UWF9IRUFERVJfU0laRSApOworICAgICAgICAKKyAgICAgICAgdm9zX21lbV96ZXJvKCAmdHhEZXNjLCBzaXplb2YodHhEZXNjKSApOworCisgICAgICAgIC8vIFRoZSBLZXkgSW5mb3JtYXRpb24gYml0cy4uLgorICAgICAgICBpZiAoZnNtLT5zdXBwQ3R4LT5ncnBDaXBoZXJUeXBlID09IGVDU1JfRU5DUllQVF9UWVBFX0FFUykgCisgICAgICAgIHsKKyAgICAgICAgICAgIHR4RGVzYy5pbmZvLmtleURlc2NWZXJzID0gQU5JX0VBUE9MX0tFWV9ERVNDX1ZFUlNfQUVTOworICAgICAgICB9CisKKyAgICAgICAgdHhEZXNjLmluZm8udW5pY2FzdEZsYWcgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIHR4RGVzYy5pbmZvLmtleUlkID0gcnhEZXNjLT5pbmZvLmtleUlkOworICAgICAgICB0eERlc2MuaW5mby5taWNGbGFnID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIHR4RGVzYy5pbmZvLnNlY3VyZUZsYWcgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgdHhEZXNjLmtleUxlbiA9IFJTTl84MDIxMV9LRVlfTEVOOworCisgICAgICAgIC8vIFNlbmQgYmFjayB0aGUgc2FtZSByZXBsYXlDdHIgdGhhdCB0aGUgYXV0aGVudGljYXRvciBzZW50CisgICAgICAgIHZvc19tZW1fY29weSh0eERlc2MucmVwbGF5Q291bnRlciwgCisgICAgICAgICAgICAgICByeERlc2MtPnJlcGxheUNvdW50ZXIsIAorICAgICAgICAgICAgICAgc2l6ZW9mKHR4RGVzYy5yZXBsYXlDb3VudGVyKSk7CisKKyAgICAgICAgcmV0VmFsID0gYW5pRWFwb2xXcml0ZUtleShmc20tPmNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+bGFzdEVhcG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3VwcEN0eC0+YXV0aE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc20tPnN1cHBDdHgtPnN1cHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX0VBUE9MX0tFWV9ERVNDX1RZUEVfUlNOX05FVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHhEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3VwcEN0eC0+cHRrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTUl9BRVNfS0VZX0xFTik7CisgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwgKSApIGJyZWFrOyAgICAKKworICAgICAgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggYmFwUnNuU2VuZEVhcG9sRnJhbWUoIGZzbS0+Y3R4LT5wdm9zR0N0eCwgZnNtLT5sYXN0RWFwb2wgKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0VmFsID0gQU5JX0VSUk9SOworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiU3VwcCBjb3VsZCBub3Qgc2VuZCBlYXBvbC4gRGlzY29ubmVjdFxuIiApOworICAgICAgICAgICAgYnJlYWs7OyAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vRklYX1JTTiB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBHVEsgcmV0VmFsID0gc2V0R3RrKGZzbS0+c3VwcEN0eCwgcnhEZXNjLT5rZXlSZWN2U2VxQ291bnRlcik7CisKKyAgICAgICAgLy8gVGhpcyBpcyBuZXZlciByZXRyYW5zbWl0dGVkCisgICAgICAgIGFuaUFzZlBhY2tldEVtcHR5RXhwbGljaXQoIGZzbS0+bGFzdEVhcG9sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQVBPTF9UWF9IRUFERVJfU0laRSApOworCisgICAgICAgIGNoZWNrVHJhbnNpdGlvbihmc20sIE5VTEwpOyAvLyBVQ1QgcnVsZQorICAgIH13aGlsZSggMCApOworCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIGludAorZ290b1N0YXRlS2V5VXBkYXRlKHRTdXBwUnNuRnNtICpmc20sIHRTaXJNaWNGYWlsdXJlSW5mbyAqbWljRmFpbHVyZUluZm8pCit7CisgICAgLy93ZSBkb24ndCB1cGRhdGUga2V5cworICAgIGJhcFN1cHBEaXNjb25uZWN0KCBmc20tPmN0eCApOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworc3RhdGljIGludAorZ290b1N0YXRlUmVrZXlNc2codFN1cHBSc25Gc20gKmZzbSwgdFNpck1pY0ZhaWx1cmVJbmZvICptaWNGYWlsdXJlSW5mbykKK3sKKyAgICAvL1dlIGRvbid0IHN1cHBvcnQgcmVrZXksIHNpbXBseSBkaXNjb25uZWN0CisgICAgYmFwU3VwcERpc2Nvbm5lY3QoIGZzbS0+Y3R4ICk7CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCitzdGF0aWMgCitpbnQgemVyb091dFB0ayh0U3VwcFJzbkZzbSAqZnNtKQoreworICAgIHJldHVybiBBTklfT0s7Cit9CisKK3N0YXRpYworaW50IGRlcml2ZVB0ayh0U3VwcFJzbkZzbSAqZnNtLCB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqZGF0YSkKK3sKKyAgICB2X1UzMl90IHByZkxlbjsKKyAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyeERlc2M7CisKKyAgICBzd2l0Y2ggKGZzbS0+c3VwcEN0eC0+cHdDaXBoZXJUeXBlKSAKKyAgICB7CisgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM6CisgICAgICAgIHByZkxlbiA9IEFBR19SU05fUFRLX1BSRl9MRU5fQ0NNUDsKKyAgICAgICAgZnNtLT5zdXBwQ3R4LT5wd0tleUxlbiA9IEFBR19SU05fS0VZX01BVEVSSUFMX0xFTl9DQ01QOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIkNhbm5vdCBnZW5lcmF0ZSBQVEsgZm9yIEJQIGZvciBpbnZhbGlkIGFsZ29yaXRobSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmc20tPnN1cHBDdHgtPnB3Q2lwaGVyVHlwZSk7CisgICAgICAgIHJldHVybiBBTklfRV9JTExFR0FMX0FSRzsKKyAgICAgICAgYnJlYWs7CisgICAgfTsKKworICAgIHJ4RGVzYyA9ICh0QW5pRWFwb2xSc25LZXlEZXNjICopIGRhdGEtPmtleURlc2M7CisgICAgcmV0dXJuIGFhZ1B0a1ByZihmc20tPmNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgZnNtLT5zdXBwQ3R4LT5wdGssCisgICAgICAgICAgICAgICAgICAgICBwcmZMZW4sCisgICAgICAgICAgICAgICAgICAgICBmc20tPnN1cHBDdHgtPnBtaywKKyAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3VwcEN0eC0+YXV0aE1hYywKKyAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3VwcEN0eC0+c3VwcE1hYywKKyAgICAgICAgICAgICAgICAgICAgIHJ4RGVzYy0+a2V5Tm9uY2UsCisgICAgICAgICAgICAgICAgICAgICBmc20tPnNOb25jZSk7Cit9CisKK3N0YXRpYworaW50IGNoZWNrTWljKHRTdXBwUnNuRnNtICpmc20sIAorICAgICAgICAgICAgIHRBbmlFYXBvbEtleUF2YWlsRXZlbnREYXRhICpkYXRhLAorICAgICAgICAgICAgIHZfQk9PTF90IHB3S2V5RXhjaGFuZ2UpCit7CisgICAgaW50IHJldFZhbDsKKworICAgIHJldFZhbCA9IGFuaUVhcG9sS2V5Q2hlY2tNaWMoZnNtLT5jcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPmVhcG9sRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+a2V5RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbS0+c3VwcEN0eC0+cHRrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NSX0FFU19LRVlfTEVOKTsKKworICAgIHJldHVybiByZXRWYWw7Cit9CisKKworc3RhdGljIGludCBjaGVja0luZm9FbGVtZW50KHRTdXBwUnNuRnNtICpmc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGEgKmRhdGEpCit7CisgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyAqZGVzYzsKKyAgICB2X1U4X3QgKmllQXBCeXRlczsKKyAgICBpbnQgaWVBcExlbjsKKworICAgIGRlc2MgPSAodEFuaUVhcG9sUnNuS2V5RGVzYyAqKSBkYXRhLT5rZXlEZXNjOworICAgIGlmKCBOVUxMID09IGRlc2MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisgICAgfQorCisgICAgaWVBcExlbiA9IGFuaUFzZlBhY2tldEdldEJ5dGVzKGZzbS0+c3VwcEN0eC0+aWVBcCwgJmllQXBCeXRlcyk7CisgICAgaWYoIEFOSV9JU19TVEFUVVNfU1VDQ0VTUyggaWVBcExlbiApICkKKyAgICB7CisKKyAgICAgICAgaWYgKChkZXNjLT5rZXlEYXRhTGVuICE9IGllQXBMZW4pIHx8CisgICAgICAgICAgICAoIHZvc19tZW1fY29tcGFyZShkZXNjLT5rZXlEYXRhLCBpZUFwQnl0ZXMsIGllQXBMZW4pICkpIAorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiBTZW5kIGEgZmF1bHQgaGVyZQorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiU3VwcCBBUCBzZW50IGluY29uc2lzdGVudCBSU04gSUUhXG4iICk7CisgICAgICAgICAgICByZXR1cm4gQU5JX0VfRkFJTEVEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworc3RhdGljIAoraW50IGNoZWNrUGVlclJlcGxheUNvdW50ZXIodFN1cHBSc25Gc20gKmZzbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90ICpyZXRyYW5zbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgYWN0dWFsTWljRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IHJlVHhNaWNGbGFnKQoreworICAgIGludCByZXRWYWwgPSBBTklfT0s7CisgICAgaW50IGNtcDsKKyAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyeERlc2M7CisgICAgCisgICAgcnhEZXNjID0gZGF0YS0+a2V5RGVzYzsKKyAgICBpZiggTlVMTCA9PSByeERlc2MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisgICAgfQorCisgICAgKnJldHJhbnNtaXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgCisgICAgY21wID0gYW5pU3NtUmVwbGF5Q3RyQ21wKGZzbS0+cGVlclJlcGxheUN0ciwgcnhEZXNjLT5yZXBsYXlDb3VudGVyKTsKKyAgICAKKyAgICAvLyBUaGUgQVAgc2hvdWxkIHNlbmQgdXMgYSByZXBsYXkgY291bnRlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAvLyB0aGUgbGFzdCBvbmUgaXQgc2VudAorICAgIC8qVW5sZXNzIHdlIGFyZSBmb3JnaXZpbmcgd2l0aCB0aGlzIHdlIHdpbGwgaGF2ZSBpbnRlcm9wIGlzc3VlcyB3aXRoIHNvbWUgdmVuZHJvcyBsaWtlIENTUiovCisgICAgaWYgKGNtcCA+IDApIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIkJQIHJhZGlvICVkIGdvdCBvbGQgRUFQT0wgcmVwbGF5IGNvdW50ZXIgZnJvbSBBUFxuIiApOworICAgICAgICByZXRWYWwgPSBBTklfRV9SRVBMQVlfQ0hFQ0tfRkFJTEVEOworCisgICAgfSAKKyAgICBlbHNlIGlmIChjbXAgPD0gMCkgCisgICAgeworICAgICAgICBpZiAoIGFjdHVhbE1pY0ZsYWcgPT0gcmVUeE1pY0ZsYWcgKSAKKyAgICAgICAgeyAKKyAgICAgICAgICAgICpyZXRyYW5zbWl0ID0gZUFOSV9CT09MRUFOX1RSVUU7IAorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIAoraW50IGNoZWNrVHJhbnNpdGlvbih0U3VwcFJzbkZzbSAqZnNtLCB2b2lkICphcmcpCit7CisgICAgdEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGEgKmRhdGE7CisgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyAqcnhEZXNjOworICAgIHZfQk9PTF90IHJldHJhbnNtaXQ7CisgICAgaW50IHJldFZhbDsKKworICAgIGlmIChmc20tPmF1dGhSZXEpIAorICAgIHsKKyAgICAgICAgZ290b1N0YXRlQXV0aGVudGljYXRpb24oZnNtKTsKKyAgICAgICAgcmV0dXJuIEFOSV9PSzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZzbS0+Y3VycmVudFN0YXRlKSAKKyAgICB7CisgICAgY2FzZSBJTklUSUFMSVpFOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVVEhFTlRJQ0FUSU9OOgorICAgICAgICBnb3RvU3RhdGVHb3RQbWsoZnNtKTsKKyAgICAgICAgY2hlY2tUcmFuc2l0aW9uKGZzbSwgYXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHT1RfUE1LOgorICAgICAgICBpZiAoZnNtLT5lYXBvbEF2YWlsKSB7CisKKyAgICAgICAgICAgIGZzbS0+ZWFwb2xBdmFpbCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgIGRhdGEgPSAodEFuaUVhcG9sS2V5QXZhaWxFdmVudERhdGEgKikgYXJnOworICAgICAgICAgICAgcnhEZXNjID0gKHRBbmlFYXBvbFJzbktleURlc2MgKikgZGF0YS0+a2V5RGVzYzsKKworICAgICAgICAgICAgaWYgKHJ4RGVzYy0+aW5mby5hY2tGbGFnKSAKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGFuaVNzbVJlcGxheUN0clVwZGF0ZShmc20tPnBlZXJSZXBsYXlDdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4RGVzYy0+cmVwbGF5Q291bnRlcik7CisKKyAgICAgICAgICAgICAgICAvLyBHb2luZyBmcm9tIG9uZSBzdGF0ZSB0byBhbm90aGVyIGNhbm5vdCBiZSBhIHJldHJhbnNtaXQKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBnb3RvU3RhdGVTdGFLZXlTdGFydChmc20sIGRhdGEsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFNUQV9LRVlfU1RBUlQ6CisgICAgICAgIGlmIChmc20tPmVhcG9sQXZhaWwpIHsKKworICAgICAgICAgICAgZnNtLT5lYXBvbEF2YWlsID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgZGF0YSA9ICh0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqKSBhcmc7CisgICAgICAgICAgICByeERlc2MgPSAodEFuaUVhcG9sUnNuS2V5RGVzYyAqKSBkYXRhLT5rZXlEZXNjOworCisgICAgICAgICAgICBpZiAocnhEZXNjLT5pbmZvLmFja0ZsYWcpIHsKKworICAgICAgICAgICAgICAgIHJldFZhbCA9IGNoZWNrUGVlclJlcGxheUNvdW50ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBmc20sIAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAmcmV0cmFuc21pdCwgCisgICAgICAgICAgICAgICAgICAgICAgICByeERlc2MtPmluZm8ubWljRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgLy8gTUlDIG5vdCBzZXQgbWVhbnMgY2hlY2sgZm9yIHJlLVR4IE0xLgorICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU5JX09LOyAvLyBDYWxsZXIgc2hvdWxkIG5vdCBmYWlsCisKKyAgICAgICAgICAgICAgICBpZiAocmV0cmFuc21pdCkgeworCisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNlbmRpbmcgRUFQT0wtS2V5IE1zZzIgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cHBsaWNhbnQgcmFkaW8gJWQgdG8gQVBcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZ290b1N0YXRlU3RhS2V5U3RhcnQoZnNtLCBkYXRhLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBjaGVja01pYyhmc20sIGRhdGEsIHJ4RGVzYy0+aW5mby51bmljYXN0RmxhZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFwU3VwcERpc2Nvbm5lY3QoIGZzbS0+Y3R4ICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYW5pU3NtUmVwbGF5Q3RyVXBkYXRlKGZzbS0+cGVlclJlcGxheUN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4RGVzYy0+cmVwbGF5Q291bnRlcik7CisKKyAgICAgICAgICAgICAgICAgICAgZ290b1N0YXRlU3RhS2V5U2V0KGZzbSwgZGF0YSwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFNUQV9LRVlfU0VUOgorICAgICAgICBpZiAoZnNtLT5lYXBvbEF2YWlsKSAKKyAgICAgICAgeworICAgICAgICAgICAgZnNtLT5lYXBvbEF2YWlsID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgZGF0YSA9ICh0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSAqKSBhcmc7CisgICAgICAgICAgICByeERlc2MgPSAodEFuaUVhcG9sUnNuS2V5RGVzYyAqKSBkYXRhLT5rZXlEZXNjOworCisgICAgICAgICAgICByZXRWYWwgPSBjaGVja1BlZXJSZXBsYXlDb3VudGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgZnNtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgJnJldHJhbnNtaXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgcnhEZXNjLT5pbmZvLm1pY0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAxKTsgIC8vIE1JQyBzZXQgbWVhbnMgY2hlY2sgZm9yIHJlLVR4IE0zLgorICAgICAgICAgICAgaWYgKHJldFZhbCAhPSBBTklfT0spCisgICAgICAgICAgICAgICAgcmV0dXJuIEFOSV9PSzsgLy8gQ2FsbGVyIHNob3VsZCBub3QgZmFpbAorCisgICAgICAgICAgICBpZiAoIXJldHJhbnNtaXQpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IGNoZWNrTWljKGZzbSwgZGF0YSwgcnhEZXNjLT5pbmZvLnVuaWNhc3RGbGFnKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0VmFsICE9IEFOSV9PSykgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiYXBTdXBwRGlzY29ubmVjdCggZnNtLT5jdHggKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYW5pU3NtUmVwbGF5Q3RyVXBkYXRlKGZzbS0+cGVlclJlcGxheUN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnhEZXNjLT5yZXBsYXlDb3VudGVyKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocnhEZXNjLT5pbmZvLnVuaWNhc3RGbGFnKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgKiBIYW5kbGUgcGFpcndpc2Uga2V5IG1lc3NhZ2UuLi5pbiB0aGlzIHN0YXRlCisgICAgICAgICAgICAgICAgICogcGFpcndpc2Uga2V5IG1lc3NhZ2VzIGNhbiBvbmx5IGJlIGZvciByZXRyYW5zbWlzc2lvbnMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHJldHJhbnNtaXQpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2VuZGluZyBFQVBPTC1LZXkgTXNnNCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcGxpY2FudCBcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZ290b1N0YXRlU3RhS2V5U2V0KGZzbSwgZGF0YSwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBIYW5kbGUgZ3JvdXAga2V5IG1lc3NhZ2UuLi53aXRoIGdyb3VwIGtleSBtZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgKiB0aGUgcmVwbGF5IGNvdW50ZXIgaGFzIHRvIGNoYW5nZSBvbgorICAgICAgICAgICAgICAgICAqIHJldHJhbnNtaXNzaW9ucy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIXJldHJhbnNtaXQpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZ290b1N0YXRlR3JvdXBLZXlTZXQoZnNtLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFwU3VwcERpc2Nvbm5lY3QoIGZzbS0+Y3R4ICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoZnNtLT5pbnRlZ0ZhaWxlZCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290b1N0YXRlS2V5VXBkYXRlKGZzbSwgYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdST1VQX0tFWV9TRVQ6CisgICAgICAgIGdvdG9TdGF0ZVN0YUtleVNldChmc20sIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZX1VQREFURToKKyAgICAgICAgZ290b1N0YXRlUmVrZXlNc2coZnNtLCBhcmcpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJJbGxlZ2FsIHN0YXRlIGZvciBTdXBwUnNuRnNtOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZnNtLT5jdXJyZW50U3RhdGUpOworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisgICAgfQorCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworCisKK3N0YXRpYyBpbnQKK3N1cHBFYXBvbEtleUhhbmRsZXIoIHRTdXBwUnNuRnNtICpmc20sCisgICAgICAgICAgICAgICAgICAgIHRBbmlQYWNrZXQgKmVhcG9sRnJhbWUsIAorICAgICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBzdXBwTWFjKQoreworICAgIGludCByZXRWYWw7CisgICAgCisgICAgaW50IGRlc2NUeXBlOworICAgIHZvaWQgKmtleURlc2M7CisgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyAqcnNuRGVzYzsKKyAgICB0QW5pRWFwb2xLZXlBdmFpbEV2ZW50RGF0YSBkYXRhOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHJldFZhbCA9IGFuaUVhcG9sUGFyc2VLZXkoZWFwb2xGcmFtZSwgJmRlc2NUeXBlLCAma2V5RGVzYyk7CisgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzY1R5cGUgPT0gQU5JX0VBUE9MX0tFWV9ERVNDX1RZUEVfUlNOX05FVykgCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbkRlc2MgPSAodEFuaUVhcG9sUnNuS2V5RGVzYyAqKSBrZXlEZXNjOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFBhc3Mgb24gdGhlIGV2ZW50IHRvIHRoZSBSU04gRlNNIGlycmVzcGVjdGl2ZSBpZiBpdCBpcworICAgICAgICAgICAgICogcGFpcndpc2Ugb3Igbm90LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkYXRhLmtleURlc2MgPSBrZXlEZXNjOworICAgICAgICAgICAgZGF0YS5lYXBvbEZyYW1lID0gZWFwb2xGcmFtZTsKKyAgICAgICAgICAgIHJldFZhbCA9IHN1cHBSc25Gc21Qcm9jZXNzRXZlbnQoZnNtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOX0ZTTV9FQVBPTF9GUkFNRV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIlN1cHA6IEdvdCB1bmV4cGVjdGVkIDgwMi4xeCBSQzQgS2V5IG1lc3NhZ2UgXG4iICk7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfRV9GQUlMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH13aGlsZSggMCApOworCisgICAgYW5pRWFwb2xLZXlGcmVlRGVzYyhkZXNjVHlwZSwga2V5RGVzYyk7CisgICAgcmV0dXJuIHJldFZhbDsKK30KKworCisKKy8vCisvL1RoaXMgZnVuY3Rpb24gYWx3YXN5IGFzc3VtZSB0aGUgaW5jb21pbmcgdm9zX3BhY2tldCBpcyA4MDJfMyBmcmFtZS4KK3N0YXRpYyBpbnQgc3VwcFJzblJ4RnJhbWVIYW5kbGVyKCB2X1BWT0lEX3QgcHZvc0dDdHgsIHZvc19wa3RfdCAqcFBhY2tldCApCit7CisgICAgaW50IHJldFZhbCA9IEFOSV9FUlJPUjsKKyAgICB0QW5pUGFja2V0ICpwQW5pUGFja2V0OworICAgIHRCdGFtcENvbnRleHQgKmN0eDsKKyAgICB0U3VwcFJzbkZzbSAqZnNtOworICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoKHB2b3NHQ3R4ID09IE5VTEwpIHx8IChOVUxMID09IHBQYWNrZXQpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgInBhcmFtIGlzIE5VTEwgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorICAgIGN0eCA9ICh0QnRhbXBDb250ZXh0ICopVk9TX0dFVF9CQVBfQ0IoIHB2b3NHQ3R4ICk7CisgICAgaWYgKE5VTEwgPT0gY3R4KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJjdHggaXMgTlVMTCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICBmc20gPSAmY3R4LT51RnNtLnN1cHBGc207CisgICAgaWYgKE5VTEwgPT0gZnNtKSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJmc20gaXMgTlVMTCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLy9Ub0RPOiBXZSBuZWVkIHRvIHN5bmNocm9uaXplIHRoaXMuIEZvciBub3csIHVzZSB0aGUgc2ltcGxlc3QgZm9ybSwgZHJvcCB0aGUgcGFja2V0IGNvbWVzIGxhdGVyLgorICAgICAgICBpZiggZnNtLT5mUmVjZWl2aW5nICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIgKioqKioqc3VwcFJzblJ4RnJhbWVIYW5kbGVyIHJlY2VpdmUgZWFwb2wgcGFja2V0IHdoaWxlIHByb2Nlc3NpbmcuIERyb3AgdGhlIG5ldyBjb21lclxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZnNtLT5mUmVjZWl2aW5nID0gVk9TX1RSVUU7CisgICAgICAgIHJldFZhbCA9IGJhcFJzbkZvcm1Qa3RGcm9tVm9zUGt0KCAmcEFuaVBhY2tldCwgcFBhY2tldCApOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKyAgICAgICAgLy9Ob3cgd2UgY2FuIHByb2Nlc3MgdGhlIGVhcG9sIGZyYW1lCisgICAgICAgIC8vaGFuZGxlciB3aWxsIGZyZWUgdGhlIHBBbmlQYWNrZXQKKyAgICAgICAgYmFwUnNuRWFwb2xIYW5kbGVyKCBmc20sIHBBbmlQYWNrZXQsIFZPU19GQUxTRSApOworICAgIH13aGlsZSggMCApOworCisgICAgZnNtLT5mUmVjZWl2aW5nID0gVk9TX0ZBTFNFOworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOworCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworCitzdGF0aWMgaW50IHN1cHBSc25UeENvbXBsZXRlSGFuZGxlciggdl9QVk9JRF90IHB2b3NHQ3R4LCB2b3NfcGt0X3QgKnBQYWNrZXQsIFZPU19TVEFUVVMgcmV0U3RhdHVzICkKK3sKKyAgICB0QnRhbXBDb250ZXh0ICpjdHggPSAodEJ0YW1wQ29udGV4dCAqKVZPU19HRVRfQkFQX0NCKCBwdm9zR0N0eCApOworICAgIHRBdXRoUnNuRnNtICpmc207CisKKyAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBQYWNrZXQgKTsKKyAgICBpZiAocHZvc0dDdHggPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJwYXJhbSBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gQU5JX0VSUk9SOworICAgIH0KKworICAgIGlmIChOVUxMID09IGN0eCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiY3R4IGlzIE5VTEwgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybiBBTklfRVJST1I7CisgICAgfQorCisgICAgZnNtID0gJmN0eC0+dUZzbS5hdXRoRnNtOworICAgIGlmIChOVUxMID09IGZzbSkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiZnNtIGlzIE5VTEwgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybiBBTklfRVJST1I7CisgICAgfQorCisgICAgLy9TeW5jaHJvbml6YXRpb24gbmVlZGVkCisgICAgCisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggcmV0U3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgLy9UaGlzIGlzIGJhZC4KKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIlN1cHA6IFRMIFR4IGNvbXBsZXRlIHdpdGggZXJyb3IgJWQgY3VycmVudCBzdGF0ZSBpcyAlZFxuIiwgcmV0U3RhdHVzLCBmc20tPmN1cnJlbnRTdGF0ZSApOworICAgICAgICBpZiggZnNtLT5udW1UcmllcyA8PSBzdXBwQ29uc3RzLm1heFRyaWVzICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9yZXRyYW5zbWl0CisgICAgICAgICAgICBmc20tPm51bVRyaWVzKys7CisgICAgICAgICAgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggYmFwUnNuU2VuZEVhcG9sRnJhbWUoIGZzbS0+Y3R4LT5wdm9zR0N0eCwgZnNtLT5sYXN0RWFwb2wgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXBTdXBwRGlzY29ubmVjdCggZnNtLT5jdHgtPnB2b3NHQ3R4ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiYXBTdXBwRGlzY29ubmVjdCggZnNtLT5jdHgtPnB2b3NHQ3R4ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCisKKy8qKgorICogc3VwcEVhcG9sSGFuZGxlcgorICoKKyAqIEhhbmRsZXMgYW4gaW5jb21pbmcgRUFQT0wgZnJhbWUgb24gdGhlIHN1cHBsaWNhbnQgc2lkZS4KKyAqCisgKiBAcGFyYW0gZWFwb2xGcmFtZSB0aGUgcGFja2V0IGNvbnRhaW5pbmcgdGhlIEVBUE9MIGZyYW1lLCB3aXRoIHRoZQorICogaGVhZCBvZiB0aGUgcGFja2V0IHN0aWxsIGF0IHRoZSBzdGFydCBvZiB0aGUgRUFQT0wgZnJhbWUKKyAqIEBwYXJhbSBkc3RNYWMgdGhlIGRzdE1hYyBwb2ludGluZyBpbnNpZGUgdGhlIGZyYW1lCisgKiBAcGFyYW0gc3JjTWFjIHRoZSBzcmNNYWMgcG9pbnRpbmcgaW5zaWRlIHRoZSBmcmFtZQorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgcG9pbnRpbmcgaW5zaWRlIHRoZSBmcmFtZSBhdCB0aGUgdHlwZSBmaWVsZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLwordm9pZCBzdXBwRWFwb2xIYW5kbGVyKCB0U3VwcFJzbkZzbSAqZnNtLCB0QW5pUGFja2V0ICplYXBvbEZyYW1lLAorICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBkc3RNYWMsIAorICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBzcmNNYWMsCisgICAgICAgICAgICAgICAgIHZfVThfdCAqdHlwZSApCit7CisgICAgc3dpdGNoICgqdHlwZSkgCisgICAgeworICAgIGNhc2UgQU5JX0VBUE9MX1RZUEVfUEFDS0VUOgorICAgICAgICAvLyBJZ25vcmUgRUFQIGJlY2FzdWUgaXQgaXMgb25seSBXUEEyLVBTSworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFOSV9FQVBPTF9UWVBFX0tFWToKKyAgICAgICAgc3VwcEVhcG9sS2V5SGFuZGxlciggZnNtLCBlYXBvbEZyYW1lLCBkc3RNYWMgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTklfRUFQT0xfVFlQRV9BU0ZfQUxFUlQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIlN1cHA6IEVBUE9MIHR5cGUgbm90IGltcGxlbWVudGVkOiAlLjJ4XG4iLCAqdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBSc244MDIxeFN1cHBSc25Gc20uaCBiL0NPUkUvQkFQL3NyYy9iYXBSc244MDIxeFN1cHBSc25Gc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzQ2YTg0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcFJzbjgwMjF4U3VwcFJzbkZzbS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogV29vZHNpZGUgTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICRGaWxlOiAvL2RlcG90L3NvZnR3YXJlL3Byb2plY3RzL2ZlYXR1cmVfYnJhbmNoZXMvZ2VuNV9waGFzZTEvb3MvbGludXgvY2xhc3NpYy9hcC9hcHBzL3NzbS9hdXRoODAyMXgvYW5pODAyMXhTdXBwUnNuRnNtLmggJAorICoKKyAqIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBmb3IgdGhlIFJTTiBFQVBPTC1LZXkgRlNNIG9uIHRoZQorICogc3VwcGxpY2FudCBzaWRlLiBUaGlzIGlzIGJhc2VkIG9uIDgwMi4xMWkuCisgKgorICogQXV0aG9yOiAgICAgIE1heWFuayBELiBVcGFkaHlheQorICogRGF0ZTogICAgICAgIDE5LURlY2VtYmVyLTIwMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgIE1vZGlmaWVkIGJ5ICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2lmbmRlZiBfX0FBR19TVVBQX1JTTl9GU01fSAorI2RlZmluZSBfX0FBR19TVVBQX1JTTl9GU01fSAorCisjaW5jbHVkZSAiYmFwUnNuODAyMXhGc20uaCIKKyNpbmNsdWRlICJiYXBJbnRlcm5hbC5oIgorCisvKioKKyAqIHN1cHBSc25Gc21Jbml0CisgKgorICogRlVOQ1RJT046CisgKiBJbml0aWFsaXplcyB0aGUgY29uc3RhbnRzIGFuZCB0aGUgY2FsbGJhY2tzIG5lZWRlZCBieSB0aGlzIEZTTQorICogbW9kdWxlLgorICoKKyAqIEBwYXJhbSBjYiBjYWxsYmFja3MgdG8gdGhlIHZhcmlvdXMgcHJvY2VkdXJlcyBuZWVkZWQgYnkgdGhpcyBGU00KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorc3VwcFJzbkZzbUluaXQodm9pZCk7CisKK2ludAorc3VwcFJzbkZzbVNldFBtayh0U3VwcENvbnRleHQgKmN0eCwgdl9VOF90ICpwbWspOworCisjZW5kaWYgLy9fX0FBR19TVVBQX1JTTl9GU01fSApkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcFJzbkFzZlBhY2tldC5jIGIvQ09SRS9CQVAvc3JjL2JhcFJzbkFzZlBhY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTkyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYmFwUnNuQXNmUGFja2V0LmMKQEAgLTAsMCArMSwxMDE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFdvb2RzaWRlIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBGaWxlOiAkRmlsZTogLy9kZXBvdC9zb2Z0d2FyZS9wcm9qZWN0cy9mZWF0dXJlX2JyYW5jaGVzL25vdmFfcGhhc2UxL2FwL2FwcHMvYXNmL2FuaUFzZlBhY2tldC5jICQKKyAqIENvbnRhaW5zIGRlZmluaXRpb25zIGZvciBwYWNrZXQgbWFuaXB1bGF0aW9uIHJvdXRpbmVzIHRoYXQgbWFrZSBpdAorICogZWFzeSB0byBjcmVhdGUgYW5kIHBhcnNlIG11bHRpLWxheWVyZWQgbmV0d29yayBmcmFtZXMuIFRoaXMgbW9kdWxlCisgKiBtaW5pbWl6ZXMgYnVmZmVyIGNvcGllcyB3aGlsZSBhZGRpbmcgb3IgcmVtb3ZpbmcgaGVhZGVycywgYW5kCisgKiBhZGRpbmcgb3IgcmVtb3ZpbmcgcGF5bG9hZC4KKyAqCisgKiBBdXRob3I6ICAgICAgTWF5YW5rIEQuIFVwYWRoeWF5CisgKiBEYXRlOiAgICAgICAgMTktSnVuZS0yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICBNb2RpZmllZCBieSAgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKyNpbmNsdWRlIDxiYXBSc25Bc2ZQYWNrZXQuaD4KKyNpbmNsdWRlIDxiYXBSc25FcnJvcnMuaD4KKyNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCisjaW5jbHVkZSAidm9zX3BhY2tldC5oIgorCisvKgorICogQWxsb2NhdGUgb25lIG1vcmUgdGhhbiByZXF1aXJlZCBiZWNhdXNlIHRoZSBsYXN0IGJ5dGVzIGlzIHdhc3RlLiBXZQorICogd2FzdGUgdGhlIGxhc3QgYnl0ZSBiZWNhdXNlIGluIHRoZSBhZG9wdGVkIG1vZGVsLCB0aGUgdGFpbCBhbHdheXMKKyAqIHBvaW50cyB0byB0aGUgbmV4dCBsb2NhdGlvbiB3aGVyZSBkYXRhIHNob3VsZCBiZSBzdG9yZWQuIEluIGEgZnVsbAorICogYnVmZmVyIHdlIGRvbid0IHdhbnQgdG8gcG9zaXRpb24gdGhlIHRhaWwgdG8gbWVtb3J5IHdlIGhhdmVuJ3QKKyAqIGFsbG9jYXRlZCBvdXJzZWxmLgorICovCisjZGVmaW5lIEFOSV9JTlRFUk5BTF9ERUZBVUxUX1BBQ0tFVF9TSVpFIChBTklfREVGQVVMVF9QQUNLRVRfU0laRSArIDQpCisKKyNkZWZpbmUgVEFJTF9TUEFDRShwYWNrZXQpIFwKKyAgICAoKHBhY2tldCktPmJ1ZiArIChwYWNrZXQpLT5zaXplIC0gKHBhY2tldCktPnRhaWwpCisKKyNkZWZpbmUgSEVBRF9TUEFDRShwYWNrZXQpIFwKKyAgICAgKChwYWNrZXQpLT5oZWFkIC0gKHBhY2tldCktPmJ1ZikKKworI2RlZmluZSBBTklfQ0hFQ0tfUkFOR0UoeCAsIHVwcGVyKSBcCisgICAgICAgICAgICAgICAgKCAoeCkgPD0gKHVwcGVyKSApCisKKy8qKgorICogT3BhcXVlIHBhY2tldCBzdHJ1Y3R1cmUgd2l0aCBpbnRlcm5hbCBzdG9yYWdlIGZvciByYXcgYnl0ZXMuCisgKiBDb25jZXB0dWFsbHksIGEgdEFuaVBhY2tldCBpcyBhIHByZS1hbGxvY2F0ZWQgYnVmZmVyIHRoYXQgY29udGFpbnMKKyAqIGRhdGEgaW4gdGhlIG1pZGRsZSBhbmQgZnJlZSBzcGFjZSBvbiBlaXRoZXIgc2lkZS4gVGhlIHN0YXJ0IG9mIHRoZQorICogZGF0YSBpcyBjYWxsZWQgdGhlIGhlYWQuIFJvdXRpbmVzIGFyZSBwcm92aWRlZCB0byBhZGQgZGF0YSBhdCB0aGUKKyAqIGZyb250IG9yIGF0IHRoZSByZWFyLiBUaGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgaXMgdGhlIHRvdGFsIG51bWJlcgorICogb2YgdmFsaWQgZGF0YSBieXRlcyBjb250YWluZWQgaW4gaXQuIFRoZSBzaXplIG9mIHRoZSBwYWNrZXQgaXMgdGhlCisgKiB0b3RhbCBudW1iZXIgb2YgcHJlYWxsb2NhdGVkIGJ5dGVzLgorICovCitzdHJ1Y3QgdEFuaVBhY2tldCB7CisgICAgdl9VOF90ICpidWY7CisgICAgdl9VMzJfdCBzaXplOworICAgIHZfVThfdCAqaGVhZDsKKyAgICB2X1U4X3QgKnRhaWw7CisgICAgdl9VOF90ICpyZWNvcmRIZWFkZXI7CisgICAgdl9VMzJfdCBsZW47Cit9OworCisvKioKKyAqIGFuaUFzZlBhY2tldEFsbG9jYXRlCisgKgorICogRlVOQ1RJT046CisgKiBDcmVhdGUgYSBwYWNrZXQgb2Ygc2l6ZSAyKkFOSV9ERUZBVUxUX1BBQ0tFVF9TSVpFIGFuZCBwb3NpdGlvbnMgdGhlCisgKiBoZWFkIG9mIHRoZSBwYWNrZXQgaW4gdGhlIGNlbnRlci4gVGhlIGFsbG9jYXRlZCBzdG9yYWdlIGNhbiBiZSBmcmVlCisgKiB3aXRoIGEgY2FsbCB0byBhbmlBc2ZQYWNrZXRGcmVlLgorICoKKyAqIExPR0lDOgorICogQWxsb2NhdGVzIHN0b3JhZ2UgZm9yIHRBbmlQYWNrZXQgYW5kIGl0cyBpbnRlcm5hbCByYXcgZGF0YQorICogYnVmZmVyLiBQb3NpdGlvbnMgdGhlIGhlYWQgYW5kIHRhaWwgcG9pbnRlcnMgaW4gdGhlIG1pZGRsZSBvZiB0aGUKKyAqIHJhdyBkYXRhIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcGFja2V0UHRyIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byBuZXdseSBhbGxvY2F0ZWQKKyAqIHRBbmlQYWNrZXQgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcy4KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzOyBBTklfRV9NQUxMT0NfRkFJTEVEIGlmCisgKiBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZC4KKyAqIEBzZWUgYW5pQXNmUGFja2V0RnJlZQorICovCitpbnQKK2FuaUFzZlBhY2tldEFsbG9jYXRlKHRBbmlQYWNrZXQgKipwYWNrZXRQdHIpCit7CisgIHJldHVybiBhbmlBc2ZQYWNrZXRBbGxvY2F0ZUV4cGxpY2l0KHBhY2tldFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX0lOVEVSTkFMX0RFRkFVTFRfUEFDS0VUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9JTlRFUk5BTF9ERUZBVUxUX1BBQ0tFVF9TSVpFLzIpOworfQorCisvKioKKyAqIGFuaUFzZlBhY2tldEFsbG9jYXRlRXhwbGljaXQKKyAqCisgKiBGVU5DVElPTjoKKyAqIENyZWF0ZSBhIHBhY2tldCBvZiB0aGUgZGVzaXJlZCBzaXplIGFuZCBwb3NpdGlvbiB0aGUgaGVhZCBvZiB0aGUKKyAqIHBhY2tldCBhdCB0aGUgZGVzaXJlZCBvZmZzZXQgaW4gdGhlIGludGVybmFsIHJhdyBkYXRhIGJ1ZmZlci4gQW4KKyAqIGFwcGxpY2F0aW9uIHdvdWxkIG5vcm1hbGx5IHNldCB0aGlzIG9mZnNldCB0byB0aGUgZXhwZWN0ZWQgbGVuZ3RoCisgKiBvZiB0aGUgcHJvdG9jb2wgaGVhZGVyLCB0aGVuIGFwcGVuZCB0aGUgcGF5bG9hZCwgYW5kIGZpbmFsbHksCisgKiBwcmVwZW5kIHRoZSBoZWFkZXIuIFRoZSBhbGxvY2F0ZWQgc3RvcmFnZSBjYW4gYmUgZnJlZSB3aXRoIGEgY2FsbAorICogdG8gYW5pQXNmUGFja2V0RnJlZS4KKyAqCisgKiBMT0dJQzoKKyAqIEFsbG9jYXRlcyBzdG9yYWdlIGZvciB0QW5pUGFja2V0IGFuZCBpdHMgaW50ZXJuYWwgcmF3IGRhdGEKKyAqIGJ1ZmZlci4gUG9zaXRpb25zIHRoZSBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzIGF0IHRoZSBnaXZlbiBvZmZzZXQgaW4KKyAqIHRoZSBpbnRlcm5hbCByYXcgZGF0YSBidWZmZXIuCisgKgorICogQHBhcmFtIHBhY2tldFB0ciBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gbmV3bHkgYWxsb2NhdGVkCisgKiB0QW5pUGFja2V0IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMuCisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgcmF3IGRhdGEgYnVmZmVyCisgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIGludGVybmFsIHJhdyBkYXRhIGJ1ZmZlciB3aGVyZSB0aGUKKyAqIGhlYWQgb2YgdGhlIHBhY2tldCB3aWxsIGJlIHBvc2l0aW9uZWQgaW5pdGlhbGx5CisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkczsgQU5JX0VfTUFMTE9DX0ZBSUxFRCBpZgorICogbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgKiBAc2VlIGFuaUFzZlBhY2tldEZyZWUKKyAqLworaW50CithbmlBc2ZQYWNrZXRBbGxvY2F0ZUV4cGxpY2l0KHRBbmlQYWNrZXQgKipwYWNrZXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBvZmZzZXQpCit7CisgIHRBbmlQYWNrZXQgKnBhY2tldCA9IE5VTEw7CisgIHZfVTMyX3QgbWF4SGVhZCA9IHNpemU7CisKKyAgKnBhY2tldFB0ciA9IE5VTEw7CisgIGlmIChzaXplID09IDApCisgICAgcmV0dXJuIEFOSV9FX0lMTEVHQUxfQVJHOworCisgIFZPU19BU1NFUlQoQU5JX0NIRUNLX1JBTkdFKG9mZnNldCwgbWF4SGVhZCkpOworICBpZiAoIUFOSV9DSEVDS19SQU5HRShvZmZzZXQsIG1heEhlYWQpKQorICAgIHJldHVybiBBTklfRV9JTExFR0FMX0FSRzsKKworICBwYWNrZXQgPSAodEFuaVBhY2tldCAqKSB2b3NfbWVtX21hbGxvYyggc2l6ZW9mKHRBbmlQYWNrZXQpICk7CisKKyAgaWYgKHBhY2tldCA9PSBOVUxMKSAKKyAgeworICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgcmV0dXJuIEFOSV9FX01BTExPQ19GQUlMRUQ7CisgIH0KKworICAvLyB0cmFuc3BhcmVudGx5IGFkZCBvbmUgdG8gdGhlIHNpemUgc2luY2UgbGFzdCBieXRlIGlzIHdhc3RlZAorICBzaXplID0gKHNpemUgKyA0KSAmIDB4ZmZmZmZmZmM7CisKKyAgcGFja2V0LT5idWYgPSAodl9VOF90ICopdm9zX21lbV9tYWxsb2MoIHNpemVvZih2X1U4X3QpICogc2l6ZSApOworICBpZiAocGFja2V0LT5idWYgPT0gTlVMTCkgCisgIHsKKyAgICAgIHZvc19tZW1fZnJlZSggcGFja2V0ICk7CisgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICByZXR1cm4gQU5JX0VfTUFMTE9DX0ZBSUxFRDsKKyAgfQorCisgIHBhY2tldC0+c2l6ZSA9IHNpemU7IC8vIFNob3VsZCBub3QgYmUgdmlzaWJsZSB0byB0aGUgdXNlcgorICBwYWNrZXQtPmhlYWQgPSBwYWNrZXQtPmJ1ZiArIG9mZnNldDsKKyAgcGFja2V0LT50YWlsID0gcGFja2V0LT5oZWFkOworICBwYWNrZXQtPmxlbiA9IDA7CisKKyAgKnBhY2tldFB0ciA9IHBhY2tldDsKKyAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXREdXBsaWNhdGUKKyAqCisgKiBEdXBsaWNhdGVzIGEgZ2l2ZW4gcGFja2V0IGV4YWN0bHkuIFRoYXQgaXMsIHRoZSBjb250ZW50cywgdGhlIHNpemUKKyAqIG9mIHRoZSBwYWNrZXQsIGFuZCB0aGUgcG9zaXRpb25zIG9mIHRoZSBwb2ludGVycyBhcmUgbWFpbnRhaW5lZCBpbgorICogdGhlIG5ldyBjb3B5LgorICoKKyAqIEBwYXJhbSBuZXdQYWNrZXRQdHIgaXMgc2V0IHRvIGEgbmV3bHkgYWxsb2NhdGVkIHBhY2tldCB0aGF0IGlzIGEKKyAqIGR1cGxpY2F0ZSBvZiBvbGRQYWNrZXQKKyAqIEBwYXJhbSBvbGRQYWNrZXQgdGhlIG9yaWdpbmFsIHBhY2tldCB0aGF0IHNob3VsZCBiZSBkdXBsaWNhdGVkCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkczsgQU5JX0VfTlVMTCBpZiBvbGRQYWNrZXQKKyAqIGlzIE5VTEw7IAorICovCitpbnQKK2FuaUFzZlBhY2tldER1cGxpY2F0ZSh0QW5pUGFja2V0ICoqbmV3UGFja2V0UHRyLCB0QW5pUGFja2V0ICpvbGRQYWNrZXQpCit7CisgICAgaW50IHJldFZhbDsKKyAgICBpbnQgcmVjb3JkUG9zOworICAgIHRBbmlQYWNrZXQgKnBhY2tldCA9IE5VTEw7CisKKyAgICBpZiAob2xkUGFja2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0QWxsb2NhdGVFeHBsaWNpdCgmcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFja2V0LT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFja2V0LT5oZWFkIC0gb2xkUGFja2V0LT5idWYpOworICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKQorICAgICAgICByZXR1cm4gcmV0VmFsOworCisgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0QXBwZW5kQnVmZmVyKHBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFja2V0LT5oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRQYWNrZXQtPmxlbik7CisgICAgaWYgKHJldFZhbCAhPSBBTklfT0spIAorICAgIHsKKyAgICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgICBhbmlBc2ZQYWNrZXRGcmVlKHBhY2tldCk7CisgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisgICAgfQorCisgICAgaWYgKG9sZFBhY2tldC0+cmVjb3JkSGVhZGVyICE9IE5VTEwpIAorICAgIHsKKyAgICAgICAgcmVjb3JkUG9zID0gb2xkUGFja2V0LT5yZWNvcmRIZWFkZXIgLSBvbGRQYWNrZXQtPmJ1ZjsKKyAgICAgICAgcGFja2V0LT5yZWNvcmRIZWFkZXIgPSBwYWNrZXQtPmJ1ZiArIHJlY29yZFBvczsKKyAgICB9CisgICAgKm5ld1BhY2tldFB0ciA9IHBhY2tldDsKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKKy8qKgorICogYW5pQXNmUGFja2V0RnJlZQorICoKKyAqIEZVTkNUSU9OOgorICogRnJlZSBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIHRBbmlQYWNrZXQgYW5kIGl0cyBpbnRlcm5hbCByYXcgZGF0YQorICogYnVmZmVyLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byBmcmVlCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkczsgQU5JX0VfTlVMTF9WQUxVRSBpZiBhbgorICogdW5leHBlY3RlZCBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQKKyAqLworaW50CithbmlBc2ZQYWNrZXRGcmVlKHRBbmlQYWNrZXQgKnBhY2tldCkKK3sKKyAgaWYgKHBhY2tldCA9PSBOVUxMKQorICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgIGlmIChwYWNrZXQtPmJ1ZiAhPSBOVUxMKQorICAgIHZvc19tZW1fZnJlZSggcGFja2V0LT5idWYgKTsKKworICB2b3NfbWVtX2ZyZWUoIHBhY2tldCApOworCisgIHJldHVybiBBTklfT0s7Cit9CisKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIKKyAqCisgKiBGVU5DVElPTjoKKyAqIEFwcGVuZHMgdGhlIGRhdGEgY29udGFpbmVkIGluIGJ1ZiB0byB0aGUgZW5kIG9mIHRoZSBkYXRhIGluCisgKiBkZXN0QW5pUGFja2V0LiBUaGUgaGVhZCBvZiBkZXN0QW5pUGFja2V0IHJlbWFpbnMgdW5jaGFuZ2VkLCB3aGlsZSBpdHMKKyAqIGxlbmd0aCBpbmNyZWFzZXMgYnkgbGVuLgorICoKKyAqIElmIHRoZXJlIGlzbid0IGVub3VnaCBmcmVlIHNwYWNlIGluIGRlc3RBbmlQYWNrZXQgZm9yIGFsbCBsZW4gYnl0ZXMKKyAqIHRoZW4gdGhlIHJvdXRpbmUgZmFpbHMgYW5kIHRoZSBsZW5ndGggb2YgZGVzdEFuaVBhY2tldCByZW1haW5zCisgKiB1bmNoYW5nZWQuCisgKgorICogTE9HSUM6CisgKiBDaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBmcmVlIHNwYWNlIGluIHRoZSBwYWNrZXQgdG8gYXBwZW5kIHRoZQorICogYnVmZmVyLiBJZiBub3QsIGJhaWwuIE90aGVyd2lzZSwgY29weSBieXRlcyBmcm9tIHRoZSBidWZmZXIgaW50bworICogdGhlIHBhY2tldCdzIGludGVybmFsIHJhdyBkYXRhIGJ1ZmZlciBhbmQgaW5jcmVhc2UgdGhlIHZhbHVlIG9mIGl0cworICogbGVuZ3RoIHRvIHJlZmxlY3QgdGhpcy4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gYXBwZW5kIHRvCisgKiBAcGFyYW0gYnVmIHRoZSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBwYWNrZXQKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBhcHBlbmQKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzOyBBTklfRV9GQUlMRUQgaWYgdGhlCisgKiBwYWNrZXQgZG9lcyBub3QgaGF2ZSBlbm91Z2ggZnJlZSBzcGFjZSBmb3IgdGhlIGNvbXBsZXRlIGJ1ZmZlcgorICogQHNlZSBhbmlBc2ZQYWNrZXRQcmVwZW5kQnVmZmVyCisgKi8KK2ludAorYW5pQXNmUGFja2V0QXBwZW5kQnVmZmVyKHRBbmlQYWNrZXQgKmRlc3RQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdl9VOF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBsZW4pCit7CisgIGlmIChhbmlBc2ZQYWNrZXRDYW5BcHBlbmRCdWZmZXIoZGVzdFBhY2tldCwgbGVuKSAhPSBBTklfT0spCisgICAgICByZXR1cm4gQU5JX0VfRkFJTEVEOworCisgIGlmIChidWYgPT0gTlVMTCkKKyAgICByZXR1cm4gQU5JX0VfTlVMTF9WQUxVRTsKKworICB2b3NfbWVtX2NvcHkoZGVzdFBhY2tldC0+dGFpbCwgYnVmLCBsZW4pOworICBkZXN0UGFja2V0LT50YWlsICs9IGxlbjsKKyAgZGVzdFBhY2tldC0+bGVuICs9IGxlbjsKKyAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRQcmVwZW5kQnVmZmVyCisgKgorICogRlVOQ1RJT046CisgKiBQcmVwZW5kcyB0aGUgZGF0YSBjb250YWluZWQgaW4gYnVmIHRvIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBpbgorICogZGVzdFBhY2tldC4gVGhlIGhlYWQgb2YgZGVzdFBhY2tldCBpcyByZXBvc2l0aW9uZWQgYW5kIHRoZSBsZW5ndGgKKyAqIG9mIGRlc3RQYWNrZXQgaW5jcmVhc2VzIGJ5IGxlbi4KKyAqCisgKiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggZnJlZSBzcGFjZSBpbiBkZXN0UGFja2V0IGZvciBhbGwgbGVuIGJ5dGVzCisgKiB0aGVuIHRoZSByb3V0aW5lIGZhaWxzIGFuZCB0aGUgbGVuZ3RoIG9mIGRlc3RQYWNrZXQgcmVtYWlucworICogdW5jaGFuZ2VkLgorICoKKyAqIExPR0lDOgorICogQ2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggZnJlZSBzcGFjZSBpbiB0aGUgcGFja2V0IHRvIHByZXBlbmQgdGhlCisgKiBidWZmZXIuIElmIG5vdCwgYmFpbC4gT3RoZXJ3aXNlLCBjb3B5IGJ5dGVzIGZyb20gdGhlIGJ1ZmZlciBpbnRvCisgKiB0aGUgcGFja2V0J3MgaW50ZXJuYWwgcmF3IGRhdGEgYnVmZmVyIGFuZCBpbmNyZWFzZSB0aGUgdmFsdWUgb2YgaXRzCisgKiBsZW5ndGggdG8gcmVmbGVjdCB0aGlzLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byBwcmVwZW5kIHRvCisgKiBAcGFyYW0gYnVmIHRoZSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHByZXBlbmRlZCB0byB0aGUgcGFja2V0CisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcHJlcGVuZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHM7IEFOSV9FX0ZBSUxFRCBpZiB0aGUKKyAqIHBhY2tldCBkb2VzIG5vdCBoYXZlIGVub3VnaCBmcmVlIHNwYWNlIGZvciB0aGUgY29tcGxldGUgYnVmZmVyCisgKiBAc2VlIGFuaUFzZlBhY2tldEFwcGVuZEJ1ZmZlcgorICovCitpbnQKK2FuaUFzZlBhY2tldFByZXBlbmRCdWZmZXIodEFuaVBhY2tldCAqZGVzdFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdl9VOF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbGVuKQoreworICBpZiAoYW5pQXNmUGFja2V0Q2FuUHJlcGVuZEJ1ZmZlcihkZXN0UGFja2V0LCBsZW4pICE9IEFOSV9PSykKKyAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisKKyAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisKKyAgZGVzdFBhY2tldC0+aGVhZCAtPSBsZW47CisgIGRlc3RQYWNrZXQtPmxlbiArPSBsZW47CisgIHZvc19tZW1fY29weShkZXN0UGFja2V0LT5oZWFkLCBidWYsIGxlbik7CisgIHJldHVybiBBTklfT0s7CisKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRDYW5BcHBlbmRCdWZmZXIKKyAqCisgKiBGVU5DVElPTjoKKyAqIERldGVybWluZXMgaWYgbGVuIGJ5dGVzIGNhbiBiZSBzYWZlbHkgYXBwZW5kZWQgdG8gZGVzdFBhY2tldAorICogd2l0aG91dCBvdmVyZmxvd2luZy4KKyAqCisgKiBMT0dJQzoKKyAqIEN1cnJlbnQgcGFja2V0IHRhaWwgcGx1cyBsZW4gb2YgYnVmZmVyIHNob3VsZCBub3QgZXhjZWVkIHBhY2tldAorICogc3RhcnQgcGx1cyBwYWNrZXQgc2l6ZQorICoKKyAqIE5vdGU6IFRoaXMgZG9lcyBub3QgcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSwgYnV0IGluc3RlYWQgYW4gaW50ZWdlcgorICogY29kZS4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gYXBwZW5kIHRvCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYXBwZW5kCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIGFwcGVuZCBvcGVyYXRpb24gd291bGQgc3VjY2VlZDsgQU5JX0VfRkFJTEVECisgKiBvdGhlcndpc2UKKyAqLworaW50CithbmlBc2ZQYWNrZXRDYW5BcHBlbmRCdWZmZXIodEFuaVBhY2tldCAqZGVzdFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IGxlbikKK3sKKyAgaWYgKGRlc3RQYWNrZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gQU5JX0VfRkFJTEVEOworCisgIGlmICgoaW50KWxlbiA8PSBUQUlMX1NQQUNFKGRlc3RQYWNrZXQpKQorICAgICAgcmV0dXJuIEFOSV9PSzsKKyAgZWxzZQorICAgICAgcmV0dXJuIEFOSV9FX0ZBSUxFRDsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRDYW5QcmVwZW5kQnVmZmVyCisgKgorICogRlVOQ1RJT046CisgKiBEZXRlcm1pbmVzIGlmIGxlbiBieXRlcyBjYW4gYmUgc2FmZWx5IHByZXBlbmRlZCB0byBkZXN0UGFja2V0CisgKiB3aXRob3V0IG92ZXJmbG93aW5nLgorICoKKyAqIExPR0lDOgorICogQ3VycmVudCBwYWNrZXQgaGVhZCBtaW51cyBsZW4gb2YgYnVmZmVyIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuCisgKiBzdGFydCBvZiBwYWNrZXQuCisgKgorICogTm90ZTogVGhpcyBkb2VzIG5vdCByZXR1cm4gYSBib29sZWFuIHZhbHVlLCBidXQgaW5zdGVhZCBhbiBpbnRlZ2VyCisgKiBjb2RlLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byBwcmVwZW5kIHRvCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcHJlcGVuZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBhcHBlbmQgb3BlcmF0aW9uIHdvdWxkIHN1Y2NlZWQ7IEFOSV9FX0ZBSUxFRAorICogb3RoZXJ3aXNlCisgKi8KK2ludAorYW5pQXNmUGFja2V0Q2FuUHJlcGVuZEJ1ZmZlcih0QW5pUGFja2V0ICpkZXN0UGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IGxlbikKK3sKKyAgaWYgKGRlc3RQYWNrZXQgPT0gTlVMTCkKKyAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisKKyAgaWYgKCEobGVuID4gMCkpCisgICAgICByZXR1cm4gQU5JX0VfRkFJTEVEOworCisgIGlmICgoaW50KWxlbiA8PSBIRUFEX1NQQUNFKGRlc3RQYWNrZXQpKQorICAgICAgcmV0dXJuIEFOSV9PSzsKKyAgZWxzZQorICAgICAgcmV0dXJuIEFOSV9FX0ZBSUxFRDsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRUcnVuY2F0ZUZyb21Gcm9udAorICoKKyAqIEZVTkNUSU9OOgorICogUmVtb3ZlcyBsZW4gYnl0ZXMgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHBhY2tldCBieSBtb3ZpbmcgaXRzCisgKiBoZWFkLiBUaGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgaXMgZGVjcmVtZW50ZWQgYnkgbGVuLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byB0cnVuY2F0ZSBmcm9tIHRoZSBmcm9udAorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRydW5jYXRlCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIGFwcGVuZCBvcGVyYXRpb24gd291bGQgc3VjY2VlZDsgQU5JX0VfRkFJTEVECisgKiBvdGhlcndpc2UKKyAqLworaW50CithbmlBc2ZQYWNrZXRUcnVuY2F0ZUZyb21Gcm9udCh0QW5pUGFja2V0ICpwYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IGxlbikKK3sKKyAgICBpZiAocGFja2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgICAgaWYgKCFBTklfQ0hFQ0tfUkFOR0UobGVuLCBwYWNrZXQtPmxlbikpCisgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisKKyAgICBwYWNrZXQtPmhlYWQgKz0gbGVuOworICAgIHBhY2tldC0+bGVuIC09IGxlbjsKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKKy8qKgorICogYW5pQXNmUGFja2V0VHJ1bmNhdGVGcm9tUmVhcgorICoKKyAqIEZVTkNUSU9OOgorICogUmVtb3ZlcyBsZW4gYnl0ZXMgZnJvbSB0aGUgcmVhciBvZiB0aGUgcGFja2V0IGJ5IG1vdmluZyBpdHMKKyAqIHRhaWwuIFRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBpcyBkZWNyZW1lbnRlZCBieSBsZW4uCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHRydW5jYXRlIGZyb20gdGhlIHJlYXIKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byB0cnVuY2F0ZQorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBhcHBlbmQgb3BlcmF0aW9uIHdvdWxkIHN1Y2NlZWQ7IEFOSV9FX0ZBSUxFRAorICogb3RoZXJ3aXNlCisgKi8KK2ludAorYW5pQXNmUGFja2V0VHJ1bmNhdGVGcm9tUmVhcih0QW5pUGFja2V0ICpwYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbGVuKQoreworICAgIGlmIChwYWNrZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisKKyAgICBpZiAoIUFOSV9DSEVDS19SQU5HRShsZW4sIHBhY2tldC0+bGVuKSkKKyAgICAgICAgcmV0dXJuIEFOSV9FX0ZBSUxFRDsKKworICAgIHBhY2tldC0+dGFpbCAtPSBsZW47CisgICAgcGFja2V0LT5sZW4gLT0gbGVuOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRHZXRMZW4KKyAqCisgKiBGVU5DVElPTjoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiB2YWxpZCBkYXRhIGJ5dGVzIHN0b3JlZCBpbiB0aGUgcGFja2V0LgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB3aG9zZSBsZW4gd2UgbmVlZAorICoKKyAqIEByZXR1cm4gdGhlIG5vbi1uZWdhdGl2ZSBudW1iZXIgb2YgYnl0ZXMgc3RvcmVkIGluIHRoZSBwYWNrZXQKKyAqLworaW50CithbmlBc2ZQYWNrZXRHZXRMZW4odEFuaVBhY2tldCAqcGFja2V0KQoreworICAgIGlmIChwYWNrZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisKKyAgICByZXR1cm4gcGFja2V0LT5sZW47Cit9CisKKy8qKgorICogYW5pQXNmUGFja2V0R2V0Qnl0ZXMKKyAqCisgKiBGVU5DVElPTjoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBoZWFkIG9mIHRoZSB2YWxpZCBkYXRhIHN0b3JlZCBpbiB0aGUKKyAqIHBhY2tldC4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgd2hvc2UgYnl0ZXMgd2UgbmVlZAorICogQHBhcmFtIHJhd0J5dGVzUHRyIHRoZSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdGhlIHN0YXJ0IG9mIHRoZQorICogcmF3IGJ5dGVzLgorICoKKyAqIEByZXR1cm4gVGhlIG5vbi1uZWdhdGl2ZSBudW1iZXIgb2YgYnl0ZXMgc3RvcmVkIGluIHRoZSBwYWNrZXQgaWYKKyAqIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLiBUaGF0IGlzIHRoZSBzYW1lIHZhbHVlIGFzIHdoYXQgd291bGQgYmUKKyAqIHJldHVybmVkIGJ5IGFuaUFzZlBhY2tldEdldExlbi4KKyAqLworaW50CithbmlBc2ZQYWNrZXRHZXRCeXRlcyh0QW5pUGFja2V0ICpwYWNrZXQsIHZfVThfdCAqKnJhd0J5dGVzUHRyKQoreworICAgIGlmIChwYWNrZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisKKyAgICAqcmF3Qnl0ZXNQdHIgPSBwYWNrZXQtPmhlYWQ7CisgICAgcmV0dXJuIHBhY2tldC0+bGVuOworfQorCisvKioKKyAqIGFuaUFzZlBhY2tldEdldE4KKyAqCisgKiBSZXR1cm5zIE4gYnl0ZXMgZnJvbSB0aGUgcGFja2V0IGFuZCBtb3ZlcyB0aGUgaGVhZCBvZiB0aGUgcGFja2V0CisgKiBiZXlvbmQgdGhvc2UgYnl0ZXMuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHJlYWQgZnJvbQorICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKiBAcGFyYW0gYnl0ZXNQdHIgaXMgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgb2N0ZXRzCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkczsgQU5JX0VfU0hPUlRfUEFDS0VUIGlmIHRoZQorICogcGFja2V0IGRvZXMgbm90IGhhdmUgbiBieXRlcy4KKyAqLworaW50CithbmlBc2ZQYWNrZXRHZXROKHRBbmlQYWNrZXQgKnBhY2tldCwgaW50IG4sIHZfVThfdCAqKmJ5dGVzUHRyKQoreworICAgIGludCByZXRWYWw7CisgICAgdl9VOF90ICpieXRlcyA9IE5VTEw7CisKKyAgICBpZiAocGFja2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0R2V0Qnl0ZXMocGFja2V0LCAmYnl0ZXMpOworICAgIGlmIChyZXRWYWwgPCBuKQorICAgICAgICByZXR1cm4gQU5JX0VfU0hPUlRfUEFDS0VUOworCisgICAgYW5pQXNmUGFja2V0VHJ1bmNhdGVGcm9tRnJvbnQocGFja2V0LCBuKTsKKworICAgICpieXRlc1B0ciA9IGJ5dGVzOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRFbXB0eQorICoKKyAqIEZVTkNUSU9OOgorICogUmUtaW5pdGlhbGl6ZXMgdGhlIHBhY2tldCBieSBwb3NpdGlvbmluZyB0aGUgaGVhZCB0byB0aGUgbWlkZGxlIGFuZAorICogc2V0dGluZyB0aGUgbGVuZ3RoIHRvIHplcm8uCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIGVtcHR5CisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQKKyAqLworaW50CithbmlBc2ZQYWNrZXRFbXB0eSh0QW5pUGFja2V0ICpwYWNrZXQpCit7CisgICAgcmV0dXJuIGFuaUFzZlBhY2tldEVtcHR5RXhwbGljaXQocGFja2V0LCBwYWNrZXQtPnNpemUvMik7Cit9CisKKy8qKgorICogYW5pQXNmUGFja2V0RW1wdHlFeHBsaWNpdAorICoKKyAqIEZVTkNUSU9OOgorICogUmUtaW5pdGlhbGl6ZXMgdGhlIHBhY2tldCBieSBwb3NpdGlvbmluZyB0aGUgaGVhZCB0byB0aGUgZGVzaXJlZAorICogb2Zmc2V0IGFuZCBzZXR0aW5nIHRoZSBsZW5ndGggdG8gemVyby4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gZW1wdHkKKyAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0aGF0IHRoZSBoZWFkIG9mIHRoZSBwYWNrZXQgc2hvdWxkIGJlIHNldAorICogdG8uIEFuIGFwcGxpY2F0aW9uIHdpbGwgYmUgYWJsZSB0byBwcmVwZW5kIGFuZCBhcHBlbmQgZGF0YSByZWxhdGl2ZQorICogdG8gdGhpcyBvZmZzZXQuCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQKKyAqLworaW50CithbmlBc2ZQYWNrZXRFbXB0eUV4cGxpY2l0KHRBbmlQYWNrZXQgKnBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBvZmZzZXQpCit7CisgICAgaWYgKHBhY2tldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQU5JX0VfTlVMTF9WQUxVRTsKKworICAgIFZPU19BU1NFUlQoQU5JX0NIRUNLX1JBTkdFKG9mZnNldCwgcGFja2V0LT5zaXplKSk7CisgICAgaWYgKCFBTklfQ0hFQ0tfUkFOR0Uob2Zmc2V0LCBwYWNrZXQtPnNpemUpKQorICAgICAgICByZXR1cm4gQU5JX0VfSUxMRUdBTF9BUkc7CisKKyAgICBwYWNrZXQtPmhlYWQgPSBwYWNrZXQtPmJ1ZiArIG9mZnNldDsKKyAgICBwYWNrZXQtPnRhaWwgPSBwYWNrZXQtPmhlYWQ7CisgICAgcGFja2V0LT5sZW4gPSAwOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworCisKKy8qKgorICogYW5pQXNmUGFja2V0UHJlcGVuZEhkcgorICoKKyAqIEZVTkNUSU9OOgorICogUHJlcGVuZHMgYSB0QW5pSGRyIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFja2V0LiAgQWxsIGhvc3QgdG8gbmV0d29yaworICogYnl0ZSBvcmRlciB0cmFuc2xhdGlvbiBpcyBhbHNvIHRha2VuIGNhcmUgb2YuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gbXNnVHlwZSB0aGUgbWVzc2FnZSB0eXBlIHRvIHdyaXRlIGFzIHBhcnQgb2YgdGhlIGhlYWRlcgorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlBc2ZQYWNrZXRQcmVwZW5kSGRyKHRBbmlQYWNrZXQgKnBhY2tldCwgdl9VMTZfdCBtc2dUeXBlKQoreworICAgIGludCByZXRWYWw7CisgICAgaW50IGxlbmd0aDsKKworICAgIGlmIChwYWNrZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisKKyAgICBsZW5ndGggPSA0OworCisgICAgbGVuZ3RoID0gMiArIDIgKyBwYWNrZXQtPmxlbjsKKworICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldFByZXBlbmQxNihwYWNrZXQsIGxlbmd0aCk7CisgICAgaWYgKHJldFZhbCA8IDApCisgICAgICAgIHJldHVybiByZXRWYWw7CisKKyAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRQcmVwZW5kMTYocGFja2V0LCBtc2dUeXBlKTsKKyAgICBpZiAocmV0VmFsIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKKy8qKgorICogYW5pQXNmUGFja2V0R2V0MzIKKyAqCisgKiBGVU5DVElPTjoKKyAqIFJlYWRzIGEgQU5JX1UzMiBvdXQgb2YgdGhlIHBhY2tldCBhbmQgcmV0dXJucyBpdC4gVGhlIHBhY2tldCdzIGhlYWQKKyAqIGlzIGFkdmFuY2VkIGFuZCBpdHMgbGVuZ3RoIGRlY3JlbWVudGVkIGJ5IHRoZSBhcHByb3ByaWF0ZSBsZW5ndGguCisgKiBBbGwgbmV0d29yayB0byBob3N0IGJ5dGUgb3JkZXIgdHJhbnNsYXRpb24gaXMgYWxzbyB0YWtlbiBjYXJlIG9mLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byByZWFkIGZyb20KKyAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIGZpbGwgaW4KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYW5pQXNmUGFja2V0R2V0MzIodEFuaVBhY2tldCAqcGFja2V0LCB2X1UzMl90ICp2YWwpCit7CisgICAgdl9VOF90IHUzMkFycls0XTsKKworICAgIGlmIChwYWNrZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisKKyAgICBpZiAodmFsID09IE5VTEwpCisgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgICAgaWYgKHBhY2tldC0+bGVuIDwgNCkKKyAgICAgICAgcmV0dXJuIEFOSV9FX1NIT1JUX1BBQ0tFVDsKKworICAgIC8vcGFja2V0IGlzIGluIG5ldHdvcmsgb3JkZXIsIG1ha2Ugc3VyZSBpdCBpcyBhbGlnbgorICAgIHUzMkFyclswXSA9IHBhY2tldC0+aGVhZFswXTsKKyAgICB1MzJBcnJbMV0gPSBwYWNrZXQtPmhlYWRbMV07CisgICAgdTMyQXJyWzJdID0gcGFja2V0LT5oZWFkWzJdOworICAgIHUzMkFyclszXSA9IHBhY2tldC0+aGVhZFszXTsKKyAgICAqdmFsID0gdm9zX2JlMzJfdG9fY3B1KCAqKHZfVTMyX3QgKil1MzJBcnIgKTsKKyAgICBhbmlBc2ZQYWNrZXRUcnVuY2F0ZUZyb21Gcm9udChwYWNrZXQsIDQpOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRBcHBlbmQzMgorICoKKyAqIEZVTkNUSU9OOgorICogQXBwZW5kcyBhIEFOSV9VMzIgdG8gdGhlIGVuZCBvZiB0aGUgcGFja2V0LgorICogQWxsIGhvc3QgdG8gbmV0d29yayBieXRlIG9yZGVyIHRyYW5zbGF0aW9uIGlzIGFsc28gdGFrZW4gY2FyZSBvZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIGFwcGVuZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlBc2ZQYWNrZXRBcHBlbmQzMih0QW5pUGFja2V0ICpwYWNrZXQsIHZfVTMyX3QgdmFsKQoreworICAgIHZfVThfdCAqcDg7CisKKyAgICBpZiAocGFja2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgICAgaWYgKFRBSUxfU1BBQ0UocGFja2V0KSA8IDQpCisgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisKKyAgICB2YWwgPSB2b3NfY3B1X3RvX2JlMzIoIHZhbCApOworICAgIHA4ID0gKHZfVThfdCAqKSZ2YWw7CisgICAgcGFja2V0LT50YWlsWzBdID0gIHA4WzBdOworICAgIHBhY2tldC0+dGFpbFsxXSA9ICBwOFsxXTsKKyAgICBwYWNrZXQtPnRhaWxbMl0gPSAgcDhbMl07CisgICAgcGFja2V0LT50YWlsWzNdID0gIHA4WzNdOworICAgIGFuaUFzZlBhY2tldE1vdmVSaWdodChwYWNrZXQsIDQpOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRHZXQxNgorICoKKyAqIEZVTkNUSU9OOgorICogUmVhZHMgYSBBTklfVTE2IG91dCBvZiB0aGUgcGFja2V0IGFuZCByZXR1cm5zIGl0LiBUaGUgcGFja2V0J3MgaGVhZAorICogaXMgYWR2YW5jZWQgYW5kIGl0cyBsZW5ndGggZGVjcmVtZW50ZWQgYnkgdGhlIGFwcHJvcHJpYXRlIGxlbmd0aC4KKyAqIEFsbCBuZXR3b3JrIHRvIGhvc3QgYnl0ZSBvcmRlciB0cmFuc2xhdGlvbiBpcyBhbHNvIHRha2VuIGNhcmUgb2YuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHJlYWQgZnJvbQorICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gZmlsbCBpbgorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlBc2ZQYWNrZXRHZXQxNih0QW5pUGFja2V0ICpwYWNrZXQsIHZfVTE2X3QgKnZhbCkKK3sKKyAgICB2X1U4X3QgdTE2QXJyWzJdOworCisgICAgaWYgKHBhY2tldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQU5JX0VfTlVMTF9WQUxVRTsKKworICAgIGlmICh2YWwgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisKKyAgICBpZiAocGFja2V0LT5sZW4gPCAyKQorICAgICAgICByZXR1cm4gQU5JX0VfU0hPUlRfUEFDS0VUOworCisgICAgdTE2QXJyWzBdID0gcGFja2V0LT5oZWFkWzBdOworICAgIHUxNkFyclsxXSA9IHBhY2tldC0+aGVhZFsxXTsKKyAgICAqdmFsID0gdm9zX2JlMTZfdG9fY3B1KCAqKHZfVTE2X3QgKil1MTZBcnIgKTsKKyAgICBhbmlBc2ZQYWNrZXRUcnVuY2F0ZUZyb21Gcm9udChwYWNrZXQsIDIpOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRQcmVwZW5kMTYKKyAqCisgKiBGVU5DVElPTjoKKyAqIFByZXBlbmRzIGEgQU5JX1UxNiB0byB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldC4KKyAqIEFsbCBob3N0IHRvIG5ldHdvcmsgYnl0ZSBvcmRlciB0cmFuc2xhdGlvbiBpcyBhbHNvIHRha2VuIGNhcmUgb2YuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byBwcmVwZW5kCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUFzZlBhY2tldFByZXBlbmQxNih0QW5pUGFja2V0ICpwYWNrZXQsIHZfVTE2X3QgdmFsKQoreworICAgIHZfVThfdCAqcDg7CisKKyAgICBpZiAocGFja2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgICAgaWYgKEhFQURfU1BBQ0UocGFja2V0KSA8IDIpCisgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisKKyAgICBhbmlBc2ZQYWNrZXRNb3ZlTGVmdChwYWNrZXQsIDIpOworICAgIHZhbCA9IHZvc19jcHVfdG9fYmUxNiggdmFsICk7CisgICAgcDggPSAodl9VOF90ICopJnZhbDsKKyAgICBwYWNrZXQtPmhlYWRbMF0gPSAgcDhbMF07CisgICAgcGFja2V0LT5oZWFkWzFdID0gIHA4WzFdOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRBcHBlbmQxNgorICoKKyAqIEZVTkNUSU9OOgorICogQXBwZW5kcyBhIEFOSV9VMTYgdG8gdGhlIGVuZCBvZiB0aGUgcGFja2V0LgorICogQWxsIGhvc3QgdG8gbmV0d29yayBieXRlIG9yZGVyIHRyYW5zbGF0aW9uIGlzIGFsc28gdGFrZW4gY2FyZSBvZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIGFwcGVuZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlBc2ZQYWNrZXRBcHBlbmQxNih0QW5pUGFja2V0ICpwYWNrZXQsIHZfVTE2X3QgdmFsKQoreworICAgIHZfVThfdCAqcDg7CisKKyAgICBpZiAocGFja2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgICAgaWYgKFRBSUxfU1BBQ0UocGFja2V0KSA8IDIpCisgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisKKyAgICB2YWwgPSB2b3NfY3B1X3RvX2JlMTYoIHZhbCApOworICAgIHA4ID0gKHZfVThfdCAqKSZ2YWw7CisgICAgcGFja2V0LT50YWlsWzBdID0gIHA4WzBdOworICAgIHBhY2tldC0+dGFpbFsxXSA9ICBwOFsxXTsKKyAgICBhbmlBc2ZQYWNrZXRNb3ZlUmlnaHQocGFja2V0LCAyKTsKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKKy8qKgorICogYW5pQXNmUGFja2V0R2V0OAorICoKKyAqIEZVTkNUSU9OOgorICogUmVhZHMgYSBBTklfVTggb3V0IG9mIHRoZSBwYWNrZXQgYW5kIHJldHVybnMgaXQuIFRoZSBwYWNrZXQncyBoZWFkCisgKiBpcyBhZHZhbmNlZCBhbmQgaXRzIGxlbmd0aCBkZWNyZW1lbnRlZCBieSB0aGUgYXBwcm9wcmlhdGUgbGVuZ3RoLgorICogQWxsIG5ldHdvcmsgdG8gaG9zdCBieXRlIG9yZGVyIHRyYW5zbGF0aW9uIGlzIGFsc28gdGFrZW4gY2FyZSBvZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byBmaWxsIGluCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUFzZlBhY2tldEdldDgodEFuaVBhY2tldCAqcGFja2V0LCB2X1U4X3QgKnZhbCkKK3sKKyAgICBpZiAocGFja2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgICAgaWYgKHZhbCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQU5JX0VfTlVMTF9WQUxVRTsKKworICAgIGlmIChwYWNrZXQtPmxlbiA8IDEpCisgICAgICAgIHJldHVybiBBTklfRV9TSE9SVF9QQUNLRVQ7CisKKyAgICAqdmFsID0gKihwYWNrZXQtPmhlYWQpOworICAgIGFuaUFzZlBhY2tldFRydW5jYXRlRnJvbUZyb250KHBhY2tldCwgMSk7CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCisvKioKKyAqIGFuaUFzZlBhY2tldFByZXBlbmQ4CisgKgorICogRlVOQ1RJT046CisgKiBQcmVwZW5kcyBhIEFOSV9VOCB0byB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldC4KKyAqIEFsbCBob3N0IHRvIG5ldHdvcmsgYnl0ZSBvcmRlciB0cmFuc2xhdGlvbiBpcyBhbHNvIHRha2VuIGNhcmUgb2YuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHJlYWQgZnJvbQorICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gcHJlcGVuZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlBc2ZQYWNrZXRQcmVwZW5kOCh0QW5pUGFja2V0ICpwYWNrZXQsIHZfVThfdCB2YWwpCit7CisgICAgaWYgKHBhY2tldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQU5JX0VfTlVMTF9WQUxVRTsKKworICAgIFZPU19BU1NFUlQoSEVBRF9TUEFDRShwYWNrZXQpID49IDEpOworICAgIGlmIChIRUFEX1NQQUNFKHBhY2tldCkgPCAxKQorICAgICAgICByZXR1cm4gQU5JX0VfRkFJTEVEOworCisgICAgYW5pQXNmUGFja2V0TW92ZUxlZnQocGFja2V0LCAxKTsKKyAgICAqKHBhY2tldC0+aGVhZCkgPSB2YWw7CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCisvKioKKyAqIGFuaUFzZlBhY2tldEFwcGVuZDgKKyAqCisgKiBGVU5DVElPTjoKKyAqIEFwcGVuZHMgYSBBTklfVTggdG8gdGhlIGVuZCBvZiB0aGUgcGFja2V0LgorICogQWxsIGhvc3QgdG8gbmV0d29yayBieXRlIG9yZGVyIHRyYW5zbGF0aW9uIGlzIGFsc28gdGFrZW4gY2FyZSBvZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIGFwcGVuZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlBc2ZQYWNrZXRBcHBlbmQ4KHRBbmlQYWNrZXQgKnBhY2tldCwgdl9VOF90IHZhbCkKK3sKKyAgICBpZiAocGFja2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBBTklfRV9OVUxMX1ZBTFVFOworCisgICAgaWYgKFRBSUxfU1BBQ0UocGFja2V0KSA8IDEpCisgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisKKyAgICAqKHBhY2tldC0+dGFpbCkgPSB2YWw7CisgICAgYW5pQXNmUGFja2V0TW92ZVJpZ2h0KHBhY2tldCwgMSk7CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCisvKioKKyAqIGFuaUFzZlBhY2tldEdldE1hYworICoKKyAqIEZVTkNUSU9OOgorICogUmV0dXJucyBhIHRBbmlNYWNBZGRyIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHJlYWQgZnJvbQorICogQHBhcmFtIG1hY0FkZHIgdGhlIGRlc3RpbmF0aW9uIHRvIGNvcHkgdGhlIE1BQyBhZGRyZXNzIHRvCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcy4gQWxzbywgdGhlIHBhY2tldCBoZWFkCisgKiBwb2ludGVyIGlzIGFkdmFuY2VkIHBhc3QgdGhlIE1BQyBhZGRyZXNzLgorICovCitpbnQKK2FuaUFzZlBhY2tldEdldE1hYyh0QW5pUGFja2V0ICpwYWNrZXQsIHRBbmlNYWNBZGRyIG1hY0FkZHIpCit7CisgICAgaWYgKHBhY2tldC0+bGVuIDwgc2l6ZW9mKHRBbmlNYWNBZGRyKSkKKyAgICAgICAgcmV0dXJuIEFOSV9FX1NIT1JUX1BBQ0tFVDsKKworICAgIHZvc19tZW1fY29weShtYWNBZGRyLCBwYWNrZXQtPmhlYWQsIHNpemVvZih0QW5pTWFjQWRkcikpOworCisgICAgcGFja2V0LT5oZWFkICs9IHNpemVvZih0QW5pTWFjQWRkcik7CisgICAgcGFja2V0LT5sZW4gLT0gc2l6ZW9mKHRBbmlNYWNBZGRyKTsKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKKy8qKgorICogYW5pQXNmUGFja2V0TW92ZUxlZnQKKyAqCisgKiBGVU5DVElPTjoKKyAqIFByZXRlbmRzIHRoYXQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBoYXZlIGJlZW4gcHJlcGVuZGVkIHRvIHRoZQorICogcGFja2V0LCB3aXRob3V0IGFjdHVhbGx5IGNvcHlpbmcgYW55IGJ5dGVzIGluLiBUaGUgcGFja2V0IGhlYWQgYW5kCisgKiBsZW5ndGggYXJlIGFwcHJvcHJpYXRlbHkgY2hhbmdlZC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgd2hpbGUKKyAqIGludGVyZmFjaW5nIHdpdGggb3RoZXIgbGlicmFyaWVzIHRoYXQgb25seSBzdXBwb3J0IGJ5dGUgYXJyYXkKKyAqIG1hbmlwdWxhdGlvbi4KKyAqCisgKiBXQVJOSU5HOiAKKyAqIEFwcGxpY2F0aW9ucyBhcmUgZGlzY291cmFnZWQgZnJvbSB1c2luZyB0aGlzIGZ1bmN0aW9uCisgKiBiZWNhdXNlIGNvcnJlY3QgdXNhZ2UgaXMgYSB0d28tc3RlcCBwcm9jZXNzIC0gb25lOiBjb3B5IHNvbWUgYnl0ZXMKKyAqIHRvIHRoZSBwYWNrZXQncyBpbnRlcm5hbCBidWZmZXIsIHR3bzogbW92ZSBoZWFkIGFuZCBsZW5ndGguIFRoaXMKKyAqIHZpb2xhdGVzIHRoZSBlbmNhcHN1bGF0aW9uIHRoZSBwYWNrZXQgbGlicmFyeSBhaW1zIHRvIHByb3ZpZGUuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHdob3NlIGhlYWQgYW5kIGxlbmd0aCBuZWVkcyB0byBiZSBtb2RpZmllZAorICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbW9kaWZ5IGJ5CisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUFzZlBhY2tldE1vdmVMZWZ0KHRBbmlQYWNrZXQgKnBhY2tldCwgdl9VMzJfdCBjb3VudCkKK3sKKyAgICBpZiAoYW5pQXNmUGFja2V0Q2FuUHJlcGVuZEJ1ZmZlcihwYWNrZXQsIGNvdW50KSAhPSBBTklfT0spCisgICAgICAgIHJldHVybiBBTklfRV9GQUlMRUQ7CisKKyAgICBwYWNrZXQtPmhlYWQgLT0gY291bnQ7CisgICAgcGFja2V0LT5sZW4gKz0gY291bnQ7CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCisvKioKKyAqIGFuaUFzZlBhY2tldE1vdmVSaWdodAorICoKKyAqIEZVTkNUSU9OOgorICogUHJldGVuZHMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIGhhdmUgYmVlbiBhcHBlbmRlZCB0byB0aGUKKyAqIHBhY2tldCwgd2l0aG91dCBhY3R1YWxseSBjb3B5aW5nIGFueSBieXRlcyBpbi4gVGhlIHBhY2tldCB0YWlsIGFuZAorICogbGVuZ3RoIGFyZSBhcHByb3ByaWF0ZWx5IGNoYW5nZWQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoaWxlCisgKiBpbnRlcmZhY2luZyB3aXRoIG90aGVyIGxpYnJhcmllcyB0aGF0IG9ubHkgc3VwcG9ydCBieXRlIGFycmF5CisgKiBtYW5pcHVsYXRpb24uCisgKgorICogV0FSTklORzogCisgKiBBcHBsaWNhdGlvbnMgYXJlIGRpc2NvdXJhZ2VkIGZyb20gdXNpbmcgdGhpcyBmdW5jdGlvbgorICogYmVjYXVzZSBjb3JyZWN0IHVzYWdlIGlzIGEgdHdvLXN0ZXAgcHJvY2VzcyAtIG9uZTogY29weSBzb21lIGJ5dGVzCisgKiB0byB0aGUgcGFja2V0J3MgaW50ZXJuYWwgYnVmZmVyLCB0d286IG1vdmUgdGFpbCBhbmQgbGVuZ3RoLiBUaGlzCisgKiB2aW9sYXRlcyB0aGUgZW5jYXBzdWxhdGlvbiB0aGUgcGFja2V0IGxpYnJhcnkgYWltcyB0byBwcm92aWRlLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB3aG9zZSBoZWFkIGFuZCBsZW5ndGggbmVlZHMgdG8gYmUgbW9kaWZpZWQKKyAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG1vZGlmeSBieQorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlBc2ZQYWNrZXRNb3ZlUmlnaHQodEFuaVBhY2tldCAqcGFja2V0LCB2X1UzMl90IGNvdW50KQoreworICAgIGlmIChhbmlBc2ZQYWNrZXRDYW5BcHBlbmRCdWZmZXIocGFja2V0LCBjb3VudCkgIT0gQU5JX09LKQorICAgICAgICByZXR1cm4gQU5JX0VfRkFJTEVEOworCisgICAgcGFja2V0LT50YWlsICs9IGNvdW50OworICAgIHBhY2tldC0+bGVuICs9IGNvdW50OworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlBc2ZQYWNrZXRHZXRCeXRlc0Zyb21UYWlsCisgKgorICogRlVOQ1RJT046CisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdGFpbCBvZiB0aGUgdmFsaWQgZGF0YSBzdG9yZWQgCisgKiBpbiB0aGUgcGFja2V0LgorICoKKyAqIFdBUk5JTkc6IAorICogQXBwbGljYXRpb25zIGFyZSBkaXNjb3VyYWdlZCBmcm9tIHVzaW5nIHRoaXMgZnVuY3Rpb24KKyAqIGJlY2F1c2UgY29ycmVjdCB1c2FnZSBpcyBhIHRocmVlLXN0ZXAgcHJvY2VzcyAtIG9uZTogY2FsbCB0aGlzCisgKiByb3V0aW5lIHRvIG9idGFpbiBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdGFpbCBvZiB0aGUgcGFja2V0LiAKKyAqIHR3bzogdHJlYXQgdGhpcyByZXR1cm5lZCBwb2ludGVyIGxpa2UgYSBzaW1wbGUgYXJyYXkgYW5kIGNvcHkgCisgKiBzb21lIGJ5dGVzIHRvIHRoZSBwYWNrZXQncyBpbnRlcm5hbCBidWZmZXIsIGFuZCBmaW5hbGx5IAorICogdGhyZWU6IG1vdmUgdGFpbCBhbmQgbGVuZ3RoLiBUaGlzIHZpb2xhdGVzIHRoZSBlbmNhcHN1bGF0aW9uIAorICogdGhlIHBhY2tldCBsaWJyYXJ5IGFpbXMgdG8gcHJvdmlkZS4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgd2hvc2UgYnl0ZXMgd2UgbmVlZAorICogQHBhcmFtIHJhd0J5dGVzUHRyIHRoZSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdGhlIHN0YXJ0IG9mIHRoZQorICogcmF3IGJ5dGVzLgorICoKKyAqIEByZXR1cm4gVGhlIG5vbi1uZWdhdGl2ZSBudW1iZXIgb2YgYnl0ZXMgc3RvcmVkIGluIHRoZSBwYWNrZXQgaWYKKyAqIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLiBUaGF0IGlzIHRoZSBzYW1lIHZhbHVlIGFzIHdoYXQgd291bGQgYmUKKyAqIHJldHVybmVkIGJ5IGFuaUFzZlBhY2tldEdldExlbi4KKyAqLworaW50CithbmlBc2ZQYWNrZXRHZXRCeXRlc0Zyb21UYWlsKHRBbmlQYWNrZXQgKnBhY2tldCwgdl9VOF90ICoqcmF3Qnl0ZXNQdHIpCit7CisgICAgaWYgKHBhY2tldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQU5JX0VfTlVMTF9WQUxVRTsKKworICAgICpyYXdCeXRlc1B0ciA9IHBhY2tldC0+dGFpbDsKKyAgICByZXR1cm4gMDsgLy8gVGhlIGxlbmd0aCBvZiB1c2VkIGJ5dGVzIHJldHVybmVkIGlzIHplcm8KK30KKwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcFJzbkFzZlBhY2tldC5oIGIvQ09SRS9CQVAvc3JjL2JhcFJzbkFzZlBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTkzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYmFwUnNuQXNmUGFja2V0LmgKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogV29vZHNpZGUgTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEZpbGU6ICRGaWxlOiAvL2RlcG90L3NvZnR3YXJlL3Byb2plY3RzL2ZlYXR1cmVfYnJhbmNoZXMvbm92YV9waGFzZTEvYXAvYXBwcy9pbmNsdWRlL2FuaUFzZlBhY2tldC5oICQKKyAqIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBmb3IgcGFja2V0IG1hbmlwdWxhdGlvbiByb3V0aW5lcyB0aGF0IG1ha2UgaXQKKyAqIGVhc3kgdG8gY3JlYXRlIGFuZCBwYXJzZSBtdWx0aS1sYXllcmVkIG5ldHdvcmsgZnJhbWVzLiBUaGlzIG1vZHVsZQorICogbWluaW1pemVzIGJ1ZmZlciBjb3BpZXMgd2hpbGUgYWRkaW5nIG9yIHJlbW92aW5nIGhlYWRlcnMsIGFuZAorICogYWRkaW5nIG9yIHJlbW92aW5nIHBheWxvYWQuCisgKgorICogQXV0aG9yOiAgICAgIE1heWFuayBELiBVcGFkaHlheQorICogRGF0ZTogICAgICAgIDE5LUp1bmUtMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgTW9kaWZpZWQgYnkgICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaWZuZGVmIF9BTklfQVNGX1BBQ0tFVF9IXworI2RlZmluZSBfQU5JX0FTRl9QQUNLRVRfSF8KKworI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgInBhbFR5cGVzLmgiCisKKyNkZWZpbmUgQU5JX0VUSF9GUkFNRV9MRU4gMTUxNgorI2RlZmluZSBBTklfREVGQVVMVF9QQUNLRVRfU0laRSAoQU5JX0VUSF9GUkFNRV9MRU4qMikKKworLyoqCisgKiBPcGFxdWUgcGFja2V0IHN0cnVjdHVyZSB3aXRoIGludGVybmFsIHN0b3JhZ2UgZm9yIHJhdyBieXRlcy4KKyAqIENvbmNlcHR1YWxseSwgYSB0UGFja2V0IGlzIGEgcHJlLWFsbG9jYXRlZCBidWZmZXIgdGhhdCBjb250YWlucworICogZGF0YSBpbiB0aGUgbWlkZGxlIGFuZCBmcmVlIHNwYWNlIG9uIGVpdGhlciBzaWRlLiBUaGUgc3RhcnQgb2YgdGhlCisgKiBkYXRhIGlzIGNhbGxlZCB0aGUgaGVhZC4gUm91dGluZXMgYXJlIHByb3ZpZGVkIHRvIGFkZCBkYXRhIGF0IHRoZQorICogZnJvbnQgb3IgYXQgdGhlIHJlYXIuIFRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBpcyB0aGUgdG90YWwgbnVtYmVyCisgKiBvZiB2YWxpZCBkYXRhIGJ5dGVzIGNvbnRhaW5lZCBpbiBpdC4gVGhlIHNpemUgb2YgdGhlIHBhY2tldCBpcyB0aGUKKyAqIHRvdGFsIG51bWJlciBvZiBwcmVhbGxvY2F0ZWQgYnl0ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHRBbmlQYWNrZXQgdEFuaVBhY2tldDsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRBbGxvY2F0ZQorICoKKyAqIEZVTkNUSU9OOgorICogQ3JlYXRlIGEgcGFja2V0IG9mIHNpemUgMipBTklfREVGQVVMVF9QQUNLRVRfU0laRSBhbmQgcG9zaXRpb25zIHRoZQorICogaGVhZCBvZiB0aGUgcGFja2V0IGluIHRoZSBjZW50ZXIuIFRoZSBhbGxvY2F0ZWQgc3RvcmFnZSBjYW4gYmUgZnJlZQorICogd2l0aCBhIGNhbGwgdG8gYW5pQXNmUGFja2V0RnJlZS4KKyAqCisgKiBMT0dJQzoKKyAqIEFsbG9jYXRlcyBzdG9yYWdlIGZvciB0UGFja2V0IGFuZCBpdHMgaW50ZXJuYWwgcmF3IGRhdGEKKyAqIGJ1ZmZlci4gUG9zaXRpb25zIHRoZSBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzIGluIHRoZSBtaWRkbGUgb2YgdGhlCisgKiByYXcgZGF0YSBidWZmZXIuCisgKgorICogQHBhcmFtIHBhY2tldFB0ciBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gbmV3bHkgYWxsb2NhdGVkCisgKiB0UGFja2V0IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMuCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkczsgQU5JX0VfTUFMTE9DX0ZBSUxFRCBpZgorICogbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgKiBAc2VlIGFuaUFzZlBhY2tldEZyZWUKKyAqLworaW50CithbmlBc2ZQYWNrZXRBbGxvY2F0ZSh0QW5pUGFja2V0ICoqcGFja2V0UHRyKTsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXREdXBsaWNhdGUKKyAqCisgKiBEdXBsaWNhdGVzIGEgZ2l2ZW4gcGFja2V0IGV4YWN0bHkuIFRoYXQgaXMsIHRoZSBjb250ZW50cywgdGhlIHNpemUKKyAqIG9mIHRoZSBwYWNrZXQsIGFuZCB0aGUgcG9zaXRpb25zIG9mIHRoZSBwb2ludGVycyBhcmUgbWFpbnRhaW5lZCBpbgorICogdGhlIG5ldyBjb3B5LgorICoKKyAqIEBwYXJhbSBuZXdQYWNrZXRQdHIgaXMgc2V0IHRvIGEgbmV3bHkgYWxsb2NhdGVkIHBhY2tldCB0aGF0IGlzIGEKKyAqIGR1cGxpY2F0ZSBvZiBvbGRQYWNrZXQKKyAqIEBwYXJhbSBvbGRQYWNrZXQgdGhlIG9yaWdpbmFsIHBhY2tldCB0aGF0IHNob3VsZCBiZSBkdXBsaWNhdGVkCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUFzZlBhY2tldER1cGxpY2F0ZSh0QW5pUGFja2V0ICoqbmV3UGFja2V0UHRyLCB0QW5pUGFja2V0ICpvbGRQYWNrZXQpOworCisvKioKKyAqIGFuaUFzZlBhY2tldEFsbG9jYXRlRXhwbGljaXQKKyAqCisgKiBGVU5DVElPTjoKKyAqIENyZWF0ZSBhIHBhY2tldCBvZiB0aGUgZGVzaXJlZCBzaXplIGFuZCBwb3NpdGlvbiB0aGUgaGVhZCBvZiB0aGUKKyAqIHBhY2tldCBhdCB0aGUgZGVzaXJlZCBvZmZzZXQgaW4gdGhlIGludGVybmFsIHJhdyBkYXRhIGJ1ZmZlci4gQW4KKyAqIGFwcGxpY2F0aW9uIHdvdWxkIG5vcm1hbGx5IHNldCB0aGlzIG9mZnNldCB0byB0aGUgZXhwZWN0ZWQgbGVuZ3RoCisgKiBvZiB0aGUgcHJvdG9jb2wgaGVhZGVyLCB0aGVuIGFwcGVuZCB0aGUgcGF5bG9hZCwgYW5kIGZpbmFsbHksCisgKiBwcmVwZW5kIHRoZSBoZWFkZXIuIFRoZSBhbGxvY2F0ZWQgc3RvcmFnZSBjYW4gYmUgZnJlZSB3aXRoIGEgY2FsbAorICogdG8gYW5pQXNmUGFja2V0RnJlZS4KKyAqCisgKiBMT0dJQzoKKyAqIEFsbG9jYXRlcyBzdG9yYWdlIGZvciB0UGFja2V0IGFuZCBpdHMgaW50ZXJuYWwgcmF3IGRhdGEKKyAqIGJ1ZmZlci4gUG9zaXRpb25zIHRoZSBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzIGF0IHRoZSBnaXZlbiBvZmZzZXQgaW4KKyAqIHRoZSBpbnRlcm5hbCByYXcgZGF0YSBidWZmZXIuCisgKgorICogQHBhcmFtIHBhY2tldFB0ciBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gbmV3bHkgYWxsb2NhdGVkCisgKiB0UGFja2V0IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMuCisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgcmF3IGRhdGEgYnVmZmVyCisgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIGludGVybmFsIHJhdyBkYXRhIGJ1ZmZlciB3aGVyZSB0aGUKKyAqIGhlYWQgb2YgdGhlIHBhY2tldCB3aWxsIGJlIHBvc2l0aW9uZWQgaW5pdGlhbGx5CisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkczsgQU5JX0VfTUFMTE9DX0ZBSUxFRCBpZgorICogbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgKiBAc2VlIGFuaUFzZlBhY2tldEZyZWUKKyAqLworaW50CithbmlBc2ZQYWNrZXRBbGxvY2F0ZUV4cGxpY2l0KHRBbmlQYWNrZXQgKipwYWNrZXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBvZmZzZXQpOworCisvKioKKyAqIGFuaUFzZlBhY2tldEZyZWUKKyAqCisgKiBGVU5DVElPTjoKKyAqIEZyZWUgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCB0UGFja2V0IGFuZCBpdHMgaW50ZXJuYWwgcmF3IGRhdGEKKyAqIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gZnJlZQorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHM7IEFOSV9FX05VTExfVkFMVUUgaWYgYW4KKyAqIHVuZXhwZWN0ZWQgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkCisgKi8KK2ludAorYW5pQXNmUGFja2V0RnJlZSh0QW5pUGFja2V0ICpwYWNrZXQpOworCisvKioKKyAqIGFuaUFzZlBhY2tldDJTdHIKKyAqCisgKiBGVU5DVElPTjoKKyAqIFJldHVybnMgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZQorICogcGFja2V0LiAKKyAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0YXRpYyBidWZmZXIgdXNlZCBieSBhbmlBc2ZIZXhTdHIuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHdob3NlIGNvbnRlbnRzIG5lZWQgdG8gYmUgcHJpbnRlZAorICovCit2X1U4X3QgKmFuaUFzZlBhY2tldDJTdHIodEFuaVBhY2tldCAqcGFja2V0KTsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIKKyAqCisgKiBGVU5DVElPTjoKKyAqIEFwcGVuZHMgdGhlIGRhdGEgY29udGFpbmVkIGluIGJ1ZiB0byB0aGUgZW5kIG9mIHRoZSBkYXRhIGluCisgKiBkZXN0UGFja2V0LiBUaGUgaGVhZCBvZiBkZXN0UGFja2V0IHJlbWFpbnMgdW5jaGFuZ2VkLCB3aGlsZSBpdHMKKyAqIGxlbmd0aCBpbmNyZWFzZXMgYnkgbGVuLgorICoKKyAqIElmIHRoZXJlIGlzbid0IGVub3VnaCBmcmVlIHNwYWNlIGluIGRlc3RQYWNrZXQgZm9yIGFsbCBsZW4gYnl0ZXMKKyAqIHRoZW4gdGhlIHJvdXRpbmUgZmFpbHMgYW5kIHRoZSBsZW5ndGggb2YgZGVzdFBhY2tldCByZW1haW5zCisgKiB1bmNoYW5nZWQuCisgKgorICogTE9HSUM6CisgKiBDaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBmcmVlIHNwYWNlIGluIHRoZSBwYWNrZXQgdG8gYXBwZW5kIHRoZQorICogYnVmZmVyLiBJZiBub3QsIGJhaWwuIE90aGVyd2lzZSwgY29weSBieXRlcyBmcm9tIHRoZSBidWZmZXIgaW50bworICogdGhlIHBhY2tldCdzIGludGVybmFsIHJhdyBkYXRhIGJ1ZmZlciBhbmQgaW5jcmVhc2UgdGhlIHZhbHVlIG9mIGl0cworICogbGVuZ3RoIHRvIHJlZmxlY3QgdGhpcy4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gYXBwZW5kIHRvCisgKiBAcGFyYW0gYnVmIHRoZSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBwYWNrZXQKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBhcHBlbmQKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzOyBBTklfRV9GQUlMRUQgaWYgdGhlCisgKiBwYWNrZXQgZG9lcyBub3QgaGF2ZSBlbm91Z2ggZnJlZSBzcGFjZSBmb3IgdGhlIGNvbXBsZXRlIGJ1ZmZlcgorICogQHNlZSBhbmlBc2ZQYWNrZXRQcmVwZW5kQnVmZmVyCisgKi8KK2ludAorYW5pQXNmUGFja2V0QXBwZW5kQnVmZmVyKHRBbmlQYWNrZXQgKmRlc3RQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdl9VOF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBsZW4pOworCisvKioKKyAqIGFuaUFzZlBhY2tldFByZXBlbmRCdWZmZXIKKyAqCisgKiBGVU5DVElPTjoKKyAqIFByZXBlbmRzIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiBidWYgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIGluCisgKiBkZXN0UGFja2V0LiBUaGUgaGVhZCBvZiBkZXN0UGFja2V0IGlzIHJlcG9zaXRpb25lZCBhbmQgdGhlIGxlbmd0aAorICogb2YgZGVzdFBhY2tldCBpbmNyZWFzZXMgYnkgbGVuLgorICoKKyAqIElmIHRoZXJlIGlzbid0IGVub3VnaCBmcmVlIHNwYWNlIGluIGRlc3RQYWNrZXQgZm9yIGFsbCBsZW4gYnl0ZXMKKyAqIHRoZW4gdGhlIHJvdXRpbmUgZmFpbHMgYW5kIHRoZSBsZW5ndGggb2YgZGVzdFBhY2tldCByZW1haW5zCisgKiB1bmNoYW5nZWQuCisgKgorICogTE9HSUM6CisgKiBDaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBmcmVlIHNwYWNlIGluIHRoZSBwYWNrZXQgdG8gcHJlcGVuZCB0aGUKKyAqIGJ1ZmZlci4gSWYgbm90LCBiYWlsLiBPdGhlcndpc2UsIGNvcHkgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyIGludG8KKyAqIHRoZSBwYWNrZXQncyBpbnRlcm5hbCByYXcgZGF0YSBidWZmZXIgYW5kIGluY3JlYXNlIHRoZSB2YWx1ZSBvZiBpdHMKKyAqIGxlbmd0aCB0byByZWZsZWN0IHRoaXMuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHByZXBlbmQgdG8KKyAqIEBwYXJhbSBidWYgdGhlIGJ1ZmZlciBjb250YWluaW5nIGRhdGEgdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSBwYWNrZXQKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBwcmVwZW5kCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkczsgQU5JX0VfRkFJTEVEIGlmIHRoZQorICogcGFja2V0IGRvZXMgbm90IGhhdmUgZW5vdWdoIGZyZWUgc3BhY2UgZm9yIHRoZSBjb21wbGV0ZSBidWZmZXIKKyAqIEBzZWUgYW5pQXNmUGFja2V0QXBwZW5kQnVmZmVyCisgKi8KK2ludAorYW5pQXNmUGFja2V0UHJlcGVuZEJ1ZmZlcih0QW5pUGFja2V0ICpkZXN0UGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2X1U4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBsZW4pOworCisvKioKKyAqIGFuaUFzZlBhY2tldENhbkFwcGVuZEJ1ZmZlcgorICoKKyAqIEZVTkNUSU9OOgorICogRGV0ZXJtaW5lcyBpZiBsZW4gYnl0ZXMgY2FuIGJlIHNhZmVseSBhcHBlbmRlZCB0byBkZXN0UGFja2V0CisgKiB3aXRob3V0IG92ZXJmbG93aW5nLgorICoKKyAqIExPR0lDOgorICogQ3VycmVudCBwYWNrZXQgdGFpbCBwbHVzIGxlbiBvZiBidWZmZXIgc2hvdWxkIG5vdCBleGNlZWQgcGFja2V0CisgKiBzdGFydCBwbHVzIHBhY2tldCBzaXplCisgKgorICogTm90ZTogVGhpcyBkb2VzIG5vdCByZXR1cm4gYSBib29sZWFuIHZhbHVlLCBidXQgaW5zdGVhZCBhbiBpbnRlZ2VyCisgKiBjb2RlLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byBhcHBlbmQgdG8KKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBhcHBlbmQKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgYXBwZW5kIG9wZXJhdGlvbiB3b3VsZCBzdWNjZWVkOyBBTklfRV9GQUlMRUQKKyAqIG90aGVyd2lzZQorICovCitpbnQKK2FuaUFzZlBhY2tldENhbkFwcGVuZEJ1ZmZlcih0QW5pUGFja2V0ICpkZXN0UGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbGVuKTsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRDYW5QcmVwZW5kQnVmZmVyCisgKgorICogRlVOQ1RJT046CisgKiBEZXRlcm1pbmVzIGlmIGxlbiBieXRlcyBjYW4gYmUgc2FmZWx5IHByZXBlbmRlZCB0byBkZXN0UGFja2V0CisgKiB3aXRob3V0IG92ZXJmbG93aW5nLgorICoKKyAqIExPR0lDOgorICogQ3VycmVudCBwYWNrZXQgaGVhZCBtaW51cyBsZW4gb2YgYnVmZmVyIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuCisgKiBzdGFydCBvZiBwYWNrZXQuCisgKgorICogTm90ZTogVGhpcyBkb2VzIG5vdCByZXR1cm4gYSBib29sZWFuIHZhbHVlLCBidXQgaW5zdGVhZCBhbiBpbnRlZ2VyCisgKiBjb2RlLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byBwcmVwZW5kIHRvCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcHJlcGVuZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBhcHBlbmQgb3BlcmF0aW9uIHdvdWxkIHN1Y2NlZWQ7IEFOSV9FX0ZBSUxFRAorICogb3RoZXJ3aXNlCisgKi8KK2ludAorYW5pQXNmUGFja2V0Q2FuUHJlcGVuZEJ1ZmZlcih0QW5pUGFja2V0ICpkZXN0UGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IGxlbik7CisKKy8qKgorICogYW5pQXNmUGFja2V0VHJ1bmNhdGVGcm9tRnJvbnQKKyAqCisgKiBGVU5DVElPTjoKKyAqIFJlbW92ZXMgbGVuIGJ5dGVzIGZyb20gdGhlIGZyb250IG9mIHRoZSBwYWNrZXQgYnkgbW92aW5nIGl0cworICogaGVhZC4gVGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGlzIGRlY3JlbWVudGVkIGJ5IGxlbi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gdHJ1bmNhdGUgZnJvbSB0aGUgZnJvbnQKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byB0cnVuY2F0ZQorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBhcHBlbmQgb3BlcmF0aW9uIHdvdWxkIHN1Y2NlZWQ7IEFOSV9FX0ZBSUxFRAorICogb3RoZXJ3aXNlCisgKi8KK2ludAorYW5pQXNmUGFja2V0VHJ1bmNhdGVGcm9tRnJvbnQodEFuaVBhY2tldCAqcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBsZW4pOworCisvKioKKyAqIGFuaUFzZlBhY2tldFRydW5jYXRlRnJvbVJlYXIKKyAqCisgKiBGVU5DVElPTjoKKyAqIFJlbW92ZXMgbGVuIGJ5dGVzIGZyb20gdGhlIHJlYXIgb2YgdGhlIHBhY2tldCBieSBtb3ZpbmcgaXRzCisgKiB0YWlsLiBUaGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgaXMgZGVjcmVtZW50ZWQgYnkgbGVuLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byB0cnVuY2F0ZSBmcm9tIHRoZSByZWFyCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJ1bmNhdGUKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgYXBwZW5kIG9wZXJhdGlvbiB3b3VsZCBzdWNjZWVkOyBBTklfRV9GQUlMRUQKKyAqIG90aGVyd2lzZQorICovCitpbnQKK2FuaUFzZlBhY2tldFRydW5jYXRlRnJvbVJlYXIodEFuaVBhY2tldCAqcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IGxlbik7CisKKy8qKgorICogYW5pQXNmUGFja2V0R2V0TGVuCisgKgorICogRlVOQ1RJT046CisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsaWQgZGF0YSBieXRlcyBzdG9yZWQgaW4gdGhlIHBhY2tldC4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgd2hvc2UgbGVuIHdlIG5lZWQKKyAqCisgKiBAcmV0dXJuIHRoZSBub24tbmVnYXRpdmUgbnVtYmVyIG9mIGJ5dGVzIHN0b3JlZCBpbiB0aGUgcGFja2V0CisgKi8KK2ludAorYW5pQXNmUGFja2V0R2V0TGVuKHRBbmlQYWNrZXQgKnBhY2tldCk7CisKKy8qKgorICogYW5pQXNmUGFja2V0R2V0Qnl0ZXMKKyAqCisgKiBGVU5DVElPTjoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBoZWFkIG9mIHRoZSB2YWxpZCBkYXRhIHN0b3JlZCBpbiB0aGUKKyAqIHBhY2tldC4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgd2hvc2UgYnl0ZXMgd2UgbmVlZAorICogQHBhcmFtIHJhd0J5dGVzUHRyIHRoZSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdGhlIHN0YXJ0IG9mIHRoZQorICogcmF3IGJ5dGVzLgorICoKKyAqIEByZXR1cm4gVGhlIG5vbi1uZWdhdGl2ZSBudW1iZXIgb2YgYnl0ZXMgc3RvcmVkIGluIHRoZSBwYWNrZXQgaWYKKyAqIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLiBUaGF0IGlzIHRoZSBzYW1lIHZhbHVlIGFzIHdoYXQgd291bGQgYmUKKyAqIHJldHVybmVkIGJ5IGFuaUFzZlBhY2tldEdldExlbi4KKyAqLworaW50CithbmlBc2ZQYWNrZXRHZXRCeXRlcyh0QW5pUGFja2V0ICpwYWNrZXQsIHZfVThfdCAqKnJhd0J5dGVzUHRyKTsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRHZXROCisgKgorICogUmV0dXJucyBOIGJ5dGVzIGZyb20gdGhlIHBhY2tldCBhbmQgbW92ZXMgdGhlIGhlYWQgb2YgdGhlIHBhY2tldAorICogYmV5b25kIHRob3NlIGJ5dGVzLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byByZWFkIGZyb20KKyAqIEBwYXJhbSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQHBhcmFtIGJ5dGVzUHRyIGlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIG9jdGV0cworICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHM7IEFOSV9FX1NIT1JUX1BBQ0tFVCBpZiB0aGUKKyAqIHBhY2tldCBkb2VzIG5vdCBoYXZlIG4gYnl0ZXMuCisgKi8KK2ludAorYW5pQXNmUGFja2V0R2V0Tih0QW5pUGFja2V0ICpwYWNrZXQsIGludCBuLCB2X1U4X3QgKipieXRlc1B0cik7CisKKy8qKgorICogYW5pQXNmUGFja2V0RW1wdHkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFJlLWluaXRpYWxpemVzIHRoZSBwYWNrZXQgYnkgcG9zaXRpb25pbmcgdGhlIGhlYWQgdG8gdGhlIG1pZGRsZSBhbmQKKyAqIHNldHRpbmcgdGhlIGxlbmd0aCB0byB6ZXJvLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byBlbXB0eQorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkCisgKi8KK2ludAorYW5pQXNmUGFja2V0RW1wdHkodEFuaVBhY2tldCAqcGFja2V0KTsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRFbXB0eUV4cGxpY2l0CisgKgorICogRlVOQ1RJT046CisgKiBSZS1pbml0aWFsaXplcyB0aGUgcGFja2V0IGJ5IHBvc2l0aW9uaW5nIHRoZSBoZWFkIHRvIHRoZSBkZXNpcmVkCisgKiBvZmZzZXQgYW5kIHNldHRpbmcgdGhlIGxlbmd0aCB0byB6ZXJvLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byBlbXB0eQorICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRoYXQgdGhlIGhlYWQgb2YgdGhlIHBhY2tldCBzaG91bGQgYmUgc2V0CisgKiB0by4gQW4gYXBwbGljYXRpb24gd2lsbCBiZSBhYmxlIHRvIHByZXBlbmQgYW5kIGFwcGVuZCBkYXRhIHJlbGF0aXZlCisgKiB0byB0aGlzIG9mZnNldC4KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZAorICovCitpbnQKK2FuaUFzZlBhY2tldEVtcHR5RXhwbGljaXQodEFuaVBhY2tldCAqcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG9mZnNldCk7CisKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRQcmVwZW5kSGRyCisgKgorICogRlVOQ1RJT046CisgKiBQcmVwZW5kcyBhIHRBbmlIZHIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuICBBbGwgaG9zdCB0byBuZXR3b3JrCisgKiBieXRlIG9yZGVyIHRyYW5zbGF0aW9uIGlzIGFsc28gdGFrZW4gY2FyZSBvZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSBtc2dUeXBlIHRoZSBtZXNzYWdlIHR5cGUgdG8gd3JpdGUgYXMgcGFydCBvZiB0aGUgaGVhZGVyCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUFzZlBhY2tldFByZXBlbmRIZHIodEFuaVBhY2tldCAqcGFja2V0LCB2X1UxNl90IG1zZ1R5cGUpOworCisvKioKKyAqIGFuaUFzZlBhY2tldEdldDMyCisgKgorICogRlVOQ1RJT046CisgKiBSZWFkcyBhIEFOSV9VMzIgb3V0IG9mIHRoZSBwYWNrZXQgYW5kIHJldHVybnMgaXQuIFRoZSBwYWNrZXQncyBoZWFkCisgKiBpcyBhZHZhbmNlZCBhbmQgaXRzIGxlbmd0aCBkZWNyZW1lbnRlZCBieSB0aGUgYXBwcm9wcmlhdGUgbGVuZ3RoLgorICogQWxsIG5ldHdvcmsgdG8gaG9zdCBieXRlIG9yZGVyIHRyYW5zbGF0aW9uIGlzIGFsc28gdGFrZW4gY2FyZSBvZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byBmaWxsIGluCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUFzZlBhY2tldEdldDMyKHRBbmlQYWNrZXQgKnBhY2tldCwgdl9VMzJfdCAqdmFsKTsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRBcHBlbmQzMgorICoKKyAqIEZVTkNUSU9OOgorICogQXBwZW5kcyBhIEFOSV9VMzIgdG8gdGhlIGVuZCBvZiB0aGUgcGFja2V0LgorICogQWxsIGhvc3QgdG8gbmV0d29yayBieXRlIG9yZGVyIHRyYW5zbGF0aW9uIGlzIGFsc28gdGFrZW4gY2FyZSBvZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIGFwcGVuZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlBc2ZQYWNrZXRBcHBlbmQzMih0QW5pUGFja2V0ICpwYWNrZXQsIHZfVTMyX3QgdmFsKTsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRHZXQxNgorICoKKyAqIEZVTkNUSU9OOgorICogUmVhZHMgYSBBTklfVTE2IG91dCBvZiB0aGUgcGFja2V0IGFuZCByZXR1cm5zIGl0LiBUaGUgcGFja2V0J3MgaGVhZAorICogaXMgYWR2YW5jZWQgYW5kIGl0cyBsZW5ndGggZGVjcmVtZW50ZWQgYnkgdGhlIGFwcHJvcHJpYXRlIGxlbmd0aC4KKyAqIEFsbCBuZXR3b3JrIHRvIGhvc3QgYnl0ZSBvcmRlciB0cmFuc2xhdGlvbiBpcyBhbHNvIHRha2VuIGNhcmUgb2YuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHJlYWQgZnJvbQorICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gZmlsbCBpbgorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlBc2ZQYWNrZXRHZXQxNih0QW5pUGFja2V0ICpwYWNrZXQsIHZfVTE2X3QgKnZhbCk7CisKKy8qKgorICogYW5pQXNmUGFja2V0UHJlcGVuZDE2CisgKgorICogRlVOQ1RJT046CisgKiBQcmVwZW5kcyBhIEFOSV9VMTYgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuCisgKiBBbGwgaG9zdCB0byBuZXR3b3JrIGJ5dGUgb3JkZXIgdHJhbnNsYXRpb24gaXMgYWxzbyB0YWtlbiBjYXJlIG9mLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byB3cml0ZSB0bworICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gcHJlcGVuZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlBc2ZQYWNrZXRQcmVwZW5kMTYodEFuaVBhY2tldCAqcGFja2V0LCB2X1UxNl90IHZhbCk7CisKKy8qKgorICogYW5pQXNmUGFja2V0QXBwZW5kMTYKKyAqCisgKiBGVU5DVElPTjoKKyAqIEFwcGVuZHMgYSBBTklfVTE2IHRvIHRoZSBlbmQgb2YgdGhlIHBhY2tldC4KKyAqIEFsbCBob3N0IHRvIG5ldHdvcmsgYnl0ZSBvcmRlciB0cmFuc2xhdGlvbiBpcyBhbHNvIHRha2VuIGNhcmUgb2YuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byBhcHBlbmQKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYW5pQXNmUGFja2V0QXBwZW5kMTYodEFuaVBhY2tldCAqcGFja2V0LCB2X1UxNl90IHZhbCk7CisKKy8qKgorICogYW5pQXNmUGFja2V0R2V0OAorICoKKyAqIEZVTkNUSU9OOgorICogUmVhZHMgYSBBTklfVTggb3V0IG9mIHRoZSBwYWNrZXQgYW5kIHJldHVybnMgaXQuIFRoZSBwYWNrZXQncyBoZWFkCisgKiBpcyBhZHZhbmNlZCBhbmQgaXRzIGxlbmd0aCBkZWNyZW1lbnRlZCBieSB0aGUgYXBwcm9wcmlhdGUgbGVuZ3RoLgorICogQWxsIG5ldHdvcmsgdG8gaG9zdCBieXRlIG9yZGVyIHRyYW5zbGF0aW9uIGlzIGFsc28gdGFrZW4gY2FyZSBvZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byBmaWxsIGluCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUFzZlBhY2tldEdldDgodEFuaVBhY2tldCAqcGFja2V0LCB2X1U4X3QgKnZhbCk7CisKKy8qKgorICogYW5pQXNmUGFja2V0UHJlcGVuZDgKKyAqCisgKiBGVU5DVElPTjoKKyAqIFByZXBlbmRzIGEgQU5JX1U4IHRvIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0LgorICogQWxsIGhvc3QgdG8gbmV0d29yayBieXRlIG9yZGVyIHRyYW5zbGF0aW9uIGlzIGFsc28gdGFrZW4gY2FyZSBvZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byBwcmVwZW5kCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUFzZlBhY2tldFByZXBlbmQ4KHRBbmlQYWNrZXQgKnBhY2tldCwgdl9VOF90IHZhbCk7CisKKy8qKgorICogYW5pQXNmUGFja2V0QXBwZW5kOAorICoKKyAqIEZVTkNUSU9OOgorICogQXBwZW5kcyBhIEFOSV9VOCB0byB0aGUgZW5kIG9mIHRoZSBwYWNrZXQuCisgKiBBbGwgaG9zdCB0byBuZXR3b3JrIGJ5dGUgb3JkZXIgdHJhbnNsYXRpb24gaXMgYWxzbyB0YWtlbiBjYXJlIG9mLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byB3cml0ZSB0bworICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gYXBwZW5kCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUFzZlBhY2tldEFwcGVuZDgodEFuaVBhY2tldCAqcGFja2V0LCB2X1U4X3QgdmFsKTsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRHZXRNYWMKKyAqCisgKiBGVU5DVElPTjoKKyAqIFJldHVybnMgYSB0QW5pTWFjQWRkciBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0LgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byByZWFkIGZyb20KKyAqIEBwYXJhbSBtYWNBZGRyIHRoZSBkZXN0aW5hdGlvbiB0byBjb3B5IHRoZSBNQUMgYWRkcmVzcyB0bworICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMuIEFsc28sIHRoZSBwYWNrZXQgaGVhZAorICogcG9pbnRlciBpcyBhZHZhbmNlZCBwYXN0IHRoZSBNQUMgYWRkcmVzcy4KKyAqLworaW50CithbmlBc2ZQYWNrZXRHZXRNYWModEFuaVBhY2tldCAqcGFja2V0LCB0QW5pTWFjQWRkciBtYWNBZGRyKTsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRNb3ZlTGVmdAorICoKKyAqIEZVTkNUSU9OOgorICogUHJldGVuZHMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIGhhdmUgYmVlbiBwcmVwZW5kZWQgdG8gdGhlCisgKiBwYWNrZXQsIHdpdGhvdXQgYWN0dWFsbHkgY29weWluZyBhbnkgYnl0ZXMgaW4uIFRoZSBwYWNrZXQgaGVhZCBhbmQKKyAqIGxlbmd0aCBhcmUgYXBwcm9wcmlhdGVseSBjaGFuZ2VkLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGlsZQorICogaW50ZXJmYWNpbmcgd2l0aCBvdGhlciBsaWJyYXJpZXMgdGhhdCBvbmx5IHN1cHBvcnQgYnl0ZSBhcnJheQorICogbWFuaXB1bGF0aW9uLgorICoKKyAqIFdBUk5JTkc6IAorICogQXBwbGljYXRpb25zIGFyZSBkaXNjb3VyYWdlZCBmcm9tIHVzaW5nIHRoaXMgZnVuY3Rpb24KKyAqIGJlY2F1c2UgY29ycmVjdCB1c2FnZSBpcyBhIHR3by1zdGVwIHByb2Nlc3MgLSBvbmU6IGNvcHkgc29tZSBieXRlcworICogdG8gdGhlIHBhY2tldCdzIGludGVybmFsIGJ1ZmZlciwgdHdvOiBtb3ZlIGhlYWQgYW5kIGxlbmd0aC4gVGhpcworICogdmlvbGF0ZXMgdGhlIGVuY2Fwc3VsYXRpb24gdGhlIHBhY2tldCBsaWJyYXJ5IGFpbXMgdG8gcHJvdmlkZS4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgd2hvc2UgaGVhZCBhbmQgbGVuZ3RoIG5lZWRzIHRvIGJlIG1vZGlmaWVkCisgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiBieXRlcyB0byBtb2RpZnkgYnkKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYW5pQXNmUGFja2V0TW92ZUxlZnQodEFuaVBhY2tldCAqcGFja2V0LCB2X1UzMl90IGNvdW50KTsKKworLyoqCisgKiBhbmlBc2ZQYWNrZXRNb3ZlUmlnaHQKKyAqCisgKiBGVU5DVElPTjoKKyAqIFByZXRlbmRzIHRoYXQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBoYXZlIGJlZW4gYXBwZW5kZWQgdG8gdGhlCisgKiBwYWNrZXQsIHdpdGhvdXQgYWN0dWFsbHkgY29weWluZyBhbnkgYnl0ZXMgaW4uIFRoZSBwYWNrZXQgdGFpbCBhbmQKKyAqIGxlbmd0aCBhcmUgYXBwcm9wcmlhdGVseSBjaGFuZ2VkLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGlsZQorICogaW50ZXJmYWNpbmcgd2l0aCBvdGhlciBsaWJyYXJpZXMgdGhhdCBvbmx5IHN1cHBvcnQgYnl0ZSBhcnJheQorICogbWFuaXB1bGF0aW9uLgorICoKKyAqIFdBUk5JTkc6IAorICogQXBwbGljYXRpb25zIGFyZSBkaXNjb3VyYWdlZCBmcm9tIHVzaW5nIHRoaXMgZnVuY3Rpb24KKyAqIGJlY2F1c2UgY29ycmVjdCB1c2FnZSBpcyBhIHR3by1zdGVwIHByb2Nlc3MgLSBvbmU6IGNvcHkgc29tZSBieXRlcworICogdG8gdGhlIHBhY2tldCdzIGludGVybmFsIGJ1ZmZlciwgdHdvOiBtb3ZlIHRhaWwgYW5kIGxlbmd0aC4gVGhpcworICogdmlvbGF0ZXMgdGhlIGVuY2Fwc3VsYXRpb24gdGhlIHBhY2tldCBsaWJyYXJ5IGFpbXMgdG8gcHJvdmlkZS4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgd2hvc2UgaGVhZCBhbmQgbGVuZ3RoIG5lZWRzIHRvIGJlIG1vZGlmaWVkCisgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiBieXRlcyB0byBtb2RpZnkgYnkKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYW5pQXNmUGFja2V0TW92ZVJpZ2h0KHRBbmlQYWNrZXQgKnBhY2tldCwgdl9VMzJfdCBjb3VudCk7CisKKy8qKgorICogYW5pQXNmUGFja2V0R2V0Qnl0ZXNGcm9tVGFpbAorICoKKyAqIEZVTkNUSU9OOgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHRhaWwgb2YgdGhlIHZhbGlkIGRhdGEgc3RvcmVkIAorICogaW4gdGhlIHBhY2tldC4KKyAqCisgKiBXQVJOSU5HOiAKKyAqIEFwcGxpY2F0aW9ucyBhcmUgZGlzY291cmFnZWQgZnJvbSB1c2luZyB0aGlzIGZ1bmN0aW9uCisgKiBiZWNhdXNlIGNvcnJlY3QgdXNhZ2UgaXMgYSB0aHJlZS1zdGVwIHByb2Nlc3MgLSBvbmU6IGNhbGwgdGhpcworICogcm91dGluZSB0byBvYnRhaW4gYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHRhaWwgb2YgdGhlIHBhY2tldC4gCisgKiB0d286IHRyZWF0IHRoaXMgcmV0dXJuZWQgcG9pbnRlciBsaWtlIGEgc2ltcGxlIGFycmF5IGFuZCBjb3B5IAorICogc29tZSBieXRlcyB0byB0aGUgcGFja2V0J3MgaW50ZXJuYWwgYnVmZmVyLCBhbmQgZmluYWxseSAKKyAqIHRocmVlOiBtb3ZlIHRhaWwgYW5kIGxlbmd0aC4gVGhpcyB2aW9sYXRlcyB0aGUgZW5jYXBzdWxhdGlvbiAKKyAqIHRoZSBwYWNrZXQgbGlicmFyeSBhaW1zIHRvIHByb3ZpZGUuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHdob3NlIGJ5dGVzIHdlIG5lZWQKKyAqIEBwYXJhbSByYXdCeXRlc1B0ciB0aGUgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRoZSBzdGFydCBvZiB0aGUKKyAqIHJhdyBieXRlcy4KKyAqCisgKiBAcmV0dXJuIFRoZSBub24tbmVnYXRpdmUgbnVtYmVyIG9mIGJ5dGVzIHN0b3JlZCBpbiB0aGUgcGFja2V0IGlmCisgKiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4gVGhhdCBpcyB0aGUgc2FtZSB2YWx1ZSBhcyB3aGF0IHdvdWxkIGJlCisgKiByZXR1cm5lZCBieSBhbmlBc2ZQYWNrZXRHZXRMZW4uCisgKi8KK2ludAorYW5pQXNmUGFja2V0R2V0Qnl0ZXNGcm9tVGFpbCh0QW5pUGFja2V0ICpwYWNrZXQsIHZfVThfdCAqKnJhd0J5dGVzUHRyKTsKKworCisjZW5kaWYgLy8gX0FOSV9BU0ZfUEFDS0VUX0hfCmRpZmYgLS1naXQgYS9DT1JFL0JBUC9zcmMvYmFwUnNuRXJyb3JzLmggYi9DT1JFL0JBUC9zcmMvYmFwUnNuRXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhNmQ1OQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvQkFQL3NyYy9iYXBSc25FcnJvcnMuaApAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBXb29kc2lkZSBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRmlsZTogJEZpbGU6IC8vZGVwb3Qvc29mdHdhcmUvcHJvamVjdHMvZmVhdHVyZV9icmFuY2hlcy9nZW41X3BoYXNlMS9vcy9saW51eC9jbGFzc2ljL2FwL2FwcHMvaW5jbHVkZS9hbmlFcnJvcnMuaCAkCisgKgorICogQ29udGFpbnMgZGVmaW5pdGlvbnMgb2YgZXJyb3IgY29kZXMgdGhhdCBhcmUgZ2xvYmFsbHkgdmlzaWJsZQorICogYWNyb3NzIFdOSSBhcHBsaWNhdGlvbnMuIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgZXJyb3IgY29kZXM6CisgKiBnZW5lcmljIGVycm9yIGNvZGVzIGFuZCBtb2R1bGUgc3BlY2lmaWMgZXJyb3IgY29kZXMuIE1vZHVsZSBzcGVjaWZpYworICogZXJyb3IgY29kZXMgY2FuIGZ1cnRoZXIgYmUgb2YgdHdvIGtpbmRzOiB0aG9zZSB0aGF0IGFyZSB1c2VkCisgKiBpbnRlcm5hbGx5IHdpdGhpbiBzdWItbW9kdWxlcywgYW5kIHRob3NlIHRoYXQgYXJlIG1hZGUgdmlzaWJsZQorICogdG8gb3RoZXIgbW9kdWxlcy4gRWFjaCBtb2R1bGUgd2lsbCBiZSBwcmUtYWxsb2NhdGVkIGEgcmFuZ2Ugb2YKKyAqIG5lZ2F0aXZlIGludGVnZXJzIGZyb20gd2hpY2ggdG8gY2hvb3NlIGJvdGggaW50ZXJuYWwgYW5kIGV4dGVybmFsCisgKiBlcnJvciBjb2RlcyB1bmlxdWVseS4gTm90ZSB0aGF0IGludGVybmFsbHkgdXNlZCBlcnJvciBjb2RlcyBuZWVkCisgKiBub3QgYmUgZGVmaW5lZCBpbiB0aGlzIGZpbGUgc28gbG9uZyBhcyB0aGV5IGFkaGVyZSB0byB0aGUgYWxsb2NhdGVkCisgKiByYW5nZS4KKyAqCisgKiBBdXRob3I6ICAgICAgTWF5YW5rIEQuIFVwYWRoeWF5CisgKiBEYXRlOiAgICAgICAgMTctSnVuZS0yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICBNb2RpZmllZCBieSAgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmbmRlZiBfQU5JX0VSUk9SU19IXworI2RlZmluZSBfQU5JX0VSUk9SU19IXworCisvKioKKyAqIEluZGljYXRlcyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5lZCBzdWNjZXNzZnVsbHkgYW5kIG5vIGVycm9yIHdhcworICogcmVwb3J0ZWQuCisgKi8KKyNkZWZpbmUgQU5JX09LICAgICAgMAorI2RlZmluZSBBTklfRVJST1IgICBBTklfRV9GQUlMRUQKKworLyoqCisgKiBUaGUgcmFuZ2UgLTEgdG8gLTEwMjQgaXMgcmVzZXJ2ZWQgZm9yIGdlbmVyaWMgZXJyb3IgY29kZXMgdGhhdCBhcmUKKyAqIGFwcGxpY2FibGUgdG8gYWxsIG1vZHVsZXMuCisgKi8KKworI2RlZmluZSBBTklfRV9GQUlMRUQgICAgICAgIC0xIC8vLyBHZW5lcmljIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUKKyNkZWZpbmUgQU5JX0VfTUFMTE9DX0ZBSUxFRCAtMiAvLy8gTWVtIGFsbG9jYXRpb24gZmFpbGVkCisjZGVmaW5lIEFOSV9FX0lMTEVHQUxfQVJHICAgLTMgLy8vIEZ1bmN0aW9uIGFyZ3VtZW50IGlzIGlsbGVnYWwKKyNkZWZpbmUgQU5JX0VfTlVMTF9WQUxVRSAgICAtNCAvLy8gRW5jb3VudGVyZWQgdW5leHBlY3RlZCBOVUxMIHZhbHVlCisjZGVmaW5lIEFOSV9FX1JBTkRfRkFJTEVEICAgLTUgLy8vIFJORyBmYWlsZWQKKyNkZWZpbmUgQU5JX0VfU0hPUlRfUEFDS0VUICAtNiAvLy8gUGFja2V0IGlzIHRvbyBzbWFsbCB0byBjb250YWluIGRhdGEKKyNkZWZpbmUgQU5JX0VfRUxFTV9OT1RfRk5EICAtNyAvLy8gRWxlbWVudCBub3QgZm91bmQKKyNkZWZpbmUgQU5JX0VfSU5WQUxJRF9MRU4gICAtOCAvLy8gRWxlbWVudCBoYXMgaW52YWxpZCBMZW5ndGggCisjZGVmaW5lIEFOSV9FX0lOVkFMSURfRFQgICAgLTkgLy8vIEludmFsaWQgRGF0YSBUeXBlIAorI2RlZmluZSBBTklfRV9USU1FT1VUICAgICAgIC0xMCAvLy8gVGltZW91dCBvY2N1cnJlZAorI2RlZmluZSBBTklfRV9EQk1fSU5WQUxJRF9JRCAgICAtMTEgLy8vIEludmFsaWQgREIgaWQgc2VudCB0byBzZXJ2ZXIKKyNkZWZpbmUgQU5JX0VfREJNX0tFWV9OT1RfRk9VTkQgLTEyIC8vLyBLZXkncyBtYXBwaW5nIHdhcyBub3QgZm91bmQKKyNkZWZpbmUgQU5JX0VfRklMRV9FTVBUWSAgICAtMTMgLy8vIGZpbGUgZW1wdHkKKyNkZWZpbmUgQU5JX0VfSU5WQUxJRF9NVCAgICAtMTQgLy8vIEludmFsaWQgQU5JIG1lc3NhZ2UgdHlwZQorI2RlZmluZSBBTklfRV9OT1RfSU1QTEVNRU5URUQgICAtMTUgLy8vIEZlYXR1cmUgbm90IGltcGxlbWVudGVkCisjZGVmaW5lIEFOSV9FX0lOVkFMSURfUFQgICAgLTE2IC8vLyBJbnZhbGlkIFBhcmFtZXRlciBUeXBlIAorI2RlZmluZSBBTklfRV9JTlZBTElEX1BWICAgIC0xNyAvLy8gSW52YWxpZCBQYXJhbXRlciBWYWx1ZQorI2RlZmluZSBBTklfRV9JUENPUEVOICAgIC0xOCAvLy8gSVBDIG9wZW4gZmFpbGVkCisjZGVmaW5lIEFOSV9FX0lQQ0NPTk5FQ1QgICAgLTE5IC8vLyBJUEMgY29ubmVjdCBmYWlsZWQKKyNkZWZpbmUgQU5JX0VfSVBDU0VORCAgICAtMjAgLy8vIElQQyBzZW5kIGZhaWxlZAorI2RlZmluZSBBTklfRV9GSUxFX05PVF9GT1VORCAgICAtMjEgLy8vIGZpbGUgbm90IGZvdW5kCisjZGVmaW5lIEFOSV9FX0ZJTEVfSU5WQUxJRF9DT05URU5UICAgIC0yMiAvLy8gaW52YWxpZCBmaWxlIGNvbnRlbnQKKyNkZWZpbmUgQU5JX0VfRklMRV9SRUFEX0ZBSUxFRCAgICAtMjMgLy8vIGZpbGUgcmVhZCBmYWlsZWQKKworLy8gKioqKiogU1NNIGxpYnJhcmllcyBhbmQgYXBwbGljYXRpb25zIHVzZSB0aGUgcmFuZ2UgLTEwMjUgdG8gLTI5OTkgKioqKioKKworLyoKKyAqIFRoZSByYW5nZSAtMTAyNSB0byAtMjA0OCBpcyByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZQorICogYXV0aGVudGljYXRpb24gYWdlbnQgYW5kIGl0cyBzdWItbW9kdWxlcy4gVGhlIHN1Yi1yYW5nZSAtMTAyOSB0bworICogLTExNTAgaXMgcmVzZXJ2ZWQgZm9yIENMSSB1c2FnZS4KKyAqLworI2RlZmluZSBBTklfRV9SQU5HRV9TVEFSVF9BQUcgICAgICAgICAgICAgICAgICAgLTEwMjUKKworLy8gQ0xJIFJhbmdlIHN0YXJ0cyBoZXJlLi4uCisjZGVmaW5lIEFOSV9FX1JBTkdFX1NUQVJUX0FBR19DTEkgICAgICAgICAgICAgICAtMTAyOQorI2RlZmluZSBBTklfRV9DTElfQVJHX01JU1NJTkcgICAgICAgICAgICAgICAgICAgLTEwMjkgLy8gQ0xJIGNvbW1hbmQgcGFyYW0gbWlzc2luZworI2RlZmluZSBBTklfRV9DTElfQVJHX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgLTEwMzAgLy8gQ0xJIGNvbW1hbmQgcGFyYW0gaW52YWxpZAorI2RlZmluZSBBTklfRV9DTElfUEFNX1JBRElVU19EQl9VUERBVEVfRkFJTFVSRSAgLTEwMzEgLy8gRmFpbHVyZSB0byB1cGRhdGUgUEFNIFJBRElVUyBEQgorI2RlZmluZSBBTklfRV9DTElfQVVUSF9TRVJWRVJfTk9UX0ZPVU5EICAgICAgICAgLTEwMzIgLy8gQXV0aCBzZXJ2ZXIgbm90IGZvdW5kCisjZGVmaW5lIEFOSV9FX0NMSV9TWVNfSU5URVJOQUxfRVJST1JfUEFDS0VUX05VTEwgLTEwMzMgLy8gSW50ZXJuYWwgZXJyb3IKKyNkZWZpbmUgQU5JX0VfQ0xJX0lOVkFMSURfREVWSUNFICAgICAgICAgICAgICAgIC0xMDM0IC8vIEludmFsaWQgZGV2aWNlCisjZGVmaW5lIEFOSV9FX0NMSV9BVVRIX1NFUlZFUl9JTlZBTElEX0lQQUREUiAgICAtMTAzNSAvLyBJbnZhbGlkIElQIGFkZHIKKyNkZWZpbmUgQU5JX0VfQ0xJX0FVVEhfWk9ORV9OT1RfRU1QVFkgICAgICAgICAgIC0xMDM2IC8vIHpvbmUgbm90IGVtcHR5CisjZGVmaW5lIEFOSV9FX0NMSV9BVVRIX1pPTkVfQVVUSF9TRVJWRVJTX05PVF9DT1BJRUQgLTEwMzcgLy8gem9uZSBub3QgY29waWVkCisjZGVmaW5lIEFOSV9FX0NMSV9BVVRIX1pPTkVfTkFNRV9NSVNTSU5HICAgICAgICAtMTAzOCAvLyB6b25lIG5hbWUgbWlzc2luZworI2RlZmluZSBBTklfRV9DTElfQVVUSF9aT05FX0VNUFRZICAgICAgICAgICAgICAgLTEwMzkgLy8gem9uZSBlbXB0eQorI2RlZmluZSBBTklfRV9DTElfQVVUSF9aT05FX05PVF9GT1VORCAgICAgICAgICAgLTEwNDAgLy8gem9uZSBub3QgZm91bmQKKyNkZWZpbmUgQU5JX0VfQ0xJX0FVVEhfU0VSVkVSX0FSR19OT1RfRk9VTkQgICAgIC0xMDQxIC8vIENsaSBBdXRoIHNlcnZlciBhcmcgbWlzc2luZworI2RlZmluZSBBTklfRV9DTElfSUZOQU1FX0FSR19OT1RfRk9VTkQgICAgICAgICAgLTEwNDIgLy8gSWZuYW1lIGFyZyBtaXNzaW5nCisjZGVmaW5lIEFOSV9FX0NMSV9LRVlJTkRFWF9BUkdfTk9UX0ZPVU5EICAgICAgICAtMTA0MyAvLyBLZXlpbmRleCBhcmcgbWlzc2luZworI2RlZmluZSBBTklfRV9DTElfS0VZTEVOR1RIX0FSR19OT1RfRk9VTkQgICAgICAgLTEwNDQgLy8gS2V5TGVuZ3RoIGFyZyBtaXNzaW5nCisjZGVmaW5lIEFOSV9FX0NMSV9LRVlMRU5HVEhfQVJHX0lOVkFMSUQgICAgICAgICAtMTA0NSAvLyBLZXlMZW5ndGggYXJnIGludmFsaWQKKyNkZWZpbmUgQU5JX0VfQ0xJX1NFVF9XRVBfS0VZX0ZBSUxFRCAgICAgICAgICAgIC0xMDQ2IC8vIFNldCBXZXAga2V5IGZhaWxlZAorI2RlZmluZSBBTklfRV9DTElfU1lTX0lOVEVSTkFMX0VSUk9SICAgICAgICAgICAgLTEwNDcgLy8gSW50ZXJuYWwgZXJyb3IKKyNkZWZpbmUgQU5JX0VfQ0xJX09MRF9QQVNTV09SRF9NSVNTSU5HICAgICAgICAgIC0xMDQ4IC8vIE9sZCBwYXNzd29yZCBtaXNzaW5nCisjZGVmaW5lIEFOSV9FX0NMSV9ORVdfUEFTU1dPUkRfTUlTU0lORyAgICAgICAgICAtMTA0OSAvLyBOZXcgcGFzc3dvcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc3NpbmcKKyNkZWZpbmUgQU5JX0VfQ0xJX1dFUF9LRVlfTEVOX0VSUk9SICAgICAgICAgICAgIC0xMDUxIC8vIGtleSBsZW5ndGggZXJyb3IKKyNkZWZpbmUgQU5JX0VfQ0xJX1dFUF9LRVlfSEVYX0VSUk9SICAgICAgICAgICAgIC0xMDUyIC8vIG5vIGhleCBjaGFyYWN0ZXIKKyNkZWZpbmUgQU5JX0VfQ0xJX1dQQV9NT0RFU19DRkdfRVJST1IgICAgICAgICAgIC0xMDUzIC8vIFdQQSBjb25maWcgZXJyb3IKKyNkZWZpbmUgQU5JX0VfQ0xJX1dFUF9BTkRfT1BFTl9DRkdfRVJST1IgICAgICAgIC0xMDU0IC8vIFdFUCBhbmQgb3BlbiBlcnJvcgorI2RlZmluZSBBTklfRV9DTElfT1BFTl9BTkRfV0VQX0NGR19FUlJPUiAgICAgICAgLTEwNTUgLy8gb3BlbiBhbmQgV0VQIGVycm9yCisjZGVmaW5lIEFOSV9FX0NMSV9MRUdBQ1lfV0VQX0FORF9PUEVOX0NGR19FUlJPUiAtMTA1NiAvLyBXRVAgYW5kIG9wZW4gZXJyb3IKKyNkZWZpbmUgQU5JX0VfQ0xJX09QRU5fQU5EX0xFR0FDWV9XRVBfQ0ZHX0VSUk9SIC0xMDU3IC8vIG9wZW4gYW5kIFdFUCBlcnJvcgorI2RlZmluZSBBTklfRV9DTElfV1BBX01PREVTX05PVF9BVkFJTEFCTEUgICAgICAgLTEwNTggLy8gV1BBIG1vZGVzIG5vdCBhY3RpdmUKKyNkZWZpbmUgQU5JX0VfQ0xJX0lOVkFMSURfTElTRU5DRV9LRVkgICAgICAgICAgIC0xMDU5IC8vIGludmFsaWQgbGljZW5zZQorI2RlZmluZSBBTklfRV9DTElfRVhJU1RJTkdfTElTRU5DRV9LRVkgICAgICAgICAgLTEwNjAgLy8gZHVwbGljYXRlZCBsaWNlbnNlCisjZGVmaW5lIEFOSV9FX0NMSV9XRVBfSU5WQUxJRF9MRU5HVEhfQ0hBTkdFICAgICAtMTA2MSAvLyBpbnZhbGlkIGxlbmd0aCBjaGFuZ2UKKyNkZWZpbmUgQU5JX0VfQ0xJX0NORl9QQVNTV09SRF9NSVNNQVRDSCAgICAgICAgIC0xMDYyIC8vIGNvbmZpcm0gcGFzc3dvcmQgbWlzbWF0Y2gKKyNkZWZpbmUgQU5JX0VfQ0xJX0lOVkFMSURfRElTQUJMRSAgICAgICAgICAgICAgIC0xMDYzIC8vIGNhbm5vdCBkaXNhYmxlIGFsbCBzZWMgbW9kZXMKKyNkZWZpbmUgQU5JX0VfQ0xJX1BBQ0tOVU1fUkFOR0VfRVJST1IgICAgICAgICAgIC0xMDY0IC8vIGNhbm5vdCBkaXNhYmxlIGFsbCBzZWMgbW9kZXMKKyNkZWZpbmUgQU5JX0VfQ0xJX0lQX0FERFJfSU5WQUxJRCAgICAgICAgICAgICAgIC0xMDY1IC8vIElQIGFkZHJlc3MgaW52YWxpZAorI2RlZmluZSBBTklfRV9DTElfQVVUSF9aT05FX05BTUVfSU5WQUxJRCAgICAgICAgLTEwNjYgLy8gem9uZSBuYW1lIGludmFsaWQKKyNkZWZpbmUgQU5JX0VfQ0xJX09MRF9QQVNTV09SRF9JTlZBTElEICAgICAgICAgIC0xMDY3IC8vIE9sZCBwYXNzd29yZCBpbnZhbGlkCisjZGVmaW5lIEFOSV9FX0NMSV9OT19FWFRfUkFEX09OX05PTlNFQ1AgICAgICAgICAtMTA2OCAvLyBDYW5ub3QgYWRkIGV4dCBhdXRoLXNlcnZlciBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLVNFQy9QIHdpdGggUkFEIHByb3h5aW5nIG9uCisjZGVmaW5lIEFOSV9FX0NMSV9OT19FWFRfQVVUSF9aT05FX0FMTE9XRUQgICAgICAtMTA2OSAvLyBDYW5ub3QgYWRkIGV4dCBhdXRoLXpvbmUgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggUkFEIHByb3h5aW5nIG9uCisjZGVmaW5lIEFOSV9FX0NMSV9QT1JUQUxfWk9ORV9BVVRPX0NPTkZJR1VSRUQgICAtMTA3MCAvLyBDYW5ub3QgbWFuYWdlIHBvcnRhbCBhdXRoLXpvbmUKKyNkZWZpbmUgQU5JX0VfQ0xJX0RFTF9SRVFfT05fUkVGX0FVVEhfU0VSVkVSICAgIC0xMDcxIC8vIENhbm5vdCBkZWxldGUgYXV0aC1zZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgaXMgaW4gYSB6b25lCisjZGVmaW5lIEFOSV9FX0NMSV9ERUxfUkVRX09OX1JFRl9BVVRIX1pPTkUgICAgICAtMTA3MiAvLyBDYW5ub3QgZGVsZXRlIGF1dGgtem9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBpcyB1c2VkIGJ5IFNTSUQKKyNkZWZpbmUgQU5JX0VfQ0xJX0lOVkFMSURfSU5URVJJTV9VUERUX1ZBTFVFICAgIC0xMDczIC8vIEludmFsaWQgQWNjb3VudGluZyBpbnRlcmltIHVwZGF0ZSBpbnRlcnZhbAorI2RlZmluZSBBTklfRV9SQU5HRV9FTkRfQUFHX0NMSSAgICAgICAgICAgICAgICAgLTExOTkKKy8vIC4uLkNMSSBSYW5nZSBlbmRzIGhlcmUKKworLy8gTm9uLUNMSSByZWxhdGVkIGVycm9yIGNvZGVzLi4KKyNkZWZpbmUgQU5JX0VfTUlDX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgIC0xMjAwIC8vIEEgTUlDIGNoZWNrIGZhaWxlZAorI2RlZmluZSBBTklfRV9SRVBMQVlfQ0hFQ0tfRkFJTEVEICAgICAgICAgICAgICAgLTEyMDEgLy8gUmVwbGF5IEN0ciBtaXNtYXRjaAorI2RlZmluZSBBTklfRV9SQURJVVNfUFJPRklMRV9NSVNTSU5HICAgICAgICAgICAgLTEyMDIgLy8gVXNlciBwcm9maWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgZm91bmQKKyNkZWZpbmUgQU5JX0VfQVVUSF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgIC0xMjAzIC8vIEF1dGhlbnRpY2F0aW9uIGZhaWxlZAorI2RlZmluZSBBTklfRV9SQURJVVNfUFJJVl9MRVZFTF9NSVNTSU5HICAgICAgICAgLTEyMDQgLy8gQU5JX0FETUlOX0xFVkVMIGlzIG1pc3NpbmcKKyNkZWZpbmUgQU5JX0VfUkFESVVTX1BSSVZfTEVWRUxfSU5DT1JSRUNUICAgICAgIC0xMjA1IC8vIEFOSV9BRE1JTl9MRVZFTCBpcyBpbmNvcnJlY3QKKworLy8gRm9yIHNvbWUgcmVhc29uIHRoaXMgaXMgbm90IGNvbnRpZ3VvdXMgd2l0aCB0aGUgb3RoZXIgZXJyb3IgY29kZXMoPz8/KQorI2RlZmluZSBBTklfRV9JTlZBTElEX0NPT0tJRSAgICAgICAgICAgICAgICAgICAgLTEzMDAgLy8gSW52YWxpZCBjb29raWUKKworI2RlZmluZSBBTklfRV9SQU5HRV9FTkRfQUFHICAgICAgICAgICAgICAgICAgICAgLTIwNDgKKworLyoKKyAqIFRoZSByYW5nZSAtMjA0OSB0byAtMjE0OCBpcyByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZQorICogUkFESVVTIGNsaWVudCBzaWRlIGxpYnJhcnkuCisgKi8KKyNkZWZpbmUgQU5JX0VfUkFOR0VfU1RBUlRfUkFEICAgICAgIC0yMDQ5CisjZGVmaW5lIEFOSV9FX1JBRF9GQUlMRUQgICAgICAgICAgICAtMjA0OSAvLy8gUkFESVVTIG9wZXJhdGlvbiBmYWlsZWQKKyNkZWZpbmUgQU5JX0VfUkFEX0FUVFJfVE9PX0xPTkcgICAgIC0yMDUwIC8vLyBBdHRyaWJ1dGUgdG9vIGxvbmcKKyNkZWZpbmUgQU5JX0VfUkFEX1VOU09MSUNJVEVEX1JFU1AgIC0yMDUxIC8vLyBVbnNvbGljaXRlZCByZXNwb25zZQorI2RlZmluZSBBTklfRV9SQURfQkFEX1JFU1BfQVVUSCAgICAgLTIwNTIgLy8vIFJlc3BvbnNlIGF1dGggY2hlY2sgZmFpbGVkCisjZGVmaW5lIEFOSV9FX1JBRF9CQURfTUVTU0dfQVVUSCAgICAtMjA1MyAvLy8gUmVzcG9uc2Ugc2lnbmF0dXJlIGludmFsaWQKKyNkZWZpbmUgQU5JX0VfUkFEX0FUVFJfTk9UX0ZPVU5EICAgIC0yMDU0IC8vLyBSZXF1ZXN0ZWQgYXR0ciBub3QgZm91bmQKKyNkZWZpbmUgQU5JX0VfUkFEX1RJTUVPVVQgICAgICAgICAgIC0yMDU1IC8vLyBSZXF1ZXN0IHRpbWVkIG91dCB3YWl0aW5nIGZvciBzZXJ2ZXIKKyNkZWZpbmUgQU5JX0VfUkFEX1JFSkVDVCAgICAgICAgICAgIC0yMDU2IC8vLyBSYWRpdXMgc2VydmVyIGRpZCBub3QgYWNjZXB0IHVzZXIKKyNkZWZpbmUgQU5JX0VfUkFOR0VfRU5EX1JBRCAgICAgICAgIC0yMTQ4CisKKy8qCisgKiBUaGUgcmFuZ2UgLTIxNDkgdG8gLTI5OTkgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgU1NNIGxpYnJhcnkuCisgKi8KKyNkZWZpbmUgQU5JX0VfUkFOR0VfU1RBUlRfU1NNIC0yMTQ5CisjZGVmaW5lIEFOSV9FX1NTTV9DRVJUX1VOUEFSU0VBQkxFICAgICAgICAgIEFOSV9FX1JBTkdFX1NUQVJUX1NTTSAtIDEKKyNkZWZpbmUgQU5JX0VfU1NNX0NFUlRfRVhQSVJFRCAgICAgICAgICAgICAgQU5JX0VfUkFOR0VfU1RBUlRfU1NNIC0gMgorI2RlZmluZSBBTklfRV9TU01fQ0VSVF9USFVNQlBSSU5UX01JU01BVENIICBBTklfRV9SQU5HRV9TVEFSVF9TU00gLSAzCisjZGVmaW5lIEFOSV9FX1NTTV9DRVJUX05FV19JRCAgICAgICAgICAgICAgIEFOSV9FX1JBTkdFX1NUQVJUX1NTTSAtIDQKKyNkZWZpbmUgQU5JX0VfUkFOR0VfRU5EX1NTTSAgIC0yOTk5CisKKy8qCisgKiBUaGUgcmFuZ2UgLTMwMDAgdG8gLTM1MDAgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUKKyAqIE5ldFNpbSBTZXJ2ZXIsIENsaWVudCwgQ2xpZW50IE1vZHVsZXMgYW5kIFBzZXVkbyBkcml2ZXIKKyAqLworI2RlZmluZSBBTklfRV9SQU5HRV9TVEFSVF9ORVRTSU0gICAgIC0zMDAwCisjZGVmaW5lIEFOSV9FX1JBTkdFX0VORF9ORVRTSU0gICAgICAgLTM1MDAKKworLyoKKyAqIFRoZSByYW5nZSAtMzUwMSB0byAtNDAwMCBpcyByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZQorICogRGlzY292ZXJ5IFNlcnZlciBhbmQgaXRzIGxpYnJhcmllcy4KKyAqLworI2RlZmluZSBBTklfRV9SQU5HRV9TVEFSVF9ESVNDICAgICAtMzUwMQorI2RlZmluZSBBTklfRV9SQU5HRV9FTkRfRElTQyAgICAgICAtNDAwMAorCisvKgorICogVGhlIHJhbmdlIC00MDAxIHRvIC00NTAwIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlCisgKiBFemNmZyBTZXJ2ZXIKKyAqLworI2RlZmluZSBBTklfRV9SQU5HRV9TVEFSVF9FWkMgICAgIC00MDAxCisKKy8vIFNlZSBmaWxlIGFuaU5tcEV6Y1N2Y01zZ3MuaCBmb3IgRVpDIHNwZWNpZmljIGVycm9yIGNvZGVzIGFuZCBtZXNzYWdlcworI2RlZmluZSBBTklfRV9SQU5HRV9FTkRfRVpDICAgICAgIC00NTAwCisKKy8qCisgKiBUaGUgcmFuZ2UgLTQ1MDEgdG8gLTQ2MDAgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUKKyAqIFNvZnR3YXJlIERvd25sb2FkIChTV0QpIFNlcnZlcgorICovCisjZGVmaW5lIEFOSV9FX1JBTkdFX1NUQVJUX1NXRCAgICAgLTQ1MDEKKworLy8gU2VlIGZpbGUgYW5pU3dkU3ZjTXNncy5oIGZvciBTV0Qgc3BlY2lmaWMgZXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzCisjZGVmaW5lIEFOSV9FX1JBTkdFX0VORF9TV0QgICAgICAgLTQ2MDAKKworLyoKKyAqIFRoZSByYW5nZSAtNDYwMSB0byAtNDcwMCBpcyByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZQorICogRGF0YSBEaXN0cmlidXRpb24gU2VydmljZSAoRERTKSBTZXJ2ZXIKKyAqLworI2RlZmluZSBBTklfRV9SQU5HRV9TVEFSVF9ERFMgICAgIC00NjAxCisKKy8vIFNlZSBmaWxlIGFuaURkc1N2Y01zZ3MuaCBmb3IgRERTIHNwZWNpZmljIGVycm9yIGNvZGVzIGFuZCBtZXNzYWdlcworI2RlZmluZSBBTklfRV9SQU5HRV9FTkRfRERTICAgICAgIC00NzAwCisKKy8qCisgKiBUaGUgcmFuZ2UgLTQ3MDEgdG8gLTQ4MDAgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieQorICogSFRUUFMgY29tcG9uZW50cy4KKyAqLworI2RlZmluZSBBTklfRV9SQU5HRV9TVEFSVF9IVFRQUyAtNDcwMQorI2RlZmluZSBBTklfRV9IVFRQU19VTlJFQUNIQUJMRSAgICAgIEFOSV9FX1JBTkdFX1NUQVJUX0hUVFBTIC0gMAorI2RlZmluZSBBTklfRV9IVFRQU19VTlRSVVNURURfQ0VSVCAgIEFOSV9FX1JBTkdFX1NUQVJUX0hUVFBTIC0gMQorI2RlZmluZSBBTklfRV9IVFRQU19SRUNWRF9BTEVSVCAgICAgIEFOSV9FX1JBTkdFX1NUQVJUX0hUVFBTIC0gMgorI2RlZmluZSBBTklfRV9IVFRQU19GQUlMRUQgICAgICAgICAgIEFOSV9FX1JBTkdFX1NUQVJUX0hUVFBTIC0gMworI2RlZmluZSBBTklfRV9SQU5HRV9FTkRfSFRUUFMgICAtNDgwMAorCisvKgorICogVGhlIHJhbmdlIC00ODAxIHRvIC00OTAwIGlzIHJlc2VydmVkIGZvciB1c2UgYnkKKyAqIGVucm9sbG1lbnQgY29tcG9uZW50cy4KKyAqLworI2RlZmluZSBBTklfRV9SQU5HRV9TVEFSVF9FTlJPTExNRU5UIC00ODAxCisjZGVmaW5lIEFOSV9FX0VOUk9MTF9UUF9BVkFJTEFCTEUgICAgIEFOSV9FX1JBTkdFX1NUQVJUX0VOUk9MTE1FTlQgLSAwCisjZGVmaW5lIEFOSV9FX0VOUk9MTF9BTFJFQURZX1RSVVNURUQgIEFOSV9FX1JBTkdFX1NUQVJUX0VOUk9MTE1FTlQgLSAxCisjZGVmaW5lIEFOSV9FX0VOUk9MTF9OT1RfRk9VTkQgICAgICAgIEFOSV9FX1JBTkdFX1NUQVJUX0VOUk9MTE1FTlQgLSAyCisjZGVmaW5lIEFOSV9FX0VOUk9MTF9QV0RfRkFJTEVEICAgICAgIEFOSV9FX1JBTkdFX1NUQVJUX0VOUk9MTE1FTlQgLSAzCisjZGVmaW5lIEFOSV9FX0VOUk9MTF9GQUlMRUQgICAgICAgICAgIEFOSV9FX1JBTkdFX1NUQVJUX0VOUk9MTE1FTlQgLSA0CisjZGVmaW5lIEFOSV9FX0VOUk9MTF9OT1RfUFJJU1RJTkUgICAgIEFOSV9FX1JBTkdFX1NUQVJUX0VOUk9MTE1FTlQgLSA1CisjZGVmaW5lIEFOSV9FX1JBTkdFX0VORF9FTlJPTExNRU5UICAgLTQ5MDAKKworCisvKgorICogVGhlIHJhbmdlIC00OTAxIHRvIC01MDAwIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgTlNNLgorICovCisjZGVmaW5lIEFOSV9FX1JBTkdFX1NUQVJUX05TTSAtNDkwMQorI2RlZmluZSBBTklfRV9OU01fSVBBRERSX0FTU0lHTkVEICAgICBBTklfRV9SQU5HRV9TVEFSVF9OU00gLSAwCisjZGVmaW5lIEFOSV9FX1JBTkdFX0VORF9OU00gICAtNTAwMAorCisvKgorICogVGhlIHJhbmdlIC01MDAxIHRvIC01MTAwIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGltYWdlCisgKiB2YWxpZGF0aW9uIGxpYnJhcnkuCisgKi8KKyNkZWZpbmUgQU5JX0VfUkFOR0VfU1RBUlRfSU1BR0UgLTUwMDEKKyNkZWZpbmUgQU5JX0VfSU1BR0VfSU5WQUxJRCAgICAgICAgIEFOSV9FX1JBTkdFX1NUQVJUX0lNQUdFIC0gMAorI2RlZmluZSBBTklfRV9JTUFHRV9VTlNVUFBPUlRFRCAgICAgQU5JX0VfUkFOR0VfU1RBUlRfSU1BR0UgLSAxCisjZGVmaW5lIEFOSV9FX1JBTkdFX0VORF9JTUFHRSAgIC01MTAwCisKKy8qCisgKiBUaGUgcmFuZ2UgLTUxMDEgdG8gLTUyMDAgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSBDTQorICovCisjZGVmaW5lIEFOSV9FX1JBTkdFX1NUQVJUX0NNIC01MTAxCisjZGVmaW5lIEFOSV9FX01FU0dfVU5BVkFJTEFCTEUgICAgICBBTklfRV9SQU5HRV9TVEFSVF9JTUFHRSAtIDAKKyNkZWZpbmUgQU5JX0VfUkFOR0VfRU5EX0NNICAgLTUyMDAKKworCisjZGVmaW5lIEFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgICggKCByZXRWYWwgPj0gMCApICkKKworI2VuZGlmIC8vX0FOSV9FUlJPUlNfSF8KZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBSc25Tc21BZXNLZXlXcmFwLmMgYi9DT1JFL0JBUC9zcmMvYmFwUnNuU3NtQWVzS2V5V3JhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOTdiODgKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYmFwUnNuU3NtQWVzS2V5V3JhcC5jCkBAIC0wLDAgKzEsMzk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAkRmlsZTogLy9kZXBvdC9zb2Z0d2FyZS9wcm9qZWN0cy9mZWF0dXJlX2JyYW5jaGVzL2dlbjVfcGhhc2UxL29zL2xpbnV4L2NsYXNzaWMvYXAvYXBwcy9zc20vbGliL2FuaVNzbUFlc0tleVdyYXAuYyAkCisgKgorICogQ29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBBRVMgS2V5IFdyYXAgYWxnb3JpdGhtIGZyb20gUkZDIDMzOTQuCisgKgorICogQXV0aG9yOiAgICAgIE1heWFuayBELiBVcGFkaHlheQorICogRGF0ZTogICAgICAgIDMxLU1hcmNoLTIwMDMKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgIE1vZGlmaWVkIGJ5ICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAidm9zX3R5cGVzLmgiCisjaW5jbHVkZSAiYmFwUnNuU3NtU2VydmljZXMuaCIKKyNpbmNsdWRlICJiYXBSc25Tc21FYXBvbC5oIgorI2luY2x1ZGUgImJhcFJzbkVycm9ycy5oIgorI2luY2x1ZGUgImJhcEludGVybmFsLmgiCisjaW5jbHVkZSAiYmFwUnNuODAyMXhGc20uaCIKKyNpbmNsdWRlICJiYXBSc244MDIxeEF1dGhGc20uaCIKKyNpbmNsdWRlICJ2b3NfdXRpbHMuaCIKKyNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCisjaW5jbHVkZSAidm9zX3RpbWVyLmgiCisjaW5jbHVkZSAiYmFwUnNuVHhSeC5oIgorI2luY2x1ZGUgImJhcFJzblNzbUFlc0tleVdyYXAuaCIKKworI2lmIDAKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisKKyNpbmNsdWRlIDxhbmlBc2ZIZHIuaD4KKyNpbmNsdWRlIDxhbmlVdGlscy5oPgorI2luY2x1ZGUgPGFuaUVycm9ycy5oPgorI2luY2x1ZGUgPGFuaUFzZkxvZy5oPgorCisjaW5jbHVkZSAiYW5pU3NtQWVzS2V5V3JhcC5oIgorI2luY2x1ZGUgImFuaVNzbVV0aWxzLmgiCisjZW5kaWYKKworI2RlZmluZSBBTklfU1NNX0FFU19LRVlfV1JBUF9JQ19TSVpFICAgIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUKKwordHlwZWRlZiBzdHJ1Y3QgdGFnX2Flc19rZXkgeworICAgIHRBTklfVTMyIGVLWzY0XSwgZEtbNjRdOworICAgIGludCBOcjsKK30gQUVTX0tFWTsKKworc3RhdGljIHRBTklfVTggZ0FuaVNzbUFlc0tleVdyYXBJdltdID0geworICAgIDB4QTYsIDB4QTYsIDB4QTYsIDB4QTYsIDB4QTYsIDB4QTYsIDB4QTYsIDB4QTYKK307CisKK3N0YXRpYyBpbnQKK2Flcyh2X1UzMl90IGNyeXB0SGFuZGxlLCB0QU5JX1U4ICprZXlCeXRlcywgdEFOSV9VMzIga2V5TGVuLAorICAgIHRBTklfVTggYVtBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFXSwKKyAgICB0QU5JX1U4IHJpW0FOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkVdLAorICAgIHRBTklfVTggYltBRVNfQkxPQ0tfU0laRV0pOworCitzdGF0aWMgaW50CithZXNfMSh2X1UzMl90IGNyeXB0SGFuZGxlLCB0QU5JX1U4ICprZXlCeXRlcywgdEFOSV9VMzIga2V5TGVuLAorICAgICAgdEFOSV9VOCBhdFtBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFXSwKKyAgICAgIHRBTklfVTggcmlbQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRV0sCisgICAgICB0QU5JX1U4IGJbQUVTX0JMT0NLX1NJWkVdKTsKKworc3RhdGljIGludAoreG9yKHRBTklfVTggYVtBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFXSwgdEFOSV9VMzIgdCk7CisKKy8qKgorICogSW1wbGVtZW50cyB0aGUgQUVTIEtleSBXcmFwIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gUkZDIDMzOTQuCisgKiBJZiBuIGlzIHRoZSBudW1iZXIgb2YgYmxvY2tzIGluIHBsYWluVGV4dCwgb2Ygc2l6ZQorICogQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSwgdGhlbiB0aGUgb3V0cHV0IHZhbHVlIGlzIChuKzEpCisgKiBibG9ja3MuIFRoZSBmaXJzdCBibG9jayBpcyB0aGUgSVYgZnJvbSBzZWN0aW9uIDIuMi4zIG8gdGhlCisgKiBSRkMuIE5vdGU6IEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZSByZXR1cm5lZAorICogdmFsdWUuCisgKiAKKyAqIEBwYXJhbSBwbGFpblRleHQgdGhlIHBsYWludGV4dCBkYXRhIHRvIHdyYXAKKyAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0LCB3aGljaCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YKKyAqIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUuCisgKiBAcGFyYW0ga2V5RW5jS2V5IHRoZSBlbmNyeXB0aW9uIGtleQorICogQHBhcmFtIGtleUVuY0tleUxlbiB0aGUgbGVuZ3RoIG9mIGtleUVuY0tleQorICogQHBhcmFtIGNpcGhlclRleHRQdHIgaXMgc2V0IHRvIGEgbmV3bHkgYWxsb2NhdGVkIGFycmF5IGNvbnRhaW5pbmcKKyAqIHRoZSByZXN1bHQgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcy4gSXQgaXMgdGhlIGNhbGxlcidzCisgKiByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoaXMuCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaVNzbUFlc0tleVdyYXAodl9VMzJfdCBjcnlwdEhhbmRsZSwgdEFOSV9VOCAqcGxhaW5UZXh0LCB0QU5JX1UzMiBsZW4sCisgICAgICAgICAgICAgICAgIHRBTklfVTggKmtleUVuY0tleSwgdEFOSV9VMzIga2V5RW5jS2V5TGVuLAorICAgICAgICAgICAgICAgICB0QU5JX1U4ICoqY2lwaGVyVGV4dFB0cikKK3sKKyAgICBpbnQgaSwgaiwgbjsKKyAgICBpbnQgcmV0VmFsOworCisgICAgdEFOSV9VOCBhW0FOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkVdOworICAgIHRBTklfVTggKnIgPSBOVUxMOworICAgIHRBTklfVTMyIHQ7CisKKyAgICB0QU5JX1U4IGJbQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSoyXTsKKworICAgIG4gPSBsZW4gLyBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFOworICAgIGlmICgobGVuICUgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSkgIT0gMCkgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJJbGxlZ2FsIG51bWJlciBvZiBpbnB1dCBieXRlcyB0byBBRVMgS2V5IFdyYXAhIik7CisgICAgICAgIHJldHVybiBBTklfRV9JTExFR0FMX0FSRzsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBlbm91Z2ggc3RvcmFnZSBmb3IgJ0EnIGFzIHdlbGwgYXMgJ1InCisgICAgciA9IHZvc19tZW1fbWFsbG9jKChuICsgMSkgKiBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFKTsKKyAgICBpZiAociA9PSBOVUxMKSB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBzcGFjZSBmb3IgUiIpOworICAgICAgICByZXR1cm4gQU5JX0VfTUFMTE9DX0ZBSUxFRDsKKyAgICB9CisKKyAgICB2b3NfbWVtX2NvcHkoYSwgZ0FuaVNzbUFlc0tleVdyYXBJdiwgc2l6ZW9mKGEpKTsKKyAgICB2b3NfbWVtX2NvcHkociArIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUsIHBsYWluVGV4dCwgbGVuKTsKKworICAgIGZvciAoaiA9IDA7IGogPD0gNTsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKSB7CisKKyAgICAgICAgICAgIHJldFZhbCA9IGFlcyhjcnlwdEhhbmRsZSwga2V5RW5jS2V5LCBrZXlFbmNLZXlMZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgciArIGkqQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiKTsKKworICAgICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsKSApIGdvdG8gZXJyb3I7CisKKyAgICAgICAgICAgIHZvc19tZW1fY29weShhLCBiLCBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFKTsKKyAgICAgICAgICAgIHQgPSBuKmogKyBpOworICAgICAgICAgICAgeG9yKGEsIHQpOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KHIgKyBpKkFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUsCisgICAgICAgICAgICAgICAgICAgYiArIHNpemVvZihiKSAtIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUsCisgICAgICAgICAgICAgICAgICAgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b3NfbWVtX2NvcHkociwgYSwgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSk7CisgICAgKmNpcGhlclRleHRQdHIgPSByOworCisgICAgcmV0dXJuIEFOSV9PSzsKKworIGVycm9yOgorICAgIGlmIChyICE9IE5VTEwpCisgICAgICAgIHZvc19tZW1fZnJlZShyKTsKKworICAgIHJldHVybiByZXRWYWw7CisKK30KKworLyoqCisgKiBJbXBsZW1lbnRzIHRoZSBBRVMgS2V5IFVud3JhcCBhbGdvcml0aG0gZGVzY3JpYmVkIGluIFJGQyAzMzk0LgorICogSWYgKG4rMSkgaXMgdGhlIG51bWJlciBvZiBibG9ja3MgaW4gY2lwaGVyVGV4dCwgb2Ygc2l6ZQorICogQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSwgdGhlbiB0aGUgb3V0cHV0IHZhbHVlIGlzIChuKzEpCisgKiBibG9ja3MuIFRoZSBhY3R1YWwgcGxhaW50ZXh0IGNvbnNpc3RzIG9mIG4gYmxvY2tzIHRoYXQgc3RhcnQgYXQgdGhlCisgKiBzZWNvbmQgYmxvY2suIE5vdGU6IEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZQorICogcmV0dXJuZWQgdmFsdWUuCisgKgorICogQHBhcmFtIGNpcGhlclRleHQgdGhlIGNpcGVydGV4dCBkYXRhIHRvIHVud3JhcAorICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBjaXBoZXJ0ZXh0LCB3aGljaCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YKKyAqIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUuCisgKiBAcGFyYW0ga2V5RW5jS2V5IHRoZSBlbmNyeXB0aW9uIGtleQorICogQHBhcmFtIGtleUVuY0tleUxlbiB0aGUgbGVuZ3RoIG9mIGtleUVuY0tleQorICogQHBhcmFtIHBsYWluVGV4dFB0ciBpcyBzZXQgdG8gYSBuZXdseSBhbGxvY2F0ZWQgYXJyYXkgY29udGFpbmluZworICogdGhlIHJlc3VsdCBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLiBJdCBpcyB0aGUgY2FsbGVyJ3MKKyAqIHJlc3BvbnNpYmlsaXR5IHRvIGZyZWUgdGhpcy4KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYW5pU3NtQWVzS2V5VW53cmFwKHZfVTMyX3QgY3J5cHRIYW5kbGUsIHRBTklfVTggKmNpcGhlclRleHQsIHRBTklfVTMyIGxlbiwKKyAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICprZXlFbmNLZXksIHRBTklfVTMyIGtleUVuY0tleUxlbiwKKyAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICoqcGxhaW5UZXh0UHRyKQoreworICAgIGludCBpLCBqOworICAgIGludCByZXRWYWw7CisKKyAgICB0QU5JX1U4IGFbQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRV07CisgICAgdEFOSV9VOCAqciA9IE5VTEw7CisgICAgdEFOSV9VMzIgbjsKKyAgICB0QU5JX1UzMiB0OworCisgICAgdEFOSV9VOCBiW0FOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUqMl07CisKKyAgICBuID0gbGVuIC8gQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSAtIDE7CisgICAgaWYgKChsZW4gJSBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFKSAhPSAwKSB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgdG8gQUVTIEtleSBVbndyYXAhIik7CisgICAgICAgIHJldHVybiBBTklfRV9JTExFR0FMX0FSRzsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBlbm91Z2ggc3RvcmFnZSBmb3IgJ0EnIGFzIHdlbGwgYXMgJ1InCisgICAgciA9IHZvc19tZW1fbWFsbG9jKChuICsgMSkgKiAgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSk7CisgICAgaWYgKHIgPT0gTlVMTCkgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBzcGFjZSBmb3IgUiIpOworICAgICAgICByZXR1cm4gQU5JX0VfTUFMTE9DX0ZBSUxFRDsKKyAgICB9CisKKyAgICB2b3NfbWVtX2NvcHkoYSwgY2lwaGVyVGV4dCwgc2l6ZW9mKGEpKTsKKyAgICB2b3NfbWVtX2NvcHkociArIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUsIAorICAgICAgICAgICBjaXBoZXJUZXh0ICsgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSwgCisgICAgICAgICAgIGxlbiAtIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUpOworCisgICAgZm9yIChqID0gNTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgZm9yIChpID0gbjsgaSA+PSAxOyBpLS0pIHsKKworICAgICAgICAgICAgdCA9IG4qaiArIGk7CisgICAgICAgICAgICB4b3IoYSwgdCk7CisgICAgICAgICAgICByZXRWYWwgPSBhZXNfMShjcnlwdEhhbmRsZSwga2V5RW5jS2V5LCBrZXlFbmNLZXlMZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgKyBpKkFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiKTsKKyAgICAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCkgKSBnb3RvIGVycm9yOworCisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoYSwgYiwgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSk7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkociArIGkqQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSwKKyAgICAgICAgICAgICAgICAgICBiICsgc2l6ZW9mKGIpIC0gQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSwKKyAgICAgICAgICAgICAgICAgICBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2b3NfbWVtX2NvbXBhcmUyKGEsIGdBbmlTc21BZXNLZXlXcmFwSXYsIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUpICE9IDApIHsKKyAgICAgICAgcmV0VmFsID0gQU5JX0VfTUlDX0ZBSUxFRDsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAqcGxhaW5UZXh0UHRyID0gcjsKKworICAgIHJldHVybiBBTklfT0s7CisKKyBlcnJvcjoKKyAgICBpZiAociAhPSBOVUxMKQorICAgICAgICB2b3NfbWVtX2ZyZWUocik7CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgaW50CithZXModl9VMzJfdCBjcnlwdEhhbmRsZSwgdEFOSV9VOCAqa2V5Qnl0ZXMsIHRBTklfVTMyIGtleUxlbiwKKyAgICB0QU5JX1U4IGFbQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRV0sCisgICAgdEFOSV9VOCByaVtBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFXSwKKyAgICB0QU5JX1U4IGJbQUVTX0JMT0NLX1NJWkVdKSB7CisKKyAgICBpbnQgcmV0VmFsID0gMDsKKworLy8gICAgQUVTX0tFWSBhZXNLZXk7CisKKyAgICB0QU5JX1U4IGluW0FFU19CTE9DS19TSVpFXTsKKyAgICB0QU5JX1U4ICpvdXQ7CisKKyAgICBWT1NfQVNTRVJUIChBRVNfQkxPQ0tfU0laRSA9PSBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFKjIpOworCisgICAgLy8gQ29uY2F0ZW5hdGUgQSBhbmQgUltpXQorICAgIHZvc19tZW1fY29weShpbiwgYSwgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSk7CisgICAgdm9zX21lbV9jb3B5KGluICsgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSwgCisgICAgICAgICAgIHJpLCBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFKTsKKyAgICBvdXQgPSBiOworCisjaWYgMAorICAgIHJldFZhbCA9IEFFU19zZXRfZW5jcnlwdF9rZXkoa2V5Qnl0ZXMsIGtleUxlbio4LCAmYWVzS2V5KTsKKyAgICBpZiAocmV0VmFsICE9IDApIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJBRVNfc2V0X2VuY3J5cHRfa2V5IHJldHVybmVkICVkIiwgcmV0VmFsKTsKKyAgICAgICAgcmV0dXJuIEFOSV9FX0ZBSUxFRDsKKyAgICB9CisKKyAgICBBRVNfZW5jcnlwdChpbiwgb3V0LCAmYWVzS2V5KTsKKyNlbHNlIC8vIEVuYWJsZSB0byB1c2UgVk9TIGZ1bmN0aW9uCisgICAgcmV0VmFsID0gdm9zX2VuY3J5cHRfQUVTKGNyeXB0SGFuZGxlLCAvKiBIYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4sIC8qIGlucHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCwgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUJ5dGVzKTsgLyoga2V5ICovCisgICAgaWYgKHJldFZhbCAhPSAwKSB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAidm9zX2VuY3J5cHRfQUVTIHJldHVybmVkICVkIiwgcmV0VmFsKTsKKyAgICAgICAgcmV0dXJuIEFOSV9FX0ZBSUxFRDsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gQU5JX09LOworfQorCitzdGF0aWMgaW50CithZXNfMSh2X1UzMl90IGNyeXB0SGFuZGxlLCB0QU5JX1U4ICprZXlCeXRlcywgdEFOSV9VMzIga2V5TGVuLAorICAgICAgdEFOSV9VOCBhdFtBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFXSwKKyAgICAgIHRBTklfVTggcmlbQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRV0sCisgICAgICB0QU5JX1U4IGJbQUVTX0JMT0NLX1NJWkVdKSB7CisKKyAgICBpbnQgcmV0VmFsOworCisvLyAgICBBRVNfS0VZIGFlc0tleTsKKworICAgIHRBTklfVTggaW5bQUVTX0JMT0NLX1NJWkVdOworICAgIHRBTklfVTggKm91dDsKKworICAgIFZPU19BU1NFUlQgKEFFU19CTE9DS19TSVpFID09IEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUqMik7CisKKyAgICAvLyBDb25jYXRlbmF0ZSBBIGFuZCBSW2ldCisgICAgdm9zX21lbV9jb3B5KGluLCBhdCwgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSk7CisgICAgdm9zX21lbV9jb3B5KGluICsgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSwgCisgICAgICAgICAgIHJpLCBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFKTsKKyAgICBvdXQgPSBiOworCisjaWYgMAorICAgIHJldFZhbCA9IEFFU19zZXRfZGVjcnlwdF9rZXkoa2V5Qnl0ZXMsIGtleUxlbio4LCAmYWVzS2V5KTsKKyAgICBpZiAocmV0VmFsICE9IDApIHsKKyAgICAgICAgQU5JX1NTTV9MT0dfRSgiQUVTX3NldF9lbmNyeXB0X2tleSByZXR1cm5lZCAlZCIsIHJldFZhbCk7CisgICAgICAgIGFzc2VydCgwICYmICJBRVNfc2V0X2VuY3J5cHRfa2V5IGZhaWxlZCEiKTsKKyAgICAgICAgcmV0dXJuIEFOSV9FX0ZBSUxFRDsKKyAgICB9CisKKyAgICBBRVNfZGVjcnlwdChpbiwgb3V0LCAmYWVzS2V5KTsKKyNlbHNlCisgICAgcmV0VmFsID0gdm9zX2RlY3J5cHRfQUVTKGNyeXB0SGFuZGxlLCAvKiBIYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4sIC8qIGlucHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCwgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUJ5dGVzKTsgLyoga2V5ICovCisgICAgaWYgKHJldFZhbCAhPSAwKSB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAidm9zX2RlY3J5cHRfQUVTIHJldHVybmVkICVkIiwgcmV0VmFsKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gQU5JX09LOworfQorCisvLyBGcm9tIEZpbGUgOiBhbmlBc2ZIZHIuaAorCisKKworLyoKKyAqIFB1dCBhIGxvbmcgaW4gaG9zdCBvcmRlciBpbnRvIGEgY2hhciBhcnJheSBpbiBuZXR3b3JrIG9yZGVyLiAKKyAqIAorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKmFuaUFzZldyMzIoY2hhciAqY3AsIHRBTklfVTMyIHgpCit7CisgICAgdEFuaVUzMlZhbEFyeSByOworICAgIGludCBpOworCisgICAgci52YWwgPSB2b3NfY3B1X3RvX2JlMzIoeCk7CisgICAgaSA9IHNpemVvZih0QU5JX1UzMikgLSAxOworICAgIGNwWzNdID0gci5hcnlbaS0tXTsKKyAgICBjcFsyXSA9IHIuYXJ5W2ktLV07CisgICAgY3BbMV0gPSByLmFyeVtpLS1dOworICAgIGNwWzBdID0gci5hcnlbaV07CisKKyAgICByZXR1cm4gKGNwICsgc2l6ZW9mKHRBTklfVTMyKSk7Cit9CisKKy8vIEZyb20gZmlsZSA6IGFuaUFzZk1pc2MuYworCisvKgorICogUHV0IGEgbG9uZyBpbiBob3N0IG9yZGVyIGludG8gYSBjaGFyIGFycmF5IGluIG5ldHdvcmsgb3JkZXIuIAorICogCisgKi8KK2NoYXIgKmFuaUFzZlB1dDMyKGNoYXIgKmNwLCB0QU5JX1UzMiB4KQoreworICAgIHJldHVybihhbmlBc2ZXcjMyKGNwLCB4KSk7Cit9CisKKworc3RhdGljIGludAoreG9yKHRBTklfVTggYVtBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFXSwgdEFOSV9VMzIgdCkKK3sKKyAgICB0QU5JX1U4IHRtcFs0XTsKKyAgICBhbmlBc2ZQdXQzMigoY2hhciAqKXRtcCwgdCk7CisgICAgYVtBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFLTFdIF49IHRtcFszXTsKKyAgICBhW0FOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUtMl0gXj0gdG1wWzJdOworICAgIGFbQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRS0zXSBePSB0bXBbMV07CisgICAgYVtBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFLTRdIF49IHRtcFswXTsKKyAgICByZXR1cm4gQU5JX09LOworfQorCmRpZmYgLS1naXQgYS9DT1JFL0JBUC9zcmMvYmFwUnNuU3NtQWVzS2V5V3JhcC5oIGIvQ09SRS9CQVAvc3JjL2JhcFJzblNzbUFlc0tleVdyYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjhjMWEzCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcFJzblNzbUFlc0tleVdyYXAuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFF1YWxjb21tIEluYywgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBSZWYgRmlsZTogLy9kZXBvdC9zb2Z0d2FyZS9wcm9qZWN0cy9mZWF0dXJlX2JyYW5jaGVzL2dlbjVfcGhhc2UxL29zL2xpbnV4L2NsYXNzaWMvYXAvYXBwcy9zc20vaW5jbHVkZS9hbmlTc21BZXNLZXlXcmFwLmggJAorICoKKyAqIENvbnRhaW5zIFNTTS1wcml2YXRlIGRlY2xhcmF0aW9ucyByZWxhdGVkIHRvIHRoZSBBRVMga2V5IFdSQVAKKyAqIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gUkZDIDMzOTQuCisgKgorICogQXV0aG9yOiAgICAgIEFydWwgViBSYWoKKyAqIERhdGU6ICAgICAgICAyNy1GZWJydWFyeS0yMDA5CisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICBNb2RpZmllZCBieSAgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmbmRlZiBfQU5JX1NTTV9BRVNfS0VZX1dSQVBfSF8KKyNkZWZpbmUgX0FOSV9TU01fQUVTX0tFWV9XUkFQX0hfCisKKyNkZWZpbmUgQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSA4IC8vIEJ5dGVzCisjZGVmaW5lIEFFU19CTE9DS19TSVpFIDE2IC8vIEJ5dGVzCisKK3R5cGVkZWYgdW5pb24gdUFuaVUzMlZhbEFyeXsKKyAgICB0QU5JX1UzMiB2YWw7CisgICAgY2hhciBhcnlbc2l6ZW9mKHRBTklfVTMyKV07Cit9IHRBbmlVMzJWYWxBcnk7CisKKy8qKgorICogSW1wbGVtZW50cyB0aGUgQUVTIEtleSBXcmFwIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gUkZDIDMzOTQuCisgKiBJZiBuIGlzIHRoZSBudW1iZXIgb2YgYmxvY2tzIGluIHBsYWluVGV4dCwgb2Ygc2l6ZQorICogQU5JX1NTTV9BRVNfS0VZX1dSQVBfQkxPQ0tfU0laRSwgdGhlbiB0aGUgb3V0cHV0IHZhbHVlIGlzIChuKzEpCisgKiBibG9ja3MuIFRoZSBmaXJzdCBibG9jayBpcyB0aGUgSVYgZnJvbSBzZWN0aW9uIDIuMi4zIG8gdGhlCisgKiBSRkMuIE5vdGU6IEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZSByZXR1cm5lZAorICogdmFsdWUuCisgKiAKKyAqIEBwYXJhbSBwbGFpblRleHQgdGhlIHBsYWludGV4dCBkYXRhIHRvIHdyYXAKKyAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0LCB3aGljaCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YKKyAqIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUuCisgKiBAcGFyYW0ga2V5RW5jS2V5IHRoZSBlbmNyeXB0aW9uIGtleQorICogQHBhcmFtIGtleUVuY0tleUxlbiB0aGUgbGVuZ3RoIG9mIGtleUVuY0tleQorICogQHBhcmFtIGNpcGhlclRleHRQdHIgaXMgc2V0IHRvIGEgbmV3bHkgYWxsb2NhdGVkIGFycmF5IGNvbnRhaW5pbmcKKyAqIHRoZSByZXN1bHQgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcy4gSXQgaXMgdGhlIGNhbGxlcidzCisgKiByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoaXMuCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaVNzbUFlc0tleVdyYXAodl9VMzJfdCBjcnlwdEhhbmRsZSwgdEFOSV9VOCAqcGxhaW5UZXh0LCB0QU5JX1UzMiBsZW4sCisgICAgICAgICAgICAgICAgIHRBTklfVTggKmtleUVuY0tleSwgdEFOSV9VMzIga2V5RW5jS2V5TGVuLAorICAgICAgICAgICAgICAgICB0QU5JX1U4ICoqY2lwaGVyVGV4dFB0cik7CisKKy8qKgorICogSW1wbGVtZW50cyB0aGUgQUVTIEtleSBVbndyYXAgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiBSRkMgMzM5NC4KKyAqIElmIChuKzEpIGlzIHRoZSBudW1iZXIgb2YgYmxvY2tzIGluIGNpcGhlclRleHQsIG9mIHNpemUKKyAqIEFOSV9TU01fQUVTX0tFWV9XUkFQX0JMT0NLX1NJWkUsIHRoZW4gdGhlIG91dHB1dCB2YWx1ZSBpcyAobisxKQorICogYmxvY2tzLiBUaGUgYWN0dWFsIHBsYWludGV4dCBjb25zaXN0cyBvZiBuIGJsb2NrcyB0aGF0IHN0YXJ0IGF0IHRoZQorICogc2Vjb25kIGJsb2NrLiBOb3RlOiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUKKyAqIHJldHVybmVkIHZhbHVlLgorICoKKyAqIEBwYXJhbSBjaXBoZXJUZXh0IHRoZSBjaXBlcnRleHQgZGF0YSB0byB1bndyYXAKKyAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgY2lwaGVydGV4dCwgd2hpY2ggbXVzdCBiZSBhIG11bHRpcGxlIG9mCisgKiBBTklfU1NNX0FFU19LRVlfV1JBUF9CTE9DS19TSVpFLgorICogQHBhcmFtIGtleUVuY0tleSB0aGUgZW5jcnlwdGlvbiBrZXkKKyAqIEBwYXJhbSBrZXlFbmNLZXlMZW4gdGhlIGxlbmd0aCBvZiBrZXlFbmNLZXkKKyAqIEBwYXJhbSBwbGFpblRleHRQdHIgaXMgc2V0IHRvIGEgbmV3bHkgYWxsb2NhdGVkIGFycmF5IGNvbnRhaW5pbmcKKyAqIHRoZSByZXN1bHQgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcy4gSXQgaXMgdGhlIGNhbGxlcidzCisgKiByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoaXMuCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaVNzbUFlc0tleVVud3JhcCh2X1UzMl90IGNyeXB0SGFuZGxlLCB0QU5JX1U4ICpjaXBoZXJUZXh0LCB0QU5JX1UzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqa2V5RW5jS2V5LCB0QU5JX1UzMiBrZXlFbmNLZXlMZW4sCisgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqKnBsYWluVGV4dFB0cik7CisKKworI2VuZGlmIC8vX0FOSV9TU01fQUVTX0tFWV9XUkFQX0hfCisKZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBSc25Tc21FYXBvbC5jIGIvQ09SRS9CQVAvc3JjL2JhcFJzblNzbUVhcG9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxMmZkYwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvQkFQL3NyYy9iYXBSc25Tc21FYXBvbC5jCkBAIC0wLDAgKzEsMTEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBXb29kc2lkZSBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRmlsZTogJEhlYWRlcjogLy9kZXBvdC9zb2Z0d2FyZS9wcm9qZWN0cy9mZWF0dXJlX2JyYW5jaGVzL2dlbjVfcGhhc2UxL29zL2xpbnV4L2NsYXNzaWMvYXAvYXBwcy9zc20vbGliL2FuaVNzbUVhcG9sLmMjMiAkIAorICoKKyAqIENvbnRhaW5zIGRlZmluaXRpb25zIG9mIHZhcmlvdXMgdXRpbGl0aWVzIGZvciBFQVBvTCBmcmFtZQorICogcGFyc2luZyBhbmQgY3JlYXRpb24uCisgKgorICogQXV0aG9yOiAgICAgIE1heWFuayBELiBVcGFkaHlheQorICogRGF0ZTogICAgICAgIDE5LUp1bmUtMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgTW9kaWZpZWQgYnkgICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaW5jbHVkZSAidm9zX3V0aWxzLmgiCisjaW5jbHVkZSA8YmFwUnNuQXNmUGFja2V0Lmg+CisjaW5jbHVkZSA8YmFwUnNuRXJyb3JzLmg+CisjaW5jbHVkZSA8YmFwUnNuU3NtRWFwb2wuaD4KKyNpbmNsdWRlICJiYXBSc244MDIxeEZzbS5oIgorI2luY2x1ZGUgInZvc19tZW1vcnkuaCIKKworLy8jaW5jbHVkZSAiYW5pU3NtVXRpbHMuaCIKKworI2RlZmluZSBDSEVDS19SRVRWQUwocmV0VmFsKSBcCisgICAgICAgICAgICAgIGFzc2VydChyZXRWYWwgPT0gQU5JX09LKTsgXAorICAgICAgICAgICAgICBpZiAocmV0VmFsICE9IEFOSV9PSykgcmV0dXJuIEFOSV9FX0ZBSUxFRDsKKworCisvL1RPRE86IFB1dCB0aGVzZSBpbiBhbiBhcnJheSBhZnRlciBFQVBPTF9UWVBFIGlzIG1hZGUgYW4gZW51bQorI2RlZmluZSBBTklfRUFQT0xfVFlQRV9QQUNLRVRfU1RSICAgICJFQVAiCisjZGVmaW5lIEFOSV9FQVBPTF9UWVBFX1NUQVJUX1NUUiAgICAgIlNUQVJUIgorI2RlZmluZSBBTklfRUFQT0xfVFlQRV9MT0dPRkZfU1RSICAgICJMT0dPRkYiCisjZGVmaW5lIEFOSV9FQVBPTF9UWVBFX0tFWV9TVFIgICAgICAgIktFWSIKKyNkZWZpbmUgQU5JX0VBUE9MX1RZUEVfQVNGX0FMRVJUX1NUUiAiQUxFUlQiCisjZGVmaW5lIEFOSV9FQVBPTF9UWVBFX1VOS05PV05fU1RSICAgIlVOS05PV04iCisKKy8qKgorICogVGhlIEVBUE9MIHBhY2tldCBpcyBzdHJ1Y3R1cmVkIGFzIGZvbGxvd3M6CisgKi8KKyNkZWZpbmUgRFNUX01BQ19QT1MgMAorI2RlZmluZSBTUkNfTUFDX1BPUyA2CisjZGVmaW5lIEVUSEVSX1BST1RPX1BPUyAxMgorI2RlZmluZSBFQVBPTF9WRVJTSU9OX1BPUyAxNAorI2RlZmluZSBBTklfRUFQT0xfVFlQRV9QT1MgMTUKKyNkZWZpbmUgRUFQT0xfQk9EWV9MRU5fUE9TIDE2CisjZGVmaW5lIEVBUE9MX0JPRFlfUE9TIEVBUE9MX1JYX0hFQURFUl9TSVpFCisKKyNkZWZpbmUgRUFQT0xfQk9EWV9MRU5fU0laRSAyCisKKyNkZWZpbmUgQU5JX1NTTV9MRUdBQ1lfUkM0X0tFWV9TSUdOX09GRlNFVCBFQVBPTF9CT0RZX1BPUyArIDI4CisKKy8qKgorICogQml0bWFza3MgZm9yIHRoZSBSU04gS2V5IEluZm9ybWF0aW9uIGZpZWxkCisgKi8KKyNkZWZpbmUgQU5JX1NTTV9SU05fS0VZX0RFU0NfVkVSU19NQVNLIDB4MDAwNworI2RlZmluZSBBTklfU1NNX1JTTl9VTklDQVNUX01BU0sgICAgICAgMHgwMDA4CisjZGVmaW5lIEFOSV9TU01fUlNOX0tFWV9JTkRFWF9NQVNLICAgICAweDAwMzAKKyNkZWZpbmUgQU5JX1NTTV9SU05fSU5TVEFMTF9NQVNLICAgICAgIDB4MDA0MAorI2RlZmluZSBBTklfU1NNX1JTTl9BQ0tfTUFTSyAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEFOSV9TU01fUlNOX01JQ19NQVNLICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgQU5JX1NTTV9SU05fU0VDVVJFX01BU0sgICAgICAgIDB4MDIwMAorI2RlZmluZSBBTklfU1NNX1JTTl9FUlJPUl9NQVNLICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEFOSV9TU01fUlNOX1JFUVVFU1RfTUFTSyAgICAgICAweDA4MDAKKyNkZWZpbmUgQU5JX1NTTV9SU05fRU5DX0tFWV9EQVRBX01BU0sgIDB4MTAwMAorCisjZGVmaW5lIEFOSV9TU01fUlNOX0tFWV9ERVNDX1ZFUlNfT0ZGU0VUICAwCisjZGVmaW5lIEFOSV9TU01fUlNOX0tFWV9JTkRFWF9PRkZTRVQgICAgICA0CisKKyNkZWZpbmUgQU5JX1NTTV9SU05fS0VZX01JQ19PRkZTRVQgRUFQT0xfQk9EWV9QT1MgKyA3NworCisvKioKKyAqIE90aGVyIGhhcmQgY29kZWQgdmFsdWVzIGZvciBjb252ZW5pZW5jZToKKyAqLworc3RhdGljIGNvbnN0IHZfVThfdCAKK0FOSV9FVEhfUF9FQVBPTF9CWVRFU1syXSA9IHsweDAwLCAweDAzfTsvL0JULUFNUCBzZWN1cml0eSB0eXBlezB4ODgsIDB4OGV9Oworc3RhdGljIGNvbnN0IHZfVThfdCAKK0VBUE9MX1ZFUlNJT05fQllURVNbMV0gPSB7RUFQT0xfVkVSU0lPTl8xfTsKK3N0YXRpYyBjb25zdCB2X1U4X3QgCitBTklfRUFQT0xfVFlQRV9QQUNLRVRfQllURVNbMV0gPSB7QU5JX0VBUE9MX1RZUEVfUEFDS0VUfTsKK3N0YXRpYyBjb25zdCB2X1U4X3QgCitBTklfRUFQT0xfVFlQRV9TVEFSVF9CWVRFU1sxXSA9IHtBTklfRUFQT0xfVFlQRV9TVEFSVH07CitzdGF0aWMgY29uc3Qgdl9VOF90IAorQU5JX0VBUE9MX1RZUEVfTE9HT0ZGX0JZVEVTWzFdID0ge0FOSV9FQVBPTF9UWVBFX0xPR09GRn07CitzdGF0aWMgY29uc3Qgdl9VOF90IAorQU5JX0VBUE9MX1RZUEVfS0VZX0JZVEVTWzFdID0ge0FOSV9FQVBPTF9UWVBFX0tFWX07CitzdGF0aWMgY29uc3Qgdl9VOF90IAorQU5JX0VBUE9MX1RZUEVfQVNGX0FMRVJUX0JZVEVTWzFdID0ge0FOSV9FQVBPTF9UWVBFX0FTRl9BTEVSVH07CitzdGF0aWMgY29uc3Qgdl9VOF90IAorWkVST19CWVRFU1sxNl0gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CitzdGF0aWMgdl9VOF90IEJBUF9SU05fTExDX0hFQURFUltdID0gIHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDE5LCAweDU4IH07CisKKworCitzdGF0aWMgaW50CitwYXJzZVJzbktleURlc2ModEFuaVBhY2tldCAqcGFja2V0LCAKKyAgICAgICAgICAgICAgICB0QW5pRWFwb2xSc25LZXlEZXNjICoqcnNuRGVzY1B0cik7CisKK3N0YXRpYyBpbnQKK3BhcnNlUnNuS2V5SW5mbyh0QW5pUGFja2V0ICpwYWNrZXQsIAorICAgICAgICAgICAgICAgIHRBbmlSc25LZXlJbmZvICppbmZvKTsKKworc3RhdGljIGludAord3JpdGVSc25LZXlEZXNjKHRBbmlQYWNrZXQgKnBhY2tldCwKKyAgICAgICAgICAgICAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyc25EZXNjLAorICAgICAgICAgICAgICAgIHZfVThfdCBrZXlEZXNjVHlwZSk7CisKK3N0YXRpYyBpbnQKK3dyaXRlUnNuS2V5SW5mbyh0QW5pUGFja2V0ICpwYWNrZXQsIHRBbmlSc25LZXlJbmZvICppbmZvKTsKKworc3RhdGljIGludAord3JpdGVSc25LZXlNaWModl9VMzJfdCBjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgIHRBbmlQYWNrZXQgKmVhcG9sRnJhbWUsIAorICAgICAgICAgICAgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyAqcnNuRGVzYywKKyAgICAgICAgICAgICAgIHZfVThfdCAqbWljS2V5LCAKKyAgICAgICAgICAgICAgIHZfVTMyX3QgbWljS2V5TGVuKTsKKworc3RhdGljIGludAorY2hlY2tSc25LZXlNaWModl9VMzJfdCBjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgIHRBbmlQYWNrZXQgKmVhcG9sRnJhbWUsCisgICAgICAgICAgICAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyc25EZXNjLAorICAgICAgICAgICAgICAgdl9VOF90ICptaWNLZXksCisgICAgICAgICAgICAgICB2X1UzMl90IG1pY0tleUxlbik7CisKK2V4dGVybiB2b2lkIGF1dGhFYXBvbEhhbmRsZXIoIHRBdXRoUnNuRnNtICpmc20sIHRBbmlQYWNrZXQgKmVhcG9sRnJhbWUsCisgICAgICAgICAgICAgICAgIHRBbmlNYWNBZGRyIGRzdE1hYywgCisgICAgICAgICAgICAgICAgIHRBbmlNYWNBZGRyIHNyY01hYywKKyAgICAgICAgICAgICAgICAgdl9VOF90ICp0eXBlKTsKK2V4dGVybiB2b2lkIHN1cHBFYXBvbEhhbmRsZXIoIHRTdXBwUnNuRnNtICpmc20sIHRBbmlQYWNrZXQgKmVhcG9sRnJhbWUsCisgICAgICAgICAgICAgICAgIHRBbmlNYWNBZGRyIGRzdE1hYywgCisgICAgICAgICAgICAgICAgIHRBbmlNYWNBZGRyIHNyY01hYywKKyAgICAgICAgICAgICAgICAgdl9VOF90ICp0eXBlKTsKKworLyoqCisgKiBhZGRFYXBvbEhlYWRlcnMKKyAqCisgKiBGVU5DVElPTjoKKyAqIFByZXBlbmRzIHRoZSBFQVBPTCBoZWFkZXIgdG8gYSBwYWNrZXQuCisgKgorICogQVNTVU1QVElPTlM6CisgKiBUaGUgcGFja2V0IGhhcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGZvciBwcmVwZW5kaW5nIHRoZSBFQVBPTAorICogaGVhZGVyLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byBwcmVwZW5kIHRvCisgKiBAcGFyYW0gZHN0TWFjIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgZGVzdGluYXRpb24gKGF1dGhlbnRpY2F0b3IpCisgKiBAcGFyYW0gc3JjTWFjIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgc291cmNlIChzdXBwbGljYW50KQorICogQHBhcmFtIGVhcG9sVHlwZSB0aGUgRUFQT0wtVHlwZSBmaWVsZAorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworc3RhdGljIGludAorYWRkRWFwb2xIZWFkZXJzKHRBbmlQYWNrZXQgKnBhY2tldCwgCisgICAgICAgICAgICAgICAgdEFuaU1hY0FkZHIgZHN0TWFjLCAKKyAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBzcmNNYWMsIAorICAgICAgICAgICAgICAgIHZfVThfdCBlYXBvbFR5cGUpCit7CisgICAgaW50IHJldFZhbDsKKyAgICB2X1UxNl90IGxlbjsKKyAgCisgICAgZG8KKyAgICB7CisgICAgICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEdldExlbihwYWNrZXQpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICBsZW4gPSByZXRWYWw7CisgICAgICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldFByZXBlbmQxNihwYWNrZXQsIGxlbik7CisKKyAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0UHJlcGVuZDgocGFja2V0LCBlYXBvbFR5cGUpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRQcmVwZW5kQnVmZmVyKHBhY2tldCwgRUFQT0xfVkVSU0lPTl9CWVRFUywgMSk7CisgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwgKSApIGJyZWFrOworCisgICAgICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldFByZXBlbmRCdWZmZXIocGFja2V0LCBBTklfRVRIX1BfRUFQT0xfQllURVMsIDIpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICAvL1NpbmNlIFRMIGV4cGVjdHMgU05BUCBoZWFkZXIgaW4gYWxsIHBhY2tldHMgd2Ugc2VuZCwgcHV0IGl0IGluCisgICAgICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldFByZXBlbmRCdWZmZXIocGFja2V0LCBCQVBfUlNOX0xMQ19IRUFERVIsIHNpemVvZihCQVBfUlNOX0xMQ19IRUFERVIpKTsKKyAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkgYnJlYWs7CisKKyAgICAgICAgLy9wYWNrZXQgbGVuZ3RoCisgICAgICAgIGxlbiArPSA2LypsZW5ndGggKyBlYXBvbFR5cGUrdmVyc2lvbiArIGV0aF90eXBlKi8gKyBzaXplb2YoQkFQX1JTTl9MTENfSEVBREVSKTsKKyAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0UHJlcGVuZDE2KHBhY2tldCwgbGVuKTsKKyAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkgYnJlYWs7CisKKyAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0UHJlcGVuZEJ1ZmZlcihwYWNrZXQsIHNyY01hYywgc2l6ZW9mKHRBbmlNYWNBZGRyKSk7CisgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwgKSApIGJyZWFrOworCisgICAgICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldFByZXBlbmRCdWZmZXIocGFja2V0LCBkc3RNYWMsIHNpemVvZih0QW5pTWFjQWRkcikpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKyAgICB9d2hpbGUoIDAgKTsKKworICAgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKgorICogYW5pRWFwb2xXcml0ZVN0YXJ0CisgKgorICogRlVOQ1RJT046CisgKiBXcml0ZXMgYW4gRUFQT0wtU3RhcnQgZnJhbWUgdG8gdGhlIHBhY2tldC4gSXQgaXMgb25seSB1c2VkIGJ5IHRoZQorICogc3VwcGxpY2FudC4KKyAqCisgKiBMT0dJQzoKKyAqIFByZXBlbmQgdGhlIGFwcHJvcHJpYXRlIEVBUE9MIGhlYWRlciB0byB0aGUgcGFja2V0LiBUaGVyZSBpcyBubworICogRUFQT0wgcGF5bG9hZCBmb3IgdGhpcyBraW5kIG9mIGZyYW1lLgorICoKKyAqIEFTU1VNUFRJT05TOgorICogVGhlIHBhY2tldCBoYXMgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBmb3IgcHJlcGVuZGluZyB0aGUgaGVhZGVyLgorICoKKyAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldCB0byB3aGljaCB0aGUgZnJhbWUgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSBkc3RNYWMgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbiAoYXV0aGVudGljYXRvcikKKyAqIEBwYXJhbSBzcmNNYWMgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBzb3VyY2UgKHN1cHBsaWNhbnQpCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUVhcG9sV3JpdGVTdGFydCh0QW5pUGFja2V0ICpwYWNrZXQsIAorICAgICAgICAgICAgICAgICAgIHRBbmlNYWNBZGRyIGRzdE1hYywKKyAgICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBzcmNNYWMpCit7CisgICAgcmV0dXJuICggYWRkRWFwb2xIZWFkZXJzKHBhY2tldCwgZHN0TWFjLCBzcmNNYWMsIEFOSV9FQVBPTF9UWVBFX1NUQVJUKSApOworfQorCisvKioKKyAqIGFuaUVhcG9sV3JpdGVFYXBQYWNrZXQKKyAqCisgKiBGVU5DVElPTjoKKyAqIFdyaXRlcyB0aGUgRUFQT0wvRUFQLVBhY2tldCBmcmFtZSBoZWFkZXJzLiBJdCBpcyB1c2VkCisgKiBieSBib3RoIHRoZSBhdXRoZW50aWNhdG9yIGFuZCB0aGUgc3VwcGxpY2FudC4gVGhpcyBjcmVhdGVzIGFuIEVBUE9MCisgKiBmcmFtZSB0aGF0IGlzIGNhcnJ5aW5nIGFuIEVBUCBtZXNzYWdlIGFzIGl0cyBwYXlsb2FkLgorICoKKyAqIExPR0lDOgorICogUHJlcGVuZCB0aGUgYXBwcm9wcmlhdGUgRUFQT0wgaGVhZGVyIHRvIHRoZSBwYWNrZXQuCisgKgorICogQVNTVU1QVElPTlM6CisgKiBUaGUgRUFQIG1lc3NhZ2UgKGllLiwgdGhlIHBheWxvYWQpIGlzIGFscmVhZHkgYXZhaWxhYmxlIGluIHRoZQorICogcGFja2V0IGFuZCB0aGF0IHRoZSBwYWNrZXQgaGFzIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgZm9yCisgKiBwcmVwZW5kaW5nIHRoZSBFQVBPTCBoZWFkZXIuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IGNvbnRhaW5pbmcgdGhlIEVBUCBtZXNzYWdlCisgKiBAcGFyYW0gZHN0TWFjIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgZGVzdGluYXRpb24gKGF1dGhlbnRpY2F0b3IpCisgKiBAcGFyYW0gc3JjTWFjIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgc291cmNlIChzdXBwbGljYW50KQorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlFYXBvbFdyaXRlRWFwUGFja2V0KHRBbmlQYWNrZXQgKmVhcFBhY2tldCwgCisgICAgICAgICAgICAgICAgICAgICAgIHRBbmlNYWNBZGRyIGRzdE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgIHRBbmlNYWNBZGRyIHNyY01hYykKK3sKKyAgICByZXR1cm4oIGFkZEVhcG9sSGVhZGVycyhlYXBQYWNrZXQsIGRzdE1hYywgc3JjTWFjLCBBTklfRUFQT0xfVFlQRV9QQUNLRVQpICk7Cit9CisKKy8qKgorICogYW5pRWFwb2xQYXJzZQorICoKKyAqIEZVTkNUSU9OOgorICogUGFyc2VzIGFuIEVBUG9MIGZyYW1lIHRvIHRoZSBmaXJzdCBsZXZlbCBvZiBoZWFkZXJzIChubyBFQVAKKyAqIGhlYWRlcnMgYXJlIHBhcnNlZCkuIAorICoKKyAqIE5PVEU6IFRoaXMgaXMgYSBub24tZGVzdHJ1Y3RpdmUgcmVhZCwgdGhhdCBpcyB0aGUKKyAqIGhlYWRlcnMgYXJlIG5vdCBzdHJpcHBlZCBvZmYgdGhlIHBhY2tldC4gSG93ZXZlciwgYW55IGFkZGl0aW9uYWwKKyAqIGRhdGEgYXQgIHRoZSBlbmQgb2YgdGhlIHBhY2tldCwgYmV5b25kIHdoYXQgdGhlIEVBUG9MIGhlYWRlcnMgZW5jb2RlCisgKiB3aWxsIGJlIHN0cmlwcGVkIG9mZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgY29udGFpbmluZyB0aGUgRUFQb0wgZnJhbWUgdG8gcGFyc2UKKyAqIEBwYXJhbSBkc3RNYWMgYSBwb2ludGVyIHRvIHNldCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGRlc3RpbmF0aW9uCisgKiBNQUMgYWRkcmVzcworICogQHBhcmFtIHNyY01hYyBhIHBvaW50ZXIgdG8gc2V0IHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc291cmNlCisgKiBNQUMgYWRkcmVzcworICogQHBhcmFtIHR5cGUgYSBwb2ludGVyIHRvIHNldCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIEVBUE9MIHR5cGUKKyAqIGZpZWxkLgorICoKKyAqIEByZXR1cm4gdGhlIG5vbi1uZWdhdGl2ZSBsZW5ndGggb2YgdGhlIEVBUE9MIHBheWxvYWQgaWYgdGhlIG9wZXJhdGlvbgorICogc3VjY2VlZHMKKyAqLworaW50IAorYW5pRWFwb2xQYXJzZSh0QW5pUGFja2V0ICpwYWNrZXQsCisgICAgICAgICAgICAgIHZfVThfdCAqKmRzdE1hYywgCisgICAgICAgICAgICAgIHZfVThfdCAqKnNyY01hYywgCisgICAgICAgICAgICAgIHZfVThfdCAqKnR5cGUpCit7CisgICAgdl9VMTZfdCBmcmFtZVR5cGU7CisgICAgdl9VOF90ICpwdHI7CisgICAgaW50IHJldFZhbDsKKyAgICBpbnQgdG1wOworCisgICAgaWYgKGFuaUFzZlBhY2tldEdldExlbihwYWNrZXQpIDwgRUFQT0xfQk9EWV9QT1MpCisgICAgICAgIHJldHVybiBBTklfRV9JTExFR0FMX0FSRzsKKworICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEdldEJ5dGVzKHBhY2tldCwgJnB0cik7CisgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkKKyAgICB7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiU3VwcCBwYXJzaW5nIEVBUE9MIHBhY2tldCBvZiBsZW4gJWQ6IFxuIiwKKyAgICAgICAgICAgICAgICByZXRWYWwpOworCisgICAgZnJhbWVUeXBlID0gKHB0cltFVEhFUl9QUk9UT19QT1NdIDw8IDgpICsgcHRyW0VUSEVSX1BST1RPX1BPUysxXTsKKworICAgIC8qCisgICAgICogVmFsaWRhdGUgdGhlIEVBUE9MLUZSQU1FCisgICAgICovCisKKyAgICBpZiAoZnJhbWVUeXBlICE9IEFOSV9FVEhfUF9FQVBPTCkKKyAgICAgICAgcmV0dXJuIEFOSV9FX0lMTEVHQUxfQVJHOworCisgICAgKmRzdE1hYyA9IHB0ciArIERTVF9NQUNfUE9TOworICAgICpzcmNNYWMgPSBwdHIgKyBTUkNfTUFDX1BPUzsKKworICAgIC8vICAgIGlmIChwdHJbRUFQT0xfVkVSU0lPTl9QT1NdICE9IEVBUE9MX1ZFUlNJT05fMSkKKyAgICAvLyAgICAgICAgcmV0dXJuIEFOSV9FX0lMTEVHQUxfQVJHOworCisgICAgKnR5cGUgPSBwdHIgKyBBTklfRUFQT0xfVFlQRV9QT1M7CisgICAgcmV0VmFsID0gKHB0cltFQVBPTF9CT0RZX0xFTl9QT1NdIDw8IDgpICsgcHRyW0VBUE9MX0JPRFlfTEVOX1BPUyArIDFdOworIAorICAgIC8qIAorICAgICAqIFZhbGlkYXRlIHRoZSBsZW5ndGggb2YgdGhlIGJvZHkuIEFsbG93IGZvciBsb25nZXIgCisgICAgICogcGFja2V0cyB0aGFuIGVuY29kZWQsIGJ1dCBlbmNvZGluZyBzaG91bGQgbm90IGJlIGxhcmdlciB0aGFuCisgICAgICogcGFja2V0LgorICAgICAqIE5vdGU6IEVBUE9MIGJvZHkgbGVuIGRvZXMgbm90IGluY2x1ZGUgaGVhZGVycworICAgICAqLworICAgIHRtcCA9IGFuaUFzZlBhY2tldEdldExlbihwYWNrZXQpIC0gRUFQT0xfUlhfSEVBREVSX1NJWkU7CisgICAgaWYgKHJldFZhbCA+IHRtcCkgCisgICAgeworICAgICAgICByZXRWYWwgPSBBTklfRV9JTExFR0FMX0FSRzsKKyAgICB9IAorICAgIGVsc2UgeworICAgICAgICBpZiAocmV0VmFsIDwgdG1wKSAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0VHJ1bmNhdGVGcm9tUmVhcihwYWNrZXQsIHRtcCAtIHJldFZhbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIGFuaUVhcG9sV3JpdGVLZXkKKyAqCisgKiBXcml0ZXMgb3V0IGEgY29tcGxldGUgRUFQT0wtS2V5IGZyYW1lLiBUaGUga2V5IGRlc2NyaXB0b3IgaXMKKyAqIGFwcGVuZGVkIHRvIHRoZSBwYWNrZXQgYW5kIHRoZSBFQVBPTCBoZWFkZXIgaXMgcHJlcGVuZGVkIHRvIGl0LiBJZgorICogYSBtaWNLZXkgaXMgcGFzc2VkIGluLCB0aGVuIGEgTUlDIGlzIGNhbGN1bGF0ZWQgYW5kIGluc2VydGVkIGludG8KKyAqIHRoZSBmcmFtZS4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSBkc3RNYWMgdGhlIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisgKiBAcGFyYW0gc3JjTWFjIHRoZSBzb3VyY2UgTUFDIGFkZHJlc3MKKyAqIEBwYXJhbSBkZXNjVHlwZSB0aGUga2V5IGRlc2NyaXB0b3IgdHlwZQorICogKEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX0xFR0FDWV9SQzQgb3IKKyAqIEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX1JTTikuCisgKiBAcGFyYW0ga2V5RGVzY0RhdGEgdGhlIGtleSBkZXNjcmlwdG9yIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqIGFib3ZlIGRlc2NUeXBlLiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlzIGlnbm9yZWQgYW5kIHdpbGwgYmUKKyAqIGdlbmVyYXRlZCBpbiB0aGUgcGFja2V0LiBUaGUga2V5IGJ5dGVzIGFyZSBleHBlY3RlZCB0byBiZSBlbmNyeXB0ZWQKKyAqIGlmIHRoZXkgbmVlZCB0byBiZSBlbmNyeXB0ZWQuCisgKiBAcGFyYW0gbWljS2V5IHRoZSBNSUMga2V5CisgKiBAcGFyYW0gbWljS2V5TGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIE1JQyBrZXkKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKgorICovCitpbnQKK2FuaUVhcG9sV3JpdGVLZXkodl9VMzJfdCBjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgdEFuaVBhY2tldCAqcGFja2V0LAorICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBkc3RNYWMsIAorICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBzcmNNYWMsIAorICAgICAgICAgICAgICAgICBpbnQgZGVzY1R5cGUsCisgICAgICAgICAgICAgICAgIHZvaWQgKmtleURlc2NEYXRhLAorICAgICAgICAgICAgICAgICB2X1U4X3QgKm1pY0tleSwKKyAgICAgICAgICAgICAgICAgdl9VMzJfdCBtaWNLZXlMZW4pCit7CisgICAgaW50IHJldFZhbDsKKworICAgIGlmIChwYWNrZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYgKChkZXNjVHlwZSA9PSBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXKSAKKyAgICAgICAgICAgICAgICB8fCAoZGVzY1R5cGUgPT0gQU5JX0VBUE9MX0tFWV9ERVNDX1RZUEVfUlNOKSkgCisgICAgICAgIHsKKworICAgICAgICAgICAgcmV0VmFsID0gd3JpdGVSc25LZXlEZXNjKHBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFuaUVhcG9sUnNuS2V5RGVzYyAqKSBrZXlEZXNjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX1JTTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NUeXBlKTsKKyAgICAgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldFZhbCA9IGFkZEVhcG9sSGVhZGVycyhwYWNrZXQsIGRzdE1hYywgc3JjTWFjLCBBTklfRUFQT0xfVFlQRV9LRVkpOworICAgICAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MocmV0VmFsKSApIGJyZWFrOworCisgICAgICAgICAgICByZXRWYWwgPSB3cml0ZVJzbktleU1pYyhjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFuaUVhcG9sUnNuS2V5RGVzYyAqKSBrZXlEZXNjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY0tleSwgbWljS2V5TGVuKTsKKyAgICAgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKHJldFZhbCkgKSBicmVhazsKKworICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgIHJldHVybiBBTklfRV9JTExFR0FMX0FSRzsKKyAgICAgICAgfQorICAgIH13aGlsZSggMCApOworCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworCisvKioKKyAqIGFuaUVhcG9sUGFyc2VLZXkKKyAqCisgKiBQYXJzZXMgYW5kIHZlcmlmaWVzIGEgY29tcGxldGUgRUFQT0wtS2V5IGZyYW1lLiBUaGUga2V5IGRlc2NyaXB0b3IKKyAqIHR5cGUgaXMgcmV0dXJuZWQgYW5kIHNvIGlzIGEgbmV3bHkgYWxsb2NhdGVkIGtleSBkZXNjcmlwdG9yIHN0cnVjdHVyZQorICogdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUuCisgKgorICogTk9URTogVGhpcyBpcyBhIG5vbi1kZXN0cnVjdGl2ZSByZWFkLiBUaGF0IGlzLCB0aGUgcGFja2V0IGhlYWRlcnMKKyAqIHdpbGwgYmUgdW5jaGFuZ2VkIGF0IHRoZSBlbmQgb2YgdGhpcyByZWFkIG9wZXJhdGlvbi4gVGhpcyBpcyBzbworICogdGhhdCBhIGZvbGxvd3VwIE1JQyBjaGVjayBtYXkgYmUgZG9uZSBvbiB0aGUgY29tcGxldGUgcGFja2V0LiBJZgorICogdGhlIHBhY2tldCBwYXJzaW5nIGZhaWxzLCB0aGUgcGFja2V0IGhlYWRlcnMgYXJlIG5vdCBndWFyYW50ZWVkIHRvCisgKiBiZSB1bmNoYW5nZWQuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHJlYWQgZnJvbS4gTm90ZSB0aGF0IHRoZSBmcmFtZSBpcyBub3QKKyAqIGV4cGVjdGVkIHRvIGNvbnRhaW4gYW55IGFkZGl0aW9uYWwgcGFkZGluZyBhdCB0aGUgZW5kIG90aGVyIHRoYW4KKyAqIHRoZSBleGFjdCBudW1iZXIgb2Yga2V5IGJ5dGVzLiAoVGhlIGFuaUVhcG9sUGFyc2UgZnVuY3Rpb24gd2lsbAorICogZW5zdXJlIHRoaXMuKQorICogQHBhcmFtIGRlc2NUeXBlIGlzIHNldCB0byB0aGUga2V5IGRlc2NyaXB0b3IgdHlwZQorICogKEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX0xFR0FDWV9SQzQgb3IKKyAqIEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX1JTTikuCisgKiBAcGFyYW0ga2V5RGVzY0RhdGEgaXMgc2V0IHRvIGEgbmV3bHkgYWxsb2NhdGVkIGtleSBkZXNjcmlwdG9yCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBhYm92ZSBkZXNjVHlwZS4gVGhlIHNpZ25hdHVyZSBmaWVsZCBpcworICogdmVyaWZpZWQuIFRoZSBrZXkgYnl0ZXMgd2lsbCBiZSByZXR1cm5lZCBlbmNyeXB0ZWQuIEl0IGlzIHRoZQorICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBmcmVlIHRoaXMgc3RydWN0dXJlIGFuZCB0aGUgZGF0YQorICogY29udGFpbmVkIHRoZXJlaW4uCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUVhcG9sUGFyc2VLZXkodEFuaVBhY2tldCAqcGFja2V0LAorICAgICAgICAgICAgICAgICBpbnQgKmRlc2NUeXBlLAorICAgICAgICAgICAgICAgICB2b2lkICoqa2V5RGVzY0RhdGEpCit7CisgICAgaW50IHJldFZhbDsKKyAgICB2X1U4X3QgKmJ5dGVzOworICAgIHZfVTMyX3QgZWFwb2xGcmFtZUxlbjsKKworICAgIGlmIChwYWNrZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEFOSV9FX05VTExfVkFMVUU7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgZWFwb2xGcmFtZUxlbiA9IGFuaUFzZlBhY2tldEdldExlbihwYWNrZXQpOworCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiU3VwcCBwYXJzaW5nIEVBUE9MLUtleSBmcmFtZSBvZiBsZW4gJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAgIGVhcG9sRnJhbWVMZW4pOworCisgICAgICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldFRydW5jYXRlRnJvbUZyb250KHBhY2tldCwgRUFQT0xfUlhfSEVBREVSX1NJWkUpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyhyZXRWYWwpICkgYnJlYWs7CisgICAgICAgIAorICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRHZXRCeXRlcyhwYWNrZXQsICZieXRlcyk7CisgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKHJldFZhbCkgKSBicmVhazsKKworICAgICAgICBpZiAoKmJ5dGVzID09IEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX1JTTiB8fAorICAgICAgICAgICAgICAgICAgICpieXRlcyA9PSBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXKSAKKyAgICAgICAgeworICAgICAgICAgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyAqcnNuRGVzYyA9IE5VTEw7CisKKyAgICAgICAgICAgIC8vKmRlc2NUeXBlID0gQU5JX0VBUE9MX0tFWV9ERVNDX1RZUEVfUlNOOworICAgICAgICAgICAgKmRlc2NUeXBlID0gKCpieXRlcyA9PSBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXID8gIAorICAgICAgICAgICAgICAgICBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXIDogIEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX1JTTikgOworICAgICAgICAgICAgcmV0VmFsID0gcGFyc2VSc25LZXlEZXNjKHBhY2tldCwgJnJzbkRlc2MpOworICAgICAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MocmV0VmFsKSApIGJyZWFrOworICAgICAgICAgICAgKmtleURlc2NEYXRhID0gcnNuRGVzYzsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiU3VwcCByZWNlaXZlZCB1bmtub3duIEVBUE9MLUtleSBkZXNjcmlwdG9yOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICpieXRlcyk7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfRV9JTExFR0FMX0FSRzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYW5pQXNmUGFja2V0TW92ZUxlZnQocGFja2V0LCBlYXBvbEZyYW1lTGVuKTsKKyAgICB9d2hpbGUoIDAgKTsKKyAgICAKKyAgICByZXR1cm4gcmV0VmFsOworfQorCisKKworc3RhdGljIGludAorcGFyc2VSc25LZXlEZXNjKHRBbmlQYWNrZXQgKnBhY2tldCwgCisgICAgICAgICAgICAgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyAqKnJzbkRlc2NQdHIpCit7CisgICAgaW50IHJldFZhbCA9IEFOSV9PSzsKKyAgICBpbnQgbGVuOworICAgIHZfVThfdCAqYnl0ZXM7CisgICAgdEFuaUVhcG9sUnNuS2V5RGVzYyAqcnNuRGVzYyA9IE5VTEw7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgYW5pQXNmUGFja2V0VHJ1bmNhdGVGcm9tRnJvbnQocGFja2V0LCAxKTsgLy8gRGVzYy1UeXBlCisKKyAgICAgICAgcnNuRGVzYyA9ICh0QW5pRWFwb2xSc25LZXlEZXNjICopIAorICAgICAgICAgICAgdm9zX21lbV9tYWxsb2MoIHNpemVvZih0QW5pRWFwb2xSc25LZXlEZXNjKSApOworCisgICAgICAgIGlmIChyc25EZXNjID09IE5VTEwpIAorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJTdXBwIGNvdWxkIG5vdCBtYWxsb2MgRUFQT0wtS2V5IERlc2NyaXB0b3IgZm9yIFJTTlxuIik7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfRV9NQUxMT0NfRkFJTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXRWYWwgPSBwYXJzZVJzbktleUluZm8ocGFja2V0LCAmcnNuRGVzYy0+aW5mbyk7CisgICAgICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKSBicmVhazsKKworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRHZXQxNihwYWNrZXQsICZyc25EZXNjLT5rZXlMZW4pOworICAgICAgICBpZiAocmV0VmFsICE9IEFOSV9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBzaXplb2YocnNuRGVzYy0+cmVwbGF5Q291bnRlcik7CisgICAgICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEdldE4ocGFja2V0LCBsZW4sICZieXRlcyk7CisgICAgICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2b3NfbWVtX2NvcHkocnNuRGVzYy0+cmVwbGF5Q291bnRlciwgYnl0ZXMsIGxlbik7CisKKyAgICAgICAgbGVuID0gc2l6ZW9mKHJzbkRlc2MtPmtleU5vbmNlKTsKKyAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0R2V0TihwYWNrZXQsIGxlbiwgJmJ5dGVzKTsKKyAgICAgICAgaWYgKHJldFZhbCAhPSBBTklfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZvc19tZW1fY29weShyc25EZXNjLT5rZXlOb25jZSwgYnl0ZXMsIGxlbik7CisKKyAgICAgICAgbGVuID0gc2l6ZW9mKHJzbkRlc2MtPmtleUl2KTsKKyAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0R2V0TihwYWNrZXQsIGxlbiwgJmJ5dGVzKTsKKyAgICAgICAgaWYgKHJldFZhbCAhPSBBTklfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZvc19tZW1fY29weShyc25EZXNjLT5rZXlJdiwgYnl0ZXMsIGxlbik7CisKKyAgICAgICAgbGVuID0gc2l6ZW9mKHJzbkRlc2MtPmtleVJlY3ZTZXFDb3VudGVyKTsKKyAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0R2V0TihwYWNrZXQsIGxlbiwgJmJ5dGVzKTsKKyAgICAgICAgaWYgKHJldFZhbCAhPSBBTklfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZvc19tZW1fY29weShyc25EZXNjLT5rZXlSZWN2U2VxQ291bnRlciwgYnl0ZXMsIGxlbik7ICAgIAorCisgICAgICAgIGxlbiA9IHNpemVvZihyc25EZXNjLT5rZXlJZCk7CisgICAgICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEdldE4ocGFja2V0LCBsZW4sICZieXRlcyk7CisgICAgICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2b3NfbWVtX2NvcHkocnNuRGVzYy0+a2V5SWQsIGJ5dGVzLCBsZW4pOworCisgICAgICAgIGxlbiA9IHNpemVvZihyc25EZXNjLT5rZXlNaWMpOworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRHZXROKHBhY2tldCwgbGVuLCAmYnl0ZXMpOworICAgICAgICBpZiAocmV0VmFsICE9IEFOSV9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdm9zX21lbV9jb3B5KHJzbkRlc2MtPmtleU1pYywgYnl0ZXMsIGxlbik7CisKKyAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0R2V0MTYocGFja2V0LCAmcnNuRGVzYy0+a2V5RGF0YUxlbik7CisgICAgICAgIGlmIChyZXRWYWwgIT0gQU5JX09LKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IHJzbkRlc2MtPmtleURhdGFMZW47CisgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGEga2V5CisgICAgICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRHZXROKHBhY2tldCwgbGVuLCAmYnl0ZXMpOworICAgICAgICAgICAgaWYgKHJldFZhbCAhPSBBTklfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByc25EZXNjLT5rZXlEYXRhID0gKHZfVThfdCopdm9zX21lbV9tYWxsb2MobGVuKTsKKyAgICAgICAgICAgIGlmIChyc25EZXNjLT5rZXlEYXRhID09IE5VTEwpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBSU04ga2V5IGJ5dGVzIVxuIik7CisgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgICAgICAgICAgIHJldFZhbCA9IEFOSV9FX01BTExPQ19GQUlMRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkocnNuRGVzYy0+a2V5RGF0YSwgYnl0ZXMsIGxlbik7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcnNuRGVzYy0+a2V5RGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAqcnNuRGVzY1B0ciA9IHJzbkRlc2M7CisKKyAgICB9d2hpbGUoIDAgKTsKKworICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwgKSApCisgICAgeworICAgICAgICB2b3NfbWVtX2ZyZWUocnNuRGVzYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIGludAorcGFyc2VSc25LZXlJbmZvKHRBbmlQYWNrZXQgKnBhY2tldCwgCisgICAgICAgICAgICAgICAgdEFuaVJzbktleUluZm8gKmluZm8pCit7CisgICAgdl9VMTZfdCB0bXA7CisgICAgaW50IHJldFZhbDsKKworICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEdldDE2KHBhY2tldCwgJnRtcCk7CisgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkKKyAgICB7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisgICAgaW5mby0+a2V5RGVzY1ZlcnMgPSAodG1wICYgQU5JX1NTTV9SU05fS0VZX0RFU0NfVkVSU19NQVNLKSAKKyAgICAgICAgPj4gQU5JX1NTTV9SU05fS0VZX0RFU0NfVkVSU19PRkZTRVQ7CisgICAgaWYgKGluZm8tPmtleURlc2NWZXJzICE9IEFOSV9FQVBPTF9LRVlfREVTQ19WRVJTX1JDNCAmJgorICAgICAgICBpbmZvLT5rZXlEZXNjVmVycyAhPSBBTklfRUFQT0xfS0VZX0RFU0NfVkVSU19BRVMpCisgICAgICAgIHJldHVybiBBTklfRV9JTExFR0FMX0FSRzsKKworICAgIGluZm8tPnVuaWNhc3RGbGFnID0gKHRtcCAmIEFOSV9TU01fUlNOX1VOSUNBU1RfTUFTSykgPyAKKyAgICAgICAgZUFOSV9CT09MRUFOX1RSVUUgOiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgaW5mby0+a2V5SWQgICAgPSAodG1wICYgQU5JX1NTTV9SU05fS0VZX0lOREVYX01BU0spCisgICAgICAgID4+IEFOSV9TU01fUlNOX0tFWV9JTkRFWF9PRkZTRVQ7CisgICAgaW5mby0+aW5zdGFsbEZsYWcgPSAodG1wICYgQU5JX1NTTV9SU05fSU5TVEFMTF9NQVNLKSA/CisgICAgICAgIGVBTklfQk9PTEVBTl9UUlVFIDogZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGluZm8tPmFja0ZsYWcgICAgID0gKHRtcCAmIEFOSV9TU01fUlNOX0FDS19NQVNLKSA/CisgICAgICAgIGVBTklfQk9PTEVBTl9UUlVFIDogZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGluZm8tPm1pY0ZsYWcgICAgID0gKHRtcCAmIEFOSV9TU01fUlNOX01JQ19NQVNLKSA/CisgICAgICAgIGVBTklfQk9PTEVBTl9UUlVFIDogZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGluZm8tPnNlY3VyZUZsYWcgID0gKHRtcCAmIEFOSV9TU01fUlNOX1NFQ1VSRV9NQVNLKSA/CisgICAgICAgIGVBTklfQk9PTEVBTl9UUlVFIDogZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGluZm8tPmVycm9yRmxhZyAgID0gKHRtcCAmIEFOSV9TU01fUlNOX0VSUk9SX01BU0spID8KKyAgICAgICAgZUFOSV9CT09MRUFOX1RSVUU6IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBpbmZvLT5yZXF1ZXN0RmxhZyA9ICh0bXAgJiBBTklfU1NNX1JTTl9SRVFVRVNUX01BU0spID8KKyAgICAgICAgZUFOSV9CT09MRUFOX1RSVUUgOiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgaW5mby0+ZW5jS2V5RGF0YUZsYWcgPSAodG1wICYgQU5JX1NTTV9SU05fRU5DX0tFWV9EQVRBX01BU0spID8KKyAgICAgICAgZUFOSV9CT09MRUFOX1RSVUUgOiBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCisKK3N0YXRpYyBpbnQKK3dyaXRlUnNuS2V5RGVzYyh0QW5pUGFja2V0ICpwYWNrZXQsIAorICAgICAgICAgICAgICAgIHRBbmlFYXBvbFJzbktleURlc2MgKnJzbkRlc2MsCisgICAgICAgICAgICAgICAgdl9VOF90IGtleURlc2NUeXBlKQoreworICAgIGludCByZXRWYWw7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gYmUgZWl0aGVyIEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX1JTTgorICAgICAgICAvLyBvciBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXCisgICAgICAgIHJldFZhbCA9IGFuaUFzZlBhY2tldEFwcGVuZDgocGFja2V0LCBrZXlEZXNjVHlwZSk7CisgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwgKSApIGJyZWFrOworCisgICAgICAgIHJldFZhbCA9IHdyaXRlUnNuS2V5SW5mbyhwYWNrZXQsICZyc25EZXNjLT5pbmZvKTsKKyAgICAgICAgaWYoICFBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkgYnJlYWs7CisKKyAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0QXBwZW5kMTYocGFja2V0LCByc25EZXNjLT5rZXlMZW4pOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIocGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzbkRlc2MtPnJlcGxheUNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocnNuRGVzYy0+cmVwbGF5Q291bnRlcikpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIocGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzbkRlc2MtPmtleU5vbmNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyc25EZXNjLT5rZXlOb25jZSkpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIocGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzbkRlc2MtPmtleUl2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyc25EZXNjLT5rZXlJdikpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIocGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzbkRlc2MtPmtleVJlY3ZTZXFDb3VudGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyc25EZXNjLT5rZXlSZWN2U2VxQ291bnRlcikpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIocGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzbkRlc2MtPmtleUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyc25EZXNjLT5rZXlJZCkpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICAvLyBaZXJvIG91dCB0aGUga2V5IE1JQworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIocGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk9fQllURVMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJzbkRlc2MtPmtleU1pYykpOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmQxNihwYWNrZXQsIHJzbkRlc2MtPmtleURhdGFMZW4pOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKworICAgICAgICBpZiAocnNuRGVzYy0+a2V5RGF0YUxlbiAhPSAwKSAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0QXBwZW5kQnVmZmVyKHBhY2tldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNuRGVzYy0+a2V5RGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNuRGVzYy0+a2V5RGF0YUxlbik7CisgICAgICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKyAgICAgICAgfQorICAgIH13aGlsZSggMCApOworCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIGludAord3JpdGVSc25LZXlJbmZvKHRBbmlQYWNrZXQgKnBhY2tldCwgdEFuaVJzbktleUluZm8gKmluZm8pCit7CisgICAgaW50IHJldFZhbDsKKyAgICB2X1UxNl90IHRtcDsKKyAgICB2X1UxNl90IGluZm9WYWx1ZTsKKworICAgIGluZm9WYWx1ZSA9IDA7CisKKyAgICB0bXAgPSAodl9VMTZfdClpbmZvLT5rZXlEZXNjVmVyczsKKyAgICB0bXAgPSB0bXAgPDwgQU5JX1NTTV9SU05fS0VZX0RFU0NfVkVSU19PRkZTRVQ7CisgICAgaW5mb1ZhbHVlIHw9ICh0bXAgJiBBTklfU1NNX1JTTl9LRVlfREVTQ19WRVJTX01BU0spOworCisgICAgaWYgKGluZm8tPnVuaWNhc3RGbGFnKQorICAgICAgICBpbmZvVmFsdWUgfD0gQU5JX1NTTV9SU05fVU5JQ0FTVF9NQVNLOworCisgICAgdG1wID0gaW5mby0+a2V5SWQ7CisgICAgdG1wID0gdG1wIDw8IEFOSV9TU01fUlNOX0tFWV9JTkRFWF9PRkZTRVQ7CisgICAgaW5mb1ZhbHVlIHw9ICh0bXAgJiBBTklfU1NNX1JTTl9LRVlfSU5ERVhfTUFTSyk7CisKKyAgICBpZiAoaW5mby0+aW5zdGFsbEZsYWcpCisgICAgICAgIGluZm9WYWx1ZSB8PSBBTklfU1NNX1JTTl9JTlNUQUxMX01BU0s7CisKKyAgICBpZiAoaW5mby0+YWNrRmxhZykKKyAgICAgICAgaW5mb1ZhbHVlIHw9IEFOSV9TU01fUlNOX0FDS19NQVNLOworCisgICAgaWYgKGluZm8tPm1pY0ZsYWcpCisgICAgICAgIGluZm9WYWx1ZSB8PSBBTklfU1NNX1JTTl9NSUNfTUFTSzsKKworICAgIGlmIChpbmZvLT5zZWN1cmVGbGFnKQorICAgICAgICBpbmZvVmFsdWUgfD0gQU5JX1NTTV9SU05fU0VDVVJFX01BU0s7CisKKyAgICBpZiAoaW5mby0+ZXJyb3JGbGFnKQorICAgICAgICBpbmZvVmFsdWUgfD0gQU5JX1NTTV9SU05fRVJST1JfTUFTSzsKKworICAgIGlmIChpbmZvLT5yZXF1ZXN0RmxhZykKKyAgICAgICAgaW5mb1ZhbHVlIHw9IEFOSV9TU01fUlNOX1JFUVVFU1RfTUFTSzsKKyAgICAKKyAgICBpZiAoaW5mby0+ZW5jS2V5RGF0YUZsYWcpCisgICAgICAgIGluZm9WYWx1ZSB8PSBBTklfU1NNX1JTTl9FTkNfS0VZX0RBVEFfTUFTSzsKKyAgICAKKyAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmQxNihwYWNrZXQsIGluZm9WYWx1ZSk7CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCisKK3N0YXRpYyBpbnQKK3dyaXRlUnNuS2V5TWljKHZfVTMyX3QgY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICB0QW5pUGFja2V0ICplYXBvbEZyYW1lLCAKKyAgICAgICAgICAgICAgIHRBbmlFYXBvbFJzbktleURlc2MgKnJzbkRlc2MsCisgICAgICAgICAgICAgICB2X1U4X3QgKm1pY0tleSwgCisgICAgICAgICAgICAgICB2X1UzMl90IG1pY0tleUxlbikKK3sKKyAgICBpbnQgcmV0VmFsID0gQU5JX09LOworICAgIGludCBsZW47CisKKyAgICB2X1U4X3QgKnB0ciA9IE5VTEw7CisgICAgdl9VOF90ICptaWNQb3MgPSBOVUxMOworICAgIHZfVThfdCByZXN1bHRbVk9TX0RJR0VTVF9TSEExX1NJWkVdOyAvLyBMYXJnZXIgb2YgdGhlIHR3bworCisgICAgLy8gU2FuaXR5IGNoZWNrIHRoZSBhcmd1bWVudHMgYW5kIHJldHVybiBpZiBubyBNSUMgZ2VuZXJhdGlvbiBpcworICAgIC8vIG5lZWRlZAorICAgIGlmIChtaWNLZXkgIT0gTlVMTCkgCisgICAgeworICAgICAgICBpZiAobWljS2V5TGVuID09IDAgfHwgIXJzbkRlc2MtPmluZm8ubWljRmxhZykgCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiU3VwcCBNSUMga2V5IHByb3ZpZGVkIGJ1dCBtaWNLZXlMZW4gb3IgbWljRmxhZyBpcyBub3Qgc2V0IVxuIik7CisgICAgICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgICAgICByZXR1cm4gQU5JX0VfSUxMRUdBTF9BUkc7CisgICAgICAgIH0KKyAgICB9IAorICAgIGVsc2UgeworICAgICAgICBpZiAocnNuRGVzYy0+aW5mby5taWNGbGFnKSAKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJTdXBwIG1pY0ZsYWcgaXMgc2V0IGJ1dCBNSUMga2V5IG5vdCBwcm92aWRlZCFcbiIpOworICAgICAgICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgICAgICAgcmV0dXJuIEFOSV9FX0lMTEVHQUxfQVJHOworICAgICAgICB9CisgICAgICAgIC8vIE5vcm1hbCBjb25kaXRpb24gd2hlcmUgTUlDIGlzIG5vdCBkZXNpcmVkIGJ5IHRoZSBjYWxsZXIKKyAgICAgICAgcmV0dXJuIEFOSV9PSzsKKyAgICB9CisKKyAgICBsZW4gPSBhbmlBc2ZQYWNrZXRHZXRCeXRlcyhlYXBvbEZyYW1lLCAmcHRyKTsKKyAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggbGVuICkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBtaWNQb3MgPSBwdHIgKyBBTklfU1NNX1JTTl9LRVlfTUlDX09GRlNFVCArIFNOQVBfSEVBREVSX1NJWkU7CisKKyAgICAvLyBDbGVhciB0aGUgTUlDIGZpZWxkIGluIHRoZSBwYWNrZXQgYmVmb3JlIHRoZSBNSUMgY29tcHV0YXRpb24KKyAgICB2b3NfbWVtX3plcm8oIG1pY1BvcywgVk9TX0RJR0VTVF9NRDVfU0laRSk7CisKKyAgICAvLyBTa2lwIHRvIHRoZSBFQVBPTCB2ZXJzaW9uIGZpZWxkIGZvciBNSUMgY29tcHV0YXRpb24KKyAgICBwdHIgKz0gRUFQT0xfVkVSU0lPTl9QT1MgKyBTTkFQX0hFQURFUl9TSVpFOworICAgIGxlbiAtPSAoRUFQT0xfVkVSU0lPTl9QT1MgKyBTTkFQX0hFQURFUl9TSVpFKTsKKworICAgIGlmIChyc25EZXNjLT5pbmZvLmtleURlc2NWZXJzID09IEFOSV9FQVBPTF9LRVlfREVTQ19WRVJTX0FFUykgCisgICAgeworICAgICAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3Nfc2hhMV9obWFjX3N0cihjcnlwdEhhbmRsZSwgcHRyLCBsZW4sIG1pY0tleSwgbWljS2V5TGVuLCByZXN1bHQpICkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfT0s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXRWYWwgPSBBTklfRVJST1I7CisgICAgICAgIH0KKyAgICB9IAorICAgIGVsc2UgeworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIHJldFZhbCA9IEFOSV9FX0lMTEVHQUxfQVJHOworICAgIH0KKworICAgIGlmIChyZXRWYWwgPT0gQU5JX09LKSAKKyAgICB7CisgICAgICAgIC8vIENvcHkgb25seSAxNkIgd2hpY2ggaXMgdGhlIHNtYWxsZXIgb2YgdGhlIHR3byBhbmQgdGhlIHNhbWUgYXMKKyAgICAgICAgLy8gQU5JX0VBUE9MX0tFWV9SU05fTUlDX1NJWkUKKyAgICAgICAgdm9zX21lbV9jb3B5KG1pY1BvcywgcmVzdWx0LCBWT1NfRElHRVNUX01ENV9TSVpFKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIGFuaUVhcG9sS2V5Q2hlY2tNaWMKKyAqCisgKiBAcGFyYW0gZWFwb2xGcmFtZSB0aGUgY29tcGxldGUgRUFQT0wtS2V5IHBhY2tldAorICogQHBhcmFtIGRlc2NUeXBlIHRoZSBrZXkgZGVzY3JpcHRvciB0eXBlCisgKiBAcGFyYW0ga2V5RGVzY0RhdGEgdGhlIGtleSBkZXNjcmlwdG9yCisgKiBAcGFyYW0gbWljS2V5IHRoZSBNSUMga2V5CisgKiBAcGFyYW0gbWljS2V5TGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIE1JQyBrZXkKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzOyBBTklfRV9NSUNfRkFJTEVEIGlmIHRoZQorICogTUlDIGNoZWNrIGZhaWxzLgorICovCitpbnQKK2FuaUVhcG9sS2V5Q2hlY2tNaWModl9VMzJfdCBjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgdEFuaVBhY2tldCAqZWFwb2xGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlc2NUeXBlLAorICAgICAgICAgICAgICAgICAgICB2b2lkICprZXlEZXNjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdl9VOF90ICptaWNLZXksCisgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbWljS2V5TGVuKQoreworICAgIGlmIChkZXNjVHlwZSA9PSBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXKSAKKyAgICB7CisgICAgICAgIHJldHVybiBjaGVja1JzbktleU1pYyhjcnlwdEhhbmRsZSwgZWFwb2xGcmFtZSwga2V5RGVzY0RhdGEsIG1pY0tleSwgbWljS2V5TGVuKTsKKyAgICB9IAorICAgIGVsc2UgeworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIHJldHVybiBBTklfRV9JTExFR0FMX0FSRzsKKyAgICB9Cit9CisKKworc3RhdGljIGludAorY2hlY2tSc25LZXlNaWModl9VMzJfdCBjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgIHRBbmlQYWNrZXQgKmVhcG9sRnJhbWUsCisgICAgICAgICAgICAgICB0QW5pRWFwb2xSc25LZXlEZXNjICpyc25EZXNjLAorICAgICAgICAgICAgICAgdl9VOF90ICptaWNLZXksCisgICAgICAgICAgICAgICB2X1UzMl90IG1pY0tleUxlbikgCit7CisgICAgaW50IHJldFZhbCA9IEFOSV9FUlJPUjsKKyAgICBpbnQgbGVuOworCisgICAgdl9VOF90ICpwdHIgPSBOVUxMOworICAgIHZfVThfdCAqbWljUG9zID0gTlVMTDsKKworICAgIHZfVThfdCByZXN1bHRbVk9TX0RJR0VTVF9TSEExX1NJWkVdOyAvLyBMYXJnZXIgb2YgdGhlIHR3bworICAgIHZfVThfdCBpbmNvbWluZ01pY1tBTklfRUFQT0xfS0VZX1JTTl9NSUNfU0laRV07CisKKyAgICBpZiAoIXJzbkRlc2MtPmluZm8ubWljRmxhZykgCisgICAgeworICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIHJldHVybiBBTklfRV9JTExFR0FMX0FSRzsKKyAgICB9CisKKyAgICBsZW4gPSBhbmlBc2ZQYWNrZXRHZXRCeXRlcyhlYXBvbEZyYW1lLCAmcHRyKTsKKyAgICBpZiggQU5JX0lTX1NUQVRVU19TVUNDRVNTKCBsZW4gKSApCisgICAgeworICAgICAgICBtaWNQb3MgPSBwdHIgKyBBTklfU1NNX1JTTl9LRVlfTUlDX09GRlNFVDsKKworICAgICAgICAvLyBTa2lwIHRvIHRoZSBFQVBPTCB2ZXJzaW9uIGZpZWxkIGZvciBNSUMgY29tcHV0YXRpb24KKyAgICAgICAgcHRyICs9IEVBUE9MX1ZFUlNJT05fUE9TOworICAgICAgICBsZW4gLT0gRUFQT0xfVkVSU0lPTl9QT1M7CisKKyAgICAgICAgLy8gQ29weSBleGlzdGluZyBNSUMgdG8gdGVtcG9yYXJ5IGxvY2F0aW9uIGFuZCB6ZXJvIGl0IG91dAorICAgICAgICB2b3NfbWVtX2NvcHkoIGluY29taW5nTWljLCBtaWNQb3MsIEFOSV9FQVBPTF9LRVlfUlNOX01JQ19TSVpFICk7CisgICAgICAgIHZvc19tZW1femVybyggbWljUG9zLCBBTklfRUFQT0xfS0VZX1JTTl9NSUNfU0laRSApOworCisgICAgICAgIGlmIChyc25EZXNjLT5pbmZvLmtleURlc2NWZXJzID09IEFOSV9FQVBPTF9LRVlfREVTQ19WRVJTX0FFUykgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc19zaGExX2htYWNfc3RyKGNyeXB0SGFuZGxlLCBwdHIsIGxlbiwgbWljS2V5LCBtaWNLZXlMZW4sIHJlc3VsdCkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gQU5JX09LOworICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgIHJldFZhbCA9IEFOSV9FX0lMTEVHQUxfQVJHOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldFZhbCA9PSBBTklfT0spIAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICF2b3NfbWVtX2NvbXBhcmUoaW5jb21pbmdNaWMsIHJlc3VsdCwgQU5JX0VBUE9MX0tFWV9SU05fTUlDX1NJWkUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IEFOSV9FX01JQ19GQUlMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCisvKioKKyAqIGFuaUVhcG9sS2V5RnJlZURlc2MKKyAqCisgKiBGcmVlcyB0aGUgRUFQT0wga2V5IGRlc2NyaXB0b3IgYW5kIHRoZSBrZXkgYnl0ZXMgY29udGFpbmVkIHdpdGhpbiBpdC4KKyAqCisgKiBAcGFyYW0gZGVzY1R5cGUgdGhlIGtleSBkZXNjcmlwdG9yIHR5cGUKKyAqIEBwYXJhbSBrZXlEZXNjRGF0YSB0aGUga2V5IGRlc2NyaXB0b3IKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYW5pRWFwb2xLZXlGcmVlRGVzYyhpbnQgZGVzY1R5cGUsIHZvaWQgKmtleURlc2NEYXRhKQoreworICAgIHRBbmlFYXBvbFJzbktleURlc2MgKnJzbkRlc2M7CisKKyAgICBpZigga2V5RGVzY0RhdGEgKQorICAgIHsKKyAgICAgICAgaWYgKChkZXNjVHlwZSA9PSBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXKSAKKyAgICAgICAgICAgICAgICB8fCAoZGVzY1R5cGUgPT0gQU5JX0VBUE9MX0tFWV9ERVNDX1RZUEVfUlNOKSkgCisgICAgICAgIHsKKworICAgICAgICAgICAgcnNuRGVzYyA9ICh0QW5pRWFwb2xSc25LZXlEZXNjICopIGtleURlc2NEYXRhOworICAgICAgICAgICAgaWYgKHJzbkRlc2MtPmtleURhdGEgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocnNuRGVzYy0+a2V5RGF0YSk7CisKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiU3VwcCBhc2tlZCB0byBmcmVlIGlsbGVnYWwgdHlwZTogJWRcbiIsIGRlc2NUeXBlKTsKKworICAgICAgICB9CisKKyAgICAgICAgdm9zX21lbV9mcmVlKGtleURlc2NEYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gQU5JX09LOworfQorCit2X1U4X3QgKgorYW5pRWFwb2xUeXBlMlN0cih2X1U4X3QgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIAorICAgIHsKKyAgICBjYXNlIEFOSV9FQVBPTF9UWVBFX1BBQ0tFVDoKKyAgICAgICAgcmV0dXJuICh2X1U4X3QgKilBTklfRUFQT0xfVFlQRV9QQUNLRVRfU1RSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFOSV9FQVBPTF9UWVBFX1NUQVJUOgorICAgICAgICByZXR1cm4gKHZfVThfdCAqKUFOSV9FQVBPTF9UWVBFX1NUQVJUX1NUUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTklfRUFQT0xfVFlQRV9MT0dPRkY6CisgICAgICAgIHJldHVybiAodl9VOF90ICopQU5JX0VBUE9MX1RZUEVfTE9HT0ZGX1NUUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTklfRUFQT0xfVFlQRV9LRVk6CisgICAgICAgIHJldHVybiAodl9VOF90ICopQU5JX0VBUE9MX1RZUEVfS0VZX1NUUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTklfRUFQT0xfVFlQRV9BU0ZfQUxFUlQ6CisgICAgICAgIHJldHVybiAodl9VOF90ICopQU5JX0VBUE9MX1RZUEVfQVNGX0FMRVJUX1NUUjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICh2X1U4X3QgKilBTklfRUFQT0xfVFlQRV9VTktOT1dOX1NUUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3ZvaWQgYmFwUnNuRWFwb2xIYW5kbGVyKCB2X1BWT0lEX3QgcHZGc20sIHRBbmlQYWNrZXQgKnBhY2tldCwgdl9CT09MX3QgZklzQXV0aCApCit7CisgICAgaW50IHJldFZhbDsKKyAgICB2X1U4X3QgKmRzdE1hYyA9IE5VTEw7CisgICAgdl9VOF90ICpzcmNNYWMgPSBOVUxMOworICAgIHZfVThfdCAqdHlwZSA9IE5VTEw7CisKKyAgICByZXRWYWwgPSBhbmlFYXBvbFBhcnNlKHBhY2tldCwgJmRzdE1hYywgJnNyY01hYywgJnR5cGUpOworICAgIGlmICggcmV0VmFsID49IDAgKQorICAgIHsKKyAgICAgICAgcmV0VmFsID0gQU5JX09LOworCisgICAgICAgIC8vIFNhbml0eSBjaGVjayB0aGF0IGEgUEFFIHJvbGUgaGFzIGJlZW4gYXNzaWduZWQgdG8gaXQsCisgICAgICAgIC8vIGFuZCB0aGVuIGRpc3BhdGNoIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyCisKKyAgICAgICAgaWYoIGZJc0F1dGggKQorICAgICAgICB7CisgICAgICAgICAgICB0QXV0aFJzbkZzbSAqZnNtID0gKHRBdXRoUnNuRnNtICopcHZGc207CisgICAgICAgICAgICBhdXRoRWFwb2xIYW5kbGVyKCBmc20sIHBhY2tldCwgZHN0TWFjLCBzcmNNYWMsIHR5cGUgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRTdXBwUnNuRnNtICpmc20gPSAodFN1cHBSc25Gc20gKilwdkZzbTsKKyAgICAgICAgICAgIHN1cHBFYXBvbEhhbmRsZXIoZnNtLCBwYWNrZXQsIGRzdE1hYywgc3JjTWFjLCB0eXBlKTsKKyAgICAgICAgfSAvLyBzd2l0Y2ggc3RhdGVtZW50CisgICAgfSAvLyBTdWNjZXNzZnVsbHkgcGFyc2VkIEVBUE9MCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgImVhcG9sSGFuZGxlciBSZWNlaXZlZCBiYWQgRUFQT0wgbWVzc2FnZSBvZiBsZW4gJWQgKHN0YXR1cz0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYW5pQXNmUGFja2V0R2V0TGVuKHBhY2tldCksIHJldFZhbCApOworICAgIH0gCisgICAgYW5pQXNmUGFja2V0RnJlZSggcGFja2V0ICk7Cit9CisKKworaW50IGJhcFJzbkZvcm1Qa3RGcm9tVm9zUGt0KCB0QW5pUGFja2V0ICoqcHBQYWNrZXQsIHZvc19wa3RfdCAqcFZvc1BhY2tldCApCit7CisgICAgaW50IHJldFZhbCA9IEFOSV9FUlJPUjsKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICB2X1UxNl90IHVQa3RMZW47CisjZGVmaW5lIEJBUF9SU05fU05BUF9UWVBFX09GRlNFVCAyMAorI2RlZmluZSBCQVBfUlNOX0VUSEVSTkVUXzNfSEVBREVSX0xFTiAgIDIyCisgICAgdl9VOF90ICpwRnJhbWU7CisgICAgdEFuaVBhY2tldCAqcEFuaVBhY2tldCA9IE5VTEw7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgc3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggcFZvc1BhY2tldCwgJnVQa3RMZW4gKTsKKyAgICAgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSApIGJyZWFrOworICAgICAgICBpZiggKHVQa3RMZW4gPCBCQVBfUlNOX0VUSEVSTkVUXzNfSEVBREVSX0xFTikgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiBhdXRoUnNuUnhGcmFtZUhhbmRsZXIgcmVjZWl2ZSBlYXBvbCBwYWNrZXQgc2l6ZSAoJWQpIHRvbyBzbWFsbCAoJWQpXG4iLCAKKyAgICAgICAgICAgICAgICB1UGt0TGVuLCBCQVBfUlNOX0VUSEVSTkVUXzNfSEVBREVSX0xFTiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHBWb3NQYWNrZXQsIDAsICh2X1ZPSURfdCAqKSZwRnJhbWUsIHVQa3RMZW4gKTsKKyAgICAgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSApIGJyZWFrOworICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBbGxvY2F0ZUV4cGxpY2l0KCZwQW5pUGFja2V0LCB1UGt0TGVuLCAwICk7CisgICAgICAgIGlmKCAhQU5JX0lTX1NUQVRVU19TVUNDRVNTKCByZXRWYWwgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiIGF1dGhSc25SeEZyYW1lSGFuZGxlciBmYWlsZWQgdG8gZ2V0IGJ1ZmZlciBzaXplICglZCkgXG4iLCAKKyAgICAgICAgICAgICAgICB1UGt0TGVuICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhbmlBc2ZQYWNrZXRFbXB0eUV4cGxpY2l0KCBwQW5pUGFja2V0LCAwICk7CisgICAgICAgIHBGcmFtZVtFVEhFUl9QUk9UT19QT1NdID0gcEZyYW1lW0JBUF9SU05fU05BUF9UWVBFX09GRlNFVF07CisgICAgICAgIHBGcmFtZVtFVEhFUl9QUk9UT19QT1MgKyAxXSA9IHBGcmFtZVtCQVBfUlNOX1NOQVBfVFlQRV9PRkZTRVQgKyAxXTsKKyAgICAgICAgLy9wdXNoIGV0aGVybmV0IElJIGhlYWRlciBpbgorICAgICAgICByZXRWYWwgPSBhbmlBc2ZQYWNrZXRBcHBlbmRCdWZmZXIoIHBBbmlQYWNrZXQsIHBGcmFtZSwgRVRIRVJfUFJPVE9fUE9TICsgMiApOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSBicmVhazsKKyAgICAgICAgLy9HZXQgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgaW4KKyAgICAgICAgdVBrdExlbiAtPSBCQVBfUlNOX0VUSEVSTkVUXzNfSEVBREVSX0xFTjsKKyAgICAgICAgVk9TX0FTU0VSVCggdVBrdExlbiA+IDAgKTsKKyAgICAgICAgcmV0VmFsID0gYW5pQXNmUGFja2V0QXBwZW5kQnVmZmVyKCBwQW5pUGFja2V0LCBwRnJhbWUgKyBCQVBfUlNOX0VUSEVSTkVUXzNfSEVBREVSX0xFTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdVBrdExlbiApOworICAgICAgICBpZiggIUFOSV9JU19TVEFUVVNfU1VDQ0VTUyggcmV0VmFsICkgKSAKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIgYXV0aFJzblJ4RnJhbWVIYW5kbGVyIGNhbm5vdCByZXRyaWV2ZSBlYXBvbCBwYXlsb2FkIHNpemUgKCVkKVxuIiwgCisgICAgICAgICAgICAgICAgdVBrdExlbiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9d2hpbGUoIDAgKTsKKworICAgIGlmKCBBTklfSVNfU1RBVFVTX1NVQ0NFU1MoIHJldFZhbCApICkKKyAgICB7CisgICAgICAgICpwcFBhY2tldCA9IHBBbmlQYWNrZXQ7CisgICAgfQorICAgIGVsc2UgaWYoIHBBbmlQYWNrZXQgKQorICAgIHsKKyAgICAgICAgYW5pQXNmUGFja2V0RnJlZSggcEFuaVBhY2tldCApOworICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcFJzblNzbUVhcG9sLmggYi9DT1JFL0JBUC9zcmMvYmFwUnNuU3NtRWFwb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGZlZDhlCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcFJzblNzbUVhcG9sLmgKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogV29vZHNpZGUgTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEZpbGU6ICAgICAgICAkSGVhZGVyOiAvL2RlcG90L3NvZnR3YXJlL3Byb2plY3RzL2ZlYXR1cmVfYnJhbmNoZXMvZ2VuNV9waGFzZTEvb3MvbGludXgvY2xhc3NpYy9hcC9hcHBzL2luY2x1ZGUvYW5pU3NtRWFwb2wuaCMxICQgCisgKiBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdmFyaW91cyB1dGlsaXRpZXMgZm9yIEVBUG9MIGZyYW1lCisgKiBwYXJzaW5nIGFuZCBjcmVhdGlvbi4KKyAqIHJhbmdlLgorICogQXV0aG9yOiAgICAgIE1heWFuayBELiBVcGFkaHlheQorICogRGF0ZTogICAgICAgIDE5LUp1bmUtMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgTW9kaWZpZWQgYnkgICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaWZuZGVmIF9BTklfU1NNX0VBUE9MX0hfCisjZGVmaW5lIF9BTklfU1NNX0VBUE9MX0hfCisKKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKyNpbmNsdWRlICJ2b3NfcGFja2V0LmgiCisjaW5jbHVkZSA8YmFwUnNuQXNmUGFja2V0Lmg+CisKKyNkZWZpbmUgQU5JX0VUSF9QX0VBUE9MIDB4MDAwMworI2RlZmluZSBBTklfRVRIX1BfSVAgMHgwODAwCisKKy8qKgorICogVGhlIEVBUE9MIHR5cGUgZmllbGQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKi8KKyNkZWZpbmUgQU5JX0VBUE9MX1RZUEVfUEFDS0VUIDAKKyNkZWZpbmUgQU5JX0VBUE9MX1RZUEVfU1RBUlQgMQorI2RlZmluZSBBTklfRUFQT0xfVFlQRV9MT0dPRkYgMgorI2RlZmluZSBBTklfRUFQT0xfVFlQRV9LRVkgMworI2RlZmluZSBBTklfRUFQT0xfVFlQRV9BU0ZfQUxFUlQgNAorCisjZGVmaW5lIEVBUE9MX1ZFUlNJT05fMSAweDAxCisKKyNkZWZpbmUgRUFQT0xfUlhfSEVBREVSX1NJWkUgICAgMTgKKyNkZWZpbmUgRUFQT0xfVFhfSEVBREVSX1NJWkUgICAgMjYgIC8vaW5jbHVkZSBMTENfU05BUAorI2RlZmluZSBTTkFQX0hFQURFUl9TSVpFICAgOAorCisjZGVmaW5lIEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX0xFR0FDWV9SQzQgICAxCisvLyBKRVoyMDA0MTAxMiBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkLiAgVGhpcyBuZWVkcyB0byBzdXBwb3J0IEJPVEggCisvLyB0aGUgb2xkZXIgV1BBIEtleSBEZXNjcmlwdG9yIHR5cGUgb2YgMjU0IEFTIFdFTEwgQVMgdGhlIG5ld2VyCisvLyBLZXkgRGVzY3JpcHRvciB0eXBlIG9mIDIKKyNkZWZpbmUgQU5JX0VBUE9MX0tFWV9ERVNDX1RZUEVfUlNOICAgICAgICAyNTQKKy8vI2RlZmluZSBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU04gICAgICAgICAgMgorI2RlZmluZSBBTklfRUFQT0xfS0VZX0RFU0NfVFlQRV9SU05fTkVXICAgICAgMgorCisjZGVmaW5lIEFOSV9FQVBPTF9LRVlfUlNOX1JFUExBWV9DVFJfU0laRSAgOAorI2RlZmluZSBBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFICAgICAgMzIKKyNkZWZpbmUgQU5JX0VBUE9MX0tFWV9SU05fSVZfU0laRSAgICAgICAgIDE2CisjZGVmaW5lIEFOSV9FQVBPTF9LRVlfUlNOX1JTQ19TSVpFICAgICAgICAgOAorI2RlZmluZSBBTklfRUFQT0xfS0VZX1JTTl9JRF9TSVpFICAgICAgICAgIDgKKyNkZWZpbmUgQU5JX0VBUE9MX0tFWV9SU05fTUlDX1NJWkUgICAgICAgIDE2CisjZGVmaW5lIEFOSV9FQVBPTF9LRVlfUlNOX0VOQ19LRVlfU0laRSAxNgorCisjZGVmaW5lIEFOSV9FQVBPTF9LRVlfREVTQ19WRVJTX1JDNCAgICAxCisjZGVmaW5lIEFOSV9FQVBPTF9LRVlfREVTQ19WRVJTX0FFUyAgICAyCisKKyNkZWZpbmUgQU5JX0VBUE9MX0tFWV9SQzRfUkVQTEFZX0NUUl9TSVpFIDgKKyNkZWZpbmUgQU5JX0VBUE9MX0tFWV9SQzRfSVZfU0laRSAgICAgICAgMTYKKyNkZWZpbmUgQU5JX0VBUE9MX0tFVF9SQzRfU0lHTl9TSVpFICAgICAgMTYKKworI2RlZmluZSBBTklfU1NNX0lFX1JTTl9LRVlfREFUQV9FTkNBUFNfSUQgICAgICAgMHhERAorI2RlZmluZSBBTklfU1NNX0lFX1JTTl9HUk9VUF9LRVlfREFUQV9FTkNBUFNfSUQgMQorI2RlZmluZSBBTklfU1NNX0dST1VQX0tFWV9LREVfVFhfQklUICAgICAgICAgICAgMHgwNAorCit0eXBlZGVmIHN0cnVjdCBzQW5pRWFwb2xMZWdhY3lSYzRLZXlEZXNjIHsKKyAgICB2X1UxNl90IGtleUxlbjsKKyAgICB2X1U4X3QgIHJlcGxheUNvdW50ZXJbQU5JX0VBUE9MX0tFWV9SQzRfUkVQTEFZX0NUUl9TSVpFXTsKKyAgICB2X1U4X3QgIGtleUl2W0FOSV9FQVBPTF9LRVlfUkM0X0lWX1NJWkVdOworICAgIHRBTklfQk9PTEVBTiB1bmljYXN0RmxhZzsgLy8gVGhlIGhpZ2ggb3JkZXIgMSBiaXQgb2Yga2V5LWluZGV4CisgICAgdl9VOF90ICBrZXlJZDsgLy8gVGhlIGxvd2VyIG9yZGVyIDcgYml0cyBvZiBrZXktaW5kZXggKGJ1dCAwLi4zIGJhc2VkKQorICAgIHZfVThfdCAgc2lnbmF0dXJlW0FOSV9FQVBPTF9LRVRfUkM0X1NJR05fU0laRV07CisgICAgdl9VOF90ICAqa2V5OworfSB0QW5pRWFwb2xMZWdhY3lSYzRLZXlEZXNjOworCit0eXBlZGVmIHN0cnVjdCBzQW5pUnNuS2V5SW5mbyB7CisgICAgdl9VMzJfdCBrZXlEZXNjVmVyczsKKyAgICB0QU5JX0JPT0xFQU4gdW5pY2FzdEZsYWc7IC8vIFBhaXItd2lzZSBrZXkKKyAgICB2X1UxNl90IGtleUlkOworICAgIHRBTklfQk9PTEVBTiBpbnN0YWxsRmxhZzsKKyAgICB0QU5JX0JPT0xFQU4gYWNrRmxhZzsKKyAgICB0QU5JX0JPT0xFQU4gbWljRmxhZzsKKyAgICB0QU5JX0JPT0xFQU4gc2VjdXJlRmxhZzsKKyAgICB0QU5JX0JPT0xFQU4gZXJyb3JGbGFnOworICAgIHRBTklfQk9PTEVBTiByZXF1ZXN0RmxhZzsKKyAgICB0QU5JX0JPT0xFQU4gZW5jS2V5RGF0YUZsYWc7IC8vIFJTTiBvbmx5IChJcyAwIGluIFdQQSkKK30gdEFuaVJzbktleUluZm87CisKK3R5cGVkZWYgc3RydWN0IHNBbmlFYXBvbFJzbktleURlc2MgeworICAgIHRBbmlSc25LZXlJbmZvIGluZm87CisgICAgdl9VMTZfdCBrZXlMZW47CisgICAgdl9VOF90ICByZXBsYXlDb3VudGVyW0FOSV9FQVBPTF9LRVlfUlNOX1JFUExBWV9DVFJfU0laRV07CisgICAgdl9VOF90ICBrZXlOb25jZVtBTklfRUFQT0xfS0VZX1JTTl9OT05DRV9TSVpFXTsKKyAgICB2X1U4X3QgIGtleUl2W0FOSV9FQVBPTF9LRVlfUlNOX0lWX1NJWkVdOworICAgIHZfVThfdCAga2V5UmVjdlNlcUNvdW50ZXJbQU5JX0VBUE9MX0tFWV9SU05fUlNDX1NJWkVdOworICAgIHZfVThfdCAga2V5SWRbQU5JX0VBUE9MX0tFWV9SU05fSURfU0laRV07CisgICAgdl9VOF90ICBrZXlNaWNbQU5JX0VBUE9MX0tFWV9SU05fTUlDX1NJWkVdOworICAgIHZfVTE2X3Qga2V5RGF0YUxlbjsKKyAgICB2X1U4X3QgICprZXlEYXRhOworfSB0QW5pRWFwb2xSc25LZXlEZXNjOworCisvKioKKyAqIGFuaUVhcG9sV3JpdGVTdGFydAorICoKKyAqIEZVTkNUSU9OOgorICogV3JpdGVzIGFuIEVBUE9MLVN0YXJ0IGZyYW1lIHRvIHRoZSBwYWNrZXQuIEl0IGlzIG9ubHkgdXNlZCBieSB0aGUKKyAqIHN1cHBsaWNhbnQuCisgKgorICogTE9HSUM6CisgKiBQcmVwZW5kIHRoZSBhcHByb3ByaWF0ZSBFQVBPTCBoZWFkZXIgdG8gdGhlIHBhY2tldC4gVGhlcmUgaXMgbm8KKyAqIEVBUE9MIHBheWxvYWQgZm9yIHRoaXMga2luZCBvZiBmcmFtZS4KKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIFRoZSBwYWNrZXQgaGFzIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgZm9yIHByZXBlbmRpbmcgdGhlIGhlYWRlci4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gd2hpY2ggdGhlIGZyYW1lIHNob3VsZCBiZSB3cml0dGVuCisgKiBAcGFyYW0gZHN0TWFjIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgZGVzdGluYXRpb24gKGF1dGhlbnRpY2F0b3IpCisgKiBAcGFyYW0gc3JjTWFjIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgc291cmNlIChzdXBwbGljYW50KQorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlFYXBvbFdyaXRlU3RhcnQodEFuaVBhY2tldCAqcGFja2V0LAorICAgICAgICAgICAgICAgICAgIHRBbmlNYWNBZGRyIGRzdE1hYywKKyAgICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBzcmNNYWMpOworCisvKioKKyAqIGFuaUVhcG9sV3JpdGVFYXBQYWNrZXQKKyAqCisgKiBGVU5DVElPTjoKKyAqIFdyaXRlcyB0aGUgRUFQT0wvRUFQLVBhY2tldCBmcmFtZSBoZWFkZXJzLiBJdCBpcyB1c2VkCisgKiBieSBib3RoIHRoZSBhdXRoZW50aWNhdG9yIGFuZCB0aGUgc3VwcGxpY2FudC4gVGhpcyBjcmVhdGVzIGFuIEVBUE9MCisgKiBmcmFtZSB0aGF0IGlzIGNhcnJ5aW5nIGFuIEVBUCBtZXNzYWdlIGFzIGl0cyBwYXlsb2FkLgorICoKKyAqIExPR0lDOgorICogUHJlcGVuZCB0aGUgYXBwcm9wcmlhdGUgRUFQT0wgaGVhZGVyIHRvIHRoZSBwYWNrZXQuCisgKgorICogQVNTVU1QVElPTlM6CisgKiBUaGUgRUFQIG1lc3NhZ2UgKGllLiwgdGhlIHBheWxvYWQpIGlzIGFscmVhZHkgYXZhaWxhYmxlIGluIHRoZQorICogcGFja2V0IGFuZCB0aGF0IHRoZSBwYWNrZXQgaGFzIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgZm9yCisgKiBwcmVwZW5kaW5nIHRoZSBFQVBPTCBoZWFkZXIuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IGNvbnRhaW5pbmcgdGhlIEVBUCBtZXNzYWdlCisgKiBAcGFyYW0gZHN0TWFjIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgZGVzdGluYXRpb24gKGF1dGhlbnRpY2F0b3IpCisgKiBAcGFyYW0gc3JjTWFjIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgc291cmNlIChzdXBwbGljYW50KQorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlFYXBvbFdyaXRlRWFwUGFja2V0KHRBbmlQYWNrZXQgKmVhcFBhY2tldCwgCisgICAgICAgICAgICAgICAgICAgICAgIHRBbmlNYWNBZGRyIGRzdE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgIHRBbmlNYWNBZGRyIHNyY01hYyk7CisKKy8qKgorICogYW5pRWFwb2xQYXJzZQorICoKKyAqIEZVTkNUSU9OOgorICogUGFyc2VzIGFuIEVBUG9MIGZyYW1lIHRvIHRoZSBmaXJzdCBsZXZlbCBvZiBoZWFkZXJzIChubyBFQVAKKyAqIGhlYWRlcnMgYXJlIHBhcnNlZCkuIAorICoKKyAqIE5PVEU6IFRoaXMgaXMgYSBub24tZGVzdHJ1Y3RpdmUgcmVhZCwgdGhhdCBpcyB0aGUKKyAqIGhlYWRlcnMgYXJlIG5vdCBzdHJpcHBlZCBvZmYgdGhlIHBhY2tldC4gSG93ZXZlciwgYW55IGFkZGl0aW9uYWwKKyAqIGRhdGEgYXQgIHRoZSBlbmQgb2YgdGhlIHBhY2tldCwgYmV5b25kIHdoYXQgdGhlIEVBUG9MIGhlYWRlcnMgZW5jb2RlCisgKiB3aWxsIGJlIHN0cmlwcGVkIG9mZi4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgY29udGFpbmluZyB0aGUgRUFQb0wgZnJhbWUgdG8gcGFyc2UKKyAqIEBwYXJhbSBkc3RNYWMgYSBwb2ludGVyIHRvIHNldCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGRlc3RpbmF0aW9uCisgKiBNQUMgYWRkcmVzcworICogQHBhcmFtIHNyY01hYyBhIHBvaW50ZXIgdG8gc2V0IHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc291cmNlCisgKiBNQUMgYWRkcmVzcworICogQHBhcmFtIHR5cGUgYSBwb2ludGVyIHRvIHNldCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIEVBUE9MIHR5cGUKKyAqIGZpZWxkLgorICoKKyAqIEByZXR1cm4gdGhlIG5vbi1uZWdhdGl2ZSBsZW5ndGggb2YgdGhlIEVBUE9MIHBheWxvYWQgaWYgdGhlIG9wZXJhdGlvbgorICogc3VjY2VlZHMKKyAqLworaW50IAorYW5pRWFwb2xQYXJzZSh0QW5pUGFja2V0ICpwYWNrZXQsCisgICAgICAgICAgICAgIHZfVThfdCAqKmRzdE1hYywgCisgICAgICAgICAgICAgIHZfVThfdCAqKnNyY01hYywgCisgICAgICAgICAgICAgIHZfVThfdCAqKnR5cGUpOworCisvKioKKyAqIGFuaUVhcG9sV3JpdGVLZXkKKyAqCisgKiBXcml0ZXMgb3V0IGEgY29tcGxldGUgRUFQT0wtS2V5IGZyYW1lLiBUaGUga2V5IGRlc2NyaXB0b3IgaXMKKyAqIGFwcGVuZGVkIHRvIHRoZSBwYWNrZXQgYW5kIHRoZSBFQVBPTCBoZWFkZXIgaXMgcHJlcGVuZGVkIHRvIGl0LiBJZgorICogYSBtaWNLZXkgaXMgcGFzc2VkIGluLCB0aGVuIGEgTUlDIGlzIGNhbGN1bGF0ZWQgYW5kIGluc2VydGVkIGludG8KKyAqIHRoZSBmcmFtZS4KKyAqCisgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSBkc3RNYWMgdGhlIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisgKiBAcGFyYW0gc3JjTWFjIHRoZSBzb3VyY2UgTUFDIGFkZHJlc3MKKyAqIEBwYXJhbSBkZXNjVHlwZSB0aGUga2V5IGRlc2NyaXB0b3IgdHlwZQorICogKEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX0xFR0FDWV9SQzQgb3IKKyAqIEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX1JTTikuCisgKiBAcGFyYW0ga2V5RGVzY0RhdGEgdGhlIGtleSBkZXNjcmlwdG9yIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqIGFib3ZlIGRlc2NUeXBlLiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlzIGlnbm9yZWQgYW5kIHdpbGwgYmUKKyAqIGdlbmVyYXRlZCBpbiB0aGUgcGFja2V0LiBUaGUga2V5IGJ5dGVzIGFyZSBleHBlY3RlZCB0byBiZSBlbmN0eXB0ZWQKKyAqIGlzIHRoZXkgbmVlZCB0byBiZSBlbmNyeXB0ZWQuCisgKiBAcGFyYW0gbWljS2V5IHRoZSBNSUMga2V5CisgKiBAcGFyYW0gbWljS2V5TGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIE1JQyBrZXkKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKgorICovCitpbnQKK2FuaUVhcG9sV3JpdGVLZXkodl9VMzJfdCBjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgdEFuaVBhY2tldCAqcGFja2V0LAorICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBkc3RNYWMsIAorICAgICAgICAgICAgICAgICB0QW5pTWFjQWRkciBzcmNNYWMsIAorICAgICAgICAgICAgICAgICBpbnQgZGVzY1R5cGUsCisgICAgICAgICAgICAgICAgIHZvaWQgKmtleURlc2NEYXRhLAorICAgICAgICAgICAgICAgICB2X1U4X3QgKm1pY0tleSwKKyAgICAgICAgICAgICAgICAgdl9VMzJfdCBtaWNLZXlMZW4pOworCisvKioKKyAqIGFuaUVhcG9sUGFyc2VLZXkKKyAqCisgKiBQYXJzZXMgYW5kIHZlcmlmaWVzIGEgY29tcGxldGUgRUFQT0wtS2V5IGZyYW1lLiBUaGUga2V5IGRlc2NyaXB0b3IKKyAqIHR5cGUgaXMgcmV0dXJuZWQgYW5kIHNvIGlzIGEgbmV3bHkgYWxsb2NhdGVkIGtleSBkZXNjcmlwdG9yIHN0cnVjdHVyZQorICogdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUuCisgKgorICogTk9URTogVGhpcyBpcyBhIG5vbi1kZXN0cnVjdGl2ZSByZWFkLiBUaGF0IGlzLCB0aGUgcGFja2V0IGhlYWRlcnMKKyAqIHdpbGwgYmUgdW5jaGFuZ2VkIGF0IHRoZSBlbmQgb2YgdGhpcyByZWFkIG9wZXJhdGlvbi4gVGhpcyBpcyBzbworICogdGhhdCBhIGZvbGxvd3VwIE1JQyBjaGVjayBtYXkgYmUgZG9uZSBvbiB0aGUgY29tcGxldGUgcGFja2V0LiBJZgorICogdGhlIHBhY2tldCBwYXJzaW5nIGZhaWxzLCB0aGUgcGFja2V0IGhlYWRlcnMgYXJlIG5vdCBndWFyYW50ZWVkIHRvCisgKiBiZSB1bmNoYW5nZWQuCisgKgorICogQHBhcmFtIHBhY2tldCB0aGUgcGFja2V0IHRvIHJlYWQgZnJvbS4gTm90ZSB0aGF0IHRoZSBmcmFtZSBpcyBub3QKKyAqIGV4cGVjdGVkIHRvIGNvbnRhaW4gYW55IGFkZGl0aW9uYWwgcGFkZGluZyBhdCB0aGUgZW5kIG90aGVyIHRoYW4KKyAqIHRoZSBleGFjdCBudW1iZXIgb2Yga2V5IGJ5dGVzLiAoVGhlIGFuaUVhcG9sUGFyc2UgZnVuY3Rpb24gd2lsbAorICogZW5zdXJlIHRoaXMuKQorICogQHBhcmFtIGRlc2NUeXBlIGlzIHNldCB0byB0aGUga2V5IGRlc2NyaXB0b3IgdHlwZQorICogKEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX0xFR0FDWV9SQzQgb3IKKyAqIEFOSV9FQVBPTF9LRVlfREVTQ19UWVBFX1JTTikuCisgKiBAcGFyYW0ga2V5RGVzY0RhdGEgaXMgc2V0IHRvIGEgbmV3bHkgYWxsb2NhdGVkIGtleSBkZXNjcmlwdG9yCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBhYm92ZSBkZXNjVHlwZS4gVGhlIHNpZ25hdHVyZSBmaWVsZCBpcworICogdmVyaWZpZWQuIFRoZSBrZXkgYnl0ZXMgd2lsbCBiZSByZXR1cm5lZCBlbmNyeXB0ZWQuIEl0IGlzIHRoZQorICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBmcmVlIHRoaXMgc3RydWN0dXJlIGFuZCB0aGUgZGF0YQorICogY29udGFpbmVkIHRoZXJlaW4uCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUVhcG9sUGFyc2VLZXkodEFuaVBhY2tldCAqcGFja2V0LAorICAgICAgICAgICAgICAgICBpbnQgKmRlc2NUeXBlLAorICAgICAgICAgICAgICAgICB2b2lkICoqa2V5RGVzY0RhdGEpOworCisvKioKKyAqIGFuaUVhcG9sS2V5Q2hlY2tNaWMKKyAqCisgKiBAcGFyYW0gZWFwb2xGcmFtZSB0aGUgY29tcGxldGUgRUFQT0wtS2V5IHBhY2tldAorICogQHBhcmFtIGRlc2NUeXBlIHRoZSBrZXkgZGVzY3JpcHRvciB0eXBlCisgKiBAcGFyYW0ga2V5RGVzY0RhdGEgdGhlIGtleSBkZXNjcmlwdG9yCisgKiBAcGFyYW0gbWljS2V5IHRoZSBNSUMga2V5CisgKiBAcGFyYW0gbWljS2V5TGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIE1JQyBrZXkKKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzOyBBTklfRV9NSUNfRkFJTEVEIGlmIHRoZQorICogTUlDIGNoZWNrIGZhaWxzLgorICovCitpbnQKK2FuaUVhcG9sS2V5Q2hlY2tNaWModl9VMzJfdCBjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgdEFuaVBhY2tldCAqZWFwb2xGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlc2NUeXBlLAorICAgICAgICAgICAgICAgICAgICB2b2lkICprZXlEZXNjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdl9VOF90ICptaWNLZXksCisgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbWljS2V5TGVuKTsKKworLyoqCisgKiBhbmlFYXBvbEtleUZyZWVEZXNjCisgKgorICogRnJlZXMgdGhlIEVBUE9MIGtleSBkZXNjcmlwdG9yIGFuZCB0aGUga2V5IGJ5dGVzIGNvbnRhaW5lZCB3aXRoaW4gaXQuCisgKgorICogQHBhcmFtIGRlc2NUeXBlIHRoZSBrZXkgZGVzY3JpcHRvciB0eXBlCisgKiBAcGFyYW0ga2V5RGVzY0RhdGEgdGhlIGtleSBkZXNjcmlwdG9yCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUVhcG9sS2V5RnJlZURlc2MoaW50IGRlc2NUeXBlLCB2b2lkICprZXlEZXNjRGF0YSk7CisKK3ZfVThfdCAqCithbmlFYXBvbFR5cGUyU3RyKHZfVThfdCB0eXBlKTsKKwordl9VOF90ICoKK2FuaUVhcG9sSGRyMlN0cih2X1U4X3QgKmhkcik7CisKKy8qKgorICogYW5pRWFwb2xLZXlMb2dEZXNjCisgKgorICogTG9ncyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gRUFQT0wga2V5IGRlc2N0aXB0b3IuCisgKgorICogQHBhcmFtIGRlc2NUeXBlIHRoZSBrZXkgZGVzY3JpcHRvciB0eXBlCisgKiBAcGFyYW0ga2V5RGVzY0RhdGEgdGhlIGtleSBkZXNjcmlwdG9yCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaUVhcG9sS2V5TG9nRGVzYyhpbnQgZGVzY1R5cGUsIHZvaWQgKmtleURlc2NEYXRhKTsKKwordm9pZCBiYXBSc25FYXBvbEhhbmRsZXIoIHZfUFZPSURfdCBwdkZzbSwgdEFuaVBhY2tldCAqcGFja2V0LCB2X0JPT0xfdCBmSXNBdXRoICk7CisvL1RyYW5zZmVyIGZyb20gcFZvc1BhY2tldCB0byB0QW5pUGFja2V0LgoraW50IGJhcFJzbkZvcm1Qa3RGcm9tVm9zUGt0KCB0QW5pUGFja2V0ICoqcHBQYWNrZXQsIHZvc19wa3RfdCAqcFZvc1BhY2tldCApOworCisjZW5kaWYgLy9fQU5JX1NTTV9FQVBPTF9IXwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcFJzblNzbVJlcGxheUN0ci5jIGIvQ09SRS9CQVAvc3JjL2JhcFJzblNzbVJlcGxheUN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTE5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYmFwUnNuU3NtUmVwbGF5Q3RyLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogV29vZHNpZGUgTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEZpbGU6ICRIZWFkZXI6IC8vZGVwb3Qvc29mdHdhcmUvcHJvamVjdHMvZmVhdHVyZV9icmFuY2hlcy9nZW41X3BoYXNlMS9vcy9saW51eC9jbGFzc2ljL2FwL2FwcHMvc3NtL2xpYi9hbmlTc21SZXBsYXlDdHIuYyMyICQgCisgKgorICogQ29udGFpbnMgZGVmaW5pdGlvbnMgb2YgdmFyaW91cyB1dGlsaXRpZXMgZm9yIEVBUG9MIGZyYW1lCisgKiBwYXJzaW5nIGFuZCBjcmVhdGlvbi4KKyAqCisgKiBBdXRob3I6ICAgICAgTWF5YW5rIEQuIFVwYWRoeWF5CisgKiBEYXRlOiAgICAgICAgMTktSnVuZS0yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICBNb2RpZmllZCBieSAgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKyNpbmNsdWRlIDxiYXBSc25FcnJvcnMuaD4KKworI2luY2x1ZGUgPGJhcFJzblNzbVJlcGxheUN0ci5oPgorI2luY2x1ZGUgInZvc19zdGF0dXMuaCIKKyNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCisjaW5jbHVkZSAidm9zX3V0aWxzLmgiCisjaW5jbHVkZSAidm9zX3BhY2tldC5oIgorCisvLyNpbmNsdWRlICJhbmlTc21VdGlscy5oIgorCisvKgorICogT3BhcXVlIHJlcGxheSBjb3VudGVyIHR5cGUuIERvZXMgVFggYW5kIFJYIHNpZGUgcmVwbGF5IGNvdW50ZXIKKyAqIHRyYWNraW5nLiBPbiB0aGUgVFggc2lkZSwgaXQgcmV0dXJucyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdmFsdWVzCisgKiBvZiB0aGUgY291bnRlciBhbmQgY2hlY2tzIHRoYXQgdGhlIHBlZXIgcmV0dXJuZWQgYSB2YWx1ZSBtYXRjaGluZworICogdGhlIG9uZSB3ZSBzZW50LiBPbiB0aGUgUlggc2lkZSwgaXQgbWFrZXMgc3VyZSB0aGF0IHRoZSBwZWVyIHNlbnQgYQorICogcmVwbGF5IGNvdW50ZXIgZ3JlYXRlciB0aGFuIHRoZSBsYXN0IG9uZSBzZWVuIChleGNlcHRpbmcgZm9yIHRoZQorICogZmlyc3QgdGltZSBhIGNoZWNrIGlzIG1hZGUgd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGhhcyB0byBzcGVjaWFsIGNhc2UuKQorICovCitzdHJ1Y3Qgc0FuaVNzbVJlcGxheUN0ciB7CisgICAgdl9VOF90IHNpemU7CisgICAgdl9VOF90ICpidWY7CisgICAgdl9VMzJfdCBjdXJyZW50VmFsdWU7CisgICAgdl9VOF90IGluaXQ7Cit9OworCitzdGF0aWMgaW50Cit1cGRhdGVDdHJCdWYodEFuaVNzbVJlcGxheUN0ciAqY3RyKTsKKworLyoqCisgKiBhbmlTc21SZXBsYXlDdHJDcmVhdGUKKyAqCisgKiBDcmVhdGVzIGEgcmVwbGF5IGNvdW50ZXIgYW5kIGluaXRpYWxpemVzIGl0IGZvciBmaXJzdCB0aW1lCisgKiB1c2UuIFRoZSBpbml0aWFsaXphdGlvbiBjYW4gYmUgZG9uZSByYW5kb21seSBvciB3aXRoIGEgcGFzc2VkIGluCisgKiB2YWx1ZSBsaWtlIDAuIEluIGNhc2UgdGhpcyBpcyBnb2luZyB0byBiZSB1c2VkIG9uIHRoZSBSWCBzaWRlLCBpdAorICogZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgaW5pdGlhbGl6YXRpb24gaXMgYW5kIGNhbiBiZSBvcHRpbWl6ZWQgdG8KKyAqIGEgZml4ZWQgdmFsdWUgc28gYXMgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIG9idGFpbmluZyBhIHJhbmRvbQorICogdmFsdWUuCisgKgorICogQHBhcmFtIGN0clB0ciBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgbmV3bHkgYWxsb2NhdGVkCisgKiBjb3VudGVyIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqIEBwYXJhbSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgZGVzaXJlZCBpbiB0aGUgY291bnRlcgorICogQHBhcmFtIGluaXRWYWx1ZSBpZiB0aGlzIGlzIG5lZ2F0aXZlIGFuZCBzaXplIGlzIGdyZWF0ZXIgdGhhbiA0LAorICogdGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgcmFuZG9tbHkuIE90aGVyd2lzZSwgdGhlc2UgYnl0ZXMgYXJlCisgKiBjb3BpZWQgaW50byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgZm91ciBvciBsZXNzIG9jdGV0cyBvZiB0aGUKKyAqIGNvdW50ZXIsIGRlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY291bnRlci4gaS5lLiwgaWYgdGhlIGNvdW50ZXIKKyAqIGlzIG9ubHkgMkIsIHRoZW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IDJCIG9mIGluaXRWYWx1ZSB3aWxsIGJlCisgKiBjb3BpZWQgb3Zlci4KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYW5pU3NtUmVwbGF5Q3RyQ3JlYXRlKHZfVTMyX3QgY3J5cHRIYW5kbGUsIHRBbmlTc21SZXBsYXlDdHIgKipjdHJQdHIsIAorICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0VmFsdWUpCit7CisgICAgdEFuaVNzbVJlcGxheUN0ciAqY3RyOworCisgICAgY3RyID0gdm9zX21lbV9tYWxsb2MoIHNpemVvZih0QW5pU3NtUmVwbGF5Q3RyKSApOworICAgIGlmKCBOVUxMID09IGN0ciApCisgICAgeworICAgICAgICByZXR1cm4gQU5JX0VfTUFMTE9DX0ZBSUxFRDsKKyAgICB9CisKKyAgICBjdHItPmJ1ZiA9IHZvc19tZW1fbWFsbG9jKCBzaXplICk7CisgICAgaWYgKGN0ci0+YnVmID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgICB2b3NfbWVtX2ZyZWUoY3RyKTsKKyAgICAgICAgcmV0dXJuIEFOSV9FX01BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgY3RyLT5zaXplID0gc2l6ZTsKKworICAgIC8vIFdlIGNhbm5vdCByYW5kb21seSBnZW5lcmF0ZSB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlcyBpZiB0aGUKKyAgICAvLyB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaXMgbm90IGdyZWF0ZXIgdGhhbiA0IChzaXplb2YgQU5JX1UzMikuCisgICAgaWYgKGluaXRWYWx1ZSA8IDAgJiYgY3RyLT5zaXplIDw9IDQpCisgICAgICAgIGluaXRWYWx1ZSA9IDA7CisKKyAgICAvLyBJZiBpbml0VmFsdWUgaXMgbmVnYXRpdmUsIGluaXRpYWxpemUgdGhlIGN0ciByYW5kb21seSwgZWxzZQorICAgIC8vIGluaXRpYWxpemUgaXQgdG8gd2hhdCB0aGUgdXNlciBzcGVjaWZpZWQuCisgICAgaWYgKGluaXRWYWx1ZSA8IDApIAorICAgIHsKKyAgICAgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc19yYW5kX2dldF9ieXRlcyhjcnlwdEhhbmRsZSwgY3RyLT5idWYsIGN0ci0+c2l6ZSkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBTklfRVJST1I7CisgICAgICAgIH0KKyAgICB9IAorICAgIGVsc2UgeworICAgICAgICBjdHItPmN1cnJlbnRWYWx1ZSA9IGluaXRWYWx1ZSAtIDE7CisgICAgfQorCisgICAgKmN0clB0ciA9IGN0cjsKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKK3N0YXRpYyBpbnQKK3VwZGF0ZUN0ckJ1Zih0QW5pU3NtUmVwbGF5Q3RyICpjdHIpCit7CisKKyAgICB2X1UzMl90IG51bUJ5dGVzOworICAgIHZfVTMyX3Qgb2Zmc2V0OworICAgIHZfVTMyX3QgdG1wOworCisgICAgdG1wID0gdm9zX2NwdV90b19iZTMyKCBjdHItPmN1cnJlbnRWYWx1ZSApOworCisgICAgbnVtQnl0ZXMgPSAoNCA8PSBjdHItPnNpemUpID8gNCA6IGN0ci0+c2l6ZTsKKyAgICBvZmZzZXQgPSA0IC0gbnVtQnl0ZXM7CisgICAgdm9zX21lbV9jb3B5KGN0ci0+YnVmICsgY3RyLT5zaXplIC0gbnVtQnl0ZXMsIAorICAgICAgICAgICAoKHZfVThfdCAqKSAmdG1wKSArIG9mZnNldCwgbnVtQnl0ZXMpOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlTc21SZXBsYXlDdHJDbXAKKyAqCisgKiBVc2VkIHRvIGNoZWNrIGlmIHRoZSBwYXNzZWQgaW4gdmFsdWUgaXMgZ3JlYXRlcgorICogdGhhbiwgbGVzcyB0aGFuLCBvciB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgdmFsdWUuIAorICoKKyAqIENhbiBiZSB1c2VkIG9uIHRoZSBUWCBzaWRlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzcG9uc2UgdG8gYQorICogcmVxdWVzdCBjb250YWlucyB0aGUgc2FtZSBjb3VudGVyIGFzIHRoZSBvbmUgaW4gdGhlIHJlcXVlc3QuCisgKgorICogQ2FuIGJlIHVzZWQgb24gdGhlIFJYIHNpZGUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXF1ZXN0IGhhcyBhCisgKiBjb3VudGVyIGdyZWF0ZXIgdGhhbiB0aGUgcHJldmlvdXMgcmVxdWVzdCwgb3IgaWYgdGhpcyBpcyBhCisgKiByZXRyYW5zbWlzc2lvbiBvZiB0aGUgcHJldmlvdXMgcmVxdWVzdC4gVGhlIGFwcGxpY2F0aW9uIHNob3VsZAorICogc3BlY2lhbC1jYXNlIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkIG9uIHRoZSBSWCBzaWRlLgorICoKKyAqIEBwYXJhbSBjdHIgdGhlIGN1cnJlbnQgcmVwbGF5IGNvdW50ZXIKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2sgYWdhaW5zdAorICoKKyAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiBjdXJyZW50IGN0ciBpcyBsZXNzIHRoYW4gdGhlCisgKiBnaXZlbiB2YWx1ZSwgemVybyBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgYW5kIGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhlCisgKiBjdXJyZW50IGNvdW50ZXIgaXMgZ3JlYXRlciB0aGFuIHRoYXQgb2YgdGhlIGdpdmVuIHZhbHVlLgorICovCitpbnQKK2FuaVNzbVJlcGxheUN0ckNtcCh0QW5pU3NtUmVwbGF5Q3RyICpjdHIsIHZfVThfdCAqdmFsdWUpCit7CisgICAgcmV0dXJuIHZvc19tZW1fY29tcGFyZTIoY3RyLT5idWYsIHZhbHVlLCBjdHItPnNpemUpOworfQorCisvKioKKyAqIGFuaVNzbVJlcGxheUN0clVwZGF0ZQorICoKKyAqIFVzZWQgb24gdGhlIFJYIHNpZGUgdG8gdXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCByZXBsYXkKKyAqIGNvdW50ZXIgdG8gdGhhdCByZWNlaXZlZCBpbiB0aGUgbmV4dCByZXF1ZXN0LiBUeXBpY2FsbHkgdGhpcyBpcworICogY2FsbGVkIGFmdGVyIGl0IGlzIGRldGVybWluZWQgdGhhdCB0aGlzIGlzIG5vdCBhIHJldHJhbnNtaXNzaW9uLAorICogYW5kIHNvbWUgc29ydCBvZiBpbnRlZ3JpdHkgY2hlY2tpbmcgaXMgZG9uZSBvbiBpdC4KKyAqCisgKiBAcGFyYW0gY3RyIHRoZSBjdXJyZW50IHJlcGxheSBjb3VudGVyCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgaXQgc2hvdWxkIGJlIHNldCB0bworICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlTc21SZXBsYXlDdHJVcGRhdGUodEFuaVNzbVJlcGxheUN0ciAqY3RyLAorICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqdmFsdWUpCit7CisgICAgdm9zX21lbV9jb3B5KGN0ci0+YnVmLCB2YWx1ZSwgY3RyLT5zaXplKTsKKworICAgIHJldHVybiBBTklfT0s7Cit9CisKKy8qKgorICogYW5pU3NtUmVwbGF5Q3RyTmV4dAorICoKKyAqIFVzZWQgb24gdGhlIFJYIHNpZGUgdG8gb2J0YWluIHRoZSBuZXh0IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHNlbnQKKyAqIHdpdGggYSByZXF1ZXN0LiBBZnRlciB0aGlzIGNhbGwsIHRoZSBjdXJyZW50IHZhbHVlIGlzIGluY3JlbWVudGVkCisgKiBieSBvbmUuCisgKgorICogQHBhcmFtIGN0ciB0aGUgY3VycmVudCByZXBsYXkgY291bnRlcgorICogQHBhcmFtIHZhbHVlIHdoZXJlIHRoZSBuZXh0IGNvdW50ZXIgdmFsdWUgc2hvdWxkIGJlIGNvcGllZAorICogaW50by4gVGhlIGNhbGxlciBtdXN0IGFsbG9jYXRlZCBlbm91Z2ggc3RvcmFnZSBmb3IgdGhpcy4KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYW5pU3NtUmVwbGF5Q3RyTmV4dCh0QW5pU3NtUmVwbGF5Q3RyICpjdHIsCisgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqdmFsdWUpCit7CisgICAgY3RyLT5jdXJyZW50VmFsdWUrKzsKKyAgICB1cGRhdGVDdHJCdWYoY3RyKTsKKyAgICB2b3NfbWVtX2NvcHkodmFsdWUsIGN0ci0+YnVmLCBjdHItPnNpemUpOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KKworLyoqCisgKiBhbmlTc21SZXBsYXlDdHJGcmVlCisgKgorICogRnJlZXMgdGhlIHJlcGxheSBjb3VudGVyIGNvbnRleHQuCisgKgorICogQHBhcmFtIGN0ciB0aGUgcmVwbGF5IGNvdW50ZXIgdG8gZnJlZS4KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYW5pU3NtUmVwbGF5Q3RyRnJlZSh0QW5pU3NtUmVwbGF5Q3RyICpjdHIpCit7CisKKyAgICBpZiAoY3RyLT5idWYgIT0gTlVMTCkKKyAgICAgICAgdm9zX21lbV9mcmVlKGN0ci0+YnVmKTsKKworICAgIHZvc19tZW1fZnJlZShjdHIpOworCisgICAgcmV0dXJuIEFOSV9PSzsKK30KZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBSc25Tc21SZXBsYXlDdHIuaCBiL0NPUkUvQkFQL3NyYy9iYXBSc25Tc21SZXBsYXlDdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2M5ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcFJzblNzbVJlcGxheUN0ci5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFdvb2RzaWRlIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAkRmlsZTogLy9kZXBvdC9zb2Z0d2FyZS9wcm9qZWN0cy9mZWF0dXJlX2JyYW5jaGVzL2dlbjVfcGhhc2UxL29zL2xpbnV4L2NsYXNzaWMvYXAvYXBwcy9pbmNsdWRlL2FuaVNzbVJlcGxheUN0ci5oICQKKyAqCisgKiBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdmFyaW91cyB1dGlsaXRpZXMgZm9yIFNTTSByZXBsYXkgY291bnRlcgorICogbW9kdWxlLgorICoKKyAqIEF1dGhvcjogICAgICBNYXlhbmsgRC4gVXBhZGh5YXkKKyAqIERhdGU6ICAgICAgICAxNS1KdW5lLTIwMDMKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgIE1vZGlmaWVkIGJ5ICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2lmbmRlZiBfQU5JX1NTTV9SRVBMQVlfQ1RSX0hfCisjZGVmaW5lIF9BTklfU1NNX1JFUExBWV9DVFJfSF8KKworI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgPGJhcFJzbkFzZlBhY2tldC5oPgorCisvKgorICogT3BhcXVlIHJlcGxheSBjb3VudGVyIHR5cGUuIERvZXMgVFggYW5kIFJYIHNpZGUgcmVwbGF5IGNvdW50ZXIKKyAqIHRyYWNraW5nLiBPbiB0aGUgVFggc2lkZSwgaXQgcmV0dXJucyBtb25vdG9uaWNhbGwgaW5jcmVhc2luZyB2YWx1ZXMKKyAqIG9mIHRoZSBjb3VudGVyIGFuZCBjaGVja3MgdGhhdCB0aGUgcGVlciByZXR1cm5lZCBhIHZhbHVlIG1hdGNoaW5nCisgKiB0aGUgb25lIHdlIHNlbnQuIE9uIHRoZSBSWCBzaWRlLCBpdCBtYWtlcyBzdXJlIHRoYXQgdGhlIHBlZXIgc2VudCBhCisgKiByZXBsYXkgY291bnRlciBncmVhdGVyIHRoYW4gdGhlIGxhc3Qgb25lIHNlZW4gKGV4Y2VwdGluZyBmb3IgdGhlCisgKiBmaXJzdCB0aW1lIGEgY2hlY2sgaXMgbWFkZSB3aGljaCB0aGUgYXBwbGljYXRpb24gaGFzIHRvIHNwZWNpYWwgY2FzZS4pCisgKi8KK3R5cGVkZWYgc3RydWN0IHNBbmlTc21SZXBsYXlDdHIgdEFuaVNzbVJlcGxheUN0cjsKKworLyoqCisgKiBhbmlTc21SZXBsYXlDdHJDcmVhdGUKKyAqCisgKiBDcmVhdGVzIGEgcmVwbGF5IGNvdW50ZXIgYW5kIGluaXRpYWxpemVzIGl0IGZvciBmaXJzdCB0aW1lCisgKiB1c2UuIFRoZSBpbml0aWFsaXphdGlvbiBjYW4gYmUgZG9uZSByYW5kb21seSBvciB3aXRoIGEgcGFzc2VkIGluCisgKiB2YWx1ZSBsaWtlIDAuIEluIGNhc2UgdGhpcyBpcyBnb2luZyB0byBiZSB1c2VkIG9uIHRoZSBSWCBzaWRlLCBpdAorICogZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgaW5pdGlhYWxpemF0aW9uIGlzIGFuZCBjYW4gYmUgb3B0aW1pemVkIHRvCisgKiBhIGZpeGVkIHZhbHVlIHNvIGFzIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBvYnRhaW5pbmcgYSByYW5kb20KKyAqIHZhbHVlLgorICoKKyAqIEBwYXJhbSBjdHJQdHIgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZAorICogY291bnRlciBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKiBAcGFyYW0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGRlc2lyZWQgaW4gdGhlIGNvdW50ZXIKKyAqIEBwYXJhbSBpbml0VmFsdWUgaWYgdGhpcyBpcyBuZWdhdGl2ZSBhbmQgc2l6ZSBpcyBncmVhdGVyIHRoYW4gNCwKKyAqIHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lIHJhbmRvbWx5LiBPdGhlcndpc2UsIHRoZXNlIGJ5dGVzIGFyZQorICogY29waWVkIGludG8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGZvdXIgb3IgbGVzcyBvY3RldHMgb2YgdGhlCisgKiBjb3VudGVyLCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvdW50ZXIuIGkuZS4sIGlmIHRoZSBjb3VudGVyCisgKiBpcyBvbmx5IDJCLCB0aGVuIHRoZSBsZWFzdCBzaWduaWZpY2FudCAyQiBvZiBpbml0VmFsdWUgd2lsbCBiZQorICogY29waWVkIG92ZXIuCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaVNzbVJlcGxheUN0ckNyZWF0ZSh2X1UzMl90IGNyeXB0SGFuZGxlLCB0QW5pU3NtUmVwbGF5Q3RyICoqY3RyUHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdFZhbHVlKTsKKworLyoqCisgKiBhbmlTc21SZXBsYXlDdHJDbXAKKyAqCisgKiBVc2VkIHRvIGNoZWNrIGlmIHRoZSBwYXNzZWQgaW4gdmFsdWUgaXMgZ3JlYXRlcgorICogdGhhbiwgbGVzcyB0aGFuLCBvciB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgdmFsdWUuIAorICoKKyAqIENhbiBiZSB1c2VkIG9uIHRoZSBUWCBzaWRlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzcG9uc2UgdG8gYQorICogcmVxdWVzdCBjb250YWlucyB0aGUgc2FtZSBjb3VudGVyIGFzIHRoZSBvbmUgaW4gdGhlIHJlcXVlc3QuCisgKgorICogQ2FuIGJlIHVzZWQgb24gdGhlIFJYIHNpZGUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXF1ZXN0IGhhcyBhCisgKiBjb3VudGVyIGdyZWF0ZXIgdGhhbiB0aGUgcHJldmlvdXMgcmVxdWVzdCwgb3IgaWYgdGhpcyBpcyBhCisgKiByZXRyYW5zbWlzc2lvbiBvZiB0aGUgcHJldmlvdXMgcmVxdWVzdC4gVGhlIGFwcGxpY2F0aW9uIHNob3VsZAorICogc3BlY2lhbC1jYXNlIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkIG9uIHRoZSBSWCBzaWRlLgorICoKKyAqIEBwYXJhbSBjdHIgdGhlIGN1cnJlbnQgcmVwbGF5IGNvdW50ZXIKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2sgYWdhaW5zdAorICoKKyAqIEByZXR1cm4gQSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUKKyAqIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvdW50ZXIsIHplcm8gaWYgdGhleSBhcmUgdGhlIHNhbWUsIGFuZCBhCisgKiBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhhdCBvZiB0aGUKKyAqIGNvdW50ZXIuCisgKi8KK2ludAorYW5pU3NtUmVwbGF5Q3RyQ21wKHRBbmlTc21SZXBsYXlDdHIgKmN0ciwKKyAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnZhbHVlKTsKKworLyoqCisgKiBhbmlTc21SZXBsYXlDdHJVcGRhdGUKKyAqCisgKiBVc2VkIG9uIHRoZSBSWCBzaWRlIHRvIHVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgcmVwbGF5CisgKiBjb3VudGVyIHRvIHRoYXQgcmVjZWl2ZWQgaW4gdGhlIG5leHQgcmVxdWVzdC4gVHlwaWNhbGx5IHRoaXMgaXMKKyAqIGNhbGxlZCBhZnRlciBpdCBpcyBkZXRlcm1pbmVkIHRoYXQgdGhpcyBpcyBub3QgYSByZXRyYW5zbWlzc2lvbiwKKyAqIGFuZCBzb21lIHNvcnQgb2YgaW50ZWdyaXR5IGNoZWNraW5nIGlzIGRvbmUgb24gaXQuCisgKgorICogQHBhcmFtIGN0ciB0aGUgY3VycmVudCByZXBsYXkgY291bnRlcgorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IGl0IHNob3VsZCBiZSBzZXQgdG8KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK2ludAorYW5pU3NtUmVwbGF5Q3RyVXBkYXRlKHRBbmlTc21SZXBsYXlDdHIgKmN0ciwKKyAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnZhbHVlKTsKKworLyoqCisgKiBhbmlTc21SZXBsYXlDdHJOZXh0CisgKgorICogVXNlZCBvbiB0aGUgUlggc2lkZSB0byBvYnRhaW4gdGhlIG5leHQgdmFsdWUgdGhhdCBzaG91bGQgYmUgc2VudAorICogd2l0aCBhIHJlcXVlc3QuIEFmdGVyIHRoaXMgY2FsbCwgdGhlIGN1cnJlbnQgdmFsdWUgaXMgaW5jcmVtZW50ZWQKKyAqIGJ5IG9uZS4KKyAqCisgKiBAcGFyYW0gY3RyIHRoZSBjdXJyZW50IHJlcGxheSBjb3VudGVyCisgKiBAcGFyYW0gdmFsdWUgd2hlcmUgdGhlIG5leHQgY291bnRlciB2YWx1ZSBzaG91bGQgYmUgY29waWVkCisgKiBpbnRvLiBUaGUgY2FsbGVyIG11c3QgYWxsb2NhdGVkIGVub3VnaCBzdG9yYWdlIGZvciB0aGlzLgorICoKKyAqIEByZXR1cm4gQU5JX09LIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqLworaW50CithbmlTc21SZXBsYXlDdHJOZXh0KHRBbmlTc21SZXBsYXlDdHIgKmN0ciwKKyAgICAgICAgICAgICAgICAgICAgdl9VOF90ICp2YWx1ZSk7CisKKy8qKgorICogYW5pU3NtUmVwbGF5Q3RyRnJlZQorICoKKyAqIEZyZWVzIHRoZSByZXBsYXkgY291bnRlciBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBjdHIgdGhlIHJlcGxheSBjb3VudGVyIHRvIGZyZWUuCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaVNzbVJlcGxheUN0ckZyZWUodEFuaVNzbVJlcGxheUN0ciAqY3RyKTsKKworI2VuZGlmIC8vX0FOSV9TU01fUkVQTEFZX0NUUl9IXwpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2JhcFJzblNzbVNlcnZpY2VzLmggYi9DT1JFL0JBUC9zcmMvYmFwUnNuU3NtU2VydmljZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjNjZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9CQVAvc3JjL2JhcFJzblNzbVNlcnZpY2VzLmgKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICRGaWxlOiAvL2RlcG90L3NvZnR3YXJlL3Byb2plY3RzL2ZlYXR1cmVfYnJhbmNoZXMvZ2VuNV9waGFzZTEvb3MvbGludXgvY2xhc3NpYy9hcC9hcHBzL2luY2x1ZGUvYW5pU3NtU2VydmljZXMuaCAkCisgKgorICogQ29udGFpbnMgZGVmaW5pdGlvbnMgb2YgY29tbW9uIHR5cGVzIHRoYXQgdGhlIFNTTSBleHBvcnRzIHRvIG90aGVyCisgKiBtb2R1bGVzLiAKKyAqCisgKiBBdXRob3I6ICAgICAgTWF5YW5rIEQuIFVwYWRoeWF5CisgKiBEYXRlOiAgICAgICAgMjMtSmFudWFyeS0yMDAzCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICBNb2RpZmllZCBieSAgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmbmRlZiBfQU5JX1NTTV9TRVJWSUNFU19IXworI2RlZmluZSBfQU5JX1NTTV9TRVJWSUNFU19IXworCisjaW5jbHVkZSAidm9zX3R5cGVzLmgiCisjaW5jbHVkZSAic2lyQXBpLmgiCisKKyNkZWZpbmUgQU5JX1NTTV9NQVhfS0VZU19JTkZPX1NJWkUgNTEyCisjZGVmaW5lIEFOSV9TU01fTUFYX0dST1VQX1NJWkUgICAgIDMyCisjZGVmaW5lIEFOSV9TU01fTUFYX1VTRVJJRF9TSVpFICAgIDY0CisKKyNkZWZpbmUgQU5JX1NTTV9SU05fUE1LX0xFTiAzMgorI2RlZmluZSBBTklfU1NNX1JTTl9QU0tfTEVOIEFOSV9TU01fUlNOX1BNS19MRU4KKyNkZWZpbmUgQU5JX1NTTV9SU05fUFNLX0xFTl9IRVggQU5JX1NTTV9SU05fUFNLX0xFTitBTklfU1NNX1JTTl9QU0tfTEVOCisjZGVmaW5lIEFOSV9TU01fTUFYX1BBU1NQSFJBU0VfTEVOIDEyOAorI2RlZmluZSBBTklfU1NNX01BWF9BVVRIWk9ORV9MRU4gIDMyCisjZGVmaW5lIEFOSV9TU01fTUFYX0xBTkRQR19VUkxfTEVOIDEyOAorI2RlZmluZSBBTklfU1NNX01BWF9HVUVTVF9QT1JUQUxfUFdEX0xFTiAzMgorCisjZGVmaW5lIEFOSV9TU01fSUVfUlNOX09VSSB7MHgwMCwgMHgwRiwgMHhBQ30KKyNkZWZpbmUgQU5JX1NTTV9JRV9XUEFfT1VJIHsweDAwLCAweDUwLCAweEYyfQorCisjZGVmaW5lIEFOSV9TU01fSUVfUlNOX0VMRU1fSUQgIDQ4CisjZGVmaW5lIEFOSV9TU01fSUVfV1BBX0VMRU1fSUQgIDIyMQorCisvKgorICogVGhlIHRvdGFsIGxlbmd0aCBvZiBhbiBSU04gSUUgbWF5IGJlIG5vIGxvbmdlciB0aGFuIHRoZXNlIG1hbnkKKyAqIG9jdGV0cywgaW5jbHVkaW5nIHRoZSB0d28gYnl0ZXMgZm9yIHR5cGUgYW5kIGxlbi4KKyAqLworI2RlZmluZSBBTklfUlNOX0lFX01BWF9MRU4gMjU3CisKKyNpZm5kZWYgQU5JX0FQX1NESworI2RlZmluZSBBTklfQUFHX0NPTkZfRklMRV9OQU1FICAgICBBTklfU1RBVElDX0NPTkZJR19ESVIiL3NzbS8xeC5jb25mIgorI2RlZmluZSBBTklfQUFHX0FBX0NGR19GSUxFX09SSUcgIEFOSV9TVEFUSUNfQ09ORklHX0RJUiIvc3NtLzF4LmNvbmYub3JpZyIKKyNlbHNlCisjZGVmaW5lIEFOSV9BQUdfQ09ORl9GSUxFX05BTUUgICAgICAiL3Zhci8xeC5jb25mIgorI2RlZmluZSBBTklfQUFHX0FBX0NGR19GSUxFX09SSUcgICAgIi92YXIvMXguY29uZi5vcmlnIgorI2RlZmluZSBBTklfV1NNX0RFRkFVTFRTX0ZJTEVfTkFNRSAgIi92YXIvd3NtRGVmYXVsdHMiCisjZGVmaW5lIEFOSV9XU01fREVGQVVMVFNfRklMRV9PUklHICAiL3Zhci93c21EZWZhdWx0cy5vcmlnIgorI2VuZGlmIC8vICFBTklfQVBfU0RLCisKKyNkZWZpbmUgQU5JX0FBR19DT05GX01BWF9MSU5FIDEyMAorCisvKgorICogUE1LU0EgSUQgZGF0YSB0eXBlCisgKiAoUE1LSUQgaXMgYW4gSE1BQy1TSEExLTEyOCB2YWx1ZSkgCisgKi8KKyNkZWZpbmUgQU5JX0FBR19QTUtJRF9TSVpFIDE2CisKKyNkZWZpbmUgQU5JX1NTTV9BVVRIX0JJVE1BU0sgICAweDAwMDEwMDAwCisjZGVmaW5lIEFOSV9TU01fSUVNT0RFX0JJVE1BU0sgMHhDMDAwMDAwMAorI2RlZmluZSBBTklfU1NNX0VOQ1JfQklUTUFTSyAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQU5JX1NTTV9JRU1PREVfU0hJRlQgICAoMzApCisKKworLy8gVXBwZXIgbGV2ZWwgYXV0aGVudGljYXRpb24gdHlwZXMgdXNlZCBieSBBQQordHlwZWRlZiBlbnVtIGVBbmlTc21BdXRoVHlwZSB7CisgICAgZUFOSV9TU01fQVRfVU5ERVJGTE9XID0gLTEsCisKKyAgICAvLyBUaGUgbnVtYmVycyBhcmUgZml4ZWQgc28gdGhhdCB0aGV5IGNhbiBiZSByZS11c2VkIGluIHRoZSBYQ0xJCisgICAgLy8gY29uZmlnIGZpbGUgYW5kIDF4LmNvbmYuCisgICAgZUFOSV9TU01fQVRfTk9ORSAgICAgICA9IDAsCisgICAgZUFOSV9TU01fQVRfU0hBUkVEX0tFWSA9IDEsCisgICAgZUFOSV9TU01fQVRfTEVHQUNZX0VBUCA9IDIsCisgICAgZUFOSV9TU01fQVRfUlNOX1BTSyAgICA9IDMsCisgICAgZUFOSV9TU01fQVRfUlNOX0VBUCAgICA9IDQsCisKKyAgICBlQU5JX1NTTV9BVF9PVkVSRkxPVworfSB0QW5pU3NtQXV0aFR5cGU7CisKKy8vIFVwcGVyIGxldmVsIGVuY3J5cHRpb24gdHlwZXMgdXNlZCBieSBBQQordHlwZWRlZiBlbnVtIGVBbmlTc21DaXBoZXJUeXBlIHsKKyAgICBlQU5JX1NTTV9DVF9VTkRFUkZMT1cgPSAtMSwKKworICAgIC8vIFRoZSBudW1iZXJzIGFyZSBmaXhlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlLXVzZWQgaW4gdGhlIFhDTEkKKyAgICAvLyBjb25maWcgZmlsZSBhbmQgMXguY29uZi4KKyAgICBlQU5JX1NTTV9DVF9OT05FICAgICAgID0gMCwKKyAgICBlQU5JX1NTTV9DVF9XRVA0MCAgICAgID0gMSwKKyAgICBlQU5JX1NTTV9DVF9XRVAxMDQgICAgID0gMiwKKyAgICBlQU5JX1NTTV9DVF9XUEFfV0VQNDAgID0gMywKKyAgICBlQU5JX1NTTV9DVF9XUEFfV0VQMTA0ID0gNCwKKyAgICBlQU5JX1NTTV9DVF9US0lQICAgICAgID0gNSwKKyAgICBlQU5JX1NTTV9DVF9DQ01QICAgICAgID0gNiwKKworICAgIGVBTklfU1NNX0NUX09WRVJGTE9XCit9IHRBbmlTc21DaXBoZXJUeXBlOworCisKKy8vIFdQQSBtb2RlcwordHlwZWRlZiBlbnVtIGVBbmlTc21XcGFNb2RlcyB7CisgICAgZUFOSV9TU01fV1BBX1VOREVSRkxPVyA9IC0xLAorCisgICAgZUFOSV9TU01fV1BBX0RJU0FCTEUgPSAwLAorICAgIGVBTklfU1NNX1dQQV8xID0gMSwKKyAgICBlQU5JX1NTTV9XUEFfMiA9IDIsCisKKyAgICBlQU5JX1NTTV9XUEFfT1ZFUkZMT1cgPSAoKGVBTklfU1NNX1dQQV8yIHwgZUFOSV9TU01fV1BBXzEpICArIDEpCit9IHRBbmlTc21XcGFNb2RlczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVNzbUdyb3VwIHsKKyAgICB2X1UxNl90IGxlbjsgLy8gVmFsaWQgcmFuZ2U6IDAuLkFOSV9TU01fTUFYX0dST1VQX1NJWkUKKyAgICB2X1U4X3QgIGdyb3VwWzFdOworfSB0QW5pU3NtR3JvdXA7CisKK3R5cGVkZWYgc3RydWN0IHNBbmlTc21Vc2VySWQgeworICAgIHZfVTE2X3QgbGVuOyAvLyBWYWxpZCByYW5nZTogMC4uQU5JX1NTTV9NQVhfVVNFUklEX1NJWkUKKyAgICB2X1U4X3QgIHVzZXJJZFsxXTsKK30gdEFuaVNzbVVzZXJJZDsKKworLyoKKyAqIFBNS1NBIElEIGRhdGEgdHlwZQorICogKFBNS0lEIGlzIGFuIEhNQUMtU0hBMS0xMjggdmFsdWUpIAorICovCit0eXBlZGVmIHZfVThfdCB0QW5pU3NtUG1rSWRbQU5JX0FBR19QTUtJRF9TSVpFXTsKKworLyoqCisgKiBhbmlTc21Jbml0U3RhdGljQ29uZgorICoKKyAqIChSZS0pSW5pdGlhbGl6ZXMgdGhlIFNTTSBpbnRlcm5hbCBzdGF0aWMgY29uZmlndXJhdGlvbi4gVGhpcyBtYXkgYmUKKyAqIGZyb20gYSBzdGF0aWMgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB3aWxsIGluY2x1ZGUgaXRlbXMgc3VjaCBhcworICogbG9jYWwgTUFDLUFDTCBsaXN0cy4KKyAqCisgKiBAcGFyYW0gY29uZmlnRmlsZU5hbWUgLSBhbiBvcHRpb25hbCBmaWxlbmFtZSB0byByZWFkIGZyb20uIElmIHRoaXMgaXMKKyAqIE5VTEwsIHRoZSBkZWZhdWx0IEFBRyBzdGF0aWMgY29uZiBmaWxlIGlzIHJlYWQuCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCitpbnQKK2FuaVNzbUluaXRTdGF0aWNDb25mKGNoYXIgKmNvbmZpZ0ZpbGVOYW1lKTsKKworLyoqCisgKiBhbmlTc21Jc1N0YU1hY0FsbG93ZWQKKyAqCisgKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gU1RBIHBhc3NlcyB0aGUgbG9jYWwgTUFDLUFDTCBjaGVjay4gSWYKKyAqIE1BQy1BQ0wgbG9va3VwIGlzIGVuYWJsZWQsIGl0IG1heSBiZSBlaXRoZXIgcG9zaXRpdmUgKHdoaXRlbGlzdCkgb3IKKyAqIG5lZ2F0aXZlIChibGFja2xpc3QpLiBJZiBwb3NpdGl2ZSBNQUMtQUNMcyBhcmUgb24sIHRoZW4gb25seSB0aG9zZQorICogU1RBcyB0aGF0IGFyZSBpbiB0aGUgd2hpdGVsaXN0IGFyZSBhbGxvd2VkIGluLiBJZiBuZWdhdGl2ZSBNQUMtQUNMcworICogYXJlIG9uLCB0aGVuIHRob3NlIFNUQXMgdGhhdCBhcmUgaW4gdGhlIGJsYWNrbGlzdCBhcmUgbm90IGFsbG93ZWQgaW4uCisgKgorICogTm90ZSB0aGF0IGxvY2FsIE1BQy1BQ0xzIG1heSBiZSBtYWludGFpbmVkIHBlciBTU0lELgorICoKKyAqIEBwYXJhbSBzdGFNYWMgLSB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIFNUQQorICogQHBhcmFtIHNzaWQgLSB0aGUgU1NJRCB0aGF0IHRoZSBTVEEgaXMgYXNzb2NpYXRpbmcgb24KKyAqCisgKiBAcmV0dXJuIEFOSV9PSyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKi8KK3ZfQk9PTF90CithbmlTc21Jc1N0YU1hY0FsbG93ZWQoY29uc3QgdEFuaU1hY0FkZHIgc3RhTWFjLCBjb25zdCB0QW5pU1NJRCAqc3NpZCk7CisKKy8qKgorICogYW5pU3NtSXNTZWNNb2RlQWxsb3dlZAorICoKKyAqIERldGVybWluZXMgaWYgdGhlIHNlY3VyaXR5IHN1aXRlcyByZXF1ZXN0ZWQgYnkgYW4gUlNOIHN0YXRpb24gb3IKKyAqIG5vbi1SU04gc3RhdGlvbiBhcmUgYWxsb3dlZCB1bmRlciB0aGUgc2VjdXJpdHkgbW9kZSBpbiBmb3JjZSBhdCB0aGUKKyAqIG1vbWVudC4KKyAqCisgKiBBbiBSU04gSUUgbmVlZHMgdG8gYmUgcGFzc2VkIGluIGlmIFJTTiBpcyBiZWluZyB1c2VkLiBPdGhlcndpc2UgdGhlCisgKiBpZUxlbiBmaWVsZCBzaG91bGQgYmUgc2V0IHRvIDAgb3IgaWVEYXRhIHNldCB0byBOVUxMIHRvIGluZGljYXRlCisgKiB0aGF0IG5vIElFIGlzIHByZXNlbnQuIElmIHRoZSBSU04gSUUgaXMgcHJlc2VudCBpdCBpcyB1c2VkIHRvIGNoZWNrCisgKiBib3RoIHRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIGFuZCB0aGUgY2lwaGVyIHR5cGUgZm9yIHRoZSBncm91cCBhbmQKKyAqIHBhaXJ3aXNlIGtleXMuIFNwZWNpYWwgcnVsZXMgbWlnaHQgYXBwbHkgaW4gdGhlIGNhc2Ugb2YgYQorICogQlAuIFRoZXJlZm9yZSwgYSBzZXBhcmF0ZSBmbGFnIGluZGljYXRlcyBpZiB0aGUgU1RBIGlzIGEgQlAuCisgKgorICogSWYgdGhlIHN0YXRpb24gaXMgbm90IHVzaW5nIFJTTiwgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgaXMKKyAqIHRpZ2h0bHkgYm91bmQgdG8gdGhlIGNpcGhlciB0eXBlLiBGb3IgaW5zdGFuY2UsIHdoZW4gdXNpbmcKKyAqIHNoYXJlZC1rZXkgTUFDIGF1dGhlbnRpY2F0aW9uLCB0aGUgY2lwaGVyIHR5cGUgd2lsbCBiZSBhc3N1bWVkIHRvCisgKiBiZSBXRVAuIChCb3RoIFdFUC00MCBhbmQgV0VQLTEwNCBmYWxsIHVuZGVyIHRoZSBzYW1lIHNlY3VyaXR5CisgKiBsZXZlbC4pIFdoZW4gdXNpbmcgb3Blbi1zeXN0ZW0gTUFDIGF1dGhlbnRpY2F0aW9uLCB0aGUgY2lwaGVyIHR5cGUKKyAqIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBXRVAgaWYgdGhlIHNlY3VyaXR5IGxldmVsIHJlcXVpcmVzIFdFUCwKKyAqIG90aGVyd2lzZSB0aGUgY2lwaGVyIHdpbGwgYmUgZGV0ZXJtaW5lZCBsYXRlci4gKFdoZW4gcGVyZm9ybWluZworICogb3Blbi1hdXRoIGluIHRoZSBsb3dlc3Qgc2VjdXJpdHkgbGV2ZWwsIHRoZSBTVEEgaXMgcmVxdWlyZWQgdG8KKyAqIGluaXRpYXRlIEVBUE9MIGluIG9yZGVyIHRvIGVzdGFibGlzaCBXRVAga2V5cywgb3IgV0VQIGNhbm5vdCBiZSBub3QKKyAqIHVzZWQuKQorICogCisgKiBAcGFyYW0gc2VjTW9kZSB0aGUgc2VjdXJpdHkgbW9kZSB0aGF0IGlzIGluIGZvcmNlCisgKiBAcGFyYW0gbWFjQXV0aFR5cGUgdGhlIE1BQy1sZXZlbCBhdXRoZW50aWNhdGlvbiB0eXBlIHRvIGNoZWNrCisgKiBAcGFyYW0gaWVMZW4gaXMgc2V0IDAgaWYgbm8gUlNOIElFIGlzIHByZXNlbnQsIG9yIHRvIHRoZSBudW1iZXIgb2YKKyAqIG9jdGV0cyBpbiB0aGUgUlNOIElFLgorICogQHBhcmFtIGllRGF0YSB0aGUgb3B0aW9uYWwgSUUgZGF0YSBieXRlcywgb3IgTlVMTCBpZiBubyBJRSBpcworICogcHJlc2VudC4KKyAqIEBwYXJhbSBicEluZGljYXRvciBlQU5JX0JPT0xFQU5fVFJVRSBpZiB0aGUgU1RBIGlzIGEgQlAsCisgKiBlQU5JX0JPT0xFQU5fRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUUgaWYgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgaXMgYWxsb3dlZCwKKyAqIGVBTklfQk9PTEVBTl9GQUxTRSBpZiBub3QuCisgKgorICogQHNlZSBhbmlTc21Jc1JzblN1aXRlQWxsb3dlZAorICovCit2X0JPT0xfdAorYW5pU3NtSXNTZWNNb2RlQWxsb3dlZCh2X1UzMl90IHNlY01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRBbmlBdXRoVHlwZSBtYWNBdXRoVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBpZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICppZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IGJwSW5kaWNhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCB3cHNFbmFibGVkKTsKKworLyoqCisgKiBhbmlTc21HZW5Sc25TdWl0ZUxpc3QKKyAqCisgKiBHZW5lcmF0ZXMgYSBSU04gaW5mb3JtYXRpb24gZWxlbWVudCBjb250YWluaW5nIGEgbGlzdCBvZiBSU04gc3VpdGVzCisgKiB0aGF0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCBzZWN1cml0eSBsZXZlbC4gVGhpcyBpcyBnZW5lcmFsbHkKKyAqIHVzZWQgb24gdGhlIEFQIHRvIGdlbmVyYXRlIHRoZSBSU04gaW5mb3JtYXRpb24gZWxlbWVudCBpdAorICogYWR2ZXJ0aXplcy4KKyAqCisgKiBAcGFyYW0gc2VjTW9kZSB0aGUgc2VjdXJpdHkgbW9kZSBpbiBmb3JjZQorICogQHBhcmFtIGllRGF0YSB0aGUgYnVmZmVyIGluIHdoaWNoIHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgSUUKKyAqCisgKiBAcmV0dXJuIHRoZSBub24tbmVnYXRpdmUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byB0aGUgYnVmZmVyIGlmCisgKiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludAorYW5pU3NtR2VuUnNuU3VpdGVMaXN0KHZfVTMyX3Qgc2VjTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgaWVEYXRhW0FOSV9SU05fSUVfTUFYX0xFTl0pOworCisvKioKKyAqIGFuaVNzbUdlblJzblN1aXRlRm9yQnAKKyAqCisgKiBHZW5lcmF0ZXMgYSBSU04gaW5mb3JtYXRpb24gZWxlbWVudCBjb250YWluaW5nIGV4YWN0bHkgb25lIFJTTgorICogc3VpdGUgc2VsZWN0b3IgZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBleGFjdGx5IG9uZSBmb3IgdGhlCisgKiBjaXBoZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IHVzZWQgb24gdGhlIEJQIHNpZGUgd2hpbGUgYXNzb2NpYXRpbmcKKyAqIHdpdGggYW4gdXBzdHJlYW0gQVAuCisgKgorICogSWYgUlNOIGlzIHR1cm5lZCBvZmYgb24gdGhlIEJQLCB0aGVuIHRoZSBJRSBpcyBvZiBsZW5ndGggMC4KKyAqCisgKiBOT1RFOiBBcyBwZXIgODAyLjExL0QzLjAsIHRoZSBCUCBoYXMgdG8gc2VuZCBiYWNrIHRoZSBleGFjdCBncm91cAorICoga2V5IGNpcGhlciB0aGF0IHRoZSBBUCBpbmRpY2F0ZWQgaW4gaXRzIElFLgorICoKKyAqIEBwYXJhbSBhcEllRGF0YSBjb250YWlucyB0aGUgSUUgc2VudCBieSB0aGUgQVAgYW5kIGlzIHVzZWQgdG8gcmVhZAorICogdGhlIGdyb3VwIGtleSBjaXBoZXIgdGhhdCB0aGUgQVAgd2FudHMgdXMgdG8gdXNlLgorICogQHBhcmFtIGFwSWVMZW4gdGhlIGxlbmd0aCBvZiB0aGUgQVAncyBJRQorICogQHBhcmFtIGJwUnNuRmxhZyBzaG91bGQgYmUgMCBmb3Igbm8gUlNOLCAxIGZvciBBRVMsIDIgZm9yIFRLSVAKKyAqIEBwYXJhbSBicFBza0ZsYWcgc2hvdWxkIGJlIGVBTklfQk9PTEVBTl9UUlVFIGlmIFJTTiB3aXRoIFBTSyBpcworICogZGVzaXJlZC4gVGhpcyBpcyBvbmx5IHJlbGV2YW50IGlmIGJwUnNuRmxhZyBpcyBub3QgemVyby4KKyAqIEBwYXJhbSBpZURhdGEgdGhlIGJ1ZmZlciBpbiB3aGljaCB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIElFCisgKgorICogQHJldHVybiB0aGUgbm9uLW5lZ2F0aXZlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGludG8gdGhlIGJ1ZmZlciBpZgorICogdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQKK2FuaVNzbUdlblJzblN1aXRlRm9yQnAoY29uc3Qgdl9VOF90ICphcEllRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IGFwSWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgYnBSc25GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCBicFBza0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBpZURhdGFbQU5JX1JTTl9JRV9NQVhfTEVOXSk7CisKKy8qKgorICogYW5pU3NtU2VjTW9kZTJTdHIKKyAqCisgKiBSZXR1cm5zIGEgZGVzY3JpcHRpdmUgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2dpbmcgdGhlCisgKiBzZWN1cml0eSBtb2RlLgorICoKKyAqIEBwYXJhbSBzZWNNb2RlIHRoZSBzZWNNb2RlIHRvIGJlIHByaW50ZWQKKyAqCisgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIEFTQ0lJIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNlY01vZGUKKyAqLwordl9VOF90ICoKK2FuaVNzbVNlY01vZGUyU3RyKHZfVTMyX3Qgc2VjTW9kZSk7CisKKy8qKgorICogYW5pU3NtSWUyU3RyCisgKgorICogUGFyc2VzIGFuZCByZXR1cm5zIGEgcHJpbnRhYmxlIGZvcm0gb2YgdGhlIElFIChXUEEvUlNOKS4KKyAqCisgKiBAcGFyYW0gaWVEYXRhIHRoZSBJRSBieXRlcworICogQHBhcmFtIGllTGVuIHRoZSBsZW5ndGggb2YgdGhlIElFCisgKgorICogQHJldHVybiBBTklfT0sgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICovCit2X1U4X3QgKgorYW5pU3NtSWUyU3RyKGNvbnN0IHZfVThfdCAqaWVEYXRhLCB2X1U4X3QgaWVMZW4pOworCisjZW5kaWYgLyogX0FOSV9TU01fU0VSVklDRVNfSF8gKi8KZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBSc25UeFJ4LmMgYi9DT1JFL0JBUC9zcmMvYmFwUnNuVHhSeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxM2E2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYmFwUnNuVHhSeC5jCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIHZvc19saXN0LmMKKyAgCisgIFxicmllZgorICAKKyAgRGVzY3JpcHRpb24uLi4KKyAgICAKKyAgCisgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAkSEVBREVSJCAqLworI2luY2x1ZGUgImJhcFJzblR4UnguaCIKKyNpbmNsdWRlICJiYXBSc244MDIxeEZzbS5oIgorI2luY2x1ZGUgImJhcEludGVybmFsLmgiCisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfdGwuaCIKKyNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCisKKworc3RhdGljIHBuZlR4Q29tcGxldGVIYW5kbGVyIGJhcFJzbkZzbVR4Q21wSGFuZGxlciA9IE5VTEw7CitzdGF0aWMgcG5mUnhGcmFtZUhhbmRsZXIgYmFwUnNuRnNtUnhGcmFtZUhhbmRsZXIgPSBOVUxMOworCitleHRlcm4gaW50IGdSZWFkVG9TZXRLZXk7CisKKworVk9TX1NUQVRVUyBiYXBSc25SZWdpc3RlclR4UnhDYWxsYmFja3MoIHBuZlR4Q29tcGxldGVIYW5kbGVyIHBmblR4Q29tLCBwbmZSeEZyYW1lSGFuZGxlciBwbmZSeEZyYW1lICkKK3sKKyAgICBpZiggYmFwUnNuRnNtVHhDbXBIYW5kbGVyIHx8IGJhcFJzbkZzbVJ4RnJhbWVIYW5kbGVyICkKKyAgICB7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfQUxSRUFEWTsKKyAgICB9CisKKyAgICBiYXBSc25Gc21UeENtcEhhbmRsZXIgPSBwZm5UeENvbTsKKyAgICBiYXBSc25Gc21SeEZyYW1lSGFuZGxlciA9IHBuZlJ4RnJhbWU7CisKKyAgICByZXR1cm4gKCBWT1NfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKwordm9pZCBiYXBSc25DbGVhclR4UnhDYWxsYmFja3Modm9pZCkKK3sKKyAgICBiYXBSc25Gc21UeENtcEhhbmRsZXIgPSBOVUxMOworICAgIGJhcFJzbkZzbVJ4RnJhbWVIYW5kbGVyID0gTlVMTDsKK30KKworCisvL1RvIHJlc2VydmUgYSB2b3NfcGFja2V0IGZvciBUeCBlYXBvbCBmcmFtZQorLy9JZiBzdWNjZXNzLCBwUGFja2V0IGlzIHRoZSBwYWNrZXQgYW5kIHBEYXRhIHBvaW50cyB0byB0aGUgaGVhZC4KK3N0YXRpYyBWT1NfU1RBVFVTIGJhcFJzbkFjcXVpcmVQYWNrZXQoIHZvc19wa3RfdCAqKnBwUGFja2V0LCB2X1U4X3QgKipwcERhdGEsIHZfVTE2X3Qgc2l6ZSApCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgdm9zX3BrdF90ICpwUGFja2V0OworCisgICAgc3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0KCAmcFBhY2tldCwgVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01ULCBzaXplLCAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19UUlVFLCBOVUxMLCBOVUxMICk7CisgICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHBQYWNrZXQsICh2X1ZPSURfdCAqKilwcERhdGEsIHNpemUgKTsKKyAgICAgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJiYXBSc25BY3F1aXJlUGFja2V0IGZhaWxlZCB0byByZXNlcnZlIHNpemUgPSAlZFxuIiwgc2l6ZSApOworICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwUGFja2V0ICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcHBQYWNrZXQgPSBwUGFja2V0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiYmFwUnNuQWNxdWlyZVBhY2tldCBmYWlsZWQgdG8gZ2V0IHZvc19wa3RcbiIgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKCBzdGF0dXMgKTsKK30KKworCitzdGF0aWMgVk9TX1NUQVRVUyBiYXBSc25UeENvbXBsZXRlQ2FsbGJhY2soIHZfUFZPSURfdCBwdm9zR0N0eCwgdm9zX3BrdF90ICpwUGFja2V0LCBWT1NfU1RBVFVTIHJldFN0YXR1cyApCit7CisgICAgaW50IHJldFZhbDsKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQ7IC8vIHVzZSBidGFtcENvbnRleHQgdmFsdWUgIAorICAgIHRDc3JSb2FtU2V0S2V5IHNldEtleUluZm87CisgICAgdFN1cHBSc25Gc20gKmZzbTsKKworICAgIGlmIChOVUxMID09IHB2b3NHQ3R4KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJwdm9zR0N0eCBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIGJ0YW1wQ29udGV4dCA9IFZPU19HRVRfQkFQX0NCKHB2b3NHQ3R4KTsgCisgICAgaWYgKE5VTEwgPT0gYnRhbXBDb250ZXh0KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJidGFtcENvbnRleHQgaXMgTlVMTCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICBmc20gPSAmYnRhbXBDb250ZXh0LT51RnNtLnN1cHBGc207CisgICAgaWYgKE5VTEwgPT0gZnNtKSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJmc20gaXMgTlVMTCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvL0lmIHdlIGdldCBhIGRpc2NvbmVjdCBmcm9tIHVwcGVyIGxheWVyIGJlZm9yZSBnZXR0aW5nIHRoZSBwa3QgZnJvbSBUTCB0aGUKKyAgICAvL2JhcFJzbkZzbVR4Q21wSGFuZGxlciBjb3VsZCBiZSBOVUxMIAorICAgIC8vVk9TX0FTU0VSVCggYmFwUnNuRnNtVHhDbXBIYW5kbGVyICk7CisKKyAgICBpZiggYmFwUnNuRnNtVHhDbXBIYW5kbGVyICkKKyAgICB7CisgICAgICAgIC8vQ2hhbmdlIHRoZSBzdGF0ZQorICAgICAgICAvL0NhbGwgYXV0aCBvciBzdXBwIEZTTSdzIGhhbmRsZXIKKyAgICAgICAgYmFwUnNuRnNtVHhDbXBIYW5kbGVyKCBwdm9zR0N0eCwgcFBhY2tldCwgcmV0U3RhdHVzICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOworICAgICAgICByZXR1cm4gKFZPU19TVEFUVVNfU1VDQ0VTUyApOworICAgIH0KKworICAgIC8vZnNtLT5zdXBwQ3R4LT5wdGsgY29udGFpbnMgdGhlIDMgMTYtYnl0ZXMga2V5cy4gV2UgbmVlZCB0aGUgbGFzdCBvbmUuCisgICAgLyoKKyAgICBXZSB3aWxsIG1vdmUgdGhlIFNldCBrZXkgdG8gRUFQT0wgQ29tcGxldGlvbiBoYW5kbGVyLiBXZSBmb3VuZCBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW0KKyAgICBzZW5kaW5nIEVBUE9MIGZyYW1lIGFuZCBzZXR0aW5nIEtleSAqLworICAgIGlmIChCQVBfU0VUX1JTTl9LRVkgPT0gZ1JlYWRUb1NldEtleSkgeworICAgICAgICB2b3NfbWVtX3plcm8oICZzZXRLZXlJbmZvLCBzaXplb2YoIHRDc3JSb2FtU2V0S2V5ICkgKTsKKyAgICAgICAgc2V0S2V5SW5mby5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworICAgICAgICBzZXRLZXlJbmZvLmtleURpcmVjdGlvbiA9IGVTSVJfVFhfUlg7CisgICAgICAgIHZvc19tZW1fY29weSggc2V0S2V5SW5mby5wZWVyTWFjLCBmc20tPnN1cHBDdHgtPmF1dGhNYWMsIHNpemVvZiggdEFuaU1hY0FkZHIgKSApOworICAgICAgICBzZXRLZXlJbmZvLnBhZVJvbGUgPSAwOyAvL3RoaXMgaXMgYSBzdXBwbGljYW50CisgICAgICAgIHNldEtleUluZm8ua2V5SWQgPSAwOyAgIC8vYWx3YXlzCisgICAgICAgIHNldEtleUluZm8ua2V5TGVuZ3RoID0gQ1NSX0FFU19LRVlfTEVOOyAKKyAgICAgICAgdm9zX21lbV9jb3B5KCBzZXRLZXlJbmZvLktleSwgKHZfVThfdCAqKWZzbS0+c3VwcEN0eC0+cHRrICsgKDIgKiBDU1JfQUVTX0tFWV9MRU4gKSwgQ1NSX0FFU19LRVlfTEVOICk7CisKKyAgICAgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIGJhcFNldEtleSggZnNtLT5jdHgtPnB2b3NHQ3R4LCAmc2V0S2V5SW5mbyApICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIgU3VwcDogZ290b1N0YXRlU3RhS2V5U2V0IGZhaWwgdG8gc2V0IGtleVxuIiApOworICAgICAgICAgICAgcmV0VmFsID0gQU5JX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGdSZWFkVG9TZXRLZXkgPSBCQVBfUkVTRVRfUlNOX0tFWTsKKyAgICB9CisKKyAgICByZXR1cm4gKFZPU19TVEFUVVNfU1VDQ0VTUyApOworfQorCisKK3N0YXRpYyBWT1NfU1RBVFVTIGJhcFJzblR4RnJhbWUoIHZfUFZPSURfdCBwdm9zR0N0eCwgdm9zX3BrdF90ICpwUGFja2V0ICkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICBXTEFOVExfTWV0YUluZm9UeXBlIG1ldGFJbmZvOworCisgICAgdm9zX21lbV96ZXJvKCAmbWV0YUluZm8sIHNpemVvZiggV0xBTlRMX01ldGFJbmZvVHlwZSApICk7CisgICAgbWV0YUluZm8udWNJc0VhcG9sID0gMTsgLy9vbmx5IHNlbmQgZWFwb2wgZnJhbWUKKyAgICBzdGF0dXMgPSBXTEFOVExfVHhCQVBGcm0oIHB2b3NHQ3R4LCBwUGFja2V0LCAmbWV0YUluZm8sIGJhcFJzblR4Q29tcGxldGVDYWxsYmFjayApOworICAgIGlmKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgImJhcFJzblR4RnJhbWUgZmFpbGVkIHRvIHNlbmQgdm9zX3BrdCBzdGF0dXMgPSAlZFxuIiwgc3RhdHVzICk7CisgICAgfQorCisgICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKKworLyoKKyAgICBcYnJpZWYgYmFwUnNuU2VuZEVhcG9sRnJhbWUKKyAgICBUbyBwdXNoIGFuIGVhcG9sIGZyYW1lIHRvIFRMLiAKKworICAgIFxwYXJhbSBwQW5pUGt0IC0gYSByZWFkeSBlYXBvbCBmcmFtZSB0aGF0IGlzIHByZXBhcmVkIGluIHRBbmlQYWNrZXQgZm9ybWF0CisqLworVk9TX1NUQVRVUyBiYXBSc25TZW5kRWFwb2xGcmFtZSggdl9QVk9JRF90IHB2b3NHQ3R4LCB0QW5pUGFja2V0ICpwQW5pUGt0ICkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICB2b3NfcGt0X3QgKnBQYWNrZXQ7CisgICAgdl9VOF90ICpwRGF0YSwgKnBTcmM7CisgICAgaW50IHBrdExlbiA9IGFuaUFzZlBhY2tldEdldEJ5dGVzKCBwQW5pUGt0LCAmcFNyYyApOworCisgICAgaWYoIHBrdExlbiA8PSAwICkKKyAgICB7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRU1QVFk7CisgICAgfQorICAgIHN0YXR1cyA9IGJhcFJzbkFjcXVpcmVQYWNrZXQoICZwUGFja2V0LCAmcERhdGEsIHBrdExlbiApOworICAgIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIHZvc19tZW1fY29weSggcERhdGEsIHBTcmMsIHBrdExlbiApOworICAgICAgICAvL1NlbmQgdGhlIHBhY2tldCwgbmVlZCB0byBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYW4gb3V0c3RhbmRpbmcgcGFja2V0IGZpcnN0LgorICAgICAgICBzdGF0dXMgPSBiYXBSc25UeEZyYW1lKCBwdm9zR0N0eCwgcFBhY2tldCApOworICAgICAgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBQYWNrZXQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIHN0YXR1cyApOworfQorCisKKy8vVEwgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uIFJ4IGZyYW1lcywgc2hvdWxkIG9ubHkgYmUgRUFQT0wgZnJhbWVzCitWT1NfU1RBVFVTIGJhcFJzblJ4Q2FsbGJhY2soIHZfUFZPSURfdCBwdiwgdm9zX3BrdF90ICpwUGFja2V0ICkKK3sKKyAgICAvL0NhbGxiYWNrIHRvIGF1dGggb3Igc3VwcCBGU00ncyBoYW5kbGVyCisgICAgVk9TX0FTU0VSVCggYmFwUnNuRnNtUnhGcmFtZUhhbmRsZXIgKTsKKyAgICBpZiggYmFwUnNuRnNtUnhGcmFtZUhhbmRsZXIgKQorICAgIHsKKyAgICAgICAgYmFwUnNuRnNtUnhGcmFtZUhhbmRsZXIoIHB2LCBwUGFja2V0ICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vZG9uZQorICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBQYWNrZXQgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKCBWT1NfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKworCisKK1ZPU19TVEFUVVMgYmFwUnNuUmVnaXN0ZXJSeENhbGxiYWNrKCB2X1BWT0lEX3QgcHZvc0dDdHggKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzOworCisgICAgc3RhdHVzID0gV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50KCBwdm9zR0N0eCwgV0xBTkJBUF9SeENhbGxiYWNrLCBXTEFOQkFQX1RMRmx1c2hDb21wQ2FsbGJhY2sgKTsKKyAgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgaWYoIFZPU19TVEFUVVNfRV9FWElTVFMgIT0gc3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJiYXBSc25SZWdpc3RlclJ4Q2FsbGJhY2sgZmFpbGVkIHdpdGggc3RhdHVzID0gJWRcbiIsIHN0YXR1cyApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9XZSBjb25zaWRlciBpdCBvayB0byByZWdpc3RlciBpdCBtdWx0aXBsZSB0aW1lcyBiZWNhdXNlIG9ubHkgQkFQJ3MgUlNOIHNob3VsZCBjYWxsIHRoaXMKKyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIHN0YXR1cyApOworfQorCisKZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9iYXBSc25UeFJ4LmggYi9DT1JFL0JBUC9zcmMvYmFwUnNuVHhSeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NjAyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYmFwUnNuVHhSeC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fQkFQUlNOX1RYUlhfSCApCisjZGVmaW5lIF9fQkFQUlNOX1RYUlhfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgYmFwUnNuVHhSeC5oCisgIAorICBcYnJpZWYKKyAgCisgIERlc2NyaXB0aW9uLi4uCisgICAgCisgIAorICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuCisgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAgICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJ2b3Nfc3RhdHVzLmgiCisjaW5jbHVkZSAidm9zX3BhY2tldC5oIgorI2luY2x1ZGUgImJhcFJzbkFzZlBhY2tldC5oIgorCisKK3R5cGVkZWYgaW50ICgqcG5mVHhDb21wbGV0ZUhhbmRsZXIpKCB2X1BWT0lEX3QgcHZvc0dDdHgsIHZvc19wa3RfdCAqcFBhY2tldCwgVk9TX1NUQVRVUyByZXRTdGF0dXMgKTsKK3R5cGVkZWYgaW50ICgqcG5mUnhGcmFtZUhhbmRsZXIpKCB2X1BWT0lEX3QgcHZvc0dDdHgsIHZvc19wa3RfdCAqcFBhY2tldCApOworCisvKgorICAgIFxicmllZiBiYXBSc25TZW5kRWFwb2xGcmFtZQorICAgIFRvIHB1c2ggYW4gZWFwb2wgZnJhbWUgdG8gVEwuIAorCisgICAgXHBhcmFtIHBBbmlQa3QgLSBhIHJlYWR5IGVhcG9sIGZyYW1lIHRoYXQgaXMgcHJlcGFyZWQgaW4gdEFuaVBhY2tldCBmb3JtYXQKKyovCitWT1NfU1RBVFVTIGJhcFJzblNlbmRFYXBvbEZyYW1lKCB2X1BWT0lEX3QgcHZvc0dDdHgsIHRBbmlQYWNrZXQgKnBBbmlQa3QgKTsKKworCisvKgorICAgIFxicmllZiBiYXBSc25SZWdpc3RlclR4UnhDYWxsYmFja3MKKyAgICBUbyByZWdpc3RlciB0d28gY2FsbGJhY2tzIGZvciB0eGNvbXBsZXRlIGFuZCByeEZyYW1lcyAuCisKKyAgICBccGFyYW0gcGZuVHhDb20gLSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSB0eCBjb21wbGV0aW9uLgorICAgIFxwYXJhbSBwbmZSeEZyYW1lIC0gcG9pbnQgdG8gYSBmdW5jdGlvbiB0byBoYW5kbGUgcnggZnJhbWVzCisqLworVk9TX1NUQVRVUyBiYXBSc25SZWdpc3RlclR4UnhDYWxsYmFja3MoIHBuZlR4Q29tcGxldGVIYW5kbGVyIHBmblR4Q29tLCBwbmZSeEZyYW1lSGFuZGxlciBwbmZSeEZyYW1lICk7CisKKy8vVG8gc2V0IHRoZSBjYWxsYmFrcyB0byBOVUxMIHNvIGl0IGNhbiBiZSBjaGFuZ2UgbGF0ZXIKK3ZvaWQgYmFwUnNuQ2xlYXJUeFJ4Q2FsbGJhY2tzKHZvaWQpOworCisvKgorICAgIFxicmllZiBiYXBSc25SZWdpc3RlclJ4Q2FsbGJhY2sKKyAgICBUbyByZWdpc3RlciB0aGUgUlggZnJhbWUgY2FsbGJhY2tzIHRvIFRMIHRvIHJlY2VpdmUgRUFQT0wgZnJhbWVzIC4KKworICAgIFxwYXJhbSBwdm9zR0N0eCAtIHBvaW50ZXIgdG8gZ2xvYmFsIFZPU1MgY29udGV4dC4KKyovCitWT1NfU1RBVFVTIGJhcFJzblJlZ2lzdGVyUnhDYWxsYmFjayggdl9QVk9JRF90IHB2b3NHQ3R4ICk7CisKK1ZPU19TVEFUVVMgYmFwUnNuUnhDYWxsYmFjayh2X1BWT0lEX3QgcHYsIHZvc19wa3RfdCAqcFBhY2tldCk7CisKKyNlbmRpZiAvL19fQkFQUlNOX1RYUlhfSAorCisKKworCmRpZmYgLS1naXQgYS9DT1JFL0JBUC9zcmMvYnRhbXBGc20uYyBiL0NPUkUvQkFQL3NyYy9idGFtcEZzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDJmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYnRhbXBGc20uYwpAQCAtMCwwICsxLDI3MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgYiB0IGEgbSBwIEYgcyBtIC4gQworCisgIE9WRVJWSUVXOgorCisgIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEZpbml0ZSBTdGF0ZSBNYWNoaW5lIHRoYXQKKyAgY29udHJvbHMgdGhlIG9wZXJhdGlvbiBvZiBlYWNoIGluZGl2aWR1YWwgQU1QIFBoeXNpY2FsIGxpbmsuCisgIChDdXJyZW50bHksIHRoaXMgaXMgbGltaXRlZCB0byBPTkUgbGluay4pCisKKyAgVGhlIGJ0YW1wRnNtKCkgcm91dGluZSBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSBpcyBjYWxsZWQgYnkgdGhlIHJlc3Qgb2YKKyAgdGhlIEJULUFNUCBQQUwgbW9kdWxlIHdoZW5ldmVyIGEgY29udHJvbCBwbGFuZSBvcGVyYXRpb24gb2NjdXJzIHRoYXQgcmVxdWlyZXMgYQorICBtYWpvciBzdGF0ZSB0cmFuc2l0aW9uLgorCisgIERFUEVOREVOQ0lFUzoKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKworCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgICRIZWFkZXI6IC9wcmovcWN0L2Fzdy9lbmdidWlsZHMvc2NsL3VzZXJzMDIvanptdWRhL2diLWJsdWV6L3ZlbmRvci9xY29tL3Byb3ByaWV0YXJ5L3dsYW4vbGlicmEvQ09SRS9CQVAvc3JjL2J0YW1wRnNtLmMsdiAxLjExIDIwMTEvMDMvMzAgMjE6NTI6MTAganptdWRhIEV4cCBqem11ZGEgJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjAwOC0xMC0xNiAgICBqZXogICAgIENyZWF0ZWQgbW9kdWxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBidGFtcEZzbS5jZGQgLSBkbyBub3QgZWRpdCBtYW51YWxseSovCisvKiBHZW5lcmF0ZWQgb246IFRodSBPY3QgMTYgMTU6NDA6MzkgUERUIDIwMDggLyB2ZXJzaW9uIDEuMiBCZXRhIDEgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjaW5jbHVkZSAiZnNtRGVmcy5oIgorLy8jaW5jbHVkZSAiYnRhbXBGc20uaCIKKyNpbmNsdWRlICJiYXBJbnRlcm5hbC5oIgorI2luY2x1ZGUgImJ0YW1wRnNtX2V4dC5oIgorCisvLyBQaWNrIHVwIHRoZSBCVEFNUCBUaW1lciBBUEkgZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJiYXBBcGlUaW1lci5oIgorCisvLyBQaWNrIHVwIHRoZSBCVEFNUCBSU04gZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJiYXBSc244MDIxeEZzbS5oIgorCisjaW5jbHVkZSAiYmFwUnNuODAyMXhBdXRoRnNtLmgiCisvLyBQaWNrIHVwIHRoZSBTTUUgQVBJIGRlZmluaXRpb25zCisjaW5jbHVkZSAic21lX0FwaS5oIgorCisvLyBQaWNrIHVwIHRoZSBQTUMgQVBJIGRlZmluaXRpb25zCisjaW5jbHVkZSAicG1jQXBpLmgiCisKKy8vIFBpY2sgdXAgdGhlIEJUQU1QIEFQSSBkZWZpbnRpb25zIGZvciBpbnRlcmZhY2luZyB0byBFeHRlcm5hbCBzdWJzeXN0ZW1zCisjaW5jbHVkZSAiYmFwQXBpRXh0LmgiCisKKyNpbmNsdWRlICJ3bGFuX25saW5rX2NvbW1vbi5oIgorI2luY2x1ZGUgIndsYW5fYnRjX3N2Yy5oIgorCisvLyBQaWNrIHVwIHRoZSBET1QxMSBGcmFtZXMgY29tcGlsZXIKKy8vIEkganVzdCBuZWVkIHRoZXNlIG9uZSAib3BhcXVlIiB0eXBlIGRlZmluaXRpb24gaW4gb3JkZXIgdG8gdXNlIHRoZSAiZnJhbWVzIiBjb2RlCit0eXBlZGVmIHN0cnVjdCBzQW5pU2lyR2xvYmFsICp0cEFuaVNpckdsb2JhbDsKKyNpbmNsdWRlICJkb3QxMWYuaCIKKworI2lmIDAKKy8qCisgKiBFdmVudC1yZWxhdGVkIERlZmluZXMuIAorICogIC0gIFVsdGltYXRlbHksIHRoZXNlIGV2ZW50cyB3aWxsIGJlIHZhbHVlcworICogIC0gIGZyb20gYW4gZW51bWVyYXRpb24uICBUaGF0IGFyZSBzZXQgYnkgc29tZQorICogIC0gb2YgdGhlIGZvbGxvd2luZyBldmVudHMuCisgKi8KKyNkZWZpbmUgZVdMQU5fQkFQX01BQ19TVEFSVF9CU1NfU1VDQ0VTUyAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUQVJURUQgKi8KKyNkZWZpbmUgZVdMQU5fQkFQX01BQ19TVEFSVF9GQUlMUyAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSBvciBlQ1NSX1JPQU1fUkVTVUxUX05PVF9BU1NPQ0lBVEVEICovCisjZGVmaW5lIGVXTEFOX0JBUF9NQUNfU0NBTl9DT01QTEVURSAvKiBiYXBTY2FuQ29tcGxldGVDYWxsYmFjayAqLworI2RlZmluZSBlV0xBTl9CQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQgLyogTm8gZXhpc3RpbmcgSW5mcmEgYXNzb2MgIC0gZS5nLiwgdXNlIEhBTCB0byBhY2Nlc3MgdGhlIFNUQSBMSVNUIGFuZCBmaW5kIG5vdGhpbmcgKi8KKyNkZWZpbmUgZVdMQU5fQkFQX01BQ19DT05ORUNUX0NPTVBMRVRFRCAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfV0RTX0FTU09DSUFURUQgKi8KKyNkZWZpbmUgZVdMQU5fQkFQX01BQ19DT05ORUNUX0ZBSUxFRCAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSBvciBlQ1NSX1JPQU1fUkVTVUxUX05PVF9BU1NPQ0lBVEVEICovCisjZGVmaW5lIGVXTEFOX0JBUF9NQUNfQ09OTkVDVF9JTkRJQ0FUSU9OIC8qIGJhcFJvYW1Db21wbGV0ZUNhbGxiYWNrIHdpdGggZUNTUl9ST0FNX1JFU1VMVF9XRFNfQVNTT0NJQVRJT05fSU5EICovCisjZGVmaW5lIGVXTEFOX0JBUF9SU05fU1VDQ0VTUyAvKiBzZXRLZXkgSU9DVEwgZnJvbSB0aGUgQXV0aC9TdXBwIEFwcCAqLworI2RlZmluZSBlV0xBTl9CQVBfUlNOX0ZBSUxVUkUgLyogZGVBdXRoIElPQ1RMIGZyb20gdGhlIEF1dGgvU3VwcCBBcHAgKi8KKyNkZWZpbmUgZVdMQU5fQkFQX01BQ19LRVlfU0VUX1NVQ0NFU1MgLyogYmFwUm9hbUNvbXBsZXRlQ2FsbGJhY2sgd2l0aCBlQ1NSX1JPQU1fUkVTVUxUX0tFWV9TRVQgKi8KKyNkZWZpbmUgZVdMQU5fQkFQX01BQ19JTkRJQ0FURVNfTUVESUFfRElTQ09OTkVDVElPTiAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfV0RTX0RJU0FTU09DX0lORCAqLworI2RlZmluZSBlV0xBTl9CQVBfTUFDX1JFQURZX0ZPUl9DT05ORUNUSU9OUyAvKiBiYXBSb2FtQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfUk9BTV9SRVNVTFRfV0RTX1NUT1BQRUQgKi8KKyNkZWZpbmUgZVdMQU5fQkFQX0NIQU5ORUxfU0VMRUNUSU9OX0ZBSUxFRCAvKiA/Pz8gKi8KKworI2VuZGlmIC8qIDAgKi8KKworLypNaW4gYW5kIG1heCBjaGFubmVsIHZhbHVlcyBpbiAyLjRHSHogYmFuZCBmb3Igb3BlcmF0aW9uYWwgY2hhbm5lbCB2YWxpZGF0aW9uIAorICBvbiBjb25uZWN0Ki8KKyNkZWZpbmUgV0xBTl9CQVBfTUlOXzI0R19DSCAgMQorI2RlZmluZSBXTEFOX0JBUF9NQVhfMjRHX0NIICAxNAorCisKKy8qIFRoZSBIQ0kgRGlzY29ubmVjdCBMb2dpY2FsIExpbmsgQ29tcGxldGUgRXZlbnQgc2lnbmFsbGluZyByb3V0aW5lKi8KK1ZPU19TVEFUVVMKK3NpZ25hbEhDSURpc2NMb2dMaW5rQ29tcEV2ZW50CisoIAorICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQsIC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAgICAKKyAgdl9VOF90IHN0YXR1cywgICAgLyogdGhlIEJULUFNUCBzdGF0dXMgKi8KKyAgdl9VMTZfdCBsb2dfbGlua19oYW5kbGUsICAvKiBUaGUgTG9naWNhbCBMaW5rIHRoYXQgZGlzY29ubmVjdGVkKi8KKyAgdl9VOF90IHJlYXNvbiAgICAvKiB0aGUgQlQtQU1QIHJlYXNvbiBjb2RlICovCispOworCisKKy8qIFN0dWJzIC0gVE9ETyA6IFJlbW92ZSBvbmNlIHRoZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSAqLworaW50CitiYXBTdXBwRGlzY29ubmVjdCh0QnRhbXBDb250ZXh0ICpjdHgpCit7CisgICAgLy8gRGlzY29ubmVjdCBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseQorICAgIC8vIFRPRE8gOiBOZWVkIHRvIGZpbmQsIGlmIGl0IGRpc2Nvbm5lY3Qgd2lsbCBiZSBpc3N1ZWQgZnJvbSBiYXAgZm9yIHN1cHBsaWNhbnQKKyAgICByZXR1cm4gQU5JX09LOworfQorCitpbnQKK2JhcEF1dGhEaXNjb25uZWN0KHRCdGFtcENvbnRleHQgKmN0eCkKK3sKKyAgICAvLyBEaXNjb25uZWN0IGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnRlcm5hbGx5CisgICAgLy8gVE9ETyA6IE5lZWQgdG8gZmluZCwgaWYgaXQgZGlzY29ubmVjdCB3aWxsIGJlIGlzc3VlZCBmcm9tIGJhcCBmb3Igc3VwcGxpY2FudAorICAgIHJldHVybiBBTklfT0s7Cit9CisKK1ZPU19TVEFUVVMKK2JhcFNldEtleSggdl9QVk9JRF90IHB2b3NHQ3R4LCB0Q3NyUm9hbVNldEtleSAqcFNldEtleUluZm8gKQoreworICAgIHRXTEFOX0JBUEV2ZW50IGJhcEV2ZW50OyAvKiBTdGF0ZSBtYWNoaW5lIGV2ZW50ICovCisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dDsgLyogdXNlIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAKKyAgICB2X1U4X3Qgc3RhdHVzOyAgICAvKiByZXR1cm4gdGhlIEJULUFNUCBzdGF0dXMgaGVyZSAqLworICAgIGVIYWxTdGF0dXMgIGhhbFN0YXR1czsKKyAgICB2X1UzMl90IHJvYW1JZCA9IDB4RkY7CisgICAgdEhhbEhhbmRsZSAgICAgaEhhbCA9IE5VTEw7CisgICAgdl9VOF90IGdyb3VwTWFjW0FOSV9NQUNfQUREUl9TSVpFXSA9IHsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsgIAorIAorICAgIC8qIFZhbGlkYXRlIHBhcmFtcyAqLyAKKyAgICBpZiAoKHB2b3NHQ3R4ID09IE5VTEwpIHx8IChwU2V0S2V5SW5mbyA9PSBOVUxMKSkKKyAgICB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIGJ0YW1wQ29udGV4dCA9IFZPU19HRVRfQkFQX0NCKHB2b3NHQ3R4KTsgCisgICAgLyogVmFsaWRhdGUgcGFyYW1zICovIAorICAgIGlmICggYnRhbXBDb250ZXh0ID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisgICAgaEhhbCA9IFZPU19HRVRfSEFMX0NCKGJ0YW1wQ29udGV4dC0+cHZvc0dDdHgpOworICAgIGlmIChOVUxMID09IGhIYWwpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgImhIYWwgaXMgTlVMTCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IGJ0YW1wQ29udGV4dCB2YWx1ZTogJXgiLCBfX0ZVTkNUSU9OX18sICBidGFtcENvbnRleHQpOyAKKworICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLyAKKyAgICBiYXBFdmVudC5ldmVudCA9IGVXTEFOX0JBUF9SU05fU1VDQ0VTUzsKKyAgICBiYXBFdmVudC5wYXJhbXMgPSBOVUxMOworCisgICAgLyogU2lnbmFsIHRoZSBzdWNjZXNzZnVsIFJTTiBhdXRoIGFuZCBrZXkgZXhjaGFuZ2UgZXZlbnQgKi8gCisgICAgLyogKFlvdSBoYXZlIHRvIHNpZ25hbCBCRUZPUkUgY2FsbGluZyBzbWVfUm9hbVNldEtleSkgKi8gCisgICAgdm9zU3RhdHVzID0gYnRhbXBGc20oYnRhbXBDb250ZXh0LCAmYmFwRXZlbnQsICZzdGF0dXMpOworCisgICAgLyogU2V0IHRoZSBQYWlyd2lzZSBLZXkgKi8gCisgICAgaGFsU3RhdHVzID0gc21lX1JvYW1TZXRLZXkoIAorICAgICAgICAgICAgaEhhbCwgCisgICAgICAgICAgICBidGFtcENvbnRleHQtPnNlc3Npb25JZCwgCisgICAgICAgICAgICBwU2V0S2V5SW5mbywgCisgICAgICAgICAgICAmcm9hbUlkICk7CisgICAgaWYgKCBoYWxTdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgIlslNGRdIHNtZV9Sb2FtU2V0S2V5IHJldHVybmVkIEVSUk9SIHN0YXR1cz0gJWQiLCBfX0xJTkVfXywgaGFsU3RhdHVzICk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIC8qIFNldCB0aGUgR3JvdXAgS2V5ICovIAorICAgIHZvc19tZW1fY29weSggcFNldEtleUluZm8tPnBlZXJNYWMsIGdyb3VwTWFjLCBzaXplb2YoIHRBbmlNYWNBZGRyICkgKTs7CisgICAgaGFsU3RhdHVzID0gc21lX1JvYW1TZXRLZXkoIAorICAgICAgICAgICAgaEhhbCwgCisgICAgICAgICAgICBidGFtcENvbnRleHQtPnNlc3Npb25JZCwgCisgICAgICAgICAgICBwU2V0S2V5SW5mbywgCisgICAgICAgICAgICAmcm9hbUlkICk7CisgICAgaWYgKCBoYWxTdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICJbJTRkXSBzbWVfUm9hbVNldEtleSByZXR1cm5lZCBFUlJPUiBzdGF0dXM9ICVkIiwgX19MSU5FX18sIGhhbFN0YXR1cyApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisgIAorICAgIHJldHVybiB2b3NTdGF0dXM7Cit9CisKKy8qCisgKiBEZWJ1Zy1yZWxhdGVkIERlZmluZXMuIAorICogIC0gIFVsdGltYXRlbHksIHRoZXNlIGV2ZW50cyB3aWxsIGJlIHZhbHVlcworICogIC0gIGZyb20gYW4gZW51bWVyYXRpb24uICBUaGF0IGFyZSBzZXQgYnkgc29tZQorICogIC0gb2YgdGhlIGZvbGxvd2luZyBldmVudHMuCisgKi8KKyNkZWZpbmUgRFVNUExPR19PTgorI2lmIGRlZmluZWQgRFVNUExPR19PTgorI2RlZmluZSBEVU1QTE9HKG4sIG5hbWUxLCBuYW1lMiwgYVN0ciwgc2l6ZSkgXAorICAgIGlmICgxKSBcCit7XAorICAgIGludCBpO1wKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJWQuICVzOiAlcyA9IFxuIiwgbiwgbmFtZTEsIG5hbWUyKTsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIFwKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiUyLjJ4JXMiLCAoKHVuc2lnbmVkIGNoYXIgKilhU3RyKVtpXSwgaSAlIDE2ID09IDE1ID8gIlxuIiA6ICIgIik7IFwKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiXG4iKTsgXAorfQorI2Vsc2UKKyNkZWZpbmUgRFVNUExPRyhuLCBuYW1lMSwgbmFtZTIsIGFTdHIsIHNpemUpCisjZW5kaWYKKworLyoKKyAqIFN0YXRlIHRyYW5zaXRpb24gcHJvY2VkdXJlcyAKKyAqLworCitWT1NfU1RBVFVTCitnb3RvUzEKKyggCisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0LCAvKiBidGFtcENvbnRleHQgdmFsdWUgKi8gICAgCisgICAgcHRXTEFOX0JBUEV2ZW50IGJhcEV2ZW50LCAvKiBTdGF0ZSBtYWNoaW5lIGV2ZW50ICovCisgICAgdFdMQU5fQkFQUm9sZSBCQVBEZXZpY2VSb2xlLAorICAgIHZfVThfdCAqc3RhdHVzICAgIC8qIHJldHVybiB0aGUgQlQtQU1QIHN0YXR1cyBoZXJlICovCispIAoreworICB0QnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kICpwQmFwSENJUGh5c0xpbmtDcmVhdGUgCisgICAgICA9ICh0QnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kICopIGJhcEV2ZW50LT5wYXJhbXM7CisgIHRCdGFtcFRMVkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQgKnBCYXBIQ0lQaHlzTGlua0FjY2VwdCAKKyAgICAgID0gKHRCdGFtcFRMVkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQgKikgYmFwRXZlbnQtPnBhcmFtczsKKyAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICB2X1UzMl90ICAgICBjb25BY2NlcHRUT0ludGVydmFsOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKiBSZW1lbWJlciByb2xlICovCisgIGJ0YW1wQ29udGV4dC0+QkFQRGV2aWNlUm9sZSA9IEJBUERldmljZVJvbGU7CisKKyAgICBzd2l0Y2goQkFQRGV2aWNlUm9sZSkKKyAgICB7CisgICAgY2FzZSBCVF9JTklUSUFUT1I6CisgICAgICAvKiBDb3B5IGRvd24gdGhlIHBoeV9saW5rX2hhbmRsZSB2YWx1ZSAqLworICAgICAgYnRhbXBDb250ZXh0LT5waHlfbGlua19oYW5kbGUgPSBwQmFwSENJUGh5c0xpbmtDcmVhdGUtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAgIC8qIENvcHkgb3V0IHRoZSBrZXkgbWF0ZXJpYWwgZnJvbSB0aGUgSENJIGNvbW1hbmQgKi8KKyAgICAgIGJ0YW1wQ29udGV4dC0+a2V5X3R5cGUgPSBwQmFwSENJUGh5c0xpbmtDcmVhdGUtPmtleV90eXBlOworICAgICAgYnRhbXBDb250ZXh0LT5rZXlfbGVuZ3RoID0gcEJhcEhDSVBoeXNMaW5rQ3JlYXRlLT5rZXlfbGVuZ3RoOworICAgICAgdm9zX21lbV9jb3B5KCAKKyAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5rZXlfbWF0ZXJpYWwsIAorICAgICAgICAgICAgICBwQmFwSENJUGh5c0xpbmtDcmVhdGUtPmtleV9tYXRlcmlhbCwgCisgICAgICAgICAgICAgIDMyKTsgIC8qIE5lZWQgYSBrZXkgc2l6ZSBkZWZpbmUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfUkVTUE9OREVSOgorICAgICAgLyogQ29weSBkb3duIHRoZSBwaHlfbGlua19oYW5kbGUgdmFsdWUgKi8KKyAgICAgIGJ0YW1wQ29udGV4dC0+cGh5X2xpbmtfaGFuZGxlID0gcEJhcEhDSVBoeXNMaW5rQWNjZXB0LT5waHlfbGlua19oYW5kbGU7CisgICAgICAvKiBDb3B5IG91dCB0aGUga2V5IG1hdGVyaWFsIGZyb20gdGhlIEhDSSBjb21tYW5kICovCisgICAgICBidGFtcENvbnRleHQtPmtleV90eXBlID0gcEJhcEhDSVBoeXNMaW5rQWNjZXB0LT5rZXlfdHlwZTsgCisgICAgICBidGFtcENvbnRleHQtPmtleV9sZW5ndGggPSBwQmFwSENJUGh5c0xpbmtBY2NlcHQtPmtleV9sZW5ndGg7IAorICAgICAgdm9zX21lbV9jb3B5KCAKKyAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5rZXlfbWF0ZXJpYWwsIAorICAgICAgICAgICAgICBwQmFwSENJUGh5c0xpbmtBY2NlcHQtPmtleV9tYXRlcmlhbCwgCisgICAgICAgICAgICAgIDMyKTsgIC8qIE5lZWQgYSBrZXkgc2l6ZSBkZWZpbmUgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAqc3RhdHVzID0gV0xBTkJBUF9FUlJPUl9IT1NUX1JFSl9SRVNPVVJDRVM7ICAgICAvKiByZXR1cm4gdGhlIEJULUFNUCBzdGF0dXMgaGVyZSAqLworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9SRVNPVVJDRVM7CisgIH0KKworICBjb25BY2NlcHRUT0ludGVydmFsID0gKGJ0YW1wQ29udGV4dC0+YmFwQ29ubmVjdGlvbkFjY2VwdFRpbWVySW50ZXJ2YWwgKiA1KS8gODsKKyAgLyogU3RhcnQgdGhlIENvbm5lY3Rpb24gQWNjZXB0IFRpbWVyICovCisgIHZvc1N0YXR1cyA9IFdMQU5CQVBfU3RhcnRDb25uZWN0aW9uQWNjZXB0VGltZXIgKCAKKyAgICAgICAgICBidGFtcENvbnRleHQsIAorICAgICAgICAgIGNvbkFjY2VwdFRPSW50ZXJ2YWwpOworCisgICpzdGF0dXMgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOyAgICAgLyogcmV0dXJuIHRoZSBCVC1BTVAgc3RhdHVzIGhlcmUgKi8KKyAgCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8vZ290b1MxCisKK1ZPU19TVEFUVVMKK2dvdG9TY2FubmluZworKCAKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQsIC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAgICAKKyAgICB0V0xBTl9CQVBSb2xlIEJBUERldmljZVJvbGUsCisgICAgdl9VOF90ICpzdGF0dXMgICAgLyogcmV0dXJuIHRoZSBCVC1BTVAgc3RhdHVzIGhlcmUgKi8KKykKK3sKKyAgLyogSW5pdGlhdGUgYSBTQ0FOIHJlcXVlc3QgKi8KKyAgLy9jc3JTY2FuUmVxdWVzdCgpOworICAqc3RhdHVzID0gV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsgICAgIC8qIHJldHVybiB0aGUgQlQtQU1QIHN0YXR1cyBoZXJlICovCisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisjaWYgMAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIAorICBGVU5DVElPTjogY29udmVydFJvbGVUb0Jzc1R5cGUKKworICBERVNDUklQVElPTjogIFJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFLAorICAgIGVDU1JfQlNTX1RZUEVfSUJTUywgICAgICAgICAgIC8vIGFuIElCU1MgbmV0d29yayB3ZSB3aWxsIE5PVCBzdGFydAorICAgIGVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUywgICAgIC8vIGFuIElCU1MgbmV0d29yayB3ZSB3aWxsIHN0YXJ0IGlmIG5vIHBhcnRuZXJzIGRldGVjdGVkLgorICAgIGVDU1JfQlNTX1RZUEVfV0RTX0FQLCAgICAgICAgIC8vIEJULUFNUCBBUAorICAgIGVDU1JfQlNTX1RZUEVfV0RTX1NUQSwgICAgICAgIC8vIEJULUFNUCBzdGF0aW9uCisgICAgZUNTUl9CU1NfVFlQRV9BTlksIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZW5kaWYKK2VDc3JSb2FtQnNzVHlwZSAKK2NvbnZlcnRSb2xlVG9Cc3NUeXBlCisoCisgICAgdFdMQU5fQkFQUm9sZSBiYXBSb2xlICAvKiBCVC1BTVAgcm9sZSAqLworKSAKK3sKKyAgICBzd2l0Y2ggKGJhcFJvbGUpCisgICAgeworICAgICAgICBjYXNlIEJUX1JFU1BPTkRFUjogCisgICAgICAgICAgICAvLyBhbiBXRFMgbmV0d29yayB3ZSB3aWxsIGpvaW4KKyAgICAgICAgICAgIHJldHVybiBlQ1NSX0JTU19UWVBFX1dEU19TVEE7ICAgICAgICAgICAgCisgICAgICAgICAgICAvL3JldHVybiBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFOyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9yZXR1cm4gZUNTUl9CU1NfVFlQRV9JQlNTOyAgICAgLy8gSW5pdGlhbCB0ZXN0aW5nIHdpdGggSUJTUyBvbiBib3RoIGVuZHMgbWFrZXMgbW9yZSBzZW5zZQorICAgICAgICBjYXNlIEJUX0lOSVRJQVRPUjogCisgICAgICAgICAgICAvLyBhbiBXRFMgbmV0d29yayB3ZSB3aWxsIHN0YXJ0IGlmIG5vIHBhcnRuZXJzIGRldGVjdGVkLgorICAgICAgICAgICAgcmV0dXJuIGVDU1JfQlNTX1RZUEVfV0RTX0FQOyAgICAgIAorICAgICAgICAgICAgLy9yZXR1cm4gZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTOyAvLyBJIHJlYWxseSBzaG91bGQgdHJ5IElCU1Mgb24gYm90aCBlbmRzICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRTsKKyAgICB9Cit9IC8vIGNvbnZlcnRSb2xlVG9Cc3NUeXBlCisKKworY2hhciBoZXhWYWx1ZVtdID0geycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLAorICAgICAgICAgICAgICAgICAgICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnCisgICAgICAgICAgICAgICAgICB9OworCisjZGVmaW5lIEJBUF9NSU4oeCwgeSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKKyNkZWZpbmUgTUFYX0JZVEVTIDgKKy8vIEVhY2ggYnl0ZSB3aWxsIGJlIGNvbnZlcnRlZCB0byBoZXggZGlnaXRzIGZvbGxvd2VkIGJ5IGEKKy8vIHB1bmN0dWF0aW9uICh3aGljaCBpcyBzcGVjaWZpZWQgaW4gdGhlICJkZWxpbWl0ZXIiIHBhcmFtLikgVGh1cyAKKy8vIGFsbG9jYXRlIHRocmVlIHRpbWVzIHRoZSBzdG9yYWdlLgordl9VOF90ICoKK2JhcEJpbjJIZXgoY29uc3Qgdl9VOF90ICpieXRlcywgdl9VMzJfdCBsZW4sIGNoYXIgZGVsaW1pdGVyKQoreworICBzdGF0aWMgdl9VOF90IGJ1ZltNQVhfQllURVMqKDIrMSldOworICB2X1UzMl90IGk7CisgIHZfVThfdCAqcHRyOworCisgIGxlbiA9IEJBUF9NSU4obGVuLCBNQVhfQllURVMpOworICAgIGZvciAoaSA9IDAsIHB0ciA9IGJ1ZjsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAqcHRyKysgPSBoZXhWYWx1ZVsgKGJ5dGVzW2ldID4+IDQpICYgMHgwZl07CisgICAgKnB0cisrID0gaGV4VmFsdWVbIGJ5dGVzW2ldICYgMHgwZl07CisgICAgKnB0cisrID0gZGVsaW1pdGVyOworICAgIC8vc3ByaW50ZihwdHIsICIlLjJ4JWMiLCBieXRlc1tpXSwgZGVsaW1pdGVyKTsKKyAgICAvL3B0ciArPSAzOworICB9CisKKyAgLy8gRGVsZXRlIHRoZSBleHRyYSBwdW5jdHVhdGlvbiBhbmQgbnVsbCB0ZXJtaW5hdGUgdGhlIHN0cmluZworICBpZiAobGVuID4gMCkKKyAgICAgIHB0ci0tOworICAqcHRyID0gJ1wwJzsKKworICByZXR1cm4gYnVmOworfS8vIGJhcEJpbjJIZXgKKworY2hhciBiYXBTc2lkUHJlZml4VmFsdWVbXSA9IHsnQScsICdNJywgJ1AnLCAnLSd9OworCit2X1U4X3QgKiAKK2NvbnZlcnRCU1NJRFRvU1NJRAorKAorICAgIHZfVThfdCAqYnNzaWQgIC8qIEJTU0lEIHZhbHVlICovCispIAoreworICAgIHN0YXRpYyB2X1U4X3Qgc3NJZFszMl07IAorCisgICAgdm9zX21lbV9jb3B5KCAKKyAgICAgICAgICAgIHNzSWQsIAorICAgICAgICAgICAgYmFwU3NpZFByZWZpeFZhbHVlLCAKKyAgICAgICAgICAgIDQpOyAKKworICAgIHZvc19tZW1fY29weSggCisgICAgICAgICAgICAmc3NJZFs0XSwgCisgICAgICAgICAgICBiYXBCaW4ySGV4KGJzc2lkLCA2LCAnLScpLAorICAgICAgICAgICAgMTcpOyAKKworICAgIHJldHVybiBzc0lkOworfSAvLyBjb252ZXJ0QlNTSURUb1NTSUQKKworVk9TX1NUQVRVUworY29udmVydFRvQ3NyUHJvZmlsZQorKAorICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCwgLyogYnRhbXBDb250ZXh0IHZhbHVlICovICAgIAorICAgIGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlLAorICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUgICAvKiByZXR1cm4gdGhlIHByb2ZpbGUgaW5mbyBoZXJlICovCispIAoreworICAgIHN0YXRpYyB2X1U4X3QgYnRhbXBSU05JRVtdID0gezB4MzAsIDB4MTQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQsIDB4MDEsIDB4MDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsIDB4MDAsIDB4MDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHZfUzdfdCBzZXNzaW9uaWQgPSAtMTsKKyAgICB0SGFsSGFuZGxlICAgICBoSGFsID0gTlVMTDsKKyAgICB2X1UzMl90IHRyaXBsZXQ7CisgICAgdl9VOF90IHJlZ3VsYXRvcnlDbGFzczsKKyAgICB2X1U4X3QgZmlyc3RDaGFubmVsOworICAgIHZfVThfdCBudW1DaGFubmVsczsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKyAgICBpZiAoTlVMTCA9PSBidGFtcENvbnRleHQpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgImJ0YW1wQ29udGV4dCBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIGhIYWwgPSBWT1NfR0VUX0hBTF9DQihidGFtcENvbnRleHQtPnB2b3NHQ3R4KTsKKyAgICBpZiAoTlVMTCA9PSBoSGFsKSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJoSGFsIGlzIE5VTEwgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLy9aZXJvIG91dCBlbnRpcmUgcm9hbVByb2ZpbGUgc3RydWN0dXJlIHRvIGF2b2lkIHByb2JsZW1zIGluIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcnMgYXMgdGhlIHN0cnVjdHVyZSBleHBhbmRzICovCisgICAgLy92b3NfbWVtX3plcm8ocFByb2ZpbGUsc2l6ZW9mKHRDc3JSb2FtUHJvZmlsZSkpOworCisgICAgLy9TZXQgdGhlIEJTUyBUeXBlCisgICAgLy9wUHJvZmlsZS0+QlNTVHlwZSA9IGNvbnZlcnRSb2xlVG9Cc3NUeXBlKGJ0YW1wQ29udGV4dC0+QkFQRGV2aWNlUm9sZSApOyAKKyAgICBwUHJvZmlsZS0+QlNTVHlwZSA9IGJzc1R5cGU7IAorICAgIC8vcFByb2ZpbGUtPkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFOworCisgICAgLy9TZXQgdGhlIFNTSUQKKworICAgIGlmICggYnNzVHlwZSA9PSBlQ1NSX0JTU19UWVBFX1dEU19TVEEpIAorICAgIHsKKyAgICAgICAgcFByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMgPSAyOworCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnNzVHlwZSA9ICVzLCBTU0lEIHNwZWNpZmllZCA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX0JTU19UWVBFX1dEU19TVEEiLCBjb252ZXJ0QlNTSURUb1NTSUQoYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX21hY19hZGRyKSk7CisgICAgCisgICAgICAgIHZvc19tZW1femVybyhwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uU1NJRC5zc0lkLCAKKyAgICAgICAgICAgICAgICBzaXplb2YocFByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzBdLlNTSUQuc3NJZCkpOworICAgICAgICB2b3NfbWVtX2NvcHkocFByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzBdLlNTSUQuc3NJZCwKKyAgICAgICAgICAgICAgICBjb252ZXJ0QlNTSURUb1NTSUQoYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX21hY19hZGRyKSwKKyAgICAgICAgICAgICAgICAyMSk7ICAvLyBMZW5ndGggb2YgQlRBTVAgU1NJRCBpcyAyMSBieXRlcworICAgICAgICBwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uU1NJRC5sZW5ndGggPSAyMTsKKworICAgICAgICB2b3NfbWVtX3plcm8ocFByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzFdLlNTSUQuc3NJZCwgCisgICAgICAgICAgICAgICAgc2l6ZW9mKHBQcm9maWxlLT5TU0lEcy5TU0lETGlzdFsxXS5TU0lELnNzSWQpKTsKKyAgICAgICAgdm9zX21lbV9jb3B5KHBQcm9maWxlLT5TU0lEcy5TU0lETGlzdFsxXS5TU0lELnNzSWQsCisgICAgICAgICAgICAgICAgY29udmVydEJTU0lEVG9TU0lEKGJ0YW1wQ29udGV4dC0+c2VsZl9tYWNfYWRkciksCisgICAgICAgICAgICAgICAgMjEpOyAgLy8gTGVuZ3RoIG9mIEJUQU1QIFNTSUQgaXMgMjEgYnl0ZXMKKyAgICAgICAgcFByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzFdLlNTSUQubGVuZ3RoID0gMjE7CisgCisgICAgICAgIC8vU2V0IHRoZSBCU1NJRCB0byB0aGUgUmVtb3RlIEFQCisgICAgICAgIHBQcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSAxOworICAgICAgICB2b3NfbWVtX2NvcHkocFByb2ZpbGUtPkJTU0lEcy5ic3NpZCwgCisgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX21hY19hZGRyLCAKKyAgICAgICAgICAgICAgICBzaXplb2YoIHRDc3JCc3NpZCApICk7IAorIAorICAgIH0KKyAgICBlbHNlIGlmICggYnNzVHlwZSA9PSBlQ1NSX0JTU19UWVBFX1dEU19BUCkKKyAgICB7CisgICAgICAgIHBQcm9maWxlLT5TU0lEcy5udW1PZlNTSURzID0gMTsKKworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IGJzc1R5cGUgPSAlcywgU1NJRCBzcGVjaWZpZWQgPSAlc1xuIiwgX19GVU5DVElPTl9fLCAiZUNTUl9CU1NfVFlQRV9XRFNfQVAiLCBjb252ZXJ0QlNTSURUb1NTSUQoYnRhbXBDb250ZXh0LT5zZWxmX21hY19hZGRyKSk7CisgICAgCisgICAgICAgIHZvc19tZW1femVybyhwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uU1NJRC5zc0lkLCAKKyAgICAgICAgICAgICAgICBzaXplb2YocFByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzBdLlNTSUQuc3NJZCkpOworICAgICAgICB2b3NfbWVtX2NvcHkocFByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzBdLlNTSUQuc3NJZCwKKyAgICAgICAgICAgICAgICBjb252ZXJ0QlNTSURUb1NTSUQoYnRhbXBDb250ZXh0LT5zZWxmX21hY19hZGRyKSwKKyAgICAgICAgICAgICAgICAyMSk7ICAvLyBMZW5ndGggb2YgQlRBTVAgU1NJRCBpcyAyMSBieXRlcworICAgICAgICBwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uU1NJRC5sZW5ndGggPSAyMTsKKyAKKyNpZiAwCisgICAgICAgIC8vSW4gY2FzZSB5b3UgYXJlIGFuIEFQLCBkb24ndCBzZXQgdGhlIEJTU0lECisgICAgICAgIHBQcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSAwOworI2VuZGlmIC8vMAorIAorICAgICAgICAvL1NldCB0aGUgQlNTSUQgdG8geW91ciAic2VsZiBNQUMgQWRkciIKKyAgICAgICAgcFByb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEcyA9IDE7CisgICAgICAgIHZvc19tZW1fY29weShwUHJvZmlsZS0+QlNTSURzLmJzc2lkLCAKKyAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPnNlbGZfbWFjX2FkZHIsCisgICAgICAgICAgICAgICAgc2l6ZW9mKCB0Q3NyQnNzaWQgKSApOyAKKyAKKyAgICB9CisgICAgZWxzZQorICAgIC8vIEhhbmRsZSBldmVyeXRoaW5nIGVsc2UgYXMgYnNzVHlwZSBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFCisgICAgeworICAgICAgICBwUHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcyA9IDE7CisgICAgCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogYnNzVHlwZSA9ICVzLCBTU0lEIHNwZWNpZmllZCA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sICJlQ1NSX0JTU19UWVBFX1dEU19TVEEiLCBjb252ZXJ0QlNTSURUb1NTSUQoYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX21hY19hZGRyKSk7CisKKyAgICAgICAgdm9zX21lbV96ZXJvKHBQcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5TU0lELnNzSWQsIAorICAgICAgICAgICAgICAgIHNpemVvZihwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uU1NJRC5zc0lkKSk7CisgICAgICAgIHZvc19tZW1fY29weShwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uU1NJRC5zc0lkLAorICAgICAgICAgICAgICAgIGNvbnZlcnRCU1NJRFRvU1NJRChidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfbWFjX2FkZHIpLAorICAgICAgICAgICAgICAgIDIxKTsgIC8vIExlbmd0aCBvZiBCVEFNUCBTU0lEIGlzIDIxIGJ5dGVzCisgICAgICAgIHBQcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5TU0lELmxlbmd0aCA9IDIxOworIAorICAgICAgICAvL1NldCB0aGUgQlNTSUQgdG8gdGhlIFJlbW90ZSBBUAorICAgICAgICBwUHJvZmlsZS0+QlNTSURzLm51bU9mQlNTSURzID0gMTsKKyAgICAgICAgdm9zX21lbV9jb3B5KHBQcm9maWxlLT5CU1NJRHMuYnNzaWQsIAorICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19tYWNfYWRkciwgCisgICAgICAgICAgICAgICAgc2l6ZW9mKCB0Q3NyQnNzaWQgKSApOyAKKyAKKyAgICB9CisgCisgICAgLy9BbHdheXMgc2V0IHRoZSBBdXRoIFR5cGUKKyAgICAvL3BQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLOworICAgIC8vcFByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX05PTkU7CisgICAgLy9wUHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07CisgICAgcFByb2ZpbGUtPkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworICAgIC8vcFByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07CisgICAgcFByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gZUNTUl9BVVRIX1RZUEVfUlNOX1BTSzsKKworICAgIC8vQWx3YXlzIHNldCB0aGUgRW5jcnlwdGlvbiBUeXBlCisgICAgLy9wUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM7CisgICAgLy9wUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgIHBQcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICAvL3BQcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisgICAgcFByb2ZpbGUtPkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworCisgICAgcFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgLy9wUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisgICAgcFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM7CisKKyAgICAvL3NldCB0aGUgUlNOIElFCisgICAgLy9UaGlzIGlzIHdlaXJkLCBidXQgaXQgd29ya3MKKyAgICBwUHJvZmlsZS0+cFJTTlJlcUlFID0gJmJ0YW1wUlNOSUVbMF07CisgICAgcFByb2ZpbGUtPm5SU05SZXFJRUxlbmd0aCA9IDB4MTY7IC8vVE9ETworICAgIC8vcFByb2ZpbGUtPnBSU05SZXFJRSA9IE5VTEw7CisgCisgICAgLyoqIFdlIGRvbid0IHVzZSB0aGUgV1BBSUUuQnV0IE5VTEwgaXQgdG8gYXZvaWQgYmVpbmcgdXNlZCAqKi8KKyAgICBwUHJvZmlsZS0+cFdQQVJlcUlFID0gTlVMTDsKKyAgICBwUHJvZmlsZS0+bldQQVJlcUlFTGVuZ3RoID0gMDsKKworICAgIC8vIElkZW50aWZ5IHRoZSBvcGVyYXRpb24gY2hhbm5lbAorCisgICAgLyogQ2hvb3NlIHRoZSBvcGVyYXRpb24gY2hhbm5lbCBmcm9tIHRoZSBwcmVmZXJyZWQgY2hhbm5lbCBsaXN0ICovCisgICAgcFByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWwgPSAwOworICAgIHJlZ3VsYXRvcnlDbGFzcyA9IDA7CisgICAgZm9yICh0cmlwbGV0ID0gMDsgdHJpcGxldCA8IGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19wcmVmX251bV90cmlwbGV0czsgdHJpcGxldCsrKQorICAgICAgICB7CisgICAgICAgIGZpcnN0Q2hhbm5lbCA9IDA7CisgICAgICAgIG51bUNoYW5uZWxzID0gMDsKKworICAgICAgICAvKiBpcyB0aGlzIGEgcmVndWxhdG9yeSBjbGFzcyB0cmlwbGV0PyAqLworICAgICAgICBpZiAoYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3ByZWZfdHJpcGxldHNbdHJpcGxldF1bMF0gPT0gMjAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLyogaWRlbnRpZnkgc3VwcG9ydGVkIDIuNEdIeiByZWd1bGF0b3J5IGNsYXNzZXMgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3ByZWZfdHJpcGxldHNbdHJpcGxldF1bMV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyNTQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBjbGFzcyAyNTQgaXMgc3BlY2lhbCByZWd1bGF0b3J5IGNsYXNzIGRlZmluZWQgYnkgQlQgSFMrMy4wIHNwZWMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICBpcyB2YWxpZCBvbmx5IGZvciB1bmtub3duLydtb2JpbGUnIGNvdW50cnkgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKChidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcHJlZl9jb3VudHJ5WzBdID09ICdYJykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcHJlZl9jb3VudHJ5WzFdID09ICdYJykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRvcnlDbGFzcyA9IDI1NDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2hhbm5lbCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscyA9IDExOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNsYXNzIDEyIGluIHRoZSBVUyByZWd1bGF0b3J5IGRvbWFpbiBpcyAyLjRHSHogY2hhbm5lbHMgMS0xMSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19wcmVmX2NvdW50cnlbMF0gPT0gJ1UnKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19wcmVmX2NvdW50cnlbMV0gPT0gJ1MnKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhdG9yeUNsYXNzID0gMTI7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENoYW5uZWwgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2xhc3MgNCBpbiB0aGUgRXVyb3BlIHJlZ3VsYXRvcnkgZG9tYWluIGlzIDIuNEdIeiBjaGFubmVscyAxLTEzICovCisgICAgICAgICAgICAgICAgICAgIGlmICgoYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3ByZWZfY291bnRyeVswXSA9PSAnRycpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3ByZWZfY291bnRyeVsxXSA9PSAnQicpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWd1bGF0b3J5Q2xhc3MgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGFubmVsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gMTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBjbGFzcyAzMCBpbiB0aGUgSmFwYW4gcmVndWxhdG9yeSBkb21haW4gaXMgMi40R0h6IGNoYW5uZWxzIDEtMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKChidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcHJlZl9jb3VudHJ5WzBdID09ICdKJykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcHJlZl9jb3VudHJ5WzFdID09ICdQJykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRvcnlDbGFzcyA9IDMwOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGFubmVsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gMTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBpZiB0aGUgbmV4dCB0cmlwbGV0IGlzIG5vdCBhbm90aGVyIHJlZ3VsYXRvcnkgY2xhc3MgdHJpcGxldCB0aGVuIGl0IG11c3QgYmUgYSBzdWItYmFuZAorICAgICAgICAgICAgICAgdHJpcGxldC4gU2tpcCBwcm9jZXNzaW5nIHRoZSBkZWZhdWx0IGNoYW5uZWxzIGZvciB0aGlzIHJlZ3VsYXRvcnkgY2xhc3MgdHJpcGxldCBhbmQgbGV0CisgICAgICAgICAgICAgICB0aGUgc3ViLWJhbmQgdHJpcGxldCByZXN0cmljdCB0aGUgYXZhaWxhYmxlIGNoYW5uZWxzICovCisgICAgICAgICAgICBpZiAoKCh0cmlwbGV0KzEpIDwgYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3ByZWZfbnVtX3RyaXBsZXRzKSAmJgorICAgICAgICAgICAgICAgIChidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcHJlZl90cmlwbGV0c1t0cmlwbGV0KzFdWzBdICE9IDIwMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgICAgIC8qIGlmIHRoZSByZWd1bGF0b3J5IGNsYXNzIGlzIHZhbGlkIHRoZW4gdGhpcyBpcyBhIHN1Yi1iYW5kIHRyaXBsZXQgKi8KKyAgICAgICAgICAgIGlmIChyZWd1bGF0b3J5Q2xhc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3RDaGFubmVsID0gYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3ByZWZfdHJpcGxldHNbdHJpcGxldF1bMF07CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcHJlZl90cmlwbGV0c1t0cmlwbGV0XVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaXJzdENoYW5uZWwgJiYgbnVtQ2hhbm5lbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghYnRhbXBDb250ZXh0LT5idGFtcF9BTVBfQXNzb2MuSENfcHJlZl9udW1fdHJpcGxldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWwgPSBmaXJzdENoYW5uZWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoKGJ0YW1wQ29udGV4dC0+YnRhbXBfQU1QX0Fzc29jLkhDX3ByZWZfdHJpcGxldHNbMV1bMF0gKyBidGFtcENvbnRleHQtPmJ0YW1wX0FNUF9Bc3NvYy5IQ19wcmVmX3RyaXBsZXRzWzFdWzFdKSA8PSBmaXJzdENoYW5uZWwpIHx8CisgICAgICAgICAgICAgICAoKGZpcnN0Q2hhbm5lbCArIG51bUNoYW5uZWxzICkgPD0gYnRhbXBDb250ZXh0LT5idGFtcF9BTVBfQXNzb2MuSENfcHJlZl90cmlwbGV0c1sxXVswXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoYnRhbXBDb250ZXh0LT5idGFtcF9BTVBfQXNzb2MuSENfcHJlZl90cmlwbGV0c1sxXVswXSArIGJ0YW1wQ29udGV4dC0+YnRhbXBfQU1QX0Fzc29jLkhDX3ByZWZfdHJpcGxldHNbMV1bMV0pID4gZmlyc3RDaGFubmVsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcm9maWxlLT5vcGVyYXRpb25DaGFubmVsID0gZmlyc3RDaGFubmVsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKGZpcnN0Q2hhbm5lbCArIG51bUNoYW5uZWxzKSA+IGJ0YW1wQ29udGV4dC0+YnRhbXBfQU1QX0Fzc29jLkhDX3ByZWZfdHJpcGxldHNbMV1bMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWwgPSAgYnRhbXBDb250ZXh0LT5idGFtcF9BTVBfQXNzb2MuSENfcHJlZl90cmlwbGV0c1sxXVswXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcFByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWwpCisgICAgeworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgIH0KKworICAgIC8qU2V0IHRoZSBzZWxlY3RlZCBjaGFubmVsICovCisgICAgc2Vzc2lvbmlkID0gc21lX0dldEluZnJhU2Vzc2lvbklkKGhIYWwpOworICAgIC8qaWYgdGhlcmUgaXMgaW5mcmEgc2Vzc2lvbiB1cCBhbHJlYWR5LCB1c2UgdGhhdCBjaGFubmVsIG9ubHkgZm9yIEJUIEFNUAorICAgIGNvbm5lY3Rpb24sIGVsc2Ugd2UgY2FuIHVzZSB0aGUgdXNlciBwcmVmZXJyZWQgb25lKi8KKyAgICBpZigtMSAhPSBzZXNzaW9uaWQpCisgICAgeworICAgICAgICBwUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbCA9IAorICAgICAgICAgICAgc21lX0dldEluZnJhT3BlcmF0aW9uQ2hhbm5lbChoSGFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbmlkKTsKKyAgICB9CisgICAgIAorICAgIGlmKHNtZV9Jc0NoYW5uZWxWYWxpZChoSGFsLCBwUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbCkpCisgICAgeyAgICAgICAgIAorICAgICAgICBidGFtcENvbnRleHQtPmNoYW5uZWwgPSBwUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9ubyB2YWxpZCBjaGFubmVsLCBub3QgcHJvY2VlZGluZyB3aXRoIGNvbm5lY3Rpb24KKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICB9CisgICAgIAorICAgIGlmICggQlRfSU5JVElBVE9SID09IGJ0YW1wQ29udGV4dC0+QkFQRGV2aWNlUm9sZSApIAorICAgIHsKKyAgICAgIHBQcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMTsKKyAgICAgIHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCAgID0gJnBQcm9maWxlLT5vcGVyYXRpb25DaGFubmVsOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgcFByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAxOworICAgICAgICBwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgICA9ICZwUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbDsKKyAgICB9CisKKworICAgIC8vIFR1cm4gb2ZmIENCIG1vZGUKKyAgICBwUHJvZmlsZS0+Q0JNb2RlID0gZUNTUl9DQl9PRkY7CisKKyAgICAvL3NldCB0aGUgcGh5TW9kZSB0byBhY2NlcHQgYW55dGhpbmcKKyAgICAvL1RhdXJ1cyBtZWFucyBldmVyeXRoaW5nIGJlY2F1c2UgaXQgY292ZXJzIGFsbCB0aGUgdGhpbmdzIHdlIHN1cHBvcnQKKyAgICBwUHJvZmlsZS0+cGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMW47IC8vZUNTUl9ET1QxMV9NT0RFX1RBVVJVUzsgLy9lQ1NSX0RPVDExX01PREVfQVVUTzsgLyplQ1NSX0RPVDExX01PREVfQkVTVDsqLworCisgICAgLy9zZXQgdGhlIG1vZGUgaW4gQ0ZHIGFzIHdlbGwKKyAgICBzbWVfQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfRE9UMTFfTU9ERSwgV05JX0NGR19ET1QxMV9NT0RFXzExTiwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKworICAgIHBQcm9maWxlLT5iV1BTQXNzb2NpYXRpb24gPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICAvL01ha2Ugc3VyZSB3ZSBET04nVCByZXF1ZXN0IFVBUFNECisgICAgcFByb2ZpbGUtPnVhcHNkX21hc2sgPSAwOworCisgICAgLy9yZXR1cm4gdGhlIHZvc1N0YXR1cworICAgIHJldHVybiB2b3NTdGF0dXM7Cit9IC8vY29udmVydFRvQ3NyUHJvZmlsZQorCitWT1NfU1RBVFVTCitnb3RvU3RhcnRpbmcKKygKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQsIC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAgICAKKyAgICBwdFdMQU5fQkFQRXZlbnQgYmFwRXZlbnQsIC8qIFN0YXRlIG1hY2hpbmUgZXZlbnQgKi8KKyAgICBlQ3NyUm9hbUJzc1R5cGUgYnNzVHlwZSwKKyAgICB2X1U4X3QgKnN0YXR1cyAgICAvKiByZXR1cm4gdGhlIEJULUFNUCBzdGF0dXMgaGVyZSAqLworKSAKK3sKKyAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgZUhhbFN0YXR1cyAgaGFsU3RhdHVzOworICAgIHZfVTMyX3QgICAgIHBhcnNlU3RhdHVzOworICAgIC8qIHRIYWxIYW5kbGUgKi8gICAgCisgICAgdEhhbEhhbmRsZSBoSGFsOworICAgIHRCdGFtcFRMVkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZCAqcEJhcEhDSVdyaXRlUmVtb3RlQU1QQXNzb2MgCisgICAgICAgID0gKHRCdGFtcFRMVkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZCAqKSBiYXBFdmVudC0+cGFyYW1zOworICAgIHRCdGFtcEFNUF9BU1NPQyBidGFtcF9BU1NPQzsgCisKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKyAgICBpZiAoTlVMTCA9PSBidGFtcENvbnRleHQpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgImJ0YW1wQ29udGV4dCBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIGhIYWwgPSBWT1NfR0VUX0hBTF9DQihidGFtcENvbnRleHQtPnB2b3NHQ3R4KTsKKyAgICBpZiAoTlVMTCA9PSBoSGFsKSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJoSGFsIGlzIE5VTEwgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLy9JZiB3ZSBhcmUgYSBCVC1SZXNwb25kZXIsIHdlIGFyZSBhc3N1bWluZyB3ZSBhcmUgYSBCVCAic2xhdmUiIGFuZCB3ZSBIQVZFCisgICAgLy90byAic3F1ZWxjaCIgdGhlIHNsYXZlcyBmcmVxdWVudCAoZXZlcnkgMS4yNW1zKSBwb2xscy4KKworICAgIGlmIChlQ1NSX0JTU19UWVBFX1dEU19TVEEgPT0gYnNzVHlwZSkKKyAgICB7CisgICAgICAgIC8qIFNsZWVwIGZvciAzMDAoMjAwKSBtaWxsaXNlY29uZHMgLSB0byBhbGxvdyBCVCB0aHJvdWdoICovCisgICAgICAgIHZvc19zbGVlcCggMjAwICk7CisgICAgICAgIC8qIFNpZ25hbCBCVCBDb2V4aXN0ZW5jZSBjb2RlIGluIGZpcm13YXJlIHRvIHByZWZlciBXTEFOICovCisgICAgICAgIFdMQU5CQVBfTmVlZEJUQ29leFByaW9yaXR5ICggYnRhbXBDb250ZXh0LCAxKTsKKyAgICB9CisKKworICAgIC8vVGVsbCBQTUMgdG8gZXhpdCBCTVBTOworICAgIGhhbFN0YXR1cyA9IHBtY1JlcXVlc3RGdWxsUG93ZXIoCisgICAgICAgICAgICBoSGFsLCAKKyAgICAgICAgICAgIFdMQU5CQVBfcG1jRnVsbFB3clJlcUNCLCAKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dCwKKyAgICAgICAgICAgIGVTTUVfUkVBU09OX09USEVSKTsKKyAgICAgICAgICAgIC8vIEpFWjA4MTIxMDogVGhpcyBoYXMgdG8gd2FpdCB1bnRpbCB3ZSBzeW5jIGRvd24gZnJvbSAKKyAgICAgICAgICAgIC8vIC9tYWluL2xhdGVzdCBhcyBvZiAxMi80LiAgV2UgYXJlIGN1cnJlbnRseSBhdCAxMi8zLgorICAgICAgICAgICAgLy9lU01FX0ZVTExfUFdSX05FRURFRF9CWV9CQVApOworICAgIC8vTmVlZCB0byBjaGVjayB0aGUgcmVzdWx0Li4uYmVjYXVzZSBIb3N0IG1heSBoYXZlIGJlZW4gdG9sZCBieSAKKyAgICAvL09TIHRvIGdvIHRvIHN0YW5kYnkgKEQyKSBkZXZpY2Ugc3RhdGUuIEluIHRoYXQgY2FzZSwgSSBoYXZlIHRvIAorICAgIC8vZmFpbCB0aGUgSENJIENyZWF0ZSBQaHlzaWNhbCBMaW5rIAorCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAiSW4gJXMsIGFtcF9hc3NvY19yZW1haW5pbmdfbGVuZ3RoID0gJWQiLCBfX0ZVTkNUSU9OX18sIAorICAgICAgICAgICAgcEJhcEhDSVdyaXRlUmVtb3RlQU1QQXNzb2MtPmFtcF9hc3NvY19yZW1haW5pbmdfbGVuZ3RoKTsgCisjaWYgMAorICAgIERVTVBMT0coMSwgX19GVU5DVElPTl9fLCAiYW1wX2Fzc29jX2ZyYWdtZW50IiwgIAorICAgICAgICAgICAgcEJhcEhDSVdyaXRlUmVtb3RlQU1QQXNzb2MtPmFtcF9hc3NvY19mcmFnbWVudCwgCisgICAgICAgICAgICA2NCk7CisjZW5kaWYgLy8wCisKKyAgICAvL1doYXQgYWJvdXQgcGFyc2luZyB0aGUgQU1QIEFzc29jIHN0cnVjdHVyZT8KKyAgICBwYXJzZVN0YXR1cyA9IGJ0YW1wVW5wYWNrQU1QX0FTU09DKAorICAgICAgICAgICAgaEhhbCwgCisgICAgICAgICAgICBwQmFwSENJV3JpdGVSZW1vdGVBTVBBc3NvYy0+YW1wX2Fzc29jX2ZyYWdtZW50LCAKKyAgICAgICAgICAgIHBCYXBIQ0lXcml0ZVJlbW90ZUFNUEFzc29jLT5hbXBfYXNzb2NfcmVtYWluaW5nX2xlbmd0aCwgCisgICAgICAgICAgICAmYnRhbXBfQVNTT0MpOworCisgICAgLyogVW5rbm93biBvciBSZXNlcnZlZCBUTFZzIGFyZSBhbGxvd2VkIGluIHRoZSB3cml0ZSBBTVAgYXNzb2MgZnJhZ21lbnQgKi8KKyAgICBpZiAoKEJUQU1QX1BBUlNFX1NVQ0NFU1MgIT0gcGFyc2VTdGF0dXMgKSAmJiAoQlRBTVBfVU5LTk9XTl9UTFZTICE9IHBhcnNlU3RhdHVzKSkgIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBwYXJzZVN0YXR1cyA9ICVkIiwgX19GVU5DVElPTl9fLCBwYXJzZVN0YXR1cyk7CisgICAgICAgICpzdGF0dXMgPSBXTEFOQkFQX0VSUk9SX0lOVkFMSURfSENJX0NNTkRfUEFSQU07CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfQkFETVNHOworICAgIH0KKworICAgIC8vV2hhdCBhYm91dCB3cml0aW5nIHRoZSBwZWVyIE1BQyBhZGRyZXNzLCBhbmQgb3RoZXIgaW5mbyB0byB0aGUgQlRBTVAgCisgICAgLy9jb250ZXh0IGZvciB0aGlzIHBoeXNpY2FsIGxpbms/CisgICAgaWYgKGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19NQUNfQWRkci5wcmVzZW50ID09IDEpCisgICAgeworICAgICAgICAvKiBTYXZlIHRoZSBwZWVyIE1BQyBhZGRyZXNzICovIAorICAgICAgICB2b3NfbWVtX2NvcHkoIAorICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19tYWNfYWRkciwgCisgICAgICAgICAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX01BQ19BZGRyLm1hY19hZGRyLCAgIAorICAgICAgICAgICAgICAgIHNpemVvZihidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfbWFjX2FkZHIpKTsgCisgICAgICAgIC8qIFNhdmUgaXQgaW4gdGhlIHBlZXIgTUFDIGFkZHJlc3MgZmllbGQgKi8gCisgICAgICAgIHZvc19tZW1fY29weSggCisgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5wZWVyX21hY19hZGRyLCAKKyAgICAgICAgICAgICAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfTUFDX0FkZHIubWFjX2FkZHIsICAgCisgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YW1wQ29udGV4dC0+cGVlcl9tYWNfYWRkcikpOyAKKyAgICAgfQorCisgICAgaWYgKGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LnByZXNlbnQgPT0gMSkKKyAgICB7CisgICAgICAgIC8qIFNhdmUgdGhlIHBlZXIgUHJlZmVycmVkIENoYW5uZWwgTGlzdCAqLyAKKyAgICAgICAgdm9zX21lbV9jb3B5KCAKKyAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcHJlZl9jb3VudHJ5LCAKKyAgICAgICAgICAgICAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC5jb3VudHJ5LCAgIAorICAgICAgICAgICAgICAgIHNpemVvZihidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcHJlZl9jb3VudHJ5KSk7IAorICAgICAgICAvKiBTYXZlIHRoZSBwZWVyIFByZWZlcnJlZCBDaGFubmVsIExpc3QgKi8gCisgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19wcmVmX251bV90cmlwbGV0cyA9IAorICAgICAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QubnVtX3RyaXBsZXRzOyAgIAorICAgICAgICBpZihXTEFOQkFQX01BWF9OVU1fVFJJUExFVFMgPCAKKyAgICAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3ByZWZfbnVtX3RyaXBsZXRzKQorICAgICAgICB7CisgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcHJlZl9udW1fdHJpcGxldHMgPSAKKyAgICAgICAgICAgICAgICBXTEFOQkFQX01BWF9OVU1fVFJJUExFVFM7CisgICAgICAgIH0KKyAgICAgICAgdm9zX21lbV9jb3B5KCAKKyAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcHJlZl90cmlwbGV0cywgCisgICAgICAgICAgICAgICAgYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QudHJpcGxldHMsICAgCisgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19wcmVmX3RyaXBsZXRzWzBdKSAqCisgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3ByZWZfbnVtX3RyaXBsZXRzICAgCisgICAgICAgICAgICAgICAgKTsgCisgICAgfQorCisgICAgaWYgKGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbC5wcmVzZW50ID09IDEpCisgICAgeworICAgICAgICAvKiBTYXZlIHRoZSBwZWVyIENvbm5lY3RlZCBDaGFubmVsICovIAorICAgICAgICB2b3NfbWVtX2NvcHkoIAorICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19jbmN0X2NvdW50cnksIAorICAgICAgICAgICAgICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbC5jb3VudHJ5LCAgIAorICAgICAgICAgICAgICAgIHNpemVvZihidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfY25jdF9jb3VudHJ5KSk7IAorICAgICAgICAvKiBTYXZlIHRoZSBwZWVyIENvbm5lY3RlZCBDaGFubmVsICovIAorICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfY25jdF9udW1fdHJpcGxldHMgPSAKKyAgICAgICAgICAgIGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbC5udW1fdHJpcGxldHM7CisgICAgICAgIGlmKFdMQU5CQVBfTUFYX05VTV9UUklQTEVUUyA8IAorICAgICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfY25jdF9udW1fdHJpcGxldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19jbmN0X251bV90cmlwbGV0cyA9IAorICAgICAgICAgICAgICAgIFdMQU5CQVBfTUFYX05VTV9UUklQTEVUUzsKKyAgICAgICAgfQorICAgICAgICB2b3NfbWVtX2NvcHkoIAorICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19jbmN0X3RyaXBsZXRzLCAKKyAgICAgICAgICAgICAgICBidGFtcF9BU1NPQy5BTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwudHJpcGxldHMsICAgCisgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YW1wQ29udGV4dC0+YnRhbXBfUmVtb3RlX0FNUF9Bc3NvYy5IQ19jbmN0X3RyaXBsZXRzWzBdKSAqCisgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX2NuY3RfbnVtX3RyaXBsZXRzCisgICAgICAgICAgICAgICAgKTsgCisgICAgfQorCisgICAgaWYgKGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzLnByZXNlbnQgPT0gMSkKKyAgICB7CisgICAgICAgIC8qIFNhdmUgdGhlIHBlZXIgUEFMIENhcGFiaWxpdGllcyAqLyAKKyAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3BhbF9jYXBhYmlsaXRpZXMgCisgICAgICAgICAgICA9IGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzLnBhbF9jYXBhYmlsaXRpZXM7CisgICAgfQorCisgICAgaWYgKGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QQUxfVmVyc2lvbi5wcmVzZW50ID09IDEpCisgICAgeworICAgICAgICAvKiBTYXZlIHRoZSBwZWVyIFBBTCBWZXJzaW9uICovIAorICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcGFsX3ZlcnNpb24gCisgICAgICAgICAgICA9IGJ0YW1wX0FTU09DLkFNUF9Bc3NvY19QQUxfVmVyc2lvbi5wYWxfdmVyc2lvbjsKKworICAgICAgICBidGFtcENvbnRleHQtPmJ0YW1wX1JlbW90ZV9BTVBfQXNzb2MuSENfcGFsX0NvbXBhbnlJRCAKKyAgICAgICAgICAgID0gYnRhbXBfQVNTT0MuQU1QX0Fzc29jX1BBTF9WZXJzaW9uLnBhbF9Db21wYW55SUQ7CisKKyAgICAgICAgYnRhbXBDb250ZXh0LT5idGFtcF9SZW1vdGVfQU1QX0Fzc29jLkhDX3BhbF9zdWJ2ZXJzaW9uIAorICAgICAgICAgICAgPSBidGFtcF9BU1NPQy5BTVBfQXNzb2NfUEFMX1ZlcnNpb24ucGFsX3N1YnZlcnNpb247CisgICAgfQorCisgICAgLy9TZXQgQ29ubmVjdGlvbiBBY2NlcHQgVGltZW91dDsKKyAgICAvKiBBbHJlYWR5IGRvbmUgaW4gZ290b1MxKCkgKi8KKyAgICAvL1NldCBnTmVlZFBoeXNMaW5rQ29tcEV2ZW50OworICAgIC8vSkVaMDgxMTE0OiBUaGlzIG5lZWRzIHRvIGhhcHBlbiBlYXJsaWVyLiBJbiBnb3RvUzEuIFJpZ2h0IGF0IEhDSSBDcmVhdGUgUGh5c2ljYWwgTGluaworICAgIGJ0YW1wQ29udGV4dC0+Z05lZWRQaHlzTGlua0NvbXBFdmVudCA9IFZPU19UUlVFOworICAgIC8vQ2xlYXIgZ0Rpc2NSZXF1ZXN0ZWQ7CisgICAgYnRhbXBDb250ZXh0LT5nRGlzY1JlcXVlc3RlZCA9IFZPU19GQUxTRTsKKyAgICAvL1NldCBnUGh5c0xpbmtTdGF0dXMgdG8gMCAobm8gZXJyb3IpOworICAgIGJ0YW1wQ29udGV4dC0+Z1BoeXNMaW5rU3RhdHVzID0gV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAvL1NldCBnRGlzY1JlYXNvbiB0byAwIChubyByZWFzb24pOworICAgIGJ0YW1wQ29udGV4dC0+Z0Rpc2NSZWFzb24gPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworICAgIC8qIEluaXRpYXRlIHRoZSBsaW5rIGFzIGVpdGhlciBTVEFSVCBvciBKT0lOICovCisgICAgLy9oYWxTdGF0dXMgPSBjc3JSb2FtT3BlblNlc3Npb24oJm5ld1Nlc3Npb24pOworICAgIC8qQWRkZWQgYnkgTHVpemE6Ki8KKworICAgIGlmIChidGFtcENvbnRleHQtPmlzQmFwU2Vzc2lvbk9wZW4gPT0gRkFMU0UpCisgICAgeworCisgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9PcGVuU2Vzc2lvbihoSGFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5CQVBfUm9hbUNhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDw9PT0gSkVaMDgxMjEwOiBGSVhNRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8odEFOSV9VOCAqKSBidGFtcENvbnRleHQtPnNlbGZfbWFjX2FkZHIsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+c2VsZl9tYWNfYWRkciwgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ0YW1wQ29udGV4dC0+c2Vzc2lvbklkKTsKKyAgICAgICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBoYWxTdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+aXNCYXBTZXNzaW9uT3BlbiA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNtZV9PcGVuU2Vzc2lvbiBmYWlsZWQgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgKnN0YXR1cyA9IFdMQU5CQVBfRVJST1JfTk9fQ05DVDsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBVcGRhdGUgdGhlIFNNRSBTZXNzaW9uIGluZm8gZm9yIHRoaXMgUGh5cyBMaW5rIChpLmUuLCBmb3IgdGhpcyBQaHlzIFN0YXRlIE1hY2hpbmUgaW5zdGFuY2UpICovCisgICAgLy9iYXBVcGRhdGVTTUVTZXNzaW9uRm9yVGhpc1BoeXNMaW5rKG5ld1Nlc3Npb24sIFBoeXNMaW5rSGFuZGxlKTsKKyAgICAvLyBUYWtlbiBjYXJlIG9mLCBhYm92ZQorICAgIC8vaGFsU3RhdHVzID0gY3NyUm9hbUNvbm5lY3QobmV3U2Vzc2lvbiwgYnNzVHlwZSk7CisgICAgLy8gRmluYWwKKyAgICB2b3NTdGF0dXMgPSBjb252ZXJ0VG9Dc3JQcm9maWxlICggCisgICAgICAgICAgICBidGFtcENvbnRleHQsIC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAgICAKKyAgICAgICAgICAgIGJzc1R5cGUsCisgICAgICAgICAgICAmYnRhbXBDb250ZXh0LT5jc3JSb2FtUHJvZmlsZSk7ICAgLyogcmV0dXJuIHRoZSBwcm9maWxlIGluZm8gaGVyZSAqLworICAgIGlmKFZPU19TVEFUVVNfRV9JTlZBTCA9PSB2b3NTdGF0dXMpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGNoYW5uZWwgdG8gY3JlYXRlIEFNUCBsaW5rICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgKnN0YXR1cyA9IFdMQU5CQVBfRVJST1JfTk9fU1VJVEFCTEVfQ0hBTk5FTDsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICB9CisjaWYgMAorICAgIGhhbFN0YXR1cyA9IHNtZV9Sb2FtQ29ubmVjdChWT1NfR0VUX0hBTF9DQihidGFtcENvbnRleHQtPnB2b3NHQ3R4KSwgCisgICAgICAgICAgICAmYnRhbXBDb250ZXh0LT5jc3JSb2FtUHJvZmlsZSwgCisgICAgICAgICAgICBOVUxMLCAgIC8qIHRTY2FuUmVzdWx0SGFuZGxlIGhCc3NMaXN0SW4sICovIAorICAgICAgICAgICAgJmJ0YW1wQ29udGV4dC0+Y3NyUm9hbUlkKTsKKyNlbmRpZiAvLzAKKy8vI2lmIDAKKyAgICBoYWxTdGF0dXMgPSBzbWVfUm9hbUNvbm5lY3QoaEhhbCwgCisgICAgICAgICAgICBidGFtcENvbnRleHQtPnNlc3Npb25JZCwgCisgICAgICAgICAgICAmYnRhbXBDb250ZXh0LT5jc3JSb2FtUHJvZmlsZSwgCisgICAgICAgICAgICAmYnRhbXBDb250ZXh0LT5jc3JSb2FtSWQpOworLy8jZW5kaWYgLy8wCisKKyAgICAvL01hcCB0aGUgaGFsU3RhdHVzIGludG8gYSB2b3NTdGF0dXMKKyAgICByZXR1cm4gdm9zU3RhdHVzOworfSAvL2dvdG9TdGFydGluZworICAgICAgICAgIAorVk9TX1NUQVRVUworZ290b0Nvbm5lY3RpbmcoCisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0IC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLworKQoreworICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgIC8qIE5vIGxvbmdlciBuZWVkZWQuICBUaGlzIGNhbGwgaGFzIGJlZW4gbWFkZSBpbiBnb3RvU3RhcnRpbmcoKS4gKi8KKyAgICAvKiBTaWduYWwgQlQgQ29leGlzdGVuY2UgY29kZSBpbiBmaXJtd2FyZSB0byBwcmVmZXIgV0xBTiAqLworICAgIFdMQU5CQVBfTmVlZEJUQ29leFByaW9yaXR5ICggYnRhbXBDb250ZXh0LCAxKTsKKworICAgIHJldHVybiB2b3NTdGF0dXM7Cit9IC8vZ290b0Nvbm5lY3RpbmcKKyAKK1ZPU19TVEFUVVMKK2dvdG9BdXRoZW50aWNhdGluZygKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQgLyogYnRhbXBDb250ZXh0IHZhbHVlICovCispCit7CisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICAgLyogU2lnbmFsIEJUIENvZXhpc3RlbmNlIGNvZGUgaW4gZmlybXdhcmUgdG8gcHJlZmVyIFdMQU4gKi8KKyAgICBXTEFOQkFQX05lZWRCVENvZXhQcmlvcml0eSAoIGJ0YW1wQ29udGV4dCwgMSk7CisKKyAgICByZXR1cm4gdm9zU3RhdHVzOworfSAvL2dvdG9BdXRoZW50aWNhdGluZworCisjaWYgMAorVk9JRCBpbml0UnNuU3VwcGxpY2FudCgpCit7CisvKiBUaGlzIGlzIGEgTk8tT1AuICBUaGUgU3VwcGxpY2FudCB3YWl0cyBmb3IgTVNHIDEgKi8KK30KKyNlbmRpZiAvKiAwICovCitWT1NfU1RBVFVTCitpbml0UnNuU3VwcGxpY2FudAorKAorICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCwgLyogYnRhbXBDb250ZXh0IHZhbHVlICovICAgIAorICAgIHRXTEFOX0JBUFJvbGUgQkFQRGV2aWNlUm9sZQorKQoreworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICAgLyogVGhpcyBpcyBhIE5PLU9QLiAgVGhlIFN1cHBsaWNhbnQgd2FpdHMgZm9yIE1TRyAxICovCisgICAgLyogSW5pdCBSU04gRlNNICovCisgICAgaWYgKCEoc3VwcFJzbkZzbUNyZWF0ZShidGFtcENvbnRleHQpKSkKKyAgICB7CisgICAgICAgIC8qIFNlbmQgU3RhcnQgRXZlbnQgKi8KKyAgICAgICAgLyogUlNOX0ZTTV9BVVRIX1NUQVJUICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFJTTiBJbml0IEZhaWxlZCAqLworICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisgICAgLyogVGhpcyBpcyBhIE5PLU9QLiAgVGhlIFN1cHBsaWNhbnQgd2FpdHMgZm9yIE1TRyAxICovCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworI2lmIDAKK1ZPSUQgaW5pdFJzbkF1dGhlbnRpY2F0b3IoKQoreworLyogU2lnbmFsIHRoZSBBdXRoZW50aWNhdG9yL1N1cHBsaWNhbnQgQXBwIHRoYXQgd2UgYXJlIGFzc29jaWF0ZWQuICovCisvKiBVc2UgYW4gSU9DVEw/ICBUaGF0IHRoZSBhcHAgaXMgaGFuZ2luZyBhIHJlYWQgb24/IE9yIHVzZSBhICJzcGVjaWFsIiBkYXRhIHBhY2tldC4gQWdhaW4sIHRoYXQgdGhlIGFwcCBpcyB3YWl0aW5nIG9uIGEgcmVjZWl2ZSBmb3IuICovCit9CisjZW5kaWYgLyogMCAqLworVk9TX1NUQVRVUworaW5pdFJzbkF1dGhlbnRpY2F0b3IKKygKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQsIC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAgICAKKyAgICB0V0xBTl9CQVBSb2xlIEJBUERldmljZVJvbGUKKykKK3sKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAvKiBJbml0IFJTTiBGU00gKi8KKyAgICBpZiAoIShhdXRoUnNuRnNtQ3JlYXRlKGJ0YW1wQ29udGV4dCkpKQorICAgIHsKKyAgICAgICAgLyogU2VuZCBTdGFydCBFdmVudCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBSU04gSW5pdCBGYWlsZWQgKi8KKyAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorICAgIHJldHVybiB2b3NTdGF0dXM7CisvKiBTaWduYWwgdGhlIEF1dGhlbnRpY2F0b3IvU3VwcGxpY2FudCBBcHAgdGhhdCB3ZSBhcmUgYXNzb2NpYXRlZC4gKi8KKy8qIFVzZSBhbiBJT0NUTD8gIFRoYXQgdGhlIGFwcCBpcyBoYW5naW5nIGEgcmVhZCBvbj8gT3IgdXNlIGEgInNwZWNpYWwiIGRhdGEgcGFja2V0LiBBZ2FpbiwgdGhhdCB0aGUgYXBwIGlzIHdhaXRpbmcgb24gYSByZWNlaXZlIGZvci4gKi8KK30KKworLyogV2UgaGF2ZSB0byByZWdpc3RlciBvdXIgU1RBIHdpdGggVEwgKi8KK1ZPU19TVEFUVVMKK3JlZ1N0YVdpdGhUbAorKAorICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCwgLyogYnRhbXBDb250ZXh0IHZhbHVlICovICAgIAorICAgIHRXTEFOX0JBUFJvbGUgQkFQRGV2aWNlUm9sZSwKKyAgICB0Q3NyUm9hbUluZm8gKnBDc3JSb2FtSW5mbworKQoreworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgIFdMQU5fU1RBRGVzY1R5cGUgc3RhRGVzYzsKKyAgICB0QU5JX1M4ICAgICAgICAgIHJzc2kgPSAwOworCisgICAgdm9zX21lbV96ZXJvKCZzdGFEZXNjLCBzaXplb2YoV0xBTl9TVEFEZXNjVHlwZSkpOworICAgIC8qIEZpbGwgaW4gZXZlcnl0aGluZyBJIGtub3cgYWJvdXQgdGhlIFNUQSAqLworICAgIGJ0YW1wQ29udGV4dC0+dWNTVEFJZCA9IHN0YURlc2MudWNTVEFJZCA9IHBDc3JSb2FtSW5mby0+c3RhSWQ7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQkFQIHJlZ2lzdGVyIFRMIHVjU1RBSWQ9JWRcbiIsIAorICAgICAgICAgICAgICAgc3RhRGVzYy51Y1NUQUlkICk7CisKKyAgICAvKiBGaWxsIGluIHRoZSBwZWVyIE1BQyBhZGRyZXNzICovCisgICAgdm9zX21lbV9jb3B5KCAKKyAgICAgICAgICAgIHN0YURlc2MudlNUQU1BQ0FkZHJlc3MuYnl0ZXMsIAorICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5wZWVyX21hY19hZGRyLCAKKyAgICAgICAgICAgIHNpemVvZihidGFtcENvbnRleHQtPnBlZXJfbWFjX2FkZHIpKTsgCisKKyAgICAvKiBGaWxsIGluIHRoZSBzZWxmIE1BQyBhZGRyZXNzICovCisgICAgdm9zX21lbV9jb3B5KCAKKyAgICAgICAgICAgIHN0YURlc2MudlNlbGZNQUNBZGRyZXNzLmJ5dGVzLCAKKyAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+c2VsZl9tYWNfYWRkciwgCisgICAgICAgICAgICBzaXplb2YoYnRhbXBDb250ZXh0LT5wZWVyX21hY19hZGRyKSk7IAorCisgICAgLyogU2V0IHRoZSBTVEEgVHlwZSAqLworICAgIHN0YURlc2Mud1NUQVR5cGUgPSBXTEFOX1NUQV9CVF9BTVA7CisKKyAgICAvLyBTZXQgdGhlIFFvUyBmaWVsZCBhcHByb3ByaWF0ZWx5LCBpZiB0aGUgaW5mbyBhdmFpbGFibGUKKyAgICBpZiggcENzclJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlKQorICAgIHsgCisgICAgICAgIGJ0YW1wQ29udGV4dC0+YmFwUW9zQ2ZnLmJXbW1Jc0VuYWJsZWQgPSAvLzE7IAorICAgICAgICAgICAgcENzclJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5xb3NDb25uZWN0aW9uOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBidGFtcENvbnRleHQtPmJhcFFvc0NmZy5iV21tSXNFbmFibGVkID0gMDsgCisgICAgfQorCisgICAgLy8gc2V0IHRoZSBRb1MgZmllbGQgYXBwcm9wcmlhdGVseQorICAgIGlmKCBidGFtcENvbnRleHQtPmJhcFFvc0NmZy5iV21tSXNFbmFibGVkICkKKyAgICB7CisgICAgICAgc3RhRGVzYy51Y1Fvc0VuYWJsZWQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHN0YURlc2MudWNRb3NFbmFibGVkID0gMDsKKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQkFQIHJlZ2lzdGVyIFRMIFFvU19lbmFibGVkPSVkXG4iLCAKKyAgICAgICAgICAgICAgIHN0YURlc2MudWNRb3NFbmFibGVkICk7CisKKyAgICAvLyBVTUEgaXMgcmVhZHkgd2UgaW5mb3JtIFRMIG5vdCB0byBkbyBmcmFtZSAKKyAgICAvLyB0cmFuc2xhdGlvbiBmb3IgV2luTW9iIDYuMQorICAgIC8vKioqIE5vdCB0byBlbmFibGVkIFVNQS4KKyAgICAvKiBFbmFibGUgVU1BIGZvciBUWCB0cmFuc2xhdGlvbiBvbmx5IHdoZW4gdGhlcmUgaXMgbm8gY29uY3VycmVudCBzZXNzaW9uIGFjdGl2ZSAqLworI2lmIGRlZmluZWQgKEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQykKKyAgICBzdGFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IDE7CisjZWxzZQorICAgIGlmICh2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpCisgICAgeworICAgICAgIHN0YURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICBzdGFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IDA7CisgICAgfQorI2VuZGlmCisgICAgc3RhRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24gPSAxOyAKKyAgICBzdGFEZXNjLnVjQWRkUm12TExDID0gMDsKKworICAgIGlmICggYnRhbXBDb250ZXh0LT51Y1NlY0VuYWJsZWQgKQorICAgIHsKKyAgICAgICBzdGFEZXNjLnVjUHJvdGVjdGVkRnJhbWUgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHN0YURlc2MudWNQcm90ZWN0ZWRGcmFtZSA9IDA7CisgICAgfQorCisgICAgc3RhRGVzYy51Y1VjYXN0U2lnID0gcENzclJvYW1JbmZvLT51Y2FzdFNpZzsgCisgICAgc3RhRGVzYy51Y0JjYXN0U2lnID0gcENzclJvYW1JbmZvLT5iY2FzdFNpZzsKKyAgICBzdGFEZXNjLnVjSW5pdFN0YXRlID0gKCBidGFtcENvbnRleHQtPnVjU2VjRW5hYmxlZCk/CisgICAgICAgIFdMQU5UTF9TVEFfQ09OTkVDVEVEOldMQU5UTF9TVEFfQVVUSEVOVElDQVRFRDsKKyAgICBzdGFEZXNjLnVjSXNSZXBsYXlDaGVja1ZhbGlkID0gVk9TX0ZBTFNFOworICAgIGlmKE5VTEwgIT0gcENzclJvYW1JbmZvLT5wQnNzRGVzYykKKyAgICB7CisgICAgICAgIHJzc2kgPSBwQ3NyUm9hbUluZm8tPnBCc3NEZXNjLT5yc3NpOworICAgIH0KKyAgICAvKiByZWdpc3RlciBvdXIgU1RBIHdpdGggVEwgKi8KKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQgCisgICAgICAgICggCisgICAgICAgICBidGFtcENvbnRleHQtPnB2b3NHQ3R4LAorICAgICAgICAgV0xBTkJBUF9TVEFSeENCLCAgCisgICAgICAgICBXTEFOQkFQX1R4Q29tcENCLCAgCisgICAgICAgICAoV0xBTlRMX1NUQUZldGNoUGt0Q0JUeXBlKVdMQU5CQVBfU1RBRmV0Y2hQa3RDQiwKKyAgICAgICAgICZzdGFEZXNjICwKKyAgICAgICAgIHJzc2kpOyAgIAorICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgIiVzOiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQoKSBmYWlsZWQgdG8gcmVnaXN0ZXIuICBTdGF0dXM9ICVkIFsweCUwOGxYXSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZvc1N0YXR1cywgdm9zU3RhdHVzICk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIAorICAgIGlmICggISAgYnRhbXBDb250ZXh0LT51Y1NlY0VuYWJsZWQgKQorICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgICAgICAgICAgICAib3Blbi9zaGFyZWQgYXV0aCBTdGFJZD0gJWQuICBDaGFuZ2luZyBUTCBzdGF0ZSB0byBBVVRIRU5USUNBVEVEIGF0IEpvaW4gdGltZSIsIGJ0YW1wQ29udGV4dC0+dWNTVEFJZCk7CisgICAgCisgICAgICAgLy8gQ29ubmVjdGlvbnMgdGhhdCBkbyBub3QgbmVlZCBVcHBlciBsYXllciBhdXRoLCB0cmFuc2l0aW9uIFRMIGRpcmVjdGx5CisgICAgICAgLy8gdG8gJ0F1dGhlbnRpY2F0ZWQnIHN0YXRlLiAgICAgIAorICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSggYnRhbXBDb250ZXh0LT5wdm9zR0N0eCwgc3RhRGVzYy51Y1NUQUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEICk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZWxzZQorICAgIHsKKworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwKKyAgICAgICAgICAgICAgICAgICJVTEEgYXV0aCBTdGFJZD0gJWQuICBDaGFuZ2luZyBUTCBzdGF0ZSB0byBDT05ORUNURUQgYXQgSm9pbiB0aW1lIiwgYnRhbXBDb250ZXh0LT51Y1NUQUlkICk7CisgICAgICAKKyAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfQ2hhbmdlU1RBU3RhdGUoIGJ0YW1wQ29udGV4dC0+cHZvc0dDdHgsIHN0YURlc2MudWNTVEFJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfU1RBX0NPTk5FQ1RFRCApOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogcmVnU3RhV2l0aFRsICovCisKKyNpZiAwCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT046ICBkZXRlcm1pbmVDaGFuCisKKyAgREVTQ1JJUFRJT046ICBSZXR1cm4gdGhlIGN1cnJlbnQgY2hhbm5lbCB3ZSBhcmUgdG8gb3BlcmF0ZSBvbgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNlbmRpZgorCitWT1NfU1RBVFVTCitkZXRlcm1pbmVDaGFuCisoCisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0LCAvKiBidGFtcENvbnRleHQgdmFsdWUgKi8gICAgCisgICAgdFdMQU5fQkFQUm9sZSBCQVBEZXZpY2VSb2xlLAorICAgIHZfVTMyX3QgKmNoYW5uZWwsICAvKiBDdXJyZW50IGNoYW5uZWwgKi8KKyAgICB2X1U4X3QgKnN0YXR1cyAgICAvKiByZXR1cm4gdGhlIEJULUFNUCBzdGF0dXMgaGVyZSAqLworKQoreworICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB2X1UzMl90ICAgICBhY3RpdmVGbGFnOyAgLyogQ2hhbm5lbCBhY3RpdmUgZmxhZyAqLworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgc3dpdGNoKEJBUERldmljZVJvbGUpCisgICAgeworICAgIGNhc2UgQlRfSU5JVElBVE9SOgorICAgICAgLyogaWYgYW4gSW5mcmEgYXNzb2MgYWxyZWFkeSBleGlzdHMsIHJldHVybiB0aGF0IGNoYW5uZWwuICovCisgICAgICAvKiBvciB1c2UgdGhlIHJlc3VsdHMgZnJvbSB0aGUgU2NhbiB0byBkZXRlcm1pbmUgdGhlIGxlYXN0IGJ1c3kgY2hhbm5lbC4gIEhvdz8gKi8KKyAgICAgIC8qIEZvciBub3csIGp1c3QgZG8gdGhpcy4gKi8KKyAgICAgIHZvc1N0YXR1cyA9IFdMQU5CQVBfR2V0Q3VycmVudENoYW5uZWwgKGJ0YW1wQ29udGV4dCwgY2hhbm5lbCwgJmFjdGl2ZUZsYWcpOworICAgIGJyZWFrOworICAgIGNhc2UgQlRfUkVTUE9OREVSOgorICAgICAgLyogcmV0dXJuIHRoZSB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBQcmVmZXJyZWQgQ2hhbm5lbHMgZmllbGQgb2YgdGhlIEFNUCBBc3NvYyBzdHJ1Y3R1cmUgZnJvbSB0aGUgQlQtQU1QIHBlZXIgKGRldmljZSBBKSAqLworICAgICAgLyogTm8hICBJIGRvbid0IGhhdmUgdGhhdCB5ZXQuICovCisgICAgICAvKiBGb3Igbm93LCBqdXN0IGRvIHRoaXMuICovCisgICAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX0dldEN1cnJlbnRDaGFubmVsIChidGFtcENvbnRleHQsIGNoYW5uZWwsICZhY3RpdmVGbGFnKTsKKyAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKnN0YXR1cyA9IFdMQU5CQVBfRVJST1JfSE9TVF9SRUpfUkVTT1VSQ0VTOyAgICAgLyogcmV0dXJuIHRoZSBCVC1BTVAgc3RhdHVzIGhlcmUgKi8KKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTOworICB9CisgICpzdGF0dXMgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOyAgICAgLyogcmV0dXJuIHRoZSBCVC1BTVAgc3RhdHVzIGhlcmUgKi8KKworICByZXR1cm4gdm9zU3RhdHVzOworfSAvLyBkZXRlcm1pbmVDaGFuCisKK1ZPU19TVEFUVVMKK2dvdG9EaXNjb25uZWN0ZWQgCisoCisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0IC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAgICAKKykKK3sKKyAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICAvL0lzIGl0IGxlZ2l0aW1hdGUgdG8gYWx3YXlzIG1ha2UgdGhpcyBjYWxsPyAgCisgICAgLy9XaGF0IGlmIHBtY1JlcXVlc3RGdWxsUG93ZXIgd2Fzbid0IGNhbGxlZD8KKyAgICAvL1RlbGwgUE1DIHRvIHJlc3VtZSBCTVBTOyAgLyogV2hhdGV2ZXIgdGhlIHByZXZpb3VzIEJNUFMgInN0YXRlIiB3YXMgKi8KKyAgICAvL0NvbW1lbnQgdGhpcyBvdXQgdW50aWwgc3VjaCB0aW1lIGFzIHdlIGhhdmUgUE1DIHN1cHBvcnQKKyAgICAvL2hhbFN0YXR1cyA9IHBtY1Jlc3VtZVBvd2VyICggaEhhbCk7CisKKyAgICAvKiBTaWduYWwgQlQgQ29leGlzdGVuY2UgY29kZSBpbiBmaXJtd2FyZSB0byBubyBsb25nZXIgcHJlZmVyIFdMQU4gKi8KKyAgICBXTEFOQkFQX05lZWRCVENvZXhQcmlvcml0eSAoIGJ0YW1wQ29udGV4dCwgMCk7CisKKyAgICAvL01hcCB0aGUgaGFsU3RhdHVzIGludG8gYSB2b3NTdGF0dXMKKyAgICByZXR1cm4gdm9zU3RhdHVzOworfSAvLyBnb3RvRGlzY29ubmVjdGVkIAorCitWT1NfU1RBVFVTCitnb3RvRGlzY29ubmVjdGluZyAKKygKKyAgICBwdEJ0YW1wQ29udGV4dCAgIGJ0YW1wQ29udGV4dCwgLyogYnRhbXBDb250ZXh0IHZhbHVlICovICAgIAorICAgIHZfVThfdCAgIG5lZWRQaHlzTGlua0NvbXBFdmVudCwKKyAgICB2X1U4X3QgICBwaHlzTGlua1N0YXR1cywgICAvKiBCVC1BTVAgZGlzY29ubmVjdGluZyBzdGF0dXMgKi8KKy8vICAgIHZfVThfdCAgIHN0YXR1c1ByZXNlbnQsICAgIC8qIEJULUFNUCBkaXNjb25uZWN0aW5nIHN0YXR1cyBwcmVzZW50ICovCisgICAgdl9VOF90ICAgZGlzY1JlcXVlc3RlZCwKKyAgICB2X1U4X3QgICBkaXNjUmVhc29uICAgICAgICAvKiBCVC1BTVAgZGlzY29ubmVjdGluZyByZWFzb24gKi8KKykKK3sKKworICAgIC8vIGdOZWVkUGh5c0xpbmtDb21wRXZlbnQKKyAgICBidGFtcENvbnRleHQtPmdOZWVkUGh5c0xpbmtDb21wRXZlbnQgPSBuZWVkUGh5c0xpbmtDb21wRXZlbnQ7CisgICAgLy8gZ1BoeXNMaW5rU3RhdHVzIAorICAgIGJ0YW1wQ29udGV4dC0+Z1BoeXNMaW5rU3RhdHVzID0gcGh5c0xpbmtTdGF0dXM7ICAgLyogQlQtQU1QIGRpc2Nvbm5lY3Rpbmcgc3RhdHVzICovCisgICAgLy8gZ0Rpc2NSZXF1ZXN0ZWQKKyAgICBidGFtcENvbnRleHQtPmdEaXNjUmVxdWVzdGVkID0gZGlzY1JlcXVlc3RlZDsKKyAgICAvLyBnRGlzY1JlYXNvbiAKKyAgICBidGFtcENvbnRleHQtPmdEaXNjUmVhc29uID0gZGlzY1JlYXNvbjsgICAgICAgLyogQlQtQU1QIGRpc2Nvbm5lY3RpbmcgcmVhc29uICovCisKKyAgICAvL1dMQU5CQVBfRGVJbml0TGlua1N1cGVydmlzaW9uKCBidGFtcEhhbmRsZSk7CisgICAgLy9XTEFOQkFQX1N0b3BMaW5rU3VwZXJ2aXNpb25UaW1lcihidGFtcENvbnRleHQpOworCisgICAgLyogSW5mb3JtIHVzZXIgc3BhY2UgdGhhdCBubyBBTVAgY2hhbm5lbCBpcyBpbiB1c2UsIGZvciBBRkggcHVycG9zZXMgKi8KKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAiQ2FsbGluZyBzZW5kX2J0Y19ubGlua19tc2coKSB3aXRoIEFNUCBjaGFubmVsID0gMCIpOworICAgIHNlbmRfYnRjX25saW5rX21zZyhXTEFOX0FNUF9BU1NPQ19ET05FX0lORCwgMCk7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvL2dvdG9EaXNjb25uZWN0aW5nIAorCitWT1NfU1RBVFVTCitnb3RvQ29ubmVjdGVkCisoCisgICAgcHRCdGFtcENvbnRleHQgICBidGFtcENvbnRleHQgLyogYnRhbXBDb250ZXh0IHZhbHVlICovICAgIAorKQoreworICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBwdEJ0YW1wSGFuZGxlICAgICBidGFtcEhhbmRsZSA9ICggcHRCdGFtcEhhbmRsZSlidGFtcENvbnRleHQ7CisvLyNpZiAwCisgICAgLyogU3RvcCB0aGUgQ29ubmVjdGlvbiBBY2NlcHQgVGltZXIgKi8KKyAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX1N0b3BDb25uZWN0aW9uQWNjZXB0VGltZXIgKGJ0YW1wQ29udGV4dCk7CisvLyNlbmRpZgorICAgIC8vLypEZS1pbml0aWFsaXplIHRoZSB0aW1lciAqLworICAgIC8vdm9zU3RhdHVzID0gV0xBTkJBUF9EZWluaXRDb25uZWN0aW9uQWNjZXB0VGltZXIoYnRhbXBDb250ZXh0KTsKKworICAgIC8qIFNpZ25hbCBCVCBDb2V4IGluIGZpcm13YXJlIHRvIG5vdyBob25vciBvbmx5IHByaW9yaXR5IEJUIHJlcXVlc3RzICovCisgICAgV0xBTkJBUF9OZWVkQlRDb2V4UHJpb3JpdHkgKCBidGFtcENvbnRleHQsIDIpOworCisgICAgLy8gSWYgcmVxdWlyZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBVcHBlciBsYXllciBhdXRoLCB0cmFuc2l0aW9uIFRMIAorICAgIC8vIHRvICdBdXRoZW50aWNhdGVkJyBzdGF0ZS4gICAgICAKKyAgICBpZiAoIGJ0YW1wQ29udGV4dC0+dWNTZWNFbmFibGVkICkKKyAgICB7IAorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsIAorICAgICAgICAgICAgICAgICJvcGVuL3NoYXJlZCBhdXRoIFN0YUlkPSAlZC4gIENoYW5naW5nIFRMIHN0YXRlIHRvIEFVVEhFTlRJQ0FURUQgYXQgSm9pbiB0aW1lIiwgYnRhbXBDb250ZXh0LT51Y1NUQUlkKTsKKyAgICAKKyAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0NoYW5nZVNUQVN0YXRlKCAKKyAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPnB2b3NHQ3R4LCAKKyAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPnVjU1RBSWQsIAorICAgICAgICAgICAgICAgIFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCApOworICAgIH0KKworICAgIGJ0YW1wQ29udGV4dC0+ZGF0YVBrdFBlbmRpbmcgPSBWT1NfRkFMU0U7CisgICAgdm9zU3RhdHVzID0gV0xBTkJBUF9Jbml0TGlua1N1cGVydmlzaW9uKCBidGFtcEhhbmRsZSk7CisgCisgICAgLyogSW5mb3JtIHVzZXIgc3BhY2Ugb2YgdGhlIEFNUCBjaGFubmVsIHNlbGVjdGVkLCBmb3IgQUZIIHB1cnBvc2VzICovCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgIkNhbGxpbmcgc2VuZF9idGNfbmxpbmtfbXNnKCkgd2l0aCBBTVAgY2hhbm5lbCAlZCIsIGJ0YW1wQ29udGV4dC0+Y2hhbm5lbCk7CisgICAgc2VuZF9idGNfbmxpbmtfbXNnKFdMQU5fQU1QX0FTU09DX0RPTkVfSU5ELCBidGFtcENvbnRleHQtPmNoYW5uZWwpOworCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30gLy9nb3RvQ29ubmVjdGVkIAorCisKKy8qIHRoZSBIQ0kgRXZlbnQgc2lnbmFsbGluZyByb3V0aW5lKi8KK1ZPU19TVEFUVVMKK3NpZ25hbEhDSVBoeXNMaW5rQ29tcEV2ZW50CisoIAorICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQsIC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAgICAKKyAgdl9VOF90IHN0YXR1cyAgICAvKiB0aGUgQlQtQU1QIHN0YXR1cyAqLworKQoreworICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0QnRhbXBIQ0lfRXZlbnQgYmFwSENJRXZlbnQ7IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICAvKiBGb3JtYXQgdGhlIFBoeXNpY2FsIExpbmsgQ29tcGxldGUgZXZlbnQgdG8gcmV0dXJuLi4uICovIAorICAgIGJhcEhDSUV2ZW50LmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfUEhZU0lDQUxfTElOS19DT01QTEVURV9FVkVOVDsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wUGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5wcmVzZW50ID0gMTsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wUGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPSBzdGF0dXM7CisgICAgYmFwSENJRXZlbnQudS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQucGh5X2xpbmtfaGFuZGxlIAorICAgICAgICA9IGJ0YW1wQ29udGV4dC0+cGh5X2xpbmtfaGFuZGxlOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBQaHlzaWNhbExpbmtDb21wbGV0ZUV2ZW50LmNoX251bWJlciAKKyAgICAgICAgPSBidGFtcENvbnRleHQtPmNoYW5uZWw7CisKKyAgICBpZihXTEFOQkFQX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykKKyAgICB7CisgICAgICAgIC8qIFN0YXJ0IHRoZSBUeCBwYWNrZXQgbW9uaXRvcmluZyB0aW1lciAqLworICAgICAgICBXTEFOQkFQX1N0YXJ0VHhQYWNrZXRNb25pdG9yVGltZXIoYnRhbXBDb250ZXh0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvL3Jlc2V0IHRoZSBQTCBoYW5kbGUKKyAgICAgICAgYnRhbXBDb250ZXh0LT5waHlfbGlua19oYW5kbGUgPSAwOworICAgIH0KKworICAgIHZvc1N0YXR1cyA9ICgqYnRhbXBDb250ZXh0LT5wQmFwSENJRXZlbnRDQikgCisgICAgICAgICggIAorICAgICAgICAgYnRhbXBDb250ZXh0LT5wSGRkSGRsLCAgIC8qIHRoaXMgcmVmZXJzIHRoZSBCU0wgcGVyIGFwcGxpY2F0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgICZiYXBIQ0lFdmVudCwgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgIFZPU19UUlVFIC8qIEZsYWcgdG8gaW5kaWNhdGUgYXNzb2Mtc3BlY2lmaWMgZXZlbnQgKi8gCisgICAgICAgICk7CisgIAorICByZXR1cm4gdm9zU3RhdHVzOworfSAvKiBzaWduYWxIQ0lQaHlzTGlua0NvbXBFdmVudCAqLworCisvKiB0aGUgSENJIERpc2Nvbm5lY3QgQ29tcGxldGUgRXZlbnQgc2lnbmFsbGluZyByb3V0aW5lKi8KK1ZPU19TVEFUVVMKK3NpZ25hbEhDSVBoeXNMaW5rRGlzY0V2ZW50CisoIAorICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQsIC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAgICAKKyAgdl9VOF90IHN0YXR1cywgICAgLyogdGhlIEJULUFNUCBzdGF0dXMgKi8KKyAgdl9VOF90IHJlYXNvbiAgICAvKiB0aGUgQlQtQU1QIHJlYXNvbiBjb2RlICovCispCit7CisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRCdGFtcEhDSV9FdmVudCBiYXBIQ0lFdmVudDsgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICB2X1U4X3QgICAgICAgICAgaTsKKyAgICB0cEJ0YW1wTG9nTGlua0N0eCAgcExvZ0xpbmtDb250ZXh0ID0gTlVMTDsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworI2lmZGVmIEJBUF9ERUJVRworICAvKiBUcmFjZSB0aGUgdEJ0YW1wQ3R4IGJlaW5nIHBhc3NlZCBpbi4gKi8KKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICJXTEFOIEJBUCBDb250ZXh0IE1vbml0b3I6IGJ0YW1wQ29udGV4dCB2YWx1ZSA9ICV4IGluICVzOiVkIiwgYnRhbXBDb250ZXh0LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fICk7CisjZW5kaWYgLy9CQVBfREVCVUcKKworICAgIC8qIExvb3AgZGlzY29ubmVjdGluZyBhbGwgTG9naWNhbCBMaW5rcyBvbiB0aGlzIFBoeXNpY2FsIExpbmsgKi8KKyAgICBmb3IgKGkgPSAwIDsgaSA8IFdMQU5CQVBfTUFYX0xPR19MSU5LUzsgaSsrKQorICAgIHsKKyAgICAgICAgcExvZ0xpbmtDb250ZXh0ID0gJihidGFtcENvbnRleHQtPmJ0YW1wTG9nTGlua0N0eFtpXSk7CisKKyAgICAgICAgaWYgKHBMb2dMaW5rQ29udGV4dC0+cHJlc2VudCA9PSBWT1NfVFJVRSkgCisgICAgICAgIHsgCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAiV0xBTiBCQVA6IERlbGV0aW5nIGxvZ2ljYWwgbGluayBlbnRyeSAlZCBpbiAlcyIsIGksCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7IAorCisgICAgICAgICAgICAvKiBNYXJrIHRoaXMgTG9naWNhbCBMaW5rIGluZGV4IHZhbHVlIGFzIGZyZWUgKi8KKyAgICAgICAgICAgIHBMb2dMaW5rQ29udGV4dC0+cHJlc2VudCA9IFZPU19GQUxTRTsgCisKKyAgICAgICAgICAgIC8vIHNpZ25hbEhDSURpc2NMb2dMaW5rKHN0YXR1cyA9IFNVQ0NFU1MsIHJlYXNvbiA9IENPTk5FQ1RJT05fVEVSTV9CWV9SRU1PVEVfSE9TVCk7CisgICAgICAgICAgICBzaWduYWxIQ0lEaXNjTG9nTGlua0NvbXBFdmVudCAKKyAgICAgICAgICAgICAgICAoIGJ0YW1wQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX1NUQVRVU19TVUNDRVNTLCAKKyAgICAgICAgICAgICAgICAgIGksICAgLy8gbG9naWNhbCBsaW5rIAorICAgICAgICAgICAgICAgICAgLy8gSSBkb24ndCBrbm93IGhvdyB0byBzaWduYWwgQ09OTkVDVElPTl9URVJNX0JZX1JFTU9URV9IT1NUCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKlJlc2V0IGN1cnJlbnRfbG9nX2xpbmtfaW5kZXggYW5kIHRvdGFsX2xvZ19saW5rX2luZGV4IHZhbHVlcyovCisgICAgYnRhbXBDb250ZXh0LT5jdXJyZW50X2xvZ19saW5rX2luZGV4ID0gMDsgCisgICAgYnRhbXBDb250ZXh0LT50b3RhbF9sb2dfbGlua19pbmRleCA9IDA7IAorCisgICAgLyogRm9ybWF0IHRoZSBQaHlzaWNhbCBMaW5rIERpc2Nvbm5lY3QgQ29tcGxldGUgZXZlbnQgdG8gcmV0dXJuLi4uICovIAorICAgIGJhcEhDSUV2ZW50LmJhcEhDSUV2ZW50Q29kZSA9IEJUQU1QX1RMVl9IQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBEaXNjb25uZWN0UGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5wcmVzZW50ID0gMTsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wRGlzY29ubmVjdFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID0gc3RhdHVzOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBEaXNjb25uZWN0UGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5yZWFzb24gPSByZWFzb247Ly91bmNvbW1lbnRlZCB0byBkZWJ1ZworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBEaXNjb25uZWN0UGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5waHlfbGlua19oYW5kbGUgCisgICAgICAgID0gYnRhbXBDb250ZXh0LT5waHlfbGlua19oYW5kbGU7CisKKyAgICAvKiBTdG9wIHRoZSBUeCBwYWNrZXQgbW9uaXRvcmluZyB0aW1lciAqLworICAgIFdMQU5CQVBfU3RvcFR4UGFja2V0TW9uaXRvclRpbWVyKGJ0YW1wQ29udGV4dCk7CisKKyAgICAvKk5lZWQgdG8gY2xlYW4gdXAgdGhlIHBoeSBsaW5rIGhhbmRsZSBhcyB3ZSBhcmUgZGlzY29ubmVjdGVkIGF0IHRoaXMgCisgICAgICBwb2ludAorICAgICAgPz8gLSBkbyB3ZSBuZWVkIHRvIGRvIGFueSBtb3JlIGNsZWFudXAgb24gdGhpcyovCisgICAgYnRhbXBDb250ZXh0LT5waHlfbGlua19oYW5kbGUgPSAwOyAKKyAgICB2b3NTdGF0dXMgPSAoKmJ0YW1wQ29udGV4dC0+cEJhcEhDSUV2ZW50Q0IpIAorICAgICAgICAoICAKKyAgICAgICAgIGJ0YW1wQ29udGV4dC0+cEhkZEhkbCwgICAvKiB0aGlzIHJlZmVycyB0aGUgQlNMIHBlciBhcHBsaWNhdGlvbiBjb250ZXh0ICovCisgICAgICAgICAmYmFwSENJRXZlbnQsIC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICBWT1NfVFJVRSAvKiBGbGFnIHRvIGluZGljYXRlIGFzc29jLXNwZWNpZmljIGV2ZW50ICovIAorICAgICAgICApOworICAKKyAgcmV0dXJuIHZvc1N0YXR1czsKK30gLyogc2lnbmFsSENJUGh5c0xpbmtEaXNjRXZlbnQgKi8KKworLyogdGhlIEhDSSBDaGFubmVsIFNlbGVjdCBFdmVudCBzaWduYWxsaW5nIHJvdXRpbmUqLworVk9TX1NUQVRVUworc2lnbmFsSENJQ2hhblNlbEV2ZW50CisoIAorICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQgLyogYnRhbXBDb250ZXh0IHZhbHVlICovICAgIAorKQoreworICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0QnRhbXBIQ0lfRXZlbnQgYmFwSENJRXZlbnQ7IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICAvKiBGb3JtYXQgdGhlIFBoeXNpY2FsIExpbmsgRGlzY29ubmVjdCBDb21wbGV0ZSBldmVudCB0byByZXR1cm4uLi4gKi8gCisgICAgYmFwSENJRXZlbnQuYmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DSEFOTkVMX1NFTEVDVEVEX0VWRU5UOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBDaGFubmVsU2VsZWN0ZWRFdmVudC5wcmVzZW50ID0gMTsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wQ2hhbm5lbFNlbGVjdGVkRXZlbnQucGh5X2xpbmtfaGFuZGxlIAorICAgICAgICA9IGJ0YW1wQ29udGV4dC0+cGh5X2xpbmtfaGFuZGxlOworIAorICAgIHZvc1N0YXR1cyA9ICgqYnRhbXBDb250ZXh0LT5wQmFwSENJRXZlbnRDQikgCisgICAgICAgICggIAorICAgICAgICAgYnRhbXBDb250ZXh0LT5wSGRkSGRsLCAgIC8qIHRoaXMgcmVmZXJzIHRoZSBCU0wgcGVyIGFwcGxpY2F0aW9uIGNvbnRleHQgKi8KKyAgICAgICAgICZiYXBIQ0lFdmVudCwgLyogVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMgKi8KKyAgICAgICAgIFZPU19UUlVFIC8qIEZsYWcgdG8gaW5kaWNhdGUgYXNzb2Mtc3BlY2lmaWMgZXZlbnQgKi8gCisgICAgICAgICk7CisKKyAgcmV0dXJuIHZvc1N0YXR1czsKK30gLyogc2lnbmFsSENJQ2hhblNlbEV2ZW50ICovCisKKworLyogdGhlIEhDSSBEaXNjb25uZWN0IExvZ2ljYWwgTGluayBDb21wbGV0ZSBFdmVudCBzaWduYWxsaW5nIHJvdXRpbmUqLworVk9TX1NUQVRVUworc2lnbmFsSENJRGlzY0xvZ0xpbmtDb21wRXZlbnQKKyggCisgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCwgLyogYnRhbXBDb250ZXh0IHZhbHVlICovICAgIAorICB2X1U4X3Qgc3RhdHVzLCAgICAvKiB0aGUgQlQtQU1QIHN0YXR1cyAqLworICB2X1UxNl90IGxvZ19saW5rX2hhbmRsZSwgIC8qIFRoZSBMb2dpY2FsIExpbmsgdGhhdCBkaXNjb25uZWN0ZWQqLworICB2X1U4X3QgcmVhc29uICAgIC8qIHRoZSBCVC1BTVAgcmVhc29uIGNvZGUgKi8KKykKK3sKKyAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdEJ0YW1wSENJX0V2ZW50IGJhcEhDSUV2ZW50OyAvKiBUaGlzIG5vdyBlbmNvZGVzIEFMTCBldmVudCB0eXBlcyAqLworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgLyogRm9ybWF0IHRoZSBMb2dpY2FsIExpbmsgRGlzY29ubmVjdCBDb21wbGV0ZSBldmVudCB0byByZXR1cm4uLi4gKi8gCisgICAgYmFwSENJRXZlbnQuYmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DT01QTEVURV9FVkVOVDsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wRGlzY29ubmVjdExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5wcmVzZW50ID0gMTsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wRGlzY29ubmVjdExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPSBzdGF0dXM7CisgICAgYmFwSENJRXZlbnQudS5idGFtcERpc2Nvbm5lY3RMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQucmVhc29uID0gcmVhc29uOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBEaXNjb25uZWN0TG9naWNhbExpbmtDb21wbGV0ZUV2ZW50LmxvZ19saW5rX2hhbmRsZSAKKyAgICA9IChsb2dfbGlua19oYW5kbGUgIDw8IDgpICsgYnRhbXBDb250ZXh0LT5waHlfbGlua19oYW5kbGU7CisKKyAgICB2b3NTdGF0dXMgPSAoKmJ0YW1wQ29udGV4dC0+cEJhcEhDSUV2ZW50Q0IpIAorICAgICAgICAoICAKKyAgICAgICAgIGJ0YW1wQ29udGV4dC0+cEhkZEhkbCwgICAvKiB0aGlzIHJlZmVycyB0aGUgQlNMIHBlciBhcHBsaWNhdGlvbiBjb250ZXh0ICovCisgICAgICAgICAmYmFwSENJRXZlbnQsIC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgICAgICBWT1NfVFJVRSAvKiBGbGFnIHRvIGluZGljYXRlIGFzc29jLXNwZWNpZmljIGV2ZW50ICovIAorICAgICAgICApOworICAKKyAgcmV0dXJuIHZvc1N0YXR1czsKK30gLyogc2lnbmFsSENJRGlzY0xvZ0xpbmtDb21wRXZlbnQgKi8KKworIAorLy8gVGhlc2UgYXJlIG5lZWRlZCB0byByZWNvZ25pemUgUlNOIHN1aXRlIHR5cGVzCisjZGVmaW5lIFdMQU5CQVBfUlNOX09VSV9TSVpFIDQKK3RBTklfVTggcFJTTk91aTAwWyBXTEFOQkFQX1JTTl9PVUlfU0laRSBdID0geyAweDAwLCAweDBGLCAweEFDLCAweDAwIH07IC8vIGdyb3VwIGNpcGhlcgordEFOSV9VOCBwUlNOT3VpMDFbIFdMQU5CQVBfUlNOX09VSV9TSVpFIF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDEgfTsgLy8gV0VQLTQwIG9yIFJTTgordEFOSV9VOCBwUlNOT3VpMDJbIFdMQU5CQVBfUlNOX09VSV9TSVpFIF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDIgfTsgLy8gVEtJUCBvciBSU04tUFNLCit0QU5JX1U4IHBSU05PdWkwM1sgV0xBTkJBUF9SU05fT1VJX1NJWkUgXSA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwMyB9OyAvLyBSZXNlcnZlZAordEFOSV9VOCBwUlNOT3VpMDRbIFdMQU5CQVBfUlNOX09VSV9TSVpFIF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDQgfTsgLy8gQUVTLUNDTVAKK3RBTklfVTggcFJTTk91aTA1WyBXTEFOQkFQX1JTTl9PVUlfU0laRSBdID0geyAweDAwLCAweDBGLCAweEFDLCAweDA1IH07IC8vIFdFUC0xMDQKKworI2RlZmluZSBHRVRfSUVfTEVOX0lOX0JTUyhsZW5JbkJzcykgKCBsZW5JbkJzcyArIHNpemVvZihsZW5JbkJzcykgLSAoKGludCkgT0ZGU0VUX09GKCB0U2lyQnNzRGVzY3JpcHRpb24sIGllRmllbGRzKSkpIAorLyogSW5jb21pbmcgQXNzb2NpYXRpb24gaW5kaWNhdGlvbiB2YWxpZGF0aW9uIHByZWRpY2F0ZSAqLwordl9VMzJfdCAKK3ZhbGlkQXNzb2NJbmQKKyggCisgICAgcHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0LCAvKiBidGFtcENvbnRleHQgdmFsdWUgKi8gICAgCisgICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8KKykKK3sKKyAgICAvKiB0SGFsSGFuZGxlICovICAgIAorICAgIHRIYWxIYW5kbGUgaEhhbCA9IFZPU19HRVRfSEFMX0NCKGJ0YW1wQ29udGV4dC0+cHZvc0dDdHgpOworICAgIHZfVTMyX3QgaWVMZW47IAorICAKKyAgICAvKiBGb3Igbm93LCBhbHdheXMgcmV0dXJuIHRydWUgKi8gCisgICAgcmV0dXJuIFZPU19UUlVFOworCisgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgcGVlciBNQUMgYWRkcmVzcyAqLworICAgIC8qIEZvciBhbiBpbmNvbWluZyBBc3NvYyBJbmRpY2F0aW9uLCB0aGUgcGVlciBNQUMgYWRkcmVzcworICAgICAqIHNob3VsZCBtYXRjaCB0aGUgdmFsdWUgdGhhdCB0aGUgQmx1ZVRvb3RoIEFNUCAKKyAgICAgKiBjb25maWd1cmVkIHVzIHdpdGguCisgICAgICovCisgICAgaWYgKCAhdm9zX21lbV9jb21wYXJlKCBidGFtcENvbnRleHQtPnBlZXJfbWFjX2FkZHIsIAorICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+cGVlck1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnRhbXBDb250ZXh0LT5wZWVyX21hY19hZGRyKSApKQorICAgIHsKKyAgICAgICAgLyogUmV0dXJuIG5vdCB2YWxpZCAqLyAKKyAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBKRVowODExMTU6IEZvciBub3csIGlnbm9yZSB0aGUgUlNOIElFICovIAorICAgIC8qIE90aGVyd2lzZSwgaXQgaXMgdmFsaWQgKi8gCisgICAgcmV0dXJuIFZPU19UUlVFOworCisgICAgLyogQ2hlY2sgZm9yIGEgdHJpdmlhbCBjYXNlOiBJRXMgbWlzc2luZyAqLworICAgIGlmKCBwUm9hbUluZm8tPnByc25JRSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIC8vYnRhbXBDb250ZXh0LT5pZUZpZWxkcyA9IE5VTEw7CisgICAgICAgIC8vYnRhbXBDb250ZXh0LT5pZUxlbiA9IDA7IAorICAgICAgICAgLyogUmV0dXJuIG5vdCB2YWxpZCAqLyAKKyAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKKyAgICB9CisKKyAgIC8vYnRhbXBDb250ZXh0LT5pZUxlbiA9IEdFVF9JRV9MRU5fSU5fQlNTKCBwQnNzRGVzYy0+bGVuZ3RoICk7CisgICAvL2llTGVuID0gR0VUX0lFX0xFTl9JTl9CU1MoIHBCc3NEZXNjLT5sZW5ndGggKTsKKyAgIGllTGVuID0gcFJvYW1JbmZvLT5yc25JRUxlbjsKKyAKKyAgICAvKiBDaGVjayBmb3IgYSB0cml2aWFsIGNhc2U6IElFcyB6ZXJvIGxlbmd0aCAqLworICAgIC8vaWYoIGJ0YW1wQ29udGV4dC0+aWVMZW4gPT0gMCApCisgICAgaWYoIGllTGVuID09IDAgKQorICAgIHsKKyAgICAgICAgLy9idGFtcENvbnRleHQtPmllRmllbGRzID0gTlVMTDsKKyAgICAgICAgLy9idGFtcENvbnRleHQtPmllTGVuID0gMDsgCisgICAgICAgICAvKiBSZXR1cm4gbm90IHZhbGlkICovIAorICAgICAgICByZXR1cm4gVk9TX0ZBTFNFOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gLS0tICBTdGFydCBvZiBibG9jayAtLS0KKyAgICB0RG90MTFmQmVhY29uSUVzIGRvdDExQmVhY29uSUVzOyAKKyAgICB0RG90MTFmSUVTU0lEICpwRG90MTFTU0lEOworICAgIHREb3QxMWZJRVJTTiAgKnBEb3QxMVJTTjsKKyAKKyAgICAvLyBKRVowODEyMTU6IFRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIHVwZGF0ZWQgdG8ganVzdCB2YWxpZGF0ZSB0aGUgUlNOIElFLgorICAgIC8vIFZhbGlkYXRpbmcgdGhlIFNTSUQgY2FuIGJlIGRvbmUgZGlyZWN0bHkgZnJvbS4uLgorIAorICAgIC8vICJVbnBhY2siIHJlYWxseSB3YW50cyB0cEFuaVNpckdsb2JhbCAocE1hYykgYXMgaXRzIGZpcnN0IHBhcmFtLgorICAgIC8vIEJ1dCBzaW5jZSBpdCBpc24ndCB1c2VkLCBJIGp1c3QgcGFzcyBpbiBzb21lIGFyYml0cmFyeSAiY29udGV4dCIgcG9pbnRlci4KKyAgICAvLyBTbyBoSGFsSGFuZGxlIHdpbGwgbWFrZSBpdCBoYXBweS4KKyAgICBkb3QxMWZVbnBhY2tCZWFjb25JRXMoKHRwQW5pU2lyR2xvYmFsKSBoSGFsLCAKKyAgICAgICAgICAgICh0QU5JX1U4ICopIHBSb2FtSW5mby0+cHJzbklFLAorICAgICAgICAgICAgaWVMZW4sIAorICAgICAgICAgICAgJmRvdDExQmVhY29uSUVzKTsKKworICAgIC8vRFVNUExPRyg5LCAgX19GVU5DVElPTl9fLCAiZG90MTFCZWFjb25JRXMiLCAmZG90MTFCZWFjb25JRXMsIDY0KTsKKworICAgIHBEb3QxMVNTSUQgPSAmZG90MTFCZWFjb25JRXMuU1NJRDsgCisKKyAgICAvLyBBc3N1bWUgdGhlcmUgd2Fzbid0IGFuIFNTSUQgaW4gdGhlIEFzc29jIFJlcXVlc3QKKyAgICBidGFtcENvbnRleHQtPmFzc29jU3NpZExlbiA9IDA7CisKKyAgICAgICAgaWYgKHBEb3QxMVNTSUQtPnByZXNlbnQgKQorICAgICAgICB7CisKKyAgICAgICAgLy9EVU1QTE9HKDEwLCAgX19GVU5DVElPTl9fLCAicERvdDExU1NJRCBwcmVzZW50IiwgcERvdDExU1NJRCwgNjQpOworCisgICAgICAgIGJ0YW1wQ29udGV4dC0+YXNzb2NTc2lkTGVuID0gcERvdDExU1NJRC0+bnVtX3NzaWQ7ICAKKyAgICAgICAgdm9zX21lbV9jb3B5KGJ0YW1wQ29udGV4dC0+YXNzb2NTc2lkLCAKKyAgICAgICAgICAgICAgICBwRG90MTFTU0lELT5zc2lkLCAKKyAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPmFzc29jU3NpZExlbiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKKworICAgIC8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgU1NJRCBhZ2FpbnN0IG91ciBTU0lEIHZhbHVlCisgICAgaWYgKCAhdm9zX21lbV9jb21wYXJlKCBidGFtcENvbnRleHQtPm93blNzaWQsIAorICAgICAgICAgICAgICAgIHBEb3QxMVNTSUQtPnNzaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+b3duU3NpZExlbiApKQorICAgICAgICB7CisgICAgICAgIC8qIFJldHVybiBub3QgdmFsaWQgKi8gCisgICAgICAgIHJldHVybiBWT1NfRkFMU0U7CisgICAgfQorCisgICAgcERvdDExUlNOID0gJmRvdDExQmVhY29uSUVzLlJTTjsgCisKKyAgICAvLyBBc3N1bWUgdGhlcmUgd2Fzbid0IGFuIFJTTiBJRSBpbiB0aGUgQXNzb2MgUmVxdWVzdAorICAgIC8vYnRhbXBDb250ZXh0LT5hc3NvY1JzbkllTGVuID0gMDsKKworICAgICAgICBpZiAocERvdDExUlNOLT5wcmVzZW50ICkKKyAgICAgICAgeworCisgICAgICAgIC8vRFVNUExPRygxMCwgIF9fRlVOQ1RJT05fXywgInBEb3QxMVJTTiBwcmVzZW50IiwgcERvdDExUlNOLCA2NCk7CisKKyAgICAgICAgLy9UaGUgODAyLjExIEJULUFNUCBQQUwgb25seSBzdXBwb3J0cyBXUEEyLVBTSyAgCisgICAgICAgIGlmICghdm9zX21lbV9jb21wYXJlKHBSU05PdWkwMiwgLy8gIFJTTi1QU0sKKyAgICAgICAgICAgICAgICBwRG90MTFSU04tPmFrbV9zdWl0ZXNbMF0sIAorICAgICAgICAgICAgICAgIFdMQU5CQVBfUlNOX09VSV9TSVpFKSkgCisgICAgICAgICAgICByZXR1cm4gVk9TX0ZBTFNFOworCisgICAgICAgIC8vVGhlIDgwMi4xMSBCVC1BTVAgUEFMIG9ubHkgc3VwcG9ydHMgQUVTLUNDTVAgVW5pY2FzdCAgCisgICAgICAgIGlmICghdm9zX21lbV9jb21wYXJlKHBSU05PdWkwNCwgLy8gQUVTLUNDTVAKKyAgICAgICAgICAgICAgICBwRG90MTFSU04tPnB3aXNlX2NpcGhlcl9zdWl0ZXNbMF0sIAorICAgICAgICAgICAgICAgIFdMQU5CQVBfUlNOX09VSV9TSVpFKSkgCisgICAgICAgICAgICByZXR1cm4gVk9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKKworCisgICAgfSAvLyAtLS0gRW5kIG9mIGJsb2NrIC0tLQorCisgICAgLyogT3RoZXJ3aXNlLCBpdCBpcyB2YWxpZCAqLyAKKyAgICByZXR1cm4gVk9TX1RSVUU7Cit9IC8qIHZhbGlkQXNzb2NJbmQgKi8KKworLyogdGhlIGNoYW5nZSBzdGF0ZSBmdW5jdGlvbiovCit2b2lkIAorYnRhbXBmc21DaGFuZ2VUb1N0YXRlCisoCisgICAgQlRBTVBGU01fSU5TVEFOQ0VEQVRBX1QgKmluc3RhbmNlLCAKKyAgICBCVEFNUEZTTV9TVEFURVNfVCBzdGF0ZQorKQoreworICAgIGluc3RhbmNlLT5zdGF0ZVZhciA9IHN0YXRlOworICAgIC8vQlRBTVBGU01fRU5UUllfRkxBR19UIGRpc2Nvbm5lY3RlZEVudHJ5OworICAKK30KKworLyogUGh5c2ljYWwgTGluayBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uICovCisvL2ludCAKK1ZPU19TVEFUVVMKK2J0YW1wRnNtCisoCisgICAgLy9CVEFNUEZTTV9JTlNUQU5DRURBVEFfVCAqaW5zdGFuY2VWYXIKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQsIC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLyAgICAKKy8vICAgIHRCdGFtcFNlc3NDdHggKnRwQnRhbXBTZXNzQ3R4LCAgLyogYnRhbXBDb250ZXh0IHZhbHVlICovCisgICAgcHRXTEFOX0JBUEV2ZW50IGJhcEV2ZW50LCAvKiBTdGF0ZSBtYWNoaW5lIGV2ZW50ICovCisgICAgdl9VOF90ICpzdGF0dXMgICAgLyogcmV0dXJuIHRoZSBCVC1BTVAgc3RhdHVzIGhlcmUgKi8KKykKK3sKKyAgICAvKiBSZXRyaWV2ZSB0aGUgcGh5IGxpbmsgc3RhdGUgbWFjaGluZSBzdHJ1Y3R1cmUgCisgICAgICogZnJvbSB0aGUgYnRhbXBDb250ZXh0IHZhbHVlIAorICAgICAqLyAgICAKKyAgICBCVEFNUEZTTV9JTlNUQU5DRURBVEFfVCAqaW5zdGFuY2VWYXI7CisgICAgdl9VMzJfdCBtc2cgPSBiYXBFdmVudC0+ZXZlbnQ7ICAvKiBTdGF0ZSBtYWNoaW5lIGlucHV0IGV2ZW50IG1lc3NhZ2UgKi8KKyAgICB2X1UzMl90IGNoYW5uZWw7ICAvKiBDdXJyZW50IGNoYW5uZWwgKi8KKyAgICB2X1UzMl90IGFjdGl2ZUZsYWc7ICAvKiBDaGFubmVsIGFjdGl2ZSBmbGFnICovCisgICAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBwdEJ0YW1wSGFuZGxlIGJ0YW1wSGFuZGxlID0gKCBwdEJ0YW1wSGFuZGxlKWJ0YW1wQ29udGV4dDsKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNTVEFJZDsgIC8qIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpICovCisgICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgIHBIZGRIZGw7IC8qIEhhbmRsZSB0byByZXR1cm4gQlNMIGNvbnRleHQgaW4gKi8KKyAgICB0SGFsSGFuZGxlICAgICBoSGFsID0gTlVMTDsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKyAgICAvKiBWYWxpZGF0ZSBwYXJhbXMgKi8gCisgICAgaWYgKGJ0YW1wSGFuZGxlID09IE5VTEwpIAorICAgIHsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgIGluc3RhbmNlVmFyID0gJihidGFtcENvbnRleHQtPmJhcFBoeXNMaW5rTWFjaGluZSk7CisKKyAgICBoSGFsID0gVk9TX0dFVF9IQUxfQ0IoYnRhbXBDb250ZXh0LT5wdm9zR0N0eCk7CisgICAgaWYgKE5VTEwgPT0gaEhhbCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiaEhhbCBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworCisgCisjZGVmaW5lIENIQU5ORUxfTk9UX1NFTEVDVEVEIChXTEFOQkFQX0dldEN1cnJlbnRDaGFubmVsIChidGFtcENvbnRleHQsICZjaGFubmVsLCAmYWN0aXZlRmxhZykgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorCisgIC8qSW5pdGlhbGl6ZSBCVEFNUCBQQUwgc3RhdHVzIGNvZGUgYmVpbmcgcmV0dXJuZWQgdG8gdGhlIGJ0YW1wRnNtIGNhbGxlciAqLworICAqc3RhdHVzID0gV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUzsKKworICAgIHN3aXRjaChpbnN0YW5jZVZhci0+c3RhdGVWYXIpCisgICAgeworCisgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKKyAgICAgICAgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX0hDSV9QSFlTSUNBTF9MSU5LX0NSRUFURSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBESVNDT05ORUNURUQgdG8gUzEgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJESVNDT05ORUNURUQiLCAiUzEiKTsKKyAKKyNpZiAwCisgICAgICAgICAvKiBUaGlzIHdpbGwgaGF2ZSBpc3N1ZXMgaW4gbXVsdGlzZXNzaW9uLiBOZWVkIG5vdCBjbG9zZSB0aGUgc2Vzc2lvbiAqLworICAgICAgICAgLyogVE9ETyA6IE5lZWQgdG8gaGF2ZSBiZXR0ZXIgaGFuZGxpbmcgKi8gCisgICAgICAgICAgaWYoYnRhbXBDb250ZXh0LT5pc0JhcFNlc3Npb25PcGVuID09IFRSVUUpLy9XZSB3YW50IHRvIGNsb3NlIG9ubHkgQlQtQU1QIFNlc3Npb24KKyAgICAgICAgICB7CisgICAgICAgICAgc21lX0Nsb3NlU2Vzc2lvbihWT1NfR0VUX0hBTF9DQihidGFtcENvbnRleHQtPnB2b3NHQ3R4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQpOworICAgICAgICAgIC8qQWRkZWQgYnkgTHVpemE6Ki8KKyAgICAgICAgICBidGFtcENvbnRleHQtPmlzQmFwU2Vzc2lvbk9wZW4gPSBGQUxTRTsgCisgICAgICAgICAgfSAgIAorI2VuZGlmCisKKyAgICAgICAgICAvKiBTZXQgQkFQIGRldmljZSByb2xlICovCisgICAgICAgICAgdm9zU3RhdHVzID0gZ290b1MxKCBidGFtcENvbnRleHQsIGJhcEV2ZW50LCBCVF9JTklUSUFUT1IsIHN0YXR1cyk7IAorICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgY21kIHN0YXR1cyBpcyAlZCIsIF9fRlVOQ1RJT05fXywgKnN0YXR1cyk7CisgICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixTMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfSENJX1BIWVNJQ0FMX0xJTktfQUNDRVBUKSkKKyAgICAgICAgeworICAgICAgICAgIC8qVHJhbnNpdGlvbiBmcm9tIERJU0NPTk5FQ1RFRCB0byBTMSAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsIF9fRlVOQ1RJT05fXywgIkRJU0NPTk5FQ1RFRCIsICJTMSIpOworICAgICAgICAgIAorI2lmIDAKKyAgICAgICAgICBpZihidGFtcENvbnRleHQtPmlzQmFwU2Vzc2lvbk9wZW4gPT0gVFJVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgc21lX0Nsb3NlU2Vzc2lvbihWT1NfR0VUX0hBTF9DQihidGFtcENvbnRleHQtPnB2b3NHQ3R4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQpOworICAgICAgICAgIC8qQWRkZWQgYnkgTHVpemE6Ki8KKyAgICAgICAgICBidGFtcENvbnRleHQtPmlzQmFwU2Vzc2lvbk9wZW4gPSBGQUxTRTsgCisgICAgICAgICAgfQorICAgICAgICAgIC8qQWN0aW9uIGNvZGUgZm9yIHRyYW5zaXRpb24gKi8KKyNlbmRpZgorCisgICAgICAgICAgLyogU2V0IEJBUCBkZXZpY2Ugcm9sZSAqLworICAgICAgICAgIHZvc1N0YXR1cyA9IGdvdG9TMShidGFtcENvbnRleHQsIGJhcEV2ZW50LCBCVF9SRVNQT05ERVIsIHN0YXR1cyk7CisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLFMxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGluIHN0YXRlICVzLCBpbnZhbGlkIGV2ZW50IG1zZyAlZCIsIF9fRlVOQ1RJT05fXywgIkRJU0NPTk5FQ1RFRCIsIG1zZyk7CisgICAgICAgICAgLyogSW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rICovCisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFMxOgorICAgICAgICBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0MKKyAgICAgICAgICAgKSAmJiAoYnRhbXBDb250ZXh0LT5CQVBEZXZpY2VSb2xlID09IEJUX0lOSVRJQVRPUiAmJiAhKENIQU5ORUxfTk9UX1NFTEVDVEVEKSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBTMSB0byBTVEFSVElORyAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsIF9fRlVOQ1RJT05fXywgIlMxIiwgIlNUQVJUSU5HIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgdm9zU3RhdHVzID0gZGV0ZXJtaW5lQ2hhbihidGFtcENvbnRleHQsIEJUX0lOSVRJQVRPUiwgJmNoYW5uZWwsIHN0YXR1cyk7CisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLFNUQVJUSU5HKTsKKyAgICAgICAgICAvLyBUaGlzIGhhcyB0byBiZSBjb21tZW50ZWQgb3V0IHVudGlsIEkgZ2V0IHRoZSBCVC1BTVAgU01FL0NTUiBjaGFuZ2VzIAorICAgICAgICAgIHZvc1N0YXR1cyA9IGdvdG9TdGFydGluZyggYnRhbXBDb250ZXh0LCBiYXBFdmVudCwgZUNTUl9CU1NfVFlQRV9XRFNfQVAsIHN0YXR1cyk7IAorICAgICAgICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLCBTMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX1RJTUVSX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gUzEgdG8gRElTQ09OTkVDVEVEIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiUzEiLCAiRElTQ09OTkVDVEVEIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgLyogU2V0IGV2ZXJ5dGhpbmcgYmFjayBhcyBkaXMtY29ubmVjdGVkICovICAgIAorICAgICAgICAgIGdvdG9EaXNjb25uZWN0ZWQoIGJ0YW1wQ29udGV4dCk7IAorICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNURUQpOworICAgICAgICAgIC8qU2lnbmFsIHRoZSBkaXNjb25uZWN0ICovCisgICAgICAgICAgc2lnbmFsSENJUGh5c0xpbmtDb21wRXZlbnQoIGJ0YW1wQ29udGV4dCwgV0xBTkJBUF9FUlJPUl9IT1NUX1RJTUVPVVQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX0hDSV9QSFlTSUNBTF9MSU5LX0RJU0NPTk5FQ1QpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gUzEgdG8gRElTQ09OTkVDVEVEIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiUzEiLCAiRElTQ09OTkVDVEVEIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RlZChidGFtcENvbnRleHQpOworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNURUQpOworICAgICAgICAgIC8qU2lnbmFsIHRoZSBzdWNjZXNzZnVsIHBoeXNpY2FsIGxpbmsgZGlzY29ubmVjdCAqLworICAgICAgICAgIHNpZ25hbEhDSVBoeXNMaW5rRGlzY0V2ZW50IAorICAgICAgICAgICAgICAoIGJ0YW1wQ29udGV4dCwgCisgICAgICAgICAgICAgICAgV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVCk7CisgICAgICAgICAgLypTaWduYWwgdGhlIHVuc3VjY2Vzc2Z1bCBwaHlzaWNhbCBsaW5rIGNyZWF0aW9uICovCisgICAgICAgICAgc2lnbmFsSENJUGh5c0xpbmtDb21wRXZlbnQoIGJ0YW1wQ29udGV4dCwgV0xBTkJBUF9FUlJPUl9OT19DTkNUICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0MKKyAgICAgICAgICAgICAgICApICYmIChidGFtcENvbnRleHQtPkJBUERldmljZVJvbGUgPT0gQlRfUkVTUE9OREVSKSkKKyAgICAgICAgeworICAgICAgICAgIC8qVHJhbnNpdGlvbiBmcm9tIFMxIHRvIFNUQVJUSU5HIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiUzEiLCAiU1RBUlRJTkciKTsKKworICAgICAgICAgIC8qQWN0aW9uIGNvZGUgZm9yIHRyYW5zaXRpb24gKi8KKyAgICAgICAgICAvL2RldGVybWluZUNoYW4oQlRfUkVTUE9OREVSKTsKKyAgICAgICAgICB2b3NTdGF0dXMgPSBkZXRlcm1pbmVDaGFuKGJ0YW1wQ29udGV4dCwgQlRfUkVTUE9OREVSLCAmY2hhbm5lbCwgc3RhdHVzKTsKKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsU1RBUlRJTkcpOy8vTW92ZWQgdG8gaGVyZSB0byBkZWJ1ZworICAgICAgICAgIC8vIFRoaXMgaGFzIHRvIGJlIGNvbW1lbnRlZCBvdXQgdW50aWwgSSBnZXQgdGhlIEJULUFNUCBTTUUvQ1NSIGNoYW5nZXMgCisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAvLyBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsU1RBUlRJTkcpOworICAgICAgICAgIHZvc1N0YXR1cyA9IGdvdG9TdGFydGluZyggYnRhbXBDb250ZXh0LCBiYXBFdmVudCwgZUNTUl9CU1NfVFlQRV9XRFNfU1RBLCBzdGF0dXMpOyAKKyAgICAgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhciwgUzEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9IQ0lfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQworICAgICAgICAgICAgICAgICkgJiYgKGJ0YW1wQ29udGV4dC0+QkFQRGV2aWNlUm9sZSA9PSBCVF9JTklUSUFUT1IgJiYgQ0hBTk5FTF9OT1RfU0VMRUNURUQpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gUzEgdG8gU0NBTk5JTkcgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJTMSIsICJTQ0FOTklORyIpOworCisgICAgICAgICAgLypBY3Rpb24gY29kZSBmb3IgdHJhbnNpdGlvbiAqLworICAgICAgICAgIGdvdG9TY2FubmluZyhidGFtcENvbnRleHQsIEJUX1JFU1BPTkRFUiwgc3RhdHVzKTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsU0NBTk5JTkcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgaW4gc3RhdGUgJXMsIGludmFsaWQgZXZlbnQgbXNnICVkIiwgX19GVU5DVElPTl9fLCAiUzEiLCBtc2cpOworICAgICAgICAgIC8qIEludGVudGlvbmFsbHkgbGVmdCBibGFuayAqLworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBTVEFSVElORzoKKyAgICAgICAgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX01BQ19TVEFSVF9CU1NfU1VDQ0VTUworICAgICAgICAgICApICYmIChidGFtcENvbnRleHQtPkJBUERldmljZVJvbGUgPT0gQlRfSU5JVElBVE9SKSkKKyAgICAgICAgeworICAgICAgICAgIC8qVHJhbnNpdGlvbiBmcm9tIFNUQVJUSU5HIHRvIENPTk5FQ1RJTkcgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJTVEFSVElORyIsICJDT05ORUNUSU5HIik7CisKKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsQ09OTkVDVElORyk7Ly9Nb3ZlZCB0byBkZWJ1ZworCisgICAgICAgICAgLypTZXQgdGhlIHNlbGVjdGVkIGNoYW5uZWwgKi8KKyAgLypzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgc2V0ICovCisgICAgICAgICAgYnRhbXBDb250ZXh0LT5jaGFubmVsID0gKCAwID09IGJ0YW1wQ29udGV4dC0+Y2hhbm5lbCApPzE6YnRhbXBDb250ZXh0LT5jaGFubmVsOworCisgICAgICAgICAgLypBY3Rpb24gY29kZSBmb3IgdHJhbnNpdGlvbiAqLworICAgICAgICAgIHNpZ25hbEhDSUNoYW5TZWxFdmVudChidGFtcENvbnRleHQpOworICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9IQ0lfUEhZU0lDQUxfTElOS19ESVNDT05ORUNUKSkKKyAgICAgICAgeworICAgICAgICAgIC8qVHJhbnNpdGlvbiBmcm9tIFNUQVJUSU5HIHRvIERJU0NPTk5FQ1RJTkcgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJTVEFSVElORyIsICJESVNDT05ORUNUSU5HIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgLy9jc3JSb2FtRGlzY29ubmVjdCgpOworICAgICAgICAgIHNtZV9Sb2FtRGlzY29ubmVjdChoSGFsLCAKKyAgICAgICAgICAgICAgICAgIC8vSkVaMDgxMTE1OiBGaXhtZSAKKyAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+c2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgIC8vIERhbmxpbiwgd2hlcmUgYXJlIHRoZSByaWNoZXIgcmVhc29uIGNvZGVzPworICAgICAgICAgICAgICAgICAgLy8gSSB3YW50IHRvIGJlIGFibGUgdG8gY29udmV5IGV2ZXJ5dGhpbmcgODAyLjExIHN1cHBvcnRzLi4uCisgICAgICAgICAgICAgICAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKKworICAgICAgICAgIGdvdG9EaXNjb25uZWN0aW5nKAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgVk9TX1RSVUUsIAorICAgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9OT19DTkNULCAKKyAgICAgICAgICAgICAgICAgIC8vVk9TX1RSVUUsICAgLy8gU2hvdWxkIGJlIFZPU19GQUxTRSAhISEgCisgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsIAorICAgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9URVJNX0JZX0xPQ0FMX0hPU1QpOworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNUSU5HKTsKKyAgICAgICAgICAvLyBJdCBpcyBOT1QgY2xlYXIgdGhhdCB3ZSBuZWVkIHRvIHNlbmQgdGhlIFBoeSBMaW5rIERpc2Nvbm5lY3QKKyAgICAgICAgICAvLyBDb21wbGV0ZSBFdmVudCBoZXJlLgorICAgICAgICAgIHNpZ25hbEhDSVBoeXNMaW5rRGlzY0V2ZW50IAorICAgICAgICAgICAgICAoIGJ0YW1wQ29udGV4dCwgCisgICAgICAgICAgICAgICAgV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfQ0hBTk5FTF9TRUxFQ1RJT05fRkFJTEVEKSkKKyAgICAgICAgeworICAgICAgICAgIC8qVHJhbnNpdGlvbiBmcm9tIFNUQVJUSU5HIHRvIERJU0NPTk5FQ1RFRCAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsIF9fRlVOQ1RJT05fXywgIlNUQVJUSU5HIiwgIkRJU0NPTk5FQ1RFRCIpOworCisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RlZChidGFtcENvbnRleHQpOworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNURUQpOworICAgICAgICAgIC8qQWN0aW9uIGNvZGUgZm9yIHRyYW5zaXRpb24gKi8KKyAgICAgICAgICBzaWduYWxIQ0lQaHlzTGlua0NvbXBFdmVudCggYnRhbXBDb250ZXh0LCBXTEFOQkFQX0VSUk9SX0hPU1RfUkVKX1JFU09VUkNFUyApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX01BQ19TVEFSVF9CU1NfU1VDQ0VTUworICAgICAgICAgICAgICAgICkgJiYgKGJ0YW1wQ29udGV4dC0+QkFQRGV2aWNlUm9sZSA9PSBCVF9SRVNQT05ERVIpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gU1RBUlRJTkcgdG8gQ09OTkVDVElORyAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsIF9fRlVOQ1RJT05fXywgIlNUQVJUSU5HIiwgIkNPTk5FQ1RJTkciKTsKKworICAgICAgICAgIC8qIFNldCB0aGUgc2VsZWN0ZWQgY2hhbm5lbCAqLworICAgICAgICAgIC8qc2hvdWxkIGhhdmUgYmVlbiBhbHJlYWR5IHNldCAqLworICAgICAgICAgIGJ0YW1wQ29udGV4dC0+Y2hhbm5lbCA9ICggMCA9PSBidGFtcENvbnRleHQtPmNoYW5uZWwgKT8xOmJ0YW1wQ29udGV4dC0+Y2hhbm5lbDsKKworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixDT05ORUNUSU5HKTsKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgICBnb3RvQ29ubmVjdGluZyhidGFtcENvbnRleHQpOworICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX1RJTUVSX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gU1RBUlRJTkcgdG8gRElTQ09OTkVDVElORyAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsIF9fRlVOQ1RJT05fXywgIlNUQVJUSU5HIiwgIkRJU0NPTk5FQ1RJTkciKTsKKworICAgICAgICAgIC8qQWN0aW9uIGNvZGUgZm9yIHRyYW5zaXRpb24gKi8KKyAgICAgICAgICAvL2NzclJvYW1EaXNjb25uZWN0KCk7CisgICAgICAgICAgc21lX1JvYW1EaXNjb25uZWN0KGhIYWwsIAorICAgICAgICAgICAgICAgICAgLy9KRVowODExMTU6IEZpeG1lIAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RpbmcoCisgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQsIAorICAgICAgICAgICAgICAgICAgVk9TX1RSVUUsCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0hPU1RfVElNRU9VVCwgCisgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsCisgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsRElTQ09OTkVDVElORyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfTUFDX1NUQVJUX0ZBSUxTKSkKKyAgICAgICAgeworICAgICAgICAgIC8qVHJhbnNpdGlvbiBmcm9tIFNUQVJUSU5HIHRvIERJU0NPTk5FQ1RFRCAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsIF9fRlVOQ1RJT05fXywgIlNUQVJUSU5HIiwgIkRJU0NPTk5FQ1RFRCIpOworCisgICAgICAgICAgLypBY3Rpb24gY29kZSBmb3IgdHJhbnNpdGlvbiAqLworICAgICAgICAgIGdvdG9EaXNjb25uZWN0ZWQoYnRhbXBDb250ZXh0KTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICBzaWduYWxIQ0lQaHlzTGlua0NvbXBFdmVudCggYnRhbXBDb250ZXh0LCBXTEFOQkFQX0VSUk9SX01BWF9OVU1fQ05DVFMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGluIHN0YXRlICVzLCBpbnZhbGlkIGV2ZW50IG1zZyAlZCIsIF9fRlVOQ1RJT05fXywgIlNUQVJUSU5HIiwgbXNnKTsKKyAgICAgICAgICAvKiBJbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsgKi8KKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ09OTkVDVElORzoKKyAgICAgICAgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX01BQ19DT05ORUNUX0NPTVBMRVRFRAorICAgICAgICAgICApICYmIChidGFtcENvbnRleHQtPkJBUERldmljZVJvbGUgPT0gQlRfUkVTUE9OREVSKSkKKyAgICAgICAgeworICAgICAgICAgIC8qVHJhbnNpdGlvbiBmcm9tIENPTk5FQ1RJTkcgdG8gQVVUSEVOVElDQVRJTkcgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJDT05ORUNUSU5HIiwgIkFVVEhFTlRJQ0FUSU5HIik7CisgICAgICAgICAgLy9WT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJDT05ORUNUSU5HIiwgIkNPTk5FQ1RFRCIpOworCisgICAgICAgICAgICBnb3RvQXV0aGVudGljYXRpbmcoYnRhbXBDb250ZXh0KTsKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgaW5pdFJzblN1cHBsaWNhbnQoYnRhbXBDb250ZXh0LCBCVF9SRVNQT05ERVIpOworI2lmIDEKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsQVVUSEVOVElDQVRJTkcpOworI2Vsc2UKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgc2lnbmFsSENJUGh5c0xpbmtDb21wRXZlbnQoYnRhbXBDb250ZXh0LCBXTEFOQkFQX1NUQVRVU19TVUNDRVNTKTsKKyAgICAgICAgICBnb3RvQ29ubmVjdGVkKGJ0YW1wQ29udGV4dCk7CisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLENPTk5FQ1RFRCk7CisjZW5kaWYKKyAgICAgICAgICAvKiByZWdpc3RlciBvdXIgU1RBIHdpdGggVEwgKi8KKyAgICAgICAgICByZWdTdGFXaXRoVGwgKCAKKyAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dCwgLyogYnRhbXBDb250ZXh0IHZhbHVlICovIAorICAgICAgICAgICAgICAgICAgQlRfUkVTUE9OREVSLCAKKyAgICAgICAgICAgICAgICAgICh0Q3NyUm9hbUluZm8gKiliYXBFdmVudC0+cGFyYW1zKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX0hDSV9QSFlTSUNBTF9MSU5LX0RJU0NPTk5FQ1QpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gQ09OTkVDVElORyB0byBESVNDT05ORUNUSU5HIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiQ09OTkVDVElORyIsICJESVNDT05ORUNUSU5HIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgLy9jc3JSb2FtRGlzY29ubmVjdCgpOworICAgICAgICAgIHNtZV9Sb2FtRGlzY29ubmVjdChoSGFsLCAKKyAgICAgICAgICAgICAgICAgIC8vSkVaMDgxMTE1OiBGaXhtZSAKKyAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+c2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworICAgICAgICAgIGdvdG9EaXNjb25uZWN0aW5nKAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgVk9TX1RSVUUsIAorICAgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9OT19DTkNULCAKKyAgICAgICAgICAgICAgICAgIC8vVk9TX1RSVUUsICAgLy8gU2hvdWxkIGJlIFZPU19GQUxTRSAhISEgCisgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsIAorICAgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9URVJNX0JZX0xPQ0FMX0hPU1QpOworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNUSU5HKTsKKyAgICAgICAgICAvLyBJdCBpcyBOT1QgY2xlYXIgdGhhdCB3ZSBuZWVkIHRvIHNlbmQgdGhlIFBoeSBMaW5rIERpc2Nvbm5lY3QKKyAgICAgICAgICAvLyBDb21wbGV0ZSBFdmVudCBoZXJlLgorICAgICAgICAgIHNpZ25hbEhDSVBoeXNMaW5rRGlzY0V2ZW50IAorICAgICAgICAgICAgICAoIGJ0YW1wQ29udGV4dCwgCisgICAgICAgICAgICAgICAgV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfTUFDX0NPTk5FQ1RfSU5ESUNBVElPTgorICAgICAgICAvLykgJiYgKGJzc0Rlc2MgaW5kaWNhdGVzIGFuIGludmFsaWQgcGVlciBNQUMgQWRkciBvciBTZWNQYXJhbSkpeworICAgICAgICAgICAgICAgICkgJiYgIXZhbGlkQXNzb2NJbmQoYnRhbXBDb250ZXh0LCAodENzclJvYW1JbmZvICopYmFwRXZlbnQtPnBhcmFtcykpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBDT05ORUNUSU5HIHRvIERJU0NPTk5FQ1RJTkcgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJDT05ORUNUSU5HIiwgIkRJU0NPTk5FQ1RJTkciKTsKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgLy9jc3JSb2FtRGlzY29ubmVjdChERUFVVEgpOworICAgICAgICAgIC8vSkVaMDgxMTIwOiBEYW5saW4gcG9pbnRzIG91dCB0aGF0IEkgY291bGQganVzdCBpZ25vcmUgdGhpcworICAgICAgICAgIHNtZV9Sb2FtRGlzY29ubmVjdChoSGFsLCAKKyAgICAgICAgICAgICAgICAgIC8vSkVaMDgxMTE1OiBGaXhtZSAKKyAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+c2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fREVBVVRIKTsKKyAgICAgICAgICAgICAgICAgIC8vZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RpbmcoCisgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQsCisgICAgICAgICAgICAgICAgICBWT1NfVFJVRSwgCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0FVVEhFTlRfRkFJTFVSRSwgCisgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsIAorICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICAgICAgICAvKlNldCB0aGUgc3RhdHVzIGNvZGUgYmVpbmcgcmV0dXJuZWQgdG8gdGhlIGJ0YW1wRnNtIGNhbGxlciAqLworICAgICAgICAgICpzdGF0dXMgPSBXTEFOQkFQX0VSUk9SX0FVVEhFTlRfRkFJTFVSRTsKKworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNUSU5HKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9NQUNfQ09OTkVDVF9JTkRJQ0FUSU9OCisgICAgICAgIC8vKSAmJiAoYnNzRGVzYyBpbmRpY2F0ZXMgYSB2YWxpZCBNQUMgQWRkciBhbmQgU2VjUGFyYW0pKXsKKyAgICAgICAgICAgICAgICApICYmIHZhbGlkQXNzb2NJbmQoYnRhbXBDb250ZXh0LCAodENzclJvYW1JbmZvICopYmFwRXZlbnQtPnBhcmFtcykpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBDT05ORUNUSU5HIHRvIFZBTElEQVRFRCAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIC8vVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiQ09OTkVDVElORyIsICJWQUxJREFURUQiKTsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJDT05ORUNUSU5HIiwgIkFVVEhFTlRJQ0FUSU5HIik7CisgICAgICAgICAgLy9WT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJDT05ORUNUSU5HIiwgIkNPTk5FQ1RFRCIpOworCisgICAgICAgICAgLypBY3Rpb24gY29kZSBmb3IgdHJhbnNpdGlvbiAqLworICAgICAgICAgIC8vIEpFWjA4MTAyNzogVGhpcyBvbmUgaXMgYSBwYWluLiAgU2luY2Ugd2UgYXJlIHJlc3BvbmRpbmcgaW4gdGhlCisgICAgICAgICAgLy8gY2FsbGJhY2sgaXRzZWxmLiAgVGhpcyBtZXNzZXMgdXAgbXkgc3RhdGUgbWFjaGluZS4KKyAgICAgICAgICAvL2NzclJvYW1BY2NlcHQoKTsKKworICAgICAgICAgIC8vIE5vISAgVGhpcyBpcyBmaW5lLiAKKyAgICAgICAgICAvKlNldCB0aGUgc3RhdHVzIGNvZGUgYmVpbmcgcmV0dXJuZWQgdG8gdGhlIGJ0YW1wRnNtIGNhbGxlciAqLworICAgICAgICAgICpzdGF0dXMgPSBXTEFOQkFQX1NUQVRVU19TVUNDRVNTOworCisgICAgICAgICAgLyogSkVaMDgxMjE1OiBOLkIuOiBDdXJyZW50bHksIEkgZG9uJ3QgZ2V0IHRoZSAKKyAgICAgICAgICAgKiBlQ1NSX1JPQU1fUkVTVUxUX1dEU19BU1NPQ0lBVEVEIGFzIGFuIEFQLgorICAgICAgICAgICAqIFNvLCBJIGhhdmUgdG8gcmVnaXN0ZXIgd2l0aCBUTCwgaGVyZS4gVGhpcyAKKyAgICAgICAgICAgKiBzZWVtcyB3ZWlyZC4KKyAgICAgICAgICAgKi8KKworICAgICAgICAgIC8qIHJlZ2lzdGVyIG91ciBTVEEgd2l0aCBUTCAqLworICAgICAgICAgIHJlZ1N0YVdpdGhUbCAoIAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LCAvKiBidGFtcENvbnRleHQgdmFsdWUgKi8gCisgICAgICAgICAgICAgICAgICBCVF9JTklUSUFUT1IsIAorICAgICAgICAgICAgICAgICAgKHRDc3JSb2FtSW5mbyAqKWJhcEV2ZW50LT5wYXJhbXMgKTsKKyAgICAgICAgICAKKyAgICAgICAgICAgIGdvdG9BdXRoZW50aWNhdGluZyhidGFtcENvbnRleHQpOworICAgICAgICAgIC8qQWN0aW9uIGNvZGUgZm9yIHRyYW5zaXRpb24gKi8KKyAgICAgICAgICBpbml0UnNuQXV0aGVudGljYXRvcihidGFtcENvbnRleHQsIEJUX0lOSVRJQVRPUik7CisKKyNpZiAxCisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgLy9idGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsVkFMSURBVEVEKTsKKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsQVVUSEVOVElDQVRJTkcpOworI2Vsc2UKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgc2lnbmFsSENJUGh5c0xpbmtDb21wRXZlbnQoYnRhbXBDb250ZXh0LCBXTEFOQkFQX1NUQVRVU19TVUNDRVNTKTsKKyAgICAgICAgICBnb3RvQ29ubmVjdGVkKGJ0YW1wQ29udGV4dCk7CisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLENPTk5FQ1RFRCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9NQUNfQ09OTkVDVF9GQUlMRUQpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gQ09OTkVDVElORyB0byBESVNDT05ORUNUSU5HIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiQ09OTkVDVElORyIsICJESVNDT05ORUNUSU5HIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgICBzbWVfUm9hbURpc2Nvbm5lY3QoaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKKyAgICAgICAgICAvKiBTZWN0aW9uIDMuMS44IGFuZCBzZWN0aW9uIDMuMS45IGhhdmUgY29udHJhZGljdG9yeSBzZW1hbnRpY3MgZm9yIDB4MTYuIAorICAgICAgICAgICAqIDMuMS44IGlzICJjb25uZWN0aW9uIHRlcm1pbmF0ZWQgYnkgbG9jYWwgaG9zdCIuIDMuMS45IGlzICJmYWlsZWQgY29ubmVjdGlvbiIuICAKKyAgICAgICAgICAgKi8KKyAgICAgICAgICAvL2dvdG9EaXNjb25uZWN0aW5nKEZBSUxFRF9DT05ORUNUSU9OKTsKKyAgICAgICAgICBnb3RvRGlzY29ubmVjdGluZygKKyAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgIFZPU19UUlVFLCAKKyAgICAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfVEVSTV9CWV9MT0NBTF9IT1NULCAvL0ZBSUxFRF9DT05ORUNUSU9OCisgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsIAorICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLERJU0NPTk5FQ1RJTkcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX1RJTUVSX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gQ09OTkVDVElORyB0byBESVNDT05ORUNUSU5HIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiQ09OTkVDVElORyIsICJESVNDT05ORUNUSU5HIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgLy9jc3JSb2FtRGlzY29ubmVjdCgpOworICAgICAgICAgIHNtZV9Sb2FtRGlzY29ubmVjdChoSGFsLCAKKyAgICAgICAgICAgICAgICAgIC8vSkVaMDgxMTE1OiBGaXhtZSAKKyAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+c2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworICAgICAgICAgIGdvdG9EaXNjb25uZWN0aW5nKAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgVk9TX1RSVUUsIAorICAgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9IT1NUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsIAorICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLERJU0NPTk5FQ1RJTkcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgaW4gc3RhdGUgJXMsIGludmFsaWQgZXZlbnQgbXNnICVkIiwgX19GVU5DVElPTl9fLCAiQ09OTkVDVElORyIsIG1zZyk7CisgICAgICAgICAgLyogSW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rICovCisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEFVVEhFTlRJQ0FUSU5HOgorICAgICAgICBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfUlNOX1NVQ0NFU1MKKyAgICAgICAgICAgKSAmJiAoYnRhbXBDb250ZXh0LT5CQVBEZXZpY2VSb2xlID09IEJUX1JFU1BPTkRFUikpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBBVVRIRU5USUNBVElORyB0byBLRVlJTkcgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJBVVRIRU5USUNBVElORyIsICJLRVlJTkciKTsKKworICAgICAgICAgIC8qQWN0aW9uIGNvZGUgZm9yIHRyYW5zaXRpb24gKi8KKyAgICAgICAgICAvL3NtZV9Sb2FtU2V0Q29udGV4dCgpOyAKKyNpZiAwCisgICAgICAgICAgc21lX1JvYW1TZXRLZXkoCisgICAgICAgICAgICAgICAgICBWT1NfR0VUX0hBTF9DQihidGFtcENvbnRleHQtPnB2b3NHQ3R4KSwgCisgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPnNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciBwZWVyQnNzSWQsIAorICAgICAgICAgICAgICAgICAgZUNzckVuY3J5cHRpb25UeXBlIGVuY3J5cHRUeXBlLAorICAgICAgICAgICAgICAgICAgdEFOSV9VMTYga2V5TGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBLZXksCisgICAgICAgICAgICAgICAgICBWT1NfVFJVRSwgICAvLyBUUlVFIAorICAgICAgICAgICAgICAgICAgdEFOSV9VOCBwYWVSb2xlKTsKKyNlbmRpZiAvLzAKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsS0VZSU5HKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9SU05fU1VDQ0VTUworICAgICAgICAgICAgICAgICkgJiYgKGJ0YW1wQ29udGV4dC0+QkFQRGV2aWNlUm9sZSA9PSBCVF9JTklUSUFUT1IpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gQVVUSEVOVElDQVRJTkcgdG8gS0VZSU5HIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiQVVUSEVOVElDQVRJTkciLCAiS0VZSU5HIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgLy9zbWVfUm9hbVNldENvbnRleHQoKTsgCisjaWYgMAorICAgICAgICAgIHNtZV9Sb2FtU2V0S2V5KAorICAgICAgICAgICAgICAgICAgVk9TX0dFVF9IQUxfQ0IoYnRhbXBDb250ZXh0LT5wdm9zR0N0eCksIAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgcGVlckJzc0lkLCAKKyAgICAgICAgICAgICAgICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBlbmNyeXB0VHlwZSwKKyAgICAgICAgICAgICAgICAgIHRBTklfVTE2IGtleUxlbmd0aCwgCisgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwS2V5LAorICAgICAgICAgICAgICAgICAgVk9TX1RSVUUsICAgLy8gVFJVRSAKKyAgICAgICAgICAgICAgICAgIHRBTklfVTggcGFlUm9sZSk7CisjZW5kaWYgLy8wCisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLEtFWUlORyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfVElNRVJfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBBVVRIRU5USUNBVElORyB0byBESVNDT05ORUNUSU5HIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIENvbm5lY3RBY2NlcHRUaW1lb3V0IiwgX19GVU5DVElPTl9fLCAiQVVUSEVOVElDQVRJTkciLCAiRElTQ09OTkVDVElORyIpOworCisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RpbmcoCisgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQsCisgICAgICAgICAgICAgICAgICBWT1NfVFJVRSwgCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0hPU1RfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgIFZPU19GQUxTRSwgCisgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsRElTQ09OTkVDVElORyk7CisgICAgICAgICAgLypBY3Rpb24gY29kZSBmb3IgdHJhbnNpdGlvbiAqLworICAgICAgICAgc21lX1JvYW1EaXNjb25uZWN0KGhIYWwsIAorICAgICAgICAgICAgICAgICAgLy9KRVowODExMTU6IEZpeG1lIAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9IQ0lfUEhZU0lDQUxfTElOS19ESVNDT05ORUNUKSkKKyAgICAgICAgeworICAgICAgICAgIC8qVHJhbnNpdGlvbiBmcm9tIEFVVEhFTlRJQ0FUSU5HIHRvIERJU0NPTk5FQ1RJTkcgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMgUGh5c2ljYWxsaW5rIERpc2Nvbm5lY3QiLCBfX0ZVTkNUSU9OX18sICJBVVRIRU5USUNBVElORyIsICJESVNDT05ORUNUSU5HIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgLy9jc3JSb2FtRGlzY29ubmVjdCgpOworICAgICAgICAgIHNtZV9Sb2FtRGlzY29ubmVjdChoSGFsLCAKKyAgICAgICAgICAgICAgICAgIC8vSkVaMDgxMTE1OiBGaXhtZSAKKyAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+c2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworICAgICAgICAgIGdvdG9EaXNjb25uZWN0aW5nKAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgVk9TX1RSVUUsIAorICAgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9OT19DTkNULAorICAgICAgICAgICAgICAgICAgLy9WT1NfVFJVRSwgICAvLyBTaG91bGQgYmUgVk9TX0ZBTFNFICEhISAKKyAgICAgICAgICAgICAgICAgIFZPU19GQUxTRSwgCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVCk7CisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLERJU0NPTk5FQ1RJTkcpOworICAgICAgICAgIC8vIEl0IGlzIE5PVCBjbGVhciB0aGF0IHdlIG5lZWQgdG8gc2VuZCB0aGUgUGh5IExpbmsgRGlzY29ubmVjdAorICAgICAgICAgIC8vIENvbXBsZXRlIEV2ZW50IGhlcmUuCisgICAgICAgICAgc2lnbmFsSENJUGh5c0xpbmtEaXNjRXZlbnQgCisgICAgICAgICAgICAgICggYnRhbXBDb250ZXh0LCAKKyAgICAgICAgICAgICAgICBXTEFOQkFQX1NUQVRVU19TVUNDRVNTLAorICAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfVEVSTV9CWV9MT0NBTF9IT1NUKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9SU05fRkFJTFVSRSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBBVVRIRU5USUNBVElORyB0byBESVNDT05ORUNUSU5HIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIFJTTiBGYWlsdXJlIiwgX19GVU5DVElPTl9fLCAiQVVUSEVOVElDQVRJTkciLCAiRElTQ09OTkVDVElORyIpOworCisgICAgICAgICAgLypBY3Rpb24gY29kZSBmb3IgdHJhbnNpdGlvbiAqLworICAgICAgICAgIC8vY3NyUm9hbURpc2Nvbm5lY3QoREVBVVRIKTsKKyAgICAgICAgICBzbWVfUm9hbURpc2Nvbm5lY3QoaEhhbCwgCisgICAgICAgICAgICAgICAgICAvL0pFWjA4MTExNTogRml4bWUgCisgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPnNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0RFQVVUSCk7CisgICAgICAgICAgICAgICAgICAvL2VDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworICAgICAgICAgIGdvdG9EaXNjb25uZWN0aW5nKAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgVk9TX1RSVUUsIAorICAgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9BVVRIRU5UX0ZBSUxVUkUsIAorICAgICAgICAgICAgICAgICAgVk9TX0ZBTFNFLCAKKyAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNUSU5HKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGluIHN0YXRlICVzLCBpbnZhbGlkIGV2ZW50IG1zZyAlZCIsIF9fRlVOQ1RJT05fXywgIkFVVEhFTlRJQ0FUSU5HIiwgbXNnKTsKKyAgICAgICAgICAvKiBJbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsgKi8KKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ09OTkVDVEVEOgorICAgICAgICBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfSENJX1BIWVNJQ0FMX0xJTktfRElTQ09OTkVDVCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBDT05ORUNURUQgdG8gRElTQ09OTkVDVElORyAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsIF9fRlVOQ1RJT05fXywgIkNPTk5FQ1RFRCIsICJESVNDT05ORUNUSU5HIik7CisKKyAgICAgICAgICAgIGdvdG9EaXNjb25uZWN0aW5nKAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgVk9TX0ZBTFNFLCAKKyAgICAgICAgICAgICAgICAgIDAsIAorICAgICAgICAgICAgICAgICAgVk9TX1RSVUUsIAorICAgICAgICAgICAgICAgICAgV0xBTkJBUF9FUlJPUl9URVJNX0JZX0xPQ0FMX0hPU1QpOworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNUSU5HKTsKKworICAgICAgICAgIFdMQU5CQVBfRGVJbml0TGlua1N1cGVydmlzaW9uKCggcHRCdGFtcEhhbmRsZSlidGFtcENvbnRleHQpOworICAgICAgICAgIC8qQWN0aW9uIGNvZGUgZm9yIHRyYW5zaXRpb24gKi8KKyAgICAgICAgICAvL2NzclJvYW1EaXNjb25uZWN0KCk7CisgICAgICAgICAgc21lX1JvYW1EaXNjb25uZWN0KGhIYWwsIAorICAgICAgICAgICAgICAgICAgLy9KRVowODExMTU6IEZpeG1lIAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfTUFDX0lORElDQVRFU19NRURJQV9ESVNDT05ORUNUSU9OKSkKKyAgICAgICAgeworCisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gQ09OTkVDVEVEIHRvIERJU0NPTk5FQ1RJTkcgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJDT05ORUNURUQiLCAiRElTQ09OTkVDVElORyIpOworICAgICAgICAgIFdMQU5CQVBfRGVJbml0TGlua1N1cGVydmlzaW9uKCggcHRCdGFtcEhhbmRsZSlidGFtcENvbnRleHQpOworCisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RpbmcoCisgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQsCisgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsIAorICAgICAgICAgICAgICAgICAgMCwgCisgICAgICAgICAgICAgICAgICBWT1NfVFJVRSwgCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVCk7CisgICAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgICBzbWVfUm9hbURpc2Nvbm5lY3QoaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsRElTQ09OTkVDVElORyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBpbiBzdGF0ZSAlcywgaW52YWxpZCBldmVudCBtc2cgJWQiLCBfX0ZVTkNUSU9OX18sICJDT05ORUNURUQiLCBtc2cpOworICAgICAgICAgIC8qIEludGVudGlvbmFsbHkgbGVmdCBibGFuayAqLworICAgICAgICB9CisgICAgICBicmVhazsKKworLyogSkVaMDgxMTA3OiBUaGlzIHdpbGwgb25seSB3b3JrIGlmIEkgaGF2ZSBhbHJlYWR5IHNpZ25hbGxlZCB0aGUgZGlzY29ubmVjdCBjb21wbGV0ZQorICogZXZlbnQgaW4gZXZlcnkgY2FzZSB3aGVyZSBhIHBoeXNpY2FsIGxpbmsgY29tcGxldGUgZXZlbnQgaXMgcmVxdWlyZWQuIEFuZCBhCisgKiBkaXNjb25uZWN0IHdhcyByZXF1ZXN0ZWQuCisgKiAgICAgIC0gLSAtCisgKiBBbmQgb25seSBpZiBJIGNoZWNrIGZvciBnTmVlZFBoeXNMaW5rQ29tcEV2ZW50IEJFRk9SRSBJIGNoZWNrIGdEaXNjUmVxdWVzdGVkLgorICogTmF3ISBOb3QgbmVjZXNzYXJ5LgorICovCisgICAgICBjYXNlIERJU0NPTk5FQ1RJTkc6CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIEVudGVyZWQgRElTQ09OTkVDVElORzoiLCBfX0ZVTkNUSU9OX18pOy8vRGVidWcgc3RhdGVtZW50CisgICAgICAgIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9NQUNfUkVBRFlfRk9SX0NPTk5FQ1RJT05TCisgICAgICAgICAgICkgJiYgKGJ0YW1wQ29udGV4dC0+Z0Rpc2NSZXF1ZXN0ZWQgPT0gVk9TX1RSVUUpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gRElTQ09OTkVDVElORyB0byBESVNDT05ORUNURUQgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLCBfX0ZVTkNUSU9OX18sICJESVNDT05ORUNUSU5HIiwgIkRJU0NPTk5FQ1RFRCIpOworCisgICAgLy9DbGVhciBnRGlzY1JlcXVlc3RlZDsKKyAgICBidGFtcENvbnRleHQtPmdEaXNjUmVxdWVzdGVkID0gVk9TX0ZBTFNFOworICAgICAgICAgICAKKyAgICBpZihidGFtcENvbnRleHQtPkJBUERldmljZVJvbGUgPT0gQlRfSU5JVElBVE9SKSAKKyAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfbG9ja19hY3F1aXJlKCZidGFtcENvbnRleHQtPmJhcExvY2spKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsImJ0YW1wRnNtLCBHZXQgTE9DSyBGYWlsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBhdXRoUnNuRnNtRnJlZShidGFtcENvbnRleHQpOworICAgICAgICAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX2xvY2tfcmVsZWFzZSgmYnRhbXBDb250ZXh0LT5iYXBMb2NrKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJidGFtcEZzbSwgUmVsZWFzZSBMT0NLIEZhaWwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYoYnRhbXBDb250ZXh0LT5CQVBEZXZpY2VSb2xlID09IEJUX1JFU1BPTkRFUikKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHN1cHBSc25Gc21GcmVlKGJ0YW1wQ29udGV4dCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogTG9va3VwIHRoZSBTdGFJZCB1c2luZyB0aGUgcGh5X2xpbmtfaGFuZGxlIGFuZCB0aGUgQkFQIGNvbnRleHQgKi8gCisgICAgICAgICAgdm9zU3RhdHVzID0gV0xBTkJBUF9HZXRTdGFJZEZyb21MaW5rQ3R4ICggCisgICAgICAgICAgICAgICAgICAgIGJ0YW1wSGFuZGxlLCAgLyogYnRhbXBIYW5kbGUgdmFsdWUgaW4gICovIAorICAgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQtPnBoeV9saW5rX2hhbmRsZSwgIC8qIHBoeV9saW5rX2hhbmRsZSB2YWx1ZSBpbiAqLworICAgICAgICAgICAgICAgICAgICAmdWNTVEFJZCwgIC8qIFRoZSBTdGFJZCAodXNlZCBieSBUTCwgUEUsIGFuZCBIQUwpICovCisgICAgICAgICAgICAgICAgICAgICZwSGRkSGRsKTsgLyogSGFuZGxlIHRvIHJldHVybiBCU0wgY29udGV4dCAqLworICAgICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIAorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmV0cmlldmUgU1RBIElkIGZyb20gQkFQIGNvbnRleHQgYW5kIHBoeV9saW5rX2hhbmRsZSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgICAgfQorICAgICAgICAgIFdMQU5UTF9DbGVhclNUQUNsaWVudChidGFtcENvbnRleHQtPnB2b3NHQ3R4LCB1Y1NUQUlkKTsKKworICAgIC8vICAgICAgZ290b0Rpc2Nvbm5lY3RlZChidGFtcENvbnRleHQpOworCisgICAgICAvLyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6SW4gRElTQ09OTkVDVElORy1jaGFuZ2luZyBvdXRlciBzdGF0ZSB2YXIgdG8gRElTQ09OTkVDVEVEIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgLy8gIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNURUQpOworCisgICAgICAgICAgc2lnbmFsSENJUGh5c0xpbmtEaXNjRXZlbnQgCisgICAgICAgICAgICAgICggYnRhbXBDb250ZXh0LCAKKyAgICAgICAgICAgICAgICBXTEFOQkFQX1NUQVRVU19TVUNDRVNTLAorICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+Z0Rpc2NSZWFzb24pOworICAgICAgICAgIC8qc21lX0Nsb3NlU2Vzc2lvbihWT1NfR0VUX0hBTF9DQihidGFtcENvbnRleHQtPnB2b3NHQ3R4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQpOyovCisgICAgICAgICAgLypBY3Rpb24gY29kZSBmb3IgdHJhbnNpdGlvbiAqLworICAgICAgICAgIGdvdG9EaXNjb25uZWN0ZWQoYnRhbXBDb250ZXh0KTsKKworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczpJbiBESVNDT05ORUNUSU5HLWNoYW5naW5nIG91dGVyIHN0YXRlIHZhciB0byBESVNDT05ORUNURUQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNURUQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX01BQ19SRUFEWV9GT1JfQ09OTkVDVElPTlMKKyAgICAgICAgICAgICAgICApICYmIChidGFtcENvbnRleHQtPmdOZWVkUGh5c0xpbmtDb21wRXZlbnQgPT0gVk9TX1RSVUUpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gRElTQ09OTkVDVElORyB0byBESVNDT05ORUNURUQgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpKi8KKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMgZ05lZWRQaHlzTGlua0NvbXAgVFJVRSIsIF9fRlVOQ1RJT05fXywgIkRJU0NPTk5FQ1RJTkciLCAiRElTQ09OTkVDVEVEIik7CisgICAgICAgICAgaWYoYnRhbXBDb250ZXh0LT5CQVBEZXZpY2VSb2xlID09IEJUX0lOSVRJQVRPUikgCisgICAgICAgICAgeworICAgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19sb2NrX2FjcXVpcmUoJmJ0YW1wQ29udGV4dC0+YmFwTG9jaykpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiYnRhbXBGc20sIEdldCBMT0NLIEZhaWwiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBhdXRoUnNuRnNtRnJlZShidGFtcENvbnRleHQpOworICAgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19sb2NrX3JlbGVhc2UoJmJ0YW1wQ29udGV4dC0+YmFwTG9jaykpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiYnRhbXBGc20sIFJlbGVhc2UgTE9DSyBGYWlsIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmKGJ0YW1wQ29udGV4dC0+QkFQRGV2aWNlUm9sZSA9PSBCVF9SRVNQT05ERVIpCisgICAgICAgICAgeworICAgICAgICAgICAgICBzdXBwUnNuRnNtRnJlZShidGFtcENvbnRleHQpOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBMb29rdXAgdGhlIFN0YUlkIHVzaW5nIHRoZSBwaHlfbGlua19oYW5kbGUgYW5kIHRoZSBCQVAgY29udGV4dCAqLyAKKyAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX0dldFN0YUlkRnJvbUxpbmtDdHggKCAKKyAgICAgICAgICAgICAgICAgICAgYnRhbXBIYW5kbGUsICAvKiBidGFtcEhhbmRsZSB2YWx1ZSBpbiAgKi8gCisgICAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+cGh5X2xpbmtfaGFuZGxlLCAgLyogcGh5X2xpbmtfaGFuZGxlIHZhbHVlIGluICovCisgICAgICAgICAgICAgICAgICAgICZ1Y1NUQUlkLCAgLyogVGhlIFN0YUlkICh1c2VkIGJ5IFRMLCBQRSwgYW5kIEhBTCkgKi8KKyAgICAgICAgICAgICAgICAgICAgJnBIZGRIZGwpOyAvKiBIYW5kbGUgdG8gcmV0dXJuIEJTTCBjb250ZXh0ICovCisgICAgICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgCisgICAgICAgICAgeworICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZXRyaWV2ZSBTVEEgSWQgZnJvbSBCQVAgY29udGV4dCBhbmQgcGh5X2xpbmtfaGFuZGxlIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgICAgICB9CisgICAgICAgICAgV0xBTlRMX0NsZWFyU1RBQ2xpZW50KGJ0YW1wQ29udGV4dC0+cHZvc0dDdHgsIHVjU1RBSWQpOworCisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAvLyBzaWduYWxIQ0lQaHlzTGlua0NvbXBFdmVudChidGFtcENvbnRleHQsIFdMQU5CQVBfRVJST1JfTk9fQ05DVC8qYnRhbXBDb250ZXh0LT5nUGh5c0xpbmtTdGF0dXMqLyk7CisgICAgICAgICAgc2lnbmFsSENJUGh5c0xpbmtDb21wRXZlbnQoYnRhbXBDb250ZXh0LCBidGFtcENvbnRleHQtPmdQaHlzTGlua1N0YXR1cyk7CisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RlZChidGFtcENvbnRleHQpOworICAgICAgICAgIC8qc21lX0Nsb3NlU2Vzc2lvbihWT1NfR0VUX0hBTF9DQihidGFtcENvbnRleHQtPnB2b3NHQ3R4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQpOyovCisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLERJU0NPTk5FQ1RFRCk7CisgICAgICAgICAvLyBzaWduYWxIQ0lQaHlzTGlua0NvbXBFdmVudChidGFtcENvbnRleHQsIGJ0YW1wQ29udGV4dC0+Z1BoeXNMaW5rU3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGluIHN0YXRlICVzLCBpbnZhbGlkIGV2ZW50IG1zZyAlZCIsIF9fRlVOQ1RJT05fXywgIkRJU0NPTk5FQ1RJTkciLCBtc2cpOworICAgICAgICAgIC8qIEludGVudGlvbmFsbHkgbGVmdCBibGFuayAqLworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBLRVlJTkc6CisgICAgICAgIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9USU1FUl9DT05ORUNUX0FDQ0VQVF9USU1FT1VUKSkKKyAgICAgICAgeworICAgICAgICAgIC8qVHJhbnNpdGlvbiBmcm9tIEtFWUlORyB0byBESVNDT05ORUNUSU5HIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiS0VZSU5HIiwgIkRJU0NPTk5FQ1RJTkciKTsKKworICAgICAgICAgIC8qQWN0aW9uIGNvZGUgZm9yIHRyYW5zaXRpb24gKi8KKyAgICAgICAgICAvL2NzclJvYW1EaXNjb25uZWN0KCk7CisgICAgICAgICAgc21lX1JvYW1EaXNjb25uZWN0KGhIYWwsIAorICAgICAgICAgICAgICAgICAgLy9KRVowODExMTU6IEZpeG1lIAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RpbmcoCisgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQsCisgICAgICAgICAgICAgICAgICBWT1NfVFJVRSwgCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0hPU1RfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgIFZPU19GQUxTRSwgCisgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsRElTQ09OTkVDVElORyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfSENJX1BIWVNJQ0FMX0xJTktfRElTQ09OTkVDVCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBLRVlJTkcgdG8gRElTQ09OTkVDVElORyAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsIF9fRlVOQ1RJT05fXywgIktFWUlORyIsICJESVNDT05ORUNUSU5HIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgLy9jc3JSb2FtRGlzY29ubmVjdCgpOworICAgICAgICAgIHNtZV9Sb2FtRGlzY29ubmVjdChoSGFsLCAKKyAgICAgICAgICAgICAgICAgIC8vSkVaMDgxMTE1OiBGaXhtZSAKKyAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+c2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworCisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RpbmcoCisgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQsCisgICAgICAgICAgICAgICAgICBWT1NfVFJVRSwgCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX05PX0NOQ1QsCisgICAgICAgICAgICAgICAgICAvL1ZPU19UUlVFLCAgIC8vIFNob3VsZCBiZSBWT1NfRkFMU0UgISEhIAorICAgICAgICAgICAgICAgICAgVk9TX0ZBTFNFLCAKKyAgICAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfVEVSTV9CWV9MT0NBTF9IT1NUKTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsRElTQ09OTkVDVElORyk7CisKKyAgICAgICAgICAvLyBJdCBpcyBOT1QgY2xlYXIgdGhhdCB3ZSBuZWVkIHRvIHNlbmQgdGhlIFBoeSBMaW5rIERpc2Nvbm5lY3QKKyAgICAgICAgICAvLyBDb21wbGV0ZSBFdmVudCBoZXJlLgorICAgICAgICAgIHNpZ25hbEhDSVBoeXNMaW5rRGlzY0V2ZW50IAorICAgICAgICAgICAgICAoIGJ0YW1wQ29udGV4dCwgCisgICAgICAgICAgICAgICAgV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfTUFDX0tFWV9TRVRfU1VDQ0VTUykpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBLRVlJTkcgdG8gQ09OTkVDVEVEIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiS0VZSU5HIiwgIkNPTk5FQ1RFRCIpOworCisgICAgICAgICAgLypBY3Rpb24gY29kZSBmb3IgdHJhbnNpdGlvbiAqLworICAgICAgICAgIGdvdG9Db25uZWN0ZWQoYnRhbXBDb250ZXh0KTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsQ09OTkVDVEVEKTsKKyAgICAgICAgICBzaWduYWxIQ0lQaHlzTGlua0NvbXBFdmVudChidGFtcENvbnRleHQsIFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1MpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgaW4gc3RhdGUgJXMsIGludmFsaWQgZXZlbnQgbXNnICVkIiwgX19GVU5DVElPTl9fLCAiS0VZSU5HIiwgbXNnKTsKKyAgICAgICAgICAvKiBJbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsgKi8KKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU0NBTk5JTkc6CisgICAgICAgIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9NQUNfU0NBTl9DT01QTEVURSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBTQ0FOTklORyB0byBTVEFSVElORyAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsIF9fRlVOQ1RJT05fXywgIlNDQU5OSU5HIiwgIlNUQVJUSU5HIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgdm9zU3RhdHVzID0gZGV0ZXJtaW5lQ2hhbihidGFtcENvbnRleHQsIEJUX0lOSVRJQVRPUiwgJmNoYW5uZWwsIHN0YXR1cyk7CisgICAgICAgICAgLy8gVGhpcyBoYXMgdG8gYmUgY29tbWVudGVkIG91dCB1bnRpbCBJIGdldCB0aGUgQlQtQU1QIFNNRS9DU1IgY2hhbmdlcyAKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsU1RBUlRJTkcpOworICAgICAgICAgIHZvc1N0YXR1cyA9IGdvdG9TdGFydGluZyggYnRhbXBDb250ZXh0LCBiYXBFdmVudCwgZUNTUl9CU1NfVFlQRV9XRFNfQVAsIHN0YXR1cyk7IAorICAgICAgICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLCBTQ0FOTklORyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX1RJTUVSX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gU0NBTk5JTkcgdG8gRElTQ09OTkVDVEVEIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiU0NBTk5JTkciLCAiRElTQ09OTkVDVEVEIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RlZChidGFtcENvbnRleHQpOworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNURUQpOworCisgICAgICAgICAgc2lnbmFsSENJUGh5c0xpbmtDb21wRXZlbnQoIGJ0YW1wQ29udGV4dCwgV0xBTkJBUF9FUlJPUl9IT1NUX1RJTUVPVVQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKG1zZz09KEJUQU1QRlNNX0VWRU5UX1QpZVdMQU5fQkFQX0hDSV9QSFlTSUNBTF9MSU5LX0RJU0NPTk5FQ1QpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gU0NBTk5JTkcgdG8gRElTQ09OTkVDVEVEIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiU0NBTk5JTkciLCAiRElTQ09OTkVDVEVEIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RlZChidGFtcENvbnRleHQpOworICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgIGJ0YW1wZnNtQ2hhbmdlVG9TdGF0ZShpbnN0YW5jZVZhcixESVNDT05ORUNURUQpOworICAgICAgICAgIHNpZ25hbEhDSVBoeXNMaW5rRGlzY0V2ZW50IAorICAgICAgICAgICAgICAoIGJ0YW1wQ29udGV4dCwgCisgICAgICAgICAgICAgICAgV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVCk7CisgICAgICAgICAgc2lnbmFsSENJUGh5c0xpbmtDb21wRXZlbnQoIGJ0YW1wQ29udGV4dCwgV0xBTkJBUF9FUlJPUl9OT19DTkNUKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGluIHN0YXRlICVzLCBpbnZhbGlkIGV2ZW50IG1zZyAlZCIsIF9fRlVOQ1RJT05fXywgIlNDQU5OSU5HIiwgbXNnKTsKKyAgICAgICAgICAvKiBJbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsgKi8KKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVkFMSURBVEVEOgorICAgICAgICBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfTUFDX0NPTk5FQ1RfQ09NUExFVEVECisgICAgICAgICAgICkgJiYgKGJ0YW1wQ29udGV4dC0+QkFQRGV2aWNlUm9sZSA9PSBCVF9JTklUSUFUT1IpKQorICAgICAgICB7CisgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gVkFMSURBVEVEIHRvIEFVVEhFTlRJQ0FUSU5HIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiVkFMSURBVEVEIiwgIkFVVEhFTlRJQ0FUSU5HIik7CisKKyAgICAgICAgICAgIGdvdG9BdXRoZW50aWNhdGluZyhidGFtcENvbnRleHQpOworICAgICAgICAgIC8qQWN0aW9uIGNvZGUgZm9yIHRyYW5zaXRpb24gKi8KKyAgICAgICAgICBpbml0UnNuQXV0aGVudGljYXRvcihidGFtcENvbnRleHQsIEJUX0lOSVRJQVRPUik7CisgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgYnRhbXBmc21DaGFuZ2VUb1N0YXRlKGluc3RhbmNlVmFyLEFVVEhFTlRJQ0FUSU5HKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChtc2c9PShCVEFNUEZTTV9FVkVOVF9UKWVXTEFOX0JBUF9USU1FUl9DT05ORUNUX0FDQ0VQVF9USU1FT1VUKSkKKyAgICAgICAgeworICAgICAgICAgIC8qVHJhbnNpdGlvbiBmcm9tIFZBTElEQVRFRCB0byBESVNDT05ORUNUSU5HIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwgX19GVU5DVElPTl9fLCAiVkFMSURBVEVEIiwgIkRJU0NPTk5FQ1RJTkciKTsKKworICAgICAgICAgIC8qQWN0aW9uIGNvZGUgZm9yIHRyYW5zaXRpb24gKi8KKyAgICAgICAgICAvL2NzclJvYW1EaXNjb25uZWN0KCk7CisgICAgICAgICAgc21lX1JvYW1EaXNjb25uZWN0KGhIYWwsIAorICAgICAgICAgICAgICAgICAgLy9KRVowODExMTU6IEZpeG1lIAorICAgICAgICAgICAgICAgICAgYnRhbXBDb250ZXh0LT5zZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RpbmcoCisgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQsCisgICAgICAgICAgICAgICAgICBWT1NfVFJVRSwgCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0hPU1RfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgIFZPU19GQUxTRSwgCisgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsRElTQ09OTkVDVElORyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigobXNnPT0oQlRBTVBGU01fRVZFTlRfVCllV0xBTl9CQVBfSENJX1BIWVNJQ0FMX0xJTktfRElTQ09OTkVDVCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBWQUxJREFURUQgdG8gRElTQ09OTkVDVElORyAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsIF9fRlVOQ1RJT05fXywgIlZBTElEQVRFRCIsICJESVNDT05ORUNUSU5HIik7CisKKyAgICAgICAgICAvKkFjdGlvbiBjb2RlIGZvciB0cmFuc2l0aW9uICovCisgICAgICAgICAgLy9jc3JSb2FtRGlzY29ubmVjdCgpOworICAgICAgICAgIHNtZV9Sb2FtRGlzY29ubmVjdChoSGFsLCAKKyAgICAgICAgICAgICAgICAgIC8vSkVaMDgxMTE1OiBGaXhtZSAKKyAgICAgICAgICAgICAgICAgIGJ0YW1wQ29udGV4dC0+c2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworCisgICAgICAgICAgZ290b0Rpc2Nvbm5lY3RpbmcoCisgICAgICAgICAgICAgICAgICBidGFtcENvbnRleHQsCisgICAgICAgICAgICAgICAgICBWT1NfVFJVRSwgCisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX05PX0NOQ1QsCisgICAgICAgICAgICAgICAgICAvL1ZPU19UUlVFLCAgIC8vIFNob3VsZCBiZSBWT1NfRkFMU0UgISEhIAorICAgICAgICAgICAgICAgICAgVk9TX0ZBTFNFLCAKKyAgICAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfVEVSTV9CWV9MT0NBTF9IT1NUKTsKKyAgICAgICAgICAvKkFkdmFuY2Ugb3V0ZXIgc3RhdGV2YXIgKi8KKyAgICAgICAgICBidGFtcGZzbUNoYW5nZVRvU3RhdGUoaW5zdGFuY2VWYXIsRElTQ09OTkVDVElORyk7CisKKyAgICAgICAgICAvLyBJdCBpcyBOT1QgY2xlYXIgdGhhdCB3ZSBuZWVkIHRvIHNlbmQgdGhlIFBoeSBMaW5rIERpc2Nvbm5lY3QKKyAgICAgICAgICAvLyBDb21wbGV0ZSBFdmVudCBoZXJlLgorICAgICAgICAgIHNpZ25hbEhDSVBoeXNMaW5rRGlzY0V2ZW50IAorICAgICAgICAgICAgICAoIGJ0YW1wQ29udGV4dCwgCisgICAgICAgICAgICAgICAgV0xBTkJBUF9TVEFUVVNfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX1RFUk1fQllfTE9DQUxfSE9TVCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBpbiBzdGF0ZSAlcywgaW52YWxpZCBldmVudCBtc2cgJWQiLCBfX0ZVTkNUSU9OX18sICJWQUxJREFURUQiLCBtc2cpOworICAgICAgICAgIC8qIEludGVudGlvbmFsbHkgbGVmdCBibGFuayAqLworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBpbnZhbGlkIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBpbnN0YW5jZVZhci0+c3RhdGVWYXIpOworICAgICAgICAvKkludGVudGlvbmFsbHkgbGVmdCBibGFuayovCisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiB2b3NTdGF0dXM7Cit9CisKK1ZPU19TVEFUVVMgYnRhbXBFc3RhYmxpc2hMb2dMaW5rKHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dCkKK3sgIAorICAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZvc19tc2dfdCAgICAgICBtc2c7CisKKyAgIHRBbmlCdEFtcExvZ0xpbmtSZXEgKnBNc2c7CisKKyAgIHBNc2cgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodEFuaUJ0QW1wTG9nTGlua1JlcSkpOworICAgaWYgKCBOVUxMID09IHBNc2cgKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkluICVzLCBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtIGZvciByZXEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgcE1zZy0+bXNnVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfQlRBTVBfTE9HX0xJTktfSU5EKTsKKyAgIHBNc2ctPm1zZ0xlbiA9ICh0QU5JX1UxNilzaXplb2YodEFuaUJ0QW1wTG9nTGlua1JlcSk7CisgICBwTXNnLT5zZXNzaW9uSWQgPSBidGFtcENvbnRleHQtPnNlc3Npb25JZDsKKyAgIHBNc2ctPmJ0YW1wSGFuZGxlID0gYnRhbXBDb250ZXh0OworCisgICBtc2cudHlwZSA9IGVXTklfU01FX0JUQU1QX0xPR19MSU5LX0lORDsKKyAgIG1zZy5ib2R5cHRyID0gcE1zZzsKKyAgIG1zZy5yZXNlcnZlZCA9IDA7CisKKyAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NUV9JRF9TTUUsICZtc2cpKQorICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkluICVzLCBmYWlsZWQgdG8gcG9zdCBtc2cgdG8gc2VsZiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgdm9zX21lbV9mcmVlKHBNc2cpOworICAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKwordm9pZCBidGFtcEVzdGFibGlzaExvZ0xpbmtIZGxyKHZvaWQqIHBNc2cpCit7CisgICAgdEFuaUJ0QW1wTG9nTGlua1JlcSAqcEJ0QW1wTG9nTGlua1JlcSA9ICh0QW5pQnRBbXBMb2dMaW5rUmVxKilwTXNnOworICAgIHB0QnRhbXBDb250ZXh0IGJ0YW1wQ29udGV4dDsKKworICAgIGlmKHBCdEFtcExvZ0xpbmtSZXEpCisgICAgeworICAgICAgICBidGFtcENvbnRleHQgPSAocHRCdGFtcENvbnRleHQpcEJ0QW1wTG9nTGlua1JlcS0+YnRhbXBIYW5kbGU7CisgICAgICAgIGlmKE5VTEwgIT0gYnRhbXBDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2b3Nfc2xlZXAoIDIwMCApOworICAgICAgICAgICAgV0xBTl9CQVBFc3RhYmxpc2hMb2dpY2FsTGluayhidGFtcENvbnRleHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiSW4gJXMsIGJ0YW1wQ29udGV4dCBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkluICVzLCBwQnRBbXBMb2dMaW5rUmVxIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOyAgICAKKyAgICB9CisgICAgcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9DT1JFL0JBUC9zcmMvYnRhbXBGc20uaCBiL0NPUkUvQkFQL3NyYy9idGFtcEZzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwM2M1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYnRhbXBGc20uaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5CisgKi8KKworLyogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGJ0YW1wRnNtIC0gZG8gbm90IGVkaXQgbWFudWFsbHkqLworLyogR2VuZXJhdGVkIG9uOiBUaHUgT2N0IDE2IDE1OjQwOjM5IFBEVCAyMDA4IC8gdmVyc2lvbiAxLjIgQmV0YSAxICovCisKKworI2lmbmRlZiBfX0JUQU1QRlNNX0hfXworI2RlZmluZSBfX0JUQU1QRlNNX0hfXworCisjaW5jbHVkZSAiYmFwUnNuODAyMXhGc20uaCIKKworLyogU3RhdGUgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEFVVEhFTlRJQ0FUSU5HLAorICAgIERJU0NPTk5FQ1RFRCwKKyAgICBDT05ORUNUSU5HLAorICAgIERJU0NPTk5FQ1RJTkcsCisgICAgU0NBTk5JTkcsCisgICAgQ09OTkVDVEVELAorICAgIFMxLAorICAgIEtFWUlORywKKyAgICBWQUxJREFURUQsCisgICAgU1RBUlRJTkcsCit9IEJUQU1QRlNNX1NUQVRFU19UOworCisKKyNpZiAwCisvKiBJbnN0YW5jZSBkYXRhIGRlZmluaXRpb24gb2Ygc3RhdGUgbWFjaGluZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCVEFNUEZTTV9FTlRSWV9GTEFHX1QgZGlzY29ubmVjdGVkRW50cnk7CisgICAgQlRBTVBGU01fU1RBVEVWQVJfVCBzdGF0ZVZhcjsKKyAgICBCVEFNUEZTTV9JTlNUX0lEX1QgaW5zdF9pZDsKK30gQlRBTVBGU01fSU5TVEFOQ0VEQVRBX1Q7CisjZW5kaWYgLy8wCisKKy8qIEhlbHBlciB0byBpbml0aWFsaXplIHRoZSBtYWNoaW5lJ3MgaW5zdGFuY2UgZGF0YSAqLworI2RlZmluZSBCVEFNUEZTTV9JTlNUQU5DRURBVEFfSU5JVCB7ICAxLCAgRElTQ09OTkVDVEVELyogc2V0IGluaXQgc3RhdGUgKi8sICAwIC8qIGluc3RhbmNlIGlkICovfTsKKworLypQcm90b3R5cGUgZm9yIHRoZSBjaGFuZ2Ugc3RhdGUgZnVuY3Rpb24qLwordm9pZCBidGFtcGZzbUNoYW5nZVRvU3RhdGUoQlRBTVBGU01fSU5TVEFOQ0VEQVRBX1QgKmluc3RhbmNlLCBCVEFNUEZTTV9TVEFURVNfVCBzdGF0ZSk7CisKKworCisvKlByb3RvdHlwZSBvZiB0aGUgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiAqLworLy9pbnQKK1ZPU19TVEFUVVMKK2J0YW1wRnNtCisoCisgICAgLy9CVEFNUEZTTV9JTlNUQU5DRURBVEFfVCAqaW5zdGFuY2VWYXIKKyAgICBwdEJ0YW1wQ29udGV4dCBidGFtcENvbnRleHQsIC8qIGJ0YW1wQ29udGV4dCB2YWx1ZSAqLworLy8gICAgdEJ0YW1wU2Vzc0N0eCAqdHBCdGFtcFNlc3NDdHgsICAvKiBidGFtcENvbnRleHQgdmFsdWUgKi8KKyAgICBwdFdMQU5fQkFQRXZlbnQgYmFwRXZlbnQsIC8qIFN0YXRlIG1hY2hpbmUgZXZlbnQgKi8KKyAgICB2X1U4X3QgKnN0YXR1cyAgICAvKiByZXR1cm4gdGhlIEJULUFNUCBzdGF0dXMgaGVyZSAqLworKTsKKworVk9TX1NUQVRVUworYmFwU2V0S2V5KCB2X1BWT0lEX3QgcHZvc0dDdHgsIHRDc3JSb2FtU2V0S2V5ICpwU2V0S2V5SW5mbyApOworCitpbnQgYmFwU3VwcERpc2Nvbm5lY3QodEJ0YW1wQ29udGV4dCAqY3R4KTsKK2ludCBiYXBBdXRoRGlzY29ubmVjdCh0QnRhbXBDb250ZXh0ICpjdHgpOworVk9TX1NUQVRVUyBidGFtcEVzdGFibGlzaExvZ0xpbmsocHRCdGFtcENvbnRleHQgYnRhbXBDb250ZXh0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9CQVAvc3JjL2J0YW1wRnNtX2V4dC5oIGIvQ09SRS9CQVAvc3JjL2J0YW1wRnNtX2V4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzA4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYnRhbXBGc21fZXh0LmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeSAKKyAqLworCisvKiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gYnRhbXBGc20uY2RkIC0gZG8gbm90IGVkaXQgbWFudWFsbHkqLworLyogR2VuZXJhdGVkIG9uOiBUaHUgT2N0IDE2IDE1OjQwOjM5IFBEVCAyMDA4ICovCisKKworI2lmbmRlZiBfX0JUQU1QRlNNX0VYVF9IX18KKyNkZWZpbmUgX19CVEFNUEZTTV9FWFRfSF9fCisKKy8qIEV2ZW50cyB0aGF0IGNhbiBiZSBzZW50IHRvIHRoZSBzdGF0ZS1tYWNoaW5lICovCit0eXBlZGVmIGVudW0KK3sKKyAgZVdMQU5fQkFQX1RJTUVSX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQ9MFUsCisgIGVXTEFOX0JBUF9NQUNfQ09OTkVDVF9DT01QTEVURUQKKywKKyAgZVdMQU5fQkFQX0NIQU5ORUxfU0VMRUNUSU9OX0ZBSUxFRCwKKyAgZVdMQU5fQkFQX01BQ19DT05ORUNUX0ZBSUxFRCwKKyAgZVdMQU5fQkFQX01BQ19DT05ORUNUX0lORElDQVRJT04KKywKKyAgZVdMQU5fQkFQX01BQ19LRVlfU0VUX1NVQ0NFU1MsCisgIGVXTEFOX0JBUF9IQ0lfUEhZU0lDQUxfTElOS19BQ0NFUFQsCisgIGVXTEFOX0JBUF9SU05fRkFJTFVSRSwKKyAgZVdMQU5fQkFQX01BQ19TQ0FOX0NPTVBMRVRFLAorICBlV0xBTl9CQVBfSENJX1BIWVNJQ0FMX0xJTktfQ1JFQVRFLAorICBlV0xBTl9CQVBfTUFDX1JFQURZX0ZPUl9DT05ORUNUSU9OUworLAorICBlV0xBTl9CQVBfTUFDX1NUQVJUX0JTU19TVUNDRVNTCissCisgIGVXTEFOX0JBUF9SU05fU1VDQ0VTUywKKyAgZVdMQU5fQkFQX01BQ19TVEFSVF9GQUlMUywKKyAgZVdMQU5fQkFQX0hDSV9QSFlTSUNBTF9MSU5LX0RJU0NPTk5FQ1QsCisgIGVXTEFOX0JBUF9NQUNfSU5ESUNBVEVTX01FRElBX0RJU0NPTk5FQ1RJT04sCisgIGVXTEFOX0JBUF9IQ0lfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQworLAorICBOT19NU0cKK31NRVNTQUdFX1Q7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL0JBUC9zcmMvYnRhbXBIQ0kuYyBiL0NPUkUvQkFQL3NyYy9idGFtcEhDSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmY5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvYnRhbXBIQ0kuYwpAQCAtMCwwICsxLDkzMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAgKiBcZmlsZSBidGFtcEhDSS5jCisgICoKKyAgKiBcYnJpZWYgU3RydWN0dXJlcywgZnVuY3Rpb25zICYgZGVmaW5pdGlvbnMgZm9yCisgICogd29ya2luZyB3aXRoIDgwMi4xMSBGcmFtZXMKKyAgKgorICAqCisgICogQ29weXJpZ2h0IChDKSAyMDA5IEFpcmdvIE5ldHdvcmtzLCBJbmNvcnBvcmF0ZWQuCisgICoKKyAgKgorICAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgJ2ZyYW1lc2MnCisgICogRnJpIEZlYiAyNyAxNzoyOToxOSAyMDA5IGZyb20gdGhlIGZvbGxvd2luZyBmaWxlKHMpOgorICAqCisgICogYnRhbXBIQ0kuZnJtcworICAqIAorICAqIFBMRUFTRSBET04nVCBFRElUIFRISVMgRklMRSBCWSBIQU5EIQorICAqCisgICoKKyAgKi8KKworI2lmbmRlZiBBTklfT1NfVFlQRV9PU1gKKyNpbmNsdWRlIDxtZW1vcnkuaD4gLyogRm9yIG1lbWNweSAqLworLy8jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIEZvciBfdnNucHJpbnRmICovCisjaW5jbHVkZSA8c3RkZGVmLmg+IC8qIEZvciBvZmZzZXRvZiAqLworI2VuZGlmCisKKyNkZWZpbmUgX3ZzbnByaW50ZiB2c25wcmludGYKKworI2luY2x1ZGUgInZvc19hcGkuaCIKKyNpbmNsdWRlICJidGFtcEhDSS5oIgorCisjaWYgZGVmaW5lZCAoIF9NU0NfVkVSICkKKyMgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDI0NCkKKyMgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDUwNSkKKyMgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDcwMikKKyMgICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDk5NikgLyogLi4uIHdhcyBkZWNsYXJlZCBkZXByZWNhdGVkICovCisjZW5kaWYgLyogTWljcm9zb2Z0IEMvQysrICovCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIENvbm5lY3RlZCBDaGFubmVsIGluIGFuIAorIEFNUCBBc3NvYyovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9BTVBfQVNTT0NfQ09OTl9DSF9UTFZfTUlOX0xFTiAgICAzCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIFByZWZlcmVkIENoYW5uZWwgaW4gYW4gCisgQU1QIEFzc29jKi8KKyNkZWZpbmUgV0xBTl9CQVBfUEFMX0FNUF9BU1NPQ19QUkVGX0NIX1RMVl9NSU5fTEVOICAgIDMKKworLypMZW5ndGggb2YgdGhlIHZhbHVlIGZpZWxkIGV4cGVjdGVkIGluIGEgVExWIG9mIHR5cGUgTUFDIEFkZHJlc3MqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfTUFDX0FERFJfVExWX0xFTiAgICAgICAgICAgICAgICAgNgorCisvKkxlbmd0aCBvZiB0aGUgdmFsdWUgZmllbGQgZXhwZWN0ZWQgaW4gYSBUTFYgb2YgdHlwZSBDYXBhYmlsaXRpZXMqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfQ0FQQUJJTElUSUVTX1RMVl9MRU4gICAgICAgICAgICAgNAorCisvKkxlbmd0aCBvZiB0aGUgdmFsdWUgZmllbGQgZXhwZWN0ZWQgaW4gYSBUTFYgb2YgdHlwZSBWZXJzaW9uKi8KKyNkZWZpbmUgV0xBTl9CQVBfUEFMX1ZFUlNJT05fVExWX0xFTiAgICAgICAgICAgICA1CisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIEFjY2VwdCBQaHkgTGluayovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9BQ0NfUEhZX0xJTktfVExWX01JTl9MRU4gICAgICAgICAgICAgICAzCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIEFjY2VwdCBMb2cgTGluayovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9BQ0NfTE9HX0xJTktfVExWX0xFTiAgICAgICAgICAgICAgICAgIDM3CisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIENyZWF0ZSBMb2cgTGluayovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9DUkVBVEVfTE9HX0xJTktfVExWX0xFTiAgICAgICAgICAgICAgIDM3CisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIENyZWF0ZSBQaHkgTGluayovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9DUkVBVEVfUEhZX0xJTktfVExWX01JTl9MRU4gICAgICAgICAgICAzCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIERpc2Nvbm5lY3QgTG9nIExpbmsqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfRElTQ19MT0dfTElOS19UTFZfTEVOICAgICAgICAgICAgICAgICAgMgorCisvKkxlbmd0aCBvZiB0aGUgdmFsdWUgZmllbGQgZXhwZWN0ZWQgaW4gYSBUTFYgb2YgdHlwZSBEaXNjb25uZWN0IFBoeSBMaW5rKi8KKyNkZWZpbmUgV0xBTl9CQVBfUEFMX0RJU0NfUEhZX0xJTktfVExWX0xFTiAgICAgICAgICAgICAgICAgIDIKKworLypMZW5ndGggb2YgdGhlIHZhbHVlIGZpZWxkIGV4cGVjdGVkIGluIGEgVExWIG9mIHR5cGUgRmxvdyBTcGVjIE1vZGlmeSovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9GTE9XX1NQRUNfTU9EX1RMVl9MRU4gICAgICAgICAgICAgICAgIDM0CisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIEZsdXNoKi8KKyNkZWZpbmUgV0xBTl9CQVBfUEFMX0ZMVVNIX1RMVl9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDIgCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIGVuaGFuY2VkIEZsdXNoKi8KKyNkZWZpbmUgV0xBTl9CQVBfUEFMX0VOSEFOQ0VEX0ZMVVNIX1RMVl9MRU4gICAgICAgICAgICAgICAgIDMgCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIENhbmNlbCBMb2cgTGluayovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9DQU5DRUxfTE9HX0xJTktfVExWX0xFTiAgICAgICAgICAgICAgICAyCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIFJlYWQgQmVzdCBFZmZvcnQgRmx1c2ggCisgVGltZW91dCovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9SRUFEX0JFX0ZMVVNIX1RJTUVPVVRfVExWX0xFTiAgICAgICAgICAyCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIFJlYWQgRmFpbGVkIENvbnRhY3QgCisgQ291bnRlciovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9SRUFEX0ZBSUxFRF9DT05UQUNUX0NOVF9UTFZfTEVOICAgICAgICAyCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIExpbmsgUXVhbGl0eSovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9SRUFEX0xJTktfUVVBTElUWV9UTFZfTEVOICAgICAgICAgICAgICAyCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIFJlYWQgTGluayBTdXBlcnZpc2lvbgorICBUaW1lb3V0Ki8KKyNkZWZpbmUgV0xBTl9CQVBfUEFMX1JFQURfTElOS19TVklTSVNPTl9USU1FT1VUX1RMVl9MRU4gICAgIDIKKworLypMZW5ndGggb2YgdGhlIHZhbHVlIGZpZWxkIGV4cGVjdGVkIGluIGEgVExWIG9mIHR5cGUgUmVhZCBMb2NhbCBBTVAgQXNzb2MqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfUkVBRF9MT0NBTF9BTVBfQVNTT0NfVExWX0xFTiAgICAgICAgICAgNQorCisvKkxlbmd0aCBvZiB0aGUgdmFsdWUgZmllbGQgZXhwZWN0ZWQgaW4gYSBUTFYgb2YgdHlwZSBSZWFkIFJTU0kqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfUkVBRF9SU1NJX1RMVl9MRU4gICAgICAgICAgICAgICAgICAgICAgMgorCisvKkxlbmd0aCBvZiB0aGUgdmFsdWUgZmllbGQgZXhwZWN0ZWQgaW4gYSBUTFYgb2YgdHlwZSBSZXNldCBGYWlsZWQgQ29udGFjdCAKKyBDb3VudGVyKi8KKyNkZWZpbmUgV0xBTl9CQVBfUEFMX1JFU0VUX0ZBSUxFRF9DT05UQUNUX0NOVF9UTFZfTEVOICAgICAgIDIKKworLypMZW5ndGggb2YgdGhlIHZhbHVlIGZpZWxkIGV4cGVjdGVkIGluIGEgVExWIG9mIHR5cGUgU2V0IEV2ZW50IE1hc2sqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfU0VUX0VWRU5UX01BU0tfVExWX0xFTiAgICAgICAgICAgICAgICAgOAorCisvKkxlbmd0aCBvZiB0aGUgdmFsdWUgZmllbGQgZXhwZWN0ZWQgaW4gYSBUTFYgb2YgdHlwZSBTZXQgRXZlbnQgTWFzazIqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfU0VUX0VWRU5UX01BU0syX1RMVl9MRU4gICAgICAgICAgICAgICAgOAorCisvKkxlbmd0aCBvZiB0aGUgdmFsdWUgZmllbGQgZXhwZWN0ZWQgaW4gYSBUTFYgb2YgdHlwZSBTZXQgU0hvcnQgUmFuZ2UgTW9kZSovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9TRVRfU0hPUlRfUkFOR0VfTU9ERV9UTFZfTEVOICAgICAgICAgICAyCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIFdyaXRlIEJlc3QgRWZmb3J0IEZsdXNoIAorICBUaW1lb3V0Ki8KKyNkZWZpbmUgV0xBTl9CQVBfUEFMX1dSSVRFX0JFX0ZMVVNIX1RJTUVPVVRfVExWX0xFTiAgICAgICAgIDYKKworLypMZW5ndGggb2YgdGhlIHZhbHVlIGZpZWxkIGV4cGVjdGVkIGluIGEgVExWIG9mIHR5cGUgV3JpdGUgQ29ubmVjdGlvbiBBY2NlcHQgCisgIFRpbWVvdXQqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfV1JJVEVfQ09OX0FDQ19USU1FT1VUX1RMVl9MRU4gICAgICAgICAgMgorCisvKkxlbmd0aCBvZiB0aGUgdmFsdWUgZmllbGQgZXhwZWN0ZWQgaW4gYSBUTFYgb2YgdHlwZSBXcml0ZSBGbG93IENvbnRyb2wgTW9kZSovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9XUklURV9GTE9XX0NUUkxfTU9ERV9UTFZfTEVOICAgICAgICAgICAxCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIFdyaXRlIExpbmsgU3VwZXJ2aXNpb24KKyAgVGltZW91dCovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9XUklURV9MSU5LX1NWSVNJT05fVElNRU9VVF9UTFZfTEVOICAgICA0CisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIFdyaXRlIExvY2F0aW9uIERhdGEqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfV1JJVEVfTE9DQVRJT05fREFUQV9DTURfVExWX0xFTiAgICAgICAgNQorCisvKkxlbmd0aCBvZiB0aGUgdmFsdWUgZmllbGQgZXhwZWN0ZWQgaW4gYSBUTFYgb2YgdHlwZSBXcml0ZSBMTCBBY2MgVGltZW91dCovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9XUklURV9MT0dfTElOS19BQ0NfVElNRU9VVF9UTFZfTEVOICAgICAyCisKKy8qTGVuZ3RoIG9mIHRoZSB2YWx1ZSBmaWVsZCBleHBlY3RlZCBpbiBhIFRMViBvZiB0eXBlIFdyaXRlIExvb3BiYWNrIE1vZGUqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfV1JJVEVfTE9PT1BCQUNLX01PREVfVExWX0xFTiAgICAgICAgICAgMQorCisvKkxlbmd0aCBvZiB0aGUgdmFsdWUgZmllbGQgZXhwZWN0ZWQgaW4gYSBUTFYgb2YgdHlwZSBXcml0ZSBSZW1vdGUgQU1QIEFzc29jKi8KKyNkZWZpbmUgV0xBTl9CQVBfUEFMX1dSSVRFX1JFTU9URV9BTVBfQVNTT0NfTUlOX1RMVl9MRU4gICAgIDUgCisKKy8qIEFzIHBlciBBTVAgc3BlY2lmaWNhdGlvbiAqLworLyogUmVndWxhdG9yeSBFeHRlbnNpb24gSWRlbnRpZmllciBmb3IgY2hhbm5lbCBsaXN0ICovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9SRUdfRVhUTl9JRF9WQUwgICAgICAgICAgICAgICAgICAgICAgICAyMDEKKworLyogUmVndWxhdG9yeSBDbGFzcyBmb3IgY2hhbm5lbCBsaXN0ICovCisjZGVmaW5lIFdMQU5fQkFQX1BBTF9SRUdfQ0xBU1NfVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAyNTQKKworLyogQ292ZXJhZ2UgQ2xBU1MgZm9yIGNoYW5uZWwgbGlzdCAqLworI2RlZmluZSBXTEFOX0JBUF9QQUxfQ09WRVJBR0VfQ0xBU1NfVkFMICAgICAgICAgICAgICAgICAgICAgMAorCisKKy8qIExPR0dJTkcgYW5kIFZBTElESVRZX0NIRUNLSU5HIGNvbnRyb2wgKi8KKy8vI2RlZmluZSBXTEFOX0JBUEhDSV9FTkFCTEVfVkFMSURJVFlfQ0hFQ0tJTkcKKy8vI2RlZmluZSBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdEZSQU1FU19CT09MOwordHlwZWRlZiB2b2lkICgqcGZuR2VuZXJpY190KSh2b2lkKTsKKworCit0eXBlZGVmIHN0cnVjdCBzRkZEZWZuIHsKKyAgICB2X1U4X3QgIHNpemU7CisgICAgc2l6ZV90ICAgICAgIG9mZnNldDsKKyAgICB2X1UxNl90IHNpZzsKKyAgICBwZm5HZW5lcmljX3QgcGZuOworICAgIGNvbnN0IGNoYXIgICpuYW1lOworfSB0RkZEZWZuOworCit0eXBlZGVmIHN0cnVjdCBzSUVEZWZuIHsKKyAgICB2X1U4X3QgICBlaWQ7CisgICAgdl9VMTZfdCAgbWluU2l6ZTsKKyAgICB2X1UxNl90ICBtYXhTaXplOworICAgIHNpemVfdCAgICAgICAgb2Zmc2V0OworICAgIHNpemVfdCAgICAgICAgcHJlc2VuY2VPZmZzZXQ7CisgICAgc2l6ZV90ICAgICAgICBjb3VudE9mZnNldDsKKyAgICB2X1UxNl90ICBhcnJheWJvdW5kOworICAgIHVuc2lnbmVkIGNoYXIgb3VpWzVdOworICAgIHVuc2lnbmVkIGNoYXIgbm91aTsKKyAgICB2X1UxNl90ICBzaWc7CisgICAgcGZuR2VuZXJpY190ICBwZm47CisgICAgY29uc3QgY2hhciAgICpuYW1lOworICAgIHRGUkFNRVNfQk9PTCAgZk1hbmRhdG9yeTsKK30gdElFRGVmbjsKKworI2lmICFkZWZpbmVkKGNvdW50b2YpCisjZGVmaW5lIGNvdW50b2YoeCkgKCBzaXplb2YoICh4KSApIC8gc2l6ZW9mKCAoeClbMF0gKSApCisjZW5kaWYKKworI2lmICEgZGVmaW5lZChCVEFNUF9NRU1DUFkpCisjICAgZGVmaW5lIEJUQU1QX01FTUNQWShjdHgsIGRzdCwgc3JjLCBsZW4pIFwKKyAgICAgICAgbWVtY3B5KCAoZHN0KSwgKHNyYyksIChsZW4pICkgICAgICAgIFwKKworI2VuZGlmCisKKyNpZiAhIGRlZmluZWQoQlRBTVBfTUVNQ01QKQorIyAgIGRlZmluZSBCVEFNUF9NRU1DTVAoY3R4LCBsaHMsIHJocywgbGVuKSBcCisgICAgICAgIG1lbWNtcCggKGxocyksIChyaHMpLCAobGVuKSApICAgICAgICBcCisKKyNlbmRpZgorCisjaWZuZGVmIEJUQU1QX0hBVkVfTE9HX1NFVkVSSVRJRVMKKyMgICBkZWZpbmUgRlJMT0dfT0ZGICggMCApCisjICAgZGVmaW5lIEZSTE9HUCAgICAoIDEgKQorIyAgIGRlZmluZSBGUkxPR0UgICAgKCAyICkKKyMgICBkZWZpbmUgRlJMT0dXICAgICggMyApCisjICAgZGVmaW5lIEZSTE9HMSAgICAoIDQgKQorIyAgIGRlZmluZSBGUkxPRzIgICAgKCA1ICkKKyMgICBkZWZpbmUgRlJMT0czICAgICggNiApCisjICAgZGVmaW5lIEZSTE9HNCAgICAoIDcgKQorI2VuZGlmCisKKyNkZWZpbmUgRlJGTCh4KSB4CisKKyNpZmRlZiBCVEFNUF9FTkFCTEVfTE9HR0lORworCisjaWZuZGVmIEJUQU1QX0hBVkVfTE9HX01BQ1JPUworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmbmRlZiBCVEFNUF9MT0dfR0FURQorIyAgIGRlZmluZSBCVEFNUF9MT0dfR0FURSBGUkxPR1cKKyNlbmRpZiAvLyBCVEFNUF9MT0dfR0FURQorCisjaWZkZWYgV0lOMzIKKworI2lmIGRlZmluZWQgKCBfQ09OU09MRSApIHx8IGRlZmluZWQgKCBfV0lORE9XUyApIHx8IGRlZmluZWQgKCBfRExMICkgfHwgZGVmaW5lZCAoIF9MSUIgKQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNkZWZpbmUgREJHUFJJTlQgT3V0cHV0RGVidWdTdHJpbmdBCisjZWxzZSAgLyogTm90IFVzZXIgbW9kZSAqLworI2RlZmluZSBEQkdQUklOVCBEYmdQcmludAorI2VuZGlmIC8qIFVzZXIgbW9kZSAqLworCisKKworc3RhdGljIHZvaWQgZnJhbWVzTG9nKHZvaWQgKiBwQ3R4LCBpbnQgblNldiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpscHN6Rm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCB2YWw7CisgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAoIG5TZXYgPD0gQlRBTVBfTE9HX0dBVEUgKQorICAgIHsKKyAgICAgICAgdmFfc3RhcnQodmFsLCBscHN6Rm9ybWF0KTsKKyAgICAgICAgX3ZzbnByaW50ZihidWZmZXIsIDEwMjQsIGxwc3pGb3JtYXQsIHZhbCk7CisgICAgICAgIHZhX2VuZCh2YWwpOworICAgICAgICBEQkdQUklOVChidWZmZXIpOworICAgIH0KK30KK3N0YXRpYyB2b2lkIGZyYW1lc0R1bXAodm9pZCAqIHBDdHgsIGludCBuU2V2LCB2X1U4X3QgKnBCdWYsIGludCBuQnVmKQoreworICAgIGNoYXIgYnVmZmVyWzM1XTsKKyAgICBpbnQgaSwgb2Zmc2V0OworICAgIHBDdHg7CisgICAgb2Zmc2V0ID0gMDsKKyAgICBpZiAoIG5TZXYgPiBCVEFNUF9MT0dfR0FURSApIHJldHVybjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkJ1Zi84OyArK2kpCisgICAgeworICAgICAgICBfc25wcmludGYoYnVmZmVyLCAzNSwgIiUwOHg6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgb2Zmc2V0LCAqcEJ1ZiwgKihwQnVmICsgMSksICoocEJ1ZiArIDIpLCAqKHBCdWYgKyAzKSwgKihwQnVmICsgNCksICoocEJ1ZiArIDUpLCAqKHBCdWYgKyA2KSwgKihwQnVmICsgNykpOworICAgICAgICBwQnVmICs9IDg7IG9mZnNldCArPSA4OworICAgICAgICBEQkdQUklOVChidWZmZXIpOworICAgIH0KKyAgICBfc25wcmludGYoYnVmZmVyLCAzNSwgIiUwOHg6ICIsIG9mZnNldCk7CisgICAgREJHUFJJTlQoYnVmZmVyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkJ1ZiAlIDg7ICsraSkKKyAgICB7CisgICAgICAgIF9zbnByaW50ZihidWZmZXIsIDM1LCAiJTAyeCAiLCAqcEJ1Zik7CisgICAgICAgICsrcEJ1ZjsKKyAgICAgICAgREJHUFJJTlQoYnVmZmVyKTsKKyAgICB9CisgICAgREJHUFJJTlQoIlxuIik7Cit9CisKKyNlbGlmIGRlZmluZWQgT1NfWCAvKiBOb3QgV0lOMzIgKi8KK3N0YXRpYyB2b2lkIGZyYW1lc0xvZyh2b2lkICogcEN0eCwgaW50IG5TZXYsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbHBzekZvcm1hdCwgLi4uKQorey8vIFRvIGZpbGwgaW4gd2hlbiBuZWVkZWQgdXNpbmcgSU9Mb2cKKworfQorCitzdGF0aWMgdm9pZCBmcmFtZXNEdW1wKHZvaWQgKiBwQ3R4LCBpbnQgblNldiwgdl9VOF90ICpwQnVmLCBpbnQgbkJ1ZikKK3sKK30KKworI2VsaWYgZGVmaW5lZCBMSU5VWAorCitzdGF0aWMgdm9pZCBmcmFtZXNMb2codm9pZCAqIHBDdHgsIGludCBuU2V2LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxwc3pGb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IG1hcmtlcjsKKyAgICAodm9pZClwQ3R4OworICAgIGlmICggblNldiA8PSBCVEFNUF9MT0dfR0FURSApCisgICAgeworICAgICAgICB2YV9zdGFydCggbWFya2VyLCBscHN6Rm9ybWF0ICk7CisgICAgICAgIHZwcmludGYobHBzekZvcm1hdCwgbWFya2VyKTsKKyAgICAgICAgdmFfZW5kKCBtYXJrZXIgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZyYW1lc0R1bXAodm9pZCAqIHBDdHgsIGludCBuU2V2LCB2X1U4X3QgKnBCdWYsIGludCBuQnVmKQoreworICAgIGNoYXIgYnVmZmVyWzM1XTsKKyAgICBpbnQgaSwgb2Zmc2V0OworICAgICh2b2lkKXBDdHg7CisgICAgb2Zmc2V0ID0gMDsKKyAgICBpZiAoIG5TZXYgPiBCVEFNUF9MT0dfR0FURSApIHJldHVybjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkJ1Zi84OyArK2kpCisgICAgeworICAgICAgICBwcmludGYoIiUwOHg6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgb2Zmc2V0LCAqcEJ1ZiwgKihwQnVmICsgMSksICoocEJ1ZiArIDIpLCAqKHBCdWYgKyAzKSwgKihwQnVmICsgNCksICoocEJ1ZiArIDUpLCAqKHBCdWYgKyA2KSwgKihwQnVmICsgNykpOworICAgICAgICBwQnVmICs9IDg7IG9mZnNldCArPSA4OworICAgIH0KKyAgICBwcmludGYoIiUwOHg6ICIsIG9mZnNldCk7CisgICAgZm9yIChpID0gMDsgaSA8IG5CdWYgJSA4OyArK2kpCisgICAgeworICAgICAgICBwcmludGYoIiUwMnggIiwgKnBCdWYpOworICAgICAgICArK3BCdWY7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKworI2VuZGlmIC8qIFdJTjMyICovCisKKyNkZWZpbmUgRlJBTUVTX0xPRzAoY3R4LCBzZXYsIGZtdCkgXAorICAgICBmcmFtZXNMb2coKGN0eCksIChzZXYpLCAoZm10KSk7CisjZGVmaW5lIEZSQU1FU19MT0cxKGN0eCwgc2V2LCBmbXQsIHAxKSBcCisgICAgIGZyYW1lc0xvZygoY3R4KSwgKHNldiksIChmbXQpLCAocDEpKTsKKyNkZWZpbmUgRlJBTUVTX0xPRzIoY3R4LCBzZXYsIGZtdCwgcDEsIHAyKSBcCisgICAgIGZyYW1lc0xvZygoY3R4KSwgKHNldiksIChmbXQpLCAocDEpLCAocDIpKTsKKyNkZWZpbmUgRlJBTUVTX0xPRzMoY3R4LCBzZXYsIGZtdCwgcDEsIHAyLCBwMykgXAorICAgICBmcmFtZXNMb2coKGN0eCksIChzZXYpLCAoZm10KSwgKHAxKSwgKHAyKSwgKHAzKSk7CisjZGVmaW5lIEZSQU1FU19EVU1QKGN0eCwgc2V2LCBwLCBuKSBcCisgICAgIGZyYW1lc0R1bXAoKGN0eCksIChzZXYpLCAocCksIChuKSk7CisjaWZuZGVmIEZSQU1FU19TRVZfRk9SX0ZSQU1FCisjICAgZGVmaW5lIEZSQU1FU19TRVZfRk9SX0ZSQU1FKGN0eCwgc2lnKSBGUkxPRzMKKyNlbmRpZgorCisjZW5kaWYgLyogRW5kIEJUQU1QX0hBVkVfTE9HX01BQ1JPUyAqLworCisjZWxzZSAgLy8gISBCVEFNUF9FTkFCTEVfTE9HR0lORworIyAgIGRlZmluZSBGUkFNRVNfTE9HMChjdHgsIHNldiwgZm10KQorIyAgIGRlZmluZSBGUkFNRVNfTE9HMShjdHgsIHNldiwgZm10LCBwMSkKKyMgICBkZWZpbmUgRlJBTUVTX0xPRzIoY3R4LCBzZXYsIGZtdCwgcDEsIHAyKQorIyAgIGRlZmluZSBGUkFNRVNfTE9HMyhjdHgsIHNldiwgZm10LCBwMSwgcDIsIHAzKQorIyAgIGRlZmluZSBGUkFNRVNfRFVNUChjdHgsIHNldiwgcCwgbikKKyMgICBpZm5kZWYgRlJBTUVTX1NFVl9GT1JfRlJBTUUKKyMgICAgICAgZGVmaW5lIEZSQU1FU19TRVZfRk9SX0ZSQU1FKGN0eCwgc2lnKSBGUkxPRzMKKyMgICBlbmRpZgorI2VuZGlmIC8vIEJUQU1QX0VOQUJMRV9MT0dHSU5HCisKKyNpZiBkZWZpbmVkKCBCVEFNUF9FTkFCTEVfREJHX0JSRUFLICkgJiYgZGVmaW5lZCAoIFdJTjMyICkKKyMgICBkZWZpbmUgRlJBTUVTX0RCR19CUkVBSygpIHsgX2FzbSBpbnQgMyB9CisjZWxzZQorIyAgIGRlZmluZSBGUkFNRVNfREJHX0JSRUFLKCkKKyNlbmRpZgorCisjaWYgISBkZWZpbmVkKEJUQU1QX1BBUkFNRVRFUl9DSEVDSykKKyMgICBpZiBkZWZpbmVkIChCVEFNUF9IQVZFX1dJTjMyX0FQSSkKKworIyAgICAgICBkZWZpbmUgQlRBTVBfUEFSQU1FVEVSX0NIRUNLKHBCdWYsIG5CdWYsIHBGcm0sIG5Gcm0pIFwKKyAgICAgICAgaWYgKCFwQnVmIHx8IElzQmFkUmVhZFB0cihwQnVmLCBuQnVmKSkgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7IFwKKyAgICAgICAgaWYgKCFwRnJtIHx8IElzQmFkV3JpdGVQdHIocEZybSwgbkZybSkpIHJldHVybiBCVEFNUF9CQURfT1VUUFVUX0JVRkZFUiBcCisKKyMgICAgICAgZGVmaW5lIEJUQU1QX1BBUkFNRVRFUl9DSEVDSzIocFNyYywgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCkgXAorICAgICAgICBpZiAoIXBTcmMgfHwgSXNCYWRSZWFkUHRyKHBTcmMsIDQpKSByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsgXAorICAgICAgICBpZiAoIXBCdWYgfHwgSXNCYWRXcml0ZVB0cihwQnVmLCBuQnVmKSkgcmV0dXJuIEJUQU1QX0JBRF9PVVRQVVRfQlVGRkVSOyBcCisgICAgICAgIGlmICghbkJ1ZikgcmV0dXJuIEJUQU1QX0JBRF9PVVRQVVRfQlVGRkVSOyBcCisgICAgICAgIGlmIChJc0JhZFdyaXRlUHRyKHBuQ29uc3VtZWQsIDQpKSByZXR1cm4gQlRBTVBfQkFEX09VVFBVVF9CVUZGRVIgXAorCisjICAgZWxzZQorCisjICAgICAgIGRlZmluZSBCVEFNUF9QQVJBTUVURVJfQ0hFQ0socEJ1ZiwgbkJ1ZiwgcEZybSwgbkZybSkgXAorICAgICAgICBpZiAoIXBCdWYpIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOyBcCisgICAgICAgIGlmICghcEZybSkgcmV0dXJuIEJUQU1QX0JBRF9PVVRQVVRfQlVGRkVSIFwKKworIyAgICAgICBkZWZpbmUgQlRBTVBfUEFSQU1FVEVSX0NIRUNLMihwU3JjLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkKSBcCisgICAgICAgIGlmICghcFNyYykgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7IFwKKyAgICAgICAgaWYgKCFwQnVmKSByZXR1cm4gQlRBTVBfQkFEX09VVFBVVF9CVUZGRVI7IFwKKyAgICAgICAgaWYgKCFuQnVmKSByZXR1cm4gQlRBTVBfQkFEX09VVFBVVF9CVUZGRVI7IFwKKyAgICAgICAgaWYgKCFwbkNvbnN1bWVkKSByZXR1cm4gQlRBTVBfQkFEX09VVFBVVF9CVUZGRVIgXAorCisjICAgZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBmcmFtZXNudG9ocyh2b2lkICogICAgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZfVTE2X3QgKnBPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgICpwSW4sCisgICAgICAgICAgICAgICAgICAgICAgICB0RlJBTUVTX0JPT0wgIGZNc2IpCit7CisgICAgKHZvaWQpcEN0eDsKKyMgICBpZiBkZWZpbmVkICggQlRBTVBfTElUVExFX0VORElBTl9IT1NUICkKKyAgICBpZiAoICFmTXNiICkKKyAgICB7CisgICAgICAgIEJUQU1QX01FTUNQWShwQ3R4LCAoIHZfVTE2X3QqIClwT3V0LCBwSW4sIDIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcE91dCA9ICggdl9VMTZfdCApKCAqcEluIDw8IDggKSB8ICooIHBJbiArIDEgKTsKKyAgICB9CisjICAgZWxzZQorICAgIGlmICggIWZNc2IgKQorICAgIHsKKyAgICAgICAgKnBPdXQgPSAoIHZfVTE2X3QgKSggKnBJbiB8ICggKiggcEluICsgMSApIDw8IDggKSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgKCB2X1UxNl90KiApcE91dCwgcEluLCAyKTsKKyAgICB9CisjICAgZW5kaWYKK30KKworc3RhdGljIHZvaWQgZnJhbWVzbnRvaGwodm9pZCAqICAgIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICAqcEluLAorICAgICAgICAgICAgICAgICAgICAgICAgdEZSQU1FU19CT09MICBmTXNiKQoreworICAgICh2b2lkKXBDdHg7CisjICAgaWYgZGVmaW5lZCAoIEJUQU1QX0xJVFRMRV9FTkRJQU5fSE9TVCApCisgICAgaWYgKCAhZk1zYiApCisgICAgeworICAgICAgICAqcE91dCA9ICogKCB2X1UzMl90KiApcEluOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcE91dCA9ICggdl9VMzJfdCApKCAqcEluICAgICAgICAgPDwgMjQgKSB8CisgICAgICAgICAgICAgICAgKCAqKCBwSW4gKyAxICkgPDwgMTYgKSB8CisgICAgICAgICAgICAgICAgKCAqKCBwSW4gKyAyICkgPDwgIDggKSB8CisgICAgICAgICAgICAgICAgKCAqKCBwSW4gKyAzICkgKTsKKyAgICB9CisjICAgZWxzZQorICAgIGlmICggIWZNc2IgKQorICAgIHsKKyAgICAgICAgKnBPdXQgPSAoIHZfVTMyX3QgKSggKiggcEluICsgMyApIDw8IDI0ICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICooIHBJbiArIDIgKSA8PCAxNiApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAqKCBwSW4gKyAxICkgPDwgIDggKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKiggcEluICkgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBPdXQgPSAqICggdl9VMzJfdCogKXBJbjsKKyAgICB9CisjICAgZW5kaWYKK30KKworc3RhdGljIHZvaWQgZnJhbWVzaHRvbnModm9pZCAqICAgIHBDdHgKKywgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgICpwT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdl9VMTZfdCAgcEluLAorICAgICAgICAgICAgICAgICAgICAgICAgdEZSQU1FU19CT09MICBmTXNiKQoreworICAgICh2b2lkKXBDdHg7CisjICAgaWYgZGVmaW5lZCAoIEJUQU1QX0xJVFRMRV9FTkRJQU5fSE9TVCApCisgICAgaWYgKCAhZk1zYiApCisgICAgeworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcE91dCwgJnBJbiwgMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwT3V0ICAgICAgICAgPSAoIHBJbiAmIDB4ZmYwMCApID4+IDg7CisgICAgICAgICooIHBPdXQgKyAxICkgPSBwSW4gJiAweGZmOworICAgIH0KKyMgICBlbHNlCisgICAgaWYgKCAhZk1zYiApCisgICAgeworICAgICAgICAqcE91dCAgICAgICAgID0gcEluICYgMHhmZjsKKyAgICAgICAgKiggcE91dCArIDEgKSA9ICggcEluICYgMHhmZjAwICkgPj4gODsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBPdXQsICZwSW4sIDIpOworICAgIH0KKyMgICBlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmcmFtZXNodG9ubCh2b2lkICogICAgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAgKnBPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICBwSW4sCisgICAgICAgICAgICAgICAgICAgICAgICB0RlJBTUVTX0JPT0wgIGZNc2IpCit7CisgICAgKHZvaWQpcEN0eDsKKyMgICBpZiBkZWZpbmVkICggQlRBTVBfTElUVExFX0VORElBTl9IT1NUICkKKyAgICBpZiAoICFmTXNiICkKKyAgICB7CisgICAgICAgIEJUQU1QX01FTUNQWShwQ3R4LCBwT3V0LCAmcEluLCA0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBPdXQgICAgICAgICA9ICggcEluICYgMHhmZjAwMDAwMCApID4+IDI0OworICAgICAgICAqKCBwT3V0ICsgMSApID0gKCBwSW4gJiAweDAwZmYwMDAwICkgPj4gMTY7CisgICAgICAgICooIHBPdXQgKyAyICkgPSAoIHBJbiAmIDB4MDAwMGZmMDAgKSA+PiAgODsKKyAgICAgICAgKiggcE91dCArIDMgKSA9ICggcEluICYgMHgwMDAwMDBmZiApOworICAgIH0KKyMgICBlbHNlCisgICAgaWYgKCAhZk1zYiApCisgICAgeworICAgICAgICAqKCBwT3V0ICAgICApID0gKCBwSW4gJiAweDAwMDAwMGZmICk7CisgICAgICAgICooIHBPdXQgKyAxICkgPSAoIHBJbiAmIDB4MDAwMGZmMDAgKSA+PiAgODsKKyAgICAgICAgKiggcE91dCArIDIgKSA9ICggcEluICYgMHgwMGZmMDAwMCApID4+IDE2OworICAgICAgICAqKCBwT3V0ICsgMyApID0gKCBwSW4gJiAweGZmMDAwMDAwICkgPj4gMjQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJUQU1QX01FTUNQWShwQ3R4LCBwT3V0LCAmcEluLCA0KTsKKyAgICB9CisjICAgZW5kaWYKK30KKwordHlwZWRlZiBzdHJ1Y3Qgc1RMVkRlZm4geworICAgIHZfVTMyX3QgICBpZDsKKyAgICB2X1UzMl90ICAgcGVjOworICAgIHZfVTMyX3QgICBtaW5TaXplOworICAgIHZfVTMyX3QgICBtYXhTaXplOworICAgIHNpemVfdCAgICAgICAgIG9mZnNldDsKKyAgICBzaXplX3QgICAgICAgICBwcmVzZW5jZU9mZnNldDsKKyAgICB2X1UxNl90ICAgc2lnOworICAgIHBmbkdlbmVyaWNfdCAgIHBmbjsKKyAgICBjb25zdCBjaGFyICogICBuYW1lOworICAgIHZfVThfdCAgICBmTWFuZGF0b3J5OworfSB0VExWRGVmbjsKKworc3RhdGljIHRUTFZEZWZuKiBGaW5kVExWRGVmbiggdm9pZCAqICAgIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRUTFZEZWZuICAgICAgVExWc1sgXSApCit7CisgICAgdFRMVkRlZm4gICAgKnBUbHY7CisgICAgdl9VMzJfdCAgICAgIHNUeXBlLCBzTGVuOworICAgIHZfVTMyX3QgcGVjOworICAgIHZfVTE2X3QgaWQ7CisgCisgICAgc1R5cGUgPSAxOworICAgIHNMZW4gID0gMjsKKyAKKyAgICAodm9pZClwQ3R4OworIAorICAgIGlmIChzVHlwZSA9PSAyKSAKKyAgICAgICAgZnJhbWVzbnRvaHMoIHBDdHgsICZpZCwgcEJ1ZiwgMiApOworICAgIGVsc2UgeworICAgICAgICBpZCA9ICpwQnVmOworICAgIH0KKworICAgIHBUbHYgPSAmKCBUTFZzWyAwIF0gKTsKKyAgICB3aGlsZSAoIDB4ZmZmZiAhPSBwVGx2LT5pZCApCisgICAgeworICAgICAgICBpZiAoIGlkID09IHBUbHYtPmlkICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAwID09IHBUbHYtPnBlYyApIHJldHVybiBwVGx2OworCisgICAgICAgICAgICBpZiggbkJ1ZiA+IDUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBlYyA9ICAoICggKiAoIHBCdWYgKyA0ICkgKSA8PCAxNiApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKCAoICogKCBwQnVmICsgNSApICkgPDwgIDggKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqICggcEJ1ZiArIDYgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHBlYyA9PSBwVGx2LT5wZWMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBUbHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKytwVGx2OworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdl9VMzJfdCBVbnBhY2tUbHZDb3JlKCB2b2lkICogICBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFRMVkRlZm4gICAgIFRMVnNbIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIG5Gcm0gKTsKK3N0YXRpYyB2X1UzMl90IFBhY2tUbHZDb3JlKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFRMVkRlZm4gIFRMVnNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcGlkeCk7CitzdGF0aWMgdl9VMzJfdCBHZXRQYWNrZWRTaXplVGx2Q29yZSh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbk5lZWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFRMVkRlZm4gIFRMVnNbXSk7CisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9BTVBfQVNTT0NfQ09OTl9DSF9UTFZfTUlOX0xFTiA+IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkludmFsaWQgVExWIGxlbiBvbiAlcyIsIF9fRlVOQ1RJT05fXyk7IAorI2VuZGlmICAgICAgCisgICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBQYXJzZSBUTFYgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPmNvdW50cnksIHBCdWYsIDMpOworICAgIHBCdWYgKz0gMzsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkzOworICAgIGlmICggISB0bHZsZW4gKQorICAgIHsKKyAgICAgICAgcERzdC0+bnVtX3RyaXBsZXRzID0gMFU7CisgICAgICAgIHJldHVybiAwVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogTWF4aW11bSBvZiA1IHRyaXBsZXRzIGFsbG93ZWQsIGJhc2VkIG9uIHNpemUgb2YgdHJpcGxldHMgZGVmaW5pdGlvbiAqLworICAgICAgICBpZiAodGx2bGVuIC8gMyA+IDUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRsdmxlbiA9IDE1OworICAgICAgICB9CisgICAgICAgIHBEc3QtPm51bV90cmlwbGV0cyA9ICh2X1U4X3QpKCB0bHZsZW4gLyAzICk7CisKKyAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPnRyaXBsZXRzLCBwQnVmLCAoIHRsdmxlbiApICk7CisgICAgICAgIHBCdWYgKz0gKCB0bHZsZW4gKTsKKyAgICAgICAgdGx2bGVuIC09ICggdGx2bGVuICk7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWxfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwgKCAweDAwMDEgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZBTVBfQXNzb2NfTUFDX0FkZHIodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkFNUF9Bc3NvY19NQUNfQWRkciAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9NQUNfQUREUl9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORyAgICAKKyAgICAgIC8qTG9nIGludmFsaWQgbGVuKi8KKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkludmFsaWQgVExWIGxlbiBvbiAlcyIsIF9fRlVOQ1RJT05fXyk7IAorI2VuZGlmICAgICAgCisgICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBQYXJzZSBUTFYgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBCVEFNUF9NRU1DUFkocEN0eCwgcERzdC0+bWFjX2FkZHIsIHBCdWYsIDYpOworICAgIHBCdWYgKz0gNjsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCk2OworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2QU1QX0Fzc29jX01BQ19BZGRyLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZBTVBfQXNzb2NfTUFDX0FkZHJfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZBTVBfQXNzb2NfTUFDX0FkZHIqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZBTVBfQXNzb2NfTUFDX0FkZHIgKCAweDAwMDIgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfQ0FQQUJJTElUSUVTX1RMVl9MRU4gIT0gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HICAgIAorICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5wYWxfY2FwYWJpbGl0aWVzLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDQ7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpNDsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllc190KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMgKCAweDAwMDMgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZBTVBfQXNzb2NfUEFMX1ZlcnNpb24odm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfVmVyc2lvbiAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKworICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9WRVJTSU9OX1RMVl9MRU4gIT0gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HICAgIAorICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnBhbF92ZXJzaW9uID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOyAgCisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+cGFsX0NvbXBhbnlJRCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnBhbF9zdWJ2ZXJzaW9uLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbi4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2QU1QX0Fzc29jX1BBTF9WZXJzaW9uX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9WZXJzaW9uKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2QU1QX0Fzc29jX1BBTF9WZXJzaW9uICggMHgwMDA0ICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3Qodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0ICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBUTFYgU2FuaXR5IGNoZWNrIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggV0xBTl9CQVBfUEFMX0FNUF9BU1NPQ19QUkVGX0NIX1RMVl9NSU5fTEVOID4gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HICAgIAorICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIC8qIENvbnRyeSBTdHJpbmcgLSAzIGJ5dGVzICovCisgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPmNvdW50cnksIHBCdWYsIDMpOworICAgIHBCdWYgKz0gMzsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkzOworCisgICAgaWYgKCAhIHRsdmxlbiApCisgICAgeworICAgICAgICBwRHN0LT5udW1fdHJpcGxldHMgPSAwVTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogTWF4aW11bSBvZiA1IHRyaXBsZXRzIGFsbG93ZWQsIGJhc2VkIG9uIHNpemUgb2YgdHJpcGxldHMgZGVmaW5pdGlvbiAqLworICAgICAgICBpZiAodGx2bGVuIC8gMyA+IDUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRsdmxlbiA9IDE1OworICAgICAgICB9CisgICAgICAgIHBEc3QtPm51bV90cmlwbGV0cyA9ICh2X1U4X3QpKCB0bHZsZW4gLyAzICk7CisKKyAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPnRyaXBsZXRzLCBwQnVmLCAoIHRsdmxlbiApICk7CisgICAgICAgIHBCdWYgKz0gKCB0bHZsZW4gKTsKKyAgICAgICAgdGx2bGVuIC09ICggdGx2bGVuICk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0Kik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QgKCAweDAwMDUgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZGbG93X1NwZWModm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkZsb3dfU3BlYyAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9GTE9XX1NQRUNfVExWX0xFTiAhPSB0bHZsZW4gKSAKKyAgICB7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcgCisgICAgICAvKkxvZyBpbnZhbGlkIGxlbiovCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIkludmFsaWQgVExWIGxlbiBvbiAlcyIsIF9fRlVOQ1RJT05fXyk7IAorI2VuZGlmICAgICAgCisgICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBQYXJzZSBUTFYgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5mbG93X3NwZWNfaWQgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICBwRHN0LT5zZXJ2aWNlX3R5cGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWF4X3NkdSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPnNkdV9pbnRlcl9hcnJpdmFsLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDQ7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpNDsKKyAgICBmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+YWNjZXNzX2xhdGVuY3ksIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCk0OworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5mbHVzaF90aW1lb3V0LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDQ7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpNDsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkZsb3dfU3BlYy4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2Rmxvd19TcGVjX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWRmxvd19TcGVjKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2Rmxvd19TcGVjICggMHgwMDA2ICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfQWNjZXB0X0xvZ2ljYWxfTGlua19DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX1ZBTElESVRZX0NIRUNLSU5HCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfQUNDX0xPR19MSU5LX1RMVl9MRU4gIT0gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgICAvKkxvZyBpbnZhbGlkIGxlbiovCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIkludmFsaWQgVExWIGxlbiBvbiAlcyIsIF9fRlVOQ1RJT05fXyk7IAorI2VuZGlmICAgICAgCisvLyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKyNlbmRpZgorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5waHlfbGlua19oYW5kbGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICBCVEFNUF9NRU1DUFkocEN0eCwgcERzdC0+dHhfZmxvd19zcGVjLCBwQnVmLCAxOCk7CisgICAgcEJ1ZiArPSAxODsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxODsKKyAgICBCVEFNUF9NRU1DUFkocEN0eCwgcERzdC0+cnhfZmxvd19zcGVjLCBwQnVmLCAxOCk7CisgICAgcEJ1ZiArPSAxODsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxODsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kICggMHgwMDA3ICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9BQ0NfUEhZX0xJTktfVExWX01JTl9MRU4gPiB0bHZsZW4gKSAKKyAgICB7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICAgIC8qTG9nIGludmFsaWQgbGVuKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnBoeV9saW5rX2hhbmRsZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIHBEc3QtPmtleV9sZW5ndGggPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICBwRHN0LT5rZXlfdHlwZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIGlmIChwRHN0LT5rZXlfbGVuZ3RoID4gMzIpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIEJUQU1QX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIEJUQU1QX01FTUNQWShwQ3R4LCBwRHN0LT5rZXlfbWF0ZXJpYWwsIHBCdWYsICggcERzdC0+a2V5X2xlbmd0aCApICk7CisgICAgcEJ1ZiArPSAoIHBEc3QtPmtleV9sZW5ndGggKTsKKyAgICB0bHZsZW4gLT0gKCBwRHN0LT5rZXlfbGVuZ3RoICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQgKCAweDAwMDggKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnBoeV9saW5rX2hhbmRsZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9DaGFubmVsX1NlbGVjdGVkX0V2ZW50X3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCAoIDB4MDAwOSApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Db21tYW5kX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5udW1faGNpX2NvbW1hbmRfcGFja2V0cyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jb21tYW5kX29wY29kZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgc3dpdGNoIChwRHN0LT5jb21tYW5kX29wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgMHgwYzAzOgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuUmVzZXQuc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDBjMDg6CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5GbHVzaC5zdGF0dXMgPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y2NfZXZlbnQuRmx1c2gubG9nX2xpbmtfaGFuZGxlLCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDQzYjoKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LkxvZ2ljYWxfTGlua19DYW5jZWwuc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuTG9naWNhbF9MaW5rX0NhbmNlbC5waHlfbGlua19oYW5kbGUgPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5Mb2dpY2FsX0xpbmtfQ2FuY2VsLnR4X2Zsb3dfc3BlY19pZCA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwYzA1OgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuU2V0X0V2ZW50X01hc2suc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDBjMTU6CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RPLnN0YXR1cyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RPLmNvbm5lY3Rpb25fYWNjZXB0X3RpbWVvdXQsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwYzE2OgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVE8uc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDBjMzY6CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVE8uc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmNjX2V2ZW50LlJlYWRfTGlua19TdXBlcnZpc2lvbl9UTy5sb2dfbGlua19oYW5kbGUsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVE8ubGlua19zdXBlcnZpc2lvbl90aW1lb3V0LCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MGMzNzoKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LldyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVE8uc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmNjX2V2ZW50LldyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVE8ubG9nX2xpbmtfaGFuZGxlLCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MGM2MToKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UTy5zdGF0dXMgPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y2NfZXZlbnQuUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RPLmxvZ2ljYWxfbGlua19hY2NlcHRfdGltZW91dCwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkyOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDBjNjI6CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RPLnN0YXR1cyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwYzYzOgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuU2V0X0V2ZW50X01hc2tfUGFnZV8yLnN0YXR1cyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwYzY0OgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuUmVhZF9Mb2NhdGlvbl9EYXRhLnN0YXR1cyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfTG9jYXRpb25fRGF0YS5sb2NfZG9tYWluX2F3YXJlID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPmNjX2V2ZW50LlJlYWRfTG9jYXRpb25fRGF0YS5sb2NfZG9tYWluLCBwQnVmLCAzKTsKKyAgICAgICAgICAgIHBCdWYgKz0gMzsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTM7CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5SZWFkX0xvY2F0aW9uX0RhdGEubG9jX29wdGlvbnMgPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMxNzM6CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5Xcml0ZV9Mb2NhdGlvbl9EYXRhLnN0YXR1cyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzE3NDoKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfRmxvd19Db250cm9sX01vZGUuc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuUmVhZF9GbG93X0NvbnRyb2xfTW9kZS5mbG93X2NvbnRyb2xfbW9kZSA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzE3NToKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LldyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlLnN0YXR1cyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzE3NzoKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfQkVfRmx1c2hfVE8uc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmNjX2V2ZW50LlJlYWRfQkVfRmx1c2hfVE8uYmVzdF9lZmZvcnRfZmx1c2hfdGltZW91dCwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCk0OworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzMTc4OgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuV3JpdGVfQkVfRmx1c2hfVE8uc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzMTc5OgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuU2V0X1Nob3J0X1JhbmdlX01vZGUuc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0MDk3OgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm8uc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm8uSENfSENJX1ZlcnNpb24gPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm8uSENfSENJX1JldmlzaW9uLCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5SZWFkX0xvY2FsX1ZlcnNpb25fSW5mby5IQ19QQUxfVmVyc2lvbiA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0xvY2FsX1ZlcnNpb25fSW5mby5IQ19NYW51ZmFjX05hbWUsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0xvY2FsX1ZlcnNpb25fSW5mby5IQ19QQUxfU3ViX1ZlcnNpb24sIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDA5ODoKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHMuc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPmNjX2V2ZW50LlJlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHMuSENfU3VwcG9ydF9DbWRzLCBwQnVmLCA2NCk7CisgICAgICAgICAgICBwQnVmICs9IDY0OworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQxMDE6CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5SZWFkX0J1ZmZlcl9TaXplLnN0YXR1cyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0J1ZmZlcl9TaXplLkhDX0FDTF9EYXRhX1BhY2tldF9MZW5ndGgsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfQnVmZmVyX1NpemUuSENfU0NPX1BhY2tldF9MZW5ndGggPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y2NfZXZlbnQuUmVhZF9CdWZmZXJfU2l6ZS5IQ19Ub3RhbF9OdW1fQUNMX1BhY2tldHMsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0J1ZmZlcl9TaXplLkhDX1RvdGFsX051bV9TQ09fUGFja2V0cywgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkyOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0MTA2OgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuUmVhZF9EYXRhX0Jsb2NrX1NpemUuc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmNjX2V2ZW50LlJlYWRfRGF0YV9CbG9ja19TaXplLkhDX01heF9BQ0xfRGF0YV9QYWNrZXRfTGVuZ3RoLCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y2NfZXZlbnQuUmVhZF9EYXRhX0Jsb2NrX1NpemUuSENfRGF0YV9CbG9ja19MZW5ndGgsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0RhdGFfQmxvY2tfU2l6ZS5IQ19Ub3RhbF9OdW1fRGF0YV9CbG9ja3MsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTEyMToKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlci5zdGF0dXMgPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y2NfZXZlbnQuUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyLmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkyOworICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmNjX2V2ZW50LlJlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlci5mYWlsZWRfY29udGFjdF9jb3VudGVyLCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUxMjI6CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyLnN0YXR1cyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyLmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkyOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MTIzOgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuUmVhZF9MaW5rX1F1YWxpdHkuc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmNjX2V2ZW50LlJlYWRfTGlua19RdWFsaXR5LmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkyOworICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuUmVhZF9MaW5rX1F1YWxpdHkubGlua19xdWFsaXR5ID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MTI1OgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuUmVhZF9SU1NJLnN0YXR1cyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfUlNTSS5waHlfbGlua19oYW5kbGUgPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5SZWFkX1JTU0kucnNzaSA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTEyOToKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9BTVBfSW5mby5IQ19BTVBfU3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uSENfVG90YWxfQlcsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpNDsKKyAgICAgICAgICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX01heF9HdWFyYW50ZWVkX0JXLCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTQ7CisgICAgICAgICAgICBmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9BTVBfSW5mby5IQ19NaW5fTGF0ZW5jeSwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCk0OworICAgICAgICAgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uSENfTWF4X1BEVV9TaXplLCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTQ7CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX0NvbnRyb2xsZXJfVHlwZSA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX1BBTF9DYXBhYmlsaXRpZXMsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX0FNUF9Bc3NvY19MZW5ndGgsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAgICAgICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX01heF9GbHVzaF9UaW1lb3V0LCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTQ7CisgICAgICAgICAgICBmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9BTVBfSW5mby5IQ19CRV9GbHVzaF9UaW1lb3V0LCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTQ7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUxMzA6CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5SZWFkX1JlYWRfTG9jYWxfQU1QX0Fzc29jLnN0YXR1cyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfUmVhZF9Mb2NhbF9BTVBfQXNzb2MucGh5X2xpbmtfaGFuZGxlID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmNjX2V2ZW50LlJlYWRfUmVhZF9Mb2NhbF9BTVBfQXNzb2MucmVtYWluaW5nX2xlbmd0aCwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkyOworICAgICAgICAgICAgaWYgKHBEc3QtPmNjX2V2ZW50LlJlYWRfUmVhZF9Mb2NhbF9BTVBfQXNzb2MucmVtYWluaW5nX2xlbmd0aCA+IDI0OCl7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwRHN0LT5jY19ldmVudC5SZWFkX1JlYWRfTG9jYWxfQU1QX0Fzc29jLnByZXNlbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJUQU1QX1NLSVBQRURfQkFEX0lFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcERzdC0+Y2NfZXZlbnQuUmVhZF9SZWFkX0xvY2FsX0FNUF9Bc3NvYy5BTVBfYXNzb2NfZnJhZ21lbnQsIHBCdWYsICggcERzdC0+Y2NfZXZlbnQuUmVhZF9SZWFkX0xvY2FsX0FNUF9Bc3NvYy5yZW1haW5pbmdfbGVuZ3RoICkgKTsKKyAgICAgICAgICAgIHBCdWYgKz0gKCBwRHN0LT5jY19ldmVudC5SZWFkX1JlYWRfTG9jYWxfQU1QX0Fzc29jLnJlbWFpbmluZ19sZW5ndGggKTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAoIHBEc3QtPmNjX2V2ZW50LlJlYWRfUmVhZF9Mb2NhbF9BTVBfQXNzb2MucmVtYWluaW5nX2xlbmd0aCApOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MTMxOgorICAgICAgICAgICAgcERzdC0+Y2NfZXZlbnQuV3JpdGVfUmVtb3RlX0FNUF9Bc3NvYy5zdGF0dXMgPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5Xcml0ZV9SZW1vdGVfQU1QX0Fzc29jLnBoeV9saW5rX2hhbmRsZSA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjE0NToKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LlJlYWRfTG9vcGJhY2tfTW9kZS5zdGF0dXMgPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgICAgICAgICBwRHN0LT5jY19ldmVudC5SZWFkX0xvb3BiYWNrX01vZGUubG9vcGJhY2tfbW9kZSA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjE0NjoKKyAgICAgICAgICAgIHBEc3QtPmNjX2V2ZW50LldyaXRlX0xvb3BiYWNrX01vZGUuc3RhdHVzID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9Db21tYW5kX0NvbXBsZXRlX0V2ZW50ICggMHgwMDBhICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50KHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9TdGF0dXNfRXZlbnQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnN0YXR1cyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIHBEc3QtPm51bV9oY2lfY29tbWFuZF9wYWNrZXRzID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmNvbW1hbmRfb3Bjb2RlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9Db21tYW5kX1N0YXR1c19FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50X3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50Kik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50ICggMHgwMDBiICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX1ZBTElESVRZX0NIRUNLSU5HCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfQ1JFQVRFX0xPR19MSU5LX1RMVl9MRU4gIT0gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HICAgIAorICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorLy8gICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisjZW5kaWYgCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+cGh5X2xpbmtfaGFuZGxlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPnR4X2Zsb3dfc3BlYywgcEJ1ZiwgMTgpOworICAgIHBCdWYgKz0gMTg7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTg7CisgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPnJ4X2Zsb3dfc3BlYywgcEJ1ZiwgMTgpOworICAgIHBCdWYgKz0gMTg7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTg7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9DcmVhdGVfTG9naWNhbF9MaW5rX0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9DcmVhdGVfTG9naWNhbF9MaW5rX0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9DcmVhdGVfTG9naWNhbF9MaW5rX0NtZCAoIDB4MDAwYyApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfQ1JFQVRFX1BIWV9MSU5LX1RMVl9NSU5fTEVOID4gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HICAgIAorICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+cGh5X2xpbmtfaGFuZGxlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgcERzdC0+a2V5X2xlbmd0aCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIHBEc3QtPmtleV90eXBlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgaWYgKHBEc3QtPmtleV9sZW5ndGggPiAzMil7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gQlRBTVBfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPmtleV9tYXRlcmlhbCwgcEJ1ZiwgKCBwRHN0LT5rZXlfbGVuZ3RoICkgKTsKKyAgICBwQnVmICs9ICggcERzdC0+a2V5X2xlbmd0aCApOworICAgIHRsdmxlbiAtPSAoIHBEc3QtPmtleV9sZW5ndGggKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCAoIDB4MDAwZCApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50ICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5saW5rX3R5cGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50X3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50Kik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50ICggMHgwMDBlICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9ESVNDX0xPR19MSU5LX1RMVl9MRU4gIT0gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgICAvKkxvZyBpbnZhbGlkIGxlbiovCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIkludmFsaWQgVExWIGxlbiBvbiAlcyIsIF9fRlVOQ1RJT05fXyk7IAorI2VuZGlmICAgICAgCisgICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBQYXJzZSBUTFYgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bG9nX2xpbmtfaGFuZGxlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZCAoIDB4MDAwZiApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5zdGF0dXMgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bG9nX2xpbmtfaGFuZGxlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICBwRHN0LT5yZWFzb24gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50X3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50Kik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICggMHgwMDEwICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBUTFYgU2FuaXR5IGNoZWNrIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9WQUxJRElUWV9DSEVDS0lORworICAgIGlmICggV0xBTl9CQVBfUEFMX0RJU0NfUEhZX0xJTktfVExWX0xFTiAhPSB0bHZsZW4gKSAKKyAgICB7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICAgIC8qTG9nIGludmFsaWQgbGVuKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKy8vICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorI2VuZGlmICAgICAgCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBQYXJzZSBUTFYgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5waHlfbGlua19oYW5kbGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICBwRHN0LT5yZWFzb24gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWQgKCAweDAwMTEgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnN0YXR1cyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIHBEc3QtPnBoeV9saW5rX2hhbmRsZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIHBEc3QtPnJlYXNvbiA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICggMHgwMDEyICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfRkxPV19TUEVDX01PRF9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgcERzdC0+YmVfYWdncl9jb3VudGVyID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPnR4X2Zsb3dfc3BlYywgcEJ1ZiwgMTgpOworICAgIHBCdWYgKz0gMTg7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTg7CisgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPnJ4X2Zsb3dfc3BlYywgcEJ1ZiwgMTgpOworICAgIHBCdWYgKz0gMTg7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTg7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCAoIDB4MDAxMyApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NvbXBsZXRlX0V2ZW50KHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+c3RhdHVzID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NvbXBsZXRlX0V2ZW50ICggMHgwMDE0ICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0ZsdXNoX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX0ZsdXNoX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9GTFVTSF9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfRmx1c2hfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfRmx1c2hfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX0ZsdXNoX0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9GbHVzaF9DbWQgKCAweDAwMTUgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCAoIDB4MDAxNiApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIEJUQU1QX01FTUNQWShwQ3R4LCBwRHN0LT5iZF9hZGRyLCBwQnVmLCA2KTsKKyAgICBwQnVmICs9IDY7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpNjsKKyAgICBCVEFNUF9NRU1DUFkocEN0eCwgcERzdC0+Z2VuZXJpY19hbXBfbGlua19rZXksIHBCdWYsIDMyKTsKKyAgICBwQnVmICs9IDMyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTMyOworICAgIHBEc3QtPmtleV90eXBlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50X3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQgKCAweDAwMTcgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+aGFyZHdhcmVfY29kZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQgKCAweDAwMTggKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9DQU5DRUxfTE9HX0xJTktfVExWX0xFTiAhPSB0bHZsZW4gKSAKKyAgICB7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICAgIC8qTG9nIGludmFsaWQgbGVuKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnBoeV9saW5rX2hhbmRsZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIHBEc3QtPnR4X2Zsb3dfc3BlY19pZCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX0xvZ2ljYWxfTGlua19DYW5jZWxfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQgKCAweDAwMTkgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5zdGF0dXMgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bG9nX2xpbmtfaGFuZGxlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICBwRHN0LT5waHlfbGlua19oYW5kbGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50Kik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCAoIDB4MDAxYSApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50KHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPmhjaV9jb21tYW5kX3BhY2tldCwgcEJ1ZiwgNjQpOworICAgIHBCdWYgKz0gNjQ7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpNjQ7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50ICggMHgwMDFiICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5zdGF0dXMgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICBwRHN0LT5waHlfbGlua19oYW5kbGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50Kik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgKCAweDAwMWMgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+cGh5X2xpbmtfaGFuZGxlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgcERzdC0+cmVhc29uID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudCAoIDB4MDAxZCApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50KHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+cGh5X2xpbmtfaGFuZGxlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50ICggMHgwMDFlICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1Fvc19WaW9sYXRpb25fRXZlbnQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50ICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bG9nX2xpbmtfaGFuZGxlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfUW9zX1Zpb2xhdGlvbl9FdmVudF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50Kik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1Fvc19WaW9sYXRpb25fRXZlbnQgKCAweDAwMWYgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfUkVBRF9CRV9GTFVTSF9USU1FT1VUX1RMVl9MRU4gIT0gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgICAvKkxvZyBpbnZhbGlkIGxlbiovCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIkludmFsaWQgVExWIGxlbiBvbiAlcyIsIF9fRlVOQ1RJT05fXyk7IAorI2VuZGlmICAgICAgCisgICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBQYXJzZSBUTFYgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bG9nX2xpbmtfaGFuZGxlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQgKCAweDAwMjAgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCAoIDB4MDAyMSApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1JlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kICggMHgwMDIyICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9EYXRhX0Jsb2NrX1NpemVfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfUmVhZF9EYXRhX0Jsb2NrX1NpemVfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQgKCAweDAwMjMgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfUkVBRF9GQUlMRURfQ09OVEFDVF9DTlRfVExWX0xFTiAhPSB0bHZsZW4gKSAKKyAgICB7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICAgIC8qTG9nIGludmFsaWQgbGVuKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5sb2dfbGlua19oYW5kbGUsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkyOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCAoIDB4MDAyNCApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kICggMHgwMDI1ICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9SRUFEX0xJTktfUVVBTElUWV9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9SZWFkX0xpbmtfUXVhbGl0eV9DbWQgKCAweDAwMjYgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBUTFYgU2FuaXR5IGNoZWNrIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggV0xBTl9CQVBfUEFMX1JFQURfTElOS19TVklTSVNPTl9USU1FT1VUX1RMVl9MRU4gIT0gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgICAvKkxvZyBpbnZhbGlkIGxlbiovCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIkludmFsaWQgVExWIGxlbiBvbiAlcyIsIF9fRlVOQ1RJT05fXyk7IAorI2VuZGlmICAgICAgCisgICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBQYXJzZSBUTFYgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bG9nX2xpbmtfaGFuZGxlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCAoIDB4MDAyNyApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xvY2FsX0FNUF9Bc3NvY19DbWQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9Bc3NvY19DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIkludmFsaWQgVExWIGxlbiBvbiAlcy4gdGx2bGVuPSVkLiIsIF9fRlVOQ1RJT05fXywgdGx2bGVuKTsgCisKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfVkFMSURJVFlfQ0hFQ0tJTkcKKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9SRUFEX0xPQ0FMX0FNUF9BU1NPQ19UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorLy8gICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisjZW5kaWYgICAgICAKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnBoeV9saW5rX2hhbmRsZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5sZW5ndGhfc29fZmFyLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWF4X3JlbW90ZV9hbXBfYXNzb2NfbGVuZ3RoLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xvY2FsX0FNUF9Bc3NvY19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9SZWFkX0xvY2FsX0FNUF9Bc3NvY19DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCAoIDB4MDAyOCApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZCAoIDB4MDAyOSApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kICggMHgwMDJhICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9SZWFkX0xvY2FsX1ZlcnNpb25fSW5mb19DbWQgKCAweDAwMmIgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9SZWFkX0xvY2F0aW9uX0RhdGFfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCAoIDB4MDAyYyApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1JlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kICggMHgwMDJkICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQgKCAweDAwMmUgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9SU1NJX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1JlYWRfUlNTSV9DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfUkVBRF9SU1NJX1RMVl9MRU4gIT0gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgICAvKkxvZyBpbnZhbGlkIGxlbiovCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIkludmFsaWQgVExWIGxlbiBvbiAlcyIsIF9fRlVOQ1RJT05fXyk7IAorI2VuZGlmICAgICAgCisgICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBQYXJzZSBUTFYgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bG9nX2xpbmtfaGFuZGxlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9SZWFkX1JTU0lfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfUmVhZF9SU1NJX0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9SZWFkX1JTU0lfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1JlYWRfUlNTSV9DbWQgKCAweDAwMmYgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfUmVzZXRfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfUmVzZXRfQ21kICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9SZXNldF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9SZXNldF9DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfUmVzZXRfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1Jlc2V0X0NtZCAoIDB4MDAzMCApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBUTFYgU2FuaXR5IGNoZWNrIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggV0xBTl9CQVBfUEFMX1JFU0VUX0ZBSUxFRF9DT05UQUNUX0NOVF9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfUmVzZXRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCAoIDB4MDAzMSApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19DbWQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9TZXRfRXZlbnRfTWFza19DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfU0VUX0VWRU5UX01BU0tfVExWX0xFTiAhPSB0bHZsZW4gKSAKKyAgICB7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICAgIC8qTG9nIGludmFsaWQgbGVuKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIEJUQU1QX01FTUNQWShwQ3R4LCBwRHN0LT5ldmVudF9tYXNrLCBwQnVmLCA4KTsKKyAgICBwQnVmICs9IDg7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpODsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1NldF9FdmVudF9NYXNrX0NtZCAoIDB4MDAzMiApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19QYWdlXzJfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMuIHRsdmxlbj0lZC4iLCBfX0ZVTkNUSU9OX18sIHRsdmxlbik7IAorI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9WQUxJRElUWV9DSEVDS0lORworICAgIGlmICggV0xBTl9CQVBfUEFMX1NFVF9FVkVOVF9NQVNLMl9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorLy8gICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisjZW5kaWYgICAgICAKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIEJUQU1QX01FTUNQWShwQ3R4LCBwRHN0LT5ldmVudF9tYXNrX3BhZ2VfMiwgcEJ1ZiwgOCk7CisgICAgcEJ1ZiArPSA4OworICAgIHRsdmxlbiAtPSAodl9VOF90KTg7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19QYWdlXzJfQ21kICggMHgwMDMzICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9TRVRfU0hPUlRfUkFOR0VfTU9ERV9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+cGh5X2xpbmtfaGFuZGxlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgcERzdC0+c2hvcnRfcmFuZ2VfbW9kZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9TZXRfU2hvcnRfUmFuZ2VfTW9kZV9DbWQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kICggMHgwMDM0ICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGVfRXZlbnQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnN0YXR1cyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIHBEc3QtPnBoeV9saW5rX2hhbmRsZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkxOworICAgIHBEc3QtPnNob3J0X3JhbmdlX21vZGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9TaG9ydF9SYW5nZV9Nb2RlX0NoYW5nZV9Db21wbGV0ZV9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50X3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50Kik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50ICggMHgwMDM1ICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfV1JJVEVfQkVfRkxVU0hfVElNRU9VVF9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmJlc3RfZWZmb3J0X2ZsdXNoX3RpbWVvdXQsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCk0OworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQgKCAweDAwMzYgKQorCisKK3ZfVTMyX3QgYnRhbXBVbnBhY2tUbHZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQodm9pZCAqIHBDdHgsIHZfVThfdCAqcEJ1Ziwgdl9VMTZfdCB0bHZsZW4sIHRCdGFtcFRMVkhDSV9Xcml0ZV9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9XUklURV9DT05fQUNDX1RJTUVPVVRfVExWX0xFTiAhPSB0bHZsZW4gKSAKKyAgICB7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICAgIC8qTG9nIGludmFsaWQgbGVuKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jb25uZWN0aW9uX2FjY2VwdF90aW1lb3V0LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kICggMHgwMDM3ICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9XUklURV9GTE9XX0NUUkxfTU9ERV9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+Zmxvd19jb250cm9sX21vZGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCAoIDB4MDAzOCApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfV1JJVEVfTElOS19TVklTSU9OX1RJTUVPVVRfVExWX0xFTiAhPSB0bHZsZW4gKSAKKyAgICB7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICAgIC8qTG9nIGludmFsaWQgbGVuKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5sb2dfbGlua19oYW5kbGUsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkyOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5saW5rX3N1cGVydmlzaW9uX3RpbWVvdXQsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkyOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCAoIDB4MDAzOSApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBUTFYgU2FuaXR5IGNoZWNrIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggV0xBTl9CQVBfUEFMX1dSSVRFX0xPQ0FUSU9OX0RBVEFfQ01EX1RMVl9MRU4gIT0gdGx2bGVuICkgCisgICAgeworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgICAvKkxvZyBpbnZhbGlkIGxlbiovCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIkludmFsaWQgVExWIGxlbiBvbiAlcyIsIF9fRlVOQ1RJT05fXyk7IAorI2VuZGlmICAgICAgCisgICAgICByZXR1cm4gQlRBTVBfSU5WQUxJRF9UTFZfTEVOR1RIOyAKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBQYXJzZSBUTFYgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5sb2NfZG9tYWluX2F3YXJlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBEc3QtPmxvY19kb21haW4sIHBCdWYsIDMpOworICAgIHBCdWYgKz0gMzsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkzOworICAgIHBEc3QtPmxvY19vcHRpb25zID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZCAoIDB4MDAzYSApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9XUklURV9MT0dfTElOS19BQ0NfVElNRU9VVF9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmxvZ2ljYWxfbGlua19hY2NlcHRfdGltZW91dCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBVbnBhY2tUbHZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kICggMHgwMDNiICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfV1JJVEVfTE9PT1BCQUNLX01PREVfVExWX0xFTiAhPSB0bHZsZW4gKSAKKyAgICB7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICAgIC8qTG9nIGludmFsaWQgbGVuKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiSW52YWxpZCBUTFYgbGVuIG9uICVzIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgICAgICAKKyAgICAgIHJldHVybiBCVEFNUF9JTlZBTElEX1RMVl9MRU5HVEg7IAorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBhcnNlIFRMViAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPmxvb3BiYWNrX21vZGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuVW5wYWNrVGx2SENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kX3QpKHZvaWQgKiwgdl9VOF90Kiwgdl9VMTZfdCwgdEJ0YW1wVExWSENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kICggMHgwMDNjICkKKworCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kKHZvaWQgKiBwQ3R4LCB2X1U4X3QgKnBCdWYsIHZfVTE2X3QgdGx2bGVuLCB0QnRhbXBUTFZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQgKnBEc3QpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFRMViBTYW5pdHkgY2hlY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX0JBUF9QQUxfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQ19NSU5fVExWX0xFTiA+IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+cGh5X2xpbmtfaGFuZGxlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodl9VOF90KTE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmxlbmd0aF9zb19mYXIsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICB0bHZsZW4gLT0gKHZfVThfdCkyOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5hbXBfYXNzb2NfcmVtYWluaW5nX2xlbmd0aCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgaWYgKHBEc3QtPmFtcF9hc3NvY19yZW1haW5pbmdfbGVuZ3RoID4gMjQ4KXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBCVEFNUF9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBCVEFNUF9NRU1DUFkocEN0eCwgcERzdC0+YW1wX2Fzc29jX2ZyYWdtZW50LCBwQnVmLCAoIHBEc3QtPmFtcF9hc3NvY19yZW1haW5pbmdfbGVuZ3RoICkgKTsKKyAgICBwQnVmICs9ICggcERzdC0+YW1wX2Fzc29jX3JlbWFpbmluZ19sZW5ndGggKTsKKyAgICB0bHZsZW4gLT0gKCBwRHN0LT5hbXBfYXNzb2NfcmVtYWluaW5nX2xlbmd0aCApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5VbnBhY2tUbHZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQqKTsKKworI2RlZmluZSBTaWdVbnBhY2tUbHZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQgKCAweDAwM2QgKQorCit2X1UzMl90IGJ0YW1wVW5wYWNrVGx2SENJX0VuaGFuY2VkX0ZsdXNoX0NtZCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NtZCAqcERzdCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpdGx2bGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVExWIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoIFdMQU5fQkFQX1BBTF9FTkhBTkNFRF9GTFVTSF9UTFZfTEVOICE9IHRsdmxlbiApIAorICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgLypMb2cgaW52YWxpZCBsZW4qLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJJbnZhbGlkIFRMViBsZW4gb24gJXMiLCBfX0ZVTkNUSU9OX18pOyAKKyNlbmRpZiAgICAgIAorICAgICAgcmV0dXJuIEJUQU1QX0lOVkFMSURfVExWX0xFTkdUSDsgCisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGFyc2UgVExWIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmxvZ19saW5rX2hhbmRsZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodl9VOF90KTI7CisgICAgcERzdC0+cGFja2V0X3R5cGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9FbmhhbmNlZF9GbHVzaF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9FbmhhbmNlZF9GbHVzaF9DbWRfdCkodm9pZCAqLCB2X1U4X3QqLCB2X1UxNl90LCB0QnRhbXBUTFZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kKik7CisKKyNkZWZpbmUgU2lnVW5wYWNrVGx2SENJX0VuaGFuY2VkX0ZsdXNoX0NtZCAoIDB4MDAzZSApCisKKwordl9VMzJfdCBidGFtcFVucGFja1RsdkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZV9FdmVudCh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UxNl90IHRsdmxlbiwgdEJ0YW1wVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50ICpwRHN0KQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bG9nX2xpbmtfaGFuZGxlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh2X1U4X3QpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFVucGFja1RsdkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZWRfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblVucGFja1RsdkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZV9FdmVudF90KSh2b2lkICosIHZfVThfdCosIHZfVTE2X3QsIHRCdGFtcFRMVkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZV9FdmVudCopOworCisjZGVmaW5lIFNpZ1VucGFja1RsdkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZV9FdmVudCAoIDB4MDAzZiApCisKKwordl9VMzJfdCBidGFtcFVucGFja0FNUF9BU1NPQyh2b2lkICogcEN0eCwgdl9VOF90ICpwQnVmLCB2X1UzMl90IG5CdWYsIHRCdGFtcEFNUF9BU1NPQyAqcEZybSkKK3sKKyAgICB2X1UzMl90IGk7CisgICAgc3RhdGljIHRUTFZEZWZuIFRMVlNbIF0gPSB7CisgICAgICAgIHtCVEFNUF9UTFZfQU1QX0FTU09DX01BQ19BRERSLCAwLCA5LCA5LCBvZmZzZXRvZih0QnRhbXBBTVBfQVNTT0MsIEFNUF9Bc3NvY19NQUNfQWRkciksIG9mZnNldG9mKHRCdGFtcFRMVkFNUF9Bc3NvY19NQUNfQWRkciwgcHJlc2VudCksIFNpZ1VucGFja1RsdkFNUF9Bc3NvY19NQUNfQWRkciwgKHBmbkdlbmVyaWNfdClidGFtcFVucGFja1RsdkFNUF9Bc3NvY19NQUNfQWRkciwgIkFNUF9Bc3NvY19NQUNfQWRkciIsIDEsIH0sCisgICAgICAgIHtCVEFNUF9UTFZfQU1QX0FTU09DX1BSRUZFUlJFRF9DSEFOTkVMX0xJU1QsIDAsIDksIDB4RkYvKjEyKi8sIG9mZnNldG9mKHRCdGFtcEFNUF9BU1NPQywgQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QpLCBvZmZzZXRvZih0QnRhbXBUTFZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdCwgcHJlc2VudCksIFNpZ1VucGFja1RsdkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LCAocGZuR2VuZXJpY190KWJ0YW1wVW5wYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QsICJBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdCIsIDEsIH0sCisgICAgICAgIHtCVEFNUF9UTFZfQU1QX0FTU09DX0NPTk5FQ1RFRF9DSEFOTkVMLCAwLCA5LCAweEZGLyoxMiovLCBvZmZzZXRvZih0QnRhbXBBTVBfQVNTT0MsIEFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCksIG9mZnNldG9mKHRCdGFtcFRMVkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCwgcHJlc2VudCksIFNpZ1VucGFja1RsdkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCwgKHBmbkdlbmVyaWNfdClidGFtcFVucGFja1RsdkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCwgIkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCIsIDAsIH0sCisgICAgICAgIHtCVEFNUF9UTFZfQU1QX0FTU09DX1BBTF9DQVBBQklMSVRJRVMsIDAsIDcsIDcsIG9mZnNldG9mKHRCdGFtcEFNUF9BU1NPQywgQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMpLCBvZmZzZXRvZih0QnRhbXBUTFZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcywgcHJlc2VudCksIFNpZ1VucGFja1RsdkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzLCAocGZuR2VuZXJpY190KWJ0YW1wVW5wYWNrVGx2QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMsICJBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyIsIDAsIH0sCisgICAgICAgIHtCVEFNUF9UTFZfQU1QX0FTU09DX1BBTF9WRVJTSU9OLCAwLCA4LCA4LCBvZmZzZXRvZih0QnRhbXBBTVBfQVNTT0MsIEFNUF9Bc3NvY19QQUxfVmVyc2lvbiksIG9mZnNldG9mKHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfVmVyc2lvbiwgcHJlc2VudCksIFNpZ1VucGFja1RsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbiwgKHBmbkdlbmVyaWNfdClidGFtcFVucGFja1RsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbiwgIkFNUF9Bc3NvY19QQUxfVmVyc2lvbiIsIDEsIH0sCisgICAgeyAweGZmZmYsIDAgfSwKKyAgICB9OworCisgICAgdl9VMzJfdCBzdGF0dXMgPSAwOworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICJJbiBidGFtcFVucGFja0FNUF9BU1NPQy4gbkJ1ZiAtICVkXG4iLCBuQnVmKTsgCisjZW5kaWYgICAgCisKKyAgICBzdGF0dXMgfD0gVW5wYWNrVGx2Q29yZShwQ3R4LHBCdWYsbkJ1ZixUTFZTLCh2X1U4X3QqKXBGcm0sc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIEJUQU1QX0RVTVBfRlJBTUVTCisgICAgaWYgKCFCVEFNUF9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIEZSRkwoIlVucGFja2VkIHRoZSBBTVBfQVNTT0M6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgRlJGTCgiQU1QX0Fzc29jX01BQ19BZGRyOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFNUF9Bc3NvY19NQUNfQWRkci5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksICggdl9VOF90KiApJnBGcm0tPkFNUF9Bc3NvY19NQUNfQWRkci5tYWNfYWRkciwgNik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgRlJGTCgiQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3Q6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCAoIHZfVThfdCogKSZwRnJtLT5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC5jb3VudHJ5LCAzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIEZSRkwoIm51bV90cmlwbGV0czogJWQuXG4iKSwgcEZybS0+QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QubnVtX3RyaXBsZXRzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksICggdl9VOF90KiApIHBGcm0tPkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LnRyaXBsZXRzLCAzICogcEZybS0+QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QubnVtX3RyaXBsZXRzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCBGUkZMKCJBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWw6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgKCB2X1U4X3QqICkmcEZybS0+QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLmNvdW50cnksIDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgRlJGTCgibnVtX3RyaXBsZXRzOiAlZC5cbiIpLCBwRnJtLT5BTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwubnVtX3RyaXBsZXRzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksICggdl9VOF90KiApIHBGcm0tPkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbC50cmlwbGV0cywgMyAqIHBGcm0tPkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbC5udW1fdHJpcGxldHMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIEZSRkwoIkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgKCB2X1U4X3QqICkmcEZybS0+QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMucGFsX2NhcGFiaWxpdGllcywgNCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgRlJGTCgiQU1QX0Fzc29jX1BBTF9WZXJzaW9uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFNUF9Bc3NvY19QQUxfVmVyc2lvbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksICggdl9VOF90KiApJnBGcm0tPkFNUF9Bc3NvY19QQUxfVmVyc2lvbi5wYWxfdmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCAoIHZfVThfdCogKSZwRnJtLT5BTVBfQXNzb2NfUEFMX1ZlcnNpb24ucGFsX0NvbXBhbnlJRCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCAoIHZfVThfdCogKSZwRnJtLT5BTVBfQXNzb2NfUEFMX1ZlcnNpb24ucGFsX3N1YnZlcnNpb24sIDIpOworICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIEJUQU1QX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgYnRhbXBVbnBhY2tBTVBfQVNTT0MuICovCisKK3N0YXRpYyB2X1UzMl90IFVucGFja1RsdkNvcmUoIHZvaWQgKiAgIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0VExWRGVmbiAgICAgVExWc1sgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgbkZybSApCit7CisgICAgdFRMVkRlZm4gKnBUbHY7CisgICAgdl9VMzJfdCAgICAgIG5CdWZSZW1haW5pbmcsIHN0YXR1cywgc3RhdHVzMiwgbnBlYzsKKyAgICB2X1UzMl90ICAgICAgc1R5cGUsIHNMZW47CisgICAgdl9VMTZfdCAgICAgIGlkLCBsZW47CisgICAgdl9VOF90ICAgICAgKnBCdWZSZW1haW5pbmcsICpwZkZvdW5kOworCisgICAgKHZvaWQpcEN0eDsgICAgICAgICAgICAgICAgIC8vIFNodXR1cCB0aGUgY29tcGlsZXIKKyAgICAodm9pZCluRnJtOworICAgIHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgc3RhdHVzMiA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgcEJ1ZlJlbWFpbmluZyA9IHBCdWY7CisgICAgbkJ1ZlJlbWFpbmluZyA9IG5CdWY7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgIkluIFVucGFja1RsdkNvcmUsIG5CdWZSZW1haW5pbmcgLSAlZFxuIiwgbkJ1ZlJlbWFpbmluZyk7IAorI2VuZGlmICAgIAorCisgICAgLy8gV2hpbGUgd2UgaGF2ZSBkYXRhLi4uCisgICAgd2hpbGUgKCBuQnVmUmVtYWluaW5nICkKKyAgICB7CisgICAgICAgIGlmICggMyA+IG5CdWZSZW1haW5pbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMCggcEN0eCwgRlJMT0dFLCBGUkZMKCAiVGhpcyBmcmFtZSByZXBvcnRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZmV3ZXIgdGhyZWUgYnl0ZShzKSByZW1haW5pbmcuXG4iICkgKTsKKyAgICAgICAgICAgIHN0YXR1cyB8PSBCVEFNUF9JTkNPTVBMRVRFX1RMVjsKKyAgICAgICAgICAgIEZSQU1FU19EQkdfQlJFQUsoKTsKKyAgICAgICAgICAgIGdvdG8gTWFuZGF0b3J5Q2hlY2s7CisgICAgICAgIH0KKworICAgICAgICBucGVjID0gMFU7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiQ2FsbGluZyBGaW5kVExWRGVmbi4uLlxuIiwgbkJ1ZlJlbWFpbmluZyk7IAorI2VuZGlmCisKKyAgICAgICAgLy8gTG9vayBmb3IgYSBtYXRjaGluZyBUTFYgZGVmaW5pdGlvbiwKKyAgICAgICAgcFRsdiA9IEZpbmRUTFZEZWZuKCBwQ3R4LCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCBUTFZzICk7CisgICAgICAgIHNUeXBlID0gMTsKKyAgICAgICAgc0xlbiAgPSAyOworICAgICAgICAvLyBjb25zdW1lIHRoZSB0eXBlLAorICAgICAgICBpZiAoc1R5cGUgPT0gMikgCisgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmaWQsIHBCdWZSZW1haW5pbmcsIDEpOworICAgICAgICBlbHNlIHsgCisgICAgICAgICAgICBpZCA9ICpwQnVmUmVtYWluaW5nOyAKKyAgICAgICAgfQorICAgICAgICBwQnVmUmVtYWluaW5nICs9IHNUeXBlOworICAgICAgICBuQnVmUmVtYWluaW5nIC09IHNUeXBlOworICAgICAgICAvLyAmIGxlbmd0aCwKKyAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJmxlbiwgcEJ1ZlJlbWFpbmluZywgMSk7CisgICAgICAgIHBCdWZSZW1haW5pbmcgKz0gc0xlbjsKKyAgICAgICAgbkJ1ZlJlbWFpbmluZyAtPSBzTGVuOworCisgICAgICAgIGlmICggcFRsdiAmJiBwVGx2LT5wZWMgKQorICAgICAgICB7CisgICAgICAgICAgICBucGVjID0gM1U7CisgICAgICAgICAgICBpZiAoIDMgPiBuQnVmUmVtYWluaW5nICkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiMyA+IG5CdWZSZW1haW5pbmdcbiIpOyAKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzIocEN0eCwgRlJMT0dXLCBGUkZMKCJUTFYgJWQgcmVwb3J0cyBsZW5ndGgiCisgICAgICAgICAgICAgICAgICAgICIlZCwgYnV0IGl0IGhhcyBhIFByaXZhdGUgRW50ZXJwcmlzZSBDb2RlICgzIGJ5dGUiCisgICAgICAgICAgICAgICAgICAgICJzLlxuIiksIGlkLCBsZW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSTE9HMSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzIocEN0eCwgRlJMT0cxLCBGUkZMKCJXZSd2ZSBwYXJzZWQgJWQgYnl0ZXMiCisgICAgICAgICAgICAgICAgICAgICJvZiB0aGlzIGJ1ZmZlciwgYW5kIHNob3cgJWQgbGVmdC5cbiIpLAorICAgICAgICAgICAgICAgIHBCdWZSZW1haW5pbmcgLSBwQnVmLCBuQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgfD0gQlRBTVBfSU5DT01QTEVURV9UTFY7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RCR19CUkVBSygpOworICAgICAgICAgICAgICAgIGdvdG8gTWFuZGF0b3J5Q2hlY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQnVmUmVtYWluaW5nICs9IDM7CisgICAgICAgICAgICBuQnVmUmVtYWluaW5nIC09IDM7CisgICAgICAgICAgICBsZW4gICAgICAgICAgIC09IDM7CisgICAgICAgIH0KKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICJMZW4gLSAlZCBuQnVmUmVtYWluaW5nIC0gJWRcbiIsIGxlbiwgbkJ1ZlJlbWFpbmluZyk7IAorI2VuZGlmCisKKyAgICAgICAgLy8gV2hldGhlciB3ZSBmb3VuZCBhIGhpdCBvciBub3QsIHdlIGNhbiB2YWxpZGF0ZSB0aGUgcmVwb3J0ZWQKKyAgICAgICAgLy8gbGVuZ3RoIG9mIHRoaXMgVExWOgorICAgICAgICBpZiAoIGxlbiA+IG5CdWZSZW1haW5pbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMyhwQ3R4LCBGUkxPR1csIEZSRkwoIlRMViAlZCByZXBvcnRzIGxlbmd0aCAlIgorICAgICAgICAgICAgICAgICJkLCBidXQgdGhlcmUgYXJlIG9ubHkgJWQgYnl0ZXMgcmVtYWluaW5nIGluIHRoaXMgZiIKKyAgICAgICAgICAgICAgICAicmFtZS5cbiIpLCBpZCwgbGVuLCBuQnVmUmVtYWluaW5nICk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUCggcEN0eCwgRlJMT0cxLCBwQnVmLCBuQnVmICk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMiggcEN0eCwgRlJMT0cxLCBGUkZMKCAiV2UndmUgcGFyc2VkICVkIGJ5dGVzIgorICAgICAgICAgICAgICAgICIgb2YgdGhpcyBidWZmZXIsIGFuZCBzaG93ICVkIGxlZnQuXG4iKSwKKyAgICAgICAgICAgICAgICBwQnVmUmVtYWluaW5nIC0gcEJ1ZiwgbkJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICBzdGF0dXMgfD0gQlRBTVBfSU5DT01QTEVURV9UTFY7CisgICAgICAgICAgICBGUkFNRVNfREJHX0JSRUFLKCk7CisgICAgICAgICAgICBnb3RvIE1hbmRhdG9yeUNoZWNrOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93LCAqaWYqIHdlIGZvdW5kIGEgaGl0Li4uCisgICAgICAgIGlmICggcFRsdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggbkJ1ZlJlbWFpbmluZyA8IHBUbHYtPm1pblNpemUgLSBucGVjIC0gKHNUeXBlICsgc0xlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzMoIHBDdHgsIEZSTE9HVywgRlJGTCgiVGhlIElFICVzIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAiYXQgbGVhc3QgJWQgYnl0ZXMgaW4gc2l6ZSwgYnV0IHRoZXJlIGFyZSBvbmx5ICIKKyAgICAgICAgICAgICAgICAgICAgIiVkIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGlzIGZyYW1lLlxuIiksCisgICAgICAgICAgICAgICAgICAgICBwVGx2LT5uYW1lLCBwVGx2LT5taW5TaXplLCBuQnVmUmVtYWluaW5nICk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAoIHBDdHgsIEZSTE9HMSwgcEJ1ZiwgbkJ1ZiApOworICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBCVEFNUF9JTkNPTVBMRVRFX1RMVjsKKyAgICAgICAgICAgICAgICBGUkFNRVNfREJHX0JSRUFLKCApOworICAgICAgICAgICAgICAgIGdvdG8gTWFuZGF0b3J5Q2hlY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggbGVuID4gcFRsdi0+bWF4U2l6ZSAtIG5wZWMgLSAoc1R5cGUgKyBzTGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMSggcEN0eCwgRlJMT0dXLCBGUkZMKCJUaGUgVExWICVzIHJlcG9ydHMgIgorICAgICAgICAgICAgICAgICAgICAiYW4gaWxsZWdhbGx5IGxhcmdlIHNpemU7IHRoaXMgVExWIGlzIHByZXN1bWFibHkiCisgICAgICAgICAgICAgICAgICAgICJjb3JydXB0IG9yIG90aGVyd2lzZSBpbnZhbGlkICYgd2lsbCBiZSBza2lwcGVkICIKKyAgICAgICAgICAgICAgICAgICAgImlwcGVkLlxuIiksIHBUbHYtPm5hbWUgKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUCggcEN0eCwgRlJMT0cxLCBwQnVmLCBuQnVmICk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzIoIHBDdHgsIEZSTE9HMSwgRlJGTCgiV2UndmUgcGFyc2VkICVkIGJ5IgorICAgICAgICAgICAgICAgICAgICAidGVzIG9mIHRoaXMgYnVmZmVyLCBhbmQgc2hvdyAlZCBsZWZ0LlxuIiksCisgICAgICAgICAgICAgICAgICAgIHBCdWZSZW1haW5pbmcgLSBwQnVmLCBuQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfREJHX0JSRUFLKCk7CisgICAgICAgICAgICAgICAgc3RhdHVzIHw9IEJUQU1QX1NLSVBQRURfQkFEX1RMVjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAicFRsdi0+c2lnIC0gJWRcbiIsIHBUbHYtPnNpZyk7IAorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBUbHYtPnNpZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWw6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2QU1QX0Fzc29jX01BQ19BZGRyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkFNUF9Bc3NvY19NQUNfQWRkcl90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkFNUF9Bc3NvY19NQUNfQWRkciogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZBTVBfQXNzb2NfUEFMX1ZlcnNpb246CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2QU1QX0Fzc29jX1BBTF9WZXJzaW9uX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9WZXJzaW9uKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3RfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkZsb3dfU3BlYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZGbG93X1NwZWNfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZGbG93X1NwZWMqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfQWNjZXB0X0xvZ2ljYWxfTGlua19DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9DaGFubmVsX1NlbGVjdGVkX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9DaGFubmVsX1NlbGVjdGVkX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9Db21tYW5kX0NvbXBsZXRlX0V2ZW50KiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9Db21tYW5kX1N0YXR1c19FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9Db21tYW5kX1N0YXR1c19FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9DcmVhdGVfTG9naWNhbF9MaW5rX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50KiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9GbHVzaF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX0ZsdXNoX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9GbHVzaF9DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX0ZsdXNoX09jY3VycmVkX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX0ZsdXNoX09jY3VycmVkX0V2ZW50KiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX0xvZ2ljYWxfTGlua19DYW5jZWxfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX0xvZ2ljYWxfTGlua19DYW5jZWxfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50KiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfTG9zc19XYXJuaW5nX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfUW9zX1Zpb2xhdGlvbl9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfUW9zX1Zpb2xhdGlvbl9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50KiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfUmVhZF9EYXRhX0Jsb2NrX1NpemVfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfUmVhZF9GbG93X0NvbnRyb2xfTW9kZV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1JlYWRfTGlua19RdWFsaXR5X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9SZWFkX0xvY2FsX0FNUF9Bc3NvY19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9SZWFkX0xvY2FsX1ZlcnNpb25fSW5mb19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1JlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1JlYWRfUlNTSV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1JlYWRfUlNTSV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9SU1NJX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9SZXNldF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1Jlc2V0X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9SZXNldF9DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfUmVzZXRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1NldF9FdmVudF9NYXNrX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19QYWdlXzJfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19QYWdlXzJfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9TZXRfU2hvcnRfUmFuZ2VfTW9kZV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9TaG9ydF9SYW5nZV9Nb2RlX0NoYW5nZV9Db21wbGV0ZV9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHRCdGFtcFRMVkhDSV9TaG9ydF9SYW5nZV9Nb2RlX0NoYW5nZV9Db21wbGV0ZV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9Xcml0ZV9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblVucGFja1RsdkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVW5wYWNrVGx2SENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1VucGFja1RsdkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5VbnBhY2tUbHZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdVbnBhY2tUbHZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuVW5wYWNrVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdEJ0YW1wVExWSENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSTE9HRSwgRlJGTCgiSU5URVJOQUwgRVJST1I6IEkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvbid0IGtub3cgYWJvdXQgdGhlIFRMViBzaWduYXR1cmUgJWQtLSB0aGkiCisgICAgICAgICAgICAgICAgICAgICAgICAicyBpcyBtb3N0IGxpa2VseSBhICdmcmFtZXNjJyBidWcuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHYtPnNpZyk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EQkdfQlJFQUsoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJUQU1QX0lOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgIH0gLy8gRW5kIHN3aXRjaCBvbiBzaWcuCisgICAgICAgICAgICB9IC8vIEVuZCBpZiBvbiBsZW5ndGggY2hlY2suCisKKyAgICAgICAgICAgIHN0YXR1cyB8PSBzdGF0dXMyOworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAic3RhdHVzIC0gJXhcbiIsIHN0YXR1cyk7IAorI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMihwQ3R4LCBGUkxPRzMsIEZSRkwoIlNraXBwaW5nIHVua25vd24gVExWICVkICgiCisgICAgICAgICAgICAgICAgImxlbmd0aCAlZClcbiIpLCBpZCwgbGVuKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSTE9HMywgcEJ1ZlJlbWFpbmluZyAtIChzVHlwZSArIHNMZW4pLCBsZW4pOworICAgICAgICAgICAgc3RhdHVzIHw9IEJUQU1QX1VOS05PV05fVExWUzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgVExWCisgICAgICAgIHBCdWZSZW1haW5pbmcgKz0gbGVuOworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgImxlbiAtICVkIG5CdWZSZW1haW5pbmcgLSAlZFxuIiwgbGVuLCBuQnVmUmVtYWluaW5nKTsgCisjZW5kaWYKKworICAgICAgICBpZiAobGVuID4gbkJ1ZlJlbWFpbmluZykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkxPR1csIEZSRkwoIlRoaXMgVExWIGV4dGVuZHMgcGFzdCB0aCIKKyAgICAgICAgICAgICAgICAgImUgYnVmZmVyIGFzIGl0IHdhcyBkZWZpbmVkIHRvIHVzLiAgVGhpcyBjb3VsZCBtZWFuICIKKyAgICAgICAgICAgICAgICAgImEgY29ycnVwdCBmcmFtZSwgb3IganVzdCBhbiBpbmNvcnJlY3QgbGVuZ3RoIHBhcmFtZSIKKyAgICAgICAgICAgICAgICAgInRlci5cbiIpKTsKKyAgICAgICAgICAgICBGUkFNRVNfREJHX0JSRUFLKCk7CisgICAgICAgICAgICAgc3RhdHVzIHw9IEJUQU1QX0xBU1RfVExWX1RPT19MT05HOworICAgICAgICAgICAgIGdvdG8gTWFuZGF0b3J5Q2hlY2s7CisgICAgICAgICB9CisKKyAgICAgICAgbkJ1ZlJlbWFpbmluZyAtPSBsZW47CisKKyAgICB9IC8vIEVuZCBpdGVyYXRpb24gb3ZlciBUTFZzLgorCitNYW5kYXRvcnlDaGVjazoKKyAgICBwVGx2ID0gJlRMVnNbMF07CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgInBUbHYtPmlkIC0gJXhcbiIsIHBUbHYtPmlkKTsgCisjZW5kaWYgICAgCisKKyAgICB3aGlsZSAoMHhmZmZmICE9IHBUbHYtPmlkKQorICAgIHsKKyAgICAgICAgaWYgKHBUbHYtPmZNYW5kYXRvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBmRm91bmQgPSAodl9VOF90KikocEZybSArIHBUbHYtPm9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbHYtPnByZXNlbmNlT2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICghKnBmRm91bmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJMT0dXLCBGUkZMKCJFUlJPUjogVGhlIG1hbmRhdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICJUTFYgJXMgd2Fzbid0IHNlZW4uXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgcFRsdi0+bmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RCR19CUkVBSygpOworICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBCVEFNUF9NQU5EQVRPUllfVExWX01JU1NJTkc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICArK3BUbHY7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIFVucGFjVGx2a0NvcmUuICovCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAiSW4gYnRhbXBHZXRQYWNrZWRUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWxcbiIpOyAKKyNlbmRpZiAgICAKKworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMzsKKyAgICAgICAgaWYgKCBwVGx2LT5udW1fdHJpcGxldHMgKQorICAgICAgICB7CisgICAgICAgICAgICAqcG5OZWVkZWQgKz0gKCBwVGx2LT5udW1fdHJpcGxldHMgKiAzICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBicmVhazsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWxfdCkodm9pZCAqLCB0QnRhbXBUTFZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsICggMHgwMDNlICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkFNUF9Bc3NvY19NQUNfQWRkcih2b2lkICogcEN0eCwgdEJ0YW1wVExWQU1QX0Fzc29jX01BQ19BZGRyICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgIkluIGJ0YW1wR2V0UGFja2VkVGx2QU1QX0Fzc29jX01BQ19BZGRyXG4iKTsgCisjZW5kaWYgICAgCisKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDY7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZBTVBfQXNzb2NfTUFDX0FkZHIuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2QU1QX0Fzc29jX01BQ19BZGRyX3QpKHZvaWQgKiwgdEJ0YW1wVExWQU1QX0Fzc29jX01BQ19BZGRyKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkFNUF9Bc3NvY19NQUNfQWRkciAoIDB4MDAzZiApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyh2b2lkICogcEN0eCwgdEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAiSW4gYnRhbXBHZXRQYWNrZWRUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllc1xuIik7IAorI2VuZGlmICAgIAorCisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSA0OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXNfdCkodm9pZCAqLCB0QnRhbXBUTFZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyAoIDB4MDA0MCApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZBTVBfQXNzb2NfUEFMX1ZlcnNpb24odm9pZCAqIHBDdHgsIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfVmVyc2lvbiAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWQU1QX0Fzc29jX1BBTF9WZXJzaW9uLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbl90KSh2b2lkICosIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfVmVyc2lvbiosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZBTVBfQXNzb2NfUEFMX1ZlcnNpb24gKCAweDAwNDEgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3Qodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0ICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgIkluIGJ0YW1wR2V0UGFja2VkVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3RcbiIpOyAKKyNlbmRpZiAgICAKKworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMzsKKyAgICAgICAgaWYgKCBwVGx2LT5udW1fdHJpcGxldHMgKQorICAgICAgICB7CisgICAgICAgICAgICAqcG5OZWVkZWQgKz0gKCBwVGx2LT5udW1fdHJpcGxldHMgKiAzICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBicmVhazsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0X3QpKHZvaWQgKiwgdEJ0YW1wVExWQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QgKCAweDAwNDIgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2Rmxvd19TcGVjKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZGbG93X1NwZWMgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgKnBuTmVlZGVkICs9IDQ7CisgICAgICAgICpwbk5lZWRlZCArPSA0OworICAgICAgICAqcG5OZWVkZWQgKz0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkZsb3dfU3BlYy4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZGbG93X1NwZWNfdCkodm9pZCAqLCB0QnRhbXBUTFZGbG93X1NwZWMqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2Rmxvd19TcGVjICggMHgwMDQzICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gMTg7CisgICAgICAgICpwbk5lZWRlZCArPSAxODsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfQWNjZXB0X0xvZ2ljYWxfTGlua19DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQWNjZXB0X0xvZ2ljYWxfTGlua19DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kICggMHgwMDQ0ICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IHBUbHYtPmtleV9sZW5ndGg7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQgKCAweDAwNDUgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9DaGFubmVsX1NlbGVjdGVkX0V2ZW50ICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCAoIDB4MDA0NiApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICBzd2l0Y2ggKHBUbHYtPmNvbW1hbmRfb3Bjb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDMwNzU6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzA4MDoKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDgzOgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMwNzc6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzA5MzoKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMDk0OgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxMjY6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzEyNzoKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTY5OgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxNzA6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE3MToKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTcyOgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAzOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxNzM6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE3NDoKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTc1OgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxNzc6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE3ODoKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTc5OgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQwOTc6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDA5ODoKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gNjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDEwMToKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MTA2OgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUxMjE6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEyMjoKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MTIzOgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUxMjU6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEyOToKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gNDsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gNDsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gNDsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gNDsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gNDsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MTMwOgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSBwVGx2LT5jY19ldmVudC5SZWFkX1JlYWRfTG9jYWxfQU1QX0Fzc29jLnJlbWFpbmluZ19sZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEzMToKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MTQ1OgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYxNDY6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCAoIDB4MDA0NyApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfQ29tbWFuZF9TdGF0dXNfRXZlbnQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9Db21tYW5kX1N0YXR1c19FdmVudCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9Db21tYW5kX1N0YXR1c19FdmVudF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9Db21tYW5kX1N0YXR1c19FdmVudCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfQ29tbWFuZF9TdGF0dXNfRXZlbnQgKCAweDAwNDggKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxODsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE4OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9DcmVhdGVfTG9naWNhbF9MaW5rX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9DcmVhdGVfTG9naWNhbF9MaW5rX0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQgKCAweDAwNDkgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gcFRsdi0+a2V5X2xlbmd0aDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCAoIDB4MDA0YSApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50ICggMHgwMDRiICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQgKCAweDAwNGMgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICggMHgwMDRkICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kICggMHgwMDRlICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCAoIDB4MDA0ZiApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxODsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE4OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9DbWQgKCAweDAwNTAgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NvbXBsZXRlX0V2ZW50ICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NvbXBsZXRlX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NvbXBsZXRlX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQgKCAweDAwNTEgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0ZsdXNoX0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX0ZsdXNoX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9GbHVzaF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX0ZsdXNoX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9GbHVzaF9DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX0ZsdXNoX0NtZCAoIDB4MDA1MiApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX0ZsdXNoX09jY3VycmVkX0V2ZW50ICggMHgwMDUzICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9OdW1fQ29tcGxldGVkX1BrdHNfRXZlbnQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9OdW1fQ29tcGxldGVkX1BrdHNfRXZlbnQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKy8vICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworI2lmIDAKKy8vIE5ldyAKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKy8vIEVuZCBvZiBOZXcgCisjZW5kaWYKKy8vICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX051bV9Db21wbGV0ZWRfUGt0c19FdmVudC4gKi8KKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9OdW1fQ29tcGxldGVkX0RhdGFfQmxvY2tzX0V2ZW50KHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfTnVtX0NvbXBsZXRlZF9EYXRhX0Jsb2Nrc19FdmVudCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworLy8gICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKy8vICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX051bV9Db21wbGV0ZWRfRGF0YV9CbG9ja3NfRXZlbnQuICovCisKKy8vdHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfTnVtX0NvbXBsZXRlZF9Qa3RzX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50Kiwgdl9VMzJfdCopOworLy8jZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX051bV9Db21wbGV0ZWRfUGt0c19FdmVudCAoIDB4MDA0OCApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50KHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50ICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSA2OworICAgICAgICAqcG5OZWVkZWQgKz0gMzI7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50ICggMHgwMDU0ICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50ICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQgKCAweDAwNTUgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0xvZ2ljYWxfTGlua19DYW5jZWxfQ21kKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0xvZ2ljYWxfTGlua19DYW5jZWxfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQgKCAweDAwNTYgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCAoIDB4MDA1NyApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDY0OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudCAoIDB4MDA1OCApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCAoIDB4MDA1OSApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1BoeXNpY2FsX0xpbmtfTG9zc19XYXJuaW5nX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfTG9zc19XYXJuaW5nX0V2ZW50Kiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudCAoIDB4MDA1YSApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50Kiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50ICggMHgwMDViICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50KHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfUW9zX1Zpb2xhdGlvbl9FdmVudCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1Fvc19WaW9sYXRpb25fRXZlbnQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX1Fvc19WaW9sYXRpb25fRXZlbnQgKCAweDAwNWMgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCAoIDB4MDA1ZCApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1JlYWRfQnVmZmVyX1NpemVfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQgKCAweDAwNWUgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kICggMHgwMDVmICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZCAoIDB4MDA2MCApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kICggMHgwMDYxICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfUmVhZF9GbG93X0NvbnRyb2xfTW9kZV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9SZWFkX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCAoIDB4MDA2MiApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1JlYWRfTGlua19RdWFsaXR5X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kICggMHgwMDYzICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQgKCAweDAwNjQgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kICggMHgwMDY1ICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZCAoIDB4MDA2NiApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzX0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQgKCAweDAwNjcgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kICggMHgwMDY4ICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0xvY2F0aW9uX0RhdGFfQ21kKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCAoIDB4MDA2OSApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQgKCAweDAwNmEgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kICggMHgwMDZiICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX1JTU0lfQ21kKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfUmVhZF9SU1NJX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9SZWFkX1JTU0lfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX1JTU0lfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfUlNTSV9DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfUlNTSV9DbWQgKCAweDAwNmMgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1Jlc2V0X0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1Jlc2V0X0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1Jlc2V0X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfUmVzZXRfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1Jlc2V0X0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfUmVzZXRfQ21kICggMHgwMDZkICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfUmVzZXRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQgKCAweDAwNmUgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1NldF9FdmVudF9NYXNrX0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gODsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9TZXRfRXZlbnRfTWFza19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1NldF9FdmVudF9NYXNrX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9TZXRfRXZlbnRfTWFza19DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX1NldF9FdmVudF9NYXNrX0NtZCAoIDB4MDA2ZiApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDg7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9TZXRfRXZlbnRfTWFza19QYWdlXzJfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9TZXRfRXZlbnRfTWFza19QYWdlXzJfQ21kICggMHgwMDcwICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9TZXRfU2hvcnRfUmFuZ2VfTW9kZV9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9TZXRfU2hvcnRfUmFuZ2VfTW9kZV9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kICggMHgwMDcxICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9TaG9ydF9SYW5nZV9Nb2RlX0NoYW5nZV9Db21wbGV0ZV9FdmVudCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50ICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGVfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50Kiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9TaG9ydF9SYW5nZV9Nb2RlX0NoYW5nZV9Db21wbGV0ZV9FdmVudCAoIDB4MDA3MiApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9Xcml0ZV9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgKnBuTmVlZGVkICs9IDQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9Xcml0ZV9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCAoIDB4MDA3MyApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9Xcml0ZV9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9Xcml0ZV9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kICggMHgwMDc0ICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQgKCAweDAwNzUgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQgKCAweDAwNzYgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAzOworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kICggMHgwMDc3ICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworICAgIHdoaWxlICggcFRsdi0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQgKCAweDAwNzggKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkVGx2SENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kKHZvaWQgKiBwQ3R4LCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRUTFZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tTaXplVGx2SENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kKiwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrU2l6ZVRsdkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZCAoIDB4MDA3OSApCisKK3ZfVTMyX3QgYnRhbXBHZXRQYWNrZWRUbHZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZCAqcFRsdiwgdl9VMzJfdCAqcG5OZWVkZWQpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7ICh2b2lkKXBUbHY7ICh2b2lkKXBuTmVlZGVkOworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICJJbiBidGFtcEdldFBhY2tlZFRsdkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZFxuIik7IAorI2VuZGlmICAgIAorCisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICpwbk5lZWRlZCArPSBwVGx2LT5hbXBfYXNzb2NfcmVtYWluaW5nX2xlbmd0aDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcEdldFBhY2tlZFRMVkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQqLCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kICggMHgwMDdhICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9FbmhhbmNlZF9GbHVzaF9DbWQodm9pZCAqIHBDdHgsIHRCdGFtcFRMVkhDSV9FbmhhbmNlZF9GbHVzaF9DbWQgKnBUbHYsIHZfVTMyX3QgKnBuTmVlZGVkKQoreworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OyAodm9pZClwVGx2OyAodm9pZClwbk5lZWRlZDsKKyAgICB3aGlsZSAoIHBUbHYtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1NpemVUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NtZCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kICggMHgwMDdiICkKKwordl9VMzJfdCBidGFtcEdldFBhY2tlZFRsdkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZV9FdmVudCh2b2lkICogcEN0eCwgdEJ0YW1wVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50ICpwVGx2LCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsgKHZvaWQpcFRsdjsgKHZvaWQpcG5OZWVkZWQ7CisgICAgd2hpbGUgKCBwVGx2LT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wR2V0UGFja2VkVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrU2l6ZVRsdkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZV9FdmVudF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZV9FdmVudCosIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1NpemVUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ29tcGxldGVfRXZlbnQgKCAweDAwN2MgKQorCit2X1UzMl90IGJ0YW1wR2V0UGFja2VkQU1QX0FTU09DU2l6ZSh2b2lkICogcEN0eCwgdEJ0YW1wQU1QX0FTU09DICpwRnJtLCB2X1UzMl90ICpwbk5lZWRlZCkKK3sKKyAgICBzdGF0aWMgdFRMVkRlZm4gVExWU1sgXSA9IHsKKyAgICAgICAge0JUQU1QX1RMVl9BTVBfQVNTT0NfTUFDX0FERFIsIDAsIDksIDksIG9mZnNldG9mKHRCdGFtcEFNUF9BU1NPQywgQU1QX0Fzc29jX01BQ19BZGRyKSwgb2Zmc2V0b2YodEJ0YW1wVExWQU1QX0Fzc29jX01BQ19BZGRyLCBwcmVzZW50KSwgU2lnUGFja1NpemVUbHZBTVBfQXNzb2NfTUFDX0FkZHIsIChwZm5HZW5lcmljX3QpYnRhbXBHZXRQYWNrZWRUbHZBTVBfQXNzb2NfTUFDX0FkZHIsICJBTVBfQXNzb2NfTUFDX0FkZHIiLCAxLCB9LAorICAgICAgICB7QlRBTVBfVExWX0FNUF9BU1NPQ19QUkVGRVJSRURfQ0hBTk5FTF9MSVNULCAwLCA5LCAxMiwgb2Zmc2V0b2YodEJ0YW1wQU1QX0FTU09DLCBBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdCksIG9mZnNldG9mKHRCdGFtcFRMVkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LCBwcmVzZW50KSwgU2lnUGFja1NpemVUbHZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdCwgKHBmbkdlbmVyaWNfdClidGFtcEdldFBhY2tlZFRsdkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LCAiQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QiLCAxLCB9LAorICAgICAgICB7QlRBTVBfVExWX0FNUF9BU1NPQ19DT05ORUNURURfQ0hBTk5FTCwgMCwgOSwgMTIsIG9mZnNldG9mKHRCdGFtcEFNUF9BU1NPQywgQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsKSwgb2Zmc2V0b2YodEJ0YW1wVExWQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLCBwcmVzZW50KSwgU2lnUGFja1NpemVUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwsIChwZm5HZW5lcmljX3QpYnRhbXBHZXRQYWNrZWRUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwsICJBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwiLCAwLCB9LAorICAgICAgICB7QlRBTVBfVExWX0FNUF9BU1NPQ19QQUxfQ0FQQUJJTElUSUVTLCAwLCA3LCAgNywgb2Zmc2V0b2YodEJ0YW1wQU1QX0FTU09DLCBBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyksIG9mZnNldG9mKHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzLCBwcmVzZW50KSwgU2lnUGFja1NpemVUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcywgKHBmbkdlbmVyaWNfdClidGFtcEdldFBhY2tlZFRsdkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzLCAiQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMiLCAwLCB9LAorICAgICAgICB7QlRBTVBfVExWX0FNUF9BU1NPQ19QQUxfVkVSU0lPTiwgMCwgOCwgOCwgb2Zmc2V0b2YodEJ0YW1wQU1QX0FTU09DLCBBTVBfQXNzb2NfUEFMX1ZlcnNpb24pLCBvZmZzZXRvZih0QnRhbXBUTFZBTVBfQXNzb2NfUEFMX1ZlcnNpb24sIHByZXNlbnQpLCBTaWdQYWNrU2l6ZVRsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbiwgKHBmbkdlbmVyaWNfdClidGFtcEdldFBhY2tlZFRsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbiwgIkFNUF9Bc3NvY19QQUxfVmVyc2lvbiIsIDEsIH0sCisgICAgeyAweGZmZmYsIDAgfSwKKyAgICB9OworCisgICAgdl9VMzJfdCBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDA7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgIkluIGJ0YW1wR2V0UGFja2VkQU1QX0FTU09DU2l6ZVxuIik7IAorI2VuZGlmICAgIAorCisgICAgc3RhdHVzIHw9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHZfVThfdCopcEZybSxwbk5lZWRlZCxUTFZTKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBHZXRQYWNrZWRBTVBfQVNTT0NTaXplLiAqLworCitzdGF0aWMgdl9VMzJfdCBHZXRQYWNrZWRTaXplVGx2Q29yZSh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuTmVlZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFRMVkRlZm4gIFRMVnNbXSkKK3sKKyAgICB0VExWRGVmbiAgICAgICpwVGx2OworICAgIHZfVTMyX3QgIHN0YXR1cywgc3RhdHVzMjsKKyAgICB0RlJBTUVTX0JPT0wgKnBmRm91bmQ7CisKKyAgICBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHN0YXR1czIgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICJJbiBHZXRQYWNrZWRTaXplVGx2Q29yZVxuIik7IAorI2VuZGlmICAgIAorCisgICAgcFRsdiA9ICYoIFRMVnNbMF0gKTsKKyAgICB3aGlsZSAoIDB4ZmZmZiAhPSBwVGx2LT5pZCApCisgICAgeworICAgICAgICBwZkZvdW5kID0gKHRGUkFNRVNfQk9PTCopKHBGcm0gKyBwVGx2LT5vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbHYtPnByZXNlbmNlT2Zmc2V0KTsKKyAgICAgICAgaWYgKCAqcGZGb3VuZCApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwbk5lZWRlZCArPSA0VTsKKyAgICAgICAgICAgIGlmICggcFRsdi0+cGVjICkgKnBuTmVlZGVkICs9IDNVOworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiSW4gR2V0UGFja2VkU2l6ZVRsdkNvcmUsIHBUbHYtPnNpZyAtICVkXG4iLCBwVGx2LT5zaWcpOyAKKyNlbmRpZgorCisgICAgICAgICAgICBzd2l0Y2ggKHBUbHYtPnNpZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2QU1QX0Fzc29jX01BQ19BZGRyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2QU1QX0Fzc29jX01BQ19BZGRyX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkFNUF9Bc3NvY19NQUNfQWRkciogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllc190KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcyogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2QU1QX0Fzc29jX1BBTF9WZXJzaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2QU1QX0Fzc29jX1BBTF9WZXJzaW9uX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfVmVyc2lvbiogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2Rmxvd19TcGVjOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2Rmxvd19TcGVjX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkZsb3dfU3BlYyogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9Db21tYW5kX1N0YXR1c19FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9DcmVhdGVfTG9naWNhbF9MaW5rX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0ZsdXNoX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9GbHVzaF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0ZsdXNoX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0ZsdXNoX09jY3VycmVkX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX0ZsdXNoX09jY3VycmVkX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX0hhcmR3YXJlX0Vycm9yX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0xvZ2ljYWxfTGlua19DYW5jZWxfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX0xvZ2ljYWxfTGlua19DYW5jZWxfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1BoeXNpY2FsX0xpbmtfTG9zc19XYXJuaW5nX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1BoeXNpY2FsX0xpbmtfTG9zc19XYXJuaW5nX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1Fvc19WaW9sYXRpb25fRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfUW9zX1Zpb2xhdGlvbl9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUW9zX1Zpb2xhdGlvbl9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfQnVmZmVyX1NpemVfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1JlYWRfQnVmZmVyX1NpemVfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZWFkX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfTGlua19RdWFsaXR5X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0xpbmtfUXVhbGl0eV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0xvY2FsX0FNUF9Bc3NvY19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0xvY2FsX1ZlcnNpb25fSW5mb19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1JlYWRfUlNTSV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfUmVhZF9SU1NJX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9SU1NJX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1Jlc2V0X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9SZXNldF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1Jlc2V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1NldF9FdmVudF9NYXNrX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9TZXRfRXZlbnRfTWFza19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9TZXRfU2hvcnRfUmFuZ2VfTW9kZV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9TaG9ydF9SYW5nZV9Nb2RlX0NoYW5nZV9Db21wbGV0ZV9FdmVudCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9Xcml0ZV9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9Xcml0ZV9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrU2l6ZVRsdkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1NpemVUbHZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tTaXplVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tTaXplVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJMT0dFLCBGUkZMKCJJTlRFUk5BTCBFUlJPUi0tIEkgZG9uIgorICAgICAgICAgICAgICAgICAgICAiJ3Qga25vdyBhYm91dCB0aGUgVExWIHNpZ25hdHVyZSAlZDsgdGhpcyBpcyBtb3N0IGwiCisgICAgICAgICAgICAgICAgICAgICJpa2VseSBhIGJ1ZyBpbiAnZnJhbWVzYycuXG4iKSwgcFRsdi0+c2lnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQlRBTVBfSU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytwVGx2OworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQordl9VMzJfdCBidGFtcFBhY2tUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAxOworICAgIHNMZW4gPSAyOworI2lmZGVmIFdMQU5fQkFQSENJX0VOQUJMRV9MT0dHSU5HCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICJJbiBidGFtcFBhY2tUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWxcbiIpOyAKKyNlbmRpZiAgICAKKyAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisKKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDMsIDApOworICAgICAgICBlbHNlICpwQnVmID0gMzsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmNvdW50cnksIDMpOworICAgICAgICAqcG5Db25zdW1lZCArPSAzOworICAgICAgICBwQnVmICs9IDM7CisgICAgICAgIG5CdWYgLT0gMzsKKyAgICAgICAgaWYgKCBwU3JjLT5udW1fdHJpcGxldHMgKSAgICAgICAgeworICAgICAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPnRyaXBsZXRzICksICggcFNyYy0+bnVtX3RyaXBsZXRzICogMyApKTsKKyAgICAgICAgICAgICpwbkNvbnN1bWVkICs9ICggcFNyYy0+bnVtX3RyaXBsZXRzICogMyApOworICAgICAgICAgICAgcEJ1ZiArPSAoICggcFNyYy0+bnVtX3RyaXBsZXRzICogMyApICk7CisgICAgICAgICAgICBuQnVmIC09ICggKCBwU3JjLT5udW1fdHJpcGxldHMgKiAzICkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGJyZWFrOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IAorICAgIGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsX3QpKHZvaWQgKiwgdEJ0YW1wVExWQU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCAoIDB4MDA3YiApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2QU1QX0Fzc29jX01BQ19BZGRyKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWQU1QX0Fzc29jX01BQ19BZGRyICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMjsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAiSW4gYnRhbXBQYWNrVGx2QU1QX0Fzc29jX01BQ19BZGRyXG4iKTsgCisjZW5kaWYgICAgCisgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorCisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZBTVBfQXNzb2NfTUFDX0FkZHIocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCAxLCAwKTsKKyAgICAgICAgZWxzZSAqcEJ1ZiA9IDE7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIEJUQU1QX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5tYWNfYWRkciwgNik7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDY7CisgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgbkJ1ZiAtPSA2OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2QU1QX0Fzc29jX01BQ19BZGRyLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2QU1QX0Fzc29jX01BQ19BZGRyX3QpKHZvaWQgKiwgdEJ0YW1wVExWQU1QX0Fzc29jX01BQ19BZGRyICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkFNUF9Bc3NvY19NQUNfQWRkciAoIDB4MDA3YyApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXModm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMjsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAiSW4gYnRhbXBQYWNrVGx2QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXNcbiIpOyAKKyNlbmRpZiAgICAKKyAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisKKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNCwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSA0OworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5wYWxfY2FwYWJpbGl0aWVzLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICBuQnVmIC09IDQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcy4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzX3QpKHZvaWQgKiwgdEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMgKCAweDAwN2QgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbih2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkFNUF9Bc3NvY19QQUxfVmVyc2lvbiAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDE7CisgICAgc0xlbiA9IDI7CisjaWZkZWYgV0xBTl9CQVBIQ0lfRU5BQkxFX0xPR0dJTkcKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgIkluIGJ0YW1wUGFja1RsdkFNUF9Bc3NvY19QQUxfVmVyc2lvblxuIik7IAorI2VuZGlmICAgIAorICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKworICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2QU1QX0Fzc29jX1BBTF9WZXJzaW9uKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNSwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSA1OworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnBhbF92ZXJzaW9uOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+cGFsX0NvbXBhbnlJRCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5wYWxfc3VidmVyc2lvbiwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2QU1QX0Fzc29jX1BBTF9WZXJzaW9uLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2QU1QX0Fzc29jX1BBTF9WZXJzaW9uX3QpKHZvaWQgKiwgdEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9WZXJzaW9uICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbiAoIDB4MDA3ZSApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3Qodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMjsKKyNpZmRlZiBXTEFOX0JBUEhDSV9FTkFCTEVfTE9HR0lORworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAiSW4gYnRhbXBQYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3RcbiIpOyAKKyNlbmRpZiAgICAKKyAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisKKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0KHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMiwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSAyOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+Y291bnRyeSwgMyk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDM7CisgICAgICAgIHBCdWYgKz0gMzsKKyAgICAgICAgbkJ1ZiAtPSAzOworICAgICAgICBpZiAoIHBTcmMtPm51bV90cmlwbGV0cyApICAgICAgICB7CisgICAgICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+dHJpcGxldHMgKSwgKCBwU3JjLT5udW1fdHJpcGxldHMgKiAzICkpOworICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gKCBwU3JjLT5udW1fdHJpcGxldHMgKiAzICk7CisgICAgICAgICAgICBwQnVmICs9ICggKCBwU3JjLT5udW1fdHJpcGxldHMgKiAzICkgKTsKKyAgICAgICAgICAgIG5CdWYgLT0gKCAoIHBTcmMtPm51bV90cmlwbGV0cyAqIDMgKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0X3QpKHZvaWQgKiwgdEJ0YW1wVExWQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QgKCAweDAwN2YgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkZsb3dfU3BlYyh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkZsb3dfU3BlYyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDE7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKworICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2Rmxvd19TcGVjKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNiwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSA2OworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmZsb3dfc3BlY19pZDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+c2VydmljZV90eXBlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bWF4X3NkdSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5zZHVfaW50ZXJfYXJyaXZhbCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgbkJ1ZiAtPSA0OworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5hY2Nlc3NfbGF0ZW5jeSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgbkJ1ZiAtPSA0OworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5mbHVzaF90aW1lb3V0LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICBuQnVmIC09IDQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pIAorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2Rmxvd19TcGVjLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2Rmxvd19TcGVjX3QpKHZvaWQgKiwgdEJ0YW1wVExWRmxvd19TcGVjICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkZsb3dfU3BlYyAoIDB4MDA4MCApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorCisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfQWNjZXB0X0xvZ2ljYWxfTGlua19DbWQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCAxMDgxLCAwKTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5waHlfbGlua19oYW5kbGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+dHhfZmxvd19zcGVjLCAxOCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE4OworICAgICAgICBwQnVmICs9IDE4OworICAgICAgICBuQnVmIC09IDE4OworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+cnhfZmxvd19zcGVjLCAxOCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE4OworICAgICAgICBwQnVmICs9IDE4OworICAgICAgICBuQnVmIC09IDE4OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZCAoIDB4MDA4MSApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorCisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMTA3OCwgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgICpwQnVmID0gcFNyYy0+cGh5X2xpbmtfaGFuZGxlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5rZXlfbGVuZ3RoOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5rZXlfdHlwZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgIEJUQU1QX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT5rZXlfbWF0ZXJpYWwgKSwgcFNyYy0+a2V5X2xlbmd0aCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPmtleV9sZW5ndGg7CisgICAgICAgIHBCdWYgKz0gKCBwU3JjLT5rZXlfbGVuZ3RoICk7CisgICAgICAgIG5CdWYgLT0gKCBwU3JjLT5rZXlfbGVuZ3RoICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCAoIDB4MDA4MiApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9DaGFubmVsX1NlbGVjdGVkX0V2ZW50ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA2NSwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSA2NTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5waHlfbGlua19oYW5kbGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9DaGFubmVsX1NlbGVjdGVkX0V2ZW50ICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9DaGFubmVsX1NlbGVjdGVkX0V2ZW50ICggMHgwMDgzICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAxOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisKKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9Db21tYW5kX0NvbXBsZXRlX0V2ZW50KHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMTQsIDApOworICAgICAgICBlbHNlICpwQnVmID0gMTQ7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgICpwQnVmID0gcFNyYy0+bnVtX2hjaV9jb21tYW5kX3BhY2tldHM7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jb21tYW5kX29wY29kZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBzd2l0Y2ggKHBTcmMtPmNvbW1hbmRfb3Bjb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDMwNzU6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5SZXNldC5zdGF0dXM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMwODA6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5GbHVzaC5zdGF0dXM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNjX2V2ZW50LkZsdXNoLmxvZ19saW5rX2hhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwODM6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5Mb2dpY2FsX0xpbmtfQ2FuY2VsLnN0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5Mb2dpY2FsX0xpbmtfQ2FuY2VsLnBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5Mb2dpY2FsX0xpbmtfQ2FuY2VsLnR4X2Zsb3dfc3BlY19pZDsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzA3NzoKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlNldF9FdmVudF9NYXNrLnN0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzA5MzoKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVE8uc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jY19ldmVudC5SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RPLmNvbm5lY3Rpb25fYWNjZXB0X3RpbWVvdXQsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMDk0OgorICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVE8uc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTI2OgorICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RPLnN0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RPLmxvZ19saW5rX2hhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNjX2V2ZW50LlJlYWRfTGlua19TdXBlcnZpc2lvbl9UTy5saW5rX3N1cGVydmlzaW9uX3RpbWVvdXQsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTI3OgorICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UTy5zdGF0dXM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNjX2V2ZW50LldyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVE8ubG9nX2xpbmtfaGFuZGxlLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE2OToKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UTy5zdGF0dXM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNjX2V2ZW50LlJlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UTy5sb2dpY2FsX2xpbmtfYWNjZXB0X3RpbWVvdXQsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTcwOgorICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UTy5zdGF0dXM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxNzE6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5TZXRfRXZlbnRfTWFza19QYWdlXzIuc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTcyOgorICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuUmVhZF9Mb2NhdGlvbl9EYXRhLnN0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5SZWFkX0xvY2F0aW9uX0RhdGEubG9jX2RvbWFpbl9hd2FyZTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmNjX2V2ZW50LlJlYWRfTG9jYXRpb25fRGF0YS5sb2NfZG9tYWluLCAzKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAzOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMzsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDM7CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5SZWFkX0xvY2F0aW9uX0RhdGEubG9jX29wdGlvbnM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxNzM6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5Xcml0ZV9Mb2NhdGlvbl9EYXRhLnN0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE3NDoKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfRmxvd19Db250cm9sX01vZGUuc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfRmxvd19Db250cm9sX01vZGUuZmxvd19jb250cm9sX21vZGU7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxNzU6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZS5zdGF0dXM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxNzc6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5SZWFkX0JFX0ZsdXNoX1RPLnN0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9CRV9GbHVzaF9UTy5iZXN0X2VmZm9ydF9mbHVzaF90aW1lb3V0LCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICAgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE3ODoKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LldyaXRlX0JFX0ZsdXNoX1RPLnN0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE3OToKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlNldF9TaG9ydF9SYW5nZV9Nb2RlLnN0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDA5NzoKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfTG9jYWxfVmVyc2lvbl9JbmZvLnN0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5SZWFkX0xvY2FsX1ZlcnNpb25fSW5mby5IQ19IQ0lfVmVyc2lvbjsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm8uSENfSENJX1JldmlzaW9uLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDI7CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5SZWFkX0xvY2FsX1ZlcnNpb25fSW5mby5IQ19QQUxfVmVyc2lvbjsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm8uSENfTWFudWZhY19OYW1lLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDI7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm8uSENfUEFMX1N1Yl9WZXJzaW9uLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDA5ODoKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHMuc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kcy5IQ19TdXBwb3J0X0NtZHMsIDY0KTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA2NDsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDY0OworICAgICAgICAgICAgICAgIG5CdWYgLT0gNjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDEwMToKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfQnVmZmVyX1NpemUuc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jY19ldmVudC5SZWFkX0J1ZmZlcl9TaXplLkhDX0FDTF9EYXRhX1BhY2tldF9MZW5ndGgsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfQnVmZmVyX1NpemUuSENfU0NPX1BhY2tldF9MZW5ndGg7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNjX2V2ZW50LlJlYWRfQnVmZmVyX1NpemUuSENfVG90YWxfTnVtX0FDTF9QYWNrZXRzLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDI7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9CdWZmZXJfU2l6ZS5IQ19Ub3RhbF9OdW1fU0NPX1BhY2tldHMsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MTA2OgorICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuUmVhZF9EYXRhX0Jsb2NrX1NpemUuc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jY19ldmVudC5SZWFkX0RhdGFfQmxvY2tfU2l6ZS5IQ19NYXhfQUNMX0RhdGFfUGFja2V0X0xlbmd0aCwgMCk7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNjX2V2ZW50LlJlYWRfRGF0YV9CbG9ja19TaXplLkhDX0RhdGFfQmxvY2tfTGVuZ3RoLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDI7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9EYXRhX0Jsb2NrX1NpemUuSENfVG90YWxfTnVtX0RhdGFfQmxvY2tzLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEyMToKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlci5zdGF0dXM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNjX2V2ZW50LlJlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlci5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jY19ldmVudC5SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXIuZmFpbGVkX2NvbnRhY3RfY291bnRlciwgMCk7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUxMjI6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyLnN0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVzZXRfRmFpbGVkX0NvbnRhY3RfQ291bnRlci5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MTIzOgorICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuUmVhZF9MaW5rX1F1YWxpdHkuc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jY19ldmVudC5SZWFkX0xpbmtfUXVhbGl0eS5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfTGlua19RdWFsaXR5LmxpbmtfcXVhbGl0eTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEyNToKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfUlNTSS5zdGF0dXM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuUmVhZF9SU1NJLnBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5SZWFkX1JTU0kucnNzaTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEyOToKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uSENfQU1QX1N0YXR1czsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9BTVBfSW5mby5IQ19Ub3RhbF9CVywgMCk7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSA0OworICAgICAgICAgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uSENfTWF4X0d1YXJhbnRlZWRfQlcsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICAgICAgICAgIG5CdWYgLT0gNDsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX01pbl9MYXRlbmN5LCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICAgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDQ7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9BTVBfSW5mby5IQ19NYXhfUERVX1NpemUsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICAgICAgICAgIG5CdWYgLT0gNDsKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfTG9jYWxfQU1QX0luZm8uSENfQ29udHJvbGxlcl9UeXBlOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX1BBTF9DYXBhYmlsaXRpZXMsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX0FNUF9Bc3NvY19MZW5ndGgsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5jY19ldmVudC5SZWFkX0xvY2FsX0FNUF9JbmZvLkhDX01heF9GbHVzaF9UaW1lb3V0LCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICAgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDQ7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9Mb2NhbF9BTVBfSW5mby5IQ19CRV9GbHVzaF9UaW1lb3V0LCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICAgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgICAgICAgICBuQnVmIC09IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEzMDoKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfUmVhZF9Mb2NhbF9BTVBfQXNzb2Muc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfUmVhZF9Mb2NhbF9BTVBfQXNzb2MucGh5X2xpbmtfaGFuZGxlOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jY19ldmVudC5SZWFkX1JlYWRfTG9jYWxfQU1QX0Fzc29jLnJlbWFpbmluZ19sZW5ndGgsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+Y2NfZXZlbnQuUmVhZF9SZWFkX0xvY2FsX0FNUF9Bc3NvYy5BTVBfYXNzb2NfZnJhZ21lbnQgKSwgcFNyYy0+Y2NfZXZlbnQuUmVhZF9SZWFkX0xvY2FsX0FNUF9Bc3NvYy5yZW1haW5pbmdfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5jY19ldmVudC5SZWFkX1JlYWRfTG9jYWxfQU1QX0Fzc29jLnJlbWFpbmluZ19sZW5ndGg7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAoIHBTcmMtPmNjX2V2ZW50LlJlYWRfUmVhZF9Mb2NhbF9BTVBfQXNzb2MucmVtYWluaW5nX2xlbmd0aCApOworICAgICAgICAgICAgICAgIG5CdWYgLT0gKCBwU3JjLT5jY19ldmVudC5SZWFkX1JlYWRfTG9jYWxfQU1QX0Fzc29jLnJlbWFpbmluZ19sZW5ndGggKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MTMxOgorICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuV3JpdGVfUmVtb3RlX0FNUF9Bc3NvYy5zdGF0dXM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuV3JpdGVfUmVtb3RlX0FNUF9Bc3NvYy5waHlfbGlua19oYW5kbGU7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYxNDU6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5jY19ldmVudC5SZWFkX0xvb3BiYWNrX01vZGUuc3RhdHVzOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNjX2V2ZW50LlJlYWRfTG9vcGJhY2tfTW9kZS5sb29wYmFja19tb2RlOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MTQ2OgorICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+Y2NfZXZlbnQuV3JpdGVfTG9vcGJhY2tfTW9kZS5zdGF0dXM7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9Db21tYW5kX0NvbXBsZXRlX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudCAoIDB4MDA4NCApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50KHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50KHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMTUsIDApOworICAgICAgICBlbHNlICpwQnVmID0gMTU7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgICpwQnVmID0gcFNyYy0+c3RhdHVzOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5udW1faGNpX2NvbW1hbmRfcGFja2V0czsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNvbW1hbmRfb3Bjb2RlLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfQ29tbWFuZF9TdGF0dXNfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfQ29tbWFuZF9TdGF0dXNfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9TdGF0dXNfRXZlbnQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX0NvbW1hbmRfU3RhdHVzX0V2ZW50ICggMHgwMDg1ICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisKKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCAxMDgwLCAwKTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5waHlfbGlua19oYW5kbGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+dHhfZmxvd19zcGVjLCAxOCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE4OworICAgICAgICBwQnVmICs9IDE4OworICAgICAgICBuQnVmIC09IDE4OworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+cnhfZmxvd19zcGVjLCAxOCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE4OworICAgICAgICBwQnVmICs9IDE4OworICAgICAgICBuQnVmIC09IDE4OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9DcmVhdGVfTG9naWNhbF9MaW5rX0NtZCAoIDB4MDA4NiApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDEwNzcsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+a2V5X2xlbmd0aDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+a2V5X3R5cGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+a2V5X21hdGVyaWFsICksIHBTcmMtPmtleV9sZW5ndGgpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5rZXlfbGVuZ3RoOworICAgICAgICBwQnVmICs9ICggcFNyYy0+a2V5X2xlbmd0aCApOworICAgICAgICBuQnVmIC09ICggcFNyYy0+a2V5X2xlbmd0aCApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQgKCAweDAwODcgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDE7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDI2LCAwKTsKKyAgICAgICAgZWxzZSAqcEJ1ZiA9IDI2OworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmxpbmtfdHlwZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX0RhdGFfQnVmZmVyX092ZXJmbG93X0V2ZW50ICggMHgwMDg4ICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMTA4MiwgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmxvZ19saW5rX2hhbmRsZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQgKCAweDAwODkgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDE7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDcwLCAwKTsKKyAgICAgICAgZWxzZSAqcEJ1ZiA9IDcwOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnN0YXR1czsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmxvZ19saW5rX2hhbmRsZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJlYXNvbjsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICggMHgwMDhhICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDEwNzksIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+cmVhc29uOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCAoIDB4MDA4YiApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDY2LCAwKTsKKyAgICAgICAgZWxzZSAqcEJ1ZiA9IDY2OworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnN0YXR1czsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+cGh5X2xpbmtfaGFuZGxlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5yZWFzb247CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgKCAweDAwOGMgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDEwODQsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5iZV9hZ2dyX2NvdW50ZXI7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+dHhfZmxvd19zcGVjLCAxOCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE4OworICAgICAgICBwQnVmICs9IDE4OworICAgICAgICBuQnVmIC09IDE4OworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+cnhfZmxvd19zcGVjLCAxOCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE4OworICAgICAgICBwQnVmICs9IDE4OworICAgICAgICBuQnVmIC09IDE4OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCAoIDB4MDA4ZCApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NvbXBsZXRlX0V2ZW50ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA3MSwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSA3MTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5zdGF0dXM7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NvbXBsZXRlX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudCAoIDB4MDA4ZSApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0ZsdXNoX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfRmx1c2hfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX0ZsdXNoX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDMwODAsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9GbHVzaF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfRmx1c2hfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX0ZsdXNoX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfRmx1c2hfQ21kICggMHgwMDhmICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAxOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCAxNywgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSAxNzsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bG9nX2xpbmtfaGFuZGxlLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX0ZsdXNoX09jY3VycmVkX0V2ZW50ICggMHgwMDkwICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfTnVtX0NvbXBsZXRlZF9Qa3RzX0V2ZW50KHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX051bV9Db21wbGV0ZWRfUGt0c19FdmVudCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDE7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9OdW1fQ29tcGxldGVkX1BrdHNfRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKy8vICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDE5LCAwKTsKKyAgICAgICAgZWxzZSAqcEJ1ZiA9IDE5OworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPm51bV9oYW5kbGVzOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y29ubl9oYW5kbGVzWzBdLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09IDI7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm51bV9jb21wbGV0ZWRfcGt0c1swXSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworI2lmIDAKKyAgICAgICAgLy8gTmV3CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDAsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgMCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCAwLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09IDI7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDAsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgMCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCAwLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09IDI7CisvLyBFbmQgb2YgbmV3CisjZW5kaWYKKy8vICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX051bV9Db21wbGV0ZWRfUGt0c19FdmVudC4gKi8KKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfTnVtX0NvbXBsZXRlZF9EYXRhX0Jsb2Nrc19FdmVudCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9OdW1fQ29tcGxldGVkX0RhdGFfQmxvY2tzX0V2ZW50ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX051bV9Db21wbGV0ZWRfRGF0YV9CbG9ja3NfRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKy8vICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDcyLCAwKTsKKyAgICAgICAgZWxzZSAqcEJ1ZiA9IDcyOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT50b3RhbF9udW1fZGF0YV9ibG9ja3MsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5udW1faGFuZGxlczsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNvbm5faGFuZGxlc1swXSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5udW1fY29tcGxldGVkX3BrdHNbMF0sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bnVtX2NvbXBsZXRlZF9ibG9ja3NbMF0sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyNpZiAwCisgICAgICAgIC8vIE5ldworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCAwLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09IDI7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDAsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgMCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCAwLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09IDI7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIDAsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgMCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworLy8gRW5kIG9mIG5ldworI2VuZGlmCisvLyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9OdW1fQ29tcGxldGVkX0RhdGFfQmxvY2tzX0V2ZW50LiAqLworCisvL3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfTnVtX0NvbXBsZXRlZF9Qa3RzX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX051bV9Db21wbGV0ZWRfUGt0c19FdmVudCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisvLyNkZWZpbmUgU2lnUGFja1RsdkhDSV9OdW1fQ29tcGxldGVkX1BrdHNfRXZlbnQgKCAweDAwODUgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDE7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA2MiwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSA2MjsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmJkX2FkZHIsIDYpOworICAgICAgICAqcG5Db25zdW1lZCArPSA2OworICAgICAgICBwQnVmICs9IDY7CisgICAgICAgIG5CdWYgLT0gNjsKKyAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmdlbmVyaWNfYW1wX2xpbmtfa2V5LCAzMik7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDMyOworICAgICAgICBwQnVmICs9IDMyOworICAgICAgICBuQnVmIC09IDMyOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmtleV90eXBlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX0dlbmVyaWNfQU1QX0xpbmtfS2V5X05vdGlmaWNhdGlvbl9FdmVudCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50ICggMHgwMDkxICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAxOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCAxNiwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSAxNjsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5oYXJkd2FyZV9jb2RlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQgKCAweDAwOTIgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDEwODMsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+dHhfZmxvd19zcGVjX2lkOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQgKCAweDAwOTMgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDE7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA2OSwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSA2OTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5zdGF0dXM7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5waHlfbGlua19oYW5kbGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmZsb3dfc3BlY19pZDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCAoIDB4MDA5NCApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCAyNSwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSAyNTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmhjaV9jb21tYW5kX3BhY2tldCwgNjQpOworICAgICAgICAqcG5Db25zdW1lZCArPSA2NDsKKyAgICAgICAgcEJ1ZiArPSA2NDsKKyAgICAgICAgbkJ1ZiAtPSA2NDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9Mb29wYmFja19Db21tYW5kX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudCAoIDB4MDA5NSApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA2NCwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSA2NDsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5zdGF0dXM7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQgKCAweDAwOTYgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDE7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDY3LCAwKTsKKyAgICAgICAgZWxzZSAqcEJ1ZiA9IDY3OworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+cmVhc29uOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQgKCAweDAwOTcgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50KHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDE7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50KHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNjgsIDApOworICAgICAgICBlbHNlICpwQnVmID0gNjg7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgICpwQnVmID0gcFNyYy0+cGh5X2xpbmtfaGFuZGxlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudCAoIDB4MDA5OCApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1Fvc19WaW9sYXRpb25fRXZlbnQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1Fvc19WaW9sYXRpb25fRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCAzMCwgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSAzMDsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bG9nX2xpbmtfaGFuZGxlLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfUW9zX1Zpb2xhdGlvbl9FdmVudC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1Fvc19WaW9sYXRpb25fRXZlbnQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1Fvc19WaW9sYXRpb25fRXZlbnQgKCAweDAwOTkgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMzE3NywgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmxvZ19saW5rX2hhbmRsZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kICggMHgwMDlhICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA0MTAxLCAwKTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQgKCAweDAwOWIgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMzA5MywgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9SZWFkX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1JlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQgKCAweDAwOWMgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA0MTA2LCAwKTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfUmVhZF9EYXRhX0Jsb2NrX1NpemVfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfRGF0YV9CbG9ja19TaXplX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfUmVhZF9EYXRhX0Jsb2NrX1NpemVfQ21kICggMHgwMDlkICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDUxMjEsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCAoIDB4MDA5ZSApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMzE3NCwgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfRmxvd19Db250cm9sX01vZGVfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9SZWFkX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCAoIDB4MDA5ZiApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfTGlua19RdWFsaXR5X0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDUxMjMsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX1JlYWRfTGlua19RdWFsaXR5X0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xpbmtfUXVhbGl0eV9DbWQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCAoIDB4MDBhMCApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDMxMjYsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kICggMHgwMGExICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9Bc3NvY19DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNTEzMCwgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgICpwQnVmID0gcFNyYy0+cGh5X2xpbmtfaGFuZGxlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bGVuZ3RoX3NvX2ZhciwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tYXhfcmVtb3RlX2FtcF9hc3NvY19sZW5ndGgsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9SZWFkX0xvY2FsX0FNUF9Bc3NvY19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kICggMHgwMGEyICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNTEyOSwgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZCAoIDB4MDBhMyApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNDA5OCwgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1JlYWRfTG9jYWxfU3VwcG9ydGVkX0NtZHNfQ21kICggMHgwMGE0ICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX1ZlcnNpb25fSW5mb19DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNDA5NywgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pIAorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX1JlYWRfTG9jYWxfVmVyc2lvbl9JbmZvX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9SZWFkX0xvY2FsX1ZlcnNpb25fSW5mb19DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9SZWFkX0xvY2FsX1ZlcnNpb25fSW5mb19DbWQgKCAweDAwYTUgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZWFkX0xvY2F0aW9uX0RhdGFfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0xvY2F0aW9uX0RhdGFfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMzE3MiwgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9SZWFkX0xvY2F0aW9uX0RhdGFfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQgKCAweDAwYTYgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCAzMTY5LCAwKTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1JlYWRfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kICggMHgwMGE3ICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDYxNDUsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9SZWFkX0xvb3BiYWNrX01vZGVfQ21kICggMHgwMGE4ICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfUmVhZF9SU1NJX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfUlNTSV9DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfUmVhZF9SU1NJX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDUxMjUsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9SZWFkX1JTU0lfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX1JlYWRfUlNTSV9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVhZF9SU1NJX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfUmVhZF9SU1NJX0NtZCAoIDB4MDBhOSApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1Jlc2V0X0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfUmVzZXRfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1Jlc2V0X0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDMwNzUsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX1Jlc2V0X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9SZXNldF9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfUmVzZXRfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9SZXNldF9DbWQgKCAweDAwYWEgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDUxMjIsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfUmVzZXRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQgKCAweDAwYWIgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19DbWQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9TZXRfRXZlbnRfTWFza19DbWQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCAzMDc3LCAwKTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmV2ZW50X21hc2ssIDgpOworICAgICAgICAqcG5Db25zdW1lZCArPSA4OworICAgICAgICBwQnVmICs9IDg7CisgICAgICAgIG5CdWYgLT0gODsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kICggMHgwMGFjICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDMxNzEsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+ZXZlbnRfbWFza19wYWdlXzIsIDgpOworICAgICAgICAqcG5Db25zdW1lZCArPSA4OworICAgICAgICBwQnVmICs9IDg7CisgICAgICAgIG5CdWYgLT0gODsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19QYWdlXzJfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZCAoIDB4MDBhZCApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDMxNzksIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+c2hvcnRfcmFuZ2VfbW9kZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9TZXRfU2hvcnRfUmFuZ2VfTW9kZV9DbWQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1NldF9TaG9ydF9SYW5nZV9Nb2RlX0NtZCAoIDB4MDBhZSApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50KHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMTsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50KHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNzYsIDApOworICAgICAgICBlbHNlICpwQnVmID0gNzY7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgICpwQnVmID0gcFNyYy0+c3RhdHVzOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5waHlfbGlua19oYW5kbGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnNob3J0X3JhbmdlX21vZGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50LiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50X3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50ICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9TaG9ydF9SYW5nZV9Nb2RlX0NoYW5nZV9Db21wbGV0ZV9FdmVudCAoIDB4MDBhZiApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMzE3OCwgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmxvZ19saW5rX2hhbmRsZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5iZXN0X2VmZm9ydF9mbHVzaF90aW1lb3V0LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICBuQnVmIC09IDQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kICggMHgwMGIwICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCAzMDk0LCAwKTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y29ubmVjdGlvbl9hY2NlcHRfdGltZW91dCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kLiAqLworCit0eXBlZGVmIHZfVTMyX3QgKCpwZm5QYWNrVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9Xcml0ZV9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCAoIDB4MDBiMSApCisKK3ZfVTMyX3QgYnRhbXBQYWNrVGx2SENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcG5Db25zdW1lZCkKK3sKKyAgICB2X1U4X3QqIHBUbHZMZW4gPSAwOworICAgIHZfVTMyX3QgbkNvbnN1bWVkT25FbnRyeTsKKyAgICB2X1UzMl90IHN0YXR1cyA9IEJUQU1QX1BBUlNFX1NVQ0NFU1M7CisgICAgdl9VMzJfdCBuTmVlZGVkID0gMFU7CisgICAgdl9VMzJfdCBzVHlwZSA9IDBVOworICAgIHZfVTMyX3Qgc0xlbiA9IDBVOworICAgIHNUeXBlID0gMjsKKyAgICBzTGVuID0gMTsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBDdHggPT0gTlVMTCB8fCBwU3JjID09IE5VTEwgfHwKKyAgICAgICAgcEJ1ZiA9PSBOVUxMIHx8IHBuQ29uc3VtZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJhZCBpbnB1dCIgKTsKKyAgICAgICAgcmV0dXJuIEJUQU1QX0JBRF9JTlBVVF9CVUZGRVI7CisgICAgfQorICAgIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKworICAgIHN0YXR1cyA9IGJ0YW1wR2V0UGFja2VkVGx2SENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDMxNzUsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmZsb3dfY29udHJvbF9tb2RlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kICggMHgwMGIyICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJ0YW1wVExWSENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDMxMjcsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5sb2dfbGlua19oYW5kbGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bGlua19zdXBlcnZpc2lvbl90aW1lb3V0LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQgKCAweDAwYjMgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDMxNzMsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmxvY19kb21haW5fYXdhcmU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAxOworICAgICAgICBCVEFNUF9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+bG9jX2RvbWFpbiwgMyk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDM7CisgICAgICAgIHBCdWYgKz0gMzsKKyAgICAgICAgbkJ1ZiAtPSAzOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmxvY19vcHRpb25zOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWQgKCAweDAwYjQgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMzE3MCwgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmxvZ2ljYWxfbGlua19hY2NlcHRfdGltZW91dCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRsdkxlbiAmJiBzTGVuID09IDIpCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuLCAwKTsKKyAgICB9IGVsc2UgaWYoTlVMTCAhPSBwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAodl9VOF90KSgqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgYnRhbXBQYWNrVGx2SENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kICosIHZfVThfdCosIHZfVTMyX3QsIHZfVTMyX3QqKTsKKyNkZWZpbmUgU2lnUGFja1RsdkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kICggMHgwMGI1ICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA2MTQ2LCAwKTsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5sb29wYmFja19tb2RlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZC4gKi8KKwordHlwZWRlZiB2X1UzMl90ICgqcGZuUGFja1RsdkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZF90KSh2b2lkICosIHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQgKCAweDAwYjYgKQorCit2X1UzMl90IGJ0YW1wUGFja1RsdkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZCh2b2lkICogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VOF90KiBwVGx2TGVuID0gMDsKKyAgICB2X1UzMl90IG5Db25zdW1lZE9uRW50cnk7CisgICAgdl9VMzJfdCBzdGF0dXMgPSBCVEFNUF9QQVJTRV9TVUNDRVNTOworICAgIHZfVTMyX3Qgbk5lZWRlZCA9IDBVOworICAgIHZfVTMyX3Qgc1R5cGUgPSAwVTsKKyAgICB2X1UzMl90IHNMZW4gPSAwVTsKKyAgICBzVHlwZSA9IDI7CisgICAgc0xlbiA9IDE7CisgICAgICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmKCBwQ3R4ID09IE5VTEwgfHwgcFNyYyA9PSBOVUxMIHx8CisgICAgICAgIHBCdWYgPT0gTlVMTCB8fCBwbkNvbnN1bWVkID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJiYWQgaW5wdXQiICk7CisgICAgICAgIHJldHVybiBCVEFNUF9CQURfSU5QVVRfQlVGRkVSOworICAgIH0KKyAgICBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisKKyAgICBzdGF0dXMgPSBidGFtcEdldFBhY2tlZFRsdkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIEJUQU1QX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIG5OZWVkZWQgKz0gc1R5cGUgKyBzTGVuOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gQlRBTVBfQlVGRkVSX09WRVJGTE9XOworICAgIHBUbHZMZW4gPSBwQnVmOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiggc1R5cGUgPT0gMikgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDUxMzEsIDApOworICAgICAgICBwQnVmICs9IHNUeXBlOyBuQnVmIC09IHNUeXBlOyAqcG5Db25zdW1lZCArPSBzVHlwZTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gc0xlbjsgbkJ1ZiAtPSBzTGVuOyAqcG5Db25zdW1lZCArPSBzTGVuOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnBoeV9saW5rX2hhbmRsZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09IDE7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmxlbmd0aF9zb19mYXIsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YW1wX2Fzc29jX3JlbWFpbmluZ19sZW5ndGgsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gMjsKKyAgICAgICAgQlRBTVBfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPmFtcF9hc3NvY19mcmFnbWVudCApLCBwU3JjLT5hbXBfYXNzb2NfcmVtYWluaW5nX2xlbmd0aCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPmFtcF9hc3NvY19yZW1haW5pbmdfbGVuZ3RoOworICAgICAgICBwQnVmICs9ICggcFNyYy0+YW1wX2Fzc29jX3JlbWFpbmluZ19sZW5ndGggKTsKKyAgICAgICAgbkJ1ZiAtPSAoIHBTcmMtPmFtcF9hc3NvY19yZW1haW5pbmdfbGVuZ3RoICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kICggMHgwMGI3ICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCdGFtcFRMVkhDSV9FbmhhbmNlZF9GbHVzaF9DbWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAyOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgQlRBTVBfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgbk5lZWRlZCArPSBzVHlwZSArIHNMZW47CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBCVEFNUF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBzVHlwZSA9PSAyKSBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgMzE2NywgMCk7CisgICAgICAgIHBCdWYgKz0gc1R5cGU7IG5CdWYgLT0gc1R5cGU7ICpwbkNvbnN1bWVkICs9IHNUeXBlOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSBzTGVuOyBuQnVmIC09IHNMZW47ICpwbkNvbnN1bWVkICs9IHNMZW47CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmxvZ19saW5rX2hhbmRsZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAyOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnBhY2tldF90eXBlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHBUbHZMZW4gJiYgc0xlbiA9PSAyKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbiwgMCk7CisgICAgfSBlbHNlIGlmKE5VTEwgIT0gcFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKHZfVThfdCkoKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gc1R5cGUgLSBzTGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGJ0YW1wUGFja1RsdkhDSV9FbmhhbmNlZF9GbHVzaF9DbWQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kX3QpKHZvaWQgKiwgdEJ0YW1wVExWSENJX0VuaGFuY2VkX0ZsdXNoX0NtZCAqLCB2X1U4X3QqLCB2X1UzMl90LCB2X1UzMl90Kik7CisjZGVmaW5lIFNpZ1BhY2tUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ21kICggMHgwMGI4ICkKKwordl9VMzJfdCBidGFtcFBhY2tUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ29tcGxldGVfRXZlbnQodm9pZCAqIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QnRhbXBUTFZIQ0lfRW5oYW5jZWRfRmx1c2hfQ29tcGxldGVfRXZlbnQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90ICpwbkNvbnN1bWVkKQoreworICAgIHZfVThfdCogcFRsdkxlbiA9IDA7CisgICAgdl9VMzJfdCBuQ29uc3VtZWRPbkVudHJ5OworICAgIHZfVTMyX3Qgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICB2X1UzMl90IG5OZWVkZWQgPSAwVTsKKyAgICB2X1UzMl90IHNUeXBlID0gMFU7CisgICAgdl9VMzJfdCBzTGVuID0gMFU7CisgICAgc1R5cGUgPSAxOworICAgIHNMZW4gPSAxOworICAgICAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiggcEN0eCA9PSBOVUxMIHx8IHBTcmMgPT0gTlVMTCB8fAorICAgICAgICBwQnVmID09IE5VTEwgfHwgcG5Db25zdW1lZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYmFkIGlucHV0IiApOworICAgICAgICByZXR1cm4gQlRBTVBfQkFEX0lOUFVUX0JVRkZFUjsKKyAgICB9CisgICAgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworCisgICAgc3RhdHVzID0gYnRhbXBHZXRQYWNrZWRUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ29tcGxldGVfRXZlbnQocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBCVEFNUF9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBuTmVlZGVkICs9IHNUeXBlICsgc0xlbjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYoIHNUeXBlID09IDIpIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA1NywgMCk7CisgICAgICAgIGVsc2UgKnBCdWYgPSA1NzsKKyAgICAgICAgcEJ1ZiArPSBzVHlwZTsgbkJ1ZiAtPSBzVHlwZTsgKnBuQ29uc3VtZWQgKz0gc1R5cGU7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IHNMZW47IG5CdWYgLT0gc0xlbjsgKnBuQ29uc3VtZWQgKz0gc0xlbjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bG9nX2xpbmtfaGFuZGxlLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwVGx2TGVuICYmIHNMZW4gPT0gMikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSBzVHlwZSAtIHNMZW4sIDApOworICAgIH0gZWxzZSBpZihOVUxMICE9IHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICh2X1U4X3QpKCpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIHNUeXBlIC0gc0xlbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBidGFtcFBhY2tUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ29tcGxldGVfRXZlbnQuICovCisKK3R5cGVkZWYgdl9VMzJfdCAoKnBmblBhY2tUbHZIQ0lfRW5oYW5jZWRfRmx1c2hfQ29tcGxldGVfRXZlbnRfdCkodm9pZCAqLCB0QnRhbXBUTFZIQ0lfRW5oYW5jZWRfRmx1c2hfQ29tcGxldGVfRXZlbnQgKiwgdl9VOF90Kiwgdl9VMzJfdCwgdl9VMzJfdCopOworI2RlZmluZSBTaWdQYWNrVGx2SENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50ICggMHgwMGI5ICkKKwordl9VMzJfdCBidGFtcFBhY2tBTVBfQVNTT0Modm9pZCAqIHBDdHgsIHRCdGFtcEFNUF9BU1NPQyAqcEZybSwgdl9VOF90ICpwQnVmLCB2X1UzMl90IG5CdWYsIHZfVTMyX3QgKnBuQ29uc3VtZWQpCit7CisgICAgdl9VMzJfdCBpOworICAgIHN0YXRpYyB0VExWRGVmbiBUTFZTWyBdID0geworICAgICAgICB7QlRBTVBfVExWX0FNUF9BU1NPQ19NQUNfQUREUiwgMCwgOSwgOSwgb2Zmc2V0b2YodEJ0YW1wQU1QX0FTU09DLCBBTVBfQXNzb2NfTUFDX0FkZHIpLCBvZmZzZXRvZih0QnRhbXBUTFZBTVBfQXNzb2NfTUFDX0FkZHIsIHByZXNlbnQpLCBTaWdQYWNrVGx2QU1QX0Fzc29jX01BQ19BZGRyLCAocGZuR2VuZXJpY190KWJ0YW1wUGFja1RsdkFNUF9Bc3NvY19NQUNfQWRkciwgIkFNUF9Bc3NvY19NQUNfQWRkciIsIDEsIH0sCisgICAgICAgIHtCVEFNUF9UTFZfQU1QX0FTU09DX1BSRUZFUlJFRF9DSEFOTkVMX0xJU1QsIDAsIDksIDEyLCBvZmZzZXRvZih0QnRhbXBBTVBfQVNTT0MsIEFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0KSwgb2Zmc2V0b2YodEJ0YW1wVExWQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QsIHByZXNlbnQpLCBTaWdQYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QsIChwZm5HZW5lcmljX3QpYnRhbXBQYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QsICJBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdCIsIDEsIH0sCisgICAgICAgIHtCVEFNUF9UTFZfQU1QX0FTU09DX0NPTk5FQ1RFRF9DSEFOTkVMLCAwLCA5LCAxMiwgb2Zmc2V0b2YodEJ0YW1wQU1QX0FTU09DLCBBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwpLCBvZmZzZXRvZih0QnRhbXBUTFZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwsIHByZXNlbnQpLCBTaWdQYWNrVGx2QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLCAocGZuR2VuZXJpY190KWJ0YW1wUGFja1RsdkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCwgIkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbCIsIDAsIH0sCisgICAgICAgIHtCVEFNUF9UTFZfQU1QX0FTU09DX1BBTF9DQVBBQklMSVRJRVMsIDAsIDcsIDcsIG9mZnNldG9mKHRCdGFtcEFNUF9BU1NPQywgQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMpLCBvZmZzZXRvZih0QnRhbXBUTFZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcywgcHJlc2VudCksIFNpZ1BhY2tUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcywgKHBmbkdlbmVyaWNfdClidGFtcFBhY2tUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcywgIkFNUF9Bc3NvY19QQUxfQ2FwYWJpbGl0aWVzIiwgMCwgfSwKKyAgICAgICAge0JUQU1QX1RMVl9BTVBfQVNTT0NfUEFMX1ZFUlNJT04sIDAsIDgsIDgsIG9mZnNldG9mKHRCdGFtcEFNUF9BU1NPQywgQU1QX0Fzc29jX1BBTF9WZXJzaW9uKSwgb2Zmc2V0b2YodEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9WZXJzaW9uLCBwcmVzZW50KSwgU2lnUGFja1RsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbiwgKHBmbkdlbmVyaWNfdClidGFtcFBhY2tUbHZBTVBfQXNzb2NfUEFMX1ZlcnNpb24sICJBTVBfQXNzb2NfUEFMX1ZlcnNpb24iLCAxLCB9LAorICAgIHsgMHhmZmZmLCAwIH0sCisgICAgfTsKKworICAgIHZfVTMyX3QgaWR4ID0gMDsKKyAgICB2X1UzMl90IHN0YXR1cyA9IDA7CisgICAgKHZvaWQpaTsKKyAgICAqcG5Db25zdW1lZCA9IDBVOworICAgIHN0YXR1cyB8PSBQYWNrVGx2Q29yZShwQ3R4LCh2X1U4X3QqKXBGcm0scEJ1ZixuQnVmLHBuQ29uc3VtZWQsVExWUywmaWR4KTsKKworIyAgIGlmZGVmIEJUQU1QX0RVTVBfRlJBTUVTCisgICAgaWYgKCFCVEFNUF9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIEZSRkwoIlBhY2tlZCB0aGUgQU1QX0FTU09DOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCBGUkZMKCJBTVBfQXNzb2NfTUFDX0FkZHI6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+QU1QX0Fzc29jX01BQ19BZGRyLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgKCB2X1U4X3QqICkmcEZybS0+QU1QX0Fzc29jX01BQ19BZGRyLm1hY19hZGRyLCA2KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCBGUkZMKCJBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksICggdl9VOF90KiApJnBGcm0tPkFNUF9Bc3NvY19QcmVmZXJyZWRfQ2hhbm5lbF9MaXN0LmNvdW50cnksIDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgRlJGTCgibnVtX3RyaXBsZXRzOiAlZC5cbiIpLCBwRnJtLT5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC5udW1fdHJpcGxldHMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgKCB2X1U4X3QqICkgcEZybS0+QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QudHJpcGxldHMsIDMgKiBwRnJtLT5BTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdC5udW1fdHJpcGxldHMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIEZSRkwoIkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5BTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCAoIHZfVThfdCogKSZwRnJtLT5BTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwuY291bnRyeSwgMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCBGUkZMKCJudW1fdHJpcGxldHM6ICVkLlxuIiksIHBGcm0tPkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbC5udW1fdHJpcGxldHMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgKCB2X1U4X3QqICkgcEZybS0+QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLnRyaXBsZXRzLCAzICogcEZybS0+QU1QX0Fzc29jX0Nvbm5lY3RlZF9DaGFubmVsLm51bV90cmlwbGV0cyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgRlJGTCgiQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCAoIHZfVThfdCogKSZwRnJtLT5BTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllcy5wYWxfY2FwYWJpbGl0aWVzLCA0KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBCVEFNUF9BTVBfQVNTT0MpLCBGUkZMKCJBTVBfQXNzb2NfUEFMX1ZlcnNpb246XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+QU1QX0Fzc29jX1BBTF9WZXJzaW9uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgKCB2X1U4X3QqICkmcEZybS0+QU1QX0Fzc29jX1BBTF9WZXJzaW9uLnBhbF92ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksICggdl9VOF90KiApJnBGcm0tPkFNUF9Bc3NvY19QQUxfVmVyc2lvbi5wYWxfQ29tcGFueUlELCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksICggdl9VOF90KiApJnBGcm0tPkFNUF9Bc3NvY19QQUxfVmVyc2lvbi5wYWxfc3VidmVyc2lvbiwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgQlRBTVBfQU1QX0FTU09DKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIEJUQU1QX0FNUF9BU1NPQyksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBCVEFNUF9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGJ0YW1wVW5wYWNrQU1QX0FTU09DLiAqLworCisKK3N0YXRpYyB2X1UzMl90IFBhY2tUbHZDb3JlKHZvaWQgKiBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnBuQ29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICB0VExWRGVmbiAgVExWc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAqcGlkeCkKK3sKKyAgICB0VExWRGVmbiAgICAgKnBUbHY7CisgICAgdEZSQU1FU19CT09MICpwZkZvdW5kOworICAgIHZfVThfdCAqcEJ1ZlJlbWFpbmluZzsKKyAgICB2X1UzMl90IG5CdWZSZW1haW5pbmcsIHN0YXR1cywgc3RhdHVzMiwgbGVuOworCisgICAgQlRBTVBfUEFSQU1FVEVSX0NIRUNLMihwU3JjLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkKTsKKworICAgICh2b2lkKXBDdHg7CisgICAgc3RhdHVzID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICBzdGF0dXMyID0gQlRBTVBfUEFSU0VfU1VDQ0VTUzsKKyAgICBwQnVmUmVtYWluaW5nID0gcEJ1ZjsKKyAgICBuQnVmUmVtYWluaW5nID0gbkJ1ZjsKKworICAgIHBUbHYgPSAmKCBUTFZzWzBdICk7CisgICAgd2hpbGUgKCAweGZmZmYgIT0gcFRsdi0+aWQgKQorICAgIHsKKyAgICAgICAgcGZGb3VuZCA9ICh0RlJBTUVTX0JPT0wqKShwU3JjICsgcFRsdi0+b2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGx2LT5wcmVzZW5jZU9mZnNldCk7CisgICAgICAgIGlmICggKnBmRm91bmQgJiYgcFRsdi0+bWluU2l6ZSA+IG5CdWZSZW1haW5pbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMyhwQ3R4LCBGUkxPR0UsIEZSRkwoIlRoZSBUTFYgJXMgdGFrZXMgYXQgbGVhc3QiCisgICAgICAgICAgICAgICAgIiAlZCBieXRlcywgYnV0IHRoZXJlIGFyZSBvbmx5ICVkIGxlZnQgaW4gdGhlIGJ1ZmZlci4iCisgICAgICAgICAgICAgICAgIlxuIiksIHBUbHYtPm5hbWUsIHBUbHYtPm1pblNpemUsIG5CdWZSZW1haW5pbmcpOworICAgICAgICAgICAgcmV0dXJuIEJUQU1QX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IDBVOworCisgICAgICAgIGlmICggKnBmRm91bmQgKSB7CisgICAgICAgIHN3aXRjaCAoIHBUbHYtPnNpZyApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWw6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkFNUF9Bc3NvY19Db25uZWN0ZWRfQ2hhbm5lbF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZBTVBfQXNzb2NfQ29ubmVjdGVkX0NoYW5uZWwqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZBTVBfQXNzb2NfTUFDX0FkZHI6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkFNUF9Bc3NvY19NQUNfQWRkcl90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZBTVBfQXNzb2NfTUFDX0FkZHIqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZBTVBfQXNzb2NfUEFMX0NhcGFiaWxpdGllczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2QU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXNfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWQU1QX0Fzc29jX1BBTF9DYXBhYmlsaXRpZXMqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZBTVBfQXNzb2NfUEFMX1ZlcnNpb246CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkFNUF9Bc3NvY19QQUxfVmVyc2lvbl90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZBTVBfQXNzb2NfUEFMX1ZlcnNpb24qICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZBTVBfQXNzb2NfUHJlZmVycmVkX0NoYW5uZWxfTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2QU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3RfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWQU1QX0Fzc29jX1ByZWZlcnJlZF9DaGFubmVsX0xpc3QqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZGbG93X1NwZWM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkZsb3dfU3BlY190KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZGbG93X1NwZWMqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfQWNjZXB0X0xvZ2ljYWxfTGlua19DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfQWNjZXB0X0xvZ2ljYWxfTGlua19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0NoYW5uZWxfU2VsZWN0ZWRfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfQ29tbWFuZF9Db21wbGV0ZV9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfQ29tbWFuZF9TdGF0dXNfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9Db21tYW5kX1N0YXR1c19FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfQ29tbWFuZF9TdGF0dXNfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9DcmVhdGVfTG9naWNhbF9MaW5rX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvd19FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0Rpc2Nvbm5lY3RfUGh5c2ljYWxfTGlua19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfRmxvd19TcGVjX01vZGlmeV9Db21wbGV0ZV9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfRmx1c2hfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfRmx1c2hfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9GbHVzaF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9GbHVzaF9PY2N1cnJlZF9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfRmx1c2hfT2NjdXJyZWRfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfR2VuZXJpY19BTVBfTGlua19LZXlfTm90aWZpY2F0aW9uX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9IYXJkd2FyZV9FcnJvcl9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50X3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfTG9vcGJhY2tfQ29tbWFuZF9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZV9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfV2FybmluZ19FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUGh5c2ljYWxfTGlua19Mb3NzX1dhcm5pbmdfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUGh5c2ljYWxfTGlua19SZWNvdmVyeV9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnlfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUW9zX1Zpb2xhdGlvbl9FdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1Fvc19WaW9sYXRpb25fRXZlbnRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1Fvc19WaW9sYXRpb25fRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9SZWFkX0J1ZmZlcl9TaXplX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9CdWZmZXJfU2l6ZV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1JlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9EYXRhX0Jsb2NrX1NpemVfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfUmVhZF9EYXRhX0Jsb2NrX1NpemVfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZWFkX0RhdGFfQmxvY2tfU2l6ZV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9GbG93X0NvbnRyb2xfTW9kZV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9SZWFkX0Zsb3dfQ29udHJvbF9Nb2RlX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9GbG93X0NvbnRyb2xfTW9kZV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZWFkX0xpbmtfUXVhbGl0eV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfUmVhZF9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZWFkX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfQXNzb2NfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9Bc3NvY19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9BTVBfSW5mb3JtYXRpb25fQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX0FNUF9JbmZvcm1hdGlvbl9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9SZWFkX0xvY2FsX1N1cHBvcnRlZF9DbWRzX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUmVhZF9Mb2NhbF9TdXBwb3J0ZWRfQ21kc19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfUmVhZF9Mb2NhbF9WZXJzaW9uX0luZm9fQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZWFkX0xvY2FsX1ZlcnNpb25fSW5mb19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9Mb2NhdGlvbl9EYXRhX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfTG9jYXRpb25fRGF0YV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfUmVhZF9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZWFkX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9Mb29wYmFja19Nb2RlX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVhZF9SU1NJX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1JlYWRfUlNTSV9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1JlYWRfUlNTSV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVzZXRfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfUmVzZXRfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9SZXNldF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfUmVzZXRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9SZXNldF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfUmVzZXRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9TZXRfRXZlbnRfTWFza19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9TZXRfU2hvcnRfUmFuZ2VfTW9kZV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGVfRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9TaG9ydF9SYW5nZV9Nb2RlX0NoYW5nZV9Db21wbGV0ZV9FdmVudF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGVfRXZlbnQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9Xcml0ZV9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfV3JpdGVfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9Xcml0ZV9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiA9ICggKHBmblBhY2tUbHZIQ0lfV3JpdGVfRmxvd19Db250cm9sX01vZGVfQ21kX3QpKHBUbHYtPnBmbikgKShwQ3R4LCAoIHRCdGFtcFRMVkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAoIChwZm5QYWNrVGx2SENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWRfdCkocFRsdi0+cGZuKSApKHBDdHgsICggdEJ0YW1wVExWSENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1BhY2tUbHZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyID0gKCAocGZuUGFja1RsdkhDSV9Xcml0ZV9SZW1vdGVfQU1QX0FTU09DX0NtZF90KShwVGx2LT5wZm4pICkocEN0eCwgKCB0QnRhbXBUTFZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1czIpIHN0YXR1cyB8PSBzdGF0dXMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSTE9HRSwgRlJGTCgiSU5URVJOQUwgRVJST1ItLSBJIGRvbid0ICIKKyAgICAgICAgICAgICAgICAia25vdyBhYm91dCB0aGUgVExWICVkOyB0aGlzIGlzIG1vc3QgbGlrZWx5IGEgYnVnIGluICIKKyAgICAgICAgICAgICAgICAiJ2ZyYW1lc2MnLlxuIiksIHBUbHYtPnNpZyk7CisgICAgICAgICAgICByZXR1cm4gQlRBTVBfSU5URVJOQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICB9IC8qIEVuZCBpZiBvbiAqcGZGb3VuZCAqLworICAgICAgICBwQnVmUmVtYWluaW5nICs9IGxlbjsKKyAgICAgICAgbkJ1ZlJlbWFpbmluZyAtPSBsZW47CisgICAgICAgICpwbkNvbnN1bWVkICAgKz0gbGVuOworICAgICAgICArK3BUbHY7CisgICAgICAgIGlmKGxlbikgKysqcGlkeDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworCit9CisKZGlmZiAtLWdpdCBhL0NPUkUvQkFQL3NyYy9mc21EZWZzLmggYi9DT1JFL0JBUC9zcmMvZnNtRGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmZiZWUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0JBUC9zcmMvZnNtRGVmcy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvLyBQcm9qZWN0L1N5c3RlbSBkZXBlbmRhbnQgZGVmaW5lcyBhbmQgdHlwZWRlZnMKKworI2lmbmRlZiBfX0ZTTURFRlNfSF9fCisjZGVmaW5lIF9fRlNNREVGU19IX18KKworLyogVGVtcG9yYXJ5IGZpeCB1bnRpbCBJIGNsZWFuIHVwIGFsbCB0aGUgdHlwZSBuYW1lcyAqLworI2RlZmluZSBCVEFNUEZTTV9JTlNUQU5DRURBVEFfVCB0V0xBTl9CQVBiYXBQaHlzTGlua01hY2hpbmUgCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCVEFNUEZTTV9FTlRSWV9GTEFHX1Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQlRBTVBGU01fU1RBVEVWQVJfVDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCVEFNUEZTTV9JTlNUX0lEX1Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQlRBTVBGU01fRVZFTlRfVDsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9EWEUvaW5jL3dsYW5fcWN0X2R4ZS5oIGIvQ09SRS9EWEUvaW5jL3dsYW5fcWN0X2R4ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjY1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0RYRS9pbmMvd2xhbl9xY3RfZHhlLmgKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFdMQU5fUUNUX0RYRV9ICisjZGVmaW5lIFdMQU5fUUNUX0RYRV9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIEBmaWxlICB3bGFuX3FjdF9keGUuaAorICAKKyAgQGJyaWVmIAorICAgICAgICAgICAgICAgCisgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSSBleHBvc2VkIGJ5IHRoZSB3bGFuIGRhdGEgdHJhbnNmZXIgYWJzdHJhY3Rpb24gbGF5ZXIgbW9kdWxlLgorICAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjokICREYXRlVGltZTogJCAkQXV0aG9yOiAkCisKKword2hlbiAgICAgICAgICAgd2hvICAgICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgICAtLS0gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswOC8wMy8xMCAgICBzY2hhbmcgICAgICBDcmVhdGVkIG1vZHVsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTIEZPUiBNT0RVTEUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfYXBpLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3BhY2tldC5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zdGF0dXMuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9tc2cuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfc3luYy5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9kdHMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRFhFIERlc2NyaXB0b3IgY29udGVudHMgU1dBUCBvcHRpb24gZmxhZyAqLworCisvLyNkZWZpbmUgV0xBTkRYRV9FTkRJQU5fU1dBUF9FTkFCTEUKKworLyogRGVmYXVsdCBSWCBPUyBmcmFtZSBidWZmZXIgc2l6ZQorICogU2l6ZSBtdXN0IGJlIHNhbWUgd2l0aCBWb3MgUGFja2V0IFNpemUgKi8KKyNkZWZpbmUgV0xBTkRYRV9ERUZBVUxUX1JYX09TX0JVRkZFUl9TSVpFICAoVlBLVF9TSVpFX0JVRkZFUikKKworLypUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0aGF0IGNhbiBiZSBjaGFpbmVkIGluIGR4ZSBmb3IgdGhlIExvdyAKKyAgcHJpb3JpdHkgY2hhbm5lbAorICBOb3RlOiBJbmNyZWFzZWQgaXQgdG8gMjQwIGZyb20gMTI4IGZvciBXaW5kb3dzKEVBKSBiZWNhc2UgV2luZG93cyBpcworICBhYmxlIHRvIHB1c2ggMn42IHBhY2tldCBjaGFpbiBpbiBvbmUgTkVUX0JVRkZFUi4gSXQgY2F1c2VzIFRYIGxvdworICByZXNvdXJjZSBjb25kaXRpb24gbW9yZSBlYXNpbHkgdGhhbiBMQS4gSXQgZW5kcyB1cCB0byBjYXVzZSBsb3cgCisgIHRocm91Z2h1dCBudW1iZXIgYW5kIHNwZW5kIG1vcmUgQ1BVIHRpbWUqLworI2lmZGVmIFdJTkRPV1NfRFQKKyNkZWZpbmUgV0xBTkRYRV9MT19QUklfUkVTX05VTSAyNDAKKyNlbHNlCisjZGVmaW5lIFdMQU5EWEVfTE9fUFJJX1JFU19OVU0gMTI4CisjZW5kaWYKKworCisvKlRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgY2FuIGJlIGNoYWluZWQgaW4gZHhlIGZvciB0aGUgSEkgCisgIHByaW9yaXR5IGNoYW5uZWwgKi8KKyNkZWZpbmUgV0xBTkRYRV9ISV9QUklfUkVTX05VTSAxMAorCit0eXBlZGVmIGVudW0KK3sKKyAgIFdMQU5EWEVfUE9XRVJfU1RBVEVfRlVMTCwKKyAgIFdMQU5EWEVfUE9XRVJfU1RBVEVfSU1QUywKKyAgIFdMQU5EWEVfUE9XRVJfU1RBVEVfQk1QUywKKyAgIFdMQU5EWEVfUE9XRVJfU1RBVEVfQk1QU19QRU5ESU5HLAorICAgV0xBTkRYRV9QT1dFUl9TVEFURV9ET1dOLAorICAgV0xBTkRYRV9QT1dFUl9TVEFURV9NQVgKK30gV0xBTkRYRV9Qb3dlclN0YXRlVHlwZTsKKwordHlwZWRlZiBlbnVtCit7CisgICBXTEFORFhFX1JJVkFfUE9XRVJfU1RBVEVfQUNUSVZFLAorICAgV0xBTkRYRV9SSVZBX1BPV0VSX1NUQVRFX0lNUFNfVU5LTk9XTiwKKyAgIFdMQU5EWEVfUklWQV9QT1dFUl9TVEFURV9CTVBTX1VOS05PV04sCisgICBXTEFORFhFX1JJVkFfUE9XRVJfU1RBVEVfRE9XTl9VTktOT1dOLAorICAgV0xBTkRYRV9SSVZBX1BPV0VSX1NUQVRFX01BWAorfSBXTEFORFhFX1JpdmFQb3dlclN0YXRlVHlwZTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBUeXBlIE5hbWUKKyAgICAgIFdMQU5EWEVfUnhGcmFtZVJlYWR5Q2JUeXBlIAorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgIFJYIEZyYW1lIFJlYWR5IGluZGljYXRpb24gQ0IKKworICBAICBQYXJhbWV0ZXJzCisgICAgICAgICBwVm9pZCAgICAgICAgIHBBZGFwdG9yIDogRHJpdmVyIGdsb2JhbCBjb250cm9sIGJsb2NrIHBvaW50ZXIKKyAgICAgICAgIHBhbFBhY2tldCAgICAgcFJYRnJhbWVQdHIgOiBSZWNlaXZlZCBGcmFtZSBQb2ludGVyCisgICAgICAgICBwVm9pZCAgICAgICAgIHVzZXJDdHh0IDogRFRTIHVzZXIgY29udGVjdCBwb2ludGVyCisKKyAgQCAgUmV0dXJuCisgICAgICAgIHdwdF9zdGF0dXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit0eXBlZGVmIFdEVFNfUnhGcmFtZVJlYWR5Q2JUeXBlIFdMQU5EWEVfUnhGcmFtZVJlYWR5Q2JUeXBlOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIFR5cGUgTmFtZQorICAgICAgIFdMQU5EWEVfVHhDb21wbGV0ZUNiVHlwZSAKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIFRYIGNvbXBsZXRlIGluZGljYXRpb24gQ0IKKworICBAICBQYXJhbWV0ZXJzCisgICAgICAgICBwVm9pZCAgICAgIHBBZGFwdG9yIDogRHJpdmVyIGdsb2JhbCBjb250cm9sIGJsb2NrIHBvaW50ZXIKKyAgICAgICAgIHZvaWQgICAgICAgcFRYRnJhbWVQdHIgOiBDb21wbGV0ZWQgVFggRnJhbWUgUG9pbnRlcgorICAgICAgICAgcFZvaWQgICAgICB1c2VyQ3R4dCA6IERUUyB1c2VyIGNvbnRlY3QgcG9pbnRlcgorCisgIEAgIFJldHVybgorICAgICAgIHdwdF9zdGF0dXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit0eXBlZGVmIFdEVFNfVHhDb21wbGV0ZUNiVHlwZSBXTEFORFhFX1R4Q29tcGxldGVDYlR5cGU7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgVHlwZSBOYW1lCisgICAgICBXTEFORFhFX0xvd1Jlc291cmNlQ2JUeXBlIAorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgIERYRSBMb3cgcmVzb3VyY2UgaW5kaWNhdGlvbiBDQgorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIHBWb2lkICAgICAgcEFkYXB0b3IgOiBEcml2ZXIgZ2xvYmFsIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgorICAgICAgQk9PTCAgICAgIGxvd1Jlc291cmNlQ29uZGl0aW9uIDogRFhFIGxvdyByZXNvdXJjZSBvciBub3QKKyAgICAgIHBWb2lkICAgICAgdXNlckN0eHQgOiBEVFMgdXNlciBjb250ZWN0IHBvaW50ZXIKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit0eXBlZGVmIFdEVFNfTG93UmVzb3VyY2VDYlR5cGUgV0xBTkRYRV9Mb3dSZXNvdXJjZUNiVHlwZTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBUeXBlIE5hbWUKKyAgICAgIFdMQU5EWEVfU2V0UG93ZXJTdGF0ZUNiVHlwZSAKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgICBEWEUgU2V0IHBvd2VyIHN0YXRlIEFDSyBjYWxsYmFjay4gVGhpcyBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgYmUKKyAgICAgICBpbnZva2VkIGJ5IHRoZSBEWEUgdG8gbm90aWZ5IFdESSB0aGF0IHNldCBwb3dlciBzdGF0ZSByZXF1ZXN0IGlzIGNvbXBsZXRlCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgc3RhdHVzICAgIHN0YXR1cyBvZiB0aGUgc2V0IG9wZXJhdGlvbgorICAgICAgcFVzZXJEYXRhIENvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlCisgICAgICAgICAgICAgICAgY2FsbGJhY2suCisKKyAgQCAgUmV0dXJuCisgICAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordHlwZWRlZiBXRFRTX1NldFBTQ2JUeXBlICBXTEFORFhFX1NldFBvd2VyU3RhdGVDYlR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICpGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIFdMQU5EWEVfT3BlbgorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgT3BlbiBob3N0IERYRSBkcml2ZXIsIGFsbG9jYXRlIERYRSByZXNvdXJjZXMKKyAgICAgIEFsbG9jYXRlLCBEWEUgbG9jYWwgY29udHJvbCBibG9jaywgRFhFIGRlc2NyaXB0b3IgcG9vbCwgRFhFIGRlc2NyaXB0b3IgY29udHJvbCBibG9jayBwb29sCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgcFZvaWQgICAgICBwQWRhcHRvciA6IERyaXZlciBnbG9iYWwgY29udHJvbCBibG9jayBwb2ludGVyCisKKyAgQCAgUmV0dXJuCisgICAgICBwVm9pZCBEWEUgbG9jYWwgbW9kdWxlIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKldMQU5EWEVfT3BlbgorKAorICAgdm9pZAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBGdW5jdGlvbiBOYW1lIAorICAgICAgV0xBTkRYRV9DbGllbnRSZWdpc3RyYXRpb24KKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIE1ha2UgY2FsbGJhY2sgZnVuY3Rpb25zIHJlZ2lzdHJhdGlvbiBpbnRvIERYRSBkcml2ZXIgZnJvbSBEWEUgZHJpdmVyIGNsaWVudAorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIHBWb2lkICAgICAgICAgICAgICAgICAgICAgICBwRFhFQ29udGV4dCA6IERYRSBtb2R1bGUgY29udHJvbCBibG9jaworICAgICAgV0RUU19SeEZyYW1lUmVhZHlDYlR5cGUgICAgIHJ4RnJhbWVSZWFkeUNCIDogUlggRnJhbWUgcmVhZHkgQ0IgZnVuY3Rpb24gcG9pbnRlcgorICAgICAgV0RUU19UeENvbXBsZXRlQ2JUeXBlICAgICAgIHR4Q29tcGxldGVDQiA6IFRYIGNvbXBsZXRlIENCIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAgIFdEVFNfTG93UmVzb3VyY2VDYlR5cGUgICAgICBsb3dSZXNvdXJjZUNCIDogTG93IERYRSByZXNvdXJjZSBub3RpZmljYXRpb24gQ0IgZnVuY3Rpb24gcG9pbnRlcgorICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJDb250ZXh0IDogRFhFIENsaWVubnQgY29udHJvbCBibG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3dwdF9zdGF0dXMgV0xBTkRYRV9DbGllbnRSZWdpc3RyYXRpb24KKygKKyAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwRFhFQ29udGV4dCwKKyAgIFdEVFNfUnhGcmFtZVJlYWR5Q2JUeXBlICAgICByeEZyYW1lUmVhZHlDQiwKKyAgIFdEVFNfVHhDb21wbGV0ZUNiVHlwZSAgICAgICB0eENvbXBsZXRlQ0IsCisgICBXRFRTX0xvd1Jlc291cmNlQ2JUeXBlICAgICAgbG93UmVzb3VyY2VDQiwKKyAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICp1c2VyQ29udGV4dAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBGdW5jdGlvbiBOYW1lIAorICAgICAgV0xBTkRYRV9TdGFydAorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgU3RhcnQgSG9zdCBEWEUgZHJpdmVyCisgICAgICBJbml0aWFsaXplIERYRSBjaGFubmVscyBhbmQgc3RhcnQgY2hhbm5lbAorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIHBWb2lkICAgICAgICAgICAgICAgICAgICAgICBwRFhFQ29udGV4dCA6IERYRSBtb2R1bGUgY29udHJvbCBibG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3dwdF9zdGF0dXMgV0xBTkRYRV9TdGFydAorKAorICAgdm9pZCAgKnBEWEVDb250ZXh0CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBXTEFORFhFX1RYRnJhbWUKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIFRyaWdnZXIgZnJhbWUgdHJhbnNtaXQgZnJvbSBob3N0IHRvIFJJVkEKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBwVm9pZCAgICAgICAgICAgIHBEWEVDb250ZXh0IDogRFhFIENvbnRyb2wgQmxvY2sKKyAgICAgIHdwdF9wYWNrZXQgICAgICAgcFBhY2tldCA6IHRyYW5zbWl0IHBhY2tldCBzdHJ1Y3R1cmUKKyAgICAgIFdEVFNfQ2hhbm5lbFR5cGUgY2hhbm5lbCA6IFRYIGNoYW5uZWwKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfc3RhdHVzIFdMQU5EWEVfVHhGcmFtZQorKAorICAgdm9pZCAgICAgICAgICAgICAgICAgKnBEWEVDb250ZXh0LAorICAgd3B0X3BhY2tldCAgICAgICAgICAgKnBQYWNrZXQsCisgICBXRFRTX0NoYW5uZWxUeXBlICAgICAgY2hhbm5lbAorKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBXTEFORFhFX0NvbXBsZXRlVFgKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIEluZm9ybXMgRFhFIHRoYXQgdGhlIGN1cnJlbnQgc2VyaWVzIG9mIFR4IHBhY2tldHMgaXMgY29tcGxldGUKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBwRFhFQ29udGV4dCA6IERYRSBDb250cm9sIEJsb2NrCisgICAgICB1Y1R4UmVzUmVxICAgICAgICAgIFRYIHJlc291cmNlIG51bWJlciByZXF1aXJlZCBieSBUTC9XREkKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfc3RhdHVzCitXTEFORFhFX0NvbXBsZXRlVFgKKygKKyAgdm9pZCogcERYRUNvbnRleHQsCisgIHdwdF91aW50MzIgdWNUeFJlc1JlcQorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBGdW5jdGlvbiBOYW1lIAorICAgICAgV0xBTkRYRV9TdG9wCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBTdG9wIERYRSBjaGFubmVscyBhbmQgRFhFIGVuZ2luZSBvcGVyYXRpb25zCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgcFZvaWQgICAgICAgICAgICBwRFhFQ29udGV4dCA6IERYRSBDb250cm9sIEJsb2NrCisKKyAgQCAgUmV0dXJuCisgICAgICB3cHRfc3RhdHVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLword3B0X3N0YXR1cyBXTEFORFhFX1N0b3AKKygKKyAgIHZvaWQgKnBEWEVDb250ZXh0CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBXTEFORFhFX0Nsb3NlCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBDbG9zZSBEWEUgY2hhbm5lbHMKKyAgICAgIEZyZWUgRFhFIHJlbGF0ZWQgcmVzb3VyY2VzCisgICAgICBEWEUgZGVzY3JpcHRvciBmcmVlCisgICAgICBEZXNjcmlwdG9yIGNvbnRyb2wgYmxvY2sgZnJlZQorICAgICAgUHJlIGFsbG9jYXRlZCBSWCBidWZmZXIgZnJlZQorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIHBWb2lkICAgICAgICAgICAgcERYRUNvbnRleHQgOiBEWEUgQ29udHJvbCBCbG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3dwdF9zdGF0dXMgV0xBTkRYRV9DbG9zZQorKAorICAgdm9pZCAqcERYRUNvbnRleHQKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIFdMQU5EWEVfVHJpZ2dlclRYCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBUQkQKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBwVm9pZCAgICAgICAgICAgIHBEWEVDb250ZXh0IDogRFhFIENvbnRyb2wgQmxvY2sKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfc3RhdHVzIFdMQU5EWEVfVHJpZ2dlclRYCisoCisgICB2b2lkICpwRFhFQ29udGV4dAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBGdW5jdGlvbiBOYW1lIAorICAgICAgV0xBTkRYRV9TZXRQb3dlclN0YXRlCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBGcm9tIENsaWVudCBsZXQgRFhFIGtub3dzIHdoYXQgaXMgdGhlIFdMQU4gSFcoUklWQSkgcG93ZXIgc3RhdGUKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBwVm9pZCAgICAgICAgICAgICAgICAgICAgcERYRUNvbnRleHQgOiBEWEUgQ29udHJvbCBCbG9jaworICAgICAgV0xBTkRYRV9Qb3dlclN0YXRlVHlwZSAgIHBvd2VyU3RhdGUKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfc3RhdHVzIFdMQU5EWEVfU2V0UG93ZXJTdGF0ZQorKAorICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBEWEVDb250ZXh0LAorICAgV0RUU19Qb3dlclN0YXRlVHlwZSAgICAgIHBvd2VyU3RhdGUsCisgICBXRFRTX1NldFBTQ2JUeXBlICAgICAgICAgY0JhY2sKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIFdMQU5EWEVfR2V0RnJlZVR4RGF0YVJlc051bWJlcgorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgUmV0dXJucyBmcmVlIGRlc2NyaXB0b3IgbnVtYmVycyBmb3IgVFggZGF0YSBjaGFubmVsIChUWCBoaWdoIHByaW9yaXR5KQorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIHBWb2lkICAgICAgICAgICAgcERYRUNvbnRleHQgOiBEWEUgQ29udHJvbCBCbG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3VpbnQzMiAgICAgIEZyZWUgZGVzY3JpcHRvciBudW1iZXIgb2YgVFggaGlnaCBwcmkgY2gKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfdWludDMyIFdMQU5EWEVfR2V0RnJlZVR4RGF0YVJlc051bWJlcgorKAorICAgdm9pZCAqcERYRUNvbnRleHQKKyk7CisKKyNpZmRlZiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIFdMQU5EWEVfVW5pdFRlc3QKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIFRlbXBvcmFyeSBmb3IgdGhlIERYRSBtb2R1bGUgdGVzdAorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIE5PTkUKKworICBAICBSZXR1cm4KKyAgICAgIE5PTkUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgV0xBTkRYRV9Vbml0VGVzdFN0YXJ0RFhFCisoCisgICB2b2lkCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisKKyAgQCAgRGVzY3JpcHRpb24gCisKKyAgQCAgUGFyYW1ldGVycworCisgIEAgIFJldHVybgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBXTEFORFhFX1VuaXRUZXN0RGF0YVRyYW5zZmVyCisoCisgICB2b2lkCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisKKyAgQCAgRGVzY3JpcHRpb24gCisKKyAgQCAgUGFyYW1ldGVycworCisgIEAgIFJldHVybgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBXTEFORFhFX1VuaXRUZXN0RXZlbnRIYW5kbGUKKygKKyAgIHZvaWQgICAgICpkeGVDQgorKTsKKyNlbmRpZiAvKiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUgKi8KKyNlbmRpZiAvKiBXTEFOX1FDVF9EWEVfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9EWEUvc3JjL3dsYW5fcWN0X2R4ZS5jIGIvQ09SRS9EWEUvc3JjL3dsYW5fcWN0X2R4ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODJjODYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0RYRS9zcmMvd2xhbl9xY3RfZHhlLmMKQEAgLTAsMCArMSw0MTM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgQGZpbGUgIHdsYW5fcWN0X2R4ZS5jCisgIAorICBAYnJpZWYgCisgICAgICAgICAgICAgICAKKyAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZXh0ZXJuYWwgQVBJIGV4cG9zZWQgYnkgdGhlIHdsYW4gZGF0YSB0cmFuc2ZlciBhYnN0cmFjdGlvbiBsYXllciBtb2R1bGUuCisgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAkSGVhZGVyOiQgJERhdGVUaW1lOiAkICRBdXRob3I6ICQKKworCit3aGVuICAgICAgICAgICB3aG8gICAgICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tICAgIC0tLSAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA4LzAzLzEwICAgIHNjaGFuZyAgICAgIENyZWF0ZWQgbW9kdWxlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMgRk9SIE1PRFVMRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIndsYW5fcWN0X2R4ZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X2R4ZV9pLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX2RldmljZS5oIgorI2lmZGVmIEZFQVRVUkVfUjMzRAorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9idXMuaCIKKyNlbmRpZiAvKiBGRUFUVVJFX1IzM0QgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyNkZWZpbmUgV0xBTkRYRV9ERUJVR19DSF9JTkZPX0RVTVAKKworLyogVGVtcG9yYXJ5IGNvbmZpZ3VyYXRpb24gZGVmaW5lcworICogSGF2ZSB0byBmaW5kIG91dCBwZXJtYW5lbnQgc29sdXRpb24gKi8KKyNkZWZpbmUgVF9XTEFORFhFX01BWF9ERVNDUklQVE9SX0NPVU5UICAgICA0MAorI2RlZmluZSBUX1dMQU5EWEVfTUFYX0ZSQU1FX1NJWkUgICAgICAgICAgIDIwMDAKKyNkZWZpbmUgVF9XTEFORFhFX1RYX0lOVF9FTkFCTEVfRkNPVU5UICAgICAxCisjZGVmaW5lIFRfV0xBTkRYRV9NRU1EVU1QX0JZVEVfUEVSX0xJTkUgICAgMTYKKyNkZWZpbmUgVF9XTEFORFhFX01BWF9SWF9QQUNLRVRfV0FJVCAgICAgICA2MDAwCisKKy8qIFRoaXMgaXMgdGVtcG9yYXJ5IGZvdCB0aGUgY29tcGlsZQorICogV0RJIHdpbGwgcmVsZWFzZSBvZmZpY2lhbCB2ZXJzaW9uCisgKiBUaGlzIG11c3QgYmUgcmVtb3ZlZCAqLworI2RlZmluZSBXRElfR0VUX1BBTF9DVFgoKSAgICAgICAgICAgICAgICAgIE5VTEwKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogIExvY2FsIFZhcmFibGVzCisgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFRoaXMgaXMgdGVtcCwgc29tZW9uZSBoYXZlIHRvIGFsbG9jYXRlIGZvciBtZSwgYW5kIG11c3QgYmUgcGFydCBvZiBnbG9iYWwgY29udGV4dCAqLworc3RhdGljIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgKnRlbXBEeGVDdHJsQmxrICAgICAgICAgICAgICAgID0gTlVMTDsKK3N0YXRpYyBjaGFyICAgICAgICAgICAgICAgICAgICpjaGFubmVsVHlwZVtXRFRTX0NIQU5ORUxfTUFYXSA9CisgICB7CisgICAgICAiVFhfTE9XX1BSSSIsCisgICAgICAiVFhfSElHSF9QUkkiLAorICAgICAgIlJYX0xPV19QUkkiLAorI2lmbmRlZiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUKKyAgICAgICJSWF9ISUdIX1BSSSIsCisjZWxzZQorICAgICAgIkgySF9URVNUX1RYIiwKKyAgICAgICJIMkhfVEVTVF9SWCIKKyNlbmRpZiAvKiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUgKi8KKyAgIH07CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogIEV4dGVybmFsIEZ1bmN0aW9uIFByb3RvIFR5cGUKKyAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiAgTG9jYWwgRnVuY3Rpb24gUHJvdG8gVHlwZQorICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgd3B0X3N0YXR1cyBkeGVSWEZyYW1lU2luZ2xlQnVmZmVyQWxsb2MKKygKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICAqZHhlQ3R4dCwKKyAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICAqY2hhbm5lbEVudHJ5LAorICAgV0xBTkRYRV9EZXNjQ3RybEJsa1R5cGUgICpjdXJyZW50Q3RybEJsb2NrCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiAgTG9jYWwgRnVuY3Rpb24KKyAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFdMQU5EWEVfREVCVUdfQ0hfSU5GT19EVU1QCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVDaGFubmVsTW9uaXRvcgorCisgIEAgIERlc2NyaXB0aW9uIAorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICpjaGFubmVsRW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIHNwZWNpZmljIGNvbnRyb2wgYmxvY2sKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB3cHRfc3RhdHVzIGR4ZUNoYW5uZWxNb25pdG9yCisoCisgICBjaGFyICAgICAgICAgICAgICAgICAgICAqbW9uaXRvckRlc2NyaXB0aW9uLAorICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIj09PSAlcyBDaGFubmVsIE51bWJlciAlZCwgQ2hhbm5lbCBUeXBlICVzIiwKKyAgICAgICAgICAgIG1vbml0b3JEZXNjcmlwdGlvbiwgY2hhbm5lbEVudHJ5LT5hc3NpZ25lZERNQUNoYW5uZWwsIGNoYW5uZWxUeXBlW2NoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGVdKTsKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAKKyAgICAgICAgICAgICJudW1EZXNjICVkLCBudW1GcmVlRGVzYyAlZCwgbnVtUmVzdkRlc2MgJWQiLAorICAgICAgICAgICAgICAgICAgIGNoYW5uZWxFbnRyeS0+bnVtRGVzYywgY2hhbm5lbEVudHJ5LT5udW1GcmVlRGVzYywgY2hhbm5lbEVudHJ5LT5udW1Sc3ZkRGVzYyk7CisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICJoZWFkQ0IgMHgleCwgbmV4dCAweCV4LCAgREVTQyAweCV4IiwKKyAgICAgICAgICAgICAgICAgICBjaGFubmVsRW50cnktPmhlYWRDdHJsQmxrLCBjaGFubmVsRW50cnktPmhlYWRDdHJsQmxrLT5uZXh0Q3RybEJsaywgY2hhbm5lbEVudHJ5LT5oZWFkQ3RybEJsay0+bGlua2VkRGVzY1BoeUFkZHIpOworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAidGFpbENCIDB4JXgsIG5leHQgMHgleCwgIERFU0MgMHgleCIsCisgICAgICAgICAgICAgICAgICAgY2hhbm5lbEVudHJ5LT50YWlsQ3RybEJsaywgY2hhbm5lbEVudHJ5LT50YWlsQ3RybEJsay0+bmV4dEN0cmxCbGssIGNoYW5uZWxFbnRyeS0+dGFpbEN0cmxCbGstPmxpbmtlZERlc2NQaHlBZGRyKTsKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgImhlYWRDQiBPcmRlciAlZCwgdGFpbENCIE9yZGVyICVkIiwKKyAgICAgICAgICAgIGNoYW5uZWxFbnRyeS0+aGVhZEN0cmxCbGstPmN0cmxCbGtPcmRlciwgY2hhbm5lbEVudHJ5LT50YWlsQ3RybEJsay0+Y3RybEJsa09yZGVyKTsKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIm51bUZyYWdtZW50Q3VycmVudENoYWluICVkLCBudW1Ub3RhbEZyYW1lICVkID09PSIsCisgICAgICAgICAgICBjaGFubmVsRW50cnktPm51bUZyYWdtZW50Q3VycmVudENoYWluLCAgICBjaGFubmVsRW50cnktPm51bVRvdGFsRnJhbWUpOworCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVNZW1vcnlEdW1wCisKKyAgQCAgRGVzY3JpcHRpb24gCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgc3BlY2lmaWMgY29udHJvbCBibG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHdwdF9zdGF0dXMgZHhlTWVtb3J5RHVtcAorKAorICAgd3B0X3VpbnQ4ICAgICpkdW1wUG9pbnRlciwKKyAgIHdwdF91aW50MzIgICAgZHVtcFNpemUsCisgICBjaGFyICAgICAgICAgKmR1bXBUYXJnZXQKKykKK3sKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICAgc3RhdHVzICAgICAgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgIG51bUJ5dGVzICAgID0gMDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgaWR4OworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIik7CisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBMb2NhdGlvbiAweCV4LCBTaXplICVkIiwgZHVtcFRhcmdldCwgZHVtcFBvaW50ZXIsIGR1bXBTaXplKTsKKworICAgbnVtQnl0ZXMgPSBkdW1wU2l6ZSAlIFRfV0xBTkRYRV9NRU1EVU1QX0JZVEVfUEVSX0xJTkU7CisgICBmb3IoaWR4ID0gMDsgaWR4IDwgZHVtcFNpemU7IGlkeCsrKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAiMHglMnggIiwgZHVtcFBvaW50ZXJbaWR4XSk7CisgICAgICBpZigwID09ICgoaWR4ICsgMSkgJSBUX1dMQU5EWEVfTUVNRFVNUF9CWVRFX1BFUl9MSU5FKSkKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAiXG4iKTsKKyAgICAgIH0KKyAgIH0KKyAgIGlmKDAgIT0gbnVtQnl0ZXMpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywgIlxuIik7CisgICB9CisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIik7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZURlc2NyaXB0b3JEdW1wCisKKyAgQCAgRGVzY3JpcHRpb24gCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgc3BlY2lmaWMgY29udHJvbCBibG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLword3B0X3N0YXR1cyBkeGVEZXNjcmlwdG9yRHVtcAorKAorICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeSwKKyAgIFdMQU5EWEVfRGVzY1R5cGUgICAgICAgICp0YXJnZXREZXNjLAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgIGZyYWdtZW50T3JkZXIKKykKK3sKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICAgc3RhdHVzICAgICAgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyIpOworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiRGVzY3JpcHRvciBEdW1wIGZvciBjaGFubmVsICVzLCAlZCAvICVkIGZyYWdtZW50IiwKKyAgICAgICAgICAgICAgICAgICBjaGFubmVsVHlwZVtjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlXSwKKyAgICAgICAgICAgICAgICAgICBmcmFnbWVudE9yZGVyICsgMSwKKyAgICAgICAgICAgICAgICAgICBjaGFubmVsRW50cnktPm51bUZyYWdtZW50Q3VycmVudENoYWluKTsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiQ1RSTCBXT1JEIDB4JXgsIFRyYW5zZmVyU2l6ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgV0xBTkRYRV9VMzJfU1dBUF9FTkRJQU4odGFyZ2V0RGVzYy0+ZGVzY0N0cmwuY3RybCksCisgICAgICAgICAgICBXTEFORFhFX1UzMl9TV0FQX0VORElBTih0YXJnZXREZXNjLT54ZnJTaXplKSk7CisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICJTUkMgQUREIDB4JXgsIERTVCBBREQgMHgleCwgTkVYVCBERVNDIDB4JXgiLAorICAgICAgICAgICAgICAgICAgIFdMQU5EWEVfVTMyX1NXQVBfRU5ESUFOKHRhcmdldERlc2MtPmR4ZWRlc2MuZHhlX3Nob3J0X2Rlc2Muc3JjTWVtQWRkckwpLAorICAgICAgICAgICAgICAgICAgIFdMQU5EWEVfVTMyX1NXQVBfRU5ESUFOKHRhcmdldERlc2MtPmR4ZWRlc2MuZHhlX3Nob3J0X2Rlc2MuZHN0TWVtQWRkckwpLAorICAgICAgICAgICAgICAgICAgIFdMQU5EWEVfVTMyX1NXQVBfRU5ESUFOKHRhcmdldERlc2MtPmR4ZWRlc2MuZHhlX3Nob3J0X2Rlc2MucGh5TmV4dEwpKTsKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysiKTsKKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBGdW5jdGlvbiBOYW1lIAorICAgICAgZHhlQ2hhbm5lbFJlZ2lzdGVyRHVtcAorCisgIEAgIERlc2NyaXB0aW9uIAorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICpjaGFubmVsRW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIHNwZWNpZmljIGNvbnRyb2wgYmxvY2sKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3dwdF9zdGF0dXMgZHhlQ2hhbm5lbFJlZ2lzdGVyRHVtcAorKAorICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeSwKKyAgIGNoYXIgICAgICAgICAgICAgICAgICAgICpkdW1wVGFyZ2V0CispCit7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgIHN0YXR1cyAgICAgID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICByZWdWYWx1ZSAgICA9IDA7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIENoYW5uZWwgcmVnaXN0ZXIgZHVtcCBmb3IgJXMsIGJhc2UgYWRkcmVzcyAweCV4IiwgCisgICAgICAgICAgICAgICAgICAgY2hhbm5lbFR5cGVbY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZV0sCisgICAgICAgICAgICAgICAgICAgZHVtcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICBjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRUJhc2VBZGRyKTsKKyAgIHJlZ1ZhbHVlID0gMDsKKyAgIHdwYWxSZWFkUmVnaXN0ZXIoY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVDdHJsUmVnQWRkciwgJnJlZ1ZhbHVlKTsKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIkNvbnRyb2wgUmVnaXN0ZXIgMHgleCIsIHJlZ1ZhbHVlKTsKKworICAgcmVnVmFsdWUgPSAwOworICAgd3BhbFJlYWRSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRVN0YXR1c1JlZ0FkZHIsICZyZWdWYWx1ZSk7CisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICJTdGF0dXMgUmVnaXN0ZXIgMHgleCIsIHJlZ1ZhbHVlKTsKKyAgIHJlZ1ZhbHVlID0gMDsKKworICAgd3BhbFJlYWRSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRVNhZHJsUmVnQWRkciwgJnJlZ1ZhbHVlKTsKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIlNvdXJjZSBBZGRyZXNzIFJlZ2lzdGVyIDB4JXgiLCByZWdWYWx1ZSk7CisgICByZWdWYWx1ZSA9IDA7CisKKyAgIHdwYWxSZWFkUmVnaXN0ZXIoY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVEYWRybFJlZ0FkZHIsICZyZWdWYWx1ZSk7CisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICJEZXN0aW5hdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDB4JXgiLCByZWdWYWx1ZSk7CisgICByZWdWYWx1ZSA9IDA7CisKKyAgIHdwYWxSZWFkUmVnaXN0ZXIoY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVMc3REZXNjbFJlZ0FkZHIsICZyZWdWYWx1ZSk7CisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICJEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgMHgleCIsIHJlZ1ZhbHVlKTsKKworICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBXTEFORFhFX0RFQlVHX0NIX0lORk9fRFVNUCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVDdHJsQmxrQWxsb2MKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIEFsbG9jYXRlIERYRSBDb250cm9sIGJsb2NrCisgICAgICBEWEUgY29udHJvbCBibG9jayB3aWxsIHVzZWQgYnkgSG9zdCBEWEUgZHJpdmVyIG9ubHksIGludGVybmFsIHN0cnVjdHVyZQorICAgICAgV2lsbCBtYWtlIHJpbmcgbGlua2VkIGxpc3QKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAqZHhlQ3RybEJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWEUgaG9zdCBkcml2ZXIgbWFpbiBjb250cm9sIGJsb2NrCisgICAgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbCBzcGVjaWZpYyBjb250cm9sIGJsb2NrCisKKyAgQCAgUmV0dXJuCisgICAgICB3cHRfc3RhdHVzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgd3B0X3N0YXR1cyBkeGVDdHJsQmxrQWxsb2MKKygKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpkeGVDdHJsQmxrLAorICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIGlkeCwgZklkeDsKKyAgIFdMQU5EWEVfRGVzY0N0cmxCbGtUeXBlICAqY3VycmVudEN0cmxCbGsgPSBOVUxMOworICAgV0xBTkRYRV9EZXNjQ3RybEJsa1R5cGUgICpmcmVlQ3RybEJsayA9IE5VTEw7CisgICBXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAgKnByZXZDdHJsQmxrID0gTlVMTDsKKyAgIFdMQU5EWEVfRGVzY0N0cmxCbGtUeXBlICAqbmV4dEN0cmxCbGsgPSBOVUxMOworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFbnRlciIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qIFNhbml0eSBjaGVjayAqLworICAgaWYoKE5VTEwgPT0gZHhlQ3RybEJsaykgfHwgKE5VTEwgPT0gY2hhbm5lbEVudHJ5KSkKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZUN0cmxCbGtBbGxvYyBDaGFubmVsIEVudHJ5IGlzIG5vdCB2YWxpZCIpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLyogQWxsb2NhdGUgcHJlIGFzaWduZWQgbnVtYmVyIG9mIGNvbnRyb2wgYmxvY2tzICovCisgICBmb3IoaWR4ID0gMDsgaWR4IDwgY2hhbm5lbEVudHJ5LT5udW1EZXNjOyBpZHgrKykKKyAgIHsKKyAgICAgIGN1cnJlbnRDdHJsQmxrID0gKFdMQU5EWEVfRGVzY0N0cmxCbGtUeXBlICopd3BhbE1lbW9yeUFsbG9jYXRlKHNpemVvZihXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSkpOworICAgICAgaWYoTlVMTCA9PSBjdXJyZW50Q3RybEJsaykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImR4ZUN0cmxCbGtPcGVuIE1lbUFsbG9jIEZhaWwgZm9yIGNoYW5uZWwgJWQiLAorICAgICAgICAgICAgICAgICAgY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSk7CisgICAgICAgICBmcmVlQ3RybEJsayA9IGNoYW5uZWxFbnRyeS0+aGVhZEN0cmxCbGs7CisgICAgICAgICBmb3IoZklkeCA9IDA7IGZJZHggPCBpZHg7IGZJZHgrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKE5VTEwgPT0gZnJlZUN0cmxCbGspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV4dEN0cmxCbGsgPSBmcmVlQ3RybEJsay0+bmV4dEN0cmxCbGs7CisgICAgICAgICAgICB3cGFsTWVtb3J5RnJlZSgodm9pZCAqKWZyZWVDdHJsQmxrKTsKKyAgICAgICAgICAgIGZyZWVDdHJsQmxrID0gbmV4dEN0cmxCbGs7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBVUxUOworICAgICAgfQorCisgICAgICBtZW1zZXQoKHdwdF91aW50OCAqKWN1cnJlbnRDdHJsQmxrLCAwLCBzaXplb2YoV0xBTkRYRV9EZXNjQ3RybEJsa1R5cGUpKTsKKyAgICAgIC8qIEluaXRpYWxpemUgY29tbW9uIGVsZW1lbnRzIGZpcnN0ICovCisgICAgICBjdXJyZW50Q3RybEJsay0+eGZyRnJhbWUgICAgICAgICAgPSBOVUxMOworICAgICAgY3VycmVudEN0cmxCbGstPmxpbmtlZERlc2MgICAgICAgID0gTlVMTDsKKyAgICAgIGN1cnJlbnRDdHJsQmxrLT5saW5rZWREZXNjUGh5QWRkciA9IDA7CisgICAgICBjdXJyZW50Q3RybEJsay0+Y3RybEJsa09yZGVyICAgICAgPSBpZHg7CisKKyAgICAgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IGNvbnRyb2wgYmxvY2sgYWxsb2NhdGVkCisgICAgICAgKiBOZXh0IENvbnRyb2wgYmxvY2sgaXMgbm90IGFsbG9jYXRlZCB5ZXQKKyAgICAgICAqIGhlYWQgYW5kIHRhaWwgbXVzdCBiZSBmaXJzdCBjb250cm9sIGJsb2NrICovCisgICAgICBpZigwID09IGlkeCkKKyAgICAgIHsKKyAgICAgICAgIGN1cnJlbnRDdHJsQmxrLT5uZXh0Q3RybEJsayA9IE5VTEw7CisgICAgICAgICBjaGFubmVsRW50cnktPmhlYWRDdHJsQmxrICAgPSBjdXJyZW50Q3RybEJsazsKKyAgICAgICAgIGNoYW5uZWxFbnRyeS0+dGFpbEN0cmxCbGsgICA9IGN1cnJlbnRDdHJsQmxrOworICAgICAgfQorICAgICAgLyogVGhpcyBpcyBub3QgZmlyc3QsIG5vdCBsYXN0IGNvbnRyb2wgYmxvY2sKKyAgICAgICAqIHByZXZpb3VzIGNvbnRyb2wgYmxvY2sgbWF5IGhhcyBuZXh0IGxpbmtlZCBibG9jayAqLworICAgICAgZWxzZSBpZigoMCA8IGlkeCkgJiYgKGlkeCA8IChjaGFubmVsRW50cnktPm51bURlc2MgLSAxKSkpCisgICAgICB7CisgICAgICAgICBwcmV2Q3RybEJsay0+bmV4dEN0cmxCbGsgPSBjdXJyZW50Q3RybEJsazsKKyAgICAgIH0KKyAgICAgIC8qIFRoaXMgaXMgbGFzdCBjb250cm9sIGJsb2NsCisgICAgICAgKiBuZXh0IGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBsYXN0IGNvbnRyb2wgYmxvY2sgaXMgaGVhZCwgZmlyc3QgY29udHJvbCBibG9jaworICAgICAgICogdGhlbiB3aG9sZSBsaW5rZWQgbGlzdCBtYWRlIFJJTkcgKi8KKyAgICAgIGVsc2UgaWYoKGNoYW5uZWxFbnRyeS0+bnVtRGVzYyAtIDEpID09IGlkeCkKKyAgICAgIHsKKyAgICAgICAgIHByZXZDdHJsQmxrLT5uZXh0Q3RybEJsayAgICA9IGN1cnJlbnRDdHJsQmxrOworICAgICAgICAgY3VycmVudEN0cmxCbGstPm5leHRDdHJsQmxrID0gY2hhbm5lbEVudHJ5LT5oZWFkQ3RybEJsazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImR4ZUN0cmxCbGtPcGVuIEludmFsaWQgQ3RybCBCbGsgbG9jYXRpb24gJWQiLAorICAgICAgICAgICAgICAgICAgY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSk7CisgICAgICAgICB3cGFsTWVtb3J5RnJlZShjdXJyZW50Q3RybEJsayk7CisgICAgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBVUxUOworICAgICAgfQorCisgICAgICBwcmV2Q3RybEJsayA9IGN1cnJlbnRDdHJsQmxrOworICAgICAgY2hhbm5lbEVudHJ5LT5udW1GcmVlRGVzYysrOworICAgfQorCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVEZXNjTGlua0FsbG9jCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBBbGxvY2F0ZSBEWEUgZGVzY3JpcHRvcgorICAgICAgRFhFIGRlc2NyaXB0b3Igd2lsbCBiZSBzaGFyZWQgYnkgRFhFIGhvc3QgZHJpdmVyIGFuZCBSSVZBIERYRSBlbmdpbmUKKyAgICAgIFdpbGwgbWFrZSBSSU5HIGxpbmtlZCBsaXN0CisgICAgICBXaWxsIGJlIGxpbmtlZCB3aXRoIERlc2NyaXB0b3IgY29udHJvbCBibG9jayBvbmUgYnkgb25lCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhFIGhvc3QgZHJpdmVyIG1haW4gY29udHJvbCBibG9jaworICAgICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgc3BlY2lmaWMgY29udHJvbCBibG9jaworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB3cHRfc3RhdHVzIGR4ZURlc2NBbGxvY0FuZExpbmsKKygKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpkeGVDdHJsQmxrLAorICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICBzdGF0dXMgICAgICA9IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIFdMQU5EWEVfRGVzY1R5cGUgICAgICAgICAqY3VycmVudERlc2MgPSBOVUxMOworICAgV0xBTkRYRV9EZXNjVHlwZSAgICAgICAgICpwcmV2RGVzYyAgICA9IE5VTEw7CisgICBXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAgKmN1cnJlbnRDdHJsQmxrID0gTlVMTDsKKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgaWR4OworICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICpwaHlzQWRkcmVzcyA9IE5VTEw7CisjaWZkZWYgV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFCisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAgKnRlc3RUWENoYW5uZWxDQiA9ICZkeGVDdHJsQmxrLT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9IMkhfVEVTVF9UWF07CisgICBXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAgKmN1cnJEZXNjQ3RybEJsayA9IHRlc3RUWENoYW5uZWxDQi0+aGVhZEN0cmxCbGs7CisjZW5kaWYgLyogV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFKi8KKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisgICAvKiBTYW5pdHkgQ2hlY2sgKi8KKyAgIGlmKChOVUxMID09IGR4ZUN0cmxCbGspIHx8IChOVUxMID09IGNoYW5uZWxFbnRyeSkpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJkeGVEZXNjTGlua0FsbG9jIENoYW5uZWwgRW50cnkgaXMgbm90IHZhbGlkIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBjdXJyZW50Q3RybEJsayA9IGNoYW5uZWxFbnRyeS0+aGVhZEN0cmxCbGs7CisKKyNpZiAhKGRlZmluZWQoRkVBVFVSRV9SMzNEKSB8fCBkZWZpbmVkKFdMQU5EWEVfVEVTVF9DSEFOTkVMX0VOQUJMRSkpCisgICAvKiBhbGxvY2F0ZSBhbGwgRFhFIGRlc2NyaXB0b3JzIGZvciB0aGlzIGNoYW5uZWwgaW4gb25lIGNodW5rICovCisgICBjaGFubmVsRW50cnktPmRlc2NyaXB0b3JBbGxvY2F0aW9uID0gKFdMQU5EWEVfRGVzY1R5cGUgKikKKyAgICAgIHdwYWxEbWFNZW1vcnlBbGxvY2F0ZShzaXplb2YoV0xBTkRYRV9EZXNjVHlwZSkqY2hhbm5lbEVudHJ5LT5udW1EZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzQWRkcmVzcyk7CisgICBpZihOVUxMID09IGNoYW5uZWxFbnRyeS0+ZGVzY3JpcHRvckFsbG9jYXRpb24pCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJkeGVEZXNjTGlua0FsbG9jIERlc2NyaXB0b3IgQWxsb2MgRmFpbCIpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9SRVNPVVJDRVM7CisgICB9CisgICBjdXJyZW50RGVzYyA9IGNoYW5uZWxFbnRyeS0+ZGVzY3JpcHRvckFsbG9jYXRpb247CisjZW5kaWYKKworICAgLyogQWxsb2NhdGUgcHJlIGFzaWduZWQgbnVtYmVyIG9mIGRlc2NyaXB0b3IgKi8KKyAgIGZvcihpZHggPSAwOyBpZHggPCBjaGFubmVsRW50cnktPm51bURlc2M7IGlkeCsrKQorICAgeworI2lmbmRlZiBGRUFUVVJFX1IzM0QKKyNpZm5kZWYgV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFCisgICAgICAvLyBkZXNjcmlwdG9ycyB3ZXJlIGFsbG9jYXRlZCBpbiBhIGNodW5rIC0tIHVzZSB0aGUgY3VycmVudCBvbmUKKyAgICAgIG1lbXNldCgod3B0X3VpbnQ4ICopY3VycmVudERlc2MsIDAsIHNpemVvZihXTEFORFhFX0Rlc2NUeXBlKSk7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICJBbGxvY2F0ZWQgRGVzY3JpcHRvciBWQSAweCV4LCBQQSAweCV4IiwgY3VycmVudERlc2MsIHBoeXNBZGRyZXNzKTsKKyNlbHNlCisgICAgICBpZihXRFRTX0NIQU5ORUxfSDJIX1RFU1RfUlggIT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkKKyAgICAgIHsKKyAgICAgICAgIC8vIGFsbG9jYXRlIGEgZGVzY3JpcHRvcgorICAgICAgICAgY3VycmVudERlc2MgPSAoV0xBTkRYRV9EZXNjVHlwZSAqKXdwYWxEbWFNZW1vcnlBbGxvY2F0ZShzaXplb2YoV0xBTkRYRV9EZXNjVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzQWRkcmVzcyk7CisgICAgICAgICBtZW1zZXQoKHdwdF91aW50OCAqKWN1cnJlbnREZXNjLCAwLCBzaXplb2YoV0xBTkRYRV9EZXNjVHlwZSkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgY3VycmVudERlc2MgICAgID0gY3VyckRlc2NDdHJsQmxrLT5saW5rZWREZXNjOworICAgICAgICAgcGh5c0FkZHJlc3MgICAgID0gKHZvaWQgKiljdXJyRGVzY0N0cmxCbGstPmxpbmtlZERlc2NQaHlBZGRyOworICAgICAgICAgY3VyckRlc2NDdHJsQmxrID0gKFdMQU5EWEVfRGVzY0N0cmxCbGtUeXBlICopY3VyckRlc2NDdHJsQmxrLT5uZXh0Q3RybEJsazsKKyAgICAgIH0KKyNlbmRpZiAvKiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUgKi8KKyNlbHNlCisjaWZuZGVmIFdMQU5EWEVfVEVTVF9DSEFOTkVMX0VOQUJMRQorICAgICAgY3VycmVudERlc2MgPSAoV0xBTkRYRV9EZXNjVHlwZSAqKXdwYWxBY3B1RGRyRHhlRGVzY01lbW9yeUFsbG9jYXRlKCZwaHlzQWRkcmVzcyk7CisgICAgICBtZW1zZXQoKHdwdF91aW50OCAqKWN1cnJlbnREZXNjLCAwLCBzaXplb2YoV0xBTkRYRV9EZXNjVHlwZSkpOworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAiQWxsb2NhdGVkIERlc2NyaXB0b3IgVkEgMHgleCwgUEEgMHgleCIsIGN1cnJlbnREZXNjLCBwaHlzQWRkcmVzcyk7CisjZWxzZQorICAgICAgaWYoV0RUU19DSEFOTkVMX0gySF9URVNUX1JYICE9IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpCisgICAgICB7CisgICAgICAgICBjdXJyZW50RGVzYyA9IChXTEFORFhFX0Rlc2NUeXBlICopd3BhbEFjcHVEZHJEeGVEZXNjTWVtb3J5QWxsb2NhdGUoJnBoeXNBZGRyZXNzKTsKKyAgICAgICAgIG1lbXNldCgod3B0X3VpbnQ4ICopY3VycmVudERlc2MsIDAsIHNpemVvZihXTEFORFhFX0Rlc2NUeXBlKSk7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICJBbGxvY2F0ZWQgRGVzY3JpcHRvciBWQSAweCV4LCBQQSAweCV4IiwgY3VycmVudERlc2MsIHBoeXNBZGRyZXNzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGN1cnJlbnREZXNjICAgICA9IGN1cnJEZXNjQ3RybEJsay0+bGlua2VkRGVzYzsKKyAgICAgICAgIHBoeXNBZGRyZXNzICAgICA9ICh2b2lkICopY3VyckRlc2NDdHJsQmxrLT5saW5rZWREZXNjUGh5QWRkcjsKKyAgICAgICAgIGN1cnJEZXNjQ3RybEJsayA9IChXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAqKWN1cnJEZXNjQ3RybEJsay0+bmV4dEN0cmxCbGs7CisgICAgICB9CisjZW5kaWYgLyogV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFICovCisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisgICAgICBpZihOVUxMID09IGN1cnJlbnREZXNjKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlRGVzY0xpbmtBbGxvYyBNZW1BbGxvYyBGYWlsIGZvciBjaGFubmVsICVkIiwKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpOworICAgICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9GQVVMVDsKKyAgICAgIH0KKworICAgICAgaWYoKFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpIHx8CisgICAgICAgICAoV0RUU19DSEFOTkVMX1RYX0hJR0hfUFJJID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpKQorICAgICAgeworICAgICAgICAgY3VycmVudERlc2MtPmRlc2NDdHJsLmN0cmwgPSBjaGFubmVsRW50cnktPmV4dHJhQ29uZmlnLmN3X2N0cmxfd3JpdGU7CisgICAgICAgICBjdXJyZW50RGVzYy0+ZHhlZGVzYy5keGVfc2hvcnRfZGVzYy5kc3RNZW1BZGRyTCA9IGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcucmVmV1Ffc3dhcHBlZDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoKFdEVFNfQ0hBTk5FTF9SWF9MT1dfUFJJID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpIHx8CisgICAgICAgICAgICAgIChXRFRTX0NIQU5ORUxfUlhfSElHSF9QUkkgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkpCisgICAgICB7CisgICAgICAgICBjdXJyZW50RGVzYy0+ZGVzY0N0cmwuY3RybCA9IGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY3dfY3RybF9yZWFkOworICAgICAgICAgY3VycmVudERlc2MtPmR4ZWRlc2MuZHhlX3Nob3J0X2Rlc2Muc3JjTWVtQWRkckwgPSBjaGFubmVsRW50cnktPmV4dHJhQ29uZmlnLnJlZldRX3N3YXBwZWQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvKiBKdXN0IGluIGNhc2UuIEgySCBUZXN0IFJYIGNoYW5uZWwsIGRvIG5vdGhpbmcKKyAgICAgICAgICAqIEJ5IERlZmluaXRpb24gdGhpcyBtdXN0IG5vdCBoYXBwZW4gKi8KKyAgICAgIH0KKworICAgICAgY3VycmVudEN0cmxCbGstPmxpbmtlZERlc2MgICAgICAgID0gY3VycmVudERlc2M7CisgICAgICBjdXJyZW50Q3RybEJsay0+bGlua2VkRGVzY1BoeUFkZHIgPSAodW5zaWduZWQgaW50KXBoeXNBZGRyZXNzOworICAgICAgLyogRmlyc3QgZGVzY3JpcHRvciwgbmV4dCBub25lCisgICAgICAgKiBkZXNjcmlwdG9yIGJvdHRvbSBsb2NhdGlvbiBpcyBmaXJzdCBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKyAgICAgIGlmKDAgPT0gaWR4KQorICAgICAgeworICAgICAgICAgY3VycmVudERlc2MtPmR4ZWRlc2MuZHhlX3Nob3J0X2Rlc2MucGh5TmV4dEwgPSAwOworICAgICAgICAgY2hhbm5lbEVudHJ5LT5EZXNjQm90dG9tTG9jICAgICAgICAgICAgICAgICAgPSBjdXJyZW50RGVzYzsKKyAgICAgICAgIGNoYW5uZWxFbnRyeS0+ZGVzY0JvdHRvbUxvY1BoeUFkZHIgICAgICAgICAgID0gKHVuc2lnbmVkIGludClwaHlzQWRkcmVzczsKKyAgICAgIH0KKyAgICAgIC8qIE5vdCBmaXJzdCwgbm90IGxhc3QgZGVzY3JpcHRvcgorICAgICAgICogbWF5IG1ha2UgbGluayBmb3IgcHJldmlvdXMgZGVzY3JpcHRvciB3aXRoIGN1cnJlbnQgZGVzY3JpcHRvcgorICAgICAgICogRU5ESUFOIFNXQVAgbmVlZGVkID8/Pz8/ICovCisgICAgICBlbHNlIGlmKCgwIDwgaWR4KSAmJiAoaWR4IDwgKGNoYW5uZWxFbnRyeS0+bnVtRGVzYyAtIDEpKSkKKyAgICAgIHsKKyAgICAgICAgIHByZXZEZXNjLT5keGVkZXNjLmR4ZV9zaG9ydF9kZXNjLnBoeU5leHRMID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkRYRV9VMzJfU1dBUF9FTkRJQU4oKHdwdF91aW50MzIpcGh5c0FkZHJlc3MpOworICAgICAgfQorICAgICAgLyogTGFzdCBkZXNjcmlwdG9yCisgICAgICAgKiBtYWtlIGEgcmluZyBieSBhc2lnbiBuZXh0IHBvaW50ZXIgYXMgZmlyc3QgZGVzY3JpcHRvcgorICAgICAgICogRU5ESUFOIFNXQVAgTkVFREVEID8/PyAqLworICAgICAgZWxzZSBpZigoY2hhbm5lbEVudHJ5LT5udW1EZXNjIC0gMSkgPT0gaWR4KQorICAgICAgeworICAgICAgICAgcHJldkRlc2MtPmR4ZWRlc2MuZHhlX3Nob3J0X2Rlc2MucGh5TmV4dEwgICAgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFORFhFX1UzMl9TV0FQX0VORElBTigod3B0X3VpbnQzMilwaHlzQWRkcmVzcyk7CisgICAgICAgICBjdXJyZW50RGVzYy0+ZHhlZGVzYy5keGVfc2hvcnRfZGVzYy5waHlOZXh0TCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkRYRV9VMzJfU1dBUF9FTkRJQU4oKHdwdF91aW50MzIpY2hhbm5lbEVudHJ5LT5oZWFkQ3RybEJsay0+bGlua2VkRGVzY1BoeUFkZHIpOworICAgICAgfQorCisgICAgICAvKiBJZiBDdXJyZW50IENoYW5uZWwgaXMgUlggY2hhbm5lbCBQQUwgUGFja2V0IGFuZCBPUyBwYWNrZXQgYnVmZmVyIHNob3VsZCBiZQorICAgICAgICogUHJlIGFsbG9jYXRlZCBhbmQgcGh5c2ljYWwgYWRkcmVzcyBtdXN0IGJlIGFzc2lnbmVkIGludG8KKyAgICAgICAqIENvcnJlc3BvbmRpbmcgRFhFIERlc2NyaXB0b3IgKi8KKyNpZmRlZiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUKKyAgICAgIGlmKChXRFRTX0NIQU5ORUxfUlhfTE9XX1BSSSAgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkgfHwKKyAgICAgICAgIChXRFRTX0NIQU5ORUxfUlhfSElHSF9QUkkgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkgfHwKKyAgICAgICAgIChXRFRTX0NIQU5ORUxfSDJIX1RFU1RfUlggPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkpCisjZWxzZQorICAgICAgaWYoKFdEVFNfQ0hBTk5FTF9SWF9MT1dfUFJJICA9PSBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKSB8fAorICAgICAgICAgKFdEVFNfQ0hBTk5FTF9SWF9ISUdIX1BSSSA9PSBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKSkKKyNlbmRpZiAvKiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUgKi8KKyAgICAgIHsKKyAgICAgICAgIHN0YXR1cyA9IGR4ZVJYRnJhbWVTaW5nbGVCdWZmZXJBbGxvYyhkeGVDdHJsQmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q3RybEJsayk7CisgICAgICAgICBpZiggIVdMQU5fUEFMX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKQorICAgICAgICAgeworICAgICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiZHhlRGVzY0xpbmtBbGxvYyBSWCBCdWZmZXIgQWxsb2MgRmFpbCBmb3IgY2hhbm5lbCAlZCIsCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICB9CisgICAgICAgICAtLWNoYW5uZWxFbnRyeS0+bnVtRnJlZURlc2M7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnRDdHJsQmxrID0gY3VycmVudEN0cmxCbGstPm5leHRDdHJsQmxrOworICAgICAgcHJldkRlc2MgICAgICAgPSBjdXJyZW50RGVzYzsKKworI2lmbmRlZiBGRUFUVVJFX1IzM0QKKyNpZm5kZWYgV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFCisgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IHByZS1hbGxvY2F0ZWQgZGVzY3JpcHRvciBpbiB0aGUgY2h1bmsKKyAgICAgIGN1cnJlbnREZXNjKys7CisgICAgICBwaHlzQWRkcmVzcyA9ICgod3B0X2ludDggKilwaHlzQWRkcmVzcykgKyBzaXplb2YoV0xBTkRYRV9EZXNjVHlwZSk7CisjZW5kaWYKKyNlbmRpZgorICAgfQorCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZQorCisgIEAgIERlc2NyaXB0aW9uIAorCisgIEAgIFBhcmFtZXRlcnMKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB3cHRfc3RhdHVzIGR4ZVNldEludGVycnVwdFBhdGgKKygKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpkeGVDdHJsQmxrCispCit7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgICBzdGF0dXMgICAgICAgID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgaW50ZXJydXB0UGF0aCA9IDA7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICBpZHg7CisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAgICpjaGFubmVsRW50cnkgPSBOVUxMOworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFbnRlciIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIGZvcihpZHggPSAwOyBpZHggPCBXRFRTX0NIQU5ORUxfTUFYOyBpZHgrKykKKyAgIHsKKyAgICAgIGNoYW5uZWxFbnRyeSA9ICZkeGVDdHJsQmxrLT5keGVDaGFubmVsW2lkeF07CisjaWZkZWYgV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFCisgICAgICBpZigoV0RUU19DSEFOTkVMX1RYX0xPV19QUkkgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkgfHwKKyAgICAgICAgIChXRFRTX0NIQU5ORUxfVFhfSElHSF9QUkkgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkgfHwKKyAgICAgICAgIChXRFRTX0NIQU5ORUxfSDJIX1RFU1RfVFggPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkpCisjZWxzZQorICAgICAgaWYoKFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpIHx8CisgICAgICAgICAoV0RUU19DSEFOTkVMX1RYX0hJR0hfUFJJID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpKQorI2VuZGlmIC8qIFdMQU5EWEVfVEVTVF9DSEFOTkVMX0VOQUJMRSAqLworICAgICAgeworICAgICAgICAgaW50ZXJydXB0UGF0aCB8PSAoMSA8PCBjaGFubmVsRW50cnktPmFzc2lnbmVkRE1BQ2hhbm5lbCk7CisgICAgICB9CisgICAgICBlbHNlIGlmKChXRFRTX0NIQU5ORUxfUlhfTE9XX1BSSSA9PSBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKSB8fAorICAgICAgICAgICAgICAoV0RUU19DSEFOTkVMX1JYX0hJR0hfUFJJID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpKQorICAgICAgeworICAgICAgICAgaW50ZXJydXB0UGF0aCB8PSAoMSA8PCAoY2hhbm5lbEVudHJ5LT5hc3NpZ25lZERNQUNoYW5uZWwgKyAxNikpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiSDJIIFRFU1QgUlg/Pz8/ICVkIiwgY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSk7CisgICAgICB9CisgICB9CisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgIkludGVycnVwdCBQYXRoIE11c3QgYmUgMHgleCIsIGludGVycnVwdFBhdGgpOworICAgZHhlQ3RybEJsay0+aW50ZXJydXB0UGF0aCA9IGludGVycnVwdFBhdGg7CisgICB3cGFsV3JpdGVSZWdpc3RlcihXTEFORFhFX0NDVV9EWEVfSU5UX1NFTEVDVCwgaW50ZXJydXB0UGF0aCk7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEV4aXQiLCBfX0ZVTkNUSU9OX18pOworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBGdW5jdGlvbiBOYW1lCisgICAgICBkeGVFbmdpbmVDb3JlU3RhcnQgCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBUcmlnZ2VyIHRvIHN0YXJ0IFJJVkEgRFhFIEhhcmR3YXJlCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhFIGhvc3QgZHJpdmVyIG1haW4gY29udHJvbCBibG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHdwdF9zdGF0dXMgZHhlRW5naW5lQ29yZVN0YXJ0CisoCisgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAqZHhlQ3RybEJsaworKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICAgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgcmVnaXN0ZXJEYXRhID0gMDsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisgICAvKiBTVEFSVCBUaGlzIGNvcmUgaW5pdCBpcyBub3QgbmVlZGVkIGZvciB0aGUgaW50ZWdyYXRlZCBzeXN0ZW0gKi8KKyAgIC8qIFJlc2V0IEZpcnN0ICovCisgICByZWdpc3RlckRhdGEgPSBXTEFORFhFX0RNQV9DU1JfUkVTRVRfTUFTSzsKKyAgIHdwYWxXcml0ZVJlZ2lzdGVyKFdBTE5ERVhfRE1BX0NTUl9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckRhdGEpOworCisgICByZWdpc3RlckRhdGEgID0gV0xBTkRYRV9ETUFfQ1NSX0VOX01BU0s7ICAKKyAgIHJlZ2lzdGVyRGF0YSB8PSBXTEFORFhFX0RNQV9DU1JfRUNUUl9FTl9NQVNLOworICAgcmVnaXN0ZXJEYXRhIHw9IFdMQU5EWEVfRE1BX0NTUl9UU1RNUF9FTl9NQVNLOworICAgcmVnaXN0ZXJEYXRhIHw9IFdMQU5EWEVfRE1BX0NTUl9IMkhfU1lOQ19FTl9NQVNLOworCisgICByZWdpc3RlckRhdGEgPSAweDAwMDA1Yzg5OworICAgd3BhbFdyaXRlUmVnaXN0ZXIoV0FMTkRFWF9ETUFfQ1NSX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRGF0YSk7CisKKyAgIC8qIElzIFRoaXMgbmVlZGVkPworICAgICogTm90IHN1cmUsIHJldmlzaXQgd2l0aCBpbnRlZ3JhdGVkIHN5c3RlbSAqLworICAgLyogRU5EIFRoaXMgY29yZSBpbml0IGlzIG5vdCBuZWVkZWQgZm9yIHRoZSBpbnRlZ3JhdGVkIHN5c3RlbSAqLworCisgICBkeGVTZXRJbnRlcnJ1cHRQYXRoKGR4ZUN0cmxCbGspOworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVDaGFubmVsSW5pdFByb2dyYW0KKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIFByb2dyYW0gUklWQSBEWEUgZW5naW5lIHJlZ2lzdGVyIHdpdGggaW5pdGlhbCB2YWx1ZQorICAgICAgV2hhdCBtdXN0IGJlIHByb2dyYW1tZWQKKyAgICAgICAgIC0gU291cmNlIEFkZHJlc3MgICAgICAgICAgICAgKFNBRFJMLCBjaERYRVNhZHJsUmVnQWRkcikKKyAgICAgICAgIC0gRGVzdGluYXRpb24gYWRkcmVzcyAgICAgICAgKERBRFJMLCBjaERYRURhZHJsUmVnQWRkcikKKyAgICAgICAgIC0gTmV4dCBEZXNjcmlwdG9yIGFkZHJlc3MgICAgKERFU0NMLCBjaERYRURlc2NsUmVnQWRkcikKKyAgICAgICAgIC0gY3VycmVudCBkZXNjcmlwdG9yIGFkZHJlc3MgKExTVF9ERVNDTCwgY2hEWEVMc3REZXNjbFJlZ0FkZHIpCisKKyAgICAgIE5vdCBuZWVkIHRvIHByb2dyYW0gbm93CisgICAgICAgICAtIENoYW5uZWwgQ29udHJvbCByZWdpc3RlciAgIChDSF9DVFJMLCBjaERYRUN0cmxSZWdBZGRyKQorICAgICAgICAgICBUWCA6IEhhdmUgdG8gcHJvZ3JhbSB0byB0cmlnZ2VyIHNlbmQgb3V0IGZyYW1lCisgICAgICAgICAgIFJYIDogcHJvZ3JhbW1lZCBieSBEWEUgZW5naW5lCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhFIGhvc3QgZHJpdmVyIG1haW4gY29udHJvbCBibG9jaworICAgICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgc3BlY2lmaWMgY29udHJvbCBibG9jaworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB3cHRfc3RhdHVzIGR4ZUNoYW5uZWxJbml0UHJvZ3JhbQorKAorICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGssCisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5CispCit7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgaWR4OworICAgV0xBTkRYRV9EZXNjVHlwZSAgICAgICAgICpjdXJyZW50RGVzYyA9IE5VTEw7CisgICBXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAgKmN1cnJlbnRDdHJsQmxrID0gTlVMTDsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisgICAvKiBTYW5pdHkgQ2hlY2sgKi8KKyAgIGlmKChOVUxMID09IGR4ZUN0cmxCbGspIHx8IChOVUxMID09IGNoYW5uZWxFbnRyeSkpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJkeGVDaGFubmVsSW5pdFByb2dyYW0gQ2hhbm5lbCBFbnRyeSBpcyBub3QgdmFsaWQiKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8qIFByb2dyYW0gU291cmNlIGFkZHJlc3MgYW5kIGRlc3RpbmF0aW9uIGFkZGVyc3MgKi8KKyAgIGlmKCFjaGFubmVsRW50cnktPmNoYW5uZWxDb25maWcudXNlU2hvcnREZXNjRm10KQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlQ2hhbm5lbEluaXRQcm9ncmFtIExvbmcgRGVzY3JpcHRvciBub3Qgc3VwcG9ydCB5ZXQiKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLyogQ29tbW9uIHJlZ2lzdGVyIGFyZWEgKi8KKyAgIC8qIE5leHQgbGlua2VkIGxpc3QgRGVzY3JpcHRvciBwb2ludGVyICovCisgICBzdGF0dXMgPSB3cGFsV3JpdGVSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRURlc2NsUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEVudHJ5LT5oZWFkQ3RybEJsay0+bGlua2VkRGVzY1BoeUFkZHIpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZUNoYW5uZWxJbml0UHJvZ3JhbSBXcml0ZSBERVNDIEFkZHJlc3MgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgaWYoKFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJICA9PSBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKSB8fAorICAgICAgKFdEVFNfQ0hBTk5FTF9UWF9ISUdIX1BSSSA9PSBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKSkKKyAgIHsKKyAgICAgIC8qIFByb2dyYW0gZGVmYXVsdCByZWdpc3RlcnMgKi8KKyAgICAgIC8qIFRYIERNQSBjaGFubmVsLCBETUEgZGVzdGluYXRpb24gYWRkcmVzcyBpcyB3b3JrIFEgKi8KKyAgICAgIHN0YXR1cyA9IHdwYWxXcml0ZVJlZ2lzdGVyKGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFJlZ2lzdGVyLmNoRFhFRGFkcmxSZWdBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRW50cnktPmNoYW5uZWxDb25maWcucmVmV1EpOworICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImR4ZUNoYW5uZWxJbml0UHJvZ3JhbSBXcml0ZSBUWCBEQWRkcmVzcyByZWdpc3RlciBmYWlsIik7CisgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgfQorICAgfQorICAgZWxzZSBpZigoV0RUU19DSEFOTkVMX1JYX0xPV19QUkkgID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpIHx8CisgICAgICAgICAgIChXRFRTX0NIQU5ORUxfUlhfSElHSF9QUkkgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkpCisgICB7CisgICAgICAvKiBJbml0aWFsaXplIERlc2NyaXB0b3IgY29udHJvbCBXb3JkIEZpcnN0ICovCisgICAgICBjdXJyZW50Q3RybEJsayA9IGNoYW5uZWxFbnRyeS0+aGVhZEN0cmxCbGs7CisgICAgICBmb3IoaWR4ID0gMDsgaWR4IDwgY2hhbm5lbEVudHJ5LT5jaGFubmVsQ29uZmlnLm5EZXNjczsgaWR4KyspCisgICAgICB7CisgICAgICAgICBjdXJyZW50RGVzYyA9IGN1cnJlbnRDdHJsQmxrLT5saW5rZWREZXNjOworICAgICAgICAgY3VycmVudEN0cmxCbGsgPSBjdXJyZW50Q3RybEJsay0+bmV4dEN0cmxCbGs7ICAgICAgICAgCisgICAgICB9CisKKyAgICAgIC8qIFJYIERNQSBjaGFubmVsLCBETUEgc291cmNlIGFkZHJlc3MgaXMgd29yayBRICovCisgICAgICBzdGF0dXMgPSB3cGFsV3JpdGVSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRVNhZHJsUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEVudHJ5LT5jaGFubmVsQ29uZmlnLnJlZldRKTsKKyAgICAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJkeGVDaGFubmVsSW5pdFByb2dyYW0gV3JpdGUgUlggU0FkZHJlc3MgV1EgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIH0KKworICAgICAgLyogUlggRE1BIGNoYW5uZWwsIFByb2dyYW0gcHJlIGFsbG9jYXRlZCBkZXN0aW5hdGlvbiBBZGRyZXNzICovCisgICAgICBzdGF0dXMgPSB3cGFsV3JpdGVSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRURhZHJsUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkRYRV9VMzJfU1dBUF9FTkRJQU4oY2hhbm5lbEVudHJ5LT5EZXNjQm90dG9tTG9jLT5keGVkZXNjLmR4ZV9zaG9ydF9kZXNjLnBoeU5leHRMKSk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlQ2hhbm5lbEluaXRQcm9ncmFtIFdyaXRlIFJYIERBZGRyZXNzIHJlZ2lzdGVyIGZhaWwiKTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisKKyAgICAgIC8qIFJYIENoYW5uZWxzLCBkZWZhdWx0IENvbnRyb2wgcmVnaXN0ZXJzIE1VU1QgQkUgRU5BQkxFRCAqLworICAgICAgd3BhbFdyaXRlUmVnaXN0ZXIoY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVDdHJsUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jaGFuX21hc2spOworICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImR4ZUNoYW5uZWxJbml0UHJvZ3JhbSBXcml0ZSBSWCBDb250cm9sIHJlZ2lzdGVyIGZhaWwiKTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAvKiBIMkggdGVzdCBjaGFubmVsLCBub3QgdXNlIHdvcmsgUSAqLworICAgICAgLyogUHJvZ3JhbSBwcmUgYWxsb2NhdGVkIGRlc3RpbmF0aW9uIEFkZHJlc3MgKi8KKyAgICAgIHN0YXR1cyA9IHdwYWxXcml0ZVJlZ2lzdGVyKGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFJlZ2lzdGVyLmNoRFhFRGFkcmxSZWdBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFORFhFX1UzMl9TV0FQX0VORElBTihjaGFubmVsRW50cnktPkRlc2NCb3R0b21Mb2MtPmR4ZWRlc2MuZHhlX3Nob3J0X2Rlc2MucGh5TmV4dEwpKTsKKyAgICAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJkeGVDaGFubmVsSW5pdFByb2dyYW0gV3JpdGUgUlggREFkZHJlc3MgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIH0KKyAgIH0KKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZUNoYW5uZWxTdGFydAorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgU3RhcnQgU3BlY2lmaWMgQ2hhbm5lbAorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpkeGVDdHJsQmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYRSBob3N0IGRyaXZlciBtYWluIGNvbnRyb2wgYmxvY2sKKyAgICAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICpjaGFubmVsRW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIHNwZWNpZmljIGNvbnRyb2wgYmxvY2sKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB3cHRfc3RhdHVzIGR4ZUNoYW5uZWxTdGFydAorKAorICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGssCisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5CispCit7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgIHN0YXR1cyAgICAgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgIHJlZ1ZhbHVlICAgPSAwOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICBpbnRNYXNrVmFsID0gMDsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisgICBjaGFubmVsRW50cnktPmV4dHJhQ29uZmlnLmNoRW5hYmxlZCAgICA9IGVXTEFOX1BBTF9UUlVFOworICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jaENvbmZpZ3VyZWQgPSBlV0xBTl9QQUxfVFJVRTsKKworICAgLyogRW5hYmxlIGluZGl2aWR1YWwgY2hhbm5lbAorICAgICogbm90IHRvIGJyZWFrIGN1cnJlbnQgY2hhbm5lbCBzZXR1cCwgZmlyc3QgcmVhZCByZWdpc3RlciAqLworICAgc3RhdHVzID0gd3BhbFJlYWRSZWdpc3RlcihXQUxOREVYX0RNQV9DSF9FTl9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdWYWx1ZSk7CisgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlQ2hhbm5lbFN0YXJ0IFJlYWQgQ2hhbm5lbCBFbmFibGUgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgLyogRW5hYmxlIENoYW5uZWwgc3BlY2lmaWMgSW50ZXJydXB0ICovCisgICBzdGF0dXMgPSB3cGFsUmVhZFJlZ2lzdGVyKFdMQU5EWEVfSU5UX01BU0tfUkVHX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludE1hc2tWYWwpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZUNoYW5uZWxTdGFydCBSZWFkIElOVF9NQVNLIHJlZ2lzdGVyIGZhaWwiKTsKKyAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgCisgICB9CisgICBpbnRNYXNrVmFsIHw9IGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuaW50TWFzazsKKyAgIHN0YXR1cyA9IHdwYWxXcml0ZVJlZ2lzdGVyKFdMQU5EWEVfSU5UX01BU0tfUkVHX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludE1hc2tWYWwpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZUNoYW5uZWxTdGFydCBXcml0ZSBJTlRfTUFTSyByZWdpc3RlciBmYWlsIik7CisgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgIAorICAgfQorCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZQorICAgICAgZHhlQ2hhbm5lbFN0b3AKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIFN0b3AgU3BlY2lmaWMgQ2hhbm5lbAorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpkeGVDdHJsQmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYRSBob3N0IGRyaXZlciBtYWluIGNvbnRyb2wgYmxvY2sKKyAgICAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICpjaGFubmVsRW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIHNwZWNpZmljIGNvbnRyb2wgYmxvY2sKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB3cHRfc3RhdHVzIGR4ZUNoYW5uZWxTdG9wCisoCisgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAqZHhlQ3RybEJsaywKKyAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICpjaGFubmVsRW50cnkKKykKK3sKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICAgc3RhdHVzICAgICA9IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgaW50TWFza1ZhbCA9IDA7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogU2FuaXR5ICovCisgICBpZigoTlVMTCA9PSBkeGVDdHJsQmxrKSB8fCAoTlVMTCA9PSBjaGFubmVsRW50cnkpKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlQ2hhbm5lbFN0b3AgSW52YWxpZCBhcmcgaW5wdXQiKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7IAorICAgfQorCisgICAvKiBNYXNrb3V0IGludGVycnVwdCAqLworICAgc3RhdHVzID0gd3BhbFJlYWRSZWdpc3RlcihXTEFORFhFX0lOVF9NQVNLX1JFR19BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRNYXNrVmFsKTsKKyAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJkeGVDaGFubmVsU3RvcCBSZWFkIElOVF9NQVNLIHJlZ2lzdGVyIGZhaWwiKTsKKyAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgCisgICB9CisgICBpbnRNYXNrVmFsIF49IGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuaW50TWFzazsKKyAgIHN0YXR1cyA9IHdwYWxXcml0ZVJlZ2lzdGVyKFdMQU5EWEVfSU5UX01BU0tfUkVHX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludE1hc2tWYWwpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZUNoYW5uZWxTdG9wIFdyaXRlIElOVF9NQVNLIHJlZ2lzdGVyIGZhaWwiKTsKKyAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgCisgICB9CisKKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hFbmFibGVkICAgID0gZVdMQU5fUEFMX0ZBTFNFOworCisgICAvKiBTdG9wIENoYW5uZWwgPz8/ICovCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZUNoYW5uZWxDbG9zZQorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgQ2xvc2UgU3BlY2lmaWMgQ2hhbm5lbAorICAgICAgRnJlZSBwcmUgYWxsb2NhdGVkIFJYIGZyYW1lIGJ1ZmZlciBpZiBSWCBjaGFubmVsCisgICAgICBGcmVlIERYRSBkZXNjcmlwdG9yIGZvciBlYWNoIGNoYW5uZWwKKyAgICAgIEZyZWUgRGVzY3JpcHRvciBjb250cm9sIGJsb2NrIGZvciBlYWNoIGNoYW5uZWwKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAqZHhlQ3RybEJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWEUgaG9zdCBkcml2ZXIgbWFpbiBjb250cm9sIGJsb2NrCisgICAgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbCBzcGVjaWZpYyBjb250cm9sIGJsb2NrCisKKyAgQCAgUmV0dXJuCisgICAgICB3cHRfc3RhdHVzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgd3B0X3N0YXR1cyBkeGVDaGFubmVsQ2xvc2UKKygKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpkeGVDdHJsQmxrLAorICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICA9IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgaWR4OworICAgV0xBTkRYRV9EZXNjQ3RybEJsa1R5cGUgICpjdXJyZW50Q3RybEJsayAgICA9IE5VTEw7CisgICBXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAgKm5leHRDdHJsQmxrICAgICAgID0gTlVMTDsKKyAgIFdMQU5EWEVfRGVzY1R5cGUgICAgICAgICAqY3VycmVudERlc2NyaXB0b3IgPSBOVUxMOworICAgV0xBTkRYRV9EZXNjVHlwZSAgICAgICAgICpuZXh0RGVzY3JpcHRvciAgICA9IE5VTEw7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogU2FuaXR5ICovCisgICBpZigoTlVMTCA9PSBkeGVDdHJsQmxrKSB8fCAoTlVMTCA9PSBjaGFubmVsRW50cnkpKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlQ2hhbm5lbFN0b3AgSW52YWxpZCBhcmcgaW5wdXQiKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7IAorICAgfQorCisgICBjdXJyZW50Q3RybEJsayAgICA9IGNoYW5uZWxFbnRyeS0+aGVhZEN0cmxCbGs7CisgICBpZihOVUxMICE9IGN1cnJlbnRDdHJsQmxrKQorICAgeworICAgICAgY3VycmVudERlc2NyaXB0b3IgPSBjdXJyZW50Q3RybEJsay0+bGlua2VkRGVzYzsKKyAgICAgIGZvcihpZHggPSAwOyBpZHggPCBjaGFubmVsRW50cnktPm51bURlc2M7IGlkeCsrKQorICAgICAgeworICAgICAgICAgIGlmIChpZHggKyAxICE9IGNoYW5uZWxFbnRyeS0+bnVtRGVzYykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIG5leHRDdHJsQmxrICAgID0gY3VycmVudEN0cmxCbGstPm5leHRDdHJsQmxrOworICAgICAgICAgICAgICBuZXh0RGVzY3JpcHRvciA9IG5leHRDdHJsQmxrLT5saW5rZWREZXNjOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgICBuZXh0Q3RybEJsayA9IE5VTEw7CisgICAgICAgICAgICAgIG5leHREZXNjcmlwdG9yID0gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoKFdEVFNfQ0hBTk5FTF9SWF9MT1dfUFJJICA9PSBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKSB8fAorICAgICAgICAgICAgIChXRFRTX0NIQU5ORUxfUlhfSElHSF9QUkkgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKE5VTEwgIT0gY3VycmVudEN0cmxCbGstPnhmckZyYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgd3BhbFVubG9ja1BhY2tldChjdXJyZW50Q3RybEJsay0+eGZyRnJhbWUpOworICAgICAgICAgICAgICAgd3BhbFBhY2tldEZyZWUoY3VycmVudEN0cmxCbGstPnhmckZyYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIC8qICAKKyAgICAgICAgICAqICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgRFhFIHRvIHdhbGsgdGhyb3VnaCB0aGUgCisgICAgICAgICAgKiAgZGVzY3JpcHRvciBjaGFpbiBhbmQgdW5sb2NrIGFueSBwZW5kaW5nIHBhY2tldHMgKGlmIAorICAgICAgICAgICogIGxvY2tlZCkuIAorICAgICAgICAgICovCisgICAgICAgICBpZigoV0RUU19DSEFOTkVMX1RYX0xPV19QUkkgID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpIHx8CisgICAgICAgICAgICAoV0RUU19DSEFOTkVMX1RYX0hJR0hfUFJJID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmKChOVUxMICE9IGN1cnJlbnRDdHJsQmxrLT54ZnJGcmFtZSkgJiYgCisgICAgICAgICAgICAgICAgICAgICAoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTID09IHdwYWxJc1BhY2tldExvY2tlZChjdXJyZW50Q3RybEJsay0+eGZyRnJhbWUpKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHdwYWxVbmxvY2tQYWNrZXQoY3VycmVudEN0cmxCbGstPnhmckZyYW1lKTsKKyAgICAgICAgICAgICAgICAgIHdwYWxQYWNrZXRGcmVlKGN1cnJlbnRDdHJsQmxrLT54ZnJGcmFtZSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICB9CisjaWYgKGRlZmluZWQoRkVBVFVSRV9SMzNEKSB8fCBkZWZpbmVkKFdMQU5EWEVfVEVTVF9DSEFOTkVMX0VOQUJMRSkpCisgICAgICAgICAvLyBkZXNjcmlwdG9ycyBhbGxvY2F0ZWQgaW5kaXZpZHVhbGx5IHNvIGZyZWUgdGhlbSBpbmRpdmlkdWFsbHkKKyAgICAgICAgIHdwYWxEbWFNZW1vcnlGcmVlKGN1cnJlbnREZXNjcmlwdG9yKTsKKyNlbmRpZgorICAgICAgICAgd3BhbE1lbW9yeUZyZWUoY3VycmVudEN0cmxCbGspOworCisgICAgICAgICBjdXJyZW50Q3RybEJsayAgICA9IG5leHRDdHJsQmxrOworICAgICAgICAgY3VycmVudERlc2NyaXB0b3IgPSBuZXh0RGVzY3JpcHRvcjsKKyAgICAgIH0KKyAgIH0KKworI2lmICEoZGVmaW5lZChGRUFUVVJFX1IzM0QpIHx8IGRlZmluZWQoV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFKSkKKyAgIC8vIGRlc2NyaXB0b3JzIHdlcmUgYWxsb2NhdGVkIGFzIGEgc2luZ2xlIGNodW5rIHNvIGZyZWUgdGhlIGNodW5rCisgICBpZihOVUxMICE9IGNoYW5uZWxFbnRyeS0+ZGVzY3JpcHRvckFsbG9jYXRpb24pCisgICB7CisgICAgICB3cGFsRG1hTWVtb3J5RnJlZShjaGFubmVsRW50cnktPmRlc2NyaXB0b3JBbGxvY2F0aW9uKTsKKyAgIH0KKyNlbmRpZgorCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZQorICAgICAgZHhlQ2hhbm5lbENsZWFuSW50CisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBDbGVhbiB1cCBpbnRlcnJ1cHQgZnJvbSBSSVZBIEhXCisgICAgICBBZnRlciBIb3N0IGZpbmlzaCB0byBoYW5kbGUgaW50ZXJydXB0LCBpbnRlcnJ1cHQgc2lnbmFsIG11c3QgYmUgY2xlYW5lZCB1cAorICAgICAgT3RoZXJ3aXNlIG5leHQgaW50ZXJydXB0IHdpbGwgbm90IGJlIGdlbmVyYXRlZAorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICpjaGFubmVsRW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIHNwZWNpZmljIGNvbnRyb2wgYmxvY2sKKyAgICAgIHdwdF91aW50MzIgICAgICAgICAgICAgICpjaFN0YXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIFN0YXR1cyByZWdpc3RlciB2YWx1ZQorCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHdwdF9zdGF0dXMgZHhlQ2hhbm5lbENsZWFuSW50CisoCisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5LAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgKmNoU3RhdAorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogUmVhZCBDaGFubmVsIFN0YXR1cyBSZWdpc3RlciB0byBrbm93IHdoeSBJTlQgSGFwcGVuICovCisgICBzdGF0dXMgPSB3cGFsUmVhZFJlZ2lzdGVyKGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFJlZ2lzdGVyLmNoRFhFU3RhdHVzUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaFN0YXQpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZUNoYW5uZWxDbGVhbkludCBSZWFkIENIIFNUQVQgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9GQVVMVDsgICAgICAgICAKKyAgIH0KKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIENoYW5uZWwgSU5UIENsZWFuLCBTdGF0dXMgMHgleCIsCisgICAgICAgICAgICBjaGFubmVsVHlwZVtjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlXSwgKmNoU3RhdCk7CisKKyAgIC8qIENsZWFuIHVwIGFsbCB0aGUgSU5UIHdpdGhpbiB0aGlzIGNoYW5uZWwgKi8KKyAgIHN0YXR1cyA9IHdwYWxXcml0ZVJlZ2lzdGVyKFdMQU5EWEVfSU5UX0NMUl9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBjaGFubmVsRW50cnktPmFzc2lnbmVkRE1BQ2hhbm5lbCkpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZUNoYW5uZWxDbGVhbkludCBXcml0ZSBDSCBDbGVhbiByZWdpc3RlciBmYWlsIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBVUxUOyAgICAgICAgIAorICAgfQorCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZVJYUGFja2V0QXZhaWxhYmxlQ0IKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIElmIFJYIGZyYW1lIGhhbmRsZXIgZW5jb3VudHMgUlggYnVmZmVyIHBvb2wgZW1wdHkgY29uZGl0aW9uLAorICAgICAgRFhFIFJYIGhhbmRsZSBsb29wIHdpbGwgYmUgYmxvY2tlZCB0aWxsIGdldCBhdmFpbGFibGUgUlggYnVmZmVyIHBvb2wuCisgICAgICBXaGVuIG5ldyBSWCBidWZmZXIgcG9vbCBhdmFpbGFibGUsIFBhY2tldCBhdmFpbGFibGUgQ0IgZnVuY3Rpb24gd2lsbAorICAgICAgYmUgY2FsbGVkLgorCisgIEAgIFBhcmFtZXRlcnMKKyAgIHdwdF9wYWNrZXQgICAqZnJlZVBhY2tldAorICAgICAgICAgICAgICAgIE5ld2x5IGFsbG9jYXRlZCBSWCBidWZmZXIKKyAgIHZfVk9JRF90ICAgICAqdXNyRGF0YQorICAgICAgICAgICAgICAgIERYRSBjb250ZXh0CisKKyAgQCAgUmV0dXJuCisgICAgICBOT05FCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIGR4ZVJYUGFja2V0QXZhaWxhYmxlQ0IKKygKKyAgIHdwdF9wYWNrZXQgICAqZnJlZVBhY2tldCwKKyAgIHZfVk9JRF90ICAgICAqdXNyRGF0YQorKQoreworICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgICAqZHhlQ3R4dCA9IE5VTEw7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgIHN0YXR1czsKKworICAgLyogU2ltcGxlIFNhbml0eSAqLworICAgaWYoKE5VTEwgPT0gZnJlZVBhY2tldCkgfHwgKE5VTEwgPT0gdXNyRGF0YSkpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICJHZXQgRnJlZSBSWCBCdWZmZXIgZmFpbCwgQ3JpdGljYWwgRXJyb3IiKTsKKyAgICAgIEhEWEVfQVNTRVJUKDApOworICAgICAgcmV0dXJuOworICAgfQorCisgICBkeGVDdHh0ID0gKFdMQU5EWEVfQ3RybEJsa1R5cGUgKil1c3JEYXRhOworCisgICBpZihXTEFORFhFX0NUWFRfQ09PS0lFICE9IGR4ZUN0eHQtPmR4ZUNvb2tpZSkKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgIkRYRSBDb250ZXh0IGRhdGEgY29ycnVwdGVkLCBDcml0aWNhbCBFcnJvciIpOworICAgICAgSERYRV9BU1NFUlQoMCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiRFhFIFJYIHBhY2tldCBhdmFpbGFibGUsIHBvc3QgTVNHIHRvIFJYIFRocmVhZCIpOworCisgICBkeGVDdHh0LT5mcmVlUlhQYWNrZXQgPSBmcmVlUGFja2V0OworCisgICAvKiBTZXJpYWxpemUgUlggUGFja2V0IEF2YWlsYWJsZSBtZXNzYWdlIHVwb24gUlggdGhyZWFkICovCisgICBIRFhFX0FTU0VSVChOVUxMICE9IGR4ZUN0eHQtPnJ4UGt0QXZhaWxNc2cpOworCisgICBzdGF0dXMgPSB3cGFsUG9zdFJ4TXNnKFdESV9HRVRfUEFMX0NUWCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkeGVDdHh0LT5yeFBrdEF2YWlsTXNnKTsKKyAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICBIRFhFX0FTU0VSVChlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKTsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgImR4ZVJYUGFja2V0QXZhaWxhYmxlQ0Igc2VyaWFsaXplIGZhaWwiKTsKKyAgIH0KKworICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVSWEZyYW1lU2luZ2xlQnVmZmVyQWxsb2MKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIEFsbG9jYXRlIFBsYXRmb3JtIHBhY2tldCBidWZmZXIgdG8gcHJlcGFyZSBSWCBmcmFtZQorICAgICAgUlggZnJhbWUgbWVtb3J5IHNwYWNlIG11c3QgYmUgcHJlIGFsbG9jdGVkIGFuZCBtdXN0IGJlIGFzaWduZWQgdG8KKyAgICAgIGRlc2NyaXB0b3IKKyAgICAgIHRoZW4gd2hlbmV2ZXIgRE1BIGVuZ2luZSB3YW50IHRvIHRyYW5mZXIgZnJhbWUgZnJvbSBCTVUsCisgICAgICBidWZmZXIgbXVzdCBiZSByZWFkeQorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpkeGVDdHJsQmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYRSBob3N0IGRyaXZlciBtYWluIGNvbnRyb2wgYmxvY2sKKyAgICAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICpjaGFubmVsRW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIHNwZWNpZmljIGNvbnRyb2wgYmxvY2sKKyAgICAgIFdMQU5EWEVfRGVzY0N0cmxCbGtUeXBlICBjdXJyZW50Q3RybEJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBjb250cm9sIGJsb2NrIHdoaWNoIGhhdmUgdG8gYmUgYXNpZ25lZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBidWZmZXIKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB3cHRfc3RhdHVzIGR4ZVJYRnJhbWVTaW5nbGVCdWZmZXJBbGxvYworKAorICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgICpkeGVDdHh0LAorICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgICpjaGFubmVsRW50cnksCisgICBXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAgKmN1cnJlbnRDdHJsQmxvY2sKKykKK3sKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICAgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgd3B0X3BhY2tldCAgICAgICAgICAgICAgICpjdXJyZW50UGFsUGFja2V0QnVmZmVyID0gTlVMTDsKKyAgIFdMQU5EWEVfRGVzY1R5cGUgICAgICAgICAqY3VycmVudERlc2MgICAgICAgICAgICA9IE5VTEw7CisjaWZkZWYgRkVBVFVSRV9SMzNECisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgIHZpcnR1YWxBZGRyZXNzUENJZTsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgcGh5c2ljYWxBZGRyZXNzUENJZTsgICAKKyNlbHNlCisgICB3cHRfaXRlcmF0b3IgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICBhbGxvY2F0ZWRTaXplICAgICAgICAgID0gMDsKKyAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAqcGh5c0FkZHJlc3MgICAgICAgICAgICA9IE5VTEw7CisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogU2FuaXR5IENoZWNrICovCisgICBpZigoTlVMTCA9PSBkeGVDdHh0KSB8fCAoTlVMTCA9PSBjaGFubmVsRW50cnkpIHx8IChOVUxMID09IGN1cnJlbnRDdHJsQmxvY2spKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlQ2hhbm5lbEluaXRQcm9ncmFtIENoYW5uZWwgRW50cnkgaXMgbm90IHZhbGlkIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBjdXJyZW50RGVzYyAgICAgICAgICAgID0gY3VycmVudEN0cmxCbG9jay0+bGlua2VkRGVzYzsKKworICAgLyogRmlyc3QgY2hlY2sgaWYgYSBwYWNrZXQgcG9pbnRlciBoYXMgYWxyZWFkeSBiZWVuIHByb3ZpZGVkIGJ5IGEgcHJldmlvdXNseQorICAgICAgaW52b2tlZCBSeCBwYWNrZXQgYXZhaWxhYmxlIGNhbGxiYWNrLiBJZiBzbyB1c2UgdGhhdCBwYWNrZXQuICovCisgICBpZihkeGVDdHh0LT5yeFBhbFBhY2tldFVuYXZhaWxhYmxlICYmIChOVUxMICE9IGR4ZUN0eHQtPmZyZWVSWFBhY2tldCkpCisgICB7CisgICAgICBjdXJyZW50UGFsUGFja2V0QnVmZmVyID0gZHhlQ3R4dC0+ZnJlZVJYUGFja2V0OworICAgICAgZHhlQ3R4dC0+cnhQYWxQYWNrZXRVbmF2YWlsYWJsZSA9IGVXTEFOX1BBTF9GQUxTRTsKKyAgICAgIGR4ZUN0eHQtPmZyZWVSWFBhY2tldCA9IE5VTEw7CisgICB9CisgICBlbHNlIGlmKCFkeGVDdHh0LT5yeFBhbFBhY2tldFVuYXZhaWxhYmxlKQorICAgeworICAgLyogQWxsb2NhdGUgcGxhdGZvcm0gUGFja2V0IGJ1ZmZlciBhbmQgT1MgRnJhbWUgQnVmZmVyIGF0IGhlcmUgKi8KKyAgIGN1cnJlbnRQYWxQYWNrZXRCdWZmZXIgPSB3cGFsUGFja2V0QWxsb2MoZVdMQU5fUEFMX1BLVF9UWVBFX1JYX1JBVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkRYRV9ERUZBVUxUX1JYX09TX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeGVSWFBhY2tldEF2YWlsYWJsZUNCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWR4ZUN0eHQpOworCisgICAgICBpZihOVUxMID09IGN1cnJlbnRQYWxQYWNrZXRCdWZmZXIpCisgICAgICB7CisgICAgICAgICBkeGVDdHh0LT5yeFBhbFBhY2tldFVuYXZhaWxhYmxlID0gZVdMQU5fUEFMX1RSVUU7CisgICAgICB9CisgICB9CisgICAKKyAgIGlmKE5VTEwgPT0gY3VycmVudFBhbFBhY2tldEJ1ZmZlcikKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiISEhIFJYIFBBTCBQYWNrZXQgQWxsb2MgRmFpbCwgcGFja2V0IHdpbGwgYmUgcXVldWVkIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgISEhIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX1JFU09VUkNFUzsKKyAgIH0KKworICAgY3VycmVudEN0cmxCbG9jay0+eGZyRnJhbWUgICAgICAgPSBjdXJyZW50UGFsUGFja2V0QnVmZmVyOworICAgY3VycmVudFBhbFBhY2tldEJ1ZmZlci0+cGt0VHlwZSAgPSBlV0xBTl9QQUxfUEtUX1RZUEVfUlhfUkFXOworICAgY3VycmVudFBhbFBhY2tldEJ1ZmZlci0+cEJEICAgICAgPSBOVUxMOworICAgY3VycmVudFBhbFBhY2tldEJ1ZmZlci0+cEJEUGh5cyAgPSBOVUxMOworICAgY3VycmVudFBhbFBhY2tldEJ1ZmZlci0+QkRMZW5ndGggPSAwOworI2lmZGVmIEZFQVRVUkVfUjMzRAorICAgc3RhdHVzID0gd3BhbEFsbG9jYXRlU2hhZG93UnhGcmFtZShjdXJyZW50UGFsUGFja2V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbEFkZHJlc3NQQ0llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aXJ0dWFsQWRkcmVzc1BDSWUpOworICAgSERYRV9BU1NFUlQoMCAhPSBwaHlzaWNhbEFkZHJlc3NQQ0llKTsKKyAgIEhEWEVfQVNTRVJUKDAgIT0gdmlydHVhbEFkZHJlc3NQQ0llKTsKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTUVELAorICAgICAgICAgICAgIlJYIFNoYWRvdyBNZW1vcnkgVmEgMHgleCwgUGEgMHgleCIsCisgICAgICAgICAgICB2aXJ0dWFsQWRkcmVzc1BDSWUsIHBoeXNpY2FsQWRkcmVzc1BDSWUpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVJYRnJhbWVCdWZmZXJBbGxvYyBTaGFkb3cgTWVtIEFsbG9jIGZhaWwiKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisgICBjdXJyZW50Q3RybEJsb2NrLT5zaGFkb3dCdWZmZXJWYSA9IHZpcnR1YWxBZGRyZXNzUENJZTsKKyAgIGN1cnJlbnRQYWxQYWNrZXRCdWZmZXItPnBCRFBoeXMgID0gKHZvaWQgKilwaHlzaWNhbEFkZHJlc3NQQ0llOworICAgbWVtc2V0KCh3cHRfdWludDggKiljdXJyZW50Q3RybEJsb2NrLT5zaGFkb3dCdWZmZXJWYSwgMCwgV0xBTkRYRV9ERUZBVUxUX1JYX09TX0JVRkZFUl9TSVpFKTsKKyNlbHNlCisgICBzdGF0dXMgPSB3cGFsTG9ja1BhY2tldEZvclRyYW5zZmVyKGN1cnJlbnRQYWxQYWNrZXRCdWZmZXIpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVJYRnJhbWVCdWZmZXJBbGxvYyB1bmFibGUgdG8gbG9jayBwYWNrZXQiKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisKKyAgIC8qIEluaXQgaXRlcmF0b3IgdG8gZ2V0IHBoeXNpY2FsIG9zIGJ1ZmZlciBhZGRyZXNzICovCisgICBzdGF0dXMgPSB3cGFsSXRlcmF0b3JJbml0KCZpdGVyYXRvciwgY3VycmVudFBhbFBhY2tldEJ1ZmZlcik7CisgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlUlhGcmFtZUJ1ZmZlckFsbG9jIGl0ZXJhdG9yIGluaXQgZmFpbCIpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKyAgIHN0YXR1cyA9IHdwYWxJdGVyYXRvck5leHQoJml0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFsUGFja2V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxvY2F0ZWRTaXplKTsKKyAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJkeGVSWEZyYW1lQnVmZmVyQWxsb2MgaXRlcmF0b3IgR2V0IE5leHQgcG9pbnRlciBmYWlsIik7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorICAgY3VycmVudFBhbFBhY2tldEJ1ZmZlci0+cEJEUGh5cyA9IHBoeXNBZGRyZXNzOworI2VuZGlmIC8qIEZFQVRVUkVfUjMzRCAqLworCisgICAvKiBEWEUgZGVzY3JpcHRvciBtdXN0IGhhdmUgU1dBUFBFRCBhZGRyZXMgaW4gaXQncyBzdHJ1Y3R1cmUKKyAgICAqICEhISBTV0FQUEVEICEhISAqLworICAgY3VycmVudERlc2MtPmR4ZWRlc2MuZHhlX3Nob3J0X2Rlc2MuZHN0TWVtQWRkckwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkRYRV9VMzJfU1dBUF9FTkRJQU4oKHdwdF91aW50MzIpY3VycmVudFBhbFBhY2tldEJ1ZmZlci0+cEJEUGh5cyk7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEV4aXQiLCBfX0ZVTkNUSU9OX18pOworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBGdW5jdGlvbiBOYW1lIAorICAgICAgZHhlUlhGcmFtZVJlZmlsbFJpbmcKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIEFsbG9jYXRlIFBsYXRmb3JtIHBhY2tldCBidWZmZXJzIHRvIHRyeSB0byBmaWxsIHVwIHRoZSBEWEUgUnggcmluZworCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpkeGVDdHJsQmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYRSBob3N0IGRyaXZlciBtYWluIGNvbnRyb2wgYmxvY2sKKyAgICAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICpjaGFubmVsRW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIHNwZWNpZmljIGNvbnRyb2wgYmxvY2sKKyAgICAgIAorICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB3cHRfc3RhdHVzIGR4ZVJYRnJhbWVSZWZpbGxSaW5nCisoCisgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAgKmR4ZUN0eHQsCisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAgKmNoYW5uZWxFbnRyeQorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICBXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAgKmN1cnJlbnRDdHJsQmxrID0gY2hhbm5lbEVudHJ5LT50YWlsQ3RybEJsazsKKyAgIFdMQU5EWEVfRGVzY1R5cGUgICAgICAgICAqY3VycmVudERlc2MgICAgPSBOVUxMOworCisgICB3aGlsZShjaGFubmVsRW50cnktPm51bUZyZWVEZXNjID4gMCkKKyAgIHsKKyAgICAgIC8qIEN1cnJlbnQgQ29udHJvbCBibG9jayBpcyBmcmVlCisgICAgICAgKiBhbmQgYXNzb2NpYXRlZCBmcmFtZSBidWZmZXIgaXMgbm90IGxpbmtlZCB3aXRoIGNvbnRyb2wgYmxvY2sgYW55bW9yZQorICAgICAgICogYWxsb2NhdGUgbmV3IGZyYW1lIGJ1ZmZlciBmb3IgY3VycmVudCBjb250cm9sIGJsb2NrICovCisgICAgICBzdGF0dXMgPSBkeGVSWEZyYW1lU2luZ2xlQnVmZmVyQWxsb2MoZHhlQ3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEN0cmxCbGspOworCisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICJkeGVSWEZyYW1lUmVmaWxsUmluZywgb3V0IG9mIFJYIGJ1ZmZlciBwb29sLCBicmVhayBoZXJlIik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY3VycmVudERlc2MgPSBjdXJyZW50Q3RybEJsay0+bGlua2VkRGVzYzsKKyAgICAgIGN1cnJlbnREZXNjLT5kZXNjQ3RybC5jdHJsID0gY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jd19jdHJsX3JlYWQ7CisKKyAgICAgIC8qIElzc3VlIGEgZHVtbXkgcmVhZCBmcm9tIHRoZSBEWEUgZGVzY3JpcHRvciBERFIgbG9jYXRpb24gdG8gZW5zdXJlCisgICAgICAgICB0aGF0IGFueSBwb3N0ZWQgd3JpdGVzIGFyZSByZWZsZWN0ZWQgaW4gbWVtb3J5IGJlZm9yZSBEWEUgbG9va3MgYXQKKyAgICAgICAgIHRoZSBkZXNjcmlwdG9yLiAqLworICAgICAgaWYoY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jd19jdHJsX3JlYWQgIT0gY3VycmVudERlc2MtPmRlc2NDdHJsLmN0cmwpCisgICAgICB7CisgICAgICAgICAvL0hEWEVfQVNTRVJUKDApOworICAgICAgfQorCisgICAgICAvKiBLaWNrIG9mZiB0aGUgRFhFIHJpbmcsIGlmIG5vdCBpbiBhbnkgcG93ZXIgc2F2ZSBtb2RlICovCisgICAgICBpZigoV0xBTkRYRV9QT1dFUl9TVEFURV9JTVBTICE9IGR4ZUN0eHQtPmhvc3RQb3dlclN0YXRlKSAmJgorICAgICAgICAgKFdMQU5EWEVfUE9XRVJfU1RBVEVfRE9XTiAhPSBkeGVDdHh0LT5ob3N0UG93ZXJTdGF0ZSkpCisgICAgICB7CisgICAgICAgICB3cGFsV3JpdGVSZWdpc3RlcihXQUxOREVYX0RNQV9FTkNIX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDw8IGNoYW5uZWxFbnRyeS0+YXNzaWduZWRETUFDaGFubmVsKTsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnRDdHJsQmxrID0gY3VycmVudEN0cmxCbGstPm5leHRDdHJsQmxrOworICAgICAgLS1jaGFubmVsRW50cnktPm51bUZyZWVEZXNjOworICAgfQorICAgCisgICBjaGFubmVsRW50cnktPnRhaWxDdHJsQmxrID0gY3VycmVudEN0cmxCbGs7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZVJYRnJhbWVSZWFkeQorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgUG9wIGZyYW1lIGZyb20gZGVzY3JpcHRvciBhbmQgcm91dGUgZnJhbWUgdG8gdXBwZXIgdHJhbnNwb3J0IGxheWVyCisgICAgICBBc3NpZ24gbmV3IHBsYXRmb3JtIHBhY2tldCBidWZmZXIgaW50byB1c2VkIGRlc2NyaXB0b3IKKyAgICAgIEFjdHVhbCBmcmFtZSBwb3AgYW5kIHJlc291cmNlIHJlYWxsb2MKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAqZHhlQ3RybEJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWEUgaG9zdCBkcml2ZXIgbWFpbiBjb250cm9sIGJsb2NrCisgICAgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbCBzcGVjaWZpYyBjb250cm9sIGJsb2NrCisKKyAgQCAgUmV0dXJuCisgICAgICB3cHRfc3RhdHVzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgd3B0X3N0YXR1cyBkeGVSWEZyYW1lUmVhZHkKKygKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpkeGVDdHh0LAorICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICBXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAgKmN1cnJlbnRDdHJsQmxrID0gTlVMTDsKKyAgIFdMQU5EWEVfRGVzY1R5cGUgICAgICAgICAqY3VycmVudERlc2MgICAgPSBOVUxMOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICBkZXNjQ3RybDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgZnJhbWVDb3VudCA9IDA7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogU2FuaXR5IENoZWNrICovCisgICBpZigoTlVMTCA9PSBkeGVDdHh0KSB8fCAoTlVMTCA9PSBjaGFubmVsRW50cnkpKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlUlhGcmFtZVJlYWR5IENoYW5uZWwgRW50cnkgaXMgbm90IHZhbGlkIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBjdXJyZW50Q3RybEJsayA9IGNoYW5uZWxFbnRyeS0+aGVhZEN0cmxCbGs7CisgICBjdXJyZW50RGVzYyAgICA9IGN1cnJlbnRDdHJsQmxrLT5saW5rZWREZXNjOworCisgICAvKiBEZXNjcmlwdG9lIHNob3VsZCBiZSBTV0FQUEVEID8/Pz8gKi8KKyAgIGRlc2NDdHJsID0gY3VycmVudERlc2MtPmRlc2NDdHJsLmN0cmw7CisKKyAgIC8qIEdldCBmcmFtZXMgd2hpbGUgVkFMSUQgYml0IGlzIG5vdCBzZXQgKERNQSBjb21wbGV0ZSkgYW5kIGEgZGF0YSAKKyAgICAqIGFzc29jaWF0ZWQgd2l0aCBpdCAqLworICAgd2hpbGUoIShXTEFORFhFX1UzMl9TV0FQX0VORElBTihkZXNjQ3RybCkgJiBXTEFORFhFX0RFU0NfQ1RSTF9WQUxJRCkgJiYKKyAgICAgICAgIChlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgPT0gd3BhbElzUGFja2V0TG9ja2VkKGN1cnJlbnRDdHJsQmxrLT54ZnJGcmFtZSkpKQorICAgeworICAgICAgY2hhbm5lbEVudHJ5LT5udW1Ub3RhbEZyYW1lKys7CisgICAgICBjaGFubmVsRW50cnktPm51bUZyZWVEZXNjKys7CisjaWZkZWYgRkVBVFVSRV9SMzNECisgICAgICAvKiBUcmFuc2ZlciBTaXplIHNob3VsZCBiZSAqLworICAgICAgY3VycmVudERlc2MtPnhmclNpemUgPSBXTEFORFhFX1UzMl9TV0FQX0VORElBTihXTEFORFhFX0RFRkFVTFRfUlhfT1NfQlVGRkVSX1NJWkUpOworICAgICAgc3RhdHVzID0gd3BhbFByZXBhcmVSeEZyYW1lKCZjdXJyZW50Q3RybEJsay0+eGZyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod3B0X3VpbnQzMiljdXJyZW50Q3RybEJsay0+eGZyRnJhbWUtPnBCRFBoeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q3RybEJsay0+c2hhZG93QnVmZmVyVmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFORFhFX0RFRkFVTFRfUlhfT1NfQlVGRkVSX1NJWkUpOworICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImR4ZVJYRnJhbWVSZWFkeSBQcmVwYXJlIFJYIEZyYW1lIGZhaWwiKTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisgICAgICBzdGF0dXMgPSB3cGFsRnJlZVJ4RnJhbWUoY3VycmVudEN0cmxCbGstPnNoYWRvd0J1ZmZlclZhKTsKKyAgICAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJkeGVSWEZyYW1lUmVhZHkgRnJlZSBTaGFkb3cgUlggRnJhbWUgZmFpbCIpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIH0KKworI2Vsc2UgLyogRkVBVFVSRV9SMzNEICovCisgICAgICBzdGF0dXMgPSB3cGFsVW5sb2NrUGFja2V0KGN1cnJlbnRDdHJsQmxrLT54ZnJGcmFtZSk7CisgICAgICBpZiAoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImR4ZVJYRnJhbWVSZWFkeSB1bmFibGUgdG8gdW5sb2NrIHBhY2tldCIpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1IzM0QgKi8KKyAgICAgIGlmKE5VTEwgPT0gZHhlQ3R4dC0+cnhSZWFkeUNCKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlUlhGcmFtZVJlYWR5IHJ4UmVhZHlDQiBmdW5jdGlvbiBpcyBub3QgcmVnaXN0ZXJlZCIpOworICAgICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgICAgIH0KKyAgICAgIC8qIFRoaXMgRGVzY3JpcHRvciBpcyB2YWxpZCwgc28gbGlua2VkIENvbnRyb2wgYmxvY2sgaXMgYWxzbyB2YWxpZAorICAgICAgICogTGlua2VkIENvbnRyb2wgYmxvY2sgaGFzIHByZSBhbGxvY2F0ZWQgcGFja2V0IGJ1ZmZlcgorICAgICAgICogU28sIGp1c3QgbGV0IHVwcGVyIGxheWVyIGtub3dzIHByZWFsbG9jYXRlZCBmcmFtZSBwb2ludGVyIHdpbGwgYmUgT0sgKi8KKyAgICAgIGZyYW1lQ291bnQrKzsKKyAgICAgIGR4ZUN0eHQtPnJ4UmVhZHlDQihkeGVDdHh0LT5jbGllbnRDdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDdHJsQmxrLT54ZnJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKTsKKworICAgICAgLyogTm93IHRyeSB0byByZWZpbGwgdGhlIHJpbmcgd2l0aCBlbXB0eSBSeCBidWZmZXJzIHRvIGtlZXAgRFhFIGJ1c3kgKi8KKyAgICAgIGR4ZVJYRnJhbWVSZWZpbGxSaW5nKGR4ZUN0eHQsY2hhbm5lbEVudHJ5KTsKKworICAgICAgLyogVGVzdCBuZXh0IGNvbnRvcmwgYmxvY2sKKyAgICAgICAqIGlmIHZhbGlkLCB0aGlzIGNvbnRyb2wgYmxvY2sgYWxzbyBoYXMgbmV3IFJYIGZyYW1lIG11c3QgYmUgaGFuZGxlZCAqLworICAgICAgY3VycmVudEN0cmxCbGsgPSAoV0xBTkRYRV9EZXNjQ3RybEJsa1R5cGUgKiljdXJyZW50Q3RybEJsay0+bmV4dEN0cmxCbGs7CisgICAgICBjdXJyZW50RGVzYyAgICA9IGN1cnJlbnRDdHJsQmxrLT5saW5rZWREZXNjOworICAgICAgZGVzY0N0cmwgICAgICAgPSBjdXJyZW50RGVzYy0+ZGVzY0N0cmwuY3RybDsKKyAgIH0KKworICAgY2hhbm5lbEVudHJ5LT5udW1GcmFnbWVudEN1cnJlbnRDaGFpbiA9IGZyYW1lQ291bnQ7CisgICAvKiBVcGRhdGUgaGVhZCBjb250cm9sIGJsb2NrCisgICAgKiBjdXJyZW50IGNvbnRyb2wgYmxvY2sncyB2YWxpZCBiaXQgd2FzIDAKKyAgICAqIG5leHQgdHJpYWwgZmlyc3QgY29udHJvbCBibG9jayBtdXN0IGJlIGN1cnJlbnQgY29udHJvbCBibG9jayAqLworICAgY2hhbm5lbEVudHJ5LT5oZWFkQ3RybEJsayA9IGN1cnJlbnRDdHJsQmxrOworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZU5vdGlmeVNtc20KKworICBAICBEZXNjcmlwdGlvbjogTm90aWZ5IFNNU00gdG8gc3RhcnQgRFhFIGVuZ2luZSBhbmQvb3IgY29uZGl0aW9uIG9mIFR4IHJpbmcKKyAgYnVmZmVyIAorCisgIEAgIFBhcmFtZXRlcnMKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB3cHRfc3RhdHVzIGR4ZU5vdGlmeVNtc20KKygKKyAgd3B0X2Jvb2xlYW4ga2lja0R4ZSwKKyAgd3B0X2Jvb2xlYW4gcmluZ0VtcHR5CispCit7CisgICB3cHRfdWludDMyIGNsclN0ID0gMDsKKyAgIHdwdF91aW50MzIgc2V0U3QgPSAwOworCisgICBpZihraWNrRHhlKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19NRUQsICJLaWNrIG9mZiBEWEUiKTsKKworICAgICBpZih0ZW1wRHhlQ3RybEJsay0+bGFzdEtpY2tPZmZEeGUgPT0gMCkKKyAgICAgeworICAgICAgIHNldFN0IHw9IFdQQUxfU01TTV9XTEFOX1RYX0VOQUJMRTsgCisgICAgICAgdGVtcER4ZUN0cmxCbGstPmxhc3RLaWNrT2ZmRHhlID0gMTsKKyAgICAgfQorICAgICBlbHNlIGlmKHRlbXBEeGVDdHJsQmxrLT5sYXN0S2lja09mZkR4ZSA9PSAxKQorICAgICB7CisgICAgICAgY2xyU3QgfD0gV1BBTF9TTVNNX1dMQU5fVFhfRU5BQkxFOworICAgICAgIHRlbXBEeGVDdHJsQmxrLT5sYXN0S2lja09mZkR4ZSA9IDA7CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgSERYRV9BU1NFUlQoMCk7CisgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTUVELCAibm8gbmVlZCB0byBraWNrIG9mZiBEWEUiKTsKKyAgIH0KKworICAgaWYocmluZ0VtcHR5KQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19NRUQsICJTTVNNIFR4IFJpbmcgRW1wdHkiKTsKKyAgICAgY2xyU3QgfD0gV1BBTF9TTVNNX1dMQU5fVFhfUklOR1NfRU1QVFk7IAorICAgfQorICAgZWxzZQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19NRUQsICJTTVNNIFR4IFJpbmcgTm90IEVtcHR5Iik7CisgICAgIHNldFN0IHw9IFdQQUxfU01TTV9XTEFOX1RYX1JJTkdTX0VNUFRZOyAKKyAgIH0KKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQyV4IFMleCIsIGNsclN0LCBzZXRTdCk7CisKKyAgIHdwYWxOb3RpZnlTbXNtKGNsclN0LCBzZXRTdCk7CisKKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZVBzQ29tcGxldGUKKworICBAICBEZXNjcmlwdGlvbjogVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayB0aGUgcmVzdiBkZXNjIHRvIGRlc2lkZSBpZiB3ZSBjYW4KKyAgZ2V0IGludG8gUG93ZXIgU2F2ZSBtb2RlIG5vdyAKKworICBAICBQYXJhbWV0ZXJzCisKKyAgQCAgUmV0dXJuCisgICAgICBOb25lCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBkeGVQc0NvbXBsZXRlKFdMQU5EWEVfQ3RybEJsa1R5cGUgKmR4ZUN0eHQsIHdwdF9ib29sZWFuIGludHJfYmFzZWQpCit7CisgICBpZiggZHhlQ3R4dC0+aG9zdFBvd2VyU3RhdGUgPT0gV0xBTkRYRV9QT1dFUl9TVEFURV9GVUxMICkKKyAgIHsKKyAgICAgcmV0dXJuOworICAgfQorCisgICAvL2lmIGJvdGggSElHSCAmIExPVyBUeCBjaGFubmVscyBkb24ndCBoYXZlIGFueXRoaW5nIG9uIHJlc3YgZGVzYyxhbGwgVHggcGt0cworICAgLy9tdXN0IGhhdmUgYmVlbiBjb25zdW1lZCBieSBSSVZBLCBPSyB0byBnZXQgaW50byBCTVBTCisgICBpZigoMCA9PSBkeGVDdHh0LT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJXS5udW1Sc3ZkRGVzYykgJiYKKyAgICAgICgwID09IGR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1RYX0hJR0hfUFJJXS5udW1Sc3ZkRGVzYykpCisgICB7CisgICAgICB0ZW1wRHhlQ3RybEJsay0+cmluZ05vdEVtcHR5ID0gZVdMQU5fUEFMX0ZBTFNFOworICAgICAgLy9pZiBob3N0IGlzIGluIEJNUFMgJiBubyBwa3QgdG8gVHgsIFJJVkEgY2FuIGdvIHRvIHBvd2VyIHNhdmUKKyAgICAgIGlmKFdMQU5EWEVfUE9XRVJfU1RBVEVfQk1QUyA9PSBkeGVDdHh0LT5ob3N0UG93ZXJTdGF0ZSkKKyAgICAgIHsKKyAgICAgICAgIGR4ZUN0eHQtPnJpdmFQb3dlclN0YXRlID0gV0xBTkRYRV9SSVZBX1BPV0VSX1NUQVRFX0JNUFNfVU5LTk9XTjsKKyAgICAgICAgIGR4ZU5vdGlmeVNtc20oZVdMQU5fUEFMX0ZBTFNFLCBlV0xBTl9QQUxfVFJVRSk7CisgICAgICB9CisgICB9CisgICBlbHNlIC8vc3RpbGwgbW9yZSBwa3RzIHRvIGJlIHNlcnZlZCBieSBSSVZBCisgICB7CisgICAgICB0ZW1wRHhlQ3RybEJsay0+cmluZ05vdEVtcHR5ID0gZVdMQU5fUEFMX1RSVUU7CisKKyAgICAgIHN3aXRjaChkeGVDdHh0LT5yaXZhUG93ZXJTdGF0ZSkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgV0xBTkRYRV9SSVZBX1BPV0VSX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIC8vTk9QCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgV0xBTkRYRV9SSVZBX1BPV0VSX1NUQVRFX0JNUFNfVU5LTk9XTjoKKyAgICAgICAgICAgIGlmKGludHJfYmFzZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBkeGVDdHh0LT5yaXZhUG93ZXJTdGF0ZSA9IFdMQU5EWEVfUklWQV9QT1dFUl9TVEFURV9BQ1RJVkU7CisgICAgICAgICAgICAgICBkeGVOb3RpZnlTbXNtKGVXTEFOX1BBTF9UUlVFLCBlV0xBTl9QQUxfRkFMU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy9hc3NlcnQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVSWEV2ZW50SGFuZGxlcgorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgSGFuZGxlIHNlcmFpbGl6ZWQgUlggZnJhbWUgcmVhZHkgZXZlbnQKKyAgICAgIEZpcnN0IGRpc2FibGUgaW50ZXJydXB0IHRoZW4gcGljayB1cCBmcmFtZSBmcm9tIHByZSBhbGxvY2F0ZWQgYnVmZmVyCisgICAgICBTaW5jZSBmcmFtZSBoYW5kbGUgaXMgZG9lbiwgY2xlYXIgaW50ZXJydXB0IGJpdCB0byByZWFkeSBuZXh0IGludGVycnVwdAorICAgICAgRmluYWxseSByZSBlbmFibGUgaW50ZXJydXB0CisKKyAgQCAgUGFyYW1ldGVycworICAgICAgd3B0X21zZyAgICpyeFJlYWR5TXNnCisgICAgICAgICAgICAgICAgIFJYIGZyYW1lIHJlYWR5IE1TRyBwb2ludGVyCisgICAgICAgICAgICAgICAgIGluY2x1ZGUgRFhFIGNvbnRyb2wgY29udGV4dAorCisgIEAgIFJldHVybgorICAgICAgTk9ORQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBkeGVSWEV2ZW50SGFuZGxlcgorKAorICAgd3B0X21zZyAgICAgICAgICAgICAgICAgKnJ4UmVhZHlNc2cKKykKK3sKKyAgIHdwdF9tc2cgICAgICAgICAgICAgICAgICAqbXNnQ29udGVudCA9ICh3cHRfbXNnICopcnhSZWFkeU1zZzsKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICAqZHhlQ3R4dCAgICA9IE5VTEw7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgIHN0YXR1cyAgICAgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgIGludFNyYyAgICAgPSAwOworICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgICpjaGFubmVsQ2IgID0gTlVMTDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgY2hIaWdoU3RhdDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgY2hMb3dTdGF0OworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFbnRlciIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qIFNhbml0eSBDaGVjayAqLworICAgaWYoTlVMTCA9PSByeFJlYWR5TXNnKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlUlhFdmVudEhhbmRsZXIgQ2hhbm5lbCBFbnRyeSBpcyBub3QgdmFsaWQiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgZHhlQ3R4dCA9IChXTEFORFhFX0N0cmxCbGtUeXBlICopKG1zZ0NvbnRlbnQtPnBDb250ZXh0KTsKKyAgICAgIAorICAgaWYoKCFkeGVDdHh0LT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9SWF9ISUdIX1BSSV0uZXh0cmFDb25maWcuY2hFbmFibGVkKSB8fAorICAgICAgKCFkeGVDdHh0LT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9SWF9MT1dfUFJJXS5leHRyYUNvbmZpZy5jaEVuYWJsZWQpKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiRFhFIGFscmVhZHkgc3RvcHBlZCBpbiBSWCBldmVudCBoYW5kbGVyLiBKdXN0IHJldHVybiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZigoV0xBTkRYRV9QT1dFUl9TVEFURV9JTVBTID09IGR4ZUN0eHQtPmhvc3RQb3dlclN0YXRlKSB8fAorICAgICAgKFdMQU5EWEVfUE9XRVJfU1RBVEVfRE9XTiA9PSBkeGVDdHh0LT5ob3N0UG93ZXJTdGF0ZSkpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgIiVzIFJpdmEgaXMgaW4gJWQsIEp1c3QgUHVsbCBmcmFtZXMgd2l0aG91dCBhbnkgcmVnaXN0ZXIgdG91Y2ggIiwKKyAgICAgICAgICAgX19GVU5DVElPTl9fLCBkeGVDdHh0LT5ob3N0UG93ZXJTdGF0ZSk7CisKKyAgICAgIC8qIE5vdCB0byB0b3VjaCBhbnkgcmVnaXN0ZXIsIGp1c3QgcHVsbCBmcmFtZSBkaXJlY3RseSBmcm9tIGNoYWluIHJpbmcKKyAgICAgICAqIEZpcnN0IGhpZ2ggcHJpb3JpdHkgKi8KKyAgICAgIGNoYW5uZWxDYiA9ICZkeGVDdHh0LT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9SWF9ISUdIX1BSSV07CisgICAgICBzdGF0dXMgPSBkeGVSWEZyYW1lUmVhZHkoZHhlQ3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ2IpOworICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImR4ZVJYRXZlbnRIYW5kbGVyIFB1bGwgZnJvbSBSWCBoaWdoIGNoYW5uZWwgZmFpbCIpOyAgICAgICAgCisgICAgICB9CisKKyAgICAgICAvKiBTZWNvbmQgbG93IHByaW9yaXR5ICovCisgICAgICBjaGFubmVsQ2IgPSAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfUlhfTE9XX1BSSV07CisgICAgICBzdGF0dXMgPSBkeGVSWEZyYW1lUmVhZHkoZHhlQ3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ2IpOworICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImR4ZVJYRXZlbnRIYW5kbGVyIFB1bGwgZnJvbSBSWCBsb3cgY2hhbm5lbCBmYWlsIik7ICAgICAgICAKKyAgICAgIH0KKworICAgICAgLyogSW50ZXJydXB0IHdpbGwgbm90IGVuYWJsZWQgYXQgaGVyZSwgaXQgd2lsbCBiZSBlbmFibGVkIGF0IFBTIG1vZGUgY2hhbmdlICovCisgICAgICB0ZW1wRHhlQ3RybEJsay0+cnhJbnREaXNhYmxlZEJ5SU1QUyA9IGVXTEFOX1BBTF9UUlVFOworCisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIERpc2FibGUgZGV2aWNlIGludGVycnVwdCAqLworICAgLyogUmVhZCB3aG9sZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciBhbmQgZXhjbHVzaXZlIG9ubHkgdGhpcyBjaGFubmVsIGludCAqLworICAgc3RhdHVzID0gd3BhbFJlYWRSZWdpc3RlcihXTEFORFhFX0lOVF9TUkNfUkFXX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRTcmMpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVJYRXZlbnRIYW5kbGVyIFJlYWQgSU5UX1NSQyByZWdpc3RlciBmYWlsIik7CisgICAgICByZXR1cm47ICAgICAgICAgCisgICB9CisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKyAgICAgICAgICAgICJSWCBFdmVudCBIYW5kbGVyIElOVCBTb3VyY2UgMHgleCIsIGludFNyYyk7CisKKyNpZm5kZWYgV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFCisgICAvKiBUZXN0IEhpZ2ggUHJpb3JpdHkgQ2hhbm5lbCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QgKi8KKyAgIGNoYW5uZWxDYiA9ICZkeGVDdHh0LT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9SWF9ISUdIX1BSSV07CisgICBpZihpbnRTcmMgJiAoMSA8PCBjaGFubmVsQ2ItPmFzc2lnbmVkRE1BQ2hhbm5lbCkpCisgICB7CisgICAgICBzdGF0dXMgPSBkeGVDaGFubmVsQ2xlYW5JbnQoY2hhbm5lbENiLCAmY2hIaWdoU3RhdCk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlUlhFdmVudEhhbmRsZXIgSU5UIENsZWFuIHVwIGZhaWwiKTsKKyAgICAgICAgIHJldHVybjsgICAgICAgICAKKyAgICAgIH0KKworICAgICAgaWYoV0xBTkRYRV9DSF9TVEFUX0lOVF9FUlJfTUFTSyAmIGNoSGlnaFN0YXQpCisgICAgICB7CisgICAgICAgICAvKiBFcnJvciBIYXBwZW4gZHVyaW5nIHRyYW5zYWN0aW9uLCBIYW5kbGUgaXQgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoV0xBTkRYRV9DSF9TVEFUX0lOVF9ET05FX01BU0sgJiBjaEhpZ2hTdGF0KQorICAgICAgeworICAgICAgICAgLyogSGFuZGxlIFJYIFJlYWR5IGZvciBoaWdoIHByaW9yaXR5IGNoYW5uZWwgKi8KKyAgICAgICAgIHN0YXR1cyA9IGR4ZVJYRnJhbWVSZWFkeShkeGVDdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDYik7CisgICAgICB9CisgICAgICBlbHNlIGlmKFdMQU5EWEVfQ0hfU1RBVF9NQVNLRURfTUFTSyAmIGNoSGlnaFN0YXQpCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBkeGVSWEZyYW1lUmVhZHkoZHhlQ3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ2IpOworICAgICAgfQorICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICJSWCBISUdIIENIIEVWTlQgU1RBVCAweCV4LCAlZCBmcmFtZXMgaGFuZGxlZCIsIGNoSGlnaFN0YXQsIGNoYW5uZWxDYi0+bnVtRnJhZ21lbnRDdXJyZW50Q2hhaW4pOworICAgfQorI2Vsc2UKKyAgIC8qIFRlc3QgSDJIIFRlc3QgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90ICovCisgICBjaGFubmVsQ2IgPSAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfSDJIX1RFU1RfUlhdOworICAgaWYoaW50U3JjICYgKDEgPDwgY2hhbm5lbENiLT5hc3NpZ25lZERNQUNoYW5uZWwpKQorICAgeworICAgICAgc3RhdHVzID0gZHhlQ2hhbm5lbENsZWFuSW50KGNoYW5uZWxDYiwgJmNoU3RhdCk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlUlhFdmVudEhhbmRsZXIgSU5UIENsZWFuIHVwIGZhaWwiKTsKKyAgICAgICAgIHJldHVybjsgICAgICAgICAKKyAgICAgIH0KKworICAgICAgaWYoV0xBTkRYRV9DSF9TVEFUX0lOVF9FUlJfTUFTSyAmIGNoU3RhdCkKKyAgICAgIHsKKyAgICAgICAgIC8qIEVycm9yIEhhcHBlbiBkdXJpbmcgdHJhbnNhY3Rpb24sIEhhbmRsZSBpdCAqLworICAgICAgfQorICAgICAgZWxzZSBpZihXTEFORFhFX0NIX1NUQVRfSU5UX0VEX01BU0sgJiBjaFN0YXQpCisgICAgICB7CisgICAgICAgICAvKiBIYW5kbGUgUlggUmVhZHkgZm9yIGhpZ2ggcHJpb3JpdHkgY2hhbm5lbCAqLworICAgICAgICAgc3RhdHVzID0gZHhlUlhGcmFtZVJlYWR5KGR4ZUN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENiKTsKKyAgICAgIH0KKyAgICAgIC8qIFVwZGF0ZSB0aGUgUnggRE9ORSBoaXN0b2dyYW0gKi8KKyAgICAgIGNoYW5uZWxDYi0+cnhEb25lSGlzdG9ncmFtID0gKGNoYW5uZWxDYi0+cnhEb25lSGlzdG9ncmFtIDw8IDEpOworICAgICAgaWYoV0xBTkRYRV9DSF9TVEFUX0lOVF9ET05FX01BU0sgJiBjaFN0YXQpCisgICAgICB7CisgICAgICAgICBjaGFubmVsQ2ItPnJ4RG9uZUhpc3RvZ3JhbSB8PSAxOworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICJEWEUgQ2hhbm5lbCBOdW1iZXIgJWQsIFJ4IERPTkUgSGlzdG9ncmFtIDB4JTAxNmxseCIsCisgICAgICAgICAgICBjaGFubmVsQ2ItPmFzc2lnbmVkRE1BQ2hhbm5lbCwgY2hhbm5lbENiLT5yeERvbmVIaXN0b2dyYW0pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgY2hhbm5lbENiLT5yeERvbmVIaXN0b2dyYW0gJj0gfjE7CisgICAgICB9CisgICB9CisjZW5kaWYgLyogV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFICovCisKKyAgIC8qIFRlc3QgTG93IFByaW9yaXR5IENoYW5uZWwgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90ICovCisgICBjaGFubmVsQ2IgPSAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfUlhfTE9XX1BSSV07CisgICBpZihpbnRTcmMgJiAoMSA8PCBjaGFubmVsQ2ItPmFzc2lnbmVkRE1BQ2hhbm5lbCkpCisgICB7CisgICAgICBzdGF0dXMgPSBkeGVDaGFubmVsQ2xlYW5JbnQoY2hhbm5lbENiLCAmY2hMb3dTdGF0KTsKKyAgICAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJkeGVSWEV2ZW50SGFuZGxlciBJTlQgQ2xlYW4gdXAgZmFpbCIpOworICAgICAgICAgcmV0dXJuOyAgICAgICAgIAorICAgICAgfQorCisgICAgICBpZihXTEFORFhFX0NIX1NUQVRfSU5UX0VSUl9NQVNLICYgY2hMb3dTdGF0KQorICAgICAgeworICAgICAgICAgLyogRXJyb3IgSGFwcGVuIGR1cmluZyB0cmFuc2FjdGlvbiwgSGFuZGxlIGl0ICovCisgICAgICB9CisgICAgICBlbHNlIGlmKFdMQU5EWEVfQ0hfU1RBVF9JTlRfRURfTUFTSyAmIGNoTG93U3RhdCkKKyAgICAgIHsKKyAgICAgICAgIC8qIEhhbmRsZSBSWCBSZWFkeSBmb3IgbG93IHByaW9yaXR5IGNoYW5uZWwgKi8KKyAgICAgICAgIHN0YXR1cyA9IGR4ZVJYRnJhbWVSZWFkeShkeGVDdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDYik7CisgICAgICB9CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgUnggRE9ORSBoaXN0b2dyYW0gKi8KKyAgICAgIGNoYW5uZWxDYi0+cnhEb25lSGlzdG9ncmFtID0gKGNoYW5uZWxDYi0+cnhEb25lSGlzdG9ncmFtIDw8IDEpOworICAgICAgaWYoV0xBTkRYRV9DSF9TVEFUX0lOVF9ET05FX01BU0sgJiBjaExvd1N0YXQpCisgICAgICB7CisgICAgICAgICBjaGFubmVsQ2ItPnJ4RG9uZUhpc3RvZ3JhbSB8PSAxOworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICJEWEUgQ2hhbm5lbCBOdW1iZXIgJWQsIFJ4IERPTkUgSGlzdG9ncmFtIDB4JTAxNmxseCIsCisgICAgICAgICAgICBjaGFubmVsQ2ItPmFzc2lnbmVkRE1BQ2hhbm5lbCwgY2hhbm5lbENiLT5yeERvbmVIaXN0b2dyYW0pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgY2hhbm5lbENiLT5yeERvbmVIaXN0b2dyYW0gJj0gfjE7CisgICAgICB9CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIlJYIExPVyBDSCBFVk5UIFNUQVQgMHgleCwgJWQgZnJhbWVzIGhhbmRsZWQiLCBjaExvd1N0YXQsIGNoYW5uZWxDYi0+bnVtRnJhZ21lbnRDdXJyZW50Q2hhaW4pOworICAgfQorICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVJYRXZlbnRIYW5kbGVyIEhhbmRsZSBGcmFtZSBSZWFkeSBGYWlsIik7CisgICAgICByZXR1cm47ICAgICAgICAgCisgICB9CisKKyAgIC8qIEVuYWJsZSBzeXN0ZW0gbGV2ZWwgSVNSICovCisgICAvKiBFbmFibGUgUlggcmVhZHkgSW50ZXJydXB0IGF0IGhlcmUgKi8KKyAgIHN0YXR1cyA9IHdwYWxFbmFibGVJbnRlcnJ1cHQoRFhFX0lOVEVSUlVQVF9SWF9SRUFEWSk7CisgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlUlhFdmVudEhhbmRsZXIgRW5hYmxlIFJYIFJlYWR5IGludGVycnVwdCBmYWlsIik7CisgICAgICByZXR1cm47ICAgICAgICAgCisgICB9CisKKyAgIC8qIFByZXBhcmUgQ29udHJvbCBSZWdpc3RlciBFTiBDaGFubmVsICovCisgICBpZighKGR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1JYX0hJR0hfUFJJXS5leHRyYUNvbmZpZy5jaGFuX21hc2sgJiBXTEFORFhFX0NIX0NUUkxfRU5fTUFTSykpCisgICB7CisgICAgICBIRFhFX0FTU0VSVCgwKTsKKyAgIH0KKyAgIGlmKCEoV0xBTkRYRV9DSF9TVEFUX0lOVF9FRF9NQVNLICYgY2hIaWdoU3RhdCkpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKyAgICAgICAgICAgICAgICJkeGVSWEV2ZW50SGFuZGxlciBSWCBIaWdoLCBOb3QgeWV0IEVELCByZS1lbmFibGUgQ0giKTsKKyAgICAgIHdwYWxXcml0ZVJlZ2lzdGVyKGR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1JYX0hJR0hfUFJJXS5jaGFubmVsUmVnaXN0ZXIuY2hEWEVDdHJsUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1JYX0hJR0hfUFJJXS5leHRyYUNvbmZpZy5jaGFuX21hc2spOworICAgfQorICAgZWxzZQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgICAgICAgICAiZHhlUlhFdmVudEhhbmRsZXIgUlggSGlnaCwgQ0ggU1RBVCA9IEVEX01BU0ssIHdpbGwgUklWQSBQQyIpOworICAgfQorCisgICAvKiBQcmVwYXJlIENvbnRyb2wgUmVnaXN0ZXIgRU4gQ2hhbm5lbCAqLworICAgaWYoIShkeGVDdHh0LT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9SWF9MT1dfUFJJXS5leHRyYUNvbmZpZy5jaGFuX21hc2sgJiBXTEFORFhFX0NIX0NUUkxfRU5fTUFTSykpCisgICB7CisgICAgICBIRFhFX0FTU0VSVCgwKTsKKyAgIH0KKyAgIGlmKCEoV0xBTkRYRV9DSF9TVEFUX0lOVF9FRF9NQVNLICYgY2hMb3dTdGF0KSkKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTUVELAorICAgICAgICAgICAgICAgImR4ZVJYRXZlbnRIYW5kbGVyIFJYIExvdywgTm90IHlldCBFRCwgcmUtZW5hYmxlIENIIik7CisgICAgICB3cGFsV3JpdGVSZWdpc3RlcihkeGVDdHh0LT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9SWF9MT1dfUFJJXS5jaGFubmVsUmVnaXN0ZXIuY2hEWEVDdHJsUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1JYX0xPV19QUkldLmV4dHJhQ29uZmlnLmNoYW5fbWFzayk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX01FRCwKKyAgICAgICAgICAgICAgICJkeGVSWEV2ZW50SGFuZGxlciBSWCBMb3csIENIIFNUQVQgPSBFRF9NQVNLLCB3aWxsIFJJVkEgUEMiKTsKKyAgIH0KKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisgICByZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZVJYUGFja2V0QXZhaWxhYmxlRXZlbnRIYW5kbGVyCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBIYW5kbGUgc2VyaWFsaXplZCBSWCBQYWNrZXQgQXZhaWxhYmxlIGV2ZW50IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sKKyAgICAgIGlzIGludm9rZWQgYnkgV1BBTC4KKyAgICAgIFRyeSB0byBmaWxsIHVwIGFueSBjb21wbGV0ZWQgRFhFIGRlc2NyaXB0b3JzIHdpdGggYXZhaWxhYmxlIFJ4IHBhY2tldCBidWZmZXIKKyAgICAgIHBvaW50ZXJzLgorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIHdwdF9tc2cgICAqcnhQa3RBdmFpbE1zZworICAgICAgICAgICAgICAgICBSWCBmcmFtZSByZWFkeSBNU0cgcG9pbnRlcgorICAgICAgICAgICAgICAgICBpbmNsdWRlIERYRSBjb250cm9sIGNvbnRleHQKKworICBAICBSZXR1cm4KKyAgICAgIE5PTkUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgZHhlUlhQYWNrZXRBdmFpbGFibGVFdmVudEhhbmRsZXIKKygKKyAgIHdwdF9tc2cgICAgICAgICAgICAgICAgICpyeFBrdEF2YWlsTXNnCispCit7CisgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAgKmR4ZUN0eHQgICAgPSBOVUxMOworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICBzdGF0dXMgICAgID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgICpjaGFubmVsQ2IgID0gTlVMTDsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisgICAvKiBTYW5pdHkgQ2hlY2sgKi8KKyAgIGlmKE5VTEwgPT0gcnhQa3RBdmFpbE1zZykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVJYUGFja2V0QXZhaWxhYmxlRXZlbnRIYW5kbGVyIENvbnRleHQgaXMgbm90IHZhbGlkIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGR4ZUN0eHQgICAgPSAoV0xBTkRYRV9DdHJsQmxrVHlwZSAqKShyeFBrdEF2YWlsTXNnLT5wQ29udGV4dCk7CisKKyAgIGRvCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgImR4ZVJYUGFja2V0QXZhaWxhYmxlRXZlbnRIYW5kbGVyLCBzdGFydCByZWZpbGxpbmcgcmluZyIpOworCisgICAgICBjaGFubmVsQ2IgPSAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfUlhfSElHSF9QUkldOworICAgICAgc3RhdHVzID0gZHhlUlhGcmFtZVJlZmlsbFJpbmcoZHhlQ3R4dCxjaGFubmVsQ2IpOworICAgCisgICAgICAvLyBXYWl0IGZvciBhbm90aGVyIGNhbGxiYWNrIHRvIGluZGljYXRlIHdoZW4gUnggcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUKKyAgICAgIC8vIGFnYWluLgorICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgCisgICAgICBjaGFubmVsQ2IgPSAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfUlhfTE9XX1BSSV07CisgICAgICBzdGF0dXMgPSBkeGVSWEZyYW1lUmVmaWxsUmluZyhkeGVDdHh0LGNoYW5uZWxDYik7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9IHdoaWxlKDApOworCisgICBpZigoV0xBTkRYRV9QT1dFUl9TVEFURV9JTVBTID09IGR4ZUN0eHQtPmhvc3RQb3dlclN0YXRlKSB8fAorICAgICAgKFdMQU5EWEVfUE9XRVJfU1RBVEVfRE9XTiA9PSBkeGVDdHh0LT5ob3N0UG93ZXJTdGF0ZSkpCisgICB7CisgICAgICAvKiBJbnRlcnJ1cHQgd2lsbCBub3QgZW5hYmxlZCBhdCBoZXJlLCBpdCB3aWxsIGJlIGVuYWJsZWQgYXQgUFMgbW9kZSBjaGFuZ2UgKi8KKyAgICAgIHRlbXBEeGVDdHJsQmxrLT5yeEludERpc2FibGVkQnlJTVBTID0gZVdMQU5fUEFMX1RSVUU7CisgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZVJYSVNSCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBSWCBmcmFtZSByZWFkeSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisgICAgICBpbnRlcnJ1cHQgZW50cnkgZnVuY3Rpb24sIHRoaXMgZnVuY3Rpb24gY2FsbGVkIGJhc2VkIG9uIElTUiBjb250ZXh0CisgICAgICBNdXN0IGJlIHNlcmlhbGl6ZWQKKworICBAICBQYXJhbWV0ZXJzCisgICAgICB2b2lkICAgICpob3N0Q3R4dAorICAgICAgICAgICAgICAgRFhFIGhvc3QgZHJpdmVyIGNvbnRyb2wgY29udGV4dCwKKyAgICAgICAgICAgICAgIHByZSByZWdpc3RlcmQgZHVyaW5nIGludGVycnVwdCByZWdpc3RyYXRpb24KKworICBAICBSZXR1cm4KKyAgICAgIE5PTkUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIGR4ZVJYSVNSCisoCisgICB2b2lkICAgICAgICAgICAgICAgICAgICAqaG9zdEN0eHQKKykKK3sKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICAqZHhlQ3R4dCAgICA9IChXTEFORFhFX0N0cmxCbGtUeXBlICopaG9zdEN0eHQ7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgIHN0YXR1cyAgICAgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisjaWZkZWYgRkVBVFVSRV9SMzNECisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgIHJlZ1ZhbHVlOworI2VuZGlmIC8qIEZFQVRVUkVfUjMzRCAqLworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFbnRlciIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qIFNhbml0eSBDaGVjayAqLworICAgaWYoTlVMTCA9PSBob3N0Q3R4dCkKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVJYRnJhbWVSZWFkeUlTUiBpbnB1dCBpcyBub3QgdmFsaWQiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworI2lmZGVmIEZFQVRVUkVfUjMzRAorICAgc3RhdHVzID0gd3BhbFJlYWRSZWdpc3RlcihXTEFORFhFX0lOVF9TUkNfUkFXX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ1ZhbHVlKTsKKyAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJkeGVUWENvbXBJU1IgUmVhZCBJTlRfU1JDX1JBVyBmYWlsIik7CisgICAgICByZXR1cm47CisgICB9CisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgIklOVF9TUkNfUkFXIDB4JXgiLCByZWdWYWx1ZSk7CisgICBpZigwID09IHJlZ1ZhbHVlKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJUaGlzIGlzIG5vdCBEWEUgSW50ZXJydXB0LCBSZWplY3QgaXQgMHgleCIsIHJlZ1ZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1IzM0QgKi8KKworICAgLyogRGlzYWJsZSBpbnRlcnJ1cHQgYXQgaGVyZQorICAgICogRGlzYWJsZSBSWCBSZWFkeSBzeXN0ZW0gbGV2ZWwgSW50ZXJydXB0IGF0IGhlcmUKKyAgICAqIE90aGVyd2lzZSBpbmZpbml0ZSBsb29wIG1pZ2h0IGhhcHBlbiAqLworICAgc3RhdHVzID0gd3BhbERpc2FibGVJbnRlcnJ1cHQoRFhFX0lOVEVSUlVQVF9SWF9SRUFEWSk7CisgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlUlhGcmFtZVJlYWR5SVNSIERpc2FibGUgUlggcmVhZHkgaW50ZXJydXB0IGZhaWwiKTsKKyAgICAgIHJldHVybjsgICAgICAgICAKKyAgIH0KKworICAgLyogU2VyaWFsaXplIFJYIFJlYWR5IGludGVycnVwdCB1cG9uIFJYIHRocmVhZCAqLworICAgSERYRV9BU1NFUlQoTlVMTCAhPSBkeGVDdHh0LT5yeElzck1zZyk7CisgICBzdGF0dXMgPSB3cGFsUG9zdFJ4TXNnKFdESV9HRVRfUEFMX0NUWCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkeGVDdHh0LT5yeElzck1zZyk7CisgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgSERYRV9BU1NFUlQoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cyk7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICJkeGVSWEZyYW1lUmVhZHlJU1IgaW50ZXJydXB0IHNlcmlhbGl6ZSBmYWlsIik7CisgICB9CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEV4aXQiLCBfX0ZVTkNUSU9OX18pOworICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVUWFB1c2hGcmFtZQorCisgIEAgIERlc2NyaXB0aW9uCisgICAgICBQdXNoIFRYIGZyYW1lIGludG8gRFhFIGRlc2NyaXB0b3IgYW5kIERYRSByZWdpc3RlcgorICAgICAgU2VuZCBub3RpZmljYXRpb24gdG8gRFhFIHJlZ2lzdGVyIHRoYXQgVFggZnJhbWUgaXMgcmVhZHkgdG8gdHJhbnNmZXIKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbCBzcGVjaWZpYyBjb250cm9sIGJsb2NrCisgICAgICB3cHRfcGFja2V0ICAgICAgICAgICAgICAqcGFsUGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0IHBvaW50ZXIgcmVhZHkgdG8gdHJhbnNmZXIKKworICBAICBSZXR1cm4KKyAgICAgIFBBTF9TVEFUVVNfVAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB3cHRfc3RhdHVzIGR4ZVRYUHVzaEZyYW1lCisoCisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5LAorICAgd3B0X3BhY2tldCAgICAgICAgICAgICAgKnBhbFBhY2tldAorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIFdMQU5EWEVfRGVzY0N0cmxCbGtUeXBlICAgICpjdXJyZW50Q3RybEJsayA9IE5VTEw7CisgICBXTEFORFhFX0Rlc2NUeXBlICAgICAgICAgICAqY3VycmVudERlc2MgICAgPSBOVUxMOworICAgV0xBTkRYRV9EZXNjVHlwZSAgICAgICAgICAgKmZpcnN0RGVzYyAgICAgID0gTlVMTDsKKyAgIFdMQU5EWEVfRGVzY1R5cGUgICAgICAgICAgICpMYXN0RGVzYyAgICAgICA9IE5VTEw7CisgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqc291cmNlUGh5c2ljYWxBZGRyZXNzID0gTlVMTDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICB4ZmVyU2l6ZSA9IDA7CisjaWZkZWYgRkVBVFVSRV9SMzNECisgICB0eF9mcm1fcGNpZV92ZWN0b3JfdCAgICAgICAgZnJhbWVWZWN0b3I7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgVmE7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgZnJhZ0NvdW50ID0gMDsKKyNlbHNlCisgICB3cHRfaXRlcmF0b3IgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYoV0xBTkRYRV9QT1dFUl9TVEFURV9CTVBTID09IHRlbXBEeGVDdHJsQmxrLT5ob3N0UG93ZXJTdGF0ZSkKKyAgIHsKKyAgICAgIHRlbXBEeGVDdHJsQmxrLT5yaXZhUG93ZXJTdGF0ZSA9IFdMQU5EWEVfUklWQV9QT1dFUl9TVEFURV9CTVBTX1VOS05PV047CisgICAgICBkeGVOb3RpZnlTbXNtKGVXTEFOX1BBTF9GQUxTRSwgZVdMQU5fUEFMX1RSVUUpOworICAgfQorCisgICBjaGFubmVsRW50cnktPm51bUZyYWdtZW50Q3VycmVudENoYWluID0gMDsKKyAgIGN1cnJlbnRDdHJsQmxrID0gY2hhbm5lbEVudHJ5LT5oZWFkQ3RybEJsazsKKworICAgLyogSW5pdGlhbGl6ZSBpbnRlcmF0b3IsIFRYIGlzIGZyYWdtZW50ZWQgKi8KKyNpZmRlZiBGRUFUVVJFX1IzM0QKKyAgIG1lbXNldCgmZnJhbWVWZWN0b3IsIDAsIHNpemVvZih0eF9mcm1fcGNpZV92ZWN0b3JfdCkpOworICAgc3RhdHVzID0gd3BhbFByZXBhcmVUeEZyYW1lKHBhbFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZVZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZWYSk7CisjZWxzZQorICAgc3RhdHVzID0gd3BhbExvY2tQYWNrZXRGb3JUcmFuc2ZlcihwYWxQYWNrZXQpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVRYUHVzaEZyYW1lIHVuYWJsZSB0byBsb2NrIHBhY2tldCIpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgc3RhdHVzID0gd3BhbEl0ZXJhdG9ySW5pdCgmaXRlcmF0b3IsIHBhbFBhY2tldCk7CisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlVFhQdXNoRnJhbWUgaXRlcmF0b3IgaW5pdCBmYWlsIik7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICAvKiAhISEhIFJldmlzaXQgYnJlYWsgY29uZGl0aW9uICEhISEhISEgKi8KKyAgIHdoaWxlKDEpCisgICB7CisgICAgICAvKiBHZXQgY3VycmVudCBkZXNjcmlwdG9yIHBvaW50ZXIgZnJvbSBjdXJyZW50IGNvbnRyb2wgYmxvY2sgKi8KKyAgICAgIGN1cnJlbnREZXNjID0gY3VycmVudEN0cmxCbGstPmxpbmtlZERlc2M7CisgICAgICBpZihOVUxMID09IGZpcnN0RGVzYykKKyAgICAgIHsKKyAgICAgICAgIGZpcnN0RGVzYyA9IGN1cnJlbnRDdHJsQmxrLT5saW5rZWREZXNjOworICAgICAgfQorICAgICAgLyogQWxsIGNvbnRyb2wgYmxvY2sgd2lsbCBoYXZlIHNhbWUgcGFsUGFja2V0IFBvaW50ZXIKKyAgICAgICAqIHRvIG1ha2UgbG9naWMgc2ltcGxlciAqLworICAgICAgY3VycmVudEN0cmxCbGstPnhmckZyYW1lID0gcGFsUGFja2V0OworCisgICAgICAvKiBHZXQgbmV4dCBmcmFnbWVudCBwaHlzaWNhbCBhZGRyZXNzIGFuZCBmcmFnbWVudCBzaXplCisgICAgICAgKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0cmlhbCwgd2lsbCBnZXQgZmlyc3QgcGh5c2ljYWwgYWRkcmVzcworICAgICAgICogaWYgbm8gbW9yZSBmcmFnbWVudCwgRGVzY3JpcHRvciBzcmMgYWRkcmVzcyB3aWxsIGJlIHNldCBhcyBOVUxMLCBPSz8/PyAqLworI2lmZGVmIEZFQVRVUkVfUjMzRAorICAgICAgaWYoZnJhZ0NvdW50ID09IGZyYW1lVmVjdG9yLm51bV9mcmcpCisgICAgICB7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnRDdHJsQmxrLT5zaGFkb3dCdWZmZXJWYSA9IGZyYW1lVmVjdG9yLmZyZ1swXS52YTsKKyAgICAgIHNvdXJjZVBoeXNpY2FsQWRkcmVzcyAgICAgICAgICA9ICh2b2lkICopZnJhbWVWZWN0b3IuZnJnW2ZyYWdDb3VudF0ucGE7CisgICAgICB4ZmVyU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFtZVZlY3Rvci5mcmdbZnJhZ0NvdW50XS5zaXplOworICAgICAgZnJhZ0NvdW50Kys7CisgICAgICBIRFhFX0FTU0VSVCgwICE9IHhmZXJTaXplKTsKKyAgICAgIEhEWEVfQVNTRVJUKE5VTEwgIT0gc291cmNlUGh5c2ljYWxBZGRyZXNzKTsKKyNlbHNlCisgICAgICBzdGF0dXMgPSB3cGFsSXRlcmF0b3JOZXh0KCZpdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlUGh5c2ljYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGZlclNpemUpOworICAgICAgaWYoKE5VTEwgPT0gc291cmNlUGh5c2ljYWxBZGRyZXNzKSB8fAorICAgICAgICAgKDAgICAgPT0geGZlclNpemUpKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgICAiZHhlVFhQdXNoRnJhbWUgZW5kIG9mIGN1cnJlbnQgZnJhbWUiKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImR4ZVRYUHVzaEZyYW1lIEdldCBuZXh0IGZyYW1lIGZhaWwiKTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisKKyAgICAgIC8qIFRoaXMgaXMgdGhlIExBU1QgZGVzY3JpcHRvciB2YWxpZCBmb3IgdGhpcyB0cmFuc2FjdGlvbiAqLworICAgICAgTGFzdERlc2MgICAgPSBjdXJyZW50Q3RybEJsay0+bGlua2VkRGVzYzsKKworICAgICAgLyogUHJvZ3JhbSBEWEUgZGVzY3JpcHRvciAqLworICAgICAgY3VycmVudERlc2MtPmR4ZWRlc2MuZHhlX3Nob3J0X2Rlc2Muc3JjTWVtQWRkckwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5EWEVfVTMyX1NXQVBfRU5ESUFOKCh3cHRfdWludDMyKXNvdXJjZVBoeXNpY2FsQWRkcmVzcyk7CisKKyAgICAgIC8qIEp1c3Qgbm9ybWFsIGRhdGEgdHJhbnNmZXIgZnJvbSBhQ1BVIEZsYXQgTWVtb3J5IHRvIEJNVSBRICovCisgICAgICBpZigoV0RUU19DSEFOTkVMX1RYX0xPV19QUkkgID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpIHx8CisgICAgICAgICAoV0RUU19DSEFOTkVMX1RYX0hJR0hfUFJJID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpKQorICAgICAgeworICAgICAgICAgY3VycmVudERlc2MtPmR4ZWRlc2MuZHhlX3Nob3J0X2Rlc2MuZHN0TWVtQWRkckwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFORFhFX1UzMl9TV0FQX0VORElBTihjaGFubmVsRW50cnktPmNoYW5uZWxDb25maWcucmVmV1EpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogVGVzdCBzcGVjaWZpYyBIMkggdHJhbnNmZXIsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYWxyZWFkeSBzZXQKKyAgICAgICAgICAqIERvIE5vdGhpbmcgKi8KKyAgICAgIH0KKyAgICAgIGN1cnJlbnREZXNjLT54ZnJTaXplID0gV0xBTkRYRV9VMzJfU1dBUF9FTkRJQU4oeGZlclNpemUpOworCisgICAgICAvKiBQcm9ncmFtIGNoYW5uZWwgY29udHJvbCByZWdpc3RlciAqLworICAgICAgLyogRmlyc3QgZnJhbWUgbm90IHNldCBWQUwgYml0LCB3aHkgPz8/ICovCisgICAgICBpZigwID09IGNoYW5uZWxFbnRyeS0+bnVtRnJhZ21lbnRDdXJyZW50Q2hhaW4pCisgICAgICB7CisgICAgICAgICBjdXJyZW50RGVzYy0+ZGVzY0N0cmwuY3RybCA9IGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY3dfY3RybF93cml0ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGN1cnJlbnREZXNjLT5kZXNjQ3RybC5jdHJsID0gY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jd19jdHJsX3dyaXRlX3ZhbGlkOworICAgICAgfQorCisgICAgICAvKiBVcGRhdGUgc3RhdGlzdGljcyAqLworICAgICAgY2hhbm5lbEVudHJ5LT5udW1GcmFnbWVudEN1cnJlbnRDaGFpbisrOworICAgICAgY2hhbm5lbEVudHJ5LT5udW1GcmVlRGVzYy0tOworICAgICAgY2hhbm5lbEVudHJ5LT5udW1Sc3ZkRGVzYysrOworCisgICAgICAvKiBHZXQgbmV4dCBjb250cm9sIGJsb2NrICovCisgICAgICBjdXJyZW50Q3RybEJsayA9IGN1cnJlbnRDdHJsQmxrLT5uZXh0Q3RybEJsazsKKyAgIH0KKyAgIGNoYW5uZWxFbnRyeS0+bnVtVG90YWxGcmFtZSsrOworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiTlVNIFRYIEZSQUcgJWQsIFRvdGFsIEZyYW1lICVkIiwKKyAgICAgICAgICAgIGNoYW5uZWxFbnRyeS0+bnVtRnJhZ21lbnRDdXJyZW50Q2hhaW4sIGNoYW5uZWxFbnRyeS0+bnVtVG90YWxGcmFtZSk7CisKKyAgIC8qIFByb2dyYW0gQ2hhbm5lbCBjb250cm9sIHJlZ2lzdGVyCisgICAgKiBTZXQgYXMgZW5kIG9mIHBhY2tldAorICAgICogRW5hYmxlIGludGVycnVwdCBhbHNvIGZvciBmaXJzdCBjb2RlIGxvY2sgZG93bgorICAgICogcGVyZm9ybWFjZSBvcHRpbWl6YXRpb24sIHRoaXMgd2lsbCBiZSByZXZpc2l0ZWQgKi8KKyAgIGlmKE5VTEwgPT0gTGFzdERlc2MpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJkeGVUWFB1c2hGcmFtZSBOVUxMIExhc3QgRGVzY3JpcHRvciwgYnJva2VuIGNoYWluIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBVUxUOworICAgfQorICAgTGFzdERlc2MtPmRlc2NDdHJsLmN0cmwgID0gY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jd19jdHJsX3dyaXRlX2VvcF9pbnQ7CisgICAvKiBOb3cgRmlyc3Qgb25lIGFsc28gVmFsaWQgPz8/PworICAgICogdGhpcyBwcm9jZWR1cmUgd2lsbCBwcmV2ZW50IG92ZXIgaGFuZGxlIGRlc2NyaXB0b3IgZnJvbSBwcmV2aW91cworICAgICogVFggdHJpZ2dlciAqLworICAgZmlyc3REZXNjLT5kZXNjQ3RybC5jdHJsID0gY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jd19jdHJsX3dyaXRlX3ZhbGlkOworCisgICAvKiBJZiBpbiBCTVBTIG1vZGUgbm8gbmVlZCB0byBub3RpZnkgdGhlIERYRSBFbmdpbmUsIG5vdGlmeSBTTVNNIGluc3RlYWQgKi8KKyAgIGlmKFdMQU5EWEVfUklWQV9QT1dFUl9TVEFURV9CTVBTX1VOS05PV04gPT0gdGVtcER4ZUN0cmxCbGstPnJpdmFQb3dlclN0YXRlKQorICAgeworICAgICAgLyogVXBkYXRlIGNoYW5uZWwgaGVhZCBhcyBuZXh0IGF2YWxpYWJsZSBsaW5rZWQgc2xvdCAqLworICAgICAgY2hhbm5lbEVudHJ5LT5oZWFkQ3RybEJsayA9IGN1cnJlbnRDdHJsQmxrOworICAgICAgdGVtcER4ZUN0cmxCbGstPnJpbmdOb3RFbXB0eSA9IGVXTEFOX1BBTF9UUlVFOworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csICJTTVNNX3JldCBMTz0lZCBIST0lZCIsIHRlbXBEeGVDdHJsQmxrLT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJXS5udW1Sc3ZkRGVzYywKKyAgICAgICAgICAgICAgIHRlbXBEeGVDdHJsQmxrLT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9UWF9ISUdIX1BSSV0ubnVtUnN2ZERlc2MgKTsKKyAgICAgIGR4ZU5vdGlmeVNtc20oZVdMQU5fUEFMX1RSVUUsIGVXTEFOX1BBTF9GQUxTRSk7CisJICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICAvKiBJZiBEWEUgdXNlIGV4dGVybmFsIGRlc2NyaXB0b3IsIHJlZ2lzdGVycyBhcmUgbm90IG5lZWRlZCB0byBiZSBwcm9ncmFtbWVkCisgICAgKiBKdXN0IGFmdGVyIGZpbmlzaCB0byBwcm9ncmFtIGRlc2NyaXB0b3IsIHRpcmlnZ2VyIHRvIHNlbmQgKi8KKyAgIGlmKGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrICYgV0xBTkRYRV9DSF9DVFJMX0VERU5fTUFTSykKKyAgIHsKKyAgICAgIC8qIElzc3VlIGEgZHVtbXkgcmVhZCBmcm9tIHRoZSBEWEUgZGVzY3JpcHRvciBERFIgbG9jYXRpb24gdG8KKyAgICAgICAgIGVuc3VyZSB0aGF0IGFueSBwcmV2aW91c2x5IHBvc3RlZCB3cml0ZSB0byB0aGUgZGVzY3JpcHRvcgorICAgICAgICAgY29tcGxldGVzLiAqLworICAgICAgaWYoY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jd19jdHJsX3dyaXRlX3ZhbGlkICE9IGZpcnN0RGVzYy0+ZGVzY0N0cmwuY3RybCkKKyAgICAgIHsKKyAgICAgICAgIC8vSERYRV9BU1NFUlQoMCk7CisgICAgICB9CisKKyAgICAgIC8qIEV2ZXJ5dGhpbmcgaXMgcmVhZHkKKyAgICAgICAqIFRyaWdnZXIgdG8gc3RhcnQgRE1BICovCisgICAgICBzdGF0dXMgPSB3cGFsV3JpdGVSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRUN0cmxSZWdBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRW50cnktPmV4dHJhQ29uZmlnLmNoYW5fbWFzayk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlVFhQdXNoRnJhbWUgV3JpdGUgQ2hhbm5lbCBDdHJsIFJlZ2lzdGVyIGZhaWwiKTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisKKyAgICAgIC8qIFVwZGF0ZSBjaGFubmVsIGhlYWQgYXMgbmV4dCBhdmFsaWFibGUgbGlua2VkIHNsb3QgKi8KKyAgICAgIGNoYW5uZWxFbnRyeS0+aGVhZEN0cmxCbGsgPSBjdXJyZW50Q3RybEJsazsKKworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICAvKiBJZiBEWEUgbm90IHVzZSBleHRlcm5hbCBkZXNjcmlwdG9yLCBwcm9ncmFtIGVhY2ggcmVnaXN0ZXJzICovCisgICAvKiBDaXJjdWxhciBidWZmZXIgaGFuZGxlIG5vdCBuZWVkIHRvIHByb2dyYW0gREVTQyByZWdpc3Rlcj8/PworICAgICogR0VONSBjb2RlIG5vdCBwcm9ncmFtZWQgUklORyBidWZmZXIgY2FzZQorICAgICogUkVWSVNJVCBUSElTICEhISEhISAqLworICAgaWYoKFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJICA9PSBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKSB8fAorICAgICAgKFdEVFNfQ0hBTk5FTF9UWF9ISUdIX1BSSSA9PSBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKSkKKyAgIHsKKyAgICAgIC8qIERlc3RpbmF0aW9uIGFkZHJlc3MsIGFzc2lnbmVkIFdvcmsgUSAqLworICAgICAgc3RhdHVzID0gd3BhbFdyaXRlUmVnaXN0ZXIoY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVEYWRybFJlZ0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxFbnRyeS0+Y2hhbm5lbENvbmZpZy5yZWZXUSk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlVFhQdXNoRnJhbWUgUHJvZ3JhbSBkZXN0IGFkZHJlc3MgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIH0KKyAgICAgIC8qIElmIGRlc2NyaXB0b3IgZm9ybWF0IGlzIFNIT1JUICovCisgICAgICBpZihjaGFubmVsRW50cnktPmNoYW5uZWxDb25maWcudXNlU2hvcnREZXNjRm10KQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gd3BhbFdyaXRlUmVnaXN0ZXIoY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVEYWRyaFJlZ0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgImR4ZVRYUHVzaEZyYW1lIFByb2dyYW0gZGVzdCBhZGRyZXNzIHJlZ2lzdGVyIGZhaWwiKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJkeGVUWFB1c2hGcmFtZSBMT05HIERlc2NyaXB0b3IgRm9ybWF0ISEhIik7CisgICAgICB9CisgICB9CisjaWZkZWYgV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFCisgICBlbHNlIGlmKFdEVFNfQ0hBTk5FTF9IMkhfVEVTVF9UWCAgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkKKyAgIHsKKyAgICAgIC8qIERlc3RpbmF0aW9uIGFkZHJlc3MsIFBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzICovCisgICAgICBzdGF0dXMgPSB3cGFsV3JpdGVSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRURhZHJsUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkRYRV9VMzJfU1dBUF9FTkRJQU4oZmlyc3REZXNjLT5keGVkZXNjLmR4ZV9zaG9ydF9kZXNjLmRzdE1lbUFkZHJMKSk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlVFhQdXNoRnJhbWUgUHJvZ3JhbSBkZXN0IGFkZHJlc3MgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIH0KKyAgICAgIC8qIElmIGRlc2NyaXB0b3IgZm9ybWF0IGlzIFNIT1JUICovCisgICAgICBpZihjaGFubmVsRW50cnktPmNoYW5uZWxDb25maWcudXNlU2hvcnREZXNjRm10KQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gd3BhbFdyaXRlUmVnaXN0ZXIoY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVEYWRyaFJlZ0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgImR4ZVRYUHVzaEZyYW1lIFByb2dyYW0gZGVzdCBhZGRyZXNzIHJlZ2lzdGVyIGZhaWwiKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJkeGVUWFB1c2hGcmFtZSBMT05HIERlc2NyaXB0b3IgRm9ybWF0ISEhIik7CisgICAgICB9CisgICB9CisjZW5kaWYgLyogV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFICovCisKKyAgIC8qIFByb2dyYW0gU291cmNlIGFkZHJlc3MgcmVnaXN0ZXIKKyAgICAqIFRoaXMgYWRkcmVzcyBpcyBhbHJlYWR5IHByb2dyYW1tZWQgaW50byBEWEUgRGVzY3JpcHRvcgorICAgICogQnV0IHJlZ2lzdGVyIGFsc28gdXBhZHRlICovCisgICBzdGF0dXMgPSB3cGFsV3JpdGVSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRVNhZHJsUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkRYRV9VMzJfU1dBUF9FTkRJQU4oZmlyc3REZXNjLT5keGVkZXNjLmR4ZV9zaG9ydF9kZXNjLnNyY01lbUFkZHJMKSk7CisgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlVFhQdXNoRnJhbWUgUHJvZ3JhbSBzcmMgYWRkcmVzcyByZWdpc3RlciBmYWlsIik7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorICAgLyogSWYgZGVzY3JpcHRvciBmb3JtYXQgaXMgU0hPUlQgKi8KKyAgIGlmKGNoYW5uZWxFbnRyeS0+Y2hhbm5lbENvbmZpZy51c2VTaG9ydERlc2NGbXQpCisgICB7CisgICAgICBzdGF0dXMgPSB3cGFsV3JpdGVSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRVNhZHJoUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlVFhQdXNoRnJhbWUgUHJvZ3JhbSBkZXN0IGFkZHJlc3MgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVRYUHVzaEZyYW1lIExPTkcgRGVzY3JpcHRvciBGb3JtYXQhISEiKTsKKyAgIH0KKworICAgLyogTGlua2VkIGxpc3QgRGVzY3JpcHRvciBwb2ludGVyICovCisgICBzdGF0dXMgPSB3cGFsV3JpdGVSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRURlc2NsUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEVudHJ5LT5oZWFkQ3RybEJsay0+bGlua2VkRGVzY1BoeUFkZHIpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVRYUHVzaEZyYW1lIFdyaXRlIERFU0MgQWRkcmVzcyByZWdpc3RlciBmYWlsIik7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorICAgLyogSWYgZGVzY3JpcHRvciBmb3JtYXQgaXMgU0hPUlQgKi8KKyAgIGlmKGNoYW5uZWxFbnRyeS0+Y2hhbm5lbENvbmZpZy51c2VTaG9ydERlc2NGbXQpCisgICB7CisgICAgICBzdGF0dXMgPSB3cGFsV3JpdGVSZWdpc3RlcihjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRURlc2NoUmVnQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlVFhQdXNoRnJhbWUgUHJvZ3JhbSBkZXN0IGFkZHJlc3MgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVRYUHVzaEZyYW1lIExPTkcgRGVzY3JpcHRvciBGb3JtYXQhISEiKTsKKyAgIH0KKworICAgLyogVHJhbnNmZXIgU2l6ZSAqLworICAgeGZlclNpemUgPSBXTEFORFhFX1UzMl9TV0FQX0VORElBTihmaXJzdERlc2MtPnhmclNpemUpOworICAgc3RhdHVzID0gd3BhbFdyaXRlUmVnaXN0ZXIoY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVTelJlZ0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhmZXJTaXplKTsKKyAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJkeGVUWFB1c2hGcmFtZSBXcml0ZSBERVNDIEFkZHJlc3MgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgLyogRXZlcnl0aGluZyBpcyByZWFkeQorICAgICogVHJpZ2dlciB0byBzdGFydCBETUEgKi8KKyAgIHN0YXR1cyA9IHdwYWxXcml0ZVJlZ2lzdGVyKGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFJlZ2lzdGVyLmNoRFhFQ3RybFJlZ0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrKTsKKyAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJkeGVUWFB1c2hGcmFtZSBXcml0ZSBDaGFubmVsIEN0cmwgUmVnaXN0ZXIgZmFpbCIpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgLyogVXBkYXRlIGNoYW5uZWwgaGVhZCBhcyBuZXh0IGF2YWxpYWJsZSBsaW5rZWQgc2xvdCAqLworICAgY2hhbm5lbEVudHJ5LT5oZWFkQ3RybEJsayA9IGN1cnJlbnRDdHJsQmxrOworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZVRYQ29tcEZyYW1lCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBUWCBGcmFtZSB0cmFuc2ZlciBjb21wbGV0ZSBldmVudCBoYW5kbGVyCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhFIGhvc3QgZHJpdmVyIG1haW4gY29udHJvbCBibG9jaworICAgICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgc3BlY2lmaWMgY29udHJvbCBibG9jaworCisgIEAgIFJldHVybgorICAgICAgUEFMX1NUQVRVU19UCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHdwdF9zdGF0dXMgZHhlVFhDb21wRnJhbWUKKygKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpob3N0Q3R4dCwKKyAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICpjaGFubmVsRW50cnkKKykKK3sKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICAgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgV0xBTkRYRV9EZXNjQ3RybEJsa1R5cGUgICpjdXJyZW50Q3RybEJsayA9IE5VTEw7CisgICBXTEFORFhFX0Rlc2NUeXBlICAgICAgICAgKmN1cnJlbnREZXNjICAgID0gTlVMTDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgZGVzY0N0cmxWYWx1ZSAgPSAwOworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICpsb3dUaHJlc2hvbGQgICA9IE5VTEw7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogU2FuaXR5ICovCisgICBpZigoTlVMTCA9PSBob3N0Q3R4dCkgfHwgKE5VTEwgPT0gY2hhbm5lbEVudHJ5KSkKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVRYQ29tcEZyYW1lIEludmFsaWQgQVJHIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBpZihOVUxMID09IGhvc3RDdHh0LT50eENvbXBDQikKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVRYQ29tcEZyYW1lIFRYQ29tcENCIGlzIG5vdCByZWdpc3RlcmVkIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0VNUFRZOworICAgfQorCisgICB3cGFsTXV0ZXhBY3F1aXJlKCZjaGFubmVsRW50cnktPmR4ZUNoYW5uZWxMb2NrKTsKKworICAgY3VycmVudEN0cmxCbGsgPSBjaGFubmVsRW50cnktPnRhaWxDdHJsQmxrOworICAgY3VycmVudERlc2MgICAgPSBjdXJyZW50Q3RybEJsay0+bGlua2VkRGVzYzsKKworICAgaWYoIGN1cnJlbnRDdHJsQmxrID09IGNoYW5uZWxFbnRyeS0+aGVhZEN0cmxCbGsgKQorICAgeworICAgICAgd3BhbE11dGV4UmVsZWFzZSgmY2hhbm5lbEVudHJ5LT5keGVDaGFubmVsTG9jayk7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0VNUFRZOworICAgfQorCisgICAvKiAgKi8KKyAgIHdoaWxlKDEpCisgICB7CisvLyAgICAgIEhEWEVfQVNTRVJUKFdMQU5fUEFMX0lTX1NUQVRVU19TVUNDRVNTKFdMQU5fUml2YVZhbGlkYXRlRGVzYyhjdXJyZW50RGVzYykpKTsKKyAgICAgIGRlc2NDdHJsVmFsdWUgPSBjdXJyZW50RGVzYy0+ZGVzY0N0cmwuY3RybDsKKyAgICAgIGlmKChkZXNjQ3RybFZhbHVlICYgV0xBTkRYRV9ERVNDX0NUUkxfVkFMSUQpKQorICAgICAgeworICAgICAgICAgLyogY2F1Z2h0IHVwIHdpdGggaGVhZCwgYmFpbCBvdXQgKi8KKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTUVELAorICAgICAgICAgICAgICAgICAgImR4ZVRYQ29tcEZyYW1lIGNhdWdodCB1cCB3aXRoIGhlYWQgLSBuZXh0IERFU0MgaGFzIFZBTElEIHNldCIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIEhEWEVfQVNTRVJUKGN1cnJlbnRDdHJsQmxrLT54ZnJGcmFtZSAhPSBOVUxMKTsKKyAgICAgIGNoYW5uZWxFbnRyeS0+bnVtRnJlZURlc2MrKzsKKyAgICAgIGNoYW5uZWxFbnRyeS0+bnVtUnN2ZERlc2MtLTsKKworICAgICAgLyogU2VuZCBGcmFtZSBUWCBDb21wbGV0ZSBub3RpZmljYXRpb24gd2l0aCBmcmFtZSBzdGFydCBmcmFnbWVudCBsb2NhdGlvbiAqLworICAgICAgaWYoV0xBTkRYRV9VMzJfU1dBUF9FTkRJQU4oZGVzY0N0cmxWYWx1ZSkgJiBXTEFORFhFX0RFU0NfQ1RSTF9FT1ApCisgICAgICB7CisgICAgICAgICBob3N0Q3R4dC0+dHhDb21wbGV0ZWRGcmFtZXMtLTsKKyNpZmRlZiBGRUFUVVJFX1IzM0QKKyAgICAgICAgIHdwYWxGcmVlVHhGcmFtZShjdXJyZW50Q3RybEJsay0+c2hhZG93QnVmZmVyVmEpOworI2Vsc2UKKyAgICAgICAgIHN0YXR1cyA9IHdwYWxVbmxvY2tQYWNrZXQoY3VycmVudEN0cmxCbGstPnhmckZyYW1lKTsKKyAgICAgICAgIGlmIChlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgICAgeworICAgICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiZHhlUlhGcmFtZVJlYWR5IHVuYWJsZSB0byB1bmxvY2sgcGFja2V0Iik7CisgICAgICAgICAgICB3cGFsTXV0ZXhSZWxlYXNlKCZjaGFubmVsRW50cnktPmR4ZUNoYW5uZWxMb2NrKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisgICAgICAgICBob3N0Q3R4dC0+dHhDb21wQ0IoaG9zdEN0eHQtPmNsaWVudEN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEN0cmxCbGstPnhmckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyk7CisgICAgICAgICBjaGFubmVsRW50cnktPm51bUZyYWdtZW50Q3VycmVudENoYWluID0gMDsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnRDdHJsQmxrID0gY3VycmVudEN0cmxCbGstPm5leHRDdHJsQmxrOworICAgICAgY3VycmVudERlc2MgICAgPSBjdXJyZW50Q3RybEJsay0+bGlua2VkRGVzYzsKKworICAgICAgLyogQnJlYWsgY29uZGl0aW9uCisgICAgICAgKiBIZWFkIGNvbnRyb2wgYmxvY2sgaXMgdGhlIGNvbnRyb2wgYmxvY2sgbXVzdCBiZSBwcm9ncmFtZWQgZm9yIHRoZSBuZXh0IFRYCisgICAgICAgKiBzbywgaGVhZCBjb250cm9sIGJsb2NrIGlzIG5vdCBwcm9ncmFtbWVkIGNvbnRyb2wgYmxvY2sgeWV0CisgICAgICAgKiBpZiBsb29wIGVuY291bnRlIGhlYWQgY29udHJvbCBibG9jaywgc3RvcCB0byBjb21wbGV0ZQorICAgICAgICogaW4gdGhlb3J5LCBDT01QIENCIG11c3QgYmUgY2FsbGVkIGFscmVhZHkgPz8/ICovCisgICAgICBpZihjdXJyZW50Q3RybEJsayA9PSBjaGFubmVsRW50cnktPmhlYWRDdHJsQmxrKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgICAgICAgICAgICAiZHhlVFhDb21wRnJhbWUgY2F1Z2h0IHVwIHdpdGggaGVhZCBwdHIiKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogVkFMSUQgQml0IGNoZWNrID8/Pz8gKi8KKyAgIH0KKworICAgLyogVGFpbCBhbmQgSGVhZCBDb250cm9sIGJsb2NrIG11c3QgYmUgc2FtZSAqLworICAgY2hhbm5lbEVudHJ5LT50YWlsQ3RybEJsayA9IGN1cnJlbnRDdHJsQmxrOworCisgICBsb3dUaHJlc2hvbGQgPSBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlID09IFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJPworICAgICAgJihob3N0Q3R4dC0+dHhDb21wSW50LnR4TG93UmVzb3VyY2VUaHJlc2hvbGRfTG9QcmlDaCk6CisgICAgICAmKGhvc3RDdHh0LT50eENvbXBJbnQudHhMb3dSZXNvdXJjZVRocmVzaG9sZF9IaVByaUNoKTsKKworICAgLyogSWYgc3BlY2lmaWMgY2hhbm5lbCBoaXQgbG93IHJlc291cmNlIGNvbmRpdGlvbiBzZW5kIG5vdGlmaWNhdGlvbiB0byB1cHBlciBsYXllciAqLworICAgaWYoKGVXTEFOX1BBTF9UUlVFID09IGNoYW5uZWxFbnRyeS0+aGl0TG93UmVzb3VyY2UpICYmCisgICAgICAoY2hhbm5lbEVudHJ5LT5udW1GcmVlRGVzYyA+ICpsb3dUaHJlc2hvbGQpKQorICAgeworICAgICAgLyogQ2hhbmdlIGl0IGJhY2sgaWYgd2UgcmFpc2VkIGl0IGZvciBmZXRjaGluZyBhIHJlbWFpbmluZyBwYWNrZXQgZnJvbSBUTCAqLworICAgICAgaWYoV0xBTkRYRV9UWF9MT1dfUkVTX1RIUkVTSE9MRCA+ICpsb3dUaHJlc2hvbGQpCisgICAgICB7CisgICAgICAgICAqbG93VGhyZXNob2xkID0gV0xBTkRYRV9UWF9MT1dfUkVTX1RIUkVTSE9MRDsKKyAgICAgIH0KKworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJEWEUgVFggJWQgY2hhbm5lbCByZWNvdmVyZWQgZnJvbSBsb3cgcmVzb3VyY2UiLCBjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlKTsKKyAgICAgIGhvc3RDdHh0LT5sb3dSZXNvdXJjZUNCKGhvc3RDdHh0LT5jbGllbnRDdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVXTEFOX1BBTF9UUlVFKTsKKyAgICAgIGNoYW5uZWxFbnRyeS0+aGl0TG93UmVzb3VyY2UgPSBlV0xBTl9QQUxfRkFMU0U7CisgICB9CisKKyAgIHdwYWxNdXRleFJlbGVhc2UoJmNoYW5uZWxFbnRyeS0+ZHhlQ2hhbm5lbExvY2spOworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZVRYRXZlbnRIYW5kbGVyCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBJZiBEWEUgSFcgc2VuZHMgVFggcmVsYXRlZCBpbnRlcnJ1cHQsIHRoaXMgZXZlbnQgaGFuZGxlciB3aWxsIGJlIGNhbGxlZAorICAgICAgSGFuZGxlIGhpZ2hlciBwcmlvcml0eSBjaGFubmVsIGZpcnN0CisgICAgICBGaWd1cmVvdXQgd2h5IGludGVycnVwdCBoYXBwZW4gYW5kIGNhbGwgYXBwcm9wcmlhdGUgZmluYWwgZXZlbiBoYW5kbGVyCisgICAgICBUWCBjb21wbGV0ZSBvciBlcnJvciBoYXBwZW4KKworICBAICBQYXJhbWV0ZXJzCisgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKm1zZ1B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVuIE1TRworCisgIEAgIFJldHVybgorICAgICAgUEFMX1NUQVRVU19UCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBkeGVUWEV2ZW50SGFuZGxlcgorKAorICAgd3B0X21zZyAgICAgICAgICAgICAgICptc2dQdHIKKykKK3sKKyAgIHdwdF9tc2cgICAgICAgICAgICAgICAgICAqbXNnQ29udGVudCA9ICh3cHRfbXNnICopbXNnUHRyOworICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgICpkeGVDdHh0ICAgID0gTlVMTDsKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICAgc3RhdHVzICAgICA9IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgaW50U3JjICAgICA9IDA7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgIGNoU3RhdCAgICAgPSAwOworICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgICpjaGFubmVsQ2IgID0gTlVMTDsKKworICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICBiRW5hYmxlSVNSID0gMDsgCisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgZHhlQ3R4dCA9IChXTEFORFhFX0N0cmxCbGtUeXBlICopKG1zZ0NvbnRlbnQtPnBDb250ZXh0KTsKKyAgIC8qIFJldHVybiBmcm9tIGhlcmUgaWYgdGhlIFJJVkEgaXMgaW4gSU1QUywgdG8gYXZvaWQgcmVnaXN0ZXIgYWNjZXNzICovCisgICBpZihXTEFORFhFX1BPV0VSX1NUQVRFX0lNUFMgPT0gZHhlQ3R4dC0+aG9zdFBvd2VyU3RhdGUpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICIlcyBSaXZhIGlzIGluICVkLCByZXR1cm4gZnJvbSBoZXJlICIsIF9fRlVOQ1RJT05fXywgZHhlQ3R4dC0+aG9zdFBvd2VyU3RhdGUpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZigoIWR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1RYX0hJR0hfUFJJXS5leHRyYUNvbmZpZy5jaEVuYWJsZWQpIHx8CisgICAgICAoIWR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1RYX0xPV19QUkldLmV4dHJhQ29uZmlnLmNoRW5hYmxlZCkpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJEWEUgYWxyZWFkeSBzdG9wcGVkIGluIFRYIGV2ZW50IGhhbmRsZXIuIEp1c3QgcmV0dXJuIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGR4ZUN0eHQtPnVjVHhNc2dDbnQgPSAwOyAgIAorICAgCisgICAvKiBEaXNhYmxlIGRldmljZSBpbnRlcnJ1cHQgKi8KKyAgIC8qIFJlYWQgd2hvbGUgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgYW5kIGV4Y2x1c2l2ZSBvbmx5IHRoaXMgY2hhbm5lbCBpbnQgKi8KKyAgIHN0YXR1cyA9IHdwYWxSZWFkUmVnaXN0ZXIoV0xBTkRYRV9JTlRfU1JDX1JBV19BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRTcmMpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVRYQ29tcGxldGVFdmVudEhhbmRsZXIgUmVhZCBJTlRfRE9ORV9TUkMgcmVnaXN0ZXIgZmFpbCIpOworICAgICAgcmV0dXJuOyAgICAgICAgIAorICAgfQorICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgICAgICAiVFggRXZlbnQgSGFuZGxlciBJTlQgU291cmNlIDB4JXgiLCBpbnRTcmMpOworCisgICAvKiBUZXN0IEhpZ2ggUHJpb3JpdHkgQ2hhbm5lbCBpcyB0aGUgSU5UIHNvdXJjZSBvciBub3QgKi8KKyAgIGNoYW5uZWxDYiA9ICZkeGVDdHh0LT5keGVDaGFubmVsW1dEVFNfQ0hBTk5FTF9UWF9ISUdIX1BSSV07CisgICBpZihpbnRTcmMgJiAoMSA8PCBjaGFubmVsQ2ItPmFzc2lnbmVkRE1BQ2hhbm5lbCkpCisgICB7CisgICAgICBzdGF0dXMgPSBkeGVDaGFubmVsQ2xlYW5JbnQoY2hhbm5lbENiLCAmY2hTdGF0KTsKKyAgICAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJkeGVUWEV2ZW50SGFuZGxlciBJTlQgQ2xlYW4gdXAgZmFpbCIpOworICAgICAgICAgcmV0dXJuOyAgICAgICAgIAorICAgICAgfQorCisgICAgICBpZihXTEFORFhFX0NIX1NUQVRfSU5UX0VSUl9NQVNLICYgY2hTdGF0KQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICJkeGVUWEV2ZW50SGFuZGxlciBUWCBISSBzdGF0dXM9JXgiLCBjaFN0YXQpOworICAgICAgICAgSERYRV9BU1NFUlQoMCk7CisgICAgICB9CisgICAgICBlbHNlIGlmKFdMQU5EWEVfQ0hfU1RBVF9JTlRfRE9ORV9NQVNLICYgY2hTdGF0KQorICAgICAgeworICAgICAgICAgLyogSGFuZGxlIFRYIGNvbXBsZXRlIGZvciBoaWdoIHByaW9yaXR5IGNoYW5uZWwgKi8KKyAgICAgICAgIHN0YXR1cyA9IGR4ZVRYQ29tcEZyYW1lKGR4ZUN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ2IpOworICAgICAgfQorICAgICAgZWxzZSBpZihXTEFORFhFX0NIX1NUQVRfSU5UX0VEX01BU0sgJiBjaFN0YXQpCisgICAgICB7CisgICAgICAgICAvKiBIYW5kbGUgVFggY29tcGxldGUgZm9yIGhpZ2ggcHJpb3JpdHkgY2hhbm5lbCAqLworICAgICAgICAgc3RhdHVzID0gZHhlVFhDb21wRnJhbWUoZHhlQ3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDYik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgImR4ZVRYRXZlbnRIYW5kbGVyIFRYIEhJIHN0YXR1cz0leCIsIGNoU3RhdCk7CisgICAgICB9CisKKyAgICAgIGlmKFdMQU5EWEVfQ0hfU1RBVF9NQVNLRURfTUFTSyAmIGNoU3RhdCkKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICJkeGVUWEV2ZW50SGFuZGxlciBUWCBISUdIIENoYW5uZWwgTWFza2VkIFVubWFzayBpdCEhISEiKTsKKyAgICAgIH0KKworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIlRYIEhJR0ggU1RBVCAweCV4IFJFU1JWRCAlZCIsIGNoU3RhdCwgY2hhbm5lbENiLT5udW1Sc3ZkRGVzYyk7CisgICB9CisKKyAgIC8qIFRlc3QgTG93IFByaW9yaXR5IENoYW5uZWwgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90ICovCisgICBjaGFubmVsQ2IgPSAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfVFhfTE9XX1BSSV07CisgICBpZihpbnRTcmMgJiAoMSA8PCBjaGFubmVsQ2ItPmFzc2lnbmVkRE1BQ2hhbm5lbCkpCisgICB7CisgICAgICBzdGF0dXMgPSBkeGVDaGFubmVsQ2xlYW5JbnQoY2hhbm5lbENiLCAmY2hTdGF0KTsKKyAgICAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJkeGVUWEV2ZW50SGFuZGxlciBJTlQgQ2xlYW4gdXAgZmFpbCIpOworICAgICAgICAgcmV0dXJuOyAgICAgICAgIAorICAgICAgfQorCisgICAgICBpZihXTEFORFhFX0NIX1NUQVRfSU5UX0VSUl9NQVNLICYgY2hTdGF0KQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICJkeGVUWEV2ZW50SGFuZGxlciBUWCBMTyBzdGF0dXM9JXgiLCBjaFN0YXQpOworICAgICAgICAgSERYRV9BU1NFUlQoMCk7CisgICAgICB9CisgICAgICBlbHNlIGlmKFdMQU5EWEVfQ0hfU1RBVF9JTlRfRE9ORV9NQVNLICYgY2hTdGF0KQorICAgICAgeworICAgICAgICAgLyogSGFuZGxlIFRYIGNvbXBsZXRlIGZvciBsb3cgcHJpb3JpdHkgY2hhbm5lbCAqLworICAgICAgICAgc3RhdHVzID0gZHhlVFhDb21wRnJhbWUoZHhlQ3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDYik7CisgICAgICB9CisgICAgICBlbHNlIGlmKFdMQU5EWEVfQ0hfU1RBVF9JTlRfRURfTUFTSyAmIGNoU3RhdCkKKyAgICAgIHsKKyAgICAgICAgIC8qIEhhbmRsZSBUWCBjb21wbGV0ZSBmb3IgbG93IHByaW9yaXR5IGNoYW5uZWwgKi8KKyAgICAgICAgIHN0YXR1cyA9IGR4ZVRYQ29tcEZyYW1lKGR4ZUN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ2IpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJkeGVUWEV2ZW50SGFuZGxlciBUWCBMTyBzdGF0dXM9JXgiLCBjaFN0YXQpOworICAgICAgfQorCisgICAgICBpZihXTEFORFhFX0NIX1NUQVRfTUFTS0VEX01BU0sgJiBjaFN0YXQpCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAiZHhlVFhFdmVudEhhbmRsZXIgVFggTG93IENoYW5uZWwgTWFza2VkIFVubWFzayBpdCEhISEiKTsKKyAgICAgIH0KKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiVFggTE9XIFNUQVQgMHgleCBSRVNSVkQgJWQiLCBjaFN0YXQsIGNoYW5uZWxDYi0+bnVtUnN2ZERlc2MpOworICAgfQorCisKKyNpZmRlZiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUKKyAgIC8qIFRlc3QgSDJIIFRYIENoYW5uZWwgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90ICovCisgICBjaGFubmVsQ2IgPSAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfSDJIX1RFU1RfVFhdOworICAgaWYoaW50U3JjICYgKDEgPDwgY2hhbm5lbENiLT5hc3NpZ25lZERNQUNoYW5uZWwpKQorICAgeworICAgICAgc3RhdHVzID0gd3BhbFJlYWRSZWdpc3RlcihjaGFubmVsQ2ItPmNoYW5uZWxSZWdpc3Rlci5jaERYRVN0YXR1c1JlZ0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoU3RhdCk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiZHhlQ2hhbm5lbENsZWFuSW50IFJlYWQgQ0ggU1RBVCByZWdpc3RlciBmYWlsIik7CisgICAgICAgICByZXR1cm47ICAgICAgICAgCisgICAgICB9CisKKyAgICAgIGlmKFdMQU5EWEVfQ0hfU1RBVF9JTlRfRVJSX01BU0sgJiBjaFN0YXQpCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICJXTEFORFhFX0NIX1NUQVRfSU5UX0VSUl9NQVNLIG9jY3VycmVkIik7CisgICAgICAgICBIRFhFX0FTU0VSVCgwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoV0xBTkRYRV9DSF9TVEFUX0lOVF9ET05FX01BU0sgJiBjaFN0YXQpCisgICAgICB7CisgICAgICAgICAvKiBIYW5kbGUgVFggY29tcGxldGUgZm9yIGhpZ2ggcHJpb3JpdHkgY2hhbm5lbCAqLworICAgICAgICAgc3RhdHVzID0gZHhlVFhDb21wRnJhbWUoZHhlQ3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDYik7CisgICAgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgICAgeworICAgICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiZHhlVFhFdmVudEhhbmRsZXIgSU5UIENsZWFuIHVwIGZhaWwiKTsKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgY2hhbm5lbCBzdGF0ZSAlZCIsIGNoU3RhdCk7CisgICAgICB9CisgICB9CisjZW5kaWYgLyogV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFICovCisKKyAgIGlmKChiRW5hYmxlSVNSIHx8IChkeGVDdHh0LT50eENvbXBsZXRlZEZyYW1lcykpICYmCisgICAgICAoZVdMQU5fUEFMX0ZBTFNFID09IGR4ZUN0eHQtPnR4SW50RW5hYmxlKSkKKyAgIHsKKyAgICAgIGR4ZUN0eHQtPnR4SW50RW5hYmxlID0gIGVXTEFOX1BBTF9UUlVFOyAKKyAgICAgIHdwYWxFbmFibGVJbnRlcnJ1cHQoRFhFX0lOVEVSUlVQVF9UWF9DT01QTEUpOworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJUWCBDT01QIElOVCBFbmFibGVkLCByZW1haW4gVFggZnJhbWUgY291bnQgb24gcmluZyAlZCIsCisgICAgICAgICAgICAgICBkeGVDdHh0LT50eENvbXBsZXRlZEZyYW1lcyk7CisgICB9CisKKyAgIC8qS2lja2luZyB0aGUgRFhFIGFmdGVyIHRoZSBUWCBDb21wbGV0ZSBpbnRlcnJ1cHQgd2FzIGVuYWJsZWQgLSB0byBhdm9pZCAKKyAgICAgdGhlIHBvc2liaWxpdHkgb2YgYSByYWNlKi8KKyAgIGR4ZVBzQ29tcGxldGUoZHhlQ3R4dCwgZVdMQU5fUEFMX1RSVUUpOworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVUWENvbXBsZXRlUHJvY2Vzc2luZworCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgSWYgRFhFIEhXIHNlbmRzIFRYIHJlbGF0ZWQgaW50ZXJydXB0LCB0aGlzIGV2ZW50IGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQKKyAgICAgIEhhbmRsZSBoaWdoZXIgcHJpb3JpdHkgY2hhbm5lbCBmaXJzdAorICAgICAgRmlndXJlb3V0IHdoeSBpbnRlcnJ1cHQgaGFwcGVuIGFuZCBjYWxsIGFwcHJvcHJpYXRlIGZpbmFsIGV2ZW4gaGFuZGxlcgorICAgICAgVFggY29tcGxldGUgb3IgZXJyb3IgaGFwcGVuCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgZHhlQ3R4dCAgICAgIERYRSBjb250ZXh0IAorCisgIEAgIFJldHVybgorICAgICAgUEFMX1NUQVRVU19UCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBkeGVUWENvbXBsZXRlUHJvY2Vzc2luZworKAorICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAqZHhlQ3R4dAorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICBzdGF0dXMgICAgID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgICpjaGFubmVsQ2IgID0gTlVMTDsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAKKyAgIC8qIFRlc3QgSGlnaCBQcmlvcml0eSBDaGFubmVsIGlzIHRoZSBJTlQgc291cmNlIG9yIG5vdCAqLworICAgY2hhbm5lbENiID0gJmR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1RYX0hJR0hfUFJJXTsKKworICAgLyogSGFuZGxlIFRYIGNvbXBsZXRlIGZvciBoaWdoIHByaW9yaXR5IGNoYW5uZWwgKi8KKyAgIHN0YXR1cyA9IGR4ZVRYQ29tcEZyYW1lKGR4ZUN0eHQsIGNoYW5uZWxDYik7CisKKyAgIC8qIFRlc3QgTG93IFByaW9yaXR5IENoYW5uZWwgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90ICovCisgICBjaGFubmVsQ2IgPSAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfVFhfTE9XX1BSSV07CisKKyAgIC8qIEhhbmRsZSBUWCBjb21wbGV0ZSBmb3IgbG93IHByaW9yaXR5IGNoYW5uZWwgKi8KKyAgIHN0YXR1cyA9IGR4ZVRYQ29tcEZyYW1lKGR4ZUN0eHQsIGNoYW5uZWxDYik7CisgIAorICAgaWYoKGVXTEFOX1BBTF9GQUxTRSA9PSBkeGVDdHh0LT50eEludEVuYWJsZSkgJiYKKyAgICAgICgoZHhlQ3R4dC0+dHhDb21wbGV0ZWRGcmFtZXMgPiAwKSB8fAorICAgICAgIChXTEFORFhFX1BPV0VSX1NUQVRFX0ZVTEwgPT0gZHhlQ3R4dC0+aG9zdFBvd2VyU3RhdGUpKSkKKyAgIHsKKyAgICAgIGR4ZUN0eHQtPnR4SW50RW5hYmxlID0gIGVXTEFOX1BBTF9UUlVFOyAKKyAgICAgIHdwYWxFbmFibGVJbnRlcnJ1cHQoRFhFX0lOVEVSUlVQVF9UWF9DT01QTEUpOworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICIlcyAlcyA6ICVkLCAlcyA6ICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgY2hhbm5lbFR5cGVbZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfVFhfSElHSF9QUkldLmNoYW5uZWxUeXBlXSwKKyAgICAgICAgICAgICAgIGR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1RYX0hJR0hfUFJJXS5udW1Sc3ZkRGVzYywKKyAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlW2R4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1RYX0xPV19QUkldLmNoYW5uZWxUeXBlXSwKKyAgICAgICAgICAgICAgIGR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1RYX0xPV19QUkldLm51bVJzdmREZXNjKTsKKyAgIH0KKyAgIAorICAgLypLaWNraW5nIHRoZSBEWEUgYWZ0ZXIgdGhlIFRYIENvbXBsZXRlIGludGVycnVwdCB3YXMgZW5hYmxlZCAtIHRvIGF2b2lkIAorICAgICB0aGUgcG9zaWJpbGl0eSBvZiBhIHJhY2UqLworICAgZHhlUHNDb21wbGV0ZShkeGVDdHh0LCBlV0xBTl9QQUxfRkFMU0UpOworICAgCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZVRYSVNSCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBUWCBpbnRlcnJ1cHQgSVNSCisgICAgICBQbGF0Zm9ybSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiBJTlQgaXMgaGFwcGVuCisgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCBpbnRvIHBsYXRmb3JtIGludGVycnVwdCBtb2R1bGUKKworICBAICBQYXJhbWV0ZXJzCisgICAgICB2b2lkICAgICpob3N0Q3R4dAorICAgICAgICAgICAgICAgRFhFIGhvc3QgZHJpdmVyIGNvbnRyb2wgY29udGV4dCwKKyAgICAgICAgICAgICAgIHByZSByZWdpc3RlcmQgZHVyaW5nIGludGVycnVwdCByZWdpc3RyYXRpb24KKworICBAICBSZXR1cm4KKyAgICAgIFBBTF9TVEFUVVNfVAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIGR4ZVRYSVNSCisoCisgICB2b2lkICAgICAgICAgICAgICAgICAgICAqaG9zdEN0eHQKKykKK3sKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICAqZHhlQ3R4dCAgICA9IChXTEFORFhFX0N0cmxCbGtUeXBlICopaG9zdEN0eHQ7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgIHN0YXR1cyAgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisjaWZkZWYgRkVBVFVSRV9SMzNECisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgIHJlZ1ZhbHVlOworI2VuZGlmIC8qIEZFQVRVUkVfUjMzRCAqLworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFbnRlciIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qIFJldHVybiBmcm9tIGhlcmUgaWYgdGhlIFJJVkEgaXMgaW4gSU1QUywgdG8gYXZvaWQgcmVnaXN0ZXIgYWNjZXNzICovCisgICBpZigoV0xBTkRYRV9QT1dFUl9TVEFURV9JTVBTID09IGR4ZUN0eHQtPmhvc3RQb3dlclN0YXRlKSB8fAorICAgICAgKFdMQU5EWEVfUE9XRVJfU1RBVEVfRE9XTiA9PSBkeGVDdHh0LT5ob3N0UG93ZXJTdGF0ZSkpCisgICB7CisgICAgICAvKiBEaXNhYmxlIGludGVycnVwdCBhdCBoZXJlLAorICAgICAgICAgSU1QUyBvciBJTVBTIFBlbmRpbmcgc3RhdGUgc2hvdWxkIG5vdCBhY2Nlc3MgUklWQSByZWdpc3RlciAqLworICAgICAgc3RhdHVzID0gd3BhbERpc2FibGVJbnRlcnJ1cHQoRFhFX0lOVEVSUlVQVF9UWF9DT01QTEUpOworICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgImR4ZVJYRnJhbWVSZWFkeUlTUiBEaXNhYmxlIFJYIHJlYWR5IGludGVycnVwdCBmYWlsIik7CisgICAgICAgICByZXR1cm47ICAgICAgICAgCisgICAgICB9CisgICAgICBkeGVDdHh0LT50eEludERpc2FibGVkQnlJTVBTID0gZVdMQU5fUEFMX1RSVUU7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICIlcyBSaXZhIGlzIGluICVkLCByZXR1cm4gZnJvbSBoZXJlICIsIF9fRlVOQ1RJT05fXywgZHhlQ3R4dC0+aG9zdFBvd2VyU3RhdGUpOworICAgICAgcmV0dXJuOworICAgfQorCisjaWZkZWYgRkVBVFVSRV9SMzNECisgICBzdGF0dXMgPSB3cGFsUmVhZFJlZ2lzdGVyKFdMQU5EWEVfSU5UX1NSQ19SQVdfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnVmFsdWUpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVRYQ29tcElTUiBSZWFkIElOVF9TUkNfUkFXIGZhaWwiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIklOVF9TUkNfUkFXIDB4JXgiLCByZWdWYWx1ZSk7CisgICBpZigwID09IHJlZ1ZhbHVlKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJUaGlzIGlzIG5vdCBEWEUgSW50ZXJydXB0LCBSZWplY3QgaXQiKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1IzM0QgKi8KKworICAgLyogRGlzYWJsZSBUWCBDb21wbGV0ZSBJbnRlcnJ1cHQgYXQgaGVyZSAqLworICAgc3RhdHVzID0gd3BhbERpc2FibGVJbnRlcnJ1cHQoRFhFX0lOVEVSUlVQVF9UWF9DT01QTEUpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgImR4ZVRYQ29tcElTUiBEaXNhYmxlIFRYIGNvbXBsZXRlIGludGVycnVwdCBmYWlsIik7CisgICAgICByZXR1cm47ICAgICAgICAgCisgICB9CisgICBkeGVDdHh0LT50eEludEVuYWJsZSA9IGVXTEFOX1BBTF9GQUxTRTsKKworCisgICBpZiggZHhlQ3R4dC0+dWNUeE1zZ0NudCApCisgICB7CisgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIkF2b2lkaW5nIHNlcmlhbGl6aW5nIFRYIENvbXBsZXRlIGV2ZW50Iik7CisgICAgcmV0dXJuOworICAgfQorICAgCisgICBkeGVDdHh0LT51Y1R4TXNnQ250ID0gMTsKKworICAgLyogU2VyaWFsaXplIFRYIGNvbXBsZXRlIGludGVycnVwdCB1cG9uIFRYIHRocmVhZCAqLworICAgSERYRV9BU1NFUlQoTlVMTCAhPSBkeGVDdHh0LT50eElzck1zZyk7CisgICBzdGF0dXMgPSB3cGFsUG9zdFR4TXNnKFdESV9HRVRfUEFMX0NUWCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkeGVDdHh0LT50eElzck1zZyk7CisgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAiZHhlVFhDb21wSVNSIGludGVycnVwdCBzZXJpYWxpemUgZmFpbCBzdGF0dXM9JWQiLCBzdGF0dXMpOworICAgfQorCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgR2xvYmFsIEZ1bmN0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBGdW5jdGlvbiBOYW1lIAorICAgICAgV0xBTkRYRV9PcGVuCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBPcGVuIGhvc3QgRFhFIGRyaXZlciwgYWxsb2NhdGUgRFhFIHJlc291cmNlcworICAgICAgQWxsb2NhdGUsIERYRSBsb2NhbCBjb250cm9sIGJsb2NrLCBEWEUgZGVzY3JpcHRvciBwb29sLCBEWEUgZGVzY3JpcHRvciBjb250cm9sIGJsb2NrIHBvb2wKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBwVm9pZCAgICAgIHBBZGFwdG9yIDogRHJpdmVyIGdsb2JhbCBjb250cm9sIGJsb2NrIHBvaW50ZXIKKworICBAICBSZXR1cm4KKyAgICAgIHBWb2lkIERYRSBsb2NhbCBtb2R1bGUgY29udHJvbCBibG9jayBwb2ludGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCAqV0xBTkRYRV9PcGVuCisoCisgICB2b2lkCispCit7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBpZHg7CisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICpjdXJyZW50Q2hhbm5lbCA9IE5VTEw7CisgICBpbnQgICAgICAgICAgICAgICAgICAgICBzbXNtSW5pdFN0YXRlOworI2lmZGVmIFdMQU5EWEVfVEVTVF9DSEFOTkVMX0VOQUJMRQorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgc0lkeDsKKyAgIFdMQU5EWEVfQ2hhbm5lbENCVHlwZSAgICAgKmNoYW5uZWwgPSBOVUxMOworICAgV0xBTkRYRV9EZXNjQ3RybEJsa1R5cGUgICAqY3JudERlc2NDQiA9IE5VTEw7CisgICBXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAgICpuZXh0RGVzY0NCID0gTlVMTDsKKyNlbmRpZiAvKiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUgKi8KKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisgICAvKiBUaGlzIGlzIHRlbXBvcmFyeSBhbGxvY2F0aW9uICovCisgICB0ZW1wRHhlQ3RybEJsayA9IChXTEFORFhFX0N0cmxCbGtUeXBlICopd3BhbE1lbW9yeUFsbG9jYXRlKHNpemVvZihXTEFORFhFX0N0cmxCbGtUeXBlKSk7CisgICBpZihOVUxMID09IHRlbXBEeGVDdHJsQmxrKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9PcGVuIENvbnRyb2wgQmxvY2sgQWxsb2MgRmFpbCIpOworICAgICAgcmV0dXJuIE5VTEw7ICAKKyAgIH0KKyAgIHdwYWxNZW1vcnlaZXJvKHRlbXBEeGVDdHJsQmxrLCBzaXplb2YoV0xBTkRYRV9DdHJsQmxrVHlwZSkpOworCisgICBzdGF0dXMgPSBkeGVDb21tb25EZWZhdWx0Q29uZmlnKHRlbXBEeGVDdHJsQmxrKTsKKyAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFORFhFX09wZW4gQ29tbW9uIENvbmZpZ3VyYXRpb24gRmFpbCIpOworICAgICAgV0xBTkRYRV9DbG9zZSh0ZW1wRHhlQ3RybEJsayk7CisgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAKKyAgIH0KKworICAgZm9yKGlkeCA9IDA7IGlkeCA8IFdEVFNfQ0hBTk5FTF9NQVg7IGlkeCsrKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJXTEFORFhFX09wZW4gQ2hhbm5lbCAlcyBPcGVuIFN0YXJ0IiwgY2hhbm5lbFR5cGVbaWR4XSk7CisgICAgICBjdXJyZW50Q2hhbm5lbCA9ICZ0ZW1wRHhlQ3RybEJsay0+ZHhlQ2hhbm5lbFtpZHhdOworICAgICAgaWYoaWR4ID09IFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJKQorICAgICAgeworICAgICAgICAgY3VycmVudENoYW5uZWwtPmNoYW5uZWxUeXBlID0gV0RUU19DSEFOTkVMX1RYX0xPV19QUkk7CisgICAgICB9CisgICAgICBlbHNlIGlmKGlkeCA9PSBXRFRTX0NIQU5ORUxfVFhfSElHSF9QUkkpCisgICAgICB7CisgICAgICAgICBjdXJyZW50Q2hhbm5lbC0+Y2hhbm5lbFR5cGUgPSBXRFRTX0NIQU5ORUxfVFhfSElHSF9QUkk7CisgICAgICB9CisgICAgICBlbHNlIGlmKGlkeCA9PSBXRFRTX0NIQU5ORUxfUlhfTE9XX1BSSSkKKyAgICAgIHsKKyAgICAgICAgIGN1cnJlbnRDaGFubmVsLT5jaGFubmVsVHlwZSA9IFdEVFNfQ0hBTk5FTF9SWF9MT1dfUFJJOworICAgICAgfQorICAgICAgZWxzZSBpZihpZHggPT0gV0RUU19DSEFOTkVMX1JYX0hJR0hfUFJJKQorICAgICAgeworICAgICAgICAgY3VycmVudENoYW5uZWwtPmNoYW5uZWxUeXBlID0gV0RUU19DSEFOTkVMX1JYX0hJR0hfUFJJOworICAgICAgfQorI2lmZGVmIFdMQU5EWEVfVEVTVF9DSEFOTkVMX0VOQUJMRQorICAgICAgZWxzZSBpZihpZHggPT0gV0RUU19DSEFOTkVMX0gySF9URVNUX1RYKQorICAgICAgeworICAgICAgICAgY3VycmVudENoYW5uZWwtPmNoYW5uZWxUeXBlID0gV0RUU19DSEFOTkVMX0gySF9URVNUX1RYOworICAgICAgfQorICAgICAgZWxzZSBpZihpZHggPT0gV0RUU19DSEFOTkVMX0gySF9URVNUX1JYKQorICAgICAgeworICAgICAgICAgY3VycmVudENoYW5uZWwtPmNoYW5uZWxUeXBlID0gV0RUU19DSEFOTkVMX0gySF9URVNUX1JYOworICAgICAgfQorI2VuZGlmIC8qIFdMQU5EWEVfVEVTVF9DSEFOTkVMX0VOQUJMRSAqLworCisgICAgICAvKiBDb25maWcgaW5kaXZpZHVhbCBjaGFubmVscyBmcm9tIGNoYW5uZWwgZGVmYXVsdCBzZXR1cCB0YWJsZSAqLworICAgICAgc3RhdHVzID0gZHhlQ2hhbm5lbERlZmF1bHRDb25maWcodGVtcER4ZUN0cmxCbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhbm5lbCk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiV0xBTkRYRV9PcGVuIENoYW5uZWwgQmFzaWMgQ29uZmlndXJhdGlvbiBGYWlsIGZvciBjaGFubmVsICVkIiwgaWR4KTsKKyAgICAgICAgIFdMQU5EWEVfQ2xvc2UodGVtcER4ZUN0cmxCbGspOworICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgCisgICAgICB9CisKKyAgICAgIC8qIEFsbG9jYXRlIERYRSBDb250cm9sIEJsb2NrIHdpbGwgYmUgdXNlZCBieSBob3N0IERYRSBkcml2ZXIgKi8KKyAgICAgIHN0YXR1cyA9IGR4ZUN0cmxCbGtBbGxvYyh0ZW1wRHhlQ3RybEJsaywgY3VycmVudENoYW5uZWwpOworICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIldMQU5EWEVfT3BlbiBBbGxvYyBEWEUgQ29udHJvbCBCbG9jayBGYWlsIGZvciBjaGFubmVsICVkIiwgaWR4KTsKKworICAgICAgICAgV0xBTkRYRV9DbG9zZSh0ZW1wRHhlQ3RybEJsayk7CisgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAKKyAgICAgIH0KKyAgICAgIHN0YXR1cyA9IHdwYWxNdXRleEluaXQoJmN1cnJlbnRDaGFubmVsLT5keGVDaGFubmVsTG9jayk7IAorICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiV0xBTkRYRV9PcGVuIExvY2sgSW5pdCBGYWlsIGZvciBjaGFubmVsICVkIiwgaWR4KTsKKyAgICAgICAgIFdMQU5EWEVfQ2xvc2UodGVtcER4ZUN0cmxCbGspOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiV0xBTkRYRV9PcGVuIENoYW5uZWwgJXMgT3BlbiBTdWNjZXNzIiwgY2hhbm5lbFR5cGVbaWR4XSk7CisgICB9CisKKyAgIC8qIEFsbG9jYXRlIGFuZCBJbml0IFJYIFJFQURZIElTUiBTZXJpYWxpemUgQnVmZmVyICovCisgICB0ZW1wRHhlQ3RybEJsay0+cnhJc3JNc2cgPSAod3B0X21zZyAqKXdwYWxNZW1vcnlBbGxvY2F0ZShzaXplb2Yod3B0X21zZykpOworICAgaWYoTlVMTCA9PSB0ZW1wRHhlQ3RybEJsay0+cnhJc3JNc2cpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFORFhFX09wZW4gQWxsb2MgUlggSVNSIEZhaWwiKTsKKyAgICAgIFdMQU5EWEVfQ2xvc2UodGVtcER4ZUN0cmxCbGspOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisgICB3cGFsTWVtb3J5WmVybyh0ZW1wRHhlQ3RybEJsay0+cnhJc3JNc2csIHNpemVvZih3cHRfbXNnKSk7CisgICB0ZW1wRHhlQ3RybEJsay0+cnhJc3JNc2ctPmNhbGxiYWNrID0gZHhlUlhFdmVudEhhbmRsZXI7CisgICB0ZW1wRHhlQ3RybEJsay0+cnhJc3JNc2ctPnBDb250ZXh0ID0gKHZvaWQgKil0ZW1wRHhlQ3RybEJsazsKKworICAgLyogQWxsb2NhdGUgYW5kIEluaXQgVFggQ09NUCBJU1IgU2VyaWFsaXplIEJ1ZmZlciAqLworICAgdGVtcER4ZUN0cmxCbGstPnR4SXNyTXNnID0gKHdwdF9tc2cgKil3cGFsTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKHdwdF9tc2cpKTsKKyAgIGlmKE5VTEwgPT0gdGVtcER4ZUN0cmxCbGstPnR4SXNyTXNnKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9PcGVuIEFsbG9jIFRYIElTUiBGYWlsIik7CisgICAgICBXTEFORFhFX0Nsb3NlKHRlbXBEeGVDdHJsQmxrKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorICAgd3BhbE1lbW9yeVplcm8odGVtcER4ZUN0cmxCbGstPnR4SXNyTXNnLCBzaXplb2Yod3B0X21zZykpOworICAgdGVtcER4ZUN0cmxCbGstPnR4SXNyTXNnLT5jYWxsYmFjayA9IGR4ZVRYRXZlbnRIYW5kbGVyOworICAgdGVtcER4ZUN0cmxCbGstPnR4SXNyTXNnLT5wQ29udGV4dCA9ICh2b2lkICopdGVtcER4ZUN0cmxCbGs7CisKKyAgIC8qIEFsbG9jYXRlIGFuZCBJbml0IFJYIFBhY2tldCBBdmFpbGFibGUgU2VyaWFsaXplIE1lc3NhZ2UgQnVmZmVyICovCisgICB0ZW1wRHhlQ3RybEJsay0+cnhQa3RBdmFpbE1zZyA9ICh3cHRfbXNnICopd3BhbE1lbW9yeUFsbG9jYXRlKHNpemVvZih3cHRfbXNnKSk7CisgICBpZihOVUxMID09IHRlbXBEeGVDdHJsQmxrLT5yeFBrdEF2YWlsTXNnKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9PcGVuIEFsbG9jIFJYIFBhY2tldCBBdmFpbGFibGUgTWVzc2FnZSBGYWlsIik7CisgICAgICBXTEFORFhFX0Nsb3NlKHRlbXBEeGVDdHJsQmxrKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorICAgd3BhbE1lbW9yeVplcm8odGVtcER4ZUN0cmxCbGstPnJ4UGt0QXZhaWxNc2csIHNpemVvZih3cHRfbXNnKSk7CisgICB0ZW1wRHhlQ3RybEJsay0+cnhQa3RBdmFpbE1zZy0+Y2FsbGJhY2sgPSBkeGVSWFBhY2tldEF2YWlsYWJsZUV2ZW50SGFuZGxlcjsKKyAgIHRlbXBEeGVDdHJsQmxrLT5yeFBrdEF2YWlsTXNnLT5wQ29udGV4dCA9ICh2b2lkICopdGVtcER4ZUN0cmxCbGs7CisgICAKKyAgIHRlbXBEeGVDdHJsQmxrLT5mcmVlUlhQYWNrZXQgPSBOVUxMOworICAgdGVtcER4ZUN0cmxCbGstPmR4ZUNvb2tpZSAgICA9IFdMQU5EWEVfQ1RYVF9DT09LSUU7CisgICB0ZW1wRHhlQ3RybEJsay0+cnhJbnREaXNhYmxlZEJ5SU1QUyA9IGVXTEFOX1BBTF9GQUxTRTsKKyAgIHRlbXBEeGVDdHJsQmxrLT50eEludERpc2FibGVkQnlJTVBTID0gZVdMQU5fUEFMX0ZBTFNFOworCisgICAvKiBJbml0aWFsaXplIFNNU00gc3RhdGUKKyAgICAqIEluaXQgU3RhdGUgaXMKKyAgICAqICAgIENsZWFyIFRYIEVuYWJsZQorICAgICogICAgUklORyBFTVBUWSBTVEFURSAqLworICAgc21zbUluaXRTdGF0ZSA9IHdwYWxOb3RpZnlTbXNtKFdQQUxfU01TTV9XTEFOX1RYX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFMX1NNU01fV0xBTl9UWF9SSU5HU19FTVBUWSk7CisgICBpZigwICE9IHNtc21Jbml0U3RhdGUpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJTTVNNIENoYW5uZWwgaW5pdCBmYWlsICVkIiwgc21zbUluaXRTdGF0ZSk7CisgICAgICBmb3IoaWR4ID0gMDsgaWR4IDwgV0RUU19DSEFOTkVMX01BWDsgaWR4KyspCisgICAgICB7CisgICAgICAgICBkeGVDaGFubmVsQ2xvc2UodGVtcER4ZUN0cmxCbGssICZ0ZW1wRHhlQ3RybEJsay0+ZHhlQ2hhbm5lbFtpZHhdKTsKKyAgICAgIH0KKyAgICAgIHdwYWxNZW1vcnlGcmVlKCh2b2lkICopJnRlbXBEeGVDdHJsQmxrLT5yeElzck1zZyk7CisgICAgICB3cGFsTWVtb3J5RnJlZSgodm9pZCAqKSZ0ZW1wRHhlQ3RybEJsay0+dHhJc3JNc2cpOworICAgICAgd3BhbE1lbW9yeUZyZWUodGVtcER4ZUN0cmxCbGspOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAiV0xBTkRYRV9PcGVuIFN1Y2Nlc3MiKTsKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEV4aXQiLCBfX0ZVTkNUSU9OX18pOworICAgcmV0dXJuICh2b2lkICopdGVtcER4ZUN0cmxCbGs7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIFdMQU5EWEVfQ2xpZW50UmVnaXN0cmF0aW9uCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBNYWtlIGNhbGxiYWNrIGZ1bmN0aW9ucyByZWdpc3RyYXRpb24gaW50byBEWEUgZHJpdmVyIGZyb20gRFhFIGRyaXZlciBjbGllbnQKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBwVm9pZCAgICAgICAgICAgICAgICAgICAgICAgcERYRUNvbnRleHQgOiBEWEUgbW9kdWxlIGNvbnRyb2wgYmxvY2sKKyAgICAgIFdEVFNfUnhGcmFtZVJlYWR5Q2JUeXBlICAgICByeEZyYW1lUmVhZHlDQiA6IFJYIEZyYW1lIHJlYWR5IENCIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAgIFdEVFNfVHhDb21wbGV0ZUNiVHlwZSAgICAgICB0eENvbXBsZXRlQ0IgOiBUWCBjb21wbGV0ZSBDQiBmdW5jdGlvbiBwb2ludGVyCisgICAgICBXRFRTX0xvd1Jlc291cmNlQ2JUeXBlICAgICAgbG93UmVzb3VyY2VDQiA6IExvdyBEWEUgcmVzb3VyY2Ugbm90aWZpY2F0aW9uIENCIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICp1c2VyQ29udGV4dCA6IERYRSBDbGllbm50IGNvbnRyb2wgYmxvY2sKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfc3RhdHVzIFdMQU5EWEVfQ2xpZW50UmVnaXN0cmF0aW9uCisoCisgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqcERYRUNvbnRleHQsCisgICBXTEFORFhFX1J4RnJhbWVSZWFkeUNiVHlwZSAgcnhGcmFtZVJlYWR5Q0IsCisgICBXTEFORFhFX1R4Q29tcGxldGVDYlR5cGUgICAgdHhDb21wbGV0ZUNCLAorICAgV0xBTkRYRV9Mb3dSZXNvdXJjZUNiVHlwZSAgIGxvd1Jlc291cmNlQ0IsCisgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqdXNlckNvbnRleHQKKykKK3sKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICAgIHN0YXR1cyAgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAgICpkeGVDdHh0OworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFbnRlciIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qIFNhbml0eSAqLworICAgaWYoTlVMTCA9PSBwRFhFQ29udGV4dCkKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU5EWEVfQ2xpZW50UmVnaXN0cmF0aW9uIEludmFsaWQgRFhFIENCIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOyAgIAorICAgfQorCisgICBpZihOVUxMID09IHJ4RnJhbWVSZWFkeUNCKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9DbGllbnRSZWdpc3RyYXRpb24gSW52YWxpZCBSWCBSRUFEWSBDQiIpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsgICAKKyAgIH0KKworICAgaWYoTlVMTCA9PSB0eENvbXBsZXRlQ0IpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFORFhFX0NsaWVudFJlZ2lzdHJhdGlvbiBJbnZhbGlkIHR4Q29tcGxldGVDQiIpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsgICAKKyAgIH0KKworICAgaWYoTlVMTCA9PSBsb3dSZXNvdXJjZUNCKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9DbGllbnRSZWdpc3RyYXRpb24gSW52YWxpZCBsb3dSZXNvdXJjZUNCIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOyAgIAorICAgfQorCisgICBpZihOVUxMID09IHVzZXJDb250ZXh0KQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9DbGllbnRSZWdpc3RyYXRpb24gSW52YWxpZCB1c2VyQ29udGV4dCIpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsgICAKKyAgIH0KKworICAgZHhlQ3R4dCA9IChXTEFORFhFX0N0cmxCbGtUeXBlICopcERYRUNvbnRleHQ7CisKKyAgIC8qIEFzc2lnbiAqLworICAgZHhlQ3R4dC0+cnhSZWFkeUNCICAgICA9IHJ4RnJhbWVSZWFkeUNCOworICAgZHhlQ3R4dC0+dHhDb21wQ0IgICAgICA9IHR4Q29tcGxldGVDQjsKKyAgIGR4ZUN0eHQtPmxvd1Jlc291cmNlQ0IgPSBsb3dSZXNvdXJjZUNCOworICAgZHhlQ3R4dC0+Y2xpZW50Q3R4dCAgICA9IHVzZXJDb250ZXh0OworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFeGl0IiwgX19GVU5DVElPTl9fKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIFdMQU5EWEVfU3RhcnQKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIFN0YXJ0IEhvc3QgRFhFIGRyaXZlcgorICAgICAgSW5pdGlhbGl6ZSBEWEUgY2hhbm5lbHMgYW5kIHN0YXJ0IGNoYW5uZWwKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBwVm9pZCAgICAgICAgICAgICAgICAgICAgICAgcERYRUNvbnRleHQgOiBEWEUgbW9kdWxlIGNvbnRyb2wgYmxvY2sKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfc3RhdHVzIFdMQU5EWEVfU3RhcnQKKygKKyAgIHZvaWQgICpwRFhFQ29udGV4dAorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICAgc3RhdHVzICA9IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgIGlkeDsKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICAgKmR4ZUN0eHQgPSBOVUxMOworCisgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICIlcyBFbnRlciIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qIFNhbml0eSAqLworICAgaWYoTlVMTCA9PSBwRFhFQ29udGV4dCkKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU5EWEVfU3RhcnQgSW52YWxpZCBEWEUgQ0IiKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7ICAgCisgICB9CisgICBkeGVDdHh0ID0gKFdMQU5EWEVfQ3RybEJsa1R5cGUgKilwRFhFQ29udGV4dDsKKworICAgLyogV0xBTkRYRV9TdGFydCBjYWxsZWQgbWVhbnMgRFhFIGVuZ2luZSBhbHJlYWR5IGluaXRpYXRlcworICAgICogQW5kIERYRSBIVyBpcyByZXNldCBhbmQgaW5pdCBmaW5pc2hlZAorICAgICogQnV0IGhlcmUgdG8gbWFrZSBzdXJlIEhXIGlzIGluaXRpYWxpemVkLCByZXNldCBhZ2FpbiAqLworICAgc3RhdHVzID0gZHhlRW5naW5lQ29yZVN0YXJ0KGR4ZUN0eHQpOworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU5EWEVfU3RhcnQgRFhFIEhXIGluaXQgRmFpbCIpOworICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAKKyAgIH0KKworICAgLyogSW5kaXZpZHVhbCBDaGFubmVsIFN0YXJ0ICovCisgICBmb3IoaWR4ID0gMDsgaWR4IDwgV0RUU19DSEFOTkVMX01BWDsgaWR4KyspCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgIldMQU5EWEVfU3RhcnQgQ2hhbm5lbCAlcyBTdGFydCIsIGNoYW5uZWxUeXBlW2lkeF0pOworCisgICAgICAvKiBBbGxvY2F0ZSBEWEUgZGVzY3JpcHRvciB3aWxsIGJlIHNoYXJlZCBieSBIb3N0IGRyaXZlciBhbmQgRFhFIGVuZ2luZSAqLworICAgICAgLyogTWFrZSBjb25uZWN0aW9uIGJldHdlZW4gRFhFIGRlc2NyaXB0b3IgYW5kIERYRSBjb250cm9sIGJsb2NrICovCisgICAgICBzdGF0dXMgPSBkeGVEZXNjQWxsb2NBbmRMaW5rKHRlbXBEeGVDdHJsQmxrLCAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtpZHhdKTsKKyAgICAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICB7CisgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJXTEFORFhFX1N0YXJ0IEFsbG9jIERYRSBEZXNjcmlwdG9yIEZhaWwgZm9yIGNoYW5uZWwgJWQiLCBpZHgpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAKKyAgICAgIH0KKworICAgICAgLyogUHJvZ3JhbSBlYWNoIGNoYW5uZWwgcmVnaXN0ZXIgd2l0aCBjb25maWd1cmF0aW9uIGFyZ3VtZW50cyAqLworICAgICAgc3RhdHVzID0gZHhlQ2hhbm5lbEluaXRQcm9ncmFtKGR4ZUN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR4ZUN0eHQtPmR4ZUNoYW5uZWxbaWR4XSk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiV0xBTkRYRV9TdGFydCAlZCBQcm9ncmFtIERNQSBjaGFubmVsIEZhaWwiLCBpZHgpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAKKyAgICAgIH0KKworICAgICAgLyogPz8/IFRyaWdnZXIgdG8gc3RhcnQgRE1BIGNoYW5uZWwKKyAgICAgICAqIFRoaXMgbXVzdCBiZSBzZXBlcmF0ZWQgZnJvbSA/Pz8gKi8KKyAgICAgIHN0YXR1cyA9IGR4ZUNoYW5uZWxTdGFydChkeGVDdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkeGVDdHh0LT5keGVDaGFubmVsW2lkeF0pOworICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIldMQU5EWEVfU3RhcnQgJWQgQ2hhbm5lbCBTdGFydCBGYWlsIiwgaWR4KTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgCisgICAgICB9CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgIldMQU5EWEVfU3RhcnQgQ2hhbm5lbCAlcyBTdGFydCBTdWNjZXNzIiwgY2hhbm5lbFR5cGVbaWR4XSk7CisgICB9CisKKyAgIC8qIFJlZ2lzdGVyIElTUiB0byBPUyAqLworICAgLyogUmVnaXN0ZXIgVFggY29tcGxldGUgaW50ZXJydXB0IGludG8gcGxhdGZvcm0gKi8KKyAgIHN0YXR1cyA9IHdwYWxSZWdpc3RlckludGVycnVwdChEWEVfSU5URVJSVVBUX1RYX0NPTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR4ZVRYSVNSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHhlQ3R4dCk7CisgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9TdGFydCBUWCBjb21wIGludGVycnVwdCByZWdpc3RyYXRpb24gRmFpbCIpOworICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAKKyAgIH0KKworICAgLyogUmVnaXN0ZXIgUlggcmVhZHkgaW50ZXJydXB0IGludG8gcGxhdGZvcm0gKi8KKyAgIHN0YXR1cyA9IHdwYWxSZWdpc3RlckludGVycnVwdChEWEVfSU5URVJSVVBUX1JYX1JFQURZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHhlUlhJU1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeGVDdHh0KTsKKyAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFORFhFX1N0YXJ0IFJYIFJlYWR5IGludGVycnVwdCByZWdpc3RyYXRpb24gRmFpbCIpOworICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAKKyAgIH0KKworICAgLyogRW5hYmxlIHN5c3RlbSBsZXZlbCBJU1IgKi8KKyAgIC8qIEVuYWJsZSBSWCByZWFkeSBJbnRlcnJ1cHQgYXQgaGVyZSAqLworICAgc3RhdHVzID0gd3BhbEVuYWJsZUludGVycnVwdChEWEVfSU5URVJSVVBUX1JYX1JFQURZKTsKKyAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJkeGVUWENvbXBsZXRlRXZlbnRIYW5kbGVyIEVuYWJsZSBUWCBjb21wbGV0ZSBpbnRlcnJ1cHQgZmFpbCIpOworICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAKKyAgIH0KKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBXTEFORFhFX1RYRnJhbWUKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIFRyaWdnZXIgZnJhbWUgdHJhbnNtaXQgZnJvbSBob3N0IHRvIFJJVkEKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBwVm9pZCAgICAgICAgICAgIHBEWEVDb250ZXh0IDogRFhFIENvbnRyb2wgQmxvY2sKKyAgICAgIHdwdF9wYWNrZXQgICAgICAgcFBhY2tldCA6IHRyYW5zbWl0IHBhY2tldCBzdHJ1Y3R1cmUKKyAgICAgIFdEVFNfQ2hhbm5lbFR5cGUgY2hhbm5lbCA6IFRYIGNoYW5uZWwKKworICBAICBSZXR1cm4KKyAgICAgIHdwdF9zdGF0dXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfc3RhdHVzIFdMQU5EWEVfVHhGcmFtZQorKAorICAgdm9pZCAgICAgICAgICAgICAgICAqcERYRUNvbnRleHQsCisgICB3cHRfcGFja2V0ICAgICAgICAgICpwUGFja2V0LAorICAgV0RUU19DaGFubmVsVHlwZSAgICAgY2hhbm5lbAorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICAgc3RhdHVzICAgICAgICAgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAgICpjdXJyZW50Q2hhbm5lbCA9IE5VTEw7CisgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAgICpkeGVDdHh0ICAgICAgICA9IE5VTEw7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICpsb3dUaHJlc2hvbGQgICA9IE5VTEw7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogU2FuaXR5ICovCisgICBpZihOVUxMID09IHBEWEVDb250ZXh0KQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9TdGFydCBJbnZhbGlkIERYRSBDQiIpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsgICAKKyAgIH0KKworICAgaWYoTlVMTCA9PSBwUGFja2V0KQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9TdGFydCBJbnZhbGlkIHBQYWNrZXQiKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7ICAgCisgICB9CisKKyAgIGlmKChXRFRTX0NIQU5ORUxfTUFYIDwgY2hhbm5lbCkgfHwgKFdEVFNfQ0hBTk5FTF9NQVggPT0gY2hhbm5lbCkpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFORFhFX1N0YXJ0IEludmFsaWQgY2hhbm5lbCIpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsgICAKKyAgIH0KKworICAgZHhlQ3R4dCA9IChXTEFORFhFX0N0cmxCbGtUeXBlICopcERYRUNvbnRleHQ7CisKKyAgIGN1cnJlbnRDaGFubmVsID0gJmR4ZUN0eHQtPmR4ZUNoYW5uZWxbY2hhbm5lbF07CisgICAKKworICAgd3BhbE11dGV4QWNxdWlyZSgmY3VycmVudENoYW5uZWwtPmR4ZUNoYW5uZWxMb2NrKTsKKworICAgbG93VGhyZXNob2xkID0gY3VycmVudENoYW5uZWwtPmNoYW5uZWxUeXBlID09IFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJPworICAgICAgJihkeGVDdHh0LT50eENvbXBJbnQudHhMb3dSZXNvdXJjZVRocmVzaG9sZF9Mb1ByaUNoKToKKyAgICAgICYoZHhlQ3R4dC0+dHhDb21wSW50LnR4TG93UmVzb3VyY2VUaHJlc2hvbGRfSGlQcmlDaCk7CisKKyAgIC8qIERlY2lkZSBoYXZlIHRvIGFjdGl2YXRlIFRYIGNvbXBsZXRlIGV2ZW50IG9yIG5vdCAqLworICAgc3dpdGNoKGR4ZUN0eHQtPnR4Q29tcEludC50eEludEVuYWJsZSkKKyAgIHsKKyAgICAgIC8qIFRYIGNvbXBsZXRlIGludGVycnVwdCB3aWxsIGJlIGFjdGl2YXRlZCB3aGVuIGxvdyBEWEUgcmVzb3VyY2UgKi8KKyAgICAgIGNhc2UgV0xBTkRYRV9UWF9DT01QX0lOVF9MUl9USFJFU0hPTEQ6CisgICAgICAgICBpZigoY3VycmVudENoYW5uZWwtPm51bUZyZWVEZXNjIDw9ICpsb3dUaHJlc2hvbGQpICYmCisgICAgICAgICAgICAoZVdMQU5fUEFMX0ZBTFNFID09IGR4ZUN0eHQtPnR4SW50RW5hYmxlKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGR4ZUN0eHQtPnR4SW50RW5hYmxlID0gZVdMQU5fUEFMX1RSVUU7CisgICAgICAgICAgICBkeGVDdHh0LT5sb3dSZXNvdXJjZUNCKGR4ZUN0eHQtPmNsaWVudEN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVXTEFOX1BBTF9GQUxTRSk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKworICAgICAgLyogVFggY29tcGxldGUgaW50ZXJydXB0IHdpbGwgYmUgYWN0aXZhdGVkIG4gbnVtYmVyIG9mIGZyYW1lcyB0cmFuc2ZlcmVkICovCisgICAgICBjYXNlIFdMQU5EWEVfVFhfQ09NUF9JTlRfUEVSX0tfRlJBTUVTOgorICAgICAgICAgaWYoY2hhbm5lbCA9PSBXRFRTX0NIQU5ORUxfVFhfTE9XX1BSSSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRDaGFubmVsLT5udW1GcmFtZUJlZm9yZUludCsrOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFRYIGNvbXBsZXRlIGludGVycnVwdCB3aWxsIGJlIGFjdGl2YXRlZCBwZXJpb2RpY2FsbHkgKi8KKyAgICAgIGNhc2UgV0xBTkRYRV9UWF9DT01QX0lOVF9USU1FUjoKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICBkeGVDdHh0LT50eENvbXBsZXRlZEZyYW1lcysrOworCisgICAvKiBVcGRhdGUgRFhFIGRlc2NyaXB0b3IsIHRoaXMgaXMgZnJhbWUgYmFzZWQKKyAgICAqIGlmIGEgZnJhbWUgY29uc2lzdCBvZiBOIGZyYWdtZW50cywgTiBEZXNjcmlwdG9yIHdpbGwgYmUgcHJvZ3JhbWVkICovCisgICBzdGF0dXMgPSBkeGVUWFB1c2hGcmFtZShjdXJyZW50Q2hhbm5lbCwgcFBhY2tldCk7CisgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9UeEZyYW1lIFRYIFB1c2ggRnJhbWUgZmFpbCIpOworICAgICAgd3BhbE11dGV4UmVsZWFzZSgmY3VycmVudENoYW5uZWwtPmR4ZUNoYW5uZWxMb2NrKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisKKyAgIC8qIElmIHNwZWNpZmljIGNoYW5uZWwgaGl0IGxvdyByZXNvdXJjZSBjb25kaXRpb24sIHNlbmQgbm90aWZpY2F0aW9uIHRvIHVwcGVyIGxheWVyICovCisgICBpZihjdXJyZW50Q2hhbm5lbC0+bnVtRnJlZURlc2MgPD0gKmxvd1RocmVzaG9sZCkKKyAgIHsKKyAgICAgIGR4ZUN0eHQtPmxvd1Jlc291cmNlQ0IoZHhlQ3R4dC0+Y2xpZW50Q3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVdMQU5fUEFMX0ZBTFNFKTsKKyAgICAgIGN1cnJlbnRDaGFubmVsLT5oaXRMb3dSZXNvdXJjZSA9IGVXTEFOX1BBTF9UUlVFOworICAgfQorICAgd3BhbE11dGV4UmVsZWFzZSgmY3VycmVudENoYW5uZWwtPmR4ZUNoYW5uZWxMb2NrKTsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBXTEFORFhFX0NvbXBsZXRlVFgKKworICBAICBEZXNjcmlwdGlvbiAKKyAgICAgIEluZm9ybXMgRFhFIHRoYXQgdGhlIGN1cnJlbnQgc2VyaWVzIG9mIFR4IHBhY2tldHMgaXMgY29tcGxldGUKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBwQ29udGV4dCAgICAgICAgICAgIHBEWEVDb250ZXh0IDogRFhFIENvbnRyb2wgQmxvY2sKKyAgICAgIHVjVHhSZXNSZXEgICAgICAgICAgVFggcmVzb3VyY2UgbnVtYmVyIHJlcXVpcmVkIGJ5IFRML1dESQorCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3dwdF9zdGF0dXMKK1dMQU5EWEVfQ29tcGxldGVUWAorKAorICB2b2lkKiBwQ29udGV4dCwKKyAgd3B0X3VpbnQzMiB1Y1R4UmVzUmVxCispCit7CisgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICAgc3RhdHVzICA9IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgICpkeGVDdHh0ID0gKFdMQU5EWEVfQ3RybEJsa1R5cGUgKikocENvbnRleHQpOworICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAgKmNoYW5uZWxDYiAgPSBOVUxMOworICB3cHRfYm9vbGVhbiAgICAgICAgICAgICAgIGluTG93UmVzOworCisgIC8qIFNhbml0eSBDaGVjayAqLworICBpZiggTlVMTCA9PSBwQ29udGV4dCApCisgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU5EWEVfQ29tcGxldGVUWCBpbnZhbGlkIHBhcmFtIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgY2hhbm5lbENiID0gJmR4ZUN0eHQtPmR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX1RYX0xPV19QUkldOworICBpbkxvd1JlcyAgPSBjaGFubmVsQ2ItPmhpdExvd1Jlc291cmNlOworCisgIGlmKFdMQU5EWEVfVFhfTE9XX1JFU19USFJFU0hPTEQgPCB1Y1R4UmVzUmVxKQorICB7CisgICAgLyogUmFpc2UgdGhyZXNob2xkIHRlbXBvcmFyaWx5IGlmIG5lY2Vzc2FyeSAqLworICAgIGR4ZUN0eHQtPnR4Q29tcEludC50eExvd1Jlc291cmNlVGhyZXNob2xkX0xvUHJpQ2ggPSB1Y1R4UmVzUmVxOworCisgICAgaWYoZVdMQU5fUEFMX0ZBTFNFID09IGluTG93UmVzKQorICAgIHsKKyAgICAgIC8qIFB1dCB0aGUgY2hhbm5lbCB0byBsb3cgcmVzb3VyY2UgY29uZGl0aW9uICovCisgICAgICBkeGVDdHh0LT5sb3dSZXNvdXJjZUNCKGR4ZUN0eHQtPmNsaWVudEN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlV0xBTl9QQUxfRkFMU0UpOworICAgICAgaW5Mb3dSZXMgPSBjaGFubmVsQ2ItPmhpdExvd1Jlc291cmNlID0gZVdMQU5fUEFMX1RSVUU7CisgICAgfQorICB9CisKKyAgLypUcnkgdG8gcmVjbGFpbSByZXNvdXJjZXMqLworICBkeGVUWENvbXBsZXRlUHJvY2Vzc2luZyhkeGVDdHh0KTsKKworICAvKiBJbiBwcmV2aW91cyBXTEFOVExfR2V0RnJhbWVzIGNhbGwsIFRMIGRpZG4ndCBmZXRjaCBhIHBhY2tldCAKKyAgICAgYmVjYXVzZSBpdHMgZnJhZ21lbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiBEWEUgZnJlZSByZXNvdXJjZS4gKi8KKyAgaWYoMCA8IHVjVHhSZXNSZXEpCisgIHsKKyAgICAvKiBEWEUgc3VjY2Vzc2Z1bGx5IGNsYWltZWQgZW5vdWdoIGZyZWUgRFhFIHJlc291Y2VzIGZvciBuZXh0IGZldGNoLiAqLworICAgIGlmKFdMQU5EWEVfR2V0RnJlZVR4RGF0YVJlc051bWJlcihkeGVDdHh0KSA+PSB1Y1R4UmVzUmVxKQorICAgIHsKKyAgICAgIC8qIERYRSBoYXMgbm90IGJlZW4gaW4gbG93IHJlc291cmNlIGNvbmRpdGlvbi4gRFhFIGZvcmNlcyB0byBraWNrIG9mZgorICAgICAgICAgVFggdHJhbm1pdCAqLworICAgICAgaWYoKGVXTEFOX1BBTF9GQUxTRSA9PSBpbkxvd1JlcykgJiYgCisgICAgICAgICAoZVdMQU5fUEFMX0ZBTFNFID09IGNoYW5uZWxDYi0+aGl0TG93UmVzb3VyY2UpKQorICAgICAgeworICAgICAgICBkeGVDdHh0LT5sb3dSZXNvdXJjZUNCKGR4ZUN0eHQtPmNsaWVudEN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RUU19DSEFOTkVMX1RYX0xPV19QUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVdMQU5fUEFMX0ZBTFNFKTsKKyAgICAgICAgZHhlQ3R4dC0+bG93UmVzb3VyY2VDQihkeGVDdHh0LT5jbGllbnRDdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVXTEFOX1BBTF9UUlVFKTsKKyAgICAgICAgY2hhbm5lbENiLT5oaXRMb3dSZXNvdXJjZSA9IGVXTEFOX1BBTF9GQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERYRSBkb2Vzbid0IGhhdmUgZW5vdWdoIGZyZWUgRFhFIHJlc291cmNlcy4gUHV0IHRoZSBjaGFubmVsCisgICAgICAgICB0byBsb3cgcmVzb3VyY2UgY29uZGl0aW9uLiAqLworICAgICAgaWYoZVdMQU5fUEFMX0ZBTFNFID09IGNoYW5uZWxDYi0+aGl0TG93UmVzb3VyY2UpCisgICAgICB7CisgICAgICAgIC8qIFB1dCB0aGUgY2hhbm5lbCB0byBsb3cgcmVzb3VyY2UgY29uZGl0aW9uICovCisgICAgICAgIGR4ZUN0eHQtPmxvd1Jlc291cmNlQ0IoZHhlQ3R4dC0+Y2xpZW50Q3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RUU19DSEFOTkVMX1RYX0xPV19QUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVXTEFOX1BBTF9GQUxTRSk7CisgICAgICAgIGNoYW5uZWxDYi0+aGl0TG93UmVzb3VyY2UgPSBlV0xBTl9QQUxfVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAKKyAgcmV0dXJuIHN0YXR1czsgCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIFdMQU5EWEVfU3RvcAorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgU3RvcCBEWEUgY2hhbm5lbHMgYW5kIERYRSBlbmdpbmUgb3BlcmF0aW9ucworICAgICAgRGlzYWJsZSBhbGwgY2hhbm5lbCBpbnRlcnJ1cHQKKyAgICAgIFN0b3AgYWxsIGNoYW5uZWwgb3BlcmF0aW9uCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgcFZvaWQgICAgICAgICAgICBwRFhFQ29udGV4dCA6IERYRSBDb250cm9sIEJsb2NrCisKKyAgQCAgUmV0dXJuCisgICAgICB3cHRfc3RhdHVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLword3B0X3N0YXR1cyBXTEFORFhFX1N0b3AKKygKKyAgIHZvaWQgKnBEWEVDb250ZXh0CispCit7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICBpZHg7CisgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAgICpkeGVDdHh0ID0gTlVMTDsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisgICAvKiBTYW5pdHkgKi8KKyAgIGlmKE5VTEwgPT0gcERYRUNvbnRleHQpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFORFhFX1N0b3AgSW52YWxpZCBEWEUgQ0IiKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7ICAgCisgICB9CisKKyAgIGR4ZUN0eHQgPSAoV0xBTkRYRV9DdHJsQmxrVHlwZSAqKXBEWEVDb250ZXh0OworICAgZm9yKGlkeCA9IDA7IGlkeCA8IFdEVFNfQ0hBTk5FTF9NQVg7IGlkeCsrKQorICAgeworICAgICAgc3RhdHVzID0gZHhlQ2hhbm5lbFN0b3AoZHhlQ3R4dCwgJmR4ZUN0eHQtPmR4ZUNoYW5uZWxbaWR4XSk7CisgICAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiV0xBTkRYRV9TdG9wIENoYW5uZWwgJWQgU3RvcCBGYWlsIiwgaWR4KTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisgICB9CisKKyAgIC8qIER1cmluZyBTdG9wIHVucmVnaXN0ZXIgaW50ZXJydXB0ICovCisgICB3cGFsVW5SZWdpc3RlckludGVycnVwdChEWEVfSU5URVJSVVBUX1RYX0NPTVBMRSk7CisgICB3cGFsVW5SZWdpc3RlckludGVycnVwdChEWEVfSU5URVJSVVBUX1JYX1JFQURZKTsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBXTEFORFhFX0Nsb3NlCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBDbG9zZSBEWEUgY2hhbm5lbHMKKyAgICAgIEZyZWUgRFhFIHJlbGF0ZWQgcmVzb3VyY2VzCisgICAgICBEWEUgZGVzY3JpcHRvciBmcmVlCisgICAgICBEZXNjcmlwdG9yIGNvbnRyb2wgYmxvY2sgZnJlZQorICAgICAgUHJlIGFsbG9jYXRlZCBSWCBidWZmZXIgZnJlZQorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIHBWb2lkICAgICAgICAgICAgcERYRUNvbnRleHQgOiBEWEUgQ29udHJvbCBCbG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3dwdF9zdGF0dXMgV0xBTkRYRV9DbG9zZQorKAorICAgdm9pZCAqcERYRUNvbnRleHQKKykKK3sKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICBpZHg7CisgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAgICpkeGVDdHh0ID0gTlVMTDsKKyNpZmRlZiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgIHNJZHg7CisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAgICpjaGFubmVsID0gTlVMTDsKKyAgIFdMQU5EWEVfRGVzY0N0cmxCbGtUeXBlICAgKmNybnREZXNjQ0IgPSBOVUxMOworICAgV0xBTkRYRV9EZXNjQ3RybEJsa1R5cGUgICAqbmV4dERlc2NDQiA9IE5VTEw7CisjZW5kaWYgLyogV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFICovCisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogU2FuaXR5ICovCisgICBpZihOVUxMID09IHBEWEVDb250ZXh0KQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTkRYRV9TdG9wIEludmFsaWQgRFhFIENCIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOyAgIAorICAgfQorCisgICBkeGVDdHh0ID0gKFdMQU5EWEVfQ3RybEJsa1R5cGUgKilwRFhFQ29udGV4dDsKKyAgIGZvcihpZHggPSAwOyBpZHggPCBXRFRTX0NIQU5ORUxfTUFYOyBpZHgrKykKKyAgIHsKKyAgICAgIHdwYWxNdXRleERlbGV0ZSgmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtpZHhdLmR4ZUNoYW5uZWxMb2NrKTsKKyAgICAgIGR4ZUNoYW5uZWxDbG9zZShkeGVDdHh0LCAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtpZHhdKTsKKyNpZmRlZiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUKKyAgICAgIGNoYW5uZWwgICAgPSAmZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtpZHhdOworICAgICAgY3JudERlc2NDQiA9IGNoYW5uZWwtPmhlYWRDdHJsQmxrOworICAgICAgZm9yKHNJZHggPSAwOyBzSWR4IDwgY2hhbm5lbC0+bnVtRGVzYzsgc0lkeCsrKQorICAgICAgeworICAgICAgICAgbmV4dERlc2NDQiA9IChXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAqKWNybnREZXNjQ0ItPm5leHRDdHJsQmxrOworICAgICAgICAgd3BhbE1lbW9yeUZyZWUoKHZvaWQgKiljcm50RGVzY0NCKTsKKyAgICAgICAgIGNybnREZXNjQ0IgPSBuZXh0RGVzY0NCOworICAgICAgICAgaWYoTlVMTCA9PSBjcm50RGVzY0NCKQorICAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisjZW5kaWYgLyogV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFICovCisgICB9CisKKyAgIGlmKE5VTEwgIT0gZHhlQ3R4dC0+cnhJc3JNc2cpCisgICB7CisgICAgICB3cGFsTWVtb3J5RnJlZShkeGVDdHh0LT5yeElzck1zZyk7CisgICB9CisgICBpZihOVUxMICE9IGR4ZUN0eHQtPnR4SXNyTXNnKQorICAgeworICAgICAgd3BhbE1lbW9yeUZyZWUoZHhlQ3R4dC0+dHhJc3JNc2cpOworICAgfQorICAgaWYoTlVMTCAhPSBkeGVDdHh0LT5yeFBrdEF2YWlsTXNnKQorICAgeworICAgICAgd3BhbE1lbW9yeUZyZWUoZHhlQ3R4dC0+cnhQa3RBdmFpbE1zZyk7CisgICB9CisKKyAgIHdwYWxNZW1vcnlGcmVlKHBEWEVDb250ZXh0KTsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBXTEFORFhFX1RyaWdnZXJUWAorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgVEJECisKKyAgQCAgUGFyYW1ldGVycworICAgICAgcFZvaWQgICAgICAgICAgICBwRFhFQ29udGV4dCA6IERYRSBDb250cm9sIEJsb2NrCisKKyAgQCAgUmV0dXJuCisgICAgICB3cHRfc3RhdHVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLword3B0X3N0YXR1cyBXTEFORFhFX1RyaWdnZXJUWAorKAorICAgdm9pZCAqcERYRUNvbnRleHQKKykKK3sKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogVEJEICovCisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEV4aXQiLCBfX0ZVTkNUSU9OX18pOworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBGdW5jdGlvbiBOYW1lIAorICAgICAgZHhlVHhUaHJlYWRTZXRQb3dlclN0YXRlRXZlbnRIYW5kbGVyCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBJZiBXREkgc2VuZHMgc2V0IHBvd2VyIHN0YXRlIHJlcSwgdGhpcyBldmVudCBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGluIFR4CisgICAgICB0aHJlYWQgY29udGV4dAorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqbXNnUHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50IE1TRworCisgIEAgIFJldHVybgorICAgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgZHhlVHhUaHJlYWRTZXRQb3dlclN0YXRlRXZlbnRIYW5kbGVyCisoCisgICAgd3B0X21zZyAgICAgICAgICAgICAgICptc2dQdHIKKykKK3sKKyAgIHdwdF9tc2cgICAgICAgICAgICAgICAgICAqbXNnQ29udGVudCA9ICh3cHRfbXNnICopbXNnUHRyOworICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgICpkeGVDdHh0OworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIFdMQU5EWEVfUG93ZXJTdGF0ZVR5cGUgICAgcmVxUG93ZXJTdGF0ZTsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisKKyAgIGR4ZUN0eHQgPSAoV0xBTkRYRV9DdHJsQmxrVHlwZSAqKShtc2dDb250ZW50LT5wQ29udGV4dCk7CisgICByZXFQb3dlclN0YXRlID0gKFdMQU5EWEVfUG93ZXJTdGF0ZVR5cGUpbXNnQ29udGVudC0+dmFsOworICAgZHhlQ3R4dC0+c2V0UG93ZXJTdGF0ZUNiID0gKFdMQU5EWEVfU2V0UG93ZXJTdGF0ZUNiVHlwZSltc2dDb250ZW50LT5wdHI7CisKKyAgIHN3aXRjaChyZXFQb3dlclN0YXRlKQorICAgeworICAgICAgY2FzZSBXTEFORFhFX1BPV0VSX1NUQVRFX0JNUFM6CisgICAgICAgICBpZihXTEFORFhFX1JJVkFfUE9XRVJfU1RBVEVfQUNUSVZFID09IGR4ZUN0eHQtPnJpdmFQb3dlclN0YXRlKQorICAgICAgICAgeworICAgICAgICAgICAgLy9kb24ndCBibG9jayBNQyB3YWl0aW5nIGZvciBudW1fcnN2ZCB0byBiZWNvbWUgMCBzaW5jZSBpdCBtYXkgdGFrZSBhIHdoaWxlCisgICAgICAgICAgICAvL2Jhc2VkIG9uIGFtb3VudCBvZiBUWCBhbmQgUlggYWN0aXZpdHkgLSBkdXJpbmcgdGhpcyB0aW1lIGFueSByZWNlaXZlZCAKKyAgICAgICAgICAgIC8vIG1hbmFnZW1lbnQgZnJhbWVzIHdpbGwgcmVtYWluIHVuLXByb2Nlc3NlZCBjb25zdW1pbmcgUlggYnVmZmVycworICAgICAgICAgICAgZHhlQ3R4dC0+cml2YVBvd2VyU3RhdGUgPSBXTEFORFhFX1JJVkFfUE9XRVJfU1RBVEVfQk1QU19VTktOT1dOOworICAgICAgICAgICAgZHhlQ3R4dC0+aG9zdFBvd2VyU3RhdGUgPSByZXFQb3dlclN0YXRlOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdMQU5EWEVfUE9XRVJfU1RBVEVfSU1QUzoKKyAgICAgICAgIGlmKFdMQU5EWEVfUklWQV9QT1dFUl9TVEFURV9BQ1RJVkUgPT0gZHhlQ3R4dC0+cml2YVBvd2VyU3RhdGUpCisgICAgICAgICB7CisgICAgICAgICAgICBkeGVDdHh0LT5yaXZhUG93ZXJTdGF0ZSA9IFdMQU5EWEVfUklWQV9QT1dFUl9TVEFURV9JTVBTX1VOS05PV047CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0xBTkRYRV9QT1dFUl9TVEFURV9GVUxMOgorICAgICAgICAgaWYoV0xBTkRYRV9SSVZBX1BPV0VSX1NUQVRFX0JNUFNfVU5LTk9XTiA9PSBkeGVDdHh0LT5yaXZhUG93ZXJTdGF0ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGR4ZUN0eHQtPnJpdmFQb3dlclN0YXRlID0gV0xBTkRYRV9SSVZBX1BPV0VSX1NUQVRFX0FDVElWRTsKKyAgICAgICAgIH0KKyAgICAgICAgIGR4ZUN0eHQtPmhvc3RQb3dlclN0YXRlID0gcmVxUG93ZXJTdGF0ZTsKKyAgICAgICAgIGR4ZU5vdGlmeVNtc20oZVdMQU5fUEFMX0ZBTFNFLCBlV0xBTl9QQUxfVFJVRSk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0xBTkRYRV9QT1dFUl9TVEFURV9ET1dOOgorICAgICAgICAgV0xBTkRYRV9TdG9wKCh2b2lkICopZHhlQ3R4dCk7ICAgICAgICAgCisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAvL2Fzc2VydAorICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIGlmKFdMQU5EWEVfUE9XRVJfU1RBVEVfQk1QU19QRU5ESU5HICE9IGR4ZUN0eHQtPmhvc3RQb3dlclN0YXRlKQorICAgeworICAgICAgZHhlQ3R4dC0+c2V0UG93ZXJTdGF0ZUNiKHN0YXR1cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHhlQ3R4dC0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfVFhfTE9XX1BSSV0uZGVzY0JvdHRvbUxvY1BoeUFkZHIpOworICAgfQorICAgLyogRnJlZSBNU0cgYnVmZmVyICovCisgICB3cGFsTWVtb3J5RnJlZShtc2dQdHIpOworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisgICByZXR1cm47Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAICBGdW5jdGlvbiBOYW1lIAorICAgICAgZHhlUnhUaHJlYWRTZXRQb3dlclN0YXRlRXZlbnRIYW5kbGVyCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBJZiBXREkgc2VuZHMgc2V0IHBvd2VyIHN0YXRlIHJlcSwgdGhpcyBldmVudCBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGluIFJ4CisgICAgICB0aHJlYWQgY29udGV4dAorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqbXNnUHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50IE1TRworCisgIEAgIFJldHVybgorICAgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgZHhlUnhUaHJlYWRTZXRQb3dlclN0YXRlRXZlbnRIYW5kbGVyCisoCisgICAgd3B0X21zZyAgICAgICAgICAgICAgICptc2dQdHIKKykKK3sKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgLyogTm93IHNlcmlhbGlzZSB0aGUgbWVzc2FnZSB0aHJvdWdoIFR4IHRocmVhZCBhbHNvIHRvIG1ha2Ugc3VyZQorICAgICogbm8gcmVnaXN0ZXIgYWNjZXNzIHdoZW4gUklWQSBpcyBpbiBwb3dlcnNhdmUgKi8KKyAgIC8qVXNlIHRoZSBzYW1lIG1lc3NhZ2UgcG9pbnRlciBqdXN0IGNoYW5nZSB0aGUgY2FsbCBiYWNrIGZ1bmN0aW9uICovCisgICBtc2dQdHItPmNhbGxiYWNrID0gZHhlVHhUaHJlYWRTZXRQb3dlclN0YXRlRXZlbnRIYW5kbGVyOworICAgc3RhdHVzID0gd3BhbFBvc3RUeE1zZyhXRElfR0VUX1BBTF9DVFgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbXNnUHRyKTsKKyAgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cyApCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJUeCB0aHJlYWQgU2V0IHBvd2VyIHN0YXRlIHJlcSBzZXJpYWxpemUgZmFpbCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgc3RhdHVzLCAwLCAwKTsKKyAgIH0KKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIFdMQU5EWEVfU2V0UG93ZXJTdGF0ZQorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgRnJvbSBDbGllbnQgbGV0IERYRSBrbm93cyB3aGF0IGlzIHRoZSBXTEFOIEhXKFJJVkEpIHBvd2VyIHN0YXRlCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgcFZvaWQgICAgICAgICAgICAgICAgICAgIHBEWEVDb250ZXh0IDogRFhFIENvbnRyb2wgQmxvY2sKKyAgICAgIFdMQU5EWEVfUG93ZXJTdGF0ZVR5cGUgICBwb3dlclN0YXRlCisKKyAgQCAgUmV0dXJuCisgICAgICB3cHRfc3RhdHVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLword3B0X3N0YXR1cyBXTEFORFhFX1NldFBvd2VyU3RhdGUKKygKKyAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwRFhFQ29udGV4dCwKKyAgIFdEVFNfUG93ZXJTdGF0ZVR5cGUgICAgICBwb3dlclN0YXRlLAorICAgV0RUU19TZXRQU0NiVHlwZSAgICAgICAgIGNCYWNrCispCit7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKnBEeGVDdHJsQmxrOworICAgV0xBTkRYRV9Qb3dlclN0YXRlVHlwZSAgIGhvc3RQb3dlclN0YXRlOworICAgd3B0X21zZyAgICAgICAgICAgICAgICAgICpyeENvbXBNc2c7CisKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKyAgIGlmKE5VTEwgPT0gcERYRUNvbnRleHQpCisgICB7CisgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJOVUxMIHBEWEVDb250ZXh0IHBhc3NlZCBieSBjYWxsZXIiLCAwLCAwLCAwKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIHBEeGVDdHJsQmxrID0gKFdMQU5EWEVfQ3RybEJsa1R5cGUgKilwRFhFQ29udGV4dDsKKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICJTZXQgRFhFIFBvd2VyIHN0YXRlICVkIiwgcG93ZXJTdGF0ZSk7CisgICBzd2l0Y2gocG93ZXJTdGF0ZSkKKyAgIHsKKyAgICAgIGNhc2UgV0RUU19QT1dFUl9TVEFURV9GVUxMOgorICAgICAgICAgaG9zdFBvd2VyU3RhdGUgPSBXTEFORFhFX1BPV0VSX1NUQVRFX0ZVTEw7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0RUU19QT1dFUl9TVEFURV9CTVBTOgorICAgICAgICAgcER4ZUN0cmxCbGstPmhvc3RQb3dlclN0YXRlID0gV0xBTkRYRV9QT1dFUl9TVEFURV9CTVBTOworICAgICAgICAgaG9zdFBvd2VyU3RhdGUgPSBXTEFORFhFX1BPV0VSX1NUQVRFX0JNUFM7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0RUU19QT1dFUl9TVEFURV9JTVBTOgorICAgICAgICAgcER4ZUN0cmxCbGstPmhvc3RQb3dlclN0YXRlID0gV0xBTkRYRV9QT1dFUl9TVEFURV9JTVBTOworICAgICAgICAgaG9zdFBvd2VyU3RhdGUgPSBXTEFORFhFX1BPV0VSX1NUQVRFX0lNUFM7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0RUU19QT1dFUl9TVEFURV9ET1dOOgorICAgICAgICAgcER4ZUN0cmxCbGstPmhvc3RQb3dlclN0YXRlID0gV0xBTkRYRV9QT1dFUl9TVEFURV9ET1dOOworICAgICAgICAgaG9zdFBvd2VyU3RhdGUgPSBXTEFORFhFX1BPV0VSX1NUQVRFX0RPV047CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBob3N0UG93ZXJTdGF0ZSA9IFdMQU5EWEVfUE9XRVJfU1RBVEVfTUFYOworICAgfQorCisgICAvLyBBIGNhbGxiYWNrIGkuZS4gQUNLIGJhY2sgaXMgbmVlZGVkIG9ubHkgd2hlbiB3ZSB3YW50IHRvIGVuYWJsZSBCTVBTCisgICAvLyBhbmQgdGhlIGRhdGEvbWFuYWdlbWVudCBwYXRoIGlzIGFjdGl2ZSBiZWNhdXNlIHdlIHdhbnQgdG8gZW5zdXJlCisgICAvLyBEWEUgcmVnaXN0ZXJzIGFyZSBub3QgYWNjZXNzZWQgd2hlbiBSSVZBIG1heSBiZSBwb3dlci1jb2xsYXBzZWQuIFNvCisgICAvLyB3ZSBuZWVkIGEgY2FsbGJhY2sgaW4gZW50ZXJfYm1wc19yZXEgKHRoZSByZXF1ZXN0IHRvIFJJVkEgaXMgc2VudAorICAgLy8gb25seSBhZnRlciBBQ0sgYmFjayBmcm9tIFRYIHRocmVhZCkuIEEgY2FsbGJhY2sgaXMgbm90IG5lZWRlZCBpbgorICAgLy8gZmluaXNoX3NjYW5fcmVxIGR1cmluZyBCTVBTIHNpbmNlIGRhdGEtcGF0aCBpcyByZXN1bWVkIG9ubHkgaW4gCisgICAvLyBmaW5pc2hfc2Nhbl9yc3AgYW5kIG5vIG1hbmFnZW1lbnQgZnJhbWVzIGFyZSBzZW50IGluIGJldHdlZW4uIE5vIAorICAgLy8gY2FsbGJhY2sgaXMgbmVlZGVkIHdoZW4gZ29pbmcgZnJvbSBCTVBTIGVuYWJsZWQgdG8gQk1QUyBzdXNwZW5kZWQvCisgICAvLyBkaXNhYmxlZCB3aGVuIGl0IGlzIGtub3duIHRoYXQgUklWQSBpcyBhd2FrZSBhbmQgY2Fubm90IGVudGVyIHBvd2VyCisgICAvLyBjb2xsYXBzZSBhdXRvbm9tb3VzbHkgc28gbm8gY2FsbGJhY2sgaXMgbmVlZGVkIGluIGV4aXRfYm1wc19yc3Agb3IKKyAgIC8vIGluaXRfc2Nhbl9yc3AKKyAgIGlmICggY0JhY2sgKQorICAgeworICAgICAgLy9zZXJpYWxpemUgdGhyb3VnaCBSeCB0aHJlYWQKKyAgICAgIHJ4Q29tcE1zZyAgICAgICAgICA9ICh3cHRfbXNnICopd3BhbE1lbW9yeUFsbG9jYXRlKHNpemVvZih3cHRfbXNnKSk7CisgICAgICBpZihOVUxMID09IHJ4Q29tcE1zZykKKyAgICAgIHsKKyAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIldMQU5EWEVfU2V0UG93ZXJTdGF0ZSwgTVNHIE1FTSBhbGxvYyBGYWlsIik7CisgICAgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX1JFU09VUkNFUzsKKyAgICAgIH0KKworICAgICAgLyogRXZlbnQgdHlwZSwgd2hlcmUgaXQgbXVzdCBiZSBkZWZpbmVkPz8/PyAqLworICAgICAgLyogVEhJUyBNVVNUIEJFIENMRUFSRUQgQVNBUAorICAgICAgdHhDb21wTXNnLT50eXBlICAgICA9IFRYX0NPTVBMRVRFOyAqLworICAgICAgcnhDb21wTXNnLT5jYWxsYmFjayA9IGR4ZVJ4VGhyZWFkU2V0UG93ZXJTdGF0ZUV2ZW50SGFuZGxlcjsKKyAgICAgIHJ4Q29tcE1zZy0+cENvbnRleHQgPSBwRHhlQ3RybEJsazsKKyAgICAgIHJ4Q29tcE1zZy0+dmFsICAgICAgPSBob3N0UG93ZXJTdGF0ZTsKKyAgICAgIHJ4Q29tcE1zZy0+cHRyICAgICAgPSBjQmFjazsKKyAgICAgIHN0YXR1cyA9IHdwYWxQb3N0UnhNc2coV0RJX0dFVF9QQUxfQ1RYKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4Q29tcE1zZyk7CisgICAgICBpZiAoIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMgKQorICAgICAgeworICAgICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiUnggdGhyZWFkIFNldCBwb3dlciBzdGF0ZSByZXEgc2VyaWFsaXplIGZhaWwgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICAgIHN0YXR1cywgMCwgMCk7CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpZiAoIFdMQU5EWEVfUE9XRVJfU1RBVEVfRlVMTCA9PSBob3N0UG93ZXJTdGF0ZSApCisgICAgICB7CisgICAgICAgICBpZiggV0xBTkRYRV9QT1dFUl9TVEFURV9CTVBTID09IHBEeGVDdHJsQmxrLT5ob3N0UG93ZXJTdGF0ZSApCisgICAgICAgICB7CisgICAgICAgICAgICBkeGVOb3RpZnlTbXNtKGVXTEFOX1BBTF9GQUxTRSwgZVdMQU5fUEFMX1RSVUUpOworICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiggV0xBTkRYRV9QT1dFUl9TVEFURV9JTVBTID09IHBEeGVDdHJsQmxrLT5ob3N0UG93ZXJTdGF0ZSApCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBSZXF1ZXN0ZWQgRnVsbCBwb3dlciBmcm9tIGV4aXQgSU1QUywgcmVlbmFibGUgdGhlIGludGVycnVwdHMqLworICAgICAgICAgICAgaWYoZVdMQU5fUEFMX1RSVUUgPT0gcER4ZUN0cmxCbGstPnJ4SW50RGlzYWJsZWRCeUlNUFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwRHhlQ3RybEJsay0+cnhJbnREaXNhYmxlZEJ5SU1QUyA9IGVXTEFOX1BBTF9GQUxTRTsKKyAgICAgICAgICAgICAgIC8qIEVuYWJsZSBSWCBpbnRlcnJ1cHQgYXQgaGVyZSwgaWYgbmV3IFBTIGlzIG5vdCBJTVBTICovCisgICAgICAgICAgICAgICBzdGF0dXMgPSB3cGFsRW5hYmxlSW50ZXJydXB0KERYRV9JTlRFUlJVUFRfUlhfUkVBRFkpOworICAgICAgICAgICAgICAgaWYoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIEVuYWJsZSBSWCByZWFkeSBpbnRlcnJ1cHQgZmFpbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoZVdMQU5fUEFMX1RSVUUgPT0gcER4ZUN0cmxCbGstPnR4SW50RGlzYWJsZWRCeUlNUFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwRHhlQ3RybEJsay0+dHhJbnREaXNhYmxlZEJ5SU1QUyA9IGVXTEFOX1BBTF9GQUxTRTsKKyAgICAgICAgICAgICAgIC8qIEVuYWJsZSBSWCBpbnRlcnJ1cHQgYXQgaGVyZSwgaWYgbmV3IFBTIGlzIG5vdCBJTVBTICovCisgICAgICAgICAgICAgICBzdGF0dXMgPSB3cGFsRW5hYmxlSW50ZXJydXB0KERYRV9JTlRFUlJVUFRfVFhfQ09NUExFKTsKKyAgICAgICAgICAgICAgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBIRFhFX01TRyhlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBFbmFibGUgVFggY29tcCBpbnRlcnJ1cHQgZmFpbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgcER4ZUN0cmxCbGstPmhvc3RQb3dlclN0YXRlID0gaG9zdFBvd2VyU3RhdGU7CisgICAgICAgICBwRHhlQ3RybEJsay0+cml2YVBvd2VyU3RhdGUgPSBXTEFORFhFX1JJVkFfUE9XRVJfU1RBVEVfQUNUSVZFOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIGhvc3RQb3dlclN0YXRlID09IFdMQU5EWEVfUE9XRVJfU1RBVEVfQk1QUyApCisgICAgICB7CisgICAgICAgICBwRHhlQ3RybEJsay0+aG9zdFBvd2VyU3RhdGUgPSBob3N0UG93ZXJTdGF0ZTsKKyAgICAgICAgIHBEeGVDdHJsQmxrLT5yaXZhUG93ZXJTdGF0ZSA9IFdMQU5EWEVfUklWQV9QT1dFUl9TVEFURV9CTVBTX1VOS05PV047CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBIRFhFX0FTU0VSVCgwKTsKKyAgICAgIH0KKyAgIH0KKworICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAiJXMgRXhpdCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIFdMQU5EWEVfR2V0RnJlZVR4RGF0YVJlc051bWJlcgorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgUmV0dXJucyBmcmVlIGRlc2NyaXB0b3IgbnVtYmVycyBmb3IgVFggZGF0YSBjaGFubmVsIChUWCBoaWdoIHByaW9yaXR5KQorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIHBWb2lkICAgICAgICAgICAgcERYRUNvbnRleHQgOiBEWEUgQ29udHJvbCBCbG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3VpbnQzMiAgICAgIEZyZWUgZGVzY3JpcHRvciBudW1iZXIgb2YgVFggaGlnaCBwcmkgY2gKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfdWludDMyIFdMQU5EWEVfR2V0RnJlZVR4RGF0YVJlc051bWJlcgorKAorICAgdm9pZCAqcERYRUNvbnRleHQKKykKK3sKKyAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgIiVzIEVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSBwRFhFQ29udGV4dCkKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIk5VTEwgcGFyYW1ldGVyIHBhc3NlZCBieSBjYWxsZXIiLCAwLCAwLCAwKTsKKyAgICAgIHJldHVybiAoMCk7CisgICB9CisKKyAgIHJldHVybiAKKyAgICAgICgoV0xBTkRYRV9DdHJsQmxrVHlwZSAqKXBEWEVDb250ZXh0KS0+ZHhlQ2hhbm5lbFtXRFRTX0NIQU5ORUxfVFhfTE9XX1BSSV0ubnVtRnJlZURlc2M7Cit9CmRpZmYgLS1naXQgYS9DT1JFL0RYRS9zcmMvd2xhbl9xY3RfZHhlX2NmZ19pLmMgYi9DT1JFL0RYRS9zcmMvd2xhbl9xY3RfZHhlX2NmZ19pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiMGQ0MgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvRFhFL3NyYy93bGFuX3FjdF9keGVfY2ZnX2kuYwpAQCAtMCwwICsxLDYxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIEBmaWxlICB3bGFuX3FjdF9keGVfY2ZnX2kuYworICAKKyAgQGJyaWVmIAorICAgICAgICAgICAgICAgCisgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSSBleHBvc2VkIGJ5IHRoZSB3bGFuIGRhdGEgdHJhbnNmZXIgYWJzdHJhY3Rpb24gbGF5ZXIgbW9kdWxlLgorICAgQ29weXJpZ2h0IChjKSAyMDExIFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKK3doZW4gICAgICAgICAgIHdobyAgICAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0gICAgLS0tICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDgvMDMvMTAgICAgc2NoYW5nICAgICAgQ3JlYXRlZCBtb2R1bGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUyBGT1IgTU9EVUxFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAid2xhbl9xY3RfZHhlX2kuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgV0RUU19DaGFubmVsVHlwZSAgICAgICAgICAgd2xhbkNoYW5uZWw7CisgICBXTEFORFhFX0RNQUNoYW5uZWxUeXBlICAgICBETUFDaGFubmVsOworICAgV0xBTkRYRV9DaGFubmVsQ29uZmlnVHlwZSAqY2hhbm5lbENvbmZpZzsKK30gV0xBTkRYRV9DaGFubmVsTWFwcGluZ1R5cGU7CisKK3dwdF91aW50MzIgY2hhbm5lbEJhc2VBZGRyZXNzTGlzdFtXTEFORFhFX0RNQV9DSEFOTkVMX01BWF0gPQoreworICAgV0xBTkRYRV9ETUFfQ0hBTjBfQkFTRV9BRERSRVNTLAorICAgV0xBTkRYRV9ETUFfQ0hBTjFfQkFTRV9BRERSRVNTLAorICAgV0xBTkRYRV9ETUFfQ0hBTjJfQkFTRV9BRERSRVNTLAorICAgV0xBTkRYRV9ETUFfQ0hBTjNfQkFTRV9BRERSRVNTLAorICAgV0xBTkRYRV9ETUFfQ0hBTjRfQkFTRV9BRERSRVNTLAorICAgV0xBTkRYRV9ETUFfQ0hBTjVfQkFTRV9BRERSRVNTLAorICAgV0xBTkRYRV9ETUFfQ0hBTjZfQkFTRV9BRERSRVNTCit9OworCit3cHRfdWludDMyIGNoYW5uZWxJbnRlcnJ1cHRNYXNrW1dMQU5EWEVfRE1BX0NIQU5ORUxfTUFYXSA9Cit7CisgICBXTEFORFhFX0lOVF9NQVNLX0NIQU5fMCwKKyAgIFdMQU5EWEVfSU5UX01BU0tfQ0hBTl8xLAorICAgV0xBTkRYRV9JTlRfTUFTS19DSEFOXzIsCisgICBXTEFORFhFX0lOVF9NQVNLX0NIQU5fMywKKyAgIFdMQU5EWEVfSU5UX01BU0tfQ0hBTl80LAorICAgV0xBTkRYRV9JTlRfTUFTS19DSEFOXzUsCisgICBXTEFORFhFX0lOVF9NQVNLX0NIQU5fNgorfTsKKworV0xBTkRYRV9DaGFubmVsQ29uZmlnVHlwZSBjaGFuVFhMb3dQcmlDb25maWcgPQoreworICAgLyogUSBoYW5kbGUgdHlwZSwgQ2lyY3VsYXIgKi8KKyAgIFdMQU5EWEVfQ0hBTk5FTF9IQU5ETEVfQ0lSQ1VMQSwKKworICAgLyogTnVtYmVyIG9mIERlc2NyaXB0b3IsIE5PVCBDTEVBUiBZRVQgISEhICovCisgICBXTEFORFhFX0xPX1BSSV9SRVNfTlVNICwKKworICAgLyogTUFYIG51bSBSWCBCdWZmZXIgKi8KKyAgIDAsCisKKyAgIC8qIFJlZmVyZW5jZSBXUSwgVFgyMyAqLworICAgMjMsCisKKyAgIC8qIFVTQiBPbmx5LCBFbmQgcG9pbnQgaW5mbyAqLworICAgMCwKKworICAgLyogVHJhbnNmZXIgVHlwZSAqLworICAgV0xBTkRYRV9ERVNDX0NUUkxfWFRZUEVfSDJCLAorCisgICAvKiBDaGFubmVsIFByaW9yaXR5IDcoSGlnaGVzdCkgLSAwKExvd2VzdCkgTk9UIENMRUFSIFlFVCAhISEgKi8KKyAgIDQsCisKKyAgIC8qIEJEIGF0dGFjaGVkIHRvIGZyYW1lcyBmb3IgdGhpcyBwaXBlICovCisgICBlV0xBTl9QQUxfVFJVRSwKKworICAgLyogY2hrX3NpemUsIE5PVCBDTEVBUiBZRVQgISEhKi8KKyAgIDAsCisKKyAgIC8qIGJtdVRoZFNlbCwgTk9UIENMRUFSIFlFVCAhISEgKi8KKyAgIDUsCisKKyAgIC8qIEFkZGVkIGluIEdlbjUgZm9yIFByZWZldGNoLCBOT1QgQ0xFQVIgWUVUICEhISAqLworICAgZVdMQU5fUEFMX1RSVUUsCisKKyAgIC8qIFVzZSBzaG9ydCBEZXNjcmlwdG9yICovCisgICBlV0xBTl9QQUxfVFJVRQorfTsKKworV0xBTkRYRV9DaGFubmVsQ29uZmlnVHlwZSBjaGFuVFhIaWdoUHJpQ29uZmlnID0KK3sKKyAgIC8qIFEgaGFuZGxlIHR5cGUsIENpcmN1bGFyICovCisgICBXTEFORFhFX0NIQU5ORUxfSEFORExFX0NJUkNVTEEsCisKKyAgIC8qIE51bWJlciBvZiBEZXNjcmlwdG9yLCBOT1QgQ0xFQVIgWUVUICEhISAqLworICAgV0xBTkRYRV9ISV9QUklfUkVTX05VTSAsCisKKyAgIC8qIE1BWCBudW0gUlggQnVmZmVyICovCisgICAwLAorCisgICAvKiBSZWZlcmVuY2UgV1EsIFRYMjMgKi8KKyAgIDIzLAorCisgICAvKiBVU0IgT25seSwgRW5kIHBvaW50IGluZm8gKi8KKyAgIDAsCisKKyAgIC8qIFRyYW5zZmVyIFR5cGUgKi8KKyAgIFdMQU5EWEVfREVTQ19DVFJMX1hUWVBFX0gyQiwKKworICAgLyogQ2hhbm5lbCBQcmlvcml0eSA3KEhpZ2hlc3QpIC0gMChMb3dlc3QpLCBOT1QgQ0xFQVIgWUVUICEhISAqLworICAgNiwKKworICAgLyogQkQgYXR0YWNoZWQgdG8gZnJhbWVzIGZvciB0aGlzIHBpcGUgKi8KKyAgIGVXTEFOX1BBTF9UUlVFLAorCisgICAvKiBjaGtfc2l6ZSwgTk9UIENMRUFSIFlFVCAhISEqLworICAgMCwKKworICAgLyogYm11VGhkU2VsLCBOT1QgQ0xFQVIgWUVUICEhISAqLworICAgNywKKworICAgLyogQWRkZWQgaW4gR2VuNSBmb3IgUHJlZmV0Y2gsIE5PVCBDTEVBUiBZRVQgISEhKi8KKyAgIGVXTEFOX1BBTF9UUlVFLAorCisgICAvKiBVc2Ugc2hvcnQgRGVzY3JpcHRvciAqLworICAgZVdMQU5fUEFMX1RSVUUKK307CisKK1dMQU5EWEVfQ2hhbm5lbENvbmZpZ1R5cGUgY2hhblJYTG93UHJpQ29uZmlnID0KK3sKKyAgIC8qIFEgaGFuZGxlIHR5cGUsIENpcmN1bGFyICovCisgICBXTEFORFhFX0NIQU5ORUxfSEFORExFX0NJUkNVTEEsCisKKyAgIC8qIE51bWJlciBvZiBEZXNjcmlwdG9yLCBOT1QgQ0xFQVIgWUVUICEhISAqLworICAgMjU2LAorCisgICAvKiBNQVggbnVtIFJYIEJ1ZmZlciwgTk9UIENMRUFSIFlFVCAhISEgKi8KKyAgIDEsCisKKyAgIC8qIFJlZmVyZW5jZSBXUSwgTk9UIENMRUFSIFlFVCAhISEgKi8KKyAgIC8qIFRlbXBvcmFyeSBCTVUgV29yayBRIDQgKi8KKyAgIDExLAorCisgICAvKiBVU0IgT25seSwgRW5kIHBvaW50IGluZm8gKi8KKyAgIDAsCisKKyAgIC8qIFRyYW5zZmVyIFR5cGUgKi8KKyAgIFdMQU5EWEVfREVTQ19DVFJMX1hUWVBFX0IySCwKKworICAgLyogQ2hhbm5lbCBQcmlvcml0eSA3KEhpZ2hlc3QpIC0gMChMb3dlc3QpLCBOT1QgQ0xFQVIgWUVUICEhISAqLworICAgNSwKKworICAgLyogQkQgYXR0YWNoZWQgdG8gZnJhbWVzIGZvciB0aGlzIHBpcGUgKi8KKyAgIGVXTEFOX1BBTF9UUlVFLAorCisgICAvKiBjaGtfc2l6ZSwgTk9UIENMRUFSIFlFVCAhISEqLworICAgMCwKKworICAgLyogYm11VGhkU2VsLCBOT1QgQ0xFQVIgWUVUICEhISAqLworICAgNiwKKworICAgLyogQWRkZWQgaW4gR2VuNSBmb3IgUHJlZmV0Y2gsIE5PVCBDTEVBUiBZRVQgISEhKi8KKyAgIGVXTEFOX1BBTF9UUlVFLAorCisgICAvKiBVc2Ugc2hvcnQgRGVzY3JpcHRvciAqLworICAgZVdMQU5fUEFMX1RSVUUKK307CisKK1dMQU5EWEVfQ2hhbm5lbENvbmZpZ1R5cGUgY2hhblJYSGlnaFByaUNvbmZpZyA9Cit7CisgICAvKiBRIGhhbmRsZSB0eXBlLCBDaXJjdWxhciAqLworICAgV0xBTkRYRV9DSEFOTkVMX0hBTkRMRV9DSVJDVUxBLAorCisgICAvKiBOdW1iZXIgb2YgRGVzY3JpcHRvciwgTk9UIENMRUFSIFlFVCAhISEgKi8KKyAgIDQwLAorCisgICAvKiBNQVggbnVtIFJYIEJ1ZmZlciwgTk9UIENMRUFSIFlFVCAhISEgKi8KKyAgIDEsCisKKyAgIC8qIFJlZmVyZW5jZSBXUSwgUlgxMSAqLworICAgNCwKKworICAgLyogVVNCIE9ubHksIEVuZCBwb2ludCBpbmZvICovCisgICAwLAorCisgICAvKiBUcmFuc2ZlciBUeXBlICovCisgICBXTEFORFhFX0RFU0NfQ1RSTF9YVFlQRV9CMkgsCisKKyAgIC8qIENoYW5uZWwgUHJpb3JpdHkgNyhIaWdoZXN0KSAtIDAoTG93ZXN0KSwgTk9UIENMRUFSIFlFVCAhISEgKi8KKyAgIDYsCisKKyAgIC8qIEJEIGF0dGFjaGVkIHRvIGZyYW1lcyBmb3IgdGhpcyBwaXBlICovCisgICBlV0xBTl9QQUxfVFJVRSwKKworICAgLyogY2hrX3NpemUsIE5PVCBDTEVBUiBZRVQgISEhKi8KKyAgIDAsCisKKyAgIC8qIGJtdVRoZFNlbCwgTk9UIENMRUFSIFlFVCAhISEgKi8KKyAgIDgsCisKKyAgIC8qIEFkZGVkIGluIEdlbjUgZm9yIFByZWZldGNoLCBOT1QgQ0xFQVIgWUVUICEhISovCisgICBlV0xBTl9QQUxfVFJVRSwKKworICAgLyogVXNlIHNob3J0IERlc2NyaXB0b3IgKi8KKyAgIGVXTEFOX1BBTF9UUlVFCit9OworCisjaWZkZWYgV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFCitXTEFORFhFX0NoYW5uZWxDb25maWdUeXBlIGNoYW5IMkhUZXN0Q29uZmlnID0KK3sKKyAgIC8qIFEgaGFuZGxlIHR5cGUsIENpcmN1bGFyICovCisgICBXTEFORFhFX0NIQU5ORUxfSEFORExFX0NJUkNVTEEsCisKKyAgIC8qIE51bWJlciBvZiBEZXNjcmlwdG9yLCBOT1QgQ0xFQVIgWUVUICEhISAqLworICAgNSwKKworICAgLyogTUFYIG51bSBSWCBCdWZmZXIsIE5PVCBDTEVBUiBZRVQgISEhICovCisgICAwLAorCisgICAvKiBSZWZlcmVuY2UgV1EsIE5PVCBDTEVBUiBZRVQgISEhICovCisgICAvKiBUZW1wb3JhcnkgQk1VIFdvcmsgUSA1ICovCisgICA1LAorCisgICAvKiBVU0IgT25seSwgRW5kIHBvaW50IGluZm8gKi8KKyAgIDAsCisKKyAgIC8qIFRyYW5zZmVyIFR5cGUgKi8KKyAgIFdMQU5EWEVfREVTQ19DVFJMX1hUWVBFX0gySCwKKworICAgLyogQ2hhbm5lbCBQcmlvcml0eSA3KEhpZ2hlc3QpIC0gMChMb3dlc3QpLCBOT1QgQ0xFQVIgWUVUICEhISAqLworICAgNSwKKworICAgLyogQkQgYXR0YWNoZWQgdG8gZnJhbWVzIGZvciB0aGlzIHBpcGUgKi8KKyAgIGVXTEFOX1BBTF9GQUxTRSwKKworICAgLyogY2hrX3NpemUsIE5PVCBDTEVBUiBZRVQgISEhKi8KKyAgIDAsCisKKyAgIC8qIGJtdVRoZFNlbCwgTk9UIENMRUFSIFlFVCAhISEgKi8KKyAgIDAsCisKKyAgIC8qIEFkZGVkIGluIEdlbjUgZm9yIFByZWZldGNoLCBOT1QgQ0xFQVIgWUVUICEhISovCisgICBlV0xBTl9QQUxfVFJVRSwKKworICAgLyogVXNlIHNob3J0IERlc2NyaXB0b3IgKi8KKyAgIGVXTEFOX1BBTF9UUlVFCit9OworI2VuZGlmIC8qIFdMQU5EWEVfVEVTVF9DSEFOTkVMX0VOQUJMRSAqLworCitXTEFORFhFX0NoYW5uZWxNYXBwaW5nVHlwZSBjaGFubmVsTGlzdFtXRFRTX0NIQU5ORUxfTUFYXSA9Cit7CisgICB7V0RUU19DSEFOTkVMX1RYX0xPV19QUkksICBXTEFORFhFX0RNQV9DSEFOTkVMXzAsICZjaGFuVFhMb3dQcmlDb25maWd9LAorICAge1dEVFNfQ0hBTk5FTF9UWF9ISUdIX1BSSSwgV0xBTkRYRV9ETUFfQ0hBTk5FTF80LCAmY2hhblRYSGlnaFByaUNvbmZpZ30sCisgICB7V0RUU19DSEFOTkVMX1JYX0xPV19QUkksICBXTEFORFhFX0RNQV9DSEFOTkVMXzEsICZjaGFuUlhMb3dQcmlDb25maWd9LAorI2lmbmRlZiBXTEFORFhFX1RFU1RfQ0hBTk5FTF9FTkFCTEUKKyAgIHtXRFRTX0NIQU5ORUxfUlhfSElHSF9QUkksIFdMQU5EWEVfRE1BX0NIQU5ORUxfMywgJmNoYW5SWEhpZ2hQcmlDb25maWd9LAorI2Vsc2UKKyAgIHtXRFRTX0NIQU5ORUxfSDJIX1RFU1RfVFgsICAgIFdMQU5EWEVfRE1BX0NIQU5ORUxfMiwgJmNoYW5IMkhUZXN0Q29uZmlnfSwKKyAgIHtXRFRTX0NIQU5ORUxfSDJIX1RFU1RfUlgsICAgIFdMQU5EWEVfRE1BX0NIQU5ORUxfMiwgJmNoYW5IMkhUZXN0Q29uZmlnfQorI2VuZGlmIC8qIFdMQU5EWEVfVEVTVF9DSEFOTkVMX0VOQUJMRSAqLworfTsKKworV0xBTkRYRV9UeENvbXBJbnRDb25maWdUeXBlIHR4Q29tcEludCA9IAoreworICAgLyogVFggQ29tcGxldGUgSW50ZXJydXB0IGVuYWJsZSBtZXRob2QgKi8KKyAgIFdMQU5EWEVfVFhfQ09NUF9JTlRfUEVSX0tfRlJBTUVTLAorCisgICAvKiBUWCBMb3cgUmVzb3VyY2UgcmVtYWluaW5nIHJlc291cmNlIHRocmVzaG9sZCBmb3IgTG93IFByaSBDaCAqLworICAgV0xBTkRYRV9UWF9MT1dfUkVTX1RIUkVTSE9MRCwKKworICAgLyogVFggTG93IFJlc291cmNlIHJlbWFpbmluZyByZXNvdXJjZSB0aHJlc2hvbGQgZm9yIEhpZ2ggUHJpIENoICovCisgICBXTEFORFhFX1RYX0xPV19SRVNfVEhSRVNIT0xELAorCisgICAvKiBSWCBMb3cgUmVzb3VyY2UgcmVtYWluaW5nIHJlc291cmNlIHRocmVzaG9sZCAqLworICAgNSwKKworICAgLyogUGVyIEsgZnJhbWUgZW5hYmxlIEludGVycnVwdCAqLworICAgLypXTEFORFhFX0hJX1BSSV9SRVNfTlVNKi8gNSwKKworICAgLyogUGVyaW9kaWMgdGltZXIgbXNlYyAqLworICAgMTAKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZUNvbW1vbkRlZmF1bHRDb25maWcKKworICBAICBEZXNjcmlwdGlvbiAKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAqZHhlQ3RybEJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWEUgaG9zdCBkcml2ZXIgbWFpbiBjb250cm9sIGJsb2NrCisKKyAgQCAgUmV0dXJuCisgICAgICB3cHRfc3RhdHVzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfc3RhdHVzIGR4ZUNvbW1vbkRlZmF1bHRDb25maWcKKygKKyAgIFdMQU5EWEVfQ3RybEJsa1R5cGUgICAgICpkeGVDdHJsQmxrCispCit7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworCisgICBkeGVDdHJsQmxrLT5yeFJlYWR5Q0IgICAgID0gTlVMTDsKKyAgIGR4ZUN0cmxCbGstPnR4Q29tcENCICAgICAgPSBOVUxMOworICAgZHhlQ3RybEJsay0+bG93UmVzb3VyY2VDQiA9IE5VTEw7CisKKyAgIHdwYWxNZW1vcnlDb3B5KCZkeGVDdHJsQmxrLT50eENvbXBJbnQsCisgICAgICAgICAgICAgICAgICAmdHhDb21wSW50LAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdMQU5EWEVfVHhDb21wSW50Q29uZmlnVHlwZSkpOworCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVDaGFubmVsRGVmYXVsdENvbmZpZworCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgR2V0IGRlZnVhbHQgY29uZmlndXJhdGlvbiB2YWx1ZXMgZnJvbSBwcmUgZGVmaW5lZCBzdHJ1Y3R1cmUKKyAgICAgIEFsbCB0aGUgY2hhbm5lbHMgbXVzdCBoYXZlIGl0J3Mgb3duIGNvbmZpZ3VyYXRpb25zCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhFIGhvc3QgZHJpdmVyIG1haW4gY29udHJvbCBibG9jaworICAgICAgV0xBTkRYRV9DaGFubmVsQ0JUeXBlICAgKmNoYW5uZWxFbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgc3BlY2lmaWMgY29udHJvbCBibG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLword3B0X3N0YXR1cyBkeGVDaGFubmVsRGVmYXVsdENvbmZpZworKAorICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGssCisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5CispCit7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgIGJhc2VBZGRyZXNzOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgIGR4ZUNvbnRyb2xSZWFkICA9IDA7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgZHhlQ29udHJvbFdyaXRlID0gMDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICBkeGVDb250cm9sV3JpdGVWYWxpZCA9IDA7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgZHhlQ29udHJvbFdyaXRlRW9wID0gMDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICBkeGVDb250cm9sV3JpdGVFb3BJbnQgPSAwOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgIGlkeDsKKyAgIFdMQU5EWEVfQ2hhbm5lbE1hcHBpbmdUeXBlICptYXBwZWRDaGFubmVsID0gTlVMTDsKKworICAgLyogU2FuaXR5IENoZWNrICovCisgICBpZigoTlVMTCA9PSBkeGVDdHJsQmxrKSB8fCAoTlVMTCA9PSBjaGFubmVsRW50cnkpKQorICAgeworICAgICAgSERYRV9NU0coZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiZHhlTGlua0Rlc2NBbmRDdHJsQmxrIENoYW5uZWwgRW50cnkgaXMgbm90IHZhbGlkIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBmb3IoaWR4ID0gMDsgaWR4IDwgV0RUU19DSEFOTkVMX01BWDsgaWR4KyspCisgICB7CisgICAgICBpZihjaGFubmVsRW50cnktPmNoYW5uZWxUeXBlID09IGNoYW5uZWxMaXN0W2lkeF0ud2xhbkNoYW5uZWwpCisgICAgICB7CisgICAgICAgICBtYXBwZWRDaGFubmVsID0gJmNoYW5uZWxMaXN0W2lkeF07CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgaWYoKE5VTEwgPT0gbWFwcGVkQ2hhbm5lbCkgfHwgKFdEVFNfQ0hBTk5FTF9NQVggPT0gaWR4KSkKKyAgIHsKKyAgICAgIEhEWEVfTVNHKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXMgRmFpbGVkIHRvIG1hcCBjaGFubmVsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHdwYWxNZW1vcnlDb3B5KCZjaGFubmVsRW50cnktPmNoYW5uZWxDb25maWcsCisgICAgICAgICAgICAgICAgICBtYXBwZWRDaGFubmVsLT5jaGFubmVsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdMQU5EWEVfQ2hhbm5lbENvbmZpZ1R5cGUpKTsKKworICAgYmFzZUFkZHJlc3MgPSBjaGFubmVsQmFzZUFkZHJlc3NMaXN0W21hcHBlZENoYW5uZWwtPkRNQUNoYW5uZWxdOworICAgY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVCYXNlQWRkciAgICAgICAgPSBiYXNlQWRkcmVzczsKKyAgIGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFJlZ2lzdGVyLmNoRFhFU3RhdHVzUmVnQWRkciAgID0gYmFzZUFkZHJlc3MgKyBXTEFORFhFX0RNQV9DSF9TVEFUVVNfUkVHOworICAgY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVEZXNjbFJlZ0FkZHIgICAgPSBiYXNlQWRkcmVzcyArIFdMQU5EWEVfRE1BX0NIX0RFU0NMX1JFRzsKKyAgIGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFJlZ2lzdGVyLmNoRFhFRGVzY2hSZWdBZGRyICAgID0gYmFzZUFkZHJlc3MgKyBXTEFORFhFX0RNQV9DSF9ERVNDSF9SRUc7CisgICBjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRUxzdERlc2NsUmVnQWRkciA9IGJhc2VBZGRyZXNzICsgV0xBTkRYRV9ETUFfQ0hfTFNUX0RFU0NMX1JFRzsKKyAgIGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFJlZ2lzdGVyLmNoRFhFQ3RybFJlZ0FkZHIgICAgID0gYmFzZUFkZHJlc3MgKyBXTEFORFhFX0RNQV9DSF9DVFJMX1JFRzsKKyAgIGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFJlZ2lzdGVyLmNoRFhFU3pSZWdBZGRyICAgICAgID0gYmFzZUFkZHJlc3MgKyBXTEFORFhFX0RNQV9DSF9TWl9SRUc7CisgICBjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRURhZHJsUmVnQWRkciAgICA9IGJhc2VBZGRyZXNzICsgV0xBTkRYRV9ETUFfQ0hfREFEUkxfUkVHOworICAgY2hhbm5lbEVudHJ5LT5jaGFubmVsUmVnaXN0ZXIuY2hEWEVEYWRyaFJlZ0FkZHIgICAgPSBiYXNlQWRkcmVzcyArIFdMQU5EWEVfRE1BX0NIX0RBRFJIX1JFRzsKKyAgIGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFJlZ2lzdGVyLmNoRFhFU2FkcmxSZWdBZGRyICAgID0gYmFzZUFkZHJlc3MgKyBXTEFORFhFX0RNQV9DSF9TQURSTF9SRUc7CisgICBjaGFubmVsRW50cnktPmNoYW5uZWxSZWdpc3Rlci5jaERYRVNhZHJoUmVnQWRkciAgICA9IGJhc2VBZGRyZXNzICsgV0xBTkRYRV9ETUFfQ0hfU0FEUkhfUkVHOworCisgICAvKiBDaGFubmVsIE1hc2s/CisgICAgKiBUaGlzIHZhbHVlIHdpbGwgY29udHJvbCBjaGFubmVsIGNvbnRyb2wgcmVnaXN0ZXIuCisgICAgKiBUaGlzIHJlZ2lzdGVyIHdpbGwgYmUgc2V0IHRvIHRyaWdnZXIgYWN0dWFsIERNQSB0cmFuc2ZlciBhY3RpdmF0ZQorICAgICogQ0hfTl9DVFJMICovCisgICBjaGFubmVsRW50cnktPmV4dHJhQ29uZmlnLmNoYW5fbWFzayA9IDA7CisgICAvKiBDaGVjayBWQUwgYml0IGJlZm9yZSBwcm9jZXNzaW5nIGRlc2NyaXB0b3IgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IFdMQU5EWEVfQ0hfQ1RSTF9FRFZFTl9NQVNLOworICAgLyogVXNlIEV4dGVybmFsIERlc2NyaXB0b3IgTGlua2VkIExpc3QgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IFdMQU5EWEVfQ0hfQ1RSTF9FREVOX01BU0s7CisgICAvKiBFbmFibGUgQ2hhbm5lbCBJbnRlcnJ1cHQgb24gZXJyb3IgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IFdMQU5EWEVfQ0hfQ1RSTF9JTkVfRVJSX01BU0s7CisgICAvKiBFbmFibGUgSU5UIGFmdGVyIFhGRVIgZG9uZSAqLworICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jaGFuX21hc2sgfD0gV0xBTkRYRV9DSF9DVFJMX0lORV9ET05FX01BU0s7CisgICAvKiBFbmFibGUgSU5UIEV4dGVybmFsIERlc2NyaXB0b3IgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IFdMQU5EWEVfQ0hfQ1RSTF9JTkVfRURfTUFTSzsKKyAgIC8qIFNldCBDaGFubmVsIFRoaXMgaXMgbm90IGNoYW5uZWwsIGV2ZW50IGNvdW50ZXIsIHNvbXRoaW5nIHdyb25nICovCisgICBjaGFubmVsRW50cnktPmV4dHJhQ29uZmlnLmNoYW5fbWFzayB8PSAKKyAgICAgICAgICAgICAgICBtYXBwZWRDaGFubmVsLT5ETUFDaGFubmVsIDw8IFdMQU5EWEVfQ0hfQ1RSTF9DVFJfU0VMX09GRlNFVDsKKyAgIC8qIFRyYW5zZmVyIFR5cGUgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IG1hcHBlZENoYW5uZWwtPmNoYW5uZWxDb25maWctPnhmclR5cGU7CisgICAvKiBVc2UgU2hvcnQgRGVzY3JpcHRvciwgVEhJUyBMT09LUyBTT01FIFdJRVJELCBSRVZJU0lUICovCisgICBpZighY2hhbm5lbEVudHJ5LT5jaGFubmVsQ29uZmlnLnVzZVNob3J0RGVzY0ZtdCkKKyAgIHsKKyAgICAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IFdMQU5EWEVfREVTQ19DVFJMX0RGTVQ7CisgICB9CisgICAvKiBUWCBDaGFubmVsLCBTZXQgRElRIGJpdCwgQ2xlYXIgU0lRIGJpdCBzaW5jZSBzb3VyY2UgaXMgbm90IFdRICovCisgICBpZigoV0RUU19DSEFOTkVMX1RYX0xPV19QUkkgID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpIHx8CisgICAgICAoV0RUU19DSEFOTkVMX1RYX0hJR0hfUFJJID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpKQorICAgeworICAgICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jaGFuX21hc2sgfD0gV0xBTkRYRV9DSF9DVFJMX0RJUV9NQVNLOworICAgfQorICAgLyogUlggQ2hhbm5lbCwgU2V0IFNJUSBiaXQsIENsZWFyIERJUSBiaXQgc2luY2Ugc291cmNlIGlzIG5vdCBXUSAqLworICAgZWxzZSBpZigoV0RUU19DSEFOTkVMX1JYX0xPV19QUkkgID09IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbFR5cGUpIHx8CisgICAgICAgICAgIChXRFRTX0NIQU5ORUxfUlhfSElHSF9QUkkgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkpCisgICB7CisgICAgICBjaGFubmVsRW50cnktPmV4dHJhQ29uZmlnLmNoYW5fbWFzayB8PSBXTEFORFhFX0NIX0NUUkxfU0lRX01BU0s7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAvKiBUaGlzIGlzIHRlc3QgSDJIIGNoYW5uZWwsIFRYLCBSWCBub3QgdXNlIHdvcmsgUQorICAgICAgICogRG8gTm90aGluZyAqLworICAgfQorICAgLyogRnJhbWUgQ29udGVudHMgU3dhcCAqLworICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jaGFuX21hc2sgfD0gV0xBTkRYRV9DSF9DVFJMX1NXQVBfTUFTSzsKKyAgIC8qIEhvc3QgU3lzdGVtIFVzaW5nIExpdHRsZSBFbmRpYW4gKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IFdMQU5EWEVfQ0hfQ1RSTF9FTkRJQU5fTUFTSzsKKyAgIC8qIEJNVSBUaHJlc2hvbGQgc2VsZWN0ICovCisgICBjaGFubmVsRW50cnktPmV4dHJhQ29uZmlnLmNoYW5fbWFzayB8PSAKKyAgICAgICAgICAgICAgICAgY2hhbm5lbEVudHJ5LT5jaGFubmVsQ29uZmlnLmJtdVRoZFNlbCA8PCBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX09GRlNFVDsKKyAgIC8qIEVPUCBmb3IgY29udHJvbCByZWdpc3RlciA/Pz8gKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IFdMQU5EWEVfQ0hfQ1RSTF9FT1BfTUFTSzsKKyAgIC8qIENoYW5uZWwgUHJpb3JpdHkgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbENvbmZpZy5jaFByaW9yaXR5IDw8IFdMQU5EWEVfQ0hfQ1RSTF9QUklPX09GRlNFVDsKKyAgIC8qIFBEVSBSRUwgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IFdMQU5EWEVfREVTQ19DVFJMX1BEVV9SRUw7CisgICAvKiBEaXNhYmxlIERNQSB0cmFuc2ZlciBvbiB0aGlzIGNoYW5uZWwgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrX3JlYWRfZGlzYWJsZSA9IGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrOworICAgLyogRW5hYmxlIERNQSB0cmFuc2ZlciBvbiB0aGlzIGNoYW5uZWwgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY2hhbl9tYXNrIHw9IFdMQU5EWEVfQ0hfQ1RSTF9FTl9NQVNLOworICAgLyogQ2hhbm5lbCBNYXNrIGRvbmUgKi8KKworICAgLyogQ29udHJvbCBSZWFkCisgICAgKiBEZWZhdWx0IERlc2NyaXB0b3IgY29udHJvbCBXb3JkIHZhbHVlIGZvciBSWCByZWFkeSBEWEUgZGVzY3JpcHRvcgorICAgICogRFhFIGVuZ2luZSB3aWxsIHJlZmVyZW5jZSB0aGlzIHZhbHVlIGJlZm9yZSBETUEgdHJhbnNmZXIgKi8KKyAgIGR4ZUNvbnRyb2xSZWFkID0gMDsKKyAgIC8qIFNvdXJjZSBpcyBhIFF1ZXVlIElELCBub3QgZmxhdCBtZW1vcnkgYWRkcmVzcyAqLworICAgZHhlQ29udHJvbFJlYWQgfD0gV0xBTkRYRV9ERVNDX0NUUkxfU0lROworICAgLyogVHJhbnNmZXIgZGlyZWN0aW9uIGlzIEJNVSAyIEhvc3QgKi8KKyAgIGR4ZUNvbnRyb2xSZWFkIHw9IFdMQU5EWEVfREVTQ19DVFJMX1hUWVBFX0IySDsKKyAgIC8qIEVuZCBvZiBQYWNrZXQsIFJYIGlzIHNpbmdsZSBmcmFnbWVudCAqLworICAgZHhlQ29udHJvbFJlYWQgfD0gV0xBTkRYRV9ERVNDX0NUUkxfRU9QOworICAgLyogQkQgUHJlc2VudCwgZGVmYXVsdCBZRVMsIEIySCBjYXNlIGl0IG11c3QgYmUgMCB0byBpbnNlcnQgQkQgKi8KKyAgIGlmKCFjaGFubmVsRW50cnktPmNoYW5uZWxDb25maWcuYmRQcmVzZW50KQorICAgeworICAgICAgZHhlQ29udHJvbFJlYWQgfD0gV0xBTkRYRV9ERVNDX0NUUkxfQkRIOworICAgfQorICAgLyogQ2hhbm5lbCBQcmlvcml0eSAqLworICAgZHhlQ29udHJvbFJlYWQgfD0gY2hhbm5lbEVudHJ5LT5jaGFubmVsQ29uZmlnLmNoUHJpb3JpdHkgPDwgV0xBTkRYRV9DSF9DVFJMX1BSSU9fT0ZGU0VUOworICAgLyogQk1VIFRocmVzaG9sZCBzZWxlY3QsIG9ubHkgdXNlZCBIMkIsIG5vdCB0aGlzIGNhc2U/Pz8gKi8KKyAgIGR4ZUNvbnRyb2xSZWFkIHw9IGNoYW5uZWxFbnRyeS0+Y2hhbm5lbENvbmZpZy5ibXVUaGRTZWwgPDwgV0xBTkRYRV9DSF9DVFJMX0JUSExEX1NFTF9PRkZTRVQ7CisgICAvKiBQRFUgUmVsZWFzZSwgUmVsZWFzZSBCRC9QRFUgd2hlbiBETUEgZG9uZSAqLworICAgZHhlQ29udHJvbFJlYWQgfD0gV0xBTkRYRV9ERVNDX0NUUkxfUERVX1JFTDsKKyAgIC8qIFVzZSBTaG9ydCBEZXNjcmlwdG9yLCBUSElTIExPT0tTIFNPTUUgV0lFUkQsIFJFVklTSVQgKi8KKyAgIGlmKCFjaGFubmVsRW50cnktPmNoYW5uZWxDb25maWcudXNlU2hvcnREZXNjRm10KQorICAgeworICAgICAgZHhlQ29udHJvbFJlYWQgfD0gV0xBTkRYRV9ERVNDX0NUUkxfREZNVDsKKyAgIH0KKyAgIC8qIEludGVycnVwdCBvbiBEZXNjcmlwdG9yIGRvbmUgKi8KKyAgIGR4ZUNvbnRyb2xSZWFkIHw9IFdMQU5EWEVfREVTQ19DVFJMX0lOVDsKKyAgIC8qIEZvciByZWFkeSBzdGF0dXMsIHRoaXMgQ29udHJvbCBXT1JEIG11c3QgYmUgVkFMSUQgKi8KKyAgIGR4ZUNvbnRyb2xSZWFkIHw9IFdMQU5EWEVfREVTQ19DVFJMX1ZBTElEOworICAgLyogRnJhbWUgQ29udGVudHMgU3dhcCAqLworICAgZHhlQ29udHJvbFJlYWQgfD0gV0xBTkRYRV9ERVNDX0NUUkxfQkRUX1NXQVA7CisgICAvKiBIb3N0IExpdHRsZSBFbmRpYW4gKi8KKyAgIGlmKChXRFRTX0NIQU5ORUxfVFhfTE9XX1BSSSAgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkgfHwKKyAgICAgIChXRFRTX0NIQU5ORUxfVFhfSElHSF9QUkkgPT0gY2hhbm5lbEVudHJ5LT5jaGFubmVsVHlwZSkpCisgICB7CisgICAgICBkeGVDb250cm9sUmVhZCB8PSBXTEFORFhFX0RFU0NfQ1RSTF9FTkRJQU5ORVNTOworICAgfQorCisgICAvKiBTV0FQIGlmIG5lZWRlZCAqLworICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jd19jdHJsX3JlYWQgPSBXTEFORFhFX1UzMl9TV0FQX0VORElBTihkeGVDb250cm9sUmVhZCk7CisgICAvKiBDb250cm9sIFJlYWQgRG9uZSAqLworCisgICAvKiBDb250cm9sIFdyaXRlCisgICAgKiBXcml0ZSBpbnRvIERYRSBkZXNjcmlwdG9yIGNvbnRyb2wgd29yZCB0byBUWCBmcmFtZQorICAgICogRFhFIGVuZ2luZSB3aWxsIHJlZmVyZW5jZSB0aGlzIHdvcmQgdG8gY29udG9ybCBUWCBETUEgY2hhbm5lbCAqLworICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jd19jdHJsX3dyaXRlID0gMDsKKyAgIC8qIFRyYW5zZmVyIHR5cGUsIGZyb20gSG9zdCAyIEJNVSAqLworICAgZHhlQ29udHJvbFdyaXRlIHw9IG1hcHBlZENoYW5uZWwtPmNoYW5uZWxDb25maWctPnhmclR5cGU7CisgICAvKiBCRCBQcmVzZW50LCB0aGlzIGxvb2tzIHNvbWUgd2VpcmQgPz8/ICovCisgICBpZighY2hhbm5lbEVudHJ5LT5jaGFubmVsQ29uZmlnLmJkUHJlc2VudCkKKyAgIHsKKyAgICAgIGR4ZUNvbnRyb2xXcml0ZSB8PSBXTEFORFhFX0RFU0NfQ1RSTF9CREg7CisgICB9CisgICAvKiBDaGFubmVsIFByaW9yaXR5ICovCisgICBkeGVDb250cm9sV3JpdGUgfD0gY2hhbm5lbEVudHJ5LT5jaGFubmVsQ29uZmlnLmNoUHJpb3JpdHkgPDwgV0xBTkRYRV9DSF9DVFJMX1BSSU9fT0ZGU0VUOworICAgLyogVXNlIFNob3J0IERlc2NyaXB0b3IsIFRISVMgTE9PS1MgU09NRSBXSUVSRCwgUkVWSVNJVCAqLworICAgaWYoIWNoYW5uZWxFbnRyeS0+Y2hhbm5lbENvbmZpZy51c2VTaG9ydERlc2NGbXQpCisgICB7CisgICAgICBkeGVDb250cm9sV3JpdGUgfD0gV0xBTkRYRV9ERVNDX0NUUkxfREZNVDsKKyAgIH0KKyAgIC8qIEJNVSBUaHJlc2hvbGQgc2VsZWN0LCBvbmx5IHVzZWQgSDJCLCBub3QgdGhpcyBjYXNlPz8/ICovCisgICBkeGVDb250cm9sV3JpdGUgfD0gY2hhbm5lbEVudHJ5LT5jaGFubmVsQ29uZmlnLmJtdVRoZFNlbCA8PCBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX09GRlNFVDsKKyAgIC8qIERlc3RpbmF0aW9uIGlzIFdRICovCisgICBkeGVDb250cm9sV3JpdGUgfD0gV0xBTkRYRV9ERVNDX0NUUkxfRElROworICAgLyogRnJhbWUgQ29udGVudHMgU3dhcCAqLworICAgZHhlQ29udHJvbFdyaXRlIHw9IFdMQU5EWEVfREVTQ19DVFJMX0JEVF9TV0FQOworICAgLyogSG9zdCBMaXR0bGUgRW5kaWFuICovCisgICBkeGVDb250cm9sV3JpdGUgfD0gV0xBTkRYRV9ERVNDX0NUUkxfRU5ESUFOTkVTUzsKKyAgIC8qIEludGVycnVwdCBFbmFibGUgKi8KKyAgIGR4ZUNvbnRyb2xXcml0ZSB8PSBXTEFORFhFX0RFU0NfQ1RSTF9JTlQ7CisKKyAgIGR4ZUNvbnRyb2xXcml0ZVZhbGlkICA9IGR4ZUNvbnRyb2xXcml0ZSB8IFdMQU5EWEVfREVTQ19DVFJMX1ZBTElEOworICAgZHhlQ29udHJvbFdyaXRlRW9wICAgID0gZHhlQ29udHJvbFdyaXRlVmFsaWQgfCBXTEFORFhFX0RFU0NfQ1RSTF9FT1A7CisgICBkeGVDb250cm9sV3JpdGVFb3BJbnQgPSBkeGVDb250cm9sV3JpdGVFb3AgfCBXTEFORFhFX0RFU0NfQ1RSTF9JTlQ7CisKKyAgIC8qIERYRSBEZXNjcmlwdG9yIG11c3QgaGFzIEVuZGlhbiBzd2FwcGVkIHZhbHVlICovCisgICBjaGFubmVsRW50cnktPmV4dHJhQ29uZmlnLmN3X2N0cmxfd3JpdGUgPSBXTEFORFhFX1UzMl9TV0FQX0VORElBTihkeGVDb250cm9sV3JpdGUpOworICAgLyogQ29udHJvbCBXcml0ZSBET05FICovCisKKyAgIC8qIENvbnRyb2wgV3JpdGUgaW5jbHVkZSBWQUwgYml0CisgICAgKiBUaGlzIENvbnRyb2wgd29yZCB1c2VkIHRvIHNldCB2YWxpZCBiaXQgYW5kCisgICAgKiB0cmlnZ2VyIERNQSB0cmFuc2ZlciBmb3Igc3BlY2lmaWMgZGVzY3JpcHRvciAqLworICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jd19jdHJsX3dyaXRlX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgIFdMQU5EWEVfVTMyX1NXQVBfRU5ESUFOKGR4ZUNvbnRyb2xXcml0ZVZhbGlkKTsKKworICAgLyogQ29udHJvbCBXcml0ZSBpbmNsdWRlIEVPUAorICAgICogRW5kIG9mIFBhY2tldCAqLworICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jd19jdHJsX3dyaXRlX2VvcCA9CisgICAgICAgICAgICAgICAgICBXTEFORFhFX1UzMl9TV0FQX0VORElBTihkeGVDb250cm9sV3JpdGVFb3ApOworCisgICAvKiBDb250cm9sIFdyaXRlIGluY2x1ZGUgRU9QIGFuZCBJTlQKKyAgICAqIGluZGljYXRlIEVuZCBPZiBQYWNrZXQgYW5kIGdlbmVyYXRlIGludGVycnVwdCBvbiBkZXNjcmlwdG9yIERvbmUgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuY3dfY3RybF93cml0ZV9lb3BfaW50ID0KKyAgICAgICAgICAgICAgICAgIFdMQU5EWEVfVTMyX1NXQVBfRU5ESUFOKGR4ZUNvbnRyb2xXcml0ZUVvcEludCk7CisKKworICAgLyogc2l6ZSBtYXNrPz8/PyAqLworICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5jaGtfc2l6ZV9tYXNrID0gCisgICAgICAgICAgICBtYXBwZWRDaGFubmVsLT5jaGFubmVsQ29uZmlnLT5jaGtfc2l6ZSA8PCAxMDsKKworICAgY2hhbm5lbEVudHJ5LT5leHRyYUNvbmZpZy5yZWZXUV9zd2FwcGVkID0gCisgICAgICAgICAgICAgICAgV0xBTkRYRV9VMzJfU1dBUF9FTkRJQU4oY2hhbm5lbEVudHJ5LT5jaGFubmVsQ29uZmlnLnJlZldRKTsKKworICAgLyogU2V0IENoYW5uZWwgc3BlY2lmaWMgSW50ZXJydXB0IG1hc2sgKi8KKyAgIGNoYW5uZWxFbnRyeS0+ZXh0cmFDb25maWcuaW50TWFzayA9IGNoYW5uZWxJbnRlcnJ1cHRNYXNrW21hcHBlZENoYW5uZWwtPkRNQUNoYW5uZWxdOworCisKKyAgIGNoYW5uZWxFbnRyeS0+bnVtRGVzYyAgICAgICAgICAgID0gbWFwcGVkQ2hhbm5lbC0+Y2hhbm5lbENvbmZpZy0+bkRlc2NzOworICAgY2hhbm5lbEVudHJ5LT5hc3NpZ25lZERNQUNoYW5uZWwgPSBtYXBwZWRDaGFubmVsLT5ETUFDaGFubmVsOworICAgY2hhbm5lbEVudHJ5LT5udW1GcmVlRGVzYyAgICAgICAgICAgICA9IDA7CisgICBjaGFubmVsRW50cnktPm51bVJzdmREZXNjICAgICAgICAgICAgID0gMDsKKyAgIGNoYW5uZWxFbnRyeS0+bnVtRnJhZ21lbnRDdXJyZW50Q2hhaW4gPSAwOworICAgY2hhbm5lbEVudHJ5LT5udW1Ub3RhbEZyYW1lICAgICAgICAgICA9IDA7CisgICBjaGFubmVsRW50cnktPmhpdExvd1Jlc291cmNlICAgICAgICAgID0gZVdMQU5fUEFMX0ZBTFNFOworCisgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9EWEUvc3JjL3dsYW5fcWN0X2R4ZV9pLmggYi9DT1JFL0RYRS9zcmMvd2xhbl9xY3RfZHhlX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWJiNjg2Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9EWEUvc3JjL3dsYW5fcWN0X2R4ZV9pLmgKQEAgLTAsMCArMSw2NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFdMQU5fUUNUX0RYRV9JX0gKKyNkZWZpbmUgV0xBTl9RQ1RfRFhFX0lfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBAZmlsZSAgd2xhbl9xY3RfZHhlX2kuaAorICAKKyAgQGJyaWVmIAorICAgICAgICAgICAgICAgCisgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSSBleHBvc2VkIGJ5IHRoZSB3bGFuIGRhdGEgdHJhbnNmZXIgYWJzdHJhY3Rpb24gbGF5ZXIgbW9kdWxlLgorICAgQ29weXJpZ2h0IChjKSAyMDExIFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKK3doZW4gICAgICAgICAgIHdobyAgICAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0gICAgLS0tICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDgvMDMvMTAgICAgc2NoYW5nICAgICAgQ3JlYXRlZCBtb2R1bGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUyBGT1IgTU9EVUxFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAid2xhbl9xY3RfZHhlLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3RyYWNlLmgiCisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0xBTkRYRV9DVFhUX0NPT0tJRSAgICAgICAgICAgICAgMHhDMDBDQzExMQorCisKKy8qIEZyb20gaGVyZSBSSVZBIERYRSByZWdpc3RlciBpbmZvcm1hdGlvbgorICogVGhpcyBpcyB0ZW1wb3JhcnkgZGVmaW5pdGlvbiBsb2NhdGlvbiB0byBtYWtlIGNvbXBpbGUgYW5kIHVuaXQgdGVzdAorICogSWYgb2ZmaWNpYWwgbXNtcmVnLmggaW50ZWdyYXRlZCwgdGhpcyBwYXJ0IHdpbGwgYmUgZWxpbWluYXRlZCAqLworLyogU3RhcnQgd2l0aCBiYXNlIGFkZHJlc3MgKi8KKworI2RlZmluZSBXTEFORFhFX0NDVV9EWEVfSU5UX1NFTEVDVCAgICAgICAweDAzMjAwYjEwCisjZGVmaW5lIFdMQU5EWEVfQ0NVX0RYRV9JTlRfU0VMRUNUX1NUQVQgIDB4MDMyMDBiMTQKKyNkZWZpbmUgV0xBTkRYRV9DQ1VfQVNJQ19JTlRfRU5BQkxFICAgICAgMHgwMzIwMGIxOAorCisjaWZkZWYgUEFMX09TX1RZUEVfQk1QCisjZGVmaW5lIFdMQU5EWEVfUklWQV9CQVNFX0FERFJFU1MgICAgICAgIDB4Q0REMDAwMDAKKyNlbHNlCisjZGVmaW5lIFdMQU5EWEVfUklWQV9CQVNFX0FERFJFU1MgICAgICAgIDB4MDMwMDAwMDAKKyNlbmRpZiAvKiBQQUxfT1NfVFlQRV9CTVAgKi8KKworI2RlZmluZSBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyAgICBXTEFORFhFX1JJVkFfQkFTRV9BRERSRVNTICsgMHgyMDIwMDAKKworLyogQ29tbW9uIG92ZXIgdGhlIGNoYW5uZWxzIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBXQUxOREVYX0RNQV9DU1JfQUREUkVTUyAgICAgICAgICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4MDAKKyNkZWZpbmUgV0FMTkRFWF9ETUFfRU5DSF9BRERSRVNTICAgICAgICAgV0xBTkRYRV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgKyAweDA0CisjZGVmaW5lIFdBTE5ERVhfRE1BX0NIX0VOX0FERFJFU1MgICAgICAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHgwOAorI2RlZmluZSBXQUxOREVYX0RNQV9DSF9ET05FX0FERFJFU1MgICAgICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4MEMKKyNkZWZpbmUgV0FMTkRFWF9ETUFfQ0hfRVJSX0FERFJFU1MgICAgICAgV0xBTkRYRV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgKyAweDEwCisjZGVmaW5lIFdBTE5ERVhfRE1BX0NIX1NUT1BfQUREUkVTUyAgICAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHgxNAorCisvKiBJbnRlcnJ1cHQgQ29udHJvbCByZWdpc3RlciBhZGRyZXNzICovCisjZGVmaW5lIFdMQU5EWEVfSU5UX01BU0tfUkVHX0FERFJFU1MgICAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHgxOAorI2RlZmluZSBXTEFORFhFX0lOVF9TUkNfTVNLRF9BRERSRVNTICAgICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4MUMKKyNkZWZpbmUgV0xBTkRYRV9JTlRfU1JDX1JBV19BRERSRVNTICAgICAgV0xBTkRYRV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgKyAweDIwCisjZGVmaW5lIFdMQU5EWEVfSU5UX0VEX1NSQ19BRERSRVNTICAgICAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHgyNAorI2RlZmluZSBXTEFORFhFX0lOVF9ET05FX1NSQ19BRERSRVNTICAgICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4MjgKKyNkZWZpbmUgV0xBTkRYRV9JTlRfRVJSX1NSQ19BRERSRVNTICAgICAgV0xBTkRYRV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgKyAweDJDCisjZGVmaW5lIFdMQU5EWEVfSU5UX0NMUl9BRERSRVNTICAgICAgICAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHgzMAorI2RlZmluZSBXTEFORFhFX0lOVF9FRF9DTFJfQUREUkVTUyAgICAgICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4MzQKKyNkZWZpbmUgV0xBTkRYRV9JTlRfRE9ORV9DTFJfQUREUkVTUyAgICAgV0xBTkRYRV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgKyAweDM4CisjZGVmaW5lIFdMQU5EWEVfSU5UX0VSUl9DTFJfQUREUkVTUyAgICAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHgzQworCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NIX1BSRVNfQUREUkVTUyAgICAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHg0MAorI2RlZmluZSBXTEFORFhFX0FSQl9DSF9NU0tfQ0xSX0FERFJSRVNTICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4NzQKKworLyogQ2hhbm5lbCBDb3VudGVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NPVU5URVJfMCAgICAgICAgICAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHgyMDAKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ09VTlRFUl8xICAgICAgICAgICAgV0xBTkRYRV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgKyAweDIwNAorI2RlZmluZSBXTEFORFhFX0RNQV9DT1VOVEVSXzIgICAgICAgICAgICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4MjA4CisjZGVmaW5lIFdMQU5EWEVfRE1BX0NPVU5URVJfMyAgICAgICAgICAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHgyMEMKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ09VTlRFUl80ICAgICAgICAgICAgV0xBTkRYRV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgKyAweDIxMAorI2RlZmluZSBXTEFORFhFX0RNQV9DT1VOVEVSXzUgICAgICAgICAgICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4MjE0CisjZGVmaW5lIFdMQU5EWEVfRE1BX0NPVU5URVJfNiAgICAgICAgICAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHgyMTgKKworI2RlZmluZSBXTEFORFhFX0VOR0lORV9TVEFUX0FERFJFU1MgICAgICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4NjQKKyNkZWZpbmUgV0xBTkRYRV9CTVVfU0JfUURBVF9BVl9BRERSRVNTICAgV0xBTkRYRV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgKyAweDVjCisKKy8qIENoYW5uZWwgQmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NIQU4wX0JBU0VfQUREUkVTUyAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHg0MDAKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ0hBTjFfQkFTRV9BRERSRVNTICAgV0xBTkRYRV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgKyAweDQ0MAorI2RlZmluZSBXTEFORFhFX0RNQV9DSEFOMl9CQVNFX0FERFJFU1MgICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4NDgwCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NIQU4zX0JBU0VfQUREUkVTUyAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHg0QzAKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ0hBTjRfQkFTRV9BRERSRVNTICAgV0xBTkRYRV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgKyAweDUwMAorI2RlZmluZSBXTEFORFhFX0RNQV9DSEFONV9CQVNFX0FERFJFU1MgICBXTEFORFhFX1JFR0lTVEVSX0JBU0VfQUREUkVTUyArIDB4NTQwCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NIQU42X0JBU0VfQUREUkVTUyAgIFdMQU5EWEVfUkVHSVNURVJfQkFTRV9BRERSRVNTICsgMHg1ODAKKworLyogQ2hhbm5lbCBzcGVjaWZpYyByZWdpc3RlciBvZmZzZXQgKi8KKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ0hfQ1RSTF9SRUcgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NIX1NUQVRVU19SRUcgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTEFORFhFX0RNQV9DSF9TWl9SRUcgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ0hfU0FEUkxfUkVHICAgICAgICAgMHgwMDBDCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NIX1NBRFJIX1JFRyAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTEFORFhFX0RNQV9DSF9EQURSTF9SRUcgICAgICAgICAweDAwMTQKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ0hfREFEUkhfUkVHICAgICAgICAgMHgwMDE4CisjZGVmaW5lIFdMQU5EWEVfRE1BX0NIX0RFU0NMX1JFRyAgICAgICAgIDB4MDAxQworI2RlZmluZSBXTEFORFhFX0RNQV9DSF9ERVNDSF9SRUcgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ0hfTFNUX0RFU0NMX1JFRyAgICAgMHgwMDI0CisjZGVmaW5lIFdMQU5EWEVfRE1BX0NIX0xTVF9ERVNDSF9SRUcgICAgIDB4MDAyOAorI2RlZmluZSBXTEFORFhFX0RNQV9DSF9CRF9SRUcgICAgICAgICAgICAweDAwMkMKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ0hfSEVBRF9SRUcgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NIX1RBSUxfUkVHICAgICAgICAgIDB4MDAzNAorI2RlZmluZSBXTEFORFhFX0RNQV9DSF9QRFVfUkVHICAgICAgICAgICAweDAwMzgKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ0hfVFNUTVBfUkVHICAgICAgICAgMHgwMDNDCisKKy8qIENvbW1vbiBDU1IgUmVnaXN0ZXIgQ29udG9yb2wgbWFzayBhbmQgb2Zmc2V0ICovCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9SRVNFUlZFRF9NQVNLICAgICAgICAgMHhGRkZFMDAwMAorI2RlZmluZSBXTEFORFhFX0RNQV9DU1JfUkVTRVJWRURfT0ZGU0VUICAgICAgIDB4MTEKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ1NSX1JFU0VSVkVEX0RFRkFVTFQgICAgICAweDAKKworI2RlZmluZSBXTEFORFhFX0RNQV9DU1JfSDJIX1NZTkNfRU5fTUFTSyAgICAgIDB4MTAwMDAKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ1NSX0gySF9TWU5DX0VOX09GRlNFVCAgICAweDEwCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9IMkhfU1lOQ19FTl9ERUZBVUxUICAgMHgwCisKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ1NSX1BBVVNFRF9NQVNLICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ1NSX1BBVVNFRF9PRkZTRVQgICAgICAgICAweEYKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ1NSX1BBVVNFRF9ERUZBVUxUICAgICAgICAweDAKKworI2RlZmluZSBXTEFORFhFX0RNQV9DU1JfRUNUUl9FTl9NQVNLICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTEFORFhFX0RNQV9DU1JfRUNUUl9FTl9PRkZTRVQgICAgICAgIDB4RQorI2RlZmluZSBXTEFORFhFX0RNQV9DU1JfRUNUUl9FTl9ERUZBVUxUICAgICAgIDB4NDAwMAorCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9CMkhfVFNUTVBfT0ZGX01BU0sgICAgMHgzRTAwCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9CMkhfVFNUTVBfT0ZGX09GRlNFVCAgMHg5CisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9CMkhfVFNUTVBfT0ZGX0RFRkFVTFQgMHhFMDAKKworI2RlZmluZSBXTEFORFhFX0RNQV9DU1JfSDJCX1RTVE1QX09GRl9NQVNLICAgIDB4MUYwCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9IMkJfVFNUTVBfT0ZGX09GRlNFVCAgMHg0CisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9IMkJfVFNUTVBfT0ZGX0RFRkFVTFQgMHg1MAorCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9UU1RNUF9FTl9NQVNLICAgICAgICAgMHg4CisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9UU1RNUF9FTl9PRkZTRVQgICAgICAgMHgzCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9UU1RNUF9FTl9ERUZBVUxUICAgICAgMHgwCisKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ1NSX1JFU0VUX01BU0sgICAgICAgICAgICAweDQKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ1NSX1JFU0VUX09GRlNFVCAgICAgICAgICAweDIKKyNkZWZpbmUgV0xBTkRYRV9ETUFfQ1NSX1JFU0VUX0RFRkFVTFQgICAgICAgICAweDAKKworI2RlZmluZSBXTEFORFhFX0RNQV9DU1JfUEFVU0VfTUFTSyAgICAgICAgICAgIDB4MgorI2RlZmluZSBXTEFORFhFX0RNQV9DU1JfUEFVU0VfT0ZGU0VUICAgICAgICAgIDB4MQorI2RlZmluZSBXTEFORFhFX0RNQV9DU1JfUEFVU0VfREVGQVVMVCAgICAgICAgIDB4MAorCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9FTl9NQVNLICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9FTl9PRkZTRVQgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9FTl9ERUZBVUxUICAgICAgICAgICAgMHgwCisjZGVmaW5lIFdMQU5EWEVfRE1BX0NTUl9ERUZBVUxUICAgICAgICAgICAgICAgMHg0RTUwCisKKy8qIENoYW5uZWwgQ1RSTCBSZWdpc3RlciBDb250cm9sIG1hc2sgYW5kIG9mZnNldCAqLworI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfUlNWRF9NQVNLICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1JTVkRfT0ZGU0VUICAgICAgICAgICAweDFGCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9SU1ZEX0RFRkFVTFQgICAgICAgICAgMHgwCisKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1NXQVBfTUFTSyAgICAgICAgICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0JEVF9JRFhfTUFTSyAgICAgICAgICAweDYwMDAwMDAwCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9CRFRfSURYX09GRlNFVCAgICAgICAgMHgxRAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQkRUX0lEWF9ERUZBVUxUICAgICAgIDB4MAorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9ERk1UX01BU0sgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfREZNVF9PRkZTRVQgICAgICAgICAgIDB4MUMKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0RGTVRfREVGQVVMVCAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9ERk1UX0VTSE9SVCAgICAgICAgICAgMHgwCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9ERk1UX0VMT05HICAgICAgICAgICAgMHgxCisKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0FCT1JUX01BU0sgICAgICAgICAgICAweDgwMDAwMDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0FCT1JUX09GRlNFVCAgICAgICAgICAweDFCCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9BQk9SVF9ERUZBVUxUICAgICAgICAgMHgwCisKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0VORElBTl9NQVNLICAgICAgICAgICAweDQwMDAwMDAKKworI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQ1RSX1NFTF9NQVNLICAgICAgICAgIDB4M0MwMDAwMAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQ1RSX1NFTF9PRkZTRVQgICAgICAgIDB4MTYKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0NUUl9TRUxfREVGQVVMVCAgICAgICAweDAKKworI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfRURWRU5fTUFTSyAgICAgICAgICAgIDB4MjAwMDAwCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9FRFZFTl9PRkZTRVQgICAgICAgICAgMHgxNQorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfRURWRU5fREVGQVVMVCAgICAgICAgIDB4MAorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9FREVOX01BU0sgICAgICAgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0VERU5fT0ZGU0VUICAgICAgICAgICAweDE0CisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9FREVOX0RFRkFVTFQgICAgICAgICAgMHgwCisKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0lORV9ET05FX01BU0sgICAgICAgICAweDgwMDAwCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9JTkVfRE9ORV9PRkZTRVQgICAgICAgMHgxMworI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfSU5FX0RPTkVfREVGQVVMVCAgICAgIDB4MAorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9JTkVfRVJSX01BU0sgICAgICAgICAgMHg0MDAwMAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfSU5FX0VSUl9PRkZTRVQgICAgICAgIDB4MTIKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0lORV9FUlJfREVGQVVMVCAgICAgICAweDAKKworI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfSU5FX0VEX01BU0sgICAgICAgICAgIDB4MjAwMDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0lORV9FRF9PRkZTRVQgICAgICAgICAweDExCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9JTkVfRURfREVGQVVMVCAgICAgICAgMHgwCisKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1NUT1BfTUFTSyAgICAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9TVE9QX09GRlNFVCAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfU1RPUF9ERUZBVUxUICAgICAgICAgIDB4MAorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9QUklPX01BU0sgICAgICAgICAgICAgMHhFMDAwCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9QUklPX09GRlNFVCAgICAgICAgICAgMHhECisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9QUklPX0RFRkFVTFQgICAgICAgICAgMHgwCisKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0JUSExEX1NFTF9NQVNLICAgICAgICAweDFFMDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0JUSExEX1NFTF9PRkZTRVQgICAgICAweDkKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0JUSExEX1NFTF9ERUZBVUxUICAgICAweDYwMAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VSU1ZEMCAgICAgIDB4MAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VSU1ZEMSAgICAgIDB4MQorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VUSExEMiAgICAgIDB4MgorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VUSExEMyAgICAgIDB4MworI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VUSExENCAgICAgIDB4NAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VUSExENSAgICAgIDB4NQorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VUSExENiAgICAgIDB4NgorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VUSExENyAgICAgIDB4NworI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VUSExEOCAgICAgIDB4OAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VUSExEOSAgICAgIDB4OQorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VUSExEMTAgICAgIDB4QQorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VSU1ZEMTEgICAgIDB4QgorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VSU1ZEMTIgICAgIDB4QworI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VSU1ZEMTMgICAgIDB4RAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VSU1ZEMTQgICAgIDB4RQorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQlRITERfU0VMX0VSU1ZEMTUgICAgIDB4RgorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9QRFVfUkVMX01BU0sgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1BEVV9SRUxfT0ZGU0VUICAgICAgICAweDgKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1BEVV9SRUxfREVGQVVMVCAgICAgICAweDEwMAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfUERVX1JFTF9FS0VFUCAgICAgICAgIDB4MAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfUERVX1JFTF9FUkVMRUFTRSAgICAgIDB4MQorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9QSVFfTUFTSyAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfUElRX09GRlNFVCAgICAgICAgICAgIDB4NworI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfUElRX0RFRkFVTFQgICAgICAgICAgIDB4MAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfUElRX0VGTEFUICAgICAgICAgICAgIDB4MAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfUElRX0VRVUVVRSAgICAgICAgICAgIDB4MQorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9ESVFfTUFTSyAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfRElRX09GRlNFVCAgICAgICAgICAgIDB4NgorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfRElRX0RFRkFVTFQgICAgICAgICAgIDB4MAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfRElRX0VGTEFUICAgICAgICAgICAgIDB4MAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfRElRX0VRVUVVRSAgICAgICAgICAgIDB4MQorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9TSVFfTUFTSyAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfU0lRX09GRlNFVCAgICAgICAgICAgIDB4NQorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfU0lRX0RFRkFVTFQgICAgICAgICAgIDB4MAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfU0lRX0VGTEFUICAgICAgICAgICAgIDB4MAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfU0lRX0VRVUVVRSAgICAgICAgICAgIDB4MQorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9CREhfTUFTSyAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQkRIX09GRlNFVCAgICAgICAgICAgIDB4NAorI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfQkRIX0RFRkFVTFQgICAgICAgICAgIDB4MAorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9FT1BfTUFTSyAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9FT1BfT0ZGU0VUICAgICAgICAgICAgMHgzCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9FT1BfREVGQVVMVCAgICAgICAgICAgMHg4CisKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1hUWVBFX01BU0sgICAgICAgICAgICAweDYKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1hUWVBFX09GRlNFVCAgICAgICAgICAweDEKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1hUWVBFX0RFRkFVTFQgICAgICAgICAweDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1hUWVBFX0VIMkggICAgICAgICAgICAweDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1hUWVBFX0VCMkIgICAgICAgICAgICAweDEKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1hUWVBFX0VIMkIgICAgICAgICAgICAweDIKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX1hUWVBFX0VCMkggICAgICAgICAgICAweDMKKworI2RlZmluZSBXTEFORFhFX0NIX0NUUkxfRE9ORV9NQVNLICAgICAgICAgICAgIDB4NAorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9FUlJfTUFTSyAgICAgICAgICAgICAgMHgyMAorCisjZGVmaW5lIFdMQU5EWEVfQ0hfQ1RSTF9NQVNLRURfTUFTSyAgICAgICAgICAgMHg4CisKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0VOX01BU0sgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0VOX09GRlNFVCAgICAgICAgICAgICAweDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0VOX0RFRkFVTFQgICAgICAgICAgICAweDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9DVFJMX0RFRkFVTFQgICAgICAgICAgICAgICAweDEwMDAwNzA4CisKKworI2RlZmluZSBXTEFORFhFX0RFU0NfQ1RSTF9WQUxJRCAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFdMQU5EWEVfREVTQ19DVFJMX1hUWVBFX01BU0sgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgV0xBTkRYRV9ERVNDX0NUUkxfWFRZUEVfSDJIICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBXTEFORFhFX0RFU0NfQ1RSTF9YVFlQRV9CMkIgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFdMQU5EWEVfREVTQ19DVFJMX1hUWVBFX0gyQiAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgV0xBTkRYRV9ERVNDX0NUUkxfWFRZUEVfQjJIICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBXTEFORFhFX0RFU0NfQ1RSTF9FT1AgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFdMQU5EWEVfREVTQ19DVFJMX0JESCAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgV0xBTkRYRV9ERVNDX0NUUkxfU0lRICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBXTEFORFhFX0RFU0NfQ1RSTF9ESVEgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFdMQU5EWEVfREVTQ19DVFJMX1BJUSAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgV0xBTkRYRV9ERVNDX0NUUkxfUERVX1JFTCAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBXTEFORFhFX0RFU0NfQ1RSTF9CVEhMRF9TRUwgICAgICAweDAwMDAxRTAwCisjZGVmaW5lIFdMQU5EWEVfREVTQ19DVFJMX1BSSU8gICAgICAgICAgIDB4MDAwMEUwMDAKKyNkZWZpbmUgV0xBTkRYRV9ERVNDX0NUUkxfU1RPUCAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBXTEFORFhFX0RFU0NfQ1RSTF9JTlQgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFdMQU5EWEVfREVTQ19DVFJMX0JEVF9TV0FQICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgV0xBTkRYRV9ERVNDX0NUUkxfRU5ESUFOTkVTUyAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBXTEFORFhFX0RFU0NfQ1RSTF9ERk1UICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIFdMQU5EWEVfREVTQ19DVFJMX1JTVkQgICAgICAgICAgIDB4ZmZmYzAwMDAKKy8qIENTUiBSZWdpc3RlciBDb250cm9sIG1hc2sgYW5kIG9mZnNldCAqLworCisjZGVmaW5lIFdMQU5EWEVfQ0hfU1RBVF9JTlRfRE9ORV9NQVNLICAgMHgwMDAwODAwMAorI2RlZmluZSBXTEFORFhFX0NIX1NUQVRfSU5UX0VSUl9NQVNLICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgV0xBTkRYRV9DSF9TVEFUX0lOVF9FRF9NQVNLICAgICAweDAwMDAyMDAwCisKKyNkZWZpbmUgV0xBTkRYRV9DSF9TVEFUX01BU0tFRF9NQVNLICAgICAweDAwMDAwMDA4CisvKiBUaWxsIGhlcmUgUklWQSBEWEUgcmVnaXN0ZXIgaW5mb3JtYXRpb24KKyAqIFRoaXMgaXMgdGVtcG9yYXJ5IGRlZmluaXRpb24gbG9jYXRpb24gdG8gbWFrZSBjb21waWxlIGFuZCB1bml0IHRlc3QKKyAqIElmIG9mZmljaWFsIG1zbXJlZy5oIGludGVncmF0ZWQsIHRoaXMgcGFydCB3aWxsIGJlIGVsaW1pbmF0ZWQgKi8KKworLyogSW50ZXJydXB0IGNvbnRyb2wgY2hhbm5lbCBtYXNrICovCisjZGVmaW5lIFdMQU5EWEVfSU5UX01BU0tfQ0hBTl8wICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgV0xBTkRYRV9JTlRfTUFTS19DSEFOXzEgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBXTEFORFhFX0lOVF9NQVNLX0NIQU5fMiAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFdMQU5EWEVfSU5UX01BU0tfQ0hBTl8zICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgV0xBTkRYRV9JTlRfTUFTS19DSEFOXzQgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBXTEFORFhFX0lOVF9NQVNLX0NIQU5fNSAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFdMQU5EWEVfSU5UX01BU0tfQ0hBTl82ICAgICAgICAgIDB4MDAwMDAwNDAKKworI2RlZmluZSBXTEFORFhFX1RYX0xPV19SRVNfVEhSRVNIT0xEICAgICAoNSkKKworLyogRFhFIERlc2NyaXB0b3IgRW5kaWFuIHN3YXAgbWFjcm8gKi8KKyNpZmRlZiBXTEFORFhFX0VORElBTl9TV0FQX0VOQUJMRQorI2RlZmluZSBXTEFORFhFX1UzMl9TV0FQX0VORElBTihhKSAoKChhICYgMHgwMDAwMDBGRikgPDwgMjQpIHwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhICYgMHgwMDAwRkYwMCkgPDwgOCkgIHwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhICYgMHgwMEZGMDAwMCkgPj4gOCkgIHwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhICYgMHhGRjAwMDAwMCkgPj4gMjQpKQorI2Vsc2UKKy8qIElmIERYRSBIVyBkb2VzIG5vdCBuZWVkIGVuZGlhbiBzd2FwLCBETyBOT1RISU5HICovCisjZGVmaW5lIFdMQU5EWEVfVTMyX1NXQVBfRU5ESUFOKGEpIChhKQorI2VuZGlmIC8qIFdMQU5EWEVfRU5ESUFOX1NXQVBfRU5BQkxFICovCisKKy8qIExvZyBEZWZpbml0aW9uIHdpbGwgYmUgbWFwcHBlZCB3aXRoIFBBTCBNU0cgKi8KKyNkZWZpbmUgSERYRV9NU0cgICAgICAgICAgICAgICAgICAgICBXUEFMX1RSQUNFCisjZGVmaW5lIEhEWEVfQVNTRVJUKGEpICAgICAgICAgICAgICAgVk9TX0FTU0VSVChhKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBETUEgQ2hhbm5lbCBRIGhhbmRsZSBNZXRob2QgdHlwZQorICAqIExpbmVhciBoYW5kbGUgb3IgY2lyY3VsYXIgKi8KK3R5cGVkZWYgZW51bQoreworICAgV0xBTkRYRV9DSEFOTkVMX0hBTkRMRV9MSU5FQVIsCisgICBXTEFORFhFX0NIQU5ORUxfSEFORExFX0NJUkNVTEEKK31XTEFORFhFX0NoYW5uZWxIYW5kbGVUeXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgIFdMQU5EWEVfVFhfQ09NUF9JTlRfTFJfVEhSRVNIT0xELAorICAgV0xBTkRYRV9UWF9DT01QX0lOVF9QRVJfS19GUkFNRVMsCisgICBXTEFORFhFX1RYX0NPTVBfSU5UX1RJTUVSCit9IFdMQU5EWEVfVFhDb21wSW50RW5hYmxlVHlwZTsKKwordHlwZWRlZiBlbnVtCit7CisgICBXTEFORFhFX1NIT1JUX0RFU0NSSVBUT1IsCisgICBXTEFORFhFX0xPTkdfREVTQ1JJUFRPUgorfSBXTEFORFhFX0Rlc2NyaXB0b3JUeXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgIFdMQU5EWEVfRE1BX0NIQU5ORUxfMCwKKyAgIFdMQU5EWEVfRE1BX0NIQU5ORUxfMSwKKyAgIFdMQU5EWEVfRE1BX0NIQU5ORUxfMiwKKyAgIFdMQU5EWEVfRE1BX0NIQU5ORUxfMywKKyAgIFdMQU5EWEVfRE1BX0NIQU5ORUxfNCwKKyAgIFdMQU5EWEVfRE1BX0NIQU5ORUxfNSwKKyAgIFdMQU5EWEVfRE1BX0NIQU5ORUxfNiwKKyAgIFdMQU5EWEVfRE1BX0NIQU5ORUxfTUFYCit9IFdMQU5EWEVfRE1BQ2hhbm5lbFR5cGU7CisKKy8qKiBEWEUgSFcgTG9uZyBEZXNjcmlwdG9yIGZvcm1hdCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgc3JjTWVtQWRkckw7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIHNyY01lbUFkZHJIOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBkc3RNZW1BZGRyTDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgZHN0TWVtQWRkckg7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIHBoeU5leHRMOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBwaHlOZXh0SDsKK30gV0xBTkRYRV9Mb25nRGVzYzsKKworCisvKiogRFhFIEhXIFNob3J0IERlc2NyaXB0b3IgZm9ybWF0ICovCit0eXBlZGVmIHN0cnVjdCB0RFhFU2hvcnREZXNjCit7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIHNyY01lbUFkZHJMOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBkc3RNZW1BZGRyTDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgcGh5TmV4dEw7Cit9IFdMQU5EWEVfU2hvcnREZXNjOworCisKKy8qIERYRSBEZXNjcmlwdG9yIERhdGEgVHlwZQorICAqIFBpY2sgdXAgZnJvbSBHRU41ICovCit0eXBlZGVmIHN0cnVjdAoreworICAgdW5pb24KKyAgIHsKKyAgICAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgY3RybDsKKyAgICAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgdmFsaWQgICAgICAgICAgOjE7ICAgICAvLzAgPSBETUEgc3RvcCwgMSA9IERNQSBjb250aW51ZSB3aXRoIHRoaXMgZGVzY3JpcHRvcgorICAgICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUgICA6MjsgICAgIC8vMCA9IEhvc3QgdG8gSG9zdCBzcGFjZQorICAgICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICBlb3AgICAgICAgICAgICA6MTsgICAgIC8vRW5kIG9mIFBhY2tldAorICAgICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICBiZEhhbmRsaW5nICAgICA6MTsgICAgICAgICAgLy9pZiB0cmFuc2ZlclR5cGUgPSBIb3N0IHRvIEJNVSwgdGhlbiAwIG1lYW5zIGZpcnN0IDEyOCBieXRlcyBjb250YWluIEJELCBhbmQgMSBtZWFucyBjcmVhdGUgbmV3IGVtcHR5IEJECisgICAgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgIHNpcSAgICAgICAgICAgIDoxOyAgICAgLy8gU0lRCisgICAgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgIGRpcSAgICAgICAgICAgIDoxOyAgICAgLy8gRElRCisgICAgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgIHBkdVJlbCAgICAgICAgIDoxOyAgICAgLy8wID0gZG9uJ3QgcmVsZWFzZSBCRCBhbmQgUERVcyB3aGVuIGRvbmUsIDEgPSByZWxlYXNlIHRoZW0KKyAgICAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgYnRobGRTZWwgICAgICAgOjQ7ICAgICAvL0JNVSBUaHJlc2hvbGQgU2VsZWN0CisgICAgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgIHByaW8gICAgICAgICAgIDozOyAgICAgLy9TcGVjaWZpZXMgdGhlIHByaW9yaXR5IGxldmVsIHRvIHVzZSBmb3IgdGhlIHRyYW5zZmVyCisgICAgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgIHN0b3BDaGFubmVsICAgIDoxOyAgICAgLy8xID0gRE1BIHN0b3BzIHByb2Nlc3NpbmcgZnVydGhlciwgY2hhbm5lbCByZXF1aXJlcyByZS1lbmFibGluZyBhZnRlciB0aGlzCisgICAgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgIGludHIgICAgICAgICAgIDoxOyAgICAgLy9JbnRlcnJ1cHQgb24gRGVzY3JpcHRvciBEb25lCisgICAgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgIHJzdmQgICAgICAgICAgIDoxOyAgICAgLy9yZXNlcnZlZAorICAgICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICB0cmFuc2ZlclNpemUgICA6MTQ7ICAgIC8vMTQgYml0cyB1c2VkIC0gaWdub3JlZCBmb3IgQk1VIHRyYW5zZmVycywgb25seSB1c2VkIGZvciBob3N0IHRvIGhvc3QgdHJhbnNmZXJzPworICAgfSBkZXNjQ3RybDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgeGZyU2l6ZTsKKyAgIHVuaW9uCisgICB7CisgICAgICBXTEFORFhFX0xvbmdEZXNjICAgICAgICAgICAgIGR4ZV9sb25nX2Rlc2M7CisgICAgICBXTEFORFhFX1Nob3J0RGVzYyAgICAgICAgICAgIGR4ZV9zaG9ydF9kZXNjOworICAgfWR4ZWRlc2M7IAorfSBXTEFORFhFX0Rlc2NUeXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmV4dEN0cmxCbGs7CisgICB3cHRfcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICp4ZnJGcmFtZTsgIAorICAgV0xBTkRYRV9EZXNjVHlwZSAgICAgICAgICAgICAgICAqbGlua2VkRGVzYzsKKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgbGlua2VkRGVzY1BoeUFkZHI7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgICBjdHJsQmxrT3JkZXI7CisjaWZkZWYgRkVBVFVSRV9SMzNECisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dCdWZmZXJWYTsKKyNlbmRpZiAvKiBGRUFUVVJFX1IzM0QgKi8KK30gV0xBTkRYRV9EZXNjQ3RybEJsa1R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAvKiBRIGhhbmRsZSBtZXRob2QsIGxpbmVhciBvciByaW5nICovCisgICBXTEFORFhFX0NoYW5uZWxIYW5kbGVUeXBlICAgICAgIHF1ZXVlTWV0aG9kOworCisgICAvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgZm9yIERYRSB0aGF0IGNhbiBiZSBxdWV1ZWQgZm9yIHRyYW5zZmVyIGF0IG9uZSB0aW1lICovCisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIG5EZXNjczsKKworICAgLyogTWF4aW11bSBudW1iZXIgb2YgcmVjZWl2ZSBidWZmZXJzICBvZiBzaGFyZWQgbWVtb3J5IHRvIHVzZSBmb3IgdGhpcyBwaXBlICovCisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIG5SeEJ1ZmZlcnM7CisKKyAgIC8qIFJlZmVyZW5jZSBXUSAtIGZvciBIMkIgYW5kIEIySCBvbmx5ICovCisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIHJlZldROworCisgICAvKiBmb3IgdXNiIG9ubHksIGVuZHBvaW50IGluZm8gZm9yIENIX1NBRFIgb3IgQ0hfREFEUiAqLworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICByZWZFUDsKKworICAgLyogSDJCKFR4KSwgQjJIKFJ4KSwgSDJIKFNSQU08LT5Ib3N0TWVtIFIvVykgKi8KKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgeGZyVHlwZTsKKworICAgLyogQ2hhbm5lbCBQcmlvcml0eSA3KEhpZ2hlc3QpIC0gMChMb3dlc3QpICovCisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGNoUHJpb3JpdHk7CisKKyAgIC8qIDEgPSBCRCBhdHRhY2hlZCB0byBmcmFtZXMgZm9yIHRoaXMgcGlwZSAqLworICAgd3B0X2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICBiZFByZXNlbnQ7CisKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgY2hrX3NpemU7CisKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgYm11VGhkU2VsOworCisgICAvKiAgQWRkZWQgaW4gR2VuNSBmb3IgUHJlZmV0Y2ggKi8KKyAgIHdwdF9ib29sZWFuICAgICAgICAgICAgICAgICAgICAgdXNlTG93ZXI0RzsKKworICAgd3B0X2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICB1c2VTaG9ydERlc2NGbXQ7CisgICAvKiBUaWxsIGhlcmUgaW5oYXJpdGVkIGZyb20gR0VONSBjb2RlICovCisgICAvKiBGcm9tIG5vdyBvbiwgYWRkZWQgZm9yIFBSSU1BICAqLworfSBXTEFORFhFX0NoYW5uZWxDb25maWdUeXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBjaERYRUJhc2VBZGRyOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBjaERYRVN0YXR1c1JlZ0FkZHI7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGNoRFhFRGVzY2xSZWdBZGRyOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBjaERYRURlc2NoUmVnQWRkcjsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgY2hEWEVMc3REZXNjbFJlZ0FkZHI7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGNoRFhFQ3RybFJlZ0FkZHI7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGNoRFhFU3pSZWdBZGRyOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBjaERYRURhZHJsUmVnQWRkcjsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgY2hEWEVEYWRyaFJlZ0FkZHI7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGNoRFhFU2FkcmxSZWdBZGRyOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBjaERYRVNhZHJoUmVnQWRkcjsKK30gV0xBTkRYRV9DaGFubmVsUmVnaXN0ZXJUeXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICByZWZXUV9zd2FwcGVkOworICAgd3B0X2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICBjaEVuYWJsZWQ7CisgICB3cHRfYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgIGNoQ29uZmlndXJlZDsgICAgCisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGNoa19zaXplX21hc2s7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGJtdVRoZFNlbF9tYXNrOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBjd19jdHJsX3JlYWQ7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGN3X2N0cmxfd3JpdGU7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGN3X2N0cmxfd3JpdGVfdmFsaWQ7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGN3X2N0cmxfd3JpdGVfZW9wOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBjd19jdHJsX3dyaXRlX2VvcF9pbnQ7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGNoYW5fbWFzazsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgY2hhbl9tYXNrX3JlYWRfZGlzYWJsZTsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgaW50TWFzazsKK30gV0xBTkRYRV9DaGFubmVsRXhDb25maWdUeXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgV0RUU19DaGFubmVsVHlwZSAgICAgICAgICAgICAgICBjaGFubmVsVHlwZTsKKyAgIFdMQU5EWEVfRGVzY0N0cmxCbGtUeXBlICAgICAgICAqaGVhZEN0cmxCbGs7CisgICBXTEFORFhFX0Rlc2NDdHJsQmxrVHlwZSAgICAgICAgKnRhaWxDdHJsQmxrOworI2lmICEoZGVmaW5lZChGRUFUVVJFX1IzM0QpIHx8IGRlZmluZWQoV0xBTkRYRV9URVNUX0NIQU5ORUxfRU5BQkxFKSkKKyAgIFdMQU5EWEVfRGVzY1R5cGUgICAgICAgICAgICAgICAqZGVzY3JpcHRvckFsbG9jYXRpb247CisjZW5kaWYKKyAgIFdMQU5EWEVfRGVzY1R5cGUgICAgICAgICAgICAgICAqRGVzY0JvdHRvbUxvYzsKKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgZGVzY0JvdHRvbUxvY1BoeUFkZHI7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIG51bURlc2M7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIG51bUZyZWVEZXNjOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBudW1Sc3ZkRGVzYzsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgbWF4RnJhbWVTaXplOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICBudW1GcmFnbWVudEN1cnJlbnRDaGFpbjsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVCZWZvcmVJbnQ7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIG51bVRvdGFsRnJhbWU7CisgICB3cHRfbXV0ZXggICAgICAgICAgICAgICAgICAgICAgIGR4ZUNoYW5uZWxMb2NrOworICAgd3B0X2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICBoaXRMb3dSZXNvdXJjZTsKKyAgIFdMQU5EWEVfQ2hhbm5lbENvbmZpZ1R5cGUgICAgICAgY2hhbm5lbENvbmZpZzsKKyAgIFdMQU5EWEVfQ2hhbm5lbFJlZ2lzdGVyVHlwZSAgICAgY2hhbm5lbFJlZ2lzdGVyOworICAgV0xBTkRYRV9DaGFubmVsRXhDb25maWdUeXBlICAgICBleHRyYUNvbmZpZzsKKyAgIFdMQU5EWEVfRE1BQ2hhbm5lbFR5cGUgICAgICAgICAgYXNzaWduZWRETUFDaGFubmVsOworICAgd3B0X3VpbnQ2NCAgICAgICAgICAgICAgICAgICAgICByeERvbmVIaXN0b2dyYW07Cit9IFdMQU5EWEVfQ2hhbm5lbENCVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIFdMQU5EWEVfVFhDb21wSW50RW5hYmxlVHlwZSAgICAgdHhJbnRFbmFibGU7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIHR4TG93UmVzb3VyY2VUaHJlc2hvbGRfTG9QcmlDaDsKKyAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgdHhMb3dSZXNvdXJjZVRocmVzaG9sZF9IaVByaUNoOworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICByeExvd1Jlc291cmNlVGhyZXNob2xkOworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICB0eEludGVycnVwdEVuYWJsZUZyYW1lQ291bnQ7CisgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIHR4SW50ZXJydXB0RW5hYmxlUGVyaW9kOworfSBXTEFORFhFX1R4Q29tcEludENvbmZpZ1R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAgICAgICAgIGR4ZUNoYW5uZWxbV0RUU19DSEFOTkVMX01BWF07CisgICBXTEFORFhFX1J4RnJhbWVSZWFkeUNiVHlwZSAgICAgIHJ4UmVhZHlDQjsKKyAgIFdMQU5EWEVfVHhDb21wbGV0ZUNiVHlwZSAgICAgICAgdHhDb21wQ0I7CisgICBXTEFORFhFX0xvd1Jlc291cmNlQ2JUeXBlICAgICAgIGxvd1Jlc291cmNlQ0I7CisgICBXTEFORFhFX1R4Q29tcEludENvbmZpZ1R5cGUgICAgIHR4Q29tcEludDsKKyAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2xpZW50Q3R4dDsKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0UGF0aDsKKyAgIHdwdF9tc2cgICAgICAgICAgICAgICAgICAgICAgICAqcnhJc3JNc2c7CisgICB3cHRfbXNnICAgICAgICAgICAgICAgICAgICAgICAgKnR4SXNyTXNnOworICAgd3B0X21zZyAgICAgICAgICAgICAgICAgICAgICAgICpyeFBrdEF2YWlsTXNnOyAgIAorICAgdm9sYXRpbGUgV0xBTkRYRV9Qb3dlclN0YXRlVHlwZSBob3N0UG93ZXJTdGF0ZTsKKyAgIHdwdF9ib29sZWFuICAgICAgICAgICAgICAgICAgICAgcnhJbnREaXNhYmxlZEJ5SU1QUzsKKyAgIHdwdF9ib29sZWFuICAgICAgICAgICAgICAgICAgICAgdHhJbnREaXNhYmxlZEJ5SU1QUzsKKyAgIFdMQU5EWEVfU2V0UG93ZXJTdGF0ZUNiVHlwZSAgICAgc2V0UG93ZXJTdGF0ZUNiOworICAgdm9sYXRpbGUgV0xBTkRYRV9SaXZhUG93ZXJTdGF0ZVR5cGUgcml2YVBvd2VyU3RhdGU7CisgICB3cHRfYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgIHJpbmdOb3RFbXB0eTsgCisgICB3cHRfYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgIHR4SW50RW5hYmxlOworICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICB0eENvbXBsZXRlZEZyYW1lczsgCisgICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgICAgIHVjVHhNc2dDbnQ7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgICBsYXN0S2lja09mZkR4ZTsgCisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgIGR4ZUNvb2tpZTsKKyAgIHdwdF9wYWNrZXQgICAgICAgICAgICAgICAgICAgICAqZnJlZVJYUGFja2V0OworICAgd3B0X2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICByeFBhbFBhY2tldFVuYXZhaWxhYmxlOworfSBXTEFORFhFX0N0cmxCbGtUeXBlOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICBkeGVDb21tb25EZWZhdWx0Q29uZmlnCisKKyAgQCAgRGVzY3JpcHRpb24gCisKKyAgQCAgUGFyYW1ldGVycworICAgICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhFIGhvc3QgZHJpdmVyIG1haW4gY29udHJvbCBibG9jaworCisgIEAgIFJldHVybgorICAgICAgd3B0X3N0YXR1cworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworZXh0ZXJuIHdwdF9zdGF0dXMgZHhlQ29tbW9uRGVmYXVsdENvbmZpZworKAorICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGsKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQCAgRnVuY3Rpb24gTmFtZSAKKyAgICAgIGR4ZUNoYW5uZWxEZWZhdWx0Q29uZmlnCisKKyAgQCAgRGVzY3JpcHRpb24gCisgICAgICBHZXQgZGVmdWFsdCBjb25maWd1cmF0aW9uIHZhbHVlcyBmcm9tIHByZSBkZWZpbmVkIHN0cnVjdHVyZQorICAgICAgQWxsIHRoZSBjaGFubmVscyBtdXN0IGhhdmUgaXQncyBvd24gY29uZmlndXJhdGlvbnMKKworICBAICBQYXJhbWV0ZXJzCisgICAgICBXTEFORFhFX0N0cmxCbGtUeXBlICAgICAqZHhlQ3RybEJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWEUgaG9zdCBkcml2ZXIgbWFpbiBjb250cm9sIGJsb2NrCisgICAgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbCBzcGVjaWZpYyBjb250cm9sIGJsb2NrCisKKyAgQCAgUmV0dXJuCisgICAgICB3cHRfc3RhdHVzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gd3B0X3N0YXR1cyBkeGVDaGFubmVsRGVmYXVsdENvbmZpZworKAorICAgV0xBTkRYRV9DdHJsQmxrVHlwZSAgICAgKmR4ZUN0cmxCbGssCisgICBXTEFORFhFX0NoYW5uZWxDQlR5cGUgICAqY2hhbm5lbEVudHJ5CispOworCisjZW5kaWYgLyogV0xBTl9RQ1RfRFhFX0lfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvaW5jL2JhcF9oZGRfbWFpbi5oIGIvQ09SRS9IREQvaW5jL2JhcF9oZGRfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMGE3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9pbmMvYmFwX2hkZF9tYWluLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggQkFQX0hERF9NQUlOX0ggKQorI2RlZmluZSBCQVBfSEREX01BSU5fSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBCQVBfSEREX01BSU5fSC5oCisgIAorICBcYnJpZWYgTGludXggSEREIEFkYXB0ZXIgVHlwZQorICAgICAgICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuCisgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgSW5jbHVkZSBmaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIAorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPHZvc19saXN0Lmg+CisjaW5jbHVkZSA8dm9zX3R5cGVzLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBCU0xfTUFYX0NMSUVOVFMgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJTTF9NQVhfUEhZX0xJTktfUEVSX0NMSUVOVCAgIDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgQlNMX0luaXQoKSAtIEluaXRpYWxpemUgdGhlIEJTTCBNaXNjIGNoYXIgZHJpdmVyCisgIAorICBUaGlzIGlzIGNhbGxlZCBpbiBieSBXTEFOQkFQX09wZW4oKSBhcyBwYXJ0IG9mIGJyaW5naW5nIHVwIHRoZSBCVC1BTVAgUEFMIChCQVApCisgIFdMQU5CQVBfT3BlbigpIHdpbGwgcGFzcyBpbiB0aGUgZGV2aWNlIGNvbnRleHQgY3JlYXRlZC4KKyAgCisgIFxwYXJhbSAgLSBOQQorICAKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAgICAgICAgICAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBCU0xfSW5pdCAodm9pZCAqcEN0eCk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIEJTTF9EZWluaXQoKSAtIERlLWluaXRpYWxpemUgdGhlIEJTTCBNaXNjIGNoYXIgZHJpdmVyCisgIAorICBUaGlzIGlzIGNhbGxlZCBpbiBieSBXTEFOQkFQX0Nsb3NlKCkgYXMgcGFydCBvZiBicmluZ2luZyBkb3duIHRoZSBCVC1BTVAgUEFMIChCQVApCisgIAorICBccGFyYW0gIC0gTkEKKyAgCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgICAgICAgICAgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBCU0xfRGVpbml0KHZvaWQgKnBDdHgpOworCisKKworI2VuZGlmICAgIC8vIGVuZCAjaWYgIWRlZmluZWQoIEJBUF9IRERfTUFJTl9IICkKZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy9iYXBfaGRkX21pc2MuaCBiL0NPUkUvSEREL2luYy9iYXBfaGRkX21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTkyYmRlCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvaW5jL2JhcF9oZGRfbWlzYy5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBCQVBfSEREX01JU0NfSCApCisjZGVmaW5lIEJBUF9IRERfTUlTQ19ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIEJBUF9IRERfTUlTQy5oCisgIAorICBcYnJpZWYgTGludXggSEREIEFkYXB0ZXIgVHlwZQorICAgICAgICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuCisgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgSW5jbHVkZSBmaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIAorI2luY2x1ZGUgPGJhcEFwaS5oPgorI2luY2x1ZGUgPHZvc190eXBlcy5oPgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgV0xBTkJBUF9TZXRDb25maWcoKSAtIFRvIHVwZGF0ZXMgc29tZSBjb25maWd1cmF0aW9uIGZvciBCQVAgbW9kdWxlIGluCisgIFNNRQorICAKKyAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFdMQU5CQVBfU3RhcnQoKS4KKyAgCisgIFxwYXJhbSAgLSBOQQorICAKKyAgXHJldHVybiAtCisgICAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRTogIGZhaWxlZCB0byBzZXQgdGhlIGNvbmZpZyBpbiBTTUUgQkFQIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKworICAgICAgICAgICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBXTEFOQkFQX1NldENvbmZpZworKAorICAgIFdMQU5CQVBfQ29uZmlnVHlwZSAqcENvbmZpZworKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgV0xBTkJBUF9SZWdpc3RlcldpdGhIQ0koKSAtIFRvIHJlZ2lzdGVyIFdMQU4gUEFMIHdpdGggSENJCisgIAorICAKKyAgXHBhcmFtCisgICBwQWRhcHRlciA6IEhERCBhZGFwdGVyCisgIAorICBccmV0dXJuIC0KKyAgICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiAgZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggSENJIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKworICAgICAgICAgICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBXTEFOQkFQX1JlZ2lzdGVyV2l0aEhDSShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIFdMQU5CQVBfRGVyZWdpc3RlckZyb21IQ0koKSAtIFRvIGRlcmVnaXN0ZXIgV0xBTiBQQUwgd2l0aCBIQ0kKKyAgCisgIAorICBccGFyYW0gLSBOQQorICAKKyAgXHJldHVybiAtCisgICAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRTogIGZhaWxlZCB0byBkZXJlZ2lzdGVyIHdpdGggSENJIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKworICAgICAgICAgICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBXTEFOQkFQX0RlcmVnaXN0ZXJGcm9tSENJKHZvaWQpOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBXTEFOQkFQX1N0b3BBbXAoKSAtIFRvIHN0b3AgdGhlIGN1cnJlbnQgQU1QIHRyYWZmaWMvY29ubmVjdGlvbgorICAKKyAgCisgIFxwYXJhbSAtIE5BCisgIAorICBccmV0dXJuIC0KKyAgICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiAgZmFpbGVkIHRvIHN0b3AgQU1QIGNvbm5lY3Rpb24gCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworCisgICAgICAgICAgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIFdMQU5CQVBfU3RvcEFtcCh2b2lkKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgV0xBTkJBUF9BbXBTZXNzaW9uT24oKSAtIFRvIGNoZWNrIGlmIEFNUCBjb25uZWN0aW9uIGlzIG9uIGN1cnJlbnRseQorICAKKyAgCisgIFxwYXJhbSAtIE5BCisgIAorICBccmV0dXJuIC0KKyAgICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19UUlVFOiAgQU1QIGNvbm5lY3Rpb24gaXMgb24gCisgICAgVk9TX0ZBTFNFOiBBTVAgY29ubmVjdGlvbiBpcyBub3Qgb24KKworICAgICAgICAgICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9CT09MX3QgV0xBTkJBUF9BbXBTZXNzaW9uT24odm9pZCk7CisjZW5kaWYgICAgLy8gZW5kICNpZiAhZGVmaW5lZCggQkFQX0hERF9NSVNDX0ggKQpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvaW5jL3FjX3NhcF9pb2N0bC5oIGIvQ09SRS9IREQvaW5jL3FjX3NhcF9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNWUzZGMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9pbmMvcWNfc2FwX2lvY3RsLmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9RQ19TQVBfSU9DVExfSF8KKyNkZWZpbmUgX1FDX1NBUF9JT0NUTF9IXworCisvKgorICogUUNTQVAgaW9jdGxzLgorICovCisKKy8qCisgKiBNYXggc2l6ZSBvZiBvcHRpb25hbCBpbmZvcm1hdGlvbiBlbGVtZW50cy4gIFdlIGFydGlmaWNpYWxseQorICogY29uc3RyYWluIHRoaXM7IGl0J3MgbGltaXRlZCBvbmx5IGJ5IHRoZSBtYXggZnJhbWUgc2l6ZSAoYW5kCisgKiB0aGUgbWF4IHBhcmFtZXRlciBzaXplIG9mIHRoZSB3aXJlbGVzcyBleHRlbnNpb25zKS4KKyAqLworI2RlZmluZSBRQ1NBUF9NQVhfT1BUX0lFICAgICAgICAyNTYKKyNkZWZpbmUgUUNTQVBfTUFYX1dTQ19JRSAgICAgICAgMjU2CisKK3R5cGVkZWYgc3RydWN0IHNTU0lECit7CisgICAgdV9pbnQ4X3QgICAgICAgbGVuZ3RoOworICAgIHVfaW50OF90ICAgICAgIHNzSWRbMzJdOworfSB0U1NJRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NTSURJbmZvCit7CisgICB0U1NJRCAgICAgc3NpZDsgICAKKyAgIHVfaW50OF90ICBzc2lkSGlkZGVuOworfXRTU0lESW5mbzsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlUUNfRE9UMTFfTU9ERV9BTEwgPSAwLAorICAgIGVRQ19ET1QxMV9NT0RFX0FCRyA9IDB4MDAwMSwgICAgLy8xMWEvYi9nIG9ubHksIG5vIEhULCBubyBwcm9wcmlldGFyeQorICAgIGVRQ19ET1QxMV9NT0RFXzExQSA9IDB4MDAwMiwKKyAgICBlUUNfRE9UMTFfTU9ERV8xMUIgPSAweDAwMDQsCisgICAgZVFDX0RPVDExX01PREVfMTFHID0gMHgwMDA4LAorICAgIGVRQ19ET1QxMV9NT0RFXzExTiA9IDB4MDAxMCwKKyAgICBlUUNfRE9UMTFfTU9ERV8xMUdfT05MWSA9IDB4MDAyMCwKKyAgICBlUUNfRE9UMTFfTU9ERV8xMU5fT05MWSA9IDB4MDA0MCwKKyAgICBlUUNfRE9UMTFfTU9ERV8xMUJfT05MWSA9IDB4MDA4MCwKKyAgICBlUUNfRE9UMTFfTU9ERV8xMUFfT05MWSA9IDB4MDEwMCwKKyAgICAvL1RoaXMgaXMgZm9yIFdJRkkgdGVzdC4gSXQgaXMgc2FtZSBhcyBlV05JQVBJX01BQ19QUk9UT0NPTF9BTEwgZXhjZXB0IHdoZW4gaXQgc3RhcnRzIElCU1MgaW4gMTFCIG9mIDIuNEdIegorICAgIC8vSXQgaXMgZm9yIENTUiBpbnRlcm5hbCB1c2UKKyAgICBlUUNfRE9UMTFfTU9ERV9BVVRPID0gMHgwMjAwLAorCit9IHRRY1BoeU1vZGU7CisKKyNkZWZpbmUgUUNTQVBfQUREUl9MRU4gIDYKKwordHlwZWRlZiB1X2ludDhfdCBxY21hY2FkZHJbUUNTQVBfQUREUl9MRU5dOworCitzdHJ1Y3QgcWNfbWFjX2FjbF9lbnRyeSB7CisgICAgcWNtYWNhZGRyIGFkZHI7CisgICAgaW50IHZsYW5faWQ7Cit9OworCit0eXBlZGVmIGVudW0geworICAgIGVRQ19BVVRIX1RZUEVfT1BFTl9TWVNURU0sCisgICAgZVFDX0FVVEhfVFlQRV9TSEFSRURfS0VZLAorICAgIGVRQ19BVVRIX1RZUEVfQVVUT19TV0lUQ0gKK30gZVFjQXV0aFR5cGU7IAorCit0eXBlZGVmIGVudW0geworICAgIGVRQ19XUFNfQkVBQ09OX0lFLAorICAgIGVRQ19XUFNfUFJPQkVfUlNQX0lFLAorICAgIGVRQ19XUFNfQVNTT0NfUlNQX0lFCit9IGVRQ1dQU1R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHNfQ29tbWl0Q29uZmlnIHsKKworICAgIHRTU0lESW5mbyBTU0lEaW5mbzsKKworICAgIHVfaW50MzJfdCBiZWFjb25faW50OyAgICAgICAvKiBCZWFjb24gSW50ZXJ2YWwgKi8KKworICAgIHRRY1BoeU1vZGUgaHdfbW9kZTsgICAgICAgICAvKiBXaXJlbGVzcyBNb2RlICovCisKKyAgICB1X2ludDMyX3QgY2hhbm5lbDsgICAgICAgICAgLyogT3BlcmF0aW9uIGNoYW5uZWwgKi8KKworICAgIHVfaW50MzJfdCBtYXhfbnVtX3N0YTsgICAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBTVEFzIGluIHN0YXRpb24gdGFibGUgKi8KKworICAgIHVfaW50MzJfdCBkdGltX3BlcmlvZDsgICAgICAvKiBkdGltIGludGVydmFsICovCisgICAgdV9pbnQzMl90IG1heF9saXN0ZW5faW50ZXJ2YWw7CisKKyAgICBlbnVtIHsKKyAgICAgICAgUUNfQUNDRVBUX1VOTEVTU19ERU5JRUQgPSAwLAorICAgICAgICBRQ19ERU5ZX1VOTEVTU19BQ0NFUFRFRCA9IDEsCisgICAgfSBxY19tYWNhZGRyX2FjbDsKKyAgICAKKyAgICBzdHJ1Y3QgcWNfbWFjX2FjbF9lbnRyeSAqYWNjZXB0X21hYzsgLyogTUFDIGZpbHRlcmluZyAqLworICAgIHVfaW50MzJfdCBudW1fYWNjZXB0X21hYzsKKyAgICBzdHJ1Y3QgcWNfbWFjX2FjbF9lbnRyeSAqZGVueV9tYWM7ICAgLyogTUFDIGZpbHRlcmluZyAqLworICAgIHVfaW50MzJfdCBudW1fZGVueV9tYWM7CisKKyAgICB1X2ludDMyX3QgYXBfdGFibGVfbWF4X3NpemU7CisgICAgdV9pbnQzMl90IGFwX3RhYmxlX2V4cGlyYXRpb25fdGltZTsKKworICAgIGludCBxY3NhcDgwMjExZDsKKworICAgIHVfaW50MzJfdCBjb3VudHJ5Q29kZVszXTsgIC8vaXQgaWdub3JlZCBpZiBbMF0gaXMgMC4KKworICAgIHVfaW50MzJfdCBodF9vcF9tb2RlX2ZpeGVkOworICAgIAorICAgIC8qSFQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiB0byBlbmFibGUvZGlhYmFsZSBwcm90ZWN0aW9uCisgICAgICogICAgICAgICAgIGJpdDE1ICAgYml0MTQgICBiaXQxMyAgIGJpdDEyIGJpdDExIGJpdDEwICAgIGJpdDkgYml0OAorICAgICAqIChvdmVybGFwKSBmcm9tMTFhIGZyb20xMWIgZnJvbTExZyBIdDIwICBOb25HZiBMc2lnVHhvcCBSaWZzIE9CU1MgICAKKyAgICAgKiBiaXQ3ICAgIGJpdDYgICAgYml0NSAgICBiaXQ0IGJpdDMgIGJpdDIgICAgIGJpdDEgYml0MAorICAgICAqIGZyb20xMWEgZnJvbTExYiBmcm9tMTFnIGh0MjAgbm9uR2YgbHNpZ1R4b3AgcmlmcyBvYnNzKi8KKyAgICB1X2ludDE2X3QgaHRfY2FwYWI7CisKKyAgICB1X2ludDMyX3QgcWNzYXA4MDIxMW47CisKKyAgICBlUWNBdXRoVHlwZSBhdXRoVHlwZTsKKworICAgIHVfaW50OF90IHByaXZhY3k7CisKKyAgICB1X2ludDhfdCBzZXRfaWVlZTgwMjF4OworCisgICAgdV9pbnQ4X3QgUlNOV1BBUmVxSUVbUUNTQVBfTUFYX09QVF9JRV07ICAgICAvL0lmIG5vdCBudWxsLCBpdCBoYXMgdGhlIElFIGJ5dGUgc3RyZWFtIGZvciBSU04vV1BBCisgICAgdV9pbnQxNl90IFJTTldQQVJlcUlFTGVuZ3RoOyAgLy9UaGUgYnl0ZSBjb3VudCBpbiB0aGUgcFJTTlJlcUlFLyBXUEFJRQorCisgICAgdV9pbnQ4X3Qgd3BzX3N0YXRlOyAvL3dwc19zdGF0ZSAtIGRpc2JhbGVkL25vdCBjb25maWd1cmVkLCBjb25maWd1cmVkCit9IHNfQ29tbWl0Q29uZmlnX3Q7CisKKworLyoKKyAqIE1MTUUgc3RhdGUgbWFuaXB1bGF0aW9uIHJlcXVlc3QuICBRQ1NBUF9NTE1FX0FTU09DCisgKiBpcyB1c2VkIGZvciBzdGF0aW9uIG1vZGUgb25seS4gIFRoZSBvdGhlciB0eXBlcyBhcmUgdXNlZCBmb3Igc3RhdGlvbiBvciBhcCBtb2RlLgorICovCitzdHJ1Y3Qgc1FjU2FwcmVxX21sbWUgeworICAgIHVfaW50OF90ICAgIGltX29wOyAgICAgICAgICAvKiBvcGVyYXRpb24gdG8gcGVyZm9ybSAqLworI2RlZmluZSBRQ1NBUF9NTE1FX0FTU09DICAgICAgICAxICAgICAgIC8qIGFzc29jaWF0ZSBzdGF0aW9uICovCisjZGVmaW5lIFFDU0FQX01MTUVfRElTQVNTT0MgICAgIDIgICAgICAgLyogZGlzYXNzb2NpYXRlIHN0YXRpb24gKi8KKyNkZWZpbmUgUUNTQVBfTUxNRV9ERUFVVEggICAgICAgMyAgICAgICAvKiBkZWF1dGhlbnRpY2F0ZSBzdGF0aW9uICovCisjZGVmaW5lIFFDU0FQX01MTUVfQVVUSE9SSVpFICAgIDQgICAgICAgLyogYXV0aG9yaXplIHN0YXRpb24gKi8KKyNkZWZpbmUgUUNTQVBfTUxNRV9VTkFVVEhPUklaRSAgNSAgICAgICAvKiB1bmF1dGhvcml6ZSBzdGF0aW9uICovCisjZGVmaW5lIFFDU0FQX01MTUVfTUlDRkFJTFVSRSAgIDYgICAgICAgLyogVEtJUCBNSUNGQUlMVVJFICovCisgICAgdV9pbnQxNl90ICAgaW1fcmVhc29uOyAgICAgIC8qIDgwMi4xMSByZWFzb24gY29kZSAqLworICAgIHVfaW50OF90ICAgIGltX21hY2FkZHJbUUNTQVBfQUREUl9MRU5dOworfTsKKworCisvKgorICogUmV0cmlldmUgdGhlIFdQQS9SU04gaW5mb3JtYXRpb24gZWxlbWVudCBmb3IgYW4gYXNzb2NpYXRlZCBzdGF0aW9uLgorICovCitzdHJ1Y3Qgc1FjU2FwcmVxX3dwYWllIHsKKyAgICB1X2ludDhfdCAgICB3cGFfaWVbUUNTQVBfTUFYX09QVF9JRV07CisgICAgdV9pbnQ4X3QgICAgd3BhX21hY2FkZHJbUUNTQVBfQUREUl9MRU5dOworfTsKKworLyoKKyAqIFJldHJpZXZlIHRoZSBXU0MgaW5mb3JtYXRpb24gZWxlbWVudCBmb3IgYW4gYXNzb2NpYXRlZCBzdGF0aW9uLgorICovCitzdHJ1Y3Qgc1FjU2FwcmVxX3dzY2llIHsKKyAgICB1X2ludDhfdCAgICB3c2NfbWFjYWRkcltRQ1NBUF9BRERSX0xFTl07CisgICAgdV9pbnQ4X3QgICAgd3NjX2llW1FDU0FQX01BWF9XU0NfSUVdOworfTsKKworCisvKgorICogUmV0cmlldmUgdGhlIFdQUyBQQkMgUHJvYmUgUmVxdWVzdCBJRXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHNRY1NhcHJlcV9XUFNQQkNQcm9iZVJlcUlFUyB7CisgICAgdV9pbnQ4X3QgICAgbWFjYWRkcltRQ1NBUF9BRERSX0xFTl07CisgICAgdV9pbnQxNl90ICAgcHJvYmVSZXFJRUxlbjsKKyAgICB1X2ludDhfdCAgICBwcm9iZVJlcUlFWzUxMl07IAorfSBzUWNTYXByZXFfV1BTUEJDUHJvYmVSZXFJRVNfdCA7CisKKy8qCisgKiBDaGFubmVsIExpc3QgSW5mbworICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdl9VOF90ICAgICAgICAgICAgbnVtX2NoYW5uZWxzOyAgICAKKyAgICB2X1U4X3QgICAgICAgICAgICBjaGFubmVsc1tXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworfXRDaGFubmVsTGlzdEluZm8sICp0cENoYW5uZWxMaXN0SW5mbzsKKworCisjaWZkZWYgX19saW51eF9fCisvKgorICogV2lyZWxlc3MgRXh0ZW5zaW9ucyBBUEksIHByaXZhdGUgaW9jdGwgaW50ZXJmYWNlcy4KKyAqCisgKiBOQjogRXZlbi1udW1iZXJlZCBpb2N0bCBudW1iZXJzIGhhdmUgc2V0IHNlbWFudGljcyBhbmQgYXJlIHByaXZpbGVnZWQhCisgKiAgICAgKHJlZ2FyZGxlc3Mgb2YgdGhlIGluY29ycmVjdCBjb21tZW50IGluIHdpcmVsZXNzLmghKQorICovCisKKyNkZWZpbmUgUUNTQVBfSU9DVExfU0VUUEFSQU0gICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViswKQorI2RlZmluZSBRQ1NBUF9JT0NUTF9HRVRQQVJBTSAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWKzEpCisjZGVmaW5lIFFDU0FQX0lPQ1RMX0NPTU1JVCAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYrMikKKyNkZWZpbmUgUUNTQVBfSU9DVExfU0VUTUxNRSAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViszKQorCisjZGVmaW5lIFFDU0FQX0lPQ1RMX0dFVF9TVEFXUEFJRSAgICAgIChTSU9DSVdGSVJTVFBSSVYrNCkKKyNkZWZpbmUgUUNTQVBfSU9DVExfU0VUV1BBSUUgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJVis1KQorI2RlZmluZSBRQ1NBUF9JT0NUTF9TVE9QQlNTICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWKzYpCisjZGVmaW5lIFFDU0FQX0lPQ1RMX1ZFUlNJT04gICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYrNykKKyNkZWZpbmUgUUNTQVBfSU9DVExfR0VUX1dQU19QQkNfUFJPQkVfUkVRX0lFUyAgICAgICAoU0lPQ0lXRklSU1RQUklWKzgpCisjZGVmaW5lIFFDU0FQX0lPQ1RMX0dFVF9DSEFOTkVMICAgICAgIChTSU9DSVdGSVJTVFBSSVYrOSkKKyNkZWZpbmUgUUNTQVBfSU9DVExfQVNTT0NfU1RBX01BQ0FERFIgKFNJT0NJV0ZJUlNUUFJJVisxMCkKKyNkZWZpbmUgUUNTQVBfSU9DVExfRElTQVNTT0NfU1RBICAgICAgKFNJT0NJV0ZJUlNUUFJJVisxMSkKKyNkZWZpbmUgUUNTQVBfSU9DVExfQVBfU1RBVFMgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJVisxMikKKyNkZWZpbmUgUUNTQVBfSU9DVExfR0VUX1NUQVRTICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJVisxMykKKyNkZWZpbmUgUUNTQVBfSU9DVExfQ0xSX1NUQVRTICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJVisxNCkKKworI2RlZmluZSBRQ1NBUF9JT0NUTF9QUklWX1NFVF9USFJFRV9JTlRfR0VUX05PTkUgKFNJT0NJV0ZJUlNUUFJJVisxNSkKKyNkZWZpbmUgV0VfU0VUX1dMQU5fREJHIDEKKyNkZWZpbmUgUUNTQVBfSU9DVExfUFJJVl9TRVRfVkFSX0lOVF9HRVRfTk9ORSAoU0lPQ0lXRklSU1RQUklWKzE2KQorI2RlZmluZSBXRV9MT0dfRFVNUF9DTUQgMQorI2RlZmluZSBRQ1NBUF9JT0NUTF9TRVRfQ0hBTk5FTF9SQU5HRSAoU0lPQ0lXRklSU1RQUklWKzE3KQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorI2RlZmluZSBXRV9QMlBfTk9BX0NNRCAgMgorI2VuZGlmCisKKyNkZWZpbmUgUUNTQVBfSU9DVExfTU9ESUZZX0FDTCAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWKzE4KQorI2RlZmluZSBRQ1NBUF9JT0NUTF9HRVRfQ0hBTk5FTF9MSVNUICAgIChTSU9DSVdGSVJTVFBSSVYrMTkpCisKKyNkZWZpbmUgTUFYX1ZBUl9BUkdTICAgICAgICAgNworI2RlZmluZSBRQ1NBUF9JT0NUTF9QUklWX0dFVF9TT0ZUQVBfTElOS19TUEVFRCAoU0lPQ0lXRklSU1RQUklWICsgMzEpCisKK2VudW0geyAKKyAgICBRQ1NBUF9QQVJBTV9NQVhfQVNTT0MgPSAxLAorICAgIFFDU0FQX1BBUkFNX01PRFVMRV9ET1dOX0lORCA9IDUsCisgICAgUUNTQVBfUEFSQU1fQ0xSX0FDTCA9IDYsCisgICAgUUNTQVBfUEFSQU1fQUNMX01PREUgPSA3LAorICAgIFFDU0FQX1BBUkFNX0hJREVfU1NJRCA9IDgsCit9OworCitpbnQgaXdfc29mdGFwX2dldF9jaGFubmVsX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKworI2VuZGlmIC8qX1FDX1NBUF9JT0NUTF9IXyovCmRpZmYgLS1naXQgYS9DT1JFL0hERC9pbmMvd2xhbl9oZGRfYXNzb2MuaCBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9hc3NvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTczYzQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfYXNzb2MuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggSEREX0NPTk5FQ1RJT05fSF9fICkgCisjZGVmaW5lIEhERF9DT05ORUNUSU9OX0hfXyAKKyNpbmNsdWRlIDx3bGFuX2hkZF9taWIuaD4KKyNkZWZpbmUgSEREX01BWF9OVU1fSUJTU19TVEEgKCA0ICkKKyNkZWZpbmUgVEtJUF9DT1VOVEVSX01FQVNVUkVfU1RBUlRFRCAxCisjZGVmaW5lIFRLSVBfQ09VTlRFUl9NRUFTVVJFX1NUT1BFRCAgMCAKKy8qIFRpbWVvdXQgKGluIG1zKSBmb3IgTGluayB0byBVcCBiZWZvcmUgUmVnaXN0ZXJpbmcgU3RhdGlvbiAqLworI2RlZmluZSBBU1NPQ19MSU5LVVBfVElNRU9VVCA2MAordHlwZWRlZiBlbnVtIAoreworICAgLyoqIE5vdCBhc3NvY2lhdGVkIGluIEluZnJhIG9yIHBhcnRpY2lwYXRpbmcgaW4gYW4gSUJTUyAvIEFkLWhvYyBuZXR3b3JrLiovCisgICBlQ29ubmVjdGlvblN0YXRlX05vdENvbm5lY3RlZCwKKyAgIC8qKiBBc3NvY2lhdGVkIGluIGFuIEluZnJhc3RydWN0dXJlIG5ldHdvcmsuKi8KKyAgIGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCwKKworICAgLyoqIFBhcnRpY2lwYXRpbmcgaW4gYW4gSUJTUyBuZXR3b3JrIHRob3VnaCBkaXNjb25uZWN0ZWQgKG5vIHBhcnRuZXIgc3RhdGlvbnMKKyAgICAgICBpbiB0aGUgSUJTUykuKi8KKyAgIGVDb25uZWN0aW9uU3RhdGVfSWJzc0Rpc2Nvbm5lY3RlZCwKKworICAgLyoqIFBhcnRpY2lwYXRpbmcgaW4gYW4gSUJTUyBuZXR3b3JrIHdpdGggcGFydG5lciBzdGF0aW9ucyBhbHNvIHByZXNlbnQqLworICAgZUNvbm5lY3Rpb25TdGF0ZV9JYnNzQ29ubmVjdGVkCisKK31lQ29ubmVjdGlvblN0YXRlOworLyoqVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCBjb25uZWN0aW9uX2luZm9fcworeworICAgLyoqIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIE5JQy4qLworICAgZUNvbm5lY3Rpb25TdGF0ZSBjb25uU3RhdGU7CisgICAKKyAgIC8qKiBCU1MgdHlwZSBvZiB0aGUgY3VycmVudCBjb25uZWN0aW9uLiAgIENvbWVzIGZyb20gdGhlIE1JQiBhdCB0aGUKKyAgICAgICB0aW1lIHRoZSBjb25uZWN0IHJlcXVlc3QgaXMgaXNzdWVkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIEJzc0Rlc2NyaXB0aW9uCisgICAgICBmcm9tIHRoZSBhc3NvY2lhdGVkIGVudGl0eS4qLworICAgICAgCisgICBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGUgY29ubkRvdDExRGVzaXJlZEJzc1R5cGU7CisgICAvKiogQlNTSUQgKi8KKyAgIHRDc3JCc3NpZCBic3NJZDsKKyAgIAorICAgLyoqIFNTSUQgSW5mbyovCisgICB0Q3NyU1NJREluZm8gU1NJRDsKKyAgIAorICAgLyoqIFN0YXRpb24gSUQgKi8KKyAgIHZfVThfdCBzdGFJZFsgSEREX01BWF9OVU1fSUJTU19TVEEgXTsKKyAgIC8qKiBQZWVyIE1hYyBBZGRyZXNzIG9mIHRoZSBJQlNTIFN0YXRpb25zICovCisgICB2X01BQ0FERFJfdCBwZWVyTWFjQWRkcmVzc1sgSEREX01BWF9OVU1fSUJTU19TVEEgXTsgICAgICAgICAKKyAgIC8qKiBBdXRoIFR5cGUgKi8KKyAgIGVDc3JBdXRoVHlwZSAgIGF1dGhUeXBlOworCisgICAvKiogVW5pY2FzdCBFbmNyeXB0aW9uIFR5cGUgKi8KKyAgIGVDc3JFbmNyeXB0aW9uVHlwZSB1Y0VuY3J5cHRpb25UeXBlOworCisgICAvKiogTXVsdGljYXN0IEVuY3J5cHRpb24gVHlwZSAqLworICAgZUNzckVuY3J5cHRpb25UeXBlIG1jRW5jcnlwdGlvblR5cGU7CisKKyAgIC8qKiBLZXlzICovCisgICB0Q3NyS2V5cyBLZXlzOworCisgICAvKiogT3BlcmF0aW9uIENoYW5uZWwgICovCisgICB2X1U4X3Qgb3BlcmF0aW9uQ2hhbm5lbDsgCisgICAKKyAgICAvKiogUmVtZW1iZXJzIGF1dGhlbnRpY2F0ZWQgc3RhdGUgKi8KKyAgIHZfVThfdCB1SXNBdXRoZW50aWNhdGVkOworICAgCit9Y29ubmVjdGlvbl9pbmZvX3Q7CisvKkZvcndhcmQgZGVjbGFyYXRpb24gb2YgQWRhcHRlciovCit0eXBlZGVmIHN0cnVjdCBoZGRfYWRhcHRlcl9zIGhkZF9hZGFwdGVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBoZGRfY29udGV4dF9zIGhkZF9jb250ZXh0X3Q7Cit0eXBlZGVmIHN0cnVjdCBoZGRfc3RhdGlvbl9jdHggaGRkX3N0YXRpb25fY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCBoZGRfYXBfY3R4X3MgIGhkZF9hcF9jdHhfdDsKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEgICAKK3R5cGVkZWYgc3RydWN0IGhkZF9tb25fY3R4X3MgIGhkZF9tb25fY3R4X3Q7CisjZW5kaWYKKworCitleHRlcm4gdl9CT09MX3QgaGRkX2Nvbm5Jc0Nvbm5lY3RlZCggaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggKTsKK2V4dGVybiBlSGFsU3RhdHVzIGhkZF9zbWVSb2FtQ2FsbGJhY2soIHZvaWQgKnBDb250ZXh0LCB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywgdl9VMzJfdCByb2FtSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUm9hbUNtZFN0YXR1cyByb2FtU3RhdHVzLCBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0ICk7CisKK2V4dGVybiB2X1ZPSURfdCBoZGRfY29ublNhdmVDb25uZWN0SW5mbyggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLCBlQ3NyUm9hbUJzc1R5cGUgZUJzc1R5cGUgKTsKKworaW5saW5lIHZfQk9PTF90IGhkZF9jb25uR2V0Q29ubmVjdGVkQnNzVHlwZSggaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRDdHgsIAorICAgICAgICBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGUgKnBDb25uZWN0ZWRCc3NUeXBlICk7CisKK2ludCBoZGRfU2V0R0VOSUVUb0NzciggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGVDc3JBdXRoVHlwZSAqUlNOQXV0aFR5cGUgKTsKKworaW50IGhkZF9zZXRfY3NyX2F1dGhfdHlwZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGVDc3JBdXRoVHlwZSBSU05BdXRoVHlwZSApOworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL0hERC9pbmMvd2xhbl9oZGRfY2ZnLmggYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmYWFmOAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9jZmcuaApAQCAtMCwwICsxLDE1NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIEhERF9DT05GSUdfSF9fICkKKyNkZWZpbmUgSEREX0NPTkZJR19IX18KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgXGZpbGUgIGhkZF9Db25maWcuaAorCisgIFxicmllZiBBbmRyb2lkIFdMQU4gQWRhcHRlciBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworCisgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhFQURFUiQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEluY2x1ZGUgZmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorI2luY2x1ZGUgPHdsYW5faGRkX2luY2x1ZGVzLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfd21tLmg+CisjaW5jbHVkZSA8dm9zX3R5cGVzLmg+CisjaW5jbHVkZSA8Y3NyQXBpLmg+CisKKy8vTnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQKKyNkZWZpbmUgTUFYX0NGR19JTklfSVRFTVMgICAyNTYKKworLy8gRGVmaW5lcyBmb3IgYWxsIG9mIHRoZSB0aGluZ3Mgd2UgcmVhZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uIChyZWdpc3RyeSkuCisKKyNkZWZpbmUgQ0ZHX1JUU19USFJFU0hPTERfTkFNRSAgICAgICAgICAgICAgICAgIlJUU1RocmVzaG9sZCIKKyNkZWZpbmUgQ0ZHX1JUU19USFJFU0hPTERfTUlOICAgICAgICAgICAgICAgICAgV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1JTiAvLyBtaW4gaXMgMCwgbWVhbmluZyBhbHdheXMgdXNlIFJUUy4KKyNkZWZpbmUgQ0ZHX1JUU19USFJFU0hPTERfTUFYICAgICAgICAgICAgICAgICAgV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1BWCAvLyBtYXggaXMgdGhlIG1heCBmcmFtZSBzaXplCisjZGVmaW5lIENGR19SVFNfVEhSRVNIT0xEX0RFRkFVTFQgICAgICAgICAgICAgIFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFERUYKKworI2RlZmluZSBDRkdfRlJBR19USFJFU0hPTERfTkFNRSAgICAgICAgICAgICAgICAiZ0ZyYWdtZW50YXRpb25UaHJlc2hvbGQiCisjZGVmaW5lIENGR19GUkFHX1RIUkVTSE9MRF9NSU4gICAgICAgICAgICAgICAgIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBTUlOIAorI2RlZmluZSBDRkdfRlJBR19USFJFU0hPTERfTUFYICAgICAgICAgICAgICAgICBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX1NUQU1BWAorI2RlZmluZSBDRkdfRlJBR19USFJFU0hPTERfREVGQVVMVCAgICAgICAgICAgICBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX1NUQURFRgorCisjZGVmaW5lIENGR19DQUxJQlJBVElPTl9OQU1FICAgICAgICAgICAgICAgICAgICJnQ2FsaWJyYXRpb24iCisjZGVmaW5lIENGR19DQUxJQlJBVElPTl9NSU4gICAgICAgICAgICAgICAgICAgICggMCApIAorI2RlZmluZSBDRkdfQ0FMSUJSQVRJT05fTUFYICAgICAgICAgICAgICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfQ0FMSUJSQVRJT05fTUFDX0RFRkFVTFQgICAgICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfQ0FMSUJSQVRJT05fREVGQVVMVCAgICAgICAgICAgICAgICBDRkdfQ0FMSUJSQVRJT05fTUFDX0RFRkFVTFQKKworI2RlZmluZSBDRkdfQ0FMSUJSQVRJT05fUEVSSU9EX05BTUUgICAgICAgICAgICAiZ0NhbGlicmF0aW9uUGVyaW9kIgorI2RlZmluZSBDRkdfQ0FMSUJSQVRJT05fUEVSSU9EX01JTiAgICAgICAgICAgICAoIDIgKSAKKyNkZWZpbmUgQ0ZHX0NBTElCUkFUSU9OX1BFUklPRF9NQVggICAgICAgICAgICAgKCAxMCApCisjZGVmaW5lIENGR19DQUxJQlJBVElPTl9QRVJJT0RfTUFDX0RFRkFVTFQgICAgICggNSApCisjZGVmaW5lIENGR19DQUxJQlJBVElPTl9QRVJJT0RfREVGQVVMVCAgICAgICAgIENGR19DQUxJQlJBVElPTl9QRVJJT0RfTUFDX0RFRkFVTFQgICAgICAgICAgCisKKyNkZWZpbmUgQ0ZHX09QRVJBVElOR19DSEFOTkVMX05BTUUgICAgICAgICAgICAgImdPcGVyYXRpbmdDaGFubmVsIgorI2RlZmluZSBDRkdfT1BFUkFUSU5HX0NIQU5ORUxfTUlOICAgICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfT1BFUkFUSU5HX0NIQU5ORUxfTUFYICAgICAgICAgICAgICAoIDE0ICkKKyNkZWZpbmUgQ0ZHX09QRVJBVElOR19DSEFOTkVMX0RFRkFVTFQgICAgICAgICAgKCAxICkKKworI2RlZmluZSBDRkdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfTkFNRSAgICAgICAiZ1Nob3J0U2xvdFRpbWVFbmFibGVkIgorI2RlZmluZSBDRkdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfTUlOICAgICAgICBXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRV9TVEFNSU4KKyNkZWZpbmUgQ0ZHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVEX01BWCAgICAgICAgV05JX0NGR19TSE9SVF9TTE9UX1RJTUVfU1RBTUFYCisjZGVmaW5lIENGR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9ERUZBVUxUICAgIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX1NUQURFRgorCisjZGVmaW5lIENGR18xMURfU1VQUE9SVF9FTkFCTEVEX05BTUUgICAgICAgICAgICJnMTFkU3VwcG9ydEVuYWJsZWQiCisjZGVmaW5lIENGR18xMURfU1VQUE9SVF9FTkFCTEVEX01JTiAgICAgICAgICAgIFdOSV9DRkdfMTFEX0VOQUJMRURfU1RBTUlOIAorI2RlZmluZSBDRkdfMTFEX1NVUFBPUlRfRU5BQkxFRF9NQVggICAgICAgICAgICBXTklfQ0ZHXzExRF9FTkFCTEVEX1NUQU1BWCAKKyNkZWZpbmUgQ0ZHXzExRF9TVVBQT1JUX0VOQUJMRURfREVGQVVMVCAgICAgICAgV05JX0NGR18xMURfRU5BQkxFRF9TVEFERUYgICAgLy8gRGVmYXVsdCBpcyBPTiAKKworI2RlZmluZSBDRkdfRU5GT1JDRV8xMURfQ0hBTk5FTFNfTkFNRSAgICAgICAgICAiZ0VuZm9yY2UxMWRDaGFubmVsIgorI2RlZmluZSBDRkdfRU5GT1JDRV8xMURfQ0hBTk5FTFNfTUlOICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfRU5GT1JDRV8xMURfQ0hBTk5FTFNfTUFYICAgICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfRU5GT1JDRV8xMURfQ0hBTk5FTFNfREVGQVVMVCAgICAgICAoIDAgKQorCisvL0NPVU5UUlkgQ29kZSBQcmlvcml0eSAKKyNkZWZpbmUgQ0ZHX0NPVU5UUllfQ09ERV9QUklPUklUWV9OQU1FICAgICAgICAgImdDb3VudHJ5Q29kZVByaW9yaXR5IgorI2RlZmluZSBDRkdfQ09VTlRSWV9DT0RFX1BSSU9SSVRZX01JTiAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfQ09VTlRSWV9DT0RFX1BSSU9SSVRZX01BWCAgICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfQ09VTlRSWV9DT0RFX1BSSU9SSVRZX0RFRkFVTFQgICAgICAoIDAgKQorCisjZGVmaW5lIENGR19FTkZPUkNFX0NPVU5UUllfQ09ERV9NQVRDSF9OQU1FICAgICJnRW5mb3JjZUNvdW50cnlDb2RlTWF0Y2giCisjZGVmaW5lIENGR19FTkZPUkNFX0NPVU5UUllfQ09ERV9NQVRDSF9NSU4gICAgICggMCApCisjZGVmaW5lIENGR19FTkZPUkNFX0NPVU5UUllfQ09ERV9NQVRDSF9NQVggICAgICggMSApCisjZGVmaW5lIENGR19FTkZPUkNFX0NPVU5UUllfQ09ERV9NQVRDSF9ERUZBVUxUICggMCApCisKKyNkZWZpbmUgQ0ZHX0VORk9SQ0VfREVGQVVMVF9ET01BSU5fTkFNRSAgICAgICAgImdFbmZvcmNlRGVmYXVsdERvbWFpbiIKKyNkZWZpbmUgQ0ZHX0VORk9SQ0VfREVGQVVMVF9ET01BSU5fTUlOICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0VORk9SQ0VfREVGQVVMVF9ET01BSU5fTUFYICAgICAgICAgKCAxICkgCisjZGVmaW5lIENGR19FTkZPUkNFX0RFRkFVTFRfRE9NQUlOX0RFRkFVTFQgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0dFTkVSSUNfSUQxX05BTUUgICAgICAgICAgICAgICAgICAgImdDZmcxSWQiCisjZGVmaW5lIENGR19HRU5FUklDX0lEMV9NSU4gICAgICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19HRU5FUklDX0lEMV9NQVggICAgICAgICAgICAgICAgICAgICggMHhmZmZmZmZmZiApCisjZGVmaW5lIENGR19HRU5FUklDX0lEMV9ERUZBVUxUICAgICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0dFTkVSSUNfSUQyX05BTUUgICAgICAgICAgICAgICAgICAgImdDZmcySWQiCisjZGVmaW5lIENGR19HRU5FUklDX0lEMl9NSU4gICAgICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19HRU5FUklDX0lEMl9NQVggICAgICAgICAgICAgICAgICAgICggMHhmZmZmZmZmZiApCisjZGVmaW5lIENGR19HRU5FUklDX0lEMl9ERUZBVUxUICAgICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0dFTkVSSUNfSUQzX05BTUUgICAgICAgICAgICAgICAgICAgImdDZmczSWQiCisjZGVmaW5lIENGR19HRU5FUklDX0lEM19NSU4gICAgICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19HRU5FUklDX0lEM19NQVggICAgICAgICAgICAgICAgICAgICggMHhmZmZmZmZmZiApCisjZGVmaW5lIENGR19HRU5FUklDX0lEM19ERUZBVUxUICAgICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0dFTkVSSUNfSUQ0X05BTUUgICAgICAgICAgICAgICAgICAgImdDZmc0SWQiCisjZGVmaW5lIENGR19HRU5FUklDX0lENF9NSU4gICAgICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19HRU5FUklDX0lENF9NQVggICAgICAgICAgICAgICAgICAgICggMHhmZmZmZmZmZiApCisjZGVmaW5lIENGR19HRU5FUklDX0lENF9ERUZBVUxUICAgICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0dFTkVSSUNfSUQ1X05BTUUgICAgICAgICAgICAgICAgICAgImdDZmc1SWQiCisjZGVmaW5lIENGR19HRU5FUklDX0lENV9NSU4gICAgICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19HRU5FUklDX0lENV9NQVggICAgICAgICAgICAgICAgICAgICggMHhmZmZmZmZmZiApCisjZGVmaW5lIENGR19HRU5FUklDX0lENV9ERUZBVUxUICAgICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0dFTkVSSUNfVkFMVUUxX05BTUUgICAgICAgICAgICAgICAgImdDZmcxVmFsdWUiCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFMV9NSU4gICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFMV9NQVggICAgICAgICAgICAgICAgICggMHhmZmZmZmZmZiApCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFMV9ERUZBVUxUICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0dFTkVSSUNfVkFMVUUyX05BTUUgICAgICAgICAgICAgICAgImdDZmcyVmFsdWUiCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFMl9NSU4gICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFMl9NQVggICAgICAgICAgICAgICAgICggMHhmZmZmZmZmZiApCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFMl9ERUZBVUxUICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0dFTkVSSUNfVkFMVUUzX05BTUUgICAgICAgICAgICAgICAgImdDZmczVmFsdWUiCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFM19NSU4gICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFM19NQVggICAgICAgICAgICAgICAgICggMHhmZmZmZmZmZiApCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFM19ERUZBVUxUICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0dFTkVSSUNfVkFMVUU0X05BTUUgICAgICAgICAgICAgICAgImdDZmc0VmFsdWUiCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFNF9NSU4gICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFNF9NQVggICAgICAgICAgICAgICAgICggMHhmZmZmZmZmZiApCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFNF9ERUZBVUxUICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0dFTkVSSUNfVkFMVUU1X05BTUUgICAgICAgICAgICAgICAgImdDZmc1VmFsdWUiCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFNV9NSU4gICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFNV9NQVggICAgICAgICAgICAgICAgICggMHhmZmZmZmZmZiApCisjZGVmaW5lIENGR19HRU5FUklDX1ZBTFVFNV9ERUZBVUxUICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0hFQVJUQkVBVF9USFJFU0hfMjRfTkFNRSAgICAgICAgICAgImdIZWFydGJlYXQyNCIKKyNkZWZpbmUgQ0ZHX0hFQVJUQkVBVF9USFJFU0hfMjRfTUlOICAgICAgICAgICAgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRF9TVEFNSU4KKyNkZWZpbmUgQ0ZHX0hFQVJUQkVBVF9USFJFU0hfMjRfTUFYICAgICAgICAgICAgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRF9TVEFNQVgKKyNkZWZpbmUgQ0ZHX0hFQVJUQkVBVF9USFJFU0hfMjRfREVGQVVMVCAgICAgICAgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRF9TVEFERUYKKworI2RlZmluZSBDRkdfUE9XRVJfVVNBR0VfTkFNRSAgICAgICAgICAgICAgICAgICAiZ1Bvd2VyVXNhZ2UiCisjZGVmaW5lIENGR19QT1dFUl9VU0FHRV9NSU4gICAgICAgICAgICAgICAgICAgICJNaW4iIC8vTWluaW11bSBQb3dlciBTYXZlCisjZGVmaW5lIENGR19QT1dFUl9VU0FHRV9NQVggICAgICAgICAgICAgICAgICAgICJNYXgiIC8vTWF4aW11bSBQb3dlciBTYXZlCisjZGVmaW5lIENGR19QT1dFUl9VU0FHRV9ERUZBVUxUICAgICAgICAgICAgICAgICJNb2QiIC8vTW9kZXJhdGUgUG93ZXIgU2F2ZQorCisvL0VuYWJsZSBzdXNwZW5kIG9uIEFuZHJvaWQKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TVVNQRU5EX05BTUUgICAgICAgICAgICAgICAgImdFbmFibGVTdXNwZW5kIgorI2RlZmluZSBDRkdfRU5BQkxFX1NVU1BFTkRfTUlOICAgICAgICAgICAgICAgICAoIDAgKSAvL05vIHN1cHBvcnQgZm9yIHN1c3BlbmQKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9TVVNQRU5EX01BWCAgICAgICAgICAgICAgICAgKCAzICkgLy9NYXAgdG8gRGVlcCBTbGVlcAorI2RlZmluZSBDRkdfRU5BQkxFX1NVU1BFTkRfREVGQVVMVCAgICAgICAgICAgICAoIDEgKSAvL01hcCB0byBTdGFuZGJ5CisKKy8vRHJpdmVyIHN0YXJ0L3N0b3AgY29tbWFuZCBtYXBwaW5ncworI2RlZmluZSBDRkdfRU5BQkxFX0VOQUJMRV9EUklWRVJfU1RPUF9OQU1FICAgICAiZ0VuYWJsZURyaXZlclN0b3AiCisjZGVmaW5lIENGR19FTkFCTEVfRU5BQkxFX0RSSVZFUl9TVE9QX01JTiAgICAgICggMCApIC8vTm8gc3VwcG9ydCBmb3Igc3RvcAorI2RlZmluZSBDRkdfRU5BQkxFX0VOQUJMRV9EUklWRVJfU1RPUF9NQVggICAgICAoIDIgKSAvL01hcCB0byBEZWVwIFNsZWVwCisjZGVmaW5lIENGR19FTkFCTEVfRU5BQkxFX0RSSVZFUl9TVE9QX0RFRkFVTFQgICggMCApCisKKyNkZWZpbmUgQ0ZHX1dPV0xfUEFUVEVSTl9OQU1FICAgICAgICAgICAgICAgICAgImdXb3dsUGF0dGVybiIKKyNkZWZpbmUgQ0ZHX1dPV0xfUEFUVEVSTl9ERUZBVUxUICAgICAgICAgICAgICAgIiIKKworLy9JTVBTID0gSWRsZU1vZGVQb3dlclNhdmUKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9JTVBTX05BTUUgICAgICAgICAgICAgICAgICAgImdFbmFibGVJbXBzIgorI2RlZmluZSBDRkdfRU5BQkxFX0lNUFNfTUlOICAgICAgICAgICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfRU5BQkxFX0lNUFNfTUFYICAgICAgICAgICAgICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfRU5BQkxFX0lNUFNfREVGQVVMVCAgICAgICAgICAgICAgICAoIDEgKQorCisjZGVmaW5lIENGR19JTVBTX01JTklNVU1fU0xFRVBfVElNRV9OQU1FICAgICAgICJnSW1wc01pblNsZWVwVGltZSIgCisjZGVmaW5lIENGR19JTVBTX01JTklNVU1fU0xFRVBfVElNRV9NSU4gICAgICAgICggMCApCisjZGVmaW5lIENGR19JTVBTX01JTklNVU1fU0xFRVBfVElNRV9NQVggICAgICAgICggNjU1MzUgKQorI2RlZmluZSBDRkdfSU1QU19NSU5JTVVNX1NMRUVQX1RJTUVfREVGQVVMVCAgICAoIDUgKQorICAgIAorI2RlZmluZSBDRkdfSU1QU19NT0RFUkFURV9TTEVFUF9USU1FX05BTUUgICAgICAiZ0ltcHNNb2RTbGVlcFRpbWUiCisjZGVmaW5lIENGR19JTVBTX01PREVSQVRFX1NMRUVQX1RJTUVfTUlOICAgICAgICggMCApCisjZGVmaW5lIENGR19JTVBTX01PREVSQVRFX1NMRUVQX1RJTUVfTUFYICAgICAgICggNjU1MzUgKQorI2RlZmluZSBDRkdfSU1QU19NT0RFUkFURV9TTEVFUF9USU1FX0RFRkFVTFQgICAoIDEwKQorCisjZGVmaW5lIENGR19JTVBTX01BWElNVU1fU0xFRVBfVElNRV9OQU1FICAgICAgICJnSW1wc01heFNsZWVwVGltZSIKKyNkZWZpbmUgQ0ZHX0lNUFNfTUFYSU1VTV9TTEVFUF9USU1FX01JTiAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0lNUFNfTUFYSU1VTV9TTEVFUF9USU1FX01BWCAgICAgICAgKCA2NTUzNSApCisjZGVmaW5lIENGR19JTVBTX01BWElNVU1fU0xFRVBfVElNRV9ERUZBVUxUICAgICggMTUgKQorCisvL0JNUFMgPSBCZWFjb25Nb2RlUG93ZXJTYXZlCisjZGVmaW5lIENGR19FTkFCTEVfQk1QU19OQU1FICAgICAgICAgICAgICAgICAgICJnRW5hYmxlQm1wcyIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9CTVBTX01JTiAgICAgICAgICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9CTVBTX01BWCAgICAgICAgICAgICAgICAgICAgKCAxICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9CTVBTX0RFRkFVTFQgICAgICAgICAgICAgICAgKCAxICkKKworI2RlZmluZSBDRkdfQk1QU19NSU5JTVVNX0xJX05BTUUgICAgICAgICAgICAgICAiZ0JtcHNNaW5MaXN0ZW5JbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX0JNUFNfTUlOSU1VTV9MSV9NSU4gICAgICAgICAgICAgICAgKCAxICkKKyNkZWZpbmUgQ0ZHX0JNUFNfTUlOSU1VTV9MSV9NQVggICAgICAgICAgICAgICAgKCA2NTUzNSApCisjZGVmaW5lIENGR19CTVBTX01JTklNVU1fTElfREVGQVVMVCAgICAgICAgICAgICggMSApCisgICAgCisjZGVmaW5lIENGR19CTVBTX01PREVSQVRFX0xJX05BTUUgICAgICAgICAgICAgICJnQm1wc01vZExpc3RlbkludGVydmFsIgorI2RlZmluZSBDRkdfQk1QU19NT0RFUkFURV9MSV9NSU4gICAgICAgICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfQk1QU19NT0RFUkFURV9MSV9NQVggICAgICAgICAgICAgICAoIDY1NTM1ICkKKyNkZWZpbmUgQ0ZHX0JNUFNfTU9ERVJBVEVfTElfREVGQVVMVCAgICAgICAgICAgKCAxICkKKworI2RlZmluZSBDRkdfQk1QU19NQVhJTVVNX0xJX05BTUUgICAgICAgICAgICAgICAiZ0JtcHNNYXhMaXN0ZW5JbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX0JNUFNfTUFYSU1VTV9MSV9NSU4gICAgICAgICAgICAgICAgKCAxICkKKyNkZWZpbmUgQ0ZHX0JNUFNfTUFYSU1VTV9MSV9NQVggICAgICAgICAgICAgICAgKCA2NTUzNSApCisjZGVmaW5lIENGR19CTVBTX01BWElNVU1fTElfREVGQVVMVCAgICAgICAgICAgICggMSApCisKKy8vIGdFbmFibGVBdXRvQm1wc1RpbWVyIGhhcyBiZWVuIHByZXZpb3VzbHkgcHVibGlzaGVkIGFzIGFuIGV4dGVybmFsbHkKKy8vIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIuIFNlZSBhbmFseXNpcyBvZiBDUiAxNzgyMTEgZm9yIGRldGFpbGVkIGluZm8KKy8vIG9uIHdoeSB3ZSB3YW50IHRvICphbHdheXMqIHNldCB0aGlzIHRvIDEgaS5lLiB3ZSBubyBsb25nZXIgd2FudAorLy8gdGhpcyBwYXJhbWV0ZXIgdG8gYmUgY29uZmlndXJhYmxlLiB0aGUgY2xlYW4gc29sdXRpb24gd291bGQgYmUgZm9yIAorLy8gdXNlcnMgdG8gbm90IGRlZmluZSB0aGlzIGl0ZW0gaW4gd2lucmVnIHNvIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgCisvLyAod2hpY2ggbmVlZHMgdG8gYmUgY2hhbmdlZCB0byAxKSBnZXRzIHBpY2tlZCB1cCBidXQgd2UgY2Fubm90IHJlbHkgb24gdGhhdCAKKy8vIHNpbmNlIHRoaXMgaXRlbSBoYXMgYmVlbiBwdWJsaXNoZWQgYWxyZWFkeSBoZW5jZSB0aGUgcHJvcG9zZWQKKy8vIHNvbHV0aW9uIHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgaXRlbSBhbG9uZyB3aXRoIHRoZSBjaGFuZ2UgaW4gdGhlCisvLyBkZWZhdWx0IHZhbHVlLiBhbHNvIHdlIGNvdWxkIGRlY2lkZSB0byBub3QgcmVhZCB0aGlzIGl0ZW0gZnJvbSByZWdpc3RyeQorLy8gYnV0IGxlYXZpbmcgb3BlbiB0aGUgb3B0aW9uIG9mIGJlaW5nIGFibGUgdG8gY29uZmlndXJlIHRoaXMgaXRlbSBmb3IKKy8vIEFTVydzIGludGVybmFsIHVzZQorI2RlZmluZSBDRkdfRU5BQkxFX0FVVE9fQk1QU19USU1FUl9OQU1FICAgICAgICAiZ0VuYWJsZUF1dG9CbXBzVGltZXJfSU5URVJOQUwiCisjZGVmaW5lIENGR19FTkFCTEVfQVVUT19CTVBTX1RJTUVSX01JTiAgICAgICAgICggMCApCisjZGVmaW5lIENGR19FTkFCTEVfQVVUT19CTVBTX1RJTUVSX01BWCAgICAgICAgICggMSApCisjZGVmaW5lIENGR19FTkFCTEVfQVVUT19CTVBTX1RJTUVSX0RFRkFVTFQgICAgICggMSApCisKKyNkZWZpbmUgQ0ZHX0FVVE9fQk1QU19USU1FUl9WQUxVRV9OQU1FICAgICAgICAgImdBdXRvQm1wc1RpbWVyVmFsdWUiIAorI2RlZmluZSBDRkdfQVVUT19CTVBTX1RJTUVSX1ZBTFVFX01JTiAgICAgICAgICAoIDEwMDAgKQorI2RlZmluZSBDRkdfQVVUT19CTVBTX1RJTUVSX1ZBTFVFX01BWCAgICAgICAgICAoIDQyOTQ5NjcyOTVVTCApCisjZGVmaW5lIENGR19BVVRPX0JNUFNfVElNRVJfVkFMVUVfREVGQVVMVCAgICAgICggMTAwMCApICAgICAgICAKKyAgICAKKyNkZWZpbmUgQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfTkFNRSAgICAgICAgICAgImdNYXhSeEFtcGR1RmFjdG9yIiAgIAorI2RlZmluZSBDRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9NSU4gICAgICAgICAgICBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfU1RBTUlOIAorI2RlZmluZSBDRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9NQVggICAgICAgICAgICBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfU1RBTUFYIAorI2RlZmluZSBDRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9ERUZBVUxUICAgICAgICBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfU1RBREVGIAorCit0eXBlZGVmIGVudW0KK3sKKyAgICBlSEREX0RPVDExX01PREVfQVVUTyA9IDAsIC8vY292ZXJzIGFsbCB0aGluZ3Mgd2Ugc3VwcG9ydAorICAgIGVIRERfRE9UMTFfTU9ERV9hYmcsICAgICAgLy8xMWEvYi9nIG9ubHksIG5vIEhULCBubyBwcm9wcmlldGFyeQorICAgIGVIRERfRE9UMTFfTU9ERV8xMWIsCisgICAgZUhERF9ET1QxMV9NT0RFXzExZywKKyAgICBlSEREX0RPVDExX01PREVfMTFuLAorICAgIGVIRERfRE9UMTFfTU9ERV8xMWdfT05MWSwKKyAgICBlSEREX0RPVDExX01PREVfMTFuX09OTFksCisgICAgZUhERF9ET1QxMV9NT0RFXzExYl9PTkxZLAorfWVIZGREb3QxMU1vZGU7CisKKyNkZWZpbmUgQ0ZHX0RPVDExX01PREVfTkFNRSAgICAgICAgICAgICAgICAgICAgImdEb3QxMU1vZGUiCisjZGVmaW5lIENGR19ET1QxMV9NT0RFX01JTiAgICAgICAgICAgICAgICAgICAgIGVIRERfRE9UMTFfTU9ERV9BVVRPCisjZGVmaW5lIENGR19ET1QxMV9NT0RFX01BWCAgICAgICAgICAgICAgICAgICAgIGVIRERfRE9UMTFfTU9ERV8xMWJfT05MWQorI2RlZmluZSBDRkdfRE9UMTFfTU9ERV9ERUZBVUxUICAgICAgICAgICAgICAgICBlSEREX0RPVDExX01PREVfMTFuCisKKyNkZWZpbmUgQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFXzI0R0haX05BTUUgICAgImdDaGFubmVsQm9uZGluZ01vZGUyNEdIeiIKKyNkZWZpbmUgQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX01JTiAgICAgICAgICAgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9TVEFNSU4gCisjZGVmaW5lIENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9NQVggICAgICAgICAgIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfU1RBTUFYIAorI2RlZmluZSBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfREVGQVVMVCAgICAgICBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX1NUQURFRiAKKworI2RlZmluZSBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfNUdIWl9OQU1FICAgICAiZ0NoYW5uZWxCb25kaW5nTW9kZTVHSHoiCisjZGVmaW5lIENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9NSU4gICAgICAgICAgIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfU1RBTUlOIAorI2RlZmluZSBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfTUFYICAgICAgICAgICBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX1NUQU1BWCAKKyNkZWZpbmUgQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RFRkFVTFQgICAgICAgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9TVEFERUYgCisKKyNkZWZpbmUgQ0ZHX0ZJWEVEX1JBVEVfTkFNRSAgICAgICAgICAgICAgICAgICAgImdGaXhlZFJhdGUiCisjZGVmaW5lIENGR19GSVhFRF9SQVRFX01JTiAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfRklYRURfUkFURV9TVEFNSU4KKyNkZWZpbmUgQ0ZHX0ZJWEVEX1JBVEVfTUFYICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19GSVhFRF9SQVRFX1NUQU1BWAorI2RlZmluZSBDRkdfRklYRURfUkFURV9ERUZBVUxUICAgICAgICAgICAgICAgICBXTklfQ0ZHX0ZJWEVEX1JBVEVfU1RBREVGIAorIAorI2RlZmluZSBDRkdfU0hPUlRfR0lfMjBNSFpfTkFNRSAgICAgICAgICAgICAgICAiZ1Nob3J0R0kyME1oeiIKKyNkZWZpbmUgQ0ZHX1NIT1JUX0dJXzIwTUhaX01JTiAgICAgICAgICAgICAgICAgV05JX0NGR19TSE9SVF9HSV8yME1IWl9TVEFNSU4KKyNkZWZpbmUgQ0ZHX1NIT1JUX0dJXzIwTUhaX01BWCAgICAgICAgICAgICAgICAgV05JX0NGR19TSE9SVF9HSV8yME1IWl9TVEFNQVggCisjZGVmaW5lIENGR19TSE9SVF9HSV8yME1IWl9ERUZBVUxUICAgICAgICAgICAgIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfU1RBREVGIAorCisjZGVmaW5lIENGR19CTE9DS19BQ0tfQVVUT19TRVRVUF9OQU1FICAgICAgICAgICJnQmxvY2tBY2tBdXRvU2V0dXAiCisjZGVmaW5lIENGR19CTE9DS19BQ0tfQVVUT19TRVRVUF9NSU4gICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19CTE9DS19BQ0tfQVVUT19TRVRVUF9NQVggICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19CTE9DS19BQ0tfQVVUT19TRVRVUF9ERUZBVUxUICAgICAgICggMSApCisKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9DT1VOVF9OQU1FICAgICAgICAgImdTY2FuUmVzdWx0QWdlQ291bnQiCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfQ09VTlRfTUlOICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfQ09VTlRfTUFYICAgICAgICAgICggMTAwICkKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9DT1VOVF9ERUZBVUxUICAgICAgKCAzICkKKworLy9BbGwgaW4gc2Vjb25kcworLy9Ob3QgQ29ubmVjdCwgTm8gUG93ZXIgU2F2ZQorI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNOUFNfTkFNRSAgICAiZ1NjYW5SZXN1bHRBZ2VOQ05QUyIKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DTlBTX01JTiAgICAgKCAxMCApCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9OQ05QU19NQVggICAgICggMTAwMDAgKQorI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNOUFNfREVGQVVMVCAoIDUwICkKKy8vTm90IENvbm5lY3QsIFBvd2VyIFNhdmUKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DUFNfTkFNRSAgICAgImdTY2FuUmVzdWx0QWdlTkNQUyIKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DUFNfTUlOICAgICAgKCAxMCApCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9OQ1BTX01BWCAgICAgICggMTAwMDAgKQorI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNQU19ERUZBVUxUICAoIDMwMCApCisvL0Nvbm5lY3QsIE5vIFBvd2VyIFNhdmUKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NOUFNfTkFNRSAgICAgImdTY2FuUmVzdWx0QWdlQ05QUyIKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NOUFNfTUlOICAgICAgKCAxMCApCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DTlBTX01BWCAgICAgICggMTAwMDAgKQorI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfQ05QU19ERUZBVUxUICAoIDE1MCApCisvL0Nvbm5lY3QsIFBvd2VyIFNhdmUKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NQU19OQU1FICAgICAgImdTY2FuUmVzdWx0QWdlQ1BTIgorI2RlZmluZSBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfQ1BTX01JTiAgICAgICAoIDEwICkKKyNkZWZpbmUgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NQU19NQVggICAgICAgKCAxMDAwMCApCisjZGVmaW5lIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DUFNfREVGQVVMVCAgICggNjAwICkKKworI2RlZmluZSBDRkdfUlNTSV9DQVRFR09SWV9HQVBfTkFNRSAgICAgICAgICAgICAiZ1Jzc2lDYXRHYXAiCisjZGVmaW5lIENGR19SU1NJX0NBVEVHT1JZX0dBUF9NSU4gICAgICAgICAgICAgICggMTAgKSAgCisjZGVmaW5lIENGR19SU1NJX0NBVEVHT1JZX0dBUF9NQVggICAgICAgICAgICAgICggMTAwICkgIAorI2RlZmluZSBDRkdfUlNTSV9DQVRFR09SWV9HQVBfREVGQVVMVCAgICAgICAgICAoIDMwICkKKworI2RlZmluZSBDRkdfU1RBVF9USU1FUl9JTlRFUlZBTF9OQU1FICAgICAgICAgICAiZ1N0YXRUaW1lckludGVydmFsIgorI2RlZmluZSBDRkdfU1RBVF9USU1FUl9JTlRFUlZBTF9NSU4gICAgICAgICAgICAoIDUwICkgICAgIC8vbXMKKyNkZWZpbmUgQ0ZHX1NUQVRfVElNRVJfSU5URVJWQUxfTUFYICAgICAgICAgICAgKCAxMDAwMCApICAKKyNkZWZpbmUgQ0ZHX1NUQVRfVElNRVJfSU5URVJWQUxfREVGQVVMVCAgICAgICAgKCA1MDAgKQorCisjZGVmaW5lIENGR19TSE9SVF9QUkVBTUJMRV9OQU1FICAgICAgICAgICAgICAgICJnU2hvcnRQcmVhbWJsZSIKKyNkZWZpbmUgQ0ZHX1NIT1JUX1BSRUFNQkxFX01JTiAgICAgICAgICAgICAgICAgV05JX0NGR19TSE9SVF9QUkVBTUJMRV9TVEFNSU4KKyNkZWZpbmUgQ0ZHX1NIT1JUX1BSRUFNQkxFX01BWCAgICAgICAgICAgICAgICAgV05JX0NGR19TSE9SVF9QUkVBTUJMRV9TVEFNQVgKKyNkZWZpbmUgQ0ZHX1NIT1JUX1BSRUFNQkxFX0RFRkFVTFQgICAgICAgICAgICAgV05JX0NGR19TSE9SVF9QUkVBTUJMRV9TVEFERUYKKworI2RlZmluZSBDRkdfSUJTU19BVVRPX0JTU0lEX05BTUUgICAgICAgICAgICAgICAiZ0F1dG9JYnNzQnNzaWQiCisjZGVmaW5lIENGR19JQlNTX0FVVE9fQlNTSURfTUlOICAgICAgICAgICAgICAgIFdOSV9DRkdfSUJTU19BVVRPX0JTU0lEX1NUQU1JTgorI2RlZmluZSBDRkdfSUJTU19BVVRPX0JTU0lEX01BWCAgICAgICAgICAgICAgICBXTklfQ0ZHX0lCU1NfQVVUT19CU1NJRF9TVEFNQVgKKyNkZWZpbmUgQ0ZHX0lCU1NfQVVUT19CU1NJRF9ERUZBVUxUICAgICAgICAgICAgV05JX0NGR19JQlNTX0FVVE9fQlNTSURfU1RBREVGCisKKyNkZWZpbmUgQ0ZHX0lCU1NfQlNTSURfTkFNRSAgICAgICAgICAgICAgICAgICAgImdJYnNzQnNzaWQiCisjZGVmaW5lIENGR19JQlNTX0JTU0lEX01JTiAgICAgICAgICAgICAgICAgICAgICIwMDAwMDAwMDAwMDAiCisjZGVmaW5lIENGR19JQlNTX0JTU0lEX01BWCAgICAgICAgICAgICAgICAgICAgICJmZmZmZmZmZmZmZmYiCisjZGVmaW5lIENGR19JQlNTX0JTU0lEX0RFRkFVTFQgICAgICAgICAgICAgICAgICIwMDBBRjUwNDA1MDYiCisKKyNkZWZpbmUgQ0ZHX0lOVEYwX01BQ19BRERSX05BTUUgICAgICAgICAgICAgICAgICAiSW50ZjBNYWNBZGRyZXNzIgorI2RlZmluZSBDRkdfSU5URjBfTUFDX0FERFJfTUlOICAgICAgICAgICAgICAgICAgICIwMDAwMDAwMDAwMDAiCisjZGVmaW5lIENGR19JTlRGMF9NQUNfQUREUl9NQVggICAgICAgICAgICAgICAgICAgImZmZmZmZmZmZmZmZiIKKyNkZWZpbmUgQ0ZHX0lOVEYwX01BQ19BRERSX0RFRkFVTFQgICAgICAgICAgICAgICAiMDAwQUY1ODk4OTgwIgorCisjZGVmaW5lIENGR19JTlRGMV9NQUNfQUREUl9OQU1FICAgICAgICAgICAgICAgICAgIkludGYxTWFjQWRkcmVzcyIKKyNkZWZpbmUgQ0ZHX0lOVEYxX01BQ19BRERSX01JTiAgICAgICAgICAgICAgICAgICAiMDAwMDAwMDAwMDAwIgorI2RlZmluZSBDRkdfSU5URjFfTUFDX0FERFJfTUFYICAgICAgICAgICAgICAgICAgICJmZmZmZmZmZmZmZmYiCisjZGVmaW5lIENGR19JTlRGMV9NQUNfQUREUl9ERUZBVUxUICAgICAgICAgICAgICAgIjAwMEFGNTg5ODk4MSIKKworI2RlZmluZSBDRkdfSU5URjJfTUFDX0FERFJfTkFNRSAgICAgICAgICAgICAgICAgICJJbnRmMk1hY0FkZHJlc3MiCisjZGVmaW5lIENGR19JTlRGMl9NQUNfQUREUl9NSU4gICAgICAgICAgICAgICAgICAgIjAwMDAwMDAwMDAwMCIKKyNkZWZpbmUgQ0ZHX0lOVEYyX01BQ19BRERSX01BWCAgICAgICAgICAgICAgICAgICAiZmZmZmZmZmZmZmZmIgorI2RlZmluZSBDRkdfSU5URjJfTUFDX0FERFJfREVGQVVMVCAgICAgICAgICAgICAgICIwMDBBRjU4OTg5ODIiCisKKyNkZWZpbmUgQ0ZHX0lOVEYzX01BQ19BRERSX05BTUUgICAgICAgICAgICAgICAgICAiSW50ZjNNYWNBZGRyZXNzIgorI2RlZmluZSBDRkdfSU5URjNfTUFDX0FERFJfTUlOICAgICAgICAgICAgICAgICAgICIwMDAwMDAwMDAwMDAiCisjZGVmaW5lIENGR19JTlRGM19NQUNfQUREUl9NQVggICAgICAgICAgICAgICAgICAgImZmZmZmZmZmZmZmZiIKKyNkZWZpbmUgQ0ZHX0lOVEYzX01BQ19BRERSX0RFRkFVTFQgICAgICAgICAgICAgICAiMDAwQUY1ODk4OTgzIgorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorI2RlZmluZSBDRkdfQVBfUU9TX1VBUFNEX01PREVfTkFNRSAgICAgICAgICAgICAiZ0VuYWJsZUFwVWFwc2QiIC8vIEFDcyB0byBzZXR1cCBVLUFQU0QgZm9yIGF0IGFzc29jCisjZGVmaW5lIENGR19BUF9RT1NfVUFQU0RfTU9ERV9NSU4gICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19BUF9RT1NfVUFQU0RfTU9ERV9NQVggICAgICAgICAgICAgICggMSApIAorI2RlZmluZSBDRkdfQVBfUU9TX1VBUFNEX01PREVfREVGQVVMVCAgICAgICAgICAoIDEgKSAgIAorCisjZGVmaW5lIENGR19BUF9DT1VOVFJZX0NPREUgICAgICAgICAgICAgICAgICAgICJnQVBDbnRyeUNvZGUiCisjZGVmaW5lIENGR19BUF9DT1VOVFJZX0NPREVfTUlOICAgICAgICAgICAgICAgICJVU0kiCisjZGVmaW5lIENGR19BUF9DT1VOVFJZX0NPREVfTUFYICAgICAgICAgICAgICAgICJVU0kiCisjZGVmaW5lIENGR19BUF9DT1VOVFJZX0NPREVfREVGQVVMVCAgICAgICAgICAgICJGRkYiCisKKyNkZWZpbmUgQ0ZHX0FQX0VOQUJMRV9QUk9URUNUSU9OX01PREVfTkFNRSAgICAgICAgICAgICJnRW5hYmxlQXBQcm90IgorI2RlZmluZSBDRkdfQVBfRU5BQkxFX1BST1RFQ1RJT05fTU9ERV9NSU4gICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0FQX0VOQUJMRV9QUk9URUNUSU9OX01PREVfTUFYICAgICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19BUF9FTkFCTEVfUFJPVEVDVElPTl9NT0RFX0RFRkFVTFQgICAgICAgICAoIDEgKQorCisvLyBCaXQgbWFwIGZvciBDRkdfQVBfUFJPVEVDVElPTl9NT0RFX0RFRkFVTFQKKy8vIExPV0VSIGJ5dGUgZm9yIGFzc29jaWF0ZWQgc3RhdGlvbnMKKy8vIFVQUEVSIGJ5dGUgZm9yIG92ZXJsYXBwaW5nIHN0YXRpb25zCisvLyBlYWNoIGJ5dGUgd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgaW5mbworLy8gYml0MTUgYml0MTQgYml0MTMgICAgIGJpdDEyICBiaXQxMSBiaXQxMCAgICBiaXQ5ICAgICBiaXQ4CisvLyBPQlNTICBSSUZTICBMU0lHX1RYT1AgTk9OX0dGIEhUMjAgIEZST01fMTFHIEZST01fMTFCIEZST01fMTFBCisvLyBiaXQ3ICBiaXQ2ICBiaXQ1ICAgICAgYml0NCAgIGJpdDMgIGJpdDIgICAgIGJpdDEgICAgIGJpdDAKKy8vIE9CU1MgIFJJRlMgIExTSUdfVFhPUCBOT05fR0YgSFRfMjAgRlJPTV8xMUcgRlJPTV8xMUIgRlJPTV8xMUEKKyNkZWZpbmUgQ0ZHX0FQX1BST1RFQ1RJT05fTU9ERV9OQU1FICAgICAgICAgICAgImdBcFByb3RlY3Rpb24iCisjZGVmaW5lIENGR19BUF9QUk9URUNUSU9OX01PREVfTUlOICAgICAgICAgICAgICggMHgwICkKKyNkZWZpbmUgQ0ZHX0FQX1BST1RFQ1RJT05fTU9ERV9NQVggICAgICAgICAgICAgKCAweEZGRkYgKQorI2RlZmluZSBDRkdfQVBfUFJPVEVDVElPTl9NT0RFX0RFRkFVTFQgICAgICAgICAoIDB4QkZGRiApCisKKyNkZWZpbmUgQ0ZHX0FQX09CU1NfUFJPVEVDVElPTl9NT0RFX05BTUUgICAgICAgImdFbmFibGVBcE9CU1NQcm90IiAKKyNkZWZpbmUgQ0ZHX0FQX09CU1NfUFJPVEVDVElPTl9NT0RFX01JTiAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0FQX09CU1NfUFJPVEVDVElPTl9NT0RFX01BWCAgICAgICAgKCAxICkgCisjZGVmaW5lIENGR19BUF9PQlNTX1BST1RFQ1RJT05fTU9ERV9ERUZBVUxUICAgICggMCApICAgCisKKyNkZWZpbmUgQ0ZHX0FQX1NUQV9TRUNVUklUWV9TRVBFUkFUSU9OX05BTUUgICAgImdEaXNhYmxlSW50cmFCc3NGd2QiCisjZGVmaW5lIENGR19BUF9TVEFfU0VDVVJJVFlfU0VQRVJBVElPTl9NSU4gICAgICggMCApCisjZGVmaW5lIENGR19BUF9TVEFfU0VDVVJJVFlfU0VQRVJBVElPTl9NQVggICAgICggMSApIAorI2RlZmluZSBDRkdfQVBfU1RBX1NFQ1VSSVRZX1NFUEVSQVRJT05fREVGQVVMVCAoIDAgKSAgIAorCisjZGVmaW5lIENGR19BUF9MSVNURU5fTU9ERV9OQU1FICAgICAgICAgICAgICAgImdFbmFibGVQaHlBZ2NMaXN0ZW5Nb2RlIiAKKyNkZWZpbmUgQ0ZHX0FQX0xJU1RFTl9NT0RFX01JTiAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0FQX0xJU1RFTl9NT0RFX01BWCAgICAgICAgICAgICAgICAoMTI4KSAKKyNkZWZpbmUgQ0ZHX0FQX0xJU1RFTl9NT0RFX0RFRkFVTFQgICAgICAgICAgICAoMTI4KSAgIAorCisjZGVmaW5lIENGR19BUF9BVVRPX1NIVVRfT0ZGICAgICAgICAgICAgICAgICJnQVBBdXRvU2h1dE9mZiIKKyNkZWZpbmUgQ0ZHX0FQX0FVVE9fU0hVVF9PRkZfTUlOICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0FQX0FVVE9fU0hVVF9PRkZfTUFYICAgICAgICAgICAgKCA0Mjk0OTY3Mjk1VUwgKQorI2RlZmluZSBDRkdfQVBfQVVUT19TSFVUX09GRl9ERUZBVUxUICAgICAgICAoIDAgKQorCisjZGVmaW5lIENGR19GUkFNRVNfUFJPQ0VTU0lOR19USF9NT0RFX05BTUUgICAgICJnTWluRnJhbWVzUHJvY1RocmVzIgorI2RlZmluZSBDRkdfRlJBTUVTX1BST0NFU1NJTkdfVEhfTUlOICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfRlJBTUVTX1BST0NFU1NJTkdfVEhfTUFYICAgICAgICAgICAoIDM5ICkKKyNkZWZpbmUgQ0ZHX0ZSQU1FU19QUk9DRVNTSU5HX1RIX0RFRkFVTFQgICAgICAgKCAwICkKKworI2RlZmluZSBDRkdfU0FQX0NIQU5ORUxfU0VMRUNUX1NUQVJUX0NIQU5ORUwgICAgImdBUENoYW5uZWxTZWxlY3RTdGFydENoYW5uZWwiCisjZGVmaW5lIENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9NSU4gICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9NQVggICAgICAgICAgICAgICAgKDB4RkYpCisjZGVmaW5lIENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9ERUZBVUxUICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTCAiZ0FQQ2hhbm5lbFNlbGVjdEVuZENoYW5uZWwiCisjZGVmaW5lIENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfRU5EX0NIQU5ORUxfTUlOICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfRU5EX0NIQU5ORUxfTUFYICAgICAgICAgICAgICAgICAgKDB4RkYpCisjZGVmaW5lIENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfRU5EX0NIQU5ORUxfREVGQVVMVCAgICAgICAgICAgICAgKDExKQorCisjZGVmaW5lIENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkQgImdBUENoYW5uZWxTZWxlY3RPcGVyYXRpbmdCYW5kIgorI2RlZmluZSBDRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5EX01JTiAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9PUEVSQVRJTkdfQkFORF9NQVggICAgICAgICAgICAgICAoMHg0KQorI2RlZmluZSBDRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5EX0RFRkFVTFQgICAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19ESVNBQkxFX1BBQ0tFVF9GSUxURVIgImdEaXNhYmxlUGFja2V0RmlsdGVyIgorI2RlZmluZSBDRkdfRElTQUJMRV9QQUNLRVRfRklMVEVSX01JTiAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0RJU0FCTEVfUEFDS0VUX0ZJTFRFUl9NQVggICAgICAgICAgICAgICAoMHgxKQorI2RlZmluZSBDRkdfRElTQUJMRV9QQUNLRVRfRklMVEVSX0RFRkFVTFQgICAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19FTkFCTEVfTFRFX0NPRVggICAgICAgICAgICAgICJnRW5hYmxlTFRFQ29leCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9MVEVfQ09FWF9NSU4gICAgICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfRU5BQkxFX0xURV9DT0VYX01BWCAgICAgICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19FTkFCTEVfTFRFX0NPRVhfREVGQVVMVCAgICAgICAgICAgKCAwICkKKworI2RlZmluZSBDRkdfQVBfS0VFUF9BTElWRV9QRVJJT0RfTkFNRSAgICAgICAgICAiZ0FwS2VlcEFsaXZlUGVyaW9kIgorI2RlZmluZSBDRkdfQVBfS0VFUF9BTElWRV9QRVJJT0RfTUlOICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfQVBfS0VFUF9BTElWRV9QRVJJT0RfTUFYICAgICAgICAgICAoIDI1NSkKKyNkZWZpbmUgQ0ZHX0FQX0tFRVBfQUxJVkVfUEVSSU9EX0RFRkFVTFQgICAgICAgKCAyMCApCisKKyNkZWZpbmUgQ0ZHX0dPX0tFRVBfQUxJVkVfUEVSSU9EX05BTUUgICAgICAgICAgImdHb0tlZXBBbGl2ZVBlcmlvZCIKKyNkZWZpbmUgQ0ZHX0dPX0tFRVBfQUxJVkVfUEVSSU9EX01JTiAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0dPX0tFRVBfQUxJVkVfUEVSSU9EX01BWCAgICAgICAgICAgKCAyNTUpCisjZGVmaW5lIENGR19HT19LRUVQX0FMSVZFX1BFUklPRF9ERUZBVUxUICAgICAgICggMjAgKQorCisjZW5kaWYKKworI2RlZmluZSBDRkdfQkVBQ09OX0lOVEVSVkFMX05BTUUgICAgICAgICAgICAgICAiZ0JlYWNvbkludGVydmFsIgorI2RlZmluZSBDRkdfQkVBQ09OX0lOVEVSVkFMX01JTiAgICAgICAgICAgICAgICBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTF9TVEFNSU4KKyNkZWZpbmUgQ0ZHX0JFQUNPTl9JTlRFUlZBTF9NQVggICAgICAgICAgICAgICAgV05JX0NGR19CRUFDT05fSU5URVJWQUxfU1RBTUFYCisjZGVmaW5lIENGR19CRUFDT05fSU5URVJWQUxfREVGQVVMVCAgICAgICAgICAgIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMX1NUQURFRgorCisvL0hhbmRvZmYgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXJzCisjZGVmaW5lIENGR19FTkFCTEVfSEFORE9GRl9OQU1FICAgICAgICAgICAgICAgICJnRW5hYmxlSGFuZG9mZiIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9IQU5ET0ZGX01JTiAgICAgICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9IQU5ET0ZGX01BWCAgICAgICAgICAgICAgICAgKCAxICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9IQU5ET0ZGX0RFRkFVTFQgICAgICAgICAgICAgKCAxICkKKworCisvL0FkZGl0aW9uYWwgSGFuZG9mZiByZWxhdGVkIFBhcmFtZXRlcnMgIAorI2RlZmluZSBDRkdfRU5BQkxFX0lETEVfU0NBTl9OQU1FICAgICAgICAgICAgICJnRW5hYmxlSWRsZVNjYW4iICAgICAgCisjZGVmaW5lIENGR19FTkFCTEVfSURMRV9TQ0FOX01JTiAgICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9JRExFX1NDQU5fTUFYICAgICAgICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfRU5BQkxFX0lETEVfU0NBTl9ERUZBVUxUICAgICAgICAgICggMSApIAorCisjZGVmaW5lIENGR19ST0FNSU5HX1RJTUVfTkFNRSAgICAgICAgICAgICAgICAgImdSb2FtaW5nVGltZSIKKyNkZWZpbmUgQ0ZHX1JPQU1JTkdfVElNRV9NSU4gICAgICAgICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfUk9BTUlOR19USU1FX01BWCAgICAgICAgICAgICAgICAgICggNDI5NDk2N1VMICkKKyNkZWZpbmUgQ0ZHX1JPQU1JTkdfVElNRV9ERUZBVUxUICAgICAgICAgICAgICAoIDEwICkKKworI2RlZmluZSBDRkdfVkNDX1JTU0lfVFJJR0dFUl9OQU1FICAgICAgICAgICAgICJnVmNjUnNzaVRyaWdnZXIiCisjZGVmaW5lIENGR19WQ0NfUlNTSV9UUklHR0VSX01JTiAgICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX1ZDQ19SU1NJX1RSSUdHRVJfTUFYICAgICAgICAgICAgICAoIDgwICkgCisjZGVmaW5lIENGR19WQ0NfUlNTSV9UUklHR0VSX0RFRkFVTFQgICAgICAgICAgKCA4MCApCisKKyNkZWZpbmUgQ0ZHX1ZDQ19VTF9NQUNfTE9TU19USFJFU0hfTkFNRSAgICAgICAiZ1ZjY1VsTWFjTG9zc1RocmVzaCIKKyNkZWZpbmUgQ0ZHX1ZDQ19VTF9NQUNfTE9TU19USFJFU0hfTUlOICAgICAgICAoIDAgKSAgCisjZGVmaW5lIENGR19WQ0NfVUxfTUFDX0xPU1NfVEhSRVNIX01BWCAgICAgICAgKCA5ICkKKyNkZWZpbmUgQ0ZHX1ZDQ19VTF9NQUNfTE9TU19USFJFU0hfREVGQVVMVCAgICAoIDkgKQorICAgCisjZGVmaW5lIENGR19QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfTkFNRSAgICAgICJnUGFzc2l2ZU1heENoYW5uZWxUaW1lIgorI2RlZmluZSBDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX01JTiAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX01BWCAgICAgICAoIDEwMDAwICkKKyNkZWZpbmUgQ0ZHX1BBU1NJVkVfTUFYX0NIQU5ORUxfVElNRV9ERUZBVUxUICAgKCAxMTAgKQorCisjZGVmaW5lIENGR19QQVNTSVZFX01JTl9DSEFOTkVMX1RJTUVfTkFNRSAgICAgICJnUGFzc2l2ZU1pbkNoYW5uZWxUaW1lIgorI2RlZmluZSBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX01JTiAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX01BWCAgICAgICAoIDEwMDAwICkKKyNkZWZpbmUgQ0ZHX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9ERUZBVUxUICAgKCA2MCApCisKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX05BTUUgICAgICAgImdBY3RpdmVNYXhDaGFubmVsVGltZSIKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX01JTiAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FX01BWCAgICAgICAgKCAxMDAwMCApCisjZGVmaW5lIENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9ERUZBVUxUICAgICggNDAgKQorCisjZGVmaW5lIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9OQU1FICAgICAgICJnQWN0aXZlTWluQ2hhbm5lbFRpbWUiCisjZGVmaW5lIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9NSU4gICAgICAgICggMCApCisjZGVmaW5lIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9NQVggICAgICAgICggMTAwMDAgKQorI2RlZmluZSBDRkdfQUNUSVZFX01JTl9DSEFOTkVMX1RJTUVfREVGQVVMVCAgICAoIDIwICkKKworI2RlZmluZSBDRkdfTUFYX1BTX1BPTExfTkFNRSAgICAgICAgICAgICAgICAgICAiZ01heFBzUG9sbCIKKyNkZWZpbmUgQ0ZHX01BWF9QU19QT0xMX01JTiAgICAgICAgICAgICAgICAgICAgV05JX0NGR19NQVhfUFNfUE9MTF9TVEFNSU4KKyNkZWZpbmUgQ0ZHX01BWF9QU19QT0xMX01BWCAgICAgICAgICAgICAgICAgICAgV05JX0NGR19NQVhfUFNfUE9MTF9TVEFNQVgKKyNkZWZpbmUgQ0ZHX01BWF9QU19QT0xMX0RFRkFVTFQgICAgICAgICAgICAgICAgV05JX0NGR19NQVhfUFNfUE9MTF9TVEFERUYKKworI2RlZmluZSBDRkdfTUFYX1RYX1BPV0VSX05BTUUgICAgICAgICAgICAgICAgICAgImdUeFBvd2VyQ2FwIgorI2RlZmluZSBDRkdfTUFYX1RYX1BPV0VSX01JTiAgICAgICAgICAgICAgICAgICAgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMX1NUQU1JTgorI2RlZmluZSBDRkdfTUFYX1RYX1BPV0VSX01BWCAgICAgICAgICAgICAgICAgICAgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMX1NUQU1BWAorLy9Ob3QgdG8gdXNlIENGRyBkZWZhdWx0IGJlY2F1c2UgaWYgbm8gcmVnaXN0cnkgc2V0dGluZywgdGhpcyBpcyBpZ25vcmVkIGJ5IFNNRS4KKyNkZWZpbmUgQ0ZHX01BWF9UWF9QT1dFUl9ERUZBVUxUICAgICAgICAgICAgICAgIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9TVEFNQVgKKworCisjZGVmaW5lIENGR19MT1dfR0FJTl9PVkVSUklERV9OQU1FICAgICAgICAgICAgICJnTG93R2Fpbk92ZXJyaWRlIgorI2RlZmluZSBDRkdfTE9XX0dBSU5fT1ZFUlJJREVfTUlOICAgICAgICAgICAgICBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQU1JTgorI2RlZmluZSBDRkdfTE9XX0dBSU5fT1ZFUlJJREVfTUFYICAgICAgICAgICAgICBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQU1BWAorI2RlZmluZSBDRkdfTE9XX0dBSU5fT1ZFUlJJREVfREVGQVVMVCAgICAgICAgICBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQURFRgorCisjZGVmaW5lIENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfTkFNRSAgICAgICAgICAgICJnUnNzaUZpbHRlclBlcmlvZCIKKyNkZWZpbmUgQ0ZHX1JTU0lfRklMVEVSX1BFUklPRF9NSU4gICAgICAgICAgICAgV05JX0NGR19SU1NJX0ZJTFRFUl9QRVJJT0RfU1RBTUlOCisjZGVmaW5lIENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfTUFYICAgICAgICAgICAgIFdOSV9DRkdfUlNTSV9GSUxURVJfUEVSSU9EX1NUQU1BWAorLy8gSW5jcmVhc2VkIHRoaXMgdmFsdWUgZm9yIE5vbi1DQ1ggQVAuIFRoaXMgaXMgY2F1c2UgRlcgUlNTSSBNb25pdG9yaW5nCisvLyB0aGUgY29uc3VtZXIgb2YgdGhpcyB2YWx1ZSBpcyBPTiBieSBkZWZhdWx0LiBTbyB0byBpbXBhY3QgcG93ZXIgbnVtYmVycworLy8gd2UgYXJlIHNldHRpbmcgdGhpcyB0byBhIGhpZ2ggdmFsdWUuCisjZGVmaW5lIENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfREVGQVVMVCAgICAgICAgIFdOSV9DRkdfUlNTSV9GSUxURVJfUEVSSU9EX1NUQURFRgorCisjZGVmaW5lIENGR19JR05PUkVfRFRJTV9OQU1FICAgICAgICAgICAgICAgICAgICJnSWdub3JlRHRpbSIKKyNkZWZpbmUgQ0ZHX0lHTk9SRV9EVElNX01JTiAgICAgICAgICAgICAgICAgICAgV05JX0NGR19JR05PUkVfRFRJTV9TVEFNSU4KKyNkZWZpbmUgQ0ZHX0lHTk9SRV9EVElNX01BWCAgICAgICAgICAgICAgICAgICAgV05JX0NGR19JR05PUkVfRFRJTV9TVEFNQVgKKyNkZWZpbmUgQ0ZHX0lHTk9SRV9EVElNX0RFRkFVTFQgICAgICAgICAgICAgICAgV05JX0NGR19JR05PUkVfRFRJTV9TVEFERUYKKworI2RlZmluZSBDRkdfUlhfQU5UX0NPTkZJR1VSQVRJT05fTkFNRSAgICAgICAgICAiZ051bVJ4QW50IgorI2RlZmluZSBDRkdfUlhfQU5UX0NPTkZJR1VSQVRJT05fTkFNRV9NSU4gICAgICAoIDEgKQorI2RlZmluZSBDRkdfUlhfQU5UX0NPTkZJR1VSQVRJT05fTkFNRV9NQVggICAgICAoIDIgKQorI2RlZmluZSBDRkdfUlhfQU5UX0NPTkZJR1VSQVRJT05fTkFNRV9ERUZBVUxUICAoIDIgKQorCisjZGVmaW5lIENGR19GV19IRUFSVF9CRUFUX01PTklUT1JJTkdfTkFNRSAgICAgICJnRW5hYmxlRldIZWFydEJlYXRNb25pdG9yaW5nIgorI2RlZmluZSBDRkdfRldfSEVBUlRfQkVBVF9NT05JVE9SSU5HX01JTiAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfRldfSEVBUlRfQkVBVF9NT05JVE9SSU5HX01BWCAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfRldfSEVBUlRfQkVBVF9NT05JVE9SSU5HX0RFRkFVTFQgICAoIDEgKQorCisjZGVmaW5lIENGR19GV19CRUFDT05fRklMVEVSSU5HX05BTUUgICAgICAgICAgICJnRW5hYmxlRldCZWFjb25GaWx0ZXJpbmciCisjZGVmaW5lIENGR19GV19CRUFDT05fRklMVEVSSU5HX01JTiAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19GV19CRUFDT05fRklMVEVSSU5HX01BWCAgICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19GV19CRUFDT05fRklMVEVSSU5HX0RFRkFVTFQgICAgICAgICggMSApCisKKyNkZWZpbmUgQ0ZHX0ZXX1JTU0lfTU9OSVRPUklOR19OQU1FICAgICAgICAgICAgImdFbmFibGVGV1Jzc2lNb25pdG9yaW5nIgorI2RlZmluZSBDRkdfRldfUlNTSV9NT05JVE9SSU5HX01JTiAgICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfRldfUlNTSV9NT05JVE9SSU5HX01BWCAgICAgICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfRldfUlNTSV9NT05JVE9SSU5HX0RFRkFVTFQgICAgICAgICBXTklfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1JfU1RBREVGCisKKyNkZWZpbmUgQ0ZHX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUX05BTUUgICAgICAgImdEYXRhSW5hY3Rpdml0eVRpbWVvdXQiCisjZGVmaW5lIENGR19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9NSU4gICAgICAgICggMSApCisjZGVmaW5lIENGR19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9NQVggICAgICAgICggMjU1ICkKKyNkZWZpbmUgQ0ZHX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUX0RFRkFVTFQgICAgKCAyMCApCisKKyNkZWZpbmUgQ0ZHX05USF9CRUFDT05fRklMVEVSX05BTUUgICAgICAgICAgICAgImdOdGhCZWFjb25GaWx0ZXIiCisjZGVmaW5lIENGR19OVEhfQkVBQ09OX0ZJTFRFUl9NSU4gICAgICAgICAgICAgICggV05JX0NGR19OVEhfQkVBQ09OX0ZJTFRFUl9TVEFNSU4gKQorI2RlZmluZSBDRkdfTlRIX0JFQUNPTl9GSUxURVJfTUFYICAgICAgICAgICAgICAoIFdOSV9DRkdfTlRIX0JFQUNPTl9GSUxURVJfU1RBTUFYICkKKyNkZWZpbmUgQ0ZHX05USF9CRUFDT05fRklMVEVSX0RFRkFVTFQgICAgICAgICAgKCBXTklfQ0ZHX05USF9CRUFDT05fRklMVEVSX1NUQURFRiApCisKKyNkZWZpbmUgQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLX05BTUUgICAgICAgICAgInJmU2V0dGxpbmdUaW1lVXMiCisjZGVmaW5lIENGR19SRl9TRVRUTElOR19USU1FX0NMS19NSU4gICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19SRl9TRVRUTElOR19USU1FX0NMS19NQVggICAgICAgICAgICggNjAwMDAgKQorI2RlZmluZSBDRkdfUkZfU0VUVExJTkdfVElNRV9DTEtfREVGQVVMVCAgICAgICAoIDE1MDAgKQorCisjZGVmaW5lIENGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfTkFNRSAgICAgICAgICAiZ1N0YUtlZXBBbGl2ZVBlcmlvZCIKKyNkZWZpbmUgQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRF9NSU4gICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfTUFYICAgICAgICAgICAoIDY1NTM1KQorI2RlZmluZSBDRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EX0RFRkFVTFQgICAgICAgKCAwICkKKworLy9XTU0gY29uZmlndXJhdGlvbgorI2RlZmluZSBDRkdfUU9TX1dNTV9NT0RFX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXbW1Jc0VuYWJsZWQiCisjZGVmaW5lIENGR19RT1NfV01NX01PREVfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9NT0RFX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMikgLy9IRERfV01NX05PX1FPUworI2RlZmluZSBDRkdfUU9TX1dNTV9NT0RFX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkgLy9IRERfV01NX0FVVE8KKworI2RlZmluZSBDRkdfUU9TX1dNTV84MDIxMUVfRU5BQkxFRF9OQU1FICAgICAgICAgICAgICAgICAgICI4MDIxMWVJc0VuYWJsZWQiCisjZGVmaW5lIENGR19RT1NfV01NXzgwMjExRV9FTkFCTEVEX01JTiAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV84MDIxMUVfRU5BQkxFRF9NQVggICAgICAgICAgICAgICAgICAgICAoMSkgCisjZGVmaW5lIENGR19RT1NfV01NXzgwMjExRV9FTkFCTEVEX0RFRkFVTFQgICAgICAgICAgICAgICAgICgwKSAKKworI2RlZmluZSBDRkdfUU9TX1dNTV9VQVBTRF9NQVNLX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAiVWFwc2RNYXNrIiAvLyBBQ3MgdG8gc2V0dXAgVS1BUFNEIGZvciBhdCBhc3NvYworI2RlZmluZSBDRkdfUU9TX1dNTV9VQVBTRF9NQVNLX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fVUFQU0RfTUFTS19NQVggICAgICAgICAgICAgICAgICAgICAgICAgKDB4RkYpIAorI2RlZmluZSBDRkdfUU9TX1dNTV9VQVBTRF9NQVNLX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAoMHgwMCkgICAKKworI2RlZmluZSBDRkdfUU9TX1dNTV9NQVhfU1BfTEVOX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAiTWF4U3BMZW5ndGgiCisjZGVmaW5lIENGR19RT1NfV01NX01BWF9TUF9MRU5fTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fTUFYX1NQX0xFTl9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICgzKQorI2RlZmluZSBDRkdfUU9TX1dNTV9NQVhfU1BfTEVOX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1JWX0lOVFZfTkFNRSAgICAgICAgICAgIkluZnJhVWFwc2RWb1NydkludHYiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZPX1NSVl9JTlRWX01JTiAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1JWX0lOVFZfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VUwgKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TUlZfSU5UVl9ERUZBVUxUICAgICAgICAgKDIwKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZPX1NVU19JTlRWX05BTUUgICAgICAgICAgICJJbmZyYVVhcHNkVm9TdXNwSW50diIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1VTX0lOVFZfTUlOICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TVVNfSU5UVl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVTCApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZPX1NVU19JTlRWX0RFRkFVTFQgICAgICAgICAoMjAwMCkKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TUlZfSU5UVl9OQU1FICAgICAgICAgICAiSW5mcmFVYXBzZFZpU3J2SW50diIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1JWX0lOVFZfTUlOICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TUlZfSU5UVl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVTCkgCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZJX1NSVl9JTlRWX0RFRkFVTFQgICAgICAgICAoMzAwKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZJX1NVU19JTlRWX05BTUUgICAgICAgICAgICJJbmZyYVVhcHNkVmlTdXNwSW50diIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1VTX0lOVFZfTUlOICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TVVNfSU5UVl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVTCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1VTX0lOVFZfREVGQVVMVCAgICAgICAgICgyMDAwKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NSVl9JTlRWX05BTUUgICAgICAgICAgICJJbmZyYVVhcHNkQmVTcnZJbnR2IgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TUlZfSU5UVl9NSU4gICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NSVl9JTlRWX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVVMKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TUlZfSU5UVl9ERUZBVUxUICAgICAgICAgKDMwMCkKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TVVNfSU5UVl9OQU1FICAgICAgICAgICAiSW5mcmFVYXBzZEJlU3VzcEludHYiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NVU19JTlRWX01JTiAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQkVfU1VTX0lOVFZfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VUwpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NVU19JTlRWX0RFRkFVTFQgICAgICAgICAoMjAwMCkKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TUlZfSU5UVl9OQU1FICAgICAgICAgICAiSW5mcmFVYXBzZEJrU3J2SW50diIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1JWX0lOVFZfTUlOICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TUlZfSU5UVl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVTCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1JWX0lOVFZfREVGQVVMVCAgICAgICAgICgzMDApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1VTX0lOVFZfTkFNRSAgICAgICAgICAgIkluZnJhVWFwc2RCa1N1c3BJbnR2IgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TVVNfSU5UVl9NSU4gICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JLX1NVU19JTlRWX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVVMKSAgICAgICAgICAgICAKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1VTX0lOVFZfREVGQVVMVCAgICAgICAgICgyMDAwKQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9JTkFDVElWSVRZX0lOVEVSVkFMX05BTUUgICAgICAgICAiSW5mcmFJbmFjdGl2aXR5SW50ZXJ2YWwiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0lOQUNUSVZJVFlfSU5URVJWQUxfTUlOICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfSU5BQ1RJVklUWV9JTlRFUlZBTF9NQVggICAgICAgICAgICg0Mjk0OTY3Mjk1VUwpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0lOQUNUSVZJVFlfSU5URVJWQUxfREVGQVVMVCAgICAgICAoMCkgLy9kaXNhYmxlZAorCisjZGVmaW5lIENGR19DQ1hfRkVBVFVSRV9FTkFCTEVEX05BTUUgICAgICAgICAgICAgICAgICAgICAgICJDY3hFbmFibGVkIgorI2RlZmluZSBDRkdfQ0NYX0ZFQVRVUkVfRU5BQkxFRF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19DQ1hfRkVBVFVSRV9FTkFCTEVEX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0NDWF9GRUFUVVJFX0VOQUJMRURfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICgwKSAvL2Rpc2FibGVkCisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX0NDWAorCisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fQ0NYKQorI2RlZmluZSBDRkdfRlRfUlNTSV9GSUxURVJfUEVSSU9EX05BTUUgICAgICAgICAgICAgICAgICAgICAiRlRSc3NpRmlsdGVyUGVyaW9kIgorI2RlZmluZSBDRkdfRlRfUlNTSV9GSUxURVJfUEVSSU9EX01JTiAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRF9TVEFNSU4KKyNkZWZpbmUgQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRF9NQVggICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19GVF9SU1NJX0ZJTFRFUl9QRVJJT0RfU1RBTUFYCisjZGVmaW5lIENGR19GVF9SU1NJX0ZJTFRFUl9QRVJJT0RfREVGQVVMVCAgICAgICAgICAgICAgICAgIFdOSV9DRkdfRlRfUlNTSV9GSUxURVJfUEVSSU9EX1NUQURFRiAKKworLy8gVGhpcyBmbGFnIHdpbGwgY29udHJvbCBmYXN0dHJhbnNpdGlvbiBpbiBjYXNlIG9mIDExciBhbmQgY2N4LgorLy8gQmFzaWNhbGx5IHdpdGggdGhpcyB0aGUgd2hvbGUgbmVpZ2hib3Igcm9hbSwgcHJlLWF1dGgsIHJlYXNzb2MKKy8vIGNhbiBiZSB0dXJuZWQgT04vT0ZGLiAKKy8vIFdpdGggdGhpcyB0dXJuZWQgT0ZGIDExciB3aWxsIGNvbXBsZXRlbHkgbm90IHdvcmsuCisvLyBGb3IgMTFyIHRoaXMgZmxhZyBoYXMgdG8gYmUgT04uCisvLyBGb3IgQ0NYIGZhc3Ryb2FtIHdpbGwgbm90IHdvcmsuCisjZGVmaW5lIENGR19GQVNUX1RSQU5TSVRJT05fRU5BQkxFRF9OQU1FICAgICAgICAgICAgICAgICAgICAiRmFzdFRyYW5zaXRpb25FbmFibGVkIgorI2RlZmluZSBDRkdfRkFTVF9UUkFOU0lUSU9OX0VOQUJMRURfTkFNRV9NSU4gICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19GQVNUX1RSQU5TSVRJT05fRU5BQkxFRF9OQU1FX01BWCAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHX0ZBU1RfVFJBTlNJVElPTl9FTkFCTEVEX05BTUVfREVGQVVMVCAgICAgICAgICAgICgwKSAvL2Rpc2FibGVkCisjZW5kaWYKKworI2RlZmluZSBDRkdfUU9TX1dNTV9QS1RfQ0xBU1NJRllfQkFTSVNfTkFNRSAgICAgICAgICAgICAgICAiUGt0Q2xhc3NpZmljYXRpb25CYXNpcyIgLy8gRFNDUCBvciA4MDIuMVEKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fUEtUX0NMQVNTSUZZX0JBU0lTX01JTiAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9QS1RfQ0xBU1NJRllfQkFTSVNfTUFYICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19RT1NfV01NX1BLVF9DTEFTU0lGWV9CQVNJU19ERUZBVUxUICAgICAgICAgICAgICAoMCkgLy9EU0NQCisKKy8qIGRlZmF1bHQgVFNQRUMgcGFyYW1ldGVycyBmb3IgQUNfVk8gKi8KKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZPX05BTUUgICAgICAgICAgICAgICAgICAgIkluZnJhRGlyQWNWbyIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZPX01JTiAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfVk9fTUFYICAgICAgICAgICAgICAgICAgICAgKDMpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WT19ERUZBVUxUICAgICAgICAgICAgICAgICAoMykgLy9XTEFOX1FDVF9DVVNUX1dNTV9UU0RJUl9CT1RICisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19WT19OQU1FICAgICAgICAgIkluZnJhTm9tTXNkdVNpemVBY1ZvIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZPX01JTiAgICAgICAgICAgKDB4MCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19WT19NQVggICAgICAgICAgICgweEZGRkYpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVk9fREVGQVVMVCAgICAgICAoMHg4MEQwKQorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX1ZPX05BTUUgICAgICAgICJJbmZyYU1lYW5EYXRhUmF0ZUFjVm8iCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX1ZPX01JTiAgICAgICAgICAoMHgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WT19NQVggICAgICAgICAgKDB4RkZGRkZGRkYpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX1ZPX0RFRkFVTFQgICAgICAoMHgxNDUwMCkKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfVk9fTkFNRSAgICAgICAgICAiSW5mcmFNaW5QaHlSYXRlQWNWbyIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZPX01JTiAgICAgICAgICAgICgweDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WT19NQVggICAgICAgICAgICAoMHhGRkZGRkZGRikKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZPX0RFRkFVTFQgICAgICAgICgweDVCOEQ4MCkKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVk9fTkFNRSAgICAgICAgICAgICAgICAgICAiSW5mcmFTYmFBY1ZvIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVk9fTUlOICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMSkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX1ZPX01BWCAgICAgICAgICAgICAgICAgICAgICgweEZGRkYpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WT19ERUZBVUxUICAgICAgICAgICAgICAgICAoMHgyMDAxKQorCisvKiBkZWZhdWx0IFRTUEVDIHBhcmFtZXRlcnMgZm9yIEFDX1ZJICovCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WSV9OQU1FICAgICAgICAgICAgICAgICAgICJJbmZyYURpckFjVmkiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WSV9NSU4gICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZJX01BWCAgICAgICAgICAgICAgICAgICAgICgzKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfVklfREVGQVVMVCAgICAgICAgICAgICAgICAgKDMpIC8vV0xBTl9RQ1RfQ1VTVF9XTU1fVFNESVJfQk9USAorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVklfTkFNRSAgICAgICAgICJJbmZyYU5vbU1zZHVTaXplQWNWaSIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19WSV9NSU4gICAgICAgICAgICgweDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVklfTUFYICAgICAgICAgICAoMHhGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZJX0RFRkFVTFQgICAgICAgKDB4ODVEQykKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WSV9OQU1FICAgICAgICAiSW5mcmFNZWFuRGF0YVJhdGVBY1ZpIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WSV9NSU4gICAgICAgICAgKDB4MCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVklfTUFYICAgICAgICAgICgweEZGRkZGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WSV9ERUZBVUxUICAgICAgKDB4NTdFNDApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZJX05BTUUgICAgICAgICAgIkluZnJhTWluUGh5UmF0ZUFjVmkiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WSV9NSU4gICAgICAgICAgICAoMHgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfVklfTUFYICAgICAgICAgICAgKDB4RkZGRkZGRkYpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WSV9ERUZBVUxUICAgICAgICAoMHg1QjhEODApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX1ZJX05BTUUgICAgICAgICAgICAgICAgICAgIkluZnJhU2JhQWNWaSIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX1ZJX01JTiAgICAgICAgICAgICAgICAgICAgICgweDIwMDEpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WSV9NQVggICAgICAgICAgICAgICAgICAgICAoMHhGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVklfREVGQVVMVCAgICAgICAgICAgICAgICAgKDB4MjAwMSkKKworLyogZGVmYXVsdCBUU1BFQyBwYXJhbWV0ZXJzIGZvciBBQ19CRSovCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CRV9OQU1FICAgICAgICAgICAgICAgICAgICJJbmZyYURpckFjQmUiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CRV9NSU4gICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX0JFX01BWCAgICAgICAgICAgICAgICAgICAgICgzKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQkVfREVGQVVMVCAgICAgICAgICAgICAgICAgKDMpIC8vV0xBTl9RQ1RfQ1VTVF9XTU1fVFNESVJfQk9USAorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfQkVfTkFNRSAgICAgICAgICJJbmZyYU5vbU1zZHVTaXplQWNCZSIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CRV9NSU4gICAgICAgICAgICgweDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfQkVfTUFYICAgICAgICAgICAoMHhGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JFX0RFRkFVTFQgICAgICAgKDB4ODVEQykKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CRV9OQU1FICAgICAgICAiSW5mcmFNZWFuRGF0YVJhdGVBY0JlIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CRV9NSU4gICAgICAgICAgKDB4MCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfQkVfTUFYICAgICAgICAgICgweEZGRkZGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CRV9ERUZBVUxUICAgICAgKDB4NDkzRTApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX0JFX05BTUUgICAgICAgICAgIkluZnJhTWluUGh5UmF0ZUFjQmUiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CRV9NSU4gICAgICAgICAgICAoMHgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfQkVfTUFYICAgICAgICAgICAgKDB4RkZGRkZGRkYpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CRV9ERUZBVUxUICAgICAgICAoMHg1QjhEODApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JFX05BTUUgICAgICAgICAgICAgICAgICAgIkluZnJhU2JhQWNCZSIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JFX01JTiAgICAgICAgICAgICAgICAgICAgICgweDIwMDEpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19CRV9NQVggICAgICAgICAgICAgICAgICAgICAoMHhGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQkVfREVGQVVMVCAgICAgICAgICAgICAgICAgKDB4MjAwMSkKKworLyogZGVmYXVsdCBUU1BFQyBwYXJhbWV0ZXJzIGZvciBBQ19CayovCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CS19OQU1FICAgICAgICAgICAgICAgICAgICJJbmZyYURpckFjQmsiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CS19NSU4gICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX0JLX01BWCAgICAgICAgICAgICAgICAgICAgICgzKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQktfREVGQVVMVCAgICAgICAgICAgICAgICAgKDMpIC8vV0xBTl9RQ1RfQ1VTVF9XTU1fVFNESVJfQk9USAorCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfQktfTkFNRSAgICAgICAgICJJbmZyYU5vbU1zZHVTaXplQWNCayIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CS19NSU4gICAgICAgICAgICgweDApCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfQktfTUFYICAgICAgICAgICAoMHhGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JLX0RFRkFVTFQgICAgICAgKDB4ODVEQykKKworI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CS19OQU1FICAgICAgICAiSW5mcmFNZWFuRGF0YVJhdGVBY0JrIgorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CS19NSU4gICAgICAgICAgKDB4MCkKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfQktfTUFYICAgICAgICAgICgweEZGRkZGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CS19ERUZBVUxUICAgICAgKDB4NDkzRTApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX0JLX05BTUUgICAgICAgICAgIkluZnJhTWluUGh5UmF0ZUFjQmsiCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CS19NSU4gICAgICAgICAgICAoMHgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfQktfTUFYICAgICAgICAgICAgKDB4RkZGRkZGRkYpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CS19ERUZBVUxUICAgICAgICAoMHg1QjhEODApCisKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JLX05BTUUgICAgICAgICAgICAgICAgICAgIkluZnJhU2JhQWNCayIKKyNkZWZpbmUgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JLX01JTiAgICAgICAgICAgICAgICAgICAgICgweDIwMDEpCisjZGVmaW5lIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19CS19NQVggICAgICAgICAgICAgICAgICAgICAoMHhGRkZGKQorI2RlZmluZSBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQktfREVGQVVMVCAgICAgICAgICAgICAgICAgKDB4MjAwMSkKKworLy8gVEwgY29uZmlndXJhdGlvbgorI2RlZmluZSBDRkdfVExfV0ZRX0JLX1dFSUdIVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgIldmcUJrV2VpZ2h0IgorI2RlZmluZSBDRkdfVExfV0ZRX0JLX1dFSUdIVF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDRkdfVExfV0ZRX0JLX1dFSUdIVF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRgorI2RlZmluZSBDRkdfVExfV0ZRX0JLX1dFSUdIVF9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIENGR19UTF9XRlFfQkVfV0VJR0hUX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2ZxQmVXZWlnaHQiCisjZGVmaW5lIENGR19UTF9XRlFfQkVfV0VJR0hUX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENGR19UTF9XRlFfQkVfV0VJR0hUX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGCisjZGVmaW5lIENGR19UTF9XRlFfQkVfV0VJR0hUX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQ0ZHX1RMX1dGUV9WSV9XRUlHSFRfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZnFWaVdlaWdodCIKKyNkZWZpbmUgQ0ZHX1RMX1dGUV9WSV9XRUlHSFRfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0ZHX1RMX1dGUV9WSV9XRUlHSFRfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgQ0ZHX1RMX1dGUV9WSV9XRUlHSFRfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBDRkdfVExfV0ZRX1ZPX1dFSUdIVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgIldmcVZvV2VpZ2h0IgorI2RlZmluZSBDRkdfVExfV0ZRX1ZPX1dFSUdIVF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDRkdfVExfV0ZRX1ZPX1dFSUdIVF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRgorI2RlZmluZSBDRkdfVExfV0ZRX1ZPX1dFSUdIVF9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIENGR19UTF9ERUxBWUVEX1RSR1JfRlJNX0lOVF9OQU1FICAgICAgICAgICAgICAgICAgICJEZWxheWVkVHJpZ2dlckZybUludCIKKyNkZWZpbmUgQ0ZHX1RMX0RFTEFZRURfVFJHUl9GUk1fSU5UX01JTiAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0ZHX1RMX0RFTEFZRURfVFJHUl9GUk1fSU5UX01BWCAgICAgICAgICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VUwpCisjZGVmaW5lIENGR19UTF9ERUxBWUVEX1RSR1JfRlJNX0lOVF9ERUZBVUxUICAgICAgICAgICAgICAgICAzMDAwCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNkZWZpbmUgQ0ZHX1JSTV9FTkFCTEVfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnUnJtRW5hYmxlIgorI2RlZmluZSBDRkdfUlJNX0VOQUJMRV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19SUk1fRU5BQkxFX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkgIAorI2RlZmluZSBDRkdfUlJNX0VOQUJMRV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fTkFNRSAgICAgICAgICJnUnJtT3BlckNoYW5NYXgiIC8vc2VjdGlvbiAxMS4xMC4zIElFRUUgc3RkLiA4MDIuMTFrLTIwMDgKKyNkZWZpbmUgQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fTUlOICAgICAgICAgICgwKSAgICAgICAgICAgICAvL01heGR1cmF0aW9uID0gMl4obWF4RHVyYXRpb24gLSA0KSAqIGJjbkludHZsLgorI2RlZmluZSBDRkdfUlJNX09QRVJBVElOR19DSEFOX01BWF9EVVJBVElPTl9NQVggICAgICAgICAgKDgpICAKKyNkZWZpbmUgQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fREVGQVVMVCAgICAgICgzKSAgICAgICAgICAgICAvL21heCBkdXJhdGlvbiA9IDJeLTEgKiBiY25JbnR2bCAoNTAlIG9mIGJjbiBpbnR2bCkKKworI2RlZmluZSBDRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fTkFNRSAgICAgImdScm1Ob25PcGVyQ2hhbk1heCIgLy9TYW1lIGFzIGFib3ZlLgorI2RlZmluZSBDRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fTUlOICAgICAgKDApCisjZGVmaW5lIENGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWF9EVVJBVElPTl9NQVggICAgICAoOCkgIAorI2RlZmluZSBDRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fREVGQVVMVCAgKDMpCisKKyNkZWZpbmUgQ0ZHX1JSTV9NRUFTX1JBTkRPTUlaQVRJT05fSU5UVkxfTkFNRSAgICAgICAgICAgICJnUnJtUmFuZG5JbnR2bCIKKyNkZWZpbmUgQ0ZHX1JSTV9NRUFTX1JBTkRPTUlaQVRJT05fSU5UVkxfTUlOICAgICAgICAgICAgICgxMCkKKyNkZWZpbmUgQ0ZHX1JSTV9NRUFTX1JBTkRPTUlaQVRJT05fSU5UVkxfTUFYICAgICAgICAgICAgICgxMDApICAKKyNkZWZpbmUgQ0ZHX1JSTV9NRUFTX1JBTkRPTUlaQVRJT05fSU5UVkxfREVGQVVMVCAgICAgICAgICgxMDApCisjZW5kaWYKKworI2RlZmluZSBDRkdfUU9TX0lNUExJQ0lUX1NFVFVQX0VOQUJMRURfTkFNRSAgICAgICAgICAgICAgICAgIkltcGxpY2l0UW9zSXNFbmFibGVkIgorI2RlZmluZSBDRkdfUU9TX0lNUExJQ0lUX1NFVFVQX0VOQUJMRURfTUlOICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19RT1NfSU1QTElDSVRfU0VUVVBfRU5BQkxFRF9NQVggICAgICAgICAgICAgICAgICAoMSkgCisjZGVmaW5lIENGR19RT1NfSU1QTElDSVRfU0VUVVBfRU5BQkxFRF9ERUZBVUxUICAgICAgICAgICAgICAoMSkKKworI2RlZmluZSBDRkdfMTlQMl9NSFpfUE1JQ19DTEtfRU5BQkxFRF9OQU1FICAgICAgICAgICAgICAgICAgIjE5cDJNaHpQbWljQ2xrRW5hYmxlZCIKKyNkZWZpbmUgQ0ZHXzE5UDJfTUhaX1BNSUNfQ0xLX0VOQUJMRURfTUlOICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfMTlQMl9NSFpfUE1JQ19DTEtfRU5BQkxFRF9NQVggICAgICAgICAgICAgICAgICAgKDEpIAorI2RlZmluZSBDRkdfMTlQMl9NSFpfUE1JQ19DTEtfRU5BQkxFRF9ERUZBVUxUICAgICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9MT0dQX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnRW5hYmxlTG9ncCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9MT0dQX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19FTkFCTEVfTE9HUF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfRU5BQkxFX0xPR1BfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAwICkKKworI2RlZmluZSBDRkdfQlRDX0VYRUNVVElPTl9NT0RFX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgIkJ0Y0V4ZWN1dGlvbk1vZGUiCisjZGVmaW5lIENGR19CVENfRVhFQ1VUSU9OX01PREVfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfQlRDX0VYRUNVVElPTl9NT0RFX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgKCA1ICkKKyNkZWZpbmUgQ0ZHX0JUQ19FWEVDVVRJT05fTU9ERV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICggMCApCisKKyNkZWZpbmUgQ0ZHX0JUQ19ESENQX1BST1RFQ1RJT05fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAiQnRjQ29uc0J0U2xvdFRvQmxvY2tEdXJpbmdEaGNwIgorI2RlZmluZSBDRkdfQlRDX0RIQ1BfUFJPVEVDVElPTl9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19CVENfREhDUF9QUk9URUNUSU9OX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgKCAweEZGICkKKyNkZWZpbmUgQ0ZHX0JUQ19ESENQX1BST1RFQ1RJT05fREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAoIDAgKQorCisjZGVmaW5lIENGR19CVENfQTJEUF9ESENQX1BST1RFQ1RJT05fTkFNRSAgICAgICAgICAgICAgICAgICAgIkJ0Y0EyRFBEaGNwUHJvdGVjdExldmVsIgorI2RlZmluZSBDRkdfQlRDX0EyRFBfREhDUF9QUk9URUNUSU9OX01JTiAgICAgICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19CVENfQTJEUF9ESENQX1BST1RFQ1RJT05fTUFYICAgICAgICAgICAgICAgICAgICAgKCAweEZGICkKKyNkZWZpbmUgQ0ZHX0JUQ19BMkRQX0RIQ1BfUFJPVEVDVElPTl9ERUZBVUxUICAgICAgICAgICAgICAgICAoIDcgKQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2RlZmluZSBDRkdfRlRfRU5BQkxFX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ0Z0RW5hYmxlZCIKKyNkZWZpbmUgQ0ZHX0ZUX0VOQUJMRV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19GVF9FTkFCTEVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKSAgCisjZGVmaW5lIENGR19GVF9FTkFCTEVfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19GVF9SRVNPVVJDRV9SRVFfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICJnRlRSZXNvdXJjZVJlcVN1cHBvcnRlZCIKKyNkZWZpbmUgQ0ZHX0ZUX1JFU09VUkNFX1JFUV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19GVF9SRVNPVVJDRV9SRVFfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfRlRfUkVTT1VSQ0VfUkVRX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAoMCkKKyNlbmRpZgorCisjZGVmaW5lIENGR19URUxFX0JDTl9UUkFOU19MSV9OQU1FICAgICAgICAgICAgICAgICAgICJ0ZWxlc2NvcGljQmVhY29uVHJhbnNMaXN0ZW5JbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX01JTiAgICAgICAgICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX01BWCAgICAgICAgICAgICAgICAgICAgKCA3ICkKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0RFRkFVTFQgICAgICAgICAgICAgICAgKCAzICkKKworI2RlZmluZSBDRkdfVEVMRV9CQ05fVFJBTlNfTElfTlVNX0lETEVfQkNOU19OQU1FICAgICAidGVsZXNjb3BpY0JlYWNvblRyYW5zTGlzdGVuSW50ZXJ2YWxOdW1JZGxlQmNucyIKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX05VTV9JRExFX0JDTlNfTUlOICAgICAgKCA1ICkKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX05VTV9JRExFX0JDTlNfTUFYICAgICAgKCAyNTUgKQorI2RlZmluZSBDRkdfVEVMRV9CQ05fVFJBTlNfTElfTlVNX0lETEVfQkNOU19ERUZBVUxUICAoIDEwICkKKworI2RlZmluZSBDRkdfVEVMRV9CQ05fTUFYX0xJX05BTUUgICAgICAgICAgICAgICAgICAgICAidGVsZXNjb3BpY0JlYWNvbk1heExpc3RlbkludGVydmFsIgorI2RlZmluZSBDRkdfVEVMRV9CQ05fTUFYX0xJX01JTiAgICAgICAgICAgICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfVEVMRV9CQ05fTUFYX0xJX01BWCAgICAgICAgICAgICAgICAgICAgICAoIDcgKQorI2RlZmluZSBDRkdfVEVMRV9CQ05fTUFYX0xJX0RFRkFVTFQgICAgICAgICAgICAgICAgICAoIDUgKQorCisjZGVmaW5lIENGR19URUxFX0JDTl9NQVhfTElfTlVNX0lETEVfQkNOU19OQU1FICAgICAgICJ0ZWxlc2NvcGljQmVhY29uTWF4TGlzdGVuSW50ZXJ2YWxOdW1JZGxlQmNucyIKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX01BWF9MSV9OVU1fSURMRV9CQ05TX01JTiAgICAgICAgKCA1ICkKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX01BWF9MSV9OVU1fSURMRV9CQ05TX01BWCAgICAgICAgKCAyNTUgKQorI2RlZmluZSBDRkdfVEVMRV9CQ05fTUFYX0xJX05VTV9JRExFX0JDTlNfREVGQVVMVCAgICAoIDE1ICkKKworI2RlZmluZSBDRkdfQkNOX0VBUkxZX1RFUk1fV0FLRV9OQU1FICAgICAgICAgICAgICAgICAiYmVhY29uRWFybHlUZXJtaW5hdGlvbldha2VJbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX0JDTl9FQVJMWV9URVJNX1dBS0VfTUlOICAgICAgICAgICAgICAgICAgKCAyICkKKyNkZWZpbmUgQ0ZHX0JDTl9FQVJMWV9URVJNX1dBS0VfTUFYICAgICAgICAgICAgICAgICAgKCAyNTUgKQorI2RlZmluZSBDRkdfQkNOX0VBUkxZX1RFUk1fV0FLRV9ERUZBVUxUICAgICAgICAgICAgICAoIDMgKQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX1NDQU5fVElNRVJfUEVSSU9EX05BTUUgICAgICAgICAgICAgImdOZWlnaGJvclNjYW5UaW1lclBlcmlvZCIKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX1NDQU5fVElNRVJfUEVSSU9EX01JTiAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX1RJTUVSX1BFUklPRF9NQVggICAgICAgICAgICAgICgxMDAwKQorI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9USU1FUl9QRVJJT0RfREVGQVVMVCAgICAgICAgICAoMjAwKQorCisjZGVmaW5lIENGR19ORUlHSEJPUl9SRUFTU09DX1JTU0lfVEhSRVNIT0xEX05BTUUgICAgICAgICAgICAgICJnTmVpZ2hib3JSZWFzc29jVGhyZXNob2xkIgorI2RlZmluZSBDRkdfTkVJR0hCT1JfUkVBU1NPQ19SU1NJX1RIUkVTSE9MRF9NSU4gICAgICAgICAgICAgICAoMTApCisjZGVmaW5lIENGR19ORUlHSEJPUl9SRUFTU09DX1JTU0lfVEhSRVNIT0xEX01BWCAgICAgICAgICAgICAgICgxMjUpCisjZGVmaW5lIENGR19ORUlHSEJPUl9SRUFTU09DX1JTU0lfVEhSRVNIT0xEX0RFRkFVTFQgICAgICAgICAgICgxMjUpCisKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX0xPT0tVUF9SU1NJX1RIUkVTSE9MRF9OQU1FICAgICAgImdOZWlnaGJvckxvb2t1cFRocmVzaG9sZCIKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX0xPT0tVUF9SU1NJX1RIUkVTSE9MRF9NSU4gICAgICAgKDEwKQorI2RlZmluZSBDRkdfTkVJR0hCT1JfTE9PS1VQX1JTU0lfVEhSRVNIT0xEX01BWCAgICAgICAoMTIwKQorI2RlZmluZSBDRkdfTkVJR0hCT1JfTE9PS1VQX1JTU0lfVEhSRVNIT0xEX0RFRkFVTFQgICAoMTIwKQorCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX0NIQU5fTElTVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICJnTmVpZ2hib3JTY2FuQ2hhbm5lbExpc3QiCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX0NIQU5fTElTVF9ERUZBVUxUICAgICAgICAgICAgICAgICAgICIxLDYiCisKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX1NDQU5fTUlOX0NIQU5fVElNRV9OQU1FICAgICAgICAgICAgICAgICAgImdOZWlnaGJvclNjYW5DaGFubmVsTWluVGltZSIKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX1NDQU5fTUlOX0NIQU5fVElNRV9NSU4gICAgICAgICAgICAgICAgICAgKDEwKSAgIAorI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9NSU5fQ0hBTl9USU1FX01BWCAgICAgICAgICAgICAgICAgICAoNDApICAgCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX01JTl9DSEFOX1RJTUVfREVGQVVMVCAgICAgICAgICAgICAgICgyMCkgICAKKworI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9NQVhfQ0hBTl9USU1FX05BTUUgICAgICAgICAgICAgICAgICAiZ05laWdoYm9yU2NhbkNoYW5uZWxNYXhUaW1lIgorI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9NQVhfQ0hBTl9USU1FX01JTiAgICAgICAgICAgICAgICAgICAoMTApICAgCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX01BWF9DSEFOX1RJTUVfTUFYICAgICAgICAgICAgICAgICAgICg0MCkgICAKKyNkZWZpbmUgQ0ZHX05FSUdIQk9SX1NDQU5fTUFYX0NIQU5fVElNRV9ERUZBVUxUICAgICAgICAgICAgICAgKDMwKSAgIAorCisjZGVmaW5lIENGR18xMVJfTkVJR0hCT1JfUkVRX01BWF9UUklFU19OQU1FICAgICAgICAgICAiZ01heE5laWdoYm9yUmVxVHJpZXMiCisjZGVmaW5lIENGR18xMVJfTkVJR0hCT1JfUkVRX01BWF9UUklFU19NSU4gICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0ZHXzExUl9ORUlHSEJPUl9SRVFfTUFYX1RSSUVTX01BWCAgICAgICAgICAgICg0KQorI2RlZmluZSBDRkdfMTFSX05FSUdIQk9SX1JFUV9NQVhfVFJJRVNfREVGQVVMVCAgICAgICAgKDEpCisKKworI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9SRVNVTFRTX1JFRlJFU0hfUEVSSU9EX05BTUUgICAgICAgICAiZ05laWdoYm9yU2NhblJlZnJlc2hQZXJpb2QiCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX1JFU1VMVFNfUkVGUkVTSF9QRVJJT0RfTUlOICAgICAgICAgICgxMDAwKQorI2RlZmluZSBDRkdfTkVJR0hCT1JfU0NBTl9SRVNVTFRTX1JFRlJFU0hfUEVSSU9EX01BWCAgICAgICAgICAoNjAwMDApCisjZGVmaW5lIENGR19ORUlHSEJPUl9TQ0FOX1JFU1VMVFNfUkVGUkVTSF9QRVJJT0RfREVGQVVMVCAgICAgICgyMDAwMCkKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORyAqLworCisjZGVmaW5lIENGR19RT1NfV01NX0JVUlNUX1NJWkVfREVGTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgImJ1cnN0U2l6ZURlZmluaXRpb24iIAorI2RlZmluZSBDRkdfUU9TX1dNTV9CVVJTVF9TSVpFX0RFRk5fTUlOICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX1dNTV9CVVJTVF9TSVpFX0RFRk5fTUFYICAgICAgICAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBDRkdfUU9TX1dNTV9CVVJTVF9TSVpFX0RFRk5fREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19RT1NfV01NX1RTX0lORk9fQUNLX1BPTElDWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgInRzSW5mb0Fja1BvbGljeSIgCisjZGVmaW5lIENGR19RT1NfV01NX1RTX0lORk9fQUNLX1BPTElDWV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIENGR19RT1NfV01NX1RTX0lORk9fQUNLX1BPTElDWV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIENGR19RT1NfV01NX1RTX0lORk9fQUNLX1BPTElDWV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgKDB4MDApCisKKyNkZWZpbmUgQ0ZHX1NJTkdMRV9USURfUkNfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbmdsZVRJRFJDIgorI2RlZmluZSBDRkdfU0lOR0xFX1RJRF9SQ19NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApIC8vIFNlcGVyYXRlIHJlcGxheSBjb3VudGVyIGZvciBhbGwgVElECisjZGVmaW5lIENGR19TSU5HTEVfVElEX1JDX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkgLy8gU2luZ2xlIHJlcGxheSBjb3VudGVyIGZvciBhbGwgVElEIAorI2RlZmluZSBDRkdfU0lOR0xFX1RJRF9SQ19ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpIAorI2RlZmluZSBDRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfTkFNRSAgICAgICAgICAiTWNhc3RCY2FzdEZpbHRlciIKKyNkZWZpbmUgQ0ZHX01DQVNUX0JDQVNUX0ZJTFRFUl9TRVRUSU5HX01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElOR19NQVggICAgICAgICAgICgzKQorI2RlZmluZSBDRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfREVGQVVMVCAgICAgICAoMCkKKworI2RlZmluZSBDRkdfRFlOQU1JQ19QU1BPTExfVkFMVUVfTkFNRSAgICAgICAgICAiZ0R5bmFtaWNQU1BvbGx2YWx1ZSIKKyNkZWZpbmUgQ0ZHX0RZTkFNSUNfUFNQT0xMX1ZBTFVFX01JTiAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19EWU5BTUlDX1BTUE9MTF9WQUxVRV9NQVggICAgICAgICAgICgyNTUpCisjZGVmaW5lIENGR19EWU5BTUlDX1BTUE9MTF9WQUxVRV9ERUZBVUxUICAgICAgICgwKQorCisjZGVmaW5lIENGR19URUxFX0JDTl9XQUtFVVBfRU5fTkFNRSAgICAgICAgICAgICJnVGVsZXNjb3BpY0JlYWNvbldha2V1cEVuIgorI2RlZmluZSBDRkdfVEVMRV9CQ05fV0FLRVVQX0VOX01JTiAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTl9NQVggICAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19URUxFX0JDTl9XQUtFVVBfRU5fREVGQVVMVCAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19RT1NfQUREVFNfV0hFTl9BQ01fSVNfT0ZGX05BTUUgICAgICAgICAgICAgICAgICJnQWRkVFNXaGVuQUNNSXNPZmYiCisjZGVmaW5lIENGR19RT1NfQUREVFNfV0hFTl9BQ01fSVNfT0ZGX01JTiAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDRkdfUU9TX0FERFRTX1dIRU5fQUNNX0lTX09GRl9NQVggICAgICAgICAgICAgICAgICAoMSkgLy9TZW5kIEFkZFRzIGV2ZW4gd2hlbiBBQ00gaXMgbm90IHNldCBmb3IgdGhlIEFDCisjZGVmaW5lIENGR19RT1NfQUREVFNfV0hFTl9BQ01fSVNfT0ZGX0RFRkFVTFQgICAgICAgICAgICAgICgwKQorCisKKyNkZWZpbmUgQ0ZHX1ZBTElEQVRFX1NDQU5fTElTVF9OQU1FICAgICAgICAgICAgICAgICAiZ1ZhbGlkYXRlU2Nhbkxpc3QiCisjZGVmaW5lIENGR19WQUxJREFURV9TQ0FOX0xJU1RfTUlOICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENGR19WQUxJREFURV9TQ0FOX0xJU1RfTUFYICAgICAgICAgICAgICAgICAgKDEpIAorI2RlZmluZSBDRkdfVkFMSURBVEVfU0NBTl9MSVNUX0RFRkFVTFQgICAgICAgICAgICAgICgwKQorCisjZGVmaW5lIENGR19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfTkFNRSAgICAgICAiZ051bGxEYXRhQXBSZXNwVGltZW91dCIKKyNkZWZpbmUgQ0ZHX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVF9NSU4gICAgICAgICggV05JX0NGR19QU19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfU1RBTUlOICkKKyNkZWZpbmUgQ0ZHX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVF9NQVggICAgICAgICggV05JX0NGR19QU19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfU1RBTUFYICkKKyNkZWZpbmUgQ0ZHX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVF9ERUZBVUxUICAgICggV05JX0NGR19QU19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfU1RBREVGICkKKworI2RlZmluZSBDRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9OQU1FICAgICAgImdBcERhdGFBdmFpbFBvbGxJbnRlcnZhbCIKKyNkZWZpbmUgQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfTUlOICAgICAgICggV05JX0NGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX1NUQU1JTiApCisjZGVmaW5lIENGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX01BWCAgICAgICAoIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9TVEFNQVggKQorI2RlZmluZSBDRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9ERUZBVUxUICAgKCBXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfU1RBREVGICkKKworI2RlZmluZSBDRkdfRU5BQkxFX0hPU1RfQVJQT0ZGTE9BRF9OQU1FICAgICAgICAgImhvc3RBcnBPZmZsb2FkIgorI2RlZmluZSBDRkdfRU5BQkxFX0hPU1RfQVJQT0ZGTE9BRF9NSU4gICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9IT1NUX0FSUE9GRkxPQURfTUFYICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19FTkFCTEVfSE9TVF9BUlBPRkZMT0FEX0RFRkFVTFQgICAgICAoIDAgKQorCisjZGVmaW5lIENGR19FTkFCTEVfQlRBTVBfTkFNRSAgICAgICAgICAgICAgICAgICAiZ0VuYWJsZUJ0QW1wIgorI2RlZmluZSBDRkdfRU5BQkxFX0JUQU1QX01JTiAgICAgICAgICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9CVEFNUF9NQVggICAgICAgICAgICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19FTkFCTEVfQlRBTVBfREVGQVVMVCAgICAgICAgICAgICAgICAoIDAgKQorCisjaWZkZWYgV0xBTl9CVEFNUF9GRUFUVVJFCisjZGVmaW5lIENGR19CVF9BTVBfUFJFRkVSUkVEX0NIQU5ORUxfTkFNRSAgICAgICAgICAiQnRBbXBQcmVmZXJyZWRDaGFubmVsIgorI2RlZmluZSBDRkdfQlRfQU1QX1BSRUZFUlJFRF9DSEFOTkVMX01JTiAgICAgICAgICAgKDEpCisjZGVmaW5lIENGR19CVF9BTVBfUFJFRkVSUkVEX0NIQU5ORUxfTUFYICAgICAgICAgICAoMTEpCisjZGVmaW5lIENGR19CVF9BTVBfUFJFRkVSUkVEX0NIQU5ORUxfREVGQVVMVCAgICAgICAoMSkKKyNlbmRpZiAvL1dMQU5fQlRBTVBfRkVBVFVSRQorCisjZGVmaW5lIENGR19CQU5EX0NBUEFCSUxJVFlfTkFNRSAgICAgICAgICAiQmFuZENhcGFiaWxpdHkiCisjZGVmaW5lIENGR19CQU5EX0NBUEFCSUxJVFlfTUlOICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX0JBTkRfQ0FQQUJJTElUWV9NQVggICAgICAgICAgICgyKQorI2RlZmluZSBDRkdfQkFORF9DQVBBQklMSVRZX0RFRkFVTFQgICAgICAgKDEpCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9CRUFDT05fRUFSTFlfVEVSTUlOQVRJT05fTkFNRSAgICAgICAgICAiZW5hYmxlQmVhY29uRWFybHlUZXJtaW5hdGlvbiIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9CRUFDT05fRUFSTFlfVEVSTUlOQVRJT05fTUlOICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfRU5BQkxFX0JFQUNPTl9FQVJMWV9URVJNSU5BVElPTl9NQVggICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19FTkFCTEVfQkVBQ09OX0VBUkxZX1RFUk1JTkFUSU9OX0RFRkFVTFQgICAgICAgKCAwICkKKworI2RlZmluZSBDRkdfRU5BQkxFX0NMT1NFX0xPT1BfTkFNRSAgICAgICAgICAgICAgICAgImdFbmFibGVDbG9zZUxvb3AiCisjZGVmaW5lIENGR19FTkFCTEVfQ0xPU0VfTE9PUF9NSU4gICAgICAgICAgICAgICAgICBXTklfQ0ZHX0ZJWEVEX1JBVEVfU1RBTUlOCisjZGVmaW5lIENGR19FTkFCTEVfQ0xPU0VfTE9PUF9NQVggICAgICAgICAgICAgICAgICBXTklfQ0ZHX0ZJWEVEX1JBVEVfU1RBTUFYCisjZGVmaW5lIENGR19FTkFCTEVfQ0xPU0VfTE9PUF9ERUZBVUxUICAgICAgICAgICAgICBXTklfQ0ZHX0ZJWEVEX1JBVEVfU1RBREVGCisKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9CWVBBU1NfMTFEX05BTUUgICAgICAgICAgICAgICAgICJnRW5hYmxlQnlwYXNzMTFkIgorI2RlZmluZSBDRkdfRU5BQkxFX0JZUEFTU18xMURfTUlOICAgICAgICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9CWVBBU1NfMTFEX01BWCAgICAgICAgICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19FTkFCTEVfQllQQVNTXzExRF9ERUZBVUxUICAgICAgICAgICAgICAoIDAgKQorCisjZGVmaW5lIENGR19FTkFCTEVfREZTX0NITkxfU0NBTl9OQU1FICAgICAgICAgICAgICAiZ0VuYWJsZURGU0NobmxTY2FuIgorI2RlZmluZSBDRkdfRU5BQkxFX0RGU19DSE5MX1NDQU5fTUlOICAgICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9ERlNfQ0hOTF9TQ0FOX01BWCAgICAgICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19FTkFCTEVfREZTX0NITkxfU0NBTl9ERUZBVUxUICAgICAgICAgICAoIDEgKQorCit0eXBlZGVmIGVudW0KK3sKKyAgICBlSEREX0xJTktfU1BFRURfUkVQT1JUX0FDVFVBTCA9IDAsCisgICAgZUhERF9MSU5LX1NQRUVEX1JFUE9SVF9NQVggPSAxLAorICAgIGVIRERfTElOS19TUEVFRF9SRVBPUlRfTUFYX1NDQUxFRCA9IDIsCit9ZUhkZExpbmtTcGVlZFJlcG9ydFR5cGU7CisKKyNkZWZpbmUgQ0ZHX1JFUE9SVF9NQVhfTElOS19TUEVFRCAgICAgICAgICAgICAgICAgICJnUmVwb3J0TWF4TGlua1NwZWVkIgorI2RlZmluZSBDRkdfUkVQT1JUX01BWF9MSU5LX1NQRUVEX01JTiAgICAgICAgICAgICAgKCBlSEREX0xJTktfU1BFRURfUkVQT1JUX0FDVFVBTCApCisjZGVmaW5lIENGR19SRVBPUlRfTUFYX0xJTktfU1BFRURfTUFYICAgICAgICAgICAgICAoIGVIRERfTElOS19TUEVFRF9SRVBPUlRfTUFYX1NDQUxFRCApCisjZGVmaW5lIENGR19SRVBPUlRfTUFYX0xJTktfU1BFRURfREVGQVVMVCAgICAgICAgICAoIGVIRERfTElOS19TUEVFRF9SRVBPUlRfQUNUVUFMICkKKworLyoKKyAqIFJTU0kgVGhyZXNob2xkcworICogVXNlZCB3aGVuIGVIRERfTElOS19TUEVFRF9SRVBPUlRfU0NBTEVEIGlzIHNlbGVjdGVkCisgKi8KKyNkZWZpbmUgQ0ZHX0xJTktfU1BFRURfUlNTSV9ISUdIICAgICAgICAgICAgICAgICAgICJnTGlua1NwZWVkUnNzaUhpZ2giCisjZGVmaW5lIENGR19MSU5LX1NQRUVEX1JTU0lfSElHSF9NSU4gICAgICAgICAgICAgICAoIC0xMjcgKQorI2RlZmluZSBDRkdfTElOS19TUEVFRF9SU1NJX0hJR0hfTUFYICAgICAgICAgICAgICAgKCAgMCApCisjZGVmaW5lIENGR19MSU5LX1NQRUVEX1JTU0lfSElHSF9ERUZBVUxUICAgICAgICAgICAoIC01NSApCisKKyNkZWZpbmUgQ0ZHX0xJTktfU1BFRURfUlNTSV9MT1cgICAgICAgICAgICAgICAgICAgICJnTGlua1NwZWVkUnNzaUxvdyIKKyNkZWZpbmUgQ0ZHX0xJTktfU1BFRURfUlNTSV9MT1dfTUlOICAgICAgICAgICAgICAgICggLTEyNyApCisjZGVmaW5lIENGR19MSU5LX1NQRUVEX1JTU0lfTE9XX01BWCAgICAgICAgICAgICAgICAoICAwICkKKyNkZWZpbmUgQ0ZHX0xJTktfU1BFRURfUlNTSV9MT1dfREVGQVVMVCAgICAgICAgICAgICggLTY1ICkKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyNkZWZpbmUgQ0ZHX1AyUF9ERVZJQ0VfQUREUkVTU19BRE1JTklTVFJBVEVEX05BTUUgICAgICAgICAgICAgICAgImlzUDJwRGV2aWNlQWRkckFkbWluaXN0cmF0ZWQiCisjZGVmaW5lIENGR19QMlBfREVWSUNFX0FERFJFU1NfQURNSU5JU1RSQVRFRF9NSU4gICAgICAgICAgICAgICAgICggMCApCisjZGVmaW5lIENGR19QMlBfREVWSUNFX0FERFJFU1NfQURNSU5JU1RSQVRFRF9NQVggICAgICAgICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19QMlBfREVWSUNFX0FERFJFU1NfQURNSU5JU1RSQVRFRF9ERUZBVUxUICAgICAgICAgICAgICggMCApCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisjZGVmaW5lIENGR19NQ19BRERSX0xJU1RfRklMVEVSX05BTUUgICAgICAgICAgICAgICAiaXNNY0FkZHJMaXN0RmlsdGVyIgorI2RlZmluZSBDRkdfTUNfQUREUl9MSVNUX0ZJTFRFUl9NSU4gICAgICAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgQ0ZHX01DX0FERFJfTElTVF9GSUxURVJfTUFYICAgICAgICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19NQ19BRERSX0xJU1RfRklMVEVSX0RFRkFVTFQgICAgICAgICAgICAoIDAgKQorI2VuZGlmCisKKy8qCisgKiBXREkgVHJhY2UgRW5hYmxlIENvbnRyb2wKKyAqIE5vdGVzOgorICogIHRoZSBNSU4vTUFYL0RFRkFVTFQgdmFsdWVzIGFwcGx5IGZvciBhbGwgbW9kdWxlcworICogIHRoZSBERUZBVUxUIHZhbHVlIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlLiAgaWYgdGhlIERFRkFVTFQKKyAqICAgIHZhbHVlIGlzIG5vdCBvdmVycmlkZGVuLCB0aGVuIG5vIGNoYW5nZSB3aWxsIGJlIG1hZGUgdG8gdGhlCisgKiAgICAiYnVpbHQgaW4iIGRlZmF1bHQgdmFsdWVzIGNvbXBpbGVkIGludG8gdGhlIGNvZGUKKyAqICB2YWx1ZXMgYXJlIGEgYml0bWFwIGluZGljYXRpbmcgd2hpY2ggbG9nIGxldmVscyBhcmUgdG8gZW5hYmxlZAorICogICAgKG11c3QgbWF0Y2ggb3JkZXIgb2Ygd3B0X3RyYWNlbGV2ZWwgZW51bWVyYXRpb25zKQorICogICAgMDAwMDAwMDEgIEZBVEFMCisgKiAgICAwMDAwMDAxMCAgRVJST1IKKyAqICAgIDAwMDAwMTAwICBXQVJOCisgKiAgICAwMDAwMTAwMCAgSU5GTworICogICAgMDAwMTAwMDAgIElORk8gSElHSAorICogICAgMDAxMDAwMDAgIElORk8gTUVECisgKiAgICAwMTAwMDAwMCAgSU5GTyBMT1cKKyAqCisgKiAgaGVuY2UgYSB2YWx1ZSBvZiAweDdGIHdvdWxkIHNldCBhbGwgYml0cyAoZW5hYmxlIGFsbCBsb2dzKQorICovCisjZGVmaW5lIENGR19XRElfVFJBQ0VfRU5BQkxFX0RBTF9OQU1FICAgICAid2RpVHJhY2VFbmFibGVEQUwiCisjZGVmaW5lIENGR19XRElfVFJBQ0VfRU5BQkxFX0NUTF9OQU1FICAgICAid2RpVHJhY2VFbmFibGVDVEwiCisjZGVmaW5lIENGR19XRElfVFJBQ0VfRU5BQkxFX0RBVF9OQU1FICAgICAid2RpVHJhY2VFbmFibGVEQVQiCisjZGVmaW5lIENGR19XRElfVFJBQ0VfRU5BQkxFX1BBTF9OQU1FICAgICAid2RpVHJhY2VFbmFibGVQQUwiCisjZGVmaW5lIENGR19XRElfVFJBQ0VfRU5BQkxFX01JTiAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0ZHX1dESV9UUkFDRV9FTkFCTEVfTUFYICAgICAgICAgICgweDdmKQorI2RlZmluZSBDRkdfV0RJX1RSQUNFX0VOQUJMRV9ERUZBVUxUICAgICAgKDB4ZmZmZmZmZmYpCisKKyNkZWZpbmUgSEREX01DQVNUQkNBU1RGSUxURVJfRklMVEVSX05PTkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgSEREX01DQVNUQkNBU1RGSUxURVJfRklMVEVSX0FMTF9NVUxUSUNBU1QgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSEREX01DQVNUQkNBU1RGSUxURVJfRklMVEVSX0FMTF9CUk9BRENBU1QgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSEREX01DQVNUQkNBU1RGSUxURVJfRklMVEVSX0FMTF9NVUxUSUNBU1RfQlJPQURDQVNUICAgIDB4MDMKKworLyoKKyAqCisgKiBTQVAgQXV0byBDaGFubmVsIEVuYWJsZQorICogTm90ZXM6CisgKiBBdXRvIENoYW5uZWwgc2VsZWN0aW9uIGZvciBTQVAgY29uZmlndXJhdGlvbgorICogMCAtIERpc2FibGUgQXV0byBDaGFubmVsCisgKiAxIC0gRW5hYmxlIGF1dG8gY2hhbm5lbCBzZWxlY3Rpb24gaW4gYXV0byBtb2RlLgorICogICAgIFdoZW4gZW5hYmxlIGF1dG8gY2hhbm5lbCwgY2hhbm5lbCBwcm92aWRlZCBieSBTdXBwbGljYW50IHdpbGwgYmUgaWdub3JlZC4KKyAqCisgKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb246IEF1dG8gY2hhbm5lbCBpcyBkaXNhYmxlZC4KKyAqLworCisjZGVmaW5lIENGR19TQVBfQVVUT19DSEFOTkVMX1NFTEVDVElPTl9OQU1FICAgICAgICJnQXBBdXRvQ2hhbm5lbFNlbGVjdGlvbiIKKworI2RlZmluZSBDRkdfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT05fTUlOICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT05fTUFYICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT05fREVGQVVMVCAgICAoIDAgKQorCisKKy8qCisgKiBFbmFibGUgRHluYW1pYyBEVElNCisgKiBPcHRpb25zCisgKiAwIC1EaXNhYmxlIER5bmFtaWNEVElNCisgKiAxIHRvIDUgLSBTTE0gd2lsbCBzd2l0Y2ggdG8gRFRJTSBzcGVjaWZpZWQgaGVyZSB3aGVuIGhvc3Qgc3VzcGVuZHMgYW5kIAorICogICAgICAgICAgc3dpdGNoIERUSU0xIHdoZW4gaG9zdCByZXN1bWVzICovCisjZGVmaW5lIENGR19FTkFCTEVfRFlOQU1JQ19EVElNX05BTUUgICAgICAgICAgICAiZ0VuYWJsZUR5bmFtaWNEVElNIgorI2RlZmluZSBDRkdfRU5BQkxFX0RZTkFNSUNfRFRJTV9NSU4gICAgICAgICggMCApCisjZGVmaW5lIENGR19FTkFCTEVfRFlOQU1JQ19EVElNX01BWCAgICAgICAgKCA1ICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9EWU5BTUlDX0RUSU1fREVGQVVMVCAgICAoIDAgKQorCisjZGVmaW5lIENGR19FTkFCTEVfQVVUT01BVElDX1RYX1BPV0VSX0NPTlRST0xfTkFNRSAgImdFbmFibGVBdXRvbWF0aWNUeFBvd2VyQ29udHJvbCIKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9BVVRPTUFUSUNfVFhfUE9XRVJfQ09OVFJPTF9NSU4gICAgICAgICggMCApCisjZGVmaW5lIENGR19FTkFCTEVfQVVUT01BVElDX1RYX1BPV0VSX0NPTlRST0xfTUFYICAgICAgICAoIDEgKQorI2RlZmluZSBDRkdfRU5BQkxFX0FVVE9NQVRJQ19UWF9QT1dFUl9DT05UUk9MX0RFRkFVTFQgICAgKCAxICkKKworI2RlZmluZSBDRkdfU0hPUlRfR0lfNDBNSFpfTkFNRSAgICAgICAgICAgICAgICAiZ1Nob3J0R0k0ME1oeiIKKyNkZWZpbmUgQ0ZHX1NIT1JUX0dJXzQwTUhaX01JTiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDRkdfU0hPUlRfR0lfNDBNSFpfTUFYICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENGR19TSE9SVF9HSV80ME1IWl9ERUZBVUxUICAgICAgICAgICAgIDEKKworLyoKKyAqIEVuYWJsZSAvIERpc2FibGUgTUNDIGZlYXR1cmUKKyAqIERlZmF1bHQ6IEVuYWJsZQorICovCisjZGVmaW5lIENGR19FTkFCTEVfTUNDX0VOQUJMRURfTkFNRSAgICAgICAgICAgICAiZ0VuYWJsZU1DQ01vZGUiICAgICAgCisjZGVmaW5lIENGR19FTkFCTEVfTUNDX0VOQUJMRURfTUlOICAgICAgICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfRU5BQkxFX01DQ19FTkFCTEVEX01BWCAgICAgICAgICAgICAgKCAxICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NQ0NfRU5BQkxFRF9ERUZBVUxUICAgICAgICAgICggMCApIAorCisvKgorICogRW5hYmxlL0Rpc2FibGUgVGhlcm1hbCBNaXRpZ2F0aW9uIGZlYXR1cmUKKyAqIERlZmF1bHQ6IERpc2FibGUKKyAqLworI2RlZmluZSBDRkdfVEhFUk1BTF9NSUdSQVRJT05fRU5BQkxFX05BTUUgICAgICAiZ1RoZXJtYWxNaXRpZ2F0aW9uRW5hYmxlIiAgIAorI2RlZmluZSBDRkdfVEhFUk1BTF9NSUdSQVRJT05fRU5BQkxFX01JTiAgICAgICAoIDAgKSAKKyNkZWZpbmUgQ0ZHX1RIRVJNQUxfTUlHUkFUSU9OX0VOQUJMRV9NQVggICAgICAgKCAxICkgCisjZGVmaW5lIENGR19USEVSTUFMX01JR1JBVElPTl9FTkFCTEVfREVGQVVMVCAgICggMCApIAorCisvKgorICogRW5hYmxlL0Rpc2FibGUgTW9kdWxhdGVkIERUSU0gZmVhdHVyZQorICogRGVmYXVsdDogRGlzYWJsZQorICovCisjZGVmaW5lIENGR19FTkFCTEVfTU9EVUxBVEVEX0RUSU1fTkFNRSAgICAgICAiZ0VuYWJsZU1vZHVsYXRlZERUSU0iCisjZGVmaW5lIENGR19FTkFCTEVfTU9EVUxBVEVEX0RUSU1fTUlOICAgICAgICAoIDAgKQorI2RlZmluZSBDRkdfRU5BQkxFX01PRFVMQVRFRF9EVElNX01BWCAgICAgICAgKCA1ICkKKyNkZWZpbmUgQ0ZHX0VOQUJMRV9NT0RVTEFURURfRFRJTV9ERUZBVUxUICAgICggMCApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAvL0JpdG1hcCB0byB0cmFjayB3aGF0IGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZAorICAgREVDTEFSRV9CSVRNQVAoYkV4cGxpY2l0Q2ZnLCBNQVhfQ0ZHX0lOSV9JVEVNUyk7CisKKyAgIC8vQ29uZmlnIHBhcmFtZXRlcnMKKyAgIHZfVTMyX3QgICAgICAgUlRTVGhyZXNob2xkOworICAgdl9VMzJfdCAgICAgICBGcmFnbWVudGF0aW9uVGhyZXNob2xkOworICAgdl9VMzJfdCAgICAgICBuQ2hlY2tGb3JIYW5nVGltZTsKKyAgIHZfVTMyX3QgICAgICAgQ2FsaWJyYXRpb247CisgICB2X1UzMl90ICAgICAgIENhbGlicmF0aW9uUGVyaW9kOworICAgdl9VOF90ICAgICAgICBPcGVyYXRpbmdDaGFubmVsOworICAgdl9CT09MX3QgICAgICBTaG9ydFNsb3RUaW1lRW5hYmxlZDsKKyAgIHZfQk9PTF90ICAgICAgSXMxMWRTdXBwb3J0RW5hYmxlZDsKKyAgIHZfQk9PTF90ICAgICAgZkVuZm9yY2UxMWRDaGFubmVsczsKKyAgIHZfQk9PTF90ICAgICAgZlN1cHBsaWNhbnRDb3VudHJ5Q29kZUhhc1ByaW9yaXR5OworICAgdl9CT09MX3QgICAgICBmRW5mb3JjZUNvdW50cnlDb2RlTWF0Y2g7CisgICB2X0JPT0xfdCAgICAgIGZFbmZvcmNlRGVmYXVsdERvbWFpbjsKKyAgIHZfVTMyX3QgICAgICAgQ2ZnMUlkOworICAgdl9VMzJfdCAgICAgICBDZmcySWQ7CisgICB2X1UzMl90ICAgICAgIENmZzNJZDsKKyAgIHZfVTMyX3QgICAgICAgQ2ZnNElkOworICAgdl9VMzJfdCAgICAgICBDZmc1SWQ7CisgICB2X1UzMl90ICAgICAgIENmZzFWYWx1ZTsKKyAgIHZfVTMyX3QgICAgICAgQ2ZnMlZhbHVlOworICAgdl9VMzJfdCAgICAgICBDZmczVmFsdWU7CisgICB2X1UzMl90ICAgICAgIENmZzRWYWx1ZTsKKyAgIHZfVTMyX3QgICAgICAgQ2ZnNVZhbHVlOworICAgdl9VMzJfdCAgICAgICBIZWFydGJlYXRUaHJlc2gyNDsKKyAgIGNoYXIgICAgICAgICAgUG93ZXJVc2FnZUNvbnRyb2xbNF07CisgICB2X1U4X3QgICAgICAgIG5FbmFibGVTdXNwZW5kOworICAgdl9VOF90ICAgICAgICBuRW5hYmxlRHJpdmVyU3RvcDsKKyAgIHZfQk9PTF90ICAgICAgZklzSW1wc0VuYWJsZWQ7CisgICB2X0JPT0xfdCAgICAgIGZJc0xvZ3BFbmFibGVkOworICAgdl9VOF90ICAgICAgICBidGNFeGVjdXRpb25Nb2RlOworICAgdl9VOF90ICAgICAgICBidGNDb25zQnRTbG90c1RvQmxvY2tEdXJpbmdEaGNwOworICAgdl9VOF90ICAgICAgICBidGNBMkRQQnRTdWJJbnRlcnZhbHNEdXJpbmdEaGNwOworICAgdl9VMzJfdCAgICAgICBuSW1wc01vZFNsZWVwVGltZTsKKyAgIHZfVTMyX3QgICAgICAgbkltcHNNYXhTbGVlcFRpbWU7CisgICB2X1UzMl90ICAgICAgIG5JbXBzTWluU2xlZXBUaW1lOworICAgdl9CT09MX3QgICAgICBmSXNCbXBzRW5hYmxlZDsKKyAgIHZfVTMyX3QgICAgICAgbkJtcHNNb2RMaXN0ZW5JbnRlcnZhbDsKKyAgIHZfVTMyX3QgICAgICAgbkJtcHNNYXhMaXN0ZW5JbnRlcnZhbDsKKyAgIHZfVTMyX3QgICAgICAgbkJtcHNNaW5MaXN0ZW5JbnRlcnZhbDsKKyAgIHZfQk9PTF90ICAgICAgZklzQXV0b0JtcHNUaW1lckVuYWJsZWQ7CisgICB2X1UzMl90ICAgICAgIG5BdXRvQm1wc1RpbWVyVmFsdWU7CisgICBlSGRkRG90MTFNb2RlIGRvdDExTW9kZTsKKyAgIHZfVTMyX3QgICAgICAgbkNoYW5uZWxCb25kaW5nTW9kZTI0R0h6OworICAgdl9VMzJfdCAgICAgICBuQ2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKKyAgIHZfVTMyX3QgICAgICAgTWF4UnhBbXBkdUZhY3RvcjsKKyAgIHZfVTMyX3QgICAgICAgbkJBQWdpbmdUaW1lckludGVydmFsOworICAgdl9VMTZfdCAgICAgICBUeFJhdGU7CisgICB2X1UzMl90ICAgICAgIEFkYXB0aXZlVGhyZXNob2xkQWxnbzsKKyAgIHZfVTMyX3QgICAgICAgU2hvcnRHSTIwTWh6RW5hYmxlOworICAgdl9VMzJfdCAgICAgICBCbG9ja0Fja0F1dG9TZXR1cDsKKyAgIHZfVTMyX3QgICAgICAgU2NhblJlc3VsdEFnZUNvdW50OworICAgdl9VMzJfdCAgICAgICBuU2NhbkFnZVRpbWVOQ05QUzsKKyAgIHZfVTMyX3QgICAgICAgblNjYW5BZ2VUaW1lTkNQUzsKKyAgIHZfVTMyX3QgICAgICAgblNjYW5BZ2VUaW1lQ05QUzsKKyAgIHZfVTMyX3QgICAgICAgblNjYW5BZ2VUaW1lQ1BTOworICAgdl9VOF90ICAgICAgICBuUnNzaUNhdEdhcDsKKyAgIHZfVTMyX3QgICAgICAgblN0YXRUaW1lckludGVydmFsOworICAgdl9CT09MX3QgICAgICBmSXNTaG9ydFByZWFtYmxlOworICAgdl9CT09MX3QgICAgICBmSXNBdXRvSWJzc0Jzc2lkOworICAgdl9NQUNBRERSX3QgICBJYnNzQnNzaWQ7CisgICAKKyAgIHZfVThfdCAgICAgICAgaW50ZkFkZHJNYXNrOworICAgdl9NQUNBRERSX3QgICBpbnRmTWFjQWRkcltWT1NfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkFdOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgdl9CT09MX3QgICAgICBhcFVhcHNkRW5hYmxlZDsKKyAgIHZfQk9PTF90ICAgICAgYXBQcm90RW5hYmxlZDsKKyAgIHZfVTE2X3QgICAgICAgYXBQcm90ZWN0aW9uOworICAgdl9CT09MX3QgICAgICBhcE9CU1NQcm90RW5hYmxlZDsKKyAgIHZfVThfdCAgICAgICAgTWluRnJhbWVzUHJvY1RocmVzOworICAgdl9VOF90ICAgICAgICBhcENudHJ5Q29kZVs0XTsKKyAgIHZfQk9PTF90ICAgICAgYXBEaXNhYmxlSW50cmFCc3NGd2Q7CisgICB2X1U4X3QgICAgICAgIG5FbmFibGVMaXN0ZW5Nb2RlOyAgICAKKyAgIHZfVTMyX3QgICAgICAgbkFQQXV0b1NodXRPZmY7CisgICB2X1U4X3QgICAgICAgIGFwU3RhcnRDaGFubmVsTnVtOworICAgdl9VOF90ICAgICAgICBhcEVuZENoYW5uZWxOdW07CisgICB2X1U4X3QgICAgICAgIGFwT3BlcmF0aW5nQmFuZDsKKyAgIHZfQk9PTF90ICAgICAgYXBBdXRvQ2hhbm5lbFNlbGVjdGlvbjsKKyAgIHZfVThfdCAgICAgICAgZW5hYmxlTFRFQ29leDsKKyAgIHZfVTMyX3QgICAgICAgYXBLZWVwQWxpdmVQZXJpb2Q7CisgICB2X1UzMl90ICAgICAgIGdvS2VlcEFsaXZlUGVyaW9kOworI2VuZGlmCisgICB2X1UzMl90ICAgICAgIG5CZWFjb25JbnRlcnZhbDsKKyAgIHZfVThfdCAgICAgICAgblR4UG93ZXJDYXA7ICAgLy9JbiBkQm0KKyAgIHZfQk9PTF90ICAgICAgZklzTG93R2Fpbk92ZXJyaWRlOworICAgdl9VOF90ICAgICAgICBkaXNhYmxlUGFja2V0RmlsdGVyOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgdl9CT09MX3QgICAgICBmUnJtRW5hYmxlOworICAgdl9VOF90ICAgICAgICBuSW5DaGFuTWVhc01heER1cmF0aW9uOworICAgdl9VOF90ICAgICAgICBuT3V0Q2hhbk1lYXNNYXhEdXJhdGlvbjsKKyAgIHZfVTE2X3QgICAgICAgblJybVJhbmRuSW50dmw7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAvL1Zvd2lmaSAxMXIgcGFyYW1zCisgICB2X0JPT0xfdCAgICAgIGZGVEVuYWJsZTsKKyAgIHZfQk9PTF90ICAgICAgZkZUUmVzb3VyY2VSZXFTdXBwb3J0ZWQ7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisgICB2X1UxNl90ICAgICAgIG5OZWlnaGJvclNjYW5QZXJpb2Q7CisgICB2X1UxNl90ICAgICAgIG5OZWlnaGJvclJlYXNzb2NSc3NpVGhyZXNob2xkOworICAgdl9VMTZfdCAgICAgICBuTmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkOworICAgY2hhciAgICAgICAgICBuZWlnaGJvclNjYW5DaGFuTGlzdFsxMDBdOyAgICAgICAgIAorICAgdl9VMTZfdCAgICAgICBuTmVpZ2hib3JTY2FuTWluQ2hhblRpbWU7IAorICAgdl9VMTZfdCAgICAgICBuTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWU7IAorICAgdl9VMTZfdCAgICAgICBuTWF4TmVpZ2hib3JSZXFUcmllczsKKyAgIHZfVTE2X3QgICAgICAgbk5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2Q7IAorI2VuZGlmCisKKyAgIC8vSGFuZG9mZiBQYXJhbWV0ZXJzCisgICB2X0JPT0xfdCAgICAgIGZJc0hhbmRvZmZFbmFibGVkOworCisgICAvL0FkZGl0aW9uYWwgSGFuZG9mZiBwYXJhbXMKKyAgIHZfQk9PTF90ICAgICAgIG5FbmFibGVJZGxlU2NhbjsKKyAgIHZfVTMyX3QgICAgICAgIG5Sb2FtaW5nVGltZTsKKyAgIHZfVTE2X3QgICAgICAgIG5WY2NSc3NpVHJpZ2dlcjsKKyAgIHZfVTMyX3QgICAgICAgIG5WY2NVbE1hY0xvc3NUaHJlc2hvbGQ7CisKKyAgIHZfVTMyX3QgICAgICAgIG5QYXNzaXZlTWluQ2huVGltZTsgICAgLy9pbiB1bml0cyBvZiBtaWxsaXNlY29uZHMKKyAgIHZfVTMyX3QgICAgICAgIG5QYXNzaXZlTWF4Q2huVGltZTsgICAgLy9pbiB1bml0cyBvZiBtaWxsaXNlY29uZHMKKyAgIHZfVTMyX3QgICAgICAgIG5BY3RpdmVNaW5DaG5UaW1lOyAgICAgLy9pbiB1bml0cyBvZiBtaWxsaXNlY29uZHMKKyAgIHZfVTMyX3QgICAgICAgIG5BY3RpdmVNYXhDaG5UaW1lOyAgICAgLy9pbiB1bml0cyBvZiBtaWxsaXNlY29uZHMKKworICAgdl9VOF90ICAgICAgICAgbk1heFBzUG9sbDsKKworICAgdl9VOF90ICAgICAgICAgblJzc2lGaWx0ZXJQZXJpb2Q7CisgICB2X0JPT0xfdCAgICAgICBmSWdub3JlRHRpbTsKKworICAgdl9VOF90ICAgICAgICAgblJ4QW50OworICAgdl9VOF90ICAgICAgICAgZkVuYWJsZUZ3SGVhcnRCZWF0TW9uaXRvcmluZzsKKyAgIHZfVThfdCAgICAgICAgIGZFbmFibGVGd0JlYWNvbkZpbHRlcmluZzsKKyAgIHZfVThfdCAgICAgICAgIGZFbmFibGVGd1Jzc2lNb25pdG9yaW5nOworICAgdl9VOF90ICAgICAgICAgbkRhdGFJbmFjdGl2aXR5VGltZW91dDsKKyAgIHZfVThfdCAgICAgICAgIG50aEJlYWNvbkZpbHRlcjsKKworICAgLy9XTU0gUW9TIENvbmZpZ3VyYXRpb24KKyAgIGhkZF93bW1fdXNlcl9tb2RlX3QgICAgICAgICAgV21tTW9kZTsKKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICAgYjgwMjExZUlzRW5hYmxlZDsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgVWFwc2RNYXNrOyAgICAvLyB3aGF0IEFDcyB0byBzZXR1cCBVLUFQU0QgZm9yIGF0IGFzc29jCisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgIE1heFNwTGVuZ3RoOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICBJbmZyYVVhcHNkVm9TcnZJbnR2OworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICBJbmZyYVVhcHNkVm9TdXNwSW50djsKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgSW5mcmFVYXBzZFZpU3J2SW50djsKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgSW5mcmFVYXBzZFZpU3VzcEludHY7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhVWFwc2RCZVNydkludHY7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhVWFwc2RCZVN1c3BJbnR2OworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICBJbmZyYVVhcHNkQmtTcnZJbnR2OworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICBJbmZyYVVhcHNkQmtTdXNwSW50djsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhSW5hY3Rpdml0eUludGVydmFsOworICAgdl9CT09MX3QgICAgICAgICAgICAgICAgICAgICBpc0NjeEluaUZlYXR1cmVFbmFibGVkOworI2VuZGlmCisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fQ0NYKQorICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICBGVFJzc2lGaWx0ZXJQZXJpb2Q7CisgICB2X0JPT0xfdCAgICAgICAgICAgICAgICAgICAgIGlzRmFzdFRyYW5zaXRpb25FbmFibGVkOworI2VuZGlmCisKKyAgIGhkZF93bW1fY2xhc3NpZmljYXRpb25fdCAgICAgUGt0Q2xhc3NpZmljYXRpb25CYXNpczsgLy8gRFNDUCBvciA4MDIuMVEKKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICAgYkltcGxpY2l0UW9zRW5hYmxlZDsKKworICAgLyogZGVmYXVsdCBUU1BFQyBwYXJhbWV0ZXJzIGZvciBBQ19WTyAqLworICAgc21lX1Fvc1dtbURpclR5cGUgICAgICAgICAgICBJbmZyYURpckFjVm87CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhTm9tTXNkdVNpemVBY1ZvOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICBJbmZyYU1lYW5EYXRhUmF0ZUFjVm87CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhTWluUGh5UmF0ZUFjVm87CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhU2JhQWNWbzsKKworICAgLyogZGVmYXVsdCBUU1BFQyBwYXJhbWV0ZXJzIGZvciBBQ19WSSAqLworICAgc21lX1Fvc1dtbURpclR5cGUgICAgICAgICAgICBJbmZyYURpckFjVmk7CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhTm9tTXNkdVNpemVBY1ZpOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICBJbmZyYU1lYW5EYXRhUmF0ZUFjVmk7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhTWluUGh5UmF0ZUFjVmk7CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhU2JhQWNWaTsKKworICAgLyogZGVmYXVsdCBUU1BFQyBwYXJhbWV0ZXJzIGZvciBBQ19CRSAqLworICAgc21lX1Fvc1dtbURpclR5cGUgICAgICAgICAgICBJbmZyYURpckFjQmU7CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhTm9tTXNkdVNpemVBY0JlOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICBJbmZyYU1lYW5EYXRhUmF0ZUFjQmU7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhTWluUGh5UmF0ZUFjQmU7CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhU2JhQWNCZTsKKworICAgLyogZGVmYXVsdCBUU1BFQyBwYXJhbWV0ZXJzIGZvciBBQ19CSyAqLworICAgc21lX1Fvc1dtbURpclR5cGUgICAgICAgICAgICBJbmZyYURpckFjQms7CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhTm9tTXNkdVNpemVBY0JrOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICBJbmZyYU1lYW5EYXRhUmF0ZUFjQms7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhTWluUGh5UmF0ZUFjQms7CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgIEluZnJhU2JhQWNCazsKKworICAgLyogVEwgcmVsYXRlZCBjb25maWd1cmF0aW9uICovCisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgIFdmcUJrV2VpZ2h0OworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICBXZnFCZVdlaWdodDsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgV2ZxVmlXZWlnaHQ7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgIFdmcVZvV2VpZ2h0OworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICBEZWxheWVkVHJpZ2dlckZybUludDsKKworICAgLyogV293bCBwYXR0ZXJuICovCisgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgd293bFBhdHRlcm5bMTAyNF07ICAgICAgICAgCisgICB2X0JPT0xfdCAgICAgICAgICAgICAgICAgICAgYjE5cDJNaHpQbWljQ2xrRW5hYmxlZDsKKworICAgLyogQ29udHJvbCBmb3IgUmVwbGF5IGNvdW5ldHIuIHZhbHVlIDEgbWVhbnMgCisgICAgICBzaW5nbGUgcmVwbGF5IGNvdW50ZXIgZm9yIGFsbCBUSUQqLworICAgdl9CT09MX3QgICAgICAgICAgICAgICAgICAgIGJTaW5nbGVUaWRSYzsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICBtY2FzdEJjYXN0RmlsdGVyU2V0dGluZzsKKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICBmaG9zdEFycE9mZmxvYWQ7CisgICB2X0JPT0xfdCAgICAgICAgICAgICAgICAgICAgYnVyc3RTaXplRGVmaW5pdGlvbjsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICB0c0luZm9BY2tQb2xpY3k7CisgICAKKyAgIC8qIFJGIFNldHRsaW5nIFRpbWUgQ2xvY2sgKi8KKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICByZlNldHRsaW5nVGltZVVzOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ0QW1wOworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZENoYW5uZWw7CisjZW5kaWYgLy9XTEFOX0JUQU1QX0ZFQVRVUkUKKworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNQc1BvbGxWYWx1ZTsKKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICBBZGRUU1doZW5BQ01Jc09mZjsKKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICBmVmFsaWRhdGVTY2FuTGlzdDsKKworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgIGluZnJhU3RhS2VlcEFsaXZlUGVyaW9kOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgIG5OdWxsRGF0YUFwUmVzcFRpbWVvdXQ7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgbkJhbmRDYXBhYmlsaXR5OworCisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgYXBEYXRhQXZhaWxQb2xsUGVyaW9kSW5NczsKKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICBmRW5hYmxlQmVhY29uRWFybHlUZXJtaW5hdGlvbjsKKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICB0ZWxlQmNuV2FrZXVwRW47CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8qIFdESSBUcmFjZSBDb250cm9sICovCisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgd2RpVHJhY2VFbmFibGVEQUw7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgd2RpVHJhY2VFbmFibGVDVEw7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgd2RpVHJhY2VFbmFibGVEQVQ7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgd2RpVHJhY2VFbmFibGVQQUw7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgblRlbGVCY25UcmFuc0xpc3RlbkludGVydmFsOworICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgICAgIG5UZWxlQmNuTWF4TGlzdGVuSW50ZXJ2YWw7CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgblRlbGVCY25UcmFuc0xpTnVtSWRsZUJlYWNvbnM7CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgICAgblRlbGVCY25NYXhMaU51bUlkbGVCZWFjb25zOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgIGJjbkVhcmx5VGVybVdha2VJbnRlcnZhbDsKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICBlbmFibGVDbG9zZUxvb3A7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQnlwYXNzMTFkOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZURGU0NobmxTY2FuOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUR5bmFtaWNEVElNOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUF1dG9tYXRpY1R4UG93ZXJDb250cm9sOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgIFNob3J0R0k0ME1oekVuYWJsZTsKKyAgIGVIZGRMaW5rU3BlZWRSZXBvcnRUeXBlICAgICByZXBvcnRNYXhMaW5rU3BlZWQ7CisgICB2X1MzMV90ICAgICAgICAgICAgICAgICAgICAgbGlua1NwZWVkUnNzaUhpZ2g7CisgICB2X1MzMV90ICAgICAgICAgICAgICAgICAgICAgbGlua1NwZWVkUnNzaUxvdzsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICBlbmFibGVNQ0M7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgdl9CT09MX3QgICAgICAgICAgICAgICAgICAgIGlzUDJwRGV2aWNlQWRkckFkbWluaXN0cmF0ZWQ7CisjZW5kaWYKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICB0aGVybWFsTWl0aWdhdGlvbkVuYWJsZTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworICAgdl9CT09MX3QgICAgICAgICAgICAgICAgICAgIGlzTWNBZGRyTGlzdEZpbHRlcjsKKyNlbmRpZgorICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU1vZHVsYXRlZERUSU07Cit9IGhkZF9jb25maWdfdDsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCitWT1NfU1RBVFVTIGhkZF9wYXJzZV9jb25maWdfaW5pKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOworVk9TX1NUQVRVUyBoZGRfc2V0X3NtZV9jb25maWcoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggKTsKK3ZfQk9PTF90IGhkZF91cGRhdGVfY29uZmlnX2RhdCAoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggKTsKK1ZPU19TVEFUVVMgaGRkX2NmZ19nZXRfY29uZmlnKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGNoYXIgKnBCdWYsIGludCBidWZsZW4pOworZUNzclBoeU1vZGUgaGRkX2NmZ194bGF0ZV90b19jc3JfcGh5X21vZGUoIGVIZGREb3QxMU1vZGUgZG90MTFNb2RlICk7CitWT1NfU1RBVFVTIGhkZF9leGVjdXRlX2NvbmZpZ19jb21tYW5kKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGNoYXIgKmNvbW1hbmQpOworCisjZGVmaW5lIEZJRUxEX09GRlNFVChfX3R5cGUsIF9fZmllbGQpICgodW5zaWduZWQgaW50KSgmKChfX3R5cGUgKikwKS0+X19maWVsZCkpCisjZGVmaW5lIFZBUl9PRkZTRVQoIF9TdHJ1Y3QsIF9WYXIgKSAoICh1bnNpZ25lZCBpbnQpIEZJRUxEX09GRlNFVChfU3RydWN0LCBfVmFyICkgKQorI2RlZmluZSBWQVJfU0laRSggX1N0cnVjdCwgX1ZhciApIHNpemVvZiggKChfU3RydWN0ICopMCktPl9WYXIgKQorCisjZGVmaW5lIFZBUl9GTEFHU19OT05FICAgICAgICAgKCAgICAgIDAgKQorI2RlZmluZSBWQVJfRkxBR1NfUkVRVUlSRUQgICAgICggMSA8PCAwICkgICAvLyBiaXQgMCBpcyBSZXF1aXJlZCBvciBPcHRpb25hbAorI2RlZmluZSBWQVJfRkxBR1NfT1BUSU9OQUwgICAgICggMCA8PCAwICkKKworI2RlZmluZSBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0sgICggMSA8PCAxICkgICAvLyBiaXQgMSB0ZWxscyBpZiByYW5nZSBjaGVja2luZyBpcyByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbGVzcyB0aGFuIE1JTiwgYXNzdW1lIE1JTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZ3JlYXRlciB0aGFuIE1BWCwgYXNzdW1lIE1BWC4KKworI2RlZmluZSBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX01JTk1BWCAoIFZBUl9GTEFHU19SQU5HRV9DSEVDSyApCisKKyNkZWZpbmUgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxUICggMSA8PCAyICkgIC8vIGJpdCAyIGlzIHJhbmdlIGNoZWNraW5nIHRoYXQgYXNzdW1lcyB0aGUgREVGQVVMVCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbGVzcyB0aGFuIE1JTiwgYXNzdW1lIERFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBncmF0ZWVyIHRoYW4gTUFYLCBhc3N1bWUgREVGQVVMVC4KKworI2RlZmluZSBWQVJfRkxBR1NfRFlOQU1JQ19DRkcgKCAxIDw8IDMgKSAgLy8gQml0IDMgaW5kaWNhdGVzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25maWcgaXRlbSBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGlmaWVkIGR5bmFtaWNpYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gYSBydW5uaW5nIHN5c3RlbQorCit0eXBlZGVmIGVudW0gCit7CisgIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgV0xBTl9QQVJBTV9TaWduZWRJbnRlZ2VyLAorICBXTEFOX1BBUkFNX0hleEludGVnZXIsCisgIFdMQU5fUEFSQU1fU3RyaW5nLAorICBXTEFOX1BBUkFNX01hY0FkZHIsCit9V0xBTl9QQVJBTUVURVJfVFlQRTsKKworI2RlZmluZSBSRUdfVkFSSUFCTEUoIF9OYW1lLCBfVHlwZSwgIF9TdHJ1Y3QsIF9WYXJOYW1lLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgX0ZsYWdzLCBfRGVmYXVsdCwgX01pbiwgX01heCApICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoIF9OYW1lICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggX1R5cGUgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCBfRmxhZ3MgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWQVJfT0ZGU0VUKCBfU3RydWN0LCBfVmFyTmFtZSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZBUl9TSVpFKCBfU3RydWN0LCBfVmFyTmFtZSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCBfRGVmYXVsdCApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoIF9NaW4gKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggX01heCApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgUkVHX0RZTkFNSUNfVkFSSUFCTEUoIF9OYW1lLCBfVHlwZSwgIF9TdHJ1Y3QsIF9WYXJOYW1lLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZsYWdzLCBfRGVmYXVsdCwgX01pbiwgX01heCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ0JGdW5jLCBfQ0JQYXJhbSApICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoIF9OYW1lICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggX1R5cGUgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCBWQVJfRkxBR1NfRFlOQU1JQ19DRkcgfCAoIF9GbGFncyApICksICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWQVJfT0ZGU0VUKCBfU3RydWN0LCBfVmFyTmFtZSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZBUl9TSVpFKCBfU3RydWN0LCBfVmFyTmFtZSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCBfRGVmYXVsdCApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoIF9NaW4gKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggX01heCApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCBfQ0JGdW5jICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoIF9DQlBhcmFtICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgUkVHX1ZBUklBQkxFX1NUUklORyggX05hbWUsIF9UeXBlLCAgX1N0cnVjdCwgX1Zhck5hbWUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRmxhZ3MsIF9EZWZhdWx0ICkgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCBfTmFtZSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoIF9UeXBlICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggX0ZsYWdzICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVkFSX09GRlNFVCggX1N0cnVjdCwgX1Zhck5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWQVJfU0laRSggX1N0cnVjdCwgX1Zhck5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh1bnNpZ25lZCBsb25nKSggX0RlZmF1bHQgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCit0eXBlZGVmIHN0cnVjdCB0UkVHX1RBQkxFX0VOVFJZIHsKKworICBjaGFyKiAgICAgICAgICAgICAgIFJlZ05hbWU7ICAgICAgICAgICAgLy8gdmFyaWFibGUgbmFtZSBpbiB0aGUgcWNvbV9jZmcuaW5pIGZpbGUKKyAgV0xBTl9QQVJBTUVURVJfVFlQRSBSZWdUeXBlOyAgICAgICAgICAgIC8vIHZhcmlhYmxlIHR5cGUgaW4gdGhlIGhkZF9jb25maWdfdCBzdHJ1Y3R1cmUKKyAgdW5zaWduZWQgbG9uZyAgICAgICBGbGFnczsgICAgICAgICAgICAgIC8vIFNwZWNpZnkgb3B0aW9uYWwgcGFybXMgYW5kIGlmIFJhbmdlQ2hlY2sgaXMgcGVyZm9ybWVkCisgIHVuc2lnbmVkIHNob3J0ICAgICAgVmFyT2Zmc2V0OyAgICAgICAgICAvLyBvZmZzZXQgdG8gZmllbGQgZnJvbSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgdW5zaWduZWQgc2hvcnQgICAgICBWYXJTaXplOyAgICAgICAgICAgIC8vIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgZmllbGQKKyAgdW5zaWduZWQgbG9uZyAgICAgICBWYXJEZWZhdWx0OyAgICAgICAgIC8vIGRlZmF1bHQgdmFsdWUgdG8gdXNlCisgIHVuc2lnbmVkIGxvbmcgICAgICAgVmFyTWluOyAgICAgICAgICAgICAvLyBtaW5pbXVtIHZhbHVlLCBmb3IgcmFuZ2UgY2hlY2tpbmcKKyAgdW5zaWduZWQgbG9uZyAgICAgICBWYXJNYXg7ICAgICAgICAgICAgIC8vIG1heGltdW0gdmFsdWUsIGZvciByYW5nZSBjaGVja2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRHluYW1pYyBtb2RpZmljYXRpb24gbm90aWZpZXIKKyAgdm9pZCAoKnBmbkR5bmFtaWNOb3RpZnkpKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIHVuc2lnbmVkIGxvbmcgTm90aWZ5SWQpOworICB1bnNpZ25lZCBsb25nICAgICAgIE5vdGlmeUlkOyAgICAgICAgICAgLy8gRHluYW1pYyBtb2RpZmljYXRpb24gaWRlbnRpZmllcgorfSBSRUdfVEFCTEVfRU5UUlk7CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBsb25nIHV0aWxNaW4oIHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiICkKK3sKKyAgcmV0dXJuKCAoIGEgPCBiICkgPyBhIDogYiApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy93bGFuX2hkZF9jZmc4MDIxMS5oIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX2NmZzgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3MTExYgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9jZmc4MDIxMS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIEhERF9DRkc4MDIxMV9IX18gKQorI2RlZmluZSBIRERfQ0ZHODAyMTFfSF9fCisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgd2xhbl9oZGRfY2ZnODAyMTEuaAorICAKKyAgXGJyaWVmIGNmZzgwMjExIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKKyAgICAKKyAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLgorICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgICAgICAgICAgICAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgIAorLyogJEhFQURFUiQgKi8KKworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorCisvL3ZhbHVlIGZvciBpbml0aWFsIHBhcnQgb2YgZnJhbWVzIGFuZCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29tcGFyZWQKKyNkZWZpbmUgR0FTX0lOSVRJQUxfUkVRICJceDA0XHgwYSIgIAorI2RlZmluZSBHQVNfSU5JVElBTF9SRVFfU0laRSAyCisKKyNkZWZpbmUgR0FTX0lOSVRJQUxfUlNQICJceDA0XHgwYiIKKyNkZWZpbmUgR0FTX0lOSVRJQUxfUlNQX1NJWkUgMgorCisjZGVmaW5lIEdBU19DT01FQkFDS19SRVEgIlx4MDRceDBjIgorI2RlZmluZSBHQVNfQ09NRUJBQ0tfUkVRX1NJWkUgMgorCisjZGVmaW5lIEdBU19DT01FQkFDS19SU1AgIlx4MDRceDBkIgorI2RlZmluZSBHQVNfQ09NRUJBQ0tfUlNQX1NJWkUgMgorCisjZGVmaW5lIFAyUF9QVUJMSUNfQUNUSU9OX0ZSQU1FICJceDA0XHgwOVx4NTBceDZmXHg5YVx4MDkiIAorI2RlZmluZSBQMlBfUFVCTElDX0FDVElPTl9GUkFNRV9TSVpFIDYKKworI2RlZmluZSBQMlBfQUNUSU9OX0ZSQU1FICJceDdmXHg1MFx4NmZceDlhXHgwOSIKKyNkZWZpbmUgUDJQX0FDVElPTl9GUkFNRV9TSVpFIDUKKworI2RlZmluZSBIRERfUDJQX1dJTERDQVJEX1NTSUQgIkRJUkVDVC0iIC8vVE9ETyBQdXQgaXQgaW4gcHJvcGVyIHBsYWNlOworI2RlZmluZSBIRERfUDJQX1dJTERDQVJEX1NTSURfTEVOIDcKKworI2RlZmluZSBXUEFfT1VJX1RZUEUgICAiXHgwMFx4NTBceGYyXHgwMSIKKyNkZWZpbmUgQkxBQ0tMSVNUX09VSV9UWVBFICAgIlx4MDBceDUwXHgwMFx4MDAiCisjZGVmaW5lIFdISVRFTElTVF9PVUlfVFlQRSAgICJceDAwXHg1MFx4MDBceDAxIgorI2RlZmluZSBXUEFfT1VJX1RZUEVfU0laRSAgNAorCisjZGVmaW5lIFdMQU5fQlNTX01FTUJFUlNISVBfU0VMRUNUT1JfSFRfUEhZIDEyNworI2RlZmluZSBCQVNJQ19SQVRFX01BU0sgICAweDgwCisjZGVmaW5lIFJBVEVfTUFTSyAgICAgICAgIDB4N2YKKworc3RydWN0IGNmZzgwMjExX2Jzcyogd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Jzc19kYiggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2tleV93YXBpKGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyLAorICAgICAgICAgICAgICB1OCBrZXlfaW5kZXgsIGNvbnN0IHU4ICptYWNfYWRkciwgdTggKmtleSAsIGludCBrZXlfTGVuKTsKKyNlbmRpZgorc3RydWN0IHdpcGh5ICp3bGFuX2hkZF9jZmc4MDIxMV9pbml0KGludCBwcml2X3NpemUpOworCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3aXBoeSAqd2lwaHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190ICpwQ2ZnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK3ZvaWQgd2xhbl9oZGRfY2ZnODAyMTFfcG9zdF92b3NzX3N0YXJ0KGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyKTsKKwordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9wcmVfdm9zc19zdG9wKGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyKTsKKworCisjZW5kaWYgLy8gQ09ORklHX0NGRzgwMjExCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvaW5jL3dsYW5faGRkX2Rldl9wd3IuaCBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9kZXZfcHdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmNTVlZgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9kZXZfcHdyLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fV0xBTl9IRERfREVWX1BXUl9ICisjZGVmaW5lIF9fV0xBTl9IRERfREVWX1BXUl9ICisKKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3Bvd2VyLmg+CisjaW5jbHVkZSA8dm9zX3NjaGVkLmg+CisjaW5jbHVkZSA8dm9zX2FwaS5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgQGJyaWVmIFJlZ2lzdHJhdGlvbiBmdW5jdGlvbi4KKyAgICAgICAgUmVnaXN0ZXIgc3VzcGVuZCwgcmVzdW1lIGNhbGxiYWNrIGZ1bmN0aW9ucyB3aXRoIHBsYXRmb3JtIGRyaXZlci4gCisKKyAgIEBwYXJhbSBoZGRfY29udGV4dF90IHBIZGRDdHgKKyAgICAgICAgR2xvYmFsIGhkZCBjb250ZXh0CisKKyAgIEByZXR1cm4gR2VuZXJhbCBzdGF0dXMgY29kZQorICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgICAgICAgUmVnaXN0cmF0aW9uIFN1Y2Nlc3MKKyAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgICAgIFJlZ2lzdHJhdGlvbiBGYWlsCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBoZGRSZWdpc3RlclBtT3BzKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgQGJyaWVmIERlLXJlZ2lzdHJhdGlvbiBmdW5jdGlvbi4KKyAgICAgICAgRGVyZWdpc3RlciB0aGUgc3VzcGVuZCwgcmVzdW1lIGNhbGxiYWNrIGZ1bmN0aW9ucyB3aXRoIHBsYXRmb3JtIGRyaXZlcgorCisgICBAcGFyYW0gaGRkX2NvbnRleHRfdCBwSGRkQ3R4CisgICAgICAgIEdsb2JhbCBoZGQgY29udGV4dAorCisgICBAcmV0dXJuIEdlbmVyYWwgc3RhdHVzIGNvZGUKKyAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICAgICAgIERlLVJlZ2lzdHJhdGlvbiBTdWNjZXNzCisgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFICAgICBEZS1SZWdpc3RyYXRpb24gRmFpbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgaGRkRGVyZWdpc3RlclBtT3BzKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgQGJyaWVmIFRNIExldmVsIENoYW5nZSBoYW5kbGVyCisgICAgICAgICAgUmVjZWl2ZWQgVG0gTGV2ZWwgY2hhbmdlZCBub3RpZmljYXRpb24KKworICAgQHBhcmFtIGRldiA6IERldmljZSBjb250ZXh0CisgICAgICAgICAgY2hhbmdlZFRtTGV2ZWwgOiBDaGFuZ2VkIG5ldyBUTSBsZXZlbAorCisgICBAcmV0dXJuIAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaGRkRGV2VG1MZXZlbENoYW5nZWRIYW5kbGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGNoYW5nZWRUbUxldmVsKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIEBicmllZiBSZWdpc3RlciBmdW5jdGlvbgorICAgICAgICBSZWdpc3RlciBUaGVybWFsIE1pdGlnYXRpb24gTGV2ZWwgQ2hhbmdlZCBoYW5kbGUgY2FsbGJhY2sgZnVuY3Rpb24KKworICAgQHBhcmFtIGhkZF9jb250ZXh0X3QgcEhkZEN0eAorICAgICAgICBHbG9iYWwgaGRkIGNvbnRleHQKKworICAgQHJldHVybiBHZW5lcmFsIHN0YXR1cyBjb2RlCisgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgICAgICBSZWdpc3RyYXRpb24gU3VjY2VzcworICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAgICAgUmVnaXN0cmF0aW9uIEZhaWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIGhkZERldlRtUmVnaXN0ZXJOb3RpZnlDYWxsYmFjayhoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIEBicmllZiBVbi1SZWdpc3RlciBmdW5jdGlvbgorICAgICAgICBVbi1SZWdpc3RlciBUaGVybWFsIE1pdGlnYXRpb24gTGV2ZWwgQ2hhbmdlZCBoYW5kbGUgY2FsbGJhY2sgZnVuY3Rpb24KKworICAgQHBhcmFtIGhkZF9jb250ZXh0X3QgcEhkZEN0eAorICAgICAgICBHbG9iYWwgaGRkIGNvbnRleHQKKworICAgQHJldHVybiBHZW5lcmFsIHN0YXR1cyBjb2RlCisgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgICAgICBVbi1SZWdpc3RyYXRpb24gU3VjY2VzcworICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAgICAgVW4tUmVnaXN0cmF0aW9uIEZhaWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIGhkZERldlRtVW5yZWdpc3Rlck5vdGlmeUNhbGxiYWNrKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy93bGFuX2hkZF9kcF91dGlscy5oIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX2RwX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkOTQxOAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9kcF91dGlscy5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1dMQU5fSEREX0RQX1VUSUxTX0ggKQorI2RlZmluZSBfX1dMQU5fSEREX0RQX1VUSUxTX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgd2xhbl9oZGRfZHBfdXRpbHMuaAorICAKKyAgXGJyaWVmICAgICAgVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGRhdGEgcGF0aCBtb2R1bGUKKyAgCisgIERlc2NyaXB0aW9uLi4uCisgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KiovCisvKiAkSEVBREVSJCAqLworICAKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgZmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPHZvc190eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGlfdm9zX3R5cGVzLmg+CisjaW5jbHVkZSA8dm9zX3N0YXR1cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8dm9zX3RyYWNlLmg+CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorI2luY2x1ZGUgPHZvc19saXN0Lmg+CisjZW5kaWYKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUeXBlIGRlY2xhcmF0aW9ucworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCBsaXN0X2hlYWQgaGRkX2xpc3Rfbm9kZV90OworCit0eXBlZGVmIHN0cnVjdCBoZGRfbGlzdF9zCit7CisgICBoZGRfbGlzdF9ub2RlX3QgYW5jaG9yOworICAgdl9TSVpFX3QgY291bnQ7CisgICB2X1NJWkVfdCBtYXhfc2l6ZTsKKyAgIHNwaW5sb2NrX3QgbG9jazsgCit9IGhkZF9saXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICBoZGRfbGlzdF9ub2RlX3QgYW5jaG9yOworICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgIGludCB1c2VyUHJpb3JpdHk7Cit9IHNrYl9saXN0X25vZGVfdDsKKworLy9GSVhNRSBOZWVkIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFudXAgc2ticyBpbiBhIHF1ZXVlLiBSZXF1aXJlZCBmb3IgY2xlYW51cC9zaHV0ZG93bgorICAKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfSU5MSU5FX0ZOIHZfVk9JRF90IGhkZF9saXN0X2luaXQoIGhkZF9saXN0X3QgKnBMaXN0LCB2X1NJWkVfdCBtYXhfc2l6ZSkKK3sKKyAgIElOSVRfTElTVF9IRUFEKCAmcExpc3QtPmFuY2hvciApOworICAgcExpc3QtPmNvdW50ID0gMDsKKyAgIHBMaXN0LT5tYXhfc2l6ZSA9IG1heF9zaXplOworICAgc3Bpbl9sb2NrX2luaXQoJnBMaXN0LT5sb2NrKTsKK30KKworVk9TX0lOTElORV9GTiB2X1ZPSURfdCBoZGRfbGlzdF9kZXN0cm95KCBoZGRfbGlzdF90ICpwTGlzdCApCit7CisgICBpZiAoIHBMaXN0LT5jb3VudCAhPTAgKQorICAgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBsaXN0IGxlbmd0aCBub3QgZXF1YWwgdG8gemVybyIsX19GVU5DVElPTl9fKTsKKyAgIH0KK30KKworVk9TX0lOTElORV9GTiB2X1ZPSURfdCBoZGRfbGlzdF9zaXplKCBoZGRfbGlzdF90ICpwTGlzdCwgdl9TSVpFX3QgKnBTaXplICkKK3sKKyAgICpwU2l6ZSA9IHBMaXN0LT5jb3VudDsKK30KKworVk9TX1NUQVRVUyBoZGRfbGlzdF9pbnNlcnRfZnJvbnQoIGhkZF9saXN0X3QgKnBMaXN0LCBoZGRfbGlzdF9ub2RlX3QgKnBOb2RlICk7CisKK1ZPU19TVEFUVVMgaGRkX2xpc3RfaW5zZXJ0X2JhY2soIGhkZF9saXN0X3QgKnBMaXN0LCBoZGRfbGlzdF9ub2RlX3QgKnBOb2RlICk7CisKK1ZPU19TVEFUVVMgaGRkX2xpc3RfaW5zZXJ0X2JhY2tfc2l6ZSggaGRkX2xpc3RfdCAqcExpc3QsIGhkZF9saXN0X25vZGVfdCAqcE5vZGUsIHZfU0laRV90ICpwU2l6ZSApOworCitWT1NfU1RBVFVTIGhkZF9saXN0X3JlbW92ZV9mcm9udCggaGRkX2xpc3RfdCAqcExpc3QsIGhkZF9saXN0X25vZGVfdCAqKnBwTm9kZSApOworCitWT1NfU1RBVFVTIGhkZF9saXN0X3JlbW92ZV9iYWNrKCBoZGRfbGlzdF90ICpwTGlzdCwgaGRkX2xpc3Rfbm9kZV90ICoqcHBOb2RlICk7CisKK1ZPU19TVEFUVVMgaGRkX2xpc3RfcmVtb3ZlX25vZGUoIGhkZF9saXN0X3QgKnBMaXN0LCBoZGRfbGlzdF9ub2RlX3QgKnBOb2RlVG9SZW1vdmUgKTsKK1ZPU19TVEFUVVMgaGRkX2xpc3RfcGVla19mcm9udCggaGRkX2xpc3RfdCAqcExpc3QsIGhkZF9saXN0X25vZGVfdCAqKnBwTm9kZSApOworVk9TX1NUQVRVUyBoZGRfbGlzdF9wZWVrX25leHQoIGhkZF9saXN0X3QgKnBMaXN0LCBoZGRfbGlzdF9ub2RlX3QgKnBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9saXN0X25vZGVfdCAqKnBwTm9kZSApOworVk9TX1NUQVRVUyBoZGRfc3RyaW5nX3RvX2hleCggY2hhciAqcFNyY01hYywgaW50IGxlbmd0aCwgY2hhciAqcERlc2NNYWMgKTsKKyNlbmRpZiAvL19fV0xBTl9IRERfRFBfVVRJTFNfSApkaWZmIC0tZ2l0IGEvQ09SRS9IREQvaW5jL3dsYW5faGRkX2V0aGVyLmggYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfZXRoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjgzYmRhCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX2V0aGVyLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1dMQU5fSEREX0VUSEVSX0gKKyNkZWZpbmUgX1dMQU5fSEREX0VUSEVSX0gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAZmlsZSB3bGFuX2hkZF9ldGhlci5oCisKKyAgVGhpcyBtb2R1bGUgZGVzY3JpYmVzIEV0aGVybmV0IHBhY2tldCBmb3JtYXRzIGZvciBwcm9jZXNzaW5nIGJ5IEhERC4KKworICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA5IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXTEFOX1NOQVBfT1VJX0xFTiAzCisjZGVmaW5lIFdMQU5fU05BUF9EU0FQIDB4QUFVCisjZGVmaW5lIFdMQU5fU05BUF9TU0FQIDB4QUFVCisjZGVmaW5lIFdMQU5fU05BUF9DVFJMIDB4MDMKKyNkZWZpbmUgV0xBTl9NSU5fUFJPVE8gMHgwNjAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IHdsYW5fc25hcF9oZHIgeworICAgdW5zaWduZWQgY2hhciBkc2FwOworICAgdW5zaWduZWQgY2hhciBzc2FwOworICAgdW5zaWduZWQgY2hhciBjdHJsOworICAgdW5zaWduZWQgY2hhciBvdWlbV0xBTl9TTkFQX09VSV9MRU5dOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHdsYW5fODAyMyB7CisgICB1bnNpZ25lZCBjaGFyICAgICAgICBoX2Rlc3RbRVRIX0FMRU5dOworICAgdW5zaWduZWQgY2hhciAgICAgICAgaF9zb3VyY2VbRVRIX0FMRU5dOworICAgX19iZTE2ICAgICAgICAgICAgICAgaF9sZW47CisgICBzdHJ1Y3Qgd2xhbl9zbmFwX2hkciBoX3NuYXA7CisgICBfX2JlMTYgICAgICAgICAgICAgICBoX3Byb3RvOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHdsYW5fODAyM192bGFuIHsKKyAgIHVuc2lnbmVkIGNoYXIgICAgICAgIGhfZGVzdFtFVEhfQUxFTl07CisgICB1bnNpZ25lZCBjaGFyICAgICAgICBoX3NvdXJjZVtFVEhfQUxFTl07CisgICBfX2JlMTYgICAgICAgICAgICAgICBoX3ZsYW5fcHJvdG87CisgICBfX2JlMTYgICAgICAgICAgICAgICBoX3ZsYW5fVENJOworICAgX19iZTE2ICAgICAgICAgICAgICAgaF9sZW47CisgICBzdHJ1Y3Qgd2xhbl9zbmFwX2hkciBoX3NuYXA7CisgICBfX2JlMTYgICAgICAgICAgICAgICBoX3Byb3RvOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordW5pb24gZ2VuZXJpY19ldGhoZHIgeworICAgc3RydWN0IGV0aGhkciBldGhfSUk7CisgICBzdHJ1Y3Qgdmxhbl9ldGhoZHIgZXRoX0lJdjsKKyAgIHN0cnVjdCB3bGFuXzgwMjMgZXRoXzgwMjM7CisgICBzdHJ1Y3Qgd2xhbl84MDIzX3ZsYW4gZXRoXzgwMjN2OworfTsKKworI2VuZGlmIC8qICNpZm5kZWYgX1dMQU5fSEREX0VUSEVSX0ggKi8KZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy93bGFuX2hkZF9mdG0uaCBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9mdG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBjZmYwCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX2Z0bS5oCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBXTEFOX0hERF9GVE1fSAorI2RlZmluZSBXTEFOX0hERF9GVE1fSAorI2luY2x1ZGUgInZvc19zdGF0dXMuaCIKKyNpbmNsdWRlICJ2b3NfbXEuaCIKKyNpbmNsdWRlICJ2b3NfYXBpLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAiaGFsVHlwZXMuaCIKKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlIDx3bGFuX3B0dF9zb2NrX3N2Yy5oPgorCisjZGVmaW5lIFdMQU5fRlRNX1NVQ0NFU1MgICAwCisjZGVmaW5lIFdMQU5fRlRNX0ZBSUxVUkUgICAxCisKKyNkZWZpbmUgV0xBTl9GVE1fU1RBUlQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV0xBTl9GVE1fU1RPUCAgICAgICAgICAgICAgIDIgICAgICAgIAorI2RlZmluZSBXTEFOX0ZUTV9DTUQgICAgICAgICAgICAgICAgMworCisKKyNkZWZpbmUgV0xBTl9GVE1fUEhZX0NNRCAgICAgICAgIDEwMAorI2RlZmluZSBTSVJfSEFMX0ZUTV9DTUQgICAgICAgICAgMTAKKyNkZWZpbmUgUVVBTENPTU1fTU9EVUxFX1RZUEUgICAgIDIKKyNkZWZpbmUgV0xBTl9GVE1fQ09NTUFORF9USU1FX09VVCAxMDAwCisjZGVmaW5lIFBIWURCR19QUkVBTUJMRV9OT1RfU1VQUE9SVEVEIDB4RkYKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fRlRNX1BSSVZfU0VUX0lOVF9HRVRfTk9ORSAgICAoU0lPQ0lXRklSU1RQUklWICsgMCkKKyNkZWZpbmUgV0VfRlRNX09OX09GRiAgICAgICAgIDEKKyNkZWZpbmUgV0VfVFhfUEtUX0dFTiAgICAgICAgIDIKKyNkZWZpbmUgV0VfU0VUX1RYX0lGUyAgICAgICAgIDMKKyNkZWZpbmUgV0VfU0VUX1RYX1BLVF9DTlQgICAgIDQKKyNkZWZpbmUgV0VfU0VUX1RYX1BLVF9MRU4gICAgIDUKKyNkZWZpbmUgV0VfU0VUX0NIQU5ORUwgICAgICAgIDYKKyNkZWZpbmUgV0VfU0VUX1RYX1BPV0VSICAgICAgIDcKKyNkZWZpbmUgV0VfQ0xFQVJfUlhfUEtUX0NOVCAgIDgKKyNkZWZpbmUgV0VfUlggICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV0VfRU5BQkxFX0NIQUlOICAgICAgMTAKKworLyogUHJpdmF0ZSBpb2N0bHMgYW5kIHRoZWlyIHN1Yi1pb2N0bHMgKi8KKyNkZWZpbmUgV0xBTl9GVE1fUFJJVl9TRVRfTk9ORV9HRVRfSU5UICAgIChTSU9DSVdGSVJTVFBSSVYgKyAxKQorI2RlZmluZSBXRV9HRVRfQ0hBTk5FTCAgICAgIDEKKyNkZWZpbmUgV0VfR0VUX1RYX1BPV0VSICAgICAyCisjZGVmaW5lIFdFX0dFVF9SWF9QS1RfQ05UICAgMworCisvKiBQcml2YXRlIGlvY3RscyBhbmQgdGhlaXIgc3ViLWlvY3RscyAqLworI2RlZmluZSBXTEFOX0ZUTV9QUklWX1NFVF9JTlRfR0VUX0lOVCAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDIpCisKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fRlRNX1BSSVZfU0VUX0NIQVJfR0VUX05PTkUgICAoU0lPQ0lXRklSU1RQUklWICsgMykKKyNkZWZpbmUgV0VfU0VUX01BQ19BRERSRVNTICAgMQorI2RlZmluZSBXRV9TRVRfVFhfUkFURSAgICAgICAyCisKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fRlRNX1BSSVZfU0VUX1RIUkVFX0lOVF9HRVRfTk9ORSAgIChTSU9DSVdGSVJTVFBSSVYgKyA0KQorI2RlZmluZSBXRV9TRVRfV0xBTl9EQkcgICAgICAxCisKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fRlRNX1BSSVZfR0VUX0NIQVJfU0VUX05PTkUgICAoU0lPQ0lXRklSU1RQUklWICsgNSkKKyNkZWZpbmUgV0VfR0VUX01BQ19BRERSRVNTICAgMQorI2RlZmluZSBXRV9HRVRfVFhfUkFURSAgICAgICAgMgorI2RlZmluZSBXRV9HRVRfRlRNX1ZFUlNJT04gICAzCisjZGVmaW5lIFdFX0dFVF9GVE1fU1RBVFVTICAgIDQKKyNkZWZpbmUgV0VfR0VUX1JYX1JTU0kgICAgICAgNQorCisvKiBQcml2YXRlIGlvY3RscyBhbmQgdGhlaXIgc3ViLWlvY3RscyAqLworI2RlZmluZSBXTEFOX0ZUTV9QUklWX1NFVF9OT05FX0dFVF9OT05FICAgKFNJT0NJV0ZJUlNUUFJJViArIDYpCisjZGVmaW5lIFdFX1NFVF9OVl9ERUZBVUxUUyAgICAxCisKKyNkZWZpbmUgV0xBTl9GVE1fUFJJVl9TRVRfVkFSX0lOVF9HRVRfTk9ORSAgIChTSU9DSVdGSVJTVFBSSVYgKyA3KQorI2RlZmluZSBXRV9TRVRfUlNTSV9PRkZTRVQgMQorCisKKyNkZWZpbmUgV0VfRlRNX01BWF9TVFJfTEVOIDEwMjQKKyNkZWZpbmUgTUFYX0ZUTV9WQVJfQVJHUyAgNworCisjZGVmaW5lIE1BWF9OVl9UQUJMRV9TSVpFICAzMDAwMAorCit0eXBlZGVmIGVudW0geworICAgIFdMQU5fRlRNX0NNRF9TVEFSVCA9IDEsCisgICAgV0xBTl9GVE1fQ01EX1NUT1AsICAgICAgICAKKyAgICBXTEFOX0ZUTV9DTURfQ01ECit9IHdsYW5faGRkX2Z0bV9jbWRzOwordHlwZWRlZiBzdHJ1Y3QgZnRtX2hkcl9zIHsKKyAgICB2X1UxNl90IGNtZF9pZDsKKyAgICB2X1UxNl90IGRhdGFfbGVuOworICAgIHZfVTE2X3QgcmVzcFBrdFNpemU7Cit9IGZ0bV9oZHJfdDsKKworLyogVGhlIHJlcXVlc3QgYnVmZmVyIG9mIEZUTSB3aGljaCBjb250YWlucyBhIGJ5dGUgb2YgY29tbWFuZCBhbmQgdGhlIHJlcXVlc3QgKi8KK3R5cGVkZWYgc3RydWN0IHdsYW5faGRkX2Z0bV9wYXlsb2FkX3MgeworICAgIHZfVTE2X3QgICAgZnRtX2NtZF90eXBlOworICAgIHZfVThfdCAgICBwRnRtQ21kWzFdOworfXdsYW5faGRkX2Z0bV9wYXlsb2FkOworI2RlZmluZSBTSVpFX09GX0ZUTV9ESUFHX0hFQURFUl9MRU4gMTIKKy8qIHRoZSBGVE0gY29tbWFuZC9yZXNwb25zZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHdsYW5faGRkX2Z0bV9yZXF1ZXN0X3MKK3sKKyAgICB2X1U4X3QgICAgY21kX2NvZGU7CisgICAgdl9VOF90ICAgIHN1Yl9zeXNfaWQ7CisgICAgdl9VMTZfdCAgIG1vZGVfaWQ7CisgICAgZnRtX2hkcl90IGZ0bV9oZHI7IAorICAgIHZfVTE2X3QgICBtb2R1bGVfdHlwZTsKKyAgICB3bGFuX2hkZF9mdG1fcGF5bG9hZCBmdG1wa3Q7Cit9d2xhbl9oZGRfZnRtX3JlcXVlc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgd2xhbl9oZGRfZnRtX3Jlc3BvbnNlX3MKK3sKKyAgICB2X1U4X3QgICAgY21kX2NvZGU7CisgICAgdl9VOF90ICAgIHN1Yl9zeXNfaWQ7CisgICAgdl9VMTZfdCAgIG1vZGVfaWQ7CisgICAgZnRtX2hkcl90IGZ0bV9oZHI7IAorICAgIHZfVTE2X3QgICBmdG1fZXJyX2NvZGU7CisgICAgd2xhbl9oZGRfZnRtX3BheWxvYWQgZnRtcGt0OworfXdsYW5faGRkX2Z0bV9yZXNwb25zZV90OworCit0eXBlZGVmIGVudW0geworICAgIFdMQU5fRlRNX0lOSVRJQUxJWkVELAorICAgIFdMQU5fRlRNX1NUT1BQRUQsCisgICAgV0xBTl9GVE1fU1RBUlRFRCwKK30gd2xhbl9oZGRfZnRtX3N0YXRlOwordHlwZWRlZiBzdHJ1Y3Qgd2xhbl9oZGRfZnRtX3N0YXR1c19zCit7CisgICAgdl9VOF90IGZ0bV9zdGF0ZTsKKyAgICB3bGFuX2hkZF9mdG1fcmVxdWVzdF90ICAgICpwUmVxdWVzdEJ1ZjsKKyAgICB3bGFuX2hkZF9mdG1fcmVzcG9uc2VfdCAgICpwUmVzcG9uc2VCdWY7CisgICAgdEFuaU5sSGRyICp3bmw7CisgICAgICAgIC8qKnZvcyBldmVudCAqLworICAgIHZvc19ldmVudF90ICBmdG1fdm9zX2V2ZW50OworICAgIAorICAgLyoqIGNvbXBsZXRpb24gdmFyaWFibGUgZm9yIGZ0bSBjb21tYW5kIHRvIGNvbXBsZXRlKi8KKyAgICBzdHJ1Y3QgY29tcGxldGlvbiBmdG1fY29tcF92YXI7CisgICAgdl9CT09MX3QgIElzQ21kUGVuZGluZzsKKyAgICB2X0JPT0xfdCAgY21kX2l3cHJpdjsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgIC8qKiBMYXJnZSBzaXplIG9mIE5WIFRhYmxlIEhhbmRsZSAqKi8KKyAgICBlTnZUYWJsZSAgcHJvY2Vzc2luZ05WVGFibGU7CisgICAgdl9VMzJfdCAgIHRhcmdldE5WVGFibGVTaXplOworICAgIHZfVThfdCAgICp0YXJnZXROVlRhYmxlUG9pbnRlcjsKKyAgICB2X1UzMl90ICAgcHJvY2Vzc2VkTlZUYWJsZVNpemU7CisgICAgdl9VOF90ICAgKnRlbXBOVlRhYmxlQnVmZmVyOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCit9IHdsYW5faGRkX2Z0bV9zdGF0dXNfdDsKK3R5cGVkZWYgc3RydWN0IGZ0bV9tc2dfcworeworICAgIC8qIFRoaXMgZmllbGQgY2FuIGJlIHVzZWQgYXMgc2VxdWVuY2UgCisgICAgICAgIG51bWJlci9kaWFsb2d1ZSB0b2tlbiBmb3IgbWF0Y2hpbmcgcmVxdWVzdC9yZXNwb25zZSAqLworICAgIHZfVTE2X3QgdHlwZTsKKyAgICAKKyAgICAvKiBUaGlzIGd1eSBjYXJyaWVzIHRoZSBjb21tYW5kIGJ1ZmZlciBhbG9uZyB3aXRoIGNvbW1hbmQgaWQgKi8KKyAgICB2b2lkICpjbWRfcHRyOworICAgIHZfVTMyX3QgYm9keXZhbDsKK30gZnRtX21zZ190OwordHlwZWRlZiBzdHJ1Y3QgZnRtX3JzcF9tc2dfcworeworICAgIHZfVTE2X3QgICBtc2dJZDsKKyAgICB2X1UxNl90ICAgbXNnQm9keUxlbmd0aDsKKyAgICB2X1UzMl90ICAgcmVzcFN0YXR1czsKKyAgICB2X1U4X3QgICAqbXNnUmVzcG9uc2U7Cit9IGZ0bV9yc3BfbXNnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHJhdGVJbmRleDJQcmVhbWJsZQoreworICAgIHZfVTE2X3QgICByYXRlX2luZGV4OworICAgIHZfVTE2X3QgICBQcmVhbWJsZTsKK30gcmF0ZUluZGV4MlByZWFtYmxlX3Q7Cit0eXBlZGVmIHN0cnVjdCBmcmVxX2NoYW5fcworeworICAgIHZfVTE2X3QgICBmcmVxOworICAgIHZfVTE2X3QgICBjaGFuOworfSBmcmVxX2NoYW5fdDsKKwordHlwZWRlZiBzdHJ1Y3QgcmF0ZVN0cjJyYXRlSW5kZXhfcworeworICAgIHZfVTE2X3QgICByYXRlX2luZGV4OworICAgIGNoYXIgICAgICByYXRlX3N0clszMF07Cit9IHJhdGVTdHIycmF0ZUluZGV4X3Q7CisKKworI2RlZmluZSBGVE1fU1dBUDE2KEEpICgoKCh0QU5JX1UxNikoQSkgJiAweGZmMDApID4+IDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoKHRBTklfVTE2KShBKSAmIDB4MDBmZikgPDwgOCkgICBcCisgICAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBQVFRfSEVBREVSX0xFTkdUSCA4CisKKyNkZWZpbmUgRlRNX1ZPU19FVkVOVF9XQUlUX1RJTUUgMTAwMDAKKworI2RlZmluZSBTSVpFX09GX1RBQkxFKGEpIHNpemVvZihhKS9zaXplb2YoYVswXSkgICAgICAgICAgICAgICAgICAgICAgCisKK2ludCB3bGFuX2hkZF9mdG1fb3BlbihoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK3ZvaWQgd2xhbl9oZGRfcHJvY2Vzc19mdG1fY21kIChoZGRfY29udGV4dF90ICpwSGRkQ3R4LHRBbmlObEhkciAqd25sKTsKK2ludCB3bGFuX2hkZF9mdG1fY2xvc2UoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvaW5jL3dsYW5faGRkX2hvc3Rfb2ZmbG9hZC5oIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX2hvc3Rfb2ZmbG9hZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGYzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfaG9zdF9vZmZsb2FkLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19XTEFOX0hERF9IT1NUX09GRkxPQURfSF9fCisjZGVmaW5lIF9fV0xBTl9IRERfSE9TVF9PRkZMT0FEX0hfXworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBcZmlsZSAgd2xhbl9oZGRfaG9zdF9vZmZsb2FkLmgKKworICBcYnJpZWYgQW5kcm9pZCBXTEFOIEhERCBIb3N0IE9mZmxvYWQgQVBJCisKKyAgQ29weXJpZ2h0IDIwMTEgKGMpIFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUVVBTENPTU0gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4KKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE9mZmxvYWQgdHlwZXMuICovCisjZGVmaW5lIFdMQU5fSVBWNF9BUlBfUkVQTFlfT0ZGTE9BRCAgICAgICAgICAgMAorI2RlZmluZSBXTEFOX0lQVjZfTkVJR0hCT1JfRElTQ09WRVJZX09GRkxPQUQgIDEKKworLyogRW5hYmxlIG9yIGRpc2FibGUgb2ZmbG9hZC4gKi8KKyNkZWZpbmUgV0xBTl9PRkZMT0FEX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdMQU5fT0ZGTE9BRF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFdMQU5fT0ZGTE9BRF9CQ19GSUxURVJfRU5BQkxFICAgICAgICAgICAgMHgyCisjZGVmaW5lIFdMQU5fT0ZGTE9BRF9BUlBfQU5EX0JDX0ZJTFRFUl9FTkFCTEUgICAgKFdMQU5fT0ZGTE9BRF9FTkFCTEUgfCBXTEFOX09GRkxPQURfQkNfRklMVEVSX0VOQUJMRSkKKworLyogT2ZmbG9hZCByZXF1ZXN0LiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB2X1U4X3Qgb2ZmbG9hZFR5cGU7CisgICAgdl9VOF90IGVuYWJsZU9yRGlzYWJsZTsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgdl9VOF90IGhvc3RJcHY0QWRkciBbNF07CisgICAgICAgIHZfVThfdCBob3N0SXB2NkFkZHIgWzE2XTsKKyAgICB9IHBhcmFtczsKK30gdEhvc3RPZmZsb2FkUmVxdWVzdCwgKnRwSG9zdE9mZmxvYWRSZXF1ZXN0OworCisjZW5kaWYgLy8gX19XTEFOX0hERF9IT1NUX09GRkxPQURfSF9fCisKZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy93bGFuX2hkZF9ob3N0YXBkLmggYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfaG9zdGFwZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTI1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfaG9zdGFwZC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIFdMQU5fSEREX0hPU1RBUERfSCApCisjZGVmaW5lIFdMQU5fSEREX0hPU1RBUERfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBXTEFOX0hERF9IT1NUQVBEX0guaAorICAKKyAgXGJyaWVmIExpbnV4IEhERCBIT1NUQVBEIGluY2x1ZGUgZmlsZQorICAgICAgICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuCisgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgSW5jbHVkZSBmaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIAorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPHZvc19saXN0Lmg+CisjaW5jbHVkZSA8dm9zX3R5cGVzLmg+CisKKyNpbmNsdWRlIDx3bGFuX3FjdF90bC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX21haW4uaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworaGRkX2FkYXB0ZXJfdCogaGRkX3dsYW5fY3JlYXRlX2FwX2RldiggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdFNpck1hY0FkZHIgbWFjQWRkciwgdEFOSV9VOCAqbmFtZSk7CisKK1ZPU19TVEFUVVMgaGRkX3JlZ2lzdGVyX2hvc3RhcGQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHRBTklfVTggcnRubF9oZWxkKTsKKworVk9TX1NUQVRVUyBoZGRfdW5yZWdpc3Rlcl9ob3N0YXBkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKTsKKworZUNzckF1dGhUeXBlIAoraGRkX1RyYW5zbGF0ZVJTTlRvQ3NyQXV0aFR5cGUoIHVfaW50OF90IGF1dGhfc3VpdGVbNF0pOworCitlQ3NyRW5jcnlwdGlvblR5cGUgCitoZGRfVHJhbnNsYXRlUlNOVG9Dc3JFbmNyeXB0aW9uVHlwZSh1X2ludDhfdCBjaXBoZXJfc3VpdGVbNF0pOworCitlQ3NyRW5jcnlwdGlvblR5cGUgCitoZGRfVHJhbnNsYXRlUlNOVG9Dc3JFbmNyeXB0aW9uVHlwZSh1X2ludDhfdCBjaXBoZXJfc3VpdGVbNF0pOworCitlQ3NyQXV0aFR5cGUgCitoZGRfVHJhbnNsYXRlV1BBVG9Dc3JBdXRoVHlwZSh1X2ludDhfdCBhdXRoX3N1aXRlWzRdKTsKKworZUNzckVuY3J5cHRpb25UeXBlIAoraGRkX1RyYW5zbGF0ZVdQQVRvQ3NyRW5jcnlwdGlvblR5cGUodV9pbnQ4X3QgY2lwaGVyX3N1aXRlWzRdKTsKKwordm9pZCBoZGRfc29mdGFwX3N0YV9kZWF1dGgoaGRkX2FkYXB0ZXJfdCosdl9VOF90Kik7Cit2b2lkIGhkZF9zb2Z0YXBfc3RhX2Rpc2Fzc29jKGhkZF9hZGFwdGVyX3QqLHZfVThfdCopOwordm9pZCBoZGRfc29mdGFwX3RraXBfbWljX2ZhaWxfY291bnRlcl9tZWFzdXJlKGhkZF9hZGFwdGVyX3QqLHZfQk9PTF90KTsKK2ludCBoZGRfc29mdGFwX3VucGFja0lFKCB0SGFsSGFuZGxlIGhhbEhhbmRsZSwKKyAgICAgICAgICAgICAgICBlQ3NyRW5jcnlwdGlvblR5cGUgKnBFbmNyeXB0VHlwZSwgCisgICAgICAgICAgICAgICAgZUNzckVuY3J5cHRpb25UeXBlICptY0VuY3J5cHRUeXBlLCAKKyAgICAgICAgICAgICAgICBlQ3NyQXV0aFR5cGUgKnBBdXRoVHlwZSwgCisgICAgICAgICAgICAgICAgdV9pbnQxNl90IGdlbl9pZV9sZW4sIAorICAgICAgICAgICAgICAgIHVfaW50OF90ICpnZW5faWUgKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK1ZPU19TVEFUVVMgaGRkX2hvc3RhcGRfU0FQRXZlbnRDQiggdHBTYXBfRXZlbnQgcFNhcEV2ZW50LCB2X1BWT0lEX3QgdXNyRGF0YUZvckNhbGxiYWNrKTsKK1ZPU19TVEFUVVMgaGRkX2luaXRfYXBfbW9kZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKTsKK3ZvaWQgaGRkX3NldF9hcF9vcHMoIHN0cnVjdCBuZXRfZGV2aWNlICpwV2xhbkhvc3RhcGREZXYgKTsKKyNlbmRpZgorCisjZW5kaWYgICAgLy8gZW5kICNpZiAhZGVmaW5lZCggV0xBTl9IRERfSE9TVEFQRF9IICkKZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy93bGFuX2hkZF9pbmNsdWRlcy5oIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX2luY2x1ZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyNDA1ZAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9pbmNsdWRlcy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIEhERF9JTkNMVURFU19IX18gKQorI2RlZmluZSBIRERfSU5DTFVERVNfSF9fCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHdsYW5faGRkX2luY2x1ZGVzLmgKKyAgCisgIFxicmllZiBJbnRlcm5hbCBpbmNsdWRlcyBmb3IgdGhlIExpbnV4IEhERCAKKyAgCisgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICAKKy8qICRIRUFERVIkICovCisgIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEluY2x1ZGUgZmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorCisvLyB0aHJvdyBhbGwgdGhlIGluY2x1ZGVzIGluIGhlcmUgZiB0byBnZXQgdGhlIC5jIGZpbGVzICBpbiB0aGUgSEREIHRvIGNvbXBpbGUuCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKworI2luY2x1ZGUgPHZvc19hcGkuaD4KKworI2luY2x1ZGUgPHNtZV9BcGkuaD4KKyNpbmNsdWRlIDx3bGFuX3FjdF90bC5oPgorCisjaW5jbHVkZSAid2xhbl9oZGRfYXNzb2MuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9kcF91dGlscy5oIgorI2luY2x1ZGUgIndsYW5faGRkX21pYi5oIgorI2luY2x1ZGUgIndsYW5faGRkX3dleHQuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfdmVyc2lvbi5oIgorI2luY2x1ZGUgIndsYW5faGRkX3R4X3J4LmgiCisKKworI2VuZGlmICAgIC8vIGVuZCAjaWYgIWRlZmluZWQoIEhERF9JTkNMVURFU19IX18gKQpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvaW5jL3dsYW5faGRkX2lubmF2LmggYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfaW5uYXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTliMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX2lubmF2LmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy93bGFuX2hkZF9rZWVwX2FsaXZlLmggYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfa2VlcF9hbGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMGE0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfa2VlcF9hbGl2ZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fV0xBTl9IRERfS0VFUF9BTElWRV9IX18KKyNkZWZpbmUgX19XTEFOX0hERF9LRUVQX0FMSVZFX0hfXworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBcZmlsZSAgd2xhbl9oZGRfa2VlcF9hbGl2ZS5oCisKKyAgXGJyaWVmIEFuZHJvaWQgV0xBTiBIREQgS2VlcC1BbGl2ZSBBUEkKKworICBDb3B5cmlnaHQgMjAxMSAoYykgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRVUFMQ09NTSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogUGFja2V0IFR5cGVzLiAqLworI2RlZmluZSBXTEFOX0tFRVBfQUxJVkVfVU5TT0xJQ0lUX0FSUF9SU1AgICAgIDIKKyNkZWZpbmUgV0xBTl9LRUVQX0FMSVZFX05VTExfUEtUICAgICAgICAgICAgICAxCisKKy8qIEVuYWJsZSBvciBkaXNhYmxlIG9mZmxvYWQuICovCisjZGVmaW5lIFdMQU5fS0VFUF9BTElWRV9ESVNBQkxFICAgICAwCisjZGVmaW5lIFdMQU5fS0VFUF9BTElWRV9FTkFCTEUgICAgMHgxCisKKy8qIE9mZmxvYWQgcmVxdWVzdC4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdl9VOF90IHBhY2tldFR5cGU7CisgICAgdl9VMzJfdCB0aW1lUGVyaW9kOworICAgIHZfVThfdCAgaG9zdElwdjRBZGRyWzRdOyAKKyAgICB2X1U4X3QgIGRlc3RJcHY0QWRkcls0XTsKKyAgICB2X1U4X3QgIGRlc3RNYWNBZGRyIFs2XTsKK30gdEtlZXBBbGl2ZVJlcXVlc3QsICp0cEtlZXBBbGl2ZVJlcXVlc3Q7CisKKyNlbmRpZiAvLyBfX1dMQU5fSEREX0tFRVBfQUxJVkVfSF9fCisKZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy93bGFuX2hkZF9tYWluLmggYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NjA5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfbWFpbi5oCkBAIC0wLDAgKzEsOTI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBXTEFOX0hERF9NQUlOX0ggKQorI2RlZmluZSBXTEFOX0hERF9NQUlOX0gKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIFdMQU5fSEREX01BSU5fSC5oCisgIAorICBcYnJpZWYgTGludXggSEREIEFkYXB0ZXIgVHlwZQorICAgICAgICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuCisgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgSW5jbHVkZSBmaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgIAorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2lmZGVmIENPTkZJR19DRkc4MDIxMQorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2VuZGlmCisjaW5jbHVkZSA8dm9zX2xpc3QuaD4KKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKyNpbmNsdWRlICJzaXJNYWNQcm90RGVmLmgiCisjaW5jbHVkZSAiY3NyQXBpLmgiCisjaW5jbHVkZSA8d2xhbl9oZGRfYXNzb2MuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9kcF91dGlscy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dtbS5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2NmZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaWZkZWYgQU5JX01BTkZfRElBRworI2luY2x1ZGUgPHdsYW5faGRkX2Z0bS5oPgorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogTnVtYmVyIG9mIGF0dGVtcHRzIHRvIGRldGVjdC9yZW1vdmUgY2FyZCAqLworI2RlZmluZSBMSUJSQV9DQVJEX0lOU0VSVF9ERVRFQ1RfTUFYX0NPVU5UICAgICAgNQorI2RlZmluZSBMSUJSQV9DQVJEX1JFTU9WRV9ERVRFQ1RfTUFYX0NPVU5UICAgICAgNQorLyoqIE51bWJlciBvZiBUeCBRdWV1ZXMgKi8gIAorI2RlZmluZSBOVU1fVFhfUVVFVUVTIDQKKy8qKiBRdWV1ZSBsZW5ndGggc3BlY2lmaWVkIHRvIE9TIGluIHRoZSBuZXRfZGV2aWNlICovCisjZGVmaW5lIE5FVF9ERVZfVFhfUVVFVUVfTEVOIDEwMAorLyoqIEhERCdzIGludGVybmFsIFR4IFF1ZXVlIExlbmd0aC4gTmVlZHMgdG8gYmUgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEhERF9UWF9RVUVVRV9NQVhfTEVOIDEyOAorLyoqIEhERCBpbnRlcm5hbCBUeCBRdWV1ZSBMb3cgV2F0ZXJtYXJrLiBOZXQgRGV2aWNlIFRYIHF1ZXVlIGlzIGRpc2FibGVkCisgKiAgd2hlbiBIREQgcXVldWUgYmVjb21lcyBmdWxsLiBUaGlzIExvdyB3YXRlcm1hcmsgaXMgdXNlZCB0byBlbmFibGUKKyAqICB0aGUgTmV0IERldmljZSBxdWV1ZSBhZ2FpbiAqLworI2RlZmluZSBIRERfVFhfUVVFVUVfTE9XX1dBVEVSX01BUksgKEhERF9UWF9RVUVVRV9NQVhfTEVOKjMvNCkKKy8qKiBCeXRlcyB0byByZXNlcnZlIGluIHRoZSBoZWFkcm9vbSAqLworI2RlZmluZSBMSUJSQV9IV19ORUVERURfSEVBRFJPT00gICAxMjgKKy8qKiBIZGQgVHggVGltZSBvdXQgdmFsdWUgKi8KKyNpZmRlZiBMSUJSQV9MSU5VWF9QQworI2RlZmluZSBIRERfVFhfVElNRU9VVCAgICAgICAgICAoODAwMCkgICAgICAgCisjZWxzZQorI2RlZmluZSBIRERfVFhfVElNRU9VVCAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKDUwMDApICAgIAorI2VuZGlmCisvKiogSGRkIERlZmF1bHQgTVRVICovCisjZGVmaW5lIEhERF9ERUZBVUxUX01UVSAgICAgICAgICgxNTAwKQorLyoqZXZlbnQgZmxhZ3MgcmVnaXN0ZXJlZCBuZXQgZGV2aWNlKi8KKyNkZWZpbmUgTkVUX0RFVklDRV9SRUdJU1RFUkVEICAxPDwwCisjZGVmaW5lIFNNRV9TRVNTSU9OX09QRU5FRCAgICAgMTw8MQorI2RlZmluZSBJTklUX1RYX1JYX1NVQ0NFU1MgICAgIDE8PDIKKyNkZWZpbmUgV01NX0lOSVRfRE9ORSAgICAgICAgICAxPDwzCisjZGVmaW5lIFNPRlRBUF9CU1NfU1RBUlRFRCAgICAgMTw8NAorI2RlZmluZSBERVZJQ0VfSUZBQ0VfT1BFTkVEICAgIDE8PDUKKworLyoqIE1heGltdW0gdGltZShtcyl0byB3YWl0IGZvciBkaXNjb25uZWN0IHRvIGNvbXBsZXRlICoqLworI2RlZmluZSBXTEFOX1dBSVRfVElNRV9ESVNDT05ORUNUICA1MDAKKyNkZWZpbmUgV0xBTl9XQUlUX1RJTUVfU1RBVFMgICAgICAgODAwCisjZGVmaW5lIFdMQU5fV0FJVF9USU1FX1BPV0VSICAgICAgIDgwMAorI2RlZmluZSBXTEFOX1dBSVRfVElNRV9TRVNTSU9OT1BFTkNMT1NFICAyMDAwCisjZGVmaW5lIFdMQU5fV0FJVF9USU1FX0FCT1JUU0NBTiAgMjAwMAorCisvKiBTY2FuIFJlcSBUaW1lb3V0ICovCisjZGVmaW5lIFdMQU5fV0FJVF9USU1FX1NDQU5fUkVRIDEwMAorCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfQURBUFRFUlMgNAorCisjZGVmaW5lIE1BWF9DRkdfU1RSSU5HX0xFTiAgMjU1CisKKyNkZWZpbmUgTUFDX0FERFJfQVJSQVkoYSkgKGEpWzBdLCAoYSlbMV0sIChhKVsyXSwgKGEpWzNdLCAoYSlbNF0sIChhKVs1XQorLyoqIE1hYyBBZGRyZXNzIHN0cmluZyAqKi8KKyNkZWZpbmUgTUFDX0FERFJFU1NfU1RSICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKyNkZWZpbmUgTUFYX0dFTklFX0xFTiAyNTUKKworI2lmIGRlZmluZWQoUUNfV0xBTl9DSElQU0VUX1BSSU1BKQorI2RlZmluZSBXTEFOX0NISVBfVkVSU0lPTiAgICJXQ05TUyIKKyNlbGlmIGRlZmluZWQoQU5JX0NISVBTRVRfTElCUkEpCisjZGVmaW5lIFdMQU5fQ0hJUF9WRVJTSU9OICAgIldDTjEzMTIiCisjZWxpZiBkZWZpbmVkKEFOSV9DSElQU0VUX1ZPTEFOUykKKyNkZWZpbmUgV0xBTl9DSElQX1ZFUlNJT04gICAiV0NOMTMxNCIKKyNlbHNlCisjZGVmaW5lIFdMQU5fQ0hJUF9WRVJTSU9OICAgIlVOS05PV04iCisjZW5kaWYKKworI2RlZmluZSBoZGRMb2cobGV2ZWwsIGFyZ3MuLi4pIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIGxldmVsLCAjIyBhcmdzKQorI2RlZmluZSBFTlRFUigpIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiRW50ZXI6JXMiLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIEVYSVQoKSAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJFeGl0OiVzIiwgX19GVU5DVElPTl9fKQorCisjZGVmaW5lIFdMQU5fSEREX0dFVF9QUklWX1BUUihfX2Rldl9fKSAoaGRkX2FkYXB0ZXJfdCopKG5ldGRldl9wcml2KChfX2Rldl9fKSkpCisKKyNkZWZpbmUgTUFYX0VYSVRfQVRURU1QVFNfRFVSSU5HX0xPR1AgMjAKKworI2RlZmluZSBNQVhfTk9fT0ZfMl80X0NIQU5ORUxTIDE0CisKK3R5cGVkZWYgc3RydWN0IGhkZF90eF9yeF9zdGF0c19zCit7CisgICAvLyBzdGFydF94bWl0IHN0YXRzCisgICBfX3UzMiAgICB0eFhtaXRDYWxsZWQ7CisgICBfX3UzMiAgICB0eFhtaXREcm9wcGVkOworICAgX191MzIgICAgdHhYbWl0QmFja1ByZXNzdXJlZDsKKyAgIF9fdTMyICAgIHR4WG1pdFF1ZXVlZDsKKyAgIF9fdTMyICAgIHR4WG1pdENsYXNzaWZpZWRBQ1tOVU1fVFhfUVVFVUVTXTsKKyAgIF9fdTMyICAgIHR4WG1pdERyb3BwZWRBQ1tOVU1fVFhfUVVFVUVTXTsKKyAgIF9fdTMyICAgIHR4WG1pdEJhY2tQcmVzc3VyZWRBQ1tOVU1fVFhfUVVFVUVTXTsKKyAgIF9fdTMyICAgIHR4WG1pdFF1ZXVlZEFDW05VTV9UWF9RVUVVRVNdOworICAgLy8gZmV0Y2hfY2JrIHN0YXRzCisgICBfX3UzMiAgICB0eEZldGNoZWQ7CisgICBfX3UzMiAgICB0eEZldGNoZWRBQ1tOVU1fVFhfUVVFVUVTXTsKKyAgIF9fdTMyICAgIHR4RmV0Y2hFbXB0eTsKKyAgIF9fdTMyICAgIHR4RmV0Y2hMb3dSZXNvdXJjZXM7CisgICBfX3UzMiAgICB0eEZldGNoRGVxdWV1ZUVycm9yOworICAgX191MzIgICAgdHhGZXRjaERlcXVldWVkOworICAgX191MzIgICAgdHhGZXRjaERlcXVldWVkQUNbTlVNX1RYX1FVRVVFU107CisgICBfX3UzMiAgICB0eEZldGNoRGVQcmVzc3VyZWQ7CisgICBfX3UzMiAgICB0eEZldGNoRGVQcmVzc3VyZWRBQ1tOVU1fVFhfUVVFVUVTXTsKKyAgIC8vIGNvbXBsZXRlX2Nia19zdGF0cworICAgX191MzIgICAgdHhDb21wbGV0ZWQ7CisgICAvLyBmbHVzaCBzdGF0cworICAgX191MzIgICAgdHhGbHVzaGVkOworICAgX191MzIgICAgdHhGbHVzaGVkQUNbTlVNX1RYX1FVRVVFU107CisgICAvLyByeCBzdGF0cworICAgX191MzIgICAgcnhDaGFpbnM7CisgICBfX3UzMiAgICByeFBhY2tldHM7CisgICBfX3UzMiAgICByeERyb3BwZWQ7CisgICBfX3UzMiAgICByeERlbGl2ZXJlZDsKKyAgIF9fdTMyICAgIHJ4UmVmdXNlZDsKK30gaGRkX3R4X3J4X3N0YXRzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhkZF9jaGlwX3Jlc2V0X3N0YXRzX3MKK3sKKyAgIF9fdTMyICAgIHRvdGFsTG9ncFJlc2V0czsKKyAgIF9fdTMyICAgIHRvdGFsQ01ENTNGYWlsdXJlczsKKyAgIF9fdTMyICAgIHRvdGFsTXV0ZXhSZWFkRmFpbHVyZXM7CisgICBfX3UzMiAgICB0b3RhbE1JRkVycm9yRmFpbHVyZXM7CisgICBfX3UzMiAgICB0b3RhbEZXSGVhcmJlYXRGYWlsdXJlczsKKyAgIF9fdTMyICAgIHRvdGFsVW5rbm93bkV4Y2VwdGlvbnM7Cit9IGhkZF9jaGlwX3Jlc2V0X3N0YXRzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGhkZF9zdGF0c19zCit7CisgICB0Q3NyU3VtbWFyeVN0YXRzSW5mbyAgICAgICBzdW1tYXJ5X3N0YXQ7CisgICB0Q3NyR2xvYmFsQ2xhc3NBU3RhdHNJbmZvICBDbGFzc0Ffc3RhdDsKKyAgIHRDc3JHbG9iYWxDbGFzc0JTdGF0c0luZm8gIENsYXNzQl9zdGF0OworICAgdENzckdsb2JhbENsYXNzQ1N0YXRzSW5mbyAgQ2xhc3NDX3N0YXQ7CisgICB0Q3NyR2xvYmFsQ2xhc3NEU3RhdHNJbmZvICBDbGFzc0Rfc3RhdDsKKyAgIHRDc3JQZXJTdGFTdGF0c0luZm8gICAgICAgIHBlclN0YVN0YXRzOworICAgaGRkX3R4X3J4X3N0YXRzX3QgICAgICAgICAgaGRkVHhSeFN0YXRzOworICAgaGRkX2NoaXBfcmVzZXRfc3RhdHNfdCAgICAgaGRkQ2hpcFJlc2V0U3RhdHM7Cit9IGhkZF9zdGF0c190OworCit0eXBlZGVmIGVudW0KK3sKKyAgIEhERF9ST0FNX1NUQVRFX05PTkUsCisgICAKKyAgIC8vIElzc3VpbmcgYSBkaXNjb25uZWN0IGR1ZSB0byB0cmFuc2l0aW9uIGludG8gbG93IHBvd2VyIHN0YXRlcy4gIAorICAgSEREX1JPQU1fU1RBVEVfRElTQ09OTkVDVElOR19QT1dFUiwKKyAgIAorICAgLy8gbW92ZSB0byB0aGlzIHN0YXRlIHdoZW4gSEREIHNldHMgYSBrZXkgd2l0aCBTTUUvQ1NSLiAgTm90ZSB0aGlzIGlzCisgICAvLyBhbiBpbXBvcnRhbnQgc3RhdGUgdG8gZ2V0IHJpZ2h0IGJlY2F1c2Ugd2Ugd2lsbCBnZXQgY2FsbHMgaW50byBvdXIgU01FCisgICAvLyBjYWxsYmFjayByb3V0aW5lIGZvciBTZXRLZXkgYWN0aXZpdHkgdGhhdCB3ZSBkaWQgbm90IGluaXRpYXRlIQorICAgSEREX1JPQU1fU1RBVEVfU0VUVElOR19LRVksCit9IEhERF9ST0FNX1NUQVRFOworCit0eXBlZGVmIGVudW0KK3sKKyAgIGVIRERfU1VTUEVORF9OT05FID0gMCwKKyAgIGVIRERfU1VTUEVORF9ERUVQX1NMRUVQLAorICAgZUhERF9TVVNQRU5EX1NUQU5EQlksCit9IGhkZF9wc19zdGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCByb2FtaW5nX2luZm9fcworeworICAgSEREX1JPQU1fU1RBVEUgcm9hbWluZ1N0YXRlOworICAgdm9zX2V2ZW50X3Qgcm9hbWluZ0V2ZW50OworICAgCit9IHJvYW1pbmdfaW5mb190OworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKy8qIERlZmluZSBXQVBJIG1hY3JvcyBmb3IgTGVuZ3RoLCBCS0lEIGNvdW50IGV0YyovCisjZGVmaW5lIE1BWF9XUElfS0VZX0xFTkdUSCAgICAxNgorI2RlZmluZSBNQVhfTlVNX1BOICAgICAgICAgICAgMTYKKyNkZWZpbmUgTUFDX0FERFJfTEVOICAgICAgICAgICA2CisjZGVmaW5lIE1BWF9BRERSX0lOREVYICAgICAgICAxMgorI2RlZmluZSBNQVhfTlVNX0FLTV9TVUlURVMgICAgMTYKKyNkZWZpbmUgTUFYX05VTV9VTklfU1VJVEVTICAgIDE2CisjZGVmaW5lIE1BWF9OVU1fQktJRFMgICAgICAgICAxNgorI2RlZmluZSBIRERfUEFJUldJU0VfV0FQSV9LRVkgMAorI2RlZmluZSBIRERfR1JPVVBfV0FQSV9LRVkgICAgMQorCisvKiogV0FQSSBBVVRIIG1vZGUgZGVmaW5pdGlvbiAqLworZW51bSBfV0FQSUF1dGhNb2RlCit7CisgICBXQVBJX0FVVEhfTU9ERV9PUEVOID0gMCwKKyAgIFdBUElfQVVUSF9NT0RFX1BTSyA9IDEsCisgICBXQVBJX0FVVEhfTU9ERV9DRVJUCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwordHlwZWRlZiBlbnVtIF9XQVBJQXV0aE1vZGUgV0FQSUF1dGhNb2RlOworCisvKiogV0FQSSBXb3JrIG1vZGUgc3RydWN0dXJlIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgICBXWkNfT1JJR0lOQUwgICAgICAwCisjZGVmaW5lICAgV0FQSV9FWFRFTlRJT04gICAgMQorCitzdHJ1Y3QgX1dBUElfRlVOQ1RJT05fTU9ERQoreworICAgdW5zaWduZWQgY2hhciB3YXBpTW9kZTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgX1dBUElfRlVOQ1RJT05fTU9ERSBXQVBJX0ZVTkNUSU9OX01PREU7CisKK3R5cGVkZWYgc3RydWN0IF9XQVBJX0JLSUQKK3sKKyAgIHZfVThfdCAgIGJraWRbMTZdOworfVdBUElfQktJRCwgKnBXQVBJX0JLSUQ7CisKKy8qKiBXQVBJIEFzc29jaWF0aW9uIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uICovCitzdHJ1Y3QgX1dBUElfQXNzb2NJbmZvCit7CisgICB2X1U4X3QgICAgICBlbGVtZW50SUQ7CisgICB2X1U4X3QgICAgICBsZW5ndGg7CisgICB2X1UxNl90ICAgICB2ZXJzaW9uOworICAgdl9VMTZfdCAgICAgYWttU3VpdGVDb3VudDsKKyAgIHZfVTMyX3QgICAgIGFrbVN1aXRlW01BWF9OVU1fQUtNX1NVSVRFU107CisgICB2X1UxNl90ICAgICB1bmljYXN0U3VpdGVDb3VudDsKKyAgIHZfVTMyX3QgICAgIHVuaWNhc3RTdWl0ZVtNQVhfTlVNX1VOSV9TVUlURVNdOworICAgdl9VMzJfdCAgICAgbXVsdGljYXN0U3VpdGU7CisgICB2X1UxNl90ICAgICB3YXBpQ2FiaWxpdHk7CisgICB2X1UxNl90ICAgICBia2lkQ291bnQ7CisgICBXQVBJX0JLSUQgICBia2lkTGlzdFtNQVhfTlVNX0JLSURTXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgc3RydWN0IF9XQVBJX0Fzc29jSW5mbyBXQVBJX0Fzc29jSW5mbzsKK3R5cGVkZWYgc3RydWN0IF9XQVBJX0Fzc29jSW5mbyAqcFdBUElfSUVBc3NvY0luZm87CisKKy8qKiBXQVBJIEtFWSBUeXBlIGRlZmluaXRpb24gKi8KK2VudW0gX1dBUElLZXlUeXBlCit7CisgICBQQUlSV0lTRV9LRVksIC8vMAorICAgR1JPVVBfS0VZICAgICAvLzEKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK3R5cGVkZWYgZW51bSBfV0FQSUtleVR5cGUgV0FQSUtleVR5cGU7CisKKy8qKiBXQVBJIEtFWSBEaXJlY3Rpb24gZGVmaW5pdGlvbiAqLworZW51bSBfS0VZX0RJUkVDVElPTgoreworICAgTm9uZSwKKyAgIFJ4LAorICAgVHgsCisgICBSeF9UeAorfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIGVudW0gX0tFWV9ESVJFQ1RJT04gV0FQSV9LRVlfRElSRUNUSU9OOworCisvKiogV0FQSSBLRVkgc3R1Y3R1cmUgZGVmaW5pdGlvbiAqLworc3RydWN0IFdMQU5fV0FQSV9LRVkKK3sKKyAgIFdBUElLZXlUeXBlICAgICBrZXlUeXBlOworICAgV0FQSV9LRVlfRElSRUNUSU9OICAga2V5RGlyZWN0aW9uOyAgLypyZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSovCisgICB2X1U4X3QgICAgICAgICAga2V5SWQ7CisgICB2X1U4X3QgICAgICAgICAgYWRkckluZGV4W01BWF9BRERSX0lOREVYXTsgLypyZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSovCisgICBpbnQgICAgICAgICAgICAgd3BpZWtMZW47CisgICB2X1U4X3QgICAgICAgICAgd3BpZWtbTUFYX1dQSV9LRVlfTEVOR1RIXTsKKyAgIGludCAgICAgICAgICAgICB3cGlja0xlbjsKKyAgIHZfVThfdCAgICAgICAgICB3cGlja1tNQVhfV1BJX0tFWV9MRU5HVEhdOworICAgdl9VOF90ICAgICAgICAgIHBuW01BWF9OVU1fUE5dOyAgICAgICAgLypyZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSovCit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgc3RydWN0IFdMQU5fV0FQSV9LRVkgV0xBTl9XQVBJX0tFWTsKK3R5cGVkZWYgc3RydWN0IFdMQU5fV0FQSV9LRVkgKnBXTEFOX1dBUElfS0VZOworCisjZGVmaW5lIFdQQV9HRVRfTEUxNihhKSAoKHUxNikgKCgoYSlbMV0gPDwgOCkgfCAoYSlbMF0pKQorI2RlZmluZSBXTEFOX0VJRF9XQVBJIDY4CisjZGVmaW5lIFdBUElfUFNLX0FLTV9TVUlURSAgMHgwMjcyMTQwMAorI2RlZmluZSBXQVBJX0NFUlRfQUtNX1NVSVRFIDB4MDE3MjE0MDAKKworLyoqIFdBUEkgQktJRCBMaXN0IHN0dWN0dXJlIGRlZmluaXRpb24gKi8KK3N0cnVjdCBfV0xBTl9CS0lEX0xJU1QKK3sKKyAgIHZfVTMyX3QgICAgICAgICAgbGVuZ3RoOworICAgdl9VMzJfdCAgICAgICAgICBCS0lEQ291bnQ7CisgICBXQVBJX0JLSUQgICAgICAgIEJLSURbMV07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgc3RydWN0IF9XTEFOX0JLSURfTElTVCBXTEFOX0JLSURfTElTVDsKK3R5cGVkZWYgc3RydWN0IF9XTEFOX0JLSURfTElTVCAqcFdMQU5fQktJRF9MSVNUOworCisKKy8qKiBXQVBJIEluZm9ybWF0aW9uIHN0dWN0dXJlIGRlZmluaXRpb24gKi8KK3N0cnVjdCBoZGRfd2FwaV9pbmZvX3MKK3sKKyAgIHZfVTMyX3QgICAgIG5XYXBpTW9kZTsKKyAgIHZfQk9PTF90ICAgIGZJc1dhcGlTdGE7CisgICB2X01BQ0FERFJfdCBjYWNoZWRNYWNBZGRyOworICAgdl9VQ0hBUl90ICAgd2FwaUF1dGhNb2RlOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwordHlwZWRlZiBzdHJ1Y3QgaGRkX3dhcGlfaW5mb19zIGhkZF93YXBpX2luZm9fdDsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCit0eXBlZGVmIHN0cnVjdCBiZWFjb25fZGF0YV9zIHsKKyAgICB1OCAqaGVhZCwgKnRhaWw7CisgICAgaW50IGhlYWRfbGVuLCB0YWlsX2xlbjsKKyAgICBpbnQgZHRpbV9wZXJpb2Q7Cit9IGJlYWNvbl9kYXRhX3Q7CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIGRldmljZV9tb2RlCit7ICAvKiBNQUlOVEFJTiAxIC0gMSBDT1JSRVNQT05ERU5DRSBXSVRIIHRWT1NfQ09OX01PREUqLworICAgV0xBTl9IRERfSU5GUkFfU1RBVElPTiwKKyAgIFdMQU5fSEREX1NPRlRBUCwKKyAgIFdMQU5fSEREX1AyUF9DTElFTlQsCisgICBXTEFOX0hERF9QMlBfR08sCisgICBXTEFOX0hERF9NT05JVE9SCisjaWZkZWYgQU5JX01BTkZfRElBRworICAgLFdMQU5fSEREX0ZUTSwKKyNlbmRpZgorfWRldmljZV9tb2RlX3Q7CisKK3R5cGVkZWYgZW51bSByZW1fb25fY2hhbm5lbF9yZXF1ZXN0X3R5cGUKK3sKKyAgIFJFTUFJTl9PTl9DSEFOTkVMX1JFUVVFU1QsCisgICBPRkZfQ0hBTk5FTF9BQ1RJT05fVFgsCit9cmVtX29uX2NoYW5uZWxfcmVxdWVzdF90eXBlX3Q7CisKKy8qIFRoZXJtYWwgbWl0aWdhdGlvbiBMZXZlbCBFbnVtIFR5cGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgV0xBTl9IRERfVE1fTEVWRUxfMCwKKyAgIFdMQU5fSEREX1RNX0xFVkVMXzEsCisgICBXTEFOX0hERF9UTV9MRVZFTF8yLAorICAgV0xBTl9IRERfVE1fTEVWRUxfMywKKyAgIFdMQU5fSEREX1RNX0xFVkVMXzQsCisgICBXTEFOX0hERF9UTV9MRVZFTF9NQVgKK30gV0xBTl9UbUxldmVsRW51bVR5cGU7CisKKy8qIERyaXZlciBBY3Rpb24gYmFzZWQgb24gdGhlcm1hbCBtaXRpZ2F0aW9uIGxldmVsIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZfQk9PTF90ICBhbXBkdUVuYWJsZTsKKyAgIHZfQk9PTF90ICBlbnRlckltcHM7CisgICB2X1UzMl90ICAgdHhTbGVlcER1cmF0aW9uOworICAgdl9VMzJfdCAgIHR4T3BlcmF0aW9uRHVyYXRpb247CisgICB2X1UzMl90ICAgdHhCbG9ja0ZyYW1lQ291bnRUaHJlc2hvbGQ7Cit9IGhkZF90bUxldmVsQWN0aW9uX3Q7CisKKy8qIFRoZXJtYWwgTWl0aWdhdGlvbiBjb250cm9sIGNvbnRleHQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgV0xBTl9UbUxldmVsRW51bVR5cGUgY3VycmVudFRtTGV2ZWw7CisgICBoZGRfdG1MZXZlbEFjdGlvbl90ICB0bUFjdGlvbjsKKyAgIHZvc190aW1lcl90ICAgICAgICAgIHR4U2xlZXBUaW1lcjsKKyAgIHN0cnVjdCBtdXRleCAgICAgICAgIHRtT3BlcmF0aW9uTG9jazsKKyAgIHZvc19ldmVudF90ICAgICAgICAgIHNldFRtRG9uZUV2ZW50OworICAgdl9VMzJfdCAgICAgICAgICAgICAgdHhGcmFtZUNvdW50OworICAgdl9USU1FX3QgICAgICAgICAgICAgbGFzdGJsb2NrVHM7CisgICB2X1RJTUVfdCAgICAgICAgICAgICBsYXN0T3BlblRzOworICAgc3RydWN0IG5ldGRldl9xdWV1ZSAqYmxvY2tlZFF1ZXVlOworfSBoZGRfdGhlcm1hbF9taXRpZ2F0aW9uX2luZm9fdDsKKworI2lmIGRlZmluZWQgQ09ORklHX0NGRzgwMjExCit0eXBlZGVmIHN0cnVjdCBoZGRfcmVtYWluX29uX2NoYW5fY3R4Cit7CisgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBjaGFuOworICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5fdHlwZTsKKyAgdW5zaWduZWQgaW50IGR1cmF0aW9uOworICB1NjQgY29va2llOworICByZW1fb25fY2hhbm5lbF9yZXF1ZXN0X3R5cGVfdCByZW1fb25fY2hhbl9yZXF1ZXN0OworfWhkZF9yZW1haW5fb25fY2hhbl9jdHhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGRkX2NmZzgwMjExX3N0YXRlX3MgCit7CisgIHRBTklfVTE2IGN1cnJlbnRfZnJlcTsKKyAgdTY0IGFjdGlvbl9jb29raWU7CisgIHRBTklfVTggKmJ1ZjsKKyAgc2l6ZV90IGxlbjsKKyAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgaGRkX3JlbWFpbl9vbl9jaGFuX2N0eF90KiByZW1haW5fb25fY2hhbl9jdHg7Cit9aGRkX2NmZzgwMjExX3N0YXRlX3Q7CisKKyNlbmRpZgorc3RydWN0IGhkZF9zdGF0aW9uX2N0eAoreworICAvKiogSGFuZGxlIHRvIHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gU3RhdGUgKi8KKyAgIGhkZF93ZXh0X3N0YXRlX3QgV2V4dFN0YXRlOworCisgICAvKipDb25uZWN0aW9uIGluZm9ybWF0aW9uKi8KKyAgIGNvbm5lY3Rpb25faW5mb190IGNvbm5faW5mbzsKKworICAgcm9hbWluZ19pbmZvX3Qgcm9hbV9pbmZvOworCisgICB2X0JPT0xfdCBiU2VuZERpc2Nvbm5lY3Q7CisKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9DQ1gpCisgICBpbnQgICAgIGZ0X2NhcnJpZXJfb247CisjZW5kaWYKK307CisKKyNkZWZpbmUgQlNTX1NUT1AgICAgMCAKKyNkZWZpbmUgQlNTX1NUQVJUICAgMQordHlwZWRlZiBzdHJ1Y3QgaGRkX2hvc3RhcGRfc3RhdGVfcworeworICAgIGludCBic3NTdGF0ZTsKKyAgICB2b3NfZXZlbnRfdCB2b3NFdmVudDsKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyAgICB2X0JPT0xfdCBiQ29tbWl0OyAKKworfSBoZGRfaG9zdGFwZF9zdGF0ZV90OworCisKKy8qCisgKiBQZXIgc3RhdGlvbiBzdHJ1Y3R1cmUga2VwdCBpbiBIREQgZm9yIG11bHRpcGxlIHN0YXRpb24gc3VwcG9ydCBmb3IgU29mdEFQCisqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qKiBUaGUgc3RhdGlvbiBlbnRyeSBpcyB1c2VkIG9yIG5vdCAgKi8KKyAgICB2X0JPT0xfdCBpc1VzZWQ7CisKKyAgICAvKiogU3RhdGlvbiBJRCByZXBvcnRlZCBiYWNrIGZyb20gSEFMICh0aHJvdWdoIFNBUCkuIEJyb2FkY2FzdAorICAgICAqICB1c2VzIHN0YXRpb24gSUQgemVybyBieSBkZWZhdWx0IGluIGJvdGggbGlicmEgYW5kIHZvbGFucy4gKi8KKyAgICB2X1U4X3QgdWNTVEFJZDsKKworICAgIC8qKiBNQUMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbiAqLworICAgIHZfTUFDQUREUl90IG1hY0FkZHJTVEE7CisKKyAgICAvKiogQ3VycmVudCBTdGF0aW9uIHN0YXRlIHNvIEhERCBrbm93cyBob3cgdG8gZGVhbCB3aXRoIHBhY2tldAorICAgICAqICBxdWV1ZS4gTW9zdCByZWNlbnQgc3RhdGVzIHVzZWQgdG8gY2hhbmdlIFRMIFNUQSBzdGF0ZS4gKi8KKyAgICBXTEFOVExfU1RBU3RhdGVUeXBlIHRsU1RBU3RhdGU7CisKKyAgIC8qKiBUcmFuc21pdCBxdWV1ZXMgZm9yIGVhY2ggQUMgKFZPLFZJLEJFIGV0YykuICovCisgICBoZGRfbGlzdF90IHdtbV90eF9xdWV1ZVtOVU1fVFhfUVVFVUVTXTsKKworICAgLyoqIE1pZ2h0IG5lZWQgdG8gZGlmZmVyZW50aWF0ZSBxdWV1ZSBkZXB0aCBpbiBjb250ZW50aW9uIGNhc2UgKi8KKyAgIHZfVTE2X3QgYVR4UXVldWVEZXB0aFtOVU1fVFhfUVVFVUVTXTsKKyAgIAorICAgLyoqVHJhY2sgd2hldGhlciBPUyBUWCBxdWV1ZSBoYXMgYmVlbiBkaXNhYmxlZC4qLworICAgdl9CT09MX3QgdHhTdXNwZW5kZWRbTlVNX1RYX1FVRVVFU107CisKKyAgIC8qKiBUcmFjayBRb1Mgc3RhdHVzIG9mIHN0YXRpb24gKi8KKyAgIHZfQk9PTF90IGlzUW9zRW5hYmxlZDsKKworfSBoZGRfc3RhdGlvbl9pbmZvX3Q7CisKK3N0cnVjdCBoZGRfYXBfY3R4X3MKK3sKKyAgIGhkZF9ob3N0YXBkX3N0YXRlX3QgSG9zdGFwZFN0YXRlOworCisgICAvLyBNZW1vcnkgZGlmZmVyZW50aWF0aW9uIG1vZGUgaXMgZW5hYmxlZAorICAgLy92X1UxNl90IHVNZW1vcnlEaWZmVGhyZXNob2xkOworICAgLy92X1U4X3QgdU51bUFjdGl2ZUFDOworICAgLy92X1U4X3QgdUFjdGl2ZUFDTWFzazsKKyAgIC8vdl9VOF90IGFUeFF1ZXVlTGltaXRbTlVNX1RYX1FVRVVFU107CisKKyAgIC8qKiBQYWNrZXQgQ291bnQgdG8gdXBkYXRlIHVOdW1BY3RpdmVBQyBhbmQgdUFjdGl2ZUFDTWFzayAqLworICAgLy92X1UxNl90IHVVcGRhdGVQa3RDb3VudDsKKworICAgLyoqIFN0YXRpb24gSUQgYXNzaWduZWQgYWZ0ZXIgQlNTIHN0YXJ0cyAqLworICAgdl9VOF90IHVCQ1N0YUlkOworCisgICB2X1U4X3QgdVByaXZhY3k7ICAvLyBUaGUgcHJpdmFjeSBiaXRzIG9mIGNvbmZpZ3VyYXRpb24KKyAgIAorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgICAKKyAgIHRTaXJXUFNQQkNQcm9iZVJlcSBXUFNQQkNQcm9iZVJlcTsKKyAgIAorICAgdHNhcF9Db25maWdfdCBzYXBDb25maWc7CisjZW5kaWYKKyAgIAorICAgc3RydWN0IHNlbWFwaG9yZSBzZW1XcHNQQkNPdmVybGFwSW5kOworICAgCisgICB2X0JPT0xfdCBhcERpc2FibGVJbnRyYUJzc0Z3ZDsKKyAgICAgIAorICAgdm9zX3RpbWVyX3QgaGRkX2FwX2luYWN0aXZpdHlfdGltZXI7CisKKyAgIHZfVThfdCAgIG9wZXJhdGluZ0NoYW5uZWw7CisgICAKKyAgIHZfQk9PTF90IHVJc0F1dGhlbnRpY2F0ZWQ7CisKKyAgIGVDc3JFbmNyeXB0aW9uVHlwZSB1Y0VuY3J5cHRUeXBlOworICAgCisjaWZkZWYgQ09ORklHX0NGRzgwMjExICAgCisgICAvL1RoaXMgd2lsbCBwb2ludCB0byBncm91cCBrZXkgZGF0YSwgaWYgaXQgaXMgcmVjZWl2ZWQgYmVmb3JlIHN0YXJ0IGJzcy4gCisgICB0Q3NyUm9hbVNldEtleSBncm91cEtleTsgCisgICAvLyBUaGlzIHdpbGwgaGF2ZSBXRVAga2V5IGRhdGEsIGlmIGl0IGlzIHJlY2VpdmVkIGJlZm9yZSBzdGFydCBic3MKKyAgIHRDc3JSb2FtU2V0S2V5IHdlcEtleVtDU1JfTUFYX05VTV9LRVldOworCisgICBiZWFjb25fZGF0YV90ICpiZWFjb247CisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEgICAKK3N0cnVjdCBoZGRfbW9uX2N0eF9zCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlckZvclR4OworfTsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBoZGRfc2NhbmluZm9fcworeworICAgLyogVGhlIHNjYW4gaWQgICovCisgICB2X1UzMl90IHNjYW5JZDsgCisKKyAgIC8qIFRoZSBzY2FuIHBlbmRpbmcgICovCisgICB2X1UzMl90IG1TY2FuUGVuZGluZzsKKworICAgLyogQ2xpZW50IFdhaXQgU2NhbiBSZXN1bHQgKi8KKyAgIHZfVTMyX3Qgd2FpdFNjYW5SZXN1bHQ7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICB2X0JPT0xfdCBwMnBTZWFyY2g7CisjZW5kaWYKKworICAgLyogQWRkaXRpb25hbCBJRSBmb3Igc2NhbiAqLworICAgdFNpckFkZGllIHNjYW5BZGRJRTsgCisKKyAgIC8qIFNjYW4gbW9kZSovCisgICB0U2lyU2NhblR5cGUgc2Nhbl9tb2RlOworCisgICAvKiBTY2FuIENvbXBsZXRpb24gRXZlbnQgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIHNjYW5fcmVxX2NvbXBsZXRpb25fZXZlbnQ7CisKKyAgIHZvc19ldmVudF90IHNjYW5fZmluaXNoZWRfZXZlbnQ7CisKKyAgIGhkZF9zY2FuX3BlbmRpbmdfb3B0aW9uX2Ugc2Nhbl9wZW5kaW5nX29wdGlvbjsKKworfWhkZF9zY2FuaW5mb190OworCisjZGVmaW5lIFdMQU5fSEREX0FEQVBURVJfTUFHSUMgMHg1NzRjNDE0ZSAvL0FTQ0lJICJXTEFOIgorc3RydWN0IGhkZF9hZGFwdGVyX3MKK3sKKyAgIHZvaWQgKnBIZGRDdHg7CisKKyAgIGRldmljZV9tb2RlX3QgZGV2aWNlX21vZGU7IAorCisgICAvKiogSGFuZGxlIHRvIHRoZSBuZXR3b3JrIGRldmljZSAqLworICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICAKKyAgIC8vVE9ETyBNb3ZlIHRoaXMgdG8gc3RhIEN0eAorI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgc3RydWN0IHdpcmVsZXNzX2RldiB3ZGV2IDsKKyAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QgOyAKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgLyoqIG9wcyBjaGVja3MgaWYgT3Bwb3J0dW5pc3RpYyBQb3dlciBTYXZlIGlzIEVuYWJsZSBvciBOb3QKKyAgICAqIGN0dyBzdG9yZXMgY3RXaW5kb3cgdmFsdWUgb25jZSB3ZSByZWNlaXZlIE9wcHMgY29tbWFuZCBmcm9tIAorICAgICogd3BhX3N1cHBsaWNhbnQgdGhlbiB1c2luZyBjdFdpbmRvdyB2YWx1ZSB3ZSBuZWVkIHRvIEVuYWJsZSAKKyAgICAqIE9wcG9ydHVuaXN0aWMgUG93ZXIgU2F2ZQorICAgICovCisgICAgdEFOSV9VOCAgb3BzOworICAgIHRBTklfVTMyIGN0dzsKKyNlbmRpZgorCisgICAvKiogQ3VycmVudCBNQUMgQWRkcmVzcyBmb3IgdGhlIGFkYXB0ZXIgICovICAgICAgIAorICAgdl9NQUNBRERSX3QgbWFjQWRkcmVzc0N1cnJlbnQ7ICAgIAorICAgICAgCisgICAvKipFdmVudCBGbGFncyovCisgICB1bnNpZ25lZCBsb25nIGV2ZW50X2ZsYWdzOworCisgICAvKipEZXZpY2UgVFgvUlggc3RhdGlzdGljcyovCisgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgIC8qKiBIREQgc3RhdGlzdGljcyovCisgICBoZGRfc3RhdHNfdCBoZGRfc3RhdHM7CisgICAvKipNaWIgaW5mb3JtYXRpb24qLworICAgc0hkZE1pYl90ICBoZGRfbWliOworICAgICAgICAgICAKKyAgIHRBTklfVTggc2Vzc2lvbklkOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAgICAKKyAgIC8qKiBwMnBTZXNzaW9uSWQgcmVxdWlyZWQgdG8gb3BlbiBuZXcgU01FIHNlc3Npb24gZm9yIFAyUCAKKyAgICAqICBEZXZpY2UgYWRkcmVzcyB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSBTVEEgTUFDIEFkZHJlc3MKKyAgICAqLyAKKyAgIHRBTklfVTggcDJwU2Vzc2lvbklkOworI2VuZGlmCisKKyAgIC8qIENvbXBsZXRpb24gdmFyaWFibGUgZm9yIHNlc3Npb24gY2xvc2UgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIHNlc3Npb25fY2xvc2VfY29tcF92YXI7CisKKyAgIC8qIENvbXBsZXRpb24gdmFyaWFibGUgZm9yIHNlc3Npb24gb3BlbiAqLworICAgc3RydWN0IGNvbXBsZXRpb24gc2Vzc2lvbl9vcGVuX2NvbXBfdmFyOworCisgICAvL1RPRE86IG1vdmUgdGhlc2UgdG8gc3RhIGN0eC4gVGhlc2UgbWF5IG5vdCBiZSB1c2VkIGluIEFQIAorICAgLyoqIGNvbXBsZXRpb24gdmFyaWFibGUgZm9yIGRpc2Nvbm5lY3QgY2FsbGJhY2sgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIGRpc2Nvbm5lY3RfY29tcF92YXI7CisKKyAgIC8qIGNvbXBsZXRpb24gdmFyaWFibGUgZm9yIExpbmt1cCBFdmVudCAqLworICAgc3RydWN0IGNvbXBsZXRpb24gbGlua3VwX2V2ZW50X3ZhcjsKKworCisgICAvKiBjb21wbGV0aW9uIHZhcmlhYmxlIGZvciBhYm9ydHNjYW4gKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIGFib3J0c2Nhbl9ldmVudF92YXI7CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAvKiBjb21wbGV0aW9uIHZhcmlhYmxlIGZvciBjYW5jZWwgcmVtYWluIG9uIGNoYW5uZWwgRXZlbnQgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIGNhbmNlbF9yZW1fb25fY2hhbl92YXI7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCisgICAvKiBjb21wbGV0aW9uIHZhcmlhYmxlIGZvciBvZmYgY2hhbm5lbCAgcmVtYWluIG9uIGNoYW5uZWwgRXZlbnQgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIG9mZmNoYW5uZWxfdHhfZXZlbnQ7CisjZW5kaWYKKyAgIC8qIENvbXBsZXRpb24gdmFyaWFibGUgZm9yIGFjdGlvbiBmcmFtZSAqLworICAgc3RydWN0IGNvbXBsZXRpb24gdHhfYWN0aW9uX2NuZl9ldmVudDsKKyAgIC8qIENvbXBsZXRpb24gdmFyaWFibGUgZm9yIHJlbWFpbiBvbiBjaGFubmVsIHJlYWR5ICovCisgICBzdHJ1Y3QgY29tcGxldGlvbiByZW1fb25fY2hhbl9yZWFkeV9ldmVudDsKKyNlbmRpZgorCisgICAvKiBUcmFjayB3aGV0aGVyIHRoZSBsaW5rdXAgaGFuZGxpbmcgaXMgbmVlZGVkICAqLworICAgdl9CT09MX3QgaXNMaW5rVXBTdmNOZWVkZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgVHggUXVldWVzCisgKi8KKyAgIC8qKiBUcmFuc21pdCBxdWV1ZXMgZm9yIGVhY2ggQUMgKFZPLFZJLEJFIGV0YykgKi8KKyAgIGhkZF9saXN0X3Qgd21tX3R4X3F1ZXVlW05VTV9UWF9RVUVVRVNdOworICAgLyoqVHJhY2sgd2hldGhlciBWT1MgaXMgaW4gYSBsb3cgcmVzb3VyY2Ugc3RhdGUqLworICAgdl9CT09MX3QgaXNWb3NPdXRPZlJlc291cmNlOworICAKKyAgIC8qKlRyYWNrIHdoZXRoZXIgT1MgVFggcXVldWUgaGFzIGJlZW4gZGlzYWJsZWQuKi8KKyAgIHZfQk9PTF90IGlzVHhTdXNwZW5kZWRbTlVNX1RYX1FVRVVFU107CisKKyAgIC8qKiBXTU0gU3RhdHVzICovCisgICBoZGRfd21tX3N0YXR1c190IGhkZFdtbVN0YXR1czsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUT0RPIC0gUmVtb3ZlIGl0IGxhdGVyCisgKi8KKyAgICAvKiogTXVsdGlwbGUgc3RhdGlvbiBzdXBwb3J0cyAqLworICAgLyoqIFBlci1zdGF0aW9uIHN0cnVjdHVyZSAqLworICAgc3BpbmxvY2tfdCBzdGFJbmZvX2xvY2s7IC8vVG8gcHJvdGVjdCBhY2Nlc3MgdG8gc3RhdGlvbiBJbmZvICAKKyAgIGhkZF9zdGF0aW9uX2luZm9fdCBhU3RhSW5mb1tXTEFOX01BWF9TVEFfQ09VTlRdOworICAgLy92X1U4X3QgdU51bUFjdGl2ZVN0YXRpb247CisKKyAgIHZfVTE2X3QgYVR4UXVldWVMaW1pdFtOVU1fVFhfUVVFVUVTXTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICBoZGRfd2FwaV9pbmZvX3Qgd2FwaV9pbmZvOworI2VuZGlmCisgICAKKyAgIHZfUzdfdCByc3NpOworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgc3RydWN0IHdvcmtfc3RydWN0ICBtb25UeFdvcmtRdWV1ZTsKKyAgIHN0cnVjdCBza19idWZmICpza2JfdG9fdHg7CisjZW5kaWYKKworICAgdW5pb24geworICAgICAgaGRkX3N0YXRpb25fY3R4X3Qgc3RhdGlvbjsKKyAgICAgIGhkZF9hcF9jdHhfdCAgYXA7CisjaWZkZWYgQ09ORklHX0NGRzgwMjExICAgCisgICAgICBoZGRfbW9uX2N0eF90IG1vbml0b3I7CisjZW5kaWYKKyAgIH1zZXNzaW9uQ3R4OworCisgICBoZGRfc2NhbmluZm9fdCBzY2FuX2luZm87CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICBoZGRfY2ZnODAyMTFfc3RhdGVfdCBjZmc4MDIxMVN0YXRlOworI2VuZGlmCisKKyAgIC8vTWFnaWMgY29va2llIGZvciBhZGFwdGVyIHNhbml0eSB2ZXJpZmljYXRpb24KKyAgIHZfVTMyX3QgbWFnaWM7CisgICB2X0JPT0xfdCBoaWdoZXJEdGltVHJhbnNpdGlvbjsKK307CisKK3R5cGVkZWYgc3RydWN0IGhkZF9keW5hbWljX21jYmNmaWx0ZXJfcworeworICAgIHZfQk9PTF90ICAgICBlbmFibGVDZmc7CisgICAgdl9VOF90ICAgICAgIG1jYXN0QmNhc3RGaWx0ZXJTZXR0aW5nOworICAgIHZfQk9PTF90ICAgICBlbmFibGVTdXNwZW5kOworICAgIHZfVThfdCAgICAgICBtY0JjRmlsdGVyU3VzcGVuZDsKK31oZGRfZHluYW1pY19tY2JjZmlsdGVyX3Q7CisKKyNkZWZpbmUgV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikgJihwQWRhcHRlciktPnNlc3Npb25DdHguc3RhdGlvbgorI2RlZmluZSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwQWRhcHRlcikgJihwQWRhcHRlciktPnNlc3Npb25DdHguYXAKKyNkZWZpbmUgV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKSAgJihwQWRhcHRlciktPnNlc3Npb25DdHguc3RhdGlvbi5XZXh0U3RhdGUKKyNkZWZpbmUgV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikgKGhkZF9jb250ZXh0X3QqKXBBZGFwdGVyLT5wSGRkQ3R4CisjZGVmaW5lIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSAgKChoZGRfY29udGV4dF90KikocEFkYXB0ZXItPnBIZGRDdHgpKS0+aEhhbAorI2RlZmluZSBXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihwQWRhcHRlcikgJihwQWRhcHRlciktPnNlc3Npb25DdHguYXAuSG9zdGFwZFN0YXRlCisjZGVmaW5lIFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKHBBZGFwdGVyKSAgJihwQWRhcHRlciktPmNmZzgwMjExU3RhdGUKKyNkZWZpbmUgV0xBTl9IRERfTUFYX01DX0FERFJfTElTVCAxMAorCit0eXBlZGVmIHN0cnVjdCBoZGRfYWRhcHRlcl9saXN0X25vZGUKK3sKKyAgIGhkZF9saXN0X25vZGVfdCBub2RlOyAgICAgLy8gTVVTVCBiZSBmaXJzdCBlbGVtZW50CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlcjsKK31oZGRfYWRhcHRlcl9saXN0X25vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGRkX3ByaXZfZGF0YV9zCit7CisgICB0QU5JX1U4ICpidWY7CisgICBpbnQgdXNlZF9sZW47CisgICBpbnQgdG90YWxfbGVuOworfWhkZF9wcml2X2RhdGFfdDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCit0eXBlZGVmIHN0cnVjdCBtdWx0aWNhc3RfYWRkcl9saXN0Cit7CisgICB2X1U4X3QgaXNGaWx0ZXJBcHBsaWVkOworICAgdl9VOF90IG1jX2NudDsKKyAgIHZfVThfdCBhZGRyW1dMQU5fSEREX01BWF9NQ19BRERSX0xJU1RdW0VUSF9BTEVOXTsKK30gdF9tdWx0aWNhc3RfYWRkX2xpc3Q7CisjZW5kaWYKKworLyoqIEFkYXB0ZXIgc3R1Y3R1cmUgZGVmaW5pdGlvbiAqLworCitzdHJ1Y3QgaGRkX2NvbnRleHRfcworeworICAgLyoqIEdsb2JhbCBWT1MgY29udGV4dCAgKi8KKyAgIHZfQ09OVEVYVF90IHB2b3NDb250ZXh0OworCisgICAvKiogSEFMIGhhbmRsZS4uLiovCisgICB0SGFsSGFuZGxlIGhIYWw7CisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgIHN0cnVjdCB3aXBoeSAqd2lwaHkgOworI2VuZGlmCisgICAvL1RPRE8gUmVtb3ZlIHRoaXMgZnJvbSBoZXJlLgorCisgICBoZGRfbGlzdF90IGhkZEFkYXB0ZXJzOyAvL0xpc3Qgb2YgYWRhcHRlcnMKKyAgIC8qIE9uZSBwZXIgU1RBOiAxIGZvciBSWF9CQ01DX1NUQV9JRCBhbmQgMSBmb3IgU0FQX1NFTEZfU1RBX0lEKi8KKyAgIGhkZF9hZGFwdGVyX3QgKnN0YV90b19hZGFwdGVyW1dMQU5fTUFYX1NUQV9DT1VOVCArIDNdOyAvL09uZSBwZXIgc3RhLiBGb3IgcXVpY2sgcmVmZXJlbmNlLgorCisgICAvKiogUG9pbnRlciBmb3IgZmlybXdhcmUgaW1hZ2UgZGF0YSAqLworICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKyAgIAorICAgLyoqIFBvaW50ZXIgZm9yIGNvbmZpZ3VyYXRpb24gZGF0YSAqLworICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpjZmc7CisgICAKKyAgIC8qKiBQb2ludGVyIGZvciBudiBkYXRhICovCisgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKm52OworICAgCisgICAvKiogUG9pbnRlciB0byB0aGUgcGFyZW50IGRldmljZSAqLworICAgc3RydWN0IGRldmljZSAqcGFyZW50X2RldjsKKworICAgcGlkX3QgIHBpZF9zZGlvX2NsYWltZWQ7CisgICBhdG9taWNfdCBzZGlvX2NsYWltX2NvdW50OworCisgICAvKiogQ29uZmlnIHZhbHVlcyByZWFkIGZyb20gcWNvbV9jZmcuaW5pIGZpbGUgKi8gCisgICBoZGRfY29uZmlnX3QgKmNmZ19pbmk7CisgICNpZmRlZiBBTklfTUFORl9ESUFHCisgICB3bGFuX2hkZF9mdG1fc3RhdHVzX3QgZnRtOyAKKyAgI2VuZGlmCisgICAvKiogY29tcGxldGlvbiB2YXJpYWJsZSBmb3IgZnVsbCBwb3dlciBjYWxsYmFjayAqLworICAgc3RydWN0IGNvbXBsZXRpb24gZnVsbF9wd3JfY29tcF92YXI7CisgICAvKiogY29tcGxldGlvbiB2YXJpYWJsZSBmb3IgUmVxdWVzdCBCTVBTIGNhbGxiYWNrICovCisgICBzdHJ1Y3QgY29tcGxldGlvbiByZXFfYm1wc19jb21wX3ZhcjsKKyAgIAorICAgLyoqIGNvbXBsZXRpb24gdmFyaWFibGUgZm9yIHN0YW5kYnkgY2FsbGJhY2sgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIHN0YW5kYnlfY29tcF92YXI7CisgICAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8qIENvbXBsZXRpb24gIHZhcmlhYmxlIHRvIGluZGljYXRlIFJ4IFRocmVhZCBTdXNwZW5kZWQgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIHJ4X3N1c19ldmVudF92YXI7CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisKKyAgIC8qIENvbXBsZXRpb24gIHZhcmlhYmxlIHRvIGluZGljYXRlIFR4IFRocmVhZCBTdXNwZW5kZWQgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIHR4X3N1c19ldmVudF92YXI7CisKKyAgIC8qIENvbXBsZXRpb24gIHZhcmlhYmxlIHRvIGluZGljYXRlIE1jIFRocmVhZCBTdXNwZW5kZWQgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIG1jX3N1c19ldmVudF92YXI7CisKKworICAgdl9CT09MX3QgaXNXbGFuU3VzcGVuZGVkOworCisgICB2X0JPT0xfdCBpc1R4VGhyZWFkU3VzcGVuZGVkOworCisgICB2X0JPT0xfdCBpc01jVGhyZWFkU3VzcGVuZGVkOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICB2X0JPT0xfdCBpc1J4VGhyZWFkU3VzcGVuZGVkOworI2VuZGlmCisKKyAgIHZvbGF0aWxlIHZfQk9PTF90IGlzTG9ncEluUHJvZ3Jlc3M7CisKKyAgIHZfQk9PTF90IGlzTG9hZFVubG9hZEluUHJvZ3Jlc3M7CisgICAKKyAgIC8qKlRyYWNrIHdoZXRoZXIgZHJpdmVyIGhhcyBiZWVuIHN1c3BlbmRlZC4qLworICAgaGRkX3BzX3N0YXRlX3QgaGRkX3BzX3N0YXRlOworICAgCisgICAvKiBUcmFjayB3aGV0aGVyIE1jYXN0L0JjYXN0IEZpbHRlciBpcyBlbmFibGVkLiovCisgICB2X0JPT0xfdCBoZGRfbWNhc3RiY2FzdF9maWx0ZXJfc2V0OworCisgICAvKiBUcmFjayB3aGV0aGVyIGlnbm9yZSBEVElNIGlzIGVuYWJsZWQqLworICAgdl9CT09MX3QgaGRkX2lnbm9yZV9kdGltX2VuYWJsZWQ7CisgICB2X1UzMl90IGhkZF9hY3R1YWxfaWdub3JlX0RUSU1fdmFsdWU7CisgICB2X1UzMl90IGhkZF9hY3R1YWxfTElfdmFsdWU7IAorCisgICAKKyAgIHZfQk9PTF90IGhkZF93bGFuX3N1c3BlbmRlZDsKKyAgIAorICAgc3BpbmxvY2tfdCBmaWx0ZXJfbG9jazsKKyAgIAorICAgLyogTG9jayB0byBhdm9pZCByYWNlIGNvbmR0aW9uIGR1cmluZyBzdGFydC9zdG9wIGJzcyovCisgICBzdHJ1Y3QgbXV0ZXggc2FwX2xvY2s7CisgICAKKyAgIC8qKiBwdHQgUHJvY2VzcyBJRCovCisgICB2X1NJTlRfdCBwdHRfcGlkOworCisgICB2X1U4X3QgY2hhbmdlX2lmYWNlOworCisgICAvKiogQ29uY3VycmVuY3kgUGFyYW1ldGVycyovCisgICB0Vk9TX0NPTkNVUlJFTkNZX01PREUgY29uY3VycmVuY3lfbW9kZTsKKworICAgdl9VMTZfdCBub19vZl9zZXNzaW9uc1tWT1NfTUFYX05PX09GX01PREVdOworCisgICBoZGRfY2hpcF9yZXNldF9zdGF0c190IGhkZENoaXBSZXNldFN0YXRzOworICAgLyogTnVtYmVyIG9mIHRpbWVzIHJpdmEgcmVzdGFydGVkICovCisgICB2X1UzMl90ICBoZGRSaXZhUmVzZXRTdGF0czsKKyAgIAorICAgaGRkX2R5bmFtaWNfbWNiY2ZpbHRlcl90IGR5bmFtaWNfbWNiY19maWx0ZXI7CisgICAKKyAgIC8qIENhbiB3ZSBhbGxvdyBBTVAgY29ubmVjdGlvbiByaWdodCBub3cqLworICAgdl9CT09MX3QgaXNBbXBBbGxvd2VkOworICAgCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgLyoqIFAyUCBEZXZpY2UgTUFDIEFkZHJlc3MgZm9yIHRoZSBhZGFwdGVyICAqLworICAgdl9NQUNBRERSX3QgcDJwRGV2aWNlQWRkcmVzczsKKyNlbmRpZgorCisgICAvKiBUaGVybWFsIG1pdGlnYXRpb24gaW5mb3JtYXRpb24gKi8KKyAgIGhkZF90aGVybWFsX21pdGlnYXRpb25faW5mb190IHRtSW5mbzsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworICAgdF9tdWx0aWNhc3RfYWRkX2xpc3QgbWNfYWRkcl9saXN0OworI2VuZGlmCit9OworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKK1ZPU19TVEFUVVMgaGRkX2dldF9mcm9udF9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90KiogcHBBZGFwdGVyTm9kZSk7CisKK1ZPU19TVEFUVVMgaGRkX2dldF9uZXh0X2FkYXB0ZXIoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfYWRhcHRlcl9saXN0X25vZGVfdCogcEFkYXB0ZXJOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QqKiBwTmV4dEFkYXB0ZXJOb2RlKTsKKworVk9TX1NUQVRVUyBoZGRfcmVtb3ZlX2FkYXB0ZXIoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QqIHBBZGFwdGVyTm9kZSk7CisKK1ZPU19TVEFUVVMgaGRkX3JlbW92ZV9mcm9udF9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90KiogcHBBZGFwdGVyTm9kZSk7CisKK1ZPU19TVEFUVVMgaGRkX2FkZF9hZGFwdGVyX2JhY2soIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfYWRhcHRlcl9saXN0X25vZGVfdCogcEFkYXB0ZXJOb2RlKTsKKworVk9TX1NUQVRVUyBoZGRfYWRkX2FkYXB0ZXJfZnJvbnQoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QqIHBBZGFwdGVyTm9kZSk7CisKK2hkZF9hZGFwdGVyX3QqIGhkZF9vcGVuX2FkYXB0ZXIoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIHRBTklfVTggc2Vzc2lvbl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbmFtZSwgdFNpck1hY0FkZHIgbWFjQWRkciwgdEFOSV9VOCBydG5sX2hlbGQgKTsKK1ZPU19TVEFUVVMgaGRkX2Nsb3NlX2FkYXB0ZXIoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB0QU5JX1U4IHJ0bmxfaGVsZCApOworVk9TX1NUQVRVUyBoZGRfY2xvc2VfYWxsX2FkYXB0ZXJzKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4ICk7CitWT1NfU1RBVFVTIGhkZF9zdG9wX2FsbF9hZGFwdGVycyggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCApOworVk9TX1NUQVRVUyBoZGRfcmVzZXRfYWxsX2FkYXB0ZXJzKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4ICk7CitWT1NfU1RBVFVTIGhkZF9zdGFydF9hbGxfYWRhcHRlcnMoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggKTsKK1ZPU19TVEFUVVMgaGRkX3JlY29ubmVjdF9hbGxfYWRhcHRlcnMoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggKTsKK2hkZF9hZGFwdGVyX3QgKiBoZGRfZ2V0X2FkYXB0ZXJfYnlfbmFtZSggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdEFOSV9VOCAqbmFtZSApOworaGRkX2FkYXB0ZXJfdCAqIGhkZF9nZXRfYWRhcHRlcl9ieV9tYWNhZGRyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0U2lyTWFjQWRkciBtYWNBZGRyICk7CitoZGRfYWRhcHRlcl90ICogaGRkX2dldF9tb25fYWRhcHRlciggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCApOworVk9TX1NUQVRVUyBoZGRfaW5pdF9zdGF0aW9uX21vZGUoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICk7CitoZGRfYWRhcHRlcl90ICogaGRkX2dldF9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCBkZXZpY2VfbW9kZV90IG1vZGUgKTsKK3ZvaWQgaGRkX2RlaW5pdF9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApOworVk9TX1NUQVRVUyBoZGRfc3RvcF9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApOwordm9pZCBoZGRfc2V0X3N0YXRpb25fb3BzKCBzdHJ1Y3QgbmV0X2RldmljZSAqcFdsYW5EZXYgKTsKK3RBTklfVTgqIHdsYW5faGRkX2dldF9pbnRmX2FkZHIoaGRkX2NvbnRleHRfdCogcEhkZEN0eCk7Cit2b2lkIHdsYW5faGRkX3JlbGVhc2VfaW50Zl9hZGRyKGhkZF9jb250ZXh0X3QqIHBIZGRDdHgsIHRBTklfVTgqIHJlbGVhc2VBZGRyKTsKK3ZfVThfdCBoZGRfZ2V0X29wZXJhdGluZ19jaGFubmVsKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCBkZXZpY2VfbW9kZV90IG1vZGUgKTsKKworCisjaWYgZGVmaW5lZChXTEFOX1NPRlRBUF9GRUFUVVJFKSB8fCBkZWZpbmVkKEFOSV9NQU5GX0RJQUcpCit2b2lkIGhkZF9zZXRfY29ucGFyYW0gKCB2X1VJTlRfdCBuZXdQYXJhbSApOwordFZPU19DT05fTU9ERSBoZGRfZ2V0X2NvbnBhcmFtKCB2b2lkICk7CisjZW5kaWYKKwordm9pZCB3bGFuX2hkZF9lbmFibGVfZGVlcHNsZWVwKHZfVk9JRF90ICogcFZvc0NvbnRleHQpOwordl9CT09MX3QgaGRkX2lzX2FwcHNfcG93ZXJfY29sbGFwc2VfYWxsb3dlZChoZGRfY29udGV4dF90KiBwSGRkQ3R4KTsKK3ZvaWQgaGRkX2Fib3J0X21hY19zY2FuKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOworI2lmZGVmIENPTkZJR19DRkc4MDIxMQordm9pZCB3bGFuX2hkZF9zZXRfbW9uaXRvcl90eF9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApOwordm9pZCBoZGRfY2xlYW51cF9hY3Rpb25mcmFtZSggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKTsKKyNlbmRpZgordm9pZCB3bGFuX2hkZF9zZXRfY29uY3VycmVuY3lfbW9kZShoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0Vk9TX0NPTl9NT0RFIG1vZGUpOwordm9pZCB3bGFuX2hkZF9jbGVhcl9jb25jdXJyZW5jeV9tb2RlKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIHRWT1NfQ09OX01PREUgbW9kZSk7Cit2b2lkIHdsYW5faGRkX3Jlc2V0X3Byb2JfcnNwaWVzKGhkZF9hZGFwdGVyX3QqIHBIb3N0YXBkQWRhcHRlcik7Cit2b2lkIGhkZF9wcmV2ZW50X3N1c3BlbmQodm9pZCk7Cit2b2lkIGhkZF9hbGxvd19zdXNwZW5kKHZvaWQpOwordl9VOF90IGhkZF9pc19zc3JfcmVxdWlyZWQodm9pZCk7Cit2b2lkIGhkZF9zZXRfc3NyX3JlcXVpcmVkKHZfVThfdCB2YWx1ZSk7CisKK1ZPU19TVEFUVVMgaGRkX2VuYWJsZV9ibXBzX2ltcHMoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCk7CitWT1NfU1RBVFVTIGhkZF9kaXNhYmxlX2JtcHNfaW1wcyhoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0QU5JX1U4IHNlc3Npb25fdHlwZSk7CisKK2VIYWxTdGF0dXMgaGRkX3NtZUNsb3NlU2Vzc2lvbkNhbGxiYWNrKHZvaWQgKnBDb250ZXh0KTsKKyNlbmRpZiAgICAvLyBlbmQgI2lmICFkZWZpbmVkKCBXTEFOX0hERF9NQUlOX0ggKQpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvaW5jL3dsYW5faGRkX21pYi5oIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX21pYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjNkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfbWliLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIFdMQU5fSEREX01JQl9oX18gKQorI2RlZmluZSBXTEFOX0hERF9NSUJfaF9fIAorCisKKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKwordHlwZWRlZiBlbnVtCit7CisgICAgZU1pYl9kb3QxMURlc2lyZWRCc3NUeXBlX2luZnJhc3RydWN0dXJlID0gMSwKKyAgICBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGVfaW5kZXBlbmRlbnQgPSAyLAorICAgIGVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZV9pbmZyYV9hcCA9MywKKyAgICBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGVfYW55ID0gNAorICAgIAorfSBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGU7CisKKworLyoqIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIEJTU0lEcyBzdXBwb3J0ZWQgaW4gdGhlIAorICAgICAgZG90MTFEZXNpcmVkQnNzaWRMaXN0LiAgQWxsIHRoZSBjb2RlIG9wZXJhdGVzIG9mZiBvZiAKKyAgICAgIHRoaXMgbWF4aW11bSBCU1NJRCBsaXN0IGNvdW50LiAgKi8KKyNkZWZpbmUgTUlCX0RPVDExX0RFU0lSRURfQlNTSURfTElTVF9NQVhfQ09VTlQgKCAxICkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB2X1UzMl90IGNFbnRyaWVzOworICAgIAorICAgIHZfTUFDQUREUl90IEJTU0lEc1sgTUlCX0RPVDExX0RFU0lSRURfQlNTSURfTElTVF9NQVhfQ09VTlQgXTsgICAgIAorCit9ICBzTWliX2RvdDExRGVzaXJlZEJzc2lkTGlzdDsKKworCisKKy8qKiBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBTU0lEcyBzdXBwb3J0ZWQgaW4gdGhlIAorICAgICBkb3QxMURlc2lyZWRTc2lkTGlzdC4gIEFsbCB0aGUgY29kZSBvcGVyYXRlcyBvZmYgb2YgCisgICAgIHRoaXMgbWF4aW11bSBTU0lEIGxpc3QgY291bnQuICAqLworICAgICAKKyNkZWZpbmUgTUlCX0RPVDExX0RFU0lSRURfU1NJRF9MSVNUX01BWF9DT1VOVCAoIDEgKQorCisjZGVmaW5lIE1JQl9ET1QxMV9TU0lEX01BWF9MRU5HVEggKCAzMiApCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdl9VMzJfdCBzc2lkTGVuZ3RoOworICAgIHZfVThfdCAgc3NpZFsgTUlCX0RPVDExX1NTSURfTUFYX0xFTkdUSCBdOworICAgIAorfSBzRG90MTFTc2lkOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHZfVTMyX3QgY0VudHJpZXM7CisgICAgCisgICAgc0RvdDExU3NpZCBTU0lEc1sgTUlCX0RPVDExX0RFU0lSRURfU1NJRF9MSVNUX01BWF9DT1VOVCBdOyAgICAgCisKK30gIHNNaWJfZG90MTFEZXNpcmVkU3NpZExpc3Q7CisKKworCit0eXBlZGVmIGVudW0KK3sKKyAgICAvLyB0aGVzZSBhcmUgYml0bWFza3MuLi4uCisgICAgZU1pYl9kb3QxMUF1dG9Db25maWdFbmFibGVkX05vbmUgPSAwVSwKKyAgICBlTWliX2RvdDExQXV0b0NvbmZpZ0VuYWJsZWRfUGh5ICA9IDB4MDAwMDAwMDFVLAorICAgIGVNaWJfZG90MTFBdXRvQ29uZmlnRW5hYmxlZF9NYWMgID0gMHgwMDAwMDAwMlUKKyAgICAKK30gZU1pYl9kb3QxMUF1dG9Db25maWdFbmFibGVkOworCisKKworI2RlZmluZSBNSUJfRE9UMTFfU1VQUE9SVEVEX1BIWV9UWVBFU19NQVhfQ09VTlQgKCAzICkKKwordHlwZWRlZiBlbnVtIHRhZ01pYl9kb3QxMVBoeVR5cGUgCit7CisgICAgZU1pYl9kb3QxMVBoeVR5cGVfMTFiLAorICAgIGVNaWJfZG90MTFQaHlUeXBlXzExYSwKKyAgICBlTWliX2RvdDExUGh5VHlwZV8xMWcsCisgICAgZU1pYl9kb3QxMVBoeVR5cGVfYWxsCit9IGVNaWJfZG90MTFQaHlUeXBlOworCit0eXBlZGVmIHN0cnVjdCB0YWdNaWJfZG90MTFTdXBwb3J0ZWRQaHlUeXBlcworeworICAgIHZfVTMyX3QgY0VudHJpZXM7ICAgIAorICAgIGVNaWJfZG90MTFQaHlUeXBlIHBoeVR5cGVzWyBNSUJfRE9UMTFfU1VQUE9SVEVEX1BIWV9UWVBFU19NQVhfQ09VTlQgXTsgICAgIAorfSAgc01pYl9kb3QxMVN1cHBvcnRlZFBoeVR5cGVzOworCisKK3R5cGVkZWYgZW51bQoreworICAgZU1pYl9EZXZpY2VQb3dlclN0YXRlX0QwLCAKKyAgIGVNaWJfRGV2aWNlUG93ZXJTdGF0ZV9EMSwgCisgICBlTWliX0RldmljZVBvd2VyU3RhdGVfRDIsIAorICAgZU1pYl9EZXZpY2VQb3dlclN0YXRlX0QzCisgICAKK30gZU1pYl9EZXZpY2VQb3dlclN0YXRlOyAgICAKKyAgIAorCit0eXBlZGVmIGVudW0KK3sKKyAgICBlTWliX2RvdDExTklDUG93ZXJTdGF0ZV9PRkYgPSBWT1NfRkFMU0UsCisgICAgZU1pYl9kb3QxMU5JQ1Bvd2VyU3RhdGVfT04gID0gVk9TX1RSVUUKKyAgICAKK30gZU1pYl9kb3QxMU5JQ1Bvd2VyU3RhdGU7CisKKwordHlwZWRlZiBlbnVtCit7CisgICAgZU1pYl9kb3QxMUhhcmR3YXJlUEhZU3RhdGVfT0ZGID0gVk9TX0ZBTFNFLAorICAgIGVNaWJfZG90MTFIYXJkd2FyZVBIWVN0YXRlX09OICA9IFZPU19UUlVFCisgICAgCit9IGVNaWJfZG90MTFIYXJkd2FyZVBIWVN0YXRlOworCisKK3R5cGVkZWYgZW51bQoreworICAgIGVNaWJfZG90MTFQb3dlclNhdmluZ0xldmVsX05vbmUsIAorICAgIGVNaWJfZG90MTFQb3dlclNhdmluZ0xldmVsX01heFBTLAorICAgIGVNaWJfZG90MTFQb3dlclNhdmluZ0xldmVsX0Zhc3RQUywKKyAgICBlTWliX2RvdDExUG93ZXJTYXZpbmdMZXZlbF9NYXhpbXVtTGV2ZWwKKyAgICAKK30gZU1pYl9kb3QxMVBvd2VyU2F2aW5nTGV2ZWw7ICAgIAorCisKKyNkZWZpbmUgTUlCX0RPVDExX01BQ19FWENMVVNJT05fTElTVF9NQVhfQ09VTlQgNAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB2X1UzMl90IGNFbnRyaWVzOworICAgIAorICAgIHZfTUFDQUREUl90IG1hY0FkZHJzWyBNSUJfRE9UMTFfTUFDX0VYQ0xVU0lPTl9MSVNUX01BWF9DT1VOVCBdOyAgICAgCisKK30gc01pYl9kb3QxMU1hY0V4Y2x1ZGVMaXN0OworCisjZGVmaW5lIE1JQl9ET1QxMV9QUklWQUNZX0VYRU1QVF9MSVNUX01BWF9DT1VOVCAzMgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBlTWliX2RvdDExRXhlbXB0aW9uQWN0aW9uX0Fsd2F5cywKKyAgICBlTWliX2RvdDExRXhlbXB0aW9uQWN0aW9uX09uS2V5TWFwVW5hdmFpbGFibGUKKworfWVNaWJfZG90MTFFeGVtcHRBY3Rpb247CisKK3R5cGVkZWYgZW51bQoreworICAgIGVNaWJfZG90MTFFeGVtcHRQYWNrZXRfVW5pY2FzdCwKKyAgICBlTWliX2RvdDExRXhlbXB0UGFja2V0X011bHRpY2FzdCwKKyAgICBlTWliX2RvdDExRXhlbXB0UGFja2V0X0JvdGgKKworfWVNaWJfZG90MTFFeGVtcHRQYWNrZXQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdl9VMTZfdCB1RXRoZXJUeXBlOworICAgIGVNaWJfZG90MTFFeGVtcHRBY3Rpb24gZXhlbXB0QWN0aW9uOworICAgIGVNaWJfZG90MTFFeGVtcHRQYWNrZXQgZXhlbXB0UGFja2V0OworCit9c01pYl9kb3QxMVByaXZhY3lFeGVtcHRpb247CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdl9VMzJfdCBjRW50cmllczsKKworICAgIHNNaWJfZG90MTFQcml2YWN5RXhlbXB0aW9uIHByaXZhY3lFeGVtcHRMaXN0WyBNSUJfRE9UMTFfUFJJVkFDWV9FWEVNUFRfTElTVF9NQVhfQ09VTlQgXTsKKworfSBzTWliX2RvdDExUHJpdmFjeUV4ZW1wdGlvbkxpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHNIZGRNaWJfcworeworICAgIGVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZSAgICBtaWJEb3QxMURlc2lyZWRCc3NUeXBlOworCisgICAgc01pYl9kb3QxMURlc2lyZWRCc3NpZExpc3QgIG1pYkRvdDExRGVzaXJlZEJzc2lkTGlzdDsKKworICAgIHNNaWJfZG90MTFEZXNpcmVkU3NpZExpc3QgICBtaWJEb3QxMURlc2lyZWRTc2lkTGlzdDsKKworICAgIGVNaWJfZG90MTFBdXRvQ29uZmlnRW5hYmxlZCBtaWJEb3QxMUF1dG9Db25maWdFbmFibGVkOworCisgICAgLy8gdGhlIGRldmljZSBwb3dlciBzdGF0ZSBmb3IgdGhlIGRldmljZSAodGhlIEQtc3RhdGUuLi4geW91IGtub3cgRDAsIEQxLCBEMiwgZXRjLgorICAgIGVNaWJfRGV2aWNlUG93ZXJTdGF0ZSAgICAgIG1pYkRldmljZVBvd2VyU3RhdGU7CisKKyAgICAvLyBkb3QxMU5JQ1Bvd2VyU3RhdGUgaXMgcmVhbGx5IHRoZSBvbi9vZmYgc3RhdGUgb2YgdGhlIFBIWS4gIFRoaXMgY2FuIGJlCisgICAgLy8gbWFtaXB1bGF0ZWQgdGhyb3VnaCBPSURzIGxpa2UgYSBzb2Z0d2FyZSBjb250cm9sIGZvciByYWRpbyBvbi9vZmYuCisgICAgZU1pYl9kb3QxMU5JQ1Bvd2VyU3RhdGUgICAgbWliRG90MTFOSUNQb3dlclN0YXRlOworCisgICAgLy8gSGFyZHdhcmUgUEhZIHN0YXRlIGlzIHRoZSBvbi9vZmYgc3RhdGUgb2YgdGhlIGhhcmR3YXJlIFBIWS4KKyAgICBlTWliX2RvdDExSGFyZHdhcmVQSFlTdGF0ZSBtaWJEb3QxMUhhcmR3YXJlUEhZU3RhdGU7CisKKyAgICAvLyBkb3QxMSBQb3dlciBTYXZpbmcgbGV2ZWwgaXMgdGhlIDgwMi4xMSBwb3dlciBzYXZpbmcgbGV2ZWwvc3RhdGUgZm9yIHRoZSA4MDIuMTEKKyAgICAvLyBOSUMuICBUeXBpY2FsbHkgdGhpcyBpcyBtYXBwZWQgdG8gODAyLjExIEJNUFMgaW4gc29tZSBmYXNoaW9uLiAgV2UgYXJlIG5vdCBnb2luZworICAgIC8vIHRvIGRpc2FwcG9pbnQ7IHRoZSBMaWJyYSBOSUMgbWFwcyB0aGVzZSB0byBkaWZmZXJlbnQgQk1QUyBzZXR0aW5ncy4KKyAgICBlTWliX2RvdDExUG93ZXJTYXZpbmdMZXZlbCBtaWJEb3QxMVBvd2VyU2F2aW5nTGV2ZWw7CisKKyAgICBzTWliX2RvdDExTWFjRXhjbHVkZUxpc3QgbWliRG90MTFNYWNFeGNsdWRlTGlzdDsKKworICAgIHNNaWJfZG90MTFQcml2YWN5RXhlbXB0aW9uTGlzdCBtaWJEb3QxMVByaXZhY3lFeGVtcHRpb25MaXN0OworCisgICAgc01pYl9kb3QxMVN1cHBvcnRlZFBoeVR5cGVzICBtaWJEb3QxMVN1cHBvcnRlZFBoeVR5cGVzOworICAgIGVNaWJfZG90MTFQaHlUeXBlICAgICAgICAgICAgbWliRG90MTFDdXJyZW50UGh5VHlwZTsKKworICAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICAgIGRvdDExSWJzc0pvaW5Pbmx5OworICAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICAgIEhpZGRlbk5ldHdvcmtFbmFibGVkOworCisKK31zSGRkTWliX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvaW5jL3dsYW5faGRkX3AycC5oIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX3AycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDQ3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfcDJwLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fUDJQX0gKKyNkZWZpbmUgX19QMlBfSAorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1xmaWxlICAgICAgICAgd2xhbl9oZGRfcDJwLmgKKworXGJyaWVmICAgICAgIExpbnV4IEhERCBQMlAgaW5jbHVkZSBmaWxlCisgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisjZGVmaW5lIEFDVElPTl9GUkFNRV9UWF9USU1FT1VUIDEwMDAKKyNkZWZpbmUgV0FJVF9DQU5DRUxfUkVNX0NIQU4gICAgMTAwCisjZGVmaW5lIFdBSVRfUkVNX0NIQU5fUkVBRFkgICAgIDEwMAorI2RlZmluZSBXQUlUX0NIQU5HRV9DSEFOTkVMX0ZPUl9PRkZDSEFOTkVMX1RYIDMwMDAKKworI2RlZmluZSBXTEFOX0hERF9HRVRfVFlQRV9GUk1fRkMoX19mY19fKSAgICAgICAgICgoKF9fZmNfXykgJiAweDBGKSA+PiAyKQorI2RlZmluZSBXTEFOX0hERF9HRVRfU1VCVFlQRV9GUk1fRkMoX19mY19fKSAgICAgICgoKF9fZmNfXykgJiAweEYwKSA+PiA0KQorI2RlZmluZSBXTEFOX0hERF84MDIxMV9GUk1fREFfT0ZGU0VUICAgICAgICAgICAgIDQKKyNkZWZpbmUgUDJQX1dJTERDQVJEX1NTSURfTEVOICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFAyUF9XSUxEQ0FSRF9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgIkRJUkVDVC0iCisKK2VudW0gaGRkX3J4X2ZsYWdzIHsKKyAgICBIRERfUlhfRkxBR19ERUNSWVBURUQgICAgICAgID0gMSA8PCAwLAorICAgIEhERF9SWF9GTEFHX01NSUNfU1RSSVBQRUQgICAgPSAxIDw8IDEsCisgICAgSEREX1JYX0ZMQUdfSVZfU1RSSVBQRUQgICAgICA9IDEgPDwgMiwKK307CisKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyNkZWZpbmUgUDJQX1BPV0VSX1NBVkVfVFlQRV9PUFBPUlRVTklTVElDICAgICAgICAxIDw8IDA7CisjZGVmaW5lIFAyUF9QT1dFUl9TQVZFX1RZUEVfUEVSSU9ESUNfTk9BICAgICAgICAgMSA8PCAxOworI2RlZmluZSBQMlBfUE9XRVJfU0FWRV9UWVBFX1NJTkdMRV9OT0EgICAgICAgICAgIDEgPDwgMjsKKwordHlwZWRlZiBzdHJ1Y3QgcDJwX2FwcF9zZXRQMnBQc3sKKyAgIHRBTklfVTggICAgIG9wcF9wczsKKyAgIHRBTklfVTMyICAgICBjdFdpbmRvdzsKKyAgIHRBTklfVTggICAgIGNvdW50OworICAgdEFOSV9VMzIgICAgIGR1cmF0aW9uOworICAgdEFOSV9VMzIgICAgaW50ZXJ2YWw7CisgICB0QU5JX1UzMiAgICBzaW5nbGVfbm9hX2R1cmF0aW9uOworICAgdEFOSV9VOCAgICAgIHBzU2VsZWN0aW9uOworfXAycF9hcHBfc2V0UDJwUHNfdDsKKworaW50IHdsYW5faGRkX2NmZzgwMjExX3JlbWFpbl9vbl9jaGFubmVsKCBzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHVyYXRpb24sIHU2NCAqY29va2llICk7CisKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwoIHN0cnVjdCB3aXBoeSAqd2lwaHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IGNvb2tpZSApOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQoraW50IHdsYW5faGRkX2NmZzgwMjExX21nbXRfdHhfY2FuY2VsX3dhaXQoc3RydWN0IHdpcGh5ICp3aXBoeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IGNvb2tpZSk7CisjZW5kaWYKKworaW50IGhkZF9zZXRQMnBQcyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqbXNnRGF0YSApOworaW50IGhkZF9zZXRQMnBPcHBzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB0QU5JX1U4ICpjb21tYW5kICk7CitpbnQgaGRkX3NldFAycE5vYSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdEFOSV9VOCAqY29tbWFuZCApOworCit2b2lkIGhkZF9pbmRpY2F0ZU1nbXRGcmFtZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkZyYW1lTGVuZ3RoLCB0QU5JX1U4KiBwYkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGZyYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiByeENoYW4pOworCit2b2lkIGhkZF9yZW1haW5DaGFuUmVhZHlIYW5kbGVyKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApOwordm9pZCBoZGRfc2VuZEFjdGlvbkNuZiggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHRBTklfQk9PTEVBTiBhY3Rpb25TZW5kU3VjY2VzcyApOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDMsMCkpCitpbnQgd2xhbl9oZGRfYWN0aW9uKCBzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLCBib29sIG9mZmNoYW4sCisgICAgICAgICAgICAgICAgICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2hhbm5lbF90eXBlX3ZhbGlkLCB1bnNpZ25lZCBpbnQgd2FpdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sICBib29sIG5vX2NjaywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9udF93YWl0X2Zvcl9hY2ssIHU2NCAqY29va2llICk7CisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCitpbnQgd2xhbl9oZGRfYWN0aW9uKCBzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLCBib29sIG9mZmNoYW4sCisgICAgICAgICAgICAgICAgICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2hhbm5lbF90eXBlX3ZhbGlkLCB1bnNpZ25lZCBpbnQgd2FpdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sIHU2NCAqY29va2llICk7CisjZWxzZQoraW50IHdsYW5faGRkX2FjdGlvbiggc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCB1NjQgKmNvb2tpZSApOworI2VuZGlmCisKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUDJQCisKK3N0cnVjdCBuZXRfZGV2aWNlKiB3bGFuX2hkZF9hZGRfdmlydHVhbF9pbnRmKAorICAgICAgICAgICAgICAgICAgc3RydWN0IHdpcGh5ICp3aXBoeSwgY2hhciAqbmFtZSwgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgdTMyICpmbGFncywgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcyApOworCitpbnQgd2xhbl9oZGRfZGVsX3ZpcnR1YWxfaW50Ziggc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCisjZW5kaWYgLy8gQ09ORklHX0NGRzgwMjExCisKKyNlbmRpZiAvLyBfX1AyUF9ICmRpZmYgLS1naXQgYS9DT1JFL0hERC9pbmMvd2xhbl9oZGRfcGFja2V0X2ZpbHRlcmluZy5oIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX3BhY2tldF9maWx0ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDJjMDkxCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX3BhY2tldF9maWx0ZXJpbmcuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgd2xhbl9oZGRfcGFja2V0X2ZpbHRlcmluZy5oCisqCisqIERlc2NyaXB0aW9uOiBQYWNrZXQgRmlsdGVyIERlZmluaXRpb25zLgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiBRVUFMQ09NTSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0xBTl9IRERfUEFDS0VUX0ZJTFRFUklOR19IX18KKyNkZWZpbmUgX19XTEFOX0hERF9QQUNLRVRfRklMVEVSSU5HX0hfXworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHZfVThfdCAgICAgICBtY2FzdEJjYXN0RmlsdGVyU2V0dGluZzsKK310TWNCY0ZpbHRlckNmZywgKnRwTWNCY0ZpbHRlckNmZzsKKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKyNkZWZpbmUgSEREX01BWF9DTVBfUEVSX1BBQ0tFVF9GSUxURVIgICAgIDUgICAgIAorCit0eXBlZGVmIGVudW0KK3sKKyAgSEREX0ZJTFRFUl9QUk9UT19UWVBFX0lOVkFMSUQgPSAwLAorICBIRERfRklMVEVSX1BST1RPX1RZUEVfTUFDID0gMSwKKyAgSEREX0ZJTFRFUl9QUk9UT19UWVBFX0FSUCA9IDIsCisgIEhERF9GSUxURVJfUFJPVE9fVFlQRV9JUFY0ID0zICwKKyAgSEREX0ZJTFRFUl9QUk9UT19UWVBFX0lQVjYgPSA0LAorICBIRERfRklMVEVSX1BST1RPX1RZUEVfVURQID0gNSwKKyAgSEREX0ZJTFRFUl9QUk9UT19UWVBFX01BWAorfSBlUHJvdG9MYXllcjsKKwordHlwZWRlZiBlbnVtCit7CisgIEhERF9SQ1ZfRklMVEVSX0lOVkFMSUQgPSAwLAorICBIRERfUkNWX0ZJTFRFUl9TRVQgPSAxLAorICBIRERfUkNWX0ZJTFRFUl9DTEVBUiA9IDIsCisgIEhERF9SQ1ZfRklMVEVSX01BWAorfWVGaWx0ZXJBY3Rpb247CisKK3R5cGVkZWYgZW51bSAKK3sKKyAgSEREX0ZJTFRFUl9DTVBfVFlQRV9JTlZBTElEID0gMCwKKyAgSEREX0ZJTFRFUl9DTVBfVFlQRV9FUVVBTCA9IDEsCisgIEhERF9GSUxURVJfQ01QX1RZUEVfTUFTS19FUVVBTCA9IDIsCisgIEhERF9GSUxURVJfQ01QX1RZUEVfTk9UX0VRVUFMID0gMywKKyAgSEREX0ZJTFRFUl9DTVBfVFlQRV9NQVNLX05PVF9FUVVBTCA9IDQsCisgIEhERF9GSUxURVJfQ01QX1RZUEVfTUFYCit9ZUNvbXBhcmVGbGFnOworCitzdHJ1Y3QgUGFja2V0RmlsdGVyUGFyYW1zQ2ZnCit7CisgICAgdl9VOF90ICAgICAgICAgICAgICBwcm90b2NvbExheWVyOworICAgIHZfVThfdCAgICAgICAgICAgICAgY21wRmxhZzsgICAKKyAgICB2X1U4X3QgICAgICAgICAgICAgIGRhdGFPZmZzZXQ7CisgICAgdl9VOF90ICAgICAgICAgICAgICBkYXRhTGVuZ3RoOworICAgIHZfVThfdCAgICAgICAgICAgICAgY29tcGFyZURhdGFbOF07CisgICAgdl9VOF90ICAgICAgICAgICAgICBkYXRhTWFza1s4XTsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdl9VOF90ICAgICAgICAgICAgZmlsdGVyQWN0aW9uOyAgICAKKyAgICB2X1U4X3QgICAgICAgICAgICBmaWx0ZXJJZDsKKyAgICB2X1U4X3QgICAgICAgICAgICBudW1QYXJhbXM7CisgICAgc3RydWN0IFBhY2tldEZpbHRlclBhcmFtc0NmZyBwYXJhbXNEYXRhIFtIRERfTUFYX0NNUF9QRVJfUEFDS0VUX0ZJTFRFUl07Cit9dFBhY2tldEZpbHRlckNmZywgKnRwUGFja2V0RmlsdGVyQ2ZnOworCisjZW5kaWYKKyNlbmRpZiAvLyBfX1dMQU5fSEREX1BBQ0tFVF9GSUxURVJJTkdfSF9fCmRpZmYgLS1naXQgYS9DT1JFL0hERC9pbmMvd2xhbl9oZGRfcG93ZXIuaCBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9wb3dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYjUwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfcG93ZXIuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX1dMQU5fSEREX1BPV0VSX0gKKyNkZWZpbmUgX19XTEFOX0hERF9QT1dFUl9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFxmaWxlICB3bGFuX2hkZF9wb3dlci5oCisKKyAgXGJyaWVmIExpbnV4IEhERCBQb3dlcgorICAgICAgICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuCisgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIndsYW5faGRkX21haW4uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgLy9nRW5hYmxlU3VzcGVuZCA9IDEgaW4gSU5JIGZpbGUgaW1wbGllcyBzdXNwZW5kIHRvIHN0YW5kYnkKKyAjZGVmaW5lIFdMQU5fTUFQX1NVU1BFTkRfVE9fU1RBTkRCWSAgICAgMQorCisgLy9nRW5hYmxlU3VzcGVuZCA9IDIgaW4gSU5JIGZpbGUgaW1wbGllcyBzdXNwZW5kIHRvIGRlZXAgc2xlZXAKKyAjZGVmaW5lIFdMQU5fTUFQX1NVU1BFTkRfVE9fREVFUF9TTEVFUCAgMgorCisgLy9nRW5hYmxlU3VzcGVuZCA9IDMgaW4gSU5JIGZpbGUgaW1wbGllcyBzdXNwZW5kIHRvIHNldCBNQ0FTVC9CQ0FTVCBmaWx0ZXIgCisgI2RlZmluZSBXTEFOX01BUF9TVVNQRU5EX1RPX01DQVNUX0JDQVNUX0ZJTFRFUiAgMworCisgLy9nRW5hYmxlRHJpdmVyU3RvcCA9IDEgaW1wbGllcyBtYXAgZHJpdmVyIHN0b3AgdG8gc3RhbmRieQorICNkZWZpbmUgV0xBTl9NQVBfRFJJVkVSX1NUT1BfVE9fU1RBTkRCWSAgICAgMQorCisgLy9nRW5hYmxlRHJpdmVyU3RvcCA9IDIgaW1wbGllcyBtYXAgc3JpdmVyIHN0b3AgdG8gZGVlcCBzbGVlcAorICNkZWZpbmUgV0xBTl9NQVBfRFJJVkVSX1NUT1BfVE9fREVFUF9TTEVFUCAgMgorCisgLy9NYXhpbXVtIHRpbWUgKG1zKSB0byB3YWl0IGZvciBzdGFuZGJ5IHRvIGNvbXBsZXRlCisgI2RlZmluZSBXTEFOX1dBSVRfVElNRV9TVEFOREJZICAgICAgICAgIDMwMDAKKworIC8vTWF4aW11bSB0aW1lIChtcykgdG8gd2FpdCBmb3IgZnVsbCBwd3IgdG8gY29tcGxldGUKKyAjZGVmaW5lIFdMQU5fV0FJVF9USU1FX0ZVTExfUFdSICAgICAgICAgMzAwMAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIFR5cGUgZGVjbGFyYXRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyBlSGFsU3RhdHVzIGhkZF9leGl0X3N0YW5kYnkoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCk7CisgVk9TX1NUQVRVUyBoZGRfZXhpdF9kZWVwX3NsZWVwKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfYWRhcHRlcl90KiBwQWRhcHRlcik7CisgVk9TX1NUQVRVUyBoZGRfZW50ZXJfc3RhbmRieShoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKKyBWT1NfU1RBVFVTIGhkZF9lbnRlcl9kZWVwX3NsZWVwKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfYWRhcHRlcl90KiBwQWRhcHRlcik7CisjaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKKyBWT1NfU1RBVFVTIGhkZF93bGFuX3Jlc2V0KHZvaWQpOworIFZPU19TVEFUVVMgaGRkX3dsYW5fcmVzZXRfaW5pdGlhbGl6YXRpb24odm9pZCkgOworI2VuZGlmCisgLyogU1NSIHNodXRkb3duICYgcmUtaW5pdCBmdW5jdGlvbnMgKi8KKyBWT1NfU1RBVFVTIGhkZF93bGFuX3NodXRkb3duKHZvaWQpOworIFZPU19TVEFUVVMgaGRkX3dsYW5fcmVfaW5pdCh2b2lkKTsKKwordm9pZCBoZGRfY29uZl9tY2FzdGJjYXN0X2ZpbHRlcihoZGRfY29udGV4dF90KiBwSGRkQ3R4LCB2X0JPT0xfdCBzZXRmaWx0ZXIpOworVk9TX1NUQVRVUyBoZGRfY29uZl9ob3N0YXJwb2ZmbG9hZChoZGRfY29udGV4dF90KiBwSGRkQ3R4LCB2X0JPT0xfdCBmZW5hYmxlKTsKKyNlbmRpZiAvLyBpZiAhZGVmaW5lZCBfX1dMQU5fUUNUX0RSSVZFUl9ICmRpZmYgLS1naXQgYS9DT1JFL0hERC9pbmMvd2xhbl9oZGRfc29mdGFwX3R4X3J4LmggYi9DT1JFL0hERC9pbmMvd2xhbl9oZGRfc29mdGFwX3R4X3J4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1NjZkOQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9zb2Z0YXBfdHhfcnguaApAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKworI2lmICFkZWZpbmVkKCBXTEFOX0hERF9TT0ZUQVBfVFhfUlhfSCApCisjZGVmaW5lIFdMQU5fSEREX1NPRlRBUF9UWF9SWF9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHdsYW5faGRkX3NvZnRhcF90eF9yeC5oCisgIAorICBcYnJpZWYgTGludXggSEREIFNPRlRBUCBUeC9SWCBBUElzCisgICAgICAgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4KKyAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBJbmNsdWRlIGZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyNpbmNsdWRlIDx3bGFuX2hkZF9ob3N0YXBkLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisjZGVmaW5lIEhERF9TT0ZUQVBfVFhfQktfUVVFVUVfTUFYX0xFTiAoODIqMikKKyNkZWZpbmUgSEREX1NPRlRBUF9UWF9CRV9RVUVVRV9NQVhfTEVOICg3OCoyKQorI2RlZmluZSBIRERfU09GVEFQX1RYX1ZJX1FVRVVFX01BWF9MRU4gKDc0KjIpCisjZGVmaW5lIEhERF9TT0ZUQVBfVFhfVk9fUVVFVUVfTUFYX0xFTiAoNzAqMikKKworLyogU29mdEFQIHNwZWNpZmljIEFDIFdlaWdodHMgKi8KKyNkZWZpbmUgSEREX1NPRlRBUF9CS19XRUlHSFRfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSEREX1NPRlRBUF9CRV9XRUlHSFRfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSEREX1NPRlRBUF9WSV9XRUlHSFRfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgSEREX1NPRlRBUF9WT19XRUlHSFRfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgIDE4CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfc29mdGFwX2hhcmRfc3RhcnRfeG1pdCgpIC0gRnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSBMaW51eCBPUyBmb3IgCisgIHRyYW5zbWl0dGluZyBwYWNrZXRzCisKKyAgQHBhcmFtIHNrYiAgICAgIDogW2luXSAgcG9pbnRlciB0byBPUyBwYWNrZXQgKHNrX2J1ZmYpCisgIEBwYXJhbSBkZXYgICAgICA6IFtpbl0gcG9pbnRlciB0byBMaWJyYSBzb2Z0YXAgbmV0d29yayBkZXZpY2UKKyAgCisgIEByZXR1cm4gICAgICAgICA6IE5FVF9YTUlUX0RST1AgaWYgcGFja2V0cyBhcmUgZHJvcHBlZAorICAgICAgICAgICAgICAgICAgOiBORVRfWE1JVF9TVUNDRVNTIGlmIHBhY2tldCBpcyBlbnF1ZXVlZCBzdWNjZXNmdWxseQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworZXh0ZXJuIGludCBoZGRfc29mdGFwX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3NvZnRhcF90eF90aW1lb3V0KCkgLSBGdW5jdGlvbiBjYWxsZWQgYnkgT1MgaWYgdGhlcmUgaXMgYW55CisgIHRpbWVvdXQgZHVyaW5nIHRyYW5zbWlzc2lvbi4gU2luY2UgSEREIHNpbXBseSBlbnF1ZXVlcyBwYWNrZXQKKyAgYW5kIHJldHVybnMgY29udHJvbCB0byBPUyByaWdodCBhd2F5LCB0aGlzIHdvdWxkIG5ldmVyIGJlIGludm9rZWQKKworICBAcGFyYW0gZGV2IDogW2luXSBwb2ludGVyIHRvIExpYnJhIG5ldHdvcmsgZGV2aWNlCisgIEByZXR1cm4gICAgOiBOb25lCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gdm9pZCBoZGRfc29mdGFwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfc3RhdHMoKSAtIEZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCB0aGUgTGludXggT1MgZm9yIAorICBkZXZpY2UgVFgvUlggc3RhdGlzdGljcworCisgIEBwYXJhbSBkZXYgICAgICA6IFtpbl0gcG9pbnRlciB0byBMaWJyYSBuZXR3b3JrIGRldmljZQorICAKKyAgQHJldHVybiAgICAgICAgIDogcG9pbnRlciB0byBuZXRfZGV2aWNlX3N0YXRzIHN0cnVjdHVyZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBoZGRfc29mdGFwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfc29mdGFwX2luaXRfdHhfcngoKSAtIEluaXQgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBUeC9SWAorICBtb2R1bGVzIGluIEhERAorCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgIAorICBAcmV0dXJuICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkIAorICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfc29mdGFwX2luaXRfdHhfcngoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfZGVpbml0X3R4X3J4KCkgLSBEZWluaXQgZnVuY3Rpb24gdG8gY2xlYW4gdXAgVHgvUlgKKyAgbW9kdWxlcyBpbiBIREQKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCAKKyAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworZXh0ZXJuIFZPU19TVEFUVVMgaGRkX3NvZnRhcF9kZWluaXRfdHhfcngoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfaW5pdF90eF9yeF9zdGEoKSAtIEluaXQgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBhIHN0YXRpb24gaW4gVHgvUlgKKyAgbW9kdWxlcyBpbiBIREQKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBTVEFJZCAgICA6IFtpbl0gU3RhdGlvbiBJRCB0byBkZWluaXQKKyAgQHBhcmFtIHBtYWNBZGRyU1RBICA6IFtpbl0gcG9pbnRlciB0byB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIHN0YXRpb24gIAorICBAcmV0dXJuICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkIAorICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfc29mdGFwX2luaXRfdHhfcnhfc3RhKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdl9VOF90IFNUQUlkLCB2X01BQ0FERFJfdCAqcG1hY0FkZHJTVEEpOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfc29mdGFwX2RlaW5pdF90eF9yeF9zdGEoKSAtIERlaW5pdCBmdW5jdGlvbiB0byBjbGVhbiB1cCBhIHN0YXRpb2luIGluIFR4L1JYCisgIG1vZHVsZXMgaW4gSERECisKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2luXSBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICBAcGFyYW0gU1RBSWQgICAgOiBbaW5dIFN0YXRpb24gSUQgdG8gZGVpbml0IAorICBAcmV0dXJuICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkIAorICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfc29mdGFwX2RlaW5pdF90eF9yeF9zdGEgKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdl9VOF90IFNUQUlkICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9kaXNjb25uZWN0X3R4X3J4KCkgLSBEaXNjb25uZWN0IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIFR4L1JYCisgIG1vZHVsZXMgaW4gSERECisKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2luXSBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAgCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2V4dGVybiBWT1NfU1RBVFVTIGhkZF9zb2Z0YXBfZGlzY29ubmVjdF90eF9yeCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3R4X2NvbXBsZXRlX2NiaygpIC0gQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCBieSBUTAorICB0byBpbmRpY2F0ZSB0aGF0IGEgcGFja2V0IGhhcyBiZWVuIHRyYW5zbWl0dGVkIGFjcm9zcyB0aGUgU0RJTyBidXMKKyAgc3VjY2VzZnVsbHkuIE9TIHBhY2tldCByZXNvdXJjZXMgY2FuIGJlIHJlbGVhc2VkIGFmdGVyIHRoaXMgY2JrLgorCisgIEBwYXJhbSB2b3NDb250ZXh0ICAgOiBbaW5dIHBvaW50ZXIgdG8gVk9TIGNvbnRleHQgICAKKyAgQHBhcmFtIHBWb3NQYWNrZXQgICA6IFtpbl0gcG9pbnRlciB0byBWT1MgcGFja2V0IChjb250YWluaW5nIHNrYikgCisgIEBwYXJhbSB2b3NTdGF0dXNJbiAgOiBbaW5dIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXNzaW9uIAorCisgIEByZXR1cm4gICAgICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkIAorICAgICAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworZXh0ZXJuIFZPU19TVEFUVVMgaGRkX3NvZnRhcF90eF9jb21wbGV0ZV9jYmsoIHZfVk9JRF90ICp2b3NDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfdCAqcFZvc1BhY2tldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTIHZvc1N0YXR1c0luICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfdHhfZmV0Y2hfcGFja2V0X2NiaygpIC0gQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCBieSBUTCB0byAKKyAgZmV0Y2ggYSBwYWNrZXQgZm9yIHRyYW5zbWlzc2lvbi4KKworICBAcGFyYW0gdm9zQ29udGV4dCAgIDogW2luXSBwb2ludGVyIHRvIFZPUyBjb250ZXh0ICAKKyAgQHBhcmFtIHN0YUlkICAgICAgICA6IFtpbl0gU3RhdGlvbiBmb3Igd2hpY2ggVEwgaXMgcmVxdWVzdGluZyBhIHBrdAorICBAcGFyYW0gdWNBQyAgICAgICAgIDogW2luXSBwb2ludGVyIHRvIGFjY2VzcyBjYXRlZ29yeSByZXF1ZXN0ZWQgYnkgVEwKKyAgQHBhcmFtIHBWb3NQYWNrZXQgICA6IFtvdXRdIHBvaW50ZXIgdG8gVk9TIHBhY2tldCBwYWNrZXQgcG9pbnRlcgorICBAcGFyYW0gcFBrdE1ldGFJbmZvIDogW291dF0gcG9pbnRlciB0byBtZXRhIGluZm8gZm9yIHRoZSBwa3QgCisgIAorICBAcmV0dXJuICAgICAgICAgICAgIDogVk9TX1NUQVRVU19FX0VNUFRZIGlmIG5vIHBhY2tldHMgdG8gdHJhbnNtaXQKKyAgICAgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfc29mdGFwX3R4X2ZldGNoX3BhY2tldF9jYmsoIHZfVk9JRF90ICp2b3NDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcFN0YUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ0VudW1UeXBlICAgIHVjQUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90ICoqcHBWb3NQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01ldGFJbmZvVHlwZSAqcFBrdE1ldGFJbmZvICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfdHhfbG93X3Jlc291cmNlX2NiaygpIC0gQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCBpbiB0aGUgCisgIGNhc2Ugd2hlcmUgVk9TIHBhY2tldHMgYXJlIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwgdG8gZ2V0IAorICBwYWNrZXRzLiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGludm9rZWQgYnkgVk9TIHdoZW4gcGFja2V0cyBhcmUgCisgIGF2YWlsYWJsZS4KKworICBAcGFyYW0gcFZvc1BhY2tldCA6IFtpbl0gIHBvaW50ZXIgdG8gVk9TIHBhY2tldCAKKyAgQHBhcmFtIHVzZXJEYXRhICAgOiBbaW5dICBvcGFxdWUgdXNlciBkYXRhIHRoYXQgd2FzIHBhc3NlZCBpbml0aWFsbHkgCisgIAorICBAcmV0dXJuICAgICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQsIAorICAgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworZXh0ZXJuIFZPU19TVEFUVVMgaGRkX3NvZnRhcF90eF9sb3dfcmVzb3VyY2VfY2JrKCB2b3NfcGt0X3QgKnBWb3NQYWNrZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICp1c2VyRGF0YSApOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfc29mdGFwX3J4X3BhY2tldF9jYmsoKSAtIFJlY2VpdmUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIFRMLgorICBUTCB3aWxsIGNhbGwgdGhpcyB0byBub3RpZnkgdGhlIEhERCB3aGVuIGEgcGFja2V0IHdhcyByZWNlaXZlZCAKKyAgZm9yIGEgcmVnaXN0ZXJlZCBTVEEuCisKKyAgQHBhcmFtIHZvc0NvbnRleHQgICA6IFtpbl0gcG9pbnRlciB0byBWT1MgY29udGV4dCAgCisgIEBwYXJhbSBwVm9zUGFja2V0ICAgOiBbaW5dIHBvaW50ZXIgdG8gVk9TIHBhY2tldCAoY29uYXRpbmluZyBza19idWZmKSAKKyAgQHBhcmFtIHN0YUlkICAgICAgICA6IFtpbl0gU3RhdGlvbiBJZAorICBAcGFyYW0gcFJ4TWV0YUluZm8gIDogW2luXSBwb2ludGVyIHRvIG1ldGEgaW5mbyBmb3IgdGhlIHJlY2VpdmVkIHBrdChzKSAKKworICBAcmV0dXJuICAgICAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwgCisgICAgICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfc29mdGFwX3J4X3BhY2tldF9jYmsoIHZfVk9JRF90ICp2b3NDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X3QgKnBWb3NQYWNrZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzdGFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUnhNZXRhSW5mb1R5cGUqIHBSeE1ldGFJbmZvICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfRGVyZWdpc3RlclNUQSAtIERlcmVnaXN0ZXIgYSBzdGF0aW9uIGZyb20gVEwgYmxvY2sKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBTVEFJZCAgICA6IFtpbl0gU3RhdGlvbiBJRCB0byBkZXJlZ2lzdGVyCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2V4dGVybiBWT1NfU1RBVFVTIGhkZF9zb2Z0YXBfRGVyZWdpc3RlclNUQSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHRBTklfVTggc3RhSWQgKTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3NvZnRhcF9SZWdpc3RlclNUQSAtIFJlZ2lzdGVyIGEgc3RhdGlvbiBpbnRvIFRMIGJsb2NrCisKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2luXSBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICBAcGFyYW0gU1RBSWQgICAgOiBbaW5dIFN0YXRpb24gSUQgdG8gZGVyZWdpc3RlcgorICBAcGFyYW0gZkF1dGhSZXF1aXJlZDogW2luXSBTdGF0aW9uIHJlcXVpcmVzIGZ1cnRoZXIgc2VjdXJpdHkgbmVnb3RpYXRpb24gb3Igbm90CisgIEBwYXJhbSBmUHJpdmFjeUJpdCAgOiBbaW5dIHByaXZhY3kgYml0IG5lZWRzIHRvIGJlIHNldCBvciBub3QKKyAgQHBhcmFtIHVjYXN0U2lnICA6IFtpbl0gVW5pY2FzdCBTaWduYXR1cmUgc2VuZCB0byBUTAorICBAcGFyYW0gYmNhc3RTaWcgIDogW2luXSBCcm9hZGNhc3QgU2lnbmF0dXJlIHNlbmQgdG8gVEwKKyAgQHBhcmFtIHBQZWVyTWFjQWRkcmVzcyAgOiBbaW5dIHN0YXRpb24gTUFDIGFkZHJlc3MKKyAgQHBhcmFtIGZXbW1FbmFibGVkICA6IFtpbl0gV21tIGVuYWJsZWQgc3RhIG9yIG5vdAorICBAcmV0dXJuICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkIAorICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworZXh0ZXJuIFZPU19TVEFUVVMgaGRkX3NvZnRhcF9SZWdpc3RlclNUQSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCBmQXV0aFJlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgZlByaXZhY3lCaXQsICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHN0YUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHVjYXN0U2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IGJjYXN0U2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9NQUNBRERSX3QgKnBQZWVyTWFjQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IGZXbW1FbmFibGVkKTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3NvZnRhcF9SZWdpc3Rlcl9CQ19TVEEgLSBSZWdpc3RlciBhIGRlZmF1bHQgYnJvYWRjYXN0IHN0YXRpb24gaW50byBUTCBibG9jaworCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAgQHBhcmFtIGZQcml2YWN5Qml0IDogW2luXSBwcml2YWN5IGJpdCBuZWVkcyB0byBiZSBzZXQgb3Igbm90CisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfc29mdGFwX1JlZ2lzdGVyX0JDX1NUQSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHZfQk9PTF90IGZQcml2YWN5Qml0KTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3NvZnRhcF9EZXJlZ2lzdGVyU1RBIC0gRGVSZWdpc3RlciB0aGUgZGVmYXVsdCBicm9hZGNhc3Qgc3RhdGlvbiBpbnRvIFRMIGJsb2NrCisKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2luXSBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICBAcmV0dXJuICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkIAorICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworZXh0ZXJuIFZPU19TVEFUVVMgaGRkX3NvZnRhcF9EZXJlZ2lzdGVyX0JDX1NUQSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfc29mdGFwX3N0b3BfYnNzIC0gSGVscGVyIGZ1bmN0aW9uIHRvIHN0b3AgYnNzIGFuZCBkbyBjbGVhbnVwIGluIEhERCBhbmQgVEwKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfc29mdGFwX3N0b3BfYnNzKCBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIpOworCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfY2hhbmdlX1NUQV9zdGF0ZSAtIEhlbHBlciBmdW5jdGlvbiB0byBjaGFuZ2Ugc3RhdGlvbiBzdGF0ZSBieSBNQUMgYWRkcmVzcworCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAgQHBhcmFtIHBEZXN0TWFjQWRkcmVzcyA6IFtpbl0gcG9pbnRlciB0byBzdGF0aW9uIE1BQyBhZGRyZXNzCisgIEBwYXJhbSBzdGF0ZSAgICA6IFtpbl0gbmV3IHN0YXRpb24gc3RhdGUKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCAKKyAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2V4dGVybiBWT1NfU1RBVFVTIGhkZF9zb2Z0YXBfY2hhbmdlX1NUQV9zdGF0ZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHZfTUFDQUREUl90ICpwRGVzdE1hY0FkZHJlc3MsIFdMQU5UTF9TVEFTdGF0ZVR5cGUgc3RhdGUpOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfc29mdGFwX0dldFN0YUlkIC0gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBzdGF0aW9uIElkIGZyb20gTUFDIGFkZHJlc3MKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBwRGVzdE1hY0FkZHJlc3MgOiBbaW5dIHBvaW50ZXIgdG8gc3RhdGlvbiBNQUMgYWRkcmVzcworICBAcGFyYW0gc3RhSWQgICAgOiBbb3V0XSBzdGF0aW9uIGlkCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfc29mdGFwX0dldFN0YUlkKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdl9NQUNBRERSX3QgKnBNYWNBZGRyZXNzLCB2X1U4X3QgKnN0YUlkKTsKKworI2VuZGlmICAgIC8vIGVuZCAjaWYgIWRlZmluZWQoIFdMQU5fSEREX1NPRlRBUF9UWF9SWF9IICkKZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy93bGFuX2hkZF90eF9yeC5oIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX3R4X3J4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiZjFjZAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL2luYy93bGFuX2hkZF90eF9yeC5oCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBXTEFOX0hERF9UWF9SWF9IICkKKyNkZWZpbmUgV0xBTl9IRERfVFhfUlhfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB3bGFuX2hkZF90eF9yeC5oCisgIAorICBcYnJpZWYgTGludXggSEREIFR4L1JYIEFQSXMKKyAgICAgICAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLgorICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgICAgICAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEluY2x1ZGUgZmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorI2luY2x1ZGUgPHdsYW5faGRkX2luY2x1ZGVzLmg+CisjaW5jbHVkZSA8dm9zX2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPHdsYW5fcWN0X3RsLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisjZGVmaW5lIEhERF9FVEhFUlRZUEVfODAyXzFfWCAgICAgICAgICAgICAgKCAweDg4OEUgKQorI2RlZmluZSBIRERfRVRIRVJUWVBFXzgwMl8xX1hfRlJBTUVfT0ZGU0VUICggMTIgKQorI2RlZmluZSBIRERfRVRIRVJUWVBFXzgwMl8xX1hfU0laRSAgICAgICAgICggMiApCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyNkZWZpbmUgSEREX0VUSEVSVFlQRV9XQUkgICAgICAgICAgICAgICAgICAoIDB4ODhiNCApCisjZW5kaWYKKworI2RlZmluZSBIRERfODAyMTFfSEVBREVSX0xFTiAgICAgIDI0CisjZGVmaW5lIEhERF84MDIxMV9IRUFERVJfUU9TX0NUTCAgMgorI2RlZmluZSBIRERfTExDX0hEUl9MRU4gICAgICAgICAgIDYKKyNkZWZpbmUgSEREX0ZSQU1FX1RZUEVfTUFTSyAgICAgICAweDBjIAorI2RlZmluZSBIRERfRlJBTUVfU1VCVFlQRV9NQVNLICAgIDB4ZjAgCisjZGVmaW5lIEhERF9GUkFNRV9UWVBFX0RBVEEgICAgICAgMHgwOAorI2RlZmluZSBIRERfRlJBTUVfVFlQRV9NR01UICAgICAgIDB4MDAKKyNkZWZpbmUgSEREX0ZSQU1FX1NVQlRZUEVfUU9TREFUQSAweDgwCisjZGVmaW5lIEhERF9GUkFNRV9TVUJUWVBFX0RFQVVUSCAgMHhDMAorI2RlZmluZSBIRERfRlJBTUVfU1VCVFlQRV9ESVNBU1NPQyAweEEwCisjZGVmaW5lIEhERF9ERVNUX0FERFJfT0ZGU0VUICAgICAgNgorCisjZGVmaW5lIEhERF9NQUNfSERSX1NJWkUgICAgICAgICAgNgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9oYXJkX3N0YXJ0X3htaXQoKSAtIEZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCB0aGUgTGludXggT1MgZm9yIAorICB0cmFuc21pdHRpbmcgcGFja2V0cworCisgIEBwYXJhbSBza2IgICAgICA6IFtpbl0gIHBvaW50ZXIgdG8gT1MgcGFja2V0IChza19idWZmKQorICBAcGFyYW0gZGV2ICAgICAgOiBbaW5dIHBvaW50ZXIgdG8gTGlicmEgbmV0d29yayBkZXZpY2UKKyAgCisgIEByZXR1cm4gICAgICAgICA6IE5FVF9YTUlUX0RST1AgaWYgcGFja2V0cyBhcmUgZHJvcHBlZAorICAgICAgICAgICAgICAgICAgOiBORVRfWE1JVF9TVUNDRVNTIGlmIHBhY2tldCBpcyBlbnF1ZXVlZCBzdWNjZXNmdWxseQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworZXh0ZXJuIGludCBoZGRfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjaWZkZWYgQ09ORklHX0NGRzgwMjExICAgCitleHRlcm4gaW50IGhkZF9tb25faGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfdHhfdGltZW91dCgpIC0gRnVuY3Rpb24gY2FsbGVkIGJ5IE9TIGlmIHRoZXJlIGlzIGFueQorICB0aW1lb3V0IGR1cmluZyB0cmFuc21pc3Npb24uIFNpbmNlIEhERCBzaW1wbHkgZW5xdWV1ZXMgcGFja2V0CisgIGFuZCByZXR1cm5zIGNvbnRyb2wgdG8gT1MgcmlnaHQgYXdheSwgdGhpcyB3b3VsZCBuZXZlciBiZSBpbnZva2VkCisKKyAgQHBhcmFtIGRldiA6IFtpbl0gcG9pbnRlciB0byBMaWJyYSBuZXR3b3JrIGRldmljZQorICBAcmV0dXJuICAgIDogTm9uZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworZXh0ZXJuIHZvaWQgaGRkX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zdGF0cygpIC0gRnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSBMaW51eCBPUyBmb3IgCisgIGRldmljZSBUWC9SWCBzdGF0aXN0aWNzCisKKyAgQHBhcmFtIGRldiAgICAgIDogW2luXSBwb2ludGVyIHRvIExpYnJhIG5ldHdvcmsgZGV2aWNlCisgIAorICBAcmV0dXJuICAgICAgICAgOiBwb2ludGVyIHRvIG5ldF9kZXZpY2Vfc3RhdHMgc3RydWN0dXJlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIGhkZF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2luaXRfdHhfcngoKSAtIEluaXQgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBUeC9SWAorICBtb2R1bGVzIGluIEhERAorCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgIAorICBAcmV0dXJuICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkIAorICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfaW5pdF90eF9yeCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2RlaW5pdF90eF9yeCgpIC0gRGVpbml0IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIFR4L1JYCisgIG1vZHVsZXMgaW4gSERECisKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2luXSBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAgCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2V4dGVybiBWT1NfU1RBVFVTIGhkZF9kZWluaXRfdHhfcngoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9kaXNjb25uZWN0X3R4X3J4KCkgLSBEaXNjb25uZWN0IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIFR4L1JYCisgIG1vZHVsZXMgaW4gSERECisKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2luXSBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAgCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2V4dGVybiBWT1NfU1RBVFVTIGhkZF9kaXNjb25uZWN0X3R4X3J4KCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfdHhfY29tcGxldGVfY2JrKCkgLSBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIGJ5IFRMCisgIHRvIGluZGljYXRlIHRoYXQgYSBwYWNrZXQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQgYWNyb3NzIHRoZSBTRElPIGJ1cworICBzdWNjZXNmdWxseS4gT1MgcGFja2V0IHJlc291cmNlcyBjYW4gYmUgcmVsZWFzZWQgYWZ0ZXIgdGhpcyBjYmsuCisKKyAgQHBhcmFtIHZvc0NvbnRleHQgICA6IFtpbl0gcG9pbnRlciB0byBWT1MgY29udGV4dCAgIAorICBAcGFyYW0gcFZvc1BhY2tldCAgIDogW2luXSBwb2ludGVyIHRvIFZPUyBwYWNrZXQgKGNvbnRhaW5pbmcgc2tiKSAKKyAgQHBhcmFtIHZvc1N0YXR1c0luICA6IFtpbl0gc3RhdHVzIG9mIHRoZSB0cmFuc21pc3Npb24gCisKKyAgQHJldHVybiAgICAgICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfdHhfY29tcGxldGVfY2JrKCB2X1ZPSURfdCAqdm9zQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X3QgKnBWb3NQYWNrZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXNJbiApOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfdHhfZmV0Y2hfcGFja2V0X2NiaygpIC0gQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCBieSBUTCB0byAKKyAgZmV0Y2ggYSBwYWNrZXQgZm9yIHRyYW5zbWlzc2lvbi4KKworICBAcGFyYW0gdm9zQ29udGV4dCAgIDogW2luXSBwb2ludGVyIHRvIFZPUyBjb250ZXh0ICAKKyAgQHBhcmFtIHN0YUlkICAgICAgICA6IFtpbl0gU3RhdGlvbiBmb3Igd2hpY2ggVEwgaXMgcmVxdWVzdGluZyBhIHBrdAorICBAcGFyYW0gdWNBQyAgICAgICAgIDogW2luXSBwb2ludGVyIHRvIGFjY2VzcyBjYXRlZ29yeSByZXF1ZXN0ZWQgYnkgVEwKKyAgQHBhcmFtIHBWb3NQYWNrZXQgICA6IFtvdXRdIHBvaW50ZXIgdG8gVk9TIHBhY2tldCBwYWNrZXQgcG9pbnRlcgorICBAcGFyYW0gcFBrdE1ldGFJbmZvIDogW291dF0gcG9pbnRlciB0byBtZXRhIGluZm8gZm9yIHRoZSBwa3QgCisgIAorICBAcmV0dXJuICAgICAgICAgICAgIDogVk9TX1NUQVRVU19FX0VNUFRZIGlmIG5vIHBhY2tldHMgdG8gdHJhbnNtaXQKKyAgICAgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gVk9TX1NUQVRVUyBoZGRfdHhfZmV0Y2hfcGFja2V0X2Niayggdl9WT0lEX3QgKnZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwU3RhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDRW51bVR5cGUgICAgdWNBQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X3QgKipwcFZvc1BhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTWV0YUluZm9UeXBlICpwUGt0TWV0YUluZm8gKTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3R4X2xvd19yZXNvdXJjZV9jYmsoKSAtIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgaW4gdGhlIAorICBjYXNlIHdoZXJlIFZPUyBwYWNrZXRzIGFyZSBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIG9mIHRoZSBjYWxsIHRvIGdldCAKKyAgcGFja2V0cy4gVGhpcyBjYWxsYmFjayBmdW5jdGlvbiBpcyBpbnZva2VkIGJ5IFZPUyB3aGVuIHBhY2tldHMgYXJlIAorICBhdmFpbGFibGUuCisKKyAgQHBhcmFtIHBWb3NQYWNrZXQgOiBbaW5dICBwb2ludGVyIHRvIFZPUyBwYWNrZXQgCisgIEBwYXJhbSB1c2VyRGF0YSAgIDogW2luXSAgb3BhcXVlIHVzZXIgZGF0YSB0aGF0IHdhcyBwYXNzZWQgaW5pdGlhbGx5IAorICAKKyAgQHJldHVybiAgICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2V4dGVybiBWT1NfU1RBVFVTIGhkZF90eF9sb3dfcmVzb3VyY2VfY2JrKCB2b3NfcGt0X3QgKnBWb3NQYWNrZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICp1c2VyRGF0YSApOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfcnhfcGFja2V0X2NiaygpIC0gUmVjZWl2ZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwuCisgIFRMIHdpbGwgY2FsbCB0aGlzIHRvIG5vdGlmeSB0aGUgSEREIHdoZW4gYSBwYWNrZXQgd2FzIHJlY2VpdmVkIAorICBmb3IgYSByZWdpc3RlcmVkIFNUQS4KKworICBAcGFyYW0gdm9zQ29udGV4dCAgIDogW2luXSBwb2ludGVyIHRvIFZPUyBjb250ZXh0ICAKKyAgQHBhcmFtIHBWb3NQYWNrZXQgICA6IFtpbl0gcG9pbnRlciB0byBWT1MgcGFja2V0IChjb25hdGluaW5nIHNrX2J1ZmYpIAorICBAcGFyYW0gc3RhSWQgICAgICAgIDogW2luXSBTdGF0aW9uIElkCisgIEBwYXJhbSBwUnhNZXRhSW5mbyAgOiBbaW5dIHBvaW50ZXIgdG8gbWV0YSBpbmZvIGZvciB0aGUgcmVjZWl2ZWQgcGt0KHMpIAorCisgIEByZXR1cm4gICAgICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2V4dGVybiBWT1NfU1RBVFVTIGhkZF9yeF9wYWNrZXRfY2JrKCB2X1ZPSURfdCAqdm9zQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90ICpwVm9zUGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc3RhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlKiBwUnhNZXRhSW5mbyApOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfSXNFQVBPTFBhY2tldCgpIC0gQ2hlY2tzIHRoZSBwYWNrZXQgaXMgRUFQT0wgb3Igbm90LgorCisgIEBwYXJhbSBwVm9zUGFja2V0IDogW2luXSBwb2ludGVyIHRvIHZvcyBwYWNrZXQgIAorICBAcmV0dXJuICAgICAgICAgOiBWT1NfVFJVRSBpZiB0aGUgcGFja2V0IGlzIEVBUE9MIAorICAgICAgICAgICAgICAgICAgOiBWT1NfRkFMU0Ugb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitleHRlcm4gdl9CT09MX3QgaGRkX0lzRUFQT0xQYWNrZXQoIHZvc19wa3RfdCAqcFZvc1BhY2tldCApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9tb25fdHhfbWdtdF9wa3QoKSAtIFRyYW5zbWl0IE1HTVQgcGFja2V0IHJlY2VpdmVkIG9uIG1vbml0b3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuCisKKyAgQHBhcmFtIHBBZGFwdGVyOiBbaW5dIFNBUC9QMlAgR08gYWRhcHRvci4gCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIGhkZF9tb25fdHhfbWdtdF9wa3QoaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIpOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfbW9uX3R4X3dvcmtfcXVldWUoKSAtIHdvcmtxdWV1ZSBoYW5kbGVyIGZvciB0cmFuc21pdHRpbmcgbWdtdCBwYWNrZXRzLi4KKworICBAcGFyYW0gd29yazogW2luXSB3b3JrcXVldWUgc3RydWN0dXJlLgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBoZGRfbW9uX3R4X3dvcmtfcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorCisjZW5kaWYgICAgLy8gZW5kICNpZiAhZGVmaW5lZCggV0xBTl9IRERfVFhfUlhfSCApCmRpZmYgLS1naXQgYS9DT1JFL0hERC9pbmMvd2xhbl9oZGRfdmVyc2lvbi5oIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E5ODdmCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX3ZlcnNpb24uaApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyAgRmlsZTogICAgICAgICBoZGRfVmVyc2lvbi5oCisvLworLy8gIERlc2NyaXB0aW9uOiAgTWluaXBvcnQgZHJpdmVyIHZlcnNpb24gaW5mb3JtYXRpb24KKy8vCisvLyAgQXV0aG9yOiAgICAgICBMYXJyeSBDYXdsZXkKKy8vIAorLy8gIENvcHlyaWdodCAyMDA3LCBRVUFMQ09NTSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZiAhZGVmaW5lZCggX19oZGRWZXJzaW9uX2hfXyApCisjZGVmaW5lIF9faGRkVmVyc2lvbl9oX18KKworLy8gZm9yY2Ugc3RyaW5nIGV4cGFuc2lvbiBmcm9tIGNoYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBzdHJFWFBBTkQoeCkgI3gKKyNkZWZpbmUgc3RyU1RSSU5HKHgpIHN0ckVYUEFORCh4KQorI2RlZmluZSBzdHJWRVJTSU9OKCBfbWosIF9tbiwgX3NmeCwgX2J1aWxkICkgc3RyU1RSSU5HKF9taikgIi4iIHN0clNUUklORyhfbW4pICIuIiBzdHJTVFJJTkcoX3NmeCkgIi4iIHN0clNUUklORyhfYnVpbGQpCisKKworI2lmIGRlZmluZWQoIEJMRF9SRUwgKQorI2RlZmluZSBIRERfRFJJVkVSX01BSk9SX1ZFUlNJT04gQkxEX1JFTAorI2Vsc2UgCisjZGVmaW5lIEhERF9EUklWRVJfTUFKT1JfVkVSU0lPTiAgICAgICAgICAgICAwICAgCisjZW5kaWYKKworI2lmIGRlZmluZWQoIEJMRF9WRVIgKQorI2RlZmluZSBIRERfRFJJVkVSX01JTk9SX1ZFUlNJT04gQkxEX1ZFUgorI2Vsc2UgCisjZGVmaW5lIEhERF9EUklWRVJfTUlOT1JfVkVSU0lPTiAgICAgICAgICAgICAwCisjZW5kaWYKKworI2lmIGRlZmluZWQoIEJMRF9TRlggKQorI2RlZmluZSBIRERfRFJJVkVSX1NVRkZJWCBCTERfU0ZYIAorI2Vsc2UKKyNkZWZpbmUgSEREX0RSSVZFUl9TVUZGSVggICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZiAKKworI2lmIGRlZmluZWQoIEJMRF9OVU0gKQorI2RlZmluZSBIRERfRFJJVkVSX0JVSUxEIEJMRF9OVU0KKyNlbHNlIAorI2RlZmluZSBIRERfRFJJVkVSX0JVSUxEICAgICAgICAgICAgICAgICAgICAgMDAwMCAgCisjZW5kaWYgCisjZGVmaW5lIEhERF9CVUlMRF9EQVRFVElNRSBfX0RBVEVfXyAiICIgX19USU1FX18gIAorCisjZGVmaW5lIEhERF9EUklWRVJfVkVSU0lPTiBXTklfRFJJVkVSX01BSk9SX1ZFUlNJT04sV05JX0RSSVZFUl9NSU5PUl9WRVJTSU9OCisKKyNkZWZpbmUgSEREX0RSSVZFUl9WRVJTSU9OX1NUUiBzdHJWRVJTSU9OKCBXTklfRFJJVkVSX01BSk9SX1ZFUlNJT04sIFdOSV9EUklWRVJfTUlOT1JfVkVSU0lPTiwgV05JX0RSSVZFUl9TVUZGSVgsIFdOSV9EUklWRVJfQlVJTEQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSEREX0NPTVBBTllOQU1FX0ZVTEwgICAgICAgICJRVUFMQ09NTSwgSW5jLiIKKyNkZWZpbmUgSEREX0RSSVZFUl9ERVNDUklQVElPTiAgICAgICJRVUFMQ09NTSBHZW42IDgwMi4xMW4gV2lyZWxlc3MgQWRhcHRlciIKKyNkZWZpbmUgT0VNX0ZJTEVERVNDUklQVElPTl9TVFIgICAgIEFOSV9EUklWRVJfREVTQ1JJUFRJT04gCisgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgT0VNX0NPTVBBTllOQU1FX1NUUiAgICAgICAgIEFOSV9DT01QQU5ZTkFNRV9GVUxMIAorCisjZGVmaW5lIE9FTV9JTlRFUk5BTE5BTUVfU1RSICAgICAgICAiV0xBTl9RQ1RfRFJWLmRsbCIKKyNkZWZpbmUgT0VNX0lOVEVSTkFMTkFNRV9TVFIyICAgICAgICJXTEFOX1FDVF9EUlYuZGxsIgorI2RlZmluZSBPRU1fT1JJR0lOQUxGSUxFTkFNRV9TVFIgICAgIldMQU5fUUNUX0RSVi5kbGwiCisKKyNkZWZpbmUgT0VNX0xFR0FMQ09QWVJJR0hUX1lFQVJTICAgICIyMDA4IgorI2RlZmluZSBPRU1fTEVHQUxDT1BZUklHSFRfU1RSICAgICAgIkNvcHlyaWdodCBcMjUxICIgT0VNX0NPTVBBTllOQU1FX1NUUiAiLCIgT0VNX0xFR0FMQ09QWVJJR0hUX1lFQVJTCisjZGVmaW5lIE9FTV9QUk9EVUNUTkFNRV9TVFIgICAgICAgICBIRERfRFJJVkVSX0RFU0NSSVBUSU9OCisKKyNkZWZpbmUgT0VNX1BST0RVQ1RWRVJTSU9OICAgICAgICAgIEhERF9EUklWRVJfVkVSU0lPTgorI2RlZmluZSBPRU1fRklMRVZFUlNJT05fU1RSICAgICAgICAgSEREX0RSSVZFUl9WRVJTSU9OX1NUUgorI2RlZmluZSBPRU1fRklMRVZFUlNJT04gICAgICAgICAgICAgSEREX0RSSVZFUl9NQUpPUl9WRVJTSU9OLEhERF9EUklWRVJfTUlOT1JfVkVSU0lPTixIRERfRFJJVkVSX1NVRkZJWCxIRERfRFJJVkVSX0JVSUxECisjZGVmaW5lIE9FTV9QUk9EVUNUVkVSU0lPTl9TVFIgICAgICBIRERfRFJJVkVSX1ZFUlNJT05fU1RSCisKKworI2VuZGlmICAvLyBfX2hkZFZlcnNpb25faF9fCmRpZmYgLS1naXQgYS9DT1JFL0hERC9pbmMvd2xhbl9oZGRfd2V4dC5oIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX3dleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzEzOTlhCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX3dleHQuaApAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19XRVhUX0lXX0hfXworI2RlZmluZSBfX1dFWFRfSVdfSF9fCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSAidm9zX2V2ZW50LmgiCisKKy8qCisgKiBvcmRlciBvZiBwYXJhbWV0ZXJzIGluIGFkZFRzIHByaXZhdGUgaW9jdGwKKyAqLworI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fSEFORExFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9USUQgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fVVNFUl9QUklPUklUWSAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9OT01JTkFMX01TRFVfU0laRSAgICAgICAgICAgIDQKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX01BWElNVU1fTVNEVV9TSVpFICAgICAgICAgICAgNQorI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fTUlOSU1VTV9EQVRBX1JBVEUgICAgICAgICAgICA2CisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9NRUFOX0RBVEFfUkFURSAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX1BFQUtfREFUQV9SQVRFICAgICAgICAgICAgICAgOAorI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fTUFYX0JVUlNUX1NJWkUgICAgICAgICAgICAgICA5CisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9NSU5JTVVNX1BIWV9SQVRFICAgICAgICAgICAgMTAKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX1NVUlBMVVNfQkFORFdJRFRIX0FMTE9XQU5DRSAxMQorI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fU0VSVklDRV9JTlRFUlZBTCAgICAgICAgICAgIDEyCisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9TVVNQRU5TSU9OX0lOVEVSVkFMICAgICAgICAgMTMKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX0JVUlNUX1NJWkVfREVGTiAgICAgICAgICAgICAxNAorI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fQUNLX1BPTElDWSAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEhERF9XTEFOX1dNTV9QQVJBTV9JTkFDVElWSVRZX0lOVEVSVkFMICAgICAgICAgMTYKKyNkZWZpbmUgSEREX1dMQU5fV01NX1BBUkFNX01BWF9TRVJWSUNFX0lOVEVSVkFMICAgICAgICAxNworI2RlZmluZSBIRERfV0xBTl9XTU1fUEFSQU1fQ09VTlQgICAgICAgICAgICAgICAgICAgICAgIDE4CisKK3R5cGVkZWYgZW51bQoreworICAgSEREX1dMQU5fV01NX0RJUkVDVElPTl9VUFNUUkVBTSAgICAgID0gMCwKKyAgIEhERF9XTEFOX1dNTV9ESVJFQ1RJT05fRE9XTlNUUkVBTSAgICA9IDEsCisgICBIRERfV0xBTl9XTU1fRElSRUNUSU9OX0JJRElSRUNUSU9OQUwgPSAyLAorfSBoZGRfd2xhbl93bW1fZGlyZWN0aW9uX2U7CisKK3R5cGVkZWYgZW51bQoreworICAgSEREX1dMQU5fV01NX1BPV0VSX1NBVkVfTEVHQUNZICAgICAgID0gMCwKKyAgIEhERF9XTEFOX1dNTV9QT1dFUl9TQVZFX1VBUFNEICAgICAgICA9IDEsCit9IGhkZF93bGFuX3dtbV9wb3dlcl9zYXZlX2U7CisKK3R5cGVkZWYgZW51bQoreworICAgLy8gVFNQRUMvcmUtYXNzb2MgZG9uZSwgYXN5bmMKKyAgIEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfU1VDQ0VTUyA9IDAsCisgICAvLyBubyBuZWVkIHRvIHNldHVwIFRTUEVDIHNpbmNlIEFDTT0wIGFuZCBubyBVQVBTRCBkZXNpcmVkLCBzeW5jICsgYXN5bmMKKyAgIEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fVUFQU0QgPSAxLAorICAgLy8gbm8gbmVlZCB0byBzZXR1cCBUU1BFQyBzaW5jZSBBQ009MCBhbmQgVUFQU0QgYWxyZWFkeSBleGlzdHMsIHN5bmMgKyBhc3luYworICAgSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9VQVBTRF9FWElTVElORyA9IDIsCisgICAvLyBUU1BFQyByZXN1bHQgcGVuZGluZywgc3luYworICAgSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9QRU5ESU5HID0gMywKKyAgIC8vIFRTUEVDL3JlLWFzc29jIGZhaWxlZCwgc3luYyArIGFzeW5jCisgICBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRCA9IDQsCisgICAvLyBSZXF1ZXN0IHJlamVjdGVkIGR1ZSB0byBpbnZhbGlkIHBhcmFtcywgc3luYyArIGFzeW5jCisgICBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9CQURfUEFSQU0gPSA1LAorICAgLy8gVFNQRUMgcmVxdWVzdCByZWplY3RlZCBzaW5jZSBBUCE9UUFQLCBzeW5jCisgICBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9OT19XTU0gPSA2LAorCisgICAvLyBUU1BFQyBtb2RpZmljYXRpb24vcmUtYXNzb2Mgc3VjY2Vzc2Z1bCwgYXN5bmMKKyAgIEhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX1NVQ0NFU1MgPSA3LAorICAgLy8gVFNQRUMgbW9kaWZpY2F0aW9uIGEgbm8tb3Agc2luY2UgQUNNPTAgYW5kIG5vIGNoYW5nZSBpbiBVQVBTRCwgc3luYyArIGFzeW5jCisgICBIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9TVUNDRVNTX05PX0FDTV9OT19VQVBTRCA9IDgsCisgICAvLyBUU1BFQyBtb2RpZmljYXRpb24gYSBuby1vcCBzaW5jZSBBQ009MCBhbmQgcmVxdWVzdGVkIFUtQVBTRCBhbHJlYWR5IGV4aXN0cywgc3luYyArIGFzeW5jCisgICBIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9TVUNDRVNTX05PX0FDTV9VQVBTRF9FWElTVElORyA9IDksCisgICAvLyBUU1BFQyByZXN1bHQgcGVuZGluZywgc3luYworICAgSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfUEVORElORyA9IDEwLAorICAgLy8gVFNQRUMgbW9kaWZpY2F0aW9uIGZhaWxlZCwgcHJldiBUU1BFQyBpbiBlZmZlY3QsIHN5bmMgKyBhc3luYworICAgSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfRkFJTEVEID0gMTEsCisgICAvLyBUU1BFQyBtb2RpZmljYXRpb24gcmVxdWVzdCByZWplY3RlZCBkdWUgdG8gaW52YWxpZCBwYXJhbXMsIHN5bmMgKyBhc3luYworICAgSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfRkFJTEVEX0JBRF9QQVJBTSA9IDEyLAorCisgICAvLyBUU1BFQyByZWxlYXNlIHN1Y2Nlc3NmdWwsIHN5bmMgYW5kIGFsc28gYXN5bmMKKyAgIEhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9TVUNDRVNTID0gMTMsCisgICAvLyBUU1BFQyByZWxlYXNlIHBlbmRpbmcsIHN5bmMKKyAgIEhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9QRU5ESU5HID0gMTQsCisgICAvLyBUU1BFQyByZWxlYXNlIGZhaWxlZCwgc3luYyArIGFzeW5jCisgICBIRERfV0xBTl9XTU1fU1RBVFVTX1JFTEVBU0VfRkFJTEVEID0gMTUsCisgICAvLyBUU1BFQyByZWxlYXNlIHJlamVjdGVkIGR1ZSB0byBpbnZhbGlkIHBhcmFtcywgc3luYworICAgSEREX1dMQU5fV01NX1NUQVRVU19SRUxFQVNFX0ZBSUxFRF9CQURfUEFSQU0gPSAxNiwKKyAgIC8vIFRTUEVDIG1vZGlmaWVkIGR1ZSB0byB0aGUgbXV4J2luZyBvZiByZXF1ZXN0cyBvbiBBQ3MsIGFzeW5jCisKKyAgIEhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZJRUQgPSAxNywKKyAgIC8vIFRTUEVDIHJldm9rZWQgYnkgQVAsIGFzeW5jCisgICBIRERfV0xBTl9XTU1fU1RBVFVTX0xPU1QgPSAxOCwKKyAgIC8vIHNvbWUgaW50ZXJuYWwgZmFpbHVyZSBsaWtlIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsIGV0Yywgc3luYworICAgSEREX1dMQU5fV01NX1NUQVRVU19JTlRFUk5BTF9GQUlMVVJFID0gMTksIAorCisgICAvLyBVLUFQU0QgZmFpbGVkIGR1cmluZyBzZXR1cCBidXQgT1RBIHNldHVwICh3aGV0aGVyIFRTUEVDIGV4Y2huYWdlIG9yCisgICAvLyByZS1hc3NvYykgd2FzIGRvbmUgc28gYXBwIHNob3VsZCByZWxlYXNlIHRoaXMgUW9TLCBhc3luYworICAgSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9VQVBTRF9TRVRfRkFJTEVEID0gMjAsCisgICAvLyBVLUFQU0QgZmFpbGVkIGR1cmluZyBtb2RpZnksIGJ1dCBPVEEgc2V0dXAgKHdoZXRoZXIgVFNQRUMgZXhjaG5hZ2Ugb3IKKyAgIC8vIHJlLWFzc29jKSB3YXMgZG9uZSBzbyBhcHAgc2hvdWxkIHJlbGVhc2UgdGhpcyBRb1MsIGFzeW5jCisgICBIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9VQVBTRF9TRVRfRkFJTEVEID0gMjEKKworfSBoZGRfd2xhbl93bW1fc3RhdHVzX2U7CisKKy8qKiBUUyBJbmZvIEFjayBQb2xpY3kgKi8KK3R5cGVkZWYgZW51bQoreworICAgSEREX1dMQU5fV01NX1RTX0lORk9fQUNLX1BPTElDWV9OT1JNQUxfQUNLICAgICAgPSAwLAorICAgSEREX1dMQU5fV01NX1RTX0lORk9fQUNLX1BPTElDWV9IVF9JTU1FRElBVEVfQkxPQ0tfQUNLICAgID0gMSwKK30gaGRkX3dsYW5fd21tX3RzX2luZm9fYWNrX3BvbGljeV9lOworCisvKiogdmVuZG9yIGVsZW1lbnQgSUQgKi8KKyNkZWZpbmUgSUVfRUlEX1ZFTkRPUiAgICAgICAgKCAyMjEgKSAvKiAweEREICovCisjZGVmaW5lIElFX0xFTl9TSVpFICAgICAgICAgIDEKKyNkZWZpbmUgSUVfRUlEX1NJWkUgICAgICAgICAgMQorI2RlZmluZSBJRV9WRU5ET1JfT1VJX1NJWkUgICA0CisKKy8qKiBNYXhpbXVtIExlbmd0aCBvZiBXUEEvUlNOIElFICovCisjZGVmaW5lIE1BWF9XUEFfUlNOX0lFX0xFTiA0MAorCisvKiogTWF4aW11bSBOdW1iZXIgb2YgV0VQIEtFWVMgKi8KKyNkZWZpbmUgTUFYX1dFUF9LRVlTIDQKKworLyoqIEV0aGVyIEFkZHJlc3MgTGVuZ3RoICovCisjZGVmaW5lIEVUSEVSX0FERFJfTEVOIDYKKworLyoqIEVuYWJsZSAxMWQgKi8KKyNkZWZpbmUgRU5BQkxFXzExRCAgMQorCisvKiogRGlzYWJsZSAxMWQgKi8KKyNkZWZpbmUgRElTQUJMRV8xMUQgMAorCisvKiAKKyAgIHJlZmVyIHdwYS5oIGluIHdwYSBzdXBwbGljYW50IGNvZGUgZm9yIFJFQVNPTl9NSUNIQUVMX01JQ19GQUlMVVJFCisKKyAgIHN1cHBsaWNhbnQgc2V0cyBSRUFTT05fTUlDSEFFTF9NSUNfRkFJTFVSRSBhcyB0aGUgcmVhc29uIGNvZGUgd2hlbiBpdCBzZW5kcyB0aGUgTUxNRSBkZWF1dGggSU9DVEwgCisgICBmb3IgVEtJUCBjb3VudGVyIG1lYXN1cmVzCisqLworI2RlZmluZSBIRERfUkVBU09OX01JQ0hBRUxfTUlDX0ZBSUxVUkUgMTQKKworLyogCisgICogVGhlc2UgYXJlIGZvciBUTFYgZmllbGRzIGluIFdQUyBJRQorICAqLworI2RlZmluZSBIRERfV1BTX1VVSURfTEVOICAgICAgICAgICAgICAgICAgICAxNiAKKyNkZWZpbmUgSEREX1dQU19FTEVNX1ZFUlNJT04gICAgICAgICAgICAgICAgMHgxMDRhIAorI2RlZmluZSBIRERfV1BTX0VMRU1fUkVRVUVTVF9UWVBFICAgICAgICAgICAweDEwM2EgCisjZGVmaW5lIEhERF9XUFNfRUxFTV9DT05GSUdfTUVUSE9EUyAgICAgICAgIDB4MTAwOCAKKyNkZWZpbmUgSEREX1dQU19FTEVNX1VVSURfRSAgICAgICAgICAgICAgICAgMHgxMDQ3IAorI2RlZmluZSBIRERfV1BTX0VMRU1fUFJJTUFSWV9ERVZJQ0VfVFlQRSAgICAweDEwNTQgCisjZGVmaW5lIEhERF9XUFNfRUxFTV9SRl9CQU5EUyAgICAgICAgICAgICAgIDB4MTAzYyAKKyNkZWZpbmUgSEREX1dQU19FTEVNX0FTU09DSUFUSU9OX1NUQVRFICAgICAgMHgxMDAyIAorI2RlZmluZSBIRERfV1BTX0VMRU1fQ09ORklHVVJBVElPTl9FUlJPUiAgICAweDEwMDkKKyNkZWZpbmUgSEREX1dQU19FTEVNX0RFVklDRV9QQVNTV09SRF9JRCAgICAgMHgxMDEyIAorCisjZGVmaW5lIEhERF9XUEFfRUxFTV9WRU5ET1JfRVhURU5TSU9OICAgICAgIDB4MTA0OQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorI2RlZmluZSBIRERfV1BTX01BTlVGQUNUVVJFUl9MRU4gICAgICAgICAgICA2NAorI2RlZmluZSBIRERfV1BTX01PREVMX05BTUVfTEVOICAgICAgICAgICAgICAzMgorI2RlZmluZSBIRERfV1BTX01PREVMX05VTV9MRU4gICAgICAgICAgICAgICAzMgorI2RlZmluZSBIRERfV1BTX1NFUklBTF9OVU1fTEVOICAgICAgICAgICAgICAzMgorI2RlZmluZSBIRERfV1BTX0RFVklDRV9PVUlfTEVOICAgICAgICAgICAgICAgNAorI2RlZmluZSBIRERfV1BTX0RFVklDRV9OQU1FX0xFTiAgICAgICAgICAgICAzMgorCisjZGVmaW5lIEhERF9XUFNfRUxFTV9XUFNfU1RBVEUgICAgICAgICAgICAgIDB4MTA0NAorI2RlZmluZSBIRERfV1BTX0VMRU1fQVBTRVRVUExPQ0sgICAgICAgICAgICAweDEwNTcKKyNkZWZpbmUgSEREX1dQU19FTEVNX1NFTEVDVEVEUkVHSVNUUkEgICAgICAgMHgxMDQxICAKKyNkZWZpbmUgSEREX1dQU19FTEVNX1JTUF9UWVBFICAgICAgICAgICAgICAgMHgxMDNCCisjZGVmaW5lIEhERF9XUFNfRUxFTV9NQU5VRkFDVFVSRVIgICAgICAgICAgIDB4MTAyMQorI2RlZmluZSBIRERfV1BTX0VMRU1fTU9ERUxfTkFNRSAgICAgICAgICAgICAweDEwMjMKKyNkZWZpbmUgSEREX1dQU19FTEVNX01PREVMX05VTSAgICAgICAgICAgICAgMHgxMDI0CisjZGVmaW5lIEhERF9XUFNfRUxFTV9TRVJJQUxfTlVNICAgICAgICAgICAgIDB4MTA0MiAKKyNkZWZpbmUgSEREX1dQU19FTEVNX0RFVklDRV9OQU1FICAgICAgICAgICAgMHgxMDExCisjZGVmaW5lIEhERF9XUFNfRUxFTV9SRUdJU1RSQV9DT05GX01FVEhPRFMgIDB4MTA1MworI2VuZGlmCisKKworIAorI2RlZmluZSBXUFNfT1VJX1RZUEUgICAiXHgwMFx4NTBceGYyXHgwNCIKKyNkZWZpbmUgV1BTX09VSV9UWVBFX1NJWkUgIDQKKyAKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisjZGVmaW5lIFAyUF9PVUlfVFlQRSAgICJceDUwXHg2Zlx4OWFceDA5IgorI2RlZmluZSBQMlBfT1VJX1RZUEVfU0laRSAgNAorI2VuZGlmCisKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9XRkQKKyNkZWZpbmUgV0ZEX09VSV9UWVBFICAgIlx4NTBceDZmXHg5YVx4MGEiCisjZGVmaW5lIFdGRF9PVUlfVFlQRV9TSVpFICA0CisjZW5kaWYKKwordHlwZWRlZiBlbnVtCit7CisgICAgZVdFWFRfV1BTX09GRiA9IDAsCisgICAgZVdFWFRfV1BTX09OID0gMSwKK31oZGRfd3BzX21vZGVfZTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgRFJJVkVSX1BPV0VSX01PREVfQVVUTyA9IDAsCisgICAgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFID0gMSwKK30gaGRkX3Bvd2VyX21vZGVfZTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgV0VYVF9TQ0FOX1BFTkRJTkdfR0lWRVVQID0gMCwKKyAgICBXRVhUX1NDQU5fUEVORElOR19QSUdHWUJBQ0sgPSAxLAorICAgIFdFWFRfU0NBTl9QRU5ESU5HX0RFTEFZID0gMiwKKyAgICBXRVhUX1NDQU5fUEVORElOR19NQVgKK30gaGRkX3NjYW5fcGVuZGluZ19vcHRpb25fZTsKKworLyogCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJmYWNlIGxldmVsIChncmFudWxhcml0eSkgCisgKiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGluIHN1cHBvcnQgb2Ygd2lyZWxlc3MgZXh0ZW5zaW9ucy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGhkZF93ZXh0X3N0YXRlX3MgCit7CisgICAvKiogVGhlIENTUiAiZGVzaXJlZCIgUHJvZmlsZSAqLworICAgdENzclJvYW1Qcm9maWxlIHJvYW1Qcm9maWxlOyAKKworICAgLyoqIEJTU0lEIHRvIHdoaWNoIGNvbm5lY3QgcmVxdWVzdCBpcyByZWNlaXZlZCAqLworICAgdENzckJzc2lkIHJlcV9ic3NJZDsKKworICAgLyoqIFRoZSBhc3NvY2lhdGlvbiBzdGF0dXMgY29kZSAqLyAKKyAgIHZfVTMyX3Qgc3RhdHVzQ29kZTsKKworICAgLyoqIHdwYSB2ZXJzaW9uIFdQQS9XUEEyL05vbmUqLworICAgdl9TMzFfdCB3cGFWZXJzaW9uOyAKKyAgIAorICAgLyoqV1BBIG9yIFJTTiBJRSovCisgICB1X2ludDhfdCBXUEFSU05JRVtNQVhfV1BBX1JTTl9JRV9MRU5dOyAKKworICAgLyoqZ2VuIElFICovCisgICB0U2lyQWRkaWUgZ2VuSUU7CisKKyAgIC8qKkFkZGl0aW9uYWwgSUUgZm9yIGFzc29jICovCisgICB0U2lyQWRkaWUgYXNzb2NBZGRJRTsgCisgICAKKyAgIC8qKmF1dGgga2V5IG1nbXQgKi8KKyAgIHZfUzMxX3QgYXV0aEtleU1nbXQ7IAorCisgICAgLyoqdm9zIGV2ZW50ICovCisgICB2b3NfZXZlbnRfdCAgdm9zZXZlbnQ7CisKKyAgIHZvc19ldmVudF90ICBzY2FuZXZlbnQ7CisKKyAgIC8qKkNvdW50ZXIgbWVhc3VyZSBzdGF0ZSwgU3RhcnRlZC9TdG9wcGVkKi8KKyAgIHZfQk9PTF90IG1US0lQQ291bnRlck1lYXN1cmVzOyAgCisKKyAgIC8qKkNvbXBsZXRpb24gVmFyaWFibGUqLworICAgc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbl92YXI7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAvKiBDQ1ggc3RhdGUgdmFyaWFibGVzICovCisgICB2X0JPT0xfdCBpc0NDWENvbm5lY3Rpb247CisgICBlQ3NyQXV0aFR5cGUgY29sbGVjdGVkQXV0aFR5cGU7IC8qIENvbGxlY3RlZCBmcm9tIEFMTCBTSU9DU0lXQVVUSCBJb2N0bHMuIFdpbGwgYmUgbmVnb3RpYXRlZEF1dGhUeXBlIC0gaW4gdENzclByb2ZpbGUgKi8KKyNlbmRpZgorfWhkZF93ZXh0X3N0YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGNjcF9mcmVxX2NoYW5fbWFwX3N7CisgICAgLy8gTGlzdCBvZiBmcmVxdWVuY2llcworICAgIHZfVTMyX3QgZnJlcTsKKyAgICB2X1UzMl90IGNoYW47Cit9aGRkX2ZyZXFfY2hhbl9tYXBfdDsKKworI2RlZmluZSB3bGFuX2hkZF9nZXRfd3BzX2llX3B0cihpZSwgaWVfbGVuKSBcCisgICAgd2xhbl9oZGRfZ2V0X3ZlbmRvcl9vdWlfaWVfcHRyKFdQU19PVUlfVFlQRSwgV1BTX09VSV9UWVBFX1NJWkUsIGllLCBpZV9sZW4pCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisjZGVmaW5lIHdsYW5faGRkX2dldF9wMnBfaWVfcHRyKGllLCBpZV9sZW4pIFwKKyAgICB3bGFuX2hkZF9nZXRfdmVuZG9yX291aV9pZV9wdHIoUDJQX09VSV9UWVBFLCBQMlBfT1VJX1RZUEVfU0laRSwgaWUsIGllX2xlbikKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1dGRAorI2RlZmluZSB3bGFuX2hkZF9nZXRfd2ZkX2llX3B0cihpZSwgaWVfbGVuKSBcCisgICAgd2xhbl9oZGRfZ2V0X3ZlbmRvcl9vdWlfaWVfcHRyKFdGRF9PVUlfVFlQRSwgV0ZEX09VSV9UWVBFX1NJWkUsIGllLCBpZV9sZW4pCisjZW5kaWYKKworZXh0ZXJuIGludCBoZGRfVW5yZWdpc3RlcldleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGhkZF9yZWdpc3Rlcl93ZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBoZGRfd2xhbl9nZXRfZnJlcSh2X1UzMl90IGNoYW4sdl9VMzJfdCAqZnJlcSk7CitleHRlcm4gaW50IGhkZF93bGFuX2dldF9ydHNfdGhyZXNob2xkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1KTsKK2V4dGVybiBpbnQgaGRkX3dsYW5fZ2V0X2ZyYWdfdGhyZXNob2xkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1KTsKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCitleHRlcm4gaW50IGhkZF93bGFuX2dldF92ZXJzaW9uKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisjZW5kaWYKKworZXh0ZXJuIGludCBpd19nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGl3X3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpd19zZXRfY3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpd19zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGl3X2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSk7CisKKworZXh0ZXJuIGludCBpd19zZXRfYXBfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaXdfZ2V0X2FwX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGl3X3NldF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSxjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaXdfZ2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmV4dHJhKTsKKworVk9TX1NUQVRVUyBpd19zZXRfcG5vKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEsIGludCBuT2Zmc2V0KTsKKworCitWT1NfU1RBVFVTIGl3X3NldF9yc3NpX2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEsIGludCBuT2Zmc2V0KTsKKworVk9TX1NUQVRVUyBpd19zZXRfcG93ZXJfcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEsIGludCBuT2Zmc2V0KTsKKwordm9pZCBjY21DZmdTZXRDYWxsYmFjayh0SGFsSGFuZGxlIGhhbEhhbmRsZSwgdEFOSV9TMzIgcmVzdWx0KTsKKworZXh0ZXJuIGludCBpd19zZXRfdmFyX2ludHNfZ2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaXdfc2V0X3RocmVlX2ludHNfZ2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK3ZvaWQgaGRkX2NsZWFyUm9hbVByb2ZpbGVJZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOwordm9pZCBoZGRfR2V0Q2xhc3NBX3N0YXRpc3RpY3NDQih2b2lkICpwU3RhdHMsIHZvaWQgKnBDb250ZXh0KTsKKworVk9TX1NUQVRVUyB3bGFuX2hkZF9jaGVja191bGFfZG9uZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKK3ZfVThfdCogd2xhbl9oZGRfZ2V0X3ZlbmRvcl9vdWlfaWVfcHRyKHZfVThfdCAqb3VpLCB2X1U4X3Qgb3VpX3NpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKmllLCBpbnQgaWVfbGVuKTsKKworVk9TX1NUQVRVUyB3bGFuX2hkZF9lbnRlcl9ibXBzKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBpbnQgbW9kZSk7CisKK1ZPU19TVEFUVVMgd2xhbl9oZGRfZXhpdF9sb3dwb3dlcihoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCitWT1NfU1RBVFVTIHdsYW5faGRkX2VudGVyX2xvd3Bvd2VyKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOworCitWT1NfU1RBVFVTIHdsYW5faGRkX2dldF9jbGFzc0FzdGF0cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisKK1ZPU19TVEFUVVMgd2xhbl9oZGRfZ2V0X3Jzc2koaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHZfUzdfdCAqcnNzaV92YWx1ZSk7CisKKyNlbmRpZiAvLyBfX1dFWFRfSVdfSF9fCisKZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy93bGFuX2hkZF93bW0uaCBiL0NPUkUvSEREL2luYy93bGFuX2hkZF93bW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzI3ZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX3dtbS5oCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqICovCisjaWZuZGVmIF9XTEFOX0hERF9XTU1fSAorI2RlZmluZSBfV0xBTl9IRERfV01NX0gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAZmlsZSB3bGFuX2hkZF93bW0uaAorCisgIFRoaXMgbW9kdWxlICh3bGFuX2hkZF93bW0uaCBpbnRlcmZhY2UgKyB3bGFuX2hkZF93bW0uYyBpbXBsZW1lbnRhdGlvbikKKyAgaG91c2VzIGFsbCB0aGUgbG9naWMgZm9yIFdNTSBpbiBIREQuCisKKyAgT24gdGhlIGNvbnRyb2wgcGF0aCwgaXQgaGFzIHRoZSBsb2dpYyB0byBzZXR1cCBRb1MsIG1vZGlmeSBRb1MgYW5kIGRlbGV0ZQorICBRb1MgKFFvUyBoZXJlIHJlZmVycyB0byBhIFRTUEVDKS4gVGhlIHNldHVwIFFvUyBjb21lcyBpbiB0d28gZmxhdm9yczogYW4KKyAgZXhwbGljaXQgYXBwbGljYXRpb24gaW52b2tlZCBhbmQgYW4gaW50ZXJuYWwgSEREIGludm9rZWQuICBUaGUgaW1wbGljaXQgUW9TCisgIGlzIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyBOT1QgY2FsbCB0aGUgY3VzdG9tIFFDVCBXTEFOIE9JRHMgZm9yIFFvUyBidXQKKyAgd2hpY2ggRE8gbWFyayB0aGVpciB0cmFmZmljIGZvciBwcmlvcnRpemF0aW9uLiBJdCBhbHNvIGhhcyBsb2dpYyB0byBzdGFydCwKKyAgdXBkYXRlIGFuZCBzdG9wIHRoZSBVLUFQU0QgdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uLiBJdCBhbHNvIGhhcyBsb2dpYyB0bworICByZWFkIFdNTSByZWxhdGVkIGNvbmZpZyBwYXJhbWV0ZXJzIGZyb20gdGhlIHJlZ2lzdHJ5LgorCisgIE9uIHRoZSBkYXRhIHBhdGgsIGl0IGhhcyB0aGUgbG9naWMgdG8gZmlndXJlIG91dCB0aGUgV01NIEFDIG9mIGFuIGVncmVzcworICBwYWNrZXQgYW5kIHdoZW4gdG8gc2lnbmFsIFRMIHRvIHNlcnZlIGEgcGFydGljdWxhciBBQyBxdWV1ZS4gSXQgYWxzbyBoYXMgdGhlCisgIGxvZ2ljIHRvIHJldHJpZXZlIGEgcGFja2V0IGJhc2VkIG9uIFdNTSBwcmlvcml0eSBpbiByZXNwb25zZSB0byBhIGZldGNoIGZyb20KKyAgVEwuCisKKyAgVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgYXJlIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBpbmZvcm1hdGlvbiBoaWRpbmcuCisKKworICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4LTkgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgICAgICAgICAgICAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfbWFpbi5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dleHQuaD4KKyNpbmNsdWRlIDx3bGFuX3FjdF90bC5oPgorI2luY2x1ZGUgPHNtZV9Rb3NBcGkuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vICNkZWZpbmUgSEREX1dNTV9ERUJVRyAxCisKKyNkZWZpbmUgSEREX1dNTV9DVFhfTUFHSUMgMHg1NzRkNGQ1OCAgICAvLyAiV01NWCIKKworI2RlZmluZSBIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAweEZGRkZGRkZGCisKKyNkZWZpbmUgSEREX1dMQU5fSU5WQUxJRF9TVEFfSUQgMHhGRgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qISBAYnJpZWYgQUMvUXVldWUgSW5kZXggdmFsdWVzIGZvciBMaW51eCBRZGlzYyB0byBvcGVyYXRlIG9uIGRpZmZlcmVudCB0cmFmZmljLgorKi8KK3R5cGVkZWYgZW51bQoreworICAgSEREX0xJTlVYX0FDX1ZPID0gMCwKKyAgIEhERF9MSU5VWF9BQ19WSSA9IDEsCisgICBIRERfTElOVVhfQUNfQkUgPSAyLAorICAgSEREX0xJTlVYX0FDX0JLID0gMworCit9IGhkZF93bW1fbGludXhhY190OworIAorLyohIEBicmllZiB0eXBlcyBvZiBjbGFzc2lmaWNhdGlvbiBzdXBwb3J0ZWQKKyovCit0eXBlZGVmIGVudW0KK3sKKyAgIEhERF9XTU1fQ0xBU1NJRklDQVRJT05fRFNDUCA9IDAsCisgICBIRERfV01NX0NMQVNTSUZJQ0FUSU9OXzgwMl8xUSA9IDEKKworfSBoZGRfd21tX2NsYXNzaWZpY2F0aW9uX3Q7CisKKy8qISBAYnJpZWYgVUFQU0Qgc3RhdGUKKyovCit0eXBlZGVmIGVudW0KK3sKKyAgIEhERF9XTU1fTk9OX1VBUFNEID0gMCwKKyAgIEhERF9XTU1fVUFQU0QgPSAxCisKK30gaGRkX3dtbV91YXBzZF9zdGF0ZV90OworCisKK3R5cGVkZWYgZW51bQoreworICAgLy9TVEEgY2FuIGFzc29jaWF0ZSB3aXRoIGFueSBBUCwgJiBIREQgbG9va3MgYXQgdGhlIFNNRSBub3RpZmljYXRpb24gYWZ0ZXIKKyAgIC8vIGFzc29jaWF0aW9uIHRvIGZpbmQgb3V0IGlmIGFzc29jaWF0ZWQgd2l0aCBRQVAgYW5kIGFjdHMgYWNjb3JkaW5nbHkKKyAgIEhERF9XTU1fVVNFUl9NT0RFX0FVVE8gPSAwLAorICAgLy9TTUUgd2lsbCBhZGQgdGhlIGV4dHJhIGxvZ2ljIHRvIG1ha2Ugc3VyZSBTVEEgYXNzb2NpYXRlcyB3aXRoIGEgUUFQIG9ubHkKKyAgIEhERF9XTU1fVVNFUl9NT0RFX1FCU1NfT05MWSA9IDEsCisgICAvL1NNRSB3aWxsIG5vdCBqb2luIGEgUW9TIEFQLCB1bmxlc3MgdGhlIHBoeSBtb2RlIHNldHRpbmcgc2F5cyAiQXV0byIuIEluCisgICAvLyB0aGF0IGNhc2UsIFNUQSBpcyBmcmVlIHRvIGpvaW4gMTFuIEFQLiBBbHRob3VnaCBmcm9tIEhERCBwb2ludCBvZiB2aWV3LAorICAgLy8gaXQgd2lsbCBub3QgYmUgZG9pbmcgYW55IHBhY2tldCBjbGFzc2lmaWNhdGlvbnMKKyAgIEhERF9XTU1fVVNFUl9NT0RFX05PX1FPUyA9IDIsCisKK30gaGRkX3dtbV91c2VyX21vZGVfdDsKKworCisvKiEgQGJyaWVmIFdNTSBRb3MgaW5zdGFuY2UgY29udHJvbCBibG9jaworKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgIG5vZGU7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZTsKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgcW9zRmxvd0lkOworICAgaGRkX2FkYXB0ZXJfdCogICAgICAgICAgICAgICBwQWRhcHRlcjsKKyAgIFdMQU5UTF9BQ0VudW1UeXBlICAgICAgICAgICAgYWNUeXBlOworICAgaGRkX3dsYW5fd21tX3N0YXR1c19lICAgICAgICBsYXN0U3RhdHVzOworICAgc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICAgICB3bW1BY1NldHVwSW1wbGljaXRRb3M7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIG1hZ2ljOworfSBoZGRfd21tX3Fvc19jb250ZXh0X3Q7CisKKy8qISBAYnJpZWYgV01NIHJlbGF0ZWQgcGVyLUFDIHN0YXRlICYgc3RhdHVzIGluZm8KKyovCit0eXBlZGVmIHN0cnVjdAoreworICAgLy8gZG9lcyB0aGUgQVAgcmVxdWlyZSBhY2Nlc3MgdG8gdGhpcyBBQz8KKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICAgd21tQWNBY2Nlc3NSZXF1aXJlZDsKKworICAgLy8gZG9lcyB0aGUgd29ya2VyIHRocmVhZCBuZWVkIHRvIGFjcXVpcmUgYWNjZXNzIHRvIHRoaXMgQUM/CisgICB2X0JPT0xfdCAgICAgICAgICAgICAgICAgICAgIHdtbUFjQWNjZXNzTmVlZGVkOworCisgICAvLyBpcyBpbXBsaWNpdCBRb1MgbmVnb3RpYXRpb24gY3VycmVudGx5IHRha2luZyBwbGFjZT8KKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICAgd21tQWNBY2Nlc3NQZW5kaW5nOworCisgICAvLyBoYXMgaW1wbGljaXQgUW9TIG5lZ290aWF0aW9uIGFscmVhZHkgZmFpbGVkPworICAgdl9CT09MX3QgICAgICAgICAgICAgICAgICAgICB3bW1BY0FjY2Vzc0ZhaWxlZDsKKworICAgLy8gaGFzIGltcGxpY2l0IFFvUyBuZWdvdGlhdGlvbiBhbHJlYWR5IHN1Y2NlZWRlZD8KKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICAgd21tQWNBY2Nlc3NHcmFudGVkOworCisgICAvLyBpcyBhY2Nlc3MgdG8gdGhpcyBBQyBhbGxvd2VkLCBlaXRoZXIgYmVjYXVzZSB3ZSBhcmUgbm90IGRvaW5nCisgICAvLyBXTU0sIHdlIGFyZSBub3QgZG9pbmcgaW1wbGljaXQgUW9TLCBpbXBsaWN0IFFvUyBoYXMgY29tcGxldGVkLAorICAgLy8gb3IgZXhwbGljaXQgUW9TIGhhcyBjb21wbGV0ZWQ/CisgICB2X0JPT0xfdCAgICAgICAgICAgICAgICAgICAgIHdtbUFjQWNjZXNzQWxsb3dlZDsKKworICAgLy8gaXMgdGhlIHdtbUFjVHNwZWNJbmZvIHZhbGlkPworICAgdl9CT09MX3QgICAgICAgICAgICAgICAgICAgICB3bW1BY1RzcGVjVmFsaWQ7CisKKyAgIC8vIGFyZSB0aGUgd21tQWNVYXBzZCogZmllbGRzIHZhbGlkPworICAgdl9CT09MX3QgICAgICAgICAgICAgICAgICAgICB3bW1BY1VhcHNkSW5mb1ZhbGlkOworCisgICAvLyBjdXJyZW50IChwb3NzaWJseSBhZ2dyZWdhdGUpIFRzcGVjIGZvciB0aGlzIEFDCisgICBzbWVfUW9zV21tVHNwZWNJbmZvICAgICAgICAgIHdtbUFjVHNwZWNJbmZvOworCisgICAvLyBjdXJyZW50IFUtQVBTRCBwYXJhbWV0ZXJzCisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIHdtbUFjVWFwc2RTZXJ2aWNlSW50ZXJ2YWw7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIHdtbUFjVWFwc2RTdXNwZW5zaW9uSW50ZXJ2YWw7CisgICBzbWVfUW9zV21tRGlyVHlwZSAgICAgICAgICAgIHdtbUFjVWFwc2REaXJlY3Rpb247CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAvLyBJbmFjdGl2aXR5IHRpbWUgcGFyYW1ldGVycyBmb3IgVFNQRUMKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgd21tSW5hY3Rpdml0eVRpbWU7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIHdtbVByZXZUcmFmZmljQ250OworICAgdm9zX3RpbWVyX3QgICAgICAgICAgICAgICAgICB3bW1JbmFjdGl2aXR5VGltZXI7CisjZW5kaWYKKworfSBoZGRfd21tX2FjX3N0YXR1c190OworCisvKiEgQGJyaWVmIFdNTSBzdGF0ZSAmIHN0YXR1cyBpbmZvCisqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgd21tQ29udGV4dExpc3Q7CisgICBzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgICAgIHdtbUxvY2s7CisgICBoZGRfd21tX2FjX3N0YXR1c190ICAgICAgICAgIHdtbUFjU3RhdHVzW1dMQU5UTF9NQVhfQUNdOworICAgdl9CT09MX3QgICAgICAgICAgICAgICAgICAgICB3bW1RYXA7CisgICB2X0JPT0xfdCAgICAgICAgICAgICAgICAgICAgIHdtbVFvc0Nvbm5lY3Rpb247Cit9IGhkZF93bW1fc3RhdHVzX3Q7CisKK2V4dGVybiBjb25zdCB2X1U4X3QgaGRkX1FkaXNjQWNUb1RsQUNbXTsKK2V4dGVybiBjb25zdCB2X1U4X3QgaGRkV21tVXBUb0FjTWFwW107IAorZXh0ZXJuIGNvbnN0IHZfVThfdCBoZGRMaW51eFVwVG9BY01hcFtdOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfd21tX2luaXQoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgaW5pdGlhbGl6ZSB0aGUgV01NIGNvbmZpZ3VhdGlvbgorICBhbmQgc3RhdHVzIHRvIGFuIGluaXRpYWwgc3RhdGUuICBUaGUgY29uZmlndXJhdGlvbiBjYW4gbGF0ZXIgYmUgb3ZlcndyaXR0ZW4KKyAgdmlhIGFwcGxpY2F0aW9uIEFQSXMKKworICBAcGFyYW0gcEhkZEN0eCA6IFtpbl0gIHBvaW50ZXIgdG8gSEREIGNvbnRleHQKKworICBAcmV0dXJuICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1MgaWYgc3VjY3NzZnVsCisgICAgICAgICAgICAgICAgICA6IG90aGVyIHZhbHVlcyBpZiBmYWlsdXJlCisKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3dtbV9pbml0ICggaGRkX2NvbnRleHRfdCogcEhkZEN0eCApOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfd21tX2FkYXB0ZXJfaW5pdCgpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBpbml0aWFsaXplIHRoZSBXTU0gY29uZmlndWF0aW9uCisgIGFuZCBzdGF0dXMgdG8gYW4gaW5pdGlhbCBzdGF0ZS4gIFRoZSBjb25maWd1cmF0aW9uIGNhbiBsYXRlciBiZSBvdmVyd3JpdHRlbgorICB2aWEgYXBwbGljYXRpb24gQVBJcworCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gIHBvaW50ZXIgdG8gQWRhcHRlciBjb250ZXh0CisKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nzc2Z1bAorICAgICAgICAgICAgICAgICAgOiBvdGhlciB2YWx1ZXMgaWYgZmFpbHVyZQorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIGhkZF93bW1fYWRhcHRlcl9pbml0KCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfd21tX2FkYXB0ZXJfY2xvc2UoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgcGVyZm9ybSBhbnkgbmVjZXNzYXJ5IHdvcmsgdG8KKyAgdG8gY2xlYW4gdXAgdGhlIFdNTSBmdW5jdGlvbmFsaXR5IHByaW9yIHRvIHRoZSBrZXJuZWwgbW9kdWxlIHVubG9hZAorCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nzc2Z1bAorICAgICAgICAgICAgICAgICAgOiBvdGhlciB2YWx1ZXMgaWYgZmFpbHVyZQorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIGhkZF93bW1fYWRhcHRlcl9jbG9zZSAoIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fc2VsZWN0X3F1ZXVlKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGNsYXNzaWZ5IGFuIE9TIHBhY2tldAorICBpbnRvIGxpbnV4IFFkaXNjIGV4cGVjdGF0aW9uCisKKyAgQHBhcmFtIGRldiAgICAgIDogW2luXSAgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICBAcGFyYW0gc2tiICAgICAgOiBbaW5dICBwb2ludGVyIHRvIE9TIHBhY2tldCAoc2tfYnVmZikKKworICBAcmV0dXJuICAgICAgICAgOiBxdWV1ZV9pbmRleC9saW51eCBBQyB2YWx1ZS4KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfVTE2X3QgaGRkX3dtbV9zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfaG9zdGFwZF9zZWxlY3RfcXVldWUoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgY2xhc3NpZnkgdGhlIHBhY2tldAorICAgICAgICAgYWNjb3JkaW5nIHRvIGxpbnV4IHFkaXNjIGV4cGVjdGF0aW9uLgorCisKKyAgQHBhcmFtIGRldiAgICAgIDogW2luXSAgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICBAcGFyYW0gc2tiICAgICAgOiBbaW5dICBwb2ludGVyIHRvIG9zIHBhY2tldAorCisgIEByZXR1cm4gICAgICAgICA6IFFkaXNjIHF1ZXVlIGluZGV4CisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZfVTE2X3QgaGRkX2hvc3RhcGRfc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fY2xhc3NpZnlfcGt0KCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGNsYXNzaWZ5IGFuIE9TIHBhY2tldAorICBpbnRvIGEgV01NIEFDIGJhc2VkIG9uIGVpdGhlciA4MDIuMVEgb3IgRFNDUAorCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBza2IgICAgICA6IFtpbl0gIHBvaW50ZXIgdG8gT1MgcGFja2V0IChza19idWZmKQorICBAcGFyYW0gcEFjVHlwZSAgOiBbb3V0XSBwb2ludGVyIHRvIFdNTSBBQyB0eXBlIG9mIE9TIHBhY2tldAorCisgIEByZXR1cm4gICAgICAgICA6IE5vbmUKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfVk9JRF90IGhkZF93bW1fY2xhc3NpZnlfcGt0ICggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ0VudW1UeXBlKiBwQWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zV21tVXBUeXBlKiBwVXNlclByaSk7CisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3dtbV9hY3F1aXJlX2FjY2VzcygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBhdHRlbXB0IHRvIGFjcXVpcmUKKyAgYWRtaXR0YW5jZSBmb3IgYSBXTU0gQUMKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICBAcGFyYW0gYWNUeXBlICAgOiBbaW5dICBXTU0gQUMgdHlwZSBvZiBPUyBwYWNrZXQKKyAgQHBhcmFtIHBHcmFudGVkIDogW291dF0gcG9pbnRlciB0byBib29sZWFuIGZsYWcgd2hlbiBpbmRpY2F0ZXMgaWYgYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGdyYW50ZWQgb3Igbm90CisKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nzc2Z1bAorICAgICAgICAgICAgICAgICAgOiBvdGhlciB2YWx1ZXMgaWYgZmFpbHVyZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBoZGRfd21tX2FjcXVpcmVfYWNjZXNzKCBoZGRfYWRhcHRlcl90KiBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDRW51bVR5cGUgYWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCAqIHBHcmFudGVkICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fYXNzb2MoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSBob3VzZWtlZXBpbmcKKyAgcmVxdWlyZWQgYnkgV01NIHdoZW4gYXNzb2NpYXRpb24gdGFrZXMgcGxhY2UKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICBAcGFyYW0gcFJvYW1JbmZvOiBbaW5dICBwb2ludGVyIHRvIHJvYW0gaW5mb3JtYXRpb24KKyAgQHBhcmFtIGVCc3NUeXBlIDogW2luXSAgdHlwZSBvZiBCU1MKKworICBAcmV0dXJuICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1MgaWYgc3VjY3NzZnVsCisgICAgICAgICAgICAgICAgICA6IG90aGVyIHZhbHVlcyBpZiBmYWlsdXJlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIGhkZF93bW1fYXNzb2MoIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZUNzclJvYW1Cc3NUeXBlIGVCc3NUeXBlICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fY29ubmVjdCgpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBoYW5kbGUgdGhlIGhvdXNla2VlcGluZworICByZXF1aXJlZCBieSBXTU0gd2hlbiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICBAcGFyYW0gcFJvYW1JbmZvOiBbaW5dICBwb2ludGVyIHRvIHJvYW0gaW5mb3JtYXRpb24KKyAgQHBhcmFtIGVCc3NUeXBlIDogW2luXSAgdHlwZSBvZiBCU1MKKworICBAcmV0dXJuICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1MgaWYgc3VjY3NzZnVsCisgICAgICAgICAgICAgICAgICA6IG90aGVyIHZhbHVlcyBpZiBmYWlsdXJlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIGhkZF93bW1fY29ubmVjdCggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNzclJvYW1Cc3NUeXBlIGVCc3NUeXBlICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fZ2V0X3VhcHNkX21hc2soKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgY2FsY3VsYXRlIHRoZQorICBpbml0aWFsIHZhbHVlIG9mIHRoZSBVQVBTRCBtYXNrIGJhc2VkIHVwb24gdGhlIGRldmljZSBjb25maWd1cmF0aW9uCisKKyAgQHBhcmFtIHBBZGFwdGVyICA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBwVWFwc2RNYXNrOiBbaW5dICBwb2ludGVyIHRvIHdoZXJlIHRoZSBVQVBTRCBNYXNrIGlzIHRvIGJlIHN0b3JlZAorCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjc3NmdWwKKyAgICAgICAgICAgICAgICAgIDogb3RoZXIgdmFsdWVzIGlmIGZhaWx1cmUKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3dtbV9nZXRfdWFwc2RfbWFzayggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBVYXBzZE1hc2sgKTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3dtbV9pc19hY3RpdmUoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIGlmIFdNTSBpcworICBhY3RpdmUgb24gdGhlIGN1cnJlbnQgY29ubmVjdGlvbgorCisgIEBwYXJhbSBwQWRhcHRlciAgOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorCisgIEByZXR1cm4gICAgICAgICA6IFZPU19UUlVFIGlmIFdNTSBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICA6IFZPU19GQUxTRSBpZiBXTU0gaXMgbm90IGVuYWJsZWQKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfQk9PTF90IGhkZF93bW1faXNfYWN0aXZlKCBoZGRfYWRhcHRlcl90KiBwQWRhcHRlciApOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfd21tX2FkZHRzKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGFkZCBhIHRyYWZmaWMgc3BlYyBhdCB0aGUKKyAgcmVxdWVzdCBvZiBhbiBhcHBsaWNhdGlvbgorCisgIEBwYXJhbSBwQWRhcHRlciAgOiBbaW5dICBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICBAcGFyYW0gaGFuZGxlICAgIDogW2luXSAgaGFuZGxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgVFMKKyAgQHBhcmFtIHBUc3BlYyAgICA6IFtpbl0gIHBvaW50ZXIgdG8gdGhlIHRyYWZmaWMgc3BlYworCisgIEByZXR1cm4gICAgICAgICAgOiBIRERfV0xBTl9XTU1fU1RBVFVTXyogCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitoZGRfd2xhbl93bW1fc3RhdHVzX2UgaGRkX3dtbV9hZGR0cyggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyogcFRzcGVjICk7CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fZGVsdHMoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZGVsZXRlIGEgdHJhZmZpYyBzcGVjIGF0IHRoZQorICByZXF1ZXN0IG9mIGFuIGFwcGxpY2F0aW9uCisKKyAgQHBhcmFtIHBBZGFwdGVyICA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBoYW5kbGUgICAgOiBbaW5dICBoYW5kbGUgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBUUworCisgIEByZXR1cm4gICAgICAgICAgOiBIRERfV0xBTl9XTU1fU1RBVFVTXyogCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitoZGRfd2xhbl93bW1fc3RhdHVzX2UgaGRkX3dtbV9kZWx0cyggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBoYW5kbGUgKTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3dtbV9jaGVja3RzKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIHJldHVybiB0aGUgc3RhdHVzIG9mIGEgdHJhZmZpYworICBzcGVjIGF0IHRoZSByZXF1ZXN0IG9mIGFuIGFwcGxpY2F0aW9uCisKKyAgQHBhcmFtIHBBZGFwdGVyICA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBoYW5kbGUgICAgOiBbaW5dICBoYW5kbGUgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBUUworCisgIEByZXR1cm4gICAgICAgICAgOiBIRERfV0xBTl9XTU1fU1RBVFVTXyogCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitoZGRfd2xhbl93bW1fc3RhdHVzX2UgaGRkX3dtbV9jaGVja3RzKCBoZGRfYWRhcHRlcl90KiBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgaGFuZGxlICk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9XTEFOX0hERF9XTU1fSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvaW5jL3dsYW5faGRkX3dvd2wuaCBiL0NPUkUvSEREL2luYy93bGFuX2hkZF93b3dsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0ZWQxNQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL2luYy93bGFuX2hkZF93b3dsLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9XTEFOX0hERF9XT1dMX0gKKyNkZWZpbmUgX1dMQU5fSEREX1dPV0xfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGZpbGUgd2xhbl9oZGRfd293bC5oCisKKyAgVGhpcyBtb2R1bGUgaG91c2VzIGFsbCB0aGUgbG9naWMgZm9yIFdPV0wgaW4gSERELiAKKyAgCisgIEl0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgQVBJcworCisgIC0gQWJpbGl0eSB0byBlbmFibGUvZGlzYWJsZSBmb2xsb3dpbmcgV29XTCBtb2RlcworICAgIDEpIE1hZ2ljIHBhY2tldCAoTVApIG1vZGUKKyAgICAyKSBQYXR0ZXJuIEJ5dGUgTWF0Y2hpbmcgKFBCTSkgbW9kZQorICAtIEFiaWxpdHkgdG8gYWRkL3JlbW92ZSBwYXR0ZXJucyBmb3IgUEJNCisKKyAgQSBNYWdpYyBQYWNrZXQgaXMgYSBwYWNrZXQgdGhhdCBjb250YWlucyA2IDB4RkZzIGZvbGxvd2VkIGJ5IDE2IGNvbnRpZ3VvdXMgCisgIGNvcGllcyBvZiB0aGUgcmVjZWl2aW5nIE5JQydzIEV0aGVybmV0IGFkZHJlc3MuIFRoZXJlIGlzIG5vIEFQSSB0byBjb25maWd1cmUKKyAgTWFnaWMgUGFja2V0IFBhdHRlcm4uCisKKyAgV2FrZXVwIHBhdHRlcm4gKHVzZWQgZm9yIFBCTSkgaXMgZGVmaW5lZCBhcyBmb2xsb3dpbmc6CisgIHR5cGVkZWYgc3RydWN0IAorICB7CisgICAgVTggIFBhdHRlcm5TaXplOyAgICAgICAgICAgICAgICAgIC8vIE5vbi1aZXJvIHBhdHRlcm4gc2l6ZQorICAgIFU4ICBQYXR0ZXJuTWFza1NpemU7ICAgICAgICAgICAgICAvLyBOb24temVybyBwYXR0ZXJuIG1hc2sgc2l6ZQorICAgIFU4ICBQYXR0ZXJuTWFza1tQYXR0ZXJuTWFza1NpemVdOyAvLyBQYXR0ZXJuIG1hc2sKKyAgICBVOCAgUGF0dGVybltQYXR0ZXJuU2l6ZV07ICAgICAgICAgLy8gUGF0dGVybgorICB9IGhkZF93b3dsX3B0cm5fdDsKKworICBQYXR0ZXJuU2l6ZSBhbmQgUGF0dGVybk1hc2tTaXplIGluZGljYXRlIHNpemUgb2YgdGhlIHZhcmlhYmxlIGxlbmd0aCBQYXR0ZXJuCisgIGFuZCBQYXR0ZXJuTWFzay4gUGF0dGVybk1hc2sgaW5kaWNhdGVzIHdoaWNoIGJ5dGVzIG9mIGFuIGluY29taW5nIHBhY2tldCAKKyAgc2hvdWxkIGJlIGNvbXBhcmVkIHdpdGggY29ycmVzcG9uZGluZyBieXRlcyBpbiB0aGUgcGF0dGVybi4KKworICBNYXhpbXVtIGFsbG93ZWQgcGF0dGVybiBzaXplIGlzIDEyOCBieXRlcy4gTWF4aW11bSBhbGxvd2VkIFBhdHRlcm5NYXNrU2l6ZSAKKyAgaXMgMTYgYnl0ZXMuIAorCisgIE1heGltdW0gbnVtYmVyIG9mIHBhdHRlcm5zIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgaXMgOAorCisgIEhERCB3aWxsIGFkZCBmb2xsb3dpbmcgMiBjb21tb25seSB1c2VkIHBhdHRlcm5zIGZvciBQQk0gYnkgZGVmYXVsdDoKKyAgICAxKSBBUlAgQnJvYWRjYXN0IFBhdHRlcm4KKyAgICAyKSBVbmljYXN0IFBhdHRlcm4KKyAgCisgIEhvd2V2ZXIgbm90ZSB0aGF0IFdvV0wgd2lsbCBub3QgYmUgZW5hYmxlZCBieSBkZWZhdWx0IGJ5IEhERC4gV29XTCBuZWVkcyB0byAKKyAgZW5hYmxlZCBleHBsY2l0bHkgYnkgZXhlcmNpc2luZyB0aGUgaXdwcml2IGNvbW1hbmQuCisKKyAgSEREIHdpbGwgZXhwb3NlIGFuIEFQSSB0aGF0IGFjY2VwdHMgcGF0dGVybnMgYXMgSGV4IHN0cmluZyBpbiB0aGUgZm9sbG93aW5nCisgIGZvcm1hdDogIlBhdHRlcm5TaXplOlBhdHRlcm5NYXNrU2l6ZTpQYXR0ZXJuTWFzazpQYXR0ZXJuIi4gTXV0bGlwbGUgcGF0dGVybnMKKyAgY2FuIGJlIHNwZWNpZmllZCBieSBkZWxlaW1pdGluZyBlYWNoIHBhdHRlcm4gd2l0aCB0aGUgJzsnIHRva2VuLgorICAiUGF0dGVyblNpemUxOlBhdHRlcm5NYXNrU2l6ZTE6UGF0dGVybk1hc2sxOlBhdHRlcm4xO1BhdHRlcm5TaXplMjouLi4uIgorCisgIFBhdHRlcm5zIGNhbiBiZSBjb25maWd1cmVkIGR5bmFtaWNhbGx5IHZpYSBpd3ByaXYgY21kIG9yIHN0YXRpY2FsbHkgdmlhCisgIHFjb21fY2ZnLmluaSBmaWxlCisKKyAgUEJNICh3aGVuIGVuYWJsZWQpIGNhbiBwZXJmb3JtIGZpbHRlcmluZyBvbiB1bmljYXN0IGRhdGEgb3IgYnJvYWRjYXN0IGRhdGEgb3IKKyAgYm90aC4gVGhlc2UgY29uZmlndXJhdGlvbnMgYXJlIHBhcnQgb2YgZmFjdG9yeSBkZWZhdWx0cyAoY2ZnLmRhdCkgYW5kCisgIHRoZSBkZWFmdWx0IGJlaGF2aW9yIGlzIHRvIHBlcmZvcm0gZmlsdGVyaW5nIG9uIGJvdGggdW5pY2FzdCBhbmQgZGF0YSBmcmFtZXMuCisKKyAgTVAgZmlsdGVyaW5nICh3aGVuIGVuYWJsZWQpIGlzIHBlcmZvcm1lZCBBTFdBWVMgb24gYm90aCB1bmljYXN0IGFuZCBicm9hZGNhc3QKKyAgZGF0YSBmcmFtZXMuCisKKyAgTWFuZ2VtZW50IGZyYW1lcyBhcmUgbm90IHN1YmplY3RlZCB0byBXb1dMIGZpbHRlcmluZyBhbmQgYXJlIGRpc2NhcmRlZCB3aGVuCisgIFdvV0wgaXMgZW5hYmxlZC4KKworICBXaGVuZXZlciBhIHBhdGVybiBtYXRjaCBzdWNjZWVkcywgUlggcGF0aCBpcyByZXN0b3JlZCBhbmQgcGFja2V0cyAoYm90aCAKKyAgbWFuYWdlbWVudCBhbmQgZGF0YSkgd2lsbCBiZSBwdXNoZWQgdG8gdGhlIGhvc3QgZnJvbSB0aGF0IHBvaW50IG9ud2FyZHMuIAorICBUaGVyZWZvcmUsIGV4aXQgZnJvbSBXb1dMIGlzIGltcGxpY2l0IGFuZCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgCisgIGZpcnN0IHBhY2tldCBtYXRjaCBzdWNjZWVkcy4KKworICBXb1dMIHdvcmtzIG9uIHRvcCBvZiBCTVBTLiBTbyB3aGVuIFdvV0wgaXMgcmVxdWVzdGVkLCBTTUUgd2lsbCBhdHRlbXB0IHRvIHB1dAorICB0aGUgZGV2aWNlIGluIEJNUFMgbW9kZSAoaWYgbm90IGFscmVhZHkgaW4gQk1QUykuIElmIGF0dGVtcHQgdG8gQk1QUyBmYWlscywgCisgIHJlcXVlc3QgZm9yIFdvV0wgd2lsbCBiZSByZWplY3RlZC4KKworICBDb3B5cmlnaHQgKGMpIDIwMDkgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfYWRkX3dvd2xfcHRybigpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBhZGQgdGhlIFdvV0wgcGF0dGVybiB0byBiZQorICB1c2VkIHdoZW4gUEJNIGZpbHRlcmluZyBpcyBlbmFibGVkCisKKyAgQHBhcmFtIHB0cm4gOiBbaW5dICBwb2ludGVyIHRvIHRoZSBwYXR0ZXJuIHN0cmluZyB0byBiZSBhZGRlZAorCisgIEByZXR1cm4gICAgIDogRkFMU0UgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZAorICAgICAgICAgICAgICA6IFRSVUUgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X0JPT0xfdCBoZGRfYWRkX3dvd2xfcHRybiAoY29uc3QgY2hhciAqIHB0cm4pOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfZGVsX3dvd2xfcHRybigpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCByZW1vdmUgYSBXb1dMIHBhdHRlcm4KKworICBAcGFyYW0gcHRybiA6IFtpbl0gIHBvaW50ZXIgdG8gdGhlIHBhdHRlcm4gc3RyaW5nIHRvIGJlIHJlbW92ZWQKKworICBAcmV0dXJuICAgICA6IEZBTFNFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQKKyAgICAgICAgICAgICAgOiBUUlVFIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9CT09MX3QgaGRkX2RlbF93b3dsX3B0cm4gKGNvbnN0IGNoYXIgKiBwdHJuKTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2VudGVyX3dvd2woKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZW5hYmxlIFdvV0wuIEF0bGVhc3Qgb25lCisgIG9mIE1QIGFuZCBQQk0gbXVzdCBiZSBlbmFibGVkCisKKyAgQHBhcmFtIGVuYWJsZV9tcCAgOiBbaW5dIFdoZXRoZXIgdG8gZW5hYmxlIG1hZ2ljIHBhY2tldCBXb1dMIG1vZGUKKyAgQHBhcmFtIGVuYWJsZV9wYm0gOiBbaW5dIFdoZXRoZXIgdG8gZW5hYmxlIHBhdHRlcm4gYnl0ZSBtYXRjaGluZyBXb1dMIG1vZGUKKworICBAcmV0dXJuICAgICAgICAgICA6IEZBTFNFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQKKyAgICAgICAgICAgICAgICAgICAgOiBUUlVFIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9CT09MX3QgaGRkX2VudGVyX3dvd2wgKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB2X0JPT0xfdCBlbmFibGVfbXAsIHZfQk9PTF90IGVuYWJsZV9wYm0pOworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfZXhpdF93b3dsKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGRpc2FibGUgV29XTAorCisgIEByZXR1cm4gICAgICAgICAgIDogRkFMU0UgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZAorICAgICAgICAgICAgICAgICAgICA6IFRSVUUgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X0JPT0xfdCBoZGRfZXhpdF93b3dsICh2b2lkKTsKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2luaXRfd293bCgpIC0gSW5pdCBmdW5jdGlvbiB3aGljaCB3aWxsIGluaXRpYWxpemUgdGhlIFdvV0wgbW9kdWxlCisgIGFuZCBwZXJmb3JtIGFueSByZXF1aXJlZCBpbnRpYWwgY29uZmlndXJhdGlvbiAKKworICBAcmV0dXJuICAgICAgICAgICA6IEZBTFNFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQKKyAgICAgICAgICAgICAgICAgICAgOiBUUlVFIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9CT09MX3QgaGRkX2luaXRfd293bCAodm9pZCogcEFkYXB0ZXIpOworCisjZW5kaWYgLyogI2lmbmRlZiBfV0xBTl9IRERfV09XTF9IICovCmRpZmYgLS1naXQgYS9DT1JFL0hERC9pbmMvd2xhbl9xY3RfZHJpdmVyLmggYi9DT1JFL0hERC9pbmMvd2xhbl9xY3RfZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjYTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL2luYy93bGFuX3FjdF9kcml2ZXIuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1dMQU5fUUNUX0RSSVZFUl9IICkKKyNkZWZpbmUgX19XTEFOX1FDVF9EUklWRVJfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB3bGFuX3FjdF9kcml2ZXIuaAorICAKKyAgXGJyaWVmIEhlYWRlciBmaWxlIGZvciBXaXJlbGVzcyBMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIEtlcm5lbCBNb2R1bGUKKyAgICAgICAgICAgICAgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorCisgICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRSAKKyAgIAorICAgCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLiAKKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4gCisgICAKKyAgIAorICAkSGVhZGVyOiQgJERhdGVUaW1lOiAkICRBdXRob3I6ICQgCisgICAKKyAgIAorICB3aGVuICAgICAgICB3aG8gICAgd2hhdCwgd2hlcmUsIHdoeSAKKyAgLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDA0LzA1LzA5ICAgIGthbmFuZCAgICAgQ3JlYXRlZCBtb2R1bGUuIAorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiAgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiAgIFR5cGUgZGVjbGFyYXRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVudGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2VuZGlmIC8vIGlmICFkZWZpbmVkIF9fV0xBTl9RQ1RfRFJJVkVSX0gKZGlmZiAtLWdpdCBhL0NPUkUvSEREL3NyYy9iYXBfaGRkX21haW4uYyBiL0NPUkUvSEREL3NyYy9iYXBfaGRkX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGE0MmFhCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvc3JjL2JhcF9oZGRfbWFpbi5jCkBAIC0wLDAgKzEsNDU0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFxmaWxlICBiYXBfaGRkX21haW4uYworCisgIFxicmllZiA4MDIuMTEgQlQtQU1QIFBBTCBIb3N0IERldmljZSBEcml2ZXIgaW1wbGVtZW50YXRpb24KKworICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjogL3Byai9xY3QvYXN3L2VuZ2J1aWxkcy9zY2wvdXNlcnMwMi9qem11ZGEvZ2ItYmx1ZXovdmVuZG9yL3Fjb20vcHJvcHJpZXRhcnkvd2xhbi9saWJyYS9DT1JFL0hERC9zcmMvYmFwX2hkZF9tYWluLmMsdiAxLjYzIDIwMTEvMDQvMDEgMTU6MjQ6MjAganptdWRhIEV4cCBqem11ZGEgJCAgICREYXRlVGltZTogJCAkQXV0aG9yOiBqem11ZGEgJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkKKyAgLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDEyLzEvMDkgICAgIEpabXVkYSAgICBDcmVhdGVkIG1vZHVsZS4KKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisvLyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorLy8jaW5jbHVkZSA8d2xhbl9xY3RfZHJpdmVyLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaW5jbHVkZXMuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9kcF91dGlscy5oPgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8YmFwX2hkZF9tYWluLmg+CisjaW5jbHVkZSA8dm9zX2FwaS5oPgorI2luY2x1ZGUgPGJhcEFwaS5oPgorI2luY2x1ZGUgPGJ0YW1wSENJLmg+CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNpbmNsdWRlIDx3bGFuX2hkZF9taXNjLmg+CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuZXh0IHR3byBpcyB0aGF0IHRoZSBmaXJzdCBpcyB0aGUgbWF4CisvLyBudW1iZXIgd2Ugc3VwcG9ydCBpbiBvdXIgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aGlsZSB0aGUgc2Vjb25kIGlzCisvLyB0aGUgbWF4IGFsbG93ZWQgYnkgdGhlIHNwZWMKKyNkZWZpbmUgQlNMX01BWF9QSFlfTElOS1MgICAgICAgICAgICggQlNMX01BWF9DTElFTlRTICogQlNMX01BWF9QSFlfTElOS19QRVJfQ0xJRU5UICkKKyNkZWZpbmUgQlNMX01BWF9BTExPV0VEX1BIWV9MSU5LUyAgIDI1NQorCisvLyB0aGVzZSBsaWtlbHkgd2lsbCBuZWVkIHR1bmluZyBiYXNlZCBvbiBleHBlcmltZW50cworI2RlZmluZSBCU0xfTUFYX1JYX1BLVF9ERVNDUklQVE9SICAgMTAwCisjZGVmaW5lIEJTTF9NQVhfVFhfUEtUX0RFU0NSSVBUT1IgICAxMDAKKworLy8gdGhlc2UgY2FwcyBhcmUgaW4gcGxhY2UgdG8gbm90IGhhdmUgcnVuLWF3YXkgcXVldWVzLCBhZ2FpbiBuZWVkcyBlbXBpcmljYWwgdHVuaW5nCisjZGVmaW5lIEJTTF9NQVhfU0laRV9UWF9BQ0xfUVVFVUUgICA1MAorI2RlZmluZSBCU0xfTUFYX1NJWkVfUlhfQUNMX1FVRVVFICAgNTAKKyNkZWZpbmUgQlNMX01BWF9TSVpFX1JYX0VWVF9RVUVVRSAgIDUwCisKKyNpZiAwCitXaGF0IGFyZSB0aGUgbWF4aW11bSBzaXplcyBvZiBhIGNvbW1hbmQgcGFja2V0LCBhbiBldmVudCBwYWNrZXQgYW5kIGFuIEFDTAorZGF0YSBwYWNrZXQ/CisKK1tKaW1aXTogU2l6ZXM6CisxLiBDbWQgTWF4aW11bSBzaXplIGlzIHNsaWdodGx5IGdyZWF0ZXIgdGhhbiA2NzIgYnR5ZXMuICBCdXQgSSBhbSBwcmV0dHkgc3VyZQorcmlnaHQgbm93IHRoYXQgSSB3aWxsIG5ldmVyIGhhdmUgbW9yZSB0aGFuIDI0MCBieXRlcyB0byBzZW5kIGRvd24gYXQgYSB0aW1lLiAgQW5kCit0aGF0IGlzIGdvb2QuIEJlY2F1c2Ugc29tZSByYXRoZXIgdW5wbGVhc2FudCB0aGluZ3MgaGFwcGVuIGF0IHRoZSBIQ0kgaW50ZXJmYWNlCitpZiBJIGV4Y2VlZCB0aGF0LiAgKCBUaGluayA4LWJpdCBDUFVzLiAgQW5kIHRoZSBsaW1pdGF0aW9ucyBvZiBhbiA4LWJpdCBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgZmllbGQuICkKKworMi4gRXZlbnQgLSAgRGl0dG8uCisKKzMuIERhdGEgMTQ5MiBieXRlcworI2VuZGlmCisKKy8vIGppbXoKKy8vIFRMViByZWxhdGVkIGRlZmluZXMKKworI2RlZmluZSBVU0VfRklOQUxfRlJBTUVTQworLy8jdW5kZWYgVVNFX0ZJTkFMX0ZSQU1FU0MKKy8vIGppbXoKKy8vIFRMViByZWxhdGVkIGRlZmluZXMKKworI2lmbmRlZiBVU0VfRklOQUxfRlJBTUVTQyAgICAgICAgLy9VU0VfRklOQUxfRlJBTUVTQworLy8gQU1QIEFTU09DIFRMViByZWxhdGVkIGRlZmluZXMKKyNkZWZpbmUgQU1QX0FTU09DX1RMVl9UWVBFX1NJWkUgMgorI2RlZmluZSBBTVBfQVNTT0NfVExWX0xFTl9TSVpFIDIKKyNkZWZpbmUgQU1QX0FTU09DX1RMVl9UWVBFX0FORF9MRU5fU0laRSAgKEFNUF9BU1NPQ19UTFZfVFlQRV9TSVpFICsgQU1QX0FTU09DX1RMVl9MRU5fU0laRSkKKworLy8gRkxPVyBTUEVDIFRMViByZWxhdGVkIGRlZmluZXMKKyNkZWZpbmUgRkxPV1NQRUNfVFlQRV9TSVpFIDIKKyNkZWZpbmUgRkxPV1NQRUNfTEVOX1NJWkUgMgorI2RlZmluZSBGTE9XU1BFQ19UWVBFX0FORF9MRU5fU0laRSAgKEZMT1dTUEVDX1RZUEVfU0laRSArIEZMT1dTUEVDX0xFTl9TSVpFKQorCisvLyBDTUQgVExWIHJlbGF0ZWQgZGVmaW5lcworI2RlZmluZSBDTURfVExWX1RZUEVfU0laRSAyCisjZGVmaW5lIENNRF9UTFZfTEVOX1NJWkUgMgorI2RlZmluZSBDTURfVExWX1RZUEVfQU5EX0xFTl9TSVpFICAoQ01EX1RMVl9UWVBFX1NJWkUgKyBDTURfVExWX0xFTl9TSVpFKQorCisvLyBFdmVudCBUTFYgcmVsYXRlZCBkZWZpbmVzCisjZGVmaW5lIEVWRU5UX1RMVl9UWVBFX1NJWkUgMgorI2RlZmluZSBFVkVOVF9UTFZfTEVOX1NJWkUgMgorI2RlZmluZSBFVkVOVF9UTFZfVFlQRV9BTkRfTEVOX1NJWkUgIChFVkVOVF9UTFZfVFlQRV9TSVpFICsgRVZFTlRfVExWX0xFTl9TSVpFKQorCisvLyBEYXRhIGhlYWRlciBzaXplIHJlbGF0ZWQgZGVmaW5lcworI2RlZmluZSBEQVRBX0hFQURFUl9TSVpFIDQKKworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9VU0VfRklOQUxfRlJBTUVTQworCisvLyBBTVAgQVNTT0MgVExWIHJlbGF0ZWQgZGVmaW5lcworI2RlZmluZSBBTVBfQVNTT0NfVExWX1RZUEVfU0laRSAxCisjZGVmaW5lIEFNUF9BU1NPQ19UTFZfTEVOX1NJWkUgMgorI2RlZmluZSBBTVBfQVNTT0NfVExWX1RZUEVfQU5EX0xFTl9TSVpFICAoQU1QX0FTU09DX1RMVl9UWVBFX1NJWkUgKyBBTVBfQVNTT0NfVExWX0xFTl9TSVpFKQorCisvLyBGTE9XIFNQRUMgVExWIHJlbGF0ZWQgZGVmaW5lcworI2RlZmluZSBGTE9XU1BFQ19UWVBFX1NJWkUgMQorI2RlZmluZSBGTE9XU1BFQ19MRU5fU0laRSAxCisjZGVmaW5lIEZMT1dTUEVDX1RZUEVfQU5EX0xFTl9TSVpFICAoRkxPV1NQRUNfVFlQRV9TSVpFICsgRkxPV1NQRUNfTEVOX1NJWkUpCisKKy8vIENNRCBUTFYgcmVsYXRlZCBkZWZpbmVzCisjZGVmaW5lIENNRF9UTFZfVFlQRV9TSVpFIDIKKyNkZWZpbmUgQ01EX1RMVl9MRU5fU0laRSAxCisjZGVmaW5lIENNRF9UTFZfVFlQRV9BTkRfTEVOX1NJWkUgIChDTURfVExWX1RZUEVfU0laRSArIENNRF9UTFZfTEVOX1NJWkUpCisKKy8vIEV2ZW50IFRMViByZWxhdGVkIGRlZmluZXMKKyNkZWZpbmUgRVZFTlRfVExWX1RZUEVfU0laRSAxCisjZGVmaW5lIEVWRU5UX1RMVl9MRU5fU0laRSAxCisjZGVmaW5lIEVWRU5UX1RMVl9UWVBFX0FORF9MRU5fU0laRSAgKEVWRU5UX1RMVl9UWVBFX1NJWkUgKyBFVkVOVF9UTFZfTEVOX1NJWkUpCisKKy8vIERhdGEgaGVhZGVyIHNpemUgcmVsYXRlZCBkZWZpbmVzCisjZGVmaW5lIERBVEFfSEVBREVSX1NJWkUgNAorCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVU0VfRklOQUxfRlJBTUVTQworLy8gamltegorCisjZGVmaW5lIEJTTF9NQVhfRVZFTlRfU0laRSA3MDAKKworI2RlZmluZSBCU0xfREVWX0hBTkRMRSAweDEyMzQKKworLy8gRGVidWcgcmVsYXRlZCBkZWZpbmVzCisjZGVmaW5lIERCR0xPRyBwcmludGYKKy8vI2RlZmluZSBEVU1QTE9HCisjaWYgZGVmaW5lZCBEVU1QTE9HCisjZGVmaW5lIERVTVBMT0cobiwgbmFtZTEsIG5hbWUyLCBhU3RyLCBzaXplKSBcCisgICAgaWYgKDEpIFwKK3tcCisgICAgaW50IGk7XAorICAgIERCR0xPRygiJWQuICVzOiAlcyA9IFxuIiwgbiwgbmFtZTEsIG5hbWUyKTsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIFwKKyAgICAgICAgREJHTE9HKCIlMi4yeCVzIiwgKCh1bnNpZ25lZCBjaGFyICopYVN0cilbaV0sIGkgJSAxNiA9PSAxNSA/ICJcbiIgOiAiICIpOyBcCisgICAgREJHTE9HKCJcbiIpOyBcCit9CisjZWxzZQorI2RlZmluZSBEVU1QTE9HKG4sIG5hbWUxLCBuYW1lMiwgYVN0ciwgc2l6ZSkKKyNlbmRpZgorCisvLyBUaGVzZSBhcmUgcmVxdWlyZWQgdG8gcmVwbGFjZSBzb21lIE1pY3Jvc29mdCBzcGVjaWZpYyBzcGVjaWZpZXJzCisvLyNkZWZpbmUgVU5BTElHTkVEIF9fYWxpZ24KKyNkZWZpbmUgVU5BTElHTkVECisjZGVmaW5lIElORklOSVRFIDAKKworI2RlZmluZSBCVF9BTVBfSENJX0NUWF9NQUdJQyAweDQ4NDM0OTQ5ICAgIC8vICJIQ0lJIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8gVGVtcG9yYXJ5IFdpbmRvd3MgdHlwZXMKK3R5cGVkZWYgaW50ICAgICAgICAgICAgQk9PTDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQllURTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgV09SRDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgRFdPUkQ7Cit0eXBlZGVmIHZvaWQgKiBIQU5ETEU7Cit0eXBlZGVmIGNoYXIgIFRDSEFSOwordHlwZWRlZiB2b2lkICpMUFZPSUQ7Cit0eXBlZGVmIGNvbnN0IHZvaWQgKkxQQ1ZPSUQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkOyAgICAgICAgICAvLyBpcyB0aGlzIGEgdmFsaWQgY29udGV4dD8KKyAgICB2b3NfZXZlbnRfdCAgICAgICAgICAgICAgICAgIFJlYWRhYmxlRXZ0OyAgIC8vIHRoZSBldmVudCBhIFJlYWRGaWxlIGNhbiBibG9jayBvbgorICAgIHB0QnRhbXBIYW5kbGUgICAgICAgICAgICAgICAgYmFwSGRsOyAgICAgICAgLy8gb3VyIGhhbmRsZSBpbiBCQVAKKyAgICB2b3NfbGlzdF90ICAgICAgICAgICAgICAgICAgIFBoeUxpbmtzOyAgICAgIC8vIGEgbGlzdCBvZiBhbGwgYXNzb2NpYXRpb25zIHNldHVwIGJ5IHRoaXMgY2xpZW50CisvLyAgTmV3bHkgYWRkZWQgZm9yIEJsdWVaCisgICAgc3RydWN0IGhjaV9kZXYgICAgICAgICAgICAgICAqaGRldjsgICAgICAgIC8vIHRoZSBCbHVlWiBIQ0kgZGV2aWNlIHN0cnVjdHVyZQorCisgICAgLyogSSBkb24ndCBrbm93IGhvdyBtYW55IG9mIHRoZXNlIFR4IGZpZWxkcyB3ZSBuZWVkICovCisgICAgc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgICBsb2NrOyAgICAgICAgIC8qIEZvciBzZXJpYWxpemluZyBvcGVyYXRpb25zICovCisKKyAgICBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICAgIHNrX2J1ZmZfaGVhZCB0eHE7IC8qIFdlIG5lZWQgdGhlIEFDTCBEYXRhIFR4IHF1ZXVlICovCisKKyAgICAvKiBXZSBkZWZpbml0ZWx5IG5lZWQgc29tZSBvZiB0aGVzZSByeF9za2IgZmllbGRzICovCisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICByeF9zdGF0ZTsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJ4X2NvdW50OworICAgIHN0cnVjdCBza19idWZmICAgICAgICAgICAgICAgKnJ4X3NrYjsKKworICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgICAgICAgICAgKnBfZGV2OyAvLyBPdXIgcGFyZW50IHdsYW4gbmV0d29yayBkZXZpY2UKKworfSBCc2xDbGllbnRDdHhUeXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJzbENsaWVudEN0eFR5cGUqIHBjdHg7CisgICAgLyogVHggc2tiIHF1ZXVlIGFuZCB0aGUgd29ya3N0cnVjdHVyZSBmb3IgaGFuZGxpbmcgVHggYXMgZGVmZXJyZWQgd29yay4gKi8KKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAgICAgICp0eF9za2I7CisKKyAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICAgICAgIGhjaUludGVyZmFjZVByb2Nlc3Npbmc7CisgICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICBtYWdpYzsKKworfSBCc2xIY2lXb3JrU3RydWN0dXJlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFRDSEFSKiBWYWx1ZU5hbWU7ICAgICAvLyBuYW1lIG9mIHRoZSB2YWx1ZQorICAgIERXT1JEICBUeXBlOyAgICAgICAgICAvLyB0eXBlIG9mIHZhbHVlCisgICAgRFdPUkQgIER3b3JkVmFsdWU7ICAgIC8vIERXT1JEIHZhbHVlCisgICAgVENIQVIqIFN0cmluZ1ZhbHVlOyAgIC8vIHN0cmluZyB2YWx1ZQorCit9IEJzbFJlZ0VudHJ5OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJPT0wgICAgICAgICAgICAgIHVzZWQ7ICAgICAgICAgICAgICAgIC8vIGlzIHRoaXMgYSB2YWxpZCBjb250ZXh0PworICAgIGhkZF9saXN0X3QgICAgICAgIEFDTFR4UXVldWVbV0xBTlRMX01BWF9BQ107ICAvLyB0aGUgVFggQUNMIHF1ZXVlcworICAgIEJzbENsaWVudEN0eFR5cGUqIHBDbGllbnRDdHg7ICAgICAgICAgIC8vIHB0ciB0byBhcHBsaWNhdGlvbiBjb250ZXh0IHRoYXQgc3Bhd25lZAorICAgIC8vIHRoaXMgYXNzb2NpYXRpb24KKyAgICB2X1U4X3QgICAgICAgICAgICBQaHlMaW5rSGRsOyAgICAgICAgICAvLyBCQVAgaGFuZGxlIGZvciB0aGlzIGFzc29jaWF0aW9uCisgICAgdm9pZCogICAgICAgICAgICAgcFBoeUxpbmtEZXNjTm9kZTsgICAgLy8gcHRyIHRvIG5vZGUgaW4gbGlzdCBvZiBhc3NvYyBpbiBjbGllbnQgY3R4CisgICAgLy8gcmVhbCB0eXBlIEJzbFBoeUxpbmtzTm9kZVR5cGUqCisKK30gQnNsUGh5TGlua0N0eFR5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdm9zX2xpc3Rfbm9kZV90ICAgIG5vZGU7ICAvLyBNVVNUIGJlIGZpcnN0IGVsZW1lbnQKKyAgICBCc2xQaHlMaW5rQ3R4VHlwZSogcFBoeTsgIC8vIHB0ciB0byBhbiBhc3NvY2lhdGlvbiBjb250ZXh0CisKK30gQnNsUGh5TGlua3NOb2RlVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB2b3NfbGlzdF9ub2RlX3Qgbm9kZTsgICAgIC8vIE1VU1QgYmUgZmlyc3QgZWxlbWVudAorICAgIHZvc19wa3RfdCogICAgICBwVm9zUGt0OyAgLy8gcHRyIHRvIGEgUlggVm9TIHBrdCB3aGljaCBjYW4gaG9sZCBhbiBIQ0kgZXZlbnQgb3IgQUNMIGRhdGEKKworfSBCc2xSeExpc3ROb2RlVHlwZTsKKworLy8gQm9ycm93ZWQgZnJvbSB3bGFuX2hkZF9kcF91dGlscy5oCit0eXBlZGVmIHN0cnVjdAoreworICAgIGhkZF9saXN0X25vZGVfdCAgICAgbm9kZTsgICAgICAgICAvLyBNVVNUIGJlIGZpcnN0IGVsZW1lbnQKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqICAgIHNrYjsgICAgICAgICAgLy8gcHRyIHRvIHRoZSBBQ0wgZGF0YQorCit9IEJzbFR4TGlzdE5vZGVUeXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJzbFBoeUxpbmtDdHhUeXBlKiBwdHI7ICAgLy8gcHRyIHRvIHRoZSBhc3NvY2lhdGlvbiBjb250ZXh0IGZvciB0aGlzIHBoeV9saW5rX2hhbmRsZQorCit9IEJzbFBoeUxpbmtNYXBFbnRyeVR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQnNsQ2xpZW50Q3R4VHlwZSogZ3BCc2xjdHg7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIFZhcmlhYmxlIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vIFRlbXBvcmFyeSAodW50aWwgbXVsdGktcGh5IGxpbmspIHBvaW50ZXIgdG8gQlQtQU1QIGNvbnRleHQKK3N0YXRpYyB2b2lkICpncEN0eDsKKworLy8gYW4gZWZmaWNpZW50IGxvb2t1cCBmcm9tIHBoeV9saW5rX2hhbmRsZSB0byBwaHkgbGluayBjb250ZXh0CitzdGF0aWMgQnNsUGh5TGlua01hcEVudHJ5VHlwZSBCc2xQaHlMaW5rTWFwW0JTTF9NQVhfQUxMT1dFRF9QSFlfTElOS1NdOworCisvL3N0YXRpYyBIQU5ETEUgaEJzbCA9IE5VTEw7IC8vSU5WQUxJRF9IQU5ETEVfVkFMVUU7CitzdGF0aWMgQk9PTCBiQnNsSW5pdGVkID0gRkFMU0U7CisKK3N0YXRpYyBCc2xDbGllbnRDdHhUeXBlIEJzbENsaWVudEN0eFtCU0xfTUFYX0NMSUVOVFNdOworLy9zdGF0aWMgdm9zX2xvY2tfdCBCc2xDbGllbnRMb2NrOworCitzdGF0aWMgQnNsUGh5TGlua0N0eFR5cGUgQnNsUGh5TGlua0N0eFtCU0xfTUFYX1BIWV9MSU5LU107CisvL3N0YXRpYyB2b3NfbG9ja190IEJzbFBoeUxvY2s7CisKKy8vIHRoZSBwb29sIGZvciBhc3NvY2lhdGlvbiBjb250ZXh0cworc3RhdGljIHZvc19saXN0X3QgQnNsUGh5TGlua3NEZXNjUG9vbDsKK3N0YXRpYyBCc2xQaHlMaW5rc05vZGVUeXBlIEJzbFBoeUxpbmtzRGVzY1tCU0xfTUFYX1BIWV9MSU5LU107CisKKy8vc3RhdGljIHZfVTMyX3QgRXZlbnRsZW4gPSAwOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICBGb3J3YXJkIGRlY2xhcmF0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGJzbFdyaXRlRmluaXNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIERyaXZlciBFbnRyeSBwb2ludHMgYW5kIFN0cnVjdHVyZSBkZWZpbml0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgQlNMX09wZW4gKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKK3N0YXRpYyBpbnQgQlNMX0Nsb3NlIChzdHJ1Y3QgaGNpX2RldiAqaGRldik7CitzdGF0aWMgaW50IEJTTF9GbHVzaChzdHJ1Y3QgaGNpX2RldiAqaGRldik7CitzdGF0aWMgaW50IEJTTF9JT0NvbnRyb2woc3RydWN0IGhjaV9kZXYgKmhkZXYsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgQlNMX1dyaXRlKHN0cnVjdCBza19idWZmICpza2IpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDQsMCkpCitzdGF0aWMgdm9pZCBCU0xfRGVzdHJ1Y3Qoc3RydWN0IGhjaV9kZXYgKmhkZXYpOworI2VuZGlmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdl9CT09MX3QgV0xBTkJBUF9BbXBDb25uZWN0aW9uQWxsb3dlZCh2b2lkKQoreworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dCggVk9TX01PRFVMRV9JRF9IREQsIE5VTEwgKTsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4OworICAgIHZfQk9PTF90IHJldFZhbCA9IFZPU19GQUxTRTsKKworICAgIGlmIChOVUxMICE9IHBWb3NDb250ZXh0KQorICAgIHsKKyAgICAgICBwSGRkQ3R4ID0gdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0hERCwgcFZvc0NvbnRleHQpOworICAgICAgIGlmIChOVUxMICE9IHBIZGRDdHgpCisgICAgICAgeworICAgICAgICAgICByZXR1cm4gcEhkZEN0eC0+aXNBbXBBbGxvd2VkOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldFZhbDsKK30KKworLyoqCisgIEBicmllZiBXTEFOQkFQX1NUQUZldGNoUGt0Q0IoKSAtIFRoZSBmZXRjaCBwYWNrZXQgY2FsbGJhY2sgcmVnaXN0ZXJlZAorICB3aXRoIEJBUCBieSBIREQuCisKKyAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBCQVAgaW1tZWRpYXRlbHkgdXBvbiB0aGUgdW5kZXJseWluZworICBXTEFOVExfU1RBRmV0Y2hQa3RDQlR5cGUgcm91dGluZSBiZWluZyBjYWxsZWQuICBXaGljaCBpcyBjYWxsZWQgYnkKKyAgVEwgd2hlbiB0aGUgc2NoZWR1bGluZyBhbGdvcml0aG1zIGFsbG93cyBmb3IgdHJhbnNtaXNzaW9uIG9mIGFub3RoZXIKKyAgcGFja2V0IHRvIHRoZSBtb2R1bGUuCisKKyAgVGhpcyBmdW5jdGlvbiBpcyBoZXJlIHRvICJ3cmFwIiBvciBhYnN0cmFjdCBXTEFOVExfU1RBRmV0Y2hQa3RDQlR5cGUuCisgIEJlY2F1c2UgdGhlIEJBUC1zcGVjaWZpYyBIREQgInNoaW0iIGxheWVyIChCU0wpIGRvZXNuJ3Qga25vdyBhbnl0aGluZworICBhYm91dCBTVEFJZHMsIG9yIG90aGVyIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgVEwuCisKKyAgQHBhcmFtIHBIZGRIZGw6IFtpbl0gVGhlIEhERChCU0wpIHNwZWNpZmljIGNvbnRleHQgZm9yIHRoaXMgYXNzb2NpYXRpb24uCisgIFVzZSB0aGUgU1RBSWQgcGFzc2VkIHRvIG1lIGJ5IFRMIGluIFdMQU5UTF9TVEFGZXRjaENCVHlwZSB0byByZXRyZWl2ZQorICB0aGlzIHZhbHVlLgorICBAcGFyYW0gIHB1Y0FDOiBbaW5vdXRdIGFjY2VzcyBjYXRlZ29yeSByZXF1ZXN0ZWQgYnkgVEwsIGlmIEhERCBkb2VzIG5vdAorICBoYXZlIHBhY2tldHMgb24gdGhpcyBBQyBpdCBjYW4gY2hvb3NlIHRvIHNlcnZpY2UgYW5vdGhlciBBQyBxdWV1ZSBpbgorICB0aGUgb3JkZXIgb2YgcHJpb3JpdHkKKyAgQHBhcmFtICB2b3NEYXRhQnVmZjogW291dF0gcG9pbnRlciB0byB0aGUgVk9TUyBkYXRhIGJ1ZmZlciB0aGF0IHdhcworICB0cmFuc21pdHRlZAorICBAcGFyYW0gdGxNZXRhSW5mbzogW291dF0gbWV0YSBpbmZvIHJlbGF0ZWQgdG8gdGhlIGRhdGEgZnJhbWUKKworICBAcmV0dXJuCisgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisqLworc3RhdGljIFZPU19TVEFUVVMgV0xBTkJBUF9TVEFGZXRjaFBrdENCCisoCisgICAgdl9QVk9JRF90ICAgICAgICAgICAgIHBIZGRIZGwsCisgICAgV0xBTlRMX0FDRW51bVR5cGUgICAgIHVjQUMsCisgICAgdm9zX3BrdF90KiogICAgICAgICAgIHZvc0RhdGFCdWZmLAorICAgIFdMQU5UTF9NZXRhSW5mb1R5cGUqICB0bE1ldGFJbmZvCispCit7CisgICAgQnNsUGh5TGlua0N0eFR5cGUqIHBQaHlDdHg7CisgICAgVk9TX1NUQVRVUyBWb3NTdGF0dXM7CisgICAgdl9VOF90IEFjSWR4U3RhcnQ7CisgICAgdl9VOF90IEFjSWR4OworICAgIGhkZF9saXN0X25vZGVfdCAqcExpbms7CisgICAgQnNsVHhMaXN0Tm9kZVR5cGUgKnBOb2RlOworICAgIHN0cnVjdCBza19idWZmICogICAgc2tiOworICAgIEJzbENsaWVudEN0eFR5cGUqIHBjdHg7CisgICAgV0xBTlRMX0FDRW51bVR5cGUgQWM7CisgICAgdm9zX3BrdF90KiBwVm9zUGt0OworICAgIFdMQU5UTF9NZXRhSW5mb1R5cGUgVGxNZXRhSW5mbzsKKyAgICBwY3R4ID0gJkJzbENsaWVudEN0eFswXTsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywgIldMQU5CQVBfU1RBRmV0Y2hQa3RDQlxuIiApOworCisgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYoIHBIZGRIZGwgPT0gTlVMTCB8fCB2b3NEYXRhQnVmZiA9PSBOVUxMIHx8CisgICAgICAgICAgICB0bE1ldGFJbmZvID09IE5VTEwgfHwgdWNBQyA+PSBXTEFOVExfTUFYX0FDIHx8IHVjQUMgPCAwICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU5CQVBfU1RBRmV0Y2hQa3RDQiBiYWQgaW5wdXRcbiIgKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgdGhlIFZPU1MgcGFja2V0IHJldHVybmVkIHRvIE5VTEwgLSBpbiBjYXNlIG9mIGVycm9yCisgICAgKnZvc0RhdGFCdWZmID0gTlVMTDsKKworICAgIHBQaHlDdHggPSAoQnNsUGh5TGlua0N0eFR5cGUgKilwSGRkSGRsOworICAgIEFjSWR4ID0gQWNJZHhTdGFydCA9IHVjQUM7CisKKyAgICBzcGluX2xvY2tfYmgoJnBQaHlDdHgtPkFDTFR4UXVldWVbQWNJZHhdLmxvY2spOworICAgIFZvc1N0YXR1cyA9IGhkZF9saXN0X3JlbW92ZV9mcm9udCggJnBQaHlDdHgtPkFDTFR4UXVldWVbQWNJZHhdLCAmcExpbmsgKTsKKyAgICBzcGluX3VubG9ja19iaCgmcFBoeUN0eC0+QUNMVHhRdWV1ZVtBY0lkeF0ubG9jayk7CisKKyAgICBpZiAoIFZPU19TVEFUVVNfRV9FTVBUWSA9PSBWb3NTdGF0dXMgKQorICAgIHsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgQWNJZHggPSAoQWNJZHggKyAxKSAlIFdMQU5UTF9NQVhfQUM7CisKKyAgICAgICAgICAgIHNwaW5fbG9ja19iaCgmcFBoeUN0eC0+QUNMVHhRdWV1ZVtBY0lkeF0ubG9jayk7CisgICAgICAgICAgICBWb3NTdGF0dXMgPSBoZGRfbGlzdF9yZW1vdmVfZnJvbnQoICZwUGh5Q3R4LT5BQ0xUeFF1ZXVlW0FjSWR4XSwgJnBMaW5rICk7CisgICAgICAgICAgICBzcGluX3VubG9ja19iaCgmcFBoeUN0eC0+QUNMVHhRdWV1ZVtBY0lkeF0ubG9jayk7CisKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoIFZvc1N0YXR1cyA9PSBWT1NfU1RBVFVTX0VfRU1QVFkgJiYgQWNJZHggIT0gQWNJZHhTdGFydCApOworCisgICAgICAgIGlmICggVm9zU3RhdHVzID09IFZPU19TVEFUVVNfRV9FTVBUWSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFF1ZXVlIGlzIGVtcHR5LiAgVGhpcyBjYW4gaGFwcGVuLiAgSnVzdCByZXR1cm4gTlVMTCBiYWNrIHRvIFRMLi4uCisgICAgICAgICAgICByZXR1cm4oVk9TX1NUQVRVU19FX0VNUFRZKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICB7CisgICAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICB9CisKKyAgICBwTm9kZSA9IChCc2xUeExpc3ROb2RlVHlwZSAqKXBMaW5rOworICAgIHNrYiAgID0gcE5vZGUtPnNrYjsKKworICAgLy8gSSB3aWxsIGFjY2VzcyB0aGUgc2tiIGluIGEgVk9TUyBwYWNrZXQKKyAgIC8vIFdyYXAgdGhlIE9TIHByb3ZpZGVkIHNrYiBpbiBhIFZPU1MgcGFja2V0CisgICAgLy8gQXR0YWNoIHNrYiB0byBWT1MgcGFja2V0LgorICAgIFZvc1N0YXR1cyA9IHZvc19wa3Rfd3JhcF9kYXRhX3BhY2tldCggJnBWb3NQa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfUEtUX1RZUEVfVFhfODAyXzNfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTkJBUF9TVEFGZXRjaFBrdENCIHZvc19wa3Rfd3JhcF9kYXRhX3BhY2tldCAiCisgICAgICAgICAgICAgImZhaWxlZCBzdGF0dXMgPSVkXG4iLCBWb3NTdGF0dXMgKTsKKyAgICAgICAga2ZyZWVfc2tiKHNrYik7ICAKKyAgICAgICAgcmV0dXJuIFZvc1N0YXR1czsKKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBwVm9zUGt0KHZvc19wa3RfdCAqKT0lcFxuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgcFZvc1BrdCApOworCisgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9YbGF0ZVR4RGF0YVBrdCggcGN0eC0+YmFwSGRsLCBwUGh5Q3R4LT5QaHlMaW5rSGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBYywgJlRsTWV0YUluZm8sIHBWb3NQa3QpOworCisgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOQkFQX1NUQUZldGNoUGt0Q0IgV0xBTkJBUF9YbGF0ZVR4RGF0YVBrdCAiCisgICAgICAgICAgICAgImZhaWxlZCBzdGF0dXMgPSVkXG4iLCBWb3NTdGF0dXMgKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIHBhY2tldAorICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKyAgICAgICAga2ZyZWVfc2tiKHNrYik7ICAKKyAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKTsKKworICAgICAgICByZXR1cm4gVm9zU3RhdHVzOworICAgIH0KKyAgICAvLyBnaXZlIFRMIHRoZSBWb1MgcGt0CisgICAgKnZvc0RhdGFCdWZmID0gcFZvc1BrdDsKKworICAgIC8vIHByb3ZpZGUgdGhlIG1ldGEtaW5mbyBCQVAgcHJvdmlkZWQgcHJldmlvdXNseQorICAgICp0bE1ldGFJbmZvID0gVGxNZXRhSW5mbzsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogKnZvc0RhdGFCdWZmKHZvc19wa3RfdCAqKT0lcFxuIiwgX19GVU5DVElPTl9fLCAqdm9zRGF0YUJ1ZmYgKTsKKworICAgIHJldHVybihWT1NfU1RBVFVTX1NVQ0NFU1MpOworfSAvLyBXTEFOQkFQX1NUQUZldGNoUGt0Q0IoKQorCisvKioKKyAgQGJyaWVmIFdMQU5CQVBfU1RBUnhDQigpIC0gVGhlIHJlY2VpdmUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIEJBUCBieSBIREQuCisKKyAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBCQVAgaW1tZWRpYXRlbHkgdXBvbiB0aGUgdW5kZXJseWluZworICBXTEFOVExfU1RBUnhDQlR5cGUgcm91dGluZSBiZWluZyBjYWxsZWQuICBXaGljaCBpcyBjYWxsZWQgYnkKKyAgVEwgdG8gbm90aWZ5IHdoZW4gYSBwYWNrZXQgd2FzIHJlY2VpdmVkIGZvciBhIHJlZ2lzdGVyZWQgU1RBLgorCisgIEBwYXJhbSAgcEhkZEhkbDogW2luXSBUaGUgSEREKEJTTCkgc3BlY2lmaWMgY29udGV4dCBmb3IgdGhpcyBhc3NvY2lhdGlvbi4KKyAgVXNlIHRoZSBTVEFJZCBwYXNzZWQgdG8gbWUgYnkgVEwgaW4gV0xBTlRMX1NUQVJ4Q0JUeXBlIHRvIHJldHJpZXZlIHRoaXMgdmFsdWUuCisgIEBwYXJhbSAgdm9zRGF0YUJ1ZmY6IFtpbl0gcG9pbnRlciB0byB0aGUgVk9TUyBkYXRhIGJ1ZmZlciB0aGF0IHdhcyByZWNlaXZlZAorICAoaXQgbWF5IGJlIGEgbGlua2VkIGxpc3QpCisgIEBwYXJhbSAgcFJ4TWV0YUluZm86IFtpbl0gUnggbWV0YSBpbmZvIHJlbGF0ZWQgdG8gdGhlIGRhdGEgZnJhbWUKKworICBAcmV0dXJuCisgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisqLworc3RhdGljIFZPU19TVEFUVVMgV0xBTkJBUF9TVEFSeENCCisoCisgICAgdl9QVk9JRF90ICAgICAgICAgICAgICBwSGRkSGRsLAorICAgIHZvc19wa3RfdCogICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCisgICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlKiBwUnhNZXRhSW5mbworKQoreworICAgIEJzbFBoeUxpbmtDdHhUeXBlKiBwY3R4OworICAgIEJzbENsaWVudEN0eFR5cGUqIHBwY3R4OworICAgIFZPU19TVEFUVVMgVm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIFdMQU5UTF9BQ0VudW1UeXBlIEFjOyAvLyB0aGlzIGlzIG5vdCBuZWVkZWQgcmVhbGx5CisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisgICAgdm9zX3BrdF90KiBwVm9zUGFja2V0OworICAgIHZvc19wa3RfdCogcE5leHRWb3NQYWNrZXQ7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csICJXTEFOQkFQX1NUQVJ4Q0JcbiIgKTsKKworICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmICggcEhkZEhkbCA9PSBOVUxMIHx8IHZvc0RhdGFCdWZmID09IE5VTEwgfHwgcFJ4TWV0YUluZm8gPT0gTlVMTCApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOQkFQX1NUQVJ4Q0IgYmFkIGlucHV0XG4iICk7CisgICAgICAgIGlmKE5VTEwgIT0gdm9zRGF0YUJ1ZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggdm9zRGF0YUJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgcGN0eCA9IChCc2xQaHlMaW5rQ3R4VHlwZSAqKXBIZGRIZGw7CisgICAgcHBjdHggPSBwY3R4LT5wQ2xpZW50Q3R4OworCisgICAgaWYoIE5VTEwgPT0gcHBjdHggKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTkJBUF9TVEFSeENCIENsaWVudEN0eCBpcyBOVUxMXG4iICk7CisgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggdm9zRGF0YUJ1ZmYgKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIC8vIHdhbGsgdGhlIGNoYWluIHVudGlsIGFsbCBhcmUgcHJvY2Vzc2VkCisgICBwVm9zUGFja2V0ID0gdm9zRGF0YUJ1ZmY7CisgICBkbworICAgeworICAgICAgIC8vIGdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBwYWNrZXQgaW4gdGhlIGNoYWluCisgICAgICAgLy8gKGJ1dCBkb24ndCB1bmxpbmsgdGhlIHBhY2tldCBzaW5jZSB3ZSBmcmVlIHRoZSBlbnRpcmUgY2hhaW4gbGF0ZXIpCisgICAgICAgVm9zU3RhdHVzID0gdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggcFZvc1BhY2tldCwgJnBOZXh0Vm9zUGFja2V0LCBWT1NfRkFMU0UpOworICAgICAgIAorICAgICAgIC8vIGJvdGggInN1Y2Nlc3MiIGFuZCAiZW1wdHkiIGFyZSBhY2NlcHRhYmxlIHJlc3VsdHMKKyAgICAgICBpZiAoISgoVm9zU3RhdHVzID09IFZPU19TVEFUVVNfU1VDQ0VTUykgfHwgKFZvc1N0YXR1cyA9PSBWT1NfU1RBVFVTX0VfRU1QVFkpKSkKKyAgICAgICB7CisgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEZhaWx1cmUgd2Fsa2luZyBwYWNrZXQgY2hhaW4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgfQorICAgICAgIAorICAgICAgIC8vIHByb2Nlc3MgdGhlIHBhY2tldAorICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfWGxhdGVSeERhdGFQa3QoIHBwY3R4LT5iYXBIZGwsIHBjdHgtPlBoeUxpbmtIZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjLCBwVm9zUGFja2V0ICk7CisKKyAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICB7CisgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIldMQU5CQVBfU1RBUnhDQiBXTEFOQkFQX1hsYXRlUnhEYXRhUGt0ICIKKyAgICAgICAgICAgImZhaWxlZCBzdGF0dXMgPSAlZFxuIiwgVm9zU3RhdHVzICk7CisKKyAgICAgICAgICAgVm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgLy8gRXh0cmFjdCB0aGUgT1MgcGFja2V0IChza2IpLgorICAgICAgIC8vIFRlbGwgVk9TIHRvIGRldGFjaCB0aGUgT1MgcGFja2V0IGZyb20gdGhlIFZPUyBwYWNrZXQKKyAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X2dldF9vc19wYWNrZXQoIHBWb3NQYWNrZXQsICh2X1ZPSURfdCAqKikmc2tiLCBWT1NfVFJVRSApOworICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKQorICAgICAgIHsKKyAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEZhaWx1cmUgZXh0cmFjdGluZyBza2IgZnJvbSB2b3MgcGt0LiAiCisgICAgICAgICAgICAgIlZvc1N0YXR1cyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIFZvc1N0YXR1cyApOworCisgICAgICAgICAgIFZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworCisgICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgIC8vSkVaMTAwODA5OiBXaGlsZSBhbiBza2IgaXMgYmVpbmcgaGFuZGxlZCBieSB0aGUga2VybmVsLCBpcyAic2tiLT5kZXYiIGRlLXJlZidkPworICAgICAgIHNrYi0+ZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGdwQnNsY3R4LT5oZGV2OworICAgICAgIGJ0X2NiKHNrYiktPnBrdF90eXBlID0gSENJX0FDTERBVEFfUEtUOworICAgICAgIC8vc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworICAgICAgIC8vc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKyAKKyAgICAgICAvLyBUaGlzIGlzIG15IHJlY2VpdmUgc2tiIHBvaW50ZXIKKyAgICAgICBncEJzbGN0eC0+cnhfc2tiID0gc2tiOworCisgICAgICAgLy8gVGhpcyBpcyBob3cgZGF0YSBhbmQgZXZlbnRzIGFyZSBwYXNzZWQgdXAgdG8gQmx1ZVoKKyAgICAgICBoY2lfcmVjdl9mcmFtZShncEJzbGN0eC0+cnhfc2tiKTsKKworICAgICAgIC8vIG5vdyBwcm9jZXNzIHRoZSBuZXh0IHBhY2tldCBpbiB0aGUgY2hhaW4KKyAgICAgICBwVm9zUGFja2V0ID0gcE5leHRWb3NQYWNrZXQ7CisgICAgICAgCisgICB9IHdoaWxlIChwVm9zUGFja2V0KTsKKworCisgICAgLy9KRVoxMDA5MjI6IFdlIGFyZSBmcmVlIHRvIHJldHVybiB0aGUgZW5jbG9zaW5nIFZPU1MgcGFja2V0LgorICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggdm9zRGF0YUJ1ZmYgKTsKKyAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkpOworCisKKyAgICByZXR1cm4oVk9TX1NUQVRVU19TVUNDRVNTKTsKK30gLy8gV0xBTkJBUF9TVEFSeENCKCkKKworLyoqCisgIEBicmllZiBXTEFOQkFQX1R4Q29tcENCKCkgLSBUaGUgVHggY29tcGxldGUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIEJBUCBieSBIREQuCisKKyAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBCQVAgaW1tZWRpYXRlbHkgdXBvbiB0aGUgdW5kZXJseWluZworICBXTEFOVExfVHhDb21wQ0JUeXBlIHJvdXRpbmUgYmVpbmcgY2FsbGVkLiAgV2hpY2ggaXMgY2FsbGVkIGJ5CisgIFRMIHRvIG5vdGlmeSB3aGVuIGEgdHJhbnNtaXNzaW9uIGZvciBhIHBhY2tldCBoYXMgZW5kZWQuCisKKyAgQHBhcmFtIHBIZGRIZGw6IFtpbl0gVGhlIEhERChCU0wpIHNwZWNpZmljIGNvbnRleHQgZm9yIHRoaXMgYXNzb2NpYXRpb24KKyAgQHBhcmFtIHZvc0RhdGFCdWZmOiBbaW5dIHBvaW50ZXIgdG8gdGhlIFZPU1MgZGF0YSBidWZmZXIgdGhhdCB3YXMgdHJhbnNtaXR0ZWQKKyAgQHBhcmFtIHdUeFNUQXR1czogW2luXSBzdGF0dXMgb2YgdGhlIHRyYW5zbWlzc2lvbgorCisgIEByZXR1cm4KKyAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyovCitleHRlcm4gdl9WT0lEX3QgV0xBTkJBUF9UeFBhY2tldE1vbml0b3JIYW5kbGVyICggdl9QVk9JRF90ICk7IC8vIG91ciBoYW5kbGUgaW4gQkFQCisKK3N0YXRpYyBWT1NfU1RBVFVTIFdMQU5CQVBfVHhDb21wQ0IKKygKKyAgICB2X1BWT0lEX3QgICAgICBwSGRkSGRsLAorICAgIHZvc19wa3RfdCogICAgIHZvc0RhdGFCdWZmLAorICAgIFZPU19TVEFUVVMgICAgIHdUeFNUQXR1cworKQoreworICAgIFZPU19TVEFUVVMgVm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIC8vQnNsVHhMaXN0Tm9kZVR5cGUqIHBUeE5vZGU7CisgICAgdm9pZCogcE9zUGt0ID0gTlVMTDsKKyAgICBCc2xQaHlMaW5rQ3R4VHlwZSogcGN0eDsKKyAgICBCc2xDbGllbnRDdHhUeXBlKiBwcGN0eDsKKyAgICBzdGF0aWMgaW50IG51bV9wYWNrZXRzID0gMDsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiV0xBTkJBUF9UeENvbXBDQi4gdm9zRGF0YUJ1ZmYodm9zX3BrdF90ICopPSVwXG4iLCB2b3NEYXRhQnVmZiApOworCisgICAgLy8gYmUgYXdhcmUgdGhhdCBwSGRkSGRsIGNhbiBiZSBOVUxMIG9yIGNhbiBwb2ludCB0byB0aGUgcGVyIGFzc29jaWF0aW9uCisgICAgLy8gQlNMIGNvbnRleHQgZnJvbSB0aGUgcmVnaXN0ZXIgZGF0YSBwbGFuZS4gSW4gZWl0aGVyIGNhc2UgaXQgZG9lcyBub3QKKyAgICAvLyBtYXR0ZXIgc2luY2Ugd2Ugd2lsbCBzaW1wbHkgZnJlZSB0aGUgVm9TIHBrdCBhbmQgcmVjbGFpbSB0aGUgVFgKKyAgICAvLyBkZXNjcmlwdG9yCisKKyAgICAvLyBzYW5pdHkgY2hlY2tpbmcKKyAgICBpZiAoIHZvc0RhdGFCdWZmID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTkJBUF9UeENvbXBDQiBiYWQgaW5wdXRcbiIgKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIC8vUmV0dXJuIHRoZSBza2IgdG8gdGhlIE9TCisgICAgVm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfb3NfcGFja2V0KCB2b3NEYXRhQnVmZiwgJnBPc1BrdCwgVk9TX1RSVUUgKTsKKyAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSkKKyAgICB7CisgICAgICAgIC8vVGhpcyBpcyBiYWQgYnV0IHN0aWxsIHRyeSB0byBmcmVlIHRoZSBWT1NTIHJlc291cmNlcyBpZiB3ZSBjYW4KKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogRmFpbHVyZSBleHRyYWN0aW5nIHNrYiBmcm9tIHZvcyBwa3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHZvc0RhdGFCdWZmICk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBrZnJlZV9za2IoKHN0cnVjdCBza19idWZmICopcE9zUGt0KTsKKworICAgIC8vUmV0dXJuIHRoZSBWT1MgcGFja2V0IHJlc291cmNlcy4KKyAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHZvc0RhdGFCdWZmICk7CisKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICB7CisgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgfQorCisgICAgLy8gSkVaMTEwMzMwOiBOb3cgc2lnbmFsIHRoZSBsYXllciBhYm92ZSBtZS4uLnRoYXQgSSBoYXZlIHJlbGVhc2VkIHNvbWUgcGFja2V0cy4KKyAgICBwY3R4ID0gKEJzbFBoeUxpbmtDdHhUeXBlICopcEhkZEhkbDsKKyAgICBwcGN0eCA9IHBjdHgtPnBDbGllbnRDdHg7CisgICAgbnVtX3BhY2tldHMgPSAobnVtX3BhY2tldHMgKyAxKSAlIDQ7CisgICAgaWYgKG51bV9wYWNrZXRzID09IDAgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogU2VuZGluZyB1cCBudW1iZXIgb2YgY29tcGxldGVkIHBhY2tldHMuICBudW1fcGFja2V0cyA9ICVkLlxuIiwgX19GVU5DVElPTl9fLCBudW1fcGFja2V0cyApOworICAgICAgICBXTEFOQkFQX1R4UGFja2V0TW9uaXRvckhhbmRsZXIgKCAodl9QVk9JRF90KSBwcGN0eC0+YmFwSGRsICk7IC8vIG91ciBoYW5kbGUgaW4gQkFQCisgICAgfQorCisgICAgcmV0dXJuKFZPU19TVEFUVVNfU1VDQ0VTUyk7Cit9IC8vIFdMQU5CQVBfVHhDb21wQ0IoKQorCisvKioKKyAgQGJyaWVmIEJzbEZsdXNoVHhRdWV1ZXMoKSAtIGZsdXNoIHRoZSBUeCAgcXVldWVzCisKKyAgQHBhcmFtIHBQaHlDdHggOiBbaW5dIHB0ciB0byB0aGUgcGh5IGNvbnRleHQgd2hvc2UgcXVldWVzIG5lZWQgdG8gYmUgZmx1c2hlZAorCisgIEByZXR1cm4KKyAgVk9TX1NUQVRVUworCisqLworc3RhdGljIFZPU19TVEFUVVMgQnNsRmx1c2hUeFF1ZXVlcworKAorICAgIEJzbFBoeUxpbmtDdHhUeXBlKiBwUGh5Q3R4CispCit7CisgICAgVk9TX1NUQVRVUyBWb3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdl9TSU5UX3QgaSA9IC0xOworICAgIGhkZF9saXN0X25vZGVfdCogcExpbms7CisgICAgQnNsVHhMaXN0Tm9kZVR5cGUgKnBOb2RlOworCisKKyAgICBpZihUUlVFID09IHBQaHlDdHgtPnVzZWQpCisgICAgeworICAgICAgICB3aGlsZSAoKytpICE9IFdMQU5UTF9NQVhfQUMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vRnJlZSB1cCBhbnkgcGFja2V0cyBpbiB0aGUgVHggcXVldWUKKyAgICAgICAgICAgIHNwaW5fbG9ja19iaCgmcFBoeUN0eC0+QUNMVHhRdWV1ZVtpXS5sb2NrKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZvc1N0YXR1cyA9IGhkZF9saXN0X3JlbW92ZV9mcm9udCgmcFBoeUN0eC0+QUNMVHhRdWV1ZVtpXSwgJnBMaW5rICk7CisgICAgICAgICAgICAgICAgaWYoVk9TX1NUQVRVU19FX0VNUFRZICE9IFZvc1N0YXR1cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBOb2RlID0gKEJzbFR4TGlzdE5vZGVUeXBlICopcExpbms7CisgICAgICAgICAgICAgICAgICAgIGtmcmVlX3NrYihwTm9kZS0+c2tiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3Bpbl91bmxvY2tfYmgoJnBQaHlDdHgtPkFDTFR4UXVldWVbaV0ubG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKFZPU19TVEFUVVNfU1VDQ0VTUyk7Cit9IC8vIEJzbEZsdXNoVHhRdWV1ZXMKKworCisvKioKKyAgQGJyaWVmIEJzbFJlbGVhc2VQaHlDdHgoKSAtIHRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHVwIGFuIGFzc29jaWF0aW9uIGNvbnRleHQKKworICBAcGFyYW0gcFBoeUN0eCA6IFtpbl0gcHRyIHRvIHRoZSBwaHkgY29udGV4dCB0byByZWxlYXNlCisKKyAgQHJldHVybgorICBOb25lCisKKyovCitzdGF0aWMgdm9pZCBCc2xSZWxlYXNlUGh5Q3R4CisoCisgICAgQnNsUGh5TGlua0N0eFR5cGUqIHBQaHlDdHgKKykKK3sKKyAgICB2X1UzMl90IE9sZE1hcFZhbDsKKyAgICBWT1NfU1RBVFVTIFZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xSZWxlYXNlUGh5Q3R4XG4iICk7CisKKyAgICBwUGh5Q3R4LT51c2VkID0gRkFMU0U7CisKKworICAgIGlmIChCc2xQaHlMaW5rTWFwW3BQaHlDdHgtPlBoeUxpbmtIZGxdLnB0ciA9PSBOVUxMKSByZXR1cm47CisKKworICAgIC8vIHVwZGF0ZSB0aGUgcGh5IGxpbmsgaGFuZGxlIGJhc2VkIG1hcCBzbyBUWCBkYXRhIGlzIHN0b3BwZWQgZnJvbSBmbG93aW5nIHRocm91Z2gKKyAgICBPbGRNYXBWYWwgPSB2b3NfYXRvbWljX3NldF9VMzIoICh2X1UzMl90ICopIChCc2xQaHlMaW5rTWFwW3BQaHlDdHgtPlBoeUxpbmtIZGxdLnB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdCkgMCApOworCisgICAgLy8gY2xlYXIgb3V0IHRoZSBUeCBRdWV1ZXMKKyAgICBWb3NTdGF0dXMgPSAgQnNsRmx1c2hUeFF1ZXVlcyhwUGh5Q3R4KTsKKworICAgIC8vIGNsZWFyIG91dCB0aGUgcGFyZW50IHB0cgorICAgIC8vICBwUGh5Q3R4LT5wQ2xpZW50Q3R4ID0gTlVMTDsvL2NvbW1lbnRlZCB0byBkZWJ1ZyBleGNlcHRpb24KKworICAgIC8vIHdlIGFsc28gbmVlZCB0byByZW1vdmUgdGhpcyBhc3NvY2F0aW9uIGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlCisgICAgLy8gYXNzb2NpYXRpb25zIG1haW50YWluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQKKyAgICBpZiggcFBoeUN0eC0+cFBoeUxpbmtEZXNjTm9kZSApCisgICAgeworICAgICAgICBWb3NTdGF0dXMgPSB2b3NfbGlzdF9yZW1vdmVfbm9kZSggJnBQaHlDdHgtPnBDbGllbnRDdHgtPlBoeUxpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJigoQnNsUGh5TGlua3NOb2RlVHlwZSopcFBoeUN0eC0+cFBoeUxpbmtEZXNjTm9kZSktPm5vZGUpOworICAgICAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKTsKKyAgICAgICAgLy9SZXR1cm4gdGhlIFBoeUxpbmsgaGFuZGxlIHRvIHRoZSBmcmVlIHBvb2wKKyAgICAgICAgVm9zU3RhdHVzID0gdm9zX2xpc3RfaW5zZXJ0X2Zyb250KCZCc2xQaHlMaW5rc0Rlc2NQb29sLCYoKEJzbFBoeUxpbmtzTm9kZVR5cGUqKXBQaHlDdHgtPnBQaHlMaW5rRGVzY05vZGUpLT5ub2RlKTsKKyAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICk7CisKKyAgICAgICAgcFBoeUN0eC0+cFBoeUxpbmtEZXNjTm9kZSA9IE5VTEw7CisgICAgfQorICAgIHBQaHlDdHgtPnBDbGllbnRDdHggPSBOVUxMOy8vTW92ZWQgaGVyZSB0byBiZWJ1ZyB0aGUgZXhjZXB0aW9uCisKKyAgICBwUGh5Q3R4LT51c2VkID0gRkFMU0U7CisKK30gLy8gQnNsUmVsZWFzZVBoeUN0eCgpCisKKy8qKgorICBAYnJpZWYgV0xBTl9CQVBFdmVudENCKCkgLSBJbXBsZW1lbnRzIHRoZSBjYWxsYmFjayBmb3IgQUxMIGFzeW5jaHJvbm91cyBldmVudHMuCisKKyAgSW5jbHVkaW5nIEV2ZW50cyByZXN1bHRpbmcgZnJvbToKKyAgICAgKiBIQ0kgQ3JlYXRlIFBoeXNpY2FsIExpbmssCisgICAgICogRGlzY29ubmVjdCBQaHlzaWNhbCBMaW5rLAorICAgICAqIENyZWF0ZSBMb2dpY2FsIExpbmssCisgICAgICogRmxvdyBTcGVjIE1vZGlmeSwKKyAgICAgKiBIQ0kgUmVzZXQsCisgICAgICogSENJIEZsdXNoLC4uLgorCisgIEFsc28gdXNlZCB0byByZXR1cm4gc3luYyBldmVudHMgbG9jYWxseSBieSBCU0wKKworICBAcGFyYW0gcEhkZEhkbDogW2luXSBUaGUgSEREKEJTTCkgc3BlY2lmaWMgY29udGV4dCBmb3IgdGhpcyBhc3NvY2lhdGlvbi4KKyAgQlNMIGdldHMgdGhpcyBmcm9tIHRoZSBkb3duZ29pbmcgcGFja2V0cyBQaHlzaWNhbCBoYW5kbGUgdmFsdWUuCisgIEBwYXJhbSBwQmFwSENJRXZlbnQ6IFtpbl0gcG9pbnRlciB0byB0aGUgdW5pb24gb2YgIkhDSSBFdmVudCIgc3RydWN0dXJlcy4KKyAgQ29udGFpbnMgYWxsIGluZm8gbmVlZGVkIGZvciBIQ0kgZXZlbnQuCisgIEBwYXJhbSBBc3NvY1NwZWNpZmljRXZlbnQ6IFtpbl0gZmxhZyBpbmRpY2F0ZXMgYXNzb2Mtc3BlY2lmaWMgKDEpIG9yCisgIGdsb2JhbCAoMCkgZXZlbnQKKworICBAcmV0dXJuCisgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBwQmFwSENJRXZlbnQgaXMgTlVMTAorICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisqLworc3RhdGljIFZPU19TVEFUVVMgV0xBTkJBUF9FdmVudENCCisoCisgICAgdl9QVk9JRF90ICAgICAgcEhkZEhkbCwgICAvKiB0aGlzIGNvdWxkIHJlZmVyIHRvIGVpdGhlciB0aGUgQlNMIHBlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGlvbiBjb250ZXh0IHdoaWNoIGdvdCBwYXNzZWQgaW4gZHVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGRhdGEgcGxhbmUgT1IgdGhlIEJTTCBwZXIgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCBwYXNzZWQgaW4gZHVyaW5nIHJlZ2lzdGVyIEJBUCBjYWxsYmFja3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gc2V0dGluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIGJlbG93ICovCisgICAgdHBCdGFtcEhDSV9FdmVudCBwQmFwSENJRXZlbnQsIC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzIGluY2x1ZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgQ29tcGxldGUgYW5kIENvbW1hbmQgU3RhdHVzKi8KKyAgICB2X0JPT0xfdCBBc3NvY1NwZWNpZmljRXZlbnQgLyogRmxhZyB0byBpbmRpY2F0ZSBnbG9iYWwgb3IgYXNzb2Mtc3BlY2lmaWMgZXZlbnQgKi8KKykKK3sKKyAgICBCc2xDbGllbnRDdHhUeXBlKiBwY3R4OworICAgIFZPU19TVEFUVVMgVm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHZvc19wa3RfdCogcFZvc1BrdDsKKyAgICB2X1UzMl90IFBhY2tTdGF0dXM7CisgICAgc3RhdGljIHZfVThfdCBCdWZmW0JTTF9NQVhfRVZFTlRfU0laRV07IC8vIHN0YWNrIG92ZXJmbG93PworICAgIHZfVTMyX3QgV3JpdHRlbiA9IDA7IC8vIEZyYW1lc0MgUkVRVUlSRVMgdGhpcworICAgIHZfVTMyX3QgT2xkTWFwVmFsOworICAgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisgICAgLy8gc2FuaXR5IGNoZWNraW5nCisgICAgaWYgKCBwQmFwSENJRXZlbnQgPT0gTlVMTCApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOQkFQX0V2ZW50Q0IgYmFkIGlucHV0XG4iICk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiV0xBTkJBUF9FdmVudENCIGV2ZW50PSVkICIKKyAgICAgICAiYXNzb2Nfc3BlY2lmaWM9JWRcbiIsIHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlLCBBc3NvY1NwZWNpZmljRXZlbnQgKTsKKworICAgIGlmICggcEhkZEhkbCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIC8qIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXJyb3Igc2NlbmFyaW9zIHRvIGJ5cGFzcyB0aGUgTlVMTCBjaGVjazogCisgICAgICAgIC0gY3JlYXRlIExMIHdpdGhvdXQgYSBjYWxsIGZvciBjcmVhdGUgUEwgYmVmb3JlIAorICAgICAgICAtIGRlbGV0ZSBMTCBvciBQTCB3aGVuIG5vIEFNUCBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkIHlldCAKKyAgICAgICAgQ2xpZW50IGNvbnRleHQgaXMgdW5pbXBvcnRhbnQgZnJvbSBIQ0kgcG9pbnQgb2Ygdmlldywgb25seSBuZWVkZWQgYnkgdGhlIFRMViBBUEkgaW4gQkFQIAorICAgICAgICBUT0RPOiBDaGFuZ2UgdGhlIFRMViBBUElzIHRvIG5vdCB0byBjYXJyeSB0aGUgY2xpZW50IGNvbnRleHQ7IGl0IGRvZXNuJ3QgdXNlIGl0IGFueXdheSAKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCggQXNzb2NTcGVjaWZpY0V2ZW50ICkgJiYgCisgICAgICAgICAgICAoQlRBTVBfVExWX0hDSV9QSFlTSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UICE9IHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlKSAmJgorICAgICAgICAgICAgKEJUQU1QX1RMVl9IQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UICE9IHBCYXBIQ0lFdmVudC0+YmFwSENJRXZlbnRDb2RlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGN0eCA9IGdwQnNsY3R4OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiV0xBTkJBUF9FdmVudENCIGJhZCBpbnB1dFxuIiApOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpZihOVUxMICE9IHBIZGRIZGwpCisgICAgeworICAgICAgICBpZiAoIEFzc29jU3BlY2lmaWNFdmVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGdldCB0aGUgYXBwIGNvbnRleHQgZnJvbSB0aGUgYXNzb2MgY29udGV4dAorICAgICAgICAgICAgcGN0eCA9ICgoQnNsUGh5TGlua0N0eFR5cGUgKilwSGRkSGRsKS0+cENsaWVudEN0eDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBjdHggPSAoQnNsQ2xpZW50Q3R4VHlwZSAqKXBIZGRIZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihOVUxMID09IHBjdHgpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAicGN0eCBpcyBOVUxMIGluICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworCisgICAgfQorCisgICAgVm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0KCAmcFZvc1BrdCwgVk9TX1BLVF9UWVBFX1JYX1JBVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTTF9NQVhfRVZFTlRfU0laRSwgMSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU5CQVBfRXZlbnRDQiB2b3NfcGt0X2dldF9wYWNrZXQgIgorICAgICAgICAgICJmYWlsZWQgc3RhdHVzPSVkXG4iLCBWb3NTdGF0dXMgKTsKKyAgICAgICAgcmV0dXJuKFZvc1N0YXR1cyk7CisgICAgfQorCisgICAgc3dpdGNoICggcEJhcEhDSUV2ZW50LT5iYXBIQ0lFdmVudENvZGUgKQorICAgIHsKKyAgICAgICAgLyoqIEJUIGV2ZW50cyAqLworICAgIGNhc2UgQlRBTVBfVExWX0hDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UOgorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIEJUQU1QX1RMVl9IQ0lfUkVTRVRfQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9GTFVTSF9DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX0xPR0lDQUxfTElOS19DQU5DRUxfQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9TRVRfRVZFTlRfTUFTS19DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX1JFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVF9DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX1dSSVRFX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVRfQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9SRUFEX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVF9DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX1dSSVRFX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVF9DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX1JFQURfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUX0NNRDoKKyAgICAgICAgICAgIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUX0NNRDoKKyAgICAgICAgICAgIEJUQU1QX1RMVl9IQ0lfU0VUX0VWRU5UX01BU0tfUEFHRV8yX0NNRDoKKyAgICAgICAgICAgIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBVElPTl9EQVRBX0NNRDoKKyAgICAgICAgICAgIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTE9DQVRJT05fREFUQV9DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX1JFQURfRkxPV19DT05UUk9MX01PREVfQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9XUklURV9GTE9XX0NPTlRST0xfTU9ERV9DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX1JFQURfQkVTVF9FRkZPUlRfRkxVU0hfVE9fQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9XUklURV9CRVNUX0VGRk9SVF9GTFVTSF9UT19DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX1NFVF9TSE9SVF9SQU5HRV9NT0RFX0NNRDoKKyAgICAgICAgICAgIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9WRVJTSU9OX0lORk9STUFUSU9OX0NNRDoKKyAgICAgICAgICAgIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9TVVBQT1JURURfQ09NTUFORFNfQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9SRUFEX0JVRkZFUl9TSVpFX0NNRDoKKyAgICAgICAgICAgIEJUQU1QX1RMVl9IQ0lfUkVBRF9EQVRBX0JMT0NLX1NJWkVfQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9SRUFEX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJfQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9SRVNFVF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSX0NNRDoKKyAgICAgICAgICAgIEJUQU1QX1RMVl9IQ0lfUkVBRF9MSU5LX1FVQUxJVFlfQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9SRUFEX1JTU0lfQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX0FNUF9JTkZPUk1BVElPTl9DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX1JFQURfTE9DQUxfQU1QX0FTU09DX0NNRDoKKyAgICAgICAgICAgIEJUQU1QX1RMVl9IQ0lfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQ19DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX1JFQURfTE9PUEJBQ0tfTU9ERV9DTUQ6CisgICAgICAgICAgICBCVEFNUF9UTFZfSENJX1dSSVRFX0xPT1BCQUNLX01PREVfQ01EOgorICAgICAgICAgICAgQlRBTVBfVExWX0hDSV9WRU5ET1JfU1BFQ0lGSUNfQ01EXzA6CisKKyAgICAgICAgICovCisKKyAgICAgICAgLy8gcGFjaworICAgICAgICBQYWNrU3RhdHVzID0gYnRhbXBQYWNrVGx2SENJX0NvbW1hbmRfQ29tcGxldGVfRXZlbnQoIHBjdHgsCisgICAgICAgICAgICAgICAgICAgICAmcEJhcEhDSUV2ZW50LT51LmJ0YW1wQ29tbWFuZENvbXBsZXRlRXZlbnQsIEJ1ZmYsIEJTTF9NQVhfRVZFTlRfU0laRSwgJldyaXR0ZW4gKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJXTEFOQkFQX0V2ZW50Q0I6IGJ0YW1wUGFja1RsdkhDSV9Db21tYW5kX0NvbXBsZXRlX0V2ZW50IGZhaWxlZCBzdGF0dXMgJWQiLCBQYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BrdCApOworCisgICAgICAgICAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkpOworCisgICAgICAgICAgICByZXR1cm4oVk9TX1NUQVRVU19FX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9DT01NQU5EX1NUQVRVU19FVkVOVDoKKyAgICB7CisgICAgICAgIC8vIHBhY2sKKyAgICAgICAgUGFja1N0YXR1cyA9IGJ0YW1wUGFja1RsdkhDSV9Db21tYW5kX1N0YXR1c19FdmVudCggcGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICZwQmFwSENJRXZlbnQtPnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQsIEJ1ZmYsIEJTTF9NQVhfRVZFTlRfU0laRSwgJldyaXR0ZW4gKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJXTEFOQkFQX0V2ZW50Q0I6IGJ0YW1wUGFja1RsdkhDSV9Db21tYW5kX1N0YXR1c19FdmVudCBmYWlsZWQgc3RhdHVzICVkIiwgUGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKworICAgICAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKTsKKworICAgICAgICAgICAgcmV0dXJuKFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfTlVNX09GX0NPTVBMRVRFRF9QS1RTX0VWRU5UOgorICAgIHsKKyAgICAgICAgLy8gcGFjaworICAgICAgICBQYWNrU3RhdHVzID0gYnRhbXBQYWNrVGx2SENJX051bV9Db21wbGV0ZWRfUGt0c19FdmVudCggcGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICZwQmFwSENJRXZlbnQtPnUuYnRhbXBOdW1PZkNvbXBsZXRlZFBrdHNFdmVudCwgQnVmZiwgQlNMX01BWF9FVkVOVF9TSVpFLCAmV3JpdHRlbiApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggUGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5CQVBfRXZlbnRDQjogYnRhbXBQYWNrVGx2SENJX051bV9Db21wbGV0ZWRfUGt0c19FdmVudCBmYWlsZWQgc3RhdHVzICVkIiwgUGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKworICAgICAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKTsKKworICAgICAgICAgICAgcmV0dXJuKFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfTlVNX09GX0NPTVBMRVRFRF9EQVRBX0JMT0NLU19FVkVOVDoKKyAgICB7CisgICAgICAgIC8vIHBhY2sKKyAgICAgICAgUGFja1N0YXR1cyA9IGJ0YW1wUGFja1RsdkhDSV9OdW1fQ29tcGxldGVkX0RhdGFfQmxvY2tzX0V2ZW50KCBwY3R4LAorICAgICAgICAgICAgICAgICAgICAgJnBCYXBIQ0lFdmVudC0+dS5idGFtcE51bU9mQ29tcGxldGVkRGF0YUJsb2Nrc0V2ZW50LCBCdWZmLCBCU0xfTUFYX0VWRU5UX1NJWkUsICZXcml0dGVuICk7CisKKyAgICAgICAgaWYgKCAhQlRBTVBfU1VDQ0VFREVEKCBQYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiV0xBTkJBUF9FdmVudENCOiBidGFtcFBhY2tUbHZIQ0lfTnVtX0NvbXBsZXRlZF9EYXRhX0Jsb2Nrc19FdmVudCBmYWlsZWQgc3RhdHVzICVkIiwgUGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKworICAgICAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKTsKKworICAgICAgICAgICAgcmV0dXJuKFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfSEFSRFdBUkVfRVJST1JfRVZFTlQ6CisgICAgeworICAgICAgICAvLyBwYWNrCisgICAgICAgIFBhY2tTdGF0dXMgPSBidGFtcFBhY2tUbHZIQ0lfSGFyZHdhcmVfRXJyb3JfRXZlbnQoIHBjdHgsCisgICAgICAgICAgICAgICAgICAgICAmcEJhcEhDSUV2ZW50LT51LmJ0YW1wSGFyZHdhcmVFcnJvckV2ZW50LCBCdWZmLCBCU0xfTUFYX0VWRU5UX1NJWkUsICZXcml0dGVuICk7CisKKyAgICAgICAgaWYgKCAhQlRBTVBfU1VDQ0VFREVEKCBQYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiV0xBTkJBUF9FdmVudENCOiBidGFtcFVucGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgVm9zU3RhdHVzID0gdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwVm9zUGt0ICk7CisKKyAgICAgICAgICAgIFZPU19BU1NFUlQoVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSk7CisKKyAgICAgICAgICAgIHJldHVybihWT1NfU1RBVFVTX0VfRkFJTFVSRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX0ZMVVNIX09DQ1VSUkVEX0VWRU5UOgorICAgIHsKKyAgICAgICAgLy8gcGFjaworICAgICAgICBQYWNrU3RhdHVzID0gYnRhbXBQYWNrVGx2SENJX0ZsdXNoX09jY3VycmVkX0V2ZW50KCBwY3R4LAorICAgICAgICAgICAgICAgICAgICAgJnBCYXBIQ0lFdmVudC0+dS5idGFtcEZsdXNoT2NjdXJyZWRFdmVudCwgQnVmZiwgQlNMX01BWF9FVkVOVF9TSVpFLCAmV3JpdHRlbiApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggUGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5CQVBfRXZlbnRDQjogYnRhbXBQYWNrVGx2SENJX0ZsdXNoX09jY3VycmVkX0V2ZW50IGZhaWxlZCBzdGF0dXMgJWQiLCBQYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BrdCApOworCisgICAgICAgICAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkpOworCisgICAgICAgICAgICByZXR1cm4oVk9TX1NUQVRVU19FX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9FTkhBTkNFRF9GTFVTSF9DT01QTEVURV9FVkVOVDoKKyAgICB7CisgICAgICAgIC8vIHBhY2sKKyAgICAgICAgUGFja1N0YXR1cyA9IGJ0YW1wUGFja1RsdkhDSV9FbmhhbmNlZF9GbHVzaF9Db21wbGV0ZV9FdmVudCggcGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICZwQmFwSENJRXZlbnQtPnUuYnRhbXBFbmhhbmNlZEZsdXNoQ29tcGxldGVFdmVudCwgQnVmZiwgQlNMX01BWF9FVkVOVF9TSVpFLCAmV3JpdHRlbiApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggUGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5CQVBfRXZlbnRDQjogYnRhbXBQYWNrVGx2SENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlX0V2ZW50IGZhaWxlZCBzdGF0dXMgJWQiLCBQYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BrdCApOworCisgICAgICAgICAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkpOworCisgICAgICAgICAgICByZXR1cm4oVk9TX1NUQVRVU19FX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9MT09QQkFDS19DT01NQU5EX0VWRU5UOgorICAgIHsKKyAgICAgICAgLy8gcGFjaworICAgICAgICBQYWNrU3RhdHVzID0gYnRhbXBQYWNrVGx2SENJX0xvb3BiYWNrX0NvbW1hbmRfRXZlbnQoIHBjdHgsCisgICAgICAgICAgICAgICAgICAgICAmcEJhcEhDSUV2ZW50LT51LmJ0YW1wTG9vcGJhY2tDb21tYW5kRXZlbnQsIEJ1ZmYsIEJTTF9NQVhfRVZFTlRfU0laRSwgJldyaXR0ZW4gKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJXTEFOQkFQX0V2ZW50Q0I6IGJ0YW1wVW5wYWNrVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgUGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKworICAgICAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKTsKKworICAgICAgICAgICAgcmV0dXJuKFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfREFUQV9CVUZGRVJfT1ZFUkZMT1dfRVZFTlQ6CisgICAgeworICAgICAgICAvLyBwYWNrCisgICAgICAgIFBhY2tTdGF0dXMgPSBidGFtcFBhY2tUbHZIQ0lfRGF0YV9CdWZmZXJfT3ZlcmZsb3dfRXZlbnQoIHBjdHgsCisgICAgICAgICAgICAgICAgICAgICAmcEJhcEhDSUV2ZW50LT51LmJ0YW1wRGF0YUJ1ZmZlck92ZXJmbG93RXZlbnQsIEJ1ZmYsIEJTTF9NQVhfRVZFTlRfU0laRSwgJldyaXR0ZW4gKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJXTEFOQkFQX0V2ZW50Q0I6IGJ0YW1wVW5wYWNrVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgUGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKworICAgICAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKTsKKworICAgICAgICAgICAgcmV0dXJuKFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfUU9TX1ZJT0xBVElPTl9FVkVOVDoKKyAgICB7CisgICAgICAgIC8vIHBhY2sKKyAgICAgICAgUGFja1N0YXR1cyA9IGJ0YW1wUGFja1RsdkhDSV9Rb3NfVmlvbGF0aW9uX0V2ZW50KCBwY3R4LAorICAgICAgICAgICAgICAgICAgICAgJnBCYXBIQ0lFdmVudC0+dS5idGFtcFFvc1Zpb2xhdGlvbkV2ZW50LCBCdWZmLCBCU0xfTUFYX0VWRU5UX1NJWkUsICZXcml0dGVuICk7CisKKyAgICAgICAgaWYgKCAhQlRBTVBfU1VDQ0VFREVEKCBQYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiV0xBTkJBUF9FdmVudENCOiBidGFtcFVucGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgVm9zU3RhdHVzID0gdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwVm9zUGt0ICk7CisKKyAgICAgICAgICAgIFZPU19BU1NFUlQoVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSk7CisKKyAgICAgICAgICAgIHJldHVybihWT1NfU1RBVFVTX0VfRkFJTFVSRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgLyoqIEJUIHYzLjAgZXZlbnRzICovCisgICAgY2FzZSBCVEFNUF9UTFZfSENJX0dFTkVSSUNfQU1QX0xJTktfS0VZX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICB7CisgICAgICAgIC8vIHBhY2sKKyAgICAgICAgUGFja1N0YXR1cyA9IGJ0YW1wUGFja1RsdkhDSV9HZW5lcmljX0FNUF9MaW5rX0tleV9Ob3RpZmljYXRpb25fRXZlbnQoIHBjdHgsCisgICAgICAgICAgICAgICAgICAgICAmcEJhcEhDSUV2ZW50LT51LmJ0YW1wR2VuZXJpY0FNUExpbmtLZXlOb3RpZmljYXRpb25FdmVudCwgQnVmZiwgQlNMX01BWF9FVkVOVF9TSVpFLCAmV3JpdHRlbiApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggUGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5CQVBfRXZlbnRDQjogYnRhbXBVbnBhY2tUbHZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBQYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BrdCApOworCisgICAgICAgICAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkpOworCisgICAgICAgICAgICByZXR1cm4oVk9TX1NUQVRVU19FX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9QSFlTSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UOgorICAgIHsKKyAgICAgICAgLy8gcGFjaworICAgICAgICBQYWNrU3RhdHVzID0gYnRhbXBQYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQoIHBjdHgsCisgICAgICAgICAgICAgICAgICAgICAmcEJhcEhDSUV2ZW50LT51LmJ0YW1wUGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudCwgQnVmZiwgQlNMX01BWF9FVkVOVF9TSVpFLCAmV3JpdHRlbiApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggUGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5CQVBfRXZlbnRDQjogYnRhbXBVbnBhY2tUbHZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBQYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BrdCApOworCisgICAgICAgICAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkpOworCisgICAgICAgICAgICByZXR1cm4oVk9TX1NUQVRVU19FX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbG9vayBhdCB0aGlzIGV2ZW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGNsZWFudXAgdGhlIFBIWSBjb250ZXh0CisgICAgICAgIGlmICggcEJhcEhDSUV2ZW50LT51LmJ0YW1wUGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPT0KKyAgICAgICAgICAgICAgICBXTEFOQkFQX1NUQVRVU19TVUNDRVNTICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGRhdGEgcGxhbmUgbm93CisgICAgICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX1JlZ2lzdGVyRGF0YVBsYW5lKCBwY3R4LT5iYXBIZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOQkFQX1NUQUZldGNoUGt0Q0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOQkFQX1NUQVJ4Q0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOQkFQX1R4Q29tcENCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJzbFBoeUxpbmtDdHhUeXBlICopcEhkZEhkbCApOworCisgICAgICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOQkFQX0V2ZW50Q0IgV0xBTkJBUF9SZWdpc3RlckRhdGFQbGFuZSAiCisgICAgICAgICAgICAgICAgICAiZmFpbGVkIHN0YXR1cyA9ICVkXG4iLCBWb3NTdGF0dXMgKTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBzdGlsbCB3YW50IHRvIHNlbmQgdGhlIGV2ZW50IHVwdG8gYXBwIHNvIGRvIG5vdCBiYWlsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBwaHkgbGluayBoYW5kbGUgYmFzZWQgbWFwIHNvIFRYIGRhdGEgY2FuIHN0YXJ0IGZsb3dpbmcgdGhyb3VnaAorICAgICAgICAgICAgICAgIE9sZE1hcFZhbCA9IHZvc19hdG9taWNfc2V0X1UzMiggKHZfVTMyX3QgKilCc2xQaHlMaW5rTWFwK3BCYXBIQ0lFdmVudC0+dS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQucGh5X2xpbmtfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVTMyX3QpIHBIZGRIZGwgKTsKKworLy8gICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKCBPbGRNYXBWYWwgPT0gMCApOy8vQ29tbWVudGVkIHRvIHRlc3QgcmVjb25uZWN0CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHBCYXBIQ0lFdmVudC0+dS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID09CisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0hPU1RfUkVKX1JFU09VUkNFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJzbFJlbGVhc2VQaHlDdHgoIChCc2xQaHlMaW5rQ3R4VHlwZSAqKXBIZGRIZGwgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggcEJhcEhDSUV2ZW50LT51LmJ0YW1wUGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPT0KKyAgICAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfSE9TVF9USU1FT1VUICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9XZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcGh5IGxpbmsgaGFuZGxlIGhlcmUgdG8gYmUgYWJsZSB0byByZWlzc3VlIHBoeXNpY2FsIGxpbmsgYWNjZXB0CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBoeSBsaW5rIGhhbmRsZSBiYXNlZCBtYXAgc28gVFggZGF0YSBjYW4gc3RhcnQgZmxvd2luZyB0aHJvdWdoCisgICAgICAgICAgICBPbGRNYXBWYWwgPSB2b3NfYXRvbWljX3NldF9VMzIoICh2X1UzMl90ICopQnNsUGh5TGlua01hcCtwQmFwSENJRXZlbnQtPnUuYnRhbXBQaHlzaWNhbExpbmtDb21wbGV0ZUV2ZW50LnBoeV9saW5rX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVTMyX3QpIHBIZGRIZGwgKTsKKworLy8gICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKCBPbGRNYXBWYWwgPT0gMCApOy8vQ29tbWVudGVkIHRvIHRlc3QgcmVjb25uZWN0CisKKyAgICAgICAgICAgIEJzbFJlbGVhc2VQaHlDdHgoIChCc2xQaHlMaW5rQ3R4VHlwZSAqKXBIZGRIZGwgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggcEJhcEhDSUV2ZW50LT51LmJ0YW1wUGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPT0KKyAgICAgICAgICAgICAgICAgIFdMQU5CQVBfRVJST1JfTUFYX05VTV9DTkNUUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vV2UgbmVlZCB0byB1cGRhdGUgdGhlIHBoeSBsaW5rIGhhbmRsZSBoZXJlIHRvIGJlIGFibGUgdG8gcmVpc3N1ZSBwaHlzaWNhbCBsaW5rIC9jcmVhdGUvYWNjZXB0CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBoeSBsaW5rIGhhbmRsZSBiYXNlZCBtYXAgc28gVFggZGF0YSBjYW4gc3RhcnQgZmxvd2luZyB0aHJvdWdoCisgICAgICAgICAgICBPbGRNYXBWYWwgPSB2b3NfYXRvbWljX3NldF9VMzIoICh2X1UzMl90ICopQnNsUGh5TGlua01hcCtwQmFwSENJRXZlbnQtPnUuYnRhbXBQaHlzaWNhbExpbmtDb21wbGV0ZUV2ZW50LnBoeV9saW5rX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVTMyX3QpIHBIZGRIZGwgKTsKKy8vICAgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCggT2xkTWFwVmFsID09IDAgKTsvL0NvbW1lbnRlZCB0byB0ZXN0IHJlY29ubmVjdAorCisgICAgICAgICAgICBCc2xSZWxlYXNlUGh5Q3R4KCAoQnNsUGh5TGlua0N0eFR5cGUgKilwSGRkSGRsICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHBCYXBIQ0lFdmVudC0+dS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID09CisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX0hPU1RfVElNRU9VVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJzbFJlbGVhc2VQaHlDdHgoIChCc2xQaHlMaW5rQ3R4VHlwZSAqKXBIZGRIZGwgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggcEJhcEhDSUV2ZW50LT51LmJ0YW1wUGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5zdGF0dXMgPT0KKyAgICAgICAgICAgICAgICAgIDB4MTYgLyogV0xBTkJBUF9FUlJPUl9GQUlMRURfQ09OTkVDVElPTj8gKi8gKQorICAgICAgICB7CisgICAgICAgICAgICBCc2xSZWxlYXNlUGh5Q3R4KCAoQnNsUGh5TGlua0N0eFR5cGUgKilwSGRkSGRsICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHBCYXBIQ0lFdmVudC0+dS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID09CisgICAgICAgICAgICAgICAgICAweDggLyogV0xBTkJBUF9FUlJPUl9BVVRIX0ZBSUxFRD8gKi8gKQorICAgICAgICB7CisgICAgICAgICAgICBCc2xSZWxlYXNlUGh5Q3R4KCAoQnNsUGh5TGlua0N0eFR5cGUgKilwSGRkSGRsICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHBCYXBIQ0lFdmVudC0+dS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID09CisgICAgICAgICAgICAgICAgICBXTEFOQkFQX0VSUk9SX05PX0NOQ1QgKQorICAgICAgICB7CisgICAgICAgICAgICBCc2xSZWxlYXNlUGh5Q3R4KCAoQnNsUGh5TGlua0N0eFR5cGUgKilwSGRkSGRsICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOQkFQX0V2ZW50Q0IgdW5leHBlY3RlZCBIQ0kgUGh5IExpbmsgQ29tcCBFdnQgIgorICAgICAgICAgICAgICAgInN0YXR1cyA9JWRcbiIsIHBCYXBIQ0lFdmVudC0+dS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzICk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX0NIQU5ORUxfU0VMRUNURURfRVZFTlQ6CisgICAgeworICAgICAgICAvLyBwYWNrCisgICAgICAgIFBhY2tTdGF0dXMgPSBidGFtcFBhY2tUbHZIQ0lfQ2hhbm5lbF9TZWxlY3RlZF9FdmVudCggcGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICZwQmFwSENJRXZlbnQtPnUuYnRhbXBDaGFubmVsU2VsZWN0ZWRFdmVudCwgQnVmZiwgQlNMX01BWF9FVkVOVF9TSVpFLCAmV3JpdHRlbiApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggUGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5CQVBfRXZlbnRDQjogYnRhbXBVbnBhY2tUbHZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBQYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BrdCApOworCisgICAgICAgICAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkpOworCisgICAgICAgICAgICByZXR1cm4oVk9TX1NUQVRVU19FX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTktfQ09NUExFVEVfRVZFTlQ6CisgICAgeworICAgICAgICAvLyBwYWNrCisgICAgICAgIFBhY2tTdGF0dXMgPSBidGFtcFBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NvbXBsZXRlX0V2ZW50KCBwY3R4LAorICAgICAgICAgICAgICAgICAgICAgJnBCYXBIQ0lFdmVudC0+dS5idGFtcERpc2Nvbm5lY3RQaHlzaWNhbExpbmtDb21wbGV0ZUV2ZW50LCBCdWZmLCBCU0xfTUFYX0VWRU5UX1NJWkUsICZXcml0dGVuICk7CisKKyAgICAgICAgaWYgKCAhQlRBTVBfU1VDQ0VFREVEKCBQYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiV0xBTkJBUF9FdmVudENCOiBidGFtcFVucGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgVm9zU3RhdHVzID0gdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwVm9zUGt0ICk7CisKKyAgICAgICAgICAgIFZPU19BU1NFUlQoVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSk7CisKKyAgICAgICAgICAgIHJldHVybihWT1NfU1RBVFVTX0VfRkFJTFVSRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBuZWVkIHRvIGNsZWFudXAgdGhlIFBIWSBjb250ZXh0IGFsd2F5cyBidXQgaGF2ZSB0aGVzZSBjaGVja3MgdG8gbWFrZQorICAgICAgICAvLyBzdXJlIHdlIGNhdGNoIHVuZXhwZWN0ZWQgYmVoYXZpb3IsIHN0cmFuZ2VseSBlbm91Z2ggZXZlbiB3aGVuIHBlZXIgdHJpZ2dlcnMKKyAgICAgICAgLy8gdGhlIGRpc2Nvbm5lY3QgdGhlIHJlYXNvbiBjb2RlIGlzIHN0aWxsIDB4MTYsIHdlaXJkCisgICAgICAgIGlmICggcEJhcEhDSUV2ZW50LT51LmJ0YW1wRGlzY29ubmVjdFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQuc3RhdHVzID09IFdMQU5CQVBfU1RBVFVTX1NVQ0NFU1MgJiYKKyAgICAgICAgICAgICAgICBwQmFwSENJRXZlbnQtPnUuYnRhbXBEaXNjb25uZWN0UGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5yZWFzb24gPT0gV0xBTkJBUF9FUlJPUl9URVJNX0JZX0xPQ0FMX0hPU1QgKQorICAgICAgICB7CisgICAgICAgICAgICBCc2xSZWxlYXNlUGh5Q3R4KCAoQnNsUGh5TGlua0N0eFR5cGUgKilwSGRkSGRsICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOQkFQX0V2ZW50Q0IgdW5leHBlY3RlZCBIQ0kgRGlzIFBoeSBMaW5rIENvbXAgRXZ0ICIKKyAgICAgICAgICAgICAgICJzdGF0dXMgPSVkIHJlYXNvbiA9JWRcbiIsIHBCYXBIQ0lFdmVudC0+dS5idGFtcERpc2Nvbm5lY3RQaHlzaWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgcEJhcEhDSUV2ZW50LT51LmJ0YW1wRGlzY29ubmVjdFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQucmVhc29uICk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX1BIWVNJQ0FMX0xJTktfTE9TU19XQVJOSU5HX0VWRU5UOgorICAgIHsKKyAgICAgICAgLy8gcGFjaworICAgICAgICBQYWNrU3RhdHVzID0gYnRhbXBQYWNrVGx2SENJX1BoeXNpY2FsX0xpbmtfTG9zc19XYXJuaW5nX0V2ZW50KCBwY3R4LAorICAgICAgICAgICAgICAgICAgICAgJnBCYXBIQ0lFdmVudC0+dS5idGFtcFBoeXNpY2FsTGlua0xvc3NXYXJuaW5nRXZlbnQsIEJ1ZmYsIEJTTF9NQVhfRVZFTlRfU0laRSwgJldyaXR0ZW4gKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJXTEFOQkFQX0V2ZW50Q0I6IGJ0YW1wVW5wYWNrVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgUGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKworICAgICAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKTsKKworICAgICAgICAgICAgcmV0dXJuKFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfUEhZU0lDQUxfTElOS19SRUNPVkVSWV9FVkVOVDoKKyAgICB7CisgICAgICAgIC8vIHBhY2sKKyAgICAgICAgUGFja1N0YXR1cyA9IGJ0YW1wUGFja1RsdkhDSV9QaHlzaWNhbF9MaW5rX1JlY292ZXJ5X0V2ZW50KCBwY3R4LAorICAgICAgICAgICAgICAgICAgICAgJnBCYXBIQ0lFdmVudC0+dS5idGFtcFBoeXNpY2FsTGlua1JlY292ZXJ5RXZlbnQsIEJ1ZmYsIEJTTF9NQVhfRVZFTlRfU0laRSwgJldyaXR0ZW4gKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJXTEFOQkFQX0V2ZW50Q0I6IGJ0YW1wVW5wYWNrVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgUGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKworICAgICAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKTsKKworICAgICAgICAgICAgcmV0dXJuKFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfTE9HSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UOgorICAgIHsKKyAgICAgICAgLy8gcGFjaworICAgICAgICBQYWNrU3RhdHVzID0gYnRhbXBQYWNrVGx2SENJX0xvZ2ljYWxfTGlua19Db21wbGV0ZV9FdmVudCggcGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICZwQmFwSENJRXZlbnQtPnUuYnRhbXBMb2dpY2FsTGlua0NvbXBsZXRlRXZlbnQsIEJ1ZmYsIEJTTF9NQVhfRVZFTlRfU0laRSwgJldyaXR0ZW4gKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJXTEFOQkFQX0V2ZW50Q0I6IGJ0YW1wVW5wYWNrVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgUGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKworICAgICAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKTsKKworICAgICAgICAgICAgcmV0dXJuKFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTktfQ09NUExFVEVfRVZFTlQ6CisgICAgeworICAgICAgICAvLyBwYWNrCisgICAgICAgIFBhY2tTdGF0dXMgPSBidGFtcFBhY2tUbHZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ29tcGxldGVfRXZlbnQoIHBjdHgsCisgICAgICAgICAgICAgICAgICAgICAmcEJhcEhDSUV2ZW50LT51LmJ0YW1wRGlzY29ubmVjdExvZ2ljYWxMaW5rQ29tcGxldGVFdmVudCwgQnVmZiwgQlNMX01BWF9FVkVOVF9TSVpFLCAmV3JpdHRlbiApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggUGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5CQVBfRXZlbnRDQjogYnRhbXBVbnBhY2tUbHZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBQYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BrdCApOworCisgICAgICAgICAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkpOworCisgICAgICAgICAgICByZXR1cm4oVk9TX1NUQVRVU19FX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9GTE9XX1NQRUNfTU9ESUZZX0NPTVBMRVRFX0VWRU5UOgorICAgIHsKKyAgICAgICAgLy8gcGFjaworICAgICAgICBQYWNrU3RhdHVzID0gYnRhbXBQYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGVfRXZlbnQoIHBjdHgsCisgICAgICAgICAgICAgICAgICAgICAmcEJhcEhDSUV2ZW50LT51LmJ0YW1wRmxvd1NwZWNNb2RpZnlDb21wbGV0ZUV2ZW50LCBCdWZmLCBCU0xfTUFYX0VWRU5UX1NJWkUsICZXcml0dGVuICk7CisKKyAgICAgICAgaWYgKCAhQlRBTVBfU1VDQ0VFREVEKCBQYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiV0xBTkJBUF9FdmVudENCOiBidGFtcFVucGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgVm9zU3RhdHVzID0gdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwVm9zUGt0ICk7CisKKyAgICAgICAgICAgIFZPU19BU1NFUlQoVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSk7CisKKyAgICAgICAgICAgIHJldHVybihWT1NfU1RBVFVTX0VfRkFJTFVSRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX1NIT1JUX1JBTkdFX01PREVfQ0hBTkdFX0NPTVBMRVRFX0VWRU5UOgorICAgIHsKKyAgICAgICAgLy8gcGFjaworICAgICAgICBQYWNrU3RhdHVzID0gYnRhbXBQYWNrVGx2SENJX1Nob3J0X1JhbmdlX01vZGVfQ2hhbmdlX0NvbXBsZXRlX0V2ZW50KCBwY3R4LAorICAgICAgICAgICAgICAgICAgICAgJnBCYXBIQ0lFdmVudC0+dS5idGFtcFNob3J0UmFuZ2VNb2RlQ2hhbmdlQ29tcGxldGVFdmVudCwgQnVmZiwgQlNMX01BWF9FVkVOVF9TSVpFLCAmV3JpdHRlbiApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggUGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5CQVBfRXZlbnRDQjogYnRhbXBVbnBhY2tUbHZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBQYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BrdCApOworCisgICAgICAgICAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkpOworCisgICAgICAgICAgICByZXR1cm4oVk9TX1NUQVRVU19FX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOQkFQX0V2ZW50Q0IgdW5leHBlY3RlZCBldmVudFxuIiApOworCisgICAgICAgIFZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BrdCApOworCisgICAgICAgIFZPU19BU1NFUlQoVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSk7CisKKyAgICAgICAgcmV0dXJuKFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKworICAgIFZPU19BU1NFUlQoV3JpdHRlbiA8PSBCU0xfTUFYX0VWRU5UX1NJWkUpOworCisgICAgLy8gc3RpY2sgdGhlIGV2ZW50IGludG8gYSBWb1MgcGt0CisgICAgVm9zU3RhdHVzID0gdm9zX3BrdF9wdXNoX2hlYWQoIHBWb3NQa3QsIEJ1ZmYsIFdyaXR0ZW4gKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTkJBUF9FdmVudENCIHZvc19wa3RfcHVzaF9oZWFkICIKKyAgICAgICAgICAic3RhdHVzID0lZFxuIiwgVm9zU3RhdHVzICk7CisKKyAgICAgICAgICAgIC8vIHJldHVybiB0aGUgcGFja2V0CisgICAgICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKyAgICAgICAgICAgIFZPU19BU1NFUlQoVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSk7CisKKyAgICAgICAgICAgIHJldHVybihWT1NfU1RBVFVTX0VfRkFJTFVSRSk7CisgICAgICAgIH0KKworICAgIC8vIEV4dHJhY3QgdGhlIE9TIHBhY2tldCAoc2tiKS4KKyAgICAvLyBUZWxsIFZPUyB0byBkZXRhY2ggdGhlIE9TIHBhY2tldCBmcm9tIHRoZSBWT1MgcGFja2V0CisgICAgVm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfb3NfcGFja2V0KCBwVm9zUGt0LCAodl9WT0lEX3QgKiopJnNrYiwgVk9TX1RSVUUgKTsKKyAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBGYWlsdXJlIGV4dHJhY3Rpbmcgc2tiIGZyb20gdm9zIHBrdC4gIgorICAgICAgICAgICJWb3NTdGF0dXMgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBWb3NTdGF0dXMgKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIHBhY2tldAorICAgICAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKyAgICAgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApKTsKKworICAgICAgICByZXR1cm4oVk9TX1NUQVRVU19FX0ZBSUxVUkUpOworICAgIH0KKworICAgIC8vSkVaMTAwOTIyOiBXZSBhcmUgZnJlZSB0byByZXR1cm4gdGhlIGVuY2xvc2luZyBWT1NTIHBhY2tldC4KKyAgICBWb3NTdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBWb3NQa3QgKTsKKyAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkpOworCisgICAgLy9KRVoxMDA4MDk6IFdoaWxlIGFuIHNrYiBpcyBiZWluZyBoYW5kbGVkIGJ5IHRoZSBrZXJuZWwsIGlzICJza2ItPmRldiIgZGUtcmVmJ2Q/CisgICAgc2tiLT5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZ3BCc2xjdHgtPmhkZXY7CisgICAgYnRfY2Ioc2tiKS0+cGt0X3R5cGUgPSBIQ0lfRVZFTlRfUEtUOworICAgIC8vc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworICAgIC8vc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworICAgIC8vIFRoaXMgaXMgbXkgcmVjZWl2ZSBza2IgcG9pbnRlcgorICAgIGdwQnNsY3R4LT5yeF9za2IgPSBza2I7CisKKyAgICAvLyBUaGlzIGlzIGhvdyBkYXRhIGFuZCBldmVudHMgYXJlIHBhc3NlZCB1cCB0byBCbHVlWgorICAgIGhjaV9yZWN2X2ZyYW1lKGdwQnNsY3R4LT5yeF9za2IpOworCisgICAgcmV0dXJuKFZPU19TVEFUVVNfU1VDQ0VTUyk7Cit9IC8vIFdMQU5CQVBfRXZlbnRDQigpCisKK3N0YXRpYyBWT1NfU1RBVFVTICAKK1dMQU5CQVBfUGh5TGlua0ZhaWx1cmUKKyggCisgICAgQnNsQ2xpZW50Q3R4VHlwZSogcGN0eCwKKyAgICB2X1U4X3QgICAgICAgcGh5X2xpbmtfaGFuZGxlCispCit7CisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzOworICAgIHRCdGFtcEhDSV9FdmVudCBiYXBIQ0lFdmVudDsKKworICAgIC8qIEZvcm1hdCB0aGUgUGh5c2ljYWwgTGluayBDb21wbGV0ZSBldmVudCB0byByZXR1cm4uLi4gKi8gCisgICAgYmFwSENJRXZlbnQuYmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9QSFlTSUNBTF9MSU5LX0NPTVBMRVRFX0VWRU5UOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBQaHlzaWNhbExpbmtDb21wbGV0ZUV2ZW50LnByZXNlbnQgPSAxOworICAgIGJhcEhDSUV2ZW50LnUuYnRhbXBQaHlzaWNhbExpbmtDb21wbGV0ZUV2ZW50LnN0YXR1cyA9IFdMQU5CQVBfRVJST1JfVU5TUEVDSUZJRURfRVJST1I7CisgICAgYmFwSENJRXZlbnQudS5idGFtcFBoeXNpY2FsTGlua0NvbXBsZXRlRXZlbnQucGh5X2xpbmtfaGFuZGxlIAorICAgICAgICA9IHBoeV9saW5rX2hhbmRsZTsKKyAgICBiYXBIQ0lFdmVudC51LmJ0YW1wUGh5c2ljYWxMaW5rQ29tcGxldGVFdmVudC5jaF9udW1iZXIgCisgICAgICAgID0gMDsKKyAgICAvL1RCRDogQ291bGQgYmUgYSBjbGVhbmVyIHdheSB0byBnZXQgdGhlIFBoeUxpbmtDdHggaGFuZGxlOyBGb3Igbm93IHdvcmtzCisgICAgQnNsUGh5TGlua0N0eFswXS5wQ2xpZW50Q3R4ID0gcGN0eDsKKyAgICB2b3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoICZCc2xQaHlMaW5rQ3R4WzBdLCAmYmFwSENJRXZlbnQsIFRSVUUgKTsKKworICAgIHJldHVybiB2b3NTdGF0dXM7Cit9CisKKy8qKgorICBAYnJpZWYgQnNsRmluZEFuZEluaXRDbGllbnRDdHgoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBmaW5kIGFuZCBpbml0aWFsaXplIGEgY2xpZW50CisgIGEuay5hIGFwcCBjb250ZXh0CisKKyAgQHBhcmFtIHBjdHggOiBbaW5vdXRdIHB0ciB0byB0aGUgY2xpZW50IGNvbnRleHQKKworICBAcmV0dXJuCisgIFRSVUUgaWYgYWxsIE9LLCBGQUxTRSBvdGhlcndpc2UKKworKi8KK3N0YXRpYyBCT09MIEJzbEZpbmRBbmRJbml0Q2xpZW50Q3R4CisoCisgICAgQnNsQ2xpZW50Q3R4VHlwZSoqIHBjdHhfCispCit7CisgICAgVk9TX1NUQVRVUyBWb3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgQnNsQ2xpZW50Q3R4VHlwZSogcGN0eDsKKyAgICB2X1U4X3QgaTsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xGaW5kQW5kSW5pdENsaWVudEN0eFxuIiApOworCisgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIiVzOkJzbENsaWVudExvY2sgYWxyZWFkeSBpbml0ZWQiLF9fRlVOQ1RJT05fXyk7CisgICAgICAgIC8vIHJldHVybigwKTsKKyAgICB9CisKKyAgICBmb3IgKCBpPTA7IGkgPCBCU0xfTUFYX0NMSUVOVFM7IGkrKyApCisgICAgeworICAgICAgICBpZiAoICFCc2xDbGllbnRDdHhbaV0udXNlZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwiJXM6QnNsQ2xpZW50Q3R4WyVkXSBzZWxlY3RlZCIsX19GVU5DVElPTl9fLCBpKTsKKyAgICAgICAgICAgIEJzbENsaWVudEN0eFtpXS51c2VkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBpID09IEJTTF9NQVhfQ0xJRU5UUyApCisgICAgeworICAgICAgICAvLyBubyBtb3JlIGNsaWVudHMgY2FuIGJlIHN1cHBvcnRlZAorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJCc2xGaW5kQW5kSW5pdENsaWVudEN0eCBubyBtb3JlICIKKyAgICAgICAgICAiY2xpZW50cyBjYW4gYmUgc3VwcG9ydGVkIE1BWD0lZFxuIiwgQlNMX01BWF9DTElFTlRTICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvL3BjdHggPSBCc2xDbGllbnRDdHggKyBpOworICAgIHBjdHggPSBncEJzbGN0eDsKKworICAgIC8vIGdldCBhIGhhbmRsZSBmcm9tIEJBUAorICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfR2V0TmV3SG5kbCgmcGN0eC0+YmFwSGRsKTsKKworICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgcGN0eC0+dXNlZCA9IEZBTFNFOworCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczpXTEFOX0dldE5ld0huZGwgRmFpbGVkIixfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgfQorCisgICAgLy8gcmVnaXN0ZXIgdGhlIGV2ZW50IGNiIHdpdGggQkFQLCB0aGlzIGNiIGlzIHVzZWQgZm9yIEJPVEggYXNzb2NpYXRpb24KKyAgICAvLyBzcGVjaWZpYyBhbmQgbm9uLWFzc29jaWF0aW9uIHNwZWNpZmljIGV2ZW50IG5vdGlmaWNhdGlvbnMgYnkgQkFQLgorICAgIC8vIEhvd2V2ZXIgYXNzb2NpYXRpb24gc3BlY2lmaWMgZXZlbnRzIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBkaWZmZXJlbnQKKyAgICAvLyBjb29raWUgdGhhdCBpcyBwYXNzZWQgaW4gZHVyaW5nIHRoZSBwaHlzaWNhbCBsaW5rIGNyZWF0ZS9hY2NlcHQKKyAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFJlZ2lzdGVyQkFQQ2FsbGJhY2tzKCBwY3R4LT5iYXBIZGwsIFdMQU5CQVBfRXZlbnRDQiwgcGN0eCApOworCisgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgeworICAgICAgICBwY3R4LT51c2VkID0gRkFMU0U7CisKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOldMQU5fQkFQUmVnc2l0ZXJCQVBDYWxsYWJhY2sgRmFpbGVkIixfX0ZVTkNUSU9OX18pOworCisgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgfQorCisgICAgLy8gaW5pdCB0aGUgUGh5TGlua3MgcXVldWUgdG8ga2VlcCB0cmFjayBvZiB0aGUgYXNzb2MncyBvZiB0aGlzIGNsaWVudAorICAgIFZvc1N0YXR1cyA9IHZvc19saXN0X2luaXQoICZwY3R4LT5QaHlMaW5rcyApOworICAgIFZPU19BU1NFUlQoVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApOworCisgICAgKnBjdHhfID0gcGN0eDsKKworICAgIHJldHVybihUUlVFKTsKK30gLy9Cc2xGaW5kQW5kSW5pdENsaWVudEN0eCgpCisKKy8qKgorICBAYnJpZWYgQnNsUmVsZWFzZUNsaWVudEN0eCgpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIHJlbGVhc2UgYSBjbGllbnQgYS5rLmEuIGFwcAorICBjb250ZXh0CisKKyAgQHBhcmFtIHBjdHggOiBbaW5dIHB0ciB0byB0aGUgY2xpZW50IGNvbnRleHQKKworICBAcmV0dXJuCisgIE5vbmUKKworKi8KKy8vI2lmIDAKK3N0YXRpYyB2b2lkIEJzbFJlbGVhc2VDbGllbnRDdHgKKygKKyAgICBCc2xDbGllbnRDdHhUeXBlKiBwY3R4CispCit7CisgICAgVk9TX1NUQVRVUyBWb3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdm9zX2xpc3Rfbm9kZV90KiBwTGluazsKKyAgICBCc2xQaHlMaW5rc05vZGVUeXBlICpwUGh5Tm9kZTsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywgIkJzbFJlbGVhc2VDbGllbnRDdHhcbiIgKTsKKworICAgIC8vIGFuIGFwcCBjYW4gZG8gdGhpcyB3aXRob3V0IGNsZWFuaW5nIHVwIGFmdGVyIGl0c2VsZiBpLmUuIGl0IGNhbiBoYXZlIGFjdGl2ZSBhc3NvY2lhdGlvbnMgYW5kCisgICAgLy8gZGF0YSBwZW5kaW5nLCB3ZSBuZWVkIHRvIGNsZWFudXAgaXRzIG1lc3MKKworICAgIC8vIGZpcnN0IHRlbGwgQkFQIHdlIGRvbnQgd2FudCB0aGUgaGFuZGxlIGFueW1vcmUsIEJBUCB3aWxsIGNsZWFudXAgYWxsIHRoZSBhc3NvY2lhdGlvbnMgYW5kCisgICAgLy8gY29uc3VtZSByZXN1bHRpbmcgSENJIGV2ZW50cywgc28gYWZ0ZXIgdGhpcyB3ZSB3aWxsIG5vdCBnZXQgYW55IEhDSSBldmVudHMuIHdlIHdpbGwgYWxzbworICAgIC8vIG5vdCBzZWUgYW55IEZldGNoUGt0Q0IgYW5kIFJ4UGt0Q0IuIFdlIGNhbiBzdGlsbCBleHBlY3QgVHhDb21wbGV0ZVBrdENCCisgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9SZWxlYXNlSG5kbCggcGN0eC0+YmFwSGRsICk7CisgICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICk7CisKKworICAgIC8vIGZpbmQgYW5kIGZyZWUgYWxsIG9mIHRoZSBhc3NvY2lhdGlvbiBjb250ZXh0cyBiZWxvbmdpbmcgdG8gdGhpcyBhcHAKKyAgICB3aGlsZSAoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzID0gdm9zX2xpc3RfcmVtb3ZlX2Zyb250KCAmcGN0eC0+UGh5TGlua3MsICZwTGluayApICkgKQorICAgIHsKKyAgICAgICAgcFBoeU5vZGUgPSAoQnNsUGh5TGlua3NOb2RlVHlwZSAqKXBMaW5rOworCisgICAgICAgIC8vIHNpbmNlIHRoZSBwaHkgbGluayBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUKKyAgICAgICAgLy8gYXNzb2NpYXRpb25zLCBtYWtlIHN1cmUgd2UgZG9udCBhdHRlbXB0IHRvIGRvIHRoaXMgYWdhaW4KKyAgICAgICAgcFBoeU5vZGUtPnBQaHktPnBQaHlMaW5rRGVzY05vZGUgPSBOVUxMOworCisgICAgICAgIEJzbFJlbGVhc2VQaHlDdHgoIHBQaHlOb2RlLT5wUGh5ICk7CisgICAgfQorCisgICAgVk9TX0FTU0VSVCggVm9zU3RhdHVzID09IFZPU19TVEFUVVNfRV9FTVBUWSApOworCisgICAgLy8gZGVzdHJveSB0aGUgUGh5TGlua3MgcXVldWUKKyAgICBWb3NTdGF0dXMgPSB2b3NfbGlzdF9kZXN0cm95KCAmcGN0eC0+UGh5TGlua3MgKTsKKyAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKTsKKworICAgIHBjdHgtPnVzZWQgPSBGQUxTRTsKKworfSAvLyBCc2xSZWxlYXNlQ2xpZW50Q3R4KCkKKy8vI2VuZGlmCisKKy8qKgorICBAYnJpZWYgQnNsSW5pdFBoeUN0eCgpIC0gSW5pdGlhbGl6ZSB0aGUgUGh5IENvbnRleHQgYXJyYXkuCisKKworICBAcmV0dXJuCisgIFRSVUUgaWYgYWxsIE9LLCBGQUxTRSBvdGhlcndpc2UKKworKi8KK3N0YXRpYyBCT09MIEJzbEluaXRQaHlDdHggKHZvaWQpCit7CisgICAgdl9VMTZfdCBpOworICAgIC8vIGZyZWUgUEhZIGNvbnRleHQKKworICAgIGZvciAoIGk9MDsgaTxCU0xfTUFYX1BIWV9MSU5LUzsgaSsrICkKKyAgICB7CisgICAgICAgIEJzbFBoeUxpbmtDdHhbaV0udXNlZCA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiAoVFJVRSk7Cit9IC8vIEJzbEluaXRQaHlDdHgoKQorCisKKy8qKgorICBAYnJpZWYgQnNsRmluZEFuZEluaXRQaHlDdHgoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCB0cnkgdG8gZmluZCBhIGZyZWUgcGh5c2ljYWwKKyAgbGluayBhLmsuYSBhc3NvY2F0aW9uIGNvbnRleHQgYW5kIGlmIHN1Y2Nlc3NmdWwsIHRoZW4gaW5pdCB0aGF0IGNvbnRleHQKKworICBAcGFyYW0gcGN0eCA6IFtpbl0gdGhlIGNsaWVudCBjb250ZXh0CisgIEBwYXJhbSBQaHlMaW5rSGRsIDogW2luXSB0aGUgcGh5c2ljYWwgbGluayBoYW5kbGUgY2hvc2VuIGJ5IGFwcGxpY2F0aW9uCisgIEBwYXJhbSBwcFBoeUN0eCA6IFtpbm91dF0gcHRyIHRvIHRoZSBwaHlzaWNhbCBsaW5rIGNvbnRleHQKKworICBAcmV0dXJuCisgIFRSVUUgaWYgYWxsIE9LLCBGQUxTRSBvdGhlcndpc2UKKworKi8KK3N0YXRpYyBCT09MIEJzbEZpbmRBbmRJbml0UGh5Q3R4CisoCisgICAgQnNsQ2xpZW50Q3R4VHlwZSogICBwY3R4LAorICAgIHZfVThfdCAgICAgICAgICAgICAgUGh5TGlua0hkbCwKKyAgICBCc2xQaHlMaW5rQ3R4VHlwZSoqIHBwUGh5Q3R4CispCit7CisgICAgVk9TX1NUQVRVUyBWb3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdl9VMTZfdCBpOworICAgIHZfVTE2X3QgajsKKyAgICB2b3NfbGlzdF9ub2RlX3QqIHBMaW5rOworICAgIEJzbFBoeUxpbmtzTm9kZVR5cGUgKnBOb2RlOworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAiQnNsRmluZEFuZEluaXRQaHlDdHhcbiIgKTsKKworICAgIGZvciAoIGk9MDsgaTxCU0xfTUFYX1BIWV9MSU5LUzsgaSsrICkKKyAgICB7CisgICAgICAgIGlmICggIUJzbFBoeUxpbmtDdHhbaV0udXNlZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJzbFBoeUxpbmtDdHhbaV0udXNlZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggaT09QlNMX01BWF9QSFlfTElOS1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICAvLyBub3cgaW5pdCB0aGlzIGNvbnRleHQKKworICAgICAgICAqcHBQaHlDdHggPSBCc2xQaHlMaW5rQ3R4ICsgaTsKKworICAgICAgICAvLyBzZXR1cCBhIHB0ciB0byB0aGUgYXBwIGNvbnRleHQgdGhhdCB0aGlzIGFzc29jYXRpb24gc3BlY2lmaWMgY29udGV4dCBsaXZlcyBpbgorICAgICAgICBCc2xQaHlMaW5rQ3R4W2ldLnBDbGllbnRDdHggPSBwY3R4OworCisgICAgICAgIC8vIE1hcmsgYXMgdXNlZAorICAgICAgICAoKnBwUGh5Q3R4KS0+dXNlZCA9IFRSVUU7CisKKyAgICAgICAgLy8gc3RvcmUgdGhlIFBIWSBsaW5rIGhhbmRsZQorICAgICAgICBCc2xQaHlMaW5rQ3R4W2ldLlBoeUxpbmtIZGwgPSBQaHlMaW5rSGRsOworCisgICAgICAgIC8vIGluaXQgdGhlIFRYIHF1ZXVlcworICAgICAgICBmb3IgKCBqPTA7IGo8V0xBTlRMX01BWF9BQzsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaGRkX2xpc3RfaW5pdCggJkJzbFBoeUxpbmtDdHhbaV0uQUNMVHhRdWV1ZVtqXSwgSEREX1RYX1FVRVVFX01BWF9MRU4gKTsKKyAgICAgICAgICAgIC8vVm9zU3RhdHVzID0gdm9zX2xpc3RfaW5pdCggJkJzbFBoeUxpbmtDdHhbaV0uQUNMVHhRdWV1ZVtqXSApOworICAgICAgICAgICAgLy9Wb3NTdGF0dXMgPSB2b3NfbGlzdF9pbml0KCAmKEJzbFBoeUxpbmtDdHgraSktPkFDTFR4UXVldWUgKTsKKyAgICAgICAgICAgIFZPU19BU1NFUlQoVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gbmVlZCB0byBhZGQgdGhpcyBQaHkgY29udGV4dCB0byB0aGUgY2xpZW50IGxpc3Qgb2YgYXNzb2NpYXRpb25zLAorICAgICAgICAvLyB1c2VmdWwgZHVyaW5nIENsb3NlIG9wZXJhdGlvbgorCisgICAgICAgIC8vIGdldCBhIHBrdCBkZXNjCisgICAgICAgIFZvc1N0YXR1cyA9IHZvc19saXN0X3JlbW92ZV9mcm9udCggJkJzbFBoeUxpbmtzRGVzY1Bvb2wsICZwTGluayApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGhhcHBlbiBkdWUgdG8gcG9vbCBub3QgYmVpbmcgYmlnIGVub3VnaCwgZXRjCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csICJCc2xGaW5kQW5kSW5pdFBoeUN0eCBmYWlsZWQgdG8gIgorICAgICAgICAgICAgICJnZXQgbm9kZSBmcm9tIEJzbFBoeUxpbmtzRGVzY1Bvb2wgdnN0YXR1cz0lZFxuIiwgVm9zU3RhdHVzICk7CisgICAgICAgICAgICBCc2xSZWxlYXNlUGh5Q3R4KCAqcHBQaHlDdHggKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0aWNrIHRoZSBWT1MgcGt0IGludG8gdGhlIG5vZGUKKyAgICAgICAgcE5vZGUgPSAoQnNsUGh5TGlua3NOb2RlVHlwZSAqKSBwTGluazsKKyAgICAgICAgcE5vZGUtPm5vZGUgPSAqcExpbms7CisgICAgICAgIHBOb2RlLT5wUGh5ID0gKnBwUGh5Q3R4OworCisKKyAgICAgICAgLy8gbm93IHF1ZXVlIHRoZSBwa3QgaW50byB0aGUgY29ycmVjdCBxdWV1ZQorICAgICAgICBWb3NTdGF0dXMgPSB2b3NfbGlzdF9pbnNlcnRfYmFjayggJnBjdHgtPlBoeUxpbmtzLCBwTGluayApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gbmVlZCB0byByZWNvcmQgdGhlIGRlc2MgZm9yIHRoaXMgYXNzb2NhdGlvbiBpbiB0aGUgbGlzdCBvZgorICAgICAgICAvLyBhY3RpdmUgYXNzb2NhdGlvbnMgaW4gY2xpZW50IGNvbnRleHQgdG8gYWxsb3cgY2xlYW51cCBsYXRlcgorICAgICAgICAoKnBwUGh5Q3R4KS0+cFBoeUxpbmtEZXNjTm9kZSA9IHBOb2RlOworCisgICAgICAgIHJldHVybihUUlVFKTsKKyAgICB9Cit9IC8vIEJzbEZpbmRBbmRJbml0UGh5Q3R4KCkKKworLyoqCisgIEBicmllZiBCc2xQcm9jZXNzSENJQ29tbWFuZCgpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIHByb2Nlc3MgYW4gSENJIGNvbW1hbmQgaS5lCisgIHRha2UgYW4gSENJIGNvbW1hbmQgYnVmZmVyLCB1bnBhY2sgaXQgYW5kIHRoZW4gY2FsbCB0aGUgYXBwcm9wcmlhdGUgQkFQIEFQSQorCisgIEBwYXJhbSBwY3R4IDogW2luXSBwdHIgdG8gdGhlIGNsaWVudCBjb250ZXh0CisgIEBwYXJhbSBwQnVmZmVyXyA6IFtpbl0gdGhlIGlucHV0IGJ1ZmZlciBjb250YWluaW5nIHRoZSBIQ0kgY29tbWFuZAorICBAcGFyYW0gQ291bnRfIDogW2luXSBzaXplIG9mIHRoZSBIQ0kgY29tbWFuZCBidWZmZXIKKworICBAcmV0dXJuCisgIFRSVUUgaWYgYWxsIE9LLCBGQUxTRSBvdGhlcndpc2UKKworKi8KK3N0YXRpYyBCT09MIEJzbFByb2Nlc3NIQ0lDb21tYW5kCisoCisgICAgQnNsQ2xpZW50Q3R4VHlwZSogcGN0eCwKKyAgICBMUENWT0lEIHBCdWZmZXJfLAorICAgIERXT1JEIENvdW50XworKQoreworICAgIExQVk9JRCBwQnVmZmVyID0gKExQVk9JRCkgcEJ1ZmZlcl87IC8vIGNhc3Rhd2F5IHRoZSBjb25zdC1uZXNzIG9mIHRoZSBwdHIKKyAgICB2X1UxNl90IENvdW50ID0gKHZfVTE2X3QpIENvdW50XzsgIC8vIHRoaXMgc2hvdWxkIGJlIE9LIG1heCBzaXplIDwgMTUwMAorICAgIHZfVTMyX3QgVW5wYWNrU3RhdHVzOworICAgIFZPU19TVEFUVVMgVm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIEJPT0wgU3RhdHVzOworICAgIEJzbFBoeUxpbmtDdHhUeXBlKiBwUGh5Q3R4OworICAgIHRCdGFtcEhDSV9FdmVudCBIQ0lFdnQ7CisgICAgdl9VMTZfdCB4ID0gMTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICAvLyB0aGUgb3Bjb2RlIGlzIGluIExFLCBpZiB3ZSBhcmUgTEUgdG9vIHRoZW4gdGhpcyBpcyBmaW5lIGVsc2Ugd2UgbmVlZCBzb21lCisgICAgLy8gYnl0ZSBzd2FwcGluZworICAgIHZfVTE2X3QgY21kT3Bjb2RlID0gKihVTkFMSUdORUQgdl9VMTZfdCAqKXBCdWZmZXI7CisgICAgdl9VOF90ICpwQnVmID0gKHZfVThfdCAqKXBCdWZmZXI7CisgICAgdl9VOF90ICpwVG1wID0gKHZfVThfdCAqKXBCdWY7CisKKyAgICAvLyBUT0RPOiBkbyB3ZSByZWFsbHkgbmVlZCB0byBkbyB0aGlzIHBlciBjYWxsIGV2ZW4gdGhvdWdoIHRoZSBvcCBpcyBxdWl0ZSBjaGVhcAorICAgIGlmKCoodl9VOF90ICopJnggPT0gMCkKKyAgICB7CisgICAgICAgIC8vIEJFCisgICAgICAgIGNtZE9wY29kZSA9ICggY21kT3Bjb2RlICYgMHhGRiApIDw8IDggfCAoIGNtZE9wY29kZSAmIDB4RkYwMCApID4+IDg7CisgICAgfQorCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGNtZE9wY29kZSA9ICVoeFxuIiwgY21kT3Bjb2RlICk7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiAqcEJ1ZiBiZWZvcmUgYWR2YW5jZXBUbXBbJXhdID0gJXhcbiIsIGkscFRtcFtpXSApOworCisgICAgcEJ1Zis9Q01EX1RMVl9UWVBFX0FORF9MRU5fU0laRTsKKworCisgICAgc3dpdGNoICggY21kT3Bjb2RlICkKKyAgICB7CisgICAgICAgIC8qKiBCVCB2My4wIExpbmsgQ29udHJvbCBjb21tYW5kcyAqLworICAgIGNhc2UgQlRBTVBfVExWX0hDSV9DUkVBVEVfUEhZU0lDQUxfTElOS19DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfQ3JlYXRlX1BoeXNpY2FsX0xpbmtfQ21kIENyZWF0ZVBoeXNpY2FsTGlua0NtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX0NyZWF0ZV9QaHlzaWNhbF9MaW5rX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZDcmVhdGVQaHlzaWNhbExpbmtDbWQgKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFVucGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9DcmVhdGVfUGh5c2ljYWxfTGlua19DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFVucGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYoVk9TX0ZBTFNFID09IFdMQU5CQVBfQW1wQ29ubmVjdGlvbkFsbG93ZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9QaHlMaW5rRmFpbHVyZShwY3R4LCBDcmVhdGVQaHlzaWNhbExpbmtDbWQucGh5X2xpbmtfaGFuZGxlKTsKKyAgICAgICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFZvc1N0YXR1cyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfUGh5TGlua0ZhaWx1cmUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldHVwIHRoZSBwZXIgUEhZIGxpbmsgQkFQIGNvbnRleHQKKyAgICAgICAgU3RhdHVzID0gQnNsRmluZEFuZEluaXRQaHlDdHgoIHBjdHgsIENyZWF0ZVBoeXNpY2FsTGlua0NtZC5waHlfbGlua19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBoeUN0eCApOworCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkNyZWF0ZVBoeXNpY2FsTGlua0NtZC5waHlfbGlua19oYW5kbGU9JWRcbiIsQ3JlYXRlUGh5c2ljYWxMaW5rQ21kLnBoeV9saW5rX2hhbmRsZSk7CisKKyAgICAgICAgaWYgKCAhU3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBCc2xGaW5kQW5kSW5pdFBoeUN0eCBmYWlsZWQiKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFBoeXNpY2FsTGlua0NyZWF0ZSggcGN0eC0+YmFwSGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNyZWF0ZVBoeXNpY2FsTGlua0NtZCwgcFBoeUN0eCwgJkhDSUV2dCApOworCisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBQaHlzaWNhbExpbmtDcmVhdGUgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICBCc2xSZWxlYXNlUGh5Q3R4KCBwUGh5Q3R4ICk7CisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBQaHlDdHgsICZIQ0lFdnQsIFRSVUUgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICBCc2xSZWxlYXNlUGh5Q3R4KCBwUGh5Q3R4ICk7CisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9BQ0NFUFRfUEhZU0lDQUxfTElOS19DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfQWNjZXB0X1BoeXNpY2FsX0xpbmtfQ21kIEFjY2VwdFBoeXNpY2FsTGlua0NtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX0FjY2VwdF9QaHlzaWNhbF9MaW5rX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZBY2NlcHRQaHlzaWNhbExpbmtDbWQgKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFVucGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9BY2NlcHRfUGh5c2ljYWxfTGlua19DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFVucGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYoVk9TX0ZBTFNFID09IFdMQU5CQVBfQW1wQ29ubmVjdGlvbkFsbG93ZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9QaHlMaW5rRmFpbHVyZShwY3R4LCBBY2NlcHRQaHlzaWNhbExpbmtDbWQucGh5X2xpbmtfaGFuZGxlKTsKKyAgICAgICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFZvc1N0YXR1cyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfUGh5TGlua0ZhaWx1cmUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldHVwIHRoZSBwZXIgUEhZIGxpbmsgQkFQIGNvbnRleHQKKyAgICAgICAgU3RhdHVzID0gQnNsRmluZEFuZEluaXRQaHlDdHgoIHBjdHgsIEFjY2VwdFBoeXNpY2FsTGlua0NtZC5waHlfbGlua19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBoeUN0eCApOworCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkFjY2VwdFBoeXNpY2FsTGlua0NtZC5waHlfbGlua19oYW5kbGU9JWRcbiIsQWNjZXB0UGh5c2ljYWxMaW5rQ21kLnBoeV9saW5rX2hhbmRsZSk7CisKKyAgICAgICAgaWYgKCAhU3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBCc2xGaW5kQW5kSW5pdFBoeUN0eCBmYWlsZWQiKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFBoeXNpY2FsTGlua0FjY2VwdCggcGN0eC0+YmFwSGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjY2VwdFBoeXNpY2FsTGlua0NtZCwgcFBoeUN0eCwgJkhDSUV2dCApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5fQkFQUGh5c2ljYWxMaW5rQWNjZXB0IGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgQnNsUmVsZWFzZVBoeUN0eCggcFBoeUN0eCApOworICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSBhcyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZWdpc3RlcmVkCisgICAgICAgIC8vIHdpdGggQkFQIGZvciB0aGUgRXZlbnRDQiBidXQgd2UgYXJlIGFsc28gZ29pbmcgdG8gdXNlIGl0CisgICAgICAgIC8vIGFzIGEgaGVscGVyIGZ1bmN0aW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgaW52b2NhdGlvbgorICAgICAgICAvLyBydW5zIGluIEhDSSBjb21tYW5kIHNlbmRpbmcgY2FsbGVyIGNvbnRleHQgd2hpbGUgdGhlIGNhbGxiYWNrCisgICAgICAgIC8vIHdpbGwgaGFwcGVuIGluIEJBUCdzIGNvbnRleHQgd2hhdGV2ZXIgdGhhdCBtYXkgYmUKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9FdmVudENCKCBwUGh5Q3R4LCAmSENJRXZ0LCBUUlVFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgQnNsUmVsZWFzZVBoeUN0eCggcFBoeUN0eCApOworICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LX0NNRDoKKyAgICB7CisgICAgICAgIHRCdGFtcFRMVkhDSV9EaXNjb25uZWN0X1BoeXNpY2FsX0xpbmtfQ21kIERpc2Nvbm5lY3RQaHlzaWNhbExpbmtDbWQ7CisgICAgICAgIENvdW50ID0gQ291bnQgLSAzOy8vVHlwZSBhbmQgbGVuZ3RoIGZpZWxkIGxlbmd0aHMgYXJlIG5vdCBuZWVkZWQKKyAgICAgICAgcFRtcCA9IHBCdWY7CisgICAgICAgIGZvcihpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiAqcEJ1ZiBpbiBEaXNjb25uZWN0IHBoeSBsaW5rIHBUbXBbJXhdID0gJXhcbiIsIGkscFRtcFtpXSApOworICAgICAgICAvLyB1bnBhY2sKKyAgICAgICAgVW5wYWNrU3RhdHVzID0gYnRhbXBVbnBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZEaXNjb25uZWN0UGh5c2ljYWxMaW5rQ21kICk7CisKKyAgICAgICAgaWYgKCAhQlRBTVBfU1VDQ0VFREVEKCBVbnBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogYnRhbXBVbnBhY2tUbHZIQ0lfRGlzY29ubmVjdF9QaHlzaWNhbF9MaW5rX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFBoeXNpY2FsTGlua0Rpc2Nvbm5lY3QoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgJkRpc2Nvbm5lY3RQaHlzaWNhbExpbmtDbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFBoeXNpY2FsTGlua0Rpc2Nvbm5lY3QgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfQ1JFQVRFX0xPR0lDQUxfTElOS19DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfQ3JlYXRlX0xvZ2ljYWxfTGlua19DbWQgQ3JlYXRlTG9naWNhbExpbmtDbWQ7CisgICAgICAgIENvdW50IC09IDM7IC8vVG8gc2VuZCB0aGUgY29ycmVjdCBsZW5ndGggdG8gdW5wYWNrIGV2ZW50CisgICAgICAgIC8vIHVucGFjaworICAgICAgICBVbnBhY2tTdGF0dXMgPSBidGFtcFVucGFja1RsdkhDSV9DcmVhdGVfTG9naWNhbF9MaW5rX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZDcmVhdGVMb2dpY2FsTGlua0NtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX0NyZWF0ZV9Mb2dpY2FsX0xpbmtfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBVbnBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQTG9naWNhbExpbmtDcmVhdGUoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNyZWF0ZUxvZ2ljYWxMaW5rQ21kLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBMb2dpY2FsTGlua0NyZWF0ZSBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9BQ0NFUFRfTE9HSUNBTF9MSU5LX0NNRDoKKyAgICB7CisgICAgICAgIHRCdGFtcFRMVkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZCBBY2NlcHRMb2dpY2FsTGlua0NtZDsKKyAgICAgICAgQ291bnQgPSBDb3VudCAtIDM7Ly9TdWJ0cmFjdCBUeXBlIGFuZCBMZW5ndGggZmllbGRzCisgICAgICAgIC8vIHVucGFjaworICAgICAgICBVbnBhY2tTdGF0dXMgPSBidGFtcFVucGFja1RsdkhDSV9BY2NlcHRfTG9naWNhbF9MaW5rX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZBY2NlcHRMb2dpY2FsTGlua0NtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX0FjY2VwdF9Mb2dpY2FsX0xpbmtfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBVbnBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQTG9naWNhbExpbmtBY2NlcHQoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjY2VwdExvZ2ljYWxMaW5rQ21kLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBMb2dpY2FsTGlua0FjY2VwdCBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfRGlzY29ubmVjdF9Mb2dpY2FsX0xpbmtfQ21kIERpc2Nvbm5lY3RMb2dpY2FsTGlua0NtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX0Rpc2Nvbm5lY3RfTG9naWNhbF9MaW5rX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZEaXNjb25uZWN0TG9naWNhbExpbmtDbWQgKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFVucGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9EaXNjb25uZWN0X0xvZ2ljYWxfTGlua19DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFVucGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBMb2dpY2FsTGlua0Rpc2Nvbm5lY3QoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgJkRpc2Nvbm5lY3RMb2dpY2FsTGlua0NtZCwgJkhDSUV2dCApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5fQkFQTG9naWNhbExpbmtEaXNjb25uZWN0IGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSBhcyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZWdpc3RlcmVkCisgICAgICAgIC8vIHdpdGggQkFQIGZvciB0aGUgRXZlbnRDQiBidXQgd2UgYXJlIGFsc28gZ29pbmcgdG8gdXNlIGl0CisgICAgICAgIC8vIGFzIGEgaGVscGVyIGZ1bmN0aW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgaW52b2NhdGlvbgorICAgICAgICAvLyBydW5zIGluIEhDSSBjb21tYW5kIHNlbmRpbmcgY2FsbGVyIGNvbnRleHQgd2hpbGUgdGhlIGNhbGxiYWNrCisgICAgICAgIC8vIHdpbGwgaGFwcGVuIGluIEJBUCdzIGNvbnRleHQgd2hhdGV2ZXIgdGhhdCBtYXkgYmUKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9FdmVudENCKCBwY3R4LCAmSENJRXZ0LCBGQUxTRSApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfRXZlbnRDQiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX0xPR0lDQUxfTElOS19DQU5DRUxfQ01EOgorICAgIHsKKyAgICAgICAgdEJ0YW1wVExWSENJX0xvZ2ljYWxfTGlua19DYW5jZWxfQ21kIExvZ2ljYWxMaW5rQ2FuY2VsQ21kOworICAgICAgICAvLyB1bnBhY2sKKyAgICAgICAgVW5wYWNrU3RhdHVzID0gYnRhbXBVbnBhY2tUbHZIQ0lfTG9naWNhbF9MaW5rX0NhbmNlbF9DbWQoIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYsIENvdW50LCAmTG9naWNhbExpbmtDYW5jZWxDbWQgKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFVucGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9Mb2dpY2FsX0xpbmtfQ2FuY2VsX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUExvZ2ljYWxMaW5rQ2FuY2VsKCBwY3R4LT5iYXBIZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMb2dpY2FsTGlua0NhbmNlbENtZCwgJkhDSUV2dCApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5fQkFQTG9naWNhbExpbmtDYW5jZWwgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfRkxPV19TUEVDX01PRElGWV9DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfRmxvd19TcGVjX01vZGlmeV9DbWQgRmxvd1NwZWNNb2RpZnlDbWQ7CisgICAgICAgIC8vIHVucGFjaworICAgICAgICBVbnBhY2tTdGF0dXMgPSBidGFtcFVucGFja1RsdkhDSV9GbG93X1NwZWNfTW9kaWZ5X0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZGbG93U3BlY01vZGlmeUNtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX0Zsb3dfU3BlY19Nb2RpZnlfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBVbnBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQRmxvd1NwZWNNb2RpZnkoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkZsb3dTcGVjTW9kaWZ5Q21kLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBGbG93U3BlY01vZGlmeSBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qCisgICAgICBIb3N0IENvbnRyb2xsZXIgYW5kIEJhc2ViYW5kIENvbW1hbmRzCisgICAgKi8KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfUkVTRVRfQ01EOgorICAgIHsKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBSZXNldCggcGN0eC0+YmFwSGRsICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBSZXNldCBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX1NFVF9FVkVOVF9NQVNLX0NNRDoKKyAgICB7CisgICAgICAgIHRCdGFtcFRMVkhDSV9TZXRfRXZlbnRfTWFza19DbWQgU2V0RXZlbnRNYXNrQ21kOworICAgICAgICAvLyB1bnBhY2sKKyAgICAgICAgVW5wYWNrU3RhdHVzID0gYnRhbXBVbnBhY2tUbHZIQ0lfU2V0X0V2ZW50X01hc2tfQ21kKCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBwQnVmLCBDb3VudCwgJlNldEV2ZW50TWFza0NtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1NldF9FdmVudF9NYXNrX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFNldEV2ZW50TWFzayggcGN0eC0+YmFwSGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNldEV2ZW50TWFza0NtZCwgJkhDSUV2dCApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5fQkFQU2V0RXZlbnRNYXNrIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSBhcyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZWdpc3RlcmVkCisgICAgICAgIC8vIHdpdGggQkFQIGZvciB0aGUgRXZlbnRDQiBidXQgd2UgYXJlIGFsc28gZ29pbmcgdG8gdXNlIGl0CisgICAgICAgIC8vIGFzIGEgaGVscGVyIGZ1bmN0aW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgaW52b2NhdGlvbgorICAgICAgICAvLyBydW5zIGluIEhDSSBjb21tYW5kIHNlbmRpbmcgY2FsbGVyIGNvbnRleHQgd2hpbGUgdGhlIGNhbGxiYWNrCisgICAgICAgIC8vIHdpbGwgaGFwcGVuIGluIEJBUCdzIGNvbnRleHQgd2hhdGV2ZXIgdGhhdCBtYXkgYmUKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9FdmVudENCKCBwY3R4LCAmSENJRXZ0LCBGQUxTRSApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfRXZlbnRDQiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX0ZMVVNIX0NNRDoKKyAgICB7CisgICAgICAgIHRCdGFtcFRMVkhDSV9GbHVzaF9DbWQgRmx1c2hDbWQ7CisKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX0ZsdXNoX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZGbHVzaENtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX0ZsdXNoX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGbHVzaCB0aGUgVFggcXVldWUgKi8KKy8vI2lmZGVmIEJBUF9ERUJVRworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczpIQ0kgRmx1c2ggY29tbWFuZCAgLSB3aWxsIGZsdXNoIFR4IFF1ZXVlIiwgX19GVU5DVElPTl9fKTsKKy8vI2VuZGlmIC8vQkFQX0RFQlVHCisgICAgICAgIC8vIEpFWjEwMDYwNDogVGVtcG9yYXJ5IHNob3J0IGN1dAorICAgICAgICBwUGh5Q3R4ID0gJkJzbFBoeUxpbmtDdHhbMF07CisgICAgICAgIFZvc1N0YXR1cyA9IEJzbEZsdXNoVHhRdWV1ZXMgKCBwUGh5Q3R4KTsKKworICAgICAgICAvKiBBY2tub3dsZWRnZSB0aGUgY29tbWFuZCAqLworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUEZsdXNoKCBwY3R4LT5iYXBIZGwsICZGbHVzaENtZCApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBGbHVzaCBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX0VOSEFOQ0VEX0ZMVVNIX0NNRDoKKyAgICB7CisgICAgICAgIHRCdGFtcFRMVkhDSV9FbmhhbmNlZF9GbHVzaF9DbWQgRmx1c2hDbWQ7CisKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX0VuaGFuY2VkX0ZsdXNoX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmLCBDb3VudCwgJkZsdXNoQ21kICk7CisKKyAgICAgICAgaWYgKCAhQlRBTVBfU1VDQ0VFREVEKCBVbnBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9FbmhhbmNlZF9GbHVzaF9DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFVucGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2ggdGhlIFRYIHF1ZXVlICovCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczpIQ0kgRmx1c2ggY29tbWFuZCAgLSB3aWxsIGZsdXNoIFR4IFF1ZXVlIGZvciBwa3QgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgRmx1c2hDbWQucGFja2V0X3R5cGUpOworICAgICAgICAvLyBXZSBzdXBwb3J0IEJFIHRyYWZmaWMgb25seQorICAgICAgICBpZihXTEFOVExfQUNfQkUgPT0gRmx1c2hDbWQucGFja2V0X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQaHlDdHggPSAmQnNsUGh5TGlua0N0eFswXTsKKyAgICAgICAgICAgIFZvc1N0YXR1cyA9IEJzbEZsdXNoVHhRdWV1ZXMgKCBwUGh5Q3R4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFja25vd2xlZGdlIHRoZSBjb21tYW5kICovCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fRW5oYW5jZWRCQVBGbHVzaCggcGN0eC0+YmFwSGRsLCAmRmx1c2hDbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5fRW5haG5jZWRCQVBGbHVzaCBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfRXZlbnRDQiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX1JFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVF9DTUQ6CisgICAgeworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dCggcGN0eC0+YmFwSGRsLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBSZWFkQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVF9DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfV3JpdGVfQ29ubmVjdGlvbl9BY2NlcHRfVGltZW91dF9DbWQgV3JpdGVDb25uZWN0aW9uQWNjZXB0VGltZW91dENtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0Nvbm5lY3Rpb25fQWNjZXB0X1RpbWVvdXRfQ21kKCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBwQnVmLCBDb3VudCwgJldyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXRDbWQgKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFVucGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9Db25uZWN0aW9uX0FjY2VwdF9UaW1lb3V0X0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFdyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgJldyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXRDbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFdyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfUkVBRF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVRfQ01EOgorICAgIHsKKyAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCBSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dENtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dENtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KCBwY3R4LT5iYXBIZGwsCisgICAgICAgICAgICAgICAgICAgICZSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dENtZCwgJkhDSUV2dCApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5fQkFQUmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXQgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUX0NNRDoKKyAgICB7CisgICAgICAgIHRCdGFtcFRMVkhDSV9Xcml0ZV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ21kIFdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dENtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0xpbmtfU3VwZXJ2aXNpb25fVGltZW91dF9DbWQoIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYsIENvdW50LCAmV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0Q21kICk7CisKKyAgICAgICAgaWYgKCAhQlRBTVBfU1VDQ0VFREVEKCBVbnBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogYnRhbXBVbnBhY2tUbHZIQ0lfV3JpdGVfTGlua19TdXBlcnZpc2lvbl9UaW1lb3V0X0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dCggcGN0eC0+YmFwSGRsLAorICAgICAgICAgICAgICAgICAgICAmV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0Q21kLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiB2My4wIEhvc3QgQ29udHJvbGxlciBhbmQgQmFzZWJhbmQgQ29tbWFuZHMgKi8KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVRfQ01EOgorICAgIHsKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBSZWFkTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0KCBwY3R4LT5iYXBIZGwsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFJlYWRMb2dpY2FsTGlua0FjY2VwdFRpbWVvdXQgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUX0NNRDoKKyAgICB7CisgICAgICAgIHRCdGFtcFRMVkhDSV9Xcml0ZV9Mb2dpY2FsX0xpbmtfQWNjZXB0X1RpbWVvdXRfQ21kIFdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0Q21kOworICAgICAgICAvLyB1bnBhY2sKKyAgICAgICAgVW5wYWNrU3RhdHVzID0gYnRhbXBVbnBhY2tUbHZIQ0lfV3JpdGVfTG9naWNhbF9MaW5rX0FjY2VwdF9UaW1lb3V0X0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZXcml0ZUxvZ2ljYWxMaW5rQWNjZXB0VGltZW91dENtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0xvZ2ljYWxfTGlua19BY2NlcHRfVGltZW91dF9DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFVucGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBXcml0ZUxvZ2ljYWxMaW5rQWNjZXB0VGltZW91dCggcGN0eC0+YmFwSGRsLAorICAgICAgICAgICAgICAgICAgICAmV3JpdGVMb2dpY2FsTGlua0FjY2VwdFRpbWVvdXRDbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0IGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSBhcyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZWdpc3RlcmVkCisgICAgICAgIC8vIHdpdGggQkFQIGZvciB0aGUgRXZlbnRDQiBidXQgd2UgYXJlIGFsc28gZ29pbmcgdG8gdXNlIGl0CisgICAgICAgIC8vIGFzIGEgaGVscGVyIGZ1bmN0aW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgaW52b2NhdGlvbgorICAgICAgICAvLyBydW5zIGluIEhDSSBjb21tYW5kIHNlbmRpbmcgY2FsbGVyIGNvbnRleHQgd2hpbGUgdGhlIGNhbGxiYWNrCisgICAgICAgIC8vIHdpbGwgaGFwcGVuIGluIEJBUCdzIGNvbnRleHQgd2hhdGV2ZXIgdGhhdCBtYXkgYmUKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9FdmVudENCKCBwY3R4LCAmSENJRXZ0LCBGQUxTRSApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfRXZlbnRDQiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX1NFVF9FVkVOVF9NQVNLX1BBR0VfMl9DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfU2V0X0V2ZW50X01hc2tfUGFnZV8yX0NtZCBTZXRFdmVudE1hc2tQYWdlMkNtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1NldF9FdmVudF9NYXNrX1BhZ2VfMl9DbWQoIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYsIENvdW50LCAmU2V0RXZlbnRNYXNrUGFnZTJDbWQgKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFVucGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9TZXRfRXZlbnRfTWFza19QYWdlXzJfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBVbnBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQU2V0RXZlbnRNYXNrUGFnZTIoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNldEV2ZW50TWFza1BhZ2UyQ21kLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBTZXRFdmVudE1hc2tQYWdlMiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FUSU9OX0RBVEFfQ01EOgorICAgIHsKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBSZWFkTG9jYXRpb25EYXRhKCBwY3R4LT5iYXBIZGwsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFJlYWRMb2NhdGlvbkRhdGEgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTE9DQVRJT05fREFUQV9DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9jYXRpb25fRGF0YV9DbWQgV3JpdGVMb2NhdGlvbkRhdGFDbWQ7CisgICAgICAgIC8vIHVucGFjaworICAgICAgICBVbnBhY2tTdGF0dXMgPSBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9Mb2NhdGlvbl9EYXRhX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZXcml0ZUxvY2F0aW9uRGF0YUNtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0xvY2F0aW9uX0RhdGFfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBVbnBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQV3JpdGVMb2NhdGlvbkRhdGEoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldyaXRlTG9jYXRpb25EYXRhQ21kLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBXcml0ZUxvY2F0aW9uRGF0YSBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9SRUFEX0ZMT1dfQ09OVFJPTF9NT0RFX0NNRDoKKyAgICB7CisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQUmVhZEZsb3dDb250cm9sTW9kZSggcGN0eC0+YmFwSGRsLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBSZWFkRmxvd0NvbnRyb2xNb2RlIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSBhcyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZWdpc3RlcmVkCisgICAgICAgIC8vIHdpdGggQkFQIGZvciB0aGUgRXZlbnRDQiBidXQgd2UgYXJlIGFsc28gZ29pbmcgdG8gdXNlIGl0CisgICAgICAgIC8vIGFzIGEgaGVscGVyIGZ1bmN0aW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgaW52b2NhdGlvbgorICAgICAgICAvLyBydW5zIGluIEhDSSBjb21tYW5kIHNlbmRpbmcgY2FsbGVyIGNvbnRleHQgd2hpbGUgdGhlIGNhbGxiYWNrCisgICAgICAgIC8vIHdpbGwgaGFwcGVuIGluIEJBUCdzIGNvbnRleHQgd2hhdGV2ZXIgdGhhdCBtYXkgYmUKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9FdmVudENCKCBwY3R4LCAmSENJRXZ0LCBGQUxTRSApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfRXZlbnRDQiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX1dSSVRFX0ZMT1dfQ09OVFJPTF9NT0RFX0NNRDoKKyAgICB7CisgICAgICAgIHRCdGFtcFRMVkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQgV3JpdGVGbG93Q29udHJvbE1vZGVDbWQ7CisgICAgICAgIC8vIHVucGFjaworICAgICAgICBVbnBhY2tTdGF0dXMgPSBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQoIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYsIENvdW50LCAmV3JpdGVGbG93Q29udHJvbE1vZGVDbWQgKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFVucGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9GbG93X0NvbnRyb2xfTW9kZV9DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFVucGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBXcml0ZUZsb3dDb250cm9sTW9kZSggcGN0eC0+YmFwSGRsLAorICAgICAgICAgICAgICAgICAgICAmV3JpdGVGbG93Q29udHJvbE1vZGVDbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFdyaXRlRmxvd0NvbnRyb2xNb2RlIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSBhcyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZWdpc3RlcmVkCisgICAgICAgIC8vIHdpdGggQkFQIGZvciB0aGUgRXZlbnRDQiBidXQgd2UgYXJlIGFsc28gZ29pbmcgdG8gdXNlIGl0CisgICAgICAgIC8vIGFzIGEgaGVscGVyIGZ1bmN0aW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgaW52b2NhdGlvbgorICAgICAgICAvLyBydW5zIGluIEhDSSBjb21tYW5kIHNlbmRpbmcgY2FsbGVyIGNvbnRleHQgd2hpbGUgdGhlIGNhbGxiYWNrCisgICAgICAgIC8vIHdpbGwgaGFwcGVuIGluIEJBUCdzIGNvbnRleHQgd2hhdGV2ZXIgdGhhdCBtYXkgYmUKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9FdmVudENCKCBwY3R4LCAmSENJRXZ0LCBGQUxTRSApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfRXZlbnRDQiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX1JFQURfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVF9DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfUmVhZF9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCBSZWFkQmVzdEVmZm9ydEZsdXNoVGltZW91dENtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dF9DbWQoIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYsIENvdW50LCAmUmVhZEJlc3RFZmZvcnRGbHVzaFRpbWVvdXRDbWQgKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFVucGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9SZWFkX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBVbnBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQUmVhZEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgJlJlYWRCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0Q21kLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBSZWFkQmVzdEVmZm9ydEZsdXNoVGltZW91dCBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9XUklURV9CRVNUX0VGRk9SVF9GTFVTSF9USU1FT1VUX0NNRDoKKyAgICB7CisgICAgICAgIHRCdGFtcFRMVkhDSV9Xcml0ZV9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCBXcml0ZUJlc3RFZmZvcnRGbHVzaFRpbWVvdXRDbWQ7CisgICAgICAgIC8vIHVucGFjaworICAgICAgICBVbnBhY2tTdGF0dXMgPSBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9CZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0X0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZXcml0ZUJlc3RFZmZvcnRGbHVzaFRpbWVvdXRDbWQpOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0Jlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXRfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBVbnBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQV3JpdGVCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0KCBwY3R4LT5iYXBIZGwsCisgICAgICAgICAgICAgICAgICAgICZXcml0ZUJlc3RFZmZvcnRGbHVzaFRpbWVvdXRDbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFdyaXRlQmVzdEVmZm9ydEZsdXNoVGltZW91dCBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qKiBvcGNvZGUgZGVmaW5pdGlvbiBmb3IgdGhpcyBjb21tYW5kIGZyb20gQU1QIEhDSSBDUiBEOXI0IG1hcmt1cCAqLworICAgIGNhc2UgQlRBTVBfVExWX0hDSV9TRVRfU0hPUlRfUkFOR0VfTU9ERV9DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kIFNldFNob3J0UmFuZ2VNb2RlQ21kOworICAgICAgICAvLyB1bnBhY2sKKyAgICAgICAgVW5wYWNrU3RhdHVzID0gYnRhbXBVbnBhY2tUbHZIQ0lfU2V0X1Nob3J0X1JhbmdlX01vZGVfQ21kKCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBwQnVmLCBDb3VudCwgJlNldFNob3J0UmFuZ2VNb2RlQ21kKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFVucGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9TZXRfU2hvcnRfUmFuZ2VfTW9kZV9DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFVucGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBTZXRTaG9ydFJhbmdlTW9kZSggcGN0eC0+YmFwSGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2V0U2hvcnRSYW5nZU1vZGVDbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFNldFNob3J0UmFuZ2VNb2RlIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSBhcyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZWdpc3RlcmVkCisgICAgICAgIC8vIHdpdGggQkFQIGZvciB0aGUgRXZlbnRDQiBidXQgd2UgYXJlIGFsc28gZ29pbmcgdG8gdXNlIGl0CisgICAgICAgIC8vIGFzIGEgaGVscGVyIGZ1bmN0aW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgaW52b2NhdGlvbgorICAgICAgICAvLyBydW5zIGluIEhDSSBjb21tYW5kIHNlbmRpbmcgY2FsbGVyIGNvbnRleHQgd2hpbGUgdGhlIGNhbGxiYWNrCisgICAgICAgIC8vIHdpbGwgaGFwcGVuIGluIEJBUCdzIGNvbnRleHQgd2hhdGV2ZXIgdGhhdCBtYXkgYmUKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9FdmVudENCKCBwY3R4LCAmSENJRXZ0LCBGQUxTRSApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfRXZlbnRDQiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgLyogRW5kIG9mIHYzLjAgSG9zdCBDb250cm9sbGVyIGFuZCBCYXNlYmFuZCBDb21tYW5kcyAqLworICAgIC8qCisgICAgICAgSW5mb3JtYXRpb25hbCBQYXJhbWV0ZXJzCisgICAgKi8KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9WRVJTSU9OX0lORk9fQ01EOgorICAgIHsKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBSZWFkTG9jYWxWZXJzaW9uSW5mbyggcGN0eC0+YmFwSGRsLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBSZWFkTG9jYWxWZXJzaW9uSW5mbyBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9DTURTX0NNRDoKKyAgICB7CisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQUmVhZExvY2FsU3VwcG9ydGVkQ21kcyggcGN0eC0+YmFwSGRsLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBSZWFkTG9jYWxTdXBwb3J0ZWRDbWRzIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSBhcyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZWdpc3RlcmVkCisgICAgICAgIC8vIHdpdGggQkFQIGZvciB0aGUgRXZlbnRDQiBidXQgd2UgYXJlIGFsc28gZ29pbmcgdG8gdXNlIGl0CisgICAgICAgIC8vIGFzIGEgaGVscGVyIGZ1bmN0aW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgaW52b2NhdGlvbgorICAgICAgICAvLyBydW5zIGluIEhDSSBjb21tYW5kIHNlbmRpbmcgY2FsbGVyIGNvbnRleHQgd2hpbGUgdGhlIGNhbGxiYWNrCisgICAgICAgIC8vIHdpbGwgaGFwcGVuIGluIEJBUCdzIGNvbnRleHQgd2hhdGV2ZXIgdGhhdCBtYXkgYmUKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9FdmVudENCKCBwY3R4LCAmSENJRXZ0LCBGQUxTRSApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfRXZlbnRDQiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCVEFNUF9UTFZfSENJX1JFQURfQlVGRkVSX1NJWkVfQ01EOgorICAgIHsKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBSZWFkQnVmZmVyU2l6ZSggcGN0eC0+YmFwSGRsLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBSZWFkQnVmZmVyU2l6ZSBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIHYzLjAgSW5mb3JtYXRpb25hbCBjb21tYW5kcyAqLworICAgIGNhc2UgQlRBTVBfVExWX0hDSV9SRUFEX0RBVEFfQkxPQ0tfU0laRV9DTUQ6CisgICAgeworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFJlYWREYXRhQmxvY2tTaXplKCBwY3R4LT5iYXBIZGwsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFJlYWREYXRhQmxvY2tTaXplIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSBhcyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZWdpc3RlcmVkCisgICAgICAgIC8vIHdpdGggQkFQIGZvciB0aGUgRXZlbnRDQiBidXQgd2UgYXJlIGFsc28gZ29pbmcgdG8gdXNlIGl0CisgICAgICAgIC8vIGFzIGEgaGVscGVyIGZ1bmN0aW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgaW52b2NhdGlvbgorICAgICAgICAvLyBydW5zIGluIEhDSSBjb21tYW5kIHNlbmRpbmcgY2FsbGVyIGNvbnRleHQgd2hpbGUgdGhlIGNhbGxiYWNrCisgICAgICAgIC8vIHdpbGwgaGFwcGVuIGluIEJBUCdzIGNvbnRleHQgd2hhdGV2ZXIgdGhhdCBtYXkgYmUKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9FdmVudENCKCBwY3R4LCAmSENJRXZ0LCBGQUxTRSApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfRXZlbnRDQiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgLyoKKyAgICAgIFN0YXR1cyBQYXJhbWV0ZXJzCisgICAgKi8KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfUkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSX0NNRDoKKyAgICB7CisgICAgICAgIHRCdGFtcFRMVkhDSV9SZWFkX0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kIFJlYWRGYWlsZWRDb250YWN0Q291bnRlckNtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQoIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYsIENvdW50LCAmUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyQ21kICk7CisKKyAgICAgICAgaWYgKCAhQlRBTVBfU1VDQ0VFREVEKCBVbnBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9GYWlsZWRfQ29udGFjdF9Db3VudGVyX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFJlYWRGYWlsZWRDb250YWN0Q291bnRlciggcGN0eC0+YmFwSGRsLAorICAgICAgICAgICAgICAgICAgICAmUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyQ21kLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBSZWFkRmFpbGVkQ29udGFjdENvdW50ZXIgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfUkVTRVRfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUl9DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfUmVzZXRfRmFpbGVkX0NvbnRhY3RfQ291bnRlcl9DbWQgUmVzZXRGYWlsZWRDb250YWN0Q291bnRlckNtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kKCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBwQnVmLCBDb3VudCwgJlJlc2V0RmFpbGVkQ29udGFjdENvdW50ZXJDbWQpOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1Jlc2V0X0ZhaWxlZF9Db250YWN0X0NvdW50ZXJfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBVbnBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQUmVzZXRGYWlsZWRDb250YWN0Q291bnRlciggcGN0eC0+YmFwSGRsLAorICAgICAgICAgICAgICAgICAgICAmUmVzZXRGYWlsZWRDb250YWN0Q291bnRlckNtZCwgJkhDSUV2dCApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5fQkFQUmVzZXRGYWlsZWRDb250YWN0Q291bnRlciBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9SRUFEX0xJTktfUVVBTElUWV9DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfUmVhZF9MaW5rX1F1YWxpdHlfQ21kIFJlYWRMaW5rUXVhbGl0eUNtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTGlua19RdWFsaXR5X0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZSZWFkTGlua1F1YWxpdHlDbWQgKTsKKworICAgICAgICBpZiAoICFCVEFNUF9TVUNDRUVERUQoIFVucGFja1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBidGFtcFVucGFja1RsdkhDSV9SZWFkX0xpbmtfUXVhbGl0eV9DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFVucGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBSZWFkTGlua1F1YWxpdHkoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSZWFkTGlua1F1YWxpdHlDbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFJlYWRMaW5rUXVhbGl0eSBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9SRUFEX1JTU0lfQ01EOgorICAgIHsKKyAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfUlNTSV9DbWQgUmVhZFJzc2lDbWQ7CisgICAgICAgIC8vIHVucGFjaworICAgICAgICBVbnBhY2tTdGF0dXMgPSBidGFtcFVucGFja1RsdkhDSV9SZWFkX1JTU0lfQ21kKCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBwQnVmLCBDb3VudCwgJlJlYWRSc3NpQ21kICk7CisKKyAgICAgICAgaWYgKCAhQlRBTVBfU1VDQ0VFREVEKCBVbnBhY2tTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogYnRhbXBVbnBhY2tUbHZIQ0lfUmVhZF9SU1NJX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFJlYWRSU1NJKCBwY3R4LT5iYXBIZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSZWFkUnNzaUNtZCwgJkhDSUV2dCApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5fQkFQUmVhZFJTU0kgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9BTVBfSU5GT1JNQVRJT05fQ01EOgorICAgIHsKKyAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZCBSZWFkTG9jYWxBbXBJbmZvcm1hdGlvbkNtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZSZWFkTG9jYWxBbXBJbmZvcm1hdGlvbkNtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0luZm9ybWF0aW9uX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFJlYWRMb2NhbEFNUEluZm8oIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUmVhZExvY2FsQW1wSW5mb3JtYXRpb25DbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFJlYWRMb2NhbEFNUEluZm8gZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfUkVBRF9MT0NBTF9BTVBfQVNTT0NfQ01EOgorICAgIHsKKyAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCBSZWFkTG9jYWxBbXBBc3NvY0NtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZSZWFkTG9jYWxBbXBBc3NvY0NtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9jYWxfQU1QX0Fzc29jX0NtZCBmYWlsZWQgc3RhdHVzICVkIiwgVW5wYWNrU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFJlYWRMb2NhbEFNUEFzc29jKCBwY3R4LT5iYXBIZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSZWFkTG9jYWxBbXBBc3NvY0NtZCwgJkhDSUV2dCApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5fQkFQUmVhZExvY2FsQU1QQXNzb2MgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQ19DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQgV3JpdGVSZW1vdGVBbXBBc3NvY0NtZDsKKyAgICAgICAgLy8gdW5wYWNrCisKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQ19DbWQgQ291bnQgPSAlZCIsIENvdW50KTsKKyAgICAgICAgRFVNUExPRygxLCBfX0ZVTkNUSU9OX18sICJIQ0lfV3JpdGVfUmVtb3RlX0FNUF9BU1NPQyBjbWQiLAorICAgICAgICAgICAgICAgIHBCdWYsCisgICAgICAgICAgICAgICAgQ291bnQpOworCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kKCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBwQnVmLCBDb3VudCwgJldyaXRlUmVtb3RlQW1wQXNzb2NDbWQgKTsKKworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdyaXRlUmVtb3RlQW1wQXNzb2NDbWQuYW1wX2Fzc29jX3JlbWFpbmluZ19sZW5ndGggPSAlZCIsCisgICAgICAgICAgICAgICAgICAgV3JpdGVSZW1vdGVBbXBBc3NvY0NtZC5hbXBfYXNzb2NfcmVtYWluaW5nX2xlbmd0aAorICAgICAgICAgICAgICAgICApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX1JlbW90ZV9BTVBfQVNTT0NfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBVbnBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisvLyNkZWZpbmUgQkFQX1VOSVRfVEVTVAorI2lmZGVmIEJBUF9VTklUX1RFU1QKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0ZXN0X2FtcF9hc3NvY19mcmFnbWVudFtdID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAweDAxLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweGRlLCAweGFkLCAweGJlLAorICAgICAgICAgICAgICAgIDB4ZWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisgICAgICAgICAgICAgICAgMHgwYywgMHgwMCwgMHg1NSwgMHg1MywgMHgyMCwgMHhjOSwgMHgwYywgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NTUsIDB4NTMsCisgICAgICAgICAgICAgICAgMHgyMCwgMHhjOSwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgICAgICAgICAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDYsIDB4MDAsCisgICAgICAgICAgICAgICAgMHgwMCwgMHhmNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwLCAweDAwCisgICAgICAgICAgICB9OworICAgICAgICAgICAgV3JpdGVSZW1vdGVBbXBBc3NvY0NtZC5wcmVzZW50ID0gMTsKKyAgICAgICAgICAgIFdyaXRlUmVtb3RlQW1wQXNzb2NDbWQucGh5X2xpbmtfaGFuZGxlID0gMTsKKyAgICAgICAgICAgIFdyaXRlUmVtb3RlQW1wQXNzb2NDbWQubGVuZ3RoX3NvX2ZhciA9IDA7CisgICAgICAgICAgICBXcml0ZVJlbW90ZUFtcEFzc29jQ21kLmFtcF9hc3NvY19yZW1haW5pbmdfbGVuZ3RoID0gNzQ7CisgICAgICAgICAgICAvKiBTZXQgdGhlIGFtcF9hc3NvY19mcmFnbWVudCB0byB0aGUgcmlnaHQgdmFsdWVzIG9mIE1BQyBhZGRyIGFuZAorICAgICAgICAgICAgICogY2hhbm5lbHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdm9zX21lbV9jb3B5KAorICAgICAgICAgICAgICAgIFdyaXRlUmVtb3RlQW1wQXNzb2NDbWQuYW1wX2Fzc29jX2ZyYWdtZW50LAorICAgICAgICAgICAgICAgIHRlc3RfYW1wX2Fzc29jX2ZyYWdtZW50LAorICAgICAgICAgICAgICAgIHNpemVvZiggdGVzdF9hbXBfYXNzb2NfZnJhZ21lbnQpKTsKKworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFdyaXRlUmVtb3RlQU1QQXNzb2MoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgJldyaXRlUmVtb3RlQW1wQXNzb2NDbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFdyaXRlUmVtb3RlQU1QQXNzb2MgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKgorICAgICAgRGVidWcgQ29tbWFuZHMKKyAgICAqLworICAgIGNhc2UgQlRBTVBfVExWX0hDSV9SRUFEX0xPT1BCQUNLX01PREVfQ01EOgorICAgIHsKKyAgICAgICAgdEJ0YW1wVExWSENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQgUmVhZExvb3BiYWNrTW9kZUNtZDsKKyAgICAgICAgLy8gdW5wYWNrCisgICAgICAgIFVucGFja1N0YXR1cyA9IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQoIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYsIENvdW50LCAmUmVhZExvb3BiYWNrTW9kZUNtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1JlYWRfTG9vcGJhY2tfTW9kZV9DbWQgZmFpbGVkIHN0YXR1cyAlZCIsIFVucGFja1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBSZWFkTG9vcGJhY2tNb2RlKCBwY3R4LT5iYXBIZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJlYWRMb29wYmFja01vZGVDbWQsICZIQ0lFdnQgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOX0JBUFJlYWRMb29wYmFja01vZGUgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfV1JJVEVfTE9PUEJBQ0tfTU9ERV9DTUQ6CisgICAgeworICAgICAgICB0QnRhbXBUTFZIQ0lfV3JpdGVfTG9vcGJhY2tfTW9kZV9DbWQgV3JpdGVMb29wYmFja01vZGVDbWQ7CisgICAgICAgIC8vIHVucGFjaworICAgICAgICBVbnBhY2tTdGF0dXMgPSBidGFtcFVucGFja1RsdkhDSV9Xcml0ZV9Mb29wYmFja19Nb2RlX0NtZCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgQ291bnQsICZXcml0ZUxvb3BiYWNrTW9kZUNtZCApOworCisgICAgICAgIGlmICggIUJUQU1QX1NVQ0NFRURFRCggVW5wYWNrU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IGJ0YW1wVW5wYWNrVGx2SENJX1dyaXRlX0xvb3BiYWNrX01vZGVfQ21kIGZhaWxlZCBzdGF0dXMgJWQiLCBVbnBhY2tTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5fQkFQV3JpdGVMb29wYmFja01vZGUoIHBjdHgtPmJhcEhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldyaXRlTG9vcGJhY2tNb2RlQ21kLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBXcml0ZUxvb3BiYWNrTW9kZSBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQlRBTVBfVExWX0hDSV9WRU5ET1JfU1BFQ0lGSUNfQ01EXzA6CisgICAgeworICAgICAgICBWb3NTdGF0dXMgPSBXTEFOX0JBUFZlbmRvclNwZWNpZmljQ21kMCggcGN0eC0+YmFwSGRsLCAmSENJRXZ0ICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTl9CQVBWZW5kb3JTcGVjaWZpY0NtZDAgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtYXkgbG9vayBzdHJhbmdlIGFzIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyZWQKKyAgICAgICAgLy8gd2l0aCBCQVAgZm9yIHRoZSBFdmVudENCIGJ1dCB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgaXQKKyAgICAgICAgLy8gYXMgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBpbnZvY2F0aW9uCisgICAgICAgIC8vIHJ1bnMgaW4gSENJIGNvbW1hbmQgc2VuZGluZyBjYWxsZXIgY29udGV4dCB3aGlsZSB0aGUgY2FsbGJhY2sKKyAgICAgICAgLy8gd2lsbCBoYXBwZW4gaW4gQkFQJ3MgY29udGV4dCB3aGF0ZXZlciB0aGF0IG1heSBiZQorICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX0V2ZW50Q0IoIHBjdHgsICZIQ0lFdnQsIEZBTFNFICk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJCc2xQcm9jZXNzSENJQ29tbWFuZDogV0xBTkJBUF9FdmVudENCIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJUQU1QX1RMVl9IQ0lfVkVORE9SX1NQRUNJRklDX0NNRF8xOgorICAgIHsKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTl9CQVBWZW5kb3JTcGVjaWZpY0NtZDEoIHBjdHgtPmJhcEhkbCwgJkhDSUV2dCApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5fQkFQVmVuZG9yU3BlY2lmaWNDbWQxIGZhaWxlZCBzdGF0dXMgJWQiLCBWb3NTdGF0dXMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvcgorICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWF5IGxvb2sgc3RyYW5nZSBhcyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZWdpc3RlcmVkCisgICAgICAgIC8vIHdpdGggQkFQIGZvciB0aGUgRXZlbnRDQiBidXQgd2UgYXJlIGFsc28gZ29pbmcgdG8gdXNlIGl0CisgICAgICAgIC8vIGFzIGEgaGVscGVyIGZ1bmN0aW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgaW52b2NhdGlvbgorICAgICAgICAvLyBydW5zIGluIEhDSSBjb21tYW5kIHNlbmRpbmcgY2FsbGVyIGNvbnRleHQgd2hpbGUgdGhlIGNhbGxiYWNrCisgICAgICAgIC8vIHdpbGwgaGFwcGVuIGluIEJBUCdzIGNvbnRleHQgd2hhdGV2ZXIgdGhhdCBtYXkgYmUKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9FdmVudENCKCBwY3R4LCAmSENJRXZ0LCBGQUxTRSApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQnNsUHJvY2Vzc0hDSUNvbW1hbmQ6IFdMQU5CQVBfRXZlbnRDQiBmYWlsZWQgc3RhdHVzICVkIiwgVm9zU3RhdHVzKTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIC8qIFVua25vdyBvcGNvZGUuIFJldHVybiBhIGNvbW1hbmQgc3RhdHVzIGV2ZW50Li4ud2l0aCAiVW5rbm93biBPcGNvZGUiIHN0YXR1cyAgKi8KKworICAgICAgICAvKiBGb3JtYXQgdGhlIGNvbW1hbmQgc3RhdHVzIGV2ZW50IHRvIHJldHVybi4uLiAqLworICAgICAgICBIQ0lFdnQuYmFwSENJRXZlbnRDb2RlID0gQlRBTVBfVExWX0hDSV9DT01NQU5EX1NUQVRVU19FVkVOVDsKKyAgICAgICAgSENJRXZ0LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQucHJlc2VudCA9IDE7CisgICAgICAgIEhDSUV2dC51LmJ0YW1wQ29tbWFuZFN0YXR1c0V2ZW50LnN0YXR1cyA9IFdMQU5CQVBfRVJST1JfVU5LTk9XTl9IQ0lfQ01ORDsKKyAgICAgICAgSENJRXZ0LnUuYnRhbXBDb21tYW5kU3RhdHVzRXZlbnQubnVtX2hjaV9jb21tYW5kX3BhY2tldHMgPSAxOworICAgICAgICBIQ0lFdnQudS5idGFtcENvbW1hbmRTdGF0dXNFdmVudC5jb21tYW5kX29wY29kZQorICAgICAgICA9IGNtZE9wY29kZTsKKworICAgICAgICAvLyB0aGlzIG1heSBsb29rIHN0cmFuZ2UgYXMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZAorICAgICAgICAvLyB3aXRoIEJBUCBmb3IgdGhlIEV2ZW50Q0IgYnV0IHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZSBpdAorICAgICAgICAvLyBhcyBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGludm9jYXRpb24KKyAgICAgICAgLy8gcnVucyBpbiBIQ0kgY29tbWFuZCBzZW5kaW5nIGNhbGxlciBjb250ZXh0IHdoaWxlIHRoZSBjYWxsYmFjaworICAgICAgICAvLyB3aWxsIGhhcHBlbiBpbiBCQVAncyBjb250ZXh0IHdoYXRldmVyIHRoYXQgbWF5IGJlCisgICAgICAgIFZvc1N0YXR1cyA9IFdMQU5CQVBfRXZlbnRDQiggcGN0eCwgJkhDSUV2dCwgRkFMU0UgKTsKKworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJzbFByb2Nlc3NIQ0lDb21tYW5kOiBXTEFOQkFQX0V2ZW50Q0IgZmFpbGVkIHN0YXR1cyAlZCIsIFZvc1N0YXR1cyk7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGVycm9yCisgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICB9CisKKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuKFRSVUUpOworfSAvLyBCc2xQcm9jZXNzSENJQ29tbWFuZCgpCisKKworLyoqCisgIEBicmllZiBCc2xQcm9jZXNzQUNMRGF0YVR4KCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvY2VzcyBhbiBlZ3Jlc3MgQUNMIGRhdGEgcGFja2V0CisKKyAgQHBhcmFtIHBjdHggOiBbaW5dIHB0ciB0byB0aGUgY2xpZW50IGNvbnRleHQKKyAgQHBhcmFtIHBCdWZmZXJfIDogW2luXSBwdHIgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBBQ0wgZGF0YSBwYWNrZXQKKyAgQHBhcmFtIHBDb3VudCA6IFtpbl0gc2l6ZSBvZiB0aGUgQUNMIGRhdGEgcGFja2V0IGJ1ZmZlcgorCisgIEByZXR1cm4KKyAgVFJVRSBpZiBhbGwgT0ssIEZBTFNFIG90aGVyd2lzZQorCisqLworI2RlZmluZSBCVEFNUF9VU0VfVk9TX1dSQVBQRVIKKy8vI3VuZGVmIEJUQU1QX1VTRV9WT1NfV1JBUFBFUgorI2lmZGVmIEJUQU1QX1VTRV9WT1NfV1JBUFBFUgorc3RhdGljIEJPT0wgQnNsUHJvY2Vzc0FDTERhdGFUeAorKAorICAgIEJzbENsaWVudEN0eFR5cGUqIHBjdHgsCisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICB2X1NJWkVfdCogcENvdW50CispCisjZWxzZQorc3RhdGljIEJPT0wgQnNsUHJvY2Vzc0FDTERhdGFUeAorKAorICAgIEJzbENsaWVudEN0eFR5cGUqIHBjdHgsCisgICAgTFBDVk9JRCBwQnVmZmVyXywKKyAgICB2X1NJWkVfdCogcENvdW50CispCisjZW5kaWYKK3sKKyNpZm5kZWYgQlRBTVBfVVNFX1ZPU19XUkFQUEVSCisgICAgTFBWT0lEIHBCdWZmZXIgPSAoTFBWT0lEKSBwQnVmZmVyXzsgLy8gY2FzdGF3YXkgY29uc3QtbmVzcyBvZiBwdHIKKyNlbmRpZgorICAgIEJPT0wgZmluZFBoeVN0YXR1czsKKyAgICBCc2xQaHlMaW5rQ3R4VHlwZSogcFBoeUN0eDsKKyAgICBWT1NfU1RBVFVTIFZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBXTEFOVExfQUNFbnVtVHlwZSBBYzsKKyAgICBoZGRfbGlzdF9ub2RlX3QqIHBMaW5rOworICAgIEJzbFR4TGlzdE5vZGVUeXBlICpwTm9kZTsKKyAgICB2X1NJWkVfdCBMaXN0U2l6ZTsKKyAgICAvLyBJIHdpbGwgYWNjZXNzIHRoZSBza2IgaW4gYSBWT1NTIHBhY2tldAorI2lmbmRlZiBCVEFNUF9VU0VfVk9TX1dSQVBQRVIKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworI2VuZGlmCisjaWYgMAorICAgIHN0YXRpYyBpbnQgbnVtX3BhY2tldHMgPSAwOworI2VuZGlmCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csICJCc2xQcm9jZXNzQUNMRGF0YVR4XG4iICk7CisKKyAgICAvLyBuZWVkIHRvIGZpbmQgdGhlIFBIWSBsaW5rIGZvciB0aGlzIEFDTCBkYXRhIHBrdCBiYXNlZCBvbiBwaHlfbGlua19oYW5kbGUKKyAgICAvLyBUT0RPIG5lZWQgc29tZSBlbmRpYW4tbmVzcyBjaGVjaz8KKyAgICAvLy8vZmluZFBoeVN0YXR1cyA9IEJzbEZpbmRQaHlDdHgoIHBjdHgsICoodl9VOF90ICopc2tiLT5kYXRhLCAmcFBoeUN0eCApOworICAgIC8vZmluZFBoeVN0YXR1cyA9IEJzbEZpbmRQaHlDdHgoIHBjdHgsICoodl9VOF90ICopcEJ1ZmZlciwgJnBQaHlDdHggKTsKKyAgICAvLyBKRVoxMDA2MDQ6IFRlbXBvcmFyeSBzaG9ydCBjdXQKKyAgICBwUGh5Q3R4ID0gJkJzbFBoeUxpbmtDdHhbMF07CisgICAgZmluZFBoeVN0YXR1cyA9IFZPU19UUlVFOworCisgICAgaWYgKCBmaW5kUGh5U3RhdHVzICkKKyAgICB7CisgICAgICAgIC8vVXNlIHRoZSBza2ItPmNiIGZpZWxkIHRvIGhvbGQgdGhlIGxpc3Qgbm9kZSBpbmZvcm1hdGlvbgorICAgICAgICBwTm9kZSA9IChCc2xUeExpc3ROb2RlVHlwZSAqKSAmc2tiLT5jYjsKKworICAgICAgICAvLyBUaGlzIGxpc3Qgbm9kZSBpbmZvIGluY2x1ZGVzIHRoZSBWT1MgcGt0CisgICAgICAgIHBOb2RlLT5za2IgPSBza2I7CisKKyAgICAgICAgLy8gc3RpY2sgdGhlIFNLQiBpbnRvIHRoZSBub2RlCisgICAgICAgIHBMaW5rID0gKGhkZF9saXN0X25vZGVfdCAqKSBwTm9kZTsKKyAgICAgICAgVm9zU3RhdHVzID0gV0xBTkJBUF9HZXRBY0Zyb21UeERhdGFQa3QocGN0eC0+YmFwSGRsLCBza2ItPmRhdGEsICZBYyk7CisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJCc2xQcm9jZXNzQUNMRGF0YVR4IFdMQU5CQVBfR2V0QWNGcm9tVHhEYXRhUGt0ICIKKyAgICAgICAgICAgICAgICAgImZhaWxlZCBzdGF0dXMgPSVkXG4iLCBWb3NTdGF0dXMgKTsKKworICAgICAgICAgICAgQWMgPSBXTEFOVExfQUNfQkU7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgcXVldWUgdGhlIHBrdCBpbnRvIHRoZSBjb3JyZWN0IHF1ZXVlCisgICAgICAgIC8vIFdlIHdpbGwgd2FudCB0byBpbnNlcnQgYSBub2RlIG9mIHR5cGUgQnNsVHhMaXN0Tm9kZVR5cGUgKHdhcyBnb2luZyB0byBiZSB2b3NfcGt0X2xpc3Rfbm9kZV90KQorICAgICAgICBzcGluX2xvY2tfYmgoJnBQaHlDdHgtPkFDTFR4UXVldWVbQWNdLmxvY2spOworICAgICAgICBWb3NTdGF0dXMgPSBoZGRfbGlzdF9pbnNlcnRfYmFjayggJnBQaHlDdHgtPkFDTFR4UXVldWVbQWNdLCBwTGluayApOworICAgICAgICBzcGluX3VubG9ja19iaCgmcFBoeUN0eC0+QUNMVHhRdWV1ZVtBY10ubG9jayk7CisKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBuZWVkIHRvIHNpZ25hbCBUTCB0aHJvdWdoIEJBUAorICAgICAgICBoZGRfbGlzdF9zaXplKCAmcFBoeUN0eC0+QUNMVHhRdWV1ZVtBY10sICZMaXN0U2l6ZSApOworCisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBMaXN0U2l6ZSA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTGV0IFRMIGtub3cgd2UgaGF2ZSBhIHBhY2tldCB0byBzZW5kIGZvciB0aGlzIEFDCisgICAgICAgICAgICBWb3NTdGF0dXMgPSBXTEFOQkFQX1NUQVBrdFBlbmRpbmcoIHBjdHgtPmJhcEhkbCwgcFBoeUN0eC0+UGh5TGlua0hkbCwgQWMgKTsKKworICAgICAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQnNsUHJvY2Vzc0FDTERhdGFUeCBXTEFOQkFQX1NUQVBrdFBlbmRpbmcgIgorICAgICAgICAgICAgICAgICJmYWlsZWQgc3RhdHVzID0lZFxuIiwgVm9zU3RhdHVzICk7CisgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybihUUlVFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQnNsUHJvY2Vzc0FDTERhdGFUeCBhdHRlbXB0aW5nIHRvIHNlbmQgIgorICAgICAgICAgICJkYXRhIGZvciBhIG5vbi1leGlzdGFudCBhc3NvY2F0aW9uXG4iICk7CisKKyAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICB9CisKKworfSAvLyBCc2xQcm9jZXNzQUNMRGF0YVR4KCkKKworCitzdGF0aWMgaW5saW5lIHZvaWQgKmhjaV9nZXRfZHJ2ZGF0YShzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKyAgICByZXR1cm4gaGRldi0+ZHJpdmVyX2RhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc2V0X2RydmRhdGEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKmRhdGEpCit7CisgICAgaGRldi0+ZHJpdmVyX2RhdGEgPSBkYXRhOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICBGdW5jdGlvbiBkZWZpbml0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIEJTTF9Jbml0KCkgLSBJbml0aWFsaXplIHRoZSBCU0wgTWlzYyBjaGFyIGRyaXZlcgorCisgIFRoaXMgaXMgY2FsbGVkIGluIHZvc19vcGVuKCksIHJpZ2h0IGFmdGVyIFdMQU5CQVBfT3BlbigpLCBhcyBwYXJ0IG9mCisgIGJyaW5naW5nIHVwIHRoZSBCVC1BTVAgUEFMIChCQVApCisgIHZvc19vcGVuKCkgd2lsbCBwYXNzIGluIHRoZSBWT1MgY29udGV4dC4gSW4gd2hpY2ggYSBCU0wgY29udGV4dCBjYW4gYmUgY3JlYXRlZC4KKworICBccGFyYW0gIC0gTkEKKworICBccmV0dXJuIC0gMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vaW50IEJTTF9Jbml0ICh2b2lkICpwQ3R4KQoraW50IEJTTF9Jbml0ICggdl9QVk9JRF90ICBwdm9zR0N0eCApCit7CisgICAgQnNsQ2xpZW50Q3R4VHlwZSogcGN0eCA9IE5VTEw7CisgICAgcHRCdGFtcEhhbmRsZSBiYXBIZGwgPSBOVUxMOyAgICAgICAgLy8gb3VyIGhhbmRsZSBpbiBCQVAKKyAgICAvL3B0QnRhbXBDb250ZXh0ICBwQnRhbXBDdHggPSBOVUxMOworICAgIGludCBlcnIgPSAwOworICAgIHN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gTlVMTDsKKyAgICAvL3N0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOyAvLyBPdXIgcGFyZW50IHdsYW4gbmV0d29yayBkZXZpY2UKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7ICAvLyBVc2VkIHRvIHJldHJpZXZlIHRoZSBwYXJlbnQgV0xBTiBkZXZpY2UKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKyAgICBoZGRfY29uZmlnX3QgKnBDb25maWcgPSBOVUxMOworICAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICpwQWRhcHRlck5vZGUgPSBOVUxMOworICAgIFZPU19TVEFUVVMgc3RhdHVzOworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJTTF9Jbml0Iik7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgQWxsb2NhdGUgKGFuZCBzYW5pdHkgY2hlY2s/ISkgQlNMIGNvbnRyb2wgYmxvY2sKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvL3Zvc19hbGxvY19jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX0JTTCwgKHZfVk9JRF90KiopJnBjdHgsIHNpemVvZihCc2xDbGllbnRDdHhUeXBlKSk7CisgICAgcGN0eCA9ICZCc2xDbGllbnRDdHhbMF07CisKKyAgICBiYXBIZGwgPSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfQkFQLCBwdm9zR0N0eCk7CisgICAgaWYgKCBOVUxMID09IGJhcEhkbCApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQkFQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBCU0xfSW5pdCIpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKyAgICAvLyBTYXZlIGF3YXkgdGhlIGJ0YW1wIChhY3R1YWxseSB0aGUgdm9zKSBjb250ZXh0CisgICAgZ3BDdHggPSBwdm9zR0N0eDsKKworICAgIC8qIFNhdmUgYXdheSB0aGUgcG9pbnRlciB0byB0aGUgQlQtQU1QIFBBTCBjb250ZXh0IGluIHRoZSBCU0wgZHJpdmVyIGNvbnRleHQgKi8KKyAgICBwY3R4LT5iYXBIZGwgPSBiYXBIZGw7CisKKyAgICAvKiBTYXZlIGF3YXkgdGhlIHBvaW50ZXIgdG8gdGhlIEJTTCBkcml2ZXIgY29udGV4dCBpbiBhIGdsb2JhbCAoZml4IHRoaXMpICovCisgICAgZ3BCc2xjdHggPSBwY3R4OworCisgICAgLyogSW5pdGlhbGl6ZSBhbGwgdGhlIFBoeSBDb250ZXh0cyB0byB1bi11c2VkICovCisgICAgQnNsSW5pdFBoeUN0eCgpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgUnggZmllbGRzIGluIHRoZSBIQ0kgZHJpdmVyIGNvbnRleHQgKi8KKyAgICAvL3BjdHgtPnJ4X3N0YXRlID0gUkVDVl9XQUlUX1BBQ0tFVF9UWVBFOworICAgIHBjdHgtPnJ4X2NvdW50ID0gMDsKKyAgICBwY3R4LT5yeF9za2IgPSBOVUxMOworCisgICAgLyogSkVaMTAwNzEzOiBUZW1wb3JhcmlseSB0aGUgVHggc2tiIHF1ZXVlIHdpbGwgaGF2ZSBkZXB0aCBvbmUuKi8KKyAgICAvLyBEb24ndCBkaXN0dXJiIHR4X3NrYgorICAgIC8vcGN0eC0+dHhfc2tiID0gTlVMTDsKKyAgICAvL3BjdHgtPnR4X3NrYiA9IGFsbG9jX3NrYihXTEFOQkFQX01BWF84MDIxMV9QQUxfUERVX1NJWkUrMTIsIEdGUF9BVE9NSUMpOworCisgICAgcGN0eC0+aGRldiA9IE5VTEw7CisgICAgLy9HZXQgdGhlIEhERCBjb250ZXh0LgorICAgIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9IREQsIHB2b3NHQ3R4ICk7CisgICAgaWYoTlVMTCAhPSBwSGRkQ3R4KQorICAgIHsKKyAgICAgICAgcENvbmZpZyA9IHBIZGRDdHgtPmNmZ19pbmk7CisgICAgfQorICAgIGlmKE5VTEwgPT0gcENvbmZpZykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAiRGlkbid0IHJlZ2lzdGVyIGFzIEhDSSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYoMCA9PSBwQ29uZmlnLT5lbmFibGVCdEFtcCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAiRGlkbid0IHJlZ2lzdGVyIGFzIEhDSSBkZXZpY2UsIHVzZXIgb3B0aW9uKGdFbmFibGVCdEFtcCkgaXMgc2V0IHRvIDAiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmIChWT1NfU1RBX1NBUF9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlciAoIHBIZGRDdHgsICZwQWRhcHRlck5vZGUgKTsKKyAgICAgICAgaWYgKCBOVUxMICE9IHBBZGFwdGVyTm9kZSAmJiBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBXTEFOX0hERF9TT0ZUQVAgPT0gcEFkYXB0ZXJOb2RlLT5wQWRhcHRlci0+ZGV2aWNlX21vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwgV0xBTl9IRERfU09GVEFQKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFdMQU5fSEREX1AyUF9HTyA9PSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyLT5kZXZpY2VfbW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LCBXTEFOX0hERF9QMlBfR08pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwgV0xBTl9IRERfSU5GUkFfU1RBVElPTik7CisKKworICAgIGlmICggTlVMTCA9PSBwQWRhcHRlciApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSEREIEFkYXB0ZXIgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIEJTTF9Jbml0Iik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogU2F2ZSBhd2F5IHRoZSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgV0xBTiBkZXZpY2UgaW4gQlNMIGRyaXZlciBjb250ZXh0ICovCisgICAgcGN0eC0+cF9kZXYgPSBwQWRhcHRlci0+ZGV2OworCisgICAgLyogSW5pdGlhbGl6ZSBIQ0kgZGV2aWNlICovCisgICAgaGRldiA9IGhjaV9hbGxvY19kZXYoKTsKKyAgICBpZiAoIWhkZXYpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNhbid0IGFsbG9jYXRlIEhDSSBkZXZpY2UgaW4gQlNMX0luaXQiKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvKiBTYXZlIGF3YXkgdGhlIEhDSSBkZXZpY2UgcG9pbnRlciBpbiB0aGUgQlNMIGRyaXZlciBjb250ZXh0ICovCisgICAgcGN0eC0+aGRldiA9IGhkZXY7CisKKyNpZiBkZWZpbmVkIEhDSV84MDIxMSB8fCBkZWZpbmVkIEhDSV9BTVAKKyNkZWZpbmUgQlVJTERfRk9SX0JMVUVUT09USF9ORVhUXzJfNgorI2Vsc2UKKyN1bmRlZiBCVUlMRF9GT1JfQkxVRVRPT1RIX05FWFRfMl82CisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZPUl9CTFVFVE9PVEhfTkVYVF8yXzYKKyAgICAvKiBIQ0kgImJ1cyB0eXBlIiBvZiBIQ0lfVklSVFVBTCBzaG91bGQgYXBwbHkgKi8KKyAgICBoZGV2LT5idXMgPSBIQ0lfVklSVFVBTDsKKyAgICAvKiBTZXQgdGhlIGRldl90eXBlIHRvIEJULUFNUCA4MDIuMTEgKi8KKyNpZmRlZiBIQ0lfODAyMTEKKyAgICBoZGV2LT5kZXZfdHlwZSA9IEhDSV84MDIxMTsKKyNlbHNlCisgICAgaGRldi0+ZGV2X3R5cGUgPSBIQ0lfQU1QOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0JUQU1QX1VUCisgICAgLyogRm9yIHRoZSAicmVhbCIgQmx1ZVogYnVpbGQsIERPTidUIFNldCB0aGUgZGV2aWNlICJxdWlya3MiIHRvIGluZGljYXRlIFJBVyAqLworICAgIHNldF9iaXQoSENJX1FVSVJLX1JBV19ERVZJQ0UsICZoZGV2LT5xdWlya3MpOworI2VuZGlmCisjZWxzZSAvL0JVSUxEX0ZPUl9CTFVFVE9PVEhfTkVYVF8yXzYKKyAgICAvKiBIQ0kgImJ1cyB0eXBlIiBvZiBIQ0lfVklSVFVBTCBzaG91bGQgYXBwbHkgKi8KKyAgICBoZGV2LT50eXBlID0gSENJX1ZJUlRVQUw7CisgICAgLyogU2V0IHRoZSBkZXZfdHlwZSB0byBCVC1BTVAgODAyLjExICovCisgICAgLy9oZGV2LT5kZXZfdHlwZSA9IEhDSV84MDIxMTsKKyAgICAvLy8vaGRldi0+ZGV2X3R5cGUgPSBIQ0lfQU1QOworICAgIC8qIEZvciB0aGUgInRlbXBvcmFyeSIgQmx1ZVogYnVpbGQsIFNldCB0aGUgZGV2aWNlICJxdWlya3MiIHRvIGluZGljYXRlIFJBVyAqLworICAgIHNldF9iaXQoSENJX1FVSVJLX1JBV19ERVZJQ0UsICZoZGV2LT5xdWlya3MpOworI2VuZGlmIC8vQlVJTERfRk9SX0JMVUVUT09USF9ORVhUXzJfNgorICAgIC8qIFNhdmUgYXdheSB0aGUgQlNMIGRyaXZlciBwb2ludGVyIGluIHRoZSBIQ0kgZGV2aWNlIGNvbnRleHQgKi8KKworICAgIGhjaV9zZXRfZHJ2ZGF0YShoZGV2LCBwY3R4KTsKKyAgICAvKiBTZXQgdGhlIHBhcmVudCBkZXZpY2UgZm9yIHRoaXMgSENJIGRldmljZS4gIFRoaXMgaXMgb3VyIFdMQU4gbmV0X2RldmljZSAqLworICAgIFNFVF9IQ0lERVZfREVWKGhkZXYsICZwY3R4LT5wX2Rldi0+ZGV2KTsKKworICAgIGhkZXYtPm9wZW4gICAgID0gQlNMX09wZW47CisgICAgaGRldi0+Y2xvc2UgICAgPSBCU0xfQ2xvc2U7CisgICAgaGRldi0+Zmx1c2ggICAgPSBCU0xfRmx1c2g7CisgICAgaGRldi0+c2VuZCAgICAgPSBCU0xfV3JpdGU7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNCwwKSkKKyAgICBoZGV2LT5kZXN0cnVjdCA9IEJTTF9EZXN0cnVjdDsKKyAgICBoZGV2LT5vd25lciA9IFRISVNfTU9EVUxFOworI2VuZGlmCisgICAgaGRldi0+aW9jdGwgICAgPSBCU0xfSU9Db250cm9sOworCisKKyAgICAvKiBUaW1lb3V0IGJlZm9yZSBpdCBpcyBzYWZlIHRvIHNlbmQgdGhlIGZpcnN0IEhDSSBwYWNrZXQgKi8KKyAgICBtc2xlZXAoMTAwMCk7CisKKyAgICAvKiBSZWdpc3RlciBIQ0kgZGV2aWNlICovCisgICAgZXJyID0gaGNpX3JlZ2lzdGVyX2RldihoZGV2KTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZWdpc3RlciBIQ0kgZGV2aWNlLCBlcnI9JWRcbiIsIGVycik7CisgICAgICAgIHBjdHgtPmhkZXYgPSBOVUxMOworICAgICAgICBoY2lfZnJlZV9kZXYoaGRldik7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHBIZGRDdHgtPmlzQW1wQWxsb3dlZCA9IFZPU19UUlVFOworICAgIHJldHVybiAwOworfSAvLyBCU0xfSW5pdCgpCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBCU0xfRGVpbml0KCkgLSBEZS1pbml0aWFsaXplIHRoZSBCU0wgTWlzYyBjaGFyIGRyaXZlcgorCisgIFRoaXMgaXMgY2FsbGVkIGluIGJ5IFdMQU5CQVBfQ2xvc2UoKSBhcyBwYXJ0IG9mIGJyaW5naW5nIGRvd24gdGhlIEJULUFNUCBQQUwgKEJBUCkKKworICBccGFyYW0gIC0gTkEKKworICBccmV0dXJuIC0gMCBmb3Igc3VjY2VzcyBub24temVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IEJTTF9EZWluaXQoIHZfUFZPSURfdCAgcHZvc0dDdHggKQoreworICAgIC8vaW50IGVyciA9IDA7CisgICAgc3RydWN0IGhjaV9kZXYgKmhkZXY7CisgICAgQnNsQ2xpZW50Q3R4VHlwZSogcGN0eCA9IE5VTEw7CisKKyAgICAvL3BjdHggPSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfQlNMLCBwdm9zR0N0eCk7CisgICAgcGN0eCA9IGdwQnNsY3R4OworCisgICAgaWYgKCBOVUxMID09IHBjdHggKQorICAgIHsKKyAgICAgICAgLy9WT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQlNMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBCU0wgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIEJTTF9Jbml0Iik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogUmV0cmlldmUgdGhlIEhDSSBkZXZpY2UgcG9pbnRlciBmcm9tIHRoZSBCU0wgZHJpdmVyIGNvbnRleHQgKi8KKyAgICBoZGV2ID0gcGN0eC0+aGRldjsKKworICAgIGlmICghaGRldikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBoY2lfdW5yZWdpc3Rlcl9kZXYgaXMgY2FsbGVkIGFnYWluIGhlcmUsIGluIGNhc2UgdXNlciBkaWRuJ3QgY2FsbCBpdCAqLworICAgIC8qIFVucmVnaXN0ZXIgZGV2aWNlIGZyb20gQmx1ZVo7IGZjbiBzZW5kcyB1cyBIQ0kgY29tbWFuZHMgYmVmb3JlIGl0IHJldHVybnMgKi8KKyAgICAvKiBBbmQgdGhlbiB0aGUgcmVnaXN0ZXJlZCBoZGV2LT5jbG9zZSBmY24gc2hvdWxkIGJlIGNhbGxlZCBieSBCbHVlWiAoQlNMX0Nsb3NlKSAqLworICAgIGhjaV91bnJlZ2lzdGVyX2RldihoZGV2KTsKKyAgICAvKiBCU0xfQ2xvc2UgaXMgY2FsbGVkIGFnYWluIGhlcmUsIGluIGNhc2UgQmx1ZVogZGlkbid0IGNhbGwgaXQgKi8KKyAgICBCU0xfQ2xvc2UoaGRldik7CisgICAgaGNpX2ZyZWVfZGV2KGhkZXYpOworICAgIHBjdHgtPmhkZXYgPSBOVUxMOworCisgICAgcmV0dXJuIDA7Cit9IC8vIEJTTF9EZWluaXQoKQorCisKKy8qKgorICBAYnJpZWYgQlNMX09wZW4oKSAtIFRoaXMgZnVuY3Rpb24gb3BlbnMgYSBkZXZpY2UgZm9yIHJlYWRpbmcsIGFuZCB3cml0aW5nLgorICBBbiBhcHBsaWNhdGlvbiBpbmRpcmVjdGx5IGludm9rZXMgdGhpcyBmdW5jdGlvbiB3aGVuIGl0IGNhbGxzIHRoZSBmb3BlbigpCisgIHN5c3RlbSBjYWxsIHRvIG9wZW4gYSBzcGVjaWFsIGRldmljZSBmaWxlIG5hbWVzLgorCisgIEBwYXJhbSAqaGRldiA6IFtpbl0gcG9pbnRlciB0byB0aGUgb3BlbiBIQ0kgZGV2aWNlIHN0cnVjdHVyZS4KKyAgQlNMX0luaXQgKERldmljZSBNYW5hZ2VyKSBmdW5jdGlvbiBjcmVhdGVzIGFuZCBzdG9yZXMgdGhpcyBIQ0kKKyAgZGV2aWNlIGNvbnRleHQgaW4gdGhlIEJTTCBjb250ZXh0LgorCisgIEByZXR1cm4KKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RhdHVzIGNvZGUuICBOZWdhdGl2ZSBjb2RlcyBhcmUgZmFpbHVyZXMuCisKKyAgTkI6IEkgZG9uJ3Qgc2VlbSB0byBiZSBmb2xsb3dpbmcgdGhpcyBjb252ZW50aW9uLgorKi8KKy8vc3RhdGljIGludCBCU0xfT3BlbihzdHJ1Y3QgaW5vZGUgKnBJbm9kZSwgc3RydWN0IGZpbGUgKnBGaWxlKQorc3RhdGljIGludCBCU0xfT3Blbiggc3RydWN0IGhjaV9kZXYgKmhkZXYgKQoreworICAgIFZPU19TVEFUVVMgVm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIEJzbENsaWVudEN0eFR5cGUqIHBjdHggPSAoQnNsQ2xpZW50Q3R4VHlwZSAqKShoY2lfZ2V0X2RydmRhdGEoaGRldikpOworICAgIHZfVTE2X3QgaTsKKyAgICBCT09MIHJ2YWw7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQlNMX09wZW4iKTsKKworICAgIC8qICB5b3UgY2FuIG9ubHkgb3BlbiBhIGJ0YW1wIGRldmljZSBvbmUgdGltZSAqLworICAgIGlmIChiQnNsSW5pdGVkKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQlNMX09wZW46IEFscmVhZHkgT3BlbmVkLiIpOworICAgICAgICByZXR1cm4gLUVQRVJNOyAvKiBPcGVyYXRpb24gbm90IHBlcm1pdHRlZCAqLworICAgIH0KKworICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJTTENsaWVudExvY2sgYWxyZWFkeSBpbml0ZWQiKTsKKyAgICAgICAgLy8gcmV0dXJuIC1FSU87ICAvKiBJL08gZXJyb3IgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgVm9zU3RhdHVzID0gdm9zX2xpc3RfaW5pdCggJkJzbFBoeUxpbmtzRGVzY1Bvb2wgKTsKKworICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgLy9yZXR1cm4gLUVJTzsgIC8qIEkvTyBlcnJvciAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBub3cgd2UgbmVlZCB0byBwb3B1bGF0ZSB0aGlzIHBvb2wgd2l0aCB0aGUgZnJlZSBwa3QgZGVzYyBmcm9tIHRoZSBhcnJheQorICAgIGZvciAoIGk9MDsgaTxCU0xfTUFYX1BIWV9MSU5LUzsgaSsrICkKKyAgICB7CisgICAgICAgIFZvc1N0YXR1cyA9IHZvc19saXN0X2luc2VydF9mcm9udCggJkJzbFBoeUxpbmtzRGVzY1Bvb2wsICZCc2xQaHlMaW5rc0Rlc2NbaV0ubm9kZSApOworICAgICAgICBWT1NfQVNTRVJUKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggVm9zU3RhdHVzICkgKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHJlZHVuZGVudC4gIFNlZSB0aGUgY2hlY2sgYWJvdmUgb24gKGZwLT5wcml2YXRlX2RhdGEgIT0gTlVMTCkKKyAgICBiQnNsSW5pdGVkID0gVFJVRTsKKworICAgIHJ2YWwgPSBCc2xGaW5kQW5kSW5pdENsaWVudEN0eCggJnBjdHggKTsKKworICAgIGlmKHJ2YWwgIT0gVFJVRSkKKyAgICB7CisgICAgICAgIC8vIFdoZXJlIGlzIHRoZSBjbGVhbi11cCBpbiBjYXNlIHRoZSBhYm92ZSBCc2xGaW5kQW5kSW5pdENsaWVudEN0eCgpIGNhbGwKKyAgICAgICAgLy8gZmFpbHM/CisgICAgICAgIC8vcmV0dXJuIC1FSU87ICAvKiBJL08gZXJyb3IgKi8KKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJTTEZpbmRBbmRJbml0Q2xpZW50Q29udGV4dCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisKKyAgICAvKiBMZXQgTGludXggZm9wZW4oKSBrbm93IGV2ZXJ5dGhpbmcgaXMgYWxsIHJpZ2h0ICovCisgICAgcmV0dXJuIDA7Cit9IC8vIEJTTF9PcGVuKCkKKworLyoqCisgIEBicmllZiBCU0xfQ2xvc2UoKSAtIFRoaXMgZnVuY3Rpb24gY2xvc2VzIGEgZGV2aWNlIGNvbnRleHQgY3JlYXRlZCBieQorICBCU0xfT3BlbigpLiBNYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyBBTVAgUEFMIHNodXQgZG93bi4KKworICBAcGFyYW0gKmhkZXYgOiBbaW5dIHBvaW50ZXIgdG8gdGhlIG9wZW4gSENJIGRldmljZSBzdHJ1Y3R1cmUuCisgIEJTTF9Jbml0IChEZXZpY2UgTWFuYWdlcikgZnVuY3Rpb24gY3JlYXRlcyBhbmQgc3RvcmVzIHRoaXMgSENJCisgIGRldmljZSBjb250ZXh0IGluIHRoZSBCU0wgY29udGV4dC4KKworICBAcmV0dXJuCisgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3MuIEZBTFNFIGluZGljYXRlcyBmYWlsdXJlLgorKi8KKy8vc3RhdGljIGludCBCU0xfQ2xvc2UgKHN0cnVjdCBpbm9kZSAqcElub2RlLCBzdHJ1Y3QgZmlsZSAqcEZpbGUpCitzdGF0aWMgaW50IEJTTF9DbG9zZSAoIHN0cnVjdCBoY2lfZGV2ICpoZGV2ICkKK3sKKyAgICBWT1NfU1RBVFVTIFZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBCc2xDbGllbnRDdHhUeXBlKiBwY3R4OworICAgIHZvc19saXN0X25vZGVfdCogcExpbms7CisgICAgdl9VMTZfdCBpOworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dCggVk9TX01PRFVMRV9JRF9IREQsIE5VTEwgKTsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4OworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJTTF9DbG9zZSIpOworICAgIGlmIChOVUxMICE9IHBWb3NDb250ZXh0KQorICAgIHsKKyAgICAgICBwSGRkQ3R4ID0gdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0hERCwgcFZvc0NvbnRleHQpOworICAgICAgIGlmIChOVUxMICE9IHBIZGRDdHgpCisgICAgICAgeworICAgICAgICAgIHBIZGRDdHgtPmlzQW1wQWxsb3dlZCA9IFZPU19GQUxTRTsKKyAgICAgICB9CisgICAgfQorCisgICAgLy8gaXQgbWF5IHNlZW0gdGhlcmUgaXMgc29tZSByaXNrIGhlcmUgYmVjYXVzZSB3ZSBhcmUgdXNpbmcgYSB2YWx1ZQorICAgIC8vIHBhc3NlZCBpbnRvIHVzIGFzIGEgcG9pbnRlci4gd2hhdCBpZiB0aGlzIHBvaW50ZXIgaXMgMCBvciBwb2ludHMgdG8KKyAgICAvLyBzb21lcGxhY2UgYmFkPyBhcyBpdCB0dXJucyBvdXQgdGhlIGNhbGxlciBpcyBkZXZpY2UgbWFuYWdlciBhbmQgbm90CisgICAgLy8gdGhlIGFwcGxpY2F0aW9uLiBrZXJuZWwgc2hvdWxkIHRyYXAgc3VjaCBpbnZhbGlkIGFjY2VzcyBidXQgd2Ugd2lsbCBjaGVjaworICAgIC8vIGZvciBOVUxMIHBvaW50ZXIKKyAgICBpZiAoIGhkZXYgPT0gTlVMTCApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQlNMX0Nsb3NlOiBOVUxMIGhkZXYgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBwY3R4ID0gKEJzbENsaWVudEN0eFR5cGUgKikoaGNpX2dldF9kcnZkYXRhKGhkZXYpKTsKKworICAgIGlmICggcGN0eCA9PSBOVUxMIHx8ICFiQnNsSW5pdGVkKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAiQlNMX0Nsb3NlOiAlcyBpcyBub3Qgb3BlbiIsIGhkZXYtPm5hbWUpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvLyBuZWVkIHRvIGNsZWFudXAgYW55IHBlciBQSFkgc3RhdGUgYW5kIHRoZSBjb21tb24gUlggc3RhdGUKKyAgICBCc2xSZWxlYXNlQ2xpZW50Q3R4KCBwY3R4ICk7CisgICAgZm9yICggaT0wOyBpPEJzbFBoeUxpbmtzRGVzY1Bvb2wuY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBWb3NTdGF0dXMgPSB2b3NfbGlzdF9yZW1vdmVfZnJvbnQoICZCc2xQaHlMaW5rc0Rlc2NQb29sLCAmcExpbmsgKTsKKyAgICAgICAgLy9ub3RoaW5nIHRvIGZyZWUgYXMgdGhlIG5vZGVzIGNhbWUgZnJvbSBCc2xQaHlMaW5rc0Rlc2MsIHdoaWNoIGlzIGEgc3RhdGljCisgICAgICAgIC8vdGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgdm9zX2xpc3RfZGVzdHJveSgpIHRvIGdvIHRocm91Z2gKKyAgICB9CisgICAgVm9zU3RhdHVzID0gdm9zX2xpc3RfZGVzdHJveSggJkJzbFBoeUxpbmtzRGVzY1Bvb2wgKTsKKworICAgIFZPU19BU1NFUlQoVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBWb3NTdGF0dXMgKSApOworCisKKyAgICBiQnNsSW5pdGVkID0gRkFMU0U7CisKKy8vIFRoZSBuZXh0IGxpbmUgaXMgdGVtcG9yYXJ5CisgICAgcmV0dXJuKDApOworfSAvL0JTTF9DbG9zZSgpCisKKy8qKgorICBAYnJpZWYgQlNMX0lPQ29udHJvbCgpIC0gVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGNvbW1hbmQgdG8gYSBkZXZpY2UuCisKKyAgQHBhcmFtICpoZGV2IDogW2luXSBwb2ludGVyIHRvIHRoZSBvcGVuIEhDSSBkZXZpY2Ugc3RydWN0dXJlLgorICBAcGFyYW0gY21kIDogW2luXSBJL08gY29udHJvbCBvcGVyYXRpb24gdG8gcGVyZm9ybS4gVGhlc2UgY29kZXMgYXJlCisgIGRldmljZS1zcGVjaWZpYyBhbmQgYXJlIHVzdWFsbHkgZXhwb3NlZCB0byBkZXZlbG9wZXJzIHRocm91Z2ggYSBoZWFkZXIgZmlsZS4KKyAgQHBhcmFtIGFyZyA6IFtpbl0gQWRkaXRpb25hbCBpbnB1dCBwYXJhbWV0ZXIuCisKKyAgQHJldHVybgorICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLiBGQUxTRSBpbmRpY2F0ZXMgZmFpbHVyZS4KKyovCisvL3N0YXRpYyBsb25nIEJTTF9JT0NvbnRyb2woc3RydWN0IGZpbGUgKnBGaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgQlNMX0lPQ29udHJvbChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJTTF9JT0NvbnRyb2wgLSBub3Qgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuKFRSVUUpOworfSAvLyBCU0xfSU9Db250cm9sKCkKKworLyoqCisgIEBicmllZiBCU0xfRmx1c2goKSAtIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyBhbGwgcGVuZGluZyBjb21tYW5kcyBvbiBhIGRldmljZS4KKworICBAcGFyYW0gKmhkZXYgOiBbaW5dIHBvaW50ZXIgdG8gdGhlIG9wZW4gSENJIGRldmljZSBzdHJ1Y3R1cmUuCisKKyAgQHJldHVybgorICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLiBGQUxTRSBpbmRpY2F0ZXMgZmFpbHVyZS4KKyovCitzdGF0aWMgaW50IEJTTF9GbHVzaChzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKyAgICBWT1NfU1RBVFVTIFZvc1N0YXR1czsKKyAgICBCc2xQaHlMaW5rQ3R4VHlwZSogcFBoeUN0eDsKKworICAgIC8vVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJTTF9GbHVzaCAtIHdpbGwgZmx1c2ggQUxMIFR4IFF1ZXVlcyIpOworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIC0gd2lsbCBmbHVzaCBBTEwgVHggUXVldWVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIC8qIEZsdXNoIHRoZSBUWCBxdWV1ZSAqLworICAgIC8vIEpFWjEwMDYwNDogVGVtcG9yYXJ5IHNob3J0IGN1dAorICAgIHBQaHlDdHggPSAmQnNsUGh5TGlua0N0eFswXTsKKworICAgIFZvc1N0YXR1cyA9IEJzbEZsdXNoVHhRdWV1ZXMgKCBwUGh5Q3R4KTsKKworICAgIC8vcmV0dXJuKFRSVUUpOworICAgIHJldHVybigwKTsKK30gLy8gQlNMX0ZsdXNoKCkKKworLyoqCisgIEBicmllZiBCU0xfRGVzdHJ1Y3QoKSAtIFRoaXMgZnVuY3Rpb24gZGVzdHJveXMgYW4gSENJIGRldmljZS4KKworICBAcGFyYW0gKmhkZXYgOiBbaW5dIHBvaW50ZXIgdG8gdGhlIG9wZW4gSENJIGRldmljZSBzdHJ1Y3R1cmUuCisKKyAgQHJldHVybgorICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLiBGQUxTRSBpbmRpY2F0ZXMgZmFpbHVyZS4KKyovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNCwwKSkKK3N0YXRpYyB2b2lkIEJTTF9EZXN0cnVjdChzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQlNMX0Rlc3RydWN0IC0gbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybjsgLy8oVFJVRSk7Cit9IC8vIEJTTF9EZXN0cnVjdCgpCisjZW5kaWYKKworCisvKioKKyAgQGJyaWVmIEJTTF9Xcml0ZSgpIC0gVGhpcyBmdW5jdGlvbiB3cml0ZXMgZGF0YSB0byB0aGUgZGV2aWNlLgorICBBbiBhcHBsaWNhdGlvbiBpbmRpcmVjdGx5IGludm9rZXMgdGhpcyBmdW5jdGlvbiB3aGVuIGl0IGNhbGxzIHRoZSBmd3JpdGUoKQorICBzeXN0ZW0gY2FsbCB0byB3cml0ZSB0byBhIHNwZWNpYWwgZGV2aWNlIGZpbGUuCisKKyAgQHBhcmFtICpza2IgOiBbaW5dIHBvaW50ZXIgdG8gdGhlIHNrYiBiZWluZyB0cmFuc21pdHRlZC4gVGhpcyBza2IgY29udGFpbnMKKyAgdGhlIEhDSSBjb21tYW5kIG9yIEhDSSBkYXRhLiAgQWxzbyBhIHBvaW50ZXIgKGhkZXYpIHRvIHRoZSBIQ0kgZGV2aWNlIHN0cnVjdAorCisgIEByZXR1cm4KKyAgVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluZGljYXRlcyBzdWNjZXNzLgorICBOZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgdmFyaW91cyBmYWlsdXJlcy4KKyovCisvL3N0YXRpYyBzc2l6ZV90IEJTTF9Xcml0ZShzdHJ1Y3QgZmlsZSAqcEZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpwQnVmZmVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IENvdW50LCBsb2ZmX3QgKnBPZmYpCitzdGF0aWMgaW50IEJTTF9Xcml0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgIHN0cnVjdCBoY2lfZGV2ICpoZGV2OworICAgIEJzbENsaWVudEN0eFR5cGUqIHBjdHg7CisgICAgdl9TSVpFX3Qgd3JpdHRlbiA9IDA7CisgICAgQk9PTCBzdGF0dXM7CisgICAgLy9jaGFyICpic2xCdWZmID0gTlVMTDsKKyAgICBCc2xIY2lXb3JrU3RydWN0dXJlICpwSGNpQ29udGV4dDsKKworICAgIC8vVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIC8vIFNhbml0eSBjaGVjayBpbnB1dHMKKyAgICBpZiAoIHNrYiA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogc2tiIGlzIGJhZCBpL3AiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAvL3JldHVybiAtRUZBVUxUOyAvKiBCYWQgYWRkcmVzcyAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IENvdW50IChza2ItPmxlbik9JWQiLCBfX0ZVTkNUSU9OX18sIHNrYi0+bGVuKTsKKworICAgIC8vIFNhbml0eSBjaGVjayBpbnB1dHMKKyAgICBpZiAoIDAgPT0gc2tiLT5sZW4gKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBza2IgaXMgZW1wdHkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAvL3JldHVybiAtRUZBVUxUOyAvKiBCYWQgYWRkcmVzcyAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBoZGV2ID0gKHN0cnVjdCBoY2lfZGV2ICopKHNrYi0+ZGV2KTsKKworICAgIC8vIFNhbml0eSBjaGVjayB0aGUgSENJIGRldmljZSBpbiB0aGUgc2tiCisgICAgaWYgKCBoZGV2ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBGcmFtZSBmb3IgVW5rbm93biBIQ0kgZGV2aWNlIChoZGV2PU5VTEwpIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgLy9yZXR1cm4gLUVOT0RFVjsgLyogbm8gZGV2aWNlICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHBjdHggPSAoQnNsQ2xpZW50Q3R4VHlwZSAqKWhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKworICAgIC8vIFNhbml0eSBjaGVjayBpbnB1dHMKKyAgICBpZiAoIHBjdHggPT0gTlVMTCApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IHBjdHggaXMgYmFkIGkvcCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIC8vcmV0dXJuIC1FRkFVTFQ7IC8qIEJhZCBhZGRyZXNzICovCisgICAgICAgIHJldHVybiAwOworICAgICAgICAvKiBNYXliZSBJIHNob3VsZCByZXR1cm4gIm5vIGRldmljZSIgKi8KKyAgICAgICAgLy9yZXR1cm4gLUVOT0RFVjsgLyogbm8gZGV2aWNlICovCisgICAgfQorCisgICAgLy8gU3dpdGNoIGZvciBlYWNoIGNhc2Ugb2YgcGFja2V0IHR5cGUKKyAgICBzd2l0Y2ggKGJ0X2NiKHNrYiktPnBrdF90eXBlKQorICAgIHsKKyAgICBjYXNlIEhDSV9BQ0xEQVRBX1BLVDoKKyAgICAgICAgLy8gRGlyZWN0bHkgZXhlY3V0ZSB0aGUgZGF0YSB3cml0ZQorICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAiJXM6IEhDSSBBQ0wgZGF0YSB0eCwgc2tiPSVwIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2tiKTsKKyAgICAgICAgLy8gQUNMIGRhdGEKKyAgICAgICAgaGRldi0+c3RhdC5hY2xfdHgrKzsKKyAgICAgICAgLy8gQ29ycmVjdCB3YXkgb2YgZG9pbmcgdGhpcy4uLgorICAgICAgICB3cml0dGVuID0gc2tiLT5sZW47CisjaWZkZWYgQlRBTVBfVVNFX1ZPU19XUkFQUEVSCisgICAgICAgIHN0YXR1cyA9IEJzbFByb2Nlc3NBQ0xEYXRhVHgoIHBjdHgsIHNrYiwgJndyaXR0ZW4gKTsKKyNlbHNlCisgICAgICAgIHN0YXR1cyA9IEJzbFByb2Nlc3NBQ0xEYXRhVHgoIHBjdHgsIHNrYi0+ZGF0YSwgJndyaXR0ZW4gKTsKKyAgICAgICAgLy8gRnJlZSB1cCB0aGUgc2tiCisgICAgICAgIGtmcmVlX3NrYihza2IpOworI2VuZGlmIC8vQlRBTVBfVVNFX1ZPU19XUkFQUEVSCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSENJX0NPTU1BTkRfUEtUOgorICAgICAgICAvLyBEZWZlciB0aGUgSENJIGNvbW1hbmQgd3JpdGVzCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogSENJIGNvbW1hbmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBoZGV2LT5zdGF0LmNtZF90eCsrOworCisgICAgICAgIC8vIEFsbG9jYXRlIGFuIEhDSSBjb250ZXh0LiBUbyB1c2UgYXMgYSAiY29udGFpbmVyIiBmb3IgdGhlICJ3b3JrIiB0byBiZSBkZWZlcnJlZC4KKyAgICAgICAgcEhjaUNvbnRleHQgPSBrbWFsbG9jKHNpemVvZigqcEhjaUNvbnRleHQpLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcEhjaUNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vIG1lbW9yeSBmb3IgSENJIGNvbnRleHQuICBOb3RoaW5nIHdlIGNhbiBkbyBidXQgZHJvcAorICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgY29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2F2ZSBhd2F5IHRoZSB0eCBza2IgaW4gdGhlIEhDSSBjb250ZXh0Li4uc28gaXQgY2FuIGJlCisgICAgICAgIC8vIHJldHJpZXZlZCBieSB0aGUgd29yayBwcm9jZWR1cmUuCisgICAgICAgIHBIY2lDb250ZXh0LT50eF9za2IgPSBza2I7CisgICAgICAgIC8vIHNhdmUgYXdheSB0aGUgcGN0eCBjb250ZXh0Li4uc28gaXQgY2FuIGJlIHJldHJpZXZlZCBieSB0aGUgd29yayBwcm9jZWR1cmUuCisgICAgICAgIHBIY2lDb250ZXh0LT5wY3R4ID0gcGN0eDsKKyAgICAgICAgcEhjaUNvbnRleHQtPm1hZ2ljID0gQlRfQU1QX0hDSV9DVFhfTUFHSUM7CisgICAgICAgIElOSVRfV09SSygmcEhjaUNvbnRleHQtPmhjaUludGVyZmFjZVByb2Nlc3NpbmcsCisgICAgICAgICAgICAgICAgICBic2xXcml0ZUZpbmlzaCk7CisKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgIiVzOiBTY2hlZHVsaW5nIHdvcmsgZm9yIHNrYiAlcCwgQlQtQU1QIENsaWVudCBjb250ZXh0ICVwLCB3b3JrICVwIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2tiLCBwY3R4LCBwSGNpQ29udGV4dCk7CisKKyAgICAgICAgc3RhdHVzID0gc2NoZWR1bGVfd29yaygmcEhjaUNvbnRleHQtPmhjaUludGVyZmFjZVByb2Nlc3NpbmcpOworCisgICAgICAgIC8vIENoZWNrIHJlc3VsdAorICAgICAgICBpZiAoIDAgPT0gc3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGhjaUludGVyZmFjZVByb2Nlc3Npbmcgd29yayBhbHJlYWR5IHF1ZXVlZC4gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIFRlbXBvcmFyeSB3YXkgb2YgZG9pbmcgdGhpcworICAgICAgICAvL3dyaXR0ZW4gPSBza2ItPmxlbi1DTURfVExWX1RZUEVfQU5EX0xFTl9TSVpFOworICAgICAgICB3cml0dGVuID0gc2tiLT5sZW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSENJX1NDT0RBVEFfUEtUOgorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IHVua25vd24gdHlwZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGhkZXYtPnN0YXQuc2NvX3R4Kys7CisgICAgICAgIC8vIGFueXRoaW5nIGVsc2UgaW5jbHVkaW5nIEhDSSBldmVudHMgYW5kIFNDTyBkYXRhCisgICAgICAgIHN0YXR1cyA9IEZBTFNFOworICAgICAgICAvLyBGcmVlIHVwIHRoZSBza2IKKyAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIGFueXRoaW5nIGVsc2UgaW5jbHVkaW5nIEhDSSBldmVudHMgYW5kIFNDTyBkYXRhCisgICAgICAgIHN0YXR1cyA9IEZBTFNFOworICAgICAgICAvLyBGcmVlIHVwIHRoZSBza2IKKyAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgIGJyZWFrOworICAgIH07CisKKworICAgIC8vIEpFWjEwMDgwOTogRm9yIHRoZSBIQ0kgY29tbWFuZCwgd2lsbCB0aGUgY2FsbGVyIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgd29yayB0YWtlcyBwbGFjZSBhbmQKKyAgICAvLyByZXR1cm4gdGhlIEFDVFVBTCBhbW91bnQgb2YgZGF0YSB3cml0dGVuLgorCisvLyBUaGUgbmV4dCBsaW5lIGlzIHRlbXBvcmFyeQorICAgIC8vd3JpdHRlbiA9IHNrYi0+bGVuOworICAgIHJldHVybih3cml0dGVuKTsKK30gLy8gQlNMX1dyaXRlKCkKKworLyoqCisgIEBicmllZiBic2xXcml0ZUZpbmlzaCgpIC0gVGhpcyBmdW5jdGlvbiBmaW5pc2hlZCB0aGUgd3JpdGVzIG9wZXJhdGlvbgorICBzdGFydGVkIGJ5IEJTTF9Xcml0ZSgpLgorCisgIEBwYXJhbSB3b3JrICAgICA6IFtpbl0gIHBvaW50ZXIgdG8gd29yayBzdHJ1Y3R1cmUKKworICBAcmV0dXJuICAgICAgICAgOiB2b2lkCisKKyovCitzdGF0aWMgdm9pZCBic2xXcml0ZUZpbmlzaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisgICAgLy9Cc2xDbGllbnRDdHhUeXBlKiBwY3R4ID0KKyAgICAvLyAgICBjb250YWluZXJfb2Yod29yaywgQnNsQ2xpZW50Q3R4VHlwZSwgaGNpSW50ZXJmYWNlUHJvY2Vzc2luZyk7CisgICAgQnNsSGNpV29ya1N0cnVjdHVyZSAqcEhjaUNvbnRleHQgPQorICAgICAgICBjb250YWluZXJfb2Yod29yaywgQnNsSGNpV29ya1N0cnVjdHVyZSwgaGNpSW50ZXJmYWNlUHJvY2Vzc2luZyk7CisgICAgQnNsQ2xpZW50Q3R4VHlwZSogcGN0eCA9IHBIY2lDb250ZXh0LT5wY3R4OworICAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgc3RydWN0IGhjaV9kZXYgKmhkZXY7CisgICAgLy9jaGFyICpic2xCdWZmID0gTlVMTDsKKyAgICB2X1NJWkVfdCB3cml0dGVuID0gMDsKKworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAiJXM6IEVudGVyZWQsIGNvbnRleHQgJXAiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBjdHgpOworCisgICAgLy8gU2FuaXR5IGNoZWNrIGlucHV0cworICAgIGlmICggcGN0eCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogcGN0eCBpcyBiYWQgaS9wIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOyAvLyAtRUZBVUxUOyAvKiBCYWQgYWRkcmVzcyAqLworICAgIH0KKworICAgIC8vc2tiID0gcGN0eC0+dHhfc2tiOworICAgIHNrYiA9IHBIY2lDb250ZXh0LT50eF9za2I7CisgICAga2ZyZWUoIHBIY2lDb250ZXh0KTsKKworICAgIC8vIFNhbml0eSBjaGVjayBpbnB1dHMKKyAgICBpZiAoIHNrYiA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogc2tiIGlzIGJhZCBpL3AiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47IC8vIC1FRkFVTFQ7IC8qIEJhZCBhZGRyZXNzICovCisgICAgfQorCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBDb3VudCAoc2tiLT5sZW4pPSVkIiwgX19GVU5DVElPTl9fLCBza2ItPmxlbik7CisKKyAgICBoZGV2ID0gKHN0cnVjdCBoY2lfZGV2ICopKHNrYi0+ZGV2KTsKKworICAgIC8vIFNhbml0eSBjaGVjayB0aGUgSENJIGRldmljZSBpbiB0aGUgc2tiCisgICAgaWYgKCBoZGV2ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBGcmFtZSBmb3IgVW5rbm93biBIQ0kgZGV2aWNlIChoZGV2PU5VTEwpIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOyAvLyAtRU5PREVWOyAvKiBubyBkZXZpY2UgKi8KKyAgICB9CisKKworICAgIC8vIFNhbml0eSBjaGVjayBpbnB1dHMKKyAgICBpZiAoIHBjdHggIT0gKEJzbENsaWVudEN0eFR5cGUgKiloY2lfZ2V0X2RydmRhdGEoaGRldikpOworICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBwY3R4IGFuZCBoZGV2IG5vdCBjb25zaXN0ZW50IC0gYmFkIGkvcCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsgLy8gLUVGQVVMVDsgLyogQmFkIGFkZHJlc3MgKi8KKyAgICAgICAgLyogTWF5YmUgSSBzaG91bGQgcmV0dXJuICJubyBkZXZpY2UiICovCisgICAgICAgIC8vcmV0dXJuIC1FTk9ERVY7IC8qIG5vIGRldmljZSAqLworICAgIH0KKworICAgIC8vIFN3aXRjaCBmb3IgZWFjaCBjYXNlIG9mIHBhY2tldCB0eXBlCisgICAgc3dpdGNoIChidF9jYihza2IpLT5wa3RfdHlwZSkKKyAgICB7CisgICAgY2FzZSBIQ0lfQ09NTUFORF9QS1Q6CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogSENJIGNvbW1hbmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBoZGV2LT5zdGF0LmNtZF90eCsrOworICAgICAgICAvLyBIQ0kgY29tbWFuZAorICAgICAgICBzdGF0dXMgPSBCc2xQcm9jZXNzSENJQ29tbWFuZCggcGN0eCwgc2tiLT5kYXRhLCBza2ItPmxlbi1DTURfVExWX1RZUEVfQU5EX0xFTl9TSVpFKTsKKyAgICAgICAgLy8gVGVtcG9yYXJ5IHdheSBvZiBkb2luZyB0aGlzCisgICAgICAgIC8vd3JpdHRlbiA9IHNrYi0+bGVuLUNNRF9UTFZfVFlQRV9BTkRfTEVOX1NJWkU7CisgICAgICAgIHdyaXR0ZW4gPSBza2ItPmxlbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIQ0lfU0NPREFUQV9QS1Q6CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogdW5rbm93biB0eXBlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgaGRldi0+c3RhdC5zY29fdHgrKzsKKyAgICAgICAgLy8gYW55dGhpbmcgZWxzZSBpbmNsdWRpbmcgSENJIGV2ZW50cyBhbmQgU0NPIGRhdGEKKyAgICAgICAgc3RhdHVzID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIGFueXRoaW5nIGVsc2UgaW5jbHVkaW5nIEhDSSBldmVudHMgYW5kIFNDTyBkYXRhCisgICAgICAgIHN0YXR1cyA9IEZBTFNFOworICAgICAgICBicmVhazsKKyAgICB9OworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAiJXM6IEZyZWVpbmcgc2tiICVwIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBza2IpOworCisgICAgY29uc3VtZV9za2Ioc2tiKTsKKworLy8gSG93IGRvIEkgcmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIGNhbGxlcj8KKy8vICAgcmV0dXJuKHdyaXR0ZW4pOworICAgIHJldHVybjsKK30gLy9ic2xXcml0ZUZpbmlzaCgpCisKK1ZPU19TVEFUVVMgV0xBTkJBUF9TZXRDb25maWcKKygKKyAgICBXTEFOQkFQX0NvbmZpZ1R5cGUgKnBDb25maWcKKykKK3sKKyAgICBCc2xDbGllbnRDdHhUeXBlKiBwY3R4OworICAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgIC8vIHNhbml0eSBjaGVja2luZworICAgIGlmICggcENvbmZpZyA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU5CQVBfU2V0Q29uZmlnIGJhZCBpbnB1dFxuIiApOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorICAgIHBjdHggPSBncEJzbGN0eDsKKyAgICBpZiAoIE5VTEwgPT0gcGN0eCApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQlNMIHBvaW50ZXIgZnJvbSBwY3R4IG9uIFdMQU5CQVBfU2V0Q29uZmlnIik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLy8gZ2V0IGEgaGFuZGxlIGZyb20gQkFQCisgICAgc3RhdHVzID0gV0xBTkJBUF9HZXROZXdIbmRsKCZwY3R4LT5iYXBIZGwpOworICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTkJBUF9TZXRDb25maWcgY2FuJ3QgZ2V0IEJBUCBoYW5kbGVcbiIgKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworCisgICAgc3RhdHVzID0gV0xBTl9CQVBTZXRDb25maWcocGN0eC0+YmFwSGRsLCBwQ29uZmlnKTsKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9CQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU5CQVBfU2V0Q29uZmlnIGNhbid0IHNldCBCQVAgY29uZmlnXG4iICk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4oVk9TX1NUQVRVU19TVUNDRVNTKTsKK30KKworVk9TX1NUQVRVUyBXTEFOQkFQX1JlZ2lzdGVyV2l0aEhDSShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKyAgICBzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IE5VTEw7CisgICAgQnNsQ2xpZW50Q3R4VHlwZSogcGN0eCA9IE5VTEw7CisgICAgaW50IGVyciA9IDA7CisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0hERCwgTlVMTCApOworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKyAgICBwY3R4ID0gZ3BCc2xjdHg7CisKKyAgICBpZiAoIE5VTEwgPT0gcGN0eCApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQlNMIHBvaW50ZXIgZnJvbSBwY3R4IG9uIFdMQU5CQVBfUmVnaXN0ZXJXaXRoSENJIik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgIGlmICggTlVMTCA9PSBwQWRhcHRlciApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSEREIEFkYXB0ZXIgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5CQVBfUmVnaXN0ZXJXaXRoSENJIik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgaWYoTlVMTCAhPSBwY3R4LT5oZGV2KQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICJBbHJlYWR5IHJlZ2lzdGVyZWQgYXMgSENJIGRldmljZVxuIik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisKKworICAgIC8qIFNhdmUgYXdheSB0aGUgcG9pbnRlciB0byB0aGUgcGFyZW50IFdMQU4gZGV2aWNlIGluIEJTTCBkcml2ZXIgY29udGV4dCAqLworICAgIHBjdHgtPnBfZGV2ID0gcEFkYXB0ZXItPmRldjsKKworICAgIC8qIEluaXRpYWxpemUgSENJIGRldmljZSAqLworICAgIGhkZXYgPSBoY2lfYWxsb2NfZGV2KCk7CisgICAgaWYgKCFoZGV2KQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDYW4ndCBhbGxvY2F0ZSBIQ0kgZGV2aWNlIGluIFdMQU5CQVBfUmVnaXN0ZXJXaXRoSENJIik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogU2F2ZSBhd2F5IHRoZSBIQ0kgZGV2aWNlIHBvaW50ZXIgaW4gdGhlIEJTTCBkcml2ZXIgY29udGV4dCAqLworICAgIHBjdHgtPmhkZXYgPSBoZGV2OworCisjaWYgZGVmaW5lZCBIQ0lfODAyMTEgfHwgZGVmaW5lZCBIQ0lfQU1QCisjZGVmaW5lIEJVSUxEX0ZPUl9CTFVFVE9PVEhfTkVYVF8yXzYKKyNlbHNlCisjdW5kZWYgQlVJTERfRk9SX0JMVUVUT09USF9ORVhUXzJfNgorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GT1JfQkxVRVRPT1RIX05FWFRfMl82CisgICAgLyogSENJICJidXMgdHlwZSIgb2YgSENJX1ZJUlRVQUwgc2hvdWxkIGFwcGx5ICovCisgICAgaGRldi0+YnVzID0gSENJX1ZJUlRVQUw7CisgICAgLyogU2V0IHRoZSBkZXZfdHlwZSB0byBCVC1BTVAgODAyLjExICovCisjaWZkZWYgSENJXzgwMjExCisgICAgaGRldi0+ZGV2X3R5cGUgPSBIQ0lfODAyMTE7CisjZWxzZQorICAgIGhkZXYtPmRldl90eXBlID0gSENJX0FNUDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVAorICAgIC8qIEZvciB0aGUgInJlYWwiIEJsdWVaIGJ1aWxkLCBET04nVCBTZXQgdGhlIGRldmljZSAicXVpcmtzIiB0byBpbmRpY2F0ZSBSQVcgKi8KKyAgICBzZXRfYml0KEhDSV9RVUlSS19SQVdfREVWSUNFLCAmaGRldi0+cXVpcmtzKTsKKyNlbmRpZgorI2Vsc2UgLy9CVUlMRF9GT1JfQkxVRVRPT1RIX05FWFRfMl82CisgICAgLyogSENJICJidXMgdHlwZSIgb2YgSENJX1ZJUlRVQUwgc2hvdWxkIGFwcGx5ICovCisgICAgaGRldi0+dHlwZSA9IEhDSV9WSVJUVUFMOworICAgIC8qIFNldCB0aGUgZGV2X3R5cGUgdG8gQlQtQU1QIDgwMi4xMSAqLworICAgIC8vaGRldi0+ZGV2X3R5cGUgPSBIQ0lfODAyMTE7CisgICAgLy8vL2hkZXYtPmRldl90eXBlID0gSENJX0FNUDsKKyAgICAvKiBGb3IgdGhlICJ0ZW1wb3JhcnkiIEJsdWVaIGJ1aWxkLCBTZXQgdGhlIGRldmljZSAicXVpcmtzIiB0byBpbmRpY2F0ZSBSQVcgKi8KKyAgICBzZXRfYml0KEhDSV9RVUlSS19SQVdfREVWSUNFLCAmaGRldi0+cXVpcmtzKTsKKyNlbmRpZiAvL0JVSUxEX0ZPUl9CTFVFVE9PVEhfTkVYVF8yXzYKKyAgICAvKiBTYXZlIGF3YXkgdGhlIEJTTCBkcml2ZXIgcG9pbnRlciBpbiB0aGUgSENJIGRldmljZSBjb250ZXh0ICovCisgICAgaGNpX3NldF9kcnZkYXRhKGhkZXYsIHBjdHgpOworICAgIC8qIFNldCB0aGUgcGFyZW50IGRldmljZSBmb3IgdGhpcyBIQ0kgZGV2aWNlLiAgVGhpcyBpcyBvdXIgV0xBTiBuZXRfZGV2aWNlICovCisgICAgU0VUX0hDSURFVl9ERVYoaGRldiwgJnBjdHgtPnBfZGV2LT5kZXYpOworCisgICAgaGRldi0+b3BlbiAgICAgPSBCU0xfT3BlbjsKKyAgICBoZGV2LT5jbG9zZSAgICA9IEJTTF9DbG9zZTsKKyAgICBoZGV2LT5mbHVzaCAgICA9IEJTTF9GbHVzaDsKKyAgICBoZGV2LT5zZW5kICAgICA9IEJTTF9Xcml0ZTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw0LDApKQorICAgIGhkZXYtPm93bmVyID0gVEhJU19NT0RVTEU7CisgICAgaGRldi0+ZGVzdHJ1Y3QgPSBCU0xfRGVzdHJ1Y3Q7CisjZW5kaWYKKyAgICBoZGV2LT5pb2N0bCAgICA9IEJTTF9JT0NvbnRyb2w7CisKKworICAgIC8qIFRpbWVvdXQgYmVmb3JlIGl0IGlzIHNhZmUgdG8gc2VuZCB0aGUgZmlyc3QgSENJIHBhY2tldCAqLworICAgIG1zbGVlcCgxMDAwKTsKKworICAgIC8qIFJlZ2lzdGVyIEhDSSBkZXZpY2UgKi8KKyAgICBlcnIgPSBoY2lfcmVnaXN0ZXJfZGV2KGhkZXYpOworICAgIGlmIChlcnIgPCAwKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfQkFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJlZ2lzdGVyIEhDSSBkZXZpY2UsIGVycj0lZFxuIiwgZXJyKTsKKyAgICAgICAgcGN0eC0+aGRldiA9IE5VTEw7CisgICAgICAgIGhjaV9mcmVlX2RldihoZGV2KTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisgICAgaWYgKE5VTEwgIT0gcFZvc0NvbnRleHQpCisgICAgeworICAgICAgIHBIZGRDdHggPSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfSERELCBwVm9zQ29udGV4dCk7CisgICAgICAgaWYgKE5VTEwgIT0gcEhkZEN0eCkKKyAgICAgICB7CisgICAgICAgICAgcEhkZEN0eC0+aXNBbXBBbGxvd2VkID0gVk9TX1RSVUU7CisgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK1ZPU19TVEFUVVMgV0xBTkJBUF9EZXJlZ2lzdGVyRnJvbUhDSSh2b2lkKQoreworICAgIHN0cnVjdCBoY2lfZGV2ICpoZGV2OworICAgIEJzbENsaWVudEN0eFR5cGUqIHBjdHggPSBOVUxMOworCisgICAgcGN0eCA9IGdwQnNsY3R4OworCisgICAgaWYgKCBOVUxMID09IHBjdHggKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJTTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTkJBUF9EZXJlZ2lzdGVyRnJvbUhDSSIpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qIFJldHJpZXZlIHRoZSBIQ0kgZGV2aWNlIHBvaW50ZXIgZnJvbSB0aGUgQlNMIGRyaXZlciBjb250ZXh0ICovCisgICAgaGRldiA9IHBjdHgtPmhkZXY7CisKKyAgICBpZiAoIWhkZXYpCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisKKyAgICAvKiBVbnJlZ2lzdGVyIGRldmljZSBmcm9tIEJsdWVaOyBmY24gc2VuZHMgdXMgSENJIGNvbW1hbmRzIGJlZm9yZSBpdCByZXR1cm5zICovCisgICAgLyogQW5kIHRoZW4gdGhlIHJlZ2lzdGVyZWQgaGRldi0+Y2xvc2UgZmNuIHNob3VsZCBiZSBjYWxsZWQgYnkgQmx1ZVogKEJTTF9DbG9zZSkgKi8KKyAgICBoY2lfdW5yZWdpc3Rlcl9kZXYoaGRldik7CisKKyAgICAvKiBCU0xfQ2xvc2UgaXMgY2FsbGVkIGFnYWluIGhlcmUsIGluIGNhc2UgQmx1ZVogZGlkbid0IGNhbGwgaXQgKi8KKyAgICBCU0xfQ2xvc2UoaGRldik7CisgICAgaGNpX2ZyZWVfZGV2KGhkZXYpOworICAgIHBjdHgtPmhkZXYgPSBOVUxMOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworVk9TX1NUQVRVUyBXTEFOQkFQX1N0b3BBbXAodm9pZCkKK3sKKyAgICBCc2xDbGllbnRDdHhUeXBlKiBwY3R4OworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICAgcGN0eCA9IGdwQnNsY3R4OworCisgICAgaWYoTlVMTCA9PSBwY3R4KQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJTTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTkJBUF9TdG9wQW1wIik7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9pcyBBTVAgc2Vzc2lvbiBvbiwgaWYgc28gZGlzY29ubmVjdAorICAgICAgICBpZihWT1NfVFJVRSA9PSBXTEFOX0JBUFNlc3Npb25PbihwY3R4LT5iYXBIZGwpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBXTEFOX0JBUERpc2Nvbm5lY3QocGN0eC0+YmFwSGRsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2X0JPT0xfdCBXTEFOQkFQX0FtcFNlc3Npb25Pbih2b2lkKQoreworICAgIEJzbENsaWVudEN0eFR5cGUqIHBjdHg7CisKKyAgICBwY3R4ID0gZ3BCc2xjdHg7CisgICAgaWYoTlVMTCA9PSBwY3R4KQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0JBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEJTTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTkJBUF9BbXBTZXNzaW9uT24iKTsKKyAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuKCBXTEFOX0JBUFNlc3Npb25PbihwY3R4LT5iYXBIZGwpKTsKKyAgICB9Cit9CisKKworI2VuZGlmIC8vIFdMQU5fQlRBTVBfRkVBVFVSRQpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvc3JjL3dsYW5faGRkX2Fzc29jLmMgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfYXNzb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTg4ZGIxCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX2Fzc29jLmMKQEAgLTAsMCArMSwyNzQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgXGZpbGUgIHdsYW5faGRkX2Fzc29jLmMKKyAgXGJyaWVmIFdMQU4gSG9zdCBEZXZpY2UgRHJpdmVyIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUgCisgICAKKyAgIAorICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4gCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuIAorICAgCisgICAKKyAgJEhlYWRlcjokICAgJERhdGVUaW1lOiAkICRBdXRob3I6ICQgCisgICAKKyAgIAorICB3aGVuICAgICAgICB3aG8gICAgd2hhdCwgd2hlcmUsIHdoeSAKKyAgLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDA1LzA2LzA5ICAgICBTaGFpbGVuZGVyICAgICBDcmVhdGVkIG1vZHVsZS4gCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgCisjaW5jbHVkZSAid2xhbl9oZGRfaW5jbHVkZXMuaCIKKyNpbmNsdWRlIDxhbmlHbG9iYWwuaD4KKyNpbmNsdWRlICJkb3QxMWYuaCIKKyNpbmNsdWRlICJ3bGFuX25saW5rX2NvbW1vbi5oIgorI2luY2x1ZGUgIndsYW5fYnRjX3N2Yy5oIgorI2luY2x1ZGUgIndsYW5faGRkX3Bvd2VyLmgiCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKyNpbmNsdWRlICJ3bGFuX2hkZF9jZmc4MDIxMS5oIgorI2luY2x1ZGUgImNzckluc2lkZUFwaS5oIgorI2VuZGlmCisjaWYgZGVmaW5lZCBDT05GSUdfQ0ZHODAyMTEKKyNpbmNsdWRlICJ3bGFuX2hkZF9wMnAuaCIKKyNlbmRpZgorI2luY2x1ZGUgInNtZV9BcGkuaCIKKwordl9CT09MX3QgbWliSXNEb3QxMURlc2lyZWRCc3NUeXBlSW5mcmFzdHJ1Y3R1cmUoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICk7CisKK3N0cnVjdCBldGhlcl9hZGRyIAoreworICAgIHVfY2hhciAgZXRoZXJfYWRkcl9vY3RldFs2XTsKK307CisvLyBUaGVzZSBhcmUgbmVlZGVkIHRvIHJlY29nbml6ZSBXUEEgYW5kIFJTTiBzdWl0ZSB0eXBlcworI2RlZmluZSBIRERfV1BBX09VSV9TSVpFIDQKK3ZfVThfdCBjY3BXcGFPdWkwMFsgSEREX1dQQV9PVUlfU0laRSBdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAwIH07Cit2X1U4X3QgY2NwV3BhT3VpMDFbIEhERF9XUEFfT1VJX1NJWkUgXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSB9Owordl9VOF90IGNjcFdwYU91aTAyWyBIRERfV1BBX09VSV9TSVpFIF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIgfTsKK3ZfVThfdCBjY3BXcGFPdWkwM1sgSEREX1dQQV9PVUlfU0laRSBdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAzIH07Cit2X1U4X3QgY2NwV3BhT3VpMDRbIEhERF9XUEFfT1VJX1NJWkUgXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCB9Owordl9VOF90IGNjcFdwYU91aTA1WyBIRERfV1BBX09VSV9TSVpFIF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDUgfTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCit2X1U4X3QgY2NwV3BhT3VpMDZbIEhERF9XUEFfT1VJX1NJWkUgXSA9IHsgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCB9OyAvLyBDQ0tNCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NDWCAqLworI2RlZmluZSBIRERfUlNOX09VSV9TSVpFIDQKK3ZfVThfdCBjY3BSU05PdWkwMFsgSEREX1JTTl9PVUlfU0laRSBdID0geyAweDAwLCAweDBGLCAweEFDLCAweDAwIH07IC8vIGdyb3VwIGNpcGhlcgordl9VOF90IGNjcFJTTk91aTAxWyBIRERfUlNOX09VSV9TSVpFIF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDEgfTsgLy8gV0VQLTQwIG9yIFJTTgordl9VOF90IGNjcFJTTk91aTAyWyBIRERfUlNOX09VSV9TSVpFIF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDIgfTsgLy8gVEtJUCBvciBSU04tUFNLCit2X1U4X3QgY2NwUlNOT3VpMDNbIEhERF9SU05fT1VJX1NJWkUgXSA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwMyB9OyAvLyBSZXNlcnZlZAordl9VOF90IGNjcFJTTk91aTA0WyBIRERfUlNOX09VSV9TSVpFIF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDQgfTsgLy8gQUVTLUNDTVAKK3ZfVThfdCBjY3BSU05PdWkwNVsgSEREX1JTTl9PVUlfU0laRSBdID0geyAweDAwLCAweDBGLCAweEFDLCAweDA1IH07IC8vIFdFUC0xMDQKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCit2X1U4X3QgY2NwUlNOT3VpMDZbIEhERF9SU05fT1VJX1NJWkUgXSA9IHsgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCB9OyAvLyBDQ0tNCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NDWCAqLworCisjaWYgZGVmaW5lZChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgCisvLyBPZmZzZXQgd2hlcmUgdGhlIEVJRC1MZW4tSUUsIHN0YXJ0LgorI2RlZmluZSBGVF9BU1NPQ19SU1BfSUVTX09GRlNFVCA2CisjZW5kaWYKKworI2RlZmluZSBCRUFDT05fRlJBTUVfSUVTX09GRlNFVCAxMgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKK2V4dGVybiB2b2lkIHdsYW5faGRkX3NldF9tY19hZGRyX2xpc3QoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdl9VOF90IHNldCk7CisjZW5kaWYKKworCitzdGF0aWMgaW5saW5lIHZfVk9JRF90IGhkZF9jb25uU2V0Q29ubmVjdGlvblN0YXRlKCBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCwgZUNvbm5lY3Rpb25TdGF0ZSBjb25uU3RhdGUgKQoreyAgICAgICAgIAorICAgLy8gc2F2ZSB0aGUgbmV3IGNvbm5lY3Rpb24gc3RhdGUgCisgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID0gY29ublN0YXRlOworfQorCisvLyByZXR1cm5zIEZBTFNFIGlmIG5vdCBjb25uZWN0ZWQuCisvLyByZXR1cm5zIFRSVUUgZm9yIHRoZSB0d28gJ2Nvbm5lY3RlZCcgc3RhdGVzIChJbmZyYSBBc3NvY2lhdGVkIG9yIElCU1MgQ29ubmVjdGVkICkuCisvLyByZXR1cm5zIHRoZSBjb25uZWN0aW9uIHN0YXRlLiAgQ2FuIHNwZWNpZnkgTlVMTCBpZiB5b3UgZG9udCcgd2FudCB0byBnZXQgdGhlIGFjdHVhbCBzdGF0ZS4KKworc3RhdGljIGlubGluZSB2X0JPT0xfdCBoZGRfY29ubkdldENvbm5lY3Rpb25TdGF0ZSggaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNvbm5lY3Rpb25TdGF0ZSAqcENvbm5TdGF0ZSApIAoreworICAgdl9CT09MX3QgZkNvbm5lY3RlZDsgCisgICBlQ29ubmVjdGlvblN0YXRlIGNvbm5TdGF0ZTsKKyAgICAKKyAgIC8vIGdldCB0aGUgY29ubmVjdGlvbiBzdGF0ZS4KKyAgIGNvbm5TdGF0ZSA9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGU7CisgICAvLyBTZXQgdGhlIGZDb25uZWN0ZWQgcmV0dXJuIHZhcmlhYmxlIGJhc2VkIG9uIHRoZSBDb25uZWN0ZWQgU3RhdGUuICAKKyAgIGlmICggZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09IGNvbm5TdGF0ZSB8fAorICAgICAgICBlQ29ubmVjdGlvblN0YXRlX0lic3NDb25uZWN0ZWQgPT0gY29ublN0YXRlICkKKyAgIHsKKyAgICAgIGZDb25uZWN0ZWQgPSBWT1NfVFJVRTsKKyAgIH0KKyAgIGVsc2UgCisgICB7CisgICAgICBmQ29ubmVjdGVkID0gVk9TX0ZBTFNFOworICAgfQorICAgIAorICAgaWYgKCBwQ29ublN0YXRlICkKKyAgIHsKKyAgICAgICpwQ29ublN0YXRlID0gY29ublN0YXRlOworICAgfQorICAKKyAgIHJldHVybiggZkNvbm5lY3RlZCApOworfQorCit2X0JPT0xfdCBoZGRfY29ubklzQ29ubmVjdGVkKCBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCApCit7CisgICByZXR1cm4oIGhkZF9jb25uR2V0Q29ubmVjdGlvblN0YXRlKCBwSGRkU3RhQ3R4LCBOVUxMICkgKTsKK30gIAorCisvL1RPRE8gLSBOb3QgdXNlZCBhbnlod2VyZS4gQ2FuIGJlIHJlbW92ZWQuCisjaWYgMAorLy8KK3ZfQk9PTF90IGhkZF9jb25uSXNDb25uZWN0ZWRJbmZyYSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreworICAgdl9CT09MX3QgZkNvbm5lY3RlZEluZnJhID0gRkFMU0U7CisgICBlQ29ubmVjdGlvblN0YXRlIGNvbm5TdGF0ZTsKKyAgIAorICAgaWYgKCBoZGRfY29ubkdldENvbm5lY3Rpb25TdGF0ZSggV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlciksICZjb25uU3RhdGUgKSApCisgICB7ICAgCisgICAgICBpZiAoIGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCA9PSBjb25uU3RhdGUgKSAKKyAgICAgIHsKKyAgICAgICAgIGZDb25uZWN0ZWRJbmZyYSA9IFRSVUU7CisgICAgICB9ICAgCisgICB9CisgICAKKyAgIHJldHVybiggZkNvbm5lY3RlZEluZnJhICk7Cit9CisjZW5kaWYKKyAgICAKK3N0YXRpYyBpbmxpbmUgdl9CT09MX3QgaGRkX2Nvbm5HZXRDb25uZWN0ZWRDaXBoZXJBbGdvKCBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCwgZUNzckVuY3J5cHRpb25UeXBlICpwQ29ubmVjdGVkQ2lwaGVyQWxnbyApCit7CisgICAgdl9CT09MX3QgZkNvbm5lY3RlZCA9IFZPU19GQUxTRTsKKyAgICAKKyAgICBmQ29ubmVjdGVkID0gaGRkX2Nvbm5HZXRDb25uZWN0aW9uU3RhdGUoIHBIZGRTdGFDdHgsIE5VTEwgKTsKKyAgCisgICAgaWYgKCBwQ29ubmVjdGVkQ2lwaGVyQWxnbyApIAorICAgIHsKKyAgICAgICAgKnBDb25uZWN0ZWRDaXBoZXJBbGdvID0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnVjRW5jcnlwdGlvblR5cGU7CisgICAgfQorICAgIAorICAgIHJldHVybiggZkNvbm5lY3RlZCApOworfQorIAoraW5saW5lIHZfQk9PTF90IGhkZF9jb25uR2V0Q29ubmVjdGVkQnNzVHlwZSggaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHgsIGVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZSAqcENvbm5lY3RlZEJzc1R5cGUgKQoreworICAgIHZfQk9PTF90IGZDb25uZWN0ZWQgPSBWT1NfRkFMU0U7CisgICAgCisgICAgZkNvbm5lY3RlZCA9IGhkZF9jb25uR2V0Q29ubmVjdGlvblN0YXRlKCBwSGRkU3RhQ3R4LCBOVUxMICk7CisgIAorICAgIGlmICggcENvbm5lY3RlZEJzc1R5cGUgKSAKKyAgICB7CisgICAgICAgICpwQ29ubmVjdGVkQnNzVHlwZSA9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uRG90MTFEZXNpcmVkQnNzVHlwZTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuKCBmQ29ubmVjdGVkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZGRfY29ublNhdmVDb25uZWN0ZWRCc3NUeXBlKCBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCwgZUNzclJvYW1Cc3NUeXBlIGNzclJvYW1Cc3NUeXBlICkKK3sKKyAgIHN3aXRjaCggY3NyUm9hbUJzc1R5cGUgKSAKKyAgIHsKKyAgICAgIGNhc2UgZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRToKKyAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ubkRvdDExRGVzaXJlZEJzc1R5cGUgPSBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGVfaW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgY2FzZSBlQ1NSX0JTU19UWVBFX0lCU1M6CisgICAgICBjYXNlIGVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUzoKKyAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ubkRvdDExRGVzaXJlZEJzc1R5cGUgPSBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGVfaW5kZXBlbmRlbnQ7CisgICAgICAgICBicmVhazsKKyAgICAgICAgICAgCisgICAgICAvKiogV2Ugd2lsbCBuZXZlciBzZXQgdGhlIEJzc1R5cGUgdG8gJ2FueScgd2hlbiBhdHRlbXB0aW5nIGEgY29ubmVjdGlvbiAKKyAgICAgICAgICAgIHNvIENTUiBzaG91bGQgbmV2ZXIgc2VuZCB0aGlzIGJhY2sgdG8gdXMuKi8KKyAgICAgIGNhc2UgZUNTUl9CU1NfVFlQRV9BTlk6ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgZGVmYXVsdDoKKyAgICAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICAgICAgIGJyZWFrOyAgICAgIAorICAgfSAgICAgICAgICAgICAgICAgICAgIAorICAgIAorfQorCit2b2lkIGhkZF9jb25uU2F2ZUNvbm5lY3RJbmZvKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdENzclJvYW1JbmZvICpwUm9hbUluZm8sIGVDc3JSb2FtQnNzVHlwZSBlQnNzVHlwZSApCit7CisgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworICAgZUNzckVuY3J5cHRpb25UeXBlIGVuY3J5cHRUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyAKKyAgIFZPU19BU1NFUlQoIHBSb2FtSW5mbyApOworICAgCisgICBpZiAoIHBSb2FtSW5mbyApICAgCisgICB7CisgICAgICAvLyBTYXZlIHRoZSBCU1NJRCBmb3IgdGhlIGNvbm5lY3Rpb24uLi4gIAorICAgICAgaWYgKCBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFID09IGVCc3NUeXBlICkKKyAgICAgIHsKKyAgICAgICAgICBWT1NfQVNTRVJUKCBwUm9hbUluZm8tPnBCc3NEZXNjICk7CisgICAgICAgICAgdm9zX21lbV9jb3B5KHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZCwgcFJvYW1JbmZvLT5ic3NpZCw2ICk7CisKKyAgICAgICAgICAvLyBTYXZlIHRoZSBTdGF0aW9uIElEIGZvciB0aGlzIHN0YXRpb24gZnJvbSB0aGUgJ1JvYW0gSW5mbycuCisgICAgICAgICAgLy9Gb3IgSUJTUyBtb2RlLCBzdGFJZCBpcyBhc3NpZ25lZCBpbiBORVdfUEVFUl9JTkQKKyAgICAgICAgICAvL0ZvciByZWFzc29jLCB0aGUgc3RhSUQgZG9lc24ndCBjaGFuZ2UgYW5kIGl0IG1heSBiZSBpbnZhbGlkIGluIHRoaXMgc3RydWN0dXJlCisgICAgICAgICAgLy9zbyBubyBjaGFuZ2UgaGVyZS4KKyAgICAgICAgICBpZiggIXBSb2FtSW5mby0+ZlJlYXNzb2NSZXEgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkIFswXT0gcFJvYW1JbmZvLT5zdGFJZDsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICggZUNTUl9CU1NfVFlQRV9JQlNTID09IGVCc3NUeXBlICkKKyAgICAgIHsgICAKKyAgICAgICAgIHZvc19tZW1fY29weShwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQsIHBSb2FtSW5mby0+YnNzaWQsc2l6ZW9mKHBSb2FtSW5mby0+YnNzaWQpICk7CisgICAgICB9ICAgCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvLyBjYW4ndCBoYXBwZW4uICBXZSBuZWVkIGEgdmFsaWQgSUJTUyBvciBJbmZyYSBzZXR0aW5nIGluIHRoZSBCU1NEZXNjcmlwdGlvbgorICAgICAgICAgLy8gb3Igd2UgY2FuJ3QgZnVuY3Rpb24uCisgICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICB9CisKKyAgICAgIC8vIG5vdGlmeSBXTU0KKyAgICAgIGhkZF93bW1fY29ubmVjdChwQWRhcHRlciwgcFJvYW1JbmZvLCBlQnNzVHlwZSk7CisKKyAgICAgIGlmKCAhcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19BU1NFUlQoIHBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZSApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIC8vIEdldCBNdWx0aWNhc3QgRW5jcnlwdGlvbiBUeXBlCisgICAgICAgICAgZW5jcnlwdFR5cGUgPSAgcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlOworICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5tY0VuY3J5cHRpb25UeXBlID0gZW5jcnlwdFR5cGU7CisgICAgICAgICAgLy8gR2V0IFVuaWNhc3QgRW5jcnl0aW9uIFR5cGUKKyAgICAgICAgICBlbmNyeXB0VHlwZSA9ICBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPkVuY3J5cHRpb25UeXBlOworICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby51Y0VuY3J5cHRpb25UeXBlID0gZW5jcnlwdFR5cGU7CisKKyAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSAgcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5BdXRoVHlwZTsKKworICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5vcGVyYXRpb25DaGFubmVsID0gcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5vcGVyYXRpb25DaGFubmVsOworCisgICAgICAgICAgLy8gU2F2ZSB0aGUgc3NpZCBmb3IgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgICB2b3NfbWVtX2NvcHkoICZwSGRkU3RhQ3R4LT5jb25uX2luZm8uU1NJRC5TU0lELCAmcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5TU0lELCBzaXplb2YoIHRTaXJNYWNTU2lkICkgKTsKKyAgICAgIH0KKyAgIH0gICAKKyAgICAgIAorICAgLy8gc2F2ZSB0aGUgY29ubmVjdGVkIEJzc1R5cGUKKyAgIGhkZF9jb25uU2F2ZUNvbm5lY3RlZEJzc1R5cGUoIHBIZGRTdGFDdHgsIGVCc3NUeXBlICk7ICAKKyAgIAorfQorCisjaWYgZGVmaW5lZChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikKKy8qCisgKiBTZW5kIHRoZSAxMVIga2V5IGluZm9ybWF0aW9uIHRvIHRoZSBzdXBwbGljYW50LgorICogT25seSB0aGVuIGNhbiB0aGUgc3VwcGxpY2FudCBnZW5lcmF0ZSB0aGUgUE1LLVIxLgorICogKEJUVywgdGhlIENDWCBzdXBwbGljYW50IGFsc28gbmVlZHMgdGhlIEFzc29jIFJlc3AgSUVzCisgKiBmb3IgdGhlIHNhbWUgcHVycG9zZS4pCisgKgorICogTWFpbmx5IHRoZSBBc3NvYyBSc3AgSUVzIGFyZSBwYXNzZWQgaGVyZS4gRm9yIHRoZSBJTURBCisgKiB0aGlzIGNvbnRhaW5zIHRoZSBSMUtISUQsIFIwS0hJRCBhbmQgdGhlIE1ESUQuCisgKiBGb3IgRlQsIHRoaXMgY29uc2lzdHMgb2YgdGhlIFJlYXNzb2MgUnNwIEZUSUVzLgorICogVGhpcyBpcyB0aGUgQXNzb2MgUmVzcG9uc2UuCisgKi8KK3N0YXRpYyB2b2lkIGhkZF9TZW5kRlRBc3NvY1Jlc3BvbnNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCAKKyAgICAgICAgICAgICAgICB0Q3NyUm9hbUluZm8gKnBDc3JSb2FtSW5mbykKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisgICAgY2hhciAqYnVmZjsKKyAgICB1bnNpZ25lZCBpbnQgbGVuID0gMDsKKyAgICB1OCAqcEZUQXNzb2NSc3AgPSBOVUxMOworICAgIAorICAgIGlmIChwQ3NyUm9hbUluZm8tPm5Bc3NvY1JzcExlbmd0aCA9PSAwKSAKKyAgICB7CisgICAgICAgIGhkZExvZyhMT0dFLAorICAgICAgICAgICAgIiVzOiBwQ3NyUm9hbUluZm8tPm5Bc3NvY1JzcExlbmd0aD0lZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgKGludClwQ3NyUm9hbUluZm8tPm5Bc3NvY1JzcExlbmd0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwRlRBc3NvY1JzcCA9ICh1OCAqKShwQ3NyUm9hbUluZm8tPnBiRnJhbWVzICsgcENzclJvYW1JbmZvLT5uQmVhY29uTGVuZ3RoICsgCisgICAgICAgIHBDc3JSb2FtSW5mby0+bkFzc29jUmVxTGVuZ3RoKTsKKyAgICBpZiAocEZUQXNzb2NSc3AgPT0gTlVMTCkgCisgICAgeworICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBBc3NvY1JlcSBvciBBc3NvY1JzcCBpcyBOVUxMIiwgX19mdW5jX18pOyAKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHBGVEFzc29jUnNwIG5lZWRzIHRvIHBvaW50IHRvIHRoZSBJRXMKKyAgICBwRlRBc3NvY1JzcCArPSBGVF9BU1NPQ19SU1BfSUVTX09GRlNFVDsKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBBc3NvY1JzcCBpcyBub3cgYXQgJTAyeCUwMngiLCBfX2Z1bmNfXywKKyAgICAgICAgKHVuc2lnbmVkIGludClwRlRBc3NvY1JzcFswXSwKKyAgICAgICAgKHVuc2lnbmVkIGludClwRlRBc3NvY1JzcFsxXSk7CisKKyAgICAvLyBXZSBuZWVkIHRvIHNlbmQgdGhlIElFcyB0byB0aGUgc3VwcGxpY2FudC4KKyAgICBidWZmID0ga21hbGxvYyhJV19HRU5FUklDX0lFX01BWCwgR0ZQX0FUT01JQyk7CisgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgCisgICAgeworICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBrbWFsbG9jIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiLCBfX2Z1bmNfXyk7IAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gU2VuZCB0aGUgQXNzb2MgUmVzcCwgdGhlIHN1cHBsaWNhbnQgbmVlZHMgdGhpcyBmb3IgaW5pdGlhbCBBdXRoLgorICAgIGxlbiA9IHBDc3JSb2FtSW5mby0+bkFzc29jUnNwTGVuZ3RoIC0gRlRfQVNTT0NfUlNQX0lFU19PRkZTRVQ7CisgICAgd3JxdS5kYXRhLmxlbmd0aCA9IGxlbjsgCisgICAgbWVtc2V0KGJ1ZmYsIDAsIElXX0dFTkVSSUNfSUVfTUFYKTsKKyAgICBtZW1jcHkoYnVmZiwgcEZUQXNzb2NSc3AsIGxlbik7IAorICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWQVNTT0NSRVNQSUUsICZ3cnF1LCBidWZmKTsKKworICAgIGtmcmVlKGJ1ZmYpOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovIAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZW5kIHRoZSBGVElFcywgUklDIElFcyBkdXJpbmcgRlQuIFRoaXMgaXMgZXZlbnR1YWxseQorICogdXNlZCB0byBzZW5kIHRoZSBGVCBldmVudHMgdG8gdGhlIHN1cHBsaWNhbnQKKyAqCisgKiBBdCB0aGUgcmVjZXB0aW9uIG9mIEF1dGgyIHdlIHNlbmQgdGhlIFJJQyBmb2xsb3dlZAorICogYnkgdGhlIGF1dGggcmVzcG9uc2UgSUVzIHRvIHRoZSBzdXBwbGljYW50LgorICogT25jZSBib3RoIGFyZSByZWNlaXZlZCBpbiB0aGUgc3VwcGxpY2FudCwgYW4gRlQKKyAqIGV2ZW50IGlzIGdlbmVyYXRlZCB0byB0aGUgc3VwcGxpY2FudC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGhkZF9TZW5kRlRFdmVudChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisgICAgLy9zdHJ1Y3Qgd3BhYnVmICpyaWMgPSBOVUxMOworICAgIGNoYXIgKmJ1ZmY7CisgICAgdEFOSV9VMTYgYXV0aF9yZXNwX2xlbiA9IDA7CisgICAgdEFOSV9VMzIgcmljX2llc19sZW5ndGggPSAwOworICAgIHRBTklfVTE2IHN0cl9sZW47CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisgICAgLy8gV2UgbmVlZCB0byBzZW5kIHRoZSBJRXMgdG8gdGhlIHN1cHBsaWNhbnQuCisgICAgYnVmZiA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWCwgR0ZQX0FUT01JQyk7CisgICAgdm9zX21lbV96ZXJvKGJ1ZmYsIElXX0NVU1RPTV9NQVgpOyAKKyAgICBpZiAoYnVmZiA9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIGhkZExvZyhMT0dFLCAiJXM6IGttYWxsb2MgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIsIF9fZnVuY19fKTsgCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTbWUgbmVlZHMgdG8gc2VuZCB0aGUgUklDIElFcyBmaXJzdCAKKyAgICBzdHJfbGVuID0gc3RybGNweShidWZmLCAiUklDPSIsIElXX0NVU1RPTV9NQVgpOworICAgIHNtZV9HZXRSSUNJRXMoIHBIZGRDdHgtPmhIYWwsICh1OCAqKSYoYnVmZltzdHJfbGVuXSksIAorICAgICAgICAgICAgICAgICAgIChJV19DVVNUT01fTUFYIC0gc3RyX2xlbiksICZyaWNfaWVzX2xlbmd0aCApOyAKKyAgICBpZiAocmljX2llc19sZW5ndGggPT0gMCkgCisgICAgeworICAgICAgICBoZGRMb2coTE9HVywgIiVzOiBSSUMgSUVzIGlzIG9mIGxlbmd0aCAwIG5vdCBzZW5kaW5nIFJJQyBJbmZvcm1hdGlvbiBmb3Igbm93IiwgX19mdW5jX18pOyAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd3JxdS5kYXRhLmxlbmd0aCA9IHN0cl9sZW4gKyByaWNfaWVzX2xlbmd0aDsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWRhcHRlci0+ZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmZik7CisgICAgfQorCisgICAgLy8gU21lIG5lZWRzIHRvIHByb3ZpZGUgdGhlIEF1dGggUmVzcAorICAgIHZvc19tZW1femVybyhidWZmLCBJV19DVVNUT01fTUFYKTsgCisgICAgc3RyX2xlbiA9IHN0cmxjcHkoYnVmZiwgIkFVVEg9IiwgSVdfQ1VTVE9NX01BWCk7CisgICAgc21lX0dldEZUUHJlQXV0aFJlc3BvbnNlKHBIZGRDdHgtPmhIYWwsICh1OCAqKSZidWZmW3N0cl9sZW5dLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElXX0NVU1RPTV9NQVggLSBzdHJfbGVuKSwgICZhdXRoX3Jlc3BfbGVuKTsKKworICAgIGlmIChhdXRoX3Jlc3BfbGVuID09IDApIAorICAgIHsKKyAgICAgICAgaGRkTG9nKExPR0UsICIlczogQXV0aFJzcCBGVElFUyBpcyBvZiBsZW5ndGggMCIsIF9fZnVuY19fKTsgCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3cnF1LmRhdGEubGVuZ3RoID0gc3RyX2xlbiArIGF1dGhfcmVzcF9sZW47CisgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWRhcHRlci0+ZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmZik7CisKKyAgICBrZnJlZShidWZmKTsKK30KKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisKKy8qCisgKiBTZW5kIHRoZSBDQ1ggcmVxdWlyZWQgIm5ldyBBUCBDaGFubmVsIGluZm8iIHRvIHRoZSBzdXBwbGljYW50LgorICogKFRoaXMga2VlcHMgdGhlIHN1cHBsaWNhbnQgInVwIHRvIGRhdGUiIG9uIHRoZSBjdXJyZW50IGNoYW5uZWwuKQorICoKKyAqIFRoZSBjdXJyZW50IChuZXcgQVApIGNoYW5uZWwgaW5mb3JtYXRpb24gaXMgcGFzc2VkIGluLgorICovCitzdGF0aWMgdm9pZCBoZGRfU2VuZE5ld0FQQ2hhbm5lbEluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIAorICAgICAgICAgICAgICAgIHRDc3JSb2FtSW5mbyAqcENzclJvYW1JbmZvKQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKyAgICB0U2lyQnNzRGVzY3JpcHRpb24gKmRlc2NyaXB0b3IgPSBwQ3NyUm9hbUluZm8tPnBCc3NEZXNjOworICAgICAKKworICAgIGlmIChkZXNjcmlwdG9yID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgaGRkTG9nKExPR0UsCisgICAgICAgICAgICAiJXM6IHBDc3JSb2FtSW5mby0+cEJzc0Rlc2M9JXBcbiIsCisgICAgICAgICAgICBfX2Z1bmNfXywgZGVzY3JpcHRvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTZW5kIHRoZSBDaGFubmVsIGV2ZW50LCB0aGUgc3VwcGxpY2FudCBuZWVkcyB0aGlzIHRvIGdlbmVyYXRlIHRoZSBBZGphY2VudCBBUCByZXBvcnQuCisgICAgaGRkTG9nKExPR1csICIlczogU2VuZGluZyB1cCBhbiBTSU9DR0lXRlJFUSwgY2hhbm5lbElkPSVkXG4iLCBfX2Z1bmNfXywgZGVzY3JpcHRvci0+Y2hhbm5lbElkKTsKKyAgICBtZW1zZXQoJndycXUsICdcMCcsIHNpemVvZih3cnF1KSk7CisgICAgd3JxdS5mcmVxLm0gPSBkZXNjcmlwdG9yLT5jaGFubmVsSWQ7CisgICAgd3JxdS5mcmVxLmUgPSAwOworICAgIHdycXUuZnJlcS5pID0gMDsKKyAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZGFwdGVyLT5kZXYsIFNJT0NHSVdGUkVRLCAmd3JxdSwgTlVMTCk7Cit9CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0NYICovCisKK3ZvaWQgaGRkX1NlbmRVcGRhdGVCZWFjb25JRXNFdmVudChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdENzclJvYW1JbmZvICpwQ3NyUm9hbUluZm8pCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSB3cnF1OworICAgIHU4ICAqcEJlYWNvbkllczsKKyAgICB1OCBjdXJyZW50TGVuID0gMDsKKyAgICBjaGFyICpidWZmOworICAgIGludCB0b3RhbEllTGVuID0gMCwgY3VycmVudE9mZnNldCA9IDAsIHN0ckxlbjsKKworICAgIG1lbXNldCgmd3JxdSwgJ1wwJywgc2l6ZW9mKHdycXUpKTsKKworICAgIGlmICgwID09IHBDc3JSb2FtSW5mby0+bkJlYWNvbkxlbmd0aCkKKyAgICB7CisgICAgICAgIGhkZExvZyhMT0dFLCAiJXM6IHBDc3JSb2FtSW5mby0+bkJlYWNvbkZyYW1lTGVuZ3RoID0gMCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwQmVhY29uSWVzID0gKHU4ICopKHBDc3JSb2FtSW5mby0+cGJGcmFtZXMgKyBCRUFDT05fRlJBTUVfSUVTX09GRlNFVCk7CisgICAgaWYgKHBCZWFjb25JZXMgPT0gTlVMTCkgCisgICAgeworICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBCZWFjb24gSUVzIGlzIE5VTEwiLCBfX2Z1bmNfXyk7IAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gcEJlYWNvbkllcyBuZWVkcyB0byBwb2ludCB0byB0aGUgSUVzCisgICAgaGRkTG9nKExPRzEsICIlczogQmVhY29uIElFcyBpcyBub3cgYXQgJTAyeCUwMngiLCBfX2Z1bmNfXywKKyAgICAgICAgKHVuc2lnbmVkIGludClwQmVhY29uSWVzWzBdLAorICAgICAgICAodW5zaWduZWQgaW50KXBCZWFjb25JZXNbMV0pOworICAgIGhkZExvZyhMT0cxLCAiJXM6IEJlYWNvbiBJRXMgbGVuZ3RoID0gJWQiLCBfX2Z1bmNfXywgcENzclJvYW1JbmZvLT5uQmVhY29uTGVuZ3RoIC0gQkVBQ09OX0ZSQU1FX0lFU19PRkZTRVQpOworICAgIAorICAgLy8gV2UgbmVlZCB0byBzZW5kIHRoZSBJRXMgdG8gdGhlIHN1cHBsaWNhbnQuCisgICAgYnVmZiA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWCwgR0ZQX0FUT01JQyk7CisgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgCisgICAgeworICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBrbWFsbG9jIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiLCBfX2Z1bmNfXyk7IAorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZvc19tZW1femVybyhidWZmLCBJV19DVVNUT01fTUFYKTsgCisKKyAgICBzdHJMZW4gPSBzdHJsY3B5KGJ1ZmYsIkJFQUNPTklFcz0iLCBJV19DVVNUT01fTUFYKTsKKyAgICBjdXJyZW50TGVuID0gc3RyTGVuICsgMTsKKworICAgIHRvdGFsSWVMZW4gPSBwQ3NyUm9hbUluZm8tPm5CZWFjb25MZW5ndGggLSBCRUFDT05fRlJBTUVfSUVTX09GRlNFVDsKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogSWYgdGhlIGJlYWNvbiBzaXplIGV4Y2VlZHMgbWF4IENVU1RPTSBldmVudCBzaXplLCBicmVhayBpdCBpbnRvIGNodW5rcyBvZiBDVVNUT00gZXZlbnQgCisgICAgICAgICAqIG1heCBzaXplIGFuZCBzZW5kIGl0IHRvIHN1cHBsaWNhbnQuIENoYW5nZXMgYXJlIGRvbmUgaW4gc3VwcGxpY2FudCB0byBoYW5kbGUgdGhpcyAqLworICAgICAgICB2b3NfbWVtX3plcm8oJmJ1ZmZbc3RyTGVuICsgMV0sIElXX0NVU1RPTV9NQVggLSAoc3RyTGVuICsgMSkpOworICAgICAgICBjdXJyZW50TGVuID0gVk9TX01JTih0b3RhbEllTGVuLCBJV19DVVNUT01fTUFYIC0gKHN0ckxlbiArIDEpIC0gMSk7CisgICAgICAgIHZvc19tZW1fY29weSgmYnVmZltzdHJMZW4gKyAxXSwgcEJlYWNvbkllcytjdXJyZW50T2Zmc2V0LCBjdXJyZW50TGVuKTsKKyAgICAgICAgY3VycmVudE9mZnNldCArPSBjdXJyZW50TGVuOworICAgICAgICB0b3RhbEllTGVuIC09IGN1cnJlbnRMZW47CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBzdHJMZW4gKyAxICsgY3VycmVudExlbjsKKyAgICAgICAgaWYgKHRvdGFsSWVMZW4pCisgICAgICAgICAgYnVmZltzdHJMZW5dID0gMTsgICAvLyBUaGlzIHRlbGxzIHN1cHBsaWNhbnQgbW9yZSBjaHVua3MgYXJlIHBlbmRpbmcgCisgICAgICAgIGVsc2UKKyAgICAgICAgICBidWZmW3N0ckxlbl0gPSAwOyAgIC8vIEZvciBsYXN0IGNodW5rIG9mIGJlYWNvbiBJRSB0byBzdXBwbGljYW50CisKKyAgICAgICAgaGRkTG9nKExPRzEsICIlczogQmVhY29uIElFcyBsZW5ndGggdG8gc3VwcGxpY2FudCA9ICVkIiwgX19mdW5jX18sIGN1cnJlbnRMZW4pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZGFwdGVyLT5kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBidWZmKTsKKyAgICB9IHdoaWxlICh0b3RhbEllTGVuID4gMCk7CisKKyAgICBrZnJlZShidWZmKTsKK30KKworc3RhdGljIHZvaWQgaGRkX1NlbmRBc3NvY2lhdGlvbkV2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdENzclJvYW1JbmZvICpwQ3NyUm9hbUluZm8pCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisgICAgaW50IHdlX2V2ZW50OworICAgIGNoYXIgKm1zZzsKKyAgICBpbnQgdHlwZSA9IC0xOworCisjaWYgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIAorICAgIC8vIEFkZGVkIHRvIGZpbmQgdGhlIGF1dGggdHlwZSBvbiB0aGUgZmx5IGF0IHJ1biB0aW1lIAorICAgIC8vIHJhdGhlciB0aGFuIHdpdGggY2ZnIHRvIHNlZSBpZiBGVCBpcyBlbmFibGVkIAorICAgIGhkZF93ZXh0X3N0YXRlX3QgICpwV2V4dFN0YXRlID0gIFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7ICAgCisgICAgdENzclJvYW1Qcm9maWxlKiBwUm9hbVByb2ZpbGUgPSAmKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlKTsKKyNlbmRpZgorIAorICAgIG1lbXNldCgmd3JxdSwgJ1wwJywgc2l6ZW9mKHdycXUpKTsKKyAgICB3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOyAKKyAgICB3ZV9ldmVudCA9IFNJT0NHSVdBUDsKKyAgIAorICAgIGlmKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCA9PSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKS8qIEFzc29jaWF0ZWQgKi8KKyAgICB7CisgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcENzclJvYW1JbmZvLT5wQnNzRGVzYy0+YnNzSWQsIHNpemVvZihwQ3NyUm9hbUluZm8tPnBCc3NEZXNjLT5ic3NJZCkpOworICAgICAgICB0eXBlID0gV0xBTl9TVEFfQVNTT0NfRE9ORV9JTkQ7CisKKyAgICAgICAgcHJfaW5mbygid2xhbjogY29ubmVjdGVkIHRvICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIHdycXUuYXBfYWRkci5zYV9kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgIHdycXUuYXBfYWRkci5zYV9kYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgIHdycXUuYXBfYWRkci5zYV9kYXRhWzJdLAorICAgICAgICAgICAgICAgICAgICAgIHdycXUuYXBfYWRkci5zYV9kYXRhWzNdLAorICAgICAgICAgICAgICAgICAgICAgIHdycXUuYXBfYWRkci5zYV9kYXRhWzRdLAorICAgICAgICAgICAgICAgICAgICAgIHdycXUuYXBfYWRkci5zYV9kYXRhWzVdKTsKKyAgICAgICAgaGRkX1NlbmRVcGRhdGVCZWFjb25JRXNFdmVudChwQWRhcHRlciwgcENzclJvYW1JbmZvKTsKKworICAgICAgICAvKiBTZW5kIElXRVZBU1NPQ1JFU1BJRSBFdmVudCBpZiBXTEFOX0ZFQVRVUkVfQ0lRX01FVFJJQ1MgaXMgRW5hYmxlZCBPcgorICAgICAgICAgKiBTZW5kIElXRVZBU1NPQ1JFU1BJRSBFdmVudCBpZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiBpcyBFbmFibGVkCisgICAgICAgICAqIGFuZCBmRlRFbmFibGUgaXMgVFJVRSAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgIC8vIFNlbmQgRlQgS2V5cyB0byB0aGUgc3VwcGxpY2FudCB3aGVuIEZUIGlzIGVuYWJsZWQKKyAgICAgICAgaWYgKChwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID09IGVDU1JfQVVUSF9UWVBFX0ZUX1JTTl9QU0spIHx8CisgICAgICAgICAgICAocFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9PSBlQ1NSX0FVVEhfVFlQRV9GVF9SU04pIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgICAgIHx8IChwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID09IGVDU1JfQVVUSF9UWVBFX0NDS01fUlNOKSB8fAorICAgICAgICAgICAgKHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPT0gZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEEpCisjZW5kaWYKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBoZGRfU2VuZEZUQXNzb2NSZXNwb25zZShkZXYsIHBBZGFwdGVyLCBwQ3NyUm9hbUluZm8pOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZiAoZUNvbm5lY3Rpb25TdGF0ZV9JYnNzQ29ubmVjdGVkID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIC8vIElCc3MgQXNzb2NpYXRlZAorICAgIHsKKyAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQsIHNpemVvZih3cnF1LmFwX2FkZHIuc2FfZGF0YSkpOworICAgICAgICB0eXBlID0gV0xBTl9TVEFfQVNTT0NfRE9ORV9JTkQ7CisgICAgICAgIHByX2luZm8oIndsYW46IG5ldyBJQlNTIGNvbm5lY3Rpb24gdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkWzJdLAorICAgICAgICAgICAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWRbNF0sCisgICAgICAgICAgICAgICAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkWzVdKTsKKyAgICB9CisgICAgZWxzZSAvKiBOb3QgQXNzb2NpYXRlZCAqLworICAgIHsKKyAgICAgICAgcHJfaW5mbygid2xhbjogZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgdHlwZSA9IFdMQU5fU1RBX0RJU0FTU09DX0RPTkVfSU5EOworICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsJ1wwJyxFVEhfQUxFTik7CisgICAgfQorCisgICAgbXNnID0gTlVMTDsKKyAgICAvKkR1cmluZyB0aGUgV0xBTiB1bmluaXRpYWxpemF0aW9uLHN1cHBsaWNhbnQgaXMgc3RvcHBlZCBiZWZvcmUgdGhlCisgICAgICBkcml2ZXIgc28gbm90IHNlbmRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgY29ubmVjdGlvbiB0byBzdXBwbGljYW50Ki8KKyAgICBpZihwSGRkQ3R4LT5pc0xvYWRVbmxvYWRJblByb2dyZXNzICE9IFRSVUUpCisgICAgeworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgd2VfZXZlbnQsICZ3cnF1LCBtc2cpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgaWYoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpLyogQXNzb2NpYXRlZCAqLworICAgICAgICB7ICAgICAgICAKKyAgICAgICAgICAgIGlmICggKHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPT0gZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU04pIHx8IAorICAgICAgICAgICAgICAgIChwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID09IGVDU1JfQVVUSF9UWVBFX0NDS01fV1BBKSApIAorICAgICAgICAgICAgaGRkX1NlbmROZXdBUENoYW5uZWxJbmZvKGRldiwgcEFkYXB0ZXIsIHBDc3JSb2FtSW5mbyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBzZW5kX2J0Y19ubGlua19tc2codHlwZSwgMCk7Cit9CisKK3ZvaWQgaGRkX2Nvbm5SZW1vdmVDb25uZWN0SW5mbyggaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggKQoreworICAgLy8gUmVtb3ZlIHN0YUlkLCBic3NJZCBhbmQgcGVlck1hY0FkZHJlc3MKKyAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZCBbIDAgXSA9IDA7CisgICB2b3NfbWVtX3plcm8oICZwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQsIHNpemVvZiggdl9NQUNBRERSX3QgKSApOworICAgdm9zX21lbV96ZXJvKCAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnBlZXJNYWNBZGRyZXNzWyAwIF0sIHNpemVvZiggdl9NQUNBRERSX3QgKSApOworCisgICAvLyBDbGVhciBhbGwgc2VjdXJpdHkgc2V0dGluZ3MKKyAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSAgICAgICAgID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07CisgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8ubWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8udWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisKKyAgIHZvc19tZW1femVybyggJnBIZGRTdGFDdHgtPmNvbm5faW5mby5LZXlzLCBzaXplb2YoIHRDc3JLZXlzICkgKTsKKworICAgLy8gU2V0IG5vdC1jb25uZWN0ZWQgc3RhdGUKKyAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uRG90MTFEZXNpcmVkQnNzVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworICAgaGRkX2Nvbm5TZXRDb25uZWN0aW9uU3RhdGUoIHBIZGRTdGFDdHgsIGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkICk7ICAKKworICAgdm9zX21lbV96ZXJvKCAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLlNTSUQsIHNpemVvZiggdENzclNTSURJbmZvICkgKTsKK30KKy8qIFRPRE8gUmV2aXN0IHRoaXMgZnVuY3Rpb24uIGFuZCBkYXRhIHBhdGggKi8KK3N0YXRpYyBWT1NfU1RBVFVTIGhkZF9yb2FtRGVyZWdpc3RlclNUQSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHRBTklfVTggc3RhSWQgKQoreworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgIGhkZF9kaXNjb25uZWN0X3R4X3J4KHBBZGFwdGVyKTsKKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfQ2xlYXJTVEFDbGllbnQoIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnB2b3NDb250ZXh0LCBzdGFJZCApOworICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAgIiVzOiBXTEFOVExfQ2xlYXJTVEFDbGllbnQoKSBmYWlsZWQgdG8gZm9yIHN0YUlEICVkLiAgIgorICAgICAgICAgICAgICAgICAgICJTdGF0dXM9ICVkIFsweCUwOGxYXSIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGFJZCwgdm9zU3RhdHVzLCB2b3NTdGF0dXMgKTsKKyAgICB9CisgICAgcmV0dXJuKCB2b3NTdGF0dXMgKTsKK30KKworCitzdGF0aWMgZUhhbFN0YXR1cyBoZGRfRGlzQ29ubmVjdEhhbmRsZXIoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgcm9hbUlkLCBlUm9hbUNtZFN0YXR1cyByb2FtU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0ICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcEFkYXB0ZXItPmRldjsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgICAvLyBub3RpZnkgYXBwcyB0aGF0IHdlIGNhbid0IHBhc3MgdHJhZmZpYyBhbnltb3JlCisgICAgbmV0aWZfdHhfZGlzYWJsZShkZXYpOworICAgIG5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisgICAgCisgICAgaGRkX2Nvbm5TZXRDb25uZWN0aW9uU3RhdGUoIHBIZGRTdGFDdHgsIGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkICk7CisgICAgLyogSWYgb25seSBTVEEgbW9kZSBpcyBvbiAqLworICAgIGlmKChwSGRkQ3R4LT5jb25jdXJyZW5jeV9tb2RlIDw9IDEpICYmIChwSGRkQ3R4LT5ub19vZl9zZXNzaW9uc1tXTEFOX0hERF9JTkZSQV9TVEFUSU9OXSA8PTEpKQorICAgIHsKKyAgICAgICAgcEhkZEN0eC0+aXNBbXBBbGxvd2VkID0gVk9TX1RSVUU7CisgICAgfQorICAgIGhkZF9jbGVhclJvYW1Qcm9maWxlSWUoIHBBZGFwdGVyICk7CisKKyAgICAvLyBpbmRpY2F0ZSAnZGlzY29ubmVjdCcgc3RhdHVzIHRvIHdwYV9zdXBwbGljYW50Li4uCisgICAgaGRkX1NlbmRBc3NvY2lhdGlvbkV2ZW50KGRldixwUm9hbUluZm8pOworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgIC8qIGluZGljYXRlIGRpc2Nvbm5lY3RlZCBldmVudCB0byBubDgwMjExICovCisgICAgaWYocm9hbVN0YXR1cyAhPSBlQ1NSX1JPQU1fSUJTU19MRUFWRSkKKyAgICB7CisgICAgICAgIC8qRHVyaW5nIHRoZSBXTEFOIHVuaW5pdGlhbGl6YXRpb24sc3VwcGxpY2FudCBpcyBzdG9wcGVkIGJlZm9yZSB0aGUKKyAgICAgICAgICAgIGRyaXZlciBzbyBub3Qgc2VuZGluZyB0aGUgc3RhdHVzIG9mIHRoZSBjb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQqLworICAgICAgICBpZihwSGRkQ3R4LT5pc0xvYWRVbmxvYWRJblByb2dyZXNzICE9IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBzZW50IGRpc2Nvbm5lY3RlZCBldmVudCB0byBubDgwMjExIiwgCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgIC8qIFRvIGF2b2lkIHdwYV9zdXBwbGljYW50IHNlbmRpbmcgIkhBTkdFRCIgQ01EIHRvIElDUyBVSSAqLworICAgICAgICAgICAgaWYoIGVDU1JfUk9BTV9MT1NUTElOSyA9PSByb2FtU3RhdHVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZmc4MDIxMV9kaXNjb25uZWN0ZWQoZGV2LCBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSwgTlVMTCwgMCwgR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2ZnODAyMTFfZGlzY29ubmVjdGVkKGRldiwgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQsIE5VTEwsIDAsIEdGUF9LRVJORUwpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9JZiB0aGUgRGV2aWNlIE1vZGUgaXMgU3RhdGlvbgorICAgICAgICAgICAgLy8gYW5kIHRoZSBQMlAgQ2xpZW50IGlzIENvbm5lY3RlZAorICAgICAgICAgICAgLy9FbmFibGUgQk1QUworICAgICAgICAgICAgaWYoKFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSAmJgorICAgICAgICAgICAgICAgICh2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9FbmFibGUgQk1QUyBvbmx5IG9mIG90aGVyIFNlc3Npb24gaXMgUDJQIENsaWVudAorICAgICAgICAgICAgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IE5VTEw7CisgICAgICAgICAgICAgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoIFZPU19NT0RVTEVfSURfSERELCBOVUxMICk7ICAgIAorCisgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBwVm9zQ29udGV4dCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBwSGRkQ3R4ID0gdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0hERCwgcFZvc0NvbnRleHQpOworCisgICAgICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBwSGRkQ3R4KQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLy9Pbmx5IFAyUCBDbGllbnQgaXMgdGhlcmUgRW5hYmxlIEJtcHMgYmFjaworICAgICAgICAgICAgICAgICAgICAgICBpZigoMCA9PSBwSGRkQ3R4LT5ub19vZl9zZXNzaW9uc1tWT1NfU1RBX1NBUF9NT0RFXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgPT0gcEhkZEN0eC0+bm9fb2Zfc2Vzc2lvbnNbVk9TX1AyUF9HT19NT0RFXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPT0gcEhkZEN0eC0+bm9fb2Zfc2Vzc2lvbnNbVk9TX1AyUF9DTElFTlRfTU9ERV0pKQorICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfZW5hYmxlX2JtcHNfaW1wcyhwSGRkQ3R4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIAorCisgICAgLy9XZSBzaG91bGQgY2xlYXIgYWxsIHN0YSByZWdpc3RlciB3aXRoIFRMLCBmb3Igbm93LCBvbmx5IG9uZS4KKyAgICBzdGF0dXMgPSBoZGRfcm9hbURlcmVnaXN0ZXJTVEEoIHBBZGFwdGVyLCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWQgWzBdICk7CisgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiaGRkX3JvYW1EZXJlZ2lzdGVyU1RBKCkgZmFpbGVkIHRvIGZvciBzdGFJRCAlZC4gICIKKyAgICAgICAgICAgICAgICAgICJTdGF0dXM9ICVkIFsweCV4XSIsCisgICAgICAgICAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFswXSwgc3RhdHVzLCBzdGF0dXMgKTsKKworICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHBIZGRDdHgtPnN0YV90b19hZGFwdGVyW3BIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFswXV0gPSBOVUxMOworICAgIC8vIENsZWFyIHNhdmVkIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gaW4gSERECisgICAgaGRkX2Nvbm5SZW1vdmVDb25uZWN0SW5mbyggcEhkZFN0YUN0eCApOworCisgICAgLy9VbmJsb2NrIGFueW9uZSB3YWl0aW5nIGZvciBkaXNjb25uZWN0IHRvIGNvbXBsZXRlCisgICAgY29tcGxldGUoJnBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorc3RhdGljIFZPU19TVEFUVVMgaGRkX3JvYW1SZWdpc3RlclNUQSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzdGFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfTUFDQUREUl90ICpwUGVlck1hY0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjICkKK3sKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICBXTEFOX1NUQURlc2NUeXBlIHN0YURlc2MgPSB7MH07CisgICBlQ3NyRW5jcnlwdGlvblR5cGUgY29ubmVjdGVkQ2lwaGVyQWxnbzsKKyAgIHZfQk9PTF90ICBmQ29ubmVjdGVkOworICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKyAgIAorICAgLy8gR2V0IHRoZSBTdGF0aW9uIElEIGZyb20gdGhlIG9uZSBzYXZlZCBkdXJpbmcgdGhlIGFzc29jYXRpb24uCisgICBzdGFEZXNjLnVjU1RBSWQgPSBzdGFJZDsKKworICAgaWYgKCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ubkRvdDExRGVzaXJlZEJzc1R5cGUgPT0gZU1pYl9kb3QxMURlc2lyZWRCc3NUeXBlX2luZnJhc3RydWN0dXJlKQorICAgeyAKKyAgICAgIHN0YURlc2Mud1NUQVR5cGUgPSBXTEFOX1NUQV9JTkZSQTsKKyAgICAgIAorICAgICAgLy8gZ3JhYiB0aGUgYnNzaWQgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvIGluIHRoZSBhZGFwdGVyIHN0cnVjdHVyZSBhbmQgaGFuZCB0aGF0IAorICAgICAgLy8gb3ZlciB0byBUTCB3aGVuIHJlZ2lzdGVyaW5nLiAKKyAgICAgIHZvc19tZW1fY29weSggc3RhRGVzYy52U1RBTUFDQWRkcmVzcy5ieXRlcywgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLHNpemVvZihwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQpICk7IAorICAgfQorICAgZWxzZSAKKyAgIHsKKyAgICAgIC8vIGZvciBhbiBJQlNTICdjb25uZWN0Jywgc2V0dXAgdGhlIFN0YXRpb24gRGVzY3JpcHRvciBmb3IgVEwuICAgCisgICAgICBzdGFEZXNjLndTVEFUeXBlID0gV0xBTl9TVEFfSUJTUzsKKyAgICAgIAorICAgICAgLy8gTm90ZSB0aGF0IGZvciBJQlNTLCB0aGUgU1RBIE1BQyBhZGRyZXNzIGFuZCBCU1NJRCBhcmUgZ29pZ24gdG8gYmUgZGlmZmVyZW50IHdoZXJlCisgICAgICAvLyBpbiBpbmZyYXN0cnVjdHVyZSwgdGhleSBhcmUgdGhlIHNhbWUgKEJTU0lEIGlzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgQVApLiAgU28sCisgICAgICAvLyBmb3IgSUJTUyB3ZSBoYXZlIGEgc2Vjb25kIGZpZWxkIHRvIHBhc3MgdG8gVEwgaW4gdGhlIFNUQSBkZXNjcmlwdG9yIHRoYXQgd2UgZG9uJ3QKKyAgICAgIC8vIHBhc3Mgd2hlbiBtYWtpbmcgYW4gSW5mcmFzdHJ1Y3R1cmUgY29ubmVjdGlvbi4KKyAgICAgIHZvc19tZW1fY29weSggc3RhRGVzYy52U1RBTUFDQWRkcmVzcy5ieXRlcywgcFBlZXJNYWNBZGRyZXNzLT5ieXRlcyxzaXplb2YocFBlZXJNYWNBZGRyZXNzLT5ieXRlcykgKTsKKyAgICAgIHZvc19tZW1fY29weSggc3RhRGVzYy52QlNTSURmb3JJQlNTLmJ5dGVzLCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQsNiApOworICAgfQorICAgICAgCisgICB2b3NfY29weV9tYWNhZGRyKCAmc3RhRGVzYy52U2VsZk1BQ0FkZHJlc3MsICZwQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQgKTsKKworICAgLy8gc2V0IHRoZSBRb1MgZmllbGQgYXBwcm9wcmlhdGVseQorICAgaWYgKGhkZF93bW1faXNfYWN0aXZlKHBBZGFwdGVyKSkKKyAgIHsKKyAgICAgIHN0YURlc2MudWNRb3NFbmFibGVkID0gMTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN0YURlc2MudWNRb3NFbmFibGVkID0gMDsKKyAgIH0KKworICAgZkNvbm5lY3RlZCA9IGhkZF9jb25uR2V0Q29ubmVjdGVkQ2lwaGVyQWxnbyggcEhkZFN0YUN0eCwgJmNvbm5lY3RlZENpcGhlckFsZ28gKTsKKyAgIGlmICggY29ubmVjdGVkQ2lwaGVyQWxnbyAhPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FICkKKyAgIHsKKyAgICAgIHN0YURlc2MudWNQcm90ZWN0ZWRGcmFtZSA9IDE7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzdGFEZXNjLnVjUHJvdGVjdGVkRnJhbWUgPSAwOworCisgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICBzdGFEZXNjLnVjSXNDY3hTdGEgPSBwUm9hbUluZm8tPmlzQ0NYQXNzb2M7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fQ0NYCisKKyNpZmRlZiBWT0xBTlNfRU5BQkxFX1NXX1JFUExBWV9DSEVDSworICAgLyogY2hlY2sgd2hldGhlciByZXBsYXkgY2hlY2sgaXMgdmFsaWQgZm9yIHRoZSBzdGF0aW9uIG9yIG5vdCAqLworICAgaWYoIChlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQID09IGNvbm5lY3RlZENpcGhlckFsZ28pIHx8IChlQ1NSX0VOQ1JZUFRfVFlQRV9BRVMgPT0gY29ubmVjdGVkQ2lwaGVyQWxnbykpCisgICB7CisgICAgICAgLyogRW5jcnlwdGlvbiBtb2RlIGlzIGVpdGhlciBUS0lQIG9yIEFFUworICAgICAgICAgIGFuZCByZXBsYXkgY2hlY2sgaXMgdmFsaWQgZm9yIG9ubHkgdGhlc2UKKyAgICAgICAgICB0d28gZW5jcnlwdGlvbiBtb2RlcyAqLworICAgICAgIHN0YURlc2MudWNJc1JlcGxheUNoZWNrVmFsaWQgPSBWT1NfVFJVRTsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIkhERCByZWdpc3RlciBUTCB1Y0lzUmVwbGF5Q2hlY2tWYWxpZCAlZDogUmVwbGF5IGNoZWNrIGlzIG5lZWRlZCBmb3Igc3RhdGlvbiIsIHN0YURlc2MudWNJc1JlcGxheUNoZWNrVmFsaWQpOworICAgfQorICAKKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIEZvciBvdGhlciBlbmNyeXB0aW9uIG1vZGVzIHJlcGxheSBjaGVjayBpcyAKKyAgICAgICAgIG5vdCBuZWVkZWQgKi8KKyAgICAgICAgc3RhRGVzYy51Y0lzUmVwbGF5Q2hlY2tWYWxpZCA9IFZPU19GQUxTRTsgCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiSEREIHJlZ2lzdGVyIFRMIHVjSXNSZXBsYXlDaGVja1ZhbGlkICVkIiwgc3RhRGVzYy51Y0lzUmVwbGF5Q2hlY2tWYWxpZCk7CisgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICBoZGRMb2coTE9HMSwgIiVzOiBXQVBJIFNUQSBSZWdpc3RlcmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgcEFkYXB0ZXItPndhcGlfaW5mby5mSXNXYXBpU3RhKTsKKyAgIGlmIChwQWRhcHRlci0+d2FwaV9pbmZvLmZJc1dhcGlTdGEpCisgICB7CisgICAgICBzdGFEZXNjLnVjSXNXYXBpU3RhID0gMTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN0YURlc2MudWNJc1dhcGlTdGEgPSAwOworICAgfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwKKyAgICAgICAgICAgICAgICAgIkhERCByZWdpc3RlciBUTCBTZWNfZW5hYmxlZD0gJWQuIiwgc3RhRGVzYy51Y1Byb3RlY3RlZEZyYW1lICk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8vIFVNQSBpcyBOb3QgcmVhZHkgeWV0LCBYbGF0aW9uIHdpbGwgYmUgZG9uZSBieSBUTAorICAgc3RhRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gPSAxOworI2Vsc2UKKyAgIC8qIEVuYWJsZSBVTUEgZm9yIFRYIHRyYW5zbGF0aW9uIG9ubHkgd2hlbiB0aGVyZSBpcyBubyBjb25jdXJyZW50IHNlc3Npb24gYWN0aXZlICovCisgICBpZiAodm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZygpKQorICAgeworICAgICAgc3RhRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gPSAxOworICAgfQorICAgZWxzZQorICAgeworICAgICAgc3RhRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gPSAwOworICAgfQorI2VuZGlmCisgICBzdGFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbiA9IDE7CisgICBzdGFEZXNjLnVjQWRkUm12TExDID0gMTsKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJIREQgcmVnaXN0ZXIgVEwgUW9TX2VuYWJsZWQ9JWQiLCAKKyAgICAgICAgICAgICAgc3RhRGVzYy51Y1Fvc0VuYWJsZWQgKTsKKyAgIC8vIEluaXRpYWxpemUgc2lnbmF0dXJlcyBhbmQgc3RhdGUKKyAgIHN0YURlc2MudWNVY2FzdFNpZyAgPSBwUm9hbUluZm8tPnVjYXN0U2lnOworICAgc3RhRGVzYy51Y0JjYXN0U2lnICA9IHBSb2FtSW5mby0+YmNhc3RTaWc7CisgICBzdGFEZXNjLnVjSW5pdFN0YXRlID0gcFJvYW1JbmZvLT5mQXV0aFJlcXVpcmVkID8KKyAgICAgIFdMQU5UTF9TVEFfQ09OTkVDVEVEIDogV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEOworICAgLy8gUmVnaXN0ZXIgdGhlIFN0YXRpb24gd2l0aCBUTC4uLiAgICAgIAorICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50KCBwSGRkQ3R4LT5wdm9zQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9yeF9wYWNrZXRfY2JrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX3R4X2NvbXBsZXRlX2NiaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF90eF9mZXRjaF9wYWNrZXRfY2JrLCAmc3RhRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0Rlc2MtPnJzc2kgKTsKKyAgIAorICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgCisgICAgICAgICAgICAgICAgICJXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQoKSBmYWlsZWQgdG8gcmVnaXN0ZXIuICBTdGF0dXM9ICVkIFsweCUwOGxYXSIsCisgICAgICAgICAgICAgICAgIHZvc1N0YXR1cywgdm9zU3RhdHVzICk7CisgICAgICByZXR1cm4gdm9zU3RhdHVzOyAgICAgIAorICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgIC8vIGlmICggV1BBICksIHRlbGwgVEwgdG8gZ28gdG8gJ2Nvbm5lY3RlZCcgYW5kIGFmdGVyIGtleXMgY29tZSB0byB0aGUgZHJpdmVyLCAKKyAgIC8vIHRoZW4gZ28gdG8gJ2F1dGhlbnRpY2F0ZWQnLiAgRm9yIGFsbCBvdGhlciBhdXRoZW50aWNhdGlvbiB0eXBlcyAodGhvc2UgdGhhdCBkbyAKKyAgIC8vIG5vdCByZXF1aXJlIHVwcGVyIGxheWVyIGF1dGhlbnRpY2F0aW9uKSB3ZSBjYW4gcHV0IFRMIGRpcmVjdGx5IGludG8gJ2F1dGhlbnRpY2F0ZWQnCisgICAvLyBzdGF0ZS4KKyAgIAorICAgVk9TX0FTU0VSVCggZkNvbm5lY3RlZCApOworICAKKyAgIGlmICggIXBSb2FtSW5mby0+ZkF1dGhSZXF1aXJlZCApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgICAgICAgICAgICJvcGVuL3NoYXJlZCBhdXRoIFN0YUlkPSAlZC4gIENoYW5naW5nIFRMIHN0YXRlIHRvIEFVVEhFTlRJQ0FURUQgYXQgSm9pbiB0aW1lIiwgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWyAwIF0gKTsKKyAgIAorICAgICAgLy8gQ29ubmVjdGlvbnMgdGhhdCBkbyBub3QgbmVlZCBVcHBlciBsYXllciBhdXRoLCB0cmFuc2l0aW9uIFRMIGRpcmVjdGx5CisgICAgICAvLyB0byAnQXV0aGVudGljYXRlZCcgc3RhdGUuICAgICAgCisgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfQ2hhbmdlU1RBU3RhdGUoIHBIZGRDdHgtPnB2b3NDb250ZXh0LCBzdGFEZXNjLnVjU1RBSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgKTsKKyAgCisgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8udUlzQXV0aGVudGljYXRlZCA9IFZPU19UUlVFOworICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBlbHNlCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgICAgICAgICAgICJVTEEgYXV0aCBTdGFJZD0gJWQuICBDaGFuZ2luZyBUTCBzdGF0ZSB0byBDT05ORUNURUQgYXQgSm9pbiB0aW1lIiwgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWyAwIF0gKTsKKyAgIAorICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0NoYW5nZVNUQVN0YXRlKCBwSGRkQ3R4LT5wdm9zQ29udGV4dCwgc3RhRGVzYy51Y1NUQUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX1NUQV9DT05ORUNURUQgKTsKKworICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnVJc0F1dGhlbnRpY2F0ZWQgPSBWT1NfRkFMU0U7CisgICB9ICAgICAgCisgICByZXR1cm4oIHZvc1N0YXR1cyApOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorc3RhdGljIHZvaWQgaGRkX1NlbmRSZUFzc29jRXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisgICAgdENzclJvYW1JbmZvICpwQ3NyUm9hbUluZm8sIHZfVThfdCAqcmVxUnNuSWUsIHRBTklfVTMyIHJlcVJzbkxlbmd0aCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbGVuID0gMDsKKyAgICB1OCAqcEZUQXNzb2NSc3AgPSBOVUxMOworICAgIHZfVThfdCByc3BSc25JZVtJV19HRU5FUklDX0lFX01BWF07CisgICAgdEFOSV9VMzIgcnNwUnNuTGVuZ3RoID0gMDsKKyAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisKKyAgICBpZiAocENzclJvYW1JbmZvID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwQ3NyUm9hbUluZm8tPm5Bc3NvY1JzcExlbmd0aCA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBwRlRBc3NvY1JzcCA9ICh1OCAqKShwQ3NyUm9hbUluZm8tPnBiRnJhbWVzICsgcENzclJvYW1JbmZvLT5uQmVhY29uTGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgcENzclJvYW1JbmZvLT5uQXNzb2NSZXFMZW5ndGgpOworICAgIGlmIChwRlRBc3NvY1JzcCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICAvL3BGVEFzc29jUnNwIG5lZWRzIHRvIHBvaW50IHRvIHRoZSBJRXMKKyAgICBwRlRBc3NvY1JzcCArPSBGVF9BU1NPQ19SU1BfSUVTX09GRlNFVDsKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBBc3NvY1JzcCBpcyBub3cgYXQgJTAyeCUwMnhcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBGVEFzc29jUnNwWzBdLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBGVEFzc29jUnNwWzFdKTsKKworICAgIC8vIFNlbmQgdGhlIEFzc29jIFJlc3AsIHRoZSBzdXBwbGljYW50IG5lZWRzIHRoaXMgZm9yIGluaXRpYWwgQXV0aC4KKyAgICBsZW4gPSBwQ3NyUm9hbUluZm8tPm5Bc3NvY1JzcExlbmd0aCAtIEZUX0FTU09DX1JTUF9JRVNfT0ZGU0VUOworICAgIHJzcFJzbkxlbmd0aCA9IGxlbjsKKyAgICBtZW1zZXQocnNwUnNuSWUsIDAsIElXX0dFTkVSSUNfSUVfTUFYKTsKKyAgICBtZW1jcHkocnNwUnNuSWUsIHBGVEFzc29jUnNwLCBsZW4pOworCisgICAgY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChwQWRhcHRlci0+d2Rldi53aXBoeSwgKGludCkgcENzclJvYW1JbmZvLT5wQnNzRGVzYy0+Y2hhbm5lbElkKTsKKyAgICBjZmc4MDIxMV9yb2FtZWQoZGV2LGNoYW4scENzclJvYW1JbmZvLT5ic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgcmVxUnNuSWUsIHJlcVJzbkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgcnNwUnNuSWUsIHJzcFJzbkxlbmd0aCxHRlBfS0VSTkVMKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0NYICovCisKK3N0YXRpYyBlSGFsU3RhdHVzIGhkZF9Bc3NvY2lhdGlvbkNvbXBsZXRpb25IYW5kbGVyKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdENzclJvYW1JbmZvICpwUm9hbUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHJvYW1JZCwgZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0ICkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcEFkYXB0ZXItPmRldjsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgaW50IGZ0X2NhcnJpZXJfb24gPSBGQUxTRTsKKyNlbmRpZgorICAgIGludCBzdGF0dXM7CisgCisgICAgaWYgKCBlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQgPT0gcm9hbVJlc3VsdCApCisgICAgeworICAgICAgICBoZGRfY29ublNldENvbm5lY3Rpb25TdGF0ZSggcEhkZFN0YUN0eCwgZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICk7CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgY29ubmVjdGlvbiBpbmZvIGZyb20gQ1NSLi4uCisgICAgICAgIGhkZF9jb25uU2F2ZUNvbm5lY3RJbmZvKCBwQWRhcHRlciwgcFJvYW1JbmZvLCBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFICk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICAgICAgaWYgKCBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPkF1dGhUeXBlID09IGVDU1JfQVVUSF9UWVBFX1dBUElfV0FJX0NFUlRJRklDQVRFIHx8CisgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5BdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9QU0sgKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+d2FwaV9pbmZvLmZJc1dhcGlTdGEgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPndhcGlfaW5mby5mSXNXYXBpU3RhID0gMDsKKyAgICAgICAgfQorI2VuZGlmICAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisgICAgICAgIC8vIGluZGljYXRlICdjb25uZWN0JyBzdGF0dXMgdG8gdXNlcnNwYWNlCisgICAgICAgIGhkZF9TZW5kQXNzb2NpYXRpb25FdmVudChkZXYscFJvYW1JbmZvKTsKKworCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIExpbmt1cCBldmVudCBjb21wbGV0aW9uIHZhcmlhYmxlIAorICAgICAgICBJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPmxpbmt1cF9ldmVudF92YXIpOworCisgICAgICAgIC8qCisgICAgICAgICAgIFNvbWV0aW1lcyBTd2l0Y2hpbmcgT04gdGhlIENhcnJpZXIgaXMgdGFraW5nIHRpbWUgdG8gYWN0aXZhdGUgdGhlIGRldmljZSBwcm9wZXJseS4gQmVmb3JlIGFsbG93aW5nIGFueQorICAgICAgICAgICBwYWNrZXQgdG8gZ28gdXAgdG8gdGhlIGFwcGxpY2F0aW9uLCBkZXZpY2UgYWN0aXZhdGlvbiBoYXMgdG8gYmUgZW5zdXJlZCBmb3IgcHJvcGVyIHF1ZXVlIG1hcHBpbmcgYnkgdGhlCisgICAgICAgICAgIGtlcm5lbC4gd2UgaGF2ZSByZWdpc3RlcmVkIG5ldCBkZXZpY2Ugbm90aWZpZXIgZm9yIGRldmljZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLiBXaXRoIHRoaXMgd2Ugd2lsbCBjb21lIHRvIAorICAgICAgICAgICBrbm93IHRoYXQgdGhlIGRldmljZSBpcyBnZXR0aW5nIGFjdGl2YXRlZCBwcm9wZXJseS4KKyAgICAgICAgICAgKi8KKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9DQ1gpCisgICAgICAgIGlmIChwSGRkU3RhQ3R4LT5mdF9jYXJyaWVyX29uID09IEZBTFNFKQorICAgICAgICB7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIEVuYWJsZSBMaW5rdXAgRXZlbnQgU2VydmljaW5nIHdoaWNoIGFsbG93cyB0aGUgbmV0IGRldmljZSBub3RpZmllciB0byBzZXQgdGhlIGxpbmt1cCBldmVudCB2YXJpYWJsZSAgICAgICAKKyAgICAgICAgICAgIHBBZGFwdGVyLT5pc0xpbmtVcFN2Y05lZWRlZCA9IFRSVUU7CisKKyAgICAgICAgICAgIC8vIEVuYWJsZSBMaW5rdXAgRXZlbnQgU2VydmljaW5nIHdoaWNoIGFsbG93cyB0aGUgbmV0IGRldmljZSBub3RpZmllciB0byBzZXQgdGhlIGxpbmt1cCBldmVudCB2YXJpYWJsZSAgICAgICAKKyAgICAgICAgICAgIHBBZGFwdGVyLT5pc0xpbmtVcFN2Y05lZWRlZCA9IFRSVUU7CisKKyAgICAgICAgICAgIC8vIFN3aXRjaCBvbiB0aGUgQ2FycmllciB0byBhY3RpdmF0ZSB0aGUgZGV2aWNlCisgICAgICAgICAgICBuZXRpZl9jYXJyaWVyX29uKGRldik7CisKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBMaW5rIHRvIHVwIHRvIGVuc3VyZSBhbGwgdGhlIHF1ZXVlcyBhcmUgc2V0IHByb3Blcmx5IGJ5IHRoZSBrZXJuZWwKKyAgICAgICAgICAgIHN0YXR1cyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwQWRhcHRlci0+bGlua3VwX2V2ZW50X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoQVNTT0NfTElOS1VQX1RJTUVPVVQpKTsKKyAgICAgICAgICAgIGlmKCFzdGF0dXMpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIiVzOiBXYXJuaW5nOkFTU09DX0xJTktVUF9USU1FT1VUIiwgX19mdW5jX18pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEaXNhYmxlIExpbmt1cCBFdmVudCBTZXJ2aWNpbmcgLSBubyBtb3JlIHNlcnZpY2UgcmVxdWlyZWQgZnJvbSB0aGUgbmV0IGRldmljZSBub3RpZmllciBjYWxsCisgICAgICAgICAgICBwQWRhcHRlci0+aXNMaW5rVXBTdmNOZWVkZWQgPSBGQUxTRTsKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9DQ1gpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IAorICAgICAgICAgICAgcEhkZFN0YUN0eC0+ZnRfY2Fycmllcl9vbiA9IEZBTFNFOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgICAgIGZ0X2NhcnJpZXJfb24gPSBUUlVFOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHBIZGRDdHgtPnN0YV90b19hZGFwdGVyW3BSb2FtSW5mby0+c3RhSWRdID0gcEFkYXB0ZXI7CisKKyAgICAgICAgLy9Gb3IgcmVhc3NvYywgdGhlIHN0YXRpb24gaXMgYWxyZWFkeSByZWdpc3RlcmVkLCBhbGwgd2UgbmVlZCBpcyB0byBjaGFuZ2UgdGhlIHN0YXRlCisgICAgICAgIC8vb2YgdGhlIFNUQSBpbiBUTC4KKyAgICAgICAgLy9JZiBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCAoV1BBL1dQQTIvRFdFUCksIGNoYW5nZSBUTCB0byBDT05ORUNURUQgaW5zdGVhZCBvZiBBVVRIRU5USUNBVEVECisgICAgICAgIGlmKCAhcFJvYW1JbmZvLT5mUmVhc3NvY1JlcSApCisgICAgICAgIHsKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgICAgICAgICAgIHZfVThfdCByZXFSc25JZVtET1QxMUZfSUVfUlNOX01BWF9MRU5dOworICAgICAgICAgICAgdl9VOF90IHJzcFJzbkllW0RPVDExRl9JRV9SU05fTUFYX0xFTl07CisgICAgICAgICAgICB0QU5JX1UzMiByZXFSc25MZW5ndGggPSBET1QxMUZfSUVfUlNOX01BWF9MRU47CisgICAgICAgICAgICB0QU5JX1UzMiByc3BSc25MZW5ndGggPSBET1QxMUZfSUVfUlNOX01BWF9MRU47CisgICAgICAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CisKKyAgICAgICAgICAgIC8qIGFkZCBic3NfaWQgdG8gY2ZnODAyMTEgZGF0YSBiYXNlICovCisgICAgICAgICAgICBic3MgPSB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYnNzX2RiKHBBZGFwdGVyLCBwUm9hbUluZm8pOworICAgICAgICAgICAgaWYgKE5VTEwgPT0gYnNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByX2Vycigid2xhbjogTm90IGFibGUgdG8gY3JlYXRlIEJTUyBlbnRyeVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHdwYSBzdXBwbGljYW50IGV4cGVjdGluZyBXUEEvUlNOIElFIGluIGNvbm5lY3QgcmVzdWx0ICovCisgICAgICAgICAgICBjc3JSb2FtR2V0V3BhUnNuUmVxSUUoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAmcmVxUnNuTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICByZXFSc25JZSk7CisKKyAgICAgICAgICAgIGNzclJvYW1HZXRXcGFSc25Sc3BJRShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICZyc3BSc25MZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIHJzcFJzbkllKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgICBpZihmdF9jYXJyaWVyX29uKQorICAgICAgICAgICAgICAgICAgICBoZGRfU2VuZFJlQXNzb2NFdmVudChkZXYsIHBBZGFwdGVyLCBwUm9hbUluZm8sIHJlcVJzbkllLCByZXFSc25MZW5ndGgpOworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KKworICAgICAgICAgICAgeworICAgICAgICAgICAgLyogaW5mb3JtIGNvbm5lY3QgcmVzdWx0IHRvIG5sODAyMTEgKi8KKyAgICAgICAgICAgIGNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KGRldiwgcFJvYW1JbmZvLT5ic3NpZCwgCisgICAgICAgICAgICAgICAgICAgIHJlcVJzbkllLCByZXFSc25MZW5ndGgsIAorICAgICAgICAgICAgICAgICAgICByc3BSc25JZSwgcnNwUnNuTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBXTEFOX1NUQVRVU19TVUNDRVNTLCAKKyAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7IAorCisgICAgICAgICAgICBjZmc4MDIxMV9wdXRfYnNzKGJzcyk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIFN0YXRpb24gd2l0aCBUTCBhZnRlciBhc3NvY2lhdGVkLi4uCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBoZGRfcm9hbVJlZ2lzdGVyU1RBKCBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbIDAgXSwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5wQnNzRGVzYyApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9SZWFzc29jIHN1Y2Nlc3NmdWxseQorICAgICAgICAgICAgaWYoIHBSb2FtSW5mby0+ZkF1dGhSZXF1aXJlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0NoYW5nZVNUQVN0YXRlKCBwSGRkQ3R4LT5wdm9zQ29udGV4dCwgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWyAwIF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX1NUQV9DT05ORUNURUQgKTsKKyAgICAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8udUlzQXV0aGVudGljYXRlZCA9IFZPU19GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfQ2hhbmdlU1RBU3RhdGUoIHBIZGRDdHgtPnB2b3NDb250ZXh0LCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbIDAgXSwgCisgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgKTsKKyAgICAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8udUlzQXV0aGVudGljYXRlZCA9IFZPU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcGVyZm9ybSBhbnkgV01NLXJlbGF0ZWQgYXNzb2NpYXRpb24gcHJvY2Vzc2luZworICAgICAgICAgICAgaGRkX3dtbV9hc3NvYyhwQWRhcHRlciwgcFJvYW1JbmZvLCBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlZ2lzdGVyIFNUQSB3aXRoIFRMLiAgRmFpbGVkIHdpdGggdm9zU3RhdHVzID0gJWQgWyUwOGxYXSIsCisgICAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cywgdm9zU3RhdHVzICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCB0aGUgUXVldWUKKyAgICAgICAgbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKGRldik7CisgICAgfSAgCisgICAgZWxzZSAKKyAgICB7CisgICAgICAgIGNoYXIgY291bnRyeV9jb2RlWzNdID0gU01FX0lOVkFMSURfQ09VTlRSWV9DT0RFOworICAgICAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIGhkZF9jb250ZXh0X3QqIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCopcEFkYXB0ZXItPnBIZGRDdHg7CisKKyAgICAgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICAgICAgIHByX2luZm8oIndsYW46IGNvbm5lY3Rpb24gZmFpbGVkXG4iKTsKKworICAgICAgICAvKkhhbmRsZSBhbGwgZmFpbHVyZSBjb25kaXRpb25zKi8KKyAgICAgICAgaGRkX2Nvbm5TZXRDb25uZWN0aW9uU3RhdGUoIHBIZGRTdGFDdHgsIGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkKTsKKyAgICAgICAgaWYoKHBIZGRDdHgtPmNvbmN1cnJlbmN5X21vZGUgPD0gMSkgJiYgKHBIZGRDdHgtPm5vX29mX3Nlc3Npb25zW1dMQU5fSEREX0lORlJBX1NUQVRJT05dIDw9MSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBIZGRDdHgtPmlzQW1wQWxsb3dlZCA9IFZPU19UUlVFOworICAgICAgICB9CisKKyAgICAgICAgLy9JZiB0aGUgRGV2aWNlIE1vZGUgaXMgU3RhdGlvbgorICAgICAgICAvLyBhbmQgdGhlIFAyUCBDbGllbnQgaXMgQ29ubmVjdGVkCisgICAgICAgIC8vRW5hYmxlIEJNUFMKKyAgICAgICAgaWYoKFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSAmJgorICAgICAgICAgICAgKHZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgLy9FbmFibGUgQk1QUyBvbmx5IG9mIG90aGVyIFNlc3Npb24gaXMgUDJQIENsaWVudAorICAgICAgICAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKyAgICAgICAgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0hERCwgTlVMTCApOworCisgICAgICAgICAgIGlmIChOVUxMICE9IHBWb3NDb250ZXh0KQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwSGRkQ3R4ID0gdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0hERCwgcFZvc0NvbnRleHQpOworCisgICAgICAgICAgICAgICBpZihOVUxMICE9IHBIZGRDdHgpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgLy9Pbmx5IFAyUCBDbGllbnQgaXMgdGhlcmUgRW5hYmxlIEJtcHMgYmFjaworICAgICAgICAgICAgICAgICAgIGlmKCgwID09IHBIZGRDdHgtPm5vX29mX3Nlc3Npb25zW1ZPU19TVEFfU0FQX01PREVdKSAmJgorICAgICAgICAgICAgICAgICAgICAgICgwID09IHBIZGRDdHgtPm5vX29mX3Nlc3Npb25zW1ZPU19QMlBfR09fTU9ERV0pICYmCisgICAgICAgICAgICAgICAgICAgICAgKDEgPT0gcEhkZEN0eC0+bm9fb2Zfc2Vzc2lvbnNbVk9TX1AyUF9DTElFTlRfTU9ERV0pKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgaGRkX2VuYWJsZV9ibXBzX2ltcHMocEhkZEN0eCk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgICAgICAvKiBpbmZvcm0gYXNzb2NpYXRpb24gZmFpbHVyZSBldmVudCB0byBubDgwMjExICovCisgICAgICAgIGNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KGRldiwgcFdleHRTdGF0ZS0+cmVxX2Jzc0lkLAorICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSwgCisgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisjZW5kaWYgCisKKyAgICAgICAgbmV0aWZfdHhfZGlzYWJsZShkZXYpOworICAgICAgICBuZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisgICAgICAgIC8qIEFzc29jaWF0aW9uIGZhaWxlZDsgUmVzZXQgdGhlIGNvdW50cnkgY29kZSBpbmZvcm1hdGlvbgorICAgICAgICAgKiBzbyB0aGF0IGl0IHJlLWluaXRpYWxpemUgdGhlIHZhbGlkIGNoYW5uZWwgbGlzdCovCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiJXM6IEFzc29jaWF0aW9uIGZhaWxlZCBhbmQgcmVzZXR0aW5nIHRoZSBjb3VudHJ5IGNvZGUiCisgICAgICAgICAgICAgICAgInRvIGRlZmF1bHQgXG4iLF9fZnVuY19fKTsKKworICAgICAgICBzdGF0dXMgPSAoaW50KXNtZV9DaGFuZ2VDb3VudHJ5Q29kZShwSGRkQ3R4LT5oSGFsLCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50cnlfY29kZVswXSwgcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPnB2b3NDb250ZXh0KTsKKyAgICAgICAgaWYoIDAgIT0gc3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBTTUUgQ2hhbmdlIENvdW50cnkgY29kZSB0byBkZWZhdWx0IGZhaWxlZCBcbiIsX19mdW5jX18pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgIEBicmllZiByb2FtUm9hbUlic3NJbmRpY2F0aW9uSGFuZGxlcigpIC0gSGVyZSB3ZSB1cGRhdGUgdGhlIHN0YXR1cyBvZiB0aGUgCisgIElic3Mgd2hlbiB3ZSByZWNlaXZlIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSBzdGFydGVkL2pvaW5lZCBhbiBpYnNzIHNlc3Npb24KKyAgV2UgYWx3YXlzIHJldHVybiBTVUNDRVNTLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBlSGFsU3RhdHVzIHJvYW1Sb2FtSWJzc0luZGljYXRpb25IYW5kbGVyKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdENzclJvYW1JbmZvICpwUm9hbUluZm8sIAorICAgdEFOSV9VMzIgcm9hbUlkLCBlUm9hbUNtZFN0YXR1cyByb2FtU3RhdHVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCApCit7CisgICBzd2l0Y2goIHJvYW1SZXN1bHQgKQorICAgeworICAgICAgLy8gYm90aCBJQlNTIFN0YXJ0ZWQgYW5kIElCU1MgSm9pbiBzaG91bGQgY29tZSBpbiBoZXJlLgorICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfU1RBUlRFRDoKKyAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX0pPSU5fU1VDQ0VTUzoKKyAgICAgIHsKKyAgICAgICAgIC8vIHdlIHNob3VsZCBoYXZlIGEgcFJvYW1JbmZvIG9uIHRoaXMgY2FsbGJhY2suLi4KKyAgICAgICAgIFZPU19BU1NFUlQoIHBSb2FtSW5mbyApOworICAgICAgICAKKyAgICAgICAgIC8vIFdoZW4gSUJTUyBTdGFydGVkIGNvbWVzIGZyb20gQ1NSLCB3ZSBuZWVkIHRvIG1vdmUgY29ubmVjdGlvbiBzdGF0ZSB0byAKKyAgICAgICAgIC8vIElCU1MgRGlzY29ubmVjdGVkIChtZWFuaW5nIG5vIHBlZXJzIGFyZSBpbiB0aGUgSUJTUykuCisgICAgICAgICBoZGRfY29ublNldENvbm5lY3Rpb25TdGF0ZSggV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlciksIGVDb25uZWN0aW9uU3RhdGVfSWJzc0Rpc2Nvbm5lY3RlZCApOworCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfU1RBUlRfRkFJTEVEOgorICAgICAgeworICAgICAgICAgVk9TX0FTU0VSVCggcFJvYW1JbmZvICk7CisgICAgICAgICAKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBkZWZhdWx0OgorICAgICAgICAgYnJlYWs7CisgICB9ICAgCisgICAKKyAgICByZXR1cm4oIGVIQUxfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAgQGJyaWVmIHJvYW1TYXZlSWJzc1N0YXRpb24oKSAtIFNhdmUgdGhlIElCU1MgcGVlciBNQUMgYWRkcmVzcyBpbiB0aGUgYWRhcHRlci4KKyAgVGhpcyBpbmZvcm1hdGlvbiBpcyBwYXNzZWQgdG8gaXdjb25maWcgbGF0ZXIuIFRoZSBwZWVyIHRoYXQgam9pbmVkCisgIGxhc3QgaXMgcGFzc2VkIGFzIGluZm9ybWF0aW9uIHRvIGl3Y29uZmlnLgorICBJZiB3ZSBhZGQgSEREX01BWF9OVU1fSUJTU19TVEEgb3IgbGVzcyBTVEEgd2UgcmV0dXJuIHN1Y2Nlc3MgZWxzZSB3ZSAKKyAgcmV0dXJuIEZBTFNFLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgcm9hbVNhdmVJYnNzU3RhdGlvbiggaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHgsIHZfVThfdCBzdGFJZCwgdl9NQUNBRERSX3QgKnBlZXJNYWNBZGRyZXNzICkKK3sKKyAgIGludCBmU3VjY2VzcyA9IEZBTFNFOworICAgaW50IGlkeCA9IDA7CisgICAKKyAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IEhERF9NQVhfTlVNX0lCU1NfU1RBOyBpZHgrKyApCisgICB7CisgICAgICBpZiAoIDAgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWyBpZHggXSApCisgICAgICB7CisgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbIGlkeCBdID0gc3RhSWQ7CisgICAgICAKKyAgICAgICAgIHZvc19jb3B5X21hY2FkZHIoICZwSGRkU3RhQ3R4LT5jb25uX2luZm8ucGVlck1hY0FkZHJlc3NbIGlkeCBdLCBwZWVyTWFjQWRkcmVzcyApOworICAgICAgICAgCisgICAgICAgICBmU3VjY2VzcyA9IFRSVUU7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKyAgIAorICAgcmV0dXJuKCBmU3VjY2VzcyApOyAgIAorfQorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAgQGJyaWVmIHJvYW1SZW1vdmVJYnNzU3RhdGlvbigpIC0gUmVtb3ZlIHRoZSBJQlNTIHBlZXIgTUFDIGFkZHJlc3MgaW4gdGhlIGFkYXB0ZXIuCisgIElmIHdlIHJlbW92ZSBIRERfTUFYX05VTV9JQlNTX1NUQSBvciBsZXNzIFNUQSB3ZSByZXR1cm4gc3VjY2VzcyBlbHNlIHdlIAorICByZXR1cm4gRkFMU0UuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCByb2FtUmVtb3ZlSWJzc1N0YXRpb24oIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4LCB2X1U4X3Qgc3RhSWQgKQoreworICAgaW50IGZTdWNjZXNzID0gRkFMU0U7CisgICBpbnQgaWR4ID0gMDsKKyAgIHZfVThfdCAgdmFsaWRfaWR4ICAgPSAwOworICAgdl9VOF90ICBkZWxfaWR4ICAgPSAwOworICAgCisgICBmb3IgKCBpZHggPSAwOyBpZHggPCBIRERfTUFYX05VTV9JQlNTX1NUQTsgaWR4KysgKQorICAgeworICAgICAgaWYgKCBzdGFJZCA9PSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbIGlkeCBdICkKKyAgICAgIHsKKyAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFsgaWR4IF0gPSAwOworCisgICAgICAgICB2b3NfemVyb19tYWNhZGRyKCAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnBlZXJNYWNBZGRyZXNzWyBpZHggXSApOworCisgICAgICAgICBmU3VjY2VzcyA9IFRSVUU7CisgICAgICAgICAvLyBOb3RlIHRoZSBkZWxldGVkIEluZGV4LCBpZiBpdHMgMCB3ZSBuZWVkIHNwZWNpYWwgaGFuZGxpbmcKKyAgICAgICAgIGRlbF9pZHggPSBpZHg7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpZiAocEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkW2lkeF0gIT0gMCkgCisgICAgICAgICB7CisgICAgICAgICAgICB2YWxpZF9pZHggPSBpZHg7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8vIEZpbmQgbmV4dCBhY3RpdmUgc3RhSWQsIHRvIGhhdmUgYSB2YWxpZCBzdGEgdHJpZ2dlciBmb3IgVEwuCisgICBpZiAoZlN1Y2Nlc3MgPT0gVFJVRSkKKyAgIHsKKyAgICAgIGlmIChkZWxfaWR4ID09IDApCisgICAgICB7CisgICAgICAgICBpZiAocEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkW3ZhbGlkX2lkeF0gIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFswXSA9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFt2YWxpZF9pZHhdOworICAgICAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggJnBIZGRTdGFDdHgtPmNvbm5faW5mby5wZWVyTWFjQWRkcmVzc1sgMCBdLAorICAgICAgICAgICAgICAgJnBIZGRTdGFDdHgtPmNvbm5faW5mby5wZWVyTWFjQWRkcmVzc1sgdmFsaWRfaWR4IF0pOworCisgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbdmFsaWRfaWR4XSA9IDA7CisgICAgICAgICAgICB2b3NfemVyb19tYWNhZGRyKCAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnBlZXJNYWNBZGRyZXNzWyB2YWxpZF9pZHggXSApOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgcmV0dXJuKCBmU3VjY2VzcyApOworfQorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICBAYnJpZWYgcm9hbUlic3NDb25uZWN0SGFuZGxlcigpIDogV2UgdXBkYXRlIHRoZSBzdGF0dXMgb2YgdGhlIElCU1MgdG8gCisgIGNvbm5lY3RlZCBpbiB0aGlzIGZ1bmN0aW9uLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBlSGFsU3RhdHVzIHJvYW1JYnNzQ29ubmVjdEhhbmRsZXIoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbyApCit7CisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIklCU1MgQ29ubmVjdCBJbmRpY2F0aW9uIGZyb20gU01FISEhIiApOworICAgLy8gU2V0IHRoZSBpbnRlcm5hbCBjb25uZWN0aW9uIHN0YXRlIHRvIHNob3cgJ0lCU1MgQ29ubmVjdGVkJyAoSUJTUyB3aXRoIGEgcGFydG5lciBzdGF0aW9ucykuLi4KKyAgIGhkZF9jb25uU2V0Q29ubmVjdGlvblN0YXRlKCBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSwgZUNvbm5lY3Rpb25TdGF0ZV9JYnNzQ29ubmVjdGVkICk7CisKKyAgIC8vIFNhdmUgdGhlIGNvbm5lY3Rpb24gaW5mbyBmcm9tIENTUi4uLgorICAgaGRkX2Nvbm5TYXZlQ29ubmVjdEluZm8oIHBBZGFwdGVyLCBwUm9hbUluZm8sIGVDU1JfQlNTX1RZUEVfSUJTUyApOworCisgICAvLyBTZW5kIHRoZSBic3NpZCBhZGRyZXNzIHRvIHRoZSB3ZXh0LgorICAgaGRkX1NlbmRBc3NvY2lhdGlvbkV2ZW50KHBBZGFwdGVyLT5kZXYsIHBSb2FtSW5mbyk7CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAvKiBhZGQgYnNzX2lkIHRvIGNmZzgwMjExIGRhdGEgYmFzZSAqLworICAgd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Jzc19kYihwQWRhcHRlciwgcFJvYW1JbmZvKTsKKyAgIC8qIHNlbmQgaWJzcyBqb2luIGluZGljYXRpb24gdG8gbmw4MDIxMSAqLworICAgY2ZnODAyMTFfaWJzc19qb2luZWQocEFkYXB0ZXItPmRldiwgJnBSb2FtSW5mby0+YnNzaWRbMF0sIEdGUF9LRVJORUwpOworI2VuZGlmCisKKyAgIHJldHVybiggZUhBTF9TVEFUVVNfU1VDQ0VTUyApOworfQorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAgQGJyaWVmIGhkZF9Sb2FtU2V0S2V5Q29tcGxldGVIYW5kbGVyKCkgLSBVcGRhdGUgdGhlIHNlY3VyaXR5IHBhcmFtZXRlcnMuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGVIYWxTdGF0dXMgaGRkX1JvYW1TZXRLZXlDb21wbGV0ZUhhbmRsZXIoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgcm9hbUlkLCBlUm9hbUNtZFN0YXR1cyByb2FtU3RhdHVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQgKQoreworICAgZUNzckVuY3J5cHRpb25UeXBlIGNvbm5lY3RlZENpcGhlckFsZ287CisgICB2X0JPT0xfdCBmQ29ubmVjdGVkICAgPSBGQUxTRTsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzICAgID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworICAgRU5URVIoKTsKKyAgIC8vIGlmICggV1BBICksIHRlbGwgVEwgdG8gZ28gdG8gJ2F1dGhlbnRpY2F0ZWQnIGFmdGVyIHRoZSBrZXlzIGFyZSBzZXQuCisgICAvLyB0aGVuIGdvIHRvICdhdXRoZW50aWNhdGVkJy4gIEZvciBhbGwgb3RoZXIgYXV0aGVudGljYXRpb24gdHlwZXMgKHRob3NlIHRoYXQgZG8gCisgICAvLyBub3QgcmVxdWlyZSB1cHBlciBsYXllciBhdXRoZW50aWNhdGlvbikgd2UgY2FuIHB1dCBUTCBkaXJlY3RseSBpbnRvICdhdXRoZW50aWNhdGVkJworICAgLy8gc3RhdGUuCisgICBmQ29ubmVjdGVkID0gaGRkX2Nvbm5HZXRDb25uZWN0ZWRDaXBoZXJBbGdvKCBwSGRkU3RhQ3R4LCAmY29ubmVjdGVkQ2lwaGVyQWxnbyApOworICAgaWYoIGZDb25uZWN0ZWQgKQorICAgeworICAgICAgLy8gVE9ETzogQ29uc2lkZXJpbmcgZ2V0dGluZyBhIHN0YXRlIG1hY2hpbmUgaW4gSEREIGxhdGVyLgorICAgICAgLy8gVGhpcyByb3V0dWluZSBpcyBpbnZva2VkIHR3aWNlLiAxKXNldCBQVEsgMilzZXQgR1RLLiBUaGUgZm9sbG9pbmcgaWYgc3RhdGVtZW50IHdpbGwgYmUKKyAgICAgIC8vIFRSVUUgd2hlbiBzZXR0aW5nIEdUSy4gQXQgdGhpcyB0aW1lIHdlIGRvbid0IGhhbmRsZSB0aGUgc3RhdGUgaW4gZGV0YWlsLgorICAgICAgLy8gUmVsYXRlZCBDUjogMTc0MDQ4IC0gVEwgbm90IGluIGF1dGhlbnRpY2F0ZWQgc3RhdGUKKyAgICAgIGlmKCggZUNTUl9ST0FNX1JFU1VMVF9BVVRIRU5USUNBVEVEID09IHJvYW1SZXN1bHQgKSAmJiAocFJvYW1JbmZvICE9IE5VTEwpICYmICFwUm9hbUluZm8tPmZBdXRoUmVxdWlyZWQpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgICAgICAgICAgICAgICJLZXkgc2V0IGZvciBTdGFJZD0gJWQuICBDaGFuZ2luZyBUTCBzdGF0ZSB0byBBVVRIRU5USUNBVEVEIiwgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWyAwIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAvLyBDb25uZWN0aW9ucyB0aGF0IGRvIG5vdCBuZWVkIFVwcGVyIGxheWVyIGF1dGhlbnRpY2F0aW9uLCB0cmFuc2l0aW9uIFRMIAorICAgICAgICAgLy8gdG8gJ0F1dGhlbnRpY2F0ZWQnIHN0YXRlIGFmdGVyIHRoZSBrZXlzIGFyZSBzZXQuCisgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfQ2hhbmdlU1RBU3RhdGUoIHBIZGRDdHgtPnB2b3NDb250ZXh0LCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbIDAgXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCApOworIAorICAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnVJc0F1dGhlbnRpY2F0ZWQgPSBWT1NfVFJVRTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1pbmdTdGF0ZSA9IEhERF9ST0FNX1NUQVRFX05PTkU7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAvLyBwb3NzaWJsZSBkaXNhc3NvYyBhZnRlciBpc3N1aW5nIHNldCBrZXkgYW5kIHdhaXRpbmcgc2V0IGtleSBjb21wbGV0ZQorICAgICAgcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1pbmdTdGF0ZSA9IEhERF9ST0FNX1NUQVRFX05PTkU7CisgICB9CisgICAKKyAgIEVYSVQoKTsKKyAgIHJldHVybiggZUhBTF9TVEFUVVNfU1VDQ0VTUyApOworfQorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAgQGJyaWVmIGhkZF9Sb2FtTWljRXJyb3JJbmRpY2F0aW9uSGFuZGxlcigpIC0gVGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgdGhlIE1pYyBmYWlsdXJlIHRvIHRoZSBzdXBwbGljYW50LgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGVIYWxTdGF0dXMgaGRkX1JvYW1NaWNFcnJvckluZGljYXRpb25IYW5kbGVyKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdENzclJvYW1JbmZvICpwUm9hbUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHJvYW1JZCwgZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0ICkKK3sgICAKKyAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKyAgIGlmKCBlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSAmJgorICAgICAgVEtJUF9DT1VOVEVSX01FQVNVUkVfU1RPUEVEID09IHBIZGRTdGFDdHgtPldleHRTdGF0ZS5tVEtJUENvdW50ZXJNZWFzdXJlcyApCisgICB7CisgICAgICBzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgbXNnOworICAgICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOworICAgICAgbWVtc2V0KCZtc2csICdcMCcsIHNpemVvZihtc2cpKTsKKyAgICAgIG1zZy5zcmNfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICBtZW1jcHkobXNnLnNyY19hZGRyLnNhX2RhdGEsIHBSb2FtSW5mby0+dS5wTUlDRmFpbHVyZUluZm8tPnRhTWFjQWRkciwgc2l6ZW9mKHBSb2FtSW5mby0+dS5wTUlDRmFpbHVyZUluZm8tPnRhTWFjQWRkcikpOworICAgICAgaGRkTG9nKExPRzEsICJNSUMgTUFDICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zcmNfYWRkci5zYV9kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnNyY19hZGRyLnNhX2RhdGFbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc3JjX2FkZHIuc2FfZGF0YVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zcmNfYWRkci5zYV9kYXRhWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnNyY19hZGRyLnNhX2RhdGFbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc3JjX2FkZHIuc2FfZGF0YVs1XSk7CisgIAorICAgICAgaWYocFJvYW1JbmZvLT51LnBNSUNGYWlsdXJlSW5mby0+bXVsdGljYXN0ID09IGVTSVJfVFJVRSkKKyAgICAgICAgIG1zZy5mbGFncyA9IElXX01JQ0ZBSUxVUkVfR1JPVVA7CisgICAgICBlbHNlIAorICAgICAgICAgbXNnLmZsYWdzID0gSVdfTUlDRkFJTFVSRV9QQUlSV0lTRTsKKyAgICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKyAgICAgIHdyZXEuZGF0YS5sZW5ndGggPSBzaXplb2YobXNnKTsKKyAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFLCAmd3JlcSwgKGNoYXIgKikmbXNnKTsKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgICAgIC8qIGluZm9ybSBtaWMgZmFpbHVyZSB0byBubDgwMjExICovCisgICAgICBjZmc4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHBBZGFwdGVyLT5kZXYsIAorICAgICAgICAgICAgICBwUm9hbUluZm8tPnUucE1JQ0ZhaWx1cmVJbmZvLT50YU1hY0FkZHIsCisgICAgICAgICAgICAgICgocFJvYW1JbmZvLT51LnBNSUNGYWlsdXJlSW5mby0+bXVsdGljYXN0ID09IGVTSVJfVFJVRSkgPworICAgICAgICAgICAgICAgTkw4MDIxMV9LRVlUWVBFX0dST1VQIDoKKyAgICAgICAgICAgICAgIE5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRSksCisgICAgICAgICAgICAgIHBSb2FtSW5mby0+dS5wTUlDRmFpbHVyZUluZm8tPmtleUlkLCAKKyAgICAgICAgICAgICAgcFJvYW1JbmZvLT51LnBNSUNGYWlsdXJlSW5mby0+VFNDLCAKKyAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisjZW5kaWYKKyAgICAgIAorICAgfQorICAgCisgICByZXR1cm4oIGVIQUxfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAgQGJyaWVmIHJvYW1Sb2FtQ29ubmVjdFN0YXR1c1VwZGF0ZUhhbmRsZXIoKSAtIFRoZSBJYnNzIGNvbm5lY3Rpb24gc3RhdHVzIGlzIAorICB1cGRhdGVkIHJlZ3VsYXJseSBoZXJlIGluIHRoaXMgZnVuY3Rpb24uCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGVIYWxTdGF0dXMgcm9hbVJvYW1Db25uZWN0U3RhdHVzVXBkYXRlSGFuZGxlciggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLCAKKyAgIHRBTklfVTMyIHJvYW1JZCwgZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQgKQoreworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisKKyAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKyAgIHN3aXRjaCggcm9hbVJlc3VsdCApCisgICB7CisgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19ORVdfUEVFUjoKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAiSUJTUyBOZXcgUGVlciBpbmRpY2F0aW9uIGZyb20gU01FICIKKyAgICAgICAgICAgICAgICAgICAgIndpdGggcGVlck1hYyAlMngtJTJ4LSUyeC0lMngtJTJ4LSUyeCAgYW5kICBzdGF0aW9uSUQ9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5wZWVyTWFjWzBdLCBwUm9hbUluZm8tPnBlZXJNYWNbMV0sIHBSb2FtSW5mby0+cGVlck1hY1syXSwKKyAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5wZWVyTWFjWzNdLCBwUm9hbUluZm8tPnBlZXJNYWNbNF0sIHBSb2FtSW5mby0+cGVlck1hY1s1XSwgCisgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+c3RhSWQgKTsKKyAgICAgICAgIAorICAgICAgICAgaWYgKCAhcm9hbVNhdmVJYnNzU3RhdGlvbiggV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlciksIHBSb2FtSW5mby0+c3RhSWQsICh2X01BQ0FERFJfdCAqKXBSb2FtSW5mby0+cGVlck1hYyApICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgICAgICAiTmV3IElCU1MgcGVlciBidXQgd2UgYWxyZWFkeSBoYXZlIHRoZSBtYXggd2UgY2FuIGhhbmRsZS4gIENhbid0IHJlZ2lzdGVyIHRoaXMgb25lIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIHBIZGRDdHgtPnN0YV90b19hZGFwdGVyW3BSb2FtSW5mby0+c3RhSWRdID0gcEFkYXB0ZXI7CisKKyAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBTdGF0aW9uIHdpdGggVEwgZm9yIHRoZSBuZXcgcGVlci4gCisgICAgICAgICB2b3NTdGF0dXMgPSBoZGRfcm9hbVJlZ2lzdGVyU1RBKCBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+c3RhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9NQUNBRERSX3QgKilwUm9hbUluZm8tPnBlZXJNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8tPnBCc3NEZXNjICk7CisgICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJDYW5ub3QgcmVnaXN0ZXIgU1RBIHdpdGggVEwgZm9yIElCU1MuICBGYWlsZWQgd2l0aCB2b3NTdGF0dXMgPSAlZCBbJTA4bFhdIiwKKyAgICAgICAgICAgICAgIHZvc1N0YXR1cywgdm9zU3RhdHVzICk7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgIG5ldGlmX2NhcnJpZXJfb24ocEFkYXB0ZXItPmRldik7CisgICAgICAgICBuZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHBBZGFwdGVyLT5kZXYpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAgICAKKyAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX0NPTk5FQ1Q6CisgICAgICB7CisgICAgICAKKyAgICAgICAgIHJvYW1JYnNzQ29ubmVjdEhhbmRsZXIoIHBBZGFwdGVyLCBwUm9hbUluZm8gKTsKKyAgICAgICAgIAorICAgICAgICAgYnJlYWs7CisgICAgICB9ICAgCisgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19QRUVSX0RFUEFSVEVEOgorICAgICAgeworCisgICAgICAgICBpZiAoICFyb2FtUmVtb3ZlSWJzc1N0YXRpb24oIFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpLCBwUm9hbUluZm8tPnN0YUlkICkgKQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAgICJJQlNTIHBlZXIgZGVwYXJ0ZWQgYnkgY2Fubm90IGZpbmQgcGVlciBpbiBvdXIgcmVnaXN0cmF0aW9uIHRhYmxlIHdpdGggVEwiICk7CisgICAgICAgICB9CisKKyAgICAgICAgIGhkZF9yb2FtRGVyZWdpc3RlclNUQSggcEFkYXB0ZXIsIHBSb2FtSW5mby0+c3RhSWQgKTsKKworICAgICAgICAgcEhkZEN0eC0+c3RhX3RvX2FkYXB0ZXJbcFJvYW1JbmZvLT5zdGFJZF0gPSBOVUxMOworCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX0lOQUNUSVZFOgorICAgICAgeworICAgICAgICAgLy8gU3RvcCBvbmx5IHdoZW4gd2UgYXJlIGluYWN0aXZlCisgICAgICAgICBuZXRpZl90eF9kaXNhYmxlKHBBZGFwdGVyLT5kZXYpOworICAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYocEFkYXB0ZXItPmRldik7CisgICAgICAgICBoZGRfY29ublNldENvbm5lY3Rpb25TdGF0ZSggV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlciksIGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkICk7CisgICAgICAgICAKKyAgICAgICAgIC8vIFNlbmQgdGhlIGJzc2lkIGFkZHJlc3MgdG8gdGhlIHdleHQuCisgICAgICAgICBoZGRfU2VuZEFzc29jaWF0aW9uRXZlbnQocEFkYXB0ZXItPmRldiwgcFJvYW1JbmZvKTsKKyAgICAgICAgIC8vIGNsZWFuIHVwIGRhdGEgcGF0aAorICAgICAgICAgaGRkX2Rpc2Nvbm5lY3RfdHhfcngocEFkYXB0ZXIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICAgYnJlYWs7CisgICAKKyAgIH0KKyAgIAorICAgcmV0dXJuKCBlSEFMX1NUQVRVU19TVUNDRVNTICk7Cit9CisKK2VIYWxTdGF0dXMgaGRkX3NtZVJvYW1DYWxsYmFjayggdm9pZCAqcENvbnRleHQsIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLCB0QU5JX1UzMiByb2FtSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUm9hbUNtZFN0YXR1cyByb2FtU3RhdHVzLCBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0ICkKK3sKKyAgICBlSGFsU3RhdHVzIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCAqKXBDb250ZXh0OworICAgIGhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICJDU1IgQ2FsbGJhY2s6IHN0YXR1cz0gJWQgcmVzdWx0PSAlZCByb2FtSUQ9JWxkIiwgCisgICAgICAgICAgICAgICAgICAgIHJvYW1TdGF0dXMsIHJvYW1SZXN1bHQsIHJvYW1JZCApOyAKKyAgICBzd2l0Y2goIHJvYW1TdGF0dXMgKQorICAgIHsKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fU0VTU0lPTl9PUEVORUQ6CisgICAgICAgICAgICBpZihwQWRhcHRlciAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldF9iaXQoU01FX1NFU1NJT05fT1BFTkVELCAmcEFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZSgmcEFkYXB0ZXItPnNlc3Npb25fb3Blbl9jb21wX3Zhcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICAgICAgICAgIC8qIFdlIGRpZCBwcmUtYXV0aCx0aGVuIHdlIGF0dGVtcHRlZCBhIDExciBvciBjY3ggcmVhc3NvYy4KKyAgICAgICAgICAgICAqIHJlYXNzb2MgZmFpbGVkIGR1ZSB0byBmYWlsdXJlLCB0aW1lb3V0LCByZWplY3QgZnJvbSBhcAorICAgICAgICAgICAgICogaW4gYW55IGNhc2UgdGVsbCB0aGUgT1MsIG91ciBjYXJyaWVyIGlzIG9mZiBhbmQgbWFyayAKKyAgICAgICAgICAgICAqIGludGVyZmFjZSBkb3duICovCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX0ZUX1JFQVNTT0NfRkFJTEVEOgorICAgICAgICAgICAgaGRkTG9nKExPRzEsIEZMKCJSZWFzc29jIEZhaWxlZFxuIikpOworICAgICAgICAgICAgaGFsU3RhdHVzID0gaGRkX0Rpc0Nvbm5lY3RIYW5kbGVyKCBwQWRhcHRlciwgcFJvYW1JbmZvLCByb2FtSWQsIHJvYW1TdGF0dXMsIHJvYW1SZXN1bHQgKTsKKyAgICAgICAgICAgIC8qIENoZWNrIGlmIE1jYXN0L0JjYXN0IEZpbHRlcnMgYXJlIHNldCwgaWYgeWVzIGNsZWFyIHRoZSBmaWx0ZXJzIGhlcmUgKi8KKyAgICAgICAgICAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5oZGRfbWNhc3RiY2FzdF9maWx0ZXJfc2V0ID09IFRSVUUpIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaWZkZWYgTVNNX1BMQVRGT1JNCisgICAgICAgICAgICAgICAgICAgIGhkZF9jb25mX21jYXN0YmNhc3RfZmlsdGVyKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSksIEZBTFNFKTsKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmhkZF9tY2FzdGJjYXN0X2ZpbHRlcl9zZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBIZGRTdGFDdHgtPmZ0X2NhcnJpZXJfb24gPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX0ZUX1NUQVJUOgorICAgICAgICAgICAgLy8gV2hlbiB3ZSByb2FtIGZvciBDQ1ggYW5kIDExciwgd2UgZG9udCB3YW50IHRoZSAKKyAgICAgICAgICAgIC8vIE9TIHRvIGJlIGluZm9ybWVkIHRoYXQgdGhlIGxpbmsgaXMgZG93bi4gU28gbWFyaworICAgICAgICAgICAgLy8gdGhlIGxpbmsgcmVhZHkgZm9yIGZ0X3N0YXJ0LiBBZnRlciB0aGlzIHRoZSAKKyAgICAgICAgICAgIC8vIGVDU1JfUk9BTV9TSE9VTERfUk9BTSB3aWxsIGJlIHJlY2VpdmVkLgorICAgICAgICAgICAgLy8gV2hlcmUgaW4gd2Ugd2lsbCBub3QgbWFyayB0aGUgbGluayBkb3duCisgICAgICAgICAgICAvLyBBbHNvIHdlIHdhbnQgdG8gc3RvcCB0eCBhdCB0aGlzIHBvaW50IHdoZW4gd2Ugd2lsbCBiZQorICAgICAgICAgICAgLy8gZG9pbmcgZGlzYXNzb2MgYXQgdGhpcyB0aW1lLiBUaGlzIHNhdmVzIDMwLTYwIG1zZWMKKyAgICAgICAgICAgIC8vIGFmdGVyIHJlYXNzb2MuIFdlIHNlZSBvbGQgdHJhZmZpYyBmcm9tIG9sZCBjb25uZWN0aW9uIG9uIG5ldyBjaGFubmVsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBBZGFwdGVyLT5kZXY7CisgICAgICAgICAgICAgICAgbmV0aWZfdHhfZGlzYWJsZShkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEhkZFN0YUN0eC0+ZnRfY2Fycmllcl9vbiA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1NIT1VMRF9ST0FNOgorICAgICAgICAgICAvLyBEb250IG5lZWQgdG8gZG8gYW55dGhpbmcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWT1NfU1RBVFVTICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBBZGFwdGVyLT5kZXY7CisgICAgICAgICAgICAgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAvLyBub3RpZnkgYXBwcyB0aGF0IHdlIGNhbid0IHBhc3MgdHJhZmZpYyBhbnltb3JlCisgICAgICAgICAgICAgICAgbmV0aWZfdHhfZGlzYWJsZShkZXYpOworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICAgICAgICAgICAgICBpZiAocEhkZFN0YUN0eC0+ZnRfY2Fycmllcl9vbiA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9DQ1gpCisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAvL1dlIHNob3VsZCBjbGVhciBhbGwgc3RhIHJlZ2lzdGVyIHdpdGggVEwsIGZvciBub3csIG9ubHkgb25lLgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IGhkZF9yb2FtRGVyZWdpc3RlclNUQSggcEFkYXB0ZXIsIHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZCBbMF0gKTsKKyAgICAgICAgICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJoZGRfcm9hbURlcmVnaXN0ZXJTVEEoKSBmYWlsZWQgdG8gZm9yIHN0YUlEICVkLiAgU3RhdHVzPSAlZCBbMHgleF0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbMF0sIHN0YXR1cywgc3RhdHVzICk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2xlYXIgc2F2ZWQgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBpbiBIREQKKyAgICAgICAgICAgICAgICBoZGRfY29ublJlbW92ZUNvbm5lY3RJbmZvKCBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fTE9TVExJTks6CisgICAgICAgIGNhc2UgZUNTUl9ST0FNX0RJU0FTU09DSUFURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBjb3VudHJ5X2NvZGVbM10gPSBTTUVfSU5WQUxJRF9DT1VOVFJZX0NPREU7CisgICAgICAgICAgICAgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIGhkZF9jb250ZXh0X3QqIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCopcEFkYXB0ZXItPnBIZGRDdHg7CisKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqKiplQ1NSX1JPQU1fRElTQVNTT0NJQVRFRCoqKioiKTsKKyAgICAgICAgICAgICAgICBoYWxTdGF0dXMgPSBoZGRfRGlzQ29ubmVjdEhhbmRsZXIoIHBBZGFwdGVyLCBwUm9hbUluZm8sIHJvYW1JZCwgcm9hbVN0YXR1cywgcm9hbVJlc3VsdCApOworICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIE1jYXN0L0JjYXN0IEZpbHRlcnMgYXJlIHNldCwgaWYgeWVzIGNsZWFyIHRoZSBmaWx0ZXJzIGhlcmUgKi8KKyAgICAgICAgICAgICAgICBpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldCA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgICAgIGhkZF9jb25mX21jYXN0YmNhc3RfZmlsdGVyKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSksIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldCA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORyAgICAKKyAgICAgICAgICAgICAgICBpZiAocEhkZEN0eC0+Y2ZnX2luaS0+aXNNY0FkZHJMaXN0RmlsdGVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypNdWx0aWNhc3QgYWRkciBmaWx0ZXJpbmcgaXMgZW5hYmxlZCovCisgICAgICAgICAgICAgICAgICAgIGlmKHBIZGRDdHgtPm1jX2FkZHJfbGlzdC5pc0ZpbHRlckFwcGxpZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qRmlsdGVyIGFwcGxpZWQgZHVyaW5nIHN1c3BlbmQgbW9kZSovCisgICAgICAgICAgICAgICAgICAgICAgICAvKkNsZWFyIGl0IGhlcmUqLworICAgICAgICAgICAgICAgICAgICAgICAgd2xhbl9oZGRfc2V0X21jX2FkZHJfbGlzdChwSGRkQ3R4LCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogRGlzY29ubmVjdGVkIGZyb20gdGhlIEFQIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXR0aW5nIHRoZSBjb3VudHJ5IGNvZGUgdG8gZGVmYXVsdFxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgLypyZXNldCB0aGUgY291bnRyeSBjb2RlIG9mIHByZXZpb3VzIGNvbm5lY3Rpb24qLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IChpbnQpc21lX0NoYW5nZUNvdW50cnlDb2RlKHBIZGRDdHgtPmhIYWwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAmY291bnRyeV9jb2RlWzBdLCBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPnB2b3NDb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGlmKCAwICE9IHN0YXR1cyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogU01FIENoYW5nZSBDb3VudHJ5IGNvZGUgdG8gZGVmYXVsdCBmYWlsZWQgXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fSUJTU19MRUFWRToKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICIqKioqZUNTUl9ST0FNX0lCU1NfTEVBVkUqKioqIik7CisgICAgICAgICAgICBoYWxTdGF0dXMgPSBoZGRfRGlzQ29ubmVjdEhhbmRsZXIoIHBBZGFwdGVyLCBwUm9hbUluZm8sIHJvYW1JZCwgcm9hbVN0YXR1cywgcm9hbVJlc3VsdCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT046CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAiKioqKmVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OKioqKiIpOworICAgICAgICAgICAgaWYgKCAgKHJvYW1SZXN1bHQgIT0gZUNTUl9ST0FNX1JFU1VMVF9BU1NPQ0lBVEVEKQorICAgICAgICAgICAgICAgJiYgKCAgIChwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9PSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVkpIAorICAgICAgICAgICAgICAgICAgIHx8IChwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9PSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZKQorICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgJiYgKGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVkgIT0gcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuQXV0aFR5cGUuYXV0aFR5cGVbMF0pCisgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdl9VMzJfdCByb2FtSWQgPSAwOworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKioqV0VQIG9wZW4gYXV0aGVudGljYXRpb24gZmFpbGVkLCB0cnlpbmcgd2l0aCBzaGFyZWQgYXV0aGVudGljYXRpb24qKioqIik7CisgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLmF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfU0hBUkVEX0tFWTsKKyAgICAgICAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5BdXRoVHlwZS5hdXRoVHlwZVswXSA9IChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5hdXRoVHlwZTsKKyAgICAgICAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5jc3JQZXJzb25hID0gcEFkYXB0ZXItPmRldmljZV9tb2RlOworICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9Sb2FtQ29ubmVjdCggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCBwQWRhcHRlci0+c2Vzc2lvbklkLCAmKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlKSwgJnJvYW1JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFsU3RhdHVzID0gaGRkX0Fzc29jaWF0aW9uQ29tcGxldGlvbkhhbmRsZXIoIHBBZGFwdGVyLCBwUm9hbUluZm8sIHJvYW1JZCwgcm9hbVN0YXR1cywgcm9hbVJlc3VsdCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fRkFJTFVSRToKKyAgICAgICAgICAgIGhhbFN0YXR1cyA9IGhkZF9Bc3NvY2lhdGlvbkNvbXBsZXRpb25IYW5kbGVyKCBwQWRhcHRlciwgCisgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mbywgcm9hbUlkLCByb2FtU3RhdHVzLCByb2FtUmVzdWx0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fSUJTU19JTkQ6CisgICAgICAgICAgICBoYWxTdGF0dXMgPSByb2FtUm9hbUlic3NJbmRpY2F0aW9uSGFuZGxlciggcEFkYXB0ZXIsIHBSb2FtSW5mbywgcm9hbUlkLCByb2FtU3RhdHVzLCByb2FtUmVzdWx0ICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9DT05ORUNUX1NUQVRVU19VUERBVEU6CisgICAgICAgICAgICBoYWxTdGF0dXMgPSByb2FtUm9hbUNvbm5lY3RTdGF0dXNVcGRhdGVIYW5kbGVyKCBwQWRhcHRlciwgcFJvYW1JbmZvLCByb2FtSWQsIHJvYW1TdGF0dXMsIHJvYW1SZXN1bHQgKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX01JQ19FUlJPUl9JTkQ6CisgICAgICAgICAgICBoYWxTdGF0dXMgPSBoZGRfUm9hbU1pY0Vycm9ySW5kaWNhdGlvbkhhbmRsZXIoIHBBZGFwdGVyLCBwUm9hbUluZm8sIHJvYW1JZCwgcm9hbVN0YXR1cywgcm9hbVJlc3VsdCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fU0VUX0tFWV9DT01QTEVURToKKyAgICAgICAgICAgIGhhbFN0YXR1cyA9IGhkZF9Sb2FtU2V0S2V5Q29tcGxldGVIYW5kbGVyKCBwQWRhcHRlciwgcFJvYW1JbmZvLCByb2FtSWQsIHJvYW1TdGF0dXMsIHJvYW1SZXN1bHQgKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX0ZUX1JFU1BPTlNFOgorICAgICAgICAgICAgaGRkX1NlbmRGVEV2ZW50KHBBZGFwdGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX0lORElDQVRFX01HTVRfRlJBTUU6CisgICAgICAgICAgICBoZGRfaW5kaWNhdGVNZ210RnJhbWUoIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+bkZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+cGJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5mcmFtZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5yeENoYW4gKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRU1BSU5fQ0hBTl9SRUFEWToKKyAgICAgICAgICAgIGhkZF9yZW1haW5DaGFuUmVhZHlIYW5kbGVyKCBwQWRhcHRlciApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1NFTkRfQUNUSU9OX0NORjoKKyAgICAgICAgICAgIGhkZF9zZW5kQWN0aW9uQ25mKCBwQWRhcHRlciwKKyAgICAgICAgICAgICAgIChyb2FtUmVzdWx0ID09IGVDU1JfUk9BTV9SRVNVTFRfTk9ORSkgPyBUUlVFIDogRkFMU0UgKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuKCBoYWxTdGF0dXMgKTsKK30KK2VDc3JBdXRoVHlwZSBoZGRfVHJhbnNsYXRlUlNOVG9Dc3JBdXRoVHlwZSggdV9pbnQ4X3QgYXV0aF9zdWl0ZVs0XSkgCit7CisgICAgZUNzckF1dGhUeXBlIGF1dGhfdHlwZTsKKyAgICAvLyBpcyB0aGUgYXV0aCB0eXBlIHN1cHBvcnRlZD8KKyAgICBpZiAoIG1lbWNtcChhdXRoX3N1aXRlICwgY2NwUlNOT3VpMDEsIDQpID09IDApIAorICAgIHsKKyAgICAgICAgYXV0aF90eXBlID0gZUNTUl9BVVRIX1RZUEVfUlNOOworICAgIH0gZWxzZSAKKyAgICBpZiAobWVtY21wKGF1dGhfc3VpdGUgLCBjY3BSU05PdWkwMiwgNCkgPT0gMCkgCisgICAgeworICAgICAgICBhdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLOworICAgIH0gZWxzZSAKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGlmIChtZW1jbXAoYXV0aF9zdWl0ZSAsIGNjcFJTTk91aTA0LCA0KSA9PSAwKSAKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGZvciAxMXIgRlQgQXV0aGVudGljYXRpb24gd2l0aCBQU0sKKyAgICAgICAgYXV0aF90eXBlID0gZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSzsKKyAgICB9IGVsc2UgCisgICAgaWYgKG1lbWNtcChhdXRoX3N1aXRlICwgY2NwUlNOT3VpMDMsIDQpID09IDApIAorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIDExUiBGVCBBdXRoZW50aWNhdGlvbiB3aXRoIDgwMi4xWAorICAgICAgICBhdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9GVF9SU047CisgICAgfSBlbHNlIAorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIGlmIChtZW1jbXAoYXV0aF9zdWl0ZSAsIGNjcFJTTk91aTA2LCA0KSA9PSAwKSAKKyAgICB7CisgICAgICAgIGF1dGhfdHlwZSA9IGVDU1JfQVVUSF9UWVBFX0NDS01fUlNOOworICAgIH0gZWxzZQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KKyAgICB7IAorICAgICAgICBhdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworICAgIH0KKyAgICByZXR1cm4gYXV0aF90eXBlOworfSAKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCitlQ3NyQXV0aFR5cGUgCitoZGRfVHJhbnNsYXRlV1BBVG9Dc3JBdXRoVHlwZSh1X2ludDhfdCBhdXRoX3N1aXRlWzRdKSAKKyNlbHNlCitzdGF0aWMgZUNzckF1dGhUeXBlIGhkZF9UcmFuc2xhdGVXUEFUb0NzckF1dGhUeXBlKHVfaW50OF90IGF1dGhfc3VpdGVbNF0pIAorI2VuZGlmCit7CisgICAgZUNzckF1dGhUeXBlIGF1dGhfdHlwZTsKKyAgICAvLyBpcyB0aGUgYXV0aCB0eXBlIHN1cHBvcnRlZD8KKyAgICBpZiAoIG1lbWNtcChhdXRoX3N1aXRlICwgY2NwV3BhT3VpMDEsIDQpID09IDApIAorICAgIHsKKyAgICAgICAgYXV0aF90eXBlID0gZUNTUl9BVVRIX1RZUEVfV1BBOworICAgIH0gZWxzZSAKKyAgICBpZiAobWVtY21wKGF1dGhfc3VpdGUgLCBjY3BXcGFPdWkwMiwgNCkgPT0gMCkgCisgICAgeworICAgICAgICBhdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLOworICAgIH0gZWxzZSAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgaWYgKG1lbWNtcChhdXRoX3N1aXRlICwgY2NwV3BhT3VpMDYsIDQpID09IDApIAorICAgIHsKKyAgICAgICAgYXV0aF90eXBlID0gZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEE7CisgICAgfSBlbHNlIAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KKyAgICB7IAorICAgICAgICBhdXRoX3R5cGUgPSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworICAgIH0KKyAgICBoZGRMb2coTE9HMSwgRkwoImF1dGhfdHlwZTogJWQiKSwgYXV0aF90eXBlKTsKKyAgICByZXR1cm4gYXV0aF90eXBlOworfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK2VDc3JFbmNyeXB0aW9uVHlwZSAKK2hkZF9UcmFuc2xhdGVSU05Ub0NzckVuY3J5cHRpb25UeXBlKHVfaW50OF90IGNpcGhlcl9zdWl0ZVs0XSkKKyNlbHNlCitzdGF0aWMgZUNzckVuY3J5cHRpb25UeXBlIGhkZF9UcmFuc2xhdGVSU05Ub0NzckVuY3J5cHRpb25UeXBlKHVfaW50OF90IGNpcGhlcl9zdWl0ZVs0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNlbmRpZgoreworICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBjaXBoZXJfdHlwZTsKKyAgICAvLyBpcyB0aGUgY2lwaGVyIHR5cGUgc3VwcG9ydGVkPworICAgIGlmICggbWVtY21wKGNpcGhlcl9zdWl0ZSAsIGNjcFJTTk91aTA0LCA0KSA9PSAwKSAKKyAgICB7CisgICAgICAgIGNpcGhlcl90eXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworICAgIH0gCisgICAgZWxzZSBpZiAobWVtY21wKGNpcGhlcl9zdWl0ZSAsIGNjcFJTTk91aTAyLCA0KSA9PSAwKSAKKyAgICB7CisgICAgICAgIGNpcGhlcl90eXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDsKKyAgICB9IAorICAgIGVsc2UgaWYgKG1lbWNtcChjaXBoZXJfc3VpdGUgLCBjY3BSU05PdWkwMCwgNCkgPT0gMCkgCisgICAgeworICAgICAgICBjaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisgICAgfSAKKyAgICBlbHNlIGlmIChtZW1jbXAoY2lwaGVyX3N1aXRlICwgY2NwUlNOT3VpMDEsIDQpID09IDApIAorICAgIHsKKyAgICAgICAgY2lwaGVyX3R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk7CisgICAgfSAKKyAgICBlbHNlIGlmIChtZW1jbXAoY2lwaGVyX3N1aXRlICwgY2NwUlNOT3VpMDUsIDQpID09IDApIAorICAgIHsgICAgICAgIAorICAgICAgICBjaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk7IAorICAgIH0gCisgICAgZWxzZSAKKyAgICB7IAorICAgICAgICBjaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0ZBSUxFRDsKKyAgICB9CisgICAgaGRkTG9nKExPRzEsIEZMKCJjaXBoZXJfdHlwZTogJWQiKSwgY2lwaGVyX3R5cGUpOworICAgIHJldHVybiBjaXBoZXJfdHlwZTsKK30gCisvKiBUbyBmaW5kIGlmIHRoZSBNQUMgYWRkcmVzcyBpcyBOVUxMICovCitzdGF0aWMgdEFOSV9VOCBoZGRfSXNNQUNBZGRyTlVMTCAodEFOSV9VOCAqbWFjQWRkciwgdEFOSV9VOCBsZW5ndGgpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKDB4MDAgIT0gKG1hY0FkZHJbaV0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9IC8qKioqKiogZW5kIGhkZF9Jc01BQ0FkZHJOVUxMKCkgKioqKioqLworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK2VDc3JFbmNyeXB0aW9uVHlwZSAKK2hkZF9UcmFuc2xhdGVXUEFUb0NzckVuY3J5cHRpb25UeXBlKHVfaW50OF90IGNpcGhlcl9zdWl0ZVs0XSkKKyNlbHNlCitzdGF0aWMgZUNzckVuY3J5cHRpb25UeXBlIAoraGRkX1RyYW5zbGF0ZVdQQVRvQ3NyRW5jcnlwdGlvblR5cGUodV9pbnQ4X3QgY2lwaGVyX3N1aXRlWzRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2VuZGlmCit7CisgICAgZUNzckVuY3J5cHRpb25UeXBlIGNpcGhlcl90eXBlOworICAgIC8vIGlzIHRoZSBjaXBoZXIgdHlwZSBzdXBwb3J0ZWQ/CisgICAgaWYgKCBtZW1jbXAoY2lwaGVyX3N1aXRlICwgY2NwV3BhT3VpMDQsIDQpID09IDApIAorICAgIHsKKyAgICAgICAgY2lwaGVyX3R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM7CisgICAgfSBlbHNlIAorICAgIGlmIChtZW1jbXAoY2lwaGVyX3N1aXRlICwgY2NwV3BhT3VpMDIsIDQpID09IDApIAorICAgIHsKKyAgICAgICAgY2lwaGVyX3R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQOworICAgIH0gZWxzZSAKKyAgICBpZiAobWVtY21wKGNpcGhlcl9zdWl0ZSAsIGNjcFdwYU91aTAwLCA0KSA9PSAwKSAKKyAgICB7CisgICAgICAgIGNpcGhlcl90eXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyAgICB9IGVsc2UgCisgICAgaWYgKG1lbWNtcChjaXBoZXJfc3VpdGUgLCBjY3BXcGFPdWkwMSwgNCkgPT0gMCkgCisgICAgeworICAgICAgICBjaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWTsKKyAgICB9IGVsc2UgCisgICAgaWYgKG1lbWNtcChjaXBoZXJfc3VpdGUgLCBjY3BXcGFPdWkwNSwgNCkgPT0gMCkgCisgICAgeworICAgICAgICBjaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk7IAorICAgIH0gZWxzZSAKKyAgICB7IAorICAgICAgICBjaXBoZXJfdHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0ZBSUxFRDsKKyAgICB9CisgICAgaGRkTG9nKExPRzEsIEZMKCJjaXBoZXJfdHlwZTogJWQiKSwgY2lwaGVyX3R5cGUpOworICAgIHJldHVybiBjaXBoZXJfdHlwZTsKK30gCisKK3N0YXRpYyB0QU5JX1MzMiBoZGRfUHJvY2Vzc0dFTklFKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRoZXJfYWRkciAqcEJzc2lkLCAKKyAgICAgICAgICAgICAgICBlQ3NyRW5jcnlwdGlvblR5cGUgKnBFbmNyeXB0VHlwZSwgCisgICAgICAgICAgICAgICAgZUNzckVuY3J5cHRpb25UeXBlICptY0VuY3J5cHRUeXBlLCAKKyAgICAgICAgICAgICAgICBlQ3NyQXV0aFR5cGUgKnBBdXRoVHlwZSwgCisgICAgICAgICAgICAgICAgdV9pbnQxNl90IGdlbl9pZV9sZW4sIAorICAgICAgICAgICAgICAgIHVfaW50OF90ICpnZW5faWUpIAoreworICAgIHRIYWxIYW5kbGUgaGFsSGFuZGxlID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworICAgIGVIYWxTdGF0dXMgcmVzdWx0OyAKKyAgICB0RG90MTFmSUVSU04gZG90MTFSU05JRTsgCisgICAgdERvdDExZklFV1BBIGRvdDExV1BBSUU7IAorICAgIHRBTklfVTMyIGk7IAorICAgIHRBTklfVTggKnBSc25JZTsgCisgICAgdEFOSV9VMTYgUlNOSWVMZW47IAorICAgIHRQbWtpZENhY2hlSW5mbyBQTUtJRENhY2hlWzRdOyAvLyBMb2NhbCB0cmFuc2ZlciBtZW1vcnkKKworICAgIC8qIENsZWFyIHN0cnVjdCBvZiB0RG90MTFmSUVSU04gYW5kIHREb3QxMWZJRVdQQSBzcGVjaWZpY2FsbHkgc2V0dGluZyBwcmVzZW50CisgICAgICAgZmxhZyB0byAwICovCisgICAgbWVtc2V0KCAmZG90MTFXUEFJRSwgMCAsIHNpemVvZih0RG90MTFmSUVXUEEpICk7CisgICAgbWVtc2V0KCAmZG90MTFSU05JRSwgMCAsIHNpemVvZih0RG90MTFmSUVSU04pICk7CisKKyAgICAvLyBWYWxpZGl0eSBjaGVja3MKKyAgICBpZiAoKGdlbl9pZV9sZW4gPCBWT1NfTUlOKERPVDExRl9JRV9SU05fTUlOX0xFTiwgRE9UMTFGX0lFX1dQQV9NSU5fTEVOKSkgfHwgIAorICAgICAgICAgICAgKGdlbl9pZV9sZW4gPiBWT1NfTUFYKERPVDExRl9JRV9SU05fTUFYX0xFTiwgRE9UMTFGX0lFX1dQQV9NQVhfTEVOKSkgKSAKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgLy8gVHlwZSBjaGVjaworICAgIGlmICggZ2VuX2llWzBdID09ICBET1QxMUZfRUlEX1JTTikgCisgICAgeyAgICAgICAgIAorICAgICAgICAvLyBWYWxpZGl0eSBjaGVja3MKKyAgICAgICAgaWYgKChnZW5faWVfbGVuIDwgRE9UMTFGX0lFX1JTTl9NSU5fTEVOICkgfHwgIAorICAgICAgICAgICAgICAgIChnZW5faWVfbGVuID4gRE9UMTFGX0lFX1JTTl9NQVhfTEVOKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIC8vIFNraXAgcGFzdCB0aGUgRUlEIGJ5dGUgYW5kIGxlbmd0aCBieXRlICAKKyAgICAgICAgcFJzbkllID0gZ2VuX2llICsgMjsgCisgICAgICAgIFJTTkllTGVuID0gZ2VuX2llX2xlbiAtIDI7IAorICAgICAgICAvLyBVbnBhY2sgdGhlIFJTTiBJRSAKKyAgICAgICAgZG90MTFmVW5wYWNrSWVSU04oKHRwQW5pU2lyR2xvYmFsKSBoYWxIYW5kbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSc25JZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOSWVMZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb3QxMVJTTklFKTsKKyAgICAgICAgLy8gQ29weSBvdXQgdGhlIGVuY3J5cHRpb24gYW5kIGF1dGhlbnRpY2F0aW9uIHR5cGVzIAorICAgICAgICBoZGRMb2coTE9HMSwgRkwoIiVzOiBwYWlyd2lzZSBjaXBoZXIgc3VpdGUgY291bnQ6ICVkIiksIAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZG90MTFSU05JRS5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKTsKKyAgICAgICAgaGRkTG9nKExPRzEsIEZMKCIlczogYXV0aGVudGljYXRpb24gc3VpdGUgY291bnQ6ICVkIiksIAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZG90MTFSU05JRS5ha21fc3VpdGVfY291bnQpOworICAgICAgICAvKkhlcmUgd2UgaGF2ZSBmb2xsb3dlZCB0aGUgYXBwbGUgYmFzZSBjb2RlLCAKKyAgICAgICAgICBidXQgcHJvYmFibHkgSSBzdXNwZWN0IHdlIGNhbiBkbyBzb21ldGhpbmcgZGlmZmVyZW50Ki8KKyAgICAgICAgLy9kb3QxMVJTTklFLmFrbV9zdWl0ZV9jb3VudAorICAgICAgICAvLyBKdXN0IHRyYW5zbGF0ZSB0aGUgRklSU1Qgb25lIAorICAgICAgICAqcEF1dGhUeXBlID0gIGhkZF9UcmFuc2xhdGVSU05Ub0NzckF1dGhUeXBlKGRvdDExUlNOSUUuYWttX3N1aXRlc1swXSk7IAorICAgICAgICAvL2RvdDExUlNOSUUucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50IAorICAgICAgICAqcEVuY3J5cHRUeXBlID0gaGRkX1RyYW5zbGF0ZVJTTlRvQ3NyRW5jcnlwdGlvblR5cGUoZG90MTFSU05JRS5wd2lzZV9jaXBoZXJfc3VpdGVzWzBdKTsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy9kb3QxMVJTTklFLmdwX2NpcGhlcl9zdWl0ZV9jb3VudCAKKyAgICAgICAgKm1jRW5jcnlwdFR5cGUgPSBoZGRfVHJhbnNsYXRlUlNOVG9Dc3JFbmNyeXB0aW9uVHlwZShkb3QxMVJTTklFLmdwX2NpcGhlcl9zdWl0ZSk7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIFNldCB0aGUgUE1LU0EgSUQgQ2FjaGUgZm9yIHRoaXMgaW50ZXJmYWNlCisgICAgICAgIGZvciAoaT0wOyBpPGRvdDExUlNOSUUucG1raWRfY291bnQ7IGkrKykgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcEJzc2lkID09IE5VTEwpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBoZGRfSXNNQUNBZGRyTlVMTCggKHVfY2hhciAqKSBwQnNzaWQgLCBzaXplb2YoIChjaGFyICopIHBCc3NpZCkpKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZvciByaWdodCBub3csIEkgYXNzdW1lIHNldEFTU09DSUFURSgpIGhhcyBwYXNzZWQgaW4gdGhlIGJzc2lkLgorICAgICAgICAgICAgdm9zX21lbV9jb3B5KFBNS0lEQ2FjaGVbaV0uQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc2lkLCBFVEhFUl9BRERSX0xFTik7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoUE1LSURDYWNoZVtpXS5QTUtJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3QxMVJTTklFLnBta2lkW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTUl9SU05fUE1LSURfU0laRSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2FsbGluZyBjc3JSb2FtU2V0UE1LSURDYWNoZSB0byBjb25maWd1cmUgdGhlIFBNS0lEcyBpbnRvIHRoZSBjYWNoZQorICAgICAgICBoZGRMb2coTE9HMSwgRkwoIiVzOiBDYWxsaW5nIGNzclJvYW1TZXRQTUtJRENhY2hlIHdpdGggY2FjaGUgZW50cnkgJWxkLiIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGkgKTsKKyAgICAgICAgLy8gRmluYWxseSBzZXQgdGhlIFBNS1NBIElEIENhY2hlIGluIENTUgorICAgICAgICByZXN1bHQgPSBzbWVfUm9hbVNldFBNS0lEQ2FjaGUoaGFsSGFuZGxlLHBBZGFwdGVyLT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1LSURDYWNoZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90MTFSU05JRS5wbWtpZF9jb3VudCApOworICAgIH0KKyAgICBlbHNlIGlmIChnZW5faWVbMF0gPT0gRE9UMTFGX0VJRF9XUEEpCisgICAgeworICAgICAgICAvLyBWYWxpZGl0eSBjaGVja3MKKyAgICAgICAgaWYgKChnZW5faWVfbGVuIDwgRE9UMTFGX0lFX1dQQV9NSU5fTEVOICkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGdlbl9pZV9sZW4gPiBET1QxMUZfSUVfV1BBX01BWF9MRU4pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAvLyBTa2lwIHBhc3QgdGhlIEVJRCBieXRlIGFuZCBsZW5ndGggYnl0ZSAtIGFuZCBmb3VyIGJ5dGUgV2lGaSBPVUkKKyAgICAgICAgcFJzbkllID0gZ2VuX2llICsgMiArIDQ7IAorICAgICAgICBSU05JZUxlbiA9IGdlbl9pZV9sZW4gLSAoMiArIDQpOyAKKyAgICAgICAgLy8gVW5wYWNrIHRoZSBXUEEgSUUgCisgICAgICAgIGRvdDExZlVucGFja0llV1BBKCh0cEFuaVNpckdsb2JhbCkgaGFsSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSc25JZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05JZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG90MTFXUEFJRSk7CisgICAgICAgIC8vIENvcHkgb3V0IHRoZSBlbmNyeXB0aW9uIGFuZCBhdXRoZW50aWNhdGlvbiB0eXBlcworICAgICAgICBoZGRMb2coTE9HMSwgRkwoIiVzOiBXUEEgdW5pY2FzdCBjaXBoZXIgc3VpdGUgY291bnQ6ICVkIiksCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRvdDExV1BBSUUudW5pY2FzdF9jaXBoZXJfY291bnQgKTsKKyAgICAgICAgaGRkTG9nKExPRzEsIEZMKCIlczogV1BBIGF1dGhlbnRpY2F0aW9uIHN1aXRlIGNvdW50OiAlZCIpLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkb3QxMVdQQUlFLmF1dGhfc3VpdGVfY291bnQpOworICAgICAgICAvL2RvdDExV1BBSUUuYXV0aF9zdWl0ZV9jb3VudAorICAgICAgICAvLyBKdXN0IHRyYW5zbGF0ZSB0aGUgRklSU1Qgb25lCisgICAgICAgICpwQXV0aFR5cGUgPSAgaGRkX1RyYW5zbGF0ZVdQQVRvQ3NyQXV0aFR5cGUoZG90MTFXUEFJRS5hdXRoX3N1aXRlc1swXSk7CisgICAgICAgIC8vZG90MTFXUEFJRS51bmljYXN0X2NpcGhlcl9jb3VudAorICAgICAgICAqcEVuY3J5cHRUeXBlID0gaGRkX1RyYW5zbGF0ZVdQQVRvQ3NyRW5jcnlwdGlvblR5cGUoZG90MTFXUEFJRS51bmljYXN0X2NpcGhlcnNbMF0pOworICAgICAgICAvL2RvdDExV1BBSUUudW5pY2FzdF9jaXBoZXJfY291bnQKKyAgICAgICAgKm1jRW5jcnlwdFR5cGUgPSBoZGRfVHJhbnNsYXRlV1BBVG9Dc3JFbmNyeXB0aW9uVHlwZShkb3QxMVdQQUlFLm11bHRpY2FzdF9jaXBoZXIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoZGRMb2coTE9HVywgRkwoImdlbl9pZVswXTogJWQiKSwgZ2VuX2llWzBdKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7IAorICAgIH0KKyAgICByZXR1cm4gMDsKK30KK2ludCBoZGRfU2V0R0VOSUVUb0NzciggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGVDc3JBdXRoVHlwZSAqUlNOQXV0aFR5cGUpCit7CisgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICAgdl9VMzJfdCBzdGF0dXMgPSAwOworICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBSU05FbmNyeXB0VHlwZTsKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgbWNSU05FbmNyeXB0VHlwZTsKKyAgICBzdHJ1Y3QgZXRoZXJfYWRkciAgIGJTc2lkOyAgIC8vIE1BQyBhZGRyZXNzIG9mIGFzc29jIHBlZXIKKyAgICAvLyBNQUMgYWRkcmVzcyBvZiBhc3NvYyBwZWVyCisgICAgLy8gQnV0LCB0aGlzIHJvdXRpbmUgaXMgb25seSBjYWxsZWQgd2hlbiB3ZSBhcmUgTk9UIGFzc29jaWF0ZWQuCisgICAgdm9zX21lbV9jb3B5KGJTc2lkLmV0aGVyX2FkZHJfb2N0ZXQsCisgICAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5CU1NJRHMuYnNzaWQsCisgICAgICAgICAgICBzaXplb2YoYlNzaWQuZXRoZXJfYWRkcl9vY3RldCkpOworICAgIGlmIChwV2V4dFN0YXRlLT5XUEFSU05JRVswXSA9PSBET1QxMUZfRUlEX1JTTiB8fCBwV2V4dFN0YXRlLT5XUEFSU05JRVswXSA9PSBET1QxMUZfRUlEX1dQQSkKKyAgICB7CisgICAgICAgIC8vY29udGludWUKKyAgICB9IAorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBUaGUgYWN0dWFsIHByb2Nlc3NpbmcgbWF5IGV2ZW50dWFsbHkgYmUgbW9yZSBleHRlbnNpdmUgdGhhbiB0aGlzLgorICAgIC8vIFJpZ2h0IG5vdywganVzdCBjb25zdW1lIGFueSBQTUtJRHMgdGhhdCBhcmUgIHNlbnQgaW4gYnkgdGhlIGFwcC4KKyAgICBzdGF0dXMgPSBoZGRfUHJvY2Vzc0dFTklFKHBBZGFwdGVyLAorICAgICAgICAgICAgJmJTc2lkLCAgIC8vIE1BQyBhZGRyZXNzIG9mIGFzc29jIHBlZXIKKyAgICAgICAgICAgICZSU05FbmNyeXB0VHlwZSwKKyAgICAgICAgICAgICZtY1JTTkVuY3J5cHRUeXBlLAorICAgICAgICAgICAgUlNOQXV0aFR5cGUsCisgICAgICAgICAgICBwV2V4dFN0YXRlLT5XUEFSU05JRVsxXSsyLAorICAgICAgICAgICAgcFdleHRTdGF0ZS0+V1BBUlNOSUUpOworICAgIGlmIChzdGF0dXMgPT0gMCkKKyAgICB7CisgICAgICAgIC8vIE5vdyBjb3B5IG92ZXIgYWxsIHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzIHlvdSBoYXZlIHBhcnNlZCBvdXQKKyAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm1jRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgIAorICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IFJTTkVuY3J5cHRUeXBlOyAvLyBVc2UgdGhlIGNpcGhlciB0eXBlIGluIHRoZSBSU04gSUUKKyAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IG1jUlNORW5jcnlwdFR5cGU7CisgICAgICAgIGhkZExvZyggTE9HMSwgIiVzOiBDU1IgQXV0aFR5cGUgPSAlZCwgRW5jcnlwdGlvblR5cGUgPSAlZCBtY0VuY3J5cHRpb25UeXBlID0gJWQiLCBfX0ZVTkNUSU9OX18sICpSU05BdXRoVHlwZSwgUlNORW5jcnlwdFR5cGUsIG1jUlNORW5jcnlwdFR5cGUpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KK2ludCBoZGRfc2V0X2Nzcl9hdXRoX3R5cGUgKCBoZGRfYWRhcHRlcl90ICAqcEFkYXB0ZXIsIGVDc3JBdXRoVHlwZSBSU05BdXRoVHlwZSkKK3sKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICB0Q3NyUm9hbVByb2ZpbGUqIHBSb2FtUHJvZmlsZSA9ICYocFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUpOworICAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisgICAgRU5URVIoKTsKKyAgICAKKyAgICBwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworICAgIGhkZExvZyggTE9HMSwgIiVzOiBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUpOworICAgICAgCisgICAgc3dpdGNoKCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUpCisgICAgeworICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU06CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEE6CisgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1JTTjoKKyNlbmRpZgorICAgICAgICBpZiAocFdleHRTdGF0ZS0+d3BhVmVyc2lvbiAmIElXX0FVVEhfV1BBX1ZFUlNJT05fRElTQUJMRUQpIHsgICAgICAgICAgIAorICAgICAgICAgICAKKyAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNIDsKKyAgICAgICAgfSBlbHNlIAorICAgICAgICBpZiAocFdleHRTdGF0ZS0+d3BhVmVyc2lvbiAmIElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKSB7CisgICAgICAgICAgIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgICAgIGlmICgoUlNOQXV0aFR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEEpICYmIAorICAgICAgICAgICAgICAgICgocFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgJiBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkgCisgICAgICAgICAgICAgICAgID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSkgeyAKKyAgICAgICAgICAgICAgICBoZGRMb2coIExPRzEsICIlczogc2V0IGF1dGhUeXBlIHRvIENDS00gV1BBLiBBS00gYWxzbyA4MDIuMVguXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQTsgICAKKyAgICAgICAgICAgIH0gZWxzZSAKKyAgICAgICAgICAgIGlmICgoUlNOQXV0aFR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEEpKSB7IAorICAgICAgICAgICAgICAgIGhkZExvZyggTE9HMSwgIiVzOiBMYXN0IGNoYW5jZSB0byBzZXQgYXV0aFR5cGUgdG8gQ0NLTSBXUEEuXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQTsgICAKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICBpZigocFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgJiBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkKKyAgICAgICAgICAgICAgICAgICAgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpIHsKKyAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9XUEE7ICAgCisgICAgICAgICAgICB9IGVsc2UgCisgICAgICAgICAgICBpZiAoKHBXZXh0U3RhdGUtPmF1dGhLZXlNZ210ICYgSVdfQVVUSF9LRVlfTUdNVF9QU0spCisgICAgICAgICAgICAgICAgICAgID09IElXX0FVVEhfS0VZX01HTVRfUFNLKSB7CisgICAgICAgICAgICAgICBwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gZUNTUl9BVVRIX1RZUEVfV1BBX1BTSzsKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAKKyAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9XUEFfTk9ORTsKKyAgICAgICAgICAgIH0gICAgCisgICAgICAgIH0KKyAgICAgICAgaWYgKHBXZXh0U3RhdGUtPndwYVZlcnNpb24gJiBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgICBpZiAoKFJTTkF1dGhUeXBlID09IGVDU1JfQVVUSF9UWVBFX0NDS01fUlNOKSAmJiAKKyAgICAgICAgICAgICAgICAoKHBXZXh0U3RhdGUtPmF1dGhLZXlNZ210ICYgSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpIAorICAgICAgICAgICAgICAgICA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkpIHsgCisgICAgICAgICAgICAgICAgaGRkTG9nKCBMT0cxLCAiJXM6IHNldCBhdXRoVHlwZSB0byBDQ0tNIFJTTi4gQUtNIGFsc28gODAyLjFYLlxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU047ICAgCisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGlmICgoUlNOQXV0aFR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfQ0NLTV9SU04pKSB7IAorICAgICAgICAgICAgICAgIGhkZExvZyggTE9HMSwgIiVzOiBMYXN0IGNoYW5jZSB0byBzZXQgYXV0aFR5cGUgdG8gQ0NLTSBSU04uXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1JTTjsgICAKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICAgICAgaWYgKChSU05BdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9GVF9SU04pICYmIAorICAgICAgICAgICAgICAgICgocFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgJiBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkgCisgICAgICAgICAgICAgICAgID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSkgeworICAgICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9IGVDU1JfQVVUSF9UWVBFX0ZUX1JTTjsgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoUlNOQXV0aFR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSykgJiYgCisgICAgICAgICAgICAgICAgKChwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfUFNLKQorICAgICAgICAgICAgICAgICA9PSBJV19BVVRIX0tFWV9NR01UX1BTSykpIHsKKyAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9GVF9SU05fUFNLOyAgIAorICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKworICAgICAgICAgICAgaWYoIChwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSAKKyAgICAgICAgICAgICAgICAgICAgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpIHsKKyAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9SU047ICAgCisgICAgICAgICAgICB9IGVsc2UgCisgICAgICAgICAgICBpZiAoIChwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfUFNLKQorICAgICAgICAgICAgICAgICAgICA9PSBJV19BVVRIX0tFWV9NR01UX1BTSykgeworICAgICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9IGVDU1JfQVVUSF9UWVBFX1JTTl9QU0s7CisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworICAgICAgICAgICAgfSAgICAKKyAgICAgICAgfQorICAgICAgICBicmVhazsgICAgIAorICAgICAgICAgCisgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOgorICAgICAgICAgCisgICAgICAgICAgcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9IGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk7ICAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgICAgaGRkTG9nKCBMT0cxLCAiJXM6IEluIGRlZmF1bHQsIHVua25vd24gYXV0aCB0eXBlLlxuIiwgX19GVU5DVElPTl9fKTsgCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NDWCAqLworICAgICAgICAgICBwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgCisgICAgaGRkTG9nKCBMT0cxLCAiJXMgU2V0IHJvYW0gQXV0aHR5cGUgdG8gJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5BdXRoVHlwZS5hdXRoVHlwZVswXSk7CisgICAKKyAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgaXdfc2V0X2Vzc2lkKCkgLSAKKyAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgc3NpZCByZWNlaXZlZCBmcm9tIHdwYV9zdXBwbGljYW50CisgICB0byB0aGUgQ1NSIHJvYW0gcHJvZmlsZS4gCisgICAKKyAgXHBhcmFtICAtIGRldiAtIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgICAgICAgICAgICAgIC0gaW5mbyAtIFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAgICAgICAgICAgICAgLSB3cnF1IC0gUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAgICAgICAgICAgICAgLSBleHRyYSAtIFBvaW50ZXIgdG8gdGhlIGRhdGEuICAgICAgICAKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBpd19zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgdl9VMzJfdCBzdGF0dXMgPSAwOworICAgIGhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICB2X1UzMl90IHJvYW1JZDsKKyAgICB0Q3NyUm9hbVByb2ZpbGUgICAgICAgICAgKnBSb2FtUHJvZmlsZTsKKyAgICBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGUgY29ubmVjdGVkQnNzVHlwZTsKKyAgICBlQ3NyQXV0aFR5cGUgUlNOQXV0aFR5cGU7CisgICAgdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworICAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisgCisgICAgcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7IAorICAgIAorICAgIEVOVEVSKCk7CisKKyAgICBpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aXNMb2dwSW5Qcm9ncmVzcykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYocFdleHRTdGF0ZS0+bVRLSVBDb3VudGVyTWVhc3VyZXMgPT0gVEtJUF9DT1VOVEVSX01FQVNVUkVfU1RBUlRFRCkgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzIDpDb3VudGVyIG1lYXN1cmUgaXMgaW4gcHJvZ3Jlc3MiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorICAgIGlmKCBTSVJfTUFDX01BWF9TU0lEX0xFTkdUSCA8IHdycXUtPmVzc2lkLmxlbmd0aCApCisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIHBSb2FtUHJvZmlsZSA9ICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZTsKKyAgICBpZiAocFJvYW1Qcm9maWxlKSAKKyAgICB7CisgICAgICAgIGlmICggaGRkX2Nvbm5HZXRDb25uZWN0ZWRCc3NUeXBlKCBwSGRkU3RhQ3R4LCAmY29ubmVjdGVkQnNzVHlwZSApIHx8CisgICAgICAgICAgICAgKCBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGVfaW5kZXBlbmRlbnQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5Eb3QxMURlc2lyZWRCc3NUeXBlICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgICAgICAgICAgLy8gbmVlZCB0byBpc3N1ZSBhIGRpc2Nvbm5lY3QgdG8gQ1NSLiAKKyAgICAgICAgICAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3Zhcik7CisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzbWVfUm9hbURpc2Nvbm5lY3QoIGhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQgKTsKKworICAgICAgICAgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cykKKyAgICAgICAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworICAgICAgICB9CisgICAgfQorICAgIC8qKiB3cGFfc3VwcGxpY2FudCAwLjgueCwgd2V4dCBkcml2ZXIgdXNlcyAqLworICAgIGVsc2UgCisgICAgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgLyoqIHdwYV9zdXBwbGljYW50IDAuOC54LCB3ZXh0IGRyaXZlciB1c2VzICovCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAgLyoqIHdoZW4gY2ZnODAyMTEgZGVmaW5lZCwgd3BhX3N1cHBsaWNhbnQgd2V4dCBkcml2ZXIgdXNlcyAKKyAgICAgIHplcm8tbGVuZ3RoLCBudWxsLXN0cmluZyBzc2lkIGZvciBmb3JjZSBkaXNjb25uZWN0aW9uLiAKKyAgICAgIGFmdGVyIGRpc2Nvbm5lY3Rpb24gKGlmIHByZXZpb3VzbHkgY29ubmVjdGVkKSBhbmQgY2xlYW5pbmcgc3NpZCwgCisgICAgICBkcml2ZXIgTVVTVCByZXR1cm4gc3VjY2VzcyAqLworICAgIGlmICggMCA9PSB3cnF1LT5lc3NpZC5sZW5ndGggKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZgorCisgICAgc3RhdHVzID0gaGRkX3dtbV9nZXRfdWFwc2RfbWFzayhwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS51YXBzZF9tYXNrKTsKKyAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICB7CisgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUudWFwc2RfbWFzayA9IDA7CisgICAgfQorICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLlNTSURzLm51bU9mU1NJRHMgPSAxOworICAgICAKKyAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5TU0lEcy5TU0lETGlzdC0+U1NJRC5sZW5ndGggPSB3cnF1LT5lc3NpZC5sZW5ndGg7CisgICAKKyAgICB2b3NfbWVtX3plcm8ocFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuU1NJRHMuU1NJRExpc3QtPlNTSUQuc3NJZCwgc2l6ZW9mKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0LT5TU0lELnNzSWQpKTsgCisgICAgdm9zX21lbV9jb3B5KCh2b2lkICopKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0LT5TU0lELnNzSWQpLCBleHRyYSwgd3JxdS0+ZXNzaWQubGVuZ3RoKTsKKyAgICBpZiAoSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEgPT0gcFdleHRTdGF0ZS0+d3BhVmVyc2lvbiB8fAorICAgICAgICBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIgPT0gcFdleHRTdGF0ZS0+d3BhVmVyc2lvbiApIHsKKyAgIAorICAgICAgICAvL3NldCBnZW4gaWUKKyAgICAgICAgaGRkX1NldEdFTklFVG9Dc3IocEFkYXB0ZXIsICZSU05BdXRoVHlwZSk7CisKKyAgICAgICAgLy9zZXQgYXV0aAorICAgICAgICBoZGRfc2V0X2Nzcl9hdXRoX3R5cGUocEFkYXB0ZXIsIFJTTkF1dGhUeXBlKTsKKyAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBTZXR0aW5nIFdBUEkgQVVUSCBUeXBlIGFuZCBFbmNyeXB0aW9uIE1vZGUgdmFsdWVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAocEFkYXB0ZXItPndhcGlfaW5mby5uV2FwaU1vZGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHBBZGFwdGVyLT53YXBpX2luZm8ud2FwaUF1dGhNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFdBUElfQVVUSF9NT0RFX1BTSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIiVzOiBXQVBJIEFVVEggVFlQRTogUFNLOiAlZCIsIF9fRlVOQ1RJT05fXywgcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUpOworICAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9IGVDU1JfQVVUSF9UWVBFX1dBUElfV0FJX1BTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgV0FQSV9BVVRIX01PREVfQ0VSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIiVzOiBXQVBJIEFVVEggVFlQRTogQ0VSVDogJWQiLCBfX0ZVTkNUSU9OX18sIHBBZGFwdGVyLT53YXBpX2luZm8ud2FwaUF1dGhNb2RlKTsKKyAgICAgICAgICAgICAgICBwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworICAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9DRVJUSUZJQ0FURTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBFbmQgb2Ygc3dpdGNoCisgICAgICAgIGlmICggcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUgPT0gV0FQSV9BVVRIX01PREVfUFNLIHx8CisgICAgICAgICAgICAgcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUgPT0gV0FQSV9BVVRIX01PREVfQ0VSVCkKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKExPRzEsICIlczogV0FQSSBQQUlSV0lTRS9HUk9VUCBFTkNSWVBUSU9OOiBXUEkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk7CisgICAgICAgICAgICBwUm9hbVByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgICAgICBwUm9hbVByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyAgICAvKiBpZiBwcmV2aW91cyBnZW5JRSBpcyBub3QgTlVMTCwgdXBkYXRlIEFzc29jSUUgKi8KKyAgICBpZiAoMCAhPSBwV2V4dFN0YXRlLT5nZW5JRS5sZW5ndGgpCisgICAgeworICAgICAgICBtZW1zZXQoICZwV2V4dFN0YXRlLT5hc3NvY0FkZElFLCAwLCBzaXplb2YocFdleHRTdGF0ZS0+YXNzb2NBZGRJRSkgKTsKKyAgICAgICAgbWVtY3B5KCBwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YSwgcFdleHRTdGF0ZS0+Z2VuSUUuYWRkSUVkYXRhLAorICAgICAgICAgICAgcFdleHRTdGF0ZS0+Z2VuSUUubGVuZ3RoKTsKKyAgICAgICAgcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggPSBwV2V4dFN0YXRlLT5nZW5JRS5sZW5ndGg7CisgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBBZGRJRUFzc29jID0gcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5hZGRJRWRhdGE7CisgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5BZGRJRUFzc29jTGVuZ3RoID0gcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGg7CisKKyAgICAgICAgLyogY2xlYXIgcHJldmlvdXMgZ2VuSUUgYWZ0ZXIgdXNlIGl0ICovCisgICAgICAgIG1lbXNldCggJnBXZXh0U3RhdGUtPmdlbklFLCAwLCBzaXplb2YocFdleHRTdGF0ZS0+Z2VuSUUpICk7CisgICAgfQorCisgICAgLyogYXNzdW1lcyBpdCBpcyBub3QgV1BTIEFzc29jaWF0aW9uIGJ5IGRlZmF1bHQsIGV4Y2VwdCB3aGVuIHBBZGRJRUFzc29jIGhhcyBXUFMgSUUgKi8KKyAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5iV1BTQXNzb2NpYXRpb24gPSBGQUxTRTsKKworICAgIGlmIChOVUxMICE9IHdsYW5faGRkX2dldF93cHNfaWVfcHRyKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBBZGRJRUFzc29jLAorICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uQWRkSUVBc3NvY0xlbmd0aCkpCisgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLmJXUFNBc3NvY2lhdGlvbiA9IFRSVUU7CisKKworICAgIC8vIERpc2FibGUgYXV0byBCTVBTIGVudHJ5IGJ5IFBNQyB1bnRpbCBESENQIGlzIGRvbmUKKyAgICBzbWVfU2V0REhDUFRpbGxQb3dlckFjdGl2ZUZsYWcoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCBUUlVFKTsKKworICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLmNzclBlcnNvbmEgPSBwQWRhcHRlci0+ZGV2aWNlX21vZGU7IAorICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzQW1wQWxsb3dlZCA9IFZPU19GQUxTRTsKKyAgICBzdGF0dXMgPSBzbWVfUm9hbUNvbm5lY3QoIGhIYWwscEFkYXB0ZXItPnNlc3Npb25JZCwgJihwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZSksJnJvYW1JZCk7CisgICAgcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7IAorICAgIHBSb2FtUHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDA7CisKKyAgICBFWElUKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIGl3X2dldF9lc3NpZCgpIC0gCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVzc2lkIHRvIHRoZSB3cGFfc3VwcGxpY2FudC4KKyAgIAorICBccGFyYW0gIC0gZGV2IC0gUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAgICAgICAgICAgICAgLSBpbmZvIC0gUG9pbnRlciB0byB0aGUgaXdfcmVxdWVzdF9pbmZvLgorICAgICAgICAgICAgICAtIHdycXUgLSBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICAgICAgICAgICAgICAtIGV4dHJhIC0gUG9pbnRlciB0byB0aGUgZGF0YS4gICAgICAgIAorICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBpd19nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgaGRkX3dleHRfc3RhdGVfdCAqd2V4dEJ1ZiA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7IAorICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgIEVOVEVSKCk7CisKKyAgIGlmKChwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID09IGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCAmJgorICAgICB3ZXh0QnVmLT5yb2FtUHJvZmlsZS5TU0lEcy5TU0lETGlzdC0+U1NJRC5sZW5ndGggPiAwKSB8fAorICAgICAgKChwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID09IGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCB8fAorICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID09IGVDb25uZWN0aW9uU3RhdGVfSWJzc0Rpc2Nvbm5lY3RlZCkgJiYKKyAgICAgICAgd2V4dEJ1Zi0+cm9hbVByb2ZpbGUuU1NJRHMuU1NJRExpc3QtPlNTSUQubGVuZ3RoID4gMCkpCisgICB7CisgICAgICAgZHdycS0+bGVuZ3RoID0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLlNTSUQuU1NJRC5sZW5ndGg7CisgICAgICAgbWVtY3B5KGV4dHJhLCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uU1NJRC5TU0lELnNzSWQsIGR3cnEtPmxlbmd0aCk7CisgICAgICAgZHdycS0+ZmxhZ3MgPSAxOworICAgfSBlbHNlIHsKKyAgICAgICBtZW1zZXQoZXh0cmEsIDAsIGR3cnEtPmxlbmd0aCk7CisgICAgICAgZHdycS0+bGVuZ3RoID0gMDsKKyAgICAgICBkd3JxLT5mbGFncyA9IDA7CisgICB9CisgICBFWElUKCk7CisgICByZXR1cm4gMDsKK30KKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIGl3X3NldF9hdXRoKCkgLSAKKyAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYXV0aCB0eXBlIHJlY2VpdmVkIGZyb20gdGhlIHdwYV9zdXBwbGljYW50LgorICAgCisgIFxwYXJhbSAgLSBkZXYgLSBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICAgICAgICAgICAgICAtIGluZm8gLSBQb2ludGVyIHRvIHRoZSBpd19yZXF1ZXN0X2luZm8uCisgICAgICAgICAgICAgIC0gd3JxdSAtIFBvaW50ZXIgdG8gdGhlIGl3cmVxX2RhdGEuCisgICAgICAgICAgICAgIC0gZXh0cmEgLSBQb2ludGVyIHRvIHRoZSBkYXRhLiAgICAgICAgCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGl3X3NldF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqZXh0cmEpCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7IAorICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgIHRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlID0gJnBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlOworICAgZUNzckVuY3J5cHRpb25UeXBlIG1jRW5jcnlwdGlvblR5cGU7ICAgCisgICBlQ3NyRW5jcnlwdGlvblR5cGUgdWNFbmNyeXB0aW9uVHlwZTsKKyAgIAorICAgRU5URVIoKTsKKyAgIHN3aXRjaCh3cnF1LT5wYXJhbS5mbGFncyAmIElXX0FVVEhfSU5ERVgpCisgICB7CisgICAgICBjYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisgICAgICAgIAorICAgICAgICAgcFdleHRTdGF0ZS0+d3BhVmVyc2lvbiA9IHdycXUtPnBhcmFtLnZhbHVlOworICAgICAgIAorICAgICAgICAgYnJlYWs7CisgICAKKyAgIGNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisgICB7CisgICAgICBpZih3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfQ0lQSEVSX05PTkUpIHsgICAgICAgICAgICAKKyAgICAgICAgIHVjRW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgICAgfSAgICAgICAgICAgCisgICAgICBlbHNlIGlmKHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9DSVBIRVJfVEtJUCkgeworICAgICAgICAgdWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1RLSVA7CisgICAgICB9ICAgICAgICAgICAgCisgICAgICBlbHNlIGlmKHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9DSVBIRVJfQ0NNUCkgeworICAgICAgICAgdWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0FFUzsKKyAgICAgIH0gICAgCisgICAgICAgICAgICAKKyAgICAgZWxzZSBpZih3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfQ0lQSEVSX1dFUDQwKSB7CisgICAgICAgICAgIAorICAgICAgICAgaWYoIChJV19BVVRIX0tFWV9NR01UXzgwMl8xWCAKKyAgICAgICAgICAgICAgICAgICAgID09IChwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSAgKSAKKyAgICAgICAgICAgICAgICAgJiYgKGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkgKQorICAgICAgICAgICAgICAgIC8qRHluYW1pYyBXRVAga2V5Ki8KKyAgICAgICAgICAgICB1Y0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA7ICAgICAKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvKlN0YXRpYyBXRVAga2V5Ki8KKyAgICAgICAgICAgICB1Y0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOyAgICAgICAgICAgICAgCisgICAgICB9ICAgICAgCisgICAgICBlbHNlIGlmKHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9DSVBIRVJfV0VQMTA0KSB7CisgICAgICAgICAgIAorICAgICAgICAgaWYoICggSVdfQVVUSF9LRVlfTUdNVF84MDJfMVggCisgICAgICAgICAgICAgICAgICAgICA9PSAocFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgJiBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkgKSAKKyAgICAgICAgICAgICAgICAgJiYgKGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkpCisgICAgICAgICAgICAgICAgICAvKkR5bmFtaWMgV0VQIGtleSovCisgICAgICAgICAgICB1Y0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OworICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8qU3RhdGljIFdFUCBrZXkqLworICAgICAgICAgICAgdWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk7CisgICAgICAgICAgICAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAKKyAgICAgICAgICAgICAgIGhkZExvZyhMT0dXLCAiJXMgdmFsdWUgJWQgVU5LTk9XTiBJV19BVVRIX0NJUEhFUiIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3cnF1LT5wYXJhbS52YWx1ZSk7IAorICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICB9CisgICAgICAgCisgICAgICAgICBwUm9hbVByb2ZpbGUtPkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworICAgICAgICAgcFJvYW1Qcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IHVjRW5jcnlwdGlvblR5cGU7CisgICAgICB9ICAgICAKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKyAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICBpZih3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfQ0lQSEVSX05PTkUpIHsKKyAgICAgICAgICAgIG1jRW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgICAgfQorICAgICAgICAKKyAgICAgIGVsc2UgaWYod3JxdS0+cGFyYW0udmFsdWUgJiBJV19BVVRIX0NJUEhFUl9US0lQKSB7CisgICAgICAgICAgICAgbWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1RLSVA7CisgICAgICB9CisgICAgICAgIAorICAgICAgZWxzZSBpZih3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfQ0lQSEVSX0NDTVApIHsgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBtY0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworICAgICAgfQorICAgICAgICAKKyAgICAgIGVsc2UgaWYod3JxdS0+cGFyYW0udmFsdWUgJiBJV19BVVRIX0NJUEhFUl9XRVA0MCkgeworICAgICAgICAgICAKKyAgICAgICAgIGlmKCAoIElXX0FVVEhfS0VZX01HTVRfODAyXzFYIAorICAgICAgICAgICAgICAgICAgICAgPT0gKHBXZXh0U3RhdGUtPmF1dGhLZXlNZ210ICYgSVdfQVVUSF9LRVlfTUdNVF84MDJfMVggKSkgCisgICAgICAgICAgICAgICAgICYmIChlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSA9PSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUpKSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgbWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOworICAgICAgICAgICAgCisgICAgICAgICBlbHNlICAgICAgICAgICAgCisgICAgICAgICAgICAgICBtY0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOyAKKyAgICAgIH0KKyAgICAgICAgCisgICAgICBlbHNlIGlmKHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9DSVBIRVJfV0VQMTA0KSAKKyAgICAgIHsgICAgIAorICAgICAgICAgICAgIC8qRHluYW1pYyBXRVAga2V5cyB3b24ndCB3b3JrIHdpdGggc2hhcmVkIGtleXMqLworICAgICAgICAgaWYoICggSVdfQVVUSF9LRVlfTUdNVF84MDJfMVggCisgICAgICAgICAgICAgICAgICAgICA9PSAocFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgJiBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkpIAorICAgICAgICAgICAgICAgICAmJiAoZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0gPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG1jRW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBtY0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgICAKKyAgICAgICAgICBoZGRMb2coTE9HVywgIiVzIHZhbHVlICVkIFVOS05PV04gSVdfQVVUSF9DSVBIRVIiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdycXUtPnBhcmFtLnZhbHVlKTsgCisgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgIHBSb2FtUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICAgICAgIHBSb2FtUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IG1jRW5jcnlwdGlvblR5cGU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorICAgICAgeworICAgICAgICAgICAvKlNhdmUgdGhlIGF1dGggYWxnbyBoZXJlIGFuZCBzZXQgYXV0aCB0eXBlIHRvIFNNRSBSb2FtIHByb2ZpbGUKKyAgICAgICAgICAgICAgICBpbiB0aGUgaXdfc2V0X2FwX2FkZHJlc3MqLworICAgICAgICAgIGlmKCB3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNKSAgICAKKyAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKyAgICAgICAgICAKKyAgICAgICAgICBlbHNlIGlmKHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKKyAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOworCisgICAgICAgICAgZWxzZSBpZih3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfQUxHX0xFQVApCisgICAgICAgICAgICAvKk5vdCBzdXBwb3J0ZWQqLworICAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOworICAgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKyAgICAgIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisjZGVmaW5lIElXX0FVVEhfS0VZX01HTVRfQ0NLTSAgICAgICA4ICAvKiBTaG91bGQgYmUgaW4gbGludXgvd2lyZWxlc3MuaCAqLworICAgICAgICAgLypDaGVjayBmb3IgQ0NLTSBBS00gdHlwZSAqLworICAgICAgICAgaWYgKCB3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfS0VZX01HTVRfQ0NLTSkgeworICAgICAgICAgICAgLy9oZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwiJXM6IENDS00gQUtNIFNldCAlZFxuIiwgX19GVU5DVElPTl9fLCB3cnF1LT5wYXJhbS52YWx1ZSk7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sIiVzOiBDQ0tNIEFLTSBTZXQgJWRcbiIsIF9fRlVOQ1RJT05fXywgd3JxdS0+cGFyYW0udmFsdWUpOworICAgICAgICAgICAgLyogU2V0IHRoZSBDQ0tNIGJpdCBpbiBhdXRoS2V5TWdtdCAqLyAKKyAgICAgICAgICAgIC8qIFJpZ2h0IG5vdywgdGhpcyBicmVha3MgYWxsIHJlZiB0byBhdXRoS2V5TWdtdCBiZWNhdXNlIG91ciAKKyAgICAgICAgICAgICAqIGNvZGUgZG9lc24ndCByZWFsaXplIGl0IGlzIGEgImJpdGZpZWxkIiAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgfD0gSVdfQVVUSF9LRVlfTUdNVF9DQ0tNOworICAgICAgICAgICAgLypTZXQgdGhlIGtleSBtYW5hZ2VtZW50IHRvIDgwMi4xWCovCisgICAgICAgICAgICAvL3BXZXh0U3RhdGUtPmF1dGhLZXlNZ210ID0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVg7CisgICAgICAgICAgICBwV2V4dFN0YXRlLT5pc0NDWENvbm5lY3Rpb24gPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIC8vVGhpcyBpcyB0ZXN0IGNvZGUuIEkgbmVlZCB0byBhY3R1YWxseSBLTk9XIHdoZXRoZXIgdGhpcyBpcyBhbiBSU04gQXNzb2Mgb3IgV1BBLgorICAgICAgICAgICAgcFdleHRTdGF0ZS0+Y29sbGVjdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1JTTjsKKyAgICAgICAgIH0gZWxzZSBpZiAoIHdycXUtPnBhcmFtLnZhbHVlICYgSVdfQVVUSF9LRVlfTUdNVF9QU0spIHsKKyAgICAgICAgICAgIC8qU2F2ZSB0aGUga2V5IG1hbmFnZW1lbnQqLworICAgICAgICAgICAgcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgfD0gSVdfQVVUSF9LRVlfTUdNVF9QU0s7CisgICAgICAgICAgICAvL3BXZXh0U3RhdGUtPmF1dGhLZXlNZ210ID0gd3JxdS0+cGFyYW0udmFsdWU7CisgICAgICAgICAgICAvL1RoaXMgaXMgdGVzdCBjb2RlLiBJIG5lZWQgdG8gYWN0dWFsbHkgS05PVyB3aGV0aGVyIHRoaXMgaXMgYW4gUlNOIEFzc29jIG9yIFdQQS4KKyAgICAgICAgICAgIHBXZXh0U3RhdGUtPmNvbGxlY3RlZEF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfUlNOOworICAgICAgICAgfSBlbHNlIGlmICghKCB3cnF1LT5wYXJhbS52YWx1ZSAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSkgeworICAgICAgICAgICAgcFdleHRTdGF0ZS0+Y29sbGVjdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9OT05FOyAvL2VDU1JfQVVUSF9UWVBFX1dQQV9OT05FCisgICAgICAgICAgICAvKlNhdmUgdGhlIGtleSBtYW5hZ2VtZW50IGFueXdheSovCisgICAgICAgICAgICBwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCA9IHdycXUtPnBhcmFtLnZhbHVlOworICAgICAgICAgfSBlbHNlIHsgLy8gSXQgbXVzdCBiZSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWAorICAgICAgICAgICAgLypTYXZlIHRoZSBrZXkgbWFuYWdlbWVudCovCisgICAgICAgICAgICBwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCB8PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWDsKKyAgICAgICAgICAgIC8vcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgPSB3cnF1LT5wYXJhbS52YWx1ZTsKKyAgICAgICAgICAgIC8vVGhpcyBpcyB0ZXN0IGNvZGUuIEkgbmVlZCB0byBhY3R1YWxseSBLTk9XIHdoZXRoZXIgdGhpcyBpcyBhbiBSU04gQXNzb2Mgb3IgV1BBLgorICAgICAgICAgICAgcFdleHRTdGF0ZS0+Y29sbGVjdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9SU047CisgICAgICAgICB9CisjZWxzZQorICAgICAgICAgLypTYXZlIHRoZSBrZXkgbWFuYWdlbWVudCovCisgICAgICAgICBwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCA9IHdycXUtPnBhcmFtLnZhbHVlOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6CisgICAgICB7CisgICAgICAgICBpZih3cnF1LT5wYXJhbS52YWx1ZSkgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIkNvdW50ZXIgTWVhc3VyZSBzdGFydGVkICVkIiwgd3JxdS0+cGFyYW0udmFsdWUpOworICAgICAgICAgICAgcFdleHRTdGF0ZS0+bVRLSVBDb3VudGVyTWVhc3VyZXMgPSBUS0lQX0NPVU5URVJfTUVBU1VSRV9TVEFSVEVEOworICAgICAgICAgfQorICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiQ291bnRlciBNZWFzdXJlIHN0b3BwZWQ9JWQiLCB3cnF1LT5wYXJhbS52YWx1ZSk7CisgICAgICAgICAgICBwV2V4dFN0YXRlLT5tVEtJUENvdW50ZXJNZWFzdXJlcyA9IFRLSVBfQ09VTlRFUl9NRUFTVVJFX1NUT1BFRDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICBjYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisgICAgICBjYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisgICAgICBjYXNlIElXX0FVVEhfUk9BTUlOR19DT05UUk9MOgorICAgICAgY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKyAgICAgICAgIAorICAgICAgZGVmYXVsdDoKKyAgICAgICAgIAorICAgICAgICAgaGRkTG9nKExPR1csICIlcyBjYWxsZWQgd2l0aCB1bnN1cHBvcnRlZCBhdXRoIHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICB3cnF1LT5wYXJhbS5mbGFncyAmIElXX0FVVEhfSU5ERVgpOworICAgICAgYnJlYWs7CisgICB9CisgICAKKyAgIEVYSVQoKTsKKyAgIHJldHVybiAwOworfQorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgCisgIFxicmllZiBpd19nZXRfYXV0aCgpIC0gCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGF1dGggdHlwZSB0byB0aGUgd3BhX3N1cHBsaWNhbnQuCisgICAKKyAgXHBhcmFtICAtIGRldiAtIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgICAgICAgICAgICAgIC0gaW5mbyAtIFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAgICAgICAgICAgICAgLSB3cnF1IC0gUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAgICAgICAgICAgICAgLSBleHRyYSAtIFBvaW50ZXIgdG8gdGhlIGRhdGEuICAgICAgICAKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaXdfZ2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOyAKKyAgICB0Q3NyUm9hbVByb2ZpbGUgKnBSb2FtUHJvZmlsZSA9ICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZTsKKyAgICBFTlRFUigpOworICAgIHN3aXRjaChwUm9hbVByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBX05PTkU6CisgICAgICAgICAgICB3cnF1LT5wYXJhbS5mbGFncyA9IElXX0FVVEhfV1BBX1ZFUlNJT047CisgICAgICAgICAgICB3cnF1LT5wYXJhbS52YWx1ZSA9ICBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBOgorICAgICAgICAgICAgd3JxdS0+cGFyYW0uZmxhZ3MgPSBJV19BVVRIX1dQQV9WRVJTSU9OOworICAgICAgICAgICAgd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfRlRfUlNOOgorI2VuZGlmCisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfUlNOOgorICAgICAgICAgICAgd3JxdS0+cGFyYW0uZmxhZ3MgPSBJV19BVVRIX1dQQV9WRVJTSU9OOworICAgICAgICAgICAgd3JxdS0+cGFyYW0udmFsdWUgPSAgSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOgorICAgICAgICAgICAgIHdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk6CisgICAgICAgICAgICAgd3JxdS0+cGFyYW0udmFsdWUgPSAgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjoKKyAgICAgICAgICAgICBoZGRMb2coTE9HMSwiJXMgY2FsbGVkIHdpdGggdW5rbm93biBhdXRoIHR5cGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgIHdycXUtPnBhcmFtLnZhbHVlID0gIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9BVVRPU1dJVENIOgorICAgICAgICAgICAgIHdycXUtPnBhcmFtLnZhbHVlID0gIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLOgorICAgICAgICAgICAgIGhkZExvZyhMT0cxLCIlcyBjYWxsZWQgd2l0aCB1bmtub3duIGF1dGggdHlwZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKKyAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9GVF9SU05fUFNLOgorI2VuZGlmCisgICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1JTTl9QU0s6CisgICAgICAgICAgICAgaGRkTG9nKExPRzEsIiVzIGNhbGxlZCB3aXRoIHVua25vd24gYXV0aCB0eXBlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICB3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworICAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICBoZGRMb2coTE9HMSwiJXMgY2FsbGVkIHdpdGggdW5rbm93biBhdXRoIHR5cGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgIHdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIGlmKCgod3JxdS0+cGFyYW0uZmxhZ3MgJiBJV19BVVRIX0lOREVYKSA9PSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSkpCisgICAgeworICAgICAgICBzd2l0Y2gocFJvYW1Qcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOgorICAgICAgICAgICAgICAgIHdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9DSVBIRVJfTk9ORTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA6CisgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWToKKyAgICAgICAgICAgICAgICB3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfQ0lQSEVSX1dFUDQwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQOgorICAgICAgICAgICAgICAgIHdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9DSVBIRVJfVEtJUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OgorICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorICAgICAgICAgICAgICAgIHdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM6CisgICAgICAgICAgICAgICAgd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX0NJUEhFUl9DQ01QOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIiVzIGNhbGxlZCB3aXRoIHVua25vd24gYXV0aCB0eXBlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorICAgfQorCisgICAgaWYoKCh3cnF1LT5wYXJhbS5mbGFncyAmIElXX0FVVEhfSU5ERVgpID09IElXX0FVVEhfQ0lQSEVSX0dST1VQKSkgCisgICAgeworICAgICAgICBzd2l0Y2gocFJvYW1Qcm9maWxlLT5uZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX05PTkU6CisgICAgICAgICAgICB3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfQ0lQSEVSX05PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDoKKyAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk6CisgICAgICAgICAgICB3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfQ0lQSEVSX1dFUDQwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDoKKyAgICAgICAgICAgIHdycXUtPnBhcmFtLnZhbHVlID0gSVdfQVVUSF9DSVBIRVJfVEtJUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ6CisgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk6CisgICAgICAgICAgICAgd3JxdS0+cGFyYW0udmFsdWUgPSBJV19BVVRIX0NJUEhFUl9XRVAxMDQ7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX0FFUzoKKyAgICAgICAgICAgICB3cnF1LT5wYXJhbS52YWx1ZSA9IElXX0FVVEhfQ0lQSEVSX0NDTVA7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgIGhkZExvZyhMT0cxLCAiJXMgY2FsbGVkIHdpdGggdW5rbm93biBhdXRoIHR5cGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgfQorICAgfQorCisgICAgaGRkTG9nKExPRzEsICIlcyBjYWxsZWQgd2l0aCBhdXRoIHR5cGUgJWQiLAorICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0pOworICAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKK30KKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIGl3X3NldF9hcF9hZGRyZXNzKCkgLSAKKyAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIHNtZV9Sb2FtQ29ubmVjdCBmdW5jdGlvbiB0byBhc3NvY2lhdGUgCisgICB0byB0aGUgQVAgd2l0aCB0aGUgc3BlY2lmaWVkIEJTU0lEIHJlY2VpdmVkIGZyb20gdGhlIHdwYV9zdXBwbGljYW50LgorICAgCisgIFxwYXJhbSAgLSBkZXYgLSBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICAgICAgICAgICAgICAtIGluZm8gLSBQb2ludGVyIHRvIHRoZSBpd19yZXF1ZXN0X2luZm8uCisgICAgICAgICAgICAgIC0gd3JxdSAtIFBvaW50ZXIgdG8gdGhlIGl3cmVxX2RhdGEuCisgICAgICAgICAgICAgIC0gZXh0cmEgLSBQb2ludGVyIHRvIHRoZSBkYXRhLiAgICAgICAgCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGl3X3NldF9hcF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KSk7CisgICAgdl9VOF90ICAqcE1hY0FkZHJlc3M9TlVMTDsKKyAgICBFTlRFUigpOworICAgIHBNYWNBZGRyZXNzID0gKHZfVThfdCopIHdycXUtPmFwX2FkZHIuc2FfZGF0YTsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLHBNYWNBZGRyZXNzWzBdLHBNYWNBZGRyZXNzWzFdLAorICAgICAgICAgIHBNYWNBZGRyZXNzWzJdLHBNYWNBZGRyZXNzWzNdLHBNYWNBZGRyZXNzWzRdLHBNYWNBZGRyZXNzWzVdKTsKKyAgICB2b3NfbWVtX2NvcHkoIHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZCwgcE1hY0FkZHJlc3MsIHNpemVvZiggdENzckJzc2lkICkpOworICAgIEVYSVQoKTsKKyAgIAorICAgIHJldHVybiAwOworfQorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgaXdfZ2V0X2FwX2FkZHJlc3MoKSAtIAorICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBCU1NJRCB0byB0aGUgd3BhX3N1cHBsaWNhbnQKKyAgXHBhcmFtICAtIGRldiAtIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgICAgICAgICAgICAgIC0gaW5mbyAtIFBvaW50ZXIgdG8gdGhlIGl3X3JlcXVlc3RfaW5mby4KKyAgICAgICAgICAgICAgLSB3cnF1IC0gUG9pbnRlciB0byB0aGUgaXdyZXFfZGF0YS4KKyAgICAgICAgICAgICAgLSBleHRyYSAtIFBvaW50ZXIgdG8gdGhlIGRhdGEuICAgICAgICAKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaXdfZ2V0X2FwX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgLy9oZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KSk7CisKKyAgICBFTlRFUigpOworCisgICAgaWYgKChwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID09IGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCkgfHwKKyAgICAgICAgKGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCA9PSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSkKKyAgICB7CisgICAgICAgIG1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEscEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkLHNpemVvZih3cnF1LT5hcF9hZGRyLnNhX2RhdGEpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWVtc2V0KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwwLHNpemVvZih3cnF1LT5hcF9hZGRyLnNhX2RhdGEpKTsKKyAgICB9CisgICAgRVhJVCgpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvc3JjL3dsYW5faGRkX2NmZy5jIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX2NmZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjExNTUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfY2ZnLmMKQEAgLTAsMCArMSwzMTIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKworICAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUgCisgICAKKyAgIAorICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4gCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuIAorICAgCisgICAKKyAgJEhlYWRlcjokICAgJERhdGVUaW1lOiAkICRBdXRob3I6ICQgCisgICAKKyAgIAorICB3aGVuICAgICAgICB3aG8gICAgd2hhdCwgd2hlcmUsIHdoeSAKKyAgLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDA3LzI3LzA5ICAgIGthbmFuZCBDcmVhdGVkIG1vZHVsZS4gCisKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX21haW4uaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9hc3NvYy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2NmZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPHZvc190eXBlcy5oPgorI2luY2x1ZGUgPGNzckFwaS5oPgorI2luY2x1ZGUgPHBtY0FwaS5oPgorI2luY2x1ZGUgPHdsYW5faGRkX21pc2MuaD4KKworCitSRUdfVEFCTEVfRU5UUlkgZ19yZWdpc3RyeV90YWJsZVtdID0KK3sKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1JUU19USFJFU0hPTERfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIFJUU1RocmVzaG9sZCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19SVFNfVEhSRVNIT0xEX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUlRTX1RIUkVTSE9MRF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUlRTX1RIUkVTSE9MRF9NQVggKSwgCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0ZSQUdfVEhSRVNIT0xEX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBGcmFnbWVudGF0aW9uVGhyZXNob2xkLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0ZSQUdfVEhSRVNIT0xEX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRlJBR19USFJFU0hPTERfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0ZSQUdfVEhSRVNIT0xEX01BWCApLCAgICAgICAgICAgICAgCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0NBTElCUkFUSU9OX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBDYWxpYnJhdGlvbiwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19DQUxJQlJBVElPTl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0NBTElCUkFUSU9OX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19DQUxJQlJBVElPTl9NQVggKSwKKyAgICAgICAgICAgICAgICAKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0NBTElCUkFUSU9OX1BFUklPRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgQ2FsaWJyYXRpb25QZXJpb2QsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfQ0FMSUJSQVRJT05fUEVSSU9EX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfQ0FMSUJSQVRJT05fUEVSSU9EX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19DQUxJQlJBVElPTl9QRVJJT0RfTUFYICksIAorCisgICBSRUdfVkFSSUFCTEUoIENGR19PUEVSQVRJTkdfQ0hBTk5FTF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgT3BlcmF0aW5nQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX09QRVJBVElOR19DSEFOTkVMX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfT1BFUkFUSU5HX0NIQU5ORUxfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX09QRVJBVElOR19DSEFOTkVMX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgU2hvcnRTbG90VGltZUVuYWJsZWQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssIAorICAgICAgICAgICAgICAgICBDRkdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHXzExRF9TVVBQT1JUX0VOQUJMRURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIElzMTFkU3VwcG9ydEVuYWJsZWQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssIAorICAgICAgICAgICAgICAgICBDRkdfMTFEX1NVUFBPUlRfRU5BQkxFRF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHXzExRF9TVVBQT1JUX0VOQUJMRURfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHXzExRF9TVVBQT1JUX0VOQUJMRURfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0VORk9SQ0VfMTFEX0NIQU5ORUxTX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBmRW5mb3JjZTExZENoYW5uZWxzLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VORk9SQ0VfMTFEX0NIQU5ORUxTX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRU5GT1JDRV8xMURfQ0hBTk5FTFNfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VORk9SQ0VfMTFEX0NIQU5ORUxTX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19DT1VOVFJZX0NPREVfUFJJT1JJVFlfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywgCisgICAgICAgICAgICAgICAgIENGR19DT1VOVFJZX0NPREVfUFJJT1JJVFlfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19DT1VOVFJZX0NPREVfUFJJT1JJVFlfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0NPVU5UUllfQ09ERV9QUklPUklUWV9NQVgpLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19FTkZPUkNFX0NPVU5UUllfQ09ERV9NQVRDSF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZkVuZm9yY2VDb3VudHJ5Q29kZU1hdGNoLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VORk9SQ0VfQ09VTlRSWV9DT0RFX01BVENIX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRU5GT1JDRV9DT1VOVFJZX0NPREVfTUFUQ0hfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VORk9SQ0VfQ09VTlRSWV9DT0RFX01BVENIX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19FTkZPUkNFX0RFRkFVTFRfRE9NQUlOX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBmRW5mb3JjZURlZmF1bHREb21haW4sIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssIAorICAgICAgICAgICAgICAgICBDRkdfRU5GT1JDRV9ERUZBVUxUX0RPTUFJTl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VORk9SQ0VfREVGQVVMVF9ET01BSU5fTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VORk9SQ0VfREVGQVVMVF9ET01BSU5fTUFYICksCisgICAgICAgICAgICAgICAgCisgICBSRUdfVkFSSUFCTEUoIENGR19HRU5FUklDX0lEMV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgQ2ZnMUlkLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfR0VORVJJQ19JRDFfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX0lEMV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfR0VORVJJQ19JRDFfTUFYICksCisgICAgICAgICAgICAgICAgCisgICBSRUdfVkFSSUFCTEUoIENGR19HRU5FUklDX0lEMl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgQ2ZnMklkLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfR0VORVJJQ19JRDJfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX0lEMl9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfR0VORVJJQ19JRDJfTUFYICksCisgICAgICAgICAgICAgICAgCisgICBSRUdfVkFSSUFCTEUoIENGR19HRU5FUklDX0lEM19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgQ2ZnM0lkLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfR0VORVJJQ19JRDNfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX0lEM19NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfR0VORVJJQ19JRDNfTUFYICksCisgICAgICAgICAgICAgICAgCisgICBSRUdfVkFSSUFCTEUoIENGR19HRU5FUklDX0lENF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgQ2ZnNElkLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfR0VORVJJQ19JRDRfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX0lENF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfR0VORVJJQ19JRDRfTUFYICksCisgICAgICAgICAgICAgICAgCisgICBSRUdfVkFSSUFCTEUoIENGR19HRU5FUklDX0lENV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgQ2ZnNUlkLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfR0VORVJJQ19JRDVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX0lENV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfR0VORVJJQ19JRDVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0dFTkVSSUNfVkFMVUUxX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBDZmcxVmFsdWUsCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX1ZBTFVFMV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0dFTkVSSUNfVkFMVUUxX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX1ZBTFVFMV9NQVggKSwKKyAgICAgICAgICAgICAgICAKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0dFTkVSSUNfVkFMVUUyX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBDZmcyVmFsdWUsCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX1ZBTFVFMl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0dFTkVSSUNfVkFMVUUyX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX1ZBTFVFMl9NQVggKSwKKyAgICAgICAgICAgICAgICAKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0dFTkVSSUNfVkFMVUUzX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBDZmczVmFsdWUsCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX1ZBTFVFM19ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0dFTkVSSUNfVkFMVUUzX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX1ZBTFVFM19NQVggKSwKKyAgICAgICAgICAgICAgICAKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0dFTkVSSUNfVkFMVUU0X05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBDZmc0VmFsdWUsCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX1ZBTFVFNF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0dFTkVSSUNfVkFMVUU0X01JTiwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX1ZBTFVFNF9NQVggKSwKKyAgICAgICAgICAgICAgICAKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0dFTkVSSUNfVkFMVUU1X05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBDZmc1VmFsdWUsCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX1ZBTFVFNV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0dFTkVSSUNfVkFMVUU1X01JTiwgCisgICAgICAgICAgICAgICAgIENGR19HRU5FUklDX1ZBTFVFNV9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfSEVBUlRCRUFUX1RIUkVTSF8yNF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgSGVhcnRiZWF0VGhyZXNoMjQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfSEVBUlRCRUFUX1RIUkVTSF8yNF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0hFQVJUQkVBVF9USFJFU0hfMjRfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0hFQVJUQkVBVF9USFJFU0hfMjRfTUFYICksCisgICAgICAgICAgICAgICAgCisgICBSRUdfVkFSSUFCTEVfU1RSSU5HKCBDRkdfUE9XRVJfVVNBR0VfTkFNRSwgV0xBTl9QQVJBTV9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIFBvd2VyVXNhZ2VDb250cm9sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopQ0ZHX1BPV0VSX1VTQUdFX0RFRkFVTFQgKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfRU5BQkxFX1NVU1BFTkRfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5FbmFibGVTdXNwZW5kLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9TVVNQRU5EX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX1NVU1BFTkRfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9TVVNQRU5EX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19FTkFCTEVfRU5BQkxFX0RSSVZFUl9TVE9QX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuRW5hYmxlRHJpdmVyU3RvcCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19FTkFCTEVfRU5BQkxFX0RSSVZFUl9TVE9QX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0VOQUJMRV9EUklWRVJfU1RPUF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0VOQUJMRV9EUklWRVJfU1RPUF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfRU5BQkxFX0lNUFNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGZJc0ltcHNFbmFibGVkLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9JTVBTX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0lNUFNfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9JTVBTX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19FTkFCTEVfTE9HUF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZklzTG9ncEVuYWJsZWQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0xPR1BfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19FTkFCTEVfTE9HUF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0xPR1BfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0lNUFNfTUlOSU1VTV9TTEVFUF9USU1FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuSW1wc01pblNsZWVwVGltZSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19JTVBTX01JTklNVU1fU0xFRVBfVElNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0lNUFNfTUlOSU1VTV9TTEVFUF9USU1FX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19JTVBTX01JTklNVU1fU0xFRVBfVElNRV9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfSU1QU19NQVhJTVVNX1NMRUVQX1RJTUVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5JbXBzTWF4U2xlZXBUaW1lLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0lNUFNfTUFYSU1VTV9TTEVFUF9USU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfSU1QU19NQVhJTVVNX1NMRUVQX1RJTUVfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0lNUFNfTUFYSU1VTV9TTEVFUF9USU1FX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19JTVBTX01PREVSQVRFX1NMRUVQX1RJTUVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5JbXBzTW9kU2xlZXBUaW1lLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfSU1QU19NT0RFUkFURV9TTEVFUF9USU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfSU1QU19NT0RFUkFURV9TTEVFUF9USU1FX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19JTVBTX01PREVSQVRFX1NMRUVQX1RJTUVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0VOQUJMRV9CTVBTX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBmSXNCbXBzRW5hYmxlZCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19FTkFCTEVfQk1QU19ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9CTVBTX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19FTkFCTEVfQk1QU19NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfQk1QU19NSU5JTVVNX0xJX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuQm1wc01pbkxpc3RlbkludGVydmFsLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0JNUFNfTUlOSU1VTV9MSV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0JNUFNfTUlOSU1VTV9MSV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfQk1QU19NSU5JTVVNX0xJX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19CTVBTX01BWElNVU1fTElfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5CbXBzTWF4TGlzdGVuSW50ZXJ2YWwsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfQk1QU19NQVhJTVVNX0xJX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfQk1QU19NQVhJTVVNX0xJX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19CTVBTX01BWElNVU1fTElfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0JNUFNfTU9ERVJBVEVfTElfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5CbXBzTW9kTGlzdGVuSW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19CTVBTX01PREVSQVRFX0xJX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfQk1QU19NT0RFUkFURV9MSV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfQk1QU19NT0RFUkFURV9MSV9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfRU5BQkxFX0FVVE9fQk1QU19USU1FUl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZklzQXV0b0JtcHNUaW1lckVuYWJsZWQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0FVVE9fQk1QU19USU1FUl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9BVVRPX0JNUFNfVElNRVJfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9BVVRPX0JNUFNfVElNRVJfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0FVVE9fQk1QU19USU1FUl9WQUxVRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbkF1dG9CbXBzVGltZXJWYWx1ZSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19BVVRPX0JNUFNfVElNRVJfVkFMVUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19BVVRPX0JNUFNfVElNRVJfVkFMVUVfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0FVVE9fQk1QU19USU1FUl9WQUxVRV9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfRE9UMTFfTU9ERV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZG90MTFNb2RlLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0RPVDExX01PREVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19ET1QxMV9NT0RFX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19ET1QxMV9NT0RFX01BWCApLAorICAgICAgICAgICAgICAgICAKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFXzI0R0haX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuQ2hhbm5lbEJvbmRpbmdNb2RlMjRHSHosIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssIAorICAgICAgICAgICAgICAgICBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfTUFYKSwKKyAgICAgICAgICAgICAgCisgICBSRUdfVkFSSUFCTEUoIENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV81R0haX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuQ2hhbm5lbEJvbmRpbmdNb2RlNUdIeiwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywgCisgICAgICAgICAgICAgICAgIENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9NQVgpLAorICAgICAgICAgICAgICAKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLCAgIAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIE1heFJ4QW1wZHVGYWN0b3IsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0sgLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19NQVhfUlhfQU1QRFVfRkFDVE9SX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19NQVhfUlhfQU1QRFVfRkFDVE9SX01BWCksCisgICAgICAgICAgICAgICAgCisgICBSRUdfVkFSSUFCTEUoIENGR19GSVhFRF9SQVRFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBUeFJhdGUsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0ssIAorICAgICAgICAgICAgICAgICBDRkdfRklYRURfUkFURV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0ZJWEVEX1JBVEVfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0ZJWEVEX1JBVEVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1NIT1JUX0dJXzIwTUhaX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBTaG9ydEdJMjBNaHpFbmFibGUsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfU0hPUlRfR0lfMjBNSFpfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19TSE9SVF9HSV8yME1IWl9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfU0hPUlRfR0lfMjBNSFpfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0JMT0NLX0FDS19BVVRPX1NFVFVQX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBCbG9ja0Fja0F1dG9TZXR1cCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywgCisgICAgICAgICAgICAgICAgIENGR19CTE9DS19BQ0tfQVVUT19TRVRVUF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0JMT0NLX0FDS19BVVRPX1NFVFVQX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19CTE9DS19BQ0tfQVVUT19TRVRVUF9NQVggKSwKKyAgCisgICBSRUdfVkFSSUFCTEUoIENGR19TQ0FOX1JFU1VMVF9BR0VfQ09VTlRfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIFNjYW5SZXN1bHRBZ2VDb3VudCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywgCisgICAgICAgICAgICAgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfQ09VTlRfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfQ09VTlRfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9DT1VOVF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNOUFNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5TY2FuQWdlVGltZU5DTlBTLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DTlBTX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfU0NBTl9SRVNVTFRfQUdFX1RJTUVfTkNOUFNfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DTlBTX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9OQ1BTX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuU2NhbkFnZVRpbWVOQ1BTLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX05DUFNfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9OQ1BTX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9OQ1BTX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DTlBTX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuU2NhbkFnZVRpbWVDTlBTLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NOUFNfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DTlBTX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DTlBTX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DUFNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5TY2FuQWdlVGltZUNQUywgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDSywgCisgICAgICAgICAgICAgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DUFNfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19TQ0FOX1JFU1VMVF9BR0VfVElNRV9DUFNfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1NDQU5fUkVTVUxUX0FHRV9USU1FX0NQU19NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUlNTSV9DQVRFR09SWV9HQVBfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5Sc3NpQ2F0R2FwLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1JTU0lfQ0FURUdPUllfR0FQX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUlNTSV9DQVRFR09SWV9HQVBfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1JTU0lfQ0FURUdPUllfR0FQX01BWCApLCAgCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1NUQVRfVElNRVJfSU5URVJWQUxfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5TdGF0VGltZXJJbnRlcnZhbCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19TVEFUX1RJTUVSX0lOVEVSVkFMX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfU1RBVF9USU1FUl9JTlRFUlZBTF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfU1RBVF9USU1FUl9JTlRFUlZBTF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfU0hPUlRfUFJFQU1CTEVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGZJc1Nob3J0UHJlYW1ibGUsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfU0hPUlRfUFJFQU1CTEVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19TSE9SVF9QUkVBTUJMRV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfU0hPUlRfUFJFQU1CTEVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0lCU1NfQVVUT19CU1NJRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZklzQXV0b0lic3NCc3NpZCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19JQlNTX0FVVE9fQlNTSURfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19JQlNTX0FVVE9fQlNTSURfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0lCU1NfQVVUT19CU1NJRF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFX1NUUklORyggQ0ZHX0lCU1NfQlNTSURfTkFNRSwgV0xBTl9QQVJBTV9NYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJYnNzQnNzaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilDRkdfSUJTU19CU1NJRF9ERUZBVUxUICksCisKKyAgIFJFR19WQVJJQUJMRV9TVFJJTkcoIENGR19JTlRGMF9NQUNfQUREUl9OQU1FLCBXTEFOX1BBUkFNX01hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGludGZNYWNBZGRyWzBdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopQ0ZHX0lOVEYwX01BQ19BRERSX0RFRkFVTFQgKSwKKworICAgUkVHX1ZBUklBQkxFX1NUUklORyggQ0ZHX0lOVEYxX01BQ19BRERSX05BTUUsIFdMQU5fUEFSQU1fTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgaW50Zk1hY0FkZHJbMV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilDRkdfSU5URjFfTUFDX0FERFJfREVGQVVMVCApLAorCisgICBSRUdfVkFSSUFCTEVfU1RSSU5HKCBDRkdfSU5URjJfTUFDX0FERFJfTkFNRSwgV0xBTl9QQVJBTV9NYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBpbnRmTWFjQWRkclsyXSwgCisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKUNGR19JTlRGMl9NQUNfQUREUl9ERUZBVUxUICksCisKKyAgIFJFR19WQVJJQUJMRV9TVFJJTkcoIENGR19JTlRGM19NQUNfQUREUl9OQU1FLCBXTEFOX1BBUkFNX01hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGludGZNYWNBZGRyWzNdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopQ0ZHX0lOVEYzX01BQ19BRERSX0RFRkFVTFQgKSwKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0FQX1FPU19VQVBTRF9NT0RFX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgYXBVYXBzZEVuYWJsZWQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfQVBfUU9TX1VBUFNEX01PREVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19BUF9RT1NfVUFQU0RfTU9ERV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfQVBfUU9TX1VBUFNEX01PREVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRV9TVFJJTkcoIENGR19BUF9DT1VOVFJZX0NPREUsIFdMQU5fUEFSQU1fU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBhcENudHJ5Q29kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKUNGR19BUF9DT1VOVFJZX0NPREVfREVGQVVMVCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19BUF9FTkFCTEVfUFJPVEVDVElPTl9NT0RFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgYXBQcm90RW5hYmxlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICBDRkdfQVBfRU5BQkxFX1BST1RFQ1RJT05fTU9ERV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0FQX0VOQUJMRV9QUk9URUNUSU9OX01PREVfTUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0FQX0VOQUJMRV9QUk9URUNUSU9OX01PREVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0FQX1BST1RFQ1RJT05fTU9ERV9OQU1FLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGFwUHJvdGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGR19BUF9QUk9URUNUSU9OX01PREVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGR19BUF9QUk9URUNUSU9OX01PREVfTUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0FQX1BST1RFQ1RJT05fTU9ERV9NQVggKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgUkVHX1ZBUklBQkxFKCBDRkdfQVBfT0JTU19QUk9URUNUSU9OX01PREVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBhcE9CU1NQcm90RW5hYmxlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICBDRkdfQVBfT0JTU19QUk9URUNUSU9OX01PREVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGR19BUF9PQlNTX1BST1RFQ1RJT05fTU9ERV9NSU4sCisgICAgICAgICAgICAgICAgICAgICAgICBDRkdfQVBfT0JTU19QUk9URUNUSU9OX01PREVfTUFYICksCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0FQX1NUQV9TRUNVUklUWV9TRVBFUkFUSU9OX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgYXBEaXNhYmxlSW50cmFCc3NGd2QsIAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0FQX1NUQV9TRUNVUklUWV9TRVBFUkFUSU9OX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICBDRkdfQVBfU1RBX1NFQ1VSSVRZX1NFUEVSQVRJT05fTUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0FQX1NUQV9TRUNVUklUWV9TRVBFUkFUSU9OX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19GUkFNRVNfUFJPQ0VTU0lOR19USF9NT0RFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgTWluRnJhbWVzUHJvY1RocmVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGR19GUkFNRVNfUFJPQ0VTU0lOR19USF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0ZSQU1FU19QUk9DRVNTSU5HX1RIX01JTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGR19GUkFNRVNfUFJPQ0VTU0lOR19USF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTCAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBhcFN0YXJ0Q2hhbm5lbE51bSwKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfU0FQX0NIQU5ORUxfU0VMRUNUX1NUQVJUX0NIQU5ORUxfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMX01JTiwKKyAgICAgICAgICAgICAgICAgQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTCAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBhcEVuZENoYW5uZWxOdW0sCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTF9ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfU0FQX0NIQU5ORUxfU0VMRUNUX0VORF9DSEFOTkVMX01JTiwKKyAgICAgICAgICAgICAgICAgQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkQgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgYXBPcGVyYXRpbmdCYW5kLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9PUEVSQVRJTkdfQkFORF9NSU4sCisgICAgICAgICAgICAgICAgIENGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRShDRkdfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT05fTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBhcEF1dG9DaGFubmVsU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIENGR19TQVBfQVVUT19DSEFOTkVMX1NFTEVDVElPTl9ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT05fTUlOLAorICAgICAgICAgICAgICAgICBDRkdfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT05fTUFYICksCisgICAKKyAgIFJFR19WQVJJQUJMRShDRkdfRU5BQkxFX0xURV9DT0VYICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGVuYWJsZUxURUNvZXgsCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9MVEVfQ09FWF9ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0xURV9DT0VYX01JTiwKKyAgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9MVEVfQ09FWF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfQVBfS0VFUF9BTElWRV9QRVJJT0RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGFwS2VlcEFsaXZlUGVyaW9kLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIENGR19BUF9LRUVQX0FMSVZFX1BFUklPRF9ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfQVBfS0VFUF9BTElWRV9QRVJJT0RfTUlOLAorICAgICAgICAgICAgICAgICBDRkdfQVBfS0VFUF9BTElWRV9QRVJJT0RfTUFYKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfR09fS0VFUF9BTElWRV9QRVJJT0RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGdvS2VlcEFsaXZlUGVyaW9kLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIENGR19HT19LRUVQX0FMSVZFX1BFUklPRF9ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfR09fS0VFUF9BTElWRV9QRVJJT0RfTUlOLAorICAgICAgICAgICAgICAgICBDRkdfR09fS0VFUF9BTElWRV9QRVJJT0RfTUFYKSwKKworI2VuZGlmCisgICBSRUdfVkFSSUFCTEUoQ0ZHX0RJU0FCTEVfUEFDS0VUX0ZJTFRFUiAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBkaXNhYmxlUGFja2V0RmlsdGVyLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIENGR19ESVNBQkxFX1BBQ0tFVF9GSUxURVJfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHX0RJU0FCTEVfUEFDS0VUX0ZJTFRFUl9NSU4sCisgICAgICAgICAgICAgICAgIENGR19ESVNBQkxFX1BBQ0tFVF9GSUxURVJfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0JFQUNPTl9JTlRFUlZBTF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbkJlYWNvbkludGVydmFsLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0JFQUNPTl9JTlRFUlZBTF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0JFQUNPTl9JTlRFUlZBTF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfQkVBQ09OX0lOVEVSVkFMX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19FTkFCTEVfSEFORE9GRl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZklzSGFuZG9mZkVuYWJsZWQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0hBTkRPRkZfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19FTkFCTEVfSEFORE9GRl9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0hBTkRPRkZfTUFYICksCisKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfRU5BQkxFX0lETEVfU0NBTl9OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5FbmFibGVJZGxlU2NhbiwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19FTkFCTEVfSURMRV9TQ0FOX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0lETEVfU0NBTl9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0lETEVfU0NBTl9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUk9BTUlOR19USU1FX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgblJvYW1pbmdUaW1lLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1JPQU1JTkdfVElNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1JPQU1JTkdfVElNRV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUk9BTUlOR19USU1FX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19WQ0NfUlNTSV9UUklHR0VSX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgblZjY1Jzc2lUcmlnZ2VyLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1ZDQ19SU1NJX1RSSUdHRVJfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19WQ0NfUlNTSV9UUklHR0VSX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19WQ0NfUlNTSV9UUklHR0VSX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19WQ0NfVUxfTUFDX0xPU1NfVEhSRVNIX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgblZjY1VsTWFjTG9zc1RocmVzaG9sZCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19WQ0NfVUxfTUFDX0xPU1NfVEhSRVNIX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfVkNDX1VMX01BQ19MT1NTX1RIUkVTSF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfVkNDX1VMX01BQ19MT1NTX1RIUkVTSF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuUGFzc2l2ZU1heENoblRpbWUsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19QQVNTSVZFX01BWF9DSEFOTkVMX1RJTUVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgblBhc3NpdmVNaW5DaG5UaW1lLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUEFTU0lWRV9NSU5fQ0hBTk5FTF9USU1FX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbkFjdGl2ZU1heENoblRpbWUsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfQUNUSVZFX01BWF9DSEFOTkVMX1RJTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfQUNUSVZFX01BWF9DSEFOTkVMX1RJTUVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuQWN0aXZlTWluQ2huVGltZSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9NQVggKSwKKyAgIAorICAgUkVHX1ZBUklBQkxFKCBDRkdfTUFYX1BTX1BPTExfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5NYXhQc1BvbGwsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfTUFYX1BTX1BPTExfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19NQVhfUFNfUE9MTF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfTUFYX1BTX1BPTExfTUFYICksCisKKyAgICBSRUdfVkFSSUFCTEUoIENGR19NQVhfVFhfUE9XRVJfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5UeFBvd2VyQ2FwLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX01BWF9UWF9QT1dFUl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX01BWF9UWF9QT1dFUl9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfTUFYX1RYX1BPV0VSX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19MT1dfR0FJTl9PVkVSUklERV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZklzTG93R2Fpbk92ZXJyaWRlLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfTE9XX0dBSU5fT1ZFUlJJREVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19MT1dfR0FJTl9PVkVSUklERV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfTE9XX0dBSU5fT1ZFUlJJREVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1JTU0lfRklMVEVSX1BFUklPRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgblJzc2lGaWx0ZXJQZXJpb2QsCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19SU1NJX0ZJTFRFUl9QRVJJT0RfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1JTU0lfRklMVEVSX1BFUklPRF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfSUdOT1JFX0RUSU1fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGZJZ25vcmVEdGltLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfSUdOT1JFX0RUSU1fREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19JR05PUkVfRFRJTV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfSUdOT1JFX0RUSU1fTUFYICksCisgICAgICAgICAgICAgICAgIAorICAgUkVHX1ZBUklBQkxFKCBDRkdfUlhfQU5UX0NPTkZJR1VSQVRJT05fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgblJ4QW50LCAKKyAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19SWF9BTlRfQ09ORklHVVJBVElPTl9OQU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19SWF9BTlRfQ09ORklHVVJBVElPTl9OQU1FX01JTiwgCisgICAgICAgICAgICAgICAgQ0ZHX1JYX0FOVF9DT05GSUdVUkFUSU9OX05BTUVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0ZXX0hFQVJUX0JFQVRfTU9OSVRPUklOR19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBmRW5hYmxlRndIZWFydEJlYXRNb25pdG9yaW5nLCAKKyAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19GV19IRUFSVF9CRUFUX01PTklUT1JJTkdfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgQ0ZHX0ZXX0hFQVJUX0JFQVRfTU9OSVRPUklOR19NSU4sIAorICAgICAgICAgICAgICAgIENGR19GV19IRUFSVF9CRUFUX01PTklUT1JJTkdfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0ZXX0JFQUNPTl9GSUxURVJJTkdfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZkVuYWJsZUZ3QmVhY29uRmlsdGVyaW5nLCAKKyAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19GV19CRUFDT05fRklMVEVSSU5HX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19GV19CRUFDT05fRklMVEVSSU5HX01JTiwgCisgICAgICAgICAgICAgICAgQ0ZHX0ZXX0JFQUNPTl9GSUxURVJJTkdfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0ZXX1JTU0lfTU9OSVRPUklOR19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBmRW5hYmxlRndSc3NpTW9uaXRvcmluZywgCisgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICBDRkdfRldfUlNTSV9NT05JVE9SSU5HX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19GV19SU1NJX01PTklUT1JJTkdfTUlOLCAKKyAgICAgICAgICAgICAgICBDRkdfRldfUlNTSV9NT05JVE9SSU5HX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuRGF0YUluYWN0aXZpdHlUaW1lb3V0LCAKKyAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICBDRkdfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfTUlOLCAKKyAgICAgICAgICAgICAgICBDRkdfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfTUFYICksCisgICAgICAgICAgICAgICAgCisgICBSRUdfVkFSSUFCTEUoIENGR19OVEhfQkVBQ09OX0ZJTFRFUl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBudGhCZWFjb25GaWx0ZXIsIAorICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgQ0ZHX05USF9CRUFDT05fRklMVEVSX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19OVEhfQkVBQ09OX0ZJTFRFUl9NSU4sIAorICAgICAgICAgICAgICAgIENGR19OVEhfQkVBQ09OX0ZJTFRFUl9NQVggKSwgICAgICAgICAgICAgIAorCisgICBSRUdfVkFSSUFCTEUoIENGR19RT1NfV01NX01PREVfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBXbW1Nb2RlLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fTU9ERV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fTU9ERV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9NT0RFX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19RT1NfV01NXzgwMjExRV9FTkFCTEVEX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgYjgwMjExZUlzRW5hYmxlZCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NXzgwMjExRV9FTkFCTEVEX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV84MDIxMUVfRU5BQkxFRF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV84MDIxMUVfRU5BQkxFRF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9VQVBTRF9NQVNLX05BTUUgLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgVWFwc2RNYXNrLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fVUFQU0RfTUFTS19ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fVUFQU0RfTUFTS19NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9VQVBTRF9NQVNLX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19RT1NfV01NX01BWF9TUF9MRU5fTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBNYXhTcExlbmd0aCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX01BWF9TUF9MRU5fREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX01BWF9TUF9MRU5fTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fTUFYX1NQX0xFTl9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TUlZfSU5UVl9OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEluZnJhVWFwc2RWb1NydkludHYsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TUlZfSU5UVl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1JWX0lOVFZfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1JWX0lOVFZfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVk9fU1VTX0lOVFZfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYVVhcHNkVm9TdXNwSW50diwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZPX1NVU19JTlRWX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TVVNfSU5UVl9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WT19TVVNfSU5UVl9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TUlZfSU5UVl9OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEluZnJhVWFwc2RWaVNydkludHYsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TUlZfSU5UVl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1JWX0lOVFZfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1JWX0lOVFZfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfVklfU1VTX0lOVFZfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYVVhcHNkVmlTdXNwSW50diwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX1ZJX1NVU19JTlRWX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TVVNfSU5UVl9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9WSV9TVVNfSU5UVl9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TUlZfSU5UVl9OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEluZnJhVWFwc2RCZVNydkludHYsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TUlZfSU5UVl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQkVfU1JWX0lOVFZfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQkVfU1JWX0lOVFZfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQkVfU1VTX0lOVFZfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYVVhcHNkQmVTdXNwSW50diwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JFX1NVU19JTlRWX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TVVNfSU5UVl9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CRV9TVVNfSU5UVl9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TUlZfSU5UVl9OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEluZnJhVWFwc2RCa1NydkludHYsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TUlZfSU5UVl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1JWX0lOVFZfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1JWX0lOVFZfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfVUFQU0RfQktfU1VTX0lOVFZfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYVVhcHNkQmtTdXNwSW50diwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX1VBUFNEX0JLX1NVU19JTlRWX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TVVNfSU5UVl9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9VQVBTRF9CS19TVVNfSU5UVl9NQVggKSwKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfSU5BQ1RJVklUWV9JTlRFUlZBTF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgSW5mcmFJbmFjdGl2aXR5SW50ZXJ2YWwsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9JTkFDVElWSVRZX0lOVEVSVkFMX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9JTkFDVElWSVRZX0lOVEVSVkFMX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX0lOQUNUSVZJVFlfSU5URVJWQUxfTUFYKSwKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0NDWF9GRUFUVVJFX0VOQUJMRURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGlzQ2N4SW5pRmVhdHVyZUVuYWJsZWQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfQ0NYX0ZFQVRVUkVfRU5BQkxFRF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0NDWF9GRUFUVVJFX0VOQUJMRURfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0NDWF9GRUFUVVJFX0VOQUJMRURfTUFYKSwKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fQ0NYCisKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9DQ1gpCisgICBSRUdfVkFSSUFCTEUoIENGR19GVF9SU1NJX0ZJTFRFUl9QRVJJT0RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEZUUnNzaUZpbHRlclBlcmlvZCwKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfRlRfUlNTSV9GSUxURVJfUEVSSU9EX01BWCApLAorCisKKyAgIC8vIGZsYWcgdG8gdHVybiBPTi9PRkYgMTFyIGFuZCBDQ1ggRmFzdFRyYW5zaXRpb24KKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0ZBU1RfVFJBTlNJVElPTl9FTkFCTEVEX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBpc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0ZBU1RfVFJBTlNJVElPTl9FTkFCTEVEX05BTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19GQVNUX1RSQU5TSVRJT05fRU5BQkxFRF9OQU1FX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19GQVNUX1RSQU5TSVRJT05fRU5BQkxFRF9OQU1FX01BWCksCisjZW5kaWYKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9QS1RfQ0xBU1NJRllfQkFTSVNfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBQa3RDbGFzc2lmaWNhdGlvbkJhc2lzLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fUEtUX0NMQVNTSUZZX0JBU0lTX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9QS1RfQ0xBU1NJRllfQkFTSVNfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fUEtUX0NMQVNTSUZZX0JBU0lTX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WT19OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEluZnJhRGlyQWNWbywgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WT19ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZPX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19WT19NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZPX05BTUUgLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgSW5mcmFOb21Nc2R1U2l6ZUFjVm8sIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZPX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX1ZPX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVk9fTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVk9fTkFNRSAsIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYU1lYW5EYXRhUmF0ZUFjVm8sIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WT19ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVk9fTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfVk9fTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZPX05BTUUgLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgSW5mcmFNaW5QaHlSYXRlQWNWbywgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WT19ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZPX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19WT19NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVk9fTkFNRSAsIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYVNiYUFjVm8sIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVk9fREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WT19NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfVk9fTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZJX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgSW5mcmFEaXJBY1ZpLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZJX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfVklfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX1ZJX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVklfTkFNRSAsIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYU5vbU1zZHVTaXplQWNWaSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVklfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfVklfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19WSV9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WSV9OQU1FICwgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEluZnJhTWVhbkRhdGFSYXRlQWNWaSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX1ZJX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WSV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19WSV9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfVklfTkFNRSAsIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYU1pblBoeVJhdGVBY1ZpLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZJX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfVklfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX1ZJX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WSV9OQU1FICwgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEluZnJhU2JhQWNWaSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WSV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX1ZJX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19WSV9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQkVfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYURpckFjQmUsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQkVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CRV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9ESVJfQUNfQkVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CRV9OQU1FICwgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEluZnJhTm9tTXNkdVNpemVBY0JlLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTk9NX01TRFVfU0laRV9BQ19CRV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JFX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JFX05BTUUgLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgSW5mcmFNZWFuRGF0YVJhdGVBY0JlLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfQkVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JFX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX01FQU5fREFUQV9SQVRFX0FDX0JFX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CRV9OQU1FICwgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEluZnJhTWluUGh5UmF0ZUFjQmUsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfQkVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CRV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NSU5fUEhZX1JBVEVfQUNfQkVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JFX05BTUUgLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgSW5mcmFTYmFBY0JlLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JFX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQkVfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfU0JBX0FDX0JFX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CS19OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIEluZnJhRGlyQWNCaywgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CS19ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfRElSX0FDX0JLX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX0RJUl9BQ19CS19NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JLX05BTUUgLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgSW5mcmFOb21Nc2R1U2l6ZUFjQmssIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JLX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9OT01fTVNEVV9TSVpFX0FDX0JLX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX05PTV9NU0RVX1NJWkVfQUNfQktfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfQktfTkFNRSAsIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYU1lYW5EYXRhUmF0ZUFjQmssIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9NRUFOX0RBVEFfUkFURV9BQ19CS19ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfQktfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUVBTl9EQVRBX1JBVEVfQUNfQktfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX0JLX05BTUUgLCBXTEFOX1BBUkFNX0hleEludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgSW5mcmFNaW5QaHlSYXRlQWNCaywgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CS19ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fSU5GUkFfTUlOX1BIWV9SQVRFX0FDX0JLX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX01JTl9QSFlfUkFURV9BQ19CS19NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQktfTkFNRSAsIFdMQU5fUEFSQU1fSGV4SW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBJbmZyYVNiYUFjQmssIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQktfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0lORlJBX1NCQV9BQ19CS19NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX1dNTV9JTkZSQV9TQkFfQUNfQktfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1RMX1dGUV9CS19XRUlHSFRfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBXZnFCa1dlaWdodCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19UTF9XRlFfQktfV0VJR0hUX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfVExfV0ZRX0JLX1dFSUdIVF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfVExfV0ZRX0JLX1dFSUdIVF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfVExfV0ZRX0JFX1dFSUdIVF9OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIFdmcUJlV2VpZ2h0LCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1RMX1dGUV9CRV9XRUlHSFRfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19UTF9XRlFfQkVfV0VJR0hUX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19UTF9XRlFfQkVfV0VJR0hUX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19UTF9XRlFfVklfV0VJR0hUX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgV2ZxVmlXZWlnaHQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfVExfV0ZRX1ZJX1dFSUdIVF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1RMX1dGUV9WSV9XRUlHSFRfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1RMX1dGUV9WSV9XRUlHSFRfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1RMX1dGUV9WT19XRUlHSFRfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBXZnFWb1dlaWdodCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19UTF9XRlFfVk9fV0VJR0hUX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfVExfV0ZRX1ZPX1dFSUdIVF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfVExfV0ZRX1ZPX1dFSUdIVF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfVExfREVMQVlFRF9UUkdSX0ZSTV9JTlRfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBEZWxheWVkVHJpZ2dlckZybUludCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19UTF9ERUxBWUVEX1RSR1JfRlJNX0lOVF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1RMX0RFTEFZRURfVFJHUl9GUk1fSU5UX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19UTF9ERUxBWUVEX1RSR1JfRlJNX0lOVF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFX1NUUklORyggQ0ZHX1dPV0xfUEFUVEVSTl9OQU1FLCBXTEFOX1BBUkFNX1N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgd293bFBhdHRlcm4sIAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilDRkdfV09XTF9QQVRURVJOX0RFRkFVTFQgKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX0lNUExJQ0lUX1NFVFVQX0VOQUJMRURfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBiSW1wbGljaXRRb3NFbmFibGVkLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19JTVBMSUNJVF9TRVRVUF9FTkFCTEVEX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUU9TX0lNUExJQ0lUX1NFVFVQX0VOQUJMRURfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19JTVBMSUNJVF9TRVRVUF9FTkFCTEVEX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR18xOVAyX01IWl9QTUlDX0NMS19FTkFCTEVEX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgYjE5cDJNaHpQbWljQ2xrRW5hYmxlZCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR18xOVAyX01IWl9QTUlDX0NMS19FTkFCTEVEX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfMTlQMl9NSFpfUE1JQ19DTEtfRU5BQkxFRF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfMTlQMl9NSFpfUE1JQ19DTEtfRU5BQkxFRF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfQlRDX0VYRUNVVElPTl9NT0RFX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgYnRjRXhlY3V0aW9uTW9kZSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19CVENfRVhFQ1VUSU9OX01PREVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19CVENfRVhFQ1VUSU9OX01PREVfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0JUQ19FWEVDVVRJT05fTU9ERV9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfQlRDX0RIQ1BfUFJPVEVDVElPTl9OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGJ0Y0NvbnNCdFNsb3RzVG9CbG9ja0R1cmluZ0RoY3AsCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHX0JUQ19ESENQX1BST1RFQ1RJT05fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHX0JUQ19ESENQX1BST1RFQ1RJT05fTUlOLAorICAgICAgICAgICAgICAgICBDRkdfQlRDX0RIQ1BfUFJPVEVDVElPTl9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfQlRDX0EyRFBfREhDUF9QUk9URUNUSU9OX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgYnRjQTJEUEJ0U3ViSW50ZXJ2YWxzRHVyaW5nRGhjcCwKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfQlRDX0EyRFBfREhDUF9QUk9URUNUSU9OX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIENGR19CVENfQTJEUF9ESENQX1BST1RFQ1RJT05fTUlOLAorICAgICAgICAgICAgICAgICBDRkdfQlRDX0EyRFBfREhDUF9QUk9URUNUSU9OX01BWCApLAorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgUkVHX1ZBUklBQkxFKCBDRkdfQVBfTElTVEVOX01PREVfTkFNRSAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuRW5hYmxlTGlzdGVuTW9kZSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19BUF9MSVNURU5fTU9ERV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0FQX0xJU1RFTl9NT0RFX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19BUF9MSVNURU5fTU9ERV9NQVggKSwgICAgICAgICAgICAgICAgICAgICAKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfQVBfQVVUT19TSFVUX09GRiAsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuQVBBdXRvU2h1dE9mZiwKKyAgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHX0FQX0FVVE9fU0hVVF9PRkZfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHX0FQX0FVVE9fU0hVVF9PRkZfTUlOLAorICAgICAgICAgICAgICAgICBDRkdfQVBfQVVUT19TSFVUX09GRl9NQVggKSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICBSRUdfVkFSSUFCTEUoIENGR19SUk1fRU5BQkxFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBmUnJtRW5hYmxlLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1JSTV9FTkFCTEVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19SUk1fRU5BQkxFX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19SUk1fRU5BQkxFX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuSW5DaGFuTWVhc01heER1cmF0aW9uLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0RVUkFUSU9OX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWF9EVVJBVElPTl9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbk91dENoYW5NZWFzTWF4RHVyYXRpb24sIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWF9EVVJBVElPTl9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfRFVSQVRJT05fTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1JSTV9NRUFTX1JBTkRPTUlaQVRJT05fSU5UVkxfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5Scm1SYW5kbkludHZsLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1JSTV9NRUFTX1JBTkRPTUlaQVRJT05fSU5UVkxfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19SUk1fTUVBU19SQU5ET01JWkFUSU9OX0lOVFZMX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19SUk1fTUVBU19SQU5ET01JWkFUSU9OX0lOVFZMX01BWCApLAorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAgIAorICAgUkVHX1ZBUklBQkxFKCBDRkdfRlRfRU5BQkxFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBmRlRFbmFibGUsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRlRfRU5BQkxFX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRlRfRU5BQkxFX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19GVF9FTkFCTEVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0ZUX1JFU09VUkNFX1JFUV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZkZUUmVzb3VyY2VSZXFTdXBwb3J0ZWQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRlRfUkVTT1VSQ0VfUkVRX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfRlRfUkVTT1VSQ0VfUkVRX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19GVF9SRVNPVVJDRV9SRVFfTUFYICksCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisgICBSRUdfVkFSSUFCTEUoIENGR19ORUlHSEJPUl9TQ0FOX1RJTUVSX1BFUklPRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbk5laWdoYm9yU2NhblBlcmlvZCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19ORUlHSEJPUl9TQ0FOX1RJTUVSX1BFUklPRF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fVElNRVJfUEVSSU9EX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19ORUlHSEJPUl9TQ0FOX1RJTUVSX1BFUklPRF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfTkVJR0hCT1JfUkVBU1NPQ19SU1NJX1RIUkVTSE9MRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbk5laWdoYm9yUmVhc3NvY1Jzc2lUaHJlc2hvbGQsIAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICBDRkdfTkVJR0hCT1JfUkVBU1NPQ19SU1NJX1RIUkVTSE9MRF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX05FSUdIQk9SX1JFQVNTT0NfUlNTSV9USFJFU0hPTERfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX05FSUdIQk9SX1JFQVNTT0NfUlNTSV9USFJFU0hPTERfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX05FSUdIQk9SX0xPT0tVUF9SU1NJX1RIUkVTSE9MRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbk5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19ORUlHSEJPUl9MT09LVVBfUlNTSV9USFJFU0hPTERfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19ORUlHSEJPUl9MT09LVVBfUlNTSV9USFJFU0hPTERfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX05FSUdIQk9SX0xPT0tVUF9SU1NJX1RIUkVTSE9MRF9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFX1NUUklORyggQ0ZHX05FSUdIQk9SX1NDQU5fQ0hBTl9MSVNUX05BTUUsIFdMQU5fUEFSQU1fU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuZWlnaGJvclNjYW5DaGFuTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKUNGR19ORUlHSEJPUl9TQ0FOX0NIQU5fTElTVF9ERUZBVUxUICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX05FSUdIQk9SX1NDQU5fTUlOX0NIQU5fVElNRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIENGR19ORUlHSEJPUl9TQ0FOX01JTl9DSEFOX1RJTUVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fTUlOX0NIQU5fVElNRV9NSU4sCisgICAgICAgICAgICAgICAgIENGR19ORUlHSEJPUl9TQ0FOX01JTl9DSEFOX1RJTUVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX05FSUdIQk9SX1NDQU5fTUFYX0NIQU5fVElNRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbk5laWdoYm9yU2Nhbk1heENoYW5UaW1lLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fTUFYX0NIQU5fVElNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fTUFYX0NIQU5fVElNRV9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfTkVJR0hCT1JfU0NBTl9NQVhfQ0hBTl9USU1FX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR18xMVJfTkVJR0hCT1JfUkVRX01BWF9UUklFU19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbk1heE5laWdoYm9yUmVxVHJpZXMsCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgQ0ZHXzExUl9ORUlHSEJPUl9SRVFfTUFYX1RSSUVTX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIENGR18xMVJfTkVJR0hCT1JfUkVRX01BWF9UUklFU19NSU4sCisgICAgICAgICAgICAgICAgIENGR18xMVJfTkVJR0hCT1JfUkVRX01BWF9UUklFU19NQVgpLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19ORUlHSEJPUl9TQ0FOX1JFU1VMVFNfUkVGUkVTSF9QRVJJT0RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5OZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fUkVTVUxUU19SRUZSRVNIX1BFUklPRF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX05FSUdIQk9SX1NDQU5fUkVTVUxUU19SRUZSRVNIX1BFUklPRF9NSU4sIAorICAgICAgICAgICAgICAgICBDRkdfTkVJR0hCT1JfU0NBTl9SRVNVTFRTX1JFRlJFU0hfUEVSSU9EX01BWCApLAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HICovCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1FPU19XTU1fQlVSU1RfU0laRV9ERUZOX05BTUUgLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgYnVyc3RTaXplRGVmaW5pdGlvbiwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0JVUlNUX1NJWkVfREVGTl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fQlVSU1RfU0laRV9ERUZOX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX0JVUlNUX1NJWkVfREVGTl9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG1jYXN0QmNhc3RGaWx0ZXJTZXR0aW5nLAorICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIENGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElOR19ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfTUlOLAorICAgICAgICAgICAgICAgICBDRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0VOQUJMRV9IT1NUX0FSUE9GRkxPQURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGZob3N0QXJwT2ZmbG9hZCwKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0hPU1RfQVJQT0ZGTE9BRF9ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0hPU1RfQVJQT0ZGTE9BRF9NSU4sCisgICAgICAgICAgICAgICAgIENGR19FTkFCTEVfSE9TVF9BUlBPRkZMT0FEX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19RT1NfV01NX1RTX0lORk9fQUNLX1BPTElDWV9OQU1FICwgV0xBTl9QQVJBTV9IZXhJbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIHRzSW5mb0Fja1BvbGljeSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX1RTX0lORk9fQUNLX1BPTElDWV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgQ0ZHX1FPU19XTU1fVFNfSU5GT19BQ0tfUE9MSUNZX01JTiwgCisgICAgICAgICAgICAgICAgIENGR19RT1NfV01NX1RTX0lORk9fQUNLX1BPTElDWV9NQVggKSwKKworICAgIFJFR19WQVJJQUJMRSggQ0ZHX1NJTkdMRV9USURfUkNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBiU2luZ2xlVGlkUmMsCisgICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICBDRkdfU0lOR0xFX1RJRF9SQ19ERUZBVUxULAorICAgICAgICAgICAgICAgICAgQ0ZHX1NJTkdMRV9USURfUkNfTUlOLAorICAgICAgICAgICAgICAgICAgQ0ZHX1NJTkdMRV9USURfUkNfTUFYKSwKKworICAgIFJFR19WQVJJQUJMRSggQ0ZHX0RZTkFNSUNfUFNQT0xMX1ZBTFVFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZHluYW1pY1BzUG9sbFZhbHVlLAorICAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgQ0ZHX0RZTkFNSUNfUFNQT0xMX1ZBTFVFX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICBDRkdfRFlOQU1JQ19QU1BPTExfVkFMVUVfTUlOLAorICAgICAgICAgICAgICAgICAgQ0ZHX0RZTkFNSUNfUFNQT0xMX1ZBTFVFX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19URUxFX0JDTl9XQUtFVVBfRU5fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCB0ZWxlQmNuV2FrZXVwRW4sCisgICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICBDRkdfVEVMRV9CQ05fV0FLRVVQX0VOX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICBDRkdfVEVMRV9CQ05fV0FLRVVQX0VOX01JTiwKKyAgICAgICAgICAgICAgICAgIENGR19URUxFX0JDTl9XQUtFVVBfRU5fTUFYICksCisKKyAgICBSRUdfVkFSSUFCTEUoIENGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBpbmZyYVN0YUtlZXBBbGl2ZVBlcmlvZCwKKyAgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgIENGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgIENGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfTUlOLAorICAgICAgICAgICAgICAgICAgQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRF9NQVgpLAorCisgICAgUkVHX1ZBUklBQkxFKCBDRkdfUU9TX0FERFRTX1dIRU5fQUNNX0lTX09GRl9OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBBZGRUU1doZW5BQ01Jc09mZiwgCisgICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICAgQ0ZHX1FPU19BRERUU19XSEVOX0FDTV9JU19PRkZfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgICBDRkdfUU9TX0FERFRTX1dIRU5fQUNNX0lTX09GRl9NSU4sIAorICAgICAgICAgICAgICAgICAgQ0ZHX1FPU19BRERUU19XSEVOX0FDTV9JU19PRkZfTUFYICksCisKKworICAgIFJFR19WQVJJQUJMRSggQ0ZHX1ZBTElEQVRFX1NDQU5fTElTVF9OQU1FICwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBmVmFsaWRhdGVTY2FuTGlzdCwgCisgICAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICAgQ0ZHX1ZBTElEQVRFX1NDQU5fTElTVF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgIENGR19WQUxJREFURV9TQ0FOX0xJU1RfTUlOLCAKKyAgICAgICAgICAgICAgICAgIENGR19WQUxJREFURV9TQ0FOX0xJU1RfTUFYICksCisgICAKKyAgICBSRUdfVkFSSUFCTEUoIENGR19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbk51bGxEYXRhQXBSZXNwVGltZW91dCwgCisgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICBDRkdfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VUX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfTUlOLCAKKyAgICAgICAgICAgICAgICBDRkdfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VUX01BWCApLAorCisgICAgUkVHX1ZBUklBQkxFKCBDRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBhcERhdGFBdmFpbFBvbGxQZXJpb2RJbk1zLCAKKyAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgIENGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX01JTiwgCisgICAgICAgICAgICAgICAgQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfTUFYICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgUkVHX1ZBUklBQkxFKCBDRkdfRU5BQkxFX0JUQU1QX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBlbmFibGVCdEFtcCwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19FTkFCTEVfQlRBTVBfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19FTkFCTEVfQlRBTVBfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9CVEFNUF9NQVggKSwKKworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgUkVHX1ZBUklBQkxFKCBDRkdfQlRfQU1QX1BSRUZFUlJFRF9DSEFOTkVMX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBwcmVmZXJyZWRDaGFubmVsLCAKKyAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICBDRkdfQlRfQU1QX1BSRUZFUlJFRF9DSEFOTkVMX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIENGR19CVF9BTVBfUFJFRkVSUkVEX0NIQU5ORUxfTUlOLAorICAgICAgICAgICAgICAgICBDRkdfQlRfQU1QX1BSRUZFUlJFRF9DSEFOTkVMX01BWCApLAorI2VuZGlmIC8vV0xBTl9CVEFNUF9GRUFUVVJFCisgICBSRUdfVkFSSUFCTEUoIENGR19CQU5EX0NBUEFCSUxJVFlfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5CYW5kQ2FwYWJpbGl0eSwgCisgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19CQU5EX0NBUEFCSUxJVFlfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgIENGR19CQU5EX0NBUEFCSUxJVFlfTUlOLCAKKyAgICAgICAgICAgICAgICAgQ0ZHX0JBTkRfQ0FQQUJJTElUWV9NQVggKSwgCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0VOQUJMRV9CRUFDT05fRUFSTFlfVEVSTUlOQVRJT05fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgZkVuYWJsZUJlYWNvbkVhcmx5VGVybWluYXRpb24sIAorICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9CRUFDT05fRUFSTFlfVEVSTUlOQVRJT05fREVGQVVMVCwgCisgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9CRUFDT05fRUFSTFlfVEVSTUlOQVRJT05fTUlOLCAKKyAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0JFQUNPTl9FQVJMWV9URVJNSU5BVElPTl9NQVggKSwgCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8qIG5vdGUgdGhhdCBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2Ugd2UgY2Fubm90CisgICAgICBlbmFibGUgcmFuZ2UgY2hlY2ssIG90aGVyd2lzZSB3ZSBnZXQgYSBzeXN0ZW0gbG9nIG1lc3NhZ2UgKi8KKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1dESV9UUkFDRV9FTkFCTEVfREFMX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIHdkaVRyYWNlRW5hYmxlREFMLAorICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKyAgICAgICAgICAgICAgICBDRkdfV0RJX1RSQUNFX0VOQUJMRV9ERUZBVUxULAorICAgICAgICAgICAgICAgIENGR19XRElfVFJBQ0VfRU5BQkxFX01JTiwKKyAgICAgICAgICAgICAgICBDRkdfV0RJX1RSQUNFX0VOQUJMRV9NQVggKSwKKworICAgUkVHX1ZBUklBQkxFKCBDRkdfV0RJX1RSQUNFX0VOQUJMRV9DVExfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgd2RpVHJhY2VFbmFibGVDVEwsCisgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMLAorICAgICAgICAgICAgICAgIENGR19XRElfVFJBQ0VfRU5BQkxFX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgQ0ZHX1dESV9UUkFDRV9FTkFCTEVfTUlOLAorICAgICAgICAgICAgICAgIENGR19XRElfVFJBQ0VfRU5BQkxFX01BWCApLAorCisgICBSRUdfVkFSSUFCTEUoIENGR19XRElfVFJBQ0VfRU5BQkxFX0RBVF9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCB3ZGlUcmFjZUVuYWJsZURBVCwKKyAgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgQ0ZHX1dESV9UUkFDRV9FTkFCTEVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICBDRkdfV0RJX1RSQUNFX0VOQUJMRV9NSU4sCisgICAgICAgICAgICAgICAgQ0ZHX1dESV9UUkFDRV9FTkFCTEVfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX1dESV9UUkFDRV9FTkFCTEVfUEFMX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIHdkaVRyYWNlRW5hYmxlUEFMLAorICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCwKKyAgICAgICAgICAgICAgICBDRkdfV0RJX1RSQUNFX0VOQUJMRV9ERUZBVUxULAorICAgICAgICAgICAgICAgIENGR19XRElfVFJBQ0VfRU5BQkxFX01JTiwKKyAgICAgICAgICAgICAgICBDRkdfV0RJX1RSQUNFX0VOQUJMRV9NQVggKSwKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworICBSRUdfVkFSSUFCTEUoIENGR19URUxFX0JDTl9UUkFOU19MSV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5UZWxlQmNuVHJhbnNMaXN0ZW5JbnRlcnZhbCwgCisgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX01JTiwgCisgICAgICAgICAgICAgICBDRkdfVEVMRV9CQ05fVFJBTlNfTElfTUFYICksIAorCisgIFJFR19WQVJJQUJMRSggQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX05VTV9JRExFX0JDTlNfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBuVGVsZUJjblRyYW5zTGlOdW1JZGxlQmVhY29ucywgCisgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX05VTV9JRExFX0JDTlNfREVGQVVMVCwgCisgICAgICAgICAgICAgICBDRkdfVEVMRV9CQ05fVFJBTlNfTElfTlVNX0lETEVfQkNOU19NSU4sIAorICAgICAgICAgICAgICAgQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX05VTV9JRExFX0JDTlNfTUFYICksIAorCisgIFJFR19WQVJJQUJMRSggQ0ZHX1RFTEVfQkNOX01BWF9MSV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5UZWxlQmNuTWF4TGlzdGVuSW50ZXJ2YWwsIAorICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgIENGR19URUxFX0JDTl9NQVhfTElfREVGQVVMVCwgCisgICAgICAgICAgICAgICBDRkdfVEVMRV9CQ05fTUFYX0xJX01JTiwgCisgICAgICAgICAgICAgICBDRkdfVEVMRV9CQ05fTUFYX0xJX01BWCApLCAKKworICBSRUdfVkFSSUFCTEUoIENGR19URUxFX0JDTl9NQVhfTElfTlVNX0lETEVfQkNOU19OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCisgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIG5UZWxlQmNuTWF4TGlOdW1JZGxlQmVhY29ucywgCisgICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgQ0ZHX1RFTEVfQkNOX01BWF9MSV9OVU1fSURMRV9CQ05TX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgQ0ZHX1RFTEVfQkNOX01BWF9MSV9OVU1fSURMRV9CQ05TX01JTiwgCisgICAgICAgICAgICAgICBDRkdfVEVMRV9CQ05fTUFYX0xJX05VTV9JRExFX0JDTlNfTUFYICksIAorCisgIFJFR19WQVJJQUJMRSggQ0ZHX0JDTl9FQVJMWV9URVJNX1dBS0VfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBiY25FYXJseVRlcm1XYWtlSW50ZXJ2YWwsIAorICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgIENGR19CQ05fRUFSTFlfVEVSTV9XQUtFX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgQ0ZHX0JDTl9FQVJMWV9URVJNX1dBS0VfTUlOLCAKKyAgICAgICAgICAgICAgIENGR19CQ05fRUFSTFlfVEVSTV9XQUtFX01BWCApLCAKKworIFJFR19WQVJJQUJMRSggQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGFwRGF0YUF2YWlsUG9sbFBlcmlvZEluTXMsIAorICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICBDRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfTUlOLCAKKyAgICAgICAgICAgICAgQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfTUFYICksCisKKyAgIFJFR19WQVJJQUJMRSggQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGVuYWJsZUNsb3NlTG9vcCwgCisgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICBDRkdfRU5BQkxFX0NMT1NFX0xPT1BfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX01JTiwgCisgICAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX01BWCApLAorCisgUkVHX1ZBUklBQkxFKCBDRkdfRU5BQkxFX0JZUEFTU18xMURfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGVuYWJsZUJ5cGFzczExZCwgCisgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgIENGR19FTkFCTEVfQllQQVNTXzExRF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9CWVBBU1NfMTFEX01JTiwgCisgICAgICAgICAgICAgIENGR19FTkFCTEVfQllQQVNTXzExRF9NQVggKSwKKworIFJFR19WQVJJQUJMRSggQ0ZHX0VOQUJMRV9ERlNfQ0hOTF9TQ0FOX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBlbmFibGVERlNDaG5sU2NhbiwgCisgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgIENGR19FTkFCTEVfREZTX0NITkxfU0NBTl9ERUZBVUxULCAKKyAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9ERlNfQ0hOTF9TQ0FOX01JTiwgCisgICAgICAgICAgICAgIENGR19FTkFCTEVfREZTX0NITkxfU0NBTl9NQVggKSwKKworIFJFR19WQVJJQUJMRSggQ0ZHX0VOQUJMRV9EWU5BTUlDX0RUSU1fTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGVuYWJsZUR5bmFtaWNEVElNLCAKKyAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9EWU5BTUlDX0RUSU1fREVGQVVMVCwgCisgICAgICAgICAgICAgIENGR19FTkFCTEVfRFlOQU1JQ19EVElNX01JTiwgCisgICAgICAgICAgICAgIENGR19FTkFCTEVfRFlOQU1JQ19EVElNX01BWCApLAorCisgUkVHX1ZBUklBQkxFKCBDRkdfRU5BQkxFX0FVVE9NQVRJQ19UWF9QT1dFUl9DT05UUk9MX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBlbmFibGVBdXRvbWF0aWNUeFBvd2VyQ29udHJvbCwgCisgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgIENGR19FTkFCTEVfQVVUT01BVElDX1RYX1BPV0VSX0NPTlRST0xfREVGQVVMVCwgCisgICAgICAgICAgICAgIENGR19FTkFCTEVfQVVUT01BVElDX1RYX1BPV0VSX0NPTlRST0xfTUlOLCAKKyAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9BVVRPTUFUSUNfVFhfUE9XRVJfQ09OVFJPTF9NQVggKSwKKworIFJFR19WQVJJQUJMRSggQ0ZHX1NIT1JUX0dJXzQwTUhaX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBTaG9ydEdJNDBNaHpFbmFibGUsIAorICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAorICAgICAgICAgICAgICBDRkdfU0hPUlRfR0lfNDBNSFpfREVGQVVMVCwgCisgICAgICAgICAgICAgIENGR19TSE9SVF9HSV80ME1IWl9NSU4sIAorICAgICAgICAgICAgICBDRkdfU0hPUlRfR0lfNDBNSFpfTUFYICksCisKKyBSRUdfRFlOQU1JQ19WQVJJQUJMRSggQ0ZHX1JFUE9SVF9NQVhfTElOS19TUEVFRCwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIHJlcG9ydE1heExpbmtTcGVlZCwgCisgICAgICAgICAgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgICAgICAgIENGR19SRVBPUlRfTUFYX0xJTktfU1BFRURfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgICAgICAgIENGR19SRVBPUlRfTUFYX0xJTktfU1BFRURfTUlOLCAKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX1JFUE9SVF9NQVhfTElOS19TUEVFRF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAgKSwKKworIFJFR19EWU5BTUlDX1ZBUklBQkxFKCBDRkdfTElOS19TUEVFRF9SU1NJX0hJR0gsIFdMQU5fUEFSQU1fU2lnbmVkSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBsaW5rU3BlZWRSc3NpSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICBDRkdfTElOS19TUEVFRF9SU1NJX0hJR0hfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0xJTktfU1BFRURfUlNTSV9ISUdIX01JTiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0xJTktfU1BFRURfUlNTSV9ISUdIX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCApLAorCisgUkVHX0RZTkFNSUNfVkFSSUFCTEUoIENGR19MSU5LX1NQRUVEX1JTU0lfTE9XLCBXTEFOX1BBUkFNX1NpZ25lZEludGVnZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCwgbGlua1NwZWVkUnNzaUxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICBDRkdfTElOS19TUEVFRF9SU1NJX0xPV19ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICBDRkdfTElOS19TUEVFRF9SU1NJX0xPV19NSU4sCisgICAgICAgICAgICAgICAgICAgICAgIENGR19MSU5LX1NQRUVEX1JTU0lfTE9XX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCApLAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorIFJFR19WQVJJQUJMRSggQ0ZHX1AyUF9ERVZJQ0VfQUREUkVTU19BRE1JTklTVFJBVEVEX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBpc1AycERldmljZUFkZHJBZG1pbmlzdHJhdGVkLAorICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsCisgICAgICAgICAgICAgIENGR19QMlBfREVWSUNFX0FERFJFU1NfQURNSU5JU1RSQVRFRF9ERUZBVUxULAorICAgICAgICAgICAgICBDRkdfUDJQX0RFVklDRV9BRERSRVNTX0FETUlOSVNUUkFURURfTUlOLAorICAgICAgICAgICAgICBDRkdfUDJQX0RFVklDRV9BRERSRVNTX0FETUlOSVNUUkFURURfTUFYICksCisjZW5kaWYKKworUkVHX1ZBUklBQkxFKCBDRkdfRU5BQkxFX01DQ19FTkFCTEVEX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGVuYWJsZU1DQywgCisgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICBDRkdfRU5BQkxFX01DQ19FTkFCTEVEX0RFRkFVTFQsIAorICAgICAgICAgICAgIENGR19FTkFCTEVfTUNDX0VOQUJMRURfTUlOLCAKKyAgICAgICAgICAgICBDRkdfRU5BQkxFX01DQ19FTkFCTEVEX01BWCApLAorCisgUkVHX1ZBUklBQkxFKCBDRkdfVEhFUk1BTF9NSUdSQVRJT05fRU5BQkxFX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCB0aGVybWFsTWl0aWdhdGlvbkVuYWJsZSwgCisgICAgICAgICAgICAgIFZBUl9GTEFHU19PUFRJT05BTCB8IFZBUl9GTEFHU19SQU5HRV9DSEVDS19BU1NVTUVfREVGQVVMVCwgCisgICAgICAgICAgICAgIENGR19USEVSTUFMX01JR1JBVElPTl9FTkFCTEVfREVGQVVMVCwgCisgICAgICAgICAgICAgIENGR19USEVSTUFMX01JR1JBVElPTl9FTkFCTEVfTUlOLCAKKyAgICAgICAgICAgICAgQ0ZHX1RIRVJNQUxfTUlHUkFUSU9OX0VOQUJMRV9NQVggKSwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworIFJFR19WQVJJQUJMRSggQ0ZHX01DX0FERFJfTElTVF9GSUxURVJfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAorICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIGlzTWNBZGRyTGlzdEZpbHRlciwKKyAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULAorICAgICAgICAgICAgICBDRkdfTUNfQUREUl9MSVNUX0ZJTFRFUl9ERUZBVUxULAorICAgICAgICAgICAgICBDRkdfTUNfQUREUl9MSVNUX0ZJTFRFUl9NSU4sCisgICAgICAgICAgICAgIENGR19NQ19BRERSX0xJU1RfRklMVEVSX01BWCApLAorI2VuZGlmCisgIAorUkVHX1ZBUklBQkxFKCBDRkdfRU5BQkxFX01PRFVMQVRFRF9EVElNX05BTUUsIFdMQU5fUEFSQU1fSW50ZWdlciwKKyAgICAgICAgICAgICAgaGRkX2NvbmZpZ190LCBlbmFibGVNb2R1bGF0ZWREVElNLCAKKyAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9NT0RVTEFURURfRFRJTV9ERUZBVUxULCAKKyAgICAgICAgICAgICAgQ0ZHX0VOQUJMRV9NT0RVTEFURURfRFRJTV9NSU4sIAorICAgICAgICAgICAgICBDRkdfRU5BQkxFX01PRFVMQVRFRF9EVElNX01BWCApLAorCit9OworCisvKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBvY2N1cmVuY2UKKyAqIG9mIGEgbmV3IGxpbmUgY2hhcmFjdGVyLiBJdCBhbHNvIG1vZGlmaWVzIHRoZSBvcmlnaW5hbCBzdHJpbmcgYnkgcmVwbGFjaW5nCisgKiB0aGUgJ1xuJyBjaGFyYWN0ZXIgd2l0aCB0aGUgbnVsbCBjaGFyYWN0ZXIuCisgKiBGdW5jdGlvbiByZXR1cm5zIE5VTEwgaWYgbm8gbmV3IGxpbmUgY2hhcmFjdGVyIHdhcyBmb3VuZCBiZWZvcmUgZW5kIG9mCisgKiBzdHJpbmcgd2FzIHJlYWNoZWQKKyAqLworc3RhdGljIGNoYXIqIGdldF9uZXh0X2xpbmUoY2hhciogc3RyKQoreworICBjaGFyIGM7CisKKyAgaWYoIHN0ciA9PSBOVUxMIHx8ICpzdHIgPT0gJ1wwJykgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgYyA9ICpzdHI7CisgIHdoaWxlKGMgIT0gJ1xuJyAgJiYgYyAhPSAnXDAnICYmIGMgIT0gMHhkKSAgeyAKKyAgICBzdHIgPSBzdHIgKyAxOworICAgIGMgPSAqc3RyOworICB9CisKKyAgaWYgKGMgPT0gJ1wwJyApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAqc3RyID0gJ1wwJzsgCisgICAgcmV0dXJuIChzdHIrMSk7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLy8gbG9vayBmb3Igc3BhY2UuIEFzY2lpIHZhbHVlcyB0byBsb29rIGFyZSAtCisvLyAweDA5ID09IGhvcml6b250YWwgdGFiCisvLyAweDBhID09IE5ld2xpbmUgKCJcbiIpCisvLyAweDBiID09IHZlcnRpY2FsIHRhYgorLy8gMHgwYyA9PSBOZXdwYWdlIG9yIGZlZWQgZm9ybS4KKy8vIDB4MGQgPT0gY2FycmlhZ2UgcmV0dXJuIChDUiBvciAiXHIiKQorLy8gTnVsbCAoJ1wwJykgc2hvdWxkIG5vdCBjb25zaWRlcmVkIGFzIHNwYWNlLgorI2RlZmluZSBpX2lzc3BhY2UoY2gpICAoKChjaCkgPj0gMHgwOSAmJiAoY2gpIDw9IDB4MGQpIHx8IChjaCkgPT0gJyAnKQorCisvKgorICogVGhpcyBmdW5jdGlvbiB0cmltcyBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGUgc3BhY2VzCisgKi8KK3N0YXRpYyBjaGFyICppX3RyaW0oY2hhciAqc3RyKQorCit7CisgICBjaGFyICpwdHI7CisKKyAgIGlmKCpzdHIgPT0gJ1wwJykgcmV0dXJuIHN0cjsKKworICAgLyogRmluZCB0aGUgZmlyc3Qgbm9uIHdoaXRlLXNwYWNlKi8KKyAgIGZvciAocHRyID0gc3RyOyBpX2lzc3BhY2UoKnB0cik7IHB0cisrKTsKKyAgICAgIGlmICgqcHRyID09ICdcMCcpCisgICAgICAgICByZXR1cm4gc3RyOworCisgICAvKiBUaGlzIGlzIHRoZSBuZXcgc3RhcnQgb2YgdGhlIHN0cmluZyovCisgICBzdHIgPSBwdHI7CisKKyAgIC8qIEZpbmQgdGhlIGxhc3Qgbm9uIHdoaXRlLXNwYWNlICovCisgICBwdHIgKz0gc3RybGVuKHB0cikgLSAxOworICAgZm9yICg7IHB0ciAhPSBzdHIgJiYgaV9pc3NwYWNlKCpwdHIpOyBwdHItLSk7CisgICAgICAvKiBOdWxsIHRlcm1pbmF0ZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlciAqLworICAgICAgcHRyWzFdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIHJldHVybiBzdHI7Cit9CisKKworLy9TdHJ1Y3R1cmUgdG8gc3RvcmUgZWFjaCBlbnRyeSBpbiBxY29tX2NmZy5pbmkgZmlsZQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIGNoYXIgKm5hbWU7CisgICBjaGFyICp2YWx1ZTsKK310Q2ZnSW5pRW50cnk7CisKK3N0YXRpYyBWT1NfU1RBVFVTIGhkZF9hcHBseV9jZmdfaW5pKCBoZGRfY29udGV4dF90ICogcEhkZEN0eCwgCisgICAgdENmZ0luaUVudHJ5KiBpbmlUYWJsZSwgdW5zaWduZWQgbG9uZyBlbnRyaWVzKTsKKworI2lmZGVmIFdMQU5fQ0ZHX0RFQlVHCit2b2lkIGR1bXBfY2ZnX2luaSAodENmZ0luaUVudHJ5KiBpbmlUYWJsZSwgdW5zaWduZWQgbG9uZyBlbnRyaWVzKSAKK3sKKyAgIHVuc2lnbmVkIGxvbmcgaTsKKworICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzIGVudHJ5IE5hbWU9WyVzXSB2YWx1ZT1bJXNdIiwgCisgICAgICAgICAgIFdMQU5fSU5JX0ZJTEUsIGluaVRhYmxlW2ldLm5hbWUsIGluaVRhYmxlW2ldLnZhbHVlKTsKKyAgICAgfQorfQorI2VuZGlmIAorCisvKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgcWNvbV9jZmcuaW5pIGZpbGUgYW5kCisgKiBwYXJzZXMgZWFjaCAnTmFtZT1WYWx1ZScgcGFpciBpbiB0aGUgaW5pIGZpbGUKKyAqLworVk9TX1NUQVRVUyBoZGRfcGFyc2VfY29uZmlnX2luaShoZGRfY29udGV4dF90KiBwSGRkQ3R4KQoreworICAgaW50IHN0YXR1cywgaT0wOworICAgLyoqIFBvaW50ZXIgZm9yIGZpcm13YXJlIGltYWdlIGRhdGEgKi8KKyAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworICAgY2hhciAqYnVmZmVyLCAqbGluZSwqcFRlbXA7CisgICBzaXplX3Qgc2l6ZTsKKyAgIGNoYXIgKm5hbWUsICp2YWx1ZTsKKyAgIHRDZmdJbmlFbnRyeSBjZmdJbmlUYWJsZVtNQVhfQ0ZHX0lOSV9JVEVNU107CisgICBWT1NfU1RBVFVTIHZvc19zdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIG1lbXNldChjZmdJbmlUYWJsZSwgMCwgc2l6ZW9mKGNmZ0luaVRhYmxlKSk7CisKKyAgIHN0YXR1cyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBXTEFOX0lOSV9GSUxFLCBwSGRkQ3R4LT5wYXJlbnRfZGV2KTsKKyAgIAorICAgaWYoc3RhdHVzKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiByZXF1ZXN0X2Zpcm13YXJlIGZhaWxlZCAlZFxuIixfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7ICAgCisgICB9CisgICBpZighZncgfHwgIWZ3LT5kYXRhIHx8ICFmdy0+c2l6ZSkgCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6ICVzIGRvd25sb2FkIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFdMQU5fSU5JX0ZJTEUpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfSAKKworICAgaGRkTG9nKExPRzEsICIlczogcWNvbV9jZmcuaW5pIFNpemUgJWRcbiIsX19GVU5DVElPTl9fLCBmdy0+c2l6ZSk7CisKKyAgIGJ1ZmZlciA9IChjaGFyKil2b3NfbWVtX21hbGxvYyhmdy0+c2l6ZSk7CisgICAKKyAgIGlmKE5VTEwgPT0gYnVmZmVyKSB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IGttYWxsb2MgZmFpbHVyZSIsX19GVU5DVElPTl9fKTsKKyAgICAgIHJlbGVhc2VfZmlybXdhcmUoZncpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfSAKKyAgIHBUZW1wID0gYnVmZmVyOworCisgICB2b3NfbWVtX2NvcHkoKHZvaWQqKWJ1ZmZlciwodm9pZCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisgICBzaXplID0gZnctPnNpemU7CisgIAorICAgd2hpbGUgKGJ1ZmZlciAhPSBOVUxMKQorICAgeworICAgICAgbGluZSA9IGdldF9uZXh0X2xpbmUoYnVmZmVyKTsKKyAgICAgIGJ1ZmZlciA9IGlfdHJpbShidWZmZXIpOworCisgICAgICBoZGRMb2coTE9HMSwgIiVzOiBpdGVtIiwgYnVmZmVyKTsKKworICAgICAgaWYoc3RybGVuKChjaGFyKilidWZmZXIpID09IDAgfHwgKmJ1ZmZlciA9PSAnIycpICB7CisgICAgICAgICBidWZmZXIgPSBsaW5lOworICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBlbHNlIGlmKHN0cm5jbXAoYnVmZmVyLCAiRU5EIiwgMykgPT0gMCApIHsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgbmFtZSA9IGJ1ZmZlcjsKKyAgICAgICAgIHdoaWxlKCpidWZmZXIgIT0gJz0nICYmICpidWZmZXIgIT0gJ1wwJykgCisgICAgICAgICAgICBidWZmZXIrKzsKKyAgICAgICAgIGlmKCpidWZmZXIgIT0gJ1wwJykgeworICAgICAgICAgICAgKmJ1ZmZlcisrID0gJ1wwJzsKKyAgICAgICAgICAgIGlfdHJpbShuYW1lKTsKKyAgICAgICAgICAgIGlmKHN0cmxlbiAobmFtZSkgIT0gMCkgeworICAgICAgICAgICAgICAgYnVmZmVyID0gaV90cmltKGJ1ZmZlcik7CisgICAgICAgICAgICAgICBpZihzdHJsZW4oYnVmZmVyKT4wKSB7CisgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgIHdoaWxlKCFpX2lzc3BhY2UoKmJ1ZmZlcikgJiYgKmJ1ZmZlciAhPSAnXDAnKSAKKyAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcisrOworICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICdcMCc7CisgICAgICAgICAgICAgICAgICBjZmdJbmlUYWJsZVtpXS5uYW1lPSBuYW1lOworICAgICAgICAgICAgICAgICAgY2ZnSW5pVGFibGVbaSsrXS52YWx1ZT0gdmFsdWU7CisgICAgICAgICAgICAgICAgICBpZihpID49IE1BWF9DRkdfSU5JX0lURU1TKSB7CisgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwiJXM6IE51bWJlciBvZiBpdGVtcyBpbiAlcyA+ICVkIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgV0xBTl9JTklfRklMRSwgTUFYX0NGR19JTklfSVRFTVMpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBidWZmZXIgPSBsaW5lOworICAgfQorCisgICAvL0xvb3AgdGhyb3VnaCB0aGUgcmVnaXN0cnkgdGFibGUgYW5kIGFwcGx5IGFsbCB0aGVzZSBjb25maWdzCisgICB2b3Nfc3RhdHVzID0gaGRkX2FwcGx5X2NmZ19pbmkocEhkZEN0eCwgY2ZnSW5pVGFibGUsIGkpOworCisgICByZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKyAgIHZvc19tZW1fZnJlZShwVGVtcCk7CisgICByZXR1cm4gdm9zX3N0YXR1czsKK30gCisKKworc3RhdGljIHZvaWQgcHJpbnRfaGRkX2NmZyhoZGRfY29udGV4dF90ICpwSGRkQ3R4KQoreworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIqKioqKioqKipDb25maWcgdmFsdWVzIGluIEhERCBBZGFwdGVyKioqKioqKiIpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW1JUU1RocmVzaG9sZF0gVmFsdWUgPSAlbHUiLHBIZGRDdHgtPmNmZ19pbmktPlJUU1RocmVzaG9sZCkgOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW09wZXJhdGluZ0NoYW5uZWxdIFZhbHVlID0gWyV1XSIscEhkZEN0eC0+Y2ZnX2luaS0+T3BlcmF0aW5nQ2hhbm5lbCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbUG93ZXJVc2FnZUNvbnRyb2xdIFZhbHVlID0gWyVzXSIscEhkZEN0eC0+Y2ZnX2luaS0+UG93ZXJVc2FnZUNvbnRyb2wpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2ZJc0ltcHNFbmFibGVkXSBWYWx1ZSA9IFsldV0iLHBIZGRDdHgtPmNmZ19pbmktPmZJc0ltcHNFbmFibGVkKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtBdXRvQm1wc1RpbWVyRW5hYmxlZF0gVmFsdWUgPSBbJXVdIixwSGRkQ3R4LT5jZmdfaW5pLT5mSXNBdXRvQm1wc1RpbWVyRW5hYmxlZCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbbkF1dG9CbXBzVGltZXJWYWx1ZV0gVmFsdWUgPSBbJWx1XSIscEhkZEN0eC0+Y2ZnX2luaS0+bkF1dG9CbXBzVGltZXJWYWx1ZSk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbblZjY1Jzc2lUcmlnZ2VyXSBWYWx1ZSA9IFsldV0iLHBIZGRDdHgtPmNmZ19pbmktPm5WY2NSc3NpVHJpZ2dlcik7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbZ0lic3NCc3NpZF0gVmFsdWUgPVsweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleF0iLAorICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+SWJzc0Jzc2lkLmJ5dGVzWzBdLHBIZGRDdHgtPmNmZ19pbmktPklic3NCc3NpZC5ieXRlc1sxXSwKKyAgICAgIHBIZGRDdHgtPmNmZ19pbmktPklic3NCc3NpZC5ieXRlc1syXSxwSGRkQ3R4LT5jZmdfaW5pLT5JYnNzQnNzaWQuYnl0ZXNbM10sCisgICAgICBwSGRkQ3R4LT5jZmdfaW5pLT5JYnNzQnNzaWQuYnl0ZXNbNF0scEhkZEN0eC0+Y2ZnX2luaS0+SWJzc0Jzc2lkLmJ5dGVzWzVdKTsKKworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICJOYW1lID0gW0ludGYwTWFjQWRkcmVzc10gVmFsdWUgPVsweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyWzBdLmJ5dGVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyWzBdLmJ5dGVzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyWzBdLmJ5dGVzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyWzBdLmJ5dGVzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyWzBdLmJ5dGVzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyWzBdLmJ5dGVzWzVdKTsKKworCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgIk5hbWUgPSBbSW50ZjFNYWNBZGRyZXNzXSBWYWx1ZSA9WzB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4XSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMV0uYnl0ZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMV0uYnl0ZXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMV0uYnl0ZXNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMV0uYnl0ZXNbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMV0uYnl0ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMV0uYnl0ZXNbNV0pOworCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgIk5hbWUgPSBbSW50ZjJNYWNBZGRyZXNzXSBWYWx1ZSA9WzB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4XSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMl0uYnl0ZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMl0uYnl0ZXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMl0uYnl0ZXNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMl0uYnl0ZXNbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMl0uYnl0ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMl0uYnl0ZXNbNV0pOworCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgIk5hbWUgPSBbSW50ZjNNYWNBZGRyZXNzXSBWYWx1ZSA9WzB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4XSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbM10uYnl0ZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbM10uYnl0ZXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbM10uYnl0ZXNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbM10uYnl0ZXNbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbM10uYnl0ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbM10uYnl0ZXNbNV0pOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbZ0FwRW5hYmxlVWFwc2RdIHZhbHVlID0gWyV1XVxuIixwSGRkQ3R4LT5jZmdfaW5pLT5hcFVhcHNkRW5hYmxlZCk7CisKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtnQVBDbnRyeUNvZGVdIFZhbHVlID1bJWMlYyVjXVxuIiwKKyAgICAgIHBIZGRDdHgtPmNmZ19pbmktPmFwQ250cnlDb2RlWzBdLHBIZGRDdHgtPmNmZ19pbmktPmFwQ250cnlDb2RlWzFdLAorICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+YXBDbnRyeUNvZGVbMl0pOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2dFbmFibGVBcFByb3RdIHZhbHVlID0gWyV1XSIsIHBIZGRDdHgtPmNmZ19pbmktPmFwUHJvdEVuYWJsZWQpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2dBUEF1dG9TaHV0T2ZmXSBWYWx1ZSA9IFsldV1cbiIsIHBIZGRDdHgtPmNmZ19pbmktPm5BUEF1dG9TaHV0T2ZmKTsKKworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2dFbmFibGVMaXN0ZW5Nb2RlXSBWYWx1ZSA9IFsldV1cbiIsIHBIZGRDdHgtPmNmZ19pbmktPm5FbmFibGVMaXN0ZW5Nb2RlKTsgIAorICBWT1NfVFJBQ0UgKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtnQXBQcm90ZWN0aW9uXSB2YWx1ZSA9IFsldV1cbiIscEhkZEN0eC0+Y2ZnX2luaS0+YXBQcm90ZWN0aW9uKTsKKyAgVk9TX1RSQUNFIChWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbZ0VuYWJsZUFwT0JTU1Byb3RdIHZhbHVlID0gWyV1XVxuIixwSGRkQ3R4LT5jZmdfaW5pLT5hcE9CU1NQcm90RW5hYmxlZCk7CisgIFZPU19UUkFDRSAoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2dBcEF1dG9DaGFubmVsU2VsZWN0aW9uXSB2YWx1ZSA9IFsldV1cbiIscEhkZEN0eC0+Y2ZnX2luaS0+YXBBdXRvQ2hhbm5lbFNlbGVjdGlvbik7CisjZW5kaWYKKyAgCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbQ2hhbm5lbEJvbmRpbmdNb2RlXSBWYWx1ZSA9IFslbHVdIixwSGRkQ3R4LT5jZmdfaW5pLT5uQ2hhbm5lbEJvbmRpbmdNb2RlMjRHSHopOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0NoYW5uZWxCb25kaW5nTW9kZV0gVmFsdWUgPSBbJWx1XSIscEhkZEN0eC0+Y2ZnX2luaS0+bkNoYW5uZWxCb25kaW5nTW9kZTVHSHopOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2RvdDExTW9kZV0gVmFsdWUgPSBbJWx1XSIscEhkZEN0eC0+Y2ZnX2luaS0+ZG90MTFNb2RlKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtXbW1Nb2RlXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5XbW1Nb2RlKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtVYXBzZE1hc2tdIFZhbHVlID0gWzB4JXhdICIscEhkZEN0eC0+Y2ZnX2luaS0+VWFwc2RNYXNrKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtQa3RDbGFzc2lmaWNhdGlvbkJhc2lzXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5Qa3RDbGFzc2lmaWNhdGlvbkJhc2lzKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtJbXBsaWNpdFFvc0lzRW5hYmxlZF0gVmFsdWUgPSBbJXVdIiwoaW50KXBIZGRDdHgtPmNmZ19pbmktPmJJbXBsaWNpdFFvc0VuYWJsZWQpOworCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbSW5mcmFVYXBzZFZvU3J2SW50dl0gVmFsdWUgPSBbJWx1XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhVWFwc2RWb1NydkludHYpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0luZnJhVWFwc2RWb1N1c3BJbnR2XSBWYWx1ZSA9IFslbHVdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFVYXBzZFZvU3VzcEludHYpOworCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbSW5mcmFVYXBzZFZpU3J2SW50dl0gVmFsdWUgPSBbJWx1XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhVWFwc2RWaVNydkludHYpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0luZnJhVWFwc2RWaVN1c3BJbnR2XSBWYWx1ZSA9IFslbHVdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFVYXBzZFZpU3VzcEludHYpOworCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbSW5mcmFVYXBzZEJlU3J2SW50dl0gVmFsdWUgPSBbJWx1XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhVWFwc2RCZVNydkludHYpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0luZnJhVWFwc2RCZVN1c3BJbnR2XSBWYWx1ZSA9IFslbHVdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFVYXBzZEJlU3VzcEludHYpOworCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbSW5mcmFVYXBzZEJrU3J2SW50dl0gVmFsdWUgPSBbJWx1XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhVWFwc2RCa1NydkludHYpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0luZnJhVWFwc2RCa1N1c3BJbnR2XSBWYWx1ZSA9IFslbHVdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFVYXBzZEJrU3VzcEludHYpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtJbmZyYUluYWN0aXZpdHlJbnRlcnZhbF0gVmFsdWUgPSBbJWx1XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhSW5hY3Rpdml0eUludGVydmFsKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtDY3hFbmFibGVkXSBWYWx1ZSA9IFslbHVdICIscEhkZEN0eC0+Y2ZnX2luaS0+aXNDY3hJbmlGZWF0dXJlRW5hYmxlZCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbRmFzdFRyYW5zaXRpb25FbmFibGVkXSBWYWx1ZSA9IFslbHVdICIscEhkZEN0eC0+Y2ZnX2luaS0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2dUeFBvd2VyQ2FwXSBWYWx1ZSA9IFslbHVdIGRCbSAiLHBIZGRDdHgtPmNmZ19pbmktPm5UeFBvd2VyQ2FwKTsKKyNlbmRpZiAKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtJbmZyYURpckFjVm9dIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhRGlyQWNWbyk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbSW5mcmFOb21Nc2R1U2l6ZUFjVm9dIFZhbHVlID0gWzB4JXhdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFOb21Nc2R1U2l6ZUFjVm8pOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0luZnJhTWVhbkRhdGFSYXRlQWNWb10gVmFsdWUgPSBbMHglbHhdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFNZWFuRGF0YVJhdGVBY1ZvKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtJbmZyYU1pblBoeVJhdGVBY1ZvXSBWYWx1ZSA9IFsweCVseF0gIixwSGRkQ3R4LT5jZmdfaW5pLT5JbmZyYU1pblBoeVJhdGVBY1ZvKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtJbmZyYVNiYUFjVm9dIFZhbHVlID0gWzB4JXhdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFTYmFBY1ZvKTsKKworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0luZnJhRGlyQWNWaV0gVmFsdWUgPSBbJXVdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFEaXJBY1ZpKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtJbmZyYU5vbU1zZHVTaXplQWNWaV0gVmFsdWUgPSBbMHgleF0gIixwSGRkQ3R4LT5jZmdfaW5pLT5JbmZyYU5vbU1zZHVTaXplQWNWaSk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbSW5mcmFNZWFuRGF0YVJhdGVBY1ZpXSBWYWx1ZSA9IFsweCVseF0gIixwSGRkQ3R4LT5jZmdfaW5pLT5JbmZyYU1lYW5EYXRhUmF0ZUFjVmkpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0luZnJhTWluUGh5UmF0ZUFjVmldIFZhbHVlID0gWzB4JWx4XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhTWluUGh5UmF0ZUFjVmkpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0luZnJhU2JhQWNWaV0gVmFsdWUgPSBbMHgleF0gIixwSGRkQ3R4LT5jZmdfaW5pLT5JbmZyYVNiYUFjVmkpOworCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbSW5mcmFEaXJBY0JlXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5JbmZyYURpckFjQmUpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0luZnJhTm9tTXNkdVNpemVBY0JlXSBWYWx1ZSA9IFsweCV4XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhTm9tTXNkdVNpemVBY0JlKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtJbmZyYU1lYW5EYXRhUmF0ZUFjQmVdIFZhbHVlID0gWzB4JWx4XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhTWVhbkRhdGFSYXRlQWNCZSk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbSW5mcmFNaW5QaHlSYXRlQWNCZV0gVmFsdWUgPSBbMHglbHhdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFNaW5QaHlSYXRlQWNCZSk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbSW5mcmFTYmFBY0JlXSBWYWx1ZSA9IFsweCV4XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhU2JhQWNCZSk7CisKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtJbmZyYURpckFjQmtdIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPkluZnJhRGlyQWNCayk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbSW5mcmFOb21Nc2R1U2l6ZUFjQmtdIFZhbHVlID0gWzB4JXhdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFOb21Nc2R1U2l6ZUFjQmspOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW0luZnJhTWVhbkRhdGFSYXRlQWNCa10gVmFsdWUgPSBbMHglbHhdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFNZWFuRGF0YVJhdGVBY0JrKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtJbmZyYU1pblBoeVJhdGVBY0JrXSBWYWx1ZSA9IFsweCVseF0gIixwSGRkQ3R4LT5jZmdfaW5pLT5JbmZyYU1pblBoeVJhdGVBY0JrKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtJbmZyYVNiYUFjQmtdIFZhbHVlID0gWzB4JXhdICIscEhkZEN0eC0+Y2ZnX2luaS0+SW5mcmFTYmFBY0JrKTsKKworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW1dmcUJrV2VpZ2h0XSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5XZnFCa1dlaWdodCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbV2ZxQmVXZWlnaHRdIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPldmcUJlV2VpZ2h0KTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtXZnFWaVdlaWdodF0gVmFsdWUgPSBbJXVdICIscEhkZEN0eC0+Y2ZnX2luaS0+V2ZxVmlXZWlnaHQpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW1dmcVZvV2VpZ2h0XSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5XZnFWb1dlaWdodCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbRGVsYXllZFRyaWdnZXJGcm1JbnRdIFZhbHVlID0gWyVsdV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5EZWxheWVkVHJpZ2dlckZybUludCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbbWNhc3RCY2FzdEZpbHRlclNldHRpbmddIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPm1jYXN0QmNhc3RGaWx0ZXJTZXR0aW5nKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtmaG9zdEFycE9mZmxvYWRdIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPmZob3N0QXJwT2ZmbG9hZCk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgIAorICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2ZGVEVuYWJsZV0gVmFsdWUgPSBbJWx1XSAiLHBIZGRDdHgtPmNmZ19pbmktPmZGVEVuYWJsZSk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbZkZUUmVzb3VyY2VSZXFTdXBwb3J0ZWRdIFZhbHVlID0gWyVsdV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5mRlRSZXNvdXJjZVJlcVN1cHBvcnRlZCk7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbbk5laWdoYm9yUmVhc3NvY1Jzc2lUaHJlc2hvbGRdIFZhbHVlID0gWyVsdV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5uTmVpZ2hib3JSZWFzc29jUnNzaVRocmVzaG9sZCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbbk5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZF0gVmFsdWUgPSBbJWx1XSAiLHBIZGRDdHgtPmNmZ19pbmktPm5OZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW25OZWlnaGJvclNjYW5NaW5DaGFuVGltZV0gVmFsdWUgPSBbJWx1XSAiLHBIZGRDdHgtPmNmZ19pbmktPm5OZWlnaGJvclNjYW5NaW5DaGFuVGltZSk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbbk5laWdoYm9yU2Nhbk1heENoYW5UaW1lXSBWYWx1ZSA9IFslbHVdICIscEhkZEN0eC0+Y2ZnX2luaS0+bk5laWdoYm9yU2Nhbk1heENoYW5UaW1lKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtuTWF4TmVpZ2hib3JSZXRyaWVzXSBWYWx1ZSA9IFslbHVdICIscEhkZEN0eC0+Y2ZnX2luaS0+bk1heE5laWdoYm9yUmVxVHJpZXMpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW25OZWlnaGJvclNjYW5QZXJpb2RdIFZhbHVlID0gWyVsdV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5uTmVpZ2hib3JTY2FuUGVyaW9kKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtuTmVpZ2hib3JTY2FuUmVzdWx0c1JlZnJlc2hQZXJpb2RdIFZhbHVlID0gWyVsdV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5uTmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZCk7CisjZW5kaWYKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtidXJzdFNpemVEZWZpbml0aW9uXSBWYWx1ZSA9IFsweCV4XSAiLHBIZGRDdHgtPmNmZ19pbmktPmJ1cnN0U2l6ZURlZmluaXRpb24pOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW3RzSW5mb0Fja1BvbGljeV0gVmFsdWUgPSBbMHgleF0gIixwSGRkQ3R4LT5jZmdfaW5pLT50c0luZm9BY2tQb2xpY3kpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW3JmU2V0dGxpbmdUaW1lVXNdIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPnJmU2V0dGxpbmdUaW1lVXMpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2JTaW5nbGVUaWRSY10gVmFsdWUgPSBbJXVdICIscEhkZEN0eC0+Y2ZnX2luaS0+YlNpbmdsZVRpZFJjKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtnRHluYW1pY1BTUG9sbHZhbHVlXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5keW5hbWljUHNQb2xsVmFsdWUpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2dBZGRUU1doZW5BQ01Jc09mZl0gVmFsdWUgPSBbJXVdICIscEhkZEN0eC0+Y2ZnX2luaS0+QWRkVFNXaGVuQUNNSXNPZmYpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2dWYWxpZGF0ZVNjYW5MaXN0XSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5mVmFsaWRhdGVTY2FuTGlzdCk7CisKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtnU3RhS2VlcEFsaXZlUGVyaW9kXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5pbmZyYVN0YUtlZXBBbGl2ZVBlcmlvZCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbZ0FwRGF0YUF2YWlsUG9sbEludGVyVmFsXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5hcERhdGFBdmFpbFBvbGxQZXJpb2RJbk1zKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtnRW5hYmxlQnRBbXBdIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPmVuYWJsZUJ0QW1wKTsKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtCdEFtcFByZWZlcnJlZENoYW5uZWxdIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPnByZWZlcnJlZENoYW5uZWwpOworI2VuZGlmIC8vV0xBTl9CVEFNUF9GRUFUVVJFCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbQmFuZENhcGFiaWxpdHldIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPm5CYW5kQ2FwYWJpbGl0eSk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbZkVuYWJsZUJlYWNvbkVhcmx5VGVybWluYXRpb25dIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPmZFbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFt0ZWxlQmNuV2FrZXVwRW5hYmxlXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT50ZWxlQmNuV2FrZXVwRW4pOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW3RyYW5zTGlzdGVuSW50ZXJ2YWxdIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPm5UZWxlQmNuVHJhbnNMaXN0ZW5JbnRlcnZhbCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbdHJhbnNMaU51bUlkbGVCZWFjb25zXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5uVGVsZUJjblRyYW5zTGlOdW1JZGxlQmVhY29ucyk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbbWF4TGlzdGVuSW50ZXJ2YWxdIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPm5UZWxlQmNuTWF4TGlzdGVuSW50ZXJ2YWwpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW21heExpTnVtSWRsZUJlYWNvbnNdIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPm5UZWxlQmNuTWF4TGlOdW1JZGxlQmVhY29ucyk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbYmNuRWFybHlUZXJtV2FrZUludGVydmFsXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5iY25FYXJseVRlcm1XYWtlSW50ZXJ2YWwpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW2dBcERhdGFBdmFpbFBvbGxJbnRlclZhbF0gVmFsdWUgPSBbJXVdICIscEhkZEN0eC0+Y2ZnX2luaS0+YXBEYXRhQXZhaWxQb2xsUGVyaW9kSW5Ncyk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIk5hbWUgPSBbZ0VuYWJsZUJ5cGFzczExZF0gVmFsdWUgPSBbJXVdICIscEhkZEN0eC0+Y2ZnX2luaS0+ZW5hYmxlQnlwYXNzMTFkKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtnRW5hYmxlREZTQ2hubFNjYW5dIFZhbHVlID0gWyV1XSAiLHBIZGRDdHgtPmNmZ19pbmktPmVuYWJsZURGU0NobmxTY2FuKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTmFtZSA9IFtnUmVwb3J0TWF4TGlua1NwZWVkXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT5yZXBvcnRNYXhMaW5rU3BlZWQpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJOYW1lID0gW3RoZXJtYWxNaXRpZ2F0aW9uRW5hYmxlXSBWYWx1ZSA9IFsldV0gIixwSGRkQ3R4LT5jZmdfaW5pLT50aGVybWFsTWl0aWdhdGlvbkVuYWJsZSk7Cit9CisKKworI2RlZmluZSBDRkdfVkFMVUVfTUFYX0xFTiAyNTYKKyNkZWZpbmUgQ0ZHX0VOVFJZX01BWF9MRU4gKDMyK0NGR19WQUxVRV9NQVhfTEVOKQorVk9TX1NUQVRVUyBoZGRfY2ZnX2dldF9jb25maWcoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgY2hhciAqcEJ1ZiwgaW50IGJ1ZmxlbikKK3sKKyAgIHVuc2lnbmVkIGludCBpZHg7CisgICBSRUdfVEFCTEVfRU5UUlkgKnBSZWdFbnRyeSA9IGdfcmVnaXN0cnlfdGFibGU7CisgICB1bnNpZ25lZCBsb25nIGNSZWdUYWJsZUVudHJpZXMgID0gc2l6ZW9mKGdfcmVnaXN0cnlfdGFibGUpIC8gc2l6ZW9mKCBnX3JlZ2lzdHJ5X3RhYmxlWyAwIF0pOworICAgdl9VMzJfdCB2YWx1ZTsKKyAgIGNoYXIgdmFsdWVTdHJbQ0ZHX1ZBTFVFX01BWF9MRU5dOworICAgY2hhciBjb25maWdTdHJbQ0ZHX0VOVFJZX01BWF9MRU5dOworICAgY2hhciAqZm10OworICAgdm9pZCAqcEZpZWxkOworICAgdl9NQUNBRERSX3QgKnBNYWNBZGRyOworICAgY2hhciAqcEN1ciA9IHBCdWY7CisgICBpbnQgY3VybGVuOworCisgICAvLyBzdGFydCB3aXRoIGFuIGVtcHR5IHN0cmluZworICAgKnBDdXIgPSAnXDAnOworCisgICBmb3IgKCBpZHggPSAwOyBpZHggPCBjUmVnVGFibGVFbnRyaWVzOyBpZHgrKywgcFJlZ0VudHJ5KysgKSAKKyAgIHsKKyAgICAgIHBGaWVsZCA9ICggKHZfVThfdCAqKXBIZGRDdHgtPmNmZ19pbmkpICsgcFJlZ0VudHJ5LT5WYXJPZmZzZXQ7CisKKyAgICAgIGlmICggKCBXTEFOX1BBUkFNX0ludGVnZXIgICAgICAgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlICkgfHwKKyAgICAgICAgICAgKCBXTEFOX1BBUkFNX1NpZ25lZEludGVnZXIgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlICkgfHwKKyAgICAgICAgICAgKCBXTEFOX1BBUkFNX0hleEludGVnZXIgICAgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlICkgKSAKKyAgICAgIHsKKyAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgIG1lbWNweSggJnZhbHVlLCBwRmllbGQsIHBSZWdFbnRyeS0+VmFyU2l6ZSApOworICAgICAgICAgaWYgKCBXTEFOX1BBUkFNX0hleEludGVnZXIgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZtdCA9ICIleCI7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmICggV0xBTl9QQVJBTV9TaWduZWRJbnRlZ2VyID09IHBSZWdFbnRyeS0+UmVnVHlwZSApCisgICAgICAgICB7CisgICAgICAgICAgICBmbXQgPSAiJWQiOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgZm10ID0gIiV1IjsKKyAgICAgICAgIH0KKyAgICAgICAgIHNucHJpbnRmKHZhbHVlU3RyLCBDRkdfVkFMVUVfTUFYX0xFTiwgZm10LCB2YWx1ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmICggV0xBTl9QQVJBTV9TdHJpbmcgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlICkKKyAgICAgIHsKKyAgICAgICAgIHNucHJpbnRmKHZhbHVlU3RyLCBDRkdfVkFMVUVfTUFYX0xFTiwgIiVzIiwgKGNoYXIgKilwRmllbGQpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIFdMQU5fUEFSQU1fTWFjQWRkciA9PSBwUmVnRW50cnktPlJlZ1R5cGUgKQorICAgICAgeworICAgICAgICAgcE1hY0FkZHIgPSAodl9NQUNBRERSX3QgKikgcEZpZWxkOworICAgICAgICAgc25wcmludGYodmFsdWVTdHIsIENGR19WQUxVRV9NQVhfTEVOLAorICAgICAgICAgICAgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgICAgICAgIHBNYWNBZGRyLT5ieXRlc1swXSwKKyAgICAgICAgICAgICAgICAgIHBNYWNBZGRyLT5ieXRlc1sxXSwKKyAgICAgICAgICAgICAgICAgIHBNYWNBZGRyLT5ieXRlc1syXSwKKyAgICAgICAgICAgICAgICAgIHBNYWNBZGRyLT5ieXRlc1szXSwKKyAgICAgICAgICAgICAgICAgIHBNYWNBZGRyLT5ieXRlc1s0XSwKKyAgICAgICAgICAgICAgICAgIHBNYWNBZGRyLT5ieXRlc1s1XSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBzbnByaW50Zih2YWx1ZVN0ciwgQ0ZHX1ZBTFVFX01BWF9MRU4sICIodW5oYW5kbGVkKSIpOworICAgICAgfQorICAgICAgY3VybGVuID0gc25wcmludGYoY29uZmlnU3RyLCBDRkdfRU5UUllfTUFYX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcz1bJXNdJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwUmVnRW50cnktPlJlZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfYml0KGlkeCwgKHZvaWQgKikmcEhkZEN0eC0+Y2ZnX2luaS0+YkV4cGxpY2l0Q2ZnKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiKiIgOiAiIik7CisKKyAgICAgIC8vIGlkZWFsbHkgd2Ugd2FudCB0byByZXR1cm4gdGhlIGNvbmZpZyB0byB0aGUgYXBwbGljYXRpb24KKyAgICAgIC8vIGhvd2V2ZXIgdGhlIGNvbmZpZyBpcyB0b28gYmlnIHNvIHdlIGp1c3QgcHJpbnRrKCkgZm9yIG5vdworI2lmZGVmIFJFVFVSTl9JTl9CVUZGRVIKKyAgICAgIGlmIChjdXJsZW4gPD0gYnVmbGVuKQorICAgICAgeworICAgICAgICAgLy8gY29weSBzdHJpbmcgKyAnXDAnCisgICAgICAgICBtZW1jcHkocEN1ciwgY29uZmlnU3RyLCBjdXJsZW4rMSk7CisKKyAgICAgICAgIC8vIGFjY291bnQgZm9yIGFkZGl0aW9uOworICAgICAgICAgcEN1ciArPSBjdXJsZW47CisgICAgICAgICBidWZsZW4gLT0gY3VybGVuOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLy8gYnVmZmVyIHNwYWNlIGV4aGF1c3RlZCwgcmV0dXJuIHdoYXQgd2UgaGF2ZQorICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9SRVNPVVJDRVM7CisgICAgICB9CisjZWxzZQorICAgICAgcHJpbnRrKEtFUk5fQ1JJVCAiJXMiLCBjb25maWdTdHIpOworI2VuZGlmIC8vIFJFVFVSTl9JTl9CVUZGRVIKKworfQorCisjaWZuZGVmIFJFVFVSTl9JTl9CVUZGRVIKKyAgIC8vIG5vdGlmeSBhcHBsaWNhdGlvbiB0aGF0IG91dHB1dCBpcyBpbiBzeXN0ZW0gbG9nCisgICBzbnByaW50ZihwQ3VyLCBidWZsZW4sICJXTEFOIGNvbmZpZ3VyYXRpb24gd3JpdHRlbiB0byBzeXN0ZW0gbG9nIik7CisjZW5kaWYgLy8gUkVUVVJOX0lOX0JVRkZFUgorCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgVk9TX1NUQVRVUyBmaW5kX2NmZ19pdGVtICh0Q2ZnSW5pRW50cnkqIGluaVRhYmxlLCB1bnNpZ25lZCBsb25nIGVudHJpZXMsCisgICAgY2hhciAqbmFtZSwgY2hhcioqIHZhbHVlKSAKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB1bnNpZ25lZCBsb25nIGk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKyAgICAgaWYgKHN0cmNtcChpbmlUYWJsZVtpXS5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgKnZhbHVlID0gaW5pVGFibGVbaV0udmFsdWU7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiRm91bmQgJXMgZW50cnkgZm9yIE5hbWU9WyVzXSBWYWx1ZT1bJXNdICIsCisgICAgICAgICAgIFdMQU5fSU5JX0ZJTEUsIG5hbWUsICp2YWx1ZSk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgfQorICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHBhcnNlSGV4RGlnaXQoY2hhciBjKQoreworICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgcmV0dXJuIGMtJzAnOworICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgcmV0dXJuIGMtJ2EnKzEwOworICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgcmV0dXJuIGMtJ0EnKzEwOworCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBWT1NfU1RBVFVTIGhkZF9hcHBseV9jZmdfaW5pKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0Q2ZnSW5pRW50cnkqIGluaVRhYmxlLCB1bnNpZ25lZCBsb25nIGVudHJpZXMpCit7CisgICBWT1NfU1RBVFVTIG1hdGNoX3N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgVk9TX1NUQVRVUyByZXRfc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdW5zaWduZWQgaW50IGlkeDsKKyAgIHZvaWQgKnBGaWVsZDsKKyAgIGNoYXIgKnZhbHVlX3N0ciA9IE5VTEw7CisgICB1bnNpZ25lZCBsb25nIGxlbl92YWx1ZV9zdHI7CisgICBjaGFyICpjYW5kaWRhdGU7CisgICB2X1UzMl90IHZhbHVlOworICAgdl9TMzFfdCBzdmFsdWU7CisgICB2b2lkICpwU3RydWN0QmFzZSA9IHBIZGRDdHgtPmNmZ19pbmk7CisgICBSRUdfVEFCTEVfRU5UUlkgKnBSZWdFbnRyeSA9IGdfcmVnaXN0cnlfdGFibGU7CisgICB1bnNpZ25lZCBsb25nIGNSZWdUYWJsZUVudHJpZXMgID0gc2l6ZW9mKGdfcmVnaXN0cnlfdGFibGUpIC8gc2l6ZW9mKCBnX3JlZ2lzdHJ5X3RhYmxlWyAwIF0pOworICAgdl9VMzJfdCBjYk91dFN0cmluZzsKKyAgIGludCBpOworCisgICAvLyBzYW5pdHkgdGVzdAorICAgaWYgKE1BWF9DRkdfSU5JX0lURU1TIDwgY1JlZ1RhYmxlRW50cmllcykKKyAgIHsKKyAgICAgIGhkZExvZyhMT0dFLCAiJXM6IE1BWF9DRkdfSU5JX0lURU1TIHRvbyBzbWFsbCwgbXVzdCBiZSBhdCBsZWFzdCAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjUmVnVGFibGVFbnRyaWVzKTsKKyAgIH0KKworICAgZm9yICggaWR4ID0gMDsgaWR4IDwgY1JlZ1RhYmxlRW50cmllczsgaWR4KyssIHBSZWdFbnRyeSsrICkKKyAgIHsKKyAgICAgIC8vQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbiBmaWVsZCBpbiB0aGUgc3RydWN0dXJlLgorICAgICAgcEZpZWxkID0gKCAodl9VOF90ICopcFN0cnVjdEJhc2UgKSsgcFJlZ0VudHJ5LT5WYXJPZmZzZXQ7CisKKyAgICAgIG1hdGNoX3N0YXR1cyA9IGZpbmRfY2ZnX2l0ZW0oaW5pVGFibGUsIGVudHJpZXMsIHBSZWdFbnRyeS0+UmVnTmFtZSwgJnZhbHVlX3N0cik7CisKKyAgICAgIGlmKCAobWF0Y2hfc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykgJiYgKCBwUmVnRW50cnktPkZsYWdzICYgVkFSX0ZMQUdTX1JFUVVJUkVEICkgKQorICAgICAgeworICAgICAgICAgLy8gSWYgd2UgY291bGQgbm90IHJlYWQgdGhlIGNmZyBpdGVtIGFuZCBpdCBpcyByZXF1aXJlZCwgdGhpcyBpcyBhbiBlcnJvci4KKyAgICAgICAgIGhkZExvZyhMT0dFLCAiJXM6IEZhaWxlZCB0byByZWFkIHJlcXVpcmVkIGNvbmZpZyBwYXJhbWV0ZXIgJXMiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwUmVnRW50cnktPlJlZ05hbWUpOworICAgICAgICAgcmV0X3N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICggKCBXTEFOX1BBUkFNX0ludGVnZXIgICAgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlICkgfHwKKyAgICAgICAgICAgKCBXTEFOX1BBUkFNX0hleEludGVnZXIgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlICkgKQorICAgICAgeworICAgICAgICAgLy8gSWYgc3VjY2Vzc2Z1bGx5IHJlYWQgZnJvbSB0aGUgcmVnaXN0cnksIHVzZSB0aGUgdmFsdWUgcmVhZC4KKyAgICAgICAgIC8vIElmIG5vdCwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgaWYgKCBtYXRjaF9zdGF0dXMgPT0gVk9TX1NUQVRVU19TVUNDRVNTICYmIChXTEFOX1BBUkFNX0ludGVnZXIgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzaW1wbGVfc3RydG91bCh2YWx1ZV9zdHIsIE5VTEwsIDEwKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYgKCBtYXRjaF9zdGF0dXMgPT0gVk9TX1NUQVRVU19TVUNDRVNTICYmIChXTEFOX1BBUkFNX0hleEludGVnZXIgPT0gcFJlZ0VudHJ5LT5SZWdUeXBlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzaW1wbGVfc3RydG91bCh2YWx1ZV9zdHIsIE5VTEwsIDE2KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSBwUmVnRW50cnktPlZhckRlZmF1bHQ7CisgICAgICAgICB9CisKKyAgICAgICAgIC8vIElmIHRoaXMgcGFyYW1ldGVyIG5lZWRzIHJhbmdlIGNoZWNraW5nLCBkbyBpdCBoZXJlLgorICAgICAgICAgaWYgKCBwUmVnRW50cnktPkZsYWdzICYgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdmFsdWUgPiBwUmVnRW50cnktPlZhck1heCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBSZWcgUGFyYW1ldGVyICVzID4gYWxsb3dlZCBNYXhpbXVtIFslbHUgPiAlbHVdLiBFbmZvcmNpbmcgTWF4aW11bSIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwUmVnRW50cnktPlJlZ05hbWUsIHZhbHVlLCBwUmVnRW50cnktPlZhck1heCApOworICAgICAgICAgICAgICAgdmFsdWUgPSBwUmVnRW50cnktPlZhck1heDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB2YWx1ZSA8IHBSZWdFbnRyeS0+VmFyTWluICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGhkZExvZyhMT0dFLCAiJXM6IFJlZyBQYXJhbWV0ZXIgJXMgPCBhbGxvd2VkIE1pbmltdW0gWyVsdSA8ICVsdV0uIEVuZm9yY2luZyBNaW5pbXVtIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBSZWdFbnRyeS0+UmVnTmFtZSwgdmFsdWUsIHBSZWdFbnRyeS0+VmFyTWluKTsKKyAgICAgICAgICAgICAgIHZhbHVlID0gcFJlZ0VudHJ5LT5WYXJNaW47CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICAvLyBJZiB0aGlzIHBhcmFtZXRlciBuZWVkcyByYW5nZSBjaGVja2luZywgZG8gaXQgaGVyZS4KKyAgICAgICAgIGVsc2UgaWYgKCBwUmVnRW50cnktPkZsYWdzICYgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxUICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdmFsdWUgPiBwUmVnRW50cnktPlZhck1heCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBSZWcgUGFyYW1ldGVyICVzID4gYWxsb3dlZCBNYXhpbXVtIFslbHUgPiAlbHVdLiBFbmZvcmNpbmcgRGVmYXVsdD0gJWx1IiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcFJlZ0VudHJ5LT5SZWdOYW1lLCB2YWx1ZSwgcFJlZ0VudHJ5LT5WYXJNYXgsIHBSZWdFbnRyeS0+VmFyRGVmYXVsdCAgKTsKKyAgICAgICAgICAgICAgIHZhbHVlID0gcFJlZ0VudHJ5LT5WYXJEZWZhdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHZhbHVlIDwgcFJlZ0VudHJ5LT5WYXJNaW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsICIlczogUmVnIFBhcmFtZXRlciAlcyA8IGFsbG93ZWQgTWluaW11bSBbJWx1IDwgJWx1XS4gRW5mb3JjaW5nIERlZmF1bHQ9ICVsdSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBSZWdFbnRyeS0+UmVnTmFtZSwgdmFsdWUsIHBSZWdFbnRyeS0+VmFyTWluLCBwUmVnRW50cnktPlZhckRlZmF1bHQgICk7CisgICAgICAgICAgICAgICB2YWx1ZSA9IHBSZWdFbnRyeS0+VmFyRGVmYXVsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgLy8gTW92ZSB0aGUgdmFyaWFibGUgaW50byB0aGUgb3V0cHV0IGZpZWxkLgorICAgICAgICAgbWVtY3B5KCBwRmllbGQsICZ2YWx1ZSwgcFJlZ0VudHJ5LT5WYXJTaXplICk7CisgICAgICB9CisgICAgICBlbHNlIGlmICggV0xBTl9QQVJBTV9TaWduZWRJbnRlZ2VyID09IHBSZWdFbnRyeS0+UmVnVHlwZSApCisgICAgICB7CisgICAgICAgICAvLyBJZiBzdWNjZXNzZnVsbHkgcmVhZCBmcm9tIHRoZSByZWdpc3RyeSwgdXNlIHRoZSB2YWx1ZSByZWFkLgorICAgICAgICAgLy8gSWYgbm90LCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTID09IG1hdGNoX3N0YXR1cykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN2YWx1ZSA9IHNpbXBsZV9zdHJ0b2wodmFsdWVfc3RyLCBOVUxMLCAxMCk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBzdmFsdWUgPSAodl9TMzFfdClwUmVnRW50cnktPlZhckRlZmF1bHQ7CisgICAgICAgICB9CisKKyAgICAgICAgIC8vIElmIHRoaXMgcGFyYW1ldGVyIG5lZWRzIHJhbmdlIGNoZWNraW5nLCBkbyBpdCBoZXJlLgorICAgICAgICAgaWYgKCBwUmVnRW50cnktPkZsYWdzICYgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3ZhbHVlID4gKHZfUzMxX3QpcFJlZ0VudHJ5LT5WYXJNYXggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsICIlczogUmVnIFBhcmFtZXRlciAlcyA+IGFsbG93ZWQgTWF4aW11bSAiCisgICAgICAgICAgICAgICAgICAgICAgIlslbGQgPiAlbGRdLiBFbmZvcmNpbmcgTWF4aW11bSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICBwUmVnRW50cnktPlJlZ05hbWUsIHN2YWx1ZSwgKGludClwUmVnRW50cnktPlZhck1heCApOworICAgICAgICAgICAgICAgc3ZhbHVlID0gKHZfUzMxX3QpcFJlZ0VudHJ5LT5WYXJNYXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3ZhbHVlIDwgKHZfUzMxX3QpcFJlZ0VudHJ5LT5WYXJNaW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsICIlczogUmVnIFBhcmFtZXRlciAlcyA8IGFsbG93ZWQgTWluaW11bSAiCisgICAgICAgICAgICAgICAgICAgICAgIlslbGQgPCAlbGRdLiBFbmZvcmNpbmcgTWluaW11bSIsICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgcFJlZ0VudHJ5LT5SZWdOYW1lLCBzdmFsdWUsIChpbnQpcFJlZ0VudHJ5LT5WYXJNaW4pOworICAgICAgICAgICAgICAgc3ZhbHVlID0gKHZfUzMxX3QpcFJlZ0VudHJ5LT5WYXJNaW47CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICAvLyBJZiB0aGlzIHBhcmFtZXRlciBuZWVkcyByYW5nZSBjaGVja2luZywgZG8gaXQgaGVyZS4KKyAgICAgICAgIGVsc2UgaWYgKCBwUmVnRW50cnktPkZsYWdzICYgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxUICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3ZhbHVlID4gKHZfUzMxX3QpcFJlZ0VudHJ5LT5WYXJNYXggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsICIlczogUmVnIFBhcmFtZXRlciAlcyA+IGFsbG93ZWQgTWF4aW11bSAiCisgICAgICAgICAgICAgICAgICAgICAgIlslbGQgPiAlbGRdLiBFbmZvcmNpbmcgRGVmYXVsdD0gJWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBSZWdFbnRyeS0+UmVnTmFtZSwgc3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpcFJlZ0VudHJ5LT5WYXJNYXgsCisgICAgICAgICAgICAgICAgICAgICAgKGludClwUmVnRW50cnktPlZhckRlZmF1bHQgICk7CisgICAgICAgICAgICAgICBzdmFsdWUgPSAodl9TMzFfdClwUmVnRW50cnktPlZhckRlZmF1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3ZhbHVlIDwgKHZfUzMxX3QpcFJlZ0VudHJ5LT5WYXJNaW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsICIlczogUmVnIFBhcmFtZXRlciAlcyA8IGFsbG93ZWQgTWluaW11bSAiCisgICAgICAgICAgICAgICAgICAgICAgIlslbGQgPCAlbGRdLiBFbmZvcmNpbmcgRGVmYXVsdD0gJWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBSZWdFbnRyeS0+UmVnTmFtZSwgc3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpcFJlZ0VudHJ5LT5WYXJNaW4sCisgICAgICAgICAgICAgICAgICAgICAgKGludClwUmVnRW50cnktPlZhckRlZmF1bHQpOworICAgICAgICAgICAgICAgc3ZhbHVlID0gcFJlZ0VudHJ5LT5WYXJEZWZhdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICAvLyBNb3ZlIHRoZSB2YXJpYWJsZSBpbnRvIHRoZSBvdXRwdXQgZmllbGQuCisgICAgICAgICBtZW1jcHkoIHBGaWVsZCwgJnN2YWx1ZSwgcFJlZ0VudHJ5LT5WYXJTaXplICk7CisgICAgICB9CisgICAgICAvLyBIYW5kbGUgc3RyaW5nIHBhcmFtZXRlcnMKKyAgICAgIGVsc2UgaWYgKCBXTEFOX1BBUkFNX1N0cmluZyA9PSBwUmVnRW50cnktPlJlZ1R5cGUgKQorICAgICAgeworI2lmZGVmIFdMQU5fQ0ZHX0RFQlVHCisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJSZWdOYW1lID0gJXMsIFZhck9mZnNldCAldSBWYXJTaXplICV1IFZhckRlZmF1bHQgJXNcbiIsCisgICAgICAgICAgICBwUmVnRW50cnktPlJlZ05hbWUsIHBSZWdFbnRyeS0+VmFyT2Zmc2V0LCBwUmVnRW50cnktPlZhclNpemUsIChjaGFyKilwUmVnRW50cnktPlZhckRlZmF1bHQpOyAKKyNlbmRpZgorCisgICAgICAgICBpZiAoIG1hdGNoX3N0YXR1cyA9PSBWT1NfU1RBVFVTX1NVQ0NFU1MpIAorICAgICAgICAgeworICAgICAgICAgICAgbGVuX3ZhbHVlX3N0ciA9IHN0cmxlbih2YWx1ZV9zdHIpOworCisgICAgICAgICAgICBpZihsZW5fdmFsdWVfc3RyID4gKHBSZWdFbnRyeS0+VmFyU2l6ZSAtIDEpKSB7CisgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBJbnZhbGlkIFZhbHVlPVslc10gc3BlY2lmaWVkIGZvciBOYW1lPVslc10gaW4gJXNcbiIsIAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB2YWx1ZV9zdHIsIHBSZWdFbnRyeS0+UmVnTmFtZSwgV0xBTl9JTklfRklMRSk7CisgICAgICAgICAgICAgICBjYk91dFN0cmluZyA9IHV0aWxNaW4oIHN0cmxlbiggKGNoYXIgKilwUmVnRW50cnktPlZhckRlZmF1bHQgKSwgcFJlZ0VudHJ5LT5WYXJTaXplIC0gMSApOworICAgICAgICAgICAgICAgbWVtY3B5KCBwRmllbGQsICh2b2lkICopKHBSZWdFbnRyeS0+VmFyRGVmYXVsdCksIGNiT3V0U3RyaW5nICk7CisgICAgICAgICAgICAgICAoICh2X1U4X3QgKilwRmllbGQgKVsgY2JPdXRTdHJpbmcgXSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBtZW1jcHkoIHBGaWVsZCwgKHZvaWQgKikodmFsdWVfc3RyKSwgbGVuX3ZhbHVlX3N0cik7CisgICAgICAgICAgICAgICAoICh2X1U4X3QgKilwRmllbGQgKVsgbGVuX3ZhbHVlX3N0ciBdID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBGYWlsZWQgdG8gcmVhZCB0aGUgc3RyaW5nIHBhcmFtZXRlciBmcm9tIHRoZSByZWdpc3RyeS4gIFVzZSB0aGUgZGVmYXVsdC4KKyAgICAgICAgICAgIGNiT3V0U3RyaW5nID0gdXRpbE1pbiggc3RybGVuKCAoY2hhciAqKXBSZWdFbnRyeS0+VmFyRGVmYXVsdCApLCBwUmVnRW50cnktPlZhclNpemUgLSAxICk7CisgICAgICAgICAgICBtZW1jcHkoIHBGaWVsZCwgKHZvaWQgKikocFJlZ0VudHJ5LT5WYXJEZWZhdWx0KSwgY2JPdXRTdHJpbmcgKTsKKyAgICAgICAgICAgICggKHZfVThfdCAqKXBGaWVsZCApWyBjYk91dFN0cmluZyBdID0gJ1wwJzsgICAgICAgICAgICAgICAgIAorICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoIFdMQU5fUEFSQU1fTWFjQWRkciA9PSBwUmVnRW50cnktPlJlZ1R5cGUgKQorICAgICAgeworICAgICAgICAgaWYocFJlZ0VudHJ5LT5WYXJTaXplICE9IFZPU19NQUNfQUREUl9TSVpFKSB7CisgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBJbnZhbGlkIFZhclNpemUgJXUgZm9yIE5hbWU9WyVzXVxuIiwgCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwUmVnRW50cnktPlZhclNpemUsIHBSZWdFbnRyeS0+UmVnTmFtZSk7IAorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisgICAgICAgICBjYW5kaWRhdGUgPSAoY2hhciopcFJlZ0VudHJ5LT5WYXJEZWZhdWx0OworICAgICAgICAgaWYgKCBtYXRjaF9zdGF0dXMgPT0gVk9TX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICBsZW5fdmFsdWVfc3RyID0gc3RybGVuKHZhbHVlX3N0cik7CisgICAgICAgICAgICBpZihsZW5fdmFsdWVfc3RyICE9IChWT1NfTUFDX0FERFJfU0laRSoyKSkgeworICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsICIlczogSW52YWxpZCBNQUMgYWRkciBbJXNdIHNwZWNpZmllZCBmb3IgTmFtZT1bJXNdIGluICVzXG4iLCAKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmFsdWVfc3RyLCBwUmVnRW50cnktPlJlZ05hbWUsIFdMQU5fSU5JX0ZJTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gdmFsdWVfc3RyOworICAgICAgICAgfQorICAgICAgICAgLy9wYXJzZSB0aGUgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiB0aGUgYnl0ZSBhcnJheQorICAgICAgICAgZm9yKGk9MDsgaTxWT1NfTUFDX0FERFJfU0laRTsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgKChjaGFyKilwRmllbGQpW2ldID0gCisgICAgICAgICAgICAgIChjaGFyKShwYXJzZUhleERpZ2l0KGNhbmRpZGF0ZVtpKjJdKSoxNiArIHBhcnNlSGV4RGlnaXQoY2FuZGlkYXRlW2kqMisxXSkpOyAKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhMT0dFLCAiJXM6IFVua25vd24gcGFyYW0gdHlwZSBmb3IgbmFtZVslc10gaW4gcmVnaXN0cnkgdGFibGVcbiIsIAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwUmVnRW50cnktPlJlZ05hbWUpOworICAgICAgfQorCisgICAgICAvLyBkaWQgd2Ugc3VjY2Vzc2Z1bGx5IHBhcnNlIGEgY2ZnIGl0ZW0gZm9yIHRoaXMgcGFyYW1ldGVyPworICAgICAgaWYoIChtYXRjaF9zdGF0dXMgPT0gVk9TX1NUQVRVU19TVUNDRVNTKSAmJgorICAgICAgICAgIChpZHggPCBNQVhfQ0ZHX0lOSV9JVEVNUykgKQorICAgICAgeworICAgICAgICAgc2V0X2JpdChpZHgsICh2b2lkICopJnBIZGRDdHgtPmNmZ19pbmktPmJFeHBsaWNpdENmZyk7CisgICAgICB9CisgICB9CisKKyAgIHByaW50X2hkZF9jZmcocEhkZEN0eCk7CisKKyAgcmV0dXJuKCByZXRfc3RhdHVzICk7Cit9CisKK2VDc3JQaHlNb2RlIGhkZF9jZmdfeGxhdGVfdG9fY3NyX3BoeV9tb2RlKCBlSGRkRG90MTFNb2RlIGRvdDExTW9kZSApCit7CisgICBzd2l0Y2ggKGRvdDExTW9kZSkgCisgICB7CisgICAgICBjYXNlIChlSEREX0RPVDExX01PREVfYWJnKToKKyAgICAgICAgIHJldHVybiBlQ1NSX0RPVDExX01PREVfYWJnOworICAgICAgY2FzZSAoZUhERF9ET1QxMV9NT0RFXzExYik6CisgICAgICAgICByZXR1cm4gZUNTUl9ET1QxMV9NT0RFXzExYjsKKyAgICAgIGNhc2UgKGVIRERfRE9UMTFfTU9ERV8xMWcpOgorICAgICAgICAgcmV0dXJuIGVDU1JfRE9UMTFfTU9ERV8xMWc7CisgICAgICBkZWZhdWx0OgorICAgICAgY2FzZSAoZUhERF9ET1QxMV9NT0RFXzExbik6CisgICAgICAgICByZXR1cm4gZUNTUl9ET1QxMV9NT0RFXzExbjsKKyAgICAgIGNhc2UgKGVIRERfRE9UMTFfTU9ERV8xMWdfT05MWSk6CisgICAgICAgICByZXR1cm4gZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZOworICAgICAgY2FzZSAoZUhERF9ET1QxMV9NT0RFXzExbl9PTkxZKToKKyAgICAgICAgIHJldHVybiBlQ1NSX0RPVDExX01PREVfMTFuX09OTFk7CisgICAgICBjYXNlIChlSEREX0RPVDExX01PREVfMTFiX09OTFkpOgorICAgICAgICAgcmV0dXJuIGVDU1JfRE9UMTFfTU9ERV8xMWJfT05MWTsKKyAgICAgIGNhc2UgKGVIRERfRE9UMTFfTU9ERV9BVVRPKToKKyAgICAgICAgIHJldHVybiBlQ1NSX0RPVDExX01PREVfQVVUTzsKKyAgIH0KKworfQorCitzdGF0aWMgdm9pZCBoZGRfc2V0X2J0Y19jb25maWcoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkgCit7CisgICBoZGRfY29uZmlnX3QgKnBDb25maWcgPSBwSGRkQ3R4LT5jZmdfaW5pOworICAgdFNtZUJ0Y0NvbmZpZyBidGNQYXJhbXM7CisgICAKKyAgIHNtZV9CdGNHZXRDb25maWcocEhkZEN0eC0+aEhhbCwgJmJ0Y1BhcmFtcyk7CisKKyAgIGJ0Y1BhcmFtcy5idGNFeGVjdXRpb25Nb2RlID0gcENvbmZpZy0+YnRjRXhlY3V0aW9uTW9kZTsKKworICAgYnRjUGFyYW1zLmJ0Y0NvbnNCdFNsb3RzVG9CbG9ja0R1cmluZ0RoY3AgPSBwQ29uZmlnLT5idGNDb25zQnRTbG90c1RvQmxvY2tEdXJpbmdEaGNwOworCisgICBidGNQYXJhbXMuYnRjQTJEUEJ0U3ViSW50ZXJ2YWxzRHVyaW5nRGhjcCA9IHBDb25maWctPmJ0Y0EyRFBCdFN1YkludGVydmFsc0R1cmluZ0RoY3A7CisKKyAgIHNtZV9CdGNTZXRDb25maWcocEhkZEN0eC0+aEhhbCwgJmJ0Y1BhcmFtcyk7Cit9CisKK3N0YXRpYyB2b2lkIGhkZF9zZXRfcG93ZXJfc2F2ZV9jb25maWcoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdFNtZUNvbmZpZ1BhcmFtcyAqc21lQ29uZmlnKSAKK3sKKyAgIGhkZF9jb25maWdfdCAqcENvbmZpZyA9IHBIZGRDdHgtPmNmZ19pbmk7CisKKyAgIHRQbWNCbXBzQ29uZmlnUGFyYW1zIGJtcHNQYXJhbXM7CisgICAKKyAgIHNtZV9HZXRDb25maWdQb3dlclNhdmUocEhkZEN0eC0+aEhhbCwgZVBNQ19CRUFDT05fTU9ERV9QT1dFUl9TQVZFLCAmYm1wc1BhcmFtcyk7CisgICAKKyAgIGlmIChzdHJjbXAocENvbmZpZy0+UG93ZXJVc2FnZUNvbnRyb2wsICJNaW4iKSA9PSAwKQorICAgeworICAgICAgc21lQ29uZmlnLT5jc3JDb25maWcuaW1wc1NsZWVwVGltZSAgID0gcENvbmZpZy0+bkltcHNNaW5TbGVlcFRpbWU7CisgICAgICBibXBzUGFyYW1zLmJtcHNQZXJpb2QgICAgICAgICAgICAgICAgPSBwQ29uZmlnLT5uQm1wc01pbkxpc3RlbkludGVydmFsOworICAgICAgYm1wc1BhcmFtcy5lbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uID0gcENvbmZpZy0+ZkVuYWJsZUJlYWNvbkVhcmx5VGVybWluYXRpb247CisgICAgICBibXBzUGFyYW1zLmJjbkVhcmx5VGVybVdha2VJbnRlcnZhbCAgPSBwQ29uZmlnLT5iY25FYXJseVRlcm1XYWtlSW50ZXJ2YWw7CisgICB9CisgICBpZiAoc3RyY21wKHBDb25maWctPlBvd2VyVXNhZ2VDb250cm9sLCAiTWF4IikgPT0gMCkKKyAgIHsKKyAgICAgIHNtZUNvbmZpZy0+Y3NyQ29uZmlnLmltcHNTbGVlcFRpbWUgICA9IHBDb25maWctPm5JbXBzTWF4U2xlZXBUaW1lOworICAgICAgYm1wc1BhcmFtcy5ibXBzUGVyaW9kICAgICAgICAgICAgICAgID0gcENvbmZpZy0+bkJtcHNNYXhMaXN0ZW5JbnRlcnZhbDsKKyAgICAgIGJtcHNQYXJhbXMuZW5hYmxlQmVhY29uRWFybHlUZXJtaW5hdGlvbiA9IHBDb25maWctPmZFbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uOworICAgICAgYm1wc1BhcmFtcy5iY25FYXJseVRlcm1XYWtlSW50ZXJ2YWwgID0gcENvbmZpZy0+YmNuRWFybHlUZXJtV2FrZUludGVydmFsOworICAgfQorICAgaWYgKHN0cmNtcChwQ29uZmlnLT5Qb3dlclVzYWdlQ29udHJvbCwgIk1vZCIpID09IDApCisgICB7CisgICAgICBzbWVDb25maWctPmNzckNvbmZpZy5pbXBzU2xlZXBUaW1lICAgPSBwQ29uZmlnLT5uSW1wc01vZFNsZWVwVGltZTsKKyAgICAgIGJtcHNQYXJhbXMuYm1wc1BlcmlvZCAgICAgICAgICAgICAgICA9IHBDb25maWctPm5CbXBzTW9kTGlzdGVuSW50ZXJ2YWw7CisgICAgICBibXBzUGFyYW1zLmVuYWJsZUJlYWNvbkVhcmx5VGVybWluYXRpb24gPSBwQ29uZmlnLT5mRW5hYmxlQmVhY29uRWFybHlUZXJtaW5hdGlvbjsKKyAgICAgIGJtcHNQYXJhbXMuYmNuRWFybHlUZXJtV2FrZUludGVydmFsICA9IHBDb25maWctPmJjbkVhcmx5VGVybVdha2VJbnRlcnZhbDsKKyAgIH0KKworICAgaWYgKHBDb25maWctPmZJc0ltcHNFbmFibGVkKQorICAgeworICAgICAgc21lX0VuYWJsZVBvd2VyU2F2ZSAocEhkZEN0eC0+aEhhbCwgZVBNQ19JRExFX01PREVfUE9XRVJfU0FWRSk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzbWVfRGlzYWJsZVBvd2VyU2F2ZSAocEhkZEN0eC0+aEhhbCwgZVBNQ19JRExFX01PREVfUE9XRVJfU0FWRSk7CisgICB9CisKKyAgIGlmIChwQ29uZmlnLT5mSXNCbXBzRW5hYmxlZCkKKyAgIHsKKyAgICAgIHNtZV9FbmFibGVQb3dlclNhdmUgKHBIZGRDdHgtPmhIYWwsIGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRSk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzbWVfRGlzYWJsZVBvd2VyU2F2ZSAocEhkZEN0eC0+aEhhbCwgZVBNQ19CRUFDT05fTU9ERV9QT1dFUl9TQVZFKTsKKyAgIH0KKworICAgYm1wc1BhcmFtcy50cmFmZmljTWVhc3VyZVBlcmlvZCA9IHBDb25maWctPm5BdXRvQm1wc1RpbWVyVmFsdWU7CisKKyAgIGlmIChzbWVfU2V0Q29uZmlnUG93ZXJTYXZlKHBIZGRDdHgtPmhIYWwsIGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRSwgJmJtcHNQYXJhbXMpPT0gZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgIHsKKyAgICAgIGhkZExvZyhMT0dFLCAiU2V0Q29uZmlnUG93ZXJTYXZlIGZhaWxlZCB0byBzZXQgQk1QUyBwYXJhbXNcbiIpOworICAgfQorICAKKyAgIGlmKHBDb25maWctPmZJc0F1dG9CbXBzVGltZXJFbmFibGVkKQorICAgeworICAgICAgc21lX1N0YXJ0QXV0b0JtcHNUaW1lcihwSGRkQ3R4LT5oSGFsKTsKKyAgIH0KKworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKK3N0YXRpYyBWT1NfU1RBVFVTIGhkZF9zdHJpbmdfdG9fdThfYXJyYXkoIGNoYXIgKnN0ciwgdEFOSV9VOCAqaW50QXJyYXksIHRBTklfVTggKmxlbiwgdEFOSV9VOCBpbnRBcnJheU1heExlbiApCit7CisgICBjaGFyICpzID0gc3RyOworCisgICBpZiggc3RyID09IE5VTEwgfHwgaW50QXJyYXkgPT0gTlVMTCB8fCBsZW4gPT0gTlVMTCApCisgICB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorICAgKmxlbiA9IDA7CisKKyNpZmRlZiBWRVJTSU9OX1VTSU5HX1NUUlBCUksKKyAgIHdoaWxlICggKHMgIT0gTlVMTCkgJiYgKCpsZW4gPCBpbnRBcnJheU1heExlbikgKQorICAgeworICAgICAgaW50IHZhbDsKKyAgICAgIC8vSW5jcmVtZW50IGxlbmd0aCBvbmx5IGlmIHNzY2FuZiBzdWNjZXNmdWxseSBleHRyYWN0ZWQgb25lIGVsZW1lbnQuCisgICAgICAvL0FueSBvdGhlciByZXR1cm4gdmFsdWUgbWVhbnMgZXJyb3IuIElnbm9yZSBpdC4KKyAgICAgIGlmKCBzc2NhbmYocywgIiVkIiwgJnZhbCApID09IDEgKQorICAgICAgeworICAgICAgICAgaW50QXJyYXlbKmxlbl0gPSAodEFOSV9VOCkgdmFsOworICAgICAgICAgKmxlbiArPSAxOworICAgICAgfQorICAgICAgcyA9IHN0cnBicmsoIHMsICIsIiApOworICAgICAgaWYoIHMgKQorICAgICAgICAgcysrOworICAgfQorI2Vsc2UKKyAgIHdoaWxlKCAoKnMgIT0gJ1wwJykgICYmICgqbGVuIDwgaW50QXJyYXlNYXhMZW4pICkKKyAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdmFsOworCisgICAgICB2YWwgPSBzaW1wbGVfc3RydG91bCggcywgJnMsIDEwICk7CisgICAgICBpZiggdmFsICkKKyAgICAgIHsKKyAgICAgICAgIGludEFycmF5WypsZW5dID0gKHRBTklfVTgpIHZhbDsKKyAgICAgICAgICpsZW4gKz0gMTsKKyAgICAgIH0KKyAgICAgIGlmKCAqcyApCisgICAgICAgICBzKys7CisgICB9CisjZW5kaWYKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIAorfQorI2VuZGlmCisKKwordl9CT09MX3QgaGRkX3VwZGF0ZV9jb25maWdfZGF0KCBoZGRfY29udGV4dF90ICpwSGRkQ3R4ICkKK3sKKyAgIHZfQk9PTF90ICBmU3RhdHVzID0gVFJVRTsKKworICAgaGRkX2NvbmZpZ190ICpwQ29uZmlnID0gcEhkZEN0eC0+Y2ZnX2luaTsKKworICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaLCAKKyAgICAgIHBDb25maWctPlNob3J0R0kyME1oekVuYWJsZSwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19TSE9SVF9HSV8yME1IWiB0byBDQ01cbiIpOworICAgfQorICAgICAgIAorICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0NBTF9DT05UUk9MLCBwQ29uZmlnLT5DYWxpYnJhdGlvbiwgCisgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgeworICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgaGRkTG9nKExPR0UsICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0NBTF9DT05UUk9MIHRvIENDTVxuIik7CisgICB9CisKKyAgIGlmIChjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19DQUxfUEVSSU9ELCBwQ29uZmlnLT5DYWxpYnJhdGlvblBlcmlvZCwKKyAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICB7CisgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICBoZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfQ0FMX1BFUklPRCB0byBDQ01cbiIpOworICAgfQorCisgICBpZiAoIDAgIT0gcENvbmZpZy0+Q2ZnMUlkICkKKyAgIHsKKyAgICAgIGlmIChjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgcENvbmZpZy0+Q2ZnMUlkLCBwQ29uZmlnLT5DZmcxVmFsdWUsIE5VTEwsIAorICAgICAgICAgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICAgIHsKKyAgICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgIGhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gQ2ZnMUlkIHRvIENDTVxuIik7CisgICAgICB9CisgICAgICAgICAgCisgICB9CisKKyAgIGlmICggMCAhPSBwQ29uZmlnLT5DZmcySWQgKQorICAgeworICAgICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBwQ29uZmlnLT5DZmcySWQsIHBDb25maWctPkNmZzJWYWx1ZSwgCisgICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgICAgeworICAgICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgICAgaGRkTG9nKExPR0UsICJDb3VsZCBub3QgcGFzcyBvbiBDZmcySWQgdG8gQ0NNXG4iKTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKCAwICE9IHBDb25maWctPkNmZzNJZCApCisgICB7CisgICAgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIHBDb25maWctPkNmZzNJZCwgcENvbmZpZy0+Q2ZnM1ZhbHVlLCAKKyAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgICB7CisgICAgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICAgICBoZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIENmZzNJZCB0byBDQ01cbiIpOworICAgICAgfQorICAgfQorCisgICBpZiAoIDAgIT0gcENvbmZpZy0+Q2ZnNElkICkKKyAgIHsKKyAgICAgIGlmIChjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgcENvbmZpZy0+Q2ZnNElkLCBwQ29uZmlnLT5DZmc0VmFsdWUsIAorICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICAgIHsKKyAgICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgIGhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gQ2ZnNElkIHRvIENDTVxuIik7CisgICAgICB9CisgICB9CisKKyAgIGlmICggMCAhPSBwQ29uZmlnLT5DZmc1SWQgKQorICAgeworICAgICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBwQ29uZmlnLT5DZmc1SWQsIHBDb25maWctPkNmZzVWYWx1ZSwgCisgICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgICAgeworICAgICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgICAgaGRkTG9nKExPR0UsICJDb3VsZCBub3QgcGFzcyBvbiBDZmc1SWQgdG8gQ0NNXG4iKTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0JBX0FVVE9fU0VUVVAsIHBDb25maWctPkJsb2NrQWNrQXV0b1NldHVwLCAKKyAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICB7CisgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICBoZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfQkFfQVVUT19TRVRVUCB0byBDQ01cbiIpOworICAgfQorICAgICAgIAorICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0ZJWEVEX1JBVEUsIHBDb25maWctPlR4UmF0ZSwgCisgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgeworICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgaGRkTG9nKExPR0UsICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0ZJWEVEX1JBVEUgdG8gQ0NNXG4iKTsKKyAgIH0KKworICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1IsIAorICAgICAgcENvbmZpZy0+TWF4UnhBbXBkdUZhY3RvciwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNU19NQVhfUlhfQU1QRFVfRkFDVE9SIHRvIENDTVxuIik7CisgICB9CisKKyAgIGlmIChjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19TSE9SVF9QUkVBTUJMRSwgcENvbmZpZy0+ZklzU2hvcnRQcmVhbWJsZSwKKyAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICB7CisgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICBoZGRMb2coTE9HRSwiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19TSE9SVF9QUkVBTUJMRSB0byBDQ01cbiIpOworICAgfQorCisgICBpZiAocENvbmZpZy0+ZklzQXV0b0lic3NCc3NpZCkgCisgICB7CisgICAgICBpZiAoY2NtQ2ZnU2V0U3RyKHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfQlNTSUQsICh2X1U4X3QgKikiMDAwMDAwMDAwMDAwIiwgCisgICAgICAgICBzaXplb2Yodl9CWVRFX3QpICogVk9TX01BQ19BRERSX1NJWkUsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgICB7CisgICAgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICAgICBoZGRMb2coTE9HRSwiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19CU1NJRCB0byBDQ01cbiIpOworICAgICAgfQorICAgfQorICAgZWxzZQorICAgeyAKKyAgICAgIGlmICggVk9TX0ZBTFNFID09IHZvc19pc19tYWNhZGRyX2dyb3VwKCAmcENvbmZpZy0+SWJzc0Jzc2lkICkpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgICAgICAgICAgICAgICJNQUMgQWRkciAoSUJTUyBCU1NJRCkgcmVhZCBmcm9tIFJlZ2lzdHJ5IGlzOiAlMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeCIsCisgICAgICAgICAgICAgICAgICAgIHBDb25maWctPklic3NCc3NpZC5ieXRlc1swXSwgcENvbmZpZy0+SWJzc0Jzc2lkLmJ5dGVzWzFdLCBwQ29uZmlnLT5JYnNzQnNzaWQuYnl0ZXNbMl0sIAorICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5JYnNzQnNzaWQuYnl0ZXNbM10sIHBDb25maWctPklic3NCc3NpZC5ieXRlc1s0XSwgcENvbmZpZy0+SWJzc0Jzc2lkLmJ5dGVzWzVdKTsKKyAgICAgICAgIGlmIChjY21DZmdTZXRTdHIocEhkZEN0eC0+aEhhbCwgV05JX0NGR19CU1NJRCwgcENvbmZpZy0+SWJzc0Jzc2lkLmJ5dGVzLCAKKyAgICAgICAgICAgIHNpemVvZih2X0JZVEVfdCkgKiBWT1NfTUFDX0FERFJfU0laRSwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgICAgIGhkZExvZyhMT0dFLCJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0JTU0lEIHRvIENDTVxuIik7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICAgICBoZGRMb2coTE9HRSwiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19CU1NJRCB0byBDQ01cbiIpOworICAgICAgfQorICAgfQorCisgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMLCBwQ29uZmlnLT5uQmVhY29uSW50ZXJ2YWwsIAorICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19CRUFDT05fSU5URVJWQUwgdG8gQ0NNXG4iKTsKKyAgIH0KKworICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX01BWF9QU19QT0xMLCBwQ29uZmlnLT5uTWF4UHNQb2xsLCAKKyAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICB7CisgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICBoZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfTUFYX1BTX1BPTEwgdG8gQ0NNXG4iKTsKKyAgIH0KKworICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0NVUlJFTlRfUlhfQU5URU5OQSwgcENvbmZpZy0+IG5SeEFudCwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCAiRmFpbHVyZTogQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19DVVJSRU5UX1JYX0FOVEVOTkEgY29uZmlndXJhdGlvbiBpbmZvIHRvIEhBTFxuIiAgKTsKKyAgIH0KKworICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFLCBwQ29uZmlnLT5mSXNMb3dHYWluT3ZlcnJpZGUsIAorICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19MT1dfR0FJTl9PVkVSUklERSB0byBIQUxcbiIpOworICAgfQorIAorICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1JTU0lfRklMVEVSX1BFUklPRCwgcENvbmZpZy0+blJzc2lGaWx0ZXJQZXJpb2QsCisgICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgeworICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgaGRkTG9nKExPR0UsICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1JTU0lfRklMVEVSX1BFUklPRCB0byBDQ01cbiIpOworICAgfQorCisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fQ0NYKQorICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRCwgcENvbmZpZy0+RlRSc3NpRmlsdGVyUGVyaW9kLAorICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19GVF9SU1NJX0ZJTFRFUl9QRVJJT0QgdG8gQ0NNXG4iKTsKKyAgIH0KKyNlbmRpZgorCisgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfSUdOT1JFX0RUSU0sIHBDb25maWctPmZJZ25vcmVEdGltLAorICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0lHTk9SRV9EVElNIGNvbmZpZ3VyYXRpb24gdG8gQ0NNXG4iICApOworICAgfQorCisgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUFNfRU5BQkxFX0hFQVJUX0JFQVQsIHBDb25maWctPmZFbmFibGVGd0hlYXJ0QmVhdE1vbml0b3JpbmcsIAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgeworICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgaGRkTG9nKExPR0UsICJGYWlsdXJlOiBDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1BTX0hFQVJUX0JFQVQgY29uZmlndXJhdGlvbiBpbmZvIHRvIENDTVxuIik7CisgICB9CisKKyAgIGlmIChjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUiwgcENvbmZpZy0+ZkVuYWJsZUZ3QmVhY29uRmlsdGVyaW5nLCAKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCAiRmFpbHVyZTogQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19QU19CQ05fRklMVEVSIGNvbmZpZ3VyYXRpb24gaW5mbyB0byBDQ01cbiIpOworICAgfQorCisgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUiwgcENvbmZpZy0+ZkVuYWJsZUZ3UnNzaU1vbml0b3JpbmcsIAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgeworICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgaGRkTG9nKExPR0UsICJGYWlsdXJlOiBDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1BTX1JTU0lfTU9OSVRPUiBjb25maWd1cmF0aW9uIGluZm8gdG8gQ0NNXG4iKTsKKyAgIH0KKworICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VULCBwQ29uZmlnLT5uRGF0YUluYWN0aXZpdHlUaW1lb3V0LCAKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCJGYWlsdXJlOiBDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUIGNvbmZpZ3VyYXRpb24gaW5mbyB0byBDQ01cbiIpOworICAgfQorCisgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfTlRIX0JFQUNPTl9GSUxURVIsIHBDb25maWctPm50aEJlYWNvbkZpbHRlciwgCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICB7CisgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICBoZGRMb2coTE9HRSwiRmFpbHVyZTogQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19OVEhfQkVBQ09OX0ZJTFRFUiBjb25maWd1cmF0aW9uIGluZm8gdG8gQ0NNXG4iKTsKKyAgIH0KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWCwgcENvbmZpZy0+ZW5hYmxlTFRFQ29leCwgCisgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgIHsKKyAgICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgICBoZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfRU5BQkxFX0xURV9DT0VYIHRvIENDTVxuIik7CisgICAgIH0KKworICAgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfRU5BQkxFX1BIWV9BR0NfTElTVEVOX01PREUsIHBDb25maWctPm5FbmFibGVMaXN0ZW5Nb2RlLCAKKyAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICAgeworICAgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICAgIGhkZExvZyhMT0dFLCAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERSB0byBDQ01cbiIpOworICAgICB9CisKKyAgICAgV0xBTlNBUF9TZXRDaGFubmVsUmFuZ2UocEhkZEN0eC0+aEhhbCwgcENvbmZpZy0+YXBTdGFydENoYW5uZWxOdW0sIHBDb25maWctPmFwRW5kQ2hhbm5lbE51bSwgcENvbmZpZy0+YXBPcGVyYXRpbmdCYW5kKTsKKworICAgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfQVBfS0VFUF9BTElWRV9USU1FT1VULCBwQ29uZmlnLT5hcEtlZXBBbGl2ZVBlcmlvZCwgCisgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgIHsKKyAgICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgICBoZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfQVBfS0VFUF9BTElWRV9USU1FT1VUIHRvIENDTVxuIik7CisgICAgIH0gCisKKyAgICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVCwgcENvbmZpZy0+Z29LZWVwQWxpdmVQZXJpb2QsIAorICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgICB7CisgICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgaGRkTG9nKExPR0UsICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVCB0byBDQ01cbiIpOworICAgICB9CisjZW5kaWYKKyAgIAorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIGlmIChjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19SUk1fRU5BQkxFRCwgcENvbmZpZy0+ZlJybUVuYWJsZSwgCisgICAgICAgICAgICAgICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgIHsKKyAgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICAgaGRkTG9nKExPR0UsIkZhaWx1cmU6IENvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUlJNX0VOQUJMRSBjb25maWd1cmF0aW9uIGluZm8gdG8gQ0NNXG4iKTsKKyAgICB9CisKKyAgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUlJNX09QRVJBVElOR19DSEFOX01BWCwgcENvbmZpZy0+bkluQ2hhbk1lYXNNYXhEdXJhdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgIHsKKyAgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICAgaGRkTG9nKExPR0UsIkZhaWx1cmU6IENvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUlJNX09QRVJBVElOR19DSEFOX01BWCBjb25maWd1cmF0aW9uIGluZm8gdG8gQ0NNXG4iKTsKKyAgICB9CisKKyAgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVgsIHBDb25maWctPm5PdXRDaGFuTWVhc01heER1cmF0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgeworICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICBoZGRMb2coTE9HRSwiRmFpbHVyZTogQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19SUk1fT1VUX0NIQU5fTUFYIGNvbmZpZ3VyYXRpb24gaW5mbyB0byBDQ01cbiIpOworICAgIH0KKworICAgIGlmIChjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElORywgcENvbmZpZy0+bWNhc3RCY2FzdEZpbHRlclNldHRpbmcsIAorICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyNlbmRpZgorCisgICAgIGlmIChjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19TSU5HTEVfVElEX1JDLCBwQ29uZmlnLT5iU2luZ2xlVGlkUmMsIAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgIHsKKyAgICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgICBoZGRMb2coTE9HRSwiRmFpbHVyZTogQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19TSU5HTEVfVElEX1JDIGNvbmZpZ3VyYXRpb24gaW5mbyB0byBDQ01cbiIpOworICAgICB9CisKKyAgICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTiwgcENvbmZpZy0+dGVsZUJjbldha2V1cEVuLCAKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgICB7CisgICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgaGRkTG9nKExPR0UsIkZhaWx1cmU6IENvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOIGNvbmZpZ3VyYXRpb24gaW5mbyB0byBDQ01cbiIgICk7CisgICAgIH0KKworICAgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTEksIHBDb25maWctPm5UZWxlQmNuVHJhbnNMaXN0ZW5JbnRlcnZhbCwgCisgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCJGYWlsdXJlOiBDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJIGNvbmZpZ3VyYXRpb24gaW5mbyB0byBDQ01cbiIgICk7CisgICAgfQorCisgICAgIGlmIChjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19URUxFX0JDTl9NQVhfTEksIHBDb25maWctPm5UZWxlQmNuTWF4TGlzdGVuSW50ZXJ2YWwsIAorICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICB7CisgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICBoZGRMb2coTE9HRSwiRmFpbHVyZTogQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19URUxFX0JDTl9NQVhfTEkgY29uZmlndXJhdGlvbiBpbmZvIHRvIENDTVxuIiAgKTsKKyAgICB9CisKKyAgICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0lETEVfQkNOUywgcENvbmZpZy0+blRlbGVCY25UcmFuc0xpTnVtSWRsZUJlYWNvbnMsIAorICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICB7CisgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICBoZGRMb2coTE9HRSwiRmFpbHVyZTogQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlMgY29uZmlndXJhdGlvbiBpbmZvIHRvIENDTVxuIiAgKTsKKyAgICB9CisKKyAgICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlMsIHBDb25maWctPm5UZWxlQmNuTWF4TGlOdW1JZGxlQmVhY29ucywgCisgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgIHsKKyAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgIGhkZExvZyhMT0dFLCJGYWlsdXJlOiBDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlMgY29uZmlndXJhdGlvbiBpbmZvIHRvIENDTVxuIiAgKTsKKyAgICB9CisKKyAgICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLLCBwQ29uZmlnLT5yZlNldHRsaW5nVGltZVVzLAorICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgIHsKKyAgICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgICBoZGRMb2coTE9HRSwiRmFpbHVyZTogQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19SRl9TRVRUTElOR19USU1FX0NMSyBjb25maWd1cmF0aW9uIGluZm8gdG8gQ0NNXG4iICApOworICAgIH0KKworICAgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9ELCBwQ29uZmlnLT5pbmZyYVN0YUtlZXBBbGl2ZVBlcmlvZCwgCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICAgeworICAgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICAgIGhkZExvZyhMT0dFLCJGYWlsdXJlOiBDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRCBjb25maWd1cmF0aW9uIGluZm8gdG8gQ0NNXG4iICApOworICAgICB9CisgICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0RZTkFNSUNfUFNfUE9MTF9WQUxVRSwgcENvbmZpZy0+ZHluYW1pY1BzUG9sbFZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgeworICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICBoZGRMb2coTE9HRSwiRmFpbHVyZTogQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19EWU5BTUlDX1BTX1BPTExfVkFMVUUgY29uZmlndXJhdGlvbiBpbmZvIHRvIENDTVxuIiAgKTsKKyAgICB9CisKKyAgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUFNfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VULCBwQ29uZmlnLT5uTnVsbERhdGFBcFJlc3BUaW1lb3V0LAorICAgICAgICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICB7CisgICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgIGhkZExvZyhMT0dFLCJGYWlsdXJlOiBDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1BTX05VTExEQVRBX0RFTEFZX1RJTUVPVVQgY29uZmlndXJhdGlvbiBpbmZvIHRvIENDTVxuIiAgKTsKKyAgICB9IAorCisgICBpZiAoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRCwgcENvbmZpZy0+YXBEYXRhQXZhaWxQb2xsUGVyaW9kSW5NcywKKyAgICAgICAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICB7CisgICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgIGhkZExvZyhMT0dFLCJGYWlsdXJlOiBDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0QgY29uZmlndXJhdGlvbiBpbmZvIHRvIENDTVxuIiAgKTsKKyAgIH0gCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgaWYoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsIHBDb25maWctPkZyYWdtZW50YXRpb25UaHJlc2hvbGQsIAorICAgICAgICAgICAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSkgPT0gZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICB7CisgICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgaGRkTG9nKExPR0UsIkZhaWx1cmU6IENvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgY29uZmlndXJhdGlvbiBpbmZvIHRvIENDTVxuIiAgKTsKKyAgICB9CisgICAgaWYoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfUlRTX1RIUkVTSE9MRCwgcENvbmZpZy0+UlRTVGhyZXNob2xkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSkgPT0gZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICB7CisgICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgaGRkTG9nKExPR0UsIkZhaWx1cmU6IENvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUlRTX1RIUkVTSE9MRCBjb25maWd1cmF0aW9uIGluZm8gdG8gQ0NNXG4iICApOworICAgIH0KKworICAgIGlmKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHXzExRF9FTkFCTEVELCBwQ29uZmlnLT5JczExZFN1cHBvcnRFbmFibGVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSkgPT0gZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICB7CisgICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgaGRkTG9nKExPR0UsIkZhaWx1cmU6IENvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfMTFEX0VOQUJMRUQgY29uZmlndXJhdGlvbiBpbmZvIHRvIENDTVxuIiAgKTsKKyAgICB9CisgICAgaWYoY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQsIHBDb25maWctPkhlYXJ0YmVhdFRocmVzaDI0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSkgPT0gZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICB7CisgICAgICAgIGZTdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgaGRkTG9nKExPR0UsIkZhaWx1cmU6IENvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQgY29uZmlndXJhdGlvbiBpbmZvIHRvIENDTVxuIiAgKTsKKyAgICB9CisKKyNlbmRpZgorICAgaWYgKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0QsIHBDb25maWctPmFwRGF0YUF2YWlsUG9sbFBlcmlvZEluTXMsCisgICAgICAgICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgeworICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgaGRkTG9nKExPR0UsIkZhaWx1cmU6IENvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRCBjb25maWd1cmF0aW9uIGluZm8gdG8gQ0NNXG4iICApOworICAgfQorCisgICBpZihjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19FTkFCTEVfQ0xPU0VfTE9PUCwgCisgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+ZW5hYmxlQ2xvc2VMb29wLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpCisgICAgICAgPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgeworICAgICAgZlN0YXR1cyA9IEZBTFNFOworICAgICAgaGRkTG9nKExPR0UsICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QIHRvIENDTVxuIik7CisgICB9CisKKyAgIGlmKGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1RYX1BXUl9DVFJMX0VOQUJMRSwgCisgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+ZW5hYmxlQXV0b21hdGljVHhQb3dlckNvbnRyb2wsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSkKKyAgICAgICAgICAgICAgICAgICA9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICB7CisgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICBoZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfVFhfUFdSX0NUUkxfRU5BQkxFIHRvIENDTVxuIik7CisgICB9CisKKyAgIGlmIChjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19TSE9SVF9HSV80ME1IWiwgCisgICAgICBwQ29uZmlnLT5TaG9ydEdJNDBNaHpFbmFibGUsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICB7CisgICAgICBmU3RhdHVzID0gRkFMU0U7CisgICAgICBoZGRMb2coTE9HRSwgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfU0hPUlRfR0lfNDBNSFogdG8gQ0NNXG4iKTsKKyAgIH0KKworICAgcmV0dXJuIGZTdGF0dXM7Cit9CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIGhkZF9pbml0X3NldF9zbWVfY29uZmlnKCkgLSAKKworICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc21lIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICAgCisgIFxwYXJhbSAgLSBwSGRkQ3R4IC0gUG9pbnRlciB0byB0aGUgSEREIEFkYXB0ZXIuCisgICAgICAgICAgICAgIAorICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWT1NfU1RBVFVTIGhkZF9zZXRfc21lX2NvbmZpZyggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCApCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzOworICAgdFNtZUNvbmZpZ1BhcmFtcyBzbWVDb25maWc7CisKKyAgIGhkZF9jb25maWdfdCAqcENvbmZpZyA9IHBIZGRDdHgtPmNmZ19pbmk7CisKKyAgIHZvc19tZW1femVybyggJnNtZUNvbmZpZywgc2l6ZW9mKCBzbWVDb25maWcgKSApOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgIiVzIGJXbW1Jc0VuYWJsZWQ9JWQgODAyXzExZV9lbmFibGVkPSVkIGRvdDExTW9kZT0lZFxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHBDb25maWctPldtbU1vZGUsIHBDb25maWctPmI4MDIxMWVJc0VuYWJsZWQsIHBDb25maWctPmRvdDExTW9kZSk7CisKKyAgIC8vIENvbmZpZyBwYXJhbXMgb2J0YWluZWQgZnJvbSB0aGUgcmVnaXN0cnkKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuUlRTVGhyZXNob2xkICAgICAgICAgICAgID0gcENvbmZpZy0+UlRTVGhyZXNob2xkOworICAgc21lQ29uZmlnLmNzckNvbmZpZy5GcmFnbWVudGF0aW9uVGhyZXNob2xkICAgPSBwQ29uZmlnLT5GcmFnbWVudGF0aW9uVGhyZXNob2xkOworICAgc21lQ29uZmlnLmNzckNvbmZpZy5zaG9ydFNsb3RUaW1lICAgICAgICAgICAgPSBwQ29uZmlnLT5TaG9ydFNsb3RUaW1lRW5hYmxlZDsKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuSXMxMWRTdXBwb3J0RW5hYmxlZCAgICAgID0gcENvbmZpZy0+SXMxMWRTdXBwb3J0RW5hYmxlZDsKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuSGVhcnRiZWF0VGhyZXNoMjQgICAgICAgID0gcENvbmZpZy0+SGVhcnRiZWF0VGhyZXNoMjQ7CisKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcucGh5TW9kZSAgICAgICAgICAgICAgICAgID0gaGRkX2NmZ194bGF0ZV90b19jc3JfcGh5X21vZGUgKCBwQ29uZmlnLT5kb3QxMU1vZGUgKTsKKworICAgc21lQ29uZmlnLmNzckNvbmZpZy5jaGFubmVsQm9uZGluZ01vZGUyNEdIeiAgPSBwQ29uZmlnLT5uQ2hhbm5lbEJvbmRpbmdNb2RlMjRHSHo7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLmNoYW5uZWxCb25kaW5nTW9kZTVHSHogICA9IHBDb25maWctPm5DaGFubmVsQm9uZGluZ01vZGU1R0h6OworICAgc21lQ29uZmlnLmNzckNvbmZpZy5UeFJhdGUgICAgICAgICAgICAgICAgICAgPSBwQ29uZmlnLT5UeFJhdGU7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLm5TY2FuUmVzdWx0QWdlQ291bnQgICAgICA9IHBDb25maWctPlNjYW5SZXN1bHRBZ2VDb3VudDsKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuc2NhbkFnZVRpbWVOQ05QUyAgICAgICAgID0gcENvbmZpZy0+blNjYW5BZ2VUaW1lTkNOUFM7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLnNjYW5BZ2VUaW1lTkNQUyAgICAgICAgICA9IHBDb25maWctPm5TY2FuQWdlVGltZU5DUFM7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLnNjYW5BZ2VUaW1lQ05QUyAgICAgICAgICA9IHBDb25maWctPm5TY2FuQWdlVGltZUNOUFM7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLnNjYW5BZ2VUaW1lQ1BTICAgICAgICAgICA9IHBDb25maWctPm5TY2FuQWdlVGltZUNQUzsKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuQWRIb2NDaGFubmVsMjQgICAgICAgICAgID0gcENvbmZpZy0+T3BlcmF0aW5nQ2hhbm5lbDsKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuZkVuZm9yY2UxMWRDaGFubmVscyAgICAgID0gcENvbmZpZy0+ZkVuZm9yY2UxMWRDaGFubmVsczsKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuZlN1cHBsaWNhbnRDb3VudHJ5Q29kZUhhc1ByaW9yaXR5ICAgICA9IHBDb25maWctPmZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eTsKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuZkVuZm9yY2VDb3VudHJ5Q29kZU1hdGNoID0gcENvbmZpZy0+ZkVuZm9yY2VDb3VudHJ5Q29kZU1hdGNoOworICAgc21lQ29uZmlnLmNzckNvbmZpZy5mRW5mb3JjZURlZmF1bHREb21haW4gICAgPSBwQ29uZmlnLT5mRW5mb3JjZURlZmF1bHREb21haW47CisgICBzbWVDb25maWcuY3NyQ29uZmlnLmJDYXRSc3NpT2Zmc2V0ICAgICAgICAgICA9IHBDb25maWctPm5Sc3NpQ2F0R2FwOworICAgc21lQ29uZmlnLmNzckNvbmZpZy52Y2NSc3NpVGhyZXNob2xkICAgICAgICAgPSBwQ29uZmlnLT5uVmNjUnNzaVRyaWdnZXI7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLnZjY1VsTWFjTG9zc1RocmVzaG9sZCAgICA9IHBDb25maWctPm5WY2NVbE1hY0xvc3NUaHJlc2hvbGQ7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLm5Sb2FtaW5nVGltZSAgICAgICAgICAgICA9IHBDb25maWctPm5Sb2FtaW5nVGltZTsKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuSXNJZGxlU2NhbkVuYWJsZWQgICAgICAgID0gcENvbmZpZy0+bkVuYWJsZUlkbGVTY2FuOyAKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcubkFjdGl2ZU1heENoblRpbWUgICAgICAgID0gcENvbmZpZy0+bkFjdGl2ZU1heENoblRpbWU7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLm5BY3RpdmVNaW5DaG5UaW1lICAgICAgICA9IHBDb25maWctPm5BY3RpdmVNaW5DaG5UaW1lOworICAgc21lQ29uZmlnLmNzckNvbmZpZy5uUGFzc2l2ZU1heENoblRpbWUgICAgICAgPSBwQ29uZmlnLT5uUGFzc2l2ZU1heENoblRpbWU7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLm5QYXNzaXZlTWluQ2huVGltZSAgICAgICA9IHBDb25maWctPm5QYXNzaXZlTWluQ2huVGltZTsKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuSXMxMWVTdXBwb3J0RW5hYmxlZCAgICAgID0gcENvbmZpZy0+YjgwMjExZUlzRW5hYmxlZDsKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuV01NU3VwcG9ydE1vZGUgICAgICAgICAgID0gcENvbmZpZy0+V21tTW9kZTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgc21lQ29uZmlnLnJybUNvbmZpZy5ycm1FbmFibGVkID0gcENvbmZpZy0+ZlJybUVuYWJsZTsKKyAgIHNtZUNvbmZpZy5ycm1Db25maWcubWF4UmFuZG5JbnRlcnZhbCA9IHBDb25maWctPm5Scm1SYW5kbkludHZsOworI2VuZGlmCisgICAvL1JlbWFpbmluZyBjb25maWcgcGFyYW1zIG5vdCBvYnRhaW5lZCBmcm9tIHJlZ2lzdHJ5CisgICAvLyBPbiBSRiBFVkIgYmVhY29uIHVzaW5nIGNoYW5uZWwgMS4KKyAgIAorICAgc21lQ29uZmlnLmNzckNvbmZpZy5BZEhvY0NoYW5uZWw1RyAgICAgICAgICAgID0gNDQ7IAorICAgc21lQ29uZmlnLmNzckNvbmZpZy5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZCAgID0gMDsgIAorICAgc21lQ29uZmlnLmNzckNvbmZpZy5IZWFydGJlYXRUaHJlc2g1MCAgICAgICAgID0gNDA7IAorICAgaWYoIHNtZUNvbmZpZy5jc3JDb25maWcuSXMxMWRTdXBwb3J0RW5hYmxlZCApCisgICB7CisgICAgICBzbWVDb25maWcuY3NyQ29uZmlnLklzMTFoU3VwcG9ydEVuYWJsZWQgICAgPSAxOworICAgfQorICAgZWxzZQorICAgeworICAgICAgc21lQ29uZmlnLmNzckNvbmZpZy5JczExaFN1cHBvcnRFbmFibGVkICAgID0gMDsKKyAgIH0KKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuYmFuZENhcGFiaWxpdHkgICAgICAgICAgICA9IHBDb25maWctPm5CYW5kQ2FwYWJpbGl0eTsgCisgICBzbWVDb25maWcuY3NyQ29uZmlnLmNiQ2hvaWNlICAgICAgICAgICAgICAgICAgPSAwOyAgIAorICAgc21lQ29uZmlnLmNzckNvbmZpZy5iZ1NjYW5JbnRlcnZhbCAgICAgICAgICAgID0gMDsgCisgICBzbWVDb25maWcuY3NyQ29uZmlnLmVCYW5kICAgICAgICAgICAgICAgICAgICAgPSBwQ29uZmlnLT5uQmFuZENhcGFiaWxpdHk7IAorICAgc21lQ29uZmlnLmNzckNvbmZpZy5uVHhQb3dlckNhcCA9IHBDb25maWctPm5UeFBvd2VyQ2FwOworICAgc21lQ29uZmlnLmNzckNvbmZpZy5mRW5hYmxlQnlwYXNzMTFkICAgICAgICAgID0gcENvbmZpZy0+ZW5hYmxlQnlwYXNzMTFkOworICAgc21lQ29uZmlnLmNzckNvbmZpZy5mRW5hYmxlREZTQ2hubFNjYW4gICAgICAgID0gcENvbmZpZy0+ZW5hYmxlREZTQ2hubFNjYW47CisgICAKKyAgIC8vRklYTUUgMTFkIGNvbmZpZyBpcyBoYXJkY29kZWQKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICBpZiAoIFZPU19TVEFfU0FQX01PREUgIT0gaGRkX2dldF9jb25wYXJhbSgpKXsKKyNlbmRpZgorICAgc21lQ29uZmlnLmNzckNvbmZpZy5Dc3IxMWRpbmZvLkNoYW5uZWxzLm51bUNoYW5uZWxzID0gMDsKKworICAgLy9pZiB0aGVyZSBpcyBhIHJlcXVpcmVtZW50IHRoYXQgSEREIHdpbGwgY29udHJvbCB0aGUgZGVmYXVsdCBjaGFubmVsIGxpc3QgJiAKKyAgIC8vY291bnRyeSBjb2RlIChzYXkgZnJvbSAuaW5pIGZpbGUpIHdlIG5lZWQgdG8gYWRkIHNvbWUgbG9naWMgaGVyZS4gT3RoZXJ3aXNlIAorICAgLy90aGUgZGVmYXVsdCAxMWQgaW5mbyBzaG91bGQgY29tZSBmcm9tIE5WIGFzIHBlciBvdXIgY3VycmVudCBpbXBsZW1lbnRhdGlvbgorICAgCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgfQorICAgZWxzZXsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJBUCBjb3VudHJ5IENvZGUgJXMiLCBwQ29uZmlnLT5hcENudHJ5Q29kZSk7CisKKyAgICBpZiAobWVtY21wKHBDb25maWctPmFwQ250cnlDb2RlLCBDRkdfQVBfQ09VTlRSWV9DT0RFX0RFRkFVTFQsIDMpICE9IDApCisgICAgICAgc21lX3NldFJlZ0luZm8ocEhkZEN0eC0+aEhhbCwgcENvbmZpZy0+YXBDbnRyeUNvZGUpOworICAgICAgIHNtZV9zZXQxMWRpbmZvKHBIZGRDdHgtPmhIYWwsICZzbWVDb25maWcpOworICAgIH0KKyNlbmRpZgorICAgaGRkX3NldF9wb3dlcl9zYXZlX2NvbmZpZyhwSGRkQ3R4LCAmc21lQ29uZmlnKTsKKyAgIGhkZF9zZXRfYnRjX2NvbmZpZyhwSGRkQ3R4KTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICAgCisgICBzbWVDb25maWcuY3NyQ29uZmlnLmNzcjExckNvbmZpZy5Jc0ZUUmVzb3VyY2VSZXFTdXBwb3J0ZWQgPSBwQ29uZmlnLT5mRlRSZXNvdXJjZVJlcVN1cHBvcnRlZDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcuaXNDY3hJbmlGZWF0dXJlRW5hYmxlZCA9IHBDb25maWctPmlzQ2N4SW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9DQ1gpCisgICBzbWVDb25maWcuY3NyQ29uZmlnLmlzRmFzdFRyYW5zaXRpb25FbmFibGVkID0gcENvbmZpZy0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQ7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisgICBzbWVDb25maWcuY3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JSZWFzc29jUnNzaVRocmVzaG9sZCA9IHBDb25maWctPm5OZWlnaGJvclJlYXNzb2NSc3NpVGhyZXNob2xkOworICAgc21lQ29uZmlnLmNzckNvbmZpZy5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZCA9IHBDb25maWctPm5OZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQ7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWUgPSBwQ29uZmlnLT5uTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWU7IAorICAgc21lQ29uZmlnLmNzckNvbmZpZy5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lID0gcENvbmZpZy0+bk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lOyAKKyAgIHNtZUNvbmZpZy5jc3JDb25maWcubmVpZ2hib3JSb2FtQ29uZmlnLm5OZWlnaGJvclNjYW5UaW1lclBlcmlvZCA9IHBDb25maWctPm5OZWlnaGJvclNjYW5QZXJpb2Q7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5uTWF4TmVpZ2hib3JSZXRyaWVzID0gcENvbmZpZy0+bk1heE5laWdoYm9yUmVxVHJpZXM7IAorICAgc21lQ29uZmlnLmNzckNvbmZpZy5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2QgPSBwQ29uZmlnLT5uTmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZDsKKyAgIGhkZF9zdHJpbmdfdG9fdThfYXJyYXkoIHBDb25maWctPm5laWdoYm9yU2NhbkNoYW5MaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVDb25maWcuY3NyQ29uZmlnLm5laWdoYm9yUm9hbUNvbmZpZy5uZWlnaGJvclNjYW5DaGFuTGlzdC5jaGFubmVsTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNtZUNvbmZpZy5jc3JDb25maWcubmVpZ2hib3JSb2FtQ29uZmlnLm5laWdoYm9yU2NhbkNoYW5MaXN0Lm51bUNoYW5uZWxzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4gKTsKKyNlbmRpZgorCisgICBzbWVDb25maWcuY3NyQ29uZmlnLmFkZFRTV2hlbkFDTUlzT2ZmID0gcENvbmZpZy0+QWRkVFNXaGVuQUNNSXNPZmY7CisgICBzbWVDb25maWcuY3NyQ29uZmlnLmZWYWxpZGF0ZUxpc3QgPSBwQ29uZmlnLT5mVmFsaWRhdGVTY2FuTGlzdDsKKworICAgLy9FbmFibGUvRGlzYWJsZSBNQ0MgCisgICBzbWVDb25maWcuY3NyQ29uZmlnLmZFbmFibGVNQ0NNb2RlID0gcENvbmZpZy0+ZW5hYmxlTUNDOworCisgICBoYWxTdGF0dXMgPSBzbWVfVXBkYXRlQ29uZmlnKCBwSGRkQ3R4LT5oSGFsLCAmc21lQ29uZmlnKTsgICAgCisgICBpZiAoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIGhhbFN0YXR1cyApICkKKyAgIHsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAKKyAgIHJldHVybiBzdGF0dXM7ICAgCit9CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIGhkZF9leGVjdXRlX2NvbmZpZ19jb21tYW5kKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGFuIGFyYml0cmFyeSBjb25maWd1cmF0aW9uIHNldCBjb21tYW5kCisKKyAgXHBhcmFtIC0gcEhkZEN0eCAtIFBvaW50ZXIgdG8gdGhlIEhERCBBZGFwdGVyLgorICBccGFybW0gLSBjb21tYW5kIC0gYSBjb25maWd1cmF0aW9uIGNvbW1hbmQgb2YgdGhlIGZvcm06CisgICAgICAgICAgICAgICAgICAgICA8bmFtZT49PHZhbHVlPgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVk9TX1NUQVRVUyBoZGRfZXhlY3V0ZV9jb25maWdfY29tbWFuZChoZGRfY29udGV4dF90ICpwSGRkQ3R4LCBjaGFyICpjb21tYW5kKQoreworICAgc2l6ZV90IHRhYmxlU2l6ZSA9IHNpemVvZihnX3JlZ2lzdHJ5X3RhYmxlKS9zaXplb2YoZ19yZWdpc3RyeV90YWJsZVswXSk7CisgICBSRUdfVEFCTEVfRU5UUlkgKnBSZWdFbnRyeTsKKyAgIGNoYXIgKmNsb25lOworICAgY2hhciAqcENtZDsKKyAgIHZvaWQgKnBGaWVsZDsKKyAgIGNoYXIgKm5hbWU7CisgICBjaGFyICp2YWx1ZV9zdHI7CisgICB2X1UzMl90IHZhbHVlOworICAgdl9TMzFfdCBzdmFsdWU7CisgICBzaXplX3QgbGVuX3ZhbHVlX3N0cjsKKyAgIHVuc2lnbmVkIGludCBpZHg7CisgICB1bnNpZ25lZCBpbnQgaTsKKyAgIFZPU19TVEFUVVMgdnN0YXR1czsKKworICAgLy8gYXNzdW1lIGZhaWx1cmUgdW50aWwgcHJvdmVuIG90aGVyd2lzZQorICAgdnN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworCisgICAvLyBjbG9uZSB0aGUgY29tbWFuZCBzbyB0aGF0IHdlIGNhbiBtYW5pcHVsYXRlIGl0CisgICBjbG9uZSA9IGtzdHJkdXAoY29tbWFuZCwgR0ZQX0FUT01JQyk7CisgICBpZiAoTlVMTCA9PSBjbG9uZSkKKyAgIHsKKyAgICAgIGhkZExvZyhMT0dFLCAiJXM6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsIHVuYWJsZSB0byBwcm9jZXNzIFslc10iLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY29tbWFuZCk7CisgICAgICByZXR1cm4gdnN0YXR1czsKKyAgIH0KKworICAgLy8gJ2Nsb25lJyB3aWxsIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBzbyBpdCBjYW4gYmUgZnJlZWQKKyAgIC8vICdwQ21kJyB3aWxsIGJlIHVzZWQgdG8gd2Fsay9wYXJzZSB0aGUgY29tbWFuZAorICAgcENtZCA9IGNsb25lOworCisgICAvLyBnZXQgcmlkIG9mIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgcENtZCA9IGlfdHJpbShwQ21kKTsKKyAgIGlmICgnXDAnID09ICpwQ21kKQorICAgeworICAgICAgLy8gb25seSB3aGl0ZXNwYWNlCisgICAgICBoZGRMb2coTE9HRSwgIiVzOiBpbnZhbGlkIGNvbW1hbmQsIG9ubHkgd2hpdGVzcGFjZTpbJXNdIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvbW1hbmQpOworICAgICAgZ290byBkb25lOworICAgfQorCisgICAvLyBwYXJzZSB0aGUgPG5hbWU+ID0gPHZhbHVlPgorICAgbmFtZSA9IHBDbWQ7CisgICB3aGlsZSAoKCc9JyAhPSAqcENtZCkgJiYgKCdcMCcgIT0gKnBDbWQpKQorICAgeworICAgICAgcENtZCsrOworICAgfQorICAgaWYgKCdcMCcgPT0gKnBDbWQpCisgICB7CisgICAgICAvLyBkaWQgbm90IGZpbmQgJz0nCisgICAgICBoZGRMb2coTE9HRSwgIiVzOiBpbnZhbGlkIGNvbW1hbmQsIG5vICc9JzpbJXNdIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvbW1hbmQpOworICAgICAgZ290byBkb25lOworICAgfQorCisgICAvLyByZXBsYWNlICc9JyB3aXRoIE5VTCB0byB0ZXJtaW5hdGUgdGhlIDxuYW1lPgorICAgKnBDbWQrKyA9ICdcMCc7CisgICBuYW1lID0gaV90cmltKG5hbWUpOworICAgaWYgKCdcMCcgPT0gKm5hbWUpCisgICB7CisgICAgICAvLyBkaWQgbm90IGZpbmQgYSBuYW1lCisgICAgICBoZGRMb2coTE9HRSwgIiVzOiBpbnZhbGlkIGNvbW1hbmQsIG5vIDxuYW1lPjpbJXNdIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvbW1hbmQpOworICAgICAgZ290byBkb25lOworICAgfQorCisgICB2YWx1ZV9zdHIgPSBpX3RyaW0ocENtZCk7CisgICBpZiAoJ1wwJyA9PSAqdmFsdWVfc3RyKQorICAgeworICAgICAgLy8gZGlkIG5vdCBmaW5kIGEgdmFsdWUKKyAgICAgIGhkZExvZyhMT0dFLCAiJXM6IGludmFsaWQgY29tbWFuZCwgbm8gPHZhbHVlPjpbJXNdIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvbW1hbmQpOworICAgICAgZ290byBkb25lOworICAgfQorCisgICAvLyBsb29rdXAgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbQorICAgZm9yIChpZHggPSAwOyBpZHggPCB0YWJsZVNpemU7IGlkeCsrKQorICAgeworICAgICAgaWYgKDAgPT0gc3RyY21wKG5hbWUsIGdfcmVnaXN0cnlfdGFibGVbaWR4XS5SZWdOYW1lKSkKKyAgICAgIHsKKyAgICAgICAgIC8vIGZvdW5kIGEgbWF0Y2gKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorICAgaWYgKHRhYmxlU2l6ZSA9PSBpZHgpCisgICB7CisgICAgICAvLyBkaWQgbm90IG1hdGNoIHRoZSBuYW1lCisgICAgICBoZGRMb2coTE9HRSwgIiVzOiBpbnZhbGlkIGNvbW1hbmQsIHVua25vd24gY29uZmlndXJhdGlvbiBpdGVtOlslc10iLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY29tbWFuZCk7CisgICAgICBnb3RvIGRvbmU7CisgICB9CisKKyAgIHBSZWdFbnRyeSA9ICZnX3JlZ2lzdHJ5X3RhYmxlW2lkeF07CisgICBpZiAoIShwUmVnRW50cnktPkZsYWdzICYgVkFSX0ZMQUdTX0RZTkFNSUNfQ0ZHKSkKKyAgIHsKKyAgICAgIC8vIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBjb25maWd1cmF0aW9uCisgICAgICBoZGRMb2coTE9HRSwgIiVzOiBpbnZhbGlkIGNvbW1hbmQsICVzIGRvZXMgbm90IHN1cHBvcnQgIgorICAgICAgICAgICAgICJkeW5hbWljIGNvbmZpZ3VyYXRpb24iLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworICAgICAgZ290byBkb25lOworICAgfQorCisgICBwRmllbGQgPSAoKHZfVThfdCAqKXBIZGRDdHgtPmNmZ19pbmkpICsgcFJlZ0VudHJ5LT5WYXJPZmZzZXQ7CisKKyAgIHN3aXRjaCAocFJlZ0VudHJ5LT5SZWdUeXBlKQorICAgeworICAgY2FzZSBXTEFOX1BBUkFNX0ludGVnZXI6CisgICAgICB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlX3N0ciwgTlVMTCwgMTApOworICAgICAgaWYgKHZhbHVlIDwgcFJlZ0VudHJ5LT5WYXJNaW4pCisgICAgICB7CisgICAgICAgICAvLyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgIGhkZExvZyhMT0dFLCAiJXM6IGludmFsaWQgY29tbWFuZCwgdmFsdWUgJXUgPCBtaW4gdmFsdWUgJXUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmFsdWUsIHBSZWdFbnRyeS0+VmFyTWluKTsKKyAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGlmICh2YWx1ZSA+IHBSZWdFbnRyeS0+VmFyTWF4KQorICAgICAgeworICAgICAgICAgLy8gb3V0IG9mIHJhbmdlCisgICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBpbnZhbGlkIGNvbW1hbmQsIHZhbHVlICV1ID4gbWF4IHZhbHVlICV1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZhbHVlLCBwUmVnRW50cnktPlZhck1heCk7CisgICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBtZW1jcHkocEZpZWxkLCAmdmFsdWUsIHBSZWdFbnRyeS0+VmFyU2l6ZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTEFOX1BBUkFNX0hleEludGVnZXI6CisgICAgICB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlX3N0ciwgTlVMTCwgMTYpOworICAgICAgaWYgKHZhbHVlIDwgcFJlZ0VudHJ5LT5WYXJNaW4pCisgICAgICB7CisgICAgICAgICAvLyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgIGhkZExvZyhMT0dFLCAiJXM6IGludmFsaWQgY29tbWFuZCwgdmFsdWUgJXggPCBtaW4gdmFsdWUgJXgiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmFsdWUsIHBSZWdFbnRyeS0+VmFyTWluKTsKKyAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGlmICh2YWx1ZSA+IHBSZWdFbnRyeS0+VmFyTWF4KQorICAgICAgeworICAgICAgICAgLy8gb3V0IG9mIHJhbmdlCisgICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBpbnZhbGlkIGNvbW1hbmQsIHZhbHVlICV4ID4gbWF4IHZhbHVlICV4IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZhbHVlLCBwUmVnRW50cnktPlZhck1heCk7CisgICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBtZW1jcHkocEZpZWxkLCAmdmFsdWUsIHBSZWdFbnRyeS0+VmFyU2l6ZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTEFOX1BBUkFNX1NpZ25lZEludGVnZXI6CisgICAgICBzdmFsdWUgPSBzaW1wbGVfc3RydG9sKHZhbHVlX3N0ciwgTlVMTCwgMTApOworICAgICAgaWYgKHN2YWx1ZSA8ICh2X1MzMV90KXBSZWdFbnRyeS0+VmFyTWluKQorICAgICAgeworICAgICAgICAgLy8gb3V0IG9mIHJhbmdlCisgICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBpbnZhbGlkIGNvbW1hbmQsIHZhbHVlICVkIDwgbWluIHZhbHVlICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN2YWx1ZSwgKGludClwUmVnRW50cnktPlZhck1pbik7CisgICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBpZiAoc3ZhbHVlID4gKHZfUzMxX3QpcFJlZ0VudHJ5LT5WYXJNYXgpCisgICAgICB7CisgICAgICAgICAvLyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgIGhkZExvZyhMT0dFLCAiJXM6IGludmFsaWQgY29tbWFuZCwgdmFsdWUgJWQgPiBtYXggdmFsdWUgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3ZhbHVlLCAoaW50KXBSZWdFbnRyeS0+VmFyTWF4KTsKKyAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIG1lbWNweShwRmllbGQsICZzdmFsdWUsIHBSZWdFbnRyeS0+VmFyU2l6ZSk7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTEFOX1BBUkFNX1N0cmluZzoKKyAgICAgIGxlbl92YWx1ZV9zdHIgPSBzdHJsZW4odmFsdWVfc3RyKTsKKyAgICAgIGlmIChsZW5fdmFsdWVfc3RyID4gKHBSZWdFbnRyeS0+VmFyU2l6ZSAtIDEpKQorICAgICAgeworICAgICAgICAgLy8gdG9vIGJpZworICAgICAgICAgaGRkTG9nKExPR0UsCisgICAgICAgICAgICAgICAgIiVzOiBpbnZhbGlkIGNvbW1hbmQsIHN0cmluZyBbJXNdIGxlbmd0aCAiCisgICAgICAgICAgICAgICAgIiV1IGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggJXUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgIGxlbl92YWx1ZV9zdHIsIChwUmVnRW50cnktPlZhclNpemUgLSAxKSk7CisgICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICAvLyBjb3B5IHN0cmluZyBwbHVzIE5VTAorICAgICAgbWVtY3B5KHBGaWVsZCwgdmFsdWVfc3RyLCAobGVuX3ZhbHVlX3N0ciArIDEpKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFdMQU5fUEFSQU1fTWFjQWRkcjoKKyAgICAgIGxlbl92YWx1ZV9zdHIgPSBzdHJsZW4odmFsdWVfc3RyKTsKKyAgICAgIGlmIChsZW5fdmFsdWVfc3RyICE9IChWT1NfTUFDX0FERFJfU0laRSAqIDIpKQorICAgICAgeworICAgICAgICAgLy8gb3V0IG9mIHJhbmdlCisgICAgICAgICBoZGRMb2coTE9HRSwKKyAgICAgICAgICAgICAgICAiJXM6IGludmFsaWQgY29tbWFuZCwgTUFDIGFkZHJlc3MgWyVzXSBsZW5ndGggIgorICAgICAgICAgICAgICAgICIldSBpcyBub3QgZXhwZWN0ZWQgbGVuZ3RoICV1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICBsZW5fdmFsdWVfc3RyLCAoVk9TX01BQ19BRERSX1NJWkUgKiAyKSk7CisgICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICAvL3BhcnNlIHRoZSBzdHJpbmcgYW5kIHN0b3JlIGl0IGluIHRoZSBieXRlIGFycmF5CisgICAgICBmb3IgKGkgPSAwOyBpIDwgVk9TX01BQ19BRERSX1NJWkU7IGkrKykKKyAgICAgIHsKKyAgICAgICAgICgoY2hhciopcEZpZWxkKVtpXSA9IChjaGFyKQorICAgICAgICAgICAgKChwYXJzZUhleERpZ2l0KHZhbHVlX3N0clsoaSAqIDIpXSkgKiAxNikgKworICAgICAgICAgICAgIHBhcnNlSGV4RGlnaXQodmFsdWVfc3RyWyhpICogMikgKyAxXSkpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGRvbmU7CisgICB9CisKKyAgIC8vIGlmIHdlIGdldCBoZXJlLCB3ZSBoYWQgYSBzdWNjZXNzZnVsIG1vZGlmaWNhdGlvbgorICAgdnN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgLy8gY29uZmlnIHRhYmxlIGhhcyBiZWVuIG1vZGlmaWVkLCBpcyB0aGVyZSBhIG5vdGlmaWVyPworICAgaWYgKE5VTEwgIT0gcFJlZ0VudHJ5LT5wZm5EeW5hbWljTm90aWZ5KQorICAgeworICAgICAgKHBSZWdFbnRyeS0+cGZuRHluYW1pY05vdGlmeSkocEhkZEN0eCwgcFJlZ0VudHJ5LT5Ob3RpZnlJZCk7CisgICB9CisKKyAgIC8vIG5vdGUgdGhhdCB0aGlzIGl0ZW0gd2FzIGV4cGxpY2l0bHkgY29uZmlndXJlZAorICAgaWYgKGlkeCA8IE1BWF9DRkdfSU5JX0lURU1TKQorICAgeworICAgICAgc2V0X2JpdChpZHgsICh2b2lkICopJnBIZGRDdHgtPmNmZ19pbmktPmJFeHBsaWNpdENmZyk7CisgICB9CisgZG9uZToKKyAgIGtmcmVlKGNsb25lKTsKKyAgIHJldHVybiB2c3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvc3JjL3dsYW5faGRkX2NmZzgwMjExLmMgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfY2ZnODAyMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzhmNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX2NmZzgwMjExLmMKQEAgLTAsMCArMSw1MTE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgXGZpbGUgIHdsYW5faGRkX2NmZzgwMjExLmMKKworICBcYnJpZWYgV0xBTiBIb3N0IERldmljZSBEcml2ZXIgaW1wbGVtZW50YXRpb24KKworICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorCisgIEVESVQgSElTVE9SWSBGT1IgRklMRSAKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLiAKKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4gCisKKworICAkSGVhZGVyOiQgICAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJCAKKworCisgIHdoZW4gICAgICAgIHdobyAgICAgICAgICAgIHdoYXQsIHdoZXJlLCB3aHkgCisgIC0tLS0tLS0tICAgIC0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMjEvMTIvMDkgICAgIEFzaHdhbmkgICAgICAgIENyZWF0ZWQgbW9kdWxlLiAgCisKKyAwNy8wNi8xMCAgICAgS3VtYXIgRGVlcGFrICAgSW1wbGVtZW50ZWQgY2ZnODAyMTEgY2FsbGJhY2tzIGZvciBBTkRST0lECisgICAgICAgICAgICAgIEdhbmVzaCBLICAgICAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dvd2wuaD4KKyNpbmNsdWRlIDxhbmlHbG9iYWwuaD4KKyNpbmNsdWRlICJjY21BcGkuaCIKKyNpbmNsdWRlICJzaXJQYXJhbXMuaCIKKyNpbmNsdWRlICJkb3QxMWYuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9hc3NvYy5oIgorI2luY2x1ZGUgIndsYW5faGRkX3dleHQuaCIKKyNpbmNsdWRlICJzbWVfQXBpLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfcDJwLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfY2ZnODAyMTEuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9ob3N0YXBkLmgiCisjaW5jbHVkZSAic2FwSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9zb2Z0YXBfdHhfcnguaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisjaWZkZWYgV0xBTl9CVEFNUF9GRUFUVVJFCisjaW5jbHVkZSAiYmFwX2hkZF9taXNjLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxxY19zYXBfaW9jdGwuaD4KKworI2RlZmluZSBnX21vZGVfcmF0ZXNfc2l6ZSAoMTIpCisjZGVmaW5lIGFfbW9kZV9yYXRlc19zaXplICg4KQorI2RlZmluZSBGUkVRX0JBU0VfODAyMTFHICAgICAgICAgICgyNDA3KQorI2RlZmluZSBGUkVRX0JBTkRfRElGRl84MDIxMUcgICAgICg1KQorI2RlZmluZSBNQVhfU0NBTl9TU0lEIDIKKyNkZWZpbmUgR0VUX0lFX0xFTl9JTl9CU1NfREVTQyhsZW5JbkJzcykgKCBsZW5JbkJzcyArIHNpemVvZihsZW5JbkJzcykgLSBcCisgICAgICAgICgoaW50KSBPRkZTRVRfT0YoIHRTaXJCc3NEZXNjcmlwdGlvbiwgaWVGaWVsZHMpKSkKKworI2RlZmluZSBIREQyR0haQ0hBTihmcmVxLCBjaGFuLCBmbGFnKSAgIHsgICAgIFwKKyAgICAuYmFuZCA9ICBJRUVFODAyMTFfQkFORF8yR0haLCBcCisgICAgLmNlbnRlcl9mcmVxID0gKGZyZXEpLCBcCisgICAgLmh3X3ZhbHVlID0gKGNoYW4pLFwKKyAgICAuZmxhZ3MgPSAoZmxhZyksIFwKKyAgICAubWF4X2FudGVubmFfZ2FpbiA9IDAgLFwKKyAgICAubWF4X3Bvd2VyID0gMzAsIFwKK30KKworI2RlZmluZSBIREQ1R0haQ0hBTihmcmVxLCBjaGFuLCBmbGFnKSAgIHsgICAgIFwKKyAgICAuYmFuZCA9ICBJRUVFODAyMTFfQkFORF81R0haLCBcCisgICAgLmNlbnRlcl9mcmVxID0gKGZyZXEpLCBcCisgICAgLmh3X3ZhbHVlID0gKGNoYW4pLFwKKyAgICAuZmxhZ3MgPSAoZmxhZyksIFwKKyAgICAubWF4X2FudGVubmFfZ2FpbiA9IDAgLFwKKyAgICAubWF4X3Bvd2VyID0gMzAsIFwKK30KKworI2RlZmluZSBIRERfR19NT0RFX1JBVEVUQUIocmF0ZSwgcmF0ZV9pZCwgZmxhZylcCit7XAorICAgIC5iaXRyYXRlID0gcmF0ZSwgXAorICAgIC5od192YWx1ZSA9IHJhdGVfaWQsIFwKKyAgICAuZmxhZ3MgPSBmbGFnLCBcCit9CisKK3N0YXRpYyBjb25zdCB1MzIgaGRkX2NpcGhlcl9zdWl0ZXNbXSA9IAoreworICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwLAorICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCwKKyAgICBXTEFOX0NJUEhFUl9TVUlURV9US0lQLAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyNkZWZpbmUgV0xBTl9DSVBIRVJfU1VJVEVfS1JLIDB4MDA0MDk2ZmYgLyogdXNlIGZvciBLUksgKi8KKyAgICBXTEFOX0NJUEhFUl9TVUlURV9LUkssCisgICAgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCwKKyNlbHNlCisgICAgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCwKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgV0xBTl9DSVBIRVJfU1VJVEVfU01TNCwKKyNlbmRpZgorfTsKKworc3RhdGljIGlubGluZSBpbnQgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoY29uc3QgdTggKmFkZHIpCit7CisgICAgcmV0dXJuICgoYWRkclswXSA9PSAweGZmKSAmJiAoYWRkclsxXSA9PSAweGZmKSAmJiAoYWRkclsyXSA9PSAweGZmKSAmJgorICAgICAgICAgICAgKGFkZHJbM10gPT0gMHhmZikgJiYgKGFkZHJbNF0gPT0gMHhmZikgJiYgKGFkZHJbNV0gPT0gMHhmZikpOworfQorCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGhkZF9jaGFubmVsc18yXzRfR0haW10gPQoreyAgCisgICAgSEREMkdIWkNIQU4oMjQxMiwgMSwgMCkgLAorICAgIEhERDJHSFpDSEFOKDI0MTcsIDIsIDApICwKKyAgICBIREQyR0haQ0hBTigyNDIyLCAzLCAwKSAsCisgICAgSEREMkdIWkNIQU4oMjQyNywgNCwgMCkgLAorICAgIEhERDJHSFpDSEFOKDI0MzIsIDUsIDApICwKKyAgICBIREQyR0haQ0hBTigyNDM3LCA2LCAwKSAsCisgICAgSEREMkdIWkNIQU4oMjQ0MiwgNywgMCkgLAorICAgIEhERDJHSFpDSEFOKDI0NDcsIDgsIDApICwKKyAgICBIREQyR0haQ0hBTigyNDUyLCA5LCAwKSAsCisgICAgSEREMkdIWkNIQU4oMjQ1NywgMTAsIDApICwKKyAgICBIREQyR0haQ0hBTigyNDYyLCAxMSwgMCkgLAorICAgIEhERDJHSFpDSEFOKDI0NjcsIDEyLCAwKSAsCisgICAgSEREMkdIWkNIQU4oMjQ3MiwgMTMsIDApICwKKyAgICBIREQyR0haQ0hBTigyNDg0LCAxNCwgMCkgLAorfTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgaGRkX3NvY2lhbF9jaGFubmVsc18yXzRfR0haW10gPQoreworICAgIEhERDJHSFpDSEFOKDI0MTIsIDEsIDApICwKKyAgICBIREQyR0haQ0hBTigyNDM3LCA2LCAwKSAsCisgICAgSEREMkdIWkNIQU4oMjQ2MiwgMTEsIDApICwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBoZGRfY2hhbm5lbHNfNV9HSFpbXSA9Cit7CisgICAgSERENUdIWkNIQU4oNTE4MCwgMzYsIDApICwKKyAgICBIREQ1R0haQ0hBTig1MjAwLCA0MCwgMCkgLAorICAgIEhERDVHSFpDSEFOKDUyMjAsIDQ0LCAwKSAsCisgICAgSERENUdIWkNIQU4oNTI0MCwgNDgsIDApICwKKyAgICBIREQ1R0haQ0hBTig1MjYwLCA1MiwgMCkgLAorICAgIEhERDVHSFpDSEFOKDUyODAsIDU2LCAwKSAsCisgICAgSERENUdIWkNIQU4oNTMwMCwgNjAsIDApICwKKyAgICBIREQ1R0haQ0hBTig1MzIwLCA2NCwgMCkgLAorICAgIEhERDVHSFpDSEFOKDU1MDAsMTAwLCAwKSAsCisgICAgSERENUdIWkNIQU4oNTUyMCwxMDQsIDApICwKKyAgICBIREQ1R0haQ0hBTig1NTQwLDEwOCwgMCkgLAorICAgIEhERDVHSFpDSEFOKDU1NjAsMTEyLCAwKSAsCisgICAgSERENUdIWkNIQU4oNTU4MCwxMTYsIDApICwKKyAgICBIREQ1R0haQ0hBTig1NjAwLDEyMCwgMCkgLAorICAgIEhERDVHSFpDSEFOKDU2MjAsMTI0LCAwKSAsCisgICAgSERENUdIWkNIQU4oNTY0MCwxMjgsIDApICwKKyAgICBIREQ1R0haQ0hBTig1NjYwLDEzMiwgMCkgLAorICAgIEhERDVHSFpDSEFOKDU2ODAsMTM2LCAwKSAsCisgICAgSERENUdIWkNIQU4oNTcwMCwxNDAsIDApICwKKyAgICBIREQ1R0haQ0hBTig1NzQ1LDE0OSwgMCkgLAorICAgIEhERDVHSFpDSEFOKDU3NjUsMTUzLCAwKSAsCisgICAgSERENUdIWkNIQU4oNTc4NSwxNTcsIDApICwKKyAgICBIREQ1R0haQ0hBTig1ODA1LDE2MSwgMCkgLAorICAgIEhERDVHSFpDSEFOKDU4MjUsMTY1LCAwKSAsCit9OworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIGdfbW9kZV9yYXRlc1tdID0KK3sKKyAgICBIRERfR19NT0RFX1JBVEVUQUIoMTAsIDB4MSwgMCksICAgIAorICAgIEhERF9HX01PREVfUkFURVRBQigyMCwgMHgyLCAwKSwgICAgCisgICAgSEREX0dfTU9ERV9SQVRFVEFCKDU1LCAweDQsIDApLCAgICAKKyAgICBIRERfR19NT0RFX1JBVEVUQUIoMTEwLCAweDgsIDApLCAgICAKKyAgICBIRERfR19NT0RFX1JBVEVUQUIoNjAsIDB4MTAsIDApLCAgICAKKyAgICBIRERfR19NT0RFX1JBVEVUQUIoOTAsIDB4MjAsIDApLCAgICAKKyAgICBIRERfR19NT0RFX1JBVEVUQUIoMTIwLCAweDQwLCAwKSwgICAgCisgICAgSEREX0dfTU9ERV9SQVRFVEFCKDE4MCwgMHg4MCwgMCksICAgIAorICAgIEhERF9HX01PREVfUkFURVRBQigyNDAsIDB4MTAwLCAwKSwgICAgCisgICAgSEREX0dfTU9ERV9SQVRFVEFCKDM2MCwgMHgyMDAsIDApLCAgICAKKyAgICBIRERfR19NT0RFX1JBVEVUQUIoNDgwLCAweDQwMCwgMCksICAgIAorICAgIEhERF9HX01PREVfUkFURVRBQig1NDAsIDB4ODAwLCAwKSwKK307ICAgCisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgYV9tb2RlX3JhdGVzW10gPQoreworICAgIEhERF9HX01PREVfUkFURVRBQig2MCwgMHgxMCwgMCksICAgIAorICAgIEhERF9HX01PREVfUkFURVRBQig5MCwgMHgyMCwgMCksICAgIAorICAgIEhERF9HX01PREVfUkFURVRBQigxMjAsIDB4NDAsIDApLCAgICAKKyAgICBIRERfR19NT0RFX1JBVEVUQUIoMTgwLCAweDgwLCAwKSwgICAgCisgICAgSEREX0dfTU9ERV9SQVRFVEFCKDI0MCwgMHgxMDAsIDApLCAgICAKKyAgICBIRERfR19NT0RFX1JBVEVUQUIoMzYwLCAweDIwMCwgMCksICAgIAorICAgIEhERF9HX01PREVfUkFURVRBQig0ODAsIDB4NDAwLCAwKSwgICAgCisgICAgSEREX0dfTU9ERV9SQVRFVEFCKDU0MCwgMHg4MDAsIDApLAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgd2xhbl9oZGRfYmFuZF8yXzRfR0haID0KK3sKKyAgICAuY2hhbm5lbHMgPSBoZGRfY2hhbm5lbHNfMl80X0dIWiwKKyAgICAubl9jaGFubmVscyA9IEFSUkFZX1NJWkUoaGRkX2NoYW5uZWxzXzJfNF9HSFopLAorICAgIC5iYW5kICAgICAgID0gSUVFRTgwMjExX0JBTkRfMkdIWiwKKyAgICAuYml0cmF0ZXMgPSBnX21vZGVfcmF0ZXMsCisgICAgLm5fYml0cmF0ZXMgPSBnX21vZGVfcmF0ZXNfc2l6ZSwKKyAgICAuaHRfY2FwLmh0X3N1cHBvcnRlZCAgID0gMSwKKyAgICAuaHRfY2FwLmNhcCAgICAgICAgICAgID0gIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElFRUU4MDIxMV9IVF9DQVBfRFNTU0NDSzQwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJRUVFODAyMTFfSFRfQ0FQX0xTSUdfVFhPUF9QUk9ULAorICAgIC5odF9jYXAuYW1wZHVfZmFjdG9yICAgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKKyAgICAuaHRfY2FwLmFtcGR1X2RlbnNpdHkgID0gSUVFRTgwMjExX0hUX01QRFVfREVOU0lUWV8xNiwKKyAgICAuaHRfY2FwLm1jcy5yeF9tYXNrICAgID0geyAweGZmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCB9LAorICAgIC5odF9jYXAubWNzLnJ4X2hpZ2hlc3QgPSBjcHVfdG9fbGUxNiggNzIgKSwKKyAgICAuaHRfY2FwLm1jcy50eF9wYXJhbXMgID0gSUVFRTgwMjExX0hUX01DU19UWF9ERUZJTkVELAorfTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIHdsYW5faGRkX2JhbmRfcDJwXzJfNF9HSFogPQoreworICAgIC5jaGFubmVscyA9IGhkZF9zb2NpYWxfY2hhbm5lbHNfMl80X0dIWiwKKyAgICAubl9jaGFubmVscyA9IEFSUkFZX1NJWkUoaGRkX3NvY2lhbF9jaGFubmVsc18yXzRfR0haKSwKKyAgICAuYmFuZCAgICAgICA9IElFRUU4MDIxMV9CQU5EXzJHSFosCisgICAgLmJpdHJhdGVzID0gZ19tb2RlX3JhdGVzLAorICAgIC5uX2JpdHJhdGVzID0gZ19tb2RlX3JhdGVzX3NpemUsCisgICAgLmh0X2NhcC5odF9zdXBwb3J0ZWQgICA9IDEsCisgICAgLmh0X2NhcC5jYXAgICAgICAgICAgICA9ICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9MU0lHX1RYT1BfUFJPVCwKKyAgICAuaHRfY2FwLmFtcGR1X2ZhY3RvciAgID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEssCisgICAgLmh0X2NhcC5hbXBkdV9kZW5zaXR5ICA9IElFRUU4MDIxMV9IVF9NUERVX0RFTlNJVFlfMTYsCisgICAgLmh0X2NhcC5tY3MucnhfbWFzayAgICA9IHsgMHhmZiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgfSwKKyAgICAuaHRfY2FwLm1jcy5yeF9oaWdoZXN0ID0gY3B1X3RvX2xlMTYoIDcyICksCisgICAgLmh0X2NhcC5tY3MudHhfcGFyYW1zICA9IElFRUU4MDIxMV9IVF9NQ1NfVFhfREVGSU5FRCwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgd2xhbl9oZGRfYmFuZF81X0dIWiA9Cit7CisgICAgLmNoYW5uZWxzID0gaGRkX2NoYW5uZWxzXzVfR0haLAorICAgIC5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShoZGRfY2hhbm5lbHNfNV9HSFopLAorICAgIC5iYW5kICAgICA9IElFRUU4MDIxMV9CQU5EXzVHSFosCisgICAgLmJpdHJhdGVzID0gYV9tb2RlX3JhdGVzLAorICAgIC5uX2JpdHJhdGVzID0gYV9tb2RlX3JhdGVzX3NpemUsCisgICAgLmh0X2NhcC5odF9zdXBwb3J0ZWQgICA9IDEsCisgICAgLmh0X2NhcC5jYXAgICAgICAgICAgICA9ICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9MU0lHX1RYT1BfUFJPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwLAorICAgIC5odF9jYXAuYW1wZHVfZmFjdG9yICAgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKKyAgICAuaHRfY2FwLmFtcGR1X2RlbnNpdHkgID0gSUVFRTgwMjExX0hUX01QRFVfREVOU0lUWV8xNiwKKyAgICAuaHRfY2FwLm1jcy5yeF9tYXNrICAgID0geyAweGZmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCB9LAorICAgIC5odF9jYXAubWNzLnJ4X2hpZ2hlc3QgPSBjcHVfdG9fbGUxNiggNzIgKSwKKyAgICAuaHRfY2FwLm1jcy50eF9wYXJhbXMgID0gSUVFRTgwMjExX0hUX01DU19UWF9ERUZJTkVELAorfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbiBpbmZvcm1hdGlvbiB3aGF0IGtpbmQgb2YgZnJhbWUgYXJlIGV4cGVjdGVkIGluIAorICAgICBUWC9SWCBkaXJlY3Rpb24gZm9yIGVhY2gga2luZCBvZiBpbnRlcmZhY2UgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4cnhfc3R5cGVzCit3bGFuX2hkZF90eHJ4X3N0eXBlc1tOVU1fTkw4MDIxMV9JRlRZUEVTXSA9IHsKKyAgICBbTkw4MDIxMV9JRlRZUEVfU1RBVElPTl0gPSB7CisgICAgICAgIC50eCA9IDB4ZmZmZiwKKyAgICAgICAgLnJ4ID0gQklUKFNJUl9NQUNfTUdNVF9BQ1RJT04pIHwKKyAgICAgICAgICAgIEJJVChTSVJfTUFDX01HTVRfUFJPQkVfUkVRKSwKKyAgICB9LAorICAgIFtOTDgwMjExX0lGVFlQRV9BUF0gPSB7CisgICAgICAgIC50eCA9IDB4ZmZmZiwKKyAgICAgICAgLnJ4ID0gQklUKFNJUl9NQUNfTUdNVF9BU1NPQ19SRVEpIHwKKyAgICAgICAgICAgIEJJVChTSVJfTUFDX01HTVRfUkVBU1NPQ19SRVEpIHwKKyAgICAgICAgICAgIEJJVChTSVJfTUFDX01HTVRfUFJPQkVfUkVRKSB8CisgICAgICAgICAgICBCSVQoU0lSX01BQ19NR01UX0RJU0FTU09DKSB8CisgICAgICAgICAgICBCSVQoU0lSX01BQ19NR01UX0FVVEgpIHwKKyAgICAgICAgICAgIEJJVChTSVJfTUFDX01HTVRfREVBVVRIKSB8CisgICAgICAgICAgICBCSVQoU0lSX01BQ19NR01UX0FDVElPTiksCisgICAgfSwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQICAgIAorICAgIFtOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UXSA9IHsKKyAgICAgICAgLnR4ID0gMHhmZmZmLAorICAgICAgICAucnggPSBCSVQoU0lSX01BQ19NR01UX0FDVElPTikgfAorICAgICAgICAgICAgQklUKFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpLAorICAgIH0sCisgICAgW05MODAyMTFfSUZUWVBFX1AyUF9HT10gPSB7CisgICAgICAgIC8qIFRoaXMgaXMgYWxzbyBzYW1lIGFzIGZvciBTb2Z0QVAgKi8KKyAgICAgICAgLnR4ID0gMHhmZmZmLAorICAgICAgICAucnggPSBCSVQoU0lSX01BQ19NR01UX0FTU09DX1JFUSkgfAorICAgICAgICAgICAgQklUKFNJUl9NQUNfTUdNVF9SRUFTU09DX1JFUSkgfAorICAgICAgICAgICAgQklUKFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpIHwKKyAgICAgICAgICAgIEJJVChTSVJfTUFDX01HTVRfRElTQVNTT0MpIHwKKyAgICAgICAgICAgIEJJVChTSVJfTUFDX01HTVRfQVVUSCkgfAorICAgICAgICAgICAgQklUKFNJUl9NQUNfTUdNVF9ERUFVVEgpIHwKKyAgICAgICAgICAgIEJJVChTSVJfTUFDX01HTVRfQUNUSU9OKSwKKyAgICB9LAorI2VuZGlmICAgIAorfTsKKworc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9vcHMgd2xhbl9oZGRfY2ZnODAyMTFfb3BzOworCisvKiBEYXRhIHJhdGUgMTAwS0JQUyBiYXNlZCBvbiBJRSBJbmRleCAqLworc3RydWN0IGluZGV4X2RhdGFfcmF0ZV90eXBlCit7CisgICB2X1U4X3QgICBiZWFjb25fcmF0ZV9pbmRleDsKKyAgIHZfVTE2X3QgIHN1cHBvcnRlZF9yYXRlWzRdOworfTsKKworLyogMTFCLCAxMUcgUmF0ZSB0YWJsZSBpbmNsdWRlIEJhc2ljIHJhdGUgYW5kIEV4dGVuZGVkIHJhdGUKKyAgIFRoZSBJRFggZmllbGQgaXMgdGhlIHJhdGUgaW5kZXgKKyAgIFRoZSBISSBmaWVsZCBpcyB0aGUgcmF0ZSB3aGVuIFJTU0kgaXMgc3Ryb25nIG9yIGJlaW5nIGlnbm9yZWQKKyAgICAoaW4gdGhpcyBjYXNlIHdlIHJlcG9ydCBhY3R1YWwgcmF0ZSkKKyAgIFRoZSBNSUQgZmllbGQgaXMgdGhlIHJhdGUgd2hlbiBSU1NJIGlzIG1vZGVyYXRlCisgICAgKGluIHRoaXMgY2FzZSB3ZSBjYXAgMTFiIHJhdGVzIGF0IDUuNSBhbmQgMTFnIHJhdGVzIGF0IDI0KQorICAgVGhlIExPIGZpZWxkIGlzIHRoZSByYXRlIHdoZW4gUlNTSSBpcyBsb3cKKyAgICAoaW4gdGhpcyBjYXNlIHdlIGRvbid0IHJlcG9ydCByYXRlcywgYWN0dWFsIGN1cnJlbnQgcmF0ZSB1c2VkKQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgICB2X1U4X3QgICBiZWFjb25fcmF0ZV9pbmRleDsKKyAgIHZfVTE2X3QgIHN1cHBvcnRlZF9yYXRlWzNdOworfSBzdXBwb3J0ZWRfZGF0YV9yYXRlW10gPQoreworLyogSURYICAgICBISSAgTUlEIExPIChSU1NJLWJhc2VkIGluZGV4ICovCisgICB7MiwgICB7IDEwLCAgMTAsIDB9fSwKKyAgIHs0LCAgIHsgMjAsICAyMCwgMH19LAorICAgezExLCAgeyA1NSwgIDU1LCAwfX0sCisgICB7MTIsICB7IDYwLCAgNjAsIDB9fSwKKyAgIHsxOCwgIHsgOTAsICA5MCwgMH19LAorICAgezIyLCAgezExMCwgIDU1LCAwfX0sCisgICB7MjQsICB7MTIwLCAxMjAsIDB9fSwKKyAgIHszNiwgIHsxODAsIDE4MCwgMH19LAorICAgezQ0LCAgezIyMCwgMjIwLCAwfX0sCisgICB7NDgsICB7MjQwLCAyNDAsIDB9fSwKKyAgIHs2NiwgIHszMzAsIDI0MCwgMH19LAorICAgezcyLCAgezM2MCwgMjQwLCAwfX0sCisgICB7OTYsICB7NDgwLCAyNDAsIDB9fSwKKyAgIHsxMDgsIHs1NDAsIDI0MCwgMH19Cit9OworCisvKiBNQ1MgQmFzZWQgcmF0ZSB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBpbmRleF9kYXRhX3JhdGVfdHlwZSBzdXBwb3J0ZWRfbWNzX3JhdGVbXSA9Cit7CisvKiBNQ1MgIEwyMCAgIEw0MCAgIFMyMCAgUzQwICovCisgICB7MCwgIHs2NSwgIDEzNSwgIDcyLCAgMTUwfX0sCisgICB7MSwgIHsxMzAsIDI3MCwgIDE0NCwgMzAwfX0sCisgICB7MiwgIHsxOTUsIDQwNSwgIDIxNywgNDUwfX0sCisgICB7MywgIHsyNjAsIDU0MCwgIDI4OSwgNjAwfX0sCisgICB7NCwgIHszOTAsIDgxMCwgIDQzMywgOTAwfX0sCisgICB7NSwgIHs1MjAsIDEwODAsIDU3OCwgMTIwMH19LAorICAgezYsICB7NTg1LCAxMjE1LCA2NTAsIDEzNTB9fSwKKyAgIHs3LCAgezY1MCwgMTM1MCwgNzIyLCAxNTAwfX0KK307CisKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0X29wc19zdHJ1Y3Q7CisKKy8qCisgKiBGVU5DVElPTjogd2xhbl9oZGRfY2ZnODAyMTFfaW5pdAorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaGRkX3dsYW5fc3RhcnR1cCgpIAorICogZHVyaW5nIGluaXRpYWxpemF0aW9uLiAKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIGFuZCByZWdpc3RlciB3aXBoeSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCB3aXBoeSAqd2xhbl9oZGRfY2ZnODAyMTFfaW5pdChpbnQgcHJpdl9zaXplKQoreworICAgIHN0cnVjdCB3aXBoeSAqd2lwaHk7CisgICAgRU5URVIoKTsKKworICAgIC8qIAorICAgICAqICAgQ3JlYXRlIHdpcGh5IGRldmljZSAKKyAgICAgKi8KKyAgICB3aXBoeSA9IHdpcGh5X25ldygmd2xhbl9oZGRfY2ZnODAyMTFfb3BzLCBwcml2X3NpemUpOworCisgICAgaWYgKCF3aXBoeSkKKyAgICB7CisgICAgICAgIC8qIFByaW50IGVycm9yIGFuZCBqdW1wIGludG8gZXJyIGxhYmVsIGFuZCBmcmVlIHRoZSBtZW1vcnkgKi8KKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiB3aXBoeSBpbml0IGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHdpcGh5OworfQorCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9iYW5kCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBzdXBwbGljYW50IHRocm91Z2ggYSAKKyAqIHByaXZhdGUgaW9jdGwgdG8gY2hhbmdlIHRoZSBiYW5kIHZhbHVlCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYmFuZChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBlQ3NyQmFuZCBlQmFuZCkKK3sKKyAgICBzd2l0Y2goZUJhbmQpCisgICAgeworICAgICAgICBjYXNlIGVDU1JfQkFORF8yNDoKKyAgICAgICAgICAgIHdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZ3bGFuX2hkZF9iYW5kXzJfNF9HSFo7CisgICAgICAgICAgICB3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9CQU5EXzVHOgorICAgICAgICAgICAgd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gTlVMTDsKKyAgICAgICAgICAgIHdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9ICZ3bGFuX2hkZF9iYW5kXzVfR0haOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9CQU5EX0FMTDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZ3bGFuX2hkZF9iYW5kXzJfNF9HSFo7CisgICAgICAgICAgICB3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSAmd2xhbl9oZGRfYmFuZF81X0dIWjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX2luaXQKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGhkZF93bGFuX3N0YXJ0dXAoKSAKKyAqIGR1cmluZyBpbml0aWFsaXphdGlvbi4gCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgd2lwaHkgc3RydWN0dXJlLgorICovCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9jb25maWdfdCAqcENmZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAvKiBOb3cgYmluZCB0aGUgdW5kZXJseWluZyB3bGFuIGRldmljZSB3aXRoIHdpcGh5ICovCisgICAgc2V0X3dpcGh5X2Rldih3aXBoeSwgZGV2KTsKKworICAgIHdpcGh5LT5tZ210X3N0eXBlcyA9IHdsYW5faGRkX3R4cnhfc3R5cGVzOworCisgICAgd2lwaHktPmZsYWdzIHw9ICAgV0lQSFlfRkxBR19IQVZFX0FQX1NNRSAKKyAgICAgICAgICAgICAgICAgICAgfCBXSVBIWV9GTEFHX0FQX1BST0JFX1JFU1BfT0ZGTE9BRAorICAgICAgICAgICAgICAgICAgICB8IFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlk7CisKKyAgICB3aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSBNQVhfU0NBTl9TU0lEOyAKKyAgICAKKyAgICB3aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gMjAwIDsgLy9UT0RPOiBkZWZpbmUgYSBtYWNybworCisgICAgLyogU3VwcG9ydHMgU1RBVElPTiAmIEFELUhPQyBtb2RlcyByaWdodCBub3cgKi8KKyAgICB3aXBoeS0+aW50ZXJmYWNlX21vZGVzID0gICBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0dPKQorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCSVQoTkw4MDIxMV9JRlRZUEVfQVApOworCisgICAgLyogQmVmb3JlIHJlZ2lzdGVyaW5nIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBodCBjYXBhYmlsaXRpZWQgYmFzZWQKKyAgICAgKiBvbiBpbmkgdmFsdWVzKi8KKyAgICBpZiggIXBDZmctPlNob3J0R0kyME1oekVuYWJsZSApCisgICAgeworICAgICAgICB3bGFuX2hkZF9iYW5kXzJfNF9HSFouaHRfY2FwLmNhcCAgICAgJj0gfklFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOworICAgICAgICB3bGFuX2hkZF9iYW5kXzVfR0haLmh0X2NhcC5jYXAgICAgICAgJj0gfklFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOworICAgICAgICB3bGFuX2hkZF9iYW5kX3AycF8yXzRfR0haLmh0X2NhcC5jYXAgJj0gfklFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOworICAgIH0KKworICAgIGlmKCAhcENmZy0+U2hvcnRHSTQwTWh6RW5hYmxlICkKKyAgICB7CisgICAgICAgIHdsYW5faGRkX2JhbmRfNV9HSFouaHRfY2FwLmNhcCAgICAgICAmPSB+SUVFRTgwMjExX0hUX0NBUF9TR0lfNDA7CisgICAgfQorCisgICAgaWYoICFwQ2ZnLT5uQ2hhbm5lbEJvbmRpbmdNb2RlNUdIeiApCisgICAgeworICAgICAgICB3bGFuX2hkZF9iYW5kXzVfR0haLmh0X2NhcC5jYXAgJj0gfklFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOworICAgIH0KKworICAgIC8qSW5pdGlhbGl6ZSBiYW5kIGNhcGFiaWxpdHkqLworICAgIHN3aXRjaChwQ2ZnLT5uQmFuZENhcGFiaWxpdHkpCisgICAgeworICAgICAgICBjYXNlIGVDU1JfQkFORF8yNDoKKyAgICAgICAgICAgIHdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZ3bGFuX2hkZF9iYW5kXzJfNF9HSFo7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ1NSX0JBTkRfNUc6CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJndsYW5faGRkX2JhbmRfcDJwXzJfNF9HSFo7CisjZW5kaWYKKyAgICAgICAgICAgIHdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9ICZ3bGFuX2hkZF9iYW5kXzVfR0haOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9CQU5EX0FMTDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZ3bGFuX2hkZF9iYW5kXzJfNF9HSFo7CisgICAgICAgICAgICB3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSAmd2xhbl9oZGRfYmFuZF81X0dIWjsKKyAgICB9CisgICAgLypJbml0aWFsaXNlIHRoZSBzdXBwb3J0ZWQgY2lwaGVyIHN1aXRlIGRldGFpbHMqLworICAgIHdpcGh5LT5jaXBoZXJfc3VpdGVzID0gaGRkX2NpcGhlcl9zdWl0ZXM7CisgICAgd2lwaHktPm5fY2lwaGVyX3N1aXRlcyA9IEFSUkFZX1NJWkUoaGRkX2NpcGhlcl9zdWl0ZXMpOworCisgICAgLypzaWduYWwgc3RyZW5ndGggaW4gbUJtICgxMDAqZEJtKSAqLworICAgIHdpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX01CTTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM4KSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgd2lwaHktPm1heF9yZW1haW5fb25fY2hhbm5lbF9kdXJhdGlvbiA9IDEwMDA7CisjZW5kaWYKKyNlbmRpZgorCisgICAgLyogUmVnaXN0ZXIgb3VyIHdpcGh5IGRldiB3aXRoIGNmZzgwMjExICovCisgICAgaWYgKDAgPiB3aXBoeV9yZWdpc3Rlcih3aXBoeSkpCisgICAgeworICAgICAgICAvKiBwcmludCBlcm9yICovCisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiB3aXBoeSByZWdpc3RlciBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKK30gICAgIAorCisvKiBJbiB0aGlzIGZ1bmN0aW9uIHdlIHdpbGwgZG8gYWxsIHBvc3QgVk9TIHN0YXJ0IGluaXRpYWxpemF0aW9uLgorICAgSW4gdGhpcyBmdW5jdGlvbiB3ZSB3aWxsIHJlZ2lzdGVyIGZvciBhbGwgZnJhbWUgaW4gd2hpY2ggc3VwcGxpY2FudAorICAgaXMgaW50ZXJlc3RlZC4gCisqLwordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9wb3N0X3Zvc3Nfc3RhcnQoaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKyAgICAvKiBSZWdpc3RlciBmb3IgYWxsIFAyUCBhY3Rpb24sIHB1YmxpYyBhY3Rpb24gZXRjIGZyYW1lcyAqLworICAgIHZfVTE2X3QgdHlwZSA9IChTSVJfTUFDX01HTVRfRlJBTUUgPDwgMikgfCAoIFNJUl9NQUNfTUdNVF9BQ1RJT04gPDwgNCk7CisKKyAgIC8qIFJpZ2h0IG5vdyB3ZSBhcmUgcmVnaXN0ZXJpbmcgdGhlc2UgZnJhbWUgd2hlbiBkcml2ZXIgaXMgZ2V0dGluZworICAgICAgaW5pdGlhbGl6ZWQuIE9uY2Ugd2Ugd2lsbCBtb3ZlIHRvIDIuNi4zNyBrZXJuZWwsIGluIHdoaWNoIHdlIGhhdmUKKyAgICAgIGZyYW1lIHJlZ2lzdGVyIG9wcywgd2Ugd2lsbCBtb3ZlIHRoaXMgY29kZSBhcyBhIHBhcnQgb2YgdGhhdCAqLworICAgIC8qIEdBUyBJbml0aWFsIFJlcXVlc3QgKi8KKyAgICBzbWVfUmVnaXN0ZXJNZ210RnJhbWUoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwgdHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVThfdCopR0FTX0lOSVRJQUxfUkVRLCBHQVNfSU5JVElBTF9SRVFfU0laRSApOworCisgICAgLyogR0FTIEluaXRpYWwgUmVzcG9uc2UgKi8KKyAgICBzbWVfUmVnaXN0ZXJNZ210RnJhbWUoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KilHQVNfSU5JVElBTF9SU1AsIEdBU19JTklUSUFMX1JTUF9TSVpFICk7CisgICAgCisgICAgLyogR0FTIENvbWViYWNrIFJlcXVlc3QgKi8KKyAgICBzbWVfUmVnaXN0ZXJNZ210RnJhbWUoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KilHQVNfQ09NRUJBQ0tfUkVRLCBHQVNfQ09NRUJBQ0tfUkVRX1NJWkUgKTsKKworICAgIC8qIEdBUyBDb21lYmFjayBSZXNwb25zZSAqLworICAgIHNtZV9SZWdpc3Rlck1nbXRGcmFtZShoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2X1U4X3QqKUdBU19DT01FQkFDS19SU1AsIEdBU19DT01FQkFDS19SU1BfU0laRSApOworCisgICAgLyogUDJQIFB1YmxpYyBBY3Rpb24gKi8KKyAgICBzbWVfUmVnaXN0ZXJNZ210RnJhbWUoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KilQMlBfUFVCTElDX0FDVElPTl9GUkFNRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUDJQX1BVQkxJQ19BQ1RJT05fRlJBTUVfU0laRSApOworCisgICAgLyogUDJQIEFjdGlvbiAqLworICAgIHNtZV9SZWdpc3Rlck1nbXRGcmFtZShoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2X1U4X3QqKVAyUF9BQ1RJT05fRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUDJQX0FDVElPTl9GUkFNRV9TSVpFICk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1AyUCAqLworfQorCit2b2lkIHdsYW5faGRkX2NmZzgwMjExX3ByZV92b3NzX3N0b3AoaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKyAgICAvKiBSZWdpc3RlciBmb3IgYWxsIFAyUCBhY3Rpb24sIHB1YmxpYyBhY3Rpb24gZXRjIGZyYW1lcyAqLworICAgIHZfVTE2X3QgdHlwZSA9IChTSVJfTUFDX01HTVRfRlJBTUUgPDwgMikgfCAoIFNJUl9NQUNfTUdNVF9BQ1RJT04gPDwgNCk7CisKKyAgIC8qIFJpZ2h0IG5vdyB3ZSBhcmUgcmVnaXN0ZXJpbmcgdGhlc2UgZnJhbWUgd2hlbiBkcml2ZXIgaXMgZ2V0dGluZworICAgICAgaW5pdGlhbGl6ZWQuIE9uY2Ugd2Ugd2lsbCBtb3ZlIHRvIDIuNi4zNyBrZXJuZWwsIGluIHdoaWNoIHdlIGhhdmUKKyAgICAgIGZyYW1lIHJlZ2lzdGVyIG9wcywgd2Ugd2lsbCBtb3ZlIHRoaXMgY29kZSBhcyBhIHBhcnQgb2YgdGhhdCAqLworICAgIC8qIEdBUyBJbml0aWFsIFJlcXVlc3QgKi8KKworICAgIHNtZV9EZXJlZ2lzdGVyTWdtdEZyYW1lKGhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1U4X3QqKUdBU19JTklUSUFMX1JFUSwgR0FTX0lOSVRJQUxfUkVRX1NJWkUgKTsKKworICAgIC8qIEdBUyBJbml0aWFsIFJlc3BvbnNlICovCisgICAgc21lX0RlcmVnaXN0ZXJNZ210RnJhbWUoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KilHQVNfSU5JVElBTF9SU1AsIEdBU19JTklUSUFMX1JTUF9TSVpFICk7CisgICAgCisgICAgLyogR0FTIENvbWViYWNrIFJlcXVlc3QgKi8KKyAgICBzbWVfRGVyZWdpc3Rlck1nbXRGcmFtZShoSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2X1U4X3QqKUdBU19DT01FQkFDS19SRVEsIEdBU19DT01FQkFDS19SRVFfU0laRSApOworCisgICAgLyogR0FTIENvbWViYWNrIFJlc3BvbnNlICovCisgICAgc21lX0RlcmVnaXN0ZXJNZ210RnJhbWUoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KilHQVNfQ09NRUJBQ0tfUlNQLCBHQVNfQ09NRUJBQ0tfUlNQX1NJWkUgKTsKKworICAgIC8qIFAyUCBQdWJsaWMgQWN0aW9uICovCisgICAgc21lX0RlcmVnaXN0ZXJNZ210RnJhbWUoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KilQMlBfUFVCTElDX0FDVElPTl9GUkFNRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUDJQX1BVQkxJQ19BQ1RJT05fRlJBTUVfU0laRSApOworCisgICAgLyogUDJQIEFjdGlvbiAqLworICAgIHNtZV9EZXJlZ2lzdGVyTWdtdEZyYW1lKGhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVThfdCopUDJQX0FDVElPTl9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQMlBfQUNUSU9OX0ZSQU1FX1NJWkUgKTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUDJQICovCit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQordm9pZCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfa2V5X3dhcGkoaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsIHU4IGtleV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqbWFjX2FkZHIsIHU4ICprZXkgLCBpbnQga2V5X0xlbikKK3sKKyAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworICAgIHRDc3JSb2FtU2V0S2V5ICBzZXRLZXk7CisgICAgdl9CT09MX3QgaXNDb25uZWN0ZWQgPSBUUlVFOworICAgIGludCBzdGF0dXMgPSAwOworICAgIHZfVTMyX3Qgcm9hbUlkPSAweEZGOworICAgIHRBTklfVTggKnBLZXlQdHIgPSBOVUxMOworICAgIGludCBuID0gMDsKKworICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBkZXZpY2VfbW9kZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKyAgICBzZXRLZXkua2V5SWQgPSBrZXlfaW5kZXg7IC8vIFN0b3JlIEtleSBJRAorICAgIHNldEtleS5lbmNUeXBlICA9IGVDU1JfRU5DUllQVF9UWVBFX1dQSTsgLy8gU0VUIFdBUEkgRW5jcnlwdGlvbgorICAgIHNldEtleS5rZXlEaXJlY3Rpb24gPSBlU0lSX1RYX1JYOyAgLy8gS2V5IERpcmVjdGlvbm4gYm90aCBUWCBhbmQgUlgKKyAgICBzZXRLZXkucGFlUm9sZSA9IDAgOyAvLyB0aGUgUEFFIHJvbGUKKyAgICBpZiAoIW1hY19hZGRyIHx8IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hY19hZGRyKSkKKyAgICB7CisgICAgICAgIHZvc19zZXRfbWFjYWRkcl9icm9hZGNhc3QoICh2X01BQ0FERFJfdCAqKXNldEtleS5wZWVyTWFjICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlzQ29ubmVjdGVkID0gaGRkX2Nvbm5Jc0Nvbm5lY3RlZChwSGRkU3RhQ3R4KTsKKyAgICAgICAgdm9zX21lbV9jb3B5KHNldEtleS5wZWVyTWFjLCZwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQsV05JX0NGR19CU1NJRF9MRU4pOworICAgIH0KKyAgICBzZXRLZXkua2V5TGVuZ3RoID0ga2V5X0xlbjsKKyAgICBwS2V5UHRyID0gc2V0S2V5LktleTsKKyAgICBtZW1jcHkoIHBLZXlQdHIsIGtleSwga2V5X0xlbik7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sIlxuJXM6IFdBUEkgS0VZIExFTkdUSDoweCUwNHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywga2V5X0xlbik7CisgICAgZm9yIChuID0gMCA7IG4gPCBrZXlfTGVuOyBuKyspCisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIFdBUEkgS0VZIERhdGFbJWRdOiUwMnggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyxuLHNldEtleS5LZXlbbl0pOworCisgICAgcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1pbmdTdGF0ZSA9IEhERF9ST0FNX1NUQVRFX1NFVFRJTkdfS0VZOworICAgIGlmICggaXNDb25uZWN0ZWQgKQorICAgIHsKKyAgICAgICAgc3RhdHVzPSBzbWVfUm9hbVNldEtleSggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCAmc2V0S2V5LCAmcm9hbUlkICk7CisgICAgfQorICAgIGlmICggc3RhdHVzICE9IDAgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIlslNGRdIHNtZV9Sb2FtU2V0S2V5IHJldHVybmVkIEVSUk9SIHN0YXR1cz0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHN0YXR1cyApOworICAgICAgICBwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfTk9ORTsKKyAgICB9Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkqLworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNCwwKSkKK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9hbGxvY19uZXdfYmVhY29uKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvbl9kYXRhX3QgKipwcEJlYWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZWFjb25fcGFyYW1ldGVycyAqcGFyYW1zKQoreyAgICAKKyAgICBpbnQgc2l6ZTsKKyAgICBiZWFjb25fZGF0YV90ICpiZWFjb24gPSBOVUxMOworICAgIGJlYWNvbl9kYXRhX3QgKm9sZCA9IE5VTEw7CisgICAgaW50IGhlYWRfbGVuLHRhaWxfbGVuOworCisgICAgaWYgKHBhcmFtcy0+aGVhZCAmJiAhcGFyYW1zLT5oZWFkX2xlbikKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBvbGQgPSBwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5iZWFjb247CisKKyAgICBpZiAoIXBhcmFtcy0+aGVhZCAmJiAhb2xkKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChwYXJhbXMtPnRhaWwgJiYgIXBhcmFtcy0+dGFpbF9sZW4pCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorICAgIC8qIEtlcm5lbCAzLjAgaXMgbm90IHVwZGF0aW5nIGR0aW1fcGVyaW9kIGZvciBzZXQgYmVhY29uICovCisgICAgaWYgKCFwYXJhbXMtPmR0aW1fcGVyaW9kKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorCisgICAgaWYocGFyYW1zLT5oZWFkKQorICAgICAgICBoZWFkX2xlbiA9IHBhcmFtcy0+aGVhZF9sZW47CisgICAgZWxzZQorICAgICAgICBoZWFkX2xlbiA9IG9sZC0+aGVhZF9sZW47CisKKyAgICBpZihwYXJhbXMtPnRhaWwgfHwgIW9sZCkKKyAgICAgICAgdGFpbF9sZW4gPSBwYXJhbXMtPnRhaWxfbGVuOworICAgIGVsc2UKKyAgICAgICAgdGFpbF9sZW4gPSBvbGQtPnRhaWxfbGVuOworCisgICAgc2l6ZSA9IHNpemVvZihiZWFjb25fZGF0YV90KSArIGhlYWRfbGVuICsgdGFpbF9sZW47CisKKyAgICBiZWFjb24gPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCisgICAgaWYoIGJlYWNvbiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisKKyAgICBpZihwYXJhbXMtPmR0aW1fcGVyaW9kIHx8ICFvbGQgKQorICAgICAgICBiZWFjb24tPmR0aW1fcGVyaW9kID0gcGFyYW1zLT5kdGltX3BlcmlvZDsKKyAgICBlbHNlCisgICAgICAgIGJlYWNvbi0+ZHRpbV9wZXJpb2QgPSBvbGQtPmR0aW1fcGVyaW9kOworIAorICAgIGJlYWNvbi0+aGVhZCA9ICgodTggKikgYmVhY29uKSArIHNpemVvZihiZWFjb25fZGF0YV90KTsKKyAgICBiZWFjb24tPnRhaWwgPSBiZWFjb24tPmhlYWQgKyBoZWFkX2xlbjsKKyAgICBiZWFjb24tPmhlYWRfbGVuID0gaGVhZF9sZW47CisgICAgYmVhY29uLT50YWlsX2xlbiA9IHRhaWxfbGVuOworCisgICAgaWYocGFyYW1zLT5oZWFkKSB7CisgICAgICAgIG1lbWNweSAoYmVhY29uLT5oZWFkLHBhcmFtcy0+aGVhZCxiZWFjb24tPmhlYWRfbGVuKTsKKyAgICB9CisgICAgZWxzZSB7IAorICAgICAgICBpZihvbGQpCisgICAgICAgICAgICBtZW1jcHkgKGJlYWNvbi0+aGVhZCxvbGQtPmhlYWQsYmVhY29uLT5oZWFkX2xlbik7CisgICAgfQorICAgIAorICAgIGlmKHBhcmFtcy0+dGFpbCkgeworICAgICAgICBtZW1jcHkgKGJlYWNvbi0+dGFpbCxwYXJhbXMtPnRhaWwsYmVhY29uLT50YWlsX2xlbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgIGlmKG9sZCkgICAKKyAgICAgICAgICAgbWVtY3B5IChiZWFjb24tPnRhaWwsb2xkLT50YWlsLGJlYWNvbi0+dGFpbF9sZW4pOworICAgIH0KKworICAgICpwcEJlYWNvbiA9IGJlYWNvbjsKKworICAgIGtmcmVlKG9sZCk7CisKKyAgICByZXR1cm4gMDsKKworfQorI2VuZGlmIC8vTElOVVhfVkVSU0lPTl9DT0RFCisKK3ZfVThfdCogd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2llX3B0cih2X1U4X3QgKnBJZXMsIGludCBsZW5ndGgsIHZfVThfdCBlaWQpCit7CisgICAgaW50IGxlZnQgPSBsZW5ndGg7CisgICAgdl9VOF90ICpwdHIgPSBwSWVzOworICAgIHZfVThfdCBlbGVtX2lkLGVsZW1fbGVuOworICAgCisgICAgd2hpbGUobGVmdCA+PSAyKQorICAgIHsgICAKKyAgICAgICAgZWxlbV9pZCAgPSAgcHRyWzBdOworICAgICAgICBlbGVtX2xlbiA9ICBwdHJbMV07CisgICAgICAgIGxlZnQgLT0gMjsKKyAgICAgICAgaWYoZWxlbV9sZW4gPiBsZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAiKioqKkludmFsaWQgSUVzIGVpZCA9ICVkIGVsZW1fbGVuPSVkIGxlZnQ9JWQqKioqKlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWQsZWxlbV9sZW4sbGVmdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbV9pZCA9PSBlaWQpIAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICB9CisgICAKKyAgICAgICAgbGVmdCAtPSBlbGVtX2xlbjsKKyAgICAgICAgcHRyICs9IChlbGVtX2xlbiArIDIpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDQsMCkpCisvKiBDaGVjayBpZiByYXRlIGlzIDExZyByYXRlIG9yIG5vdCAqLworc3RhdGljIGludCB3bGFuX2hkZF9yYXRlX2lzXzExZyh1OCByYXRlKQoreworICAgIHU4IGdSYXRlQXJyYXlbOF0gPSB7MTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwNH07IC8qIGFjdHVhbCByYXRlICogMiAqLworICAgIHU4IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICB7CisgICAgICAgIGlmKHJhdGUgPT0gZ1JhdGVBcnJheVtpXSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIENoZWNrIGZvciAxMWcgcmF0ZSBhbmQgc2V0IHByb3BlciAxMWcgb25seSBtb2RlICovCitzdGF0aWMgdm9pZCB3bGFuX2hkZF9jaGVja18xMWdtb2RlKHU4ICpwSWUsIHU4KiByZXF1aXJlX2h0LAorICAgICAgICAgICAgICAgICAgICAgdTgqIHBDaGVja1JhdGVzZm9yMTFnLCBlU2FwUGh5TW9kZSogcFNhcEh3X21vZGUpCit7CisgICAgdTggaSwgbnVtX3JhdGVzID0gcEllWzBdOworCisgICAgcEllICs9IDE7CisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcmF0ZXM7IGkrKykKKyAgICB7CisgICAgICAgIGlmKCAqcENoZWNrUmF0ZXNmb3IxMWcgJiYgKFRSVUUgPT0gd2xhbl9oZGRfcmF0ZV9pc18xMWcocEllW2ldICYgUkFURV9NQVNLKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHJhdGUgc2V0IGhhdmUgMTFnIHJhdGUgdGhhbiBjaGFuZ2UgdGhlIG1vZGUgdG8gMTFHICovCisgICAgICAgICAgICAqcFNhcEh3X21vZGUgPSBlU0FQX0RPVDExX01PREVfMTFnOworICAgICAgICAgICAgaWYgKHBJZVtpXSAmIEJBU0lDX1JBVEVfTUFTSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIDExZyByYXRlIGFzICBiYXNpYyByYXRlLCBpdCBtZWFucyBtb2RlCisgICAgICAgICAgICAgICAgICAgaXMgMTFnIG9ubHkgbW9kZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICpwU2FwSHdfbW9kZSA9IGVTQVBfRE9UMTFfTU9ERV8xMWdfT05MWTsKKyAgICAgICAgICAgICAgICpwQ2hlY2tSYXRlc2ZvcjExZyA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKEJBU0lDX1JBVEVfTUFTSyB8IFdMQU5fQlNTX01FTUJFUlNISVBfU0VMRUNUT1JfSFRfUEhZKSA9PSBwSWVbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpyZXF1aXJlX2h0ID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdsYW5faGRkX3NldF9zYXBId21vZGUoaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyKQoreworICAgIHRzYXBfQ29uZmlnX3QgKnBDb25maWcgPSAmcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnNhcENvbmZpZzsKKyAgICBiZWFjb25fZGF0YV90ICpwQmVhY29uID0gcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbjsKKyAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKnBNZ210X2ZyYW1lID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCopcEJlYWNvbi0+aGVhZDsKKyAgICB1OCBjaGVja1JhdGVzZm9yMTFnID0gVFJVRTsKKyAgICB1OCByZXF1aXJlX2h0ID0gRkFMU0U7CisgICAgdTggKnBJZT1OVUxMOworCisgICAgcENvbmZpZy0+U2FwSHdfbW9kZT0gZVNBUF9ET1QxMV9NT0RFXzExYjsKKworICAgIHBJZSA9IHdsYW5faGRkX2NmZzgwMjExX2dldF9pZV9wdHIoJnBNZ210X2ZyYW1lLT51LmJlYWNvbi52YXJpYWJsZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCZWFjb24tPmhlYWRfbGVuLCBXTEFOX0VJRF9TVVBQX1JBVEVTKTsKKyAgICBpZiAocEllICE9IE5VTEwpCisgICAgeworICAgICAgICBwSWUgKz0gMTsKKyAgICAgICAgd2xhbl9oZGRfY2hlY2tfMTFnbW9kZShwSWUsICZyZXF1aXJlX2h0LCAmY2hlY2tSYXRlc2ZvcjExZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+U2FwSHdfbW9kZSk7CisgICAgfQorCisgICAgcEllID0gd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2llX3B0cihwQmVhY29uLT50YWlsLCBwQmVhY29uLT50YWlsX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9FSURfRVhUX1NVUFBfUkFURVMpOworICAgIGlmIChwSWUgIT0gTlVMTCkKKyAgICB7CisKKyAgICAgICAgcEllICs9IDE7CisgICAgICAgIHdsYW5faGRkX2NoZWNrXzExZ21vZGUocEllLCAmcmVxdWlyZV9odCwgJmNoZWNrUmF0ZXNmb3IxMWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb25maWctPlNhcEh3X21vZGUpOworICAgIH0KKworICAgIGlmKCBwQ29uZmlnLT5jaGFubmVsID4gMTQgKQorICAgIHsKKyAgICAgICAgcENvbmZpZy0+U2FwSHdfbW9kZT0gZVNBUF9ET1QxMV9NT0RFXzExYTsKKyAgICB9CisKKyAgICBwSWUgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWVfcHRyKHBCZWFjb24tPnRhaWwsIHBCZWFjb24tPnRhaWxfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9FSURfSFRfQ0FQQUJJTElUWSk7CisKKyAgICBpZihwSWUpIAorICAgIHsKKyAgICAgICAgcENvbmZpZy0+U2FwSHdfbW9kZT0gZVNBUF9ET1QxMV9NT0RFXzExbjsKKyAgICAgICAgaWYocmVxdWlyZV9odCkKKyAgICAgICAgICAgIHBDb25maWctPlNhcEh3X21vZGU9IGVTQVBfRE9UMTFfTU9ERV8xMW5fT05MWTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2FwaWVzKGhkZF9hZGFwdGVyX3QqIHBIb3N0YXBkQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmVhY29uX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKyAgICB2X1U4X3QgKmdlbmllOworICAgIHZfVThfdCB0b3RhbF9pZWxlbiA9IDAsIGllbGVuID0gMDsKKyAgICB2X1U4X3QgKnBJZSA9IE5VTEw7CisgICAgdl9VOF90IGFkZElFWzFdID0gezB9OworICAgIGJlYWNvbl9kYXRhX3QgKnBCZWFjb24gPSBwSG9zdGFwZEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uOworCisgICAgZ2VuaWUgPSB2b3NfbWVtX21hbGxvYyhNQVhfR0VOSUVfTEVOKTsKKworICAgIGlmKGdlbmllID09IE5VTEwpIHsKKworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICBwSWUgPSB3bGFuX2hkZF9nZXRfd3BzX2llX3B0cihwQmVhY29uLT50YWlsLCBwQmVhY29uLT50YWlsX2xlbik7CisKKyAgICBpZihwSWUpCisgICAgeworICAgICAgICAvKkNvcHkgdGhlIHdwcyBJRSovCisgICAgICAgIGllbGVuID0gcEllWzFdICsgMjsKKyAgICAgICAgaWYoIGllbGVuIDw9TUFYX0dFTklFX0xFTikKKyAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV9jb3B5KGdlbmllLCBwSWUsIGllbGVuKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIioqV3BzIEllIExlbmd0aCBpcyB0b28gYmlnKioqXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIHRvdGFsX2llbGVuID0gaWVsZW47CisgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1dGRAorICAgIHBJZSA9IHdsYW5faGRkX2dldF93ZmRfaWVfcHRyKHBCZWFjb24tPnRhaWwscEJlYWNvbi0+dGFpbF9sZW4pOworCisgICAgaWYocEllKSAKKyAgICB7IAorICAgICAgICBpZWxlbiA9IHBJZVsxXSArIDI7CisgICAgICAgIGlmKHRvdGFsX2llbGVuICsgaWVsZW4gPD0gTUFYX0dFTklFX0xFTikgeworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCZnZW5pZVt0b3RhbF9pZWxlbl0scEllLChwSWVbMV0gKyAyKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgIGhkZExvZyggVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiKipXcHMgSWUgKyBQMnAgSWUgKyBXZmQgSWUgTGVuZ3RoIGlzIHRvbyBiaWcqKipcbiIpOworICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICB0b3RhbF9pZWxlbiArPSBpZWxlbjsgCisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgcEllID0gd2xhbl9oZGRfZ2V0X3AycF9pZV9wdHIocEJlYWNvbi0+dGFpbCxwQmVhY29uLT50YWlsX2xlbik7CisKKyAgICBpZihwSWUpCisgICAgeworICAgICAgICBpZWxlbiA9IHBJZVsxXSArIDI7CisgICAgICAgIGlmKHRvdGFsX2llbGVuICsgaWVsZW4gPD0gTUFYX0dFTklFX0xFTikKKyAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCZnZW5pZVt0b3RhbF9pZWxlbl0sIHBJZSwgKHBJZVsxXSArIDIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyggVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgIioqV3BzIEllKyBQMnBJRSBMZW5ndGggaXMgdG9vIGJpZyoqKlxuIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICB0b3RhbF9pZWxlbiArPSBpZWxlbjsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChjY21DZmdTZXRTdHIoKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPmhIYWwsCisgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBLCBnZW5pZSwgdG90YWxfaWVsZW4sIE5VTEwsCisgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgIHsKKyAgICAgICAgaGRkTG9nKExPR0UsCisgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBIHRvIENDTSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoY2NtQ2ZnU2V0SW50KChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5oSGFsLAorICAgICAgICAgIFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBRywgMSxOVUxMLAorICAgICAgICAgIHRlc3RfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnBIb3N0YXBkQWRhcHRlci0+ZXZlbnRfZmxhZ3MpID8KKyAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fVFJVRSA6IGVBTklfQk9PTEVBTl9GQUxTRSkKKyAgICAgICAgICA9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgeworICAgICAgICBoZGRMb2coTE9HRSwKKyAgICAgICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0ZMQUcgdG8gQ0NNIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIEFkZGVkIGZvciBQcm9SZXNwIElFCisgICAgaWYgKCAocGFyYW1zLT5wcm9iZXJlc3BfaWVzICE9IE5VTEwpICYmIChwYXJhbXMtPnByb2JlcmVzcF9pZXNfbGVuICE9IDApICkKKyAgICB7CisgICAgICAgIHUxNiByZW1fcHJvYmVfcmVzcF9pZV9sZW4gPSBwYXJhbXMtPnByb2JlcmVzcF9pZXNfbGVuOworICAgICAgICB1OCBwcm9iZV9yc3BfaWVfbGVuWzNdID0gezB9OworICAgICAgICB1OCBjb3VudGVyID0gMDsKKyAgICAgICAgLyogQ2hlY2sgUHJvYmUgUmVzcCBMZW5ndGggaWYgaXQgaXMgZ3JlYXRlciB0aGVuIDI1NSB0aGVuIFN0b3JlCisgICAgICAgICAgIFByb2JlIFJlc3AgSUVzIGludG8gV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExICYKKyAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEyIENGRyBWYXJpYWJsZSBBcyBXZSBhcmUgbm90IGFibGUKKyAgICAgICAgICAgU3RvcmUgTW9yZSB0aGVuIDI1NSBieXRlcyBpbnRvIE9uZSBWYXJpYWJsZS4KKyAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKChyZW1fcHJvYmVfcmVzcF9pZV9sZW4gPiAwKSAmJiAoY291bnRlciA8IDMpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVtX3Byb2JlX3Jlc3BfaWVfbGVuID4gTUFYX0NGR19TVFJJTkdfTEVOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb2JlX3JzcF9pZV9sZW5bY291bnRlcisrXSA9IE1BWF9DRkdfU1RSSU5HX0xFTjsKKyAgICAgICAgICAgICAgICByZW1fcHJvYmVfcmVzcF9pZV9sZW4gLT0gTUFYX0NGR19TVFJJTkdfTEVOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb2JlX3JzcF9pZV9sZW5bY291bnRlcisrXSA9IHJlbV9wcm9iZV9yZXNwX2llX2xlbjsKKyAgICAgICAgICAgICAgICByZW1fcHJvYmVfcmVzcF9pZV9sZW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVtX3Byb2JlX3Jlc3BfaWVfbGVuID0gMDsKKworICAgICAgICBpZiAocHJvYmVfcnNwX2llX2xlblswXSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjY21DZmdTZXRTdHIoKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPmhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KikmcGFyYW1zLT5wcm9iZXJlc3BfaWVzW3JlbV9wcm9iZV9yZXNwX2llX2xlbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwX2llX2xlblswXSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UpID09IGVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGhkZExvZyhMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExIHRvIENDTSIpOworICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbV9wcm9iZV9yZXNwX2llX2xlbiArPSBwcm9iZV9yc3BfaWVfbGVuWzBdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2JlX3JzcF9pZV9sZW5bMV0gPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2NtQ2ZnU2V0U3RyKChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5oSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCopJnBhcmFtcy0+cHJvYmVyZXNwX2llc1tyZW1fcHJvYmVfcmVzcF9pZV9sZW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcF9pZV9sZW5bMV0sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUFOSV9CT09MRUFOX0ZBTFNFKSA9PSBlSEFMX1NUQVRVU19GQUlMVVJFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMiB0byBDQ00iKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZW1fcHJvYmVfcmVzcF9pZV9sZW4gKz0gcHJvYmVfcnNwX2llX2xlblsxXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9iZV9yc3BfaWVfbGVuWzJdID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNjbUNmZ1NldFN0cigoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+aEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTgqKSZwYXJhbXMtPnByb2JlcmVzcF9pZXNbcmVtX3Byb2JlX3Jlc3BfaWVfbGVuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3BfaWVfbGVuWzJdLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVBTklfQk9PTEVBTl9GQUxTRSkgPT0gZUhBTF9TVEFUVVNfRkFJTFVSRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTMgdG8gQ0NNIik7CisgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtX3Byb2JlX3Jlc3BfaWVfbGVuICs9IHByb2JlX3JzcF9pZV9sZW5bMl07CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvYmVfcnNwX2llX2xlblsxXSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBlSEFMX1NUQVRVU19GQUlMVVJFID09IGNjbUNmZ1NldFN0cigoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+aEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTIsICh0QU5JX1U4KilhZGRJRSwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwKKyAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEyIHRvIENDTVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvYmVfcnNwX2llX2xlblsyXSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBlSEFMX1NUQVRVU19GQUlMVVJFID09IGNjbUNmZ1NldFN0cigoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+aEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTMsICh0QU5JX1U4KilhZGRJRSwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwKKyAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEzIHRvIENDTVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2NtQ2ZnU2V0SW50KChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5oSGFsLAorICAgICAgICAgICAgIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHLCAxLE5VTEwsCisgICAgICAgICAgICAgdGVzdF9iaXQoU09GVEFQX0JTU19TVEFSVEVELCAmcEhvc3RhcGRBZGFwdGVyLT5ldmVudF9mbGFncykgPworICAgICAgICAgICAgICAgICAgICAgIGVBTklfQk9PTEVBTl9UUlVFIDogZUFOSV9CT09MRUFOX0ZBTFNFKQorICAgICAgICAgICAgID09IGVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgaGRkTG9nKExPR0UsCisgICAgICAgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHIHRvIENDTSIpOworICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBSZXNldCBXTklfQ0ZHX1BST0JFX1JTUCBGbGFncworICAgICAgICB3bGFuX2hkZF9yZXNldF9wcm9iX3JzcGllcyhwSG9zdGFwZEFkYXB0ZXIpOworCisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICIlczogTm8gUHJvYmUgUmVzcG9uc2UgSUUgcmVjZWl2ZWQgaW4gc2V0IGJlYWNvbiIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgfQorCisgICAgLy8gQWRkZWQgZm9yIEFzc29jUmVzcCBJRQorICAgIGlmICggKHBhcmFtcy0+YXNzb2NyZXNwX2llcyAhPSBOVUxMKSAmJiAocGFyYW1zLT5hc3NvY3Jlc3BfaWVzX2xlbiAhPSAwKSApCisgICAgeworICAgICAgIGlmIChjY21DZmdTZXRTdHIoKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPmhIYWwsCisgICAgICAgICAgICAgICBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfREFUQSwgKHRBTklfVTgqKXBhcmFtcy0+YXNzb2NyZXNwX2llcywKKyAgICAgICAgICAgICAgIHBhcmFtcy0+YXNzb2NyZXNwX2llc19sZW4sIE5VTEwsCisgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UpID09IGVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKExPR0UsCisgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19BU1NPQ19SU1BfQURETklFX0RBVEEgdG8gQ0NNIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICB9CisKKyAgICAgICBpZiAoY2NtQ2ZnU2V0SW50KChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5oSGFsLAorICAgICAgICAgIFdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9GTEFHLCAxLCBOVUxMLAorICAgICAgICAgIHRlc3RfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnBIb3N0YXBkQWRhcHRlci0+ZXZlbnRfZmxhZ3MpID8KKyAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fVFJVRSA6IGVBTklfQk9PTEVBTl9GQUxTRSkKKyAgICAgICAgICA9PSBlSEFMX1NUQVRVU19GQUlMVVJFKQorICAgICAgIHsKKyAgICAgICAgICBoZGRMb2coTE9HRSwKKyAgICAgICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBRyB0byBDQ00iKTsKKyAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICIlczogTm8gQXNzb2MgUmVzcG9uc2UgSUUgcmVjZWl2ZWQgaW4gc2V0IGJlYWNvbiIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisKKyAgICAgICAgaWYgKCBlSEFMX1NUQVRVU19GQUlMVVJFID09IGNjbUNmZ1NldEludCgoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+aEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBRywgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UpICkKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKExPR0UsCisgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19BU1NPQ19SU1BfQURETklFX0ZMQUcgdG8gQ0NNXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvc19tZW1fZnJlZShnZW5pZSk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9MSU5VWF9WRVJTSU9OX0NPREUKKworLyogCisgKiBGVU5DVElPTjogd2xhbl9oZGRfdmFsaWRhdGVfb3BlcmF0aW9uX2NoYW5uZWwKKyAqIGNhbGxlZCBieSB3bGFuX2hkZF9jZmc4MDIxMV9zdGFydF9ic3MoKSBhbmQKKyAqIHdsYW5faGRkX2NmZzgwMjExX3NldF9jaGFubmVsKCkKKyAqIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHdoZXRoZXIgZ2l2ZW4gY2hhbm5lbCBpcyBwYXJ0IG9mIHZhbGlkCisgKiBjaGFubmVsIGxpc3QuIAorICovIAorc3RhdGljIFZPU19TVEFUVVMgd2xhbl9oZGRfdmFsaWRhdGVfb3BlcmF0aW9uX2NoYW5uZWwoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsaW50IGNoYW5uZWwpCit7CisgICAgICAgIAorICAgIHZfVTMyX3QgbnVtX2NoID0gMDsKKyAgICB1OCB2YWxpZF9jaFtXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworICAgIHUzMiBpbmR4ID0gMDsKKyAgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisgICAgIAorICAgIG51bV9jaCA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKworICAgIGlmICgwICE9IGNjbUNmZ0dldFN0cihoSGFsLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCwKKyAgICAgICAgICAgIHZhbGlkX2NoLCAmbnVtX2NoKSkKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBmYWlsZWQgdG8gZ2V0IHZhbGlkIGNoYW5uZWwgbGlzdFxuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgZm9yIChpbmR4ID0gMDsgaW5keCA8IG51bV9jaDsgaW5keCsrKQorICAgIHsKKyAgICAgICAgaWYgKGNoYW5uZWwgPT0gdmFsaWRfY2hbaW5keF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluZHggPj0gbnVtX2NoKQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgQ2hhbm5lbCBbJWRdIFxuIiwgX19mdW5jX18sIGNoYW5uZWwpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAKK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDQsMCkpCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX3N0YXJ0X2JzcyhoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJlYWNvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisgICAgdHNhcF9Db25maWdfdCAqcENvbmZpZzsKKyAgICBiZWFjb25fZGF0YV90ICpwQmVhY29uID0gTlVMTDsKKyAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKnBNZ210X2ZyYW1lOworICAgIHZfVThfdCAqcEllPU5VTEw7CisgICAgdl9VMTZfdCBjYXBhYl9pbmZvOworICAgIGVDc3JBdXRoVHlwZSBSU05BdXRoVHlwZTsKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgUlNORW5jcnlwdFR5cGU7CisgICAgZUNzckVuY3J5cHRpb25UeXBlIG1jUlNORW5jcnlwdFR5cGU7CisgICAgaW50IHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cFdMQU5fU0FQRXZlbnRDQiBwU2FwRXZlbnRDYWxsYmFjazsKKyAgICBoZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlOworICAgIHZfVThfdCB3cGFSc25JRWRhdGFbKFNJUl9NQUNfTUFYX0lFX0xFTkdUSCAqIDIpKzRdOyAgLy9NYXggaWUgbGVuZ3RoIDI1NSAqIDIoV1BBK1JTTikgKyAyIGJ5dGVzICh2ZW5kb3Igc3BlY2lmaWMgSUQpICogMgorICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPnB2b3NDb250ZXh0OworICAgIHN0cnVjdCBxY19tYWNfYWNsX2VudHJ5ICphY2xfZW50cnkgPSBOVUxMOworICAgIHZfU0lOVF90IGk7CisKKyAgICBFTlRFUigpOworCisgICAgcEhvc3RhcGRTdGF0ZSA9IFdMQU5fSEREX0dFVF9IT1NUQVBfU1RBVEVfUFRSKHBIb3N0YXBkQWRhcHRlcik7CisKKyAgICBwQ29uZmlnID0gJnBIb3N0YXBkQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5zYXBDb25maWc7CisKKyAgICBwQmVhY29uID0gcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbjsKKworICAgIHBNZ210X2ZyYW1lID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCopcEJlYWNvbi0+aGVhZDsKKworICAgIHBDb25maWctPmJlYWNvbl9pbnQgPSAgcE1nbXRfZnJhbWUtPnUuYmVhY29uLmJlYWNvbl9pbnQ7CisKKyAgICAvL2NoYW5uZWwgaXMgYWxyZWFkeSBzZXQgaW4gdGhlIHNldF9jaGFubmVsIENhbGwgYmFjaworICAgIC8vcENvbmZpZy0+Y2hhbm5lbCA9IHBDb21taXRDb25maWctPmNoYW5uZWw7CisKKyAgICAvKlByb3RlY3Rpb24gcGFyYW1ldGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlKi8KKyAgICBwQ29uZmlnLT5wcm90RW5hYmxlZCA9IAorICAgICAgICAgICAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+Y2ZnX2luaS0+YXBQcm90RW5hYmxlZDsKKworICAgIHBDb25maWctPmR0aW1fcGVyaW9kID0gcEJlYWNvbi0+ZHRpbV9wZXJpb2Q7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwiKioqKnBDb25maWctPmR0aW1fcGVyaW9kPSVkKioqXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5kdGltX3BlcmlvZCk7CisKKworICAgIHBJZSA9IHdsYW5faGRkX2NmZzgwMjExX2dldF9pZV9wdHIocEJlYWNvbi0+dGFpbCwgcEJlYWNvbi0+dGFpbF9sZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9FSURfQ09VTlRSWSk7CisgICAgaWYocEllKQorICAgIHsgCisgICAgICAgIHRBTklfQk9PTEVBTiByZXN0YXJ0TmVlZGVkOworICAgICAgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCisgICAgICAgIHBDb25maWctPmllZWU4MDIxMWQgPSAxOworICAgICAgICB2b3NfbWVtX2NvcHkocENvbmZpZy0+Y291bnRyeUNvZGUsICZwSWVbMl0sIDMpOworICAgICAgICBzbWVfc2V0UmVnSW5mbyhoSGFsLCBwQ29uZmlnLT5jb3VudHJ5Q29kZSk7CisgICAgICAgIHNtZV9SZXNldENvdW50cnlDb2RlSW5mb3JtYXRpb24oaEhhbCwgJnJlc3RhcnROZWVkZWQpOworICAgICAgICAvKgorICAgICAgICAgKiBJZiBhdXRvIGNoYW5uZWwgaXMgY29uZmlndXJlZCBpLmUuIGNoYW5uZWwgaXMgMCwKKyAgICAgICAgICogc28gc2tpcCBjaGFubmVsIHZhbGlkYXRpb24uCisgICAgICAgICovCisgICAgICAgIGlmKCBBVVRPX0NIQU5ORUxfU0VMRUNUICE9IHBDb25maWctPmNoYW5uZWwgKQorICAgICAgICB7CisgICAgICAgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gd2xhbl9oZGRfdmFsaWRhdGVfb3BlcmF0aW9uX2NoYW5uZWwocEhvc3RhcGRBZGFwdGVyLHBDb25maWctPmNoYW5uZWwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIENoYW5uZWwgWyVkXSBcbiIsIF9fZnVuY19fLCBwQ29uZmlnLT5jaGFubmVsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgcENvbmZpZy0+aWVlZTgwMjExZCA9IDA7CisgICAgfQorICAgIHBDb25maWctPmF1dGhUeXBlID0gZVNBUF9BVVRPX1NXSVRDSDsKKworICAgIGNhcGFiX2luZm8gPSBwTWdtdF9mcmFtZS0+dS5iZWFjb24uY2FwYWJfaW5mbzsKKyAgICAKKyAgICBwQ29uZmlnLT5wcml2YWN5ID0gKHBNZ210X2ZyYW1lLT51LmJlYWNvbi5jYXBhYl9pbmZvICYgCisgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgPyBWT1NfVFJVRSA6IFZPU19GQUxTRTsKKworICAgIChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpKS0+dVByaXZhY3kgPSBwQ29uZmlnLT5wcml2YWN5OworCisgICAgLypTZXQgd3BzIHN0YXRpb24gdG8gY29uZmlndXJlZCovCisgICAgcEllID0gd2xhbl9oZGRfZ2V0X3dwc19pZV9wdHIocEJlYWNvbi0+dGFpbCwgcEJlYWNvbi0+dGFpbF9sZW4pOworCisgICAgaWYocEllKQorICAgIHsKKyAgICAgICAgaWYocEllWzFdIDwgKDIgKyBXUFNfT1VJX1RZUEVfU0laRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyggVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiKipXcHMgSWUgTGVuZ3RoIGlzIHRvbyBzbWFsbCoqKlxuIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKG1lbWNtcCgmcEllWzJdLCBXUFNfT1VJX1RZUEUsIFdQU19PVUlfVFlQRV9TSVpFKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAgaGRkTG9nKCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIqKiBXUFMgSUUobGVuICVkKSAqKipcbiIsIChwSWVbMV0rMikpOworICAgICAgICAgICAgIC8qIENoZWNrIDE1IGJpdCBvZiBXUFMgSUUgYXMgaXQgY29udGFpbiBpbmZvcm1hdGlvbiBmb3Igd3BzIHN0YXRlCisgICAgICAgICAgICAgICogV1BTIHN0YXRlCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGlmKFNBUF9XUFNfRU5BQkxFRF9VTkNPTkZJR1VSRUQgPT0gcEllWzE1XSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcENvbmZpZy0+d3BzX3N0YXRlID0gU0FQX1dQU19FTkFCTEVEX1VOQ09ORklHVVJFRDsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmKFNBUF9XUFNfRU5BQkxFRF9DT05GSUdVUkVEID09IHBJZVsxNV0pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBDb25maWctPndwc19zdGF0ZSA9IFNBUF9XUFNfRU5BQkxFRF9DT05GSUdVUkVEOworICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcENvbmZpZy0+d3BzX3N0YXRlID0gU0FQX1dQU19ESVNBQkxFRDsKKyAgICB9CisgICAgcENvbmZpZy0+ZndkV1BTUEJDUHJvYmVSZXEgID0gMTsgLy8gRm9yd2FyZCBXUFMgUEJDIHByb2JlIHJlcXVlc3QgZnJhbWUgdXAgCisKKyAgICBwQ29uZmlnLT5SU05XUEFSZXFJRUxlbmd0aCA9IDA7CisgICAgcENvbmZpZy0+cFJTTldQQVJlcUlFID0gTlVMTDsKKyAgICBwSWUgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWVfcHRyKHBCZWFjb24tPnRhaWwsIHBCZWFjb24tPnRhaWxfbGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fRUlEX1JTTik7CisgICAgaWYocEllICYmIHBJZVsxXSkKKyAgICB7IAorICAgICAgICBwQ29uZmlnLT5SU05XUEFSZXFJRUxlbmd0aCA9IHBJZVsxXSArIDI7CisgICAgICAgIG1lbWNweSgmd3BhUnNuSUVkYXRhWzBdLCBwSWUsIHBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoKTsKKyAgICAgICAgcENvbmZpZy0+cFJTTldQQVJlcUlFID0gJndwYVJzbklFZGF0YVswXTsKKyAgICAgICAgLyogVGhlIGFjdHVhbCBwcm9jZXNzaW5nIG1heSBldmVudHVhbGx5IGJlIG1vcmUgZXh0ZW5zaXZlIHRoYW4gCisgICAgICAgICAqIHRoaXMuIFJpZ2h0IG5vdywganVzdCBjb25zdW1lIGFueSBQTUtJRHMgdGhhdCBhcmUgIHNlbnQgaW4gCisgICAgICAgICAqIGJ5IHRoZSBhcHAuCisgICAgICAgICAqICovCisgICAgICAgIHN0YXR1cyA9IGhkZF9zb2Z0YXBfdW5wYWNrSUUoIAorICAgICAgICAgICAgICAgICAgICAgICAgdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX1NNRSwgcFZvc0NvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgJlJTTkVuY3J5cHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1jUlNORW5jcnlwdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmUlNOQXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5wUlNOV1BBUmVxSUVbMV0rMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPnBSU05XUEFSZXFJRSApOworCisgICAgICAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTm93IGNvcHkgb3ZlciBhbGwgdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgeW91IGhhdmUgCisgICAgICAgICAgICAgKiBwYXJzZWQgb3V0IAorICAgICAgICAgICAgICogKi8KKyAgICAgICAgICAgIHBDb25maWctPlJTTkVuY3J5cHRUeXBlID0gUlNORW5jcnlwdFR5cGU7IC8vIFVzZSB0aGUgY2lwaGVyIHR5cGUgaW4gdGhlIFJTTiBJRQorICAgICAgICAgICAgcENvbmZpZy0+bWNSU05FbmNyeXB0VHlwZSA9IG1jUlNORW5jcnlwdFR5cGU7CisgICAgICAgICAgICAoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKSktPnVjRW5jcnlwdFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBSU05FbmNyeXB0VHlwZTsKKyAgICAgICAgICAgIGhkZExvZyggTE9HMSwgRkwoIiVzOiBDU1IgQXV0aFR5cGUgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVuY3J5cHRpb25UeXBlID0gJWQgbWNFbmNyeXB0aW9uVHlwZSA9ICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJTTkF1dGhUeXBlLCBSU05FbmNyeXB0VHlwZSwgbWNSU05FbmNyeXB0VHlwZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcEllID0gd2xhbl9oZGRfZ2V0X3ZlbmRvcl9vdWlfaWVfcHRyKFdQQV9PVUlfVFlQRSwgV1BBX09VSV9UWVBFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCZWFjb24tPnRhaWwsIHBCZWFjb24tPnRhaWxfbGVuKTsKKworICAgIGlmKHBJZSAmJiBwSWVbMV0gJiYgKHBJZVswXSA9PSBET1QxMUZfRUlEX1dQQSkpCisgICAgeworICAgICAgICBpZiAocENvbmZpZy0+cFJTTldQQVJlcUlFKQorICAgICAgICB7CisgICAgICAgICAgICAvKk1peGVkIG1vZGUgV1BBL1dQQTIqLworICAgICAgICAgICAgbWVtY3B5KCgmd3BhUnNuSUVkYXRhWzBdICsgcENvbmZpZy0+UlNOV1BBUmVxSUVMZW5ndGgpLCBwSWUsIHBJZVsxXSArIDIpOworICAgICAgICAgICAgcENvbmZpZy0+UlNOV1BBUmVxSUVMZW5ndGggKz0gcEllWzFdICsgMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoID0gcEllWzFdICsgMjsKKyAgICAgICAgICAgIG1lbWNweSgmd3BhUnNuSUVkYXRhWzBdLCBwSWUsIHBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoKTsKKyAgICAgICAgICAgIHBDb25maWctPnBSU05XUEFSZXFJRSA9ICZ3cGFSc25JRWRhdGFbMF07CisgICAgICAgICAgICBzdGF0dXMgPSBoZGRfc29mdGFwX3VucGFja0lFKCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX1NNRSwgcFZvc0NvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNORW5jcnlwdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtY1JTTkVuY3J5cHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOQXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPnBSU05XUEFSZXFJRVsxXSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5wUlNOV1BBUmVxSUUgKTsKKworICAgICAgICAgICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE5vdyBjb3B5IG92ZXIgYWxsIHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzIHlvdSBoYXZlIAorICAgICAgICAgICAgICAgICAqIHBhcnNlZCBvdXQgCisgICAgICAgICAgICAgICAgICogKi8KKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5SU05FbmNyeXB0VHlwZSA9IFJTTkVuY3J5cHRUeXBlOyAvLyBVc2UgdGhlIGNpcGhlciB0eXBlIGluIHRoZSBSU04gSUUKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5tY1JTTkVuY3J5cHRUeXBlID0gbWNSU05FbmNyeXB0VHlwZTsKKyAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKSktPnVjRW5jcnlwdFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBSU05FbmNyeXB0VHlwZTsKKyAgICAgICAgICAgICAgICBoZGRMb2coIExPRzEsIEZMKCIlczogQ1NSIEF1dGhUeXBlID0gJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuY3J5cHRpb25UeXBlID0gJWQgbWNFbmNyeXB0aW9uVHlwZSA9ICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOQXV0aFR5cGUsIFJTTkVuY3J5cHRUeXBlLCBtY1JTTkVuY3J5cHRUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBDb25maWctPlNTSURpbmZvLnNzaWRIaWRkZW4gPSBWT1NfRkFMU0U7CisKKyAgICBpZiAocGFyYW1zLT5zc2lkICE9IE5VTEwpCisgICAgeworICAgICAgICBtZW1jcHkocENvbmZpZy0+U1NJRGluZm8uc3NpZC5zc0lkLCBwYXJhbXMtPnNzaWQsIHBhcmFtcy0+c3NpZF9sZW4pOworICAgICAgICBwQ29uZmlnLT5TU0lEaW5mby5zc2lkLmxlbmd0aCA9IHBhcmFtcy0+c3NpZF9sZW47CisgICAgICAgIGlmIChwYXJhbXMtPmhpZGRlbl9zc2lkICE9IE5MODAyMTFfSElEREVOX1NTSURfTk9UX0lOX1VTRSkKKyAgICAgICAgICAgIHBDb25maWctPlNTSURpbmZvLnNzaWRIaWRkZW4gPSBWT1NfVFJVRTsKKyAgICB9CisgICAgdm9zX21lbV9jb3B5KHBDb25maWctPnNlbGZfbWFjYWRkci5ieXRlcywgCisgICAgICAgICAgICAgICBwSG9zdGFwZEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLCBzaXplb2Yodl9NQUNBRERSX3QpKTsKKyAgICAKKyAgICAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgcENvbmZpZy0+U2FwTWFjYWRkcl9hY2wgPSBlU0FQX0FDQ0VQVF9VTkxFU1NfREVOSUVEOworICAgIHBDb25maWctPm51bV9hY2NlcHRfbWFjID0gMDsKKyAgICBwQ29uZmlnLT5udW1fZGVueV9tYWMgPSAwOworCisgICAgcEllID0gd2xhbl9oZGRfZ2V0X3ZlbmRvcl9vdWlfaWVfcHRyKEJMQUNLTElTVF9PVUlfVFlQRSwgV1BBX09VSV9UWVBFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCZWFjb24tPnRhaWwsIHBCZWFjb24tPnRhaWxfbGVuKTsKKworICAgIC8qIHBJZSBmb3IgYmxhY2sgbGlzdCBpcyBmb2xsb3dpbmcgZm9ybToKKyAgICAgICAgICAgIHR5cGUgICAgOiAxIGJ5dGUKKyAgICAgICAgICAgIGxlbmd0aCAgOiAxIGJ5dGUKKyAgICAgICAgICAgIE9VSSAgICAgOiA0IGJ5dGVzCisgICAgICAgICAgICBhY2wgdHlwZSA6IDEgYnl0ZQorICAgICAgICAgICAgbm8gb2YgbWFjIGFkZHIgaW4gYmxhY2sgbGlzdDogMSBieXRlCisgICAgICAgICAgICBsaXN0IG9mIG1hY19hY2xfZW50cmllczogdmFyaWFibGUsIDYgYnl0ZXMgcGVyIG1hYyBhZGRyZXNzICsgc2l6ZW9mKGludCkgZm9yIHZsYW4gaWQKKyAgICAqLyAgICAKKyAgICBpZiAoKHBJZSAhPSBOVUxMKSAmJiAocEllWzFdICE9IDApKSAgICAKKyAgICB7CisgICAgICAgIHBDb25maWctPlNhcE1hY2FkZHJfYWNsID0gcEllWzZdOworICAgICAgICBwQ29uZmlnLT5udW1fZGVueV9tYWMgICA9IHBJZVs3XTsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCJhY2wgdHlwZSA9ICVkIG5vIGRlbnkgbWFjID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllWzZdLCBwSWVbN10pOworICAgICAgICBpZiAocENvbmZpZy0+bnVtX2RlbnlfbWFjID4gTUFYX01BQ19BRERSRVNTX0RFTklFRCkKKyAgICAgICAgICAgIHBDb25maWctPm51bV9kZW55X21hYyA9IE1BWF9NQUNfQUREUkVTU19ERU5JRUQ7CisgICAgICAgIGFjbF9lbnRyeSA9IChzdHJ1Y3QgcWNfbWFjX2FjbF9lbnRyeSAqKShwSWUgKyA4KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBDb25maWctPm51bV9kZW55X21hYzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBDb25maWctPmRlbnlfbWFjW2ldLCBhY2xfZW50cnktPmFkZHIsIHNpemVvZihxY21hY2FkZHIpKTsKKyAgICAgICAgICAgIGFjbF9lbnRyeSsrOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgcEllID0gd2xhbl9oZGRfZ2V0X3ZlbmRvcl9vdWlfaWVfcHRyKFdISVRFTElTVF9PVUlfVFlQRSwgV1BBX09VSV9UWVBFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCZWFjb24tPnRhaWwsIHBCZWFjb24tPnRhaWxfbGVuKTsKKworICAgIC8qIHBJZSBmb3Igd2hpdGUgbGlzdCBpcyBmb2xsb3dpbmcgZm9ybToKKyAgICAgICAgICAgIHR5cGUgICAgOiAxIGJ5dGUKKyAgICAgICAgICAgIGxlbmd0aCAgOiAxIGJ5dGUKKyAgICAgICAgICAgIE9VSSAgICAgOiA0IGJ5dGVzCisgICAgICAgICAgICBhY2wgdHlwZSA6IDEgYnl0ZQorICAgICAgICAgICAgbm8gb2YgbWFjIGFkZHIgaW4gd2hpdGUgbGlzdDogMSBieXRlCisgICAgICAgICAgICBsaXN0IG9mIG1hY19hY2xfZW50cmllczogdmFyaWFibGUsIDYgYnl0ZXMgcGVyIG1hYyBhZGRyZXNzICsgc2l6ZW9mKGludCkgZm9yIHZsYW4gaWQKKyAgICAqLyAgICAKKyAgICBpZiAoKHBJZSAhPSBOVUxMKSAmJiAocEllWzFdICE9IDApKSAgICAKKyAgICB7CisgICAgICAgIHBDb25maWctPlNhcE1hY2FkZHJfYWNsID0gcEllWzZdOworICAgICAgICBwQ29uZmlnLT5udW1fYWNjZXB0X21hYyAgID0gcEllWzddOworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sImFjbCB0eXBlID0gJWQgbm8gYWNjZXB0IG1hYyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVbNl0sIHBJZVs3XSk7CisgICAgICAgIGlmIChwQ29uZmlnLT5udW1fYWNjZXB0X21hYyA+IE1BWF9NQUNfQUREUkVTU19BQ0NFUFRFRCkKKyAgICAgICAgICAgIHBDb25maWctPm51bV9hY2NlcHRfbWFjID0gTUFYX01BQ19BRERSRVNTX0FDQ0VQVEVEOworICAgICAgICBhY2xfZW50cnkgPSAoc3RydWN0IHFjX21hY19hY2xfZW50cnkgKikocEllICsgOCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQ29uZmlnLT5udW1fYWNjZXB0X21hYzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBDb25maWctPmFjY2VwdF9tYWNbaV0sIGFjbF9lbnRyeS0+YWRkciwgc2l6ZW9mKHFjbWFjYWRkcikpOworICAgICAgICAgICAgYWNsX2VudHJ5Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgd2xhbl9oZGRfc2V0X3NhcEh3bW9kZShwSG9zdGFwZEFkYXB0ZXIpOworCisgICAgLy8gaHRfY2FwYWIgaXMgbm90IHdoYXQgdGhlIG5hbWUgY29udmV5cyx0aGlzIGlzIHVzZWQgZm9yIHByb3RlY3Rpb24gYml0bWFwCisgICAgcENvbmZpZy0+aHRfY2FwYWIgPQorICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+Y2ZnX2luaS0+YXBQcm90ZWN0aW9uOworCisgICAgaWYgKCAwICE9IHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9hcGllcyhwSG9zdGFwZEFkYXB0ZXIsIHBhcmFtcykgKQorICAgIHsKKyAgICAgICAgaGRkTG9nKExPR0UsIEZMKCJTQVAgTm90IGFibGUgdG8gc2V0IEFQIElFcyIpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy9VYXBzZCBFbmFibGVkIEJpdAorICAgIHBDb25maWctPlVhcHNkRW5hYmxlID0gIAorICAgICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5jZmdfaW5pLT5hcFVhcHNkRW5hYmxlZDsKKyAgICAvL0VuYWJsZSBPQlNTIHByb3RlY3Rpb24KKyAgICBwQ29uZmlnLT5vYnNzUHJvdEVuYWJsZWQgPSAKKyAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPmNmZ19pbmktPmFwT0JTU1Byb3RFbmFibGVkOyAKKworICAgIGhkZExvZyhMT0dXLCBGTCgiU09mdEFQIG1hY2FkZHJlc3MgOiAiTUFDX0FERFJFU1NfU1RSIlxuIiksIAorICAgICAgICAgICAgICAgICBNQUNfQUREUl9BUlJBWShwSG9zdGFwZEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzKSk7CisgICAgaGRkTG9nKExPR1csRkwoInNzaWQgPSVzXG4iKSwgcENvbmZpZy0+U1NJRGluZm8uc3NpZC5zc0lkKTsgIAorICAgIGhkZExvZyhMT0dXLEZMKCJiZWFjb25pbnQ9JWQsIGNoYW5uZWw9JWRcbiIpLCAoaW50KXBDb25maWctPmJlYWNvbl9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcENvbmZpZy0+Y2hhbm5lbCk7CisgICAgaGRkTG9nKExPR1csRkwoImh3X21vZGU9JXhcbiIpLCAgcENvbmZpZy0+U2FwSHdfbW9kZSk7CisgICAgaGRkTG9nKExPR1csRkwoInByaXZhY3k9JWQsIGF1dGhUeXBlPSVkXG4iKSwgcENvbmZpZy0+cHJpdmFjeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+YXV0aFR5cGUpOyAKKyAgICBoZGRMb2coTE9HVyxGTCgiUlNOL1dQQUxlbj0lZCwgXG4iKSwoaW50KXBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoKTsKKyAgICBoZGRMb2coTE9HVyxGTCgiVWFwc2QgPSAlZFxuIikscENvbmZpZy0+VWFwc2RFbmFibGUpOyAKKyAgICBoZGRMb2coTE9HVyxGTCgiUHJvdEVuYWJsZWQgPSAlZCwgT0JTU1Byb3RFbmFibGVkID0gJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5wcm90RW5hYmxlZCwgcENvbmZpZy0+b2Jzc1Byb3RFbmFibGVkKTsKKworICAgIGlmKHRlc3RfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnBIb3N0YXBkQWRhcHRlci0+ZXZlbnRfZmxhZ3MpKSAKKyAgICB7CisgICAgICAgIC8vQnNzIGFscmVhZHkgc3RhcnRlZC4ganVzdCByZXR1cm4uCisgICAgICAgIC8vVE9ETyBQcm9iYWJseSBpdCBzaG91bGQgdXBkYXRlIHNvbWUgYmVhY29uIHBhcmFtcy4KKyAgICAgICAgaGRkTG9nKCBMT0dFLCAiQnNzIEFscmVhZHkgc3RhcnRlZC4uLklnbm9yZSB0aGUgcmVxdWVzdCIpOworICAgICAgICBFWElUKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBwQ29uZmlnLT5wZXJzb25hID0gcEhvc3RhcGRBZGFwdGVyLT5kZXZpY2VfbW9kZTsKKworICAgIHBTYXBFdmVudENhbGxiYWNrID0gaGRkX2hvc3RhcGRfU0FQRXZlbnRDQjsKKyAgICBpZihXTEFOU0FQX1N0YXJ0QnNzKHBWb3NDb250ZXh0LCBwU2FwRXZlbnRDYWxsYmFjaywgcENvbmZpZywKKyAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwSG9zdGFwZEFkYXB0ZXItPmRldikgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgaGRkTG9nKExPR0UsRkwoIlNBUCBTdGFydCBCc3MgZmFpbFxuIikpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBoZGRMb2coTE9HRSwgCisgICAgICAgICAgIEZMKCJXYWl0aW5nIGZvciBTY2FuIHRvIGNvbXBsZXRlKGF1dG8gbW9kZSkgYW5kIEJTUyB0byBzdGFydCIpKTsKKworICAgIHN0YXR1cyA9IHZvc193YWl0X3NpbmdsZV9ldmVudCgmcEhvc3RhcGRTdGF0ZS0+dm9zRXZlbnQsIDEwMDAwKTsKKyAgIAorICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgeyAgCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgKCJFUlJPUjogSEREIHZvcyB3YWl0IGZvciBzaW5nbGVfZXZlbnQgZmFpbGVkISFcbiIpKTsKKyAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICB9CisgCisgICAgLy9TdWNjZXNmdWxseSBzdGFydGVkIEJzcyB1cGRhdGUgdGhlIHN0YXRlIGJpdC4KKyAgICBzZXRfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnBIb3N0YXBkQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCisgICAgcEhvc3RhcGRTdGF0ZS0+YkNvbW1pdCA9IFRSVUU7CisgICAgRVhJVCgpOworCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9hZGRfYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZWFjb25fcGFyYW1ldGVycyAqcGFyYW1zKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gIFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIGludCBzdGF0dXM9Vk9TX1NUQVRVU19TVUNDRVNTOyAKKworICAgIEVOVEVSKCk7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgImRldmljZSBtb2RlPSVkXG4iLHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKyAgICBpZiAoIChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQKSAKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICB8fCAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9HTykKKyNlbmRpZgorICAgICAgICkKKyAgICB7CisgICAgICAgIGJlYWNvbl9kYXRhX3QgKm9sZCwqbmV3OworCisgICAgICAgIG9sZCA9IHBBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbjsKKyAgIAorICAgICAgICBpZiAob2xkKQorICAgICAgICAgICAgcmV0dXJuIC1FQUxSRUFEWTsKKworICAgICAgICBzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9hbGxvY19uZXdfYmVhY29uKHBBZGFwdGVyLCZuZXcscGFyYW1zKTsKKworICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKSAKKyAgICAgICAgeworICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgIiVzOkVycm9yISEhIEFsbG9jYXRpbmcgdGhlIG5ldyBiZWFjb25cbiIsX19mdW5jX18pOworICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgcEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uID0gbmV3OworCisgICAgICAgIHN0YXR1cyA9IHdsYW5faGRkX2NmZzgwMjExX3N0YXJ0X2JzcyhwQWRhcHRlciwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBFWElUKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKyAKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2JlYWNvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZWFjb25fcGFyYW1ldGVycyAqcGFyYW1zKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gIFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOyAKKyAgICBpbnQgc3RhdHVzPVZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgIEVOVEVSKCk7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogZGV2aWNlX21vZGUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18scEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKworICAgIGlmICgocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCkgCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICB8fCAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9HTykKKyNlbmRpZgorICAgICAgICkgCisgICAgeworICAgICAgICBiZWFjb25fZGF0YV90ICpvbGQsKm5ldzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgb2xkID0gcEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uOworICAgICAgICAKKyAgICAgICAgaWYgKCFvbGQpCisgICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKKworICAgICAgICBzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9hbGxvY19uZXdfYmVhY29uKHBBZGFwdGVyLCZuZXcscGFyYW1zKTsKKworICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6IEVycm9yISEhIEFsbG9jYXRpbmcgdGhlIG5ldyBiZWFjb25cbiIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgfQorCisgICAgICAgcEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uID0gbmV3OworCisgICAgICAgc3RhdHVzID0gd2xhbl9oZGRfY2ZnODAyMTFfc3RhcnRfYnNzKHBBZGFwdGVyLCBwYXJhbXMpOworICAgIH0KKworICAgIEVYSVQoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2RlbF9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gIFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSAwOworCisgICAgRU5URVIoKTsKKworICAgIGlmIChOVUxMID09IHBBZGFwdGVyKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICIlczogSEREIGFkYXB0ZXIgY29udGV4dCBpcyBOdWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgcEhkZEN0eCAgPSAgKGhkZF9jb250ZXh0X3QqKXBBZGFwdGVyLT5wSGRkQ3R4OworCisgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IGRldmljZV9tb2RlID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyxwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCisgICAgaWYgKChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgfHwgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pCisjZW5kaWYKKyAgICAgICApCisgICAgeworICAgICAgICBiZWFjb25fZGF0YV90ICpvbGQ7CisKKyAgICAgICAgb2xkID0gcEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uOworCisgICAgICAgIGlmICghb2xkKQorICAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgICAgICAgaGRkX2NsZWFudXBfYWN0aW9uZnJhbWUocEhkZEN0eCwgcEFkYXB0ZXIpOworI2VuZGlmCisKKyAgICAgICAgbXV0ZXhfbG9jaygmcEhkZEN0eC0+c2FwX2xvY2spOworICAgICAgICBpZih0ZXN0X2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZwQWRhcHRlci0+ZXZlbnRfZmxhZ3MpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSAoc3RhdHVzID0gV0xBTlNBUF9TdG9wQnNzKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnB2b3NDb250ZXh0KSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisgICAgICAgICAgICAgICAgc3RhdHVzID0gdm9zX3dhaXRfc2luZ2xlX2V2ZW50KCZwSG9zdGFwZFN0YXRlLT52b3NFdmVudCwgMTAwMDApOworCisgICAgICAgICAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkVSUk9SOiBIREQgdm9zIHdhaXQgZm9yIHNpbmdsZV9ldmVudCBmYWlsZWQhIVxuIikpOworICAgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFyX2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZwQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIG11dGV4X3VubG9jaygmcEhkZEN0eC0+c2FwX2xvY2spOworCisgICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICIlczpFcnJvciEhISBTdG9wcGluZyB0aGUgQlNTXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNjbUNmZ1NldEludCgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5oSGFsLAorICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHLCAwLE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhMT0dFLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwYXNzIG9uIFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBRyB0byBDQ01cbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBlSEFMX1NUQVRVU19GQUlMVVJFID09IGNjbUNmZ1NldEludCgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5oSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9GTEFHLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVBTklfQk9PTEVBTl9GQUxTRSkgKQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coTE9HRSwKKyAgICAgICAgICAgICAgICJDb3VsZCBub3QgcGFzcyBvbiBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBRyB0byBDQ01cbiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzZXQgV05JX0NGR19QUk9CRV9SU1AgRmxhZ3MKKyAgICAgICAgd2xhbl9oZGRfcmVzZXRfcHJvYl9yc3BpZXMocEFkYXB0ZXIpOworCisgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLmJlYWNvbiA9IE5VTEw7CisgICAgICAgIGtmcmVlKG9sZCk7CisgICAgfQorICAgIEVYSVQoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8vTElOVVhfVkVSU0lPTl9DT0RFCisKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfY2hhbmdlX2JzcyAoc3RydWN0IHdpcGh5ICp3aXBoeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJzc19wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAgV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisKKyAgICBFTlRFUigpOworICAgIAorICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBkZXZpY2VfbW9kZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKyAgICBpZigocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgIHx8ICAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9HTykKKyNlbmRpZgorICAgICAgKSAKKyAgICB7CisgICAgICAgIC8qIGFwX2lzb2xhdGUgPT0gLTEgbWVhbnMgdGhhdCBpbiBjaGFuZ2UgYnNzLCB1cHBlciBsYXllciBkb2Vzbid0CisgICAgICAgICAqIHdhbnQgdG8gdXBkYXRlIHRoaXMgcGFyYW1ldGVyICovCisgICAgICAgIGlmICgtMSAhPSBwYXJhbXMtPmFwX2lzb2xhdGUpIAorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5hcERpc2FibGVJbnRyYUJzc0Z3ZCA9ICEhcGFyYW1zLT5hcF9pc29sYXRlOworICAgICAgICB9IAorICAgIH0KKworICAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9jaGFuZ2VfaWZhY2UKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGludGVyZmFjZSB0eXBlIChJTkZSQVNUUlVDVFVSRS9BREhPQykKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX2NoYW5nZV9pZmFjZSggc3RydWN0IHdpcGh5ICp3aXBoeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUiggbmRldiApOworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKCBwQWRhcHRlciApOworICAgIHRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlID0gTlVMTDsKKyAgICBlQ3NyUm9hbUJzc1R5cGUgTGFzdEJTU1R5cGU7CisgICAgaGRkX2NvbmZpZ190ICpwQ29uZmlnID0gcEhkZEN0eC0+Y2ZnX2luaTsKKyAgICBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGUgY29ubmVjdGVkQnNzVHlwZTsKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgIEVOVEVSKCk7CisKKyAgICBpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aXNMb2dwSW5Qcm9ncmVzcykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKworICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBkZXZpY2VfbW9kZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKyAgICB3ZGV2ID0gbmRldi0+aWVlZTgwMjExX3B0cjsKKworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgIGlmKChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UID09IHR5cGUpfHwKKyAgICAgICAoTkw4MDIxMV9JRlRZUEVfQURIT0MgPT0gdHlwZSl8fAorICAgICAgIChOTDgwMjExX0lGVFlQRV9BUCA9PSB0eXBlKXx8CisgICAgICAgKE5MODAyMTFfSUZUWVBFX1AyUF9HTyA9PSB0eXBlKSkKKyAgICB7CisgICAgICAgIHBIZGRDdHgtPmlzQW1wQWxsb3dlZCA9IFZPU19GQUxTRTsKKyAgICAgICAgLy8gc3RvcCBBTVAgdHJhZmZpYworICAgICAgICBzdGF0dXMgPSBXTEFOQkFQX1N0b3BBbXAoKTsKKyAgICAgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBIZGRDdHgtPmlzQW1wQWxsb3dlZCA9IFZPU19UUlVFOworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdG9wIEFNUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vV0xBTl9CVEFNUF9GRUFUVVJFCisgICAgLyogUmVzZXQgdGhlIGN1cnJlbnQgZGV2aWNlIG1vZGUgYml0IG1hc2sqLworICAgIHdsYW5faGRkX2NsZWFyX2NvbmN1cnJlbmN5X21vZGUocEhkZEN0eCwgcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKworICAgIGlmKCAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX0lORlJBX1NUQVRJT04pCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgfHwgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfQ0xJRU5UKQorI2VuZGlmCisgICAgICApCisgICAgeworICAgICAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICAgICAgcFJvYW1Qcm9maWxlID0gJnBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlOworICAgICAgICBMYXN0QlNTVHlwZSA9IHBSb2FtUHJvZmlsZS0+QlNTVHlwZTsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgICAgICBjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CisjZW5kaWYKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIiVzOiBzZXR0aW5nIGludGVyZmFjZSBUeXBlIHRvIElORlJBU1RSVUNUVVJFIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+QlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkU7CisgICAgICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5waHlNb2RlID0KKyAgICAgICAgICAgICAgICAgICBoZGRfY2ZnX3hsYXRlX3RvX2Nzcl9waHlfbW9kZShwQ29uZmlnLT5kb3QxMU1vZGUpOworICAgICAgICAgICAgICAgIHdkZXYtPmlmdHlwZSA9IHR5cGU7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9ICh0eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9IRERfSU5GUkFfU1RBVElPTjogV0xBTl9IRERfUDJQX0NMSUVOVDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAiJXM6IHNldHRpbmcgaW50ZXJmYWNlIFR5cGUgdG8gQURIT0MiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTOworICAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+cGh5TW9kZSA9CisgICAgICAgICAgICAgICAgICAgIGhkZF9jZmdfeGxhdGVfdG9fY3NyX3BoeV9tb2RlKHBDb25maWctPmRvdDExTW9kZSk7CisgICAgICAgICAgICAgICAgd2Rldi0+aWZ0eXBlID0gdHlwZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgICAgICBjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICAgICIlczogc2V0dGluZyBpbnRlcmZhY2UgVHlwZSB0byAlcyIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSA/ICJTb2Z0QVAiIDogIlAycEdvIik7CisKKyAgICAgICAgICAgICAgICAvL0RlLWluaXQgdGhlIGFkYXB0ZXIuCisgICAgICAgICAgICAgICAgaGRkX3N0b3BfYWRhcHRlciggcEhkZEN0eCwgcEFkYXB0ZXIgKTsKKyAgICAgICAgICAgICAgICBoZGRfZGVpbml0X2FkYXB0ZXIoIHBIZGRDdHgsIHBBZGFwdGVyICk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZwQWRhcHRlci0+c2Vzc2lvbkN0eCwgMCwgc2l6ZW9mKHBBZGFwdGVyLT5zZXNzaW9uQ3R4KSk7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+ZGV2aWNlX21vZGUgPSAodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0hERF9TT0ZUQVAgOiBXTEFOX0hERF9QMlBfR087CisjZWxzZQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9IFdMQU5fSEREX1NPRlRBUDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGhkZF9zZXRfYXBfb3BzKCBwQWRhcHRlci0+ZGV2ICk7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBoZGRfaW5pdF9hcF9tb2RlKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogRXJyb3IgaW5pdGlhbGl6aW5nIHRoZSBhcCBtb2RlIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGRkX3NldF9jb25wYXJhbSgxKTsKKworI2VuZGlmCisgICAgICAgICAgICAgICAgLyppbnRlcmZhY2UgdHlwZSBjaGFuZ2VkIHVwZGF0ZSBpbiB3aXBoeSBzdHJ1Y3R1cmUqLworICAgICAgICAgICAgICAgIGlmKHdkZXYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZGV2LT5pZnR5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgICAgICBwSGRkQ3R4LT5jaGFuZ2VfaWZhY2UgPSB0eXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogRVJST1IgISEhISBXaXJlbGVzcyBkZXYgaXMgTlVMTCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IFVuc3VwcG9ydGVkIGludGVyZmFjZSBUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgfHwgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08pCisjZW5kaWYKKyAgICAgICAgICAgICkKKyAgICB7CisgICAgICAgc3dpdGNoKHR5cGUpCisgICAgICAgeworICAgICAgICAgICBjYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICBjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CisjZW5kaWYKKyAgICAgICAgICAgY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKyAgICAgICAgICAgICAgICB3ZGV2LT5pZnR5cGUgPSB0eXBlOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+ZGV2aWNlX21vZGUgPSAodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9IRERfSU5GUkFfU1RBVElPTjogV0xBTl9IRERfUDJQX0NMSUVOVDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGhkZF9zZXRfY29ucGFyYW0oMCk7CisgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2hhbmdlX2lmYWNlID0gdHlwZTsKKyAgICAgICAgICAgICAgICBoZGRfc3RvcF9hZGFwdGVyKCBwSGRkQ3R4LCBwQWRhcHRlciApOworICAgICAgICAgICAgICAgIGhkZF9kZWluaXRfYWRhcHRlciggcEhkZEN0eCwgcEFkYXB0ZXIgKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnBBZGFwdGVyLT5zZXNzaW9uQ3R4LCAwLCBzaXplb2YocEFkYXB0ZXItPnNlc3Npb25DdHgpKTsKKyAgICAgICAgICAgICAgICBoZGRfc2V0X3N0YXRpb25fb3BzKCBwQWRhcHRlci0+ZGV2ICk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gaGRkX2luaXRfc3RhdGlvbl9tb2RlKCBwQWRhcHRlciApOworICAgICAgICAgICAgICAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIGNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CisjZW5kaWYKKyAgICAgICAgICAgICAgICB3ZGV2LT5pZnR5cGUgPSB0eXBlOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+ZGV2aWNlX21vZGUgPSAodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fSEREX1NPRlRBUCA6IFdMQU5fSEREX1AyUF9HTzsKKyNlbmRpZgorICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogVW5zdXBwb3J0ZWQgaW50ZXJmYWNlIFR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgIH0KKworCisgICAgaWYocFJvYW1Qcm9maWxlKQorICAgIHsKKyAgICAgICAgaWYgKCBMYXN0QlNTVHlwZSAhPSBwUm9hbVByb2ZpbGUtPkJTU1R5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICAvKmludGVyZmFjZSB0eXBlIGNoYW5nZWQgdXBkYXRlIGluIHdpcGh5IHN0cnVjdHVyZSovCisgICAgICAgICAgICB3ZGV2LT5pZnR5cGUgPSB0eXBlOworCisgICAgICAgICAgICAvKnRoZSBCU1MgbW9kZSBjaGFuZ2VkLCBXZSBuZWVkIHRvIGlzc3VlIGRpc2Nvbm5lY3QKKyAgICAgICAgICAgICAgaWYgY29ubmVjdGVkIG9yIGluIElCU1MgZGlzY29ubmVjdCBzdGF0ZSovCisgICAgICAgICAgICBpZiAoIGhkZF9jb25uR2V0Q29ubmVjdGVkQnNzVHlwZSgKKyAgICAgICAgICAgICAgICAgV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlciksICZjb25uZWN0ZWRCc3NUeXBlICkgfHwKKyAgICAgICAgICAgICAgICAoIGVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUyA9PSBMYXN0QlNTVHlwZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKm5lZWQgdG8gaXNzdWUgYSBkaXNjb25uZWN0IHRvIENTUi4qLworICAgICAgICAgICAgICAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3Zhcik7CisgICAgICAgICAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Sb2FtRGlzY29ubmVjdCggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkYXB0ZXItPmRpc2Nvbm5lY3RfY29tcF92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX0RJU0NPTk5FQ1QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK2RvbmU6CisgICAgLypzZXQgYml0bWFzayBiYXNlZCBvbiB1cGRhdGVkIHZhbHVlKi8KKyAgICB3bGFuX2hkZF9zZXRfY29uY3VycmVuY3lfbW9kZShwSGRkQ3R4LCBwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgIGlmKChOTDgwMjExX0lGVFlQRV9TVEFUSU9OID09IHR5cGUpICYmIChwSGRkQ3R4LT5jb25jdXJyZW5jeV9tb2RlIDw9IDEpICYmIAorICAgICAgIChwSGRkQ3R4LT5ub19vZl9zZXNzaW9uc1tXTEFOX0hERF9JTkZSQV9TVEFUSU9OXSA8PTEpKQorICAgIHsKKyAgICAgICAgLy93ZSBhcmUgb2sgdG8gZG8gQU1QCisgICAgICAgIHBIZGRDdHgtPmlzQW1wQWxsb3dlZCA9IFZPU19UUlVFOworICAgIH0KKyNlbmRpZiAvL1dMQU5fQlRBTVBfRkVBVFVSRQorICAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2hkZF9jaGFuZ2Vfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoIGRldiApOworICAgIHZfTUFDQUREUl90IFNUQU1hY0FkZHJlc3M7CisKKyAgICB2b3NfbWVtX2NvcHkoU1RBTWFjQWRkcmVzcy5ieXRlcywgbWFjLCBzaXplb2Yodl9NQUNBRERSX3QpKTsKKworICAgIGlmICggKCBwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQICkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICB8fCAoIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfR08gKQorI2VuZGlmCisgICAgICAgKQorICAgIHsKKyAgICAgICAgaWYocGFyYW1zLT5zdGFfZmxhZ3Nfc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCkpIAorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBoZGRfc29mdGFwX2NoYW5nZV9TVEFfc3RhdGUoIHBBZGFwdGVyLCAmU1RBTWFjQWRkcmVzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCk7CisKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBTdGF0aW9uIE1BQyBhZGRyZXNzIGRvZXMgbm90IG1hdGNoaW5nIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBGVU5DVElPTjogd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2lic3NfcGVlcl9zdGFpZHgKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgcGVlciBzdGF0aW9uIGluZGV4IGluIElCU1MgbW9kZQorICovCitzdGF0aWMgdTggd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2lic3NfcGVlcl9zdGFpZHgoaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIpCit7CisgICAgdTggaWR4ID0gMDsKKyAgICB1OCB0ZW1wW1ZPU19NQUNfQUREUl9TSVpFXSA9IHswfTsgCisgICAgRU5URVIoKTsKKyAgICBtZW1zZXQodGVtcCwgMCwgVk9TX01BQ19BRERSX1NJWkUpOworICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IEhERF9NQVhfTlVNX0lCU1NfU1RBOyBpZHgrKyApCisgICAgeworICAgICAgICBpZiAoICgwICE9IAorICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLnN0YUlkW2lkeF0pIAorICAgICAgICAgICYmIG1lbWNtcCgodTgqKSYoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8ucGVlck1hY0FkZHJlc3NbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCwgVk9TX01BQ19BRERSX1NJWkUpIAorICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlkeDsKK30KKworCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX2FkZF9rZXkKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBrZXkgaW5mb3JtYXRpb24KKyAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM4KSkKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfYWRkX2tleSggc3RydWN0IHdpcGh5ICp3aXBoeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICptYWNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGtleV9wYXJhbXMgKnBhcmFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZWxzZQorc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9hZGRfa2V5KCBzdHJ1Y3Qgd2lwaHkgKndpcGh5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGtleV9pbmRleCwgY29uc3QgdTggKm1hY19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyNlbmRpZgoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKCBuZGV2ICk7IAorICAgIHRDc3JSb2FtU2V0S2V5ICBzZXRLZXk7CisgICAgdTggZ3JvdXBtYWNhZGRyW1dOSV9DRkdfQlNTSURfTEVOXSA9IHsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRn07CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgdl9VMzJfdCByb2FtSWQ9IDB4RkY7IAorICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQ7ICAKKyAgICBoZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlOworICAgIFZPU19TVEFUVVMgdm9zX3N0YXR1czsKKworICAgIEVOVEVSKCk7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogZGV2aWNlX21vZGUgPSAlZFxuIiwKKyAgICAgICAgICAgIF9fZnVuY19fLHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKyAgICBpZiAoQ1NSX01BWF9OVU1fS0VZIDw9IGtleV9pbmRleCkKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogSW52YWxpZCBrZXkgaW5kZXggJWQiLCBfX2Z1bmNfXywgCisgICAgICAgICAgICAgICAga2V5X2luZGV4KTsKKworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgIiVzOiBjYWxsZWQgd2l0aCBrZXkgaW5kZXggPSAlZCAmIGtleSBsZW5ndGggJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIGtleV9pbmRleCwgcGFyYW1zLT5rZXlfbGVuKTsKKworICAgIC8qZXh0cmFjdCBrZXkgaWR4LCBrZXkgbGVuIGFuZCBrZXkqLworICAgIHZvc19tZW1femVybygmc2V0S2V5LHNpemVvZih0Q3NyUm9hbVNldEtleSkpOworICAgIHNldEtleS5rZXlJZCA9IGtleV9pbmRleDsKKyAgICBzZXRLZXkua2V5TGVuZ3RoID0gcGFyYW1zLT5rZXlfbGVuOworICAgIHZvc19tZW1fY29weSgmc2V0S2V5LktleVswXSxwYXJhbXMtPmtleSwgcGFyYW1zLT5rZXlfbGVuKTsKKworICAgIHN3aXRjaCAocGFyYW1zLT5jaXBoZXIpIAorICAgIHsKKyAgICAgICAgY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKKyAgICAgICAgICAgIHNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CisgICAgICAgICAgICBzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdTggKnBLZXkgPSAmc2V0S2V5LktleVswXTsKKyAgICAgICAgICAgICAgICBzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1RLSVA7CisKKyAgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8ocEtleSwgQ1NSX01BWF9LRVlfTEVOKTsKKworICAgICAgICAgICAgICAgIC8qU3VwcGxpY2FudCBzZW5kcyB0aGUgMzJieXRlcyBrZXkgaW4gdGhpcyBvcmRlciAKKworICAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICAgICAgICAgICAgIHwgICBUazEgICAgICAgIHxUWC1NSUMgICAgfCAgUlggTWljICB8IAorICAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICAgICAgICAgICAgIDwtLS0xNmJ5dGVzLS0tPjwtLThieXRlcy0tPjwtLThieXRlcy0tPgorCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKlNtZSBleHBlY3RzIHRoZSAzMiBieXRlcyBrZXkgdG8gYmUgaW4gdGhlIGJlbG93IG9yZGVyCisKKyAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgICAgICAgICAgICB8ICAgVGsxICAgICAgICB8UlgtTUlDICAgIHwgIFRYIE1pYyAgfCAKKyAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgICAgICAgICAgICA8LS0tMTZieXRlcy0tLT48LS04Ynl0ZXMtLT48LS04Ynl0ZXMtLT4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgVGVtcG9yYWwgS2V5IDEgKFRLMSkgKi8KKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkocEtleSwgcGFyYW1zLT5rZXksMTYpOworCisgICAgICAgICAgICAgICAgLypDb3B5IHRoZSByeCBtaWMgZmlyc3QqLworICAgICAgICAgICAgICAgIHZvc19tZW1fY29weSgmcEtleVsxNl0sJnBhcmFtcy0+a2V5WzI0XSw4KTsgCisKKyAgICAgICAgICAgICAgICAvKkNvcHkgdGhlIHR4IG1pYyAqLworICAgICAgICAgICAgICAgIHZvc19tZW1fY29weSgmcEtleVsyNF0sJnBhcmFtcy0+a2V5WzE2XSw4KTsgCisKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKyAgICAgICAgICAgIHNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgICAgICBjYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1NNUzQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZzZXRLZXksc2l6ZW9mKHRDc3JSb2FtU2V0S2V5KSk7CisgICAgICAgICAgICAgICAgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2tleV93YXBpKHBBZGFwdGVyLCBrZXlfaW5kZXgsIG1hY19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5rZXksIHBhcmFtcy0+a2V5X2xlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgIGNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfS1JLOgorICAgICAgICAgICAgc2V0S2V5LmVuY1R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9LUks7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiB1bnN1cHBvcnRlZCBjaXBoZXIgdHlwZSAlbHUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGFyYW1zLT5jaXBoZXIpOworICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgIH0KKworICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsICIlczogZW5jcnlwdGlvbiB0eXBlICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzZXRLZXkuZW5jVHlwZSk7CisKKworCisgICAgaWYgKChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgIHx8IChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKQorI2VuZGlmCisgICAgICAgKQorICAgIHsKKworCisgICAgICAgIGlmICggCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorICAgICAgICAgICAgICAgICghcGFpcndpc2UpCisjZWxzZQorICAgICAgICAgICAgICAgICghbWFjX2FkZHIgfHwgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIobWFjX2FkZHIpKSAKKyNlbmRpZgorICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNldCBncm91cCBrZXkqLworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICIlcy0gJWQ6IHNldHRpbmcgQnJvYWNhc3Qga2V5IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgIHNldEtleS5rZXlEaXJlY3Rpb24gPSBlU0lSX1JYX09OTFk7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoc2V0S2V5LnBlZXJNYWMsZ3JvdXBtYWNhZGRyLFdOSV9DRkdfQlNTSURfTEVOKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNldCBwYWlyd2lzZSBrZXkqLworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICIlcy0gJWQ6IHNldHRpbmcgcGFpcndpc2Uga2V5IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgIHNldEtleS5rZXlEaXJlY3Rpb24gPSBlU0lSX1RYX1JYOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KHNldEtleS5wZWVyTWFjLCBtYWNfYWRkcixXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgICAgIH0KKworICAgICAgICBwSG9zdGFwZFN0YXRlID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEFkYXB0ZXIpOworICAgICAgICBpZiggcEhvc3RhcGRTdGF0ZS0+YnNzU3RhdGUgPT0gQlNTX1NUQVJUICkgCisgICAgICAgIHsgCisgICAgICAgICAgICBzdGF0dXMgPSBXTEFOU0FQX1NldEtleVN0YSggcFZvc0NvbnRleHQsICZzZXRLZXkpOworCisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiWyU0ZF0gV0xBTlNBUF9TZXRLZXlTdGEgcmV0dXJuZWQgRVJST1Igc3RhdHVzPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgc3RhdHVzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTYXZpbmcgV0VQIGtleXMgKi8KKyAgICAgICAgZWxzZSBpZiggZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZICA9PSBzZXRLZXkuZW5jVHlwZSB8fAorICAgICAgICAgICAgICAgIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVkgID09IHNldEtleS5lbmNUeXBlICApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2F2ZSB0aGUgd2VwIGtleSBpbiBhcCBjb250ZXh0LiBJc3N1ZSBzZXRrZXkgYWZ0ZXIgdGhlIEJTUyBpcyBzdGFydGVkLgorICAgICAgICAgICAgaGRkX2FwX2N0eF90ICpwQVBDdHggPSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwQWRhcHRlcik7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBBUEN0eC0+d2VwS2V5W2tleV9pbmRleF0sICZzZXRLZXksIHNpemVvZih0Q3NyUm9hbVNldEtleSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9TYXZlIHRoZSBrZXkgaW4gYXAgY29udGV4dC4gSXNzdWUgc2V0a2V5IGFmdGVyIHRoZSBCU1MgaXMgc3RhcnRlZC4KKyAgICAgICAgICAgIGhkZF9hcF9jdHhfdCAqcEFQQ3R4ID0gV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEFkYXB0ZXIpOyAKKyAgICAgICAgICAgIHZvc19tZW1fY29weSgmcEFQQ3R4LT5ncm91cEtleSwgJnNldEtleSwgc2l6ZW9mKHRDc3JSb2FtU2V0S2V5KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikgCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgfHwgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfQ0xJRU5UKQorI2VuZGlmCisgICAgICAgICAgICApCisgICAgeworICAgICAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICAgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5LZXlzLktleUxlbmd0aFtrZXlfaW5kZXhdID0gKHU4KXBhcmFtcy0+a2V5X2xlbjsKKworICAgICAgICB2b3NfbWVtX2NvcHkoJnBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLktleXMuS2V5TWF0ZXJpYWxba2V5X2luZGV4XVswXSwgCisgICAgICAgICAgICAgICAgcGFyYW1zLT5rZXksIHBhcmFtcy0+a2V5X2xlbik7CisKKyAgICAgICAgcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1pbmdTdGF0ZSA9IEhERF9ST0FNX1NUQVRFX1NFVFRJTkdfS0VZOworCisgICAgaWYgKCEoICAoIElXX0FVVEhfS0VZX01HTVRfODAyXzFYIAorICAgICAgICAgICAgICAgICAgICA9PSAocFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgJiBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkpIAorICAgICAgICAgICAgICAgICAgICAmJiAoZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0gPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlKQorICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICggIChXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCA9PSBwYXJhbXMtPmNpcGhlcikKKyAgICAgICAgICAgICAgICAgICB8fCAoV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0ID09IHBhcmFtcy0+Y2lwaGVyKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpbiBjYXNlIG9mIHN0YXRpYyBXRVAsIG1hY2FkZHIvYnNzaWQgaXMgbm90IGNvbWluZyBmcm9tIG5sODAyMTEKKyAgICAgICAgICAgICAqIGludGVyZmFjZSwgY29weSBic3NpZCBmb3IgcGFpcndpc2Uga2V5IGFuZCBncm91cCBtYWNhZGRyIGZvciAKKyAgICAgICAgICAgICAqIGdyb3VwIGtleSBpbml0aWFsaXphdGlvbiovCisKKyAgICAgICAgICAgIHRDc3JSb2FtUHJvZmlsZSAgICAgICAgICAqcFJvYW1Qcm9maWxlID0gJnBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlOworCisgICAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSA9IAorICAgICAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby51Y0VuY3J5cHRpb25UeXBlID0gCisgICAgICAgICAgICAgICAgKChXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCA9PSBwYXJhbXMtPmNpcGhlcikgPworICAgICAgICAgICAgICAgICBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVkgOgorICAgICAgICAgICAgICAgICBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZKTsKKworCisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBOZWdvdGlhdGVkIGVuY3J5cHRpb24gdHlwZSAlZCIsIF9fZnVuY19fLCAKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUpOworCisgICAgICAgICAgICBzbWVfU2V0Q2ZnUHJpdmFjeSgodHBBbmlTaXJHbG9iYWwpV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUsIHRydWUpOworICAgICAgICAgICAgc2V0S2V5LmtleUxlbmd0aCA9IDA7CisgICAgICAgICAgICBzZXRLZXkua2V5RGlyZWN0aW9uID0gIGVTSVJfVFhfUlg7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCisgICAgICAgICAgICBpZiAocGFpcndpc2UpIAorICAgICAgICAgICAgeworI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKG1hY19hZGRyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHNldEtleS5wZWVyTWFjLCBtYWNfYWRkcixXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1hY2FkZHIgaXMgTlVMTCwgc2V0IHRoZSBwZWVyTWFjIHRvIGJzc0lkIGluIGNhc2Ugb2YgQlNTLCAKKyAgICAgICAgICAgICAgICAgICAgICogYW5kIHBlZXJNYWNBZGRyZXNzIGluIGNhc2Ugb2YgSUJTUyovCisgICAgICAgICAgICAgICAgICAgIGlmIChlQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1MgPT0gcFJvYW1Qcm9maWxlLT5CU1NUeXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1OCBzdGFpZHggPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfaWJzc19wZWVyX3N0YWlkeChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSEREX01BWF9OVU1fSUJTU19TVEEgIT0gc3RhaWR4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19tZW1fY29weShzZXRLZXkucGVlck1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSGRkU3RhQ3R4LT5jb25uX2luZm8ucGVlck1hY0FkZHJlc3Nbc3RhaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfQlNTSURfTEVOKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vIHBlZXJNYWMgZm91bmQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHNldEtleS5wZWVyTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNldCBncm91cCBrZXkqLworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzLSAlZDogc2V0dGluZyBHcm91cCBrZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICBzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9SWF9PTkxZOworICAgICAgICAgICAgICAgIHZvc19tZW1fY29weShzZXRLZXkucGVlck1hYywgZ3JvdXBtYWNhZGRyLCBXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCisgICAgICAgICAgICAgICAgKCFwYWlyd2lzZSkKKyNlbHNlCisgICAgICAgICAgICAgICAgKCFtYWNfYWRkciB8fCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtYWNfYWRkcikpIAorI2VuZGlmCisgICAgICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZXQgZ3JvdXAga2V5Ki8KKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAiJXMtICVkOiBzZXR0aW5nIEdyb3VwIGtleSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9SWF9PTkxZOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KHNldEtleS5wZWVyTWFjLGdyb3VwbWFjYWRkcixXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZXQgcGFpcndpc2Uga2V5Ki8KKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAiJXMtICVkOiBzZXR0aW5nIHBhaXJ3aXNlIGtleSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9UWF9SWDsKKyAgICAgICAgICAgIHZvc19tZW1fY29weShzZXRLZXkucGVlck1hYywgbWFjX2FkZHIsV05JX0NGR19CU1NJRF9MRU4pOworICAgICAgICB9CisKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwgCisgICAgICAgICAgICAgICAgIiVzOiBzZXQga2V5IGZvciBwZWVyTWFjICUyeDolMng6JTJ4OiUyeDolMng6JTJ4LCBkaXJlY3Rpb24gJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzZXRLZXkucGVlck1hY1swXSwgc2V0S2V5LnBlZXJNYWNbMV0sIAorICAgICAgICAgICAgICAgIHNldEtleS5wZWVyTWFjWzJdLCBzZXRLZXkucGVlck1hY1szXSwgCisgICAgICAgICAgICAgICAgc2V0S2V5LnBlZXJNYWNbNF0sIHNldEtleS5wZWVyTWFjWzVdLCAKKyAgICAgICAgICAgICAgICBzZXRLZXkua2V5RGlyZWN0aW9uKTsKKworICAgICAgICB2b3Nfc3RhdHVzID0gd2xhbl9oZGRfY2hlY2tfdWxhX2RvbmUocEFkYXB0ZXIpOworCisgICAgICAgIGlmICggdm9zX3N0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJbJTRkXSB3bGFuX2hkZF9jaGVja191bGFfZG9uZSByZXR1cm5lZCBFUlJPUiBzdGF0dXM9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHZvc19zdGF0dXMgKTsKKworICAgICAgICAgICAgcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1pbmdTdGF0ZSA9IEhERF9ST0FNX1NUQVRFX05PTkU7CisKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgIH0KKworCisgICAgICAgIC8qIGlzc3VlIHNldCBrZXkgcmVxdWVzdCB0byBTTUUqLworICAgICAgICBzdGF0dXMgPSBzbWVfUm9hbVNldEtleSggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsICZzZXRLZXksICZyb2FtSWQgKTsKKworICAgICAgICBpZiAoIDAgIT0gc3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICIlczogc21lX1JvYW1TZXRLZXkgZmFpbGVkLCByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICAgICAgcEhkZFN0YUN0eC0+cm9hbV9pbmZvLnJvYW1pbmdTdGF0ZSA9IEhERF9ST0FNX1NUQVRFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyogaW4gY2FzZSBvZiBJQlNTIGFzIHRoZXJlIHdhcyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYWJvdXQgV0VQIGtleXMgZHVyaW5nIAorICAgICAgICAgKiBJQlNTIGpvaW4sIGdyb3VwIGtleSBpbnRpYWxpemVkIHdpdGggTlVMTCBrZXksIHNvIHJlLWluaXRpYWxpemUgZ3JvdXAga2V5IAorICAgICAgICAgKiB3aXRoIGNvcnJlY3QgdmFsdWUqLworICAgICAgICBpZiAoIChlQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1MgPT0gcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuQlNTVHlwZSkgJiYgCisgICAgICAgICAgICAhKCAgKCBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCAKKyAgICAgICAgICAgICAgICAgICAgPT0gKHBXZXh0U3RhdGUtPmF1dGhLZXlNZ210ICYgSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpKSAKKyAgICAgICAgICAgICAgICAgICAgJiYgKGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkKKyAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgKCAgKFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwID09IHBhcmFtcy0+Y2lwaGVyKQorICAgICAgICAgICAgICAgICAgIHx8IChXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQgPT0gcGFyYW1zLT5jaXBoZXIpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldEtleS5rZXlEaXJlY3Rpb24gPSBlU0lSX1JYX09OTFk7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoc2V0S2V5LnBlZXJNYWMsZ3JvdXBtYWNhZGRyLFdOSV9DRkdfQlNTSURfTEVOKTsKKworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwgCisgICAgICAgICAgICAgICAgICAgICIlczogc2V0IGtleSBwZWVyTWFjICUyeDolMng6JTJ4OiUyeDolMng6JTJ4LCBkaXJlY3Rpb24gJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2V0S2V5LnBlZXJNYWNbMF0sIHNldEtleS5wZWVyTWFjWzFdLCAKKyAgICAgICAgICAgICAgICAgICAgc2V0S2V5LnBlZXJNYWNbMl0sIHNldEtleS5wZWVyTWFjWzNdLCAKKyAgICAgICAgICAgICAgICAgICAgc2V0S2V5LnBlZXJNYWNbNF0sIHNldEtleS5wZWVyTWFjWzVdLCAKKyAgICAgICAgICAgICAgICAgICAgc2V0S2V5LmtleURpcmVjdGlvbik7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9Sb2FtU2V0S2V5KCBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCAmc2V0S2V5LCAmcm9hbUlkICk7CisKKyAgICAgICAgICAgIGlmICggMCAhPSBzdGF0dXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzbWVfUm9hbVNldEtleSBmYWlsZWQgZm9yIGdyb3VwIGtleSAoSUJTUyksIHJldHVybmVkICVkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX2dldF9rZXkKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgdGhlIGtleSBpbmZvcm1hdGlvbgorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfa2V5KCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3aXBoeSAqd2lwaHksIAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICB1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKm1hY19hZGRyLCB2b2lkICpjb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY2FsbGJhY2spKHZvaWQgKmNvb2tpZSwgc3RydWN0IGtleV9wYXJhbXMqKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorI2Vsc2UKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X2tleSggCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2lwaHkgKndpcGh5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgdTgga2V5X2luZGV4LCBjb25zdCB1OCAqbWFjX2FkZHIsIHZvaWQgKmNvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqY29va2llLCBzdHJ1Y3Qga2V5X3BhcmFtcyopCisgICAgICAgICAgICAgICAgICAgICAgICApCisjZW5kaWYKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUiggbmRldiApOyAKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworICAgIHRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlID0gJihwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZSk7CisgICAgc3RydWN0IGtleV9wYXJhbXMgcGFyYW1zOworCisgICAgRU5URVIoKTsKKyAgICAKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogZGV2aWNlX21vZGUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisgICAgCisgICAgbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKworICAgIGlmIChDU1JfTUFYX05VTV9LRVkgPD0ga2V5X2luZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfSAgIAorCisgICAgc3dpdGNoKHBSb2FtUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0pCisgICAgeworICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX05PTkU6CisgICAgICAgICAgICBwYXJhbXMuY2lwaGVyID0gSVdfQVVUSF9DSVBIRVJfTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOgorICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOgorICAgICAgICAgICAgcGFyYW1zLmNpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDoKKyAgICAgICAgICAgIHBhcmFtcy5jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1RLSVA6CisgICAgICAgICAgICBwYXJhbXMuY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQUVTOgorICAgICAgICAgICAgcGFyYW1zLmNpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBhcmFtcy5jaXBoZXIgPSBJV19BVVRIX0NJUEhFUl9OT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcGFyYW1zLmtleV9sZW4gPSBwUm9hbVByb2ZpbGUtPktleXMuS2V5TGVuZ3RoW2tleV9pbmRleF07CisgICAgcGFyYW1zLnNlcV9sZW4gPSAwOworICAgIHBhcmFtcy5zZXEgPSBOVUxMOworICAgIHBhcmFtcy5rZXkgPSAmcFJvYW1Qcm9maWxlLT5LZXlzLktleU1hdGVyaWFsW2tleV9pbmRleF1bMF07CisgICAgY2FsbGJhY2soY29va2llLCAmcGFyYW1zKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfa2V5CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGVsZXRlIHRoZSBrZXkgaW5mb3JtYXRpb24KKyAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM4KSkKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZGVsX2tleSggc3RydWN0IHdpcGh5ICp3aXBoeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBrZXlfaW5kZXgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBhaXJ3aXNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKm1hY19hZGRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZWxzZQorc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfa2V5KCBzdHJ1Y3Qgd2lwaHkgKndpcGh5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGtleV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKm1hY19hZGRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZW5kaWYKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKworICAgIC8vVGhpcyBjb2RlIG5lZWRzIHRvIGJlIHJldmlzaXRlZC4gVGhlcmUgaXMgc21lX3JlbW92ZUtleSBBUEksIHdlIHNob3VsZAorICAgIC8vcGxhbiB0byB1c2UgdGhhdC4gQWZ0ZXIgdGhlIGNoYW5nZSB0byB1c2UgY29ycmVjdCBpbmRleCBpbiBzZXRrZXksIAorICAgIC8vaXQgaXMgb2JzZXJ2ZWQgdGhhdCB0aGlzIGlzIGludmFsaWRhdGluZyBwZWVyCisgICAgLy9rZXkgaW5kZXggd2hlbmV2ZXIgcmUta2V5IGlzIGRvbmUuIFRoaXMgaXMgYWZmZWN0aW5nIGRhdGEgbGluay4KKyAgICAvL0l0IHNob3VsZCBiZSBvayB0byBpZ25vcmUgZGVsX2tleS4KKyNpZiAwCisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoIG5kZXYgKTsgCisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dDsgIAorICAgIHU4IGdyb3VwbWFjYWRkcltXTklfQ0ZHX0JTU0lEX0xFTl0gPSB7MHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZ9OworICAgIHRDc3JSb2FtU2V0S2V5ICBzZXRLZXk7CisgICAgdl9VMzJfdCByb2FtSWQ9IDB4RkY7CisgICAgCisgICAgRU5URVIoKTsKKworICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IGRldmljZV9tb2RlID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18scEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKworICAgIGlmIChDU1JfTUFYX05VTV9LRVkgPD0ga2V5X2luZGV4KQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBJbnZhbGlkIGtleSBpbmRleCAlZCIsIF9fZnVuY19fLCAKKyAgICAgICAgICAgICAgICBrZXlfaW5kZXgpOworCisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHZvc19tZW1femVybygmc2V0S2V5LHNpemVvZih0Q3NyUm9hbVNldEtleSkpOworICAgIHNldEtleS5rZXlJZCA9IGtleV9pbmRleDsKKworICAgIGlmIChtYWNfYWRkcikKKyAgICAgICAgdm9zX21lbV9jb3B5KHNldEtleS5wZWVyTWFjLCBtYWNfYWRkcixXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgZWxzZQorICAgICAgICB2b3NfbWVtX2NvcHkoc2V0S2V5LnBlZXJNYWMsIGdyb3VwbWFjYWRkciwgV05JX0NGR19CU1NJRF9MRU4pOworCisgICAgc2V0S2V5LmVuY1R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworCisgICAgaWYgKChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfU09GVEFQKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgIHx8IChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0dPKQorI2VuZGlmCisgICAgICAgKSAKKyAgICB7IAorICAgICAgIAorICAgICAgICBoZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlID0gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fSEREX0dFVF9IT1NUQVBfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICAgICAgaWYoIHBIb3N0YXBkU3RhdGUtPmJzc1N0YXRlID09IEJTU19TVEFSVCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gV0xBTlNBUF9TZXRLZXlTdGEoIHBWb3NDb250ZXh0LCAmc2V0S2V5KTsKKyAgICAKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJbJTRkXSBXTEFOU0FQX1NldEtleVN0YSByZXR1cm5lZCBFUlJPUiBzdGF0dXM9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgfHwgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfQ0xJRU5UKSAKKyNlbmRpZgorICAgICAgICAgICAgKQorICAgIHsKKyAgICAgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworICAgICAgICBwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfU0VUVElOR19LRVk7ICAgCisgICAgCisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsIAorICAgICAgICAgICAgICAgICIlczogZGVsZXRlIGtleSBmb3IgcGVlck1hYyAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNldEtleS5wZWVyTWFjWzBdLCBzZXRLZXkucGVlck1hY1sxXSwgCisgICAgICAgICAgICAgICAgc2V0S2V5LnBlZXJNYWNbMl0sIHNldEtleS5wZWVyTWFjWzNdLCAKKyAgICAgICAgICAgICAgICBzZXRLZXkucGVlck1hY1s0XSwgc2V0S2V5LnBlZXJNYWNbNV0pOworICAgICAgICBpZihwQWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLmNvbm5faW5mby5jb25uU3RhdGUgPT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQpIAorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBzbWVfUm9hbVNldEtleSggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCwgJnNldEtleSwgJnJvYW1JZCApOworICAgICAgICAKKyAgICAgICAgICAgIGlmICggMCAhPSBzdGF0dXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzbWVfUm9hbVNldEtleSBmYWlsdXJlLCByZXR1cm5lZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHBIZGRTdGFDdHgtPnJvYW1faW5mby5yb2FtaW5nU3RhdGUgPSBIRERfUk9BTV9TVEFURV9OT05FOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfZGVmYXVsdF9rZXkKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQgdHgga2V5IGluZGV4CisgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX3NldF9kZWZhdWx0X2tleSggc3RydWN0IHdpcGh5ICp3aXBoeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBrZXlfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bmljYXN0LCBib29sIG11bHRpY2FzdCkKKyNlbHNlCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX3NldF9kZWZhdWx0X2tleSggc3RydWN0IHdpcGh5ICp3aXBoeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBrZXlfaW5kZXgpCisjZW5kaWYKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUiggbmRldiApOyAKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCisgICAgRU5URVIoKTsKKworICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBkZXZpY2VfbW9kZSA9ICVkIGtleV9pbmRleCA9ICVkIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18scEFkYXB0ZXItPmRldmljZV9tb2RlLCBrZXlfaW5kZXgpOworICAgCisgICAgaWYgKENTUl9NQVhfTlVNX0tFWSA8PSBrZXlfaW5kZXgpCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEludmFsaWQga2V5IGluZGV4ICVkIiwgX19mdW5jX18sIAorICAgICAgICAgICAgICAgIGtleV9pbmRleCk7CisKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgCisgICAgaWYgKChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgIHx8IChwQWRhcHRlci0+ZGV2aWNlX21vZGUgPT0gV0xBTl9IRERfUDJQX0NMSUVOVCkKKyNlbmRpZgorICAgICAgICkgCisgICAgeworICAgICAgICBpZiAoIChrZXlfaW5kZXggIT0gcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy5kZWZhdWx0SW5kZXgpICYmIAorICAgICAgICAgICAgIChlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQICE9IAorICAgICAgICAgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdKSAmJgorICAgICAgICAgICAgIChlQ1NSX0VOQ1JZUFRfVFlQRV9BRVMgIT0gCisgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0pCisgICAgICAgICAgICkKKyAgICAgICAgeyAgCisgICAgICAgICAgICAvKiBpZiBkZWZhdWx0IGtleSBpbmRleCBpcyBub3Qgc2FtZSBhcyBwcmV2aW91cyBvbmUsIAorICAgICAgICAgICAgICogdGhlbiB1cGRhdGUgdGhlIGRlZmF1bHQga2V5IGluZGV4ICovCisgICAgCisgICAgICAgICAgICB0Q3NyUm9hbVNldEtleSAgc2V0S2V5OworICAgICAgICAgICAgdl9VMzJfdCByb2FtSWQ9IDB4RkY7CisgICAgICAgICAgICB0Q3NyS2V5cyAqS2V5cyA9ICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5LZXlzOworICAgICAgICAgICAgCisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBkZWZhdWx0IHR4IGtleSBpbmRleCAlZCIsIAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywga2V5X2luZGV4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgS2V5cy0+ZGVmYXVsdEluZGV4ID0gKHU4KWtleV9pbmRleDsKKyAgICAgICAgICAgIHZvc19tZW1femVybygmc2V0S2V5LHNpemVvZih0Q3NyUm9hbVNldEtleSkpOworICAgICAgICAgICAgc2V0S2V5LmtleUlkID0ga2V5X2luZGV4OworICAgICAgICAgICAgc2V0S2V5LmtleUxlbmd0aCA9IEtleXMtPktleUxlbmd0aFtrZXlfaW5kZXhdOworICAgICAgICAgICAgCisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnNldEtleS5LZXlbMF0sIAorICAgICAgICAgICAgICAgICAgICAmS2V5cy0+S2V5TWF0ZXJpYWxba2V5X2luZGV4XVswXSwgCisgICAgICAgICAgICAgICAgICAgIEtleXMtPktleUxlbmd0aFtrZXlfaW5kZXhdKTsKKyAgICAKKyAgICAgICAgICAgIHNldEtleS5rZXlEaXJlY3Rpb24gPSBlU0lSX1RYX09OTFk7CisgICAgCisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoc2V0S2V5LnBlZXJNYWMsIAorICAgICAgICAgICAgICAgICAgICAmcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmJzc0lkWzBdLAorICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgCisgICAgICAgICAgICBzZXRLZXkuZW5jVHlwZSA9IAorICAgICAgICAgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdOworICAgICAgICAgICAgIAorICAgICAgICAgICAgLyogaXNzdWUgc2V0IGtleSByZXF1ZXN0ICovCisgICAgICAgICAgICBzdGF0dXMgPSBzbWVfUm9hbVNldEtleSggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCwgJnNldEtleSwgJnJvYW1JZCApOworICAgIAorICAgICAgICAgICAgaWYgKCAwICE9IHN0YXR1cyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHNtZV9Sb2FtU2V0S2V5IGZhaWxlZCwgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogSW4gU29mdEFwIG1vZGUgc2V0dGluZyBrZXkgZGlyZWN0aW9uIGZvciBkZWZhdWx0IG1vZGUgKi8KKyAgICBlbHNlIGlmICggV0xBTl9IRERfU09GVEFQID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSApCisgICAgeworICAgICAgICBpZiAoIChlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQICE9CisgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0pICYmCisgICAgICAgICAgICAgKGVDU1JfRU5DUllQVF9UWVBFX0FFUyAhPQorICAgICAgICAgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdKQorICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qICBTYXZpbmcga2V5IGRpcmVjdGlvbiBmb3IgZGVmYXVsdCBrZXkgaW5kZXggdG8gVFggZGVmYXVsdCAqLworICAgICAgICAgICAgaGRkX2FwX2N0eF90ICpwQVBDdHggPSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwQWRhcHRlcik7CisgICAgICAgICAgICBwQVBDdHgtPndlcEtleVtrZXlfaW5kZXhdLmtleURpcmVjdGlvbiA9IGVTSVJfVFhfREVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKyAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfY2hhbm5lbAorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgY2hhbm5lbCBudW1iZXIgCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfY2hhbm5lbCggc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIHZfVTMyX3QgbnVtX2NoID0gMDsKKyAgICB1MzIgY2hhbm5lbCA9IDA7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoIGRldiApOyAKKyAgICBpbnQgZnJlcSA9IGNoYW4tPmNlbnRlcl9mcmVxOyAvKiBmcmVxIGlzIGluIE1IWiAqLyAKKyAKKyAgICBFTlRFUigpOworICAgIAorICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgIiVzOiBkZXZpY2VfbW9kZSA9ICVkICBmcmVxID0gJWQgXG4iLF9fZnVuY19fLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+ZGV2aWNlX21vZGUsIGNoYW4tPmNlbnRlcl9mcmVxKTsKKworICAgIC8qIAorICAgICAqIERvIGZyZXEgdG8gY2hhbiBjb252ZXJzaW9uCisgICAgICogVE9ETzogZm9yIDExYQorICAgICAqLworCisgICAgY2hhbm5lbCA9IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChmcmVxKTsKKyAgICAKKyAgICAvKiBDaGVjayBmcmVxIHJhbmdlICovCisgICAgaWYgKChXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9TVEFNSU4gPiBjaGFubmVsKSB8fCAKKyAgICAgICAgICAgIChXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9TVEFNQVggPCBjaGFubmVsKSkgCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6IENoYW5uZWwgWyVkXSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlIGZyb20gJWQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGNoYW5uZWwsIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1JTiwKKyAgICAgICAgICAgICAgICBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9TVEFNQVgpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBudW1fY2ggPSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU47CisKKyAgICBpZiAoKFdMQU5fSEREX1NPRlRBUCAhPSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAmJiAoV0xBTl9IRERfUDJQX0dPICE9IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkKKyNlbmRpZgorICAgICAgKQorICAgIHsKKyAgICAgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHdsYW5faGRkX3ZhbGlkYXRlX29wZXJhdGlvbl9jaGFubmVsKHBBZGFwdGVyLGNoYW5uZWwpKQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgQ2hhbm5lbCBbJWRdIFxuIiwgX19mdW5jX18sIGNoYW5uZWwpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICIlczogc2V0IGNoYW5uZWwgdG8gWyVkXSBmb3IgZGV2aWNlIG1vZGUgPSVkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjaGFubmVsLHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisgICAgfQorICAgIGlmKCAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX0lORlJBX1NUQVRJT04pCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICB8fCAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9DTElFTlQpCisjZW5kaWYKKyAgICAgICkKKyAgICB7CisgICAgICAgIGhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOyAKKyAgICAgICAgdENzclJvYW1Qcm9maWxlICogcFJvYW1Qcm9maWxlID0gJnBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlOworICAgICAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCisgICAgICAgIGlmIChlQ29ubmVjdGlvblN0YXRlX0lic3NDb25uZWN0ZWQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAvKiBMaW5rIGlzIHVwIHRoZW4gcmV0dXJuIGNhbnQgc2V0IGNoYW5uZWwqLworICAgICAgICAgICAgaGRkTG9nKCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICIlczogSUJTUyBBc3NvY2lhdGVkLCBjYW4ndCBzZXQgdGhlIGNoYW5uZWxcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgbnVtX2NoID0gcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMTsKKyAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWwgPSBjaGFubmVsOyAKKyAgICAgICAgcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IAorICAgICAgICAgICAgJnBIZGRTdGFDdHgtPmNvbm5faW5mby5vcGVyYXRpb25DaGFubmVsOyAKKyAgICB9CisgICAgZWxzZSBpZiAoKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9TT0ZUQVApIAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgfHwgICAocEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1AyUF9HTykKKyNlbmRpZgorICAgICAgICAgICAgKSAKKyAgICB7CisgICAgICAgIChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwQWRhcHRlcikpLT5zYXBDb25maWcuY2hhbm5lbCA9IGNoYW5uZWw7CisKKyAgICAgICAgaWYgKCBXTEFOX0hERF9TT0ZUQVAgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgaGRkX2NvbmZpZ190ICpjZmdfcGFyYW0gPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pOworCisgICAgICAgICAgICAvKiBJZiBhdXRvIGNoYW5uZWwgc2VsZWN0aW9uIGlzIGNvbmZpZ3VyZWQgYXMgZW5hYmxlLyAxIHRoZW4gaWdub3JlCisgICAgICAgICAgICBjaGFubmVsIHNldCBieSBzdXBwbGljYW50CisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCBjZmdfcGFyYW0tPmFwQXV0b0NoYW5uZWxTZWxlY3Rpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwQWRhcHRlcikpLT5zYXBDb25maWcuY2hhbm5lbCA9IEFVVE9fQ0hBTk5FTF9TRUxFQ1Q7CisKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzZXQgY2hhbm5lbCB0byBhdXRvIGNoYW5uZWwgKDApIGZvciBkZXZpY2UgbW9kZSA9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgCisgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgZGV2aWNlIG1vZGUgZmFpbGVkIHRvIHNldCB2YWxpZCBjaGFubmVsIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgRVhJVCgpOworICAgIHJldHVybiAwOworfQorCisKKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9pbmZvcm1fYnNzCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSBCU1MgZGV0YWlscyB0byBubDgwMjExIGludGVyZmFjZS4KKyAqLworc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9ic3MqIHdsYW5faGRkX2NmZzgwMjExX2luZm9ybV9ic3MoCisgICAgICAgICAgICAgICAgICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnJvYW1Qcm9maWxlKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwQWRhcHRlci0+ZGV2OworICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisgICAgc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OworICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MgPSByb2FtUHJvZmlsZS0+cEJzc0Rlc2M7CisgICAgaW50IGNoYW5fbm87CisgICAgaW50IGllX2xlbmd0aDsKKyAgICBjb25zdCBjaGFyICppZTsKKyAgICB1bnNpZ25lZCBpbnQgZnJlcTsKKyAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisgICAgaW50IHJzc2kgPSAwOworICAgIHN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzcyA9IE5VTEw7CisKKyAgICBFTlRFUigpOworCisgICAgaWYoIE5VTEwgPT0gcEJzc0Rlc2MgKQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBwQnNzRGVzYyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBic3M7CisgICAgfQorCisgICAgY2hhbl9ubyA9IHBCc3NEZXNjLT5jaGFubmVsSWQ7CisgICAgaWVfbGVuZ3RoID0gR0VUX0lFX0xFTl9JTl9CU1NfREVTQyggcEJzc0Rlc2MtPmxlbmd0aCApOworICAgIGllID0gICgoaWVfbGVuZ3RoICE9IDApID8gKGNvbnN0IGNoYXIgKikmcEJzc0Rlc2MtPmllRmllbGRzOiBOVUxMKTsKKworICAgIGlmKCBOVUxMID09IGllICkKKyAgICB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBJRSBvZiBCU1MgZGVzY3JpcHRvciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgcmV0dXJuIGJzczsKKyAgICB9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDM4KSkKKyAgICBpZiAoY2hhbl9ubyA8PSBBUlJBWV9TSVpFKGhkZF9jaGFubmVsc18yXzRfR0haKSkKKyAgICB7CisgICAgICAgIGZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbl9ubywgSUVFRTgwMjExX0JBTkRfMkdIWik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbl9ubywgSUVFRTgwMjExX0JBTkRfNUdIWik7CisgICAgfQorI2Vsc2UKKyAgICBmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5fbm8pOworI2VuZGlmCisKKyAgICBjaGFuID0gX19pZWVlODAyMTFfZ2V0X2NoYW5uZWwod2lwaHksIGZyZXEpOworCisgICAgYnNzID0gY2ZnODAyMTFfZ2V0X2Jzcyh3aXBoeSwgY2hhbiwgcEJzc0Rlc2MtPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJvYW1Qcm9maWxlLT5TU0lELnNzSWRbMF0sIHJvYW1Qcm9maWxlLT5TU0lELmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fQ0FQQUJJTElUWV9FU1MsIFdMQU5fQ0FQQUJJTElUWV9FU1MpOworICAgIGlmIChic3MgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJzc2kgPSAoVk9TX01JTiAoKHBCc3NEZXNjLT5yc3NpICsgcEJzc0Rlc2MtPnNpbnIpLCAwKSkqMTAwOworCisgICAgICAgIHJldHVybiAoY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwgY2hhbiwgcEJzc0Rlc2MtPmJzc0lkLCAKKyAgICAgICAgICAgICAgICBsZTY0X3RvX2NwdSgqKF9fbGU2NCAqKXBCc3NEZXNjLT50aW1lU3RhbXApLCAKKyAgICAgICAgICAgICAgICBwQnNzRGVzYy0+Y2FwYWJpbGl0eUluZm8sCisgICAgICAgICAgICAgICAgcEJzc0Rlc2MtPmJlYWNvbkludGVydmFsLCBpZSwgaWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgIHJzc2ksIEdGUF9LRVJORUwgKSk7Cit9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJzczsKKyAgICB9Cit9CisKKworCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbmZvcm0gdGhlIEJTUyBkZXRhaWxzIHRvIG5sODAyMTEgaW50ZXJmYWNlLgorICovCitzdHJ1Y3QgY2ZnODAyMTFfYnNzKgord2xhbl9oZGRfY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKmJzc19kZXNjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgLyoKKyAgICAgIGNmZzgwMjExX2luZm9ybV9ic3MoKSBpcyBub3QgdXBkYXRpbmcgaWUgZmllbGQgb2YgYnNzIGVudHJ5LCBpZiBlbnRyeQorICAgICAgYWxyZWFkeSBleGlzdHMgaW4gYnNzIGRhdGEgYmFzZSBvZiBjZmc4MDIxMSBmb3IgdGhhdCBwYXJ0aWN1bGFyIEJTUyBJRC4KKyAgICAgIFVzaW5nIGNmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUgdG8gdXBkYXRlIHRoZSBic3MgZW50cnkgaW5zdGVhZCBvZgorICAgICAgY2ZnODAyMTFfaW5mb3JtX2JzcywgQnV0IHRoaXMgY2FsbCBleHBlY3RzIG1nbXQgcGFja2V0IGFzIGlucHV0LiBBcyBvZgorICAgICAgbm93IHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IHRvIGdldCB0aGUgbWdtdChwcm9iZSByZXNwb25zZSkgZnJhbWUgZnJvbSBQRSwKKyAgICAgIGNvbnZlcnRpbmcgYnNzX2Rlc2MgdG8gaWVlZTgwMjExX21nbXQocHJvYmUgcmVzcG9uc2UpIGFuZCBwYXNzaW5nIHRvCisgICAgICBjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lLgorICAgICAqLworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwQWRhcHRlci0+ZGV2OworICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisgICAgc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OworICAgIGludCBjaGFuX25vID0gYnNzX2Rlc2MtPmNoYW5uZWxJZDsKKyAgICBpbnQgaWVfbGVuZ3RoID0gR0VUX0lFX0xFTl9JTl9CU1NfREVTQyggYnNzX2Rlc2MtPmxlbmd0aCApOworICAgIGNvbnN0IGNoYXIgKmllID0KKyAgICAgICAgKChpZV9sZW5ndGggIT0gMCkgPyAoY29uc3QgY2hhciAqKSZic3NfZGVzYy0+aWVGaWVsZHM6IE5VTEwpOworICAgIHVuc2lnbmVkIGludCBmcmVxOworICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKKyAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPQorICAgICAgICBremFsbG9jKChzaXplb2YgKHN0cnVjdCBpZWVlODAyMTFfbWdtdCkgKyBpZV9sZW5ndGgpLCBHRlBfS0VSTkVMKTsKKyAgICBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3Nfc3RhdHVzID0gTlVMTDsKKyAgICBzaXplX3QgZnJhbWVfbGVuID0gc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX21nbXQpICsgaWVfbGVuZ3RoOworICAgIGludCByc3NpID0gMDsKKworICAgIEVOVEVSKCk7CisKKyAgICBtZW1jcHkobWdtdC0+YnNzaWQsIGJzc19kZXNjLT5ic3NJZCwgRVRIX0FMRU4pOworICAgIG1lbWNweSgmbWdtdC0+dS5wcm9iZV9yZXNwLnRpbWVzdGFtcCwgYnNzX2Rlc2MtPnRpbWVTdGFtcCwKKyAgICAgICAgICAgIHNpemVvZiAoYnNzX2Rlc2MtPnRpbWVTdGFtcCkpOworICAgIG1nbXQtPnUucHJvYmVfcmVzcC5iZWFjb25faW50ID0gYnNzX2Rlc2MtPmJlYWNvbkludGVydmFsOworICAgIG1nbXQtPnUucHJvYmVfcmVzcC5jYXBhYl9pbmZvID0gYnNzX2Rlc2MtPmNhcGFiaWxpdHlJbmZvOworICAgIG1lbWNweShtZ210LT51LnByb2JlX3Jlc3AudmFyaWFibGUsIGllLCBpZV9sZW5ndGgpOworCisgICAgbWdtdC0+ZnJhbWVfY29udHJvbCB8PQorICAgICAgICAodTE2KShJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorICAgIGlmIChjaGFuX25vIDw9IEFSUkFZX1NJWkUoaGRkX2NoYW5uZWxzXzJfNF9HSFopICYmIAorICAgICAgICAod2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdICE9IE5VTEwpKQorICAgIHsKKyAgICAgICAgZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFuX25vLCBJRUVFODAyMTFfQkFORF8yR0haKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGNoYW5fbm8gPiBBUlJBWV9TSVpFKGhkZF9jaGFubmVsc18yXzRfR0haKSkgJiYgCisgICAgICAgICh3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gIT0gTlVMTCkpCisKKyAgICB7CisgICAgICAgIGZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbl9ubywgSUVFRTgwMjExX0JBTkRfNUdIWik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGtmcmVlKG1nbXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZWxzZQorICAgIGZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbl9ubyk7CisjZW5kaWYKKyAgICBjaGFuID0gX19pZWVlODAyMTFfZ2V0X2NoYW5uZWwod2lwaHksIGZyZXEpOworCisgICAgLypUbyBrZWVwIHRoZSByc3NpIGljb24gb2YgdGhlIGNvbm5lY3RlZCBBUCBpbiB0aGUgc2NhbiB3aW5kb3cKKyAgICAqYW5kIHRoZSByc3NpIGljb24gb2YgdGhlIHdpcmVsZXNzIG5ldHdvcmtzIGluIHN5bmMgCisgICAgKiAqLworICAgIGlmICgoIGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCA9PQorICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uQ3R4LnN0YXRpb24uY29ubl9pbmZvLmNvbm5TdGF0ZSApICYmCisgICAgICAgICAgICAgKCBWT1NfVFJVRSA9PSB2b3NfbWVtX2NvbXBhcmUoYnNzX2Rlc2MtPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLmNvbm5faW5mby5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19CU1NJRF9MRU4pKSkKKyAgICB7CisgICAgICAgLyogc3VwcGxpY2FudCB0YWtlcyB0aGUgc2lnbmFsIHN0cmVuZ3RoIGluIHRlcm1zIG9mIG1CbSgxMDAqZEJtKSAqLworICAgICAgIHJzc2kgPSAocEFkYXB0ZXItPnJzc2kgKiAxMDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHJzc2kgPSAoVk9TX01JTiAoKGJzc19kZXNjLT5yc3NpICsgYnNzX2Rlc2MtPnNpbnIpLCAwKSkqMTAwOworICAgIH0KKworICAgIGJzc19zdGF0dXMgPSBjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lKHdpcGh5LCBjaGFuLCBtZ210LAorICAgICAgICAgICAgZnJhbWVfbGVuLCByc3NpLCBHRlBfS0VSTkVMKTsKKyAgICBrZnJlZShtZ210KTsKKyAgICByZXR1cm4gYnNzX3N0YXR1czsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYnNzX2RiCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBCU1MgZGF0YSBiYXNlIG9mIENGRzgwMTEKKyAqLworc3RydWN0IGNmZzgwMjExX2Jzcyogd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Jzc19kYiggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlIHJvYW1Qcm9maWxlOworICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKyAgICBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MgPSBOVUxMOworCisgICAgRU5URVIoKTsKKworICAgIG1lbXNldCgmcm9hbVByb2ZpbGUsIDAsIHNpemVvZih0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUpKTsKKyAgICBzbWVfUm9hbUdldENvbm5lY3RQcm9maWxlKGhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsICZyb2FtUHJvZmlsZSk7CisKKyAgICBpZiAoTlVMTCAhPSByb2FtUHJvZmlsZS5wQnNzRGVzYykKKyAgICB7CisgICAgICAgIGJzcyA9IHdsYW5faGRkX2NmZzgwMjExX2luZm9ybV9ic3MocEFkYXB0ZXIsIAorICAgICAgICAgICAgICAgICZyb2FtUHJvZmlsZSk7CisKKyAgICAgICAgaWYgKE5VTEwgPT0gYnNzKQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogY2ZnODAyMTFfaW5mb3JtX2JzcyByZXR1cm4gTlVMTCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgfQorCisgICAgICAgIHNtZV9Sb2FtRnJlZUNvbm5lY3RQcm9maWxlKGhIYWwsICZyb2FtUHJvZmlsZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogIHJvYW1Qcm9maWxlLnBCc3NEZXNjIGlzIE5VTEwiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICB9CisgICAgcmV0dXJuIGJzczsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYnNzCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfdXBkYXRlX2Jzcyggc3RydWN0IHdpcGh5ICp3aXBoeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sgICAKKyAgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisgICAgdENzclNjYW5SZXN1bHRJbmZvICpwU2NhblJlc3VsdDsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IDA7CisgICAgdFNjYW5SZXN1bHRIYW5kbGUgcFJlc3VsdDsKKyAgICBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3Nfc3RhdHVzID0gTlVMTDsKKworICAgIEVOVEVSKCk7CisKKyAgICBpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aXNMb2dwSW5Qcm9ncmVzcykKKyAgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsX19mdW5jX18pOworICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzdGFydCBnZXR0aW5nIHNjYW4gcmVzdWx0cyBhbmQgcG9wdWxhdGUgY2dmODAyMTEgQlNTIGRhdGFiYXNlCisgICAgICovCisgICAgc3RhdHVzID0gc21lX1NjYW5HZXRSZXN1bHQoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwgTlVMTCwgJnBSZXN1bHQpOworCisgICAgLyogbm8gc2NhbiByZXN1bHRzICovCisgICAgaWYgKE5VTEwgPT0gcFJlc3VsdCkKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBObyBzY2FuIHJlc3VsdFxuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHBTY2FuUmVzdWx0ID0gc21lX1NjYW5SZXN1bHRHZXRGaXJzdChoSGFsLCBwUmVzdWx0KTsKKworICAgIHdoaWxlIChwU2NhblJlc3VsdCkKKyAgICB7CisgICAgICAgIC8qIAorICAgICAgICAgKiBjZmc4MDIxMV9pbmZvcm1fYnNzKCkgaXMgbm90IHVwZGF0aW5nIGllIGZpZWxkIG9mIGJzcyBlbnRyeSwgaWYgCisgICAgICAgICAqIGVudHJ5IGFscmVhZHkgZXhpc3RzIGluIGJzcyBkYXRhIGJhc2Ugb2YgY2ZnODAyMTEgZm9yIHRoYXQgCisgICAgICAgICAqIHBhcnRpY3VsYXIgQlNTIElELiAgVXNpbmcgY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZSB0byB1cGRhdGUgdGhlIAorICAgICAgICAgKiBic3MgZW50cnkgaW5zdGVhZCBvZiBjZmc4MDIxMV9pbmZvcm1fYnNzLCBCdXQgdGhpcyBjYWxsIGV4cGVjdHMgCisgICAgICAgICAqIG1nbXQgcGFja2V0IGFzIGlucHV0LiBBcyBvZiBub3cgdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgdG8gZ2V0IAorICAgICAgICAgKiB0aGUgbWdtdChwcm9iZSByZXNwb25zZSkgZnJhbWUgZnJvbSBQRSwgY29udmVydGluZyBic3NfZGVzYyB0byAKKyAgICAgICAgICogaWVlZTgwMjExX21nbXQocHJvYmUgcmVzcG9uc2UpIGFuZCBwYXNzaW5nIHRvIGMKKyAgICAgICAgICogZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lLgorICAgICAgICAgKiAqLworCisgICAgICAgIGJzc19zdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICZwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvcik7CisgICAgCisKKyAgICAgICAgaWYgKE5VTEwgPT0gYnNzX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAiJXM6IE5VTEwgcmV0dXJuZWQgYnkgY2ZnODAyMTFfaW5mb3JtX2Jzc1xuIiwgX19mdW5jX18pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY2ZnODAyMTFfcHV0X2Jzcyhic3Nfc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHBTY2FuUmVzdWx0ID0gc21lX1NjYW5SZXN1bHRHZXROZXh0KGhIYWwsIHBSZXN1bHQpOworICAgIH0KKworICAgIHNtZV9TY2FuUmVzdWx0UHVyZ2UoaEhhbCwgcFJlc3VsdCk7IAorCisgICAgcmV0dXJuIDA7IAorfQorCisvKgorICogRlVOQ1RJT046IGhkZF9jZmc4MDIxMV9zY2FuX2RvbmVfY2FsbGJhY2sKKyAqIHNjYW5uaW5nIGNhbGxiYWNrIGZ1bmN0aW9uLCBjYWxsZWQgYWZ0ZXIgZmluaXNoaW5nIHNjYW4KKyAqCisgKi8KK3N0YXRpYyBlSGFsU3RhdHVzIGhkZF9jZmc4MDIxMV9zY2FuX2RvbmVfY2FsbGJhY2sodEhhbEhhbmRsZSBoYWxIYW5kbGUsIAorICAgICAgICB2b2lkICpwQ29udGV4dCwgdEFOSV9VMzIgc2NhbklkLCBlQ3NyU2NhblN0YXR1cyBzdGF0dXMpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBwQ29udGV4dDsKKyAgICAvL3N0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7ICAgIAorICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKCBkZXYgKTsKKyAgICBoZGRfc2NhbmluZm9fdCAqcFNjYW5JbmZvID0gJnBBZGFwdGVyLT5zY2FuX2luZm87CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgoIHBBZGFwdGVyICk7CisgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxID0gTlVMTDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIEVOVEVSKCk7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiJXMgY2FsbGVkIHdpdGggaGFsSGFuZGxlID0gJXAsIHBDb250ZXh0ID0gJXAsIgorICAgICAgICAgICAgInNjYW5JRCA9ICVkLCByZXR1cm5lZCBzdGF0dXMgPSAlZFxuIiwgCisgICAgICAgICAgICBfX2Z1bmNfXywgaGFsSGFuZGxlLCBwQ29udGV4dCwgKGludCkgc2NhbklkLCAoaW50KSBzdGF0dXMpOworCisgICAgLy9CbG9jayBvbiBzY2FuIHJlcSBjb21wbGV0aW9uIHZhcmlhYmxlLiBDYW4ndCB3YWl0IGZvcmV2ZXIgdGhvdWdoLgorICAgIHJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2NhbkluZm8tPnNjYW5fcmVxX2NvbXBsZXRpb25fZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9TQ0FOX1JFUSkpOworICAgIGlmICghcmV0KQorICAgIHsKKyAgICAgICBWT1NfQVNTRVJUKHBTY2FuSW5mby0+bVNjYW5QZW5kaW5nKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZihwU2NhbkluZm8tPm1TY2FuUGVuZGluZyAhPSBWT1NfVFJVRSkKKyAgICB7CisgICAgICAgIFZPU19BU1NFUlQocFNjYW5JbmZvLT5tU2NhblBlbmRpbmcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBDaGVjayB0aGUgc2NhbklkICovCisgICAgaWYgKHBTY2FuSW5mby0+c2NhbklkICE9IHNjYW5JZCkgCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgIiVzIGNhbGxlZCB3aXRoIG1pc21hdGNoZWQgc2NhbklkIHBTY2FuSW5mby0+c2NhbklkID0gJWQgIgorICAgICAgICAgICAgICAgICJzY2FuSWQgPSAlZCBcbiIsIF9fZnVuY19fLCAoaW50KSBwU2NhbkluZm8tPnNjYW5JZCwgCisgICAgICAgICAgICAgICAgKGludCkgc2NhbklkKTsKKyAgICB9CisKKyAgICAvKiBTY2FuIGlzIG5vIGxvbmdlciBwZW5kaW5nICovCisgICAgcFNjYW5JbmZvLT5tU2NhblBlbmRpbmcgPSBWT1NfRkFMU0U7CisKKyAgICByZXQgPSB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYnNzKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPndpcGh5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlcik7CisKKyAgICBpZiAoMCA+IHJldCkKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IE5PIFNDQU4gcmVzdWx0IiwgX19mdW5jX18pOyAgICAKKworCisgICAgLyogSWYgYW55IGNsaWVudCB3YWl0IHNjYW4gcmVzdWx0IHRocm91Z2ggV0VYVAorICAgICAqIHNlbmQgc2NhbiBkb25lIGV2ZW50IHRvIGNsaWVudCAqLworICAgIGlmIChwQWRhcHRlci0+c2Nhbl9pbmZvLndhaXRTY2FuUmVzdWx0KQorICAgIHsKKyAgICAgICAgLyogVGhlIG90aGVyIHNjYW4gcmVxdWVzdCB3YWl0aW5nIGZvciBjdXJyZW50IHNjYW4gZmluaXNoCisgICAgICAgICAqIFNlbmQgZXZlbnQgdG8gbm90aWZ5IGN1cnJlbnQgc2NhbiBmaW5pc2hlZCAqLworICAgICAgICBpZihXRVhUX1NDQU5fUEVORElOR19ERUxBWSA9PSBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5fcGVuZGluZ19vcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19ldmVudF9zZXQoJnBBZGFwdGVyLT5zY2FuX2luZm8uc2Nhbl9maW5pc2hlZF9ldmVudCk7CisgICAgICAgIH0KKyAgICAgICAgLyogU2VuZCBub3RpZnkgdG8gV0VYVCBjbGllbnQgKi8KKyAgICAgICAgZWxzZSBpZihXRVhUX1NDQU5fUEVORElOR19QSUdHWUJBQ0sgPT0gcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuX3BlbmRpbmdfb3B0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcEFkYXB0ZXItPmRldjsKKyAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKyAgICAgICAgICAgIGludCB3ZV9ldmVudDsKKyAgICAgICAgICAgIGNoYXIgKm1zZzsKKworICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAnXDAnLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgd2VfZXZlbnQgPSBTSU9DR0lXU0NBTjsKKyAgICAgICAgICAgIG1zZyA9IE5VTEw7CisgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgd2VfZXZlbnQsICZ3cnF1LCBtc2cpOworICAgICAgICB9CisgICAgfQorICAgIHBBZGFwdGVyLT5zY2FuX2luZm8ud2FpdFNjYW5SZXN1bHQgPSBGQUxTRTsKKworICAgIC8qIEdldCB0aGUgU2NhbiBSZXEgKi8KKyAgICByZXEgPSBwQWRhcHRlci0+cmVxdWVzdDsKKworICAgIGlmICghcmVxKQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgInJlcXVlc3QgaXMgYmVjYW1lIE5VTExcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHNldHRpbmcgdXAgMCwganVzdCBpbiBjYXNlLgorICAgICAqLyAgCisgICAgcmVxLT5uX3NzaWRzID0gMDsKKyAgICByZXEtPm5fY2hhbm5lbHMgPSAwOworICAgIHJlcS0+aWUgPSAwOworCisgICAgLyoKKyAgICAgKiBjZmc4MDIxMV9zY2FuX2RvbmUgaW5mb3JtaW5nIE5MODAyMTEgYWJvdXQgY29tcGxldGlvbgorICAgICAqIG9mIHNjYW5uaW5nCisgICAgICovCisgICAgY2ZnODAyMTFfc2Nhbl9kb25lKHJlcSwgZmFsc2UpOworICAgIGNvbXBsZXRlKCZwQWRhcHRlci0+YWJvcnRzY2FuX2V2ZW50X3Zhcik7CisgICAgcEFkYXB0ZXItPnJlcXVlc3QgPSBOVUxMOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIC8qIEZsdXNoIG91dCBzY2FuIHJlc3VsdCBhZnRlciBwMnBfc2VyYWNoIGlzIGRvbmUgKi8KKyAgICBpZihwU2NhbkluZm8tPnAycFNlYXJjaCApCisgICAgeworICAgICAgICB0QU5JX1U4IHNlc3Npb25JZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisgICAgICAgIGlmIChwSGRkQ3R4LT5jZmdfaW5pLT5pc1AycERldmljZUFkZHJBZG1pbmlzdHJhdGVkKQorICAgICAgICB7IAorICAgICAgICAgICAgc2Vzc2lvbklkID0gcEFkYXB0ZXItPnAycFNlc3Npb25JZDsKKyAgICAgICAgfSAKKyAgICAgICAgc21lX1NjYW5GbHVzaFJlc3VsdChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIHNlc3Npb25JZCk7CisgICAgICAgIHBTY2FuSW5mby0+cDJwU2VhcmNoID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9zY2FuCisgKiB0aGlzIHNjYW4gcmVzcG9uZCB0byBzY2FuIHRyaWdnZXIgYW5kIHVwZGF0ZSBjZmc4MDIxMSBzY2FuIGRhdGFiYXNlCisgKiBsYXRlciwgc2NhbiBkdW1wIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcmVjaWV2ZSBzY2FuIHJlc3VsdHMKKyAqLworaW50IHdsYW5faGRkX2NmZzgwMjExX3NjYW4oIHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QpCit7ICAKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUiggZGV2ICk7IAorICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKCBwQWRhcHRlciApOworICAgIGhkZF93ZXh0X3N0YXRlX3QgKnB3ZXh0QnVmID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICBoZGRfY29uZmlnX3QgKmNmZ19wYXJhbSA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmk7CisgICAgdENzclNjYW5SZXF1ZXN0IHNjYW5SZXF1ZXN0OworICAgIHRBTklfVTggKmNoYW5uZWxMaXN0ID0gTlVMTCwgaTsKKyAgICB2X1UzMl90IHNjYW5JZCA9IDA7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaGRkX3NjYW5pbmZvX3QgKnBTY2FuSW5mbyA9ICZwQWRhcHRlci0+c2Nhbl9pbmZvOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICB2X1U4X3QqIHBQMnBJZSA9IE5VTEw7CisjZW5kaWYKKworICAgIEVOVEVSKCk7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogZGV2aWNlX21vZGUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18scEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyAgICAvL1NjYW4gbm90IHN1cHBvcnRlZCB3aGVuIEFNUCB0cmFmZmljIGlzIG9uLgorICAgIGlmKCBWT1NfVFJVRSA9PSBXTEFOQkFQX0FtcFNlc3Npb25PbigpICkgCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6IE5vIHNjYW5uaW5nIHdoZW4gQU1QIGlzIG9uIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgfQorI2VuZGlmCisgICAgLy9TY2FuIG9uIGFueSBvdGhlciBpbnRlcmZhY2UgaXMgbm90IHN1cHBvcnRlZC4KKyAgICBpZiggcEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCApIAorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiBOb3Qgc2Nhbm5pbmcgb24gZGV2aWNlX21vZGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKyAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgIH0KKworICAgIGlmIChUUlVFID09IHBTY2FuSW5mby0+bVNjYW5QZW5kaW5nKQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IG1TY2FuUGVuZGluZyBpcyBUUlVFIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVCVVNZOyAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICBpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwSGRkQ3R4LT50bUluZm8udG1PcGVyYXRpb25Mb2NrKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiJXM6IEFxdWlyZSBsb2NrIGZhaWwiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0gICAgCisgICAgaWYgKFRSVUUgPT0gcEhkZEN0eC0+dG1JbmZvLnRtQWN0aW9uLmVudGVySW1wcykKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICIlczogTUFYIFRNIExldmVsIFNjYW4gbm90IGFsbG93ZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIG11dGV4X3VubG9jaygmcEhkZEN0eC0+dG1JbmZvLnRtT3BlcmF0aW9uTG9jayk7CisgICAgICAgIHJldHVybiAtRUJVU1k7ICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIG11dGV4X3VubG9jaygmcEhkZEN0eC0+dG1JbmZvLnRtT3BlcmF0aW9uTG9jayk7CisKKyAgICB2b3NfbWVtX3plcm8oICZzY2FuUmVxdWVzdCwgc2l6ZW9mKHNjYW5SZXF1ZXN0KSk7CisKKyAgICBpZiAoTlVMTCAhPSByZXF1ZXN0KQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAic2NhbiByZXF1ZXN0IGZvciBzc2lkID0gJWQiLAorICAgICAgICAgICAgICAgKGludClyZXF1ZXN0LT5uX3NzaWRzKTsgIAorCisgICAgICAgIC8qIEV2ZW4gdGhvdWdoIHN1cHBsaWNhbnQgZG9lc24ndCBwcm92aWRlIGFueSBTU0lEcywgbl9zc2lkcyBpcyBzZXQgdG8gMS4KKyAgICAgICAgICogQmVjYXN1ZSBvZiB0aGlzLCBkcml2ZXIgaXMgYXNzdW1pbmcgdGhhdCB0aGlzIGlzIG5vdCB3aWxkY2FyZCBzY2FuIGFuZCBzbworICAgICAgICAgKiBpcyBub3QgYWdpbmcgb3V0IHRoZSBzY2FuIHJlc3VsdHMuCisgICAgICAgICAqLworICAgICAgICBpZiAoJ1wwJyA9PSByZXF1ZXN0LT5zc2lkcy0+c3NpZFswXSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVxdWVzdC0+bl9zc2lkcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoMCA8IHJlcXVlc3QtPm5fc3NpZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRDc3JTU0lESW5mbyAqU3NpZEluZm87CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIHNjYW5SZXF1ZXN0LlNTSURzLm51bU9mU1NJRHMgPSByZXF1ZXN0LT5uX3NzaWRzOworICAgICAgICAgICAgLyogQWxsb2NhdGUgbnVtX3NzaWQgdENzclNTSURJbmZvIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgU3NpZEluZm8gPSBzY2FuUmVxdWVzdC5TU0lEcy5TU0lETGlzdCA9CisgICAgICAgICAgICAgICAgICAgICAgKCB0Q3NyU1NJREluZm8gKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPm5fc3NpZHMqc2l6ZW9mKHRDc3JTU0lESW5mbykpOworCisgICAgICAgICAgICBpZihOVUxMID09IHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSBhbGxvYyBmYWlsZWQgU1NJREluZm8gYnVmZmVyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNvcHkgYWxsIHRoZSBzc2lkJ3MgYW5kIHRoZWlyIGxlbmd0aCAqLworICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgcmVxdWVzdC0+bl9zc2lkczsgaisrLCBTc2lkSW5mbysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgc3NpZCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICBTc2lkSW5mby0+U1NJRC5sZW5ndGggPSByZXF1ZXN0LT5zc2lkc1tqXS5zc2lkX2xlbjsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoU3NpZEluZm8tPlNTSUQuc3NJZCwgJnJlcXVlc3QtPnNzaWRzW2pdLnNzaWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzaWRJbmZvLT5TU0lELmxlbmd0aCk7CisgICAgICAgICAgICAgICAgU3NpZEluZm8tPlNTSUQuc3NJZFtTc2lkSW5mby0+U1NJRC5sZW5ndGhdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIlNTSUQgbnVtYmVyICVkOiAgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgU3NpZEluZm8tPlNTSUQuc3NJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBzZXQgdGhlIHNjYW4gdHlwZSB0byBhY3RpdmUgKi8KKyAgICAgICAgICAgIHNjYW5SZXF1ZXN0LnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKFdMQU5fSEREX1AyUF9HTyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNldCB0aGUgc2NhbiB0eXBlIHRvIGFjdGl2ZSAqLworICAgICAgICAgICAgc2NhblJlcXVlc3Quc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLypTZXQgdGhlIHNjYW4gdHlwZSB0byBkZWZhdWx0IHR5cGUsIGluIHRoaXMgY2FzZSBpdCBpcyBBQ1RJVkUqLworICAgICAgICAgICAgc2NhblJlcXVlc3Quc2NhblR5cGUgPSBwU2NhbkluZm8tPnNjYW5fbW9kZTsKKyAgICAgICAgfQorICAgICAgICBzY2FuUmVxdWVzdC5taW5DaG5UaW1lID0gY2ZnX3BhcmFtLT5uQWN0aXZlTWluQ2huVGltZTsgCisgICAgICAgIHNjYW5SZXF1ZXN0Lm1heENoblRpbWUgPSBjZmdfcGFyYW0tPm5BY3RpdmVNYXhDaG5UaW1lOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBzZXQgdGhlIHNjYW4gdHlwZSB0byBhY3RpdmUgKi8KKyAgICAgICAgc2NhblJlcXVlc3Quc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgICAgICB2b3NfbWVtX3NldCggc2NhblJlcXVlc3QuYnNzaWQsIHNpemVvZiggdENzckJzc2lkICksIDB4ZmYgKTsKKworICAgICAgICAvKiBzZXQgbWluIGFuZCBtYXggY2hhbm5lbCB0aW1lIHRvIHplcm8gKi8KKyAgICAgICAgc2NhblJlcXVlc3QubWluQ2huVGltZSA9IDA7CisgICAgICAgIHNjYW5SZXF1ZXN0Lm1heENoblRpbWUgPSAwOworICAgIH0KKworICAgIC8qIHNldCBCU1NUeXBlIHRvIGRlZmF1bHQgdHlwZSAqLworICAgIHNjYW5SZXF1ZXN0LkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0FOWTsKKworICAgIC8qVE9ETzogc2NhbiB0aGUgcmVxdWVzdGVkIGNoYW5uZWxzIG9ubHkqLworCisgICAgLypSaWdodCBub3cgc2Nhbm5pbmcgYWxsIHRoZSBjaGFubmVscyAqLworICAgIGlmKCByZXF1ZXN0ICkKKyAgICB7CisgICAgICAgIGlmKCByZXF1ZXN0LT5uX2NoYW5uZWxzICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhbm5lbExpc3QgPSB2b3NfbWVtX21hbGxvYyggcmVxdWVzdC0+bl9jaGFubmVscyApOworICAgICAgICAgICAgaWYoIE5VTEwgPT0gY2hhbm5lbExpc3QgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgZ290byBmcmVlX21lbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpID0gMCA7IGkgPCByZXF1ZXN0LT5uX2NoYW5uZWxzIDsgaSsrICkKKyAgICAgICAgICAgICAgICBjaGFubmVsTGlzdFtpXSA9IHJlcXVlc3QtPmNoYW5uZWxzW2ldLT5od192YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSByZXF1ZXN0LT5uX2NoYW5uZWxzOworICAgICAgICBzY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IGNoYW5uZWxMaXN0OworCisgICAgICAgIC8qIHNldCByZXF1ZXN0VHlwZSB0byBmdWxsIHNjYW4gKi8KKyAgICAgICAgc2NhblJlcXVlc3QucmVxdWVzdFR5cGUgPSBlQ1NSX1NDQU5fUkVRVUVTVF9GVUxMX1NDQU47CisKKyAgICAgICAgaWYoIHJlcXVlc3QtPmllX2xlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNhdmUgdGhpcyBmb3IgZnV0dXJlIGFzc29jaWF0aW9uIChqb2luIHJlcXVpcmVzIHRoaXMpICovCisgICAgICAgICAgICBtZW1zZXQoICZwU2NhbkluZm8tPnNjYW5BZGRJRSwgMCwgc2l6ZW9mKHBTY2FuSW5mby0+c2NhbkFkZElFKSApOworICAgICAgICAgICAgbWVtY3B5KCBwU2NhbkluZm8tPnNjYW5BZGRJRS5hZGRJRWRhdGEsIHJlcXVlc3QtPmllLCByZXF1ZXN0LT5pZV9sZW4pOworICAgICAgICAgICAgcFNjYW5JbmZvLT5zY2FuQWRkSUUubGVuZ3RoID0gcmVxdWVzdC0+aWVfbGVuOworCisgICAgICAgICAgICBpZigoV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisgICAgICAgICAgICAgICAgKFdMQU5fSEREX1AyUF9DTElFTlQgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUucEFkZElFU2NhbiA9IHBTY2FuSW5mby0+c2NhbkFkZElFLmFkZElFZGF0YTsKKyAgICAgICAgICAgICAgIHB3ZXh0QnVmLT5yb2FtUHJvZmlsZS5uQWRkSUVTY2FuTGVuZ3RoID0gcFNjYW5JbmZvLT5zY2FuQWRkSUUubGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY2FuUmVxdWVzdC51SUVGaWVsZExlbiA9IHBTY2FuSW5mby0+c2NhbkFkZElFLmxlbmd0aDsKKyAgICAgICAgICAgIHNjYW5SZXF1ZXN0LnBJRUZpZWxkID0gcFNjYW5JbmZvLT5zY2FuQWRkSUUuYWRkSUVkYXRhOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgcFAycEllID0gd2xhbl9oZGRfZ2V0X3AycF9pZV9wdHIoKHZfVThfdCopcmVxdWVzdC0+aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+aWVfbGVuKTsKKyAgICAgICAgICAgIGlmIChwUDJwSWUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIChyZXF1ZXN0LT5uX3NzaWRzID09IDEpICYmIAorICAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3QtPnNzaWRzWzBdLnNzaWRfbGVuID09IFAyUF9XSUxEQ0FSRF9TU0lEX0xFTikgJiYKKyAgICAgICAgICAgICAgICAgICAgICFtZW1jbXAocmVxdWVzdC0+c3NpZHNbMF0uc3NpZCwgUDJQX1dJTERDQVJEX1NTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAyUF9XSUxEQ0FSRF9TU0lEX0xFTiApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBzZXNzaW9uSWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFRoaXMgaXMgYSBQMlAgU2VhcmNoIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICBzY2FuUmVxdWVzdC5wMnBTZWFyY2ggPSAxOworICAgICAgICAgICAgICAgICAgICBwU2NhbkluZm8tPnAycFNlYXJjaCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgLyogc2V0IHJlcXVlc3RUeXBlIHRvIFAyUCBEaXNjb3ZlcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgc2NhblJlcXVlc3QucmVxdWVzdFR5cGUgPSBlQ1NSX1NDQU5fUDJQX0RJU0NPVkVSWTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBIZGRDdHgtPmNmZ19pbmktPmlzUDJwRGV2aWNlQWRkckFkbWluaXN0cmF0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHBBZGFwdGVyLT5wMnBTZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc21lX1NjYW5GbHVzaFJlc3VsdCggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICBJTklUX0NPTVBMRVRJT04ocFNjYW5JbmZvLT5zY2FuX3JlcV9jb21wbGV0aW9uX2V2ZW50KTsKKworICAgIGlmICgocEhkZEN0eC0+Y2ZnX2luaS0+aXNQMnBEZXZpY2VBZGRyQWRtaW5pc3RyYXRlZCkgJiYKKyAgICAgICAgKHNjYW5SZXF1ZXN0LnAycFNlYXJjaCkpCisgICAgeworICAgICAgICBzdGF0dXMgPSBzbWVfU2NhblJlcXVlc3QoIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5wMnBTZXNzaW9uSWQsICZzY2FuUmVxdWVzdCwgJnNjYW5JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZGRfY2ZnODAyMTFfc2Nhbl9kb25lX2NhbGxiYWNrLCBkZXYgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gc21lX1NjYW5SZXF1ZXN0KCBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCAmc2NhblJlcXVlc3QsICZzY2FuSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGRkX2NmZzgwMjExX3NjYW5fZG9uZV9jYWxsYmFjaywgZGV2ICk7CisgICAgfQorICAgIAorICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBzbWVfU2NhblJlcXVlc3QgcmV0dXJuZWQgZXJyb3IgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgY29tcGxldGUoJnBTY2FuSW5mby0+c2Nhbl9yZXFfY29tcGxldGlvbl9ldmVudCk7CisgICAgICAgIHN0YXR1cyA9IC1FSU87CisgICAgICAgIGdvdG8gZnJlZV9tZW07CisgICAgfQorCisgICAgcFNjYW5JbmZvLT5tU2NhblBlbmRpbmcgPSBUUlVFOworICAgIHBBZGFwdGVyLT5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICBwU2NhbkluZm8tPnNjYW5JZCA9IHNjYW5JZDsKKworICAgIGNvbXBsZXRlKCZwU2NhbkluZm8tPnNjYW5fcmVxX2NvbXBsZXRpb25fZXZlbnQpOworCitmcmVlX21lbToKKyAgICBpZiggc2NhblJlcXVlc3QuU1NJRHMuU1NJRExpc3QgKQorICAgIHsKKyAgICAgICAgdm9zX21lbV9mcmVlKHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0KTsKKyAgICB9CisKKyAgICBpZiggY2hhbm5lbExpc3QgKQorICAgICAgdm9zX21lbV9mcmVlKCBjaGFubmVsTGlzdCApOworCisgICAgRVhJVCgpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9jb25uZWN0X3N0YXJ0CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgdGhlIGFzc29jaWF0aW9uIHByb2Nlc3MgCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9jb25uZWN0X3N0YXJ0KCBoZGRfYWRhcHRlcl90ICAqcEFkYXB0ZXIsIAorICAgICAgICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLCBjb25zdCB1OCAqYnNzaWQpCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZTsKKyAgICB2X1UzMl90IHJvYW1JZDsKKyAgICB0Q3NyUm9hbVByb2ZpbGUgKnBSb2FtUHJvZmlsZTsKKyAgICBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGUgY29ubmVjdGVkQnNzVHlwZTsKKyAgICBlQ3NyQXV0aFR5cGUgUlNOQXV0aFR5cGU7CisKKyAgICBFTlRFUigpOworCisgICAgcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICAgCisgICAgaWYgKFNJUl9NQUNfTUFYX1NTSURfTEVOR1RIIDwgc3NpZF9sZW4pCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHdyb25nIFNTSUQgbGVuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisKKyAgICBpZiAocFJvYW1Qcm9maWxlKSAKKyAgICB7CisgICAgICAgIGlmIChoZGRfY29ubkdldENvbm5lY3RlZEJzc1R5cGUoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlciksCisgICAgICAgICAgICAmY29ubmVjdGVkQnNzVHlwZSApIHx8ICggZU1pYl9kb3QxMURlc2lyZWRCc3NUeXBlX2luZGVwZW5kZW50ID09IAorICAgICAgICAgICAgICBjb25uZWN0ZWRCc3NUeXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogSXNzdWUgZGlzY29ubmVjdCB0byBDU1IgKi8KKyAgICAgICAgICAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3Zhcik7CisgICAgICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAKKyAgICAgICAgICAgICAgICAgIHNtZV9Sb2FtRGlzY29ubmVjdCggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICZwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKEhERF9XTU1fVVNFUl9NT0RFX05PX1FPUyA9PSAKKyAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPldtbU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUW9TIG5vdCBlbmFibGVkIGluIGNmZyBmaWxlKi8KKyAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+dWFwc2RfbWFzayA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKlFvUyBlbmFibGVkLCB1cGRhdGUgdWFwc2QgbWFzayBmcm9tIGNmZyBmaWxlKi8KKyAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+dWFwc2RfbWFzayA9IAorICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+VWFwc2RNYXNrOworICAgICAgICB9CisKKyAgICAgICAgcFJvYW1Qcm9maWxlLT5TU0lEcy5udW1PZlNTSURzID0gMTsKKyAgICAgICAgcFJvYW1Qcm9maWxlLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5sZW5ndGggPSBzc2lkX2xlbjsKKyAgICAgICAgdm9zX21lbV96ZXJvKHBSb2FtUHJvZmlsZS0+U1NJRHMuU1NJRExpc3QtPlNTSUQuc3NJZCwKKyAgICAgICAgICAgICAgICBzaXplb2YocFJvYW1Qcm9maWxlLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5zc0lkKSk7IAorICAgICAgICB2b3NfbWVtX2NvcHkoKHZvaWQgKikocFJvYW1Qcm9maWxlLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5zc0lkKSwKKyAgICAgICAgICAgICAgICBzc2lkLCBzc2lkX2xlbik7CisKKyAgICAgICAgaWYgKGJzc2lkKQorICAgICAgICB7CisgICAgICAgICAgICBwUm9hbVByb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEcyA9IDE7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoKHZvaWQgKikocFJvYW1Qcm9maWxlLT5CU1NJRHMuYnNzaWQpLCBic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgV05JX0NGR19CU1NJRF9MRU4pOworICAgICAgICAgICAgLyogU2F2ZSBCU1NJRCBpbiBzZXBlcmF0ZSB2YXJpYWJsZSBhcyB3ZWxsLCBhcyBSb2FtUHJvZmlsZSAKKyAgICAgICAgICAgICAgIEJTU0lEIGlzIGdldHRpbmcgemVyb2VkIG91dCBpbiB0aGUgYXNzb2NpYXRpb24gcHJvY2Vzcy4gQW5kIGluIAorICAgICAgICAgICAgICAgY2FzZSBvZiBqb2luIGZhaWx1cmUgd2Ugc2hvdWxkIHNlbmQgdmFsaWQgQlNTSUQgdG8gc3VwcGxpY2FudAorICAgICAgICAgICAgICovCisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoKHZvaWQgKikocFdleHRTdGF0ZS0+cmVxX2Jzc0lkKSwgYnNzaWQsCisgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfQlNTSURfTEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEgPT0gcFdleHRTdGF0ZS0+d3BhVmVyc2lvbikgfHwKKyAgICAgICAgICAgICAgICAoSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyID09IHBXZXh0U3RhdGUtPndwYVZlcnNpb24pKQorICAgICAgICB7IAorICAgICAgICAgICAgLypzZXQgZ2VuIGllKi8KKyAgICAgICAgICAgIGhkZF9TZXRHRU5JRVRvQ3NyKHBBZGFwdGVyLCAmUlNOQXV0aFR5cGUpOworICAgICAgICAgICAgLypzZXQgYXV0aCovCisgICAgICAgICAgICBoZGRfc2V0X2Nzcl9hdXRoX3R5cGUocEFkYXB0ZXIsIFJTTkF1dGhUeXBlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkF1dGhUeXBlLmF1dGhUeXBlWzBdID09IAorICAgICAgICAgICAgICAgICAgICBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSkKKyAgICAgICAgICAgICAgICAmJiAoKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID09IAorICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZKSAKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID09IAorICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWSkpCisgICAgICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKkFuZHJvaWQgVUkgbm90IGhhdmluZyBhbnkgb3B0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgQXV0aGVudGljYXRpb24gdHlwZSB0byBPUEVOL1NIQVJFRDsKKyAgICAgICAgICAgICAqIFRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIHdpbGwgYmUgYWx3YXlzIGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNIHdoZW4gV0VQIGlzIHVzZWQKKyAgICAgICAgICAgICAqIFVzZSBlQ1NSX0FVVEhfVFlQRV9BVVRPU1dJVENIIHdoZW4gV0VQIGVuY3J5cHRpb24gdXNlZCovCisgICAgICAgICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uYXV0aFR5cGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9BVVRIX1RZUEVfQVVUT1NXSVRDSDsKKyAgICAgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gCisgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uYXV0aFR5cGU7CisgICAgICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgICAgICBpZiAocEFkYXB0ZXItPndhcGlfaW5mby5uV2FwaU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhMT0cxLCAiJXM6IFNldHRpbmcgV0FQSSBBVVRIIFR5cGUgYW5kIEVuY3J5cHRpb24gTW9kZSB2YWx1ZXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgc3dpdGNoIChwQWRhcHRlci0+d2FwaV9pbmZvLndhcGlBdXRoTW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFdBUElfQVVUSF9NT0RFX1BTSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhkZExvZyhMT0cxLCAiJXM6IFdBUEkgQVVUSCBUWVBFOiBQU0s6ICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUpOworICAgICAgICAgICAgICAgICAgICBwUm9hbVByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfUFNLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBXQVBJX0FVVEhfTU9ERV9DRVJUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPRzEsICIlczogV0FQSSBBVVRIIFRZUEU6IENFUlQ6ICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT53YXBpX2luZm8ud2FwaUF1dGhNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5hdXRoVHlwZVswXSA9IGVDU1JfQVVUSF9UWVBFX1dBUElfV0FJX0NFUlRJRklDQVRFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIEVuZCBvZiBzd2l0Y2gKKyAgICAgICAgICAgIGlmICggcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUgPT0gV0FQSV9BVVRIX01PREVfUFNLIHx8CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPndhcGlfaW5mby53YXBpQXV0aE1vZGUgPT0gV0FQSV9BVVRIX01PREVfQ0VSVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIiVzOiBXQVBJIFBBSVJXSVNFL0dST1VQIEVOQ1JZUFRJT046IFdQSSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICAgICAgICAgICAgICBwUm9hbVByb2ZpbGUtPkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworICAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk7CisgICAgICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworICAgICAgICAgICAgICAgIHBSb2FtUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IGVDU1JfRU5DUllQVF9UWVBFX1dQSTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisgICAgICAgIHBSb2FtUHJvZmlsZS0+Y3NyUGVyc29uYSA9IHBBZGFwdGVyLT5kZXZpY2VfbW9kZTsKKworICAgICAgICBzdGF0dXMgPSBzbWVfUm9hbUNvbm5lY3QoIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCwgcFJvYW1Qcm9maWxlLCAmcm9hbUlkKTsKKworICAgICAgICBwUm9hbVByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsgCisgICAgICAgIHBSb2FtUHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm8gdmFsaWQgUm9hbSBwcm9maWxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgRVhJVCgpOyAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX3NldF9jZmc4MDIxMV9hdXRoX3R5cGUKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgKE9QRU4vU0hBUkVEKS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2F1dGhfdHlwZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKyAgICAgICAgZW51bSBubDgwMjExX2F1dGhfdHlwZSBhdXRoX3R5cGUpCit7CisgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7ICAgCisgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKworICAgIEVOVEVSKCk7CisKKyAgICAvKnNldCBhdXRoZW50aWNhdGlvbiB0eXBlKi8KKyAgICBzd2l0Y2ggKGF1dGhfdHlwZSkgCisgICAgeworICAgICAgICBjYXNlIE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU06CisgICAgICAgIGNhc2UgTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUM6CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICAgICAgICAiJXM6IHNldCBhdXRoZW50aWNhdGlvbiB0eXBlIHRvIE9QRU4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZOgorICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBzZXQgYXV0aGVudGljYXRpb24gdHlwZSB0byBTSEFSRUQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICBjYXNlIE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA6CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogc2V0IGF1dGhlbnRpY2F0aW9uIHR5cGUgdG8gQ0NLTSBXUEEiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQTsvL2VDU1JfQVVUSF9UWVBFX0NDS01fUlNOIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgd2VsbCBpZiByZXF1aXJlZC4KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICIlczogVW5zdXBwb3J0ZWQgYXV0aGVudGljYXRpb24gdHlwZSAlZCIsIF9fZnVuY19fLCAKKyAgICAgICAgICAgICAgICAgICAgYXV0aF90eXBlKTsKKyAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX1VOS05PV047CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5BdXRoVHlwZS5hdXRoVHlwZVswXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9zZXRfYWttX3N1aXRlCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBrZXkgbWdtdCB0eXBlKFBTSy84MDIxeCkuCisgKgorICovCitzdGF0aWMgaW50IHdsYW5faGRkX3NldF9ha21fc3VpdGUoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGtleV9tZ210CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICBFTlRFUigpOworICAgIAorICAgIC8qc2V0IGtleSBtZ210IHR5cGUqLworICAgIHN3aXRjaChrZXlfbWdtdCkKKyAgICB7CisgICAgICAgIGNhc2UgV0xBTl9BS01fU1VJVEVfUFNLOgorICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IHNldHRpbmcga2V5IG1nbXQgdHlwZSB0byBQU0siLCAKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICAgICAgcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgfD0gSVdfQVVUSF9LRVlfTUdNVF9QU0s7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdMQU5fQUtNX1NVSVRFXzgwMjFYOgorICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IHNldHRpbmcga2V5IG1nbXQgdHlwZSB0byA4MDIxeCIsIAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgICAgICBwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCB8PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWDsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyNkZWZpbmUgV0xBTl9BS01fU1VJVEVfQ0NLTSAgICAgICAgIDB4MDA0MDk2MDAgLyogU2hvdWxkIGJlIGluIGllZWU4MDJfMTFfZGVmcy5oICovCisjZGVmaW5lIElXX0FVVEhfS0VZX01HTVRfQ0NLTSAgICAgICA4ICAvKiBTaG91bGQgYmUgaW4gbGludXgvd2lyZWxlc3MuaCAqLworICAgICAgICBjYXNlIFdMQU5fQUtNX1NVSVRFX0NDS006CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogc2V0dGluZyBrZXkgbWdtdCB0eXBlIHRvIENDS00iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHBXZXh0U3RhdGUtPmF1dGhLZXlNZ210IHw9IElXX0FVVEhfS0VZX01HTVRfQ0NLTTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogVW5zdXBwb3J0ZWQga2V5IG1nbXQgdHlwZSAlZCIsIAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywga2V5X21nbXQpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2NpcGhlcgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgZW5jcnlwdGlvbiB0eXBlIAorICogKE5PTkUvV0VQNDAvV0VQMTA0L1RLSVAvQ0NNUCkuCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2NpcGhlciggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY2lwaGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1Y2FzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgZUNzckVuY3J5cHRpb25UeXBlIGVuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsgICAKKyAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCisgICAgRU5URVIoKTsKKworICAgIGlmICghY2lwaGVyKSAKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogcmVjZWl2ZWQgY2lwaGVyICVkIC0gY29uc2lkZXJpbmcgbm9uZSIsIAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjaXBoZXIpOworICAgICAgICBlbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgCisgICAgICAgIC8qc2V0IGVuY3J5cHRpb24gbWV0aG9kKi8KKyAgICAgICAgc3dpdGNoIChjaXBoZXIpIAorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElXX0FVVEhfQ0lQSEVSX05PTkU6CisgICAgICAgICAgICAgICAgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAorICAgICAgICAgICAgY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKKyAgICAgICAgICAgICAgICBpZiAoKElXX0FVVEhfS0VZX01HTVRfODAyXzFYID09IHBXZXh0U3RhdGUtPmF1dGhLZXlNZ210KSAmJiAKKyAgICAgICAgICAgICAgICAgICAgKGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkpCisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAKKyAgICAgICAgICAgIGNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgorICAgICAgICAgICAgICAgIGlmICgoSVdfQVVUSF9LRVlfTUdNVF84MDJfMVggPT0gcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQpICYmIAorICAgICAgICAgICAgICAgICAgICAoZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0gPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCisgICAgICAgICAgICBjYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisgICAgICAgICAgICAgICAgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAorICAgICAgICAgICAgY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorICAgICAgICAgICAgICAgIGVuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgIGNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfU01TNDoKKyAgICAgICAgICAgIGVuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV1BJOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9LUks6CisgICAgICAgICAgICBlbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0tSSzsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogVW5zdXBwb3J0ZWQgY2lwaGVyIHR5cGUgJWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjaXBoZXIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh1Y2FzdCkKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBzZXR0aW5nIHVuaWNhc3QgY2lwaGVyIHR5cGUgdG8gJWQiLCAKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZW5jcnlwdGlvblR5cGUpOworICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8udWNFbmNyeXB0aW9uVHlwZSAgICAgICAgICAgID0gZW5jcnlwdGlvblR5cGU7CisgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvblR5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBzZXR0aW5nIG1jYXN0IGNpcGhlciB0eXBlIHRvICVkIiwgCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGVuY3J5cHRpb25UeXBlKTsKKyAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm1jRW5jcnlwdGlvblR5cGUgICAgICAgICAgICAgICAgICAgICAgID0gZW5jcnlwdGlvblR5cGU7CisgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm1jRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyAgICAgICAgPSAxOworICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gZW5jcnlwdGlvblR5cGU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfaWUKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXJzZSBXUEEvUlNOIElFJ3MuCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfaWUoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICppZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaWVfbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICAgdTggKmdlbmllID0gaWU7CisgICAgdl9VMTZfdCByZW1MZW4gPSBpZV9sZW47CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICB2X1UzMl90IGFrbXN1aXRlW01BWF9OVU1fQUtNX1NVSVRFU107CisgICAgdTE2ICp0bXA7CisgICAgdl9VMTZfdCBha21zdWl0ZUNvdW50OworICAgIGludCAqYWttbGlzdDsKKyNlbmRpZgorICAgIEVOVEVSKCk7CisKKyAgICAvKiBjbGVhciBwcmV2aW91cyBhc3NvY0FkZElFICovCisgICAgcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggPSAwOworICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLmJXUFNBc3NvY2lhdGlvbiA9IFZPU19GQUxTRTsKKworICAgIHdoaWxlIChyZW1MZW4gPj0gMikKKyAgICB7CisgICAgICAgIHZfVTE2X3QgZUxlbiA9IDA7CisgICAgICAgIHZfVThfdCBlbGVtZW50SWQ7CisgICAgICAgIGVsZW1lbnRJZCA9ICpnZW5pZSsrOworICAgICAgICBlTGVuICA9ICpnZW5pZSsrOworICAgICAgICByZW1MZW4gLT0gMjsKKyAgICAKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IElFWzB4JVhdLCBMRU5bJWRdXG4iLCAKKyAgICAgICAgICAgIF9fZnVuY19fLCBlbGVtZW50SWQsIGVMZW4pOworICAgICAgICAgCisgICAgICAgIHN3aXRjaCAoIGVsZW1lbnRJZCApIAorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIERPVDExRl9FSURfV1BBOiAKKyAgICAgICAgICAgICAgICBpZiAoKDIrNCkgPiBlTGVuKSAvKiBzaG91bGQgaGF2ZSBhdCBsZWFzdCBPVUkgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFdQQSBJRSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKDAgPT0gbWVtY21wKCZnZW5pZVswXSwgIlx4MDBceDUwXHhmMlx4MDQiLCA0KSkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2X1UxNl90IGN1ckFkZElFTGVuID0gcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGhkZExvZyAoVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyBTZXQgV1BTIElFKGxlbiAlZCkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZUxlbiArIDIpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYoIFNJUl9NQUNfTUFYX0lFX0xFTkdUSCA8IChwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aCArIGVMZW4pICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiQ2Fubm90IGFjY29tYWRhdGUgYXNzb2NBZGRJRS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgYmlnZ2VyIGJ1ZmZlciBzcGFjZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFdTQyBJRSBpcyBzYXZlZCB0byBBZGRpdGlvbmFsIElFIDsgaXQgc2hvdWxkIGJlIGFjY3VtdWxhdGVkIHRvIGhhbmRsZSBXUFMgSUUgKyBQMlAgSUUKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YSArIGN1ckFkZElFTGVuLCBnZW5pZSAtIDIsIGVMZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5sZW5ndGggKz0gZUxlbiArIDI7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5iV1BTQXNzb2NpYXRpb24gPSBWT1NfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFQXNzb2MgPSBwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubkFkZElFQXNzb2NMZW5ndGggPSBwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoMCA9PSBtZW1jbXAoJmdlbmllWzBdLCAiXHgwMFx4NTBceGYyIiwgMykpIAorICAgICAgICAgICAgICAgIHsgIAorICAgICAgICAgICAgICAgICAgICBoZGRMb2cgKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXMgU2V0IFdQQSBJRSAobGVuICVkKSIsX19mdW5jX18sIGVMZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCBwV2V4dFN0YXRlLT5XUEFSU05JRSwgMCwgTUFYX1dQQV9SU05fSUVfTEVOICk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSggcFdleHRTdGF0ZS0+V1BBUlNOSUUsIGdlbmllIC0gMiwgKGVMZW4gKyAyKSAvKmllX2xlbiovKTsKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucFdQQVJlcUlFID0gcFdleHRTdGF0ZS0+V1BBUlNOSUU7CisgICAgICAgICAgICAgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5XUEFSZXFJRUxlbmd0aCA9IGVMZW4gKyAyOy8vaWVfbGVuOworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgwID09IG1lbWNtcCgmZ2VuaWVbMF0sIFAyUF9PVUlfVFlQRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQMlBfT1VJX1RZUEVfU0laRSkpIAorICAgICAgICAgICAgICAgICAgICAgICAgLypDb25zaWRlciBQMlAgSUUsIG9ubHkgZm9yIFAyUCBDbGllbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZfVTE2X3QgY3VyQWRkSUVMZW4gPSBwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nIChWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIFNldCBQMlAgSUUobGVuICVkKSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBlTGVuICsgMik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiggU0lSX01BQ19NQVhfSUVfTEVOR1RIIDwgKHBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoICsgZUxlbikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICJDYW5ub3QgYWNjb21hZGF0ZSBhc3NvY0FkZElFICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIGJpZ2dlciBidWZmZXIgc3BhY2VcbiIpOworICAgICAgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBQMlAgSUUgaXMgc2F2ZWQgdG8gQWRkaXRpb25hbCBJRSA7IGl0IHNob3VsZCBiZSBhY2N1bXVsYXRlZCB0byBoYW5kbGUgV1BTIElFICsgUDJQIElFCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSggcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5hZGRJRWRhdGEgKyBjdXJBZGRJRUxlbiwgZ2VuaWUgLSAyLCBlTGVuICsgMik7CisgICAgICAgICAgICAgICAgICAgIHBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoICs9IGVMZW4gKyAyOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFQXNzb2MgPSBwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubkFkZElFQXNzb2NMZW5ndGggPSBwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfV0ZECisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgwID09IG1lbWNtcCgmZ2VuaWVbMF0sIFdGRF9PVUlfVFlQRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRkRfT1VJX1RZUEVfU0laRSkpIAorICAgICAgICAgICAgICAgICAgICAgICAgLypDb25zaWRlciBXRkQgSUUsIG9ubHkgZm9yIFAyUCBDbGllbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZfVTE2X3QgY3VyQWRkSUVMZW4gPSBwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nIChWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIFNldCBXRkQgSUUobGVuICVkKSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBlTGVuICsgMik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiggU0lSX01BQ19NQVhfSUVfTEVOR1RIIDwgKHBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoICsgZUxlbikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICJDYW5ub3QgYWNjb21hZGF0ZSBhc3NvY0FkZElFICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIGJpZ2dlciBidWZmZXIgc3BhY2VcbiIpOworICAgICAgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBXRkQgSUUgaXMgc2F2ZWQgdG8gQWRkaXRpb25hbCBJRSA7IGl0IHNob3VsZCBiZSBhY2N1bXVsYXRlZCB0byBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgLy8gV1BTIElFICsgUDJQIElFICsgV0ZEIElFCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSggcFdleHRTdGF0ZS0+YXNzb2NBZGRJRS5hZGRJRWRhdGEgKyBjdXJBZGRJRUxlbiwgZ2VuaWUgLSAyLCBlTGVuICsgMik7CisgICAgICAgICAgICAgICAgICAgIHBXZXh0U3RhdGUtPmFzc29jQWRkSUUubGVuZ3RoICs9IGVMZW4gKyAyOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFQXNzb2MgPSBwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmFkZElFZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubkFkZElFQXNzb2NMZW5ndGggPSBwV2V4dFN0YXRlLT5hc3NvY0FkZElFLmxlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRE9UMTFGX0VJRF9SU046CisgICAgICAgICAgICAgICAgaGRkTG9nIChWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIFNldCBSU04gSUUobGVuICVkKSIsX19mdW5jX18sIGVMZW4gKyAyKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoIHBXZXh0U3RhdGUtPldQQVJTTklFLCAwLCBNQVhfV1BBX1JTTl9JRV9MRU4gKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoIHBXZXh0U3RhdGUtPldQQVJTTklFLCBnZW5pZSAtIDIsIChlTGVuICsgMikvKmllX2xlbiovKTsKKyAgICAgICAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5wUlNOUmVxSUUgPSBwV2V4dFN0YXRlLT5XUEFSU05JRTsKKyAgICAgICAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uUlNOUmVxSUVMZW5ndGggPSBlTGVuICsgMjsgLy9pZV9sZW47CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfV0FQSToKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+d2FwaV9pbmZvLm5XYXBpTW9kZSA9IDE7ICAgLy9TZXR0aW5nIFdBUEkgTW9kZSB0byBPTj0xCisgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCJXQVBJIE1PREUgSVMgICVsdSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+d2FwaV9pbmZvLm5XYXBpTW9kZSk7CisgICAgICAgICAgICAgICAgdG1wID0gKHUxNiAqKWllOworICAgICAgICAgICAgICAgIHRtcCA9IHRtcCArIDI7IC8vIFNraXAgZWxlbWVudCBJZCBhbmQgTGVuLCBWZXJzaW9uICAgICAgICAKKyAgICAgICAgICAgICAgICBha21zdWl0ZUNvdW50ID0gV1BBX0dFVF9MRTE2KHRtcCk7CisgICAgICAgICAgICAgICAgdG1wID0gdG1wICsgMTsKKyAgICAgICAgICAgICAgICBha21saXN0ID0gKGludCAqKSh0bXApOworICAgICAgICAgICAgICAgIGlmKGFrbXN1aXRlQ291bnQgPD0gTUFYX05VTV9BS01fU1VJVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGFrbXN1aXRlLCBha21saXN0LCAoNCpha21zdWl0ZUNvdW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICJJbnZhbGlkIGFrbVN1aXRlIGNvdW50XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKFdBUElfUFNLX0FLTV9TVUlURSA9PSBha21zdWl0ZVswXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBXQVBJIEFVVEggTU9ERSBTRVQgVE8gUFNLIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT53YXBpX2luZm8ud2FwaUF1dGhNb2RlID0gV0FQSV9BVVRIX01PREVfUFNLOworICAgICAgICAgICAgICAgIH0gICAgCisgICAgICAgICAgICAgICAgaWYgKFdBUElfQ0VSVF9BS01fU1VJVEUgPT0gYWttc3VpdGVbMF0pCisgICAgICAgICAgICAgICAgeyAgICAgCisgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBXQVBJIEFVVEggTU9ERSBTRVQgVE8gQ0VSVElGSUNBVEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT53YXBpX2luZm8ud2FwaUF1dGhNb2RlID0gV0FQSV9BVVRIX01PREVfQ0VSVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGRkTG9nIChWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIFNldCBVTktOT1dOIElFICVYIiwgX19mdW5jX18sIGVsZW1lbnRJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZ2VuaWUgKz0gZUxlbjsKKyAgICAgICAgcmVtTGVuIC09IGVMZW47CisgICAgfQorICAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcHJpdmFjeQorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlY3VyaXR5IAorICogcGFyYW1ldGVycyBkdXJpbmcgY29ubmVjdCBvcGVyYXRpb24uCisgKi8KK2ludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcHJpdmFjeSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKnJlcQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7ICAgCisgICAgRU5URVIoKTsKKworICAgIC8qc2V0IHdwYSB2ZXJzaW9uKi8KKyAgICBwV2V4dFN0YXRlLT53cGFWZXJzaW9uID0gSVdfQVVUSF9XUEFfVkVSU0lPTl9ESVNBQkxFRDsKKworICAgIGlmIChyZXEtPmNyeXB0by53cGFfdmVyc2lvbnMpIAorICAgIHsKKyAgICAgICAgaWYgKCAoTkw4MDIxMV9XUEFfVkVSU0lPTl8xID09IHJlcS0+Y3J5cHRvLndwYV92ZXJzaW9ucykKKyAgICAgICAgICAgICYmICggKHJlcS0+aWVfbGVuKSAKKyAgICAgICAgICAgJiYgKDAgPT0gbWVtY21wKCAmcmVxLT5pZVsyXSwgIlx4MDBceDUwXHhmMiIsMykgKSApICkgCisgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGlzIGluY2x1ZGluZyBhIFdQQSBJRS4KKyAgICAgICAgICAgLyogQ3VycmVudGx5IE5MIGlzIHB1dHRpbmcgV1BBIHZlcnNpb24gMSBldmVuIGZvciBvcGVuLCAKKyAgICAgICAgICAgICogc2luY2UgcDJwIGllIGlzIGFsc28gcHV0IGluIHNhbWUgYnVmZmVyLgorICAgICAgICAgICAgKiAqLworICAgICAgICB7CisgICAgICAgICAgICBwV2V4dFN0YXRlLT53cGFWZXJzaW9uID0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoTkw4MDIxMV9XUEFfVkVSU0lPTl8yID09IHJlcS0+Y3J5cHRvLndwYV92ZXJzaW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgcFdleHRTdGF0ZS0+d3BhVmVyc2lvbiA9IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogc2V0IHdwYSB2ZXJzaW9uIHRvICVkIiwgX19mdW5jX18sIAorICAgICAgICAgICAgcFdleHRTdGF0ZS0+d3BhVmVyc2lvbik7CisKKyAgICAvKnNldCBhdXRoZW50aWNhdGlvbiB0eXBlKi8KKyAgICBzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfYXV0aF90eXBlKHBBZGFwdGVyLCByZXEtPmF1dGhfdHlwZSk7CisKKyAgICBpZiAoMCA+IHN0YXR1cykKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogZmFpbGVkIHRvIHNldCBhdXRoZW50aWNhdGlvbiB0eXBlICIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKnNldCBrZXkgbWdtdCB0eXBlKi8KKyAgICBpZiAocmVxLT5jcnlwdG8ubl9ha21fc3VpdGVzKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gd2xhbl9oZGRfc2V0X2FrbV9zdWl0ZShwQWRhcHRlciwgcmVxLT5jcnlwdG8uYWttX3N1aXRlc1swXSk7CisgICAgICAgIGlmICgwID4gc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGZhaWxlZCB0byBzZXQgYWttIHN1aXRlIiwgCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKnNldCBwYWlyd2lzZSBjaXBoZXIgdHlwZSovCisgICAgaWYgKHJlcS0+Y3J5cHRvLm5fY2lwaGVyc19wYWlyd2lzZSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHdsYW5faGRkX2NmZzgwMjExX3NldF9jaXBoZXIocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0sIHRydWUpOworICAgICAgICBpZiAoMCA+IHN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICIlczogZmFpbGVkIHRvIHNldCB1bmljYXN0IGNpcGhlciB0eXBlIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKlJlc2V0IHByZXZpb3VzIGNpcGhlciBzdWl0ZSB0byBub25lKi8KKyAgICAgICAgc3RhdHVzID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2NpcGhlcihwQWRhcHRlciwgMCwgdHJ1ZSk7CisgICAgICAgIGlmICgwID4gc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBmYWlsZWQgdG8gc2V0IHVuaWNhc3QgY2lwaGVyIHR5cGUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgLypzZXQgZ3JvdXAgY2lwaGVyIHR5cGUqLworICAgIHN0YXR1cyA9IHdsYW5faGRkX2NmZzgwMjExX3NldF9jaXBoZXIocEFkYXB0ZXIsIHJlcS0+Y3J5cHRvLmNpcGhlcl9ncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgICAgaWYgKDAgPiBzdGF0dXMpCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGZhaWxlZCB0byBzZXQgbWNhc3QgY2lwaGVyIHR5cGUiLCAKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLypwYXJzZSBXUEEvUlNOIElFLCBhbmQgc2V0IHRoZSBjb3JyZXNwb2luZyBmaWxlZHMgaW4gUm9hbSBwcm9maWxlKi8KKyAgICBpZiAocmVxLT5pZV9sZW4pCisgICAgeworICAgICAgICBzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfaWUocEFkYXB0ZXIsIHJlcS0+aWUsIHJlcS0+aWVfbGVuKTsKKyAgICAgICAgaWYgKCAwID4gc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGZhaWxlZCB0byBwYXJzZSB0aGUgV1BBL1JTTiBJRSIsIAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgLyppbmNhc2Ugb2YgV0VQIHNldCBkZWZhdWx0IGtleSBpbmZvcm1hdGlvbiovCisgICAgaWYgKHJlcS0+a2V5ICYmIHJlcS0+a2V5X2xlbikgCisgICAgeworICAgICAgICBpZiAoIChXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCA9PSByZXEtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdKQorICAgICAgICAgICAgICAgIHx8IChXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQgPT0gcmVxLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSkKKyAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggSVdfQVVUSF9LRVlfTUdNVF84MDJfMVggCisgICAgICAgICAgICAgICAgICAgID09IChwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYICApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogRHluYW1pYyBXRVAgbm90IHN1cHBvcnRlZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OCBrZXlfbGVuID0gcmVxLT5rZXlfbGVuOworICAgICAgICAgICAgICAgIHU4IGtleV9pZHggPSByZXEtPmtleV9pZHg7CisKKyAgICAgICAgICAgICAgICBpZiAoKGVDU1JfU0VDVVJJVFlfV0VQX0tFWVNJWkVfTUFYX0JZVEVTID49IGtleV9sZW4pIAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKENTUl9NQVhfTlVNX0tFWSA+IGtleV9pZHgpCisgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBzZXR0aW5nIGRlZmF1bHQgd2VwIGtleSwga2V5X2lkeCA9ICVodSBrZXlfbGVuICVodSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBrZXlfaWR4LCBrZXlfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy5LZXlNYXRlcmlhbFtrZXlfaWR4XVswXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLT5rZXksIGtleV9sZW4pOworICAgICAgICAgICAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5LZXlzLktleUxlbmd0aFtrZXlfaWR4XSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4KWtleV9sZW47CisgICAgICAgICAgICAgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLktleXMuZGVmYXVsdEluZGV4ID0gKHU4KWtleV9pZHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcHJpdmFjeQorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlY3VyaXR5IAorICogcGFyYW1ldGVycyBkdXJpbmcgY29ubmVjdCBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfY29ubmVjdCggc3RydWN0IHdpcGh5ICp3aXBoeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKnJlcQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoIG5kZXYgKTsgCisgICAgVk9TX1NUQVRVUyBleGl0Ym1wc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKworICAgIEVOVEVSKCk7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICIlczogZGV2aWNlX21vZGUgPSAlZFxuIixfX2Z1bmNfXyxwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCisgICAgaWYgKCAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgIC8vSW5mcmEgY29ubmVjdCBub3Qgc3VwcG9ydGVkIHdoZW4gQU1QIHRyYWZmaWMgaXMgb24uCisgICAgaWYoIFZPU19UUlVFID09IFdMQU5CQVBfQW1wU2Vzc2lvbk9uKCkgKSAKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogTm8gY29ubmVjdGlvbiB3aGVuIEFNUCBpcyBvbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyNlbmRpZgorICAgIC8qaW5pdGlhbGlzZSBzZWN1cml0eSBwYXJhbWV0ZXJzKi8KKyAgICBzdGF0dXMgPSB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcHJpdmFjeShwQWRhcHRlciwgcmVxKTsgCisKKyAgICBpZiAoIDAgPiBzdGF0dXMpCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGZhaWxlZCB0byBzZXQgc2VjdXJpdHkgcGFyYW1zIiwgCisgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vSWYgRGV2aWNlIE1vZGUgaXMgU3RhdGlvbiBDb25jdXJyZW50IFNlc3Npb25zIEV4aXQgQk1wcworICAgIC8vUDJQIE1vZGUgd2lsbCBiZSB0YWtlbiBjYXJlIGluIE9wZW4vY2xvc2UgYWRhcHRvcgorICAgIGlmKChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgJiYKKyAgICAgICAgKHZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkpCisgICAgeworICAgICAgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoIFZPU19NT0RVTEVfSURfSERELCBOVUxMICk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gcFZvc0NvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBIZGRDdHggPSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfSERELCBwVm9zQ29udGV4dCk7CisgICAgICAgICAgICBpZihOVUxMICE9IHBIZGRDdHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBleGl0Ym1wc1N0YXR1cyA9IGhkZF9kaXNhYmxlX2JtcHNfaW1wcyhwSGRkQ3R4LCBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1cyA9IHdsYW5faGRkX2NmZzgwMjExX2Nvbm5lY3Rfc3RhcnQocEFkYXB0ZXIsIHJlcS0+c3NpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEtPnNzaWRfbGVuLCByZXEtPmJzc2lkKTsKKworICAgIGlmICgwID4gc3RhdHVzKQorICAgIHsKKyAgICAgICAgLy9SZUVuYWJsZSBCTVBTIGlmIGRpc2FibGVkCisgICAgICAgIGlmKChWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gZXhpdGJtcHNTdGF0dXMpICYmCisgICAgICAgICAgICAoTlVMTCAhPSBwSGRkQ3R4KSkKKyAgICAgICAgeworICAgICAgICAgICAvL1JlRW5hYmxlIEJtcHMgYW5kIEltcHMgYmFjaworICAgICAgICAgICBoZGRfZW5hYmxlX2JtcHNfaW1wcyhwSGRkQ3R4KTsKKyAgICAgICAgfQorCisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogY29ubmVjdCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzQW1wQWxsb3dlZCA9IFZPU19GQUxTRTsKKyAgICBFWElUKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX2Rpc2Nvbm5lY3QKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpc3N1ZSBhIGRpc2Nvbm5lY3QgcmVxdWVzdCB0byBTTUUKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9kaXNjb25uZWN0KCBzdHJ1Y3Qgd2lwaHkgKndpcGh5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IHJlYXNvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoIGRldiApOyAKKyAgICB0Q3NyUm9hbVByb2ZpbGUgICpwUm9hbVByb2ZpbGUgPSAKKyAgICAgICAgICAgICAgICAgICAgJihXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpKS0+cm9hbVByb2ZpbGU7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgICAKKyAgICBFTlRFUigpOworICAgIAorICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBkZXZpY2VfbW9kZSA9ICVkXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogRGlzY29ubmVjdCBjYWxsZWQgd2l0aCByZWFzb24gY29kZSAlZCIsIAorICAgICAgICAgICAgX19mdW5jX18sIHJlYXNvbik7ICAgIAorCisgICAgaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBwUm9hbVByb2ZpbGUpCisgICAgeworICAgICAgICAvKmlzc3VlIGRpc2Nvbm5lY3QgcmVxdWVzdCB0byBTTUUsIGlmIHN0YXRpb24gaXMgaW4gY29ubmVjdGVkIHN0YXRlKi8KKyAgICAgICAgaWYgKHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUgPT0gZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkKQorICAgICAgICB7CisgICAgICAgICAgICBlQ3NyUm9hbURpc2Nvbm5lY3RSZWFzb24gcmVhc29uQ29kZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRDsKKyAgICAgICAgICAgIHN3aXRjaChyZWFzb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBXTEFOX1JFQVNPTl9NSUNfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgcmVhc29uQ29kZSA9IGVDU1JfRElTQ09OTkVDVF9SRUFTT05fTUlDX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFk6CisgICAgICAgICAgICAgICAgY2FzZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19BUF9CVVNZOgorICAgICAgICAgICAgICAgIGNhc2UgV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBOgorICAgICAgICAgICAgICAgICAgICByZWFzb25Db2RlID0gZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9ESVNBU1NPQzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQ6CisgICAgICAgICAgICAgICAgY2FzZSBXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQToKKyAgICAgICAgICAgICAgICAgICAgcmVhc29uQ29kZSA9IGVDU1JfRElTQ09OTkVDVF9SRUFTT05fREVBVVRIOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkc6CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmVhc29uQ29kZSA9IGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSA9IGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkOworICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aXNBbXBBbGxvd2VkID0gVk9TX1RSVUU7CisgICAgICAgICAgICBJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPmRpc2Nvbm5lY3RfY29tcF92YXIpOworCisgICAgICAgICAgICAvKmlzc3VlIGRpc2Nvbm5lY3QqLworICAgICAgICAgICAgc3RhdHVzID0gc21lX1JvYW1EaXNjb25uZWN0KCBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCByZWFzb25Db2RlKTsKKworICAgICAgICAgICAgaWYgKCAwICE9IHN0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNzclJvYW1EaXNjb25uZWN0IGZhaWx1cmUsIHJldHVybmVkICVkIFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKGludClzdGF0dXMgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisgICAgICAgICAgICAgICAgICAgJnBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyLAorICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworCisKKyAgICAgICAgICAgIC8qc3RvcCB0eCBxdWV1ZXMqLworICAgICAgICAgICAgbmV0aWZfdHhfZGlzYWJsZShkZXYpOworICAgICAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vIHZhbGlkIHJvYW0gcHJvZmlsZSIsIF9fZnVuY19fKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX3NldF9wcml2YWN5X2lic3MKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBzZWN1cml0eSAKKyAqIHNldHRpbmdzIGluIElCU1MgbW9kZS4KKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfcHJpdmFjeV9pYnNzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjZmc4MDIxMV9pYnNzX3BhcmFtcyAqcGFyYW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsgICAKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisgICAgCisgICAgRU5URVIoKTsKKworICAgIHBXZXh0U3RhdGUtPndwYVZlcnNpb24gPSBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEOworCisgICAgaWYgKHBhcmFtcy0+aWVfbGVuICYmICggTlVMTCAhPSBwYXJhbXMtPmllKSApCisgICAgeworICAgICAgICBpZiAoV0xBTl9FSURfUlNOID09IHBhcmFtcy0+aWVbMF0pIAorICAgICAgICB7CisgICAgICAgICAgICBwV2V4dFN0YXRlLT53cGFWZXJzaW9uID0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyOworICAgICAgICAgICAgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwV2V4dFN0YXRlLT53cGFWZXJzaW9uID0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEE7CisgICAgICAgICAgICBlbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1RLSVA7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2llKHBBZGFwdGVyLCBwYXJhbXMtPmllLCBwYXJhbXMtPmllX2xlbik7CisKKyAgICAgICAgaWYgKDAgPiBzdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogZmFpbGVkIHRvIHBhcnNlIFdQQS9SU04gSUUiLCAKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKworICAgIGlmIChwYXJhbXMtPnByaXZhY3kpCisgICAgeworICAgICAgICAvKiBTZWN1cml0eSBlbmFibGVkIElCU1MsIEF0IHRoaXMgdGltZSB0aGVyZSBpcyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgCisgICAgICAgICAqIGFib3V0IHRoZSBzZWN1cml0eSBwYXJhbXRlcnMsIHNvIGluaXRpYWxpc2UgdGhlIGVuY3J5cHRpb24gdHlwZSB0byAKKyAgICAgICAgICogZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZLgorICAgICAgICAgKiBUaGUgY29ycmVjdCBzZWN1cml0eSBwYXJhbWV0ZXJzIHdpbGwgYmUgdXBkYXRlZCBsYXRlciBpbiAKKyAgICAgICAgICogd2xhbl9oZGRfY2ZnODAyMTFfYWRkX2tleSAqLworICAgICAgICAvKiBIYWwgZXhwZWN0cyBlbmNyeXB0aW9uIHR5cGUgdG8gYmUgc2V0IGlub3JkZXIgCisgICAgICAgICAqZW5hYmxlIHByaXZhY3kgYml0IGluIGJlYWNvbnMgKi8KKworICAgICAgICBlbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWTsKKyAgICB9CisKKyAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8udWNFbmNyeXB0aW9uVHlwZSAgICAgICAgICAgICAgICAgICA9IGVuY3J5cHRpb25UeXBlOworICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgICAgICAgID0gMTsKKyAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IGVuY3J5cHRpb25UeXBlOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9qb2luX2lic3MKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUvam9pbiBhbiBJQlNTIAorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2pvaW5faWJzcyggc3RydWN0IHdpcGh5ICp3aXBoeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgKnBhcmFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKCBkZXYgKTsgCisgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICAgdENzclJvYW1Qcm9maWxlICAgICAgICAgICpwUm9hbVByb2ZpbGU7CisgICAgaW50IHN0YXR1czsKKyAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCisgICAgRU5URVIoKTsKKyAgICAKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICAgICAgIiVzOiBkZXZpY2VfbW9kZSA9ICVkXG4iLF9fZnVuY19fLHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKyAgICBpZiAoIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gcFdleHRTdGF0ZSkKKyAgICB7CisgICAgICAgIGhkZExvZyAoVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgRVJST1I6IERhdGEgU3RvcmFnZSBDb3JydXB0aW9uXG4iLCAKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIHBSb2FtUHJvZmlsZSA9ICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZTsKKworICAgIGlmICggZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTICE9IHBSb2FtUHJvZmlsZS0+QlNTVHlwZSApCisgICAgeworICAgICAgICBoZGRMb2cgKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzIEludGVyZmFjZSB0eXBlIGlzIG5vdCBzZXQgdG8gSUJTUyBcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyogU2V0IENoYW5uZWwgKi8KKyAgICBpZiAoTlVMTCAhPSBwYXJhbXMtPmNoYW5uZWwpCisgICAgeworICAgICAgICB1OCBjaGFubmVsTnVtOworICAgICAgICBpZiAoSUVFRTgwMjExX0JBTkRfNUdIWiA9PSBwYXJhbXMtPmNoYW5uZWwtPmJhbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAiJXM6IElCU1Mgam9pbiBpcyBjYWxsZWQgd2l0aCB1bnN1cHBvcnRlZCBiYW5kICVkIiwgCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXJhbXMtPmNoYW5uZWwtPmJhbmQpOworICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IGNoYW5uZWwgbnVtYmVyICovCisgICAgICAgIGNoYW5uZWxOdW0gPSAKKyAgICAgICAgICAgICAgIGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChwYXJhbXMtPmNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKworICAgICAgICAvKlRPRE86IHVzZSBtYWNybyovCisgICAgICAgIGlmICgxNCA+PSBjaGFubmVsTnVtKQorICAgICAgICB7CisgICAgICAgICAgICB2X1UzMl90IG51bUNoYW5zID0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOOworICAgICAgICAgICAgdl9VOF90IHZhbGlkQ2hhbltXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworICAgICAgICAgICAgdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworICAgICAgICAgICAgaW50IGluZHg7CisKKyAgICAgICAgICAgIGlmICgwICE9IGNjbUNmZ0dldFN0cihoSGFsLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkQ2hhbiwgJm51bUNoYW5zKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vIHZhbGlkIGNoYW5uZWwgbGlzdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbmR4ID0gMDsgaW5keCA8IG51bUNoYW5zOyBpbmR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxOdW0gPT0gdmFsaWRDaGFuW2luZHhdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZHggPj0gbnVtQ2hhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBOb3QgdmFsaWQgQ2hhbm5lbCAlZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNoYW5uZWxOdW0pOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogU2V0IHRoZSBPcGVyYXRpb25hbCBDaGFubmVsICovCisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBzZXQgY2hhbm5lbCAlZCIsIF9fZnVuY19fLCAKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE51bSk7CisgICAgICAgICAgICBwUm9hbVByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWwgPSBjaGFubmVsTnVtOworICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IAorICAgICAgICAgICAgICAgICZwSGRkU3RhQ3R4LT5jb25uX2luZm8ub3BlcmF0aW9uQ2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IHZhbGlkIENoYW5uZWwgJWh1IiwgCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjaGFubmVsTnVtKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBzZWN1cml0eSBwYXJhbWV0ZXJzICovCisgICAgc3RhdHVzID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3ByaXZhY3lfaWJzcyhwQWRhcHRlciwgcGFyYW1zKTsgCisgICAgaWYgKHN0YXR1cyA8IDApCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGZhaWxlZCB0byBzZXQgc2VjdXJpdHkgcGFyYW1ldGVycyIsIAorICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBJc3N1ZSBjb25uZWN0IHN0YXJ0ICovCisgICAgc3RhdHVzID0gd2xhbl9oZGRfY2ZnODAyMTFfY29ubmVjdF9zdGFydChwQWRhcHRlciwgcGFyYW1zLT5zc2lkLCAKKyAgICAgICAgICAgIHBhcmFtcy0+c3NpZF9sZW4sIHBhcmFtcy0+YnNzaWQpOworCisgICAgaWYgKDAgPiBzdGF0dXMpCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGNvbm5lY3QgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogRlVOQ1RJT046IHdsYW5faGRkX2NmZzgwMjExX2xlYXZlX2lic3MKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsZWF2ZSBhbiBJQlNTIAorICovCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2xlYXZlX2lic3MoIHN0cnVjdCB3aXBoeSAqd2lwaHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUiggZGV2ICk7IAorICAgIGhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworICAgIHRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlOworCisgICAgRU5URVIoKTsKKworICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBkZXZpY2VfbW9kZSA9ICVkXG4iLF9fZnVuY19fLHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisgICAgaWYgKE5VTEwgPT0gcFdleHRTdGF0ZSkKKyAgICB7CisgICAgICAgIGhkZExvZyAoVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgRVJST1I6IERhdGEgU3RvcmFnZSBDb3JydXB0aW9uXG4iLCAKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIHBSb2FtUHJvZmlsZSA9ICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZTsKKworICAgIC8qIElzc3VlIGRpc2Nvbm5lY3Qgb25seSBpZiBpbnRlcmZhY2UgdHlwZSBpcyBzZXQgdG8gSUJTUyAqLworICAgIGlmIChlQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1MgIT0gcFJvYW1Qcm9maWxlLT5CU1NUeXBlKQorICAgIHsKKyAgICAgICAgaGRkTG9nIChWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogQlNTIFR5cGUgaXMgbm90IHNldCB0byBJQlNTIiwgCisgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKiBJc3N1ZSBEaXNjb25uZWN0IHJlcXVlc3QgKi8KKyAgICBJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPmRpc2Nvbm5lY3RfY29tcF92YXIpOworICAgIHNtZV9Sb2FtRGlzY29ubmVjdCggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCBwQWRhcHRlci0+c2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fSUJTU19MRUFWRSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfd2lwaHlfcGFyYW1zCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBwaHkgcGFyYW1ldGVycworICogKFJUUyBUaHJlc2hvbGQvRlJBRyBUaHJlc2hvbGQvUmV0cnkgQ291bnQgZXRjIC4uLikKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfd2lwaHlfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksIAorICAgICAgICB1MzIgY2hhbmdlZCkKK3sKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gd2lwaHlfcHJpdih3aXBoeSk7CisgICAgdEhhbEhhbmRsZSBoSGFsID0gcEhkZEN0eC0+aEhhbDsKKworICAgIEVOVEVSKCk7CisKKyAgICBpZiAoY2hhbmdlZCAmIFdJUEhZX1BBUkFNX1JUU19USFJFU0hPTEQpCisgICAgeworICAgICAgICB1MTYgcnRzX3RocmVzaG9sZCA9ICh3aXBoeS0+cnRzX3RocmVzaG9sZCA9PSAtMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFNQVggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcGh5LT5ydHNfdGhyZXNob2xkOworCisgICAgICAgIGlmICgoV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1JTiA+IHJ0c190aHJlc2hvbGQpIHx8CisgICAgICAgICAgICAgICAgKFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFNQVggPCBydHNfdGhyZXNob2xkKSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgUlRTIFRocmVzaG9sZCB2YWx1ZSAlaHUiLCAKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJ0c190aHJlc2hvbGQpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoMCAhPSBjY21DZmdTZXRJbnQoaEhhbCwgV05JX0NGR19SVFNfVEhSRVNIT0xELAorICAgICAgICAgICAgICAgICAgICBydHNfdGhyZXNob2xkLCBjY21DZmdTZXRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgZUFOSV9CT09MRUFOX1RSVUUpKSAKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICIlczogY2NtQ2ZnU2V0SW50IGZhaWxlZCBmb3IgcnRzX3RocmVzaG9sZCB2YWx1ZSAlaHUiLCAKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJ0c190aHJlc2hvbGQpOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAiJXM6IHNldCBydHMgdGhyZXNob2xkICVodSIsIF9fZnVuY19fLCAKKyAgICAgICAgICAgICAgICBydHNfdGhyZXNob2xkKTsKKyAgICB9CisKKyAgICBpZiAoY2hhbmdlZCAmIFdJUEhZX1BBUkFNX0ZSQUdfVEhSRVNIT0xEKQorICAgIHsKKyAgICAgICAgdTE2IGZyYWdfdGhyZXNob2xkID0gKHdpcGh5LT5mcmFnX3RocmVzaG9sZCA9PSAtMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX1NUQU1BWCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcGh5LT5mcmFnX3RocmVzaG9sZDsKKworICAgICAgICBpZiAoKFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBTUlOID4gZnJhZ190aHJlc2hvbGQpfHwKKyAgICAgICAgICAgICAgICAoV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNQVggPCBmcmFnX3RocmVzaG9sZCkgKSAKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBmcmFnX3RocmVzaG9sZCB2YWx1ZSAlaHUiLCBfX2Z1bmNfXywgCisgICAgICAgICAgICAgICAgICAgIGZyYWdfdGhyZXNob2xkKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKDAgIT0gY2NtQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsCisgICAgICAgICAgICAgICAgICAgIGZyYWdfdGhyZXNob2xkLCBjY21DZmdTZXRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgZUFOSV9CT09MRUFOX1RSVUUpKSAKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICIlczogY2NtQ2ZnU2V0SW50IGZhaWxlZCBmb3IgZnJhZ190aHJlc2hvbGQgdmFsdWUgJWh1IiwgCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBmcmFnX3RocmVzaG9sZCk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsICIlczogc2V0IGZyYWcgdGhyZXNob2xkICVodSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIGZyYWdfdGhyZXNob2xkKTsKKyAgICB9CisKKyAgICBpZiAoKGNoYW5nZWQgJiBXSVBIWV9QQVJBTV9SRVRSWV9TSE9SVCkKKyAgICAgICAgICAgIHx8IChjaGFuZ2VkICYgV0lQSFlfUEFSQU1fUkVUUllfTE9ORykpCisgICAgeworICAgICAgICB1OCByZXRyeV92YWx1ZSA9IChjaGFuZ2VkICYgV0lQSFlfUEFSQU1fUkVUUllfU0hPUlQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICB3aXBoeS0+cmV0cnlfc2hvcnQgOgorICAgICAgICAgICAgICAgICAgICAgICAgIHdpcGh5LT5yZXRyeV9sb25nOworCisgICAgICAgIGlmICgoV05JX0NGR19MT05HX1JFVFJZX0xJTUlUX1NUQU1JTiA+IHJldHJ5X3ZhbHVlKSB8fAorICAgICAgICAgICAgICAgIChXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVRfU1RBTUFYIDwgcmV0cnlfdmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEludmFsaWQgUmV0cnkgY291bnQgJWh1IiwgCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZXRyeV92YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGFuZ2VkICYgV0lQSFlfUEFSQU1fUkVUUllfU0hPUlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgwICE9IGNjbUNmZ1NldEludChoSGFsLCBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICByZXRyeV92YWx1ZSwgY2NtQ2ZnU2V0Q2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fVFJVRSkpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBjY21DZmdTZXRJbnQgZmFpbGVkIGZvciBsb25nIHJldHJ5IGNvdW50ICVodSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJldHJ5X3ZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsICIlczogc2V0IGxvbmcgcmV0cnkgY291bnQgJWh1IiwgCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZXRyeV92YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY2hhbmdlZCAmIFdJUEhZX1BBUkFNX1JFVFJZX1NIT1JUKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoMCAhPSBjY21DZmdTZXRJbnQoaEhhbCwgV05JX0NGR19TSE9SVF9SRVRSWV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5X3ZhbHVlLCBjY21DZmdTZXRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVBTklfQk9PTEVBTl9UUlVFKSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNjbUNmZ1NldEludCBmYWlsZWQgZm9yIHNob3J0IHJldHJ5IGNvdW50ICVodSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJldHJ5X3ZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsICIlczogc2V0IHNob3J0IHJldHJ5IGNvdW50ICVodSIsIAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmV0cnlfdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3R4cG93ZXIKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIHR4cG93ZXIKKyAqLworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9zZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMzUpCisgICAgICAgIGVudW0gdHhfcG93ZXJfc2V0dGluZyB0eXBlLCAKKyNlbHNlCisgICAgICAgIGVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIHR5cGUsIAorI2VuZGlmCisgICAgICAgIGludCBkYm0pCit7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90Kikgd2lwaHlfcHJpdih3aXBoeSk7CisgICAgdEhhbEhhbmRsZSBoSGFsID0gcEhkZEN0eC0+aEhhbDsKKyAgICB0U2lyTWFjQWRkciBic3NpZCA9IHsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRn07CisgICAgdFNpck1hY0FkZHIgc2VsZk1hYyA9IHsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRn07CisKKyAgICBFTlRFUigpOworCisgICAgaWYgKDAgIT0gY2NtQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTCwgCisgICAgICAgICAgICAgICAgZGJtLCBjY21DZmdTZXRDYWxsYmFjaywgCisgICAgICAgICAgICAgICAgZUFOSV9CT09MRUFOX1RSVUUpKSAKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogY2NtQ2ZnU2V0SW50IGZhaWxlZCBmb3IgdHggcG93ZXIgJWh1IiwgX19mdW5jX18sIGRibSk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsICIlczogc2V0IHR4IHBvd2VyIGxldmVsICVkIGRibSIsIF9fZnVuY19fLAorICAgICAgICAgICAgZGJtKTsKKworICAgIHN3aXRjaCh0eXBlKQorICAgIHsKKyAgICBjYXNlIE5MODAyMTFfVFhfUE9XRVJfQVVUT01BVElDOiAvKmF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRyYW5zbWl0IHBvd2VyKi8KKyAgICAgICAvKiBGYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIE5MODAyMTFfVFhfUE9XRVJfTElNSVRFRDogLypsaW1pdCBUWCBwb3dlciBieSB0aGUgbUJtIHBhcmFtZXRlciovCisgICAgICAgaWYoIHNtZV9TZXRNYXhUeFBvd2VyKGhIYWwsIGJzc2lkLCBzZWxmTWFjLCBkYm0pICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKQorICAgICAgIHsKKyAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IFNldHRpbmcgbWF4aW11bSB0eCBwb3dlciBmYWlsZWQiLCAKKyAgICAgICAgICAgICAgICAgX19mdW5jX18pOyAKKyAgICAgICAgICByZXR1cm4gLUVJTzsgICAgICAgICAgCisgICAgICAgfQorICAgICAgIGJyZWFrOworICAgIGNhc2UgTkw4MDIxMV9UWF9QT1dFUl9GSVhFRDogLypmaXggVFggcG93ZXIgdG8gdGhlIG1CbSBwYXJhbWV0ZXIqLworICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTkw4MDIxMV9UWF9QT1dFUl9GSVhFRCBub3Qgc3VwcG9ydGVkIiwgCisgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEludmFsaWQgcG93ZXIgc2V0dGluZyB0eXBlICVkIiwgCisgICAgICAgICAgICAgIF9fZnVuY19fLCB0eXBlKTsgCisgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3R4cG93ZXIKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIHRoZSB0eHBvd2VyCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfZ2V0X3R4cG93ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwgaW50ICpkYm0pCit7CisKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlcjsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QqKSB3aXBoeV9wcml2KHdpcGh5KTsKKworICAgIGlmIChOVUxMID09IHBIZGRDdHgpCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogSEREIGNvbnRleHQgaXMgTnVsbCIsX19mdW5jX18pOworICAgICAgICAqZGJtID0gMDsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwgV0xBTl9IRERfSU5GUkFfU1RBVElPTik7CisgICAgaWYgKE5VTEwgPT0gcEFkYXB0ZXIpCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IE5vdCBpbiBzdGF0aW9uIGNvbnRleHQgIiAsX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisKKyAgICB3bGFuX2hkZF9nZXRfY2xhc3NBc3RhdHMocEFkYXB0ZXIpOworICAgICpkYm0gPSBwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0Lm1heF9wd3I7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCogbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUiggZGV2ICk7CisgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgICBpbnQgc3NpZGxlbiA9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5TU0lELlNTSUQubGVuZ3RoOworICAgIHRBTklfVTggcmF0ZV9mbGFnczsKKworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCopIHdpcGh5X3ByaXYod2lwaHkpOworICAgIGhkZF9jb25maWdfdCAgKnBDZmcgICAgPSBwSGRkQ3R4LT5jZmdfaW5pOworICAgIHRIYWxIYW5kbGUgaEhhbCAgICAgICAgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisKKyAgICB0QU5JX1U4ICBPcGVyYXRpb25hbFJhdGVzW0NTUl9ET1QxMV9TVVBQT1JURURfUkFURVNfTUFYXTsKKyAgICB0QU5JX1UzMiBPUkxlbmcgPSBDU1JfRE9UMTFfU1VQUE9SVEVEX1JBVEVTX01BWDsKKyAgICB0QU5JX1U4ICBFeHRlbmRlZFJhdGVzW0NTUl9ET1QxMV9FWFRFTkRFRF9TVVBQT1JURURfUkFURVNfTUFYXTsKKyAgICB0QU5JX1UzMiBFUkxlbmcgPSBDU1JfRE9UMTFfRVhURU5ERURfU1VQUE9SVEVEX1JBVEVTX01BWDsKKyAgICB0QU5JX1U4ICBNQ1NSYXRlc1tTSVpFX09GX0JBU0lDX01DU19TRVRdOworICAgIHRBTklfVTMyIE1DU0xlbmcgPSBTSVpFX09GX0JBU0lDX01DU19TRVQ7CisgICAgdEFOSV9VMTYgbWF4UmF0ZSA9IDA7CisgICAgdEFOSV9VMTYgbXlSYXRlOworICAgIHRBTklfVTE2IGN1cnJlbnRSYXRlID0gMDsKKyAgICB0QU5JX1U4ICBtYXhTcGVlZE1DUyA9IDA7CisgICAgdEFOSV9VOCAgbWF4TUNTSWR4ID0gMDsKKyAgICB0QU5JX1U4ICByYXRlRmxhZyA9IDE7CisgICAgdEFOSV9VOCAgaSwgaiwgcnNzaWR4OworCisgICAgaWYgKChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgIT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgfHwKKyAgICAgICAgICAgICgwID09IHNzaWRsZW4pKQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IE5vdCBhc3NvY2lhdGVkIG9yIgorICAgICAgICAgICAgICAgICAgICAiIEludmFsaWQgc3NpZGxlbiwgJWQiLCBfX2Z1bmNfXywgc3NpZGxlbik7CisgICAgICAgIC8qVG8ga2VlcCBHVUkgaGFwcHkqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB3bGFuX2hkZF9nZXRfcnNzaShwQWRhcHRlciwgJnNpbmZvLT5zaWduYWwpOworICAgIHNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX1NJR05BTDsKKworICAgIHdsYW5faGRkX2dldF9jbGFzc0FzdGF0cyhwQWRhcHRlcik7CisgICAgcmF0ZV9mbGFncyA9IHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQudHhfcmF0ZV9mbGFnczsKKworICAgIC8vY29udmVydCB0byB0aGUgVUkgdW5pdHMgb2YgMTAwa2JwcworICAgIG15UmF0ZSA9IHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQudHhfcmF0ZSAqIDU7CisKKyNpZmRlZiBMSU5LU1BFRURfREVCVUdfRU5BQkxFRAorICAgIHByX2luZm8oIlJTU0kgJWQsIFJMTVMgJXUsIHJhdGUgJWQsIHJzc2kgaGlnaCAlZCwgcnNzaSBsb3cgJWRcbiIsCisgICAgICAgICAgICBzaW5mby0+c2lnbmFsLAorICAgICAgICAgICAgcENmZy0+cmVwb3J0TWF4TGlua1NwZWVkLAorICAgICAgICAgICAgbXlSYXRlLAorICAgICAgICAgICAgKGludCkgcENmZy0+bGlua1NwZWVkUnNzaUhpZ2gsCisgICAgICAgICAgICAoaW50KSBwQ2ZnLT5saW5rU3BlZWRSc3NpTG93KTsKKyNlbmRpZiAvL0xJTktTUEVFRF9ERUJVR19FTkFCTEVECisKKyAgICBpZiAoZUhERF9MSU5LX1NQRUVEX1JFUE9SVF9BQ1RVQUwgIT0gcENmZy0+cmVwb3J0TWF4TGlua1NwZWVkKQorICAgIHsKKyAgICAgICAgLy8gd2UgZG8gbm90IHdhbnQgdG8gbmVjZXNzYXJpbHkgcmVwb3J0IHRoZSBjdXJyZW50IHNwZWVkCisgICAgICAgIGlmIChlSEREX0xJTktfU1BFRURfUkVQT1JUX01BWCA9PSBwQ2ZnLT5yZXBvcnRNYXhMaW5rU3BlZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJlcG9ydCB0aGUgbWF4IHBvc3NpYmxlIHNwZWVkCisgICAgICAgICAgICByc3NpZHggPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGVIRERfTElOS19TUEVFRF9SRVBPUlRfTUFYX1NDQUxFRCA9PSBwQ2ZnLT5yZXBvcnRNYXhMaW5rU3BlZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJlcG9ydCB0aGUgbWF4IHBvc3NpYmxlIHNwZWVkIHdpdGggUlNTSSBzY2FsaW5nCisgICAgICAgICAgICBpZiAoc2luZm8tPnNpZ25hbCA+PSBwQ2ZnLT5saW5rU3BlZWRSc3NpSGlnaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyByZXBvcnQgdGhlIG1heCBwb3NzaWJsZSBzcGVlZAorICAgICAgICAgICAgICAgIHJzc2lkeCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzaW5mby0+c2lnbmFsID49IHBDZmctPmxpbmtTcGVlZFJzc2lMb3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcmVwb3J0IG1pZGRsZSBzcGVlZAorICAgICAgICAgICAgICAgIHJzc2lkeCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcmVwb3J0IGFjdHVhbCBzcGVlZAorICAgICAgICAgICAgICAgIHJzc2lkeCA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyB1bmtub3duLCB0cmVhdCBhcyBlSEREX0xJTktfU1BFRURfUkVQT1JUX01BWAorICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgdmFsdWUgZm9yIHJlcG9ydE1heExpbmtTcGVlZDogJXUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcENmZy0+cmVwb3J0TWF4TGlua1NwZWVkKTsKKyAgICAgICAgICAgIHJzc2lkeCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtYXhSYXRlID0gMDsKKworICAgICAgICAvKiBHZXQgQmFzaWMgUmF0ZSBTZXQgKi8KKyAgICAgICAgY2NtQ2ZnR2V0U3RyKGhIYWwsIFdOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVQsIE9wZXJhdGlvbmFsUmF0ZXMsICZPUkxlbmcpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgT1JMZW5nOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2Yoc3VwcG9ydGVkX2RhdGFfcmF0ZSk7IGogKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVmFsaWRhdGUgUmF0ZSBTZXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkX2RhdGFfcmF0ZVtqXS5iZWFjb25fcmF0ZV9pbmRleCA9PSAoT3BlcmF0aW9uYWxSYXRlc1tpXSAmIDB4N0YpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFJhdGUgPSBzdXBwb3J0ZWRfZGF0YV9yYXRlW2pdLnN1cHBvcnRlZF9yYXRlW3Jzc2lkeF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFVwZGF0ZSBNQVggcmF0ZSAqLworICAgICAgICAgICAgbWF4UmF0ZSA9IChjdXJyZW50UmF0ZSA+IG1heFJhdGUpP2N1cnJlbnRSYXRlOm1heFJhdGU7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgRXh0ZW5kZWQgUmF0ZSBTZXQgKi8KKyAgICAgICAgY2NtQ2ZnR2V0U3RyKGhIYWwsIFdOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVQsIEV4dGVuZGVkUmF0ZXMsICZFUkxlbmcpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRVJMZW5nOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2Yoc3VwcG9ydGVkX2RhdGFfcmF0ZSk7IGogKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZF9kYXRhX3JhdGVbal0uYmVhY29uX3JhdGVfaW5kZXggPT0gKEV4dGVuZGVkUmF0ZXNbaV0gJiAweDdGKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSYXRlID0gc3VwcG9ydGVkX2RhdGFfcmF0ZVtqXS5zdXBwb3J0ZWRfcmF0ZVtyc3NpZHhdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBVcGRhdGUgTUFYIHJhdGUgKi8KKyAgICAgICAgICAgIG1heFJhdGUgPSAoY3VycmVudFJhdGUgPiBtYXhSYXRlKT9jdXJyZW50UmF0ZTptYXhSYXRlOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IE1DUyBSYXRlIFNldCAtLSBidXQgb25seSBpZiB3ZSBhcmUgY29ubmVjdGVkIGF0IE1DUworICAgICAgICAgICByYXRlcyBvciBpZiB3ZSBhcmUgYWx3YXlzIHJlcG9ydGluZyBtYXggc3BlZWQgb3IgaWYgd2UgaGF2ZQorICAgICAgICAgICBnb29kIHJzc2kgKi8KKyAgICAgICAgaWYgKCgwID09IHJzc2lkeCkgfHwgIShyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX0xFR0FDWSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNjbUNmZ0dldFN0cihoSGFsLCBXTklfQ0ZHX0NVUlJFTlRfTUNTX1NFVCwgTUNTUmF0ZXMsICZNQ1NMZW5nKTsKKyAgICAgICAgICAgIHJhdGVGbGFnID0gMDsKKyAgICAgICAgICAgIGlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX0hUNDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZUZsYWcgfD0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1NHSSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlRmxhZyB8PSAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUNTTGVuZzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2Yoc3VwcG9ydGVkX21jc19yYXRlKTsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZF9tY3NfcmF0ZVtqXS5iZWFjb25fcmF0ZV9pbmRleCA9PSBNQ1NSYXRlc1tpXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJhdGUgPSBzdXBwb3J0ZWRfbWNzX3JhdGVbal0uc3VwcG9ydGVkX3JhdGVbcmF0ZUZsYWddOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRSYXRlID4gbWF4UmF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1heFJhdGUgICAgID0gY3VycmVudFJhdGU7CisgICAgICAgICAgICAgICAgICAgIG1heFNwZWVkTUNTID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbWF4TUNTSWR4ICAgPSBzdXBwb3J0ZWRfbWNzX3JhdGVbal0uYmVhY29uX3JhdGVfaW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHJlcG9ydCBhIHZhbHVlIGF0IGxlYXN0IGFzIGJpZyBhcyBvdXIgY3VycmVudCByYXRlCisgICAgICAgIGlmIChtYXhSYXRlIDwgbXlSYXRlKQorICAgICAgICB7CisgICAgICAgICAgIG1heFJhdGUgPSBteVJhdGU7CisgICAgICAgICAgIGlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX0xFR0FDWSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBtYXhTcGVlZE1DUyA9IDA7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1heFNwZWVkTUNTID0gMTsKKyAgICAgICAgICAgICAgbWF4TUNTSWR4ID0gcEFkYXB0ZXItPmhkZF9zdGF0cy5DbGFzc0Ffc3RhdC5tY3NfaW5kZXg7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbWF4U3BlZWRNQ1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpbmZvLT50eHJhdGUubGVnYWN5ICA9IG1heFJhdGU7CisjaWZkZWYgTElOS1NQRUVEX0RFQlVHX0VOQUJMRUQKKyAgICAgICAgICAgIHByX2luZm8oIlJlcG9ydGluZyBsZWdhY3kgcmF0ZSAlZFxuIiwgc2luZm8tPnR4cmF0ZS5sZWdhY3kpOworI2VuZGlmIC8vTElOS1NQRUVEX0RFQlVHX0VOQUJMRUQKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpbmZvLT50eHJhdGUubWNzICAgID0gbWF4TUNTSWR4OworICAgICAgICAgICAgc2luZm8tPnR4cmF0ZS5mbGFncyB8PSBSQVRFX0lORk9fRkxBR1NfTUNTOworICAgICAgICAgICAgaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfU0dJKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpbmZvLT50eHJhdGUuZmxhZ3MgfD0gUkFURV9JTkZPX0ZMQUdTX1NIT1JUX0dJOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfSFQ0MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaW5mby0+dHhyYXRlLmZsYWdzIHw9IFJBVEVfSU5GT19GTEFHU180MF9NSFpfV0lEVEg7CisgICAgICAgICAgICB9CisjaWZkZWYgTElOS1NQRUVEX0RFQlVHX0VOQUJMRUQKKyAgICAgICAgICAgIHByX2luZm8oIlJlcG9ydGluZyBNQ1MgcmF0ZSAlZCBmbGFncyAleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc2luZm8tPnR4cmF0ZS5tY3MsCisgICAgICAgICAgICAgICAgICAgIHNpbmZvLT50eHJhdGUuZmxhZ3MgKTsKKyNlbmRpZiAvL0xJTktTUEVFRF9ERUJVR19FTkFCTEVECisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gcmVwb3J0IGN1cnJlbnQgcmF0ZSBpbnN0ZWFkIG9mIG1heCByYXRlCisKKyAgICAgICAgaWYgKHJhdGVfZmxhZ3MgJiBlSEFMX1RYX1JBVEVfTEVHQUNZKQorICAgICAgICB7CisgICAgICAgICAgICAvL3Byb3ZpZGUgdG8gdGhlIFVJIGluIHVuaXRzIG9mIDEwMGticHMKKyAgICAgICAgICAgIHNpbmZvLT50eHJhdGUubGVnYWN5ID0gbXlSYXRlOworI2lmZGVmIExJTktTUEVFRF9ERUJVR19FTkFCTEVECisgICAgICAgICAgICBwcl9pbmZvKCJSZXBvcnRpbmcgYWN0dWFsIGxlZ2FjeSByYXRlICVkXG4iLCBzaW5mby0+dHhyYXRlLmxlZ2FjeSk7CisjZW5kaWYgLy9MSU5LU1BFRURfREVCVUdfRU5BQkxFRAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9tdXN0IGJlIE1DUworICAgICAgICAgICAgc2luZm8tPnR4cmF0ZS5tY3MgPSBwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0Lm1jc19pbmRleDsKKyAgICAgICAgICAgIHNpbmZvLT50eHJhdGUuZmxhZ3MgfD0gUkFURV9JTkZPX0ZMQUdTX01DUzsKKyAgICAgICAgICAgIGlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX1NHSSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaW5mby0+dHhyYXRlLmZsYWdzIHw9IFJBVEVfSU5GT19GTEFHU19TSE9SVF9HSTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyYXRlX2ZsYWdzICYgZUhBTF9UWF9SQVRFX0hUNDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2luZm8tPnR4cmF0ZS5mbGFncyB8PSBSQVRFX0lORk9fRkxBR1NfNDBfTUhaX1dJRFRIOworICAgICAgICAgICAgfQorI2lmZGVmIExJTktTUEVFRF9ERUJVR19FTkFCTEVECisgICAgICAgICAgICBwcl9pbmZvKCJSZXBvcnRpbmcgYWN0dWFsIE1DUyByYXRlICVkIGZsYWdzICV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzaW5mby0+dHhyYXRlLm1jcywKKyAgICAgICAgICAgICAgICAgICAgc2luZm8tPnR4cmF0ZS5mbGFncyApOworI2VuZGlmIC8vTElOS1NQRUVEX0RFQlVHX0VOQUJMRUQKKyAgICAgICAgfQorICAgIH0KKyAgICBzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19UWF9CSVRSQVRFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Bvd2VyX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgbW9kZSwgdl9TSU5UX3QgdGltZW91dCkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIFZPU19TVEFUVVMgdm9zX3N0YXR1czsKKworICAgIGlmIChOVUxMID09IHBBZGFwdGVyKQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBBZGFwdGVyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgLyoqVGhlIGdldCBwb3dlciBjbWQgZnJvbSB0aGUgc3VwcGxpY2FudCBnZXRzIHVwZGF0ZWQgYnkgdGhlIG5sIG9ubHkKKyAgICAgKm9uIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgICp3ZSBhcmUgb3Bwb3NpdGVseSBtYXBwZWQgdy5yLnQgbW9kZSBpbiB0aGUgZHJpdmVyCisgICAgICoqLworICAgIHZvc19zdGF0dXMgPSAgd2xhbl9oZGRfZW50ZXJfYm1wcyhwQWRhcHRlciwgIW1vZGUpOworCisgICAgaWYgKFZPU19TVEFUVVNfRV9GQUlMVVJFID09IHZvc19zdGF0dXMpCisgICAgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM4KSkKK3N0YXRpYyBpbnQgd2xhbl9oZGRfc2V0X2RlZmF1bHRfbWdtdF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGtleV9pbmRleCkKK3sKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvL0xJTlVYX1ZFUlNJT05fQ09ERSAKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMyw0LDApKQorc3RhdGljIGludCB3bGFuX2hkZF9zZXRfdHhxX3BhcmFtcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV90eHFfcGFyYW1zICpwYXJhbXMpCit7CisgICAgcmV0dXJuIDA7Cit9CisjZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCitzdGF0aWMgaW50IHdsYW5faGRkX3NldF90eHFfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV90eHFfcGFyYW1zICpwYXJhbXMpCit7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9MSU5VWF9WRVJTSU9OX0NPREUKKworc3RhdGljIGludCB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqbWFjKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisKKyAgICBpZiAoIE5VTEwgPT0gcEFkYXB0ZXIgfHwgTlVMTCA9PSBwQWRhcHRlci0+cEhkZEN0eCkKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogSW52YWxpZCBBZGFwdGVyIG9yIEhERCBDb250ZXh0ICIgLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKCgoaGRkX2NvbnRleHRfdCopcEFkYXB0ZXItPnBIZGRDdHgpLT5pc0xvYWRVbmxvYWRJblByb2dyZXNzKQorICAgIHsKKyAgICAgICAgIGhkZExvZyggTE9HRSwKKyAgICAgICAgICAgICAgICAgIiVzOiBXbGFuIExvYWQvVW5sb2FkIGlzIGluIHByb2dyZXNzIiwgX19mdW5jX18pOworICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisKKyAgICBpZiAoIChXTEFOX0hERF9TT0ZUQVAgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICB8fCAoV0xBTl9IRERfUDJQX0dPID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkKKyNlbmRpZgorICAgICAgICkKKyAgICB7CisgICAgICAgIGlmKCBOVUxMID09IG1hYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVTE2X3QgaTsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5pc1VzZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1OCAqbWFjQWRkciA9IHBBZGFwdGVyLT5hU3RhSW5mb1tpXS5tYWNBZGRyU1RBLmJ5dGVzOworICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBEZWxldGUgU1RBIHdpdGggTUFDOjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNBZGRyWzBdLCBtYWNBZGRyWzFdLCBtYWNBZGRyWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0FkZHJbM10sIG1hY0FkZHJbNF0sIG1hY0FkZHJbNV0pOworICAgICAgICAgICAgICAgICAgICBoZGRfc29mdGFwX3N0YV9kZWF1dGgocEFkYXB0ZXIsIG1hY0FkZHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBEZWxldGUgU1RBIHdpdGggTUFDOjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNbMF0sIG1hY1sxXSwgbWFjWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKKyAgICAgICAgICAgIGhkZF9zb2Z0YXBfc3RhX2RlYXV0aChwQWRhcHRlciwgbWFjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEVYSVQoKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5faGRkX2NmZzgwMjExX2FkZF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKm1hYywgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQoreworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGxhdGVyLgorICAgIHJldHVybiAwOworfQorCisvKiBjZmc4MDIxMV9vcHMgKi8KK3N0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfb3BzIHdsYW5faGRkX2NmZzgwMjExX29wcyA9IAoreworICAgIC5hZGRfdmlydHVhbF9pbnRmID0gd2xhbl9oZGRfYWRkX3ZpcnR1YWxfaW50ZiwKKyAgICAuZGVsX3ZpcnR1YWxfaW50ZiA9IHdsYW5faGRkX2RlbF92aXJ0dWFsX2ludGYsCisgICAgLmNoYW5nZV92aXJ0dWFsX2ludGYgPSB3bGFuX2hkZF9jZmc4MDIxMV9jaGFuZ2VfaWZhY2UsCisgICAgLmNoYW5nZV9zdGF0aW9uID0gd2xhbl9oZGRfY2hhbmdlX3N0YXRpb24sCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNCwwKSkKKyAgICAuYWRkX2JlYWNvbiA9IHdsYW5faGRkX2NmZzgwMjExX2FkZF9iZWFjb24sCisgICAgLmRlbF9iZWFjb24gPSB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfYmVhY29uLAorICAgIC5zZXRfYmVhY29uID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2JlYWNvbiwKKyNlbmRpZgorICAgIC5jaGFuZ2VfYnNzID0gd2xhbl9oZGRfY2ZnODAyMTFfY2hhbmdlX2JzcywKKyAgICAuYWRkX2tleSA9IHdsYW5faGRkX2NmZzgwMjExX2FkZF9rZXksCisgICAgLmdldF9rZXkgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfa2V5LAorICAgIC5kZWxfa2V5ID0gd2xhbl9oZGRfY2ZnODAyMTFfZGVsX2tleSwKKyAgICAuc2V0X2RlZmF1bHRfa2V5ID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X2RlZmF1bHRfa2V5LAorICAgIC5zZXRfY2hhbm5lbCA9IHdsYW5faGRkX2NmZzgwMjExX3NldF9jaGFubmVsLAorICAgIC5zY2FuID0gd2xhbl9oZGRfY2ZnODAyMTFfc2NhbiwKKyAgICAuY29ubmVjdCA9IHdsYW5faGRkX2NmZzgwMjExX2Nvbm5lY3QsCisgICAgLmRpc2Nvbm5lY3QgPSB3bGFuX2hkZF9jZmc4MDIxMV9kaXNjb25uZWN0LAorICAgIC5qb2luX2lic3MgID0gd2xhbl9oZGRfY2ZnODAyMTFfam9pbl9pYnNzLAorICAgIC5sZWF2ZV9pYnNzID0gd2xhbl9oZGRfY2ZnODAyMTFfbGVhdmVfaWJzcywKKyAgICAuc2V0X3dpcGh5X3BhcmFtcyA9IHdsYW5faGRkX2NmZzgwMjExX3NldF93aXBoeV9wYXJhbXMsCisgICAgLnNldF90eF9wb3dlciA9IHdsYW5faGRkX2NmZzgwMjExX3NldF90eHBvd2VyLAorICAgIC5nZXRfdHhfcG93ZXIgPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfdHhwb3dlciwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgLnJlbWFpbl9vbl9jaGFubmVsID0gd2xhbl9oZGRfY2ZnODAyMTFfcmVtYWluX29uX2NoYW5uZWwsCisgICAgLmNhbmNlbF9yZW1haW5fb25fY2hhbm5lbCA9ICB3bGFuX2hkZF9jZmc4MDIxMV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwsCisgICAgLm1nbXRfdHggPSAgd2xhbl9oZGRfYWN0aW9uLAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM4KSkKKyAgICAgLm1nbXRfdHhfY2FuY2VsX3dhaXQgPSB3bGFuX2hkZF9jZmc4MDIxMV9tZ210X3R4X2NhbmNlbF93YWl0LAorICAgICAuc2V0X2RlZmF1bHRfbWdtdF9rZXkgPSB3bGFuX2hkZF9zZXRfZGVmYXVsdF9tZ210X2tleSwKKyAgICAgLnNldF90eHFfcGFyYW1zID0gd2xhbl9oZGRfc2V0X3R4cV9wYXJhbXMsCisjZW5kaWYKKyNlbmRpZgorICAgICAuZ2V0X3N0YXRpb24gPSB3bGFuX2hkZF9jZmc4MDIxMV9nZXRfc3RhdGlvbiwKKyAgICAgLnNldF9wb3dlcl9tZ210ID0gd2xhbl9oZGRfY2ZnODAyMTFfc2V0X3Bvd2VyX21nbXQsCisgICAgIC5kZWxfc3RhdGlvbiAgPSB3bGFuX2hkZF9jZmc4MDIxMV9kZWxfc3RhdGlvbiwKKyAgICAgLmFkZF9zdGF0aW9uICA9IHdsYW5faGRkX2NmZzgwMjExX2FkZF9zdGF0aW9uCit9OworCisjZW5kaWYgLy8gQ09ORklHX0NGRzgwMjExCmRpZmYgLS1naXQgYS9DT1JFL0hERC9zcmMvd2xhbl9oZGRfZGV2X3B3ci5jIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX2Rldl9wd3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY4YWM5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX2Rldl9wd3IuYwpAQCAtMCwwICsxLDU0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisKKyAgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFIAorICAgCisgICAKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuIAorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLiAKKyAgIAorICAgCisgICRIZWFkZXI6JCAgICREYXRlVGltZTogJCAkQXV0aG9yOiAkIAorICAgCisgICAKKyAgd2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkgCisgIC0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAwMy8yOS8xMSAgICB0YmggICAgQ3JlYXRlZCBtb2R1bGUuIAorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx3bGFuX2hkZF9kZXZfcHdyLmg+CisjaWZkZWYgQU5JX0JVU19UWVBFX1BMQVRGT1JNCisjaW5jbHVkZSA8bGludXgvd2Nuc3Nfd2xhbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDx3Y25zc193bGFuLmg+CisjZW5kaWYgLy8gQU5JX0JVU19UWVBfUExBVEZPUk0KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdsb2JhbCB2YXJpYWJsZXMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlcy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBSZWZlcmVuY2UgVm9JUCwgMTAwbXNlYyBkZWxheSBtYWtlIGRpc2Nvbm5lY3QuCisgKiBTbyBUWCBzbGVlcCBtdXN0IGJlIGxlc3MgdGhhbiAxMDBtc2VjCisgKiBFdmVyeSAyMG1zZWMgVFggZnJhbWUgd2lsbCBnb2VzIG91dC4KKyAqIDEwIGZyYW1lIG1lYW5zIDJzZWNvbmRzIFRYIG9wZXJhdGlvbiAqLworc3RhdGljIGNvbnN0IGhkZF90bUxldmVsQWN0aW9uX3QgdGhlcm1hbE1pZ3JhdGlvbkFjdGlvbltXTEFOX0hERF9UTV9MRVZFTF9NQVhdID0KK3sKKyAgIC8qIFRNIExldmVsIDAsIERvIG5vdGhpbmcsIGp1c3Qgbm9ybWFsIG9wZXJhdG9uICovCisgICB7MSwgMCwgMCwgMCwgMHhGRkZGRn0sCisgICAvKiBUbSBMZXZlbCAxLCBkaXNhYmxlIFRYIEFNUERVICovCisgICB7MCwgMCwgMCwgMCwgMHhGRkZGRn0sCisgICAvKiBUTSBMZXZlbCAyLCBkaXNhYmxlIEFNRFBVLAorICAgICogVFggc2xlZXAgMTAwbXNlYyBpZiBUWCBmcmFtZSBjb3VudCBpcyBsYXJnZXIgdGhhbiAxNiBkdXJpbmcgMzAwbXNlYyAqLworICAgezAsIDAsIDEwMCwgMzAwLCAxNn0sCisgICAvKiBUTSBMZXZlbCAzLCBkaXNhYmxlIEFNRFBVLAorICAgICogVFggc2xlZXAgNTAwbXNlYyBpZiBUWCBmcmFtZSBjb3VudCBpcyBsYXJnZXIgdGhhbiAxMSBkdXJpbmcgNTAwbXNlYyAqLworICAgezAsIDAsIDUwMCwgNTAwLCAxMX0sCisgICAvKiBUTSBMZXZlbCA0LCBNQVggVE0gbGV2ZWwsIGVudGVyIElNUFMgKi8KKyAgIHswLCAxLCAxMDAwLCA1MDAsIDEwfQorfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgQGJyaWVmIEZ1bmN0aW9uIHRvIHN1c3BlbmQgdGhlIHdsYW4gZHJpdmVyLgorCisgICBAcGFyYW0gaGRkX2NvbnRleHRfdCBwSGRkQ3R4CisgICAgICAgIEdsb2JhbCBoZGQgY29udGV4dAorCisKKyAgIEByZXR1cm4gTm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgd2xhbl9zdXNwZW5kKGhkZF9jb250ZXh0X3QqIHBIZGRDdHgpCit7CisgICBpbnQgcmMgPSAwOworCisgICBwVm9zU2NoZWRDb250ZXh0IHZvc1NjaGVkQ29udGV4dCA9IE5VTEw7CisKKyAgIC8qIEdldCB0aGUgZ2xvYmFsIFZPU1MgY29udGV4dCAqLworICAgdm9zU2NoZWRDb250ZXh0ID0gZ2V0X3Zvc19zY2hlZF9jdHh0KCk7CisKKyAgIGlmKCF2b3NTY2hlZENvbnRleHQpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCxWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBHbG9iYWwgVk9TX1NDSEVEIGNvbnRleHQgaXMgTnVsbCIsX19mdW5jX18pOworICAgICAgcmV0dXJuIDA7CisgICB9CisgICBpZighdm9zX2lzX2FwcHNfcG93ZXJfY29sbGFwc2VfYWxsb3dlZChwSGRkQ3R4KSkKKyAgIHsKKyAgICAgICAvKiBGYWlsIHRoaXMgc3VzcGVuZCAqLworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEZhaWwgd2xhbiBzdXNwZW5kOiBub3QgaW4gSU1QUy9CTVBTIiwgX19mdW5jX18pOworICAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgLyogU2V0IHRoZSBTdGF0aW9uIHN0YXRlIGFzIFN1c3BlbmRlZCAqLworICAgcEhkZEN0eC0+aXNXbGFuU3VzcGVuZGVkID0gVFJVRTsKKworICAgLyoKKyAgICAgU3VzcGVuZGluZyBNQyBUaHJlYWQsIFJ4IFRocmVhZCBhbmQgVHggVGhyZWFkIGFzIHRoZSBwbGF0Zm9ybSBkcml2ZXIgaXMgZ29pbmcgdG8gU3VzcGVuZC4gICAgIAorICAgKi8KKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogU3VzcGVuZGluZyBNYywgUnggYW5kIFR4IFRocmVhZHMiLF9fZnVuY19fKTsKKworICAgaW5pdF9jb21wbGV0aW9uKCZwSGRkQ3R4LT50eF9zdXNfZXZlbnRfdmFyKTsKKworICAgLyogSW5kaWNhdGUgVHggVGhyZWFkIHRvIFN1c3BlbmQgKi8KKyAgIHNldF9iaXQoVFhfU1VTUEVORF9FVkVOVF9NQVNLLCAmdm9zU2NoZWRDb250ZXh0LT50eEV2ZW50RmxhZyk7CisKKyAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmdm9zU2NoZWRDb250ZXh0LT50eFdhaXRRdWV1ZSk7CisKKyAgIC8qIFdhaXQgZm9yIFN1c3BlbmQgQ29uZmlybWF0aW9uIGZyb20gVHggVGhyZWFkICovCisgICByYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwSGRkQ3R4LT50eF9zdXNfZXZlbnRfdmFyLCBtc2Vjc190b19qaWZmaWVzKDIwMCkpOworCisgICBpZighcmMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBOb3QgYWJsZSB0byBzdXNwZW5kIFRYIHRocmVhZCB0aW1lb3V0IGhhcHBlbmVkIiwgX19mdW5jX18pOworICAgICAgY2xlYXJfYml0KFRYX1NVU1BFTkRfRVZFTlRfTUFTSywgJnZvc1NjaGVkQ29udGV4dC0+dHhFdmVudEZsYWcpOworCisgICAgICByZXR1cm4gLTE7CisgICB9CisgICAvKiBTZXQgdGhlIFR4IFRocmVhZCBhcyBTdXNwZW5kZWQgKi8KKyAgIHBIZGRDdHgtPmlzVHhUaHJlYWRTdXNwZW5kZWQgPSBUUlVFOworCisgICBpbml0X2NvbXBsZXRpb24oJnBIZGRDdHgtPnJ4X3N1c19ldmVudF92YXIpOworCisgICAvKiBJbmRpY2F0ZSBSeCBUaHJlYWQgdG8gU3VzcGVuZCAqLworICAgc2V0X2JpdChSWF9TVVNQRU5EX0VWRU5UX01BU0ssICZ2b3NTY2hlZENvbnRleHQtPnJ4RXZlbnRGbGFnKTsKKworICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2b3NTY2hlZENvbnRleHQtPnJ4V2FpdFF1ZXVlKTsKKworICAgLyogV2FpdCBmb3IgU3VzcGVuZCBDb25maXJtYXRpb24gZnJvbSBSeCBUaHJlYWQgKi8KKyAgIHJjID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBIZGRDdHgtPnJ4X3N1c19ldmVudF92YXIsIG1zZWNzX3RvX2ppZmZpZXMoMjAwKSk7CisKKyAgIGlmKCFyYykKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBOb3QgYWJsZSB0byBzdXNwZW5kIFJ4IHRocmVhZCB0aW1lb3V0IGhhcHBlbmVkIiwgX19mdW5jX18pOworCisgICAgICAgY2xlYXJfYml0KFJYX1NVU1BFTkRfRVZFTlRfTUFTSywgJnZvc1NjaGVkQ29udGV4dC0+cnhFdmVudEZsYWcpOworCisgICAgICAgLyogSW5kaWNhdGUgVHggVGhyZWFkIHRvIFJlc3VtZSAqLworICAgICAgIGNvbXBsZXRlKCZ2b3NTY2hlZENvbnRleHQtPlJlc3VtZVR4RXZlbnQpOworCisgICAgICAgLyogU2V0IHRoZSBUeCBUaHJlYWQgYXMgUmVzdW1lZCAqLworICAgICAgIHBIZGRDdHgtPmlzVHhUaHJlYWRTdXNwZW5kZWQgPSBGQUxTRTsKKworICAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgLyogU2V0IHRoZSBSeCBUaHJlYWQgYXMgU3VzcGVuZGVkICovCisgICBwSGRkQ3R4LT5pc1J4VGhyZWFkU3VzcGVuZGVkID0gVFJVRTsKKworICAgaW5pdF9jb21wbGV0aW9uKCZwSGRkQ3R4LT5tY19zdXNfZXZlbnRfdmFyKTsKKworICAgLyogSW5kaWNhdGUgTUMgVGhyZWFkIHRvIFN1c3BlbmQgKi8KKyAgIHNldF9iaXQoTUNfU1VTUEVORF9FVkVOVF9NQVNLLCAmdm9zU2NoZWRDb250ZXh0LT5tY0V2ZW50RmxhZyk7CisKKyAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmdm9zU2NoZWRDb250ZXh0LT5tY1dhaXRRdWV1ZSk7CisKKyAgIC8qIFdhaXQgZm9yIFN1c3BlbmQgQ29uZmlybWF0aW9uIGZyb20gTUMgVGhyZWFkICovCisgICByYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwSGRkQ3R4LT5tY19zdXNfZXZlbnRfdmFyLCBtc2Vjc190b19qaWZmaWVzKDIwMCkpOworCisgICBpZighcmMpCisgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogTm90IGFibGUgdG8gc3VzcGVuZCBNQyB0aHJlYWQgdGltZW91dCBoYXBwZW5lZCIsIF9fZnVuY19fKTsKKworICAgICAgIGNsZWFyX2JpdChNQ19TVVNQRU5EX0VWRU5UX01BU0ssICZ2b3NTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnKTsKKworICAgICAgIC8qIEluZGljYXRlIFJ4IFRocmVhZCB0byBSZXN1bWUgKi8KKyAgICAgICBjb21wbGV0ZSgmdm9zU2NoZWRDb250ZXh0LT5SZXN1bWVSeEV2ZW50KTsKKworICAgICAgIC8qIFNldCB0aGUgUnggVGhyZWFkIGFzIFJlc3VtZWQgKi8KKyAgICAgICBwSGRkQ3R4LT5pc1J4VGhyZWFkU3VzcGVuZGVkID0gRkFMU0U7CisKKyAgICAgICAvKiBJbmRpY2F0ZSBUeCBUaHJlYWQgdG8gUmVzdW1lICovCisgICAgICAgY29tcGxldGUoJnZvc1NjaGVkQ29udGV4dC0+UmVzdW1lVHhFdmVudCk7CisKKyAgICAgICAvKiBTZXQgdGhlIFR4IFRocmVhZCBhcyBSZXN1bWVkICovCisgICAgICAgcEhkZEN0eC0+aXNUeFRocmVhZFN1c3BlbmRlZCA9IEZBTFNFOworCisgICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICAvKiBTZXQgdGhlIE1jIFRocmVhZCBhcyBTdXNwZW5kZWQgKi8KKyAgIHBIZGRDdHgtPmlzTWNUaHJlYWRTdXNwZW5kZWQgPSBUUlVFOworICAgCisgICAvKiBTZXQgdGhlIFN0YXRpb24gc3RhdGUgYXMgU3VzcGVuZGVkICovCisgICBwSGRkQ3R4LT5pc1dsYW5TdXNwZW5kZWQgPSBUUlVFOworCisgICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIEBicmllZiBGdW5jdGlvbiB0byByZXN1bWUgdGhlIHdsYW4gZHJpdmVyLgorCisgICBAcGFyYW0gaGRkX2NvbnRleHRfdCBwSGRkQ3R4CisgICAgICAgIEdsb2JhbCBoZGQgY29udGV4dAorCisKKyAgIEByZXR1cm4gTm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHdsYW5fcmVzdW1lKGhkZF9jb250ZXh0X3QqIHBIZGRDdHgpCit7CisgICBwVm9zU2NoZWRDb250ZXh0IHZvc1NjaGVkQ29udGV4dCA9IE5VTEw7CisKKyAgIC8vR2V0IHRoZSBnbG9iYWwgVk9TUyBjb250ZXh0LgorICAgdm9zU2NoZWRDb250ZXh0ID0gZ2V0X3Zvc19zY2hlZF9jdHh0KCk7CisKKyAgIGlmKCF2b3NTY2hlZENvbnRleHQpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCxWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBHbG9iYWwgVk9TX1NDSEVEIGNvbnRleHQgaXMgTnVsbCIsX19mdW5jX18pOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKgorICAgICBSZXN1bWluZyBNYywgUnggYW5kIFR4IFRocmVhZCBhcyBwbGF0Zm9ybSBEcml2ZXIgaXMgcmVzdW1pbmcuCisgICAqLworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBSZXN1bWluZyBNYywgUnggYW5kIFR4IFRocmVhZCIsX19mdW5jX18pOworCisgICAvKiBJbmRpY2F0ZSBNQyBUaHJlYWQgdG8gUmVzdW1lICovCisgICBjb21wbGV0ZSgmdm9zU2NoZWRDb250ZXh0LT5SZXN1bWVNY0V2ZW50KTsKKworICAgLyogU2V0IHRoZSBNYyBUaHJlYWQgYXMgUmVzdW1lZCAqLworICAgcEhkZEN0eC0+aXNNY1RocmVhZFN1c3BlbmRlZCA9IEZBTFNFOworCisgICAvKiBJbmRpY2F0ZSBSeCBUaHJlYWQgdG8gUmVzdW1lICovCisgICBjb21wbGV0ZSgmdm9zU2NoZWRDb250ZXh0LT5SZXN1bWVSeEV2ZW50KTsKKworICAgLyogU2V0IHRoZSBSeCBUaHJlYWQgYXMgUmVzdW1lZCAqLworICAgcEhkZEN0eC0+aXNSeFRocmVhZFN1c3BlbmRlZCA9IEZBTFNFOworCisgICAvKiBJbmRpY2F0ZSBUeCBUaHJlYWQgdG8gUmVzdW1lICovCisgICBjb21wbGV0ZSgmdm9zU2NoZWRDb250ZXh0LT5SZXN1bWVUeEV2ZW50KTsKKworICAgLyogU2V0IHRoZSBUeCBUaHJlYWQgYXMgUmVzdW1lZCAqLworICAgcEhkZEN0eC0+aXNUeFRocmVhZFN1c3BlbmRlZCA9IEZBTFNFOworCisgICAvKiBTZXQgdGhlIFN0YXRpb24gc3RhdGUgYXMgU3VzcGVuZGVkICovCisgICBwSGRkQ3R4LT5pc1dsYW5TdXNwZW5kZWQgPSBGQUxTRTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIEBicmllZiBGdW5jdGlvbiB0byBzdXNwZW5kIHRoZSB3bGFuIGRyaXZlci4KKyAgIFRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgY2FsbGVkIGJ5IHBsYXRmb3JtIGRyaXZlciBTdXNwZW5kIG9uIFN5c3RlbSBTdXNwZW5kCisKKyAgIEBwYXJhbSBkZXYgICAgcGxhdGZvcm1fZnVuY19kZXZpY2UKKworCisgICBAcmV0dXJuIE5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaGRkRGV2U3VzcGVuZEhkbHIoc3RydWN0IGRldmljZSAqZGV2KQoreworICAgaW50IHJldCA9IDA7CisgICBoZGRfY29udGV4dF90KiBwSGRkQ3R4ID0gTlVMTDsKKworICAgcEhkZEN0eCA9ICAoaGRkX2NvbnRleHRfdCopd2Nuc3Nfd2xhbl9nZXRfZHJ2ZGF0YShkZXYpOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFdMQU4gc3VzcGVuZGVkIGJ5IHBsYXRmb3JtIGRyaXZlciIsX19mdW5jX18pOworCisgICAvKiBHZXQgdGhlIEhERCBjb250ZXh0ICovCisgICBpZighcEhkZEN0eCkgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEhERCBjb250ZXh0IGlzIE51bGwiLF9fZnVuY19fKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICBpZihwSGRkQ3R4LT5pc1dsYW5TdXNwZW5kZWQgPT0gVFJVRSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCxWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBXTEFOIGlzIGFscmVhZHkgaW4gc3VzcGVuZGVkIHN0YXRlIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgLyogU3VzcGVuZCB0aGUgd2xhbiBkcml2ZXIgKi8KKyAgIHJldCA9IHdsYW5fc3VzcGVuZChwSGRkQ3R4KTsKKyAgIGlmKHJldCAhPSAwKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IE5vdCBhYmxlIHRvIHN1c3BlbmQgd2xhbiIsX19mdW5jX18pOworICAgICAgcmV0dXJuIHJldDsKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBAYnJpZWYgRnVuY3Rpb24gdG8gcmVzdW1lIHRoZSB3bGFuIGRyaXZlci4KKyAgIFRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgY2FsbGVkIGJ5IHBsYXRmb3JtIGRyaXZlciBSZXN1bWUgb24gU3lzdGVtIFJlc3VtZSAKKworICAgQHBhcmFtIGRldiAgICBwbGF0Zm9ybV9mdW5jX2RldmljZQorCisKKyAgIEByZXR1cm4gTm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBoZGREZXZSZXN1bWVIZGxyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKyAgIGhkZF9jb250ZXh0X3QqIHBIZGRDdHggPSBOVUxMOworCisgICBwSGRkQ3R4ID0gIChoZGRfY29udGV4dF90Kil3Y25zc193bGFuX2dldF9kcnZkYXRhKGRldik7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCxWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBXTEFOIGJlaW5nIHJlc3VtZWQgYnkgQW5kcm9pZCBPUyIsX19mdW5jX18pOworCisgICBpZihwSGRkQ3R4LT5pc1dsYW5TdXNwZW5kZWQgIT0gVFJVRSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCxWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBXTEFOIGlzIGFscmVhZHkgaW4gcmVzdW1lZCBzdGF0ZSIsX19mdW5jX18pOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIC8qIFJlc3VtZSB0aGUgd2xhbiBkcml2ZXIgKi8KKyAgIHdsYW5fcmVzdW1lKHBIZGRDdHgpOworCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHBtX29wcyA9IHsKKyAgIC5zdXNwZW5kID0gaGRkRGV2U3VzcGVuZEhkbHIsCisgICAucmVzdW1lID0gaGRkRGV2UmVzdW1lSGRsciwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKworICAgQGJyaWVmIFJlZ2lzdHJhdGlvbiBmdW5jdGlvbi4KKyAgICAgICAgUmVnaXN0ZXIgc3VzcGVuZCwgcmVzdW1lIGNhbGxiYWNrIGZ1bmN0aW9ucyB3aXRoIHBsYXRmb3JtIGRyaXZlci4gCisKKyAgIEBwYXJhbSBoZGRfY29udGV4dF90IHBIZGRDdHgKKyAgICAgICAgR2xvYmFsIGhkZCBjb250ZXh0CisKKyAgIEByZXR1cm4gR2VuZXJhbCBzdGF0dXMgY29kZQorICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgICAgICAgUmVnaXN0cmF0aW9uIFN1Y2Nlc3MKKyAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgICAgIFJlZ2lzdHJhdGlvbiBGYWlsCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBoZGRSZWdpc3RlclBtT3BzKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisgICAgd2Nuc3Nfd2xhbl9zZXRfZHJ2ZGF0YShwSGRkQ3R4LT5wYXJlbnRfZGV2LCBwSGRkQ3R4KTsKKyNpZm5kZWYgRkVBVFVSRV9SMzNECisgICAgd2Nuc3Nfd2xhbl9yZWdpc3Rlcl9wbV9vcHMocEhkZEN0eC0+cGFyZW50X2RldiwgJnBtX29wcyk7CisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIEBicmllZiBEZS1yZWdpc3RyYXRpb24gZnVuY3Rpb24uCisgICAgICAgIERlcmVnaXN0ZXIgdGhlIHN1c3BlbmQsIHJlc3VtZSBjYWxsYmFjayBmdW5jdGlvbnMgd2l0aCBwbGF0Zm9ybSBkcml2ZXIKKworICAgQHBhcmFtIGhkZF9jb250ZXh0X3QgcEhkZEN0eAorICAgICAgICBHbG9iYWwgaGRkIGNvbnRleHQKKworICAgQHJldHVybiBHZW5lcmFsIHN0YXR1cyBjb2RlCisgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgICAgICBEZS1SZWdpc3RyYXRpb24gU3VjY2VzcworICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAgICAgRGUtUmVnaXN0cmF0aW9uIEZhaWwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIGhkZERlcmVnaXN0ZXJQbU9wcyhoZGRfY29udGV4dF90ICpwSGRkQ3R4KQoreworI2lmbmRlZiBGRUFUVVJFX1IzM0QKKyAgICB3Y25zc193bGFuX3VucmVnaXN0ZXJfcG1fb3BzKHBIZGRDdHgtPnBhcmVudF9kZXYsICZwbV9vcHMpOworI2VuZGlmIC8qIEZFQVRVUkVfUjMzRCAqLworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBAYnJpZWYgVFggZnJhbWUgYmxvY2sgdGltZW91dCBoYW5kbGVyCisgICAgICAgICAgUmVzdW1lIFRYLCBhbmQgcmVzZXQgVFggZnJhbWUgY291bnQKKworICAgQHBhcmFtIGhkZF9jb250ZXh0X3QgcEhkZEN0eAorICAgICAgICBHbG9iYWwgaGRkIGNvbnRleHQKKworICAgQHJldHVybiBOT05FCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBoZGREZXZUbVR4QmxvY2tUaW1lb3V0SGFuZGxlcih2b2lkICp1c3JEYXRhKQoreworICAgaGRkX2NvbnRleHRfdCAgICAgICAgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXVzckRhdGE7CisgICBoZGRfYWRhcHRlcl90ICAgICAgICAqc3RhQWRhcGF0ZXI7CisgICAvKiBTYW5pdHksIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKyAgIGlmKE5VTEwgPT0gcEhkZEN0eCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBOVUxMIENvbnRleHQiLCBfX2Z1bmNfXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuOworICAgfQorCisgICBzdGFBZGFwYXRlciA9IGhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LCBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKTsKKyAgIGlmKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcEhkZEN0eC0+dG1JbmZvLnRtT3BlcmF0aW9uTG9jaykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogQXF1aXJlIGxvY2sgZmFpbCIsIF9fZnVuY19fKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIHBIZGRDdHgtPnRtSW5mby50eEZyYW1lQ291bnQgPSAwOworCisgICAvKiBSZXN1bWUgVFggZmxvdyAqLworICAgbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhzdGFBZGFwYXRlci0+ZGV2KTsKKyAgIG11dGV4X3VubG9jaygmcEhkZEN0eC0+dG1JbmZvLnRtT3BlcmF0aW9uTG9jayk7CisKKyAgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIEBicmllZiBUTSBMZXZlbCBDaGFuZ2UgaGFuZGxlcgorICAgICAgICAgIFJlY2VpdmVkIFRtIExldmVsIGNoYW5nZWQgbm90aWZpY2F0aW9uCisKKyAgIEBwYXJhbSBkZXYgOiBEZXZpY2UgY29udGV4dAorICAgICAgICAgIGNoYW5nZWRUbUxldmVsIDogQ2hhbmdlZCBuZXcgVE0gbGV2ZWwKKworICAgQHJldHVybiAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGhkZERldlRtTGV2ZWxDaGFuZ2VkSGFuZGxlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjaGFuZ2VkVG1MZXZlbCkKK3sKKyAgIGhkZF9jb250ZXh0X3QgICAgICAgICpwSGRkQ3R4ID0gTlVMTDsKKyAgIFdMQU5fVG1MZXZlbEVudW1UeXBlICBuZXdUbUxldmVsID0gY2hhbmdlZFRtTGV2ZWw7CisgICBoZGRfYWRhcHRlcl90ICAgICAgICAqc3RhQWRhcGF0ZXI7CisKKyAgIHBIZGRDdHggPSAgKGhkZF9jb250ZXh0X3QqKXdjbnNzX3dsYW5fZ2V0X2RydmRhdGEoZGV2KTsKKworICAgaWYoKHBIZGRDdHgtPnRtSW5mby5jdXJyZW50VG1MZXZlbCA9PSBuZXdUbUxldmVsKSB8fAorICAgICAgKCFwSGRkQ3R4LT5jZmdfaW5pLT50aGVybWFsTWl0aWdhdGlvbkVuYWJsZSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIiVzOiBUTSBOb3QgZW5hYmxlZCAlZCBvciBMZXZlbCBkb2VzIG5vdCBjaGFuZ2VkICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcEhkZEN0eC0+Y2ZnX2luaS0+dGhlcm1hbE1pdGlnYXRpb25FbmFibGUsIG5ld1RtTGV2ZWwpOworICAgICAgLyogVE0gTGV2ZWwgZG9lcyBub3QgY2hhbmdlZCwKKyAgICAgICAqIE9yIGZlYXR1cmUgZG9lcyBub3QgZW5hYmxlZAorICAgICAgICogZG8gbm90aGluZyAqLworICAgICAgcmV0dXJuOworICAgfQorCisgICBzbWVfU2V0VG1MZXZlbChwSGRkQ3R4LT5oSGFsLCBjaGFuZ2VkVG1MZXZlbCwgMCk7CisKKyAgIGlmKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcEhkZEN0eC0+dG1JbmZvLnRtT3BlcmF0aW9uTG9jaykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogQXF1aXJlIGxvY2sgZmFpbCIsIF9fZnVuY19fKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcEhkZEN0eC0+dG1JbmZvLmN1cnJlbnRUbUxldmVsID0gY2hhbmdlZFRtTGV2ZWw7CisgICBwSGRkQ3R4LT50bUluZm8udHhGcmFtZUNvdW50ID0gMDsKKyAgIHZvc19tZW1fY29weSgmcEhkZEN0eC0+dG1JbmZvLnRtQWN0aW9uLAorICAgICAgICAgICAgICAgICZ0aGVybWFsTWlncmF0aW9uQWN0aW9uW25ld1RtTGV2ZWxdLAorICAgICAgICAgICAgICAgIHNpemVvZihoZGRfdG1MZXZlbEFjdGlvbl90KSk7CisKKworICAgaWYocEhkZEN0eC0+dG1JbmZvLnRtQWN0aW9uLmVudGVySW1wcykKKyAgIHsKKyAgICAgIHN0YUFkYXBhdGVyID0gaGRkX2dldF9hZGFwdGVyKHBIZGRDdHgsIFdMQU5fSEREX0lORlJBX1NUQVRJT04pOworICAgICAgaWYoc3RhQWRhcGF0ZXIpCisgICAgICB7CisgICAgICAgICBpZihoZGRfY29ubklzQ29ubmVjdGVkKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIoc3RhQWRhcGF0ZXIpKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHNtZV9Sb2FtRGlzY29ubmVjdChwSGRkQ3R4LT5oSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YUFkYXBhdGVyLT5zZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBtdXRleF91bmxvY2soJnBIZGRDdHgtPnRtSW5mby50bU9wZXJhdGlvbkxvY2spOworCisgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBAYnJpZWYgUmVnaXN0ZXIgZnVuY3Rpb24KKyAgICAgICAgUmVnaXN0ZXIgVGhlcm1hbCBNaXRpZ2F0aW9uIExldmVsIENoYW5nZWQgaGFuZGxlIGNhbGxiYWNrIGZ1bmN0aW9uCisKKyAgIEBwYXJhbSBoZGRfY29udGV4dF90IHBIZGRDdHgKKyAgICAgICAgR2xvYmFsIGhkZCBjb250ZXh0CisKKyAgIEByZXR1cm4gR2VuZXJhbCBzdGF0dXMgY29kZQorICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgICAgICAgUmVnaXN0cmF0aW9uIFN1Y2Nlc3MKKyAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgICAgIFJlZ2lzdHJhdGlvbiBGYWlsCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBoZGREZXZUbVJlZ2lzdGVyTm90aWZ5Q2FsbGJhY2soaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCxWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiJXM6IFJlZ2lzdGVyIFRNIEhhbmRsZXIiLCBfX2Z1bmNfXyk7CisKKyAgIHdjbnNzX3JlZ2lzdGVyX3RoZXJtYWxfbWl0aWdhdGlvbihwSGRkQ3R4LT5wYXJlbnRfZGV2ICxoZGREZXZUbUxldmVsQ2hhbmdlZEhhbmRsZXIpOworCisgICAvKiBTZXQgRGVmYXVsdCBUTSBMZXZlbCBhcyBMb3dlc3QsIGRvIG5vdGhpbmcgKi8KKyAgIHBIZGRDdHgtPnRtSW5mby5jdXJyZW50VG1MZXZlbCA9IFdMQU5fSEREX1RNX0xFVkVMXzA7CisgICB2b3NfbWVtX3plcm8oJnBIZGRDdHgtPnRtSW5mby50bUFjdGlvbiwgc2l6ZW9mKGhkZF90bUxldmVsQWN0aW9uX3QpKTsgCisgICB2b3NfdGltZXJfaW5pdCgmcEhkZEN0eC0+dG1JbmZvLnR4U2xlZXBUaW1lciwKKyAgICAgICAgICAgICAgICAgIFZPU19USU1FUl9UWVBFX1NXLAorICAgICAgICAgICAgICAgICAgaGRkRGV2VG1UeEJsb2NrVGltZW91dEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAodm9pZCAqKXBIZGRDdHgpOworICAgbXV0ZXhfaW5pdCgmcEhkZEN0eC0+dG1JbmZvLnRtT3BlcmF0aW9uTG9jayk7CisgICBwSGRkQ3R4LT50bUluZm8udHhGcmFtZUNvdW50ID0gMDsKKyAgIHBIZGRDdHgtPnRtSW5mby5ibG9ja2VkUXVldWUgPSBOVUxMOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgQGJyaWVmIFVuLVJlZ2lzdGVyIGZ1bmN0aW9uCisgICAgICAgIFVuLVJlZ2lzdGVyIFRoZXJtYWwgTWl0aWdhdGlvbiBMZXZlbCBDaGFuZ2VkIGhhbmRsZSBjYWxsYmFjayBmdW5jdGlvbgorCisgICBAcGFyYW0gaGRkX2NvbnRleHRfdCBwSGRkQ3R4CisgICAgICAgIEdsb2JhbCBoZGQgY29udGV4dAorCisgICBAcmV0dXJuIEdlbmVyYWwgc3RhdHVzIGNvZGUKKyAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICAgICAgIFVuLVJlZ2lzdHJhdGlvbiBTdWNjZXNzCisgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFICAgICBVbi1SZWdpc3RyYXRpb24gRmFpbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgaGRkRGV2VG1VbnJlZ2lzdGVyTm90aWZ5Q2FsbGJhY2soaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKyAgIHdjbnNzX3VucmVnaXN0ZXJfdGhlcm1hbF9taXRpZ2F0aW9uKGhkZERldlRtTGV2ZWxDaGFuZ2VkSGFuZGxlcik7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCmRpZmYgLS1naXQgYS9DT1JFL0hERC9zcmMvd2xhbl9oZGRfZHBfdXRpbHMuYyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF9kcF91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZWU3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfZHBfdXRpbHMuYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIHdsYW5faGRkX2RwX3V0aWxzLmMKKyAgCisgIFxicmllZiAgICAgIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBkYXRhIHBhdGggbW9kdWxlCisgIAorICBEZXNjcmlwdGlvbi4uLgorICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuCisgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAgICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoqLworLyogJEhFQURFUiQgKi8KKyAgCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIGZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHdsYW5faGRkX2RwX3V0aWxzLmg+CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIAorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK1ZPU19TVEFUVVMgaGRkX2xpc3RfaW5zZXJ0X2Zyb250KCBoZGRfbGlzdF90ICpwTGlzdCwgaGRkX2xpc3Rfbm9kZV90ICpwTm9kZSApCit7CisgICBsaXN0X2FkZCggcE5vZGUsICZwTGlzdC0+YW5jaG9yICk7CisgICBwTGlzdC0+Y291bnQrKzsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK1ZPU19TVEFUVVMgaGRkX2xpc3RfaW5zZXJ0X2JhY2soIGhkZF9saXN0X3QgKnBMaXN0LCBoZGRfbGlzdF9ub2RlX3QgKnBOb2RlICkKK3sKKyAgIGxpc3RfYWRkX3RhaWwoIHBOb2RlLCAmcExpc3QtPmFuY2hvciApOworICAgcExpc3QtPmNvdW50Kys7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitWT1NfU1RBVFVTIGhkZF9saXN0X2luc2VydF9iYWNrX3NpemUoIGhkZF9saXN0X3QgKnBMaXN0LCBoZGRfbGlzdF9ub2RlX3QgKnBOb2RlLCB2X1NJWkVfdCAqcFNpemUgKQoreworICAgbGlzdF9hZGRfdGFpbCggcE5vZGUsICZwTGlzdC0+YW5jaG9yICk7CisgICBwTGlzdC0+Y291bnQrKzsKKyAgICpwU2l6ZSA9IHBMaXN0LT5jb3VudDsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK1ZPU19TVEFUVVMgaGRkX2xpc3RfcmVtb3ZlX2Zyb250KCBoZGRfbGlzdF90ICpwTGlzdCwgaGRkX2xpc3Rfbm9kZV90ICoqcHBOb2RlICkKK3sKKyAgIHN0cnVjdCBsaXN0X2hlYWQgKiBsaXN0cHRyOworCisgICBpZiAoIGxpc3RfZW1wdHkoICZwTGlzdC0+YW5jaG9yICkgKQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgIH0KKyAgICAgICAgIAorICAgbGlzdHB0ciA9IHBMaXN0LT5hbmNob3IubmV4dDsKKyAgICpwcE5vZGUgPSBsaXN0cHRyOworICAgbGlzdF9kZWwocExpc3QtPmFuY2hvci5uZXh0KTsKKyAgIHBMaXN0LT5jb3VudC0tOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitWT1NfU1RBVFVTIGhkZF9saXN0X3JlbW92ZV9iYWNrKCBoZGRfbGlzdF90ICpwTGlzdCwgaGRkX2xpc3Rfbm9kZV90ICoqcHBOb2RlICkKK3sKKyAgIHN0cnVjdCBsaXN0X2hlYWQgKiBsaXN0cHRyOworCisgICBpZiAoIGxpc3RfZW1wdHkoICZwTGlzdC0+YW5jaG9yICkgKQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgIH0KKworICAgbGlzdHB0ciA9IHBMaXN0LT5hbmNob3IucHJldjsKKyAgICpwcE5vZGUgPSBsaXN0cHRyOworICAgbGlzdF9kZWwocExpc3QtPmFuY2hvci5wcmV2KTsKKyAgIHBMaXN0LT5jb3VudC0tOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitWT1NfU1RBVFVTIGhkZF9saXN0X3JlbW92ZV9ub2RlKCBoZGRfbGlzdF90ICpwTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9saXN0X25vZGVfdCAqcE5vZGVUb1JlbW92ZSApCit7CisgICBoZGRfbGlzdF9ub2RlX3QgKnRtcDsKKyAgIGludCBmb3VuZCA9IDA7CisKKyAgIGlmICggbGlzdF9lbXB0eSggJnBMaXN0LT5hbmNob3IgKSApCisgICB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VNUFRZOworICAgfQorCisgICAgLy8gdmVyaWZ5IHRoYXQgcE5vZGVUb1JlbW92ZSBpcyBpbmRlZWQgcGFydCBvZiBsaXN0IHBMaXN0CisgICBsaXN0X2Zvcl9lYWNoKHRtcCwgJnBMaXN0LT5hbmNob3IpIAorICAgeworICAgICBpZiAodG1wID09IHBOb2RlVG9SZW1vdmUpCisgICAgIHsKKyAgICAgICAgZm91bmQgPSAxOworICAgICAgICBicmVhazsKKyAgICAgfQorICAgfQorICAgaWYgKGZvdW5kID09IDApCisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKworICAgbGlzdF9kZWwocE5vZGVUb1JlbW92ZSk7IAorICAgcExpc3QtPmNvdW50LS07CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK1ZPU19TVEFUVVMgaGRkX2xpc3RfcGVla19mcm9udCggaGRkX2xpc3RfdCAqcExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9saXN0X25vZGVfdCAqKnBwTm9kZSApCit7CisgICBzdHJ1Y3QgbGlzdF9oZWFkICogbGlzdHB0cjsKKyAgIGlmICggbGlzdF9lbXB0eSggJnBMaXN0LT5hbmNob3IgKSApCisgICB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VNUFRZOworICAgfQorCisgICBsaXN0cHRyID0gcExpc3QtPmFuY2hvci5uZXh0OworICAgKnBwTm9kZSA9IGxpc3RwdHI7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitWT1NfU1RBVFVTIGhkZF9saXN0X3BlZWtfbmV4dCggaGRkX2xpc3RfdCAqcExpc3QsIGhkZF9saXN0X25vZGVfdCAqcE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2xpc3Rfbm9kZV90ICoqcHBOb2RlICkKK3sKKyAgIHN0cnVjdCBsaXN0X2hlYWQgKiBsaXN0cHRyOworICAgaW50IGZvdW5kID0gMDsKKyAgIGhkZF9saXN0X25vZGVfdCAqdG1wOworICAgICAgCisgICBpZiAoICggcExpc3QgPT0gTlVMTCkgfHwgKCBwTm9kZSA9PSBOVUxMKSB8fCAocHBOb2RlID09IE5VTEwpKQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgaWYgKCBsaXN0X2VtcHR5KCZwTGlzdC0+YW5jaG9yKSApCisgICB7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgIH0KKworICAgLy8gdmVyaWZ5IHRoYXQgcE5vZGUgaXMgaW5kZWVkIHBhcnQgb2YgbGlzdCBwTGlzdAorICAgbGlzdF9mb3JfZWFjaCh0bXAsICZwTGlzdC0+YW5jaG9yKSAKKyAgIHsKKyAgICAgaWYgKHRtcCA9PSBwTm9kZSkKKyAgICAgeworICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgICB9CisgICB9CisKKyAgIGlmIChmb3VuZCA9PSAwKQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgbGlzdHB0ciA9IHBOb2RlLT5uZXh0OworICAgaWYgKGxpc3RwdHIgPT0gJnBMaXN0LT5hbmNob3IpCisgICB7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgIH0KKworICAgKnBwTm9kZSA9ICBsaXN0cHRyOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitWT1NfU1RBVFVTIGhkZF9zdHJpbmdfdG9faGV4KCBjaGFyICpwU3JjTWFjLCBpbnQgbGVuZ3RoLCBjaGFyICpwRGVzY01hYyApCit7CisgICBpbnQgaTsKKyAgIGludCBrOworICAgY2hhciB0ZW1wWzNdID0gezB9OworCisgICAvLzE4IGlzIE1BQyBBZGRyZXNzIGxlbmd0aCBwbHVzIHRoZSBjb2xvbnMKKyAgIGlmICggIXBTcmNNYWMgJiYgKGxlbmd0aCA+IDE4IHx8IGxlbmd0aCA8IDE4KSApCisgICB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICBpID0gayA9IDA7CisgICB3aGlsZSAoIGkgPCBsZW5ndGggKQorICAgeworICAgICAgIG1lbWNweSh0ZW1wLCBwU3JjTWFjK2ksIDIpOworICAgICAgIHBEZXNjTWFjW2srK10gPSAoY2hhcilzaW1wbGVfc3RydG91bCAodGVtcCwgTlVMTCwgMTYpOworICAgICAgIGkgKz0gMzsKKyAgIH0KKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvc3JjL3dsYW5faGRkX2Vhcmx5X3N1c3BlbmQuYyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF9lYXJseV9zdXNwZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyYWE1OQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF9lYXJseV9zdXNwZW5kLmMKQEAgLTAsMCArMSwyMjExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogICAgIHdsYW5faGRkX2Vhcmx5X3N1c3BlbmQuYworKgorKiAgICAgXGJyaWVmICAgICAgcG93ZXIgbWFuYWdlbWVudCBmdW5jdGlvbnMKKyoKKyogICAgIERlc2NyaXB0aW9uCisqICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOSAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4KKyogICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqICAgICAgICAgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KiovCisvKiAkSEVBREVSJCAqLworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiAgIEluY2x1ZGUgZmlsZXMKKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKKworI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vhcmx5c3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3djbnNzX3dsYW4uaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHdsYW5fcWN0X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImhhbFR5cGVzLmgiCisjaW5jbHVkZSAic21lX0FwaS5oIgorI2luY2x1ZGUgPHZvc19hcGkuaD4KKyNpbmNsdWRlICJ2b3NfcG93ZXIuaCIKKyNpbmNsdWRlIDx2b3Nfc2NoZWQuaD4KKyNpbmNsdWRlIDxtYWNJbml0QXBpLmg+CisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyNpbmNsdWRlIDx3bGFuX3FjdF9zYWwuaD4KKyNpbmNsdWRlIDx3bGFuX3FjdF9iYWwuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHdsYW5fcWN0X3N5cy5oPgorI2luY2x1ZGUgPHdsYW5fYnRjX3N2Yy5oPgorI2luY2x1ZGUgPHdsYW5fbmxpbmtfY29tbW9uLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfbWFpbi5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2Fzc29jLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfZGV2X3B3ci5oPgorI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisjaW5jbHVkZSA8d2xhbl9zYWxfbWlzYy5oPgorI2luY2x1ZGUgPGxpYnJhX3NkaW9pZi5oPgorI2VuZGlmCisjaW5jbHVkZSA8d2xhbl9ubGlua19zcnYuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9taXNjLmg+CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaG9zdGFwZC5oPgorI2VuZGlmCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyNpbmNsdWRlICJiYXBBcGkuaCIKKyNpbmNsdWRlICJiYXBfaGRkX21haW4uaCIKKyNpbmNsdWRlICJiYXBfaGRkX21pc2MuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2NmZy5oPgorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogICBUeXBlIGRlY2xhcmF0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogICBGdW5jdGlvbiBhbmQgdmFyaWFibGVzIGRlY2xhcmF0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ3bGFuX2hkZF9wb3dlci5oIgorI2luY2x1ZGUgIndsYW5faGRkX3BhY2tldF9maWx0ZXJpbmcuaCIKKworI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECitzdGF0aWMgc3RydWN0IGVhcmx5X3N1c3BlbmQgd2xhbl9lYXJseV9zdXNwZW5kOworI2VuZGlmCisKK3N0YXRpYyBlSGFsU3RhdHVzIGdfZnVsbF9wd3Jfc3RhdHVzOworc3RhdGljIGVIYWxTdGF0dXMgZ19zdGFuZGJ5X3N0YXR1czsKKworZXh0ZXJuIFZPU19TVEFUVVMgaGRkX3Bvc3Rfdm9zc19zdGFydF9jb25maWcoaGRkX2NvbnRleHRfdCogcEhkZEN0eCk7CitleHRlcm4gVk9TX1NUQVRVUyB2b3NfY2hpcEV4aXREZWVwU2xlZXBWUkVHSGFuZGxlcigKKyAgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgICB2b3NfcG93ZXJfY2JfdHlwZSBjYWxsYmFjaywKKyAgIHZfUFZPSURfdCB1c2VyX2RhdGEpOworZXh0ZXJuIHZvaWQgaGRkX3dsYW5faW5pdGlhbF9zY2FuKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpOwordm9pZCB1bnJlZ2lzdGVyX3dsYW5fc3VzcGVuZCh2b2lkKTsKKworZXh0ZXJuIHN0cnVjdCBub3RpZmllcl9ibG9jayBoZGRfbmV0ZGV2X25vdGlmaWVyOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK2V4dGVybiB0Vk9TX0NPTl9NT0RFIGhkZF9nZXRfY29ucGFyYW0gKCB2b2lkICk7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCitleHRlcm4gdm9pZCB3bGFuX2hkZF9zZXRfbWNfYWRkcl9saXN0KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIHZfVThfdCBzZXQpOworI2VuZGlmCisKKy8vQ2FsbGJhY2sgaW52b2tlZCBieSBQTUMgdG8gcmVwb3J0IHN0YXR1cyBvZiBzdGFuZGJ5IHJlcXVlc3QKK3ZvaWQgaGRkX3N1c3BlbmRfc3RhbmRieV9jYmsgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpCit7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QqKWNhbGxiYWNrQ29udGV4dDsKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBTdGFuZGJ5IHN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICBnX3N0YW5kYnlfc3RhdHVzID0gc3RhdHVzOyAKKworICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpCisgICB7CisgICAgICBwSGRkQ3R4LT5oZGRfcHNfc3RhdGUgPSBlSEREX1NVU1BFTkRfU1RBTkRCWTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBzbWVfUmVxdWVzdFN0YW5kYnkgZmFpbGVkIixfX2Z1bmNfXyk7CisgICB9CisKKyAgIGNvbXBsZXRlKCZwSGRkQ3R4LT5zdGFuZGJ5X2NvbXBfdmFyKTsKK30KKworLy9DYWxsYmFjayBpbnZva2VkIGJ5IFBNQyB0byByZXBvcnQgc3RhdHVzIG9mIGZ1bGwgcG93ZXIgcmVxdWVzdAordm9pZCBoZGRfc3VzcGVuZF9mdWxsX3B3cl9jYWxsYmFjayh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKQoreworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90KiljYWxsYmFja0NvbnRleHQ7CisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogRnVsbCBQb3dlciBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgZ19mdWxsX3B3cl9zdGF0dXMgPSBzdGF0dXM7CisKKyAgIGlmKGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKQorICAgeworICAgICAgcEhkZEN0eC0+aGRkX3BzX3N0YXRlID0gZUhERF9TVVNQRU5EX05PTkU7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogc21lX1JlcXVlc3RGdWxsUG93ZXIgZmFpbGVkIixfX2Z1bmNfXyk7CisgICB9CisKKyAgIGNvbXBsZXRlKCZwSGRkQ3R4LT5mdWxsX3B3cl9jb21wX3Zhcik7Cit9CisKK2VIYWxTdGF0dXMgaGRkX2V4aXRfc3RhbmRieShoZGRfY29udGV4dF90ICpwSGRkQ3R4KQoreyAgCisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogV0xBTiBiZWluZyByZXN1bWVkIGZyb20gc3RhbmRieSIsX19mdW5jX18pOworICAgIElOSVRfQ09NUExFVElPTihwSGRkQ3R4LT5mdWxsX3B3cl9jb21wX3Zhcik7CisKKyAgIGdfZnVsbF9wd3Jfc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICBzdGF0dXMgPSBzbWVfUmVxdWVzdEZ1bGxQb3dlcihwSGRkQ3R4LT5oSGFsLCBoZGRfc3VzcGVuZF9mdWxsX3B3cl9jYWxsYmFjaywgcEhkZEN0eCwKKyAgICAgIGVTTUVfRlVMTF9QV1JfTkVFREVEX0JZX0hERCk7CisKKyAgIGlmKHN0YXR1cyA9PSBlSEFMX1NUQVRVU19QTUNfUEVORElORykKKyAgIHsKKyAgICAgIC8vQmxvY2sgb24gYSBjb21wbGV0aW9uIHZhcmlhYmxlLiBDYW4ndCB3YWl0IGZvcmV2ZXIgdGhvdWdoCisgICAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnVsbF9wd3JfY29tcF92YXIsIAorICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9GVUxMX1BXUikpOworICAgICAgc3RhdHVzID0gZ19mdWxsX3B3cl9zdGF0dXM7CisgICAgICBpZihnX2Z1bGxfcHdyX3N0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IHNtZV9SZXF1ZXN0RnVsbFBvd2VyIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogc21lX1JlcXVlc3RGdWxsUG93ZXIgZmFpbGVkIC0gc3RhdHVzICVkIiwKKyAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcEhkZEN0eC0+aGRkX3BzX3N0YXRlID0gZUhERF9TVVNQRU5EX05PTkU7CisKK2ZhaWx1cmU6CisgICAgLy9ObyBibG9ja2luZyB0byByZWR1Y2UgbGF0ZW5jeS4gTm8gb3RoZXIgZGV2aWNlIHNob3VsZCBiZSBkZXBlbmRpbmcgb24gV0xBTgorICAgIC8vdG8gZmluaXNoIHJlc3VtZSBhbmQgV0xBTiB3b24ndCBiZSBpbnN0YW50bHkgb24gYWZ0ZXIgcmVzdW1lCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvL0hlbHBlciByb3V0aW5lIHRvIHB1dCB0aGUgY2hpcCBpbnRvIHN0YW5kYnkKK1ZPU19TVEFUVVMgaGRkX2VudGVyX3N0YW5kYnkoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKyAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICAvL0Rpc2FibGUgSU1QUy9CTVBTIGFzIHdlIGRvIG5vdCB3YW50IHRoZSBkZXZpY2UgdG8gZW50ZXIgYW55IHBvd2VyCisgICAvL3NhdmUgbW9kZSBvbiBpdHMgb3duIGR1cmluZyBzdXNwZW5kIHNlcXVlbmNlCisgICBzbWVfRGlzYWJsZVBvd2VyU2F2ZShwSGRkQ3R4LT5oSGFsLCBlUE1DX0lETEVfTU9ERV9QT1dFUl9TQVZFKTsKKyAgIHNtZV9EaXNhYmxlUG93ZXJTYXZlKHBIZGRDdHgtPmhIYWwsIGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRSk7CisKKyAgIC8vTm90ZSB3ZSBkbyBub3QgZGlzYWJsZSBxdWV1ZXMgdW5uZWNlc3NhcmlseS4gUXVldWVzIHNob3VsZCBhbHJlYWR5IGJlIGRpc2FibGVkCisgICAvL2lmIFNUQSBpcyBkaXNjb25uZWN0ZWQgb3IgdGhlIHF1ZXVlIHdpbGwgYmUgZGlzYWJsZWQgYXMgYW5kIHdoZW4gZGlzY29ubmVjdAorICAgLy9oYXBwZW5zIGJlY2F1c2Ugb2Ygc3RhbmRieSBwcm9jZWR1cmUuCisgICAKKyAgIC8vRW5zdXJlIHRoYXQgZGV2aWNlIGlzIGluIGZ1bGwgcG93ZXIgZmlyc3QuIFRoZXJlIGlzIHNjb3BlIGZvciBvcHRpbWl6YXRpb24KKyAgIC8vaGVyZSBlc3BlY2lhbGx5IGluIHNjZW5hcmlvcyB3aGVyZSBQTUMgaXMgYWxyZWFkeSBpbiBJTVBTIG9yIFJFUVVFU1RfSU1QUy4KKyAgIC8vQ29yZSBzL3cgbmVlZHMgdG8gYmUgb3B0aW1pemVkIHRvIGhhbmRsZSB0aGlzLiBVbnRpbCB0aGVuIHdlIHJlcXVlc3QgZnVsbAorICAgLy9wb3dlciBiZWZvcmUgaXNzdWluZyByZXF1ZXN0IGZvciBzdGFuZGJ5LgorICAgSU5JVF9DT01QTEVUSU9OKHBIZGRDdHgtPmZ1bGxfcHdyX2NvbXBfdmFyKTsKKyAgIGdfZnVsbF9wd3Jfc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIGhhbFN0YXR1cyA9IHNtZV9SZXF1ZXN0RnVsbFBvd2VyKHBIZGRDdHgtPmhIYWwsIGhkZF9zdXNwZW5kX2Z1bGxfcHdyX2NhbGxiYWNrLCAKKyAgICAgICBwSGRkQ3R4LCBlU01FX0ZVTExfUFdSX05FRURFRF9CWV9IREQpOworCisgICBpZihoYWxTdGF0dXMgPT0gZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcpCisgICB7CisgICAgICAvL0Jsb2NrIG9uIGEgY29tcGxldGlvbiB2YXJpYWJsZS4gQ2FuJ3Qgd2FpdCBmb3JldmVyIHRob3VnaAorICAgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBIZGRDdHgtPmZ1bGxfcHdyX2NvbXBfdmFyLCAKKyAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRlVMTF9QV1IpKTsKKyAgICAgIGlmKGdfZnVsbF9wd3Jfc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICB7CisgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogc21lX1JlcXVlc3RGdWxsUG93ZXIgRmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmKGhhbFN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IHNtZV9SZXF1ZXN0RnVsbFBvd2VyIGZhaWxlZCAtIHN0YXR1cyAlZCIsCisgICAgICAgICBfX2Z1bmNfXywgaGFsU3RhdHVzKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIGdvdG8gZmFpbHVyZTsKKyAgIH0KKworICAgaWYocEhkZEN0eC0+aGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldCA9PSBUUlVFKSB7CisgICAgICAgICBoZGRfY29uZl9tY2FzdGJjYXN0X2ZpbHRlcihwSGRkQ3R4LCBGQUxTRSk7CisgICAgICAgICBwSGRkQ3R4LT5oZGRfbWNhc3RiY2FzdF9maWx0ZXJfc2V0ID0gRkFMU0U7CisgICB9CisKKyAgIC8vUmVxdWVzdCBzdGFuZGJ5LiBTdGFuZGJ5IHdpbGwgY2F1c2UgdGhlIFNUQSB0byBkaXNhc3NvY2lhdGUgZmlyc3QuIFRYIHF1ZXVlcworICAgLy93aWxsIGJlIGRpc2FibGVkIChieSBIREQpIHdoZW4gU1RBIGRpc2Nvbm5lY3RzLiBZb3UgZG8gbm90IHdhbnQgdG8gZGlzYWJsZSBUWAorICAgLy9xdWV1ZXMgaGVyZS4gQWxzbyBkbyBub3QgYXNzZXJ0IGlmIHRoZSBmYWlsdXJlIGNvZGUgaXMgZUhBTF9TVEFUVVNfUE1DX05PVF9OT1cgYXMgUE1DCisgICAvL3dpbGwgc2VuZCB0aGlzIGZhaWx1cmUgY29kZSBpbiBjYXNlIG9mIGNvbmN1cnJlbnQgc2Vzc2lvbnMuIFBvd2VyIFNhdmUgY2Fubm90IGJlIHN1cHBvcnRlZAorICAgLy93aGVuIHRoZXJlIGFyZSBjb25jdXJyZW50IHNlc3Npb25zLgorICAgSU5JVF9DT01QTEVUSU9OKHBIZGRDdHgtPnN0YW5kYnlfY29tcF92YXIpOworICAgZ19zdGFuZGJ5X3N0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICBoYWxTdGF0dXMgPSBzbWVfUmVxdWVzdFN0YW5kYnkocEhkZEN0eC0+aEhhbCwgaGRkX3N1c3BlbmRfc3RhbmRieV9jYmssIHBIZGRDdHgpOworCisgICBpZiAoaGFsU3RhdHVzID09IGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HKSAKKyAgIHsKKyAgICAgIC8vV2FpdCB0aWxsIFdMQU4gZGV2aWNlIGVudGVycyBzdGFuZGJ5IG1vZGUKKyAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcEhkZEN0eC0+c3RhbmRieV9jb21wX3ZhciwgCisgICAgICAgICBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX1NUQU5EQlkpKTsKKyAgICAgIGlmIChnX3N0YW5kYnlfc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgJiYgZ19zdGFuZGJ5X3N0YXR1cyAhPSBlSEFMX1NUQVRVU19QTUNfTk9UX05PVykKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBzbWVfUmVxdWVzdFN0YW5kYnkgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmIChoYWxTdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyAmJiBoYWxTdGF0dXMgIT0gZUhBTF9TVEFUVVNfUE1DX05PVF9OT1cpIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBzbWVfUmVxdWVzdFN0YW5kYnkgZmFpbGVkIC0gc3RhdHVzICVkIiwKKyAgICAgICAgIF9fZnVuY19fLCBoYWxTdGF0dXMpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgZ290byBmYWlsdXJlOworICAgfQorICAgZWxzZQorICAgICAgcEhkZEN0eC0+aGRkX3BzX3N0YXRlID0gZUhERF9TVVNQRU5EX1NUQU5EQlk7CisKK2ZhaWx1cmU6CisgICAvL1Jlc3RvcmUgSU1QUyBjb25maWcKKyAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPmZJc0ltcHNFbmFibGVkKQorICAgICAgc21lX0VuYWJsZVBvd2VyU2F2ZShwSGRkQ3R4LT5oSGFsLCBlUE1DX0lETEVfTU9ERV9QT1dFUl9TQVZFKTsKKworICAgLy9SZXN0b3JlIEJNUFMgY29uZmlnCisgICBpZihwSGRkQ3R4LT5jZmdfaW5pLT5mSXNCbXBzRW5hYmxlZCkKKyAgICAgIHNtZV9FbmFibGVQb3dlclNhdmUocEhkZEN0eC0+aEhhbCwgZVBNQ19CRUFDT05fTU9ERV9QT1dFUl9TQVZFKTsKKworICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworCisvL0hlbHBlciByb3V0aW5lIGZvciBEZWVwIHNsZWVwIGVudHJ5CitWT1NfU1RBVFVTIGhkZF9lbnRlcl9kZWVwX3NsZWVwKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXM7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZvc19jYWxsX3N0YXR1c190eXBlIGNhbGxUeXBlOworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICBzdHJ1Y3Qgc2Rpb19mdW5jICpzZGlvX2Z1bmNfZGV2X2N1cnJlbnQgPSBOVUxMOworICAgaW50IGF0dGVtcHRzID0gMDsKKyNlbmRpZgorICAgLy9TdG9wIHRoZSBJbnRlcmZhY2UgVFggcXVldWUuCisgICBuZXRpZl90eF9kaXNhYmxlKHBBZGFwdGVyLT5kZXYpOworICAgbmV0aWZfY2Fycmllcl9vZmYocEFkYXB0ZXItPmRldik7CisKKyAgIC8vRGlzYWJsZSBJTVBTLEJNUFMgYXMgd2UgZG8gbm90IHdhbnQgdGhlIGRldmljZSB0byBlbnRlciBhbnkgcG93ZXIKKyAgIC8vc2F2ZSBtb2RlIG9uIGl0IG93biBkdXJpbmcgc3VzcGVuZCBzZXF1ZW5jZQorICAgc21lX0Rpc2FibGVQb3dlclNhdmUocEhkZEN0eC0+aEhhbCwgZVBNQ19JRExFX01PREVfUE9XRVJfU0FWRSk7CisgICBzbWVfRGlzYWJsZVBvd2VyU2F2ZShwSGRkQ3R4LT5oSGFsLCBlUE1DX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkUpOworCisgICAvL0Vuc3VyZSB0aGF0IGRldmljZSBpcyBpbiBmdWxsIHBvd2VyIGFzIHdlIHdpbGwgdG91Y2ggSC9XIGR1cmluZyB2b3NfU3RvcAorICAgSU5JVF9DT01QTEVUSU9OKHBIZGRDdHgtPmZ1bGxfcHdyX2NvbXBfdmFyKTsKKyAgIGdfZnVsbF9wd3Jfc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIGhhbFN0YXR1cyA9IHNtZV9SZXF1ZXN0RnVsbFBvd2VyKHBIZGRDdHgtPmhIYWwsIGhkZF9zdXNwZW5kX2Z1bGxfcHdyX2NhbGxiYWNrLCAKKyAgICAgICBwSGRkQ3R4LCBlU01FX0ZVTExfUFdSX05FRURFRF9CWV9IREQpOworCisgICBpZihoYWxTdGF0dXMgPT0gZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcpCisgICB7CisgICAgICAvL0Jsb2NrIG9uIGEgY29tcGxldGlvbiB2YXJpYWJsZS4gQ2FuJ3Qgd2FpdCBmb3JldmVyIHRob3VnaAorICAgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBIZGRDdHgtPmZ1bGxfcHdyX2NvbXBfdmFyLCAKKyAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRlVMTF9QV1IpKTsKKyAgICAgIGlmKGdfZnVsbF9wd3Jfc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IHNtZV9SZXF1ZXN0RnVsbFBvd2VyIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgaWYoaGFsU3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogUmVxdWVzdCBmb3IgRnVsbCBQb3dlciBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICB9CisKKyAgIC8vSXNzdWUgYSBkaXNjb25uZWN0LiBUaGlzIGlzIHJlcXVpcmVkIHRvIGluZm9ybSB0aGUgc3VwcGxpY2FudCB0aGF0CisgICAvL1NUQSBpcyBnZXR0aW5nIGRpc2Fzc29jaWF0ZWQgYW5kIGZvciBHVUkgdG8gYmUgdXBkYXRlZCBwcm9wZXJseQorICAgSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKyAgIGhhbFN0YXR1cyA9IHNtZV9Sb2FtRGlzY29ubmVjdChwSGRkQ3R4LT5oSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLCBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKKworICAgLy9TdWNjZXNzIGltcGxpZXMgZGlzY29ubmVjdCBjb21tYW5kIGdvdCBxdWV1ZWQgdXAgc3VjY2Vzc2Z1bGx5CisgICBpZihoYWxTdGF0dXMgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgIHsKKyAgICAgIC8vQmxvY2sgb24gYSBjb21wbGV0aW9uIHZhcmlhYmxlLiBDYW4ndCB3YWl0IGZvcmV2ZXIgdGhvdWdoLgorICAgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyLCAKKyAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworICAgfQorCisKKyAgIC8vTm9uZSBvZiB0aGUgc3RlcHMgc2hvdWxkIGZhaWwgYWZ0ZXIgdGhpcy4gQ29udGludWUgZXZlbiBpbiBjYXNlIG9mIGZhaWx1cmUKKyAgIHZvc1N0YXR1cyA9IHZvc19zdG9wKCBwSGRkQ3R4LT5wdm9zQ29udGV4dCApOworICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworCisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgIHZvc1N0YXR1cyA9IFdMQU5CQUxfU3RvcCggcEhkZEN0eC0+cHZvc0NvbnRleHQgKTsKKyAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKworICAgdm9zU3RhdHVzID0gV0xBTkJBTF9TdXNwZW5kQ2hpcCggcEhkZEN0eC0+cHZvc0NvbnRleHQgKTsKKyAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKworICAgdm9zU3RhdHVzID0gV0xBTlNBTF9TdG9wKHBIZGRDdHgtPnB2b3NDb250ZXh0KTsKKyAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyNlbmRpZgorCisgICB2b3NTdGF0dXMgPSB2b3NfY2hpcEFzc2VydERlZXBTbGVlcCggJmNhbGxUeXBlLCBOVUxMLCBOVUxMICk7CisgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisKKyAgIC8vVm90ZSBvZmYgYW55IFBNSUMgdm9sdGFnZSBzdXBwbGllcworICAgdm9zU3RhdHVzID0gdm9zX2NoaXBQb3dlckRvd24oTlVMTCwgTlVMTCwgTlVMTCk7CisKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworICAgIC8vR2V0IHRoZSBDdXJyZW50IFNESU8gRnVuYworICAgc2Rpb19mdW5jX2Rldl9jdXJyZW50ID0gbGlicmFfZ2V0c2Rpb19mdW5jZGV2KCk7CisgICBpZihOVUxMICE9IHNkaW9fZnVuY19kZXZfY3VycmVudCkgeworICAgICAgbGlicmFfZGV0ZWN0X2NhcmRfY2hhbmdlKCk7CisgICAgICBkbyB7CisgICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgIC8vR2V0IHRoZSBTRElPIGZ1bmMgZGV2aWNlCisgICAgICAgICBzZGlvX2Z1bmNfZGV2X2N1cnJlbnQgPSBsaWJyYV9nZXRzZGlvX2Z1bmNkZXYoKTsKKyAgICAgICAgIGlmKE5VTEwgPT0gc2Rpb19mdW5jX2Rldl9jdXJyZW50KSB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IENhcmQgUmVtb3ZlZCBTdWNjZXNzZnVsbHkiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IEZhaWxlZCB0byBSZW1vdmUgdGhlIENhcmQ6IFRyeWluZyBBZ2FpbiIsX19mdW5jX18pOworICAgICAgICAgICAgYXR0ZW1wdHMrKzsKKyAgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGF0dGVtcHRzIDwgTElCUkFfQ0FSRF9SRU1PVkVfREVURUNUX01BWF9DT1VOVCk7CisKKyAgICAgIGlmKExJQlJBX0NBUkRfUkVNT1ZFX0RFVEVDVF9NQVhfQ09VTlQgPT0gYXR0ZW1wdHMpIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRmFpbGVkIHRvIFJlbW92ZSB0aGUgQ2FyZDogRmF0YWwiLF9fZnVuY19fKTsKKyAgICAgICAgIGdvdG8gZXJyX2ZhaWw7CisgICAgICB9CisgICB9CisjZW5kaWYKKworICAgcEhkZEN0eC0+aGRkX3BzX3N0YXRlID0gZUhERF9TVVNQRU5EX0RFRVBfU0xFRVA7CisKKyAgIC8vUmVzdG9yZSBJTVBTIGNvbmZpZworICAgaWYocEhkZEN0eC0+Y2ZnX2luaS0+ZklzSW1wc0VuYWJsZWQpCisgICAgICBzbWVfRW5hYmxlUG93ZXJTYXZlKHBIZGRDdHgtPmhIYWwsIGVQTUNfSURMRV9NT0RFX1BPV0VSX1NBVkUpOworCisgICAvL1Jlc3RvcmUgQk1QUyBjb25maWcKKyAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPmZJc0JtcHNFbmFibGVkKQorICAgICAgc21lX0VuYWJsZVBvd2VyU2F2ZShwSGRkQ3R4LT5oSGFsLCBlUE1DX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkUpOworCisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KK2Vycl9mYWlsOgorI2VuZGlmCisgICByZXR1cm4gdm9zU3RhdHVzOworfQorCitWT1NfU1RBVFVTIGhkZF9leGl0X2RlZXBfc2xlZXAoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzOworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICBpbnQgYXR0ZW1wdHMgPSAwOworICAgc3RydWN0IHNkaW9fZnVuYyAqc2Rpb19mdW5jX2RldiA9IE5VTEw7CisjZW5kaWYKKworICAgLy9Qb3dlciBVcCBMaWJyYSBXTEFOIGNhcmQgZmlyc3QgaWYgbm90IGFscmVhZHkgcG93ZXJlZCB1cAorICAgdm9zU3RhdHVzID0gdm9zX2NoaXBQb3dlclVwKE5VTEwsTlVMTCxOVUxMKTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IExpYnJhIFdMQU4gbm90IFBvd2VyZWQgVXAuICIKKyAgICAgICAgICAiZXhpdGluZyIsIF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX2RlZXBfc2xlZXA7CisgICB9CisKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworICAgbGlicmFfZGV0ZWN0X2NhcmRfY2hhbmdlKCk7CisKKyAgIGRvIHsKKyAgICAgIHNkaW9fZnVuY19kZXYgPSBsaWJyYV9nZXRzZGlvX2Z1bmNkZXYoKTsKKyAgICAgIGlmIChOVUxMID09IHNkaW9fZnVuY19kZXYpIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogTGlicmEgV0xBTiBub3QgZGV0ZWN0ZWQgeWV0LiIsX19mdW5jX18pOworICAgICAgICAgYXR0ZW1wdHMrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBMaWJyYSBXTEFOIGRldGVjdG9uIHN1Y2NlZWRlZCIsX19mdW5jX18pOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmKExJQlJBX0NBUkRfSU5TRVJUX0RFVEVDVF9NQVhfQ09VTlQgPT0gYXR0ZW1wdHMpCisgICAgICAgIGJyZWFrOworCisgICAgICBtc2xlZXAoMjUwKTsKKworICAgfXdoaWxlIChhdHRlbXB0cyA8IExJQlJBX0NBUkRfSU5TRVJUX0RFVEVDVF9NQVhfQ09VTlQpOworCisgICAvL1JldHJ5IHRvIGRldGVjdCB0aGUgY2FyZCBhZ2FpbiBieSBQb3dlcmluZyBEb3duIHRoZSBjaGlwIGFuZCBQb3dlciB1cCB0aGUgY2hpcAorICAgLy9hZ2Fpbi4gVGhpcyByZXRyeSBpcyBkb25lIHRvIHJlY292ZXIgZnJvbSBDUkMgRXJyb3IKKyAgIGlmIChOVUxMID09IHNkaW9fZnVuY19kZXYpIHsKKworICAgICAgYXR0ZW1wdHMgPSAwOworCisgICAgICAvL1ZvdGUgb2ZmIGFueSBQTUlDIHZvbHRhZ2Ugc3VwcGxpZXMKKyAgICAgIHZvc19jaGlwUG93ZXJEb3duKE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgICBtc2xlZXAoMTAwMCk7CisKKyAgICAgIC8vUG93ZXIgVXAgTGlicmEgV0xBTiBjYXJkIGZpcnN0IGlmIG5vdCBhbHJlYWR5IHBvd2VyZWQgdXAKKyAgICAgIHZvc1N0YXR1cyA9IHZvc19jaGlwUG93ZXJVcChOVUxMLE5VTEwsTlVMTCk7CisgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgICAgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBSZXRyeSBMaWJyYSBXTEFOIG5vdCBQb3dlcmVkIFVwLiAiCisgICAgICAgICAgICAgImV4aXRpbmciLCBfX2Z1bmNfXyk7CisgICAgICAgICBnb3RvIGVycl9kZWVwX3NsZWVwOworICAgICAgfQorCisgICAgICBkbyB7CisgICAgICAgICBzZGlvX2Z1bmNfZGV2ID0gbGlicmFfZ2V0c2Rpb19mdW5jZGV2KCk7CisgICAgICAgICBpZiAoTlVMTCA9PSBzZGlvX2Z1bmNfZGV2KSB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFJldHJ5IExpYnJhIFdMQU4gbm90IGRldGVjdGVkIHlldC4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgIGF0dGVtcHRzKys7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogUmV0cnkgTGlicmEgV0xBTiBkZXRlY3RvbiBzdWNjZWVkZWQiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBpZihhdHRlbXB0cyA9PSAyKQorICAgICAgICAgICBicmVhazsKKworICAgICAgICAgbXNsZWVwKDEwMDApOworCisgICAgICB9d2hpbGUgKGF0dGVtcHRzIDwgMyk7CisKKyAgIH0KKworICAgaWYgKE5VTEwgPT0gc2Rpb19mdW5jX2RldikgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBMaWJyYSBXTEFOIG5vdCBmb3VuZCEhIixfX2Z1bmNfXyk7CisgICAgICAgICBnb3RvIGVycl9kZWVwX3NsZWVwOworICAgfQorCisgICBTRVRfTkVUREVWX0RFVihwQWRhcHRlci0+ZGV2LCAmc2Rpb19mdW5jX2Rldi0+ZGV2KTsKKyAgIGxpYnJhX3NkaW9fc2V0cHJpdmRhdGEgKHNkaW9fZnVuY19kZXYsIHBIZGRDdHgpOworICAgYXRvbWljX3NldCgmcEhkZEN0eC0+c2Rpb19jbGFpbV9jb3VudCwgMCk7CisgICBwSGRkQ3R4LT5wYXJlbnRfZGV2ID0gJnNkaW9fZnVuY19kZXYtPmRldjsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgIiVzOiBjYWxsaW5nIFdMQU5TQUxfU3RhcnQiLF9fZnVuY19fKTsKKyAgIHZvc1N0YXR1cyA9IFdMQU5TQUxfU3RhcnQocEhkZEN0eC0+cHZvc0NvbnRleHQpOworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RhcnQgU0FMIixfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl9kZWVwX3NsZWVwOworICAgfQorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICIlczogY2FsbGluZyBXTEFOQkFMX1Jlc3VtZUNoaXAiLF9fZnVuY19fKTsKKyAgIHZvc1N0YXR1cyA9IFdMQU5CQUxfUmVzdW1lQ2hpcCggcEhkZEN0eC0+cHZvc0NvbnRleHQgKTsKKyAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogRmFpbGVkIGluIFdMQU5CQUxfUmVzdW1lQ2hpcCIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfc2FsX3N0b3A7CisgICB9CisKKyAgIHZvc1N0YXR1cyA9IFdMQU5CQUxfU3RhcnQocEhkZEN0eC0+cHZvc0NvbnRleHQpOworCisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdGFydCBCQUwiLF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX3NhbF9zdG9wOworICAgfQorI2VuZGlmCisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgIiVzOiBjYWxsaW5nIGhkZF9zZXRfc21lX2NvbmZpZyIsX19mdW5jX18pOworICAgdm9zU3RhdHVzID0gaGRkX3NldF9zbWVfY29uZmlnKCBwSGRkQ3R4ICk7CisgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCBpbiBoZGRfc2V0X3NtZV9jb25maWciLF9fZnVuY19fKTsKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworICAgICAgZ290byBlcnJfYmFsX3N0b3A7CisjZWxzZQorICAgICAgZ290byBlcnJfZGVlcF9zbGVlcDsKKyNlbmRpZgorICAgfQorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAiJXM6IGNhbGxpbmcgdm9zX3N0YXJ0IixfX2Z1bmNfXyk7CisgICB2b3NTdGF0dXMgPSB2b3Nfc3RhcnQoIHBIZGRDdHgtPnB2b3NDb250ZXh0ICk7CisgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCBpbiB2b3Nfc3RhcnQiLF9fZnVuY19fKTsKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworICAgICAgZ290byBlcnJfYmFsX3N0b3A7CisjZWxzZQorICAgICAgZ290byBlcnJfZGVlcF9zbGVlcDsKKyNlbmRpZgorICAgfQorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAiJXM6IGNhbGxpbmcgaGRkX3Bvc3Rfdm9zc19zdGFydF9jb25maWciLF9fZnVuY19fKTsKKyAgIHZvc1N0YXR1cyA9IGhkZF9wb3N0X3Zvc3Nfc3RhcnRfY29uZmlnKCBwSGRkQ3R4ICk7CisgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCBpbiBoZGRfcG9zdF92b3NzX3N0YXJ0X2NvbmZpZyIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfdm9zc19zdG9wOworICAgfQorCisKKyAgIC8vT3BlbiBhIFNNRSBzZXNzaW9uIGZvciBmdXR1cmUgb3BlcmF0aW9uCisgICBoYWxTdGF0dXMgPSBzbWVfT3BlblNlc3Npb24oIHBIZGRDdHgtPmhIYWwsIGhkZF9zbWVSb2FtQ2FsbGJhY2ssIHBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopJnBBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudCwgJnBBZGFwdGVyLT5zZXNzaW9uSWQgKTsKKyAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyggaGFsU3RhdHVzICkgKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwic21lX09wZW5TZXNzaW9uKCkgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJTA4ZCBbeCUwOGx4XSIsCisgICAgICAgICAgICAgICAgICAgIGhhbFN0YXR1cywgaGFsU3RhdHVzICk7CisgICAgICBnb3RvIGVycl92b3NzX3N0b3A7CisKKyAgIH0KKworICAgcEhkZEN0eC0+aGRkX3BzX3N0YXRlID0gZUhERF9TVVNQRU5EX05PTkU7CisKKyAgIC8vVHJpZ2dlciB0aGUgaW5pdGlhbCBzY2FuCisgICBoZGRfd2xhbl9pbml0aWFsX3NjYW4ocEhkZEN0eCk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKK2Vycl92b3NzX3N0b3A6CisgICB2b3Nfc3RvcChwSGRkQ3R4LT5wdm9zQ29udGV4dCk7CisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KK2Vycl9iYWxfc3RvcDoKKyAgIFdMQU5CQUxfU3RvcChwSGRkQ3R4LT5wdm9zQ29udGV4dCk7CitlcnJfc2FsX3N0b3A6CisgICBXTEFOU0FMX1N0b3AocEhkZEN0eC0+cHZvc0NvbnRleHQpOworI2VuZGlmCitlcnJfZGVlcF9zbGVlcDoKKyAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKworfQorCitWT1NfU1RBVFVTIGhkZF9jb25mX2hvc3RhcnBvZmZsb2FkKGhkZF9jb250ZXh0X3QqIHBIZGRDdHgsIHZfQk9PTF90IGZlbmFibGUpCit7CisgICBzdHJ1Y3QgaW5faWZhZGRyICoqaWZhcCA9IE5VTEw7CisgICBzdHJ1Y3QgaW5faWZhZGRyICppZmEgPSBOVUxMOworICAgc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworICAgaW50IGkgPSAwOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOyAgIAorICAgdFNpckhvc3RPZmZsb2FkUmVxICBvZmZMb2FkUmVxdWVzdDsKKworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBcbiIsIF9fZnVuY19fKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworICAgaWYgKHBIZGRDdHgtPmNmZ19pbmktPmlzTWNBZGRyTGlzdEZpbHRlcikKKyAgIHsKKyAgICAgIHBBZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKHBIZGRDdHgsIFdMQU5fSEREX1AyUF9HTyk7CisgICAgICBpZiAocEFkYXB0ZXIgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICIlczogQ2FuJ3Qgc2V0IG11bHRpY2FzdCBhZGRyIGZpbHRlcmluZyBpbiBQMlAtR08gSEREIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIH0KKworICAgICAgcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwgV0xBTl9IRERfUDJQX0NMSUVOVCk7CisgICAgICBpZiAocEFkYXB0ZXIgPT0gTlVMTCkgICAgCisgICAgICAgICBwQWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LCBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKTsKKworICAgICAgaWYocEFkYXB0ZXIgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEhERCBhZGFwdGVyIGNvbnRleHQgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisjZW5kaWYKKyAgICAgIHBBZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKHBIZGRDdHgsV0xBTl9IRERfSU5GUkFfU1RBVElPTik7CisgICAgICBpZihwQWRhcHRlciA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCxXTEFOX0hERF9QMlBfQ0xJRU5UKTsKKyAgICAgICAgIGlmKHBBZGFwdGVyID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBIREQgYWRhcHRlciBjb250ZXh0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgfQorICAgICAgfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisgICB9CisjZW5kaWYKKyAgIGlmKGZlbmFibGUpCisgICB7CisgICAgICAgaWYgKChpbl9kZXYgPSBfX2luX2Rldl9nZXRfcnRubChwQWRhcHRlci0+ZGV2KSkgIT0gTlVMTCkKKyAgICAgICB7CisgICAgICAgICAgIGZvciAoaWZhcCA9ICZpbl9kZXYtPmlmYV9saXN0OyAoaWZhID0gKmlmYXApICE9IE5VTEw7IAorICAgICAgICAgICAgICAgICAgIGlmYXAgPSAmaWZhLT5pZmFfbmV4dCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAocEFkYXB0ZXItPmRldi0+bmFtZSwgaWZhLT5pZmFfbGFiZWwpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBmb3VuZCAqLworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIAorICAgICAgIGlmKGlmYSAmJiBpZmEtPmlmYV9sb2NhbCkKKyAgICAgICB7CisgICAgICAgICAgIG9mZkxvYWRSZXF1ZXN0Lm9mZmxvYWRUeXBlID0gIFNJUl9JUFY0X0FSUF9SRVBMWV9PRkZMT0FEOworICAgICAgICAgICBvZmZMb2FkUmVxdWVzdC5lbmFibGVPckRpc2FibGUgPSBTSVJfT0ZGTE9BRF9FTkFCTEU7CisKKyAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBFbmFibGVkIFxuIiwgX19mdW5jX18pOworCisgICAgICAgICAgIGlmKChIRERfTUNBU1RCQ0FTVEZJTFRFUl9GSUxURVJfQUxMX0JST0FEQ0FTVCA9PQorICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPm1jYXN0QmNhc3RGaWx0ZXJTZXR0aW5nICkKKyAgICAgICAgICAgICAgICAgICAgfHwgKEhERF9NQ0FTVEJDQVNURklMVEVSX0ZJTFRFUl9BTExfTVVMVElDQVNUX0JST0FEQ0FTVCA9PQorICAgICAgICAgICAgICAgICAgICBwSGRkQ3R4LT5jZmdfaW5pLT5tY2FzdEJjYXN0RmlsdGVyU2V0dGluZykpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vTUNBU1QgZmlsdGVyIGlzIHNldCBieSBoZGRfY29uZl9tY2FzdGJjYXN0X2ZpbHRlciBmbiBjYWxsCisgICAgICAgICAgICAgICBvZmZMb2FkUmVxdWVzdC5lbmFibGVPckRpc2FibGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgU0lSX09GRkxPQURfQVJQX0FORF9CQ0FTVF9GSUxURVJfRU5BQkxFOworICAgICAgICAgICB9CisgICAgICAgICAgIAorICAgICAgICAgICAvL2NvbnZlcnRpbmcgdTMyIHRvIElQVjQgYWRkcmVzcworICAgICAgICAgICBmb3IoaSA9IDAgOyBpIDwgNDsgaSsrKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIG9mZkxvYWRSZXF1ZXN0LnBhcmFtcy5ob3N0SXB2NEFkZHJbaV0gPSAKKyAgICAgICAgICAgICAgICAgICAgICAoaWZhLT5pZmFfbG9jYWwgPj4gKGkqOCkgKSAmIDB4RkYgOworICAgICAgICAgICB9CisgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIiBFbmFibGUgU01FIEhvc3RPZmZsb2FkOiAlZC4lZC4lZC4lZCIsCisgICAgICAgICAgICAgICAgICBvZmZMb2FkUmVxdWVzdC5wYXJhbXMuaG9zdElwdjRBZGRyWzBdLAorICAgICAgICAgICAgICAgICAgb2ZmTG9hZFJlcXVlc3QucGFyYW1zLmhvc3RJcHY0QWRkclsxXSwKKyAgICAgICAgICAgICAgICAgIG9mZkxvYWRSZXF1ZXN0LnBhcmFtcy5ob3N0SXB2NEFkZHJbMl0sCisgICAgICAgICAgICAgICAgICBvZmZMb2FkUmVxdWVzdC5wYXJhbXMuaG9zdElwdjRBZGRyWzNdKTsKKworICAgICAgICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IAorICAgICAgICAgICAgICAgICAgICBzbWVfU2V0SG9zdE9mZmxvYWQoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpICwgJm9mZkxvYWRSZXF1ZXN0KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogRmFpbGVkIHRvIGVuYWJsZSBIb3N0T2ZmbG9hZCAiCisgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczpJUCBBZGRyZXNzIGlzIG5vdCBhc3NpZ25lZCBcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9BR0FJTjsKKyAgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgdm9zX21lbV96ZXJvKCh2b2lkICopJm9mZkxvYWRSZXF1ZXN0LCBzaXplb2YodFNpckhvc3RPZmZsb2FkUmVxKSk7CisgICAgICAgb2ZmTG9hZFJlcXVlc3QuZW5hYmxlT3JEaXNhYmxlID0gU0lSX09GRkxPQURfRElTQUJMRTsKKyAgICAgICBvZmZMb2FkUmVxdWVzdC5vZmZsb2FkVHlwZSA9ICBTSVJfSVBWNF9BUlBfUkVQTFlfT0ZGTE9BRDsKKworICAgICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHNtZV9TZXRIb3N0T2ZmbG9hZChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksICZvZmZMb2FkUmVxdWVzdCkpCisgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBGYWlsdXJlIHRvIGRpc2FibGUgaG9zdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZsb2FkIGZlYXR1cmVcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KK30KKwordm9pZCBoZGRfY29uZl9tY2FzdGJjYXN0X2ZpbHRlcihoZGRfY29udGV4dF90KiBwSGRkQ3R4LCB2X0JPT0xfdCBzZXRmaWx0ZXIpCit7CisgICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9TTUUsIHBIZGRDdHgtPnB2b3NDb250ZXh0KTsKKyNlbHNlCisgICAgdHBTaXJXbGFuU2V0UnhwRmlsdGVycyB3bGFuUnhwRmlsdGVyUGFyYW0gPQorICAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJXbGFuU2V0UnhwRmlsdGVycykpOworICAgIGlmKE5VTEwgPT0gd2xhblJ4cEZpbHRlclBhcmFtKQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgIiVzOiB2b3NfbWVtX2FsbG9jIGZhaWxlZCAiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICIlczogQ29uZmlndXJpbmcgTWNhc3QvQmNhc3QgRmlsdGVyIFNldHRpbmcuIHNldGZpbHRlciAlZCIsIF9fZnVuY19fLCBzZXRmaWx0ZXIpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICBpZiAoIHBNYWMgKSAKKyAgICB7CisgICAgICBoYWxTdGF0dXMgPSBoYWxSeHBfY29uZmlndXJlUnhwRmlsdGVyTWNzdEJjc3QoIHBNYWMsIHNldGZpbHRlcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IHBNYWMgaXMgaW5pdGlhbGlzZWQgdG8gTlVMTCIsX19mdW5jX18gKTsKKyAgICB9CisjZWxzZQorICAgIHdsYW5SeHBGaWx0ZXJQYXJhbS0+c2V0TWNzdEJjc3RGaWx0ZXIgPSBzZXRmaWx0ZXI7CisgICAgd2xhblJ4cEZpbHRlclBhcmFtLT5jb25maWd1cmVkTWNzdEJjc3RGaWx0ZXJTZXR0aW5nID0gCisgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+bWNhc3RCY2FzdEZpbHRlclNldHRpbmc7CisgICAgaGFsU3RhdHVzID0gc21lX0NvbmZpZ3VyZVJ4cEZpbHRlcihwSGRkQ3R4LT5oSGFsLCB3bGFuUnhwRmlsdGVyUGFyYW0pOworI2VuZGlmCisgICAgaWYoc2V0ZmlsdGVyICYmIChlSEFMX1NUQVRVU19TVUNDRVNTID09IGhhbFN0YXR1cykpCisgICAgICAgcEhkZEN0eC0+aGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldCA9IFRSVUU7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKK3N0YXRpYyB2b2lkIGhkZF9jb25mX3N1c3BlbmRfaW5kKGhkZF9jb250ZXh0X3QqIHBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKyAgICBlSGFsU3RhdHVzIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdHBTaXJXbGFuU3VzcGVuZFBhcmFtIHdsYW5TdXNwZW5kUGFyYW0gPQorICAgICAgdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJXbGFuU3VzcGVuZFBhcmFtKSk7CisKKyAgICBpZihOVUxMID09IHdsYW5TdXNwZW5kUGFyYW0pCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAiJXM6IHZvc19tZW1fYWxsb2MgZmFpbGVkICIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAiJXM6IHNlbmQgd2xhbiBzdXNwZW5kIGluZGljYXRpb24iLCBfX2Z1bmNfXyk7CisKKyAgICBpZigocEhkZEN0eC0+Y2ZnX2luaS0+bkVuYWJsZVN1c3BlbmQgPT0gV0xBTl9NQVBfU1VTUEVORF9UT19NQ0FTVF9CQ0FTVF9GSUxURVIpKQorICAgIHsKKyAgICAgICAgaWYoKHBIZGRDdHgtPmNmZ19pbmktPmZob3N0QXJwT2ZmbG9hZCkgJiYgCisgICAgICAgICAgIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0gCisgICAgICAgICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uY29ublN0YXRlKSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbFN0YXR1cyA9IGhkZF9jb25mX2hvc3RhcnBvZmZsb2FkKHBIZGRDdHgsIFRSVUUpOworICAgICAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoaGFsU3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICIlczpGYWlsZWQgdG8gZW5hYmxlIEFSUE9GRkxPQUQgRmVhdHVyZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGhhbFN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihwSGRkQ3R4LT5keW5hbWljX21jYmNfZmlsdGVyLmVuYWJsZUNmZykKKyAgICAgICAgeworICAgICAgICAgICAgd2xhblN1c3BlbmRQYXJhbS0+Y29uZmlndXJlZE1jc3RCY3N0RmlsdGVyU2V0dGluZyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmR5bmFtaWNfbWNiY19maWx0ZXIubWNhc3RCY2FzdEZpbHRlclNldHRpbmc7CisgICAgICAgICAgICBwSGRkQ3R4LT5keW5hbWljX21jYmNfZmlsdGVyLmVuYWJsZVN1c3BlbmQgPSBUUlVFOworICAgICAgICAgICAgcEhkZEN0eC0+ZHluYW1pY19tY2JjX2ZpbHRlci5tY0JjRmlsdGVyU3VzcGVuZCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgIHdsYW5TdXNwZW5kUGFyYW0tPmNvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwSGRkQ3R4LT5keW5hbWljX21jYmNfZmlsdGVyLmVuYWJsZVN1c3BlbmQgPSBGQUxTRTsKKyAgICAgICAgICAgIHdsYW5TdXNwZW5kUGFyYW0tPmNvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmcgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPm1jYXN0QmNhc3RGaWx0ZXJTZXR0aW5nOworICAgICAgICB9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworICAgICAgICBpZiAocEhkZEN0eC0+Y2ZnX2luaS0+aXNNY0FkZHJMaXN0RmlsdGVyKQorICAgICAgICB7CisgICAgICAgICAgIC8qTXVsdGljYXN0IGFkZHIgbGlzdCBmaWx0ZXIgaXMgZW5hYmxlZCBkdXJpbmcgc3VzcGVuZCovCisgICAgICAgICAgIGlmICgoKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKSB8fCAKKyAgICAgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5kZXZpY2VfbW9kZSA9PSBXTEFOX0hERF9QMlBfQ0xJRU5UKSkKKyAgICAgICAgICAgICAgICAgJiYgcEhkZEN0eC0+bWNfYWRkcl9saXN0Lm1jX2NudAorICAgICAgICAgICAgICAgICAmJiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09IAorICAgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uY29ublN0YXRlKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAvKnNldCB0aGUgZmlsdGVyKi8KKyAgICAgICAgICAgICAgd2xhbl9oZGRfc2V0X21jX2FkZHJfbGlzdChwSGRkQ3R4LCBUUlVFKTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBoYWxTdGF0dXMgPSBzbWVfQ29uZmlndXJlU3VzcGVuZEluZChwSGRkQ3R4LT5oSGFsLCB3bGFuU3VzcGVuZFBhcmFtKTsKKyAgICBpZihlSEFMX1NUQVRVU19TVUNDRVNTID09IGhhbFN0YXR1cykKKyAgICB7CisgICAgICAgIHBIZGRDdHgtPmhkZF9tY2FzdGJjYXN0X2ZpbHRlcl9zZXQgPSBUUlVFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaGRkX2NvbmZfcmVzdW1lX2luZChoZGRfY29udGV4dF90KiBwSGRkQ3R4KQoreworICAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0cFNpcldsYW5SZXN1bWVQYXJhbSB3bGFuUmVzdW1lUGFyYW0gPQorICAgICAgdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJXbGFuUmVzdW1lUGFyYW0pKTsKKworICAgIGlmKE5VTEwgPT0gd2xhblJlc3VtZVBhcmFtKQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgIiVzOiB2b3NfbWVtX2FsbG9jIGZhaWxlZCAiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgIiVzOiBzZW5kIHdsYW4gcmVzdW1lIGluZGljYXRpb24iLCBfX2Z1bmNfXyk7CisKKyAgICBpZihwSGRkQ3R4LT5jZmdfaW5pLT5maG9zdEFycE9mZmxvYWQpCisgICAgeworICAgICAgICBoYWxTdGF0dXMgPSBoZGRfY29uZl9ob3N0YXJwb2ZmbG9hZChwSGRkQ3R4LCBGQUxTRSk7CisgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKGhhbFN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOkZhaWxlZCB0byBkaXNhYmxlIEFSUE9GRkxPQUQgIgorICAgICAgICAgICAgICAgICAgIkZlYXR1cmUgJWRcbiIsIF9fZnVuY19fLCBoYWxTdGF0dXMpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwSGRkQ3R4LT5keW5hbWljX21jYmNfZmlsdGVyLmVuYWJsZVN1c3BlbmQpCisgICAgeworICAgICAgICB3bGFuUmVzdW1lUGFyYW0tPmNvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmcgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRkQ3R4LT5keW5hbWljX21jYmNfZmlsdGVyLm1jQmNGaWx0ZXJTdXNwZW5kOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3bGFuUmVzdW1lUGFyYW0tPmNvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmcgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPm1jYXN0QmNhc3RGaWx0ZXJTZXR0aW5nOworICAgIH0KKyAgICBzbWVfQ29uZmlndXJlUmVzdW1lUmVxKHBIZGRDdHgtPmhIYWwsIHdsYW5SZXN1bWVQYXJhbSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORyAgICAKKyAgICBpZiAocEhkZEN0eC0+Y2ZnX2luaS0+aXNNY0FkZHJMaXN0RmlsdGVyKQorICAgIHsKKyAgICAgICAvKk11dGxpY2FzdCBhZGRyIGZpbHRlcmluZyBpcyBlbmFibGVkKi8KKyAgICAgICBpZihwSGRkQ3R4LT5tY19hZGRyX2xpc3QuaXNGaWx0ZXJBcHBsaWVkKQorICAgICAgIHsKKyAgICAgICAgICAvKkZpbHRlciBhcHBsaWVkIGR1cmluZyBzdXNwZW5kIG1vZGUqLworICAgICAgICAgIC8qQ2xlYXIgaXQgaGVyZSovCisgICAgICAgICAgd2xhbl9oZGRfc2V0X21jX2FkZHJfbGlzdChwSGRkQ3R4LCBGQUxTRSk7CisgICAgICAgfQorICAgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAorLy9TdXNwZW5kIHJvdXRpbmUgcmVnaXN0ZXJlZCB3aXRoIEFuZHJvaWQgT1MKK3ZvaWQgaGRkX3N1c3BlbmRfd2xhbihzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqd2xhbl9zdXNwZW5kKQoreworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IE5VTEw7CisgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCA9IE5VTEw7CisKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gTlVMTDsgCisgICBoZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcEFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICBzdHJ1Y3Qgc2Rpb19mdW5jICpzZGlvX2Z1bmNfZGV2ID0gTlVMTDsKKyNlbmRpZgorICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFdMQU4gYmVpbmcgc3VzcGVuZGVkIGJ5IEFuZHJvaWQgT1MiLF9fZnVuY19fKTsKKworICAgLy9HZXQgdGhlIGdsb2JhbCBWT1NTIGNvbnRleHQuCisgICBwVm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9TWVMsIE5VTEwpOworICAgaWYoIXBWb3NDb250ZXh0KSB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogR2xvYmFsIFZPUyBjb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8vR2V0IHRoZSBIREQgY29udGV4dC4KKyAgIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX0hERCwgcFZvc0NvbnRleHQgKTsKKworICAgaWYoIXBIZGRDdHgpIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChwSGRkQ3R4LT5pc0xvZ3BJblByb2dyZXNzKSB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICIlczogSWdub3JlIHN1c3BlbmQgd2xhbiwgTE9HUCBpbiBwcm9ncmVzcyEiLCBfX2Z1bmNfXyk7CisgICAgICByZXR1cm47CisgICB9CisKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworICAgc2Rpb19mdW5jX2RldiA9IGxpYnJhX2dldHNkaW9fZnVuY2RldigpOworCisgICBpZihzZGlvX2Z1bmNfZGV2ID09IE5VTEwpCisgICB7CisgICAgICAgIC8qIE91ciBjYXJkIGdvdCByZW1vdmVkICovCisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogc2Rpb19mdW5jX2RldiBpcyBOVUxMISIsX19mdW5jX18pOworICAgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmKCFzZF9pc19kcnZkYXRhX2F2YWlsYWJsZShzZGlvX2Z1bmNfZGV2KSkKKyAgIHsKKyAgICAgICAgLyogT3VyIGNhcmQgZ290IHJlbW92ZWQgKi8KKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICIlczogSEREIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBzZGlvX2Z1bmNfZGV2ISIsX19mdW5jX18pOworICAgICAgICByZXR1cm47CisgICB9CisKKyAgIHNkX2NsYWltX2hvc3Qoc2Rpb19mdW5jX2Rldik7CisgICAKKyAgIC8vIFByZXZlbnQgdG91Y2hpbmcgdGhlIHBNYWMgd2hpbGUgTE9HUCByZXNldCBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlCisgICAvLyBhcyB0aGUgd2FrZSBsb2NrIGlzIGFscmVhZHkgYWNxdWlyZWQgYW5kIGl0IHdvdWxkIHByZXZlbnQgZnJvbSBlbnRlcmluZyBzdXNwZW5kIAorICAgaWYgKHBIZGRDdHgtPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogSWdub3JlIHN1c3BlbmQgd2xhbiwgTE9HUCBpbiBwcm9ncmVzcyEiLCBfX2Z1bmNfXyk7CisgICAgICBzZF9yZWxlYXNlX2hvc3Qoc2Rpb19mdW5jX2Rldik7CisgICAgICByZXR1cm47CisgICB9CisjZW5kaWYKKworICAgLypsb29wIHRocm91Z2ggYWxsIGFkYXB0ZXJzLiBUQkQgZml4IGZvciBDb25jdXJyZW5jeSAqLworICAgc3RhdHVzID0gIGhkZF9nZXRfZnJvbnRfYWRhcHRlciAoIHBIZGRDdHgsICZwQWRhcHRlck5vZGUgKTsKKyAgIHdoaWxlICggTlVMTCAhPSBwQWRhcHRlck5vZGUgJiYgVk9TX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cyApCisgICB7CisgICAgICAgcEFkYXB0ZXIgPSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyOworICAgICAgIGlmICggKFdMQU5fSEREX0lORlJBX1NUQVRJT04gIT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorICAgICAgICAgJiYgKFdMQU5fSEREX1AyUF9DTElFTlQgIT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSApCisKKyAgICAgICB7ICAvL2p1c3QgZG8gZm9yIHN0YXRpb24gaW50ZXJmYWNlCisgICAgICAgICAgIHN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyICggcEhkZEN0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQgKTsKKyAgICAgICAgICAgcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgIH0KKworI2lmZGVmIFNVUFBPUlRfRUFSTFlfU1VTUEVORF9TVEFOREJZX0RFRVBTTEVFUAorICAgICAgIGlmIChwSGRkQ3R4LT5jZmdfaW5pLT5uRW5hYmxlU3VzcGVuZCA9PSBXTEFOX01BUF9TVVNQRU5EX1RPX1NUQU5EQlkpCisgICAgICAgeworICAgICAgICAgIC8vc3RvcCB0aGUgaW50ZXJmYWNlIGJlZm9yZSBwdXR0aW5nIHRoZSBjaGlwIHRvIHN0YW5kYnkKKyAgICAgICAgICBuZXRpZl90eF9kaXNhYmxlKHBBZGFwdGVyLT5kZXYpOworICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb2ZmKHBBZGFwdGVyLT5kZXYpOworICAgICAgIH0KKyAgICAgICBlbHNlIGlmIChwSGRkQ3R4LT5jZmdfaW5pLT5uRW5hYmxlU3VzcGVuZCA9PSAKKyAgICAgICAgICAgICAgIFdMQU5fTUFQX1NVU1BFTkRfVE9fREVFUF9TTEVFUCkKKyAgICAgICB7CisgICAgICAgICAgLy9FeGVjdXRlIGRlZXAgc2xlZXAgcHJvY2VkdXJlCisgICAgICAgICAgaGRkX2VudGVyX2RlZXBfc2xlZXAocEhkZEN0eCwgcEFkYXB0ZXIpOworICAgICAgIH0KKyNlbmRpZgorCisgICBpZigocEhkZEN0eC0+Y2ZnX2luaS0+ZW5hYmxlRHluYW1pY0RUSU0gfHwKKyAgICAgICBwSGRkQ3R4LT5jZmdfaW5pLT5lbmFibGVNb2R1bGF0ZWREVElNKSAmJiAKKyAgICAgICAoZUFOSV9CT09MRUFOX1RSVUUgPT0gcEFkYXB0ZXItPmhpZ2hlckR0aW1UcmFuc2l0aW9uKSAmJgorICAgICAgKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCA9PSAKKyAgICAgICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5jb25uU3RhdGUpICYmCisgICAgICAgICAocEhkZEN0eC0+Y2ZnX2luaS0+ZklzQm1wc0VuYWJsZWQpKQorICAgeworICAgICAgdFNpclNldFBvd2VyUGFyYW1zUmVxIHBvd2VyUmVxdWVzdCA9IHsgMCB9OworCisgICAgICBwb3dlclJlcXVlc3QudUlnbm9yZURUSU0gPSAxOworICAKKyAgICAgIC8qQmFjayB1cCB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIENGRyAqLworICAgICAgd2xhbl9jZmdHZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19JR05PUkVfRFRJTSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEhkZEN0eC0+aGRkX2FjdHVhbF9pZ25vcmVfRFRJTV92YWx1ZSk7CisgICAgICB3bGFuX2NmZ0dldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEhkZEN0eC0+aGRkX2FjdHVhbF9MSV92YWx1ZSk7CisgICAgICAKKyAgICAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPmVuYWJsZU1vZHVsYXRlZERUSU0pCisgICAgICB7CisgICAgICAgICAgcG93ZXJSZXF1ZXN0LnVEVElNUGVyaW9kID0gcEhkZEN0eC0+Y2ZnX2luaS0+ZW5hYmxlTW9kdWxhdGVkRFRJTTsKKyAgICAgICAgICBwb3dlclJlcXVlc3QudUxpc3RlbkludGVydmFsID0gcEhkZEN0eC0+aGRkX2FjdHVhbF9MSV92YWx1ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICBwb3dlclJlcXVlc3QudUxpc3RlbkludGVydmFsID0gcEhkZEN0eC0+Y2ZnX2luaS0+ZW5hYmxlRHluYW1pY0RUSU07CisgICAgICB9ICAgCisKKyAgICAgIC8qIFVwZGF0ZSBpZ25vcmVEVElNIGFuZCBMaXN0ZWRJbnRlcnZhbCBpbiBDRkcgdG8gcmVtYWluIGF0IHRoZSBEVElNIAorICAgICAgKnNwZWNpZmllZCBkdXJpbmcgRW50ZXIvRXhpdCBCTVBTIHdoZW4gTENEIG9mZiovCisgICAgICBjY21DZmdTZXRJbnQocEhkZEN0eC0+aEhhbCwgV05JX0NGR19JR05PUkVfRFRJTSwgcG93ZXJSZXF1ZXN0LnVJZ25vcmVEVElNLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMLCBwb3dlclJlcXVlc3QudUxpc3RlbkludGVydmFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKworICAgICAgLyogc3dpdGNoIHRvIHRoZSBEVElNIHNwZWNpZmllZCBpbiBjZmcuaW5pICovCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICAgICJTd2l0Y2ggdG8gRFRJTSVkIFxuIiwgcG93ZXJSZXF1ZXN0LnVMaXN0ZW5JbnRlcnZhbCk7CisgICAgICBzbWVfU2V0UG93ZXJQYXJhbXMoIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwgJnBvd2VyUmVxdWVzdCk7ICAgIAorCisgICAgICBpZiAoQk1QUyA9PSBwbWNHZXRQbWNTdGF0ZShwSGRkQ3R4LT5oSGFsKSkKKyAgICAgIHsKKyAgICAgICAgICAvKiBwdXQgdGhlIGRldmljZSBpbnRvIGZ1bGwgcG93ZXIgKi8KKyAgICAgICAgICB3bGFuX2hkZF9lbnRlcl9ibXBzKHBBZGFwdGVyLCBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpOworCisgICAgICAgICAgLyogcHV0IHRoZSBkZXZpY2UgYmFjayBpbnRvIEJNUFMgKi8KKyAgICAgICAgICB3bGFuX2hkZF9lbnRlcl9ibXBzKHBBZGFwdGVyLCBEUklWRVJfUE9XRVJfTU9ERV9BVVRPKTsKKworICAgICAgICAgIHBIZGRDdHgtPmhkZF9pZ25vcmVfZHRpbV9lbmFibGVkID0gVFJVRTsKKyAgICAgIH0KKyAgIH0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgLypTdXNwZW5kIG5vdGlmaWNhdGlvbiBzZW50IGRvd24gdG8gZHJpdmVyKi8KKyAgICAgIGhkZF9jb25mX3N1c3BlbmRfaW5kKHBIZGRDdHgsIHBBZGFwdGVyKTsKKyNlbHNlCisgICAgICBpZihwSGRkQ3R4LT5jZmdfaW5pLT5uRW5hYmxlU3VzcGVuZCA9PSBXTEFOX01BUF9TVVNQRU5EX1RPX01DQVNUX0JDQVNUX0ZJTFRFUikgeworICAgICAgICAgaWYoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09IAorICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkgeworICAgICAgICAgICAgaGRkX2NvbmZfbWNhc3RiY2FzdF9maWx0ZXIocEhkZEN0eCwgVFJVRSk7CisgICAgICAgICAgICBoYWxQU0FwcHNDcHVXYWtldXBTdGF0ZSh2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9TTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+cHZvc0NvbnRleHQpLCBGQUxTRSk7CisgICAgICAgICB9CisgICAgICB9IAorI2VuZGlmCisgICBzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlciAoIHBIZGRDdHgsIHBBZGFwdGVyTm9kZSwgJnBOZXh0ICk7CisgICBwQWRhcHRlck5vZGUgPSBwTmV4dDsKKyAgfQorICBwSGRkQ3R4LT5oZGRfd2xhbl9zdXNwZW5kZWQgPSBUUlVFOworCisjaWZkZWYgU1VQUE9SVF9FQVJMWV9TVVNQRU5EX1NUQU5EQllfREVFUFNMRUVQCisgIGlmKHBIZGRDdHgtPmNmZ19pbmktPm5FbmFibGVTdXNwZW5kID09IFdMQU5fTUFQX1NVU1BFTkRfVE9fU1RBTkRCWSkKKyAgeworICAgICAgaGRkX2VudGVyX3N0YW5kYnkocEhkZEN0eCk7CisgIH0KKyNlbmRpZgorI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICBzZF9yZWxlYXNlX2hvc3Qoc2Rpb19mdW5jX2Rldik7CisjZW5kaWYKKworICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBoZGRfUG93ZXJTdGF0ZUNoYW5nZWRDQgorKAorICAgdl9QVk9JRF90IGNhbGxiYWNrQ29udGV4dCwKKyAgIHRQbWNTdGF0ZSBuZXdTdGF0ZQorKQoreworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IGNhbGxiYWNrQ29udGV4dDsKKyAgIAorICAgLyogaWYgdGhlIGRyaXZlciB3YXMgbm90IGluIEJNUFMgZHVyaW5nIGVhcmx5IHN1c3BlbmQsCisgICAgKiB0aGUgZHluYW1pYyBEVElNIGlzIG5vdyB1cGRhdGVkIGF0IFJpdmEgKi8KKyAgIGlmICgobmV3U3RhdGUgPT0gQk1QUykgJiYgcEhkZEN0eC0+aGRkX3dsYW5fc3VzcGVuZGVkCisgICAgICAgICAgICYmIHBIZGRDdHgtPmNmZ19pbmktPmVuYWJsZUR5bmFtaWNEVElNCisgICAgICAgICAgICYmIChwSGRkQ3R4LT5oZGRfaWdub3JlX2R0aW1fZW5hYmxlZCA9PSBGQUxTRSkpCisgICB7CisgICAgICAgcEhkZEN0eC0+aGRkX2lnbm9yZV9kdGltX2VuYWJsZWQgPSBUUlVFOworICAgfQorICAgc3Bpbl9sb2NrKCZwSGRkQ3R4LT5maWx0ZXJfbG9jayk7CisgICBpZigobmV3U3RhdGUgPT0gQk1QUykgJiYgIHBIZGRDdHgtPmhkZF93bGFuX3N1c3BlbmRlZAorICAgICAgICAgICYmIChwSGRkQ3R4LT5oZGRfbWNhc3RiY2FzdF9maWx0ZXJfc2V0ICE9IFRSVUUpKSB7CisgICAgICBzcGluX3VubG9jaygmcEhkZEN0eC0+ZmlsdGVyX2xvY2spOworICAgICAgaGRkX2NvbmZfbWNhc3RiY2FzdF9maWx0ZXIocEhkZEN0eCwgVFJVRSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgICAgaGFsUFNBcHBzQ3B1V2FrZXVwU3RhdGUodm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfU01FLCBwSGRkQ3R4LT5wdm9zQ29udGV4dCksIEZBTFNFKTsKKyNlbmRpZgorICAgICAgaWYocEhkZEN0eC0+aGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldCAhPSBUUlVFKQorICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBOb3QgYWJsZSB0byBzZXQgbWNhc3QvYmNhc3QgZmlsdGVyICIsIF9fZnVuY19fKTsKKyAgIH0KKyAgIGVsc2UgCisgICAgICBzcGluX3VubG9jaygmcEhkZEN0eC0+ZmlsdGVyX2xvY2spOworfQorCisKKwordm9pZCBoZGRfcmVnaXN0ZXJfbWNhc3RfYmNhc3RfZmlsdGVyKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dDsKKyAgIHRIYWxIYW5kbGUgc21lQ29udGV4dDsKKworICAgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU1lTLCBOVUxMKTsKKyAgIGlmIChOVUxMID09IHBWb3NDb250ZXh0KQorICAgeworICAgICAgaGRkTG9nKExPR0UsICIlczogSW52YWxpZCBwQ29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm47CisgICB9CisgICBzbWVDb250ZXh0ID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfU01FLCBwVm9zQ29udGV4dCk7CisgICBpZiAoTlVMTCA9PSBzbWVDb250ZXh0KQorICAgeworICAgICAgaGRkTG9nKExPR0UsICIlczogSW52YWxpZCBzbWVDb250ZXh0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgc3Bpbl9sb2NrX2luaXQoJnBIZGRDdHgtPmZpbHRlcl9sb2NrKTsKKyAgIGlmIChXTEFOX01BUF9TVVNQRU5EX1RPX01DQVNUX0JDQVNUX0ZJTFRFUiA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRkQ3R4LT5jZmdfaW5pLT5uRW5hYmxlU3VzcGVuZCkKKyAgIHsKKyAgICAgIHBtY1JlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQoc21lQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX1Bvd2VyU3RhdGVDaGFuZ2VkQ0IsIHBIZGRDdHgpOworICAgfQorfQorCit2b2lkIGhkZF91bnJlZ2lzdGVyX21jYXN0X2JjYXN0X2ZpbHRlcihoZGRfY29udGV4dF90ICpwSGRkQ3R4KQoreworICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQ7CisgICB0SGFsSGFuZGxlIHNtZUNvbnRleHQ7CisKKyAgIHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NZUywgTlVMTCk7CisgICBpZiAoTlVMTCA9PSBwVm9zQ29udGV4dCkKKyAgIHsKKyAgICAgIGhkZExvZyhMT0dFLCAiJXM6IEludmFsaWQgcENvbnRleHQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuOworICAgfQorICAgc21lQ29udGV4dCA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgcFZvc0NvbnRleHQpOworICAgaWYgKE5VTEwgPT0gc21lQ29udGV4dCkKKyAgIHsKKyAgICAgIGhkZExvZyhMT0dFLCAiJXM6IEludmFsaWQgc21lQ29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChXTEFOX01BUF9TVVNQRU5EX1RPX01DQVNUX0JDQVNUX0ZJTFRFUiA9PSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+bkVuYWJsZVN1c3BlbmQpCisgICB7CisgICAgICBwbWNEZXJlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQoc21lQ29udGV4dCwgaGRkX1Bvd2VyU3RhdGVDaGFuZ2VkQ0IpOworICAgfQorfQorCit2b2lkIGhkZF9yZXN1bWVfd2xhbihzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqd2xhbl9zdXNwZW5kKQoreworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IE5VTEw7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7CisgICBoZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcEFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSBOVUxMOworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICBzdHJ1Y3Qgc2Rpb19mdW5jICpzZGlvX2Z1bmNfZGV2ID0gTlVMTDsKKyNlbmRpZgorICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFdMQU4gYmVpbmcgcmVzdW1lZCBieSBBbmRyb2lkIE9TIixfX2Z1bmNfXyk7CisKKyAgIC8vR2V0IHRoZSBnbG9iYWwgVk9TUyBjb250ZXh0LgorICAgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU1lTLCBOVUxMKTsKKyAgIGlmKCFwVm9zQ29udGV4dCkgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEdsb2JhbCBWT1MgY29udGV4dCBpcyBOdWxsIiwgX19mdW5jX18pOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvL0dldCB0aGUgSEREIGNvbnRleHQuCisgICBwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKil2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQsIHBWb3NDb250ZXh0ICk7CisKKyAgIGlmKCFwSGRkQ3R4KSB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogSEREIGNvbnRleHQgaXMgTnVsbCIsX19mdW5jX18pOworICAgICAgcmV0dXJuOworICAgfQorICAgCisgICBpZiAocEhkZEN0eC0+aXNMb2dwSW5Qcm9ncmVzcykgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlczogSWdub3JlIHJlc3VtZSB3bGFuLCBMT0dQIGluIHByb2dyZXNzISIsIF9fZnVuY19fKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICBzZGlvX2Z1bmNfZGV2ID0gbGlicmFfZ2V0c2Rpb19mdW5jZGV2KCk7CisKKyAgIGlmKHNkaW9fZnVuY19kZXYgPT0gTlVMTCkKKyAgIHsKKyAgICAgIC8qIE91ciBjYXJkIGdvdCByZW1vdmVkICovCisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IHNkaW9fZnVuY19kZXYgaXMgTlVMTCEiLF9fZnVuY19fKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYoIXNkX2lzX2RydmRhdGFfYXZhaWxhYmxlKHNkaW9fZnVuY19kZXYpKQorICAgeworICAgICAgICAvKiBPdXIgY2FyZCBnb3QgcmVtb3ZlZCAqLworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IEhERCBjb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIHNkaW9fZnVuY19kZXYhIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgIH0KKworICAgc2RfY2xhaW1faG9zdChzZGlvX2Z1bmNfZGV2KTsKKyAgIAorICAgLy8gUHJldmVudCB0b3VjaGluZyB0aGUgcE1hYyB3aGlsZSBMT0dQIHJlc2V0IGluIHByb2dyZXNzLCAKKyAgIGlmIChwSGRkQ3R4LT5pc0xvZ3BJblByb2dyZXNzKSB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogSWdub3JlIHJlc3VtZSB3bGFuLCBMT0dQIGluIHByb2dyZXNzISIsIF9fZnVuY19fKTsKKyAgICAgIHNkX3JlbGVhc2VfaG9zdChzZGlvX2Z1bmNfZGV2KTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyNlbmRpZgorICAgcEhkZEN0eC0+aGRkX3dsYW5fc3VzcGVuZGVkID0gRkFMU0U7CisgICAvKmxvb3AgdGhyb3VnaCBhbGwgYWRhcHRlcnMuIENvbmN1cnJlbmN5ICovCisgICBzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIgKCBwSGRkQ3R4LCAmcEFkYXB0ZXJOb2RlICk7CisKKyAgIHdoaWxlICggTlVMTCAhPSBwQWRhcHRlck5vZGUgJiYgVk9TX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cyApCisgICB7CisgICAgICAgcEFkYXB0ZXIgPSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyOworICAgICAgIGlmICggKFdMQU5fSEREX0lORlJBX1NUQVRJT04gIT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorICAgICAgICAgJiYgKFdMQU5fSEREX1AyUF9DTElFTlQgIT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSApCisgICAgICAgeyAgLy9qdXN0IGRvIGZvciBzdGF0aW9uIGludGVyZmFjZQorICAgICAgICAgICAgc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIgKCBwSGRkQ3R4LCBwQWRhcHRlck5vZGUsICZwTmV4dCApOworICAgICAgICAgICAgcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICB9CisjaWZkZWYgU1VQUE9SVF9FQVJMWV9TVVNQRU5EX1NUQU5EQllfREVFUFNMRUVQICAgCisgICAgICAgaWYocEhkZEN0eC0+aGRkX3BzX3N0YXRlID09IGVIRERfU1VTUEVORF9ERUVQX1NMRUVQKSAKKyAgICAgICB7CisgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFdMQU4gYmVpbmcgcmVzdW1lZCBmcm9tIGRlZXAgc2xlZXAiLF9fZnVuY19fKTsKKyAgICAgICAgICBoZGRfZXhpdF9kZWVwX3NsZWVwKHBBZGFwdGVyKTsKKyAgICAgICB9CisjZW5kaWYKKworICAgICAgaWYocEhkZEN0eC0+aGRkX2lnbm9yZV9kdGltX2VuYWJsZWQgPT0gVFJVRSkKKyAgICAgIHsKKyAgICAgICAgIC8qU3dpdGNoIGJhY2sgdG8gRFRJTSAxKi8KKyAgICAgICAgIHRTaXJTZXRQb3dlclBhcmFtc1JlcSBwb3dlclJlcXVlc3QgPSB7IDAgfTsgCisKKyAgICAgICAgIHBvd2VyUmVxdWVzdC51SWdub3JlRFRJTSA9IHBIZGRDdHgtPmhkZF9hY3R1YWxfaWdub3JlX0RUSU1fdmFsdWU7CisgICAgICAgICBwb3dlclJlcXVlc3QudUxpc3RlbkludGVydmFsID0gcEhkZEN0eC0+aGRkX2FjdHVhbF9MSV92YWx1ZTsKKworICAgICAgICAgLypEaXNhYmxlZCBNb2R1bGF0ZWREVElNIGlmIGVuYWJsZWQgb24gc3VzcGVuZCovCisgICAgICAgICBpZihwSGRkQ3R4LT5jZmdfaW5pLT5lbmFibGVNb2R1bGF0ZWREVElNKQorICAgICAgICAgICAgIHBvd2VyUmVxdWVzdC51RFRJTVBlcmlvZCA9IDA7CisKKyAgICAgICAgIC8qIFVwZGF0ZSBpZ25vcmVEVElNIGFuZCBMaXN0ZWRJbnRlcnZhbCBpbiBDRkcgd2l0aCBkZWZhdWx0IHZhbHVlcyAqLworICAgICAgICAgY2NtQ2ZnU2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfSUdOT1JFX0RUSU0sIHBvd2VyUmVxdWVzdC51SWdub3JlRFRJTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgIGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTCwgcG93ZXJSZXF1ZXN0LnVMaXN0ZW5JbnRlcnZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICAgICAgICAgICAgIlN3aXRjaCB0byBEVElNJWQgXG4iLHBvd2VyUmVxdWVzdC51TGlzdGVuSW50ZXJ2YWwpOworICAgICAgICAgc21lX1NldFBvd2VyUGFyYW1zKCBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksICZwb3dlclJlcXVlc3QpOyAgICAKKworICAgICAgICAgLyogcHV0IHRoZSBkZXZpY2UgaW50byBmdWxsIHBvd2VyICovCisgICAgICAgICB3bGFuX2hkZF9lbnRlcl9ibXBzKHBBZGFwdGVyLCBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpOworCisgICAgICAgICAvKiBwdXQgdGhlIGRldmljZSBiYWNrIGludG8gQk1QUyAqLworICAgICAgICAgd2xhbl9oZGRfZW50ZXJfYm1wcyhwQWRhcHRlciwgRFJJVkVSX1BPV0VSX01PREVfQVVUTyk7CisKKyAgICAgICAgIHBIZGRDdHgtPmhkZF9pZ25vcmVfZHRpbV9lbmFibGVkID0gRkFMU0U7CisgICAgICB9CisKKyAgICAgICAgIGlmKHBIZGRDdHgtPmhkZF9tY2FzdGJjYXN0X2ZpbHRlcl9zZXQgPT0gVFJVRSkgeworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgICAgICAgICBoZGRfY29uZl9yZXN1bWVfaW5kKHBIZGRDdHgpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgIGhkZF9jb25mX21jYXN0YmNhc3RfZmlsdGVyKHBIZGRDdHgsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmhkZF9tY2FzdGJjYXN0X2ZpbHRlcl9zZXQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgIGhhbFBTQXBwc0NwdVdha2V1cFN0YXRlKHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPnB2b3NDb250ZXh0KSwgVFJVRSk7CisjZW5kaWYKKyAgICAgICAgICAgcEhkZEN0eC0+aGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldCA9IEZBTFNFOworICAgICAgfQorICAgICAgc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIgKCBwSGRkQ3R4LCBwQWRhcHRlck5vZGUsICZwTmV4dCApOworICAgICAgcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisgICB9CisKKyNpZmRlZiBTVVBQT1JUX0VBUkxZX1NVU1BFTkRfU1RBTkRCWV9ERUVQU0xFRVAgICAKKyAgIGlmKHBIZGRDdHgtPmhkZF9wc19zdGF0ZSA9PSBlSEREX1NVU1BFTkRfU1RBTkRCWSkgCisgICB7CisgICAgICAgaGRkX2V4aXRfc3RhbmRieShwSGRkQ3R4KTsKKyAgIH0gICAgCisjZW5kaWYKKworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICBzZF9yZWxlYXNlX2hvc3Qoc2Rpb19mdW5jX2Rldik7CisjZW5kaWYKKyAgIHJldHVybjsKK30KKworVk9TX1NUQVRVUyBoZGRfd2xhbl9yZXNldCh2b2lkKSAKK3sKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IE5VTEw7CisgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCA9IE5VTEw7CisgICBwVm9zU2NoZWRDb250ZXh0IHZvc1NjaGVkQ29udGV4dCA9IE5VTEw7CisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgIHN0cnVjdCBzZGlvX2Z1bmMgKnNkaW9fZnVuY19kZXZfbmV3ID0gTlVMTDsKKyAgIHN0cnVjdCBzZGlvX2Z1bmMgKnNkaW9fZnVuY19kZXZfY3VycmVudCA9IE5VTEw7CisgICB1bnNpZ25lZCBpbnQgYXR0ZW1wdHMgPSAwOworI2VuZGlmCisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFdMQU4gYmVpbmcgcmVzZXQiLF9fZnVuY19fKTsKKworICAgLy9HZXQgdGhlIGdsb2JhbCBWT1NTIGNvbnRleHQuCisgICBwVm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9TWVMsIE5VTEwpOworICAgaWYoIXBWb3NDb250ZXh0KSB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogR2xvYmFsIFZPUyBjb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vR2V0IHRoZSBIREQgY29udGV4dC4KKyAgIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX0hERCwgcFZvc0NvbnRleHQpOworICAgaWYoIXBIZGRDdHgpIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRG9pbmcgU0FMIFN0b3AiLF9fZnVuY19fKTsKKyAgIC8vSW52b2tlIFNBTCBzdG9wCisgICB2b3NTdGF0dXMgPSBXTEFOU0FMX1N0b3AoIHBWb3NDb250ZXh0ICk7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RvcCBTQUwiLF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgIH0KKyNlbmRpZgorICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBBc3NlcnRpbmcgRGVlcCBTbGVlcCIsX19mdW5jX18pOworICAgLy9Bc3NlcnQgRGVlcCBzbGVlcCBzaWduYWwgbm93IHRvIHB1dCBMaWJyYSBIVyBpbiBsb3dlc3QgcG93ZXIgc3RhdGUKKyAgIHZvc1N0YXR1cyA9IHZvc19jaGlwQXNzZXJ0RGVlcFNsZWVwKCBOVUxMLCBOVUxMLCBOVUxMICk7CisgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgICAKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogUG93ZXIgRG93biBDaGlwIixfX2Z1bmNfXyk7ICAgCisgICAvL1ZvdGUgb2ZmIGFueSBQTUlDIHZvbHRhZ2Ugc3VwcGxpZXMKKyAgIHZvc19jaGlwUG93ZXJEb3duKE5VTEwsIE5VTEwsIE5VTEwpOworCisKKyAgIC8qKgorICAgRVZNIGlzc3VlIGlzIG9ic2VydmVkIHdpdGggMS42TWh6IGZyZXEgZm9yIDEuM1Ygc3VwcGx5IGluIHdsYW4gc3RhbmRhbG9uZSBjYXNlLgorICAgRHVyaW5nIGNvbmN1cnJlbnQgb3BlcmF0aW9uIChlLmcuIFdMQU4gYW5kIFdDRE1BKSB0aGlzIGlzc3VlIGlzIG5vdCBvYnNlcnZlZC4gCisgICBUbyB3b3JrYXJvdW5kLCB3bGFuIHdpbGwgdm90ZSBmb3IgMy4yTWh6IGR1cmluZyBzdGFydHVwIGFuZCB3aWxsIHZvdGUgZm9yIDEuNk1oegorICAgZHVyaW5nIGV4aXQuCisgICAqLworICAgaWYgKHZvc19jaGlwVm90ZUZyZXFGb3IxcDNWU3VwcGx5KE5VTEwsIE5VTEwsIE5VTEwsIFZPU19OVl9GUkVRVUVOQ1lfRk9SXzFfM1ZfU1VQUExZXzFQNk1IKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzZXQgdGhlIGZyZXEgdG8gMS42TWh6IGZvciAxLjNWIFN1cHBseSIsX19mdW5jX18gKTsKKworICAgLy9EaXNhYmxlIElNUFMvQk1QUyBhcyB3ZSBkbyBub3Qgd2FudCB0aGUgZGV2aWNlIHRvIGVudGVyIGFueSBwb3dlcgorICAgLy9zYXZlIG1vZGUgb24gaXRzIG93biBkdXJpbmcgcmVzZXQgc2VxdWVuY2UKKyAgIHNtZV9EaXNhYmxlUG93ZXJTYXZlKHBIZGRDdHgtPmhIYWwsIGVQTUNfSURMRV9NT0RFX1BPV0VSX1NBVkUpOworICAgc21lX0Rpc2FibGVQb3dlclNhdmUocEhkZEN0eC0+aEhhbCwgZVBNQ19CRUFDT05fTU9ERV9QT1dFUl9TQVZFKTsKKyAgIHNtZV9EaXNhYmxlUG93ZXJTYXZlKHBIZGRDdHgtPmhIYWwsIGVQTUNfVUFQU0RfTU9ERV9QT1dFUl9TQVZFKTsKKworICAgLy9LaWxsIGFsbCB0aGUgdGhyZWFkcyBmaXJzdC4gV2UgZG8gbm90IHdhbnQgYW55IG1lc3NhZ2VzCisgICAvL3RvIGJlIGEgcHJvY2Vzc2VkIGFueSBtb3JlIGFuZCB0aGUgYmVzdCB3YXkgdG8gZW5zdXJlIHRoYXQKKyAgIC8vaXMgdG8gdGVybWluYXRlIHRoZSB0aHJlYWRzIGdyYWNlZnVsbHkuCisgICB2b3NTY2hlZENvbnRleHQgPSBnZXRfdm9zX3NjaGVkX2N0eHQoKTsKKworICAgLyogV2FrZXVwIE1jIFRocmVhZCBpZiBTdXNwZW5kZWQgKi8KKyAgIGlmKFRSVUUgPT0gcEhkZEN0eC0+aXNNY1RocmVhZFN1c3BlbmRlZCl7CisgICAgICBjb21wbGV0ZSgmdm9zU2NoZWRDb250ZXh0LT5SZXN1bWVNY0V2ZW50KTsKKyAgICAgIHBIZGRDdHgtPmlzTWNUaHJlYWRTdXNwZW5kZWQ9IEZBTFNFOworICAgfQorICAgLyogV2FrZXVwIFR4IFRocmVhZCBpZiBTdXNwZW5kZWQgKi8KKyAgIGlmKFRSVUUgPT0gcEhkZEN0eC0+aXNUeFRocmVhZFN1c3BlbmRlZCl7CisgICAgICBjb21wbGV0ZSgmdm9zU2NoZWRDb250ZXh0LT5SZXN1bWVUeEV2ZW50KTsKKyAgICAgIHBIZGRDdHgtPmlzVHhUaHJlYWRTdXNwZW5kZWQ9IEZBTFNFOworICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgLyogV2FrZXVwIFJ4IFRocmVhZCBpZiBTdXNwZW5kZWQgKi8KKyAgIGlmKFRSVUUgPT0gcEhkZEN0eC0+aXNSeFRocmVhZFN1c3BlbmRlZCl7CisgICAgICBjb21wbGV0ZSgmdm9zU2NoZWRDb250ZXh0LT5SZXN1bWVSeEV2ZW50KTsKKyAgICAgIHBIZGRDdHgtPmlzUnhUaHJlYWRTdXNwZW5kZWQ9IEZBTFNFOworICAgfQorI2VuZGlmCisKKyAgIC8qIFJlc2V0IHRoZSBTdXNwZW5kIFZhcmlhYmxlICovCisgICBwSGRkQ3R4LT5pc1dsYW5TdXNwZW5kZWQgPSBGQUxTRTsKKworICAgLy9XYWl0IGZvciBNQyB0byBleGl0CisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFNodXR0aW5nIGRvd24gTUMgdGhyZWFkIixfX2Z1bmNfXyk7CisgICBzZXRfYml0KE1DX1NIVVRET1dOX0VWRU5UX01BU0ssICZ2b3NTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnKTsKKyAgIHNldF9iaXQoTUNfUE9TVF9FVkVOVF9NQVNLLCAmdm9zU2NoZWRDb250ZXh0LT5tY0V2ZW50RmxhZyk7CisgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJnZvc1NjaGVkQ29udGV4dC0+bWNXYWl0UXVldWUpOworICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZ2b3NTY2hlZENvbnRleHQtPk1jU2h1dGRvd24pOworCisgICAvL1dhaXQgZm9yIFRYIHRvIGV4aXQKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogU2h1dHRpbmcgZG93biBUWCB0aHJlYWQiLF9fZnVuY19fKTsKKyAgIHNldF9iaXQoVFhfU0hVVERPV05fRVZFTlRfTUFTSywgJnZvc1NjaGVkQ29udGV4dC0+dHhFdmVudEZsYWcpOworICAgc2V0X2JpdChUWF9QT1NUX0VWRU5UX01BU0ssICZ2b3NTY2hlZENvbnRleHQtPnR4RXZlbnRGbGFnKTsKKyAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmdm9zU2NoZWRDb250ZXh0LT50eFdhaXRRdWV1ZSk7CisgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnZvc1NjaGVkQ29udGV4dC0+VHhTaHV0ZG93bik7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8vV2FpdCBmb3IgUlggdG8gZXhpdAorICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBTaHV0dGluZyBkb3duIFJYIHRocmVhZCIsX19mdW5jX18pOworICAgc2V0X2JpdChSWF9TSFVURE9XTl9FVkVOVF9NQVNLLCAmdm9zU2NoZWRDb250ZXh0LT5yeEV2ZW50RmxhZyk7CisgICBzZXRfYml0KFJYX1BPU1RfRVZFTlRfTUFTSywgJnZvc1NjaGVkQ29udGV4dC0+cnhFdmVudEZsYWcpOworICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2b3NTY2hlZENvbnRleHQtPnJ4V2FpdFF1ZXVlKTsKKyAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmdm9zU2NoZWRDb250ZXh0LT5SeFNodXRkb3duKTsKKyNlbmRpZgorCisgICAvKiBDYW5jZWwgdGhlIHZvdGUgZm9yIFhPIENvcmUgT04gaW4gTE9HUCBzaW5jZSB3ZSBhcmUgcmVpbml0aWFsaXppbmcgb3VyIGRyaXZlcgorICAgICogVGhpcyBpcyBkb25lIGhlcmUgdG8gZW5zdXJlIHRoZXJlIGlzIG5vIHJhY2UgY29uZGl0aW9uIHNpbmNlIE1DIGFuZCBUWCB0aHJlYWQgaGF2ZQorICAgICogZXhpdGVkIGF0IHRoaXMgcG9pbnQKKyAgICAqLworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9XQVJOLCAiSW4gTE9HUDogQ2FuY2VsIFhPIENvcmUgT04gdm90ZVxuIik7CisgICBpZiAodm9zX2NoaXBWb3RlWE9Db3JlKE5VTEwsIE5VTEwsIE5VTEwsIFZPU19GQUxTRSkgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgeworICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJDb3VsZCBub3QgY2FuY2VsIFhPIENvcmUgT04gdm90ZS4gTm90IHJldHVybmluZyBmYWlsdXJlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyIGNvbnN1bWVkIHdpbGwgYmUgaGlnaFxuIik7CisgICB9CisKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRG9pbmcgU01FIFNUT1AiLF9fZnVuY19fKTsKKyAgIC8vU3RvcCBTTUUgLSBDYW5ub3QgaW52b2tlIHZvc19zdG9wIGFzIHZvc19zdG9wIHJlbGllcworICAgLy9vbiB0aHJlYWRzIGJlaW5nIHJ1bm5pbmcgdG8gcHJvY2VzcyB0aGUgU1lTIFN0b3AKKyAgIHZvc1N0YXR1cyA9IHNtZV9TdG9wKCBwSGRkQ3R4LT5oSGFsLCBUUlVFICk7CisgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRG9pbmcgTUFDIFNUT1AiLF9fZnVuY19fKTsKKyAgIC8vU3RvcCBNQUMgKFBFIGFuZCBIQUwpCisgICB2b3NTdGF0dXMgPSBtYWNTdG9wKCBwSGRkQ3R4LT5oSGFsLCBIQUxfU1RPUF9UWVBFX1NZU19SRVNFVCk7CisgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRG9pbmcgVEwgU1RPUCIsX19mdW5jX18pOworICAgLy9TdG9wIFRMCisgICB2b3NTdGF0dXMgPSBXTEFOVExfU3RvcCggcFZvc0NvbnRleHQgKTsKKyAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IERvaW5nIEJBTCBTVE9QIixfX2Z1bmNfXyk7CisgICB2b3NTdGF0dXMgPSBXTEFOQkFMX1N0b3AoIHBWb3NDb250ZXh0ICk7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RvcCBCQUwiLF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgIH0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECisgICBoZGRfdW5yZWdpc3Rlcl9tY2FzdF9iY2FzdF9maWx0ZXIocEhkZEN0eCk7CisjZW5kaWYKKworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBGbHVzaCBRdWV1ZXMiLF9fZnVuY19fKTsKKyAgIC8vQ2xlYW4gdXAgbWVzc2FnZSBxdWV1ZXMgb2YgVFggYW5kIE1DIHRocmVhZAorICAgdm9zX3NjaGVkX2ZsdXNoX21jX21xcyh2b3NTY2hlZENvbnRleHQpOworICAgdm9zX3NjaGVkX2ZsdXNoX3R4X21xcyh2b3NTY2hlZENvbnRleHQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgdm9zX3NjaGVkX2ZsdXNoX3J4X21xcyh2b3NTY2hlZENvbnRleHQpOworI2VuZGlmCisKKyAgIC8vRGVpbml0IGFsbCB0aGUgVFggYW5kIE1DIHF1ZXVlcworICAgdm9zX3NjaGVkX2RlaW5pdF9tcXModm9zU2NoZWRDb250ZXh0KTsKKworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBEb2luZyBWT1MgQ2xvc2UiLF9fZnVuY19fKTsKKworICAgLy9DbG9zZSBWT1NTCisgICB2b3NfY2xvc2UocFZvc0NvbnRleHQpOworCisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRG9pbmcgQkFMIENsb3NlIixfX2Z1bmNfXyk7CisgICB2b3NTdGF0dXMgPSBXTEFOQkFMX0Nsb3NlKHBWb3NDb250ZXh0KTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIAorICAgICAgICAgICIlczogRmFpbGVkIHRvIGNsb3NlIEJBTCIsX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICAgfQorICAgLy9HZXQgdGhlIEN1cnJlbnQgU0RJTyBGdW5jCisgICBzZGlvX2Z1bmNfZGV2X2N1cnJlbnQgPSBsaWJyYV9nZXRzZGlvX2Z1bmNkZXYoKTsKKworICAgaWYoTlVMTCAhPSBzZGlvX2Z1bmNfZGV2X2N1cnJlbnQpIHsKKyAgICAgIGxpYnJhX2RldGVjdF9jYXJkX2NoYW5nZSgpOworICAgICAgYXR0ZW1wdHMgPSAwOworICAgICAgZG8geworICAgICAgICAgbXNsZWVwKDEwMCk7CisgICAgICAgICAvL0dldCB0aGUgU0RJTyBmdW5jIGRldmljZQorICAgICAgICAgc2Rpb19mdW5jX2Rldl9jdXJyZW50ID0gbGlicmFfZ2V0c2Rpb19mdW5jZGV2KCk7CisgICAgICAgICBpZihOVUxMID09IHNkaW9fZnVuY19kZXZfY3VycmVudCkgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBDYXJkIFJlbW92ZWQgU3VjY2Vzc2Z1bGx5IixfX2Z1bmNfXyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBGYWlsZWQgdG8gUmVtb3ZlIHRoZSBDYXJkOiBUcnlpbmcgQWdhaW4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgIGF0dGVtcHRzKys7CisgICAgICAgICB9CisgICAgICB9IHdoaWxlIChhdHRlbXB0cyA8IExJQlJBX0NBUkRfUkVNT1ZFX0RFVEVDVF9NQVhfQ09VTlQpOworCisgICAgICBpZihMSUJSQV9DQVJEX1JFTU9WRV9ERVRFQ1RfTUFYX0NPVU5UID09IGF0dGVtcHRzKSB7CisgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IEZhaWxlZCB0byBSZW1vdmUgdGhlIENhcmQ6IEZhdGFsIixfX2Z1bmNfXyk7CisgICAgICAgICBnb3RvIGVycl9mYWlsOworICAgICAgfQorICAgfQorI2VuZGlmCisKKyNpZmRlZiBUSU1FUl9NQU5BR0VSCisgICB2b3NfdGltZXJfZXhpdCgpOworI2VuZGlmCisKKyNpZmRlZiBNRU1PUllfREVCVUcKKyAgIHZvc19tZW1fY2xlYW4oKTsKKyNlbmRpZgorI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICAvL1JlaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGUKKyAgIGF0dGVtcHRzID0gMDsKKyNlbmRpZgorCisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFBvd2VyaW5nIFVwIGNoaXAgQWdhaW4iLF9fZnVuY19fKTsKKyAgIC8vUG93ZXIgVXAgTGlicmEgV0xBTiBjYXJkIGZpcnN0IGlmIG5vdCBhbHJlYWR5IHBvd2VyZWQgdXAKKyAgIHZvc1N0YXR1cyA9IHZvc19jaGlwUG93ZXJVcChOVUxMLE5VTEwsTlVMTCk7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBMaWJyYSBXTEFOIG5vdCBQb3dlcmVkIFVwLiAiCisgICAgICAgICAgICAgImV4aXRpbmciLCBfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl9wd3JfZmFpbDsKKyAgIH0KKworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICAvLyBUcmlnZ2VyIGNhcmQgZGV0ZWN0CisgICBsaWJyYV9kZXRlY3RfY2FyZF9jaGFuZ2UoKTsKKworICAgLy9SZWluaXRpYWxpemUgdGhlIHZhcmlhYmxlCisgICBhdHRlbXB0cyA9IDA7CisKKyAgIGRvIHsKKyAgICAgIG1zbGVlcCg1MDApOworCisgICAgICAvL0dldCB0aGUgU0RJTyBmdW5jIGRldmljZQorICAgICAgc2Rpb19mdW5jX2Rldl9uZXcgPSBsaWJyYV9nZXRzZGlvX2Z1bmNkZXYoKTsKKyAgICAgIGlmKHNkaW9fZnVuY19kZXZfbmV3ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICAvL05vdCBuZWVkZWQgYnV0IGluIGNhc2UgaXQgY2F1c2VzIHByb2JzIHRoZW4gcHV0IGEgbG9vcCBhbmQgc2V0IGZvciBlYWNoIGFkYXB0ZXIKKyAgICAgICAgIC8vU0VUX05FVERFVl9ERVYocEFkYXB0ZXItPmRldiwgJnNkaW9fZnVuY19kZXZfbmV3LT5kZXYpOyAKKyAgICAgICAgIGxpYnJhX3NkaW9fc2V0cHJpdmRhdGEgKHNkaW9fZnVuY19kZXZfbmV3LCBwSGRkQ3R4KTsKKyAgICAgICAgIGF0b21pY19zZXQoJnBIZGRDdHgtPnNkaW9fY2xhaW1fY291bnQsIDApOworICAgICAgICAgcEhkZEN0eC0+cGFyZW50X2RldiA9ICZzZGlvX2Z1bmNfZGV2X25ldy0+ZGV2OworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAiJXM6IENhcmQgRGV0ZWN0ZWQgU3VjY2Vzc2Z1bGx5ICVwIixfX2Z1bmNfXywgCisgICAgICAgICAgc2Rpb19mdW5jX2Rldl9uZXcpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICIlczogRmFpbGVkIHRvIGRldGVjdCBjYXJkIGNoYW5nZSAlcCIsX19mdW5jX18sIAorICAgICAgICAgIHNkaW9fZnVuY19kZXZfbmV3KTsgICAgIAorICAgICAgICAgYXR0ZW1wdHMrKzsKKyAgICAgIH0KKyAgIH13aGlsZSAoYXR0ZW1wdHMgPCBMSUJSQV9DQVJEX0lOU0VSVF9ERVRFQ1RfTUFYX0NPVU5UKTsKKworICAgaWYoTElCUkFfQ0FSRF9JTlNFUlRfREVURUNUX01BWF9DT1VOVCA9PSBhdHRlbXB0cyl7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IExpYnJhIFdMQU4gZmFpbCB0byBkZXRlY3QgaW4gcmVzZXQsICIKKyAgICAgICAgICAgICAiZXhpdGluZyIsIF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX2ZhaWw7CisgICB9CisgICAvL0dldCB0aGUgU0RJTyBmdW5jIGRldmljZQorICAgc2Rpb19mdW5jX2Rldl9uZXcgPSBsaWJyYV9nZXRzZGlvX2Z1bmNkZXYoKTsKKyAgIGlmKHNkaW9fZnVuY19kZXZfbmV3ICE9IE5VTEwpCisgICB7CisgICAgICAgc2RfY2xhaW1faG9zdChzZGlvX2Z1bmNfZGV2X25ldyk7CisgICAgICAgLyogRW5hYmxlIElSUSBjYXBhYmlsaXRpZXMgaW4gaG9zdCBjb250cm9sbGVyICovCisgICAgICAgbGlicmFfZGlzYWJsZV9zZGlvX2lycV9jYXBhYmlsaXR5KHNkaW9fZnVuY19kZXZfbmV3LCAwKTsKKyAgICAgICBsaWJyYV9lbmFibGVfc2Rpb19pcnEoc2Rpb19mdW5jX2Rldl9uZXcsIDEpOworICAgICAgIHNkX3JlbGVhc2VfaG9zdChzZGlvX2Z1bmNfZGV2X25ldyk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgIC8qIE91ciBjYXJkIGdvdCByZW1vdmVkIGJlZm9yZSBMT0dQLiAqLworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IHNkaW9fZnVuY19kZXYgaXMgTlVMTCEiLF9fZnVuY19fKTsKKyAgICAgICAgZ290byBlcnJfZmFpbDsKKyAgIH0KKworICAgdm9zU3RhdHVzID0gV0xBTkJBTF9PcGVuKHBWb3NDb250ZXh0KTsKKyAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAiJXM6IEZhaWxlZCB0byBvcGVuIEJBTCIsX19mdW5jX18pOworICAgICBnb3RvIGVycl9mYWlsOworICAgfQorCisgICB2b3NTdGF0dXMgPSBXTEFOU0FMX1N0YXJ0KHBWb3NDb250ZXh0KTsKKyAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IEZhaWxlZCB0byBzdGFydCBTQUwiLF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX2JhbGNsb3NlOworICAgfQorCisgICAvKiBDaGlwIGlzIHJlc2V0IHNvIGFsbG93IExvd2VyIE1BQyB0byBzdGFydCBhY2Nlc3NpbmcgV0xBTiByZWdpc3RlcnMuIE5vdGUgSEREIGlzIHN0aWxsIGJsb2NrZWQgKi8KKyAgIHZvc19zZXRfbG9ncF9pbl9wcm9ncmVzcyhWT1NfTU9EVUxFX0lEX0hERCwgRkFMU0UpOworCisgICAvKiBTdGFydCBCQUwgKi8KKyAgIHZvc1N0YXR1cyA9IFdMQU5CQUxfU3RhcnQocFZvc0NvbnRleHQpOworCisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RhcnQgQkFMIixfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl9zYWxzdG9wOworICAgfQorI2VuZGlmCisgICAvLyBPcGVuIFZPU1MgCisgICB2b3NTdGF0dXMgPSB2b3Nfb3BlbiggJnBWb3NDb250ZXh0LCAwKTsKKworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiB2b3Nfb3BlbiBmYWlsZWQiLF9fZnVuY19fKTsKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworICAgICAgZ290byBlcnJfYmFsc3RvcDsKKyNlbHNlCisgICAgICBnb3RvIGVycl9wd3JfZmFpbDsKKyNlbmRpZgorICAgfQorCisgICAvKiBTYXZlIHRoZSBoYWwgY29udGV4dCBpbiBBZGFwdGVyICovCisgICBwSGRkQ3R4LT5oSGFsID0gKHRIYWxIYW5kbGUpdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX1NNRSwgcFZvc0NvbnRleHQgKTsKKworICAgaWYgKCBOVUxMID09IHBIZGRDdHgtPmhIYWwgKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEhBTCBjb250ZXh0IGlzIG51bGwiLF9fZnVuY19fKTsgICAgICAKKyAgICAgIGdvdG8gZXJyX3Zvc2Nsb3NlOworICAgfQorICAgLy8gU2V0IHRoZSBTTUUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLi4uCisgICB2b3NTdGF0dXMgPSBoZGRfc2V0X3NtZV9jb25maWcocEhkZEN0eCk7CisKKyAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogRmFpbGVkIGhkZF9zZXRfc21lX2NvbmZpZyIsX19mdW5jX18pOyAKKyAgICAgIGdvdG8gZXJyX3Zvc2Nsb3NlOworICAgfQorCisgICAvL0luaXRpYWxpemUgdGhlIFdNTSBtb2R1bGUKKyAgIHZvc1N0YXR1cyA9IGhkZF93bW1faW5pdChwSGRkQ3R4KTsKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IGhkZF93bW1faW5pdCBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgZ290byBlcnJfdm9zY2xvc2U7CisgICB9CisKKyAgIC8qU3RhcnQgVk9TUyB3aGljaCBzdGFydHMgdXAgdGhlIFNNRS9NQUMvSEFMIG1vZHVsZXMgYW5kIGV2ZXJ5dGhpbmcgZWxzZQorICAgICBOb3RlOiBGaXJtd2FyZSBpbWFnZSB3aWxsIGJlIHJlYWQgYW5kIGRvd25sb2FkZWQgaW5zaWRlIHZvc19zdGFydCBBUEkgKi8KKyAgIHZvc1N0YXR1cyA9IHZvc19zdGFydCggcFZvc0NvbnRleHQgKTsKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IHZvc19zdGFydCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX3Zvc2Nsb3NlOworICAgfQorCisgICB2b3NTdGF0dXMgPSBoZGRfcG9zdF92b3NzX3N0YXJ0X2NvbmZpZyggcEhkZEN0eCApOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogaGRkX3Bvc3Rfdm9zc19zdGFydF9jb25maWcgZmFpbGVkIiwgCisgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl92b3NzdG9wOworICAgfQorCisgICAvKiBSZXN0YXJ0IGFsbCBhZGFwdGVycyAqLworICAgaGRkX3N0YXJ0X2FsbF9hZGFwdGVycyhwSGRkQ3R4KTsKKyAgIHBIZGRDdHgtPmlzTG9ncEluUHJvZ3Jlc3MgPSBGQUxTRTsKKyAgIHBIZGRDdHgtPmhkZF9tY2FzdGJjYXN0X2ZpbHRlcl9zZXQgPSBGQUxTRTsKKyNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAorICAgaGRkX3JlZ2lzdGVyX21jYXN0X2JjYXN0X2ZpbHRlcihwSGRkQ3R4KTsKKyNlbmRpZgorCisgICAvLyBBbGxvdyB0aGUgcGhvbmUgdG8gZ28gdG8gc2xlZXAKKyAgIGhkZF9hbGxvd19zdXNwZW5kKCk7CisKKyAgIGdvdG8gc3VjY2VzczsKKworZXJyX3Zvc3N0b3A6CisgICB2b3Nfc3RvcChwVm9zQ29udGV4dCk7CisKK2Vycl92b3NjbG9zZToKKyAgIHZvc19jbG9zZShwVm9zQ29udGV4dCApOyAKKyAgIHZvc19zY2hlZF9jbG9zZShwVm9zQ29udGV4dCk7CisKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworZXJyX2JhbHN0b3A6CisjaWZuZGVmIEFOSV9NQU5GX0RJQUcgCisgICB3bGFuX2hkZF9lbmFibGVfZGVlcHNsZWVwKHBWb3NDb250ZXh0KTsKKyNlbmRpZgorICAgV0xBTkJBTF9TdG9wKHBWb3NDb250ZXh0KTsKKyAgIFdMQU5CQUxfU3VzcGVuZENoaXAocFZvc0NvbnRleHQpOworCitlcnJfc2Fsc3RvcDoKKyAgIFdMQU5TQUxfU3RvcChwVm9zQ29udGV4dCk7CisKK2Vycl9iYWxjbG9zZToKKyAgIFdMQU5CQUxfQ2xvc2UocFZvc0NvbnRleHQpOworCitlcnJfZmFpbDoKKyAgIC8vQXNzZXJ0IERlZXAgc2xlZXAgc2lnbmFsIG5vdyB0byBwdXQgTGlicmEgSFcgaW4gbG93ZXN0IHBvd2VyIHN0YXRlCisgICB2b3NTdGF0dXMgPSB2b3NfY2hpcEFzc2VydERlZXBTbGVlcCggTlVMTCwgTlVMTCwgTlVMTCApOworCisgICAvL1ZvdGUgb2ZmIGFueSBQTUlDIHZvbHRhZ2Ugc3VwcGxpZXMKKyAgIHZvc19jaGlwUG93ZXJEb3duKE5VTEwsIE5VTEwsIE5VTEwpOworI2VuZGlmCisKK2Vycl9wd3JfZmFpbDoKKyAgIHZvc19jaGlwVm90ZU9mZlhPQnVmZmVyKE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAvLyBBbGxvdyB0aGUgcGhvbmUgdG8gZ28gdG8gc2xlZXAKKyAgIGhkZF9hbGxvd19zdXNwZW5kKCk7CisKKyNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAorICAgLy8gdW5yZWdpc3RlciBzdXNwZW5kL3Jlc3VtZSBjYWxsYmFja3MKKyAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPm5FbmFibGVTdXNwZW5kKQorICAgICAgdW5yZWdpc3Rlcl93bGFuX3N1c3BlbmQoKTsKKyNlbmRpZgorCisgICAvLyBVbnJlZ2lzdGVyIHRoZSBOZXQgRGV2aWNlIE5vdGlmaWVyCisgICB1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaGRkX25ldGRldl9ub3RpZmllcik7CisKKyAgLy9DbGVhbiB1cCBIREQgTmxpbmsgU2VydmljZQorICAgc2VuZF9idGNfbmxpbmtfbXNnKFdMQU5fTU9EVUxFX0RPV05fSU5ELCAwKTsgCisgICBubF9zcnZfZXhpdCgpOworCisgIGhkZF9jbG9zZV9hbGxfYWRhcHRlcnMocEhkZEN0eCk7CisgIC8vRnJlZSB1cCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtYmVycyBpbnNpZGUgSEREIEFkYXB0ZXIKKyAgIGtmcmVlKHBIZGRDdHgtPmNmZ19pbmkpOworICAgcEhkZEN0eC0+Y2ZnX2luaT0gTlVMTDsKKworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgd2lwaHlfdW5yZWdpc3RlcihwSGRkQ3R4LT53aXBoeSk7CisgICB3aXBoeV9mcmVlKHBIZGRDdHgtPndpcGh5KTsKKyNlbHNlCisgICB2b3NfbWVtX2ZyZWUocEhkZEN0eCk7CisjZW5kaWYKKworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICBXTEFOU0FMX0Nsb3NlKHBWb3NDb250ZXh0KTsKKyNlbmRpZgorICAgdm9zX3ByZUNsb3NlKCZwVm9zQ29udGV4dCk7CisKKyNpZmRlZiBNRU1PUllfREVCVUcKKyAgIHZvc19tZW1fZXhpdCgpOworI2VuZGlmCisKKyAgIHJldHVybiAtMTsKKworc3VjY2VzczoKKyAgIC8vVHJpZ2dlciByZXBsYXkgb2YgQlRDIGV2ZW50cworICAgc2VuZF9idGNfbmxpbmtfbXNnKFdMQU5fTU9EVUxFX0RPV05fSU5ELCAwKTsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworCisKK1ZPU19TVEFUVVMgaGRkX3dsYW5fcmVzZXRfaW5pdGlhbGl6YXRpb24odm9pZCkgCit7CisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgIHN0cnVjdCBzZGlvX2Z1bmMgKnNkaW9fZnVuY19kZXYgPSBOVUxMOworICAgdl9VOF90ICByZWdWYWx1ZSA9IDA7CisgICBpbnQgIGVycl9yZXQgPSAwOworI2VuZGlmCisgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCA9IE5VTEw7CisKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogV0xBTiBiZWluZyByZXNldCIsX19mdW5jX18pOyAgCisKKyAgIC8vR2V0IHRoZSBnbG9iYWwgVk9TUyBjb250ZXh0LgorICAgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU1lTLCBOVUxMKTsKKyAgIGlmKCFwVm9zQ29udGV4dCkgCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogR2xvYmFsIFZPUyBjb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogUHJldmVudGluZyB0aGUgcGhvbmUgZnJvbSBnb2luZyB0byBzdXNwZW5kIixfX2Z1bmNfXyk7CisKKyAgIC8vIFByZXZlbnQgdGhlIHBob25lIGZyb20gZ29pbmcgdG8gc2xlZXAKKyAgIGhkZF9wcmV2ZW50X3N1c3BlbmQoKTsKKworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICAvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdCBhbmQgIGRpc2FibGUgSW50ZXJydXB0cy4gVXNlIG9ubHkgQ01ENTIgKi8KKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQUwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgCisgICAgICAgICAgIiVzIExPR1AgaW4gcHJvZ3Jlc3MuIERpc2FibGluZyBJbnRlcnJ1cHQiLCBfX2Z1bmNfXyk7CisKKyAgIHNkaW9fZnVuY19kZXYgPSBsaWJyYV9nZXRzZGlvX2Z1bmNkZXYoKTsKKworICAgaWYoc2Rpb19mdW5jX2RldiA9PSBOVUxMKQorICAgeworICAgICAgLyogT3VyIGNhcmQgZ290IHJlbW92ZWQgYmVmb3JlIExPR1AuIENvbnRpbnVlIHdpdGggcmVzZXQgYW55d2F5cyAqLworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBzZGlvX2Z1bmNfZGV2IGlzIE5VTEwhIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgfQorCisgICBzZF9jbGFpbV9ob3N0KHNkaW9fZnVuY19kZXYpOworCisgICByZWdWYWx1ZSA9IDA7CisgICBsaWJyYV9zZGlvY21kNTIoc2Rpb19mdW5jX2RldiwgUVdMQU5fU0lGX1NJRl9JTlRfRU5fUkVHLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdWYWx1ZSwgMSwgJmVycl9yZXQpOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIAorICAgICAgIiVzIExPR1AgQ2xlYXJlZCBTSUZfU0lGX0lOVF9FTl9SRUcgc3RhdHVzOiVkIiwgX19mdW5jX18sZXJyX3JldCk7CisKKyAgIHJlZ1ZhbHVlID0gMDsKKyAgIGxpYnJhX3NkaW9jbWQ1MihzZGlvX2Z1bmNfZGV2LCBRV0xBTl9TSUZfQkFSNF9JTlRfUEVORF9SRUcsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ1ZhbHVlLCAxLCAmZXJyX3JldCk7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQUwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgCisgICAgICAiJXMgTE9HUCBDbGVhcmVkIFNJRl9CQVI0X0lOVF9QRU5EX1JFRyBzdGF0dXMgOiVkIiwgX19mdW5jX18sZXJyX3JldCk7CisKKyAgIHJlZ1ZhbHVlID0gMDsKKyAgIGxpYnJhX3NkaW9jbWQ1MihzZGlvX2Z1bmNfZGV2LCBRV0xBTl9TSUZfQkFSNF9JTlRfRU5BQkxFX1JFRywgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnVmFsdWUsIDEsICZlcnJfcmV0KTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAKKyAgICAgICIlcyBMT0dQIENsZWFyZWQgU0lGX0JBUjRfSU5UX0VOQUJMRV9SRUc6IFN0YXR1czolZCIsIF9fZnVuY19fLGVycl9yZXQpOworCisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IERvaW5nIFN1c3BlbmQgQ2hpcCIsX19mdW5jX18pOworCisgICAvL1B1dCB0aGUgY2hpcCBpcyBzdGFuZGJ5IGJlZm9yZSBhc3NlcnRpbmcgZGVlcCBzbGVlcAorICAgV0xBTkJBTF9TdXNwZW5kQ2hpcF9Ob0xvY2soIHBWb3NDb250ZXh0ICk7CisKKyAgIHNkX3JlbGVhc2VfaG9zdChzZGlvX2Z1bmNfZGV2KTsKKyNlbmRpZgorCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKK3ZvaWQgcmVnaXN0ZXJfd2xhbl9zdXNwZW5kKHZvaWQpCit7CisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogUmVnaXN0ZXIgV0xBTiBzdXNwZW5kL3Jlc3VtZSAiCisgICAgICAgICAgICAiY2FsbGJhY2tzIixfX2Z1bmNfXyk7CisgICB3bGFuX2Vhcmx5X3N1c3BlbmQubGV2ZWwgPSBFQVJMWV9TVVNQRU5EX0xFVkVMX1NUT1BfRFJBV0lORzsKKyAgIHdsYW5fZWFybHlfc3VzcGVuZC5zdXNwZW5kID0gaGRkX3N1c3BlbmRfd2xhbjsKKyAgIHdsYW5fZWFybHlfc3VzcGVuZC5yZXN1bWUgPSBoZGRfcmVzdW1lX3dsYW47CisgICByZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZ3bGFuX2Vhcmx5X3N1c3BlbmQpOworfQorCit2b2lkIHVucmVnaXN0ZXJfd2xhbl9zdXNwZW5kKHZvaWQpCit7CisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogVW5yZWdpc3RlciBXTEFOIHN1c3BlbmQvcmVzdW1lICIKKyAgICAgICAgICAgICJjYWxsYmFja3MiLF9fZnVuY19fKTsKKyAgIHVucmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmd2xhbl9lYXJseV9zdXNwZW5kKTsKK30KKyNlbmRpZgorCisvKiB0aGUgSEREIGludGVyZmFjZSB0byBXTEFOIGRyaXZlciBzaHV0ZG93biwKKyAqIHRoZSBwcmltYXJ5IHNodXRkb3duIGZ1bmN0aW9uIGluIFNTUgorICovCitWT1NfU1RBVFVTIGhkZF93bGFuX3NodXRkb3duKHZvaWQpCit7CisgICBWT1NfU1RBVFVTICAgICAgIHZvc1N0YXR1czsKKyAgIHZfQ09OVEVYVF90ICAgICAgcFZvc0NvbnRleHQgPSBOVUxMOworICAgaGRkX2NvbnRleHRfdCAgICAqcEhkZEN0eCA9IE5VTEw7CisgICBwVm9zU2NoZWRDb250ZXh0IHZvc1NjaGVkQ29udGV4dCA9IE5VTEw7CisKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogV0xBTiBkcml2ZXIgc2h1dHRpbmcgZG93biEgIixfX2Z1bmNfXyk7CisKKyAgIC8qIEdldCB0aGUgZ2xvYmFsIFZPU1MgY29udGV4dC4gKi8KKyAgIHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NZUywgTlVMTCk7CisgICBpZighcFZvc0NvbnRleHQpIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBHbG9iYWwgVk9TIGNvbnRleHQgaXMgTnVsbCIsIF9fZnVuY19fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIC8qIEdldCB0aGUgSEREIGNvbnRleHQuICovCisgICBwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QqKXZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX0hERCwgcFZvc0NvbnRleHQpOworICAgaWYoIXBIZGRDdHgpIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICBoZGRfcmVzZXRfYWxsX2FkYXB0ZXJzKHBIZGRDdHgpOworI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECisgICAgLyogdW5yZWdpc3RlciBzdXNwZW5kL3Jlc3VtZSBjYWxsYmFja3MgKi8KKyAgICBpZihwSGRkQ3R4LT5jZmdfaW5pLT5uRW5hYmxlU3VzcGVuZCkKKyAgICB7CisgICAgICAgIHVucmVnaXN0ZXJfd2xhbl9zdXNwZW5kKCk7CisgICAgfQorI2VuZGlmCisgICAvKiBEZVJlZ2lzdGVyIHdpdGggcGxhdGZvcm0gZHJpdmVyIGFzIGNsaWVudCBmb3IgU3VzcGVuZC9SZXN1bWUgKi8KKyAgIHZvc1N0YXR1cyA9IGhkZERlcmVnaXN0ZXJQbU9wcyhwSGRkQ3R4KTsKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IGhkZERlcmVnaXN0ZXJQbU9wcyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgIH0KKworICAgdm9zU3RhdHVzID0gaGRkRGV2VG1VbnJlZ2lzdGVyTm90aWZ5Q2FsbGJhY2socEhkZEN0eCk7CisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBoZGREZXZUbVVucmVnaXN0ZXJOb3RpZnlDYWxsYmFjayBmYWlsZWQiLF9fZnVuY19fKTsKKyAgIH0KKworICAgLyogRGlzYWJsZSBJTVBTL0JNUFMgYXMgd2UgZG8gbm90IHdhbnQgdGhlIGRldmljZSB0byBlbnRlciBhbnkgcG93ZXIKKyAgICAqIHNhdmUgbW9kZSBvbiBpdHMgb3duIGR1cmluZyByZXNldCBzZXF1ZW5jZQorICAgICovCisgICBzbWVfRGlzYWJsZVBvd2VyU2F2ZShwSGRkQ3R4LT5oSGFsLCBlUE1DX0lETEVfTU9ERV9QT1dFUl9TQVZFKTsKKyAgIHNtZV9EaXNhYmxlUG93ZXJTYXZlKHBIZGRDdHgtPmhIYWwsIGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRSk7CisgICBzbWVfRGlzYWJsZVBvd2VyU2F2ZShwSGRkQ3R4LT5oSGFsLCBlUE1DX1VBUFNEX01PREVfUE9XRVJfU0FWRSk7CisKKyAgIHZvc1NjaGVkQ29udGV4dCA9IGdldF92b3Nfc2NoZWRfY3R4dCgpOworCisgICAvKiBXYWtldXAgYWxsIGRyaXZlciB0aHJlYWRzICovCisgICBpZihUUlVFID09IHBIZGRDdHgtPmlzTWNUaHJlYWRTdXNwZW5kZWQpeworICAgICAgY29tcGxldGUoJnZvc1NjaGVkQ29udGV4dC0+UmVzdW1lTWNFdmVudCk7CisgICAgICBwSGRkQ3R4LT5pc01jVGhyZWFkU3VzcGVuZGVkPSBGQUxTRTsKKyAgIH0KKyAgIGlmKFRSVUUgPT0gcEhkZEN0eC0+aXNUeFRocmVhZFN1c3BlbmRlZCl7CisgICAgICBjb21wbGV0ZSgmdm9zU2NoZWRDb250ZXh0LT5SZXN1bWVUeEV2ZW50KTsKKyAgICAgIHBIZGRDdHgtPmlzVHhUaHJlYWRTdXNwZW5kZWQ9IEZBTFNFOworICAgfQorICAgaWYoVFJVRSA9PSBwSGRkQ3R4LT5pc1J4VGhyZWFkU3VzcGVuZGVkKXsKKyAgICAgIGNvbXBsZXRlKCZ2b3NTY2hlZENvbnRleHQtPlJlc3VtZVJ4RXZlbnQpOworICAgICAgcEhkZEN0eC0+aXNSeFRocmVhZFN1c3BlbmRlZD0gRkFMU0U7CisgICB9CisgICAvKiBSZXNldCB0aGUgU3VzcGVuZCBWYXJpYWJsZSAqLworICAgcEhkZEN0eC0+aXNXbGFuU3VzcGVuZGVkID0gRkFMU0U7CisKKyAgIC8qIFN0b3AgYWxsIHRoZSB0aHJlYWRzOyB3ZSBkbyBub3Qgd2FudCBhbnkgbWVzc2FnZXMgdG8gYmUgYSBwcm9jZXNzZWQsCisgICAgKiBhbnkgbW9yZSBhbmQgdGhlIGJlc3Qgd2F5IHRvIGVuc3VyZSB0aGF0IGlzIHRvIHRlcm1pbmF0ZSB0aGUgdGhyZWFkcworICAgICogZ3JhY2VmdWxseS4KKyAgICAqLworICAgLyogV2FpdCBmb3IgTUMgdG8gZXhpdCAqLworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBTaHV0dGluZyBkb3duIE1DIHRocmVhZCIsX19mdW5jX18pOworICAgc2V0X2JpdChNQ19TSFVURE9XTl9FVkVOVF9NQVNLLCAmdm9zU2NoZWRDb250ZXh0LT5tY0V2ZW50RmxhZyk7CisgICBzZXRfYml0KE1DX1BPU1RfRVZFTlRfTUFTSywgJnZvc1NjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcpOworICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2b3NTY2hlZENvbnRleHQtPm1jV2FpdFF1ZXVlKTsKKyAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmdm9zU2NoZWRDb250ZXh0LT5NY1NodXRkb3duKTsKKworICAgLyogV2FpdCBmb3IgVFggdG8gZXhpdCAqLworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBTaHV0dGluZyBkb3duIFRYIHRocmVhZCIsX19mdW5jX18pOworICAgc2V0X2JpdChUWF9TSFVURE9XTl9FVkVOVF9NQVNLLCAmdm9zU2NoZWRDb250ZXh0LT50eEV2ZW50RmxhZyk7CisgICBzZXRfYml0KFRYX1BPU1RfRVZFTlRfTUFTSywgJnZvc1NjaGVkQ29udGV4dC0+dHhFdmVudEZsYWcpOworICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2b3NTY2hlZENvbnRleHQtPnR4V2FpdFF1ZXVlKTsKKyAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmdm9zU2NoZWRDb250ZXh0LT5UeFNodXRkb3duKTsKKworICAgLyogV2FpdCBmb3IgUlggdG8gZXhpdCAqLworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBTaHV0dGluZyBkb3duIFJYIHRocmVhZCIsX19mdW5jX18pOworICAgc2V0X2JpdChSWF9TSFVURE9XTl9FVkVOVF9NQVNLLCAmdm9zU2NoZWRDb250ZXh0LT5yeEV2ZW50RmxhZyk7CisgICBzZXRfYml0KFJYX1BPU1RfRVZFTlRfTUFTSywgJnZvc1NjaGVkQ29udGV4dC0+cnhFdmVudEZsYWcpOworICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2b3NTY2hlZENvbnRleHQtPnJ4V2FpdFF1ZXVlKTsKKyAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmdm9zU2NoZWRDb250ZXh0LT5SeFNodXRkb3duKTsKKworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgdm9zU3RhdHVzID0gV0xBTkJBUF9TdG9wKHBWb3NDb250ZXh0KTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICB7CisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN0b3AgQkFQIixfX2Z1bmNfXyk7CisgICB9CisjZW5kaWYgLy9XTEFOX0JUQU1QX0ZFQVRVUkUKKyAgIHZvc1N0YXR1cyA9IHZvc193ZGFfc2h1dGRvd24ocFZvc0NvbnRleHQpOworICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSk7CisKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRG9pbmcgU01FIFNUT1AiLF9fZnVuY19fKTsKKyAgIC8qIFN0b3AgU01FIC0gQ2Fubm90IGludm9rZSB2b3Nfc3RvcCBhcyB2b3Nfc3RvcCByZWxpZXMKKyAgICAqIG9uIHRocmVhZHMgYmVpbmcgcnVubmluZyB0byBwcm9jZXNzIHRoZSBTWVMgU3RvcAorICAgICovCisgICB2b3NTdGF0dXMgPSBzbWVfU3RvcChwSGRkQ3R4LT5oSGFsLCBUUlVFKTsKKyAgIFZPU19BU1NFUlQoVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpOworCisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IERvaW5nIE1BQyBTVE9QIixfX2Z1bmNfXyk7CisgICAvKiBTdG9wIE1BQyAoUEUgYW5kIEhBTCkgKi8KKyAgIHZvc1N0YXR1cyA9IG1hY1N0b3AocEhkZEN0eC0+aEhhbCwgSEFMX1NUT1BfVFlQRV9TWVNfUkVTRVQpOworICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSk7CisKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRG9pbmcgVEwgU1RPUCIsX19mdW5jX18pOworICAgLyogU3RvcCBUTCAqLworICAgdm9zU3RhdHVzID0gV0xBTlRMX1N0b3AocFZvc0NvbnRleHQpOworICAgVk9TX0FTU0VSVChWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSk7CisKKyNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAorICAgaGRkX3VucmVnaXN0ZXJfbWNhc3RfYmNhc3RfZmlsdGVyKHBIZGRDdHgpOworI2VuZGlmCisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogRmx1c2ggUXVldWVzIixfX2Z1bmNfXyk7CisgICAvKiBDbGVhbiB1cCBtZXNzYWdlIHF1ZXVlcyBvZiBUWCBhbmQgTUMgdGhyZWFkICovCisgICB2b3Nfc2NoZWRfZmx1c2hfbWNfbXFzKHZvc1NjaGVkQ29udGV4dCk7CisgICB2b3Nfc2NoZWRfZmx1c2hfdHhfbXFzKHZvc1NjaGVkQ29udGV4dCk7CisgICB2b3Nfc2NoZWRfZmx1c2hfcnhfbXFzKHZvc1NjaGVkQ29udGV4dCk7CisKKyAgIC8qIERlaW5pdCBhbGwgdGhlIFRYIGFuZCBNQyBxdWV1ZXMgKi8KKyAgIHZvc19zY2hlZF9kZWluaXRfbXFzKHZvc1NjaGVkQ29udGV4dCk7CisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogRG9pbmcgVk9TIFNodXRkb3duIixfX2Z1bmNfXyk7CisKKyAgIC8qIHNodXRkb3duIFZPU1MgKi8KKyAgIHZvc19zaHV0ZG93bihwVm9zQ29udGV4dCk7CisgICBpZiAoZnJlZV9yaXZhX3Bvd2VyX29uX2xvY2soIndsYW4iKSkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogZmFpbGVkIHRvIGZyZWUgcG93ZXIgb24gbG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgfQorICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBXTEFOIGRyaXZlciBzaHV0ZG93biBjb21wbGV0ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLF9fZnVuY19fKTsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworCisvKiB0aGUgSEREIGludGVyZmFjZSB0byBXTEFOIGRyaXZlciByZS1pbml0LgorICogVGhpcyBpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZS9zdGFydCBXTEFOIGRyaXZlciBhZnRlciBhIHNodXRkb3duLgorICovCitWT1NfU1RBVFVTIGhkZF93bGFuX3JlX2luaXQodm9pZCkKK3sKKyAgIFZPU19TVEFUVVMgICAgICAgdm9zU3RhdHVzOworICAgdl9DT05URVhUX3QgICAgICBwVm9zQ29udGV4dCA9IE5VTEw7CisgICBoZGRfY29udGV4dF90ICAgICpwSGRkQ3R4ID0gTlVMTDsKKyAgIGVIYWxTdGF0dXMgICAgICAgaGFsU3RhdHVzOworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgaGRkX2NvbmZpZ190ICAgICAqcENvbmZpZyA9IE5VTEw7CisgICBXTEFOQkFQX0NvbmZpZ1R5cGUgYnRBbXBDb25maWc7CisjZW5kaWYKKworICAgaGRkX3ByZXZlbnRfc3VzcGVuZCgpOworICAgLyogUmUtb3BlbiBWT1NTLCBpdCBpcyBhIHJlLW9wZW4gYidzZSBjb250cm9sIHRyYW5zcG9ydCB3YXMgbmV2ZXIgY2xvc2VkLiAqLworICAgdm9zU3RhdHVzID0gdm9zX29wZW4oJnBWb3NDb250ZXh0LCAwKTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogdm9zX29wZW4gZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl9yZV9pbml0OworICAgfQorCisgICAvKiBHZXQgdGhlIEhERCBjb250ZXh0LiAqLworICAgcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfSERELCBwVm9zQ29udGV4dCk7CisgICBpZighcEhkZEN0eCkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIixfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl92b3NjbG9zZTsKKyAgIH0KKworICAgLyogU2F2ZSB0aGUgaGFsIGNvbnRleHQgaW4gQWRhcHRlciAqLworICAgcEhkZEN0eC0+aEhhbCA9ICh0SGFsSGFuZGxlKXZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9TTUUsIHBWb3NDb250ZXh0ICk7CisgICBpZiAoIE5VTEwgPT0gcEhkZEN0eC0+aEhhbCApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogSEFMIGNvbnRleHQgaXMgbnVsbCIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfdm9zY2xvc2U7CisgICB9CisKKyAgIC8qIFNldCB0aGUgU01FIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gKi8KKyAgIHZvc1N0YXR1cyA9IGhkZF9zZXRfc21lX2NvbmZpZyhwSGRkQ3R4KTsKKyAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogRmFpbGVkIGhkZF9zZXRfc21lX2NvbmZpZyIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfdm9zY2xvc2U7CisgICB9CisKKyAgIC8qIEluaXRpYWxpemUgdGhlIFdNTSBtb2R1bGUgKi8KKyAgIHZvc1N0YXR1cyA9IGhkZF93bW1faW5pdChwSGRkQ3R4KTsKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IGhkZF93bW1faW5pdCBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgZ290byBlcnJfdm9zY2xvc2U7CisgICB9CisKKyAgIHZvc1N0YXR1cyA9IHZvc19wcmVTdGFydCggcEhkZEN0eC0+cHZvc0NvbnRleHQgKTsKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IHZvc19wcmVTdGFydCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX3Zvc2Nsb3NlOworICAgfQorCisgICAvKiBJbiB0aGUgaW50ZWdyYXRlZCBhcmNoaXRlY3R1cmUgd2UgdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIGZyb20KKyAgICAgIHRoZSBJTkkgZmlsZSBhbmQgZnJvbSBOViBiZWZvcmUgdk9TUyBoYXMgYmVlbiBzdGFydGVkIHNvIHRoYXQKKyAgICAgIHRoZSBmaW5hbCBjb250ZW50cyBhcmUgYXZhaWxhYmxlIHRvIHNlbmQgZG93biB0byB0aGUgY0NQVSAgICovCisgICAvKiBBcHBseSB0aGUgY2ZnLmluaSB0byBjZmcuZGF0ICovCisgICBpZiAoRkFMU0UgPT0gaGRkX3VwZGF0ZV9jb25maWdfZGF0KHBIZGRDdHgpKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IGNvbmZpZyB1cGRhdGUgZmFpbGVkIixfX2Z1bmNfXyApOworICAgICAgZ290byBlcnJfdm9zY2xvc2U7CisgICB9CisKKyAgIC8qIFNldCB0aGUgTUFDIEFkZHJlc3MsIGN1cnJlbnRseSB0aGlzIGlzIHVzZWQgYnkgSEFMIHRvIGFkZCBzZWxmIHN0YS4KKyAgICAqIFJlbW92ZSB0aGlzIG9uY2Ugc2VsZiBzdGEgaXMgYWRkZWQgYXMgcGFydCBvZiBzZXNzaW9uIG9wZW4uICovCisgICBoYWxTdGF0dXMgPSBjZmdTZXRTdHIocEhkZEN0eC0+aEhhbCwgV05JX0NGR19TVEFfSUQsCisgICAgICAgICAodl9VOF90ICopJnBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyWzBdLAorICAgICAgICAgICBzaXplb2YocEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMF0pKTsKKyAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKGhhbFN0YXR1cykpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogRmFpbGVkIHRvIHNldCBNQUMgQWRkcmVzcy4gIgorICAgICAgICAgICAgIkhBTFN0YXR1cyBpcyAlMDhkIFt4JTA4eF0iLF9fZnVuY19fLCBoYWxTdGF0dXMsIGhhbFN0YXR1cyk7CisgICAgICBnb3RvIGVycl92b3NjbG9zZTsKKyAgIH0KKworICAgLyogU3RhcnQgVk9TUyB3aGljaCBzdGFydHMgdXAgdGhlIFNNRS9NQUMvSEFMIG1vZHVsZXMgYW5kIGV2ZXJ5dGhpbmcgZWxzZQorICAgICAgTm90ZTogRmlybXdhcmUgaW1hZ2Ugd2lsbCBiZSByZWFkIGFuZCBkb3dubG9hZGVkIGluc2lkZSB2b3Nfc3RhcnQgQVBJICovCisgICB2b3NTdGF0dXMgPSB2b3Nfc3RhcnQoIHBWb3NDb250ZXh0ICk7CisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiB2b3Nfc3RhcnQgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl92b3NjbG9zZTsKKyAgIH0KKworICAgdm9zU3RhdHVzID0gaGRkX3Bvc3Rfdm9zc19zdGFydF9jb25maWcoIHBIZGRDdHggKTsKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IGhkZF9wb3N0X3Zvc3Nfc3RhcnRfY29uZmlnIGZhaWxlZCIsCisgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl92b3NzdG9wOworICAgfQorCisjaWZkZWYgV0xBTl9CVEFNUF9GRUFUVVJFCisgICB2b3NTdGF0dXMgPSBXTEFOQkFQX09wZW4ocFZvc0NvbnRleHQpOworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiJXM6IEZhaWxlZCB0byBvcGVuIEJBUCIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfdm9zc3RvcDsKKyAgIH0KKyAgIHZvc1N0YXR1cyA9IEJTTF9Jbml0KHBWb3NDb250ZXh0KTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgIiVzOiBGYWlsZWQgdG8gSW5pdCBCU0wiLF9fZnVuY19fKTsKKyAgICAgZ290byBlcnJfYmFwX2Nsb3NlOworICAgfQorICAgdm9zU3RhdHVzID0gV0xBTkJBUF9TdGFydChwVm9zQ29udGV4dCk7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdGFydCBUTCIsX19mdW5jX18pOworICAgICAgIGdvdG8gZXJyX2JhcF9jbG9zZTsKKyAgIH0KKyAgIHBDb25maWcgPSBwSGRkQ3R4LT5jZmdfaW5pOworICAgYnRBbXBDb25maWcudWNQcmVmZXJyZWRDaGFubmVsID0gcENvbmZpZy0+cHJlZmVycmVkQ2hhbm5lbDsKKyAgIHZvc1N0YXR1cyA9IFdMQU5CQVBfU2V0Q29uZmlnKCZidEFtcENvbmZpZyk7CisjZW5kaWYgLy9XTEFOX0JUQU1QX0ZFQVRVUkUKKworICAgIC8qIFJlc3RhcnQgYWxsIGFkYXB0ZXJzICovCisgICBoZGRfc3RhcnRfYWxsX2FkYXB0ZXJzKHBIZGRDdHgpOworICAgcEhkZEN0eC0+aXNMb2dwSW5Qcm9ncmVzcyA9IEZBTFNFOworICAgcEhkZEN0eC0+aGRkX21jYXN0YmNhc3RfZmlsdGVyX3NldCA9IEZBTFNFOworI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECisgICBoZGRfcmVnaXN0ZXJfbWNhc3RfYmNhc3RfZmlsdGVyKHBIZGRDdHgpOworI2VuZGlmCisKKyAgIC8qIFJlZ2lzdGVyIHdpdGggcGxhdGZvcm0gZHJpdmVyIGFzIGNsaWVudCBmb3IgU3VzcGVuZC9SZXN1bWUgKi8KKyAgIHZvc1N0YXR1cyA9IGhkZFJlZ2lzdGVyUG1PcHMocEhkZEN0eCk7CisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBoZGRSZWdpc3RlclBtT3BzIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfYmFwX3N0b3A7CisgICB9CisgICAvLyBSZWdpc3RlciBzdXNwZW5kL3Jlc3VtZSBjYWxsYmFja3MKKyAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPm5FbmFibGVTdXNwZW5kKQorICAgeworICAgICAgcmVnaXN0ZXJfd2xhbl9zdXNwZW5kKCk7CisgICB9CisgICAvKiBBbGxvdyB0aGUgcGhvbmUgdG8gZ28gdG8gc2xlZXAgKi8KKyAgIGhkZF9hbGxvd19zdXNwZW5kKCk7CisgICAvKiByZWdpc3RlciBmb3Igcml2YSBwb3dlciBvbiBsb2NrICovCisgICBpZiAocmVxX3JpdmFfcG93ZXJfb25fbG9jaygid2xhbiIpKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IHJlcSByaXZhIHBvd2VyIG9uIGxvY2sgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl91bnJlZ2lzdGVyX3Btb3BzOworICAgfQorICAgZ290byBzdWNjZXNzOworCitlcnJfdW5yZWdpc3Rlcl9wbW9wczoKKyAgIGhkZERlcmVnaXN0ZXJQbU9wcyhwSGRkQ3R4KTsKKworZXJyX2JhcF9zdG9wOgorI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICBXTEFOQkFQX1N0b3AocFZvc0NvbnRleHQpOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKK2Vycl9iYXBfY2xvc2U6CisgICBXTEFOQkFQX0Nsb3NlKHBWb3NDb250ZXh0KTsKKyNlbmRpZgorCitlcnJfdm9zc3RvcDoKKyAgIHZvc19zdG9wKHBWb3NDb250ZXh0KTsKKworZXJyX3Zvc2Nsb3NlOgorICAgdm9zX2Nsb3NlKHBWb3NDb250ZXh0KTsKKyAgIHZvc19zY2hlZF9jbG9zZShwVm9zQ29udGV4dCk7CisgICBpZiAocEhkZEN0eCkKKyAgIHsKKyNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAorICAgICAgIC8qIHVucmVnaXN0ZXIgc3VzcGVuZC9yZXN1bWUgY2FsbGJhY2tzICovCisgICAgICAgaWYgKHBIZGRDdHgtPmNmZ19pbmktPm5FbmFibGVTdXNwZW5kKQorICAgICAgICAgICB1bnJlZ2lzdGVyX3dsYW5fc3VzcGVuZCgpOworI2VuZGlmCisgICAgICAgLyogVW5yZWdpc3RlciB0aGUgTmV0IERldmljZSBOb3RpZmllciAqLworICAgICAgIHVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZoZGRfbmV0ZGV2X25vdGlmaWVyKTsKKyAgICAgICAvKiBDbGVhbiB1cCBIREQgTmxpbmsgU2VydmljZSAqLworICAgICAgIHNlbmRfYnRjX25saW5rX21zZyhXTEFOX01PRFVMRV9ET1dOX0lORCwgMCk7CisgICAgICAgbmxfc3J2X2V4aXQoKTsKKyAgICAgICBoZGRfY2xvc2VfYWxsX2FkYXB0ZXJzKHBIZGRDdHgpOworICAgICAgIC8qIEZyZWUgdXAgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbWJlcnMgaW5zaWRlIEhERCBBZGFwdGVyICovCisgICAgICAga2ZyZWUocEhkZEN0eC0+Y2ZnX2luaSk7CisgICAgICAgcEhkZEN0eC0+Y2ZnX2luaT0gTlVMTDsKKworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgICAgIHdpcGh5X3VucmVnaXN0ZXIocEhkZEN0eC0+d2lwaHkpOworICAgICAgIHdpcGh5X2ZyZWUocEhkZEN0eC0+d2lwaHkpOworI2Vsc2UKKyAgICAgICB2b3NfbWVtX2ZyZWUocEhkZEN0eCk7CisjZW5kaWYKKyAgIH0KKyAgIHZvc19wcmVDbG9zZSgmcFZvc0NvbnRleHQpOworCisjaWZkZWYgTUVNT1JZX0RFQlVHCisgICB2b3NfbWVtX2V4aXQoKTsKKyNlbmRpZgorCitlcnJfcmVfaW5pdDoKKyAgIC8qIEFsbG93IHRoZSBwaG9uZSB0byBnbyB0byBzbGVlcCAqLworICAgaGRkX2FsbG93X3N1c3BlbmQoKTsKKyAgIHJldHVybiAtMTsKKworc3VjY2VzczoKKyAgIC8qIFRyaWdnZXIgcmVwbGF5IG9mIEJUQyBldmVudHMgKi8KKyAgIHNlbmRfYnRjX25saW5rX21zZyhXTEFOX01PRFVMRV9ET1dOX0lORCwgMCk7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvc3JjL3dsYW5faGRkX2Z0bS5jIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX2Z0bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTIyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfZnRtLmMKQEAgLTAsMCArMSw0NzM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgXGZpbGUgIHdsYW5faGRkX2Z0bS5jCisKKyAgXGJyaWVmIFRoaXMgZmlsZSBjb250YWlucyB0aGUgV0xBTiBmYWN0b3J5IHRlc3QgbW9kZSBpbXBsZW1lbnRhdGlvbgorCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAkSGVhZGVyOiQgICAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkKKyAgLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDA0LzIwLzExICAgIExlby9IZW5yaSAgICAgIENvbnZlcmdlbmNlIGZvciBQcmltYSBhbmQgVm9sYW5zLiBTaW5nbGUgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIEZUTSBhbmQgbWlzc2lvbiBtb2RlCisgIDA0LzUvMDkgICAgIFNoYWlsZW5kZXIgICAgIENyZWF0ZWQgbW9kdWxlLgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlIDx2b3NfbXEuaD4KKyNpbmNsdWRlICJ2b3Nfc2NoZWQuaCIKKyNpbmNsdWRlIDx2b3NfYXBpLmg+CisjaW5jbHVkZSAic2lyVHlwZXMuaCIKKyNpbmNsdWRlICJoYWxUeXBlcy5oIgorI2luY2x1ZGUgInNpckFwaS5oIgorI2luY2x1ZGUgInNpck1hY1Byb3REZWYuaCIKKyNpbmNsdWRlICJzbWVfQXBpLmgiCisjaW5jbHVkZSAibWFjSW5pdEFwaS5oIgorI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJ3bGFuX3FjdF9zYWwuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9iYWwuaCIKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKyNpbmNsdWRlICJ3bGFuX3FjdF9zeXMuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIgorI2luY2x1ZGUgIndsYW5faGRkX21pc2MuaCIKKyNpbmNsdWRlICJpX3Zvc19wYWNrZXQuaCIKKyNpbmNsdWRlICJ2b3NfbnZpdGVtLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorI2luY2x1ZGUgInZvc19wb3dlci5oIgorI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJhbmlfYXNzZXJ0LmgiCisjaW5jbHVkZSAic3lzX2FwaS5oIgorI2luY2x1ZGUgInB0dE1vZHVsZUFwaS5oIgorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworI2luY2x1ZGUgInF3bGFuX3ZlcnNpb24uaCIKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgIndsYW5fbnYuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGEuaCIKKyNpbmNsdWRlICJjZmdBcGkuaCIKKyNpbmNsdWRlICJwdHRNc2dBcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfZGV2aWNlLmgiCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKKyNpZmRlZiBBTklfTUFORl9ESUFHCisjZGVmaW5lIFJYTU9ERV9ESVNBQkxFX0FMTCAwCisjZGVmaW5lIFJYTU9ERV9FTkFCTEVfQUxMICAxCisjZGVmaW5lIFJYTU9ERV9FTkFCTEVfMTFHTiAyCisjZGVmaW5lIFJYTU9ERV9FTkFCTEVfMTFCICAzCisKKyNkZWZpbmUgRlRNX0NIQUlOX1NFTF9OT19SWF9UWCAgICAgIDAKKyNkZWZpbmUgRlRNX0NIQUlOX1NFTF9SMF9PTiAgICAgICAgIDEKKyNkZWZpbmUgRlRNX0NIQUlOX1NFTF9UMF9PTiAgICAgICAgIDIKKyNkZWZpbmUgRlRNX0NIQUlOX1NFTF9SMF9UMF9PTiAgICAgIDMKKyNkZWZpbmUgRlRNX0NIQUlOX1NFTF9NQVggICAgICAgICAgIDMKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2lmbmRlZiBRV0xBTl9QSFlEQkdfQkFTRQorI2RlZmluZSBRV0xBTl9QSFlEQkdfQkFTRSAgICAgICAgICAgICAgICAgICAweDAzMDA0MDAwCisjZW5kaWYgLyogUVdMQU5fUEhZREJHX0JBU0UgKi8KKworI2lmbmRlZiBRV0xBTl9QSFlEQkdfVFhQS1RfQ05UX1JFRworI2RlZmluZSBRV0xBTl9QSFlEQkdfVFhQS1RfQ05UX1JFRyAgICAgICAgICBRV0xBTl9QSFlEQkdfQkFTRSArIDB4NkMKKyNkZWZpbmUgUVdMQU5fUEhZREJHX1RYUEtUX0NOVF9DTlRfTUFTSyAgICAgMHhGRkZGCisjZW5kaWYKKworI2lmbmRlZiBRV0xBTl9BR0NfQkFTRQorI2RlZmluZSBRV0xBTl9BR0NfQkFTRSAgICAgICAgICAgICAgICAgICAgICAweDAzMDEzQzAwCisjZW5kaWYgLyogUVdMQU5fQUdDX0JBU0UgKi8KKworI2lmbmRlZiBRV0xBTl9BR0NfQ0hBTk5FTF9GUkVRX1JFRworI2RlZmluZSBRV0xBTl9BR0NfQ0hBTk5FTF9GUkVRX1JFRyAgICAgICAgICBRV0xBTl9BR0NfQkFTRSArIDB4MzQKKyNkZWZpbmUgUVdMQU5fQUdDX0NIQU5ORUxfRlJFUV9GUkVRX01BU0sgICAgMHgxRkZGCisjZW5kaWYgLyogUVdMQU5fQUdDX0NIQU5ORUxfRlJFUV9SRUcgKi8KKworI2lmbmRlZiBRV0xBTl9BR0NfU1VCQkFORF9DT05GSUdfUkVHCisjZGVmaW5lIFFXTEFOX0FHQ19TVUJCQU5EX0NPTkZJR19SRUcgICAgICAgIFFXTEFOX0FHQ19CQVNFICsgMHgzMAorI2RlZmluZSBRV0xBTl9BR0NfU1VCQkFORF9DT05GSUdfU1RHMl9TVUJCQU5EX01BU0sgIDB4MDMKKyNlbmRpZiAvKiBRV0xBTl9BR0NfU1VCQkFORF9DT05GSUdfUkVHICovCisKKyNpZm5kZWYgUVdMQU5fUkZBUEJfQkFTRQorI2RlZmluZSBRV0xBTl9SRkFQQl9CQVNFICAgICAgICAgICAgICAgICAgICAweDBFMDJGODAwCisjZW5kaWYgLyogUVdMQU5fUkZBUEJfQkFTRSAqLworCisjaWZuZGVmIFFXTEFOX1JGQVBCX1JFVl9JRF9SRUcKKyNkZWZpbmUgUVdMQU5fUkZBUEJfUkVWX0lEX1JFRyAgICAgICAgICAgICAgUVdMQU5fUkZBUEJfQkFTRSArIDB4MDAKKyNlbmRpZiAvKiBRV0xBTl9SRkFQQl9SRVZfSURfUkVHICovCisKKyNpZm5kZWYgUVdMQU5fVFhDVExfQkFTRQorI2RlZmluZSBRV0xBTl9UWENUTF9CQVNFICAgICAgICAgICAgICAgICAgICAweDAzMDEyMDAwCisjZW5kaWYgLyogUVdMQU5fVFhDVExfQkFTRSAqLworCisjaWZuZGVmIFFXTEFOX1RYQ1RMX0ZTSElGVF9SRUcKKyNkZWZpbmUgUVdMQU5fVFhDVExfRlNISUZUX1JFRyAgICAgICAgICAgICAgUVdMQU5fVFhDVExfQkFTRSArIDB4MjAKKyNkZWZpbmUgUVdMQU5fVFhDVExfRlNISUZUX0JXMTRfT0ZGU0VUICAgICAgMHgwMgorI2RlZmluZSBRV0xBTl9UWENUTF9GU0hJRlRfQlcxNF9NQVNLICAgICAgICAweDFDCisjZGVmaW5lIFFXTEFOX1RYQ1RMX0ZTSElGVF9CVzEyX09GRlNFVCAgICAgIDB4MDAKKyNkZWZpbmUgUVdMQU5fVFhDVExfRlNISUZUX0JXMTJfTUFTSyAgICAgICAgMHgwMworI2VuZGlmIC8qIFFXTEFOX1RYQ1RMX0ZTSElGVF9SRUcgKi8KKworLyogVG8gc2V0IDRNQUMgYWRkcmVzc2VzIGZyb20gZ2l2ZW4gZmlyc3QgTUFDIGFkZHJlc3MsCisgKiBMYXN0IGJ5dGUgdmFsdWUgd2l0aGluIGdpdmVuIE1BQyBhZGRyZXNzIG11c3QgbGVzcyB0aGFuIDB4RkYgLSAzICovCisjZGVmaW5lIFFXTEFOX01BWF9NQUNfTEFTVF9CWVRFX1ZBTFVFICAgICAgIDB4RkMKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdEFOSV9VMzIgdGFibGVTaXplOyAgICAgICAgICAgICAgICAgICAgICAvKiBXaG9sZSBOViBUYWJsZSBTaXplICovCisgICB0QU5JX1UzMiBjaHVua1NpemU7ICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgQ2h1bmsgU2l6ZSA8IDJLICovCisgICBlTnZUYWJsZSBudlRhYmxlOworICAgdEFOSV9VOCAgdGFibGVEYXRhOyAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGxlZCBieSBob3N0IGRyaXZlciAqLworfSBwdHRHZXROdlRhYmxlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB0QU5JX1UzMiB0YWJsZVNpemU7ICAgICAgICAgICAgICAgICAgICAgIC8qIFdob2xlIE5WIFRhYmxlIFNpemUgKi8KKyAgIHRBTklfVTMyIGNodW5rU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBDaHVuayBTaXplIDwgMksgKi8KKyAgIGVOdlRhYmxlIG52VGFibGU7CisgICB0QU5JX1U4ICB0YWJsZURhdGE7IAorfSBwdHRTZXROdlRhYmxlOworCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKK2V4dGVybiBjb25zdCBzSGFsTnYgbnZEZWZhdWx0czsKK3N0YXRpYyBpbnQgd2xhbl9mdG1fcmVnaXN0ZXJfd2V4dChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcik7CisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworc3RhdGljIHZfVk9JRF90IGZ0bV92b3Nfc3lzX3Byb2JlX3RocmVhZF9jYmFjayggdl9WT0lEX3QgKnBVc2VyRGF0YSApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisvKiBmb3IgUFJJTUE6IGFsbCB0aGUgYXZhaWxhYmxlIGZyZXF1ZW5jeSwgY2hhbm5hbCBwYWlyIGkgdGhlIHRhYmxlIGFyZSBkZWZpbmVkIGZvciBjaGFubmVsIGZyZXF1ZW5jeSBAIFJGIGNlbnRlciBmcmVxdWVuY3kgCisgICBTaW5jZSBpdCBpcyBhc3NvY2lhdGVkIHRvIGFnYy5jaGFubmVsX2ZyZXEgcmVnaXN0ZXIgZm9yIG1hcHBpbmcuCisgICBGb3IgY2hhbm5lbCBib25kaW5nLCB0aGUgY2hhbm5lbCBudW1iZXIgaXMgKzIgb3IgLTIgZm9yIENCIHdpdGggcHJpbWFyeSBoaWdoLCBvciB3aXRoIHByaW1hcnkgbG93IHJlc3BlY3RpdmVseS4KKyovCitzdGF0aWMgY29uc3QgZnJlcV9jaGFuX3QgIGZyZXFfY2hhbl90YmxbXSA9IHsKKyAgICAgezI0MTIsIDF9LCB7MjQxNywgMn0sezI0MjIsIDN9LCB7MjQyNywgNH0sIHsyNDMyLCA1fSwgezI0MzcsIDZ9LCB7MjQ0MiwgN30sCisgICAgIHsyNDQ3LCA4fSwgezI0NTIsIDl9LHsyNDU3LCAxMH0sezI0NjIsIDExfSx7MjQ2NyAsMTJ9LHsyNDcyLCAxM30sezI0ODQsIDE0fQorfTsKKworc3RhdGljIHJhdGVTdHIycmF0ZUluZGV4X3QgcmF0ZU5hbWVfcmF0ZUluZGV4X3RibFtdID0KK3sKKyAgIHsgSEFMX1BIWV9SQVRFXzExQl9MT05HXzFfTUJQUywgICAgICAgIjExQl9MT05HXzFfTUJQUyJ9LAorICAgeyBIQUxfUEhZX1JBVEVfMTFCX0xPTkdfMl9NQlBTLCAgICAgICAiMTFCX0xPTkdfMl9NQlBTIn0sCisgICB7IEhBTF9QSFlfUkFURV8xMUJfTE9OR181XzVfTUJQUywgICAgICIxMUJfTE9OR181XzVfTUJQUyJ9LAorICAgeyBIQUxfUEhZX1JBVEVfMTFCX0xPTkdfMTFfTUJQUywgICAgICAiMTFCX0xPTkdfMTFfTUJQUyJ9LAorICAgeyBIQUxfUEhZX1JBVEVfMTFCX1NIT1JUXzJfTUJQUywgICAgICAiMTFCX1NIT1JUXzJfTUJQUyJ9LAorICAgeyBIQUxfUEhZX1JBVEVfMTFCX1NIT1JUXzVfNV9NQlBTLCAgICAiMTFCX1NIT1JUXzVfNV9NQlBTIn0sCisgICB7IEhBTF9QSFlfUkFURV8xMUJfU0hPUlRfMTFfTUJQUywgICAgICIxMUJfU0hPUlRfMTFfTUJQUyJ9LAorICAgLy9TcGljYV9WaXJnbyAxMUEgMjBNSHogUmF0ZXMKKyAgIHsgSEFMX1BIWV9SQVRFXzExQV82X01CUFMsICAgICAgICAgICAgIjExQV82X01CUFMifSwKKyAgIHsgSEFMX1BIWV9SQVRFXzExQV85X01CUFMsICAgICAgICAgICAgIjExQV85X01CUFMifSwKKyAgIHsgSEFMX1BIWV9SQVRFXzExQV8xMl9NQlBTLCAgICAgICAgICAgIjExQV8xMl9NQlBTIn0sCisgICB7IEhBTF9QSFlfUkFURV8xMUFfMThfTUJQUywgICAgICAgICAgICIxMUFfMThfTUJQUyJ9LAorICAgeyBIQUxfUEhZX1JBVEVfMTFBXzI0X01CUFMsICAgICAgICAgICAiMTFBXzI0X01CUFMifSwKKyAgIHsgSEFMX1BIWV9SQVRFXzExQV8zNl9NQlBTLCAgICAgICAgICAgIjExQV8zNl9NQlBTIn0sCisgICB7IEhBTF9QSFlfUkFURV8xMUFfNDhfTUJQUywgICAgICAgICAgICIxMUFfNDhfTUJQUyJ9LAorICAgeyBIQUxfUEhZX1JBVEVfMTFBXzU0X01CUFMsICAgICAgICAgICAiMTFBXzU0X01CUFMifSwKKworLy9NQ1MgSW5kZXggIzAtMTUgKDIwTUh6KQorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNl81X01CUFMsICAgIk1DU182XzVfTUJQUyJ9LAorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMTNfTUJQUywgICAgIk1DU18xM19NQlBTIn0sCisgICB7IEhBTF9QSFlfUkFURV9NQ1NfMU5TU18xOV81X01CUFMsICAiTUNTXzE5XzVfTUJQUyJ9LAorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMjZfTUJQUywgICAgIk1DU18yNl9NQlBTIn0sCisgICB7IEhBTF9QSFlfUkFURV9NQ1NfMU5TU18zOV9NQlBTLCAgICAiTUNTXzM5X01CUFMifSwKKyAgIHsgSEFMX1BIWV9SQVRFX01DU18xTlNTXzUyX01CUFMsICAgICJNQ1NfNTJfTUJQUyJ9LAorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNThfNV9NQlBTLCAgIk1DU181OF81X01CUFMifSwKKyAgIHsgSEFMX1BIWV9SQVRFX01DU18xTlNTXzY1X01CUFMsICAgICJNQ1NfNjVfTUJQUyJ9LAorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfNzJfMl9NQlBTLCAiTUNTXzcyXzJfTUJQUyJ9Cit9OworCitzdGF0aWMgcmF0ZUluZGV4MlByZWFtYmxlX3QgcmF0ZV9pbmRleF8yX3ByZWFtYmxlX3RhYmxlW10gPQoreworCisgICB7IEhBTF9QSFlfUkFURV8xMUJfTE9OR18xX01CUFMsICAgICAgIFBIWURCR19QUkVBTUJMRV9MT05HQn0sCisgICB7IEhBTF9QSFlfUkFURV8xMUJfTE9OR18yX01CUFMsICAgICAgIFBIWURCR19QUkVBTUJMRV9MT05HQn0sCisgICB7IEhBTF9QSFlfUkFURV8xMUJfTE9OR181XzVfTUJQUywgICAgIFBIWURCR19QUkVBTUJMRV9MT05HQn0sCisgICB7IEhBTF9QSFlfUkFURV8xMUJfTE9OR18xMV9NQlBTLCAgICAgIFBIWURCR19QUkVBTUJMRV9MT05HQn0sCisgICB7IEhBTF9QSFlfUkFURV8xMUJfU0hPUlRfMl9NQlBTLCAgICAgIFBIWURCR19QUkVBTUJMRV9TSE9SVEJ9LAorICAgeyBIQUxfUEhZX1JBVEVfMTFCX1NIT1JUXzVfNV9NQlBTLCAgICBQSFlEQkdfUFJFQU1CTEVfU0hPUlRCfSwKKyAgIHsgSEFMX1BIWV9SQVRFXzExQl9TSE9SVF8xMV9NQlBTLCAgICAgUEhZREJHX1BSRUFNQkxFX1NIT1JUQn0sCisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgLy9TTFIgUmF0ZXMKKyAgIHsgSEFMX1BIWV9SQVRFX1NMUl8wXzI1X01CUFMsICAgICAgICBQSFlEQkdfUFJFQU1CTEVfTk9UX1NVUFBPUlRFRH0sCisgICB7IEhBTF9QSFlfUkFURV9TTFJfMF81X01CUFMsICAgICAgICAgUEhZREJHX1BSRUFNQkxFX05PVF9TVVBQT1JURUR9LAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisgICAvL1NwaWNhX1ZpcmdvIDExQSAyME1IeiBSYXRlcworICAgeyBIQUxfUEhZX1JBVEVfMTFBXzZfTUJQUywgICAgICAgICAgIFBIWURCR19QUkVBTUJMRV9PRkRNfSwKKyAgIHsgSEFMX1BIWV9SQVRFXzExQV85X01CUFMsICAgICAgICAgICBQSFlEQkdfUFJFQU1CTEVfT0ZETX0sCisgICB7IEhBTF9QSFlfUkFURV8xMUFfMTJfTUJQUywgICAgICAgICAgUEhZREJHX1BSRUFNQkxFX09GRE19LAorICAgeyBIQUxfUEhZX1JBVEVfMTFBXzE4X01CUFMsICAgICAgICAgIFBIWURCR19QUkVBTUJMRV9PRkRNfSwKKyAgIHsgSEFMX1BIWV9SQVRFXzExQV8yNF9NQlBTLCAgICAgICAgICBQSFlEQkdfUFJFQU1CTEVfT0ZETX0sCisgICB7IEhBTF9QSFlfUkFURV8xMUFfMzZfTUJQUywgICAgICAgICAgUEhZREJHX1BSRUFNQkxFX09GRE19LAorICAgeyBIQUxfUEhZX1JBVEVfMTFBXzQ4X01CUFMsICAgICAgICAgIFBIWURCR19QUkVBTUJMRV9PRkRNfSwKKyAgIHsgSEFMX1BIWV9SQVRFXzExQV81NF9NQlBTLCAgICAgICAgICBQSFlEQkdfUFJFQU1CTEVfT0ZETX0sCisKKyAgIC8vTUNTIEluZGV4ICMwLTE1ICgyME1IeikKKyAgIHsgSEFMX1BIWV9SQVRFX01DU18xTlNTXzZfNV9NQlBTLCAgIFBIWURCR19QUkVBTUJMRV9NSVhFRH0sCisgICB7IEhBTF9QSFlfUkFURV9NQ1NfMU5TU18xM19NQlBTLCAgICBQSFlEQkdfUFJFQU1CTEVfTUlYRUR9LAorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMTlfNV9NQlBTLCAgUEhZREJHX1BSRUFNQkxFX01JWEVEfSwKKyAgIHsgSEFMX1BIWV9SQVRFX01DU18xTlNTXzI2X01CUFMsICAgIFBIWURCR19QUkVBTUJMRV9NSVhFRH0sCisgICB7IEhBTF9QSFlfUkFURV9NQ1NfMU5TU18zOV9NQlBTLCAgICBQSFlEQkdfUFJFQU1CTEVfTUlYRUR9LAorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNTJfTUJQUywgICAgUEhZREJHX1BSRUFNQkxFX01JWEVEfSwKKyAgIHsgSEFMX1BIWV9SQVRFX01DU18xTlNTXzU4XzVfTUJQUywgIFBIWURCR19QUkVBTUJMRV9NSVhFRH0sCisgICB7IEhBTF9QSFlfUkFURV9NQ1NfMU5TU182NV9NQlBTLCAgICBQSFlEQkdfUFJFQU1CTEVfTUlYRUR9LAorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfN18yX01CUFMsIFBIWURCR19QUkVBTUJMRV9OT1RfU1VQUE9SVEVEfSwKKyAgIHsgSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzE0XzRfTUJQUyxQSFlEQkdfUFJFQU1CTEVfTk9UX1NVUFBPUlRFRH0sCisgICB7IEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR18yMV83X01CUFMsUEhZREJHX1BSRUFNQkxFX05PVF9TVVBQT1JURUR9LAorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfMjhfOV9NQlBTLFBIWURCR19QUkVBTUJMRV9OT1RfU1VQUE9SVEVEfSwKKyAgIHsgSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzQzXzNfTUJQUyxQSFlEQkdfUFJFQU1CTEVfTk9UX1NVUFBPUlRFRH0sCisgICB7IEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR181N184X01CUFMsUEhZREJHX1BSRUFNQkxFX05PVF9TVVBQT1JURUR9LAorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfNjVfTUJQUywgUEhZREJHX1BSRUFNQkxFX05PVF9TVVBQT1JURUR9LAorICAgeyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfNzJfMl9NQlBTLCBQSFlEQkdfUFJFQU1CTEVfTUlYRUR9LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0QU5JX0JPT0xFQU4gZnJhbWVHZW5FbmFibGVkOworICAgIHRBTklfQk9PTEVBTiB3Zm1FbmFibGVkOworICAgIHNQdHRGcmFtZUdlblBhcmFtcyBmcmFtZVBhcmFtczsKKyAgICB2X1UxNl90IHR4cG93ZXI7CisgICAgdl9VMTZfdCByeG1vZGU7CisgICAgdl9VMTZfdCBjaGFpblNlbGVjdDsKKworfSBGVE1fU1RBVFVTIDsKK3N0YXRpYyBGVE1fU1RBVFVTIGZ0bV9zdGF0dXM7CisKKy8vdHBBbmlTaXJHbG9iYWwgcE1hYzsKKworc3RhdGljIHZvaWQgX2Z0bV9zdGF0dXNfaW5pdCh2b2lkKQoreworICAgIHRBTklfVTggYWRkcjFbQU5JX01BQ19BRERSX1NJWkVdID0geyAweDAwLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExIH07ICAgLy9kZXN0CisgICAgdEFOSV9VOCBhZGRyMltBTklfTUFDX0FERFJfU0laRV0gPSB7IDB4MDAsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIgfTsgICAvL3NvdXIKKyAgICB0QU5JX1U4IGFkZHIzW0FOSV9NQUNfQUREUl9TSVpFXSA9IHsgMHgwMCwgMHgzMywgMHgzMywgMHgzMywgMHgzMywgMHgzMyB9OyAgIC8vYnNzSWQKKworICAgIGZ0bV9zdGF0dXMud2ZtRW5hYmxlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBmdG1fc3RhdHVzLmZyYW1lR2VuRW5hYmxlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBmdG1fc3RhdHVzLmZyYW1lUGFyYW1zLm51bVRlc3RQYWNrZXRzID0gMDsgICAvL0NvbnRpbnVvdXMKKyAgICBmdG1fc3RhdHVzLmZyYW1lUGFyYW1zLmludGVyRnJhbWVTcGFjZSA9IDEwOworICAgIGZ0bV9zdGF0dXMuZnJhbWVQYXJhbXMucmF0ZSA9IEhBTF9QSFlfUkFURV8xMUFfNl9NQlBTOworICAgIGZ0bV9zdGF0dXMuZnJhbWVQYXJhbXMucGF5bG9hZENvbnRlbnRzID0gVEVTVF9QQVlMT0FEX1JBTkRPTTsKKyAgICBmdG1fc3RhdHVzLmZyYW1lUGFyYW1zLnBheWxvYWRMZW5ndGggPSAyMDAwOworICAgIGZ0bV9zdGF0dXMuZnJhbWVQYXJhbXMucGF5bG9hZEZpbGxCeXRlID0gMHhBNTsKKyAgICBmdG1fc3RhdHVzLmZyYW1lUGFyYW1zLnBrdEF1dG9TZXFOdW0gPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgZnRtX3N0YXR1cy5mcmFtZVBhcmFtcy50eF9tb2RlID0gMDsKKyAgICBmdG1fc3RhdHVzLmZyYW1lUGFyYW1zLmNyYyA9IDA7CisgICAgZnRtX3N0YXR1cy5mcmFtZVBhcmFtcy5wcmVhbWJsZSA9IFBIWURCR19QUkVBTUJMRV9PRkRNOworICAgIG1lbWNweSgmZnRtX3N0YXR1cy5mcmFtZVBhcmFtcy5hZGRyMVswXSwgYWRkcjEsIEFOSV9NQUNfQUREUl9TSVpFKTsKKyAgICBtZW1jcHkoJmZ0bV9zdGF0dXMuZnJhbWVQYXJhbXMuYWRkcjJbMF0sIGFkZHIyLCBBTklfTUFDX0FERFJfU0laRSk7CisgICAgbWVtY3B5KCZmdG1fc3RhdHVzLmZyYW1lUGFyYW1zLmFkZHIzWzBdLCBhZGRyMywgQU5JX01BQ19BRERSX1NJWkUpOworICAgIGZ0bV9zdGF0dXMudHhwb3dlciA9IDIgOworICAgIGZ0bV9zdGF0dXMucnhtb2RlID0gUlhNT0RFX0VOQUJMRV9BTEw7IC8qIG1hY1N0YXJ0KCkgZW5hYmxlcyBhbGwgcmVjZWl2ZSBwa3QgdHlwZXMgKi8KKyAgICBmdG1fc3RhdHVzLmNoYWluU2VsZWN0ID0gRlRNX0NIQUlOX1NFTF9SMF9UMF9PTjsKKworICAgIHJldHVybjsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5fZnRtX3Bvc3Rtc2coKSAtCisKKyAgIFRoZSBmdW5jdGlvbiB1c2VkIGZvciBzZW5kaW5nIHRoZSBjb21tYW5kIHRvIHRoZSBoYWxwaHkuCisKKyAgXHBhcmFtICAtIGNtZF9wdHIgLSBQb2ludGVyIGNvbW1hbmQgYnVmZmVyLgorCisgIFxwYXJhbSAgLSBjbWRfbGVuIC0gQ29tbWFuZCBsZW5ndGguCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdl9VMzJfdCB3bGFuX2Z0bV9wb3N0bXNnKHZfVThfdCAqY21kX3B0ciwgdl9VMTZfdCBjbWRfbGVuKQoreworICAgIHZvc19tc2dfdCAgICpmdG1SZXFNc2c7CisgICAgdm9zX21zZ190ICAgIGZ0bU1zZzsKKyAgICBFTlRFUigpOworCisgICAgZnRtUmVxTXNnID0gKHZvc19tc2dfdCAqKSBjbWRfcHRyOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgZnRtTXNnLnR5cGUgPSBXREFfRlRNX0NNRF9SRVE7CisjZWxzZQorICAgIGZ0bU1zZy50eXBlID0gZnRtUmVxTXNnLT50eXBlOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworICAgIGZ0bU1zZy5yZXNlcnZlZCA9IDA7CisgICAgZnRtTXNnLmJvZHlwdHIgPSAodl9VOF90KiljbWRfcHRyOworICAgIGZ0bU1zZy5ib2R5dmFsID0gMDsKKworICAgIC8qIFVzZSBWb3MgbWVzc2FnaW5nIG1lY2hhbmlzbSB0byBzZW5kIHRoZSBjb21tYW5kIHRvIGhhbFBoeSAqLworICAgIC8qCisgICAgICAgTm90ZSB0aGF0IFZPU19NT0RVTEVfSURfSEFMIGNvcnJlc3BvbmRzIHRvIFZPU19NT0RVTEVfSURfV0RBCisgICAgICAgZm9yIElOVEVHUkFURURfU09DLiBTTyB0aGlzIGNvZGUgaXMgbGVmdCBhcyBpdCBpcy4KKyAgICAqLworICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX21xX3Bvc3RfbWVzc2FnZSgKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgICAgIFZPU19NT0RVTEVfSURfSEFMLAorI2Vsc2UKKyAgICAgICAgVk9TX01PRFVMRV9JRF9XREEsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b3NfbXNnX3QgKikmZnRtTXNnKSkgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogOiBGYWlsZWQgdG8gcG9zdCBNc2cgdG8gSEFMXG4iLF9fZnVuY19fKTsKKworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgRVhJVCgpOworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5fZnRtX3Zvc19vcGVuKCkgLSBPcGVuIHRoZSB2T1NTIE1vZHVsZQorCisgIFRoZSBcYSB3bGFuX2Z0bV92b3Nfb3BlbigpIGZ1bmN0aW9uIG9wZW5zIHRoZSB2T1NTIFNjaGVkdWxlcgorICBVcG9uIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb246CisKKyAgICAgLSBBbGwgVk9TIHN1Ym1vZHVsZXMgc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZAorCisgICAgIC0gVGhlIFZPUyBzY2hlZHVsZXIgc2hvdWxkIGhhdmUgb3BlbmVkCisKKyAgICAgLSBBbGwgdGhlIFdMQU4gU1cgY29tcG9uZW50cyBzaG91bGQgaGF2ZSBiZWVuIG9wZW5lZC4gVGhpcyBpbmNsdWRlCisgICAgICAgTUFDLgorCisKKyAgXHBhcmFtICBoZGRDb250ZXh0U2l6ZTogU2l6ZSBvZiB0aGUgSEREIGNvbnRleHQgdG8gYWxsb2NhdGUuCisKKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIFNjaGVkdWxlciB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZAorICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpCisgICAgICAgICAgYXJlIHVuYXZhaWxhYmxlIHRvIGluaXRpYWxpemUgdGhlIHNjaGVkdWxlcgorCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgc2NoZWR1bGVyLworCisgIFxzYSB3bGFuX2Z0bV92b3Nfb3BlbigpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgVk9TX1NUQVRVUyB3bGFuX2Z0bV92b3Nfb3Blbiggdl9DT05URVhUX3QgcFZvc0NvbnRleHQsIHZfU0laRV90IGhkZENvbnRleHRTaXplICkKK3sKKyAgIFZPU19TVEFUVVMgdlN0YXR1cyAgICAgID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgaW50IGl0ZXIgICAgICAgICAgICAgICAgPSAwOworICAgdFNpclJldFN0YXR1cyBzaXJTdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisgICB0TWFjT3BlblBhcmFtZXRlcnMgbWFjT3BlblBhcm1zOworICAgcFZvc0NvbnRleHRUeXBlIGdwVm9zQ29udGV4dCA9IChwVm9zQ29udGV4dFR5cGUpcFZvc0NvbnRleHQ7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBPcGVuaW5nIFZPU1MiLCBfX2Z1bmNfXyk7CisKKyAgIGlmIChOVUxMID09IGdwVm9zQ29udGV4dCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICIlczogVHJ5aW5nIHRvIG9wZW4gVk9TUyB3aXRob3V0IGEgUHJlT3BlbiIsX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvYmUgZXZlbnQgKi8KKyAgIGlmICh2b3NfZXZlbnRfaW5pdCgmZ3BWb3NDb250ZXh0LT5Qcm9iZUV2ZW50KSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiJXM6IFVuYWJsZSB0byBpbml0IHByb2JlRXZlbnQiLF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIGlmKHZvc19ldmVudF9pbml0KCYoZ3BWb3NDb250ZXh0LT53ZGFDb21wbGV0ZUV2ZW50KSkgIT0gVk9TX1NUQVRVU19TVUNDRVNTICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IFVuYWJsZSB0byBpbml0IHdkYUNvbXBsZXRlRXZlbnQiLF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgCisgICAgICBnb3RvIGVycl9wcm9iZV9ldmVudDsKKyAgIH0KKyNlbmRpZiAvKkZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisgICAvKiBJbml0aWFsaXplIHRoZSBmcmVlIG1lc3NhZ2UgcXVldWUgKi8KKyAgIHZTdGF0dXMgPSB2b3NfbXFfaW5pdCgmZ3BWb3NDb250ZXh0LT5mcmVlVm9zTXEpOworICAgaWYgKCEgVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICAgeworCisgICAgICAvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBWT1MgZnJlZSBtZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgICAgZ290byBlcnJfd2RhX2NvbXBsZXRlX2V2ZW50OworI2Vsc2UKKyAgICAgIGdvdG8gZXJyX3Byb2JlX2V2ZW50OworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworICAgfQorCisgICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgVk9TX0NPUkVfTUFYX01FU1NBR0VTOyBpdGVyKyspCisgICB7CisgICAgICAoZ3BWb3NDb250ZXh0LT5hTXNnV3JhcHBlcnNbaXRlcl0pLnBWb3NNc2cgPQorICAgICAgICAgJihncFZvc0NvbnRleHQtPmFNc2dCdWZmZXJzW2l0ZXJdKTsKKyAgICAgIElOSVRfTElTVF9IRUFEKCZncFZvc0NvbnRleHQtPmFNc2dXcmFwcGVyc1tpdGVyXS5tc2dOb2RlKTsKKyAgICAgIHZvc19tcV9wdXQoJmdwVm9zQ29udGV4dC0+ZnJlZVZvc01xLCAmKGdwVm9zQ29udGV4dC0+YU1zZ1dyYXBwZXJzW2l0ZXJdKSk7CisgICB9CisKKyAgIC8qIE5vdyBPcGVuIHRoZSBWT1MgU2NoZWR1bGVyICovCisgICB2U3RhdHVzPSB2b3Nfc2NoZWRfb3BlbihncFZvc0NvbnRleHQsICZncFZvc0NvbnRleHQtPnZvc1NjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZvc1NjaGVkQ29udGV4dCkpOworCisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgIHsKKyAgICAgIC8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBvcGVuIFZPUyBTY2hlZHVsZXIiLCBfX2Z1bmNfXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgZ290byBlcnJfbXNnX3F1ZXVlOworICAgfQorCisgICAvKiBPcGVuIHRoZSBTWVMgbW9kdWxlICovCisgICB2U3RhdHVzID0gc3lzT3BlbihncFZvc0NvbnRleHQpOworCisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgIHsKKyAgICAgIC8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBvcGVuIFNZUyBtb2R1bGUiLF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICBnb3RvIGVycl9zY2hlZF9jbG9zZTsKKyAgIH0KKworICNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8qT3BlbiB0aGUgV0RBIG1vZHVsZSAqLworICAgdm9zX21lbV9zZXQoJm1hY09wZW5QYXJtcywgc2l6ZW9mKG1hY09wZW5QYXJtcyksIDApOworICAgbWFjT3BlblBhcm1zLmRyaXZlclR5cGUgPSBlRFJJVkVSX1RZUEVfTUZHOworICAgdlN0YXR1cyA9IFdEQV9vcGVuKGdwVm9zQ29udGV4dCwgZ3BWb3NDb250ZXh0LT5wSEREQ29udGV4dCwgJm1hY09wZW5QYXJtcyk7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgIHsKKyAgICAgIC8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBvcGVuIFdEQSBtb2R1bGUiLF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICBnb3RvIGVycl9zeXNfY2xvc2U7CisgICB9CisjZW5kaWYKKworICAgLyogaW5pdGlhbGl6ZSB0aGUgTlYgbW9kdWxlICovCisgICB2U3RhdHVzID0gdm9zX252X29wZW4oKTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICAgeworICAgICAvLyBOViBtb2R1bGUgY2Fubm90IGJlIGluaXRpYWxpemVkLCBob3dldmVyIHRoZSBkcml2ZXIgaXMgYWxsb3dlZAorICAgICAvLyB0byBwcm9jZWVkCisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgTlYgbW9kdWxlIiwgX19mdW5jX18pOworICAgICBnb3RvIGVycl93ZGFfY2xvc2U7CisgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAvKiBQcm9iZSB0aGUgTUMgdGhyZWFkICovCisgICBzeXNNY1RocmVhZFByb2JlKGdwVm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgJmZ0bV92b3Nfc3lzX3Byb2JlX3RocmVhZF9jYmFjaywKKyAgICAgICAgICAgICAgICAgICAgZ3BWb3NDb250ZXh0KTsKKworCisgICBpZiAodm9zX3dhaXRfc2luZ2xlX2V2ZW50KCZncFZvc0NvbnRleHQtPlByb2JlRXZlbnQsIDApIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBwcm9iZSBNQyBUaHJlYWQiLCBfX2Z1bmNfXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgZ290byBlcnJfbnZfY2xvc2U7CisgICB9CisjZW5kaWYKKyAgIC8qIElmIHdlIGFycml2ZSBoZXJlLCBib3RoIHRocmVhZHMgZGlzcGFjdGhpbmcgbWVzc2FnZXMgY29ycmVjdGx5ICovCisKKyAgIC8qIE5vdyBwcm9jZWVkIHRvIG9wZW4gdGhlIE1BQyAqLworCisgICAvKiBVTUEgaXMgc3VwcG9ydGVkIGluIGhhcmR3YXJlIGZvciBwZXJmb3JtaW5nIHRoZQorICAgICAgZnJhbWUgdHJhbnNsYXRpb24gODAyLjExIDwtPiA4MDIuMyAqLworICAgbWFjT3BlblBhcm1zLmZyYW1lVHJhbnNSZXF1aXJlZCA9IDE7CisgICBzaXJTdGF0dXMgPSBtYWNPcGVuKCYoZ3BWb3NDb250ZXh0LT5wTUFDQ29udGV4dCksIGdwVm9zQ29udGV4dC0+cEhERENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm1hY09wZW5QYXJtcyk7CisKKyAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gc2lyU3RhdHVzKQorICAgeworICAgICAvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIG9wZW4gTUFDIiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKDApOworICAgICBnb3RvIGVycl9udl9jbG9zZTsKKyAgIH0KKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIHZTdGF0dXMgPSBXTEFOQkFMX09wZW4oZ3BWb3NDb250ZXh0KTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICIlczogRmFpbGVkIHRvIG9wZW4gQkFMIixfX2Z1bmNfXyk7CisgICAgIGdvdG8gZXJyX21hY19jbG9zZTsKKyAgIH0KKyNlbHNlCisgICAvKiBOb3cgcHJvY2VlZCB0byBvcGVuIHRoZSBTTUUgKi8KKyAgIHZTdGF0dXMgPSBzbWVfT3BlbihncFZvc0NvbnRleHQtPnBNQUNDb250ZXh0KTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICAgeworICAgICAgLyogQ3JpdGljYWwgRXJyb3IgLi4uICBDYW5ub3QgcHJvY2VlZCBmdXJ0aGVyICovCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gb3BlbiBTTUUiLF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX21hY19jbG9zZTsKKyAgIH0KKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyNlbmRpZgorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICIlczogVk9TUyBzdWNjZXNzZnVsbHkgT3BlbmVkIixfX2Z1bmNfXyk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CitlcnJfbWFjX2Nsb3NlOgorICAgbWFjQ2xvc2UoZ3BWb3NDb250ZXh0LT5wTUFDQ29udGV4dCk7CisKK2Vycl9udl9jbG9zZToKKyAgIHZvc19udl9jbG9zZSgpOworCitlcnJfd2RhX2Nsb3NlOgorI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgV0RBX2Nsb3NlKGdwVm9zQ29udGV4dCk7CisKK2Vycl9zeXNfY2xvc2U6CisjZW5kaWYKKyAgIHN5c0Nsb3NlKGdwVm9zQ29udGV4dCk7CisKK2Vycl9zY2hlZF9jbG9zZToKKyAgIHZvc19zY2hlZF9jbG9zZShncFZvc0NvbnRleHQpOworZXJyX21zZ19xdWV1ZToKKyAgIHZvc19tcV9kZWluaXQoJmdwVm9zQ29udGV4dC0+ZnJlZVZvc01xKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworZXJyX3dkYV9jb21wbGV0ZV9ldmVudDoKKyAgIHZvc19ldmVudF9kZXN0cm95KCZncFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQpOworI2VuZGlmCisKK2Vycl9wcm9iZV9ldmVudDoKKyAgIHZvc19ldmVudF9kZXN0cm95KCZncFZvc0NvbnRleHQtPlByb2JlRXZlbnQpOworCisgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisKK30gLyogd2xhbl9mdG1fdm9zX29wZW4oKSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2Z0bV92b3NfY2xvc2UoKSAtIENsb3NlIHRoZSB2T1NTIE1vZHVsZQorCisgIFRoZSBcYSB3bGFuX2Z0bV92b3NfY2xvc2UoKSBmdW5jdGlvbiBjbG9zZXMgdGhlIHZPU1MgTW9kdWxlCisKKyAgXHBhcmFtIHZvc0NvbnRleHQgIGNvbnRleHQgb2Ygdm9zCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzZnVsbHkgY2xvc2VkCisKKyAgXHNhIHdsYW5fZnRtX3Zvc19jbG9zZSgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBWT1NfU1RBVFVTIHdsYW5fZnRtX3Zvc19jbG9zZSggdl9DT05URVhUX3Qgdm9zQ29udGV4dCApCit7CisgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICBwVm9zQ29udGV4dFR5cGUgZ3BWb3NDb250ZXh0ID0gKHBWb3NDb250ZXh0VHlwZSl2b3NDb250ZXh0OworCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICB2b3NTdGF0dXMgPSBXTEFOQkFMX0Nsb3NlKHZvc0NvbnRleHQpOworICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBjbG9zZSBCQUwiLF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisjZWxzZQorICB2b3NTdGF0dXMgPSBzbWVfQ2xvc2UoKChwVm9zQ29udGV4dFR5cGUpdm9zQ29udGV4dCktPnBNQUNDb250ZXh0KTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY2xvc2UgQkFMIixfX2Z1bmNfXyk7CisgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgfQorI2VuZGlmCisKKyAgdm9zU3RhdHVzID0gbWFjQ2xvc2UoICgocFZvc0NvbnRleHRUeXBlKXZvc0NvbnRleHQpLT5wTUFDQ29udGV4dCk7CisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIGNsb3NlIE1BQyIsX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKworICAoKHBWb3NDb250ZXh0VHlwZSl2b3NDb250ZXh0KS0+cE1BQ0NvbnRleHQgPSBOVUxMOworCisgIHZvc1N0YXR1cyA9IHZvc19udl9jbG9zZSgpOworICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBjbG9zZSBOViIsX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKworCisgIHZvc1N0YXR1cyA9IHN5c0Nsb3NlKCB2b3NDb250ZXh0ICk7CisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIGNsb3NlIFNZUyIsX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICB2b3NTdGF0dXMgPSBXREFfY2xvc2UoIHZvc0NvbnRleHQgKTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY2xvc2UgV0RBIixfX2Z1bmNfXyk7CisgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisgIHZvc19tcV9kZWluaXQoJigocFZvc0NvbnRleHRUeXBlKXZvc0NvbnRleHQpLT5mcmVlVm9zTXEpOworCisgIHZvc1N0YXR1cyA9IHZvc19ldmVudF9kZXN0cm95KCZncFZvc0NvbnRleHQtPlByb2JlRXZlbnQpOworICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBkZXN0cm95IFByb2JlRXZlbnQiLF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgdm9zU3RhdHVzID0gdm9zX2V2ZW50X2Rlc3Ryb3koJmdwVm9zQ29udGV4dC0+d2RhQ29tcGxldGVFdmVudCk7CisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIGRlc3Ryb3kgd2RhQ29tcGxldGVFdmVudCIsX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2Z0bV9wcml2X3NldF90eGlmcygpIC0KKworICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvcgorCisgIFxwYXJhbSAgLSBwQWRhcHRlciAtIFBvaW50ZXIgSEREIENvbnRleHQuCisgICAgICAgICAgLSBpZnMKKworICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCitzdGF0aWMgVk9TX1NUQVRVUyB3bGFuX2Z0bV9wcml2X3NldF90eGlmcyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcix2X1UzMl90IGlmcykKK3sKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKilwQWRhcHRlci0+cEhkZEN0eDsKKyAgICBpZihwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlICE9IFdMQU5fRlRNX1NUQVJURUQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIC8qIGRvIG5vdCBhbGxvdyB0byBjaGFuZ2Ugc2V0dGluZyB3aGVuIHR4IHBrdGdlbiBpcyBlbmFibGVkICovCisgICAgaWYgKGZ0bV9zdGF0dXMuZnJhbWVHZW5FbmFibGVkKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpjYW5ub3Qgc2V0IHR4aWZzIHdoZW4gcGt0Z2VuIGlzIGVuYWJsZWQuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoaWZzID4gMTAwMDAwKSAvL21heCA9IChNU0tfMjQgLyBPTkVfTUlDUk9TRUNPTkQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOmlmcyB2YWx1ZSBpcyBpbnZhbGlkICIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgZnRtX3N0YXR1cy5mcmFtZVBhcmFtcy5pbnRlckZyYW1lU3BhY2UgPSBpZnM7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgd2xhbl9mdG1fcHJpdl9zZXRfdHhwa3RjbnQoKSAtCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IKKworICBccGFyYW0gIC0gcEFkYXB0ZXIgLSBQb2ludGVyIEhERCBDb250ZXh0LgorICAgICAgICAgIC0gaWZzCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgVk9TX1NUQVRVUyB3bGFuX2Z0bV9wcml2X3NldF90eHBrdGNudChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcix2X1UzMl90IGNudCkKK3sKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKilwQWRhcHRlci0+cEhkZEN0eDsKKyAgICBpZihwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlICE9IFdMQU5fRlRNX1NUQVJURUQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIC8qIGRvIG5vdCBhbGxvdyB0byBjaGFuZ2Ugc2V0dGluZyB3aGVuIHR4IHBrdGdlbiBpcyBlbmFibGVkICovCisgICAgaWYgKGZ0bV9zdGF0dXMuZnJhbWVHZW5FbmFibGVkKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpjYW5ub3Qgc2V0IHR4cGt0Y250IHdoZW4gcGt0Z2VuIGlzIGVuYWJsZWQuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoY250ID4gUVdMQU5fUEhZREJHX1RYUEtUX0NOVF9DTlRfTUFTSykgLy8weEZGRkYKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6cGt0Y250IHZhbHVlIGlzIGludmFsaWQiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIGZ0bV9zdGF0dXMuZnJhbWVQYXJhbXMubnVtVGVzdFBhY2tldHMgPSBjbnQ7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgVk9TX1NUQVRVUyB3bGFuX2Z0bV9wcml2X3NldF90eHBrdGxlbihoZGRfYWRhcHRlcl90ICpwQWRhcHRlcix2X1UzMl90IGxlbikKK3sKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKilwQWRhcHRlci0+cEhkZEN0eDsKKyAgICBpZihwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlICE9IFdMQU5fRlRNX1NUQVJURUQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIC8qIGRvIG5vdCBhbGxvdyB0byBjaGFuZ2Ugc2V0dGluZyB3aGVuIHR4IHBrdGdlbiBpcyBlbmFibGVkICovCisgICAgaWYgKGZ0bV9zdGF0dXMuZnJhbWVHZW5FbmFibGVkKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpjYW5ub3Qgc2V0IHR4cGt0Y250IHdoZW4gcGt0Z2VuIGlzIGVuYWJsZWQuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAobGVuID4gNDA5NSkgLy80MDk2CisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOnBheWxvYWQgbGVuIGlzIGludmFsaWQiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIGZ0bV9zdGF0dXMuZnJhbWVQYXJhbXMucGF5bG9hZExlbmd0aCA9ICh0QU5JX1UxNilsZW47CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgVk9TX1NUQVRVUyB3bGFuX2Z0bV9wcml2X2VuYWJsZV9jaGFpbihoZGRfYWRhcHRlcl90ICpwQWRhcHRlcix2X1UxNl90IGNoYWluU2VsZWN0KQoreworICAgIHRQdHRNc2didWZmZXIgKnBNc2dCdWY7CisgICAgdVB0dE1zZ3MgKnBNc2dCb2R5OworICAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgIHZfVTE2X3QgY2hhaW5TZWxlY3Rfc2F2ZSA9IGNoYWluU2VsZWN0OworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXBBZGFwdGVyLT5wSGRkQ3R4OworCisgICAgaWYocEhkZEN0eC0+ZnRtLmZ0bV9zdGF0ZSAhPSBXTEFOX0ZUTV9TVEFSVEVEKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpGdG0gaGFzIG5vdCBzdGFydGVkLiBQbGVhc2Ugc3RhcnQgdGhlIGZ0bS4gIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoY2hhaW5TZWxlY3QgPiBGVE1fQ0hBSU5fU0VMX01BWCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6SW52YWxpZCBjaGFpbiIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogZG8gbm90IGFsbG93IHRvIGNoYW5nZSBzZXR0aW5nIHdoZW4gdHggcGt0Z2VuIGlzIGVuYWJsZWQgKi8KKyAgICBpZiAoZnRtX3N0YXR1cy5mcmFtZUdlbkVuYWJsZWQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOmNhbm5vdCBzZWxlY3QgY2hhaW4gd2hlbiBwa3RnZW4gaXMgZW5hYmxlZC4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIHN3aXRjaCAoY2hhaW5TZWxlY3QpCisgICAgeworICAgICAgICBjYXNlIEZUTV9DSEFJTl9TRUxfTk9fUlhfVFg6CisgICAgICAgICAgICBjaGFpblNlbGVjdCA9IFBIWV9DSEFJTl9TRUxfTk9fUlhfVFg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZUTV9DSEFJTl9TRUxfUjBfT046CisgICAgICAgICAgICBjaGFpblNlbGVjdCA9IFBIWV9DSEFJTl9TRUxfUjBfT047CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZUTV9DSEFJTl9TRUxfVDBfT046CisgICAgICAgICAgICBjaGFpblNlbGVjdCA9IFBIWV9DSEFJTl9TRUxfVDBfT047CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwTXNnQnVmID0gKHRQdHRNc2didWZmZXIgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFB0dE1zZ2J1ZmZlcikpOworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6cE1zZ0J1ZiBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgfQorICAgIGluaXRfY29tcGxldGlvbigmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3Zhcik7CisgICAgcE1zZ0J1Zi0+bXNnSWQgPSBQVFRfTVNHX0VOQUJMRV9DSEFJTlM7CisgICAgcE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCA9IHNpemVvZih0TXNnUHR0RW5hYmxlQ2hhaW5zKSArIFBUVF9IRUFERVJfTEVOR1RIOworCisgICAgcE1zZ0JvZHkgPSAmcE1zZ0J1Zi0+bXNnQm9keTsKKyAgICBwTXNnQm9keS0+RW5hYmxlQ2hhaW5zLmNoYWluU2VsZWN0ID0gY2hhaW5TZWxlY3Q7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7CisKKyAgICBpZihwTXNnQnVmLT5tc2dSZXNwb25zZSAhPSBQVFRfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOlB0dCByZXNwb25zZSBzdGF0dXMgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGZ0bV9zdGF0dXMuY2hhaW5TZWxlY3QgPSBjaGFpblNlbGVjdF9zYXZlOworZG9uZToKKyAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICogKXBNc2dCdWYpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBWT1NfU1RBVFVTIHdsYW5fZnRtX3ByaXZfZ2V0X3N0YXR1cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcixjaGFyICpidWYpCit7CisgICAgaW50IGlpOworICAgIGludCBsZW5CdWYgPSBXRV9GVE1fTUFYX1NUUl9MRU47CisgICAgaW50IGxlblJlcyA9IDA7CisgICAgY2hhciAqY2hhaW5bXSA9IHsKKyAgICAgICAgIk5vbmUiLAorICAgICAgICAiUjAsUjEiLAorICAgICAgICAiUjAiLAorICAgICAgICAiUjEiLAorICAgICAgICAiVDAiLAorICAgICAgICAiUjAsUjEsVDAiCisgICAgfTsKKyAgICBjaGFyICpyeFtdID0geworICAgICAgICAiZGlzYWJsZSIsCisgICAgICAgICIxMWIvZy9uIiwKKyAgICAgICAgIjExZy9uIiwKKyAgICAgICAgIjExYiIKKyAgICB9OworICAgIGNoYXIgKnR4W10gPSB7CisgICAgICAgICJzdG9wcGVkIiwKKyAgICAgICAgInN0YXJ0ZWQiLAorICAgIH07CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisKKyAgICBpZihwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlICE9IFdMQU5fRlRNX1NUQVJURUQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIGxlblJlcyA9IHNucHJpbnRmKGJ1ZiwgbGVuQnVmLCAiXG4gY2hhaW5TZWxlY3Q6ICVzXG4gcnhtb2RlOiAlc1xuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR4cGt0Z2VuOiAlc1xuICB0eGlmczogJWxkXG4gIHR4cmF0ZTogIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFpbltmdG1fc3RhdHVzLmNoYWluU2VsZWN0XSwgcnhbZnRtX3N0YXR1cy5yeG1vZGVdLCAKKyAgICAgICAgICAgICAgICAgICAgICB0eFtmdG1fc3RhdHVzLmZyYW1lR2VuRW5hYmxlZF0sIAorICAgICAgICAgICAgICAgICAgICAgIGZ0bV9zdGF0dXMuZnJhbWVQYXJhbXMuaW50ZXJGcmFtZVNwYWNlKTsKKyAgICBpZiAoKGxlblJlcyA8IDApIHx8IChsZW5SZXMgPj0gbGVuQnVmKSkKKyAgICB7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIGJ1ZiArPSBsZW5SZXM7CisgICAgbGVuQnVmIC09IGxlblJlczsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IFNJWkVfT0ZfVEFCTEUocmF0ZU5hbWVfcmF0ZUluZGV4X3RibCk7IGlpKyspCisgICAgeworICAgICAgICBpZiAocmF0ZU5hbWVfcmF0ZUluZGV4X3RibFtpaV0ucmF0ZV9pbmRleCA9PSBmdG1fc3RhdHVzLmZyYW1lUGFyYW1zLnJhdGUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaWkgPCBTSVpFX09GX1RBQkxFKHJhdGVOYW1lX3JhdGVJbmRleF90YmwpKQorICAgIHsKKyAgICAgICAgbGVuUmVzID0gc3RybGNweShidWYsIHJhdGVOYW1lX3JhdGVJbmRleF90YmxbaWldLnJhdGVfc3RyLCBsZW5CdWYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsZW5SZXMgPSBzdHJsY3B5KGJ1ZiwgImludmFsaWQiLCBsZW5CdWYpOworICAgIH0KKyAgICBpZiAoKGxlblJlcyA8IDApIHx8IChsZW5SZXMgPj0gbGVuQnVmKSkKKyAgICB7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIGJ1ZiArPSBsZW5SZXM7CisgICAgbGVuQnVmIC09IGxlblJlczsKKworICAgIGxlblJlcyA9IHNucHJpbnRmKGJ1ZiwgbGVuQnVmLCAiXG4gIHR4cG93ZXI6ICVkXG4gIHR4cGt0Y250OiAlbGRcbiAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHhwa3RsZW46ICVkXG4iLCBmdG1fc3RhdHVzLnR4cG93ZXIsIAorICAgICAgICAgICAgICAgICAgICAgIGZ0bV9zdGF0dXMuZnJhbWVQYXJhbXMubnVtVGVzdFBhY2tldHMsIAorICAgICAgICAgICAgICAgICAgICAgIGZ0bV9zdGF0dXMuZnJhbWVQYXJhbXMucGF5bG9hZExlbmd0aCk7CisKKyAgICBpZiAoKGxlblJlcyA8IDApIHx8IChsZW5SZXMgPj0gbGVuQnVmKSkKKyAgICB7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCit2X1ZPSURfdAorc3RhdGljIGZ0bV92b3Nfc3lzX3Byb2JlX3RocmVhZF9jYmFjaworKAorICB2X1ZPSURfdCAqcFVzZXJEYXRhCispCit7CisgICAgcFZvc0NvbnRleHRUeXBlIHBWb3NDb250ZXh0PSAocFZvc0NvbnRleHRUeXBlKXBVc2VyRGF0YTsKKyAgICBpZiAodm9zX2V2ZW50X3NldCgmcFZvc0NvbnRleHQtPlByb2JlRXZlbnQpIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IHZvc19ldmVudF9zZXQgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30gLyogdm9zX3N5c19wcm9iZV90aHJlYWRfY2JhY2soKSAqLworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCit2b2lkIEhFWERVTVAoY2hhciAqczAsIGNoYXIgKnMxLCBpbnQgbGVuKQoreworICAgIGludCB0bXA7CisgICAgcHJpbnRrKEtFUk5fRU1FUkcgIiVzXG4gOiIsIHMwKTsKKworICAgIGZvciAodG1wID0gMDsgdG1wPCBsZW47IHRtcCsrKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VNRVJHICIlMDJ4ICIsICpzMSsrKTsKKyAgICB9CisgICAgcHJpbnRrKCJcbiIpOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfZnRtX3ByZVN0YXJ0KCkgLQorCisgIFRoZSBcYSB2b3NfZnRtX3ByZVN0YXJ0KCkgZnVuY3Rpb24gdG8gZG93bmxvYWQgQ0ZHLgorICBpbmNsdWRpbmc6CisgICAgICAtIGNjbVN0YXJ0CisKKyAgICAgIC0gV0RBOiB0cmlnZ2VycyB0aGUgQ0ZHIGRvd25sb2FkCisKKworICBccGFyYW0gIHBWb3NDb250ZXh0OiBUaGUgVk9TIGNvbnRleHQKKworCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gU2NoZWR1bGVyIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kCisgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgLSBTeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkKKyAgICAgICAgICBhcmUgdW5hdmFpbGFibGUgdG8gaW5pdGlhbGl6ZSB0aGUgc2NoZWR1bGVyCisKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gRmFpbHVyZSB0byBpbml0aWFsaXplIHRoZSBzY2hlZHVsZXIvCisKKyAgXHNhIHZvc19zdGFydAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfZnRtX3ByZVN0YXJ0KCB2X0NPTlRFWFRfdCB2b3NDb250ZXh0ICkKK3sKKyAgIFZPU19TVEFUVVMgdlN0YXR1cyAgICAgICAgICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHBWb3NDb250ZXh0VHlwZSBwVm9zQ29udGV4dCA9IChwVm9zQ29udGV4dFR5cGUpdm9zQ29udGV4dDsKKyAgIAorICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAidm9zIHByZXN0YXJ0Iik7CisKKworICAgVk9TX0FTU0VSVCggTlVMTCAhPSBwVm9zQ29udGV4dC0+cFdEQUNvbnRleHQpOworCisgICAvKiBjYWxsIG1hY1ByZVN0YXJ0ICovCisgICB2U3RhdHVzID0gbWFjUHJlU3RhcnQocFZvc0NvbnRleHQtPnBNQUNDb250ZXh0KTsKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAiRmFpbGVkIGF0IG1hY1ByZVN0YXJ0ICIpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKiBjYWxsIGNjbVN0YXJ0ICovCisgICBjY21TdGFydChwVm9zQ29udGV4dC0+cE1BQ0NvbnRleHQpOworCisgICAvKiBSZXNldCB3ZGEgd2FpdCBldmVudCAqLworICAgdm9zX2V2ZW50X3Jlc2V0KCZwVm9zQ29udGV4dC0+d2RhQ29tcGxldGVFdmVudCk7ICAgCisgICAgCisKKyAgIC8qY2FsbCBXREEgcHJlIHN0YXJ0Ki8KKyAgIHZTdGF0dXMgPSBXREFfcHJlU3RhcnQocFZvc0NvbnRleHQpOworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAiRmFpbGVkIHRvIFdEQSBwcmVzdGFydCAiKTsKKyAgICAgIG1hY1N0b3AocFZvc0NvbnRleHQtPnBNQUNDb250ZXh0LCBIQUxfU1RPUF9UWVBFX1NZU19ERUVQX1NMRUVQKTsKKyAgICAgIGNjbVN0b3AocFZvc0NvbnRleHQtPnBNQUNDb250ZXh0KTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIE5lZWQgdG8gdXBkYXRlIHRpbWUgb3V0IG9mIGNvbXBsZXRlICovCisgICB2U3RhdHVzID0gdm9zX3dhaXRfc2luZ2xlX2V2ZW50KCAmcFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQsIDEwMDApOworICAgaWYgKCB2U3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUyApCisgICB7CisgICAgICBpZiAoIHZTdGF0dXMgPT0gVk9TX1NUQVRVU19FX1RJTUVPVVQgKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiJXM6IFRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIFdEQSBjb21wbGV0ZVxuIixfX2Z1bmNfXyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAiJXM6IFdEQV9wcmVTdGFydCByZXBvcnRpbmcgIG90aGVyIGVycm9yIFxuIixfX2Z1bmNfXyk7CisgICAgICB9CisgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5faGRkX2Z0bV9vcGVuKCkgLQorCisgICBUaGUgZnVuY3Rpb24gaGRkX3dsYW5fc3RhcnR1cCBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIEZUTSBzcGVjaWZpYyBtb2R1bGVzLgorCisgIFxwYXJhbSAgLSBwQWRhcHRlciAtIFBvaW50ZXIgSEREIENvbnRleHQuCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgd2xhbl9oZGRfZnRtX29wZW4oaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKyAgICBWT1NfU1RBVFVTIHZTdGF0dXMgICAgICAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgcFZvc0NvbnRleHRUeXBlIHBWb3NDb250ZXh0PSBOVUxMOworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworICAgIAorICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiJXM6IE9wZW5pbmcgVk9TUyIsIF9fZnVuY19fKTsKKworICAgIHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NZUywgTlVMTCk7CisKKyAgICBpZiAoTlVMTCA9PSBwVm9zQ29udGV4dCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBUcnlpbmcgdG8gb3BlbiBWT1NTIHdpdGhvdXQgYSBQcmVPcGVuIixfX2Z1bmNfXyk7CisgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgIGdvdG8gZXJyX3Zvc19zdGF0dXNfZmFpbHVyZTsKKyAgICB9CisKKyAgIC8vIE9wZW4gVk9TUworICAgdlN0YXR1cyA9IHdsYW5fZnRtX3Zvc19vcGVuKCBwVm9zQ29udGV4dCwgMCk7CisKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdlN0YXR1cyApKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IHZvc19vcGVuIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfdm9zX3N0YXR1c19mYWlsdXJlOworICAgfQorCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgIC8qIFN0YXJ0IFNBTCBub3cgKi8KKyAgICB2U3RhdHVzID0gV0xBTlNBTF9TdGFydChwVm9zQ29udGV4dCk7CisgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RhcnQgU0FMIixfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gZXJyX3Zvc19vcGVuX2ZhaWx1cmU7CisgICAgfQorCisgICAgICAgLyogU2F2ZSB0aGUgaGFsIGNvbnRleHQgaW4gQWRhcHRlciAqLworICAgIHBIZGRDdHgtPmhIYWwgPSAodEhhbEhhbmRsZSl2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfSEFMLCBwVm9zQ29udGV4dCApOworI2Vsc2UKKyAgICAvKgorICAgICBGb3IgSW50ZWdyYXRlZCBTT0MsIG9ubHkgbmVlZGVkIHRvIHN0YXJ0IFdEQSwgd2hpaGMgaGFwcGVucyBpbiB3bGFuX2hkZF9mdG1fc3RhcnQoKQorICAgICovCisgICAgLyogU2F2ZSB0aGUgaGFsIGNvbnRleHQgaW4gQWRhcHRlciAqLworICAgIHBIZGRDdHgtPmhIYWwgPSAodEhhbEhhbmRsZSl2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9TTUUsIHBWb3NDb250ZXh0ICk7CisjZW5kaWYKKworICAgIGlmICggTlVMTCA9PSBwSGRkQ3R4LT5oSGFsICkKKyAgICB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEhBTCBjb250ZXh0IGlzIG51bGwiLF9fZnVuY19fKTsKKyAgICAgICBnb3RvIGVycl9zYWxfY2xvc2U7CisgICAgfQorCisgICAgcEFkYXB0ZXIgPSBoZGRfb3Blbl9hZGFwdGVyKCBwSGRkQ3R4LCBXTEFOX0hERF9GVE0sICJ3bGFuJWQiLAorICAgICAgICAgICAgICAgIHdsYW5faGRkX2dldF9pbnRmX2FkZHIocEhkZEN0eCksIEZBTFNFKTsKKyAgICBpZiggTlVMTCA9PSBwQWRhcHRlciApCisgICAgeworICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBoZGRfb3Blbl9hZGFwdGVyIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICAgICAgICAgZ290byBlcnJfYWRhcHRlcl9vcGVuX2ZhaWx1cmU7CisgICAgfQorCisgICAgaWYoIHdsYW5fZnRtX3JlZ2lzdGVyX3dleHQocEFkYXB0ZXIpIT0gMCApCisgICAgeworICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVTOiBoZGRfcmVnaXN0ZXJfd2V4dCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICBnb3RvIGVycl9zYWxfY2xvc2U7CisgICAgfQorCisgICAgICAgLy9Jbml0aWFsaXplIHRoZSBubGluayBzZXJ2aWNlCisgICAgaWYobmxfc3J2X2luaXQoKSAhPSAwKQorICAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlUzogbmxfc3J2X2luaXQgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgZ290byBlcnJfZnRtX3JlZ2lzdGVyX3dleHRfY2xvc2U7CisgICAgfQorCisjaWZkZWYgUFRUX1NPQ0tfU1ZDX0VOQUJMRQorICAgIC8vSW5pdGlhbGl6ZSB0aGUgUFRUIHNlcnZpY2UKKyAgICBpZihwdHRfc29ja19hY3RpdmF0ZV9zdmMocEhkZEN0eCkgIT0gMCkKKyAgICB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IHB0dF9zb2NrX2FjdGl2YXRlX3N2YyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICBnb3RvIGVycl9ubF9zcnZfaW5pdDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfY2hpcFZvdGVPblhPQnVmZmVyKE5VTEwsIE5VTEwsIE5VTEwpKSkKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRmFpbGVkIHRvIGNvbmZpZ3VyZSAxOS4yIE1IeiBDbG9jayIsIF9fZnVuY19fKTsKKyAgICAgICAgZ290byBlcnJfbmxfc3J2X2luaXQ7CisgICAgfQorI2lmZGVmIEhERF9TRVNTSU9OSVpFCisgICAgLy9UdXJuIG9mZiBjYXJyaWVyIHN0YXRlCisgICAgbmV0aWZfY2Fycmllcl9vZmYocEFkYXB0ZXItPmRldik7CisKKyAgICAvL1N0b3AgdGhlIEludGVyZmFjZSBUWCBxdWV1ZS4gSnVzdCBiZWluZyBzYWZlCisgICAgbmV0aWZfdHhfZGlzYWJsZShwQWRhcHRlci0+ZGV2KTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICBwSGRkQ3R4LT5mdG0ucHJvY2Vzc2luZ05WVGFibGUgICAgPSBOVl9NQVhfVEFCTEU7CisgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgICAgPSAwOworICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVQb2ludGVyID0gTlVMTDsKKyAgIHBIZGRDdHgtPmZ0bS5wcm9jZXNzZWROVlRhYmxlU2l6ZSA9IDA7CisgICBwSGRkQ3R4LT5mdG0udGVtcE5WVGFibGVCdWZmZXIgICAgPSAodl9VOF90ICopdm9zX21lbV9tYWxsb2MoTUFYX05WX1RBQkxFX1NJWkUpOworICAgaWYoTlVMTCA9PSBwSGRkQ3R4LT5mdG0udGVtcE5WVGFibGVCdWZmZXIpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogTlYgVGFibGUgQnVmZmVyIEFsbG9jIEZhaWwiLF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICBnb3RvIGVycl9ubF9zcnZfaW5pdDsgCisgICB9CisgICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopcEhkZEN0eC0+ZnRtLnRlbXBOVlRhYmxlQnVmZmVyLCBNQVhfTlZfVEFCTEVfU0laRSk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKKyAgICBfZnRtX3N0YXR1c19pbml0KCk7CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZnRtIHZvcyBldmVudCAqLworICAgIGlmICh2b3NfZXZlbnRfaW5pdCgmcEhkZEN0eC0+ZnRtLmZ0bV92b3NfZXZlbnQpICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gaW5pdCBwcm9iZUV2ZW50IixfX2Z1bmNfXyk7CisgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgIHZvc19tZW1fZnJlZShwSGRkQ3R4LT5mdG0udGVtcE5WVGFibGVCdWZmZXIpOworICAgICAgICBnb3RvIGVycl9ubF9zcnZfaW5pdDsKKyAgICB9CisKKyAgICBwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlID0gV0xBTl9GVE1fSU5JVElBTElaRUQ7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworCitlcnJfbmxfc3J2X2luaXQ6CitubF9zcnZfZXhpdCgpOworCitlcnJfZnRtX3JlZ2lzdGVyX3dleHRfY2xvc2U6CitoZGRfVW5yZWdpc3RlcldleHQocEFkYXB0ZXItPmRldik7CisKK2Vycl9hZGFwdGVyX29wZW5fZmFpbHVyZToKK2hkZF9jbG9zZV9hbGxfYWRhcHRlcnMoIHBIZGRDdHggKTsKKworZXJyX3NhbF9jbG9zZToKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCitXTEFOU0FMX1N0b3AocFZvc0NvbnRleHQpOworCitlcnJfdm9zX29wZW5fZmFpbHVyZToKK3dsYW5fZnRtX3Zvc19jbG9zZShwVm9zQ29udGV4dCk7CisjZW5kaWYgCisKK2Vycl92b3Nfc3RhdHVzX2ZhaWx1cmU6CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKworCitpbnQgd2xhbl9oZGRfZnRtX2Nsb3NlKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICAgdl9DT05URVhUX3Qgdm9zQ29udGV4dCA9IHBIZGRDdHgtPnB2b3NDb250ZXh0OworCisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCxXTEFOX0hERF9GVE0pOworICAgIEVOVEVSKCk7CisgICAgaWYocEFkYXB0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6cEFkYXB0ZXIgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgIH0KKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICB2b3NTdGF0dXMgPSBXTEFOQkFMX1N1c3BlbmRDaGlwKCBwSGRkQ3R4LT5wdm9zQ29udGV4dCApOworICAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKworICAgIHZvc1N0YXR1cyA9IFdMQU5TQUxfU3RvcChwSGRkQ3R4LT5wdm9zQ29udGV4dCk7CisgICAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisgICAgLy9Bc3NlcnQgRGVlcCBzbGVlcCBzaWduYWwgbm93IHRvIHB1dCBMaWJyYSBIVyBpbiBsb3dlc3QgcG93ZXIgc3RhdGUKKyAgICB2b3NTdGF0dXMgPSB2b3NfY2hpcEFzc2VydERlZXBTbGVlcCggTlVMTCwgTlVMTCwgTlVMTCApOworICAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKworICAgIC8vVm90ZSBvZmYgYW55IFBNSUMgdm9sdGFnZSBzdXBwbGllcworICAgIHZvc19jaGlwUG93ZXJEb3duKE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgdm9zX2NoaXBWb3RlT2ZmWE9CdWZmZXIoTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICBubF9zcnZfZXhpdCgpOworCisgICAgLy9UT0RPLS0tLS0tLS0tLQorICAgIC8vRGVyZWdpc3RlciB0aGUgZGV2aWNlIHdpdGggdGhlIGtlcm5lbAorICAgIGhkZF9VbnJlZ2lzdGVyV2V4dChwQWRhcHRlci0+ZGV2KTsKKworICAgIGhkZF9jbG9zZV9hbGxfYWRhcHRlcnMoIHBIZGRDdHggKTsKKyNpZiAwCisgICAgaWYodGVzdF9iaXQoTkVUX0RFVklDRV9SRUdJU1RFUkVELCAmcEFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkgCisgICAgeworICAgICAgICB1bnJlZ2lzdGVyX25ldGRldihwQWRhcHRlci0+ZGV2KTsKKyAgICAgICAgY2xlYXJfYml0KE5FVF9ERVZJQ0VfUkVHSVNURVJFRCwgJnBBZGFwdGVyLT5ldmVudF9mbGFncyk7CisgICAgfQorI2VuZGlmCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgdm9zU3RhdHVzID0gdm9zX3NjaGVkX2Nsb3NlKCB2b3NDb250ZXh0ICk7CisgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkgICAgICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY2xvc2UgVk9TUyBTY2hlZHVsZXIiLF9fZnVuY19fKTsKKyAgICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgICAgfQorCisgICAgLy9DbG9zZSBWT1NTCisgICAgd2xhbl9mdG1fdm9zX2Nsb3NlKHZvc0NvbnRleHQpOworCisKKyAgICB2b3NTdGF0dXMgPSB2b3NfZXZlbnRfZGVzdHJveSgmcEhkZEN0eC0+ZnRtLmZ0bV92b3NfZXZlbnQpOworICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gZGVzdHJveSBmdG1fdm9zIEV2ZW50IixfX2Z1bmNfXyk7CisgICAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgdm9zX21lbV9mcmVlKHBIZGRDdHgtPmZ0bS50ZW1wTlZUYWJsZUJ1ZmZlcik7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKKyAgICAvL0ZyZWUgdXAgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbWJlcnMgaW5zaWRlIEhERCBBZGFwdGVyCisgICAga2ZyZWUocEhkZEN0eC0+Y2ZnX2luaSk7CisgICAgcEhkZEN0eC0+Y2ZnX2luaT0gTlVMTDsKKworICAgIHJldHVybiAwOworCit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2Z0bV9zZW5kX3Jlc3BvbnNlKCkgLQorCisgICBUaGUgZnVuY3Rpb24gc2VuZHMgdGhlIHJlc3BvbnNlIHRvIHRoZSBwdHQgc29ja2V0IGFwcGxpY2F0aW9uIHJ1bm5pbmcgaW4gdXNlciBzcGFjZS4KKworICBccGFyYW0gIC0gcEFkYXB0ZXIgLSBQb2ludGVyIEhERCBDb250ZXh0LgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFZPU19TVEFUVVMgd2xhbl9mdG1fc2VuZF9yZXNwb25zZShoZGRfY29udGV4dF90ICpwSGRkQ3R4KXsKKworICAgaWYoIHB0dF9zb2NrX3NlbmRfbXNnX3RvX2FwcCgmcEhkZEN0eC0+ZnRtLndubC0+d21zZywgMCwgQU5JX05MX01TR19QVU1BQywgcEhkZEN0eC0+ZnRtLndubC0+bmxoLm5sbXNnX3BpZCkgPCAwKSB7CisKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgKCJQdHQgU29ja2V0IGVycm9yIHNlbmRpbmcgbWVzc2FnZSB0byB0aGUgYXBwISFcbiIpKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgd2xhbl9oZGRfZnRtX3N0YXJ0KCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHdoZW4gdGhlIEZUTSBzdGFydCBjb21tYW5kcyByZWNlaXZlZCBmcm9tIHRoZSBwdHQgc29ja2V0IGFwcGxpY2F0aW9uIGFuZAorICAgaXQgc3RhcnRzIHRoZSBmb2xsb3dpbmcgbW9kdWxlcy4KKyAgIDEpIFNBTCBTdGFydC4KKyAgIDIpIEJBTCBTdGFydC4KKyAgIDMpIE1BQyBTdGFydCB0byBkb3dubG9hZCB0aGUgZmlybXdhcmUuCisKKworICBccGFyYW0gIC0gcEFkYXB0ZXIgLSBQb2ludGVyIEhERCBDb250ZXh0LgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCB3bGFuX2hkZF9mdG1fc3RhcnQoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCkKK3sKKyAgICBWT1NfU1RBVFVTIHZTdGF0dXMgICAgICAgICAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNpclJldFN0YXR1cyBzaXJTdGF0dXMgICAgICA9IGVTSVJfU1VDQ0VTUzsKKyAgICBwVm9zQ29udGV4dFR5cGUgcFZvc0NvbnRleHQgPSAocFZvc0NvbnRleHRUeXBlKShwSGRkQ3R4LT5wdm9zQ29udGV4dCk7CisgICAgdEhhbE1hY1N0YXJ0UGFyYW1ldGVycyBoYWxTdGFydFBhcmFtczsKKworICAgIGlmIChXTEFOX0ZUTV9TVEFSVEVEID09IHBIZGRDdHgtPmZ0bS5mdG1fc3RhdGUpCisgICAgeworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICIlczogU3RhcnRpbmcgTGlicmEgU1ciLCBfX2Z1bmNfXyk7CisKKyAgICAvKiBXZSBzdXBwb3J0IG9ubHkgb25lIGluc3RhbmNlIGZvciBub3cgLi4uKi8KKyAgICBpZiAocFZvc0NvbnRleHQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAiJXM6IG1pc21hdGNoIGluIGNvbnRleHQiLF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGdvdG8gZXJyX3N0YXR1c19mYWlsdXJlOworICAgIH0KKworICNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgaWYgKHBWb3NDb250ZXh0LT5wQkFMQ29udGV4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IEJBTCBOVUxMIGNvbnRleHQiLF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGdvdG8gZXJyX3N0YXR1c19mYWlsdXJlOworICAgIH0KKyNlbmRpZgorICAgCisgICAgaWYgKHBWb3NDb250ZXh0LT5wTUFDQ29udGV4dCA9PSBOVUxMKQorICAgIHsgICAgCisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IE1BQyBOVUxMIGNvbnRleHQiLF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGdvdG8gZXJyX3N0YXR1c19mYWlsdXJlOworICAgIH0KKworICNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgLyogU3RhcnQgQkFMICovCisgICAgdlN0YXR1cyA9IFdMQU5CQUxfU3RhcnQocFZvc0NvbnRleHQpOworCisgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RhcnQgQkFMIixfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gZXJyX3NhbF9zdG9wOworICAgIH0KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlczogQkFMIGNvcnJlY3RseSBzdGFydGVkIixfX2Z1bmNfXyk7CisjZWxzZQorICAgIC8qCisgICAgICBQcmltYSBuZWVkcyB0byBzdGFydCB0aGUgV0RBIGNvcnJlY3RseSBpbnN0ZWFkIG9mIEJBTCBhbmQgU0FMCisgICAgKi8KKworICAgIC8qIFZvcyBwcmVTdGFydCBpcyBjYWxsaW5nICovCisgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19mdG1fcHJlU3RhcnQocEhkZEN0eC0+cHZvc0NvbnRleHQpICkgKQorICAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogdm9zX3ByZVN0YXJ0IGZhaWxlZCIsX19mdW5jX18pOworICAgICAgIGdvdG8gZXJyX3N0YXR1c19mYWlsdXJlOworICAgIH0KKworCisgICAgdlN0YXR1cyA9IFdEQV9OVkRvd25sb2FkX1N0YXJ0KHBWb3NDb250ZXh0KTsKKworICAgIGlmICggdlN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MgKQorICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN0YXJ0IE5WIERvd25sb2FkIixfX2Z1bmNfXyk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIHZTdGF0dXMgPSB2b3Nfd2FpdF9zaW5nbGVfZXZlbnQoJihwVm9zQ29udGV4dC0+d2RhQ29tcGxldGVFdmVudCksIDEwMDApOworCisgICAgaWYgKCB2U3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUyApCisgICAgeworICAgICAgIGlmICggdlN0YXR1cyA9PSBWT1NfU1RBVFVTX0VfVElNRU9VVCApCisgICAgICAgeworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiJXM6IFRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIFdEQV9OVkRvd25sb2FkX1N0YXJ0IGNvbXBsZXRlXG4iLF9fZnVuY19fKTsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICIlczogV0RBX05WRG93bmxvYWRfU3RhcnQgcmVwb3J0aW5nICBvdGhlciBlcnJvciBcbiIsX19mdW5jX18pOworICAgICAgIH0KKyAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgIGdvdG8gZXJyX3dkYV9zdG9wOyAgIAorICAgIH0KKworICAgIHZTdGF0dXMgPSBXREFfc3RhcnQocFZvc0NvbnRleHQpOworICAgIGlmICh2U3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdGFydCBXREEiLF9fZnVuY19fKTsKKyAgICAgICBnb3RvIGVycl9zdGF0dXNfZmFpbHVyZTsKKyAgICB9CisjZW5kaWYKKyAgICAKKworICAgIC8qIFN0YXJ0IHRoZSBNQUMgKi8KKyAgICB2b3NfbWVtX3plcm8oKHZfUFZPSURfdCkmaGFsU3RhcnRQYXJhbXMsIHNpemVvZih0SGFsTWFjU3RhcnRQYXJhbWV0ZXJzKSk7CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgLyogQXR0ZW1wdCB0byBnZXQgdGhlIGZpcm13YXJlIGJpbmFyeSB0aHJvdWdoIFZPUy4gIFdlIG5lZWQgdG8gcGFzcyB0aGlzCisgICAgICAgICAgIHRvIHRoZSBNQUMgd2hlbiBzdGFydGluZy4gKi8KKyAgICB2U3RhdHVzID0gaGRkX3JlcXVlc3RfZmlybXdhcmUoV0xBTl9GV19GSUxFLCBwSGRkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1ZPSURfdCAqKikmaGFsU3RhcnRQYXJhbXMuRlcucEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1NJWkVfdCAqKSZoYWxTdGFydFBhcmFtcy5GVy5jYkltYWdlKTsKKworICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdlN0YXR1cyApICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGdldCBmaXJtd2FyZSBiaW5hcnkiLF9fZnVuY19fKTsKKyAgICAgICAgZ290byBlcnJfYmFsX3N0b3A7CisgICAgfQorCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzOiBGaXJtd2FyZSBiaW5hcnkgZmlsZSBmb3VuZCIsX19mdW5jX18pOworI2VuZGlmCisKKyAgICBoYWxTdGFydFBhcmFtcy5kcml2ZXJUeXBlID0gZURSSVZFUl9UWVBFX01GRzsKKworICAgIC8qIFN0YXJ0IHRoZSBNQUMgKi8KKyAgICBzaXJTdGF0dXMgPSBtYWNTdGFydChwVm9zQ29udGV4dC0+cE1BQ0NvbnRleHQsKHZfUFZPSURfdCkmaGFsU3RhcnRQYXJhbXMpOworCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgIC8qIEZyZWUgdW8gdGhlIEZXIGltYWdlIG5vIG1hdHRlciB3aGF0ICovCisgICAgaWYoIE5VTEwgIT0gaGFsU3RhcnRQYXJhbXMuRlcucEltYWdlICkKKyAgICB7CisgICAgICAgIGhkZF9yZWxlYXNlX2Zpcm13YXJlKFdMQU5fRldfRklMRSwgcFZvc0NvbnRleHQtPnBIRERDb250ZXh0KTsKKyAgICAgICAgaGFsU3RhcnRQYXJhbXMuRlcucEltYWdlID0gTlVMTDsKKyAgICAgICAgaGFsU3RhcnRQYXJhbXMuRlcuY2JJbWFnZSA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoZVNJUl9TVUNDRVNTICE9IHNpclN0YXR1cykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdGFydCBNQUMiLCBfX2Z1bmNfXyk7CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgICAgIGdvdG8gZXJyX2JhbF9zdG9wOworI2Vsc2UKKyAgICAgICAgZ290byBlcnJfd2RhX3N0b3A7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisgICAgfQorCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICIlczogTUFDIGNvcnJlY3RseSBzdGFydGVkIixfX2Z1bmNfXyk7CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisKKyAgIC8qKgorICAgRVZNIGlzc3VlIGlzIG9ic2VydmVkIHdpdGggMS42TWh6IGZyZXEgZm9yIDEuM1YgUkYgc3VwcGx5IGluIHdsYW4gc3RhbmRhbG9uZSBjYXNlLgorICAgRHVyaW5nIGNvbmN1cnJlbnQgb3BlcmF0aW9uIChlLmcuIFdMQU4gYW5kIFdDRE1BKSB0aGlzIGlzc3VlIGlzIG5vdCBvYnNlcnZlZC4gCisgICBUbyB3b3JrYXJvdW5kLCB3bGFuIHdpbGwgdm90ZSBmb3IgMy4yTWh6IGR1cmluZyBzdGFydHVwIGFuZCB3aWxsIHZvdGUgZm9yIDEuNk1oegorICAgZHVyaW5nIGV4aXQuCisgICBTaW5jZSB1c2luZyAzLjJNaHogaGFzIGEgc2lkZSBlZmZlY3Qgb24gcG93ZXIgKGV4dHJhIDIwMHVhKSwgdGhpcyBpcyBsZWZ0IGNvbmZpZ3VyYWJsZS4KKyAgIElmIGN1c3RvbWVycyBkbyB0aGVpciBkZXNpZ24gcmlnaHQsIHRoZXkgc2hvdWxkIG5vdCBzZWUgdGhlIEVWTSBpc3N1ZSBhbmQgaW4gdGhhdCBjYXNlIHRoZXkKKyAgIGNhbiBkZWNpZGUgdG8ga2VlcCAxLjZNaHogYnkgc2V0dGluZyBhbiBOVi4KKyAgIElmIE5WIGl0ZW0gaXMgbm90IHByZXNlbnQsIHVzZSB0aGUgZGVmYXVsdCAzLjJNaHoKKyAgIHZvc19zdG9wIGlzIGFsc28gaW52b2tlZCBpZiB3bGFuIHN0YXJ0dXAgc2VxIGZhaWxzIChhZnRlciB2b3Nfc3RhcnQsIHdoZXJlIDMuMk1oeiBpcyB2b3RlZC4pCisgICAqLworICB7CisgICBzRnJlcUZvcjFwM1ZTdXBwbHkgZnJlcTsKKyAgIHZTdGF0dXMgPSB2b3NfbnZfcmVhZCggTlZfVEFCTEVfRlJFUVVFTkNZX0ZPUl8xXzNWX1NVUFBMWSwgJmZyZXEsIE5VTEwsCisgICAgICAgICBzaXplb2YoZnJlcSkgKTsKKyAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdlN0YXR1cykKKyAgICBmcmVxLmZyZXFGb3IxcDNWU3VwcGx5ID0gVk9TX05WX0ZSRVFVRU5DWV9GT1JfMV8zVl9TVVBQTFlfM1AyTUg7CisKKyAgICBpZiAodm9zX2NoaXBWb3RlRnJlcUZvcjFwM1ZTdXBwbHkoTlVMTCwgTlVMTCwgTlVMTCwgZnJlcS5mcmVxRm9yMXAzVlN1cHBseSkgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc2V0IHRoZSBmcmVxICVkIGZvciAxLjNWIFN1cHBseSIsX19mdW5jX18sZnJlcS5mcmVxRm9yMXAzVlN1cHBseSApOworICB9CisKKworICAgIC8qIFNUQVJUIFNZUy4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIENGRyBkb3dubG9hZCAqLworICAgIHN5c01jU3RhcnQocFZvc0NvbnRleHQsIGZ0bV92b3Nfc3lzX3Byb2JlX3RocmVhZF9jYmFjaywgcFZvc0NvbnRleHQpOworI2VuZGlmCisKKyAgICBwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlID0gV0xBTl9GVE1fU1RBUlRFRDsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCitlcnJfYmFsX3N0b3A6CitXTEFOQkFMX1N0b3AocFZvc0NvbnRleHQpOworCitlcnJfc2FsX3N0b3A6CitXTEFOU0FMX1N0b3AocFZvc0NvbnRleHQpOworCisjZWxzZQorZXJyX3dkYV9zdG9wOiAgIAorICAgdm9zX2V2ZW50X3Jlc2V0KCYocFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQpKTsKKyAgIFdEQV9zdG9wKHBWb3NDb250ZXh0LCBIQUxfU1RPUF9UWVBFX1JGX0tJTEwpOworICAgdlN0YXR1cyA9IHZvc193YWl0X3NpbmdsZV9ldmVudCgmKHBWb3NDb250ZXh0LT53ZGFDb21wbGV0ZUV2ZW50KSwgMTAwMCk7CisgICBpZih2U3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgIHsKKyAgICAgIGlmKHZTdGF0dXMgPT0gVk9TX1NUQVRVU19FX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBUaW1lb3V0IG9jY3VycmVkIGJlZm9yZSBXREFfc3RvcCBjb21wbGV0ZVxuIixfX2Z1bmNfXyk7CisKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIiVzOiBXREFfc3RvcCByZXBvcnRpbmcgIG90aGVyIGVycm9yIFxuIixfX2Z1bmNfXyk7CisgICAgICB9CisgICAgICBWT1NfQVNTRVJUKDApOworICAgfQorI2VuZGlmCisKK2Vycl9zdGF0dXNfZmFpbHVyZToKKworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKworfQorCisKK3N0YXRpYyBpbnQgd2xhbl9mdG1fc3RvcChoZGRfY29udGV4dF90ICpwSGRkQ3R4KQoreworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisKKyAgIGlmKHBIZGRDdHgtPmZ0bS5mdG1fc3RhdGUgIT0gV0xBTl9GVE1fU1RBUlRFRCkKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLF9fZnVuY19fKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vaWYocEhkZEN0eC0+ZnRtLmNtZF9pd3ByaXYgPT0gVFJVRSkKKyAgIHsKKyAgICAgICAvKiAgU1RPUCBNQUMgb25seSAqLworICAgICAgIHZfVk9JRF90ICpoSGFsOworICAgICAgIGhIYWwgPSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfU01FLCBwSGRkQ3R4LT5wdm9zQ29udGV4dCApOworICAgICAgIGlmIChOVUxMID09IGhIYWwpCisgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICIlczogTlVMTCBoSGFsIiwgX19mdW5jX18pOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgICB2b3NTdGF0dXMgPSBtYWNTdG9wKGhIYWwsIEhBTF9TVE9QX1RZUEVfU1lTX0RFRVBfU0xFRVAgKTsKKyAgICAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RvcCBTWVMiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgICAgdm9zU3RhdHVzID0gV0xBTkJBTF9TdG9wKCBwSGRkQ3R4LT5wdm9zQ29udGV4dCApOworICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN0b3AgQkFMIixfX2Z1bmNfXyk7CisgICAgICAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgICAgICB9CisKKyAgICAgICAvKioKKyAgICAgICBFVk0gaXNzdWUgaXMgb2JzZXJ2ZWQgd2l0aCAxLjZNaHogZnJlcSBmb3IgMS4zViBzdXBwbHkgaW4gd2xhbiBzdGFuZGFsb25lIGNhc2UuCisgICAgICAgRHVyaW5nIGNvbmN1cnJlbnQgb3BlcmF0aW9uIChlLmcuIFdMQU4gYW5kIFdDRE1BKSB0aGlzIGlzc3VlIGlzIG5vdCBvYnNlcnZlZC4gCisgICAgICAgVG8gd29ya2Fyb3VuZCwgd2xhbiB3aWxsIHZvdGUgZm9yIDMuMk1oeiBkdXJpbmcgc3RhcnR1cCBhbmQgd2lsbCB2b3RlIGZvciAxLjZNaHoKKyAgICAgICBkdXJpbmcgZXhpdC4KKyAgICAgICB2b3Nfc3RvcCBpcyBhbHNvIGludm9rZWQgaWYgd2xhbiBzdGFydHVwIHNlcSBmYWlscyAoYWZ0ZXIgdm9zX3N0YXJ0LCB3aGVyZSAzLjJNaHogaXMgdm90ZWQuKQorICAgICAgICovCisgICAgICAgaWYgKHZvc19jaGlwVm90ZUZyZXFGb3IxcDNWU3VwcGx5KE5VTEwsIE5VTEwsIE5VTEwsIFZPU19OVl9GUkVRVUVOQ1lfRk9SXzFfM1ZfU1VQUExZXzFQNk1IKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHNldCB0aGUgZnJlcSB0byAxLjZNaHogZm9yIDEuM1YgU3VwcGx5IixfX2Z1bmNfXyApOworCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICAgICBXREFfc3RvcChwSGRkQ3R4LT5wdm9zQ29udGV4dCwgSEFMX1NUT1BfVFlQRV9SRl9LSUxMKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworICAgIH0KKyAgIHJldHVybiBXTEFOX0ZUTV9TVUNDRVNTOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgd2xhbl9oZGRfZnRtX2dldF9udl90YWJsZSgpIC0KKyAgICAgICAgICAgIEdldCBTcGVjaWZpYyBOViB0YWJsZQorCisgIFxwYXJhbSAgLSBmdG1DbWQgLSBQb2ludGVyIEZUTSBDb21tYWQgQnVmZmVyCisKKyAgXHJldHVybiAtIGludAorICAgICAgICAgICAgLTEsIFByb2Nlc3MgSG9zdCBjb21tYW5kIGZhaWwsIHZhaWwgb3V0CisgICAgICAgICAgICAgMSwgUHJvY2VzcyBIb3N0IGNvbW1hbmQgc3VjY2VzcworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCB3bGFuX2hkZF9mdG1fZ2V0X252X3RhYmxlCisoCisgICBoZGRfY29udGV4dF90ICAqcEhkZEN0eCwKKyAgIHRQdHRNc2didWZmZXIgICpmdG1DbWQKKykKK3sKKyAgIFZPU19TVEFUVVMgICAgICAgICAgbnZTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICBwdHRHZXROdlRhYmxlICAgICAgKm52VGFibGUgPSAocHR0R2V0TnZUYWJsZSAqKSZmdG1DbWQtPm1zZ0JvZHkuR2V0TnZUYWJsZTsKKyAgIHZfU0laRV90ICAgICAgICAgICAgbnZTaXplOworICAgc0hhbE52ICAgICAgICAgICAgICpudkNvbnRlbnRzID0gTlVMTDsKKworICAgaWYgKE5VTEwgPT0gcEhkZEN0eCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiTm90IHZhbGlkIGRyaXZlciBjb250ZXh0Iik7CisgICAgICByZXR1cm4gLTE7CisgICB9CisKKyAgIC8qIFRlc3QgZmlyc3QgY2h1bmsgb2YgTlYgdGFibGUgKi8KKyAgIGlmICgoTlZfTUFYX1RBQkxFID09IHBIZGRDdHgtPmZ0bS5wcm9jZXNzaW5nTlZUYWJsZSkgfHwKKyAgICAgICgwID09IHBIZGRDdHgtPmZ0bS5wcm9jZXNzZWROVlRhYmxlU2l6ZSkpCisgICB7CisgICAgICBudlN0YXR1cyA9IHZvc19udl9nZXROVkJ1ZmZlcigodm9pZCAqKikmbnZDb250ZW50cywgJm52U2l6ZSk7CisgICAgICBpZiAoKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBudlN0YXR1cykgfHwgKE5VTEwgPT0gbnZDb250ZW50cykpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAiRmFpbCB0byBnZXQgY2FjaGVkIE5WIHZhbHVlIFN0YXR1cyAlZCIsIG52U3RhdHVzKTsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChudlRhYmxlLT5udlRhYmxlKQorICAgICAgeworICAgICAgICAgY2FzZSBOVl9UQUJMRV9SQVRFX1BPV0VSX1NFVFRJTkdTOgorICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wd3JPcHRpbXVtKTsKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlUG9pbnRlciA9ICh2X1U4X3QgKikmbnZDb250ZW50cy0+dGFibGVzLnB3ck9wdGltdW07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBOVl9UQUJMRV9SRUdVTEFUT1JZX0RPTUFJTlM6CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnJlZ0RvbWFpbnMpOworICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVQb2ludGVyID0gKHZfVThfdCAqKSZudkNvbnRlbnRzLT50YWJsZXMucmVnRG9tYWluczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIE5WX1RBQkxFX0RFRkFVTFRfQ09VTlRSWToKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMuZGVmYXVsdENvdW50cnlUYWJsZSk7CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVBvaW50ZXIgPSAodl9VOF90ICopJm52Q29udGVudHMtPnRhYmxlcy5kZWZhdWx0Q291bnRyeVRhYmxlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgTlZfVEFCTEVfVFBDX1BPV0VSX1RBQkxFOgorICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wbHV0Q2hhcmFjdGVyaXplZCk7CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVBvaW50ZXIgPSAodl9VOF90ICopJm52Q29udGVudHMtPnRhYmxlcy5wbHV0Q2hhcmFjdGVyaXplZFswXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIE5WX1RBQkxFX1RQQ19QREFEQ19PRkZTRVRTOgorICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wbHV0UGRhZGNPZmZzZXQpOworICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVQb2ludGVyID0gKHZfVThfdCAqKSZudkNvbnRlbnRzLT50YWJsZXMucGx1dFBkYWRjT2Zmc2V0WzBdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgTlZfVEFCTEVfVklSVFVBTF9SQVRFOgorICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wd3JPcHRpbXVtX3ZpcnR1YWxSYXRlKTsKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlUG9pbnRlciA9ICh2X1U4X3QgKikmbnZDb250ZW50cy0+dGFibGVzLnB3ck9wdGltdW1fdmlydHVhbFJhdGVbMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBOVl9UQUJMRV9SU1NJX0NIQU5ORUxfT0ZGU0VUUzoKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMucnNzaUNoYW5PZmZzZXRzKTsKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlUG9pbnRlciA9ICh2X1U4X3QgKikmbnZDb250ZW50cy0+dGFibGVzLnJzc2lDaGFuT2Zmc2V0c1swXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIE5WX1RBQkxFX1JGX0NBTF9WQUxVRVM6CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnJGQ2FsVmFsdWVzKTsKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlUG9pbnRlciA9ICh2X1U4X3QgKikmbnZDb250ZW50cy0+dGFibGVzLnJGQ2FsVmFsdWVzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgTlZfVEFCTEVfQU5URU5OQV9QQVRIX0xPU1M6CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLmFudGVubmFQYXRoTG9zcyk7CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVBvaW50ZXIgPSAodl9VOF90ICopJm52Q29udGVudHMtPnRhYmxlcy5hbnRlbm5hUGF0aExvc3NbMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBOVl9UQUJMRV9QQUNLRVRfVFlQRV9QT1dFUl9MSU1JVFM6CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnBrdFR5cGVQd3JMaW1pdHMpOworICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVQb2ludGVyID0gKHZfVThfdCAqKSZudkNvbnRlbnRzLT50YWJsZXMucGt0VHlwZVB3ckxpbWl0c1swXVswXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBWYWxpZCBOViBUYWJsZSAlZCIsIG52VGFibGUtPm52VGFibGUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgIT0gbnZUYWJsZS0+dGFibGVTaXplKQorICAgICAgeworICAgICAgICAgLyogSW52YWxpZCB0YWJsZSBzaXplLCBkaXNjYXJkIGFuZCBpbml0aWFsaXplIGRhdGEgKi8KKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFRhYmxlIFNpemUgJWQiLCBudlRhYmxlLT50YWJsZVNpemUpOworICAgICAgICAgcEhkZEN0eC0+ZnRtLnByb2Nlc3NpbmdOVlRhYmxlICAgID0gTlZfTUFYX1RBQkxFOworICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplICAgID0gMDsKKyAgICAgICAgIHBIZGRDdHgtPmZ0bS5wcm9jZXNzZWROVlRhYmxlU2l6ZSA9IDA7CisgICAgICAgICB2b3NfbWVtX3plcm8ocEhkZEN0eC0+ZnRtLnRlbXBOVlRhYmxlQnVmZmVyLCBNQVhfTlZfVEFCTEVfU0laRSk7CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIC8qIFNldCBDdXJyZW50IFByb2Nlc3NpbmcgTlYgdGFibGUgdHlwZSAqLworICAgICAgcEhkZEN0eC0+ZnRtLnByb2Nlc3NpbmdOVlRhYmxlID0gbnZUYWJsZS0+bnZUYWJsZTsKKyAgICAgIC8qIENvcHkgdGFyZ2V0IE5WIHRhYmxlIHZhbHVlIGludG8gdGVtcCBjb250ZXh0IGJ1ZmZlciAqLworICAgICAgdm9zX21lbV9jb3B5KHBIZGRDdHgtPmZ0bS50ZW1wTlZUYWJsZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplKTsKKworICAgfQorCisgICBpZiAocEhkZEN0eC0+ZnRtLnByb2Nlc3NpbmdOVlRhYmxlICE9IG52VGFibGUtPm52VGFibGUpCisgICB7CisgICAgICAvKiBJbnZhbGlkIHRhYmxlIHR5cGUgKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICJJbnZhbGlkIE5WIFRhYmxlLCBub3cgUHJvY2Vzc2luZyAlZCwgbm90ICVkIiwKKyAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS5wcm9jZXNzaW5nTlZUYWJsZSwgbnZUYWJsZS0+bnZUYWJsZSk7CisgICAgICBwSGRkQ3R4LT5mdG0ucHJvY2Vzc2luZ05WVGFibGUgICAgPSBOVl9NQVhfVEFCTEU7CisgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgICAgPSAwOworICAgICAgcEhkZEN0eC0+ZnRtLnByb2Nlc3NlZE5WVGFibGVTaXplID0gMDsKKyAgICAgIHZvc19tZW1femVybyhwSGRkQ3R4LT5mdG0udGVtcE5WVGFibGVCdWZmZXIsIE1BWF9OVl9UQUJMRV9TSVpFKTsKKyAKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgLyogQ29weSBuZXh0IGNodW5rIG9mIE5WIHRhYmxlIHZhbHVlIGludG8gcmVzcG9uc2UgYnVmZmVyICovCisgICB2b3NfbWVtX2NvcHkoJm52VGFibGUtPnRhYmxlRGF0YSwgCisgICAgICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRlbXBOVlRhYmxlQnVmZmVyICsgcEhkZEN0eC0+ZnRtLnByb2Nlc3NlZE5WVGFibGVTaXplLAorICAgICAgICAgICAgICAgIG52VGFibGUtPmNodW5rU2l6ZSk7CisgICAvKiBVcGRhdGUgcHJvY2Vzc2VkIHBvaW50ZXIgdG8gcHJlcGFyZSBuZXh0IGNodW5rIGNvcHkgKi8KKyAgIHBIZGRDdHgtPmZ0bS5wcm9jZXNzZWROVlRhYmxlU2l6ZSArPSBudlRhYmxlLT5jaHVua1NpemU7CisKKyAgIGlmIChwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgPT0gcEhkZEN0eC0+ZnRtLnByb2Nlc3NlZE5WVGFibGVTaXplKQorICAgeworICAgICAgLyogRmluaXNoZWQgdG8gcHJvY2VzcyBsYXN0IGNodW5rIG9mIGRhdGEsIGluaXRpYWxpemUgYnVmZmVyICovCisgICAgICBwSGRkQ3R4LT5mdG0ucHJvY2Vzc2luZ05WVGFibGUgICAgPSBOVl9NQVhfVEFCTEU7CisgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgICAgPSAwOworICAgICAgcEhkZEN0eC0+ZnRtLnByb2Nlc3NlZE5WVGFibGVTaXplID0gMDsKKyAgICAgIHZvc19tZW1femVybyhwSGRkQ3R4LT5mdG0udGVtcE5WVGFibGVCdWZmZXIsIE1BWF9OVl9UQUJMRV9TSVpFKTsKKyAgIH0KKworICAgcmV0dXJuIDE7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2hkZF9mdG1fc2V0X252X3RhYmxlKCkgLQorICAgICAgICAgICAgU2V0IFNwZWNpZmljIE5WIHRhYmxlIGFzIGdpdmVuCisKKyAgXHBhcmFtICAtIGZ0bUNtZCAtIFBvaW50ZXIgRlRNIENvbW1hZCBCdWZmZXIKKworICBccmV0dXJuIC0gaW50CisgICAgICAgICAgICAtMSwgUHJvY2VzcyBIb3N0IGNvbW1hbmQgZmFpbCwgdmFpbCBvdXQKKyAgICAgICAgICAgICAxLCBQcm9jZXNzIEhvc3QgY29tbWFuZCBzdWNjZXNzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHdsYW5faGRkX2Z0bV9zZXRfbnZfdGFibGUKKygKKyAgIGhkZF9jb250ZXh0X3QgICpwSGRkQ3R4LAorICAgdFB0dE1zZ2J1ZmZlciAgKmZ0bUNtZAorKQoreworICAgVk9TX1NUQVRVUyAgICAgICAgICBudlN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHB0dFNldE52VGFibGUgICAgICAqbnZUYWJsZSA9IChwdHRTZXROdlRhYmxlICopJmZ0bUNtZC0+bXNnQm9keS5TZXROdlRhYmxlOworICAgdl9TSVpFX3QgICAgICAgICAgICBudlNpemU7CisgICBzSGFsTnYgICAgICAgICAgICAgKm52Q29udGVudHMgPSBOVUxMOworCisgICBpZiAoTlVMTCA9PSBwSGRkQ3R4KQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJOb3QgdmFsaWQgZHJpdmVyIGNvbnRleHQiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgLyogVGVzdCBmaXJzdCBjaHVuayBvZiBOViB0YWJsZSAqLworICAgaWYgKChOVl9NQVhfVEFCTEUgPT0gcEhkZEN0eC0+ZnRtLnByb2Nlc3NpbmdOVlRhYmxlKSB8fAorICAgICAgICgwID09IHBIZGRDdHgtPmZ0bS5wcm9jZXNzZWROVlRhYmxlU2l6ZSkpCisgICB7CisgICAgICBudlN0YXR1cyA9IHZvc19udl9nZXROVkJ1ZmZlcigodm9pZCAqKikmbnZDb250ZW50cywgJm52U2l6ZSk7CisgICAgICBpZiAoKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBudlN0YXR1cykgfHwgKE5VTEwgPT0gbnZDb250ZW50cykpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAiRmFpbCB0byBnZXQgY2FjaGVkIE5WIHZhbHVlIFN0YXR1cyAlZCIsIG52U3RhdHVzKTsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChudlRhYmxlLT5udlRhYmxlKQorICAgICAgeworICAgICAgICAgY2FzZSBOVl9UQUJMRV9SQVRFX1BPV0VSX1NFVFRJTkdTOgorICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplICAgID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wd3JPcHRpbXVtKTsKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlUG9pbnRlciA9ICh2X1U4X3QgKikmbnZDb250ZW50cy0+dGFibGVzLnB3ck9wdGltdW07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBOVl9UQUJMRV9SRUdVTEFUT1JZX0RPTUFJTlM6CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgICAgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnJlZ0RvbWFpbnMpOworICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVQb2ludGVyID0gKHZfVThfdCAqKSZudkNvbnRlbnRzLT50YWJsZXMucmVnRG9tYWluczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIE5WX1RBQkxFX0RFRkFVTFRfQ09VTlRSWToKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlU2l6ZSAgICA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMuZGVmYXVsdENvdW50cnlUYWJsZSk7CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVBvaW50ZXIgPSAodl9VOF90ICopJm52Q29udGVudHMtPnRhYmxlcy5kZWZhdWx0Q291bnRyeVRhYmxlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgTlZfVEFCTEVfVFBDX1BPV0VSX1RBQkxFOgorICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplICAgID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wbHV0Q2hhcmFjdGVyaXplZCk7CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVBvaW50ZXIgPSAodl9VOF90ICopJm52Q29udGVudHMtPnRhYmxlcy5wbHV0Q2hhcmFjdGVyaXplZFswXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIE5WX1RBQkxFX1RQQ19QREFEQ19PRkZTRVRTOgorICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplICAgID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wbHV0UGRhZGNPZmZzZXQpOworICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVQb2ludGVyID0gKHZfVThfdCAqKSZudkNvbnRlbnRzLT50YWJsZXMucGx1dFBkYWRjT2Zmc2V0WzBdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgTlZfVEFCTEVfVklSVFVBTF9SQVRFOgorICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wd3JPcHRpbXVtX3ZpcnR1YWxSYXRlKTsKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlUG9pbnRlciA9ICh2X1U4X3QgKikmbnZDb250ZW50cy0+dGFibGVzLnB3ck9wdGltdW1fdmlydHVhbFJhdGVbMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBOVl9UQUJMRV9SU1NJX0NIQU5ORUxfT0ZGU0VUUzoKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlU2l6ZSAgICA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMucnNzaUNoYW5PZmZzZXRzKTsKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlUG9pbnRlciA9ICh2X1U4X3QgKikmbnZDb250ZW50cy0+dGFibGVzLnJzc2lDaGFuT2Zmc2V0c1swXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIE5WX1RBQkxFX1JGX0NBTF9WQUxVRVM6CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgICAgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnJGQ2FsVmFsdWVzKTsKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlUG9pbnRlciA9ICh2X1U4X3QgKikmbnZDb250ZW50cy0+dGFibGVzLnJGQ2FsVmFsdWVzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgTlZfVEFCTEVfQU5URU5OQV9QQVRIX0xPU1M6CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgICAgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLmFudGVubmFQYXRoTG9zcyk7CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVBvaW50ZXIgPSAodl9VOF90ICopJm52Q29udGVudHMtPnRhYmxlcy5hbnRlbm5hUGF0aExvc3NbMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBOVl9UQUJMRV9QQUNLRVRfVFlQRV9QT1dFUl9MSU1JVFM6CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgICAgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnBrdFR5cGVQd3JMaW1pdHMpOworICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVQb2ludGVyID0gKHZfVThfdCAqKSZudkNvbnRlbnRzLT50YWJsZXMucGt0VHlwZVB3ckxpbWl0c1swXVswXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBWYWxpZCBOViBUYWJsZSAlZCIsIG52VGFibGUtPm52VGFibGUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIFNldCBDdXJyZW50IFByb2Nlc3NpbmcgTlYgdGFibGUgdHlwZSAqLworICAgICAgcEhkZEN0eC0+ZnRtLnByb2Nlc3NpbmdOVlRhYmxlID0gbnZUYWJsZS0+bnZUYWJsZTsKKyAgICAgIGlmIChwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgIT0gbnZUYWJsZS0+dGFibGVTaXplKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgVGFibGUgU2l6ZSAlZCIsIG52VGFibGUtPnRhYmxlU2l6ZSk7CisgICAgICAgICBwSGRkQ3R4LT5mdG0ucHJvY2Vzc2luZ05WVGFibGUgICAgPSBOVl9NQVhfVEFCTEU7CisgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUgICAgPSAwOworICAgICAgICAgcEhkZEN0eC0+ZnRtLnByb2Nlc3NlZE5WVGFibGVTaXplID0gMDsKKyAgICAgICAgIHZvc19tZW1femVybyhwSGRkQ3R4LT5mdG0udGVtcE5WVGFibGVCdWZmZXIsIE1BWF9OVl9UQUJMRV9TSVpFKTsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHBIZGRDdHgtPmZ0bS5wcm9jZXNzaW5nTlZUYWJsZSAhPSBudlRhYmxlLT5udlRhYmxlKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgTlYgVGFibGUsIG5vdyBQcm9jZXNzaW5nICVkLCBub3QgJWQiLAorICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnByb2Nlc3NpbmdOVlRhYmxlLCBudlRhYmxlLT5udlRhYmxlKTsKKyAgICAgIHBIZGRDdHgtPmZ0bS5wcm9jZXNzaW5nTlZUYWJsZSAgICA9IE5WX01BWF9UQUJMRTsKKyAgICAgIHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlU2l6ZSAgICA9IDA7CisgICAgICBwSGRkQ3R4LT5mdG0ucHJvY2Vzc2VkTlZUYWJsZVNpemUgPSAwOworICAgICAgdm9zX21lbV96ZXJvKHBIZGRDdHgtPmZ0bS50ZW1wTlZUYWJsZUJ1ZmZlciwgTUFYX05WX1RBQkxFX1NJWkUpOworICAgICAgcmV0dXJuIC0xOworICAgfQorICAgdm9zX21lbV9jb3B5KHBIZGRDdHgtPmZ0bS50ZW1wTlZUYWJsZUJ1ZmZlciArIHBIZGRDdHgtPmZ0bS5wcm9jZXNzZWROVlRhYmxlU2l6ZSwKKyAgICAgICAgICAgICAgICAmbnZUYWJsZS0+dGFibGVEYXRhLCAKKyAgICAgICAgICAgICAgICBudlRhYmxlLT5jaHVua1NpemUpOworCisgICBwSGRkQ3R4LT5mdG0ucHJvY2Vzc2VkTlZUYWJsZVNpemUgKz0gbnZUYWJsZS0+Y2h1bmtTaXplOworICAgaWYgKHBIZGRDdHgtPmZ0bS50YXJnZXROVlRhYmxlU2l6ZSA9PSBwSGRkQ3R4LT5mdG0ucHJvY2Vzc2VkTlZUYWJsZVNpemUpCisgICB7CisgICAgICB2b3NfbWVtX2NvcHkocEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVQb2ludGVyLAorICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS50ZW1wTlZUYWJsZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBwSGRkQ3R4LT5mdG0udGFyZ2V0TlZUYWJsZVNpemUpOworICAgICAgcEhkZEN0eC0+ZnRtLnByb2Nlc3NpbmdOVlRhYmxlICAgID0gTlZfTUFYX1RBQkxFOworICAgICAgcEhkZEN0eC0+ZnRtLnRhcmdldE5WVGFibGVTaXplICAgID0gMDsKKyAgICAgIHBIZGRDdHgtPmZ0bS5wcm9jZXNzZWROVlRhYmxlU2l6ZSA9IDA7CisgICAgICB2b3NfbWVtX3plcm8ocEhkZEN0eC0+ZnRtLnRlbXBOVlRhYmxlQnVmZmVyLCBNQVhfTlZfVEFCTEVfU0laRSk7CisgICB9CisKKyAgIHJldHVybiAxOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgd2xhbl9oZGRfZnRtX2JsYW5rX252KCkgLQorICAgICAgICAgICAgU2V0IGFsbCBOViB0YWJsZSB2YWx1ZSBhcyBkZWZhdWx0CisKKyAgXHBhcmFtICAtIGZ0bUNtZCAtIFBvaW50ZXIgRlRNIENvbW1hZCBCdWZmZXIKKworICBccmV0dXJuIC0gaW50CisgICAgICAgICAgICAtMSwgUHJvY2VzcyBIb3N0IGNvbW1hbmQgZmFpbCwgdmFpbCBvdXQKKyAgICAgICAgICAgICAwLCBQcm9jZXNzIEhvc3QgY29tbWFuZCBzdWNjZXNzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHdsYW5faGRkX2Z0bV9ibGFua19udl90YWJsZQorKAorICAgdFB0dE1zZ2J1ZmZlciAgKmZ0bUNtZAorKQoreworICAgVk9TX1NUQVRVUyAgICAgIG52U3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdl9TSVpFX3QgICAgICAgICAgICBudlNpemU7CisgICB2X1NJWkVfdCAgICAgICAgICAgIGl0ZW1TaXplOworICAgc0hhbE52ICAgICAgICAgICAgICpudkNvbnRlbnRzID0gTlVMTDsKKworICAgbnZTdGF0dXMgPSB2b3NfbnZfZ2V0TlZCdWZmZXIoKHZvaWQgKiopJm52Q29udGVudHMsICZudlNpemUpOworICAgaWYoKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBudlN0YXR1cykgfHwgKE5VTEwgPT0gbnZDb250ZW50cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICJGYWlsIHRvIGdldCBjYWNoZWQgTlYgdmFsdWUgU3RhdHVzICVkIiwgbnZTdGF0dXMpOworICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICBpdGVtU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMucHdyT3B0aW11bSk7CisgICBtZW1jcHkoJm52Q29udGVudHMtPnRhYmxlcy5wd3JPcHRpbXVtLAorICAgICAgICAgICZudkRlZmF1bHRzLnRhYmxlcy5wd3JPcHRpbXVtLAorICAgICAgICAgIGl0ZW1TaXplKTsKKworICAgaXRlbVNpemUgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnJlZ0RvbWFpbnMpOworICAgbWVtY3B5KCZudkNvbnRlbnRzLT50YWJsZXMucmVnRG9tYWlucywKKyAgICAgICAgICAmbnZEZWZhdWx0cy50YWJsZXMucmVnRG9tYWlucywKKyAgICAgICAgICBpdGVtU2l6ZSk7CisKKyAgIGl0ZW1TaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5kZWZhdWx0Q291bnRyeVRhYmxlKTsKKyAgIG1lbWNweSgmbnZDb250ZW50cy0+dGFibGVzLmRlZmF1bHRDb3VudHJ5VGFibGUsCisgICAgICAgICAgJm52RGVmYXVsdHMudGFibGVzLmRlZmF1bHRDb3VudHJ5VGFibGUsCisgICAgICAgICAgaXRlbVNpemUpOworCisgICBpdGVtU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMucGx1dENoYXJhY3Rlcml6ZWQpOworICAgbWVtY3B5KCZudkNvbnRlbnRzLT50YWJsZXMucGx1dENoYXJhY3Rlcml6ZWRbMF0sCisgICAgICAgICAgJm52RGVmYXVsdHMudGFibGVzLnBsdXRDaGFyYWN0ZXJpemVkWzBdLAorICAgICAgICAgIGl0ZW1TaXplKTsKKworICAgaXRlbVNpemUgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnBsdXRQZGFkY09mZnNldCk7CisgICBtZW1jcHkoJm52Q29udGVudHMtPnRhYmxlcy5wbHV0UGRhZGNPZmZzZXRbMF0sCisgICAgICAgICAgJm52RGVmYXVsdHMudGFibGVzLnBsdXRQZGFkY09mZnNldFswXSwKKyAgICAgICAgICBpdGVtU2l6ZSk7CisKKyAgIGl0ZW1TaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wd3JPcHRpbXVtX3ZpcnR1YWxSYXRlKTsKKyAgIG1lbWNweSgmbnZDb250ZW50cy0+dGFibGVzLnB3ck9wdGltdW1fdmlydHVhbFJhdGVbMF0sCisgICAgICAgICAgJm52RGVmYXVsdHMudGFibGVzLnB3ck9wdGltdW1fdmlydHVhbFJhdGVbMF0sCisgICAgICAgICAgaXRlbVNpemUpOworCisgICBpdGVtU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMucnNzaUNoYW5PZmZzZXRzKTsKKyAgIG1lbWNweSgmbnZDb250ZW50cy0+dGFibGVzLnJzc2lDaGFuT2Zmc2V0c1swXSwKKyAgICAgICAgICAmbnZEZWZhdWx0cy50YWJsZXMucnNzaUNoYW5PZmZzZXRzWzBdLAorICAgICAgICAgIGl0ZW1TaXplKTsKKworICAgaXRlbVNpemUgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnJGQ2FsVmFsdWVzKTsKKyAgIG1lbWNweSgmbnZDb250ZW50cy0+dGFibGVzLnJGQ2FsVmFsdWVzLAorICAgICAgICAgICZudkRlZmF1bHRzLnRhYmxlcy5yRkNhbFZhbHVlcywKKyAgICAgICAgICBpdGVtU2l6ZSk7CisKKyAgIGl0ZW1TaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5hbnRlbm5hUGF0aExvc3MpOworICAgbWVtY3B5KCZudkNvbnRlbnRzLT50YWJsZXMuYW50ZW5uYVBhdGhMb3NzWzBdLAorICAgICAgICAgICZudkRlZmF1bHRzLnRhYmxlcy5hbnRlbm5hUGF0aExvc3NbMF0sCisgICAgICAgICAgaXRlbVNpemUpOworCisgICBpdGVtU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMucGt0VHlwZVB3ckxpbWl0cyk7CisgICBtZW1jcHkoJm52Q29udGVudHMtPnRhYmxlcy5wa3RUeXBlUHdyTGltaXRzWzBdWzBdLAorICAgICAgICAgICZudkRlZmF1bHRzLnRhYmxlcy5wa3RUeXBlUHdyTGltaXRzWzBdWzBdLAorICAgICAgICAgIGl0ZW1TaXplKTsKKworICAgcmV0dXJuIDE7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2hkZF9mdG1fZGVsZXRlX252X3RhYmxlKCkgLQorICAgICAgICAgICAgRGVsZXRlIFNwZWNpZmljIE5WIHRhYmxlCisKKyAgXHBhcmFtICAtIGZ0bUNtZCAtIFBvaW50ZXIgRlRNIENvbW1hZCBCdWZmZXIKKworICBccmV0dXJuIC0gaW50CisgICAgICAgICAgICAtMSwgUHJvY2VzcyBIb3N0IGNvbW1hbmQgZmFpbCwgdmFpbCBvdXQKKyAgICAgICAgICAgICAxLCBQcm9jZXNzIEhvc3QgY29tbWFuZCBzdWNjZXNzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHdsYW5faGRkX2Z0bV9kZWxldGVfbnZfdGFibGUKKygKKyAgIHRQdHRNc2didWZmZXIgICpmdG1DbWQKKykKK3sKKyAgIFZPU19TVEFUVVMgICAgICBudlN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHRNc2dQdHREZWxOdlRhYmxlICAqbnZUYWJsZSA9ICh0TXNnUHR0RGVsTnZUYWJsZSAqKSZmdG1DbWQtPm1zZ0JvZHkuRGVsTnZUYWJsZTsKKyAgIHZfU0laRV90ICAgICAgICAgICAgbnZTaXplOworICAgdl9TSVpFX3QgICAgICAgICAgICBpdGVtU2l6ZTsKKyAgIHNIYWxOdiAgICAgICAgICAgICAqbnZDb250ZW50cyA9IE5VTEw7CisKKyAgIG52U3RhdHVzID0gdm9zX252X2dldE5WQnVmZmVyKCh2b2lkICoqKSZudkNvbnRlbnRzLCAmbnZTaXplKTsKKyAgIGlmICgoVk9TX1NUQVRVU19TVUNDRVNTICE9IG52U3RhdHVzKSB8fCAoTlVMTCA9PSBudkNvbnRlbnRzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIkZhaWwgdG8gZ2V0IGNhY2hlZCBOViB2YWx1ZSBTdGF0dXMgJWQiLCBudlN0YXR1cyk7CisgICAgICByZXR1cm4gLTE7CisgICB9CisKKyAgIHN3aXRjaCAobnZUYWJsZS0+bnZUYWJsZSkKKyAgIHsKKyAgICAgIGNhc2UgTlZfVEFCTEVfUkFURV9QT1dFUl9TRVRUSU5HUzoKKyAgICAgICAgIGl0ZW1TaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wd3JPcHRpbXVtKTsKKyAgICAgICAgIG1lbWNweSgmbnZDb250ZW50cy0+dGFibGVzLnB3ck9wdGltdW0sCisgICAgICAgICAgICAgICAgJm52RGVmYXVsdHMudGFibGVzLnB3ck9wdGltdW0sCisgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfVEFCTEVfUkVHVUxBVE9SWV9ET01BSU5TOgorICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnJlZ0RvbWFpbnMpOworICAgICAgICAgbWVtY3B5KCZudkNvbnRlbnRzLT50YWJsZXMucmVnRG9tYWlucywKKyAgICAgICAgICAgICAgICAmbnZEZWZhdWx0cy50YWJsZXMucmVnRG9tYWlucywKKyAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOVl9UQUJMRV9ERUZBVUxUX0NPVU5UUlk6CisgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMuZGVmYXVsdENvdW50cnlUYWJsZSk7CisgICAgICAgICBtZW1jcHkoJm52Q29udGVudHMtPnRhYmxlcy5kZWZhdWx0Q291bnRyeVRhYmxlLAorICAgICAgICAgICAgICAgICZudkRlZmF1bHRzLnRhYmxlcy5kZWZhdWx0Q291bnRyeVRhYmxlLAorICAgICAgICAgICAgICAgIGl0ZW1TaXplKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX1RBQkxFX1RQQ19QT1dFUl9UQUJMRToKKyAgICAgICAgIGl0ZW1TaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wbHV0Q2hhcmFjdGVyaXplZCk7CisgICAgICAgICBtZW1jcHkoJm52Q29udGVudHMtPnRhYmxlcy5wbHV0Q2hhcmFjdGVyaXplZFswXSwKKyAgICAgICAgICAgICAgICAmbnZEZWZhdWx0cy50YWJsZXMucGx1dENoYXJhY3Rlcml6ZWRbMF0sCisgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfVEFCTEVfVFBDX1BEQURDX09GRlNFVFM6CisgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMucGx1dFBkYWRjT2Zmc2V0KTsKKyAgICAgICAgIG1lbWNweSgmbnZDb250ZW50cy0+dGFibGVzLnBsdXRQZGFkY09mZnNldFswXSwKKyAgICAgICAgICAgICAgICAmbnZEZWZhdWx0cy50YWJsZXMucGx1dFBkYWRjT2Zmc2V0WzBdLAorICAgICAgICAgICAgICAgIGl0ZW1TaXplKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX1RBQkxFX1ZJUlRVQUxfUkFURToKKyAgICAgICAgIGl0ZW1TaXplID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wd3JPcHRpbXVtX3ZpcnR1YWxSYXRlKTsKKyAgICAgICAgIG1lbWNweSgmbnZDb250ZW50cy0+dGFibGVzLnB3ck9wdGltdW1fdmlydHVhbFJhdGVbMF0sCisgICAgICAgICAgICAgICAgJm52RGVmYXVsdHMudGFibGVzLnB3ck9wdGltdW1fdmlydHVhbFJhdGVbMF0sCisgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfVEFCTEVfUlNTSV9DSEFOTkVMX09GRlNFVFM6CisgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMucnNzaUNoYW5PZmZzZXRzKTsKKyAgICAgICAgIG1lbWNweSgmbnZDb250ZW50cy0+dGFibGVzLnJzc2lDaGFuT2Zmc2V0c1swXSwKKyAgICAgICAgICAgICAgICAmbnZEZWZhdWx0cy50YWJsZXMucnNzaUNoYW5PZmZzZXRzWzBdLAorICAgICAgICAgICAgICAgIGl0ZW1TaXplKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX1RBQkxFX1JGX0NBTF9WQUxVRVM6CisgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMuckZDYWxWYWx1ZXMpOworICAgICAgICAgbWVtY3B5KCZudkNvbnRlbnRzLT50YWJsZXMuckZDYWxWYWx1ZXMsCisgICAgICAgICAgICAgICAgJm52RGVmYXVsdHMudGFibGVzLnJGQ2FsVmFsdWVzLAorICAgICAgICAgICAgICAgIGl0ZW1TaXplKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX1RBQkxFX0FOVEVOTkFfUEFUSF9MT1NTOgorICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLmFudGVubmFQYXRoTG9zcyk7CisgICAgICAgICBtZW1jcHkoJm52Q29udGVudHMtPnRhYmxlcy5hbnRlbm5hUGF0aExvc3NbMF0sCisgICAgICAgICAgICAgICAgJm52RGVmYXVsdHMudGFibGVzLmFudGVubmFQYXRoTG9zc1swXSwKKyAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOVl9UQUJMRV9QQUNLRVRfVFlQRV9QT1dFUl9MSU1JVFM6CisgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMucGt0VHlwZVB3ckxpbWl0cyk7CisgICAgICAgICBtZW1jcHkoJm52Q29udGVudHMtPnRhYmxlcy5wa3RUeXBlUHdyTGltaXRzWzBdWzBdLAorICAgICAgICAgICAgICAgICZudkRlZmF1bHRzLnRhYmxlcy5wa3RUeXBlUHdyTGltaXRzWzBdWzBdLAorICAgICAgICAgICAgICAgIGl0ZW1TaXplKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIk5vdCBWYWxpZCBOViBUYWJsZSAlZCIsIG52VGFibGUtPm52VGFibGUpOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiAxOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgd2xhbl9oZGRfZnRtX2dldF9udl9maWVsZCgpIC0KKyAgICAgICAgICAgIEdldCBTcGVjaWZpYyBOViBmaWVsZAorCisgIFxwYXJhbSAgLSBmdG1DbWQgLSBQb2ludGVyIEZUTSBDb21tYWQgQnVmZmVyCisKKyAgXHJldHVybiAtIGludAorICAgICAgICAgICAgLTEsIFByb2Nlc3MgSG9zdCBjb21tYW5kIGZhaWwsIHZhaWwgb3V0CisgICAgICAgICAgICAgMSwgUHJvY2VzcyBIb3N0IGNvbW1hbmQgc3VjY2VzcworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCB3bGFuX2hkZF9mdG1fZ2V0X252X2ZpZWxkCisoCisgICB0UHR0TXNnYnVmZmVyICAqZnRtQ21kCispCit7CisgICBzTnZGaWVsZHMgICAgICAgICAgIG52RmllbGREYXRhQnVmZmVyOworICAgdE1zZ1B0dEdldE52RmllbGQgICpudkZpZWxkID0gKHRNc2dQdHRHZXROdkZpZWxkICopJmZ0bUNtZC0+bXNnQm9keS5HZXROdkZpZWxkOworICAgVk9TX1NUQVRVUyAgICAgICAgICBudlN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHNIYWxOdiAgICAgICAgICAgICAqbnZDb250ZW50cyA9IE5VTEw7CisgICB2X1NJWkVfdCAgICAgICAgICAgIG52U2l6ZTsKKworICAgbnZTdGF0dXMgPSB2b3NfbnZfZ2V0TlZCdWZmZXIoKHZvaWQgKiopJm52Q29udGVudHMsICZudlNpemUpOworICAgaWYgKChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gbnZTdGF0dXMpIHx8IChOVUxMID09IG52Q29udGVudHMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiRmFpbCB0byBnZXQgY2FjaGVkIE5WIHZhbHVlIFN0YXR1cyAlZCIsIG52U3RhdHVzKTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKyAgIG1lbWNweSgmbnZGaWVsZERhdGFCdWZmZXIsICZudkNvbnRlbnRzLT5maWVsZHMsIHNpemVvZihzTnZGaWVsZHMpKTsKKworICAgc3dpdGNoIChudkZpZWxkLT5udkZpZWxkKQorICAgeworICAgICAgY2FzZSBOVl9DT01NT05fUFJPRFVDVF9JRDoKKyAgICAgICAgIG1lbWNweSgodm9pZCAqKSZudkZpZWxkLT5maWVsZERhdGEsCisgICAgICAgICAgICAgJm52RmllbGREYXRhQnVmZmVyLnByb2R1Y3RJZCwKKyAgICAgICAgICAgICBzaXplb2YobnZGaWVsZERhdGFCdWZmZXIucHJvZHVjdElkKSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOVl9DT01NT05fUFJPRFVDVF9CQU5EUzoKKyAgICAgICAgIG1lbWNweSgodm9pZCAqKSZudkZpZWxkLT5maWVsZERhdGEsCisgICAgICAgICAgICAgJm52RmllbGREYXRhQnVmZmVyLnByb2R1Y3RCYW5kcywKKyAgICAgICAgICAgICBzaXplb2YobnZGaWVsZERhdGFCdWZmZXIucHJvZHVjdEJhbmRzKSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOVl9DT01NT05fTlVNX09GX1RYX0NIQUlOUzoKKyAgICAgICAgIG1lbWNweSgodm9pZCAqKSZudkZpZWxkLT5maWVsZERhdGEsCisgICAgICAgICAgICAgJm52RmllbGREYXRhQnVmZmVyLm51bU9mVHhDaGFpbnMsCisgICAgICAgICAgICAgc2l6ZW9mKG52RmllbGREYXRhQnVmZmVyLm51bU9mVHhDaGFpbnMpKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX0NPTU1PTl9OVU1fT0ZfUlhfQ0hBSU5TOgorICAgICAgICAgbWVtY3B5KCh2b2lkICopJm52RmllbGQtPmZpZWxkRGF0YSwKKyAgICAgICAgICAgICAmbnZGaWVsZERhdGFCdWZmZXIubnVtT2ZSeENoYWlucywKKyAgICAgICAgICAgICBzaXplb2YobnZGaWVsZERhdGFCdWZmZXIubnVtT2ZSeENoYWlucykpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfQ09NTU9OX01BQ19BRERSOgorICAgICAgICAgbWVtY3B5KCh2b2lkICopJm52RmllbGQtPmZpZWxkRGF0YSwKKyAgICAgICAgICAgICAmbnZGaWVsZERhdGFCdWZmZXIubWFjQWRkclswXSwKKyAgICAgICAgICAgICBOVl9GSUVMRF9NQUNfQUREUl9TSVpFKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX0NPTU1PTl9NRkdfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgIG1lbWNweSgodm9pZCAqKSZudkZpZWxkLT5maWVsZERhdGEsCisgICAgICAgICAgICAgJm52RmllbGREYXRhQnVmZmVyLm1mZ1NOWzBdLAorICAgICAgICAgICAgIE5WX0ZJRUxEX01GR19TTl9TSVpFKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX0NPTU1PTl9DT1VQTEVSX1RZUEU6CisgICAgICAgICBtZW1jcHkoKHZvaWQgKikmbnZGaWVsZC0+ZmllbGREYXRhLAorICAgICAgICAgICAgICAgICZudkZpZWxkRGF0YUJ1ZmZlci5jb3VwbGVyVHlwZSwKKyAgICAgICAgICAgICAgICBzaXplb2YobnZGaWVsZERhdGFCdWZmZXIuY291cGxlclR5cGUpKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIk5vdCBWYWxpZCBOViBmaWVsZCAlZCIsIG52RmllbGQtPm52RmllbGQpOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiAxOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgd2xhbl9oZGRfZnRtX3NldF9udl9maWVsZCgpIC0KKyAgICAgICAgICAgIFNldCBTcGVjaWZpYyBOViBmaWVsZAorCisgIFxwYXJhbSAgLSBmdG1DbWQgLSBQb2ludGVyIEZUTSBDb21tYWQgQnVmZmVyCisKKyAgXHJldHVybiAtIGludAorICAgICAgICAgICAgLTEsIFByb2Nlc3MgSG9zdCBjb21tYW5kIGZhaWwsIHZhaWwgb3V0CisgICAgICAgICAgICAgMSwgUHJvY2VzcyBIb3N0IGNvbW1hbmQgc3VjY2VzcworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCB3bGFuX2hkZF9mdG1fc2V0X252X2ZpZWxkCisoCisgICB0UHR0TXNnYnVmZmVyICAqZnRtQ21kCispCit7CisgICB0TXNnUHR0U2V0TnZGaWVsZCAqbnZGaWVsZCA9ICh0TXNnUHR0U2V0TnZGaWVsZCAqKSZmdG1DbWQtPm1zZ0JvZHkuU2V0TnZGaWVsZDsKKyAgIFZPU19TVEFUVVMgICAgICAgICBudlN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZfU0laRV90ICAgICAgICAgICBudlNpemU7CisgICBzSGFsTnYgICAgICAgICAgICAqbnZDb250ZW50cyA9IE5VTEw7CisgICB2X1U4X3QgICAgICAgICAgICAgbWFjTG9vcDsKKyAgIHZfVThfdCAgICAgICAgICAgICpwTlZNYWM7CisgICB2X1U4X3QgICAgICAgICAgICAgbGFzdEJ5dGVNQUM7CisKKyAgIG52U3RhdHVzID0gdm9zX252X2dldE5WQnVmZmVyKCh2b2lkICoqKSZudkNvbnRlbnRzLCAmbnZTaXplKTsKKyAgIGlmKChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gbnZTdGF0dXMpIHx8IChOVUxMID09IG52Q29udGVudHMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiRmFpbCB0byBnZXQgY2FjaGVkIE5WIHZhbHVlIFN0YXR1cyAlZCIsIG52U3RhdHVzKTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgc3dpdGNoIChudkZpZWxkLT5udkZpZWxkKQorICAgeworICAgICAgY2FzZSBOVl9DT01NT05fUFJPRFVDVF9JRDoKKyAgICAgICAgIG1lbWNweSgmbnZDb250ZW50cy0+ZmllbGRzLnByb2R1Y3RJZCwKKyAgICAgICAgICAgICAgICAmbnZGaWVsZC0+ZmllbGREYXRhLAorICAgICAgICAgICAgICAgIHNpemVvZihudkNvbnRlbnRzLT5maWVsZHMucHJvZHVjdElkKSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOVl9DT01NT05fUFJPRFVDVF9CQU5EUzoKKyAgICAgICAgIG1lbWNweSgmbnZDb250ZW50cy0+ZmllbGRzLnByb2R1Y3RCYW5kcywKKyAgICAgICAgICAgICAgICAmbnZGaWVsZC0+ZmllbGREYXRhLAorICAgICAgICAgICAgICAgIHNpemVvZihudkNvbnRlbnRzLT5maWVsZHMucHJvZHVjdEJhbmRzKSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOVl9DT01NT05fTlVNX09GX1RYX0NIQUlOUzoKKyAgICAgICAgIG1lbWNweSgmbnZDb250ZW50cy0+ZmllbGRzLm51bU9mVHhDaGFpbnMsCisgICAgICAgICAgICAgICAgJm52RmllbGQtPmZpZWxkRGF0YSwKKyAgICAgICAgICAgICAgICBzaXplb2YobnZDb250ZW50cy0+ZmllbGRzLm51bU9mVHhDaGFpbnMpKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX0NPTU1PTl9OVU1fT0ZfUlhfQ0hBSU5TOgorICAgICAgICAgbWVtY3B5KCZudkNvbnRlbnRzLT5maWVsZHMubnVtT2ZSeENoYWlucywKKyAgICAgICAgICAgICAgICAmbnZGaWVsZC0+ZmllbGREYXRhLAorICAgICAgICAgICAgICAgIHNpemVvZihudkNvbnRlbnRzLT5maWVsZHMubnVtT2ZSeENoYWlucykpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfQ09NTU9OX01BQ19BRERSOgorICAgICAgICAgLyogSWYgTGFzdCBieXRlIGlzIGxhcmdlciB0aGFuIDI1MiAoMHhGQyksIHJldHVybiBFcnJvciwKKyAgICAgICAgICAqIFNpbmNlIDNNQUNzIHNob3VsZCBiZSBkZXJpdmVkIGZyb20gZmlyc3QgTUFDICovCisgICAgICAgICBpZihRV0xBTl9NQVhfTUFDX0xBU1RfQllURV9WQUxVRSA8CisgICAgICAgICAgICBudkZpZWxkLT5maWVsZERhdGEubWFjQWRkcltWT1NfTUFDX0FERFJFU1NfTEVOIC0gMV0pCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiTGFzdCBCeXRlIG9mIHRoZSBzZWVkIE1BQyBpcyB0b28gbGFyZ2UgMHgleCIsCisgICAgICAgICAgICAgICAgICAgICAgICBudkZpZWxkLT5maWVsZERhdGEubWFjQWRkcltWT1NfTUFDX0FERFJFU1NfTEVOIC0gMV0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorCisgICAgICAgICBwTlZNYWMgPSAodl9VOF90ICopbnZDb250ZW50cy0+ZmllbGRzLm1hY0FkZHI7CisgICAgICAgICBsYXN0Qnl0ZU1BQyA9IG52RmllbGQtPmZpZWxkRGF0YS5tYWNBZGRyW1ZPU19NQUNfQUREUkVTU19MRU4gLSAxXTsKKyAgICAgICAgIGZvcihtYWNMb29wID0gMDsgbWFjTG9vcCA8IFZPU19NQVhfQ09OQ1VSUkVOQ1lfUEVSU09OQTsgbWFjTG9vcCsrKQorICAgICAgICAgeworICAgICAgICAgICAgbnZGaWVsZC0+ZmllbGREYXRhLm1hY0FkZHJbVk9TX01BQ19BRERSRVNTX0xFTiAtIDFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEJ5dGVNQUMgKyBtYWNMb29wOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBOVk1hYyArIChtYWNMb29wICogTlZfRklFTERfTUFDX0FERFJfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJm52RmllbGQtPmZpZWxkRGF0YS5tYWNBZGRyWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5WX0ZJRUxEX01BQ19BRERSX1NJWkUpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfQ09NTU9OX01GR19TRVJJQUxfTlVNQkVSOgorICAgICAgICAgbWVtY3B5KCZudkNvbnRlbnRzLT5maWVsZHMubWZnU05bMF0sCisgICAgICAgICAgICAgICAgJm52RmllbGQtPmZpZWxkRGF0YSwKKyAgICAgICAgICAgICBOVl9GSUVMRF9NRkdfU05fU0laRSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOVl9DT01NT05fQ09VUExFUl9UWVBFOgorICAgICAgICAgbWVtY3B5KCZudkNvbnRlbnRzLT5maWVsZHMuY291cGxlclR5cGUsCisgICAgICAgICAgICAgICAgJm52RmllbGQtPmZpZWxkRGF0YSwKKyAgICAgICAgICAgICAgICBzaXplb2YobnZDb250ZW50cy0+ZmllbGRzLmNvdXBsZXJUeXBlKSk7CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJOb3QgVmFsaWQgTlYgZmllbGQgJWQiLCBudkZpZWxkLT5udkZpZWxkKTsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gMTsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5faGRkX2Z0bV9zdG9yZV9udl90YWJsZSgpIC0KKyAgICAgICAgICAgIFN0b3JlIENhY2hlZCBOViBpbmZvcm1hdGlvbiBpbnRvIEZsYXNoIE1lbW9yeSwgZmlsZQorCisgIFxwYXJhbSAgLSBmdG1DbWQgLSBQb2ludGVyIEZUTSBDb21tYWQgQnVmZmVyCisKKyAgXHJldHVybiAtIGludAorICAgICAgICAgICAgLTEsIFByb2Nlc3MgSG9zdCBjb21tYW5kIGZhaWwsIHZhaWwgb3V0CisgICAgICAgICAgICAgMCwgUHJvY2VzcyBIb3N0IGNvbW1hbmQgc3VjY2VzcworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCB3bGFuX2hkZF9mdG1fc3RvcmVfbnZfdGFibGUKKygKKyAgIHRQdHRNc2didWZmZXIgICpmdG1DbWQKKykKK3sKKyAgIFZPU19TVEFUVVMgICAgICAgICAgIG52U3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdl9TSVpFX3QgICAgICAgICAgICAgbnZTaXplOworICAgc0hhbE52ICAgICAgICAgICAgICAqbnZDb250ZW50cyA9IE5VTEw7CisgICB0TXNnUHR0U3RvcmVOdlRhYmxlICpudlRhYmxlID0gKHRNc2dQdHRTdG9yZU52VGFibGUgKikmZnRtQ21kLT5tc2dCb2R5LlN0b3JlTnZUYWJsZTsKKyAgIHZvaWQgICAgICAgICAgICAgICAgKnRhYmxlUHRyID0gTlVMTDsKKyAgIHVuc2lnbmVkIGludCAgICAgICAgIHRhYmxlU2l6ZSA9IDA7CisgICBWTlZfVFlQRSAgICAgICAgICAgICB0YWJsZVZOVlR5cGUgPSBWTlZfRklFTERfSU1BR0U7CisKKyAgIG52U3RhdHVzID0gdm9zX252X2dldE5WQnVmZmVyKCh2b2lkICoqKSZudkNvbnRlbnRzLCAmbnZTaXplKTsKKyAgIGlmKChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gbnZTdGF0dXMpIHx8IChOVUxMID09IG52Q29udGVudHMpKQorICAgeworICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICAvKiBTZXQgUGxhdGZvcm0gdHlwZSBhcyBQUklNQSAqLworICAgbnZDb250ZW50cy0+ZmllbGRzLndsYW5OdlJldklkID0gMjsKKworICAgc3dpdGNoKG52VGFibGUtPm52VGFibGUpCisgICB7CisgICAgICBjYXNlIE5WX0ZJRUxEU19JTUFHRToKKyAgICAgICAgIHRhYmxlUHRyICAgICA9ICh2b2lkICopJm52Q29udGVudHMtPmZpZWxkczsKKyAgICAgICAgIHRhYmxlU2l6ZSAgICA9IHNpemVvZihudkNvbnRlbnRzLT5maWVsZHMpOworICAgICAgICAgdGFibGVWTlZUeXBlID0gVk5WX0ZJRUxEX0lNQUdFOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfVEFCTEVfUkFURV9QT1dFUl9TRVRUSU5HUzoKKyAgICAgICAgIHRhYmxlUHRyICAgICA9ICh2b2lkICopJm52Q29udGVudHMtPnRhYmxlcy5wd3JPcHRpbXVtWzBdOworICAgICAgICAgdGFibGVTaXplICAgID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wd3JPcHRpbXVtKTsKKyAgICAgICAgIHRhYmxlVk5WVHlwZSA9IFZOVl9SQVRFX1RPX1BPV0VSX1RBQkxFOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfVEFCTEVfUkVHVUxBVE9SWV9ET01BSU5TOgorICAgICAgICAgdGFibGVQdHIgICAgID0gKHZvaWQgKikmbnZDb250ZW50cy0+dGFibGVzLnJlZ0RvbWFpbnNbMF07CisgICAgICAgICB0YWJsZVNpemUgICAgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnJlZ0RvbWFpbnMpOworICAgICAgICAgdGFibGVWTlZUeXBlID0gVk5WX1JFR1VMQVJUT1JZX0RPTUFJTl9UQUJMRTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX1RBQkxFX0RFRkFVTFRfQ09VTlRSWToKKyAgICAgICAgIHRhYmxlUHRyICAgICA9ICh2b2lkICopJm52Q29udGVudHMtPnRhYmxlcy5kZWZhdWx0Q291bnRyeVRhYmxlOworICAgICAgICAgdGFibGVTaXplICAgID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5kZWZhdWx0Q291bnRyeVRhYmxlKTsKKyAgICAgICAgIHRhYmxlVk5WVHlwZSA9IFZOVl9ERUZBVUxUX0xPQ0FUSU9OOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfVEFCTEVfVFBDX1BPV0VSX1RBQkxFOgorICAgICAgICAgdGFibGVQdHIgICAgID0gKHZvaWQgKikmbnZDb250ZW50cy0+dGFibGVzLnBsdXRDaGFyYWN0ZXJpemVkWzBdOworICAgICAgICAgdGFibGVTaXplICAgID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wbHV0Q2hhcmFjdGVyaXplZCk7CisgICAgICAgICB0YWJsZVZOVlR5cGUgPSBWTlZfVFBDX1BPV0VSX1RBQkxFOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfVEFCTEVfVFBDX1BEQURDX09GRlNFVFM6CisgICAgICAgICB0YWJsZVB0ciAgICAgPSAodm9pZCAqKSZudkNvbnRlbnRzLT50YWJsZXMucGx1dFBkYWRjT2Zmc2V0WzBdOworICAgICAgICAgdGFibGVTaXplICAgID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5wbHV0UGRhZGNPZmZzZXQpOworICAgICAgICAgdGFibGVWTlZUeXBlID0gVk5WX1RQQ19QREFEQ19PRkZTRVRTOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfVEFCTEVfVklSVFVBTF9SQVRFOgorICAgICAgICAgdGFibGVQdHIgICAgID0gKHZvaWQgKikmbnZDb250ZW50cy0+dGFibGVzLnB3ck9wdGltdW1fdmlydHVhbFJhdGVbMF07CisgICAgICAgICB0YWJsZVNpemUgICAgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnB3ck9wdGltdW1fdmlydHVhbFJhdGUpOworICAgICAgICAgdGFibGVWTlZUeXBlID0gVk5WX1RBQkxFX1ZJUlRVQUxfUkFURTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX1RBQkxFX1JTU0lfQ0hBTk5FTF9PRkZTRVRTOgorICAgICAgICAgdGFibGVQdHIgICAgID0gKHZvaWQgKikmbnZDb250ZW50cy0+dGFibGVzLnJzc2lDaGFuT2Zmc2V0c1swXTsKKyAgICAgICAgIHRhYmxlU2l6ZSAgICA9IHNpemVvZihudkNvbnRlbnRzLT50YWJsZXMucnNzaUNoYW5PZmZzZXRzKTsKKyAgICAgICAgIHRhYmxlVk5WVHlwZSA9IFZOVl9SU1NJX0NIQU5ORUxfT0ZGU0VUUzsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5WX1RBQkxFX1JGX0NBTF9WQUxVRVM6CisgICAgICAgICB0YWJsZVB0ciAgICAgPSAodm9pZCAqKSZudkNvbnRlbnRzLT50YWJsZXMuckZDYWxWYWx1ZXM7CisgICAgICAgICB0YWJsZVNpemUgICAgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnJGQ2FsVmFsdWVzKTsKKyAgICAgICAgIHRhYmxlVk5WVHlwZSA9IFZOVl9SRl9DQUxfVkFMVUVTOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfVEFCTEVfQU5URU5OQV9QQVRIX0xPU1M6CisgICAgICAgICB0YWJsZVB0ciAgICAgPSAodm9pZCAqKSZudkNvbnRlbnRzLT50YWJsZXMuYW50ZW5uYVBhdGhMb3NzWzBdOworICAgICAgICAgdGFibGVTaXplICAgID0gc2l6ZW9mKG52Q29udGVudHMtPnRhYmxlcy5hbnRlbm5hUGF0aExvc3MpOworICAgICAgICAgdGFibGVWTlZUeXBlID0gVk5WX0FOVEVOTkFfUEFUSF9MT1NTOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTlZfVEFCTEVfUEFDS0VUX1RZUEVfUE9XRVJfTElNSVRTOgorICAgICAgICAgdGFibGVQdHIgICAgID0gKHZvaWQgKikmbnZDb250ZW50cy0+dGFibGVzLnBrdFR5cGVQd3JMaW1pdHNbMF1bMF07CisgICAgICAgICB0YWJsZVNpemUgICAgPSBzaXplb2YobnZDb250ZW50cy0+dGFibGVzLnBrdFR5cGVQd3JMaW1pdHMpOworICAgICAgICAgdGFibGVWTlZUeXBlID0gVk5WX1BBQ0tFVF9UWVBFX1BPV0VSX0xJTUlUUzsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIk5vdCBTdXBwb3J0ZWQgVGFibGUgVHlwZSAlZCIsIG52VGFibGUtPm52VGFibGUpOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgYnJlYWs7CisgICAgICAgICAKKyAgIH0KKworICAgbnZTdGF0dXMgPSB2b3NfbnZfd3JpdGUodGFibGVWTlZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVNpemUpOworICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IG52U3RhdHVzKQorICAgeworICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICByZXR1cm4gMTsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5faGRkX2Z0bV90ZW1wX2dldF9yZWxfbnVtKCkgLQorICAgICAgICAgICAgR2V0IGludGVybmFsIHJlbGVhc2UgbnVtYmVyCisKKyAgXHBhcmFtICAtIGZ0bUNtZCAtIFBvaW50ZXIgRlRNIENvbW1hZCBCdWZmZXIKKworICBccmV0dXJuIC0gaW50CisgICAgICAgICAgICAtMSwgUHJvY2VzcyBIb3N0IGNvbW1hbmQgZmFpbCwgdmFpbCBvdXQKKyAgICAgICAgICAgICAwLCBQcm9jZXNzIEhvc3QgY29tbWFuZCBzdWNjZXNzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHdsYW5faGRkX2Z0bV90ZW1wX2dldF9yZWxfbnVtCisoCisgICB0UHR0TXNnYnVmZmVyICAqZnRtQ21kCispCit7CisgICB0TXNnUHR0R2V0QnVpbGRSZWxlYXNlTnVtYmVyICpyZWxOdW0gPSAodE1zZ1B0dEdldEJ1aWxkUmVsZWFzZU51bWJlciAqKSZmdG1DbWQtPm1zZ0JvZHkuR2V0QnVpbGRSZWxlYXNlTnVtYmVyOworCisgICByZWxOdW0tPnJlbFBhcmFtcy5kcnZNanIgPSBRV0xBTl9WRVJTSU9OX01BSk9SOworICAgcmVsTnVtLT5yZWxQYXJhbXMuZHJ2TW5yID0gUVdMQU5fVkVSU0lPTl9NSU5PUjsKKyAgIHJlbE51bS0+cmVsUGFyYW1zLmRydlB0Y2ggPSBRV0xBTl9WRVJTSU9OX1BBVENIOworICAgcmVsTnVtLT5yZWxQYXJhbXMuZHJ2QmxkID0gUVdMQU5fVkVSU0lPTl9CVUlMRDsKKyAgIHJlbE51bS0+cmVsUGFyYW1zLnB0dE1heCA9IDEwOworICAgcmVsTnVtLT5yZWxQYXJhbXMucHR0TWluID0gMTsKKworICAgcmV0dXJuIDE7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2hkZF9wcm9jZXNzX2Z0bV9ob3N0X2NtZCgpIC0KKyAgICAgICAgICAgIHByb2Nlc3MgYW55IGNvbW1hbmQgc2hvdWxkIGJlIGhhbmRsZWQgd2l0aGluIGhvc3QuCisgICAgICAgICAgICBkZWNpZGUgYW55IGNvbW1hbmQgc2hvdWxkIGJlIHNlbmQgdG8gSEFMIG9yIG5vdAorCisgIFxwYXJhbSAgLSBmdG1DbWQgLSBQb2ludGVyIEZUTSBDb21tYWQgQnVmZmVyCisKKyAgXHJldHVybiAtIGludAorICAgICAgICAgICAgLTEsIFByb2Nlc3MgSG9zdCBjb21tYW5kIGZhaWwsIHZhaWwgb3V0CisgICAgICAgICAgICAgMCwgUHJvY2VzcyBIb3N0IGNvbW1hbmQgc3VjY2Vzcywgbm90IG5lZWQgdG8gc2VuZCBDTUQgdG8gSEFMCisgICAgICAgICAgICAgMSwgUHJvY2VzcyBIb3N0IGNvbW1hbmQgc3VjY2VzcywgbmVlZCB0byBzZW5kIENNRCB0byBIQUwKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgd2xhbl9oZGRfcHJvY2Vzc19mdG1faG9zdF9jbWQKKygKKyAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisgICB2b2lkICpmdG1DbWQKKykKK3sKKyAgIHRQdHRNc2didWZmZXIgKnBGVE1DbWQgPSAodFB0dE1zZ2J1ZmZlciAqKWZ0bUNtZDsKKyAgIGludCAgICAgICAgICAgIG5lZWRUb1JvdXRlSGFsID0gMTsKKyAgIGludCAgICAgICAgICAgIGhvc3RTdGF0ZSA9IDE7CisKKyAgIHN3aXRjaChwRlRNQ21kLT5tc2dJZCkKKyAgIHsKKyAgICAgIGNhc2UgUFRUX01TR19HRVRfTlZfVEFCTEU6CisgICAgICAgICBob3N0U3RhdGUgPSB3bGFuX2hkZF9mdG1fZ2V0X252X3RhYmxlKHBIZGRDdHgsIHBGVE1DbWQpOworICAgICAgICAgbmVlZFRvUm91dGVIYWwgPSAwOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUFRUX01TR19TRVRfTlZfVEFCTEU6CisgICAgICAgICBob3N0U3RhdGUgPSB3bGFuX2hkZF9mdG1fc2V0X252X3RhYmxlKHBIZGRDdHgsIHBGVE1DbWQpOworICAgICAgICAgLyogVGVtcCBOViBPcGVyYXRpb24gd2lsbCBiZSBpc29sYXRlZCB0byBob3N0CisgICAgICAgICBuZWVkVG9Sb3V0ZUhhbCA9IDE7ICovCisgICAgICAgICBuZWVkVG9Sb3V0ZUhhbCA9IDA7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQVFRfTVNHX0JMQU5LX05WOgorICAgICAgICAgaG9zdFN0YXRlID0gd2xhbl9oZGRfZnRtX2JsYW5rX252X3RhYmxlKHBGVE1DbWQpOworICAgICAgICAgbmVlZFRvUm91dGVIYWwgPSAxOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUFRUX01TR19ERUxfTlZfVEFCTEU6CisgICAgICAgICBob3N0U3RhdGUgPSB3bGFuX2hkZF9mdG1fZGVsZXRlX252X3RhYmxlKHBGVE1DbWQpOworICAgICAgICAgbmVlZFRvUm91dGVIYWwgPSAxOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUFRUX01TR19HRVRfTlZfRklFTEQ6CisgICAgICAgICBob3N0U3RhdGUgPSB3bGFuX2hkZF9mdG1fZ2V0X252X2ZpZWxkKHBGVE1DbWQpOworICAgICAgICAgbmVlZFRvUm91dGVIYWwgPSAwOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUFRUX01TR19TRVRfTlZfRklFTEQ6CisgICAgICAgICBob3N0U3RhdGUgPSB3bGFuX2hkZF9mdG1fc2V0X252X2ZpZWxkKHBGVE1DbWQpOworICAgICAgICAgbmVlZFRvUm91dGVIYWwgPSAwOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUFRUX01TR19TVE9SRV9OVl9UQUJMRToKKyAgICAgICAgIGhvc3RTdGF0ZSA9IHdsYW5faGRkX2Z0bV9zdG9yZV9udl90YWJsZShwRlRNQ21kKTsKKyAgICAgICAgIG5lZWRUb1JvdXRlSGFsID0gMDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBUVF9NU0dfREJHX1JFQURfUkVHSVNURVI6CisgICAgICAgICB3cGFsUmVhZFJlZ2lzdGVyKHBGVE1DbWQtPm1zZ0JvZHkuRGJnUmVhZFJlZ2lzdGVyLnJlZ0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwRlRNQ21kLT5tc2dCb2R5LkRiZ1JlYWRSZWdpc3Rlci5yZWdWYWx1ZSk7CisgICAgICAgICBuZWVkVG9Sb3V0ZUhhbCA9IDA7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQVFRfTVNHX0RCR19XUklURV9SRUdJU1RFUjoKKyAgICAgICAgIHdwYWxXcml0ZVJlZ2lzdGVyKHBGVE1DbWQtPm1zZ0JvZHkuRGJnV3JpdGVSZWdpc3Rlci5yZWdBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZUTUNtZC0+bXNnQm9keS5EYmdXcml0ZVJlZ2lzdGVyLnJlZ1ZhbHVlKTsKKyAgICAgICAgIG5lZWRUb1JvdXRlSGFsID0gMDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBUVF9NU0dfREJHX1JFQURfTUVNT1JZOgorICAgICAgICAgd3BhbFJlYWREZXZpY2VNZW1vcnkocEZUTUNtZC0+bXNnQm9keS5EYmdSZWFkTWVtb3J5Lm1lbUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKXBGVE1DbWQtPm1zZ0JvZHkuRGJnUmVhZE1lbW9yeS5wTWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZUTUNtZC0+bXNnQm9keS5EYmdSZWFkTWVtb3J5Lm5CeXRlcyk7CisgICAgICAgICBuZWVkVG9Sb3V0ZUhhbCA9IDA7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQVFRfTVNHX0RCR19XUklURV9NRU1PUlk6CisgICAgICAgICB3cGFsV3JpdGVEZXZpY2VNZW1vcnkocEZUTUNtZC0+bXNnQm9keS5EYmdXcml0ZU1lbW9yeS5tZW1BZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcEZUTUNtZC0+bXNnQm9keS5EYmdXcml0ZU1lbW9yeS5wTWVtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGVE1DbWQtPm1zZ0JvZHkuRGJnV3JpdGVNZW1vcnkubkJ5dGVzKTsKKyAgICAgICAgIG5lZWRUb1JvdXRlSGFsID0gMDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBUVF9NU0dfR0VUX0JVSUxEX1JFTEVBU0VfTlVNQkVSOgorICAgICAgICAgd2xhbl9oZGRfZnRtX3RlbXBfZ2V0X3JlbF9udW0ocEZUTUNtZCk7CisgICAgICAgICBuZWVkVG9Sb3V0ZUhhbCA9IDA7CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIG5lZWRUb1JvdXRlSGFsID0gMTsKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICBpZigtMSA9PSBob3N0U3RhdGUpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiSG9zdCBDb21tYW5kIEhhbmRsZSBGYWlsLCBCYWlsb3V0Iik7CisgICAgICByZXR1cm4gLTE7CisgICB9CisKKyAgIHJldHVybiBuZWVkVG9Sb3V0ZUhhbDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5faGRkX3Byb2Nlc3NfZnRtX2NtZCgpIC0KKworICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzIHRoZSBjb21tYW5kcyByZWNlaXZlZCBmcm9tIHRoZSBwdHQgc29ja2V0IGFwcGxpY2F0aW9uLgorCisgIFxwYXJhbSAgLSBwQWRhcHRlciAtIFBvaW50ZXIgSEREIENvbnRleHQuCisKKyAgXHBhcmFtICAtIHdubCAtIFBvaW50ZXIgdG8gdGhlIEFOSSBuZXRsaW5rIGhlYWRlci4KKworICBccmV0dXJuIC0gbm9uZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB3bGFuX2hkZF9wcm9jZXNzX2Z0bV9jbWQKKygKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorICAgIHRBbmlObEhkciAqd25sCispCit7CisgICAgd2xhbl9oZGRfZnRtX3JlcXVlc3RfdCAgKnBSZXF1ZXN0QnVmID0gKHdsYW5faGRkX2Z0bV9yZXF1ZXN0X3QqKSgoKHZfVThfdCopKCZ3bmwtPndtc2cpKStzaXplb2YodEFuaUhkcikpIDsKKyAgICB2X1UxNl90ICAgY21kX2xlbjsKKyAgICB2X1U4X3QgKnBmdG1fZGF0YTsKKyAgICBwVm9zQ29udGV4dFR5cGUgcFZvc0NvbnRleHQgPSAocFZvc0NvbnRleHRUeXBlKShwSGRkQ3R4LT5wdm9zQ29udGV4dCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgaW50IGhvc3RTdGF0ZTsKKyAgICB0UHR0TXNnYnVmZmVyICp0ZW1wUnNwQnVmZmVyID0gTlVMTDsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8gICAgICAgIAorCisgICAgRU5URVIoKTsKKworICAgIGlmICghcFJlcXVlc3RCdWYpIHsKKworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogcmVxdWVzdCBidWZmZXIgaXMgbnVsbFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8qU2F2ZSB0aGUgcmVjZWl2ZWQgcmVxdWVzdCovCisgICAgcEhkZEN0eC0+ZnRtLnBSZXF1ZXN0QnVmID0gcFJlcXVlc3RCdWY7CisKKyAgICBwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmID0gKHdsYW5faGRkX2Z0bV9yZXNwb25zZV90KilwUmVxdWVzdEJ1ZjsKKyAgICAgLypTYXZlIHRoZSByZWNlaXZlZCByZXF1ZXN0IG5ldGxpbmsgaGVhZGVyIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHJlc3BvbnNlKi8KKyAgICBwSGRkQ3R4LT5mdG0ud25sID0gd25sOworICAgIGlmIChwUmVxdWVzdEJ1Zi0+bW9kdWxlX3R5cGUgIT0gUVVBTENPTU1fTU9EVUxFX1RZUEUpIHsKKworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogSW52YWxpZCBNb2R1bGUgVHlwZSA9JWRcbiIsX19mdW5jX18scFJlcXVlc3RCdWYtPm1vZHVsZV90eXBlKTsKKworICAgICAgICBwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmLT5mdG1fZXJyX2NvZGUgPSBXTEFOX0ZUTV9GQUlMVVJFOworICAgICAgICB3bGFuX2Z0bV9zZW5kX3Jlc3BvbnNlKHBIZGRDdHgpOworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHN3aXRjaCAocFJlcXVlc3RCdWYtPmZ0bXBrdC5mdG1fY21kX3R5cGUpCisgICAgeworICAgIGNhc2UgV0xBTl9GVE1fU1RBUlQ6CisgICAgICAgIGlmIChwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlID09IFdMQU5fRlRNX1NUQVJURUQpIHsKKworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEZUTSBoYXMgYWxyZWFkeSBzdGFydGVkID0lZFxuIixfX2Z1bmNfXyxwUmVxdWVzdEJ1Zi0+ZnRtcGt0LmZ0bV9jbWRfdHlwZSk7CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmLT5mdG1faGRyLmRhdGFfbGVuIC09IDE7CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmLT5mdG1fZXJyX2NvZGUgPSBXTEFOX0ZUTV9TVUNDRVNTOworICAgICAgICAgICAgd2xhbl9mdG1fc2VuZF9yZXNwb25zZShwSGRkQ3R4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3bGFuX2hkZF9mdG1fc3RhcnQocFZvc0NvbnRleHQtPnBIRERDb250ZXh0KSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogOiBGYWlsZWQgdG8gc3RhcnQgV0xBTiBGVE0iCisgICAgICAgICAgICAgICAgICAgLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS5wUmVzcG9uc2VCdWYtPmZ0bV9lcnJfY29kZSA9IFdMQU5fRlRNX0ZBSUxVUkU7CisgICAgICAgICAgICB3bGFuX2Z0bV9zZW5kX3Jlc3BvbnNlKHBIZGRDdHgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qIFB0dCBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIHRoZSBob3N0IFBDIGV4cGVjdHMgdGhlIGxlbmd0aCB0byBiZSBvbmUgYnl0ZSBsZXNzIHRoYXQgd2hhdCB3ZSBoYXZlIHJlY2VpdmVkKi8KKyAgICAgICAgcEhkZEN0eC0+ZnRtLnBSZXNwb25zZUJ1Zi0+ZnRtX2hkci5kYXRhX2xlbiAtPSAxOworICAgICAgICBwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmLT5mdG1fZXJyX2NvZGUgPSBXTEFOX0ZUTV9TVUNDRVNTOworICAgICAgICBwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmLT5mdG1wa3QuZnRtX2NtZF90eXBlID0gMDsKKworICAgICAgICB3bGFuX2Z0bV9zZW5kX3Jlc3BvbnNlKHBIZGRDdHgpOworCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOX0ZUTV9TVE9QOgorICAgICAgICBpZiAocEhkZEN0eC0+ZnRtLmZ0bV9zdGF0ZSAhPSBXTEFOX0ZUTV9TVEFSVEVEKSB7CisKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOjogRlRNIGhhcyBub3Qgc3RhcnRlZFxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmLT5mdG1fZXJyX2NvZGUgPSBXTEFOX0ZUTV9TVUNDRVNTOworICAgICAgICAgICAgd2xhbl9mdG1fc2VuZF9yZXNwb25zZShwSGRkQ3R4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gd2xhbl9mdG1fc3RvcChwSGRkQ3R4KSkgeworCisgICAgICAgICAgICBwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmLT5mdG1fZXJyX2NvZGUgPSBXTEFOX0ZUTV9GQUlMVVJFOworICAgICAgICAgICAgd2xhbl9mdG1fc2VuZF9yZXNwb25zZShwSGRkQ3R4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHBIZGRDdHgtPmZ0bS5mdG1fc3RhdGUgPSBXTEFOX0ZUTV9TVE9QUEVEOworICAgICAgICAvKiBUaGlzIHdvdWxkIHNlbmQgYmFjayB0aGUgQ29tbWFuZCBTdWNjZXNzIFN0YXR1cyAqLworICAgICAgICBwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmLT5mdG1fZXJyX2NvZGUgPSBXTEFOX0ZUTV9TVUNDRVNTOworCisgICAgICAgIHdsYW5fZnRtX3NlbmRfcmVzcG9uc2UocEhkZEN0eCk7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5fRlRNX0NNRDoKKyAgICAgICAgLyogaWYgaXQgaXMgcmVndWxhciBGVE0gY29tbWFuZCwgcGFzcyBpdCB0byBIQUwgUEhZICovCisgICAgICAgIGlmKHBIZGRDdHgtPmZ0bS5Jc0NtZFBlbmRpbmcgPT0gVFJVRSkgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6OiBGVE0gY29tbWFuZCBwZW5kaW5nIGZvciBwcm9jZXNzXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocEhkZEN0eC0+ZnRtLmZ0bV9zdGF0ZSAhPSBXTEFOX0ZUTV9TVEFSVEVEKSB7CisKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOjogRlRNIGhhcyBub3Qgc3RhcnRlZFxuIixfX2Z1bmNfXyk7CisKKyAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS5wUmVzcG9uc2VCdWYtPmZ0bV9lcnJfY29kZSA9IFdMQU5fRlRNX0ZBSUxVUkU7CisgICAgICAgICAgICB3bGFuX2Z0bV9zZW5kX3Jlc3BvbnNlKHBIZGRDdHgpOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIH0KKyAgICAgICAgdm9zX2V2ZW50X3Jlc2V0KCZwSGRkQ3R4LT5mdG0uZnRtX3Zvc19ldmVudCk7CisgICAgICAgIGNtZF9sZW4gPSBwUmVxdWVzdEJ1Zi0+ZnRtX2hkci5kYXRhX2xlbjsKKyAgICAgICAgY21kX2xlbiAtPSAoc2l6ZW9mKHdsYW5faGRkX2Z0bV9yZXF1ZXN0X3QpLSBzaXplb2YocFJlcXVlc3RCdWYtPmZ0bXBrdC5mdG1fY21kX3R5cGUpKTsKKyAgICAgICAgcGZ0bV9kYXRhID0gcFJlcXVlc3RCdWYtPmZ0bXBrdC5wRnRtQ21kOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgICAgIGhvc3RTdGF0ZSA9IHdsYW5faGRkX3Byb2Nlc3NfZnRtX2hvc3RfY21kKHBIZGRDdHgsIHBmdG1fZGF0YSk7CisgICAgICAgIGlmICgwID09IGhvc3RTdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICB0ZW1wUnNwQnVmZmVyID0gKHRQdHRNc2didWZmZXIgKil2b3NfbWVtX21hbGxvYygoKHRQdHRNc2didWZmZXIgKilwZnRtX2RhdGEpLT5tc2dCb2R5TGVuZ3RoKTsKKyAgICAgICAgICAgaWYgKE5VTEwgPT0gdGVtcFJzcEJ1ZmZlcikKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIiVzOjogdGVtcCBNZW0gQWxsb2MgRmFpbFxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgIHBIZGRDdHgtPmZ0bS5wUmVzcG9uc2VCdWYtPmZ0bV9lcnJfY29kZSA9IFdMQU5fRlRNX0ZBSUxVUkU7CisgICAgICAgICAgICAgIHdsYW5fZnRtX3NlbmRfcmVzcG9uc2UocEhkZEN0eCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgfQorICAgICAgICAgICBtZW1jcHkodGVtcFJzcEJ1ZmZlciwgcGZ0bV9kYXRhLCAoKHRQdHRNc2didWZmZXIgKilwZnRtX2RhdGEpLT5tc2dCb2R5TGVuZ3RoKTsKKyAgICAgICAgICAgdGVtcFJzcEJ1ZmZlci0+bXNnUmVzcG9uc2UgPSBQVFRfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgIG1lbWNweSgodW5zaWduZWQgY2hhciAqKSZwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmLT5mdG1wa3QsCisgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSB0ZW1wUnNwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgdGVtcFJzcEJ1ZmZlci0+bXNnQm9keUxlbmd0aCk7CisgICAgICAgICAgIHBIZGRDdHgtPmZ0bS5wUmVzcG9uc2VCdWYtPmZ0bV9lcnJfY29kZSA9IFdMQU5fRlRNX1NVQ0NFU1M7CisgICAgICAgICAgIHdsYW5fZnRtX3NlbmRfcmVzcG9uc2UocEhkZEN0eCk7CisgICAgICAgICAgIHZvc19tZW1fZnJlZSh0ZW1wUnNwQnVmZmVyKTsKKyAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKC0xID09IGhvc3RTdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiKioqIEhvc3QgQ29tbWFuZCBIYW5kbGUgRmFpbCAqKioiKTsKKyAgICAgICAgICAgcEhkZEN0eC0+ZnRtLnBSZXNwb25zZUJ1Zi0+ZnRtX2Vycl9jb2RlID0gV0xBTl9GVE1fRkFJTFVSRTsKKyAgICAgICAgICAgd2xhbl9mdG1fc2VuZF9yZXNwb25zZShwSGRkQ3R4KTsKKyAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKKyAgICAgICAgLy9IRVhEVU1QKCJSZXF1ZXN0OiIsKGNoYXIqKXBmdG1fZGF0YSxjbWRfbGVuKTsKKworICAgICAgICBwSGRkQ3R4LT5mdG0uSXNDbWRQZW5kaW5nID0gVFJVRTsKKworICAgICAgICAvKlBvc3QgdGhlIGNvbW1hbmQgdG8gdGhlIEhBTCovCisgICAgICAgIGlmICh3bGFuX2Z0bV9wb3N0bXNnKHBmdG1fZGF0YSwgY21kX2xlbikgIT0gVk9TX1NUQVRVU19TVUNDRVNTKSB7CisKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOjogRlRNIGNvbW1hbmQgZmFpbGVkXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB9CisgICAgICAgIC8qV2FpdCBoZXJlIHVudGlsIHlvdSBnZXQgdGhlIHJlc3BvbnNlIGZyb20gSEFMKi8KKyAgICAgICAgaWYgKHZvc193YWl0X3NpbmdsZV9ldmVudCgmcEhkZEN0eC0+ZnRtLmZ0bV92b3NfZXZlbnQsIEZUTV9WT1NfRVZFTlRfV0FJVF9USU1FKSE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICIlczogdm9zX3dhaXRfc2luZ2xlX2V2ZW50IGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY21kX2xlbiA9IGJlMTZfdG9fY3B1KHBIZGRDdHgtPmZ0bS53bmwtPndtc2cubGVuZ3RoKTsKKworICAgICAgICAvL0hFWERVTVAoIlJlc3BvbnNlIHRvIFFYRE06IiwgKGNoYXIgKikmcEFkYXB0ZXItPmZ0bS53bmwtPndtc2csIGNtZF9sZW4pOworCisgICAgICAgIHdsYW5fZnRtX3NlbmRfcmVzcG9uc2UocEhkZEN0eCk7CisgICAgICAgIHBIZGRDdHgtPmZ0bS5Jc0NtZFBlbmRpbmcgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOjogQ29tbWFuZCBub3Qgc3VwcG9ydGVkIFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBFWElUKCk7CisgICAgcmV0dXJuOworfSAvKiB3bGFuX2FkcF9mdG1fY21kKCkgKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5fZnRtX3ByaXZfc3RhcnRfc3RvcF9mdG0oKSAtCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igc3RhcnQvc3RvcCB0aGUgZnRtIGRyaXZlci4KKworICBccGFyYW0gIC0gcEFkYXB0ZXIgLSBQb2ludGVyIEhERCBDb250ZXh0LgorICAgICAgICAgICAgICAtIHN0YXJ0IC0gMS8wIHRvIHN0YXJ0L3N0b3AgZnRtIGRyaXZlci4KKworICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBWT1NfU1RBVFVTIHdsYW5fZnRtX3ByaXZfc3RhcnRfc3RvcF9mdG0oaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTE2X3Qgc3RhcnQpCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisKKyAgICBpZiAoc3RhcnQpIAorICAgIHsKKyAgICAgICAgcEhkZEN0eC0+ZnRtLmNtZF9pd3ByaXYgPSBUUlVFOworICAgICAgICBzdGF0dXMgPSB3bGFuX2hkZF9mdG1fc3RhcnQocEhkZEN0eCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgICJGVE0gU3RhcnQgRmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gd2xhbl9mdG1fc3RvcChwSGRkQ3R4KTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICAgIkZUTSBTdG9wIEZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2Z0bV9wcml2X3NldF9jaGFubmVsKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIGNoYW5uZWwgdG8gdGhlIGhhbHBoeSBwdHQgbW9kdWxlLgorCisgIFxwYXJhbSAgLSBwQWRhcHRlciAtIFBvaW50ZXIgSEREIENvbnRleHQuCisgICAgICAgICAgICAgIC0gY2hhbm5lbCAgIC0gIENoYW5uZWwgTnVtYmVyIDEtMTQuCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgVk9TX1NUQVRVUyB3bGFuX2Z0bV9wcml2X3NldF9jaGFubmVsKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLHZfVTE2X3QgY2hhbm5lbCkKK3sKKyAgICB0UHR0TXNnYnVmZmVyICpwTXNnQnVmOworICAgIHVQdHRNc2dzICpwTXNnQm9keTsKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKilwQWRhcHRlci0+cEhkZEN0eDsKKworICAgIGlmKHBIZGRDdHgtPmZ0bS5mdG1fc3RhdGUgIT0gV0xBTl9GVE1fU1RBUlRFRCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6RnRtIGhhcyBub3Qgc3RhcnRlZC4gUGxlYXNlIHN0YXJ0IHRoZSBmdG0uICIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYoIShjaGFubmVsID49IDEgJiYgY2hhbm5lbCA8PSAxNCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkludmFsaWQgQ2hhbm5lbCBOdW1iZXIuICIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgcE1zZ0J1ZiA9ICh0UHR0TXNnYnVmZmVyICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRQdHRNc2didWZmZXIpKTsKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOnBNc2dCdWYgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgIH0KKyAgICBpbml0X2NvbXBsZXRpb24oJnBIZGRDdHgtPmZ0bS5mdG1fY29tcF92YXIpOworICAgIHBNc2dCdWYtPm1zZ0lkID0gUFRUX01TR19TRVRfQ0hBTk5FTDsKKyAgICBwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoID0gc2l6ZW9mKHRNc2dQdHRTZXRDaGFubmVsKSArIFBUVF9IRUFERVJfTEVOR1RIOworCisgICAgcE1zZ0JvZHkgPSAmcE1zZ0J1Zi0+bXNnQm9keTsKKworICAgIHBNc2dCb2R5LT5TZXRDaGFubmVsLmNoSWQgPSBjaGFubmVsOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQ2hhbm5lbCA9JWRcbiIscE1zZ0JvZHktPlNldENoYW5uZWwuY2hJZCk7CisgICAgcE1zZ0JvZHktPlNldENoYW5uZWwuY2JTdGF0ZSA9IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKworICAgIHN0YXR1cyA9IHdsYW5fZnRtX3Bvc3Rtc2coKHZfVThfdCopcE1zZ0J1ZixwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoKTsKKworICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOndsYW5fZnRtX3Bvc3Rtc2cgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisKKyAgICB9CisgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBIZGRDdHgtPmZ0bS5mdG1fY29tcF92YXIsIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9GVE1fQ09NTUFORF9USU1FX09VVCkpOworCisgICAgaWYocE1zZ0J1Zi0+bXNnUmVzcG9uc2UgIT0gUFRUX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpQdHQgcmVzcG9uc2Ugc3RhdHVzIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworCisgICAgfQorZG9uZToKKyAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICogKXBNc2dCdWYpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5fZnRtX3ByaXZfc2V0X3R4cG93ZXIoKSAtCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igc2V0dGluZyB0aGUgdHhwb3dlciB0byB0aGUgaGFscGh5IHB0dCBtb2R1bGUuCisKKyAgXHBhcmFtICAtIHBBZGFwdGVyIC0gUG9pbnRlciBIREQgQ29udGV4dC4KKyAgICAgICAgICAgICAgLSB0eHBvd2VyICAgLSAgdHhwb3dlciBOdW1iZXIgMS0xOC4KKworICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBWT1NfU1RBVFVTIHdsYW5fZnRtX3ByaXZfc2V0X3R4cG93ZXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsdl9VMTZfdCB0eHBvd2VyKQoreworICAgIHRQdHRNc2didWZmZXIgKnBNc2dCdWY7CisgICAgdVB0dE1zZ3MgKnBNc2dCb2R5OworICAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXBBZGFwdGVyLT5wSGRkQ3R4OworCisgICAgaWYocEhkZEN0eC0+ZnRtLmZ0bV9zdGF0ZSAhPSBXTEFOX0ZUTV9TVEFSVEVEKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpGdG0gaGFzIG5vdCBzdGFydGVkLiBQbGVhc2Ugc3RhcnQgdGhlIGZ0bS4gIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBkbyBub3QgYWxsb3cgdG8gY2hhbmdlIHNldHRpbmcgd2hlbiB0eCBwa3RnZW4gaXMgZW5hYmxlZCwgYWx0aG91Z2ggaGFscGh5IGRvZXMgYWxsb3cgY2hhbmdpbmcgdHggcG93ZXIKKyAgICAgKiB3aGVuIHR4IHBrdGdlbiBpcyBlbmFibGVkCisgICAgICovCisgICAgaWYgKGZ0bV9zdGF0dXMuZnJhbWVHZW5FbmFibGVkKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpjYW5ub3Qgc2V0IHR4cG93ZXIgd2hlbiBwa3RnZW4gaXMgZW5hYmxlZC4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIGlmKCEodHhwb3dlciA+PSA5ICYmIHR4cG93ZXIgPD0gMjQpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpJbnZhbGlkIHR4IHBvd2VyLiAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKyAgICBwTXNnQnVmID0gKHRQdHRNc2didWZmZXIgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFB0dE1zZ2J1ZmZlcikpOworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6cE1zZ0J1ZiBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgfQorICAgIGluaXRfY29tcGxldGlvbigmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3Zhcik7CisgICAgcE1zZ0J1Zi0+bXNnSWQgPSBQVFRfTVNHX0NMT1NFX1RQQ19MT09QOworICAgIHBNc2dCdWYtPm1zZ0JvZHlMZW5ndGggPSBzaXplb2YodE1zZ1B0dENsb3NlVHBjTG9vcCkgKyBQVFRfSEVBREVSX0xFTkdUSDsKKworICAgIHBNc2dCb2R5ID0gJnBNc2dCdWYtPm1zZ0JvZHk7CisgICAgcE1zZ0JvZHktPkNsb3NlVHBjTG9vcC50cGNDbG9zZSA9IFRSVUU7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7CisKKyAgICBpZihwTXNnQnVmLT5tc2dSZXNwb25zZSAhPSBQVFRfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOlB0dCByZXNwb25zZSBzdGF0dXMgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaW5pdF9jb21wbGV0aW9uKCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyKTsKKyAgICBwTXNnQnVmLT5tc2dJZCA9IFBUVF9NU0dfU0VUX1RYX1BPV0VSOworICAgIHBNc2dCdWYtPm1zZ0JvZHlMZW5ndGggPSBzaXplb2YodE1zZ1B0dFNldFR4UG93ZXIpICsgUFRUX0hFQURFUl9MRU5HVEg7CisKKyAgICBwTXNnQm9keS0+U2V0VHhQb3dlci5kYm1Qd3IgPSB0eHBvd2VyKjEwMDsKKworICAgIHN0YXR1cyA9IHdsYW5fZnRtX3Bvc3Rtc2coKHZfVThfdCopcE1zZ0J1ZixwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoKTsKKworICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOndsYW5fZnRtX3Bvc3Rtc2cgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyLCBtc2Vjc190b19qaWZmaWVzKFdMQU5fRlRNX0NPTU1BTkRfVElNRV9PVVQpKTsKKworICAgIGlmKHBNc2dCdWYtPm1zZ1Jlc3BvbnNlICE9IFBUVF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6UHR0IHJlc3BvbnNlIHN0YXR1cyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBmdG1fc3RhdHVzLnR4cG93ZXIgPSB0eHBvd2VyIDsKKyBkb25lOgorICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QgKiApcE1zZ0J1Zik7CisKKyAgICByZXR1cm4gc3RhdHVzOworCit9CisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgd2xhbl9mdG1fcHJpdl9zZXRfdHhyYXRlKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIHR4cmF0ZSB0byB0aGUgaGFscGh5IHB0dCBtb2R1bGUuCisgICBJdCBjb252ZXJ0cyB0aGUgdXNlciBpbnB1dCBzdHJpbmcgZm9yIHR4cmF0ZSB0byB0aGUgdHggcmF0ZSBpbmRleC4KKworICBccGFyYW0gIC0gcEFkYXB0ZXIgLSBQb2ludGVyIEhERCBDb250ZXh0LgorICAgICAgICAgICAgICAtIHR4cmF0ZSAgIC0gIFBvaW50ZXIgdG8gdGhlIHR4IHJhdGUgc3RyaW5nLgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFZPU19TVEFUVVMgd2xhbl9mdG1fcHJpdl9zZXRfdHhyYXRlKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLGNoYXIgKnR4cmF0ZSkKK3sKKyAgICBpbnQgaWk7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisgICAgaWYocEhkZEN0eC0+ZnRtLmZ0bV9zdGF0ZSAhPSBXTEFOX0ZUTV9TVEFSVEVEKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpGdG0gaGFzIG5vdCBzdGFydGVkLiBQbGVhc2Ugc3RhcnQgdGhlIGZ0bS4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIC8qIGRvIG5vdCBhbGxvdyB0byBjaGFuZ2Ugc2V0dGluZyB3aGVuIHR4IHBrdGdlbiBpcyBlbmFibGVkICovCisgICAgaWYgKGZ0bV9zdGF0dXMuZnJhbWVHZW5FbmFibGVkKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpjYW5ub3Qgc2V0IHR4cmF0ZSB3aGVuIHBrdGdlbiBpcyBlbmFibGVkLiIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgZm9yKGlpID0gMDsgaWkgPCBTSVpFX09GX1RBQkxFKHJhdGVOYW1lX3JhdGVJbmRleF90YmwpOyBpaSsrKQorICAgIHsKKyAgICAgICAgaWYoIXN0cmNtcChyYXRlTmFtZV9yYXRlSW5kZXhfdGJsW2lpXS5yYXRlX3N0cix0eHJhdGUpKQorICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYoaWkgPj0gU0laRV9PRl9UQUJMRShyYXRlTmFtZV9yYXRlSW5kZXhfdGJsKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6SW52YWxpZCBSYXRlIFN0cmluZ1xuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBmdG1fc3RhdHVzLmZyYW1lUGFyYW1zLnJhdGUgPSByYXRlTmFtZV9yYXRlSW5kZXhfdGJsW2lpXS5yYXRlX2luZGV4OworICAgIGZ0bV9zdGF0dXMuZnJhbWVQYXJhbXMucHJlYW1ibGUgPSByYXRlX2luZGV4XzJfcHJlYW1ibGVfdGFibGVbcmF0ZU5hbWVfcmF0ZUluZGV4X3RibFtpaV0ucmF0ZV9pbmRleF0uUHJlYW1ibGU7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgd2xhbl9mdG1fcHJpdl9zdGFydF9zdG9wX3R4X3BrdGdlbigpIC0KKworICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBzdGFydC9zdG9wIHRoZSB0eCBwYWNrZXQgZ2VuZXJhdGlvbi4KKworICBccGFyYW0gIC0gcEFkYXB0ZXIgLSBQb2ludGVyIEhERCBDb250ZXh0LgorICAgICAgICAgICAgICAtIHN0YXJ0U3RvcCAgIC0gIFZhbHVlKCAxLzApIHN0YXJ0L3N0b3AgdGhlIHR4IHBhY2tldCBnZW5lcmF0aW9uLgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFZPU19TVEFUVVMgd2xhbl9mdG1fcHJpdl9zdGFydF9zdG9wX3R4X3BrdGdlbihoZGRfYWRhcHRlcl90ICpwQWRhcHRlcix2X1UxNl90IHN0YXJ0U3RvcCkKK3sKKyAgICB0UHR0TXNnYnVmZmVyICpwTXNnQnVmOworICAgIHVQdHRNc2dzICpwTXNnQm9keTsKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKilwQWRhcHRlci0+cEhkZEN0eDsKKworICAgIGlmKHBIZGRDdHgtPmZ0bS5mdG1fc3RhdGUgIT0gV0xBTl9GVE1fU1RBUlRFRCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6RnRtIGhhcyBub3Qgc3RhcnRlZC4gUGxlYXNlIHN0YXJ0IHRoZSBmdG0uICIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYoc3RhcnRTdG9wICE9IDEgJiYgc3RhcnRTdG9wICE9IDApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOlR4IHZhbHVlIGlzIGludmFsaWQgIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoKGZ0bV9zdGF0dXMuZnJhbWVHZW5FbmFibGVkICYmIHN0YXJ0U3RvcCA9PSAxKSB8fAorICAgICAgICAoIWZ0bV9zdGF0dXMuZnJhbWVHZW5FbmFibGVkICYmIHN0YXJ0U3RvcCA9PSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgOworICAgIH0KKworICAgIHBNc2dCdWYgPSAodFB0dE1zZ2J1ZmZlciAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0UHR0TXNnYnVmZmVyKSk7CisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpwTXNnQnVmIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgICB9CisgICAgaWYgKHN0YXJ0U3RvcCA9PSAxKQorICAgIHsKKyAgICAgICAgaW5pdF9jb21wbGV0aW9uKCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyKTsKKyAgICAgICAgcE1zZ0J1Zi0+bXNnSWQgPSBQVFRfTVNHX0NPTkZJR19UWF9QQUNLRVRfR0VOOworICAgICAgICBwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoID0gc2l6ZW9mKHRNc2dQdHRDb25maWdUeFBhY2tldEdlbikgKyBQVFRfSEVBREVSX0xFTkdUSDsKKyAgICAgICAgcE1zZ0JvZHkgPSAmcE1zZ0J1Zi0+bXNnQm9keTsKKyAgICAgICAgcE1zZ0JvZHktPkNvbmZpZ1R4UGFja2V0R2VuLmZyYW1lUGFyYW1zID0gZnRtX3N0YXR1cy5mcmFtZVBhcmFtcyA7CisKKyAgICAgICAgc3RhdHVzID0gd2xhbl9mdG1fcG9zdG1zZygodl9VOF90KilwTXNnQnVmLHBNc2dCdWYtPm1zZ0JvZHlMZW5ndGgpOworICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOnBvc3RpbmcgUFRUX01TR19DT05GSUdfVFhfUEFDS0VUX0dFTiBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBIZGRDdHgtPmZ0bS5mdG1fY29tcF92YXIsIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9GVE1fQ09NTUFORF9USU1FX09VVCkpOworICAgICAgICBpZihwTXNnQnVmLT5tc2dSZXNwb25zZSAhPSBQVFRfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFBUVF9NU0dfQ09ORklHX1RYX1BBQ0tFVF9HRU4gZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluaXRfY29tcGxldGlvbigmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3Zhcik7CisgICAgcE1zZ0J1Zi0+bXNnSWQgPSBQVFRfTVNHX1NUQVJUX1NUT1BfVFhfUEFDS0VUX0dFTjsKKyAgICBwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoID0gc2l6ZW9mKHRNc2dQdHRTdGFydFN0b3BUeFBhY2tldEdlbikgKyBQVFRfSEVBREVSX0xFTkdUSDsKKyAgICBwTXNnQm9keSA9ICZwTXNnQnVmLT5tc2dCb2R5OworICAgIHBNc2dCb2R5LT5TdGFydFN0b3BUeFBhY2tldEdlbi5zdGFydFN0b3AgPSBzdGFydFN0b3A7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisgICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6d2xhbl9mdG1fcG9zdG1zZyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7CisgICAgaWYocE1zZ0J1Zi0+bXNnUmVzcG9uc2UgIT0gUFRUX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpQdHQgcmVzcG9uc2Ugc3RhdHVzIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworZG9uZToKKyAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICogKXBNc2dCdWYpOworCisgICAgaWYgKHN0YXR1cyA9PSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBpZiAoc3RhcnRTdG9wID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ0bV9zdGF0dXMuZnJhbWVHZW5FbmFibGVkID0gZUFOSV9CT09MRUFOX1RSVUUgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZnRtX3N0YXR1cy5mcmFtZUdlbkVuYWJsZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0UgOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0aWMgVk9TX1NUQVRVUyB3bGFuX2Z0bV9wcml2X3NldF9yc3NpX29mZnNldChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcix2X1MxNV90ICpwaHlSeENoYWlucykKK3sKKyNpZm5kZWYgQU5JX0NISVBTRVRfVk9MQU5TCisgICAgdFB0dE1zZ2J1ZmZlciAqcE1zZ0J1ZjsKKyAgICB1UHR0TXNncyAqcE1zZ0JvZHk7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisKKyAgICBpZihwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlICE9IFdMQU5fRlRNX1NUQVJURUQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIHBNc2dCdWYgPSAodFB0dE1zZ2J1ZmZlciAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0UHR0TXNnYnVmZmVyKSk7CisKKyAgICBpbml0X2NvbXBsZXRpb24oJnBIZGRDdHgtPmZ0bS5mdG1fY29tcF92YXIpOworICAgIHBNc2dCdWYtPm1zZ0lkID0gUFRUX01TR19TRVRfTlZfVEFCTEU7CisgICAgcE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCA9IHNpemVvZih0TXNnUHR0U2V0TnZUYWJsZSkgKyBQVFRfSEVBREVSX0xFTkdUSDsKKyAgICBwTXNnQm9keSA9ICZwTXNnQnVmLT5tc2dCb2R5OworICAgIHBNc2dCb2R5LT5TZXROdlRhYmxlLm52VGFibGU9IE5WX1RBQkxFX1JTU0lfT0ZGU0VUUzsKKyAgICBtZW1jcHkoJnBNc2dCb2R5LT5TZXROdlRhYmxlLnRhYmxlRGF0YS5yc3NpT2Zmc2V0WzBdLCBwaHlSeENoYWlucyxzaXplb2YodEFOSV9TMTYpICogUEhZX01BWF9SWF9DSEFJTlMpOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAicnNzaU9mZnNldFswXT0gJWQgcnNzaU9mZnNldFsxXT0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTXNnQm9keS0+U2V0TnZUYWJsZS50YWJsZURhdGEucnNzaU9mZnNldFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2dCb2R5LT5TZXROdlRhYmxlLnRhYmxlRGF0YS5yc3NpT2Zmc2V0WzFdKTsKKworICAgIHN0YXR1cyA9IHdsYW5fZnRtX3Bvc3Rtc2coKHZfVThfdCopcE1zZ0J1ZixwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoKTsKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyLCBtc2Vjc190b19qaWZmaWVzKFdMQU5fRlRNX0NPTU1BTkRfVElNRV9PVVQpKTsKKyAgICBpZihwTXNnQnVmLT5tc2dSZXNwb25zZSAhPSBQVFRfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOlB0dCByZXNwb25zZSBzdGF0dXMgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaW5pdF9jb21wbGV0aW9uKCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyKTsKKyAgICBwTXNnQnVmLT5tc2dJZCA9IFBUVF9NU0dfU1RPUkVfTlZfVEFCTEU7CisgICAgcE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCA9IHNpemVvZih0TXNnUHR0U3RvcmVOdlRhYmxlKSArIFBUVF9IRUFERVJfTEVOR1RIOworICAgIHBNc2dCb2R5ID0gJnBNc2dCdWYtPm1zZ0JvZHk7CisgICAgcE1zZ0JvZHktPlN0b3JlTnZUYWJsZS5udlRhYmxlPSBOVl9UQUJMRV9SU1NJX09GRlNFVFM7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisgICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6d2xhbl9mdG1fcG9zdG1zZyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7CisgICAgaWYocE1zZ0J1Zi0+bXNnUmVzcG9uc2UgIT0gUFRUX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpQdHQgcmVzcG9uc2Ugc3RhdHVzIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KK2RvbmU6CisgICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCAqIClwTXNnQnVmKTsKKworICAgIHJldHVybiBzdGF0dXM7CisjZWxzZQorICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyNlbmRpZgorfQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2Z0bV9yeF9tb2RlKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHN0YXJ0L3N0b3AgdGhlIHJ4IHBhY2tldCBnZW5lcmF0aW9uLgorCisgIFxwYXJhbSAgLSBwQWRhcHRlciAtIFBvaW50ZXIgSEREIENvbnRleHQuCisgICAgICAgICAgICAgIC0gcnhtb2RlICAgLSAgMC1kaXNhYmxlIFJYLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gIDEtcnggQUxMIGZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gIDItcnggMTEgZy9uIGZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gIDMtcnggMTFiIGZyYW1lcworCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFZPU19TVEFUVVMgd2xhbl9mdG1fcHJpdl9yeF9tb2RlKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLHZfVTE2X3Qgcnhtb2RlKQoreworICAgIHRQdHRNc2didWZmZXIgKnBNc2dCdWY7CisgICAgdVB0dE1zZ3MgKnBNc2dCb2R5OworICAgIFZPU19TVEFUVVMgc3RhdHVzOworCisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisgICAgaWYocEhkZEN0eC0+ZnRtLmZ0bV9zdGF0ZSAhPSBXTEFOX0ZUTV9TVEFSVEVEKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpGdG0gaGFzIG5vdCBzdGFydGVkLiBQbGVhc2Ugc3RhcnQgdGhlIGZ0bS4gIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZihyeG1vZGUgPiAzKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpSeCBtb2RlIHZhbHVlIGlzIGludmFsaWQgIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwTXNnQnVmID0gKHRQdHRNc2didWZmZXIgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFB0dE1zZ2J1ZmZlcikpOworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6cE1zZ0J1ZiBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgfQorICAgIGluaXRfY29tcGxldGlvbigmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3Zhcik7CisKKyAgICBwTXNnQnVmLT5tc2dJZCA9IFBUVF9NU0dfU0VUX1JYX0RJU0FCTEVfTU9ERTsKKyAgICBwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoID0gc2l6ZW9mKHRNc2dQdHRTZXRSeERpc2FibGVNb2RlKSArIFBUVF9IRUFERVJfTEVOR1RIOworCisgICAgcE1zZ0JvZHkgPSAmcE1zZ0J1Zi0+bXNnQm9keTsKKworICAgIHN3aXRjaChyeG1vZGUpCisgICAgeworICAgICAgICBjYXNlIFJYTU9ERV9ESVNBQkxFX0FMTDoKKyAgICAgICAgICBwTXNnQm9keS0+U2V0UnhEaXNhYmxlTW9kZS5kaXNhYmxlZC5hZ1BrdHNEaXNhYmxlZCA9IFZPU19UUlVFOworICAgICAgICAgIHBNc2dCb2R5LT5TZXRSeERpc2FibGVNb2RlLmRpc2FibGVkLmJQa3RzRGlzYWJsZWQgID0gVk9TX1RSVUU7CisgICAgICAgICAgcE1zZ0JvZHktPlNldFJ4RGlzYWJsZU1vZGUuZGlzYWJsZWQuc2xyUGt0c0Rpc2FibGVkPSBWT1NfVFJVRTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJYTU9ERV9FTkFCTEVfQUxMOgorICAgICAgICAgIHBNc2dCb2R5LT5TZXRSeERpc2FibGVNb2RlLmRpc2FibGVkLmFnUGt0c0Rpc2FibGVkID0gVk9TX0ZBTFNFOworICAgICAgICAgIHBNc2dCb2R5LT5TZXRSeERpc2FibGVNb2RlLmRpc2FibGVkLmJQa3RzRGlzYWJsZWQgID0gVk9TX0ZBTFNFOworICAgICAgICAgIHBNc2dCb2R5LT5TZXRSeERpc2FibGVNb2RlLmRpc2FibGVkLnNsclBrdHNEaXNhYmxlZD0gVk9TX0ZBTFNFOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUlhNT0RFX0VOQUJMRV8xMUdOOgorICAgICAgICAgIHBNc2dCb2R5LT5TZXRSeERpc2FibGVNb2RlLmRpc2FibGVkLmFnUGt0c0Rpc2FibGVkID0gVk9TX0ZBTFNFOworICAgICAgICAgIHBNc2dCb2R5LT5TZXRSeERpc2FibGVNb2RlLmRpc2FibGVkLmJQa3RzRGlzYWJsZWQgID0gVk9TX1RSVUU7CisgICAgICAgICAgcE1zZ0JvZHktPlNldFJ4RGlzYWJsZU1vZGUuZGlzYWJsZWQuc2xyUGt0c0Rpc2FibGVkPSBWT1NfVFJVRTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJYTU9ERV9FTkFCTEVfMTFCOgorICAgICAgICAgIHBNc2dCb2R5LT5TZXRSeERpc2FibGVNb2RlLmRpc2FibGVkLmFnUGt0c0Rpc2FibGVkID0gVk9TX1RSVUU7CisgICAgICAgICAgcE1zZ0JvZHktPlNldFJ4RGlzYWJsZU1vZGUuZGlzYWJsZWQuYlBrdHNEaXNhYmxlZCAgPSBWT1NfRkFMU0U7CisgICAgICAgICAgcE1zZ0JvZHktPlNldFJ4RGlzYWJsZU1vZGUuZGlzYWJsZWQuc2xyUGt0c0Rpc2FibGVkPSBWT1NfVFJVRTsKKyAgICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIHN0YXR1cyA9IHdsYW5fZnRtX3Bvc3Rtc2coKHZfVThfdCopcE1zZ0J1ZixwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoKTsKKworICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOndsYW5fZnRtX3Bvc3Rtc2cgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyLCBtc2Vjc190b19qaWZmaWVzKFdMQU5fRlRNX0NPTU1BTkRfVElNRV9PVVQpKTsKKworICAgIGlmKHBNc2dCdWYtPm1zZ1Jlc3BvbnNlICE9IFBUVF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6UHR0IHJlc3BvbnNlIHN0YXR1cyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgZnRtX3N0YXR1cy5yeG1vZGUgPSByeG1vZGUgOworZG9uZToKKyAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICogKXBNc2dCdWYpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5fZnRtX3ByaXZfcnhfcGt0X2NsZWFyKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHJ4IHBrdCBjb3VudCB0byB6ZXJvLgorCisgIFxwYXJhbSAgLSBwQWRhcHRlciAtIFBvaW50ZXIgSEREIENvbnRleHQuCisgICAgICAgICAgICAgIC0gcnhfcGt0X2NsZWFyICAgLSAgcnhfcGt0X2NsZWFyIHZhbHVlLgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFZPU19TVEFUVVMgd2xhbl9mdG1fcHJpdl9yeF9wa3RfY2xlYXIoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsdl9VMTZfdCByeF9wa3RfY2xlYXIpCit7CisgICAgdFB0dE1zZ2J1ZmZlciAqcE1zZ0J1ZjsKKyAgICB1UHR0TXNncyAqcE1zZ0JvZHk7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisKKyAgICBpZihwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlICE9IFdMQU5fRlRNX1NUQVJURUQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIGlmKHJ4X3BrdF9jbGVhciAhPSAxKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpJbnZhbGlkIHJ4X3BrdF9jbGVhciB2YWx1ZSAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIHBNc2dCdWYgPSAodFB0dE1zZ2J1ZmZlciAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0UHR0TXNnYnVmZmVyKSk7CisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpwTXNnQnVmIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgICB9CisgICAgaW5pdF9jb21wbGV0aW9uKCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyKTsKKyAgICBwTXNnQnVmLT5tc2dJZCA9IFBUVF9NU0dfUkVTRVRfUlhfUEFDS0VUX1NUQVRJU1RJQ1M7CisgICAgcE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCA9IHNpemVvZih0TXNnUHR0UmVzZXRSeFBhY2tldFN0YXRpc3RpY3MpICsgUFRUX0hFQURFUl9MRU5HVEg7CisKKyAgICBwTXNnQm9keSA9ICZwTXNnQnVmLT5tc2dCb2R5OworICAgIHBNc2dCb2R5LT5SZXNldFJ4UGFja2V0U3RhdGlzdGljcy5ub3RVc2VkPSByeF9wa3RfY2xlYXI7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7CisKKyAgICBpZihwTXNnQnVmLT5tc2dSZXNwb25zZSAhPSBQVFRfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOlB0dCByZXNwb25zZSBzdGF0dXMgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorZG9uZToKKyAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICogKXBNc2dCdWYpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5fZnRtX3ByaXZfZ2V0X2NoYW5uZWwoKSAtCisKKyAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgY2hhbm5lbCBudW1iZXIgZnJvbSB0aGUgaGFscGh5IHB0dCBtb2R1bGUgYW5kCisgICByZXR1cm5zIHRoZSBjaGFubmVsIG51bWJlciB0byB0aGUgYXBwbGljYXRpb24uCisKKyAgXHBhcmFtICAtIHBBZGFwdGVyIC0gUG9pbnRlciBIREQgQ29udGV4dC4KKyAgICAgICAgICAgICAgLSBwQ2hhbm5lbCAgIC0gIFBvbml0ZXIgdG8gZ2V0IHRoZSBDaGFubmVsIG51bWJlci4KKworICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBWT1NfU1RBVFVTIHdsYW5fZnRtX3ByaXZfZ2V0X2NoYW5uZWwoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsdl9VMTZfdCAqcENoYW5uZWwpCit7CisgICAgdFB0dE1zZ2J1ZmZlciAqcE1zZ0J1ZjsKKyAgICB1UHR0TXNncyAqcE1zZ0JvZHk7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgdl9VMTZfdCAgZnJlcTsKKyAgICB2X1U4X3QgaW5keD0wOworCisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisKKyAgICBpZihwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlICE9IFdMQU5fRlRNX1NUQVJURUQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKyAgICBwTXNnQnVmID0gKHRQdHRNc2didWZmZXIgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFB0dE1zZ2J1ZmZlcikpOworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6cE1zZ0J1ZiBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgfQorICAgIGluaXRfY29tcGxldGlvbigmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3Zhcik7CisgICAgcE1zZ0J1Zi0+bXNnSWQgPSBQVFRfTVNHX0RCR19SRUFEX1JFR0lTVEVSOworICAgIHBNc2dCdWYtPm1zZ0JvZHlMZW5ndGggPSBzaXplb2YodE1zZ1B0dERiZ1JlYWRSZWdpc3RlcikgKyBQVFRfSEVBREVSX0xFTkdUSDsKKworICAgIHBNc2dCb2R5ID0gJnBNc2dCdWYtPm1zZ0JvZHk7CisgICAgcE1zZ0JvZHktPkRiZ1JlYWRSZWdpc3Rlci5yZWdBZGRyID0gUVdMQU5fQUdDX0NIQU5ORUxfRlJFUV9SRUc7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworCisgICAgfQorICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyLCBtc2Vjc190b19qaWZmaWVzKFdMQU5fRlRNX0NPTU1BTkRfVElNRV9PVVQpKTsKKworICAgIGlmKHBNc2dCdWYtPm1zZ1Jlc3BvbnNlICE9IFBUVF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6UHR0IHJlc3BvbnNlIHN0YXR1cyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBmcmVxID0gKCh2X1UxNl90KXBNc2dCb2R5LT5EYmdSZWFkUmVnaXN0ZXIucmVnVmFsdWUgJiBRV0xBTl9BR0NfQ0hBTk5FTF9GUkVRX0ZSRVFfTUFTSyk7CisKKyAgICB3aGlsZSAoKGluZHggPCAgU0laRV9PRl9UQUJMRShmcmVxX2NoYW5fdGJsKSkgJiYgKGZyZXEgIT0gZnJlcV9jaGFuX3RibFtpbmR4XS5mcmVxKSkKKyAgICAgICAgICAgIGluZHgrKzsKKyAgICBpZiAoaW5keCA+PSBTSVpFX09GX1RBQkxFKGZyZXFfY2hhbl90YmwpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpJbnZhbGlkIEZyZXF1ZW5jeSEhISIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgICpwQ2hhbm5lbCA9IGZyZXFfY2hhbl90YmxbaW5keF0uY2hhbjsgCisKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiQ2hhbm5lbCA9ICVkICBmcmVxID0gJWRcbiIsKnBDaGFubmVsLCBmcmVxKTsKKyBkb25lOgorICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICogKXBNc2dCdWYpOworCisgICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2Z0bV9wcml2X2dldF90eHBvd2VyKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIFRYIHBvd2VyIGZyb20gdGhlIGhhbHBoeSBwdHQgbW9kdWxlIGFuZAorICAgcmV0dXJucyB0aGUgVFggcG93ZXIgdG8gdGhlIGFwcGxpY2F0aW9uLgorCisgIFxwYXJhbSAgLSBwQWRhcHRlciAtIFBvaW50ZXIgSEREIENvbnRleHQuCisgICAgICAgICAgICAgIC0gcFR4UHdyICAgLSAgUG9uaXRlciB0byBnZXQgdGhlIFR4IHBvd2VyLgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFZPU19TVEFUVVMgd2xhbl9mdG1fcHJpdl9nZXRfdHhwb3dlcihoZGRfYWRhcHRlcl90ICpwQWRhcHRlcix2X1UxNl90ICpwVHhQd3IpCit7CisgICAgdFB0dE1zZ2J1ZmZlciAqcE1zZ0J1ZjsKKyAgICB1UHR0TXNncyAqcE1zZ0JvZHk7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisKKyAgICBpZihwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlICE9IFdMQU5fRlRNX1NUQVJURUQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKyAgICBwTXNnQnVmID0gKHRQdHRNc2didWZmZXIgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFB0dE1zZ2J1ZmZlcikpOworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6cE1zZ0J1ZiBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgfQorICAgIGluaXRfY29tcGxldGlvbigmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3Zhcik7CisgICAgcE1zZ0J1Zi0+bXNnSWQgPSBQVFRfTVNHX0dFVF9UWF9QT1dFUl9SRVBPUlQ7CisgICAgcE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCA9IHNpemVvZih0TXNnUHR0R2V0VHhQb3dlclJlcG9ydCkgKyBQVFRfSEVBREVSX0xFTkdUSDsKKworICAgIHBNc2dCb2R5ID0gJnBNc2dCdWYtPm1zZ0JvZHk7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7CisKKyAgICBpZihwTXNnQnVmLT5tc2dSZXNwb25zZSAhPSBQVFRfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBQVFRfTVNHX0dFVF9UWF9QT1dFUl9SRVBPUlQgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgICpwVHhQd3IgPSAoKCgocE1zZ0JvZHktPkdldFR4UG93ZXJSZXBvcnQucHdyVGVtcGxhdGVJbmRleCAmIDB4MUYpICsgNCkqNTApLzEwMCk7CisKKyBkb25lOgorICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICogKXBNc2dCdWYpOworCisgICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2Z0bV9wcml2X2dldF9mdG1fdmVyc2lvbigpIC0KKworICAgVGhpcyBmdW5jdGlvbiBnZXRzIGZ0bSBkcml2ZXIgYW5kIGZpcm13YXJlIHZlcnNpb24uCisKKyAgXHBhcmFtICAtIHBBZGFwdGVyIC0gUG9pbnRlciBIREQgQ29udGV4dC4KKyAgICAgICAgICAgICAgLSBwVHhSYXRlICAgLSAgUG9uaXRlciB0byBnZXQgdGhlIFR4IHJhdGUuCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWT1NfU1RBVFVTIHdsYW5fZnRtX3ByaXZfZ2V0X2Z0bV92ZXJzaW9uKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLGNoYXIgKnBmdG1WZXIpCit7CisgICAgdFB0dE1zZ2J1ZmZlciAqcE1zZ0J1ZjsKKyAgICB1UHR0TXNncyAqcE1zZ0JvZHk7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgdl9VMzJfdCByZWdfdmFsOworICAgIGNoYXIgKmJ1ZiA9IHBmdG1WZXI7CisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgIEZ3VmVyc2lvbkluZm8gKnBGd1ZlcnNpb247CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisgICAgaW50IGxlblJlcyA9IDA7CisgICAgaW50IGxlbkJ1ZiA9IFdFX0ZUTV9NQVhfU1RSX0xFTjsKKworICAgIGlmKHBIZGRDdHgtPmZ0bS5mdG1fc3RhdGUgIT0gV0xBTl9GVE1fU1RBUlRFRCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6RnRtIGhhcyBub3Qgc3RhcnRlZC4gUGxlYXNlIHN0YXJ0IHRoZSBmdG0uICIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgcE1zZ0J1ZiA9ICh0UHR0TXNnYnVmZmVyICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRQdHRNc2didWZmZXIpKTsKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOnBNc2dCdWYgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgIH0KKyAgICBpbml0X2NvbXBsZXRpb24oJnBIZGRDdHgtPmZ0bS5mdG1fY29tcF92YXIpOworICAgIHBNc2dCdWYtPm1zZ0lkID0gUFRUX01TR19EQkdfUkVBRF9SRUdJU1RFUjsKKyAgICBwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoID0gc2l6ZW9mKHRNc2dQdHREYmdSZWFkUmVnaXN0ZXIpICsgUFRUX0hFQURFUl9MRU5HVEg7CisKKyAgICBwTXNnQm9keSA9ICZwTXNnQnVmLT5tc2dCb2R5OworICAgIHBNc2dCb2R5LT5EYmdSZWFkUmVnaXN0ZXIucmVnQWRkciA9IFFXTEFOX1JGQVBCX1JFVl9JRF9SRUc7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworCisgICAgfQorICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyLCBtc2Vjc190b19qaWZmaWVzKFdMQU5fRlRNX0NPTU1BTkRfVElNRV9PVVQpKTsKKworICAgIGlmKHBNc2dCdWYtPm1zZ1Jlc3BvbnNlICE9IFBUVF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6UHR0IHJlc3BvbnNlIHN0YXR1cyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICByZWdfdmFsID0gKHZfVTE2X3QpcE1zZ0JvZHktPkRiZ1JlYWRSZWdpc3Rlci5yZWdWYWx1ZTsKKworICAgIGluaXRfY29tcGxldGlvbigmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3Zhcik7CisKKyAgICBwTXNnQnVmLT5tc2dJZCA9IFBUVF9NU0dfR0VUX0JVSUxEX1JFTEVBU0VfTlVNQkVSOworICAgIHBNc2dCdWYtPm1zZ0JvZHlMZW5ndGggPSBzaXplb2YodE1zZ1B0dEdldEJ1aWxkUmVsZWFzZU51bWJlcikgKyBQVFRfSEVBREVSX0xFTkdUSDsKKworICAgIHBNc2dCb2R5ID0gJnBNc2dCdWYtPm1zZ0JvZHk7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7CisKKworICAgIGxlblJlcyA9IHNucHJpbnRmKGJ1ZiwgbGVuQnVmLCAiJXNfIixXTEFOX0NISVBfVkVSU0lPTik7CisgICAgaWYobGVuUmVzIDwgMCB8fCBsZW5SZXMgPj0gbGVuQnVmKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBidWYgKz0gbGVuUmVzOworICAgIGxlbkJ1ZiAtPSBsZW5SZXM7CisKKyAgICAvKlJlYWQgdGhlIFJldklEKi8KKyAgICBsZW5SZXMgPSBzbnByaW50ZihidWYsIGxlbkJ1ZiwgIiV4LiV4LSIsKHZfVThfdCkocmVnX3ZhbCA+PiA4KSwgKHZfVThfdCkocmVnX3ZhbCAmMHgwMDAwMDBGRikpOyAKKyAgICBpZihsZW5SZXMgPCAwIHx8IGxlblJlcyA+PSBsZW5CdWYpCisgICAgeworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGJ1ZiArPSBsZW5SZXM7CisgICAgbGVuQnVmIC09IGxlblJlczsKKworICAgIGxlblJlcyA9IHNucHJpbnRmKGJ1ZiwgbGVuQnVmLCAiJXMtIiwgUVdMQU5fVkVSU0lPTlNUUik7CisgICAgaWYobGVuUmVzIDwgMCB8fCBsZW5SZXMgPj0gbGVuQnVmKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBidWYgKz0gbGVuUmVzOworICAgIGxlbkJ1ZiAtPSBsZW5SZXM7CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgcEZ3VmVyc2lvbiA9ICZwTXNnQm9keS0+R2V0QnVpbGRSZWxlYXNlTnVtYmVyLnJlbFBhcmFtcy5md1ZlcjsKKyAgICBsZW5SZXMgPSBzbnByaW50ZihidWYsIGxlbkJ1ZiwgIiVsZC4lbGQuJWxkLiVsZCIsIHBGd1ZlcnNpb24tPnVNaixwRndWZXJzaW9uLT51TW4scEZ3VmVyc2lvbi0+dVBhdGNoLHBGd1ZlcnNpb24tPnVCdWlsZCApIDsKKyAgICBpZihsZW5SZXMgPCAwIHx8IGxlblJlcyA+PSBsZW5CdWYpCisgICAgeworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGJ1ZiArPSBsZW5SZXM7CisgICAgbGVuQnVmIC09IGxlblJlczsKKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCitkb25lOgorICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QgKiApcE1zZ0J1Zik7CisKKyAgICByZXR1cm4gc3RhdHVzOworCit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2Z0bV9wcml2X2dldF90eHJhdGUoKSAtCisKKyAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgVFggcmF0ZSBmcm9tIHRoZSBoYWxwaHkgcHR0IG1vZHVsZSBhbmQKKyAgIHJldHVybnMgdGhlIFRYIHJhdGUgdG8gdGhlIGFwcGxpY2F0aW9uLgorCisgIFxwYXJhbSAgLSBwQWRhcHRlciAtIFBvaW50ZXIgSEREIENvbnRleHQuCisgICAgICAgICAgICAgIC0gcFR4UmF0ZSAgIC0gIFBvbml0ZXIgdG8gZ2V0IHRoZSBUeCByYXRlLgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFZPU19TVEFUVVMgd2xhbl9mdG1fcHJpdl9nZXRfdHhyYXRlKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLGNoYXIgKnBUeFJhdGUpCit7CisgICAgdFB0dE1zZ2J1ZmZlciAqcE1zZ0J1ZjsKKyAgICB1UHR0TXNncyAqcE1zZ0JvZHk7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgdl9VMTZfdCByYXRlX2luZGV4LGlpOworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXBBZGFwdGVyLT5wSGRkQ3R4OworCisgICAgaWYocEhkZEN0eC0+ZnRtLmZ0bV9zdGF0ZSAhPSBXTEFOX0ZUTV9TVEFSVEVEKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpGdG0gaGFzIG5vdCBzdGFydGVkLiBQbGVhc2Ugc3RhcnQgdGhlIGZ0bS4gIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwTXNnQnVmID0gKHRQdHRNc2didWZmZXIgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFB0dE1zZ2J1ZmZlcikpOworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6cE1zZ0J1ZiBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgfQorICAgIGluaXRfY29tcGxldGlvbigmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3Zhcik7CisgICAgcE1zZ0J1Zi0+bXNnSWQgPSBQVFRfTVNHX0dFVF9UWF9QT1dFUl9SRVBPUlQ7CisgICAgcE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCA9IHNpemVvZih0TXNnUHR0R2V0VHhQb3dlclJlcG9ydCkgKyBQVFRfSEVBREVSX0xFTkdUSDsKKworICAgIHBNc2dCb2R5ID0gJnBNc2dCdWYtPm1zZ0JvZHk7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7CisKKyAgICBpZihwTXNnQnVmLT5tc2dSZXNwb25zZSA9PSBQVFRfU1RBVFVTX1NVQ0NFU1MpIHsKKworICAgICAgIHJhdGVfaW5kZXggPSBwTXNnQm9keS0+R2V0VHhQb3dlclJlcG9ydC5yYXRlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAvKlJldHVybiB0aGUgZGVmYXVsdCByYXRlKi8KKyAgICAgICAvL3JhdGVfaW5kZXggPSBIQUxfUEhZX1JBVEVfMTFBXzZfTUJQUzsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogUFRUX01TR19HRVRfVFhfUE9XRVJfUkVQT1JUIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGZvcihpaSA9IDA7IGlpIDwgU0laRV9PRl9UQUJMRShyYXRlTmFtZV9yYXRlSW5kZXhfdGJsKTsgaWkrKykgeworICAgICAgICBpZihyYXRlTmFtZV9yYXRlSW5kZXhfdGJsW2lpXS5yYXRlX2luZGV4ID09IHJhdGVfaW5kZXgpCisgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmKGlpID49IFNJWkVfT0ZfVEFCTEUocmF0ZU5hbWVfcmF0ZUluZGV4X3RibCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkludmFsaWQgUmF0ZSBJbmRleFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHN0cmxjcHkocFR4UmF0ZSxyYXRlTmFtZV9yYXRlSW5kZXhfdGJsW2lpXS5yYXRlX3N0ciwgV0VfRlRNX01BWF9TVFJfTEVOKTsKK2RvbmU6CisgICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCAqIClwTXNnQnVmKTsKKworICAgIHJldHVybiBzdGF0dXM7CisKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5fZnRtX3ByaXZfZ2V0X3J4X3BrdF9jb3VudCgpIC0KKworICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSByeCBwa3QgY291bnQgZnJvbSB0aGUgaGFscGh5IHB0dCBtb2R1bGUgYW5kCisgICByZXR1cm5zIHRoZSByeCBwa3QgY291bnQgIHRvIHRoZSBhcHBsaWNhdGlvbi4KKworICBccGFyYW0gIC0gcEFkYXB0ZXIgLSBQb2ludGVyIEhERCBDb250ZXh0LgorICAgICAgICAgICAgICAtIHBSeFBrdENudCAgIC0gIFBvbml0ZXIgdG8gZ2V0IHRoZSByeCBwa3QgY291bnQuCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgVk9TX1NUQVRVUyB3bGFuX2Z0bV9wcml2X2dldF9yeF9wa3RfY291bnQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsdl9VMTZfdCAqcFJ4UGt0Q250KQoreworICAgIHRQdHRNc2didWZmZXIgKnBNc2dCdWY7CisgICAgdVB0dE1zZ3MgKnBNc2dCb2R5OworICAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXBBZGFwdGVyLT5wSGRkQ3R4OworCisgICAgaWYocEhkZEN0eC0+ZnRtLmZ0bV9zdGF0ZSAhPSBXTEFOX0ZUTV9TVEFSVEVEKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpGdG0gaGFzIG5vdCBzdGFydGVkLiBQbGVhc2Ugc3RhcnQgdGhlIGZ0bS4gIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisgICAgcE1zZ0J1ZiA9ICh0UHR0TXNnYnVmZmVyICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRQdHRNc2didWZmZXIpKTsKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOnBNc2dCdWYgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgIH0KKyAgICBpbml0X2NvbXBsZXRpb24oJnBIZGRDdHgtPmZ0bS5mdG1fY29tcF92YXIpOworICAgIHBNc2dCdWYtPm1zZ0lkID0gUFRUX01TR19HRVRfUlhfUEtUX0NPVU5UUzsKKyAgICBwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoID0gc2l6ZW9mKHRNc2dQdHRHZXRSeFBrdENvdW50cykgKyBQVFRfSEVBREVSX0xFTkdUSDsKKworICAgIHBNc2dCb2R5ID0gJnBNc2dCdWYtPm1zZ0JvZHk7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7CisKKyAgICBpZihwTXNnQnVmLT5tc2dSZXNwb25zZSAhPSBQVFRfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOlB0dCByZXNwb25zZSBzdGF0dXMgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgICpwUnhQa3RDbnQgPSBwTXNnQm9keS0+R2V0UnhQa3RDb3VudHMuY291bnRlcnMudG90YWxSeFBhY2tldHM7Citkb25lOgorICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QgKiApcE1zZ0J1Zik7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgd2xhbl9mdG1fcHJpdl9nZXRfcnhfcnNzaSgpIC0KKworICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSByeCByc3NpIGZyb20gdGhlIGhhbHBoeSBwdHQgbW9kdWxlIGFuZAorICAgcmV0dXJucyB0aGUgcnggcnNzaSB0byB0aGUgYXBwbGljYXRpb24uCisKKyAgXHBhcmFtICAtIHBBZGFwdGVyIC0gUG9pbnRlciBIREQgQ29udGV4dC4KKyAgICAgICAgICAgICAgLSBidWYgICAtICBQb25pdGVyIHRvIGdldCByc3NpIG9mIFJ4IGNoYWlucworCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFZPU19TVEFUVVMgd2xhbl9mdG1fcHJpdl9nZXRfcnhfcnNzaShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcixjaGFyICpidWYpCit7CisgICAgdFB0dE1zZ2J1ZmZlciAqcE1zZ0J1ZjsKKyAgICB1UHR0TXNncyAqcE1zZ0JvZHk7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisgICBpbnQgcmV0OworICAgCisgICAgaWYocEhkZEN0eC0+ZnRtLmZ0bV9zdGF0ZSAhPSBXTEFOX0ZUTV9TVEFSVEVEKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpGdG0gaGFzIG5vdCBzdGFydGVkLiBQbGVhc2Ugc3RhcnQgdGhlIGZ0bS4gIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisgICAgcE1zZ0J1ZiA9ICh0UHR0TXNnYnVmZmVyICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRQdHRNc2didWZmZXIpKTsKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOnBNc2dCdWYgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgIH0KKyAgICBpbml0X2NvbXBsZXRpb24oJnBIZGRDdHgtPmZ0bS5mdG1fY29tcF92YXIpOworICAgIHBNc2dCdWYtPm1zZ0lkID0gUFRUX01TR19HRVRfUlhfUlNTSTsKKyAgICBwTXNnQnVmLT5tc2dCb2R5TGVuZ3RoID0gc2l6ZW9mKHRNc2dQdHRHZXRSeFJzc2kpICsgUFRUX0hFQURFUl9MRU5HVEg7CisKKyAgICBwTXNnQm9keSA9ICZwTXNnQnVmLT5tc2dCb2R5OworCisgICAgc3RhdHVzID0gd2xhbl9mdG1fcG9zdG1zZygodl9VOF90KilwTXNnQnVmLHBNc2dCdWYtPm1zZ0JvZHlMZW5ndGgpOworCisgICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6d2xhbl9mdG1fcG9zdG1zZyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBIZGRDdHgtPmZ0bS5mdG1fY29tcF92YXIsIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9GVE1fQ09NTUFORF9USU1FX09VVCkpOworCisgICAgaWYocE1zZ0J1Zi0+bXNnUmVzcG9uc2UgIT0gUFRUX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpQdHQgcmVzcG9uc2Ugc3RhdHVzIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgcmV0ID0gc25wcmludGYoYnVmLCBXRV9GVE1fTUFYX1NUUl9MRU4sICIgUjA6JWQsIFIxOiVkIiwgCisgICAgICAgICAgICAgICAgICAgICAgcE1zZ0JvZHktPkdldFJ4UnNzaS5yc3NpLnJ4WzBdLCAKKyAgICAgICAgICAgICAgICAgIHBNc2dCb2R5LT5HZXRSeFJzc2kucnNzaS5yeFsxXSk7CisKKyAgIGlmKCByZXQgPCAwIHx8IHJldCA+PSBXRV9GVE1fTUFYX1NUUl9MRU4gKQorICAgeworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICAKK2RvbmU6CisgICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCAqIClwTXNnQnVmKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB3bGFuX2Z0bV9wcml2X2dldF9tYWNfYWRkcmVzcygpIC0KKworICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBtYWMgYWRkcmVzcyBmcm9tIHRoZSBoYWxwaHkgcHR0IG1vZHVsZSBhbmQKKyAgIHJldHVybnMgdGhlIG1hYyBhZGRyZXNzICB0byB0aGUgYXBwbGljYXRpb24uCisKKyAgXHBhcmFtICAtIHBBZGFwdGVyIC0gUG9pbnRlciBIREQgQ29udGV4dC4KKyAgICAgICAgICAgICAgLSBidWYgICAtICBQb25pdGVyIHRvIGdldCB0aGUgbWFjIGFkZHJlc3MuCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgVk9TX1NUQVRVUyB3bGFuX2Z0bV9wcml2X2dldF9tYWNfYWRkcmVzcyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcixjaGFyICpidWYpCit7CisgICAgdl9CT09MX3QgaXRlbUlzVmFsaWQgPSBWT1NfRkFMU0U7CisgICAgdl9VOF90IG1hY0FkZHJbVk9TX01BQ19BRERSRVNTX0xFTl0gPSB7MCwgMHgwYSwgMHhmNSwgNCw1LCA2fTsKKyAgICBpbnQgcmV0OworICAgCisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopcEFkYXB0ZXItPnBIZGRDdHg7CisKKyAgICBpZihwSGRkQ3R4LT5mdG0uZnRtX3N0YXRlICE9IFdMQU5fRlRNX1NUQVJURUQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZ0bSBoYXMgbm90IHN0YXJ0ZWQuIFBsZWFzZSBzdGFydCB0aGUgZnRtLiAiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKyAgICAvKkNoZWNrIHRoZSBOViBGSUVMRCBpcyB2YWxpZCBvciBub3QqLworICAgIGlmICh2b3NfbnZfZ2V0VmFsaWRpdHkoVk5WX0ZJRUxEX0lNQUdFLCAmaXRlbUlzVmFsaWQpID09IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgaWYgKGl0ZW1Jc1ZhbGlkID09IFZPU19UUlVFKSAKKyAgICAgICB7CisgICAgICAgICAgICB2b3NfbnZfcmVhZE1hY0FkZHJlc3MobWFjQWRkcik7CisKKyAgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgV0VfRlRNX01BWF9TVFJfTEVOLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwgCisgICAgICAgICAgICAgICAgICAgICAgICBNQUNfQUREUl9BUlJBWShtYWNBZGRyKSk7CisgICAgICAgICBpZiggcmV0IDwgMCB8fCByZXQgPj0gV0VfRlRNX01BWF9TVFJfTEVOICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICB9CisgICAgICAgfQorICAgfQorICAgZWxzZSAKKyAgIHsKKyAgICAgICAgIC8qUmV0dXJuIEhhcmQgY29kZWQgbWFjIGFkZHJlc3MqLworICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBXRV9GVE1fTUFYX1NUUl9MRU4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsIAorICAgICAgICAgICAgICAgICAgICAgTUFDX0FERFJfQVJSQVkobWFjQWRkcikpOworCisgICAgICBpZiggcmV0IDwgMCB8fCByZXQgPj0gV0VfRlRNX01BWF9TVFJfTEVOICkKKyAgICAgIHsKKyAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisgICB9CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5fZnRtX3ByaXZfc2V0X21hY19hZGRyZXNzKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIG1hYyBhZGRyZXNzIHRvIHRoZSBoYWxwaHkgcHR0IG1vZHVsZSBhbmQKKyAgIHNlbmRzIHRoZSBuZXRsaW5rIG1lc3NhZ2UgdG8gdGhlIHB0dCBzb2NrZXQgYXBwbGljYXRpb24gd2hpY2ggd3JpdGVzCisgICB0aGUgbWFjYWRkcmVzcyB0byB0aGUgcWNvbV93bGFuX252LmJpbiBmaWxlCisKKyAgXHBhcmFtICAtIHBBZGFwdGVyIC0gUG9pbnRlciBIREQgQ29udGV4dC4KKyAgICAgICAgICAgICAgLSBidWYgICAtICBQb25pdGVyIHRvIHRoZSBtYWNhZGRyZXNzLgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFZPU19TVEFUVVMgd2xhbl9mdG1fcHJpdl9zZXRfbWFjX2FkZHJlc3MoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsY2hhciAqYnVmKQoreworICAgIHRQdHRNc2didWZmZXIgKnBNc2dCdWY7CisgICAgdVB0dE1zZ3MgKnBNc2dCb2R5OworICAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgIGludCBtYWNBZGRyW1ZPU19NQUNfQUREUkVTU19MRU5dOworICAgIHZfVThfdCAqcE1hY0FkZHJlc3M7CisgICAgdl9VOF90ICBpaTsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKilwQWRhcHRlci0+cEhkZEN0eDsKKworICAgIGlmKHBIZGRDdHgtPmZ0bS5mdG1fc3RhdGUgIT0gV0xBTl9GVE1fU1RBUlRFRCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6RnRtIGhhcyBub3Qgc3RhcnRlZC4gUGxlYXNlIHN0YXJ0IHRoZSBmdG0uICIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorICAgIHBNc2dCdWYgPSAodFB0dE1zZ2J1ZmZlciAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0UHR0TXNnYnVmZmVyKSk7CisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpwTXNnQnVmIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgICB9CisgICAgaW5pdF9jb21wbGV0aW9uKCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyKTsKKyAgICBwTXNnQnVmLT5tc2dJZCA9IFBUVF9NU0dfU0VUX05WX0ZJRUxEOworICAgIHBNc2dCdWYtPm1zZ0JvZHlMZW5ndGggPSBzaXplb2YodE1zZ1B0dFNldE52RmllbGQpICsgUFRUX0hFQURFUl9MRU5HVEg7CisKKyAgICBwTXNnQm9keSA9ICZwTXNnQnVmLT5tc2dCb2R5OworICAgIHBNc2dCb2R5LT5TZXROdkZpZWxkLm52RmllbGQgPSBOVl9DT01NT05fTUFDX0FERFI7CisKKyAgICAvKldlIGdldCB0aGUgbWFjIGFkZHJlc3MgaW4gc3RyaW5nIGZvcm1hdCAiWFg6WFg6WFg6WFg6WFg6WFgiIGNvbnZlcnQgdG8gaGV4Ki8KKyAgICBzc2NhbmYoYnVmLCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsJm1hY0FkZHJbMF0sKGludCopJm1hY0FkZHJbMV0sKGludCopJm1hY0FkZHJbMl0sKGludCopJm1hY0FkZHJbM10sKGludCopJm1hY0FkZHJbNF0sKGludCopJm1hY0FkZHJbNV0pOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTWFjQWRkcmVzcyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IixNQUNfQUREUl9BUlJBWShtYWNBZGRyKSk7CisKKworICAgIHBNYWNBZGRyZXNzID0gJnBNc2dCb2R5LT5TZXROdkZpZWxkLmZpZWxkRGF0YS5tYWNBZGRyWzBdOworCisgICAgZm9yKGlpID0gMDsgaWkgPCBWT1NfTUFDX0FERFJFU1NfTEVOOyBpaSsrKQorICAgICAgIHBNYWNBZGRyZXNzW2lpXSA9ICh2X1U4X3QpbWFjQWRkcltpaV07CisKKworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgInBNYWNBZGRyZXNzID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLE1BQ19BRERSX0FSUkFZKHBNYWNBZGRyZXNzKSk7CisgICAgc3RhdHVzID0gd2xhbl9mdG1fcG9zdG1zZygodl9VOF90KilwTXNnQnVmLHBNc2dCdWYtPm1zZ0JvZHlMZW5ndGgpOworCisgICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6d2xhbl9mdG1fcG9zdG1zZyBmYWlsZWQhISIsX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7CisKKyAgICBpZihwTXNnQnVmLT5tc2dSZXNwb25zZSAhPSBQVFRfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOlB0dCByZXNwb25zZSBzdGF0dXMgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiTlZfQ09NTU9OX01BQ19BRERSIFN1Y2Nlc3MhISFcbiIpOworCisgICAgaW5pdF9jb21wbGV0aW9uKCZwSGRkQ3R4LT5mdG0uZnRtX2NvbXBfdmFyKTsKKyAgICBtZW1zZXQoIHBNc2dCdWYsMCxzaXplb2YodFB0dE1zZ2J1ZmZlcikpOworCisgICAgcE1zZ0J1Zi0+bXNnSWQgPSBQVFRfTVNHX1NUT1JFX05WX1RBQkxFOworICAgIHBNc2dCdWYtPm1zZ0JvZHlMZW5ndGggPSBzaXplb2YodE1zZ1B0dFN0b3JlTnZUYWJsZSkgKyBQVFRfSEVBREVSX0xFTkdUSDsKKworICAgIHBNc2dCb2R5ID0gJnBNc2dCdWYtPm1zZ0JvZHk7CisKKyAgICBwTXNnQm9keS0+U3RvcmVOdlRhYmxlLm52VGFibGUgPSBOVl9GSUVMRFNfSU1BR0U7CisKKyAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wb3N0bXNnKCh2X1U4X3QqKXBNc2dCdWYscE1zZ0J1Zi0+bXNnQm9keUxlbmd0aCk7CisKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczp3bGFuX2Z0bV9wb3N0bXNnIGZhaWxlZCEhISEiLF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEhkZEN0eC0+ZnRtLmZ0bV9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcyhXTEFOX0ZUTV9DT01NQU5EX1RJTUVfT1VUKSk7Citkb25lOgorICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QgKiApcE1zZ0J1Zik7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKiBzZXQgcGFyYW0gc3ViLWlvY3RscyAqLworc3RhdGljIGludCBpd19mdG1fc2V0Y2hhcl9nZXRub25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGludCBzdWJfY21kID0gd3JxdS0+ZGF0YS5mbGFnczsKKyAgICBpbnQgcmV0ID0gMDsgLyogc3VjZXNzICovCisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFJlY2VpdmVkIGxlbmd0aCAlZCIsIF9fRlVOQ1RJT05fXywgd3JxdS0+ZGF0YS5sZW5ndGgpOworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogUmVjZWl2ZWQgZGF0YSAlcyIsIF9fRlVOQ1RJT05fXywgKGNoYXIqKXdycXUtPmRhdGEucG9pbnRlcik7CisKKyAgICBzd2l0Y2goc3ViX2NtZCkKKyAgICB7CisgICAgICAgY2FzZSBXRV9TRVRfTUFDX0FERFJFU1M6CisgICAgICAgeworCisgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIlNFVCBNQUMgQUREUkVTU1xuIik7CisKKyAgICAgICAgICBzdGF0dXMgID0gd2xhbl9mdG1fcHJpdl9zZXRfbWFjX2FkZHJlc3MocEFkYXB0ZXIsKGNoYXIqKXdycXUtPmRhdGEucG9pbnRlcik7CisKKyAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCJ3bGFuX2Z0bV9wcml2X3NldF9tYWNfYWRkcmVzcyBGYWlsZWQgPSVkXG4iLHN0YXR1cyk7CisgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICB9CisKKyAgICAgICB9CisgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBXRV9TRVRfVFhfUkFURToKKyAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgID0gd2xhbl9mdG1fcHJpdl9zZXRfdHhyYXRlKHBBZGFwdGVyLChjaGFyKil3cnF1LT5kYXRhLnBvaW50ZXIpOworCisgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwid2xhbl9mdG1fcHJpdl9zZXRfdHhyYXRlIEZhaWxlZCA9JWRcbiIsc3RhdHVzKTsKKyAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgZGVmYXVsdDoKKyAgICAgICB7CisgICAgICAgICAgIGhkZExvZyhMT0dFLCAiJXM6IEludmFsaWQgc3ViIGNvbW1hbmQgJWRcbiIsX19GVU5DVElPTl9fLCBzdWJfY21kKTsKKyAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGl3X2Z0bV9zZXRpbnRfZ2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKyAgICBpbnQgKnZhbHVlID0gKGludCAqKWV4dHJhOworICAgIGludCBzdWJfY21kID0gdmFsdWVbMF07CisgICAgaW50IHNldF92YWx1ZSA9IHZhbHVlWzFdOworICAgIGludCByZXQgPSAwOyAvKiBzdWNjZXNzICovCisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisKKyAgICBzd2l0Y2goc3ViX2NtZCkKKyAgICB7CisgICAgICAgIGNhc2UgV0VfRlRNX09OX09GRjoKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzICA9IHdsYW5fZnRtX3ByaXZfc3RhcnRfc3RvcF9mdG0ocEFkYXB0ZXIsc2V0X3ZhbHVlKTsKKworICAgICAgICAgICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzIEZhaWxlZCA9JWRcbiIsX19GVU5DVElPTl9fLCBzdGF0dXMpOworICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFdFX1RYX1BLVF9HRU46CisgICAgICAgICAgICBzdGF0dXMgID0gd2xhbl9mdG1fcHJpdl9zdGFydF9zdG9wX3R4X3BrdGdlbihwQWRhcHRlcixzZXRfdmFsdWUpOworCisgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwid2xhbl9mdG1fcHJpdl9zdGFydF9zdG9wX3R4X3BrdGdlbiBGYWlsZWQgPSVkXG4iLHN0YXR1cyk7CisgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXRV9TRVRfVFhfSUZTOgorICAgICAgICAgICAgc3RhdHVzICA9IHdsYW5fZnRtX3ByaXZfc2V0X3R4aWZzKHBBZGFwdGVyLHNldF92YWx1ZSk7CisKKyAgICAgICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCJ3bGFuX2Z0bV9wcml2X3NldF90eGlmcyBGYWlsZWQgPSVkXG4iLHN0YXR1cyk7CisgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXRV9TRVRfVFhfUEtUX0NOVDoKKyAgICAgICAgICAgIHN0YXR1cyAgPSB3bGFuX2Z0bV9wcml2X3NldF90eHBrdGNudChwQWRhcHRlcixzZXRfdmFsdWUpOworCisgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwid2xhbl9mdG1fcHJpdl9zZXRfdHhwa3RjbnQgRmFpbGVkID0lZFxuIixzdGF0dXMpOworICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0VfU0VUX1RYX1BLVF9MRU46CisgICAgICAgICAgICBzdGF0dXMgID0gd2xhbl9mdG1fcHJpdl9zZXRfdHhwa3RsZW4ocEFkYXB0ZXIsc2V0X3ZhbHVlKTsKKworICAgICAgICAgICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIndsYW5fZnRtX3ByaXZfc2V0X3R4cGt0bGVuIEZhaWxlZCA9JWRcbiIsc3RhdHVzKTsKKyAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdFX1NFVF9DSEFOTkVMOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgID0gd2xhbl9mdG1fcHJpdl9zZXRfY2hhbm5lbChwQWRhcHRlcixzZXRfdmFsdWUpOworCisgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwid2xhbl9mdG1fcHJpdl9zZXRfY2hhbm5lbCBGYWlsZWQgPSVkXG4iLHN0YXR1cyk7CisgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXRV9TRVRfVFhfUE9XRVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyAgPSB3bGFuX2Z0bV9wcml2X3NldF90eHBvd2VyKHBBZGFwdGVyLHNldF92YWx1ZSk7CisKKyAgICAgICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCJ3bGFuX2Z0bV9wcml2X3NldF90eHBvd2VyIEZhaWxlZCA9JWRcbiIsc3RhdHVzKTsKKyAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdFX0NMRUFSX1JYX1BLVF9DTlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyAgPSB3bGFuX2Z0bV9wcml2X3J4X3BrdF9jbGVhcihwQWRhcHRlcixzZXRfdmFsdWUpOworCisgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwid2xhbl9mdG1fcHJpdl9yeF9wa3RfY2xlYXIgRmFpbGVkID0lZFxuIixzdGF0dXMpOworICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfUlg6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyAgPSB3bGFuX2Z0bV9wcml2X3J4X21vZGUocEFkYXB0ZXIsc2V0X3ZhbHVlKTsKKworICAgICAgICAgICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIndsYW5fZnRtX3ByaXZfcnhfbW9kZSBGYWlsZWQgPSVkXG4iLHN0YXR1cyk7CisgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXRV9FTkFCTEVfQ0hBSU46CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyAgPSB3bGFuX2Z0bV9wcml2X2VuYWJsZV9jaGFpbihwQWRhcHRlcixzZXRfdmFsdWUpOworCisgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwid2xhbl9mdG1fcHJpdl9lbmFibGVfY2hhaW4gRmFpbGVkID0lZFxuIixzdGF0dXMpOworICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKExPR0UsICJJbnZhbGlkIElPQ1RMIHNldHZhbHVlIGNvbW1hbmQgJWQgdmFsdWUgJWQgXG4iLAorICAgICAgICAgICAgICAgIHN1Yl9jbWQsIHNldF92YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIGdldCBwYXJhbSBzdWItaW9jdGxzICovCitzdGF0aWMgaW50IGl3X2Z0bV9zZXRub25lX2dldGludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKyAgICBpbnQgKnZhbHVlID0gKGludCAqKWV4dHJhOworICAgIGludCByZXQgPSAwOyAvKiBzdWNlc3MgKi8KKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgIHN3aXRjaCAodmFsdWVbMF0pCisgICAgeworICAgICAgICBjYXNlIFdFX0dFVF9DSEFOTkVMOgorICAgICAgICB7CisgICAgICAgICAgIHN0YXR1cyA9IHdsYW5fZnRtX3ByaXZfZ2V0X2NoYW5uZWwocEFkYXB0ZXIsKHZfVTE2X3QqKXZhbHVlKTsKKworICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIndsYW5fZnRtX3ByaXZfZ2V0X2NoYW5uZWwgRmFpbGVkID0lZFxuIixzdGF0dXMpOworICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICB9CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfR0VUX1RYX1BPV0VSOgorICAgICAgICB7CisgICAgICAgICAgIHN0YXR1cyA9IHdsYW5fZnRtX3ByaXZfZ2V0X3R4cG93ZXIocEFkYXB0ZXIsKHZfVTE2X3QqKXZhbHVlKTsKKworICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIndsYW5fZnRtX3ByaXZfZ2V0X3R4cG93ZXIgRmFpbGVkID0lZFxuIixzdGF0dXMpOworICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICB9CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfR0VUX1JYX1BLVF9DTlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgc3RhdHVzID0gd2xhbl9mdG1fcHJpdl9nZXRfcnhfcGt0X2NvdW50KHBBZGFwdGVyLCh2X1UxNl90Kil2YWx1ZSk7CisKKyAgICAgICAgICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCJ3bGFuX2Z0bV9wcml2X2dldF9yeF9wa3RfY291bnQgRmFpbGVkID0lZFxuIixzdGF0dXMpOworICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICB9CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhMT0dFLCAiSW52YWxpZCBJT0NUTCBnZXRfdmFsdWUgY29tbWFuZCAlZCAiLHZhbHVlWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpd19mdG1fZ2V0X2NoYXJfc2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBpbnQgc3ViX2NtZCA9IHdycXUtPmRhdGEuZmxhZ3M7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisKKyAgICBzd2l0Y2goc3ViX2NtZCkKKyAgICB7CisgICAgICAgIGNhc2UgV0VfR0VUX01BQ19BRERSRVNTOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wcml2X2dldF9tYWNfYWRkcmVzcyhwQWRhcHRlciwgZXh0cmEpOworCisgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICJ3bGFuX2Z0bV9wcml2X2dldF9tYWNfYWRkcmVzcyBmYWlsZWQgPSVkXG4iLHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSkrMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfR0VUX1RYX1JBVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHdsYW5fZnRtX3ByaXZfZ2V0X3R4cmF0ZShwQWRhcHRlciwgZXh0cmEpOworCisgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICJ3bGFuX2Z0bV9wcml2X2dldF90eHJhdGUgZmFpbGVkID0lZFxuIixzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSkrMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfR0VUX0ZUTV9WRVJTSU9OOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSB3bGFuX2Z0bV9wcml2X2dldF9mdG1fdmVyc2lvbihwQWRhcHRlciwgZXh0cmEpOworCisgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICJ3bGFuX2Z0bV9wcml2X2dldF9tYWNfYWRkcmVzcyBmYWlsZWQgPSVkXG4iLHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSkrMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfR0VUX0ZUTV9TVEFUVVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHdsYW5fZnRtX3ByaXZfZ2V0X3N0YXR1cyhwQWRhcHRlciwgZXh0cmEpOworCisgICAgICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICJ3bGFuX2Z0bV9wcml2X2dldF9zdGF0dXMgZmFpbGVkID0lZFxuIixzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSkrMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfR0VUX1JYX1JTU0k6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHdsYW5fZnRtX3ByaXZfZ2V0X3J4X3Jzc2kocEFkYXB0ZXIsIGV4dHJhKTsKKworICAgICAgICAgICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAid2xhbl9mdG1fcHJpdl9nZXRfcnhfcnNzaSBmYWlsZWQgPSVkXG4iLHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSsxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKExPR0UsICJJbnZhbGlkIElPQ1RMIGNvbW1hbmQgJWQgIFxuIiwgIHN1Yl9jbWQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYvL0FOSV9NQU5GX0RJQUcKKworVk9TX1NUQVRVUyB3bGFuX3dyaXRlX3RvX2VmcyAodl9VOF90ICpwRGF0YSwgdl9VMTZfdCBkYXRhX2xlbikKK3sKKyNpZiBkZWZpbmVkKEFOSV9NQU5GX0RJQUcpICYmIGRlZmluZWQoTVNNX1BMQVRGT1JNKQorICAgIHRBbmlIZHIgKndtc2cgPSBOVUxMOworICAgIHZfVThfdCAqcEJ1ZjsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKyAgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dD0gTlVMTDsKKworICAgIHBCdWYgPSAgKHZfVThfdCopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRBbmlIZHIpICsgc2l6ZW9mKHZfVTMyX3QpKyBkYXRhX2xlbik7CisgICAgaWYocEJ1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpwQnVmIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgICB9CisgICAgd21zZyA9ICh0QW5pSGRyKilwQnVmOworICAgIHdtc2ctPnR5cGUgPSBQVFRfTVNHX0ZUTV9DTURTX1RZUEU7CisgICAgd21zZy0+bGVuZ3RoID0gZGF0YV9sZW4gKyBzaXplb2YodEFuaUhkcikrIHNpemVvZih2X1UzMl90KTsKKyAgICB3bXNnLT5sZW5ndGggPSBGVE1fU1dBUDE2KHdtc2ctPmxlbmd0aCk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFuaUhkcik7CisKKyAgICAgLypHZXQgdGhlIGdsb2JhbCBjb250ZXh0ICovCisgICAgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU1lTLCBOVUxMKTsKKworICAgICAvKkdldCB0aGUgSGRkIENvbnRleHQgKi8KKyAgICAvL3BBZGFwdGVyID0gKChWb3NDb250ZXh0VHlwZSopKHBWb3NDb250ZXh0KSktPnBIRERDb250ZXh0OworICAgIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKSgoKFZvc0NvbnRleHRUeXBlKikocFZvc0NvbnRleHQpKS0+cEhERENvbnRleHQpOworCisgICAgLyogRWZTIGNvbW1hbmQgQ29kZSAqLworICAgICoodl9VMzJfdCopcEJ1ZiA9IDB4MDAwMDAwRUY7CisKKyAgICBwQnVmICs9IHNpemVvZih2X1UzMl90KTsKKworICAgIG1lbWNweShwQnVmLCBwRGF0YSxkYXRhX2xlbik7CisKKyAgIGlmKHBIZGRDdHgtPmZ0bS5jbWRfaXdwcml2ID09IFRSVUUpIHsKKyAgICAgICBpZiggcHR0X3NvY2tfc2VuZF9tc2dfdG9fYXBwKHdtc2csIDAsIEFOSV9OTF9NU0dfUFVNQUMsIHBIZGRDdHgtPnB0dF9waWQpIDwgMCkgeworCisgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAoIlB0dCBTb2NrZXQgZXJyb3Igc2VuZGluZyBtZXNzYWdlIHRvIHRoZSBhcHAhIVxuIikpOworICAgICAgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90Kil3bXNnKTsKKyAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgIH0KKyAgIH0KKyAgIGVsc2UgeworICAgIGlmKCBwdHRfc29ja19zZW5kX21zZ190b19hcHAod21zZywgMCwgQU5JX05MX01TR19QVU1BQywgcEhkZEN0eC0+ZnRtLndubC0+bmxoLm5sbXNnX3BpZCkgPCAwKSB7CisKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICgiUHR0IFNvY2tldCBlcnJvciBzZW5kaW5nIG1lc3NhZ2UgdG8gdGhlIGFwcCEhXG4iKSk7CisgICAgICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QqKXdtc2cpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorICAgfQorCisgICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCopd21zZyk7CisjZW5kaWYgLy9GVE0gYW5kIEFORFJPSUQKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBBTklfTUFORl9ESUFHCisvKiAgYWN0aW9uIHN1Yi1pb2N0bHMgKi8KK3N0YXRpYyBpbnQgaXdfZnRtX3NldG5vbmVfZ2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBpbnQgc3ViX2NtZCA9IHdycXUtPmRhdGEuZmxhZ3M7CisgICAgaW50IHJldCA9IDA7IC8qIHN1Y2VzcyAqLworCisgICAgc3dpdGNoIChzdWJfY21kKQorICAgIHsKKyAgICAgICAgY2FzZSBXRV9TRVRfTlZfREVGQVVMVFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHZfVThfdCAqcHU4YnVmLCpwVGVtcEJ1ZjsKKyAgICAgICAgICAgIHZfVTE2X3Qgc2l6ZTsKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2Yodl9VMzJfdCkgKyBzaXplb2Yoc0hhbE52KTsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCJIQUwgTlYgU2l6ZSA9JWRcbiIsc2l6ZSk7CisgICAgICAgICAgICBwdThidWYgPSB2b3NfbWVtX21hbGxvYyhzaXplKTsKKyAgICAgICAgICAgIGlmKHB1OGJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6cHU4YnVmIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtc2V0KHB1OGJ1ZiwwLHNpemUpOworICAgICAgICAgICAgcFRlbXBCdWYgPSBwdThidWY7CisgICAgICAgICAgICBwVGVtcEJ1ZiArPSBzaXplb2Yodl9VMzJfdCk7CisgICAgICAgICAgICBtZW1jcHkocFRlbXBCdWYsJm52RGVmYXVsdHMsc2l6ZW9mKHNIYWxOdikpOworCisgICAgICAgICAgICB3bGFuX3dyaXRlX3RvX2VmcyhwdThidWYsc2l6ZSk7CisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocHU4YnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogdW5rbm93biBpb2N0bCAlZCIsIF9fRlVOQ1RJT05fXywgc3ViX2NtZCk7CisgICAgICAgICAgICBoZGRMb2coTE9HRSwgIkludmFsaWQgSU9DVEwgYWN0aW9uIGNvbW1hbmQgJWQgIiwgc3ViX2NtZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXdfZnRtX3NldF92YXJfaW50c19nZXRub25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisgICAgaW50IHN1Yl9jbWQgPSB3cnF1LT5kYXRhLmZsYWdzOworICAgIGludCAqdmFsdWUgPSAoaW50Kil3cnF1LT5kYXRhLnBvaW50ZXI7CisgICAgdl9TMTVfdCBwaHlSeENoYWluc1tNQVhfRlRNX1ZBUl9BUkdTXSA9IHswfTsKKworICAgIGlmKHdycXUtPmRhdGEubGVuZ3RoICE9IDIpCisgICAgeworICAgICAgICBoZGRMb2coTE9HRSwgIkludmFsaWQgbnVtYmVyIG9mIEFyZ3VtZW50cyAgJWQgIFxuIiwgIHdycXUtPmRhdGEubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHN3aXRjaCAoc3ViX2NtZCkKKyAgICB7CisgICAgICAgIGNhc2UgV0VfU0VUX1JTU0lfT0ZGU0VUOgorICAgICAgICB7CisgICAgICAgICAgICBwaHlSeENoYWluc1swXSA9ICoodl9TMTVfdCopIHZhbHVlKys7CisgICAgICAgICAgICBwaHlSeENoYWluc1sxXSA9ICoodl9TMTVfdCopIHZhbHVlOworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCJQaHlSeGNoYWluMD0lZCBQaHlSeENoYWluMT0lZFxuIixwaHlSeENoYWluc1swXSxwaHlSeENoYWluc1sxXSk7CisgICAgICAgICAgICB3bGFuX2Z0bV9wcml2X3NldF9yc3NpX29mZnNldChwQWRhcHRlciwgJnBoeVJ4Q2hhaW5zWzBdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coTE9HRSwgIkludmFsaWQgSU9DVEwgY29tbWFuZCAlZCAgXG4iLCAgc3ViX2NtZCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgd2VfZnRtX3ByaXZhdGVbXSA9IHsKKworICAgW1dMQU5fRlRNX1BSSVZfU0VUX0lOVF9HRVRfTk9ORSAgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgID0gaXdfZnRtX3NldGludF9nZXRub25lLCAgLy9zZXQgcHJpdiBpb2N0bAorICAgW1dMQU5fRlRNX1BSSVZfU0VUX05PTkVfR0VUX0lOVCAgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgID0gaXdfZnRtX3NldG5vbmVfZ2V0aW50LCAgLy9nZXQgcHJpdiBpb2N0bAorICAgW1dMQU5fRlRNX1BSSVZfU0VUX0NIQVJfR0VUX05PTkUgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgID0gaXdfZnRtX3NldGNoYXJfZ2V0bm9uZSwgLy9nZXQgcHJpdiBpb2N0bAorICAgW1dMQU5fRlRNX1BSSVZfR0VUX0NIQVJfU0VUX05PTkUgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgID0gaXdfZnRtX2dldF9jaGFyX3NldG5vbmUsCisgICBbV0xBTl9GVE1fUFJJVl9TRVRfTk9ORV9HRVRfTk9ORSAgICAgLSBTSU9DSVdGSVJTVFBSSVZdICAgPSBpd19mdG1fc2V0bm9uZV9nZXRub25lLCAvL2FjdGlvbiBwcml2IGlvY3RsCisgICBbV0xBTl9GVE1fUFJJVl9TRVRfVkFSX0lOVF9HRVRfTk9ORSAgLSBTSU9DSVdGSVJTVFBSSVZdICAgPSBpd19mdG1fc2V0X3Zhcl9pbnRzX2dldG5vbmUsCit9OworCisvKk1heGltdW0gY29tbWFuZCBsZW5ndGggY2FuIGJlIG9ubHkgMTUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHdlX2Z0bV9wcml2YXRlX2FyZ3NbXSA9IHsKKworICAgIC8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisgICAgeyAgIFdMQU5fRlRNX1BSSVZfU0VUX0lOVF9HRVRfTk9ORSwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgIDAsCisgICAgICAgICIiIH0sCisKKyAgICB7ICAgV0VfRlRNX09OX09GRiwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgIDAsCisgICAgICAgICJmdG0iIH0sCisKKyAgICB7ICAgV0VfVFhfUEtUX0dFTiwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgIDAsCisgICAgICAgICJ0eCIgfSwKKworICAgIHsgICBXRV9TRVRfVFhfSUZTLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgMCwKKyAgICAgICAgInNldF90eGlmcyIgfSwKKworICAgIHsgICBXRV9TRVRfVFhfUEtUX0NOVCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgIDAsCisgICAgICAgICJzZXRfdHhwa3RjbnQiIH0sCisKKyAgICB7ICAgV0VfU0VUX1RYX1BLVF9MRU4sCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAwLAorICAgICAgICAic2V0X3R4cGt0bGVuIiB9LAorCisgICAgeyAgIFdFX1NFVF9DSEFOTkVMLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgMCwKKyAgICAgICAgInNldF9jaGFubmVsIiB9LAorCisgICAgeyAgIFdFX1NFVF9UWF9QT1dFUiwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgIDAsCisgICAgICAgICJzZXRfdHhwb3dlciIgfSwKKworICAgIHsgICBXRV9DTEVBUl9SWF9QS1RfQ05ULAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgMCwKKyAgICAgICAgImNscl9yeHBrdGNudCIgfSwKKworICAgIHsgICBXRV9SWCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgIDAsCisgICAgICAgICJyeCIgfSwKKworICAgIHsgICBXRV9FTkFCTEVfQ0hBSU4sCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAwLAorICAgICAgICAiZW5hX2NoYWluIiB9LAorCisgICAgLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKyAgICB7ICAgV0xBTl9GVE1fUFJJVl9TRVRfTk9ORV9HRVRfSU5ULAorICAgICAgICAwLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgIiIgfSwKKworICAgIHsgICBXRV9HRVRfQ0hBTk5FTCwKKyAgICAgICAgMCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgICJnZXRfY2hhbm5lbCIgfSwKKworICAgIHsgICBXRV9HRVRfVFhfUE9XRVIsCisgICAgICAgIDAsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAiZ2V0X3R4cG93ZXIiIH0sCisKKyAgICB7ICAgV0VfR0VUX1JYX1BLVF9DTlQsCisgICAgICAgIDAsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAiZ2V0X3J4cGt0Y250IiB9LAorCisgICAgLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKyAgICB7ICAgV0xBTl9GVE1fUFJJVl9TRVRfQ0hBUl9HRVRfTk9ORSwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0NIQVJ8IDUxMiwKKyAgICAgICAgMCwKKyAgICAgICAgIiIgfSwKKworICAgIHsgICBXRV9TRVRfTUFDX0FERFJFU1MsCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSfCA1MTIsCisgICAgICAgIDAsCisgICAgICAgICJzZXRfbWFjX2FkZHJlc3MiIH0sCisKKyAgICB7ICAgV0VfU0VUX1RYX1JBVEUsCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSIHwgNTEyLAorICAgICAgICAwLAorICAgICAgICAic2V0X3R4cmF0ZSIgfSwKKworICAgIC8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisgICAgeyAgIFdMQU5fRlRNX1BSSVZfR0VUX0NIQVJfU0VUX05PTkUsCisgICAgICAgIDAsCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSfCBXRV9GVE1fTUFYX1NUUl9MRU4sCisgICAgICAgICIiIH0sCisKKyAgICB7ICAgV0VfR0VUX01BQ19BRERSRVNTLAorICAgICAgICAwLAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUnwgV0VfRlRNX01BWF9TVFJfTEVOLAorICAgICAgICAiZ2V0X21hY19hZGRyZXNzIiB9LAorCisgICAgeyAgIFdFX0dFVF9GVE1fVkVSU0lPTiwKKyAgICAgICAgMCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0NIQVJ8IFdFX0ZUTV9NQVhfU1RSX0xFTiwKKyAgICAgICAgImZ0bV92ZXJzaW9uIiB9LAorCisgICAgeyAgIFdFX0dFVF9UWF9SQVRFLAorICAgICAgICAwLAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUnwgV0VfRlRNX01BWF9TVFJfTEVOLAorICAgICAgICAiZ2V0X3R4cmF0ZSIgfSwKKworICAgIHsgICBXRV9HRVRfRlRNX1NUQVRVUywKKyAgICAgICAgMCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0NIQVJ8IFdFX0ZUTV9NQVhfU1RSX0xFTiwKKyAgICAgICAgImdldF9zdGF0dXMiIH0sCisKKyAgICB7ICAgV0VfR0VUX1JYX1JTU0ksCisgICAgICAgIDAsCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSfCBXRV9GVE1fTUFYX1NUUl9MRU4sCisgICAgICAgICJnZXRfcnhfcnNzaSIgfSwKKworICAgIHsgICBXTEFOX0ZUTV9QUklWX1NFVF9WQVJfSU5UX0dFVF9OT05FLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgTUFYX0ZUTV9WQVJfQVJHUywKKyAgICAgICAgMCwKKyAgICAgICAgIiIgfSwKKworICAgIHsgICBXRV9TRVRfUlNTSV9PRkZTRVQsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlR8IE1BWF9GVE1fVkFSX0FSR1MsCisgICAgICAgIDAsCisgICAgICAgICJzZXRfcnNzaV9vZmZzZXQiIH0sCisKKyAgICAvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCAqLworICAgIHsgICBXTEFOX0ZUTV9QUklWX1NFVF9OT05FX0dFVF9OT05FLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAiIiB9LAorCisgICAgLyogaGFuZGxlcnMgZm9yIHN1Yi1pb2N0bCAqLworICAgIHsgICBXRV9TRVRfTlZfREVGQVVMVFMsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgICJzZXRfbnZfZGVmYXVsdHMiIH0sCisKK307CisKK2NvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiB3ZV9mdG1faGFuZGxlcl9kZWYgPSB7CisgICAubnVtX3N0YW5kYXJkICAgICA9IDAsCisgICAubnVtX3ByaXZhdGUgICAgICA9IHNpemVvZih3ZV9mdG1fcHJpdmF0ZSkgLyBzaXplb2Yod2VfZnRtX3ByaXZhdGVbMF0pLAorICAgLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2Yod2VfZnRtX3ByaXZhdGVfYXJncykgLyBzaXplb2Yod2VfZnRtX3ByaXZhdGVfYXJnc1swXSksCisKKyAgIC5zdGFuZGFyZCAgICAgICAgID0gKGl3X2hhbmRsZXIgKilOVUxMLAorICAgLnByaXZhdGUgICAgICAgICAgPSAoaXdfaGFuZGxlciAqKXdlX2Z0bV9wcml2YXRlLAorICAgLnByaXZhdGVfYXJncyAgICAgPSB3ZV9mdG1fcHJpdmF0ZV9hcmdzLAorICAgLmdldF93aXJlbGVzc19zdGF0cyA9IE5VTEwsCit9OworCitzdGF0aWMgaW50IHdsYW5fZnRtX3JlZ2lzdGVyX3dleHQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisKKyAgICAvL2hkZF93ZXh0X3N0YXRlX3QgKnB3ZXh0QnVmID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKworICAgIC8vIFplcm8gdGhlIG1lbW9yeS4gIFRoaXMgemVyb3MgdGhlIHByb2ZpbGUgc3RydWN0dXJlLgorICAgIC8vbWVtc2V0KHB3ZXh0QnVmLCAwLHNpemVvZihoZGRfd2V4dF9zdGF0ZV90KSk7CisgICAKKyAgICBwQWRhcHRlci0+ZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmd2VfZnRtX2hhbmRsZXJfZGVmOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvL0FOSV9NQU5GX0RJQUcKKworVk9TX1NUQVRVUyBXTEFORlRNX01jUHJvY2Vzc01zZyAodl9WT0lEX3QgKm1lc3NhZ2UpCit7CisjaWZkZWYgQU5JX01BTkZfRElBRworICAgIGZ0bV9yc3BfbXNnX3QgICAqcEZ0bU1zZ1JzcDsKKworICAgIFZPU19TVEFUVVMgdm9zX3N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4OworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0PSBOVUxMOworCisgICAgRU5URVIoKTsKKworICAgIHBGdG1Nc2dSc3AgPSAoZnRtX3JzcF9tc2dfdCAqKW1lc3NhZ2U7CisKKyAgICBpZiAoIW1lc3NhZ2UgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXTEFOIEZUTTpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5GVE1fUHJvY2Vzc01haW5NZXNzYWdlIik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgfQorICAgIC8qR2V0IHRoZSBnbG9iYWwgY29udGV4dCAqLworICAgIHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NZUywgTlVMTCk7CisKKyAgICAgLypHZXQgdGhlIEhkZCBDb250ZXh0ICovCisgICAgcEhkZEN0eCA9ICgoVm9zQ29udGV4dFR5cGUqKShwVm9zQ29udGV4dCkpLT5wSEREQ29udGV4dDsKKworICAgIGlmIChwSGRkQ3R4LT5mdG0uY21kX2l3cHJpdiA9PSBUUlVFKSB7CisKKyAgICAgICAgY29tcGxldGUoJnBIZGRDdHgtPmZ0bS5mdG1fY29tcF92YXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAvKlJlc3BvbnNlIGxlbmd0aCB0byBQdHQgQXBwKi8KKyAgICBwSGRkQ3R4LT5mdG0ud25sLT53bXNnLmxlbmd0aCA9IHNpemVvZih0QW5pSGRyKSsgU0laRV9PRl9GVE1fRElBR19IRUFERVJfTEVOICsgcEZ0bU1zZ1JzcC0+bXNnQm9keUxlbmd0aDsKKworICAgICAvKlB0dCBBcHAgZXhwZWN0cyB0aGUgcmVzcG9uc2UgbGVuZ3RoIGluIExFICovCisgICAgcEhkZEN0eC0+ZnRtLndubC0+d21zZy5sZW5ndGggPSBGVE1fU1dBUDE2KHBIZGRDdHgtPmZ0bS53bmwtPndtc2cubGVuZ3RoKTsKKworICAgIC8qUmVzcG9uc2UgZXhwZWN0cyB0aGUgbGVuZ3RoIHRvIGJlIGluICovCisgICAgcEhkZEN0eC0+ZnRtLnBSZXNwb25zZUJ1Zi0+ZnRtX2hkci5kYXRhX2xlbiA9IHBIZGRDdHgtPmZ0bS5wUmVxdWVzdEJ1Zi0+ZnRtX2hkci5kYXRhX2xlbiAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwSGRkQ3R4LT5mdG0ucFJlcXVlc3RCdWYtPmZ0bV9oZHIuZGF0YV9sZW4pOworCisgICAgLypDb3B5IHRoZSBtZXNzYWdlKi8KKyAgICBtZW1jcHkoKGNoYXIqKSZwSGRkQ3R4LT5mdG0ucFJlc3BvbnNlQnVmLT5mdG1wa3QsKGNoYXIqKW1lc3NhZ2UscEZ0bU1zZ1JzcC0+bXNnQm9keUxlbmd0aCk7CisKKyAgICAvKlVwZGF0ZSB0aGUgZXJyb3IgY29kZSovCisgICAgcEhkZEN0eC0+ZnRtLnBSZXNwb25zZUJ1Zi0+ZnRtX2Vycl9jb2RlID0gV0xBTl9GVE1fU1VDQ0VTUzsKKworICAgIHZvc19zdGF0dXMgPSB2b3NfZXZlbnRfc2V0KCZwSGRkQ3R4LT5mdG0uZnRtX3Zvc19ldmVudCk7CisKKyAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3Nfc3RhdHVzKSkKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICgiRVJST1I6IEhERCB2b3NfZXZlbnRfc2V0IGZhaWxlZCEhXG4iKSk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKyAgICB9CisgICAgRVhJVCgpOworI2VuZGlmCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKworfQpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvc3JjL3dsYW5faGRkX2hvc3RhcGQuYyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF9ob3N0YXBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1ZGM5YgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF9ob3N0YXBkLmMKQEAgLTAsMCArMSwyNzUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgd2xhbl9oZGRfaG9zdGFwZC5jCisgIFxicmllZiBXTEFOIEhvc3QgRGV2aWNlIERyaXZlciBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFIAorICAgCisgICAKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuIAorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLiAKKyAgIAorICAkSGVhZGVyOiQgICAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJCAKKyAgIAorICAgCisgIHdoZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5IAorICAtLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMDQvNS8wOSAgICAgU2hhaWxlbmRlciAgICAgQ3JlYXRlZCBtb2R1bGUuIAorICAwNi8wMy8xMCAgICBqcyAtIEFkZGVkIHN1cHBvcnQgdG8gaG9zdGFwZCBkcml2ZW4gZGVhdXRoL2Rpc2Fzc29jL21pYyBmYWlsdXJlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPHZvc19hcGkuaD4KKyNpbmNsdWRlIDx2b3Nfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2luY2x1ZGVzLmg+CisjaW5jbHVkZSA8cWNfc2FwX2lvY3RsLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaG9zdGFwZC5oPgorI2luY2x1ZGUgPHNhcEFwaS5oPgorI2luY2x1ZGUgPHNhcEludGVybmFsLmg+CisjaW5jbHVkZSA8d2xhbl9xY3RfdGwuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9zb2Z0YXBfdHhfcnguaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9fZnVuYy5oPgorI2luY2x1ZGUgIndsYW5fbmxpbmtfY29tbW9uLmgiCisjaW5jbHVkZSAid2xhbl9idGNfc3ZjLmgiCisjaW5jbHVkZSA8YmFwX2hkZF9tYWluLmg+CisjaWYgZGVmaW5lZCBDT05GSUdfQ0ZHODAyMTEKKyNpbmNsdWRlICJ3bGFuX2hkZF9wMnAuaCIKKyNlbmRpZgorCisjZGVmaW5lICAgIElTX1VQKF9kZXYpIFwKKyAgICAoKChfZGV2KS0+ZmxhZ3MgJiAoSUZGX1JVTk5JTkd8SUZGX1VQKSkgPT0gKElGRl9SVU5OSU5HfElGRl9VUCkpCisjZGVmaW5lICAgIElTX1VQX0FVVE8oX2ljKSBcCisgICAgKElTX1VQKChfaWMpLT5pY19kZXYpICYmIChfaWMpLT5pY19yb2FtaW5nID09IElFRUU4MDIxMV9ST0FNSU5HX0FVVE8pCisjZGVmaW5lIFdFX1dMQU5fVkVSU0lPTiAgICAgMQorI2RlZmluZSBTVEFUU19DT05URVhUX01BR0lDIDB4NTM1NDQxNTQKKworc3RydWN0IHN0YXRzQ29udGV4dAoreworICAgc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworICAgdW5zaWduZWQgaW50IG1hZ2ljOworfTsKKyNkZWZpbmUgU0FQXzI0R0haX0NIX0NPVU5UICgxNCkgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqICAgRnVuY3Rpb24gZGVmaW5pdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBoZGRfaG9zdGFwZF9vcGVuKCkgLSBIREQgT3BlbiBmdW5jdGlvbiBmb3IgaG9zdGFwZCBpbnRlcmZhY2UKKyAgCisgIFRoaXMgaXMgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGlmY29uZmlnIHVwCisgIAorICBccGFyYW0gIC0gZGV2IFBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAgCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzIG5vbi16ZXJvIGZvciBmYWlsdXJlCisgICAgICAgICAgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaGRkX2hvc3RhcGRfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgIEVOVEVSKCk7CisKKyAgIC8vVHVybiBPTiBjYXJyaWVyIHN0YXRlCisgICBuZXRpZl9jYXJyaWVyX29uKGRldik7CisgICAvL0VuYWJsZSBhbGwgVHggcXVldWVzICAKKyAgIG5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoZGV2KTsKKyAgIAorICAgRVhJVCgpOworICAgcmV0dXJuIDA7Cit9CisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBoZGRfaG9zdGFwZF9zdG9wKCkgLSBIREQgc3RvcCBmdW5jdGlvbiBmb3IgaG9zdGFwZCBpbnRlcmZhY2UKKyAgCisgIFRoaXMgaXMgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGlmY29uZmlnIGRvd24KKyAgCisgIFxwYXJhbSAgLSBkZXYgUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICAKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKyAgICAgICAgICAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBoZGRfaG9zdGFwZF9zdG9wIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgRU5URVIoKTsKKworICAgLy9TdG9wIGFsbCB0eCBxdWV1ZXMKKyAgIG5ldGlmX3R4X2Rpc2FibGUoZGV2KTsKKyAgIAorICAgLy9UdXJuIE9GRiBjYXJyaWVyIHN0YXRlCisgICBuZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisgICBFWElUKCk7CisgICByZXR1cm4gMDsKK30KKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfaG9zdGFwZF91bmluaXQoKSAtIEhERCB1bmluaXQgZnVuY3Rpb24KKworICBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgdGhlIG5ldGRldiB1bnJlZ2lzdGVyIHRvIHVuaW5pdGlhbGl6ZSBhbGwgZGF0YQorYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UKKworICBccGFyYW0gIC0gZGV2IFBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKworICBccmV0dXJuIC0gdm9pZAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGhkZF9ob3N0YXBkX3VuaW5pdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisKKyAgIEVOVEVSKCk7CisKKyAgIGlmIChwSG9zdGFwZEFkYXB0ZXIgJiYgcEhvc3RhcGRBZGFwdGVyLT5wSGRkQ3R4KQorICAgeworICAgICAgaGRkX2RlaW5pdF9hZGFwdGVyKHBIb3N0YXBkQWRhcHRlci0+cEhkZEN0eCwgcEhvc3RhcGRBZGFwdGVyKTsKKworICAgICAgLyogYWZ0ZXIgdW5pbml0IG91ciBhZGFwdGVyIHN0cnVjdHVyZSB3aWxsIG5vIGxvbmdlciBiZSB2YWxpZCAqLworICAgICAgcEhvc3RhcGRBZGFwdGVyLT5kZXYgPSBOVUxMOworICAgfQorCisgICBFWElUKCk7Cit9CisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2hvc3RhcGRfaGFyZF9zdGFydF94bWl0KCkgLSBGdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggdGhlIExpbnV4IE9TIGZvciAKKyAgdHJhbnNtaXR0aW5nIHBhY2tldHMuIFRoZXJlIGFyZSAyIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24uIE9uZSB0aGF0IHVzZXMKKyAgbG9ja2VkIHF1ZXVlIGFuZCBvdGhlciB0aGF0IHVzZXMgbG9ja2xlc3MgcXVldWVzLiBCb3RoIGhhdmUgYmVlbiByZXRhaW5lZCB0bworICBkbyBzb21lIHBlcmZvcm1hbmNlIHRlc3RpbmcKKyAgQHBhcmFtIHNrYiAgICAgIDogW2luXSAgcG9pbnRlciB0byBPUyBwYWNrZXQgKHNrX2J1ZmYpCisgIEBwYXJhbSBkZXYgICAgICA6IFtpbl0gcG9pbnRlciB0byBMaWJyYSBuZXR3b3JrIGRldmljZQorICAKKyAgQHJldHVybiAgICAgICAgIDogTkVUX1hNSVRfRFJPUCBpZiBwYWNrZXRzIGFyZSBkcm9wcGVkCisgICAgICAgICAgICAgICAgICA6IE5FVF9YTUlUX1NVQ0NFU1MgaWYgcGFja2V0IGlzIGVucXVldWVkIHN1Y2Nlc2Z1bGx5CisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgaGRkX2hvc3RhcGRfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmV0dXJuIDA7ICAgIAorfQoraW50IGhkZF9ob3N0YXBkX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBoZGRfaG9zdGFwZF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIGhkZF9wcml2X2RhdGFfdCBwcml2X2RhdGE7CisgICAgdEFOSV9VOCAqY29tbWFuZCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoTlVMTCA9PSBwQWRhcHRlcikKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICIlczogSEREIGFkYXB0ZXIgY29udGV4dCBpcyBOdWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICByZXQgPSAtRU5PREVWOworICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiAoKCFpZnIpICYmICghaWZyLT5pZnJfZGF0YSkpCisgICAgeworICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZwcml2X2RhdGEsIGlmci0+aWZyX2RhdGEsIHNpemVvZihoZGRfcHJpdl9kYXRhX3QpKSkKKyAgICB7CisgICAgICAgIHJldCA9IC1FRkFVTFQ7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBjb21tYW5kID0ga21hbGxvYyhwcml2X2RhdGEudG90YWxfbGVuLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWNvbW1hbmQpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0ID0gLUVOT01FTTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChjb3B5X2Zyb21fdXNlcihjb21tYW5kLCBwcml2X2RhdGEuYnVmLCBwcml2X2RhdGEudG90YWxfbGVuKSkKKyAgICB7CisgICAgICAgIHJldCA9IC1FRkFVTFQ7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiAoKFNJT0NERVZQUklWQVRFICsgMSkgPT0gY21kKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAiKioqSE9TVEFQRCoqKiA6IFJlY2VpdmVkICVzIGNtZCBmcm9tIFdpLUZpIEdVSSoqKiIsIGNvbW1hbmQpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICBpZihzdHJuY21wKGNvbW1hbmQsICJQMlBfU0VUX05PQSIsIDExKSA9PSAwICkgICAKKyAgICAgICAgeworICAgICAgICAgICAgaGRkX3NldFAycE5vYShkZXYsIGNvbW1hbmQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHN0cm5jbXAoY29tbWFuZCwgIlAyUF9TRVRfUFMiLCAxMCkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZF9zZXRQMnBPcHBzKGRldiwgY29tbWFuZCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KK2V4aXQ6CisgICBpZiAoY29tbWFuZCkKKyAgIHsKKyAgICAgICBrZnJlZShjb21tYW5kKTsKKyAgIH0KKyAgIHJldHVybiByZXQ7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIGhkZF9ob3N0YXBkX3NldF9tYWNfYWRkcmVzcygpIC0gCisgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1hYyBhZGRyZXNzIHVzaW5nIAorICAgdGhlIGNvbW1hbmQgaWZjb25maWcgd2xhblggaHcgZXRoZXIgPG1hYyBhZHJlc3M+LgorICAgCisgIFxwYXJhbSAgLSBkZXYgLSBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICAgICAgICAgICAgICAtIGFkZHIgLSBQb2ludGVyIHRvIHRoZSBzb2NrYWRkci4KKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgaGRkX2hvc3RhcGRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisgICBzdHJ1Y3Qgc29ja2FkZHIgKnBzdGFfbWFjX2FkZHIgPSBhZGRyOworICAgRU5URVIoKTsKKyAgIG1lbWNweShkZXYtPmRldl9hZGRyLCBwc3RhX21hY19hZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisgICBFWElUKCk7CisgICByZXR1cm4gMDsKK30KK3ZvaWQgaGRkX2hvc3RhcGRfaW5hY3Rpdml0eV90aW1lcl9jYih2X1BWT0lEX3QgdXNyRGF0YUZvckNhbGxiYWNrKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKil1c3JEYXRhRm9yQ2FsbGJhY2s7CisgICAgdl9CWVRFX3Qgd2VfY3VzdG9tX2V2ZW50WzY0XTsKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisjaWZkZWYgRElTQUJMRV9DT05DVVJSRU5DWV9BVVRPU0FWRSAgICAKKyAgICBWT1NfU1RBVFVTIHZvc19zdGF0dXM7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyOworICAgIGhkZF9hcF9jdHhfdCAqcEhkZEFwQ3R4OworI2VuZGlmIC8qRElTQUJMRV9DT05DVVJSRU5DWV9BVVRPU0FWRSAqLworCisgICAgLyogZXZlbnRfbmFtZSBzcGFjZS1kZWxpbWl0ZXIgZHJpdmVyX21vZHVsZV9uYW1lICovCisgICAgLyogRm9ybWF0IG9mIHRoZSBldmVudCBpcyAiQVVUTy1TSFVULmluZGljYXRpb24iICIgIiAibW9kdWxlX25hbWUiICovCisgICAgY2hhciAqIGF1dG9TaHV0RXZlbnQgPSAiQVVUTy1TSFVULmluZGljYXRpb24iICIgIiAgS0JVSUxEX01PRE5BTUU7CisgICAgaW50IGV2ZW50X2xlbiA9IHN0cmxlbihhdXRvU2h1dEV2ZW50KSArIDE7IC8qIEZvciB0aGUgTlVMTCBhdCB0aGUgZW5kICovCisKKyAgICBFTlRFUigpOworCisjaWZkZWYgRElTQUJMRV9DT05DVVJSRU5DWV9BVVRPU0FWRSAgICAKKyAgICBpZiAodm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZygpKQorICAgIHsgIAorICAgICAgIC8qCisgICAgICAgICAgICAgIFRoaXMgdGltZXIgcm91dGluZSBpcyBnb2luZyB0byBiZSBjYWxsZWQgb25seSB3aGVuIEFQCisgICAgICAgICAgICAgIHBlcnNvbmEgaXMgdXAuCisgICAgICAgICAgICAgIElmIHRoZXJlIGFyZSBjb25jdXJyZW50IHNlc3Npb25zIHJ1bm5pbmcgd2UgZG8gbm90IHdhbnQKKyAgICAgICAgICAgICAgdG8gc2h1dCBkb3duIHRoZSBCc3MuSW5zdGVhZCB3ZSBydW4gdGhlIHRpbWVyIGFnYWluIHNvCisgICAgICAgICAgICAgIHRoYXQgaWYgQXV0b3NhdmUgaXMgZW5hYmxlZCBuZXh0IHRpbWUgYW5kIG90aGVyIHNlc3Npb24KKyAgICAgICAgICAgICAgd2FzIGRvd24gb25seSB0aGVuIHdlIGJyaW5nIGRvd24gQVAgCisgICAgICAgICAgICAgKi8KKyAgICAgICAgcEhvc3RhcGRBZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgcEhkZEFwQ3R4ID0gV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKTsKKyAgICAgICAgdm9zX3N0YXR1cyA9IHZvc190aW1lcl9zdGFydCgKKyAgICAgICAgICZwSGRkQXBDdHgtPmhkZF9hcF9pbmFjdGl2aXR5X3RpbWVyLCAKKyAgICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5jZmdfaW5pLT5uQVBBdXRvU2h1dE9mZgorICAgICAgICAgICogMTAwMCk7CisgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBpbml0IEFQIGluYWN0aXZpdHkgdGltZXIiKSk7CisgICAgICAgIH0KKyAgICAgICAgRVhJVCgpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qRElTQUJMRV9DT05DVVJSRU5DWV9BVVRPU0FWRSAqLworICAgIG1lbXNldCgmd2VfY3VzdG9tX2V2ZW50LCAnXDAnLCBzaXplb2Yod2VfY3VzdG9tX2V2ZW50KSk7CisgICAgbWVtY3B5KCZ3ZV9jdXN0b21fZXZlbnQsIGF1dG9TaHV0RXZlbnQsIGV2ZW50X2xlbik7CisKKyAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgd3JxdS5kYXRhLmxlbmd0aCA9IGV2ZW50X2xlbjsKKworICAgIGhkZExvZyhMT0cxLCBGTCgiU2h1dHRpbmcgZG93biBBUCBpbnRlcmZhY2UgZHVlIHRvIGluYWN0aXZpdHkiKSk7CisgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZDVVNUT00sICZ3cnF1LCAoY2hhciAqKXdlX2N1c3RvbV9ldmVudCk7ICAgIAorCisgICAgRVhJVCgpOworfQorCisKK1ZPU19TVEFUVVMgaGRkX2hvc3RhcGRfU0FQRXZlbnRDQiggdHBTYXBfRXZlbnQgcFNhcEV2ZW50LCB2X1BWT0lEX3QgdXNyRGF0YUZvckNhbGxiYWNrKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlcjsKKyAgICBoZGRfYXBfY3R4X3QgKnBIZGRBcEN0eDsKKyAgICBoZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgZVNhcEhkZEV2ZW50IHNhcEV2ZW50OworICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKyAgICB2X0JZVEVfdCAqd2VfY3VzdG9tX2V2ZW50X2dlbmVyaWMgPSBOVUxMOworICAgIGludCB3ZV9ldmVudCA9IDA7CisgICAgaW50IGkgPSAwOworICAgIHZfVThfdCBzdGFJZDsKKyAgICBWT1NfU1RBVFVTIHZvc19zdGF0dXM7IAorICAgIHZfQk9PTF90IGJXUFNTdGF0ZTsKKyAgICB2X0JPT0xfdCBiQXBBY3RpdmUgPSBGQUxTRTsKKyAgICB2X0JPT0xfdCBiQXV0aFJlcXVpcmVkID0gVFJVRTsKKyAgICB0cFNhcF9Bc3NvY01hY0FkZHIgcEFzc29jU3Rhc0FycmF5ID0gTlVMTDsKKyAgICBjaGFyIHVua25vd25TVEFFdmVudFtJV19DVVNUT01fTUFYKzFdOworICAgIGNoYXIgbWF4QXNzb2NFeGNlZWRlZEV2ZW50W0lXX0NVU1RPTV9NQVgrMV07CisgICAgdl9CWVRFX3Qgd2VfY3VzdG9tX3N0YXJ0X2V2ZW50WzY0XTsKKyAgICBjaGFyICpzdGFydEJzc0V2ZW50OyAKKworICAgIGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXVzckRhdGFGb3JDYWxsYmFjazsKKyAgICBwSG9zdGFwZEFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHBIb3N0YXBkU3RhdGUgPSBXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihwSG9zdGFwZEFkYXB0ZXIpOyAKKyAgICBwSGRkQXBDdHggPSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpOworICAgIHNhcEV2ZW50ID0gcFNhcEV2ZW50LT5zYXBIZGRFdmVudENvZGU7CisgICAgbWVtc2V0KCZ3cnF1LCAnXDAnLCBzaXplb2Yod3JxdSkpOworCisgICAgc3dpdGNoKHNhcEV2ZW50KQorICAgIHsKKyAgICAgICAgY2FzZSBlU0FQX1NUQVJUX0JTU19FVkVOVCA6CisgICAgICAgICAgICBoZGRMb2coTE9HMSwgRkwoIkJTUyBjb25maWd1cmVkIHN0YXR1cyA9ICVzLCBjaGFubmVsID0gJWx1LCBiYyBzdGEgSWQgPSAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwU3RhcnRCc3NDb21wbGV0ZUV2ZW50LnN0YXR1cyA/ICJlU0FQX1NUQVRVU19GQUlMVVJFIiA6ICJlU0FQX1NUQVRVU19TVUNDRVNTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGFydEJzc0NvbXBsZXRlRXZlbnQub3BlcmF0aW5nQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXJ0QnNzQ29tcGxldGVFdmVudC5zdGFJZCk7CisKKyAgICAgICAgICAgIHBIb3N0YXBkU3RhdGUtPnZvc1N0YXR1cyA9IHBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXJ0QnNzQ29tcGxldGVFdmVudC5zdGF0dXM7CisgICAgICAgICAgICB2b3Nfc3RhdHVzID0gdm9zX2V2ZW50X3NldCgmcEhvc3RhcGRTdGF0ZS0+dm9zRXZlbnQpOworICAgCisgICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3Nfc3RhdHVzKSB8fCBwSG9zdGFwZFN0YXRlLT52b3NTdGF0dXMpCisgICAgICAgICAgICB7ICAgICAKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgKCJFUlJPUjogc3RhcnRic3MgZXZlbnQgZmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgICAgICBnb3RvIHN0b3Bic3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBIZGRBcEN0eC0+dUJDU3RhSWQgPSBwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGFydEJzc0NvbXBsZXRlRXZlbnQuc3RhSWQ7CisgICAgICAgICAgICAgICAgLy9AQEAgbmVlZCB3ZXAgbG9naWMgaGVyZSB0byBzZXQgcHJpdmFjeSBiaXQKKyAgICAgICAgICAgICAgICBoZGRfc29mdGFwX1JlZ2lzdGVyX0JDX1NUQShwSG9zdGFwZEFkYXB0ZXIsIHBIZGRBcEN0eC0+dVByaXZhY3kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoMCAhPSAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+Y2ZnX2luaS0+bkFQQXV0b1NodXRPZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQVAgSW5hY3Rpdml0eSB0aW1lciBpbml0IGFuZCBzdGFydAorICAgICAgICAgICAgICAgIHZvc19zdGF0dXMgPSB2b3NfdGltZXJfaW5pdCggJnBIZGRBcEN0eC0+aGRkX2FwX2luYWN0aXZpdHlfdGltZXIsIFZPU19USU1FUl9UWVBFX1NXLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2hvc3RhcGRfaW5hY3Rpdml0eV90aW1lcl9jYiwgKHZfUFZPSURfdClkZXYgKTsKKyAgICAgICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3Nfc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBpbml0IEFQIGluYWN0aXZpdHkgdGltZXJcbiIpKTsKKworICAgICAgICAgICAgICAgIHZvc19zdGF0dXMgPSB2b3NfdGltZXJfc3RhcnQoICZwSGRkQXBDdHgtPmhkZF9hcF9pbmFjdGl2aXR5X3RpbWVyLCAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+Y2ZnX2luaS0+bkFQQXV0b1NodXRPZmYgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3Nfc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBpbml0IEFQIGluYWN0aXZpdHkgdGltZXJcbiIpKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEhkZEFwQ3R4LT5vcGVyYXRpbmdDaGFubmVsID0gcFNhcEV2ZW50LT5zYXBldnQuc2FwU3RhcnRCc3NDb21wbGV0ZUV2ZW50Lm9wZXJhdGluZ0NoYW5uZWw7CisgICAgICAgICAgICBwSG9zdGFwZFN0YXRlLT5ic3NTdGF0ZSA9IEJTU19TVEFSVDsKKworICAgICAgICAgICAgLy8gU2VuZCBjdXJyZW50IG9wZXJhdGluZyBjaGFubmVsIG9mIFNvZnRBUCB0byBCVEMtRVMKKyAgICAgICAgICAgIHNlbmRfYnRjX25saW5rX21zZyhXTEFOX0JUQ19TT0ZUQVBfQlNTX1NUQVJULCAwKTsKKworI2lmZGVmIENPTkZJR19DRkc4MDIxMSAgICAgICAgICAgIAorICAgICAgICAgICAgLy9DaGVjayBpZiB0aGVyZSBpcyBhbnkgZ3JvdXAga2V5IHBlbmRpbmcgdG8gc2V0LgorICAgICAgICAgICAgaWYoIHBIZGRBcEN0eC0+Z3JvdXBLZXkua2V5TGVuZ3RoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gIFdMQU5TQVBfU2V0S2V5U3RhKCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBIZGRBcEN0eC0+Z3JvdXBLZXkgKSApCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFdMQU5TQVBfU2V0S2V5U3RhIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBwSGRkQXBDdHgtPmdyb3VwS2V5LmtleUxlbmd0aCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggcEhkZEFwQ3R4LT53ZXBLZXlbMF0ua2V5TGVuZ3RoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaT0wOworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgQ1NSX01BWF9OVU1fS0VZOyBpKysgKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9ICBXTEFOU0FQX1NldEtleVN0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPnB2b3NDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEhkZEFwQ3R4LT53ZXBLZXlbaV0gKSApCisgICAgICAgICAgICAgICAgICAgIHsgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFdMQU5TQVBfU2V0S2V5U3RhIGZhaWxlZCBpZHggJWQiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEhkZEFwQ3R4LT53ZXBLZXlbaV0ua2V5TGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLy9GaWxsIHRoZSBwYXJhbXMgZm9yIHNlbmRpbmcgSVdFVkNVU1RPTSBFdmVudCB3aXRoIFNPRlRBUC5lbmFibGVkCisgICAgICAgICAgICBzdGFydEJzc0V2ZW50ID0gIlNPRlRBUC5lbmFibGVkIjsKKyAgICAgICAgICAgIG1lbXNldCgmd2VfY3VzdG9tX3N0YXJ0X2V2ZW50LCAnXDAnLCBzaXplb2Yod2VfY3VzdG9tX3N0YXJ0X2V2ZW50KSk7CisgICAgICAgICAgICBtZW1jcHkoJndlX2N1c3RvbV9zdGFydF9ldmVudCwgc3RhcnRCc3NFdmVudCwgc3RybGVuKHN0YXJ0QnNzRXZlbnQpKTsKKyAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oc3RhcnRCc3NFdmVudCk7CisgICAgICAgICAgICB3ZV9ldmVudCA9IElXRVZDVVNUT007CisgICAgICAgICAgICB3ZV9jdXN0b21fZXZlbnRfZ2VuZXJpYyA9IHdlX2N1c3RvbV9zdGFydF9ldmVudDsKKworICAgICAgICAgICAgYnJlYWs7IC8vRXZlbnQgd2lsbCBiZSBzZW50IGFmdGVyIFN3aXRjaC1DYXNlIHN0bXQgCisKKyAgICAgICAgY2FzZSBlU0FQX1NUT1BfQlNTX0VWRU5UOgorICAgICAgICAgICAgaGRkTG9nKExPRzEsIEZMKCJCU1Mgc3RvcCBzdGF0dXMgPSAlc1xuIikscFNhcEV2ZW50LT5zYXBldnQuc2FwU3RvcEJzc0NvbXBsZXRlRXZlbnQuc3RhdHVzID8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlU0FQX1NUQVRVU19GQUlMVVJFIiA6ICJlU0FQX1NUQVRVU19TVUNDRVNTIik7CisKKyAgICAgICAgICAgIHBIZGRBcEN0eC0+b3BlcmF0aW5nQ2hhbm5lbCA9IDA7IC8vSW52YWxpZGF0ZSB0aGUgY2hhbm5lbCBpbmZvLgorICAgICAgICAgICAgdm9zX2V2ZW50X3NldCgmcEhvc3RhcGRTdGF0ZS0+dm9zRXZlbnQpOworICAgICAgICAgICAgZ290byBzdG9wYnNzOworICAgICAgICBjYXNlIGVTQVBfU1RBX1NFVF9LRVlfRVZFTlQ6CisgICAgICAgICAgICAvL1RPRE86IGZvcndhcmQgdGhlIG1lc3NhZ2UgdG8gaG9zdGFwZCBvbmNlIGltcGxlbWVudHRhdGlvbiBpcyBkb25lIGZvciBub3cganVzdCBwcmludAorICAgICAgICAgICAgaGRkTG9nKExPRzEsIEZMKCJTRVQgS2V5OiBjb25maWd1cmVkIHN0YXR1cyA9ICVzXG4iKSxwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uU2V0S2V5Q29tcGxldGVFdmVudC5zdGF0dXMgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZVNBUF9TVEFUVVNfRkFJTFVSRSIgOiAiZVNBUF9TVEFUVVNfU1VDQ0VTUyIpOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgY2FzZSBlU0FQX1NUQV9ERUxfS0VZX0VWRU5UOgorICAgICAgICAgICAvL1RPRE86IGZvcndhcmQgdGhlIG1lc3NhZ2UgdG8gaG9zdGFwZCBvbmNlIGltcGxlbWVudHRhdGlvbiBpcyBkb25lIGZvciBub3cganVzdCBwcmludAorICAgICAgICAgICBoZGRMb2coTE9HMSwgRkwoIkV2ZW50IHJlY2VpdmVkICVzXG4iKSwiZVNBUF9TVEFfREVMX0tFWV9FVkVOVCIpOworICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgICBjYXNlIGVTQVBfU1RBX01JQ19GQUlMVVJFX0VWRU5UOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgbXNnOworICAgICAgICAgICAgbWVtc2V0KCZtc2csICdcMCcsIHNpemVvZihtc2cpKTsKKyAgICAgICAgICAgIG1zZy5zcmNfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICAgICAgICBtZW1jcHkobXNnLnNyY19hZGRyLnNhX2RhdGEsICZwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50LnN0YU1hYywgc2l6ZW9mKG1zZy5zcmNfYWRkci5zYV9kYXRhKSk7CisgICAgICAgICAgICBoZGRMb2coTE9HMSwgIk1JQyBNQUMgIk1BQ19BRERSRVNTX1NUUiJcbiIsIE1BQ19BRERSX0FSUkFZKG1zZy5zcmNfYWRkci5zYV9kYXRhKSk7CisgICAgICAgICAgICBpZihwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50Lm11bHRpY2FzdCA9PSBlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9HUk9VUCkKKyAgICAgICAgICAgICBtc2cuZmxhZ3MgPSBJV19NSUNGQUlMVVJFX0dST1VQOworICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICBtc2cuZmxhZ3MgPSBJV19NSUNGQUlMVVJFX1BBSVJXSVNFOworICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgd3JxdS5kYXRhLmxlbmd0aCA9IHNpemVvZihtc2cpOworICAgICAgICAgICAgd2VfZXZlbnQgPSBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkU7CisgICAgICAgICAgICB3ZV9jdXN0b21fZXZlbnRfZ2VuZXJpYyA9ICh2X0JZVEVfdCAqKSZtc2c7CisgICAgICAgIH0KKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgICAgIC8qIGluZm9ybSBtaWMgZmFpbHVyZSB0byBubDgwMjExICovCisgICAgICAgIGNmZzgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50LnN0YU1hYy5ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXRpb25NSUNGYWlsdXJlRXZlbnQubXVsdGljYXN0ID09IGVTSVJfVFJVRSkgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkw4MDIxMV9LRVlUWVBFX0dST1VQIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkw4MDIxMV9LRVlUWVBFX1BBSVJXSVNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50LmtleUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50LlRTQywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgY2FzZSBlU0FQX1NUQV9BU1NPQ19FVkVOVDoKKyAgICAgICAgY2FzZSBlU0FQX1NUQV9SRUFTU09DX0VWRU5UOgorICAgICAgICAgICAgd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICAgICAgICAgIG1lbWNweSh3cnF1LmFkZHIuc2FfZGF0YSwgJnBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LnN0YU1hYywgCisgICAgICAgICAgICAgICAgc2l6ZW9mKHdycXUuYWRkci5zYV9kYXRhKSk7CisgICAgICAgICAgICBoZGRMb2coTE9HMSwgIiBhc3NvY2lhdGVkICJNQUNfQUREUkVTU19TVFIiXG4iLCBNQUNfQUREUl9BUlJBWSh3cnF1LmFkZHIuc2FfZGF0YSkpOworICAgICAgICAgICAgd2VfZXZlbnQgPSBJV0VWUkVHSVNURVJFRDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgV0xBTlNBUF9HZXRfV1BTX1N0YXRlKChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5wdm9zQ29udGV4dCwgJmJXUFNTdGF0ZSk7CisgICAgICAgICAKKyAgICAgICAgICAgIGlmICggKGVDU1JfRU5DUllQVF9UWVBFX05PTkUgPT0gcEhkZEFwQ3R4LT51Y0VuY3J5cHRUeXBlKSB8fAorICAgICAgICAgICAgICAgICAoIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWSA9PSBwSGRkQXBDdHgtPnVjRW5jcnlwdFR5cGUgKSB8fCAKKyAgICAgICAgICAgICAgICAgKCBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZID09IHBIZGRBcEN0eC0+dWNFbmNyeXB0VHlwZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiQXV0aFJlcXVpcmVkID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiQXV0aFJlcXVpcmVkIHx8IGJXUFNTdGF0ZSA9PSBlQU5JX0JPT0xFQU5fVFJVRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGRkX3NvZnRhcF9SZWdpc3RlclNUQSggcEhvc3RhcGRBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRBcEN0eC0+dVByaXZhY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudC5zdGFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfTUFDQUREUl90ICopd3JxdS5hZGRyLnNhX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudC53bW1FbmFibGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRfc29mdGFwX1JlZ2lzdGVyU1RBKCBwSG9zdGFwZEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRBcEN0eC0+dVByaXZhY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudC5zdGFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfTUFDQUREUl90ICopd3JxdS5hZGRyLnNhX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudC53bW1FbmFibGVkKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFN0b3AgQVAgaW5hY3Rpdml0eSB0aW1lcgorICAgICAgICAgICAgaWYgKHBIZGRBcEN0eC0+aGRkX2FwX2luYWN0aXZpdHlfdGltZXIuc3RhdGUgPT0gVk9TX1RJTUVSX1NUQVRFX1JVTk5JTkcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9zX3N0YXR1cyA9IHZvc190aW1lcl9zdG9wKCZwSGRkQXBDdHgtPmhkZF9hcF9pbmFjdGl2aXR5X3RpbWVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3Nfc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBzdGFydCBBUCBpbmFjdGl2aXR5IHRpbWVyXG4iKSk7CisgICAgICAgICAgICB9CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0aW9uX2luZm8gc3RhSW5mbzsKKyAgICAgICAgICAgICAgICB2X1UxNl90IGllc0xlbiA9ICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudC5pZXNMZW47CisKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnN0YUluZm8sIDAsIHNpemVvZihzdGFJbmZvKSk7CisgICAgICAgICAgICAgICAgaWYgKGllc0xlbiA8PSBNQVhfQVNTT0NfSU5EX0lFX0xFTiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGFJbmZvLmFzc29jX3JlcV9pZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHU4ICopJnBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50Lmllc1swXTsKKyAgICAgICAgICAgICAgICAgICAgc3RhSW5mby5hc3NvY19yZXFfaWVzX2xlbiA9IGllc0xlbjsKKyAgICAgICAgICAgICAgICAgICAgY2ZnODAyMTFfbmV3X3N0YShkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdTggKikmcFNhcEV2ZW50LT5zYXBldnQuc2FwU3RhdGlvbkFzc29jUmVhc3NvY0NvbXBsZXRlRXZlbnQuc3RhTWFjLmJ5dGVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YUluZm8sIEdGUF9LRVJORUwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgRkwoIiBBc3NvYyBJZSBsZW5ndGggaXMgdG9vIGxvbmcgXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVTQVBfU1RBX0RJU0FTU09DX0VWRU5UOgorICAgICAgICAgICAgbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLCAmcFNhcEV2ZW50LT5zYXBldnQuc2FwU3RhdGlvbkRpc2Fzc29jQ29tcGxldGVFdmVudC5zdGFNYWMsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHdycXUuYWRkci5zYV9kYXRhKSk7CisgICAgICAgICAgICBoZGRMb2coTE9HMSwgIiBkaXNhc3NvY2lhdGVkICJNQUNfQUREUkVTU19TVFIiXG4iLCBNQUNfQUREUl9BUlJBWSh3cnF1LmFkZHIuc2FfZGF0YSkpOworICAgICAgICAgICAgaWYgKHBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXRpb25EaXNhc3NvY0NvbXBsZXRlRXZlbnQucmVhc29uID09IGVTQVBfVVNSX0lOSVRBVEVEX0RJU0FTU09DKQorICAgICAgICAgICAgICAgIGhkZExvZyhMT0cxLCIgVXNlciBpbml0aWF0ZWQgZGlzYXNzb2NpYXRpb24iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwiIE1BQyBpbml0aWF0ZWQgZGlzYXNzb2NpYXRpb24iKTsKKyAgICAgICAgICAgIHdlX2V2ZW50ID0gSVdFVkVYUElSRUQ7CisgICAgICAgICAgICB2b3Nfc3RhdHVzID0gaGRkX3NvZnRhcF9HZXRTdGFJZChwSG9zdGFwZEFkYXB0ZXIsICZwU2FwRXZlbnQtPnNhcGV2dC5zYXBTdGF0aW9uRGlzYXNzb2NDb21wbGV0ZUV2ZW50LnN0YU1hYywgJnN0YUlkKTsKKyAgICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19zdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAoIkVSUk9SOiBIREQgRmFpbGVkIHRvIGZpbmQgc3RhIGlkISFcbiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZGRfc29mdGFwX0RlcmVnaXN0ZXJTVEEocEhvc3RhcGRBZGFwdGVyLCBzdGFJZCk7CisKKyAgICAgICAgICAgIGlmICgwICE9IChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5jZmdfaW5pLT5uQVBBdXRvU2h1dE9mZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfYmgoICZwSG9zdGFwZEFkYXB0ZXItPnN0YUluZm9fbG9jayApOworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IEFQIGluYWN0aXZpdHkgdGltZXIgaWYgbm8gc3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGl0CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBIb3N0YXBkQWRhcHRlci0+YVN0YUluZm9baV0uaXNVc2VkICYmIGkgIT0gKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcikpLT51QkNTdGFJZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYkFwQWN0aXZlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2JoKCAmcEhvc3RhcGRBZGFwdGVyLT5zdGFJbmZvX2xvY2sgKTsKKworICAgICAgICAgICAgICAgIGlmIChiQXBBY3RpdmUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEhkZEFwQ3R4LT5oZGRfYXBfaW5hY3Rpdml0eV90aW1lci5zdGF0ZSA9PSBWT1NfVElNRVJfU1RBVEVfU1RPUFBFRCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3N0YXR1cyA9IHZvc190aW1lcl9zdGFydCgmcEhkZEFwQ3R4LT5oZGRfYXBfaW5hY3Rpdml0eV90aW1lciwgKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPmNmZ19pbmktPm5BUEF1dG9TaHV0T2ZmICogMTAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3Nfc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgRkwoIkZhaWxlZCB0byBpbml0IEFQIGluYWN0aXZpdHkgdGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKHZvc190aW1lcl9nZXRDdXJyZW50U3RhdGUoJnBIZGRBcEN0eC0+aGRkX2FwX2luYWN0aXZpdHlfdGltZXIpID09IFZPU19USU1FUl9TVEFURV9TVE9QUEVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorICAgICAgICAgICAgY2ZnODAyMTFfZGVsX3N0YShkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHU4ICopJnBTYXBFdmVudC0+c2FwZXZ0LnNhcFN0YXRpb25EaXNhc3NvY0NvbXBsZXRlRXZlbnQuc3RhTWFjLmJ5dGVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOworI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVTQVBfV1BTX1BCQ19QUk9CRV9SRVFfRVZFTlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIG1lc3NhZ2UgPSJNTE1FV1BTUEJDUFJPQkVSRVEuaW5kaWNhdGlvbiI7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZG93bigmcEhkZEFwQ3R4LT5zZW1XcHNQQkNPdmVybGFwSW5kKTsKKyAgICAgICAgICAgICAgICBwSGRkQXBDdHgtPldQU1BCQ1Byb2JlUmVxLnByb2JlUmVxSUVMZW4gPSBwU2FwRXZlbnQtPnNhcGV2dC5zYXBQQkNQcm9iZVJlcUV2ZW50LldQU1BCQ1Byb2JlUmVxLnByb2JlUmVxSUVMZW47CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBIZGRBcEN0eC0+V1BTUEJDUHJvYmVSZXEucHJvYmVSZXFJRSwgcFNhcEV2ZW50LT5zYXBldnQuc2FwUEJDUHJvYmVSZXFFdmVudC5XUFNQQkNQcm9iZVJlcS5wcm9iZVJlcUlFLCAKKyAgICAgICAgICAgICAgICAgICAgcEhkZEFwQ3R4LT5XUFNQQkNQcm9iZVJlcS5wcm9iZVJlcUlFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZvc19tZW1fY29weShwSGRkQXBDdHgtPldQU1BCQ1Byb2JlUmVxLnBlZXJNYWNBZGRyLCBwU2FwRXZlbnQtPnNhcGV2dC5zYXBQQkNQcm9iZVJlcUV2ZW50LldQU1BCQ1Byb2JlUmVxLnBlZXJNYWNBZGRyLCBzaXplb2Yodl9NQUNBRERSX3QpKTsKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIldQUyBQQkMgcHJvYmUgcmVxICJNQUNfQUREUkVTU19TVFIiXG4iLCBNQUNfQUREUl9BUlJBWShwSGRkQXBDdHgtPldQU1BCQ1Byb2JlUmVxLnBlZXJNYWNBZGRyKSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworICAgICAgICAgICAgICAgIHdyZXEuZGF0YS5sZW5ndGggPSBzdHJsZW4obWVzc2FnZSk7IC8vIFRoaXMgaXMgbGVuZ3RoIG9mIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkNVU1RPTSwgJndyZXEsIChjaGFyICopbWVzc2FnZSk7IAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBlU0FQX0FTU09DX1NUQV9DQUxMQkFDS19FVkVOVDoKKyAgICAgICAgICAgIHBBc3NvY1N0YXNBcnJheSA9IHBTYXBFdmVudC0+c2FwZXZ0LnNhcEFzc29jU3RhTGlzdEV2ZW50LnBBc3NvY1N0YXM7CisgICAgICAgICAgICBpZiAocFNhcEV2ZW50LT5zYXBldnQuc2FwQXNzb2NTdGFMaXN0RXZlbnQubm9PZkFzc29jU3RhICE9IDApCisgICAgICAgICAgICB7ICAgLy8gTGlzdCBvZiBhc3NvY2lhdGVkIHN0YXRpb25zCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTYXBFdmVudC0+c2FwZXZ0LnNhcEFzc29jU3RhTGlzdEV2ZW50Lm5vT2ZBc3NvY1N0YTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPRzEsIkFzc29jaWF0ZWQgU3RhIE51bSAlZDphc3NvY0lkPSVkLCBzdGFJZD0lZCwgc3RhTWFjPSJNQUNfQUREUkVTU19TVFIsCisgICAgICAgICAgICAgICAgICAgICAgICBpKzEsCisgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NTdGFzQXJyYXktPmFzc29jSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NTdGFzQXJyYXktPnN0YUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDX0FERFJfQVJSQVkocEFzc29jU3Rhc0FycmF5LT5zdGFNYWMuYnl0ZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvY1N0YXNBcnJheSsrOyAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvc19tZW1fZnJlZShwU2FwRXZlbnQtPnNhcGV2dC5zYXBBc3NvY1N0YUxpc3RFdmVudC5wQXNzb2NTdGFzKTsvLyBSZWxlYXNlIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IGhlcmUKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICBjYXNlIGVTQVBfSU5ESUNBVEVfTUdNVF9GUkFNRToKKyAgICAgICAgICAgaGRkX2luZGljYXRlTWdtdEZyYW1lKCBwSG9zdGFwZEFkYXB0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwTWFuYWdlbWVudEZyYW1lSW5mby5uRnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBNYW5hZ2VtZW50RnJhbWVJbmZvLnBiRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwTWFuYWdlbWVudEZyYW1lSW5mby5mcmFtZVR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwTWFuYWdlbWVudEZyYW1lSW5mby5yeENoYW4pOworICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgICBjYXNlIGVTQVBfUkVNQUlOX0NIQU5fUkVBRFk6CisgICAgICAgICAgIGhkZF9yZW1haW5DaGFuUmVhZHlIYW5kbGVyKCBwSG9zdGFwZEFkYXB0ZXIgKTsKKyAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgY2FzZSBlU0FQX1NFTkRfQUNUSU9OX0NORjoKKyAgICAgICAgICAgaGRkX3NlbmRBY3Rpb25DbmYoIHBIb3N0YXBkQWRhcHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGVTQVBfU1RBVFVTX1NVQ0NFU1MgPT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcEFjdGlvbkNuZi5hY3Rpb25TZW5kU3VjY2VzcyApID8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgOiBGQUxTRSApOworICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworI2VuZGlmCisgICAgICAgIGNhc2UgZVNBUF9VTktOT1dOX1NUQV9KT0lOOgorICAgICAgICAgICAgc25wcmludGYodW5rbm93blNUQUV2ZW50LCBJV19DVVNUT01fTUFYLCAiSk9JTl9VTktOT1dOX1NUQS0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisgICAgICAgICAgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwVW5rbm93blNUQUpvaW4ubWFjYWRkci5ieXRlc1swXSwKKyAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBVbmtub3duU1RBSm9pbi5tYWNhZGRyLmJ5dGVzWzFdLAorICAgICAgICAgICAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcFVua25vd25TVEFKb2luLm1hY2FkZHIuYnl0ZXNbMl0sCisgICAgICAgICAgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwVW5rbm93blNUQUpvaW4ubWFjYWRkci5ieXRlc1szXSwKKyAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBVbmtub3duU1RBSm9pbi5tYWNhZGRyLmJ5dGVzWzRdLAorICAgICAgICAgICAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcFVua25vd25TVEFKb2luLm1hY2FkZHIuYnl0ZXNbNV0pOworICAgICAgICAgICAgd2VfZXZlbnQgPSBJV0VWQ1VTVE9NOyAvKiBEaXNjb3ZlcmVkIGEgbmV3IG5vZGUgKEFQIG1vZGUpLiAqLworICAgICAgICAgICAgd3JxdS5kYXRhLnBvaW50ZXIgPSB1bmtub3duU1RBRXZlbnQ7CisgICAgICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKHVua25vd25TVEFFdmVudCk7CisgICAgICAgICAgICB3ZV9jdXN0b21fZXZlbnRfZ2VuZXJpYyA9ICh2X0JZVEVfdCAqKXVua25vd25TVEFFdmVudDsKKyAgICAgICAgICAgIGhkZExvZyhMT0cxLCIlc1xuIiwgdW5rbm93blNUQUV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNBUF9NQVhfQVNTT0NfRVhDRUVERUQ6CisgICAgICAgICAgICBzbnByaW50ZihtYXhBc3NvY0V4Y2VlZGVkRXZlbnQsIElXX0NVU1RPTV9NQVgsICJQZWVyICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IGRlbmllZCIKKyAgICAgICAgICAgICAgICAgICAgIiBhc3NvYyBkdWUgdG8gTWF4aW11bSBNb2JpbGUgSG90c3BvdCBjb25uZWN0aW9ucyByZWFjaGVkLiBQbGVhc2UgZGlzY29ubmVjdCIKKyAgICAgICAgICAgICAgICAgICAgIiBvbmUgb3IgbW9yZSBkZXZpY2VzIHRvIGVuYWJsZSB0aGUgbmV3IGRldmljZSBjb25uZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwTWF4QXNzb2NFeGNlZWRlZC5tYWNhZGRyLmJ5dGVzWzBdLAorICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBNYXhBc3NvY0V4Y2VlZGVkLm1hY2FkZHIuYnl0ZXNbMV0sCisgICAgICAgICAgICAgICAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcE1heEFzc29jRXhjZWVkZWQubWFjYWRkci5ieXRlc1syXSwKKyAgICAgICAgICAgICAgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwTWF4QXNzb2NFeGNlZWRlZC5tYWNhZGRyLmJ5dGVzWzNdLAorICAgICAgICAgICAgICAgICAgICBwU2FwRXZlbnQtPnNhcGV2dC5zYXBNYXhBc3NvY0V4Y2VlZGVkLm1hY2FkZHIuYnl0ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgIHBTYXBFdmVudC0+c2FwZXZ0LnNhcE1heEFzc29jRXhjZWVkZWQubWFjYWRkci5ieXRlc1s1XSk7CisgICAgICAgICAgICB3ZV9ldmVudCA9IElXRVZDVVNUT007IC8qIERpc2NvdmVyZWQgYSBuZXcgbm9kZSAoQVAgbW9kZSkuICovCisgICAgICAgICAgICB3cnF1LmRhdGEucG9pbnRlciA9IG1heEFzc29jRXhjZWVkZWRFdmVudDsKKyAgICAgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4obWF4QXNzb2NFeGNlZWRlZEV2ZW50KTsKKyAgICAgICAgICAgIHdlX2N1c3RvbV9ldmVudF9nZW5lcmljID0gKHZfQllURV90ICopbWF4QXNzb2NFeGNlZWRlZEV2ZW50OworICAgICAgICAgICAgaGRkTG9nKExPRzEsIiVzXG4iLCBtYXhBc3NvY0V4Y2VlZGVkRXZlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZVNBUF9TVEFfQVNTT0NfSU5EOgorICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGhkZExvZyhMT0cxLCJTQVAgbWVzc2FnZSBpcyBub3QgaGFuZGxlZFxuIik7CisgICAgICAgICAgICBnb3RvIHN0b3Bic3M7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIH0KKyAgICB3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgd2VfZXZlbnQsICZ3cnF1LCAoY2hhciAqKXdlX2N1c3RvbV9ldmVudF9nZW5lcmljKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworCitzdG9wYnNzIDoKKyAgICB7CisgICAgICAgIHZfQllURV90IHdlX2N1c3RvbV9ldmVudFs2NF07CisgICAgICAgIGNoYXIgKnN0b3BCc3NFdmVudCA9ICJTVE9QLUJTUy5yZXNwb25zZSI7Ly8xNworICAgICAgICBpbnQgZXZlbnRfbGVuID0gc3RybGVuKHN0b3BCc3NFdmVudCk7CisKKyAgICAgICAgaGRkTG9nKExPRzEsIEZMKCJCU1Mgc3RvcCBzdGF0dXMgPSAlcyIpLAorICAgICAgICAgICAgICAgcFNhcEV2ZW50LT5zYXBldnQuc2FwU3RvcEJzc0NvbXBsZXRlRXZlbnQuc3RhdHVzID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZVNBUF9TVEFUVVNfRkFJTFVSRSIgOiAiZVNBUF9TVEFUVVNfU1VDQ0VTUyIpOworCisgICAgICAgIC8qIENoYW5nZSB0aGUgQlNTIHN0YXRlIG5vdyBzaW5jZSwgYXMgd2UgYXJlIHNodXR0aW5nIHRoaW5ncyBkb3duLAorICAgICAgICAgKiB3ZSBkb24ndCB3YW50IGludGVyZmFjZXMgdG8gYmVjb21lIHJlLWVuYWJsZWQgKi8KKyAgICAgICAgcEhvc3RhcGRTdGF0ZS0+YnNzU3RhdGUgPSBCU1NfU1RPUDsKKworICAgICAgICAvKiBTdG9wIHRoZSBwa3RzIGZyb20gbi93IHN0YWNrIGFzIHdlIGFyZSBnb2luZyB0byBmcmVlIGFsbCBvZgorICAgICAgICAgKiB0aGUgVFggV01NIHF1ZXVlcyBmb3IgYWxsIFNUQUlEJ3MgKi8KKyAgICAgICAgaGRkX2hvc3RhcGRfc3RvcChkZXYpOworCisgICAgICAgIC8qIHJlY2xhaW0gYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gdGhlIEJTUyAqLworICAgICAgICBoZGRfc29mdGFwX3N0b3BfYnNzKHBIb3N0YXBkQWRhcHRlcik7CisKKyAgICAgICAgLyogbm90aWZ5IHVzZXJzcGFjZSB0aGF0IHRoZSBCU1MgaGFzIHN0b3BwZWQgKi8KKyAgICAgICAgbWVtc2V0KCZ3ZV9jdXN0b21fZXZlbnQsICdcMCcsIHNpemVvZih3ZV9jdXN0b21fZXZlbnQpKTsKKyAgICAgICAgbWVtY3B5KCZ3ZV9jdXN0b21fZXZlbnQsIHN0b3BCc3NFdmVudCwgZXZlbnRfbGVuKTsKKyAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gZXZlbnRfbGVuOworICAgICAgICB3ZV9ldmVudCA9IElXRVZDVVNUT007CisgICAgICAgIHdlX2N1c3RvbV9ldmVudF9nZW5lcmljID0gd2VfY3VzdG9tX2V2ZW50OworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgd2VfZXZlbnQsICZ3cnF1LCAoY2hhciAqKXdlX2N1c3RvbV9ldmVudF9nZW5lcmljKTsKKyAgICB9CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KK2ludCBoZGRfc29mdGFwX3VucGFja0lFKCAKKyAgICAgICAgICAgICAgICB0SGFsSGFuZGxlIGhhbEhhbmRsZSwKKyAgICAgICAgICAgICAgICBlQ3NyRW5jcnlwdGlvblR5cGUgKnBFbmNyeXB0VHlwZSwgCisgICAgICAgICAgICAgICAgZUNzckVuY3J5cHRpb25UeXBlICptY0VuY3J5cHRUeXBlLCAKKyAgICAgICAgICAgICAgICBlQ3NyQXV0aFR5cGUgKnBBdXRoVHlwZSwgCisgICAgICAgICAgICAgICAgdV9pbnQxNl90IGdlbl9pZV9sZW4sIAorICAgICAgICAgICAgICAgIHVfaW50OF90ICpnZW5faWUgKQoreworICAgIHREb3QxMWZJRVJTTiBkb3QxMVJTTklFOyAKKyAgICB0RG90MTFmSUVXUEEgZG90MTFXUEFJRTsgCisgCisgICAgdEFOSV9VOCAqcFJzbkllOyAKKyAgICB0QU5JX1UxNiBSU05JZUxlbjsKKyAgICAKKyAgICBpZiAoTlVMTCA9PSBoYWxIYW5kbGUpCisgICAgeworICAgICAgICBoZGRMb2coTE9HRSwgRkwoIkVycm9yIGhhSGFuZGxlIHJldHVybmVkIE5VTExcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIAorICAgIC8vIFZhbGlkaXR5IGNoZWNrcworICAgIGlmICgoZ2VuX2llX2xlbiA8IFZPU19NSU4oRE9UMTFGX0lFX1JTTl9NSU5fTEVOLCBET1QxMUZfSUVfV1BBX01JTl9MRU4pKSB8fCAgCisgICAgICAgIChnZW5faWVfbGVuID4gVk9TX01BWChET1QxMUZfSUVfUlNOX01BWF9MRU4sIERPVDExRl9JRV9XUEFfTUFYX0xFTikpICkgCisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIC8vIFR5cGUgY2hlY2sKKyAgICBpZiAoIGdlbl9pZVswXSA9PSAgRE9UMTFGX0VJRF9SU04pIAorICAgIHsgICAgICAgICAKKyAgICAgICAgLy8gVmFsaWRpdHkgY2hlY2tzCisgICAgICAgIGlmICgoZ2VuX2llX2xlbiA8IERPVDExRl9JRV9SU05fTUlOX0xFTiApIHx8ICAKKyAgICAgICAgICAgIChnZW5faWVfbGVuID4gRE9UMTFGX0lFX1JTTl9NQVhfTEVOKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICAvLyBTa2lwIHBhc3QgdGhlIEVJRCBieXRlIGFuZCBsZW5ndGggYnl0ZSAgCisgICAgICAgIHBSc25JZSA9IGdlbl9pZSArIDI7IAorICAgICAgICBSU05JZUxlbiA9IGdlbl9pZV9sZW4gLSAyOyAKKyAgICAgICAgLy8gVW5wYWNrIHRoZSBSU04gSUUKKyAgICAgICAgbWVtc2V0KCZkb3QxMVJTTklFLCAwLCBzaXplb2YodERvdDExZklFUlNOKSk7CisgICAgICAgIGRvdDExZlVucGFja0llUlNOKCh0cEFuaVNpckdsb2JhbCkgaGFsSGFuZGxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnNuSWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTkllTGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG90MTFSU05JRSk7CisgICAgICAgIC8vIENvcHkgb3V0IHRoZSBlbmNyeXB0aW9uIGFuZCBhdXRoZW50aWNhdGlvbiB0eXBlcyAKKyAgICAgICAgaGRkTG9nKExPRzEsIEZMKCIlczogcGFpcndpc2UgY2lwaGVyIHN1aXRlIGNvdW50OiAlZFxuIiksIAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZG90MTFSU05JRS5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKTsKKyAgICAgICAgaGRkTG9nKExPRzEsIEZMKCIlczogYXV0aGVudGljYXRpb24gc3VpdGUgY291bnQ6ICVkXG4iKSwgCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkb3QxMVJTTklFLmFrbV9zdWl0ZV9jb3VudCk7CisgICAgICAgIC8qSGVyZSB3ZSBoYXZlIGZvbGxvd2VkIHRoZSBhcHBsZSBiYXNlIGNvZGUsIAorICAgICAgICAgIGJ1dCBwcm9iYWJseSBJIHN1c3BlY3Qgd2UgY2FuIGRvIHNvbWV0aGluZyBkaWZmZXJlbnQqLworICAgICAgICAvL2RvdDExUlNOSUUuYWttX3N1aXRlX2NvdW50CisgICAgICAgIC8vIEp1c3QgdHJhbnNsYXRlIHRoZSBGSVJTVCBvbmUgCisgICAgICAgICpwQXV0aFR5cGUgPSAgaGRkX1RyYW5zbGF0ZVJTTlRvQ3NyQXV0aFR5cGUoZG90MTFSU05JRS5ha21fc3VpdGVzWzBdKTsgCisgICAgICAgIC8vZG90MTFSU05JRS5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgCisgICAgICAgICpwRW5jcnlwdFR5cGUgPSBoZGRfVHJhbnNsYXRlUlNOVG9Dc3JFbmNyeXB0aW9uVHlwZShkb3QxMVJTTklFLnB3aXNlX2NpcGhlcl9zdWl0ZXNbMF0pOyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAvL2RvdDExUlNOSUUuZ3BfY2lwaGVyX3N1aXRlX2NvdW50IAorICAgICAgICAqbWNFbmNyeXB0VHlwZSA9IGhkZF9UcmFuc2xhdGVSU05Ub0NzckVuY3J5cHRpb25UeXBlKGRvdDExUlNOSUUuZ3BfY2lwaGVyX3N1aXRlKTsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gU2V0IHRoZSBQTUtTQSBJRCBDYWNoZSBmb3IgdGhpcyBpbnRlcmZhY2UKKyAgICAgICAgICAKKyAgICAgICAgLy8gQ2FsbGluZyBjc3JSb2FtU2V0UE1LSURDYWNoZSB0byBjb25maWd1cmUgdGhlIFBNS0lEcyBpbnRvIHRoZSBjYWNoZQorICAgIH0gZWxzZSAKKyAgICBpZiAoZ2VuX2llWzBdID09IERPVDExRl9FSURfV1BBKSAKKyAgICB7ICAgICAgICAgCisgICAgICAgIC8vIFZhbGlkaXR5IGNoZWNrcworICAgICAgICBpZiAoKGdlbl9pZV9sZW4gPCBET1QxMUZfSUVfV1BBX01JTl9MRU4gKSB8fCAgCisgICAgICAgICAgICAoZ2VuX2llX2xlbiA+IERPVDExRl9JRV9XUEFfTUFYX0xFTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICAvLyBTa2lwIHBhc3QgdGhlIEVJRCBieXRlIGFuZCBsZW5ndGggYnl0ZSAtIGFuZCBmb3VyIGJ5dGUgV2lGaSBPVUkgIAorICAgICAgICBwUnNuSWUgPSBnZW5faWUgKyAyICsgNDsgCisgICAgICAgIFJTTkllTGVuID0gZ2VuX2llX2xlbiAtICgyICsgNCk7IAorICAgICAgICAvLyBVbnBhY2sgdGhlIFdQQSBJRQorICAgICAgICBtZW1zZXQoJmRvdDExV1BBSUUsIDAsIHNpemVvZih0RG90MTFmSUVXUEEpKTsKKyAgICAgICAgZG90MTFmVW5wYWNrSWVXUEEoKHRwQW5pU2lyR2xvYmFsKSBoYWxIYW5kbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSc25JZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOSWVMZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb3QxMVdQQUlFKTsKKyAgICAgICAgLy8gQ29weSBvdXQgdGhlIGVuY3J5cHRpb24gYW5kIGF1dGhlbnRpY2F0aW9uIHR5cGVzIAorICAgICAgICBoZGRMb2coTE9HMSwgRkwoIiVzOiBXUEEgdW5pY2FzdCBjaXBoZXIgc3VpdGUgY291bnQ6ICVkXG4iKSwgCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkb3QxMVdQQUlFLnVuaWNhc3RfY2lwaGVyX2NvdW50ICk7CisgICAgICAgIGhkZExvZyhMT0cxLCBGTCgiJXM6IFdQQSBhdXRoZW50aWNhdGlvbiBzdWl0ZSBjb3VudDogJWRcbiIpLCAKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRvdDExV1BBSUUuYXV0aF9zdWl0ZV9jb3VudCk7CisgICAgICAgIC8vZG90MTFXUEFJRS5hdXRoX3N1aXRlX2NvdW50CisgICAgICAgIC8vIEp1c3QgdHJhbnNsYXRlIHRoZSBGSVJTVCBvbmUgCisgICAgICAgICpwQXV0aFR5cGUgPSAgaGRkX1RyYW5zbGF0ZVdQQVRvQ3NyQXV0aFR5cGUoZG90MTFXUEFJRS5hdXRoX3N1aXRlc1swXSk7IAorICAgICAgICAvL2RvdDExV1BBSUUudW5pY2FzdF9jaXBoZXJfY291bnQgCisgICAgICAgICpwRW5jcnlwdFR5cGUgPSBoZGRfVHJhbnNsYXRlV1BBVG9Dc3JFbmNyeXB0aW9uVHlwZShkb3QxMVdQQUlFLnVuaWNhc3RfY2lwaGVyc1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy9kb3QxMVdQQUlFLnVuaWNhc3RfY2lwaGVyX2NvdW50IAorICAgICAgICAqbWNFbmNyeXB0VHlwZSA9IGhkZF9UcmFuc2xhdGVXUEFUb0NzckVuY3J5cHRpb25UeXBlKGRvdDExV1BBSUUubXVsdGljYXN0X2NpcGhlcik7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9IAorICAgIGVsc2UgCisgICAgeyAKKyAgICAgICAgaGRkTG9nKExPR1csIEZMKCIlczogZ2VuX2llWzBdOiAlZFxuIiksIF9fRlVOQ1RJT05fXywgZ2VuX2llWzBdKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOyAKKyAgICB9CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KK2ludAorc3RhdGljIGl3X3NvZnRhcF9zZXRwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisgICAgaW50ICp2YWx1ZSA9IChpbnQgKilleHRyYTsKKyAgICBpbnQgc3ViX2NtZCA9IHZhbHVlWzBdOworICAgIGludCBzZXRfdmFsdWUgPSB2YWx1ZVsxXTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICBpbnQgcmV0ID0gMDsgLyogc3VjY2VzcyAqLworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPnB2b3NDb250ZXh0OyAKKworICAgIHN3aXRjaChzdWJfY21kKQorICAgIHsKKworICAgICAgICBjYXNlIFFDU0FQX1BBUkFNX0NMUl9BQ0w6CisgICAgICAgICAgICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gV0xBTlNBUF9DbGVhckFDTCggcFZvc0NvbnRleHQgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldCA9IC1FSU87ICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFFDU0FQX1BBUkFNX0FDTF9NT0RFOgorICAgICAgICAgICAgaWYgKChlU0FQX0FMTE9XX0FMTCA8IChlU2FwTWFjQWRkckFDTClzZXRfdmFsdWUpIHx8IAorICAgICAgICAgICAgICAgIChlU0FQX0FDQ0VQVF9VTkxFU1NfREVOSUVEID4gKGVTYXBNYWNBZGRyQUNMKXNldF92YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsIEZMKCJJbnZhbGlkIEFDTCBNb2RlIHZhbHVlICVkIiksIHNldF92YWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXTEFOU0FQX1NldE1vZGUocFZvc0NvbnRleHQsIHNldF92YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRQ1NBUF9QQVJBTV9NQVhfQVNTT0M6CisgICAgICAgICAgICBpZiAoV05JX0NGR19BU1NPQ19TVEFfTElNSVRfU1RBTUlOID4gc2V0X3ZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBzZXRNYXhBc3NvYyB2YWx1ZSAlZCIpLCBzZXRfdmFsdWUpOworICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQU1BWCA8IHNldF92YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhkZExvZyhMT0dXLCBGTCgic2V0TWF4QXNzb2MgdmFsdWUgJWQgaGlnaGVyIHRoYW4gbWF4IGFsbG93ZWQgJWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyBpdCB0byBtYXggYWxsb3dlZCBhbmQgY29udGludWluZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdmFsdWUsIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQU1BWCk7CisgICAgICAgICAgICAgICAgICAgIHNldF92YWx1ZSA9IFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQU1BWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY2NtQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdmFsdWUsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsIEZMKCJzZXRNYXhBc3NvYyBmYWlsdXJlLCBzdGF0dXMgJWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUUNTQVBfUEFSQU1fSElERV9TU0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzbWVfSGlkZVNTSUQoaEhhbCwgcEhvc3RhcGRBZGFwdGVyLT5zZXNzaW9uSWQsIHNldF92YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogUUNTQVBfUEFSQU1fSElERV9TU0lEIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBzZXRwYXJhbSBjb21tYW5kICVkIHZhbHVlICVkIiksCisgICAgICAgICAgICAgICAgICAgIHN1Yl9jbWQsIHNldF92YWx1ZSk7CisgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworCitpbnQKK3N0YXRpYyBpd19zb2Z0YXBfZ2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKyAgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworICAgIGludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisgICAgaW50IHN1Yl9jbWQgPSB2YWx1ZVswXTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICBpbnQgcmV0ID0gMDsgLyogc3VjY2VzcyAqLworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPnB2b3NDb250ZXh0OyAKKworICAgIHN3aXRjaCAoc3ViX2NtZCkKKyAgICB7CisgICAgY2FzZSBRQ1NBUF9QQVJBTV9NQVhfQVNTT0M6CisgICAgICAgIHN0YXR1cyA9IGNjbUNmZ0dldEludChoSGFsLCBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVCwgKHRBTklfVTMyICopdmFsdWUpOworICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IC1FSU87CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgUUNTQVBfUEFSQU1fQ0xSX0FDTDoKKyAgICAgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IFdMQU5TQVBfQ2xlYXJBQ0woIHBWb3NDb250ZXh0ICkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldCA9IC1FSU87ICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgICAgICAgICAKKyAgICAgICAgKnZhbHVlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgUUNTQVBfUEFSQU1fTU9EVUxFX0RPV05fSU5EOgorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICIlczogc2VuZGluZyBXTEFOX01PRFVMRV9ET1dOX0lORCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBzZW5kX2J0Y19ubGlua19tc2coV0xBTl9NT0RVTEVfRE9XTl9JTkQsIDApOworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRSAKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgIiVzOiBUYWtlIGRvd24gQU1QIFBBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBCU0xfRGVpbml0KHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQsIE5VTEwpKTsKKyNlbmRpZiAgICAgICAgICAgIAorICAgICAgICAgICAgKnZhbHVlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgIAorICAgIGRlZmF1bHQ6CisgICAgICAgIGhkZExvZyhMT0dFLCBGTCgiSW52YWxpZCBnZXRwYXJhbSBjb21tYW5kICVkIiksIHN1Yl9jbWQpOworICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIFVzYWdlOgorICAgIEJMQUNLX0xJU1QgID0gMAorICAgIFdISVRFX0xJU1QgID0gMSAKKyAgICBBREQgTUFDID0gMAorICAgIFJFTU9WRSBNQUMgID0gMQorCisgICAgbWFjIGFkZHIgd2lsbCBiZSBhY2NlcHRlZCBhcyBhIDYgb2N0ZXQgbWFjIGFkZHJlc3Mgd2l0aCBlYWNoIG9jdGV0IGlucHV0dGVkIGluIGhleAorICAgIGZvciBlLmcuIDAwOjBhOmY1OjExOjIyOjMzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgMHgwMCAweDBhIDB4ZjUgMHgxMSAweDIyIDB4MzMKKyAgICB3aGlsZSB1c2luZyB0aGlzIGlvY3RsCisKKyAgICBTeW50YXg6CisgICAgaXdwcml2IHNvZnRhcC4wIG1vZGlmeV9hY2wgCisgICAgPDYgb2N0ZXQgbWFjIGFkZHI+IDxsaXN0IHR5cGU+IDxjbWQgdHlwZT4KKworICAgIEV4YW1wbGVzOgorICAgIGVnIDEuIHRvIGFkZCBhIG1hYyBhZGRyIDAwOjBhOmY1Ojg5Ojg5OjkwIHRvIHRoZSBibGFjayBsaXN0CisgICAgaXdwcml2IHNvZnRhcC4wIG1vZGlmeV9hY2wgMHgwMCAweDBhIDB4ZjUgMHg4OSAweDg5IDB4OTAgMCAwCisgICAgZWcgMi4gdG8gZGVsZXRlIGEgbWFjIGFkZHIgMDA6MGE6ZjU6ODk6ODk6OTAgZnJvbSB3aGl0ZSBsaXN0CisgICAgaXdwcml2IHNvZnRhcC4wIG1vZGlmeV9hY2wgMHgwMCAweDBhIDB4ZjUgMHg4OSAweDg5IDB4OTAgMSAxCisqLworaW50IGl3X3NvZnRhcF9tb2RpZnlfYWNsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKyAgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCA9IChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5wdm9zQ29udGV4dDsgCisgICAgdl9CWVRFX3QgKnZhbHVlID0gKHZfQllURV90KilleHRyYTsKKyAgICB2X1U4X3QgcFBlZXJTdGFNYWNbVk9TX01BQ19BRERSX1NJWkVdOworICAgIGludCBsaXN0VHlwZSwgY21kLCBpOworICAgIGludCByZXQgPSAwOyAvKiBzdWNjZXNzICovCisKKyAgICBFTlRFUigpOworICAgIGZvciAoaT0wOyBpPFZPU19NQUNfQUREUl9TSVpFOyBpKyspCisgICAgeworICAgICAgICBwUGVlclN0YU1hY1tpXSA9ICoodmFsdWUraSk7CisgICAgfQorICAgIGxpc3RUeXBlID0gKGludCkoKih2YWx1ZStpKSk7CisgICAgaSsrOworICAgIGNtZCA9IChpbnQpKCoodmFsdWUraSkpOworCisgICAgaGRkTG9nKExPRzEsICIlczogU0FQIE1vZGlmeSBBQ0wgYXJnMCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBhcmcxICVkIGFyZzIgJWRcbiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBQZWVyU3RhTWFjWzBdLCBwUGVlclN0YU1hY1sxXSwgcFBlZXJTdGFNYWNbMl0sIAorICAgICAgICAgICAgcFBlZXJTdGFNYWNbM10sIHBQZWVyU3RhTWFjWzRdLCBwUGVlclN0YU1hY1s1XSwgbGlzdFR5cGUsIGNtZCk7CisKKyAgICBpZiAoV0xBTlNBUF9Nb2RpZnlBQ0wocFZvc0NvbnRleHQsIHBQZWVyU3RhTWFjLChlU2FwQUNMVHlwZSlsaXN0VHlwZSwoZVNhcEFDTENtZFR5cGUpY21kKQorICAgICAgICAgICAgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgaGRkTG9nKExPR0UsIEZMKCJNb2RpZnkgQUNMIGZhaWxlZFxuIikpOworICAgICAgICByZXQgPSAtRUlPOworICAgIH0KKyAgICBFWElUKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50CitzdGF0aWMgaXdfc29mdGFwX2dldGNoYW5uZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisKKyAgICAqKHZfVTMyX3QgKikod3JxdS0+ZGF0YS5wb2ludGVyKSA9IChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpKS0+b3BlcmF0aW5nQ2hhbm5lbDsKKworICAgIHdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpKS0+b3BlcmF0aW5nQ2hhbm5lbCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBJU19CUk9BRENBU1RfTUFDKHgpICgoKHhbMF0gJiB4WzFdICYgeFsyXSAmIHhbM10gJiB4WzRdICYgeFs1XSkgPT0gMHhmZikgPyAxIDogMCkKKworaW50CitzdGF0aWMgaXdfc29mdGFwX2dldGFzc29jX3N0YW1hY2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisgICAgdW5zaWduZWQgY2hhciAqcG1hY2xpc3Q7CisgICAgaGRkX3N0YXRpb25faW5mb190ICpwU3RhSW5mbyA9IHBIb3N0YXBkQWRhcHRlci0+YVN0YUluZm87CisgICAgaW50IGNudCA9IDAsIGxlbjsKKworCisgICAgcG1hY2xpc3QgPSB3cnF1LT5kYXRhLnBvaW50ZXIgKyBzaXplb2YodW5zaWduZWQgbG9uZyBpbnQpOworICAgIGxlbiA9IHdycXUtPmRhdGEubGVuZ3RoOworCisgICAgc3Bpbl9sb2NrX2JoKCAmcEhvc3RhcGRBZGFwdGVyLT5zdGFJbmZvX2xvY2sgKTsKKyAgICB3aGlsZSgoY250IDwgV0xBTl9NQVhfU1RBX0NPVU5UKSAmJiAobGVuID4gKHNpemVvZih2X01BQ0FERFJfdCkrMSkpKSB7CisgICAgICAgIGlmIChUUlVFID09IHBTdGFJbmZvW2NudF0uaXNVc2VkKSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCFJU19CUk9BRENBU1RfTUFDKHBTdGFJbmZvW2NudF0ubWFjQWRkclNUQS5ieXRlcykpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwbWFjbGlzdCwgKHZvaWQgKikmKHBTdGFJbmZvW2NudF0ubWFjQWRkclNUQSksIHNpemVvZih2X01BQ0FERFJfdCkpOworICAgICAgICAgICAgICAgIHBtYWNsaXN0ICs9IHNpemVvZih2X01BQ0FERFJfdCk7CisgICAgICAgICAgICAgICAgbGVuIC09IHNpemVvZih2X01BQ0FERFJfdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY250Kys7CisgICAgfSAKKyAgICBzcGluX3VubG9ja19iaCggJnBIb3N0YXBkQWRhcHRlci0+c3RhSW5mb19sb2NrICk7CisKKyAgICAqcG1hY2xpc3QgPSAnXDAnOworCisgICAgd3JxdS0+ZGF0YS5sZW5ndGggLT0gbGVuOworCisgICAgKih1bnNpZ25lZCBsb25nIGludCAqKSh3cnF1LT5kYXRhLnBvaW50ZXIpID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogVXNhZ2U6CisgICAgbWFjIGFkZHIgd2lsbCBiZSBhY2NlcHRlZCBhcyBhIDYgb2N0ZXQgbWFjIGFkZHJlc3Mgd2l0aCBlYWNoIG9jdGV0IGlucHV0dGVkIGluIGhleAorICAgIGZvciBlLmcuIDAwOjBhOmY1OjExOjIyOjMzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgMHgwMCAweDBhIDB4ZjUgMHgxMSAweDIyIDB4MzMKKyAgICB3aGlsZSB1c2luZyB0aGlzIGlvY3RsCisKKyAgICBTeW50YXg6CisgICAgaXdwcml2IHNvZnRhcC4wIGRpc2Fzc29jX3N0YSA8NiBvY3RldCBtYWMgYWRkcmVzcz4KKworICAgIGUuZy4KKyAgICBkaXNhc3NvY2lhdGUgc3RhIHdpdGggbWFjIGFkZHIgMDA6MGE6ZjU6MTE6MjI6MzMgZnJvbSBzb2Z0YXAKKyAgICBpd3ByaXYgc29mdGFwLjAgZGlzYXNzb2Nfc3RhIDB4MDAgMHgwYSAweGY1IDB4MTEgMHgyMiAweDMzCisqLworCitpbnQKK3N0YXRpYyBpd19zb2Z0YXBfZGlzYXNzb2Nfc3RhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworICAgIHZfVThfdCAqcGVlck1hY0FkZHI7ICAgIAorICAgIAorICAgIEVOVEVSKCk7CisgICAgLyogdGhlIGNvbXBhcmlzb24gYmVsb3cgaXMgbmVlZGVkIHNpbmNlIGlmIGl3cHJpdiB0b29sIGlzIHVzZWQgZm9yIGNhbGxpbmcgdGhpcyBpb2N0bAorICAgICAqIGRhdGEgaXMgcGFzc2VkIGluIGV4dHJhIChsZXNzIHRoYW4gMTYgb2N0ZXRzKTsgaG93ZXZlciBpbiBhbmRyb2lkIHdpZmkgZnJhbWV3b3JrCisgICAgICogZGF0YSBpcyBwbGFjZWQgaW4gd3JxdS0+ZGF0YS5wb2ludGVyLgorICAgICAqLworICAgIGlmICgodl9VOF90Kil3cnF1ID09ICh2X1U4X3QqKWV4dHJhKQorICAgICAgICBwZWVyTWFjQWRkciA9ICh2X1U4X3QgKikoZXh0cmEpOworICAgIGVsc2UKKyAgICAgICAgcGVlck1hY0FkZHIgPSAodl9VOF90ICopKHdycXUtPmRhdGEucG9pbnRlcik7CisKKyAgICBoZGRMb2coTE9HMSwgImRhdGEgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgcGVlck1hY0FkZHJbMF0sIHBlZXJNYWNBZGRyWzFdLCBwZWVyTWFjQWRkclsyXSwKKyAgICAgICAgICAgIHBlZXJNYWNBZGRyWzNdLCBwZWVyTWFjQWRkcls0XSwgcGVlck1hY0FkZHJbNV0pOworICAgIGhkZF9zb2Z0YXBfc3RhX2Rpc2Fzc29jKHBIb3N0YXBkQWRhcHRlciwgcGVlck1hY0FkZHIpOworICAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50CitzdGF0aWMgaXdfc29mdGFwX2FwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworICAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAgc3RhdEJ1ZmZlcjsKKyAgICBjaGFyICpwc3RhdGJ1ZjsKKyAgICBpbnQgbGVuID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisgICAgcHN0YXRidWYgPSB3cnF1LT5kYXRhLnBvaW50ZXI7CisKKyAgICBXTEFOU0FQX0dldFN0YXRpc3RpY3MoKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPnB2b3NDb250ZXh0LCAmc3RhdEJ1ZmZlciwgKHZfQk9PTF90KXdycXUtPmRhdGEuZmxhZ3MpOworCisgICAgbGVuID0gc25wcmludGYocHN0YXRidWYsIGxlbiwKKyAgICAgICAgICAgICJSVUY9JWQgUk1GPSVkIFJCRj0lZCAiCisgICAgICAgICAgICAiUlVCPSVkIFJNQj0lZCBSQkI9JWQgIgorICAgICAgICAgICAgIlRVRj0lZCBUTUY9JWQgVEJGPSVkICIKKyAgICAgICAgICAgICJUVUI9JWQgVE1CPSVkIFRCQj0lZCIsCisgICAgICAgICAgICAoaW50KXN0YXRCdWZmZXIucnhVQ0ZjbnQsIChpbnQpc3RhdEJ1ZmZlci5yeE1DRmNudCwgKGludClzdGF0QnVmZmVyLnJ4QkNGY250LAorICAgICAgICAgICAgKGludClzdGF0QnVmZmVyLnJ4VUNCY250LCAoaW50KXN0YXRCdWZmZXIucnhNQ0JjbnQsIChpbnQpc3RhdEJ1ZmZlci5yeEJDQmNudCwKKyAgICAgICAgICAgIChpbnQpc3RhdEJ1ZmZlci50eFVDRmNudCwgKGludClzdGF0QnVmZmVyLnR4TUNGY250LCAoaW50KXN0YXRCdWZmZXIudHhCQ0ZjbnQsCisgICAgICAgICAgICAoaW50KXN0YXRCdWZmZXIudHhVQ0JjbnQsIChpbnQpc3RhdEJ1ZmZlci50eE1DQmNudCwgKGludClzdGF0QnVmZmVyLnR4QkNCY250CisgICAgICAgICAgICApOworCisgICAgd3JxdS0+ZGF0YS5sZW5ndGggLT0gbGVuOworICAgIHJldHVybiAwOworfQorCitpbnQKK3N0YXRpYyBpd19zb2Z0YXBfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgVk9TX1NUQVRVUyB2b3Nfc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKyAgICBoZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlOworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPnB2b3NDb250ZXh0OyAKKyAgICB0cFdMQU5fU0FQRXZlbnRDQiBwU2FwRXZlbnRDYWxsYmFjazsKKyAgICB0c2FwX0NvbmZpZ190ICpwQ29uZmlnOworICAgIHNfQ29tbWl0Q29uZmlnX3QgKnBDb21taXRDb25maWc7CisgICAgc3RydWN0IHFjX21hY19hY2xfZW50cnkgKmFjbF9lbnRyeSA9IE5VTEw7CisgICAgdl9TSU5UX3QgaSA9IDAsIG51bV9tYWMgPSAwOworICAgIHZfVTMyX3Qgc3RhdHVzID0gMDsKKyAgICBlQ3NyQXV0aFR5cGUgUlNOQXV0aFR5cGU7CisgICAgZUNzckVuY3J5cHRpb25UeXBlIFJTTkVuY3J5cHRUeXBlOworICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBtY1JTTkVuY3J5cHRUeXBlOworCisgICAgcEhvc3RhcGRTdGF0ZSA9IFdMQU5fSEREX0dFVF9IT1NUQVBfU1RBVEVfUFRSKHBIb3N0YXBkQWRhcHRlcik7CisgICAgcENvbW1pdENvbmZpZyA9IChzX0NvbW1pdENvbmZpZ190ICopZXh0cmE7CisgICAgCisgICAgcENvbmZpZyA9IGttYWxsb2Moc2l6ZW9mKHRzYXBfQ29uZmlnX3QpLCBHRlBfS0VSTkVMKTsKKyAgICBpZihOVUxMID09IHBDb25maWcpIHsKKyAgICAgICAgaGRkTG9nKExPRzEsICJWT1MgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKyAgICBwQ29uZmlnLT5iZWFjb25faW50ID0gIHBDb21taXRDb25maWctPmJlYWNvbl9pbnQ7CisgICAgcENvbmZpZy0+Y2hhbm5lbCA9IHBDb21taXRDb25maWctPmNoYW5uZWw7CisKKyAgICAvKlByb3RlY3Rpb24gcGFyYW1ldGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlKi8KKyAgICBwQ29uZmlnLT5wcm90RW5hYmxlZCA9IChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5jZmdfaW5pLT5hcFByb3RFbmFibGVkOworICAgIHBDb25maWctPmR0aW1fcGVyaW9kID0gcENvbW1pdENvbmZpZy0+ZHRpbV9wZXJpb2Q7CisgICAgc3dpdGNoKHBDb21taXRDb25maWctPmh3X21vZGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBlUUNfRE9UMTFfTU9ERV8xMUE6CisgICAgICAgIHBDb25maWctPlNhcEh3X21vZGUgPSBlU0FQX0RPVDExX01PREVfMTFhOyAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVRQ19ET1QxMV9NT0RFXzExQjoKKyAgICAgICAgcENvbmZpZy0+U2FwSHdfbW9kZSA9IGVTQVBfRE9UMTFfTU9ERV8xMWI7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZVFDX0RPVDExX01PREVfMTFHOgorICAgICAgICBwQ29uZmlnLT5TYXBId19tb2RlID0gZVNBUF9ET1QxMV9NT0RFXzExZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgIAorICAgICAgICBjYXNlIGVRQ19ET1QxMV9NT0RFXzExTjoKKyAgICAgICAgcENvbmZpZy0+U2FwSHdfbW9kZSA9IGVTQVBfRE9UMTFfTU9ERV8xMW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlUUNfRE9UMTFfTU9ERV8xMUdfT05MWToKKyAgICAgICAgICAgIHBDb25maWctPlNhcEh3X21vZGUgPSBlU0FQX0RPVDExX01PREVfMTFnX09OTFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlUUNfRE9UMTFfTU9ERV8xMU5fT05MWToKKyAgICAgICAgICAgIHBDb25maWctPlNhcEh3X21vZGUgPSBlU0FQX0RPVDExX01PREVfMTFuX09OTFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgcENvbmZpZy0+U2FwSHdfbW9kZSA9IGVTQVBfRE9UMTFfTU9ERV8xMW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgIH0KKyAgCisgICAgcENvbmZpZy0+aWVlZTgwMjExZCA9IHBDb21taXRDb25maWctPnFjc2FwODAyMTFkOworICAgIHZvc19tZW1fY29weShwQ29uZmlnLT5jb3VudHJ5Q29kZSwgcENvbW1pdENvbmZpZy0+Y291bnRyeUNvZGUsIDMpOworICAgIGlmKHBDb21taXRDb25maWctPmF1dGhUeXBlID09IGVRQ19BVVRIX1RZUEVfU0hBUkVEX0tFWSkKKyAgICAgICAgcENvbmZpZy0+YXV0aFR5cGUgPSBlU0FQX1NIQVJFRF9LRVk7CisgICAgZWxzZSBpZihwQ29tbWl0Q29uZmlnLT5hdXRoVHlwZSA9PSBlUUNfQVVUSF9UWVBFX09QRU5fU1lTVEVNKSAKKyAgICAgICAgcENvbmZpZy0+YXV0aFR5cGUgPSBlU0FQX09QRU5fU1lTVEVNOworICAgIGVsc2UKKyAgICAgICAgcENvbmZpZy0+YXV0aFR5cGUgPSBlU0FQX0FVVE9fU1dJVENIOworICAgIAorICAgIHBDb25maWctPnByaXZhY3kgPSBwQ29tbWl0Q29uZmlnLT5wcml2YWN5OworICAgIChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpKS0+dVByaXZhY3kgPSBwQ29tbWl0Q29uZmlnLT5wcml2YWN5OworICAgIHBDb25maWctPndwc19zdGF0ZSA9IHBDb21taXRDb25maWctPndwc19zdGF0ZTsKKyAgICBwQ29uZmlnLT5md2RXUFNQQkNQcm9iZVJlcSAgPSAxOyAvLyBGb3J3YXJkIFdQUyBQQkMgcHJvYmUgcmVxdWVzdCBmcmFtZSB1cCAKKyAgICBwQ29uZmlnLT5SU05XUEFSZXFJRUxlbmd0aCA9IHBDb21taXRDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoOworICAgIGlmKHBDb25maWctPlJTTldQQVJlcUlFTGVuZ3RoKXsKKyAgICAgICAgcENvbmZpZy0+cFJTTldQQVJlcUlFID0gJnBDb21taXRDb25maWctPlJTTldQQVJlcUlFWzBdOworICAgICAgICBpZiAoKHBDb25maWctPnBSU05XUEFSZXFJRVswXSA9PSBET1QxMUZfRUlEX1JTTikgfHwgKHBDb25maWctPnBSU05XUEFSZXFJRVswXSA9PSBET1QxMUZfRUlEX1dQQSkpeworICAgICAgICAgICAgLy8gVGhlIGFjdHVhbCBwcm9jZXNzaW5nIG1heSBldmVudHVhbGx5IGJlIG1vcmUgZXh0ZW5zaXZlIHRoYW4gdGhpcy4KKyAgICAgICAgICAgIC8vIFJpZ2h0IG5vdywganVzdCBjb25zdW1lIGFueSBQTUtJRHMgdGhhdCBhcmUgIHNlbnQgaW4gYnkgdGhlIGFwcC4KKyAgICAgICAgICAgIHN0YXR1cyA9IGhkZF9zb2Z0YXBfdW5wYWNrSUUoIAorI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfSEFMLCBwVm9zQ29udGV4dCksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9QRSwgcFZvc0NvbnRleHQpLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJTTkVuY3J5cHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtY1JTTkVuY3J5cHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05BdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5wUlNOV1BBUmVxSUVbMV0rMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5wUlNOV1BBUmVxSUUgKTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgLy8gTm93IGNvcHkgb3ZlciBhbGwgdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgeW91IGhhdmUgcGFyc2VkIG91dAorICAgICAgICAgICAgICAgICAvL1RPRE86IE5lZWQgdG8gaGFuZGxlIG1peGVkIG1vZGUgICAgIAorICAgICAgICAgICAgICAgICBwQ29uZmlnLT5SU05FbmNyeXB0VHlwZSA9IFJTTkVuY3J5cHRUeXBlOyAvLyBVc2UgdGhlIGNpcGhlciB0eXBlIGluIHRoZSBSU04gSUUKKyAgICAgICAgICAgICAgICAgcENvbmZpZy0+bWNSU05FbmNyeXB0VHlwZSA9IG1jUlNORW5jcnlwdFR5cGU7CisgICAgICAgICAgICAgICAgIGhkZExvZyggTE9HMSwgRkwoIiVzOiBDU1IgQXV0aFR5cGUgPSAlZCwgRW5jcnlwdGlvblR5cGUgPSAlZCBtY0VuY3J5cHRpb25UeXBlID0gJWRcbiIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05BdXRoVHlwZSwgUlNORW5jcnlwdFR5cGUsIG1jUlNORW5jcnlwdFR5cGUpOworICAgICAgICAgICAgIH0gCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogSWYgbm8gUlNOSUUsIHNldCBlbmNyeXB0IHR5cGUgdG8gTk9ORSovCisgICAgICAgIHBDb25maWctPlJTTkVuY3J5cHRUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyAgICAgICAgcENvbmZpZy0+bWNSU05FbmNyeXB0VHlwZSA9ICBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgICAgICBoZGRMb2coIExPRzEsIEZMKCJFbmNyeXB0aW9uVHlwZSA9ICVkIG1jRW5jcnlwdGlvblR5cGUgPSAlZFxuIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPlJTTkVuY3J5cHRUeXBlLCBwQ29uZmlnLT5tY1JTTkVuY3J5cHRUeXBlKTsKKyAgICB9CisKKyAgICBwQ29uZmlnLT5TU0lEaW5mby5zc2lkSGlkZGVuID0gcENvbW1pdENvbmZpZy0+U1NJRGluZm8uc3NpZEhpZGRlbjsgCisgICAgcENvbmZpZy0+U1NJRGluZm8uc3NpZC5sZW5ndGggPSBwQ29tbWl0Q29uZmlnLT5TU0lEaW5mby5zc2lkLmxlbmd0aDsKKyAgICB2b3NfbWVtX2NvcHkocENvbmZpZy0+U1NJRGluZm8uc3NpZC5zc0lkLCBwQ29tbWl0Q29uZmlnLT5TU0lEaW5mby5zc2lkLnNzSWQsIHBDb25maWctPlNTSURpbmZvLnNzaWQubGVuZ3RoKTsKKyAgICB2b3NfbWVtX2NvcHkocENvbmZpZy0+c2VsZl9tYWNhZGRyLmJ5dGVzLCBwSG9zdGFwZEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLCBzaXplb2Yodl9NQUNBRERSX3QpKTsKKyAgICAKKyAgICBwQ29uZmlnLT5TYXBNYWNhZGRyX2FjbCA9IHBDb21taXRDb25maWctPnFjX21hY2FkZHJfYWNsOworCisgICAgLy8gaHRfY2FwYWIgaXMgbm90IHdoYXQgdGhlIG5hbWUgY29udmV5cyx0aGlzIGlzIHVzZWQgZm9yIHByb3RlY3Rpb24gYml0bWFwCisgICAgcENvbmZpZy0+aHRfY2FwYWIgPSAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+Y2ZnX2luaS0+YXBQcm90ZWN0aW9uOworCisgICAgaWYgKHBDb21taXRDb25maWctPm51bV9hY2NlcHRfbWFjID4gTUFYX01BQ19BRERSRVNTX0FDQ0VQVEVEKQorICAgICAgICBudW1fbWFjID0gcENvbmZpZy0+bnVtX2FjY2VwdF9tYWMgPSBNQVhfTUFDX0FERFJFU1NfQUNDRVBURUQ7CisgICAgZWxzZQorICAgICAgICBudW1fbWFjID0gcENvbmZpZy0+bnVtX2FjY2VwdF9tYWMgPSBwQ29tbWl0Q29uZmlnLT5udW1fYWNjZXB0X21hYzsKKyAgICBhY2xfZW50cnkgPSBwQ29tbWl0Q29uZmlnLT5hY2NlcHRfbWFjOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbWFjOyBpKyspCisgICAgeworICAgICAgICB2b3NfbWVtX2NvcHkoJnBDb25maWctPmFjY2VwdF9tYWNbaV0sIGFjbF9lbnRyeS0+YWRkciwgc2l6ZW9mKHZfTUFDQUREUl90KSk7CisgICAgICAgIGFjbF9lbnRyeSsrOworICAgIH0KKyAgICBpZiAocENvbW1pdENvbmZpZy0+bnVtX2RlbnlfbWFjID4gTUFYX01BQ19BRERSRVNTX0RFTklFRCkKKyAgICAgICAgbnVtX21hYyA9IHBDb25maWctPm51bV9kZW55X21hYyA9IE1BWF9NQUNfQUREUkVTU19ERU5JRUQ7CisgICAgZWxzZQorICAgICAgICBudW1fbWFjID0gcENvbmZpZy0+bnVtX2RlbnlfbWFjID0gcENvbW1pdENvbmZpZy0+bnVtX2RlbnlfbWFjOworICAgIGFjbF9lbnRyeSA9IHBDb21taXRDb25maWctPmRlbnlfbWFjOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbWFjOyBpKyspCisgICAgeworICAgICAgICB2b3NfbWVtX2NvcHkoJnBDb25maWctPmRlbnlfbWFjW2ldLCBhY2xfZW50cnktPmFkZHIsIHNpemVvZih2X01BQ0FERFJfdCkpOworICAgICAgICBhY2xfZW50cnkrKzsKKyAgICB9CisgICAgLy9VYXBzZCBFbmFibGVkIEJpdAorICAgIHBDb25maWctPlVhcHNkRW5hYmxlID0gIChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5jZmdfaW5pLT5hcFVhcHNkRW5hYmxlZDsKKyAgICAvL0VuYWJsZSBPQlNTIHByb3RlY3Rpb24KKyAgICBwQ29uZmlnLT5vYnNzUHJvdEVuYWJsZWQgPSAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+Y2ZnX2luaS0+YXBPQlNTUHJvdEVuYWJsZWQ7IAorICAgIChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpKS0+YXBEaXNhYmxlSW50cmFCc3NGd2QgPSAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+Y2ZnX2luaS0+YXBEaXNhYmxlSW50cmFCc3NGd2Q7CisgICAgCisgICAgaGRkTG9nKExPR1csIEZMKCJTT2Z0QVAgbWFjYWRkcmVzcyA6ICJNQUNfQUREUkVTU19TVFIiXG4iKSwgTUFDX0FERFJfQVJSQVkocEhvc3RhcGRBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcykpOworICAgIGhkZExvZyhMT0dXLEZMKCJzc2lkID0lc1xuIiksIHBDb25maWctPlNTSURpbmZvLnNzaWQuc3NJZCk7ICAKKyAgICBoZGRMb2coTE9HVyxGTCgiYmVhY29uaW50PSVkLCBjaGFubmVsPSVkXG4iKSwgKGludClwQ29uZmlnLT5iZWFjb25faW50LCAoaW50KXBDb25maWctPmNoYW5uZWwpOworICAgIGhkZExvZyhMT0dXLEZMKCJod19tb2RlPSV4XG4iKSwgIHBDb25maWctPlNhcEh3X21vZGUpOworICAgIGhkZExvZyhMT0dXLEZMKCJwcml2YWN5PSVkLCBhdXRoVHlwZT0lZFxuIiksIHBDb25maWctPnByaXZhY3ksIHBDb25maWctPmF1dGhUeXBlKTsgCisgICAgaGRkTG9nKExPR1csRkwoIlJTTi9XUEFMZW49JWQsIFxuIiksKGludClwQ29uZmlnLT5SU05XUEFSZXFJRUxlbmd0aCk7CisgICAgaGRkTG9nKExPR1csRkwoIlVhcHNkID0gJWRcbiIpLHBDb25maWctPlVhcHNkRW5hYmxlKTsgCisgICAgaGRkTG9nKExPR1csRkwoIlByb3RFbmFibGVkID0gJWQsIE9CU1NQcm90RW5hYmxlZCA9ICVkXG4iKSxwQ29uZmlnLT5wcm90RW5hYmxlZCwgcENvbmZpZy0+b2Jzc1Byb3RFbmFibGVkKTsgCisgICAgaGRkTG9nKExPR1csRkwoIkRpc2FibGVJbnRyYUJzc0Z3ZCA9ICVkXG4iKSwoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKSktPmFwRGlzYWJsZUludHJhQnNzRndkKTsgCisgICAgICAgICAgICAKKyAgICBwU2FwRXZlbnRDYWxsYmFjayA9IGhkZF9ob3N0YXBkX1NBUEV2ZW50Q0I7CisgICAgcENvbmZpZy0+cGVyc29uYSA9IHBIb3N0YXBkQWRhcHRlci0+ZGV2aWNlX21vZGU7CisgICAgaWYoV0xBTlNBUF9TdGFydEJzcyhwVm9zQ29udGV4dCwgcFNhcEV2ZW50Q2FsbGJhY2ssIHBDb25maWcsKHZfUFZPSURfdClkZXYpICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgICAgIGhkZExvZyhMT0dFLEZMKCJTQVAgU3RhcnQgQnNzIGZhaWxcbiIpKTsKKyAgICB9CisgICAgCisgICAga2ZyZWUocENvbmZpZyk7CisgICAgCisgICAgaGRkTG9nKExPRzEsIEZMKCJXYWl0aW5nIGZvciBTY2FuIHRvIGNvbXBsZXRlKGF1dG8gbW9kZSkgYW5kIEJTUyB0byBzdGFydCIpKTsKKyAgICB2b3Nfc3RhdHVzID0gdm9zX3dhaXRfc2luZ2xlX2V2ZW50KCZwSG9zdGFwZFN0YXRlLT52b3NFdmVudCwgMTAwMDApOworICAgCisgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX3N0YXR1cykpCisgICAgeyAgCisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICgiRVJST1I6IEhERCB2b3Mgd2FpdCBmb3Igc2luZ2xlX2V2ZW50IGZhaWxlZCEhXG4iKSk7CisgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICB9CisgCisgICAgcEhvc3RhcGRTdGF0ZS0+YkNvbW1pdCA9IFRSVUU7CisgICAgaWYocEhvc3RhcGRTdGF0ZS0+dm9zU3RhdHVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzZXRfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnBIb3N0YXBkQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworICAgICAgICBXTEFOU0FQX1VwZGF0ZV9XcHNJZSAoIHBWb3NDb250ZXh0ICk7ICAgICAgICAgICAgCisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KK3N0YXRpYyAKK2ludCBpd19zb2Z0YXBfc2V0bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCBzUWNTYXByZXFfbWxtZSAqcG1sbWU7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QqKShuZXRkZXZfcHJpdihkZXYpKTsKKyAgICB2X01BQ0FERFJfdCBkZXN0QWRkcmVzczsKKyAgICBwbWxtZSA9IChzdHJ1Y3Qgc1FjU2FwcmVxX21sbWUgKikod3JxdS0+bmFtZSk7CisgICAgLyogTk9URTogdGhpcyBhZGRyZXNzIGlzIG5vdCB2YWxpZCBpbmNhc2Ugb2YgVEtJUCBmYWlsdXJlLCBzaW5jZSBub3QgZmlsbGVkICovCisgICAgdm9zX21lbV9jb3B5KCZkZXN0QWRkcmVzcy5ieXRlcywgcG1sbWUtPmltX21hY2FkZHIsIHNpemVvZih2X01BQ0FERFJfdCkpOworICAgIHN3aXRjaChwbWxtZS0+aW1fb3ApCisgICAgeworICAgICAgICBjYXNlIFFDU0FQX01MTUVfQVVUSE9SSVpFOgorICAgICAgICAgICAgICAgICAgICBoZGRfc29mdGFwX2NoYW5nZV9TVEFfc3RhdGUoIHBIb3N0YXBkQWRhcHRlciwgJmRlc3RBZGRyZXNzLCBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQpOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRQ1NBUF9NTE1FX0FTU09DOgorICAgICAgICAvL1RPRE86aW5mb3JtIHRvIFRMIGFmdGVyIGFzc29jaWF0aW5nIChub3QgbmVlZGVkICBhcyB3ZSBkbyBpbiBzYXBDYWxsYmFjaykKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUUNTQVBfTUxNRV9VTkFVVEhPUklaRToKKyAgICAgICAgLy9UT0RPOiBzZW5kIHRoZSBkaXNhc3NvYyB0byBzdGF0aW9uCisgICAgICAgIC8vaGRkX3NvZnRhcF9jaGFuZ2VfU1RBX3N0YXRlKCBwSG9zdGFwZEFkYXB0ZXIsIHBtbG1lLT5pbV9tYWNhZGRyLCBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQpOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRQ1NBUF9NTE1FX0RJU0FTU09DOgorICAgICAgICAgICAgaGRkX3NvZnRhcF9zdGFfZGlzYXNzb2MocEhvc3RhcGRBZGFwdGVyLHBtbG1lLT5pbV9tYWNhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUUNTQVBfTUxNRV9ERUFVVEg6CisgICAgICAgICAgICBoZGRfc29mdGFwX3N0YV9kZWF1dGgocEhvc3RhcGRBZGFwdGVyLHBtbG1lLT5pbV9tYWNhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUUNTQVBfTUxNRV9NSUNGQUlMVVJFOgorICAgICAgICAgICAgaGRkX3NvZnRhcF90a2lwX21pY19mYWlsX2NvdW50ZXJfbWVhc3VyZShwSG9zdGFwZEFkYXB0ZXIscG1sbWUtPmltX3JlYXNvbik7CisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfc29mdGFwX3NldF9jaGFubmVsX3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisgICAgdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEhvc3RhcGRBZGFwdGVyKTsKKworICAgIGludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisgICAgaW50IHN0YXJ0Q2hhbm5lbCA9IHZhbHVlWzBdOworICAgIGludCBlbmRDaGFubmVsID0gdmFsdWVbMV07CisgICAgaW50IGJhbmQgPSB2YWx1ZVsyXTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICBpbnQgcmV0ID0gMDsgLyogc3VjY2VzcyAqLworCisgICAgc3RhdHVzID0gV0xBTlNBUF9TZXRDaGFubmVsUmFuZ2UoaEhhbCxzdGFydENoYW5uZWwsZW5kQ2hhbm5lbCxiYW5kKTsKKyAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgIGhkZExvZyggTE9HRSwgRkwoIml3X3NvZnRhcF9zZXRfY2hhbm5lbF9yYW5nZTogIHN0YXJ0Q2hhbm5lbCA9ICVkLCBlbmRDaGFubmVsID0gJWQgYmFuZCA9ICVkXG4iKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDaGFubmVsLGVuZENoYW5uZWwsIGJhbmQpOworICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGl3X3NvZnRhcF9nZXRfY2hhbm5lbF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICB2X1UzMl90IG51bV9jaGFubmVscyA9IDA7CisgICAgdl9VOF90IGkgPSAwOworICAgIHZfVThfdCBiYW5kU3RhcnRDaGFubmVsID0gUkZfQ0hBTl8xOworICAgIHZfVThfdCBiYW5kRW5kQ2hhbm5lbCA9IFJGX0NIQU5fMTY1OworICAgIHZfVTMyX3QgdGVtcF9udW1fY2hhbm5lbHMgPSAwOworICAgIGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKyAgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworICAgIHZfUkVHRE9NQUlOX3QgZG9tYWluSWRDdXJyZW50U29mdGFwOworCisgICAgdHBDaGFubmVsTGlzdEluZm8gY2hhbm5lbF9saXN0ID0gKHRwQ2hhbm5lbExpc3RJbmZvKSBleHRyYTsKKyAgICB3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZih0Q2hhbm5lbExpc3RJbmZvKTsKKyAgICBFTlRFUigpOworCisgICAgZm9yKCBpID0gYmFuZFN0YXJ0Q2hhbm5lbDsgaSA8PSBiYW5kRW5kQ2hhbm5lbDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBOVl9DSEFOTkVMX0VOQUJMRSA9PSByZWdDaGFubmVsc1tpXS5lbmFibGVkICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhbm5lbF9saXN0LT5jaGFubmVsc1tudW1fY2hhbm5lbHNdID0gcmZDaGFubmVsc1tpXS5jaGFubmVsTnVtOyAKKyAgICAgICAgICAgIG51bV9jaGFubmVscysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcmVtb3ZlIGluZG9vciBjaGFubmVscyBpZiB0aGUgZG9tYWluIGlzIEZDQywgY2hhbm5lbHMgMzYgLSA0OCAqLworCisgICAgdGVtcF9udW1fY2hhbm5lbHMgPSBudW1fY2hhbm5lbHM7CisKKyAgICBpZihlSEFMX1NUQVRVU19TVUNDRVNTICE9IHNtZV9nZXRTb2Z0QXBEb21haW4oaEhhbCwodl9SRUdET01BSU5fdCAqKSAmZG9tYWluSWRDdXJyZW50U29mdGFwKSkKKyAgICB7CisgICAgICAgIGhkZExvZyhMT0cxLEZMKCJGYWlsZWQgdG8gZ2V0IERvbWFpbiBJRCwgJWQgXG4iKSxkb21haW5JZEN1cnJlbnRTb2Z0YXApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYoUkVHRE9NQUlOX0ZDQyA9PSBkb21haW5JZEN1cnJlbnRTb2Z0YXApCisgICAgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCB0ZW1wX251bV9jaGFubmVsczsgaSsrKQorICAgICAgICB7CisgICAgICAKKyAgICAgICAgICAgaWYoKGNoYW5uZWxfbGlzdC0+Y2hhbm5lbHNbaV0gPiAzNSkgJiYgCisgICAgICAgICAgICAgIChjaGFubmVsX2xpc3QtPmNoYW5uZWxzW2ldIDwgNDkpKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICB2b3NfbWVtX21vdmUoJmNoYW5uZWxfbGlzdC0+Y2hhbm5lbHNbaV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsX2xpc3QtPmNoYW5uZWxzW2krMV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfbnVtX2NoYW5uZWxzIC0gKGktMSkpOworICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzLS07CisgICAgICAgICAgICAgICB0ZW1wX251bV9jaGFubmVscy0tOworICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICB9IAorICAgICAgICB9CisgICAgfQorCisgICAgaGRkTG9nKExPRzEsRkwoIiBudW1iZXIgb2YgY2hhbm5lbHMgJWRcbiIpLCBudW1fY2hhbm5lbHMpOyAKKworICAgIGlmIChudW1fY2hhbm5lbHMgPiBJV19NQVhfRlJFUVVFTkNJRVMpCisgICAgeworICAgICAgICBudW1fY2hhbm5lbHMgPSBJV19NQVhfRlJFUVVFTkNJRVM7CisgICAgfQorCisgICAgY2hhbm5lbF9saXN0LT5udW1fY2hhbm5lbHMgPSBudW1fY2hhbm5lbHM7CisgICAgRVhJVCgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAKK2ludCBpd19nZXRfZ2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQ7IAorICAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgIHZfVTMyX3QgbGVuZ3RoID0gRE9UMTFGX0lFX1JTTl9NQVhfTEVOOworICAgIHZfVThfdCBnZW5JZUJ5dGVzW0RPVDExRl9JRV9SU05fTUFYX0xFTl07CisgICAgRU5URVIoKTsKKyAgICBoZGRMb2coTE9HMSxGTCgiZ2V0R0VOX0lFIGlvY3RsXG4iKSk7CisgICAgLy8gQWN0dWFsbHkgcmV0cmlldmUgdGhlIFJTTiBJRSBmcm9tIENTUi4gIChXZSBwcmV2aW91c2x5IHNlbnQgaXQgZG93biBpbiB0aGUgQ1NSIFJvYW0gUHJvZmlsZS4pCisgICAgc3RhdHVzID0gV0xBTlNhcF9nZXRzdGF0aW9uSUVfaW5mb3JtYXRpb24ocFZvc0NvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5JZUJ5dGVzKTsKKyAgICB3cnF1LT5kYXRhLmxlbmd0aCA9IFZPU19NSU4oKHVfaW50MTZfdCkgbGVuZ3RoLCBET1QxMUZfSUVfUlNOX01BWF9MRU4pOworICAgIHZvc19tZW1fY29weSggd3JxdS0+ZGF0YS5wb2ludGVyLCAodl9WT0lEX3QqKWdlbkllQnl0ZXMsIHdycXUtPmRhdGEubGVuZ3RoKTsKKyAgICAKKyAgICBoZGRMb2coTE9HMSxGTCgiIFJTTiBJRSBvZiAlZCBieXRlcyByZXR1cm5lZFxuIiksIHdycXUtPmRhdGEubGVuZ3RoICk7IAorICAgIAorICAgCisgICAgRVhJVCgpOworICAgIHJldHVybiAwOworfQorc3RhdGljIAoraW50IGl3X2dldF9XUFNQQkNQcm9iZVJlcUlFcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsgICAgCisgICAgc1FjU2FwcmVxX1dQU1BCQ1Byb2JlUmVxSUVTX3QgKnBXUFNQQkNQcm9iZVJlcUlFczsKKyAgICBoZGRfYXBfY3R4X3QgKnBIZGRBcEN0eCA9IFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBIb3N0YXBkQWRhcHRlcik7CisgICAgRU5URVIoKTsKKyAgICAgICAgCisgICAgaGRkTG9nKExPRzEsRkwoImdldF9XUFNQQkNQcm9iZVJlcUlFcyBpb2N0bFxuIikpOworICAgIAorICAgIHBXUFNQQkNQcm9iZVJlcUlFcyA9IChzUWNTYXByZXFfV1BTUEJDUHJvYmVSZXFJRVNfdCAqKSh3cnF1LT5kYXRhLnBvaW50ZXIpOworICAgIHBXUFNQQkNQcm9iZVJlcUlFcy0+cHJvYmVSZXFJRUxlbiA9IHBIZGRBcEN0eC0+V1BTUEJDUHJvYmVSZXEucHJvYmVSZXFJRUxlbjsKKyAgICB2b3NfbWVtX2NvcHkocFdQU1BCQ1Byb2JlUmVxSUVzLT5wcm9iZVJlcUlFLCBwSGRkQXBDdHgtPldQU1BCQ1Byb2JlUmVxLnByb2JlUmVxSUUsIHBXUFNQQkNQcm9iZVJlcUlFcy0+cHJvYmVSZXFJRUxlbik7CisgICAgdm9zX21lbV9jb3B5KHBXUFNQQkNQcm9iZVJlcUlFcy0+bWFjYWRkciwgcEhkZEFwQ3R4LT5XUFNQQkNQcm9iZVJlcS5wZWVyTWFjQWRkciwgc2l6ZW9mKHZfTUFDQUREUl90KSk7CisgICAgd3JxdS0+ZGF0YS5sZW5ndGggPSAxMiArIHBXUFNQQkNQcm9iZVJlcUlFcy0+cHJvYmVSZXFJRUxlbjsKKyAgICBoZGRMb2coTE9HMSwgRkwoIk1hY2FkZHJlc3MgOiAiTUFDX0FERFJFU1NfU1RSIlxuIiksICBNQUNfQUREUl9BUlJBWShwV1BTUEJDUHJvYmVSZXFJRXMtPm1hY2FkZHIpKTsKKyAgICB1cCgmcEhkZEFwQ3R4LT5zZW1XcHNQQkNPdmVybGFwSW5kKTsKKyAgICBFWElUKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIGl3X3NldF9hdXRoX2hvc3RhcCgpIC0gCisgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGF1dGggdHlwZSByZWNlaXZlZCBmcm9tIHRoZSB3cGFfc3VwcGxpY2FudC4KKyAgIAorICBccGFyYW0gIC0gZGV2IC0gUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAgICAgICAgICAgICAgLSBpbmZvIC0gUG9pbnRlciB0byB0aGUgaXdfcmVxdWVzdF9pbmZvLgorICAgICAgICAgICAgICAtIHdycXUgLSBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICAgICAgICAgICAgICAtIGV4dHJhIC0gUG9pbnRlciB0byB0aGUgZGF0YS4gICAgICAgIAorICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBpd19zZXRfYXV0aF9ob3N0YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSxjaGFyICpleHRyYSkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsgCisKKyAgIEVOVEVSKCk7CisgICBzd2l0Y2god3JxdS0+cGFyYW0uZmxhZ3MgJiBJV19BVVRIX0lOREVYKQorICAgeworICAgICAgY2FzZSBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgorICAgICAgeworICAgICAgICAgaWYod3JxdS0+cGFyYW0udmFsdWUpIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJDb3VudGVyIE1lYXN1cmUgc3RhcnRlZCAlZCIsIHdycXUtPnBhcmFtLnZhbHVlKTsKKyAgICAgICAgICAgIHBXZXh0U3RhdGUtPm1US0lQQ291bnRlck1lYXN1cmVzID0gVEtJUF9DT1VOVEVSX01FQVNVUkVfU1RBUlRFRDsKKyAgICAgICAgIH0gIAorICAgICAgICAgZWxzZSB7ICAgCisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiQ291bnRlciBNZWFzdXJlIHN0b3BwZWQ9JWQiLCB3cnF1LT5wYXJhbS52YWx1ZSk7CisgICAgICAgICAgICBwV2V4dFN0YXRlLT5tVEtJUENvdW50ZXJNZWFzdXJlcyA9IFRLSVBfQ09VTlRFUl9NRUFTVVJFX1NUT1BFRDsKKyAgICAgICAgIH0KKworICAgICAgICAgaGRkX3NvZnRhcF90a2lwX21pY19mYWlsX2NvdW50ZXJfbWVhc3VyZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JxdS0+cGFyYW0udmFsdWUpOworICAgICAgfSAgIAorICAgICAgYnJlYWs7CisgICAgICAgICAKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAKKyAgICAgICAgIGhkZExvZyhMT0dXLCAiJXMgY2FsbGVkIHdpdGggdW5zdXBwb3J0ZWQgYXV0aCB0eXBlICVkIiwgX19GVU5DVElPTl9fLCAKKyAgICAgICAgICAgICAgIHdycXUtPnBhcmFtLmZsYWdzICYgSVdfQVVUSF9JTkRFWCk7CisgICAgICBicmVhazsKKyAgIH0KKyAgIAorICAgRVhJVCgpOworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X2FwX2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSAoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQ7ICAgIAorICAgIGhkZF9hcF9jdHhfdCAqcEhkZEFwQ3R4ID0gV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKTsKKyAgICBlSGFsU3RhdHVzIGhhbFN0YXR1cz0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0KilleHRyYTsKKyAgICB2X1U4X3QgZ3JvdXBtYWNhZGRyW1dOSV9DRkdfQlNTSURfTEVOXSA9IHsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRn07CisgICAgaW50IGtleV9pbmRleDsKKyAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworICAgIHRDc3JSb2FtU2V0S2V5ICBzZXRLZXk7ICAgCisvLyAgICB0Q3NyUm9hbVJlbW92ZUtleSBSZW1vdmVLZXk7CisgICAgaW50IGk7CisgICAgRU5URVIoKTsgICAgCisgICAKKyAgICBrZXlfaW5kZXggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisgICAKKyAgICBpZihrZXlfaW5kZXggPiAwKSB7CisgICAgICAKKyAgICAgICAgIC8qQ29udmVydCBmcm9tIDEtYmFzZWQgdG8gMC1iYXNlZCBrZXlpbmcqLworICAgICAgICBrZXlfaW5kZXgtLTsKKyAgICB9CisgICAgaWYoIWV4dC0+a2V5X2xlbikgeworI2lmIDAgICAgIAorICAgICAgLypTZXQgdGhlIGVuY3J5dGlvbiB0eXBlIHRvIE5PTkUqLworI2lmIDAKKyAgICAgICBwUm9hbVByb2ZpbGUtPkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyNlbmRpZgorICAgICAKKyAgICAgICAgIFJlbW92ZUtleS5rZXlJZCA9IGtleV9pbmRleDsKKyAgICAgICAgIGlmKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpIHsKKyAgICAgICAgICAgICAgLypLZXkgZGlyZWN0aW9uIGZvciBncm91cCBpcyBSWCBvbmx5Ki8KKyAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoUmVtb3ZlS2V5LnBlZXJNYWMsZ3JvdXBtYWNhZGRyLFdOSV9DRkdfQlNTSURfTEVOKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIHZvc19tZW1fY29weShSZW1vdmVLZXkucGVlck1hYyxleHQtPmFkZHIuc2FfZGF0YSxXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgICAgICB9CisgICAgICAgICBzd2l0Y2goZXh0LT5hbGcpCisgICAgICAgICB7CisgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorICAgICAgICAgICAgICBSZW1vdmVLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorICAgICAgICAgICAgICBSZW1vdmVLZXkuZW5jVHlwZSA9IChleHQtPmtleV9sZW49PSA1KSA/IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOmVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorICAgICAgICAgICAgICBSZW1vdmVLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1RLSVA7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKyAgICAgICAgICAgICAgUmVtb3ZlS2V5LmVuY1R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIFJlbW92ZUtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFJlbW92ZSBrZXkgY2lwaGVyX2FsZzolZCBrZXlfbGVuJWQgKnBFbmNyeXB0aW9uVHlwZSA6JWQgXG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sKGludClleHQtPmFsZywoaW50KWV4dC0+a2V5X2xlbixSZW1vdmVLZXkuZW5jVHlwZSk7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFBlZXIgTWFjID0gIk1BQ19BRERSRVNTX1NUUiJcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgTUFDX0FERFJfQVJSQVkoUmVtb3ZlS2V5LnBlZXJNYWMpKTsKKyAgICAgICAgICApOworICAgICAgICAgaGFsU3RhdHVzID0gV0xBTlNBUF9EZWxLZXlTdGEoIHBWb3NDb250ZXh0LCAmUmVtb3ZlS2V5KTsKKyAgICAgICAgIGlmICggaGFsU3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKQorICAgICAgICAgeworICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiWyU0ZF0gV0xBTlNBUF9EZWxldGVLZXlzU3RhIHJldHVybmVkIEVSUk9SIHN0YXR1cz0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGhhbFN0YXR1cyApOworICAgICAgICAgfQorI2VuZGlmICAgICAgICAgCisgICAgICAgICByZXR1cm4gaGFsU3RhdHVzOworCisgICAgfSAgIAorICAgIAorICAgIHZvc19tZW1femVybygmc2V0S2V5LHNpemVvZih0Q3NyUm9hbVNldEtleSkpOworICAgCisgICAgc2V0S2V5LmtleUlkID0ga2V5X2luZGV4OworICAgIHNldEtleS5rZXlMZW5ndGggPSBleHQtPmtleV9sZW47CisgICAKKyAgICBpZihleHQtPmtleV9sZW4gPD0gQ1NSX01BWF9LRVlfTEVOKSB7CisgICAgICAgdm9zX21lbV9jb3B5KCZzZXRLZXkuS2V5WzBdLGV4dC0+a2V5LGV4dC0+a2V5X2xlbik7CisgICAgfSAgIAorICAgCisgICAgaWYoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkgeworICAgICAgLypLZXkgZGlyZWN0aW9uIGZvciBncm91cCBpcyBSWCBvbmx5Ki8KKyAgICAgICBzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9SWF9PTkxZOworICAgICAgIHZvc19tZW1fY29weShzZXRLZXkucGVlck1hYyxncm91cG1hY2FkZHIsV05JX0NGR19CU1NJRF9MRU4pOworICAgIH0KKyAgICBlbHNlIHsgICAKKyAgICAgIAorICAgICAgIHNldEtleS5rZXlEaXJlY3Rpb24gPSAgZVNJUl9UWF9SWDsKKyAgICAgICB2b3NfbWVtX2NvcHkoc2V0S2V5LnBlZXJNYWMsZXh0LT5hZGRyLnNhX2RhdGEsV05JX0NGR19CU1NJRF9MRU4pOworICAgIH0KKyAgICBpZihleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICB7CisgICAgICAgc2V0S2V5LmtleURpcmVjdGlvbiA9IGVTSVJfVFhfREVGQVVMVDsKKyAgICAgICB2b3NfbWVtX2NvcHkoc2V0S2V5LnBlZXJNYWMsZXh0LT5hZGRyLnNhX2RhdGEsV05JX0NGR19CU1NJRF9MRU4pOworICAgIH0KKyAKKyAgICAvKkZvciBzdXBwbGljYW50IHBhZSByb2xlIGlzIHplcm8qLworICAgIHNldEtleS5wYWVSb2xlID0gMDsKKyAgICAgIAorICAgIHN3aXRjaChleHQtPmFsZykKKyAgICB7ICAgCisgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX05PTkU6ICAgCisgICAgICAgICBzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisgICAgICAgICBicmVhazsKKyAgICAgICAgIAorICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICBzZXRLZXkuZW5jVHlwZSA9IChleHQtPmtleV9sZW49PSA1KSA/IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOmVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDsKKyAgICAgICAgIHBIZGRBcEN0eC0+dVByaXZhY3kgPSAxOworICAgICAgICAgaGRkTG9nKExPRzEsICIoJXMpIHVQcml2YWN5PSVkIiwgX19GVU5DVElPTl9fLCBwSGRkQXBDdHgtPnVQcml2YWN5KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisgICAgICAgeworICAgICAgICAgIHZfVThfdCAqcEtleSA9ICZzZXRLZXkuS2V5WzBdOworICAKKyAgICAgICAgICBzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1RLSVA7CisgIAorICAgICAgICAgIHZvc19tZW1femVybyhwS2V5LCBDU1JfTUFYX0tFWV9MRU4pOworICAKKyAgICAgICAgICAvKlN1cHBsaWNhbnQgc2VuZHMgdGhlIDMyYnl0ZXMga2V5IGluIHRoaXMgb3JkZXIgCisgICAgICAgICAgCisgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICAgICAgICAgICB8ICAgVGsxICAgICAgICB8VFgtTUlDICAgIHwgIFJYIE1pYyAgfCAKKyAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgICAgICAgICAgIDwtLS0xNmJ5dGVzLS0tPjwtLThieXRlcy0tPjwtLThieXRlcy0tPgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgLypTbWUgZXhwZWN0cyB0aGUgMzIgYnl0ZXMga2V5IHRvIGJlIGluIHRoZSBiZWxvdyBvcmRlcgorICAKKyAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgICAgICAgICAgIHwgICBUazEgICAgICAgIHxSWC1NSUMgICAgfCAgVFggTWljICB8IAorICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgICAgICAgICAgPC0tLTE2Ynl0ZXMtLS0+PC0tOGJ5dGVzLS0+PC0tOGJ5dGVzLS0+CisgICAgICAgICAgICAgICAqLworICAgICAgICAgIC8qIENvcHkgdGhlIFRlbXBvcmFsIEtleSAxIChUSzEpICovCisgICAgICAgICAgdm9zX21lbV9jb3B5KHBLZXksZXh0LT5rZXksMTYpOworICAgICAgICAgICAKKyAgICAgICAgIC8qQ29weSB0aGUgcnggbWljIGZpcnN0Ki8KKyAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBLZXlbMTZdLCZleHQtPmtleVsyNF0sOCk7IAorICAgICAgICAgIAorICAgICAgICAgLypDb3B5IHRoZSB0eCBtaWMgKi8KKyAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBLZXlbMjRdLCZleHQtPmtleVsxNl0sOCk7IAorICAKKyAgICAgICB9ICAgICAKKyAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorICAgICAgICAgIHNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgc2V0S2V5LmVuY1R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAgICAgIAorICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgKCIlczpFbmNyeXB0aW9uVHlwZTolZCBrZXlfbGVuOiVkLCA6JWQsIEtleUlkOiVkIFxuIiksX19GVU5DVElPTl9fLCBzZXRLZXkuZW5jVHlwZSwgc2V0S2V5LmtleUxlbmd0aCwKKyAgICAgICAgICAgIHNldEtleS5rZXlJZCk7CisgICAgZm9yKGk9MDsgaTwgZXh0LT5rZXlfbGVuOyBpKyspCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgKCIlMDJ4IiksIHNldEtleS5LZXlbaV0pOyAgICAKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICgiXG4iKSk7CisgICAgaGFsU3RhdHVzID0gV0xBTlNBUF9TZXRLZXlTdGEoIHBWb3NDb250ZXh0LCAmc2V0S2V5KTsKKyAgICAKKyAgICBpZiAoIGhhbFN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTICkKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJbJTRkXSBXTEFOU0FQX1NldEtleVN0YSByZXR1cm5lZCBFUlJPUiBzdGF0dXM9ICVkIiwgX19MSU5FX18sIGhhbFN0YXR1cyApOworICAgIH0gICAKKyAgIAorICAgcmV0dXJuIGhhbFN0YXR1czsKK30KK3N0YXRpYyBpbnQgaXdfc2V0X2FwX21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXh0cmEpCit7CisjaWYgMAorICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworICAgIHN0cnVjdCBpd19tbG1lICptbG1lID0gKHN0cnVjdCBpd19tbG1lICopZXh0cmE7CisgCisgICAgRU5URVIoKTsgICAgCisgICAKKyAgICAvL3JlYXNvbl9jb2RlIGlzIHVudXNlZC4gQnkgZGVmYXVsdCBpdCBpcyBzZXQgdG8gZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRAorICAgIHN3aXRjaCAobWxtZS0+Y21kKSB7CisgICAgICAgIGNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKyAgICAgICAgY2FzZSBJV19NTE1FX0RFQVVUSDoKKyAgICAgICAgICAgIGhkZExvZyhMT0cxLCAiU3RhdGlvbiBkaXNhc3NvY2lhdGUiKTsgICAgCisgICAgICAgICAgICBpZiggcEFkYXB0ZXItPmNvbm5faW5mby5jb25uU3RhdGUgPT0gZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZUNzclJvYW1EaXNjb25uZWN0UmVhc29uIHJlYXNvbiA9IGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoIG1sbWUtPnJlYXNvbl9jb2RlID09IEhERF9SRUFTT05fTUlDSEFFTF9NSUNfRkFJTFVSRSApCisgICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9IGVDU1JfRElTQ09OTkVDVF9SRUFTT05fTUlDX0VSUk9SOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9Sb2FtRGlzY29ubmVjdCggcEFkYXB0ZXItPmhIYWwscEFkYXB0ZXItPnNlc3Npb25JZCwgcmVhc29uKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvL2NsZWFyIGFsbCB0aGUgcmVhc29uIGNvZGVzCisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsIiVzICVkIENvbW1hbmQgRGlzYXNzb2NpYXRlL0RlYXV0aGVudGljYXRlIDogY3NyUm9hbURpc2Nvbm5lY3QgZmFpbHVyZSByZXR1cm5lZCAlZCBcbiIsIF9fRlVOQ1RJT05fXywgKGludCltbG1lLT5jbWQsIChpbnQpc3RhdHVzICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgICAgICAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwiJXMgJWQgQ29tbWFuZCBEaXNhc3NvY2lhdGUvRGVhdXRoZW50aWNhdGUgY2FsbGVkIGJ1dCBzdGF0aW9uIGlzIG5vdCBpbiBhc3NvY2lhdGVkIHN0YXRlIFxuIiwgX19GVU5DVElPTl9fLCAoaW50KW1sbWUtPmNtZCApOworICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGRkTG9nKExPR0UsIiVzICVkIENvbW1hbmQgc2hvdWxkIGJlIERpc2Fzc29jaWF0ZS9EZWF1dGhlbnRpY2F0ZSBcbiIsIF9fRlVOQ1RJT05fXywgKGludCltbG1lLT5jbWQgKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0vL2VuZCBvZiBzd2l0Y2gKKyAgICBFWElUKCk7CisjZW5kaWYgICAgCisgICAgcmV0dXJuIDA7CisvLyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGl3X2dldF9hcF9ydHNfdGhyZXNob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisgICB2X1UzMl90IHN0YXR1cyA9IDA7CisKKyAgIHN0YXR1cyA9IGhkZF93bGFuX2dldF9ydHNfdGhyZXNob2xkKHBIb3N0YXBkQWRhcHRlciwgd3JxdSk7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgaXdfZ2V0X2FwX2ZyYWdfdGhyZXNob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworICAgIHZfVTMyX3Qgc3RhdHVzID0gMDsKKworICAgIHN0YXR1cyA9IGhkZF93bGFuX2dldF9mcmFnX3RocmVzaG9sZChwSG9zdGFwZEFkYXB0ZXIsIHdycXUpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBpd19nZXRfYXBfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgIHN0cnVjdCBpd19mcmVxICpmd3JxLCBjaGFyICpleHRyYSkKK3sKKyAgIHZfVTMyX3Qgc3RhdHVzID0gMCxjaGFubmVsLGZyZXE7CisgICBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisgICB0SGFsSGFuZGxlIGhIYWw7CisgICBoZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlOworICAgaGRkX2FwX2N0eF90ICpwSGRkQXBDdHggPSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpOyAgCisKKyAgIEVOVEVSKCk7CisKKyAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+aXNMb2dwSW5Qcm9ncmVzcykgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBwSG9zdGFwZFN0YXRlID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEhvc3RhcGRBZGFwdGVyKTsKKyAgIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwSG9zdGFwZEFkYXB0ZXIpOworCisgICBpZihwSG9zdGFwZFN0YXRlLT5ic3NTdGF0ZSA9PSBCU1NfU1RPUCApCisgICB7CisgICAgICAgaWYgKGNjbUNmZ0dldEludChoSGFsLCBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTCwgJmNoYW5uZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgeworICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgIHsKKyAgICAgICAgICBzdGF0dXMgPSBoZGRfd2xhbl9nZXRfZnJlcShjaGFubmVsLCAmZnJlcSk7CisgICAgICAgICAgZndycS0+bSA9IGZyZXE7CisgICAgICAgICAgZndycS0+ZSA9IDA7CisgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIGNoYW5uZWwgPSBwSGRkQXBDdHgtPm9wZXJhdGluZ0NoYW5uZWw7CisgICAgICAgc3RhdHVzID0gaGRkX3dsYW5fZ2V0X2ZyZXEoY2hhbm5lbCwgJmZyZXEpOworICAgICAgIGZ3cnEtPm0gPSBmcmVxOworICAgICAgIGZ3cnEtPmUgPSAwOworICAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgaXdfc29mdGFwX3NldHdwc2llKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIAorICAgICAgICBjaGFyICpleHRyYSkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKyAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPnB2b3NDb250ZXh0OworICAgaGRkX2hvc3RhcGRfc3RhdGVfdCAqcEhvc3RhcGRTdGF0ZTsKKyAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdV9pbnQ4X3QgKndwc19nZW5pZSA9ICB3cnF1LT5kYXRhLnBvaW50ZXI7CisgICB1X2ludDhfdCAqcG9zOworICAgdHBTYXBfV1BTSUUgcFNhcF9XUFNJZTsKKyAgIHVfaW50OF90IFdQU0llVHlwZTsKKyAgIHVfaW50MTZfdCBsZW5ndGg7ICAgCisgICBFTlRFUigpOworCisgICBpZighd3JxdS0+ZGF0YS5sZW5ndGgpCisgICAgICByZXR1cm4gMDsKKworICAgcFNhcF9XUFNJZSA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0U2FwX1dQU0lFKSk7CisgICBpZiAoTlVMTCA9PSBwU2FwX1dQU0llKSAKKyAgIHsKKyAgICAgIGhkZExvZyhMT0dFLCAiVk9TIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworICAgICAgcmV0dXJuIC1FTk9NRU07CisgICB9CisgICB2b3NfbWVtX3plcm8ocFNhcF9XUFNJZSwgc2l6ZW9mKHRTYXBfV1BTSUUpKTsKKyAKKyAgIGhkZExvZyhMT0cxLCIlcyBXUFMgSUUgdHlwZVsweCVYXSBJRVsweCVYXSwgTEVOWyVkXVxuIiwgX19GVU5DVElPTl9fLCB3cHNfZ2VuaWVbMF0sIHdwc19nZW5pZVsxXSwgd3BzX2dlbmllWzJdKTsKKyAgIFdQU0llVHlwZSA9IHdwc19nZW5pZVswXTsKKyAgIGlmICggd3BzX2dlbmllWzBdID09IGVRQ19XUFNfQkVBQ09OX0lFKQorICAgeworICAgICAgcFNhcF9XUFNJZS0+c2FwV1BTSUVDb2RlID0gZVNBUF9XUFNfQkVBQ09OX0lFOyAKKyAgICAgIHdwc19nZW5pZSA9IHdwc19nZW5pZSArIDE7CisgICAgICBzd2l0Y2ggKCB3cHNfZ2VuaWVbMF0gKSAKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgRE9UMTFGX0VJRF9XUEE6IAorICAgICAgICAgICAgaWYgKHdwc19nZW5pZVsxXSA8IDIgKyA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBTYXBfV1BTSWUpOyAKKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobWVtY21wKCZ3cHNfZ2VuaWVbMl0sICJceDAwXHg1MFx4ZjJceDA0IiwgNCkgPT0gMCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgaGRkTG9nIChMT0cxLCAiJXMgU2V0IFdQUyBCRUFDT04gSUUobGVuICVkKSIsX19GVU5DVElPTl9fLCB3cHNfZ2VuaWVbMV0rMik7CisgICAgICAgICAgICAgcG9zID0gJndwc19nZW5pZVs2XTsKKyAgICAgICAgICAgICB3aGlsZSAoKChzaXplX3QpcG9zIC0gKHNpemVfdCkmd3BzX2dlbmllWzZdKSAgPCAod3BzX2dlbmllWzFdIC0gNCkgKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goKHVfaW50MTZfdCkoKnBvczw8OCkgfCAqKHBvcysxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgY2FzZSBIRERfV1BTX0VMRU1fVkVSU0lPTjoKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5WZXJzaW9uID0gKnBvczsgICAKKyAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIldQUyB2ZXJzaW9uICVkXG4iLCBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5WZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5GaWVsZFByZXNlbnQgfD0gV1BTX0JFQUNPTl9WRVJfUFJFU0VOVDsgICAKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICBjYXNlIEhERF9XUFNfRUxFTV9XUFNfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9NDsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS53cHNTdGF0ZSA9ICpwb3M7CisgICAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPRzEsICJXUFMgU3RhdGUgJWRcbiIsIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU0JlYWNvbklFLndwc1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5GaWVsZFByZXNlbnQgfD0gV1BTX0JFQUNPTl9TVEFURV9QUkVTRU5UOworICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAxOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX0FQU0VUVVBMT0NLOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSA0OworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU0JlYWNvbklFLkFQU2V0dXBMb2NrZWQgPSAqcG9zOworICAgICAgICAgICAgICAgICAgICAgIGhkZExvZyhMT0cxLCAiQVAgc2V0dXAgbG9jayAlZFxuIiwgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTQmVhY29uSUUuQVBTZXR1cExvY2tlZCk7CisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTQmVhY29uSUUuRmllbGRQcmVzZW50IHw9IFdQU19CRUFDT05fQVBTRVRVUExPQ0tfUFJFU0VOVDsKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICBjYXNlIEhERF9XUFNfRUxFTV9TRUxFQ1RFRFJFR0lTVFJBOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSA0OworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU0JlYWNvbklFLlNlbGVjdGVkUmVnaXN0cmEgPSAqcG9zOworICAgICAgICAgICAgICAgICAgICAgIGhkZExvZyhMT0cxLCAiU2VsZWN0ZWQgUmVnaXN0cmEgJWRcbiIsIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU0JlYWNvbklFLlNlbGVjdGVkUmVnaXN0cmEpOworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU0JlYWNvbklFLkZpZWxkUHJlc2VudCB8PSBXUFNfQkVBQ09OX1NFTEVDVEVEUkVHSVNUUkFfUFJFU0VOVDsKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICBjYXNlIEhERF9XUFNfRUxFTV9ERVZJQ0VfUEFTU1dPUkRfSUQ6CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTQmVhY29uSUUuRGV2aWNlUGFzc3dvcmRJRCA9ICgqcG9zPDw4KSB8ICoocG9zKzEpOworICAgICAgICAgICAgICAgICAgICAgIGhkZExvZyhMT0cxLCAiUGFzc3dvcmQgSUQ6ICV4XG4iLCBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5EZXZpY2VQYXNzd29yZElEKTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5GaWVsZFByZXNlbnQgfD0gV1BTX0JFQUNPTl9ERVZJQ0VQQVNTV09SRElEX1BSRVNFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7IAorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX1JFR0lTVFJBX0NPTkZfTUVUSE9EUzoKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5TZWxlY3RlZFJlZ2lzdHJhQ2ZnTWV0aG9kID0gKCpwb3M8PDgpIHwgKihwb3MrMSk7CisgICAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPRzEsICJTZWxlY3QgUmVnaXN0cmEgQ29uZmlnIE1ldGhvZHM6ICV4XG4iLCBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5TZWxlY3RlZFJlZ2lzdHJhQ2ZnTWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5GaWVsZFByZXNlbnQgfD0gV1BTX0JFQUNPTl9TRUxFQ1RFRFJFR0lTVFJBQ0ZHTUVUSE9EX1BSRVNFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7IAorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX1VVSURfRToKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsgCisgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gKnBvczw8OCB8ICoocG9zKzEpOworICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgIHZvc19tZW1fY29weShwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5VVUlEX0UsIHBvcywgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5GaWVsZFByZXNlbnQgfD0gV1BTX0JFQUNPTl9VVUlERV9QUkVTRU5UOyAKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX1JGX0JBTkRTOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSA0OworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU0JlYWNvbklFLlJGQmFuZCA9ICpwb3M7CisgICAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPRzEsICJSRiBiYW5kOiAlZFxuIiwgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTQmVhY29uSUUuUkZCYW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNCZWFjb25JRS5GaWVsZFByZXNlbnQgfD0gV1BTX0JFQUNPTl9SRl9CQU5EU19QUkVTRU5UOworICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAxOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgaGRkTG9nIChMT0dXLCAiVU5LTk9XTiBUTFYgaW4gV1BTIElFKCV4KVxuIiwgKCpwb3M8PDggfCAqKHBvcysxKSkpOworICAgICAgICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZShwU2FwX1dQU0llKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9ICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeyAKKyAgICAgICAgICAgICAgICAgaGRkTG9nIChMT0dFLCAiJXMgV1BTIElFIE1pc21hdGNoICVYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdwc19nZW5pZVswXSk7CisgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBoZGRMb2cgKExPR0UsICIlcyBTZXQgVU5LTk9XTiBJRSAlWCIsX19GVU5DVElPTl9fLCB3cHNfZ2VuaWVbMF0pOworICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBTYXBfV1BTSWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfSAKKyAgICBlbHNlIGlmKCB3cHNfZ2VuaWVbMF0gPT0gZVFDX1dQU19QUk9CRV9SU1BfSUUpCisgICAgeworICAgICAgcFNhcF9XUFNJZS0+c2FwV1BTSUVDb2RlID0gZVNBUF9XUFNfUFJPQkVfUlNQX0lFOyAKKyAgICAgIHdwc19nZW5pZSA9IHdwc19nZW5pZSArIDE7CisgICAgICBzd2l0Y2ggKCB3cHNfZ2VuaWVbMF0gKSAKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgRE9UMTFGX0VJRF9XUEE6IAorICAgICAgICAgICAgaWYgKHdwc19nZW5pZVsxXSA8IDIgKyA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBTYXBfV1BTSWUpOyAKKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobWVtY21wKCZ3cHNfZ2VuaWVbMl0sICJceDAwXHg1MFx4ZjJceDA0IiwgNCkgPT0gMCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgaGRkTG9nIChMT0cxLCAiJXMgU2V0IFdQUyBQUk9CRSBSU1AgSUUobGVuICVkKSIsX19GVU5DVElPTl9fLCB3cHNfZ2VuaWVbMV0rMik7CisgICAgICAgICAgICAgcG9zID0gJndwc19nZW5pZVs2XTsKKyAgICAgICAgICAgICB3aGlsZSAoKChzaXplX3QpcG9zIC0gKHNpemVfdCkmd3BzX2dlbmllWzZdKSAgPCAod3BzX2dlbmllWzFdIC0gNCkgKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc3dpdGNoKCh1X2ludDE2X3QpKCpwb3M8PDgpIHwgKihwb3MrMSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBjYXNlIEhERF9XUFNfRUxFTV9WRVJTSU9OOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSA0OworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuVmVyc2lvbiA9ICpwb3M7ICAgCisgICAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPRzEsICJXUFMgdmVyc2lvbiAlZFxuIiwgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5WZXJzaW9uKTsgCisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5GaWVsZFByZXNlbnQgfD0gV1BTX1BST0JSU1BfVkVSX1BSRVNFTlQ7ICAgCisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgY2FzZSBIRERfV1BTX0VMRU1fV1BTX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPTQ7CisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS53cHNTdGF0ZSA9ICpwb3M7CisgICAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPRzEsICJXUFMgU3RhdGUgJWRcbiIsIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUud3BzU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuRmllbGRQcmVzZW50IHw9IFdQU19QUk9CUlNQX1NUQVRFX1BSRVNFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgY2FzZSBIRERfV1BTX0VMRU1fQVBTRVRVUExPQ0s6CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5BUFNldHVwTG9ja2VkID0gKnBvczsKKyAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIkFQIHNldHVwIGxvY2sgJWRcbiIsIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuQVBTZXR1cExvY2tlZCk7CisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5GaWVsZFByZXNlbnQgfD0gV1BTX1BST0JSU1BfQVBTRVRVUExPQ0tfUFJFU0VOVDsKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICBjYXNlIEhERF9XUFNfRUxFTV9TRUxFQ1RFRFJFR0lTVFJBOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSA0OworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuU2VsZWN0ZWRSZWdpc3RyYSA9ICpwb3M7CisgICAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPRzEsICJTZWxlY3RlZCBSZWdpc3RyYSAlZFxuIiwgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5TZWxlY3RlZFJlZ2lzdHJhKTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLkZpZWxkUHJlc2VudCB8PSBXUFNfUFJPQlJTUF9TRUxFQ1RFRFJFR0lTVFJBX1BSRVNFTlQ7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAxOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX0RFVklDRV9QQVNTV09SRF9JRDoKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLkRldmljZVBhc3N3b3JkSUQgPSAoKnBvczw8OCkgfCAqKHBvcysxKTsKKyAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIlBhc3N3b3JkIElEOiAlZFxuIiwgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5EZXZpY2VQYXNzd29yZElEKTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLkZpZWxkUHJlc2VudCB8PSBXUFNfUFJPQlJTUF9ERVZJQ0VQQVNTV09SRElEX1BSRVNFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7IAorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX1JFR0lTVFJBX0NPTkZfTUVUSE9EUzoKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLlNlbGVjdGVkUmVnaXN0cmFDZmdNZXRob2QgPSAoKnBvczw8OCkgfCAqKHBvcysxKTsKKyAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIlNlbGVjdCBSZWdpc3RyYSBDb25maWcgTWV0aG9kczogJXhcbiIsIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuU2VsZWN0ZWRSZWdpc3RyYUNmZ01ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5GaWVsZFByZXNlbnQgfD0gV1BTX1BST0JSU1BfU0VMRUNURURSRUdJU1RSQUNGR01FVEhPRF9QUkVTRU5UOworICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOyAKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX1JTUF9UWVBFOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSA0OworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuUmVzcG9uc2VUeXBlID0gKnBvczsKKyAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIkNvbmZpZyBNZXRob2RzOiAlZFxuIiwgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5SZXNwb25zZVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuRmllbGRQcmVzZW50IHw9IFdQU19QUk9CUlNQX1JFU1BPTlNFVFlQRV9QUkVTRU5UOworICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAxOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX1VVSURfRToKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsgCisgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gKnBvczw8OCB8ICoocG9zKzEpOworICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgIHZvc19tZW1fY29weShwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLlVVSURfRSwgcG9zLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuRmllbGRQcmVzZW50IHw9IFdQU19QUk9CUlNQX1VVSURFX1BSRVNFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICBjYXNlIEhERF9XUFNfRUxFTV9NQU5VRkFDVFVSRVI6CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gKnBvczw8OCB8ICoocG9zKzEpOworICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuTWFudWZhY3R1cmUubnVtX25hbWUgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuTWFudWZhY3R1cmUubmFtZSwgcG9zLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuRmllbGRQcmVzZW50IHw9IFdQU19QUk9CUlNQX01BTlVGQUNUVVJFX1BSRVNFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAKKyAgICAgICAgICAgICAgICAgICBjYXNlIEhERF9XUFNfRUxFTV9NT0RFTF9OQU1FOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9ICpwb3M8PDggfCAqKHBvcysxKTsKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLk1vZGVsTmFtZS5udW1fdGV4dCA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkocFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5Nb2RlbE5hbWUudGV4dCwgcG9zLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuRmllbGRQcmVzZW50IHw9IFdQU19QUk9CUlNQX01PREVMTkFNRV9QUkVTRU5UOworICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgY2FzZSBIRERfV1BTX0VMRU1fTU9ERUxfTlVNOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9ICpwb3M8PDggfCAqKHBvcysxKTsKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLk1vZGVsTnVtYmVyLm51bV90ZXh0ID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgIHZvc19tZW1fY29weShwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLk1vZGVsTnVtYmVyLnRleHQsIHBvcywgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLkZpZWxkUHJlc2VudCB8PSBXUFNfUFJPQlJTUF9NT0RFTE5VTUJFUl9QUkVTRU5UOworICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgY2FzZSBIRERfV1BTX0VMRU1fU0VSSUFMX05VTToKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAqcG9zPDw4IHwgKihwb3MrMSk7CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5TZXJpYWxOdW1iZXIubnVtX3RleHQgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuU2VyaWFsTnVtYmVyLnRleHQsIHBvcywgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLkZpZWxkUHJlc2VudCB8PSBXUFNfUFJPQlJTUF9TRVJJQUxOVU1CRVJfUFJFU0VOVDsKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX1BSSU1BUllfREVWSUNFX1RZUEU6CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5QcmltYXJ5RGV2aWNlQ2F0ZWdvcnkgPSAoKnBvczw8OCB8ICoocG9zKzEpKTsKKyAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgInByaW1hcnkgZGV2IGNhdGVnb3J5OiAlZFxuIiwgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5QcmltYXJ5RGV2aWNlQ2F0ZWdvcnkpOyAgCisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuUHJpbWFyeURldmljZU9VSSwgcG9zLCBIRERfV1BTX0RFVklDRV9PVUlfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgInByaW1hcnkgZGV2IG91aTogJTAyeCwgJTAyeCwgJTAyeCwgJTAyeFxuIiwgcG9zWzBdLCBwb3NbMV0sIHBvc1syXSwgcG9zWzNdKTsKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLkRldmljZVN1YkNhdGVnb3J5ID0gKCpwb3M8PDggfCAqKHBvcysxKSk7CisgICAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPRzEsICJwcmltYXJ5IGRldiBzdWIgY2F0ZWdvcnk6ICVkXG4iLCBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLkRldmljZVN1YkNhdGVnb3J5KTsgIAorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuRmllbGRQcmVzZW50IHw9IFdQU19QUk9CUlNQX1BSSU1BUllERVZJQ0VUWVBFX1BSRVNFTlQ7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9ICpwb3M8PDggfCAqKHBvcysxKTsKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLkRldmljZU5hbWUubnVtX3RleHQgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuRGV2aWNlTmFtZS50ZXh0LCBwb3MsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLkZpZWxkUHJlc2VudCB8PSBXUFNfUFJPQlJTUF9ERVZJQ0VOQU1FX1BSRVNFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgY2FzZSBIRERfV1BTX0VMRU1fQ09ORklHX01FVEhPRFM6CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5Db25maWdNZXRob2QgPSAoKnBvczw8OCkgfCAqKHBvcysxKTsKKyAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIkNvbmZpZyBNZXRob2RzOiAlZFxuIiwgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5TZWxlY3RlZFJlZ2lzdHJhQ2ZnTWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsgCisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5GaWVsZFByZXNlbnQgfD0gV1BTX1BST0JSU1BfQ09ORklHTUVUSE9EU19QUkVTRU5UOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworIAorICAgICAgICAgICAgICAgICAgIGNhc2UgSEREX1dQU19FTEVNX1JGX0JBTkRTOgorICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSA0OworICAgICAgICAgICAgICAgICAgICAgIHBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUuUkZCYW5kID0gKnBvczsKKyAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIlJGIGJhbmQ6ICVkXG4iLCBwU2FwX1dQU0llLT5zYXB3cHNpZS5zYXBXUFNQcm9iZVJzcElFLlJGQmFuZCk7CisgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgcFNhcF9XUFNJZS0+c2Fwd3BzaWUuc2FwV1BTUHJvYmVSc3BJRS5GaWVsZFByZXNlbnQgfD0gV1BTX1BST0JSU1BfUkZfQkFORFNfUFJFU0VOVDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfSAgLy8gc3dpdGNoCisgICAgICAgICAgICB9CisgICAgICAgICB9IAorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nIChMT0dFLCAiJXMgV1BTIElFIE1pc21hdGNoICVYIixfX0ZVTkNUSU9OX18sIHdwc19nZW5pZVswXSk7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgIH0gLy8gc3dpdGNoCisgICAgfQorICAgIGhhbFN0YXR1cyA9IFdMQU5TQVBfU2V0X1dwc0llKHBWb3NDb250ZXh0LCBwU2FwX1dQU0llKTsKKyAgICBwSG9zdGFwZFN0YXRlID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEhvc3RhcGRBZGFwdGVyKTsKKyAgICBpZiggcEhvc3RhcGRTdGF0ZS0+YkNvbW1pdCAmJiBXUFNJZVR5cGUgPT0gZVFDX1dQU19QUk9CRV9SU1BfSUUpCisgICAgeworICAgICAgICAvL2hkZF9hZGFwdGVyX3QgKnBIb3N0YXBkQWRhcHRlciA9IChuZXRkZXZfcHJpdihkZXYpKTsKKyAgICAgICAgLy92X0NPTlRFWFRfdCBwVm9zQ29udGV4dCA9IHBIb3N0YXBkQWRhcHRlci0+cHZvc0NvbnRleHQ7CisgICAgICAgIFdMQU5TQVBfVXBkYXRlX1dwc0llICggcFZvc0NvbnRleHQgKTsKKyAgICB9CisgCisgICAgdm9zX21lbV9mcmVlKHBTYXBfV1BTSWUpOyAgIAorICAgIEVYSVQoKTsKKyAgICByZXR1cm4gaGFsU3RhdHVzOworfQorCitzdGF0aWMgaW50IGl3X3NvZnRhcF9zdG9wYnNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIAorICAgICAgICBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgRU5URVIoKTsKKyAgICBpZih0ZXN0X2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZwSG9zdGFwZEFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkgCisgICAgeworICAgICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSAoc3RhdHVzID0gV0xBTlNBUF9TdG9wQnNzKChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5wdm9zQ29udGV4dCkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZF9ob3N0YXBkX3N0YXRlX3QgKnBIb3N0YXBkU3RhdGUgPSBXTEFOX0hERF9HRVRfSE9TVEFQX1NUQVRFX1BUUihwSG9zdGFwZEFkYXB0ZXIpOworCisgICAgICAgICAgICBzdGF0dXMgPSB2b3Nfd2FpdF9zaW5nbGVfZXZlbnQoJnBIb3N0YXBkU3RhdGUtPnZvc0V2ZW50LCAxMDAwMCk7CisgICAKKyAgICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7ICAKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJFUlJPUjogSEREIHZvcyB3YWl0IGZvciBzaW5nbGVfZXZlbnQgZmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsZWFyX2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZwSG9zdGFwZEFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKyAgICB9CisgICAgRVhJVCgpOworICAgIHJldHVybiAoc3RhdHVzID09IFZPU19TVEFUVVNfU1VDQ0VTUykgPyAwIDogLUVCVVNZOworfQorCitzdGF0aWMgaW50IGl3X3NvZnRhcF92ZXJzaW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIAorICAgICAgICBjaGFyICpleHRyYSkKK3sKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworICAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgIEVOVEVSKCk7CisgICAgc3RhdHVzID0gaGRkX3dsYW5fZ2V0X3ZlcnNpb24ocEhvc3RhcGRBZGFwdGVyLCB3cnF1LCBleHRyYSk7CisgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgRmFpbGVkISEhXG4iLF9fZnVuY19fKTsKKyAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgRVhJVCgpOworI2VuZGlmLy9UT0RPIG5lZWQgdG8gaGFuZGxlIGluIHByaW1hCisgICAgcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGl3X3NldF9hcF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCAKKyAgICAgICAgY2hhciAqZXh0cmEpCit7CisgCisgICAgaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPnB2b3NDb250ZXh0OworICAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHVfaW50OF90ICpnZW5pZSA9IHdycXUtPmRhdGEucG9pbnRlcjsKKyAgICAKKyAgICBFTlRFUigpOworICAgIAorICAgIGlmKCF3cnF1LT5kYXRhLmxlbmd0aCkKKyAgICB7CisgICAgICAgIEVYSVQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHN3aXRjaCAoZ2VuaWVbMF0pIAorICAgIHsKKyAgICAgICAgY2FzZSBET1QxMUZfRUlEX1dQQTogCisgICAgICAgIGNhc2UgRE9UMTFGX0VJRF9SU046CisgICAgICAgICAgICBpZigoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKSktPnVQcml2YWN5ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGRkX3NvZnRhcF9EZXJlZ2lzdGVyX0JDX1NUQShwSG9zdGFwZEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIGhkZF9zb2Z0YXBfUmVnaXN0ZXJfQkNfU1RBKHBIb3N0YXBkQWRhcHRlciwgMSk7CisgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEhvc3RhcGRBZGFwdGVyKSktPnVQcml2YWN5ID0gMTsKKyAgICAgICAgICAgIGhhbFN0YXR1cyA9IFdMQU5TQVBfU2V0X1dQQVJTTkllcyhwVm9zQ29udGV4dCwgd3JxdS0+ZGF0YS5wb2ludGVyLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGRkTG9nIChMT0dFLCAiJXMgU2V0IFVOS05PV04gSUUgJVgiLF9fRlVOQ1RJT05fXywgZ2VuaWVbMF0pOworICAgICAgICAgICAgaGFsU3RhdHVzID0gMDsKKyAgICB9CisgICAgCisgICAgRVhJVCgpOworICAgIHJldHVybiBoYWxTdGF0dXM7IAorfQorCitzdGF0aWMgVk9TX1NUQVRVUyAgd2xhbl9oZGRfZ2V0X2NsYXNzQXN0YXRzX2Zvcl9zdGF0aW9uKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB1OCBzdGFpZCkKK3sKKyAgIGVIYWxTdGF0dXMgaHN0YXR1czsKKyAgIGxvbmcgbHJjOworICAgc3RydWN0IHN0YXRzQ29udGV4dCBjb250ZXh0OworCisgICBpZiAoTlVMTCA9PSBwQWRhcHRlcikKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBQYWRhcHRlciBpcyBOVUxMIiwgX19mdW5jX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LmNvbXBsZXRpb24pOworICAgY29udGV4dC5wQWRhcHRlciA9IHBBZGFwdGVyOworICAgY29udGV4dC5tYWdpYyA9IFNUQVRTX0NPTlRFWFRfTUFHSUM7CisgICBoc3RhdHVzID0gc21lX0dldFN0YXRpc3RpY3MoIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX0hERCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUVfR0xPQkFMX0NMQVNTQV9TVEFUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfR2V0Q2xhc3NBX3N0YXRpc3RpY3NDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvLyBub3QgcGVyaW9kaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgLy9ub24tY2FjaGVkIHJlc3VsdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dCk7CisgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBoc3RhdHVzKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICIlczogVW5hYmxlIHRvIHJldHJpZXZlIHN0YXRpc3RpY3MgZm9yIGxpbmsgc3BlZWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGxyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZjb250ZXh0LmNvbXBsZXRpb24sCisgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX1NUQVRTKSk7CisgICAgICBjb250ZXh0Lm1hZ2ljID0gMDsKKyAgICAgIGlmIChscmMgPD0gMCkKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IFNNRSAlcyB3aGlsZSByZXRyaWV2aW5nIGxpbmsgc3BlZWQiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICgwID09IGxyYykgPyAidGltZW91dCIgOiAiaW50ZXJydXB0Iik7CisgICAgICAgICBtc2xlZXAoNTApOworICAgICAgfQorICAgfQorICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IGl3X2dldF9zb2Z0YXBfbGlua3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisgICAgICAgIGNoYXIgKmV4dHJhKQorCit7CisgICBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisgICBjaGFyICpwTGlua1NwZWVkID0gKGNoYXIqKWV4dHJhOworICAgdl9VMTZfdCBsaW5rX3NwZWVkOworICAgdW5zaWduZWQgc2hvcnQgc3RhSWQ7CisgICBpbnQgbGVuID0gc2l6ZW9mKHZfVTE2X3QpKzE7CisgICB2X0JZVEVfdCBtYWNBZGRyZXNzW1ZPU19NQUNfQUREUl9TSVpFXTsKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgaW50IHJjOworCisgICBpZiAoIGhkZF9zdHJpbmdfdG9faGV4ICgoY2hhciAqKXdycXUtPmRhdGEucG9pbnRlciwgd3JxdS0+ZGF0YS5sZW5ndGgsIG1hY0FkZHJlc3MgKSApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiRVJST1I6IENvbW1hbmQgbm90IGZvdW5kIik7CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgIH0KKworICAgc3RhdHVzID0gaGRkX3NvZnRhcF9HZXRTdGFJZChwSG9zdGFwZEFkYXB0ZXIsICh2X01BQ0FERFJfdCAqKW1hY0FkZHJlc3MsICh2b2lkICopKCZzdGFJZCkpOworCisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMgKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAoIkVSUk9SOiBIREQgRmFpbGVkIHRvIGZpbmQgc3RhIGlkISFcbiIpKTsKKyAgICAgIGxpbmtfc3BlZWQgPSAwOworICAgfQorICAgZWxzZQorICAgeworICAgICAgc3RhdHVzID0gd2xhbl9oZGRfZ2V0X2NsYXNzQXN0YXRzX2Zvcl9zdGF0aW9uKHBIb3N0YXBkQWRhcHRlciAsIHN0YUlkKTsKKyAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cyApKQorICAgICAgeworICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogVW5hYmxlIHRvIHJldHJpZXZlIFNNRSBzdGF0aXN0aWNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgIH0KKyAgICAgIGxpbmtfc3BlZWQgPShpbnQpcEhvc3RhcGRBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQudHhfcmF0ZS8yOworICAgfQorCisgICB3cnF1LT5kYXRhLmxlbmd0aCA9IGxlbjsKKyAgIHJjID0gc25wcmludGYocExpbmtTcGVlZCwgbGVuLCAiJXUiLCBsaW5rX3NwZWVkKTsKKyAgIGlmICgocmMgPCAwKSB8fCAocmMgPj0gbGVuKSkKKyAgIHsKKyAgICAgIC8vIGVuY29kaW5nIG9yIGxlbmd0aCBlcnJvcj8KKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IFVuYWJsZSB0byBlbmNvZGUgbGluayBzcGVlZCwgZ290IFslc10iLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcExpbmtTcGVlZCk7CisgICAgICByZXR1cm4gLUVJTzsKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyICAgICAgaG9zdGFwZF9oYW5kbGVyW10gPQoreworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdOQU1FICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NTSVdGUkVRICovCisgICAoaXdfaGFuZGxlcikgaXdfZ2V0X2FwX2ZyZXEsICAgIC8qIFNJT0NHSVdGUkVRICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NTSVdNT0RFICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdNT0RFICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NTSVdTRU5TICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NTSVdSQU5HRSAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DR0lXUkFOR0UgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ1NJV1BSSVYgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ0dJV1BSSVYgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ1NJV1NUQVRTICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdTVEFUUyAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DU0lXU1BZICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ1NJV1RIUlNQWSAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NTSVdBUCAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DR0lXQVAgKi8KKyAgIChpd19oYW5kbGVyKSBpd19zZXRfYXBfbWxtZSwgICAgLyogU0lPQ1NJV01MTUUgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ0dJV0FQTElTVCAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DU0lXU0NBTiAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DR0lXU0NBTiAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DU0lXRVNTSUQgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ0dJV0VTU0lEICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NTSVdOSUNLTiAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DR0lXTklDS04gKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NTSVdSQVRFICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdSQVRFICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NTSVdSVFMgKi8KKyAgIChpd19oYW5kbGVyKSBpd19nZXRfYXBfcnRzX3RocmVzaG9sZCwgICAgIC8qIFNJT0NHSVdSVFMgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ1NJV0ZSQUcgKi8KKyAgIChpd19oYW5kbGVyKSBpd19nZXRfYXBfZnJhZ190aHJlc2hvbGQsICAgIC8qIFNJT0NHSVdGUkFHICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DU0lXRU5DT0RFICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdFTkNPREUgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgIChpd19oYW5kbGVyKSBpd19zZXRfYXBfZ2VuaWUsICAgICAvKiBTSU9DU0lXR0VOSUUgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ0dJV0dFTklFICovCisgICAoaXdfaGFuZGxlcikgaXdfc2V0X2F1dGhfaG9zdGFwLCAgICAvKiBTSU9DU0lXQVVUSCAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAvKiBTSU9DR0lXQVVUSCAqLworICAgKGl3X2hhbmRsZXIpIGl3X3NldF9hcF9lbmNvZGVleHQsICAgICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIC8qIFNJT0NHSVdFTkNPREVFWFQgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICovCit9OworCisjZGVmaW5lICAgIElXX1BSSVZfVFlQRV9PUFRJRSAgICBJV19QUklWX1RZUEVfQllURSB8IFFDU0FQX01BWF9PUFRfSUUKKyNkZWZpbmUgICAgSVdfUFJJVl9UWVBFX01MTUUgXAorICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFyZXFfbWxtZSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgaG9zdGFwZF9wcml2YXRlX2FyZ3NbXSA9IHsKKyAgeyBRQ1NBUF9JT0NUTF9TRVRQQVJBTSwKKyAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyLCAwLCAic2V0cGFyYW0iIH0sCisgIHsgUUNTQVBfSU9DVExfU0VUUEFSQU0sCisgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgIiIgfSwKKyAgeyBRQ1NBUF9QQVJBTV9NQVhfQVNTT0MsCisgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldE1heEFzc29jIiB9LAorICAgeyBRQ1NBUF9QQVJBTV9ISURFX1NTSUQsCisgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgICJoaWRlU1NJRCIgfSwKKyAgeyBRQ1NBUF9JT0NUTF9HRVRQQVJBTSwKKyAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICAgICJnZXRwYXJhbSIgfSwKKyAgeyBRQ1NBUF9JT0NUTF9HRVRQQVJBTSwgMCwKKyAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAgICAiIiB9LAorICB7IFFDU0FQX1BBUkFNX01BWF9BU1NPQywgMCwKKyAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAgICAiZ2V0TWF4QXNzb2MiIH0sCisgIHsgUUNTQVBfUEFSQU1fTU9EVUxFX0RPV05fSU5ELCAwLAorICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICAgICJtb2R1bGVEb3duSW5kIiB9LAorICB7IFFDU0FQX1BBUkFNX0NMUl9BQ0wsIDAsCisgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgInNldENsZWFyQWNsIiB9LAorICB7IFFDU0FQX1BBUkFNX0FDTF9NT0RFLAorICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRBY2xNb2RlIiB9LAorICB7IFFDU0FQX0lPQ1RMX0NPTU1JVCwKKyAgICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgc2l6ZW9mKHN0cnVjdCBzX0NvbW1pdENvbmZpZykgfCBJV19QUklWX1NJWkVfRklYRUQsIDAsICJjb21taXQiIH0sCisgIHsgUUNTQVBfSU9DVExfU0VUTUxNRSwKKyAgICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgc2l6ZW9mKHN0cnVjdCBzUWNTYXByZXFfbWxtZSl8IElXX1BSSVZfU0laRV9GSVhFRCwgMCwgInNldG1sbWUiIH0sCisgIHsgUUNTQVBfSU9DVExfR0VUX1NUQVdQQUlFLAorICAgICAgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiZ2V0X3N0YVdQQUlFIiB9LAorICB7IFFDU0FQX0lPQ1RMX1NFVFdQQUlFLAorICAgICAgSVdfUFJJVl9UWVBFX0JZVEUgfCBRQ1NBUF9NQVhfV1NDX0lFIHwgSVdfUFJJVl9TSVpFX0ZJWEVELCAwLCAic2V0d3BhaWUiIH0sCisgIHsgUUNTQVBfSU9DVExfU1RPUEJTUywKKyAgICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVELCAwLCAic3RvcGJzcyIgfSwKKyAgeyBRQ1NBUF9JT0NUTF9WRVJTSU9OLCAwLAorICAgICAgSVdfUFJJVl9UWVBFX0NIQVIgfCBRQ1NBUF9NQVhfV1NDX0lFLCAidmVyc2lvbiIgfSwKKyAgeyBRQ1NBUF9JT0NUTF9HRVRfV1BTX1BCQ19QUk9CRV9SRVFfSUVTLAorICAgICAgSVdfUFJJVl9UWVBFX0JZVEUgfCBzaXplb2Yoc1FjU2FwcmVxX1dQU1BCQ1Byb2JlUmVxSUVTX3QpIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImdldFByb2JlUmVxSUVzIiB9LAorICB7IFFDU0FQX0lPQ1RMX0dFVF9DSEFOTkVMLCAwLAorICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IHNpemVvZihzaWduZWQgbG9uZyBpbnQpLCAiZ2V0Y2hhbm5lbCIgfSwKKyAgeyBRQ1NBUF9JT0NUTF9BU1NPQ19TVEFfTUFDQUREUiwgMCwKKyAgICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgLyooKFdMQU5fTUFYX1NUQV9DT1VOVCo2KSsxMDApKi8xICwgImdldF9hc3NvY19zdGFtYWMiIH0sCisgICAgeyBRQ1NBUF9JT0NUTF9ESVNBU1NPQ19TVEEsCisgICAgICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgNiAsIDAsICJkaXNhc3NvY19zdGEiIH0sCisgIHsgUUNTQVBfSU9DVExfQVBfU1RBVFMsCisgICAgICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgUUNTQVBfTUFYX1dTQ19JRSwgMCwgImFwX3N0YXRzIiB9LAorICB7IFFDU0FQX0lPQ1RMX1BSSVZfR0VUX1NPRlRBUF9MSU5LX1NQRUVELAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUiB8IDE4LAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUiB8IDMsICJnZXRMaW5rU3BlZWQiIH0sCisKKyAgeyBRQ1NBUF9JT0NUTF9QUklWX1NFVF9USFJFRV9JTlRfR0VUX05PTkUsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAzLCAwLCAiIiB9LAorICAgLyogaGFuZGxlcnMgZm9yIHN1Yi1pb2N0bCAqLworICAgeyAgIFdFX1NFVF9XTEFOX0RCRywKKyAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMywKKyAgICAgICAwLCAKKyAgICAgICAic2V0d2xhbmRiZyIgfSwKKworICAgLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKyAgIHsgICBRQ1NBUF9JT0NUTF9QUklWX1NFVF9WQVJfSU5UX0dFVF9OT05FLAorICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBNQVhfVkFSX0FSR1MsCisgICAgICAgMCwgCisgICAgICAgIiIgfSwKKworICAgLyogaGFuZGxlcnMgZm9yIHN1Yi1pb2N0bCAqLworICAgeyAgIFdFX0xPR19EVU1QX0NNRCwKKyAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgTUFYX1ZBUl9BUkdTLAorICAgICAgIDAsIAorICAgICAgICJkdW1wIiB9LAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgIHsgICBXRV9QMlBfTk9BX0NNRCwKKyAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgTUFYX1ZBUl9BUkdTLAorICAgICAgIDAsIAorICAgICAgICJTZXRQMnBQcyIgfSwKKyNlbmRpZgorICAgIC8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisgICAgeyAgIFFDU0FQX0lPQ1RMX01PRElGWV9BQ0wsCisgICAgICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgOCwKKyAgICAgICAgMCwgCisgICAgICAgICJtb2RpZnlfYWNsIiB9LAorCisgICAgLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKyAgICB7ICAgUUNTQVBfSU9DVExfR0VUX0NIQU5ORUxfTElTVCwKKyAgICAgICAgMCwgCisgICAgICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgc2l6ZW9mKHRDaGFubmVsTGlzdEluZm8pLAorICAgICAgICAiZ2V0Q2hhbm5lbExpc3QiIH0sCisKK307CitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBob3N0YXBkX3ByaXZhdGVbXSA9IHsKKyAgIFtRQ1NBUF9JT0NUTF9TRVRQQVJBTSAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19zb2Z0YXBfc2V0cGFyYW0sICAvL3NldCBwcml2IGlvY3RsCisgICBbUUNTQVBfSU9DVExfR0VUUEFSQU0gLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfc29mdGFwX2dldHBhcmFtLCAgLy9nZXQgcHJpdiBpb2N0bCAgIAorICAgW1FDU0FQX0lPQ1RMX0NPTU1JVCAgIC0gU0lPQ0lXRklSU1RQUklWXSA9IGl3X3NvZnRhcF9jb21taXQsIC8vZ2V0IHByaXYgaW9jdGwgICAKKyAgIFtRQ1NBUF9JT0NUTF9TRVRNTE1FICAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19zb2Z0YXBfc2V0bWxtZSwKKyAgIFtRQ1NBUF9JT0NUTF9HRVRfU1RBV1BBSUUgLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfZ2V0X2dlbmllLCAvL2dldCBzdGF0aW9uIGdlbklFCisgICBbUUNTQVBfSU9DVExfU0VUV1BBSUUgLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfc29mdGFwX3NldHdwc2llLAorICAgW1FDU0FQX0lPQ1RMX1NUT1BCU1MgLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfc29mdGFwX3N0b3Bic3MsICAgICAgIC8vIHN0b3AgYnNzCisgICBbUUNTQVBfSU9DVExfVkVSU0lPTiAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19zb2Z0YXBfdmVyc2lvbiwgICAgICAgLy8gZ2V0IGRyaXZlciB2ZXJzaW9uCisgICBbUUNTQVBfSU9DVExfR0VUX1dQU19QQkNfUFJPQkVfUkVRX0lFUyAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19nZXRfV1BTUEJDUHJvYmVSZXFJRXMsCisgICBbUUNTQVBfSU9DVExfR0VUX0NIQU5ORUwgLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfc29mdGFwX2dldGNoYW5uZWwsCisgICBbUUNTQVBfSU9DVExfQVNTT0NfU1RBX01BQ0FERFIgLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfc29mdGFwX2dldGFzc29jX3N0YW1hY2FkZHIsCisgICBbUUNTQVBfSU9DVExfRElTQVNTT0NfU1RBIC0gU0lPQ0lXRklSU1RQUklWXSA9IGl3X3NvZnRhcF9kaXNhc3NvY19zdGEsCisgICBbUUNTQVBfSU9DVExfQVBfU1RBVFMgLSBTSU9DSVdGSVJTVFBSSVZdID0gaXdfc29mdGFwX2FwX3N0YXRzLAorICAgW1FDU0FQX0lPQ1RMX1BSSVZfU0VUX1RIUkVFX0lOVF9HRVRfTk9ORSAtIFNJT0NJV0ZJUlNUUFJJVl0gID0gaXdfc2V0X3RocmVlX2ludHNfZ2V0bm9uZSwgICAKKyAgIFtRQ1NBUF9JT0NUTF9QUklWX1NFVF9WQVJfSU5UX0dFVF9OT05FIC0gU0lPQ0lXRklSU1RQUklWXSAgICAgPSBpd19zZXRfdmFyX2ludHNfZ2V0bm9uZSwKKyAgIFtRQ1NBUF9JT0NUTF9TRVRfQ0hBTk5FTF9SQU5HRSAtIFNJT0NJV0ZJUlNUUFJJVl0gPSBpd19zb2Z0YXBfc2V0X2NoYW5uZWxfcmFuZ2UsCisgICBbUUNTQVBfSU9DVExfTU9ESUZZX0FDTCAtIFNJT0NJV0ZJUlNUUFJJVl0gICA9IGl3X3NvZnRhcF9tb2RpZnlfYWNsLAorICAgW1FDU0FQX0lPQ1RMX0dFVF9DSEFOTkVMX0xJU1QgLSBTSU9DSVdGSVJTVFBSSVZdICAgPSBpd19zb2Z0YXBfZ2V0X2NoYW5uZWxfbGlzdCwKKyAgIFtRQ1NBUF9JT0NUTF9QUklWX0dFVF9TT0ZUQVBfTElOS19TUEVFRCAtIFNJT0NJV0ZJUlNUUFJJVl0gICAgID0gaXdfZ2V0X3NvZnRhcF9saW5rc3BlZWQKK307Citjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgaG9zdGFwZF9oYW5kbGVyX2RlZiA9IHsKKyAgIC5udW1fc3RhbmRhcmQgICAgID0gc2l6ZW9mKGhvc3RhcGRfaGFuZGxlcikgLyBzaXplb2YoaG9zdGFwZF9oYW5kbGVyWzBdKSwKKyAgIC5udW1fcHJpdmF0ZSAgICAgID0gc2l6ZW9mKGhvc3RhcGRfcHJpdmF0ZSkgLyBzaXplb2YoaG9zdGFwZF9wcml2YXRlWzBdKSwKKyAgIC5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKGhvc3RhcGRfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZihob3N0YXBkX3ByaXZhdGVfYXJnc1swXSksCisgICAuc3RhbmRhcmQgICAgICAgICA9IChpd19oYW5kbGVyICopaG9zdGFwZF9oYW5kbGVyLAorICAgLnByaXZhdGUgICAgICAgICAgPSAoaXdfaGFuZGxlciAqKWhvc3RhcGRfcHJpdmF0ZSwKKyAgIC5wcml2YXRlX2FyZ3MgICAgID0gaG9zdGFwZF9wcml2YXRlX2FyZ3MsCisgICAuZ2V0X3dpcmVsZXNzX3N0YXRzID0gTlVMTCwKK307CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDI5KQorc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldF9vcHNfc3RydWN0ICA9IHsKKyAgICAubmRvX29wZW4gPSBoZGRfaG9zdGFwZF9vcGVuLAorICAgIC5uZG9fc3RvcCA9IGhkZF9ob3N0YXBkX3N0b3AsCisgICAgLm5kb191bmluaXQgPSBoZGRfaG9zdGFwZF91bmluaXQsCisgICAgLm5kb19zdGFydF94bWl0ID0gaGRkX3NvZnRhcF9oYXJkX3N0YXJ0X3htaXQsCisgICAgLm5kb190eF90aW1lb3V0ID0gaGRkX3NvZnRhcF90eF90aW1lb3V0LAorICAgIC5uZG9fZ2V0X3N0YXRzID0gaGRkX3NvZnRhcF9zdGF0cywKKyAgICAubmRvX3NldF9tYWNfYWRkcmVzcyA9IGhkZF9ob3N0YXBkX3NldF9tYWNfYWRkcmVzcywKKyAgICAubmRvX2RvX2lvY3RsID0gaGRkX2hvc3RhcGRfaW9jdGwsCisgICAgLm5kb19jaGFuZ2VfbXR1ID0gaGRkX2hvc3RhcGRfY2hhbmdlX210dSwKKyAgICAubmRvX3NlbGVjdF9xdWV1ZSA9IGhkZF9ob3N0YXBkX3NlbGVjdF9xdWV1ZSwKKyB9OworI2VuZGlmCisKK2ludCBoZGRfc2V0X2hvc3RhcGQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gCisKK3ZvaWQgaGRkX3NldF9hcF9vcHMoIHN0cnVjdCBuZXRfZGV2aWNlICpwV2xhbkhvc3RhcGREZXYgKQoreworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwyOSkKKyAgcFdsYW5Ib3N0YXBkRGV2LT5uZXRkZXZfb3BzID0gJm5ldF9vcHNfc3RydWN0OworI2Vsc2UKKyAgcFdsYW5Ib3N0YXBkRGV2LT5vcGVuID0gaGRkX2hvc3RhcGRfb3BlbjsKKyAgcFdsYW5Ib3N0YXBkRGV2LT5zdG9wID0gaGRkX2hvc3RhcGRfc3RvcDsKKyAgcFdsYW5Ib3N0YXBkRGV2LT51bmluaXQgPSBoZGRfaG9zdGFwZF91bmluaXQ7CisgIHBXbGFuSG9zdGFwZERldi0+aGFyZF9zdGFydF94bWl0ID0gaGRkX3NvZnRhcF9oYXJkX3N0YXJ0X3htaXQ7CisgIHBXbGFuSG9zdGFwZERldi0+dHhfdGltZW91dCA9IGhkZF9zb2Z0YXBfdHhfdGltZW91dDsKKyAgcFdsYW5Ib3N0YXBkRGV2LT5nZXRfc3RhdHMgPSBoZGRfc29mdGFwX3N0YXRzOworICBwV2xhbkhvc3RhcGREZXYtPnNldF9tYWNfYWRkcmVzcyA9IGhkZF9ob3N0YXBkX3NldF9tYWNfYWRkcmVzczsKKyAgcFdsYW5Ib3N0YXBkRGV2LT5kb19pb2N0bCA9IGhkZF9ob3N0YXBkX2lvY3RsOworI2VuZGlmCit9CisKK1ZPU19TVEFUVVMgaGRkX2luaXRfYXBfbW9kZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreyAgIAorICAgIGhkZF9ob3N0YXBkX3N0YXRlX3QgKiBwaG9zdGFwZEJ1ZjsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcEFkYXB0ZXItPmRldjsKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICBFTlRFUigpOworICAgICAgIC8vIEFsbG9jYXRlIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zIHN0YXRlIHN0cnVjdHVyZSAgIAorICAgIHBob3N0YXBkQnVmID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIoIHBBZGFwdGVyICk7CisgCisgICAgLy8gWmVybyB0aGUgbWVtb3J5LiAgVGhpcyB6ZXJvcyB0aGUgcHJvZmlsZSBzdHJ1Y3R1cmUuCisgICAgbWVtc2V0KHBob3N0YXBkQnVmLCAwLHNpemVvZihoZGRfaG9zdGFwZF9zdGF0ZV90KSk7CisgICAgCisgICAgLy8gU2V0IHVwIHRoZSBwb2ludGVyIHRvIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zIHN0YXRlIHN0cnVjdHVyZQorICAgIC8vIE5PUAorICAgIHN0YXR1cyA9IGhkZF9zZXRfaG9zdGFwZChwQWRhcHRlcik7CisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgKCJFUlJPUjogaGRkX3NldF9ob3N0YXBkIGZhaWxlZCEhXG4iKSk7CisgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAKKyAgICBzdGF0dXMgPSB2b3NfZXZlbnRfaW5pdCgmcGhvc3RhcGRCdWYtPnZvc0V2ZW50KTsKKyAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAoIkVSUk9SOiBIb3N0YXBkIEhERCB2b3MgZXZlbnQgaW5pdCBmYWlsZWQhIVxuIikpOworICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgCisgICAgaW5pdF9jb21wbGV0aW9uKCZwQWRhcHRlci0+c2Vzc2lvbl9jbG9zZV9jb21wX3Zhcik7CisgICAgaW5pdF9jb21wbGV0aW9uKCZwQWRhcHRlci0+c2Vzc2lvbl9vcGVuX2NvbXBfdmFyKTsKKworICAgIHNlbWFfaW5pdCgmKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBBZGFwdGVyKSktPnNlbVdwc1BCQ092ZXJsYXBJbmQsIDEpOworIAorICAgICAvLyBSZWdpc3RlciBhcyBhIHdpcmVsZXNzIGRldmljZQorICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJiBob3N0YXBkX2hhbmRsZXJfZGVmOworCisgICAgLy9Jbml0aWFsaXplIHRoZSBkYXRhIHBhdGggbW9kdWxlCisgICAgc3RhdHVzID0gaGRkX3NvZnRhcF9pbml0X3R4X3J4KHBBZGFwdGVyKTsKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApKQorICAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IGhkZF9zb2Z0YXBfaW5pdF90eF9yeCBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKyAgICAKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgICB3bGFuX2hkZF9zZXRfbW9uaXRvcl90eF9hZGFwdGVyKCBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSwgcEFkYXB0ZXIgKTsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAvKiBJZiBhZG1pbmlzdHJhdGl2ZSBpbnRlcmZhY2UgaXMgZW5hYmxlZCB0aGVuIG9uZSBpbnRlcmZhY2UgYmVpbmcKKyAgICAgKiBjcmVhdGVkIGZvciBwMnAgZGV2aWNlIGFkZHJlc3MuIFRoaXMgd2lsbCB0YWtlIG9uZSBIVyBTVEEgYW5kIAorICAgICAqIHRoZSBtYXggbnVtYmVyIG9mIGNsaWVudHMgdGhhdCBjYW4gY29ubmVjdCB0byBzb2Z0QVAgd2lsbCBiZSAKKyAgICAgKiByZWR1Y2VkIGJ5IG9uZS4gU28gYXMgc29vbiBhcyBTb2Z0QVAgaW50ZXJmYWNlIGdvdCBjcmVhdGVkIHJlbW92ZSAKKyAgICAgKiB0aGUgc2Vzc2lvbiBmb3IgcDJwIGRldmljZSBhZGRyZXNzLgorICAgICAqLworICAgIGlmICggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSAmJiAKKyAgICAgICAgICAgICggcEFkYXB0ZXItPmRldmljZV9tb2RlID09IFdMQU5fSEREX1NPRlRBUCApICYmIAorICAgICAgICAgICAgKCAhc3RybmNtcCggcEFkYXB0ZXItPmRldi0+bmFtZSwgIndsYW4iLCA0ICkpICkKKyAgICB7CisgICAgICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKyAgICAgICAgaWYgKHBIZGRDdHgtPmNmZ19pbmktPmlzUDJwRGV2aWNlQWRkckFkbWluaXN0cmF0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+c2Vzc2lvbl9jbG9zZV9jb21wX3Zhcik7CisgICAgICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBzbWVfQ2xvc2VTZXNzaW9uKCBwSGRkQ3R4LT5oSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPnAycFNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9zbWVDbG9zZVNlc3Npb25DYWxsYmFjaywgcEFkYXB0ZXIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9CbG9jayBvbiBhIGNvbXBsZXRpb24gdmFyaWFibGUuIENhbid0IHdhaXQgZm9yZXZlciB0aG91Z2guCisgICAgICAgICAgICAgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAmcEFkYXB0ZXItPnNlc3Npb25fY2xvc2VfY29tcF92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX1NFU1NJT05PUEVOQ0xPU0UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIEVYSVQoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitoZGRfYWRhcHRlcl90KiBoZGRfd2xhbl9jcmVhdGVfYXBfZGV2KCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0U2lyTWFjQWRkciBtYWNBZGRyLCB0QU5JX1U4ICppZmFjZV9uYW1lICkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqcFdsYW5Ib3N0YXBkRGV2ID0gTlVMTDsKKyAgICBoZGRfYWRhcHRlcl90ICpwSG9zdGFwZEFkYXB0ZXIgPSBOVUxMOworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0PSBOVUxMOworCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICBwV2xhbkhvc3RhcGREZXYgPSBhbGxvY19uZXRkZXZfbXEoc2l6ZW9mKGhkZF9hZGFwdGVyX3QpLCBpZmFjZV9uYW1lLCBldGhlcl9zZXR1cCwgTlVNX1RYX1FVRVVFUyk7CisjZWxzZSAgIAorICAgcFdsYW5Ib3N0YXBkRGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKGhkZF9hZGFwdGVyX3QpLCBOVU1fVFhfUVVFVUVTKTsKKyNlbmRpZgorCisgICAgaWYgKHBXbGFuSG9zdGFwZERldiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcEhvc3RhcGRBZGFwdGVyID0gbmV0ZGV2X3ByaXYocFdsYW5Ib3N0YXBkRGV2KTsKKworICAgICAgICAvL0luaXQgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgICAgICAgIGV0aGVyX3NldHVwKHBXbGFuSG9zdGFwZERldik7CisKKyAgICAgICAgLy9Jbml0aWFsaXplIHRoZSBhZGFwdGVyIGNvbnRleHQgdG8gemVyb3MuCisgICAgICAgIHZvc19tZW1femVybyhwSG9zdGFwZEFkYXB0ZXIsIHNpemVvZiggaGRkX2FkYXB0ZXJfdCApKTsKKyAgICAgICAgcEhvc3RhcGRBZGFwdGVyLT5kZXYgPSBwV2xhbkhvc3RhcGREZXY7CisgICAgICAgIHBIb3N0YXBkQWRhcHRlci0+cEhkZEN0eCA9IHBIZGRDdHg7IAorICAgICAgICBwSG9zdGFwZEFkYXB0ZXItPm1hZ2ljID0gV0xBTl9IRERfQURBUFRFUl9NQUdJQzsKKworICAgICAgICAvL0dldCB0aGUgR2xvYmFsIFZPU1MgY29udGV4dC4KKyAgICAgICAgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU1lTLCBOVUxMKTsKKyAgICAgICAgLy9TYXZlIHRoZSBhZGFwdGVyIGNvbnRleHQgaW4gZ2xvYmFsIGNvbnRleHQgZm9yIGZ1dHVyZS4KKyAgICAgICAgKChWb3NDb250ZXh0VHlwZSopKHBWb3NDb250ZXh0KSktPnBIRERTb2Z0QVBDb250ZXh0ID0gKHZfVk9JRF90KilwSG9zdGFwZEFkYXB0ZXI7CisKKyAgICAgICAgLy9Jbml0IHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICAgICAgICBzdHJsY3B5KHBXbGFuSG9zdGFwZERldi0+bmFtZSwgKGNvbnN0IGNoYXIgKilpZmFjZV9uYW1lLCBJRk5BTVNJWik7CisKKyAgICAgICAgaGRkX3NldF9hcF9vcHMoIHBIb3N0YXBkQWRhcHRlci0+ZGV2ICk7CisKKyAgICAgICAgcFdsYW5Ib3N0YXBkRGV2LT50eF9xdWV1ZV9sZW4gPSBORVRfREVWX1RYX1FVRVVFX0xFTjsKKyAgICAgICAgcFdsYW5Ib3N0YXBkRGV2LT53YXRjaGRvZ190aW1lbyA9IEhERF9UWF9USU1FT1VUOworICAgICAgICBwV2xhbkhvc3RhcGREZXYtPm10dSA9IEhERF9ERUZBVUxUX01UVTsKKyAgICAKKyAgICAgICAgdm9zX21lbV9jb3B5KHBXbGFuSG9zdGFwZERldi0+ZGV2X2FkZHIsICh2b2lkICopbWFjQWRkcixzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgdm9zX21lbV9jb3B5KHBIb3N0YXBkQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsICh2b2lkICopbWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICAgICAgcFdsYW5Ib3N0YXBkRGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAgICAgIHBXbGFuSG9zdGFwZERldi0+aWVlZTgwMjExX3B0ciA9ICZwSG9zdGFwZEFkYXB0ZXItPndkZXYgOworICAgICAgICBwSG9zdGFwZEFkYXB0ZXItPndkZXYud2lwaHkgPSBwSGRkQ3R4LT53aXBoeTsgIAorICAgICAgICBwSG9zdGFwZEFkYXB0ZXItPndkZXYubmV0ZGV2ID0gIHBXbGFuSG9zdGFwZERldjsKKyAgICAgICAgaW5pdF9jb21wbGV0aW9uKCZwSG9zdGFwZEFkYXB0ZXItPnR4X2FjdGlvbl9jbmZfZXZlbnQpOworI2VuZGlmIAorICAgICAgICBpbml0X2NvbXBsZXRpb24oJnBIb3N0YXBkQWRhcHRlci0+Y2FuY2VsX3JlbV9vbl9jaGFuX3Zhcik7CisgICAgICAgIGluaXRfY29tcGxldGlvbigmcEhvc3RhcGRBZGFwdGVyLT5yZW1fb25fY2hhbl9yZWFkeV9ldmVudCk7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorICAgICAgICBpbml0X2NvbXBsZXRpb24oJnBIb3N0YXBkQWRhcHRlci0+b2ZmY2hhbm5lbF90eF9ldmVudCk7CisjZW5kaWYKKworICAgICAgICBpbml0X2NvbXBsZXRpb24oJnBIb3N0YXBkQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5fcmVxX2NvbXBsZXRpb25fZXZlbnQpOworCisgICAgICAgIFNFVF9ORVRERVZfREVWKHBXbGFuSG9zdGFwZERldiwgcEhkZEN0eC0+cGFyZW50X2Rldik7CisgICAgfQorICAgIHJldHVybiBwSG9zdGFwZEFkYXB0ZXI7Cit9CisKK1ZPU19TVEFUVVMgaGRkX3JlZ2lzdGVyX2hvc3RhcGQoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB0QU5JX1U4IHJ0bmxfbG9ja19oZWxkICkKK3sKKyAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwQWRhcHRlci0+ZGV2OworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIEVOVEVSKCk7CisgICAKKyAgIGlmKCBydG5sX2xvY2tfaGVsZCApCisgICB7CisgICAgICBpZiAoc3RyY2hyKGRldi0+bmFtZSwgJyUnKSkgeworICAgICAgICAgaWYoIGRldl9hbGxvY19uYW1lKGRldiwgZGV2LT5uYW1lKSA8IDAgKQorICAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkZhaWxlZDpkZXZfYWxsb2NfbmFtZSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsgICAgICAgICAgICAKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChyZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KSkKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOkZhaWxlZDpyZWdpc3Rlcl9uZXRkZXZpY2UiLCBfX2Z1bmNfXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7ICAgICAgICAgCisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCisgICAgICB7CisgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IEZhaWxlZDpyZWdpc3Rlcl9uZXRkZXYiLCBfX2Z1bmNfXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisgICB9CisgICBzZXRfYml0KE5FVF9ERVZJQ0VfUkVHSVNURVJFRCwgJnBBZGFwdGVyLT5ldmVudF9mbGFncyk7CisgICAgIAorICAgRVhJVCgpOworICAgcmV0dXJuIHN0YXR1czsKK30KKyAgICAKK1ZPU19TVEFUVVMgaGRkX3VucmVnaXN0ZXJfaG9zdGFwZChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKyAgIEVOVEVSKCk7CisgICAKKyAgIGhkZF9zb2Z0YXBfZGVpbml0X3R4X3J4KHBBZGFwdGVyKTsKKworICAgLyogaWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBkdXJpbmcgZHJpdmVyIHVubG9hZCwgdGhlbiB0aGUgZGV2IGhhcyBhbHJlYWR5CisgICAgICBiZWVuIGludmFsaWRhdGVkLiAgaWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBhdCBvdGhlciB0aW1lcywgdGhlbiB3ZSBjYW4KKyAgICAgIGRldGF0Y2ggdGhlIHdpcmVsZXNzIGRldmljZSBoYW5kbGVycyAqLworICAgaWYgKHBBZGFwdGVyLT5kZXYpCisgICB7CisgICAgICBwQWRhcHRlci0+ZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IE5VTEw7CisgICB9CisgICBFWElUKCk7CisgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL0NPUkUvSEREL3NyYy93bGFuX2hkZF9pbm5hdi5jIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX2lubmF2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5YjAyOQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF9pbm5hdi5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCmRpZmYgLS1naXQgYS9DT1JFL0hERC9zcmMvd2xhbl9oZGRfbWFpbi5jIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzM5N2EwCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX21haW4uYwpAQCAtMCwwICsxLDQ0NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFxmaWxlICB3bGFuX2hkZF9tYWluLmMKKworICBcYnJpZWYgV0xBTiBIb3N0IERldmljZSBEcml2ZXIgaW1wbGVtZW50YXRpb24KKworICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjokICAgJERhdGVUaW1lOiAkICRBdXRob3I6ICQKKworCisgIHdoZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5CisgIC0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAwNC81LzA5ICAgICBTaGFpbGVuZGVyICAgICBDcmVhdGVkIG1vZHVsZS4KKyAgMDIvMjQvMTAgICAgU3VkaGlyLlMuS29oYWxsaSAgQWRkZWQgdG8gc3VwcG9ydCBwYXJhbSBmb3IgU29mdEFQIG1vZHVsZQorICAwNi8wMy8xMCAgICBqcyAtIEFkZGVkIHN1cHBvcnQgdG8gaG9zdGFwZCBkcml2ZW4gZGVhdXRoL2Rpc2Fzc29jL21pYyBmYWlsdXJlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyNpbmNsdWRlIDx3bGFuX3FjdF9kcml2ZXIuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisjaW5jbHVkZSA8d2xhbl9zYWxfbWlzYy5oPgorI2VuZGlmIC8vIEFOSV9CVVNfVFlQRV9TRElPCisjaW5jbHVkZSA8dm9zX2FwaS5oPgorI2luY2x1ZGUgPHZvc19zY2hlZC5oPgorI2luY2x1ZGUgPHZvc19wb3dlci5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDMyKSkKKy8vIGFkZGVkIGluIDIuNi4zMiwgbmVlZCB0byBkZWZpbmUgbG9jYWxseSBpZiB1c2luZyBhbiBlYXJsaWVyIGtlcm5lbAorI2RlZmluZSBkZXZfdG9fc2Rpb19mdW5jKGQpICAgICAgY29udGFpbmVyX29mKGQsIHN0cnVjdCBzZGlvX2Z1bmMsIGRldikKKyNlbmRpZgorI2VuZGlmIC8vIEFOSV9CVVNfVFlQRV9TRElPCisjaWZkZWYgQU5JX0JVU19UWVBFX1BMQVRGT1JNCisjaW5jbHVkZSA8bGludXgvd2Nuc3Nfd2xhbi5oPgorI2VuZGlmIC8vQU5JX0JVU19UWVBFX1BMQVRGT1JNCisjaWZkZWYgQU5JX0JVU19UWVBFX1BDSQorI2luY2x1ZGUgIndjbnNzX3dsYW4uaCIKKyNlbmRpZiAvKiBBTklfQlVTX1RZUEVfUENJICovCisjaW5jbHVkZSA8d2xhbl9oZGRfdHhfcnguaD4KKyNpbmNsdWRlIDxwYWxUaW1lci5oPgorI2luY2x1ZGUgPHduaUFwaS5oPgorI2luY2x1ZGUgPHdsYW5fbmxpbmtfc3J2Lmg+CisjaW5jbHVkZSA8d2xhbl9idGNfc3ZjLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfY2ZnLmg+CisjaW5jbHVkZSA8d2xhbl9wdHRfc29ja19zdmMuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF93b3dsLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfbWlzYy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dleHQuaD4KKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyNpbmNsdWRlIDxiYXBfaGRkX21haW4uaD4KKyNpbmNsdWRlIDxiYXBJbnRlcm5hbC5oPgorI2VuZGlmIC8vIFdMQU5fQlRBTVBfRkVBVFVSRQorCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKyNpbmNsdWRlICJ3bGFuX2hkZF9jZmc4MDIxMS5oIgorI2luY2x1ZGUgIndsYW5faGRkX3AycC5oIgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaWZkZWYgQU5JX01BTkZfRElBRworaW50IHdsYW5faGRkX2Z0bV9zdGFydChoZGRfY29udGV4dF90ICpwQWRhcHRlcik7CisjZW5kaWYKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjaW5jbHVkZSAic2FwQXBpLmgiCisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bWFjaC9zdWJzeXN0ZW1fcmVzdGFydC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2hvc3RhcGQuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9zb2Z0YXBfdHhfcnguaD4KKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImNmZ0FwaS5oIgorI2VuZGlmCisjaW5jbHVkZSAid2xhbl9oZGRfZGV2X3B3ci5oIgorI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorI2luY2x1ZGUgImJhcF9oZGRfbWlzYy5oIgorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3RyYWNlLmgiCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisjaW5jbHVkZSAicXdsYW5fdmVyc2lvbi5oIgorCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIFdMQU5fTU9EVUxFX05BTUUgIG1vZHVsZV9uYW1lKFRISVNfTU9EVUxFKQorI2Vsc2UKKyNkZWZpbmUgV0xBTl9NT0RVTEVfTkFNRSAgIndsYW4iCisjZW5kaWYKKworI2lmZGVmIFRJTUVSX01BTkFHRVIKKyNkZWZpbmUgVElNRVJfTUFOQUdFUl9TVFIgIiArVElNRVJfTUFOQUdFUiIKKyNlbHNlCisjZGVmaW5lIFRJTUVSX01BTkFHRVJfU1RSICIiCisjZW5kaWYKKworI2lmZGVmIE1FTU9SWV9ERUJVRworI2RlZmluZSBNRU1PUllfREVCVUdfU1RSICIgK01FTU9SWV9ERUJVRyIKKyNlbHNlCisjZGVmaW5lIE1FTU9SWV9ERUJVR19TVFIgIiIKKyNlbmRpZgorCisvKiB0aGUgQW5kcm9pZCBmcmFtZXdvcmsgZXhwZWN0cyB0aGlzIHBhcmFtIGV2ZW4gdGhvdWdoIHdlIGRvbid0IHVzZSBpdCAqLworI2RlZmluZSBCVUZfTEVOIDIwCitzdGF0aWMgY2hhciBmd3BhdGhbQlVGX0xFTl07Cittb2R1bGVfcGFyYW1fc3RyaW5nKGZ3cGF0aCwgZndwYXRoLCBCVUZfTEVOLAorICAgICAgICAgICAgICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKworc3RhdGljIHN0cnVjdCB3YWtlX2xvY2sgd2xhbl93YWtlX2xvY2s7CisvKiBzZXQgd2hlbiBTU1IgaXMgbmVlZGVkIGFmdGVyIHVubG9hZCAqLworc3RhdGljIHZfVThfdCAgICAgIGlzU3NyUmVxdWlyZWQ7CisKKy8vaW50ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24KK3ZfVTE2X3QgaGRkX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgIHN0cnVjdCBza19idWZmICpza2IpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKK3N0YXRpYyB2b2lkIGhkZF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKwordm9pZCBoZGRfd2xhbl9pbml0aWFsX3NjYW4oaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpOworCitleHRlcm4gaW50IGhkZF9zZXRCYW5kX2hlbHBlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB0QU5JX1U4KiBwdHIpOworCitzdGF0aWMgaW50IGhkZF9uZXRkZXZfbm90aWZpZXJfY2FsbChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiBuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbmRldikKK3sKKyAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZGV2OworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4OworI2VuZGlmCisKKyAgIC8vTWFrZSBzdXJlIHRoYXQgdGhpcyBjYWxsYmFjayBjb3JyZXNwb25kcyB0byBvdXIgZGV2aWNlLgorICAgaWYoKHN0cm5jbXAoIGRldi0+bmFtZSwgIndsYW4iLCA0ICkpICYmIAorICAgICAgKHN0cm5jbXAoIGRldi0+bmFtZSwgInAycC13bGFuIiwgOCkpCisgICAgICkKKyAgICAgIHJldHVybiBOT1RJRllfRE9ORTsKKworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgaWYgKCFkZXYtPmllZWU4MDIxMV9wdHIpCisgICAgICAgcmV0dXJuIE5PVElGWV9ET05FOworI2VuZGlmCisKKyAgIHBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisKKyAgIGlmKE5VTEwgPT0gcEFkYXB0ZXIpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogSEREIEFkYXB0b3IgTnVsbCBQb2ludGVyIiwgX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBOT1RJRllfRE9ORTsKKyAgIH0KKworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCIlczogTmV3IE5ldCBEZXZpY2UgU3RhdGUgPSAlbHUiLCBfX2Z1bmNfXywgc3RhdGUpOworCisgICBzd2l0Y2ggKHN0YXRlKSB7CisgICBjYXNlIE5FVERFVl9SRUdJU1RFUjoKKyAgICAgICAgYnJlYWs7CisKKyAgIGNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisgICAgICAgIGJyZWFrOworCisgICBjYXNlIE5FVERFVl9VUDoKKyAgICAgICAgYnJlYWs7CisKKyAgIGNhc2UgTkVUREVWX0RPV046CisgICAgICAgIGJyZWFrOworCisgICBjYXNlIE5FVERFVl9DSEFOR0U6CisgICAgICAgIGlmKFZPU19TVEFfTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpIAorICAgICAgICB7CisgICAgICAgICAgICBpZihUUlVFID09IHBBZGFwdGVyLT5pc0xpbmtVcFN2Y05lZWRlZCkKKyAgICAgICAgICAgICAgIGNvbXBsZXRlKCZwQWRhcHRlci0+bGlua3VwX2V2ZW50X3Zhcik7CisgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgIGNhc2UgTkVUREVWX0dPSU5HX0RPV046CisgICAgICAgIGlmKCBwQWRhcHRlci0+c2Nhbl9pbmZvLm1TY2FuUGVuZGluZyAhPSBGQUxTRSApCisgICAgICAgIHsgCisgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+YWJvcnRzY2FuX2V2ZW50X3Zhcik7CisgICAgICAgICAgIGhkZF9hYm9ydF9tYWNfc2NhbihwQWRhcHRlci0+cEhkZEN0eCk7CisgICAgICAgICAgIHJlc3VsdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWRhcHRlci0+YWJvcnRzY2FuX2V2ZW50X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX0FCT1JUU0NBTikpOworICAgICAgICAgICBpZighcmVzdWx0KQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFRpbWVvdXQgb2NjdXJlZCB3aGlsZSB3YWl0aW5nIGZvciBhYm9ydHNjYW4iICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICIlczogU2NhbiBpcyBub3QgUGVuZGluZyBmcm9tIHVzZXIiICwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCIlczogZGlzYWJsaW5nIEFNUCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKCBwQWRhcHRlciApOworICAgICAgICBzdGF0dXMgPSBXTEFOQkFQX1N0b3BBbXAoKTsKKyAgICAgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAgcEhkZEN0eC0+aXNBbXBBbGxvd2VkID0gVk9TX1RSVUU7CisgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdG9wIEFNUCIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgLy9hIHN0YXRlIG0vYyBpbXBsZW1lbnRhdGlvbiBpbiBQQUwgaXMgVEJEIHRvIGF2b2lkIHRoaXMgZGVsYXkKKyAgICAgICAgICAgbXNsZWVwKDUwMCk7CisgICAgICAgICAgIHBIZGRDdHgtPmlzQW1wQWxsb3dlZCA9IFZPU19GQUxTRTsKKyAgICAgICAgICAgV0xBTkJBUF9EZXJlZ2lzdGVyRnJvbUhDSSgpOworICAgICAgICB9CisjZW5kaWYgLy9XTEFOX0JUQU1QX0ZFQVRVUkUKKyAgICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0cnVjdCBub3RpZmllcl9ibG9jayBoZGRfbmV0ZGV2X25vdGlmaWVyID0geworICAgLm5vdGlmaWVyX2NhbGwgPSBoZGRfbmV0ZGV2X25vdGlmaWVyX2NhbGwsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICBGdW5jdGlvbiBkZWZpbml0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBpbnQgaXNXRHJlc2V0SW5Qcm9ncmVzcyh2b2lkKTsKKyNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAorZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfd2xhbl9zdXNwZW5kKHZvaWQpOworZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl93bGFuX3N1c3BlbmQodm9pZCk7Cit2b2lkIGhkZF91bnJlZ2lzdGVyX21jYXN0X2JjYXN0X2ZpbHRlcihoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKK3ZvaWQgaGRkX3JlZ2lzdGVyX21jYXN0X2JjYXN0X2ZpbHRlcihoZGRfY29udGV4dF90ICpwSGRkQ3R4KTsKKyNlbmRpZgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKy8vdmFyaWFibGUgdG8gaG9sZCB0aGUgaW5zbW9kIHBhcmFtZXRlcnMKK3N0YXRpYyBpbnQgY29uX21vZGUgPSAwOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfd2RpX3RyYWNlX2VuYWJsZSgpIC0gQ29uZmlndXJlIGluaXRpYWwgV0RJIFRyYWNlIGVuYWJsZQorCisgIENhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2ZnLmluaSBpcyByZWFkIGluIG9yZGVyIHRvIGNvbmZpZ3VyZQorICB0aGUgZGVzaXJlZCB0cmFjZSBsZXZlbHMgaW4gdGhlIFdESS4KKworICBccGFyYW0gIC0gbW9kdWxlSWQgLSBtb2R1bGUgd2hvc2UgdHJhY2UgbGV2ZWwgaXMgYmVpbmcgY29uZmlndXJlZAorICBccGFyYW0gIC0gYml0bWFzayAtIGJpdG1hc2sgb2YgbG9nIGxldmVscyB0byBiZSBlbmFibGVkCisKKyAgXHJldHVybiAtIHZvaWQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBoZGRfd2RpX3RyYWNlX2VuYWJsZSh3cHRfbW9kdWxlaWQgbW9kdWxlSWQsIHZfVTMyX3QgYml0bWFzaykKK3sKKyAgIHdwdF90cmFjZWxldmVsIGxldmVsOworCisgICAvKiBpZiB0aGUgYml0bWFzayBpcyB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhlbiBhIGJpdG1hc2sgd2FzIG5vdAorICAgICAgc3BlY2lmaWVkIGluIGNmZy5pbmksIHNvIGxlYXZlIHRoZSBsb2dnaW5nIGxldmVsIGFsb25lIChpdAorICAgICAgd2lsbCByZW1haW4gYXQgdGhlICJjb21waWxlZCBpbiIgZGVmYXVsdCB2YWx1ZSkgKi8KKyAgIGlmIChDRkdfV0RJX1RSQUNFX0VOQUJMRV9ERUZBVUxUID09IGJpdG1hc2spCisgICB7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIGEgbWFzayB3YXMgc3BlY2lmaWVkLiAgc3RhcnQgYnkgZGlzYWJsaW5nIGFsbCBsb2dnaW5nICovCisgICB3cGFsVHJhY2VTZXRMZXZlbChtb2R1bGVJZCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX05PTkUsIDApOworCisgICAvKiBub3cgY3ljbGUgdGhyb3VnaCB0aGUgYml0bWFzayB1bnRpbCBhbGwgInNldCIgYml0cyBhcmUgc2VydmljZWQgKi8KKyAgIGxldmVsID0gZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMOworICAgd2hpbGUgKDAgIT0gYml0bWFzaykKKyAgIHsKKyAgICAgIGlmIChiaXRtYXNrICYgMSkKKyAgICAgIHsKKyAgICAgICAgIHdwYWxUcmFjZVNldExldmVsKG1vZHVsZUlkLCBsZXZlbCwgMSk7CisgICAgICB9CisgICAgICBsZXZlbCsrOworICAgICAgYml0bWFzayA+Pj0gMTsKKyAgIH0KK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworaW50IGhkZF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICBoZGRfcHJpdl9kYXRhX3QgcHJpdl9kYXRhOworICAgdEFOSV9VOCAqY29tbWFuZCA9IE5VTEw7CisgICBpbnQgcmV0ID0gMDsKKworICAgaWYgKE5VTEwgPT0gcEFkYXB0ZXIpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAiJXM6IEhERCBhZGFwdGVyIGNvbnRleHQgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXQgPSAtRU5PREVWOworICAgICAgZ290byBleGl0OyAKKyAgIH0KKworICAgaWYgKCghaWZyKSAmJiAoIWlmci0+aWZyX2RhdGEpKQorICAgeworICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgZ290byBleGl0OyAKKyAgIH0KKworICAgaWYgKGNvcHlfZnJvbV91c2VyKCZwcml2X2RhdGEsIGlmci0+aWZyX2RhdGEsIHNpemVvZihoZGRfcHJpdl9kYXRhX3QpKSkKKyAgIHsKKyAgICAgICByZXQgPSAtRUZBVUxUOworICAgICAgIGdvdG8gZXhpdDsKKyAgIH0KKworICAgY29tbWFuZCA9IGttYWxsb2MocHJpdl9kYXRhLnRvdGFsX2xlbiwgR0ZQX0tFUk5FTCk7CisgICBpZiAoIWNvbW1hbmQpCisgICB7CisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICByZXQgPSAtRU5PTUVNOworICAgICAgIGdvdG8gZXhpdDsKKyAgIH0KKworICAgaWYgKGNvcHlfZnJvbV91c2VyKGNvbW1hbmQsIHByaXZfZGF0YS5idWYsIHByaXZfZGF0YS50b3RhbF9sZW4pKQorICAgeworICAgICAgIHJldCA9IC1FRkFVTFQ7CisgICAgICAgZ290byBleGl0OworICAgfQorCisgICBpZiAoKFNJT0NERVZQUklWQVRFICsgMSkgPT0gY21kKQorICAgeworICAgICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCopcEFkYXB0ZXItPnBIZGRDdHg7CisKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiKioqUmVjZWl2ZWQgJXMgY21kIGZyb20gV2ktRmkgR1VJKioqIiwgY29tbWFuZCk7CisKKyAgICAgICBpZiAoc3RybmNtcChjb21tYW5kLCAiUDJQX0RFVl9BRERSIiwgMTIpID09IDAgKQorICAgICAgIHsKKyAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihwcml2X2RhdGEuYnVmLCBwSGRkQ3R4LT5wMnBEZXZpY2VBZGRyZXNzLmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgIiVzOiBmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXIgYnVmZmVyXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBpZihzdHJuY21wKHByaXZfZGF0YS5idWYsICJTRVRCQU5EIiwgNykgPT0gMCkKKyAgICAgICB7CisgICAgICAgICAgIHRBTklfVTggKnB0ciA9ICh0QU5JX1U4Kilwcml2X2RhdGEuYnVmIDsKKyAgICAgICAgICAgaW50IHJldCA9IDAgOworICAgICAgICAKKyAgICAgICAgICAgLyogQ2hhbmdlIGJhbmQgcmVxdWVzdCByZWNlaXZlZCAqLworICAgCisgICAgICAgICAgIC8qIEZpcnN0IDggYnl0ZXMgd2lsbCBoYXZlICJTRVRCQU5EICIgYW5kIAorICAgICAgICAgICAgKiA5IGJ5dGUgd2lsbCBoYXZlIGJhbmQgc2V0dGluZyB2YWx1ZSAqLworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBTZXRCYW5kQ29tbWFuZCBJbmZvICBjb21tICVzIFVMICVkLCBUTCAlZCIsIF9fRlVOQ1RJT05fXywgcHJpdl9kYXRhLmJ1ZiwgcHJpdl9kYXRhLnVzZWRfbGVuLCBwcml2X2RhdGEudG90YWxfbGVuKTsKKyAgICAgICAgCisgICAgICAgICAgIC8qIENoYW5nZSBiYW5kIHJlcXVlc3QgcmVjZWl2ZWQgKi8KKyAgICAgICAgICAgcmV0ID0gaGRkX3NldEJhbmRfaGVscGVyKGRldiwgcHRyKTsgICAKKyAgICAgICB9IAorICAgfQorZXhpdDoKKyAgIGlmIChjb21tYW5kKQorICAgeworICAgICAgIGtmcmVlKGNvbW1hbmQpOworICAgfQorICAgcmV0dXJuIHJldDsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIGhkZF9vcGVuKCkgLSBIREQgT3BlbiBmdW5jdGlvbgorCisgIFRoaXMgaXMgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGlmY29uZmlnIHVwCisKKyAgXHBhcmFtICAtIGRldiBQb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaGRkX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKyAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICpwQWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICB2X0JPT0xfdCBpbl9zdGFuZGJ5ID0gVFJVRTsKKworICAgaWYgKE5VTEwgPT0gcEFkYXB0ZXIpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgIiVzOiBIREQgYWRhcHRlciBjb250ZXh0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICB9CisgICAKKyAgIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCopcEFkYXB0ZXItPnBIZGRDdHg7CisgICBpZiAoTlVMTCA9PSBwSGRkQ3R4KQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiAtRU5PREVWOworICAgfQorCisgICBzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIgKCBwSGRkQ3R4LCAmcEFkYXB0ZXJOb2RlICk7CisgICB3aGlsZSAoIChOVUxMICE9IHBBZGFwdGVyTm9kZSkgJiYgKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpICkKKyAgIHsKKyAgICAgICAgaWYoIHBBZGFwdGVyTm9kZS0+cEFkYXB0ZXItPmV2ZW50X2ZsYWdzICYgREVWSUNFX0lGQUNFX09QRU5FRCkKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IGNoaXAgYWxyZWFkeSBvdXQgb2YgIiAKKyAgICAgICAgICAgICAgICAgICJzdGFuZGJ5IiwgX19mdW5jX18sIHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisgICAgICAgICAgICBpbl9zdGFuZGJ5ID0gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyICggcEhkZEN0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQgKTsKKyAgICAgICAgICAgIHBBZGFwdGVyTm9kZSA9IHBOZXh0OworICAgICAgICB9CisgICB9CisgCisgICBpZiAoVFJVRSA9PSBpbl9zdGFuZGJ5KQorICAgeworICAgICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gd2xhbl9oZGRfZXhpdF9sb3dwb3dlcihwSGRkQ3R4LCBwQWRhcHRlcikpCisgICAgICAgeworICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEZhaWxlZCB0byBicmluZyAiIAorICAgICAgICAgICAgICAgICAgICJ3bGFuIG91dCBvZiBwb3dlciBzYXZlIiwgX19mdW5jX18pOworICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICB9CisgICB9CisgICAKKyAgIHBBZGFwdGVyLT5ldmVudF9mbGFncyB8PSBERVZJQ0VfSUZBQ0VfT1BFTkVEOworICAgaWYgKGhkZF9jb25uSXNDb25uZWN0ZWQoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpKSAKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIiVzOiBFbmFibGluZyBUeCBRdWV1ZXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgIC8qIEVuYWJsZSBUWCBxdWV1ZXMgb25seSB3aGVuIHdlIGFyZSBjb25uZWN0ZWQgKi8KKyAgICAgICBuZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKGRldik7CisgICB9CisKKyAgIHJldHVybiAwOworfQorCitpbnQgaGRkX21vbl9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKworICAgaWYocEFkYXB0ZXIgPT0gTlVMTCkgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgIiVzOiBIREQgYWRhcHRlciBjb250ZXh0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgICByZXR1cm4gMDsKK30KKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfc3RvcCgpIC0gSEREIHN0b3AgZnVuY3Rpb24KKworICBUaGlzIGlzIGNhbGxlZCBpbiByZXNwb25zZSB0byBpZmNvbmZpZyBkb3duCisKKyAgXHBhcmFtICAtIGRldiBQb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3Mgbm9uLXplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBoZGRfc3RvcCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4OworICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgIHZfQk9PTF90IGVudGVyX3N0YW5kYnkgPSBUUlVFOworICAgCisgICBFTlRFUigpOworCisgICBpZiAoTlVMTCA9PSBwQWRhcHRlcikKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICIlczogSEREIGFkYXB0ZXIgY29udGV4dCBpcyBOdWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiAtRU5PREVWOworICAgfQorCisgICBwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QqKXBBZGFwdGVyLT5wSGRkQ3R4OworICAgaWYgKE5VTEwgPT0gcEhkZEN0eCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICIlczogSEREIGNvbnRleHQgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgIH0KKworICAgcEFkYXB0ZXItPmV2ZW50X2ZsYWdzICY9IH4oREVWSUNFX0lGQUNFX09QRU5FRCk7CisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogRGlzYWJsaW5nIE9TIFR4IHF1ZXVlcyIsIF9fZnVuY19fKTsKKyAgIG5ldGlmX3R4X2Rpc2FibGUocEFkYXB0ZXItPmRldik7CisgICBuZXRpZl9jYXJyaWVyX29mZihwQWRhcHRlci0+ZGV2KTsKKworCisgICAvKiBTb2Z0QVAgaWZhY2VzIHNob3VsZCBuZXZlciBnbyBpbiBwb3dlciBzYXZlIG1vZGUKKyAgICAgIG1ha2luZyBzdXJlIHNhbWUgaGVyZS4gKi8KKyAgIGlmICggKFdMQU5fSEREX1NPRlRBUCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorICAgICAgICAgICAgICAgICB8fCAoV0xBTl9IRERfTU9OSVRPUiA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgICAgICAgfHwgKFdMQU5fSEREX1AyUF9HTyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorI2VuZGlmCisgICAgICApCisgICB7CisgICAgICAvKiBTb2Z0QVAgbW9kZSwgc28gcmV0dXJuIGZyb20gaGVyZSAqLworICAgICAgRVhJVCgpOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIC8qIEZpbmQgaWYgYW55IGlmYWNlIGlzIHVwIHRoZW4KKyAgICAgIGlmIGFueSBpZmFjZSBpcyB1cCB0aGVuIGNhbid0IHB1dCBkZXZpY2UgdG8gc2xlZXAvIHBvd2VyIHNhdmUgbW9kZS4gKi8KKyAgIHN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlciAoIHBIZGRDdHgsICZwQWRhcHRlck5vZGUgKTsKKyAgIHdoaWxlICggKE5VTEwgIT0gcEFkYXB0ZXJOb2RlKSAmJiAoVk9TX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgKQorICAgeworICAgICAgICBpZiAoIHBBZGFwdGVyTm9kZS0+cEFkYXB0ZXItPmV2ZW50X2ZsYWdzICYgREVWSUNFX0lGQUNFX09QRU5FRCkKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFN0aWxsIG90aGVyIGlmYWNlcyBhcmUgdXAgY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICAicHV0IGRldmljZSB0byBzbGVlcCIsIF9fZnVuY19fLCBwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworICAgICAgICAgICAgZW50ZXJfc3RhbmRieSA9IEZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IAorICAgICAgICAgICAgc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIgKCBwSGRkQ3R4LCBwQWRhcHRlck5vZGUsICZwTmV4dCApOworICAgICAgICAgICAgcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisgICAgICAgIH0KKyAgIH0KKworICAgaWYgKFRSVUUgPT0gZW50ZXJfc3RhbmRieSkKKyAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogQWxsIEludGVyZmFjZXMgYXJlIERvd24gIiAKKyAgICAgICAgICAgICAgICAgImVudGVyaW5nIHN0YW5kYnkiLCBfX2Z1bmNfXyk7CisgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB3bGFuX2hkZF9lbnRlcl9sb3dwb3dlcihwSGRkQ3R4KSkKKyAgICAgICB7CisgICAgICAgICAgIC8qbG9nIGFuZCByZXR1cm4gc3VjY2VzcyovCisgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogRmFpbGVkIHRvIHB1dCAiCisgICAgICAgICAgICAgICAgICAgIndsYW4gaW4gcG93ZXIgc2F2ZSIsIF9fZnVuY19fKTsKKyAgICAgICB9CisgICB9CisgICAKKyAgIEVYSVQoKTsKKyAgIHJldHVybiAwOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgaGRkX3VuaW5pdCgpIC0gSEREIHVuaW5pdCBmdW5jdGlvbgorCisgIFRoaXMgaXMgY2FsbGVkIGR1cmluZyB0aGUgbmV0ZGV2IHVucmVnaXN0ZXIgdG8gdW5pbml0aWFsaXplIGFsbCBkYXRhCithc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZQorCisgIFxwYXJhbSAgLSBkZXYgUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorCisgIFxyZXR1cm4gLSB2b2lkCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgaGRkX3VuaW5pdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisKKyAgIEVOVEVSKCk7CisKKyAgIGRvCisgICB7CisgICAgICBpZiAoTlVMTCA9PSBwQWRhcHRlcikKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBOVUxMIHBBZGFwdGVyIiwgX19mdW5jX18pOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChXTEFOX0hERF9BREFQVEVSX01BR0lDICE9IHBBZGFwdGVyLT5tYWdpYykKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIG1hZ2ljIiwgX19mdW5jX18pOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChOVUxMID09IHBBZGFwdGVyLT5wSGRkQ3R4KQorICAgICAgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiJXM6IE5VTEwgcEhkZEN0eCIsIF9fZnVuY19fKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZGV2ICE9IHBBZGFwdGVyLT5kZXYpCisgICAgICB7CisgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBkZXZpY2UgcmVmZXJlbmNlIiwgX19mdW5jX18pOworICAgICAgICAgLyogd2UgaGF2ZW4ndCB2YWxpZGF0ZWQgYWxsIGNhc2VzIHNvIGxldCB0aGlzIGdvIGZvciBub3cgKi8KKyAgICAgIH0KKworICAgICAgaGRkX2RlaW5pdF9hZGFwdGVyKHBBZGFwdGVyLT5wSGRkQ3R4LCBwQWRhcHRlcik7CisKKyAgICAgIC8qIGFmdGVyIHVuaW5pdCBvdXIgYWRhcHRlciBzdHJ1Y3R1cmUgd2lsbCBubyBsb25nZXIgYmUgdmFsaWQgKi8KKyAgICAgIHBBZGFwdGVyLT5kZXYgPSBOVUxMOworICAgICAgcEFkYXB0ZXItPm1hZ2ljID0gMDsKKyAgIH0gd2hpbGUgKDApOworCisgICBFWElUKCk7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfcmVsZWFzZV9maXJtd2FyZSgpIC0KKworICAgVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgcmVsZWFzZSBmaXJtd2FyZSBBUEkgdG8gZnJlZSB0aGUgZmlybXdhcmUgYnVmZmVyLgorCisgIFxwYXJhbSAgLSBwRmlsZU5hbWUgUG9pbnRlciB0byB0aGUgRmlsZSBOYW1lLgorICAgICAgICAgICAgICAgICAgcEN0eCAtIFBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgLgorCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWT1NfU1RBVFVTIGhkZF9yZWxlYXNlX2Zpcm13YXJlKGNoYXIgKnBGaWxlTmFtZSx2X1ZPSURfdCAqcEN0eCkKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90KilwQ3R4OworICAgRU5URVIoKTsKKworCisgICBpZiAoIXN0cmNtcChXTEFOX0ZXX0ZJTEUsIHBGaWxlTmFtZSkpIHsKKyAgIAorICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCIlczogTG9hZGVkIGZpcm13YXJlIGZpbGUgaXMgJXMiLF9fZnVuY19fLHBGaWxlTmFtZSk7CisKKyAgICAgICBpZihwSGRkQ3R4LT5mdykgeworICAgICAgICAgIHJlbGVhc2VfZmlybXdhcmUocEhkZEN0eC0+ZncpOworICAgICAgICAgIHBIZGRDdHgtPmZ3ID0gTlVMTDsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgZWxzZSBpZiAoIXN0cmNtcChXTEFOX05WX0ZJTEUscEZpbGVOYW1lKSkgeworICAgICAgIGlmKHBIZGRDdHgtPm52KSB7CisgICAgICAgICAgcmVsZWFzZV9maXJtd2FyZShwSGRkQ3R4LT5udik7CisgICAgICAgICAgcEhkZEN0eC0+bnYgPSBOVUxMOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisKKyAgIH0KKworICAgRVhJVCgpOworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIGhkZF9yZXF1ZXN0X2Zpcm13YXJlKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBmaXJtd2FyZSBmaWxlIHVzaW5nIHRoZSByZXF1ZXN0IGZpcm13YXJlCisgICBBUEkgYW5kIHJldHVybnMgdGhlIHRoZSBmaXJtd2FyZSBkYXRhIGFuZCB0aGUgZmlybXdhcmUgZmlsZSBzaXplLgorCisgIFxwYXJhbSAgLSBwZmlsZU5hbWUgLSBQb2ludGVyIHRvIHRoZSBmaWxlIG5hbWUuCisgICAgICAgICAgICAgIC0gcEN0eCAtIFBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgLgorICAgICAgICAgICAgICAtIHBwZndfZGF0YSAtIFBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgb2YgdGhlIGZpcm13YXJlIGRhdGEuCisgICAgICAgICAgICAgIC0gcFNpemUgLSBQb2ludGVyIHRvIHRoZSBmaWxlIHNpemUuCisKKyAgXHJldHVybiAtIFZPU19TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcywgVk9TX1NUQVRVU19FX0ZBSUxVUkUgZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworVk9TX1NUQVRVUyBoZGRfcmVxdWVzdF9maXJtd2FyZShjaGFyICpwZmlsZU5hbWUsdl9WT0lEX3QgKnBDdHgsdl9WT0lEX3QgKipwcGZ3X2RhdGEsIHZfU0laRV90ICpwU2l6ZSkKK3sKKyAgIGludCBzdGF0dXM7CisgICBWT1NfU1RBVFVTIHJldHZhbCA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCopcEN0eDsKKyAgIEVOVEVSKCk7CisKKyAgIGlmKCAoIXN0cmNtcChXTEFOX0ZXX0ZJTEUsIHBmaWxlTmFtZSkpICkgeworCisgICAgICAgc3RhdHVzID0gcmVxdWVzdF9maXJtd2FyZSgmcEhkZEN0eC0+ZncsIHBmaWxlTmFtZSwgcEhkZEN0eC0+cGFyZW50X2Rldik7CisKKyAgICAgICBpZihzdGF0dXMgfHwgIXBIZGRDdHgtPmZ3IHx8ICFwSGRkQ3R4LT5mdy0+ZGF0YSkgeworICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IEZpcm13YXJlICVzIGRvd25sb2FkIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGZpbGVOYW1lKTsKKyAgICAgICAgICAgcmV0dmFsID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgfQorCisgICAgICAgZWxzZSB7CisgICAgICAgICAqcHBmd19kYXRhID0gKHZfVk9JRF90ICopcEhkZEN0eC0+ZnctPmRhdGE7CisgICAgICAgICAqcFNpemUgPSBwSGRkQ3R4LT5mdy0+c2l6ZTsKKyAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogRmlybXdhcmUgc2l6ZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwU2l6ZSk7CisgICAgICAgfQorICAgfQorICAgZWxzZSBpZighc3RyY21wKFdMQU5fTlZfRklMRSwgcGZpbGVOYW1lKSkgeworCisgICAgICAgc3RhdHVzID0gcmVxdWVzdF9maXJtd2FyZSgmcEhkZEN0eC0+bnYsIHBmaWxlTmFtZSwgcEhkZEN0eC0+cGFyZW50X2Rldik7CisKKyAgICAgICBpZihzdGF0dXMgfHwgIXBIZGRDdHgtPm52IHx8ICFwSGRkQ3R4LT5udi0+ZGF0YSkgeworICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IG52ICVzIGRvd25sb2FkIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGZpbGVOYW1lKTsKKyAgICAgICAgICAgcmV0dmFsID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgfQorCisgICAgICAgZWxzZSB7CisgICAgICAgICAqcHBmd19kYXRhID0gKHZfVk9JRF90ICopcEhkZEN0eC0+bnYtPmRhdGE7CisgICAgICAgICAqcFNpemUgPSBwSGRkQ3R4LT5udi0+c2l6ZTsKKyAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogbnYgZmlsZSBzaXplID0gJWQiLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKnBTaXplKTsKKyAgICAgICB9CisgICB9CisKKyAgIEVYSVQoKTsKKyAgIHJldHVybiByZXR2YWw7Cit9CisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgXGJyaWVmIGhkZF9mdWxsX3B3cl9jYmsoKSAtIEhERCBmdWxsIHBvd2VyIGNhbGxiYWNrZnVuY3Rpb24KKworICAgICAgVGhpcyBpcyB0aGUgZnVuY3Rpb24gaW52b2tlZCBieSBTTUUgdG8gaW5mb3JtIHRoZSByZXN1bHQgb2YgYSBmdWxsIHBvd2VyCisgICAgICByZXF1ZXN0IGlzc3VlZCBieSBIREQKKworICAgICBccGFyYW0gIC0gY2FsbGJhY2tjb250ZXh0IC0gUG9pbnRlciB0byBjb29raWUKKyAgICAgICAgICAgICAgIHN0YXR1cyAtIHJlc3VsdCBvZiByZXF1ZXN0CisKKyAgICAgXHJldHVybiAtIE5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBoZGRfZnVsbF9wd3JfY2JrKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpCit7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QqKWNhbGxiYWNrQ29udGV4dDsKKworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSEREIGZ1bGwgUG93ZXIgY2FsbGJhY2sgc3RhdHVzID0gJWQiLCBzdGF0dXMpOworICAgaWYoJnBIZGRDdHgtPmZ1bGxfcHdyX2NvbXBfdmFyKQorICAgeworICAgICAgY29tcGxldGUoJnBIZGRDdHgtPmZ1bGxfcHdyX2NvbXBfdmFyKTsKKyAgIH0KK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcYnJpZWYgaGRkX3JlcV9ibXBzX2NiaygpIC0gSEREIFJlcXVlc3QgQk1QUyBjYWxsYmFjayBmdW5jdGlvbgorCisgICAgIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIGludm9rZWQgYnkgU01FIHRvIGluZm9ybSB0aGUgcmVzdWx0IG9mIEJNUFMKKyAgICAgcmVxdWVzdCBpc3N1ZWQgYnkgSERECisKKyAgICBccGFyYW0gIC0gY2FsbGJhY2tjb250ZXh0IC0gUG9pbnRlciB0byBjb29raWUKKyAgICAgICAgICAgICAgIHN0YXR1cyAtIHJlc3VsdCBvZiByZXF1ZXN0CisKKyAgICBccmV0dXJuIC0gTm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGhkZF9yZXFfYm1wc19jYmsodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cykKK3sKKworICAgc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRpb25fdmFyID0gKHN0cnVjdCBjb21wbGV0aW9uKikgY2FsbGJhY2tDb250ZXh0OworCisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiSEREIEJNUFMgcmVxdWVzdCBDYWxsYmFjaywgc3RhdHVzID0gJWRcbiIsIHN0YXR1cyk7CisgICBpZihjb21wbGV0aW9uX3ZhciAhPSBOVUxMKQorICAgeworICAgICAgY29tcGxldGUoY29tcGxldGlvbl92YXIpOworICAgfQorfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgaGRkX2dldF9jZmdfZmlsZV9zaXplKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdXNpbmcgdGhlIHJlcXVlc3QgZmlybXdhcmUKKyAgIEFQSSBhbmQgcmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHNpemUuCisKKyAgXHBhcmFtICAtIHBDdHggLSBQb2ludGVyIHRvIHRoZSBhZGFwdGVyIC4KKyAgICAgICAgICAgICAgLSBwRmlsZU5hbWUgLSBQb2ludGVyIHRvIHRoZSBmaWxlIG5hbWUuCisgICAgICAgICAgICAgIC0gcEJ1ZlNpemUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgc2l6ZS4KKworICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZPU19TVEFUVVMgaGRkX2dldF9jZmdfZmlsZV9zaXplKHZfVk9JRF90ICpwQ3R4LCBjaGFyICpwRmlsZU5hbWUsIHZfU0laRV90ICpwQnVmU2l6ZSkKK3sKKyAgIGludCBzdGF0dXM7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QqKXBDdHg7CisKKyAgIEVOVEVSKCk7CisKKyAgIHN0YXR1cyA9IHJlcXVlc3RfZmlybXdhcmUoJnBIZGRDdHgtPmZ3LCBwRmlsZU5hbWUsIHBIZGRDdHgtPnBhcmVudF9kZXYpOworCisgICBpZihzdGF0dXMgfHwgIXBIZGRDdHgtPmZ3IHx8ICFwSGRkQ3R4LT5mdy0+ZGF0YSkgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IENGRyBkb3dubG9hZCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgZWxzZSB7CisgICAgICAqcEJ1ZlNpemUgPSBwSGRkQ3R4LT5mdy0+c2l6ZTsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBDRkcgc2l6ZSA9ICVkIiwgX19mdW5jX18sICpwQnVmU2l6ZSk7CisgICAgICByZWxlYXNlX2Zpcm13YXJlKHBIZGRDdHgtPmZ3KTsKKyAgICAgIHBIZGRDdHgtPmZ3ID0gTlVMTDsKKyAgIH0KKworICAgRVhJVCgpOworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIGhkZF9yZWFkX2NmZ19maWxlKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdXNpbmcgdGhlIHJlcXVlc3QgZmlybXdhcmUKKyAgIEFQSSBhbmQgcmV0dXJucyB0aGUgY2ZnIGRhdGEgYW5kIHRoZSBidWZmZXIgc2l6ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorCisgIFxwYXJhbSAgLSBwQ3R4IC0gUG9pbnRlciB0byB0aGUgYWRhcHRlciAuCisgICAgICAgICAgICAgIC0gcEZpbGVOYW1lIC0gUG9pbnRlciB0byB0aGUgZmlsZSBuYW1lLgorICAgICAgICAgICAgICAtIHBCdWZmZXIgLSBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlci4KKyAgICAgICAgICAgICAgLSBwQnVmU2l6ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBzaXplLgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVk9TX1NUQVRVUyBoZGRfcmVhZF9jZmdfZmlsZSh2X1ZPSURfdCAqcEN0eCwgY2hhciAqcEZpbGVOYW1lLAorICAgIHZfVk9JRF90ICpwQnVmZmVyLCB2X1NJWkVfdCAqcEJ1ZlNpemUpCit7CisgICBpbnQgc3RhdHVzOworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90KilwQ3R4OworCisgICBFTlRFUigpOworCisgICBzdGF0dXMgPSByZXF1ZXN0X2Zpcm13YXJlKCZwSGRkQ3R4LT5mdywgcEZpbGVOYW1lLCBwSGRkQ3R4LT5wYXJlbnRfZGV2KTsKKworICAgaWYoc3RhdHVzIHx8ICFwSGRkQ3R4LT5mdyB8fCAhcEhkZEN0eC0+ZnctPmRhdGEpIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBDRkcgZG93bmxvYWQgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICBlbHNlIHsKKyAgICAgIGlmKCpwQnVmU2l6ZSAhPSBwSGRkQ3R4LT5mdy0+c2l6ZSkgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBDYWxsZXIgc2V0cyBpbnZhbGlkIENGRyAiCisgICAgICAgICAgICAgImZpbGUgc2l6ZSIsIF9fZnVuY19fKTsKKyAgICAgICAgIHJlbGVhc2VfZmlybXdhcmUocEhkZEN0eC0+ZncpOworICAgICAgICAgcEhkZEN0eC0+ZncgPSBOVUxMOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgIGlmKHBCdWZmZXIpIHsKKyAgICAgICAgICAgIHZvc19tZW1fY29weShwQnVmZmVyLHBIZGRDdHgtPmZ3LT5kYXRhLCpwQnVmU2l6ZSk7CisgICAgICAgICB9CisgICAgICAgICByZWxlYXNlX2Zpcm13YXJlKHBIZGRDdHgtPmZ3KTsKKyAgICAgICAgIHBIZGRDdHgtPmZ3ID0gTlVMTDsKKyAgICAgICAgfQorICAgfQorCisgICBFWElUKCk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfc2V0X21hY19hZGRyX2NiKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHNldHRpbmcgdGhlIHN0YXRpb24KKyAgIG1hYyBhZHJyZXNzIGNhbGxlZCBieSBjY20gbW9kdWxlIHRvIGluZGljYXRlIHRoZQorICAgc3VjY2Vzcy9mYWlsdXJlIHJlc3VsdC4KKworICBccGFyYW0gIC0gaEhhbCAtIFBvaW50ZXIgdG8gdGhlIGhhbCBtb2R1bGUuCisgICAgICAgICAgICAgIC0gcmVzdWx0IC0gcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzZXQgbWFjIGFkZHJlc3MuCisKKyAgXHJldHVybiAtIHZvaWQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworc3RhdGljIHZvaWQgaGRkX3NldF9tYWNfYWRkcl9jYiggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1MzMiByZXN1bHQgKQoreworICAvLyBpZ25vcmUgdGhlIFNUQV9JRCByZXNwb25zZSBmb3Igbm93LgorCisgIFZPU19BU1NFUlQoIENDTV9JU19SRVNVTFRfU1VDQ0VTUyggcmVzdWx0ICkgKTsKK30KKyNlbmRpZgorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfc2V0X21hY19hZGRyZXNzKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1hYyBhZGRyZXNzIHVzaW5nCisgICB0aGUgY29tbWFuZCBpZmNvbmZpZyB3bGFuWCBodyBldGhlciA8bWFjIGFkcmVzcz4uCisKKyAgXHBhcmFtICAtIGRldiAtIFBvaW50ZXIgdG8gdGhlIG5ldCBkZXZpY2UuCisgICAgICAgICAgICAgIC0gYWRkciAtIFBvaW50ZXIgdG8gdGhlIHNvY2thZGRyLgorICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgaGRkX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgIHN0cnVjdCBzb2NrYWRkciAqcHN0YV9tYWNfYWRkciA9IGFkZHI7CisgICBlSGFsU3RhdHVzIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIEVOVEVSKCk7CisKKyAgIG1lbWNweSgmcEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LCBwc3RhX21hY19hZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisKKyNpZmRlZiBIRERfU0VTU0lPTklaRSAKKyAgIC8vIHNldCB0aGUgTUFDIGFkZHJlc3MgdGhvdWdoIHRoZSBTVEEgSUQgQ0ZHLgorICAgaGFsU3RhdHVzID0gY2NtQ2ZnU2V0U3RyKCBwQWRhcHRlci0+aEhhbCwgV05JX0NGR19TVEFfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1U4X3QgKikmcEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHBBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfc2V0X21hY19hZGRyX2NiLCBWT1NfRkFMU0UgKTsKKyNlbmRpZgorCisgICBtZW1jcHkoZGV2LT5kZXZfYWRkciwgcHN0YV9tYWNfYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCisgICBFWElUKCk7CisgICByZXR1cm4gaGFsU3RhdHVzOworfQorCit0QU5JX1U4KiB3bGFuX2hkZF9nZXRfaW50Zl9hZGRyKGhkZF9jb250ZXh0X3QqIHBIZGRDdHgpCit7CisgICBpbnQgaTsKKyAgIGZvciAoIGkgPSAwOyBpIDwgVk9TX01BWF9DT05DVVJSRU5DWV9QRVJTT05BOyBpKyspCisgICB7CisgICAgICBpZiggMCA9PSAocEhkZEN0eC0+Y2ZnX2luaS0+aW50ZkFkZHJNYXNrID4+IGkpKQorICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIGlmKCBWT1NfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkEgPT0gaSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICBwSGRkQ3R4LT5jZmdfaW5pLT5pbnRmQWRkck1hc2sgfD0gKDEgPDwgaSk7CisgICByZXR1cm4gJnBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyW2ldLmJ5dGVzWzBdOworfQorCit2b2lkIHdsYW5faGRkX3JlbGVhc2VfaW50Zl9hZGRyKGhkZF9jb250ZXh0X3QqIHBIZGRDdHgsIHRBTklfVTgqIHJlbGVhc2VBZGRyKQoreworICAgaW50IGk7CisgICBmb3IgKCBpID0gMDsgaSA8IFZPU19NQVhfQ09OQ1VSUkVOQ1lfUEVSU09OQTsgaSsrKQorICAgeworICAgICAgaWYgKCAhbWVtY21wKHJlbGVhc2VBZGRyLCAmcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbaV0uYnl0ZXNbMF0sIDYpICkKKyAgICAgIHsKKyAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPmludGZBZGRyTWFzayAmPSB+KDEgPDwgaSk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0gCisgICB9CisgICByZXR1cm47Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDI5KSkKKyAgc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyB3bGFuX2Rydl9vcHMgPSB7CisgICAgICAubmRvX29wZW4gPSBoZGRfb3BlbiwKKyAgICAgIC5uZG9fc3RvcCA9IGhkZF9zdG9wLAorICAgICAgLm5kb191bmluaXQgPSBoZGRfdW5pbml0LAorICAgICAgLm5kb19zdGFydF94bWl0ID0gaGRkX2hhcmRfc3RhcnRfeG1pdCwKKyAgICAgIC5uZG9fdHhfdGltZW91dCA9IGhkZF90eF90aW1lb3V0LAorICAgICAgLm5kb19nZXRfc3RhdHMgPSBoZGRfc3RhdHMsCisgICAgICAubmRvX2RvX2lvY3RsID0gaGRkX2lvY3RsLAorICAgICAgLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBoZGRfc2V0X21hY19hZGRyZXNzLAorICAgICAgLm5kb19zZWxlY3RfcXVldWUgICAgPSBoZGRfc2VsZWN0X3F1ZXVlLAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDMsMSwwKSkKKyAgICAgIC5uZG9fc2V0X3J4X21vZGUgPSBoZGRfc2V0X211bHRpY2FzdF9saXN0LAorI2Vsc2UKKyAgICAgIC5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gaGRkX3NldF9tdWx0aWNhc3RfbGlzdCwKKyNlbmRpZiAvL0xJTlVYX1ZFUlNJT05fQ09ERQorI2VuZGlmCisgfTsKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEgICAKKyBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHdsYW5fbW9uX2Rydl9vcHMgPSB7CisgICAgICAubmRvX29wZW4gPSBoZGRfbW9uX29wZW4sCisgICAgICAubmRvX3N0b3AgPSBoZGRfc3RvcCwKKyAgICAgIC5uZG9fdW5pbml0ID0gaGRkX3VuaW5pdCwKKyAgICAgIC5uZG9fc3RhcnRfeG1pdCA9IGhkZF9tb25faGFyZF9zdGFydF94bWl0LCAgCisgICAgICAubmRvX3R4X3RpbWVvdXQgPSBoZGRfdHhfdGltZW91dCwKKyAgICAgIC5uZG9fZ2V0X3N0YXRzID0gaGRkX3N0YXRzLAorICAgICAgLm5kb19kb19pb2N0bCA9IGhkZF9pb2N0bCwKKyAgICAgIC5uZG9fc2V0X21hY19hZGRyZXNzID0gaGRkX3NldF9tYWNfYWRkcmVzcywKKyB9OworI2VuZGlmCisKKyNlbmRpZgorCit2b2lkIGhkZF9zZXRfc3RhdGlvbl9vcHMoIHN0cnVjdCBuZXRfZGV2aWNlICpwV2xhbkRldiApCit7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwyOSkpCisgICAgICBwV2xhbkRldi0+dHhfcXVldWVfbGVuID0gTkVUX0RFVl9UWF9RVUVVRV9MRU4sCisgICAgICBwV2xhbkRldi0+bmV0ZGV2X29wcyA9ICZ3bGFuX2Rydl9vcHM7CisjZWxzZQorICAgICAgcFdsYW5EZXYtPm9wZW4gPSBoZGRfb3BlbjsKKyAgICAgIHBXbGFuRGV2LT5zdG9wID0gaGRkX3N0b3A7CisgICAgICBwV2xhbkRldi0+dW5pbml0ID0gaGRkX3VuaW5pdDsKKyAgICAgIHBXbGFuRGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBOVUxMOworICAgICAgcFdsYW5EZXYtPnR4X3RpbWVvdXQgPSBoZGRfdHhfdGltZW91dDsKKyAgICAgIHBXbGFuRGV2LT5nZXRfc3RhdHMgPSBoZGRfc3RhdHM7CisgICAgICBwV2xhbkRldi0+ZG9faW9jdGwgPSBoZGRfaW9jdGw7CisgICAgICBwV2xhbkRldi0+dHhfcXVldWVfbGVuID0gTkVUX0RFVl9UWF9RVUVVRV9MRU47CisgICAgICBwV2xhbkRldi0+c2V0X21hY19hZGRyZXNzID0gaGRkX3NldF9tYWNfYWRkcmVzczsKKyNlbmRpZgorfQorCitoZGRfYWRhcHRlcl90KiBoZGRfYWxsb2Nfc3RhdGlvbl9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0U2lyTWFjQWRkciBtYWNBZGRyLCBjaGFyKiBuYW1lICkKK3sKKyAgIHN0cnVjdCBuZXRfZGV2aWNlICpwV2xhbkRldiA9IE5VTEw7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAvKgorICAgICogY2ZnODAyMTEgaW5pdGlhbGl6YXRpb24gYW5kIHJlZ2lzdHJhdGlvbi4uLi4KKyAgICAqLyAKKyAgIHBXbGFuRGV2ID0gYWxsb2NfbmV0ZGV2X21xKHNpemVvZiggaGRkX2FkYXB0ZXJfdCApLCBuYW1lLCBldGhlcl9zZXR1cCwgTlVNX1RYX1FVRVVFUyk7CisgICAKKyNlbHNlICAgICAgCisgICAvL0FsbG9jYXRlIHRoZSBuZXRfZGV2aWNlIGFuZCBwcml2YXRlIGRhdGEgKHN0YXRpb24gY3R4KSAKKyAgIHBXbGFuRGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKCBoZGRfYWRhcHRlcl90ICksIE5VTV9UWF9RVUVVRVMpOworCisjZW5kaWYKKworICAgaWYocFdsYW5EZXYgIT0gTlVMTCkKKyAgIHsKKworICAgICAgLy9TYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlIGluIHRoZSBIREQgYWRhcHRlcgorICAgICAgcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCopIG5ldGRldl9wcml2KCBwV2xhbkRldiApOworCisjaWZuZGVmIENPTkZJR19DRkc4MDIxMQorICAgICAgLy9Jbml0IHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICAgICAgZXRoZXJfc2V0dXAocFdsYW5EZXYpOworI2VuZGlmCisKKyAgICAgIHZvc19tZW1femVybyggcEFkYXB0ZXIsIHNpemVvZiggaGRkX2FkYXB0ZXJfdCApICk7CisKKyAgICAgIHBBZGFwdGVyLT5kZXYgPSBwV2xhbkRldjsKKyAgICAgIHBBZGFwdGVyLT5wSGRkQ3R4ID0gcEhkZEN0eDsgCisgICAgICBwQWRhcHRlci0+bWFnaWMgPSBXTEFOX0hERF9BREFQVEVSX01BR0lDOworCisgICAgICBpbml0X2NvbXBsZXRpb24oJnBBZGFwdGVyLT5zZXNzaW9uX29wZW5fY29tcF92YXIpOworICAgICAgaW5pdF9jb21wbGV0aW9uKCZwQWRhcHRlci0+c2Vzc2lvbl9jbG9zZV9jb21wX3Zhcik7CisgICAgICBpbml0X2NvbXBsZXRpb24oJnBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKyAgICAgIGluaXRfY29tcGxldGlvbigmcEFkYXB0ZXItPmxpbmt1cF9ldmVudF92YXIpOworICAgICAgaW5pdF9jb21wbGV0aW9uKCZwQWRhcHRlci0+Y2FuY2VsX3JlbV9vbl9jaGFuX3Zhcik7CisgICAgICBpbml0X2NvbXBsZXRpb24oJnBBZGFwdGVyLT5yZW1fb25fY2hhbl9yZWFkeV9ldmVudCk7CisgICAgICBpbml0X2NvbXBsZXRpb24oJnBBZGFwdGVyLT5hYm9ydHNjYW5fZXZlbnRfdmFyKTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCisgICAgICBpbml0X2NvbXBsZXRpb24oJnBBZGFwdGVyLT5vZmZjaGFubmVsX3R4X2V2ZW50KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgICAgaW5pdF9jb21wbGV0aW9uKCZwQWRhcHRlci0+dHhfYWN0aW9uX2NuZl9ldmVudCk7CisjZW5kaWYKKyAgICAgIGluaXRfY29tcGxldGlvbigmcEhkZEN0eC0+bWNfc3VzX2V2ZW50X3Zhcik7CisgICAgICBpbml0X2NvbXBsZXRpb24oJnBIZGRDdHgtPnR4X3N1c19ldmVudF92YXIpOworCisgICAgICBpbml0X2NvbXBsZXRpb24oJnBBZGFwdGVyLT5zY2FuX2luZm8uc2Nhbl9yZXFfY29tcGxldGlvbl9ldmVudCk7CisKKyAgICAgIHBBZGFwdGVyLT5pc0xpbmtVcFN2Y05lZWRlZCA9IEZBTFNFOyAKKyAgICAgIHBBZGFwdGVyLT5oaWdoZXJEdGltVHJhbnNpdGlvbiA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgLy9Jbml0IHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICAgICAgc3RybGNweShwV2xhbkRldi0+bmFtZSwgbmFtZSwgSUZOQU1TSVopOworCisgICAgICB2b3NfbWVtX2NvcHkocFdsYW5EZXYtPmRldl9hZGRyLCAodm9pZCAqKW1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgdm9zX21lbV9jb3B5KCBwQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMsIG1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgcFdsYW5EZXYtPndhdGNoZG9nX3RpbWVvID0gSEREX1RYX1RJTUVPVVQ7CisgICAgICBwV2xhbkRldi0+aGFyZF9oZWFkZXJfbGVuICs9IExJQlJBX0hXX05FRURFRF9IRUFEUk9PTTsKKworICAgICAgaGRkX3NldF9zdGF0aW9uX29wcyggcEFkYXB0ZXItPmRldiApOworCisgICAgICBwV2xhbkRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgICAgcFdsYW5EZXYtPmllZWU4MDIxMV9wdHIgPSAmcEFkYXB0ZXItPndkZXYgOworICAgICAgcEFkYXB0ZXItPndkZXYud2lwaHkgPSBwSGRkQ3R4LT53aXBoeTsgIAorICAgICAgcEFkYXB0ZXItPndkZXYubmV0ZGV2ID0gIHBXbGFuRGV2OworI2VuZGlmICAKKyAgICAgIC8qIHNldCBwV2xhbkRldidzIHBhcmVudCB0byB1bmRlcmx5aW5nIGRldmljZSAqLworICAgICAgU0VUX05FVERFVl9ERVYocFdsYW5EZXYsIHBIZGRDdHgtPnBhcmVudF9kZXYpOworICAgfQorCisgICByZXR1cm4gcEFkYXB0ZXI7Cit9CisKK1ZPU19TVEFUVVMgaGRkX3JlZ2lzdGVyX2ludGVyZmFjZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHRBTklfVTggcnRubF9sb2NrX2hlbGQgKQoreworICAgc3RydWN0IG5ldF9kZXZpY2UgKnBXbGFuRGV2ID0gcEFkYXB0ZXItPmRldjsKKyAgIC8vaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSAmcEFkYXB0ZXItPnNlc3Npb25DdHguc3RhdGlvbjsKKyAgIC8vaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgoIHBBZGFwdGVyICk7CisgICAvL2VIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgaWYoIHJ0bmxfbG9ja19oZWxkICkKKyAgIHsKKyAgICAgIGlmIChzdHJjaHIocFdsYW5EZXYtPm5hbWUsICclJykpIHsKKyAgICAgICAgIGlmKCBkZXZfYWxsb2NfbmFtZShwV2xhbkRldiwgcFdsYW5EZXYtPm5hbWUpIDwgMCApCisgICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczpGYWlsZWQ6ZGV2X2FsbG9jX25hbWUiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsgICAgICAgICAgICAKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChyZWdpc3Rlcl9uZXRkZXZpY2UocFdsYW5EZXYpKQorICAgICAgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6RmFpbGVkOnJlZ2lzdGVyX25ldGRldiIsX19mdW5jX18pOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOyAgICAgICAgIAorICAgICAgfQorICAgfQorICAgZWxzZQorICAgeworICAgICAgaWYocmVnaXN0ZXJfbmV0ZGV2KHBXbGFuRGV2KSkKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBGYWlsZWQ6cmVnaXN0ZXJfbmV0ZGV2IixfX2Z1bmNfXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7ICAgICAgICAgCisgICAgICB9CisgICB9CisgICBzZXRfYml0KE5FVF9ERVZJQ0VfUkVHSVNURVJFRCwgJnBBZGFwdGVyLT5ldmVudF9mbGFncyk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2VIYWxTdGF0dXMgaGRkX3NtZUNsb3NlU2Vzc2lvbkNhbGxiYWNrKHZvaWQgKnBDb250ZXh0KQoreworICAgaWYocENvbnRleHQgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGNsZWFyX2JpdChTTUVfU0VTU0lPTl9PUEVORUQsICYoKGhkZF9hZGFwdGVyX3QqKXBDb250ZXh0KS0+ZXZlbnRfZmxhZ3MpOworCisgICAgICAvKiBuZWVkIHRvIG1ha2Ugc3VyZSBhbGwgb2Ygb3VyIHNjaGVkdWxlZCB3b3JrIGhhcyBjb21wbGV0ZWQuCisgICAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBmcm9tIE1DIHRocmVhZCBjb250ZXh0LCBzbyBpdCBpcyBzYWZlIHRvIAorICAgICAgICogdG8gY2FsbCBiZWxvdyBmbHVzaCB3b3JrcXVldWUgQVBJIGZyb20gaGVyZS4gCisgICAgICAgKi8KKyAgICAgIGZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisgICAgICBjb21wbGV0ZSgmKChoZGRfYWRhcHRlcl90KilwQ29udGV4dCktPnNlc3Npb25fY2xvc2VfY29tcF92YXIpOworICAgfQorICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK1ZPU19TVEFUVVMgaGRkX2luaXRfc3RhdGlvbl9tb2RlKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApCit7CisgICBzdHJ1Y3QgbmV0X2RldmljZSAqcFdsYW5EZXYgPSBwQWRhcHRlci0+ZGV2OworICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSAmcEFkYXB0ZXItPnNlc3Npb25DdHguc3RhdGlvbjsKKyAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKCBwQWRhcHRlciApOworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIGludCByYyA9IDA7CisKKyAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+c2Vzc2lvbl9vcGVuX2NvbXBfdmFyKTsKKyAgIC8vT3BlbiBhIFNNRSBzZXNzaW9uIGZvciBmdXR1cmUgb3BlcmF0aW9uCisgICBoYWxTdGF0dXMgPSBzbWVfT3BlblNlc3Npb24oIHBIZGRDdHgtPmhIYWwsIGhkZF9zbWVSb2FtQ2FsbGJhY2ssIHBBZGFwdGVyLAorICAgICAgICAgKHRBTklfVTggKikmcEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LCAmcEFkYXB0ZXItPnNlc3Npb25JZCApOworICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBoYWxTdGF0dXMgKSApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICJzbWVfT3BlblNlc3Npb24oKSBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAlMDhkIFt4JTA4bHhdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxTdGF0dXMsIGhhbFN0YXR1cyApOworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICBnb3RvIGVycm9yX3NtZV9vcGVuOworICAgfQorICAgCisgICAvL0Jsb2NrIG9uIGEgY29tcGxldGlvbiB2YXJpYWJsZS4gQ2FuJ3Qgd2FpdCBmb3JldmVyIHRob3VnaC4KKyAgIHJjID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAmcEFkYXB0ZXItPnNlc3Npb25fb3Blbl9jb21wX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfU0VTU0lPTk9QRU5DTE9TRSkpOworICAgaWYgKCFyYykKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgIlNlc3Npb24gaXMgbm90IG9wZW5lZCB3aXRoaW4gdGltZW91dCBwZXJpb2QgY29kZSAlMDhkIiwgcmMgKTsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgZ290byBlcnJvcl9zbWVfb3BlbjsKKyAgIH0KKworICAgLy8gUmVnaXN0ZXIgd2lyZWxlc3MgZXh0ZW5zaW9ucworICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gIChoYWxTdGF0dXMgPSBoZGRfcmVnaXN0ZXJfd2V4dChwV2xhbkRldikpKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgImhkZF9yZWdpc3Rlcl93ZXh0KCkgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJTA4ZCBbeCUwOGx4XSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxTdGF0dXMsIGhhbFN0YXR1cyApOworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICBnb3RvIGVycm9yX3JlZ2lzdGVyX3dleHQ7CisgICB9CisgICAvL1NhZmUgdG8gcmVnaXN0ZXIgdGhlIGhhcmRfc3RhcnRfeG1pdCBmdW5jdGlvbiBhZ2FpbgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMjkpKQorICAgd2xhbl9kcnZfb3BzLm5kb19zdGFydF94bWl0ID0gaGRkX2hhcmRfc3RhcnRfeG1pdDsKKyNlbHNlCisgICBwV2xhbkRldi0+aGFyZF9zdGFydF94bWl0ID0gaGRkX2hhcmRfc3RhcnRfeG1pdDsKKyNlbmRpZgorCisgICAvL1NldCB0aGUgQ29ubmVjdGlvbiBTdGF0ZSB0byBOb3QgQ29ubmVjdGVkCisgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID0gZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQ7CisKKyAgIC8vU2V0IHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBjaGFubmVsCisgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8ub3BlcmF0aW9uQ2hhbm5lbCA9IHBIZGRDdHgtPmNmZ19pbmktPk9wZXJhdGluZ0NoYW5uZWw7CisKKyAgIC8qIE1ha2UgdGhlIGRlZmF1bHQgQXV0aCBUeXBlIGFzIE9QRU4qLworICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07CisKKyAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gKCBzdGF0dXMgPSBoZGRfaW5pdF90eF9yeCggcEFkYXB0ZXIgKSApICkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAiaGRkX2luaXRfdHhfcngoKSBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAlMDhkIFt4JTA4bHhdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHN0YXR1cyApOworICAgICAgZ290byBlcnJvcl9pbml0X3R4cng7CisgICB9CisKKyAgIHNldF9iaXQoSU5JVF9UWF9SWF9TVUNDRVNTLCAmcEFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKworICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSAoIHN0YXR1cyA9IGhkZF93bW1fYWRhcHRlcl9pbml0KCBwQWRhcHRlciApICkgKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICJoZGRfd21tX2FkYXB0ZXJfaW5pdCgpIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICUwOGQgW3glMDhseF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgc3RhdHVzICk7CisgICAgICBnb3RvIGVycm9yX3dtbV9pbml0OworICAgfQorCisgICBzZXRfYml0KFdNTV9JTklUX0RPTkUsICZwQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworCitlcnJvcl93bW1faW5pdDoKKyAgIGNsZWFyX2JpdChJTklUX1RYX1JYX1NVQ0NFU1MsICZwQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworICAgaGRkX2RlaW5pdF90eF9yeChwQWRhcHRlcik7CitlcnJvcl9pbml0X3R4cng6CisgICBoZGRfVW5yZWdpc3RlcldleHQocFdsYW5EZXYpOworZXJyb3JfcmVnaXN0ZXJfd2V4dDoKKyAgIGlmKHRlc3RfYml0KFNNRV9TRVNTSU9OX09QRU5FRCwgJnBBZGFwdGVyLT5ldmVudF9mbGFncykpCisgICB7CisgICAgICBJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPnNlc3Npb25fY2xvc2VfY29tcF92YXIpOworICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gc21lX0Nsb3NlU2Vzc2lvbiggcEhkZEN0eC0+aEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfc21lQ2xvc2VTZXNzaW9uQ2FsbGJhY2ssIHBBZGFwdGVyICkgKQorICAgICAgeworICAgICAgICAgLy9CbG9jayBvbiBhIGNvbXBsZXRpb24gdmFyaWFibGUuIENhbid0IHdhaXQgZm9yZXZlciB0aG91Z2guCisgICAgICAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZGFwdGVyLT5zZXNzaW9uX2Nsb3NlX2NvbXBfdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9TRVNTSU9OT1BFTkNMT1NFKSk7CisgICAgICB9Cit9CitlcnJvcl9zbWVfb3BlbjoKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisvKioKKyAqIGhkZF9pbml0X3AycF9kZXZpY2VfbW9kZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGhkZF93bGFuX3N0YXJ0dXAgZnVuY3Rpb24gd2hlbiB3bGFuIAorICogZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQuIAorICoKKyAqTE9HSUM6CisgKiBPcGVuIE5ldyBTTUUgc2Vzc2lvbiB3aXRoIFAyUCBEZXZpY2UgTWFjIEFkZHJlc3Mgd2hpY2ggaXMgZGlmZmVyZW50IAorICogZnJvbSBTVEEgTWFjIEFkZHJlc3MgU01FIHNlc3Npb24uIFdoZW4gZHJpdmVyIHJlY2VpdmUgYW55IGZyYW1lIG9uIFNUQSBNYWMgCisgKiBBZGRyZXNzIHRoZW4gd2UgZGl2ZXJ0IGFsbCB0aGUgZnJhbWUgdXNpbmcgUDJQIERldmljZSBNYWMgQWRkcmVzcyBpbnN0YWVkIG9mIAorICogU1RBIE1hYyBhZGRyZXNzLiAKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwQWRhcHRlciAgIFBvaW50ZXIgdG8gcEFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogQHJldHVybiBOb25lCisgKi8KK1ZPU19TVEFUVVMgaGRkX2luaXRfcDJwX2RldmljZV9tb2RlKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKyAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKCBwQWRhcHRlciApOworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIGludCByYyA9IDA7CisKKyAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+c2Vzc2lvbl9vcGVuX2NvbXBfdmFyKTsKKyAgIC8vT3BlbiBhIFNNRSBzZXNzaW9uIGZvciBmdXR1cmUgb3BlcmF0aW9uCisgICBoYWxTdGF0dXMgPSBzbWVfT3BlblNlc3Npb24oIHBIZGRDdHgtPmhIYWwsIGhkZF9zbWVSb2FtQ2FsbGJhY2ssIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgKHRBTklfVTggKikmcEhkZEN0eC0+cDJwRGV2aWNlQWRkcmVzcywgJnBBZGFwdGVyLT5wMnBTZXNzaW9uSWQpOworICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBoYWxTdGF0dXMgKSApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICJzbWVfT3BlblNlc3Npb24oKSBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAlMDhkIFt4JTA4bHhdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxTdGF0dXMsIGhhbFN0YXR1cyApOworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorICAgCisgICAvL0Jsb2NrIG9uIGEgY29tcGxldGlvbiB2YXJpYWJsZS4gQ2FuJ3Qgd2FpdCBmb3JldmVyIHRob3VnaC4KKyAgIHJjID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAmcEFkYXB0ZXItPnNlc3Npb25fb3Blbl9jb21wX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfU0VTU0lPTk9QRU5DTE9TRSkpOworICAgaWYgKCFyYykKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgIlNlc3Npb24gaXMgbm90IG9wZW5lZCB3aXRoaW4gdGltZW91dCBwZXJpb2QgY29kZSAlMDhkIiwgcmMgKTsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCit2b2lkIGhkZF9jbGVhbnVwX2FjdGlvbmZyYW1lKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApCit7CisgICBoZGRfY2ZnODAyMTFfc3RhdGVfdCAqY2ZnU3RhdGU7CisKKyAgIGNmZ1N0YXRlID0gV0xBTl9IRERfR0VUX0NGR19TVEFURV9QVFIoIHBBZGFwdGVyICk7CisKKyAgIGlmKCBOVUxMICE9IGNmZ1N0YXRlLT5idWYgKQorICAgeworICAgICAgaW50IHJjOworICAgICAgSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT50eF9hY3Rpb25fY25mX2V2ZW50KTsKKyAgICAgIHJjID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisgICAgICAgICAgICAgICAgICAgICAmcEFkYXB0ZXItPnR4X2FjdGlvbl9jbmZfZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKEFDVElPTl9GUkFNRV9UWF9USU1FT1VUKSk7CisgICAgICBpZighcmMpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICgiRVJST1I6IEhERCBXYWl0IGZvciBBY3Rpb24gQ29uZmlybWF0aW9uIEZhaWxlZCEhXG4iKSk7CisgICAgICB9CisgICB9CisgICByZXR1cm47Cit9CisjZW5kaWYKKwordm9pZCBoZGRfZGVpbml0X2FkYXB0ZXIoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICkKK3sKKyAgIEVOVEVSKCk7CisgICBzd2l0Y2ggKCBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorICAgeworICAgICAgY2FzZSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OOgorICAgICAgY2FzZSBXTEFOX0hERF9QMlBfQ0xJRU5UOgorICAgICAgeworICAgICAgICAgaWYodGVzdF9iaXQoSU5JVF9UWF9SWF9TVUNDRVNTLCAmcEFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGhkZF9kZWluaXRfdHhfcngoIHBBZGFwdGVyICk7CisgICAgICAgICAgICBjbGVhcl9iaXQoSU5JVF9UWF9SWF9TVUNDRVNTLCAmcEFkYXB0ZXItPmV2ZW50X2ZsYWdzKTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYodGVzdF9iaXQoV01NX0lOSVRfRE9ORSwgJnBBZGFwdGVyLT5ldmVudF9mbGFncykpCisgICAgICAgICB7CisgICAgICAgICAgICBoZGRfd21tX2FkYXB0ZXJfY2xvc2UoIHBBZGFwdGVyICk7CisgICAgICAgICAgICBjbGVhcl9iaXQoV01NX0lOSVRfRE9ORSwgJnBBZGFwdGVyLT5ldmVudF9mbGFncyk7CisgICAgICAgICB9CisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgICAgICAgIGhkZF9jbGVhbnVwX2FjdGlvbmZyYW1lKHBIZGRDdHgsIHBBZGFwdGVyKTsKKyNlbmRpZgorCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXTEFOX0hERF9TT0ZUQVA6CisgICAgICBjYXNlIFdMQU5fSEREX1AyUF9HTzoKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICB7CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAgICAgICBoZGRfY2xlYW51cF9hY3Rpb25mcmFtZShwSGRkQ3R4LCBwQWRhcHRlcik7CisjZW5kaWYKKworICAgICAgICAgaGRkX3VucmVnaXN0ZXJfaG9zdGFwZChwQWRhcHRlcik7CisgICAgICAgICBoZGRfc2V0X2NvbnBhcmFtKCAwICk7CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAgICAgICB3bGFuX2hkZF9zZXRfbW9uaXRvcl90eF9hZGFwdGVyKCBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSwgTlVMTCApOworI2VuZGlmCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXTEFOX0hERF9NT05JVE9SOgorICAgICAgeworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgICAgICAgIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyZm9yVHggPSBwQWRhcHRlci0+c2Vzc2lvbkN0eC5tb25pdG9yLnBBZGFwdGVyRm9yVHg7CisjZW5kaWYKKyAgICAgICAgIGlmKHRlc3RfYml0KElOSVRfVFhfUlhfU1VDQ0VTUywgJnBBZGFwdGVyLT5ldmVudF9mbGFncykpCisgICAgICAgICB7CisgICAgICAgICAgICBoZGRfZGVpbml0X3R4X3J4KCBwQWRhcHRlciApOworICAgICAgICAgICAgY2xlYXJfYml0KElOSVRfVFhfUlhfU1VDQ0VTUywgJnBBZGFwdGVyLT5ldmVudF9mbGFncyk7CisgICAgICAgICB9CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAgICAgICBpZihOVUxMICE9IHBBZGFwdGVyZm9yVHgpCisgICAgICAgICB7CisgICAgICAgICAgICBoZGRfY2xlYW51cF9hY3Rpb25mcmFtZShwSGRkQ3R4LCBwQWRhcHRlcmZvclR4KTsKKyAgICAgICAgIH0KKyNlbmRpZgorI2VuZGlmIC8vV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKworICAgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgfQorCisgICBFWElUKCk7Cit9CisKK3ZvaWQgaGRkX2NsZWFudXBfYWRhcHRlciggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHRBTklfVTggcnRubF9oZWxkICkKK3sKKyAgIHN0cnVjdCBuZXRfZGV2aWNlICpwV2xhbkRldiA9IHBBZGFwdGVyLT5kZXY7CisKKyAgIGlmKHRlc3RfYml0KE5FVF9ERVZJQ0VfUkVHSVNURVJFRCwgJnBBZGFwdGVyLT5ldmVudF9mbGFncykpIHsKKyAgICAgIGlmKCBydG5sX2hlbGQgKQorICAgICAgeworICAgICAgICAgdW5yZWdpc3Rlcl9uZXRkZXZpY2UocFdsYW5EZXYpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgdW5yZWdpc3Rlcl9uZXRkZXYocFdsYW5EZXYpOworICAgICAgfQorICAgICAgLy8gbm90ZSB0aGF0IHRoZSBwQWRhcHRlciBpcyBubyBsb25nZXIgdmFsaWQgYXQgdGhpcyBwb2ludAorICAgICAgLy8gc2luY2UgdGhlIG1lbW9yeSBoYXMgYmVlbiByZWNsYWltZWQKKyAgIH0KKworfQorCitWT1NfU1RBVFVTIGhkZF9lbmFibGVfYm1wc19pbXBzKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgaWYocEhkZEN0eC0+Y2ZnX2luaS0+ZklzQm1wc0VuYWJsZWQpCisgICB7CisgICAgICBzbWVfRW5hYmxlUG93ZXJTYXZlKHBIZGRDdHgtPmhIYWwsIGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRSk7CisgICB9CisKKyAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPmZJc0F1dG9CbXBzVGltZXJFbmFibGVkKQorICAgeworICAgICAgc21lX1N0YXJ0QXV0b0JtcHNUaW1lcihwSGRkQ3R4LT5oSGFsKTsgCisgICB9CisKKyAgIGlmIChwSGRkQ3R4LT5jZmdfaW5pLT5mSXNJbXBzRW5hYmxlZCkKKyAgIHsKKyAgICAgIHNtZV9FbmFibGVQb3dlclNhdmUgKHBIZGRDdHgtPmhIYWwsIGVQTUNfSURMRV9NT0RFX1BPV0VSX1NBVkUpOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCitWT1NfU1RBVFVTIGhkZF9kaXNhYmxlX2JtcHNfaW1wcyhoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0QU5JX1U4IHNlc3Npb25fdHlwZSkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gTlVMTDsKKyAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzOworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB2X0JPT0xfdCBkaXNhYmxlQm1wcyA9IEZBTFNFOworICAgdl9CT09MX3QgZGlzYWJsZUltcHMgPSBGQUxTRTsKKyAgIAorICAgc3dpdGNoKHNlc3Npb25fdHlwZSkKKyAgIHsKKyAgICAgICBjYXNlIFdMQU5fSEREX0lORlJBX1NUQVRJT046CisgICAgICAgY2FzZSBXTEFOX0hERF9TT0ZUQVA6CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgIGNhc2UgV0xBTl9IRERfUDJQX0NMSUVOVDoKKyAgICAgICBjYXNlIFdMQU5fSEREX1AyUF9HTzoKKyNlbmRpZgorICAgICAgICAgIC8vRXhpdCBCTVBTIC0+IElzIFN0YS9QMlAgQ2xpZW50IGlzIGFscmVhZHkgY29ubmVjdGVkCisgICAgICAgICAgcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwgV0xBTl9IRERfSU5GUkFfU1RBVElPTik7CisgICAgICAgICAgaWYoKE5VTEwgIT0gcEFkYXB0ZXIpJiYKKyAgICAgICAgICAgICAgaGRkX2Nvbm5Jc0Nvbm5lY3RlZCggV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBkaXNhYmxlQm1wcyA9IFRSVUU7CisgICAgICAgICAgfQorCisgICAgICAgICAgcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwgV0xBTl9IRERfUDJQX0NMSUVOVCk7CisgICAgICAgICAgaWYoKE5VTEwgIT0gcEFkYXB0ZXIpJiYKKyAgICAgICAgICAgICAgaGRkX2Nvbm5Jc0Nvbm5lY3RlZCggV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBkaXNhYmxlQm1wcyA9IFRSVUU7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy9FeGl0IGJvdGggQm1wcyBhbmQgSW1wcyBpbmNhc2Ugb2YgR28vU0FQIE1vZGUKKyAgICAgICAgICBpZigoV0xBTl9IRERfU09GVEFQID09IHNlc3Npb25fdHlwZSkgfHwKKyAgICAgICAgICAgICAgKFdMQU5fSEREX1AyUF9HTyA9PSBzZXNzaW9uX3R5cGUpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBkaXNhYmxlQm1wcyA9IFRSVUU7CisgICAgICAgICAgICAgZGlzYWJsZUltcHMgPSBUUlVFOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmKFRSVUUgPT0gZGlzYWJsZUltcHMpCisgICAgICAgICAgeworICAgICAgICAgICAgIGlmIChwSGRkQ3R4LT5jZmdfaW5pLT5mSXNJbXBzRW5hYmxlZCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21lX0Rpc2FibGVQb3dlclNhdmUgKHBIZGRDdHgtPmhIYWwsIGVQTUNfSURMRV9NT0RFX1BPV0VSX1NBVkUpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZihUUlVFID09IGRpc2FibGVCbXBzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBpZihwSGRkQ3R4LT5jZmdfaW5pLT5mSXNCbXBzRW5hYmxlZCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9EaXNhYmxlUG93ZXJTYXZlKHBIZGRDdHgtPmhIYWwsIGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRSk7CisKKyAgICAgICAgICAgICAgICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBoYWxTdGF0dXMpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBGYWlsIHRvIERpc2FibGUgUG93ZXIgU2F2ZVxuIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZihwSGRkQ3R4LT5jZmdfaW5pLT5mSXNBdXRvQm1wc1RpbWVyRW5hYmxlZCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBoYWxTdGF0dXMgPSBzbWVfU3RvcEF1dG9CbXBzVGltZXIocEhkZEN0eC0+aEhhbCk7CisKKyAgICAgICAgICAgICAgICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBoYWxTdGF0dXMpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBGYWlsIHRvIFN0b3AgQXV0byBCbXBzIFRpbWVyXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmKChUUlVFID09IGRpc2FibGVCbXBzKSB8fAorICAgICAgICAgICAgICAoVFJVRSA9PSBkaXNhYmxlSW1wcykpCisgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBOb3csIGdldCB0aGUgY2hpcCBpbnRvIEZ1bGwgUG93ZXIgbm93ICovCisgICAgICAgICAgICAgIElOSVRfQ09NUExFVElPTihwSGRkQ3R4LT5mdWxsX3B3cl9jb21wX3Zhcik7CisgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9SZXF1ZXN0RnVsbFBvd2VyKHBIZGRDdHgtPmhIYWwsIGhkZF9mdWxsX3B3cl9jYmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgsIGVTTUVfRlVMTF9QV1JfTkVFREVEX0JZX0hERCk7CisKKyAgICAgICAgICAgICAgaWYoaGFsU3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaWYoaGFsU3RhdHVzID09IGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vQmxvY2sgb24gYSBjb21wbGV0aW9uIHZhcmlhYmxlLiBDYW4ndCB3YWl0IGZvcmV2ZXIgdGhvdWdoCisgICAgICAgICAgICAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICZwSGRkQ3R4LT5mdWxsX3B3cl9jb21wX3ZhciwgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogUmVxdWVzdCBmb3IgRnVsbCBQb3dlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKworaGRkX2FkYXB0ZXJfdCogaGRkX29wZW5fYWRhcHRlciggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdEFOSV9VOCBzZXNzaW9uX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICppZmFjZV9uYW1lLCB0U2lyTWFjQWRkciBtYWNBZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggcnRubF9oZWxkICkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gTlVMTDsKKyAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICpwSGRkQWRhcHRlck5vZGUgPSBOVUxMOworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIFZPU19TVEFUVVMgZXhpdGJtcHNTdGF0dXM7CisKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXMgaWZhY2UgPSVzIHR5cGUgPSAlZFxuIixfX2Z1bmNfXyxpZmFjZV9uYW1lLHNlc3Npb25fdHlwZSk7CisKKyAgIC8vRGlzYWJsZSBCTVBTIGluY2FzZSBvZiBDb25jdXJyZW5jeQorICAgZXhpdGJtcHNTdGF0dXMgPSBoZGRfZGlzYWJsZV9ibXBzX2ltcHMocEhkZEN0eCwgc2Vzc2lvbl90eXBlKTsKKworICAgaWYoVk9TX1NUQVRVU19FX0ZBSUxVUkUgPT0gZXhpdGJtcHNTdGF0dXMpCisgICB7CisgICAgICAvL0ZhaWwgdG8gRXhpdCBCTVBTCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIHN3aXRjaChzZXNzaW9uX3R5cGUpCisgICB7CisgICAgICBjYXNlIFdMQU5fSEREX0lORlJBX1NUQVRJT046CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgY2FzZSBXTEFOX0hERF9QMlBfQ0xJRU5UOgorI2VuZGlmCisgICAgICB7CisgICAgICAgICBwQWRhcHRlciA9IGhkZF9hbGxvY19zdGF0aW9uX2FkYXB0ZXIoIHBIZGRDdHgsIG1hY0FkZHIsIGlmYWNlX25hbWUgKTsKKworICAgICAgICAgaWYoIE5VTEwgPT0gcEFkYXB0ZXIgKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgICAgICAgIHBBZGFwdGVyLT53ZGV2LmlmdHlwZSA9IChzZXNzaW9uX3R5cGUgPT0gV0xBTl9IRERfSU5GUkFfU1RBVElPTikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MODAyMTFfSUZUWVBFX1NUQVRJT04gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ7CisjZW5kaWYKKworCisgICAgICAgICBwQWRhcHRlci0+ZGV2aWNlX21vZGUgPSBzZXNzaW9uX3R5cGU7CisKKyAgICAgICAgIHN0YXR1cyA9IGhkZF9pbml0X3N0YXRpb25fbW9kZSggcEFkYXB0ZXIgKTsKKyAgICAgICAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzICkKKyAgICAgICAgICAgIGdvdG8gZXJyX2ZyZWVfbmV0ZGV2OworCisgICAgICAgICBzdGF0dXMgPSBoZGRfcmVnaXN0ZXJfaW50ZXJmYWNlKCBwQWRhcHRlciwgcnRubF9oZWxkICk7CisgICAgICAgICBpZiggVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cyApCisgICAgICAgICB7CisgICAgICAgICAgICBoZGRfZGVpbml0X2FkYXB0ZXIocEhkZEN0eCwgcEFkYXB0ZXIpOworICAgICAgICAgICAgZ290byBlcnJfZnJlZV9uZXRkZXY7CisgICAgICAgICB9CisgICAgICAgICAvL1N0b3AgdGhlIEludGVyZmFjZSBUWCBxdWV1ZS4KKyAgICAgICAgIG5ldGlmX3R4X2Rpc2FibGUocEFkYXB0ZXItPmRldik7CisgICAgICAgICAvL25ldGlmX3R4X2Rpc2FibGUocFdsYW5EZXYpOworICAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYocEFkYXB0ZXItPmRldik7CisKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgY2FzZSBXTEFOX0hERF9QMlBfR086CisjZW5kaWYKKyAgICAgIGNhc2UgV0xBTl9IRERfU09GVEFQOgorICAgICAgeworICAgICAgICAgcEFkYXB0ZXIgPSBoZGRfd2xhbl9jcmVhdGVfYXBfZGV2KCBwSGRkQ3R4LCBtYWNBZGRyLCAodEFOSV9VOCAqKWlmYWNlX25hbWUgKTsKKyAgICAgICAgIGlmKCBOVUxMID09IHBBZGFwdGVyICkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAgICAgICBwQWRhcHRlci0+d2Rldi5pZnR5cGUgPSAoc2Vzc2lvbl90eXBlID09IFdMQU5fSEREX1NPRlRBUCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MODAyMTFfSUZUWVBFX0FQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5MODAyMTFfSUZUWVBFX1AyUF9HTzsKKyNlbmRpZgorICAgICAgICAgcEFkYXB0ZXItPmRldmljZV9tb2RlID0gc2Vzc2lvbl90eXBlOworCisgICAgICAgICBzdGF0dXMgPSBoZGRfaW5pdF9hcF9tb2RlKHBBZGFwdGVyKTsKKyAgICAgICAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzICkKKyAgICAgICAgICAgIGdvdG8gZXJyX2ZyZWVfbmV0ZGV2OworCisgICAgICAgICBzdGF0dXMgPSBoZGRfcmVnaXN0ZXJfaG9zdGFwZCggcEFkYXB0ZXIsIHJ0bmxfaGVsZCApOworICAgICAgICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMgKQorICAgICAgICAgeworICAgICAgICAgICAgaGRkX2RlaW5pdF9hZGFwdGVyKHBIZGRDdHgsIHBBZGFwdGVyKTsKKyAgICAgICAgICAgIGdvdG8gZXJyX2ZyZWVfbmV0ZGV2OworICAgICAgICAgfQorCisgICAgICAgICBuZXRpZl90eF9kaXNhYmxlKHBBZGFwdGVyLT5kZXYpOworICAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYocEFkYXB0ZXItPmRldik7CisKKyAgICAgICAgIGhkZF9zZXRfY29ucGFyYW0oIDEgKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBXTEFOX0hERF9NT05JVE9SOgorICAgICAgeworI2lmZGVmIENPTkZJR19DRkc4MDIxMSAgIAorICAgICAgICAgcEFkYXB0ZXIgPSBoZGRfYWxsb2Nfc3RhdGlvbl9hZGFwdGVyKCBwSGRkQ3R4LCBtYWNBZGRyLCBpZmFjZV9uYW1lICk7CisgICAgICAgICBpZiggTlVMTCA9PSBwQWRhcHRlciApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgcEFkYXB0ZXItPndkZXYuaWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsgCisgICAgICAgICBwQWRhcHRlci0+ZGV2aWNlX21vZGUgPSBzZXNzaW9uX3R5cGU7CisgICAgICAgICBzdGF0dXMgPSBoZGRfcmVnaXN0ZXJfaW50ZXJmYWNlKCBwQWRhcHRlciwgcnRubF9oZWxkICk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDI5KQorICAgICAgICAgcEFkYXB0ZXItPmRldi0+bmV0ZGV2X29wcyA9ICZ3bGFuX21vbl9kcnZfb3BzOworI2Vsc2UKKyAgICAgICAgIHBBZGFwdGVyLT5kZXYtPm9wZW4gPSBoZGRfbW9uX29wZW47CisgICAgICAgICBwQWRhcHRlci0+ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBoZGRfbW9uX2hhcmRfc3RhcnRfeG1pdDsKKyNlbmRpZgorICAgICAgICAgaGRkX2luaXRfdHhfcngoIHBBZGFwdGVyICk7CisgICAgICAgICBzZXRfYml0KElOSVRfVFhfUlhfU1VDQ0VTUywgJnBBZGFwdGVyLT5ldmVudF9mbGFncyk7CisgICAgICAgICAvL1NldCBhZGFwdGVyIHRvIGJlIHVzZWQgZm9yIGRhdGEgdHguIEl0IHdpbGwgdXNlIGVpdGhlciBHTyBvciBzb2Z0YXAuCisgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbkN0eC5tb25pdG9yLnBBZGFwdGVyRm9yVHggPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9nZXRfYWRhcHRlcihwQWRhcHRlci0+cEhkZEN0eCwgV0xBTl9IRERfU09GVEFQKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgICBpZiAoTlVMTCA9PSBwQWRhcHRlci0+c2Vzc2lvbkN0eC5tb25pdG9yLnBBZGFwdGVyRm9yVHgpCisgICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbkN0eC5tb25pdG9yLnBBZGFwdGVyRm9yVHggPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9nZXRfYWRhcHRlcihwQWRhcHRlci0+cEhkZEN0eCwgV0xBTl9IRERfUDJQX0dPKTsKKyAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgLyogVGhpcyB3b3JrcXVldWUgd2lsbCBiZSB1c2VkIHRvIHRyYW5zbWl0IG1hbmFnZW1lbnQgcGFja2V0IG92ZXIKKyAgICAgICAgICAqIG1vbml0b3IgaW50ZXJmYWNlLiAqLworICAgICAgICAgSU5JVF9XT1JLKCZwQWRhcHRlci0+c2Vzc2lvbkN0eC5tb25pdG9yLnBBZGFwdGVyRm9yVHgtPm1vblR4V29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIGhkZF9tb25fdHhfd29ya19xdWV1ZSk7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgICAgIGJyZWFrOworI2lmZGVmIEFOSV9NQU5GX0RJQUcKKyAgICAgIGNhc2UgV0xBTl9IRERfRlRNOgorICAgICAgeworICAgICAgICAgcEFkYXB0ZXIgPSBoZGRfYWxsb2Nfc3RhdGlvbl9hZGFwdGVyKCBwSGRkQ3R4LCBtYWNBZGRyLCBpZmFjZV9uYW1lICk7CisKKyAgICAgICAgIGlmKCBOVUxMID09IHBBZGFwdGVyICkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgLyogQXNzaWduIE5MODAyMTFfSUZUWVBFX1NUQVRJT04gYXMgaW50ZXJmYWNlIHR5cGUgdG8gcmVzb2x2ZSBLZXJuZWwgV2FybmluZworICAgICAgICAgICogbWVzc2FnZSB3aGlsZSBsb2FkaW5nIGRyaXZlciBpbiBGVE0gbW9kZS4gKi8KKyAgICAgICAgIHBBZGFwdGVyLT53ZGV2LmlmdHlwZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisgICAgICAgICBwQWRhcHRlci0+ZGV2aWNlX21vZGUgPSBzZXNzaW9uX3R5cGU7CisgICAgICAgICBzdGF0dXMgPSBoZGRfcmVnaXN0ZXJfaW50ZXJmYWNlKCBwQWRhcHRlciwgcnRubF9oZWxkICk7CisgICAgICB9CisgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgZGVmYXVsdDoKKyAgICAgIHsKKyAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgIH0KKworCisgICBpZiggVk9TX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cyApCisgICB7CisgICAgICAvL0FkZCBpdCB0byB0aGUgaGRkJ3Mgc2Vzc2lvbiBsaXN0LiAKKyAgICAgIHBIZGRBZGFwdGVyTm9kZSA9IHZvc19tZW1fbWFsbG9jKCBzaXplb2YoIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICkgKTsKKyAgICAgIGlmKCBOVUxMID09IHBIZGRBZGFwdGVyTm9kZSApCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBwSGRkQWRhcHRlck5vZGUtPnBBZGFwdGVyID0gcEFkYXB0ZXI7CisgICAgICAgICBzdGF0dXMgPSBoZGRfYWRkX2FkYXB0ZXJfYmFjayAoIHBIZGRDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRkQWRhcHRlck5vZGUgKTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMgKQorICAgeworICAgICAgaWYoIE5VTEwgIT0gcEFkYXB0ZXIgKQorICAgICAgeworICAgICAgICAgaGRkX2NsZWFudXBfYWRhcHRlciggcEhkZEN0eCwgcEFkYXB0ZXIsIHJ0bmxfaGVsZCApOworICAgICAgICAgcEFkYXB0ZXIgPSBOVUxMOyAgIAorICAgICAgfQorICAgICAgaWYoIE5VTEwgIT0gcEhkZEFkYXB0ZXJOb2RlICkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZSggcEhkZEFkYXB0ZXJOb2RlICk7CisgICAgICB9CisKKyAgICAgIGdvdG8gcmVzdW1lX2JtcHM7CisgICB9CisKKyAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpCisgICB7CisgICAgICB3bGFuX2hkZF9zZXRfY29uY3VycmVuY3lfbW9kZShwSGRkQ3R4LCBzZXNzaW9uX3R5cGUpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgICAgLyogSWYgdGhlcmUgYXJlIGNvbmN1cnJlbnQgc2Vzc2lvbiBlbmFibGUgU1cgZnJhbWUgdHJhbnNsYXRpb24gCisgICAgICAgICAgICAqIGZvciBhbGwgcmVnaXN0ZXJlZCBTVEEKKyAgICAgICAgICAgICogVGhpcyBpcyBub3QgcmVxdWlyZWQgaW4gY2FzZSBvZiBQUklNQSBhcyBIVyBmcmFtZSB0cmFuc2xhdGlvbgorICAgICAgICAgICAgKiBpcyBkaXNhYmxlZCBpbiBQUklNQSovIAorICAgICAgaWYgKHZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkKKyAgICAgIHsKKyAgICAgICAgIFdMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsKHBIZGRDdHgtPnB2b3NDb250ZXh0LCBUUlVFKTsKKyAgICAgIH0KKyNlbmRpZgorICAgfQorCisgICByZXR1cm4gcEFkYXB0ZXI7CisKK2Vycl9mcmVlX25ldGRldjoKKyAgIGZyZWVfbmV0ZGV2KHBBZGFwdGVyLT5kZXYpOworICAgd2xhbl9oZGRfcmVsZWFzZV9pbnRmX2FkZHIoIHBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzICk7CisKK3Jlc3VtZV9ibXBzOgorICAgLy9JZiBibXBzIGRpc2FibGVkIGVuYWJsZSBpdAorICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTID09IGV4aXRibXBzU3RhdHVzKQorICAgeworICAgICAgaGRkX2VuYWJsZV9ibXBzX2ltcHMocEhkZEN0eCk7CisgICB9CisgICByZXR1cm4gTlVMTDsKK30KKworVk9TX1NUQVRVUyBoZGRfY2xvc2VfYWRhcHRlciggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IHJ0bmxfaGVsZCApCit7CisgICBoZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcEFkYXB0ZXJOb2RlLCAqcEN1cnJlbnQsICpwTmV4dDsKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworCisgICBzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIgKCBwSGRkQ3R4LCAmcEN1cnJlbnQgKTsKKyAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzICkKKyAgICAgIHJldHVybiBzdGF0dXM7CisKKyAgIHdoaWxlICggcEN1cnJlbnQtPnBBZGFwdGVyICE9IHBBZGFwdGVyICkKKyAgIHsKKyAgICAgIHN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyICggcEhkZEN0eCwgcEN1cnJlbnQsICZwTmV4dCApOworICAgICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMgKQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIHBDdXJyZW50ID0gcE5leHQ7CisgICB9CisgICBwQWRhcHRlck5vZGUgPSBwQ3VycmVudDsKKyAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzICkKKyAgIHsKKyAgICAgIHdsYW5faGRkX2NsZWFyX2NvbmN1cnJlbmN5X21vZGUocEhkZEN0eCwgcEFkYXB0ZXItPmRldmljZV9tb2RlKTsKKyAgICAgIGhkZF9jbGVhbnVwX2FkYXB0ZXIoIHBIZGRDdHgsIHBBZGFwdGVyTm9kZS0+cEFkYXB0ZXIsIHJ0bmxfaGVsZCApOworICAgICAgaGRkX3JlbW92ZV9hZGFwdGVyKCBwSGRkQ3R4LCBwQWRhcHRlck5vZGUgKTsKKyAgICAgIHZvc19tZW1fZnJlZSggcEFkYXB0ZXJOb2RlICk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgICAvKiBJZiB0aGVyZSBpcyBubyBjb25jdXJyZW50IHNlc3Npb24gZGlzYWJsZSBTVyBmcmFtZSB0cmFuc2xhdGlvbiAKKyAgICAgICAqIGZvciBhbGwgcmVnaXN0ZXJlZCBTVEEgKi8gCisgICAgICAvKiBUaGlzIGlzIG5vdCByZXF1aXJlZCBpbiBjYXNlIG9mIFBSSU1BIGFzIEhXIGZyYW1lIHRyYW5zbGF0aW9uCisgICAgICAgKiBpcyBkaXNhYmxlZCBpbiBQUklNQSovCisgICAgICBpZiAoIXZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkKKyAgICAgIHsKKyAgICAgICAgIFdMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsKHBIZGRDdHgtPnB2b3NDb250ZXh0LCBGQUxTRSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyogSWYgdGhlcmUgaXMgYSBzaW5nbGUgc2Vzc2lvbiBvZiBTVEEvUDJQIGNsaWVudCwgcmUtZW5hYmxlIEJNUFMgKi8KKyAgICAgIGlmICgoIXZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkgJiYgCisgICAgICAgICAgICgocEhkZEN0eC0+bm9fb2Zfc2Vzc2lvbnNbVk9TX1NUQV9NT0RFXSA+PSAxKSB8fCAKKyAgICAgICAgICAgKHBIZGRDdHgtPm5vX29mX3Nlc3Npb25zW1ZPU19QMlBfQ0xJRU5UX01PREVdID49IDEpKSkKKyAgICAgIHsKKyAgICAgICAgIGhkZF9lbmFibGVfYm1wc19pbXBzKHBIZGRDdHgpOworICAgICAgfQorCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgfQorCisgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKK1ZPU19TVEFUVVMgaGRkX2Nsb3NlX2FsbF9hZGFwdGVycyggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCApCit7CisgICBoZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcEhkZEFkYXB0ZXJOb2RlOworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisKKyAgIEVOVEVSKCk7CisKKyAgIGRvCisgICB7CisgICAgICBzdGF0dXMgPSBoZGRfcmVtb3ZlX2Zyb250X2FkYXB0ZXIoIHBIZGRDdHgsICZwSGRkQWRhcHRlck5vZGUgKTsKKyAgICAgIGlmKCBwSGRkQWRhcHRlck5vZGUgJiYgVk9TX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cyApCisgICAgICB7CisgICAgICAgICBoZGRfY2xlYW51cF9hZGFwdGVyKCBwSGRkQ3R4LCBwSGRkQWRhcHRlck5vZGUtPnBBZGFwdGVyLCBGQUxTRSApOworICAgICAgICAgdm9zX21lbV9mcmVlKCBwSGRkQWRhcHRlck5vZGUgKTsKKyAgICAgIH0KKyAgIH13aGlsZSggTlVMTCAhPSBwSGRkQWRhcHRlck5vZGUgJiYgVk9TX1NUQVRVU19FX0VNUFRZICE9IHN0YXR1cyApOworICAgCisgICBFWElUKCk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgd2xhbl9oZGRfcmVzZXRfcHJvYl9yc3BpZXMoaGRkX2FkYXB0ZXJfdCogcEhvc3RhcGRBZGFwdGVyKQoreworICAgIHZfVThfdCBhZGRJRVsxXSA9IHswfTsKKworICAgIGlmICggZUhBTF9TVEFUVVNfRkFJTFVSRSA9PSBjY21DZmdTZXRTdHIoKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPmhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExLCh0QU5JX1U4KilhZGRJRSwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UpICkKKyAgICB7CisgICAgICAgIGhkZExvZyhMT0dFLAorICAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExIHRvIENDTVxuIik7CisgICAgfQorCisgICAgaWYgKCBlSEFMX1NUQVRVU19GQUlMVVJFID09IGNjbUNmZ1NldFN0cigoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+aEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTIsICh0QU5JX1U4KilhZGRJRSwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UpICkKKyAgICB7CisgICAgICAgIGhkZExvZyhMT0dFLAorICAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEyIHRvIENDTVxuIik7CisgICAgfQorCisgICAgaWYgKCBlSEFMX1NUQVRVU19GQUlMVVJFID09IGNjbUNmZ1NldFN0cigoV0xBTl9IRERfR0VUX0NUWChwSG9zdGFwZEFkYXB0ZXIpKS0+aEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTMsICh0QU5JX1U4KilhZGRJRSwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UpICkKKyAgICB7CisgICAgICAgIGhkZExvZyhMT0dFLAorICAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEzIHRvIENDTVxuIik7CisgICAgfQorfQorCitWT1NfU1RBVFVTIGhkZF9zdG9wX2FkYXB0ZXIoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICkKK3sKKyAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIGhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworICAgdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCisgICBFTlRFUigpOworCisgICBzd2l0Y2gocEFkYXB0ZXItPmRldmljZV9tb2RlKQorICAgeworICAgICAgY2FzZSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OOgorICAgICAgY2FzZSBXTEFOX0hERF9QMlBfQ0xJRU5UOgorICAgICAgICAgaWYoIGhkZF9jb25uSXNDb25uZWN0ZWQoIFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIoIHBBZGFwdGVyICkpICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5CU1NUeXBlID09IGVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUykKKyAgICAgICAgICAgICAgICBoYWxTdGF0dXMgPSBzbWVfUm9hbURpc2Nvbm5lY3QocEhkZEN0eC0+aEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0lCU1NfTEVBVkUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9Sb2FtRGlzY29ubmVjdChwSGRkQ3R4LT5oSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisgICAgICAgICAgICAvL3N1Y2Nlc3MgaW1wbGllcyBkaXNjb25uZWN0IGNvbW1hbmQgZ290IHF1ZXVlZCB1cCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICAgIGlmKGhhbFN0YXR1cyA9PSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyLAorICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9ESVNDT05ORUNUKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1zZXQoJndycXUsICdcMCcsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICB3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCdcMCcsRVRIX0FMRU4pOworICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWRhcHRlci0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGhkZF9hYm9ydF9tYWNfc2NhbihwSGRkQ3R4KTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHRlc3RfYml0KFNNRV9TRVNTSU9OX09QRU5FRCwgJnBBZGFwdGVyLT5ldmVudF9mbGFncykpIAorICAgICAgICAgeworICAgICAgICAgICAgSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5zZXNzaW9uX2Nsb3NlX2NvbXBfdmFyKTsKKyAgICAgICAgICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTID09CisgICAgICAgICAgICAgICAgc21lX0Nsb3NlU2Vzc2lvbihwSGRkQ3R4LT5oSGFsLCBwQWRhcHRlci0+c2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9zbWVDbG9zZVNlc3Npb25DYWxsYmFjaywgcEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9CbG9jayBvbiBhIGNvbXBsZXRpb24gdmFyaWFibGUuIENhbid0IHdhaXQgZm9yZXZlciB0aG91Z2guCisgICAgICAgICAgICAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZGFwdGVyLT5zZXNzaW9uX2Nsb3NlX2NvbXBfdmFyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9TRVNTSU9OT1BFTkNMT1NFKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFdMQU5fSEREX1NPRlRBUDoKKyAgICAgIGNhc2UgV0xBTl9IRERfUDJQX0dPOgorICAgICAgICAgLy9Bbnkgc29mdGFwIHNwZWNpZmljIGNsZWFudXAgaGVyZS4uLgorICAgICAgICAgbXV0ZXhfbG9jaygmcEhkZEN0eC0+c2FwX2xvY2spOworICAgICAgICAgaWYgKHRlc3RfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnBBZGFwdGVyLT5ldmVudF9mbGFncykpIAorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgICAgICAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKyAgICAgICAgICAgIC8vU3RvcCBCc3MuCisgICAgICAgICAgICBzdGF0dXMgPSBXTEFOU0FQX1N0b3BCc3MocEhkZEN0eC0+cHZvc0NvbnRleHQpOworICAgICAgICAgICAgaWYgKFZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkX2hvc3RhcGRfc3RhdGVfdCAqcEhvc3RhcGRTdGF0ZSA9IAorICAgICAgICAgICAgICAgICAgV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisgICAgICAgICAgICAgICBzdGF0dXMgPSB2b3Nfd2FpdF9zaW5nbGVfZXZlbnQoJnBIb3N0YXBkU3RhdGUtPnZvc0V2ZW50LCAxMDAwMCk7CisgICAKKyAgICAgICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBmYWlsdXJlIHdhaXRpbmcgZm9yIFdMQU5TQVBfU3RvcEJzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGhkZExvZyhMT0dFLCAiJXM6IGZhaWx1cmUgaW4gV0xBTlNBUF9TdG9wQnNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFyX2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZwQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworCisgICAgICAgICAgICBpZiAoZUhBTF9TVEFUVVNfRkFJTFVSRSA9PQorICAgICAgICAgICAgICAgIGNjbUNmZ1NldEludChwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0ZMQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzZXQgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVIQUxfU1RBVFVTX0ZBSUxVUkUgPT0gY2NtQ2ZnU2V0SW50KChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmhIYWwsCisgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBRywgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgIGVBTklfQk9PTEVBTl9GQUxTRSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsCisgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19BU1NPQ19SU1BfQURETklFX0ZMQUcgdG8gQ0NNIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlc2V0IFdOSV9DRkdfUFJPQkVfUlNQIEZsYWdzCisgICAgICAgICAgICB3bGFuX2hkZF9yZXNldF9wcm9iX3JzcGllcyhwQWRhcHRlcik7CisgICAgICAgICAgICBrZnJlZShwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC5iZWFjb24pOworICAgICAgICAgICAgcEFkYXB0ZXItPnNlc3Npb25DdHguYXAuYmVhY29uID0gTlVMTDsKKyAgICAgICAgIH0KKyAgICAgICAgIG11dGV4X3VubG9jaygmcEhkZEN0eC0+c2FwX2xvY2spOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdMQU5fSEREX01PTklUT1I6CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgRVhJVCgpOworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworVk9TX1NUQVRVUyBoZGRfc3RvcF9hbGxfYWRhcHRlcnMoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggKQoreworICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgIGhkZF9hZGFwdGVyX3QgICAgICAqcEFkYXB0ZXI7CisKKyAgIEVOVEVSKCk7CisKKyAgIHN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlciAoIHBIZGRDdHgsICZwQWRhcHRlck5vZGUgKTsKKworICAgd2hpbGUgKCBOVUxMICE9IHBBZGFwdGVyTm9kZSAmJiBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzICkKKyAgIHsKKyAgICAgIHBBZGFwdGVyID0gcEFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKyAgICAgIG5ldGlmX3R4X2Rpc2FibGUocEFkYXB0ZXItPmRldik7CisgICAgICBuZXRpZl9jYXJyaWVyX29mZihwQWRhcHRlci0+ZGV2KTsKKworICAgICAgaGRkX3N0b3BfYWRhcHRlciggcEhkZEN0eCwgcEFkYXB0ZXIgKTsKKworICAgICAgc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIgKCBwSGRkQ3R4LCBwQWRhcHRlck5vZGUsICZwTmV4dCApOworICAgICAgcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisgICB9CisKKyAgIEVYSVQoKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworVk9TX1NUQVRVUyBoZGRfcmVzZXRfYWxsX2FkYXB0ZXJzKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4ICkKK3sKKyAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICpwQWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlcjsKKworICAgRU5URVIoKTsKKworICAgc3RhdHVzID0gIGhkZF9nZXRfZnJvbnRfYWRhcHRlciAoIHBIZGRDdHgsICZwQWRhcHRlck5vZGUgKTsKKworICAgd2hpbGUgKCBOVUxMICE9IHBBZGFwdGVyTm9kZSAmJiBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzICkKKyAgIHsKKyAgICAgIHBBZGFwdGVyID0gcEFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKyAgICAgIG5ldGlmX3R4X2Rpc2FibGUocEFkYXB0ZXItPmRldik7CisgICAgICBuZXRpZl9jYXJyaWVyX29mZihwQWRhcHRlci0+ZGV2KTsKKworICAgICAgLy9SZWNvcmQgd2hldGhlciBTVEEgaXMgYXNzb2NpYXRlZAorICAgICAgcEFkYXB0ZXItPnNlc3Npb25DdHguc3RhdGlvbi5iU2VuZERpc2Nvbm5lY3QgPSAKKyAgICAgICAgICAgIGhkZF9jb25uSXNDb25uZWN0ZWQoIFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIoIHBBZGFwdGVyICkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJVRSA6IFZPU19GQUxTRTsKKworICAgICAgaGRkX2RlaW5pdF90eF9yeChwQWRhcHRlcik7CisgICAgICBoZGRfd21tX2FkYXB0ZXJfY2xvc2UocEFkYXB0ZXIpOworCisgICAgICBzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlciAoIHBIZGRDdHgsIHBBZGFwdGVyTm9kZSwgJnBOZXh0ICk7CisgICAgICBwQWRhcHRlck5vZGUgPSBwTmV4dDsKKyAgIH0KKworICAgRVhJVCgpOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitWT1NfU1RBVFVTIGhkZF9zdGFydF9hbGxfYWRhcHRlcnMoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggKQoreworICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgIGhkZF9hZGFwdGVyX3QgICAgICAqcEFkYXB0ZXI7CisgICB2X01BQ0FERFJfdCAgYmNhc3RNYWMgPSBWT1NfTUFDX0FERFJfQlJPQURDQVNUX0lOSVRJQUxJWkVSOworCisgICBFTlRFUigpOworCisgICBzdGF0dXMgPSBoZGRfZ2V0X2Zyb250X2FkYXB0ZXIgKCBwSGRkQ3R4LCAmcEFkYXB0ZXJOb2RlICk7CisKKyAgIHdoaWxlICggTlVMTCAhPSBwQWRhcHRlck5vZGUgJiYgVk9TX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cyApCisgICB7CisgICAgICBwQWRhcHRlciA9IHBBZGFwdGVyTm9kZS0+cEFkYXB0ZXI7CisKKyAgICAgIHN3aXRjaChwQWRhcHRlci0+ZGV2aWNlX21vZGUpCisgICAgICB7CisgICAgICAgICBjYXNlIFdMQU5fSEREX0lORlJBX1NUQVRJT046CisgICAgICAgICBjYXNlIFdMQU5fSEREX1AyUF9DTElFTlQ6CisgICAgICAgICAgICBoZGRfaW5pdF9zdGF0aW9uX21vZGUocEFkYXB0ZXIpOworICAgICAgICAgICAgLyogT3BlbiB0aGUgZ2F0ZXMgZm9yIEhERCB0byByZWNlaXZlIFdleHQgY29tbWFuZHMgKi8KKyAgICAgICAgICAgIHBBZGFwdGVyLT5pc0xpbmtVcFN2Y05lZWRlZCA9IEZBTFNFOyAKKyAgICAgICAgICAgIHBBZGFwdGVyLT5zY2FuX2luZm8ubVNjYW5QZW5kaW5nID0gRkFMU0U7CisgICAgICAgICAgICBwQWRhcHRlci0+c2Nhbl9pbmZvLndhaXRTY2FuUmVzdWx0ID0gRkFMU0U7CisKKyAgICAgICAgICAgIC8vVHJpZ2dlciB0aGUgaW5pdGlhbCBzY2FuCisgICAgICAgICAgICBoZGRfd2xhbl9pbml0aWFsX3NjYW4ocEFkYXB0ZXIpOworCisgICAgICAgICAgICAvL0luZGljYXRlIGRpc2Nvbm5lY3QgZXZlbnQgdG8gc3VwcGxpY2FudCBpZiBhc3NvY2lhdGVkIHByZXZpb3VzbHkKKyAgICAgICAgICAgIGlmKHBBZGFwdGVyLT5zZXNzaW9uQ3R4LnN0YXRpb24uYlNlbmREaXNjb25uZWN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSB3cnF1OworICAgICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAnXDAnLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgICAgd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwnXDAnLEVUSF9BTEVOKTsKKyAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLmJTZW5kRGlzY29ubmVjdCA9IFZPU19GQUxTRTsKKworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgZGlzY29ubmVjdGVkIGV2ZW50IHRvIG5sODAyMTEgKi8KKyAgICAgICAgICAgICAgIGNmZzgwMjExX2Rpc2Nvbm5lY3RlZChwQWRhcHRlci0+ZGV2LCBXTEFOX1JFQVNPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBHRlBfS0VSTkVMKTsgCisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIFdMQU5fSEREX1NPRlRBUDoKKyAgICAgICAgICAgIC8qIHNvZnRBUCBjYW4gaGFuZGxlIFNTUiAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgV0xBTl9IRERfUDJQX0dPOgorI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgW1NTUl0gc2VuZCByZXN0YXJ0IHN1cHBsaWNhbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgLyogZXZlbnQgc3VwcGxpY2FudCB0byByZXN0YXJ0ICovCisgICAgICAgICAgICAgIGNmZzgwMjExX2RlbF9zdGEocEFkYXB0ZXItPmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1OCAqKSZiY2FzdE1hYy5ieXRlc1swXSwgR0ZQX0tFUk5FTCk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIFdMQU5fSEREX01PTklUT1I6CisgICAgICAgICAgICAvKiBtb25pdG9yIGludGVyZmFjZSBzdGFydCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyICggcEhkZEN0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQgKTsKKyAgICAgIHBBZGFwdGVyTm9kZSA9IHBOZXh0OworICAgfQorCisgICBFWElUKCk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK1ZPU19TVEFUVVMgaGRkX3JlY29ubmVjdF9hbGxfYWRhcHRlcnMoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggKQoreworICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlcjsKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgdl9VMzJfdCByb2FtSWQ7CisKKyAgIEVOVEVSKCk7CisKKyAgIHN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlciAoIHBIZGRDdHgsICZwQWRhcHRlck5vZGUgKTsKKworICAgd2hpbGUgKCBOVUxMICE9IHBBZGFwdGVyTm9kZSAmJiBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzICkKKyAgIHsKKyAgICAgIHBBZGFwdGVyID0gcEFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKworICAgICAgaWYoIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKyAgICAgICAgICAgICAoV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpICkKKyAgICAgIHsKKyAgICAgICAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisgICAgICAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKworICAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSA9IGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkOworICAgICAgICAgaW5pdF9jb21wbGV0aW9uKCZwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3Zhcik7CisgICAgICAgICBzbWVfUm9hbURpc2Nvbm5lY3QocEhkZEN0eC0+aEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisKKyAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkYXB0ZXItPmRpc2Nvbm5lY3RfY29tcF92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworCisgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5jc3JQZXJzb25hID0gcEFkYXB0ZXItPmRldmljZV9tb2RlOyAKKyAgICAgICAgIHBIZGRDdHgtPmlzQW1wQWxsb3dlZCA9IFZPU19GQUxTRTsKKyAgICAgICAgIHNtZV9Sb2FtQ29ubmVjdChwSGRkQ3R4LT5oSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsICYocFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyb2FtSWQpOyAKKyAgICAgIH0KKworICAgICAgc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIgKCBwSGRkQ3R4LCBwQWRhcHRlck5vZGUsICZwTmV4dCApOworICAgICAgcEFkYXB0ZXJOb2RlID0gcE5leHQ7CisgICB9CisKKyAgIEVYSVQoKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKwordl9VOF90IGhkZF9pc19zc3JfcmVxdWlyZWQoIHZvaWQpCit7CisgICAgcmV0dXJuIGlzU3NyUmVxdWlyZWQ7Cit9CisKK3ZvaWQgaGRkX3NldF9zc3JfcmVxdWlyZWQoIHZfVThfdCB2YWx1ZSkKK3sKKyAgICBpc1NzclJlcXVpcmVkID0gdmFsdWU7Cit9CisKK1ZPU19TVEFUVVMgaGRkX2dldF9mcm9udF9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90KiogcHBBZGFwdGVyTm9kZSkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICBzcGluX2xvY2soJnBIZGRDdHgtPmhkZEFkYXB0ZXJzLmxvY2spOworICAgIHN0YXR1cyA9ICBoZGRfbGlzdF9wZWVrX2Zyb250ICggJnBIZGRDdHgtPmhkZEFkYXB0ZXJzLAorICAgICAgICAgICAgICAgICAgIChoZGRfbGlzdF9ub2RlX3QqKikgcHBBZGFwdGVyTm9kZSApOworICAgIHNwaW5fdW5sb2NrKCZwSGRkQ3R4LT5oZGRBZGFwdGVycy5sb2NrKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitWT1NfU1RBVFVTIGhkZF9nZXRfbmV4dF9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QqIHBBZGFwdGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90KiogcE5leHRBZGFwdGVyTm9kZSkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICBzcGluX2xvY2soJnBIZGRDdHgtPmhkZEFkYXB0ZXJzLmxvY2spOworICAgIHN0YXR1cyA9IGhkZF9saXN0X3BlZWtfbmV4dCAoICZwSGRkQ3R4LT5oZGRBZGFwdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGRkX2xpc3Rfbm9kZV90KikgcEFkYXB0ZXJOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZGRfbGlzdF9ub2RlX3QqKilwTmV4dEFkYXB0ZXJOb2RlICk7CisKKyAgICBzcGluX3VubG9jaygmcEhkZEN0eC0+aGRkQWRhcHRlcnMubG9jayk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworVk9TX1NUQVRVUyBoZGRfcmVtb3ZlX2FkYXB0ZXIoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QqIHBBZGFwdGVyTm9kZSkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICBzcGluX2xvY2soJnBIZGRDdHgtPmhkZEFkYXB0ZXJzLmxvY2spOworICAgIHN0YXR1cyA9ICBoZGRfbGlzdF9yZW1vdmVfbm9kZSAoICZwSGRkQ3R4LT5oZGRBZGFwdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkYXB0ZXJOb2RlLT5ub2RlICk7CisgICAgc3Bpbl91bmxvY2soJnBIZGRDdHgtPmhkZEFkYXB0ZXJzLmxvY2spOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1ZPU19TVEFUVVMgaGRkX3JlbW92ZV9mcm9udF9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90KiogcHBBZGFwdGVyTm9kZSkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICBzcGluX2xvY2soJnBIZGRDdHgtPmhkZEFkYXB0ZXJzLmxvY2spOworICAgIHN0YXR1cyA9ICBoZGRfbGlzdF9yZW1vdmVfZnJvbnQoICZwSGRkQ3R4LT5oZGRBZGFwdGVycywKKyAgICAgICAgICAgICAgICAgICAoaGRkX2xpc3Rfbm9kZV90KiopIHBwQWRhcHRlck5vZGUgKTsKKyAgICBzcGluX3VubG9jaygmcEhkZEN0eC0+aGRkQWRhcHRlcnMubG9jayk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworVk9TX1NUQVRVUyBoZGRfYWRkX2FkYXB0ZXJfYmFjayggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90KiBwQWRhcHRlck5vZGUpCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgc3Bpbl9sb2NrKCZwSGRkQ3R4LT5oZGRBZGFwdGVycy5sb2NrKTsKKyAgICBzdGF0dXMgPSAgaGRkX2xpc3RfaW5zZXJ0X2JhY2sgKCAmcEhkZEN0eC0+aGRkQWRhcHRlcnMsCisgICAgICAgICAgICAgICAgICAgKGhkZF9saXN0X25vZGVfdCopIHBBZGFwdGVyTm9kZSApOworICAgIHNwaW5fdW5sb2NrKCZwSGRkQ3R4LT5oZGRBZGFwdGVycy5sb2NrKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitWT1NfU1RBVFVTIGhkZF9hZGRfYWRhcHRlcl9mcm9udCggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfYWRhcHRlcl9saXN0X25vZGVfdCogcEFkYXB0ZXJOb2RlKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgIHNwaW5fbG9jaygmcEhkZEN0eC0+aGRkQWRhcHRlcnMubG9jayk7CisgICAgc3RhdHVzID0gIGhkZF9saXN0X2luc2VydF9mcm9udCAoICZwSGRkQ3R4LT5oZGRBZGFwdGVycywKKyAgICAgICAgICAgICAgICAgICAoaGRkX2xpc3Rfbm9kZV90KikgcEFkYXB0ZXJOb2RlICk7CisgICAgc3Bpbl91bmxvY2soJnBIZGRDdHgtPmhkZEFkYXB0ZXJzLmxvY2spOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2hkZF9hZGFwdGVyX3QgKiBoZGRfZ2V0X2FkYXB0ZXJfYnlfbWFjYWRkciggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgbWFjQWRkciApCit7CisgICBoZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcEFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisKKyAgIHN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlciAoIHBIZGRDdHgsICZwQWRhcHRlck5vZGUgKTsKKworICAgd2hpbGUgKCBOVUxMICE9IHBBZGFwdGVyTm9kZSAmJiBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzICkKKyAgIHsKKyAgICAgIHBBZGFwdGVyID0gcEFkYXB0ZXJOb2RlLT5wQWRhcHRlcjsKKworICAgICAgaWYoIHBBZGFwdGVyICYmIHZvc19tZW1fY29tcGFyZSggcEFkYXB0ZXItPm1hY0FkZHJlc3NDdXJyZW50LmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApICkKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBwQWRhcHRlcjsKKyAgICAgIH0KKyAgICAgIHN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyICggcEhkZEN0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQgKTsKKyAgICAgIHBBZGFwdGVyTm9kZSA9IHBOZXh0OworICAgfQorCisgICByZXR1cm4gTlVMTDsKKworfSAKKworaGRkX2FkYXB0ZXJfdCAqIGhkZF9nZXRfYWRhcHRlcl9ieV9uYW1lKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0QU5JX1U4ICpuYW1lICkKK3sKKyAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICpwQWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyICggcEhkZEN0eCwgJnBBZGFwdGVyTm9kZSApOworCisgICB3aGlsZSAoIE5VTEwgIT0gcEFkYXB0ZXJOb2RlICYmIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMgKQorICAgeworICAgICAgcEFkYXB0ZXIgPSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyOworCisgICAgICBpZiggcEFkYXB0ZXIgJiYgIXN0cm5jbXAoIHBBZGFwdGVyLT5kZXYtPm5hbWUsIChjb25zdCBjaGFyICopbmFtZSwKKyAgICAgICAgICBJRk5BTVNJWiApICkKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBwQWRhcHRlcjsKKyAgICAgIH0KKyAgICAgIHN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyICggcEhkZEN0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQgKTsKKyAgICAgIHBBZGFwdGVyTm9kZSA9IHBOZXh0OworICAgfQorCisgICByZXR1cm4gTlVMTDsKKworfSAKKworaGRkX2FkYXB0ZXJfdCAqIGhkZF9nZXRfYWRhcHRlciggaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgZGV2aWNlX21vZGVfdCBtb2RlICkKK3sKKyAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICpwQWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyICggcEhkZEN0eCwgJnBBZGFwdGVyTm9kZSApOworCisgICB3aGlsZSAoIE5VTEwgIT0gcEFkYXB0ZXJOb2RlICYmIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMgKQorICAgeworICAgICAgcEFkYXB0ZXIgPSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyOworCisgICAgICBpZiggcEFkYXB0ZXIgJiYgKG1vZGUgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKSApCisgICAgICB7CisgICAgICAgICByZXR1cm4gcEFkYXB0ZXI7CisgICAgICB9CisgICAgICBzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlciAoIHBIZGRDdHgsIHBBZGFwdGVyTm9kZSwgJnBOZXh0ICk7CisgICAgICBwQWRhcHRlck5vZGUgPSBwTmV4dDsKKyAgIH0KKworICAgcmV0dXJuIE5VTEw7CisKK30gCisKKy8vUmVtb3ZlIHRoaXMgZnVuY3Rpb24gbGF0ZXIKK2hkZF9hZGFwdGVyX3QgKiBoZGRfZ2V0X21vbl9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4ICkKK3sKKyAgIGhkZF9hZGFwdGVyX2xpc3Rfbm9kZV90ICpwQWRhcHRlck5vZGUgPSBOVUxMLCAqcE5leHQgPSBOVUxMOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyICggcEhkZEN0eCwgJnBBZGFwdGVyTm9kZSApOworCisgICB3aGlsZSAoIE5VTEwgIT0gcEFkYXB0ZXJOb2RlICYmIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMgKQorICAgeworICAgICAgcEFkYXB0ZXIgPSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyOworCisgICAgICBpZiggcEFkYXB0ZXIgJiYgV0xBTl9IRERfTU9OSVRPUiA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorICAgICAgeworICAgICAgICAgcmV0dXJuIHBBZGFwdGVyOworICAgICAgfQorCisgICAgICBzdGF0dXMgPSBoZGRfZ2V0X25leHRfYWRhcHRlciAoIHBIZGRDdHgsIHBBZGFwdGVyTm9kZSwgJnBOZXh0ICk7CisgICAgICBwQWRhcHRlck5vZGUgPSBwTmV4dDsKKyAgIH0KKworICAgcmV0dXJuIE5VTEw7CisKK30gCisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIGhkZF9zZXRfbW9uaXRvcl90eF9hZGFwdGVyKCkgLSAKKworICAgVGhpcyBBUEkgaW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aGlsZSB0cmFuc21pdHRpbmcgb24gbW9uaXRvcgorICAgYWRhcHRlci4gCisgICAKKyAgXHBhcmFtICAtIHBIZGRDdHggLSBQb2ludGVyIHRvIHRoZSBIREQgY29udGV4dC4KKyAgICAgICAgICAgIHBBZGFwdGVyIC0gQWRhcHRlciB0aGF0IHdpbGwgdXNlZCBmb3IgVFguIFRoaXMgY2FuIGJlIE5VTEwuCisgIFxyZXR1cm4gLSBOb25lLiAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCB3bGFuX2hkZF9zZXRfbW9uaXRvcl90eF9hZGFwdGVyKCBoZGRfY29udGV4dF90ICpwSGRkQ3R4LCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApCit7CisgICBoZGRfYWRhcHRlcl90ICpwTW9uQWRhcHRlcjsKKworICAgcE1vbkFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIoIHBIZGRDdHgsIFdMQU5fSEREX01PTklUT1IgKTsKKworICAgaWYoIE5VTEwgIT0gcE1vbkFkYXB0ZXIgKQorICAgeworICAgICAgcE1vbkFkYXB0ZXItPnNlc3Npb25DdHgubW9uaXRvci5wQWRhcHRlckZvclR4ID0gcEFkYXB0ZXI7CisgICB9Cit9CisjZW5kaWYKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIGhkZF9zZWxlY3RfcXVldWUoKSAtIAorCisgICBUaGlzIEFQSSByZXR1cm5zIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBvZiB0aGUgcmVxdWVzdGVkIGRldmljZSBtb2RlIAorICAgCisgIFxwYXJhbSAgLSBwSGRkQ3R4IC0gUG9pbnRlciB0byB0aGUgSEREIGNvbnRleHQuCisgICAgICAgICAgICAgIC0gbW9kZSAtIERldmljZSBtb2RlIGZvciB3aGljaCBvcGVyYXRpbmcgY2hhbm5lbCBpcyByZXF1aXJlZAorICAgICAgICAgICAgICAgIHN1cG9ydGVkIG1vZGVzIC0gV0xBTl9IRERfSU5GUkFfU1RBVElPTiwgV0xBTl9IRERfUDJQX0NMSUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9IRERfU09GVEFQLCBXTEFOX0hERF9QMlBfR08uCisgIFxyZXR1cm4gLSBjaGFubmVsIG51bWJlci4gIjAiIGlkIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIG5vdCBmb3VuZCBPUiBpdCBpcyBub3QgY29ubmVjdGVkLiAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9VOF90IGhkZF9nZXRfb3BlcmF0aW5nX2NoYW5uZWwoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIGRldmljZV9tb2RlX3QgbW9kZSApCit7CisgICBoZGRfYWRhcHRlcl9saXN0X25vZGVfdCAqcEFkYXB0ZXJOb2RlID0gTlVMTCwgKnBOZXh0ID0gTlVMTDsKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgaGRkX2FkYXB0ZXJfdCAgICAgICpwQWRhcHRlcjsKKyAgIHZfVThfdCBvcGVyYXRpbmdDaGFubmVsID0gMDsKKworICAgc3RhdHVzID0gaGRkX2dldF9mcm9udF9hZGFwdGVyICggcEhkZEN0eCwgJnBBZGFwdGVyTm9kZSApOworCisgICB3aGlsZSAoIE5VTEwgIT0gcEFkYXB0ZXJOb2RlICYmIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMgKQorICAgeworICAgICAgcEFkYXB0ZXIgPSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyOworCisgICAgICBpZiggbW9kZSA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorICAgICAgeworICAgICAgICBzd2l0Y2gocEFkYXB0ZXItPmRldmljZV9tb2RlKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OOgorICAgICAgICAgIGNhc2UgV0xBTl9IRERfUDJQX0NMSUVOVDogCisgICAgICAgICAgICBpZiggaGRkX2Nvbm5Jc0Nvbm5lY3RlZCggV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUiggcEFkYXB0ZXIgKSkgKQorICAgICAgICAgICAgICBvcGVyYXRpbmdDaGFubmVsID0gKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFdMQU5fSEREX1NPRlRBUDoKKyAgICAgICAgICBjYXNlIFdMQU5fSEREX1AyUF9HTzoKKyAgICAgICAgICAgIC8qc29mdGFwIGNvbm5lY3Rpb24gaW5mbyAqLworICAgICAgICAgICAgaWYodGVzdF9iaXQoU09GVEFQX0JTU19TVEFSVEVELCAmcEFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkgCisgICAgICAgICAgICAgIG9wZXJhdGluZ0NoYW5uZWwgPSAoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEFkYXB0ZXIpKS0+b3BlcmF0aW5nQ2hhbm5lbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOyAvL0ZvdW5kIHRoZSBkZXZpY2Ugb2YgaW50ZXJlc3QuIGJyZWFrIHRoZSBsb29wCisgICAgICB9CisKKyAgICAgIHN0YXR1cyA9IGhkZF9nZXRfbmV4dF9hZGFwdGVyICggcEhkZEN0eCwgcEFkYXB0ZXJOb2RlLCAmcE5leHQgKTsKKyAgICAgIHBBZGFwdGVyTm9kZSA9IHBOZXh0OworICAgfQorICAgcmV0dXJuIG9wZXJhdGluZ0NoYW5uZWw7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIGhkZF9zZXRfbXVsdGljYXN0X2xpc3QoKSAtIAorCisgIFRoaXMgdXNlZCB0byBzZXQgdGhlIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QuCisKKyAgXHBhcmFtICAtIGRldiAtIFBvaW50ZXIgdG8gdGhlIFdMQU4gZGV2aWNlLgorICAtIHNrYiAtIFBvaW50ZXIgdG8gT1MgcGFja2V0IChza19idWZmKS4KKyAgXHJldHVybiAtIHN1Y2Nlc3MvZmFpbCAKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBoZGRfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKyAgIGludCBtY19jb3VudDsKKyAgIGludCBpID0gMDsKKyAgIHN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisgICBwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QqKXBBZGFwdGVyLT5wSGRkQ3R4OworICAgaWYgKE5VTEwgPT0gcEhkZEN0eCkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IEhERCBjb250ZXh0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICIlczogYWxsb3cgYWxsIG11bHRpY2FzdCBmcmFtZXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcEhkZEN0eC0+bWNfYWRkcl9saXN0Lm1jX2NudCA9IDA7CisgICB9CisgICBlbHNlIAorICAgeworICAgICAgbWNfY291bnQgPSBuZXRkZXZfbWNfY291bnQoZGV2KTsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICIlczogbWNfY291bnQgPSAldSIsIF9fRlVOQ1RJT05fXywgbWNfY291bnQpOworICAgICAgaWYgKG1jX2NvdW50ID4gV0xBTl9IRERfTUFYX01DX0FERFJfTElTVCkKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICIlczogTm8gZnJlZSBmaWx0ZXIgYXZhaWxhYmxlOyBhbGxvdyBhbGwgbXVsdGljYXN0IGZyYW1lcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICBwSGRkQ3R4LT5tY19hZGRyX2xpc3QubWNfY250ID0gMDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcEhkZEN0eC0+bWNfYWRkcl9saXN0Lm1jX2NudCA9IG1jX2NvdW50OworCisgICAgICBuZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CisgICAgICAgICBpZiAoaSA9PSBtY19jb3VudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgbWVtc2V0KCYocEhkZEN0eC0+bWNfYWRkcl9saXN0LmFkZHJbaV1bMF0pLCAwLCBFVEhfQUxFTik7CisgICAgICAgICBtZW1jcHkoJihwSGRkQ3R4LT5tY19hZGRyX2xpc3QuYWRkcltpXVswXSksIGhhLT5hZGRyLCBFVEhfQUxFTik7CisgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICJcbiVzOiBtbGlzdFslZF0gPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsIAorICAgICAgICAgICAgICAgX19mdW5jX18sIGksIAorICAgICAgICAgICAgICAgcEhkZEN0eC0+bWNfYWRkcl9saXN0LmFkZHJbaV1bMF0sIHBIZGRDdHgtPm1jX2FkZHJfbGlzdC5hZGRyW2ldWzFdLCAKKyAgICAgICAgICAgICAgIHBIZGRDdHgtPm1jX2FkZHJfbGlzdC5hZGRyW2ldWzJdLCBwSGRkQ3R4LT5tY19hZGRyX2xpc3QuYWRkcltpXVszXSwgCisgICAgICAgICAgICAgICBwSGRkQ3R4LT5tY19hZGRyX2xpc3QuYWRkcltpXVs0XSwgcEhkZEN0eC0+bWNfYWRkcl9saXN0LmFkZHJbaV1bNV0pOworICAgICAgICAgaSsrOworICAgICAgfQorICAgfQorICAgcmV0dXJuOworfQorI2VuZGlmCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIGhkZF9zZWxlY3RfcXVldWUoKSAtIAorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgTGludXggT1MgZm9yIG5ldHdvcmsKKyAgIGNvcmUgdG8gZGVjaWRlIHdoaWNoIHF1ZXVlIHRvIHVzZSBmaXJzdC4KKyAgIAorICBccGFyYW0gIC0gZGV2IC0gUG9pbnRlciB0byB0aGUgV0xBTiBkZXZpY2UuCisgICAgICAgICAgICAgIC0gc2tiIC0gUG9pbnRlciB0byBPUyBwYWNrZXQgKHNrX2J1ZmYpLgorICBccmV0dXJuIC0gYWMsIFF1ZXVlIEluZGV4L2FjY2VzcyBjYXRlZ29yeSBjb3JyZXNwb25kaW5nIHRvIFVQIGluIElQIGhlYWRlciAKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVTE2X3QgaGRkX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisgICByZXR1cm4gaGRkX3dtbV9zZWxlY3RfcXVldWUoZGV2LCBza2IpOworfQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfd2xhbl9pbml0aWFsX3NjYW4oKSAtCisKKyAgIFRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgdGhlIGluaXRpYWwgc2NhbgorCisgIFxwYXJhbSAgLSBwQWRhcHRlciAtIFBvaW50ZXIgdG8gdGhlIEhERCBhZGFwdGVyLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaGRkX3dsYW5faW5pdGlhbF9zY2FuKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworICAgdENzclNjYW5SZXF1ZXN0IHNjYW5SZXE7CisgICB0Q3NyQ2hhbm5lbEluZm8gY2hhbm5lbEluZm87CisgICBlSGFsU3RhdHVzIGhhbFN0YXR1czsKKyAgIHVuc2lnbmVkIGxvbmcgc2NhbklkOworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisgICB2b3NfbWVtX3plcm8oJnNjYW5SZXEsIHNpemVvZih0Q3NyU2NhblJlcXVlc3QpKTsKKyAgIHZvc19tZW1fc2V0KCZzY2FuUmVxLmJzc2lkLCBzaXplb2YodENzckJzc2lkKSwgMHhmZik7CisgICBzY2FuUmVxLkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0FOWTsKKworICAgaWYoc21lX0lzMTFkU3VwcG9ydGVkKHBIZGRDdHgtPmhIYWwpKQorICAgeworICAgICAgaGFsU3RhdHVzID0gc21lX1NjYW5HZXRCYXNlQ2hhbm5lbHMoIHBIZGRDdHgtPmhIYWwsICZjaGFubmVsSW5mbyApOworICAgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIGhhbFN0YXR1cyApICkKKyAgICAgIHsKKyAgICAgICAgIHNjYW5SZXEuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSB2b3NfbWVtX21hbGxvYyhjaGFubmVsSW5mby5udW1PZkNoYW5uZWxzKTsKKyAgICAgICAgIGlmKCAhc2NhblJlcS5DaGFubmVsSW5mby5DaGFubmVsTGlzdCApCisgICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMga21hbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUoY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgICAgICAgdm9zX21lbV9jb3B5KHNjYW5SZXEuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QsIGNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LAorICAgICAgICAgICAgY2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyk7CisgICAgICAgICBzY2FuUmVxLkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSBjaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOworICAgICAgICAgdm9zX21lbV9mcmVlKGNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KTsKKyAgICAgIH0KKworICAgICAgc2NhblJlcS5zY2FuVHlwZSA9IGVTSVJfUEFTU0lWRV9TQ0FOOworICAgICAgc2NhblJlcS5yZXF1ZXN0VHlwZSA9IGVDU1JfU0NBTl9SRVFVRVNUXzExRF9TQ0FOOworICAgICAgc2NhblJlcS5tYXhDaG5UaW1lID0gcEhkZEN0eC0+Y2ZnX2luaS0+blBhc3NpdmVNYXhDaG5UaW1lOworICAgICAgc2NhblJlcS5taW5DaG5UaW1lID0gcEhkZEN0eC0+Y2ZnX2luaS0+blBhc3NpdmVNaW5DaG5UaW1lOworICAgfQorICAgZWxzZQorICAgeworICAgICAgc2NhblJlcS5zY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgICBzY2FuUmVxLnJlcXVlc3RUeXBlID0gZUNTUl9TQ0FOX1JFUVVFU1RfRlVMTF9TQ0FOOworICAgICAgc2NhblJlcS5tYXhDaG5UaW1lID0gcEhkZEN0eC0+Y2ZnX2luaS0+bkFjdGl2ZU1heENoblRpbWU7CisgICAgICBzY2FuUmVxLm1pbkNoblRpbWUgPSBwSGRkQ3R4LT5jZmdfaW5pLT5uQWN0aXZlTWluQ2huVGltZTsKKyAgIH0KKworICAgaGFsU3RhdHVzID0gc21lX1NjYW5SZXF1ZXN0KHBIZGRDdHgtPmhIYWwsIHBBZGFwdGVyLT5zZXNzaW9uSWQsICZzY2FuUmVxLCAmc2NhbklkLCBOVUxMLCBOVUxMKTsKKyAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyggaGFsU3RhdHVzICkgKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBzbWVfU2NhblJlcXVlc3QgZmFpbGVkIHN0YXR1cyBjb2RlICVkIiwKKyAgICAgICAgIF9fZnVuY19fLCBoYWxTdGF0dXMgKTsKKyAgIH0KKworICAgaWYoc21lX0lzMTFkU3VwcG9ydGVkKHBIZGRDdHgtPmhIYWwpKQorICAgICAgICB2b3NfbWVtX2ZyZWUoc2NhblJlcS5DaGFubmVsSW5mby5DaGFubmVsTGlzdCk7Cit9CisKK3N0cnVjdCBmdWxsUG93ZXJDb250ZXh0Cit7CisgICBzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworICAgdW5zaWduZWQgaW50IG1hZ2ljOworfTsKKyNkZWZpbmUgUE9XRVJfQ09OVEVYVF9NQUdJQyAgMHg1MDRGNTc1MiAgIC8vUE9XUgorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgaGRkX2Z1bGxfcG93ZXJfY2FsbGJhY2soKSAtIEhERCBmdWxsIHBvd2VyIGNhbGxiYWNrIGZ1bmN0aW9uCisKKyAgVGhpcyBpcyB0aGUgZnVuY3Rpb24gaW52b2tlZCBieSBTTUUgdG8gaW5mb3JtIHRoZSByZXN1bHQgb2YgYSBmdWxsIHBvd2VyCisgIHJlcXVlc3QgaXNzdWVkIGJ5IEhERAorCisgIFxwYXJhbSAgLSBjYWxsYmFja2NvbnRleHQgLSBQb2ludGVyIHRvIGNvb2tpZQorICBccGFyYW0gIC0gc3RhdHVzIC0gcmVzdWx0IG9mIHJlcXVlc3QKKworICBccmV0dXJuIC0gTm9uZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGhkZF9mdWxsX3Bvd2VyX2NhbGxiYWNrKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpCit7CisgICBzdHJ1Y3QgZnVsbFBvd2VyQ29udGV4dCAqcENvbnRleHQgPSBjYWxsYmFja0NvbnRleHQ7CisKKyAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAiJXM6IGNvbnRleHQgPSAlcCwgc3RhdHVzID0gJWQiLCBwQ29udGV4dCwgc3RhdHVzKTsKKworICAgaWYgKE5VTEwgPT0gY2FsbGJhY2tDb250ZXh0KQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAiJXM6IEJhZCBwYXJhbSwgY29udGV4dCBbJXBdIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxiYWNrQ29udGV4dCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gdGhhdCBleGlzdHMgYmV0d2VlbiB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgICBhbmQgdGhlIGNhbGxlciBzaW5jZSB0aGUgY2FsbGVyIGNvdWxkIHRpbWUgb3V0IGVpdGhlciBiZWZvcmUgb3IKKyAgICAgIHdoaWxlIHRoaXMgY29kZSBpcyBleGVjdXRpbmcuICB3ZSdsbCBhc3N1bWUgdGhlIHRpbWVvdXQgaGFzbid0CisgICAgICBvY2N1cnJlZCwgYnV0IHdlJ2xsIHZlcmlmeSB0aGF0IHJpZ2h0IGJlZm9yZSB3ZSBzYXZlIG91ciB3b3JrICovCisKKyAgIGlmIChQT1dFUl9DT05URVhUX01BR0lDICE9IHBDb250ZXh0LT5tYWdpYykKKyAgIHsKKyAgICAgIC8qIHRoZSBjYWxsZXIgcHJlc3VtYWJseSB0aW1lZCBvdXQgc28gdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gKi8KKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAiJXM6IEludmFsaWQgY29udGV4dCwgbWFnaWMgWyUwOHhdIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwQ29udGV4dC0+bWFnaWMpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiB0aGUgcmFjZSBpcyBvbi4gIGNhbGxlciBjb3VsZCBoYXZlIHRpbWVkIG91dCBpbW1lZGlhdGVseSBhZnRlcgorICAgICAgd2UgdmVyaWZpZWQgdGhlIG1hZ2ljLCBidXQgaWYgc28sIGNhbGxlciB3aWxsIHdhaXQgYSBzaG9ydCB0aW1lCisgICAgICBmb3IgdXMgdG8gbm90aWZ5IHRoZSBjYWxsZXIsIHNvIHRoZSBjb250ZXh0IHdpbGwgc3RheSB2YWxpZCAqLworICAgY29tcGxldGUoJnBDb250ZXh0LT5jb21wbGV0aW9uKTsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIGhkZF93bGFuX2V4aXQoKSAtIEhERCBXTEFOIGV4aXQgZnVuY3Rpb24KKworICBUaGlzIGlzIHRoZSBkcml2ZXIgZXhpdCBwb2ludCAoaW52b2tlZCBkdXJpbmcgcm1tb2QpCisKKyAgXHBhcmFtICAtIHBIZGRDdHggLSBQb2ludGVyIHRvIHRoZSBIREQgQ29udGV4dAorCisgIFxyZXR1cm4gLSBOb25lCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBoZGRfd2xhbl9leGl0KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisgICBlSGFsU3RhdHVzIGhhbFN0YXR1czsKKyAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gcEhkZEN0eC0+cHZvc0NvbnRleHQ7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworICAgc3RydWN0IHNkaW9fZnVuYyAqc2Rpb19mdW5jX2RldiA9IE5VTEw7CisjZW5kaWYgLy8gQU5JX0JVU19UWVBFX1NESU8KKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgICBzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gcEhkZEN0eC0+d2lwaHk7CisjZW5kaWYgCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICBoZGRfYWRhcHRlcl90KiBwQWRhcHRlcjsKKyNlbmRpZgorICAgc3RydWN0IGZ1bGxQb3dlckNvbnRleHQgcG93ZXJDb250ZXh0OworICAgbG9uZyBscmM7CisKKyAgIEVOVEVSKCk7CisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICBpZiAoVk9TX1NUQV9TQVBfTU9ERSAhPSBoZGRfZ2V0X2NvbnBhcmFtKCkpCisjZW5kaWYKKyAgIHsKKyNpZmRlZiBBTklfTUFORl9ESUFHCisgICAgICBpZiAoVk9TX0ZUTV9NT0RFICE9IGhkZF9nZXRfY29ucGFyYW0oKSkKKyNlbmRpZiAvKiBBTklfTUFORl9ESUFHICovCisgICAgICB7CisgICAgICAgICBoZGRfYWRhcHRlcl90KiBwQWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKTsKKyAgICAgICAgIGlmIChwQWRhcHRlciA9PSBOVUxMKQorICAgICAgICAgICAgcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwgV0xBTl9IRERfUDJQX0NMSUVOVCk7CisKKyAgICAgICAgIGlmIChwQWRhcHRlciAhPSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgd2xhbl9oZGRfY2ZnODAyMTFfcHJlX3Zvc3Nfc3RvcChwQWRhcHRlcik7CisgICAgICAgICAgICBoZGRfVW5yZWdpc3RlcldleHQocEFkYXB0ZXItPmRldik7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisjZW5kaWYKKworI2lmZGVmIEFOSV9NQU5GX0RJQUcKKyAgIGlmIChWT1NfRlRNX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKQorICB7CisgICAgd2xhbl9oZGRfZnRtX2Nsb3NlKHBIZGRDdHgpOworICAgIGdvdG8gZnJlZV9oZGRfY3R4OworICB9CisjZW5kaWYgIAorICAgLy9TdG9wIHRoZSBJbnRlcmZhY2UgVFggcXVldWUuCisgICAvL25ldGlmX3R4X2Rpc2FibGUocFdsYW5EZXYpOworICAgLy9uZXRpZl9jYXJyaWVyX29mZihwV2xhbkRldik7CisKKyNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAorICAgLy8gdW5yZWdpc3RlciBzdXNwZW5kL3Jlc3VtZSBjYWxsYmFja3MKKyAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPm5FbmFibGVTdXNwZW5kKQorICAgeworICAgICAgdW5yZWdpc3Rlcl93bGFuX3N1c3BlbmQoKTsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgaWYgKFZPU19TVEFfU0FQX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKQorICAgeworICAgICAgcEFkYXB0ZXIgPSBoZGRfZ2V0X2FkYXB0ZXIocEhkZEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9IRERfU09GVEFQKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyNlbmRpZgorI2lmZGVmIEFOSV9NQU5GX0RJQUcKKyAgICAgIGlmIChWT1NfRlRNX01PREUgIT0gaGRkX2dldF9jb25wYXJhbSgpKQorI2VuZGlmIC8qIEFOSV9NQU5GX0RJQUcgKi8KKyAgICAgIHsKKyAgICAgICAgIHBBZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKHBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKTsKKyAgICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICB9CisjZW5kaWYKKyAgIC8qIERlUmVnaXN0ZXIgd2l0aCBwbGF0Zm9ybSBkcml2ZXIgYXMgY2xpZW50IGZvciBTdXNwZW5kL1Jlc3VtZSAqLworICAgdm9zU3RhdHVzID0gaGRkRGVyZWdpc3RlclBtT3BzKHBIZGRDdHgpOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogaGRkRGVyZWdpc3RlclBtT3BzIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgIH0KKworICAgdm9zU3RhdHVzID0gaGRkRGV2VG1VbnJlZ2lzdGVyTm90aWZ5Q2FsbGJhY2socEhkZEN0eCk7CisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBoZGREZXZUbVVucmVnaXN0ZXJOb3RpZnlDYWxsYmFjayBmYWlsZWQiLF9fZnVuY19fKTsKKyAgIH0KKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworCisgICAvLyBDYW5jZWwgYW55IG91dHN0YW5kaW5nIHNjYW4gcmVxdWVzdHMuICBXZSBhcmUgYWJvdXQgdG8gY2xvc2UgYWxsCisgICAvLyBvZiBvdXIgYWRhcHRlcnMsIGJ1dCBhbiBhZGFwdGVyIHN0cnVjdHVyZSBpcyB3aGF0IFNNRSBwYXNzZXMgYmFjaworICAgLy8gdG8gb3VyIGNhbGxiYWNrIGZ1bmN0aW9uLiAgSGVuY2UgaWYgdGhlcmUgYXJlIGFueSBvdXRzdGFuZGluZyBzY2FuCisgICAvLyByZXF1ZXN0cyB0aGVuIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiB3aGVuIHRoZSBhZGFwdGVyCisgICAvLyBpcyBjbG9zZWQgYW5kIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuICBXZSB0cnkgdG8gcmVzb2x2ZSB0aGF0CisgICAvLyByYWNlIGNvbmRpdGlvbiBoZXJlIGJ5IGNhbmNlbGluZyBhbnkgb3V0c3RhbmRpbmcgc2NhbnMgYmVmb3JlIHdlCisgICAvLyBjbG9zZSB0aGUgYWRhcHRlcnMuCisgICAvLyBOb3RlIHRoYXQgdGhlIHNjYW5zIG1heSBiZSBjYW5jZWxsZWQgaW4gYW4gYXN5bmNocm9ub3VzIG1hbm5lciwgc28KKyAgIC8vIGlkZWFsbHkgdGhlcmUgbmVlZHMgdG8gYmUgc29tZSBraW5kIG9mIHN5bmNocm9uaXphdGlvbi4gIFJhdGhlciB0aGFuCisgICAvLyBpbnRyb2R1Y2UgYSBuZXcgc3luY2hyb25pemF0aW9uIGhlcmUsIHdlIHdpbGwgdXRpbGl6ZSB0aGUgZmFjdCB0aGF0CisgICAvLyB3ZSBhcmUgYWJvdXQgdG8gUmVxdWVzdCBGdWxsIFBvd2VyLCBhbmQgc2luY2UgdGhhdCBpcyBzeW5jaHJvbml6ZWQsCisgICAvLyB0aGUgZXhwZWN0YXRpb24gaXMgdGhhdCBieSB0aGUgdGltZSBSZXF1ZXN0IEZ1bGwgUG93ZXIgaGFzIGNvbXBsZXRlZCwKKyAgIC8vIGFsbCBzY2FucyB3aWxsIGJlIGNhbmNlbGxlZC4KKyAgIGhkZF9hYm9ydF9tYWNfc2NhbiggcEhkZEN0eCApOworCisgICAvL0Rpc2FibGUgSU1QUy9CTVBTIGFzIHdlIGRvIG5vdCB3YW50IHRoZSBkZXZpY2UgdG8gZW50ZXIgYW55IHBvd2VyCisgICAvL3NhdmUgbW9kZSBkdXJpbmcgc2h1dGRvd24KKyAgIHNtZV9EaXNhYmxlUG93ZXJTYXZlKHBIZGRDdHgtPmhIYWwsIGVQTUNfSURMRV9NT0RFX1BPV0VSX1NBVkUpOworICAgc21lX0Rpc2FibGVQb3dlclNhdmUocEhkZEN0eC0+aEhhbCwgZVBNQ19CRUFDT05fTU9ERV9QT1dFUl9TQVZFKTsKKyAgIHNtZV9EaXNhYmxlUG93ZXJTYXZlKHBIZGRDdHgtPmhIYWwsIGVQTUNfVUFQU0RfTU9ERV9QT1dFUl9TQVZFKTsKKworICAgLy9FbnN1cmUgdGhhdCBkZXZpY2UgaXMgaW4gZnVsbCBwb3dlciBhcyB3ZSB3aWxsIHRvdWNoIEgvVyBkdXJpbmcgdm9zX1N0b3AKKyAgIGluaXRfY29tcGxldGlvbigmcG93ZXJDb250ZXh0LmNvbXBsZXRpb24pOworICAgcG93ZXJDb250ZXh0Lm1hZ2ljID0gUE9XRVJfQ09OVEVYVF9NQUdJQzsKKworICAgaGFsU3RhdHVzID0gc21lX1JlcXVlc3RGdWxsUG93ZXIocEhkZEN0eC0+aEhhbCwgaGRkX2Z1bGxfcG93ZXJfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG93ZXJDb250ZXh0LCBlU01FX0ZVTExfUFdSX05FRURFRF9CWV9IREQpOworCisgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBoYWxTdGF0dXMpCisgICB7CisgICAgICBpZiAoZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgPT0gaGFsU3RhdHVzKQorICAgICAgeworICAgICAgICAgLyogcmVxdWVzdCB3YXMgc2VudCAtLSB3YWl0IGZvciB0aGUgcmVzcG9uc2UgKi8KKyAgICAgICAgIGxyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG93ZXJDb250ZXh0LmNvbXBsZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfUE9XRVIpKTsKKyAgICAgICAgIC8qIGVpdGhlciB3ZSBoYXZlIGEgcmVzcG9uc2Ugb3Igd2UgdGltZWQgb3V0CisgICAgICAgICAgICBlaXRoZXIgd2F5LCBmaXJzdCBpbnZhbGlkYXRlIG91ciBtYWdpYyAqLworICAgICAgICAgcG93ZXJDb250ZXh0Lm1hZ2ljID0gMDsKKyAgICAgICAgIGlmIChscmMgPD0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogJXMgd2hpbGUgcmVxdWVzdGluZyBmdWxsIHBvd2VyIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICgwID09IGxyYykgPyAidGltZW91dCIgOiAiaW50ZXJydXB0Iik7CisgICAgICAgICAgICAvKiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIHN1Y2ggdGhhdCB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvdWxkIGJlIGV4ZWN1dGluZyBhdCB0aGUgc2FtZSB0aW1lIHdlIGFyZS4gb2YKKyAgICAgICAgICAgICAgIHByaW1hcnkgY29uY2VybiBpcyBpZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaGFkIGFscmVhZHkKKyAgICAgICAgICAgICAgIHZlcmlmaWVkIHRoZSAibWFnaWMiIGJ1dCBoYXNuJ3QgeWV0IHNldCB0aGUgY29tcGxldGlvbgorICAgICAgICAgICAgICAgdmFyaWFibGUuICBTaW5jZSB0aGUgY29tcGxldGlvbiB2YXJpYWJsZSBpcyBvbiBvdXIKKyAgICAgICAgICAgICAgIHN0YWNrLCB3ZSdsbCBkZWxheSBqdXN0IGEgYml0IHRvIG1ha2Ugc3VyZSB0aGUgZGF0YSBpcworICAgICAgICAgICAgICAgc3RpbGwgdmFsaWQgaWYgdGhhdCBpcyB0aGUgY2FzZSAqLworICAgICAgICAgICAgbXNsZWVwKDUwKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBSZXF1ZXN0IGZvciBGdWxsIFBvd2VyIGZhaWxlZCwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGhhbFN0YXR1cyk7CisgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgLyogY29udGludWUgLS0gbmVlZCB0byBjbGVhbiB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlICovCisgICAgICB9CisgICB9CisKKyAgIC8vIFVucmVnaXN0ZXIgdGhlIE5ldCBEZXZpY2UgTm90aWZpZXIKKyAgIHVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZoZGRfbmV0ZGV2X25vdGlmaWVyKTsKKyAgIAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgIGlmIChwSGRkQ3R4LT5jZmdfaW5pLT5pc1AycERldmljZUFkZHJBZG1pbmlzdHJhdGVkKQorICAgeworICAgICAgIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKHBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKTsKKyAgICAgICBpZiAocEFkYXB0ZXIgIT0gTlVMTCkKKyAgICAgICB7CisgICAgICAgICAgSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5zZXNzaW9uX2Nsb3NlX2NvbXBfdmFyKTsKKyAgICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBzbWVfQ2xvc2VTZXNzaW9uKCBwSGRkQ3R4LT5oSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5wMnBTZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX3NtZUNsb3NlU2Vzc2lvbkNhbGxiYWNrLCBwQWRhcHRlciApICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vQmxvY2sgb24gYSBjb21wbGV0aW9uIHZhcmlhYmxlLiBDYW4ndCB3YWl0IGZvcmV2ZXIgdGhvdWdoLgorICAgICAgICAgICAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkYXB0ZXItPnNlc3Npb25fY2xvc2VfY29tcF92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9TRVNTSU9OT1BFTkNMT1NFKSk7CisgICAgICAgICAgfQorICAgICAgIH0KKyAgIH0KKyNlbmRpZgorICAgaGRkX3N0b3BfYWxsX2FkYXB0ZXJzKCBwSGRkQ3R4ICk7CisKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworICAgc2Rpb19mdW5jX2RldiA9IGxpYnJhX2dldHNkaW9fZnVuY2RldigpOworCisgICBpZihzZGlvX2Z1bmNfZGV2ID09IE5VTEwpCisgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogc2Rpb19mdW5jX2RldiBpcyBOVUxMISIsX19mdW5jX18pOworICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICByZXR1cm47CisgICB9CisKKyAgIHNkX2NsYWltX2hvc3Qoc2Rpb19mdW5jX2Rldik7CisKKyAgIC8qIERpc2FibGUgU0RJTyBJUlEgc2luY2Ugd2UgYXJlIGV4aXRpbmcgKi8KKyAgIGxpYnJhX2VuYWJsZV9zZGlvX2lycShzZGlvX2Z1bmNfZGV2LCAwKTsKKworICAgc2RfcmVsZWFzZV9ob3N0KHNkaW9fZnVuY19kZXYpOworI2VuZGlmIC8vIEFOSV9CVVNfVFlQRV9TRElPCisKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyAgIHZvc1N0YXR1cyA9IFdMQU5CQVBfU3RvcChwVm9zQ29udGV4dCk7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdG9wIEJBUCIsX19mdW5jX18pOworICAgfQorI2VuZGlmIC8vV0xBTl9CVEFNUF9GRUFUVVJFCisKKyAgIC8vU3RvcCBhbGwgdGhlIG1vZHVsZXMKKyAgIHZvc1N0YXR1cyA9IHZvc19zdG9wKCBwVm9zQ29udGV4dCApOworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIHN0b3AgVk9TUyIsX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICAgfQorCisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgIHZvc1N0YXR1cyA9IFdMQU5CQUxfU3RvcCggcFZvc0NvbnRleHQgKTsKKworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTiBCQUwgU1RPUFxuIik7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RvcCBCQUwiLF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgIH0KKworICAgIG1zbGVlcCg1MCk7CisgICAvL1B1dCB0aGUgY2hpcCBpcyBzdGFuZGJ5IGJlZm9yZSBhc3NlcnRpbmcgZGVlcCBzbGVlcAorICAgdm9zU3RhdHVzID0gV0xBTkJBTF9TdXNwZW5kQ2hpcCggcFZvc0NvbnRleHQgKTsKKworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTiBTdXNwZW5kIENoaXBcbiIpOworCisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3VzcGVuZCBjaGlwICIsX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICAgfQorICAgLy9JbnZva2UgU0FMIHN0b3AKKyAgIHZvc1N0YXR1cyA9IFdMQU5TQUxfU3RvcCggcFZvc0NvbnRleHQgKTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdG9wIFNBTCIsX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICAgfQorCisjZW5kaWYgLy8gQU5JX0JVU19UWVBFX1NESU8KKworICAgLy9Bc3NlcnQgRGVlcCBzbGVlcCBzaWduYWwgbm93IHRvIHB1dCBMaWJyYSBIVyBpbiBsb3dlc3QgcG93ZXIgc3RhdGUKKyAgIHZvc1N0YXR1cyA9IHZvc19jaGlwQXNzZXJ0RGVlcFNsZWVwKCBOVUxMLCBOVUxMLCBOVUxMICk7CisgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisKKyAgIC8vVm90ZSBvZmYgYW55IFBNSUMgdm9sdGFnZSBzdXBwbGllcworICAgdm9zX2NoaXBQb3dlckRvd24oTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgIHZvc19jaGlwVm90ZU9mZlhPQnVmZmVyKE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAvL0NsZWFuIHVwIEhERCBObGluayBTZXJ2aWNlCisgICBzZW5kX2J0Y19ubGlua19tc2coV0xBTl9NT0RVTEVfRE9XTl9JTkQsIDApOworICAgbmxfc3J2X2V4aXQoKTsKKworICAgLy9UaGlzIHJlcXVpcmVzIHBNYWMgYWNjZXNzLCBDYWxsIHRoaXMgYmVmb3JlIHZvc19jbG9zZSgpLgorI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECisgICBoZGRfdW5yZWdpc3Rlcl9tY2FzdF9iY2FzdF9maWx0ZXIocEhkZEN0eCk7CisjZW5kaWYKKworICAgLy9DbG9zZSB0aGUgc2NoZWR1bGVyIGJlZm9yZSBjYWxsaW5nIHZvc19jbG9zZSB0byBtYWtlIHN1cmUgbm8gdGhyZWFkIGlzIAorICAgLy8gc2NoZWR1bGVkIGFmdGVyIHRoZSBlYWNoIG1vZHVsZSBjbG9zZSBpcyBjYWxsZWQgaS5lIGFmdGVyIGFsbCB0aGUgZGF0YSAKKyAgIC8vIHN0cnVjdHVyZXMgYXJlIGZyZWVkLgorICAgdm9zU3RhdHVzID0gdm9zX3NjaGVkX2Nsb3NlKCBwVm9zQ29udGV4dCApOworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkgICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIGNsb3NlIFZPU1MgU2NoZWR1bGVyIixfX2Z1bmNfXyk7CisgICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgICB9CisgICAKKworICAgLy9DbG9zZSBWT1NTCisgICAvL1RoaXMgZnJlZXMgcE1hYyhIQUwpIGNvbnRleHQuIFRoZXJlIHNob3VsZCBub3QgYmUgYW55IGNhbGwgdGhhdCByZXF1aXJlcyBwTWFjIGFjY2VzcyBhZnRlciB0aGlzLgorICAgdm9zX2Nsb3NlKHBWb3NDb250ZXh0KTsKKworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICB2b3NTdGF0dXMgPSBXTEFOQkFMX0Nsb3NlKHBWb3NDb250ZXh0KTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIAorICAgICAgICAgICIlczogRmFpbGVkIHRvIGNsb3NlIEJBTCIsX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICAgfQorICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUmV0dXJuZWQgV0xBTiBCQUwgQ0xPU0VcblxuXG5cbiIpOworI2VuZGlmIC8vIEFOSV9CVVNfVFlQRV9TRElPCisKKyAgIC8vQ2xvc2UgV2F0Y2hkb2cKKyAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPmZJc0xvZ3BFbmFibGVkKQorICAgICAgdm9zX3dhdGNoZG9nX2Nsb3NlKHBWb3NDb250ZXh0KTsKKworICAgLyogQ2FuY2VsIHRoZSB2b3RlIGZvciBYTyBDb3JlIE9OLiAKKyAgICAqIFRoaXMgaXMgZG9uZSBoZXJlIHRvIGVuc3VyZSB0aGVyZSBpcyBubyByYWNlIGNvbmRpdGlvbiBzaW5jZSBNQywgVFggYW5kIFdEIHRocmVhZHMgaGF2ZQorICAgICogZXhpdGVkIGF0IHRoaXMgcG9pbnQKKyAgICAqLworICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9XQVJOLCAiSW4gbW9kdWxlIGV4aXQ6IENhbmNlbCB0aGUgdm90ZSBmb3IgWE8gQ29yZSBPTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2hlbiBXTEFOIGlzIHR1cm5lZCBPRkZcbiIpOworICAgaWYgKHZvc19jaGlwVm90ZVhPQ29yZShOVUxMLCBOVUxMLCBOVUxMLCBWT1NfRkFMU0UpICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQ291bGQgbm90IGNhbmNlbCB0aGUgdm90ZSBmb3IgWE8gQ29yZSBPTi4iIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTm90IHJldHVybmluZyBmYWlsdXJlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFBvd2VyIGNvbnN1bWVkIHdpbGwgYmUgaGlnaFxuIik7CisgICB9ICAKKworICAgaGRkX2Nsb3NlX2FsbF9hZGFwdGVycyggcEhkZEN0eCApOworCisKKyAgIC8vRnJlZSB1cCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtYmVycyBpbnNpZGUgSEREIEFkYXB0ZXIKKyAgIGtmcmVlKHBIZGRDdHgtPmNmZ19pbmkpOworICAgcEhkZEN0eC0+Y2ZnX2luaT0gTlVMTDsKKworICAgLyogZnJlZSB0aGUgcG93ZXIgb24gbG9jayBmcm9tIHBsYXRmb3JtIGRyaXZlciAqLworICAgaWYgKGZyZWVfcml2YV9wb3dlcl9vbl9sb2NrKCJ3bGFuIikpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGZhaWxlZCB0byBmcmVlIHBvd2VyIG9uIGxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgIH0KKworI2lmZGVmIEFOSV9NQU5GX0RJQUcKK2ZyZWVfaGRkX2N0eDogICAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgd2lwaHlfdW5yZWdpc3Rlcih3aXBoeSkgOyAKKyAgIHdpcGh5X2ZyZWUod2lwaHkpIDsKKyNlbHNlCisgICB2b3NfbWVtX2ZyZWUoIHBIZGRDdHggKTsKKyNlbmRpZgorICAgaWYgKGhkZF9pc19zc3JfcmVxdWlyZWQoKSkKKyAgIHsKKyAgICAgICAvKiBXREkgdGltZW91dCBoYWQgaGFwcGVuZWQgZHVyaW5nIHVubG9hZCwgc28gU1NSIGlzIG5lZWRlZCBoZXJlICovCisgICAgICAgc3Vic3lzdGVtX3Jlc3RhcnQoInJpdmEiKTsKKyAgICAgICBtc2xlZXAoNTAwMCk7CisgICB9CisgICBoZGRfc2V0X3Nzcl9yZXF1aXJlZCAoVk9TX0ZBTFNFKTsKK30KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgaGRkX3VwZGF0ZV9jb25maWdfZnJvbV9udigpIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBjb250ZW50cyBvZgorICAgICAgICAgdGhlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB3aXRoIHBhcmFtZXRlcnMgdGFrZW4gZnJvbSBOViBzdG9yYWdlCisKKyAgXHBhcmFtICAtIHBIZGRDdHggLSBQb2ludGVyIHRvIHRoZSBIREQgZ2xvYmFsIGNvbnRleHQKKworICBccmV0dXJuIC0gVk9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgVk9TX1NUQVRVUyBoZGRfdXBkYXRlX2NvbmZpZ19mcm9tX252KGhkZF9jb250ZXh0X3QqIHBIZGRDdHgpCit7CisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXM7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgdl9CT09MX3QgaXRlbUlzVmFsaWQgPSBWT1NfRkFMU0U7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgIHZfTUFDQUREUl90IG1hY0Zyb21OVltWT1NfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkFdOworICAgdl9VOF90ICAgICAgbWFjTG9vcDsKKworICAgLypJZiB0aGUgTlYgaXMgdmFsaWQgdGhlbiBnZXQgdGhlIG1hY2FkZHJlc3MgZnJvbSBudiBlbHNlIGdldCBpdCBmcm9tIHFjb21fY2ZnLmluaSovCisgICBzdGF0dXMgPSB2b3NfbnZfZ2V0VmFsaWRpdHkoVk5WX0ZJRUxEX0lNQUdFLCAmaXRlbUlzVmFsaWQpOworICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiB2b3NfbnZfZ2V0VmFsaWRpdHkoKSBmYWlsZWRcbiAiKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIGlmIChpdGVtSXNWYWxpZCA9PSBWT1NfVFJVRSkgCisgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCIgUmVhZGluZyB0aGUgTWFjYWRkcmVzcyBmcm9tIE5WXG4gIik7CisgICAgICBzdGF0dXMgPSB2b3NfbnZfcmVhZE11bHRpTWFjQWRkcmVzcygodl9VOF90ICopJm1hY0Zyb21OVlswXS5ieXRlc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NQVhfQ09OQ1VSUkVOQ1lfUEVSU09OQSk7CisgICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgIC8qIEdldCBNQUMgZnJvbSBOViBmYWlsLCBub3QgdXBkYXRlIENGRyBpbmZvCisgICAgICAgICAgKiBJTkkgTUFDIHZhbHVlIHdpbGwgYmUgdXNlZCBmb3IgTUFDIHNldHRpbmcgKi8KKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiB2b3NfbnZfcmVhZE1hY0FkZHJlc3MoKSBmYWlsZWRcbiAiKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgfQorCisgICAgICAvKiBJZiBmaXJzdCBNQUMgaXMgbm90IHZhbGlkLCB0cmVhdCBhbGwgb3RoZXJzIGFyZSBub3QgdmFsaWQKKyAgICAgICAqIFRoZW4gYWxsIE1BQ3Mgd2lsbCBiZSBnb3QgZnJvbSBpbmkgZmlsZSAqLworICAgICAgaWYodm9zX2lzX21hY2FkZHJfemVybygmbWFjRnJvbU5WWzBdKSkKKyAgICAgIHsKKyAgICAgICAgIC8qIE1BQyBhZGRyZXNzIGluIE5WIGZpbGUgaXMgbm90IGNvbmZpZ3VyZWQgeWV0ICovCisgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX1dBUk4sICJJbnZhbGlkIE1BQyBpbiBOViBmaWxlIik7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAgICAvKiBHZXQgTUFDIGFkZHJlc3MgZnJvbSBOViwgdXBkYXRlIENGRyBpbmZvICovCisgICAgICBmb3IobWFjTG9vcCA9IDA7IG1hY0xvb3AgPCBWT1NfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkE7IG1hY0xvb3ArKykKKyAgICAgIHsKKyAgICAgICAgIGlmKHZvc19pc19tYWNhZGRyX3plcm8oJm1hY0Zyb21OVlttYWNMb29wXSkpCisgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIm5vdCB2YWxpZCBNQUMgZnJvbSBOViBmb3IgJWQiLCBtYWNMb29wKTsKKyAgICAgICAgICAgIC8qIFRoaXMgTUFDIGlzIG5vdCB2YWxpZCwgc2tpcCBpdAorICAgICAgICAgICAgICogVGhpcyBNQUMgd2lsbCBiZSBnb3QgZnJvbSBpbmkgZmlsZSAqLworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCh2X1U4X3QgKikmcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbbWFjTG9vcF0uYnl0ZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVThfdCAqKSZtYWNGcm9tTlZbbWFjTG9vcF0uYnl0ZXNbMF0sCisgICAgICAgICAgICAgICAgICAgVk9TX01BQ19BRERSX1NJWkUpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorICAgZWxzZQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIk5WIElURU0sIE1BQyBOb3QgdmFsaWQiKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNpZiAxIC8qIG5lZWQgdG8gZml4IGZvciBjb25jdXJyZW5jeSAqLworICAgLy8gU2V0IHRoZSBNQUMgQWRkcmVzcworICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgdXNlZCBieSBIQUwgdG8gYWRkIHNlbGYgc3RhLiBSZW1vdmUgdGhpcyBvbmNlIHNlbGYgc3RhIGlzIGFkZGVkIGFzIHBhcnQgb2Ygc2Vzc2lvbiBvcGVuLgorICAgaGFsU3RhdHVzID0gY2NtQ2ZnU2V0U3RyKCBwSGRkQ3R4LT5oSGFsLCBXTklfQ0ZHX1NUQV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVThfdCAqKSZwSGRkQ3R4LT5jZmdfaW5pLT5pbnRmTWFjQWRkclswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBwSGRkQ3R4LT5jZmdfaW5pLT5pbnRmTWFjQWRkclswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9zZXRfbWFjX2FkZHJfY2IsIFZPU19GQUxTRSApOworCisgICBpZiAoIUhBTF9TVEFUVVNfU1VDQ0VTUyggaGFsU3RhdHVzICkpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogRmFpbGVkIHRvIHNldCBNQUMgQWRkcmVzcy4gIgorICAgICAgICAgICJIQUxTdGF0dXMgaXMgJTA4ZCBbeCUwOHhdIixfX2Z1bmNfXywgaGFsU3RhdHVzLCBoYWxTdGF0dXMgKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfcG9zdF92b3NzX3N0YXJ0X2NvbmZpZygpIC0gSEREIHBvc3Qgdm9zcyBzdGFydCBjb25maWcgaGVscGVyCisKKyAgXHBhcmFtICAtIHBBZGFwdGVyIC0gUG9pbnRlciB0byB0aGUgSERECisKKyAgXHJldHVybiAtIE5vbmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIGhkZF9wb3N0X3Zvc3Nfc3RhcnRfY29uZmlnKGhkZF9jb250ZXh0X3QqIHBIZGRDdHgpCit7CisgICBlSGFsU3RhdHVzIGhhbFN0YXR1czsKKyAgIHZfVTMyX3QgbGlzdGVuSW50ZXJ2YWw7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAvKiBJbiB0aGUgbm9uLWludGVncmF0ZWQgYXJjaGl0ZWN0dXJlIHdlIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBmcm9tCisgICAgICB0aGUgSU5JIGZpbGUgYW5kIGZyb20gTlYgYWZ0ZXIgdk9TUyBoYXMgYmVlbiBzdGFydGVkCisgICAqLworCisgICAvLyBBcHBseSB0aGUgY2ZnLmluaSB0byBjZmcuZGF0CisgICBpZiAoRkFMU0UgPT0gaGRkX3VwZGF0ZV9jb25maWdfZGF0KHBIZGRDdHgpKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IGNvbmZpZyB1cGRhdGUgZmFpbGVkIixfX2Z1bmNfXyApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvLyBBcHBseSB0aGUgTlYgdG8gY2ZnLmRhdAorICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBoZGRfdXBkYXRlX2NvbmZpZ19mcm9tX252KHBIZGRDdHgpKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAiJXM6IGNvbmZpZyB1cGRhdGUgZnJvbSBOViBmYWlsZWQiLCBfX2Z1bmNfXyApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKworICAgLy8gU2VuZCByZWFkeSBpbmRpY2F0aW9uIHRvIHRoZSBIREQuICBUaGlzIHdpbGwga2ljayBvZmYgdGhlIE1BQworICAgLy8gaW50byBhICdydW5uaW5nJyBzdGF0ZSBhbmQgc2hvdWxkIGtpY2sgb2ZmIGFuIGluaXRpYWwgc2Nhbi4KKyAgIGhhbFN0YXR1cyA9IHNtZV9IRERSZWFkeUluZCggcEhkZEN0eC0+aEhhbCApOworICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBoYWxTdGF0dXMgKSApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlUzogc21lX0hERFJlYWR5SW5kKCkgZmFpbGVkIHdpdGggc3RhdHVzICIKKyAgICAgICAgICAiY29kZSAlMDhkIFt4JTA4eF0iLF9fZnVuY19fLCBoYWxTdGF0dXMsIGhhbFN0YXR1cyApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvLyBTZXQgZGVmYXVsdCBMSSBpbnRvIEhERCBjb250ZXh0LAorICAgLy8gb3RoZXJ3aXNlIHVuZGVyIHNvbWUgcmFjZSBjb25kaXRpb24sIEhERCB3aWxsIHNldCAwIExJIHZhbHVlIGludG8gUklWQSwKKyAgIC8vIEFuZCBSSVZBIHdpbGwgY3Jhc2gKKyAgIHdsYW5fY2ZnR2V0SW50KHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMLCAmbGlzdGVuSW50ZXJ2YWwpOworICAgcEhkZEN0eC0+aGRkX2FjdHVhbF9MSV92YWx1ZSA9IGxpc3RlbkludGVydmFsOworICAgCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKworI2lmbmRlZiBBTklfTUFORl9ESUFHCisvLyBSb3V0aW5lIHRvIGluaXRpYWxpemUgdGhlIFBNVQordm9pZCB3bGFuX2hkZF9lbmFibGVfZGVlcHNsZWVwKHZfVk9JRF90ICogcFZvc0NvbnRleHQpCit7CisvKi0tLS0tLS0tLS0tLS0tIE5lZWQgdG8gZml4IHRoaXMgY29ycmVjdGx5IHdoaWxlIGRvaW5nIERlZXBzbGVlcCB0ZXN0aW5nCisgICAgdEFOSV9VMzIgcmVnVmFsdWUgPSAwOworCisgICAgcmVnVmFsdWUgID0gUVdMQU5fUE1VX0xET19DVFJMX1JFR19QTVVfQU5BX0RFRVBfU0xFRVBfRU5fTUFTSyB8CisgICAgICAgICAgICAgICAgUVdMQU5fUE1VX0xET19DVFJMX1JFR19QTVVfQU5BXzFQMjNfTFBNX0FPTl9NQVNLX01BU0sgfAorICAgICAgICAgICAgICAgIFFXTEFOX1BNVV9MRE9fQ1RSTF9SRUdfUE1VX0FOQV8xUDIzX0xQTV9TV19NQVNLX01BU0sgfAorICAgICAgICAgICAgICAgIFFXTEFOX1BNVV9MRE9fQ1RSTF9SRUdfUE1VX0FOQV8yUDNfTFBNX01BU0tfTUFTSzsKKworICAgIFdMQU5CQUxfV3JpdGVSZWdpc3RlcihwVm9zQ29udGV4dCwgUVdMQU5fUE1VX0xET19DVFJMX1JFR19SRUcsIHJlZ1ZhbHVlKTsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiB3YWtlIGxvY2sgQVBJcyBmb3IgSEREICovCit2b2lkIGhkZF9wcmV2ZW50X3N1c3BlbmQodm9pZCkKK3sKKyAgICB3YWtlX2xvY2soJndsYW5fd2FrZV9sb2NrKTsKK30KKwordm9pZCBoZGRfYWxsb3dfc3VzcGVuZCh2b2lkKQoreworICAgIHdha2VfdW5sb2NrKCZ3bGFuX3dha2VfbG9jayk7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfd2xhbl9zdGFydHVwKCkgLSBIREQgaW5pdCBmdW5jdGlvbgorCisgIFRoaXMgaXMgdGhlIGRyaXZlciBzdGFydHVwIGNvZGUgZXhlY3V0ZWQgb25jZSBhIFdMQU4gZGV2aWNlIGhhcyBiZWVuIGRldGVjdGVkCisKKyAgXHBhcmFtICAtIGRldiAtIFBvaW50ZXIgdG8gdGhlIHVuZGVybHlpbmcgZGV2aWNlCisKKyAgXHJldHVybiAtICAwIGZvciBzdWNjZXNzIC0xIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgaGRkX3dsYW5fc3RhcnR1cChzdHJ1Y3QgZGV2aWNlICpkZXYgKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKyAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0PSBOVUxMOworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgVk9TX1NUQVRVUyB2U3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0xBTkJBUF9Db25maWdUeXBlIGJ0QW1wQ29uZmlnOworICAgaGRkX2NvbmZpZ190ICpwQ29uZmlnOworI2VuZGlmCisgICBpbnQgcmV0OworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgc3RydWN0IHdpcGh5ICp3aXBoeTsKKyNlbmRpZgorI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICBzdHJ1Y3Qgc2Rpb19mdW5jICpzZGlvX2Z1bmNfZGV2ID0gZGV2X3RvX3NkaW9fZnVuYyhkZXYpOworI2VuZGlmIC8vQU5JX0JVU19UWVBFX1NESU8KKworICAgRU5URVIoKTsKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgIC8qCisgICAgKiBjZmc4MDIxMTogd2lwaHkgYWxsb2NhdGlvbgorICAgICovCisgICB3aXBoeSA9IHdsYW5faGRkX2NmZzgwMjExX2luaXQoc2l6ZW9mKGhkZF9jb250ZXh0X3QpKSA7CisKKyAgIGlmKHdpcGh5ID09IE5VTEwpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogY2ZnODAyMTEgaW5pdCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gLTE7CisgICB9CisKKyAgIHBIZGRDdHggPSB3aXBoeV9wcml2KHdpcGh5KTsKKworI2Vsc2UgICAgICAKKyAgICAgIAorICAgcEhkZEN0eCA9IHZvc19tZW1fbWFsbG9jICggc2l6ZW9mKCBoZGRfY29udGV4dF90ICkgKTsKKyAgIGlmKHBIZGRDdHggPT0gTlVMTCkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBjZmc4MDIxMSBpbml0IGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworI2VuZGlmICAgCisgICAvL0luaXRpYWxpemUgdGhlIGFkYXB0ZXIgY29udGV4dCB0byB6ZXJvcy4KKyAgIHZvc19tZW1femVybyhwSGRkQ3R4LCBzaXplb2YoIGhkZF9jb250ZXh0X3QgKSk7CisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgIHBIZGRDdHgtPndpcGh5ID0gd2lwaHk7CisjZW5kaWYKKyAgIGhkZF9wcmV2ZW50X3N1c3BlbmQoKTsKKyAgIHBIZGRDdHgtPmlzTG9hZFVubG9hZEluUHJvZ3Jlc3MgPSBUUlVFOworCisgICB2b3Nfc2V0X2xvYWRfdW5sb2FkX2luX3Byb2dyZXNzKFZPU19NT0RVTEVfSURfVk9TUywgVFJVRSk7CisKKyAgIC8qR2V0IHZvcyBjb250ZXh0IGhlcmUgYmNveiB2b3Nfb3BlbiByZXF1aXJlcyBpdCovCisgICBwVm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9TWVMsIE5VTEwpOworCisgICAvL1NhdmUgdGhlIEdsb2JhbCBWT1NTIGNvbnRleHQgaW4gYWRhcHRlciBjb250ZXh0IGZvciBmdXR1cmUuCisgICBwSGRkQ3R4LT5wdm9zQ29udGV4dCA9IHBWb3NDb250ZXh0OworCisgICAvL1NhdmUgdGhlIGFkYXB0ZXIgY29udGV4dCBpbiBnbG9iYWwgY29udGV4dCBmb3IgZnV0dXJlLgorICAgKChWb3NDb250ZXh0VHlwZSopKHBWb3NDb250ZXh0KSktPnBIRERDb250ZXh0ID0gKHZfVk9JRF90KilwSGRkQ3R4OworCisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgIC8vIFNldCB0aGUgcHJpdmF0ZSBkYXRhIGZvciB0aGUgZGV2aWNlIHRvIG91ciBhZGFwdGVyLgorICAgbGlicmFfc2Rpb19zZXRwcml2ZGF0YSAoc2Rpb19mdW5jX2RldiwgcEhkZEN0eCk7CisgICBhdG9taWNfc2V0KCZwSGRkQ3R4LT5zZGlvX2NsYWltX2NvdW50LCAwKTsKKyNlbmRpZiAvLyBBTklfQlVTX1RZUEVfU0RJTworCisgICBwSGRkQ3R4LT5wYXJlbnRfZGV2ID0gZGV2OworCisgICBpbml0X2NvbXBsZXRpb24oJnBIZGRDdHgtPmZ1bGxfcHdyX2NvbXBfdmFyKTsKKyAgIGluaXRfY29tcGxldGlvbigmcEhkZEN0eC0+c3RhbmRieV9jb21wX3Zhcik7CisgICBpbml0X2NvbXBsZXRpb24oJnBIZGRDdHgtPnJlcV9ibXBzX2NvbXBfdmFyKTsKKworCisgICBoZGRfbGlzdF9pbml0KCAmcEhkZEN0eC0+aGRkQWRhcHRlcnMsIE1BWF9OVU1CRVJfT0ZfQURBUFRFUlMgKTsKKworICAgLy8gTG9hZCBhbGwgY29uZmlnIGZpcnN0IGFzIFRMIGNvbmZpZyBpcyBuZWVkZWQgZHVyaW5nIHZvc19vcGVuCisgICBwSGRkQ3R4LT5jZmdfaW5pID0gKGhkZF9jb25maWdfdCopIGttYWxsb2Moc2l6ZW9mKGhkZF9jb25maWdfdCksIEdGUF9LRVJORUwpOworICAgaWYocEhkZEN0eC0+Y2ZnX2luaSA9PSBOVUxMKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEZhaWxlZCBrbWFsbG9jIGhkZF9jb25maWdfdCIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfZnJlZV9oZGRfY29udGV4dDsKKyAgIH0KKworICAgdm9zX21lbV96ZXJvKHBIZGRDdHgtPmNmZ19pbmksIHNpemVvZiggaGRkX2NvbmZpZ190ICkpOworCisgICAvLyBSZWFkIGFuZCBwYXJzZSB0aGUgcWNvbV9jZmcuaW5pIGZpbGUKKyAgIHN0YXR1cyA9IGhkZF9wYXJzZV9jb25maWdfaW5pKCBwSGRkQ3R4ICk7CisgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMgKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBlcnJvciBwYXJzaW5nICVzIiwKKyAgICAgICAgICAgICBfX2Z1bmNfXywgV0xBTl9JTklfRklMRSk7CisgICAgICBnb3RvIGVycl9jb25maWc7CisgICB9CisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgIC8qCisgICAgKiBjZmc4MDIxMTogSW5pdGlhbGl6YXRpb24gYW5kIHJlZ2lzdHJhdGlvbiAuLi4KKyAgICAqLworICAgaWYgKDAgPCB3bGFuX2hkZF9jZmc4MDIxMV9yZWdpc3RlcihkZXYsIHdpcGh5LCBwSGRkQ3R4LT5jZmdfaW5pKSkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIAorICAgICAgICAgICAgICAiJXM6IHdsYW5faGRkX2NmZzgwMjExX3JlZ2lzdGVyIHJldHVybiBmYWlsdXJlIiwgX19mdW5jX18pOworICAgICAgZ290byBlcnJfd2lwaHlfcmVnOworICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8vIFVwZGF0ZSBXREkgdHJhY2UgbGV2ZWxzIGJhc2VkIHVwb24gdGhlIGNmZy5pbmkKKyAgIGhkZF93ZGlfdHJhY2VfZW5hYmxlKGVXTEFOX01PRFVMRV9EQUwsCisgICAgICAgICAgICAgICAgICAgICAgICBwSGRkQ3R4LT5jZmdfaW5pLT53ZGlUcmFjZUVuYWJsZURBTCk7CisgICBoZGRfd2RpX3RyYWNlX2VuYWJsZShlV0xBTl9NT0RVTEVfREFMX0NUUkwsCisgICAgICAgICAgICAgICAgICAgICAgICBwSGRkQ3R4LT5jZmdfaW5pLT53ZGlUcmFjZUVuYWJsZUNUTCk7CisgICBoZGRfd2RpX3RyYWNlX2VuYWJsZShlV0xBTl9NT0RVTEVfREFMX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICBwSGRkQ3R4LT5jZmdfaW5pLT53ZGlUcmFjZUVuYWJsZURBVCk7CisgICBoZGRfd2RpX3RyYWNlX2VuYWJsZShlV0xBTl9NT0RVTEVfUEFMLAorICAgICAgICAgICAgICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+d2RpVHJhY2VFbmFibGVQQUwpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisjaWZkZWYgQU5JX01BTkZfRElBRyAKKyAgIGlmKFZPU19GVE1fTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpCisgIHsKKyAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHdsYW5faGRkX2Z0bV9vcGVuKHBIZGRDdHgpICkKKyAgICAgIHsKKyAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogd2xhbl9oZGRfZnRtX29wZW4gRmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgICAgZ290byBlcnJfZnJlZV9oZGRfY29udGV4dDsKKyAgICAgIH0KKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBGVE0gZHJpdmVyIGxvYWRlZCBzdWNjZXNzIGZ1bGx5IixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICB9CisjZW5kaWYKKworICAgIC8vT3BlbiB3YXRjaGRvZyBtb2R1bGUKKyAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPmZJc0xvZ3BFbmFibGVkKQorICAgeworICAgICAgc3RhdHVzID0gdm9zX3dhdGNoZG9nX29wZW4ocFZvc0NvbnRleHQsCisgICAgICAgICAmKChWb3NDb250ZXh0VHlwZSopcFZvc0NvbnRleHQpLT52b3NXYXRjaGRvZywgc2l6ZW9mKFZvc1dhdGNoZG9nQ29udGV4dCkpOworCisgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSkKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiB2b3Nfd2F0Y2hkb2dfb3BlbiBmYWlsZWQiLF9fZnVuY19fKTsKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgICAgICAgIGdvdG8gZXJyX3dpcGh5X3JlZzsKKyNlbHNlCisgICAgICAgICBnb3RvIGVycl9jb25maWc7CisjZW5kaWYKKyAgICAgIH0KKyAgIH0KKworICAgcEhkZEN0eC0+aXNMb2dwSW5Qcm9ncmVzcyA9IEZBTFNFOworICAgdm9zX3NldF9sb2dwX2luX3Byb2dyZXNzKFZPU19NT0RVTEVfSURfVk9TUywgRkFMU0UpOworCisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgIHN0YXR1cyA9IFdMQU5CQUxfT3BlbihwSGRkQ3R4LT5wdm9zQ29udGV4dCk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICIlczogRmFpbGVkIHRvIG9wZW4gQkFMIixfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl93ZGNsb3NlOworICAgfQorI2VuZGlmIC8vIEFOSV9CVVNfVFlQRV9TRElPCisKKyAgIHN0YXR1cyA9IHZvc19jaGlwVm90ZU9uWE9CdWZmZXIoTlVMTCwgTlVMTCwgTlVMTCk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IEZhaWxlZCB0byBjb25maWd1cmUgMTkuMiBNSHogQ2xvY2siLCBfX2Z1bmNfXyk7CisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgICAgIGdvdG8gZXJyX2JhbGNsb3NlOworI2Vsc2UKKyAgICAgIGdvdG8gZXJyX3dkY2xvc2U7CisjZW5kaWYKKyAgIH0KKworCisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgIHN0YXR1cyA9IFdMQU5TQUxfU3RhcnQocEhkZEN0eC0+cHZvc0NvbnRleHQpOworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogRmFpbGVkIHRvIHN0YXJ0IFNBTCIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfY2xrdm90ZTsKKyAgIH0KKworICAvKiBTdGFydCBCQUwgKi8KKyAgc3RhdHVzID0gV0xBTkJBTF9TdGFydChwSGRkQ3R4LT5wdm9zQ29udGV4dCk7CisKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdGFydCBCQUwiLF9fZnVuY19fKTsKKyAgICAgZ290byBlcnJfc2Fsc3RvcDsKKyAgfQorI2VuZGlmIC8vIEFOSV9CVVNfVFlQRV9TRElPCisKKyNpZmRlZiBNU01fUExBVEZPUk1fN3gzMAorICAgLyogRklYTUU6IFZvbGFucyAyLjAgY29uZmlndXJhdGlvbi4gUmVjb25maWd1cmUgMS4zdiBTVyBzdXBwbHkgdG8gMS4zdi4gSXQgd2lsbCBiZSBjb25maWd1cmVkIHRvCisgICAgKiAxLjR2IGluIHZvc19DaGlwUG93ZXJ1cCgpIHJvdXRpbmUgYWJvdmUKKyAgICAqLworI2VuZGlmCisKKyAgIHN0YXR1cyA9IHZvc19vcGVuKCAmcFZvc0NvbnRleHQsIDApOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiB2b3Nfb3BlbiBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX2JhbHN0b3A7ICAgCisgICB9CisKKyAgIC8qIFNhdmUgdGhlIGhhbCBjb250ZXh0IGluIEFkYXB0ZXIgKi8KKyAgIHBIZGRDdHgtPmhIYWwgPSAodEhhbEhhbmRsZSl2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfU01FLCBwVm9zQ29udGV4dCApOworCisgICBpZiAoIE5VTEwgPT0gcEhkZEN0eC0+aEhhbCApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogSEFMIGNvbnRleHQgaXMgbnVsbCIsX19mdW5jX18pOyAgICAgIAorICAgICAgZ290byBlcnJfdm9zY2xvc2U7CisgICB9CisKKyAgIC8vIFNldCB0aGUgU01FIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4uLgorICAgc3RhdHVzID0gaGRkX3NldF9zbWVfY29uZmlnKCBwSGRkQ3R4ICk7CisKKyAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cyApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogRmFpbGVkIGhkZF9zZXRfc21lX2NvbmZpZyIsX19mdW5jX18pOyAKKyAgICAgICAgIGdvdG8gZXJyX3Zvc2Nsb3NlOworICAgICAgfQorCisgICAvL0luaXRpYWxpemUgdGhlIFdNTSBtb2R1bGUKKyAgIHN0YXR1cyA9IGhkZF93bW1faW5pdChwSGRkQ3R4KTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IGhkZF93bW1faW5pdCBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgZ290byBlcnJfdm9zY2xvc2U7CisgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8qIFZvcyBwcmVTdGFydCBpcyBjYWxsaW5nICovCisgICBzdGF0dXMgPSB2b3NfcHJlU3RhcnQoIHBIZGRDdHgtPnB2b3NDb250ZXh0ICk7CisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiB2b3NfcHJlU3RhcnQgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl92b3NjbG9zZTsKKyAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAvKiBJbiB0aGUgaW50ZWdyYXRlZCBhcmNoaXRlY3R1cmUgd2UgdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIGZyb20KKyAgICAgIHRoZSBJTkkgZmlsZSBhbmQgZnJvbSBOViBiZWZvcmUgdk9TUyBoYXMgYmVlbiBzdGFydGVkIHNvIHRoYXQKKyAgICAgIHRoZSBmaW5hbCBjb250ZW50cyBhcmUgYXZhaWxhYmxlIHRvIHNlbmQgZG93biB0byB0aGUgY0NQVSAgICovCisKKyAgIC8vIEFwcGx5IHRoZSBjZmcuaW5pIHRvIGNmZy5kYXQKKyAgIGlmIChGQUxTRSA9PSBoZGRfdXBkYXRlX2NvbmZpZ19kYXQocEhkZEN0eCkpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogY29uZmlnIHVwZGF0ZSBmYWlsZWQiLF9fZnVuY19fICk7CisgICAgICBnb3RvIGVycl92b3NjbG9zZTsKKyAgIH0KKworICAgLy8gQXBwbHkgdGhlIE5WIHRvIGNmZy5kYXQKKyAgIC8qIFByaW1hIFVwZGF0ZSBNQUMgYWRkcmVzcyBvbmx5IGF0IGhlcmUgKi8KKyAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gaGRkX3VwZGF0ZV9jb25maWdfZnJvbV9udihwSGRkQ3R4KSkKKyAgIHsKKyNpZmRlZiBXTEFOX0FVVE9HRU5fTUFDQUREUl9GRUFUVVJFCisgICAgICAvKiBUaGVyZSB3YXMgbm90IGEgdmFsaWQgc2V0IG9mIE1BQyBBZGRyZXNzZXMgaW4gTlYuICBTZWUgaWYgdGhlCisgICAgICAgICBkZWZhdWx0IGFkZHJlc3NlcyB3ZXJlIG1vZGlmaWVkIGJ5IHRoZSBjZmcuaW5pIHNldHRpbmdzLiAgSWYgc28sCisgICAgICAgICB3ZSdsbCB1c2UgdGhlbSwgYnV0IGlmIG5vdCwgd2UnbGwgYXV0b2dlbmVyYXRlIGEgc2V0IG9mIE1BQworICAgICAgICAgYWRkcmVzc2VzIGJhc2VkIHVwb24gdGhlIGRldmljZSBzZXJpYWwgbnVtYmVyICovCisKKyAgICAgIHN0YXRpYyBjb25zdCB2X01BQ0FERFJfdCBkZWZhdWx0X2FkZHJlc3MgPQorICAgICAgICAge3sweDAwLCAweDBBLCAweEY1LCAweDg5LCAweDg5LCAweEZGfX07CisgICAgICB1bnNpZ25lZCBpbnQgc2VyaWFsbm87CisgICAgICBpbnQgaTsKKworICAgICAgc2VyaWFsbm8gPSB3Y25zc19nZXRfc2VyaWFsX251bWJlcigpOworICAgICAgaWYgKCgwICE9IHNlcmlhbG5vKSAmJgorICAgICAgICAgICgwID09IG1lbWNtcCgmZGVmYXVsdF9hZGRyZXNzLCAmcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZWZhdWx0X2FkZHJlc3MpKSkpCisgICAgICB7CisgICAgICAgICAvKiBjZmcuaW5pIGhhcyB0aGUgZGVmYXVsdCBhZGRyZXNzLCBpbnZva2UgYXV0b2dlbiBsb2dpYyAqLworCisgICAgICAgICAvKiBNQUMgYWRkcmVzcyBoYXMgMyBieXRlcyBvZiBPVUkgc28gd2UgaGF2ZSBhIG1heGltdW0gb2YgMworICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIHNlcmlhbCBudW1iZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZQorICAgICAgICAgICAgdGhlIG90aGVyIDMgYnl0ZXMgb2YgdGhlIE1BQyBhZGRyZXNzLiAgTWFzayBvZmYgYWxsIGJ1dAorICAgICAgICAgICAgdGhlIGxvd2VyIDMgYnl0ZXMgKHRoaXMgd2lsbCBhbHNvIG1ha2Ugc3VyZSB3ZSBkb24ndAorICAgICAgICAgICAgb3ZlcmZsb3cgaW4gdGhlIG5leHQgc3RlcCkgKi8KKyAgICAgICAgIHNlcmlhbG5vICY9IDB4MDBGRkZGRkY7CisKKyAgICAgICAgIC8qIHdlIG5lZWQgYSB1bmlxdWUgYWRkcmVzcyBmb3IgZWFjaCBzZXNzaW9uICovCisgICAgICAgICBzZXJpYWxubyAqPSBWT1NfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkE7CisKKyAgICAgICAgIC8qIGF1dG9nZW4gYWxsIGFkZHJlc3NlcyAqLworICAgICAgICAgZm9yIChpID0gMDsgaSA8IFZPU19NQVhfQ09OQ1VSUkVOQ1lfUEVSU09OQTsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgLyogc3RhcnQgd2l0aCB0aGUgZW50aXJlIGRlZmF1bHQgYWRkcmVzcyAqLworICAgICAgICAgICAgcEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbaV0gPSBkZWZhdWx0X2FkZHJlc3M7CisgICAgICAgICAgICAvKiB0aGVuIHJlcGxhY2UgdGhlIGxvd2VyIDMgYnl0ZXMgKi8KKyAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyW2ldLmJ5dGVzWzNdID0gKHNlcmlhbG5vID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBwSGRkQ3R4LT5jZmdfaW5pLT5pbnRmTWFjQWRkcltpXS5ieXRlc1s0XSA9IChzZXJpYWxubyA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBwSGRkQ3R4LT5jZmdfaW5pLT5pbnRmTWFjQWRkcltpXS5ieXRlc1s1XSA9IHNlcmlhbG5vICYgMHhGRjsKKworICAgICAgICAgICAgc2VyaWFsbm8rKzsKKyAgICAgICAgIH0KKworICAgICAgICAgcHJfaW5mbygid2xhbjogSW52YWxpZCBNQUMgYWRkcmVzc2VzIGluIE5WLCBhdXRvZ2VuZXJhdGVkICIKKyAgICAgICAgICAgICAgICBNQUNfQUREUkVTU19TVFIsCisgICAgICAgICAgICAgICAgTUFDX0FERFJfQVJSQVkocEhkZEN0eC0+Y2ZnX2luaS0+aW50Zk1hY0FkZHJbMF0uYnl0ZXMpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZiAvL1dMQU5fQVVUT0dFTl9NQUNBRERSX0ZFQVRVUkUKKyAgICAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIE1BQyBhZGRyZXNzIGluIE5WLCB1c2luZyBNQUMgZnJvbSBpbmkgZmlsZSAiCisgICAgICAgICAgICAgICAgTUFDX0FERFJFU1NfU1RSLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBNQUNfQUREUl9BUlJBWShwSGRkQ3R4LT5jZmdfaW5pLT5pbnRmTWFjQWRkclswXS5ieXRlcykpOworICAgICAgfQorICAgfQorICAgeworICAgICAgZUhhbFN0YXR1cyBoYWxTdGF0dXM7CisgICAgICAvLyBTZXQgdGhlIE1BQyBBZGRyZXNzCisgICAgICAvLyBDdXJyZW50bHkgdGhpcyBpcyB1c2VkIGJ5IEhBTCB0byBhZGQgc2VsZiBzdGEuIFJlbW92ZSB0aGlzIG9uY2Ugc2VsZiBzdGEgaXMgYWRkZWQgYXMgcGFydCBvZiBzZXNzaW9uIG9wZW4uCisgICAgICBoYWxTdGF0dXMgPSBjZmdTZXRTdHIoIHBIZGRDdHgtPmhIYWwsIFdOSV9DRkdfU1RBX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90ICopJnBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyWzBdKSApOworICAgCisgICAgICBpZiAoIUhBTF9TVEFUVVNfU1VDQ0VTUyggaGFsU3RhdHVzICkpCisgICAgICB7CisgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogRmFpbGVkIHRvIHNldCBNQUMgQWRkcmVzcy4gIgorICAgICAgICAgICAgICAgICJIQUxTdGF0dXMgaXMgJTA4ZCBbeCUwOHhdIixfX2Z1bmNfXywgaGFsU3RhdHVzLCBoYWxTdGF0dXMgKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIH0KKyAgIH0KKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKworICAgLypTdGFydCBWT1NTIHdoaWNoIHN0YXJ0cyB1cCB0aGUgU01FL01BQy9IQUwgbW9kdWxlcyBhbmQgZXZlcnl0aGluZyBlbHNlCisgICAgIE5vdGU6IEZpcm13YXJlIGltYWdlIHdpbGwgYmUgcmVhZCBhbmQgZG93bmxvYWRlZCBpbnNpZGUgdm9zX3N0YXJ0IEFQSSAqLworICAgc3RhdHVzID0gdm9zX3N0YXJ0KCBwSGRkQ3R4LT5wdm9zQ29udGV4dCApOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogdm9zX3N0YXJ0IGZhaWxlZCIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfdm9zY2xvc2U7CisgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8qIHJldHJpZXZlIGFuZCBkaXNwbGF5IFdDTlNTIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgIGRvIHsKKyAgICAgIHRTaXJWZXJzaW9uVHlwZSB2ZXJzaW9uQ29tcGlsZWQ7CisgICAgICB0U2lyVmVyc2lvblR5cGUgdmVyc2lvblJlcG9ydGVkOworICAgICAgdFNpclZlcnNpb25TdHJpbmcgdmVyc2lvblN0cmluZzsKKyAgICAgIHRBTklfVTggZndGZWF0Q2Fwc01zZ1N1cHBvcnRlZCA9IDA7CisgICAgICBWT1NfU1RBVFVTIHZzdGF0dXM7CisKKyAgICAgIHZzdGF0dXMgPSBzbWVfR2V0V2Nuc3NXbGFuQ29tcGlsZWRWZXJzaW9uKHBIZGRDdHgtPmhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVyc2lvbkNvbXBpbGVkKTsKKyAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZzdGF0dXMpKQorICAgICAgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiJXM6IHVuYWJsZSB0byByZXRyaWV2ZSBXQ05TUyBXTEFOIGNvbXBpbGVkIHZlcnNpb24iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdnN0YXR1cyA9IHNtZV9HZXRXY25zc1dsYW5SZXBvcnRlZFZlcnNpb24ocEhkZEN0eC0+aEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJzaW9uUmVwb3J0ZWQpOworICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModnN0YXR1cykpCisgICAgICB7CisgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICIlczogdW5hYmxlIHRvIHJldHJpZXZlIFdDTlNTIFdMQU4gcmVwb3J0ZWQgdmVyc2lvbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoKHZlcnNpb25Db21waWxlZC5tYWpvciAhPSB2ZXJzaW9uUmVwb3J0ZWQubWFqb3IpIHx8CisgICAgICAgICAgKHZlcnNpb25Db21waWxlZC5taW5vciAhPSB2ZXJzaW9uUmVwb3J0ZWQubWlub3IpIHx8CisgICAgICAgICAgKHZlcnNpb25Db21waWxlZC52ZXJzaW9uICE9IHZlcnNpb25SZXBvcnRlZC52ZXJzaW9uKSB8fAorICAgICAgICAgICh2ZXJzaW9uQ29tcGlsZWQucmV2aXNpb24gIT0gdmVyc2lvblJlcG9ydGVkLnJldmlzaW9uKSkKKyAgICAgIHsKKyAgICAgICAgIHByX2VycigiJXM6IFdDTlNTIFdsQU4gVmVyc2lvbiAldS4ldS4ldS4ldSwgIgorICAgICAgICAgICAgICAgICJIb3N0IGV4cGVjdGVkICV1LiV1LiV1LiV1XG4iLAorICAgICAgICAgICAgICAgIFdMQU5fTU9EVUxFX05BTUUsCisgICAgICAgICAgICAgICAgKGludCl2ZXJzaW9uUmVwb3J0ZWQubWFqb3IsCisgICAgICAgICAgICAgICAgKGludCl2ZXJzaW9uUmVwb3J0ZWQubWlub3IsCisgICAgICAgICAgICAgICAgKGludCl2ZXJzaW9uUmVwb3J0ZWQudmVyc2lvbiwKKyAgICAgICAgICAgICAgICAoaW50KXZlcnNpb25SZXBvcnRlZC5yZXZpc2lvbiwKKyAgICAgICAgICAgICAgICAoaW50KXZlcnNpb25Db21waWxlZC5tYWpvciwKKyAgICAgICAgICAgICAgICAoaW50KXZlcnNpb25Db21waWxlZC5taW5vciwKKyAgICAgICAgICAgICAgICAoaW50KXZlcnNpb25Db21waWxlZC52ZXJzaW9uLAorICAgICAgICAgICAgICAgIChpbnQpdmVyc2lvbkNvbXBpbGVkLnJldmlzaW9uKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHByX2luZm8oIiVzOiBXQ05TUyBXTEFOIHZlcnNpb24gJXUuJXUuJXUuJXVcbiIsCisgICAgICAgICAgICAgICAgIFdMQU5fTU9EVUxFX05BTUUsCisgICAgICAgICAgICAgICAgIChpbnQpdmVyc2lvblJlcG9ydGVkLm1ham9yLAorICAgICAgICAgICAgICAgICAoaW50KXZlcnNpb25SZXBvcnRlZC5taW5vciwKKyAgICAgICAgICAgICAgICAgKGludCl2ZXJzaW9uUmVwb3J0ZWQudmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgKGludCl2ZXJzaW9uUmVwb3J0ZWQucmV2aXNpb24pOworICAgICAgfQorCisgICAgICB2c3RhdHVzID0gc21lX0dldFdjbnNzU29mdHdhcmVWZXJzaW9uKHBIZGRDdHgtPmhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2ZXJzaW9uU3RyaW5nKSk7CisgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2c3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gcmV0cmlldmUgV0NOU1Mgc29mdHdhcmUgdmVyc2lvbiBzdHJpbmciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcHJfaW5mbygiJXM6IFdDTlNTIHNvZnR3YXJlIHZlcnNpb24gJXNcbiIsCisgICAgICAgICAgICAgIFdMQU5fTU9EVUxFX05BTUUsIHZlcnNpb25TdHJpbmcpOworCisgICAgICB2c3RhdHVzID0gc21lX0dldFdjbnNzSGFyZHdhcmVWZXJzaW9uKHBIZGRDdHgtPmhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2ZXJzaW9uU3RyaW5nKSk7CisgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2c3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gcmV0cmlldmUgV0NOU1MgaGFyZHdhcmUgdmVyc2lvbiBzdHJpbmciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcHJfaW5mbygiJXM6IFdDTlNTIGhhcmR3YXJlIHZlcnNpb24gJXNcbiIsCisgICAgICAgICAgICAgIFdMQU5fTU9EVUxFX05BTUUsIHZlcnNpb25TdHJpbmcpOworCisgICAgICAvKiBDaGVjayBpZiBGVyB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiAwLjEuMS4wLiBPbmx5IHRoZW4gc2VuZCBob3N0LUZXIGNhcGFiaWxpdHkgZXhjaGFuZ2UgbWVzc2FnZSAqLworICAgICAgaWYgKCh2ZXJzaW9uUmVwb3J0ZWQubWFqb3I+MCkgfHwgKHZlcnNpb25SZXBvcnRlZC5taW5vcj4xKSB8fCAoKHZlcnNpb25SZXBvcnRlZC5taW5vcj49MSkgJiYgKHZlcnNpb25SZXBvcnRlZC52ZXJzaW9uPj0xKSkpCisgICAgICAgICBmd0ZlYXRDYXBzTXNnU3VwcG9ydGVkID0gMTsKKyAgICAgIGlmIChmd0ZlYXRDYXBzTXNnU3VwcG9ydGVkKQorICAgICAgICBzbWVfZmVhdHVyZUNhcHNFeGNoYW5nZShwSGRkQ3R4LT5oSGFsKTsKKyAgIH0gd2hpbGUgKDApOworCisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisKKyAgIHN0YXR1cyA9IGhkZF9wb3N0X3Zvc3Nfc3RhcnRfY29uZmlnKCBwSGRkQ3R4ICk7CisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBoZGRfcG9zdF92b3NzX3N0YXJ0X2NvbmZpZyBmYWlsZWQiLCAKKyAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX3Zvc3N0b3A7CisgICB9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICBpZiAoVk9TX1NUQV9TQVBfTU9ERSA9PSBoZGRfZ2V0X2NvbnBhcmFtKCkpCisgICB7CisgICAgIHBBZGFwdGVyID0gaGRkX29wZW5fYWRhcHRlciggcEhkZEN0eCwgV0xBTl9IRERfU09GVEFQLCAic29mdGFwLiVkIiwgCisgICAgICAgICB3bGFuX2hkZF9nZXRfaW50Zl9hZGRyKHBIZGRDdHgpLCBGQUxTRSApOworICAgfQorICAgZWxzZQorICAgeworI2VuZGlmCisgICAgIHBBZGFwdGVyID0gaGRkX29wZW5fYWRhcHRlciggcEhkZEN0eCwgV0xBTl9IRERfSU5GUkFfU1RBVElPTiwgIndsYW4lZCIsCisgICAgICAgICB3bGFuX2hkZF9nZXRfaW50Zl9hZGRyKHBIZGRDdHgpLCBGQUxTRSApOworICAgICBpZiAocEFkYXB0ZXIgIT0gTlVMTCkKKyAgICAgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgIHZvc19tZW1fY29weSggcEhkZEN0eC0+cDJwRGV2aWNlQWRkcmVzcy5ieXRlcywgCisgICAgICAgICAgICAgICAgICAgICAgIHBIZGRDdHgtPmNmZ19pbmktPmludGZNYWNBZGRyWzBdLmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgIGlmICggcEhkZEN0eC0+Y2ZnX2luaS0+aXNQMnBEZXZpY2VBZGRyQWRtaW5pc3RyYXRlZCApCisgICAgICAgICB7CisgICAgICAgICAgICAgLyogR2VuZXJhdGUgdGhlIFAyUCBEZXZpY2UgQWRkcmVzcy4gIFRoaXMgY29uc2lzdHMgb2YgdGhlIGRldmljZSdzCisgICAgICAgICAgICAgICogcHJpbWFyeSBNQUMgYWRkcmVzcyB3aXRoIHRoZSBsb2NhbGx5IGFkbWluaXN0ZXJlZCBiaXQgc2V0LgorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIHBIZGRDdHgtPnAycERldmljZUFkZHJlc3MuYnl0ZXNbMF0gfD0gMHgwMjsKKyAgICAgICAgICAgICBzdGF0dXMgPSBoZGRfaW5pdF9wMnBfZGV2aWNlX21vZGUocEFkYXB0ZXIpOworICAgICAgICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cyApCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogSW5pdCBTZXNzaW9uIGZhaWwgZm9yIFAyUCBEZXZpY2UgQWRkcmVzcyBNb2RlICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgIGdvdG8gZXJyX2Nsb3NlX2FkYXB0ZXI7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorI2VuZGlmCisgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgIH0KKyNlbmRpZgorCisgICBpZiggcEFkYXB0ZXIgPT0gTlVMTCApCisgICB7CisgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBoZGRfb3Blbl9hZGFwdGVyIGZhaWxlZCIsX19mdW5jX18pOworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICAgIGdvdG8gZXJyX2JhbHN0b3A7CisjZWxzZQorICAgICBnb3RvIGVycl9jbGt2b3RlOworI2VuZGlmCisgICB9CisgICAKKyAgICAgCisjaWZkZWYgV0xBTl9CVEFNUF9GRUFUVVJFCisgICB2U3RhdHVzID0gV0xBTkJBUF9PcGVuKHBWb3NDb250ZXh0KTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICIlczogRmFpbGVkIHRvIG9wZW4gQkFQIixfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl9wMnBzZXNzaW9uX2Nsb3NlOworICAgfQorCisgICB2U3RhdHVzID0gQlNMX0luaXQocFZvc0NvbnRleHQpOworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgIiVzOiBGYWlsZWQgdG8gSW5pdCBCU0wiLF9fZnVuY19fKTsKKyAgICAgZ290byBlcnJfYmFwX2Nsb3NlOworICAgfQorICAgdlN0YXR1cyA9IFdMQU5CQVBfU3RhcnQocFZvc0NvbnRleHQpOworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICB7CisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN0YXJ0IFRMIixfX2Z1bmNfXyk7CisgICAgICAgZ290byBlcnJfYmFwX2Nsb3NlOworICAgfQorCisgICBwQ29uZmlnID0gcEhkZEN0eC0+Y2ZnX2luaTsKKyAgIGJ0QW1wQ29uZmlnLnVjUHJlZmVycmVkQ2hhbm5lbCA9IHBDb25maWctPnByZWZlcnJlZENoYW5uZWw7CisgICBzdGF0dXMgPSBXTEFOQkFQX1NldENvbmZpZygmYnRBbXBDb25maWcpOworCisjZW5kaWYgLy9XTEFOX0JUQU1QX0ZFQVRVUkUKKyAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKyAgIC8qU01FIG11c3Qgc2VuZCBjaGFubmVsIHVwZGF0ZSBjb25maWd1cmF0aW9uIHRvIFJJVkEqLworICAgc21lX1VwZGF0ZUNoYW5uZWxDb25maWcocEhkZEN0eC0+aEhhbCk7IAorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8qIFJlZ2lzdGVyIHdpdGggcGxhdGZvcm0gZHJpdmVyIGFzIGNsaWVudCBmb3IgU3VzcGVuZC9SZXN1bWUgKi8KKyAgIHN0YXR1cyA9IGhkZFJlZ2lzdGVyUG1PcHMocEhkZEN0eCk7CisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBoZGRSZWdpc3RlclBtT3BzIGZhaWxlZCIsX19mdW5jX18pOworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgICAgZ290byBlcnJfYmFwX3N0b3A7CisjZWxzZQorICAgICAgZ290byBlcnJfcDJwc2Vzc2lvbl9jbG9zZTsgCisjZW5kaWYgLy9XTEFOX0JUQU1QX0ZFQVRVUkUKKyAgIH0KKworICAgLyogUmVnaXN0ZXIgVE0gbGV2ZWwgY2hhbmdlIGhhbmRsZXIgZnVuY3Rpb24gdG8gdGhlIHBsYXRmb3JtICovCisgICBzdGF0dXMgPSBoZGREZXZUbVJlZ2lzdGVyTm90aWZ5Q2FsbGJhY2socEhkZEN0eCk7CisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBoZGREZXZUbVJlZ2lzdGVyTm90aWZ5Q2FsbGJhY2sgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl91bnJlZ2lzdGVyX3Btb3BzOworICAgfQorI2VuZGlmCisKKyAgIC8qIHJlZ2lzdGVyIGZvciByaXZhIHBvd2VyIG9uIGxvY2sgdG8gcGxhdGZvcm0gZHJpdmVyICovCisgICBpZiAocmVxX3JpdmFfcG93ZXJfb25fbG9jaygid2xhbiIpKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IHJlcSByaXZhIHBvd2VyIG9uIGxvY2sgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl91bnJlZ2lzdGVyX3Btb3BzOworICAgfQorCisjaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKKyAgIC8vIFJlZ2lzdGVyIHN1c3BlbmQvcmVzdW1lIGNhbGxiYWNrcworICAgaWYocEhkZEN0eC0+Y2ZnX2luaS0+bkVuYWJsZVN1c3BlbmQpCisgICB7CisgICAgICByZWdpc3Rlcl93bGFuX3N1c3BlbmQoKTsKKyAgIH0KKyNlbmRpZgorCisgICAvLyByZWdpc3RlciBuZXQgZGV2aWNlIG5vdGlmaWVyIGZvciBkZXZpY2UgY2hhbmdlIG5vdGlmaWNhdGlvbgorICAgcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZoZGRfbmV0ZGV2X25vdGlmaWVyKTsKKworICAgaWYocmV0IDwgMCkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICBnb3RvIGVycl9mcmVlX3Bvd2VyX29uX2xvY2s7CisgICB9CisKKyAgIC8vSW5pdGlhbGl6ZSB0aGUgbmxpbmsgc2VydmljZQorICAgaWYobmxfc3J2X2luaXQoKSAhPSAwKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJVM6IG5sX3Nydl9pbml0IGZhaWxlZCIsX19mdW5jX18pOworICAgICAgZ290byBlcnJfcmVnX25ldGRldjsKKyAgIH0KKworICAgLy9Jbml0aWFsaXplIHRoZSBCVEMgc2VydmljZQorICAgaWYoYnRjX2FjdGl2YXRlX3NlcnZpY2UocEhkZEN0eCkgIT0gMCkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBidGNfYWN0aXZhdGVfc2VydmljZSBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX25sX3NydjsKKyAgIH0KKworI2lmZGVmIFBUVF9TT0NLX1NWQ19FTkFCTEUKKyAgIC8vSW5pdGlhbGl6ZSB0aGUgUFRUIHNlcnZpY2UKKyAgIGlmKHB0dF9zb2NrX2FjdGl2YXRlX3N2YyhwSGRkQ3R4KSAhPSAwKQorICAgeworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IHB0dF9zb2NrX2FjdGl2YXRlX3N2YyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX25sX3NydjsKKyAgIH0KKyNlbmRpZgorCisgICAvL0luaXRpYWxpemUgdGhlIFdvV0wgc2VydmljZQorICAgaWYoIWhkZF9pbml0X3dvd2wocEhkZEN0eCkpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogaGRkX2luaXRfd293bCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZXJyX25sX3NydjsKKyAgIH0KKworI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECisgICBoZGRfcmVnaXN0ZXJfbWNhc3RfYmNhc3RfZmlsdGVyKHBIZGRDdHgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgaWYgKFZPU19TVEFfU0FQX01PREUgIT0gaGRkX2dldF9jb25wYXJhbSgpKQorI2VuZGlmCisgICB7CisgICAgICB3bGFuX2hkZF9jZmc4MDIxMV9wb3N0X3Zvc3Nfc3RhcnQocEFkYXB0ZXIpOworICAgfQorI2VuZGlmCisKKyAgIG11dGV4X2luaXQoJnBIZGRDdHgtPnNhcF9sb2NrKTsKKworICAgcEhkZEN0eC0+aXNMb2FkVW5sb2FkSW5Qcm9ncmVzcyA9IEZBTFNFOworCisgICB2b3NfZXZlbnRfaW5pdCgmcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuX2ZpbmlzaGVkX2V2ZW50KTsKKyAgIHBBZGFwdGVyLT5zY2FuX2luZm8uc2Nhbl9wZW5kaW5nX29wdGlvbiA9IFdFWFRfU0NBTl9QRU5ESU5HX0dJVkVVUDsKKworICAgdm9zX3NldF9sb2FkX3VubG9hZF9pbl9wcm9ncmVzcyhWT1NfTU9EVUxFX0lEX1ZPU1MsIEZBTFNFKTsKKyAgIGhkZF9hbGxvd19zdXNwZW5kKCk7CisgIAorICAgZ290byBzdWNjZXNzOworCitlcnJfbmxfc3J2OgorICAgbmxfc3J2X2V4aXQoKTsKKworZXJyX3JlZ19uZXRkZXY6CisgICB1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaGRkX25ldGRldl9ub3RpZmllcik7CisKK2Vycl9mcmVlX3Bvd2VyX29uX2xvY2s6CisgICBmcmVlX3JpdmFfcG93ZXJfb25fbG9jaygid2xhbiIpOworCitlcnJfdW5yZWdpc3Rlcl9wbW9wczoKKyAgIGhkZERldlRtVW5yZWdpc3Rlck5vdGlmeUNhbGxiYWNrKHBIZGRDdHgpOworICAgaGRkRGVyZWdpc3RlclBtT3BzKHBIZGRDdHgpOworCisjaWZkZWYgV0xBTl9CVEFNUF9GRUFUVVJFCitlcnJfYmFwX3N0b3A6CisgIFdMQU5CQVBfU3RvcChwVm9zQ29udGV4dCk7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorZXJyX2JhcF9jbG9zZToKKyAgIFdMQU5CQVBfQ2xvc2UocFZvc0NvbnRleHQpOworI2VuZGlmCisKK2Vycl9wMnBzZXNzaW9uX2Nsb3NlOgorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgIGlmIChwSGRkQ3R4LT5jZmdfaW5pLT5pc1AycERldmljZUFkZHJBZG1pbmlzdHJhdGVkKQorICAgeworICAgICAgIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKHBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0hERF9JTkZSQV9TVEFUSU9OKTsKKworICAgICAgIGlmIChwQWRhcHRlciAhPSBOVUxMKQorICAgICAgIHsKKyAgICAgICAgICBJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPnNlc3Npb25fY2xvc2VfY29tcF92YXIpOworICAgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHNtZV9DbG9zZVNlc3Npb24oIHBIZGRDdHgtPmhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPnAycFNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfc21lQ2xvc2VTZXNzaW9uQ2FsbGJhY2ssIHBBZGFwdGVyICkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy9CbG9jayBvbiBhIGNvbXBsZXRpb24gdmFyaWFibGUuIENhbid0IHdhaXQgZm9yZXZlciB0aG91Z2guCisgICAgICAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICZwQWRhcHRlci0+c2Vzc2lvbl9jbG9zZV9jb21wX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX1NFU1NJT05PUEVOQ0xPU0UpKTsKKyAgICAgICAgICB9CisgICAgICAgfQorICAgfQorI2VuZGlmCisKK2Vycl9jbG9zZV9hZGFwdGVyOgorICAgaGRkX2Nsb3NlX2FsbF9hZGFwdGVycyggcEhkZEN0eCApOworCitlcnJfdm9zc3RvcDoKKyAgIHZvc19zdG9wKHBWb3NDb250ZXh0KTsKKworZXJyX3Zvc2Nsb3NlOiAgICAKKyAgIHN0YXR1cyA9IHZvc19zY2hlZF9jbG9zZSggcFZvc0NvbnRleHQgKTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpICAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBjbG9zZSBWT1NTIFNjaGVkdWxlciIsIF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKTsKKyAgIH0KKyAgIHZvc19jbG9zZShwVm9zQ29udGV4dCApOyAKKworZXJyX2JhbHN0b3A6CisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyNpZm5kZWYgQU5JX01BTkZfRElBRworICAgICAgIHdsYW5faGRkX2VuYWJsZV9kZWVwc2xlZXAocEhkZEN0eC0+cHZvc0NvbnRleHQpOworI2VuZGlmCisKKyAgIFdMQU5CQUxfU3RvcChwSGRkQ3R4LT5wdm9zQ29udGV4dCk7CisgICBXTEFOQkFMX1N1c3BlbmRDaGlwKHBIZGRDdHgtPnB2b3NDb250ZXh0KTsKKyNlbmRpZgorCisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KK2Vycl9zYWxzdG9wOgorICAgV0xBTlNBTF9TdG9wKHBIZGRDdHgtPnB2b3NDb250ZXh0KTsKKworI2VuZGlmCitlcnJfY2xrdm90ZToKKyAgICB2b3NfY2hpcFZvdGVPZmZYT0J1ZmZlcihOVUxMLCBOVUxMLCBOVUxMKTsKKworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCitlcnJfYmFsY2xvc2U6CisgICBXTEFOQkFMX0Nsb3NlKHBIZGRDdHgtPnB2b3NDb250ZXh0KTsKKyNlbmRpZiAvLyBBTklfQlVTX1RZUEVfU0RJTworCitlcnJfd2RjbG9zZToKKyAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPmZJc0xvZ3BFbmFibGVkKQorICAgICAgdm9zX3dhdGNoZG9nX2Nsb3NlKHBWb3NDb250ZXh0KTsKKworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorZXJyX3dpcGh5X3JlZzoKKyAgIHdpcGh5X3VucmVnaXN0ZXIod2lwaHkpIDsgCisjZW5kaWYKKworZXJyX2NvbmZpZzoKKyAgIGtmcmVlKHBIZGRDdHgtPmNmZ19pbmkpOworICAgcEhkZEN0eC0+Y2ZnX2luaT0gTlVMTDsKKworZXJyX2ZyZWVfaGRkX2NvbnRleHQ6CisgICBoZGRfYWxsb3dfc3VzcGVuZCgpOworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgd2lwaHlfZnJlZSh3aXBoeSkgOworICAgLy9rZnJlZSh3ZGV2KSA7CisjZWxzZQorICAgdm9zX21lbV9mcmVlKCBwSGRkQ3R4ICk7CisjZW5kaWYKKyAgIFZPU19CVUcoMSk7CisKKyAgIHJldHVybiAtMTsKKworc3VjY2VzczoKKyAgIEVYSVQoKTsKKyAgIHJldHVybiAwOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgaGRkX21vZHVsZV9pbml0KCkgLSBJbml0IEZ1bmN0aW9uCisKKyAgIFRoaXMgaXMgdGhlIGRyaXZlciBlbnRyeSBwb2ludCAoaW52b2tlZCB3aGVuIG1vZHVsZSBpcyBsb2FkZWQgdXNpbmcgaW5zbW9kKQorCisgIFxwYXJhbSAgLSBOb25lCisKKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IF9faW5pdCBoZGRfbW9kdWxlX2luaXQgKCB2b2lkKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCA9IE5VTEw7CisjaWZkZWYgQU5JX0JVU19UWVBFX1NESU8KKyAgIHN0cnVjdCBzZGlvX2Z1bmMgKnNkaW9fZnVuY19kZXYgPSBOVUxMOworICAgdW5zaWduZWQgaW50IGF0dGVtcHRzID0gMDsKKyNlbmRpZiAvLyBBTklfQlVTX1RZUEVfU0RJTworICAgc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKyAgIGludCByZXRfc3RhdHVzID0gMDsKKworICAgRU5URVIoKTsKKworICAgd2FrZV9sb2NrX2luaXQoJndsYW5fd2FrZV9sb2NrLCBXQUtFX0xPQ0tfU1VTUEVORCwgIndsYW4iKTsKKworICAgcHJfaW5mbygiJXM6IGxvYWRpbmcgZHJpdmVyIHYlc1xuIiwgV0xBTl9NT0RVTEVfTkFNRSwKKyAgICAgICAgICAgUVdMQU5fVkVSU0lPTlNUUiBUSU1FUl9NQU5BR0VSX1NUUiBNRU1PUllfREVCVUdfU1RSKTsKKworICAgLy9Qb3dlciBVcCBMaWJyYSBXTEFOIGNhcmQgZmlyc3QgaWYgbm90IGFscmVhZHkgcG93ZXJlZCB1cAorICAgc3RhdHVzID0gdm9zX2NoaXBQb3dlclVwKE5VTEwsTlVMTCxOVUxMKTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IExpYnJhIFdMQU4gbm90IFBvd2VyZWQgVXAuICIKKyAgICAgICAgICAiZXhpdGluZyIsIF9fZnVuY19fKTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICAvL1NESU8gUG9sbGluZyBzaG91bGQgYmUgdHVybmVkIG9uIGZvciBjYXJkIGRldGVjdGlvbi4gV2hlbiB1c2luZyBBbmRyb2lkIFdpLUZpIEdVSQorICAgLy91c2VycyBuZWVkIG5vdCB0cmlnZ2VyIFNESU8gcG9sbGluZyBleHBsaWNpdGx5LiBIb3dldmVyIHdoZW4gbG9hZGluZyBkcml2ZXJzIHZpYQorICAgLy9jb21tYW5kIGxpbmUgKEFkYiBzaGVsbCksIHVzZXJzIG11c3QgdHVybiBvbiBTRElPIHBvbGxpbmcgcHJpb3IgdG8gbG9hZGluZyBXTEFOLgorICAgZG8geworICAgICAgc2Rpb19mdW5jX2RldiA9IGxpYnJhX2dldHNkaW9fZnVuY2RldigpOworICAgICAgaWYgKE5VTEwgPT0gc2Rpb19mdW5jX2RldikgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBMaWJyYSBXTEFOIG5vdCBkZXRlY3RlZCB5ZXQuIixfX2Z1bmNfXyk7CisgICAgICAgICBhdHRlbXB0cysrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IExpYnJhIFdMQU4gZGV0ZWN0b24gc3VjY2VlZGVkIixfX2Z1bmNfXyk7CisgICAgICAgICBkZXYgPSAmc2Rpb19mdW5jX2Rldi0+ZGV2OworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmKGF0dGVtcHRzID09IDcpCisgICAgICAgICBicmVhazsKKworICAgICAgbXNsZWVwKDI1MCk7CisKKyAgIH13aGlsZSAoYXR0ZW1wdHMgPCA3KTsKKworICAgLy9SZXRyeSB0byBkZXRlY3QgdGhlIGNhcmQgYWdhaW4gYnkgUG93ZXJpbmcgRG93biB0aGUgY2hpcCBhbmQgUG93ZXIgdXAgdGhlIGNoaXAKKyAgIC8vYWdhaW4uIFRoaXMgcmV0cnkgaXMgZG9uZSB0byByZWNvdmVyIGZyb20gQ1JDIEVycm9yCisgICBpZiAoTlVMTCA9PSBzZGlvX2Z1bmNfZGV2KSB7CisKKyAgICAgIGF0dGVtcHRzID0gMDsKKworICAgICAgLy9Wb3RlIG9mZiBhbnkgUE1JQyB2b2x0YWdlIHN1cHBsaWVzCisgICAgICB2b3NfY2hpcFBvd2VyRG93bihOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgbXNsZWVwKDEwMDApOworCisgICAgICAvL1Bvd2VyIFVwIExpYnJhIFdMQU4gY2FyZCBmaXJzdCBpZiBub3QgYWxyZWFkeSBwb3dlcmVkIHVwCisgICAgICBzdGF0dXMgPSB2b3NfY2hpcFBvd2VyVXAoTlVMTCxOVUxMLE5VTEwpOworICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogUmV0cnkgTGlicmEgV0xBTiBub3QgUG93ZXJlZCBVcC4gIgorICAgICAgICAgICAgICJleGl0aW5nIiwgX19mdW5jX18pOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICBkbyB7CisgICAgICAgICBzZGlvX2Z1bmNfZGV2ID0gbGlicmFfZ2V0c2Rpb19mdW5jZGV2KCk7CisgICAgICAgICBpZiAoTlVMTCA9PSBzZGlvX2Z1bmNfZGV2KSB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFJldHJ5IExpYnJhIFdMQU4gbm90IGRldGVjdGVkIHlldC4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgIGF0dGVtcHRzKys7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogUmV0cnkgTGlicmEgV0xBTiBkZXRlY3RvbiBzdWNjZWVkZWQiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIGRldiA9ICZzZGlvX2Z1bmNfZGV2LT5kZXY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYoYXR0ZW1wdHMgPT0gMikKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIG1zbGVlcCgxMDAwKTsKKworICAgICAgfXdoaWxlIChhdHRlbXB0cyA8IDMpOworICAgfQorCisjZW5kaWYgLy8gQU5JX0JVU19UWVBFX1NESU8KKworI2lmZGVmIEFOSV9CVVNfVFlQRV9QQ0kKKworICAgZGV2ID0gd2Nuc3Nfd2xhbl9nZXRfZGV2aWNlKCk7CisKKyNlbmRpZiAvLyBBTklfQlVTX1RZUEVfUENJCisKKyNpZmRlZiBBTklfQlVTX1RZUEVfUExBVEZPUk0KKyAgIGRldiA9IHdjbnNzX3dsYW5fZ2V0X2RldmljZSgpOworI2VuZGlmIC8vIEFOSV9CVVNfVFlQRV9QTEFURk9STQorCisKKyAgIGRvIHsKKyAgICAgIGlmIChOVUxMID09IGRldikgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBXTEFOIGRldmljZSBub3QgZm91bmQhISIsX19mdW5jX18pOworICAgICAgICAgcmV0X3N0YXR1cyA9IC0xOworICAgICAgICAgYnJlYWs7CisgICB9CisKKyNpZmRlZiBNRU1PUllfREVCVUcKKyAgICAgIHZvc19tZW1faW5pdCgpOworI2VuZGlmCisKKyNpZmRlZiBUSU1FUl9NQU5BR0VSCisgICAgICB2b3NfdGltZXJfbWFuYWdlcl9pbml0KCk7CisjZW5kaWYKKworICAgICAgLyogUHJlb3BlbiBWT1NTIHNvIHRoYXQgaXQgaXMgcmVhZHkgdG8gc3RhcnQgYXQgbGVhc3QgU0FMICovCisgICAgICBzdGF0dXMgPSB2b3NfcHJlT3BlbigmcFZvc0NvbnRleHQpOworCisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEZhaWxlZCB0byBwcmVPcGVuIFZPU1MiLCBfX2Z1bmNfXyk7CisgICAgICAgICByZXRfc3RhdHVzID0gLTE7CisgICAgICAgICBicmVhazsKKyAgIH0KKworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICAvKiBOb3cgT3BlbiBTQUwgKi8KKyAgIHN0YXR1cyA9IFdMQU5TQUxfT3BlbihwVm9zQ29udGV4dCwgMCk7CisKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBGYWlsZWQgdG8gb3BlbiBTQUwiLCBfX2Z1bmNfXyk7CisKKyAgICAgIC8qIElmIHVuYWJsZSB0byBvcGVuLCBjbGVhbnVwIGFuZCByZXR1cm4gZmFpbHVyZSAqLworICAgICAgdm9zX3ByZUNsb3NlKCAmcFZvc0NvbnRleHQgKTsKKyAgICAgICAgIHJldF9zdGF0dXMgPSAtMTsKKyAgICAgICAgIGJyZWFrOworICAgfQorI2VuZGlmIC8vIEFOSV9CVVNfVFlQRV9TRElPCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQykgJiYgZGVmaW5lZChBTklfTUFORl9ESUFHKQorICAgICAgaWYoNSA9PSBjb25fbW9kZSkKKyAgICAgIHsKKyAgICAgICAgIGhkZF9zZXRfY29ucGFyYW0oVk9TX0ZUTV9NT0RFKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgJiYgQU5JX01BTkZfRElBRyAqLworCisgICAgICAvLyBDYWxsIG91ciBtYWluIGluaXQgZnVuY3Rpb24KKyAgICAgIGlmKGhkZF93bGFuX3N0YXJ0dXAoZGV2KSkgeworICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IFdMQU4gRHJpdmVyIEluaXRpYWxpemF0aW9uIGZhaWxlZCIsCisgICAgICAgICAgX19mdW5jX18pOworI2lmZGVmIEFOSV9CVVNfVFlQRV9TRElPCisgICAgICAgICBXTEFOU0FMX0Nsb3NlKHBWb3NDb250ZXh0KTsKKyNlbmRpZiAvLyBBTklfQlVTX1RZUEVfU0RJTworICAgICAgICAgdm9zX3ByZUNsb3NlKCAmcFZvc0NvbnRleHQgKTsKKyAgICAgICAgIHJldF9zdGF0dXMgPSAtMTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBDYW5jZWwgdGhlIHZvdGUgZm9yIFhPIENvcmUgT04KKyAgICAgICAqIFRoaXMgaXMgZG9uZSBoZXJlIGZvciBzYWZldHkgcHVycG9zZXMgaW4gY2FzZSB3ZSByZS1pbml0aWFsaXplIHdpdGhvdXQgdHVybmluZworICAgICAgICogaXQgT0ZGIGluIGFueSBlcnJvciBzY2VuYXJpby4KKyAgICAgICAqLworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkluIG1vZHVsZSBpbml0OiBFbnN1cmUgRm9yY2UgWE8gQ29yZSBpcyBPRkYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdoZW4gIFdMQU4gaXMgdHVybmVkIE9OIHNvIENvcmUgdG9nZ2xlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdW5sZXNzIHdlIGVudGVyIFBTXG4iKTsKKyAgICAgIGlmICh2b3NfY2hpcFZvdGVYT0NvcmUoTlVMTCwgTlVMTCwgTlVMTCwgVk9TX0ZBTFNFKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICB7CisgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkNvdWxkIG5vdCBjYW5jZWwgWE8gQ29yZSBPTiB2b3RlLiBOb3QgcmV0dXJuaW5nIGZhaWx1cmUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFBvd2VyIGNvbnN1bWVkIHdpbGwgYmUgaGlnaFxuIik7CisgICAgICB9CisgICB9IHdoaWxlICgwKTsKKworICAgaWYgKDAgIT0gcmV0X3N0YXR1cykKKyAgIHsKKyAgICAgIC8vQXNzZXJ0IERlZXAgc2xlZXAgc2lnbmFsIG5vdyB0byBwdXQgTGlicmEgSFcgaW4gbG93ZXN0IHBvd2VyIHN0YXRlCisgICAgICBzdGF0dXMgPSB2b3NfY2hpcEFzc2VydERlZXBTbGVlcCggTlVMTCwgTlVMTCwgTlVMTCApOworICAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMpICk7CisKKyAgICAgIC8vVm90ZSBvZmYgYW55IFBNSUMgdm9sdGFnZSBzdXBwbGllcworICAgICAgdm9zX2NoaXBQb3dlckRvd24oTlVMTCwgTlVMTCwgTlVMTCk7CisjaWZkZWYgVElNRVJfTUFOQUdFUgorICAgICAgdm9zX3RpbWVyX2V4aXQoKTsKKyNlbmRpZgorI2lmZGVmIE1FTU9SWV9ERUJVRworICAgICAgdm9zX21lbV9leGl0KCk7CisjZW5kaWYKKworICAgICAgd2FrZV9sb2NrX2Rlc3Ryb3koJndsYW5fd2FrZV9sb2NrKTsKKyAgICAgIHByX2VycigiJXM6IGRyaXZlciBsb2FkIGZhaWx1cmVcbiIsIFdMQU5fTU9EVUxFX05BTUUpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy9TZW5kIFdMQU4gVVAgaW5kaWNhdGlvbiB0byBObGluayBTZXJ2aWNlCisgICAgICBzZW5kX2J0Y19ubGlua19tc2coV0xBTl9NT0RVTEVfVVBfSU5ELCAwKTsKKworICAgICAgcHJfaW5mbygiJXM6IGRyaXZlciBsb2FkZWRcbiIsIFdMQU5fTU9EVUxFX05BTUUpOworCisgICB9CisKKyAgIEVYSVQoKTsKKworICAgcmV0dXJuIHJldF9zdGF0dXM7Cit9CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIGhkZF9tb2R1bGVfZXhpdCgpIC0gRXhpdCBmdW5jdGlvbgorCisgIFRoaXMgaXMgdGhlIGRyaXZlciBleGl0IHBvaW50IChpbnZva2VkIHdoZW4gbW9kdWxlIGlzIHVubG9hZGVkIHVzaW5nIHJtbW9kKQorCisgIFxwYXJhbSAgLSBOb25lCisKKyAgXHJldHVybiAtIE5vbmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBfX2V4aXQgaGRkX21vZHVsZV9leGl0KHZvaWQpCit7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKyAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gTlVMTDsKKyAgIGludCBhdHRlbXB0cyA9IDA7CisKKyAgIHByX2luZm8oIiVzOiB1bmxvYWRpbmcgZHJpdmVyIHYlc1xuIiwgV0xBTl9NT0RVTEVfTkFNRSwgUVdMQU5fVkVSU0lPTlNUUik7CisKKyAgIC8vR2V0IHRoZSBnbG9iYWwgdm9zIGNvbnRleHQKKyAgIHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NZUywgTlVMTCk7CisKKyAgIGlmKCFwVm9zQ29udGV4dCkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBHbG9iYWwgVk9TIGNvbnRleHQgaXMgTnVsbCIsIF9fZnVuY19fKTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgIH0KKworICAgLy9HZXQgdGhlIEhERCBjb250ZXh0LgorICAgcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfSERELCBwVm9zQ29udGV4dCApOworCisgICBpZighcEhkZEN0eCkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBtb2R1bGUgZXhpdCBjYWxsZWQgYmVmb3JlIHByb2JlIixfX2Z1bmNfXyk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICB3aGlsZShpc1dEcmVzZXRJblByb2dyZXNzKCkpeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpSZXNldCBpbiBQcm9ncmVzcyBieSBMT0dQLiBCbG9jayBybW1vZCBmb3IgNTAwbXMhISEiLF9fZnVuY19fKTsKKyAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICBtc2xlZXAoNTAwKTsKKyAgICAgICAgIGF0dGVtcHRzKys7CisgICAgICAgICBpZihhdHRlbXB0cz09TUFYX0VYSVRfQVRURU1QVFNfRFVSSU5HX0xPR1ApCisgICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgcEhkZEN0eC0+aXNMb2FkVW5sb2FkSW5Qcm9ncmVzcyA9IFRSVUU7CisgICAgICB2b3Nfc2V0X2xvYWRfdW5sb2FkX2luX3Byb2dyZXNzKFZPU19NT0RVTEVfSURfVk9TUywgVFJVRSk7CisKKyAgICAgIC8vRG8gYWxsIHRoZSBjbGVhbnVwIGJlZm9yZSBkZXJlZ2lzdGVyaW5nIHRoZSBkcml2ZXIKKyAgICAgIGhkZF93bGFuX2V4aXQocEhkZEN0eCk7CisgICB9CisKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworICAgV0xBTlNBTF9DbG9zZShwVm9zQ29udGV4dCk7CisjZW5kaWYgLy8gQU5JX0JVU19UWVBFX1NESU8KKworICAgdm9zX3ByZUNsb3NlKCAmcFZvc0NvbnRleHQgKTsKKworI2lmZGVmIFRJTUVSX01BTkFHRVIKKyAgIHZvc190aW1lcl9leGl0KCk7CisjZW5kaWYKKyNpZmRlZiBNRU1PUllfREVCVUcKKyAgIHZvc19tZW1fZXhpdCgpOworI2VuZGlmCisKK2RvbmU6CisgICB3YWtlX2xvY2tfZGVzdHJveSgmd2xhbl93YWtlX2xvY2spOworICAgcHJfaW5mbygiJXM6IGRyaXZlciB1bmxvYWRlZFxuIiwgV0xBTl9NT0RVTEVfTkFNRSk7Cit9CisKKyNpZiBkZWZpbmVkKFdMQU5fU09GVEFQX0ZFQVRVUkUpIHx8IGRlZmluZWQoQU5JX01BTkZfRElBRykKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfZ2V0X2NvbnBhcmFtKCkgLQorCisgIFRoaXMgaXMgdGhlIGRyaXZlciBleGl0IHBvaW50IChpbnZva2VkIHdoZW4gbW9kdWxlIGlzIHVubG9hZGVkIHVzaW5nIHJtbW9kKQorCisgIFxwYXJhbSAgLSBOb25lCisKKyAgXHJldHVybiAtIHRWT1NfQ09OX01PREUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0Vk9TX0NPTl9NT0RFIGhkZF9nZXRfY29ucGFyYW0gKCB2b2lkICkKK3sKKyAgICByZXR1cm4gKHRWT1NfQ09OX01PREUpY29uX21vZGU7CisKK30KK3ZvaWQgaGRkX3NldF9jb25wYXJhbSAoIHZfVUlOVF90IG5ld1BhcmFtICkKK3sKKyAgY29uX21vZGUgPSBuZXdQYXJhbTsKK30KKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfc29mdGFwX3N0YV9kZWF1dGgoKSAtIGZ1bmN0aW9uCisKKyAgVGhpcyB0byB0YWtlIGNvdW50ZXIgbWVhc3VyZSB0byBoYW5kbGUgZGVhdXRoIHJlcSBmcm9tIEhERAorCisgIFxwYXJhbSAgLSBwQWRhcHRlciAtIFBvaW50ZXIgdG8gdGhlIEhERAorCisgIFxwYXJhbSAgLSBlbmFibGUgLSBib29sZWFuIHZhbHVlCisKKyAgXHJldHVybiAtIE5vbmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaGRkX3NvZnRhcF9zdGFfZGVhdXRoKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB2X1U4X3QgKnBEZXN0TWFjQWRkcmVzcykKK3sKKyAgICB2X1U4X3QgU1RBSWQ7CisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgdEhhbEhhbmRsZSBoSGFsSGFuZGxlOworI2VuZGlmCisKKyAgICBFTlRFUigpOworCisgICAgaGRkTG9nKCBMT0dFLCAiaGRkX3NvZnRhcF9zdGFfZGVhdXRoOigweCV4LCBmYWxzZSkiLCAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCk7CisKKyAgICAvL0lnbm9yZSByZXF1ZXN0IHRvIGRlYXV0aCBiY21jIHN0YXRpb24KKyAgICBpZiggcERlc3RNYWNBZGRyZXNzWzBdICYgMHgxICkKKyAgICAgICByZXR1cm47CisKKyAgICBXTEFOU0FQX0RlYXV0aFN0YShwVm9zQ29udGV4dCxwRGVzdE1hY0FkZHJlc3MpOworCisgICAgLypHZXQgdGhlIFN0YXRpb24gSUQqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICBoSGFsSGFuZGxlID0gKHRIYWxIYW5kbGUgKSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9IQUwsIHBWb3NDb250ZXh0KTsKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PQorICAgICAgICBoYWxUYWJsZV9GaW5kU3RhaWRCeUFkZHIoaEhhbEhhbmRsZSwgKHRBTklfVTggKilwRGVzdE1hY0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU1RBSWQpKQorICAgIHsKKyAgICAgICBoZGRfc29mdGFwX0RlcmVnaXN0ZXJTVEEocEFkYXB0ZXIsIFNUQUlkKTsKKyAgICB9CisjZWxzZQorICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgPT0KKyAgICAgICAgaGRkX3NvZnRhcF9HZXRTdGFJZChwQWRhcHRlciwgKHZfTUFDQUREUl90ICopcERlc3RNYWNBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTVEFJZCkpCisgICAgeworICAgICAgaGRkX3NvZnRhcF9EZXJlZ2lzdGVyU1RBKHBBZGFwdGVyLCBTVEFJZCk7CisgICAgfQorI2VuZGlmCisKKyAgICBFWElUKCk7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfc29mdGFwX3N0YV9kaXNhc3NvYygpIC0gZnVuY3Rpb24KKworICBUaGlzIHRvIHRha2UgY291bnRlciBtZWFzdXJlIHRvIGhhbmRsZSBkZWF1dGggcmVxIGZyb20gSERECisKKyAgXHBhcmFtICAtIHBBZGFwdGVyIC0gUG9pbnRlciB0byB0aGUgSERECisKKyAgXHBhcmFtICAtIGVuYWJsZSAtIGJvb2xlYW4gdmFsdWUKKworICBccmV0dXJuIC0gTm9uZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoZGRfc29mdGFwX3N0YV9kaXNhc3NvYyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcix2X1U4X3QgKnBEZXN0TWFjQWRkcmVzcykKK3sKKyAgICAgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dDsKKworICAgIEVOVEVSKCk7CisKKyAgICBoZGRMb2coIExPR0UsICJoZGRfc29mdGFwX3N0YV9kaXNhc3NvYzooMHgleCwgZmFsc2UpIiwgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQpOworCisgICAgLy9JZ25vcmUgcmVxdWVzdCB0byBkaXNhc3NvYyBiY21jIHN0YXRpb24KKyAgICBpZiggcERlc3RNYWNBZGRyZXNzWzBdICYgMHgxICkKKyAgICAgICByZXR1cm47CisKKyAgICBXTEFOU0FQX0Rpc2Fzc29jU3RhKHBWb3NDb250ZXh0LHBEZXN0TWFjQWRkcmVzcyk7Cit9CisKK3ZvaWQgaGRkX3NvZnRhcF90a2lwX21pY19mYWlsX2NvdW50ZXJfbWVhc3VyZShoZGRfYWRhcHRlcl90ICpwQWRhcHRlcix2X0JPT0xfdCBlbmFibGUpCit7CisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dDsKKworICAgIEVOVEVSKCk7CisKKyAgICBoZGRMb2coIExPR0UsICJoZGRfc29mdGFwX3RraXBfbWljX2ZhaWxfY291bnRlcl9tZWFzdXJlOigweCV4LCBmYWxzZSkiLCAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCk7CisKKyAgICBXTEFOU0FQX1NldENvdW50ZXJNZWFzdXJlKHBWb3NDb250ZXh0LCAodl9CT09MX3QpZW5hYmxlKTsKK30KKworI2VuZGlmIC8qIFdMQU5fU09GVEFQX0ZFQVRVUkUgKi8KKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgXGJyaWVmIGhkZF9nZXRfX2NvbmN1cnJlbmN5X21vZGUoKSAtCisgKgorICoKKyAqICAgXHBhcmFtICAtIE5vbmUKKyAqCisgKiAgIFxyZXR1cm4gLSBDT05DVVJSRU5DWSBNT0RFCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFZPU19DT05DVVJSRU5DWV9NT0RFIGhkZF9nZXRfY29uY3VycmVuY3lfbW9kZSAoIHZvaWQgKQoreworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dCggVk9TX01PRFVMRV9JRF9IREQsIE5VTEwgKTsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4OworCisgICAgaWYgKE5VTEwgIT0gcFZvc0NvbnRleHQpCisgICAgeworICAgICAgIHBIZGRDdHggPSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfSERELCBwVm9zQ29udGV4dCk7CisgICAgICAgaWYgKE5VTEwgIT0gcEhkZEN0eCkKKyAgICAgICB7CisgICAgICAgICAgcmV0dXJuICh0Vk9TX0NPTkNVUlJFTkNZX01PREUpcEhkZEN0eC0+Y29uY3VycmVuY3lfbW9kZTsKKyAgICAgICB9CisgICAgfQorCisgICAgLyogd2UgYXJlIGluIGFuIGludmFsaWQgc3RhdGUgOiggKi8KKyAgICBoZGRMb2coTE9HRSwgIiVzOiBJbnZhbGlkIGNvbnRleHQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBWT1NfU1RBOworfQorCisvKiBEZWNpZGUgd2hldGhlciB0byBhbGxvdy9ub3QgdGhlIGFwcHMgcG93ZXIgY29sbGFwc2UuIAorICogQWxsb3cgYXBwcyBwb3dlciBjb2xsYXBzZSBpZiB3ZSBhcmUgaW4gY29ubmVjdGVkIHN0YXRlLgorICogaWYgbm90LCBhbGxvdyBvbmx5IGlmIHdlIGFyZSBpbiBJTVBTICAqLwordl9CT09MX3QgaGRkX2lzX2FwcHNfcG93ZXJfY29sbGFwc2VfYWxsb3dlZChoZGRfY29udGV4dF90KiBwSGRkQ3R4KQoreworICAgIHRQbWNTdGF0ZSBwbWNTdGF0ZSA9IHBtY0dldFBtY1N0YXRlKHBIZGRDdHgtPmhIYWwpOworICAgIGhkZF9jb25maWdfdCAqcENvbmZpZyA9IHBIZGRDdHgtPmNmZ19pbmk7CisgICAgaGRkX2FkYXB0ZXJfbGlzdF9ub2RlX3QgKnBBZGFwdGVyTm9kZSA9IE5VTEwsICpwTmV4dCA9IE5VTEw7IAorICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gTlVMTDsgCisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYgKFZPU19TVEFfU0FQX01PREUgPT0gaGRkX2dldF9jb25wYXJhbSgpKQorICAgICAgICByZXR1cm4gVFJVRTsKKyNlbmRpZgorCisgICAgLypsb29wIHRocm91Z2ggYWxsIGFkYXB0ZXJzLiBUQkQgZml4IGZvciBDb25jdXJyZW5jeSAqLworICAgIHN0YXR1cyA9IGhkZF9nZXRfZnJvbnRfYWRhcHRlciAoIHBIZGRDdHgsICZwQWRhcHRlck5vZGUgKTsKKyAgICB3aGlsZSAoIE5VTEwgIT0gcEFkYXB0ZXJOb2RlICYmIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMgKQorICAgIHsKKyAgICAgICAgcEFkYXB0ZXIgPSBwQWRhcHRlck5vZGUtPnBBZGFwdGVyOworICAgICAgICBpZiAoIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkKKyAgICAgICAgICB8fCAoV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChwQ29uZmlnLT5mSXNJbXBzRW5hYmxlZCB8fCBwQ29uZmlnLT5mSXNCbXBzRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgJiYgKHBtY1N0YXRlICE9IElNUFMgJiYgcG1jU3RhdGUgIT0gQk1QUworICAgICAgICAgICAgICAgICAmJiAgcG1jU3RhdGUgIT0gU1RPUFBFRCAmJiBwbWNTdGF0ZSAhPSBTVEFOREJZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gaGRkX2dldF9uZXh0X2FkYXB0ZXIgKCBwSGRkQ3R4LCBwQWRhcHRlck5vZGUsICZwTmV4dCApOworICAgICAgICBwQWRhcHRlck5vZGUgPSBwTmV4dDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgd2xhbl9oZGRfc2V0X2NvbmN1cnJlbmN5X21vZGUoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdFZPU19DT05fTU9ERSBtb2RlKQoreworICAgc3dpdGNoKG1vZGUpCisgICB7CisgICAgICAgY2FzZSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OOgorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICBjYXNlIFdMQU5fSEREX1AyUF9DTElFTlQ6CisgICAgICAgY2FzZSBXTEFOX0hERF9QMlBfR086CisjZW5kaWYKKyAgICAgICBjYXNlIFdMQU5fSEREX1NPRlRBUDoKKyAgICBwSGRkQ3R4LT5jb25jdXJyZW5jeV9tb2RlIHw9ICgxIDw8IG1vZGUpOworICAgIHBIZGRDdHgtPm5vX29mX3Nlc3Npb25zW21vZGVdKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisKKyAgIH0KKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogY29uY3VycmVuY3lfbW9kZSA9IDB4JXggTnVtYmVyb2ZTZXNzaW9ucyBmb3IgbW9kZSAlZCA9ICVkIiwKKyAgICBfX2Z1bmNfXyxwSGRkQ3R4LT5jb25jdXJyZW5jeV9tb2RlLG1vZGUscEhkZEN0eC0+bm9fb2Zfc2Vzc2lvbnNbbW9kZV0pOworfQorCisKK3ZvaWQgd2xhbl9oZGRfY2xlYXJfY29uY3VycmVuY3lfbW9kZShoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0Vk9TX0NPTl9NT0RFIG1vZGUpCit7CisgICBzd2l0Y2gobW9kZSkKKyAgIHsKKyAgICAgICBjYXNlIFdMQU5fSEREX0lORlJBX1NUQVRJT046CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgIGNhc2UgV0xBTl9IRERfUDJQX0NMSUVOVDoKKyAgICAgICBjYXNlIFdMQU5fSEREX1AyUF9HTzoKKyNlbmRpZgorICAgICAgIGNhc2UgV0xBTl9IRERfU09GVEFQOgorICAgIHBIZGRDdHgtPm5vX29mX3Nlc3Npb25zW21vZGVdLS07CisgICAgaWYgKCEocEhkZEN0eC0+bm9fb2Zfc2Vzc2lvbnNbbW9kZV0pKQorICAgICAgICAgICAgcEhkZEN0eC0+Y29uY3VycmVuY3lfbW9kZSAmPSAofigxIDw8IG1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgIH0KKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogY29uY3VycmVuY3lfbW9kZSA9IDB4JXggTnVtYmVyb2ZTZXNzaW9ucyBmb3IgbW9kZSAlZCA9ICVkIiwKKyAgICBfX2Z1bmNfXyxwSGRkQ3R4LT5jb25jdXJyZW5jeV9tb2RlLG1vZGUscEhkZEN0eC0+bm9fb2Zfc2Vzc2lvbnNbbW9kZV0pOworfQorCisvL1JlZ2lzdGVyIHRoZSBtb2R1bGUgaW5pdC9leGl0IGZ1bmN0aW9ucworbW9kdWxlX2luaXQoaGRkX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGhkZF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BVVRIT1IoIlF1YWxjb21tIEF0aGVyb3MsIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV0xBTiBIT1NUIERFVklDRSBEUklWRVIiKTsKKworI2lmIGRlZmluZWQoV0xBTl9TT0ZUQVBfRkVBVFVSRSkgfHwgZGVmaW5lZChBTklfTUFORl9ESUFHKQorbW9kdWxlX3BhcmFtKGNvbl9tb2RlLCBpbnQsIDApOworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL0hERC9zcmMvd2xhbl9oZGRfbWliLmMgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfbWliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkYmFiMgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF9taWIuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9pbmNsdWRlcy5oIgorCisKK3N0YXRpYyBpbmxpbmUgdl9WT0lEX3QgbWliR2V0RG90MTFEZXNpcmVkQnNzVHlwZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZSAqcERvdDExRGVzaXJlZEJzc1R5cGUgKQoreworICAgICpwRG90MTFEZXNpcmVkQnNzVHlwZSA9IHBBZGFwdGVyLT5oZGRfbWliLm1pYkRvdDExRGVzaXJlZEJzc1R5cGU7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIFZPU19TVEFUVVMgbWliU2V0RG90MTFEZXNpcmVkQnNzVHlwZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZSBtaWJEb3QxMURlc2lyZWRCc3NUeXBlICkKK3sKKyAgICBwQWRhcHRlci0+aGRkX21pYi5taWJEb3QxMURlc2lyZWRCc3NUeXBlID0gbWliRG90MTFEZXNpcmVkQnNzVHlwZTsKKyAgICByZXR1cm4oIFZPU19TVEFUVVNfU1VDQ0VTUyApOworfQorCit2X0JPT0xfdCBtaWJJc0RvdDExRGVzaXJlZEJzc1R5cGVJbmZyYXN0cnVjdHVyZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreworICAgIGVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZSBtaWJEb3QxMURlc2lyZWRCc3NUeXBlOyAKKyAgICBtaWJHZXREb3QxMURlc2lyZWRCc3NUeXBlKCBwQWRhcHRlciwgJm1pYkRvdDExRGVzaXJlZEJzc1R5cGUgKTsKKyAgICAKKyAgICByZXR1cm4oIGVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZV9pbmZyYXN0cnVjdHVyZSA9PSBtaWJEb3QxMURlc2lyZWRCc3NUeXBlICk7ICAgCit9CisKKworc3RhdGljIGlubGluZSB2X0JPT0xfdCBtaWJJc0RvdDExRGVzaXJlZEJzc1R5cGVJbmRlcGVuZGVudCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreworICAgIGVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZSBtaWJEb3QxMURlc2lyZWRCc3NUeXBlOyAKKyAgICBtaWJHZXREb3QxMURlc2lyZWRCc3NUeXBlKCBwQWRhcHRlciwgJm1pYkRvdDExRGVzaXJlZEJzc1R5cGUgKTsKKyAgICAKKyAgICByZXR1cm4oIGVNaWJfZG90MTFEZXNpcmVkQnNzVHlwZV9pbmRlcGVuZGVudCA9PSBtaWJEb3QxMURlc2lyZWRCc3NUeXBlICk7ICAgCit9CisKK3N0YXRpYyBpbmxpbmUgdl9WT0lEX3QgbWliR2V0RG90MTFJYnNzSm9pbk9ubHkoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB2X0JPT0xfdCAqcGRvdDExSWJzc0pvaW5Pbmx5ICkKK3sKKyAgICAqcGRvdDExSWJzc0pvaW5Pbmx5ID0gcEFkYXB0ZXItPmhkZF9taWIuZG90MTFJYnNzSm9pbk9ubHk7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIFZPU19TVEFUVVMgbWliU2V0RG90MTFJYnNzSm9pbk9ubHkoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB2X0JPT0xfdCBkb3QxMUlic3NKb2luT25seSApCit7CisgICAgcEFkYXB0ZXItPmhkZF9taWIuZG90MTFJYnNzSm9pbk9ubHkgPSBkb3QxMUlic3NKb2luT25seTsKKyAgICByZXR1cm4oIFZPU19TVEFUVVNfU1VDQ0VTUyApOworfQorCitzdGF0aWMgaW5saW5lIFZPU19TVEFUVVMgbWliU2V0RG90MTFOSUNQb3dlclN0YXRlKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgZU1pYl9kb3QxMU5JQ1Bvd2VyU3RhdGUgKnBNaWJEb3QxMU5JQ1Bvd2VyU3RhdGUgKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICAgcEFkYXB0ZXItPmhkZF9taWIubWliRG90MTFOSUNQb3dlclN0YXRlID0gKnBNaWJEb3QxMU5JQ1Bvd2VyU3RhdGU7CisgICAgCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworc3RhdGljIGlubGluZSBWT1NfU1RBVFVTIG1pYlNldERvdDExTklDUG93ZXJTdGF0ZU9mZiggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreworICAgIGVNaWJfZG90MTFOSUNQb3dlclN0YXRlIGRvdDExTklDUG93ZXJTdGF0ZSA9IGVNaWJfZG90MTFOSUNQb3dlclN0YXRlX09GRjsKKyAgICByZXR1cm4oIG1pYlNldERvdDExTklDUG93ZXJTdGF0ZSggcEFkYXB0ZXIsICZkb3QxMU5JQ1Bvd2VyU3RhdGUgKSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWliR2V0RG90MTFOSUNQb3dlclN0YXRlKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgZU1pYl9kb3QxMU5JQ1Bvd2VyU3RhdGUgKnBNaWJEb3QxMU5JQ1Bvd2VyU3RhdGUgKQoreworICAgICpwTWliRG90MTFOSUNQb3dlclN0YXRlID0gcEFkYXB0ZXItPmhkZF9taWIubWliRG90MTFOSUNQb3dlclN0YXRlOworICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2X0JPT0xfdCBtaWJJc0RvdDExTklDUG93ZXJTdGF0ZU9uKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApCit7CisgICAgZU1pYl9kb3QxMU5JQ1Bvd2VyU3RhdGUgZG90MTFOSUNQb3dlclN0YXRlOworCisgICAgbWliR2V0RG90MTFOSUNQb3dlclN0YXRlKCBwQWRhcHRlciwgJmRvdDExTklDUG93ZXJTdGF0ZSApOworICAgIAorICAgIHJldHVybiggZU1pYl9kb3QxMU5JQ1Bvd2VyU3RhdGVfT04gPT0gZG90MTFOSUNQb3dlclN0YXRlICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdl9CT09MX3QgbWliSXNEb3QxMU5JQ1Bvd2VyU3RhdGVPZmYoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICkKK3sKKyAgICByZXR1cm4oICFtaWJJc0RvdDExTklDUG93ZXJTdGF0ZU9uKCBwQWRhcHRlciApICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9TX1NUQVRVUyBtaWJTZXREb3QxMURlc2lyZWRTc2lkTGlzdCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHNNaWJfZG90MTFEZXNpcmVkU3NpZExpc3QgKnBEb3QxMURlc2lyZWRTc2lkTGlzdCApCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIAorICAgIGlmICggcERvdDExRGVzaXJlZFNzaWRMaXN0LT5jRW50cmllcyA+IE1JQl9ET1QxMV9ERVNJUkVEX1NTSURfTElTVF9NQVhfQ09VTlQgKQorCisgICAgICAgIHBBZGFwdGVyLT5oZGRfbWliLm1pYkRvdDExRGVzaXJlZFNzaWRMaXN0ID0gKnBEb3QxMURlc2lyZWRTc2lkTGlzdCA7CisgICAgICAgICAgICAgIAorICAgIHJldHVybiggc3RhdHVzICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9TX1NUQVRVUyBtaWJTZXREb3QxMURlc2lyZWRCc3NpZExpc3QoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBzTWliX2RvdDExRGVzaXJlZEJzc2lkTGlzdCAqcERvdDExRGVzaXJlZEJzc2lkTGlzdCApCit7ICAgCisgICAgcEFkYXB0ZXItPmhkZF9taWIubWliRG90MTFEZXNpcmVkQnNzaWRMaXN0ID0gKnBEb3QxMURlc2lyZWRCc3NpZExpc3Q7CisgICAgCisgICAgcmV0dXJuKCBWT1NfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZfVk9JRF90IG1pYkdldERvdDExRGVzaXJlZEJzc2lkTGlzdCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHNNaWJfZG90MTFEZXNpcmVkQnNzaWRMaXN0ICpwTWliRG90MTFEZXNpcmVkQnNzaWRMaXN0ICkKK3sKKyAgICAqcE1pYkRvdDExRGVzaXJlZEJzc2lkTGlzdCA9IHBBZGFwdGVyLT5oZGRfbWliLm1pYkRvdDExRGVzaXJlZEJzc2lkTGlzdDsKKyAgICAKKyAgICByZXR1cm47Cit9CisKKworc3RhdGljIGlubGluZSB2X1ZPSURfdCBtaWJHZXREb3QxMURlc2lyZWRTc2lkTGlzdCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHNNaWJfZG90MTFEZXNpcmVkU3NpZExpc3QgKnBNaWJEb3QxMURlc2lyZWRTc2lkTGlzdCApCit7CisgICAgKnBNaWJEb3QxMURlc2lyZWRTc2lkTGlzdCA9IHBBZGFwdGVyLT5oZGRfbWliLm1pYkRvdDExRGVzaXJlZFNzaWRMaXN0OworICAgIAorICAgIHJldHVybjsKK30KKworCitzdGF0aWMgaW5saW5lIFZPU19TVEFUVVMgbWliU2V0RG90MTFBdXRvQ29uZmlnRW5hYmxlZCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGVNaWJfZG90MTFBdXRvQ29uZmlnRW5hYmxlZCAqcE1pYkRvdDExQXV0b0NvbmZpZ0VuYWJsZWQgKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICAgcEFkYXB0ZXItPmhkZF9taWIubWliRG90MTFBdXRvQ29uZmlnRW5hYmxlZCA9ICpwTWliRG90MTFBdXRvQ29uZmlnRW5hYmxlZDsKKyAgICAKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorCisKK3N0YXRpYyBpbmxpbmUgdl9WT0lEX3QgbWliR2V0RG90MTFBdXRvQ29uZmlnRW5hYmxlZCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGVNaWJfZG90MTFBdXRvQ29uZmlnRW5hYmxlZCAqcE1pYkRvdDExQXV0b0NvbmZpZ0VuYWJsZWQgKQoreworICAgICpwTWliRG90MTFBdXRvQ29uZmlnRW5hYmxlZCA9IHBBZGFwdGVyLT5oZGRfbWliLm1pYkRvdDExQXV0b0NvbmZpZ0VuYWJsZWQ7CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIFZPU19TVEFUVVMgbWliU2V0RG90MTFNYWNFeGNsdWRlTGlzdCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHNNaWJfZG90MTFNYWNFeGNsdWRlTGlzdCAqcERvdDExTWFjRXhjbHVkZUxpc3QgKQoreworICAgIHBBZGFwdGVyLT5oZGRfbWliLm1pYkRvdDExTWFjRXhjbHVkZUxpc3QgPSAqcERvdDExTWFjRXhjbHVkZUxpc3Q7CisgICAgCisgICAgcmV0dXJuKCBWT1NfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKworc3RhdGljIGlubGluZSBWT1NfU1RBVFVTIG1pYkdldERvdDExTWFjRXhjbHVkZUxpc3QoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBzTWliX2RvdDExTWFjRXhjbHVkZUxpc3QgKnBEb3QxMU1hY0V4Y2x1ZGVMaXN0ICkKK3sKKyAgICAqcERvdDExTWFjRXhjbHVkZUxpc3QgPSAgcEFkYXB0ZXItPmhkZF9taWIubWliRG90MTFNYWNFeGNsdWRlTGlzdDsKKworICAgIHJldHVybiggVk9TX1NUQVRVU19TVUNDRVNTICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtaWJTZXREZWZhdWx0RG90MTFNYWNFeGNsdWRlTGlzdCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreworICAgIHBBZGFwdGVyLT5oZGRfbWliLm1pYkRvdDExTWFjRXhjbHVkZUxpc3QuY0VudHJpZXMgPSAwOworfQorCitzdGF0aWMgaW5saW5lIFZPU19TVEFUVVMgbWliU2V0RG90MTFIYXJkd2FyZVBIWVN0YXRlKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgZU1pYl9kb3QxMUhhcmR3YXJlUEhZU3RhdGUgKnBNaWJEb3QxMUhhcmR3YXJlUEhZU3RhdGUgKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIAorICAgIHBBZGFwdGVyLT5oZGRfbWliLm1pYkRvdDExSGFyZHdhcmVQSFlTdGF0ZSA9ICpwTWliRG90MTFIYXJkd2FyZVBIWVN0YXRlOworICAgIAorICAgIHJldHVybiggc3RhdHVzICk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIG1pYkdldERvdDExSGFyZHdhcmVQSFlTdGF0ZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIGVNaWJfZG90MTFIYXJkd2FyZVBIWVN0YXRlICpwTWliRG90MTFIYXJkd2FyZVBIWVN0YXRlICkKK3sKKyAgICAqcE1pYkRvdDExSGFyZHdhcmVQSFlTdGF0ZSA9IHBBZGFwdGVyLT5oZGRfbWliLm1pYkRvdDExSGFyZHdhcmVQSFlTdGF0ZTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtaWJTZXREZWZhdWx0RG90MTFQcml2YWN5RXhlbXB0aW9uTGlzdCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreworICAgIHBBZGFwdGVyLT5oZGRfbWliLm1pYkRvdDExUHJpdmFjeUV4ZW1wdGlvbkxpc3QuY0VudHJpZXMgPSAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtaWJHZXREb3QxMVBvd2VyU2F2aW5nTGV2ZWwoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCBlTWliX2RvdDExUG93ZXJTYXZpbmdMZXZlbCAqcE1pYkRvdDExUG93ZXJTYXZpbmdMZXZlbCApCit7CisgICAgKnBNaWJEb3QxMVBvd2VyU2F2aW5nTGV2ZWwgPSBwQWRhcHRlci0+aGRkX21pYi5taWJEb3QxMVBvd2VyU2F2aW5nTGV2ZWw7CisgICAgCisgICAgcmV0dXJuOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtaWJHZXREZXZpY2VQb3dlclN0YXRlKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgZU1pYl9EZXZpY2VQb3dlclN0YXRlICpwTWliRGV2aWNlUG93ZXJTdGF0ZSApCit7CisgICAgKnBNaWJEZXZpY2VQb3dlclN0YXRlID0gcEFkYXB0ZXItPmhkZF9taWIubWliRGV2aWNlUG93ZXJTdGF0ZTsKKworICAgIHJldHVybjsKK30KKworCmRpZmYgLS1naXQgYS9DT1JFL0hERC9zcmMvd2xhbl9oZGRfcDJwLmMgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfcDJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhOTIyYwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF9wMnAuYwpAQCAtMCwwICsxLDEyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBcZmlsZSAgd2xhbl9oZGRfcDJwLmMKKworICBcYnJpZWYgV0xBTiBIb3N0IERldmljZSBEcml2ZXIgaW1wbGVtZW50YXRpb24gZm9yIFAyUCBjb21tYW5kcyBpbnRlcmZhY2UKKworICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorCisjaW5jbHVkZSA8d2xhbl9oZGRfaW5jbHVkZXMuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9ob3N0YXBkLmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisjaW5jbHVkZSAic21lX0FwaS5oIgorI2luY2x1ZGUgIndsYW5faGRkX3AycC5oIgorI2luY2x1ZGUgInNhcEFwaS5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CisKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0X29wc19zdHJ1Y3Q7CisKK3N0YXRpYyBpbnQgaGRkX3dsYW5fYWRkX3J4X3JhZGlvdGFwX2hkciggc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ0YXBfbGVuLCBpbnQgZmxhZyApOworCitzdGF0aWMgdm9pZCBoZGRfd2xhbl90eF9jb21wbGV0ZSggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX2NmZzgwMjExX3N0YXRlX3QqIGNmZ1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfQk9PTEVBTiBhY3Rpb25TZW5kU3VjY2VzcyApOworCitzdGF0aWMgdm9pZCBoZGRfc2VuZE1nbXRGcmFtZU92ZXJNb25pdG9ySWZhY2UoIGhkZF9hZGFwdGVyX3QgKnBNb25BZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuRnJhbWVMZW5ndGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4KiBwYkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBmcmFtZVR5cGUgKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKK2VIYWxTdGF0dXMgd2xhbl9oZGRfcmVtYWluX29uX2NoYW5uZWxfY2FsbGJhY2soIHRIYWxIYW5kbGUgaEhhbCwgdm9pZCogcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVIYWxTdGF0dXMgc3RhdHVzICkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IChoZGRfYWRhcHRlcl90KikgcEN0eDsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWCggcEFkYXB0ZXIgKTsKKyAgICBoZGRfY2ZnODAyMTFfc3RhdGVfdCAqY2ZnU3RhdGUgPSBXTEFOX0hERF9HRVRfQ0ZHX1NUQVRFX1BUUiggcEFkYXB0ZXIgKTsKKyAgICBoZGRfcmVtYWluX29uX2NoYW5fY3R4X3QgKnBSZW1haW5DaGFuQ3R4ID0gY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eDsKKworICAgIGlmKCBwUmVtYWluQ2hhbkN0eCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgaGRkTG9nKCBMT0dXLAorICAgICAgICAgICIlczogTm8gUmVtIG9uIGNoYW5uZWwgcGVuZGluZyBmb3Igd2hpY2ggUnNwIGlzIHJlY2VpdmVkIiwgX19mdW5jX18pOworICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIGhkZExvZyggTE9HMSwgIlJlY2VpdmVkIHJlbWFpbiBvbiBjaGFubmVsIHJzcCIpOworCisgICAgY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eCA9IE5VTEw7CisKKyAgICBpZiggUkVNQUlOX09OX0NIQU5ORUxfUkVRVUVTVCA9PSBwUmVtYWluQ2hhbkN0eC0+cmVtX29uX2NoYW5fcmVxdWVzdCApCisgICAgeworICAgICAgICBpZiggY2ZnU3RhdGUtPmJ1ZiApCisgICAgICAgIHsKKyAgICAgICAgICAgaGRkTG9nKCBMT0dQLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6IFdlIG5lZWQgdG8gcmVjZWl2ZSB5ZXQgYW4gYWNrIGZyb20gb25lIG9mIHR4IHBhY2tldCIsCisgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICB9CisgICAgICAgIGNmZzgwMjExX3JlbWFpbl9vbl9jaGFubmVsX2V4cGlyZWQoIHBSZW1haW5DaGFuQ3R4LT5kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluQ2hhbkN0eC0+Y29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZW1haW5DaGFuQ3R4LT5jaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbkNoYW5DdHgtPmNoYW5fdHlwZSwgR0ZQX0tFUk5FTCApOworICAgIH0KKworICAgIHZvc19tZW1fZnJlZSggcFJlbWFpbkNoYW5DdHggKTsKKworICAgIGlmICggKCBXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSApIHx8CisgICAgICAgICAoIFdMQU5fSEREX1AyUF9DTElFTlQgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkKKyAgICAgICApCisgICAgeworICAgICAgICB0QU5JX1U4IHNlc3Npb25JZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisgICAgICAgIGlmIChwSGRkQ3R4LT5jZmdfaW5pLT5pc1AycERldmljZUFkZHJBZG1pbmlzdHJhdGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBwQWRhcHRlci0+cDJwU2Vzc2lvbklkOworICAgICAgICB9CisgICAgICAgIHNtZV9EZXJlZ2lzdGVyTWdtdEZyYW1lKAorICAgICAgICAgICAgICAgICAgIGhIYWwsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAoU0lSX01BQ19NR01UX0ZSQU1FIDw8IDIpIHwgKCBTSVJfTUFDX01HTVRfUFJPQkVfUkVRIDw8IDQpLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCAwICk7CisgICAgfQorICAgIGVsc2UgaWYgKCAoIFdMQU5fSEREX1NPRlRBUD09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSApIHx8CisgICAgICAgICAgICAgICggV0xBTl9IRERfUDJQX0dPID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSApCisgICAgICAgICAgICApCisgICAgeworICAgICAgICBXTEFOU0FQX0RlUmVnaXN0ZXJNZ210RnJhbWUoCisgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgKFNJUl9NQUNfTUdNVF9GUkFNRSA8PCAyKSB8ICggU0lSX01BQ19NR01UX1BST0JFX1JFUSA8PCA0KSwKKyAgICAgICAgICAgICAgICBOVUxMLCAwICk7CisgICAgfQorCisgICAgY29tcGxldGUoJnBBZGFwdGVyLT5jYW5jZWxfcmVtX29uX2NoYW5fdmFyKTsKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCB3bGFuX2hkZF9yZXF1ZXN0X3JlbWFpbl9vbl9jaGFubmVsKCBzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHVyYXRpb24sIHU2NCAqY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1fb25fY2hhbm5lbF9yZXF1ZXN0X3R5cGVfdCByZXF1ZXN0X3R5cGUgKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgoIHBBZGFwdGVyICk7CisgICAgaGRkX3JlbWFpbl9vbl9jaGFuX2N0eF90ICpwUmVtYWluQ2hhbkN0eDsKKyAgICBoZGRfY2ZnODAyMTFfc3RhdGVfdCAqY2ZnU3RhdGUgPSBXTEFOX0hERF9HRVRfQ0ZHX1NUQVRFX1BUUiggcEFkYXB0ZXIgKTsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogZGV2aWNlX21vZGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyxwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworCisgICAgaGRkTG9nKCBMT0cxLAorICAgICAgICAiY2hhbihod192YWwpMHgleCBjaGFuKGNlbnRlcmZyZXEpICVkIGNoYW4gdHlwZSAweCV4LCBkdXJhdGlvbiAlZCIsCisgICAgICAgIGNoYW4tPmh3X3ZhbHVlLCBjaGFuLT5jZW50ZXJfZnJlcSwgY2hhbm5lbF90eXBlLCBkdXJhdGlvbiApOworCisgICAgaWYoIGNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFdhaXQgdGlsbCByZW1haW4gb24gY2hhbm5lbCByZWFkeSBpbmRpY2F0aW9uIGJlZm9yZSBpc3N1aW5nIGNhbmNlbCAKKyAgICAgICAgICogcmVtYWluIG9uIGNoYW5uZWwgcmVxdWVzdCwgb3RoZXJ3aXNlIGlmIHJlbWFpbiBvbiBjaGFubmVsIG5vdCAKKyAgICAgICAgICogcmVjZWl2ZWQgYW5kIGlmIHRoZSBkcml2ZXIgaXNzdWVzIGNhbmNlbCByZW1haW4gb24gY2hhbm5lbCB0aGVuIGxpbSAKKyAgICAgICAgICogd2lsbCBiZSBpbiB1bmtub3duIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBBZGFwdGVyLT5yZW1fb25fY2hhbl9yZWFkeV9ldmVudCwKKyAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0FJVF9SRU1fQ0hBTl9SRUFEWSkpOworICAgICAgICBpZiAoIXN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKCBMT0dFLCAKKyAgICAgICAgICAgICAgICAgICAgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIHJlbWFpbiBvbiBjaGFubmVsIHJlYWR5IGluZGljYXRpb24iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIH0KKworICAgICAgICBJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPmNhbmNlbF9yZW1fb25fY2hhbl92YXIpOworICAgICAgICAKKyAgICAgICAgLyogSXNzdWUgYWJvcnQgcmVtYWluIG9uIGNoYW4gcmVxdWVzdCB0byBzbWUuCisgICAgICAgICAqIFRoZSByZW1haW4gb24gY2hhbm5lbCBjYWxsYmFjayB3aWxsIG1ha2Ugc3VyZSB0aGUgcmVtYWluX29uX2NoYW4KKyAgICAgICAgICogZXhwaXJlZCBldmVudCBpcyBzZW50LgorICAgICAgICAqLworICAgICAgICBpZiAoICggV0xBTl9IRERfSU5GUkFfU1RBVElPTiA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKSB8fAorICAgICAgICAgICAgICggV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtZV9DYW5jZWxSZW1haW5PbkNoYW5uZWwoIFdMQU5fSEREX0dFVF9IQUxfQ1RYKCBwQWRhcHRlciApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChXTEFOX0hERF9TT0ZUQVA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfUDJQX0dPID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIFdMQU5TQVBfQ2FuY2VsUmVtYWluT25DaGFubmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnB2b3NDb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBBZGFwdGVyLT5jYW5jZWxfcmVtX29uX2NoYW5fdmFyLAorICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXQUlUX0NBTkNFTF9SRU1fQ0hBTikpOworICAgIH0KKworICAgIC8qIFdoZW4gUDJQLUdPIGFuZCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVubG9hZCB0aGUgZHJpdmVyIHRoZW4gCisgICAgICogd2xhbiBkcml2ZXIgaXMga2VlcCBvbiByZWNlaXZpbmcgdGhlIHJlbWFpbiBvbiBjaGFubmVsIGNvbW1hbmQKKyAgICAgKiBhbmQgd2hpY2ggaXMgcmVzdWx0aW5nIGluIGNyYXNoLiBTbyBub3QgYWxsb3dpbmcgYW55IHJlbWFpbiBvbiAKKyAgICAgKiBjaGFubmVsIHJlcXVldHMgd2hlbiBMb2FkL1VubG9hZCBpcyBpbiBwcm9ncmVzcyovCisgICAgaWYgKCgoaGRkX2NvbnRleHRfdCopcEFkYXB0ZXItPnBIZGRDdHgpLT5pc0xvYWRVbmxvYWRJblByb2dyZXNzKQorICAgIHsKKyAgICAgICAgaGRkTG9nKCBMT0dFLAorICAgICAgICAgICAgICAgICIlczogV2xhbiBMb2FkL1VubG9hZCBpcyBpbiBwcm9ncmVzcyIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisKKyAgICBwUmVtYWluQ2hhbkN0eCA9IHZvc19tZW1fbWFsbG9jKCBzaXplb2YoaGRkX3JlbWFpbl9vbl9jaGFuX2N0eF90KSApOworICAgIGlmKCBOVUxMID09IHBSZW1haW5DaGFuQ3R4ICkKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIENoYW5uZWwgY29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgICAgdm9zX21lbV9jb3B5KCAmcFJlbWFpbkNoYW5DdHgtPmNoYW4sIGNoYW4sCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCkgKTsKKworICAgIHBSZW1haW5DaGFuQ3R4LT5jaGFuX3R5cGUgPSBjaGFubmVsX3R5cGU7CisgICAgcFJlbWFpbkNoYW5DdHgtPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgcFJlbWFpbkNoYW5DdHgtPmRldiA9IGRldjsKKyAgICAqY29va2llID0gKHRBTklfVTMyKSBwUmVtYWluQ2hhbkN0eDsKKyAgICBwUmVtYWluQ2hhbkN0eC0+Y29va2llID0gKmNvb2tpZTsKKyAgICBwUmVtYWluQ2hhbkN0eC0+cmVtX29uX2NoYW5fcmVxdWVzdCA9IHJlcXVlc3RfdHlwZTsKKyAgICBjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4ID0gcFJlbWFpbkNoYW5DdHg7CisgICAgY2ZnU3RhdGUtPmN1cnJlbnRfZnJlcSA9IGNoYW4tPmNlbnRlcl9mcmVxOworICAgIAorICAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+cmVtX29uX2NoYW5fcmVhZHlfZXZlbnQpOworCisgICAgLy9jYWxsIHNtZSBBUEkgdG8gc3RhcnQgcmVtYWluIG9uIGNoYW5uZWwuCisgICAgaWYgKCAoIFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkgfHwKKyAgICAgICAgICggV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorICAgICAgICkKKyAgICB7CisgICAgICAgIHRBTklfVTggc2Vzc2lvbklkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsgCisgICAgICAgIGlmIChwSGRkQ3R4LT5jZmdfaW5pLT5pc1AycERldmljZUFkZHJBZG1pbmlzdHJhdGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBwQWRhcHRlci0+cDJwU2Vzc2lvbklkOworICAgICAgICB9CisgICAgICAgIC8vY2FsbCBzbWUgQVBJIHRvIHN0YXJ0IHJlbWFpbiBvbiBjaGFubmVsLgorICAgICAgICBzbWVfUmVtYWluT25DaGFubmVsKAorICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhbi0+aHdfdmFsdWUsIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICB3bGFuX2hkZF9yZW1haW5fb25fY2hhbm5lbF9jYWxsYmFjaywgcEFkYXB0ZXIgKTsKKworICAgICAgICBzbWVfUmVnaXN0ZXJNZ210RnJhbWUoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCAoU0lSX01BQ19NR01UX0ZSQU1FIDw8IDIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTSVJfTUFDX01HTVRfUFJPQkVfUkVRIDw8IDQpLCBOVUxMLCAwICk7CisKKyAgICB9CisgICAgZWxzZSBpZiAoICggV0xBTl9IRERfU09GVEFQPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkgfHwKKyAgICAgICAgICAgICAgKCBXTEFOX0hERF9QMlBfR08gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkKKyAgICAgICAgICAgICkKKyAgICB7CisgICAgICAgIC8vY2FsbCBzbWUgQVBJIHRvIHN0YXJ0IHJlbWFpbiBvbiBjaGFubmVsLgorICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBXTEFOU0FQX1JlbWFpbk9uQ2hhbm5lbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4tPmh3X3ZhbHVlLCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2xhbl9oZGRfcmVtYWluX29uX2NoYW5uZWxfY2FsbGJhY2ssIHBBZGFwdGVyICkpCisKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICIlczogV0xBTlNBUF9SZW1haW5PbkNoYW5uZWwgcmV0dXJuZWQgZmFpbCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eCA9IE5VTEw7CisgICAgICAgICAgIHZvc19tZW1fZnJlZSAocFJlbWFpbkNoYW5DdHgpOyAgICAgICAgICAgICAKKyAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IFdMQU5TQVBfUmVnaXN0ZXJNZ210RnJhbWUoCisgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnB2b3NDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAoU0lSX01BQ19NR01UX0ZSQU1FIDw8IDIpIHwgKCBTSVJfTUFDX01HTVRfUFJPQkVfUkVRIDw8IDQpLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCAwICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBXTEFOU0FQX1JlZ2lzdGVyTWdtdEZyYW1lIHJldHVybmVkIGZhaWwiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBXTEFOU0FQX0NhbmNlbFJlbWFpbk9uQ2hhbm5lbCgKKyAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgIH0KKyAgICByZXR1cm4gMDsKKworfQorCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfcmVtYWluX29uX2NoYW5uZWwoIHN0cnVjdCB3aXBoeSAqd2lwaHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkdXJhdGlvbiwgdTY0ICpjb29raWUgKQoreworICAgIHJldHVybiB3bGFuX2hkZF9yZXF1ZXN0X3JlbWFpbl9vbl9jaGFubmVsKHdpcGh5LCBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbiwgY2hhbm5lbF90eXBlLCBkdXJhdGlvbiwgY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTUFJTl9PTl9DSEFOTkVMX1JFUVVFU1QpOworfQorCit2b2lkIGhkZF9yZW1haW5DaGFuUmVhZHlIYW5kbGVyKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApCit7CisgICAgaGRkX2NmZzgwMjExX3N0YXRlX3QgKmNmZ1N0YXRlID0gV0xBTl9IRERfR0VUX0NGR19TVEFURV9QVFIoIHBBZGFwdGVyICk7CisgICAgaGRkX3JlbWFpbl9vbl9jaGFuX2N0eF90KiBwUmVtYWluQ2hhbkN0eCA9IGNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHg7CisKKyAgICBoZGRMb2coIExPRzEsICJSZWFkeSBvbiBjaGFuIGluZCIpOworCisgICAgaWYoIHBSZW1haW5DaGFuQ3R4ICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgaWYoIFJFTUFJTl9PTl9DSEFOTkVMX1JFUVVFU1QgPT0gcFJlbWFpbkNoYW5DdHgtPnJlbV9vbl9jaGFuX3JlcXVlc3QgKQorICAgICAgICB7CisgICAgICAgICAgICBjZmc4MDIxMV9yZWFkeV9vbl9jaGFubmVsKCBwQWRhcHRlci0+ZGV2LCAodEFOSV9VMzIpcFJlbWFpbkNoYW5DdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZW1haW5DaGFuQ3R4LT5jaGFuLCBwUmVtYWluQ2hhbkN0eC0+Y2hhbl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5DaGFuQ3R4LT5kdXJhdGlvbiwgR0ZQX0tFUk5FTCApOworICAgICAgICB9CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorICAgICAgICBlbHNlIGlmKCBPRkZfQ0hBTk5FTF9BQ1RJT05fVFggPT0gcFJlbWFpbkNoYW5DdHgtPnJlbV9vbl9jaGFuX3JlcXVlc3QgKQorICAgICAgICB7CisgICAgICAgICAgICBjb21wbGV0ZSgmcEFkYXB0ZXItPm9mZmNoYW5uZWxfdHhfZXZlbnQpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgY29tcGxldGUoJnBBZGFwdGVyLT5yZW1fb25fY2hhbl9yZWFkeV9ldmVudCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhkZExvZyggTE9HVywgIiVzOiBObyBQZW5kaW5nIFJlbWFpbiBvbiBjaGFubmVsIFJlcXVlc3QiLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIHJldHVybjsKK30KKworaW50IHdsYW5faGRkX2NmZzgwMjExX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbCggc3RydWN0IHdpcGh5ICp3aXBoeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTY0IGNvb2tpZSApCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWCggcEFkYXB0ZXIgKTsKKyAgICBoZGRfY2ZnODAyMTFfc3RhdGVfdCAqY2ZnU3RhdGUgPSBXTEFOX0hERF9HRVRfQ0ZHX1NUQVRFX1BUUiggcEFkYXB0ZXIgKTsKKyAgICBpbnQgc3RhdHVzID0gMDsKKworICAgIGhkZExvZyggTE9HMSwgIkNhbmNlbCByZW1haW4gb24gY2hhbm5lbCByZXEiKTsKKworICAgIC8qIEZJWE1FIGNhbmNlbCBjdXJyZW50bHkgcnVubmluZyByZW1haW4gb24gY2hhbi4KKyAgICAgKiBOZWVkIHRvIGNoZWNrIGNvb2tpZSBhbmQgY2FuY2VsIGFjY29yZGluZ2x5CisgICAgICovCisgICAgaWYoIChjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4ID09IE5VTEwpIHx8CisgICAgICAgIChjZmdTdGF0ZS0+cmVtYWluX29uX2NoYW5fY3R4LT5jb29raWUgIT0gY29va2llKSApCisgICAgeworICAgICAgICBoZGRMb2coIExPR0UsCisgICAgICAgICAgICAiJXM6IE5vIFJlbWFpbiBvbiBjaGFubmVsIHBlbmRpbmcgd2l0aCBzcGVjaWZpZWQgY29va2llIHZhbHVlIiwKKyAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICAKKyAgICAvKiB3YWl0IHVudGlsIHJlbWFpbiBvbiBjaGFubmVsIHJlYWR5IGV2ZW50IHJlY2VpdmVkIAorICAgICAqIGZvciBhbHJlYWR5IGlzc3VlZCByZW1haW4gb24gY2hhbm5lbCByZXF1ZXN0ICovCisgICAgc3RhdHVzID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnBBZGFwdGVyLT5yZW1fb25fY2hhbl9yZWFkeV9ldmVudCwKKyAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0FJVF9SRU1fQ0hBTl9SRUFEWSkpOworICAgIGlmICghc3RhdHVzKQorICAgIHsKKyAgICAgICAgaGRkTG9nKCBMT0dFLCAKKyAgICAgICAgICAgICAgICAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgcmVtYWluIG9uIGNoYW5uZWwgcmVhZHkgaW5kaWNhdGlvbiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgIH0KKyAgICBJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPmNhbmNlbF9yZW1fb25fY2hhbl92YXIpOworICAgIC8qIElzc3VlIGFib3J0IHJlbWFpbiBvbiBjaGFuIHJlcXVlc3QgdG8gc21lLgorICAgICAqIFRoZSByZW1haW4gb24gY2hhbm5lbCBjYWxsYmFjayB3aWxsIG1ha2Ugc3VyZSB0aGUgcmVtYWluX29uX2NoYW4KKyAgICAgKiBleHBpcmVkIGV2ZW50IGlzIHNlbnQuCisgICAgICovCisgICAgaWYgKCAoIFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkgfHwKKyAgICAgICAgICggV0xBTl9IRERfUDJQX0NMSUVOVCA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorICAgICAgICkKKyAgICB7CisgICAgICAgIHRBTklfVTggc2Vzc2lvbklkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsgCisgICAgICAgIGlmIChwSGRkQ3R4LT5jZmdfaW5pLT5pc1AycERldmljZUFkZHJBZG1pbmlzdHJhdGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIFdMQU5fSEREX0lORlJBX1NUQVRJT04gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBwQWRhcHRlci0+cDJwU2Vzc2lvbklkOworICAgICAgICB9CisgICAgICAgIHNtZV9DYW5jZWxSZW1haW5PbkNoYW5uZWwoIFdMQU5fSEREX0dFVF9IQUxfQ1RYKCBwQWRhcHRlciApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIChXTEFOX0hERF9TT0ZUQVA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUpIHx8CisgICAgICAgICAgICAgIChXTEFOX0hERF9QMlBfR08gPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlKQorICAgICAgICAgICAgKQorICAgIHsKKyAgICAgICAgV0xBTlNBUF9DYW5jZWxSZW1haW5PbkNoYW5uZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnB2b3NDb250ZXh0KTsKKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBJbnZhbGlkIGRldmljZV9tb2RlID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwQWRhcHRlci0+ZGV2aWNlX21vZGUpOworICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcEFkYXB0ZXItPmNhbmNlbF9yZW1fb25fY2hhbl92YXIsCisgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKFdBSVRfQ0FOQ0VMX1JFTV9DSEFOKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMywwKSkKK2ludCB3bGFuX2hkZF9hY3Rpb24oIHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sIGJvb2wgb2ZmY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsIHVuc2lnbmVkIGludCB3YWl0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgIGJvb2wgbm9fY2NrLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb250X3dhaXRfZm9yX2FjaywgdTY0ICpjb29raWUgKQorI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQoraW50IHdsYW5faGRkX2FjdGlvbiggc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwgYm9vbCBvZmZjaGFuLAorICAgICAgICAgICAgICAgICAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwgdW5zaWduZWQgaW50IHdhaXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCB1NjQgKmNvb2tpZSApCisjZWxzZQoraW50IHdsYW5faGRkX2FjdGlvbiggc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCB1NjQgKmNvb2tpZSApCisjZW5kaWYgLy9MSU5VWF9WRVJTSU9OX0NPREUKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUiggZGV2ICk7CisgICAgaGRkX2NmZzgwMjExX3N0YXRlX3QgKmNmZ1N0YXRlID0gV0xBTl9IRERfR0VUX0NGR19TVEFURV9QVFIoIHBBZGFwdGVyICk7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgoIHBBZGFwdGVyICk7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorICAgIGhkZF9hZGFwdGVyX3QgKmdvQWRhcHRlcjsKKyNlbmRpZgorCisgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IGRldmljZV9tb2RlID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLHBBZGFwdGVyLT5kZXZpY2VfbW9kZSk7CisKKyAgICAvL0NhbGwgc21lIEFQSSB0byBzZW5kIG91dCBhIGFjdGlvbiBmcmFtZS4KKyAgICAvLyBPUiBjYW4gd2Ugc2VuZCBpdCBkaXJlY3RseSB0aHJvdWdoIGRhdGEgcGF0aD8/CisgICAgLy8gQWZ0ZXIgdHggY29tcGxldGlvbiBzZW5kIHR4IHN0YXR1cyBiYWNrLgorICAgIGlmICggKCBXTEFOX0hERF9TT0ZUQVAgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkgfHwKKyAgICAgICAgICggV0xBTl9IRERfUDJQX0dPID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSApCisgICAgICAgKQorICAgIHsKKyAgICAgICAgdEFOSV9VOCB0eXBlID0gV0xBTl9IRERfR0VUX1RZUEVfRlJNX0ZDKGJ1ZlswXSk7CisgICAgICAgIHRBTklfVTggc3ViVHlwZSA9IFdMQU5fSEREX0dFVF9TVUJUWVBFX0ZSTV9GQyhidWZbMF0pOworICAgICAgICBpZiAodHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRHJvcCBQcm9iZSByZXNwb25zZSByZWNpZXZlZCBmcm9tIHN1cHBsaWNhbnQsIGFzIGZvciBHTyBhbmQgCisgICAgICAgICAgICAgICAgICAgU0FQIFBFIGl0c2VsZiBzZW5kcyBwcm9iZSByZXNwb25zZQorICAgICAgICAgICAgICAgICAgICovIAorICAgICAgICAgICAgICAgIGdvdG8gZXJyX3JlbV9jaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0RJU0FTU09DKSB8fAorICAgICAgICAgICAgICAgICAgICAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfREVBVVRIKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBEZWF1dGgvRGlzYXNzb2MgcmVjZWl2ZWQgZnJvbSBzdXBwbGljYW50LCBJZiB3ZSBzaW1wbHkgCisgICAgICAgICAgICAgICAgICogdHJhbnNtaXQgdGhlIGZyYW1lIG92ZXIgYWlyLCBkcml2ZXIgZG9lc24ndCBjb21lIHRvIGtub3cgCisgICAgICAgICAgICAgICAgICogYWJvdXQgdGhlIGRlYXV0aC9kaXNhc3NvYy4gQmVjYXVzZSBvZiB0aGlzIHJlYXNvbiB0aGUgCisgICAgICAgICAgICAgICAgICogc3VwcGxpY2FudCBhbmQgZHJpdmVyIHdpbGwgYmUgb3V0IG9mIHN5bmMuCisgICAgICAgICAgICAgICAgICogRHJvcCB0aGUgZnJhbWUgaGVyZSBhbmQgaW5pdGlhdGUgdGhlIGRpc2Fzc29jIHByb2NlZHVyZSAKKyAgICAgICAgICAgICAgICAgKiBmcm9tIGRyaXZlciwgdGhlIGNvcmUgc3RhY2sgd2lsbCB0YWtlIGNhcmUgb2Ygc2VuZGluZworICAgICAgICAgICAgICAgICAqIGRpc2Fzc29jIGZyYW1lIGFuZCBpbmRpY2F0aW5nIGNvcnJlc3BvbmRpbmcgZXZlbnRzIHRvIHN1cHBsaWNhbnQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdEFOSV9VOCBkc3RNYWNbRVRIX0FMRU5dID0gezB9OworICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0TWFjLCAmYnVmW1dMQU5fSEREXzgwMjExX0ZSTV9EQV9PRkZTRVRdLCBFVEhfQUxFTik7CisgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogRGVhdXRoL0Rpc2Fzc29jIHJlY2VpdmVkIGZvciBTVEE6IgorICAgICAgICAgICAgICAgICAgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwgCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RNYWNbMF0sIGRzdE1hY1sxXSwgZHN0TWFjWzJdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdE1hY1szXSwgZHN0TWFjWzRdLCBkc3RNYWNbNV0pOworICAgICAgICAgICAgICAgIGhkZF9zb2Z0YXBfc3RhX2Rpc2Fzc29jKHBBZGFwdGVyLCAodl9VOF90ICopJmRzdE1hYyk7CisgICAgICAgICAgICAgICAgZ290byBlcnJfcmVtX2NoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggTlVMTCAhPSBjZmdTdGF0ZS0+YnVmICkKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKworICAgIGhkZExvZyggTE9HMSwgIkFjdGlvbiBmcmFtZSB0eCByZXF1ZXN0Iik7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCisgICAgZ29BZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKCBwQWRhcHRlci0+cEhkZEN0eCwgV0xBTl9IRERfUDJQX0dPICk7CisKKyAgICAvL0lmIEdPIGFkYXB0ZXIgZXhpc3RzIGFuZCBvcGVyYXRpbmcgb24gc2FtZSBmcmVxdWVuY3kKKyAgICAvL3RoZW4gd2Ugd2lsbCBub3QgcmVxdWVzdCByZW1haW4gb24gY2hhbm5lbAorICAgIGlmKCBnb0FkYXB0ZXIgJiYgKCBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoY2hhbi0+Y2VudGVyX2ZyZXEpCisgICAgICAgICAgICAgICAgICAgICAgICAgPT0gZ29BZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLm9wZXJhdGluZ0NoYW5uZWwgKSApCisgICAgeworICAgICAgICBnb3RvIHNlbmRfZnJhbWU7CisgICAgfQorI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCisgICAgaWYoIG9mZmNoYW4gJiYgd2FpdCkKKyAgICB7CisgICAgICAgIGludCBzdGF0dXM7CisKKyAgICAgICAgLy8gSW4gY2FzZSBvZiBQMlAgQ2xpZW50IG1vZGUgaWYgd2UgYXJlIGFscmVhZHkKKyAgICAgICAgLy8gb24gdGhlIHNhbWUgY2hhbm5lbCB0aGVuIHNlbmQgdGhlIGZyYW1lIGRpcmVjdGx5CisKKyAgICAgICAgaWYoKGNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHggIT0gTlVMTCkgJiYKKyAgICAgICAgICAgKGNmZ1N0YXRlLT5jdXJyZW50X2ZyZXEgPT0gY2hhbi0+Y2VudGVyX2ZyZXEpCisgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHNlbmRfZnJhbWU7CisgICAgICAgIH0KKworICAgICAgICBJTklUX0NPTVBMRVRJT04ocEFkYXB0ZXItPm9mZmNoYW5uZWxfdHhfZXZlbnQpOworCisgICAgICAgIHN0YXR1cyA9IHdsYW5faGRkX3JlcXVlc3RfcmVtYWluX29uX2NoYW5uZWwod2lwaHksIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLCBjaGFubmVsX3R5cGUsIHdhaXQsIGNvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZfQ0hBTk5FTF9BQ1RJT05fVFgpOworCisgICAgICAgIGlmKDAgIT0gc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggKC1FQlVTWSA9PSBzdGF0dXMpICYmCisgICAgICAgICAgICAgICAgKGNmZ1N0YXRlLT5jdXJyZW50X2ZyZXEgPT0gY2hhbi0+Y2VudGVyX2ZyZXEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHNlbmRfZnJhbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGVycl9yZW1fY2hhbm5lbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFdhaXQgZm9yIGRyaXZlciB0byBiZSByZWFkeSBvbiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwgKi8KKyAgICAgICAgc3RhdHVzID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisgICAgICAgICAgICAgICAgICAgICAmcEFkYXB0ZXItPm9mZmNoYW5uZWxfdHhfZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKFdBSVRfQ0hBTkdFX0NIQU5ORUxfRk9SX09GRkNIQU5ORUxfVFgpKTsKKyAgICAgICAgaWYoIXN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKCBMT0dFLCAiTm90IGFibGUgdG8gY29tcGxldGUgcmVtYWluIG9uIGNoYW5uZWwgcmVxdWVzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoaW4gdGltZW91dCBwZXJpb2QiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyX3JlbV9jaGFubmVsOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBvZmZjaGFuICkKKyAgICB7CisgICAgICAgIC8qIENoZWNrIGJlZm9yZSBzZW5kaW5nIGFjdGlvbiBmcmFtZSAKKyAgICAgICAgICAgd2hldGhlciB3ZSBhbHJlYWR5IHJlbWFpbiBvbiBjaGFubmVsICovIAorICAgICAgICBpZihOVUxMID09IGNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gZXJyX3JlbV9jaGFubmVsOworICAgICAgICB9CisgICAgfQorICAgIHNlbmRfZnJhbWU6CisjZW5kaWYKKworICAgIGNmZ1N0YXRlLT5idWYgPSB2b3NfbWVtX21hbGxvYyggbGVuICk7IC8vYnVmOworICAgIGlmKCBjZmdTdGF0ZS0+YnVmID09IE5VTEwgKQorICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgIGNmZ1N0YXRlLT5sZW4gPSBsZW47CisKKyAgICB2b3NfbWVtX2NvcHkoIGNmZ1N0YXRlLT5idWYsIGJ1ZiwgbGVuKTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM4KSkKKyAgICBpZiggY2ZnU3RhdGUtPnJlbWFpbl9vbl9jaGFuX2N0eCApCisgICAgeworICAgICAgICBjZmdTdGF0ZS0+YWN0aW9uX2Nvb2tpZSA9IGNmZ1N0YXRlLT5yZW1haW5fb25fY2hhbl9jdHgtPmNvb2tpZTsKKyAgICAgICAgKmNvb2tpZSA9IGNmZ1N0YXRlLT5hY3Rpb25fY29va2llOworICAgIH0KKyAgICBlbHNlCisgICAgeworI2VuZGlmCisgICAgICAgICpjb29raWUgPSAodEFOSV9VMzIpIGNmZ1N0YXRlLT5idWY7CisgICAgICAgIGNmZ1N0YXRlLT5hY3Rpb25fY29va2llID0gKmNvb2tpZTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIChXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkgfHwKKyAgICAgICAgIChXTEFOX0hERF9QMlBfQ0xJRU5UID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSkKKyAgICAgICApCisgICAgeworICAgICAgICB0QU5JX1U4IHNlc3Npb25JZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7IAorICAgICAgICBpZiAocEhkZEN0eC0+Y2ZnX2luaS0+aXNQMnBEZXZpY2VBZGRyQWRtaW5pc3RyYXRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBXTEFOX0hERF9JTkZSQV9TVEFUSU9OID09IHBBZGFwdGVyLT5kZXZpY2VfbW9kZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gcEFkYXB0ZXItPnAycFNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoKHZvaWQqKSAoJmJ1ZlsxMF0pLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSAoJnBIZGRDdHgtPnAycERldmljZUFkZHJlc3MuYnl0ZXNbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAgICAgICAgICBzbWVfc2VuZEFjdGlvbiggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYnVmLCBsZW4pICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBzbWVfc2VuZEFjdGlvbiByZXR1cm5lZCBmYWlsIiwgX19mdW5jX18pOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggKCBXTEFOX0hERF9TT0ZUQVA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKSB8fAorICAgICAgICAgICAgICAoIFdMQU5fSEREX1AyUF9HTyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorICAgICAgICAgICAgKQorICAgICB7CisgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAgICAgICAgV0xBTlNBUF9TZW5kQWN0aW9uKCAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGxlbiApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiJXM6IFdMQU5TQVBfU2VuZEFjdGlvbiByZXR1cm5lZCBmYWlsIiwgX19mdW5jX18pOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2VycjoKKyAgICBoZGRfc2VuZEFjdGlvbkNuZiggcEFkYXB0ZXIsIEZBTFNFICk7CisgICAgcmV0dXJuIDA7CitlcnJfcmVtX2NoYW5uZWw6CisgICAgKmNvb2tpZSA9ICh0QU5JX1UzMiljZmdTdGF0ZTsKKyAgICBjZmc4MDIxMV9tZ210X3R4X3N0YXR1cyggcEFkYXB0ZXItPmRldiwgKmNvb2tpZSwgYnVmLCBsZW4sIEZBTFNFLCBHRlBfS0VSTkVMICk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCitpbnQgd2xhbl9oZGRfY2ZnODAyMTFfbWdtdF90eF9jYW5jZWxfd2FpdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NjQgY29va2llKQoreworICAgIHJldHVybiB3bGFuX2hkZF9jZmc4MDIxMV9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwoIHdpcGh5LCBkZXYsIGNvb2tpZSApOworfQorI2VuZGlmCisKK3ZvaWQgaGRkX3NlbmRBY3Rpb25DbmYoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB0QU5JX0JPT0xFQU4gYWN0aW9uU2VuZFN1Y2Nlc3MgKQoreworICAgIGhkZF9jZmc4MDIxMV9zdGF0ZV90ICpjZmdTdGF0ZSA9IFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKCBwQWRhcHRlciApOworCisgICAgaGRkTG9nKCBMT0cxLCAiU2VuZCBBY3Rpb24gY25mLCBhY3Rpb25TZW5kU3VjY2VzcyAlZCIsIGFjdGlvblNlbmRTdWNjZXNzKTsKKyAgICBpZiggTlVMTCA9PSBjZmdTdGF0ZS0+YnVmICkKKyAgICB7CisgICAgICAgIFZPU19BU1NFUlQoIGNmZ1N0YXRlLT5idWYgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIElmIHNrYiBpcyBOVUxMIGl0IG1lYW5zIHRoaXMgcGFja2V0IHdhcyByZWNlaXZlZCBvbiBDRkc4MDIxMSBpbnRlcmZhY2UKKyAgICAgKiBlbHNlIGl0IHdhcyByZWNlaXZlZCBvbiBNb25pdG9yIGludGVyZmFjZSAqLworICAgIGlmKCBjZmdTdGF0ZS0+c2tiID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogYnVmIGlzIHRoZSBzYW1lIHBvaW50ZXIgaXQgcGFzc2VkIHVzIHRvIHNlbmQuIFNpbmNlIHdlIGFyZSBzZW5kaW5nCisgICAgICAgICAqIGl0IHRocm91Z2ggY29udHJvbCBwYXRoLCB3ZSB1c2UgZGlmZmVyZW50IGJ1ZmZlcnMuCisgICAgICAgICAqIEluIGNhc2Ugb2YgbWFjODAyMTEsIHRoZXkganVzdCBwdXNoIGl0IHRvIHRoZSBza2IgYW5kIHBhc3MgdGhlIHNhbWUKKyAgICAgICAgICogZGF0YSB3aGlsZSBzZW5kaW5nIHR4IGFjayBzdGF0dXMuCisgICAgICAgICAqICovCisgICAgICAgICBjZmc4MDIxMV9tZ210X3R4X3N0YXR1cyggcEFkYXB0ZXItPmRldiwgY2ZnU3RhdGUtPmFjdGlvbl9jb29raWUsCisgICAgICAgICAgICAgICAgY2ZnU3RhdGUtPmJ1ZiwgY2ZnU3RhdGUtPmxlbiwgYWN0aW9uU2VuZFN1Y2Nlc3MsIEdGUF9LRVJORUwgKTsKKyAgICAgICAgIHZvc19tZW1fZnJlZSggY2ZnU3RhdGUtPmJ1ZiApOworICAgICAgICAgY2ZnU3RhdGUtPmJ1ZiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhkZF9hZGFwdGVyX3QqIHBNb25BZGFwdGVyID0KKyAgICAgICAgICAgICAgICAgICAgaGRkX2dldF9hZGFwdGVyKCBwQWRhcHRlci0+cEhkZEN0eCwgV0xBTl9IRERfTU9OSVRPUiApOworICAgICAgICBpZiggcE1vbkFkYXB0ZXIgPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyggTE9HRSwgIk5vdCBhYmxlIHRvIGdldCBNb25pdG9yIEFkYXB0ZXIiKTsKKyAgICAgICAgICAgIGNmZ1N0YXRlLT5za2IgPSBOVUxMOworICAgICAgICAgICAgdm9zX21lbV9mcmVlKCBjZmdTdGF0ZS0+YnVmICk7CisgICAgICAgICAgICBjZmdTdGF0ZS0+YnVmID0gTlVMTDsKKyAgICAgICAgICAgIGNvbXBsZXRlKCZwQWRhcHRlci0+dHhfYWN0aW9uX2NuZl9ldmVudCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLyogU2VuZCBUWCBjb21wbGV0aW9uIGZlZWRiYWNrIG92ZXIgbW9uaXRvciBpbnRlcmZhY2UuICovCisgICAgICAgIGhkZF93bGFuX3R4X2NvbXBsZXRlKCBwTW9uQWRhcHRlciwgY2ZnU3RhdGUsIGFjdGlvblNlbmRTdWNjZXNzICk7CisgICAgICAgIGNmZ1N0YXRlLT5za2IgPSBOVUxMOworICAgICAgICB2b3NfbWVtX2ZyZWUoIGNmZ1N0YXRlLT5idWYgKTsKKyAgICAgICAgY2ZnU3RhdGUtPmJ1ZiA9IE5VTEw7CisgICAgICAgIC8qIExvb2sgZm9yIHRoZSBuZXh0IE1nbXQgcGFja2V0IHRvIFRYICovCisgICAgICAgIGhkZF9tb25fdHhfbWdtdF9wa3QocEFkYXB0ZXIpOworICAgIH0KKyAgICBjb21wbGV0ZSgmcEFkYXB0ZXItPnR4X2FjdGlvbl9jbmZfZXZlbnQpOworfQorCisvKioKKyAqIGhkZF9zZXRQMnBOb2EKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBoZGRfaG9zdGFwZF9pb2N0bCBmdW5jdGlvbiB3aGVuIERyaXZlciAKKyAqIGdldCBQMlBfU0VUX05PQSBjb21hbmQgZnJvbSB3cGFfc3VwcGxpY2FudCB1c2luZyBwcml2YXRlIGlvY3RsCisgKgorICpMT0dJQzoKKyAqIEZpbGwgTm9BIFN0cnVjdCBBY2NvcmRpbmcgdG8gUDJQIFBvd2VyIHNhdmUgT3B0aW9uIGFuZCBQYXNzIGl0IHRvIFNNRSBsYXllciAKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBkZXYgICAgICAgICBQb2ludGVyIHRvIG5ldCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcGFyYW0gIGNvbW1hbmQgICAgIFBvaW50ZXIgdG8gY29tbWFuZCAKKyAqCisgKiBAcmV0dXJuIFN0YXR1cworICovCisKK2ludCBoZGRfc2V0UDJwTm9hKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB0QU5JX1U4ICpjb21tYW5kICkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0UDJwUHNDb25maWcgTm9BOworICAgIGludCBjb3VudCwgZHVyYXRpb24sIGludGVydmFsOworICAgIGNoYXIgKnBhcmFtOworCisgICAgcGFyYW0gPSBzdHJjaHIoY29tbWFuZCwgJyAnKTsKKyAgICBpZiAocGFyYW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHBhcmFtKys7CisgICAgc3NjYW5mKHBhcmFtLCAiJWQgJWQgJWQiLCAmY291bnQsICZkdXJhdGlvbiwgJmludGVydmFsKTsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICIlczogUDJQX1NFVCBHTyBOb0E6IGNvdW50PSVkIGR1cmF0aW9uPSVkIGludGVydmFsPSVkIFxuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY291bnQsIGR1cmF0aW9uLCBpbnRlcnZhbCk7CisKKyAgICAvKiBQUyBTZWxlY3Rpb24KKyAgICAgKiBQZXJpb2RpYyBOb0EgKDIpCisgICAgICogU2luZ2xlIE5PQSAgICg0KQorICAgICAqLworICAgIE5vQS5vcHBfcHMgPSAwOworICAgIE5vQS5jdFdpbmRvdyA9IDA7CisgICAgaWYgKGNvdW50ID09IDEpCisgICAgeworICAgICAgICBOb0EuZHVyYXRpb24gPSAwOworICAgICAgICBOb0Euc2luZ2xlX25vYV9kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICBOb0EucHNTZWxlY3Rpb24gPSBQMlBfUE9XRVJfU0FWRV9UWVBFX1NJTkdMRV9OT0E7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE5vQS5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICBOb0Euc2luZ2xlX25vYV9kdXJhdGlvbiA9IDA7CisgICAgICAgIE5vQS5wc1NlbGVjdGlvbiA9IFAyUF9QT1dFUl9TQVZFX1RZUEVfUEVSSU9ESUNfTk9BOworICAgIH0KKyAgICBOb0EuaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKyAgICBOb0EuY291bnQgPSBjb3VudDsKKyAgICBOb0Euc2Vzc2lvbmlkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICIlczogUDJQX1BTX0FUVFI6b3BwUFMgJWQgY3RXaW5kb3cgJWQgZHVyYXRpb24gJWQgIgorICAgICAgICAgICAgICAgICJpbnRlcnZhbCAlZCBjb3VudCAlZCBzaW5nbGUgbm9hIGR1cmF0aW9uICVkICIKKyAgICAgICAgICAgICAgICAiUHNTZWxlY3Rpb24gJXggXG4iLCBfX2Z1bmNfXywgTm9BLm9wcF9wcywgCisgICAgICAgICAgICAgICAgTm9BLmN0V2luZG93LCBOb0EuZHVyYXRpb24sIE5vQS5pbnRlcnZhbCwgCisgICAgICAgICAgICAgICAgTm9BLmNvdW50LCBOb0Euc2luZ2xlX25vYV9kdXJhdGlvbiwKKyAgICAgICAgICAgICAgICBOb0EucHNTZWxlY3Rpb24pOworCisgICAgc21lX3AycFNldFBzKGhIYWwsICZOb0EpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaGRkX3NldFAycE9wcHMKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBoZGRfaG9zdGFwZF9pb2N0bCBmdW5jdGlvbiB3aGVuIERyaXZlcgorICogZ2V0IFAyUF9TRVRfUFMgY29tYW5kIGZyb20gd3BhX3N1cHBsaWNhbnQgdXNpbmcgcHJpdmF0ZSBpb2N0bAorICoKKyAqTE9HSUM6CisgKiBGaWxsIE5vQSBTdHJ1Y3QgQWNjb3JkaW5nIHRvIFAyUCBQb3dlciBzYXZlIE9wdGlvbiBhbmQgUGFzcyBpdCB0byBTTUUgbGF5ZXIKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBkZXYgICAgICAgICBQb2ludGVyIHRvIG5ldCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcGFyYW0gIGNvbW1hbmQgICAgIFBvaW50ZXIgdG8gY29tbWFuZAorICoKKyAqIEByZXR1cm4gU3RhdHVzCisgKi8KKworaW50IGhkZF9zZXRQMnBPcHBzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB0QU5JX1U4ICpjb21tYW5kICkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0UDJwUHNDb25maWcgTm9BOworICAgIGNoYXIgKnBhcmFtOworICAgIGludCBsZWdhY3lfcHMsIG9wcF9wcywgY3R3aW5kb3c7CisKKyAgICBwYXJhbSA9IHN0cmNocihjb21tYW5kLCAnICcpOworICAgIGlmIChwYXJhbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcGFyYW0rKzsKKyAgICBzc2NhbmYocGFyYW0sICIlZCAlZCAlZCIsICZsZWdhY3lfcHMsICZvcHBfcHMsICZjdHdpbmRvdyk7CisgICAgVk9TX1RSQUNFIChWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICIlczogUDJQX1NFVCBHTyBQUzogbGVnYWN5X3BzPSVkIG9wcF9wcz0lZCBjdHdpbmRvdz0lZCBcbiIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsZWdhY3lfcHMsIG9wcF9wcywgY3R3aW5kb3cpOworCisgICAgLyogUFMgU2VsZWN0aW9uCisgICAgICogT3Bwb3J0dW5pc3RpYyBQb3dlciBTYXZlICgxKQorICAgICAqLworCisgICAgLyogRnJvbSB3cGFfY2xpIHVzZXIgbmVlZCB0byB1c2Ugc2VwYXJhdGUgY29tbWFuZCB0byBzZXQgY3RXaW5kb3cgYW5kIE9wcHMKKyAgICAgKiBXaGVuIHVzZXIgd2FudCB0byBzZXQgY3RXaW5kb3cgZHVyaW5nIHRoYXQgdGltZSBvdGhlciBwYXJhbWV0ZXJzCisgICAgICogdmFsdWVzIGFyZSBjb21pbmcgZnJvbSB3cGFfc3VwcGxpY2FudCBhcyAtMS4gCisgICAgICogRXhhbXBsZSA6IFVzZXIgd2FudCB0byBzZXQgY3RXaW5kb3cgd2l0aCAzMCB0aGVuIHdwYV9jbGkgY29tbWFuZCA6IAorICAgICAqIFAyUF9TRVQgY3R3aW5kb3cgMzAgCisgICAgICogQ29tbWFuZCBSZWNlaXZlZCBhdCBoZGRfaG9zdGFwZF9pb2N0bCBpcyBhcyBiZWxvdzogCisgICAgICogUDJQX1NFVF9QUyAtMSAtMSAzMCAobGVnYWN5X3BzID0gLTEsIG9wcF9wcyA9IC0xLCBjdHdpbmRvdyA9IDMwKQorICAgICAqLyAKKyAgICBpZiAoY3R3aW5kb3cgIT0gLTEpCisgICAgeworCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICJPcHBvcnR1bmlzdGljIFBvd2VyIFNhdmUgaXMgJXMgXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgKFRSVUUgPT0gcEFkYXB0ZXItPm9wcykgPyAiRW5hYmxlIiA6ICJEaXNhYmxlIiApOworCisgICAgICAgIGlmIChjdHdpbmRvdyAhPSBwQWRhcHRlci0+Y3R3KQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+Y3R3ID0gY3R3aW5kb3c7CisgICAgICAgIAorICAgICAgICAgICAgaWYocEFkYXB0ZXItPm9wcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOb0Eub3BwX3BzID0gcEFkYXB0ZXItPm9wczsKKyAgICAgICAgICAgICAgICBOb0EuY3RXaW5kb3cgPSBwQWRhcHRlci0+Y3R3OworICAgICAgICAgICAgICAgIE5vQS5kdXJhdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgTm9BLnNpbmdsZV9ub2FfZHVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIE5vQS5pbnRlcnZhbCA9IDA7CisgICAgICAgICAgICAgICAgTm9BLmNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBOb0EucHNTZWxlY3Rpb24gPSBQMlBfUE9XRVJfU0FWRV9UWVBFX09QUE9SVFVOSVNUSUM7CisgICAgICAgICAgICAgICAgTm9BLnNlc3Npb25pZCA9IHBBZGFwdGVyLT5zZXNzaW9uSWQ7CisgCisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBQMlBfUFNfQVRUUjpvcHBQUyAlZCBjdFdpbmRvdyAlZCBkdXJhdGlvbiAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVydmFsICVkIGNvdW50ICVkIHNpbmdsZSBub2EgZHVyYXRpb24gJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQc1NlbGVjdGlvbiAleCBcbiIsIF9fZnVuY19fLCBOb0Eub3BwX3BzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb0EuY3RXaW5kb3csIE5vQS5kdXJhdGlvbiwgTm9BLmludGVydmFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb0EuY291bnQsIE5vQS5zaW5nbGVfbm9hX2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vQS5wc1NlbGVjdGlvbik7CisKKyAgICAgICAgICAgICAgIHNtZV9wMnBTZXRQcyhoSGFsLCAmTm9BKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHBfcHMgIT0gLTEpCisgICAgeworICAgICAgICBwQWRhcHRlci0+b3BzID0gb3BwX3BzOworCisgICAgICAgIGlmICgob3BwX3BzICE9IC0xKSAmJiAocEFkYXB0ZXItPmN0dykpIAorICAgICAgICB7CisgICAgICAgICAgICBOb0Eub3BwX3BzID0gb3BwX3BzOworICAgICAgICAgICAgTm9BLmN0V2luZG93ID0gcEFkYXB0ZXItPmN0dzsKKyAgICAgICAgICAgIE5vQS5kdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBOb0Euc2luZ2xlX25vYV9kdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBOb0EuaW50ZXJ2YWwgPSAwOworICAgICAgICAgICAgTm9BLmNvdW50ID0gMDsKKyAgICAgICAgICAgIE5vQS5wc1NlbGVjdGlvbiA9IFAyUF9QT1dFUl9TQVZFX1RZUEVfT1BQT1JUVU5JU1RJQzsKKyAgICAgICAgICAgIE5vQS5zZXNzaW9uaWQgPSBwQWRhcHRlci0+c2Vzc2lvbklkOworCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogUDJQX1BTX0FUVFI6b3BwUFMgJWQgY3RXaW5kb3cgJWQgZHVyYXRpb24gJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImludGVydmFsICVkIGNvdW50ICVkIHNpbmdsZSBub2EgZHVyYXRpb24gJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlBzU2VsZWN0aW9uICV4IFxuIiwgX19mdW5jX18sIE5vQS5vcHBfcHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgTm9BLmN0V2luZG93LCBOb0EuZHVyYXRpb24sIE5vQS5pbnRlcnZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICBOb0EuY291bnQsIE5vQS5zaW5nbGVfbm9hX2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgTm9BLnBzU2VsZWN0aW9uKTsKKworICAgICAgICAgICBzbWVfcDJwU2V0UHMoaEhhbCwgJk5vQSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworaW50IGhkZF9zZXRQMnBQcyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqbXNnRGF0YSApCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFAycFBzQ29uZmlnIE5vQTsKKyAgICBwMnBfYXBwX3NldFAycFBzX3QgKnBhcHBOb0EgPSAocDJwX2FwcF9zZXRQMnBQc190ICopIG1zZ0RhdGE7CisKKyAgICBOb0Eub3BwX3BzID0gcGFwcE5vQS0+b3BwX3BzOworICAgIE5vQS5jdFdpbmRvdyA9IHBhcHBOb0EtPmN0V2luZG93OworICAgIE5vQS5kdXJhdGlvbiA9IHBhcHBOb0EtPmR1cmF0aW9uOworICAgIE5vQS5pbnRlcnZhbCA9IHBhcHBOb0EtPmludGVydmFsOworICAgIE5vQS5jb3VudCA9IHBhcHBOb0EtPmNvdW50OworICAgIE5vQS5zaW5nbGVfbm9hX2R1cmF0aW9uID0gcGFwcE5vQS0+c2luZ2xlX25vYV9kdXJhdGlvbjsKKyAgICBOb0EucHNTZWxlY3Rpb24gPSBwYXBwTm9BLT5wc1NlbGVjdGlvbjsKKyAgICBOb0Euc2Vzc2lvbmlkID0gcEFkYXB0ZXItPnNlc3Npb25JZDsKKworICAgIHNtZV9wMnBTZXRQcyhoSGFsLCAmTm9BKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKK3N0YXRpYyB0QU5JX1U4IHdsYW5faGRkX2dldF9zZXNzaW9uX3R5cGUoIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSApCit7CisgICAgdEFOSV9VOCBzZXNzaW9uVHlwZTsKKworICAgIHN3aXRjaCggdHlwZSApCisgICAgeworICAgICAgICBjYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorICAgICAgICAgICAgc2Vzc2lvblR5cGUgPSBXTEFOX0hERF9TT0ZUQVA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CisgICAgICAgICAgICBzZXNzaW9uVHlwZSA9IFdMQU5fSEREX1AyUF9HTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CisgICAgICAgICAgICBzZXNzaW9uVHlwZSA9IFdMQU5fSEREX1AyUF9DTElFTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorICAgICAgICAgICAgc2Vzc2lvblR5cGUgPSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKyAgICAgICAgICAgIHNlc3Npb25UeXBlID0gV0xBTl9IRERfTU9OSVRPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2Vzc2lvblR5cGUgPSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb25UeXBlOworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorc3RydWN0IG5ldF9kZXZpY2UqIHdsYW5faGRkX2FkZF92aXJ0dWFsX2ludGYoCisgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjaGFyICpuYW1lLCBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICB1MzIgKmZsYWdzLCBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zICkKKyNlbHNlCitpbnQgd2xhbl9oZGRfYWRkX3ZpcnR1YWxfaW50Ziggc3RydWN0IHdpcGh5ICp3aXBoeSwgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICpmbGFncywgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcyApCisjZW5kaWYKK3sKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QqKSB3aXBoeV9wcml2KHdpcGh5KTsKKyAgICBoZGRfYWRhcHRlcl90KiBwQWRhcHRlciA9IE5VTEw7CisKKyAgICBFTlRFUigpOworCisgICAgaWYgKCBwSGRkQ3R4LT5jZmdfaW5pLT5pc1AycERldmljZUFkZHJBZG1pbmlzdHJhdGVkICkKKyAgICB7CisgICAgICAgIGlmKCAoTkw4MDIxMV9JRlRZUEVfUDJQX0dPID09IHR5cGUpIHx8IAorICAgICAgICAgICAgKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQgPT0gdHlwZSkgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgUDJQIEludGVyZmFjZSBBZGRyZXNzLiB0aGlzIGFkZHJlc3MgbXVzdCBiZQorICAgICAgICAgICAgICogZGlmZmVyZW50IGZyb20gdGhlIFAyUCBEZXZpY2UgQWRkcmVzcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdl9NQUNBRERSX3QgcDJwRGV2aWNlQWRkcmVzcyA9IHBIZGRDdHgtPnAycERldmljZUFkZHJlc3M7CisgICAgICAgICAgICBwMnBEZXZpY2VBZGRyZXNzLmJ5dGVzWzRdIF49IDB4ODA7CisgICAgICAgICAgICBwQWRhcHRlciA9IGhkZF9vcGVuX2FkYXB0ZXIoIHBIZGRDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bGFuX2hkZF9nZXRfc2Vzc2lvbl90eXBlKHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBwMnBEZXZpY2VBZGRyZXNzLmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJVRSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcEFkYXB0ZXIgPSBoZGRfb3Blbl9hZGFwdGVyKCBwSGRkQ3R4LCB3bGFuX2hkZF9nZXRfc2Vzc2lvbl90eXBlKHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB3bGFuX2hkZF9nZXRfaW50Zl9hZGRyKHBIZGRDdHgpLCBWT1NfVFJVRSApOworICAgIH0KKworICAgIGlmKCBOVUxMID09IHBBZGFwdGVyKQorICAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IGhkZF9vcGVuX2FkYXB0ZXIgZmFpbGVkIixfX2Z1bmNfXyk7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbHNlCisgICAgICAgIHJldHVybiAtRUlOVkFMOworI2VuZGlmCisgICAgfQorICAgIEVYSVQoKTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkpCisgICAgcmV0dXJuIHBBZGFwdGVyLT5kZXY7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK2ludCB3bGFuX2hkZF9kZWxfdmlydHVhbF9pbnRmKCBzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IChoZGRfY29udGV4dF90Kikgd2lwaHlfcHJpdih3aXBoeSk7CisgICAgIGhkZF9hZGFwdGVyX3QgKnBWaXJ0QWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgICBFTlRFUigpOworCisgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBkZXZpY2VfbW9kZSA9ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLHBWaXJ0QWRhcHRlci0+ZGV2aWNlX21vZGUpOworCisgICAgIHdsYW5faGRkX3JlbGVhc2VfaW50Zl9hZGRyKCBwSGRkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpcnRBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudC5ieXRlcyApOworCisgICAgIGhkZF9zdG9wX2FkYXB0ZXIoIHBIZGRDdHgsIHBWaXJ0QWRhcHRlciApOworICAgICBoZGRfY2xvc2VfYWRhcHRlciggcEhkZEN0eCwgcFZpcnRBZGFwdGVyLCBUUlVFICk7CisgICAgIEVYSVQoKTsKKyAgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGRkX3NlbmRNZ210RnJhbWVPdmVyTW9uaXRvcklmYWNlKCBoZGRfYWRhcHRlcl90ICpwTW9uQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuRnJhbWVMZW5ndGgsIHRBTklfVTgqIHBiRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggZnJhbWVUeXBlICkgIAoreworICAgIC8vSW5kaWNhdGUgYSBGcmFtZSBvdmVyIE1vbml0b3IgSW50Zi4KKyAgICBpbnQgcnhzdGF0OworICAgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworICAgIGludCBuZWVkZWRfaGVhZHJvb20gPSAwOworICAgIGludCBmbGFnID0gSEREX1JYX0ZMQUdfSVZfU1RSSVBQRUQgfCBIRERfUlhfRkxBR19ERUNSWVBURUQgfAorICAgICAgICAgICAgICAgSEREX1JYX0ZMQUdfTU1JQ19TVFJJUFBFRDsKKworICAgIGhkZExvZyggTE9HMSwgRkwoIkluZGljYXRlIEZyYW1lIG92ZXIgTW9uaXRvciBJbnRmIikpOworCisgICAgVk9TX0FTU0VSVCggKHBiRnJhbWVzICE9IE5VTEwpICk7CisKKyAgICAvKiByb29tIGZvciB0aGUgcmFkaW90YXAgaGVhZGVyIGJhc2VkIG9uIGRyaXZlciBmZWF0dXJlcworICAgICAqIDEgQnl0ZSBmb3IgUkFESU8gVEFQIEZsYWcsIDEgQnl0ZSBwYWRkaW5nIGFuZCAyIEJ5dGUgZm9yCisgICAgICogUlggZmxhZ3MuCisgICAgICogKi8KKyAgICAgbmVlZGVkX2hlYWRyb29tID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyKSArIDQ7CisKKyAgICAgLy9hbGxvYyBza2IgIGhlcmUKKyAgICAgc2tiID0gYWxsb2Nfc2tiKFZQS1RfU0laRV9CVUZGRVIsIEdGUF9BVE9NSUMpOworICAgICBpZiAodW5saWtlbHkoTlVMTCA9PSBza2IpKQorICAgICB7CisgICAgICAgICBoZGRMb2coIExPR1csIEZMKCJVbmFibGUgdG8gYWxsb2NhdGUgc2tiIikpOworICAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIHNrYl9yZXNlcnZlKHNrYiwgVlBLVF9TSVpFX0JVRkZFUik7CisgICAgIGlmICh1bmxpa2VseShza2JfaGVhZHJvb20oc2tiKSA8IG5GcmFtZUxlbmd0aCkpCisgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICJIREQgWyVkXTogSW5zdWZmaWNpZW50IGhlYWRyb29tLCAiCisgICAgICAgICAgICAgICAgICAgImhlYWRbJXBdLCBkYXRhWyVwXSwgcmVxWyVkXSIsCisgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHNrYi0+aGVhZCwgc2tiLT5kYXRhLCBuRnJhbWVMZW5ndGgpOworICAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgICByZXR1cm4gOworICAgICB9CisgICAgIC8vIGFjdHVhbGx5IHB1c2ggdGhlIGRhdGEKKyAgICAgbWVtY3B5KHNrYl9wdXNoKHNrYiwgbkZyYW1lTGVuZ3RoKSwgcGJGcmFtZXMsIG5GcmFtZUxlbmd0aCk7CisgICAgIC8qIHByZXBlbmQgcmFkaW90YXAgaW5mb3JtYXRpb24gKi8KKyAgICAgaWYoIDAgIT0gaGRkX3dsYW5fYWRkX3J4X3JhZGlvdGFwX2hkciggc2tiLCBuZWVkZWRfaGVhZHJvb20sIGZsYWcgKSApCisgICAgIHsKKyAgICAgICAgIGhkZExvZyggTE9HRSwgRkwoIk5vdCBBYmxlIEFkZCBSYWRpbyBUYXAiKSk7CisgICAgICAgICAvL2ZyZWUgc2tiCisgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgIHJldHVybiA7CisgICAgIH0KKworICAgICBza2JfcmVzZXRfbWFjX2hlYWRlciggc2tiICk7CisgICAgIHNrYi0+ZGV2ID0gcE1vbkFkYXB0ZXItPmRldjsKKyAgICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIHNrYi0+ZGV2ICk7CisgICAgIHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisgICAgIHJ4c3RhdCA9IG5ldGlmX3J4X25pKHNrYik7CisgICAgIGlmKCBORVRfUlhfU1VDQ0VTUyA9PSByeHN0YXQgKQorICAgICB7CisgICAgICAgICBoZGRMb2coIExPRzEsIEZMKCJTdWNjZXNzIikpOworICAgICB9CisgICAgIGVsc2UKKyAgICAgICAgIGhkZExvZyggTE9HRSwgRkwoIkZhaWxlZCAlZCIpLCByeHN0YXQpOyAgICAgICAgICAgICAgICAgICAKKworICAgICByZXR1cm4gOworfQorCit2b2lkIGhkZF9pbmRpY2F0ZU1nbXRGcmFtZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkZyYW1lTGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4KiBwYkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGZyYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiByeENoYW4gKQoreworICAgIHRBTklfVTE2IGZyZXE7CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogRnJhbWUgVHlwZSA9ICVkIEZyYW1lIExlbmd0aCA9ICVkXG4iLAorICAgICAgICAgICAgX19mdW5jX18sIGZyYW1lVHlwZSwgbkZyYW1lTGVuZ3RoKTsKKworICAgIGlmIChOVUxMID09IHBBZGFwdGVyKQorICAgIHsKKyAgICAgICAgaGRkTG9nKCBMT0dFLCBGTCgicEFkYXB0ZXIgaXMgTlVMTCIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChOVUxMID09IHBBZGFwdGVyLT5kZXYpCisgICAgeworICAgICAgICBoZGRMb2coIExPR0UsIEZMKCJwQWRhcHRlci0+ZGV2IGlzIE5VTEwiKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoV0xBTl9IRERfQURBUFRFUl9NQUdJQyAhPSBwQWRhcHRlci0+bWFnaWMpCisgICAgeworICAgICAgICBoZGRMb2coIExPR0UsIEZMKCJwQWRhcHRlciBoYXMgaW52YWxpZCBtYWdpYyIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCAhbkZyYW1lTGVuZ3RoICkKKyAgICB7CisgICAgICAgIGhkZExvZyggTE9HRSwgRkwoIkZyYW1lIExlbmd0aCBpcyBJbnZhbGlkIFpFUk8iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiggKCBXTEFOX0hERF9TT0ZUQVAgPT0gcEFkYXB0ZXItPmRldmljZV9tb2RlICkgCisgICAgICAgICAgICB8fCAoIFdMQU5fSEREX1AyUF9HTyA9PSBwQWRhcHRlci0+ZGV2aWNlX21vZGUgKQorICAgICAgKQorICAgIHsKKyAgICAgICAgaGRkX2FkYXB0ZXJfdCAqcE1vbkFkYXB0ZXIgPQorICAgICAgICAgICAgaGRkX2dldF9tb25fYWRhcHRlciggV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikgKTsKKworICAgICAgICBpZiggTlVMTCAhPSBwTW9uQWRhcHRlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyggTE9HMSwgRkwoIkluZGljYXRlIEZyYW1lIG92ZXIgTW9uaXRvciBJbnRlcmZhY2UiKSk7CisgICAgICAgICAgICBoZGRfc2VuZE1nbXRGcmFtZU92ZXJNb25pdG9ySWZhY2UoIHBNb25BZGFwdGVyLCBuRnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIHBiRnJhbWVzLCBmcmFtZVR5cGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy9DaGFubmVsIGluZGljYXRlZCBtYXkgYmUgd3JvbmcuIFRPRE8KKyAgICAvL0luZGljYXRlIGFuIGFjdGlvbiBmcmFtZS4KKyAgICBpZiggcnhDaGFuIDw9IE1BWF9OT19PRl8yXzRfQ0hBTk5FTFMgKQorICAgIHsKKyAgICAgICAgZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeSggcnhDaGFuLAorICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQU5EXzJHSFopOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KCByeENoYW4sCisgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBTkRfNUdIWik7CisgICAgfQorCisgICAgLy9JbmRpY2F0ZSBGcmFtZSBPdmVyIE5vcm1hbCBJbnRlcmZhY2UKKyAgICBoZGRMb2coIExPRzEsIEZMKCJJbmRpY2F0ZSBGcmFtZSBvdmVyIE5MODAyMTEgSW50ZXJmYWNlIikpOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDQsMCkpCisgICAgY2ZnODAyMTFfcnhfbWdtdCggcEFkYXB0ZXItPmRldiwgZnJlcSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBwYkZyYW1lcywgbkZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIEdGUF9BVE9NSUMgKTsKKyNlbHNlCisgICAgY2ZnODAyMTFfcnhfbWdtdCggcEFkYXB0ZXItPmRldiwgZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICBwYkZyYW1lcywgbkZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIEdGUF9BVE9NSUMgKTsKKyNlbmRpZiAvL0xJTlVYX1ZFUlNJT05fQ09ERQorfQorCisvKgorICogaWVlZTgwMjExX2FkZF9yeF9yYWRpb3RhcF9oZWFkZXIgLSBhZGQgcmFkaW90YXAgaGVhZGVyCisgKi8KK3N0YXRpYyBpbnQgaGRkX3dsYW5fYWRkX3J4X3JhZGlvdGFwX2hkciAoCisgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJ0YXBfbGVuLCBpbnQgZmxhZyApCit7CisgICAgdTggcnRhcF90ZW1wWzIwXSA9IHswfTsKKyAgICBzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciAqcnRoZHI7CisgICAgdW5zaWduZWQgY2hhciAqcG9zOworICAgIHUxNiByeF9mbGFncyA9IDA7CisKKyAgICBydGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciAqKSgmcnRhcF90ZW1wWzBdKTsKKworICAgIC8qIHJhZGlvdGFwIGhlYWRlciwgc2V0IGFsd2F5cyBwcmVzZW50IGZsYWdzICovCisgICAgcnRoZHItPml0X3ByZXNlbnQgPSBjcHVfdG9fbGUzMigoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JYX0ZMQUdTKSk7CisgICAgcnRoZHItPml0X2xlbiA9IGNwdV90b19sZTE2KHJ0YXBfbGVuKTsKKworICAgIHBvcyA9ICh1bnNpZ25lZCBjaGFyICopIChydGhkciArIDEpOworCisgICAgLyogdGhlIG9yZGVyIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzIGlzIGltcG9ydGFudCAqLworCisgICAgLyogSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTICovCisgICAgKnBvcyA9IDA7CisgICAgcG9zKys7CisKKyAgICAvKiBJRUVFODAyMTFfUkFESU9UQVBfUlhfRkxBR1M6IExlbmd0aCAyIEJ5dGVzICovCisgICAgLyogZW5zdXJlIDIgYnl0ZSBhbGlnbm1lbnQgZm9yIHRoZSAyIGJ5dGUgZmllbGQgYXMgcmVxdWlyZWQgKi8KKyAgICBpZiAoKHBvcyAtICh1OCAqKXJ0aGRyKSAmIDEpCisgICAgICAgIHBvcysrOworICAgIHB1dF91bmFsaWduZWRfbGUxNihyeF9mbGFncywgcG9zKTsKKyAgICBwb3MgKz0gMjsKKyAgICAKKyAgICAvLyBhY3R1YWxseSBwdXNoIHRoZSBkYXRhCisgICAgbWVtY3B5KHNrYl9wdXNoKHNrYiwgcnRhcF9sZW4pLCAmcnRhcF90ZW1wWzBdLCBydGFwX2xlbik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGRkX3dsYW5fdHhfY29tcGxldGUoIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9jZmc4MDIxMV9zdGF0ZV90KiBjZmdTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX0JPT0xFQU4gYWN0aW9uU2VuZFN1Y2Nlc3MgKQoreworICAgIHN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyICpydGhkcjsKKyAgICB1bnNpZ25lZCBjaGFyICpwb3M7CisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGNmZ1N0YXRlLT5za2I7CisKKyAgICAvKiAyIEJ5dGUgZm9yIFRYIGZsYWdzIGFuZCAxIEJ5dGUgZm9yIFJldHJ5IGNvdW50ICovCisgICAgdTMyIHJ0SGRyTGVuID0gc2l6ZW9mKCpydGhkcikgKyAzOworCisgICAgdTggKmRhdGE7CisKKyAgICAvKiBXZSBoYXZlIHRvIHJldHVybiBza2Igd2l0aCBEYXRhIHN0YXJ0aW5nIHdpdGggTUFDIGhlYWRlci4gV2UgaGF2ZQorICAgICAqIGNvcGllZCBTS0IgZGF0YSBzdGFydGluZyB3aXRoIE1BQyBoZWFkZXIgdG8gY2ZnU3RhdGUtPmJ1Zi4gV2Ugd2lsbCBwdWxsCisgICAgICogZW50aXJlIHNrYi0+bGVuIGZyb20gc2tiIGFuZCB0aGVuIHdlIHdpbGwgcHVzaCBjZmdTdGF0ZS0+YnVmIHRvIHNrYgorICAgICAqICovCisgICAgaWYoIE5VTEwgPT0gc2tiX3B1bGwoc2tiLCBza2ItPmxlbikgKQorICAgIHsKKyAgICAgICAgaGRkTG9nKCBMT0dFLCBGTCgiTm90IEFibGUgdG8gUHVsbCAlZCBieXRlIGZyb20gc2tiIiksIHNrYi0+bGVuKTsKKyAgICAgICAga2ZyZWVfc2tiKGNmZ1N0YXRlLT5za2IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGF0YSA9IHNrYl9wdXNoKCBza2IsIGNmZ1N0YXRlLT5sZW4gKTsKKworICAgIGlmIChkYXRhID09IE5VTEwpCisgICAgeworICAgICAgICBoZGRMb2coIExPR0UsIEZMKCJOb3QgQWJsZSB0byBQdXNoICVkIGJ5dGUgdG8gc2tiIiksIGNmZ1N0YXRlLT5sZW4pOworICAgICAgICBrZnJlZV9za2IoIGNmZ1N0YXRlLT5za2IgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbWNweSggZGF0YSwgY2ZnU3RhdGUtPmJ1ZiwgY2ZnU3RhdGUtPmxlbiApOworCisgICAgLyogc2VuZCBmcmFtZSB0byBtb25pdG9yIGludGVyZmFjZXMgbm93ICovCisgICAgaWYoIHNrYl9oZWFkcm9vbShza2IpIDwgcnRIZHJMZW4gKQorICAgIHsKKyAgICAgICAgaGRkTG9nKCBMT0dFLCBGTCgiTm8gaGVhZHJvb20gZm9yIHJ0YXAgaGVhZGVyIikpOworICAgICAgICBrZnJlZV9za2IoY2ZnU3RhdGUtPnNrYik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBydGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciopIHNrYl9wdXNoKCBza2IsIHJ0SGRyTGVuICk7CisKKyAgICBtZW1zZXQoIHJ0aGRyLCAwLCBydEhkckxlbiApOworICAgIHJ0aGRyLT5pdF9sZW4gPSBjcHVfdG9fbGUxNiggcnRIZHJMZW4gKTsKKyAgICBydGhkci0+aXRfcHJlc2VudCA9IGNwdV90b19sZTMyKCgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9UWF9GTEFHUykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0RBVEFfUkVUUklFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgIHBvcyA9ICh1bnNpZ25lZCBjaGFyICopKCBydGhkcisxICk7CisKKyAgICAvLyBGaWxsIFRYIGZsYWdzCisgICAgKnBvcyA9IGFjdGlvblNlbmRTdWNjZXNzOworICAgIHBvcyArPSAyOworCisgICAgLy8gRmlsbCByZXRyeSBjb3VudAorICAgICpwb3MgPSAwOworICAgIHBvcysrOworCisgICAgc2tiX3NldF9tYWNfaGVhZGVyKCBza2IsIDAgKTsKKyAgICBza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworICAgIHNrYi0+cGt0X3R5cGUgID0gUEFDS0VUX09USEVSSE9TVDsKKyAgICBza2ItPnByb3RvY29sICA9IGh0b25zKEVUSF9QXzgwMl8yKTsKKyAgICBtZW1zZXQoIHNrYi0+Y2IsIDAsIHNpemVvZiggc2tiLT5jYiApICk7CisgICAgaWYgKGluX2ludGVycnVwdCgpKQorICAgICAgICBuZXRpZl9yeCggc2tiICk7CisgICAgZWxzZQorICAgICAgICBuZXRpZl9yeF9uaSggc2tiICk7CisKKyAgICAvKiBFbmFibGUgUXVldWVzIHdoaWNoIHdlIGhhdmUgZGlzYWJsZWQgZWFybGllciAqLworICAgIG5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoIHBBZGFwdGVyLT5kZXYgKTsgCisKK30KKyNlbmRpZiAvLyBDT05GSUdfQ0ZHODAyMTEKZGlmZiAtLWdpdCBhL0NPUkUvSEREL3NyYy93bGFuX2hkZF9zY2FuLmMgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTM5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfc2Nhbi5jCkBAIC0wLDAgKzEsMTE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFxmaWxlICB3bGFuX2hkZF9zY2FuLmMKKworICBcYnJpZWYgV0xBTiBIb3N0IERldmljZSBEcml2ZXIgaW1wbGVtZW50YXRpb24KKworICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjokICAgJERhdGVUaW1lOiAkICRBdXRob3I6ICQKKworCisgIHdoZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5CisgIC0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAwNC81LzA5ICAgICBTaGFpbGVuZGVyICAgICBDcmVhdGVkIG1vZHVsZS4KKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgICAvKiBUbyBleHRyYWN0IHRoZSBTY2FuIHJlc3VsdHMgKi8KKworLyogQWRkIGEgc3RyZWFtIGV2ZW50ICovCisKKyNpbmNsdWRlIDx3bGFuX3FjdF9kcml2ZXIuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHZvc19hcGkuaD4KKyNpbmNsdWRlIDxwYWxUeXBlcy5oPgorI2luY2x1ZGUgPGFuaUdsb2JhbC5oPgorI2luY2x1ZGUgPGRvdDExZi5oPgorI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorI2luY2x1ZGUgImJhcF9oZGRfbWlzYy5oIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2VuZGlmCisKKyNkZWZpbmUgR0VUX0lFX0xFTl9JTl9CU1MobGVuSW5Cc3MpICggbGVuSW5Cc3MgKyBzaXplb2YobGVuSW5Cc3MpIC0gXAorICAgICAgICAgICAgICAoKGludCkgT0ZGU0VUX09GKCB0U2lyQnNzRGVzY3JpcHRpb24sIGllRmllbGRzKSkpCisKKyNkZWZpbmUgV0VYVF9DU0NBTl9IRUFERVIgICAgICAgICAgICAgICAiQ1NDQU4gU1x4MDFceDAwXHgwMFNceDAwIgorI2RlZmluZSBXRVhUX0NTQ0FOX0hFQURFUl9TSVpFICAgICAgICAgIDEyCisjZGVmaW5lIFdFWFRfQ1NDQU5fU1NJRF9TRUNUSU9OICAgICAgICAgJ1MnCisjZGVmaW5lIFdFWFRfQ1NDQU5fQ0hBTk5FTF9TRUNUSU9OICAgICAgJ0MnCisjZGVmaW5lIFdFWFRfQ1NDQU5fTlBST0JFX1NFQ1RJT04gICAgICAgJ04nCisjZGVmaW5lIFdFWFRfQ1NDQU5fQUNUVl9EV0VMTF9TRUNUSU9OICAgJ0EnCisjZGVmaW5lIFdFWFRfQ1NDQU5fUEFTVl9EV0VMTF9TRUNUSU9OICAgJ1AnCisjZGVmaW5lIFdFWFRfQ1NDQU5fSE9NRV9EV0VMTF9TRUNUSU9OICAgJ0gnCisjZGVmaW5lIFdFWFRfQ1NDQU5fVFlQRV9TRUNUSU9OICAgICAgICAgJ1QnCisjZGVmaW5lIFdFWFRfQ1NDQU5fUEVORElOR19TRUNUSU9OICAgICAgJ08nCisjZGVmaW5lIFdFWFRfQ1NDQU5fVFlQRV9ERUZBVUxUICAgICAgICAgMAorI2RlZmluZSBXRVhUX0NTQ0FOX1RZUEVfUEFTU0lWRSAgICAgICAgIDEKKyNkZWZpbmUgV0VYVF9DU0NBTl9QQVNWX0RXRUxMX1RJTUUgICAgICAxMzAKKyNkZWZpbmUgV0VYVF9DU0NBTl9QQVNWX0RXRUxMX1RJTUVfREVGICAyNTAKKyNkZWZpbmUgV0VYVF9DU0NBTl9QQVNWX0RXRUxMX1RJTUVfTUFYICAzMDAwCisjZGVmaW5lIFdFWFRfQ1NDQU5fSE9NRV9EV0VMTF9USU1FICAgICAgMTMwCisjZGVmaW5lIE1BWF9SQVRFUyAgICAgICAgICAgICAgICAgICAgICAgMTIKKworI2RlZmluZSBXRVhUX0NTQ0FOX1NDQU5fRE9ORV9XQUlUX1RJTUUgIDIwMDAKKwordHlwZWRlZiBzdHJ1Y3QgaGRkX3NjYW5faW5mb3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm87CisgICAgY2hhciAqc3RhcnQ7CisgICAgY2hhciAqZW5kOworfSBoZGRfc2Nhbl9pbmZvX3QsICpoZGRfc2Nhbl9pbmZvX3RwOworCitzdGF0aWMgdl9TMzFfdCBoZGRfVHJhbnNsYXRlQUJHUmF0ZVRvTWJwc1JhdGUodl9VOF90ICpwRmNSYXRlKQoreworCisgICAgLyoqIFNsaWdodGx5IG1vcmUgc29waGlzdGljYXRlZCBwcm9jZXNzaW5nIGhhcyB0byB0YWtlIHBsYWNlIGhlcmUuCisgICAgICAgICAgICAgIEJhc2ljIHJhdGVzIGFyZSByb3VuZGVkIERPV04uICBIVCByYXRlcyBhcmUgcm91bmRlZCBVUC4qLworICAgIHJldHVybiAoICgoICgodl9TMzFfdCkgKnBGY1JhdGUpICYgMHgwMDdmKSAqIDEwMDAwMDApIC8gMik7Cit9CisKKworc3RhdGljIGVIYWxTdGF0dXMgaGRkX0FkZEl3U3RyZWFtRXZlbnQoaW50IGNtZCwgaW50IGxlbmd0aCwgY2hhciogZGF0YSwgaGRkX3NjYW5faW5mb190ICpwc2NhbkluZm8sIGNoYXIgKipsYXN0X2V2ZW50LCBjaGFyICoqY3VycmVudF9ldmVudCApCit7CisgICAgc3RydWN0IGl3X2V2ZW50IGV2ZW50OworCisgICAgKmxhc3RfZXZlbnQgPSAqY3VycmVudF9ldmVudDsKKyAgICB2b3NfbWVtX3plcm8oJmV2ZW50LCBzaXplb2YgKHN0cnVjdCBpd19ldmVudCkpOworICAgIGV2ZW50LmNtZCA9IGNtZDsKKyAgICBldmVudC51LmRhdGEuZmxhZ3MgPSAxOworICAgIGV2ZW50LnUuZGF0YS5sZW5ndGggPSBsZW5ndGg7CisgICAgKmN1cnJlbnRfZXZlbnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludCAocHNjYW5JbmZvLT5pbmZvLCpjdXJyZW50X2V2ZW50LCBwc2NhbkluZm8tPmVuZCwgICZldmVudCwgZGF0YSk7CisKKyAgICBpZigqbGFzdF9ldmVudCA9PSAqY3VycmVudF9ldmVudCkKKyAgICB7CisgICAgICAgICAgICAvKiBubyBzcGFjZSB0byBhZGQgZXZlbnQgKi8KKyAgICAgICAgcmV0dXJuIC1FMkJJRzsgLyogRXJyb3IgY29kZSwgbWF5IGJlIEUyQklHICovCisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfR2V0V1BBUlNOSUVzKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIGV4dHJhY3QgdGhlIFdQQS9SU04gSUUgZnJvbSB0aGUgQnNzIGRlc2NyaXB0b3IgSUVzIGZpZWxkcworCisgIFxwYXJhbSAgLSBpZUZpZWxkcyAtIFBvaW50ZXIgdG8gdGhlIEJzcyBEZXNjcmlwdG9yIElFcy4KKyAgICAgICAgICAgICAgLSBpZV9sZW5ndGggLSBJRSBMZW5ndGguCisgICAgICAgICAgICAgIC0gbGFzdF9ldmVudCAtUG9pbnRzIHRvIHRoZSBsYXN0IGV2ZW50LgorICAgICAgICAgICAgICAtIGN1cnJlbnRfZXZlbnQgLSBQb2ludHMgdG8gdGhlCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiBFeHRyYWN0IHRoZSBXUEEgYW5kL29yIFJTTiBJRXMgKi8KK3N0YXRpYyBlSGFsU3RhdHVzIGhkZF9HZXRXUEFSU05JRXMoIHZfVThfdCAqaWVGaWVsZHMsIHZfVTE2X3QgaWVfbGVuZ3RoLCBjaGFyICoqbGFzdF9ldmVudCwgY2hhciAqKmN1cnJlbnRfZXZlbnQsIGhkZF9zY2FuX2luZm9fdCAqcHNjYW5JbmZvICkKK3sKKyAgICB2X1U4X3QgZWlkLCBlbGVuLCAqZWxlbWVudDsKKyAgICB2X1UxNl90IHRpZV9sZW5ndGg9MDsKKworICAgIEVOVEVSKCk7CisKKyAgICBlbGVtZW50ID0gaWVGaWVsZHM7CisgICAgdGllX2xlbmd0aCA9IGllX2xlbmd0aDsKKworICAgIHdoaWxlKCB0aWVfbGVuZ3RoID4gMiAmJiBlbGVtZW50ICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgZWlkID0gZWxlbWVudFswXTsKKyAgICAgICAgZWxlbiA9IGVsZW1lbnRbMV07CisKKyAgICAgICAgLypJZiBlbGVtZW50IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdG90YWwgcmVtYWluaW5nIGllIGxlbmd0aCwKKyAgICAgICAgICpicmVhayB0aGUgbG9vcCovCisgICAgICAgIGlmICgoZWxlbisyKSA+IHRpZV9sZW5ndGgpCisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHN3aXRjaChlaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgRE9UMTFGX0VJRF9XUEE6CisgICAgICAgICAgICBjYXNlIERPVDExRl9FSURfUlNOOgorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgICAgICBjYXNlIERPVDExRl9FSURfV0FQSToKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmKGhkZF9BZGRJd1N0cmVhbUV2ZW50KCBJV0VWR0VOSUUsICBlbGVuKzIsIChjaGFyKillbGVtZW50LCBwc2NhbkluZm8sIGxhc3RfZXZlbnQsIGN1cnJlbnRfZXZlbnQgKSA8IDAgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogTmV4dCBlbGVtZW50ICovCisgICAgICAgIHRpZV9sZW5ndGggLT0gKDIgKyBlbGVuKTsKKyAgICAgICAgZWxlbWVudCArPSAyICsgZWxlbjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIGhkZF9JbmRpY2F0ZVNjYW5SZXN1bHQoKSAtCisKKyAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2NhbiByZXN1bHRzIHRvIHRoZSB3cGFfc3VwcGxpY2FudAorCisgIFxwYXJhbSAgLSBzY2FuSW5mbyAtIFBvaW50ZXIgdG8gdGhlIHNjYW4gaW5mbyBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAgIC0gZGVzY3JpcHRvciAtIFBvaW50ZXIgdG8gdGhlIEJzcyBEZXNjcmlwdG9yLgorCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgTUFYX0NVU1RPTV9MRU4gNjQKK3N0YXRpYyBlSGFsU3RhdHVzIGhkZF9JbmRpY2F0ZVNjYW5SZXN1bHQoaGRkX3NjYW5faW5mb190ICpzY2FuSW5mbywgdENzclNjYW5SZXN1bHRJbmZvICpzY2FuX3Jlc3VsdCkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKHNjYW5JbmZvLT5kZXYpIDsKKyAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKyAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqZGVzY3JpcHRvciA9ICZzY2FuX3Jlc3VsdC0+QnNzRGVzY3JpcHRvcjsKKyAgIHN0cnVjdCBpd19ldmVudCBldmVudDsKKyAgIGNoYXIgKmN1cnJlbnRfZXZlbnQgPSBzY2FuSW5mby0+c3RhcnQ7CisgICBjaGFyICplbmQgPSBzY2FuSW5mby0+ZW5kOworICAgY2hhciAqbGFzdF9ldmVudDsKKyAgIGNoYXIgKmN1cnJlbnRfcGFkOworICAgdl9VMTZfdCBpZV9sZW5ndGggPSAwOworICAgdl9VMTZfdCBjYXBhYmlsaXR5SW5mbzsKKyAgIGNoYXIgKm1vZGVzdHI7CisgICBpbnQgZXJyb3I7CisgICBjaGFyIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl07CisgICBjaGFyICpwOworCisgICBoZGRMb2coIExPRzEsICJoZGRfSW5kaWNhdGVTY2FuUmVzdWx0ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICBkZXNjcmlwdG9yLT5ic3NJZFswXSwKKyAgICAgICAgICBkZXNjcmlwdG9yLT5ic3NJZFsxXSwKKyAgICAgICAgICBkZXNjcmlwdG9yLT5ic3NJZFsyXSwKKyAgICAgICAgICBkZXNjcmlwdG9yLT5ic3NJZFszXSwKKyAgICAgICAgICBkZXNjcmlwdG9yLT5ic3NJZFs0XSwKKyAgICAgICAgICBkZXNjcmlwdG9yLT5ic3NJZFs1XSk7CisKKyAgIGVycm9yID0gMDsKKyAgIGxhc3RfZXZlbnQgPSBjdXJyZW50X2V2ZW50OworICAgdm9zX21lbV96ZXJvKCZldmVudCwgc2l6ZW9mIChldmVudCkpOworCisgICAvKiBCU1NJRCAqLworICAgZXZlbnQuY21kID0gU0lPQ0dJV0FQOworICAgZXZlbnQudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgIHZvc19tZW1fY29weSAoZXZlbnQudS5hcF9hZGRyLnNhX2RhdGEsIGRlc2NyaXB0b3ItPmJzc0lkLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mIChkZXNjcmlwdG9yLT5ic3NJZCkpOworICAgY3VycmVudF9ldmVudCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHNjYW5JbmZvLT5pbmZvLGN1cnJlbnRfZXZlbnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAmZXZlbnQsIElXX0VWX0FERFJfTEVOKTsKKworICAgaWYgKGxhc3RfZXZlbnQgPT0gY3VycmVudF9ldmVudCkKKyAgIHsKKyAgICAgIC8qIG5vIHNwYWNlIHRvIGFkZCBldmVudCAqLworICAgICAgLyogRXJyb3IgY29kZSBtYXkgYmUgRTJCSUcgKi8KKyAgICAgICBoZGRMb2coIExPR1csICJoZGRfSW5kaWNhdGVTY2FuUmVzdWx0OiBubyBzcGFjZSBmb3IgU0lPQ0dJV0FQICIpOworICAgICAgIHJldHVybiAtRTJCSUc7CisgICB9CisKKyAgIGxhc3RfZXZlbnQgPSBjdXJyZW50X2V2ZW50OworICAgdm9zX21lbV96ZXJvKCZldmVudCwgc2l6ZW9mIChzdHJ1Y3QgaXdfZXZlbnQpKTsKKworIC8qIFByb3RvY29sIE5hbWUgKi8KKyAgIGV2ZW50LmNtZCA9IFNJT0NHSVdOQU1FOworCisgICBzd2l0Y2ggKGRlc2NyaXB0b3ItPm53VHlwZSkKKyAgIHsKKyAgIGNhc2UgZVNJUl8xMUFfTldfVFlQRToKKyAgICAgICBtb2Rlc3RyID0gImEiOworICAgICAgIGJyZWFrOworICAgY2FzZSBlU0lSXzExQl9OV19UWVBFOgorICAgICAgIG1vZGVzdHIgPSAiYiI7CisgICAgICAgYnJlYWs7CisgICBjYXNlIGVTSVJfMTFHX05XX1RZUEU6CisgICAgICAgbW9kZXN0ciA9ICJnIjsKKyAgICAgICBicmVhazsKKyAgIGNhc2UgZVNJUl8xMU5fTldfVFlQRToKKyAgICAgICBtb2Rlc3RyID0gIm4iOworICAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgICBoZGRMb2coIExPR1csICIlczogVW5rbm93biBuZXR3b3JrIHR5cGUgWyVkXSIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVzY3JpcHRvci0+bndUeXBlKTsKKyAgICAgICBtb2Rlc3RyID0gIj8iOworICAgICAgIGJyZWFrOworICAgfQorICAgc25wcmludGYoZXZlbnQudS5uYW1lLCBJRk5BTVNJWiwgIklFRUUgODAyLjExJXMiLCBtb2Rlc3RyKTsKKyAgIGN1cnJlbnRfZXZlbnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzY2FuSW5mby0+aW5mbyxjdXJyZW50X2V2ZW50LCBlbmQsCisgICAgICAgICAgICAgICAgICAgJmV2ZW50LCBJV19FVl9DSEFSX0xFTik7CisKKyAgIGlmIChsYXN0X2V2ZW50ID09IGN1cnJlbnRfZXZlbnQpCisgICB7IC8qIG5vIHNwYWNlIHRvIGFkZCBldmVudCAqLworICAgICAgIGhkZExvZyggTE9HVywgImhkZF9JbmRpY2F0ZVNjYW5SZXN1bHQ6IG5vIHNwYWNlIGZvciBTSU9DR0lXTkFNRSIpOworICAgICAgLyogRXJyb3IgY29kZSwgbWF5IGJlIEUyQklHICovCisgICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgIH0KKworICAgbGFzdF9ldmVudCA9IGN1cnJlbnRfZXZlbnQ7CisgICB2b3NfbWVtX3plcm8oICZldmVudCwgc2l6ZW9mIChzdHJ1Y3QgaXdfZXZlbnQpKTsKKworICAgLypGcmVxKi8KKyAgIGV2ZW50LmNtZCA9IFNJT0NHSVdGUkVROworCisgICBldmVudC51LmZyZXEubSA9IGRlc2NyaXB0b3ItPmNoYW5uZWxJZDsKKyAgIGV2ZW50LnUuZnJlcS5lID0gMDsKKyAgIGV2ZW50LnUuZnJlcS5pID0gMDsKKyAgIGN1cnJlbnRfZXZlbnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzY2FuSW5mby0+aW5mbyxjdXJyZW50X2V2ZW50LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50LCBJV19FVl9GUkVRX0xFTik7CisKKyAgIGlmIChsYXN0X2V2ZW50ID09IGN1cnJlbnRfZXZlbnQpCisgICB7IC8qIG5vIHNwYWNlIHRvIGFkZCBldmVudCAqLworICAgICAgIHJldHVybiAtRTJCSUc7CisgICB9CisKKyAgIGxhc3RfZXZlbnQgPSBjdXJyZW50X2V2ZW50OworICAgdm9zX21lbV96ZXJvKCAmZXZlbnQsIHNpemVvZiAoc3RydWN0IGl3X2V2ZW50KSk7CisKKyAgIC8qIEJTUyBNb2RlICovCisgICBldmVudC5jbWQgPSBTSU9DR0lXTU9ERTsKKworICAgY2FwYWJpbGl0eUluZm8gPSBkZXNjcmlwdG9yLT5jYXBhYmlsaXR5SW5mbzsKKworICAgaWYgKFNJUl9NQUNfR0VUX0VTUyhjYXBhYmlsaXR5SW5mbykpCisgICB7CisgICAgICAgZXZlbnQudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKyAgIH0KKyAgIGVsc2UgaWYgKFNJUl9NQUNfR0VUX0lCU1MoY2FwYWJpbGl0eUluZm8pKQorICAgeworICAgICAgIGV2ZW50LnUubW9kZSA9IElXX01PREVfQURIT0M7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgLyogbmVpdGhlciBFU1Mgb3IgSUJTUyAqLworICAgICAgIGV2ZW50LnUubW9kZSA9IElXX01PREVfQVVUTzsKKyAgIH0KKworICAgY3VycmVudF9ldmVudCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHNjYW5JbmZvLT5pbmZvLGN1cnJlbnRfZXZlbnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQsIElXX0VWX1VJTlRfTEVOKTsKKworICAgaWYgKGxhc3RfZXZlbnQgPT0gY3VycmVudF9ldmVudCkKKyAgIHsgLyogbm8gc3BhY2UgdG8gYWRkIGV2ZW50ICovCisgICAgICAgaGRkTG9nKCBMT0dXLCAiaGRkX0luZGljYXRlU2NhblJlc3VsdDogbm8gc3BhY2UgZm9yIFNJT0NHSVdNT0RFIik7CisgICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgIH0KKyAgIC8qIFRvIGV4dHJhY3QgU1NJRCAqLworICAgaWVfbGVuZ3RoID0gR0VUX0lFX0xFTl9JTl9CU1MoIGRlc2NyaXB0b3ItPmxlbmd0aCApOworCisgICBpZiAoaWVfbGVuZ3RoID4gMCkKKyAgIHsKKyAgICAgICB0RG90MTFmQmVhY29uSUVzIGRvdDExQmVhY29uSUVzOworICAgICAgIHREb3QxMWZJRVNTSUQgKnBEb3QxMVNTSUQ7CisgICAgICAgdERvdDExZklFU3VwcFJhdGVzICpwRG90MTFTdXBwUmF0ZXM7CisgICAgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICpwRG90MTFFeHRTdXBwUmF0ZXM7CisgICAgICAgdERvdDExZklFSFRDYXBzICpwRG90MTFJRUhUQ2FwczsKKyAgICAgICBpbnQgbnVtQmFzaWNSYXRlcyA9IDA7CisgICAgICAgaW50IG1heE51bVJhdGVzID0gMDsKKworICAgICAgIHBEb3QxMUlFSFRDYXBzID0gTlVMTDsKKworICAgICAgIGRvdDExZlVucGFja0JlYWNvbklFcyAoKHRwQW5pU2lyR2xvYmFsKQorICAgICAgICAgICBoSGFsLCAodEFOSV9VOCAqKSBkZXNjcmlwdG9yLT5pZUZpZWxkcywgaWVfbGVuZ3RoLCAgJmRvdDExQmVhY29uSUVzKTsKKworICAgICAgIHBEb3QxMVNTSUQgPSAmZG90MTFCZWFjb25JRXMuU1NJRDsKKworCisgICAgICAgaWYgKHBEb3QxMVNTSUQtPnByZXNlbnQgKSB7CisgICAgICAgICAgbGFzdF9ldmVudCA9IGN1cnJlbnRfZXZlbnQ7CisgICAgICAgICAgdm9zX21lbV96ZXJvICgmZXZlbnQsIHNpemVvZiAoc3RydWN0IGl3X2V2ZW50KSk7CisKKyAgICAgICAgICBldmVudC5jbWQgPSBTSU9DR0lXRVNTSUQ7CisgICAgICAgICAgZXZlbnQudS5kYXRhLmZsYWdzID0gMTsKKyAgICAgICAgICBldmVudC51LmRhdGEubGVuZ3RoID0gc2Nhbl9yZXN1bHQtPnNzSWQubGVuZ3RoOworICAgICAgICAgIGN1cnJlbnRfZXZlbnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludCAoc2NhbkluZm8tPmluZm8sY3VycmVudF9ldmVudCwgZW5kLAorICAgICAgICAgICAgICAgICAgJmV2ZW50LCAoY2hhciAqKXNjYW5fcmVzdWx0LT5zc0lkLnNzSWQpOworCisgICAgICAgICAgaWYobGFzdF9ldmVudCA9PSBjdXJyZW50X2V2ZW50KQorICAgICAgICAgIHsgLyogbm8gc3BhY2UgdG8gYWRkIGV2ZW50ICovCisgICAgICAgICAgICAgaGRkTG9nKCBMT0dXLCAiaGRkX0luZGljYXRlU2NhblJlc3VsdDogbm8gc3BhY2UgZm9yIFNJT0NHSVdFU1NJRCIpOworICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisgICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgaWYoIGhkZF9HZXRXUEFSU05JRXMoICggdEFOSV9VOCAqKSBkZXNjcmlwdG9yLT5pZUZpZWxkcywgaWVfbGVuZ3RoLCAmbGFzdF9ldmVudCwgJmN1cnJlbnRfZXZlbnQsIHNjYW5JbmZvICkgIDwgMCAgICApCisgICAgICB7CisgICAgICAgICAgaGRkTG9nKCBMT0dXLCAiaGRkX0luZGljYXRlU2NhblJlc3VsdDogbm8gc3BhY2UgZm9yIFNJT0NHSVdFU1NJRCIpOworICAgICAgICAgIHJldHVybiAtRTJCSUc7CisgICAgICB9CisKKyAgICAgIGxhc3RfZXZlbnQgPSBjdXJyZW50X2V2ZW50OworICAgICAgY3VycmVudF9wYWQgPSBjdXJyZW50X2V2ZW50ICsgSVdfRVZfTENQX0xFTjsKKyAgICAgIHZvc19tZW1femVybyggJmV2ZW50LCBzaXplb2YgKHN0cnVjdCBpd19ldmVudCkpOworCisgICAgICAvKlJhdGVzKi8KKyAgICAgIGV2ZW50LmNtZCA9IFNJT0NHSVdSQVRFOworCisKKyAgICAgIHBEb3QxMVN1cHBSYXRlcyA9ICZkb3QxMUJlYWNvbklFcy5TdXBwUmF0ZXM7CisKKyAgICAgIGlmIChwRG90MTFTdXBwUmF0ZXMtPnByZXNlbnQgKQorICAgICAgeworICAgICAgICAgIGludCBpOworCisgICAgICAgICAgbnVtQmFzaWNSYXRlcyA9IHBEb3QxMVN1cHBSYXRlcy0+bnVtX3JhdGVzOzsKKyAgICAgICAgICBmb3IgKGk9MDsgaTxwRG90MTFTdXBwUmF0ZXMtPm51bV9yYXRlczsgaSsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKDAgIT0gKHBEb3QxMVN1cHBSYXRlcy0+cmF0ZXNbaV0gJiAweDdGKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZXZlbnQudS5iaXRyYXRlLnZhbHVlID0gaGRkX1RyYW5zbGF0ZUFCR1JhdGVUb01icHNSYXRlICgKKyAgICAgICAgICAgICAgICAgICAgICAmcERvdDExU3VwcFJhdGVzLT5yYXRlc1tpXSk7CisKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFkID0gaXdlX3N0cmVhbV9hZGRfdmFsdWUgKHNjYW5JbmZvLT5pbmZvLGN1cnJlbnRfZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9wYWQsIGVuZCwgJmV2ZW50LCBJV19FVl9QQVJBTV9MRU4pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICB9CisKKyAgICAgIHBEb3QxMUV4dFN1cHBSYXRlcyA9ICZkb3QxMUJlYWNvbklFcy5FeHRTdXBwUmF0ZXM7CisKKyAgICAgIGlmIChwRG90MTFFeHRTdXBwUmF0ZXMtPnByZXNlbnQgKQorICAgICAgeworICAgICAgICAgIGludCBpLG5vX29mX3JhdGVzOworICAgICAgICAgIG1heE51bVJhdGVzID0gbnVtQmFzaWNSYXRlcyArIHBEb3QxMUV4dFN1cHBSYXRlcy0+bnVtX3JhdGVzOworCisgICAgICAgICAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSB0b3RhbCBudW1iZXIgb2YgcmF0ZXMKKyAgICAgICAgICAgICAgIGRvZXNuJ3QgZXhjZWVkIElXX01BWF9CSVRSQVRFUyAqLworCisgICAgICAgICAgbWF4TnVtUmF0ZXMgPSBWT1NfTUlOKG1heE51bVJhdGVzICwgSVdfTUFYX0JJVFJBVEVTKTsKKworICAgICAgICAgIGlmKChtYXhOdW1SYXRlcyAtIG51bUJhc2ljUmF0ZXMpID4gTUFYX1JBVEVTKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBub19vZl9yYXRlcyA9IE1BWF9SQVRFUzsKKyAgICAgICAgICAgICBoZGRMb2coIExPR1csICJBY2Nlc3NpbmcgYXJyYXkgb3V0IG9mIGJvdW5kIHRoYXQgYXJyYXkgaXMgcERvdDExRXh0U3VwcFJhdGVzLT5yYXRlcyAiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG5vX29mX3JhdGVzID0gbWF4TnVtUmF0ZXMgLSBudW1CYXNpY1JhdGVzOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKCBpPTA7IGk8IG5vX29mX3JhdGVzIDsgaSsrICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgwICE9IChwRG90MTFFeHRTdXBwUmF0ZXMtPnJhdGVzW2ldICYgMHg3RikpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGV2ZW50LnUuYml0cmF0ZS52YWx1ZSA9IGhkZF9UcmFuc2xhdGVBQkdSYXRlVG9NYnBzUmF0ZSAoCisgICAgICAgICAgICAgICAgICAgICAgJnBEb3QxMUV4dFN1cHBSYXRlcy0+cmF0ZXNbaV0pOworCisgICAgICAgICAgICAgICAgICBjdXJyZW50X3BhZCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlIChzY2FuSW5mby0+aW5mbyxjdXJyZW50X2V2ZW50LAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFkLCBlbmQsICZldmVudCwgSVdfRVZfUEFSQU1fTEVOKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKworCisgICAgICBpZiAoKGN1cnJlbnRfcGFkIC0gY3VycmVudF9ldmVudCkgPj0gSVdfRVZfTENQX0xFTikKKyAgICAgIHsKKyAgICAgICAgICBjdXJyZW50X2V2ZW50ID0gY3VycmVudF9wYWQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAgaWYgKGxhc3RfZXZlbnQgPT0gY3VycmVudF9ldmVudCkKKyAgICAgICAgICB7IC8qIG5vIHNwYWNlIHRvIGFkZCBldmVudCAqLworICAgICAgICAgICAgICBoZGRMb2coIExPR1csICJoZGRfSW5kaWNhdGVTY2FuUmVzdWx0OiBubyBzcGFjZSBmb3IgU0lPQ0dJV1JBVEUiKTsKKyAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxhc3RfZXZlbnQgPSBjdXJyZW50X2V2ZW50OworICAgICAgdm9zX21lbV96ZXJvICgmZXZlbnQsIHNpemVvZiAoc3RydWN0IGl3X2V2ZW50KSk7CisKKworICAgICAgZXZlbnQuY21kID0gU0lPQ0dJV0VOQ09ERTsKKworICAgICAgaWYgKFNJUl9NQUNfR0VUX1BSSVZBQ1koY2FwYWJpbGl0eUluZm8pKQorICAgICAgeworICAgICAgICAgZXZlbnQudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBldmVudC51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisgICAgICB9CisgICAgICBldmVudC51LmRhdGEubGVuZ3RoID0gMDsKKworICAgICAgY3VycmVudF9ldmVudCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHNjYW5JbmZvLT5pbmZvLGN1cnJlbnRfZXZlbnQsIGVuZCwgJmV2ZW50LCAoY2hhciAqKXBEb3QxMVNTSUQtPnNzaWQpOworCisKKyAgICAgIGlmKGxhc3RfZXZlbnQgPT0gY3VycmVudF9ldmVudCkKKyAgICAgIHsgLyogbm8gc3BhY2UgdG8gYWRkIGV2ZW50CisgICAgICAgICAgICAgICBFcnJvciBjb2RlLCBtYXkgYmUgRTJCSUcgKi8KKyAgICAgICAgICByZXR1cm4gLUUyQklHOworICAgICAgfQorICAgfQorCisgICBsYXN0X2V2ZW50ID0gY3VycmVudF9ldmVudDsKKyAgIHZvc19tZW1femVybyggJmV2ZW50LCBzaXplb2YgKHN0cnVjdCBpd19ldmVudCkpOworCisgICAgLypSU1NJKi8KKyAgIGV2ZW50LmNtZCA9IElXRVZRVUFMOworICAgZXZlbnQudS5xdWFsLnF1YWwgPSBkZXNjcmlwdG9yLT5yc3NpOworICAgZXZlbnQudS5xdWFsLm5vaXNlID0gZGVzY3JpcHRvci0+c2lucjsKKworICAgLypUbyBrZWVwIHRoZSByc3NpIGljb24gb2YgdGhlIGNvbm5lY3RlZCBBUCBpbiB0aGUgc2NhbiB3aW5kb3cKKyAgICAqYW5kIHRoZSByc3NpIGljb24gb2YgdGhlIHdpcmVsZXNzIG5ldHdvcmtzIGluIHN5bmMgKi8gICAKKyAgIGlmICgoIGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCA9PSAKKyAgICAgICAgICAgICAgcEFkYXB0ZXItPnNlc3Npb25DdHguc3RhdGlvbi5jb25uX2luZm8uY29ublN0YXRlICkgJiYKKyAgICAgICAgICAgICAgKCBWT1NfVFJVRSA9PSB2b3NfbWVtX2NvbXBhcmUoZGVzY3JpcHRvci0+YnNzSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uLmNvbm5faW5mby5ic3NJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfQlNTSURfTEVOKSkpCisgICB7CisgICAgICBldmVudC51LnF1YWwubGV2ZWwgPSBwQWRhcHRlci0+cnNzaTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGV2ZW50LnUucXVhbC5sZXZlbCA9IFZPU19NSU4gKChkZXNjcmlwdG9yLT5yc3NpICsgZGVzY3JpcHRvci0+c2luciksIDApOworICAgfQorICAgCisgICBldmVudC51LnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQ7CisKKyAgIGN1cnJlbnRfZXZlbnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzY2FuSW5mby0+aW5mbyxjdXJyZW50X2V2ZW50LAorICAgICAgIGVuZCwgJmV2ZW50LCBJV19FVl9RVUFMX0xFTik7CisKKyAgIGlmKGxhc3RfZXZlbnQgPT0gY3VycmVudF9ldmVudCkKKyAgIHsgLyogbm8gc3BhY2UgdG8gYWRkIGV2ZW50ICovCisgICAgICAgaGRkTG9nKCBMT0dXLCAiaGRkX0luZGljYXRlU2NhblJlc3VsdDogbm8gc3BhY2UgZm9yIElXRVZRVUFMIik7CisgICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgIH0KKworCisgICAvKiBBR0UgKi8KKyAgIGV2ZW50LmNtZCA9IElXRVZDVVNUT007CisgICBwID0gY3VzdG9tOworICAgcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiwgIiBBZ2U6ICVsdSIsCisgICAgICAgICAgICAgICAgIHZvc190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCkgLSBkZXNjcmlwdG9yLT5uUmVjZWl2ZWRUaW1lKTsKKyAgIGV2ZW50LnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOworICAgY3VycmVudF9ldmVudCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50IChzY2FuSW5mby0+aW5mbyxjdXJyZW50X2V2ZW50LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCwgY3VzdG9tKTsKKyAgIGlmKGxhc3RfZXZlbnQgPT0gY3VycmVudF9ldmVudCkKKyAgIHsgLyogbm8gc3BhY2UgdG8gYWRkIGV2ZW50ICovCisgICAgICBoZGRMb2coIExPR1csICJoZGRfSW5kaWNhdGVTY2FuUmVzdWx0OiBubyBzcGFjZSBmb3IgSVdFVkNVU1RPTSAoYWdlKSIpOworICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgIH0KKworICAgc2NhbkluZm8tPnN0YXJ0ID0gY3VycmVudF9ldmVudDsKKworICAgcmV0dXJuIDA7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfU2NhblJlcXVlc3RDYWxsYmFjaygpIC0KKworICAgVGhlIHNtZSBtb2R1bGUgY2FsbHMgdGhpcyBjYWxsYmFjayBmdW5jdGlvbiBvbmNlIGl0IGZpbmlzaCB0aGUgc2NhbiByZXF1ZXN0CisgICBhbmQgdGhpcyBmdW5jdGlvbiBub3RpZmllcyB0aGUgc2NhbiBjb21wbGV0ZSBldmVudCB0byB0aGUgd3BhX3N1cHBsaWNhbnQuCisKKyAgXHBhcmFtICAtIGhhbEhhbmRsZSAtIFBvaW50ZXIgdG8gdGhlIEhhbCBIYW5kbGUuCisgICAgICAgICAgICAgIC0gcENvbnRleHQgLSBQb2ludGVyIHRvIHRoZSBkYXRhIGNvbnRleHQuCisgICAgICAgICAgICAgIC0gc2NhbklkIC0gU2NhbiBJRC4KKyAgICAgICAgICAgICAgLSBzdGF0dXMgLSBDU1IgU3RhdHVzLgorICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBlSGFsU3RhdHVzIGhkZF9TY2FuUmVxdWVzdENhbGxiYWNrKHRIYWxIYW5kbGUgaGFsSGFuZGxlLCB2b2lkICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBzY2FuSWQsIGVDc3JTY2FuU3RhdHVzIHN0YXR1cykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHBDb250ZXh0OworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldikgOworICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKyAgICBpbnQgd2VfZXZlbnQ7CisgICAgY2hhciAqbXNnOworICAgIAorICAgIEVOVEVSKCk7CisKKyAgICBoZGRMb2coTE9HVywiJXMgY2FsbGVkIHdpdGggaGFsSGFuZGxlID0gJXAsIHBDb250ZXh0ID0gJXAsIHNjYW5JRCA9ICVkLCIKKyAgICAgICAgICAgIiByZXR1cm5lZCBzdGF0dXMgPSAlZCIsIF9fRlVOQ1RJT05fXywgaGFsSGFuZGxlLCBwQ29udGV4dCwKKyAgICAgICAgICAgKGludCkgc2NhbklkLCAoaW50KSBzdGF0dXMpOworCisgICAgLyogaWYgdGhlcmUgaXMgYSBzY2FuIHJlcXVlc3QgcGVuZGluZyB3aGVuIHRoZSB3bGFuIGRyaXZlciBpcyB1bmxvYWRlZAorICAgICAgIHdlIG1heSBiZSBpbnZva2VkIGFzIFNNRSBmbHVzaGVzIGl0cyBwZW5kaW5nIHF1ZXVlLiAgSWYgdGhhdCBpcyB0aGUKKyAgICAgICBjYXNlLCB0aGUgdW5kZXJseWluZyBuZXRfZGV2aWNlIG1heSBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQsIHNvCisgICAgICAgZG8gc29tZSBxdWljayBzYW5pdHkgYmVmb3JlIHByb2NlZWRpbmcgKi8KKyAgICBpZiAocEFkYXB0ZXItPmRldiAhPSBkZXYpCisgICAgeworICAgICAgIGhkZExvZyhMT0dXLCAiJXM6IGRldmljZSBtaXNtYXRjaCAlcCB2cyAlcCIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBBZGFwdGVyLT5kZXYsIGRldik7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIC8qIENoZWNrIHRoZSBzY2FuSWQgKi8KKyAgICBpZiAocEFkYXB0ZXItPnNjYW5faW5mby5zY2FuSWQgIT0gc2NhbklkKQorICAgIHsKKyAgICAgICAgaGRkTG9nKExPR1csICIlcyBjYWxsZWQgd2l0aCBtaXNtYXRjaGVkIHNjYW5JZCBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5JZCA9ICVkICIKKyAgICAgICAgICAgICAgICJzY2FuSWQgPSAlZCAiLCBfX0ZVTkNUSU9OX18sIChpbnQpIHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbklkLAorICAgICAgICAgICAgICAgIChpbnQpIHNjYW5JZCk7CisgICAgfQorCisgICAgLyogU2NhbiBpcyBubyBsb25nZXIgcGVuZGluZyAqLworICAgIHBBZGFwdGVyLT5zY2FuX2luZm8ubVNjYW5QZW5kaW5nID0gVk9TX0ZBTFNFOworCisgICAgLy8gbm90aWZ5IGFueSBhcHBsaWNhdGlvbnMgdGhhdCBtYXkgYmUgaW50ZXJlc3RlZAorICAgIG1lbXNldCgmd3JxdSwgJ1wwJywgc2l6ZW9mKHdycXUpKTsKKyAgICB3ZV9ldmVudCA9IFNJT0NHSVdTQ0FOOworICAgIG1zZyA9IE5VTEw7CisgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIHdlX2V2ZW50LCAmd3JxdSwgbXNnKTsKKworICAgIEVYSVQoKTsKKworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogZXhpdCAhISEiLF9fZnVuY19fKTsKKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgaXdfc2V0X3NjYW4oKSAtCisKKyAgIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgc2NhbiByZXF1ZXN0IGZyb20gdGhlIHdwYV9zdXBwbGljYW50CisgICBhbmQgc2V0IHRoZSBzY2FuIHJlcXVlc3QgdG8gdGhlIFNNRQorCisgIFxwYXJhbSAgLSBkZXYgLSBQb2ludGVyIHRvIHRoZSBuZXQgZGV2aWNlLgorICAgICAgICAgICAgICAtIGluZm8gLSBQb2ludGVyIHRvIHRoZSBpd19yZXF1ZXN0X2luZm8uCisgICAgICAgICAgICAgIC0gd3JxdSAtIFBvaW50ZXIgdG8gdGhlIGl3cmVxX2RhdGEuCisgICAgICAgICAgICAgIC0gZXh0cmEgLSBQb2ludGVyIHRvIHRoZSBkYXRhLgorICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworaW50IGl3X3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KSA7CisgICBoZGRfd2V4dF9zdGF0ZV90ICpwd2V4dEJ1ZiA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICB0Q3NyU2NhblJlcXVlc3Qgc2NhblJlcXVlc3Q7CisgICB2X1UzMl90IHNjYW5JZCA9IDA7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICBzdHJ1Y3QgaXdfc2Nhbl9yZXEgKnNjYW5SZXEgPSAoc3RydWN0IGl3X3NjYW5fcmVxICopZXh0cmE7CisKKyAgIEVOVEVSKCk7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogZW50ZXIgISEhIixfX2Z1bmNfXyk7CisKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyAgIC8vU2NhbiBub3Qgc3VwcG9ydGVkIHdoZW4gQU1QIHRyYWZmaWMgaXMgb24uCisgICBpZiggVk9TX1RSVUUgPT0gV0xBTkJBUF9BbXBTZXNzaW9uT24oKSApIAorICAgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vIHNjYW5uaW5nIHdoZW4gQU1QIGlzIG9uIixfX2Z1bmNfXyk7CisgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisjZW5kaWYKKyAgIGlmKHBBZGFwdGVyLT5zY2FuX2luZm8ubVNjYW5QZW5kaW5nID09IFRSVUUpCisgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczptU2NhblBlbmRpbmcgaXMgVFJVRSAhISEiLF9fZnVuY19fKTsKKyAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKworICAgaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKyAgIHZvc19tZW1femVybyggJnNjYW5SZXF1ZXN0LCBzaXplb2Yoc2NhblJlcXVlc3QpKTsKKworICAgaWYgKE5VTEwgIT0gd3JxdS0+ZGF0YS5wb2ludGVyKQorICAgeworICAgICAgIC8qIHNldCBzY2FuVHlwZSwgYWN0aXZlIG9yIHBhc3NpdmUgKi8KKyAgICAgICBpZiAoKElXX1NDQU5fVFlQRV9BQ1RJVkUgPT0gIHNjYW5SZXEtPnNjYW5fdHlwZSkgfHwgKGVTSVJfQUNUSVZFX1NDQU4gPT0gcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuX21vZGUpKQorICAgICAgIHsKKyAgICAgICAgICAgc2NhblJlcXVlc3Quc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgICBzY2FuUmVxdWVzdC5zY2FuVHlwZSA9IGVTSVJfUEFTU0lWRV9TQ0FOOworICAgICAgIH0KKworICAgICAgIC8qIHNldCBic3NpZCB1c2luZyBzb2NrYWRkciBmcm9tIGl3X3NjYW5fcmVxICovCisgICAgICAgdm9zX21lbV9jb3B5KHNjYW5SZXF1ZXN0LmJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAmc2NhblJlcS0+YnNzaWQuc2FfZGF0YSwgc2l6ZW9mKHNjYW5SZXF1ZXN0LmJzc2lkKSApOworCisgICAgICBpZiAod3JxdS0+ZGF0YS5mbGFncyAmIElXX1NDQU5fVEhJU19FU1NJRCkgIHsKKworICAgICAgICAgIGlmKHNjYW5SZXEtPmVzc2lkX2xlbikgeworICAgICAgICAgICAgICBzY2FuUmVxdWVzdC5TU0lEcy5udW1PZlNTSURzID0gMTsKKyAgICAgICAgICAgICAgc2NhblJlcXVlc3QuU1NJRHMuU1NJRExpc3QgPSggdENzclNTSURJbmZvICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRDc3JTU0lESW5mbykpOworICAgICAgICAgICAgICBpZihzY2FuUmVxdWVzdC5TU0lEcy5TU0lETGlzdCkgeworICAgICAgICAgICAgICAgICBzY2FuUmVxdWVzdC5TU0lEcy5TU0lETGlzdC0+U1NJRC5sZW5ndGggPSAgICAgICAgICAgICBzY2FuUmVxLT5lc3NpZF9sZW47CisgICAgICAgICAgICAgICAgIHZvc19tZW1fY29weShzY2FuUmVxdWVzdC5TU0lEcy5TU0lETGlzdC0+ICBTU0lELnNzSWQsc2NhblJlcS0+ZXNzaWQsc2NhblJlcS0+ZXNzaWRfbGVuKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzY2FuUmVxdWVzdC5TU0lEcy5udW1PZlNTSURzID0gMDsKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIsX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICAgLyogc2V0IG1pbiBhbmQgbWF4IGNoYW5uZWwgdGltZSAqLworICAgICAgIHNjYW5SZXF1ZXN0Lm1pbkNoblRpbWUgPSBzY2FuUmVxLT5taW5fY2hhbm5lbF90aW1lOworICAgICAgIHNjYW5SZXF1ZXN0Lm1heENoblRpbWUgPSBzY2FuUmVxLT5tYXhfY2hhbm5lbF90aW1lOworCisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgaWYocEFkYXB0ZXItPnNjYW5faW5mby5zY2FuX21vZGUgPT0gZVNJUl9BQ1RJVkVfU0NBTikgeworICAgICAgICAgICAvKiBzZXQgdGhlIHNjYW4gdHlwZSB0byBhY3RpdmUgKi8KKyAgICAgICAgICAgc2NhblJlcXVlc3Quc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHNjYW5SZXF1ZXN0LnNjYW5UeXBlID0gZVNJUl9QQVNTSVZFX1NDQU47CisgICAgICAgfQorCisgICAgICAgdm9zX21lbV9zZXQoIHNjYW5SZXF1ZXN0LmJzc2lkLCBzaXplb2YoIHRDc3JCc3NpZCApLCAweGZmICk7CisKKyAgICAgICAvKiBzZXQgbWluIGFuZCBtYXggY2hhbm5lbCB0aW1lIHRvIHplcm8gKi8KKyAgICAgICBzY2FuUmVxdWVzdC5taW5DaG5UaW1lID0gMDsKKyAgICAgICBzY2FuUmVxdWVzdC5tYXhDaG5UaW1lID0gMDsKKyAgIH0KKworICAgLyogc2V0IEJTU1R5cGUgdG8gZGVmYXVsdCB0eXBlICovCisgICBzY2FuUmVxdWVzdC5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9BTlk7CisKKyAgIC8qU2NhbiBhbGwgdGhlIGNoYW5uZWxzICovCisgICBzY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKworICAgc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworCisgICAvKiBzZXQgcmVxdWVzdFR5cGUgdG8gZnVsbCBzY2FuICovCisgICBzY2FuUmVxdWVzdC5yZXF1ZXN0VHlwZSA9IGVDU1JfU0NBTl9SRVFVRVNUX0ZVTExfU0NBTjsKKworICAgLyogaWYgcHJldmlvdXMgZ2VuSUUgaXMgbm90IE5VTEwsIHVwZGF0ZSBTY2FuSUUgKi8KKyAgIGlmICgwICE9IHB3ZXh0QnVmLT5nZW5JRS5sZW5ndGgpCisgICB7CisgICAgICAgbWVtc2V0KCAmcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuQWRkSUUsIDAsIHNpemVvZihwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRSkgKTsKKyAgICAgICBtZW1jcHkoIHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmFkZElFZGF0YSwgcHdleHRCdWYtPmdlbklFLmFkZElFZGF0YSwgCisgICAgICAgICAgIHB3ZXh0QnVmLT5nZW5JRS5sZW5ndGggKTsKKyAgICAgICBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5sZW5ndGggPSBwd2V4dEJ1Zi0+Z2VuSUUubGVuZ3RoOworCisgICAgICAgcHdleHRCdWYtPnJvYW1Qcm9maWxlLnBBZGRJRVNjYW4gPSBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5hZGRJRWRhdGE7CisgICAgICAgcHdleHRCdWYtPnJvYW1Qcm9maWxlLm5BZGRJRVNjYW5MZW5ndGggPSBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5sZW5ndGg7CisgICAKKyAgICAgICAvKiBjbGVhciBwcmV2aW91cyBnZW5JRSBhZnRlciB1c2UgaXQgKi8KKyAgICAgICBtZW1zZXQoICZwd2V4dEJ1Zi0+Z2VuSUUsIDAsIHNpemVvZihwd2V4dEJ1Zi0+Z2VuSUUpICk7CisgICB9CisKKyAgIC8qIHB1c2ggYWRkSUVTY2FuIGluIHNjYW5SZXF1c2V0IGlmIGV4aXN0ICovCisgICBpZiAocEFkYXB0ZXItPnNjYW5faW5mby5zY2FuQWRkSUUuYWRkSUVkYXRhICYmIAorICAgICAgIHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmxlbmd0aCkKKyAgIHsgCisgICAgICAgc2NhblJlcXVlc3QudUlFRmllbGRMZW4gPSBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5sZW5ndGg7CisgICAgICAgc2NhblJlcXVlc3QucElFRmllbGQgPSBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5hZGRJRWRhdGE7CisgICB9CisKKyAgIHN0YXR1cyA9IHNtZV9TY2FuUmVxdWVzdCggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCwmc2NhblJlcXVlc3QsICZzY2FuSWQsICZoZGRfU2NhblJlcXVlc3RDYWxsYmFjaywgZGV2ICk7IAorICAgaWYgKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOnNtZV9TY2FuUmVxdWVzdCAgZmFpbCAlZCEhISIsX19mdW5jX18sIHN0YXR1cyk7CisgICAgICAgZ290byBlcnJvcjsKKyAgIH0KKworICAgcEFkYXB0ZXItPnNjYW5faW5mby5tU2NhblBlbmRpbmcgPSBUUlVFOworCisgICBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5JZCA9IHNjYW5JZDsKKworZXJyb3I6CisgICBpZiAoKHdycXUtPmRhdGEuZmxhZ3MgJiBJV19TQ0FOX1RISVNfRVNTSUQpICYmIChzY2FuUmVxLT5lc3NpZF9sZW4pKQorICAgICAgIHZvc19tZW1fZnJlZShzY2FuUmVxdWVzdC5TU0lEcy5TU0lETGlzdCk7CisKKyAgIEVYSVQoKTsKKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBleGl0ICEhISIsX19mdW5jX18pOworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIGl3X2dldF9zY2FuKCkgLQorCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNjYW4gcmVzdWx0cyB0byB0aGUgd3BhX3N1cHBsaWNhbnQKKworICBccGFyYW0gIC0gZGV2IC0gUG9pbnRlciB0byB0aGUgbmV0IGRldmljZS4KKyAgICAgICAgICAgICAgLSBpbmZvIC0gUG9pbnRlciB0byB0aGUgaXdfcmVxdWVzdF9pbmZvLgorICAgICAgICAgICAgICAtIHdycXUgLSBQb2ludGVyIHRvIHRoZSBpd3JlcV9kYXRhLgorICAgICAgICAgICAgICAtIGV4dHJhIC0gUG9pbnRlciB0byB0aGUgZGF0YS4KKyAgXHJldHVybiAtIDAgZm9yIHN1Y2Nlc3MsIG5vbiB6ZXJvIGZvciBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK2ludCBpd19nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpIDsKKyAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKyAgIHRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQ7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICBoZGRfc2Nhbl9pbmZvX3Qgc2NhbkluZm87CisgICB0U2NhblJlc3VsdEhhbmRsZSBwUmVzdWx0OworICAgaW50IGkgPSAwOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IGVudGVyIGJ1ZmZlciBsZW5ndGggJWQhISEiLAorICAgICAgIF9fZnVuY19fLCAod3JxdS0+ZGF0YS5sZW5ndGgpP3dycXUtPmRhdGEubGVuZ3RoOklXX1NDQU5fTUFYX0RBVEEpOworICAgRU5URVIoKTsKKworICAgaWYgKFRSVUUgPT0gcEFkYXB0ZXItPnNjYW5faW5mby5tU2NhblBlbmRpbmcpCisgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczptU2NhblBlbmRpbmcgaXMgVFJVRSAhISEiLF9fZnVuY19fKTsKKyAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgIH0KKworICAgaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgIH0KKworICAgc2NhbkluZm8uZGV2ID0gZGV2OworICAgc2NhbkluZm8uc3RhcnQgPSBleHRyYTsKKyAgIHNjYW5JbmZvLmluZm8gPSBpbmZvOworCisgICBpZiAoMCA9PSB3cnF1LT5kYXRhLmxlbmd0aCkKKyAgIHsKKyAgICAgICBzY2FuSW5mby5lbmQgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgc2NhbkluZm8uZW5kID0gZXh0cmEgKyB3cnF1LT5kYXRhLmxlbmd0aDsKKyAgIH0KKworICAgc3RhdHVzID0gc21lX1NjYW5HZXRSZXN1bHQoaEhhbCxwQWRhcHRlci0+c2Vzc2lvbklkLE5VTEwsJnBSZXN1bHQpOworCisgICBpZiAoTlVMTCA9PSBwUmVzdWx0KQorICAgeworICAgICAgIC8vIG5vIHNjYW4gcmVzdWx0cworICAgICAgIGhkZExvZyhMT0cxLCJpd19nZXRfc2NhbjogTlVMTCBTY2FuIFJlc3VsdCAiKTsKKyAgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgcFNjYW5SZXN1bHQgPSBzbWVfU2NhblJlc3VsdEdldEZpcnN0KGhIYWwsIHBSZXN1bHQpOworCisgICB3aGlsZSAocFNjYW5SZXN1bHQpCisgICB7CisgICAgICAgc3RhdHVzID0gaGRkX0luZGljYXRlU2NhblJlc3VsdCgmc2NhbkluZm8sIHBTY2FuUmVzdWx0KTsKKyAgICAgICBpZiAoMCAhPSBzdGF0dXMpCisgICAgICAgeworICAgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICAgaSsrOworICAgICAgIHBTY2FuUmVzdWx0ID0gc21lX1NjYW5SZXN1bHRHZXROZXh0KGhIYWwsIHBSZXN1bHQpOworICAgfQorCisgICBzbWVfU2NhblJlc3VsdFB1cmdlKGhIYWwsIHBSZXN1bHQpOworCisgICBFWElUKCk7CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IGV4aXQgdG90YWwgJWQgQlNTIHJlcG9ydGVkICEhISIsX19mdW5jX18sIGkpOworICAgcmV0dXJuIHN0YXR1czsKK30KKworI2lmIDAKK3N0YXRpYyBlSGFsU3RhdHVzIGhkZF9Dc2NhblJlcXVlc3RDYWxsYmFjayh0SGFsSGFuZGxlIGhhbEhhbmRsZSwgdm9pZCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgc2NhbklkLCBlQ3NyU2NhblN0YXR1cyBzdGF0dXMpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBwQ29udGV4dDsKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpIDsKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwd2V4dEJ1ZiA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICAgdW5pb24gaXdyZXFfZGF0YSB3cnF1OworICAgIGludCB3ZV9ldmVudDsKKyAgICBjaGFyICptc2c7CisgICAgVk9TX1NUQVRVUyB2b3Nfc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIEVOVEVSKCk7CisKKyAgICBoZGRMb2coTE9HMSwiJXMgY2FsbGVkIHdpdGggaGFsSGFuZGxlID0gJXAsIHBDb250ZXh0ID0gJXAsIHNjYW5JRCA9ICVkLCIKKyAgICAgICAgICAgIiByZXR1cm5lZCBzdGF0dXMgPSAlZCIsIF9fRlVOQ1RJT05fXywgaGFsSGFuZGxlLCBwQ29udGV4dCwKKyAgICAgICAgICAgIChpbnQpIHNjYW5JZCwgKGludCkgc3RhdHVzKTsKKworICAgIC8qIENoZWNrIHRoZSBzY2FuSWQgKi8KKyAgICBpZiAocHdleHRCdWYtPnNjYW5JZCAhPSBzY2FuSWQpCisgICAgeworICAgICAgICBoZGRMb2coTE9HVywgIiVzIGNhbGxlZCB3aXRoIG1pc21hdGNoZWQgc2NhbklkIHBXZXh0U3RhdGUtPnNjYW5JZCA9ICVkICIKKyAgICAgICAgICAgICAgICJzY2FuSWQgPSAlZCAiLCBfX0ZVTkNUSU9OX18sIChpbnQpIHB3ZXh0QnVmLT5zY2FuSWQsCisgICAgICAgICAgICAgICAgKGludCkgc2NhbklkKTsKKyAgICB9CisKKyAgICAvKiBTY2FuIGlzIG5vIGxvbmdlciBwZW5kaW5nICovCisgICAgcHdleHRCdWYtPm1TY2FuUGVuZGluZyA9IFZPU19GQUxTRTsKKworICAgIC8vIG5vdGlmeSBhbnkgYXBwbGljYXRpb25zIHRoYXQgbWF5IGJlIGludGVyZXN0ZWQKKyAgICBtZW1zZXQoJndycXUsICdcMCcsIHNpemVvZih3cnF1KSk7CisgICAgd2VfZXZlbnQgPSBTSU9DR0lXU0NBTjsKKyAgICBtc2cgPSBOVUxMOworICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCB3ZV9ldmVudCwgJndycXUsIG1zZyk7CisKKyAgICB2b3Nfc3RhdHVzID0gdm9zX2V2ZW50X3NldCgmcHdleHRCdWYtPnZvc2V2ZW50KTsKKworICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19zdGF0dXMpKQorICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgKCJFUlJPUjogSEREIHZvc19ldmVudF9zZXQgZmFpbGVkISEiKSk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIEVYSVQoKTsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IGV4aXQgISEhIixfX2Z1bmNfXyk7CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitpbnQgaXdfc2V0X2NzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldikgOworICAgIGhkZF93ZXh0X3N0YXRlX3QgKnB3ZXh0QnVmID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICB0Q3NyU2NhblJlcXVlc3Qgc2NhblJlcXVlc3Q7CisgICAgdl9VMzJfdCBzY2FuSWQgPSAwOworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB2X1U4X3QgY2hhbm5lbElkeDsKKworICAgIEVOVEVSKCk7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBlbnRlciAhISEiLF9fZnVuY19fKTsKKworI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorICAgIC8vU2NhbiBub3Qgc3VwcG9ydGVkIHdoZW4gQU1QIHRyYWZmaWMgaXMgb24uCisgICAgaWYoIFZPU19UUlVFID09IFdMQU5CQVBfQW1wU2Vzc2lvbk9uKCkgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm8gc2Nhbm5pbmcgd2hlbiBBTVAgaXMgb24iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aXNMb2dwSW5Qcm9ncmVzcykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIHZvc19tZW1femVybyggJnNjYW5SZXF1ZXN0LCBzaXplb2Yoc2NhblJlcXVlc3QpKTsKKyAgICBpZiAoTlVMTCAhPSB3cnF1LT5kYXRhLnBvaW50ZXIpCisgICAgeworICAgICAgICBjaGFyICpzdHJfcHRyID0gTlVMTDsKKyAgICAgICAgdENzclNTSURJbmZvICpTc2lkSW5mbyA9IE5VTEw7CisgICAgICAgIGludCBudW1fc3NpZCA9IDA7CisgICAgICAgIGludCBpLCBqLCBzc2lkX3N0YXJ0OworICAgICAgICBoZGRfc2Nhbl9wZW5kaW5nX29wdGlvbl9lIHNjYW5QZW5kaW5nT3B0aW9uID0gV0VYVF9TQ0FOX1BFTkRJTkdfR0lWRVVQOworCisgICAgICAgIC8qIHNhdmUgdGhlIG9yaWdpbmFsIGJ1ZmZlciAqLworICAgICAgICBzdHJfcHRyID0gd3JxdS0+ZGF0YS5wb2ludGVyOworCisgICAgICAgIGkgPSBXRVhUX0NTQ0FOX0hFQURFUl9TSVpFOworCisgICAgICAgIGlmKCBXRVhUX0NTQ0FOX1BFTkRJTkdfU0VDVElPTiA9PSBzdHJfcHRyW2ldICkKKyAgICAgICAgeworICAgICAgICAgICAgc2NhblBlbmRpbmdPcHRpb24gPSAoaGRkX3NjYW5fcGVuZGluZ19vcHRpb25fZSlzdHJfcHRyWysraV07CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgICAgcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuX3BlbmRpbmdfb3B0aW9uID0gc2NhblBlbmRpbmdPcHRpb247CisKKyAgICAgICAgaWYocEFkYXB0ZXItPnNjYW5faW5mby5tU2NhblBlbmRpbmcgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKExPRzEsIiVzOiBtU2NhblBlbmRpbmcgaXMgVFJVRSIsX19mdW5jX18pOworICAgICAgICAgICAgLyogSWYgYW55IHNjYW4gaXMgcGVuZGluZywganVzdCBnaXZldXAgdGhpcyBzY2FuIHJlcXVlc3QgKi8KKyAgICAgICAgICAgIGlmKFdFWFRfU0NBTl9QRU5ESU5HX0dJVkVVUCA9PSBzY2FuUGVuZGluZ09wdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Nhbl9pbmZvLndhaXRTY2FuUmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgYW55IHNjYW4gcGVuZGluZywgd2FpdCB0aWxsIGZpbmlzaCBjdXJyZW50IHNjYW4sCisgICAgICAgICAgICAgICBhbmQgdHJ5IHRoaXMgc2NhbiByZXF1ZXN0IHdoZW4gcHJldmlvdXMgc2NhbiBmaW5pc2ggKi8KKyAgICAgICAgICAgIGVsc2UgaWYoV0VYVF9TQ0FOX1BFTkRJTkdfREVMQVkgPT0gc2NhblBlbmRpbmdPcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPnNjYW5faW5mby53YWl0U2NhblJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgdm9zX2V2ZW50X3Jlc2V0KCZwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5fZmluaXNoZWRfZXZlbnQpOworICAgICAgICAgICAgICAgIGlmKHZvc193YWl0X3NpbmdsZV9ldmVudCgmcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuX2ZpbmlzaGVkX2V2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VYVF9DU0NBTl9TQ0FOX0RPTkVfV0FJVF9USU1FKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhkZExvZyhMT0cxLCIlczogUHJldmlvdXMgU0NBTiBkb2VzIG5vdCBmaW5pc2hlZCBvbiB0aW1lIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBQaWdneWJhY2sgcHJldmlvdXMgc2NhbiByZXN1bHQgKi8KKyAgICAgICAgICAgIGVsc2UgaWYoV0VYVF9TQ0FOX1BFTkRJTkdfUElHR1lCQUNLID09IHNjYW5QZW5kaW5nT3B0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5zY2FuX2luZm8ud2FpdFNjYW5SZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwQWRhcHRlci0+c2Nhbl9pbmZvLndhaXRTY2FuUmVzdWx0ID0gRkFMU0U7CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIHNjYW4gSUUgKi8KKyAgICAgICAgd2hpbGUoIFdFWFRfQ1NDQU5fU1NJRF9TRUNUSU9OID09IHN0cl9wdHJbaV0gKSAKKyAgICAgICAgeworICAgICAgICAgICAgLyogc3NpZF9sZW4gKi8KKyAgICAgICAgICAgIGlmKHN0cl9wdHJbKytpXSAhPSBXRVhUX0NTQ0FOX0NIQU5ORUxfU0VDVElPTikgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIHNzaWQncyAqLworICAgICAgICAgICAgICAgIG51bV9zc2lkKys7CisgICAgICAgICAgICAgICAgLyogaW5jcmVtZW50IGxlbmd0aCBmaWxlZCAqLworICAgICAgICAgICAgICAgIGkgKz0gc3RyX3B0cltpXSArIDE7CisgICAgICAgICAgICB9ICAKKyAgICAgICAgICAgIC8qIGkgc2hvdWxkIGJlIHNhdmVkIGFuZCBpdCB3aWxsIGJlIHBvaW50aW5nIHRvICdDJyAqLworICAgICAgICB9CisKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBudW1Tc2lkICVkICEhISIsX19mdW5jX18sIG51bV9zc2lkKTsKKyAgICAgICAgaWYoIG51bV9zc2lkICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRvIGJlIGZpeGVkIGluIFNNRSBhbmQgUEU6IG92ZXJyaWRlIHRoZSBudW1iZXIgb2Ygc3NpZCB3aXRoIDEsCisgICAgICAgICAgICAqIGFzIFNNRSBhbmQgUEUgZG9lcyBub3QgaGFuZGxlIG11bHRpcGxlIFNTSUQgaW4gc2NhbiByZXF1ZXN0CisgICAgICAgICAgICAqICovCisgICAgICAgICAgc2NhblJlcXVlc3QuU1NJRHMubnVtT2ZTU0lEcyA9IG51bV9zc2lkOworICAgICAgICAgIC8qIEFsbG9jYXRlIG51bV9zc2lkIHRDc3JTU0lESW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICBTc2lkSW5mbyA9IHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0ID0oIHRDc3JTU0lESW5mbyAqKXZvc19tZW1fbWFsbG9jKG51bV9zc2lkKnNpemVvZih0Q3NyU1NJREluZm8pKTsKKyAgICAgICAgICBpZihOVUxMID09IHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0KSB7CisgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIm1lbW9yeSBhbGxvYyBmYWlsZWQgU1NJREluZm8gYnVmZmVyIik7CisgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogY29weSBhbGwgdGhlIHNzaWQncyBhbmQgdGhlaXIgbGVuZ3RoICovCisgICAgICAgICAgc3NpZF9zdGFydCA9IFdFWFRfQ1NDQU5fSEVBREVSX1NJWkUgKyAxOy8qIHNraXBwaW5nICdTJyAqLworICAgICAgICAgIGZvcihqID0gMDsgaiA8IG51bV9zc2lkOyBqKyspIHsKKyAgICAgICAgICAgICBpZiggU0lSX01BQ19NQVhfU1NJRF9MRU5HVEggPCBzdHJfcHRyW3NzaWRfc3RhcnRdKXsKKyAgICAgICAgICAgICAgICBzY2FuUmVxdWVzdC5TU0lEcy5udW1PZlNTSURzIC09IDE7CisgICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgc3NpZCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICBTc2lkSW5mby0+U1NJRC5sZW5ndGggPSBzdHJfcHRyW3NzaWRfc3RhcnQrK107CisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KFNzaWRJbmZvLT5TU0lELnNzSWQsICZzdHJfcHRyW3NzaWRfc3RhcnRdLCBTc2lkSW5mby0+U1NJRC5sZW5ndGgpOworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiU1NJRCBudW1iZXIgJWQ6ICAlc1xuIiwgaiwgU3NpZEluZm8tPlNTSUQuc3NJZCk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIHNraXBwaW5nIGxlbmd0aCAqLworICAgICAgICAgICAgIHNzaWRfc3RhcnQgKz0gc3RyX3B0cltzc2lkX3N0YXJ0IC0gMV0gKyAxOworICAgICAgICAgICAgIC8qIFN0b3JlIG5leHQgc3NpZCBpbmZvICovCisgICAgICAgICAgICAgU3NpZEluZm8rKzsKKyAgICAgICAgICB9CisgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGZvciBDaGFubmVsIElFICovCisgICAgICAgIGlmICggV0VYVF9DU0NBTl9DSEFOTkVMX1NFQ1RJT04gPT0gc3RyX3B0cltpXSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzdHJfcHRyWysraV0gPT0gMCApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworICAgICAgICAgICAgICAgIHNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgIC8qIGluY3JlbWVudCB0aGUgY291bnRlciAqLworICAgICAgICAgICAgICAgIHNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSBzdHJfcHRyW2krK107CisgICAgICAgICAgICAgICAgLyogc3RvcmUgdGVtcCBjaGFubmVsIGxpc3QgKi8KKyAgICAgICAgICAgICAgICAvKiBTTUUgZXhwZWN0cyAxIGJ5dGUgY2hhbm5lbCBjb250ZW50ICovCisgICAgICAgICAgICAgICAgc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSB2b3NfbWVtX21hbGxvYyhzY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzICogc2l6ZW9mKHZfVThfdCkpOworICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJtZW1vcnkgYWxsb2MgZmFpbGVkIGZvciBjaGFubmVsIGxpc3QgY3JlYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0X3BvaW50OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcihjaGFubmVsSWR4ID0gMDsgY2hhbm5lbElkeCA8IHNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHM7IGNoYW5uZWxJZHgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgLyogU0NBTiByZXF1ZXN0IGZyb20gdXBwZXIgbGF5ZXIgaGFzIDIgYnl0ZXMgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgIHNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W2NoYW5uZWxJZHhdID0gKHZfVThfdClzdHJfcHRyW2ldOworICAgICAgICAgICAgICAgICAgIGkgKz0gc2l6ZW9mKHZfVTE2X3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCBkZWZhdWx0ICovCisgICAgICAgIHNjYW5SZXF1ZXN0LnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKyAgICAgICAgc2NhblJlcXVlc3QubWluQ2huVGltZSA9IDA7CisgICAgICAgIHNjYW5SZXF1ZXN0Lm1heENoblRpbWUgPSAwOworCisgICAgICAgIC8qIE5vdyBpIGlzIHBvaW50aW5nIHRvIHBhc3NpdmUgZHdlbGwgZHdlbGwgdGltZSAqLworICAgICAgICAvKiAnUCcsbWluIGR3ZWxsIHRpbWUsIG1heCBkd2VsbCB0aW1lICovCisgICAgICAgIC8qIG5leHQgdHdvIG9mZnNldHMgY29udGFpbiBtaW4gYW5kIG1heCBjaGFubmVsIHRpbWUgKi8KKyAgICAgICAgaWYoIFdFWFRfQ1NDQU5fUEFTVl9EV0VMTF9TRUNUSU9OID09IChzdHJfcHRyW2ldKSApIAorICAgICAgICB7CisgICAgICAgICAgICAvKiBObyBTU0lEIHNwZWNpZmllZCwgbnVtX3NzaWQgPT0gMCwgdGhlbiBzdGFydCBwYWFzaXZlIHNjYW4gKi8KKyAgICAgICAgICAgIGlmICghbnVtX3NzaWQgfHwgKGVTSVJfUEFTU0lWRV9TQ0FOID09IHBBZGFwdGVyLT5zY2FuX2luZm8uc2Nhbl9tb2RlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzY2FuUmVxdWVzdC5zY2FuVHlwZSA9IGVTSVJfUEFTU0lWRV9TQ0FOOworICAgICAgICAgICAgICAgIHNjYW5SZXF1ZXN0Lm1pbkNoblRpbWUgPSAodl9VOF90KXN0cl9wdHJbKytpXTsvL3NjYW5SZXEtPm1pbl9jaGFubmVsX3RpbWU7CisgICAgICAgICAgICAgICAgc2NhblJlcXVlc3QubWF4Q2huVGltZSA9ICh2X1U4X3Qpc3RyX3B0clsrK2ldOy8vc2NhblJlcS0+bWF4X2NoYW5uZWxfdGltZTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSArPSAzOworICAgICAgICAgICAgfSAgICAKKyAgICAgICAgfSAgIAorCisgICAgICAgIC8qIEggaW5kaWNhdGVzIGFjdGl2ZSBjaGFubmVsIHRpbWUgKi8KKyAgICAgICAgaWYoIFdFWFRfQ1NDQU5fSE9NRV9EV0VMTF9TRUNUSU9OID09IChzdHJfcHRyW2ldKSApIAorICAgICAgICB7CisgICAgICAgICAgICBpZiAobnVtX3NzaWQgfHwgKGVTSVJfQUNUSVZFX1NDQU4gPT0gcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuX21vZGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjYW5SZXF1ZXN0LnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKyAgICAgICAgICAgICAgICBzY2FuUmVxdWVzdC5taW5DaG5UaW1lID0gc3RyX3B0clsrK2ldOy8vc2NhblJlcS0+bWluX2NoYW5uZWxfdGltZTsKKyAgICAgICAgICAgICAgICBzY2FuUmVxdWVzdC5tYXhDaG5UaW1lID0gc3RyX3B0clsrK2ldOy8vc2NhblJlcS0+bWF4X2NoYW5uZWxfdGltZTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSArPTM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2NhblJlcXVlc3QuQlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworICAgICAgICAvKiBzZXQgcmVxdWVzdFR5cGUgdG8gZnVsbCBzY2FuICovCisgICAgICAgIHNjYW5SZXF1ZXN0LnJlcXVlc3RUeXBlID0gZUNTUl9TQ0FOX1JFUVVFU1RfRlVMTF9TQ0FOOworICAgICAgICBwQWRhcHRlci0+c2Nhbl9pbmZvLm1TY2FuUGVuZGluZyA9IFRSVUU7CisKKyAgICAgICAgLyogaWYgcHJldmlvdXMgZ2VuSUUgaXMgbm90IE5VTEwsIHVwZGF0ZSBTY2FuSUUgKi8KKyAgICAgICAgaWYoMCAhPSBwd2V4dEJ1Zi0+Z2VuSUUubGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1zZXQoICZwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRSwgMCwgc2l6ZW9mKHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFKSApOworICAgICAgICAgICAgbWVtY3B5KCBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5hZGRJRWRhdGEsIHB3ZXh0QnVmLT5nZW5JRS5hZGRJRWRhdGEsIAorICAgICAgICAgICAgICAgIHB3ZXh0QnVmLT5nZW5JRS5sZW5ndGggKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmxlbmd0aCA9IHB3ZXh0QnVmLT5nZW5JRS5sZW5ndGg7CisKKyAgICAgICAgICAgIHB3ZXh0QnVmLT5yb2FtUHJvZmlsZS5wQWRkSUVTY2FuID0gcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuQWRkSUUuYWRkSUVkYXRhOworICAgICAgICAgICAgcHdleHRCdWYtPnJvYW1Qcm9maWxlLm5BZGRJRVNjYW5MZW5ndGggPSBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5sZW5ndGg7CisKKyAgICAgICAgICAgIC8qIGNsZWFyIHByZXZpb3VzIGdlbklFIGFmdGVyIHVzZSBpdCAqLworICAgICAgICAgICAgbWVtc2V0KCAmcHdleHRCdWYtPmdlbklFLCAwLCBzaXplb2YocHdleHRCdWYtPmdlbklFKSApOworICAgICAgICB9CisKKyAgICAgICAgLyogcHVzaCBhZGRJRVNjYW4gaW4gc2NhblJlcXVzZXQgaWYgZXhpc3QgKi8KKyAgICAgICAgaWYgKHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmFkZElFZGF0YSAmJiAKKyAgICAgICAgICAgIHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgc2NhblJlcXVlc3QudUlFRmllbGRMZW4gPSBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5BZGRJRS5sZW5ndGg7CisgICAgICAgICAgICBzY2FuUmVxdWVzdC5wSUVGaWVsZCA9IHBBZGFwdGVyLT5zY2FuX2luZm8uc2NhbkFkZElFLmFkZElFZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IHNtZV9TY2FuUmVxdWVzdCggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aEhhbCwgCisgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLCZzY2FuUmVxdWVzdCwgJnNjYW5JZCwgJmhkZF9TY2FuUmVxdWVzdENhbGxiYWNrLCBkZXYgKTsgCisgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBTTUUgc2NhbiBmYWlsIHN0YXR1cyAlZCAhISEiLF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICAgICAgcEFkYXB0ZXItPnNjYW5faW5mby5tU2NhblBlbmRpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBnb3RvIGV4aXRfcG9pbnQ7CisgICAgICAgIH0KKworICAgICAgICBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5JZCA9IHNjYW5JZDsKKworICAgIH0gLy9lbmQgb2YgZGF0YS0+cG9pbnRlcgorICAgIGVsc2UgeworICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICB9CisKK2V4aXRfcG9pbnQ6CisKKyAgICAvKiBmcmVlIHNzaWRsaXN0ICovCisgICAgaWYgKHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0KSAKKyAgICB7CisgICAgICAgIHZvc19tZW1fZnJlZShzY2FuUmVxdWVzdC5TU0lEcy5TU0lETGlzdCk7CisgICAgfQorICAgIC8qIGZyZWUgdGhlIGNoYW5uZWwgbGlzdCAqLworICAgIGlmKHNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KQorICAgIHsKKyAgICAgICAgdm9zX21lbV9mcmVlKCh2b2lkKilzY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCk7CisgICAgfQorCisgICAgRVhJVCgpOworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogZXhpdCAhISEiLF9fZnVuY19fKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBBYm9ydCBhbnkgTUFDIHNjYW4gaWYgaW4gcHJvZ3Jlc3MgKi8KK3ZvaWQgaGRkX2Fib3J0X21hY19zY2FuKGhkZF9jb250ZXh0X3QqIHBIZGRDdHgpCit7CisgICAgc21lX0Fib3J0TWFjU2NhbihwSGRkQ3R4LT5oSGFsKTsKK30KKwpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvc3JjL3dsYW5faGRkX3NvZnRhcF90eF9yeC5jIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX3NvZnRhcF90eF9yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTU1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfc29mdGFwX3R4X3J4LmMKQEAgLTAsMCArMSwxNTk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgd2xhbl9oZGRfc29mdGFwX3R4X3J4LmMKKyAgCisgIFxicmllZiBMaW51eCBIREQgVHgvUlggQVBJcworICAgICAgICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuCisgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBJbmNsdWRlIGZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF90eF9yeC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3NvZnRhcF90eF9yeC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2RwX3V0aWxzLmg+CisjaW5jbHVkZSA8d2xhbl9xY3RfdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorLy8jaW5jbHVkZSA8dm9zX2xpc3QuaD4KKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmlHbG9iYWwuaD4KKyNpbmNsdWRlIDxoYWxUeXBlcy5oPgorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlIDxoYWxIZGRBcGlzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorI2lmIDAKK3N0YXRpYyB2b2lkIGhkZF9zb2Z0YXBfZHVtcF9za19idWZmKHN0cnVjdCBza19idWZmICogc2tiKQoreworICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogaGVhZCA9ICVwICIsIF9fRlVOQ1RJT05fXywgc2tiLT5oZWFkKTsKKyAgLy9WT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogZGF0YSA9ICVwICIsIF9fRlVOQ1RJT05fXywgc2tiLT5kYXRhKTsKKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IHRhaWwgPSAlcCAiLCBfX0ZVTkNUSU9OX18sIHNrYi0+dGFpbCk7CisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBlbmQgPSAlcCAiLCBfX0ZVTkNUSU9OX18sIHNrYi0+ZW5kKTsKKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IGxlbiA9ICVkICIsIF9fRlVOQ1RJT05fXywgc2tiLT5sZW4pOworICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogZGF0YV9sZW4gPSAlZCAiLCBfX0ZVTkNUSU9OX18sIHNrYi0+ZGF0YV9sZW4pOworICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogbWFjX2xlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNrYi0+bWFjX2xlbik7CisKKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4ICIsIAorICAgICBza2ItPmRhdGFbMF0sIHNrYi0+ZGF0YVsxXSwgc2tiLT5kYXRhWzJdLCBza2ItPmRhdGFbM10sIHNrYi0+ZGF0YVs0XSwgCisgICAgIHNrYi0+ZGF0YVs1XSwgc2tiLT5kYXRhWzZdLCBza2ItPmRhdGFbN10pOyAKKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IFxuIiwgCisgICAgIHNrYi0+ZGF0YVs4XSwgc2tiLT5kYXRhWzldLCBza2ItPmRhdGFbMTBdLCBza2ItPmRhdGFbMTFdLCBza2ItPmRhdGFbMTJdLAorICAgICBza2ItPmRhdGFbMTNdLCBza2ItPmRhdGFbMTRdLCBza2ItPmRhdGFbMTVdKTsgCit9CisjZW5kaWYKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfZmx1c2hfdHhfcXVldWVzKCkgLSBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZsdXNoIHRoZSBUWCBxdWV1ZXMKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCAKKyAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIFZPU19TVEFUVVMgaGRkX3NvZnRhcF9mbHVzaF90eF9xdWV1ZXMoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICkKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdl9TSU5UX3QgaSA9IC0xOworICAgdl9VOF90IFNUQUlkID0gMDsKKyAgIGhkZF9saXN0X25vZGVfdCAqYW5jaG9yID0gTlVMTDsKKyAgIHNrYl9saXN0X25vZGVfdCAqcGt0Tm9kZSA9IE5VTEw7CisgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKworICAgc3Bpbl9sb2NrX2JoKCAmcEFkYXB0ZXItPnN0YUluZm9fbG9jayApOworICAgZm9yIChTVEFJZCA9IDA7IFNUQUlkIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBTVEFJZCsrKQorICAgeworICAgICAgaWYgKEZBTFNFID09IHBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0uaXNVc2VkKQorICAgICAgeworICAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpICsrKQorICAgICAgeworICAgICAgICAgc3Bpbl9sb2NrX2JoKCZwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLndtbV90eF9xdWV1ZVtpXS5sb2NrKTsKKyAgICAgICAgIHdoaWxlICh0cnVlKSAKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGhkZF9saXN0X3JlbW92ZV9mcm9udCAoICZwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLndtbV90eF9xdWV1ZVtpXSwgJmFuY2hvcik7CisKKyAgICAgICAgICAgIGlmIChWT1NfU1RBVFVTX0VfRU1QVFkgIT0gc3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9JZiBzdWNjZXNzIHRoZW4gd2UgZ290IGEgdmFsaWQgcGFja2V0IGZyb20gc29tZSBBQworICAgICAgICAgICAgICAgcGt0Tm9kZSA9IGxpc3RfZW50cnkoYW5jaG9yLCBza2JfbGlzdF9ub2RlX3QsIGFuY2hvcik7CisgICAgICAgICAgICAgICBza2IgPSBwa3ROb2RlLT5za2I7CisgICAgICAgICAgICAgICArK3BBZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkOworICAgICAgICAgICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eEZsdXNoZWQ7CisgICAgICAgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4Rmx1c2hlZEFDW2ldOworICAgICAgICAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9jdXJyZW50IGxpc3QgaXMgZW1wdHkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS50eFN1c3BlbmRlZFtpXSA9IFZPU19GQUxTRTsKKyAgICAgICAgIHNwaW5fdW5sb2NrX2JoKCZwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLndtbV90eF9xdWV1ZVtpXS5sb2NrKTsKKyAgICAgIH0KKyAgIH0KKworICAgc3Bpbl91bmxvY2tfYmgoICZwQWRhcHRlci0+c3RhSW5mb19sb2NrICk7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfaGFyZF9zdGFydF94bWl0KCkgLSBGdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggdGhlIExpbnV4IE9TIGZvciAKKyAgdHJhbnNtaXR0aW5nIHBhY2tldHMuIFRoZXJlIGFyZSAyIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24uIE9uZSB0aGF0IHVzZXMKKyAgbG9ja2VkIHF1ZXVlIGFuZCBvdGhlciB0aGF0IHVzZXMgbG9ja2xlc3MgcXVldWVzLiBCb3RoIGhhdmUgYmVlbiByZXRhaW5lZCB0bworICBkbyBzb21lIHBlcmZvcm1hbmNlIHRlc3RpbmcKKworICBAcGFyYW0gc2tiICAgICAgOiBbaW5dICBwb2ludGVyIHRvIE9TIHBhY2tldCAoc2tfYnVmZikKKyAgQHBhcmFtIGRldiAgICAgIDogW2luXSBwb2ludGVyIHRvIExpYnJhIG5ldHdvcmsgZGV2aWNlCisgIAorICBAcmV0dXJuICAgICAgICAgOiBORVRfWE1JVF9EUk9QIGlmIHBhY2tldHMgYXJlIGRyb3BwZWQKKyAgICAgICAgICAgICAgICAgIDogTkVUX1hNSVRfU1VDQ0VTUyBpZiBwYWNrZXQgaXMgZW5xdWV1ZWQgc3VjY2VzZnVsbHkKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBoZGRfc29mdGFwX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICBXTEFOVExfQUNFbnVtVHlwZSBhYyA9IFdMQU5UTF9BQ19CRTsKKyAgIHNtZV9Rb3NXbW1VcFR5cGUgdXAgPSBTTUVfUU9TX1dNTV9VUF9CRTsKKyAgIHNrYl9saXN0X25vZGVfdCAqcGt0Tm9kZSA9IE5VTEw7CisgICB2X1NJWkVfdCBwa3RMaXN0U2l6ZSA9IDA7CisgICB2X0JPT0xfdCB0eFN1c3BlbmRlZCA9IFZPU19GQUxTRTsKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QgKiluZXRkZXZfcHJpdihkZXYpOworICAgaGRkX2FwX2N0eF90ICpwSGRkQXBDdHggPSBXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwQWRhcHRlcik7ICAgCisgICB2b3NfbGlzdF9ub2RlX3QgKmFuY2hvciA9IE5VTEw7CisgICB2X1U4X3QgU1RBSWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CisgICAvL0V4dHJhY3QgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZnJvbSBldGhlcm5ldCBmcmFtZQorICAgdl9NQUNBRERSX3QgKnBEZXN0TWFjQWRkcmVzcyA9ICh2X01BQ0FERFJfdCopc2tiLT5kYXRhOworICAgaW50IG9zX3N0YXR1cyA9IE5FVERFVl9UWF9PSzsgCisKKyAgIHBEZXN0TWFjQWRkcmVzcyA9ICh2X01BQ0FERFJfdCopc2tiLT5kYXRhOworICAgCisgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdENhbGxlZDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiJXM6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgc3Bpbl9sb2NrX2JoKCAmcEFkYXB0ZXItPnN0YUluZm9fbG9jayApOworICAgaWYgKHZvc19pc19tYWNhZGRyX2Jyb2FkY2FzdCggcERlc3RNYWNBZGRyZXNzICkgfHwgdm9zX2lzX21hY2FkZHJfZ3JvdXAocERlc3RNYWNBZGRyZXNzKSkKKyAgIHsKKyAgICAgIC8vVGhlIEJDL01DIHN0YXRpb24gSUQgaXMgYXNzaWduZWQgZHVyaW5nIEJTUyBzdGFydGluZyBwaGFzZS4gU0FQIHdpbGwgcmV0dXJuIHRoZSBzdGF0aW9uIAorICAgICAgLy9JRCB1c2VkIGZvciBCQy9NQyB0cmFmZmljLiBUaGUgc3RhdGlvbiBpZCBpcyByZWdpc3RlcmVkIHRvIFRMIGFzIHdlbGwuCisgICAgICBTVEFJZCA9IHBIZGRBcEN0eC0+dUJDU3RhSWQ7CisgICAgICAKKyAgICAgIC8qIFNldHRpbmcgcHJpb3JpdHkgZm9yIGJyb2FkY2FzdCBwYWNrZXRzIHdoaWNoIGRvZXNuJ3QgZ28gdG8gc2VsZWN0X3F1ZXVlIGZ1bmN0aW9uICovCisgICAgICBza2ItPnByaW9yaXR5ID0gU01FX1FPU19XTU1fVVBfQkU7CisgICAgICBza2ItPnF1ZXVlX21hcHBpbmcgPSBIRERfTElOVVhfQUNfQkU7CisKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICIlczogQkMvTUMgcGFja2V0XG4iLCBfX0ZVTkNUSU9OX18pOworICAgfQorICAgZWxzZQorICAgeworICAgICAgU1RBSWQgPSAqKHZfVThfdCAqKSgoKHZfVThfdCAqKShza2ItPmRhdGEpKSAtIDEpOworICAgICAgaWYgKFNUQUlkID09IEhERF9XTEFOX0lOVkFMSURfU1RBX0lEKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gZmluZCByaWdodCBzdGF0aW9uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICsrcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdERyb3BwZWQ7CisgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgIGdvdG8geG1pdF9kb25lOworICAgICAgfQorICAgICAgZWxzZSBpZiAoRkFMU0UgPT0gcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS5pc1VzZWQgKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IFNUQSBpcyB1bnJlZ2lzdGVyZWQiLCBfX0ZVTkNUSU9OX18sIFNUQUlkKTsKKyAgICAgICAgICsrcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdERyb3BwZWQ7CisgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgIGdvdG8geG1pdF9kb25lOworICAgICAgfQorCisgICAgICBpZiAoIChXTEFOVExfU1RBX0NPTk5FQ1RFRCAhPSBwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLnRsU1RBU3RhdGUpICYmIAorICAgICAgICAgICAoV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEICE9IHBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0udGxTVEFTdGF0ZSkgKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBTdGF0aW9uIG5vdCBjb25uZWN0ZWQgeWV0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICsrcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdERyb3BwZWQ7CisgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgIGdvdG8geG1pdF9kb25lOworICAgICAgfQorICAgICAgZWxzZSBpZihXTEFOVExfU1RBX0NPTk5FQ1RFRCA9PSBwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLnRsU1RBU3RhdGUpCisgICAgICB7CisgICAgICAgIGlmKG50b2hzKHNrYi0+cHJvdG9jb2wpICE9IEhERF9FVEhFUlRZUEVfODAyXzFfWCkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBOT04tRUFQT0wgcGFja2V0IGluIG5vbi1BdXRoZW50aWNhdGVkIHN0YXRlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICsrcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdERyb3BwZWQ7CisgICAgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgIGdvdG8geG1pdF9kb25lOworICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8vR2V0IFRMIEFDIGNvcnJlc3BvbmRpbmcgdG8gUWRpc2MgcXVldWUgaW5kZXgvQUMuCisgICBhYyA9IGhkZF9RZGlzY0FjVG9UbEFDW3NrYi0+cXVldWVfbWFwcGluZ107CisgICAvL3VzZXIgcHJpb3JpdHkgZnJvbSBJUCBoZWFkZXIsIHdoaWNoIGlzIGFscmVhZHkgZXh0cmFjdGVkIGFuZCBzZXQgZnJvbSAKKyAgIC8vc2VsZWN0X3F1ZXVlIGNhbGwgYmFjayBmdW5jdGlvbgorICAgdXAgPSBza2ItPnByaW9yaXR5OworICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXRDbGFzc2lmaWVkQUNbYWNdOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICIlczogQ2xhc3NpZmllZCBhcyBhYyAlZCB1cCAlZCIsIF9fRlVOQ1RJT05fXywgYWMsIHVwKTsKKworICAgLy8gSWYgdGhlIG1lbW9yeSBkaWZmZXJlbnRpYXRpb24gbW9kZSBpcyBlbmFibGVkLCB0aGUgbWVtb3J5IGxpbWl0IG9mIGVhY2ggcXVldWUgd2lsbCBiZSAKKyAgIC8vIGNoZWNrZWQuIE92ZXItbGltaXQgcGFja2V0cyB3aWxsIGJlIGRyb3BwZWQuCisgICAgc3Bpbl9sb2NrKCZwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLndtbV90eF9xdWV1ZVthY10ubG9jayk7CisgICAgaGRkX2xpc3Rfc2l6ZSgmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbYWNdLCAmcGt0TGlzdFNpemUpOworICAgIGlmKHBrdExpc3RTaXplID49IHBBZGFwdGVyLT5hVHhRdWV1ZUxpbWl0W2FjXSkKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICIlczogc3RhdGlvbiAlZCBhYyAlZCBxdWV1ZSBvdmVyIGxpbWl0ICVkIFxuIiwgX19GVU5DVElPTl9fLCBTVEFJZCwgYWMsIHBrdExpc3RTaXplKTsgCisgICAgICAgcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS50eFN1c3BlbmRlZFthY10gPSBWT1NfVFJVRTsKKyAgICAgICBuZXRpZl9zdG9wX3N1YnF1ZXVlKGRldiwgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOworICAgICAgIHR4U3VzcGVuZGVkID0gVk9TX1RSVUU7CisgICAgfQorICAgc3Bpbl91bmxvY2soJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ud21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKworICAgaWYgKFZPU19UUlVFID09IHR4U3VzcGVuZGVkKQorICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLCAKKyAgICAgICAgICAgICAgICAgICIlczogVFggcXVldWUgZnVsbCBmb3IgQUM9JWQgRGlzYWJsZSBPUyBUWCBxdWV1ZSIsIAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhYyApOworICAgICAgb3Nfc3RhdHVzID0gTkVUREVWX1RYX0JVU1k7ICAgCisgICAgICBnb3RvIHhtaXRfZG9uZTsKKyAgIH0KKworICAgLy9Vc2UgdGhlIHNrYi0+Y2IgZmllbGQgdG8gaG9sZCB0aGUgbGlzdCBub2RlIGluZm9ybWF0aW9uCisgICBwa3ROb2RlID0gKHNrYl9saXN0X25vZGVfdCAqKSZza2ItPmNiOworCisgICAvL1N0aWNrIHRoZSBPUyBwYWNrZXQgaW5zaWRlIHRoaXMgbm9kZS4KKyAgIHBrdE5vZGUtPnNrYiA9IHNrYjsKKworICAgLy9TdGljayB0aGUgVXNlciBQcmlvcml0eSBpbnNpZGUgdGhpcyBub2RlIAorICAgcGt0Tm9kZS0+dXNlclByaW9yaXR5ID0gdXA7CisKKyAgIElOSVRfTElTVF9IRUFEKCZwa3ROb2RlLT5hbmNob3IpOworCisgICBzcGluX2xvY2soJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ud21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKyAgIHN0YXR1cyA9IGhkZF9saXN0X2luc2VydF9iYWNrX3NpemUoJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ud21tX3R4X3F1ZXVlW2FjXSwgJnBrdE5vZGUtPmFuY2hvciwgJnBrdExpc3RTaXplICk7CisgICBzcGluX3VubG9jaygmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbYWNdLmxvY2spOworCisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOkluc2VydCBUeCBxdWV1ZSBmYWlsZWQuIFBrdCBkcm9wcGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0RHJvcHBlZDsKKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0RHJvcHBlZEFDW2FjXTsKKyAgICAgICsrcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgIGdvdG8geG1pdF9kb25lOworICAgfQorCisgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdFF1ZXVlZDsKKyAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0UXVldWVkQUNbYWNdOworCisgICBpZiAoMSA9PSBwa3RMaXN0U2l6ZSkKKyAgIHsKKyAgICAgIC8vTGV0IFRMIGtub3cgd2UgaGF2ZSBhIHBhY2tldCB0byBzZW5kIGZvciB0aGlzIEFDCisgICAgICBzdGF0dXMgPSBXTEFOVExfU1RBUGt0UGVuZGluZyggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsIFNUQUlkLCBhYyApOyAgICAgIAorCisgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogRmFpbGVkIHRvIHNpZ25hbCBUTCBmb3IgQUM9JWQgU1RBSWQgPSVkIiwgCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWMsIFNUQUlkICk7CisKKyAgICAgICAgIC8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSBxdWV1ZS4gSXQgbXVzdCBiZSBhdCB0aGUgYmFjayBvZiB0aGUgcXVldWUsIGFzIFRYIHRocmVhZCBjYW5ub3QgcHJlZW1wdCB1cyBpbiB0aGUgbWlkZGxlCisgICAgICAgICAvL2FzIHdlIGFyZSBpbiBhIHNvZnQgaXJxIGNvbnRleHQuIEFsc28gaXQgbXVzdCBiZSB0aGUgc2FtZSBwYWNrZXQgdGhhdCB3ZSBqdXN0IGFsbG9jYXRlZC4KKyAgICAgICAgIHNwaW5fbG9ja19iaCgmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbYWNdLmxvY2spOworICAgICAgICAgc3RhdHVzID0gaGRkX2xpc3RfcmVtb3ZlX2JhY2soICZwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLndtbV90eF9xdWV1ZVthY10sICZhbmNob3IpOworICAgICAgICAgc3Bpbl91bmxvY2tfYmgoJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ud21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKyAgICAgICAgICsrcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdERyb3BwZWQ7CisgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdERyb3BwZWRBQ1thY107CisgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgIGdvdG8geG1pdF9kb25lOworICAgICAgfQorICAgfQorICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csICIlczogZXhpdCBcbiIsIF9fRlVOQ1RJT05fXyk7CisKK3htaXRfZG9uZToKKyAgIHNwaW5fdW5sb2NrX2JoKCAmcEFkYXB0ZXItPnN0YUluZm9fbG9jayApOworICAgcmV0dXJuIG9zX3N0YXR1czsKK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3NvZnRhcF9zdGFfMl9zdGFfeG1pdCBUaGlzIGZ1bmN0aW9uIGZvciBUcmFuc21pdHRpbmcgdGhlIGZyYW1lcyB3aGVuIHRoZSB0cmFmZmljIGlzIGJldHdlZW4gdHdvIHN0YXRpb25zLgorCisgIEBwYXJhbSBza2IgICAgICA6IFtpbl0gcG9pbnRlciB0byBwYWNrZXQgKHNrX2J1ZmYpCisgIEBwYXJhbSBkZXYgICAgICA6IFtpbl0gcG9pbnRlciB0byBMaWJyYSBuZXR3b3JrIGRldmljZQorICBAcGFyYW0gU1RBSWQgICAgOiBbaW5dIFN0YXRpb24gSWQgb2YgRGVzdGluYXRpb24gU3RhdGlvbgorICBAcGFyYW0gdXAgICAgICAgOiBbaW5dIFVzZXIgUHJpb3JpdHkgCisgIAorICBAcmV0dXJuICAgICAgICAgOiBORVRfWE1JVF9EUk9QIGlmIHBhY2tldHMgYXJlIGRyb3BwZWQKKyAgICAgICAgICAgICAgICAgIDogTkVUX1hNSVRfU1VDQ0VTUyBpZiBwYWNrZXQgaXMgZW5xdWV1ZWQgc3VjY2VzZnVsbHkKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3NvZnRhcF9zdGFfMl9zdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IFNUQUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHVwKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7IAorICAgc2tiX2xpc3Rfbm9kZV90ICpwa3ROb2RlID0gTlVMTDsKKyAgIHZfU0laRV90IHBrdExpc3RTaXplID0gMDsKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QgKiluZXRkZXZfcHJpdihkZXYpOworICAgdl9VOF90IGFjOworICAgdm9zX2xpc3Rfbm9kZV90ICphbmNob3IgPSBOVUxMOworCisgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdENhbGxlZDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiJXM6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKworICAgc3Bpbl9sb2NrX2JoKCAmcEFkYXB0ZXItPnN0YUluZm9fbG9jayApOworICAgaWYgKCBGQUxTRSA9PSBwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLmlzVXNlZCApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IFNUQSBpcyB1bnJlZ2lzdGVyZWQiLCBfX0ZVTkNUSU9OX18sIFNUQUlkICk7CisgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgZ290byB4bWl0X2VuZDsKKyAgIH0KKworICAgLyogSWYgdGhlIFFvUyBpcyBub3QgZW5hYmxlZCBvbiB0aGUgcmVjZWl2aW5nIHN0YXRpb24sIHRoZW4gc2VuZCBpdCB3aXRoIEJFIHByaW9yaXR5ICovCisgICBpZiAoICFwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLmlzUW9zRW5hYmxlZCApCisgICAgICAgdXAgPSBTTUVfUU9TX1dNTV9VUF9CRTsKKworICAgYWMgPSBoZGRXbW1VcFRvQWNNYXBbdXBdOworICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXRDbGFzc2lmaWVkQUNbYWNdOworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiJXM6IENsYXNzaWZpZWQgYXMgYWMgJWQgdXAgJWQiLCBfX0ZVTkNUSU9OX18sIGFjLCB1cCk7CisKKyAgIHNrYi0+cXVldWVfbWFwcGluZyA9IGhkZExpbnV4VXBUb0FjTWFwW3VwXTsKKworICAgLy9Vc2UgdGhlIHNrYi0+Y2IgZmllbGQgdG8gaG9sZCB0aGUgbGlzdCBub2RlIGluZm9ybWF0aW9uCisgICBwa3ROb2RlID0gKHNrYl9saXN0X25vZGVfdCAqKSZza2ItPmNiOworCisgICAvL1N0aWNrIHRoZSBPUyBwYWNrZXQgaW5zaWRlIHRoaXMgbm9kZS4KKyAgIHBrdE5vZGUtPnNrYiA9IHNrYjsKKworICAgLy9TdGljayB0aGUgVXNlciBQcmlvcml0eSBpbnNpZGUgdGhpcyBub2RlIAorICAgcGt0Tm9kZS0+dXNlclByaW9yaXR5ID0gdXA7CisKKyAgIElOSVRfTElTVF9IRUFEKCZwa3ROb2RlLT5hbmNob3IpOworCisgICBzcGluX2xvY2tfYmgoJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ud21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKyAgIGhkZF9saXN0X3NpemUoJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ud21tX3R4X3F1ZXVlW2FjXSwgJnBrdExpc3RTaXplKTsKKyAgIGlmKHBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0udHhTdXNwZW5kZWRbYWNdIHx8CisgICAgICAgcGt0TGlzdFNpemUgPj0gcEFkYXB0ZXItPmFUeFF1ZXVlTGltaXRbYWNdKQorICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IHN0YXRpb24gJWQgYWMgJWQgcXVldWUgb3ZlciBsaW1pdCAlZCBcbiIsIF9fRlVOQ1RJT05fXywgU1RBSWQsIGFjLCBwa3RMaXN0U2l6ZSk7IAorICAgICAgIC8qIFRPRE86UnggRmxvd2NoYXJ0IHNob3VsZCBiZSB0cmlnZXJyZWQgaGVyZSB0byBTVVBFTkQgU1NDIG9uIFJYIHNpZGUuCisgICAgICAgICogU1VTUEVORCBzaG91bGQgYmUgZG9uZSBiYXNlZCBvbiBUaHJlc2hvbGQuIFJFU1VNRSB3b3VsZCBiZSAKKyAgICAgICAgKiB0cmlnZ2VyZWQgaW4gZmV0Y2ggY2JrIGFmdGVyIHJlY292ZXJ5LgorICAgICAgICAqLworICAgICAgIGtmcmVlX3NrYihza2IpOworICAgICAgIHNwaW5fdW5sb2NrX2JoKCZwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLndtbV90eF9xdWV1ZVthY10ubG9jayk7CisgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgZ290byB4bWl0X2VuZDsKKyAgIH0KKyAgIHN0YXR1cyA9IGhkZF9saXN0X2luc2VydF9iYWNrX3NpemUoJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ud21tX3R4X3F1ZXVlW2FjXSwgJnBrdE5vZGUtPmFuY2hvciwgJnBrdExpc3RTaXplICk7CisgICBzcGluX3VubG9ja19iaCgmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbYWNdLmxvY2spOworCisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOkluc2VydCBUeCBxdWV1ZSBmYWlsZWQuIFBrdCBkcm9wcGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0RHJvcHBlZDsKKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0RHJvcHBlZEFDW2FjXTsKKyAgICAgICsrcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgZ290byB4bWl0X2VuZDsKKyAgIH0KKworICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXRRdWV1ZWQ7CisgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdFF1ZXVlZEFDW2FjXTsKKworICAgaWYgKDEgPT0gcGt0TGlzdFNpemUpCisgICB7CisgICAgICAvL0xldCBUTCBrbm93IHdlIGhhdmUgYSBwYWNrZXQgdG8gc2VuZCBmb3IgdGhpcyBBQworICAgICAgLy9WT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczpJbmRpY2F0aW5nIFBhY2tldCB0byBUTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBzdGF0dXMgPSBXTEFOVExfU1RBUGt0UGVuZGluZyggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsIFNUQUlkLCBhYyApOyAgICAgIAorCisgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogRmFpbGVkIHRvIHNpZ25hbCBUTCBmb3IgQUM9JWQgU1RBSWQgPSVkIiwgCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWMsIFNUQUlkICk7CisKKyAgICAgICAgIC8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSBxdWV1ZS4gSXQgbXVzdCBiZSBhdCB0aGUgYmFjayBvZiB0aGUgcXVldWUsIGFzIFRYIHRocmVhZCBjYW5ub3QgcHJlZW1wdCB1cyBpbiB0aGUgbWlkZGxlCisgICAgICAgICAvL2FzIHdlIGFyZSBpbiBhIHNvZnQgaXJxIGNvbnRleHQuIEFsc28gaXQgbXVzdCBiZSB0aGUgc2FtZSBwYWNrZXQgdGhhdCB3ZSBqdXN0IGFsbG9jYXRlZC4KKyAgICAgICAgIHNwaW5fbG9ja19iaCgmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbYWNdLmxvY2spOworICAgICAgICAgc3RhdHVzID0gaGRkX2xpc3RfcmVtb3ZlX2JhY2soICZwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLndtbV90eF9xdWV1ZVthY10sICZhbmNob3IpOworICAgICAgICAgc3Bpbl91bmxvY2tfYmgoJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ud21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKyAgICAgICAgICsrcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdERyb3BwZWQ7CisgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdERyb3BwZWRBQ1thY107CisgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgZ290byB4bWl0X2VuZDsKKyAgICAgIH0KKyAgIH0KKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywgIiVzOiBleGl0IFxuIiwgX19GVU5DVElPTl9fKTsKKworeG1pdF9lbmQ6CisgICBzcGluX3VubG9ja19iaCggJnBBZGFwdGVyLT5zdGFJbmZvX2xvY2sgKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfdHhfdGltZW91dCgpIC0gRnVuY3Rpb24gY2FsbGVkIGJ5IE9TIGlmIHRoZXJlIGlzIGFueQorICB0aW1lb3V0IGR1cmluZyB0cmFuc21pc3Npb24uIFNpbmNlIEhERCBzaW1wbHkgZW5xdWV1ZXMgcGFja2V0CisgIGFuZCByZXR1cm5zIGNvbnRyb2wgdG8gT1MgcmlnaHQgYXdheSwgdGhpcyB3b3VsZCBuZXZlciBiZSBpbnZva2VkCisKKyAgQHBhcmFtIGRldiA6IFtpbl0gcG9pbnRlciB0byBMaWJyYSBuZXR3b3JrIGRldmljZQorICBAcmV0dXJuICAgIDogTm9uZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBoZGRfc29mdGFwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAiJXM6IFRyYW5zbWlzc2lvbiB0aW1lb3V0IG9jY3VycmVkIiwgX19GVU5DVElPTl9fKTsKKyAgIC8vR2V0dGluZyBoZXJlIGltcGxpZXMgd2UgZGlzYWJsZWQgdGhlIFRYIHF1ZXVlcyBmb3IgdG9vIGxvbmcuIFF1ZXVlcyBhcmUgCisgICAvL2Rpc2FibGVkIGVpdGhlciBiZWNhdXNlIG9mIGRpc2Fzc29jaWF0aW9uIG9yIGxvdyByZXNvdXJjZSBzY2VuYXJpb3MuIEluCisgICAvL2Nhc2Ugb2YgZGlzYXNzb2NpYXRpb24gaXQgaXMgb2sgdG8gaWdub3JlIHRoaXMuIEJ1dCBpZiBhc3NvY2lhdGVkLCB3ZSBoYXZlCisgICAvL2RvIHBvc3NpYmxlIHJlY292ZXJ5IGhlcmUKK30gCisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3NvZnRhcF9zdGF0cygpIC0gRnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSBMaW51eCBPUyBmb3IgCisgIGRldmljZSBUWC9SWCBzdGF0aXN0aWMKKworICBAcGFyYW0gZGV2ICAgICAgOiBbaW5dIHBvaW50ZXIgdG8gTGlicmEgbmV0d29yayBkZXZpY2UKKyAgCisgIEByZXR1cm4gICAgICAgICA6IHBvaW50ZXIgdG8gbmV0X2RldmljZV9zdGF0cyBzdHJ1Y3R1cmUKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBoZGRfc29mdGFwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICBoZGRfYWRhcHRlcl90KiBwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgIHJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3NvZnRhcF9pbml0X3R4X3J4KCkgLSBJbml0IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgVHgvUlgKKyAgbW9kdWxlcyBpbiBIREQKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCAKKyAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBoZGRfc29mdGFwX2luaXRfdHhfcngoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICkKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdl9TSU5UX3QgaSA9IC0xOworICAgdl9TSVpFX3Qgc2l6ZSA9IDA7CisKKyAgIHZfVThfdCBTVEFJZCA9IDA7CisKKyAgIHZfVThfdCBwQUNXZWlnaHRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRERfU09GVEFQX0JLX1dFSUdIVF9ERUZBVUxULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhERF9TT0ZUQVBfQkVfV0VJR0hUX0RFRkFVTFQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEREX1NPRlRBUF9WSV9XRUlHSFRfREVGQVVMVCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRERfU09GVEFQX1ZPX1dFSUdIVF9ERUZBVUxUCisgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgIHBBZGFwdGVyLT5pc1Zvc091dE9mUmVzb3VyY2UgPSBWT1NfRkFMU0U7CisKKyAgIHZvc19tZW1femVybygmcEFkYXB0ZXItPnN0YXRzLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKworICAgd2hpbGUgKCsraSAhPSBOVU1fVFhfUVVFVUVTKSAKKyAgICAgIGhkZF9saXN0X2luaXQoICZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2ldLCBIRERfVFhfUVVFVUVfTUFYX0xFTik7CisKKyAgIC8qIEluaXRpYWwgSEREIGJ1ZmZlciBjb250cm9sIC8gZmxvdyBjb250cm9sIGZpZWxkcyovCisgICB2b3NfcGt0X2dldF9hdmFpbGFibGVfYnVmZmVyX3Bvb2wgKFZPU19QS1RfVFlQRV9UWF84MDJfM19EQVRBLCAmc2l6ZSk7CisKKyAgIHBBZGFwdGVyLT5hVHhRdWV1ZUxpbWl0W1dMQU5UTF9BQ19CS10gPSBIRERfU09GVEFQX1RYX0JLX1FVRVVFX01BWF9MRU47CisgICBwQWRhcHRlci0+YVR4UXVldWVMaW1pdFtXTEFOVExfQUNfQkVdID0gSEREX1NPRlRBUF9UWF9CRV9RVUVVRV9NQVhfTEVOOworICAgcEFkYXB0ZXItPmFUeFF1ZXVlTGltaXRbV0xBTlRMX0FDX1ZJXSA9IEhERF9TT0ZUQVBfVFhfVklfUVVFVUVfTUFYX0xFTjsKKyAgIHBBZGFwdGVyLT5hVHhRdWV1ZUxpbWl0W1dMQU5UTF9BQ19WT10gPSBIRERfU09GVEFQX1RYX1ZPX1FVRVVFX01BWF9MRU47CisKKyAgIHNwaW5fbG9ja19pbml0KCAmcEFkYXB0ZXItPnN0YUluZm9fbG9jayApOworCisgICBmb3IgKFNUQUlkID0gMDsgU1RBSWQgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IFNUQUlkKyspCisgICB7CisgICAgICB2b3NfbWVtX3plcm8oJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0sIHNpemVvZihoZGRfc3RhdGlvbl9pbmZvX3QpKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpICsrKQorICAgICAgeworICAgICAgICAgaGRkX2xpc3RfaW5pdCgmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbaV0sIEhERF9UWF9RVUVVRV9NQVhfTEVOKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogVXBkYXRlIHRoZSBBQyB3ZWlnaHRzIHN1aXRhYmxlIGZvciBTb2Z0QVAgbW9kZSBvZiBvcGVyYXRpb24gKi8KKyAgIFdMQU5UTF9TZXRBQ1dlaWdodHMoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsIHBBQ1dlaWdodHMpOworCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfc29mdGFwX2RlaW5pdF90eF9yeCgpIC0gRGVpbml0IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIFR4L1JYCisgIG1vZHVsZXMgaW4gSERECisKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2luXSBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAgCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3NvZnRhcF9kZWluaXRfdHhfcngoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICkKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICBzdGF0dXMgPSBoZGRfc29mdGFwX2ZsdXNoX3R4X3F1ZXVlcyhwQWRhcHRlcik7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfZmx1c2hfdHhfcXVldWVzX3N0YSgpIC0gVXRpbGl0eSBmdW5jdGlvbiB0byBmbHVzaCB0aGUgVFggcXVldWVzIG9mIGEgc3RhdGlvbgorCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAgQHBhcmFtIFNUQUlkICAgIDogW2luXSBTdGF0aW9uIElEIHRvIGRlaW5pdCAKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCAKKyAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIFZPU19TVEFUVVMgaGRkX3NvZnRhcF9mbHVzaF90eF9xdWV1ZXNfc3RhKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdl9VOF90IFNUQUlkICkKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdl9VOF90IGkgPSAtMTsKKworICAgaGRkX2xpc3Rfbm9kZV90ICphbmNob3IgPSBOVUxMOworCisgICBza2JfbGlzdF9ub2RlX3QgKnBrdE5vZGUgPSBOVUxMOworICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisKKyAgIGlmIChGQUxTRSA9PSBwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLmlzVXNlZCkKKyAgIHsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisKKyAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpICsrKQorICAgeworICAgICAgc3Bpbl9sb2NrX2JoKCZwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLndtbV90eF9xdWV1ZVtpXS5sb2NrKTsKKyAgICAgIHdoaWxlICh0cnVlKSAKKyAgICAgIHsKKyAgICAgICAgIHN0YXR1cyA9IGhkZF9saXN0X3JlbW92ZV9mcm9udCAoICZwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLndtbV90eF9xdWV1ZVtpXSwgJmFuY2hvcik7CisgICAgICAgICBpZiAoVk9TX1NUQVRVU19FX0VNUFRZICE9IHN0YXR1cykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vSWYgc3VjY2VzcyB0aGVuIHdlIGdvdCBhIHZhbGlkIHBhY2tldCBmcm9tIHNvbWUgQUMKKyAgICAgICAgICAgIHBrdE5vZGUgPSBsaXN0X2VudHJ5KGFuY2hvciwgc2tiX2xpc3Rfbm9kZV90LCBhbmNob3IpOworICAgICAgICAgICAgc2tiID0gcGt0Tm9kZS0+c2tiOworICAgICAgICAgICAgKytwQWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZDsKKyAgICAgICAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhGbHVzaGVkOworICAgICAgICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eEZsdXNoZWRBQ1tpXTsKKyAgICAgICAgICAgIGtmcmVlX3NrYihza2IpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICB9CisKKyAgICAgICAgIC8vY3VycmVudCBsaXN0IGlzIGVtcHR5CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNwaW5fdW5sb2NrX2JoKCZwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLndtbV90eF9xdWV1ZVtpXS5sb2NrKTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3NvZnRhcF9pbml0X3R4X3J4X3N0YSgpIC0gSW5pdCBmdW5jdGlvbiB0byBpbml0aWFsaXplIGEgc3RhdGlvbiBpbiBUeC9SWAorICBtb2R1bGVzIGluIEhERAorCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAgQHBhcmFtIFNUQUlkICAgIDogW2luXSBTdGF0aW9uIElEIHRvIGRlaW5pdAorICBAcGFyYW0gcG1hY0FkZHJTVEEgIDogW2luXSBwb2ludGVyIHRvIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbiAgCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3NvZnRhcF9pbml0X3R4X3J4X3N0YSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHZfVThfdCBTVEFJZCwgdl9NQUNBRERSX3QgKnBtYWNBZGRyU1RBKQoreworICAgdl9VOF90IGkgPSAwOworICAgc3Bpbl9sb2NrX2JoKCAmcEFkYXB0ZXItPnN0YUluZm9fbG9jayApOworICAgaWYgKHBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0uaXNVc2VkKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBSZWluaXQgc3RhdGlvbiAlZCIsIF9fRlVOQ1RJT05fXywgU1RBSWQgKTsKKyAgICAgIHNwaW5fdW5sb2NrX2JoKCAmcEFkYXB0ZXItPnN0YUluZm9fbG9jayApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICB2b3NfbWVtX3plcm8oJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0sIHNpemVvZihoZGRfc3RhdGlvbl9pbmZvX3QpKTsKKyAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpICsrKQorICAgeworICAgICAgaGRkX2xpc3RfaW5pdCgmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbaV0sIEhERF9UWF9RVUVVRV9NQVhfTEVOKTsKKyAgIH0KKworICAgcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS5pc1VzZWQgPSBUUlVFOworICAgdm9zX2NvcHlfbWFjYWRkciggJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ubWFjQWRkclNUQSwgcG1hY0FkZHJTVEEpOworCisgICBzcGluX3VubG9ja19iaCggJnBBZGFwdGVyLT5zdGFJbmZvX2xvY2sgKTsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfZGVpbml0X3R4X3J4X3N0YSgpIC0gRGVpbml0IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIGEgc3RhdGlvaW4gaW4gVHgvUlgKKyAgbW9kdWxlcyBpbiBIREQKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBTVEFJZCAgICA6IFtpbl0gU3RhdGlvbiBJRCB0byBkZWluaXQgCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3NvZnRhcF9kZWluaXRfdHhfcnhfc3RhICggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHZfVThfdCBTVEFJZCApCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZfVThfdCBhYzsKKyAgIC8qKlRyYWNrIHdoZXRoZXIgT1MgVFggcXVldWUgaGFzIGJlZW4gZGlzYWJsZWQuKi8KKyAgIHZfQk9PTF90IHR4U3VzcGVuZGVkW05VTV9UWF9RVUVVRVNdOworICAgdl9VOF90IHRsQUM7CisgICBoZGRfaG9zdGFwZF9zdGF0ZV90ICpwSG9zdGFwZFN0YXRlOworCisgICBwSG9zdGFwZFN0YXRlID0gV0xBTl9IRERfR0VUX0hPU1RBUF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisgICBzcGluX2xvY2tfYmgoICZwQWRhcHRlci0+c3RhSW5mb19sb2NrICk7CisgICBpZiAoRkFMU0UgPT0gcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS5pc1VzZWQpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IERlaW5pdCBzdGF0aW9uIG5vdCBpbml0ZWQgJWQiLCBfX0ZVTkNUSU9OX18sIFNUQUlkICk7CisgICAgICBzcGluX3VubG9ja19iaCggJnBBZGFwdGVyLT5zdGFJbmZvX2xvY2sgKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgc3RhdHVzID0gaGRkX3NvZnRhcF9mbHVzaF90eF9xdWV1ZXNfc3RhKHBBZGFwdGVyLCBTVEFJZCk7CisKKyAgIHBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0uaXNVc2VkID0gRkFMU0U7CisKKyAgIC8qIGlmIHRoaXMgU1RBIGhhZCBhbnkgb2YgaXRzIFdNTSBUWCBxdWV1ZXMgc3VzcGVuZGVkLCB0aGVuIHRoZQorICAgICAgYXNzb2NpYXRlZCBxdWV1ZSBvbiB0aGUgbmV0d29yayBpbnRlcmZhY2Ugd2FzIGRpc2FibGVkLiAgY2hlY2sKKyAgICAgIHRvIHNlZSBpZiB0aGF0IGlzIHRoZSBjYXNlLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gcmUtZW5hYmxlCisgICAgICB0aGUgaW50ZXJmYWNlIHF1ZXVlLiAgYnV0IHdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgQlNTIGlzIHJ1bm5pbmcKKyAgICAgIHNpbmNlLCBpZiB0aGUgQlNTIGlzIHN0b3BwZWQsIGFsbCBvZiB0aGUgaW50ZXJmYWNlcyBoYXZlIGJlZW4KKyAgICAgIHN0b3BwZWQgYW5kIHNob3VsZCBub3QgYmUgcmUtZW5hYmxlZCAqLworCisgICBpZiAoQlNTX1NUQVJUID09IHBIb3N0YXBkU3RhdGUtPmJzc1N0YXRlKQorICAgeworICAgICAgZm9yIChhYyA9IEhERF9MSU5VWF9BQ19WTzsgYWMgPD0gSEREX0xJTlVYX0FDX0JLOyBhYysrKQorICAgICAgeworICAgICAgICAgdGxBQyA9IGhkZF9RZGlzY0FjVG9UbEFDW2FjXTsKKyAgICAgICAgIHR4U3VzcGVuZGVkW2FjXSA9IHBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0udHhTdXNwZW5kZWRbdGxBQ107CisgICAgICB9CisgICB9CisgICB2b3NfbWVtX3plcm8oJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0sIHNpemVvZihoZGRfc3RhdGlvbl9pbmZvX3QpKTsKKworICAgaWYgKEJTU19TVEFSVCA9PSBwSG9zdGFwZFN0YXRlLT5ic3NTdGF0ZSkKKyAgIHsKKyAgICAgIGZvciAoYWMgPSBIRERfTElOVVhfQUNfVk87IGFjIDw9IEhERF9MSU5VWF9BQ19CSzsgYWMrKykKKyAgICAgIHsKKyAgICAgICAgIGlmICh0eFN1c3BlbmRlZFthY10pCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICIlczogVFggcXVldWUgcmUtZW5hYmxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBuZXRpZl93YWtlX3N1YnF1ZXVlKHBBZGFwdGVyLT5kZXYsIGFjKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgc3Bpbl91bmxvY2tfYmgoICZwQWRhcHRlci0+c3RhSW5mb19sb2NrICk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfc29mdGFwX2Rpc2Nvbm5lY3RfdHhfcngoKSAtIERpc2Nvbm5lY3QgZnVuY3Rpb24gdG8gY2xlYW4gdXAgVHgvUlgKKyAgbW9kdWxlcyBpbiBIREQKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCAKKyAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBoZGRfc29mdGFwX2Rpc2Nvbm5lY3RfdHhfcngoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyICkKK3sKKyAgIHJldHVybiBoZGRfc29mdGFwX2ZsdXNoX3R4X3F1ZXVlcyhwQWRhcHRlcik7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfdHhfY29tcGxldGVfY2JrKCkgLSBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIGJ5IFRMCisgIHRvIGluZGljYXRlIHRoYXQgYSBwYWNrZXQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQgYWNyb3NzIHRoZSBidXMKKyAgc3VjY2VzZnVsbHkuIE9TIHBhY2tldCByZXNvdXJjZXMgY2FuIGJlIHJlbGVhc2VkIGFmdGVyIHRoaXMgY2JrLgorCisgIEBwYXJhbSB2b3NDb250ZXh0ICAgOiBbaW5dIHBvaW50ZXIgdG8gVk9TIGNvbnRleHQgICAKKyAgQHBhcmFtIHBWb3NQYWNrZXQgICA6IFtpbl0gcG9pbnRlciB0byBWT1MgcGFja2V0IChjb250YWluaW5nIHNrYikgCisgIEBwYXJhbSB2b3NTdGF0dXNJbiAgOiBbaW5dIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXNzaW9uIAorCisgIEByZXR1cm4gICAgICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkIAorICAgICAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBoZGRfc29mdGFwX3R4X2NvbXBsZXRlX2Niayggdl9WT0lEX3QgKnZvc0NvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X3QgKnBWb3NQYWNrZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTIHZvc1N0YXR1c0luICkKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOyAgIAorICAgdm9pZCogcE9zUGt0ID0gTlVMTDsKKyAgIAorICAgaWYoICggTlVMTCA9PSB2b3NDb250ZXh0ICkgfHwgKCBOVUxMID09IHBWb3NQYWNrZXQgKSAgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IE51bGwgcGFyYW1zIGJlaW5nIHBhc3NlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvL1JldHVybiB0aGUgc2tiIHRvIHRoZSBPUworICAgc3RhdHVzID0gdm9zX3BrdF9nZXRfb3NfcGFja2V0KCBwVm9zUGFja2V0LCAmcE9zUGt0LCBWT1NfVFJVRSApOworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkpCisgICB7CisgICAgICAvL1RoaXMgaXMgYmFkIGJ1dCBzdGlsbCB0cnkgdG8gZnJlZSB0aGUgVk9TUyByZXNvdXJjZXMgaWYgd2UgY2FuCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogRmFpbHVyZSBleHRyYWN0aW5nIHNrYiBmcm9tIHZvcyBwa3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwVm9zUGFja2V0ICk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vR2V0IHRoZSBBZGFwdGVyIGNvbnRleHQuCisgICBwQWRhcHRlciA9IChoZGRfYWRhcHRlcl90ICopbmV0ZGV2X3ByaXYoKChzdHJ1Y3Qgc2tfYnVmZiAqKXBPc1BrdCktPmRldik7CisgICBpZihwQWRhcHRlciA9PSBOVUxMKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEhERCBhZGFwdGVyIGNvbnRleHQgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4Q29tcGxldGVkOworICAgfQorCisgICBrZnJlZV9za2IoKHN0cnVjdCBza19idWZmICopcE9zUGt0KTsgCisKKyAgIC8vUmV0dXJuIHRoZSBWT1MgcGFja2V0IHJlc291cmNlcy4KKyAgIHN0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BhY2tldCApOworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogQ291bGQgbm90IHJldHVybiBWT1MgcGFja2V0IHRvIHRoZSBwb29sIiwgX19GVU5DVElPTl9fKTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfc29mdGFwX3R4X2ZldGNoX3BhY2tldF9jYmsoKSAtIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgYnkgVEwgdG8gCisgIGZldGNoIGEgcGFja2V0IGZvciB0cmFuc21pc3Npb24uCisKKyAgQHBhcmFtIHZvc0NvbnRleHQgICA6IFtpbl0gcG9pbnRlciB0byBWT1MgY29udGV4dCAgCisgIEBwYXJhbSBzdGFJZCAgICAgICAgOiBbaW5dIFN0YXRpb24gZm9yIHdoaWNoIFRMIGlzIHJlcXVlc3RpbmcgYSBwa3QKKyAgQHBhcmFtIGFjICAgICAgICAgICA6IFtpbl0gYWNjZXNzIGNhdGVnb3J5IHJlcXVlc3RlZCBieSBUTAorICBAcGFyYW0gcFZvc1BhY2tldCAgIDogW291dF0gcG9pbnRlciB0byBWT1MgcGFja2V0IHBhY2tldCBwb2ludGVyCisgIEBwYXJhbSBwUGt0TWV0YUluZm8gOiBbb3V0XSBwb2ludGVyIHRvIG1ldGEgaW5mbyBmb3IgdGhlIHBrdCAKKyAgCisgIEByZXR1cm4gICAgICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRU1QVFkgaWYgbm8gcGFja2V0cyB0byB0cmFuc21pdAorICAgICAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCAKKyAgICAgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3NvZnRhcF90eF9mZXRjaF9wYWNrZXRfY2JrKCB2X1ZPSURfdCAqdm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcFN0YUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDRW51bVR5cGUgIGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90ICoqcHBWb3NQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTWV0YUluZm9UeXBlICpwUGt0TWV0YUluZm8gKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gTlVMTDsKKyAgIGhkZF9saXN0X25vZGVfdCAqYW5jaG9yID0gTlVMTDsKKyAgIHNrYl9saXN0X25vZGVfdCAqcGt0Tm9kZSA9IE5VTEw7CisgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKyAgIHZvc19wa3RfdCAqcFZvc1BhY2tldCA9IE5VTEw7CisgICB2X01BQ0FERFJfdCogcERlc3RNYWNBZGRyZXNzID0gTlVMTDsKKyAgIHZfVElNRV90IHRpbWVzdGFtcDsKKyAgIHZfU0laRV90IHNpemUgPSAwOworICAgdl9VOF90IFNUQUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOyAgIAorICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IE5VTEw7CisKKyAgIC8vU2FuaXR5IGNoZWNrIG9uIGlucHV0cworICAgaWYgKCAoIE5VTEwgPT0gdm9zQ29udGV4dCApIHx8IAorICAgICAgICAoIE5VTEwgPT0gcFN0YUlkICkgfHwgCisgICAgICAgICggTlVMTCA9PSBwcFZvc1BhY2tldCApIHx8CisgICAgICAgICggTlVMTCA9PSBwUGt0TWV0YUluZm8gKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogTnVsbCBQYXJhbXMgYmVpbmcgcGFzc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgICAKKyAgIC8vR2V0IHRoZSBIREQgY29udGV4dC4KKyAgIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9IREQsIHZvc0NvbnRleHQgKTsKKyAgIGlmICggTlVMTCA9PSBwSGRkQ3R4ICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBIREQgYWRhcHRlciBjb250ZXh0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBwQWRhcHRlciA9IHBIZGRDdHgtPnN0YV90b19hZGFwdGVyWypwU3RhSWRdOworICAgaWYoIE5VTEwgPT0gcEFkYXB0ZXIgKQorICAgeworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAKKyAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhGZXRjaGVkOworCisgICBTVEFJZCA9ICpwU3RhSWQ7CisgICBpZiAoU1RBSWQgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNUQUlkICVkIHBhc3NlZCBieSBUTCIsIF9fRlVOQ1RJT05fXywgU1RBSWQpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBpZiAoRkFMU0UgPT0gcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS5pc1VzZWQgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBVbnJlZ2lzdGVyZWQgU1RBSWQgJWQgcGFzc2VkIGJ5IFRMIiwgX19GVU5DVElPTl9fLCBTVEFJZCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgICpwcFZvc1BhY2tldCA9IE5VTEw7CisKKyAgIC8vTWFrZSBzdXJlIHRoZSBBQyBiZWluZyBhc2tlZCBmb3IgaXMgc2FuZQorICAgaWYoIGFjID4gV0xBTlRMX01BWF9BQyB8fCBhYyA8IDApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgQUMgJWQgcGFzc2VkIGJ5IFRMIiwgX19GVU5DVElPTl9fLCBhYyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhGZXRjaGVkQUNbYWNdOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICIlczogQUMgJWQgcGFzc2VkIGJ5IFRMIiwgX19GVU5DVElPTl9fLCBhYyk7CisKKyAgIC8vR2V0IHRoZSB2b3MgcGFja2V0LiBJIGRvbid0IHdhbnQgdG8gZGVxdWV1ZSBhbmQgZW5xdWV1ZSBhZ2FpbiBpZiB3ZSBhcmUgb3V0IG9mIFZPUyByZXNvdXJjZXMgCisgICAvL1RoaXMgc2ltcGxpZmllcyB0aGUgbG9ja2luZyBhbmQgdW5sb2NraW5nIG9mIFR4IHF1ZXVlCisgICBzdGF0dXMgPSB2b3NfcGt0X3dyYXBfZGF0YV9wYWNrZXQoICZwVm9zUGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1BLVF9UWVBFX1RYXzgwMl8zX0RBVEEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvL09TIFBrdCBpcyBub3QgYmVpbmcgcGFzc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9zb2Z0YXBfdHhfbG93X3Jlc291cmNlX2NiaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyICk7CisKKyAgIGlmIChzdGF0dXMgPT0gVk9TX1NUQVRVU19FX0FMUkVBRFkgfHwgc3RhdHVzID09IFZPU19TVEFUVVNfRV9SRVNPVVJDRVMpCisgICB7CisgICAgICAvL1JlbWVtYmVyIFZPUyBpcyBpbiBhIGxvdyByZXNvdXJjZSBzaXR1YXRpb24KKyAgICAgIHBBZGFwdGVyLT5pc1Zvc091dE9mUmVzb3VyY2UgPSBWT1NfVFJVRTsKKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhGZXRjaExvd1Jlc291cmNlczsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogVk9TUyBpbiBMb3cgUmVzb3VyY2Ugc2NlbmFyaW8iLCBfX0ZVTkNUSU9OX18pOworICAgICAgLy9UTCBuZWVkcyB0byBoYW5kbGUgdGhpcyBjYXNlLiBWT1NfU1RBVFVTX0VfRU1QVFkgaXMgcmV0dXJuZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHkuCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIE9ubHkgZmV0Y2ggdGhpcyBzdGF0aW9uIGFuZCB0aGlzIEFDLiBSZXR1cm4gVk9TX1NUQVRVU19FX0VNUFRZIGlmIG5vdGhpbmcgdGhlcmUuIERvIG5vdCBnZXQgbmV4dCBBQworICAgICAgYXMgdGhlIG90aGVyIGJyYW5jaCBkb2VzLgorICAgKi8KKyAgIHNwaW5fbG9ja19iaCgmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbYWNdLmxvY2spOworICAgaGRkX2xpc3Rfc2l6ZSgmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbYWNdLCAmc2l6ZSk7CisKKyAgIGlmICgwID09IHNpemUpCisgICB7CisgICAgICBzcGluX3VubG9ja19iaCgmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbYWNdLmxvY2spOworICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBWb3NQYWNrZXQpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgIH0KKworICAgc3RhdHVzID0gaGRkX2xpc3RfcmVtb3ZlX2Zyb250KCAmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbYWNdLCAmYW5jaG9yICk7CisgICBzcGluX3VubG9ja19iaCgmcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS53bW1fdHhfcXVldWVbYWNdLmxvY2spOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICIlczogQUMgJWQgaGFzIHBhY2tldHMgcGVuZGluZyIsIF9fRlVOQ1RJT05fXywgYWMpOworCisgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKQorICAgeworICAgICAgLy9JZiBzdWNjZXNzIHRoZW4gd2UgZ290IGEgdmFsaWQgcGFja2V0IGZyb20gc29tZSBBQworICAgICAgcGt0Tm9kZSA9IGxpc3RfZW50cnkoYW5jaG9yLCBza2JfbGlzdF9ub2RlX3QsIGFuY2hvcik7CisgICAgICBza2IgPSBwa3ROb2RlLT5za2I7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4RmV0Y2hEZXF1ZXVlRXJyb3I7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEVycm9yIGluIGRlLXF1ZXVpbmcgc2tiIGZyb20gVHggcXVldWUgc3RhdHVzID0gJWQiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyApOworICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBWb3NQYWNrZXQpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvL0F0dGFjaCBza2IgdG8gVk9TIHBhY2tldC4KKyAgIHN0YXR1cyA9IHZvc19wa3Rfc2V0X29zX3BhY2tldCggcFZvc1BhY2tldCwgc2tiICk7CisgICBpZiAoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogRXJyb3IgYXR0YWNoaW5nIHNrYiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFZvc1BhY2tldCk7CisgICAgICArK3BBZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkOworICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eEZldGNoRGVxdWV1ZUVycm9yOworICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vSnVzdCBiZWluZyBwYXJhbm9pZC4gVG8gYmUgcmVtb3ZlZCBsYXRlcgorICAgaWYocFZvc1BhY2tldCA9PSBOVUxMKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBWT1MgcGFja2V0IHJldHVybmVkIGJ5IFZPU1MgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICArK3BBZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkOworICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eEZldGNoRGVxdWV1ZUVycm9yOworICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vUmV0dXJuIFZPUyBwYWNrZXQgdG8gVEw7CisgICAqcHBWb3NQYWNrZXQgPSBwVm9zUGFja2V0OworCisgICAvL0ZpbGwgb3V0IHRoZSBtZXRhIGluZm9ybWF0aW9uIG5lZWRlZCBieSBUTAorICAgLy9GSVhNRSBUaGlzIHRpbWVzdGFtcCBpcyByZWFsbHkgdGhlIHRpbWUgc3RhbXAgb2Ygd3JhcF9kYXRhX3BhY2tldAorICAgdm9zX3BrdF9nZXRfdGltZXN0YW1wKCBwVm9zUGFja2V0LCAmdGltZXN0YW1wICk7CisgICBwUGt0TWV0YUluZm8tPnVzVGltZVN0YW1wID0gKHZfVTE2X3QpdGltZXN0YW1wOworICAgaWYgKCAxIDwgc2l6ZSApCisgICB7CisgICAgICAgcFBrdE1ldGFJbmZvLT5iTW9yZVBhY2tldHMgPSAxOyAvL0hERCBoYXMgbW9yZSBwYWNrZXRzIHRvIHNlbmQKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICBwUGt0TWV0YUluZm8tPmJNb3JlUGFja2V0cyA9IDA7CisgICB9CisKKyAgIHBQa3RNZXRhSW5mby0+dWNJc0VhcG9sID0gMDsKKworICAgaWYocEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS50bFNUQVN0YXRlICE9IFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCkgCisgICB7CisgICAgICBpZiAoVFJVRSA9PSBoZGRfSXNFQVBPTFBhY2tldCggcFZvc1BhY2tldCApKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICIlczogVk9TIHBhY2tldCBpcyBFQVBPTCBwYWNrZXQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgcFBrdE1ldGFJbmZvLT51Y0lzRWFwb2wgPSAxOworICAgICAgfQorICAgfQorIAorLy94ZzogQEBAQDogdGVtcG9yYXJpbHkgZGlzYmxlIHRoZXNlLiB3aWxsIHJldmlzaXQgbGF0ZXIKKyNpZm5kZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgaWYocEFkYXB0ZXItPmNvbm5faW5mby51SXNBdXRoZW50aWNhdGVkID09IFZPU19UUlVFKQorICAgICAgcFBrdE1ldGFJbmZvLT51Y0lzRWFwb2wgPSAwOyAgICAgICAKKyAgIGVsc2UgCisgICAgICBwUGt0TWV0YUluZm8tPnVjSXNFYXBvbCA9IGhkZF9Jc0VBUE9MUGFja2V0KCBwVm9zUGFja2V0ICkgPyAxIDogMDsKKworICAgaWYgKChIRERfV01NX1VTRVJfTU9ERV9OT19RT1MgPT0gcEFkYXB0ZXItPmNmZ19pbmktPldtbU1vZGUpIHx8CisgICAgICAgKCFwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbVFhcCkpCisgICB7CisgICAgICAvLyBlaXRoZXIgd2UgZG9uJ3Qgd2FudCBRb1Mgb3IgdGhlIEFQIGRvZXNuJ3Qgc3VwcG9ydCBRb1MKKyAgICAgIHBQa3RNZXRhSW5mby0+dWNVUCA9IDA7CisgICAgICBwUGt0TWV0YUluZm8tPnVjVElEID0gMDsKKyAgIH0KKyAgIGVsc2UKKyNlbmRpZgorICAgeworICAgICAgcFBrdE1ldGFJbmZvLT51Y1VQID0gcGt0Tm9kZS0+dXNlclByaW9yaXR5OworICAgICAgcFBrdE1ldGFJbmZvLT51Y1RJRCA9IHBQa3RNZXRhSW5mby0+dWNVUDsKKyAgIH0KKworICAgcFBrdE1ldGFJbmZvLT51Y1R5cGUgPSAwOyAgICAgICAgICAvL0ZJWE1FIERvbid0IGtub3cgd2hhdCB0aGlzIGlzCisgICAvL0V4dHJhY3QgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZnJvbSBldGhlcm5ldCBmcmFtZQorICAgcERlc3RNYWNBZGRyZXNzID0gKHZfTUFDQUREUl90Kilza2ItPmRhdGE7CisKKyAgIC8vIHdlIG5lZWQgODAyLjMgdG8gODAyLjExIGZyYW1lIHRyYW5zbGF0aW9uCisgICAvLyAobm90ZSB0aGF0IEJjYXN0L01jYXN0IHdpbGwgYmUgdHJhbnNsYXRlZCBpbiBTVywgdW5pY2FzdCBpbiBIVykKKyAgIHBQa3RNZXRhSW5mby0+dWNEaXNhYmxlRnJtWHRsID0gMDsKKyAgIHBQa3RNZXRhSW5mby0+dWNCY2FzdCA9IHZvc19pc19tYWNhZGRyX2Jyb2FkY2FzdCggcERlc3RNYWNBZGRyZXNzICkgPyAxIDogMDsKKyAgIHBQa3RNZXRhSW5mby0+dWNNY2FzdCA9IHZvc19pc19tYWNhZGRyX2dyb3VwKCBwRGVzdE1hY0FkZHJlc3MgKSA/IDEgOiAwOworCisgICBpZiAoIChwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLnR4U3VzcGVuZGVkW2FjXSkgJiYKKyAgICAgICAgKHNpemUgPD0gKChwQWRhcHRlci0+YVR4UXVldWVMaW1pdFthY10qMykvNCkgKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIiVzOiBUWCBxdWV1ZSByZS1lbmFibGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0udHhTdXNwZW5kZWRbYWNdID0gVk9TX0ZBTFNFOworICAgICAgbmV0aWZfd2FrZV9zdWJxdWV1ZShwQWRhcHRlci0+ZGV2LCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CisgICB9ICAgIAorCisgICAvLyBXZSdyZSBnaXZpbmcgdGhlIHBhY2tldCB0byBUTCBzbyBjb25zaWRlciBpdCB0cmFuc21pdHRlZCBmcm9tCisgICAvLyBhIHN0YXRpc3RpY3MgcGVyc3BlY3RpdmUuICBXZSBhY2NvdW50IGZvciBpdCBoZXJlIGluc3RlYWQgb2YKKyAgIC8vIHdoZW4gdGhlIHBhY2tldCBpcyByZXR1cm5lZCBmb3IgdHdvIHJlYXNvbnMuICBGaXJzdCwgVEwgd2lsbAorICAgLy8gbWFuaXB1bGF0ZSB0aGUgc2tiIHRvIHRoZSBwb2ludCB3aGVyZSB0aGUgbGVuIGZpZWxkIGlzIG5vdAorICAgLy8gYWNjdXJhdGUsIGxlYWRpbmcgdG8gaW5hY2N1cmF0ZSBieXRlIGNvdW50cyBpZiB3ZSBhY2NvdW50IGZvcgorICAgLy8gaXQgbGF0ZXIuICBTZWNvbmQsIFRMIGRvZXMgbm90IHByb3ZpZGUgYW55IGZlZWRiYWNrIGFzIHRvCisgICAvLyB3aGV0aGVyIG9yIG5vdCB0aGUgcGFja2V0IHdhcyBzdWNjZXNzZnVsbHkgc2VudCBvdmVyIHRoZSBhaXIsCisgICAvLyBzbyB0aGUgcGFja2V0IGNvdW50cyB3aWxsIGJlIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgd2UKKyAgIC8vIGFjY291bnQgZm9yIHRoZW0KKyAgIHBBZGFwdGVyLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICsrcEFkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHM7CisgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4RmV0Y2hEZXF1ZXVlZDsKKyAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhGZXRjaERlcXVldWVkQUNbYWNdOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICIlczogVmFsaWQgVk9TIFBLVCByZXR1cm5lZCB0byBUTCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3NvZnRhcF90eF9sb3dfcmVzb3VyY2VfY2JrKCkgLSBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIGluIHRoZSAKKyAgY2FzZSB3aGVyZSBWT1MgcGFja2V0cyBhcmUgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSBvZiB0aGUgY2FsbCB0byBnZXQgCisgIHBhY2tldHMuIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgaW52b2tlZCBieSBWT1Mgd2hlbiBwYWNrZXRzIGFyZSAKKyAgYXZhaWxhYmxlLgorCisgIEBwYXJhbSBwVm9zUGFja2V0IDogW2luXSAgcG9pbnRlciB0byBWT1MgcGFja2V0IAorICBAcGFyYW0gdXNlckRhdGEgICA6IFtpbl0gIG9wYXF1ZSB1c2VyIGRhdGEgdGhhdCB3YXMgcGFzc2VkIGluaXRpYWxseSAKKyAgCisgIEByZXR1cm4gICAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwgCisgICAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIGhkZF9zb2Z0YXBfdHhfbG93X3Jlc291cmNlX2Niayggdm9zX3BrdF90ICpwVm9zUGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICp1c2VyRGF0YSApCit7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgIHZfU0lOVF90IGkgPSAwOworICAgdl9TSVpFX3Qgc2l6ZSA9IDA7CisgICBoZGRfYWRhcHRlcl90KiBwQWRhcHRlciA9IChoZGRfYWRhcHRlcl90ICopdXNlckRhdGE7CisgICB2X1U4X3QgU1RBSWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CisgCisgICBpZihwQWRhcHRlciA9PSBOVUxMKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEhERCBhZGFwdGVyIGNvbnRleHQgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vUmV0dXJuIHRoZSBwYWNrZXQgdG8gVk9TLiBXZSBqdXN0IG5lZWRlZCB0byBrbm93IHRoYXQgVk9TIGlzIG91dCBvZiBsb3cgcmVzb3VyY2UKKyAgIC8vc2l0dWF0aW9uLiBIZXJlIHdlIHdpbGwgb25seSBzaWduYWwgVEwgdGhhdCB0aGVyZSBpcyBhIHBlbmRpbmcgZGF0YSBmb3IgYSBTVEEuIAorICAgLy9WT1MgcGFja2V0IHdpbGwgYmUgcmVxdWVzdGVkIChpZiBuZWVkZWQpIHdoZW4gVEwgY29tZXMgYmFjayB0byBmZXRjaCBkYXRhLgorICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwVm9zUGFja2V0ICk7CisKKyAgIHBBZGFwdGVyLT5pc1Zvc091dE9mUmVzb3VyY2UgPSBWT1NfRkFMU0U7CisgICAKKyAgIC8vIEluZGljYXRlIHRvIFRMIHRoYXQgdGhlcmUgaXMgcGVuZGluZyBkYXRhIGlmIGEgcXVldWUgaXMgbm9uIGVtcHR5LgorICAgLy8gVGhpcyBDb2RlIHdhc250IGluY2x1ZGVkIGluIGVhcmxpZXIgdmVyc2lvbiB3aGljaCByZXN1bHRlZCBpbgorICAgLy8gVHJhZmZpYyBzdGFsbGluZworICAgZm9yIChTVEFJZCA9IDA7IFNUQUlkIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBTVEFJZCsrKQorICAgeworICAgICAgaWYgKChwQWRhcHRlci0+YVN0YUluZm9bU1RBSWRdLnRsU1RBU3RhdGUgPT0gV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEKSB8fAorICAgICAgICAgICAocEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS50bFNUQVN0YXRlID09IFdMQU5UTF9TVEFfQ09OTkVDVEVEKSkKKyAgICAgIHsKKyAgICAgICAgIGZvciggaT1OVU1fVFhfUVVFVUVTLTE7IGk+PTA7IC0taSApCisgICAgICAgICB7CisgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICAgIGhkZF9saXN0X3NpemUoJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ud21tX3R4X3F1ZXVlW2ldLCAmc2l6ZSk7CisgICAgICAgICAgICBpZiAoIHNpemUgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IFdMQU5UTF9TVEFQa3RQZW5kaW5nKCAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfQUNFbnVtVHlwZSlpICk7CisgICAgICAgICAgICAgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEZhaWx1cmUgaW4gaW5kaWNhdGluZyBwa3QgdG8gVEwgZm9yIGFjPSVkIiwgX19GVU5DVElPTl9fLGkpOyAKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0gCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9zb2Z0YXBfcnhfcGFja2V0X2NiaygpIC0gUmVjZWl2ZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwuCisgIFRMIHdpbGwgY2FsbCB0aGlzIHRvIG5vdGlmeSB0aGUgSEREIHdoZW4gb25lIG9yIG1vcmUgcGFja2V0cyB3ZXJlCisgIHJlY2VpdmVkIGZvciBhIHJlZ2lzdGVyZWQgU1RBLgorCisgIEBwYXJhbSB2b3NDb250ZXh0ICAgICAgOiBbaW5dIHBvaW50ZXIgdG8gVk9TIGNvbnRleHQgIAorICBAcGFyYW0gcFZvc1BhY2tldENoYWluIDogW2luXSBwb2ludGVyIHRvIFZPUyBwYWNrZXQgY2hhaW4KKyAgQHBhcmFtIHN0YUlkICAgICAgICAgICA6IFtpbl0gU3RhdGlvbiBJZCAoQWRyZXNzIDEgSW5kZXgpCisgIEBwYXJhbSBwUnhNZXRhSW5mbyAgICAgOiBbaW5dIHBvaW50ZXIgdG8gbWV0YSBpbmZvIGZvciB0aGUgcmVjZWl2ZWQgcGt0KHMpLgorCisgIEByZXR1cm4gICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3NvZnRhcF9yeF9wYWNrZXRfY2JrKCB2X1ZPSURfdCAqdm9zQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X3QgKnBWb3NQYWNrZXRDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzdGFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSogcFJ4TWV0YUluZm8gKQoreworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIGludCByeHN0YXQ7CisgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKyAgIHZvc19wa3RfdCogcFZvc1BhY2tldDsKKyAgIHZvc19wa3RfdCogcE5leHRWb3NQYWNrZXQ7ICAgCisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsgICAKKworICAgLy9TYW5pdHkgY2hlY2sgb24gaW5wdXRzCisgICBpZiAoICggTlVMTCA9PSB2b3NDb250ZXh0ICkgfHwgCisgICAgICAgICggTlVMTCA9PSBwVm9zUGFja2V0Q2hhaW4gKSB8fAorICAgICAgICAoIE5VTEwgPT0gcFJ4TWV0YUluZm8gKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogTnVsbCBwYXJhbXMgYmVpbmcgcGFzc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIAorICAgcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0hERCwgdm9zQ29udGV4dCApOworICAgaWYgKCBOVUxMID09IHBIZGRDdHggKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEhERCBhZGFwdGVyIGNvbnRleHQgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHBBZGFwdGVyID0gcEhkZEN0eC0+c3RhX3RvX2FkYXB0ZXJbc3RhSWRdOworICAgaWYoIE5VTEwgPT0gcEFkYXB0ZXIgKQorICAgeworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIAorICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy5yeENoYWluczsKKworICAgLy8gd2FsayB0aGUgY2hhaW4gdW50aWwgYWxsIGFyZSBwcm9jZXNzZWQKKyAgIHBWb3NQYWNrZXQgPSBwVm9zUGFja2V0Q2hhaW47CisgICBkbworICAgeworICAgICAgLy8gZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IHBhY2tldCBpbiB0aGUgY2hhaW4KKyAgICAgIC8vIChidXQgZG9uJ3QgdW5saW5rIHRoZSBwYWNrZXQgc2luY2Ugd2UgZnJlZSB0aGUgZW50aXJlIGNoYWluIGxhdGVyKQorICAgICAgc3RhdHVzID0gdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggcFZvc1BhY2tldCwgJnBOZXh0Vm9zUGFja2V0LCBWT1NfRkFMU0UpOworCisgICAgICAvLyBib3RoICJzdWNjZXNzIiBhbmQgImVtcHR5IiBhcmUgYWNjZXB0YWJsZSByZXN1bHRzCisgICAgICBpZiAoISgoc3RhdHVzID09IFZPU19TVEFUVVNfU1VDQ0VTUykgfHwgKHN0YXR1cyA9PSBWT1NfU1RBVFVTX0VfRU1QVFkpKSkKKyAgICAgIHsKKyAgICAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMucnhEcm9wcGVkOworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEZhaWx1cmUgd2Fsa2luZyBwYWNrZXQgY2hhaW4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgfQorCisgICAgICAvLyBFeHRyYWN0IHRoZSBPUyBwYWNrZXQgKHNrYikuCisgICAgICAvLyBUZWxsIFZPUyB0byBkZXRhY2ggdGhlIE9TIHBhY2tldCBmcm9tIHRoZSBWT1MgcGFja2V0CisgICAgICBzdGF0dXMgPSB2b3NfcGt0X2dldF9vc19wYWNrZXQoIHBWb3NQYWNrZXQsICh2X1ZPSURfdCAqKikmc2tiLCBWT1NfVFJVRSApOworICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkpCisgICAgICB7CisgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnJ4RHJvcHBlZDsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBGYWlsdXJlIGV4dHJhY3Rpbmcgc2tiIGZyb20gdm9zIHBrdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisgICAKKyAgICAgIC8vaGRkX3NvZnRhcF9kdW1wX3NrX2J1ZmYoc2tiKTsKKworICAgICAgc2tiLT5kZXYgPSBwQWRhcHRlci0+ZGV2OworICAgICAgCisgICAgICBpZihza2ItPmRldiA9PSBOVUxMKSB7CisgIAorICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICJFUlJPUiEhSW52YWxpZCBuZXRkZXZpY2VcbiIpOworICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIH0KKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMucnhQYWNrZXRzOworICAgICAgKytwQWRhcHRlci0+c3RhdHMucnhfcGFja2V0czsKKyAgICAgIHBBZGFwdGVyLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworICAgICAgaWYgKFdMQU5fUlhfQkNNQ19TVEFfSUQgPT0gcFJ4TWV0YUluZm8tPnVjRGVzU1RBSWQpCisgICAgICB7CisgICAgICAgICAvL01DL0JDIHBhY2tldHMuIER1cGxpY2F0ZSBhIGNvcHkgb2YgcGFja2V0CisgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcFNrYkNvcHk7CisgICAgICAgICBoZGRfYXBfY3R4X3QgKnBIZGRBcEN0eDsKKworICAgICAgICAgcEhkZEFwQ3R4ID0gV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEFkYXB0ZXIpOworICAgICAgICAgaWYgKCEocEhkZEFwQ3R4LT5hcERpc2FibGVJbnRyYUJzc0Z3ZCkpCisgICAgICAgICB7CisgICAgICAgICAgICAgcFNrYkNvcHkgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworICAgICAgICAgICAgIGlmIChwU2tiQ29weSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRfc29mdGFwX3N0YV8yX3N0YV94bWl0KHBTa2JDb3B5LCBwU2tiQ29weS0+ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRkQXBDdHgtPnVCQ1N0YUlkLCAocFJ4TWV0YUluZm8tPnVjVVApKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICIlczogc2tiIGFsbG9jYXRpb24gZmFpbHMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgfQorIAorCisgICAgICB9IC8vKFdMQU5fUlhfQkNNQ19TVEFfSUQgPT0gc3RhSWQpCisKKyAgICAgIGlmICgoV0xBTl9SWF9CQ01DX1NUQV9JRCA9PSBwUnhNZXRhSW5mby0+dWNEZXNTVEFJZCkgfHwgCisgICAgICAgICAgKFdMQU5fUlhfU0FQX1NFTEZfU1RBX0lEID09IHBSeE1ldGFJbmZvLT51Y0Rlc1NUQUlkKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogc2VuZCBvbmUgcGFja2V0IHRvIGtlcm5lbCBcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKKyAgICAgICAgIHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisgICAgICAgICByeHN0YXQgPSBuZXRpZl9yeF9uaShza2IpOworICAgICAgICAgaWYgKE5FVF9SWF9TVUNDRVNTID09IHJ4c3RhdCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMucnhEZWxpdmVyZWQ7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnJ4UmVmdXNlZDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwQWRhcHRlcikpLT5hcERpc2FibGVJbnRyYUJzc0Z3ZCkKKyAgICAgIHsKKyAgICAgICAga2ZyZWVfc2tiKHNrYik7ICAgCisgICAgICB9IAorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLy9sb29wYmFjayB0cmFmZmljCisgICAgICAgIHN0YXR1cyA9IGhkZF9zb2Z0YXBfc3RhXzJfc3RhX3htaXQoc2tiLCBza2ItPmRldiwKKyAgICAgICAgICAgICAgICAgcFJ4TWV0YUluZm8tPnVjRGVzU1RBSWQsIChwUnhNZXRhSW5mby0+dWNVUCkpOworICAgICAgfQorCisgICAgICAvLyBub3cgcHJvY2VzcyB0aGUgbmV4dCBwYWNrZXQgaW4gdGhlIGNoYWluCisgICAgICBwVm9zUGFja2V0ID0gcE5leHRWb3NQYWNrZXQ7CisKKyAgIH0gd2hpbGUgKHBWb3NQYWNrZXQpOworCisgICAvL1JldHVybiB0aGUgZW50aXJlIFZPUyBwYWNrZXQgY2hhaW4gdG8gdGhlIHJlc291cmNlIHBvb2wKKyAgIHN0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BhY2tldENoYWluICk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBGYWlsdXJlIHJldHVybmluZyB2b3MgcGt0IiwgX19GVU5DVElPTl9fKTsKKyAgIH0KKyAgIAorICAgcEFkYXB0ZXItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKyAgIHJldHVybiBzdGF0dXM7ICAgCit9CisKK1ZPU19TVEFUVVMgaGRkX3NvZnRhcF9EZXJlZ2lzdGVyU1RBKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdEFOSV9VOCBzdGFJZCApCit7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHBBZGFwdGVyLT5wSGRkQ3R4OworCisgICAgLy9DbGVhciBzdGF0aW9uIGluIFRMIGFuZCB0aGVuIHVwZGF0ZSBIREQgZGF0YSBzdHJ1Y3R1cmVzLiBUaGlzIGhlbHBzIAorICAgIC8vdG8gYmxvY2sgUlggZnJhbWVzIGZyb20gb3RoZXIgc3RhdGlvbiB0byB0aGlzIHN0YXRpb24uCisgICAgdm9zU3RhdHVzID0gV0xBTlRMX0NsZWFyU1RBQ2xpZW50KCAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCwgc3RhSWQgKTsKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAiV0xBTlRMX0NsZWFyU1RBQ2xpZW50KCkgZmFpbGVkIHRvIGZvciBzdGFJRCAlZC4gICIKKyAgICAgICAgICAgICAgICAgICAgIlN0YXR1cz0gJWQgWzB4JTA4bFhdIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhSWQsIHZvc1N0YXR1cywgdm9zU3RhdHVzICk7CisgICAgfQorCisgICAgdm9zU3RhdHVzID0gaGRkX3NvZnRhcF9kZWluaXRfdHhfcnhfc3RhICggcEFkYXB0ZXIsIHN0YUlkICk7CisgICAgaWYoIFZPU19TVEFUVVNfRV9GQUlMVVJFID09IHZvc1N0YXR1cyApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UgKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgImhkZF9zb2Z0YXBfZGVpbml0X3R4X3J4X3N0YSgpIGZhaWxlZCBmb3Igc3RhSUQgJWQuICIKKyAgICAgICAgICAgICAgICAgICAgIlN0YXR1cyA9ICVkIFsweCUwOGxYXSIsCisgICAgICAgICAgICAgICAgICAgIHN0YUlkLCB2b3NTdGF0dXMsIHZvc1N0YXR1cyApOworICAgICAgICByZXR1cm4oIHZvc1N0YXR1cyApOworICAgIH0KKyAgICAKKyAgICBwSGRkQ3R4LT5zdGFfdG9fYWRhcHRlcltzdGFJZF0gPSBOVUxMOworCisgICAgcmV0dXJuKCB2b3NTdGF0dXMgKTsKK30KKworVk9TX1NUQVRVUyBoZGRfc29mdGFwX1JlZ2lzdGVyU1RBKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IGZBdXRoUmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCBmUHJpdmFjeUJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzdGFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCB1Y2FzdFNpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBiY2FzdFNpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfTUFDQUREUl90ICpwUGVlck1hY0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCBmV21tRW5hYmxlZCApCit7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgV0xBTl9TVEFEZXNjVHlwZSBzdGFEZXNjOyAgIAorICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IHBBZGFwdGVyLT5wSGRkQ3R4OworICAgaGRkX2FkYXB0ZXJfdCAqcG1vbkFkYXB0ZXIgPSBOVUxMOworCisgICAvL2VDc3JFbmNyeXB0aW9uVHlwZSBjb25uZWN0ZWRDaXBoZXJBbGdvOworICAgLy92X0JPT0xfdCAgZkNvbm5lY3RlZDsKKyAgIAorICAgLyoKKyAgICAqIENsZWFuIHVwIG9sZCBlbnRyeSBpZiBpdCBpcyBub3QgY2xlYW5lZCB1cCBwcm9wZXJseQorICAgKi8KKyAgIGlmICggcEFkYXB0ZXItPmFTdGFJbmZvW3N0YUlkXS5pc1VzZWQgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiY2xlYW4gdXAgb2xkIGVudHJ5IGZvciBTVEEgJWQiLCBzdGFJZCk7CisgICAgICBoZGRfc29mdGFwX0RlcmVnaXN0ZXJTVEEoIHBBZGFwdGVyLCBzdGFJZCApOworICAgfQorCisgICAvLyBHZXQgdGhlIFN0YXRpb24gSUQgZnJvbSB0aGUgb25lIHNhdmVkIGR1cmluZyB0aGUgYXNzb2NhdGlvbi4KKyAgIAorICAgc3RhRGVzYy51Y1NUQUlkID0gc3RhSWQ7CisgICAKKworICAgLypTYXZlIHRoZSBwQWRhcHRlciBQb2ludGVyIGZvciB0aGlzIHN0YUlkKi8KKyAgIHBIZGRDdHgtPnN0YV90b19hZGFwdGVyW3N0YUlkXSA9IHBBZGFwdGVyOworCisgICBzdGFEZXNjLndTVEFUeXBlID0gV0xBTl9TVEFfU09GVEFQOworCisgICB2b3NfbWVtX2NvcHkoIHN0YURlc2MudlNUQU1BQ0FkZHJlc3MuYnl0ZXMsIHBQZWVyTWFjQWRkcmVzcy0+Ynl0ZXMsc2l6ZW9mKHBQZWVyTWFjQWRkcmVzcy0+Ynl0ZXMpICk7CisgICB2b3NfbWVtX2NvcHkoIHN0YURlc2MudkJTU0lEZm9ySUJTUy5ieXRlcywgJnBBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudCw2ICk7CisgICB2b3NfY29weV9tYWNhZGRyKCAmc3RhRGVzYy52U2VsZk1BQ0FkZHJlc3MsICZwQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQgKTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAicmVnaXN0ZXIgc3RhdGlvbiBcbiIpOworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAic3RhdGlvbiBtYWMgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgICBzdGFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzWzBdLAorICAgICAgICAgICAgICBzdGFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzWzFdLAorICAgICAgICAgICAgICBzdGFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzWzJdLAorICAgICAgICAgICAgICBzdGFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzWzNdLAorICAgICAgICAgICAgICBzdGFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzWzRdLAorICAgICAgICAgICAgICBzdGFEZXNjLnZTVEFNQUNBZGRyZXNzLmJ5dGVzWzVdKTsKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIkJTU0lEZm9ySUJTUyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisgICAgICAgICAgICAgIHN0YURlc2MudkJTU0lEZm9ySUJTUy5ieXRlc1swXSwKKyAgICAgICAgICAgICAgc3RhRGVzYy52QlNTSURmb3JJQlNTLmJ5dGVzWzFdLAorICAgICAgICAgICAgICBzdGFEZXNjLnZCU1NJRGZvcklCU1MuYnl0ZXNbMl0sCisgICAgICAgICAgICAgIHN0YURlc2MudkJTU0lEZm9ySUJTUy5ieXRlc1szXSwKKyAgICAgICAgICAgICAgc3RhRGVzYy52QlNTSURmb3JJQlNTLmJ5dGVzWzRdLAorICAgICAgICAgICAgICBzdGFEZXNjLnZCU1NJRGZvcklCU1MuYnl0ZXNbNV0pOworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiU09GVEFQIFNFTEZNQUMgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgICBzdGFEZXNjLnZTZWxmTUFDQWRkcmVzcy5ieXRlc1swXSwKKyAgICAgICAgICAgICAgc3RhRGVzYy52U2VsZk1BQ0FkZHJlc3MuYnl0ZXNbMV0sCisgICAgICAgICAgICAgIHN0YURlc2MudlNlbGZNQUNBZGRyZXNzLmJ5dGVzWzJdLAorICAgICAgICAgICAgICBzdGFEZXNjLnZTZWxmTUFDQWRkcmVzcy5ieXRlc1szXSwKKyAgICAgICAgICAgICAgc3RhRGVzYy52U2VsZk1BQ0FkZHJlc3MuYnl0ZXNbNF0sCisgICAgICAgICAgICAgIHN0YURlc2MudlNlbGZNQUNBZGRyZXNzLmJ5dGVzWzVdKTsKKworICAgdm9zU3RhdHVzID0gaGRkX3NvZnRhcF9pbml0X3R4X3J4X3N0YShwQWRhcHRlciwgc3RhSWQsICZzdGFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgIHN0YURlc2MudWNRb3NFbmFibGVkID0gZldtbUVuYWJsZWQ7CisjZWxzZQorICAgLy8gc2V0IHRoZSBRb1MgZmllbGQgYXBwcm9wcmlhdGVseQorICAgaWYgKGhkZF93bW1faXNfYWN0aXZlKHBBZGFwdGVyKSkKKyAgIHsKKyAgICAgIHN0YURlc2MudWNRb3NFbmFibGVkID0gMTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN0YURlc2MudWNRb3NFbmFibGVkID0gMDsKKyAgIH0KKyNlbmRpZgorICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiSEREIFNPRlRBUCByZWdpc3RlciBUTCBRb1NfZW5hYmxlZD0lZCIsCisgICAgICAgICAgICAgIHN0YURlc2MudWNRb3NFbmFibGVkICk7CisKKyAgIHN0YURlc2MudWNQcm90ZWN0ZWRGcmFtZSA9ICh2X1U4X3QpZlByaXZhY3lCaXQgOworCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAvKiBFbmFibGUgVU1BIGZvciBUWCB0cmFuc2xhdGlvbiBvbmx5IHdoZW4gdGhlcmUgaXMgbm8gY29uY3VycmVudCBzZXNzaW9uIGFjdGl2ZSAqLworICAgaWYgKHZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkKKyAgIHsKKyAgICAgIHN0YURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gMTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN0YURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gMDsKKyAgIH0KKworICAgLy8gRW5hYmxlIGZyYW1lIHRyYW5zbGF0aW9uIGluIHNvZnR3YXJlIGZvciBBTVNEVSAKKyAgIC8vIHJlY2VwdGlvbiBPTkxZLiBUaGUgcmVtYWluaW5nIHJ4IGlzIHN0aWxsIAorICAgLy8gdHJhbnNsYXRlZCBpbiBIVy4KKyAgIHN0YURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uID0gMTsKKyNlbHNlCisgICAvLyBGb3IgUFJJTUEgVU1BIGZyYW1lIHRyYW5zbGF0aW9uIGlzIG5vdCBlbmFibGUgeWV0LgorICAgc3RhRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gPSAxOworICAgc3RhRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24gPSAxOworI2VuZGlmCisgICBzdGFEZXNjLnVjQWRkUm12TExDID0gMTsKKworICAgLy8gSW5pdGlhbGl6ZSBzaWduYXR1cmVzIGFuZCBzdGF0ZQorICAgc3RhRGVzYy51Y1VjYXN0U2lnICA9IHVjYXN0U2lnOworICAgc3RhRGVzYy51Y0JjYXN0U2lnICA9IGJjYXN0U2lnOworICAgc3RhRGVzYy51Y0luaXRTdGF0ZSA9IGZBdXRoUmVxdWlyZWQgPworICAgICAgV0xBTlRMX1NUQV9DT05ORUNURUQgOiBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQ7CisKKyAgIC8vIFJlZ2lzdGVyIHRoZSBTdGF0aW9uIHdpdGggVEwuLi4gICAgICAKKyAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfc29mdGFwX3J4X3BhY2tldF9jYmssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfc29mdGFwX3R4X2NvbXBsZXRlX2NiaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9zb2Z0YXBfdHhfZmV0Y2hfcGFja2V0X2NiaywgJnN0YURlc2MsIDAgKTsKKyAgIAorICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgIlNPRlRBUCBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQoKSBmYWlsZWQgdG8gcmVnaXN0ZXIuICBTdGF0dXM9ICVkIFsweCUwOGxYXSIsCisgICAgICAgICAgICAgICAgIHZvc1N0YXR1cywgdm9zU3RhdHVzICk7CisgICAgICByZXR1cm4gdm9zU3RhdHVzOyAgICAgIAorICAgfQorCisgICAvLyBpZiAoIFdQQSApLCB0ZWxsIFRMIHRvIGdvIHRvICdjb25uZWN0ZWQnIGFuZCBhZnRlciBrZXlzIGNvbWUgdG8gdGhlIGRyaXZlciwgCisgICAvLyB0aGVuIGdvIHRvICdhdXRoZW50aWNhdGVkJy4gIEZvciBhbGwgb3RoZXIgYXV0aGVudGljYXRpb24gdHlwZXMgKHRob3NlIHRoYXQgZG8gCisgICAvLyBub3QgcmVxdWlyZSB1cHBlciBsYXllciBhdXRoZW50aWNhdGlvbikgd2UgY2FuIHB1dCBUTCBkaXJlY3RseSBpbnRvICdhdXRoZW50aWNhdGVkJworICAgLy8gc3RhdGUuCisgICAKKyAgIC8vVk9TX0FTU0VSVCggZkNvbm5lY3RlZCApOworICAgcEFkYXB0ZXItPmFTdGFJbmZvW3N0YUlkXS51Y1NUQUlkID0gc3RhSWQ7CisgICBwQWRhcHRlci0+YVN0YUluZm9bc3RhSWRdLmlzUW9zRW5hYmxlZCA9IGZXbW1FbmFibGVkOworCisgICBpZiAoICFmQXV0aFJlcXVpcmVkICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIm9wZW4vc2hhcmVkIGF1dGggU3RhSWQ9ICVkLiAgQ2hhbmdpbmcgVEwgc3RhdGUgdG8gQVVUSEVOVElDQVRFRCBhdCBKb2luIHRpbWUiLCBwQWRhcHRlci0+YVN0YUluZm9bc3RhSWRdLnVjU1RBSWQgKTsKKyAgIAorICAgICAgLy8gQ29ubmVjdGlvbnMgdGhhdCBkbyBub3QgbmVlZCBVcHBlciBsYXllciBhdXRoLCB0cmFuc2l0aW9uIFRMIGRpcmVjdGx5CisgICAgICAvLyB0byAnQXV0aGVudGljYXRlZCcgc3RhdGUuICAgICAgCisgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfQ2hhbmdlU1RBU3RhdGUoIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnB2b3NDb250ZXh0LCBzdGFEZXNjLnVjU1RBSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgKTsKKyAgCisgICAgICBwQWRhcHRlci0+YVN0YUluZm9bc3RhSWRdLnRsU1RBU3RhdGUgPSBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQ7CisgICAgICBwQWRhcHRlci0+c2Vzc2lvbkN0eC5hcC51SXNBdXRoZW50aWNhdGVkID0gVk9TX1RSVUU7CisgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGVsc2UKKyAgIHsKKworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiVUxBIGF1dGggU3RhSWQ9ICVkLiAgQ2hhbmdpbmcgVEwgc3RhdGUgdG8gQ09OTkVDVEVEIGF0IEpvaW4gdGltZSIsIHBBZGFwdGVyLT5hU3RhSW5mb1tzdGFJZF0udWNTVEFJZCApOworICAgCisgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfQ2hhbmdlU1RBU3RhdGUoIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnB2b3NDb250ZXh0LCBzdGFEZXNjLnVjU1RBSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfU1RBX0NPTk5FQ1RFRCApOworICAgICAgcEFkYXB0ZXItPmFTdGFJbmZvW3N0YUlkXS50bFNUQVN0YXRlID0gV0xBTlRMX1NUQV9DT05ORUNURUQ7CisKKyAgICAgIHBBZGFwdGVyLT5zZXNzaW9uQ3R4LmFwLnVJc0F1dGhlbnRpY2F0ZWQgPSBWT1NfRkFMU0U7CisKKyAgIH0gICAgICAKKyAgIHBtb25BZGFwdGVyPSBoZGRfZ2V0X21vbl9hZGFwdGVyKCBwQWRhcHRlci0+cEhkZEN0eCk7CisgICBpZihwbW9uQWRhcHRlcikgCisgICB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJUdXJuIG9uIE1vbml0b3IgdGhlIGNhcnJpZXJcbiIpOworICAgICAgIG5ldGlmX2NhcnJpZXJfb24ocG1vbkFkYXB0ZXItPmRldik7CisgICAgICAgICAgIC8vRW5hYmxlIFR4IHF1ZXVlCisgICAgICAgbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhwbW9uQWRhcHRlci0+ZGV2KTsKKyAgICB9CisgICBuZXRpZl9jYXJyaWVyX29uKHBBZGFwdGVyLT5kZXYpOworICAgLy9FbmFibGUgVHggcXVldWUKKyAgIG5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMocEFkYXB0ZXItPmRldik7CisKKyAgIHJldHVybiggdm9zU3RhdHVzICk7Cit9CisKK1ZPU19TVEFUVVMgaGRkX3NvZnRhcF9SZWdpc3Rlcl9CQ19TVEEoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB2X0JPT0xfdCBmUHJpdmFjeUJpdCkKK3sKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisgICB2X01BQ0FERFJfdCBicm9hZGNhc3RNYWNBZGRyID0gVk9TX01BQ19BRERSX0JST0FEQ0FTVF9JTklUSUFMSVpFUjsKKyAgIAorICAgCisgICBwSGRkQ3R4LT5zdGFfdG9fYWRhcHRlcltXTEFOX1JYX0JDTUNfU1RBX0lEXSA9IHBBZGFwdGVyOworICAgcEhkZEN0eC0+c3RhX3RvX2FkYXB0ZXJbV0xBTl9SWF9TQVBfU0VMRl9TVEFfSURdID0gcEFkYXB0ZXI7CisgICB2b3NTdGF0dXMgPSBoZGRfc29mdGFwX1JlZ2lzdGVyU1RBKCBwQWRhcHRlciwgVk9TX0ZBTFNFLCBmUHJpdmFjeUJpdCwgKFdMQU5fSEREX0dFVF9BUF9DVFhfUFRSKHBBZGFwdGVyKSktPnVCQ1N0YUlkLCAwLCAxLCAmYnJvYWRjYXN0TWFjQWRkciwwKTsKKworICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworVk9TX1NUQVRVUyBoZGRfc29mdGFwX0RlcmVnaXN0ZXJfQkNfU1RBKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKyAgIHJldHVybiBoZGRfc29mdGFwX0RlcmVnaXN0ZXJTVEEoIHBBZGFwdGVyLCAoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEFkYXB0ZXIpKS0+dUJDU3RhSWQpOworfQorCitWT1NfU1RBVFVTIGhkZF9zb2Z0YXBfc3RvcF9ic3MoIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgdl9VOF90IHN0YUlkID0gMDsKKworICAgIHZvc1N0YXR1cyA9IGhkZF9zb2Z0YXBfRGVyZWdpc3Rlcl9CQ19TVEEoIHBBZGFwdGVyKTsKKworICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGRlcmVnaXN0ZXIgQkMgc3RhIElkICVkIiwgX19GVU5DVElPTl9fLCAoV0xBTl9IRERfR0VUX0FQX0NUWF9QVFIocEFkYXB0ZXIpKS0+dUJDU3RhSWQpOworICAgIH0KKworICAgIGZvciAoc3RhSWQgPSAwOyBzdGFJZCA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgc3RhSWQrKykKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+YVN0YUluZm9bc3RhSWRdLmlzVXNlZCkvLyBUaGlzIGV4Y2x1ZGVzIEJDIHN0YSBhcyBpdCBpcyBhbHJlYWR5IGRlcmVnaXN0ZXJlZAorICAgICAgICAgICAgdm9zU3RhdHVzID0gaGRkX3NvZnRhcF9EZXJlZ2lzdGVyU1RBKCBwQWRhcHRlciwgc3RhSWQpOworCisgICAgICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGRlcmVnaXN0ZXIgc3RhIElkICVkIiwgX19GVU5DVElPTl9fLCBzdGFJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdm9zU3RhdHVzOworfQorCitWT1NfU1RBVFVTIGhkZF9zb2Z0YXBfY2hhbmdlX1NUQV9zdGF0ZSggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHZfTUFDQUREUl90ICpwRGVzdE1hY0FkZHJlc3MsIFdMQU5UTF9TVEFTdGF0ZVR5cGUgc3RhdGUpCit7CisgICAgdl9VOF90IHVjU1RBSWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgIHRIYWxIYW5kbGUgaEhhbEhhbmRsZSA9ICh0SGFsSGFuZGxlICkgdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfSEFMLCBwVm9zQ29udGV4dCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiJXM6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICBpZighaEhhbEhhbmRsZSApCisgICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgIiVzOiBUaGUgaEhhbEhhbmRsZSBpcyAgTlVMTCBwdHIgdmFsdWUiKTsKKyAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9ICAgIAorCisgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gaGFsVGFibGVfRmluZFN0YWlkQnlBZGRyKGhIYWxIYW5kbGUsICh0QU5JX1U4ICopcERlc3RNYWNBZGRyZXNzLCAmdWNTVEFJZCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGZpbmQgcmlnaHQgc3RhdGlvbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisjZWxzZQorICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IGhkZF9zb2Z0YXBfR2V0U3RhSWQocEFkYXB0ZXIsIHBEZXN0TWFjQWRkcmVzcywgJnVjU1RBSWQpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gZmluZCByaWdodCBzdGF0aW9uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKworICAgIGlmIChGQUxTRSA9PSB2b3NfaXNfbWFjYWRkcl9lcXVhbCgmcEFkYXB0ZXItPmFTdGFJbmZvW3VjU1RBSWRdLm1hY0FkZHJTVEEsIHBEZXN0TWFjQWRkcmVzcykpCisgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBTdGF0aW9uIE1BQyBhZGRyZXNzIGRvZXMgbm90IG1hdGNoaW5nIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfQ2hhbmdlU1RBU3RhdGUoIHBWb3NDb250ZXh0LCB1Y1NUQUlkLCBzdGF0ZSApOworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiJXM6IGNoYW5nZSBzdGF0aW9uIHRvIHN0YXRlICVkIHN1Y2NlZWQiLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKKworICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cykKKyAgICB7CisgICAgICAgcEFkYXB0ZXItPmFTdGFJbmZvW3VjU1RBSWRdLnRsU1RBU3RhdGUgPSBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQ7CisgICAgfQorCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGV4aXRcbiIsX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiB2b3NTdGF0dXM7Cit9CisKKworVk9TX1NUQVRVUyBoZGRfc29mdGFwX0dldFN0YUlkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB2X01BQ0FERFJfdCAqcE1hY0FkZHJlc3MsIHZfVThfdCAqc3RhSWQpCit7CisgICAgdl9VOF90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAodm9zX21lbV9jb21wYXJlKCZwQWRhcHRlci0+YVN0YUluZm9baV0ubWFjQWRkclNUQSwgcE1hY0FkZHJlc3MsIHNpemVvZih2X01BQ0FERFJfdCkpICYmCisgICAgICAgICAgICBwQWRhcHRlci0+YVN0YUluZm9baV0uaXNVc2VkKQorICAgICAgICB7CisgICAgICAgICAgICAqc3RhSWQgPSBpOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKK30KKworI2VuZGlmIC8vV0xBTl9TT0ZUQVBfRkVBVFVSRQpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvc3JjL3dsYW5faGRkX3R4X3J4LmMgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfdHhfcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDhkZjlkCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX3R4X3J4LmMKQEAgLTAsMCArMSwxMzUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgd2xhbl9oZGRfdHhfcnguYworICAKKyAgXGJyaWVmIExpbnV4IEhERCBUeC9SWCBBUElzCisgICAgICAgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4KKyAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBJbmNsdWRlIGZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyNpbmNsdWRlIDx3bGFuX2hkZF90eF9yeC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3NvZnRhcF90eF9yeC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2RwX3V0aWxzLmg+CisjaW5jbHVkZSA8d2xhbl9xY3RfdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisjaW5jbHVkZSA8d2xhbl9oZGRfcDJwLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CisjaW5jbHVkZSAic2FwQXBpLmgiCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworY29uc3Qgdl9VOF90IGhkZFdtbUFjVG9IaWdoZXN0VXBbXSA9IHsKKyAgIFNNRV9RT1NfV01NX1VQX1JFU1YsCisgICBTTUVfUU9TX1dNTV9VUF9FRSwKKyAgIFNNRV9RT1NfV01NX1VQX1ZJLAorICAgU01FX1FPU19XTU1fVVBfTkMKK307CisKKy8vTWFwcGluZyBMaW51eCBBQyBpbnRlcnByZXRhdGlvbiB0byBUTCBBQy4KK2NvbnN0IHZfVThfdCBoZGRfUWRpc2NBY1RvVGxBQ1tdID0geworICAgV0xBTlRMX0FDX1ZPLAorICAgV0xBTlRMX0FDX1ZJLAorICAgV0xBTlRMX0FDX0JFLAorICAgV0xBTlRMX0FDX0JLLAorfTsKKworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorc3RhdGljIHN0cnVjdCBza19idWZmKiBoZGRfbW9uX3R4X2ZldGNoX3BrdChoZGRfYWRhcHRlcl90KiBwQWRhcHRlcik7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRnVuY3Rpb24gZGVmaW5pdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisKKyNpZmRlZiBEQVRBX1BBVEhfVU5JVF9URVNUCisvL1V0aWxpdHkgZnVuY3Rpb24gdG8gZHVtcCBhbiBza19idWZmCitzdGF0aWMgdm9pZCBkdW1wX3NrX2J1ZmYoc3RydWN0IHNrX2J1ZmYgKiBza2IpCit7CisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IGhlYWQgPSAlcCAiLCBfX0ZVTkNUSU9OX18sIHNrYi0+aGVhZCk7CisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IGRhdGEgPSAlcCAiLCBfX0ZVTkNUSU9OX18sIHNrYi0+ZGF0YSk7CisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IHRhaWwgPSAlcCAiLCBfX0ZVTkNUSU9OX18sIHNrYi0+dGFpbCk7CisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IGVuZCA9ICVwICIsIF9fRlVOQ1RJT05fXywgc2tiLT5lbmQpOworICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBsZW4gPSAlZCAiLCBfX0ZVTkNUSU9OX18sIHNrYi0+bGVuKTsKKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogZGF0YV9sZW4gPSAlZCAiLCBfX0ZVTkNUSU9OX18sIHNrYi0+ZGF0YV9sZW4pOworICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBtYWNfbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc2tiLT5tYWNfbGVuKTsKKworICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIjB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAiLCAKKyAgICAgc2tiLT5kYXRhWzBdLCBza2ItPmRhdGFbMV0sIHNrYi0+ZGF0YVsyXSwgc2tiLT5kYXRhWzNdLCBza2ItPmRhdGFbNF0sIAorICAgICBza2ItPmRhdGFbNV0sIHNrYi0+ZGF0YVs2XSwgc2tiLT5kYXRhWzddKTsgCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IFxuIiwgCisgICAgIHNrYi0+ZGF0YVs4XSwgc2tiLT5kYXRhWzldLCBza2ItPmRhdGFbMTBdLCBza2ItPmRhdGFbMTFdLCBza2ItPmRhdGFbMTJdLAorICAgICBza2ItPmRhdGFbMTNdLCBza2ItPmRhdGFbMTRdLCBza2ItPmRhdGFbMTVdKTsgCit9CisKKy8vRnVuY3Rpb24gZm9yIFVuaXQgVGVzdCBvbmx5CitzdGF0aWMgdm9pZCB0cmFuc3BvcnRfdGhyZWFkKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyKQoreworICAgdl9VOF90IHN0YUlkOworICAgV0xBTlRMX0FDRW51bVR5cGUgYWMgPSBXTEFOVExfQUNfQkU7CisgICB2b3NfcGt0X3QgKnBWb3NQYWNrZXQgPSBOVUxMIDsKKyAgIHZvc19wa3RfdCBkdW1teVBhY2tldDsKKyAgIFdMQU5UTF9NZXRhSW5mb1R5cGUgcGt0TWV0YUluZm87CisgICBXTEFOVExfUnhNZXRhSW5mb1R5cGUgcGt0UnhNZXRhSW5mbzsKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisKKyAgIHN0YXR1cyA9IGhkZF90eF9mZXRjaF9wYWNrZXRfY2JrKCBwQWRhcHRlci0+cHZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZvc1BhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGt0TWV0YUluZm8gKTsKKyAgaWYgKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MgJiYgc3RhdHVzICE9IFZPU19TVEFUVVNfRV9FTVBUWSkKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogVGVzdCBGQUlMIGhkZF90eF9mZXRjaF9wYWNrZXRfY2JrIiwgX19GVU5DVElPTl9fKTsKKyAgZWxzZQorICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBUZXN0IFBBU1MgaGRkX3R4X2ZldGNoX3BhY2tldF9jYmsiLCBfX0ZVTkNUSU9OX18pOworCisgIHN0YXR1cyA9IGhkZF90eF9jb21wbGV0ZV9jYmsocEFkYXB0ZXItPnB2b3NDb250ZXh0LCAmZHVtbXlQYWNrZXQsIFZPU19TVEFUVVNfU1VDQ0VTUyk7OyAKKyAgaWYgKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IFRlc3QgRkFJTCBoZGRfdHhfY29tcGxldGVfY2JrIiwgX19GVU5DVElPTl9fKTsKKyAgZWxzZQorICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBUZXN0IFBBU1MgaGRkX3R4X2NvbXBsZXRlX2NiayIsIF9fRlVOQ1RJT05fXyk7CisKKyAgc3RhdHVzID0gaGRkX3R4X2xvd19yZXNvdXJjZV9jYmsocFZvc1BhY2tldCwgcEFkYXB0ZXIpOworICBpZiAoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogVGVzdCBGQUlMIGhkZF90eF9sb3dfcmVzb3VyY2VfY2JrIiwgX19GVU5DVElPTl9fKTsKKyAgZWxzZQorICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBUZXN0IFBBU1MgaGRkX3R4X2xvd19yZXNvdXJjZV9jYmsiLCBfX0ZVTkNUSU9OX18pOworICAKKyAgc3RhdHVzID0gaGRkX3J4X3BhY2tldF9jYmsoIHBBZGFwdGVyLT5wdm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teVBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBrdFJ4TWV0YUluZm8pOworICBpZiAoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogVGVzdCBGQUlMIGhkZF9yeF9wYWNrZXRfY2JrIiwgX19GVU5DVElPTl9fKTsKKyAgZWxzZQorICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBUZXN0IFBBU1MgaGRkX3J4X3BhY2tldF9jYmsiLCBfX0ZVTkNUSU9OX18pOworCit9CisjZW5kaWYKKworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfZmx1c2hfdHhfcXVldWVzKCkgLSBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZsdXNoIHRoZSBUWCBxdWV1ZXMKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCAKKyAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIFZPU19TVEFUVVMgaGRkX2ZsdXNoX3R4X3F1ZXVlcyggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB2X1NJTlRfdCBpID0gLTE7CisgICBoZGRfbGlzdF9ub2RlX3QgKmFuY2hvciA9IE5VTEw7CisgICBza2JfbGlzdF9ub2RlX3QgKnBrdE5vZGUgPSBOVUxMOworICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisKKyAgIHdoaWxlICgrK2kgIT0gTlVNX1RYX1FVRVVFUykgCisgICB7CisgICAgICAvL0ZyZWUgdXAgYW55IHBhY2tldHMgaW4gdGhlIFR4IHF1ZXVlCisgICAgICBzcGluX2xvY2tfYmgoJnBBZGFwdGVyLT53bW1fdHhfcXVldWVbaV0ubG9jayk7CisgICAgICB3aGlsZSAodHJ1ZSkgCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBoZGRfbGlzdF9yZW1vdmVfZnJvbnQoICZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2ldLCAmYW5jaG9yICk7CisgICAgICAgICBpZihWT1NfU1RBVFVTX0VfRU1QVFkgIT0gc3RhdHVzKQorICAgICAgICAgeworICAgICAgICAgICAgcGt0Tm9kZSA9IGxpc3RfZW50cnkoYW5jaG9yLCBza2JfbGlzdF9ub2RlX3QsIGFuY2hvcik7CisgICAgICAgICAgICBza2IgPSBwa3ROb2RlLT5za2I7CisgICAgICAgICAgICAvL1RPRE8KKyAgICAgICAgICAgIC8vKytwQWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZDsgCisgICAgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4Rmx1c2hlZDsKKyAgICAgICAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhGbHVzaGVkQUNbaV07CisgICAgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBzcGluX3VubG9ja19iaCgmcEFkYXB0ZXItPndtbV90eF9xdWV1ZVtpXS5sb2NrKTsKKyAgICAgIC8vIGJhY2twcmVzc3VyZSBpcyBubyBsb25nZXIgaW4gZWZmZWN0CisgICAgICBwQWRhcHRlci0+aXNUeFN1c3BlbmRlZFtpXSA9IFZPU19GQUxTRTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorc3RhdGljIHN0cnVjdCBza19idWZmKiBoZGRfbW9uX3R4X2ZldGNoX3BrdChoZGRfYWRhcHRlcl90KiBwQWRhcHRlcikKK3sKKyAgIHNrYl9saXN0X25vZGVfdCAqcGt0Tm9kZSA9IE5VTEw7CisgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKyAgIHZfU0laRV90IHNpemUgPSAwOworICAgV0xBTlRMX0FDRW51bVR5cGUgYWMgPSAwOworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIGhkZF9saXN0X25vZGVfdCAqYW5jaG9yID0gTlVMTDsKKworICAgaWYoIE5VTEwgPT0gcEFkYXB0ZXIgKQorICAgeworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICAvLyBkbyB3ZSBoYXZlIGFueSBwYWNrZXRzIHBlbmRpbmcgaW4gdGhpcyBBQz8KKyAgIGhkZF9saXN0X3NpemUoICZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXSwgJnNpemUgKTsgCisgICBpZiggc2l6ZSA9PSAwICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBOTyBQYWNrZXQgUGVuZGluZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgLy9SZW1vdmUgdGhlIHBhY2tldCBmcm9tIHRoZSBxdWV1ZQorICAgc3Bpbl9sb2NrX2JoKCZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKyAgIHN0YXR1cyA9IGhkZF9saXN0X3JlbW92ZV9mcm9udCggJnBBZGFwdGVyLT53bW1fdHhfcXVldWVbYWNdLCAmYW5jaG9yICk7CisgICBzcGluX3VubG9ja19iaCgmcEFkYXB0ZXItPndtbV90eF9xdWV1ZVthY10ubG9jayk7CisKKyAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpCisgICB7CisgICAgICAvL0lmIHN1Y2Nlc3MgdGhlbiB3ZSBnb3QgYSB2YWxpZCBwYWNrZXQgZnJvbSBzb21lIEFDCisgICAgICBwa3ROb2RlID0gbGlzdF9lbnRyeShhbmNob3IsIHNrYl9saXN0X25vZGVfdCwgYW5jaG9yKTsKKyAgICAgIHNrYiA9IHBrdE5vZGUtPnNrYjsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IE5vdCBhYmxlIHRvIHJlbW92ZSBQYWNrZXQgZnJvbSB0aGUgbGlzdCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgLy8gaWYgd2UgYXJlIGluIGEgYmFja3ByZXNzdXJlIHNpdHVhdGlvbiBzZWUgaWYgd2UgY2FuIHR1cm4gdGhlIGhvc2UgYmFjayBvbgorICAgaWYgKCAocEFkYXB0ZXItPmlzVHhTdXNwZW5kZWRbYWNdKSAmJgorICAgICAgICAoc2l6ZSA8PSBIRERfVFhfUVVFVUVfTE9XX1dBVEVSX01BUkspICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IFRYIHF1ZXVlWyVkXSByZS1lbmFibGVkIiwgX19GVU5DVElPTl9fLCBhYyk7CisgICAgICBwQWRhcHRlci0+aXNUeFN1c3BlbmRlZFthY10gPSBWT1NfRkFMU0U7ICAgICAgCisgICAgICAvKiBFbmFibGUgUXVldWVzIHdoaWNoIHdlIGhhdmUgZGlzYWJsZWQgZWFybGllciAqLworICAgICAgbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyggcEFkYXB0ZXItPmRldiApOyAKKyAgIH0KKworICAgcmV0dXJuIHNrYjsKK30KKwordm9pZCBoZGRfbW9uX3R4X21nbXRfcGt0KGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyKQoreworICAgaGRkX2NmZzgwMjExX3N0YXRlX3QgKmNmZ1N0YXRlOworICAgc3RydWN0IHNrX2J1ZmYqIHNrYjsKKyAgIGhkZF9hZGFwdGVyX3QqIHBNb25BZGFwdGVyID0gTlVMTDsKKyAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisKKyAgIGlmIChwQWRhcHRlciA9PSBOVUxMICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAiJXM6IHBBZGFwdGVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBNb25BZGFwdGVyID0gaGRkX2dldF9hZGFwdGVyKCBwQWRhcHRlci0+cEhkZEN0eCwgV0xBTl9IRERfTU9OSVRPUiApOworCisgICBjZmdTdGF0ZSA9IFdMQU5fSEREX0dFVF9DRkdfU1RBVEVfUFRSKCBwQWRhcHRlciApOworCisgICBpZiggTlVMTCAhPSBjZmdTdGF0ZS0+YnVmICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiJXM6IEFscmVhZHkgb25lIE1HTVQgcGFja2V0IFR4IGdvaW5nIG9uIiwgX19mdW5jX18pOworICAgICAgcmV0dXJuOworICAgfQorCisgICBza2IgPSBoZGRfbW9uX3R4X2ZldGNoX3BrdChwTW9uQWRhcHRlcik7CisKKyAgIGlmIChOVUxMID09IHNrYikKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAiJXM6IE5vIFBhY2tldCBQZW5kaW5nIiwgX19mdW5jX18pOworICAgICAgcmV0dXJuOworICAgfQorCisgICBjZmdTdGF0ZS0+YnVmID0gdm9zX21lbV9tYWxsb2MoIHNrYi0+bGVuICk7IC8vYnVmOworICAgaWYoIGNmZ1N0YXRlLT5idWYgPT0gTlVMTCApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gQWxsb2NhdGUgbWVtb3J5IiwgX19mdW5jX18pOworICAgICAgZ290byBmYWlsOworICAgfQorCisgICBjZmdTdGF0ZS0+bGVuID0gc2tiLT5sZW47CisKKyAgIHZvc19tZW1fY29weSggY2ZnU3RhdGUtPmJ1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKyAgIGNmZ1N0YXRlLT5za2IgPSBza2I7IC8vYnVmOworICAgY2ZnU3RhdGUtPmFjdGlvbl9jb29raWUgPSAodEFOSV9VMzIpY2ZnU3RhdGUtPmJ1ZjsKKworICAgaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworICAgaWYoIChoZHItPmZyYW1lX2NvbnRyb2wgJiBIRERfRlJBTUVfVFlQRV9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gSEREX0ZSQU1FX1RZUEVfTUdNVCApCisgICB7CisgICAgICAgaWYoIChoZHItPmZyYW1lX2NvbnRyb2wgJiBIRERfRlJBTUVfU1VCVFlQRV9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gSEREX0ZSQU1FX1NVQlRZUEVfREVBVVRIICkKKyAgICAgICB7CisgICAgICAgICAgaGRkX3NvZnRhcF9zdGFfZGVhdXRoKCBwQWRhcHRlciwgaGRyLT5hZGRyMSApOyAKKyAgICAgICAgICBnb3RvIG1nbXRfaGFuZGxlZDsKKyAgICAgICB9CisgICAgICAgZWxzZSBpZiggKGhkci0+ZnJhbWVfY29udHJvbCAmIEhERF9GUkFNRV9TVUJUWVBFX01BU0spIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBIRERfRlJBTUVfU1VCVFlQRV9ESVNBU1NPQyApCisgICAgICAgeworICAgICAgICAgIGhkZF9zb2Z0YXBfc3RhX2Rpc2Fzc29jKCBwQWRhcHRlciwgaGRyLT5hZGRyMSApOyAKKyAgICAgICAgICBnb3RvIG1nbXRfaGFuZGxlZDsKKyAgICAgICB9CisgICB9CisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICIlczogU2VuZGluZyBhY3Rpb24gZnJhbWUgdG8gU0FQIHRvIFRYLCBMZW4gJWQiLCBfX2Z1bmNfXywgc2tiLT5sZW4pOworCisgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSAKKyAgICAgIFdMQU5TQVBfU2VuZEFjdGlvbiggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgIiVzOiBXTEFOU0FQX1NlbmRBY3Rpb24gcmV0dXJuZWQgZmFpbCIsIF9fZnVuY19fKTsKKyAgICAgIGhkZF9zZW5kQWN0aW9uQ25mKCBwQWRhcHRlciwgRkFMU0UgKTsKKyAgIH0KKyAgIHJldHVybjsKKworbWdtdF9oYW5kbGVkOgorICAgaGRkX3NlbmRBY3Rpb25DbmYoIHBBZGFwdGVyLCBUUlVFICk7CisgICByZXR1cm47CitmYWlsOgorICAga2ZyZWVfc2tiKHBBZGFwdGVyLT5za2JfdG9fdHgpOworICAgcEFkYXB0ZXItPnNrYl90b190eCA9IE5VTEw7CisgICByZXR1cm47Cit9CisKK3ZvaWQgaGRkX21vbl90eF93b3JrX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKyAgIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyID0gY29udGFpbmVyX29mKHdvcmssIGhkZF9hZGFwdGVyX3QsIG1vblR4V29ya1F1ZXVlKTsKKyAgIGhkZF9tb25fdHhfbWdtdF9wa3QocEFkYXB0ZXIpOworfQorCitpbnQgaGRkX21vbl9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgIHZfVTE2X3QgcnRfaGRyX2xlbjsKKyAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisgICBoZGRfYWRhcHRlcl90ICpwUGdCa0FkYXB0ZXIsICpwQWRhcHRlciA9ICBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgIHN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyICpydGFwX2hkciA9CisgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgKilza2ItPmRhdGE7CisKKyAgIC8qU3VwcGxpY2FudCBzZW5kcyB0aGUgRUFQT0wgcGFja2V0IG9uIG1vbml0b3IgaW50ZXJmYWNlKi8KKyAgIHBQZ0JrQWRhcHRlciA9IHBBZGFwdGVyLT5zZXNzaW9uQ3R4Lm1vbml0b3IucEFkYXB0ZXJGb3JUeDsgICAgCisgICBpZihwUGdCa0FkYXB0ZXIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgIiVzOiBObyBBZGFwdGVyIHRvIHBpZ2d5IGJhY2suIERyb3BwaW5nIHRoZSBwa3Qgb24gbW9uaXRvciBpbmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICBnb3RvIGZhaWw7IC8qIHRvbyBzaG9ydCB0byBiZSBwb3NzaWJseSB2YWxpZCAqLworICAgfQorIAorICAgLyogY2hlY2sgaWYgdG9hbCBza2IgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhlbiByYWRpbyB0YWIgaGVhZGVyIGxlbmd0aCBvZiBub3QgKi8KKyAgIGlmICh1bmxpa2VseShza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlcikpKQorICAgICAgZ290byBmYWlsOyAvKiB0b28gc2hvcnQgdG8gYmUgcG9zc2libHkgdmFsaWQgKi8KKyAgIAorICAgLyogY2hlY2sgaWYgcmFkaW8gdGFwIGhlYWRlciB2ZXJzaW9uIGlzIGNvcnJlY3Qgb3Igbm90ICovCisgICBpZiAodW5saWtlbHkocnRhcF9oZHItPml0X3ZlcnNpb24pKQorICAgICAgZ290byBmYWlsOyAvKiBvbmx5IHZlcnNpb24gMCBpcyBzdXBwb3J0ZWQgKi8KKyAKKyAgIC8qU3RyaXAgb2ZmIHRoZSByYWRpbyB0YXAgaGVhZGVyKi8KKyAgIHJ0X2hkcl9sZW4gPSBpZWVlODAyMTFfZ2V0X3JhZGlvdGFwX2xlbihza2ItPmRhdGEpOworIAorICAgLyogY2hlY2sgaWYgc2tiIGxlbmd0aCBpZiBncmVhdG9yIHRoZW4gdG90YWwgcmFkaW8gdGFwIGhlYWRlciBsZW5ndGggb3Qgbm90Ki8KKyAgIGlmICh1bmxpa2VseShza2ItPmxlbiA8IHJ0X2hkcl9sZW4pKQorICAgICAgZ290byBmYWlsOworIAorICAgLyogVXBkYXRlIHRoZSB0cmFuc19zdGFydCBmb3IgdGhpcyBuZXRkZXYgKi8gIAorICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAvKgorICAgICogZml4IHVwIHRoZSBwb2ludGVycyBhY2NvdW50aW5nIGZvciB0aGUgcmFkaW90YXAKKyAgICAqIGhlYWRlciBzdGlsbCBiZWluZyBpbiB0aGVyZS4KKyAgICAqLworICAgc2tiX3NldF9tYWNfaGVhZGVyKHNrYiwgcnRfaGRyX2xlbik7CisgICBza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgcnRfaGRyX2xlbik7CisgICBza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBydF9oZHJfbGVuKTsgCisKKyAgIC8qIFB1bGwgcnRhcCBoZWFkZXIgb3V0IG9mIHRoZSBza2IgKi8KKyAgIHNrYl9wdWxsKHNrYiwgcnRfaGRyX2xlbik7CisgIAorICAgLypTdXBwbGljYW50IGFkZHM6IHJhZGlvdGFwIEhkciArIHJhZGlvdGFwIGRhdGEgKyA4MDIxMSBIZWFkZXIuIFNvIGFmdGVyIAorICAgICogcmFkaW8gdGFwIGhlYWRlciBhbmQgODAyLjExIGhlYWRlciBzdGFydHMgCisgICAgKi8KKyAgIGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKyAKKyAgIC8qIFNlbmQgZGF0YSBmcmFtZXMgdGhyb3VnaCB0aGUgbm9ybWFsIERhdGEgcGF0aC4gSW4gdGhpcyBwYXRoIHdlIHdpbGwgCisgICAgKiBjb252ZXIgcmN2ZCA4MDIuMTEgcGFja2V0IHRvIDgwMi4zIHBhY2tldCAqLworICAgaWYgKCAoaGRyLT5mcmFtZV9jb250cm9sICYgSEREX0ZSQU1FX1RZUEVfTUFTSykgID09IEhERF9GUkFNRV9UWVBFX0RBVEEpCisgICB7IAorICAgICAgdl9VOF90IGRhWzZdOworICAgICAgdl9VOF90IHNhWzZdOworCisgICAgICBtZW1jcHkgKGRhLCBoZHItPmFkZHIxLCBWT1NfTUFDX0FERFJfU0laRSk7CisgICAgICBtZW1jcHkgKHNhLCBoZHItPmFkZHIyLCBWT1NfTUFDX0FERFJfU0laRSk7CisgCisgICAgICAvKiBQdWxsIDgwMi4xMSBNQUMgaGVhZGVyICovIAorICAgICAgc2tiX3B1bGwoc2tiLCBIRERfODAyMTFfSEVBREVSX0xFTik7CisgCisgICAgICBpZiAoIEhERF9GUkFNRV9TVUJUWVBFX1FPU0RBVEEgPT0gCisgICAgICAgICAgKGhkci0+ZnJhbWVfY29udHJvbCAmIEhERF9GUkFNRV9TVUJUWVBFX01BU0spKQorICAgICAgeworICAgICAgICAgc2tiX3B1bGwoc2tiLCBIRERfODAyMTFfSEVBREVSX1FPU19DVEwpOworICAgICAgfQorCisgICAgICAvKiBQdWxsIExMQyBoZWFkZXIgKi8gCisgICAgICBza2JfcHVsbChza2IsIEhERF9MTENfSERSX0xFTik7CisKKyAgICAgIC8qIENyZWF0ZSBzcGFjZSBmb3IgRXRoZXJuZXQgaGVhZGVyICovIAorICAgICAgc2tiX3B1c2goc2tiLCBIRERfTUFDX0hEUl9TSVpFKjIpOworICAgICAgbWVtY3B5KCZza2ItPmRhdGFbMF0sIGRhLCBIRERfTUFDX0hEUl9TSVpFKTsKKyAgICAgIG1lbWNweSgmc2tiLT5kYXRhW0hERF9ERVNUX0FERFJfT0ZGU0VUXSwgc2EsIEhERF9NQUNfSERSX1NJWkUpOworCisgICAgICAvKiBPbmx5IEVBUE9MIERhdGEgcGFja2V0cyBhcmUgYWxsb3dlZCB0aHJvdWdoIG1vbml0b3IgaW50ZXJmYWNlICovIAorICAgICAgaWYgKHZvc19iZTE2X3RvX2NwdSgKKyAgICAgICAgICgqKHVuc2lnbmVkIHNob3J0Kikmc2tiLT5kYXRhW0hERF9FVEhFUlRZUEVfODAyXzFfWF9GUkFNRV9PRkZTRVRdKSApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBIRERfRVRIRVJUWVBFXzgwMl8xX1gpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICIlczogTm90IGEgRWFwb2wgcGFja2V0LiBEcm9wIHRoaXMgZnJhbWUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAvL0lmIG5vdCBFQVBPTCBmcmFtZXMsIGRyb3AgdGhlbS4KKyAgICAgICAgIGtmcmVlX3NrYihza2IpOworICAgICAgICAgcmV0dXJuIE5FVERFVl9UWF9PSzsKKyAgICAgIH0KKworICAgICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKEhERF9FVEhFUlRZUEVfODAyXzFfWCk7CisgCisgICAgICBoZGRfaG9zdGFwZF9zZWxlY3RfcXVldWUocFBnQmtBZGFwdGVyLT5kZXYsIHNrYik7CisgICAgICByZXR1cm4gaGRkX3NvZnRhcF9oYXJkX3N0YXJ0X3htaXQoIHNrYiwgcFBnQmtBZGFwdGVyLT5kZXYgKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgICAgV0xBTlRMX0FDRW51bVR5cGUgYWMgPSAwOworICAgICAgc2tiX2xpc3Rfbm9kZV90ICpwa3ROb2RlID0gTlVMTDsKKyAgICAgIHZfU0laRV90IHBrdExpc3RTaXplID0gMDsKKworICAgICAgc3Bpbl9sb2NrKCZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKyAgICAgIC8vSWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWNoZWQgdGhlIG1heCBxdWV1ZSBzaXplLCBkaXNhYmxlIHRoZSBUWCBxdWV1ZQorICAgICAgaWYgKCBwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXS5jb3VudCA9PSBwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXS5tYXhfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgIC8qIFdlIHdhbnQgdG8gcHJvY2VzcyBvbmUgcGFja2V0IGF0IGEgdGltZSwgc28gbGV0cyBkaXNhYmxlIGFsbCBUWCBxdWV1ZXMKKyAgICAgICAgICAgKiBhbmQgcmUtZW5hYmxlIHRoZSBxdWV1ZXMgb25jZSB3ZSBnZXQgVFggZmVlZGJhY2sgZm9yIHRoaXMgcGFja2V0ICovCisgICAgICAgICBuZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocEFkYXB0ZXItPmRldik7CisgICAgICAgICBwQWRhcHRlci0+aXNUeFN1c3BlbmRlZFthY10gPSBWT1NfVFJVRTsKKyAgICAgICAgIHNwaW5fdW5sb2NrKCZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsgICAgICAKKyAgICAgICAgIHJldHVybiBORVRERVZfVFhfQlVTWTsgICAKKyAgICAgIH0KKyAgICAgIHNwaW5fdW5sb2NrKCZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsgICAgICAKKworICAgICAgLy9Vc2UgdGhlIHNrYi0+Y2IgZmllbGQgdG8gaG9sZCB0aGUgbGlzdCBub2RlIGluZm9ybWF0aW9uCisgICAgICBwa3ROb2RlID0gKHNrYl9saXN0X25vZGVfdCAqKSZza2ItPmNiOworCisgICAgICAvL1N0aWNrIHRoZSBPUyBwYWNrZXQgaW5zaWRlIHRoaXMgbm9kZS4KKyAgICAgIHBrdE5vZGUtPnNrYiA9IHNrYjsKKworICAgICAgSU5JVF9MSVNUX0hFQUQoJnBrdE5vZGUtPmFuY2hvcik7CisKKyAgICAgIC8vSW5zZXJ0IHRoZSBPUyBwYWNrZXQgaW50byB0aGUgYXBwcm9wcmlhdGUgQUMgcXVldWUKKyAgICAgIHNwaW5fbG9jaygmcEFkYXB0ZXItPndtbV90eF9xdWV1ZVthY10ubG9jayk7CisgICAgICBzdGF0dXMgPSBoZGRfbGlzdF9pbnNlcnRfYmFja19zaXplKCAmcEFkYXB0ZXItPndtbV90eF9xdWV1ZVthY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGt0Tm9kZS0+YW5jaG9yLCAmcGt0TGlzdFNpemUgKTsKKyAgICAgIHNwaW5fdW5sb2NrKCZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKworICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOkluc2VydCBUeCBxdWV1ZSBmYWlsZWQuIFBrdCBkcm9wcGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIGtmcmVlX3NrYihza2IpOworICAgICAgICAgcmV0dXJuIE5FVERFVl9UWF9PSzsKKyAgICAgIH0KKworICAgICAgaWYgKCBwa3RMaXN0U2l6ZSA9PSAxICkKKyAgICAgIHsKKyAgICAgICAgIC8qIEluIHRoaXMgY29udGV4dCB3ZSBjYW5ub3QgYWNxdWlyZSBhbnkgbXV0ZXggZXRjLiBBbmQgdG8gdHJhbnNtaXQgCisgICAgICAgICAgKiB0aGlzIHBhY2tldCB3ZSBuZWVkIHRvIGNhbGwgU01FIEFQSS4gU28gdG8gdGFrZSBjYXJlIG9mIHRoaXMgd2Ugd2lsbAorICAgICAgICAgICogc2NoZWR1bGUgYSB3b3JrcXVldWUgCisgICAgICAgICAgKi8KKyAgICAgICAgIHNjaGVkdWxlX3dvcmsoJnBQZ0JrQWRhcHRlci0+bW9uVHhXb3JrUXVldWUpOworICAgICAgfQorICAgICAgcmV0dXJuIE5FVERFVl9UWF9PSzsKKyAgIH0KKyAKK2ZhaWw6CisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgIiVzOiBQYWNrZXQgUmN2ZCBhdCBNb25pdG9yIGludGVyZmFjZSBpcyBub3QgcHJvcGVyLCIKKyAgICAgICAgICAgIiBEcm9wcGluZyB0aGUgcGFja2V0IiwKKyAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgIGtmcmVlX3NrYihza2IpOworICAgcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKyNlbmRpZgorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2hhcmRfc3RhcnRfeG1pdCgpIC0gRnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSBMaW51eCBPUyBmb3IgCisgIHRyYW5zbWl0dGluZyBwYWNrZXRzLiBUaGVyZSBhcmUgMiB2ZXJzaW9ucyBvZiB0aGlzIGZ1bmN0aW9uLiBPbmUgdGhhdCB1c2VzCisgIGxvY2tlZCBxdWV1ZSBhbmQgb3RoZXIgdGhhdCB1c2VzIGxvY2tsZXNzIHF1ZXVlcy4gQm90aCBoYXZlIGJlZW4gcmV0YWluZWQgdG8KKyAgZG8gc29tZSBwZXJmb3JtYW5jZSB0ZXN0aW5nCisKKyAgQHBhcmFtIHNrYiAgICAgIDogW2luXSAgcG9pbnRlciB0byBPUyBwYWNrZXQgKHNrX2J1ZmYpCisgIEBwYXJhbSBkZXYgICAgICA6IFtpbl0gcG9pbnRlciB0byBMaWJyYSBuZXR3b3JrIGRldmljZQorICAKKyAgQHJldHVybiAgICAgICAgIDogTkVUX1hNSVRfRFJPUCBpZiBwYWNrZXRzIGFyZSBkcm9wcGVkCisgICAgICAgICAgICAgICAgICA6IE5FVF9YTUlUX1NVQ0NFU1MgaWYgcGFja2V0IGlzIGVucXVldWVkIHN1Y2Nlc2Z1bGx5CisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgaGRkX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICBXTEFOVExfQUNFbnVtVHlwZSBhYzsKKyAgIHNtZV9Rb3NXbW1VcFR5cGUgdXA7CisgICBza2JfbGlzdF9ub2RlX3QgKnBrdE5vZGUgPSBOVUxMOworICAgaGRkX2xpc3Rfbm9kZV90ICphbmNob3IgPSBOVUxMOworICAgdl9TSVpFX3QgcGt0TGlzdFNpemUgPSAwOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAgV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICB2X0JPT0xfdCBncmFudGVkOworCisgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9ICZwQWRhcHRlci0+c2Vzc2lvbkN0eC5zdGF0aW9uOworICAgCisgICB2X0JPT0xfdCB0eFN1c3BlbmRlZCA9IFZPU19GQUxTRTsKKworICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXRDYWxsZWQ7CisKKyAgIC8vR2V0IFRMIEFDIGNvcnJlc3BvbmRpbmcgdG8gUWRpc2MgcXVldWUgaW5kZXgvQUMuCisgICBhYyA9IGhkZF9RZGlzY0FjVG9UbEFDW3NrYi0+cXVldWVfbWFwcGluZ107CisKKyAgIC8vdXNlciBwcmlvcml0eSBmcm9tIElQIGhlYWRlciwgd2hpY2ggaXMgYWxyZWFkeSBleHRyYWN0ZWQgYW5kIHNldCBmcm9tIAorICAgLy9zZWxlY3RfcXVldWUgY2FsbCBiYWNrIGZ1bmN0aW9uCisgICB1cCA9IHNrYi0+cHJpb3JpdHk7CisKKyAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0Q2xhc3NpZmllZEFDW2FjXTsKKworI2lmZGVmIEhERF9XTU1fREVCVUcKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgIiVzOiBDbGFzc2lmaWVkIGFzIGFjICVkIHVwICVkIiwgX19GVU5DVElPTl9fLCBhYywgdXApOworI2VuZGlmIC8vIEhERF9XTU1fREVCVUcKKworICAgc3Bpbl9sb2NrKCZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKworICAgLy9JZiB3ZSBoYXZlIGFscmVhZHkgcmVhY2hlZCB0aGUgbWF4IHF1ZXVlIHNpemUsIGRpc2FibGUgdGhlIFRYIHF1ZXVlCisgICBpZiAoIHBBZGFwdGVyLT53bW1fdHhfcXVldWVbYWNdLmNvdW50ID09IHBBZGFwdGVyLT53bW1fdHhfcXVldWVbYWNdLm1heF9zaXplKQorICAgeworICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXRCYWNrUHJlc3N1cmVkOworICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXRCYWNrUHJlc3N1cmVkQUNbYWNdOworCisgICAgICBuZXRpZl90eF9zdG9wX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSkpOworICAgICAgcEFkYXB0ZXItPmlzVHhTdXNwZW5kZWRbYWNdID0gVk9TX1RSVUU7CisgICAgICB0eFN1c3BlbmRlZCA9IFZPU19UUlVFOworICAgfQorCisgICBzcGluX3VubG9jaygmcEFkYXB0ZXItPndtbV90eF9xdWV1ZVthY10ubG9jayk7ICAgICAgCisgICBpZiAoVk9TX1RSVUUgPT0gdHhTdXNwZW5kZWQpCisgICB7CisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sIAorICAgICAgICAgICAgICAgICAgIiVzOiBUWCBxdWV1ZSBmdWxsIGZvciBBQz0lZCBEaXNhYmxlIE9TIFRYIHF1ZXVlIiwgCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFjICk7CisgICAgICByZXR1cm4gTkVUREVWX1RYX0JVU1k7ICAgCisgICB9CisKKyAgIC8vVXNlIHRoZSBza2ItPmNiIGZpZWxkIHRvIGhvbGQgdGhlIGxpc3Qgbm9kZSBpbmZvcm1hdGlvbgorICAgcGt0Tm9kZSA9IChza2JfbGlzdF9ub2RlX3QgKikmc2tiLT5jYjsKKworICAgLy9TdGljayB0aGUgT1MgcGFja2V0IGluc2lkZSB0aGlzIG5vZGUuCisgICBwa3ROb2RlLT5za2IgPSBza2I7CisKKyAgIC8vU3RpY2sgdGhlIFVzZXIgUHJpb3JpdHkgaW5zaWRlIHRoaXMgbm9kZSAKKyAgIHBrdE5vZGUtPnVzZXJQcmlvcml0eSA9IHVwOworCisKKyAgIElOSVRfTElTVF9IRUFEKCZwa3ROb2RlLT5hbmNob3IpOworCisgICAvL0luc2VydCB0aGUgT1MgcGFja2V0IGludG8gdGhlIGFwcHJvcHJpYXRlIEFDIHF1ZXVlCisgICBzcGluX2xvY2soJnBBZGFwdGVyLT53bW1fdHhfcXVldWVbYWNdLmxvY2spOworICAgc3RhdHVzID0gaGRkX2xpc3RfaW5zZXJ0X2JhY2tfc2l6ZSggJnBBZGFwdGVyLT53bW1fdHhfcXVldWVbYWNdLCAmcGt0Tm9kZS0+YW5jaG9yLCAmcGt0TGlzdFNpemUgKTsKKyAgIHNwaW5fdW5sb2NrKCZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOkluc2VydCBUeCBxdWV1ZSBmYWlsZWQuIFBrdCBkcm9wcGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0RHJvcHBlZDsKKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0RHJvcHBlZEFDW2FjXTsKKyAgICAgICsrcEFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgIHJldHVybiBORVRERVZfVFhfT0s7CisgICB9CisKKyAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhYbWl0UXVldWVkOworICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXRRdWV1ZWRBQ1thY107CisKKyAgIC8vTWFrZSBzdXJlIHdlIGhhdmUgYWNjZXNzIHRvIHRoaXMgYWNjZXNzIGNhdGVnb3J5CisgICBpZiAobGlrZWx5KHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNdLndtbUFjQWNjZXNzQWxsb3dlZCkgfHwgCisgICAgICAgICAgICggcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnVJc0F1dGhlbnRpY2F0ZWQgPT0gVk9TX0ZBTFNFKSkKKyAgIHsKKyAgICAgIGdyYW50ZWQgPSBWT1NfVFJVRTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN0YXR1cyA9IGhkZF93bW1fYWNxdWlyZV9hY2Nlc3MoIHBBZGFwdGVyLCBhYywgJmdyYW50ZWQgKTsKKyAgIH0KKworICAgaWYgKCBncmFudGVkICYmICggcGt0TGlzdFNpemUgPT0gMSApKQorICAgeworICAgICAgLy9MZXQgVEwga25vdyB3ZSBoYXZlIGEgcGFja2V0IHRvIHNlbmQgZm9yIHRoaXMgQUMKKyAgICAgIC8vVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczpJbmRpY2F0aW5nIFBhY2tldCB0byBUTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBzdGF0dXMgPSBXTEFOVExfU1RBUGt0UGVuZGluZyggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsIHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFswXSwgYWMgKTsgICAgICAKKworICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogRmFpbGVkIHRvIHNpZ25hbCBUTCBmb3IgQUM9JWQiLCBfX0ZVTkNUSU9OX18sIGFjICk7CisKKyAgICAgICAgIC8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSBxdWV1ZS4gSXQgbXVzdCBiZSBhdCB0aGUgYmFjayBvZiB0aGUgcXVldWUsIGFzIFRYIHRocmVhZCBjYW5ub3QgcHJlZW1wdCB1cyBpbiB0aGUgbWlkZGxlCisgICAgICAgICAvL2FzIHdlIGFyZSBpbiBhIHNvZnQgaXJxIGNvbnRleHQuIEFsc28gaXQgbXVzdCBiZSB0aGUgc2FtZSBwYWNrZXQgdGhhdCB3ZSBqdXN0IGFsbG9jYXRlZC4KKyAgICAgICAgIHNwaW5fbG9jaygmcEFkYXB0ZXItPndtbV90eF9xdWV1ZVthY10ubG9jayk7CisgICAgICAgICBzdGF0dXMgPSBoZGRfbGlzdF9yZW1vdmVfYmFjayggJnBBZGFwdGVyLT53bW1fdHhfcXVldWVbYWNdLCAmYW5jaG9yICk7CisgICAgICAgICBzcGluX3VubG9jaygmcEFkYXB0ZXItPndtbV90eF9xdWV1ZVthY10ubG9jayk7CisgICAgICAgICArK3BBZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkOworICAgICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXREcm9wcGVkOworICAgICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eFhtaXREcm9wcGVkQUNbYWNdOworICAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgICByZXR1cm4gTkVUREVWX1RYX09LOworICAgICAgfQorICAgfQorCisgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworICAgcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3R4X3RpbWVvdXQoKSAtIEZ1bmN0aW9uIGNhbGxlZCBieSBPUyBpZiB0aGVyZSBpcyBhbnkKKyAgdGltZW91dCBkdXJpbmcgdHJhbnNtaXNzaW9uLiBTaW5jZSBIREQgc2ltcGx5IGVucXVldWVzIHBhY2tldAorICBhbmQgcmV0dXJucyBjb250cm9sIHRvIE9TIHJpZ2h0IGF3YXksIHRoaXMgd291bGQgbmV2ZXIgYmUgaW52b2tlZAorCisgIEBwYXJhbSBkZXYgOiBbaW5dIHBvaW50ZXIgdG8gTGlicmEgbmV0d29yayBkZXZpY2UKKyAgQHJldHVybiAgICA6IE5vbmUKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgaGRkX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICIlczogVHJhbnNtaXNzaW9uIHRpbWVvdXQgb2NjdXJyZWQiLCBfX0ZVTkNUSU9OX18pOworICAgLy9HZXR0aW5nIGhlcmUgaW1wbGllcyB3ZSBkaXNhYmxlZCB0aGUgVFggcXVldWVzIGZvciB0b28gbG9uZy4gUXVldWVzIGFyZSAKKyAgIC8vZGlzYWJsZWQgZWl0aGVyIGJlY2F1c2Ugb2YgZGlzYXNzb2NpYXRpb24gb3IgbG93IHJlc291cmNlIHNjZW5hcmlvcy4gSW4KKyAgIC8vY2FzZSBvZiBkaXNhc3NvY2lhdGlvbiBpdCBpcyBvayB0byBpZ25vcmUgdGhpcy4gQnV0IGlmIGFzc29jaWF0ZWQsIHdlIGhhdmUKKyAgIC8vZG8gcG9zc2libGUgcmVjb3ZlcnkgaGVyZQorfSAKKworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfc3RhdHMoKSAtIEZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCB0aGUgTGludXggT1MgZm9yIAorICBkZXZpY2UgVFgvUlggc3RhdGlzdGljCisKKyAgQHBhcmFtIGRldiAgICAgIDogW2luXSBwb2ludGVyIHRvIExpYnJhIG5ldHdvcmsgZGV2aWNlCisgIAorICBAcmV0dXJuICAgICAgICAgOiBwb2ludGVyIHRvIG5ldF9kZXZpY2Vfc3RhdHMgc3RydWN0dXJlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogaGRkX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9ICBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgIAorICAgcmV0dXJuICZwQWRhcHRlci0+c3RhdHM7Cit9CisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2luaXRfdHhfcngoKSAtIEluaXQgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBUeC9SWAorICBtb2R1bGVzIGluIEhERAorCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgIAorICBAcmV0dXJuICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkIAorICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIGhkZF9pbml0X3R4X3J4KCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciApCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZfU0lOVF90IGkgPSAtMTsKKworICAgcEFkYXB0ZXItPmlzVm9zT3V0T2ZSZXNvdXJjZSA9IFZPU19GQUxTRTsKKworICAgLy92b3NfbWVtX3plcm8oJnBBZGFwdGVyLT5zdGF0cywgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisgICAvL1dpbGwgYmUgemVyb2VkIG91dCBkdXJpbmcgYWxsb2MKKworICAgd2hpbGUgKCsraSAhPSBOVU1fVFhfUVVFVUVTKQorICAgeyAKKyAgICAgIHBBZGFwdGVyLT5pc1R4U3VzcGVuZGVkW2ldID0gVk9TX0ZBTFNFOyAKKyAgICAgIGhkZF9saXN0X2luaXQoICZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2ldLCBIRERfVFhfUVVFVUVfTUFYX0xFTik7CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2RlaW5pdF90eF9yeCgpIC0gRGVpbml0IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIFR4L1JYCisgIG1vZHVsZXMgaW4gSERECisKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2luXSBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAgCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX2RlaW5pdF90eF9yeCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB2X1NJTlRfdCBpID0gLTE7CisKKyAgIHN0YXR1cyA9IGhkZF9mbHVzaF90eF9xdWV1ZXMocEFkYXB0ZXIpOworICAgd2hpbGUgKCsraSAhPSBOVU1fVFhfUVVFVUVTKSAKKyAgIHsKKyAgICAgIC8vRnJlZSB1cCBhY3R1YWwgbGlzdCBlbGVtZW50cyBpbiB0aGUgVHggcXVldWUKKyAgICAgIGhkZF9saXN0X2Rlc3Ryb3koICZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2ldICk7CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2Rpc2Nvbm5lY3RfdHhfcngoKSAtIERpc2Nvbm5lY3QgZnVuY3Rpb24gdG8gY2xlYW4gdXAgVHgvUlgKKyAgbW9kdWxlcyBpbiBIREQKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCAKKyAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBoZGRfZGlzY29ubmVjdF90eF9yeCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreworICAgcmV0dXJuIGhkZF9mbHVzaF90eF9xdWV1ZXMocEFkYXB0ZXIpOworfQorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9Jc0VBUE9MUGFja2V0KCkgLSBDaGVja3MgdGhlIHBhY2tldCBpcyBFQVBPTCBvciBub3QuCisKKyAgQHBhcmFtIHBWb3NQYWNrZXQgOiBbaW5dIHBvaW50ZXIgdG8gdm9zIHBhY2tldCAgCisgIEByZXR1cm4gICAgICAgICA6IFZPU19UUlVFIGlmIHRoZSBwYWNrZXQgaXMgRUFQT0wgCisgICAgICAgICAgICAgICAgICA6IFZPU19GQUxTRSBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordl9CT09MX3QgaGRkX0lzRUFQT0xQYWNrZXQoIHZvc19wa3RfdCAqcFZvc1BhY2tldCApCit7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHZfQk9PTF90ICAgZkVBUE9MICAgICA9IFZPU19GQUxTRTsgCisgICAgdm9pZCAgICAgICAqcEJ1ZmZlciAgID0gTlVMTDsKKworICAgIAorICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCBwVm9zUGFja2V0LCAodl9TSVpFX3QpSEREX0VUSEVSVFlQRV84MDJfMV9YX0ZSQU1FX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXIsIEhERF9FVEhFUlRZUEVfODAyXzFfWF9TSVpFICk7CisgICAgaWYgKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgIHsKKyAgICAgICBpZiAoIHZvc19iZTE2X3RvX2NwdSggKih1bnNpZ25lZCBzaG9ydCopcEJ1ZmZlciApID09IEhERF9FVEhFUlRZUEVfODAyXzFfWCApCisgICAgICAgeworICAgICAgICAgIGZFQVBPTCA9IFZPU19UUlVFOworICAgICAgIH0KKyAgICB9ICAKKyAgICAKKyAgIHJldHVybiBmRUFQT0w7Cit9CisKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJIC8vIE5lZWQgdG8gdXBkYXRlIHRoaXMgZnVuY3Rpb24KKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9Jc1dBSVBhY2tldCgpIC0gQ2hlY2tzIHRoZSBwYWNrZXQgaXMgV0FJIG9yIG5vdC4KKworICBAcGFyYW0gcFZvc1BhY2tldCA6IFtpbl0gcG9pbnRlciB0byB2b3MgcGFja2V0CisgIEByZXR1cm4gICAgICAgICA6IFZPU19UUlVFIGlmIHRoZSBwYWNrZXQgaXMgV0FJCisgICAgICAgICAgICAgICAgICA6IFZPU19GQUxTRSBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordl9CT09MX3QgaGRkX0lzV0FJUGFja2V0KCB2b3NfcGt0X3QgKnBWb3NQYWNrZXQgKQoreworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB2X0JPT0xfdCAgIGZJc1dBSSAgICAgPSBWT1NfRkFMU0U7CisgICAgdm9pZCAgICAgICAqcEJ1ZmZlciAgID0gTlVMTDsKKworICAgIC8vIE5lZWQgdG8gdXBkYXRlIHRoaXMgZnVuY3Rpb24KKyAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSggcFZvc1BhY2tldCwgKHZfU0laRV90KUhERF9FVEhFUlRZUEVfODAyXzFfWF9GUkFNRV9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLCBIRERfRVRIRVJUWVBFXzgwMl8xX1hfU0laRSApOworCisgICAgaWYgKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgIHsKKyAgICAgICBpZiAoIHZvc19iZTE2X3RvX2NwdSggKih1bnNpZ25lZCBzaG9ydCopcEJ1ZmZlciApID09IEhERF9FVEhFUlRZUEVfV0FJKQorICAgICAgIHsKKyAgICAgICAgICBmSXNXQUkgPSBWT1NfVFJVRTsKKyAgICAgICB9CisgICAgfQorCisgICByZXR1cm4gZklzV0FJOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF90eF9jb21wbGV0ZV9jYmsoKSAtIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgYnkgVEwKKyAgdG8gaW5kaWNhdGUgdGhhdCBhIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZCBhY3Jvc3MgdGhlIFNESU8gYnVzCisgIHN1Y2Nlc2Z1bGx5LiBPUyBwYWNrZXQgcmVzb3VyY2VzIGNhbiBiZSByZWxlYXNlZCBhZnRlciB0aGlzIGNiay4KKworICBAcGFyYW0gdm9zQ29udGV4dCAgIDogW2luXSBwb2ludGVyIHRvIFZPUyBjb250ZXh0ICAgCisgIEBwYXJhbSBwVm9zUGFja2V0ICAgOiBbaW5dIHBvaW50ZXIgdG8gVk9TIHBhY2tldCAoY29udGFpbmluZyBza2IpIAorICBAcGFyYW0gdm9zU3RhdHVzSW4gIDogW2luXSBzdGF0dXMgb2YgdGhlIHRyYW5zbWlzc2lvbiAKKworICBAcmV0dXJuICAgICAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCAKKyAgICAgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3R4X2NvbXBsZXRlX2Niayggdl9WT0lEX3QgKnZvc0NvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X3QgKnBWb3NQYWNrZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTIHZvc1N0YXR1c0luICkKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBOVUxMOyAgIAorICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IE5VTEw7CisgICB2b2lkKiBwT3NQa3QgPSBOVUxMOworICAgCisgICBpZiggKCBOVUxMID09IHZvc0NvbnRleHQgKSB8fCAoIE5VTEwgPT0gcFZvc1BhY2tldCApICApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBOdWxsIHBhcmFtcyBiZWluZyBwYXNzZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLy9SZXR1cm4gdGhlIHNrYiB0byB0aGUgT1MKKyAgIHN0YXR1cyA9IHZvc19wa3RfZ2V0X29zX3BhY2tldCggcFZvc1BhY2tldCwgJnBPc1BrdCwgVk9TX1RSVUUgKTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApKQorICAgeworICAgICAgLy9UaGlzIGlzIGJhZCBidXQgc3RpbGwgdHJ5IHRvIGZyZWUgdGhlIFZPU1MgcmVzb3VyY2VzIGlmIHdlIGNhbgorICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogRmFpbHVyZSBleHRyYWN0aW5nIHNrYiBmcm9tIHZvcyBwa3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwVm9zUGFja2V0ICk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICAKKyAgIC8vR2V0IHRoZSBIREQgY29udGV4dC4KKyAgIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9IREQsIHZvc0NvbnRleHQgKTsKKyAgIC8vR2V0IHRoZSBBZGFwdGVyIGNvbnRleHQuCisgICBwQWRhcHRlciA9IGhkZF9nZXRfYWRhcHRlcihwSGRkQ3R4LFdMQU5fSEREX0lORlJBX1NUQVRJT04pOworICAgaWYocEFkYXB0ZXIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEhERCBhZGFwdGVyIGNvbnRleHQgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4Q29tcGxldGVkOworICAgfQorCisgICBrZnJlZV9za2IoKHN0cnVjdCBza19idWZmICopcE9zUGt0KTsgCisKKyAgIC8vUmV0dXJuIHRoZSBWT1MgcGFja2V0IHJlc291cmNlcy4KKyAgIHN0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BhY2tldCApOworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBDb3VsZCBub3QgcmV0dXJuIFZPUyBwYWNrZXQgdG8gdGhlIHBvb2wiLCBfX0ZVTkNUSU9OX18pOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF90eF9mZXRjaF9wYWNrZXRfY2JrKCkgLSBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIGJ5IFRMIHRvIAorICBmZXRjaCBhIHBhY2tldCBmb3IgdHJhbnNtaXNzaW9uLgorCisgIEBwYXJhbSB2b3NDb250ZXh0ICAgOiBbaW5dIHBvaW50ZXIgdG8gVk9TIGNvbnRleHQgIAorICBAcGFyYW0gc3RhSWQgICAgICAgIDogW2luXSBTdGF0aW9uIGZvciB3aGljaCBUTCBpcyByZXF1ZXN0aW5nIGEgcGt0CisgIEBwYXJhbSBhYyAgICAgICAgICAgOiBbaW5dIGFjY2VzcyBjYXRlZ29yeSByZXF1ZXN0ZWQgYnkgVEwKKyAgQHBhcmFtIHBWb3NQYWNrZXQgICA6IFtvdXRdIHBvaW50ZXIgdG8gVk9TIHBhY2tldCBwYWNrZXQgcG9pbnRlcgorICBAcGFyYW0gcFBrdE1ldGFJbmZvIDogW291dF0gcG9pbnRlciB0byBtZXRhIGluZm8gZm9yIHRoZSBwa3QgCisgIAorICBAcmV0dXJuICAgICAgICAgICAgIDogVk9TX1NUQVRVU19FX0VNUFRZIGlmIG5vIHBhY2tldHMgdG8gdHJhbnNtaXQKKyAgICAgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgCisgICAgICAgICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIGhkZF90eF9mZXRjaF9wYWNrZXRfY2JrKCB2X1ZPSURfdCAqdm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcFN0YUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDRW51bVR5cGUgIGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90ICoqcHBWb3NQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTWV0YUluZm9UeXBlICpwUGt0TWV0YUluZm8gKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gTlVMTDsKKyAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBOVUxMOworICAgaGRkX2xpc3Rfbm9kZV90ICphbmNob3IgPSBOVUxMOworICAgc2tiX2xpc3Rfbm9kZV90ICpwa3ROb2RlID0gTlVMTDsKKyAgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworICAgdm9zX3BrdF90ICpwVm9zUGFja2V0ID0gTlVMTDsKKyAgIHZfTUFDQUREUl90KiBwRGVzdE1hY0FkZHJlc3MgPSBOVUxMOworICAgdl9USU1FX3QgdGltZXN0YW1wOworICAgV0xBTlRMX0FDRW51bVR5cGUgbmV3QWM7CisgICB2X1NJWkVfdCBzaXplID0gMDsKKyAgIHRBTklfVTggICBhY0FkbWl0dGVkLCBpOworCisgICAvL1Nhbml0eSBjaGVjayBvbiBpbnB1dHMKKyAgIGlmICggKCBOVUxMID09IHZvc0NvbnRleHQgKSB8fCAKKyAgICAgICAgKCBOVUxMID09IHBTdGFJZCApIHx8IAorICAgICAgICAoIE5VTEwgPT0gcHBWb3NQYWNrZXQgKSB8fAorICAgICAgICAoIE5VTEwgPT0gcFBrdE1ldGFJbmZvICkgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogTnVsbCBQYXJhbXMgYmVpbmcgcGFzc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLy9HZXQgdGhlIEhERCBjb250ZXh0LgorICAgcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0hERCwgdm9zQ29udGV4dCApOworICAgaWYocEhkZEN0eCA9PSBOVUxMKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogSEREIGFkYXB0ZXIgY29udGV4dCBpcyBOdWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAKKyAgIHBBZGFwdGVyID0gcEhkZEN0eC0+c3RhX3RvX2FkYXB0ZXJbKnBTdGFJZF07CisgICBpZiggTlVMTCA9PSBwQWRhcHRlciApCisgICB7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4RmV0Y2hlZDsKKworICAgKnBwVm9zUGFja2V0ID0gTlVMTDsKKworICAgLy9NYWtlIHN1cmUgdGhlIEFDIGJlaW5nIGFza2VkIGZvciBpcyBzYW5lCisgICBpZiggYWMgPj0gV0xBTlRMX01BWF9BQyB8fCBhYyA8IDApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBJbnZhbGlkIEFDICVkIHBhc3NlZCBieSBUTCIsIF9fRlVOQ1RJT05fXywgYWMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4RmV0Y2hlZEFDW2FjXTsKKworI2lmZGVmIEhERF9XTU1fREVCVUcKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEFDICVkIHBhc3NlZCBieSBUTCIsIF9fRlVOQ1RJT05fXywgYWMpOworI2VuZGlmIC8vIEhERF9XTU1fREVCVUcKKworICAgLy8gV2UgZmluZCBhbiBBQyB3aXRoIHBhY2tldHMKKyAgIC8vIG9yIHdlIGRldGVybWluZSB3ZSBoYXZlIG5vIG1vcmUgcGFja2V0cyB0byBzZW5kCisgICAvLyBIREQgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIEFDLgorCisgICAvLyBoYXMgdGhpcyBBQyBiZWVuIGFkbWl0dGVkPyBvciAKKyAgIC8vIFRvIGFsbG93IEVBUE9MIHBhY2tldHMgd2hlbiBub3QgYXV0aGVudGljYXRlZAorICAgaWYgKHVubGlrZWx5KCgwPT1wQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjXS53bW1BY0FjY2Vzc0FsbG93ZWQpICYmCisgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLnVJc0F1dGhlbnRpY2F0ZWQpKQorICAgeworICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eEZldGNoRW1wdHk7CisjaWZkZWYgSEREX1dNTV9ERUJVRworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAiJXM6IG5vIHBhY2tldHMgcGVuZGluZyIsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYgLy8gSEREX1dNTV9ERUJVRworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgICAgCisgICAvLyBkbyB3ZSBoYXZlIGFueSBwYWNrZXRzIHBlbmRpbmcgaW4gdGhpcyBBQz8KKyAgIGhkZF9saXN0X3NpemUoICZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXSwgJnNpemUgKTsgCisgICBpZiggc2l6ZSA+ICAwICkKKyAgIHsKKyAgICAgICAvLyB5ZXMsIHNvIHByb2Nlc3MgaXQKKyNpZmRlZiBIRERfV01NX0RFQlVHCisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEFDICVkIGhhcyBwYWNrZXRzIHBlbmRpbmciLCBfX0ZVTkNUSU9OX18sIGFjKTsKKyNlbmRpZiAvLyBIRERfV01NX0RFQlVHCisgICB9CisgICBlbHNlCisgICB7CisgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4RmV0Y2hFbXB0eTsKKyNpZmRlZiBIRERfV01NX0RFQlVHCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgIiVzOiBubyBwYWNrZXRzIHBlbmRpbmciLCBfX0ZVTkNUSU9OX18pOworI2VuZGlmIC8vIEhERF9XTU1fREVCVUcKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLy9HZXQgdGhlIHZvcyBwYWNrZXQuIEkgZG9uJ3Qgd2FudCB0byBkZXF1ZXVlIGFuZCBlbnF1ZXVlIGFnYWluIGlmIHdlIGFyZSBvdXQgb2YgVk9TIHJlc291cmNlcyAKKyAgIC8vVGhpcyBzaW1wbGlmaWVzIHRoZSBsb2NraW5nIGFuZCB1bmxvY2tpbmcgb2YgVHggcXVldWUKKyAgIHN0YXR1cyA9IHZvc19wa3Rfd3JhcF9kYXRhX3BhY2tldCggJnBWb3NQYWNrZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfUEtUX1RZUEVfVFhfODAyXzNfREFUQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vT1MgUGt0IGlzIG5vdCBiZWluZyBwYXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX3R4X2xvd19yZXNvdXJjZV9jYmssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciApOworCisgICBpZiAoc3RhdHVzID09IFZPU19TVEFUVVNfRV9BTFJFQURZIHx8IHN0YXR1cyA9PSBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTKQorICAgeworICAgICAgLy9SZW1lbWJlciBWT1MgaXMgaW4gYSBsb3cgcmVzb3VyY2Ugc2l0dWF0aW9uCisgICAgICBwQWRhcHRlci0+aXNWb3NPdXRPZlJlc291cmNlID0gVk9TX1RSVUU7CisgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4RmV0Y2hMb3dSZXNvdXJjZXM7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBWT1NTIGluIExvdyBSZXNvdXJjZSBzY2VuYXJpbyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAvL1RMIHdpbGwgbm93IHRoaW5rIHdlIGhhdmUgbm8gbW9yZSBwYWNrZXRzIGluIHRoaXMgQUMKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLy9SZW1vdmUgdGhlIHBhY2tldCBmcm9tIHRoZSBxdWV1ZQorICAgc3Bpbl9sb2NrX2JoKCZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2FjXS5sb2NrKTsKKyAgIHN0YXR1cyA9IGhkZF9saXN0X3JlbW92ZV9mcm9udCggJnBBZGFwdGVyLT53bW1fdHhfcXVldWVbYWNdLCAmYW5jaG9yICk7CisgICBzcGluX3VubG9ja19iaCgmcEFkYXB0ZXItPndtbV90eF9xdWV1ZVthY10ubG9jayk7CisKKyAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpCisgICB7CisgICAgICAvL0lmIHN1Y2Nlc3MgdGhlbiB3ZSBnb3QgYSB2YWxpZCBwYWNrZXQgZnJvbSBzb21lIEFDCisgICAgICBwa3ROb2RlID0gbGlzdF9lbnRyeShhbmNob3IsIHNrYl9saXN0X25vZGVfdCwgYW5jaG9yKTsKKyAgICAgIHNrYiA9IHBrdE5vZGUtPnNrYjsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhGZXRjaERlcXVldWVFcnJvcjsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBFcnJvciBpbiBkZS1xdWV1aW5nICIKKyAgICAgICAgICJza2IgZnJvbSBUeCBxdWV1ZSBzdGF0dXMgPSAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzICk7CisgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFZvc1BhY2tldCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vQXR0YWNoIHNrYiB0byBWT1MgcGFja2V0LgorICAgc3RhdHVzID0gdm9zX3BrdF9zZXRfb3NfcGFja2V0KCBwVm9zUGFja2V0LCBza2IgKTsKKyAgIGlmIChzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogRXJyb3IgYXR0YWNoaW5nIHNrYiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFZvc1BhY2tldCk7CisgICAgICArK3BBZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkOworICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eEZldGNoRGVxdWV1ZUVycm9yOworICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vSnVzdCBiZWluZyBwYXJhbm9pZC4gVG8gYmUgcmVtb3ZlZCBsYXRlcgorICAgaWYocFZvc1BhY2tldCA9PSBOVUxMKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogVk9TIHBhY2tldCByZXR1cm5lZCBieSBWT1NTIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgKytwQWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZDsKKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhGZXRjaERlcXVldWVFcnJvcjsKKyAgICAgIGtmcmVlX3NrYihza2IpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvL1JldHVybiBWT1MgcGFja2V0IHRvIFRMOworICAgKnBwVm9zUGFja2V0ID0gcFZvc1BhY2tldDsKKworICAgLy9GaWxsIG91dCB0aGUgbWV0YSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgVEwKKyAgIC8vRklYTUUgVGhpcyB0aW1lc3RhbXAgaXMgcmVhbGx5IHRoZSB0aW1lIHN0YW1wIG9mIHdyYXBfZGF0YV9wYWNrZXQKKyAgIHZvc19wa3RfZ2V0X3RpbWVzdGFtcCggcFZvc1BhY2tldCwgJnRpbWVzdGFtcCApOworICAgcFBrdE1ldGFJbmZvLT51c1RpbWVTdGFtcCA9ICh2X1UxNl90KXRpbWVzdGFtcDsKKyAgIAorICAgaWYocEFkYXB0ZXItPnNlc3Npb25DdHguc3RhdGlvbi5jb25uX2luZm8udUlzQXV0aGVudGljYXRlZCA9PSBWT1NfVFJVRSkKKyAgICAgIHBQa3RNZXRhSW5mby0+dWNJc0VhcG9sID0gMDsgICAgICAgCisgICBlbHNlIAorICAgICAgcFBrdE1ldGFJbmZvLT51Y0lzRWFwb2wgPSBoZGRfSXNFQVBPTFBhY2tldCggcFZvc1BhY2tldCApID8gMSA6IDA7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgLy8gT3ZlcnJpZGUgdXNJc0VhcG9sIHZhbHVlIHdoZW4gaXRzIHplcm8gZm9yIFdBUEkgY2FzZQorICAgICAgcFBrdE1ldGFJbmZvLT51Y0lzV2FpID0gaGRkX0lzV0FJUGFja2V0KCBwVm9zUGFja2V0ICkgPyAxIDogMDsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisgICBpZiAoKEhERF9XTU1fVVNFUl9NT0RFX05PX1FPUyA9PSBwSGRkQ3R4LT5jZmdfaW5pLT5XbW1Nb2RlKSB8fAorICAgICAgICghcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1RYXApKQorICAgeworICAgICAgLy8gZWl0aGVyIHdlIGRvbid0IHdhbnQgUW9TIG9yIHRoZSBBUCBkb2Vzbid0IHN1cHBvcnQgUW9TCisgICAgICBwUGt0TWV0YUluZm8tPnVjVVAgPSAwOworICAgICAgcFBrdE1ldGFJbmZvLT51Y1RJRCA9IDA7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAvKiAxLiBDaGVjayBpZiBBQ00gaXMgc2V0IGZvciB0aGlzIEFDIAorICAgICAgICogMi4gSWYgc2V0LCBjaGVjayBpZiB0aGlzIEFDIGhhZCBhbHJlYWR5IGFkbWl0dGVkIAorICAgICAgICogMy4gSWYgbm90IGFscmVhZHkgYWRtaXR0ZWQsIGRvd25ncmFkZSB0aGUgVVAgdG8gbmV4dCBiZXN0IFVQICovCisgICAgICBpZighcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10ud21tQWNBY2Nlc3NSZXF1aXJlZCB8fAorICAgICAgICAgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10ud21tQWNUc3BlY1ZhbGlkKQorICAgICAgeworICAgICAgICBwUGt0TWV0YUluZm8tPnVjVVAgPSBwa3ROb2RlLT51c2VyUHJpb3JpdHk7CisgICAgICAgIHBQa3RNZXRhSW5mby0+dWNUSUQgPSBwUGt0TWV0YUluZm8tPnVjVVA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vRG93bmdyYWRlIHRoZSBVUAorICAgICAgICBhY0FkbWl0dGVkID0gcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10ud21tQWNUc3BlY1ZhbGlkOworICAgICAgICBuZXdBYyA9IFdMQU5UTF9BQ19CSzsKKyAgICAgICAgZm9yIChpPWFjLTE7IGk+MDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1tpXS53bW1BY0FjY2Vzc1JlcXVpcmVkID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3QWMgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBQa3RNZXRhSW5mby0+dWNVUCA9IGhkZFdtbUFjVG9IaWdoZXN0VXBbbmV3QWNdOworICAgICAgICBwUGt0TWV0YUluZm8tPnVjVElEID0gcFBrdE1ldGFJbmZvLT51Y1VQOworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csIkRvd25ncmFkaW5nIFVQICVkIHRvIFVQICVkICIsIHBrdE5vZGUtPnVzZXJQcmlvcml0eSwgcFBrdE1ldGFJbmZvLT51Y1VQKTsKKyAgICAgIH0KKyAgIH0KKworICAgcFBrdE1ldGFJbmZvLT51Y1R5cGUgPSAwOyAgICAgICAgICAvL0ZJWE1FIERvbid0IGtub3cgd2hhdCB0aGlzIGlzCisgICBwUGt0TWV0YUluZm8tPnVjRGlzYWJsZUZybVh0bCA9IDA7IC8vODAyLjMgZnJhbWUgc28gd2UgbmVlZCB0byB4bGF0ZQorICAgaWYgKCAxIDwgc2l6ZSApCisgICB7CisgICAgICAgcFBrdE1ldGFJbmZvLT5iTW9yZVBhY2tldHMgPSAxOyAvL0hERCBoYXMgbW9yZSBwYWNrZXRzIHRvIHNlbmQKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICBwUGt0TWV0YUluZm8tPmJNb3JlUGFja2V0cyA9IDA7CisgICB9CisKKyAgIC8vRXh0cmFjdCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBmcm9tIGV0aGVybmV0IGZyYW1lCisgICBwRGVzdE1hY0FkZHJlc3MgPSAodl9NQUNBRERSX3QqKXNrYi0+ZGF0YTsKKyAgIHBQa3RNZXRhSW5mby0+dWNCY2FzdCA9IHZvc19pc19tYWNhZGRyX2Jyb2FkY2FzdCggcERlc3RNYWNBZGRyZXNzICkgPyAxIDogMDsKKyAgIHBQa3RNZXRhSW5mby0+dWNNY2FzdCA9IHZvc19pc19tYWNhZGRyX2dyb3VwKCBwRGVzdE1hY0FkZHJlc3MgKSA/IDEgOiAwOworCisgICAKKworICAgLy8gaWYgd2UgYXJlIGluIGEgYmFja3ByZXNzdXJlIHNpdHVhdGlvbiBzZWUgaWYgd2UgY2FuIHR1cm4gdGhlIGhvc2UgYmFjayBvbgorICAgaWYgKCAocEFkYXB0ZXItPmlzVHhTdXNwZW5kZWRbYWNdKSAmJgorICAgICAgICAoc2l6ZSA8PSBIRERfVFhfUVVFVUVfTE9XX1dBVEVSX01BUkspICkKKyAgIHsKKyAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhGZXRjaERlUHJlc3N1cmVkOworICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eEZldGNoRGVQcmVzc3VyZWRBQ1thY107CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBUWCBxdWV1ZVslZF0gcmUtZW5hYmxlZCIsIF9fRlVOQ1RJT05fXywgYWMpOworICAgICAgcEFkYXB0ZXItPmlzVHhTdXNwZW5kZWRbYWNdID0gVk9TX0ZBTFNFOyAgICAgIAorICAgICAgbmV0aWZfdHhfd2FrZV9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKHBBZGFwdGVyLT5kZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpICkpOworICAgfQorCisKKyAgIC8vIFdlJ3JlIGdpdmluZyB0aGUgcGFja2V0IHRvIFRMIHNvIGNvbnNpZGVyIGl0IHRyYW5zbWl0dGVkIGZyb20KKyAgIC8vIGEgc3RhdGlzdGljcyBwZXJzcGVjdGl2ZS4gIFdlIGFjY291bnQgZm9yIGl0IGhlcmUgaW5zdGVhZCBvZgorICAgLy8gd2hlbiB0aGUgcGFja2V0IGlzIHJldHVybmVkIGZvciB0d28gcmVhc29ucy4gIEZpcnN0LCBUTCB3aWxsCisgICAvLyBtYW5pcHVsYXRlIHRoZSBza2IgdG8gdGhlIHBvaW50IHdoZXJlIHRoZSBsZW4gZmllbGQgaXMgbm90CisgICAvLyBhY2N1cmF0ZSwgbGVhZGluZyB0byBpbmFjY3VyYXRlIGJ5dGUgY291bnRzIGlmIHdlIGFjY291bnQgZm9yCisgICAvLyBpdCBsYXRlci4gIFNlY29uZCwgVEwgZG9lcyBub3QgcHJvdmlkZSBhbnkgZmVlZGJhY2sgYXMgdG8KKyAgIC8vIHdoZXRoZXIgb3Igbm90IHRoZSBwYWNrZXQgd2FzIHN1Y2Nlc3NmdWxseSBzZW50IG92ZXIgdGhlIGFpciwKKyAgIC8vIHNvIHRoZSBwYWNrZXQgY291bnRzIHdpbGwgYmUgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB3aGVyZSB3ZQorICAgLy8gYWNjb3VudCBmb3IgdGhlbQorICAgcEFkYXB0ZXItPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworICAgKytwQWRhcHRlci0+c3RhdHMudHhfcGFja2V0czsKKyAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMudHhGZXRjaERlcXVldWVkOworICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy50eEZldGNoRGVxdWV1ZWRBQ1thY107CisKKyAgIGlmKHBIZGRDdHgtPmNmZ19pbmktPnRoZXJtYWxNaXRpZ2F0aW9uRW5hYmxlKQorICAgeworICAgICAgaWYobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwSGRkQ3R4LT50bUluZm8udG1PcGVyYXRpb25Mb2NrKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBUbSBMb2NrIGZhaWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgfQorICAgICAgaWYoV0xBTl9IRERfVE1fTEVWRUxfMSA8IHBIZGRDdHgtPnRtSW5mby5jdXJyZW50VG1MZXZlbCkKKyAgICAgIHsKKyAgICAgICAgIGlmKDAgPT0gcEhkZEN0eC0+dG1JbmZvLnR4RnJhbWVDb3VudCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEp1c3QgcmVjb3ZlcmVkIGZyb20gc2xlZXAgdGltZW91dCAqLworICAgICAgICAgICAgcEhkZEN0eC0+dG1JbmZvLmxhc3RPcGVuVHMgPSB0aW1lc3RhbXA7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmKCgodGltZXN0YW1wIC0gcEhkZEN0eC0+dG1JbmZvLmxhc3RPcGVuVHMpID4gKHBIZGRDdHgtPnRtSW5mby50bUFjdGlvbi50eE9wZXJhdGlvbkR1cmF0aW9uIC8gMTApKSAmJgorICAgICAgICAgICAgKHBIZGRDdHgtPnRtSW5mby50eEZyYW1lQ291bnQgPj0gcEhkZEN0eC0+dG1JbmZvLnRtQWN0aW9uLnR4QmxvY2tGcmFtZUNvdW50VGhyZXNob2xkKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHNwaW5fbG9jaygmcEFkYXB0ZXItPndtbV90eF9xdWV1ZVthY10ubG9jayk7CisgICAgICAgICAgICAvKiBEdXJpbmcgVFggb3BlbiBkdXJhdGlvbiwgVFggZnJhbWUgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkCisgICAgICAgICAgICAgKiBCbG9jayBUWCBkdXJpbmcgU2xlZXAgdGltZSAqLworICAgICAgICAgICAgbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHBBZGFwdGVyLT5kZXYpOworICAgICAgICAgICAgc3Bpbl91bmxvY2soJnBBZGFwdGVyLT53bW1fdHhfcXVldWVbYWNdLmxvY2spOworICAgICAgICAgICAgcEhkZEN0eC0+dG1JbmZvLmxhc3RibG9ja1RzID0gdGltZXN0YW1wOworICAgICAgICAgICAgaWYoVk9TX1RJTUVSX1NUQVRFX1NUT1BQRUQgPT0gdm9zX3RpbWVyX2dldEN1cnJlbnRTdGF0ZSgmcEhkZEN0eC0+dG1JbmZvLnR4U2xlZXBUaW1lcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB2b3NfdGltZXJfc3RhcnQoJnBIZGRDdHgtPnRtSW5mby50eFNsZWVwVGltZXIsIHBIZGRDdHgtPnRtSW5mby50bUFjdGlvbi50eFNsZWVwRHVyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZigoKHRpbWVzdGFtcCAtIHBIZGRDdHgtPnRtSW5mby5sYXN0T3BlblRzKSA+IChwSGRkQ3R4LT50bUluZm8udG1BY3Rpb24udHhPcGVyYXRpb25EdXJhdGlvbiAvIDEwKSkgJiYKKyAgICAgICAgICAgICAgICAgKHBIZGRDdHgtPnRtSW5mby50eEZyYW1lQ291bnQgPCBwSGRkQ3R4LT50bUluZm8udG1BY3Rpb24udHhCbG9ja0ZyYW1lQ291bnRUaHJlc2hvbGQpKQorICAgICAgICAgeworICAgICAgICAgICAgLyogRHVyaW5nIFRYIG9wZW4gZHVyYXRpb24sIFRYIGZyYW1lIGNvdW50IGlzIGxlc3MgdGhhbiB0aHJlc2hvbGQKKyAgICAgICAgICAgICAqIFJlc2V0IGNvdW50IGFuZCB0aW1lc3RhbXAgdG8gcHJlcGFyZSBuZXh0IGN5Y2xlICovCisgICAgICAgICAgICBwSGRkQ3R4LT50bUluZm8ubGFzdE9wZW5UcyA9IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIHBIZGRDdHgtPnRtSW5mby50eEZyYW1lQ291bnQgPSAwOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLyogRG8gTm90aGluZyAqLworICAgICAgICAgfQorICAgICAgICAgcEhkZEN0eC0+dG1JbmZvLnR4RnJhbWVDb3VudCsrOworICAgICAgfQorICAgICAgbXV0ZXhfdW5sb2NrKCZwSGRkQ3R4LT50bUluZm8udG1PcGVyYXRpb25Mb2NrKTsKKyAgIH0KKworCisjaWZkZWYgSEREX1dNTV9ERUJVRworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogVmFsaWQgVk9TIFBLVCByZXR1cm5lZCB0byBUTCIsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYgLy8gSEREX1dNTV9ERUJVRworCisgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF90eF9sb3dfcmVzb3VyY2VfY2JrKCkgLSBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIGluIHRoZSAKKyAgY2FzZSB3aGVyZSBWT1MgcGFja2V0cyBhcmUgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSBvZiB0aGUgY2FsbCB0byBnZXQgCisgIHBhY2tldHMuIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgaW52b2tlZCBieSBWT1Mgd2hlbiBwYWNrZXRzIGFyZSAKKyAgYXZhaWxhYmxlLgorCisgIEBwYXJhbSBwVm9zUGFja2V0IDogW2luXSAgcG9pbnRlciB0byBWT1MgcGFja2V0IAorICBAcGFyYW0gdXNlckRhdGEgICA6IFtpbl0gIG9wYXF1ZSB1c2VyIGRhdGEgdGhhdCB3YXMgcGFzc2VkIGluaXRpYWxseSAKKyAgCisgIEByZXR1cm4gICAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZCwgCisgICAgICAgICAgICAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIGhkZF90eF9sb3dfcmVzb3VyY2VfY2JrKCB2b3NfcGt0X3QgKnBWb3NQYWNrZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKnVzZXJEYXRhICkKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgdl9TSU5UX3QgaSA9IDA7CisgICB2X1NJWkVfdCBzaXplID0gMDsKKyAgIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QgKil1c2VyRGF0YTsKKyAgIAorICAgaWYocEFkYXB0ZXIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEhERCBhZGFwdGVyIGNvbnRleHQgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vUmV0dXJuIHRoZSBwYWNrZXQgdG8gVk9TLiBXZSBqdXN0IG5lZWRlZCB0byBrbm93IHRoYXQgVk9TIGlzIG91dCBvZiBsb3cgcmVzb3VyY2UKKyAgIC8vc2l0dWF0aW9uLiBIZXJlIHdlIHdpbGwgb25seSBzaWduYWwgVEwgdGhhdCB0aGVyZSBpcyBhIHBlbmRpbmcgZGF0YSBmb3IgYSBTVEEuIAorICAgLy9WT1MgcGFja2V0IHdpbGwgYmUgcmVxdWVzdGVkIChpZiBuZWVkZWQpIHdoZW4gVEwgY29tZXMgYmFjayB0byBmZXRjaCBkYXRhLgorICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwVm9zUGFja2V0ICk7CisKKyAgIHBBZGFwdGVyLT5pc1Zvc091dE9mUmVzb3VyY2UgPSBWT1NfRkFMU0U7CisKKyAgIC8vSW5kaWNhdGUgdG8gVEwgdGhhdCB0aGVyZSBpcyBwZW5kaW5nIGRhdGEgaWYgYSBxdWV1ZSBpcyBub24gZW1wdHkKKyAgIGZvciggaT1OVU1fVFhfUVVFVUVTLTE7IGk+PTA7IC0taSApCisgICB7CisgICAgICBzaXplID0gMDsKKyAgICAgIGhkZF9saXN0X3NpemUoICZwQWRhcHRlci0+d21tX3R4X3F1ZXVlW2ldLCAmc2l6ZSApOworICAgICAgaWYgKCBzaXplID4gMCApCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBXTEFOVExfU1RBUGt0UGVuZGluZyggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5zdGFJZCBbMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfQUNFbnVtVHlwZSlpICk7CisgICAgICAgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogRmFpbHVyZSBpbiBpbmRpY2F0aW5nIHBrdCB0byBUTCBmb3IgYWM9JWQiLCBfX0ZVTkNUSU9OX18saSk7IAorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9yeF9wYWNrZXRfY2JrKCkgLSBSZWNlaXZlIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCBUTC4KKyAgVEwgd2lsbCBjYWxsIHRoaXMgdG8gbm90aWZ5IHRoZSBIREQgd2hlbiBvbmUgb3IgbW9yZSBwYWNrZXRzIHdlcmUKKyAgcmVjZWl2ZWQgZm9yIGEgcmVnaXN0ZXJlZCBTVEEuCisKKyAgQHBhcmFtIHZvc0NvbnRleHQgICAgICA6IFtpbl0gcG9pbnRlciB0byBWT1MgY29udGV4dCAgCisgIEBwYXJhbSBwVm9zUGFja2V0Q2hhaW4gOiBbaW5dIHBvaW50ZXIgdG8gVk9TIHBhY2tldCBjaGFpbgorICBAcGFyYW0gc3RhSWQgICAgICAgICAgIDogW2luXSBTdGF0aW9uIElkCisgIEBwYXJhbSBwUnhNZXRhSW5mbyAgICAgOiBbaW5dIHBvaW50ZXIgdG8gbWV0YSBpbmZvIGZvciB0aGUgcmVjZWl2ZWQgcGt0KHMpIAorCisgIEByZXR1cm4gICAgICAgICAgICAgICAgOiBWT1NfU1RBVFVTX0VfRkFJTFVSRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3J4X3BhY2tldF9jYmsoIHZfVk9JRF90ICp2b3NDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfdCAqcFZvc1BhY2tldENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHN0YUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlKiBwUnhNZXRhSW5mbyApCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IE5VTEw7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gTlVMTDsKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICBpbnQgcnhzdGF0OworICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisgICB2b3NfcGt0X3QqIHBWb3NQYWNrZXQ7CisgICB2b3NfcGt0X3QqIHBOZXh0Vm9zUGFja2V0OworCisgICAvL1Nhbml0eSBjaGVjayBvbiBpbnB1dHMKKyAgIGlmICggKCBOVUxMID09IHZvc0NvbnRleHQgKSB8fCAKKyAgICAgICAgKCBOVUxMID09IHBWb3NQYWNrZXRDaGFpbiApIHx8CisgICAgICAgICggTlVMTCA9PSBwUnhNZXRhSW5mbyApICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IE51bGwgcGFyYW1zIGJlaW5nIHBhc3NlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9IREQsIHZvc0NvbnRleHQgKTsKKyAgIGlmICggTlVMTCA9PSBwSGRkQ3R4ICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEhERCBhZGFwdGVyIGNvbnRleHQgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHBBZGFwdGVyID0gcEhkZEN0eC0+c3RhX3RvX2FkYXB0ZXJbc3RhSWRdOworICAgaWYoIE5VTEwgPT0gcEFkYXB0ZXIgKQorICAgeworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy5yeENoYWluczsKKworICAgLy8gd2FsayB0aGUgY2hhaW4gdW50aWwgYWxsIGFyZSBwcm9jZXNzZWQKKyAgIHBWb3NQYWNrZXQgPSBwVm9zUGFja2V0Q2hhaW47CisgICBkbworICAgeworICAgICAgLy8gZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IHBhY2tldCBpbiB0aGUgY2hhaW4KKyAgICAgIC8vIChidXQgZG9uJ3QgdW5saW5rIHRoZSBwYWNrZXQgc2luY2Ugd2UgZnJlZSB0aGUgZW50aXJlIGNoYWluIGxhdGVyKQorICAgICAgc3RhdHVzID0gdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggcFZvc1BhY2tldCwgJnBOZXh0Vm9zUGFja2V0LCBWT1NfRkFMU0UpOworCisgICAgICAvLyBib3RoICJzdWNjZXNzIiBhbmQgImVtcHR5IiBhcmUgYWNjZXB0YWJsZSByZXN1bHRzCisgICAgICBpZiAoISgoc3RhdHVzID09IFZPU19TVEFUVVNfU1VDQ0VTUykgfHwgKHN0YXR1cyA9PSBWT1NfU1RBVFVTX0VfRU1QVFkpKSkKKyAgICAgIHsKKyAgICAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMucnhEcm9wcGVkOworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogRmFpbHVyZSB3YWxraW5nIHBhY2tldCBjaGFpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisKKyAgICAgIC8vIEV4dHJhY3QgdGhlIE9TIHBhY2tldCAoc2tiKS4KKyAgICAgIC8vIFRlbGwgVk9TIHRvIGRldGFjaCB0aGUgT1MgcGFja2V0IGZyb20gdGhlIFZPUyBwYWNrZXQKKyAgICAgIHN0YXR1cyA9IHZvc19wa3RfZ2V0X29zX3BhY2tldCggcFZvc1BhY2tldCwgKHZfVk9JRF90ICoqKSZza2IsIFZPU19UUlVFICk7CisgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSkKKyAgICAgIHsKKyAgICAgICAgICsrcEFkYXB0ZXItPmhkZF9zdGF0cy5oZGRUeFJ4U3RhdHMucnhEcm9wcGVkOworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogRmFpbHVyZSBleHRyYWN0aW5nIHNrYiBmcm9tIHZvcyBwa3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgfQorICAgCisgICAgICBza2ItPmRldiA9IHBBZGFwdGVyLT5kZXY7CisgICAgICBza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7CisgICAgICBza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy5yeFBhY2tldHM7CisgICAgICArK3BBZGFwdGVyLT5zdGF0cy5yeF9wYWNrZXRzOworICAgICAgcEFkYXB0ZXItPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworICAgICAgcnhzdGF0ID0gbmV0aWZfcnhfbmkoc2tiKTsKKyAgICAgIGlmIChORVRfUlhfU1VDQ0VTUyA9PSByeHN0YXQpCisgICAgICB7CisgICAgICAgICArK3BBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnJ4RGVsaXZlcmVkOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgKytwQWRhcHRlci0+aGRkX3N0YXRzLmhkZFR4UnhTdGF0cy5yeFJlZnVzZWQ7CisgICAgICB9CisgICAgICAvLyBub3cgcHJvY2VzcyB0aGUgbmV4dCBwYWNrZXQgaW4gdGhlIGNoYWluCisgICAgICBwVm9zUGFja2V0ID0gcE5leHRWb3NQYWNrZXQ7CisKKyAgIH0gd2hpbGUgKHBWb3NQYWNrZXQpOworCisgICAvL1JldHVybiB0aGUgZW50aXJlIFZPUyBwYWNrZXQgY2hhaW4gdG8gdGhlIHJlc291cmNlIHBvb2wKKyAgIHN0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BhY2tldENoYWluICk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IEZhaWx1cmUgcmV0dXJuaW5nIHZvcyBwa3QiLCBfX0ZVTkNUSU9OX18pOworICAgfQorICAgCisgICBwQWRhcHRlci0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworICAgcmV0dXJuIHN0YXR1czsgICAKK30KKwpkaWZmIC0tZ2l0IGEvQ09SRS9IREQvc3JjL3dsYW5faGRkX3dleHQuYyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF93ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjM2NjNwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF93ZXh0LmMKQEAgLTAsMCArMSw2MDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKworCisgICAgXGZpbGUgd2xhbl9oZGRfd2V4dC5jCisKKyAgICBcYnJpZWYgQWlyZ28gTGludXggV2lyZWxlc3MgRXh0ZW5zaW9ucyBDb21tb24gQ29udHJvbCBQbGFuZSBUeXBlcyBhbmQKKyAgICBpbnRlcmZhY2VzLgorCisgICAgJElkOiB3bGFuX2hkZF93ZXh0LmMsdiAxLjM0IDIwMDcvMDQvMTQgMDE6NDk6MjMgamlteiBFeHAgamlteiAkCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDcgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZAorCisgICAgVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSB0eXBlcyB0aGF0IGFyZSB1dGlsaXplZCBieSB0aGUgQ0NQIG1vZHVsZQorICAgIG9mIHRoZSAiUG9ydGFibGUiIEhERC4gICBUaGlzIGZpbGUgYWxzbyBpbmNsdWRlcyB0aGUgdW5kZXJseWluZyBMaW51eAorICAgIFdpcmVsZXNzIEV4dGVuc2lvbnMgRGF0YSB0eXBlcyByZWZlcnJlZCB0byBieSBDQ1AuCisKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaW5jbHVkZXMuaD4KKyNpbmNsdWRlIDx3bGFuX2J0Y19zdmMuaD4KKyNpbmNsdWRlIDx3bGFuX25saW5rX2NvbW1vbi5oPgorI2lmZGVmIFdMQU5fQlRBTVBfRkVBVFVSRQorI2luY2x1ZGUgPGJhcF9oZGRfbWFpbi5oPgorI2VuZGlmCisjaW5jbHVkZSA8dm9zX2FwaS5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlICJjY21BcGkuaCIKKyNpbmNsdWRlICJzaXJQYXJhbXMuaCIKKyNpbmNsdWRlICJjc3JBcGkuaCIKKyNpbmNsdWRlICJjc3JJbnNpZGVBcGkuaCIKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNpbmNsdWRlICJzbWVScm1JbnRlcm5hbC5oIgorI2VuZGlmCisjaW5jbHVkZSA8YW5pR2xvYmFsLmg+CisjaW5jbHVkZSAiZG90MTFmLmgiCisjaW5jbHVkZSA8d2xhbl9oZGRfd293bC5oPgorI2luY2x1ZGUgPHdsYW5faGRkX2NmZy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dtbS5oPgorI2luY2x1ZGUgInV0aWxzQXBpLmgiCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorI2luY2x1ZGUgIndsYW5faGRkX3AycC5oIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAorI2luY2x1ZGUgPGxpbnV4L2Vhcmx5c3VzcGVuZC5oPgorI2VuZGlmCisjaW5jbHVkZSAid2xhbl9oZGRfcG93ZXIuaCIKKyNpbmNsdWRlICJxd2xhbl92ZXJzaW9uLmgiCisjaW5jbHVkZSA8dm9zX3Bvd2VyLmg+CisjaW5jbHVkZSAid2xhbl9oZGRfaG9zdF9vZmZsb2FkLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfa2VlcF9hbGl2ZS5oIgorI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisjaW5jbHVkZSAid2xhbl9oZGRfcGFja2V0X2ZpbHRlcmluZy5oIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3RyYWNlLmgiCisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9taXNjLmgiCisjaW5jbHVkZSAiYmFwX2hkZF9taXNjLmgiCisKKyNpbmNsdWRlICJ3bGFuX2hkZF9kZXZfcHdyLmgiCisjaW5jbHVkZSAicWNfc2FwX2lvY3RsLmgiCisjZGVmaW5lIFdFX01BWF9TVFJfTEVOIDEwMjQKKworI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECitleHRlcm4gdm9pZCBoZGRfc3VzcGVuZF93bGFuKHN0cnVjdCBlYXJseV9zdXNwZW5kICp3bGFuX3N1c3BlbmQpOworZXh0ZXJuIHZvaWQgaGRkX3Jlc3VtZV93bGFuKHN0cnVjdCBlYXJseV9zdXNwZW5kICp3bGFuX3N1c3BlbmQpOworI2VuZGlmCisKKworI2RlZmluZSBIRERfRklOSVNIX1VMQV9USU1FX09VVCAgICA4MDAKKworZXh0ZXJuIGludCB3bGFuX2hkZF9jZmc4MDIxMV91cGRhdGVfYmFuZChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBlQ3NyQmFuZCBlQmFuZCk7CitpbnQgaGRkX3NldEJhbmRfaGVscGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHRBTklfVTgqIHB0cik7CisKK3N0YXRpYyBpbnQgaW9jdGxfZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGlvY3RsX2RlYnVnLCBpbnQsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworCitzdHJ1Y3Qgc3RhdHNDb250ZXh0Cit7CisgICBzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisgICB1bnNpZ25lZCBpbnQgbWFnaWM7Cit9OworCisjZGVmaW5lIFNUQVRTX0NPTlRFWFRfTUFHSUMgMHg1MzU0NDE1NCAgIC8vU1RBVAorI2RlZmluZSBSU1NJX0NPTlRFWFRfTUFHSUMgIDB4NTI1MzUzNDkgICAvL1JTU0kKKyNkZWZpbmUgUE9XRVJfQ09OVEVYVF9NQUdJQyAweDUwNEY1NzUyICAgLy8gUE9XUgorCisvKiBUbyBWYWxpZGF0ZSBDaGFubmVsIGFnYWluc3QgdGhlIEZyZXF1ZW5jeSBhbmQgVmljZS1WZXJzYSAqLworc3RhdGljIGNvbnN0IGhkZF9mcmVxX2NoYW5fbWFwX3QgZnJlcV9jaGFuX21hcFtdID0geyB7MjQxMiwgMX0sIHsyNDE3LCAyfSwKKyAgICAgICAgezI0MjIsIDN9LCB7MjQyNywgNH0sIHsyNDMyLCA1fSwgezI0MzcsIDZ9LCB7MjQ0MiwgN30sIHsyNDQ3LCA4fSwKKyAgICAgICAgezI0NTIsIDl9LCB7MjQ1NywgMTB9LCB7MjQ2MiwgMTF9LCB7MjQ2NyAsMTJ9LCB7MjQ3MiwgMTN9LAorICAgICAgICB7MjQ4NCwgMTR9LCB7NDkyMCwgMjQwfSwgezQ5NDAsIDI0NH0sIHs0OTYwLCAyNDh9LCB7NDk4MCwgMjUyfSwKKyAgICAgICAgezUwNDAsIDIwOH0sIHs1MDYwLCAyMTJ9LCB7NTA4MCwgMjE2fSwgezUxODAsIDM2fSwgezUyMDAsIDQwfSwgezUyMjAsIDQ0fSwKKyAgICAgICAgezUyNDAsIDQ4fSwgezUyNjAsIDUyfSwgezUyODAsIDU2fSwgezUzMDAsIDYwfSwgezUzMjAsIDY0fSwgezU1MDAsIDEwMH0sCisgICAgICAgIHs1NTIwLCAxMDR9LCB7NTU0MCwgMTA4fSwgezU1NjAsIDExMn0sIHs1NTgwLCAxMTZ9LCB7NTYwMCwgMTIwfSwKKyAgICAgICAgezU2MjAsIDEyNH0sIHs1NjQwLCAxMjh9LCB7NTY2MCwgMTMyfSwgezU2ODAsIDEzNn0sIHs1NzAwLCAxNDB9LAorICAgICAgICB7NTc0NSwgMTQ5fSwgezU3NjUsIDE1M30sIHs1Nzg1LCAxNTd9LCB7NTgwNSwgMTYxfSwgezU4MjUsIDE2NX0gfTsKKworI2RlZmluZSBGUkVRX0NIQU5fTUFQX1RBQkxFX1NJWkUgc2l6ZW9mKGZyZXFfY2hhbl9tYXApL3NpemVvZihmcmVxX2NoYW5fbWFwWzBdKQorCisvKiBQcml2YXRlIGlvY3RscyBhbmQgdGhlaXIgc3ViLWlvY3RscyAqLworI2RlZmluZSBXTEFOX1BSSVZfU0VUX0lOVF9HRVRfTk9ORSAgICAoU0lPQ0lXRklSU1RQUklWICsgMCkKKyNkZWZpbmUgV0VfU0VUXzExRF9TVEFURSAgICAgMQorI2RlZmluZSBXRV9XT1dMICAgICAgICAgICAgICAyCisjZGVmaW5lIFdFX1NFVF9QT1dFUiAgICAgICAgIDMKKyNkZWZpbmUgV0VfU0VUX01BWF9BU1NPQyAgICAgNAorI2RlZmluZSBXRV9TRVRfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT04gICAgIDUKKyNkZWZpbmUgV0VfU0VUX0RBVEFfSU5BQ1RJVklUWV9UTyAgNgorI2RlZmluZSBXRV9TRVRfTUFYX1RYX1BPV0VSICA3CisjZGVmaW5lIFdFX1NFVF9ISUdIRVJfRFRJTV9UUkFOU0lUSU9OICAgOAorI2RlZmluZSBXRV9TRVRfVE1fTEVWRUwgICAgICA5CisKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fUFJJVl9TRVRfTk9ORV9HRVRfSU5UICAgIChTSU9DSVdGSVJTVFBSSVYgKyAxKQorI2RlZmluZSBXRV9HRVRfMTFEX1NUQVRFICAgICAxCisjZGVmaW5lIFdFX0lCU1NfU1RBVFVTICAgICAgIDIKKyNkZWZpbmUgV0VfUE1DX1NUQVRFICAgICAgICAgMworI2RlZmluZSBXRV9HRVRfV0xBTl9EQkcgICAgICA0CisjZGVmaW5lIFdFX01PRFVMRV9ET1dOX0lORCAgIDUKKyNkZWZpbmUgV0VfR0VUX01BWF9BU1NPQyAgICAgNgorI2RlZmluZSBXRV9HRVRfV0RJX0RCRyAgICAgICA3CisjZGVmaW5lIFdFX0dFVF9TQVBfQVVUT19DSEFOTkVMX1NFTEVDVElPTiA4CisjZGVmaW5lIFdFX0dFVF9DT05DVVJSRU5DWV9NT0RFIDkKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fUFJJVl9TRVRfSU5UX0dFVF9JTlQgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAyKQorCisvKiBQcml2YXRlIGlvY3RscyBhbmQgdGhlaXIgc3ViLWlvY3RscyAqLworI2RlZmluZSBXTEFOX1BSSVZfU0VUX0NIQVJfR0VUX05PTkUgICAoU0lPQ0lXRklSU1RQUklWICsgMykKKyNkZWZpbmUgV0VfV09XTF9BRERfUFRSTiAgICAgMQorI2RlZmluZSBXRV9XT1dMX0RFTF9QVFJOICAgICAyCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisjZGVmaW5lIFdFX05FSUdIQk9SX1JFUE9SVF9SRVFVRVNUIDMKKyNlbmRpZgorI2RlZmluZSBXRV9TRVRfQVBfV1BTX0lFICAgICA0ICAvL1RoaXMgaXMgY2FsbGVkIGluIHN0YXRpb24gbW9kZSB0byBzZXQgcHJvYmUgcnNwIGllLgorI2RlZmluZSBXRV9TRVRfQ09ORklHICAgICAgICA1CisKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fUFJJVl9TRVRfVEhSRUVfSU5UX0dFVF9OT05FICAgKFNJT0NJV0ZJUlNUUFJJViArIDQpCisjZGVmaW5lIFdFX1NFVF9XTEFOX0RCRyAgICAgIDEKKyNkZWZpbmUgV0VfU0VUX1dESV9EQkcgICAgICAgMgorI2RlZmluZSBXRV9TRVRfU0FQX0NIQU5ORUxTICAzCisKKy8qIFByaXZhdGUgaW9jdGxzIGFuZCB0aGVpciBzdWItaW9jdGxzICovCisjZGVmaW5lIFdMQU5fUFJJVl9HRVRfQ0hBUl9TRVRfTk9ORSAgIChTSU9DSVdGSVJTVFBSSVYgKyA1KQorI2RlZmluZSBXRV9XTEFOX1ZFUlNJT04gICAgICAxCisjZGVmaW5lIFdFX0dFVF9TVEFUUyAgICAgICAgIDIKKyNkZWZpbmUgV0VfR0VUX0NGRyAgICAgICAgICAgMworI2RlZmluZSBXRV9HRVRfV01NX1NUQVRVUyAgICA0CisjZGVmaW5lIFdFX0dFVF9DSEFOTkVMX0xJU1QgIDUKKworLyogUHJpdmF0ZSBpb2N0bHMgYW5kIHRoZWlyIHN1Yi1pb2N0bHMgKi8KKyNkZWZpbmUgV0xBTl9QUklWX1NFVF9OT05FX0dFVF9OT05FICAgKFNJT0NJV0ZJUlNUUFJJViArIDYpCisjZGVmaW5lIFdFX0NMRUFSX1NUQVRTICAgICAgIDEKKyNkZWZpbmUgV0VfSU5JVF9BUCAgICAgICAgICAgMgorI2RlZmluZSBXRV9TVE9QX0FQICAgICAgICAgICAzCisjZGVmaW5lIFdFX0VOQUJMRV9BTVAgICAgICAgIDQKKyNkZWZpbmUgV0VfRElTQUJMRV9BTVAgICAgICAgNQorCisvKiBQcml2YXRlIGlvY3RscyBhbmQgdGhlaXIgc3ViLWlvY3RscyAqLworI2RlZmluZSBXTEFOX1BSSVZfU0VUX1ZBUl9JTlRfR0VUX05PTkUgICAoU0lPQ0lXRklSU1RQUklWICsgNykKKyNkZWZpbmUgV0VfTE9HX0RVTVBfQ01EICAgICAgMQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorI2RlZmluZSBXRV9QMlBfTk9BX0NNRCAgICAgICAyCisjZW5kaWYKKworI2RlZmluZSBNQVhfVkFSX0FSR1MgICAgICAgICA3CisKKy8qIFByaXZhdGUgaW9jdGxzICh3aXRoIG5vIHN1Yi1pb2N0bHMpICovCisvKiBub3RlIHRoYXQgdGhleSBtdXN0IGJlIG9kZCBzbyB0aGF0IHRoZXkgaGF2ZSAiZ2V0IiBzZW1hbnRpY3MgKi8KKyNkZWZpbmUgV0xBTl9QUklWX0FERF9UU1BFQyAoU0lPQ0lXRklSU1RQUklWICsgIDkpCisjZGVmaW5lIFdMQU5fUFJJVl9ERUxfVFNQRUMgKFNJT0NJV0ZJUlNUUFJJViArIDExKQorI2RlZmluZSBXTEFOX1BSSVZfR0VUX1RTUEVDIChTSU9DSVdGSVJTVFBSSVYgKyAxMykKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisvKiBQcml2YXRlIGlvY3RscyBFVkVOIE5POiBTRVQsIE9ERCBOTzpHRVQgKi8KKyNkZWZpbmUgV0xBTl9QUklWX1NFVF9XQVBJX01PREUgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgOCkKKyNkZWZpbmUgV0xBTl9QUklWX0dFVF9XQVBJX01PREUgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMTYpCisjZGVmaW5lIFdMQU5fUFJJVl9TRVRfV0FQSV9BU1NPQ19JTkZPICAgKFNJT0NJV0ZJUlNUUFJJViArIDEwKQorI2RlZmluZSBXTEFOX1BSSVZfU0VUX1dBUElfS0VZICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAxMikKKyNkZWZpbmUgV0xBTl9QUklWX1NFVF9XQVBJX0JLSUQgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMTQpCisjZGVmaW5lIFdMQU5fUFJJVl9HRVRfV0FQSV9CS0lEICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDE1KQorI2RlZmluZSBXQVBJX1BTS19BS01fU1VJVEUgIDB4MDI3MjE0MDAKKyNkZWZpbmUgV0FQSV9DRVJUX0FLTV9TVUlURSAweDAxNzIxNDAwCisjZW5kaWYKKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNkZWZpbmUgV0xBTl9QUklWX1NFVF9GVElFUyAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMjApCisjZW5kaWYKKworLyogUHJpdmF0ZSBpb2N0bCBmb3Igc2V0dGluZyB0aGUgaG9zdCBvZmZsb2FkIGZlYXR1cmUgKi8KKyNkZWZpbmUgV0xBTl9QUklWX1NFVF9IT1NUX09GRkxPQUQgKFNJT0NJV0ZJUlNUUFJJViArIDE4KQorCisvKiBQcml2YXRlIGlvY3RsIHRvIGdldCB0aGUgc3RhdGlzdGljcyAqLworI2RlZmluZSBXTEFOX0dFVF9XTEFOX1NUQVRJU1RJQ1MgKFNJT0NJV0ZJUlNUUFJJViArIDIxKQorCisvKiBQcml2YXRlIGlvY3RsIHRvIHNldCB0aGUgS2VlcCBBbGl2ZSBQYXJhbXMgKi8KKyNkZWZpbmUgV0xBTl9TRVRfS0VFUEFMSVZFX1BBUkFNUyAoU0lPQ0lXRklSU1RQUklWICsgMjIpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKy8qIFByaXZhdGUgaW9jdGwgdG8gc2V0IHRoZSBQYWNrZXQgRmlsdGVyaW5nIFBhcmFtcyAqLworI2RlZmluZSBXTEFOX1NFVF9QQUNLRVRfRklMVEVSX1BBUkFNUyAoU0lPQ0lXRklSU1RQUklWICsgMjMpCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworLyogUHJpdmF0ZSBpb2N0bCB0byBnZXQgdGhlIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgV0xBTl9TRVRfUE5PIChTSU9DSVdGSVJTVFBSSVYgKyAyNCkKKyNlbmRpZgorCisjZGVmaW5lIFdMQU5fU0VUX0JBTkRfQ09ORklHICAoU0lPQ0lXRklSU1RQUklWICsgMjUpICAvKkRvbid0IGNoYW5nZSB0aGlzIG51bWJlciovCisKKyNkZWZpbmUgV0xBTl9QUklWX1NFVF9NQ0JDX0ZJTFRFUiAgICAoU0lPQ0lXRklSU1RQUklWICsgMjYpCisjZGVmaW5lIFdMQU5fUFJJVl9DTEVBUl9NQ0JDX0ZJTFRFUiAgKFNJT0NJV0ZJUlNUUFJJViArIDI3KQorI2RlZmluZSBXTEFOX1NFVF9QT1dFUl9QQVJBTVMgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAyOSkKKyNkZWZpbmUgV0xBTl9HRVRfTElOS19TUEVFRCAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMzEpCisKKyNkZWZpbmUgV0xBTl9TVEFUU19JTlZBTElEICAgICAgICAgICAgMAorI2RlZmluZSBXTEFOX1NUQVRTX1JFVFJZX0NOVCAgICAgICAgICAxCisjZGVmaW5lIFdMQU5fU1RBVFNfTVVMX1JFVFJZX0NOVCAgICAgIDIKKyNkZWZpbmUgV0xBTl9TVEFUU19UWF9GUk1fQ05UICAgICAgICAgMworI2RlZmluZSBXTEFOX1NUQVRTX1JYX0ZSTV9DTlQgICAgICAgICA0CisjZGVmaW5lIFdMQU5fU1RBVFNfRlJNX0RVUF9DTlQgICAgICAgIDUKKyNkZWZpbmUgV0xBTl9TVEFUU19GQUlMX0NOVCAgICAgICAgICAgNgorI2RlZmluZSBXTEFOX1NUQVRTX1JUU19GQUlMX0NOVCAgICAgICA3CisjZGVmaW5lIFdMQU5fU1RBVFNfQUNLX0ZBSUxfQ05UICAgICAgIDgKKyNkZWZpbmUgV0xBTl9TVEFUU19SVFNfU1VDX0NOVCAgICAgICAgOQorI2RlZmluZSBXTEFOX1NUQVRTX1JYX0RJU0NBUkRfQ05UICAgICAxMAorI2RlZmluZSBXTEFOX1NUQVRTX1JYX0VSUk9SX0NOVCAgICAgICAxMQorI2RlZmluZSBXTEFOX1NUQVRTX1RYX0JZVEVfQ05UICAgICAgICAxMgorCisjZGVmaW5lIFdMQU5fU1RBVFNfUlhfQllURV9DTlQgICAgICAgIDEzCisjZGVmaW5lIFdMQU5fU1RBVFNfUlhfUkFURSAgICAgICAgICAgIDE0CisjZGVmaW5lIFdMQU5fU1RBVFNfVFhfUkFURSAgICAgICAgICAgIDE1CisKKyNkZWZpbmUgRklMTF9UTFYoX19wLCBfX3R5cGUsIF9fc2l6ZSwgX192YWwsIF9fdGxlbikgXAore1wKKyAgICBpZiAoKF9fdGxlbiArIF9fc2l6ZSArIDIpIDwgV0VfTUFYX1NUUl9MRU4pIFwKKyAgICB7XAorICAgICAgICAqX19wKysgPSBfX3R5cGU7XAorICAgICAgICAqX19wKysgPSBfX3NpemU7XAorICAgICAgICBtZW1jcHkoX19wLCBfX3ZhbCwgX19zaXplKTtcCisgICAgICAgIF9fcCArPSBfX3NpemU7XAorICAgICAgICBfX3RsZW4gKz0gX19zaXplICsgMjtcCisgICAgfVwKKyAgICBlbHNlIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRklMTF9UTFYgRmFpbGVkISEhXG4iKTtcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK313aGlsZSgwKTsKKworI2RlZmluZSBWRVJTSU9OX1ZBTFVFX01BWF9MRU4gMzIKKworI2RlZmluZSBUWF9QRVJfVFJBQ0tJTkdfREVGQVVMVF9SQVRJTyAgICAgICAgICAgICA1CisjZGVmaW5lIFRYX1BFUl9UUkFDS0lOR19NQVhfUkFUSU8gICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVFhfUEVSX1RSQUNLSU5HX0RFRkFVTFRfV0FURVJNQVJLICAgICAgICAgNQorCisjZGVmaW5lIFdMQU5fSEREX1VJX0JBTkRfQVVUTyAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV0xBTl9IRERfVUlfQkFORF81X0dIWiAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTEFOX0hERF9VSV9CQU5EXzJfNF9HSFogICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdMQU5fSEREX1VJX1NFVF9CQU5EX1ZBTFVFX09GRlNFVCAgICAgICAgIDgKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCitpbnQgd2xhbl9oZGRfc2V0X2ZpbHRlcihoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0cFBhY2tldEZpbHRlckNmZyBwUmVxdWVzdCk7Cit2b2lkIHdsYW5faGRkX3NldF9tY19hZGRyX2xpc3QoaGRkX2NvbnRleHRfdCAqcEhkZEN0eCwgdl9VOF90IHNldCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBoZGRfd2xhbl9nZXRfdmVyc2lvbigpIC0KKworICAgVGhpcyBmdW5jdGlvbiB1c2UgdG8gZ2V0IFdsYW4gRHJpdmVyIEFuZCBGaXJtd2FyZSBWZXJzaW9uLgorCisgIFxwYXJhbSAgLSBwQWRhcHRlciBQb2ludGVyIHRvIHRoZSBhZGFwdGVyLgorICAgICAgICAgICAgd3JxdSAtIFBvaW50ZXIgdG8gSU9DVEwgUkVRVUVTVCBEYXRhLgorICAgICAgICAgICAgZXh0cmEgLSBQb2ludGVyIHRvIGNoYXIKKworICBccmV0dXJuIC0gMCBmb3Igc3VjY2Vzcywgbm9uIHplcm8gZm9yIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaGRkX3dsYW5fZ2V0X3ZlcnNpb24oaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXh0cmEpCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgRndWZXJzaW9uSW5mbyBmd3ZlcnNpb247CisgICAgdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworICAgIHZfVTMyX3QgcmVnX3ZhbDsKKyAgICBjaGFyICpidWYgPSBleHRyYTsKKworICAgIGJ1ZiArPSBzbnByaW50ZihidWYsIFZFUlNJT05fVkFMVUVfTUFYX0xFTiwgIiVzXyIsIFdMQU5fQ0hJUF9WRVJTSU9OKTsKKyAgICAvKlJlYWQgdGhlIFJldklEKi8KKyAgICBzdGF0dXMgPSBzbWVfRGJnUmVhZFJlZ2lzdGVyKGhIYWwsIFFXTEFOX1JGQVBCX1JFVl9JRF9SRUcsICZyZWdfdmFsKTsKKworICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIEZhaWxlZCEhIVxuIiwgX19mdW5jX18pOworICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGJ1ZiArPSBzbnByaW50ZihidWYsIFZFUlNJT05fVkFMVUVfTUFYX0xFTiwgIiV4LiV4LSIsICh2X1U4X3QpKHJlZ192YWwgPj4gOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVThfdCkocmVnX3ZhbCAmIDB4MDAwMDAwRkYpKTsKKworICAgIHN0YXR1cyA9IHNtZV9HZXRGd1ZlcnNpb24oaEhhbCwgJmZ3dmVyc2lvbik7CisKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgRmFpbGVkISEhXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBidWYgKz0gc25wcmludGYoYnVmLCBWRVJTSU9OX1ZBTFVFX01BWF9MRU4sICIlcy0iLCBRV0xBTl9WRVJTSU9OU1RSKTsKKyAgICBidWYgKz0gc25wcmludGYoYnVmLCBWRVJTSU9OX1ZBTFVFX01BWF9MRU4sICIlbGQuJWxkLiVsZC4lbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnd2ZXJzaW9uLnVNaiwgZnd2ZXJzaW9uLnVNbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ3dmVyc2lvbi51UGF0Y2gsIGZ3dmVyc2lvbi51QnVpbGQpOworICAgIHdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKTsKKworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKK2ludCBoZGRfd2xhbl9nZXRfcnRzX3RocmVzaG9sZChoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSkKK3sKKyAgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisgICAgdl9VMzJfdCB0aHJlc2hvbGQgPSAwLHN0YXR1cyA9IDA7CisKKyAgICBFTlRFUigpOworCisgICAgaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsX19mdW5jX18pOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0KKyAgICAgICAgICAgICAgICAgICAgIGNjbUNmZ0dldEludChoSGFsLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsICZ0aHJlc2hvbGQpICkKKyAgICB7CisgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIHdycXUtPnJ0cy52YWx1ZSA9IHRocmVzaG9sZDsKKworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIlJ0cy1UaHJlc2hvbGQ9JWxkISFcbiIpLCB3cnF1LT5ydHMudmFsdWUpOworCisgICAgRVhJVCgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBoZGRfd2xhbl9nZXRfZnJhZ190aHJlc2hvbGQoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIsIHVuaW9uIGl3cmVxX2RhdGEgKndycXUpCit7CisgICAgdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworICAgIHZfVTMyX3QgdGhyZXNob2xkID0gMCxzdGF0dXMgPSAwOworCisgICAgRU5URVIoKTsKKworICAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKSB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKCBjY21DZmdHZXRJbnQoaEhhbCwgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwgJnRocmVzaG9sZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIHdycXUtPmZyYWcudmFsdWUgPSB0aHJlc2hvbGQ7CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiRnJhZy1UaHJlc2hvbGQ9JWxkISFcbiIpLCB3cnF1LT5mcmFnLnZhbHVlKTsKKworICAgIEVYSVQoKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgaGRkX3dsYW5fZ2V0X2ZyZXEodl9VMzJfdCBjaGFubmVsLCB2X1UzMl90ICpwZnJlcSkKK3sKKyAgICAgaWYoKGNoYW5uZWwgPiAwKSAmJiAoY2hhbm5lbCA8PSAoRlJFUV9DSEFOX01BUF9UQUJMRV9TSVpFIC0gMSkpKQorICAgICB7CisgICAgICAgKnBmcmVxID0gZnJlcV9jaGFuX21hcFtjaGFubmVsIC0gMV0uZnJlcSAqIDEwMDAwMDsKKyAgICAgICByZXR1cm4gMDsKKyAgICAgfQorICAgICBlbHNlCisgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2X0JPT0xfdAoraGRkX0lzQXV0aFR5cGVSU04oIHRIYWxIYW5kbGUgaGFsSGFuZGxlLCBlQ3NyQXV0aFR5cGUgYXV0aFR5cGUpCit7CisgICAgdl9CT09MX3QgcnNuVHlwZSA9IFZPU19GQUxTRTsKKyAgICAvLyBpcyB0aGUgYXV0aFR5cGUgc3VwcG9ydGVkPworICAgIHN3aXRjaCAoYXV0aFR5cGUpCisgICAgeworICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX05PTkU6ICAgIC8vbmV2ZXIgdXNlZAorICAgICAgICAgICAgcnNuVHlwZSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBNQUMgbGF5ZXIgYXV0aGVudGljYXRpb24gdHlwZXMKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTToKKyAgICAgICAgICAgIHJzblR5cGUgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOgorICAgICAgICAgICAgcnNuVHlwZSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX0FVVE9TV0lUQ0g6CisgICAgICAgICAgICByc25UeXBlID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gVXBwZXIgbGF5ZXIgYXV0aGVudGljYXRpb24gdHlwZXMKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEE6CisgICAgICAgICAgICByc25UeXBlID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLOgorICAgICAgICAgICAgcnNuVHlwZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBX05PTkU6CisgICAgICAgICAgICByc25UeXBlID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX0ZUX1JTTjoKKyNlbmRpZgorICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1JTTjoKKyAgICAgICAgICAgIHJzblR5cGUgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSzoKKyNlbmRpZgorICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1JTTl9QU0s6CisgICAgICAgICAgICByc25UeXBlID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy9jYXNlIGVDU1JfQVVUSF9UWVBFX0ZBSUxFRDoKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOgorICAgICAgICAgICAgcnNuVHlwZSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGRkTG9nKExPR0UsIEZMKCIlcyBjYWxsZWQgd2l0aCB1bmtub3duIGF1dGhUeXBlIC0gZGVmYXVsdCB0byBPcGVuLCBOb25lXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJzblR5cGUgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaGRkTG9nKExPR0UsIEZMKCIlcyBjYWxsZWQgd2l0aCBhdXRoVHlwZTogJWQsIHJldHVybmVkOiAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGF1dGhUeXBlLCByc25UeXBlKTsKKyAgICByZXR1cm4gcnNuVHlwZTsKK30KKworc3RhdGljIHZvaWQgaGRkX0dldFJzc2lDQiggdl9TN190IHJzc2ksIHRBTklfVTMyIHN0YUlkLCB2b2lkICpwQ29udGV4dCApCit7CisgICBzdHJ1Y3Qgc3RhdHNDb250ZXh0ICpwU3RhdHNDb250ZXh0OworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisKKyAgIGlmIChpb2N0bF9kZWJ1ZykKKyAgIHsKKyAgICAgIHByX2luZm8oIiVzOiByc3NpIFslZF0gU1RBIFslZF0gcENvbnRleHQgWyVwXVxuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAoaW50KXJzc2ksIChpbnQpc3RhSWQsIHBDb250ZXh0KTsKKyAgIH0KKworICAgaWYgKE5VTEwgPT0gcENvbnRleHQpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICIlczogQmFkIHBhcmFtLCBwQ29udGV4dCBbJXBdIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBDb250ZXh0KTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiB0aGF0IGV4aXN0cyBiZXR3ZWVuIHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24KKyAgICAgIGFuZCB0aGUgY2FsbGVyIHNpbmNlIHRoZSBjYWxsZXIgY291bGQgdGltZSBvdXQgZWl0aGVyIGJlZm9yZSBvcgorICAgICAgd2hpbGUgdGhpcyBjb2RlIGlzIGV4ZWN1dGluZy4gIHdlJ2xsIGFzc3VtZSB0aGUgdGltZW91dCBoYXNuJ3QKKyAgICAgIG9jY3VycmVkLCBidXQgd2UnbGwgdmVyaWZ5IHRoYXQgcmlnaHQgYmVmb3JlIHdlIHNhdmUgb3VyIHdvcmsgKi8KKworICAgcFN0YXRzQ29udGV4dCA9IHBDb250ZXh0OworICAgcEFkYXB0ZXIgICAgICA9IHBTdGF0c0NvbnRleHQtPnBBZGFwdGVyOworICAgaWYgKChOVUxMID09IHBBZGFwdGVyKSB8fCAoUlNTSV9DT05URVhUX01BR0lDICE9IHBTdGF0c0NvbnRleHQtPm1hZ2ljKSkKKyAgIHsKKyAgICAgIC8qIHRoZSBjYWxsZXIgcHJlc3VtYWJseSB0aW1lZCBvdXQgc28gdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gKi8KKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAiJXM6IEludmFsaWQgY29udGV4dCwgcEFkYXB0ZXIgWyVwXSBtYWdpYyBbJTA4eF0iLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBBZGFwdGVyLCBwU3RhdHNDb250ZXh0LT5tYWdpYyk7CisgICAgICBpZiAoaW9jdGxfZGVidWcpCisgICAgICB7CisgICAgICAgICBwcl9pbmZvKCIlczogSW52YWxpZCBjb250ZXh0LCBwQWRhcHRlciBbJXBdIG1hZ2ljIFslMDh4XVxuIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwQWRhcHRlciwgcFN0YXRzQ29udGV4dC0+bWFnaWMpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiB0aGUgcmFjZSBpcyBvbi4gIGNhbGxlciBjb3VsZCBoYXZlIHRpbWVkIG91dCBpbW1lZGlhdGVseSBhZnRlcgorICAgICAgd2UgdmVyaWZpZWQgdGhlIG1hZ2ljLCBidXQgaWYgc28sIGNhbGxlciB3aWxsIHdhaXQgYSBzaG9ydCB0aW1lCisgICAgICBmb3IgdXMgdG8gY29weSBvdmVyIHRoZSByc3NpICovCisgICBwQWRhcHRlci0+cnNzaSA9IHJzc2k7CisKKyAgIC8qIGFuZCBub3RpZnkgdGhlIGNhbGxlciAqLworICAgY29tcGxldGUoJnBTdGF0c0NvbnRleHQtPmNvbXBsZXRpb24pOworfQorCitWT1NfU1RBVFVTIHdsYW5faGRkX2dldF9yc3NpKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB2X1M3X3QgKnJzc2lfdmFsdWUpCit7CisgICBzdHJ1Y3Qgc3RhdHNDb250ZXh0IGNvbnRleHQ7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4OworICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHg7CisgICBlSGFsU3RhdHVzIGhzdGF0dXM7CisgICBsb25nIGxyYzsKKworICAgaWYgKE5VTEwgPT0gcEFkYXB0ZXIpCisgICB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiJXM6IEludmFsaWQgY29udGV4dCwgcEFkYXB0ZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKyAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKQorICAgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIixfX2Z1bmNfXyk7CisgICAgICAgLyogcmV0dXJuIGEgY2FjaGVkIHZhbHVlICovCisgICAgICAgKnJzc2lfdmFsdWUgPSBwQWRhcHRlci0+cnNzaTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgfQorCisgICBwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisgICBwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKyAgIGluaXRfY29tcGxldGlvbigmY29udGV4dC5jb21wbGV0aW9uKTsKKyAgIGNvbnRleHQucEFkYXB0ZXIgPSBwQWRhcHRlcjsKKyAgIGNvbnRleHQubWFnaWMgPSBSU1NJX0NPTlRFWFRfTUFHSUM7CisKKyAgIGhzdGF0dXMgPSBzbWVfR2V0UnNzaShwSGRkQ3R4LT5oSGFsLCBoZGRfR2V0UnNzaUNCLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5zdGFJZFsgMCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dCwgcEhkZEN0eC0+cHZvc0NvbnRleHQpOworICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gaHN0YXR1cykKKyAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogVW5hYmxlIHRvIHJldHJpZXZlIFJTU0kiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgIC8qIHdlJ2xsIHJldHVybmVkIGEgY2FjaGVkIHZhbHVlIGJlbG93ICovCisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgLyogcmVxdWVzdCB3YXMgc2VudCAtLSB3YWl0IGZvciB0aGUgcmVzcG9uc2UgKi8KKyAgICAgICBscmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmY29udGV4dC5jb21wbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9TVEFUUykpOworICAgICAgIC8qIGVpdGhlciB3ZSBoYXZlIGEgcmVzcG9uc2Ugb3Igd2UgdGltZWQgb3V0CisgICAgICAgICAgZWl0aGVyIHdheSwgZmlyc3QgaW52YWxpZGF0ZSBvdXIgbWFnaWMgKi8KKyAgICAgICBjb250ZXh0Lm1hZ2ljID0gMDsKKyAgICAgICBpZiAobHJjIDw9IDApCisgICAgICAgeworICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBTTUUgJXMgd2hpbGUgcmV0cmlldmluZyBSU1NJICIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKDAgPT0gbHJjKSA/ICJ0aW1lb3V0IiA6ICJpbnRlcnJ1cHQiKTsKKyAgICAgICAgICAvKiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIHN1Y2ggdGhhdCB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgICBmdW5jdGlvbiBjb3VsZCBiZSBleGVjdXRpbmcgYXQgdGhlIHNhbWUgdGltZSB3ZSBhcmUuIG9mCisgICAgICAgICAgICAgcHJpbWFyeSBjb25jZXJuIGlzIGlmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBoYWQgYWxyZWFkeQorICAgICAgICAgICAgIHZlcmlmaWVkIHRoZSAibWFnaWMiIGJ1dCBoYXNuJ3QgeWV0IHNldCB0aGUgY29tcGxldGlvbgorICAgICAgICAgICAgIHZhcmlhYmxlLiAgU2luY2UgdGhlIGNvbXBsZXRpb24gdmFyaWFibGUgaXMgb24gb3VyCisgICAgICAgICAgICAgc3RhY2ssIHdlJ2xsIGRlbGF5IGp1c3QgYSBiaXQgdG8gbWFrZSBzdXJlIHRoZSBkYXRhIGlzCisgICAgICAgICAgICAgc3RpbGwgdmFsaWQgaWYgdGhhdCBpcyB0aGUgY2FzZSAqLworICAgICAgICAgIG1zbGVlcCg1MCk7CisgICAgICAgICAgLyogd2UnbGwgbm93IHJldHVybmVkIGEgY2FjaGVkIHZhbHVlIGJlbG93ICovCisgICAgICAgfQorICAgfQorICAgKnJzc2lfdmFsdWUgPSBwQWRhcHRlci0+cnNzaTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBoZGRfU3RhdGlzdGljc0NCKCB2b2lkICpwU3RhdHMsIHZvaWQgKnBDb250ZXh0ICkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgICAgICAgICAgICAgKnBBZGFwdGVyICAgICAgPSAoaGRkX2FkYXB0ZXJfdCAqKXBDb250ZXh0OworICAgaGRkX3N0YXRzX3QgICAgICAgICAgICAgICAqcFN0YXRzQ2FjaGUgICA9IE5VTEw7CisgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlOworICAgVk9TX1NUQVRVUyB2b3Nfc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICB0Q3NyU3VtbWFyeVN0YXRzSW5mbyAgICAgICpwU3VtbWFyeVN0YXRzID0gTlVMTDsKKyAgIHRDc3JHbG9iYWxDbGFzc0FTdGF0c0luZm8gKnBDbGFzc0FTdGF0cyAgPSBOVUxMOworICAgdENzckdsb2JhbENsYXNzQlN0YXRzSW5mbyAqcENsYXNzQlN0YXRzICA9IE5VTEw7CisgICB0Q3NyR2xvYmFsQ2xhc3NDU3RhdHNJbmZvICpwQ2xhc3NDU3RhdHMgID0gTlVMTDsKKyAgIHRDc3JHbG9iYWxDbGFzc0RTdGF0c0luZm8gKnBDbGFzc0RTdGF0cyAgPSBOVUxMOworICAgdENzclBlclN0YVN0YXRzSW5mbyAgICAgICAqcFBlclN0YVN0YXRzICA9IE5VTEw7CisKKyAgIGlmIChwQWRhcHRlciE9IE5VTEwpCisgICAgIHBTdGF0c0NhY2hlID0gJnBBZGFwdGVyLT5oZGRfc3RhdHM7CisKKworICAgcFN1bW1hcnlTdGF0cyA9ICh0Q3NyU3VtbWFyeVN0YXRzSW5mbyAqKXBTdGF0czsKKyAgIHBDbGFzc0FTdGF0cyAgPSAodENzckdsb2JhbENsYXNzQVN0YXRzSW5mbyAqKSggcFN1bW1hcnlTdGF0cyArIDEgKTsKKyAgIHBDbGFzc0JTdGF0cyAgPSAodENzckdsb2JhbENsYXNzQlN0YXRzSW5mbyAqKSggcENsYXNzQVN0YXRzICsgMSApOworICAgcENsYXNzQ1N0YXRzICA9ICh0Q3NyR2xvYmFsQ2xhc3NDU3RhdHNJbmZvICopKCBwQ2xhc3NCU3RhdHMgKyAxICk7CisgICBwQ2xhc3NEU3RhdHMgID0gKHRDc3JHbG9iYWxDbGFzc0RTdGF0c0luZm8gKikoIHBDbGFzc0NTdGF0cyArIDEgKTsKKyAgIHBQZXJTdGFTdGF0cyAgPSAodENzclBlclN0YVN0YXRzSW5mbyAqKSggcENsYXNzRFN0YXRzICsgMSApOworCisgICBpZiAocFN0YXRzQ2FjaGUhPU5VTEwpCisgICB7CisgICAgICAvLyBhbmQgY29weSB0aGUgc3RhdHMgaW50byB0aGUgY2FjaGUgd2Uga2VlcCBpbiB0aGUgYWRhcHRlciBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAgICAgIHZvc19tZW1fY29weSggJnBTdGF0c0NhY2hlLT5zdW1tYXJ5X3N0YXQsIHBTdW1tYXJ5U3RhdHMsIHNpemVvZiggcFN0YXRzQ2FjaGUtPnN1bW1hcnlfc3RhdCApICk7CisgICAgICB2b3NfbWVtX2NvcHkoICZwU3RhdHNDYWNoZS0+Q2xhc3NBX3N0YXQsIHBDbGFzc0FTdGF0cywgc2l6ZW9mKCBwU3RhdHNDYWNoZS0+Q2xhc3NBX3N0YXQgKSApOworICAgICAgdm9zX21lbV9jb3B5KCAmcFN0YXRzQ2FjaGUtPkNsYXNzQl9zdGF0LCBwQ2xhc3NCU3RhdHMsIHNpemVvZiggcFN0YXRzQ2FjaGUtPkNsYXNzQl9zdGF0ICkgKTsKKyAgICAgIHZvc19tZW1fY29weSggJnBTdGF0c0NhY2hlLT5DbGFzc0Nfc3RhdCwgcENsYXNzQ1N0YXRzLCBzaXplb2YoIHBTdGF0c0NhY2hlLT5DbGFzc0Nfc3RhdCApICk7CisgICAgICB2b3NfbWVtX2NvcHkoICZwU3RhdHNDYWNoZS0+Q2xhc3NEX3N0YXQsIHBDbGFzc0RTdGF0cywgc2l6ZW9mKCBwU3RhdHNDYWNoZS0+Q2xhc3NEX3N0YXQgKSApOworICAgICAgdm9zX21lbV9jb3B5KCAmcFN0YXRzQ2FjaGUtPnBlclN0YVN0YXRzLCBwUGVyU3RhU3RhdHMsIHNpemVvZiggcFN0YXRzQ2FjaGUtPnBlclN0YVN0YXRzICkgKTsKKyAgIH0KKworICAgIGlmKHBBZGFwdGVyKQorICAgIHsKKyAgICAgICAgcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICAgICAgIGlmKHBXZXh0U3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgdm9zX3N0YXR1cyA9IHZvc19ldmVudF9zZXQoJnBXZXh0U3RhdGUtPnZvc2V2ZW50KTsKKyAgICAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX3N0YXR1cykpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHZvc19ldmVudF9zZXQgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY2NtQ2ZnU2V0Q2FsbGJhY2sodEhhbEhhbmRsZSBoYWxIYW5kbGUsIHRBTklfUzMyIHJlc3VsdCkKK3sKKyAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0OworICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eDsKKyAgIFZPU19TVEFUVVMgaGRkX3JlY29ubmVjdF9hbGxfYWRhcHRlcnMoIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggKTsKKyNpZiAwCisgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlOworICAgdl9VMzJfdCByb2FtSWQ7CisjZW5kaWYKKworICAgRU5URVIoKTsKKworICAgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU1lTLE5VTEwpOworCisgICBwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QqKSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQscFZvc0NvbnRleHQpOworICAgaWYgKE5VTEwgPT0gcEhkZEN0eCkKKyAgIHsKKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogSW52YWxpZCBwSGRkQ3R4IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyNpZiAwCisgICBwV2V4dFN0YXRlID0gcEFkYXB0ZXItPnBXZXh0U3RhdGU7CisjZW5kaWYKKworICAgaWYgKFdOSV9DRkdfTkVFRF9SRVNUQVJUID09IHJlc3VsdCB8fCBXTklfQ0ZHX05FRURfUkVMT0FEID09IHJlc3VsdCkKKyAgIHsKKyAgICAgIC8vVE9ETyBWZXJpZnkgaXMgdGhpcyBpcyByZWFsbHkgdXNlZC4gSWYgeWVzIG5lZWQgdG8gZml4IGl0LgorICAgICAgaGRkX3JlY29ubmVjdF9hbGxfYWRhcHRlcnMoIHBIZGRDdHggKTsKKyNpZiAwCisgICAgICBwQWRhcHRlci0+Y29ubl9pbmZvLmNvbm5TdGF0ZSA9IGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkOworICAgICAgSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKyAgICAgIHZvc1N0YXR1cyA9IHNtZV9Sb2FtRGlzY29ubmVjdChoYWxIYW5kbGUsIHBBZGFwdGVyLT5zZXNzaW9uSWQsIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworCisgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzKQorICAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworCisgICAgICBzbWVfUm9hbUNvbm5lY3QoaGFsSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCwgJihwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZSksCisgICAgICAgICAgICAgICAgICAgICAmcm9hbUlkKTsKKyNlbmRpZgorICAgfQorCisgICBFWElUKCk7CisKK30KKwordm9pZCBoZGRfY2xlYXJSb2FtUHJvZmlsZUllKCBoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKyAgIGludCBpID0gMDsKKyAgIGhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisKKyAgIC8qIGNsZWFyIFdQQS9SU04vV1NDIElFIGluZm9ybWF0aW9uIGluIHRoZSBwcm9maWxlICovCisgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uV1BBUmVxSUVMZW5ndGggPSAwOworICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucFdQQVJlcUlFID0gKHRBTklfVTggKilOVUxMOworICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUublJTTlJlcUlFTGVuZ3RoID0gMDsKKyAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBSU05SZXFJRSA9ICh0QU5JX1U4ICopTlVMTDsKKworICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuYldQU0Fzc29jaWF0aW9uID0gVk9TX0ZBTFNFOworICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFU2NhbiA9ICh0QU5JX1U4ICopTlVMTDsKKyAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5BZGRJRVNjYW5MZW5ndGggPSAwOworICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUucEFkZElFQXNzb2MgPSAodEFOSV9VOCAqKU5VTEw7CisgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uQWRkSUVBc3NvY0xlbmd0aCA9IDA7CisKKyAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworCisgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisKKyAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuQXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKworICAgcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQgPSAwOworCisgICBmb3IgKGk9MDsgaSA8IENTUl9NQVhfTlVNX0tFWTsgaSsrKQorICAgeworICAgICAgaWYgKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLktleXMuS2V5TWF0ZXJpYWxbaV0pCisgICAgICB7CisgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5LZXlzLktleUxlbmd0aFtpXSA9IDA7CisgICAgICB9CisgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgIHBBZGFwdGVyLT53YXBpX2luZm8ud2FwaUF1dGhNb2RlID0gV0FQSV9BVVRIX01PREVfT1BFTjsKKyAgIHBBZGFwdGVyLT53YXBpX2luZm8ubldhcGlNb2RlID0gMDsKKyNlbmRpZgorCisgICB2b3NfbWVtX3plcm8oKHZvaWQgKikocFdleHRTdGF0ZS0+cmVxX2Jzc0lkKSwgV05JX0NGR19CU1NJRF9MRU4pOworCit9CisKK3ZvaWQgd2xhbl9oZGRfdWxhX2RvbmVfY2Iodl9WT0lEX3QgKmNhbGxiYWNrQ29udGV4dCkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IChoZGRfYWRhcHRlcl90KiljYWxsYmFja0NvbnRleHQ7CisgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZT0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKworICAgIGNvbXBsZXRlKCZwV2V4dFN0YXRlLT5jb21wbGV0aW9uX3Zhcik7Cit9CisKK1ZPU19TVEFUVVMgd2xhbl9oZGRfY2hlY2tfdWxhX2RvbmUoaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIpCit7CisgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICAqcFdleHRTdGF0ZSA9ICBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworICAgIFZPU19TVEFUVVMgdm9zX3N0YXR1czsKKworICAgIGlmIChWT1NfRkFMU0UgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnVJc0F1dGhlbnRpY2F0ZWQpCisgICAgeworICAgICAgICBJTklUX0NPTVBMRVRJT04ocFdleHRTdGF0ZS0+Y29tcGxldGlvbl92YXIpOworCisgICAgICAgIC8qVG8gYXZvaWQgcmFjZSBjb25kaXRpb24gYmV0d2VlbiB0aGUgc2V0IGtleSBhbmQgdGhlIGxhc3QgRUFQT0wKKyAgICAgICAgICBwYWNrZXQsIG5vdGlmeSBUTCB0byBmaW5pc2ggdXBwZXIgbGF5ZXIgYXV0aGVudGljYXRpb24gaW5jYXNlIGlmIHRoZQorICAgICAgICAgIGxhc3QgRUFQT0wgcGFja2V0IHBlbmRpbmcgaW4gdGhlIFRMIHF1ZXVlLiovCisgICAgICAgIHZvc19zdGF0dXMgPSBXTEFOVExfRmluaXNoX1VMQSh3bGFuX2hkZF91bGFfZG9uZV9jYixwQWRhcHRlcik7CisKKyAgICAgICAgaWYgKCB2b3Nfc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiWyU0ZF0gV0xBTlRMX0ZpbmlzaF9VTEEgcmV0dXJuZWQgRVJST1Igc3RhdHVzPSAlZCIsCisgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHZvc19zdGF0dXMgKTsKKyAgICAgICAgICAgIHJldHVybiB2b3Nfc3RhdHVzOworCisgICAgICAgIH0KKworICAgICAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnBXZXh0U3RhdGUtPmNvbXBsZXRpb25fdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhIRERfRklOSVNIX1VMQV9USU1FX09VVCkpOworICAgIH0KKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCit2X1U4X3QqIHdsYW5faGRkX2dldF92ZW5kb3Jfb3VpX2llX3B0cih2X1U4X3QgKm91aSwgdl9VOF90IG91aV9zaXplLCB2X1U4X3QgKmllLCBpbnQgaWVfbGVuKQoreworCisgICAgaW50IGxlZnQgPSBpZV9sZW47CisgICAgdl9VOF90ICpwdHIgPSBpZTsKKyAgICB2X1U4X3QgZWxlbV9pZCxlbGVtX2xlbjsKKyAgICB2X1U4X3QgZWlkID0gMHhERDsKKworICAgIGlmICggTlVMTCA9PSBpZSB8fCAwID09IGllX2xlbiApCisgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB3aGlsZShsZWZ0ID49IDIpCisgICAgeworICAgICAgICBlbGVtX2lkICA9IHB0clswXTsKKyAgICAgICAgZWxlbV9sZW4gPSBwdHJbMV07CisgICAgICAgIGxlZnQgLT0gMjsKKyAgICAgICAgaWYoZWxlbV9sZW4gPiBsZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICIqKioqSW52YWxpZCBJRXMgZWlkID0gJWQgZWxlbV9sZW49JWQgbGVmdD0lZCoqKioqXG4iLAorICAgICAgICAgICAgICAgICAgICBlaWQsZWxlbV9sZW4sbGVmdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbV9pZCA9PSBlaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG1lbWNtcCggJnB0clsyXSwgb3VpLCBvdWlfc2l6ZSk9PTApCisgICAgICAgICAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIGxlZnQgLT0gZWxlbV9sZW47CisgICAgICAgIHB0ciArPSAoZWxlbV9sZW4gKyAyKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZExvZyggTE9HMSwgIkluICVzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIC8qIERvIG5vdGhpbmcgZm9yIG5vdyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisgICAgRU5URVIoKTsKKyAgICBzdHJsY3B5KHdycXUsICJRY29tOjgwMi4xMW4iLCBJRk5BTVNJWik7CisgICAgRVhJVCgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF93ZXh0X3N0YXRlX3QgICAgICAgICAqcFdleHRTdGF0ZTsKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIHRDc3JSb2FtUHJvZmlsZSAgICAgICAgICAqcFJvYW1Qcm9maWxlOworICAgIGVDc3JSb2FtQnNzVHlwZSAgICAgICAgICBMYXN0QlNTVHlwZTsKKyAgICBlTWliX2RvdDExRGVzaXJlZEJzc1R5cGUgY29ubmVjdGVkQnNzVHlwZTsKKyAgICBoZGRfY29uZmlnX3QgICAgICAgICAgICAgKnBDb25maWc7CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAgc3RydWN0IHdpcmVsZXNzX2RldiAgICAgICp3ZGV2OworI2VuZGlmCisKKyAgICBFTlRFUigpOworCisgICAgaWYgKE5VTEwgPT0gcEFkYXB0ZXIpCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgY29udGV4dCwgcEFkYXB0ZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKSB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICBpZiAocFdleHRTdGF0ZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgaGRkTG9nIChMT0dFLCAiJXMgRVJST1I6IERhdGEgU3RvcmFnZSBDb3JydXB0aW9uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAgd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKKyNlbmRpZgorICAgIHBSb2FtUHJvZmlsZSA9ICZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZTsKKyAgICBMYXN0QlNTVHlwZSA9IHBSb2FtUHJvZmlsZS0+QlNTVHlwZTsKKworICAgIGhkZExvZyggTE9HMSwiJXMgT2xkIEJzcyB0eXBlID0gJWQiLCBfX0ZVTkNUSU9OX18sIExhc3RCU1NUeXBlKTsKKworICAgIHN3aXRjaCAod3JxdS0+bW9kZSkKKyAgICB7CisgICAgY2FzZSBJV19NT0RFX0FESE9DOgorICAgICAgICBoZGRMb2coIExPRzEsIiVzIFNldHRpbmcgQVAgTW9kZSBhcyBJV19NT0RFX0FESE9DIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcFJvYW1Qcm9maWxlLT5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTOworICAgICAgICAvLyBTZXQgdGhlIHBoeW1vZGUgY29ycmVjdGx5IGZvciBJQlNTLgorICAgICAgICBwQ29uZmlnICA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmk7CisgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBoeU1vZGUgPSBoZGRfY2ZnX3hsYXRlX3RvX2Nzcl9waHlfbW9kZShwQ29uZmlnLT5kb3QxMU1vZGUpOworI2lmZGVmIENPTkZJR19DRkc4MDIxMQorICAgICAgICB3ZGV2LT5pZnR5cGUgPSBOTDgwMjExX0lGVFlQRV9BREhPQzsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIElXX01PREVfSU5GUkE6CisgICAgICAgIGhkZExvZyggTE9HMSwgIiVzIFNldHRpbmcgQVAgTW9kZSBhcyBJV19NT0RFX0lORlJBIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcFJvYW1Qcm9maWxlLT5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRTsKKyNpZmRlZiBDT05GSUdfQ0ZHODAyMTEKKyAgICAgICAgd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIElXX01PREVfQVVUTzoKKyAgICAgICAgaGRkTG9nKExPRzEsIiVzIFNldHRpbmcgQVAgTW9kZSBhcyBJV19NT0RFX0FVVE8iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBwUm9hbVByb2ZpbGUtPkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0FOWTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaGRkTG9nKExPRzEsIiVzIFVua25vd24gQVAgTW9kZSB2YWx1ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICB9CisKKyAgICBpZiAoIExhc3RCU1NUeXBlICE9IHBSb2FtUHJvZmlsZS0+QlNTVHlwZSApCisgICAgeworICAgICAgICAvL3RoZSBCU1MgbW9kZSBjaGFuZ2VkCisgICAgICAgIC8vIFdlIG5lZWQgdG8gaXNzdWUgZGlzY29ubmVjdCBpZiBjb25uZWN0ZWQgb3IgaW4gSUJTUyBkaXNjb25uZWN0IHN0YXRlCisgICAgICAgIGlmICggaGRkX2Nvbm5HZXRDb25uZWN0ZWRCc3NUeXBlKCBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSwgJmNvbm5lY3RlZEJzc1R5cGUgKSB8fAorICAgICAgICAgICAgICggZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTID09IExhc3RCU1NUeXBlICkgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gaXNzdWUgYSBkaXNjb25uZWN0IHRvIENTUi4KKyAgICAgICAgICAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3Zhcik7CisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzbWVfUm9hbURpc2Nvbm5lY3QoIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0lCU1NfTEVBVkUgKTsKKyAgICAgICAgICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMpCisgICAgICAgICAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworICAgICAgICB9CisgICAgfQorCisKKworICAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGl3X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgKnV3cnEsIGNoYXIgKmV4dHJhKQoreworCisgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZTsKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworCisgICAgaGRkTG9nIChMT0cxLCAiSW4gJXMiLF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAoTlVMTCA9PSBwQWRhcHRlcikKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICIlczogSW52YWxpZCBjb250ZXh0LCBwQWRhcHRlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsX19mdW5jX18pOworICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworICAgIGlmIChwV2V4dFN0YXRlID09IE5VTEwpCisgICAgeworICAgICAgICBoZGRMb2cgKExPR0UsICIlcyBFUlJPUjogRGF0YSBTdG9yYWdlIENvcnJ1cHRpb24iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkJTU1R5cGUpCisgICAgeworICAgIGNhc2UgZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRToKKyAgICAgICAgaGRkTG9nKExPRzEsICIlcyByZXR1cm5zIElXX01PREVfSU5GUkFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICp1d3JxID0gSVdfTU9ERV9JTkZSQSA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNTUl9CU1NfVFlQRV9JQlNTOgorICAgIGNhc2UgZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTOgorICAgICAgICBoZGRMb2coIExPRzEsIiVzIHJldHVybnMgSVdfTU9ERV9BREhPQ1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgKnV3cnE9IElXX01PREVfQURIT0M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNTUl9CU1NfVFlQRV9BTlk6CisgICAgICAgIGhkZExvZyggTE9HMSwiJXMgcmV0dXJucyBJV19NT0RFX0FVVE9cbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICp1d3JxPSBJV19NT0RFX0FVVE87CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGhkZExvZyggTE9HMSwiJXMgcmV0dXJucyBBUE1PREVfVU5LTk9XTlxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgdl9VMzJfdCBudW1DaGFucyA9IDA7CisgICAgdl9VOF90IHZhbGlkQ2hhbltXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworICAgIHZfVTMyX3QgaW5keCA9IDA7CisgICAgdl9VMzJfdCBzdGF0dXMgPSAwOworCisgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZTsKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKyAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworICAgIHRDc3JSb2FtUHJvZmlsZSAqIHBSb2FtUHJvZmlsZTsKKyAgICBFTlRFUigpOworCisgICAgaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsX19mdW5jX18pOworICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisKKyAgICBwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisKKyAgICBoZGRMb2coTE9HMSwic2V0Q0hBTk5FTCBpb2N0bFxuIik7CisKKyAgICAvKiBMaW5rIGlzIHVwIHRoZW4gcmV0dXJuIGNhbnQgc2V0IGNoYW5uZWwqLworICAgIGlmKGVDb25uZWN0aW9uU3RhdGVfSWJzc0Nvbm5lY3RlZCA9PSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlIHx8CisgICAgICAgZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpCisgICAgeworICAgICAgICBoZGRMb2coIExPR0UsICJJQlNTIEFzc29jaWF0ZWRcbiIpOworICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgfQorCisgICAgLyogU2V0dGluZ3MgYnkgRnJlcXVlbmN5IGFzIGlucHV0ICovCisgICAgaWYoKHdycXUtPmZyZXEuZSA9PSAxKSAmJiAod3JxdS0+ZnJlcS5tID49ICh0QU5JX1UzMikyLjQxMmU4KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3cnF1LT5mcmVxLm0gPD0gKHRBTklfVTMyKTUuODI1ZTgpKQorICAgIHsKKyAgICAgICAgdEFOSV9VMzIgZnJlcSA9IHdycXUtPmZyZXEubSAvIDEwMDAwMDsKKworICAgICAgICB3aGlsZSAoKGluZHggPCAgRlJFUV9DSEFOX01BUF9UQUJMRV9TSVpFKSAmJiAoZnJlcSAhPSBmcmVxX2NoYW5fbWFwW2luZHhdLmZyZXEpKQorICAgICAgICAgICAgaW5keCsrOworICAgICAgICBpZiAoaW5keCA+PSBGUkVRX0NIQU5fTUFQX1RBQkxFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIHdycXUtPmZyZXEuZSA9IDA7CisgICAgICAgIHdycXUtPmZyZXEubSA9IGZyZXFfY2hhbl9tYXBbaW5keF0uY2hhbjsKKworICAgIH0KKworICAgIGlmICh3cnF1LT5mcmVxLmUgPT0gMCkKKyAgICB7CisgICAgICAgIGlmKCh3cnF1LT5mcmVxLm0gPCBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9TVEFNSU4pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAod3JxdS0+ZnJlcS5tID4gV05JX0NGR19DVVJSRU5UX0NIQU5ORUxfU1RBTUFYKSkKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKExPRzEsIiVzOiBDaGFubmVsIFslZF0gaXMgb3V0c2lkZSB2YWxpZCByYW5nZSBmcm9tICVkIHRvICVkXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgd3JxdS0+ZnJlcS5tLCBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9TVEFNSU4sCisgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1BWCk7CisgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBudW1DaGFucyA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKworICAgICAgICBpZiAoY2NtQ2ZnR2V0U3RyKGhIYWwsIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNULAorICAgICAgICAgICAgICAgIHZhbGlkQ2hhbiwgJm51bUNoYW5zKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKXsKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbmR4ID0gMDsgaW5keCA8IG51bUNoYW5zOyBpbmR4KyspIHsKKyAgICAgICAgICAgIGlmICh3cnF1LT5mcmVxLm0gPT0gdmFsaWRDaGFuW2luZHhdKXsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworCisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmKGluZHggPj0gbnVtQ2hhbnMpCisgICAgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIE9wZXJhdGlvbmFsIENoYW5uZWwgKi8KKyAgICBudW1DaGFucyA9IHBSb2FtUHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDE7CisgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm9wZXJhdGlvbkNoYW5uZWwgPSB3cnF1LT5mcmVxLm07CisgICAgcFJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9ICZwSGRkU3RhQ3R4LT5jb25uX2luZm8ub3BlcmF0aW9uQ2hhbm5lbDsKKworICAgIGhkZExvZyhMT0cxLCJwUm9hbVByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWwgID0gJWRcbiIsIHdycXUtPmZyZXEubSk7CisKKyAgICBFWElUKCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGl3X2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgc3RydWN0IGl3X2ZyZXEgKmZ3cnEsIGNoYXIgKmV4dHJhKQoreworICAgdl9VMzJfdCBzdGF0dXMgPSAwLGNoYW5uZWwsZnJlcSA9IDA7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgdEhhbEhhbmRsZSBoSGFsOworICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZTsKKyAgIHRDc3JSb2FtUHJvZmlsZSAqIHBSb2FtUHJvZmlsZTsKKyAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKyAgIEVOVEVSKCk7CisKKyAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKSB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsX19mdW5jX18pOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCisgICBwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisKKyAgIGlmKCBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlPT0gZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICkKKyAgIHsKKyAgICAgICBpZiAoc21lX0dldE9wZXJhdGlvbkNoYW5uZWwoaEhhbCwgJmNoYW5uZWwpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgeworICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgIHsKKyAgICAgICAgICBmd3JxLT5tID0gY2hhbm5lbDsKKyAgICAgICAgICBmd3JxLT5lID0gMDsKKyAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgY2hhbm5lbCA9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5vcGVyYXRpb25DaGFubmVsOworICAgICAgIHN0YXR1cyA9IGhkZF93bGFuX2dldF9mcmVxKGNoYW5uZWwsJmZyZXEpOworICAgICAgIGZ3cnEtPm0gPSBmcmVxOworICAgICAgIGZ3cnEtPmUgPSAwOworICAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgaXdfZ2V0X3R4X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCisgICBpZiAocEhkZEN0eC0+aXNMb2dwSW5Qcm9ncmVzcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gLUVCVVNZOworICAgfQorCisgICBpZihlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgIT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKyAgIHsKKyAgICAgIHdycXUtPnR4cG93ZXIudmFsdWUgPSAwOworICAgICAgcmV0dXJuIDA7CisgICB9CisgICB3bGFuX2hkZF9nZXRfY2xhc3NBc3RhdHMocEFkYXB0ZXIpOworICAgd3JxdS0+dHhwb3dlci52YWx1ZSA9IHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQubWF4X3B3cjsKKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X3R4X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisKKyAgICBpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aXNMb2dwSW5Qcm9ncmVzcykKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBFTlRFUigpOworCisgICAgaWYgKCBjY21DZmdTZXRJbnQoaEhhbCwgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMLCB3cnF1LT50eHBvd2VyLnZhbHVlLCBjY21DZmdTZXRDYWxsYmFjaywgZUFOSV9CT09MRUFOX1RSVUUpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgRVhJVCgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfZ2V0X2JpdHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICBWT1NfU1RBVFVTIHZvc19zdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisKKyAgIEVOVEVSKCk7CisKKyAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKSB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsX19mdW5jX18pOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgaWYoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKyAgICAgICAgd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IDA7CisgICB9CisgICBlbHNlIHsKKyAgICAgIHN0YXR1cyA9IHNtZV9HZXRTdGF0aXN0aWNzKCBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIGVDU1JfSERELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNRV9TVU1NQVJZX1NUQVRTICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUVfR0xPQkFMX0NMQVNTQV9TVEFUUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01FX0dMT0JBTF9DTEFTU0JfU1RBVFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNRV9HTE9CQUxfQ0xBU1NDX1NUQVRTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUVfR0xPQkFMX0NMQVNTRF9TVEFUUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01FX1BFUl9TVEFfU1RBVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX1N0YXRpc3RpY3NDQiwgMCwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLnN0YUlkWzBdLCBwQWRhcHRlciApOworCisgICAgICBpZihlSEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gcmV0cmlldmUgc3RhdGlzdGljcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisKKyAgICAgIHBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisgICAgICB2b3Nfc3RhdHVzID0gdm9zX3dhaXRfc2luZ2xlX2V2ZW50KCZwV2V4dFN0YXRlLT52b3NldmVudCwgV0xBTl9XQUlUX1RJTUVfU1RBVFMpOworCisgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3Nfc3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBTTUUgdGltZW91dCB3aGlsZSByZXRyaWV2aW5nIHN0YXRpc3RpY3MiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisKKyAgICAgIHdycXUtPmJpdHJhdGUudmFsdWUgPSBwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0LnR4X3JhdGUqNTAwKjEwMDA7CisgICB9CisKKyAgIEVYSVQoKTsKKworICAgcmV0dXJuIHZvc19zdGF0dXM7Cit9CisvKiBjY20gY2FsbCBiYWNrIGZ1bmN0aW9uICovCisKK3N0YXRpYyBpbnQgaXdfc2V0X2JpdHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlOworICAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisgICAgdl9VOF90IHN1cHBfcmF0ZXNbV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBX0xFTl07CisgICAgdl9VMzJfdCBhX2xlbiA9IFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQV9MRU47CisgICAgdl9VMzJfdCBiX2xlbiA9IFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQl9MRU47CisgICAgdl9VMzJfdCBpLCByYXRlOworICAgIHZfVTMyX3QgdmFsaWRfcmF0ZSA9IEZBTFNFLCBhY3RpdmVfcGh5X21vZGUgPSAwOworCisgICAgRU5URVIoKTsKKworICAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKSB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwV2V4dFN0YXRlID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKworICAgIGlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgIT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAtRU5YSU8gOworICAgIH0KKworICAgIHJhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlOworCisgICAgaWYgKHJhdGUgPT0gLTEpCisgICAgeworICAgICAgICByYXRlID0gV05JX0NGR19GSVhFRF9SQVRFX0FVVE87CisgICAgICAgIHZhbGlkX3JhdGUgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIGlmIChjY21DZmdHZXRJbnQoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19ET1QxMV9NT0RFLCAmYWN0aXZlX3BoeV9tb2RlKSA9PSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgaWYgKGFjdGl2ZV9waHlfbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFBIHx8IGFjdGl2ZV9waHlfbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFHCisgICAgICAgICAgICB8fCBhY3RpdmVfcGh5X21vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExQikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChjY21DZmdHZXRTdHIoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBLAorICAgICAgICAgICAgICAgICAgICAgICAgc3VwcF9yYXRlcywgJmFfbGVuKSA9PSBlSEFMX1NUQVRVU19TVUNDRVNTKSAmJgorICAgICAgICAgICAgICAgIChjY21DZmdHZXRTdHIoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFCLAorICAgICAgICAgICAgICAgICAgICAgICAgc3VwcF9yYXRlcywgJmJfbGVuKSA9PSBlSEFMX1NUQVRVU19TVUNDRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGJfbGVuICsgYV9sZW4pOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBzdXBwb3J0ZWQgcmF0ZXMgcmV0dXJuZWQgaXMgZG91YmxlIHRoZSBhY3R1YWwgcmF0ZSBzbyB3ZSBkaXZpZGUgaXQgYnkgMiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHN1cHBfcmF0ZXNbaV0mMHg3RikvMiA9PSByYXRlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9yYXRlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgPSBpICsgV05JX0NGR19GSVhFRF9SQVRFXzFNQlBTOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHZhbGlkX3JhdGUgIT0gVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoY2NtQ2ZnU2V0SW50KFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfRklYRURfUkFURSwgcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNjbUNmZ1NldENhbGxiYWNrLGVBTklfQk9PTEVBTl9GQUxTRSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGl3X3NldF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorICAgICAgICBjaGFyICpleHRyYSkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICAgaGRkX3dleHRfc3RhdGVfdCAqcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICAgdV9pbnQ4X3QgKmdlbmllOworICAgIHZfVTE2X3QgcmVtTGVuOworCisgICBFTlRFUigpOworICAgaWYoIXdycXUtPmRhdGEubGVuZ3RoKSB7CisgICAgICBoZGRfY2xlYXJSb2FtUHJvZmlsZUllKHBBZGFwdGVyKTsKKyAgICAgIEVYSVQoKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICAgaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6TE9HUCBpbiBQcm9ncmVzcy4gSWdub3JlISEhIixfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgIGdlbmllID0gd3JxdS0+ZGF0YS5wb2ludGVyOworICAgIHJlbUxlbiA9IHdycXUtPmRhdGEubGVuZ3RoOworCisgICAgaGRkTG9nKExPRzEsIml3X3NldF9nZW5pZSBpb2N0bCBJRVsweCVYXSwgTEVOWyVkXVxuIiwgZ2VuaWVbMF0sIGdlbmllWzFdKTsKKworICAgIC8qIGNsZWFyIGFueSBwcmV2aW91cyBnZW5JRSBiZWZvcmUgdGhpcyBjYWxsICovCisgICAgbWVtc2V0KCAmcFdleHRTdGF0ZS0+Z2VuSUUsIDAsIHNpemVvZihwV2V4dFN0YXRlLT5nZW5JRSkgKTsKKworICAgIHdoaWxlIChyZW1MZW4gPj0gMikKKyAgIHsKKyAgICAgICAgdl9VMTZfdCBlTGVuID0gMDsKKyAgICAgICAgdl9VOF90IGVsZW1lbnRJZDsKKyAgICAgICAgZWxlbWVudElkID0gKmdlbmllKys7CisgICAgICAgIGVMZW4gID0gKmdlbmllKys7CisgICAgICAgIHJlbUxlbiAtPSAyOworCisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBJRVsweCVYXSwgTEVOWyVkXVxuIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBlbGVtZW50SWQsIGVMZW4pOworCisgICAgICAgIHN3aXRjaCAoIGVsZW1lbnRJZCApCisgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElFX0VJRF9WRU5ET1I6CisgICAgICAgICAgICAgICAgaWYgKChJRV9MRU5fU0laRStJRV9FSURfU0laRStJRV9WRU5ET1JfT1VJX1NJWkUpID4gZUxlbikgLyogc2hvdWxkIGhhdmUgYXQgbGVhc3QgT1VJICovCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBpZiAoMCA9PSBtZW1jbXAoJmdlbmllWzBdLCAiXHgwMFx4NTBceGYyXHgwNCIsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdl9VMTZfdCBjdXJHZW5JRUxlbiA9IHBXZXh0U3RhdGUtPmdlbklFLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nIChWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIFNldCBXUFMgT1VJKCUwMnggJTAyeCAlMDJ4ICUwMngpIElFKGxlbiAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBnZW5pZVswXSwgZ2VuaWVbMV0sIGdlbmllWzJdLCBnZW5pZVszXSwgZUxlbiArIDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBTSVJfTUFDX01BWF9JRV9MRU5HVEggPCAocFdleHRTdGF0ZS0+Z2VuSUUubGVuZ3RoICsgZUxlbikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICJDYW5ub3QgYWNjb21tb2RhdGUgZ2VuSUUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIGJpZ2dlciBidWZmZXIgc3BhY2VcbiIpOworICAgICAgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRvIEFkZGl0aW9uYWwgSUUgOyBpdCBzaG91bGQgYmUgYWNjdW11bGF0ZWQgdG8gaGFuZGxlIFdQUyBJRSArIG90aGVyIElFCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSggcFdleHRTdGF0ZS0+Z2VuSUUuYWRkSUVkYXRhICsgY3VyR2VuSUVMZW4sIGdlbmllIC0gMiwgZUxlbiArIDIpOworICAgICAgICAgICAgICAgICAgICBwV2V4dFN0YXRlLT5nZW5JRS5sZW5ndGggKz0gZUxlbiArIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKDAgPT0gbWVtY21wKCZnZW5pZVswXSwgIlx4MDBceDUwXHhmMiIsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nIChWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIFNldCBXUEEgSUUgKGxlbiAlZCkiLF9fZnVuY19fLCBlTGVuICsgMik7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCggcFdleHRTdGF0ZS0+V1BBUlNOSUUsIDAsIE1BWF9XUEFfUlNOX0lFX0xFTiApOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIHBXZXh0U3RhdGUtPldQQVJTTklFLCBnZW5pZSAtIDIsIChlTGVuICsgMikpOworICAgICAgICAgICAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5wV1BBUmVxSUUgPSBwV2V4dFN0YXRlLT5XUEFSU05JRTsKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubldQQVJlcUlFTGVuZ3RoID0gZUxlbiArIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLyogYW55IHZlbmRvcklkIGV4Y2VwdCBXUEEgSUUgc2hvdWxkIGJlIGFjY3VtdWxhdGVkIHRvIGdlbklFICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2X1UxNl90IGN1ckdlbklFTGVuID0gcFdleHRTdGF0ZS0+Z2VuSUUubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBoZGRMb2cgKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXMgU2V0IE9VSSglMDJ4ICUwMnggJTAyeCAlMDJ4KSBJRShsZW4gJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2VuaWVbMF0sIGdlbmllWzFdLCBnZW5pZVsyXSwgZ2VuaWVbM10sIGVMZW4gKyAyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggU0lSX01BQ19NQVhfSUVfTEVOR1RIIDwgKHBXZXh0U3RhdGUtPmdlbklFLmxlbmd0aCArIGVMZW4pICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiQ2Fubm90IGFjY29tbW9kYXRlIGdlbklFLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBiaWdnZXIgYnVmZmVyIHNwYWNlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0byBBZGRpdGlvbmFsIElFIDsgaXQgc2hvdWxkIGJlIGFjY3VtdWxhdGVkIHRvIGhhbmRsZSBXUFMgSUUgKyBvdGhlciBJRQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIHBXZXh0U3RhdGUtPmdlbklFLmFkZElFZGF0YSArIGN1ckdlbklFTGVuLCBnZW5pZSAtIDIsIGVMZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+Z2VuSUUubGVuZ3RoICs9IGVMZW4gKyAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIERPVDExRl9FSURfUlNOOgorICAgICAgICAgICAgICAgIGhkZExvZyAoTE9HMSwgIiVzIFNldCBSU04gSUUgKGxlbiAlZCkiLF9fRlVOQ1RJT05fXywgZUxlbisyKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoIHBXZXh0U3RhdGUtPldQQVJTTklFLCAwLCBNQVhfV1BBX1JTTl9JRV9MRU4gKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoIHBXZXh0U3RhdGUtPldQQVJTTklFLCBnZW5pZSAtIDIsIChlTGVuICsgMikpOworICAgICAgICAgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLnBSU05SZXFJRSA9IHBXZXh0U3RhdGUtPldQQVJTTklFOworICAgICAgICAgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm5SU05SZXFJRUxlbmd0aCA9IGVMZW4gKyAyOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZGRMb2cgKExPR0UsICIlcyBTZXQgVU5LTk9XTiBJRSAlWCIsX19GVU5DVElPTl9fLCBlbGVtZW50SWQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICAgICBnZW5pZSArPSBlTGVuOworICAgICAgICByZW1MZW4gLT0gZUxlbjsKKyAgICB9CisgICAgRVhJVCgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X2dldF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwV2V4dFN0YXRlOworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICB2X1UzMl90IGxlbmd0aCA9IERPVDExRl9JRV9SU05fTUFYX0xFTjsKKyAgICB2X1U4X3QgZ2VuSWVCeXRlc1tET1QxMUZfSUVfUlNOX01BWF9MRU5dOworCisgICAgRU5URVIoKTsKKworICAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKSB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKworICAgIGhkZExvZyhMT0cxLCJnZXRHRU5fSUUgaW9jdGxcbiIpOworCisgICAgcFdleHRTdGF0ZSA9IFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisKKyAgICBpZiggcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSA9PSBlQ29ubmVjdGlvblN0YXRlX05vdENvbm5lY3RlZCkKKyAgICB7CisgICAgICAgIHJldHVybiAtRU5YSU87CisgICAgfQorCisgICAgLy8gUmV0dXJuIHNvbWV0aGluZyBPTkxZIGlmIHdlIGFyZSBhc3NvY2lhdGVkIHdpdGggYW4gUlNOIG9yIFdQQSBuZXR3b3JrCisgICAgaWYgKCBWT1NfVFJVRSAhPSBoZGRfSXNBdXRoVHlwZVJTTihXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5uZWdvdGlhdGVkQXV0aFR5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC1FTlhJTzsKKyAgICB9CisKKyAgICAvLyBBY3R1YWxseSByZXRyaWV2ZSB0aGUgUlNOIElFIGZyb20gQ1NSLiAgKFdlIHByZXZpb3VzbHkgc2VudCBpdCBkb3duIGluIHRoZSBDU1IgUm9hbSBQcm9maWxlLikKKyAgICBzdGF0dXMgPSBjc3JSb2FtR2V0V3BhUnNuUmVxSUUoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5JZUJ5dGVzKTsKKyAgICB3cnF1LT5kYXRhLmxlbmd0aCA9IFZPU19NSU4oKHVfaW50MTZfdCkgbGVuZ3RoLCBET1QxMUZfSUVfUlNOX01BWF9MRU4pOworCisgICAgdm9zX21lbV9jb3B5KCB3cnF1LT5kYXRhLnBvaW50ZXIsICh2X1ZPSURfdCopZ2VuSWVCeXRlcywgd3JxdS0+ZGF0YS5sZW5ndGgpOworCisgICAgaGRkTG9nKExPRzEsIiVzOiBSU04gSUUgb2YgJWQgYnl0ZXMgcmV0dXJuZWRcbiIsIF9fRlVOQ1RJT05fXywgd3JxdS0+ZGF0YS5sZW5ndGggKTsKKworICAgIEVYSVQoKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIGhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworICAgIHRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlID0gJihwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZSk7CisgICAgaW50IGtleUlkOworICAgIGVDc3JBdXRoVHlwZSBhdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX05PTkU7CisgICAgaW50IGk7CisKKyAgICBFTlRFUigpOworCisgICAgaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsX19mdW5jX18pOworICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGtleUlkID0gcFJvYW1Qcm9maWxlLT5LZXlzLmRlZmF1bHRJbmRleDsKKworICAgIGlmKGtleUlkIDwgMCB8fCBrZXlJZCA+PSBNQVhfV0VQX0tFWVMpCisgICAgeworICAgICAgICBoZGRMb2coTE9HMSwiJXM6IEludmFsaWQga2V5SWQgOiAlZFxuIixfX0ZVTkNUSU9OX18sa2V5SWQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZihwUm9hbVByb2ZpbGUtPktleXMuS2V5TGVuZ3RoW2tleUlkXSA+IDApCisgICAgeworICAgICAgICBkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKyAgICAgICAgZHdycS0+bGVuZ3RoID0gcFJvYW1Qcm9maWxlLT5LZXlzLktleUxlbmd0aFtrZXlJZF07CisgICAgICAgIHZvc19tZW1fY29weShleHRyYSwmKHBSb2FtUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFtrZXlJZF1bMF0pLHBSb2FtUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhba2V5SWRdKTsKKworICAgICAgICBkd3JxLT5mbGFncyB8PSAoa2V5SWQgKyAxKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisgICAgfQorCisgICAgZm9yKGk9MDsgaSA8IE1BWF9XRVBfS0VZUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYocFJvYW1Qcm9maWxlLT5LZXlzLktleU1hdGVyaWFsW2ldID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihNQVhfV0VQX0tFWVMgPT0gaSkKKyAgICB7CisgICAgICAgIGR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9OT0tFWTsKKyAgICB9CisKKyAgICBhdXRoVHlwZSA9ICgoaGRkX3N0YXRpb25fY3R4X3QqKVdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLmF1dGhUeXBlOworCisgICAgaWYoZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0gPT0gYXV0aFR5cGUpCisgICAgeworICAgICAgICBkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CisgICAgfQorICAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBQQUVfUk9MRV9BVVRIRU5USUNBVE9SIDEgLy8gPTEgZm9yIGF1dGhlbnRpY2F0b3IsCisjZGVmaW5lIFBBRV9ST0xFX1NVUFBMSUNBTlQgMCAvLyA9MCBmb3Igc3VwcGxpY2FudAorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgc2luZ2xlICdrZXknIHRvIExJTSBhdCBhbGwgdGltZS4KKyAqLworCitzdGF0aWMgaW50IGl3X2dldF9ydHNfdGhyZXNob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgdl9VMzJfdCBzdGF0dXMgPSAwOworCisgICBzdGF0dXMgPSBoZGRfd2xhbl9nZXRfcnRzX3RocmVzaG9sZChwQWRhcHRlcix3cnF1KTsKKworICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBpd19zZXRfcnRzX3RocmVzaG9sZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKworICAgIEVOVEVSKCk7CisKKyAgICBpZiAoIHdycXUtPnJ0cy52YWx1ZSA8IFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFNSU4gfHwgd3JxdS0+cnRzLnZhbHVlID4gV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1BWCApCisgICAgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoIGNjbUNmZ1NldEludChoSGFsLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsIHdycXUtPnJ0cy52YWx1ZSwgY2NtQ2ZnU2V0Q2FsbGJhY2ssIGVBTklfQk9PTEVBTl9UUlVFKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTICkKKyAgICB7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIEVYSVQoKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X2dldF9mcmFnX3RocmVzaG9sZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICAgdl9VMzJfdCBzdGF0dXMgPSAwOworCisgICAgc3RhdHVzID0gaGRkX3dsYW5fZ2V0X2ZyYWdfdGhyZXNob2xkKHBBZGFwdGVyLHdycXUpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBpd19zZXRfZnJhZ190aHJlc2hvbGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisKKyAgIEVOVEVSKCk7CisKKyAgICBpZiAoIHdycXUtPmZyYWcudmFsdWUgPCBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX1NUQU1JTiB8fCB3cnF1LT5mcmFnLnZhbHVlID4gV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNQVggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKCBjY21DZmdTZXRJbnQoaEhhbCwgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwgd3JxdS0+ZnJhZy52YWx1ZSwgY2NtQ2ZnU2V0Q2FsbGJhY2ssIGVBTklfQk9PTEVBTl9UUlVFKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTICkKKyAgICB7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgRVhJVCgpOworCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd19nZXRfcG93ZXJfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgIEVOVEVSKCk7CisgICByZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X3Bvd2VyX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgRU5URVIoKTsKKyAgICByZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgaXdfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisgICBzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKworICAgdl9VOF90IGNoYW5uZWxzW1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CisKKyAgIHZfVTMyX3QgbnVtX2NoYW5uZWxzID0gc2l6ZW9mKGNoYW5uZWxzKTsKKyAgIHZfVThfdCBzdXBwX3JhdGVzW1dOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQV9MRU5dOworICAgdl9VMzJfdCBhX2xlbjsKKyAgIHZfVTMyX3QgYl9sZW47CisgICB2X1UzMl90IGFjdGl2ZV9waHlfbW9kZSA9IDA7CisgICB2X1U4X3QgaW5kZXggPSAwLCBpOworCisgICBFTlRFUigpOworCisgICB3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworICAgbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKworICAgLypHZXQgdGhlIHBoeSBtb2RlKi8KKyAgIGlmIChjY21DZmdHZXRJbnQoaEhhbCwKKyAgICAgICAgICAgICAgICAgIFdOSV9DRkdfRE9UMTFfTU9ERSwgJmFjdGl2ZV9waHlfbW9kZSkgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgImFjdGl2ZV9waHlfbW9kZSA9ICVsZCIsIGFjdGl2ZV9waHlfbW9kZSk7CisKKyAgICAgIGlmIChhY3RpdmVfcGh5X21vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExQSB8fCBhY3RpdmVfcGh5X21vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExRykKKyAgICAgIHsKKyAgICAgICAgIC8qR2V0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMgZm9yIDExRyBiYW5kKi8KKyAgICAgICAgIGlmIChjY21DZmdHZXRTdHIoaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwX3JhdGVzLCAmYV9sZW4pID09IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoYV9sZW4gPiBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUFfTEVOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgYV9sZW4gPSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUFfTEVOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFfbGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICByYW5nZS0+Yml0cmF0ZVtpXSA9ICgoc3VwcF9yYXRlc1tpXSAmIDB4N0YpIC8gMikgKiAxMDAwMDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmFuZ2UtPm51bV9iaXRyYXRlcyA9IGFfbGVuOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChhY3RpdmVfcGh5X21vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExQikKKyAgICAgIHsKKyAgICAgICAgIC8qR2V0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMgZm9yIDExQiBiYW5kKi8KKyAgICAgICAgIGlmIChjY21DZmdHZXRTdHIoaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwX3JhdGVzLCAmYl9sZW4pID09IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoYl9sZW4gPiBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUJfTEVOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgYl9sZW4gPSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUJfTEVOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJfbGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICByYW5nZS0+Yml0cmF0ZVtpXSA9ICgoc3VwcF9yYXRlc1tpXSAmIDB4N0YpIC8gMikgKiAxMDAwMDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmFuZ2UtPm51bV9iaXRyYXRlcyA9IGJfbGVuOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHJhbmdlLT5tYXhfcnRzID0gV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1BWDsKKyAgIHJhbmdlLT5taW5fZnJhZyA9IFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBTUlOOworICAgcmFuZ2UtPm1heF9mcmFnID0gV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNQVg7CisKKyAgIHJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKyAgIHJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisgICByYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKyAgIHJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gTUFYX1dFUF9LRVlTOworCisgICAvLyB3ZSBzdXBwb3J0IHRocm91Z2ggV2lyZWxlc3MgRXh0ZW5zaW9ucyAyMgorICAgcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisgICByYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAyMjsKKworICAgLypTdXBwb3J0ZWQgQ2hhbm5lbHMgYW5kIEZyZXF1ZW5jaWVzKi8KKyAgIGlmIChjY21DZmdHZXRTdHIoKGhIYWwpLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCwgY2hhbm5lbHMsICZudW1fY2hhbm5lbHMpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICB7CisgICAgICByZXR1cm4gLUVJTzsKKyAgIH0KKyAgIGlmIChudW1fY2hhbm5lbHMgPiBJV19NQVhfRlJFUVVFTkNJRVMpCisgICB7CisgICAgICBudW1fY2hhbm5lbHMgPSBJV19NQVhfRlJFUVVFTkNJRVM7CisgICB9CisKKyAgIHJhbmdlLT5udW1fY2hhbm5lbHMgPSBudW1fY2hhbm5lbHM7CisgICByYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IG51bV9jaGFubmVsczsKKworICAgZm9yIChpbmRleD0wOyBpbmRleCA8IG51bV9jaGFubmVsczsgaW5kZXgrKykKKyAgIHsKKyAgICAgIHZfVTMyX3QgZnJxX2luZHggPSAwOworCisgICAgICByYW5nZS0+ZnJlcVtpbmRleF0uaSA9IGNoYW5uZWxzW2luZGV4XTsKKyAgICAgIHdoaWxlIChmcnFfaW5keCA8ICBGUkVRX0NIQU5fTUFQX1RBQkxFX1NJWkUpCisgICAgICB7CisgICAgICAgICAgIGlmKGNoYW5uZWxzW2luZGV4XSA9PSBmcmVxX2NoYW5fbWFwW2ZycV9pbmR4XS5jaGFuKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgcmFuZ2UtPmZyZXFbaW5kZXhdLm0gPSBmcmVxX2NoYW5fbWFwW2ZycV9pbmR4XS5mcmVxICogMTAwMDAwOworICAgICAgICAgICAgIHJhbmdlLT5mcmVxW2luZGV4XS5lID0gMTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgICAgICBmcnFfaW5keCsrOworICAgICAgfQorICAgfQorCisgICAvKiBFdmVudCBjYXBhYmlsaXR5IChrZXJuZWwgKyBkcml2ZXIpICovCisgICByYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX0tfMCB8CisgICAgICAgICAgICAgICAgICAgIElXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXQVApIHwKKyAgICAgICAgICAgICAgICAgICAgSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdTQ0FOKSk7CisgICByYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOworCisgICAvKkVuY3J5cHRpb24gY2FwYWJpbGl0eSovCisgICByYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKKyAgICAgICAgICAgICAgICBJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUCB8IElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOworCisgICAvKiBUeHBvd2VyIGNhcGFiaWxpdHkgKi8KKyAgIHJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19NV0FUVDsKKworICAgLypTY2FubmluZyBjYXBhYmlsaXR5Ki8KKyAgICNpZiBXSVJFTEVTU19FWFQgPj0gMjIKKyAgIHJhbmdlLT5zY2FuX2NhcGEgPSBJV19TQ0FOX0NBUEFfRVNTSUQgfCBJV19TQ0FOX0NBUEFfVFlQRSB8IElXX1NDQU5fQ0FQQV9DSEFOTkVMOworICAgI2VuZGlmCisKKyAgIEVYSVQoKTsKKyAgIHJldHVybiAwOworfQorCisvKiBDYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggUE1DIHRvIGtub3cgc3RhdHVzIG9mIFBNQyByZXF1ZXN0ICovCitzdGF0aWMgdm9pZCBpd19wb3dlcl9jYWxsYmFja19mbiAodm9pZCAqcENvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKQoreworICAgc3RydWN0IHN0YXRzQ29udGV4dCAqcFN0YXRzQ29udGV4dDsKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworCisgICBpZiAoTlVMTCA9PSBwQ29udGV4dCkKKyAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIiVzOiBCYWQgcGFyYW0sIHBDb250ZXh0IFslcF0iLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBDb250ZXh0KTsKKyAgICAgICByZXR1cm47CisgICB9CisKKyAgLyogdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiB0aGF0IGV4aXN0cyBiZXR3ZWVuIHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24KKyAgICAgYW5kIHRoZSBjYWxsZXIgc2luY2UgdGhlIGNhbGxlciBjb3VsZCB0aW1lIG91dCBlaXRoZXIgYmVmb3JlIG9yCisgICAgIHdoaWxlIHRoaXMgY29kZSBpcyBleGVjdXRpbmcuICB3ZSdsbCBhc3N1bWUgdGhlIHRpbWVvdXQgaGFzbid0CisgICAgIG9jY3VycmVkLCBidXQgd2UnbGwgdmVyaWZ5IHRoYXQgcmlnaHQgYmVmb3JlIHdlIHNhdmUgb3VyIHdvcmsgKi8KKworICAgcFN0YXRzQ29udGV4dCA9IChzdHJ1Y3Qgc3RhdHNDb250ZXh0ICopcENvbnRleHQ7CisgICBwQWRhcHRlciA9IHBTdGF0c0NvbnRleHQtPnBBZGFwdGVyOworCisgICBpZiAoKE5VTEwgPT0gcEFkYXB0ZXIpIHx8IChQT1dFUl9DT05URVhUX01BR0lDICE9IHBTdGF0c0NvbnRleHQtPm1hZ2ljKSkKKyAgIHsKKyAgICAgICAvKiB0aGUgY2FsbGVyIHByZXN1bWFibHkgdGltZWQgb3V0IHNvIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvICovCisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAiJXM6IEludmFsaWQgY29udGV4dCwgcEFkYXB0ZXIgWyVwXSBtYWdpYyBbJTA4eF0iLAorICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBBZGFwdGVyLCBwU3RhdHNDb250ZXh0LT5tYWdpYyk7CisKKyAgICAgICBpZiAoaW9jdGxfZGVidWcpCisgICAgICAgeworICAgICAgICAgICBwcl9pbmZvKCIlczogSW52YWxpZCBjb250ZXh0LCBwQWRhcHRlciBbJXBdIG1hZ2ljIFslMDh4XVxuIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBBZGFwdGVyLCBwU3RhdHNDb250ZXh0LT5tYWdpYyk7CisgICAgICAgfQorICAgICAgIHJldHVybjsKKyAgfQorCisgIC8qIGFuZCBub3RpZnkgdGhlIGNhbGxlciAqLworICBjb21wbGV0ZSgmcFN0YXRzQ29udGV4dC0+Y29tcGxldGlvbik7Cit9CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0eCBwZXIgaGl0ICovCit2b2lkIGhkZF90eF9wZXJfaGl0X2NiICh2b2lkICpwQ2FsbGJhY2tDb250ZXh0KQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QgKilwQ2FsbGJhY2tDb250ZXh0OworICAgIHVuc2lnbmVkIGNoYXIgdHhfZmFpbFsxNl07CisgICAgdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCisgICAgaWYgKE5VTEwgPT0gcEFkYXB0ZXIpCisgICAgeworICAgICAgICBoZGRMb2coTE9HRSwgImhkZF90eF9wZXJfaGl0X2NiOiBwQWRhcHRlciBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxjcHkodHhfZmFpbCwgIlRYX0ZBSUwiLCBzaXplb2YodHhfZmFpbCkpOworICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIHR4X2ZhaWwpOworfQorCit2b2lkIGhkZF9HZXRDbGFzc0Ffc3RhdGlzdGljc0NCKHZvaWQgKnBTdGF0cywgdm9pZCAqcENvbnRleHQpCit7CisgICBzdHJ1Y3Qgc3RhdHNDb250ZXh0ICpwU3RhdHNDb250ZXh0OworICAgdENzckdsb2JhbENsYXNzQVN0YXRzSW5mbyAqcENsYXNzQVN0YXRzOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXI7CisKKyAgIGlmIChpb2N0bF9kZWJ1ZykKKyAgIHsKKyAgICAgIHByX2luZm8oIiVzOiBwU3RhdHMgWyVwXSBwQ29udGV4dCBbJXBdXG4iLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBTdGF0cywgcENvbnRleHQpOworICAgfQorCisgICBpZiAoKE5VTEwgPT0gcFN0YXRzKSB8fCAoTlVMTCA9PSBwQ29udGV4dCkpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICIlczogQmFkIHBhcmFtLCBwU3RhdHMgWyVwXSBwQ29udGV4dCBbJXBdIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwU3RhdHMsIHBDb250ZXh0KTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiB0aGF0IGV4aXN0cyBiZXR3ZWVuIHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24KKyAgICAgIGFuZCB0aGUgY2FsbGVyIHNpbmNlIHRoZSBjYWxsZXIgY291bGQgdGltZSBvdXQgZWl0aGVyIGJlZm9yZSBvcgorICAgICAgd2hpbGUgdGhpcyBjb2RlIGlzIGV4ZWN1dGluZy4gIHdlJ2xsIGFzc3VtZSB0aGUgdGltZW91dCBoYXNuJ3QKKyAgICAgIG9jY3VycmVkLCBidXQgd2UnbGwgdmVyaWZ5IHRoYXQgcmlnaHQgYmVmb3JlIHdlIHNhdmUgb3VyIHdvcmsgKi8KKworICAgcENsYXNzQVN0YXRzICA9IHBTdGF0czsKKyAgIHBTdGF0c0NvbnRleHQgPSBwQ29udGV4dDsKKyAgIHBBZGFwdGVyICAgICAgPSBwU3RhdHNDb250ZXh0LT5wQWRhcHRlcjsKKyAgIGlmICgoTlVMTCA9PSBwQWRhcHRlcikgfHwgKFNUQVRTX0NPTlRFWFRfTUFHSUMgIT0gcFN0YXRzQ29udGV4dC0+bWFnaWMpKQorICAgeworICAgICAgLyogdGhlIGNhbGxlciBwcmVzdW1hYmx5IHRpbWVkIG91dCBzbyB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbiBkbyAqLworICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICIlczogSW52YWxpZCBjb250ZXh0LCBwQWRhcHRlciBbJXBdIG1hZ2ljIFslMDh4XSIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcEFkYXB0ZXIsIHBTdGF0c0NvbnRleHQtPm1hZ2ljKTsKKyAgICAgIGlmIChpb2N0bF9kZWJ1ZykKKyAgICAgIHsKKyAgICAgICAgIHByX2luZm8oIiVzOiBJbnZhbGlkIGNvbnRleHQsIHBBZGFwdGVyIFslcF0gbWFnaWMgWyUwOHhdXG4iLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBBZGFwdGVyLCBwU3RhdHNDb250ZXh0LT5tYWdpYyk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIHRoZSByYWNlIGlzIG9uLiAgY2FsbGVyIGNvdWxkIGhhdmUgdGltZWQgb3V0IGltbWVkaWF0ZWx5IGFmdGVyCisgICAgICB3ZSB2ZXJpZmllZCB0aGUgbWFnaWMsIGJ1dCBpZiBzbywgY2FsbGVyIHdpbGwgd2FpdCBhIHNob3J0IHRpbWUKKyAgICAgIGZvciB1cyB0byBjb3B5IG92ZXIgdGhlIHN0YXRzLiBkbyBzbyBhcyBhIHN0cnVjdCBjb3B5ICovCisgICBwQWRhcHRlci0+aGRkX3N0YXRzLkNsYXNzQV9zdGF0ID0gKnBDbGFzc0FTdGF0czsKKworICAgLyogYW5kIG5vdGlmeSB0aGUgY2FsbGVyICovCisgICBjb21wbGV0ZSgmcFN0YXRzQ29udGV4dC0+Y29tcGxldGlvbik7Cit9CisKK1ZPU19TVEFUVVMgIHdsYW5faGRkX2dldF9jbGFzc0FzdGF0cyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKyAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisgICBlSGFsU3RhdHVzIGhzdGF0dXM7CisgICBsb25nIGxyYzsKKyAgIHN0cnVjdCBzdGF0c0NvbnRleHQgY29udGV4dDsKKworICAgaWYgKE5VTEwgPT0gcEFkYXB0ZXIpCisgICB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBQYWRhcHRlciBpcyBOVUxMIiwgX19mdW5jX18pOworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisgICBpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aXNMb2dwSW5Qcm9ncmVzcykKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsX19mdW5jX18pOworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIC8qIHdlIGFyZSBjb25uZWN0ZWQKKyAgIHByZXBhcmUgb3VyIGNhbGxiYWNrIGNvbnRleHQgKi8KKyAgIGluaXRfY29tcGxldGlvbigmY29udGV4dC5jb21wbGV0aW9uKTsKKyAgIGNvbnRleHQucEFkYXB0ZXIgPSBwQWRhcHRlcjsKKyAgIGNvbnRleHQubWFnaWMgPSBTVEFUU19DT05URVhUX01BR0lDOworICAgLyogcXVlcnkgb25seSBmb3IgQ2xhc3MgQSBzdGF0aXN0aWNzICh3aGljaCBpbmNsdWRlIGxpbmsgc3BlZWQpICovCisgICBoc3RhdHVzID0gc21lX0dldFN0YXRpc3RpY3MoIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX0hERCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUVfR0xPQkFMX0NMQVNTQV9TVEFUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfR2V0Q2xhc3NBX3N0YXRpc3RpY3NDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvLyBub3QgcGVyaW9kaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgLy9ub24tY2FjaGVkIHJlc3VsdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uc3RhSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQpOworICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gaHN0YXR1cykKKyAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gcmV0cmlldmUgQ2xhc3MgQSBzdGF0aXN0aWNzICIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgIC8qIHdlJ2xsIHJldHVybmVkIGEgY2FjaGVkIHZhbHVlIGJlbG93ICovCisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgLyogcmVxdWVzdCB3YXMgc2VudCAtLSB3YWl0IGZvciB0aGUgcmVzcG9uc2UgKi8KKyAgICAgICBscmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmY29udGV4dC5jb21wbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9TVEFUUykpOworICAgICAgIC8qIGVpdGhlciB3ZSBoYXZlIGEgcmVzcG9uc2Ugb3Igd2UgdGltZWQgb3V0CisgICAgICAgICAgZWl0aGVyIHdheSwgZmlyc3QgaW52YWxpZGF0ZSBvdXIgbWFnaWMgKi8KKyAgICAgICBjb250ZXh0Lm1hZ2ljID0gMDsKKyAgICAgICBpZiAobHJjIDw9IDApCisgICAgICAgeworICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogU01FICVzIHdoaWxlIHJldHJpZXZpbmcgQ2xhc3MgQSBzdGF0aXN0aWNzIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAoMCA9PSBscmMpID8gInRpbWVvdXQiIDogImludGVycnVwdCIpOworICAgICAgICAgICAgIC8qIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gc3VjaCB0aGF0IHRoZSBjYWxsYmFjaworICAgICAgICAgICAgIGZ1bmN0aW9uIGNvdWxkIGJlIGV4ZWN1dGluZyBhdCB0aGUgc2FtZSB0aW1lIHdlIGFyZS4gb2YKKyAgICAgICAgICAgICBwcmltYXJ5IGNvbmNlcm4gaXMgaWYgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGhhZCBhbHJlYWR5CisgICAgICAgICAgICAgdmVyaWZpZWQgdGhlICJtYWdpYyIgYnV0IGhhc24ndCB5ZXQgc2V0IHRoZSBjb21wbGV0aW9uCisgICAgICAgICAgICAgdmFyaWFibGUuICBTaW5jZSB0aGUgY29tcGxldGlvbiB2YXJpYWJsZSBpcyBvbiBvdXIKKyAgICAgICAgICAgICBzdGFjaywgd2UnbGwgZGVsYXkganVzdCBhIGJpdCB0byBtYWtlIHN1cmUgdGhlIGRhdGEgaXMKKyAgICAgICAgICAgICBzdGlsbCB2YWxpZCBpZiB0aGF0IGlzIHRoZSBjYXNlICovCisgICAgICAgICAgbXNsZWVwKDUwKTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBTdXBwb3J0IGZvciB0aGUgTElOS1NQRUVEIHByaXZhdGUgY29tbWFuZAorICogUGVyIHRoZSBXaUZpIGZyYW1ld29yayB0aGUgcmVzcG9uc2UgbXVzdCBiZSBvZiB0aGUgZm9ybQorICogICAgICAgICAiTGlua1NwZWVkIHh4IgorICovCitzdGF0aWMgaW50IGl3X2dldF9saW5rc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgIGNoYXIgKnBMaW5rU3BlZWQgPSAoY2hhciopZXh0cmE7CisgICBpbnQgbGVuID0gc2l6ZW9mKHZfVTE2X3QpICsgMTsKKyAgIHZfVTE2X3QgbGlua19zcGVlZDsKKyAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisgICBpbnQgcmM7CisKKyAgIGlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgIT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKyAgIHsKKyAgICAgIC8qIHdlIGFyZSBub3QgY29ubmVjdGVkIHNvIHdlIGRvbid0IGhhdmUgYSBjbGFzc0FzdGF0cyAqLworICAgICAgbGlua19zcGVlZCA9IDA7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgd2xhbl9oZGRfZ2V0X2NsYXNzQXN0YXRzKHBBZGFwdGVyKTsKKyAgICAgICAvL1RoZSBsaW5rc3BlZWQgcmV0dXJuZWQgYnkgSEFMIGlzIGluIHVuaXRzIG9mIDUwMGticHMuCisgICAgICAgLy9jb252ZXJ0aW5nIGl0IHRvIG1icHMKKyAgICAgICBsaW5rX3NwZWVkID0gcEFkYXB0ZXItPmhkZF9zdGF0cy5DbGFzc0Ffc3RhdC50eF9yYXRlLzI7CisgICB9CisKKyAgIHdycXUtPmRhdGEubGVuZ3RoID0gbGVuOworICAgLy8gcmV0dXJuIHRoZSBsaW5rc3BlZWQgaW4gdGhlIGZvcm1hdCByZXF1aXJlZCBieSB0aGUgV2lGaSBGcmFtZXdvcmsKKyAgIHJjID0gc25wcmludGYocExpbmtTcGVlZCwgbGVuLCAiJXUiLCBsaW5rX3NwZWVkKTsKKyAgIGlmICgocmMgPCAwKSB8fCAocmMgPj0gbGVuKSkKKyAgIHsKKyAgICAgICAvLyBlbmNvZGluZyBvciBsZW5ndGggZXJyb3I/CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IFVuYWJsZSB0byBlbmNvZGUgbGluayBzcGVlZCwgZ290IFslc10iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyxwTGlua1NwZWVkKTsKKyAgICAgICByZXR1cm4gLUVJTzsKKyAgIH0KKworICAvKiBhIHZhbHVlIGlzIGJlaW5nIHN1Y2Nlc3NmdWxseSByZXR1cm5lZCAqLworICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFN1cHBvcnQgZm9yIHRoZSBSU1NJICYgUlNTSS1BUFBST1ggcHJpdmF0ZSBjb21tYW5kcworICogUGVyIHRoZSBXaUZpIGZyYW1ld29yayB0aGUgcmVzcG9uc2UgbXVzdCBiZSBvZiB0aGUgZm9ybQorICogICAgICAgICAiPHNzaWQ+IHJzc2kgPHh4PiIKKyAqIHVubGVzcyB3ZSBhcmUgbm90IGFzc29jaWF0ZWQsIGluIHdoaWNoIGNhc2UgdGhlIHJlc3BvbnNlIGlzCisgKiAgICAgICAgICJPSyIKKyAqLworc3RhdGljIGludCBpd19nZXRfcnNzaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICBjaGFyICpjbWQgPSAoY2hhciopd3JxdS0+ZGF0YS5wb2ludGVyOworICAgaW50IGxlbiA9IHdycXUtPmRhdGEubGVuZ3RoOworICAgdl9TN190IHM3UnNzaSA9IDA7CisgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworICAgaW50IHNzaWRsZW4gPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uU1NJRC5TU0lELmxlbmd0aDsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgaW50IHJjOworCisgICBpZiAoKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCAhPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKSB8fAorICAgICAgICgwID09IHNzaWRsZW4pIHx8IChzc2lkbGVuID49IGxlbikpCisgICB7CisgICAgICAvKiB3ZSBhcmUgbm90IGNvbm5lY3RlZCBvciBvdXIgU1NJRCBpcyB0b28gbG9uZworICAgICAgICAgc28gd2UgY2Fubm90IHJlcG9ydCBhbiByc3NpICovCisgICAgICByYyA9IHNucHJpbnRmKGNtZCwgbGVuLCAiT0siKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIHdlIGFyZSBjb25uZWN0ZWQgd2l0aCBhIHZhbGlkIFNTSUQKKyAgICAgICAgIHNvIHdlIGNhbiB3cml0ZSB0aGUgU1NJRCBpbnRvIHRoZSByZXR1cm4gYnVmZmVyCisgICAgICAgICAobm90ZSB0aGF0IGl0IGlzIG5vdCBOVUwtdGVybWluYXRlZCkgKi8KKyAgICAgIG1lbWNweShjbWQsIHBIZGRTdGFDdHgtPmNvbm5faW5mby5TU0lELlNTSUQuc3NJZCwgc3NpZGxlbiApOworCisgICAgICB2b3NTdGF0dXMgPSB3bGFuX2hkZF9nZXRfcnNzaShwQWRhcHRlciwgJnM3UnNzaSk7CisKKyAgICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzKQorICAgICAgeworICAgICAgICAgIC8qIGFwcGVuZCB0aGUgcnNzaSB0byB0aGUgc3NpZCBpbiB0aGUgZm9ybWF0IHJlcXVpcmVkIGJ5CisgICAgICAgICAgICAgdGhlIFdpRkkgRnJhbWV3b3JrICovCisgICAgICAgICAgcmMgPSBzbnByaW50ZigmY21kW3NzaWRsZW5dLCBsZW4gLSBzc2lkbGVuLCAiIHJzc2kgJWQiLCBzN1Jzc2kpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIHJjID0gLTE7CisgICAgICB9CisgICB9CisKKyAgIC8qIHZlcmlmeSB0aGF0IHdlIHdyb3RlIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgIGlmICgocmMgPCAwKSB8fCAocmMgPj0gbGVuKSkKKyAgIHsKKyAgICAgIC8vIGVuY29kaW5nIG9yIGxlbmd0aCBlcnJvcj8KKyAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gZW5jb2RlIFJTU0ksIGdvdCBbJXNdIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNtZCk7CisgICAgICByZXR1cm4gLUVJTzsKKyAgIH0KKworICAgLyogYSB2YWx1ZSBpcyBiZWluZyBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgKi8KKyAgIHJldHVybiAwOworfQorCisvKgorICogU3VwcG9ydCBmb3IgU29mdEFQIGNoYW5uZWwgcmFuZ2UgcHJpdmF0ZSBjb21tYW5kCisgKi8KK3N0YXRpYyBpbnQgaXdfc29mdGFwX3NldF9jaGFubmVsX3JhbmdlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhbmQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgaW50IHJldCA9IDA7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyID0gKG5ldGRldl9wcml2KGRldikpOworICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBIb3N0YXBkQWRhcHRlcik7CisKKyAgICBzdGF0dXMgPSBXTEFOU0FQX1NldENoYW5uZWxSYW5nZShoSGFsLCBzdGFydENoYW5uZWwsIGVuZENoYW5uZWwsIGJhbmQpOworICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgIHsKKyAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworVk9TX1NUQVRVUyAgd2xhbl9oZGRfZW50ZXJfYm1wcyhoZGRfYWRhcHRlcl90ICpwQWRhcHRlciwgaW50IG1vZGUpCit7CisgICBzdHJ1Y3Qgc3RhdHNDb250ZXh0IGNvbnRleHQ7CisgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHg7CisKKyAgIGlmIChOVUxMID09IHBBZGFwdGVyKQorICAgeworICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICJBZGFwdGVyIE5VTEwiKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgInBvd2VyIG1vZGU9JWQiLCBtb2RlKTsKKyAgIHBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKyAgIGluaXRfY29tcGxldGlvbigmY29udGV4dC5jb21wbGV0aW9uKTsKKworICAgY29udGV4dC5wQWRhcHRlciA9IHBBZGFwdGVyOworICAgY29udGV4dC5tYWdpYyA9IFBPV0VSX0NPTlRFWFRfTUFHSUM7CisKKyAgIGlmIChEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUgPT0gbW9kZSkKKyAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOldsYW4gZHJpdmVyIEVudGVyaW5nICIKKyAgICAgICAgICAgICAgICJGdWxsIFBvd2VyIiwgX19mdW5jX18pOworICAgICAgIHN0YXR1cyA9IHNtZV9SZXF1ZXN0RnVsbFBvd2VyKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaXdfcG93ZXJfY2FsbGJhY2tfZm4sICZjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBlU01FX0ZVTExfUFdSX05FRURFRF9CWV9IREQpOworICAgICAgIC8vIEVudGVyIEZ1bGwgcG93ZXIgY29tbWFuZCByZWNlaXZlZCBmcm9tIEdVSSB0aGlzIG1lYW5zIHdlIGFyZSBkaXNjb25uZWN0ZWQKKyAgICAgICAvLyBTZXQgUE1DIHJlbWFpbkluUG93ZXJBY3RpdmVUaWxsREhDUCBmbGFnIHRvIGRpc2FibGUgYXV0byBCTVBTIGVudHJ5IGJ5IFBNQworICAgICAgIHNtZV9TZXRESENQVGlsbFBvd2VyQWN0aXZlRmxhZyhwSGRkQ3R4LT5oSGFsLCBUUlVFKTsKKyAgICAgICBpZiAoZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgPT0gc3RhdHVzKQorICAgICAgIHsKKyAgICAgICAgICAgaW50IGxyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorICAgICAgICAgICAgICAgICAgICZjb250ZXh0LmNvbXBsZXRpb24sCisgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9QT1dFUikpOworICAgICAgICAgICBjb250ZXh0Lm1hZ2ljID0gMDsKKyAgICAgICAgICAgaWYgKGxyYyA8PSAwKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogU01FICVzIHdoaWxlIHJlcXVlc3RpbmcgZnVsbHBvd2VyICIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICgwID09IGxyYykgPyAidGltZW91dCIgOiAiaW50ZXJydXB0Iik7CisgICAgICAgICAgICAgICAvKiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIHN1Y2ggdGhhdCB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvdWxkIGJlIGV4ZWN1dGluZyBhdCB0aGUgc2FtZSB0aW1lIHdlIGFyZS4gb2YKKyAgICAgICAgICAgICAgICAgIHByaW1hcnkgY29uY2VybiBpcyBpZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaGFkIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgIHZlcmlmaWVkIHRoZSAibWFnaWMiIGJ1dCBoYXNuJ3QgeWV0IHNldCB0aGUgY29tcGxldGlvbgorICAgICAgICAgICAgICAgICAgdmFyaWFibGUuIFNpbmNlIHRoZSBjb21wbGV0aW9uIHZhcmlhYmxlIGlzIG9uIG91cgorICAgICAgICAgICAgICAgICAgc3RhY2ssIHdlJ2xsIGRlbGF5IGp1c3QgYSBiaXQgdG8gbWFrZSBzdXJlIHRoZSBkYXRhIGlzCisgICAgICAgICAgICAgICAgICBzdGlsbCB2YWxpZCBpZiB0aGF0IGlzIHRoZSBjYXNlICovCisgICAgICAgICAgICAgICBtc2xlZXAoNTApOworICAgICAgICAgICAgICAgLyogd2UnbGwgbm93IHJldHVybmVkIGEgY2FjaGVkIHZhbHVlIGJlbG93ICovCisgICAgICAgICAgIH0KKyAgICAgICB9CisgICB9CisgICBlbHNlIGlmIChEUklWRVJfUE9XRVJfTU9ERV9BVVRPID09IG1vZGUpCisgICB7CisgICAgICAgaWYgKHBIZGRDdHgtPmNmZ19pbmktPmZJc0JtcHNFbmFibGVkKQorICAgICAgIHsKKyAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczpXbGFuIGRyaXZlciBFbnRlcmluZyBCbXBzICIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgICAgIC8vIEVudGVyIEJNUFMgY29tbWFuZCByZWNlaXZlZCBmcm9tIEdVSSB0aGlzIG1lYW5zIERIQ1AgaXMgY29tcGxldGVkCisgICAgICAgICAgIC8vIENsZWFyIFBNQyByZW1haW5JblBvd2VyQWN0aXZlVGlsbERIQ1AgZmxhZyB0byBlbmFibGUgYXV0byBCTVBTIGVudHJ5CisgICAgICAgICAgIHNtZV9TZXRESENQVGlsbFBvd2VyQWN0aXZlRmxhZyhXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgICAgICAgICAgc3RhdHVzID0gc21lX1JlcXVlc3RCbXBzKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGl3X3Bvd2VyX2NhbGxiYWNrX2ZuLCAmY29udGV4dCk7CisgICAgICAgICAgIGlmIChlSEFMX1NUQVRVU19QTUNfUEVORElORyA9PSBzdGF0dXMpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBscmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0LmNvbXBsZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKFdMQU5fV0FJVF9USU1FX1BPV0VSKSk7CisgICAgICAgICAgICAgICBjb250ZXh0Lm1hZ2ljID0gMDsKKyAgICAgICAgICAgICAgIGlmIChscmMgPD0gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogU01FICVzIHdoaWxlIHJlcXVlc3RpbmcgQk1QUyAiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKDAgPT0gbHJjKSA/ICJ0aW1lb3V0IiA6ICJpbnRlcnJ1cHQiKTsKKyAgICAgICAgICAgICAgICAgICAvKiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIHN1Y2ggdGhhdCB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb3VsZCBiZSBleGVjdXRpbmcgYXQgdGhlIHNhbWUgdGltZSB3ZSBhcmUuIG9mCisgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSBjb25jZXJuIGlzIGlmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBoYWQgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkIHRoZSAibWFnaWMiIGJ1dCBoYXNuJ3QgeWV0IHNldCB0aGUgY29tcGxldGlvbgorICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLiBTaW5jZSB0aGUgY29tcGxldGlvbiB2YXJpYWJsZSBpcyBvbiBvdXIKKyAgICAgICAgICAgICAgICAgICAgICBzdGFjaywgd2UnbGwgZGVsYXkganVzdCBhIGJpdCB0byBtYWtlIHN1cmUgdGhlIGRhdGEgaXMKKyAgICAgICAgICAgICAgICAgICAgICBzdGlsbCB2YWxpZCBpZiB0aGF0IGlzIHRoZSBjYXNlICovCisgICAgICAgICAgICAgICAgICAgbXNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICAgICAvKiB3ZSdsbCBub3cgcmV0dXJuZWQgYSBjYWNoZWQgdmFsdWUgYmVsb3cgKi8KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkJNUFMgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCBpbiB0aGUgY2ZnIik7CisgICAgICAgfQorICAgfQorICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworVk9TX1NUQVRVUyB3bGFuX2hkZF9leGl0X2xvd3Bvd2VyKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKyAgIFZPU19TVEFUVVMgdm9zX1N0YXR1czsKKworICAgaWYgKChOVUxMID09IHBBZGFwdGVyKSB8fCAoTlVMTCA9PSBwSGRkQ3R4KSkKKyAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiSW52YWxpZCBwb2ludGVyIik7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgLyoqRXhpdCBmcm9tIERlZXAgc2xlZXAgb3Igc3RhbmRieSBpZiB3ZSBnZXQgdGhlIGRyaXZlcgorICAgU1RBUlQgY21kIGZyb20gYW5kcm9pZCBHVUkKKyAgICAqLworICAgaWYgKFdMQU5fTUFQX0RSSVZFUl9TVE9QX1RPX1NUQU5EQlkgPT0gcEhkZEN0eC0+Y2ZnX2luaS0+bkVuYWJsZURyaXZlclN0b3ApCisgICB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogV0xBTiBiZWluZyBleGl0ICIKKyAgICAgICAgICAgICAgImZyb20gU3RhbmQgYnkiLF9fZnVuY19fKTsKKyAgICAgICB2b3NfU3RhdHVzID0gaGRkX2V4aXRfc3RhbmRieShwSGRkQ3R4KTsKKyAgIH0KKyAgIGVsc2UgaWYgKGVIRERfU1VTUEVORF9ERUVQX1NMRUVQID09IHBIZGRDdHgtPmhkZF9wc19zdGF0ZSkKKyAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBXTEFOIGJlaW5nIGV4aXQgIgorICAgICAgICAgICAgICAiZnJvbSBkZWVwIHNsZWVwIixfX2Z1bmNfXyk7CisgICAgICAgdm9zX1N0YXR1cyA9IGhkZF9leGl0X2RlZXBfc2xlZXAocEhkZEN0eCwgcEFkYXB0ZXIpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIiVzOiBOb3QgaW4gc3RhbmRieSBvciBkZWVwIHNsZWVwLiAiCisgICAgICAgICAgICAgICAiSWdub3JlIHN0YXJ0IGNtZCAlZCIsIF9fZnVuY19fLCBwSGRkQ3R4LT5oZGRfcHNfc3RhdGUpOworICAgICAgIHZvc19TdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIHJldHVybiB2b3NfU3RhdHVzOworfQorCitWT1NfU1RBVFVTIHdsYW5faGRkX2VudGVyX2xvd3Bvd2VyKGhkZF9jb250ZXh0X3QgKnBIZGRDdHgpCit7CisgICBWT1NfU1RBVFVTIHZvc19TdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKworICAgaWYgKE5VTEwgPT0gcEhkZEN0eCkKKyAgIHsKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJIREQgY29udGV4dCBOVUxMIik7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIGlmIChXTEFOX01BUF9EUklWRVJfU1RPUF9UT19TVEFOREJZID09IHBIZGRDdHgtPmNmZ19pbmktPm5FbmFibGVEcml2ZXJTdG9wKQorICAgeworICAgICAgLy9FeGVjdXRlIHN0YW5kYnkgcHJvY2VkdXJlLgorICAgICAgLy9FeGVjdXRpbmcgc3RhbmRieSBwcm9jZWR1cmUgd2lsbCBjYXVzZSB0aGUgU1RBIHRvCisgICAgICAvL2Rpc2Fzc29jaWF0ZSBmaXJzdCBhbmQgdGhlbiB0aGUgY2hpcCB3aWxsIGJlIHB1dCBpbnRvIHN0YW5kYnkuCisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldsYW4gZHJpdmVyIGVudGVyaW5nIFN0YW5kIGJ5IG1vZGUiKTsKKyAgICAgIHZvc19TdGF0dXMgID0gaGRkX2VudGVyX3N0YW5kYnkocEhkZEN0eCk7CisgICB9CisgICBlbHNlIGlmIChXTEFOX01BUF9EUklWRVJfU1RPUF9UT19ERUVQX1NMRUVQID09CisgICAgICAgICAgICBwSGRkQ3R4LT5jZmdfaW5pLT5uRW5hYmxlRHJpdmVyU3RvcCkKKyAgIHsKKyAgICAgICAvL0V4ZWN1dGUgZGVlcCBzbGVlcCBwcm9jZWR1cmUKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldsYW4gZHJpdmVyIGVudGVyaW5nICIKKyAgICAgICAgICAgICAgICJkZWVwIHNsZWVwIG1vZGVcbiIpOworICAgICAgIC8vRGVlcCBzbGVlcCBub3Qgc3VwcG9ydGVkCisgICAgICAgdm9zX1N0YXR1cyAgPSBoZGRfZW50ZXJfc3RhbmRieShwSGRkQ3R4KTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAiJXM6IERyaXZlciBzdG9wIGlzIG5vdCBlbmFibGVkICVkIiwKKyAgICAgICAgICAgX19mdW5jX18sIHBIZGRDdHgtPmNmZ19pbmktPm5FbmFibGVEcml2ZXJTdG9wKTsKKyAgICAgICB2b3NfU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgfQorCisgICByZXR1cm4gdm9zX1N0YXR1czsKK30KKworc3RhdGljIGludCBpd19zZXRfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIGNoYXIgKmNtZCA9IChjaGFyKil3cnF1LT5kYXRhLnBvaW50ZXI7CisgICAgaW50IGNtZF9sZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisKKyAgICBFTlRFUigpOworCisgICAgaWYgKGlvY3RsX2RlYnVnKQorICAgIHsKKyAgICAgICBwcl9pbmZvKCIlczogcmVxIFslc10gbGVuIFslZF1cbiIsIF9fRlVOQ1RJT05fXywgY21kLCBjbWRfbGVuKTsKKyAgICB9CisKKyAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAiKioqUmVjZWl2ZWQgJXMgY21kIGZyb20gV2ktRmkgR1VJKioqIiwgY21kKTsKKworICAgIGlmIChwSGRkQ3R4LT5pc0xvZ3BJblByb2dyZXNzKSB7CisgICAgICAgaWYgKGlvY3RsX2RlYnVnKQorICAgICAgIHsKKyAgICAgICAgICBwcl9pbmZvKCIlczogUkVTVEFSVCBpbiBwcm9ncmVzc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICB9CisKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsX19mdW5jX18pOworICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYoc3RybmNtcChjbWQsICJDU0NBTiIsNSkgPT0gMCApCisgICAgeworICAgICAgIHN0YXR1cyA9IGl3X3NldF9jc2NhbihkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKyAgICB9CisgICAgZWxzZSBpZiggc3RyY2FzZWNtcChjbWQsICJzdGFydCIpID09IDAgKSB7CisKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJTdGFydCBjb21tYW5kXG4iKTsKKyAgICAgICAgLypFeGl0IGZyb20gRGVlcCBzbGVlcCBvciBzdGFuZGJ5IGlmIHdlIGdldCB0aGUgZHJpdmVyIFNUQVJUIGNtZCBmcm9tIGFuZHJvaWQgR1VJKi8KKyAgICAgICAgc3RhdHVzID0gd2xhbl9oZGRfZXhpdF9sb3dwb3dlcihwSGRkQ3R4LCBwQWRhcHRlcik7CisKKyAgICAgICAgaWYoc3RhdHVzID09IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSB3cnF1OworICAgICAgICAgICAgY2hhciBidWZbMTBdOworCisgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gc3RybGNweShidWYsICJTVEFSVCIsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IFNUQVJUIENNRCBTdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGVsc2UgaWYoIHN0cmNhc2VjbXAoY21kLCAic3RvcCIpID09IDAgKQorICAgIHsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSB3cnF1OworICAgICAgICBjaGFyIGJ1ZlsxMF07CisKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJTdG9wIGNvbW1hbmRcbiIpOworCisgICAgICAgIHdsYW5faGRkX2VudGVyX2xvd3Bvd2VyKHBIZGRDdHgpOworICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBzdHJsY3B5KGJ1ZiwgIlNUT1AiLCBzaXplb2YoYnVmKSk7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1Zik7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjYXNlY21wKGNtZCwgIm1hY2FkZHIiKSA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0ID0gc25wcmludGYoY21kLCBjbWRfbGVuLCAiTWFjYWRkciA9ICIgTUFDX0FERFJFU1NfU1RSLAorICAgICAgICAgICAgICAgICAgICAgICBNQUNfQUREUl9BUlJBWShwQWRhcHRlci0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY2FzZWNtcChjbWQsICJzY2FuLWFjdGl2ZSIpID09IDApCisgICAgeworICAgICAgICBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5fbW9kZSA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgICAgIHJldCA9IHNucHJpbnRmKGNtZCwgY21kX2xlbiwgIk9LIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoY21kLCAic2Nhbi1wYXNzaXZlIikgPT0gMCkKKyAgICB7CisgICAgICAgIHBBZGFwdGVyLT5zY2FuX2luZm8uc2Nhbl9tb2RlID0gZVNJUl9QQVNTSVZFX1NDQU47CisgICAgICAgIHJldCA9IHNucHJpbnRmKGNtZCwgY21kX2xlbiwgIk9LIik7CisgICAgfQorICAgIGVsc2UgaWYoIHN0cmNhc2VjbXAoY21kLCAic2Nhbi1tb2RlIikgPT0gMCApCisgICAgeworICAgICAgICByZXQgPSBzbnByaW50ZihjbWQsIGNtZF9sZW4sICJTY2FuTW9kZSA9ICV1IiwgcEFkYXB0ZXItPnNjYW5faW5mby5zY2FuX21vZGUpOworICAgIH0KKyAgICBlbHNlIGlmKCBzdHJjYXNlY21wKGNtZCwgImxpbmtzcGVlZCIpID09IDAgKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gaXdfZ2V0X2xpbmtzcGVlZChkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKKyAgICB9CisgICAgZWxzZSBpZiggc3RybmNhc2VjbXAoY21kLCAiQ09VTlRSWSIsIDcpID09IDAgKSB7CisgICAgICAgIGNoYXIgKmNvdW50cnlfY29kZTsKKworICAgICAgICBjb3VudHJ5X2NvZGUgPSAgY21kICsgODsKKworICAgICAgICBzdGF0dXMgPSAoaW50KXNtZV9DaGFuZ2VDb3VudHJ5Q29kZShwSGRkQ3R4LT5oSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRkQ3R4LT5wdm9zQ29udGV4dCk7CisgICAgICAgIGlmKCAwICE9IHN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBTTUUgQ2hhbmdlIENvdW50cnkgY29kZSBmYWlsIFxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIHN0cm5jYXNlY21wKGNtZCwgInJzc2kiLCA0KSA9PSAwICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGl3X2dldF9yc3NpKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOworICAgIH0KKyAgICBlbHNlIGlmKCBzdHJuY2FzZWNtcChjbWQsICJwb3dlcm1vZGUiLCA5KSA9PSAwICkgeworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgY2hhciAqcHRyID0gKGNoYXIqKShjbWQgKyA5KTsKKworICAgICAgICBzc2NhbmYocHRyLCIlZCIsJm1vZGUpOworICAgICAgICB3bGFuX2hkZF9lbnRlcl9ibXBzKHBBZGFwdGVyLCBtb2RlKTsKKyAgICAgICAgLypUT0RPOlNldCB0aGUgcG93ZXIgbW9kZSovCisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wKGNtZCwgImdldHBvd2VyIiwgOCkgPT0gMCApIHsKKyAgICAgICAgdl9VMzJfdCBwbWNfc3RhdGU7CisgICAgICAgIHZfVTE2X3QgdmFsdWU7CisKKyAgICAgICAgcG1jX3N0YXRlID0gcG1jR2V0UG1jU3RhdGUoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpKTsKKyAgICAgICAgaWYocG1jX3N0YXRlID09IEJNUFMpIHsKKyAgICAgICAgICAgdmFsdWUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICB2YWx1ZSA9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBzbnByaW50ZihjbWQsIGNtZF9sZW4sICJwb3dlcm1vZGUgPSAldSIsIHZhbHVlKTsKKyAgICB9CisgICAgZWxzZSBpZiggc3RybmNhc2VjbXAoY21kLCAiYnRjb2V4bW9kZSIsIDEwKSA9PSAwICkgeworICAgICAgICBoZGRMb2coIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiYnRjb2V4bW9kZVxuIik7CisgICAgICAgIC8qVE9ETzogc2V0IHRoZSBidGNvZXhtb2RlKi8KKyAgICB9CisgICAgZWxzZSBpZiggc3RyY2FzZWNtcChjbWQsICJidGNvZXhzdGF0IikgPT0gMCApIHsKKworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICJCdENvZXggU3RhdHVzXG4iKTsKKyAgICAgICAgLypUT0RPOiBSZXR1cm4gdGhlIGJ0Y29leCBzdGF0dXMqLworICAgIH0KKyAgICBlbHNlIGlmKCBzdHJjYXNlY21wKGNtZCwgInJ4ZmlsdGVyLXN0YXJ0IikgPT0gMCApIHsKKworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICJSeCBEYXRhIEZpbHRlciBTdGFydCBjb21tYW5kXG4iKTsKKworICAgICAgICAvKlRPRE86IEVuYWJsZSBSeCBkYXRhIEZpbHRlciovCisgICAgfQorICAgIGVsc2UgaWYoIHN0cmNhc2VjbXAoY21kLCAicnhmaWx0ZXItc3RvcCIpID09IDAgKSB7CisKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiUnggRGF0YSBGaWx0ZXIgU3RvcCBjb21tYW5kXG4iKTsKKworICAgICAgICAvKlRPRE86IERpc2FibGUgUnggZGF0YSBGaWx0ZXIqLworICAgIH0KKyAgICBlbHNlIGlmKCBzdHJjYXNlY21wKGNtZCwgInJ4ZmlsdGVyLXN0YXRpc3RpY3MiKSA9PSAwICkgeworCisgICAgICAgIGhkZExvZyggVk9TX1RSQUNFX0xFVkVMX0lORk8sICJSeCBEYXRhIEZpbHRlciBTdGF0aXN0aWNzIGNvbW1hbmRcbiIpOworICAgICAgICAvKlRPRE86IHJ4ZmlsdGVyLXN0YXRpc3RpY3MqLworICAgIH0KKyAgICBlbHNlIGlmKCBzdHJuY2FzZWNtcChjbWQsICJyeGZpbHRlci1hZGQiLCAxMikgPT0gMCApIHsKKworICAgICAgICBoZGRMb2coIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAicnhmaWx0ZXItYWRkXG4iKTsKKyAgICAgICAgLypUT0RPOiByeGZpbHRlci1hZGQqLworICAgIH0KKyAgICBlbHNlIGlmKCBzdHJuY2FzZWNtcChjbWQsICJyeGZpbHRlci1yZW1vdmUiLDE1KSA9PSAwICkgeworCisgICAgICAgIGhkZExvZyggVk9TX1RSQUNFX0xFVkVMX0lORk8sICJyeGZpbHRlci1yZW1vdmVcbiIpOworICAgICAgICAvKlRPRE86IHJ4ZmlsdGVyLXJlbW92ZSovCisgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworICAgIGVsc2UgaWYoIHN0cm5jYXNlY21wKGNtZCwgInBubyIsMykgPT0gMCApIHsKKworICAgICAgICBoZGRMb2coIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAicG5vXG4iKTsKKyAgICAgICAgc3RhdHVzID0gaXdfc2V0X3BubyhkZXYsIGluZm8sIHdycXUsIGV4dHJhLCAzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgZWxzZSBpZiggc3RybmNhc2VjbXAoY21kLCAicnNzaWZpbHRlciIsMTApID09IDAgKSB7CisKKyAgICAgICAgaGRkTG9nKCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgInJzc2lmaWx0ZXJcbiIpOworICAgICAgICBzdGF0dXMgPSBpd19zZXRfcnNzaV9maWx0ZXIoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSwgMTApOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyNlbmRpZiAvKkZFQVRVUkVfV0xBTl9TQ0FOX1BOTyovCisgICAgZWxzZSBpZiggc3RybmNhc2VjbXAoY21kLCAicG93ZXJwYXJhbXMiLDExKSA9PSAwICkgeworICAgICAgaGRkTG9nKCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgInBvd2VycGFyYW1zXG4iKTsKKyAgICAgIHN0YXR1cyA9IGl3X3NldF9wb3dlcl9wYXJhbXMoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSwgMTEpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgZWxzZSBpZiggMCA9PSBzdHJuY2FzZWNtcChjbWQsICJDT05GSUctVFgtVFJBQ0tJTkciLCAxOCkgKSB7CisgICAgICAgIHRTaXJUeFBlclRyYWNraW5nUGFyYW0gdFR4UGVyVHJhY2tpbmdQYXJhbTsKKyAgICAgICAgY2hhciAqcHRyID0gKGNoYXIqKShjbWQgKyAxOCk7CisgICAgICAgIHNzY2FuZihwdHIsIiVoaHUgJWhodSAlaGh1ICVsdSIsJih0VHhQZXJUcmFja2luZ1BhcmFtLnVjVHhQZXJUcmFja2luZ0VuYWJsZSksICYodFR4UGVyVHJhY2tpbmdQYXJhbS51Y1R4UGVyVHJhY2tpbmdQZXJpb2QpLAorICAgICAgICAgICAgICAgJih0VHhQZXJUcmFja2luZ1BhcmFtLnVjVHhQZXJUcmFja2luZ1JhdGlvKSwgJih0VHhQZXJUcmFja2luZ1BhcmFtLnVUeFBlclRyYWNraW5nV2F0ZXJtYXJrKSk7CisKKyAgICAgICAgLy8gcGFyYW1ldGVycyBjaGVja2luZworICAgICAgICAvLyBwZXJpb2QgaGFzIHRvIGJlIGxhcmdlciB0aGFuIDAKKyAgICAgICAgaWYgKDAgPT0gdFR4UGVyVHJhY2tpbmdQYXJhbS51Y1R4UGVyVHJhY2tpbmdQZXJpb2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sICJQZXJpb2QgaW5wdXQgaXMgbm90IGNvcnJlY3QiKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSBkZWZhdWx0IHZhbHVlIDUgaXMgdGhlIGlucHV0IGlzIG5vdCByZWFzb25hYmxlLiBpbiB1bml0IG9mIDEwJQorICAgICAgICBpZiAoKHRUeFBlclRyYWNraW5nUGFyYW0udWNUeFBlclRyYWNraW5nUmF0aW8gPiBUWF9QRVJfVFJBQ0tJTkdfTUFYX1JBVElPKSB8fCAoMCA9PSB0VHhQZXJUcmFja2luZ1BhcmFtLnVjVHhQZXJUcmFja2luZ1JhdGlvKSkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIlJhdGlvIGlucHV0IGlzIG5vdCBnb29kLiB1c2UgZGVmYXVsdCA1Iik7CisgICAgICAgICAgICB0VHhQZXJUcmFja2luZ1BhcmFtLnVjVHhQZXJUcmFja2luZ1JhdGlvID0gVFhfUEVSX1RSQUNLSU5HX0RFRkFVTFRfUkFUSU87CisgICAgICAgIH0KKworICAgICAgICAvLyBkZWZhdWx0IGlzIDUKKyAgICAgICAgaWYgKDAgPT0gdFR4UGVyVHJhY2tpbmdQYXJhbS51VHhQZXJUcmFja2luZ1dhdGVybWFyaykKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIlR4IFBhY2tldCBudW1iZXIgaW5wdXQgaXMgbm90IGdvb2QuIHVzZSBkZWZhdWx0IDUiKTsKKyAgICAgICAgICAgIHRUeFBlclRyYWNraW5nUGFyYW0udVR4UGVyVHJhY2tpbmdXYXRlcm1hcmsgPSBUWF9QRVJfVFJBQ0tJTkdfREVGQVVMVF9XQVRFUk1BUks7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBzbWVfU2V0VHhQZXJUcmFja2luZyhwSGRkQ3R4LT5oSGFsLCBoZGRfdHhfcGVyX2hpdF9jYiwgKHZvaWQqKXBBZGFwdGVyLCAmdFR4UGVyVHJhY2tpbmdQYXJhbSk7CisgICAgICAgIGlmKHN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKXsKKyAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIlNldCBUeCBQRVIgVHJhY2tpbmcgRmFpbGVkISIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBoZGRMb2coIFZPU19UUkFDRV9MRVZFTF9XQVJOLCAiVW5zdXBwb3J0ZWQgR1VJIGNvbW1hbmQgJXMiLCBjbWQpOworICAgIH0KK2RvbmU6CisgICAgLyogbWFueSBvZiB0aGUgY29tbWFuZHMgd3JpdGUgaW5mb3JtYXRpb24gYmFjayBpbnRvIHRoZSBjb21tYW5kCisgICAgICAgc3RyaW5nIHVzaW5nIHNucHJpbnRmKCkuICBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGhlcmUgaW4gb25lCisgICAgICAgcGxhY2UgKi8KKyAgICBpZiAoKHJldCA8IDApIHx8IChyZXQgPj0gY21kX2xlbikpCisgICAgeworICAgICAgIC8qIHRoZXJlIHdhcyBhbiBlbmNvZGluZyBlcnJvciBvciBvdmVyZmxvdyAqLworICAgICAgIHN0YXR1cyA9IC1FSU87CisgICAgfQorCisgICAgaWYgKGlvY3RsX2RlYnVnKQorICAgIHsKKyAgICAgICBwcl9pbmZvKCIlczogcnNwIFslc10gbGVuIFslZF0gc3RhdHVzICVkXG4iLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjbWQsIHdycXUtPmRhdGEubGVuZ3RoLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworCit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICBFTlRFUigpOworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfZ2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICBFTlRFUigpOworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICBFTlRFUigpOworICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmV4dHJhKQorCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgIGhkZF93ZXh0X3N0YXRlX3QgICpwV2V4dFN0YXRlID0gIFdMQU5fSEREX0dFVF9XRVhUX1NUQVRFX1BUUihwQWRhcHRlcik7CisgICBzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisgICB2X1UzMl90IGtleUlkOworICAgdl9VOF90IGtleV9sZW5ndGg7CisgICBlQ3NyRW5jcnlwdGlvblR5cGUgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgdl9CT09MX3QgZktleVByZXNlbnQgPSAwOworICAgaW50IGk7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKworICAgRU5URVIoKTsKKworICAgaWYgKChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmlzTG9ncEluUHJvZ3Jlc3MpCisgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICB9CisKKworICAga2V5SWQgPSBlbmNvZGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisKKyAgIGlmKGtleUlkKQorICAgeworICAgICAgIGlmKGtleUlkID4gTUFYX1dFUF9LRVlTKQorICAgICAgIHsKKyAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgfQorCisgICAgICAgZktleVByZXNlbnQgPSAxOworICAgICAgIGtleUlkLS07CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgZktleVByZXNlbnQgPSAwOworICAgfQorCisKKyAgIGlmKHdycXUtPmRhdGEuZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIioqKippd2NvbmZpZyB3bGFuMCBrZXkgb2ZmKioqKipcbiIpOworICAgICAgIGlmKCFmS2V5UHJlc2VudCkgeworCisgICAgICAgICAgZm9yKGk9MDtpIDwgQ1NSX01BWF9OVU1fS0VZOyBpKyspIHsKKworICAgICAgICAgICAgIGlmKHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLktleXMuS2V5TWF0ZXJpYWxbaV0pCisgICAgICAgICAgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUuS2V5cy5LZXlMZW5ndGhbaV0gPSAwOworICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlID0gIGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOworICAgICAgIHBXZXh0U3RhdGUtPndwYVZlcnNpb24gPSBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEOworICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKworICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby51Y0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8ubWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisKKyAgICAgICBpZihlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKyAgICAgICB7CisgICAgICAgICAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3Zhcik7CisgICAgICAgICAgIHN0YXR1cyA9IHNtZV9Sb2FtRGlzY29ubmVjdCggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCBwQWRhcHRlci0+c2Vzc2lvbklkLCBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEICk7CisgICAgICAgICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpCisgICAgICAgICAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworICAgICAgIH0KKworICAgICAgIHJldHVybiBzdGF0dXM7CisKKyAgIH0KKworICAgaWYgKHdycXUtPmRhdGEuZmxhZ3MgJiAoSVdfRU5DT0RFX09QRU4gfCBJV19FTkNPREVfUkVTVFJJQ1RFRCkpCisgICB7CisgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICJpd2NvbmZpZyB3bGFuMCBrZXkgb24iKTsKKworICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlID0gKGVuY29kZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSA/IGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVkgOiBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKworICAgfQorCisKKyAgIGlmKHdycXUtPmRhdGEubGVuZ3RoID4gMCkKKyAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyA6IHdycXUtPmRhdGEubGVuZ3RoIDogJWQiLF9fRlVOQ1RJT05fXyx3cnF1LT5kYXRhLmxlbmd0aCk7CisKKyAgICAgICBrZXlfbGVuZ3RoID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisKKyAgICAgICAvKiBJV19FTkNPRElOR19UT0tFTl9NQVggaXMgdGhlIHZhbHVlIHRoYXQgaXMgc2V0IGZvciB3cnF1LT5kYXRhLmxlbmd0aCBieSBpd2NvbmZpZy5jIHdoZW4gJ2l3Y29uZmlnIHdsYW4wIGtleSBvbicgaXMgaXNzdWVkLiovCisKKyAgICAgICBpZig1ID09IGtleV9sZW5ndGgpCisgICAgICAgeworICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogQ2FsbCB3aXRoIFdFUDQwLGtleV9sZW49JWQiLF9fRlVOQ1RJT05fXyxrZXlfbGVuZ3RoKTsKKworICAgICAgICAgICBpZigoSVdfQVVUSF9LRVlfTUdNVF84MDJfMVggPT0gcFdleHRTdGF0ZS0+YXV0aEtleU1nbXQpICYmIChlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSA9PSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGUpKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBlbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgZWxzZSBpZigxMyA9PSBrZXlfbGVuZ3RoKQorICAgICAgIHsKKyAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6Q2FsbCB3aXRoIFdFUDEwNCxrZXlfbGVuOiVkIixfX0ZVTkNUSU9OX18sa2V5X2xlbmd0aCk7CisKKyAgICAgICAgICAgaWYoKElXX0FVVEhfS0VZX01HTVRfODAyXzFYID09IHBXZXh0U3RhdGUtPmF1dGhLZXlNZ210KSAmJiAoZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0gPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBlbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgIHsKKyAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9XQVJOLCAiJXM6IEludmFsaWQgV0VQIGtleSBsZW5ndGggOiVkIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywga2V5X2xlbmd0aCk7CisgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgIH0KKworICAgICAgIHBIZGRTdGFDdHgtPmNvbm5faW5mby51Y0VuY3J5cHRpb25UeXBlID0gZW5jcnlwdGlvblR5cGU7CisgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLm1jRW5jcnlwdGlvblR5cGUgPSBlbmNyeXB0aW9uVHlwZTsKKyAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IGVuY3J5cHRpb25UeXBlOworICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLm1jRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IGVuY3J5cHRpb25UeXBlOworCisgICAgICAgaWYoKGVDb25uZWN0aW9uU3RhdGVfTm90Q29ubmVjdGVkID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUpICYmCisgICAgICAgICAgICAoKGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNID09IHBIZGRTdGFDdHgtPmNvbm5faW5mby5hdXRoVHlwZSkgfHwKKyAgICAgICAgICAgICAgKGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVkgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlKSkpCisgICAgICAgeworCisgICAgICAgICAgdm9zX21lbV9jb3B5KCZwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5LZXlzLktleU1hdGVyaWFsW2tleUlkXVswXSxleHRyYSxrZXlfbGVuZ3RoKTsKKworICAgICAgICAgIHBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlLktleXMuS2V5TGVuZ3RoW2tleUlkXSA9ICh2X1U4X3Qpa2V5X2xlbmd0aDsKKyAgICAgICAgICBwV2V4dFN0YXRlLT5yb2FtUHJvZmlsZS5LZXlzLmRlZmF1bHRJbmRleCA9ICh2X1U4X3Qpa2V5SWQ7CisKKyAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfZ2V0X2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKyAgICAgICAgICAgICAgIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICAgaGRkX3dleHRfc3RhdGVfdCAgKnBXZXh0U3RhdGUgPSAgV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICB0Q3NyUm9hbVByb2ZpbGUgKnBSb2FtUHJvZmlsZSA9ICYocFdleHRTdGF0ZS0+cm9hbVByb2ZpbGUpOworICAgIGludCBrZXlJZDsKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgZW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgIGVDc3JBdXRoVHlwZSBhdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX05PTkU7CisgICAgaW50IGk7CisKKyAgICBFTlRFUigpOworCisgICAga2V5SWQgPSBwUm9hbVByb2ZpbGUtPktleXMuZGVmYXVsdEluZGV4OworCisgICAgaWYoa2V5SWQgPCAwIHx8IGtleUlkID49IE1BWF9XRVBfS0VZUykKKyAgICB7CisgICAgICAgIGhkZExvZyhMT0cxLCIlczogSW52YWxpZCBrZXlJZCA6ICVkXG4iLF9fRlVOQ1RJT05fXyxrZXlJZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmKHBSb2FtUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhba2V5SWRdID4gMCkKKyAgICB7CisgICAgICAgIGR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworICAgICAgICBkd3JxLT5sZW5ndGggPSBwUm9hbVByb2ZpbGUtPktleXMuS2V5TGVuZ3RoW2tleUlkXTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShkZXYsZXh0cmEsJihwUm9hbVByb2ZpbGUtPktleXMuS2V5TWF0ZXJpYWxba2V5SWRdWzBdKSxwUm9hbVByb2ZpbGUtPktleXMuS2V5TGVuZ3RoW2tleUlkXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpIDwgTUFYX1dFUF9LRVlTOyBpKyspCisgICAgeworICAgICAgICBpZihwUm9hbVByb2ZpbGUtPktleXMuS2V5TWF0ZXJpYWxbaV0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKE1BWF9XRVBfS0VZUyA9PSBpKQorICAgIHsKKyAgICAgICAgZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX05PS0VZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKyAgICB9CisKKyAgICBlbmNyeXB0aW9uVHlwZSA9IHBSb2FtUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF07CisKKyAgICBpZihlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FID09IGVuY3J5cHRpb25UeXBlKQorICAgIHsKKyAgICAgICAgZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworICAgIH0KKworICAgIGF1dGhUeXBlID0gKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLmF1dGhUeXBlOworCisgICAgaWYoSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0gPT0gYXV0aFR5cGUpCisgICAgeworICAgICAgICBkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CisgICAgfQorICAgIEVYSVQoKTsKKyAgICByZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGl3X3NldF9lbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisgICAgaGRkX3dleHRfc3RhdGVfdCAgKnBXZXh0U3RhdGUgPSAgV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICBlSGFsU3RhdHVzIGhhbFN0YXR1cz0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgIHRDc3JSb2FtUHJvZmlsZSAqcFJvYW1Qcm9maWxlID0gJnBXZXh0U3RhdGUtPnJvYW1Qcm9maWxlOworICAgIHZfVTMyX3Qgc3RhdHVzID0gMDsKKworICAgIHN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQqKWV4dHJhOworCisgICAgdl9VOF90IGdyb3VwbWFjYWRkcltXTklfQ0ZHX0JTU0lEX0xFTl0gPSB7MHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZ9OworCisgICAgaW50IGtleV9pbmRleDsKKyAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworICAgIHRDc3JSb2FtU2V0S2V5ICBzZXRLZXk7CisgICAgdl9VMzJfdCAgcm9hbUlkPSAweEZGOworICAgIFZPU19TVEFUVVMgdm9zX3N0YXR1czsKKworICAgIEVOVEVSKCk7CisKKyAgICBpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aXNMb2dwSW5Qcm9ncmVzcykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAga2V5X2luZGV4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCisgICAgaWYoa2V5X2luZGV4ID4gMCkgeworCisgICAgICAgICAvKkNvbnZlcnQgZnJvbSAxLWJhc2VkIHRvIDAtYmFzZWQga2V5aW5nKi8KKyAgICAgICAga2V5X2luZGV4LS07CisgICAgfQorICAgIGlmKCFleHQtPmtleV9sZW4pIHsKKworICAgICAgLypTZXQgdGhlIGVuY3J5dGlvbiB0eXBlIHRvIE5PTkUqLworICAgICAgIHBSb2FtUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYoZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQgPT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVdfRU5DT0RFX0FMR19XRVAgPT0gZXh0LT5hbGcpKQorICAgIHsKKyAgICAgICBpZihJV19BVVRIX0tFWV9NR01UXzgwMl8xWCA9PSBwV2V4dFN0YXRlLT5hdXRoS2V5TWdtdCkgeworCisgICAgICAgICAgVk9TX1RSQUNFIChWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sKCJJbnZhbGlkIENvbmZpZ3VyYXRpb246JXMgXG4iKSxfX0ZVTkNUSU9OX18pOworICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgIH0KKyAgICAgICBlbHNlIHsKKyAgICAgICAgIC8qU3RhdGljIHdlcCwgdXBkYXRlIHRoZSByb2FtIHByb2ZpbGUgd2l0aCB0aGUga2V5cyAqLworICAgICAgICAgIGlmKGV4dC0+a2V5ICYmIChleHQtPmtleV9sZW4gPD0gZUNTUl9TRUNVUklUWV9XRVBfS0VZU0laRV9NQVhfQllURVMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfaW5kZXggPCBDU1JfTUFYX05VTV9LRVkpIHsKKyAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBSb2FtUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFtrZXlfaW5kZXhdWzBdLGV4dC0+a2V5LGV4dC0+a2V5X2xlbik7CisgICAgICAgICAgICAgcFJvYW1Qcm9maWxlLT5LZXlzLktleUxlbmd0aFtrZXlfaW5kZXhdID0gKHZfVThfdClleHQtPmtleV9sZW47CisKKyAgICAgICAgICAgICBpZihleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgICAgICAgICBwUm9hbVByb2ZpbGUtPktleXMuZGVmYXVsdEluZGV4ID0gKHZfVThfdClrZXlfaW5kZXg7CisKKyAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdm9zX21lbV96ZXJvKCZzZXRLZXksc2l6ZW9mKHRDc3JSb2FtU2V0S2V5KSk7CisKKyAgICBzZXRLZXkua2V5SWQgPSBrZXlfaW5kZXg7CisgICAgc2V0S2V5LmtleUxlbmd0aCA9IGV4dC0+a2V5X2xlbjsKKworICAgIGlmKGV4dC0+a2V5X2xlbiA8PSBDU1JfTUFYX0tFWV9MRU4pIHsKKyAgICAgICB2b3NfbWVtX2NvcHkoJnNldEtleS5LZXlbMF0sZXh0LT5rZXksZXh0LT5rZXlfbGVuKTsKKyAgICB9CisKKyAgICBpZihleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKSB7CisgICAgICAvKktleSBkaXJlY3Rpb24gZm9yIGdyb3VwIGlzIFJYIG9ubHkqLworICAgICAgIHNldEtleS5rZXlEaXJlY3Rpb24gPSBlU0lSX1JYX09OTFk7CisgICAgICAgdm9zX21lbV9jb3B5KHNldEtleS5wZWVyTWFjLGdyb3VwbWFjYWRkcixXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgc2V0S2V5LmtleURpcmVjdGlvbiA9ICBlU0lSX1RYX1JYOworICAgICAgIHZvc19tZW1fY29weShzZXRLZXkucGVlck1hYyxleHQtPmFkZHIuc2FfZGF0YSxXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgfQorCisgICAgLypGb3Igc3VwcGxpY2FudCBwYWUgcm9sZSBpcyB6ZXJvKi8KKyAgICBzZXRLZXkucGFlUm9sZSA9IDA7CisKKyAgICBzd2l0Y2goZXh0LT5hbGcpCisgICAgeworICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorICAgICAgICAgc2V0S2V5LmVuY1R5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorICAgICAgICAgc2V0S2V5LmVuY1R5cGUgPSAoZXh0LT5rZXlfbGVuPT0gNSkgPyBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDplQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ7CisgICAgICAgICBicmVhazsKKworICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorICAgICAgIHsKKyAgICAgICAgICB2X1U4X3QgKnBLZXkgPSAmc2V0S2V5LktleVswXTsKKworICAgICAgICAgIHNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDsKKworICAgICAgICAgIHZvc19tZW1femVybyhwS2V5LCBDU1JfTUFYX0tFWV9MRU4pOworCisgICAgICAgICAgLypTdXBwbGljYW50IHNlbmRzIHRoZSAzMmJ5dGVzIGtleSBpbiB0aGlzIG9yZGVyCisKKyAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgICAgICAgICAgIHwgICBUazEgICAgICAgIHxUWC1NSUMgICAgfCAgUlggTWljICB8CisgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICAgICAgICAgICA8LS0tMTZieXRlcy0tLT48LS04Ynl0ZXMtLT48LS04Ynl0ZXMtLT4KKworICAgICAgICAgICAgICAgICovCisgICAgICAgICAgLypTbWUgZXhwZWN0cyB0aGUgMzIgYnl0ZXMga2V5IHRvIGJlIGluIHRoZSBiZWxvdyBvcmRlcgorCisgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICAgICAgICAgICB8ICAgVGsxICAgICAgICB8UlgtTUlDICAgIHwgIFRYIE1pYyAgfAorICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgICAgICAgICAgPC0tLTE2Ynl0ZXMtLS0+PC0tOGJ5dGVzLS0+PC0tOGJ5dGVzLS0+CisgICAgICAgICAgICAgICAqLworICAgICAgICAgIC8qIENvcHkgdGhlIFRlbXBvcmFsIEtleSAxIChUSzEpICovCisgICAgICAgICAgdm9zX21lbV9jb3B5KHBLZXksZXh0LT5rZXksMTYpOworCisgICAgICAgICAvKkNvcHkgdGhlIHJ4IG1pYyBmaXJzdCovCisgICAgICAgICAgdm9zX21lbV9jb3B5KCZwS2V5WzE2XSwmZXh0LT5rZXlbMjRdLDgpOworCisgICAgICAgICAvKkNvcHkgdGhlIHR4IG1pYyAqLworICAgICAgICAgIHZvc19tZW1fY29weSgmcEtleVsyNF0sJmV4dC0+a2V5WzE2XSw4KTsKKworICAgICAgIH0KKyAgICAgICBicmVhazsKKworICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorICAgICAgICAgIHNldEtleS5lbmNUeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorI2RlZmluZSBJV19FTkNPREVfQUxHX0tSSyA2CisgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0tSSzoKKyAgICAgICAgICBzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX0tSSzsKKyAgICAgICAgICBicmVhazsKKyNlbmRpZiAgLyogRkVBVFVSRV9XTEFOX0NDWCAqLworCisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBzZXRLZXkuZW5jVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAoIiVzOmNpcGhlcl9hbGc6JWQga2V5X2xlblslZF0gKnBFbmNyeXB0aW9uVHlwZSA6JWQgXG4iKSxfX0ZVTkNUSU9OX18sKGludClleHQtPmFsZywoaW50KWV4dC0+a2V5X2xlbixzZXRLZXkuZW5jVHlwZSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyogVGhlIHN1cHBsaWNhbnQgbWF5IGF0dGVtcHQgdG8gc2V0IHRoZSBQVEsgb25jZSBwcmUtYXV0aGVudGljYXRpb24gaXMgZG9uZS4KKyAgIFNhdmUgdGhlIGtleSBpbiB0aGUgVU1BQyBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgQUREIEJTUyByZXF1ZXN0ICovCisgICAgaGFsU3RhdHVzID0gc21lX0ZUVXBkYXRlS2V5KCBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksICZzZXRLZXkpOworICAgIGlmKCBoYWxTdGF0dXMgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICAgeworICAgICAgIHJldHVybiBoYWxTdGF0dXM7CisgICAgfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKyAgICBwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfU0VUVElOR19LRVk7CisKKyAgICB2b3Nfc3RhdHVzID0gd2xhbl9oZGRfY2hlY2tfdWxhX2RvbmUocEFkYXB0ZXIpOworICAgIGlmICggdm9zX3N0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MgKQorICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlslNGRdIHdsYW5faGRkX2NoZWNrX3VsYV9kb25lIHJldHVybmVkIEVSUk9SIHN0YXR1cz0gJWQiLAorICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCB2b3Nfc3RhdHVzICk7CisKKyAgICAgICBwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfTk9ORTsKKyAgICB9CisKKyAgICBoYWxTdGF0dXMgPSBzbWVfUm9hbVNldEtleSggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLHBBZGFwdGVyLT5zZXNzaW9uSWQsICZzZXRLZXksICZyb2FtSWQgKTsKKworICAgIGlmICggaGFsU3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKQorICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlslNGRdIHNtZV9Sb2FtU2V0S2V5IHJldHVybmVkIEVSUk9SIHN0YXR1cz0gJWQiLAorICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBoYWxTdGF0dXMgKTsKKworICAgICAgIHBIZGRTdGFDdHgtPnJvYW1faW5mby5yb2FtaW5nU3RhdGUgPSBIRERfUk9BTV9TVEFURV9OT05FOworICAgIH0KKworICAgcmV0dXJuIGhhbFN0YXR1czsKK30KKworc3RhdGljIGludCBpd19zZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworCisgICBFTlRFUigpOworCisgICBpZih3cnF1LT5yZXRyeS52YWx1ZSA8IFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVF9TVEFNSU4gfHwKKyAgICAgICB3cnF1LT5yZXRyeS52YWx1ZSA+IFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVF9TVEFNQVgpIHsKKworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICgiSW52YWxpZCBSZXRyeS1MaW1pdD0lbGQhIVxuIiksd3JxdS0+cmV0cnkudmFsdWUpOworCisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgIH0KKworICAgaWYod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkgeworCisgICAgICAgaWYoKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTE9ORykpCisgICAgICAgeworICAgICAgICAgIGlmICggY2NtQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVCwgd3JxdS0+cmV0cnkudmFsdWUsIGNjbUNmZ1NldENhbGxiYWNrLCBlQU5JX0JPT0xFQU5fVFJVRSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICAgICAgICAgeworICAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgZWxzZSBpZigod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9TSE9SVCkpCisgICAgICAgeworICAgICAgICAgIGlmICggY2NtQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVQsIHdycXUtPnJldHJ5LnZhbHVlLCBjY21DZmdTZXRDYWxsYmFjaywgZUFOSV9CT09MRUFOX1RSVUUpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgICB9CisgICAgICAgfQorICAgfQorICAgZWxzZQorICAgeworICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgIH0KKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgKCJTZXQgUmV0cnktTGltaXQ9JWxkISFcbiIpLHdycXUtPnJldHJ5LnZhbHVlKTsKKworICAgRVhJVCgpOworCisgICByZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGl3X2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisgICB2X1UzMl90IHJldHJ5ID0gMDsKKworICAgRU5URVIoKTsKKworICAgaWYoKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTE9ORykpCisgICB7CisgICAgICB3cnF1LT5yZXRyeS5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTE9ORzsKKworICAgICAgaWYgKCBjY21DZmdHZXRJbnQoaEhhbCwgV05JX0NGR19MT05HX1JFVFJZX0xJTUlULCAmcmV0cnkpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKQorICAgICAgeworICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICB9CisKKyAgICAgIHdycXUtPnJldHJ5LnZhbHVlID0gcmV0cnk7CisgICB9CisgICBlbHNlIGlmICgod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9TSE9SVCkpCisgICB7CisgICAgICB3cnF1LT5yZXRyeS5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfU0hPUlQ7CisKKyAgICAgIGlmICggY2NtQ2ZnR2V0SW50KGhIYWwsIFdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVQsICZyZXRyeSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICAgICB7CisgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgIH0KKworICAgICAgd3JxdS0+cmV0cnkudmFsdWUgPSByZXRyeTsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgfQorCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAoIlJldHJ5LUxpbWl0PSVsZCEhXG4iKSxyZXRyeSk7CisKKyAgIEVYSVQoKTsKKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworICAgIHN0cnVjdCBpd19tbG1lICptbG1lID0gKHN0cnVjdCBpd19tbG1lICopZXh0cmE7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICAgRU5URVIoKTsKKworICAgIGlmICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5pc0xvZ3BJblByb2dyZXNzKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOkxPR1AgaW4gUHJvZ3Jlc3MuIElnbm9yZSEhISIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvL3JlYXNvbl9jb2RlIGlzIHVudXNlZC4gQnkgZGVmYXVsdCBpdCBpcyBzZXQgdG8gZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRAorICAgIHN3aXRjaCAobWxtZS0+Y21kKSB7CisgICAgICAgIGNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKyAgICAgICAgY2FzZSBJV19NTE1FX0RFQVVUSDoKKworICAgICAgICAgICAgaWYoIHBIZGRTdGFDdHgtPmNvbm5faW5mby5jb25uU3RhdGUgPT0gZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlQ3NyUm9hbURpc2Nvbm5lY3RSZWFzb24gcmVhc29uID0gZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRDsKKworICAgICAgICAgICAgICAgIGlmKCBtbG1lLT5yZWFzb25fY29kZSA9PSBIRERfUkVBU09OX01JQ0hBRUxfTUlDX0ZBSUxVUkUgKQorICAgICAgICAgICAgICAgICAgICByZWFzb24gPSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX01JQ19FUlJPUjsKKworICAgICAgICAgICAgICAgIElOSVRfQ09NUExFVElPTihwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3Zhcik7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX1JvYW1EaXNjb25uZWN0KCBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIHBBZGFwdGVyLT5zZXNzaW9uSWQscmVhc29uKTsKKworICAgICAgICAgICAgICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwQWRhcHRlci0+ZGlzY29ubmVjdF9jb21wX3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfRElTQ09OTkVDVCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsIiVzICVkIENvbW1hbmQgRGlzYXNzb2NpYXRlL0RlYXV0aGVudGljYXRlIDogY3NyUm9hbURpc2Nvbm5lY3QgZmFpbHVyZSByZXR1cm5lZCAlZCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKGludCltbG1lLT5jbWQsIChpbnQpc3RhdHVzICk7CisKKyAgICAgICAgICAgICAgICAvKiBSZXNldHRpbmcgYXV0aEtleU1nbXQgKi8KKyAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKSktPmF1dGhLZXlNZ210ID0gMDsKKworICAgICAgICAgICAgICAgIG5ldGlmX3R4X2Rpc2FibGUoZGV2KTsKKyAgICAgICAgICAgICAgICBuZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGRkTG9nKExPR0UsIiVzICVkIENvbW1hbmQgRGlzYXNzb2NpYXRlL0RlYXV0aGVudGljYXRlIGNhbGxlZCBidXQgc3RhdGlvbiBpcyBub3QgaW4gYXNzb2NpYXRlZCBzdGF0ZSBcbiIsIF9fRlVOQ1RJT05fXywgKGludCltbG1lLT5jbWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGRkTG9nKExPR0UsIiVzICVkIENvbW1hbmQgc2hvdWxkIGJlIERpc2Fzc29jaWF0ZS9EZWF1dGhlbnRpY2F0ZSBcbiIsIF9fRlVOQ1RJT05fXywgKGludCltbG1lLT5jbWQgKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0vL2VuZCBvZiBzd2l0Y2gKKworICAgIEVYSVQoKTsKKworICAgIHJldHVybiBzdGF0dXM7CisKK30KKworLyogc2V0IHBhcmFtIHN1Yi1pb2N0bHMgKi8KK3N0YXRpYyBpbnQgaXdfc2V0aW50X2dldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICB0SGFsSGFuZGxlIGhIYWwgPSBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlcik7CisgICAgaGRkX3dleHRfc3RhdGVfdCAgKnBXZXh0U3RhdGUgPSAgV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICBpbnQgKnZhbHVlID0gKGludCAqKWV4dHJhOworICAgIGludCBzdWJfY21kID0gdmFsdWVbMF07CisgICAgaW50IHNldF92YWx1ZSA9IHZhbHVlWzFdOworICAgIGludCByZXQgPSAwOyAvKiBzdWNjZXNzICovCisgICAgaW50IGVuYWJsZV9wYm0sIGVuYWJsZV9tcDsKKyNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAorICAgIHZfVThfdCBuRW5hYmxlU3VzcGVuZE9sZDsKKyNlbmRpZgorICAgIElOSVRfQ09NUExFVElPTihwV2V4dFN0YXRlLT5jb21wbGV0aW9uX3Zhcik7CisKKyAgICBzd2l0Y2goc3ViX2NtZCkKKyAgICB7CisgICAgICAgIGNhc2UgV0VfU0VUXzExRF9TVEFURToKKyAgICAgICAgeworICAgICAgICAgICAgdFNtZUNvbmZpZ1BhcmFtcyBzbWVDb25maWc7OworICAgICAgICAgICAgaWYoKEVOQUJMRV8xMUQgPT0gc2V0X3ZhbHVlKSB8fCAoRElTQUJMRV8xMUQgPT0gc2V0X3ZhbHVlKSkgeworCisgICAgICAgICAgICAgICAgc21lX0dldENvbmZpZ1BhcmFtKGhIYWwsJnNtZUNvbmZpZyk7CisgICAgICAgICAgICAgICAgc21lQ29uZmlnLmNzckNvbmZpZy5JczExZFN1cHBvcnRFbmFibGVkID0gKHZfQk9PTF90KXNldF92YWx1ZTsKKworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICgiMTFEIHN0YXRlPSVsZCEhXG4iKSxzbWVDb25maWcuY3NyQ29uZmlnLklzMTFkU3VwcG9ydEVuYWJsZWQpOworCisgICAgICAgICAgICAgICAgc21lX1VwZGF0ZUNvbmZpZyhoSGFsLCZzbWVDb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBXRV9XT1dMOgorICAgICAgICB7CisgICAgICAgICAgIHN3aXRjaCAoc2V0X3ZhbHVlKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgICAgICAgICAgaGRkX2V4aXRfd293bCgpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICAgIGNhc2UgMHgwMzoKKyAgICAgICAgICAgICAgICAgZW5hYmxlX21wID0gIChzZXRfdmFsdWUgJiAweDAxKSA/IDEgOiAwOworICAgICAgICAgICAgICAgICBlbmFibGVfcGJtID0gKHNldF92YWx1ZSAmIDB4MDIpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgIGhkZExvZyhMT0dFLCAibWFnaWMgcGFja2V0ID8gPSAlcyBwYXR0ZXJuIGJ5dGUgbWF0Y2hpbmcgPyA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgKGVuYWJsZV9tcCA/ICJZRVMiOiJOTyIpLCAoZW5hYmxlX3BibSA/ICJZRVMiOiJOTyIpKTsKKyAgICAgICAgICAgICAgICAgaGRkX2VudGVyX3dvd2wocEFkYXB0ZXIsIGVuYWJsZV9tcCwgZW5hYmxlX3BibSk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgIkludmFsaWQgYXJnICAlZCBpbiBXRV9XT1dMIElPQ1RMXG4iLCBzZXRfdmFsdWUpOworICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfU0VUX1BPV0VSOgorICAgICAgICB7CisgICAgICAgICAgIHN3aXRjaCAoc2V0X3ZhbHVlKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgIDA6IC8vRnVsbCBQb3dlcgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0c0NvbnRleHQgY29udGV4dDsKKyAgICAgICAgICAgICAgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisKKyAgICAgICAgICAgICAgICAgaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LmNvbXBsZXRpb24pOworCisgICAgICAgICAgICAgICAgIGNvbnRleHQucEFkYXB0ZXIgPSBwQWRhcHRlcjsKKyAgICAgICAgICAgICAgICAgY29udGV4dC5tYWdpYyA9IFBPV0VSX0NPTlRFWFRfTUFHSUM7CisKKyAgICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX1JlcXVlc3RGdWxsUG93ZXIoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXdfcG93ZXJfY2FsbGJhY2tfZm4sICZjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNNRV9GVUxMX1BXUl9ORUVERURfQllfSEREKTsKKyAgICAgICAgICAgICAgICAgaWYoZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgPT0gc3RhdHVzKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBscmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dC5jb21wbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0xBTl9XQUlUX1RJTUVfUE9XRVIpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tYWdpYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChscmMgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogU01FICVzIHdoaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0aW5nIGZ1bGxwb3dlciAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAoMCA9PSBscmMpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IiA6ICJpbnRlcnJ1cHQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBzdWNoIHRoYXQgdGhlIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvdWxkIGJlIGV4ZWN1dGluZyBhdCB0aGUgc2FtZSB0aW1lIHdlIGFyZS4gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSBjb25jZXJuIGlzIGlmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBoYWQgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZmllZCB0aGUgIm1hZ2ljIiBidXQgaGFzbid0IHlldCBzZXQgdGhlIGNvbXBsZXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuIFNpbmNlIHRoZSBjb21wbGV0aW9uIHZhcmlhYmxlIGlzIG9uIG91cgorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjaywgd2UnbGwgZGVsYXkganVzdCBhIGJpdCB0byBtYWtlIHN1cmUgdGhlIGRhdGEgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgdmFsaWQgaWYgdGhhdCBpcyB0aGUgY2FzZSAqLworICAgICAgICAgICAgICAgICAgICAgICBtc2xlZXAoNTApOworICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSdsbCBub3cgcmV0dXJuZWQgYSBjYWNoZWQgdmFsdWUgYmVsb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGhkZExvZyhMT0dFLCAiaXdwcml2IEZ1bGwgUG93ZXIgY29tcGxldGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2FzZSAgMTogLy9FbmFibGUgQk1QUworICAgICAgICAgICAgICAgICBzbWVfRW5hYmxlUG93ZXJTYXZlKGhIYWwsIGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRSk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlICAyOiAvL0Rpc2FibGUgQk1QUworICAgICAgICAgICAgICAgICBzbWVfRGlzYWJsZVBvd2VyU2F2ZShoSGFsLCBlUE1DX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkUpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAgMzogLy9SZXF1ZXN0IEJtcHMKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdHNDb250ZXh0IGNvbnRleHQ7CisgICAgICAgICAgICAgICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCisgICAgICAgICAgICAgICAgIGluaXRfY29tcGxldGlvbigmY29udGV4dC5jb21wbGV0aW9uKTsKKworICAgICAgICAgICAgICAgICBjb250ZXh0LnBBZGFwdGVyID0gcEFkYXB0ZXI7CisgICAgICAgICAgICAgICAgIGNvbnRleHQubWFnaWMgPSBQT1dFUl9DT05URVhUX01BR0lDOworCisgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9SZXF1ZXN0Qm1wcyhXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpd19wb3dlcl9jYWxsYmFja19mbiwgJmNvbnRleHQpOworICAgICAgICAgICAgICAgICBpZihlSEFMX1NUQVRVU19QTUNfUEVORElORyA9PSBzdGF0dXMpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0LmNvbXBsZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9QT1dFUikpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm1hZ2ljID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxyYyA8PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBTTUUgJXMgd2hpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdGluZyBCTVBTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKDAgPT0gbHJjKSA/ICJ0aW1lb3V0IiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJydXB0Iik7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gc3VjaCB0aGF0IHRoZSBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb3VsZCBiZSBleGVjdXRpbmcgYXQgdGhlIHNhbWUgdGltZSB3ZSBhcmUuIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgY29uY2VybiBpcyBpZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaGFkIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZpZWQgdGhlICJtYWdpYyIgYnV0IGhhc24ndCB5ZXQgc2V0IHRoZSBjb21wbGV0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLiBTaW5jZSB0aGUgY29tcGxldGlvbiB2YXJpYWJsZSBpcyBvbiBvdXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2ssIHdlJ2xsIGRlbGF5IGp1c3QgYSBiaXQgdG8gbWFrZSBzdXJlIHRoZSBkYXRhIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIHZhbGlkIGlmIHRoYXQgaXMgdGhlIGNhc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogd2UnbGwgbm93IHJldHVybmVkIGEgY2FjaGVkIHZhbHVlIGJlbG93ICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgIml3cHJpdiBSZXF1ZXN0IEJNUFMgY29tcGxldGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2FzZSAgNDogLy9FbmFibGUgSU1QUworICAgICAgICAgICAgICAgICBzbWVfRW5hYmxlUG93ZXJTYXZlKGhIYWwsIGVQTUNfSURMRV9NT0RFX1BPV0VSX1NBVkUpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAgNTogLy9EaXNhYmxlIElNUFMKKyAgICAgICAgICAgICAgICAgc21lX0Rpc2FibGVQb3dlclNhdmUoaEhhbCwgZVBNQ19JRExFX01PREVfUE9XRVJfU0FWRSk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlICA2OiAvL0VuYWJsZSBTdGFuZGJ5CisgICAgICAgICAgICAgICAgIHNtZV9FbmFibGVQb3dlclNhdmUoaEhhbCwgZVBNQ19TVEFOREJZX01PREVfUE9XRVJfU0FWRSk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlICA3OiAvL0Rpc2FibGUgU3RhbmRieQorICAgICAgICAgICAgICAgICBzbWVfRGlzYWJsZVBvd2VyU2F2ZShoSGFsLCBlUE1DX1NUQU5EQllfTU9ERV9QT1dFUl9TQVZFKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgIDg6IC8vUmVxdWVzdCBTdGFuZGJ5CisjaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgICAgICAgICAgICAgICh2b2lkKWhkZF9lbnRlcl9zdGFuZGJ5KHBBZGFwdGVyLT5wSGRkQ3R4KTsKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlICA5OiAvL1N0YXJ0IEF1dG8gQm1wcyBUaW1lcgorICAgICAgICAgICAgICAgICBzbWVfU3RhcnRBdXRvQm1wc1RpbWVyKGhIYWwpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAgMTA6Ly9TdG9wIEF1dG8gQk1QUyBUaW1lcgorICAgICAgICAgICAgICAgICBzbWVfU3RvcEF1dG9CbXBzVGltZXIoaEhhbCk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECisgICAgICAgICAgICAgIGNhc2UgIDExOi8vc3VzcGVuZCB0byBzdGFuZGJ5CisjaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKKyAgICAgICAgICAgICAgICAgbkVuYWJsZVN1c3BlbmRPbGQgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5uRW5hYmxlU3VzcGVuZDsKKyAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+bkVuYWJsZVN1c3BlbmQgPSAxOworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICAgICAgICAgICAgICAgaGRkX3N1c3BlbmRfd2xhbihOVUxMKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5uRW5hYmxlU3VzcGVuZCA9IG5FbmFibGVTdXNwZW5kT2xkOworI2VuZGlmCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlICAxMjovL3N1c3BlbmQgdG8gZGVlcCBzbGVlcAorI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECisgICAgICAgICAgICAgICAgIG5FbmFibGVTdXNwZW5kT2xkID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+bkVuYWJsZVN1c3BlbmQ7CisgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPm5FbmFibGVTdXNwZW5kID0gMjsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgICAgICAgICAgICAgIGhkZF9zdXNwZW5kX3dsYW4oTlVMTCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+bkVuYWJsZVN1c3BlbmQgPSBuRW5hYmxlU3VzcGVuZE9sZDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAgMTM6Ly9yZXN1bWUgZnJvbSBzdXNwZW5kCisjaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgICAgICAgICAgICAgIGhkZF9yZXN1bWVfd2xhbihOVUxMKTsKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICAgIGNhc2UgIDE0Oi8vcmVzZXQgd2xhbiAocG93ZXIgZG93bi9wb3dlciB1cCkKKyAgICAgICAgICAgICAgICAgdm9zX2NoaXBSZXNldChOVUxMLCBWT1NfRkFMU0UsIE5VTEwsIE5VTEwsIFZPU19DSElQX1JFU0VUX1VOS05PV05fRVhDRVBUSU9OKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgIGhkZExvZyhMT0dFLCAiSW52YWxpZCBhcmcgICVkIGluIFdFX1NFVF9QT1dFUiBJT0NUTFxuIiwgc2V0X3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFdFX1NFVF9NQVhfQVNTT0M6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoV05JX0NGR19BU1NPQ19TVEFfTElNSVRfU1RBTUlOID4gc2V0X3ZhbHVlKSB8fAorICAgICAgICAgICAgICAgIChXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVF9TVEFNQVggPCBzZXRfdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggY2NtQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdmFsdWUsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgICAhPSBlSEFMX1NUQVRVU19TVUNDRVNTICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUlPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFdFX1NFVF9TQVBfQVVUT19DSEFOTkVMX1NFTEVDVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIDAgPT0gc2V0X3ZhbHVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5hcEF1dG9DaGFubmVsU2VsZWN0aW9uID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAxID09IHNldF92YWx1ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+YXBBdXRvQ2hhbm5lbFNlbGVjdGlvbiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGhkZExvZyhMT0dFLCAiSW52YWxpZCBhcmcgICVkIGluIFdFX1NFVF9TQVBfQVVUT19DSEFOTkVMX1NFTEVDVElPTiBJT0NUTFxuIiwgc2V0X3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgIGNhc2UgIFdFX1NFVF9EQVRBX0lOQUNUSVZJVFlfVE86CisgICAgICAgIHsKKyAgICAgICAgICAgaWYgICgoc2V0X3ZhbHVlIDwgQ0ZHX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUX01JTikgfHwKKyAgICAgICAgICAgICAgICAoc2V0X3ZhbHVlID4gQ0ZHX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUX01BWCkgfHwKKyAgICAgICAgICAgICAgICAoY2NtQ2ZnU2V0SW50KChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmhIYWwsCisgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgIHNldF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKT09ZUhBTF9TVEFUVVNfRkFJTFVSRSkpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGhkZExvZyhMT0dFLCJGYWlsdXJlOiBDb3VsZCBub3QgcGFzcyBvbiAiCisgICAgICAgICAgICAgICAgIldOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVQgY29uZmlndXJhdGlvbiBpbmZvICIKKyAgICAgICAgICAgICAgICAidG8gQ0NNXG4iKTsKKyAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXRV9TRVRfTUFYX1RYX1BPV0VSOgorICAgICAgICB7CisgICAgICAgICAgIHRTaXJNYWNBZGRyIGJzc2lkID0gezB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGfTsKKyAgICAgICAgICAgdFNpck1hY0FkZHIgc2VsZk1hYyA9IHsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRn07CisKKyAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFNldHRpbmcgbWF4aW11bSB0eCBwb3dlciAlZCBkQm0iLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHNldF92YWx1ZSk7CisgICAgICAgICAgIGlmKCBzbWVfU2V0TWF4VHhQb3dlcihoSGFsLCBic3NpZCwgc2VsZk1hYywgc2V0X3ZhbHVlKSAhPQorICAgICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBTZXR0aW5nIG1heGltdW0gdHggcG93ZXIgZmFpbGVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfU0VUX0hJR0hFUl9EVElNX1RSQU5TSVRJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCEoKHNldF92YWx1ZSA9PSBlQU5JX0JPT0xFQU5fRkFMU0UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRfdmFsdWUgPT0gZUFOSV9CT09MRUFOX1RSVUUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgIkR5bmFtaWMgRFRJTSBJbmNvcnJlY3QgZGF0YTolZCIsIHNldF92YWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwQWRhcHRlci0+aGlnaGVyRHRpbVRyYW5zaXRpb24gIT0gc2V0X3ZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmhpZ2hlckR0aW1UcmFuc2l0aW9uID0gc2V0X3ZhbHVlOworICAgICAgICAgICAgICAgICAgICBoZGRMb2coTE9HMSwgIiVzOiBoaWdoZXJEdGltVHJhbnNpdGlvbiBzZXQgdG8gOiVkIiwgX19GVU5DVElPTl9fLCBwQWRhcHRlci0+aGlnaGVyRHRpbVRyYW5zaXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgV0VfU0VUX1RNX0xFVkVMOgorICAgICAgICB7CisgICAgICAgICAgIGhkZF9jb250ZXh0X3QgKmhkZEN0eHQgPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKyAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiU2V0IFRoZXJtYWwgTWl0aWdhdGlvbiBMZXZlbCAlZCIsIChpbnQpc2V0X3ZhbHVlKTsgCisgICAgICAgICAgIGhkZERldlRtTGV2ZWxDaGFuZ2VkSGFuZGxlcihoZGRDdHh0LT5wYXJlbnRfZGV2LCBzZXRfdmFsdWUpOworCisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKExPR0UsICJJbnZhbGlkIElPQ1RMIHNldHZhbHVlIGNvbW1hbmQgJWQgdmFsdWUgJWQgXG4iLAorICAgICAgICAgICAgICAgIHN1Yl9jbWQsIHNldF92YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIHNldCBwYXJhbSBzdWItaW9jdGxzICovCitzdGF0aWMgaW50IGl3X3NldGNoYXJfZ2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBWT1NfU1RBVFVTIHZzdGF0dXM7CisgICAgaW50IHN1Yl9jbWQgPSB3cnF1LT5kYXRhLmZsYWdzOworICAgIGludCByZXQgPSAwOyAvKiBzdWNjZXNzICovCisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAobmV0ZGV2X3ByaXYoZGV2KSk7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICBoZGRfY29uZmlnX3QgICpwQ29uZmlnID0gcEhkZEN0eC0+Y2ZnX2luaTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJICovCisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFJlY2VpdmVkIGxlbmd0aCAlZCIsIF9fRlVOQ1RJT05fXywgd3JxdS0+ZGF0YS5sZW5ndGgpOworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogUmVjZWl2ZWQgZGF0YSAlcyIsIF9fRlVOQ1RJT05fXywgKGNoYXIqKXdycXUtPmRhdGEucG9pbnRlcik7CisKKyAgICBzd2l0Y2goc3ViX2NtZCkKKyAgICB7CisgICAgICAgY2FzZSBXRV9XT1dMX0FERF9QVFJOOgorICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJBRERfUFRSTlxuIik7CisgICAgICAgICAgaGRkX2FkZF93b3dsX3B0cm4oKGNoYXIqKXdycXUtPmRhdGEucG9pbnRlcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBXRV9XT1dMX0RFTF9QVFJOOgorICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJERUxfUFRSTlxuIik7CisgICAgICAgICAgaGRkX2RlbF93b3dsX3B0cm4oKGNoYXIqKXdycXUtPmRhdGEucG9pbnRlcik7CisgICAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgICAgY2FzZSBXRV9ORUlHSEJPUl9SRVBPUlRfUkVRVUVTVDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAgdFJybU5laWdoYm9yUmVxIG5laWdoYm9yUmVxOworICAgICAgICAgICAgIHRScm1OZWlnaGJvclJzcENhbGxiYWNrSW5mbyBjYWxsYmFja0luZm87CisKKyAgICAgICAgICAgICBpZiAocENvbmZpZy0+ZlJybUVuYWJsZSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIk5laWdoYm9yIFJlcXVlc3RcbiIpOworICAgICAgICAgICAgICAgIG5laWdoYm9yUmVxLm5vX3NzaWQgPSAod3JxdS0+ZGF0YS5sZW5ndGggLSAxKSA/IGZhbHNlIDogdHJ1ZSA7CisgICAgICAgICAgICAgICAgaWYoICFuZWlnaGJvclJlcS5ub19zc2lkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgbmVpZ2hib3JSZXEuc3NpZC5sZW5ndGggPSAod3JxdS0+ZGF0YS5sZW5ndGggLSAxKSA+IDMyID8gMzIgOiAod3JxdS0+ZGF0YS5sZW5ndGggLSAxKSA7CisgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KCBuZWlnaGJvclJlcS5zc2lkLnNzSWQsIHdycXUtPmRhdGEucG9pbnRlciwgbmVpZ2hib3JSZXEuc3NpZC5sZW5ndGggKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8ubmVpZ2hib3JSc3BDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLm5laWdoYm9yUnNwQ2FsbGJhY2tDb250ZXh0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8udGltZW91dCA9IDUwMDA7ICAgLy81IHNlY29uZHMKKyAgICAgICAgICAgICAgICBzbWVfTmVpZ2hib3JSZXBvcnRSZXF1ZXN0KCAgV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCBwQWRhcHRlci0+c2Vzc2lvbklkLCAmbmVpZ2hib3JSZXEsICZjYWxsYmFja0luZm8gKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coTE9HRSwgIiVzOiBJZ25vcmluZyBuZWlnaGJvciByZXF1ZXN0IGFzIFJSTSBpcyBub3QgZW5hYmxlZFxuIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICBjYXNlIFdFX1NFVF9BUF9XUFNfSUU6CisgICAgICAgICAgaGRkTG9nKCBMT0dFLCAiUmVjZWl2ZWQgV0VfU0VUX0FQX1dQU19JRSIgKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgICAgc21lX3VwZGF0ZVAycEllKCBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIHdycXUtPmRhdGEucG9pbnRlciwgd3JxdS0+ZGF0YS5sZW5ndGggKTsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICBjYXNlIFdFX1NFVF9DT05GSUc6CisgICAgICAgICAgdnN0YXR1cyA9IGhkZF9leGVjdXRlX2NvbmZpZ19jb21tYW5kKHBIZGRDdHgsIHdycXUtPmRhdGEucG9pbnRlcik7CisgICAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2c3RhdHVzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICBkZWZhdWx0OgorICAgICAgIHsKKyAgICAgICAgICAgaGRkTG9nKExPR0UsICIlczogSW52YWxpZCBzdWIgY29tbWFuZCAlZFxuIixfX0ZVTkNUSU9OX18sIHN1Yl9jbWQpOworICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qIGdldCBwYXJhbSBzdWItaW9jdGxzICovCitzdGF0aWMgaW50IGl3X3NldG5vbmVfZ2V0aW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICAgdEhhbEhhbmRsZSBoSGFsID0gV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpOworICAgIGludCAqdmFsdWUgPSAoaW50ICopZXh0cmE7CisgICAgaW50IHJldCA9IDA7IC8qIHN1Y2Nlc3MgKi8KKworCisgICAgc3dpdGNoICh2YWx1ZVswXSkKKyAgICB7CisgICAgICAgIGNhc2UgV0VfR0VUXzExRF9TVEFURToKKyAgICAgICAgeworICAgICAgICAgICB0U21lQ29uZmlnUGFyYW1zIHNtZUNvbmZpZzs7CisgICAgICAgICAgIAorICAgICAgICAgICBzbWVfR2V0Q29uZmlnUGFyYW0oaEhhbCwmc21lQ29uZmlnKTsKKyAgICAgICAgICAgCisgICAgICAgICAgICp2YWx1ZSA9IHNtZUNvbmZpZy5jc3JDb25maWcuSXMxMWRTdXBwb3J0RW5hYmxlZDsKKworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgKCIxMUQgc3RhdGU9JWxkISFcbiIpLCp2YWx1ZSk7CisKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFdFX0lCU1NfU1RBVFVTOgorICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiKioqKlJldHVybiBJQlNTIFN0YXR1cyoqKioqXG4iKTsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXRV9QTUNfU1RBVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgICAqdmFsdWUgPSBwbWNHZXRQbWNTdGF0ZShoSGFsKTsKKyAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAoIlBNQyBzdGF0ZT0lbGQhIVxuIiksKnZhbHVlKTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdFX0dFVF9XTEFOX0RCRzoKKyAgICAgICAgeworICAgICAgICAgICB2b3NfdHJhY2VfZGlzcGxheSgpOworICAgICAgICAgICAqdmFsdWUgPSAwOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdFX01PRFVMRV9ET1dOX0lORDoKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiJXM6IHNlbmRpbmcgV0xBTl9NT0RVTEVfRE9XTl9JTkQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgc2VuZF9idGNfbmxpbmtfbXNnKFdMQU5fTU9EVUxFX0RPV05fSU5ELCAwKTsKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIiVzOiBUYWtlIGRvd24gQU1QIFBBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBCU0xfRGVpbml0KHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQsIE5VTEwpKTsKKyNlbmRpZgorICAgICAgICAgICAgLy9XTEFOQkFQX0Nsb3NlKHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQsIE5VTEwpKTsKKworICAgICAgICAgICAgKnZhbHVlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfR0VUX01BWF9BU1NPQzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNjbUNmZ0dldEludChoSGFsLCBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVCwgKHRBTklfVTMyICopdmFsdWUpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICAgICAgY2FzZSBXRV9HRVRfV0RJX0RCRzoKKyAgICAgICAgeworICAgICAgICAgICB3cGFsVHJhY2VEaXNwbGF5KCk7CisgICAgICAgICAgICp2YWx1ZSA9IDA7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisKKyAgICAgICAgY2FzZSBXRV9HRVRfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgICp2YWx1ZSA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPmFwQXV0b0NoYW5uZWxTZWxlY3Rpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdFX0dFVF9DT05DVVJSRU5DWV9NT0RFOgorICAgICAgICB7CisgICAgICAgICAgICp2YWx1ZSA9IGhkZF9nZXRfY29uY3VycmVuY3lfbW9kZSAoICk7CisKKyAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgKCJjb25jdXJyZW5jeSBtb2RlPSVkIFxuIiksKnZhbHVlKTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBoZGRMb2coTE9HRSwgIkludmFsaWQgSU9DVEwgZ2V0X3ZhbHVlIGNvbW1hbmQgJWQgIix2YWx1ZVswXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIHNldCBwYXJhbSBzdWItaW9jdGxzICovCitpbnQgaXdfc2V0X3RocmVlX2ludHNfZ2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBpbnQgKnZhbHVlID0gKGludCAqKWV4dHJhOworICAgIGludCBzdWJfY21kID0gdmFsdWVbMF07CisgICAgaW50IHJldCA9IDA7CisKKyAgICBzd2l0Y2goc3ViX2NtZCkKKyAgICB7CisgICAgICAgIGNhc2UgV0VfU0VUX1dMQU5fREJHOgorICAgICAgICB7CisgICAgICAgICAgICB2b3NfdHJhY2Vfc2V0VmFsdWUoIHZhbHVlWzFdLCB2YWx1ZVsyXSwgdmFsdWVbM10pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICAgICAgY2FzZSBXRV9TRVRfV0RJX0RCRzoKKyAgICAgICAgeworICAgICAgICAgICAgd3BhbFRyYWNlU2V0TGV2ZWwoIHZhbHVlWzFdLCB2YWx1ZVsyXSwgdmFsdWVbM10pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICAgICAgY2FzZSBXRV9TRVRfU0FQX0NIQU5ORUxTOgorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBpd19zb2Z0YXBfc2V0X2NoYW5uZWxfcmFuZ2UoIGRldiwgdmFsdWVbMV0sIHZhbHVlWzJdLCB2YWx1ZVszXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhMT0dFLCAiSW52YWxpZCBJT0NUTCBjb21tYW5kICVkICBcbiIsICBzdWJfY21kICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGl3X2dldF9jaGFyX3NldG5vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICBpbnQgc3ViX2NtZCA9IHdycXUtPmRhdGEuZmxhZ3M7CisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgIFZPU19TVEFUVVMgc3RhdHVzOworI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICBzd2l0Y2goc3ViX2NtZCkKKyAgICB7CisgICAgICAgIGNhc2UgV0VfV0xBTl9WRVJTSU9OOgorICAgICAgICB7CisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgICAgICAgICAgc3RhdHVzID0gaGRkX3dsYW5fZ2V0X3ZlcnNpb24ocEFkYXB0ZXIsIHdycXUsIGV4dHJhKTsKKyNlbHNlIC8vIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICAgICAgICAgIGNoYXIgKmJ1ZiA9IGV4dHJhOworICAgICAgICAgICAgd3JxdS0+ZGF0YS5sZW5ndGggPSBzbnByaW50ZihidWYsIFdFX01BWF9TVFJfTEVOLCAiJXNfIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9DSElQX1ZFUlNJT04pOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgV0VfR0VUX1NUQVRTOgorICAgICAgICB7CisgICAgICAgICAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisgICAgICAgICAgICBoZGRfdHhfcnhfc3RhdHNfdCAqcFN0YXRzID0gJnBBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzOworICAgICAgICAgICAgaGRkX2NoaXBfcmVzZXRfc3RhdHNfdCAqcFJlc2V0U3RhdHMgPSAmcEhkZEN0eC0+aGRkQ2hpcFJlc2V0U3RhdHM7CisKKyAgICAgICAgICAgIHNucHJpbnRmKGV4dHJhLCBXRV9NQVhfU1RSX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICJcblRyYW5zbWl0IgorICAgICAgICAgICAgICAgICAgICAgIlxuY2FsbGVkICV1LCBkcm9wcGVkICV1LCBiYWNrcHJlc3N1cmVkICV1LCBxdWV1ZWQgJXUiCisgICAgICAgICAgICAgICAgICAgICAiXG4gICAgICBkcm9wcGVkIEJLICV1LCBCRSAldSwgVkkgJXUsIFZPICV1IgorICAgICAgICAgICAgICAgICAgICAgIlxuICAgY2xhc3NpZmllZCBCSyAldSwgQkUgJXUsIFZJICV1LCBWTyAldSIKKyAgICAgICAgICAgICAgICAgICAgICJcbmJhY2twcmVzc3VyZWQgQksgJXUsIEJFICV1LCBWSSAldSwgVk8gJXUiCisgICAgICAgICAgICAgICAgICAgICAiXG4gICAgICAgcXVldWVkIEJLICV1LCBCRSAldSwgVkkgJXUsIFZPICV1IgorICAgICAgICAgICAgICAgICAgICAgIlxuZmV0Y2hlZCAldSwgZW1wdHkgJXUsIGxvd3JlcyAldSwgZGVxZXJyICV1IgorICAgICAgICAgICAgICAgICAgICAgIlxuZGVxdWV1ZWQgJXUsIGRlcHJlc3N1cmVkICV1LCBjb21wbGV0ZWQgJXUsIGZsdXNoZWQgJXUiCisgICAgICAgICAgICAgICAgICAgICAiXG4gICAgICBmZXRjaGVkIEJLICV1LCBCRSAldSwgVkkgJXUsIFZPICV1IgorICAgICAgICAgICAgICAgICAgICAgIlxuICAgICBkZXF1ZXVlZCBCSyAldSwgQkUgJXUsIFZJICV1LCBWTyAldSIKKyAgICAgICAgICAgICAgICAgICAgICJcbiAgZGVwcmVzc3VyZWQgQksgJXUsIEJFICV1LCBWSSAldSwgVk8gJXUiCisgICAgICAgICAgICAgICAgICAgICAiXG4gICAgICBmbHVzaGVkIEJLICV1LCBCRSAldSwgVkkgJXUsIFZPICV1IgorICAgICAgICAgICAgICAgICAgICAgIlxuXG5SZWNlaXZlIgorICAgICAgICAgICAgICAgICAgICAgIlxuY2hhaW5zICV1LCBwYWNrZXRzICV1LCBkcm9wcGVkICV1LCBkZWxpdmVyZWQgJXUsIHJlZnVzZWQgJXUiCisgICAgICAgICAgICAgICAgICAgICAiXG5cblJlc2V0c1N0YXRzIgorICAgICAgICAgICAgICAgICAgICAgIlxuIFRvdGFsTG9ncCAldSBDbWQ1MyAldSBNdXRleFJlYWQgJXUgIE1JRi1FcnJvciAldSBGVy1IZWFydGJlYXQgJXUgT3RoZXJzICV1IgorICAgICAgICAgICAgICAgICAgICAgIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0Q2FsbGVkLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eFhtaXREcm9wcGVkLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eFhtaXRCYWNrUHJlc3N1cmVkLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eFhtaXRRdWV1ZWQsCisKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0RHJvcHBlZEFDW1dMQU5UTF9BQ19CS10sCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4WG1pdERyb3BwZWRBQ1tXTEFOVExfQUNfQkVdLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eFhtaXREcm9wcGVkQUNbV0xBTlRMX0FDX1ZJXSwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0RHJvcHBlZEFDW1dMQU5UTF9BQ19WT10sCisKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0Q2xhc3NpZmllZEFDW1dMQU5UTF9BQ19CS10sCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4WG1pdENsYXNzaWZpZWRBQ1tXTEFOVExfQUNfQkVdLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eFhtaXRDbGFzc2lmaWVkQUNbV0xBTlRMX0FDX1ZJXSwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0Q2xhc3NpZmllZEFDW1dMQU5UTF9BQ19WT10sCisKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0QmFja1ByZXNzdXJlZEFDW1dMQU5UTF9BQ19CS10sCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4WG1pdEJhY2tQcmVzc3VyZWRBQ1tXTEFOVExfQUNfQkVdLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eFhtaXRCYWNrUHJlc3N1cmVkQUNbV0xBTlRMX0FDX1ZJXSwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0QmFja1ByZXNzdXJlZEFDW1dMQU5UTF9BQ19WT10sCisKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0UXVldWVkQUNbV0xBTlRMX0FDX0JLXSwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0UXVldWVkQUNbV0xBTlRMX0FDX0JFXSwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0UXVldWVkQUNbV0xBTlRMX0FDX1ZJXSwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhYbWl0UXVldWVkQUNbV0xBTlRMX0FDX1ZPXSwKKworICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eEZldGNoZWQsCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4RmV0Y2hFbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhGZXRjaExvd1Jlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhGZXRjaERlcXVldWVFcnJvciwKKworICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eEZldGNoRGVxdWV1ZWQsCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4RmV0Y2hEZVByZXNzdXJlZCwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhDb21wbGV0ZWQsCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4Rmx1c2hlZCwKKworICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eEZldGNoZWRBQ1tXTEFOVExfQUNfQktdLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eEZldGNoZWRBQ1tXTEFOVExfQUNfQkVdLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eEZldGNoZWRBQ1tXTEFOVExfQUNfVkldLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eEZldGNoZWRBQ1tXTEFOVExfQUNfVk9dLAorCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4RmV0Y2hEZXF1ZXVlZEFDW1dMQU5UTF9BQ19CS10sCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4RmV0Y2hEZXF1ZXVlZEFDW1dMQU5UTF9BQ19CRV0sCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4RmV0Y2hEZXF1ZXVlZEFDW1dMQU5UTF9BQ19WSV0sCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4RmV0Y2hEZXF1ZXVlZEFDW1dMQU5UTF9BQ19WT10sCisKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhGZXRjaERlUHJlc3N1cmVkQUNbV0xBTlRMX0FDX0JLXSwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhGZXRjaERlUHJlc3N1cmVkQUNbV0xBTlRMX0FDX0JFXSwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhGZXRjaERlUHJlc3N1cmVkQUNbV0xBTlRMX0FDX1ZJXSwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhGZXRjaERlUHJlc3N1cmVkQUNbV0xBTlRMX0FDX1ZPXSwKKworICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eEZsdXNoZWRBQ1tXTEFOVExfQUNfQktdLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eEZsdXNoZWRBQ1tXTEFOVExfQUNfQkVdLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eEZsdXNoZWRBQ1tXTEFOVExfQUNfVkldLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eEZsdXNoZWRBQ1tXTEFOVExfQUNfVk9dLAorCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnJ4Q2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgcFN0YXRzLT5yeFBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnJ4RHJvcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+cnhEZWxpdmVyZWQsCisgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnJ4UmVmdXNlZCwKKworICAgICAgICAgICAgICAgICAgICAgcFJlc2V0U3RhdHMtPnRvdGFsTG9ncFJlc2V0cywKKyAgICAgICAgICAgICAgICAgICAgIHBSZXNldFN0YXRzLT50b3RhbENNRDUzRmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICBwUmVzZXRTdGF0cy0+dG90YWxNdXRleFJlYWRGYWlsdXJlcywKKyAgICAgICAgICAgICAgICAgICAgIHBSZXNldFN0YXRzLT50b3RhbE1JRkVycm9yRmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICBwUmVzZXRTdGF0cy0+dG90YWxGV0hlYXJiZWF0RmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICBwUmVzZXRTdGF0cy0+dG90YWxVbmtub3duRXhjZXB0aW9ucworICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSsxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFdFX0dFVF9DRkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZF9jZmdfZ2V0X2NvbmZpZyhXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSwgZXh0cmEsIFdFX01BWF9TVFJfTEVOKTsKKyAgICAgICAgICAgIHdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSsxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFdFX0dFVF9XTU1fU1RBVFVTOgorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihleHRyYSwgV0VfTUFYX1NUUl9MRU4sCisgICAgICAgICAgICAgICAgICAgICJcbkRpcjogMD11cCwgMT1kb3duLCAzPWJvdGhcbiIKKyAgICAgICAgICAgICAgICAgICAgInwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4iCisgICAgICAgICAgICAgICAgICAgICJ8QUMgfCBBQ00gfEFkbWl0dGVkfCBEaXIgfFxuIgorICAgICAgICAgICAgICAgICAgICAifC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiIKKyAgICAgICAgICAgICAgICAgICAgInxWTyB8ICAlZCAgfCAgJTNzICAgfCAgJWQgIHxcbiIKKyAgICAgICAgICAgICAgICAgICAgInxWSSB8ICAlZCAgfCAgJTNzICAgfCAgJWQgIHxcbiIKKyAgICAgICAgICAgICAgICAgICAgInxCRSB8ICAlZCAgfCAgJTNzICAgfCAgJWQgIHxcbiIKKyAgICAgICAgICAgICAgICAgICAgInxCSyB8ICAlZCAgfCAgJTNzICAgfCAgJWQgIHxcbiIKKyAgICAgICAgICAgICAgICAgICAgInwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4iLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW1dMQU5UTF9BQ19WT10ud21tQWNBY2Nlc3NSZXF1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1tXTEFOVExfQUNfVk9dLndtbUFjQWNjZXNzQWxsb3dlZD8iWUVTIjoiTk8iLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW1dMQU5UTF9BQ19WT10ud21tQWNUc3BlY0luZm8udHNfaW5mby5kaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbV0xBTlRMX0FDX1ZJXS53bW1BY0FjY2Vzc1JlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW1dMQU5UTF9BQ19WSV0ud21tQWNBY2Nlc3NBbGxvd2VkPyJZRVMiOiJOTyIsCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbV0xBTlRMX0FDX1ZJXS53bW1BY1RzcGVjSW5mby50c19pbmZvLmRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1tXTEFOVExfQUNfQkVdLndtbUFjQWNjZXNzUmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbV0xBTlRMX0FDX0JFXS53bW1BY0FjY2Vzc0FsbG93ZWQ/IllFUyI6Ik5PIiwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1tXTEFOVExfQUNfQkVdLndtbUFjVHNwZWNJbmZvLnRzX2luZm8uZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW1dMQU5UTF9BQ19CS10ud21tQWNBY2Nlc3NSZXF1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1tXTEFOVExfQUNfQktdLndtbUFjQWNjZXNzQWxsb3dlZD8iWUVTIjoiTk8iLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW1dMQU5UTF9BQ19CS10ud21tQWNUc3BlY0luZm8udHNfaW5mby5kaXJlY3Rpb24pOworCisgICAgICAgICAgICB3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSkrMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfR0VUX0NIQU5ORUxfTElTVDoKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICAgICAgICAgICB2X1U4X3QgaSwgbGVuOworICAgICAgICAgICAgY2hhciogYnVmIDsKKyAgICAgICAgICAgIHRDaGFubmVsTGlzdEluZm8gY2hhbm5lbF9saXN0OworCisgICAgICAgICAgICBzdGF0dXMgPSBpd19zb2Z0YXBfZ2V0X2NoYW5uZWxfbGlzdChkZXYsIGluZm8sIHdycXUsIChjaGFyICopJmNoYW5uZWxfbGlzdCk7CisgICAgICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIEdldENoYW5uZWxMaXN0IEZhaWxlZCEhIVxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYgPSBleHRyYTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICogTWF4aW11bSBjaGFubmVscyA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTi4gTWF4aW11bSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgKiBuZWVkZWQgPSA1ICogbnVtYmVyIG9mIGNoYW5uZWxzLiBDaGVjayBpZiBzdWZmaWNpZW50IGJ1ZmZlciBpcyBhdmFpbGFibGUgYW5kIAorICAgICAgICAgICAgICAgICAgICAgICAqIHRoZW4gcHJvY2VlZCB0byBmaWxsIHRoZSBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZihXRV9NQVhfU1RSX0xFTiA8ICg1ICogV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgSW5zdWZmaWNpZW50IEJ1ZmZlciB0byBwb3B1bGF0ZSBjaGFubmVsIGxpc3RcbiIsX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuID0gc25wcmludGYoYnVmLCA1LCAiJXUgIiwgY2hhbm5lbF9saXN0Lm51bV9jaGFubmVscyk7CisgICAgICAgICAgICBidWYgKz0gbGVuOworICAgICAgICAgICAgZm9yKGkgPSAwIDsgaSA8IGNoYW5uZWxfbGlzdC5udW1fY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBzbnByaW50ZihidWYsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1ICIsIGNoYW5uZWxfbGlzdC5jaGFubmVsc1tpXSk7CisgICAgICAgICAgICAgICAgYnVmICs9IGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSsxOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiAgCisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZExvZyhMT0dFLCAiSW52YWxpZCBJT0NUTCBjb21tYW5kICVkICBcbiIsICBzdWJfY21kICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiAgYWN0aW9uIHN1Yi1pb2N0bHMgKi8KK3N0YXRpYyBpbnQgaXdfc2V0bm9uZV9nZXRub25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICAgaW50IHN1Yl9jbWQgPSB3cnF1LT5kYXRhLmZsYWdzOworICAgIGludCByZXQgPSAwOyAvKiBzdWNlc3MgKi8KKworICAgIHN3aXRjaCAoc3ViX2NtZCkKKyAgICB7CisgICAgICAgIGNhc2UgV0VfQ0xFQVJfU1RBVFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIiVzOiBjbGVhcmluZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBtZW1zZXQoJnBBZGFwdGVyLT5zdGF0cywgMCwgc2l6ZW9mKHBBZGFwdGVyLT5zdGF0cykpOworICAgICAgICAgICAgbWVtc2V0KCZwQWRhcHRlci0+aGRkX3N0YXRzLCAwLCBzaXplb2YocEFkYXB0ZXItPmhkZF9zdGF0cykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGNhc2UgV0VfSU5JVF9BUDoKKyAgICAgICAgeworICAgICAgICAgIHByX2luZm8oIkluaXQgQVAgdHJpZ2dlclxuIik7CisgICAgICAgICAgaGRkX29wZW5fYWRhcHRlciggV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlciksIFdMQU5fSEREX1NPRlRBUCwgInNvZnRhcC4lZCIsCisgICAgICAgICAgICAgICAgIHdsYW5faGRkX2dldF9pbnRmX2FkZHIoIFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpICksVFJVRSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXRV9TVE9QX0FQOgorICAgICAgICB7CisgICAgICAgICAgIC8qRklYIE1FOiBOZWVkIHRvIGJlIHJldmlzaXRlZCBpZiBtdWx0aXBsZSBTQVBzIHRvIGJlIHN1cHBvcnRlZCAqLworICAgICAgICAgICAvKiBBcyBTb2Z0IEFQIG1vZGUgaGFzIGJlZW4gY2hhbmdlZCB0byBTVEEgYWxyZWFkeSB3aXRoIGtpbGxpbmcgb2YgSG9zdGFwZCwKKyAgICAgICAgICAgICogdGhpcyBpcyBhIGRlYWQgY29kZSBhbmQgbmVlZCB0byBmaW5kIHRoZSBhZHBhdGVyIGJ5IG5hbWUgcmF0aGVyIHRoYW4gbW9kZSAqLworICAgICAgICAgICBoZGRfYWRhcHRlcl90KiBwQWRhcHRlcl90b19zdG9wID0KKyAgICAgICAgICAgICAgICBoZGRfZ2V0X2FkYXB0ZXJfYnlfbmFtZShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSwgInNvZnRhcC4wIik7CisgICAgICAgICAgIGlmKCBwQWRhcHRlcl90b19zdG9wICkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisgICAgICAgICAgICAgICBwcl9pbmZvKCJTdG9wcGluZyBBUCBtb2RlXG4iKTsKKworICAgICAgICAgICAgICAgLypNYWtlIHN1cmUgdGhhdCBwQWRhcHRlciBjbGVhbmVkIHByb3Blcmx5Ki8KKyAgICAgICAgICAgICAgIGhkZF9zdG9wX2FkYXB0ZXIoIHBIZGRDdHgsIHBBZGFwdGVyX3RvX3N0b3AgKTsKKyAgICAgICAgICAgICAgIGhkZF9kZWluaXRfYWRhcHRlciggcEhkZEN0eCwgcEFkYXB0ZXJfdG9fc3RvcCApOworICAgICAgICAgICAgICAgbWVtc2V0KCZwQWRhcHRlcl90b19zdG9wLT5zZXNzaW9uQ3R4LCAwLCBzaXplb2YocEFkYXB0ZXJfdG9fc3RvcC0+c2Vzc2lvbkN0eCkpOworCisgICAgICAgICAgICAgICB3bGFuX2hkZF9yZWxlYXNlX2ludGZfYWRkcihXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXJfdG9fc3RvcC0+bWFjQWRkcmVzc0N1cnJlbnQuYnl0ZXMpOworICAgICAgICAgICAgICAgaGRkX2Nsb3NlX2FkYXB0ZXIoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlciksIHBBZGFwdGVyX3RvX3N0b3AsCisgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIiU0FQIGFkYXB0b3Igbm90IGZvdW5kIHRvIHN0b3AgaXQhXG4iKTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyAgICAgICAgY2FzZSBXRV9FTkFCTEVfQU1QOgorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCIlczogZW5hYmxpbmcgQU1QIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIFdMQU5CQVBfUmVnaXN0ZXJXaXRoSENJKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV0VfRElTQUJMRV9BTVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKCBwQWRhcHRlciApOworICAgICAgICAgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIiVzOiBkaXNhYmxpbmcgQU1QIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICAgICAgcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgoIHBBZGFwdGVyICk7CisgICAgICAgICAgICBzdGF0dXMgPSBXTEFOQkFQX1N0b3BBbXAoKTsKKyAgICAgICAgICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcEhkZEN0eC0+aXNBbXBBbGxvd2VkID0gVk9TX1RSVUU7CisgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN0b3AgQU1QIiwgX19mdW5jX18pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9hIHN0YXRlIG0vYyBpbXBsZW1lbnRhdGlvbiBpbiBQQUwgaXMgVEJEIHRvIGF2b2lkIHRoaXMgZGVsYXkKKyAgICAgICAgICAgICAgIG1zbGVlcCg1MDApOworICAgICAgICAgICAgICAgcEhkZEN0eC0+aXNBbXBBbGxvd2VkID0gVk9TX0ZBTFNFOworICAgICAgICAgICAgICAgV0xBTkJBUF9EZXJlZ2lzdGVyRnJvbUhDSSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgaGRkTG9nKExPR0UsICIlczogdW5rbm93biBpb2N0bCAlZCIsIF9fRlVOQ1RJT05fXywgc3ViX2NtZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBpd19zZXRfdmFyX2ludHNfZ2V0bm9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKyAgICBpbnQgc3ViX2NtZCA9IHdycXUtPmRhdGEuZmxhZ3M7CisgICAgaW50ICp2YWx1ZSA9IChpbnQqKXdycXUtPmRhdGEucG9pbnRlcjsKKyAgICBpbnQgYXBwc19hcmdzW01BWF9WQVJfQVJHU10gPSB7MH07CisgICAgaW50IG51bV9hcmdzID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBSZWNlaXZlZCBsZW5ndGggJWQiLCBfX0ZVTkNUSU9OX18sIHdycXUtPmRhdGEubGVuZ3RoKTsKKyAgICBpZiAobnVtX2FyZ3MgPiBNQVhfVkFSX0FSR1MpCisgICAgeworICAgICAgIG51bV9hcmdzID0gTUFYX1ZBUl9BUkdTOworICAgIH0KKyAgICB2b3NfbWVtX2NvcHkoYXBwc19hcmdzLCB2YWx1ZSwgKHNpemVvZihpbnQpKSAqIG51bV9hcmdzKTsKKworICAgIHN3aXRjaCAoc3ViX2NtZCkKKyAgICB7CisgICAgICAgIGNhc2UgV0VfTE9HX0RVTVBfQ01EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhMT0cxLCAiJXM6IExPR19EVU1QICVkIGFyZzEgJWQgYXJnMiAlZCBhcmczICVkIGFyZzQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhcHBzX2FyZ3NbMF0sIGFwcHNfYXJnc1sxXSwgYXBwc19hcmdzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgYXBwc19hcmdzWzNdLCBhcHBzX2FyZ3NbNF0pOworCisgICAgICAgICAgICAgICAgbG9nUHJpbnRmKGhIYWwsIGFwcHNfYXJnc1swXSwgYXBwc19hcmdzWzFdLCBhcHBzX2FyZ3NbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBzX2FyZ3NbM10sIGFwcHNfYXJnc1s0XSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICBjYXNlIFdFX1AyUF9OT0FfQ01EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAycF9hcHBfc2V0UDJwUHNfdCBwMnBOb0E7CisKKyAgICAgICAgICAgICAgICBwMnBOb0Eub3BwX3BzID0gYXBwc19hcmdzWzBdOworICAgICAgICAgICAgICAgIHAycE5vQS5jdFdpbmRvdyA9IGFwcHNfYXJnc1sxXTsKKyAgICAgICAgICAgICAgICBwMnBOb0EuZHVyYXRpb24gPSBhcHBzX2FyZ3NbMl07CisgICAgICAgICAgICAgICAgcDJwTm9BLmludGVydmFsICA9IGFwcHNfYXJnc1szXTsKKyAgICAgICAgICAgICAgICBwMnBOb0EuY291bnQgPSBhcHBzX2FyZ3NbNF07CisgICAgICAgICAgICAgICAgcDJwTm9BLnNpbmdsZV9ub2FfZHVyYXRpb24gPSBhcHBzX2FyZ3NbNV07CisgICAgICAgICAgICAgICAgcDJwTm9BLnBzU2VsZWN0aW9uID0gYXBwc19hcmdzWzZdOworCisgICAgICAgICAgICAgICAgaGRkTG9nKExPRzEsICIlczogUDJQX05PQV9BVFRSOm9wcFBTICVkIGN0V2luZG93ICVkIGR1cmF0aW9uICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgImludGVydmFsICVkIGNvdW50ICVkIHNpbmdsZSBub2EgZHVyYXRpb24gJWQgUHNTZWxlY3Rpb24gJXgiLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFwcHNfYXJnc1swXSwgYXBwc19hcmdzWzFdLCBhcHBzX2FyZ3NbMl0sCisgICAgICAgICAgICAgICAgICAgICAgIGFwcHNfYXJnc1szXSwgYXBwc19hcmdzWzRdLCBhcHBzX2FyZ3NbNV0sIGFwcHNfYXJnc1s2XSk7CisKKyAgICAgICAgICAgICAgICBoZGRfc2V0UDJwUHMoZGV2LCAmcDJwTm9BKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhkZExvZyhMT0dFLCAiSW52YWxpZCBJT0NUTCBjb21tYW5kICVkIiwgIHN1Yl9jbWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXdfYWRkX3RzcGVjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworICAgaGRkX3dsYW5fd21tX3N0YXR1c19lICpwU3RhdHVzID0gKGhkZF93bGFuX3dtbV9zdGF0dXNfZSAqKWV4dHJhOworICAgaW50IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fQ09VTlRdOworICAgc21lX1Fvc1dtbVRzcGVjSW5mbyB0U3BlYzsKKyAgIHZfVTMyX3QgaGFuZGxlOworCisgICAvLyBtYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIGlzIHN1ZmZpY2llbnRseSBwcml2aWxlZGdlZAorICAgLy8gbm90ZSB0aGF0IHRoZSBrZXJuZWwgd2lsbCBkbyB0aGlzIGZvciAic2V0IiBpb2N0bHMsIGJ1dCBzaW5jZQorICAgLy8gdGhpcyBpb2N0bCB3YW50cyB0byByZXR1cm4gc3RhdHVzIHRvIHVzZXIgc3BhY2UgaXQgbXVzdCBiZQorICAgLy8gZGVmaW5lZCBhcyBhICJnZXQiIGlvY3RsCisgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisgICB7CisgICAgICByZXR1cm4gLUVQRVJNOworICAgfQorCisgICAvLyB3ZSBtdXN0IGJlIGFzc29jaWF0ZWQgaW4gb3JkZXIgdG8gYWRkIGEgdHNwZWMKKyAgIGlmIChlQ29ubmVjdGlvblN0YXRlX0Fzc29jaWF0ZWQgIT0gcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmNvbm5TdGF0ZSkKKyAgIHsKKyAgICAgICpwU3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRURfQkFEX1BBUkFNOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIC8vIHNpbmNlIHdlIGFyZSBkZWZpbmVkIHRvIGJlIGEgImdldCIgaW9jdGwsIGFuZCBzaW5jZSB0aGUgbnVtYmVyCisgICAvLyBvZiBwYXJhbXMgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIHBhcmFtcyB0aGF0IHdpcmVsZXNzIGV4dGVuc2lvbnMKKyAgIC8vIHdpbGwgcGFzcyBkb3duIGluIHRoZSBpd3JlcV9kYXRhLCB3ZSBtdXN0IGNvcHkgdGhlICJzZXQiIHBhcmFtcworICAgLy8gZnJvbSB1c2VyIHNwYWNlIG91cnNlbHZlcworICAgaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJhbXMsIHdycXUtPmRhdGEucG9pbnRlciwgc2l6ZW9mKHBhcmFtcykpKQorICAgeworICAgICAgLy8gaG1tbSwgY2FuJ3QgZ2V0IHRoZW0KKyAgICAgIHJldHVybiAtRUlPOworICAgfQorCisgICAvLyBjbGVhciB0aGUgdHNwZWMKKyAgIG1lbXNldCgmdFNwZWMsIDAsIHNpemVvZih0U3BlYykpOworCisgICAvLyB2YWxpZGF0ZSB0aGUgaGFuZGxlCisgICBoYW5kbGUgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX0hBTkRMRV07CisgICBpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgPT0gaGFuZGxlKQorICAgeworICAgICAgLy8gdGhhdCBvbmUgaXMgcmVzZXJ2ZWQKKyAgICAgICpwU3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRURfQkFEX1BBUkFNOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgIC8vIHZhbGlkYXRlIHRoZSBUSUQKKyAgIGlmIChwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX1RJRF0gPiA3KQorICAgeworICAgICAgLy8gb3V0IG9mIHJhbmdlCisgICAgICAqcFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEX0JBRF9QQVJBTTsKKyAgICAgIHJldHVybiAwOworICAgfQorICAgdFNwZWMudHNfaW5mby50aWQgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX1RJRF07CisKKyAgIC8vIHZhbGlkYXRlIHRoZSBkaXJlY3Rpb24KKyAgIHN3aXRjaCAocGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9ESVJFQ1RJT05dKQorICAgeworICAgY2FzZSBIRERfV0xBTl9XTU1fRElSRUNUSU9OX1VQU1RSRUFNOgorICAgICAgdFNwZWMudHNfaW5mby5kaXJlY3Rpb24gPSBTTUVfUU9TX1dNTV9UU19ESVJfVVBMSU5LOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgSEREX1dMQU5fV01NX0RJUkVDVElPTl9ET1dOU1RSRUFNOgorICAgICAgdFNwZWMudHNfaW5mby5kaXJlY3Rpb24gPSBTTUVfUU9TX1dNTV9UU19ESVJfRE9XTkxJTks7CisgICAgICBicmVhazsKKworICAgY2FzZSBIRERfV0xBTl9XTU1fRElSRUNUSU9OX0JJRElSRUNUSU9OQUw6CisgICAgICB0U3BlYy50c19pbmZvLmRpcmVjdGlvbiA9IFNNRV9RT1NfV01NX1RTX0RJUl9CT1RIOworICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICAvLyB1bmtub3duCisgICAgICAqcFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEX0JBRF9QQVJBTTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICAvLyB2YWxpZGF0ZSB0aGUgdXNlciBwcmlvcml0eQorICAgaWYgKHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fVVNFUl9QUklPUklUWV0gPj0gU01FX1FPU19XTU1fVVBfTUFYKQorICAgeworICAgICAgLy8gb3V0IG9mIHJhbmdlCisgICAgICAqcFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEX0JBRF9QQVJBTTsKKyAgICAgIHJldHVybiAwOworICAgfQorICAgdFNwZWMudHNfaW5mby51cCA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fVVNFUl9QUklPUklUWV07CisKKyAgIHRTcGVjLm5vbWluYWxfbXNkdV9zaXplID0gcGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9OT01JTkFMX01TRFVfU0laRV07CisgICB0U3BlYy5tYXhpbXVtX21zZHVfc2l6ZSA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fTUFYSU1VTV9NU0RVX1NJWkVdOworICAgdFNwZWMubWluX2RhdGFfcmF0ZSA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fTUlOSU1VTV9EQVRBX1JBVEVdOworICAgdFNwZWMubWVhbl9kYXRhX3JhdGUgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX01FQU5fREFUQV9SQVRFXTsKKyAgIHRTcGVjLnBlYWtfZGF0YV9yYXRlID0gcGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9QRUFLX0RBVEFfUkFURV07CisgICB0U3BlYy5tYXhfYnVyc3Rfc2l6ZSA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fTUFYX0JVUlNUX1NJWkVdOworICAgdFNwZWMubWluX3BoeV9yYXRlID0gcGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9NSU5JTVVNX1BIWV9SQVRFXTsKKyAgIHRTcGVjLnN1cnBsdXNfYndfYWxsb3dhbmNlID0gcGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9TVVJQTFVTX0JBTkRXSURUSF9BTExPV0FOQ0VdOworICAgdFNwZWMubWluX3NlcnZpY2VfaW50ZXJ2YWwgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX1NFUlZJQ0VfSU5URVJWQUxdOworICAgdFNwZWMubWF4X3NlcnZpY2VfaW50ZXJ2YWwgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX01BWF9TRVJWSUNFX0lOVEVSVkFMXTsKKyAgIHRTcGVjLnN1c3BlbnNpb25faW50ZXJ2YWwgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX1NVU1BFTlNJT05fSU5URVJWQUxdOworICAgdFNwZWMuaW5hY3Rpdml0eV9pbnRlcnZhbCA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fSU5BQ1RJVklUWV9JTlRFUlZBTF07CisKKyAgIHRTcGVjLnRzX2luZm8uYnVyc3Rfc2l6ZV9kZWZuID0gcGFyYW1zW0hERF9XTEFOX1dNTV9QQVJBTV9CVVJTVF9TSVpFX0RFRk5dOworCisgICAvLyB2YWxpZGF0ZSB0aGUgdHMgaW5mbyBhY2sgcG9saWN5CisgICBzd2l0Y2ggKHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fQUNLX1BPTElDWV0pCisgICB7CisgICBjYXNlIEhERF9XTEFOX1dNTV9UU19JTkZPX0FDS19QT0xJQ1lfTk9STUFMX0FDSzoKKyAgICAgIHRTcGVjLnRzX2luZm8uYWNrX3BvbGljeSA9IFNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfTk9STUFMX0FDSzsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEhERF9XTEFOX1dNTV9UU19JTkZPX0FDS19QT0xJQ1lfSFRfSU1NRURJQVRFX0JMT0NLX0FDSzoKKyAgICAgIHRTcGVjLnRzX2luZm8uYWNrX3BvbGljeSA9IFNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfSFRfSU1NRURJQVRFX0JMT0NLX0FDSzsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgLy8gdW5rbm93bgorICAgICAgKnBTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9CQURfUEFSQU07CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgKnBTdGF0dXMgPSBoZGRfd21tX2FkZHRzKHBBZGFwdGVyLCBoYW5kbGUsICZ0U3BlYyk7CisgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGl3X2RlbF90c3BlYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgaW50ICpwYXJhbXMgPSAoaW50ICopZXh0cmE7CisgICBoZGRfd2xhbl93bW1fc3RhdHVzX2UgKnBTdGF0dXMgPSAoaGRkX3dsYW5fd21tX3N0YXR1c19lICopZXh0cmE7CisgICB2X1UzMl90IGhhbmRsZTsKKworICAgLy8gbWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiBpcyBzdWZmaWNpZW50bHkgcHJpdmlsZWRnZWQKKyAgIC8vIG5vdGUgdGhhdCB0aGUga2VybmVsIHdpbGwgZG8gdGhpcyBmb3IgInNldCIgaW9jdGxzLCBidXQgc2luY2UKKyAgIC8vIHRoaXMgaW9jdGwgd2FudHMgdG8gcmV0dXJuIHN0YXR1cyB0byB1c2VyIHNwYWNlIGl0IG11c3QgYmUKKyAgIC8vIGRlZmluZWQgYXMgYSAiZ2V0IiBpb2N0bAorICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgeworICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgIH0KKworICAgLy8gYWx0aG91Z2ggd2UgYXJlIGRlZmluZWQgdG8gYmUgYSAiZ2V0IiBpb2N0bCwgdGhlIHBhcmFtcyB3ZSByZXF1aXJlCisgICAvLyB3aWxsIGZpdCBpbiB0aGUgaXdyZXFfZGF0YSwgdGhlcmVmb3JlIHVubGlrZSBpd19hZGRfdHNwZWMoKSB0aGVyZQorICAgLy8gaXMgbm8gbmVlZCB0byBjb3B5IHRoZSBwYXJhbXMgZnJvbSB1c2VyIHNwYWNlCisKKyAgIC8vIHZhbGlkYXRlIHRoZSBoYW5kbGUKKyAgIGhhbmRsZSA9IHBhcmFtc1tIRERfV0xBTl9XTU1fUEFSQU1fSEFORExFXTsKKyAgIGlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCA9PSBoYW5kbGUpCisgICB7CisgICAgICAvLyB0aGF0IG9uZSBpcyByZXNlcnZlZAorICAgICAgKnBTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9CQURfUEFSQU07CisgICAgICByZXR1cm4gMDsKKyAgIH0KKworICAgKnBTdGF0dXMgPSBoZGRfd21tX2RlbHRzKHBBZGFwdGVyLCBoYW5kbGUpOworICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpd19nZXRfdHNwZWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgIGludCAqcGFyYW1zID0gKGludCAqKWV4dHJhOworICAgaGRkX3dsYW5fd21tX3N0YXR1c19lICpwU3RhdHVzID0gKGhkZF93bGFuX3dtbV9zdGF0dXNfZSAqKWV4dHJhOworICAgdl9VMzJfdCBoYW5kbGU7CisKKyAgIC8vIGFsdGhvdWdoIHdlIGFyZSBkZWZpbmVkIHRvIGJlIGEgImdldCIgaW9jdGwsIHRoZSBwYXJhbXMgd2UgcmVxdWlyZQorICAgLy8gd2lsbCBmaXQgaW4gdGhlIGl3cmVxX2RhdGEsIHRoZXJlZm9yZSB1bmxpa2UgaXdfYWRkX3RzcGVjKCkgdGhlcmUKKyAgIC8vIGlzIG5vIG5lZWQgdG8gY29weSB0aGUgcGFyYW1zIGZyb20gdXNlciBzcGFjZQorCisgICAvLyB2YWxpZGF0ZSB0aGUgaGFuZGxlCisgICBoYW5kbGUgPSBwYXJhbXNbSEREX1dMQU5fV01NX1BBUkFNX0hBTkRMRV07CisgICBpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgPT0gaGFuZGxlKQorICAgeworICAgICAgLy8gdGhhdCBvbmUgaXMgcmVzZXJ2ZWQKKyAgICAgICpwU3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRURfQkFEX1BBUkFNOworICAgICAgcmV0dXJuIDA7CisgICB9CisKKyAgICpwU3RhdHVzID0gaGRkX3dtbV9jaGVja3RzKHBBZGFwdGVyLCBoYW5kbGUpOworICAgcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCitzdGF0aWMgaW50IGl3X3Fjb21fc2V0X3dhcGlfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIGhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworICAgIGhkZF9zdGF0aW9uX2N0eF90ICpwSGRkU3RhQ3R4ID0gV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcik7CisgICAgdENzclJvYW1Qcm9maWxlICpwUm9hbVByb2ZpbGUgPSAmcFdleHRTdGF0ZS0+cm9hbVByb2ZpbGU7CisKKyAgICBXQVBJX0ZVTkNUSU9OX01PREUgKnBXYXBpTW9kZSA9IChXQVBJX0ZVTkNUSU9OX01PREUgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisKKyAgICBoZGRMb2coTE9HMSwgIlRoZSBmdW5jdGlvbiBpd19xY29tX3NldF93YXBpX21vZGUgY2FsbGVkIik7CisgICAgaGRkTG9nKExPRzEsICIlczogUmVjZWl2ZWQgZGF0YSAlcyIsIF9fRlVOQ1RJT05fXywgKGNoYXIqKXdycXUtPmRhdGEucG9pbnRlcik7CisgICAgaGRkTG9nKExPRzEsICIlczogUmVjZWl2ZWQgbGVuZ3RoICVkIiwgX19GVU5DVElPTl9fLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisgICAgaGRkTG9nKExPRzEsICIlczogSW5wdXQgRGF0YSAod3JlcSkgV0FQSSBNb2RlOiUwMmQiLCBfX0ZVTkNUSU9OX18sIHBXYXBpTW9kZS0+d2FwaU1vZGUpOworCisKKyAgICBpZihXWkNfT1JJR0lOQUwgPT0gcFdhcGlNb2RlLT53YXBpTW9kZSkgeworICAgICAgICBoZGRMb2coTE9HMSwgIiVzOiBXQVBJIE1vZGUgU2V0IHRvIE9GRiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAvKiBTZXQgRW5jcnlwdGlvbiBtb2RlIHRvIGRlZnVhbHQgLCB0aGlzIGFsbG93cyBuZXh0IHN1Y2Nlc3NmdWxsIG5vbi1XQVBJIEFzc29jaWF0aW9uICovCisgICAgICAgIHBSb2FtUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgIHBSb2FtUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgICAgICBwUm9hbVByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgIHBSb2FtUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisKKyAgICAgICAgcFJvYW1Qcm9maWxlLT5BdXRoVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICAgICAgcEhkZFN0YUN0eC0+Y29ubl9pbmZvLmF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07CisgICAgICAgIHBSb2FtUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uYXV0aFR5cGU7CisgICAgfQorICAgIGVsc2UgaWYoV0FQSV9FWFRFTlRJT04gPT0gcFdhcGlNb2RlLT53YXBpTW9kZSkgeworICAgICAgICBoZGRMb2coTE9HMSwgIiVzOiBXQVBJIE1vZGUgU2V0IHRvIE9OIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBwQWRhcHRlci0+d2FwaV9pbmZvLm5XYXBpTW9kZSA9IHBXYXBpTW9kZS0+d2FwaU1vZGU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd19xY29tX2dldF93YXBpX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICBXQVBJX0ZVTkNUSU9OX01PREUgKnBXYXBpTW9kZSA9IChXQVBJX0ZVTkNUSU9OX01PREUgKikoZXh0cmEpOworCisgICAgaGRkTG9nKExPRzEsICJUaGUgZnVuY3Rpb24gaXdfcWNvbV9nZXRfd2FwaV9tb2RlIGNhbGxlZCIpOworCisgICAgcFdhcGlNb2RlLT53YXBpTW9kZSA9IHBBZGFwdGVyLT53YXBpX2luZm8ubldhcGlNb2RlOworICAgIGhkZExvZyhMT0cxLCAiJXM6IEdFVCBXQVBJIE1vZGUgVmFsdWU6JTAyZCIsIF9fRlVOQ1RJT05fXywgcFdhcGlNb2RlLT53YXBpTW9kZSk7CisgICAgcHJpbnRrKCJcbkdFVCBXQVBJIE1PREU6JWQiLHBXYXBpTW9kZS0+d2FwaU1vZGUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X3Fjb21fc2V0X3dhcGlfYXNzb2NfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworLy8gICAgV0FQSV9Bc3NvY0luZm8gKnBXYXBpQXNzb2NJbmZvID0gKFdBUElfQXNzb2NJbmZvICopKHdycXUtPmRhdGEucG9pbnRlcik7CisgICAgV0FQSV9Bc3NvY0luZm8gKnBXYXBpQXNzb2NJbmZvID0gKFdBUElfQXNzb2NJbmZvICopKGV4dHJhKTsKKyAgICBpbnQgaSA9IDAsIGogPSAwOworICAgIGhkZExvZyhMT0cxLCAiVGhlIGZ1bmN0aW9uIGl3X3Fjb21fc2V0X3dhcGlfYXNzb2NfaW5mbyBjYWxsZWQiKTsKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBSZWNlaXZlZCBsZW5ndGggJWQiLCBfX0ZVTkNUSU9OX18sIHdycXUtPmRhdGEubGVuZ3RoKTsKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBSZWNlaXZlZCBkYXRhICVzIiwgX19GVU5DVElPTl9fLCAoY2hhciopd3JxdS0+ZGF0YS5wb2ludGVyKTsKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBSZWNlaXZlZCBkYXRhICVzIiwgX19GVU5DVElPTl9fLCAoY2hhciopZXh0cmEpOworCisgICAgVk9TX0FTU0VSVChwV2FwaUFzc29jSW5mbyk7CisKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBJTlBVVCBEQVRBOlxuRWxlbWVudCBJRDoweCUwMnggTGVuZ3RoOjB4JTAyeCBWZXJzaW9uOjB4JTA0eFxuIixfX0ZVTkNUSU9OX18scFdhcGlBc3NvY0luZm8tPmVsZW1lbnRJRCxwV2FwaUFzc29jSW5mby0+bGVuZ3RoLHBXYXBpQXNzb2NJbmZvLT52ZXJzaW9uKTsKKyAgICBoZGRMb2coTE9HMSwiJXM6IGFrbSBTdWl0ZSBDbnQ6MHglMDR4IixfX0ZVTkNUSU9OX18scFdhcGlBc3NvY0luZm8tPmFrbVN1aXRlQ291bnQpOworICAgIGZvcihpID0wIDsgaSA8IDE2IDsgaSsrKQorICAgICAgICBoZGRMb2coTE9HMSwiYWttIHN1aXRlWyUwMmRdOjB4JTA4bHgiLGkscFdhcGlBc3NvY0luZm8tPmFrbVN1aXRlW2ldKTsKKworICAgIGhkZExvZyhMT0cxLCIlczogVW5pY2FzdCBTdWl0ZSBDbnQ6MHglMDR4IixfX0ZVTkNUSU9OX18scFdhcGlBc3NvY0luZm8tPnVuaWNhc3RTdWl0ZUNvdW50KTsKKyAgICBmb3IoaSA9MCA7IGkgPCAxNiA7IGkrKykKKyAgICAgICAgaGRkTG9nKExPRzEsICJVbmljYXN0IHN1aXRlWyUwMmRdOjB4JTA4bHgiLGkscFdhcGlBc3NvY0luZm8tPnVuaWNhc3RTdWl0ZVtpXSk7CisKKyAgICBoZGRMb2coTE9HMSwiJXM6IE11bHRpY2FzdCBzdWl0ZToweCUwOGx4IFdhcGkgY2FwYToweCUwNHgiLF9fRlVOQ1RJT05fXyxwV2FwaUFzc29jSW5mby0+bXVsdGljYXN0U3VpdGUscFdhcGlBc3NvY0luZm8tPndhcGlDYWJpbGl0eSk7CisgICAgaGRkTG9nKExPRzEsICIlczogQktJRCBDbnQ6MHglMDR4XG4iLF9fRlVOQ1RJT05fXyxwV2FwaUFzc29jSW5mby0+YmtpZENvdW50KTsKKyAgICBmb3IoaSA9IDAgOyBpIDwgMTYgOyBpKyspIHsKKyAgICAgICAgaGRkTG9nKExPRzEsICJCS0lEIExpc3RbJTAyZF0uYmtpZDoweCIsaSk7CisgICAgICAgIGZvcihqID0gMCA7IGogPCAxNiA7IGorKykKKyAgICAgICAgICAgIGhkZExvZyhMT0cxLCIlMDJ4IixwV2FwaUFzc29jSW5mby0+YmtpZExpc3RbaV0uYmtpZFtqXSk7CisgICAgfQorCisgICAgLyogV2UgYXJlIG5vdCB1c2luZyB0aGUgZW50aXJlIElFIGFzIHByb3ZpZGVkIGJ5IHRoZSBzdXBwbGljYW50LgorICAgICAqIFRoaXMgaXMgYmVpbmcgY2FsY3VsYXRlZCBieSBTTUUuIFRoaXMgaXMgdGhlIHNhbWUgYXMgaW4gdGhlCisgICAgICogY2FzZSBvZiBXUEEuIE9ubHkgdGhlIGF1dGggbW9kZSBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZQorICAgICAqIGV4dHJhY3RlZCBoZXJlKi8KKyAgICBpZiAoIHBXYXBpQXNzb2NJbmZvLT5ha21TdWl0ZVswXSA9PSBXQVBJX1BTS19BS01fU1VJVEUgKSB7CisgICAgICAgaGRkTG9nKExPRzEsICIlczogV0FQSSBBVVRIIE1PREUgU0VUIFRPIFBTSyIsX19GVU5DVElPTl9fKTsKKyAgICAgICBwQWRhcHRlci0+d2FwaV9pbmZvLndhcGlBdXRoTW9kZSA9IFdBUElfQVVUSF9NT0RFX1BTSzsKKyAgICB9CisKKyAgICBpZiAoIHBXYXBpQXNzb2NJbmZvLT5ha21TdWl0ZVswXSA9PSBXQVBJX0NFUlRfQUtNX1NVSVRFKSB7CisgICAgICAgaGRkTG9nKExPRzEsICIlczogV0FQSSBBVVRIIE1PREUgU0VUIFRPIENFUlRJRklDQVRFIixfX0ZVTkNUSU9OX18pOworICAgICAgIHBBZGFwdGVyLT53YXBpX2luZm8ud2FwaUF1dGhNb2RlID0gV0FQSV9BVVRIX01PREVfQ0VSVDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfcWNvbV9zZXRfd2FwaV9rZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworICAgIGVIYWxTdGF0dXMgICAgICAgaGFsU3RhdHVzICAgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRBTklfVTMyICAgICAgICAgcm9hbUlkICAgICAgPSAweEZGOworICAgIHRBTklfVTggICAgICAgICAqcEtleVB0ciAgICAgPSBOVUxMOworICAgIHZfQk9PTF90ICAgICAgICAgaXNDb25uZWN0ZWQgPSBUUlVFOworICAgIHRDc3JSb2FtU2V0S2V5ICAgc2V0S2V5OworICAgIGludCBpID0gMDsKKworLy8gICAgV0xBTl9XQVBJX0tFWSAqcFdhcGlLZXkgPSAoV0xBTl9XQVBJX0tFWSAqKSh3cnF1LT5kYXRhLnBvaW50ZXIpOworICAgIFdMQU5fV0FQSV9LRVkgKnBXYXBpS2V5ID0gKFdMQU5fV0FQSV9LRVkgKikoZXh0cmEpOworCisgICAgaGRkTG9nKExPRzEsICJUaGUgZnVuY3Rpb24gaXdfcWNvbV9zZXRfd2FwaV9rZXkgY2FsbGVkICIpOworICAgIGhkZExvZyhMT0cxLCAiJXM6IFJlY2VpdmVkIGxlbmd0aCAlZCIsIF9fRlVOQ1RJT05fXywgd3JxdS0+ZGF0YS5sZW5ndGgpOworICAgIGhkZExvZyhMT0cxLCAiJXM6IFJlY2VpdmVkIGRhdGEgJXMiLCBfX0ZVTkNUSU9OX18sIChjaGFyKil3cnF1LT5kYXRhLnBvaW50ZXIpOworICAgIGhkZExvZyhMT0cxLCAiJXM6IFJlY2VpdmVkIGRhdGEgJXMiLCBfX0ZVTkNUSU9OX18sIChjaGFyKilleHRyYSk7CisKKyAgICBoZGRMb2coTE9HMSwiOnM6IElOUFVUIERBVEE6XG5LZXkgVHlwZToweCUwMnggS2V5IERpcmVjdGlvbjoweCUwMnggS0VZIElEOjB4JTAyeFxuIiwgX19GVU5DVElPTl9fLHBXYXBpS2V5LT5rZXlUeXBlLHBXYXBpS2V5LT5rZXlEaXJlY3Rpb24scFdhcGlLZXktPmtleUlkKTsKKyAgICBoZGRMb2coTE9HMSwiQWRkIEluZGV4OjB4Iik7CisgICAgZm9yKGkgPTAgOyBpIDwgMTIgOyBpKyspCisgICAgICAgIGhkZExvZyhMT0cxLCIlMDJ4IixwV2FwaUtleS0+YWRkckluZGV4W2ldKTsKKworICAgIGhkZExvZyhMT0cxLCJcbiVzOiBXQVBJIEVOQ1JZUFRJT04gS0VZIExFTkdUSDoweCUwNHgiLCBfX0ZVTkNUSU9OX18scFdhcGlLZXktPndwaWVrTGVuKTsKKyAgICBoZGRMb2coTE9HMSwgIldBUEkgRU5DUllQVElPTiBLRVk6MHgiKTsKKyAgICBmb3IoaSA9MCA7IGkgPCAxNiA7IGkrKykKKyAgICAgICAgaGRkTG9nKExPRzEsIiUwMngiLHBXYXBpS2V5LT53cGlla1tpXSk7CisKKyAgICBoZGRMb2coTE9HMSwiXG4lczogV0FQSSBJTlRFR1JJVFkgQ0hFQ0sgS0VZIExFTkdUSDoweCUwNHgiLCBfX0ZVTkNUSU9OX18scFdhcGlLZXktPndwaWNrTGVuKTsKKyAgICBoZGRMb2coTE9HMSwiV0FQSSBJTlRFR1JJVFkgQ0hFQ0sgS0VZOjB4Iik7CisgICAgZm9yKGkgPTAgOyBpIDwgMTYgOyBpKyspCisgICAgICAgIGhkZExvZyhMT0cxLCIlMDJ4IixwV2FwaUtleS0+d3BpY2tbaV0pOworCisgICAgaGRkTG9nKExPRzEsIlxuV0FQSSBQTiBOVU1CRVI6MHgiKTsKKyAgICBmb3IoaSA9IDAgOyBpIDwgMTYgOyBpKyspCisgICAgICAgIGhkZExvZyhMT0cxLCIlMDJ4IixwV2FwaUtleS0+cG5baV0pOworCisgICAgLy8gQ2xlYXIgdGhlIHNldGtleSBtZW1vcnkKKyAgICB2b3NfbWVtX3plcm8oJnNldEtleSxzaXplb2YodENzclJvYW1TZXRLZXkpKTsKKyAgICAvLyBTdG9yZSBLZXkgSUQKKyAgICBzZXRLZXkua2V5SWQgPSAodW5zaWduZWQgY2hhcikoIHBXYXBpS2V5LT5rZXlJZCApOworICAgIC8vIFNFVCBXQVBJIEVuY3J5cHRpb24KKyAgICBzZXRLZXkuZW5jVHlwZSAgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk7CisgICAgLy8gS2V5IERpcmVjdGlvbm4gYm90aCBUWCBhbmQgUlgKKyAgICBzZXRLZXkua2V5RGlyZWN0aW9uID0gZVNJUl9UWF9SWDsgLy8gRG8gV0UgTkVFRCB0byB1cGRhdGUgdGhpcyBiYXNlZCBvbiBLZXkgVHlwZSBhcyBHUlAvVU5JQ0FTVD8/CisgICAgLy8gdGhlIFBBRSByb2xlCisgICAgc2V0S2V5LnBhZVJvbGUgPSAwIDsKKworICAgIHN3aXRjaCAoIHBXYXBpS2V5LT5rZXlUeXBlICkKKyAgICB7CisgICAgICAgIGNhc2UgSEREX1BBSVJXSVNFX1dBUElfS0VZOgorICAgICAgICB7CisgICAgICAgICAgICBpc0Nvbm5lY3RlZCA9IGhkZF9jb25uSXNDb25uZWN0ZWQocEhkZFN0YUN0eCk7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoc2V0S2V5LnBlZXJNYWMsJnBIZGRTdGFDdHgtPmNvbm5faW5mby5ic3NJZCxXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhERF9HUk9VUF9XQVBJX0tFWToKKyAgICAgICAgeworICAgICAgICAgICAgdm9zX3NldF9tYWNhZGRyX2Jyb2FkY2FzdCggKHZfTUFDQUREUl90ICopc2V0S2V5LnBlZXJNYWMgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vQW55IG90aGVyIG9wdGlvbiBpcyBpbnZhbGlkLgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiWyU0ZF0gJXMoKSBmYWlsZWQgdG8gU2V0IEtleS4gSW52YWxpZCBrZXkgdHlwZSAlZCIsIF9fTElORV9fLF9fRlVOQ1RJT05fXyAsIC0xICk7CisKKyAgICAgICAgICAgIGhkZExvZyhMT0dFLCIgJXM6IEVycm9yIFdBUEkgS2V5IEFkZCBUeXBlIixfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgaGFsU3RhdHVzID0gIWVIQUxfU1RBVFVTX1NVQ0NFU1M7IC8vIE5FRUQgVE8gVVBEQVRFIFRISVMgV0lUSCBDT1JSRUNUIFZBTFVFCisgICAgICAgICAgICBicmVhazsgLy8gTkVFRCBSRVRVUk4gRlJPTSBIRVJFID8/Pz8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbmNhdGVuYXRpbmcgdGhlIEVuY3J5cHRpb24gS2V5IChFSykgYW5kIHRoZSBNSUMga2V5IChDSyk6IEVLIGZvbGxvd2VkIGJ5IENLCisgICAgc2V0S2V5LmtleUxlbmd0aCA9ICh2X1UxNl90KSgocFdhcGlLZXktPndwaWVrTGVuKSsocFdhcGlLZXktPndwaWNrTGVuKSk7CisgICAgcEtleVB0ciA9IHNldEtleS5LZXk7CisgICAgbWVtY3B5KCBwS2V5UHRyLCBwV2FwaUtleS0+d3BpZWssIHBXYXBpS2V5LT53cGlla0xlbiApOworICAgIHBLZXlQdHIgKz0gcFdhcGlLZXktPndwaWVrTGVuOworICAgIG1lbWNweSggcEtleVB0ciwgcFdhcGlLZXktPndwaWNrLCBwV2FwaUtleS0+d3BpY2tMZW4gKTsKKworICAgIC8vIFNldCB0aGUgbmV3IGtleSB3aXRoIFNNRS4KKyAgICBwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfU0VUVElOR19LRVk7CisKKyAgICBpZiAoIGlzQ29ubmVjdGVkICkgeworICAgICAgICBoYWxTdGF0dXMgPSBzbWVfUm9hbVNldEtleSggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCBwQWRhcHRlci0+c2Vzc2lvbklkLCAmc2V0S2V5LCAmcm9hbUlkICk7CisgICAgICAgIGlmICggaGFsU3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJbJTRkXSBzbWVfUm9hbVNldEtleSByZXR1cm5lZCBFUlJPUiBzdGF0dXM9ICVkIiwgX19MSU5FX18sIGhhbFN0YXR1cyApOworCisgICAgICAgICAgICBwSGRkU3RhQ3R4LT5yb2FtX2luZm8ucm9hbWluZ1N0YXRlID0gSEREX1JPQU1fU1RBVEVfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKyNpZiAwIC8vLyBORUVEIFRPIENIRUNLIE9OIFRISVMKKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBTdG9yZSB0aGUga2V5cyBpbiB0aGUgYWRhcHRlciB0byBiZSBtb3ZlZCB0byB0aGUgcHJvZmlsZSAmIHBhc3NlZCB0bworICAgICAgICAvLyBTTUUgaW4gdGhlIENvbm5lY3RSZXF1ZXN0IGlmIHdlIGFyZSBub3QgeWV0IGluIGNvbm5lY3RlZCBzdGF0ZS4KKyAgICAgICAgIG1lbWNweSggJnBBZGFwdGVyLT5zZXRLZXlbIHNldEtleS5rZXlJZCBdLCAmc2V0S2V5LCBzaXplb2YoIHNldEtleSApICk7CisgICAgICAgICBwQWRhcHRlci0+ZktleVNldFsgc2V0S2V5LmtleUlkIF0gPSBUUlVFOworCisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgICAgICAgICAgICAgICIgIFNhdmluZyBrZXkgW2lkeD0gJWRdIHRvIGFwcGx5IHdoZW4gbW92aW5nIHRvIGNvbm5lY3RlZCBzdGF0ZSAiLAorICAgICAgICAgICAgICAgICAgICBzZXRLZXkua2V5SWQgKTsKKworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBoYWxTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgaXdfcWNvbV9zZXRfd2FwaV9ia2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworI2lmZGVmIFdMQU5fREVCVUcKKyAgICBpbnQgaSA9IDA7CisgICAgV0xBTl9CS0lEX0xJU1QgICpwQmtpZCAgICAgICA9ICggV0xBTl9CS0lEX0xJU1QgKikgKHdycXUtPmRhdGEucG9pbnRlcik7CisjZW5kaWYKKworICAgIGhkZExvZyhMT0cxLCAiVGhlIGZ1bmN0aW9uIGl3X3Fjb21fc2V0X3dhcGlfYmtpZCBjYWxsZWQiKTsKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBSZWNlaXZlZCBsZW5ndGggJWQiLCBfX0ZVTkNUSU9OX18sIHdycXUtPmRhdGEubGVuZ3RoKTsKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBSZWNlaXZlZCBkYXRhICVzIiwgX19GVU5DVElPTl9fLCAoY2hhciopd3JxdS0+ZGF0YS5wb2ludGVyKTsKKyAgICBoZGRMb2coTE9HMSwgIiVzOiBSZWNlaXZlZCBkYXRhICVzIiwgX19GVU5DVElPTl9fLCAoY2hhciopZXh0cmEpOworCisgICAgaGRkTG9nKExPRzEsIiVzOiBJTlBVVCBEQVRBOlxuIEJLSUQgTGVuZ3RoOjB4JTA4bHhcbiIsIF9fRlVOQ1RJT05fXyxwQmtpZC0+bGVuZ3RoKTsKKyAgICBoZGRMb2coTE9HMSwiJXM6IEJLSUQgQ250OjB4JTA0bHgiLHBCa2lkLT5CS0lEQ291bnQpOworCisgICAgaGRkTG9nKExPRzEsIkJLSUQgS0VZIExJU1RbMF06MHgiKTsKKyNpZmRlZiBXTEFOX0RFQlVHCisgICAgZm9yKGkgPTAgOyBpIDwgMTYgOyBpKyspCisgICAgICAgIGhkZExvZyhMT0cxLCIlMDJ4IixwQmtpZC0+QktJRFswXS5ia2lkW2ldKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfcWNvbV9nZXRfd2FwaV9ia2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIC8qIFlldCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiwgMTl0aCBBcHJpbCAyMDEwICovCisgICAgaGRkTG9nKExPRzEsICJUaGUgZnVuY3Rpb24gaXdfcWNvbV9nZXRfd2FwaV9ia2lkIGNhbGxlZCAiKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLy8KKy8vCisvLyBFYWNoIHRpbWUgdGhlIHN1cHBsaWNhbnQgaGFzIHRoZSBhdXRoX3JlcXVlc3Qgb3IgcmVhc3NvYyByZXF1ZXN0CisvLyBJRXMgcmVhZHkuIFRoaXMgaXMgcHVzaGVkIHRvIHRoZSBkcml2ZXIuIFRoZSBkcml2ZXIgd2lsbCBpbnR1cm4gdXNlCisvLyBpdCB0byBzZW5kIG91dCB0aGUgYXV0aCByZXEgYW5kIHJlYXNzb2MgcmVxIGZvciAxMXIgRlQgQXNzb2MuCisvLworc3RhdGljIGludCBpd19zZXRfZnRpZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICAgaGRkX3N0YXRpb25fY3R4X3QgKnBIZGRTdGFDdHggPSBXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKTsKKyAgICAvL3ZfQ09OVEVYVF90IHBWb3NDb250ZXh0OworCisgICAgaWYgKCF3cnF1LT5kYXRhLmxlbmd0aCkKKyAgICB7CisgICAgICAgIGhkZExvZyhMT0dFLCBGTCgiJXMgY2FsbGVkIHdpdGggMCBsZW5ndGggSUVzXG4iKSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAod3JxdS0+ZGF0YS5wb2ludGVyID09IE5VTEwpCisgICAgeworICAgICAgICBoZGRMb2coTE9HRSwgRkwoIiVzIGNhbGxlZCB3aXRoIE5VTEwgSUVcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy8gQWRkZWQgZm9yIGRlYnVnIG9uIHJlY2VwdGlvbiBvZiBSZS1hc3NvYyBSZXEuCisgICAgaWYgKGVDb25uZWN0aW9uU3RhdGVfQXNzb2NpYXRlZCAhPSBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlKQorICAgIHsKKyAgICAgICAgaGRkTG9nKExPR0UsIEZMKCJDYWxsZWQgd2l0aCBJZSBvZiBsZW5ndGggPSAlZCB3aGVuIG5vdCBhc3NvY2lhdGVkXG4iKSwKKyAgICAgICAgICAgIHdycXUtPmRhdGEubGVuZ3RoKTsKKyAgICAgICAgaGRkTG9nKExPR0UsIEZMKCJTaG91bGQgYmUgUmUtYXNzb2MgUmVxIElFc1xuIikpOworICAgIH0KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgaGRkTG9nKExPR0UsIEZMKCIlcyBjYWxsZWQgd2l0aCBJZSBvZiBsZW5ndGggPSAlZFxuIiksIF9fZnVuY19fLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisjZW5kaWYKKworICAgIC8vIFBhc3MgdGhlIHJlY2VpdmVkIEZUIElFcyB0byBTTUUKKyAgICBzbWVfU2V0RlRJRXMoIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwgcEFkYXB0ZXItPnNlc3Npb25JZCwgd3JxdS0+ZGF0YS5wb2ludGVyLAorICAgICAgICB3cnF1LT5kYXRhLmxlbmd0aCk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGl3X3NldF9keW5hbWljX21jYmNfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICAgdHBNY0JjRmlsdGVyQ2ZnIHBSZXF1ZXN0ID0gKHRwTWNCY0ZpbHRlckNmZyl3cnF1LT5kYXRhLnBvaW50ZXI7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpOworCisgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICIlczogU2V0IE1DIEJDIEZpbHRlciBDb25maWcgcmVxdWVzdDogJWQiLAorICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBSZXF1ZXN0LT5tY2FzdEJjYXN0RmlsdGVyU2V0dGluZyk7CisKKyAgICBwSGRkQ3R4LT5keW5hbWljX21jYmNfZmlsdGVyLm1jYXN0QmNhc3RGaWx0ZXJTZXR0aW5nID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVxdWVzdC0+bWNhc3RCY2FzdEZpbHRlclNldHRpbmc7CisgICAgcEhkZEN0eC0+ZHluYW1pY19tY2JjX2ZpbHRlci5lbmFibGVDZmcgPSBUUlVFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfY2xlYXJfZHluYW1pY19tY2JjX2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKworICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6ICIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBwSGRkQ3R4LT5keW5hbWljX21jYmNfZmlsdGVyLmVuYWJsZUNmZyA9IEZBTFNFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X2hvc3Rfb2ZmbG9hZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIHRwSG9zdE9mZmxvYWRSZXF1ZXN0IHBSZXF1ZXN0ID0gKHRwSG9zdE9mZmxvYWRSZXF1ZXN0KXdycXUtPmRhdGEucG9pbnRlcjsKKyAgICB0U2lySG9zdE9mZmxvYWRSZXEgb2ZmbG9hZFJlcXVlc3Q7CisKKyAgICAvKiBEZWJ1ZyBkaXNwbGF5IG9mIHJlcXVlc3QgY29tcG9uZW50cy4gKi8KKyAgICBzd2l0Y2ggKHBSZXF1ZXN0LT5vZmZsb2FkVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgV0xBTl9JUFY0X0FSUF9SRVBMWV9PRkZMT0FEOgorICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9XQVJOLCAiJXM6IEhvc3Qgb2ZmbG9hZCByZXF1ZXN0OiBBUlAgcmVwbHkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgc3dpdGNoIChwUmVxdWVzdC0+ZW5hYmxlT3JEaXNhYmxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV0xBTl9PRkZMT0FEX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIiAgIGRpc2FibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBXTEFOX09GRkxPQURfQVJQX0FORF9CQ19GSUxURVJfRU5BQkxFOgorICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX1dBUk4sICIgICBCQyBGaWx0ZXJpbmcgZW5hYmxlIik7CisgICAgICAgICAgICAgICAgY2FzZSBXTEFOX09GRkxPQURfRU5BQkxFOgorICAgICAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX1dBUk4sICIgICBBUlAgb2ZmbG9hZCBlbmFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9XQVJOLCAiICAgSVAgYWRkcmVzczogJWQuJWQuJWQuJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjRBZGRyWzBdLCBwUmVxdWVzdC0+cGFyYW1zLmhvc3RJcHY0QWRkclsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVxdWVzdC0+cGFyYW1zLmhvc3RJcHY0QWRkclsyXSwgcFJlcXVlc3QtPnBhcmFtcy5ob3N0SXB2NEFkZHJbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5fSVBWNl9ORUlHSEJPUl9ESVNDT1ZFUllfT0ZGTE9BRDoKKyAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogSG9zdCBvZmZsb2FkIHJlcXVlc3Q6IG5laWdoYm9yIGRpc2NvdmVyeVxuIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHN3aXRjaCAocFJlcXVlc3QtPmVuYWJsZU9yRGlzYWJsZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFdMQU5fT0ZGTE9BRF9ESVNBQkxFOgorICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIgICBkaXNhYmxlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX09GRkxPQURfRU5BQkxFOgorICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIgICBlbmFibGUiKTsKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiICAgSVAgYWRkcmVzczogJXg6JXg6JXg6JXg6JXg6JXg6JXg6JXgiLAorICAgICAgICAgICAgICAgICAgICoodl9VMTZfdCAqKShwUmVxdWVzdC0+cGFyYW1zLmhvc3RJcHY2QWRkciksCisgICAgICAgICAgICAgICAgICAgKih2X1UxNl90ICopKHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjZBZGRyICsgMiksCisgICAgICAgICAgICAgICAgICAgKih2X1UxNl90ICopKHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjZBZGRyICsgNCksCisgICAgICAgICAgICAgICAgICAgKih2X1UxNl90ICopKHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjZBZGRyICsgNiksCisgICAgICAgICAgICAgICAgICAgKih2X1UxNl90ICopKHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjZBZGRyICsgOCksCisgICAgICAgICAgICAgICAgICAgKih2X1UxNl90ICopKHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjZBZGRyICsgMTApLAorICAgICAgICAgICAgICAgICAgICoodl9VMTZfdCAqKShwUmVxdWVzdC0+cGFyYW1zLmhvc3RJcHY2QWRkciArIDEyKSwKKyAgICAgICAgICAgICAgICAgICAqKHZfVTE2X3QgKikocFJlcXVlc3QtPnBhcmFtcy5ob3N0SXB2NkFkZHIgKyAxNCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRXhlY3V0ZSBvZmZsb2FkIHJlcXVlc3QuIFRoZSByZWFzb24gdGhhdCB3ZSBjYW4gY29weSB0aGUgcmVxdWVzdCBpbmZvcm1hdGlvbgorICAgICAgIGZyb20gdGhlIGlvY3RsIHN0cnVjdHVyZSB0byB0aGUgU01FIHN0cnVjdHVyZSBpcyB0aGF0IHRoZXkgYXJlIGxhaWQgb3V0CisgICAgICAgZXhhY3RseSB0aGUgc2FtZS4gIE90aGVyd2lzZSwgZWFjaCBwaWVjZSBvZiBpbmZvcm1hdGlvbiB3b3VsZCBoYXZlIHRvIGJlCisgICAgICAgY29waWVkIGluZGl2aWR1YWxseS4gKi8KKyAgICBtZW1jcHkoJm9mZmxvYWRSZXF1ZXN0LCBwUmVxdWVzdCwgd3JxdS0+ZGF0YS5sZW5ndGgpOworICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHNtZV9TZXRIb3N0T2ZmbG9hZChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksICZvZmZsb2FkUmVxdWVzdCkpCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEZhaWx1cmUgdG8gZXhlY3V0ZSBob3N0IG9mZmxvYWQgcmVxdWVzdFxuIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X2tlZXBhbGl2ZV9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgICB0cEtlZXBBbGl2ZVJlcXVlc3QgcFJlcXVlc3QgPSAodHBLZWVwQWxpdmVSZXF1ZXN0KXdycXUtPmRhdGEucG9pbnRlcjsKKyAgICB0U2lyS2VlcEFsaXZlUmVxIGtlZXBhbGl2ZVJlcXVlc3Q7CisKKyAgICBpZiAoKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+aXNMb2dwSW5Qcm9ncmVzcykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogRGVidWcgZGlzcGxheSBvZiByZXF1ZXN0IGNvbXBvbmVudHMuICovCisgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IFNldCBLZWVwIEFsaXZlIFJlcXVlc3QgOiBUaW1lUGVyaW9kICVkIHNpemUgJWQiLAorICAgICAgICAgICBfX0ZVTkNUSU9OX18scFJlcXVlc3QtPnRpbWVQZXJpb2QsIHNpemVvZih0S2VlcEFsaXZlUmVxdWVzdCkpOworCisgICAgICBzd2l0Y2ggKHBSZXF1ZXN0LT5wYWNrZXRUeXBlKQorICAgICAgeworICAgICAgICBjYXNlIFdMQU5fS0VFUF9BTElWRV9OVUxMX1BLVDoKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIiVzOiBLZWVwIEFsaXZlIFJlcXVlc3Q6IFR4IE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXTEFOX0tFRVBfQUxJVkVfVU5TT0xJQ0lUX0FSUF9SU1A6CisKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IEtlZXAgQWxpdmUgUmVxdWVzdDogVHggVW5Tb2xpY2l0ZWQgQVJQIFJTUFxuIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIiAgSG9zdCBJUCBhZGRyZXNzOiAlZC4lZC4lZC4lZCIsCisgICAgICAgICAgICBwUmVxdWVzdC0+aG9zdElwdjRBZGRyWzBdLCBwUmVxdWVzdC0+aG9zdElwdjRBZGRyWzFdLAorICAgICAgICAgICAgcFJlcXVlc3QtPmhvc3RJcHY0QWRkclsyXSwgcFJlcXVlc3QtPmhvc3RJcHY0QWRkclszXSk7CisKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIiAgRGVzdCBJUCBhZGRyZXNzOiAlZC4lZC4lZC4lZCIsCisgICAgICAgICAgICBwUmVxdWVzdC0+ZGVzdElwdjRBZGRyWzBdLCBwUmVxdWVzdC0+ZGVzdElwdjRBZGRyWzFdLAorICAgICAgICAgICAgcFJlcXVlc3QtPmRlc3RJcHY0QWRkclsyXSwgcFJlcXVlc3QtPmRlc3RJcHY0QWRkclszXSk7CisKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIiAgRGVzdCBNQUMgYWRkcmVzczogJWQ6JWQ6JWQ6JWQ6JWQ6JWQiLAorICAgICAgICAgICAgcFJlcXVlc3QtPmRlc3RNYWNBZGRyWzBdLCBwUmVxdWVzdC0+ZGVzdE1hY0FkZHJbMV0sCisgICAgICAgICAgICBwUmVxdWVzdC0+ZGVzdE1hY0FkZHJbMl0sIHBSZXF1ZXN0LT5kZXN0TWFjQWRkclszXSwKKyAgICAgICAgICAgIHBSZXF1ZXN0LT5kZXN0TWFjQWRkcls0XSwgcFJlcXVlc3QtPmRlc3RNYWNBZGRyWzVdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICB9CisKKyAgICAvKiBFeGVjdXRlIGtlZXAgYWxpdmUgcmVxdWVzdC4gVGhlIHJlYXNvbiB0aGF0IHdlIGNhbiBjb3B5IHRoZSByZXF1ZXN0IGluZm9ybWF0aW9uCisgICAgICAgZnJvbSB0aGUgaW9jdGwgc3RydWN0dXJlIHRvIHRoZSBTTUUgc3RydWN0dXJlIGlzIHRoYXQgdGhleSBhcmUgbGFpZCBvdXQKKyAgICAgICBleGFjdGx5IHRoZSBzYW1lLiAgT3RoZXJ3aXNlLCBlYWNoIHBpZWNlIG9mIGluZm9ybWF0aW9uIHdvdWxkIGhhdmUgdG8gYmUKKyAgICAgICBjb3BpZWQgaW5kaXZpZHVhbGx5LiAqLworICAgICAgIG1lbWNweSgma2VlcGFsaXZlUmVxdWVzdCwgcFJlcXVlc3QsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJzZXQgS2VlcDogVFAgYmVmb3JlIFNNRSAlZFxuIiwga2VlcGFsaXZlUmVxdWVzdC50aW1lUGVyaW9kKTsKKworICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHNtZV9TZXRLZWVwQWxpdmUoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCAma2VlcGFsaXZlUmVxdWVzdCkpCisgICAgeworICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEZhaWx1cmUgdG8gZXhlY3V0ZSBLZWVwIEFsaXZlXG4iLAorICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCitpbnQgd2xhbl9oZGRfc2V0X2ZpbHRlcihoZGRfY29udGV4dF90ICpwSGRkQ3R4LCB0cFBhY2tldEZpbHRlckNmZyBwUmVxdWVzdCkKK3sKKyAgICB0U2lyUmN2UGt0RmlsdGVyQ2ZnVHlwZSAgICBwYWNrZXRGaWx0ZXJTZXRSZXE7CisgICAgdFNpclJjdkZsdFBrdENsZWFyUGFyYW0gICAgcGFja2V0RmlsdGVyQ2xyUmVxOworICAgIGludCBpPTA7CisKKyAgICBpZiAocEhkZEN0eC0+Y2ZnX2luaS0+ZGlzYWJsZVBhY2tldEZpbHRlcikKKyAgICB7CisgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogUGFja2V0IEZpbHRlcmluZyBEaXNhYmxlZC4gUmV0dXJuaW5nICIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIERlYnVnIGRpc3BsYXkgb2YgcmVxdWVzdCBjb21wb25lbnRzLiAqLworICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogUGFja2V0IEZpbHRlciBSZXF1ZXN0IDogRkEgJWQgcGFyYW1zICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcFJlcXVlc3QtPmZpbHRlckFjdGlvbiwgcFJlcXVlc3QtPm51bVBhcmFtcyk7CisKKyAgICBzd2l0Y2ggKHBSZXF1ZXN0LT5maWx0ZXJBY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEhERF9SQ1ZfRklMVEVSX1NFVDoKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBTZXQgUGFja2V0IEZpbHRlciBSZXF1ZXN0IGZvciBJZDogJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBSZXF1ZXN0LT5maWx0ZXJJZCk7CisKKyAgICAgICAgICAgIHBhY2tldEZpbHRlclNldFJlcS5maWx0ZXJJZCA9IHBSZXF1ZXN0LT5maWx0ZXJJZDsKKyAgICAgICAgICAgIGlmICggcFJlcXVlc3QtPm51bVBhcmFtcyA+PSBIRERfTUFYX0NNUF9QRVJfUEFDS0VUX0ZJTFRFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE51bWJlciBvZiBQYXJhbXMgZXhjZWVkIE1heCBsaW1pdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwUmVxdWVzdC0+bnVtUGFyYW1zKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhY2tldEZpbHRlclNldFJlcS5udW1GaWVsZFBhcmFtcyA9IHBSZXF1ZXN0LT5udW1QYXJhbXM7CisgICAgICAgICAgICBwYWNrZXRGaWx0ZXJTZXRSZXEuY29hbGVzY2VUaW1lID0gMDsKKyAgICAgICAgICAgIHBhY2tldEZpbHRlclNldFJlcS5maWx0ZXJUeXBlID0gMTsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgcFJlcXVlc3QtPm51bVBhcmFtczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhY2tldEZpbHRlclNldFJlcS5wYXJhbXNEYXRhW2ldLnByb3RvY29sTGF5ZXIgPSBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5wcm90b2NvbExheWVyOworICAgICAgICAgICAgICAgIHBhY2tldEZpbHRlclNldFJlcS5wYXJhbXNEYXRhW2ldLmNtcEZsYWcgPSBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5jbXBGbGFnOworICAgICAgICAgICAgICAgIHBhY2tldEZpbHRlclNldFJlcS5wYXJhbXNEYXRhW2ldLmRhdGFPZmZzZXQgPSBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5kYXRhT2Zmc2V0OworICAgICAgICAgICAgICAgIHBhY2tldEZpbHRlclNldFJlcS5wYXJhbXNEYXRhW2ldLmRhdGFMZW5ndGggPSBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5kYXRhTGVuZ3RoOworICAgICAgICAgICAgICAgIHBhY2tldEZpbHRlclNldFJlcS5wYXJhbXNEYXRhW2ldLnJlc2VydmVkID0gMDsKKworICAgICAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIlByb3RvICVkIENvbXAgRmxhZyAlZCBGaWx0ZXIgVHlwZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZXF1ZXN0LT5wYXJhbXNEYXRhW2ldLnByb3RvY29sTGF5ZXIsIHBSZXF1ZXN0LT5wYXJhbXNEYXRhW2ldLmNtcEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRGaWx0ZXJTZXRSZXEuZmlsdGVyVHlwZSk7CisKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sICJEYXRhIE9mZnNldCAlZCBEYXRhIExlbiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZXF1ZXN0LT5wYXJhbXNEYXRhW2ldLmRhdGFPZmZzZXQsIHBSZXF1ZXN0LT5wYXJhbXNEYXRhW2ldLmRhdGFMZW5ndGgpOworCisgICAgICAgICAgICAgICAgbWVtY3B5KCZwYWNrZXRGaWx0ZXJTZXRSZXEucGFyYW1zRGF0YVtpXS5jb21wYXJlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZXF1ZXN0LT5wYXJhbXNEYXRhW2ldLmNvbXBhcmVEYXRhLCBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5kYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnBhY2tldEZpbHRlclNldFJlcS5wYXJhbXNEYXRhW2ldLmRhdGFNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgcFJlcXVlc3QtPnBhcmFtc0RhdGFbaV0uZGF0YU1hc2ssIHBSZXF1ZXN0LT5wYXJhbXNEYXRhW2ldLmRhdGFMZW5ndGgpOworCisgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiQ0RhdGEgJWQgQ0RhdGEgJWQgQ0RhdGEgJWQgQ0RhdGEgJWQgQ0RhdGEgJWQgQ0RhdGEgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5jb21wYXJlRGF0YVswXSwgcFJlcXVlc3QtPnBhcmFtc0RhdGFbaV0uY29tcGFyZURhdGFbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5jb21wYXJlRGF0YVsyXSwgcFJlcXVlc3QtPnBhcmFtc0RhdGFbaV0uY29tcGFyZURhdGFbM10sCisgICAgICAgICAgICAgICAgICAgICAgICBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5jb21wYXJlRGF0YVs0XSwgcFJlcXVlc3QtPnBhcmFtc0RhdGFbaV0uY29tcGFyZURhdGFbNV0pOworCisgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiTURhdGEgJWQgTURhdGEgJWQgTURhdGEgJWQgTURhdGEgJWQgTURhdGEgJWQgTURhdGEgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5kYXRhTWFza1swXSwgcFJlcXVlc3QtPnBhcmFtc0RhdGFbaV0uZGF0YU1hc2tbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5kYXRhTWFza1syXSwgcFJlcXVlc3QtPnBhcmFtc0RhdGFbaV0uZGF0YU1hc2tbM10sCisgICAgICAgICAgICAgICAgICAgICAgICBwUmVxdWVzdC0+cGFyYW1zRGF0YVtpXS5kYXRhTWFza1s0XSwgcFJlcXVlc3QtPnBhcmFtc0RhdGFbaV0uZGF0YU1hc2tbNV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzbWVfUmVjZWl2ZUZpbHRlclNldEZpbHRlcihwSGRkQ3R4LCAmcGFja2V0RmlsdGVyU2V0UmVxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEZhaWx1cmUgdG8gZXhlY3V0ZSBTZXQgRmlsdGVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEhERF9SQ1ZfRklMVEVSX0NMRUFSOgorCisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBDbGVhciBQYWNrZXQgRmlsdGVyIFJlcXVlc3QgZm9yIElkOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwUmVxdWVzdC0+ZmlsdGVySWQpOworICAgICAgICAgICAgcGFja2V0RmlsdGVyQ2xyUmVxLmZpbHRlcklkID0gcFJlcXVlc3QtPmZpbHRlcklkOworICAgICAgICAgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlcihwSGRkQ3R4LCAmcGFja2V0RmlsdGVyQ2xyUmVxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEZhaWx1cmUgdG8gZXhlY3V0ZSBDbGVhciBGaWx0ZXJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6IFBhY2tldCBGaWx0ZXIgUmVxdWVzdDogSW52YWxpZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwUmVxdWVzdC0+ZmlsdGVyQWN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB3bGFuX2hkZF9zZXRfbWNfYWRkcl9saXN0KGhkZF9jb250ZXh0X3QgKnBIZGRDdHgsIHZfVThfdCBzZXQpCit7CisgICAgdl9VOF90IGZpbHRlckFjdGlvbiA9IDA7IAorICAgIHRQYWNrZXRGaWx0ZXJDZmcgcmVxdWVzdCA9IHswfTsgCisgICAgdl9VOF90IGkgPSAwOworCisgICAgZmlsdGVyQWN0aW9uID0gc2V0ID8gSEREX1JDVl9GSUxURVJfU0VUIDogSEREX1JDVl9GSUxURVJfQ0xFQVI7CisKKyAgICAvKnNldCBtdWxpdGNhc3QgYWRkciBsaXN0Ki8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcEhkZEN0eC0+bWNfYWRkcl9saXN0Lm1jX2NudDsgaSsrKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YgKHRQYWNrZXRGaWx0ZXJDZmcpKTsKKyAgICAgICAgcmVxdWVzdC5maWx0ZXJBY3Rpb24gPSBmaWx0ZXJBY3Rpb247CisgICAgICAgIHJlcXVlc3QuZmlsdGVySWQgPSBpOyAKKyAgICAgICAgaWYgKHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVxdWVzdC5udW1QYXJhbXMgPSAxOyAKKyAgICAgICAgICAgIHJlcXVlc3QucGFyYW1zRGF0YVswXS5wcm90b2NvbExheWVyID0gSEREX0ZJTFRFUl9QUk9UT19UWVBFX01BQzsgCisgICAgICAgICAgICByZXF1ZXN0LnBhcmFtc0RhdGFbMF0uY21wRmxhZyA9IEhERF9GSUxURVJfQ01QX1RZUEVfRVFVQUw7ICAgCisgICAgICAgICAgICByZXF1ZXN0LnBhcmFtc0RhdGFbMF0uZGF0YU9mZnNldCA9IFdMQU5fSEREXzgwMjExX0ZSTV9EQV9PRkZTRVQ7CisgICAgICAgICAgICByZXF1ZXN0LnBhcmFtc0RhdGFbMF0uZGF0YUxlbmd0aCA9IEVUSF9BTEVOOworICAgICAgICAgICAgbWVtY3B5KCYocmVxdWVzdC5wYXJhbXNEYXRhWzBdLmNvbXBhcmVEYXRhWzBdKSwgCisgICAgICAgICAgICAgICAgICAgICYocEhkZEN0eC0+bWNfYWRkcl9saXN0LmFkZHJbaV1bMF0pLCBFVEhfQUxFTik7CisgICAgICAgICAgICAvKnNldCBtdWxpdGNhc3QgZmlsdGVycyovCisgICAgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICAgICAgICAiJXM6ICVzIG11bHRpY2FzdCBmaWx0ZXI6IGFkZHIgPSIgCisgICAgICAgICAgICAgICAgICAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsIAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2V0ID8gInNldHRpbmciIDogImNsZWFyaW5nIiwgCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFyYW1zRGF0YVswXS5jb21wYXJlRGF0YVswXSwgCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFyYW1zRGF0YVswXS5jb21wYXJlRGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJhbXNEYXRhWzBdLmNvbXBhcmVEYXRhWzJdLCAKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJhbXNEYXRhWzBdLmNvbXBhcmVEYXRhWzNdLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcmFtc0RhdGFbMF0uY29tcGFyZURhdGFbNF0sIAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcmFtc0RhdGFbMF0uY29tcGFyZURhdGFbNV0pOworICAgICAgICB9CisgICAgICAgIHdsYW5faGRkX3NldF9maWx0ZXIocEhkZEN0eCwgJnJlcXVlc3QpOworICAgIH0KKyAgICBwSGRkQ3R4LT5tY19hZGRyX2xpc3QuaXNGaWx0ZXJBcHBsaWVkID0gc2V0ID8gVFJVRSA6IEZBTFNFOworfQorCitzdGF0aWMgaW50IGl3X3NldF9wYWNrZXRfZmlsdGVyX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sgICAKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIHRwUGFja2V0RmlsdGVyQ2ZnIHBSZXF1ZXN0ID0gKHRwUGFja2V0RmlsdGVyQ2ZnKXdycXUtPmRhdGEucG9pbnRlcjsKKyAgICByZXR1cm4gd2xhbl9oZGRfc2V0X2ZpbHRlcihXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSwgcFJlcXVlc3QpOworfQorI2VuZGlmCitzdGF0aWMgaW50IGl3X2dldF9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKyAgVk9TX1NUQVRVUyB2b3Nfc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgIGhkZF93ZXh0X3N0YXRlX3QgKnBXZXh0U3RhdGU7CisgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKTsKKyAgY2hhciAqcCA9IGV4dHJhOworICBpbnQgdGxlbiA9IDA7CisgIHRDc3JTdW1tYXJ5U3RhdHNJbmZvICpwU3RhdHMgPSAmKHBBZGFwdGVyLT5oZGRfc3RhdHMuc3VtbWFyeV9zdGF0KTsKKworICB0Q3NyR2xvYmFsQ2xhc3NBU3RhdHNJbmZvICphU3RhdHMgPSAmKHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NBX3N0YXQpOworICB0Q3NyR2xvYmFsQ2xhc3NEU3RhdHNJbmZvICpkU3RhdHMgPSAmKHBBZGFwdGVyLT5oZGRfc3RhdHMuQ2xhc3NEX3N0YXQpOworCisgIEVOVEVSKCk7CisKKyAgaWYgKHBIZGRDdHgtPmlzTG9ncEluUHJvZ3Jlc3MpIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczpMT0dQIGluIFByb2dyZXNzLiBJZ25vcmUhISEiLF9fZnVuY19fKTsKKyAgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKworICBpZiAoZUNvbm5lY3Rpb25TdGF0ZV9Bc3NvY2lhdGVkICE9IChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5jb25uU3RhdGUpIHsKKworICAgICB3cnF1LT50eHBvd2VyLnZhbHVlID0gMDsKKyAgfQorICBlbHNlIHsKKyAgICBzdGF0dXMgPSBzbWVfR2V0U3RhdGlzdGljcyggcEhkZEN0eC0+aEhhbCwgZUNTUl9IREQsCisgICAgICAgICAgICAgICAgICAgICAgIFNNRV9TVU1NQVJZX1NUQVRTICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBTTUVfR0xPQkFMX0NMQVNTQV9TVEFUUyB8CisgICAgICAgICAgICAgICAgICAgICAgIFNNRV9HTE9CQUxfQ0xBU1NCX1NUQVRTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgU01FX0dMT0JBTF9DTEFTU0NfU1RBVFMgfAorICAgICAgICAgICAgICAgICAgICAgICBTTUVfR0xPQkFMX0NMQVNTRF9TVEFUUyB8CisgICAgICAgICAgICAgICAgICAgICAgIFNNRV9QRVJfU1RBX1NUQVRTLAorICAgICAgICAgICAgICAgICAgICAgICBoZGRfU3RhdGlzdGljc0NCLCAwLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLnN0YUlkWzBdLCBwQWRhcHRlciApOworCisgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IFVuYWJsZSB0byByZXRyaWV2ZSBTTUUgc3RhdGlzdGljcyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBXZXh0U3RhdGUgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisgICAgdm9zX3N0YXR1cyA9IHZvc193YWl0X3NpbmdsZV9ldmVudCgmcFdleHRTdGF0ZS0+dm9zZXZlbnQsIFdMQU5fV0FJVF9USU1FX1NUQVRTKTsKKyAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3Nfc3RhdHVzKSkKKyAgICB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBTTUUgdGltZW91dCB3aGlsZSByZXRyaWV2aW5nIHN0YXRpc3RpY3MiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgIC8qUmVtb3ZlIHRoZSBTTUUgc3RhdGlzdGljcyBsaXN0IGJ5IHBhc3NpbmcgTlVMTCBpbiBjYWxsYmFjayBhcmd1bWVudCovCisgICAgICAgc3RhdHVzID0gc21lX0dldFN0YXRpc3RpY3MoIHBIZGRDdHgtPmhIYWwsIGVDU1JfSERELAorICAgICAgICAgICAgICAgICAgICAgICBTTUVfU1VNTUFSWV9TVEFUUyAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgU01FX0dMT0JBTF9DTEFTU0FfU1RBVFMgfAorICAgICAgICAgICAgICAgICAgICAgICBTTUVfR0xPQkFMX0NMQVNTQl9TVEFUUyB8CisgICAgICAgICAgICAgICAgICAgICAgIFNNRV9HTE9CQUxfQ0xBU1NDX1NUQVRTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgU01FX0dMT0JBTF9DTEFTU0RfU1RBVFMgfAorICAgICAgICAgICAgICAgICAgICAgICBTTUVfUEVSX1NUQV9TVEFUUywKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5zdGFJZFswXSwgcEFkYXB0ZXIgKTsKKworICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBGSUxMX1RMVihwLCAodEFOSV9VOClXTEFOX1NUQVRTX1JFVFJZX0NOVCwKKyAgICAgICAgICAgICAgKHRBTklfVTgpIHNpemVvZiAocFN0YXRzLT5yZXRyeV9jbnQpLAorICAgICAgICAgICAgICAoY2hhciopICYocFN0YXRzLT5yZXRyeV9jbnRbMF0pLAorICAgICAgICAgICAgICB0bGVuKTsKKworICAgIEZJTExfVExWKHAsICh0QU5JX1U4KVdMQU5fU1RBVFNfTVVMX1JFVFJZX0NOVCwKKyAgICAgICAgICAgICAgKHRBTklfVTgpIHNpemVvZiAocFN0YXRzLT5tdWx0aXBsZV9yZXRyeV9jbnQpLAorICAgICAgICAgICAgICAoY2hhciopICYocFN0YXRzLT5tdWx0aXBsZV9yZXRyeV9jbnRbMF0pLAorICAgICAgICAgICAgICB0bGVuKTsKKworICAgIEZJTExfVExWKHAsICh0QU5JX1U4KVdMQU5fU1RBVFNfVFhfRlJNX0NOVCwKKyAgICAgICAgICAgICAgKHRBTklfVTgpIHNpemVvZiAocFN0YXRzLT50eF9mcm1fY250KSwKKyAgICAgICAgICAgICAgKGNoYXIqKSAmKHBTdGF0cy0+dHhfZnJtX2NudFswXSksCisgICAgICAgICAgICAgIHRsZW4pOworCisgICAgRklMTF9UTFYocCwgKHRBTklfVTgpV0xBTl9TVEFUU19SWF9GUk1fQ05ULAorICAgICAgICAgICAgICAodEFOSV9VOCkgc2l6ZW9mIChwU3RhdHMtPnJ4X2ZybV9jbnQpLAorICAgICAgICAgICAgICAoY2hhciopICYocFN0YXRzLT5yeF9mcm1fY250KSwKKyAgICAgICAgICAgICAgdGxlbik7CisKKyAgICBGSUxMX1RMVihwLCAodEFOSV9VOClXTEFOX1NUQVRTX0ZSTV9EVVBfQ05ULAorICAgICAgICAgICAgICAodEFOSV9VOCkgc2l6ZW9mIChwU3RhdHMtPmZybV9kdXBfY250KSwKKyAgICAgICAgICAgICAgKGNoYXIqKSAmKHBTdGF0cy0+ZnJtX2R1cF9jbnQpLAorICAgICAgICAgICAgICB0bGVuKTsKKworICAgIEZJTExfVExWKHAsICh0QU5JX1U4KVdMQU5fU1RBVFNfRkFJTF9DTlQsCisgICAgICAgICAgICAgICh0QU5JX1U4KSBzaXplb2YgKHBTdGF0cy0+ZmFpbF9jbnQpLAorICAgICAgICAgICAgICAoY2hhciopICYocFN0YXRzLT5mYWlsX2NudFswXSksCisgICAgICAgICAgICAgIHRsZW4pOworCisgICAgRklMTF9UTFYocCwgKHRBTklfVTgpV0xBTl9TVEFUU19SVFNfRkFJTF9DTlQsCisgICAgICAgICAgICAgICh0QU5JX1U4KSBzaXplb2YgKHBTdGF0cy0+cnRzX2ZhaWxfY250KSwKKyAgICAgICAgICAgICAgKGNoYXIqKSAmKHBTdGF0cy0+cnRzX2ZhaWxfY250KSwKKyAgICAgICAgICAgICAgdGxlbik7CisKKyAgICBGSUxMX1RMVihwLCAodEFOSV9VOClXTEFOX1NUQVRTX0FDS19GQUlMX0NOVCwKKyAgICAgICAgICAgICAgKHRBTklfVTgpIHNpemVvZiAocFN0YXRzLT5hY2tfZmFpbF9jbnQpLAorICAgICAgICAgICAgICAoY2hhciopICYocFN0YXRzLT5hY2tfZmFpbF9jbnQpLAorICAgICAgICAgICAgICB0bGVuKTsKKworICAgIEZJTExfVExWKHAsICh0QU5JX1U4KVdMQU5fU1RBVFNfUlRTX1NVQ19DTlQsCisgICAgICAgICAgICAgICh0QU5JX1U4KSBzaXplb2YgKHBTdGF0cy0+cnRzX3N1Y2NfY250KSwKKyAgICAgICAgICAgICAgKGNoYXIqKSAmKHBTdGF0cy0+cnRzX3N1Y2NfY250KSwKKyAgICAgICAgICAgICAgdGxlbik7CisKKyAgICBGSUxMX1RMVihwLCAodEFOSV9VOClXTEFOX1NUQVRTX1JYX0RJU0NBUkRfQ05ULAorICAgICAgICAgICAgICAodEFOSV9VOCkgc2l6ZW9mIChwU3RhdHMtPnJ4X2Rpc2NhcmRfY250KSwKKyAgICAgICAgICAgICAgKGNoYXIqKSAmKHBTdGF0cy0+cnhfZGlzY2FyZF9jbnQpLAorICAgICAgICAgICAgICB0bGVuKTsKKworICAgIEZJTExfVExWKHAsICh0QU5JX1U4KVdMQU5fU1RBVFNfUlhfRVJST1JfQ05ULAorICAgICAgICAgICAgICAodEFOSV9VOCkgc2l6ZW9mIChwU3RhdHMtPnJ4X2Vycm9yX2NudCksCisgICAgICAgICAgICAgIChjaGFyKikgJihwU3RhdHMtPnJ4X2Vycm9yX2NudCksCisgICAgICAgICAgICAgIHRsZW4pOworCisgICAgRklMTF9UTFYocCwgKHRBTklfVTgpV0xBTl9TVEFUU19UWF9CWVRFX0NOVCwKKyAgICAgICAgICAgICAgKHRBTklfVTgpIHNpemVvZiAocFN0YXRzLT50eF9ieXRlX2NudCksCisgICAgICAgICAgICAgIChjaGFyKikgJihwU3RhdHMtPnR4X2J5dGVfY250KSwKKyAgICAgICAgICAgICAgdGxlbik7CisKKyAgICBGSUxMX1RMVihwLCAodEFOSV9VOClXTEFOX1NUQVRTX1JYX0JZVEVfQ05ULAorICAgICAgICAgICAgICAodEFOSV9VOCkgc2l6ZW9mIChkU3RhdHMtPnJ4X2J5dGVfY250KSwKKyAgICAgICAgICAgICAgKGNoYXIqKSAmKGRTdGF0cy0+cnhfYnl0ZV9jbnQpLAorICAgICAgICAgICAgICB0bGVuKTsKKworICAgIEZJTExfVExWKHAsICh0QU5JX1U4KVdMQU5fU1RBVFNfUlhfUkFURSwKKyAgICAgICAgICAgICAgKHRBTklfVTgpIHNpemVvZiAoZFN0YXRzLT5yeF9yYXRlKSwKKyAgICAgICAgICAgICAgKGNoYXIqKSAmKGRTdGF0cy0+cnhfcmF0ZSksCisgICAgICAgICAgICAgIHRsZW4pOworCisgICAgLyogVHJhbnNtaXQgcmF0ZSwgaW4gdW5pdHMgb2YgNTAwIGtiaXQvc2VjICovCisgICAgRklMTF9UTFYocCwgKHRBTklfVTgpV0xBTl9TVEFUU19UWF9SQVRFLAorICAgICAgICAgICAgICAodEFOSV9VOCkgc2l6ZW9mIChhU3RhdHMtPnR4X3JhdGUpLAorICAgICAgICAgICAgICAoY2hhciopICYoYVN0YXRzLT50eF9yYXRlKSwKKyAgICAgICAgICAgICAgdGxlbik7CisKKyAgICB3cnF1LT5kYXRhLmxlbmd0aCA9IHRsZW47CisKKyAgfQorCisgIEVYSVQoKTsKKworICByZXR1cm4gMDsKK30KKworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisKKy8qTWF4IExlbiBmb3IgUE5PIG5vdGlmaWNhdGlvbiovCisjZGVmaW5lIE1BWF9QTk9fTk9USUZZX0xFTiAxMDAKK3ZvaWQgZm91bmRfcHJlZl9uZXR3b3JrX2NiICh2b2lkICpjYWxsYmFja0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyUHJlZk5ldHdvcmtGb3VuZEluZCAqcFByZWZOZXR3b3JrRm91bmRJbmQpCit7CisgIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QqKWNhbGxiYWNrQ29udGV4dDsKKyAgdW5pb24gaXdyZXFfZGF0YSB3cnF1OworICBjaGFyIGJ1ZltNQVhfUE5PX05PVElGWV9MRU4rMV07CisKKyAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9XQVJOLCAiQSBwcmVmZXJyZWQgbmV0d29yayB3YXMgZm91bmQ6ICVzIHdpdGggcnNzaTogLSVkIiwKKyAgICAgICAgIHBQcmVmTmV0d29ya0ZvdW5kSW5kLT5zc0lkLnNzSWQsIHBQcmVmTmV0d29ya0ZvdW5kSW5kLT5yc3NpKTsKKworICAvLyBjcmVhdGUgdGhlIGV2ZW50CisgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisgIHNucHJpbnRmKGJ1ZiwgTUFYX1BOT19OT1RJRllfTEVOLCAiUUNPTTogRm91bmQgcHJlZmVycmVkIG5ldHdvcms6ICVzIHdpdGggUlNTSSBvZiAtJXUiLAorICAgICAgICAgICBwUHJlZk5ldHdvcmtGb3VuZEluZC0+c3NJZC5zc0lkLAorICAgICAgICAgICh1bnNpZ25lZCBpbnQpcFByZWZOZXR3b3JrRm91bmRJbmQtPnJzc2kpOworCisgIHdycXUuZGF0YS5wb2ludGVyID0gYnVmOworICB3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisKKyAgLy8gc2VuZCB0aGUgZXZlbnQKKworICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZGFwdGVyLT5kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBidWYpOworCit9CisKKworLypzdHJpbmcgYmFzZWQgaW5wdXQqLworVk9TX1NUQVRVUyBpd19zZXRfcG5vKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEsIGludCBuT2Zmc2V0KQoreworICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICB0U2lyUE5PU2NhblJlcSBwbm9SZXF1ZXN0OworICBjaGFyICpwdHI7CisgIHZfVThfdCBpLGosIHVjUGFyYW1zLCB1Y01vZGU7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICJQTk8gZGF0YSBsZW4gJWQgZGF0YSAlcyIsCisgICAgICAgICAgICB3cnF1LT5kYXRhLmxlbmd0aCwKKyAgICAgICAgICAgIHdycXUtPmRhdGEucG9pbnRlcik7CisKKyAgaWYgKHdycXUtPmRhdGEubGVuZ3RoIDw9IG5PZmZzZXQgKQorICB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIlBOTyBpbnB1dCBpcyBub3QgY29ycmVjdCIpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIHBub1JlcXVlc3QuZW5hYmxlID0gMDsKKyAgcG5vUmVxdWVzdC51Y05ldHdvcmtzQ291bnQgPSAwOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSW5wdXQgaXMgc3RyaW5nIGJhc2VkIGFuZCBleHBlY3RlZCB0byBiZSBsaWtlIHRoaXM6CisKKyAgICA8ZW5hYmxlZD4gPG5ldHdfY291bnQ+CisgICAgZm9yIGVhY2ggbmV0d29yazoKKyAgICA8c3NpZF9sZW4+IDxzc2lkPiA8YXV0aGVudGljYXRpb24+IDxlbmNyeXB0aW9uPgorICAgIDxjaF9udW0+IDxjaGFubmVsX2xpc3Qgb3B0aW9uYWw+IDxiY2FzdF90eXBlPiA8cnNzaV90aHJlc2hvbGQ+CisgICAgPHNjYW5fdGltZXJzPiA8c2Nhbl90aW1lPiA8c2Nhbl9yZXBlYXQ+IDxzY2FuX3RpbWU+IDxzY2FuX3JlcGVhdD4KKworICAgIGUuZzoKKyAgICAxIDIgNCB0ZXN0IDAgMCAzIDEgNiAxMSAyIDQwIDUgdGVzdDIgNCA0IDYgMSAyIDMgNCA1IDYgMSAwIDIgNSAyIDMwMCAwIAorCisgICAgdGhpcyB0cmFuc2xhdGVzIGludG86CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBlbmFibGUgUE5PCisgICAgbG9vayBmb3IgMiBuZXR3b3JrczoKKyAgICB0ZXN0IC0gd2l0aCBhdXRoZW50aWNhdGlvbiB0eXBlIDAgYW5kIGVuY3J5cHRpb24gdHlwZSAwLAorICAgIHRoYXQgY2FuIGJlIGZvdW5kIG9uIDMgY2hhbm5lbHM6IDEgNiBhbmQgMTEgLAorICAgIFNTSUQgYmNhc3QgdHlwZSBpcyB1bmtub3duIChkaXJlY3RlZCBwcm9iZSB3aWxsIGJlIHNlbnQgaWYgQVAgbm90IGZvdW5kKQorICAgIGFuZCBtdXN0IG1lZXQgLTQwZEJtIFJTU0kKKworICAgIHRlc3QyIC0gd2l0aCBhdXRoIGFuZCBlbnJ5dHB0aW9uIHR5cGUgNC80CisgICAgdGhhdCBjYW4gYmUgZm91bmQgb24gNiBjaGFubmVscyAxLCAyLCAzLCA0LCA1IGFuZCA2CisgICAgYmNhc3QgdHlwZSBpcyBub24tYmNhc3QgKGRpcmVjdGVkIHByb2JlIHdpbGwgYmUgc2VudCkKKyAgICBhbmQgbXVzdCBub3QgbWVldCBhbnkgUlNTSSB0aHJlc2hvbGQKKworICAgIHNjYW4gZXZlcnkgNSBzZWNvbmRzIDIgdGltZXMsIHNjYW4gZXZlcnkgMzAwIHNlY29uZHMgdW50aWwgc3RvcHBlZCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwdHIgPSAoY2hhciopKHdycXUtPmRhdGEucG9pbnRlciArIG5PZmZzZXQpOworCisgIHNzY2FuZihwdHIsIiVoaHUlbiIsICYocG5vUmVxdWVzdC5lbmFibGUpLCAmbk9mZnNldCk7CisKKyAgaWYgKCAwID09IHBub1JlcXVlc3QuZW5hYmxlICkKKyAgeworICAgIC8qRGlzYWJsZSBQTk8qLworICAgIG1lbXNldCgmcG5vUmVxdWVzdCwgMCwgc2l6ZW9mKHBub1JlcXVlc3QpKTsKKyAgICBzbWVfU2V0UHJlZmVycmVkTmV0d29ya0xpc3QoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCAmcG5vUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlZl9uZXR3b3JrX2NiLCBwQWRhcHRlcik7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgfQorCisgIHB0ciArPSBuT2Zmc2V0OworICBzc2NhbmYocHRyLCIlaGh1ICVuIiwgJihwbm9SZXF1ZXN0LnVjTmV0d29ya3NDb3VudCksICZuT2Zmc2V0KTsKKworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgIlBOTyBlbmFibGUgJWQgbmV0d29ya3MgY291bnQgJWQgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgIHBub1JlcXVlc3QuZW5hYmxlLAorICAgICAgICAgICAgcG5vUmVxdWVzdC51Y05ldHdvcmtzQ291bnQsCisgICAgICAgICAgICBuT2Zmc2V0KTsKKworICAvKiBQYXJhbWV0ZXJzIGNoZWNraW5nOgorICAgICAgdWNOZXR3b3Jrc0NvdW50IGhhcyB0byBiZSBsYXJnZXIgdGhhbiAwKi8KKyAgaWYgKCggMCA9PSBwbm9SZXF1ZXN0LnVjTmV0d29ya3NDb3VudCApIHx8CisgICAgICAoIHBub1JlcXVlc3QudWNOZXR3b3Jrc0NvdW50ID4gU0lSX1BOT19NQVhfU1VQUF9ORVRXT1JLUyApKQorICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLCAiTmV0d29yayBpbnB1dCBpcyBub3QgY29ycmVjdCIpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgcHRyICs9IG5PZmZzZXQ7CisKKyAgZm9yICggaSA9IDA7IGkgPCBwbm9SZXF1ZXN0LnVjTmV0d29ya3NDb3VudDsgaSsrICkKKyAgeworCisgICAgcG5vUmVxdWVzdC5hTmV0d29ya3NbaV0uc3NJZC5sZW5ndGggPSAwOworCisgICAgc3NjYW5mKHB0ciwiJWhodSAlbiIsCisgICAgICAgICAgICYocG5vUmVxdWVzdC5hTmV0d29ya3NbaV0uc3NJZC5sZW5ndGgpLCAmbk9mZnNldCk7CisKKyAgICBpZiAoKCAwID09IHBub1JlcXVlc3QuYU5ldHdvcmtzW2ldLnNzSWQubGVuZ3RoICkgfHwKKyAgICAgICAgKCBwbm9SZXF1ZXN0LmFOZXR3b3Jrc1tpXS5zc0lkLmxlbmd0aCA+IDMyICkgKQorICAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJTU0lEIExlbiAlZCBpcyBub3QgY29ycmVjdCBmb3IgbmV0d29yayAlZCIsCisgICAgICAgICAgICAgICAgcG5vUmVxdWVzdC5hTmV0d29ya3NbaV0uc3NJZC5sZW5ndGgsIGkpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIC8qQWR2YW5jZSB0byBTU0lEKi8KKyAgICBwdHIgKz0gbk9mZnNldDsKKworICAgIHVjUGFyYW1zID0gc3NjYW5mKHB0ciwiJTMycyAlbHUgJWx1ICVoaHUgJW4iLAorICAgICAgICAgICBwbm9SZXF1ZXN0LmFOZXR3b3Jrc1tpXS5zc0lkLnNzSWQsCisgICAgICAgICAgICYocG5vUmVxdWVzdC5hTmV0d29ya3NbaV0uYXV0aGVudGljYXRpb24pLAorICAgICAgICAgICAmKHBub1JlcXVlc3QuYU5ldHdvcmtzW2ldLmVuY3J5cHRpb24pLAorICAgICAgICAgICAmKHBub1JlcXVlc3QuYU5ldHdvcmtzW2ldLnVjQ2hhbm5lbENvdW50KSwKKyAgICAgICAgICAgJm5PZmZzZXQpOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICJQTk8gbGVuICVkIHNzaWQgJXMgYXV0aCAlZCBlbmNyeSAlZCBjaGFubmVsIGNvdW50ICVkIG9mZnNldCAlZCIsCisgICAgICAgICAgICBwbm9SZXF1ZXN0LmFOZXR3b3Jrc1tpXS5zc0lkLmxlbmd0aCwKKyAgICAgICAgICAgIHBub1JlcXVlc3QuYU5ldHdvcmtzW2ldLnNzSWQuc3NJZCwKKyAgICAgICAgICAgIHBub1JlcXVlc3QuYU5ldHdvcmtzW2ldLmF1dGhlbnRpY2F0aW9uLAorICAgICAgICAgICAgcG5vUmVxdWVzdC5hTmV0d29ya3NbaV0uZW5jcnlwdGlvbiwKKyAgICAgICAgICAgIHBub1JlcXVlc3QuYU5ldHdvcmtzW2ldLnVjQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgbk9mZnNldCApOworCisgICAgaWYgKCA0ICE9IHVjUGFyYW1zICkKKyAgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICJJbmNvcnJlY3QgY21kIik7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgLypBZHZhbmNlIHRvIGNoYW5uZWwgbGlzdCovCisgICAgcHRyICs9IG5PZmZzZXQ7CisKKyAgICBpZiAoIFNJUl9QTk9fTUFYX05FVFdfQ0hBTk5FTFMgPCBwbm9SZXF1ZXN0LmFOZXR3b3Jrc1tpXS51Y0NoYW5uZWxDb3VudCApCisgICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IG51bWJlciBvZiBjaGFubmVscyIpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIGlmICggMCAhPSAgcG5vUmVxdWVzdC5hTmV0d29ya3NbaV0udWNDaGFubmVsQ291bnQpCisgICAgeworICAgICAgZm9yICggaiA9IDA7IGogPCBwbm9SZXF1ZXN0LmFOZXR3b3Jrc1tpXS51Y0NoYW5uZWxDb3VudDsgaisrKQorICAgICAgeworICAgICAgICBzc2NhbmYocHRyLCIlaGh1ICVuIiwKKyAgICAgICAgICAgICAgJihwbm9SZXF1ZXN0LmFOZXR3b3Jrc1tpXS5hQ2hhbm5lbHNbal0pLCAmbk9mZnNldCk7CisgICAgICAgIC8qQWR2YW5jZSB0byBuZXh0IGNoYW5uZWwgbnVtYmVyKi8KKyAgICAgICAgcHRyICs9IG5PZmZzZXQ7CisgICAgICB9CisgICAgfQorCisgICAgc3NjYW5mKHB0ciwiJWx1ICVuIiwKKyAgICAgICAgICAgICAgJihwbm9SZXF1ZXN0LmFOZXR3b3Jrc1tpXS5iY2FzdE5ldHdUeXBlKSwgJm5PZmZzZXQpOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICJQTk8gYmNhc3ROZXR3VHlwZSAlZCBvZmZzZXQgJWQiLAorICAgICAgICAgICAgcG5vUmVxdWVzdC5hTmV0d29ya3NbaV0uYmNhc3ROZXR3VHlwZSwKKyAgICAgICAgICAgIG5PZmZzZXQgKTsKKworICAgIC8qQWR2YW5jZSB0byByc3NpIFRocmVzaG9sZCovCisgICAgcHRyICs9IG5PZmZzZXQ7CisKKyAgICBzc2NhbmYocHRyLCIlaGh1ICVuIiwKKyAgICAgICAgICAgICAgJihwbm9SZXF1ZXN0LmFOZXR3b3Jrc1tpXS5yc3NpVGhyZXNob2xkKSwgJm5PZmZzZXQpOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICJQTk8gcnNzaSAlZCBvZmZzZXQgJWQiLAorICAgICAgICAgICAgcG5vUmVxdWVzdC5hTmV0d29ya3NbaV0ucnNzaVRocmVzaG9sZCwKKyAgICAgICAgICAgIG5PZmZzZXQgKTsKKyAgICAvKkFkdmFuY2UgdG8gbmV4dCBuZXR3b3JrKi8KKyAgICBwdHIgKz0gbk9mZnNldDsKKyAgfS8qRm9yIHVjTmV0d29ya0NvdW50Ki8KKworICB1Y1BhcmFtcyA9IHNzY2FuZihwdHIsIiVoaHUgJW4iLAorICAgICAgICAgICAgICAmKHBub1JlcXVlc3Quc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudCksICZuT2Zmc2V0KTsKKworICAvKlJlYWQgdGhlIHNjYW4gdGltZXJzKi8KKyAgaWYgKCggMSA9PSB1Y1BhcmFtcyApJiYoICBwbm9SZXF1ZXN0LnNjYW5UaW1lcnMudWNTY2FuVGltZXJzQ291bnQgPj0gMCApKQorICB7CisgICAgIHB0ciArPSBuT2Zmc2V0OworCisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAiU2NhbiB0aW1lciBjb3VudCAlZCBvZmZzZXQgJWQiLCAKKyAgICAgICAgcG5vUmVxdWVzdC5zY2FuVGltZXJzLnVjU2NhblRpbWVyc0NvdW50LAorICAgICAgICBuT2Zmc2V0ICk7CisKKyAgICAgaWYgKCBTSVJfUE5PX01BWF9TQ0FOX1RJTUVSUyA8IHBub1JlcXVlc3Quc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudCApCisgICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICJJbmNvcnJlY3QgY21kIC0gdG9vIG1hbnkgc2NhbiB0aW1lcnMiKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgIH0KKworICAgICBmb3IgKCBpID0gMDsgaSA8IHBub1JlcXVlc3Quc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudDsgaSsrICkKKyAgICAgeworICAgICAgICB1Y1BhcmFtcyA9IHNzY2FuZihwdHIsIiVsdSAlbHUgJW4iLAorICAgICAgICAgICAmKHBub1JlcXVlc3Quc2NhblRpbWVycy5hVGltZXJWYWx1ZXNbaV0udVRpbWVyVmFsdWUpLAorICAgICAgICAgICAmKCBwbm9SZXF1ZXN0LnNjYW5UaW1lcnMuYVRpbWVyVmFsdWVzW2ldLnVUaW1lclJlcGVhdCksCisgICAgICAgICAgICZuT2Zmc2V0KTsKKworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICJQTk8gVGltZXIgdmFsdWUgJWQgVGltZXIgcmVwZWF0ICVkIG9mZnNldCAlZCIsIAorICAgICAgICAgICAgcG5vUmVxdWVzdC5zY2FuVGltZXJzLmFUaW1lclZhbHVlc1tpXS51VGltZXJWYWx1ZSwgCisgICAgICAgICAgICBwbm9SZXF1ZXN0LnNjYW5UaW1lcnMuYVRpbWVyVmFsdWVzW2ldLnVUaW1lclJlcGVhdCwKKyAgICAgICAgICAgIG5PZmZzZXQgKTsKKworICAgICAgICBpZiAoIDIgIT0gdWNQYXJhbXMgKQorICAgICAgICB7CisgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGNtZCAtIGRpZmYgcGFyYW1zIHRoZW4gZXhwZWN0ZWQgJWQiLCB1Y1BhcmFtcyk7CisgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICB9CisKKyAgICAgICAgcHRyICs9IG5PZmZzZXQ7CisgICAgIH0KKworICB9CisgIGVsc2UKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICJObyBzY2FuIHRpbWVycyBwcm92aWRlZCBwYXJhbSBjb3VudCAlZCBzY2FuIHRpbWVycyAlZCIsIAorICAgICAgICB1Y1BhcmFtcywgIHBub1JlcXVlc3Quc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudCApOworCisgICAgLypTY2FuIHRpbWVycyBkZWZhdWx0cyB0byA1IG1pbnV0ZXMqLworICAgIHBub1JlcXVlc3Quc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudCA9IDE7CisgICAgcG5vUmVxdWVzdC5zY2FuVGltZXJzLmFUaW1lclZhbHVlc1swXS51VGltZXJWYWx1ZSAgPSA2MDsKKyAgICBwbm9SZXF1ZXN0LnNjYW5UaW1lcnMuYVRpbWVyVmFsdWVzWzBdLnVUaW1lclJlcGVhdCA9IDA7CisgIH0KKworICB1Y1BhcmFtcyA9IHNzY2FuZihwdHIsIiVoaHUgJW4iLAorICAgICAgICAgICAgICAmKHVjTW9kZSksICZuT2Zmc2V0KTsKKworICBwbm9SZXF1ZXN0Lm1vZGVQTk8gPSB1Y01vZGU7CisgIC8qZm9yIExBIHdlIGp1c3QgZXhwb3NlIHN1c3BlbmQgb3B0aW9uKi8KKyAgaWYgKCggMSAhPSB1Y1BhcmFtcyApfHwoICB1Y01vZGUgPj0gU0lSX1BOT19NT0RFX01BWCApKQorICB7CisgICAgIHBub1JlcXVlc3QubW9kZVBOTyA9IFNJUl9QTk9fTU9ERV9PTl9TVVNQRU5EOworICB9CisKKyAgc21lX1NldFByZWZlcnJlZE5ldHdvcmtMaXN0KFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwgJnBub1JlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZWZfbmV0d29ya19jYiwgcEFkYXB0ZXIpOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9Lyppd19zZXRfcG5vKi8KKworVk9TX1NUQVRVUyBpd19zZXRfcnNzaV9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEsIGludCBuT2Zmc2V0KQoreworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisgICAgdl9VOF90IHJzc2lUaHJlc2hvbGQgPSAwOworICAgIHZfVThfdCBuUmVhZDsKKworICAgIG5SZWFkID0gc3NjYW5mKHdycXUtPmRhdGEucG9pbnRlciArIG5PZmZzZXQsIiVoaHUiLAorICAgICAgICAgICAmcnNzaVRocmVzaG9sZCk7CisKKyAgICBpZiAoIDEgIT0gblJlYWQgKQorICAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIkluY29ycmVjdCBmb3JtYXQiKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICBzbWVfU2V0UlNTSUZpbHRlcihXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIHJzc2lUaHJlc2hvbGQpOworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIGludCBpd19zZXRfcG5vX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiU2V0IFBOTyBQcml2YXRlIik7CisgIHJldHVybiBpd19zZXRfcG5vKGRldixpbmZvLHdycXUsZXh0cmEsMCk7Cit9CisjZW5kaWYgLypGRUFUVVJFX1dMQU5fU0NBTl9QTk8qLworCisvL0NvbW1vbiBmdW5jdGlvbiB0byBTZXRCYW5kCitpbnQgaGRkX3NldEJhbmRfaGVscGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHRBTklfVTgqIHB0cikKK3sKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIHRIYWxIYW5kbGUgaEhhbCA9IFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKTsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisgICAgdEFOSV9VOCBiYW5kID0gMDsKKyAgICBlQ3NyQmFuZCBjdXJyQmFuZCA9IGVDU1JfQkFORF9NQVg7CisKKyAgICBiYW5kID0gcHRyW1dMQU5fSEREX1VJX1NFVF9CQU5EX1ZBTFVFX09GRlNFVF0gLSAnMCc7IC8qY29udmVydCB0aGUgYmFuZCB2YWx1ZSBmcm9tIGFzY2lpIHRvIGludGVnZXIqLworCisgICAgc3dpdGNoKGJhbmQpCisgICAgeworICAgICAgICBjYXNlIFdMQU5fSEREX1VJX0JBTkRfQVVUTzoKKyAgICAgICAgICAgICBiYW5kID0gZUNTUl9CQU5EX0FMTDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9IRERfVUlfQkFORF81X0dIWjoKKyAgICAgICAgICAgIGJhbmQgPSBlQ1NSX0JBTkRfNUc7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fSEREX1VJX0JBTkRfMl80X0dIWjoKKyAgICAgICAgICAgIGJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYmFuZCA9IGVDU1JfQkFORF9NQVg7CisgICAgfQorCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogY2hhbmdlIGJhbmQgdG8gJXUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmFuZCk7CisKKyAgICBpZiAoYmFuZCA9PSBlQ1NSX0JBTkRfTUFYKQorICAgIHsKKyAgICAgICAgLyogUmVjZWl2ZWQgY2hhbmdlIGJhbmQgcmVxdWVzdCB3aXRoIGludmFsaWQgYmFuZCB2YWx1ZSAqLworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICIlczogSW52YWxpZCBiYW5kIHZhbHVlICV1IiwgX19GVU5DVElPTl9fLCBiYW5kKTsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX0dldEZyZXFCYW5kKGhIYWwsICZjdXJyQmFuZCkpCisgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgYmFuZCBjb25maWciLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgaWYgKGN1cnJCYW5kICE9IGJhbmQpCisgICAgeworICAgICAgICAvKiBDaGFuZ2UgYmFuZCByZXF1ZXN0IHJlY2VpdmVkLgorICAgICAgICAgKiBBYm9ydCBwZW5kaW5nIHNjYW4gcmVxdWVzdHMsIGZsdXNoIHRoZSBleGlzdGluZyBzY2FuIHJlc3VsdHMsCisgICAgICAgICAqIGFuZCBjaGFuZ2UgdGhlIGJhbmQgY2FwYWJpbGl0eQorICAgICAgICAgKi8KKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiJXM6IEN1cnJlbnQgYmFuZCB2YWx1ZSA9ICV1LCBuZXcgc2V0dGluZyAldSAiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGN1cnJCYW5kLCBiYW5kKTsKKworICAgICAgICBpZiAoaGRkX2Nvbm5Jc0Nvbm5lY3RlZChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9ICYocEFkYXB0ZXIpLT5zZXNzaW9uQ3R4LnN0YXRpb247CisgICAgICAgICAgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgIGxvbmcgbHJjOworCisgICAgICAgICAgICAgLyogU1RBIGFscmVhZHkgY29ubmVjdGVkIG9uIGN1cnJlbnQgYmFuZCwgU28gaXNzdWUgZGlzY29ubmVjdCBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICogdGhlbiBjaGFuZ2UgdGhlIGJhbmQqLworCisgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgIiVzIFNUQSBjb25uZWN0ZWQgaW4gYmFuZCAldSwgQ2hhbmdpbmcgYmFuZCB0byAldSwgSXNzdWluZyBEaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjc3JHZXRDdXJyZW50QmFuZChoSGFsKSwgYmFuZCk7CisKKyAgICAgICAgICAgICBwSGRkU3RhQ3R4LT5jb25uX2luZm8uY29ublN0YXRlID0gZUNvbm5lY3Rpb25TdGF0ZV9Ob3RDb25uZWN0ZWQ7CisgICAgICAgICAgICAgSU5JVF9DT01QTEVUSU9OKHBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyKTsKKworICAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9Sb2FtRGlzY29ubmVjdCggV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworCisgICAgICAgICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgY3NyUm9hbURpc2Nvbm5lY3QgZmFpbHVyZSwgcmV0dXJuZWQgJWQgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIChpbnQpc3RhdHVzICk7CisgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIGxyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorICAgICAgICAgICAgICAgICAgICAgJnBBZGFwdGVyLT5kaXNjb25uZWN0X2NvbXBfdmFyLAorICAgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhXTEFOX1dBSVRfVElNRV9ESVNDT05ORUNUKSk7CisKKyAgICAgICAgICAgICBpZihscmMgPD0gMCkgeworCisgICAgICAgICAgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6ICVzIHdoaWxlIHdoaWxlIHdhaXRpbmcgZm9yIGNzclJvYW1EaXNjb25uZWN0ICIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKDAgPT0gbHJjKSA/ICJUaW1lb3V0IiA6ICJJbnRlcnJ1cHQiKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAoMCA9PSBscmMpID8gLUVUSU1FRE9VVCA6IC1FSU5UUjsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBoZGRfYWJvcnRfbWFjX3NjYW4ocEhkZEN0eCk7CisgICAgICAgIHNtZV9TY2FuRmx1c2hSZXN1bHQoaEhhbCwgcEFkYXB0ZXItPnNlc3Npb25JZCk7CisgICAgICAgIGlmKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX1NldEZyZXFCYW5kKGhIYWwsIChlQ3NyQmFuZCliYW5kKSkKKyAgICAgICAgeworICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBmYWlsZWQgdG8gc2V0IHRoZSBiYW5kIHZhbHVlIHRvICV1ICIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJhbmQpOworICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisjaWZkZWYgQ09ORklHX0NGRzgwMjExCisgICAgICAgIHdsYW5faGRkX2NmZzgwMjExX3VwZGF0ZV9iYW5kKHBIZGRDdHgtPndpcGh5LCAoZUNzckJhbmQpYmFuZCk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdfc2V0X2JhbmRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgdEFOSV9VOCAqcHRyID0gKHRBTklfVTgqKXdycXUtPmRhdGEucG9pbnRlcjsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogIiwgX19GVU5DVElPTl9fKTsKKworICAgIGlmIChtZW1jbXAocHRyLCAiU0VUQkFORCAiLCA4KSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogQ2hhbmdlIGJhbmQgcmVxdWVzdCByZWNlaXZlZCAqLworICAgICAgICByZXQgPSBoZGRfc2V0QmFuZF9oZWxwZXIoZGV2LCBwdHIpOworICAgICAgICByZXR1cm4gcmV0OworCisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3X3NldF9wb3dlcl9wYXJhbXNfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICJTZXQgcG93ZXIgcGFyYW1zIFByaXZhdGUiKTsKKyAgcmV0dXJuIGl3X3NldF9wb3dlcl9wYXJhbXMoZGV2LGluZm8sd3JxdSxleHRyYSwwKTsKK30KKworCisKKy8qc3RyaW5nIGJhc2VkIGlucHV0Ki8KK1ZPU19TVEFUVVMgaXdfc2V0X3Bvd2VyX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhLCBpbnQgbk9mZnNldCkKK3sKKyAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSBXTEFOX0hERF9HRVRfUFJJVl9QVFIoZGV2KTsKKyAgdFNpclNldFBvd2VyUGFyYW1zUmVxIHBvd2VyUmVxdWVzdDsKKyAgY2hhciAqcHRyOworICB2X1U4X3QgIHVjVHlwZTsKKyAgdl9VMzJfdCAgdVRvdGFsU2l6ZSwgdVZhbHVlOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiUG93ZXIgUGFyYW1zIGRhdGEgbGVuICVkIGRhdGEgJXMiLAorICAgICAgICAgICAgd3JxdS0+ZGF0YS5sZW5ndGgsCisgICAgICAgICAgICB3cnF1LT5kYXRhLnBvaW50ZXIpOworCisgIGlmICh3cnF1LT5kYXRhLmxlbmd0aCA8PSBuT2Zmc2V0ICkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sICJzZXQgcG93ZXIgcGFyYW0gaW5wdXQgaXMgbm90IGNvcnJlY3QiKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICB1VG90YWxTaXplID0gd3JxdS0+ZGF0YS5sZW5ndGggLSBuT2Zmc2V0OworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJbnB1dCBpcyBzdHJpbmcgYmFzZWQgYW5kIGV4cGVjdGVkIHRvIGJlIGxpa2UgdGhpczoKKworICAgIDxwYXJhbV90eXBlPiA8cGFyYW1fdmFsdWU+IDxwYXJhbV90eXBlPiA8cGFyYW1fdmFsdWU+IC4uLgorCisgICAgZS5nOgorICAgIDEgMiAyIDMgMyAwIDQgMSA1IDEKKworICAgIGUuZy4gc2V0dGluZyBqdXN0IGEgZmV3OgorICAgIDEgMiA0IDEKKworICAgIHBhcmFtZXRlciB0eXBlczoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEgLSBJZ25vcmUgRFRJTQorICAgIDIgLSBMaXN0ZW4gSW50ZXJ2YWwKKyAgICAzIC0gQnJvYWRjYXN0IE11bHRpY2FzIEZpbHRlcgorICAgIDQgLSBCZWFjb24gRWFybHkgVGVybWluYXRpb24KKyAgICA1IC0gQmVhY29uIEVhcmx5IFRlcm1pbmF0aW9uIEludGVydmFsCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcG93ZXJSZXF1ZXN0LnVJZ25vcmVEVElNICAgICAgID0gU0lSX05PQ0hBTkdFX1BPV0VSX1ZBTFVFOworICBwb3dlclJlcXVlc3QudUxpc3RlbkludGVydmFsICAgPSBTSVJfTk9DSEFOR0VfUE9XRVJfVkFMVUU7CisgIHBvd2VyUmVxdWVzdC51QmNhc3RNY2FzdEZpbHRlciA9IFNJUl9OT0NIQU5HRV9QT1dFUl9WQUxVRTsKKyAgcG93ZXJSZXF1ZXN0LnVFbmFibGVCRVQgICAgICAgID0gU0lSX05PQ0hBTkdFX1BPV0VSX1ZBTFVFOworICBwb3dlclJlcXVlc3QudUJFVEludGVydmFsICAgICAgPSBTSVJfTk9DSEFOR0VfUE9XRVJfVkFMVUU7CisKKyAgcHRyID0gKGNoYXIqKSh3cnF1LT5kYXRhLnBvaW50ZXIgKyBuT2Zmc2V0KTsKKworICB3aGlsZSAoIHVUb3RhbFNpemUgKQorICB7CisgICAgc3NjYW5mKHB0ciwiJWhodSAlbiIsICYodWNUeXBlKSwgJm5PZmZzZXQpOworCisgICAgdVRvdGFsU2l6ZSAtPSBuT2Zmc2V0OworCisgICAgaWYgKCF1VG90YWxTaXplKQorICAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnkgdHlwZSA6ICVkIHdpdGggbm8gdmFsdWUgYXQgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICB1Y1R5cGUsIG5PZmZzZXQpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIHB0ciArPSBuT2Zmc2V0OworICAgIHNzY2FuZihwdHIsIiVsdSAlbiIsICYodVZhbHVlKSwgJm5PZmZzZXQpOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIlBvd2VyIHJlcXVlc3QgcGFyYW1ldGVyICVkIHZhbHVlICVkIG9mZnNldCAlZCIsCisgICAgICAgICAgICAgIHVjVHlwZSwgdVZhbHVlLCBuT2Zmc2V0KTsKKworICAgIHN3aXRjaCAodWNUeXBlKQorICAgIHsKKyAgICAgIGNhc2UgZVNJUl9JR05PUkVfRFRJTToKKyAgICAgIHBvd2VyUmVxdWVzdC51SWdub3JlRFRJTSAgICAgICA9IHVWYWx1ZTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU0lSX0xJU1RFTl9JTlRFUlZBTDoKKyAgICAgIHBvd2VyUmVxdWVzdC51TGlzdGVuSW50ZXJ2YWwgICA9IHVWYWx1ZTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU0lSX01DQVNUX0JDQVNUX0ZJTFRFUjoKKyAgICAgIHBvd2VyUmVxdWVzdC51QmNhc3RNY2FzdEZpbHRlciA9IHVWYWx1ZTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU0lSX0VOQUJMRV9CRVQ6CisgICAgICBwb3dlclJlcXVlc3QudUVuYWJsZUJFVCAgICAgICAgPSB1VmFsdWU7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVNJUl9CRVRfSU5URVJWQUw6CisgICAgICBwb3dlclJlcXVlc3QudUJFVEludGVydmFsICAgICAgPSB1VmFsdWU7CisgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnkgdHlwZSA6ICVkIHdpdGggdmFsdWU6ICVkIGF0IG9mZnNldCAlZCIsCisgICAgICAgICAgICAgICAgdWNUeXBlLCB1VmFsdWUsICBuT2Zmc2V0KTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICB1VG90YWxTaXplIC09IG5PZmZzZXQ7CisgICAgcHRyICs9IG5PZmZzZXQ7CisKKyAgfS8qR28gZm9yIGFzIGxvbmcgYXMgd2UgaGF2ZSBhIHZhbGlkIHN0cmluZyovCisKKyAgLyogcHV0IHRoZSBkZXZpY2UgaW50byBmdWxsIHBvd2VyKi8KKyAgd2xhbl9oZGRfZW50ZXJfYm1wcyhwQWRhcHRlciwgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKTsKKworICAvKiBBcHBseSB0aGUgcG93ZXIgc2F2ZSBwYXJhbXMqLworICBzbWVfU2V0UG93ZXJQYXJhbXMoIFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwgJnBvd2VyUmVxdWVzdCk7CisKKyAgLyogcHV0IHRoZSBkZXZpY2UgYmFjayB0byBwb3dlciBzYXZlKi8KKyAgd2xhbl9oZGRfZW50ZXJfYm1wcyhwQWRhcHRlciwgRFJJVkVSX1BPV0VSX01PREVfQVVUTyk7CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKml3X3NldF9wb3dlcl9wYXJhbXMqLworCisKKy8vIERlZmluZSB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyB0byB0aGUgTGludXggTmV0d29yayBEZXZpY2Ugc3RydWN0dXJlCisvLyBBIG51bWJlciBvZiB0aGVzZSByb3V0aW5lcyBhcmUgTlVMTCAobWVhbmluZyB0aGV5IGFyZSBub3QgaW1wbGVtZW50ZWQuKQorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciAgICAgIHdlX2hhbmRsZXJbXSA9Cit7CisgICAoaXdfaGFuZGxlcikgaXdfc2V0X2NvbW1pdCwgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisgICAoaXdfaGFuZGxlcikgaXdfZ2V0X25hbWUsICAgICAgLyogU0lPQ0dJV05BTUUgKi8KKyAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAqLworICAgKGl3X2hhbmRsZXIpIGl3X3NldF9mcmVxLCAgICAgIC8qIFNJT0NTSVdGUkVRICovCisgICAoaXdfaGFuZGxlcikgaXdfZ2V0X2ZyZXEsICAgICAgLyogU0lPQ0dJV0ZSRVEgKi8KKyAgIChpd19oYW5kbGVyKSBpd19zZXRfbW9kZSwgICAgICAvKiBTSU9DU0lXTU9ERSAqLworICAgKGl3X2hhbmRsZXIpIGl3X2dldF9tb2RlLCAgICAgIC8qIFNJT0NHSVdNT0RFICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgIC8qIFNJT0NTSVdTRU5TICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgLyogU0lPQ1NJV1JBTkdFICovCisgICAoaXdfaGFuZGxlcikgaXdfZ2V0X3JhbmdlLCAgICAgIC8qIFNJT0NHSVdSQU5HRSAqLworICAgKGl3X2hhbmRsZXIpIGl3X3NldF9wcml2LCAgICAgICAvKiBTSU9DU0lXUFJJViAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgIC8qIFNJT0NHSVdQUklWICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgLyogU0lPQ1NJV1NUQVRTICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgLyogU0lPQ0dJV1NUQVRTICovCisgICBpd19oYW5kbGVyX3NldF9zcHksICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgKi8KKyAgIGl3X2hhbmRsZXJfZ2V0X3NweSwgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAqLworICAgaXdfaGFuZGxlcl9zZXRfdGhyc3B5LCAgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KKyAgIGl3X2hhbmRsZXJfZ2V0X3RocnNweSwgICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisgICAoaXdfaGFuZGxlcikgaXdfc2V0X2FwX2FkZHJlc3MsICAgLyogU0lPQ1NJV0FQICovCisgICAoaXdfaGFuZGxlcikgaXdfZ2V0X2FwX2FkZHJlc3MsICAgLyogU0lPQ0dJV0FQICovCisgICAoaXdfaGFuZGxlcikgaXdfc2V0X21sbWUsICAgICAgICAgICAgICAvKiBTSU9DU0lXTUxNRSAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAvKiBTSU9DR0lXQVBMSVNUICovCisgICAoaXdfaGFuZGxlcikgaXdfc2V0X3NjYW4sICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKyAgIChpd19oYW5kbGVyKSBpd19nZXRfc2NhbiwgICAgICAvKiBTSU9DR0lXU0NBTiAqLworICAgKGl3X2hhbmRsZXIpIGl3X3NldF9lc3NpZCwgICAgICAvKiBTSU9DU0lXRVNTSUQgKi8KKyAgIChpd19oYW5kbGVyKSBpd19nZXRfZXNzaWQsICAgICAgLyogU0lPQ0dJV0VTU0lEICovCisgICAoaXdfaGFuZGxlcikgaXdfc2V0X25pY2ssICAgICAgLyogU0lPQ1NJV05JQ0tOICovCisgICAoaXdfaGFuZGxlcikgaXdfZ2V0X25pY2ssICAgICAgLyogU0lPQ0dJV05JQ0tOICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgIChpd19oYW5kbGVyKSBpd19zZXRfYml0cmF0ZSwgICAvKiBTSU9DU0lXUkFURSAqLworICAgKGl3X2hhbmRsZXIpIGl3X2dldF9iaXRyYXRlLCAgIC8qIFNJT0NHSVdSQVRFICovCisgICAoaXdfaGFuZGxlcikgaXdfc2V0X3J0c190aHJlc2hvbGQsLyogU0lPQ1NJV1JUUyAqLworICAgKGl3X2hhbmRsZXIpIGl3X2dldF9ydHNfdGhyZXNob2xkLC8qIFNJT0NHSVdSVFMgKi8KKyAgIChpd19oYW5kbGVyKSBpd19zZXRfZnJhZ190aHJlc2hvbGQsICAgLyogU0lPQ1NJV0ZSQUcgKi8KKyAgIChpd19oYW5kbGVyKSBpd19nZXRfZnJhZ190aHJlc2hvbGQsICAgLyogU0lPQ0dJV0ZSQUcgKi8KKyAgIChpd19oYW5kbGVyKSBpd19zZXRfdHhfcG93ZXIsICAgICAgLyogU0lPQ1NJV1RYUE9XICovCisgICAoaXdfaGFuZGxlcikgaXdfZ2V0X3R4X3Bvd2VyLCAgICAgIC8qIFNJT0NHSVdUWFBPVyAqLworICAgKGl3X2hhbmRsZXIpIGl3X3NldF9yZXRyeSwgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICovCisgICAoaXdfaGFuZGxlcikgaXdfZ2V0X3JldHJ5LCAgICAgICAgICAvKiBTSU9DR0lXUkVUUlkgKi8KKyAgIChpd19oYW5kbGVyKSBpd19zZXRfZW5jb2RlLCAgICAgICAgICAvKiBTSU9DU0lXRU5DT0RFICovCisgICAoaXdfaGFuZGxlcikgaXdfZ2V0X2VuY29kZSwgICAgICAgICAgLyogU0lPQ0dJV0VOQ09ERSAqLworICAgKGl3X2hhbmRsZXIpIGl3X3NldF9wb3dlcl9tb2RlLCAgICAgIC8qIFNJT0NTSVdQT1dFUiAqLworICAgKGl3X2hhbmRsZXIpIGl3X2dldF9wb3dlcl9tb2RlLCAgICAgIC8qIFNJT0NHSVdQT1dFUiAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgKGl3X2hhbmRsZXIpIGl3X3NldF9nZW5pZSwgICAgICAvKiBTSU9DU0lXR0VOSUUgKi8KKyAgIChpd19oYW5kbGVyKSBpd19nZXRfZ2VuaWUsICAgICAgLyogU0lPQ0dJV0dFTklFICovCisgICAoaXdfaGFuZGxlcikgaXdfc2V0X2F1dGgsICAgICAgLyogU0lPQ1NJV0FVVEggKi8KKyAgIChpd19oYW5kbGVyKSBpd19nZXRfYXV0aCwgICAgICAvKiBTSU9DR0lXQVVUSCAqLworICAgKGl3X2hhbmRsZXIpIGl3X3NldF9lbmNvZGVleHQsICAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworICAgKGl3X2hhbmRsZXIpIGl3X2dldF9lbmNvZGVleHQsICAgLyogU0lPQ0dJV0VOQ09ERUVYVCAqLworICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciB3ZV9wcml2YXRlW10gPSB7CisKKyAgIFtXTEFOX1BSSVZfU0VUX0lOVF9HRVRfTk9ORSAgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgID0gaXdfc2V0aW50X2dldG5vbmUsICAvL3NldCBwcml2IGlvY3RsCisgICBbV0xBTl9QUklWX1NFVF9OT05FX0dFVF9JTlQgICAgICAtIFNJT0NJV0ZJUlNUUFJJVl0gICA9IGl3X3NldG5vbmVfZ2V0aW50LCAgLy9nZXQgcHJpdiBpb2N0bAorICAgW1dMQU5fUFJJVl9TRVRfQ0hBUl9HRVRfTk9ORSAgICAgLSBTSU9DSVdGSVJTVFBSSVZdICAgPSBpd19zZXRjaGFyX2dldG5vbmUsIC8vZ2V0IHByaXYgaW9jdGwKKyAgIFtXTEFOX1BSSVZfU0VUX1RIUkVFX0lOVF9HRVRfTk9ORSAtIFNJT0NJV0ZJUlNUUFJJVl0gID0gaXdfc2V0X3RocmVlX2ludHNfZ2V0bm9uZSwKKyAgIFtXTEFOX1BSSVZfR0VUX0NIQVJfU0VUX05PTkUgICAgICAtIFNJT0NJV0ZJUlNUUFJJVl0gID0gaXdfZ2V0X2NoYXJfc2V0bm9uZSwKKyAgIFtXTEFOX1BSSVZfU0VUX05PTkVfR0VUX05PTkUgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgID0gaXdfc2V0bm9uZV9nZXRub25lLCAvL2FjdGlvbiBwcml2IGlvY3RsCisgICBbV0xBTl9QUklWX1NFVF9WQVJfSU5UX0dFVF9OT05FICAtIFNJT0NJV0ZJUlNUUFJJVl0gICA9IGl3X3NldF92YXJfaW50c19nZXRub25lLAorICAgW1dMQU5fUFJJVl9BRERfVFNQRUMgICAgICAgICAgICAgLSBTSU9DSVdGSVJTVFBSSVZdICAgPSBpd19hZGRfdHNwZWMsCisgICBbV0xBTl9QUklWX0RFTF9UU1BFQyAgICAgICAgICAgICAtIFNJT0NJV0ZJUlNUUFJJVl0gICA9IGl3X2RlbF90c3BlYywKKyAgIFtXTEFOX1BSSVZfR0VUX1RTUEVDICAgICAgICAgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgID0gaXdfZ2V0X3RzcGVjLAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgIFtXTEFOX1BSSVZfU0VUX1dBUElfTU9ERSAgICAgICAgICAgICAtIFNJT0NJV0ZJUlNUUFJJVl0gID0gaXdfcWNvbV9zZXRfd2FwaV9tb2RlLAorICAgW1dMQU5fUFJJVl9HRVRfV0FQSV9NT0RFICAgICAgICAgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgPSBpd19xY29tX2dldF93YXBpX21vZGUsCisgICBbV0xBTl9QUklWX1NFVF9XQVBJX0FTU09DX0lORk8gICAgICAgLSBTSU9DSVdGSVJTVFBSSVZdICA9IGl3X3Fjb21fc2V0X3dhcGlfYXNzb2NfaW5mbywKKyAgIFtXTEFOX1BSSVZfU0VUX1dBUElfS0VZICAgICAgICAgICAgICAtIFNJT0NJV0ZJUlNUUFJJVl0gID0gaXdfcWNvbV9zZXRfd2FwaV9rZXksCisgICBbV0xBTl9QUklWX1NFVF9XQVBJX0JLSUQgICAgICAgICAgICAgLSBTSU9DSVdGSVJTVFBSSVZdICA9IGl3X3Fjb21fc2V0X3dhcGlfYmtpZCwKKyAgIFtXTEFOX1BSSVZfR0VUX1dBUElfQktJRCAgICAgICAgICAgICAtIFNJT0NJV0ZJUlNUUFJJVl0gID0gaXdfcWNvbV9nZXRfd2FwaV9ia2lkLAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgIFtXTEFOX1BSSVZfU0VUX0ZUSUVTICAgICAgICAgICAgICAgICAtIFNJT0NJV0ZJUlNUUFJJVl0gICA9IGl3X3NldF9mdGllcywKKyNlbmRpZgorICAgW1dMQU5fUFJJVl9TRVRfSE9TVF9PRkZMT0FEICAgICAgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgID0gaXdfc2V0X2hvc3Rfb2ZmbG9hZCwKKyAgIFtXTEFOX0dFVF9XTEFOX1NUQVRJU1RJQ1MgICAgICAgICAgICAtIFNJT0NJV0ZJUlNUUFJJVl0gICA9IGl3X2dldF9zdGF0aXN0aWNzLAorICAgW1dMQU5fU0VUX0tFRVBBTElWRV9QQVJBTVMgICAgICAgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgID0gaXdfc2V0X2tlZXBhbGl2ZV9wYXJhbXMKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworICAgLAorICAgW1dMQU5fU0VUX1BBQ0tFVF9GSUxURVJfUEFSQU1TICAgICAgIC0gU0lPQ0lXRklSU1RQUklWXSAgID0gaXdfc2V0X3BhY2tldF9maWx0ZXJfcGFyYW1zCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKyAgICwKKyAgIFtXTEFOX1NFVF9QTk8gICAgICAgICAgICAgICAgICAgICAgICAtIFNJT0NJV0ZJUlNUUFJJVl0gICA9IGl3X3NldF9wbm9fcHJpdgorI2VuZGlmCisgICAsCisgICBbV0xBTl9TRVRfQkFORF9DT05GSUcgICAgICAgICAgICAgICAgLSBTSU9DSVdGSVJTVFBSSVZdICAgPSBpd19zZXRfYmFuZF9jb25maWcsCisgICBbV0xBTl9QUklWX1NFVF9NQ0JDX0ZJTFRFUiAgICAgICAgICAgLSBTSU9DSVdGSVJTVFBSSVZdICAgPSBpd19zZXRfZHluYW1pY19tY2JjX2ZpbHRlciwKKyAgIFtXTEFOX1BSSVZfQ0xFQVJfTUNCQ19GSUxURVIgICAgICAgICAtIFNJT0NJV0ZJUlNUUFJJVl0gICA9IGl3X2NsZWFyX2R5bmFtaWNfbWNiY19maWx0ZXIsCisgICBbV0xBTl9TRVRfUE9XRVJfUEFSQU1TICAgICAgICAgICAgICAgLSBTSU9DSVdGSVJTVFBSSVZdICAgPSBpd19zZXRfcG93ZXJfcGFyYW1zX3ByaXYsCisgICBbV0xBTl9HRVRfTElOS19TUEVFRCAgICAgICAgICAgICAgICAgLSBTSU9DSVdGSVJTVFBSSVZdICAgPSBpd19nZXRfbGlua3NwZWVkCit9OworCisvKk1heGltdW0gY29tbWFuZCBsZW5ndGggY2FuIGJlIG9ubHkgMTUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHdlX3ByaXZhdGVfYXJnc1tdID0geworCisgICAgLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKyAgICB7ICAgV0xBTl9QUklWX1NFVF9JTlRfR0VUX05PTkUsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAwLAorICAgICAgICAiIiB9LAorCisgICAgLyogaGFuZGxlcnMgZm9yIHN1Yi1pb2N0bCAqLworICAgIHsgICBXRV9TRVRfMTFEX1NUQVRFLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgMCwKKyAgICAgICAgInNldDExRHN0YXRlIiB9LAorCisgICAgeyAgIFdFX1dPV0wsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAwLAorICAgICAgICAid293bCIgfSwKKworICAgIHsgICBXRV9TRVRfUE9XRVIsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAwLAorICAgICAgICAic2V0UG93ZXIiIH0sCisKKyAgICB7ICAgV0VfU0VUX01BWF9BU1NPQywKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgIDAsCisgICAgICAgICJzZXRNYXhBc3NvYyIgfSwKKworICAgIHsgICBXRV9TRVRfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT04sCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAwLAorICAgICAgICAic2V0QXV0b0NoYW5uZWwiIH0sCisKKyAgICB7ICAgV0VfU0VUX0RBVEFfSU5BQ1RJVklUWV9UTywKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgIDAsCisgICAgICAgICJpbmFjdGl2aXR5VE8iIH0sCisKKyAgICB7ICAgV0VfU0VUX01BWF9UWF9QT1dFUiwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgIDAsCisgICAgICAgICJzZXRNYXhUeFBvd2VyIiB9LAorICAgIC8qIHNldCBIaWdoZXIgRFRJTSBUcmFuc2l0aW9uIChEVElNMSB0byBEVElNMykKKyAgICAgKiAxID0gZW5hYmxlIGFuZCAwID0gZGlzYWJsZSAqLworICAgIHsKKyAgICAgICAgV0VfU0VUX0hJR0hFUl9EVElNX1RSQU5TSVRJT04sCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAwLAorICAgICAgICAic2V0SER0aW1UcmFuc24iIH0sCisKKyAgICB7ICAgV0VfU0VUX1RNX0xFVkVMLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgMCwgCisgICAgICAgICJzZXRUbUxldmVsIiB9LAorCisgICAgLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKyAgICB7ICAgV0xBTl9QUklWX1NFVF9OT05FX0dFVF9JTlQsCisgICAgICAgIDAsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAiIiB9LAorCisgICAgLyogaGFuZGxlcnMgZm9yIHN1Yi1pb2N0bCAqLworICAgIHsgICBXRV9HRVRfMTFEX1NUQVRFLAorICAgICAgICAwLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgImdldDExRHN0YXRlIiB9LAorCisgICAgeyAgIFdFX0lCU1NfU1RBVFVTLAorICAgICAgICAwLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgImdldEFkaG9jU3RhdHVzIiB9LAorCisgICAgeyAgIFdFX1BNQ19TVEFURSwKKyAgICAgICAgMCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgICJwbWNTdGF0ZSIgfSwKKworICAgIHsgICBXRV9HRVRfV0xBTl9EQkcsCisgICAgICAgIDAsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAiZ2V0d2xhbmRiZyIgfSwKKworICAgIHsgICBXRV9NT0RVTEVfRE9XTl9JTkQsCisgICAgICAgIDAsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAibW9kdWxlRG93bkluZCIgfSwKKworICAgIHsgICBXRV9HRVRfTUFYX0FTU09DLAorICAgICAgICAwLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgImdldE1heEFzc29jIiB9LAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgeyAgIFdFX0dFVF9XRElfREJHLAorICAgICAgICAwLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgImdldHdkaWRiZyIgfSwKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKworICAgIHsgICBXRV9HRVRfU0FQX0FVVE9fQ0hBTk5FTF9TRUxFQ1RJT04sCisgICAgICAgIDAsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAiZ2V0QXV0b0NoYW5uZWwiIH0sCisKKyAgICB7ICAgV0VfR0VUX0NPTkNVUlJFTkNZX01PREUsCisgICAgICAgIDAsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAiZ2V0Y29uY3VycmVuY3kiIH0sCisKKyAgICAvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCAqLworICAgIHsgICBXTEFOX1BSSVZfU0VUX0NIQVJfR0VUX05PTkUsCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSfCA1MTIsCisgICAgICAgIDAsCisgICAgICAgICIiIH0sCisKKyAgICAvKiBoYW5kbGVycyBmb3Igc3ViLWlvY3RsICovCisgICAgeyAgIFdFX1dPV0xfQUREX1BUUk4sCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSfCA1MTIsCisgICAgICAgIDAsCisgICAgICAgICJ3b3dsQWRkUHRybiIgfSwKKworICAgIHsgICBXRV9XT1dMX0RFTF9QVFJOLAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUnwgNTEyLAorICAgICAgICAwLAorICAgICAgICAid293bERlbFB0cm4iIH0sCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAvKiBoYW5kbGVycyBmb3Igc3ViLWlvY3RsICovCisgICAgeyAgIFdFX05FSUdIQk9SX1JFUE9SVF9SRVFVRVNULAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUiB8IDUxMiwKKyAgICAgICAgMCwKKyAgICAgICAgIm5laWdoYm9yIiB9LAorI2VuZGlmCisgICAgeyAgIFdFX1NFVF9BUF9XUFNfSUUsCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSfCA1MTIsCisgICAgICAgIDAsCisgICAgICAgICJzZXRfYXBfd3BzX2llIiB9LAorCisgICAgeyAgIFdFX1NFVF9DT05GSUcsCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSfCA1MTIsCisgICAgICAgIDAsCisgICAgICAgICJzZXRDb25maWciIH0sCisKKyAgICAvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCAqLworICAgIHsgICBXTEFOX1BSSVZfU0VUX1RIUkVFX0lOVF9HRVRfTk9ORSwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDMsCisgICAgICAgIDAsCisgICAgICAgICIiIH0sCisKKyAgICAvKiBoYW5kbGVycyBmb3Igc3ViLWlvY3RsICovCisgICAgeyAgIFdFX1NFVF9XTEFOX0RCRywKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDMsCisgICAgICAgIDAsCisgICAgICAgICJzZXR3bGFuZGJnIiB9LAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgeyAgIFdFX1NFVF9XRElfREJHLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMywKKyAgICAgICAgMCwKKyAgICAgICAgInNldHdkaWRiZyIgfSwKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKworICAgIHsgICBXRV9TRVRfU0FQX0NIQU5ORUxTLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMywKKyAgICAgICAgMCwKKyAgICAgICAgInNldHNhcGNoYW5uZWxzIiB9LAorCisgICAgLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKyAgICB7ICAgV0xBTl9QUklWX0dFVF9DSEFSX1NFVF9OT05FLAorICAgICAgICAwLAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUnwgV0VfTUFYX1NUUl9MRU4sCisgICAgICAgICIiIH0sCisKKyAgICAvKiBoYW5kbGVycyBmb3Igc3ViLWlvY3RsICovCisgICAgeyAgIFdFX1dMQU5fVkVSU0lPTiwKKyAgICAgICAgMCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0NIQVJ8IFdFX01BWF9TVFJfTEVOLAorICAgICAgICAidmVyc2lvbiIgfSwKKyAgICB7ICAgV0VfR0VUX1NUQVRTLAorICAgICAgICAwLAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUnwgV0VfTUFYX1NUUl9MRU4sCisgICAgICAgICJnZXRTdGF0cyIgfSwKKyAgICB7ICAgV0VfR0VUX0NGRywKKyAgICAgICAgMCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0NIQVJ8IFdFX01BWF9TVFJfTEVOLAorICAgICAgICAiZ2V0Q29uZmlnIiB9LAorICAgIHsgICBXRV9HRVRfV01NX1NUQVRVUywKKyAgICAgICAgMCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0NIQVJ8IFdFX01BWF9TVFJfTEVOLAorICAgICAgICAiZ2V0V21tU3RhdHVzIiB9LAorICAgIHsKKyAgICAgICAgV0VfR0VUX0NIQU5ORUxfTElTVCwKKyAgICAgICAgMCwgCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSfCBXRV9NQVhfU1RSX0xFTiwKKyAgICAgICAgImdldENoYW5uZWxMaXN0IiB9LAorCisgICAgLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgKi8KKyAgICB7ICAgV0xBTl9QUklWX1NFVF9OT05FX0dFVF9OT05FLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAiIiB9LAorCisgICAgLyogaGFuZGxlcnMgZm9yIHN1Yi1pb2N0bCAqLworICAgIHsgICBXRV9DTEVBUl9TVEFUUywKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgImNsZWFyU3RhdHMiIH0sCisgICAgeyAgIFdFX0lOSVRfQVAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgICJpbml0QVAiIH0sCisgICAgeyAgIFdFX1NUT1BfQVAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgICJleGl0QVAiIH0sCisgICAgeyAgIFdFX0VOQUJMRV9BTVAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgICJlbmFibGVBTVAiIH0sCisgICAgeyAgIFdFX0RJU0FCTEVfQU1QLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAiZGlzYWJsZUFNUCIgfSwKKworICAgIC8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisgICAgeyAgIFdMQU5fUFJJVl9TRVRfVkFSX0lOVF9HRVRfTk9ORSwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IE1BWF9WQVJfQVJHUywKKyAgICAgICAgMCwKKyAgICAgICAgIiIgfSwKKworICAgIC8qIGhhbmRsZXJzIGZvciBzdWItaW9jdGwgKi8KKyAgICB7ICAgV0VfTE9HX0RVTVBfQ01ELAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgTUFYX1ZBUl9BUkdTLAorICAgICAgICAwLAorICAgICAgICAiZHVtcCIgfSwKKworICAgIC8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisgICAgeyAgIFdMQU5fUFJJVl9BRERfVFNQRUMsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCBIRERfV0xBTl9XTU1fUEFSQU1fQ09VTlQsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICAiYWRkVHNwZWMiIH0sCisKKyAgICAvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCAqLworICAgIHsgICBXTEFOX1BSSVZfREVMX1RTUEVDLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgICJkZWxUc3BlYyIgfSwKKworICAgIC8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsICovCisgICAgeyAgIFdMQU5fUFJJVl9HRVRfVFNQRUMsCisgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgImdldFRzcGVjIiB9LAorCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgU0VUX1dBUElfTU9ERSAqLworICAgIHsgICBXTEFOX1BSSVZfU0VUX1dBUElfTU9ERSwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisgICAgICAgIDAsCisgICAgICAgICJTRVRfV0FQSV9NT0RFIiB9LAorCisgICAvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCBHRVRfV0FQSV9NT0RFICovCisgICAgeyAgIFdMQU5fUFJJVl9HRVRfV0FQSV9NT0RFLAorICAgICAgICAwLAorICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKyAgICAgICAgIkdFVF9XQVBJX01PREUiIH0sCisKKyAgIC8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsIFNFVF9BU1NPQ19JTkZPICovCisgICAgeyAgIFdMQU5fUFJJVl9TRVRfV0FQSV9BU1NPQ19JTkZPLAorICAgICAgICBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDQwMCwKKyAgICAgICAgMCwKKyAgICAgICAgIlNFVF9XQVBJX0FTU09DIiB9LAorCisgICAvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCBTRVRfV0FQSV9LRVkgKi8KKyAgICB7ICAgV0xBTl9QUklWX1NFVF9XQVBJX0tFWSwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCA3MSwKKyAgICAgICAgMCwKKyAgICAgICAgIlNFVF9XQVBJX0tFWSIgfSwKKworICAgLyogaGFuZGxlcnMgZm9yIG1haW4gaW9jdGwgU0VUX1dBUElfQktJRCAqLworICAgIHsgICBXTEFOX1BSSVZfU0VUX1dBUElfQktJRCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyNCwKKyAgICAgICAgMCwKKyAgICAgICAgIlNFVF9XQVBJX0JLSUQiIH0sCisKKyAgIC8qIGhhbmRsZXJzIGZvciBtYWluIGlvY3RsIEdFVF9XQVBJX0JLSUQgKi8KKyAgICB7ICAgV0xBTl9QUklWX0dFVF9XQVBJX0JLSUQsCisgICAgICAgIDAsCisgICAgICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMjQsCisgICAgICAgICJHRVRfV0FQSV9CS0lEIiB9LAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyAgICAvKiBoYW5kbGVycyBmb3IgbWFpbiBpb2N0bCAtIGhvc3Qgb2ZmbG9hZCAqLworICAgIHsKKyAgICAgICAgV0xBTl9QUklWX1NFVF9IT1NUX09GRkxPQUQsCisgICAgICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgc2l6ZW9mKHRIb3N0T2ZmbG9hZFJlcXVlc3QpLAorICAgICAgICAwLAorICAgICAgICAic2V0SG9zdE9mZmxvYWQiIH0sCisKKyAgICB7CisgICAgICAgIFdMQU5fR0VUX1dMQU5fU1RBVElTVElDUywKKyAgICAgICAgMCwKKyAgICAgICAgSVdfUFJJVl9UWVBFX0JZVEUgfCBXRV9NQVhfU1RSX0xFTiwKKyAgICAgICAgImdldFdsYW5TdGF0cyIgfSwKKworICAgIHsKKyAgICAgICAgV0xBTl9TRVRfS0VFUEFMSVZFX1BBUkFNUywKKyAgICAgICAgSVdfUFJJVl9UWVBFX0JZVEUgIHwgc2l6ZW9mKHRLZWVwQWxpdmVSZXF1ZXN0KSwKKyAgICAgICAgMCwKKyAgICAgICAgInNldEtlZXBBbGl2ZSIgfSwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworICAgIHsKKyAgICAgICAgV0xBTl9TRVRfUEFDS0VUX0ZJTFRFUl9QQVJBTVMsCisgICAgICAgIElXX1BSSVZfVFlQRV9CWVRFICB8IHNpemVvZih0UGFja2V0RmlsdGVyQ2ZnKSwKKyAgICAgICAgMCwKKyAgICAgICAgInNldFBrdEZpbHRlciIgfSwKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworICAgIHsKKyAgICAgICAgV0xBTl9TRVRfUE5PLAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUnwgV0VfTUFYX1NUUl9MRU4sCisgICAgICAgIDAsCisgICAgICAgICJzZXRwbm8iIH0sCisjZW5kaWYKKyAgICB7CisgICAgICAgIFdMQU5fU0VUX0JBTkRfQ09ORklHLAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUnwgV0VfTUFYX1NUUl9MRU4sCisgICAgICAgIDAsCisgICAgICAgICJTRVRCQU5EIiB9LAorICAgIC8qIGhhbmRsZXJzIGZvciBkeW5hbWljIE1DIEJDIGlvY3RsICovCisgICAgeworICAgICAgICBXTEFOX1BSSVZfU0VUX01DQkNfRklMVEVSLAorICAgICAgICBJV19QUklWX1RZUEVfQllURSB8IHNpemVvZih0TWNCY0ZpbHRlckNmZyksCisgICAgICAgIDAsCisgICAgICAgICJzZXRNQ0JDRmlsdGVyIiB9LAorICAgIHsKKyAgICAgICAgV0xBTl9QUklWX0NMRUFSX01DQkNfRklMVEVSLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAiY2xlYXJNQ0JDRmlsdGVyIiB9LAorICAgIHsKKyAgICAgICAgV0xBTl9TRVRfUE9XRVJfUEFSQU1TLAorICAgICAgICBJV19QUklWX1RZUEVfQ0hBUnwgV0VfTUFYX1NUUl9MRU4sCisgICAgICAgIDAsCisgICAgICAgICJzZXRwb3dlcnBhcmFtcyIgfSwKKyAgICB7CisgICAgICAgIFdMQU5fR0VUX0xJTktfU1BFRUQsCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTgsCisgICAgICAgIElXX1BSSVZfVFlQRV9DSEFSIHwgMywgImdldExpbmtTcGVlZCIgfSwKK307CisKKworCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgd2VfaGFuZGxlcl9kZWYgPSB7CisgICAubnVtX3N0YW5kYXJkICAgICA9IHNpemVvZih3ZV9oYW5kbGVyKSAvIHNpemVvZih3ZV9oYW5kbGVyWzBdKSwKKyAgIC5udW1fcHJpdmF0ZSAgICAgID0gc2l6ZW9mKHdlX3ByaXZhdGUpIC8gc2l6ZW9mKHdlX3ByaXZhdGVbMF0pLAorICAgLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2Yod2VfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZih3ZV9wcml2YXRlX2FyZ3NbMF0pLAorCisgICAuc3RhbmRhcmQgICAgICAgICA9IChpd19oYW5kbGVyICopd2VfaGFuZGxlciwKKyAgIC5wcml2YXRlICAgICAgICAgID0gKGl3X2hhbmRsZXIgKil3ZV9wcml2YXRlLAorICAgLnByaXZhdGVfYXJncyAgICAgPSB3ZV9wcml2YXRlX2FyZ3MsCisgICAuZ2V0X3dpcmVsZXNzX3N0YXRzID0gZ2V0X3dpcmVsZXNzX3N0YXRzLAorfTsKKworaW50IGhkZF9zZXRfd2V4dChoZGRfYWRhcHRlcl90ICpwQWRhcHRlcikKK3sKKyAgICBoZGRfd2V4dF9zdGF0ZV90ICpwd2V4dEJ1ZjsKKyAgICBoZGRfc3RhdGlvbl9jdHhfdCAqcEhkZFN0YUN0eCA9IFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpOworCisgICAgcHdleHRCdWYgPSBXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpOworCisgICAgLy8gTm93IGNvbmZpZ3VyZSB0aGUgcm9hbWluZyBwcm9maWxlIGxpbmtzLiBUbyBTU0lEIGFuZCBic3NpZC4KKyAgICBwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUuU1NJRHMubnVtT2ZTU0lEcyA9IDA7CisgICAgcHdleHRCdWYtPnJvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0ID0gJnBIZGRTdGFDdHgtPmNvbm5faW5mby5TU0lEOworCisgICAgcHdleHRCdWYtPnJvYW1Qcm9maWxlLkJTU0lEcy5udW1PZkJTU0lEcyA9IDA7CisgICAgcHdleHRCdWYtPnJvYW1Qcm9maWxlLkJTU0lEcy5ic3NpZCA9ICZwSGRkU3RhQ3R4LT5jb25uX2luZm8uYnNzSWQ7CisKKyAgICAvKlNldCB0aGUgbnVtT2ZDaGFubmVscyB0byB6ZXJvIHRvIHNjYW4gYWxsIHRoZSBjaGFubmVscyovCisgICAgcHdleHRCdWYtPnJvYW1Qcm9maWxlLkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworICAgIHB3ZXh0QnVmLT5yb2FtUHJvZmlsZS5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisKKyAgICAvKiBEZWZhdWx0IGlzIG5vIGVuY3J5cHRpb24gKi8KKyAgICBwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgcHdleHRCdWYtPnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKworICAgIHB3ZXh0QnVmLT5yb2FtUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworICAgIHB3ZXh0QnVmLT5yb2FtUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKworICAgIHB3ZXh0QnVmLT5yb2FtUHJvZmlsZS5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRTsKKworICAgIC8qIERlZmF1bHQgaXMgbm8gYXV0aGVudGljYXRpb24gKi8KKyAgICBwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUuQXV0aFR5cGUubnVtRW50cmllcyA9IDE7CisgICAgcHdleHRCdWYtPnJvYW1Qcm9maWxlLkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07CisKKyAgICBwd2V4dEJ1Zi0+cm9hbVByb2ZpbGUucGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV9UQVVSVVM7CisgICAgcHdleHRCdWYtPndwYVZlcnNpb24gPSBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEOworCisgICAgLypTZXQgdGhlIGRlZmF1bHQgc2NhbiBtb2RlKi8KKyAgICBwQWRhcHRlci0+c2Nhbl9pbmZvLnNjYW5fbW9kZSA9IGVTSVJfQUNUSVZFX1NDQU47CisKKyAgICBoZGRfY2xlYXJSb2FtUHJvZmlsZUllKHBBZGFwdGVyKTsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICB9CisKK2ludCBoZGRfcmVnaXN0ZXJfd2V4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorICAgIHsKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlciA9IFdMQU5fSEREX0dFVF9QUklWX1BUUihkZXYpOworICAgIGhkZF93ZXh0X3N0YXRlX3QgKnB3ZXh0QnVmID0gV0xBTl9IRERfR0VUX1dFWFRfU1RBVEVfUFRSKHBBZGFwdGVyKTsKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgRU5URVIoKTsKKworICAgIC8vIFplcm8gdGhlIG1lbW9yeS4gIFRoaXMgemVyb3MgdGhlIHByb2ZpbGUgc3RydWN0dXJlLgorICAgbWVtc2V0KHB3ZXh0QnVmLCAwLHNpemVvZihoZGRfd2V4dF9zdGF0ZV90KSk7CisKKyAgICBpbml0X2NvbXBsZXRpb24oJihXTEFOX0hERF9HRVRfV0VYVF9TVEFURV9QVFIocEFkYXB0ZXIpKS0+Y29tcGxldGlvbl92YXIpOworCisKKyAgICBzdGF0dXMgPSBoZGRfc2V0X3dleHQocEFkYXB0ZXIpOworCisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICgiRVJST1I6IGhkZF9zZXRfd2V4dCBmYWlsZWQhIVxuIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfZXZlbnRfaW5pdCgmcHdleHRCdWYtPnZvc2V2ZW50KSkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgKCJFUlJPUjogSEREIHZvcyBldmVudCBpbml0IGZhaWxlZCEhXG4iKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19ldmVudF9pbml0KCZwd2V4dEJ1Zi0+c2NhbmV2ZW50KSkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgKCJFUlJPUjogSEREIHNjYW4gZXZlbnQgaW5pdCBmYWlsZWQhIVxuIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBSZWdpc3RlciBhcyBhIHdpcmVsZXNzIGRldmljZQorICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJndlX2hhbmRsZXJfZGVmOworCisgICAgRVhJVCgpOworICAgIHJldHVybiAwOworfQorCitpbnQgaGRkX1VucmVnaXN0ZXJXZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWYgMAorICAgaGRkX3dleHRfc3RhdGVfdCAqd2V4dEJ1ZjsKKyAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyID0gV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisKKyAgIEVOVEVSKCk7CisgICAvLyBTZXQgdXAgdGhlIHBvaW50ZXIgdG8gdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgc3RhdGUgc3RydWN0dXJlCisgICB3ZXh0QnVmID0gcEFkYXB0ZXItPnBXZXh0U3RhdGU7CisKKyAgIC8vIERlLWFsbG9jYXRlIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zIHN0YXRlIHN0cnVjdHVyZQorICAga2ZyZWUod2V4dEJ1Zik7CisKKyAgIC8vIENsZWFyIG91dCB0aGUgcG9pbnRlciB0byB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyBzdGF0ZSBzdHJ1Y3R1cmUKKyAgIHBBZGFwdGVyLT5wV2V4dFN0YXRlID0gTlVMTDsKKworICAgRVhJVCgpOworI2VuZGlmCisgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gTlVMTDsKKyAgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL0NPUkUvSEREL3NyYy93bGFuX2hkZF93bW0uYyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF93bW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGRhMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX3dtbS5jCkBAIC0wLDAgKzEsMjUwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAZmlsZSB3bGFuX2hkZF93bW0uYworCisgIFRoaXMgbW9kdWxlICh3bGFuX2hkZF93bW0uaCBpbnRlcmZhY2UgKyB3bGFuX2hkZF93bW0uYyBpbXBsZW1lbnRhdGlvbikKKyAgaG91c2VzIGFsbCB0aGUgbG9naWMgZm9yIFdNTSBpbiBIREQuCisKKyAgT24gdGhlIGNvbnRyb2wgcGF0aCwgaXQgaGFzIHRoZSBsb2dpYyB0byBzZXR1cCBRb1MsIG1vZGlmeSBRb1MgYW5kIGRlbGV0ZQorICBRb1MgKFFvUyBoZXJlIHJlZmVycyB0byBhIFRTUEVDKS4gVGhlIHNldHVwIFFvUyBjb21lcyBpbiB0d28gZmxhdm9yczogYW4KKyAgZXhwbGljaXQgYXBwbGljYXRpb24gaW52b2tlZCBhbmQgYW4gaW50ZXJuYWwgSEREIGludm9rZWQuICBUaGUgaW1wbGljaXQgUW9TCisgIGlzIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyBOT1QgY2FsbCB0aGUgY3VzdG9tIFFDVCBXTEFOIE9JRHMgZm9yIFFvUyBidXQKKyAgd2hpY2ggRE8gbWFyayB0aGVpciB0cmFmZmljIGZvciBwcmlvcnRpemF0aW9uLiBJdCBhbHNvIGhhcyBsb2dpYyB0byBzdGFydCwKKyAgdXBkYXRlIGFuZCBzdG9wIHRoZSBVLUFQU0QgdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uLiBJdCBhbHNvIGhhcyBsb2dpYyB0bworICByZWFkIFdNTSByZWxhdGVkIGNvbmZpZyBwYXJhbWV0ZXJzIGZyb20gdGhlIHJlZ2lzdHJ5LgorCisgIE9uIHRoZSBkYXRhIHBhdGgsIGl0IGhhcyB0aGUgbG9naWMgdG8gZmlndXJlIG91dCB0aGUgV01NIEFDIG9mIGFuIGVncmVzcworICBwYWNrZXQgYW5kIHdoZW4gdG8gc2lnbmFsIFRMIHRvIHNlcnZlIGEgcGFydGljdWxhciBBQyBxdWV1ZS4gSXQgYWxzbyBoYXMgdGhlCisgIGxvZ2ljIHRvIHJldHJpZXZlIGEgcGFja2V0IGJhc2VkIG9uIFdNTSBwcmlvcml0eSBpbiByZXNwb25zZSB0byBhIGZldGNoIGZyb20KKyAgVEwuCisKKyAgVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgYXJlIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBpbmZvcm1hdGlvbiBoaWRpbmcuCisKKworICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4LTkgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgICAgICAgICAgICAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIGZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHdsYW5faGRkX3R4X3J4Lmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfZHBfdXRpbHMuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF93bW0uaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfaG9zdGFwZC5oPgorI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgPHdsYW5faGRkX3NvZnRhcF90eF9yeC5oPgorI2VuZGlmCisKKy8vIGNoYW5nZSBsb2dnaW5nIGJlaGF2aW9yIGJhc2VkIHVwb24gZGVidWcgZmxhZworI2lmZGVmIEhERF9XTU1fREVCVUcKKyNkZWZpbmUgV01NX1RSQUNFX0xFVkVMX0ZBVEFMICAgICAgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMCisjZGVmaW5lIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiAgICAgIFZPU19UUkFDRV9MRVZFTF9GQVRBTAorI2RlZmluZSBXTU1fVFJBQ0VfTEVWRUxfV0FSTiAgICAgICBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwKKyNkZWZpbmUgV01NX1RSQUNFX0xFVkVMX0lORk8gICAgICAgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMCisjZGVmaW5lIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0hJR0ggIFZPU19UUkFDRV9MRVZFTF9GQVRBTAorI2RlZmluZSBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1cgICBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwKKyNlbHNlCisjZGVmaW5lIFdNTV9UUkFDRV9MRVZFTF9GQVRBTCAgICAgIFZPU19UUkFDRV9MRVZFTF9GQVRBTAorI2RlZmluZSBXTU1fVFJBQ0VfTEVWRUxfRVJST1IgICAgICBWT1NfVFJBQ0VfTEVWRUxfRVJST1IKKyNkZWZpbmUgV01NX1RSQUNFX0xFVkVMX1dBUk4gICAgICAgVk9TX1RSQUNFX0xFVkVMX1dBUk4KKyNkZWZpbmUgV01NX1RSQUNFX0xFVkVMX0lORk8gICAgICAgVk9TX1RSQUNFX0xFVkVMX0lORk8KKyNkZWZpbmUgV01NX1RSQUNFX0xFVkVMX0lORk9fSElHSCAgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSAorI2RlZmluZSBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1cgICBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1cKKyNlbmRpZgorCisKKy8vIFVBUFNEIE1hc2sgYml0cworLy8gKEJpdDA6Vk87IEJpdDE6Vkk7IEJpdDI6Qks7IEJpdDM6QkUgYWxsIG90aGVyIGJpdHMgYXJlIGlnbm9yZWQpCisjZGVmaW5lIEhERF9BQ19WTyAweDEKKyNkZWZpbmUgSEREX0FDX1ZJIDB4MgorI2RlZmluZSBIRERfQUNfQksgMHg0CisjZGVmaW5lIEhERF9BQ19CRSAweDgKKworI2RlZmluZSBXTEFOX0hERF9NQVhfRFNDUCAweDNmCisKK3N0YXRpYyBzbWVfUW9zV21tVXBUeXBlIGhkZFdtbURzY3BUb1VwTWFwW1dMQU5fSEREX01BWF9EU0NQKzFdOworCitjb25zdCB2X1U4X3QgaGRkV21tVXBUb0FjTWFwW10gPSB7CisgICBXTEFOVExfQUNfQkUsCisgICBXTEFOVExfQUNfQkssCisgICBXTEFOVExfQUNfQkssCisgICBXTEFOVExfQUNfQkUsCisgICBXTEFOVExfQUNfVkksCisgICBXTEFOVExfQUNfVkksCisgICBXTEFOVExfQUNfVk8sCisgICBXTEFOVExfQUNfVk8KK307CisKKy8vTGludXggYmFzZWQgVVAgLT4gQUMgTWFwcGluZworY29uc3Qgdl9VOF90IGhkZExpbnV4VXBUb0FjTWFwWzhdID0geworICAgSEREX0xJTlVYX0FDX0JFLAorICAgSEREX0xJTlVYX0FDX0JLLAorICAgSEREX0xJTlVYX0FDX0JLLAorICAgSEREX0xJTlVYX0FDX0JFLAorICAgSEREX0xJTlVYX0FDX1ZJLAorICAgSEREX0xJTlVYX0FDX1ZJLAorICAgSEREX0xJTlVYX0FDX1ZPLAorICAgSEREX0xJTlVYX0FDX1ZPCit9OworCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorLyoqCisgIEBicmllZiBoZGRfd21tX2VuYWJsZV90bF91YXBzZCgpIC0gZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFuZAorICBob3cgdG8gdXBkYXRlIFVBUFNEIHBhcmFtZXRlcnMgaW4gVEwKKworICBAcGFyYW0gcFFvc0NvbnRleHQgOiBbaW5dIHRoZSBwb2ludGVyIHRoZSBRb1MgaW5zdGFuY2UgY29udHJvbCBibG9jaworCisgIEByZXR1cm4KKyAgTm9uZQorKi8KK3N0YXRpYyB2b2lkIGhkZF93bW1fZW5hYmxlX3RsX3VhcHNkIChoZGRfd21tX3Fvc19jb250ZXh0X3QqIHBRb3NDb250ZXh0KQoreworICAgaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIgPSBwUW9zQ29udGV4dC0+cEFkYXB0ZXI7CisgICBXTEFOVExfQUNFbnVtVHlwZSBhY1R5cGUgPSBwUW9zQ29udGV4dC0+YWNUeXBlOworICAgaGRkX3dtbV9hY19zdGF0dXNfdCAqcEFjID0gJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNUeXBlXTsKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgdl9VMzJfdCBzZXJ2aWNlX2ludGVydmFsOworICAgdl9VMzJfdCBzdXNwZW5zaW9uX2ludGVydmFsOworICAgc21lX1Fvc1dtbURpclR5cGUgZGlyZWN0aW9uOworCisKKyAgIC8vIFRoZSBUU1BFQyBtdXN0IGJlIHZhbGlkCisgICBpZiAocEFjLT53bW1BY1RzcGVjVmFsaWQgPT0gVk9TX0ZBTFNFKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBJbnZva2VkIHdpdGggaW52YWxpZCBUU1BFQyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLy8gZGV0ZXJtaW5lIHRoZSBzZXJ2aWNlIGludGVydmFsCisgICBpZiAocEFjLT53bW1BY1RzcGVjSW5mby5taW5fc2VydmljZV9pbnRlcnZhbCkKKyAgIHsKKyAgICAgIHNlcnZpY2VfaW50ZXJ2YWwgPSBwQWMtPndtbUFjVHNwZWNJbmZvLm1pbl9zZXJ2aWNlX2ludGVydmFsOworICAgfQorICAgZWxzZSBpZiAocEFjLT53bW1BY1RzcGVjSW5mby5tYXhfc2VydmljZV9pbnRlcnZhbCkKKyAgIHsKKyAgICAgIHNlcnZpY2VfaW50ZXJ2YWwgPSBwQWMtPndtbUFjVHNwZWNJbmZvLm1heF9zZXJ2aWNlX2ludGVydmFsOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy8gbm8gc2VydmljZSBpbnRlcnZhbCBpcyBwcmVzZW50IGluIHRoZSBUU1BFQworICAgICAgLy8gdGhpcyBpcyBPSywgdGhlcmUganVzdCB3b24ndCBiZSBVLUFQU0QKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgIiVzOiBObyBzZXJ2aWNlIGludGVydmFsIHN1cHBsaWVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvLyBkZXRlcm1pbmUgdGhlIHN1c3BlbnNpb24gaW50ZXJ2YWwgJiBkaXJlY3Rpb24KKyAgIHN1c3BlbnNpb25faW50ZXJ2YWwgPSBwQWMtPndtbUFjVHNwZWNJbmZvLnN1c3BlbnNpb25faW50ZXJ2YWw7CisgICBkaXJlY3Rpb24gPSBwQWMtPndtbUFjVHNwZWNJbmZvLnRzX2luZm8uZGlyZWN0aW9uOworCisgICAvLyBpZiB3ZSBoYXZlIHByZXZpb3VzbHkgZW5hYmxlZCBVLUFQU0QsIGhhdmUgYW55IHBhcmFtcyBjaGFuZ2VkPworICAgaWYgKChwQWMtPndtbUFjVWFwc2RJbmZvVmFsaWQpICYmCisgICAgICAgKHBBYy0+d21tQWNVYXBzZFNlcnZpY2VJbnRlcnZhbCA9PSBzZXJ2aWNlX2ludGVydmFsKSAmJgorICAgICAgIChwQWMtPndtbUFjVWFwc2RTdXNwZW5zaW9uSW50ZXJ2YWwgPT0gc3VzcGVuc2lvbl9pbnRlcnZhbCkgJiYKKyAgICAgICAocEFjLT53bW1BY1VhcHNkRGlyZWN0aW9uID09IGRpcmVjdGlvbikpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICIlczogTm8gY2hhbmdlIGluIFUtQVBTRCBwYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvLyBhcmUgd2UgaW4gdGhlIGFwcHJvcHJpYXRlIHBvd2VyIHNhdmUgbW9kZXM/CisgICBpZiAoIXNtZV9Jc1Bvd2VyU2F2ZUVuYWJsZWQoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCBlUE1DX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkUpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiJXM6IEJNUFMgaXMgbm90IGVuYWJsZWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmICghc21lX0lzUG93ZXJTYXZlRW5hYmxlZChXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIGVQTUNfVUFQU0RfTU9ERV9QT1dFUl9TQVZFKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgIiVzOiBVLUFQU0QgaXMgbm90IGVuYWJsZWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8vIGV2ZXJ5dGhpbmcgaXMgaW4gcGxhY2UgdG8gbm90aWZ5IFRMCisgICBzdGF0dXMgPSBXTEFOVExfRW5hYmxlVUFQU0RGb3JBQygoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5zdGFJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYy0+d21tQWNUc3BlY0luZm8udHNfaW5mby50aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWMtPndtbUFjVHNwZWNJbmZvLnRzX2luZm8udXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX2ludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbl9pbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbik7CisKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBlbmFibGUgVS1BUFNEIGZvciBBQz0lZCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWNUeXBlICk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8vIHN0YXNoIGF3YXkgdGhlIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIHVzZWQKKyAgIHBBYy0+d21tQWNVYXBzZEluZm9WYWxpZCA9IFZPU19UUlVFOworICAgcEFjLT53bW1BY1VhcHNkU2VydmljZUludGVydmFsID0gc2VydmljZV9pbnRlcnZhbDsKKyAgIHBBYy0+d21tQWNVYXBzZFN1c3BlbnNpb25JbnRlcnZhbCA9IHN1c3BlbnNpb25faW50ZXJ2YWw7CisgICBwQWMtPndtbUFjVWFwc2REaXJlY3Rpb24gPSBkaXJlY3Rpb247CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzOiBFbmFibGVkIFVBUFNEIGluIFRMIHNydl9pbnQ9JWxkICIKKyAgICAgICAgICAgICAic3VzcF9pbnQ9JWxkIGRpcj0lZCBBQz0lZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgIHNlcnZpY2VfaW50ZXJ2YWwsCisgICAgICAgICAgICAgc3VzcGVuc2lvbl9pbnRlcnZhbCwKKyAgICAgICAgICAgICBkaXJlY3Rpb24sCisgICAgICAgICAgICAgYWNUeXBlKTsKKworfQorCisvKioKKyAgQGJyaWVmIGhkZF93bW1fZGlzYWJsZV90bF91YXBzZCgpIC0gZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyCisgIHRvIGRpc2FibGUgVUFQU0QgcGFyYW1ldGVycyBpbiBUTAorCisgIEBwYXJhbSBwUW9zQ29udGV4dCA6IFtpbl0gdGhlIHBvaW50ZXIgdGhlIFFvUyBpbnN0YW5jZSBjb250cm9sIGJsb2NrCisKKyAgQHJldHVybgorICBOb25lCisqLworc3RhdGljIHZvaWQgaGRkX3dtbV9kaXNhYmxlX3RsX3VhcHNkIChoZGRfd21tX3Fvc19jb250ZXh0X3QqIHBRb3NDb250ZXh0KQoreworICAgaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIgPSBwUW9zQ29udGV4dC0+cEFkYXB0ZXI7CisgICBXTEFOVExfQUNFbnVtVHlwZSBhY1R5cGUgPSBwUW9zQ29udGV4dC0+YWNUeXBlOworICAgaGRkX3dtbV9hY19zdGF0dXNfdCAqcEFjID0gJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNUeXBlXTsKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworCisKKyAgIC8vIGhhdmUgd2UgcHJldmlvdXNseSBlbmFibGVkIFVBUFNEPworICAgaWYgKHBBYy0+d21tQWNVYXBzZEluZm9WYWxpZCA9PSBWT1NfVFJVRSkKKyAgIHsKKyAgICAgIHN0YXR1cyA9IFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQygoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNUeXBlKTsKKworICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGRpc2FibGUgVS1BUFNEIGZvciBBQz0lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWNUeXBlICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvLyBUTCBubyBsb25nZXIgaGFzIHZhbGlkIFVBUFNEIGluZm8KKyAgICAgICAgIHBBYy0+d21tQWNVYXBzZEluZm9WYWxpZCA9IFZPU19GQUxTRTsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIiVzOiBEaXNhYmxlZCBVQVBTRCBpbiBUTCBmb3IgQUM9JWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICBhY1R5cGUpOworICAgICAgfQorICAgfQorfQorCisjZW5kaWYKKworLyoqCisgIEBicmllZiBoZGRfd21tX2ZyZWVfY29udGV4dCgpIC0gZnVuY3Rpb24gd2hpY2ggZnJlZXMgYSBRb1MgY29udGV4dAorCisgIEBwYXJhbSBwUW9zQ29udGV4dCA6IFtpbl0gdGhlIHBvaW50ZXIgdGhlIFFvUyBpbnN0YW5jZSBjb250cm9sIGJsb2NrCisKKyAgQHJldHVybgorICBOb25lCisqLworc3RhdGljIHZvaWQgaGRkX3dtbV9mcmVlX2NvbnRleHQgKGhkZF93bW1fcW9zX2NvbnRleHRfdCogcFFvc0NvbnRleHQpCit7CisgICBoZGRfYWRhcHRlcl90KiBwQWRhcHRlcjsKKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgIiVzOiBFbnRlcmVkLCBjb250ZXh0ICVwIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBRb3NDb250ZXh0KTsKKworICAgaWYgKHVubGlrZWx5KChOVUxMID09IHBRb3NDb250ZXh0KSB8fAorICAgICAgICAgICAgICAgIChIRERfV01NX0NUWF9NQUdJQyAhPSBwUW9zQ29udGV4dC0+bWFnaWMpKSkKKyAgIHsKKyAgICAgIC8vIG11c3QgaGF2ZSBiZWVuIGZyZWVkIGluIGFub3RoZXIgdGhyZWFkCisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8vIGdldCBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQKKyAgIHBBZGFwdGVyID0gcFFvc0NvbnRleHQtPnBBZGFwdGVyOworCisgICAvLyB0YWtlIHRoZSB3bW1Mb2NrIHNpbmNlIHdlJ3JlIG1hbmlwdWxhdGluZyB0aGUgY29udGV4dCBsaXN0CisgICBtdXRleF9sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworCisgICAvLyBtYWtlIHN1cmUgbm9ib2R5IHRoaW5rcyB0aGlzIGlzIGEgdmFsaWQgY29udGV4dAorICAgcFFvc0NvbnRleHQtPm1hZ2ljID0gMDsKKworICAgLy8gdW5saW5rIHRoZSBjb250ZXh0CisgICBsaXN0X2RlbCgmcFFvc0NvbnRleHQtPm5vZGUpOworCisgICAvLyBkb25lIG1hbmlwdWxhdGluZyB0aGUgbGlzdAorICAgbXV0ZXhfdW5sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworCisgICAvLyByZWNsYWltIG1lbW9yeQorICAga2ZyZWUocFFvc0NvbnRleHQpOworCit9CisKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisvKioKKyAgQGJyaWVmIGhkZF93bW1fbm90aWZ5X2FwcCgpIC0gZnVuY3Rpb24gd2hpY2ggbm90aWZpZXMgYW4gYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyBpbiBzdGF0ZSBvZiBpdCBmbG93CisKKyAgQHBhcmFtIHBRb3NDb250ZXh0IDogW2luXSB0aGUgcG9pbnRlciB0aGUgUW9TIGluc3RhbmNlIGNvbnRyb2wgYmxvY2sKKworICBAcmV0dXJuCisgIE5vbmUKKyovCisjZGVmaW5lIE1BWF9OT1RJRllfTEVOIDUwCitzdGF0aWMgdm9pZCBoZGRfd21tX25vdGlmeV9hcHAgKGhkZF93bW1fcW9zX2NvbnRleHRfdCogcFFvc0NvbnRleHQpCit7CisgICBoZGRfYWRhcHRlcl90KiBwQWRhcHRlcjsKKyAgIHVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKyAgIGNoYXIgYnVmW01BWF9OT1RJRllfTEVOKzFdOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAiJXM6IEVudGVyZWQsIGNvbnRleHQgJXAiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcFFvc0NvbnRleHQpOworCisgICBpZiAodW5saWtlbHkoKE5VTEwgPT0gcFFvc0NvbnRleHQpIHx8CisgICAgICAgICAgICAgICAgKEhERF9XTU1fQ1RYX01BR0lDICE9IHBRb3NDb250ZXh0LT5tYWdpYykpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFFvUyBDb250ZXh0IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuOworICAgfQorCisKKyAgIC8vIGNyZWF0ZSB0aGUgZXZlbnQKKyAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKworICAgc25wcmludGYoYnVmLCBNQVhfTk9USUZZX0xFTiwgIlFDT006IFRTIGNoYW5nZVsldTogJXVdIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcFFvc0NvbnRleHQtPmhhbmRsZSwKKyAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMpOworCisgICB3cnF1LmRhdGEucG9pbnRlciA9IGJ1ZjsKKyAgIHdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKworICAgLy8gZ2V0IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIKKyAgIHBBZGFwdGVyID0gcFFvc0NvbnRleHQtPnBBZGFwdGVyOworCisgICAvLyBzZW5kIHRoZSBldmVudAorICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiJXM6IFNlbmRpbmcgWyVzXSIsIF9fRlVOQ1RJT05fXywgYnVmKTsKKyAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkYXB0ZXItPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1Zik7Cit9CisKKworLyoqCisgIEBicmllZiBoZGRfd21tX2lzX2FjY2Vzc19hbGxvd2VkKCkgLSBmdW5jdGlvbiB3aGljaCBkZXRlcm1pbmVzIGlmIGFjY2VzcworICBpcyBhbGxvd2VkIGZvciB0aGUgZ2l2ZW4gQUMuICB0aGlzIGlzIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBkdXJpbmcgU01FCisgIGNhbGxiYWNrIHByb2Nlc3Npbmcgc2luY2UgdGhhdCBpcyB3aGVuIGFjY2VzcyBjYW4gYmUgZ3JhbnRlZCBvciByZW1vdmVkCisKKyAgQHBhcmFtIHBBZGFwdGVyICAgIDogW2luXSBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dAorICBAcGFyYW0gcEFjICAgICAgICAgOiBbaW5dIHBvaW50ZXIgdG8gdGhlIHBlci1BQyBzdGF0dXMKKworICBAcmV0dXJuICAgICAgICAgICAgOiBWT1NfVFJVRSAtIGFjY2VzcyBpcyBhbGxvd2VkCisgICAgICAgICAgICAgICAgICAgICA6IFZPU19GQUxTRSAtIGFjY2VzcyBpcyBub3QgYWxsb3dlZAorICBOb25lCisqLworc3RhdGljIHZfQk9PTF90IGhkZF93bW1faXNfYWNjZXNzX2FsbG93ZWQoaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfd21tX2FjX3N0YXR1c190KiBwQWMpCit7CisgICAvLyBpZiB3ZSBkb24ndCB3YW50IFFvUyBvciB0aGUgQVAgZG9lc24ndCBzdXBwb3J0IFFvUworICAgLy8gb3Igd2UgZG9uJ3Qgd2FudCB0byBkbyBpbXBsaWNpdCBRb1MKKyAgIC8vIG9yIGlmIEFQIGRvZXNuJ3QgcmVxdWlyZSBhZG1pc3Npb24gZm9yIHRoaXMgQUMKKyAgIC8vIHRoZW4gd2UgaGF2ZSBhY2Nlc3MKKyAgIGlmICghaGRkX3dtbV9pc19hY3RpdmUocEFkYXB0ZXIpIHx8CisgICAgICAgIShXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPmJJbXBsaWNpdFFvc0VuYWJsZWQgfHwKKyAgICAgICAhcEFjLT53bW1BY0FjY2Vzc1JlcXVpcmVkKQorICAgeworICAgICAgcmV0dXJuIFZPU19UUlVFOworICAgfQorCisgICAvLyBpZiBpbXBsaWNpdCBRb1MgaGFzIGFscmVhZHkgY29tcGxldGVkLCBzdWNjZXNzZnVsbHkgb3Igbm90LAorICAgLy8gdGhlbiBhY2Nlc3MgaXMgYWxsb3dlZAorICAgaWYgKHBBYy0+d21tQWNBY2Nlc3NHcmFudGVkIHx8IHBBYy0+d21tQWNBY2Nlc3NGYWlsZWQpCisgICB7CisgICAgICByZXR1cm4gVk9TX1RSVUU7CisgICB9CisKKyAgIC8vIGFkbWlzc2lvbiBpcyByZXF1aXJlZCBhbmQgaW1wbGljaXQgUW9TIGhhc24ndCBjb21wbGV0ZWQKKyAgIC8vIGhvd2V2ZXIgZXhwbGljaXQgUW9TIG1heSBoYXZlIGNvbXBsZXRlZCBhbmQgd2UnbGwgaGF2ZQorICAgLy8gYSBUc3BlYworICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIFRzcGVjIHRoZW4gYWNjZXNzIGlzIG5vdCBhbGxvd2VkCisgICBpZiAoIXBBYy0+d21tQWNUc3BlY1ZhbGlkKQorICAgeworICAgICAgcmV0dXJuIFZPU19GQUxTRTsKKyAgIH0KKworICAgLy8gd2UgaGF2ZSBhIFRzcGVjIC0tIGRvZXMgaXQgYWxsb3cgdXBzdHJlYW0gb3IgYmlkaXJlY3Rpb25hbCB0cmFmZmljPworICAgLy8gaWYgaXQgb25seSBhbGxvd3MgZG93bnN0cmVhbSB0cmFmZmljIHRoZW4gYWNjZXNzIGlzIG5vdCBhbGxvd2VkCisgICBpZiAocEFjLT53bW1BY1RzcGVjSW5mby50c19pbmZvLmRpcmVjdGlvbiA9PSBTTUVfUU9TX1dNTV9UU19ESVJfRE9XTkxJTkspCisgICB7CisgICAgICByZXR1cm4gVk9TX0ZBTFNFOworICAgfQorCisgICAvLyB3ZSBtZWV0IGFsbCBvZiB0aGUgY3JpdGVyaWEgZm9yIGFjY2VzcworICAgcmV0dXJuIFZPU19UUlVFOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorLyoqCisgIEBicmllZiBoZGRfd21tX2luYWN0aXZpdHlfdGltZXJfY2IoKSAtIHRpbWVyIGhhbmRsZXIgZnVuY3Rpb24gd2hpY2ggaXMKKyAgY2FsbGVkIGZvciBldmVyeSBpbmFjdGl2aXR5IGludGVydmFsIHBlciBBQy4gVGhpcyBmdW5jdGlvbiBnZXRzIHRoZQorICBjdXJyZW50IHRyYW5zbWl0dGVkIHBhY2tldHMgb24gdGhlIGdpdmVuIEFDLCBhbmQgY2hlY2tzIGlmIHRoZXJlIHdoZXJlCisgIGFueSBUWCBhY3Rpdml0eSBmcm9tIHRoZSBwcmV2aW91cyBpbnRlcnZhbC4gSWYgdGhlcmUgd2FzIG5vIHRyYWZmaWMKKyAgdGhlbiBpdCB3b3VsZCBkZWxldGUgdGhlIFRTIHRoYXQgd2FzIG5lZ290aWF0ZWQgb24gdGhhdCBBQy4KKworICBAcGFyYW0gcFVzZXJEYXRhICAgOiBbaW5dIHBvaW50ZXIgdG8gcFFvc0NvbnRleHQKKworICBAcmV0dXJuICAgICAgICAgICAgOiBOT05FCisqLwordm9pZCBoZGRfd21tX2luYWN0aXZpdHlfdGltZXJfY2IoIHZfUFZPSURfdCBwVXNlckRhdGEgKQoreworICAgIGhkZF93bW1fcW9zX2NvbnRleHRfdCogcFFvc0NvbnRleHQgPSAoaGRkX3dtbV9xb3NfY29udGV4dF90KilwVXNlckRhdGE7CisgICAgaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXI7CisgICAgaGRkX3dtbV9hY19zdGF0dXNfdCAqcEFjOworICAgIGhkZF93bGFuX3dtbV9zdGF0dXNfZSBzdGF0dXM7CisgICAgVk9TX1NUQVRVUyB2b3Nfc3RhdHVzOworICAgIHZfVTMyX3QgY3VycmVudFRyYWZmaWNDbnQgPSAwOworICAgIFdMQU5UTF9BQ0VudW1UeXBlIGFjVHlwZSA9IHBRb3NDb250ZXh0LT5hY1R5cGU7CisKKyAgICBwQWRhcHRlciA9IHBRb3NDb250ZXh0LT5wQWRhcHRlcjsKKyAgICBwQWMgPSAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdOworCisgICAgLy8gR2V0IHRoZSBUeCBzdGF0cyBmb3IgdGhpcyBBQy4KKyAgICBjdXJyZW50VHJhZmZpY0NudCA9IHBBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdENsYXNzaWZpZWRBQ1twUW9zQ29udGV4dC0+YWNUeXBlXTsKKworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICBGTCgiV01NIGluYWN0aXZpdHkgVGltZXIgZm9yIEFDPSVkLCBjdXJyZW50Q250PSVkLCBwcmV2Q250PSVkXG4iKSwKKyAgICAgICAgICAgIGFjVHlwZSwgKGludCljdXJyZW50VHJhZmZpY0NudCwgKGludClwQWMtPndtbVByZXZUcmFmZmljQ250KTsKKyAgICBpZiAocEFjLT53bW1QcmV2VHJhZmZpY0NudCA9PSBjdXJyZW50VHJhZmZpY0NudCkKKyAgICB7CisgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHRyYWZmaWMgYWN0aXZpdHksIGRlbGV0ZSB0aGUgVFNQRUMgZm9yIHRoaXMgQUMKKyAgICAgICAgc3RhdHVzID0gaGRkX3dtbV9kZWx0cyhwQWRhcHRlciwgcFFvc0NvbnRleHQtPmhhbmRsZSk7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgIEZMKCJEZWxldGVkIFRTIG9uIEFDICVkLCBkdWUgdG8gaW5hY3Rpdml0eSB3aXRoIHN0YXR1cyA9ICVkISEhIiksCisgICAgICAgICAgICAgICAgYWNUeXBlLCBzdGF0dXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQWMtPndtbVByZXZUcmFmZmljQ250ID0gY3VycmVudFRyYWZmaWNDbnQ7CisgICAgICAgIGlmIChwQWMtPndtbUluYWN0aXZpdHlUaW1lci5zdGF0ZSA9PSBWT1NfVElNRVJfU1RBVEVfU1RPUFBFRCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVzdGFydCB0aGUgdGltZXIKKyAgICAgICAgICAgIHZvc19zdGF0dXMgPSB2b3NfdGltZXJfc3RhcnQoJnBBYy0+d21tSW5hY3Rpdml0eVRpbWVyLCBwQWMtPndtbUluYWN0aXZpdHlUaW1lKTsKKyAgICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19zdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJSZXN0YXJ0aW5nIGluYWN0aXZpdHkgdGltZXIgZmFpbGVkIG9uIEFDICVkIiksIGFjVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfQVNTRVJUKHZvc190aW1lcl9nZXRDdXJyZW50U3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAmcEFjLT53bW1JbmFjdGl2aXR5VGltZXIpID09IFZPU19USU1FUl9TVEFURV9TVE9QUEVEKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworCisvKioKKyAgQGJyaWVmIGhkZF93bW1fZW5hYmxlX2luYWN0aXZpdHlfdGltZXIoKSAtIGZ1bmN0aW9uIHRvIGVuYWJsZSB0aGUKKyAgdHJhZmZpYyBpbmFjdGl2aXR5IHRpbWVyIGZvciB0aGUgZ2l2ZW4gQUMsIGlmIHRoZSBpbmFjdGl2aXR5X2ludGVydmFsCisgIHNwZWNpZmllZCBpbiB0aGUgQUREVFMgcGFyYW1ldGVycyBpcyBub24temVybworCisgIEBwYXJhbSBwUW9zQ29udGV4dCAgIDogW2luXSBwb2ludGVyIHRvIHBRb3NDb250ZXh0CisgIEBwYXJhbSBpbmFjdGl2aXR5VGltZTogW2luXSB2YWx1ZSBvZiB0aGUgaW5hY3Rpdml0eSBpbnRlcnZhbCBpbiBtaWxsaXNlY3MKKworICBAcmV0dXJuICAgICAgICAgICAgICA6IFZPU19TVEFUVVNfRV9GQUlMVVJFCisgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTCisqLworVk9TX1NUQVRVUyBoZGRfd21tX2VuYWJsZV9pbmFjdGl2aXR5X3RpbWVyKGhkZF93bW1fcW9zX2NvbnRleHRfdCogcFFvc0NvbnRleHQsIHZfVTMyX3QgaW5hY3Rpdml0eVRpbWUpCit7CisgICAgVk9TX1NUQVRVUyB2b3Nfc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIgPSBwUW9zQ29udGV4dC0+cEFkYXB0ZXI7CisgICAgV0xBTlRMX0FDRW51bVR5cGUgYWNUeXBlID0gcFFvc0NvbnRleHQtPmFjVHlwZTsKKyAgICBoZGRfd21tX2FjX3N0YXR1c190ICpwQWM7CisKKyAgICBwQWRhcHRlciA9IHBRb3NDb250ZXh0LT5wQWRhcHRlcjsKKyAgICBwQWMgPSAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdOworCisKKyAgICAvLyBJZiBRb1MtVHNwZWMgaXMgc3VjY2Vzc2Z1bGx5IHNldHVwIGFuZCBpZiB0aGUgaW5hY3Rpdml0eSB0aW1lciBpcyBub24temVybywKKyAgICAvLyBhIHRyYWZmaWMgaW5hY3Rpdml0eSB0aW1lciBuZWVkcyB0byBiZSBzdGFydGVkIGZvciB0aGUgZ2l2ZW4gQUMKKyAgICB2b3Nfc3RhdHVzID0gdm9zX3RpbWVyX2luaXQoCisgICAgICAgICAgICAmcEFjLT53bW1JbmFjdGl2aXR5VGltZXIsCisgICAgICAgICAgICBWT1NfVElNRVJfVFlQRV9TVywKKyAgICAgICAgICAgIGhkZF93bW1faW5hY3Rpdml0eV90aW1lcl9jYiwKKyAgICAgICAgICAgICh2X1BWT0lEX3QpcFFvc0NvbnRleHQgKTsKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX3N0YXR1cykpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgRkwoIkluaXRpYWxpemluZyBpbmFjdGl2aXR5IHRpbWVyIGZhaWxlZCBvbiBBQyAlZCIpLCBhY1R5cGUpOworICAgICAgICByZXR1cm4gdm9zX3N0YXR1czsKKyAgICB9CisKKyAgICAvLyBTdGFydCB0aGUgaW5hY3Rpdml0eSB0aW1lcgorICAgIHZvc19zdGF0dXMgPSB2b3NfdGltZXJfc3RhcnQoCisgICAgICAgICAgICAmcEFjLT53bW1JbmFjdGl2aXR5VGltZXIsCisgICAgICAgICAgICBpbmFjdGl2aXR5VGltZSk7CisgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19zdGF0dXMpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIEZMKCJTdGFydGluZyBpbmFjdGl2aXR5IHRpbWVyIGZhaWxlZCBvbiBBQyAlZCIpLCBhY1R5cGUpOworICAgICAgICByZXR1cm4gdm9zX3N0YXR1czsKKyAgICB9CisgICAgcEFjLT53bW1JbmFjdGl2aXR5VGltZSA9IGluYWN0aXZpdHlUaW1lOworICAgIC8vIEluaXRpYWxpemUgdGhlIGN1cnJlbnQgdHggdHJhZmZpYyBjb3VudCBvbiB0aGlzIEFDCisgICAgcEFjLT53bW1QcmV2VHJhZmZpY0NudCA9IHBBZGFwdGVyLT5oZGRfc3RhdHMuaGRkVHhSeFN0YXRzLnR4WG1pdENsYXNzaWZpZWRBQ1twUW9zQ29udGV4dC0+YWNUeXBlXTsKKworICAgIHJldHVybiB2b3Nfc3RhdHVzOworfQorCisvKioKKyAgQGJyaWVmIGhkZF93bW1fZW5hYmxlX2luYWN0aXZpdHlfdGltZXIoKSAtIGZ1bmN0aW9uIHRvIGRpc2FibGUgdGhlCisgIHRyYWZmaWMgaW5hY3Rpdml0eSB0aW1lciBmb3IgdGhlIGdpdmVuIEFDLiBUaGlzIHdvdWxkIGJlIGNhbGxlZCB3aGVuCisgIGRlbGV0aW5nIHRoZSBUUy4KKworICBAcGFyYW0gcFFvc0NvbnRleHQgICA6IFtpbl0gcG9pbnRlciB0byBwUW9zQ29udGV4dAorCisgIEByZXR1cm4gICAgICAgICAgICAgIDogVk9TX1NUQVRVU19FX0ZBSUxVUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MKKyovCitWT1NfU1RBVFVTIGhkZF93bW1fZGlzYWJsZV9pbmFjdGl2aXR5X3RpbWVyKGhkZF93bW1fcW9zX2NvbnRleHRfdCogcFFvc0NvbnRleHQpCit7CisgICAgaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIgPSBwUW9zQ29udGV4dC0+cEFkYXB0ZXI7CisgICAgV0xBTlRMX0FDRW51bVR5cGUgYWNUeXBlID0gcFFvc0NvbnRleHQtPmFjVHlwZTsKKyAgICBoZGRfd21tX2FjX3N0YXR1c190ICpwQWMgID0gJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNUeXBlXTsKKyAgICBWT1NfU1RBVFVTIHZvc19zdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKworICAgIC8vIENsZWFyIHRoZSB0aW1lciBhbmQgdGhlIGNvdW50ZXIKKyAgICBwQWMtPndtbUluYWN0aXZpdHlUaW1lID0gMDsKKyAgICBwQWMtPndtbVByZXZUcmFmZmljQ250ID0gMDsKKyAgICB2b3NfdGltZXJfc3RvcCgmcEFjLT53bW1JbmFjdGl2aXR5VGltZXIpOworICAgIHZvc19zdGF0dXMgPSB2b3NfdGltZXJfZGVzdHJveSgmcEFjLT53bW1JbmFjdGl2aXR5VGltZXIpOworCisgICAgcmV0dXJuIHZvc19zdGF0dXM7Cit9CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX0NDWAorCisvKioKKyAgQGJyaWVmIGhkZF93bW1fc21lX2NhbGxiYWNrKCkgLSBjYWxsYmFjayByZWdpc3RlcmVkIGJ5IEhERCB3aXRoIFNNRSBmb3IgcmVjZWl2aW5nCisgIFFvUyBub3RpZmljYXRpb25zLiBFdmVuIHRob3VnaCB0aGlzIGZ1bmN0aW9uIGhhcyBhIHN0YXRpYyBzY29wZSBpdCBnZXRzIGNhbGxlZAorICBleHRlcm5hbGx5IHRocm91Z2ggc29tZSBmdW5jdGlvbiBwb2ludGVyIG1hZ2ljIChzbyB0aGVyZSBpcyBhIG5lZWQgZm9yCisgIHJpZ29yb3VzIHBhcmFtZXRlciBjaGVja2luZykKKworICBAcGFyYW0gaEhhbCA6IFtpbl0gdGhlIEhBTCBoYW5kbGUKKyAgQHBhcmFtIEhkZEN0eCA6IFtpbl0gdGhlIEhERCBzcGVjaWZpZWQgaGFuZGxlCisgIEBwYXJhbSBwQ3VycmVudFFvc0luZm8gOiBbaW5dIHRoZSBUU1BFQyBwYXJhbXMKKyAgQHBhcmFtIFNtZVN0YXR1cyA6IFtpbl0gdGhlIFFvUyByZWxhdGVkIFNNRSBzdGF0dXMKKworICBAcmV0dXJuCisgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgaWYgYWxsIGdvb2QsIGVIQUxfU1RBVFVTX0ZBSUxVUkUgb3RoZXJ3aXNlCisqLworc3RhdGljIGVIYWxTdGF0dXMgaGRkX3dtbV9zbWVfY2FsbGJhY2sgKHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaGRkQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8qIHBDdXJyZW50UW9zSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zU3RhdHVzVHlwZSBzbWVTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBxb3NGbG93SWQpCit7CisgICBoZGRfd21tX3Fvc19jb250ZXh0X3QqIHBRb3NDb250ZXh0ID0gaGRkQ3R4OworICAgaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXI7CisgICBXTEFOVExfQUNFbnVtVHlwZSBhY1R5cGU7CisgICBoZGRfd21tX2FjX3N0YXR1c190ICpwQWM7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgIiVzOiBFbnRlcmVkLCBjb250ZXh0ICVwIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBRb3NDb250ZXh0KTsKKworICAgaWYgKHVubGlrZWx5KChOVUxMID09IHBRb3NDb250ZXh0KSB8fAorICAgICAgICAgICAgICAgIChIRERfV01NX0NUWF9NQUdJQyAhPSBwUW9zQ29udGV4dC0+bWFnaWMpKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBRb1MgQ29udGV4dCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICBwQWRhcHRlciA9IHBRb3NDb250ZXh0LT5wQWRhcHRlcjsKKyAgIGFjVHlwZSA9IHBRb3NDb250ZXh0LT5hY1R5cGU7CisgICBwQWMgPSAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAiJXM6IHN0YXR1cyAlZCBmbG93aWQgJWQgaW5mbyAlcCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzbWVTdGF0dXMsIHFvc0Zsb3dJZCwgcEN1cnJlbnRRb3NJbmZvKTsKKworICAgc3dpdGNoIChzbWVTdGF0dXMpCisgICB7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkQ6CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAiJXM6IFNldHVwIGlzIGNvbXBsZXRlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAvLyB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhIFRTUEVDIHJldHVybmVkIHdpdGggdGhpcyBzdGF0dXMsIGV2ZW4gaWYKKyAgICAgIC8vIGEgVFNQRUMgaXMgbm90IGV4Y2hhbmdlZCBPVEEKKyAgICAgIGlmIChwQ3VycmVudFFvc0luZm8pCisgICAgICB7CisgICAgICAgICBwQWMtPndtbUFjVHNwZWNWYWxpZCA9IFZPU19UUlVFOworICAgICAgICAgbWVtY3B5KCZwQWMtPndtbUFjVHNwZWNJbmZvLAorICAgICAgICAgICAgICAgIHBDdXJyZW50UW9zSW5mbywKKyAgICAgICAgICAgICAgICBzaXplb2YocEFjLT53bW1BY1RzcGVjSW5mbykpOworICAgICAgfQorCisgICAgICBpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgPT0gcFFvc0NvbnRleHQtPmhhbmRsZSkKKyAgICAgIHsKKworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiJXM6IEltcGxpY2l0IFFvcywgbm90aWZ5aW5nIFRMIGZvciBUTCBBQyAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhY1R5cGUpOworCisgICAgICAgICAvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgaW1wbGljaXQgUW9TIHNvIHdlIGtub3cgcGFja2V0cyBhcmUgcGVuZGluZworICAgICAgICAgLy8gdXBkYXRlIHN0YXRlCisgICAgICAgICBwQWMtPndtbUFjQWNjZXNzQWxsb3dlZCA9IFZPU19UUlVFOworICAgICAgICAgcEFjLT53bW1BY0FjY2Vzc0dyYW50ZWQgPSBWT1NfVFJVRTsKKyAgICAgICAgIHBBYy0+d21tQWNBY2Nlc3NQZW5kaW5nID0gVk9TX0ZBTFNFOworCisgICAgICAgICAvLyBub3RpZnkgVEwgdGhhdCBwYWNrZXRzIGFyZSBwZW5kaW5nCisgICAgICAgICBzdGF0dXMgPSBXTEFOVExfU1RBUGt0UGVuZGluZyggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLnN0YUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjVHlwZSApOworCisgICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc2lnbmFsIFRMIGZvciBBQz0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWNUeXBlICk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICIlczogRXhwbGljaXQgUW9zLCBub3RpZnlpbmcgdXNlcnNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgICAvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24KKyAgICAgICAgIHBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9TVUNDRVNTOworICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgIC8vIENoZWNrIGlmIHRoZSBpbmFjdGl2aXR5IGludGVydmFsIGlzIHNwZWNpZmllZAorICAgICAgaWYgKHBDdXJyZW50UW9zSW5mby0+aW5hY3Rpdml0eV9pbnRlcnZhbCkgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIiVzOiBJbmFjdGl2aXR5IHRpbWVyIHZhbHVlID0gJWQgZm9yIEFDPSVkXG4iLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBDdXJyZW50UW9zSW5mby0+aW5hY3Rpdml0eV9pbnRlcnZhbCwgYWNUeXBlKTsKKyAgICAgICAgIGhkZF93bW1fZW5hYmxlX2luYWN0aXZpdHlfdGltZXIocFFvc0NvbnRleHQsIHBDdXJyZW50UW9zSW5mby0+aW5hY3Rpdml0eV9pbnRlcnZhbCk7CisgICAgICB9CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX0NDWAorCisgICAgICAvLyBub3RpZnkgVEwgdG8gZW5hYmxlIHRyaWdnZXIgZnJhbWVzIGlmIG5lY2Vzc2FyeQorICAgICAgaGRkX3dtbV9lbmFibGVfdGxfdWFwc2QocFFvc0NvbnRleHQpOworCisgICAgICBicmVhazsKKworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFk6CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICIlczogU2V0dXAgaXMgY29tcGxldGUgKFUtQVBTRCBzZXQgcHJldmlvdXNseSkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgIGlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCA9PSBwUW9zQ29udGV4dC0+aGFuZGxlKQorICAgICAgeworCisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICIlczogSW1wbGljaXQgUW9zLCBub3RpZnlpbmcgVEwiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBpbXBsaWNpdCBRb1Mgc28gd2Uga25vdyBwYWNrZXRzIGFyZSBwZW5kaW5nCisgICAgICAgICAvLyB1cGRhdGUgc3RhdGUKKyAgICAgICAgIHBBYy0+d21tQWNBY2Nlc3NBbGxvd2VkID0gVk9TX1RSVUU7CisgICAgICAgICBwQWMtPndtbUFjQWNjZXNzR3JhbnRlZCA9IFZPU19UUlVFOworICAgICAgICAgcEFjLT53bW1BY0FjY2Vzc1BlbmRpbmcgPSBWT1NfRkFMU0U7CisKKyAgICAgICAgIC8vIG5vdGlmeSBUTCB0aGF0IHBhY2tldHMgYXJlIHBlbmRpbmcKKyAgICAgICAgIHN0YXR1cyA9IFdMQU5UTF9TVEFQa3RQZW5kaW5nKCAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNUeXBlICk7CisKKyAgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzaWduYWwgVEwgZm9yIEFDPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhY1R5cGUgKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIiVzOiBFeHBsaWNpdCBRb3MsIG5vdGlmeWluZyB1c2Vyc3BhY2UiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbgorICAgICAgICAgcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX1VBUFNEX0VYSVNUSU5HOworICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A6CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IFNldHVwIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIC8vIFFvUyBzZXR1cCBmYWlsZWQKKworICAgICAgaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUID09IHBRb3NDb250ZXh0LT5oYW5kbGUpCisgICAgICB7CisKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIiVzOiBJbXBsaWNpdCBRb3MsIG5vdGlmeWluZyBUTCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgICAgLy8gd2Ugbm90ZSB0aGUgZmFpbHVyZSwgYnV0IHdlIGFsc28gbWFyayBhY2Nlc3MgYXMgYWxsb3dlZCBzbyB0aGF0CisgICAgICAgICAvLyB0aGUgcGFja2V0cyB3aWxsIGZsb3cuICBOb3RlIHRoYXQgdGhlIE1BQyB3aWxsICJkbyB0aGUgcmlnaHQgdGhpbmciCisgICAgICAgICBwQWMtPndtbUFjQWNjZXNzUGVuZGluZyA9IFZPU19GQUxTRTsKKyAgICAgICAgIHBBYy0+d21tQWNBY2Nlc3NGYWlsZWQgPSBWT1NfVFJVRTsKKyAgICAgICAgIHBBYy0+d21tQWNBY2Nlc3NBbGxvd2VkID0gVk9TX1RSVUU7CisKKyAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBpbXBsaWNpdCBRb1Mgc28gd2Uga25vdyBwYWNrZXRzIGFyZSBwZW5kaW5nCisgICAgICAgICBzdGF0dXMgPSBXTEFOVExfU1RBUGt0UGVuZGluZyggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLnN0YUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjVHlwZSApOworCisgICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc2lnbmFsIFRMIGZvciBBQz0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWNUeXBlICk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICIlczogRXhwbGljaXQgUW9zLCBub3RpZnlpbmcgdXNlcnNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgICAvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24KKyAgICAgICAgIHBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRUQ7CisgICAgICAgICBoZGRfd21tX25vdGlmeV9hcHAocFFvc0NvbnRleHQpOworICAgICAgfQorCisgICAgICAvKiBTZXR0aW5nIHVwIFFvUyBGYWlsZWQsIFFvUyBjb250ZXh0IGNhbiBiZSByZWxlYXNlZC4KKyAgICAgICAqIFNNRSBpcyByZWxlYXNpbmcgdGhpcyBmbG93IGluZm9ybWF0aW9uIGFuZCBpZiBIREQgZG9lbid0IHJlbGVhc2UgdGhpcyBjb250ZXh0LAorICAgICAgICogbmV4dCB0aW1lIGlmIGFwcGxpY2F0aW9uIHVzZXMgdGhlIHNhbWUgaGFuZGxlIHRvIHNldC11cCBRb1MsIEhERCAoYXMgaXQgaGFzCisgICAgICAgKiBRb1MgY29udGV4dCBmb3IgdGhpcyBoYW5kbGUpIHdpbGwgaXNzdWUgTW9kaWZ5IFFvUyByZXF1ZXN0IHRvIFNNRSBidXQgU01FIHdpbGwKKyAgICAgICAqIHJlamVjdCBhcyBubyBpdCBoYXMgbm8gaW5mb3JtYXRpb24gZm9yIHRoaXMgZmxvdy4KKyAgICAgICAqLworICAgICAgaGRkX3dtbV9mcmVlX2NvbnRleHQocFFvc0NvbnRleHQpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfSU5WQUxJRF9QQVJBTVNfUlNQOgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBTZXR1cCBJbnZhbGlkIFBhcmFtcywgbm90aWZ5IFRMIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgLy8gUW9TIHNldHVwIGZhaWxlZAorCisgICAgICBpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgPT0gcFFvc0NvbnRleHQtPmhhbmRsZSkKKyAgICAgIHsKKworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiJXM6IEltcGxpY2l0IFFvcywgbm90aWZ5aW5nIFRMIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgICAvLyB3ZSBub3RlIHRoZSBmYWlsdXJlLCBidXQgd2UgYWxzbyBtYXJrIGFjY2VzcyBhcyBhbGxvd2VkIHNvIHRoYXQKKyAgICAgICAgIC8vIHRoZSBwYWNrZXRzIHdpbGwgZmxvdy4gIE5vdGUgdGhhdCB0aGUgTUFDIHdpbGwgImRvIHRoZSByaWdodCB0aGluZyIKKyAgICAgICAgIHBBYy0+d21tQWNBY2Nlc3NQZW5kaW5nID0gVk9TX0ZBTFNFOworICAgICAgICAgcEFjLT53bW1BY0FjY2Vzc0ZhaWxlZCA9IFZPU19UUlVFOworICAgICAgICAgcEFjLT53bW1BY0FjY2Vzc0FsbG93ZWQgPSBWT1NfVFJVRTsKKworICAgICAgICAgLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IGltcGxpY2l0IFFvUyBzbyB3ZSBrbm93IHBhY2tldHMgYXJlIHBlbmRpbmcKKyAgICAgICAgIHN0YXR1cyA9IFdMQU5UTF9TVEFQa3RQZW5kaW5nKCAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNUeXBlICk7CisKKyAgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzaWduYWwgVEwgZm9yIEFDPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhY1R5cGUgKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIiVzOiBFeHBsaWNpdCBRb3MsIG5vdGlmeWluZyB1c2Vyc3BhY2UiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbgorICAgICAgICAgcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9CQURfUEFSQU07CisgICAgICAgICBoZGRfd21tX25vdGlmeV9hcHAocFFvc0NvbnRleHQpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfTk9UX1FPU19BUF9SU1A6CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogU2V0dXAgZmFpbGVkLCBub3QgYSBRb1MgQVBcbiIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICBpZiAoIUhERF9XTU1fSEFORExFX0lNUExJQ0lUID09IHBRb3NDb250ZXh0LT5oYW5kbGUpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICIlczogRXhwbGljaXQgUW9zLCBub3RpZnlpbmcgdXNlcnNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgICAvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24KKyAgICAgICAgIHBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRURfTk9fV01NOworICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUDoKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgIiVzOiBTZXR1cCBwZW5kaW5nIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgLy8gbm90IGEgY2FsbGJhY2sgc3RhdHVzIC0tIGlnbm9yZSBpZiB3ZSBnZXQgaXQKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX01PRElGSUVEX0lORDoKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgIiVzOiBTZXR1cCBtb2RpZmllZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIGlmIChwQ3VycmVudFFvc0luZm8pCisgICAgICB7CisgICAgICAgICAvLyB1cGRhdGUgdGhlIFRTUEVDCisgICAgICAgICBwQWMtPndtbUFjVHNwZWNWYWxpZCA9IFZPU19UUlVFOworICAgICAgICAgbWVtY3B5KCZwQWMtPndtbUFjVHNwZWNJbmZvLAorICAgICAgICAgICAgICAgIHBDdXJyZW50UW9zSW5mbywKKyAgICAgICAgICAgICAgICBzaXplb2YocEFjLT53bW1BY1RzcGVjSW5mbykpOworCisgICAgICAgICBpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgIT0gcFFvc0NvbnRleHQtPmhhbmRsZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBFeHBsaWNpdCBRb3MsIG5vdGlmeWluZyB1c2Vyc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbgorICAgICAgICAgICAgcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGSUVEOworICAgICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgICAgIH0KKworICAgICAgICAgLy8gbmVlZCB0byB0ZWxsIFRMIHRvIHVwZGF0ZSBpdHMgVUFQU0QgaGFuZGxpbmcKKyAgICAgICAgIGhkZF93bW1fZW5hYmxlX3RsX3VhcHNkKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQOgorICAgICAgaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUID09IHBRb3NDb250ZXh0LT5oYW5kbGUpCisgICAgICB7CisKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIiVzOiBJbXBsaWNpdCBRb3MsIG5vdGlmeWluZyBUTCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgICAgLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IGltcGxpY2l0IFFvUyBzbyB3ZSBrbm93IHBhY2tldHMgYXJlIHBlbmRpbmcKKyAgICAgICAgIHBBYy0+d21tQWNBY2Nlc3NQZW5kaW5nID0gVk9TX0ZBTFNFOworICAgICAgICAgcEFjLT53bW1BY0FjY2Vzc0dyYW50ZWQgPSBWT1NfVFJVRTsKKyAgICAgICAgIHBBYy0+d21tQWNBY2Nlc3NBbGxvd2VkID0gVk9TX1RSVUU7CisKKyAgICAgICAgIC8vIG5vdGlmeSBUTCB0aGF0IHBhY2tldHMgYXJlIHBlbmRpbmcKKyAgICAgICAgIHN0YXR1cyA9IFdMQU5UTF9TVEFQa3RQZW5kaW5nKCAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNUeXBlICk7CisKKyAgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzaWduYWwgVEwgZm9yIEFDPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhY1R5cGUgKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIiVzOiBFeHBsaWNpdCBRb3MsIG5vdGlmeWluZyB1c2Vyc3BhY2UiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbgorICAgICAgICAgcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX1VBUFNEOworICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfSU5EX0FQU0RfUEVORElORzoKKyAgICAgIC8vIG5vdGhpbmcgdG8gZG8gZm9yIG5vdworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9TRVRfRkFJTEVEOgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBTZXR1cCBzdWNjZXNzZnVsIGJ1dCBVLUFQU0QgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICBpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgPT0gcFFvc0NvbnRleHQtPmhhbmRsZSkKKyAgICAgIHsKKworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiJXM6IEltcGxpY2l0IFFvcywgbm90aWZ5aW5nIFRMIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgICAvLyBRb1Mgc2V0dXAgd2FzIHN1Y2Nlc3NmdWwgYnV0IHNldHRpbmcgVT1BUFNEIGZhaWxlZAorICAgICAgICAgLy8gU2luY2UgdGhlIE9UQSBwYXJ0IG9mIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsLCB3ZSBkb24ndCBtYXJrCisgICAgICAgICAvLyB0aGlzIGFzIGEgZmFpbHVyZS4KKyAgICAgICAgIC8vIHRoZSBwYWNrZXRzIHdpbGwgZmxvdy4gIE5vdGUgdGhhdCB0aGUgTUFDIHdpbGwgImRvIHRoZSByaWdodCB0aGluZyIKKyAgICAgICAgIHBBYy0+d21tQWNBY2Nlc3NHcmFudGVkID0gVk9TX1RSVUU7CisgICAgICAgICBwQWMtPndtbUFjQWNjZXNzQWxsb3dlZCA9IFZPU19UUlVFOworICAgICAgICAgcEFjLT53bW1BY0FjY2Vzc0ZhaWxlZCA9IFZPU19GQUxTRTsKKyAgICAgICAgIHBBYy0+d21tQWNBY2Nlc3NQZW5kaW5nID0gVk9TX0ZBTFNFOworCisgICAgICAgICAvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgaW1wbGljaXQgUW9TIHNvIHdlIGtub3cgcGFja2V0cyBhcmUgcGVuZGluZworICAgICAgICAgc3RhdHVzID0gV0xBTlRMX1NUQVBrdFBlbmRpbmcoIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnB2b3NDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5zdGFJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY1R5cGUgKTsKKworICAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHNpZ25hbCBUTCBmb3IgQUM9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFjVHlwZSApOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiJXM6IEV4cGxpY2l0IFFvcywgbm90aWZ5aW5nIHVzZXJzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgICAgLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IGFuIGFwcGxpY2F0aW9uCisgICAgICAgICBwUW9zQ29udGV4dC0+bGFzdFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfVUFQU0RfU0VUX0ZBSUxFRDsKKyAgICAgICAgIGhkZF93bW1fbm90aWZ5X2FwcChwUW9zQ29udGV4dCk7CisgICAgICB9CisKKyAgICAgIC8vIFNpbmNlIFUtQVBTRCBwb3J0aW9uIGZhaWxlZCBkaXNhYmxlZCB0cmlnZ2VyIGZyYW1lIGdlbmVyYXRpb24KKyAgICAgIGhkZF93bW1fZGlzYWJsZV90bF91YXBzZChwUW9zQ29udGV4dCk7CisKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfU1VDQ0VTU19SU1A6CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICIlczogUmVsZWFzZSBpcyBjb21wbGV0ZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgaWYgKHBDdXJyZW50UW9zSW5mbykKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIiVzOiBmbG93cyBzdGlsbCBhY3RpdmUiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgIC8vIHRoZXJlIGlzIHN0aWxsIGF0IGxlYXN0IG9uZSBmbG93IGFjdGl2ZSBmb3IgdGhpcyBBQworICAgICAgICAgLy8gc28gdXBkYXRlIHRoZSBBQyBzdGF0ZQorICAgICAgICAgbWVtY3B5KCZwQWMtPndtbUFjVHNwZWNJbmZvLAorICAgICAgICAgICAgICAgIHBDdXJyZW50UW9zSW5mbywKKyAgICAgICAgICAgICAgICBzaXplb2YocEFjLT53bW1BY1RzcGVjSW5mbykpOworCisgICAgICAgICAvLyBuZWVkIHRvIHRlbGwgVEwgdG8gdXBkYXRlIGl0cyBVQVBTRCBoYW5kbGluZworICAgICAgICAgaGRkX3dtbV9lbmFibGVfdGxfdWFwc2QocFFvc0NvbnRleHQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiJXM6IGxhc3QgZmxvdyIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgICAgLy8gdGhpcyBpcyB0aGUgbGFzdCBmbG93IGFjdGl2ZSBmb3IgdGhpcyBBQyBzbyB1cGRhdGUgdGhlIEFDIHN0YXRlCisgICAgICAgICBwQWMtPndtbUFjVHNwZWNWYWxpZCA9IFZPU19GQUxTRTsKKworICAgICAgICAgLy8gbmVlZCB0byB0ZWxsIFRMIHRvIHVwZGF0ZSBpdHMgVUFQU0QgaGFuZGxpbmcKKyAgICAgICAgIGhkZF93bW1fZGlzYWJsZV90bF91YXBzZChwUW9zQ29udGV4dCk7CisgICAgICB9CisKKyAgICAgIGlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAhPSBwUW9zQ29udGV4dC0+aGFuZGxlKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiJXM6IEV4cGxpY2l0IFFvcywgbm90aWZ5aW5nIHVzZXJzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgICAgLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IGFuIGFwcGxpY2F0aW9uCisgICAgICAgICBwUW9zQ29udGV4dC0+bGFzdFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9TVUNDRVNTOworICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKworICAgICAgLy8gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGZsb3cKKyAgICAgIGhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfRkFJTFVSRV9SU1A6CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICIlczogUmVsZWFzZSBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZSBvdXIgc3RhdGUgb3IgVEwgc2luY2Ugbm90aGluZyBoYXMgY2hhbmdlZAorICAgICAgaWYgKEhERF9XTU1fSEFORExFX0lNUExJQ0lUICE9IHBRb3NDb250ZXh0LT5oYW5kbGUpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICIlczogRXhwbGljaXQgUW9zLCBub3RpZnlpbmcgdXNlcnNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgICAvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24KKyAgICAgICAgIHBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19SRUxFQVNFX0ZBSUxFRDsKKyAgICAgICAgIGhkZF93bW1fbm90aWZ5X2FwcChwUW9zQ29udGV4dCk7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUU9TX0xPU1RfSU5EOgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiJXM6IFFPUyBMb3N0IGluZGljYXRpb24gcmVjZWl2ZWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgIC8vIGN1cnJlbnQgVFNQRUMgaXMgbm8gbG9uZ2VyIHZhbGlkCisgICAgICBwQWMtPndtbUFjVHNwZWNWYWxpZCA9IFZPU19GQUxTRTsKKworICAgICAgLy8gbmVlZCB0byB0ZWxsIFRMIHRvIHVwZGF0ZSBpdHMgVUFQU0QgaGFuZGxpbmcKKyAgICAgIGhkZF93bW1fZGlzYWJsZV90bF91YXBzZChwUW9zQ29udGV4dCk7CisKKyAgICAgIGlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCA9PSBwUW9zQ29udGV4dC0+aGFuZGxlKQorICAgICAgeworICAgICAgICAgLy8gd2Ugbm8gbG9uZ2VyIGhhdmUgaW1wbGljaXQgYWNjZXNzIGdyYW50ZWQKKyAgICAgICAgIHBBYy0+d21tQWNBY2Nlc3NHcmFudGVkID0gVk9TX0ZBTFNFOworICAgICAgICAgcEFjLT53bW1BY0FjY2Vzc0ZhaWxlZCA9IFZPU19GQUxTRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgICAgICIlczogRXhwbGljaXQgUW9zLCBub3RpZnlpbmcgdXNlcnNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgICAvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXBwbGljYXRpb24KKyAgICAgICAgIHBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19MT1NUOworICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKworICAgICAgLy8gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGZsb3cKKyAgICAgIGhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUkVRX1BFTkRJTkdfUlNQOgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgIiVzOiBSZWxlYXNlIHBlbmRpbmciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAvLyBub3QgYSBjYWxsYmFjayBzdGF0dXMgLS0gaWdub3JlIGlmIHdlIGdldCBpdAorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfUkVMRUFTRV9JTlZBTElEX1BBUkFNU19SU1A6CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IFJlbGVhc2UgSW52YWxpZCBQYXJhbXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICBpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgIT0gcFFvc0NvbnRleHQtPmhhbmRsZSkKKyAgICAgIHsKKyAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbgorICAgICAgICAgcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1JFTEVBU0VfRkFJTEVEX0JBRF9QQVJBTTsKKyAgICAgICAgIGhkZF93bW1fbm90aWZ5X2FwcChwUW9zQ29udGV4dCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19JTkQ6CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAiJXM6IE1vZGlmaWNhdGlvbiBpcyBjb21wbGV0ZSwgbm90aWZ5IFRMIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAvLyB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhIFRTUEVDIHJldHVybmVkIHdpdGggdGhpcyBzdGF0dXMsIGV2ZW4gaWYKKyAgICAgIC8vIGEgVFNQRUMgaXMgbm90IGV4Y2hhbmdlZCBPVEEKKyAgICAgIGlmIChwQ3VycmVudFFvc0luZm8pCisgICAgICB7CisgICAgICAgICBwQWMtPndtbUFjVHNwZWNWYWxpZCA9IFZPU19UUlVFOworICAgICAgICAgbWVtY3B5KCZwQWMtPndtbUFjVHNwZWNJbmZvLAorICAgICAgICAgICAgICAgIHBDdXJyZW50UW9zSW5mbywKKyAgICAgICAgICAgICAgICBzaXplb2YocEFjLT53bW1BY1RzcGVjSW5mbykpOworICAgICAgfQorCisgICAgICBpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgIT0gcFFvc0NvbnRleHQtPmhhbmRsZSkKKyAgICAgIHsKKyAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbgorICAgICAgICAgcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9TVUNDRVNTOworICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKworICAgICAgLy8gbm90aWZ5IFRMIHRvIGVuYWJsZSB0cmlnZ2VyIGZyYW1lcyBpZiBuZWNlc3NhcnkKKyAgICAgIGhkZF93bW1fZW5hYmxlX3RsX3VhcHNkKHBRb3NDb250ZXh0KTsKKworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWToKKyAgICAgIGlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAhPSBwUW9zQ29udGV4dC0+aGFuZGxlKQorICAgICAgeworICAgICAgICAgLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IGFuIGFwcGxpY2F0aW9uCisgICAgICAgICBwUW9zQ29udGV4dC0+bGFzdFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX1NVQ0NFU1NfTk9fQUNNX1VBUFNEX0VYSVNUSU5HOworICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDoKKyAgICAgIC8vIHRoZSBmbG93IG1vZGlmaWNhdGlvbiBmYWlsZWQgc28gd2UnbGwgbGVhdmUgaW4gcGxhY2UKKyAgICAgIC8vIHdoYXRldmVyIGV4aXN0ZWQgYmVmb3JlaGFuZAorCisgICAgICBpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgIT0gcFFvc0NvbnRleHQtPmhhbmRsZSkKKyAgICAgIHsKKyAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbgorICAgICAgICAgcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9GQUlMRUQ7CisgICAgICAgICBoZGRfd21tX25vdGlmeV9hcHAocFFvc0NvbnRleHQpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1BFTkRJTkdfUlNQOgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgIiVzOiBtb2RpZmljYXRpb24gcGVuZGluZyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIC8vIG5vdCBhIGNhbGxiYWNrIHN0YXR1cyAtLSBpZ25vcmUgaWYgd2UgZ2V0IGl0CisgICAgICBicmVhazsKKworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1A6CisgICAgICAvLyB0aGUgZmxvdyBtb2RpZmljYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IG5vIFFvUyBjaGFuZ2VzIHJlcXVpcmVkCisKKyAgICAgIGlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAhPSBwUW9zQ29udGV4dC0+aGFuZGxlKQorICAgICAgeworICAgICAgICAgLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IGFuIGFwcGxpY2F0aW9uCisgICAgICAgICBwUW9zQ29udGV4dC0+bGFzdFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX1NVQ0NFU1NfTk9fQUNNX05PX1VBUFNEOworICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9JTlZBTElEX1BBUkFNU19SU1A6CisgICAgICAvLyBpbnZhbGlkIHBhcmFtcyAtLSBub3RpZnkgdGhlIGFwcGxpY2F0aW9uCisgICAgICBpZiAoSEREX1dNTV9IQU5ETEVfSU1QTElDSVQgIT0gcFFvc0NvbnRleHQtPmhhbmRsZSkKKyAgICAgIHsKKyAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCBieSBhbiBhcHBsaWNhdGlvbgorICAgICAgICAgcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9GQUlMRURfQkFEX1BBUkFNOworICAgICAgICAgaGRkX3dtbV9ub3RpZnlfYXBwKHBRb3NDb250ZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX0lORF9BUFNEX1BFTkRJTkc6CisgICAgICAvLyBub3RoaW5nIHRvIGRvIGZvciBub3cuICB3aGVuIEFQU0QgaXMgZXN0YWJsaXNoZWQgd2UnbGwgaGF2ZSB3b3JrIHRvIGRvCisgICAgICBicmVhazsKKworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9TRVRfRkFJTEVEOgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBNb2RpZnkgc3VjY2Vzc2Z1bCBidXQgVS1BUFNEIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgLy8gUW9TIG1vZGlmaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgc2V0dGluZyBVPUFQU0QgZmFpbGVkLgorICAgICAgLy8gVGhpcyB3aWxsIGFsd2F5cyBiZSBhbiBleHBsaWNpdCBRb1MgaW5zdGFuY2UsIHNvIGFsbCB3ZSBjYW4KKyAgICAgIC8vIGRvIGlzIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gYW5kIGxldCBpdCBjbGVhbiB1cC4KKyAgICAgIGlmIChIRERfV01NX0hBTkRMRV9JTVBMSUNJVCAhPSBwUW9zQ29udGV4dC0+aGFuZGxlKQorICAgICAgeworICAgICAgICAgLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IGFuIGFwcGxpY2F0aW9uCisgICAgICAgICBwUW9zQ29udGV4dC0+bGFzdFN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX1VBUFNEX1NFVF9GQUlMRUQ7CisgICAgICAgICBoZGRfd21tX25vdGlmeV9hcHAocFFvc0NvbnRleHQpOworICAgICAgfQorCisgICAgICAvLyBTaW5jZSBVLUFQU0QgcG9ydGlvbiBmYWlsZWQgZGlzYWJsZWQgdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uCisgICAgICBoZGRfd21tX2Rpc2FibGVfdGxfdWFwc2QocFFvc0NvbnRleHQpOworCisgICAgICBicmVhazsKKworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19IQU5ESU5HX09GRjoKKyAgICAgIC8vIG5vIHJvYW1pbmcgc28gd2Ugd29uJ3Qgc2VlIHRoaXMKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX09VVF9PRl9BUFNEX1BPV0VSX01PREVfSU5EOgorICAgICAgLy8gbmVlZCB0byB0ZWxsIFRMIHRvIHN0b3AgdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uCisgICAgICBoZGRfd21tX2Rpc2FibGVfdGxfdWFwc2QocFFvc0NvbnRleHQpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfSU5UT19BUFNEX1BPV0VSX01PREVfSU5EOgorICAgICAgLy8gbmVlZCB0byB0ZWxsIFRMIHRvIHN0YXJ0IHNlbmRpbmcgdHJpZ2dlciBmcmFtZXMgYWdhaW4KKyAgICAgIGhkZF93bW1fZW5hYmxlX3RsX3VhcHNkKHBRb3NDb250ZXh0KTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IHVuZXhwZWN0ZWQgU01FIFN0YXR1cz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzbWVTdGF0dXMgKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICB9CisKKyAgIC8vIG91ciBhY2Nlc3MgdG8gdGhlIHBhcnRpY3VsYXIgYWNjZXNzIGNhdGVnb3J5IG1heSBoYXZlIGNoYW5nZWQuCisgICAvLyBzb21lIG9mIHRoZSBpbXBsaWNpdCBRb1MgY2FzZXMgYWJvdmUgbWF5IGhhdmUgYWxyZWFkeSBzZXQgdGhpcworICAgLy8gcHJpb3IgdG8gaW52b2tpbmcgVEwgKHNvIHRoYXQgd2Ugd2lsbCBwcm9wZXJseSBzZXJ2aWNlIHRoZQorICAgLy8gVHggcXVldWVzKSBidXQgbGV0J3MgY29uc2lzdGVudGx5IGhhbmRsZSBhbGwgY2FzZXMgaGVyZQorICAgcEFjLT53bW1BY0FjY2Vzc0FsbG93ZWQgPSBoZGRfd21tX2lzX2FjY2Vzc19hbGxvd2VkKHBBZGFwdGVyLCBwQWMpOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlczogY29tcGxldGUsIGFjY2VzcyBmb3IgVEwgQUMgJWQgaXMlc2FsbG93ZWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICBhY1R5cGUsCisgICAgICAgICAgICAgcEFjLT53bW1BY0FjY2Vzc0FsbG93ZWQgPyAiICIgOiAiIG5vdCAiKTsKKworICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3dtbV9kb19pbXBsaWNpdF9xb3MoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBzZXR1cAorICBRb1MgZm9yIGFueSBBQyByZXF1aXJpbmcgaXQKKworICBAcGFyYW0gd29yayAgICAgOiBbaW5dICBwb2ludGVyIHRvIHdvcmsgc3RydWN0dXJlCisKKyAgQHJldHVybiAgICAgICAgIDogdm9pZAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgaGRkX3dtbV9kb19pbXBsaWNpdF9xb3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworICAgaGRkX3dtbV9xb3NfY29udGV4dF90KiBwUW9zQ29udGV4dCA9CisgICAgICBjb250YWluZXJfb2Yod29yaywgaGRkX3dtbV9xb3NfY29udGV4dF90LCB3bW1BY1NldHVwSW1wbGljaXRRb3MpOworICAgaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXI7CisgICBXTEFOVExfQUNFbnVtVHlwZSBhY1R5cGU7CisgICBoZGRfd21tX2FjX3N0YXR1c190ICpwQWM7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICBzbWVfUW9zU3RhdHVzVHlwZSBzbWVTdGF0dXM7CisjZW5kaWYKKyAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gcW9zSW5mbzsKKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgIiVzOiBFbnRlcmVkLCBjb250ZXh0ICVwIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBRb3NDb250ZXh0KTsKKworICAgaWYgKHVubGlrZWx5KEhERF9XTU1fQ1RYX01BR0lDICE9IHBRb3NDb250ZXh0LT5tYWdpYykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgUW9TIENvbnRleHQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBBZGFwdGVyID0gcFFvc0NvbnRleHQtPnBBZGFwdGVyOworICAgYWNUeXBlID0gcFFvc0NvbnRleHQtPmFjVHlwZTsKKyAgIHBBYyA9ICZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV07CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICIlczogcEFkYXB0ZXIgJXAgYWNUeXBlICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBBZGFwdGVyLCBhY1R5cGUpOworCisgICBpZiAoIXBBYy0+d21tQWNBY2Nlc3NOZWVkZWQpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IEFDICVkIGRvZXNuJ3QgbmVlZCBzZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFjVHlwZSk7CisgICAgICBwUW9zQ29udGV4dC0+bWFnaWMgPSAwOworICAgICAga2ZyZWUocFFvc0NvbnRleHQpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwQWMtPndtbUFjQWNjZXNzUGVuZGluZyA9IFZPU19UUlVFOworICAgcEFjLT53bW1BY0FjY2Vzc05lZWRlZCA9IFZPU19GQUxTRTsKKworICAgbWVtc2V0KCZxb3NJbmZvLCAwLCBzaXplb2YocW9zSW5mbykpOworCisgICBzd2l0Y2ggKGFjVHlwZSkKKyAgIHsKKyAgIGNhc2UgV0xBTlRMX0FDX1ZPOgorICAgICAgcW9zSW5mby50c19pbmZvLnVwID0gU01FX1FPU19XTU1fVVBfVk87CisgICAgICBxb3NJbmZvLnRzX2luZm8ucHNiID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+VWFwc2RNYXNrICYgMHgwMTsKKyAgICAgIHFvc0luZm8udHNfaW5mby5kaXJlY3Rpb24gPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYURpckFjVm87CisgICAgICBxb3NJbmZvLnRzX2luZm8udGlkID0gMjU1OworICAgICAgcW9zSW5mby5tZWFuX2RhdGFfcmF0ZSA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhTWVhbkRhdGFSYXRlQWNWbzsKKyAgICAgIHFvc0luZm8ubWluX3BoeV9yYXRlID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+SW5mcmFNaW5QaHlSYXRlQWNWbzsKKyAgICAgIHFvc0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYVVhcHNkVm9TcnZJbnR2OworICAgICAgcW9zSW5mby5ub21pbmFsX21zZHVfc2l6ZSA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhTm9tTXNkdVNpemVBY1ZvOworICAgICAgcW9zSW5mby5zdXJwbHVzX2J3X2FsbG93YW5jZSA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhU2JhQWNWbzsKKyAgICAgIHFvc0luZm8uc3VzcGVuc2lvbl9pbnRlcnZhbCA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhVWFwc2RWb1N1c3BJbnR2OworICAgICAgYnJlYWs7CisgICBjYXNlIFdMQU5UTF9BQ19WSToKKyAgICAgIHFvc0luZm8udHNfaW5mby51cCA9IFNNRV9RT1NfV01NX1VQX1ZJOworICAgICAgcW9zSW5mby50c19pbmZvLnBzYiA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPlVhcHNkTWFzayAmIDB4MDI7CisgICAgICBxb3NJbmZvLnRzX2luZm8uZGlyZWN0aW9uID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+SW5mcmFEaXJBY1ZpOworICAgICAgcW9zSW5mby50c19pbmZvLnRpZCA9IDI1NTsKKyAgICAgIHFvc0luZm8ubWVhbl9kYXRhX3JhdGUgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYU1lYW5EYXRhUmF0ZUFjVmk7CisgICAgICBxb3NJbmZvLm1pbl9waHlfcmF0ZSA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhTWluUGh5UmF0ZUFjVmk7CisgICAgICBxb3NJbmZvLm1pbl9zZXJ2aWNlX2ludGVydmFsID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+SW5mcmFVYXBzZFZpU3J2SW50djsKKyAgICAgIHFvc0luZm8ubm9taW5hbF9tc2R1X3NpemUgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYU5vbU1zZHVTaXplQWNWaTsKKyAgICAgIHFvc0luZm8uc3VycGx1c19id19hbGxvd2FuY2UgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYVNiYUFjVmk7CisgICAgICBxb3NJbmZvLnN1c3BlbnNpb25faW50ZXJ2YWwgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYVVhcHNkVmlTdXNwSW50djsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgIGNhc2UgV0xBTlRMX0FDX0JFOgorICAgICAgcW9zSW5mby50c19pbmZvLnVwID0gU01FX1FPU19XTU1fVVBfQkU7CisgICAgICBxb3NJbmZvLnRzX2luZm8ucHNiID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+VWFwc2RNYXNrICYgMHgwODsKKyAgICAgIHFvc0luZm8udHNfaW5mby5kaXJlY3Rpb24gPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYURpckFjQmU7CisgICAgICBxb3NJbmZvLnRzX2luZm8udGlkID0gMjU1OworICAgICAgcW9zSW5mby5tZWFuX2RhdGFfcmF0ZSA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhTWVhbkRhdGFSYXRlQWNCZTsKKyAgICAgIHFvc0luZm8ubWluX3BoeV9yYXRlID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+SW5mcmFNaW5QaHlSYXRlQWNCZTsKKyAgICAgIHFvc0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYVVhcHNkQmVTcnZJbnR2OworICAgICAgcW9zSW5mby5ub21pbmFsX21zZHVfc2l6ZSA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhTm9tTXNkdVNpemVBY0JlOworICAgICAgcW9zSW5mby5zdXJwbHVzX2J3X2FsbG93YW5jZSA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhU2JhQWNCZTsKKyAgICAgIHFvc0luZm8uc3VzcGVuc2lvbl9pbnRlcnZhbCA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhVWFwc2RCZVN1c3BJbnR2OworICAgICAgYnJlYWs7CisgICBjYXNlIFdMQU5UTF9BQ19CSzoKKyAgICAgIHFvc0luZm8udHNfaW5mby51cCA9IFNNRV9RT1NfV01NX1VQX0JLOworICAgICAgcW9zSW5mby50c19pbmZvLnBzYiA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPlVhcHNkTWFzayAmIDB4MDQ7CisgICAgICBxb3NJbmZvLnRzX2luZm8uZGlyZWN0aW9uID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+SW5mcmFEaXJBY0JrOworICAgICAgcW9zSW5mby50c19pbmZvLnRpZCA9IDI1NTsKKyAgICAgIHFvc0luZm8ubWVhbl9kYXRhX3JhdGUgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYU1lYW5EYXRhUmF0ZUFjQms7CisgICAgICBxb3NJbmZvLm1pbl9waHlfcmF0ZSA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhTWluUGh5UmF0ZUFjQms7CisgICAgICBxb3NJbmZvLm1pbl9zZXJ2aWNlX2ludGVydmFsID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+SW5mcmFVYXBzZEJrU3J2SW50djsKKyAgICAgIHFvc0luZm8ubm9taW5hbF9tc2R1X3NpemUgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYU5vbU1zZHVTaXplQWNCazsKKyAgICAgIHFvc0luZm8uc3VycGx1c19id19hbGxvd2FuY2UgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYVNiYUFjQms7CisgICAgICBxb3NJbmZvLnN1c3BlbnNpb25faW50ZXJ2YWwgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYVVhcHNkQmtTdXNwSW50djsKKyAgICAgIGJyZWFrOworICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgIHFvc0luZm8uaW5hY3Rpdml0eV9pbnRlcnZhbCA9IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhSW5hY3Rpdml0eUludGVydmFsOworI2VuZGlmCisgICBxb3NJbmZvLnRzX2luZm8uYnVyc3Rfc2l6ZV9kZWZuID0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+YnVyc3RTaXplRGVmaW5pdGlvbjsKKworICAgc3dpdGNoICgoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT50c0luZm9BY2tQb2xpY3kpCisgICB7CisgICAgIGNhc2UgSEREX1dMQU5fV01NX1RTX0lORk9fQUNLX1BPTElDWV9OT1JNQUxfQUNLOgorICAgICAgIHFvc0luZm8udHNfaW5mby5hY2tfcG9saWN5ID0gU01FX1FPU19XTU1fVFNfQUNLX1BPTElDWV9OT1JNQUxfQUNLOworICAgICAgIGJyZWFrOworCisgICAgIGNhc2UgSEREX1dMQU5fV01NX1RTX0lORk9fQUNLX1BPTElDWV9IVF9JTU1FRElBVEVfQkxPQ0tfQUNLOgorICAgICAgIHFvc0luZm8udHNfaW5mby5hY2tfcG9saWN5ID0gU01FX1FPU19XTU1fVFNfQUNLX1BPTElDWV9IVF9JTU1FRElBVEVfQkxPQ0tfQUNLOworICAgICAgIGJyZWFrOworCisgICAgIGRlZmF1bHQ6CisgICAgICAgLy8gdW5rbm93bgorICAgICAgIHFvc0luZm8udHNfaW5mby5hY2tfcG9saWN5ID0gU01FX1FPU19XTU1fVFNfQUNLX1BPTElDWV9OT1JNQUxfQUNLOworICAgfQorCisgICBpZihxb3NJbmZvLnRzX2luZm8uYWNrX3BvbGljeSA9PSBTTUVfUU9TX1dNTV9UU19BQ0tfUE9MSUNZX0hUX0lNTUVESUFURV9CTE9DS19BQ0spCisgICB7CisgICAgIGlmKCFzbWVfUW9zSXNUU0luZm9BY2tQb2xpY3lWYWxpZCgodHBBbmlTaXJHbG9iYWwpV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLCAmcW9zSW5mbywgcEFkYXB0ZXItPnNlc3Npb25JZCkpCisgICAgIHsKKyAgICAgICBxb3NJbmZvLnRzX2luZm8uYWNrX3BvbGljeSA9IFNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfTk9STUFMX0FDSzsKKyAgICAgfQorICAgfQorCisgICBtdXRleF9sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworICAgbGlzdF9hZGQoJnBRb3NDb250ZXh0LT5ub2RlLCAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Db250ZXh0TGlzdCk7CisgICBtdXRleF91bmxvY2soJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tTG9jayk7CisKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICBzbWVTdGF0dXMgPSBzbWVfUW9zU2V0dXBSZXEoV0xBTl9IRERfR0VUX0hBTF9DVFgocEFkYXB0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFvc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX3dtbV9zbWVfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW9zSW5mby50c19pbmZvLnVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUW9zQ29udGV4dC0+cW9zRmxvd0lkKTsKKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiJXM6IHNtZV9Rb3NTZXR1cFJlcSByZXR1cm5lZCAlZCBmbG93aWQgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc21lU3RhdHVzLCBwUW9zQ29udGV4dC0+cW9zRmxvd0lkKTsKKworICAgLy8gbmVlZCB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlcyBhbmQgYWN0IGFwcHJvcHJpYXRlbHkKKyAgIHN3aXRjaCAoc21lU3RhdHVzKQorICAgeworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1A6CisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfSU5EX0FQU0RfUEVORElORzoKKyAgICAgIC8vIHNldHVwIGlzIHBlbmRpbmcsIHNvIG5vIG1vcmUgd29yayB0byBkbyBub3cuCisgICAgICAvLyBhbGwgZnVydGhlciB3b3JrIHdpbGwgYmUgZG9uZSBpbiBoZGRfd21tX3NtZV9jYWxsYmFjaygpCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAiJXM6IFNldHVwIGlzIHBlbmRpbmcsIG5vIGZ1cnRoZXIgd29yayIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgYnJlYWs7CisKKworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDoKKyAgICAgIC8vIHdlIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3aGVuIGEgcmVxdWVzdCBmYWlscyBiZWNhdXNlCisgICAgICAvLyBBUCByZWplY3RlZCBpdCB2ZXJzdXMgd2hlbiBTTUUgZW5jb3VudGVyZWQgYW4gaW50ZXJuYWwgZXJyb3IKKworICAgICAgLy8gaW4gZWl0aGVyIGNhc2UgU01FIHdvbid0IGV2ZXIgcmVmZXJlbmNlIHRoaXMgY29udGV4dCBzbworICAgICAgLy8gZnJlZSB0aGUgcmVjb3JkCisgICAgICBoZGRfd21tX2ZyZWVfY29udGV4dChwUW9zQ29udGV4dCk7CisKKyAgICAgIC8vIGZhbGwgdGhyb3VnaCBhbmQgc3RhcnQgcGFja2V0cyBmbG93aW5nCisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQOgorICAgICAgLy8gbm8gQUNNIGluIGVmZmVjdCwgbm8gbmVlZCB0byBzZXR1cCBVLUFQU0QKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZOgorICAgICAgLy8gbm8gQUNNIGluIGVmZmVjdCwgVS1BUFNEIGlzIGRlc2lyZWQgYnV0IHdhcyBhbHJlYWR5IHNldHVwCisKKyAgICAgIC8vIGZvciB0aGVzZSBjYXNlcyBldmVyeXRoaW5nIGlzIGFscmVhZHkgc2V0dXAgc28gd2UgY2FuCisgICAgICAvLyBzaWduYWwgVEwgdGhhdCBpdCBoYXMgd29yayB0byBkbworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgIiVzOiBTZXR1cCBpcyBjb21wbGV0ZSwgbm90aWZ5IFRMIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICBwQWMtPndtbUFjQWNjZXNzQWxsb3dlZCA9IFZPU19UUlVFOworICAgICAgcEFjLT53bW1BY0FjY2Vzc0dyYW50ZWQgPSBWT1NfVFJVRTsKKyAgICAgIHBBYy0+d21tQWNBY2Nlc3NQZW5kaW5nID0gVk9TX0ZBTFNFOworCisgICAgICBzdGF0dXMgPSBXTEFOVExfU1RBUGt0UGVuZGluZyggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLnN0YUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjVHlwZSApOworCisgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc2lnbmFsIFRMIGZvciBBQz0lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWNUeXBlICk7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisKKyAgIGRlZmF1bHQ6CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogdW5leHBlY3RlZCBTTUUgU3RhdHVzPSVkXG4iLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNtZVN0YXR1cyApOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgIH0KKyNlbmRpZgorCit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1faW5pdCgpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBpbml0aWFsaXplIHRoZSBXTU0gY29uZmlndWF0aW9uCisgIGFuZCBzdGF0dXMgdG8gYW4gaW5pdGlhbCBzdGF0ZS4gIFRoZSBjb25maWd1cmF0aW9uIGNhbiBsYXRlciBiZSBvdmVyd3JpdHRlbgorICB2aWEgYXBwbGljYXRpb24gQVBJcworCisgIEBwYXJhbSBwSGRkQ3R4IDogW2luXSAgcG9pbnRlciB0byBIREQgY29udGV4dAorCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjc3NmdWwKKyAgICAgICAgICAgICAgICAgIDogb3RoZXIgdmFsdWVzIGlmIGZhaWx1cmUKKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBoZGRfd21tX2luaXQgKCBoZGRfY29udGV4dF90KiBwSGRkQ3R4ICkKK3sKKyAgIHZfVThfdCBkc2NwOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAiJXM6IEVudGVyZWQiLCBfX0ZVTkNUSU9OX18pOworCisgICAvLyBEU0NQIHRvIFVzZXIgUHJpb3JpdHkgTG9va3VwIFRhYmxlCisgICBmb3IgKGRzY3AgPSAwOyBkc2NwIDw9IFdMQU5fSEREX01BWF9EU0NQOyBkc2NwKyspCisgICB7CisgICAgICBoZGRXbW1Ec2NwVG9VcE1hcFtkc2NwXSA9IFNNRV9RT1NfV01NX1VQX0JFOworICAgfQorICAgaGRkV21tRHNjcFRvVXBNYXBbOF0gID0gU01FX1FPU19XTU1fVVBfQks7CisgICBoZGRXbW1Ec2NwVG9VcE1hcFsxNl0gPSBTTUVfUU9TX1dNTV9VUF9SRVNWOworICAgaGRkV21tRHNjcFRvVXBNYXBbMjRdID0gU01FX1FPU19XTU1fVVBfRUU7CisgICBoZGRXbW1Ec2NwVG9VcE1hcFszMl0gPSBTTUVfUU9TX1dNTV9VUF9DTDsKKyAgIGhkZFdtbURzY3BUb1VwTWFwWzQwXSA9IFNNRV9RT1NfV01NX1VQX1ZJOworICAgaGRkV21tRHNjcFRvVXBNYXBbNDhdID0gU01FX1FPU19XTU1fVVBfVk87CisgICBoZGRXbW1Ec2NwVG9VcE1hcFs1Nl0gPSBTTUVfUU9TX1dNTV9VUF9OQzsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3dtbV9hZGFwdGVyX2luaXQoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgaW5pdGlhbGl6ZSB0aGUgV01NIGNvbmZpZ3VhdGlvbgorICBhbmQgc3RhdHVzIHRvIGFuIGluaXRpYWwgc3RhdGUuICBUaGUgY29uZmlndXJhdGlvbiBjYW4gbGF0ZXIgYmUgb3ZlcndyaXR0ZW4KKyAgdmlhIGFwcGxpY2F0aW9uIEFQSXMKKworICBAcGFyYW0gcEFkYXB0ZXIgOiBbaW5dICBwb2ludGVyIHRvIEFkYXB0ZXIgY29udGV4dAorCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjc3NmdWwKKyAgICAgICAgICAgICAgICAgIDogb3RoZXIgdmFsdWVzIGlmIGZhaWx1cmUKKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBoZGRfd21tX2FkYXB0ZXJfaW5pdCggaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgKQoreworICAgaGRkX3dtbV9hY19zdGF0dXNfdCAqcEFjU3RhdHVzOworICAgV0xBTlRMX0FDRW51bVR5cGUgYWNUeXBlOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAiJXM6IEVudGVyZWQiLCBfX0ZVTkNUSU9OX18pOworCisgICBwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbVFhcCA9IFZPU19GQUxTRTsKKyAgIElOSVRfTElTVF9IRUFEKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUNvbnRleHRMaXN0KTsKKyAgIG11dGV4X2luaXQoJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tTG9jayk7CisKKyAgIGZvciAoYWNUeXBlID0gMDsgYWNUeXBlIDwgV0xBTlRMX01BWF9BQzsgYWNUeXBlKyspCisgICB7CisgICAgICBwQWNTdGF0dXMgPSAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdOworICAgICAgcEFjU3RhdHVzLT53bW1BY0FjY2Vzc1JlcXVpcmVkID0gVk9TX0ZBTFNFOworICAgICAgcEFjU3RhdHVzLT53bW1BY0FjY2Vzc05lZWRlZCA9IFZPU19GQUxTRTsKKyAgICAgIHBBY1N0YXR1cy0+d21tQWNBY2Nlc3NQZW5kaW5nID0gVk9TX0ZBTFNFOworICAgICAgcEFjU3RhdHVzLT53bW1BY0FjY2Vzc0ZhaWxlZCA9IFZPU19GQUxTRTsKKyAgICAgIHBBY1N0YXR1cy0+d21tQWNBY2Nlc3NHcmFudGVkID0gVk9TX0ZBTFNFOworICAgICAgcEFjU3RhdHVzLT53bW1BY0FjY2Vzc0FsbG93ZWQgPSBWT1NfRkFMU0U7CisgICAgICBwQWNTdGF0dXMtPndtbUFjVHNwZWNWYWxpZCA9IFZPU19GQUxTRTsKKyAgICAgIHBBY1N0YXR1cy0+d21tQWNVYXBzZEluZm9WYWxpZCA9IFZPU19GQUxTRTsKKyAgIH0KKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fY2xvc2UoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgcGVyZm9ybSBhbnkgbmVjZXNzYXJ5IHdvcmsgdG8KKyAgdG8gY2xlYW4gdXAgdGhlIFdNTSBmdW5jdGlvbmFsaXR5IHByaW9yIHRvIHRoZSBrZXJuZWwgbW9kdWxlIHVubG9hZAorCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nzc2Z1bAorICAgICAgICAgICAgICAgICAgOiBvdGhlciB2YWx1ZXMgaWYgZmFpbHVyZQorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIGhkZF93bW1fYWRhcHRlcl9jbG9zZSAoIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyICkKK3sKKyAgIGhkZF93bW1fcW9zX2NvbnRleHRfdCogcFFvc0NvbnRleHQ7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICIlczogRW50ZXJlZCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIC8vIGZyZWUgYW55IGNvbnRleHQgcmVjb3JkcyB0aGF0IHdlIHN0aWxsIGhhdmUgbGlua2VkCisgICB3aGlsZSAoIWxpc3RfZW1wdHkoJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQ29udGV4dExpc3QpKQorICAgeworICAgICAgcFFvc0NvbnRleHQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUNvbnRleHRMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF93bW1fcW9zX2NvbnRleHRfdCwgbm9kZSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgaGRkX3dtbV9kaXNhYmxlX2luYWN0aXZpdHlfdGltZXIocFFvc0NvbnRleHQpOworI2VuZGlmCisgICAgICBoZGRfd21tX2ZyZWVfY29udGV4dChwUW9zQ29udGV4dCk7CisgICB9CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fY2xhc3NpZnlfcGt0KCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGNsYXNzaWZ5IGFuIE9TIHBhY2tldAorICBpbnRvIGEgV01NIEFDIGJhc2VkIG9uIGVpdGhlciA4MDIuMVEgb3IgRFNDUAorCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBza2IgICAgICA6IFtpbl0gIHBvaW50ZXIgdG8gT1MgcGFja2V0IChza19idWZmKQorICBAcGFyYW0gcEFjVHlwZSAgOiBbb3V0XSBwb2ludGVyIHRvIFdNTSBBQyB0eXBlIG9mIE9TIHBhY2tldAorCisgIEByZXR1cm4gICAgICAgICA6IE5vbmUKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfVk9JRF90IGhkZF93bW1fY2xhc3NpZnlfcGt0ICggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ0VudW1UeXBlKiBwQWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zV21tVXBUeXBlICpwVXNlclByaSkKK3sKKyAgIHVuc2lnbmVkIGNoYXIgKiBwUGt0OworICAgdW5pb24gZ2VuZXJpY19ldGhoZHIgKnBIZHI7CisgICBzdHJ1Y3QgaXBoZHIgKnBJcEhkcjsKKyAgIHVuc2lnbmVkIGNoYXIgdG9zOworICAgdW5zaWduZWQgY2hhciBkc2NwOworICAgc21lX1Fvc1dtbVVwVHlwZSB1c2VyUHJpOworICAgV0xBTlRMX0FDRW51bVR5cGUgYWNUeXBlOworCisgICAvLyB0aGlzIGNvZGUgaXMgZXhlY3V0ZWQgZm9yIGV2ZXJ5IHBhY2tldCB0aGVyZWZvcmUKKyAgIC8vIGFsbCBkZWJ1ZyBjb2RlIGlzIGtlcHQgY29uZGl0aW9uYWwKKworI2lmZGVmIEhERF9XTU1fREVCVUcKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICIlczogRW50ZXJlZCIsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYgLy8gSEREX1dNTV9ERUJVRworCisgICBwUGt0ID0gc2tiLT5kYXRhOworICAgcEhkciA9ICh1bmlvbiBnZW5lcmljX2V0aGhkciAqKXBQa3Q7CisKKyNpZmRlZiBIRERfV01NX0RFQlVHCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAiJXM6IHByb3RvL2xlbmd0aCBpcyAweCUwNHgiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcEhkci0+ZXRoX0lJLmhfcHJvdG8pOworI2VuZGlmIC8vIEhERF9XTU1fREVCVUcKKworICAgaWYgKEhERF9XTU1fQ0xBU1NJRklDQVRJT05fRFNDUCA9PSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5Qa3RDbGFzc2lmaWNhdGlvbkJhc2lzKQorICAgeworICAgICAgaWYgKHBIZHItPmV0aF9JSS5oX3Byb3RvID09IGh0b25zKEVUSF9QX0lQKSkKKyAgICAgIHsKKyAgICAgICAgIC8vIGNhc2UgMTogRXRoZXJuZXQgSUkgSVAgcGFja2V0CisgICAgICAgICBwSXBIZHIgPSAoc3RydWN0IGlwaGRyICopJnBQa3Rbc2l6ZW9mKHBIZHItPmV0aF9JSSldOworICAgICAgICAgdG9zID0gcElwSGRyLT50b3M7CisjaWZkZWYgSEREX1dNTV9ERUJVRworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgICAgIiVzOiBFdGhlcm5ldCBJSSBJUCBQYWNrZXQsIHRvcyBpcyAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0b3MpOworI2VuZGlmIC8vIEhERF9XTU1fREVCVUcKKworICAgICAgfQorICAgICAgZWxzZSBpZiAoKG50b2hzKHBIZHItPmV0aF9JSS5oX3Byb3RvKSA8IFdMQU5fTUlOX1BST1RPKSAmJgorICAgICAgICAgICAgICAgKHBIZHItPmV0aF84MDIzLmhfc25hcC5kc2FwID09IFdMQU5fU05BUF9EU0FQKSAmJgorICAgICAgICAgICAgICAgKHBIZHItPmV0aF84MDIzLmhfc25hcC5zc2FwID09IFdMQU5fU05BUF9TU0FQKSAmJgorICAgICAgICAgICAgICAgKHBIZHItPmV0aF84MDIzLmhfc25hcC5jdHJsID09IFdMQU5fU05BUF9DVFJMKSAmJgorICAgICAgICAgICAgICAgKHBIZHItPmV0aF84MDIzLmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApKSkKKyAgICAgIHsKKyAgICAgICAgIC8vIGNhc2UgMjogODAyLjMgTExDL1NOQVAgSVAgcGFja2V0CisgICAgICAgICBwSXBIZHIgPSAoc3RydWN0IGlwaGRyICopJnBQa3Rbc2l6ZW9mKHBIZHItPmV0aF84MDIzKV07CisgICAgICAgICB0b3MgPSBwSXBIZHItPnRvczsKKyNpZmRlZiBIRERfV01NX0RFQlVHCisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICAiJXM6IDgwMi4zIExMQy9TTkFQIElQIFBhY2tldCwgdG9zIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRvcyk7CisjZW5kaWYgLy8gSEREX1dNTV9ERUJVRworICAgICAgfQorICAgICAgZWxzZSBpZiAocEhkci0+ZXRoX0lJLmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMVEpKQorICAgICAgeworICAgICAgICAgLy8gVkxBTiB0YWdnZWQKKworICAgICAgICAgaWYgKHBIZHItPmV0aF9JSXYuaF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9PSBodG9ucyhFVEhfUF9JUCkpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBjYXNlIDM6IEV0aGVybmV0IElJIHZsYW4tdGFnZ2VkIElQIHBhY2tldAorICAgICAgICAgICAgcElwSGRyID0gKHN0cnVjdCBpcGhkciAqKSZwUGt0W3NpemVvZihwSGRyLT5ldGhfSUl2KV07CisgICAgICAgICAgICB0b3MgPSBwSXBIZHItPnRvczsKKyNpZmRlZiBIRERfV01NX0RFQlVHCisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6IEV0aGVybmV0IElJIFZMQU4gdGFnZ2VkIElQIFBhY2tldCwgdG9zIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRvcyk7CisjZW5kaWYgLy8gSEREX1dNTV9ERUJVRworICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiAoKG50b2hzKHBIZHItPmV0aF9JSXYuaF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bykgPCBXTEFOX01JTl9QUk9UTykgJiYKKyAgICAgICAgICAgICAgICAgIChwSGRyLT5ldGhfODAyM3YuaF9zbmFwLmRzYXAgPT0gV0xBTl9TTkFQX0RTQVApICYmCisgICAgICAgICAgICAgICAgICAocEhkci0+ZXRoXzgwMjN2Lmhfc25hcC5zc2FwID09IFdMQU5fU05BUF9TU0FQKSAmJgorICAgICAgICAgICAgICAgICAgKHBIZHItPmV0aF84MDIzdi5oX3NuYXAuY3RybCA9PSBXTEFOX1NOQVBfQ1RSTCkgJiYKKyAgICAgICAgICAgICAgICAgIChwSGRyLT5ldGhfODAyM3YuaF9wcm90byA9PSBodG9ucyhFVEhfUF9JUCkpKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gY2FzZSA0OiA4MDIuMyBMTEMvU05BUCB2bGFuLXRhZ2dlZCBJUCBwYWNrZXQKKyAgICAgICAgICAgIHBJcEhkciA9IChzdHJ1Y3QgaXBoZHIgKikmcFBrdFtzaXplb2YocEhkci0+ZXRoXzgwMjN2KV07CisgICAgICAgICAgICB0b3MgPSBwSXBIZHItPnRvczsKKyNpZmRlZiBIRERfV01NX0RFQlVHCisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6IDgwMi4zIExMQy9TTkFQIFZMQU4gdGFnZ2VkIElQIFBhY2tldCwgdG9zIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRvcyk7CisjZW5kaWYgLy8gSEREX1dNTV9ERUJVRworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLy8gZGVmYXVsdAorI2lmZGVmIEhERF9XTU1fREVCVUcKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWTEFOIHRhZ2dlZCBVbmhhbmRsZWQgUHJvdG9jb2wsIHVzaW5nIGRlZmF1bHQgdG9zIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworI2VuZGlmIC8vIEhERF9XTU1fREVCVUcKKyAgICAgICAgICAgIHRvcyA9IDA7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAgLy8gZGVmYXVsdAorI2lmZGVmIEhERF9XTU1fREVCVUcKKyAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBVbmhhbmRsZWQgUHJvdG9jb2wsIHVzaW5nIGRlZmF1bHQgdG9zIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYgLy8gSEREX1dNTV9ERUJVRworICAgICAgICAgIC8vR2l2ZSB0aGUgaGlnaGVzdCBwcmlvcml0eSB0byA4MDIuMXggcGFja2V0CisgICAgICAgICAgaWYgKHBIZHItPmV0aF9JSS5oX3Byb3RvID09IGh0b25zKEhERF9FVEhFUlRZUEVfODAyXzFfWCkpCisgICAgICAgICAgICAgIHRvcyA9IDB4QzA7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB0b3MgPSAwOworICAgICAgfQorCisgICAgICBkc2NwID0gKHRvcz4+MikgJiAweDNmOworICAgICAgdXNlclByaSA9IGhkZFdtbURzY3BUb1VwTWFwW2RzY3BdOworCisjaWZkZWYgSEREX1dNTV9ERUJVRworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiJXM6IHRvcyBpcyAlZCwgZHNjcCBpcyAlZCwgdXAgaXMgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdG9zLCBkc2NwLCB1c2VyUHJpKTsKKyNlbmRpZiAvLyBIRERfV01NX0RFQlVHCisKKyAgIH0KKyAgIGVsc2UgaWYgKEhERF9XTU1fQ0xBU1NJRklDQVRJT05fODAyXzFRID09IChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPlBrdENsYXNzaWZpY2F0aW9uQmFzaXMpCisgICB7CisgICAgICBpZiAocEhkci0+ZXRoX0lJdi5oX3ZsYW5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMVEpKQorICAgICAgeworICAgICAgICAgLy8gVkxBTiB0YWdnZWQKKyAgICAgICAgIHVzZXJQcmkgPSAobnRvaHMocEhkci0+ZXRoX0lJdi5oX3ZsYW5fVENJKT4+MTMpICYgMHg3OworI2lmZGVmIEhERF9XTU1fREVCVUcKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIiVzOiBUYWdnZWQgZnJhbWUsIFVQIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHVzZXJQcmkpOworI2VuZGlmIC8vIEhERF9XTU1fREVCVUcKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICAvLyBub3QgVkxBTiB0YWdnZWQsIHVzZSBkZWZhdWx0CisjaWZkZWYgSEREX1dNTV9ERUJVRworICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IFVudGFnZ2VkIGZyYW1lLCB1c2luZyBkZWZhdWx0IFVQIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYgLy8gSEREX1dNTV9ERUJVRworICAgICAgICAgIC8vR2l2ZSB0aGUgaGlnaGVzdCBwcmlvcml0eSB0byA4MDIuMXggcGFja2V0CisgICAgICAgICAgaWYgKHBIZHItPmV0aF9JSS5oX3Byb3RvID09IGh0b25zKEhERF9FVEhFUlRZUEVfODAyXzFfWCkpCisgICAgICAgICAgICAgIHVzZXJQcmkgPSBTTUVfUU9TX1dNTV9VUF9WTzsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHVzZXJQcmkgPSBTTUVfUU9TX1dNTV9VUF9CRTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8vIGRlZmF1bHQKKyNpZmRlZiBIRERfV01NX0RFQlVHCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IFVua25vd24gY2xhc3NpZmljYXRpb24gc2NoZW1lLCB1c2luZyBkZWZhdWx0IFVQIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworI2VuZGlmIC8vIEhERF9XTU1fREVCVUcKKyAgICAgIHVzZXJQcmkgPSBTTUVfUU9TX1dNTV9VUF9CRTsKKyAgIH0KKworICAgYWNUeXBlID0gaGRkV21tVXBUb0FjTWFwW3VzZXJQcmldOworCisjaWZkZWYgSEREX1dNTV9ERUJVRworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiJXM6IFVQIGlzICVkLCBBQyBpcyAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB1c2VyUHJpLCBhY1R5cGUpOworI2VuZGlmIC8vIEhERF9XTU1fREVCVUcKKworICAgKnBVc2VyUHJpID0gdXNlclByaTsKKyAgICpwQWNUeXBlID0gYWNUeXBlOworCisgICByZXR1cm47Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9ob3N0YXBkX3NlbGVjdF9xdXVldWUoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgY2xhc3NpZnkgdGhlIHBhY2tldAorICAgICAgICAgYWNjb3JkaW5nIHRvIGxpbnV4IHFkaXNjIGV4cGVjdGF0aW9uLgorCisKKyAgQHBhcmFtIGRldiAgICAgIDogW2luXSAgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICBAcGFyYW0gc2tiICAgICAgOiBbaW5dICBwb2ludGVyIHRvIG9zIHBhY2tldAorCisgIEByZXR1cm4gICAgICAgICA6IFFkaXNjIHF1ZXVlIGluZGV4CisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1UxNl90IGhkZF9ob3N0YXBkX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgIFdMQU5UTF9BQ0VudW1UeXBlIGFjOworICAgc21lX1Fvc1dtbVVwVHlwZSB1cCA9IFNNRV9RT1NfV01NX1VQX0JFOworICAgdl9VU0hPUlRfdCBxdWV1ZUluZGV4OworICAgdl9NQUNBRERSX3QgKnBEZXN0TWFjQWRkcmVzcyA9ICh2X01BQ0FERFJfdCopc2tiLT5kYXRhOworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAoaGRkX2FkYXB0ZXJfdCAqKW5ldGRldl9wcml2KGRldik7CisgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4ID0gV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcik7CisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpIHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX0hBTCwgcEhkZEN0eC0+cHZvc0NvbnRleHQpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgdl9VOF90IFNUQUlkOworICAgdl9VOF90ICpwU1RBSWQgPSAodl9VOF90ICopKCgodl9VOF90ICopKHNrYi0+ZGF0YSkpIC0gMSk7CisKKyAgIC8qR2V0IHRoZSBTdGF0aW9uIElEKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBoYWxUYWJsZV9GaW5kU3RhaWRCeUFkZHIocE1hYywgKHRBTklfVTggKilwRGVzdE1hY0FkZHJlc3MsICZTVEFJZCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gZmluZCByaWdodCBzdGF0aW9uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICpwU1RBSWQgPSBIRERfV0xBTl9JTlZBTElEX1NUQV9JRDsKKyAgICAgIGdvdG8gZG9uZTsKKyAgIH0KKyNlbHNlCisgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IGhkZF9zb2Z0YXBfR2V0U3RhSWQocEFkYXB0ZXIsIHBEZXN0TWFjQWRkcmVzcywgJlNUQUlkKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBmaW5kIHJpZ2h0IHN0YXRpb24iLCBfX0ZVTkNUSU9OX18pOworICAgICAgKnBTVEFJZCA9IEhERF9XTEFOX0lOVkFMSURfU1RBX0lEOworICAgICAgZ290byBkb25lOworICAgfQorI2VuZGlmIC8vRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworCisgICBzcGluX2xvY2tfYmgoICZwQWRhcHRlci0+c3RhSW5mb19sb2NrICk7CisgICBpZiAoRkFMU0UgPT0gdm9zX2lzX21hY2FkZHJfZXF1YWwoJnBBZGFwdGVyLT5hU3RhSW5mb1tTVEFJZF0ubWFjQWRkclNUQSwgcERlc3RNYWNBZGRyZXNzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBTdGF0aW9uIE1BQyBhZGRyZXNzIGRvZXMgbm90IG1hdGNoaW5nIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgKnBTVEFJZCA9IEhERF9XTEFOX0lOVkFMSURfU1RBX0lEOworICAgICAgZ290byByZWxlYXNlX2xvY2s7CisgICB9CisgICBpZiAocEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS5pc1VzZWQgJiYgcEFkYXB0ZXItPmFTdGFJbmZvW1NUQUlkXS5pc1Fvc0VuYWJsZWQgJiYgKEhERF9XTU1fVVNFUl9NT0RFX05PX1FPUyAhPSBwSGRkQ3R4LT5jZmdfaW5pLT5XbW1Nb2RlKSkKKyAgIHsKKyAgICAgIC8qIEdldCB0aGUgdXNlciBwcmlvcml0eSBmcm9tIElQIGhlYWRlciAmIGNvcnJlc3BvbmRpbmcgQUMgKi8KKyAgICAgIGhkZF93bW1fY2xhc3NpZnlfcGt0IChwQWRhcHRlciwgc2tiLCAmYWMsICZ1cCk7CisgICB9CisgICAqcFNUQUlkID0gU1RBSWQ7CisKK3JlbGVhc2VfbG9jazoKKyAgICBzcGluX3VubG9ja19iaCggJnBBZGFwdGVyLT5zdGFJbmZvX2xvY2sgKTsKK2RvbmU6CisgICBza2ItPnByaW9yaXR5ID0gdXA7CisgICBxdWV1ZUluZGV4ID0gaGRkTGludXhVcFRvQWNNYXBbc2tiLT5wcmlvcml0eV07CisKKyAgIHJldHVybiBxdWV1ZUluZGV4OworfQorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfd21tX3NlbGVjdF9xdXVldWUoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgY2xhc3NpZnkgdGhlIHBhY2tldAorICAgICAgICAgYWNjb3JkaW5nIHRvIGxpbnV4IHFkaXNjIGV4cGVjdGF0aW9uLgorCisKKyAgQHBhcmFtIGRldiAgICAgIDogW2luXSAgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICBAcGFyYW0gc2tiICAgICAgOiBbaW5dICBwb2ludGVyIHRvIG9zIHBhY2tldAorCisgIEByZXR1cm4gICAgICAgICA6IFFkaXNjIHF1ZXVlIGluZGV4CisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1UxNl90IGhkZF93bW1fc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgV0xBTlRMX0FDRW51bVR5cGUgYWM7CisgICBzbWVfUW9zV21tVXBUeXBlIHVwID0gMDsKKyAgIHZfVVNIT1JUX3QgcXVldWVJbmRleDsKKworICAgaGRkX2FkYXB0ZXJfdCAqcEFkYXB0ZXIgPSAgV0xBTl9IRERfR0VUX1BSSVZfUFRSKGRldik7CisKKyAgIC8vIGlmIHdlIGRvbid0IHdhbnQgUW9TIG9yIHRoZSBBUCBkb2Vzbid0IHN1cHBvcnQgUW9zCisgICAvLyBBbGwgdHJhZmZpYyB3aWxsIGdldCBlcXVhbCBvcHBvcnR1bml5IHRvIHRyYW5zbWl0IGRhdGEgZnJhbWVzLgorICAgaWYoIGhkZF93bW1faXNfYWN0aXZlKHBBZGFwdGVyKSApIHsKKyAgICAgIC8qIEdldCB0aGUgdXNlciBwcmlvcml0eSBmcm9tIElQIGhlYWRlciAmIGNvcnJlc3BvbmRpbmcgQUMgKi8KKyAgICAgIGhkZF93bW1fY2xhc3NpZnlfcGt0IChwQWRhcHRlciwgc2tiLCAmYWMsICZ1cCk7CisgICB9CisKKyAgIHNrYi0+cHJpb3JpdHkgPSB1cDsKKyAgIHF1ZXVlSW5kZXggPSBoZGRMaW51eFVwVG9BY01hcFtza2ItPnByaW9yaXR5XTsKKworICAgcmV0dXJuIHF1ZXVlSW5kZXg7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fYWNxdWlyZV9hY2Nlc3MoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBhY3F1aXJlCisgIGFkbWl0dGFuY2UgZm9yIGEgV01NIEFDCisKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2luXSAgcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAgQHBhcmFtIGFjVHlwZSAgIDogW2luXSAgV01NIEFDIHR5cGUgb2YgT1MgcGFja2V0CisgIEBwYXJhbSBwR3JhbnRlZCA6IFtvdXRdIHBvaW50ZXIgdG8gYm9vbGVhbiBmbGFnIHdoZW4gaW5kaWNhdGVzIGlmIGFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBncmFudGVkIG9yIG5vdAorCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjc3NmdWwKKyAgICAgICAgICAgICAgICAgIDogb3RoZXIgdmFsdWVzIGlmIGZhaWx1cmUKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3dtbV9hY3F1aXJlX2FjY2VzcyggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ0VudW1UeXBlIGFjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgKiBwR3JhbnRlZCApCit7CisgICBoZGRfd21tX3Fvc19jb250ZXh0X3QgKnBRb3NDb250ZXh0OworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAiJXM6IEVudGVyZWQgZm9yIEFDICVkIiwgX19GVU5DVElPTl9fLCBhY1R5cGUpOworCisgICBpZiAoIWhkZF93bW1faXNfYWN0aXZlKHBBZGFwdGVyKSB8fCAhKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+YkltcGxpY2l0UW9zRW5hYmxlZCkKKyAgIHsKKyAgICAgIC8vIGVpdGhlciB3ZSBkb24ndCB3YW50IFFvUyBvciB0aGUgQVAgZG9lc24ndCBzdXBwb3J0IFFvUworICAgICAgLy8gb3Igd2UgZG9uJ3Qgd2FudCB0byBkbyBpbXBsaWNpdCBRb1MKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgICIlczogUW9TIG5vdCBjb25maWd1cmVkIG9uIGJvdGggZW5kcyAiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICBwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV0ud21tQWNBY2Nlc3NBbGxvd2VkID0gVk9TX1RSVUU7CisgICAgICAqcEdyYW50ZWQgPSBWT1NfVFJVRTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIC8vIGRvIHdlIGFscmVhZHkgaGF2ZSBhbiBpbXBsaWNpdCBRb1MgcmVxdWVzdCBwZW5kaW5nIGZvciB0aGlzIEFDPworICAgaWYgKChwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV0ud21tQWNBY2Nlc3NOZWVkZWQpIHx8CisgICAgICAgKHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNUeXBlXS53bW1BY0FjY2Vzc1BlbmRpbmcpKQorICAgeworICAgICAgLy8gcmVxdWVzdCBhbHJlYWR5IHBlbmRpbmcgc28gd2UgbmVlZCB0byB3YWl0IGZvciB0aGF0IHJlc3BvbnNlCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAiJXM6IEltcGxpY2l0IFFvUyBmb3IgVEwgQUMgJWQgYWxyZWFkeSBzY2hlZHVsZWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWNUeXBlKTsKKworICAgICAgKnBHcmFudGVkID0gVk9TX0ZBTFNFOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKworICAgLy8gZGlkIHdlIGFscmVhZHkgZmFpbCB0byBlc3RhYmxpc2ggaW1wbGljaXQgUW9TIGZvciB0aGlzIEFDPworICAgLy8gKGlmIHNvLCBhY2Nlc3Mgc2hvdWxkIGhhdmUgYmVlbiBncmFudGVkIHdoZW4gdGhlIGZhaWx1cmUgd2FzIGhhbmRsZWQpCisgICBpZiAocEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdLndtbUFjQWNjZXNzRmFpbGVkKQorICAgeworICAgICAgLy8gcmVxdWVzdCBwcmV2aW91c2x5IGZhaWxlZAorICAgICAgLy8gYWxsb3cgYWNjZXNzLCBidXQgd2UnbGwgYmUgZG93bmdyYWRlZAorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgIiVzOiBJbXBsaWNpdCBRb1MgZm9yIFRMIEFDICVkIHByZXZpb3VzbHkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFjVHlwZSk7CisKKyAgICAgIHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNUeXBlXS53bW1BY0FjY2Vzc0FsbG93ZWQgPSBWT1NfVFJVRTsKKyAgICAgICpwR3JhbnRlZCA9IFZPU19UUlVFOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKworICAgLy8gd2UgbmVlZCB0byBlc3RhYmxpc2ggaW1wbGljaXQgUW9TCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlczogTmVlZCB0byBzY2hlZHVsZSBpbXBsaWNpdCBRb1MgZm9yIFRMIEFDICVkLCBwQWRhcHRlciBpcyAlcCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhY1R5cGUsIHBBZGFwdGVyKTsKKworICAgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY1R5cGVdLndtbUFjQWNjZXNzTmVlZGVkID0gVk9TX1RSVUU7CisKKyAgIHBRb3NDb250ZXh0ID0ga21hbGxvYyhzaXplb2YoKnBRb3NDb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisgICBpZiAoTlVMTCA9PSBwUW9zQ29udGV4dCkKKyAgIHsKKyAgICAgIC8vIG5vIG1lbW9yeSBmb3IgUW9TIGNvbnRleHQuICBOb3RoaW5nIHdlIGNhbiBkbyBidXQgbGV0IGRhdGEgZmxvdworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgY29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUFjU3RhdHVzW2FjVHlwZV0ud21tQWNBY2Nlc3NBbGxvd2VkID0gVk9TX1RSVUU7CisgICAgICAqcEdyYW50ZWQgPSBWT1NfVFJVRTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIHBRb3NDb250ZXh0LT5hY1R5cGUgPSBhY1R5cGU7CisgICBwUW9zQ29udGV4dC0+cEFkYXB0ZXIgPSBwQWRhcHRlcjsKKyAgIHBRb3NDb250ZXh0LT5xb3NGbG93SWQgPSAwOworICAgcFFvc0NvbnRleHQtPmhhbmRsZSA9IEhERF9XTU1fSEFORExFX0lNUExJQ0lUOworICAgcFFvc0NvbnRleHQtPm1hZ2ljID0gSEREX1dNTV9DVFhfTUFHSUM7CisgICBJTklUX1dPUksoJnBRb3NDb250ZXh0LT53bW1BY1NldHVwSW1wbGljaXRRb3MsCisgICAgICAgICAgICAgaGRkX3dtbV9kb19pbXBsaWNpdF9xb3MpOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlczogU2NoZWR1bGluZyB3b3JrIGZvciBBQyAlZCwgY29udGV4dCAlcCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhY1R5cGUsIHBRb3NDb250ZXh0KTsKKworICAgc2NoZWR1bGVfd29yaygmcFFvc0NvbnRleHQtPndtbUFjU2V0dXBJbXBsaWNpdFFvcyk7CisKKyAgIC8vIGNhbGxlciB3aWxsIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgd29yayB0YWtlcyBwbGFjZSBhbmQKKyAgIC8vIFRTUEVDIG5lZ290aWF0aW9uIGNvbXBsZXRlcworICAgKnBHcmFudGVkID0gVk9TX0ZBTFNFOworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3dtbV9hc3NvYygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBoYW5kbGUgdGhlIGhvdXNla2VlcGluZworICByZXF1aXJlZCBieSBXTU0gd2hlbiBhc3NvY2lhdGlvbiB0YWtlcyBwbGFjZQorCisgIEBwYXJhbSBwQWRhcHRlciA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBwUm9hbUluZm86IFtpbl0gIHBvaW50ZXIgdG8gcm9hbSBpbmZvcm1hdGlvbgorICBAcGFyYW0gZUJzc1R5cGUgOiBbaW5dICB0eXBlIG9mIEJTUworCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjc3NmdWwKKyAgICAgICAgICAgICAgICAgIDogb3RoZXIgdmFsdWVzIGlmIGZhaWx1cmUKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3dtbV9hc3NvYyggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyUm9hbUJzc1R5cGUgZUJzc1R5cGUgKQoreworICAgdEFOSV9VOCB1YXBzZE1hc2s7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgLy8gd2hlbiB3ZSBhc3NvY2lhdGUgd2UgbmVlZCB0byBub3RpZnkgVEwgaWYgaXQgbmVlZHMgdG8gZW5hYmxlCisgICAvLyBVQVBTRCBmb3IgYW55IGFjY2VzcyBjYXRlZ29yaWVzCisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICIlczogRW50ZXJlZCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmIChwUm9hbUluZm8tPmZSZWFzc29jUmVxKQorICAgeworICAgICAgLy8gd2hlbiB3ZSByZWFzc29jaWF0ZSB3ZSBzaG91bGQgY29udGludWUgdG8gdXNlIHdoYXRldmVyCisgICAgICAvLyBwYXJhbWV0ZXJzIHdlcmUgcHJldmlvdXNseSBlc3RhYmxpc2hlZC4gIGlmIHdlIGFyZQorICAgICAgLy8gcmVhc3NvY2lhdGluZyBkdWUgdG8gYSBVLUFQU0QgY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIKKyAgICAgIC8vIEFjY2VzcyBDYXRlZ29yeSwgdGhlbiB0aGUgY2hhbmdlIHdpbGwgYmUgY29tbXVuaWNhdGVkCisgICAgICAvLyB0byBIREQgdmlhIHRoZSBRb1MgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgorICAgICAgLy8gZmxvdywgYW5kIFUtQVBTRCBwYXJhbWV0ZXJzIHdpbGwgYmUgdXBkYXRlZCB0aGVyZQorCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAiJXM6IFJlYXNzb2Mgc28gbm8gd29yaywgRXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIC8vIGdldCB0aGUgbmVnb3RpYXRlZCBVQVBTRCBNYXNrCisgICB1YXBzZE1hc2sgPSBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPm1vZGlmeVByb2ZpbGVGaWVsZHMudWFwc2RfbWFzazsKKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgIiVzOiBVLUFQU0QgbWFzayBpcyAweCUwMngiLCBfX0ZVTkNUSU9OX18sIChpbnQpIHVhcHNkTWFzayk7CisKKyAgIGlmICh1YXBzZE1hc2sgJiBIRERfQUNfVk8pCisgICB7CisgICAgICBzdGF0dXMgPSBXTEFOVExfRW5hYmxlVUFQU0RGb3JBQyggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLnN0YUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ19WTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+SW5mcmFVYXBzZFZvU3J2SW50diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYVVhcHNkVm9TdXNwSW50diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQklfRElSICk7CisKKyAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkpOworICAgfQorCisgICBpZiAodWFwc2RNYXNrICYgSEREX0FDX1ZJKQorICAgeworICAgICAgc3RhdHVzID0gV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMoIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPnB2b3NDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfU1RBVElPTl9DVFhfUFRSKHBBZGFwdGVyKSktPmNvbm5faW5mby5zdGFJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQUNfVkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhVWFwc2RWaVNydkludHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+SW5mcmFVYXBzZFZpU3VzcEludHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0JJX0RJUiApOworCisgICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApKTsKKyAgIH0KKworICAgaWYgKHVhcHNkTWFzayAmIEhERF9BQ19CSykKKyAgIHsKKyAgICAgIHN0YXR1cyA9IFdMQU5UTF9FbmFibGVVQVBTREZvckFDKCAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5wdm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX1NUQVRJT05fQ1RYX1BUUihwQWRhcHRlcikpLT5jb25uX2luZm8uc3RhSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDX0JLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYVVhcHNkQmtTcnZJbnR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhVWFwc2RCa1N1c3BJbnR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9CSV9ESVIgKTsKKworICAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSk7CisgICB9CisKKyAgIGlmICh1YXBzZE1hc2sgJiBIRERfQUNfQkUpCisgICB7CisgICAgICBzdGF0dXMgPSBXTEFOVExfRW5hYmxlVUFQU0RGb3JBQyggKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+cHZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9TVEFUSU9OX0NUWF9QVFIocEFkYXB0ZXIpKS0+Y29ubl9pbmZvLnN0YUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ19CRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+SW5mcmFVYXBzZEJlU3J2SW50diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5JbmZyYVVhcHNkQmVTdXNwSW50diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQklfRElSICk7CisKKyAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkpOworICAgfQorCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAiJXM6IEV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKworc3RhdGljIGNvbnN0IHZfVThfdCBhY21NYXNrQml0W1dMQU5UTF9NQVhfQUNdID0KKyAgIHsKKyAgICAgIDB4NCwgLyogV0xBTlRMX0FDX0JLICovCisgICAgICAweDgsIC8qIFdMQU5UTF9BQ19CRSAqLworICAgICAgMHgyLCAvKiBXTEFOVExfQUNfVkkgKi8KKyAgICAgIDB4MSAgLyogV0xBTlRMX0FDX1ZPICovCisgICB9OworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBicmllZiBoZGRfd21tX2Nvbm5lY3QoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSBob3VzZWtlZXBpbmcKKyAgcmVxdWlyZWQgYnkgV01NIHdoZW4gYSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkCisKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2luXSAgcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAgQHBhcmFtIHBSb2FtSW5mbzogW2luXSAgcG9pbnRlciB0byByb2FtIGluZm9ybWF0aW9uCisgIEBwYXJhbSBlQnNzVHlwZSA6IFtpbl0gIHR5cGUgb2YgQlNTCisKKyAgQHJldHVybiAgICAgICAgIDogVk9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nzc2Z1bAorICAgICAgICAgICAgICAgICAgOiBvdGhlciB2YWx1ZXMgaWYgZmFpbHVyZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBoZGRfd21tX2Nvbm5lY3QoIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JSb2FtQnNzVHlwZSBlQnNzVHlwZSApCit7CisgICBpbnQgYWM7CisgICB2X0JPT0xfdCBxYXA7CisgICB2X0JPT0xfdCBxb3NDb25uZWN0aW9uOworICAgdl9VOF90IGFjbU1hc2s7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICIlczogRW50ZXJlZCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmICgoZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSA9PSBlQnNzVHlwZSkgJiYKKyAgICAgICBwUm9hbUluZm8gJiYKKyAgICAgICBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUpCisgICB7CisgICAgICBxYXAgPSBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPnFhcDsKKyAgICAgIHFvc0Nvbm5lY3Rpb24gPSBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPnFvc0Nvbm5lY3Rpb247CisgICAgICBhY21NYXNrID0gcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5hY21fbWFzazsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHFhcCA9IFZPU19UUlVFOworICAgICAgcW9zQ29ubmVjdGlvbiA9IFZPU19UUlVFOworICAgICAgYWNtTWFzayA9IDB4MDsKKyAgIH0KKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgIiVzOiBxYXAgaXMgJWQsIHFvc0Nvbm5lY3Rpb24gaXMgJWQsIGFjbU1hc2sgaXMgMHgleCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBxYXAsIHFvc0Nvbm5lY3Rpb24sIGFjbU1hc2spOworCisgICBwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbVFhcCA9IHFhcDsKKyAgIHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tUW9zQ29ubmVjdGlvbiA9IHFvc0Nvbm5lY3Rpb247CisKKyAgIGZvciAoYWMgPSAwOyBhYyA8IFdMQU5UTF9NQVhfQUM7IGFjKyspCisgICB7CisgICAgICBpZiAocWFwICYmCisgICAgICAgICAgcW9zQ29ubmVjdGlvbiAmJgorICAgICAgICAgIChhY21NYXNrICYgYWNtTWFza0JpdFthY10pKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgICAgIiVzOiBhYyAlZCBvbiIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhYyk7CisKKyAgICAgICAgIC8vIGFkbWlzc2lvbiBpcyByZXF1aXJlZAorICAgICAgICAgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10ud21tQWNBY2Nlc3NSZXF1aXJlZCA9IFZPU19UUlVFOworICAgICAgICAgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10ud21tQWNBY2Nlc3NBbGxvd2VkID0gVk9TX0ZBTFNFOworICAgICAgICAgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10ud21tQWNBY2Nlc3NHcmFudGVkID0gVk9TX0ZBTFNFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgICAgIiVzOiBhYyAlZCBvZmYiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWMpOworICAgICAgICAgLy8gYWRtaXNzaW9uIGlzIG5vdCByZXF1aXJlZCBzbyBhY2Nlc3MgaXMgYWxsb3dlZAorICAgICAgICAgcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1BY1N0YXR1c1thY10ud21tQWNBY2Nlc3NSZXF1aXJlZCA9IFZPU19GQUxTRTsKKyAgICAgICAgIHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNdLndtbUFjQWNjZXNzQWxsb3dlZCA9IFZPU19UUlVFOworICAgICAgfQorCisgICB9CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICIlczogRXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fZ2V0X3VhcHNkX21hc2soKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgY2FsY3VsYXRlIHRoZQorICBpbml0aWFsIHZhbHVlIG9mIHRoZSBVQVBTRCBtYXNrIGJhc2VkIHVwb24gdGhlIGRldmljZSBjb25maWd1cmF0aW9uCisKKyAgQHBhcmFtIHBBZGFwdGVyICA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBwVWFwc2RNYXNrOiBbaW5dICBwb2ludGVyIHRvIHdoZXJlIHRoZSBVQVBTRCBNYXNrIGlzIHRvIGJlIHN0b3JlZAorCisgIEByZXR1cm4gICAgICAgICA6IFZPU19TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjc3NmdWwKKyAgICAgICAgICAgICAgICAgIDogb3RoZXIgdmFsdWVzIGlmIGZhaWx1cmUKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgaGRkX3dtbV9nZXRfdWFwc2RfbWFzayggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBVYXBzZE1hc2sgKQoreworICAgdEFOSV9VOCB1YXBzZE1hc2s7CisKKyAgIGlmIChIRERfV01NX1VTRVJfTU9ERV9OT19RT1MgPT0gKFdMQU5fSEREX0dFVF9DVFgocEFkYXB0ZXIpKS0+Y2ZnX2luaS0+V21tTW9kZSkKKyAgIHsKKyAgICAgIC8vIG5vIFFPUyB0aGVuIG5vIFVBUFNECisgICAgICB1YXBzZE1hc2sgPSAwOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy8gc3RhcnQgd2l0aCB0aGUgZGVmYXVsdCBtYXNrCisgICAgICB1YXBzZE1hc2sgPSAoV0xBTl9IRERfR0VUX0NUWChwQWRhcHRlcikpLT5jZmdfaW5pLT5VYXBzZE1hc2s7CisKKyAgICAgIC8vIGRpc2FibGUgVUFQU0QgZm9yIGFueSBBQ3Mgd2l0aCBhIDAgU2VydmljZSBJbnRlcnZhbAorICAgICAgaWYoIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhVWFwc2RWb1NydkludHYgPT0gMCApCisgICAgICB7CisgICAgICAgICB1YXBzZE1hc2sgJj0gfkhERF9BQ19WTzsKKyAgICAgIH0KKworICAgICAgaWYoIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhVWFwc2RWaVNydkludHYgPT0gMCApCisgICAgICB7CisgICAgICAgICB1YXBzZE1hc2sgJj0gfkhERF9BQ19WSTsKKyAgICAgIH0KKworICAgICAgaWYoIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhVWFwc2RCa1NydkludHYgPT0gMCApCisgICAgICB7CisgICAgICAgICB1YXBzZE1hc2sgJj0gfkhERF9BQ19CSzsKKyAgICAgIH0KKworICAgICAgaWYoIChXTEFOX0hERF9HRVRfQ1RYKHBBZGFwdGVyKSktPmNmZ19pbmktPkluZnJhVWFwc2RCZVNydkludHYgPT0gMCApCisgICAgICB7CisgICAgICAgICB1YXBzZE1hc2sgJj0gfkhERF9BQ19CRTsKKyAgICAgIH0KKyAgIH0KKworICAgLy8gcmV0dXJuIGNhbGN1bGF0ZWQgbWFzaworICAgKnBVYXBzZE1hc2sgPSB1YXBzZE1hc2s7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1faXNfYWN0aXZlKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGRldGVybWluZSBpZiBXTU0gaXMKKyAgYWN0aXZlIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KKworICBAcGFyYW0gcEFkYXB0ZXIgIDogW2luXSAgcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKworICBAcmV0dXJuICAgICAgICAgOiBWT1NfVFJVRSBpZiBXTU0gaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgOiBWT1NfRkFMU0UgaWYgV01NIGlzIG5vdCBlbmFibGVkCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X0JPT0xfdCBoZGRfd21tX2lzX2FjdGl2ZSggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIgKQoreworICAgaWYgKCghcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Rb3NDb25uZWN0aW9uKSB8fAorICAgICAgICghcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1RYXApKQorICAgeworICAgICAgcmV0dXJuIFZPU19GQUxTRTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHJldHVybiBWT1NfVFJVRTsKKyAgIH0KK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3dtbV9hZGR0cygpIC0gRnVuY3Rpb24gd2hpY2ggd2lsbCBhZGQgYSB0cmFmZmljIHNwZWMgYXQgdGhlCisgIHJlcXVlc3Qgb2YgYW4gYXBwbGljYXRpb24KKworICBAcGFyYW0gcEFkYXB0ZXIgIDogW2luXSAgcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQKKyAgQHBhcmFtIGhhbmRsZSAgICA6IFtpbl0gIGhhbmRsZSB0byB1bmlxdWVseSBpZGVudGlmeSBhIFRTCisgIEBwYXJhbSBwVHNwZWMgICAgOiBbaW5dICBwb2ludGVyIHRvIHRoZSB0cmFmZmljIHNwZWMKKworICBAcmV0dXJuICAgICAgICAgIDogSEREX1dMQU5fV01NX1NUQVRVU18qCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitoZGRfd2xhbl93bW1fc3RhdHVzX2UgaGRkX3dtbV9hZGR0cyggaGRkX2FkYXB0ZXJfdCogcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyogcFRzcGVjICkKK3sKKyAgIGhkZF93bW1fcW9zX2NvbnRleHRfdCAqcFFvc0NvbnRleHQ7CisgICBoZGRfd2xhbl93bW1fc3RhdHVzX2Ugc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9TVUNDRVNTIDsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICBzbWVfUW9zU3RhdHVzVHlwZSBzbWVTdGF0dXM7CisjZW5kaWYKKyAgIHZfQk9PTF90IGZvdW5kID0gVk9TX0ZBTFNFOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAiJXM6IEVudGVyZWQgd2l0aCBoYW5kbGUgMHgleCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlKTsKKworICAgLy8gc2VlIGlmIGEgY29udGV4dCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBoYW5kbGUKKyAgIG11dGV4X2xvY2soJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tTG9jayk7CisgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHBRb3NDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Db250ZXh0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgbm9kZSkKKyAgIHsKKyAgICAgIGlmIChwUW9zQ29udGV4dC0+aGFuZGxlID09IGhhbmRsZSkKKyAgICAgIHsKKyAgICAgICAgIGZvdW5kID0gVk9TX1RSVUU7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKyAgIG11dGV4X3VubG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKyAgIGlmIChmb3VuZCkKKyAgIHsKKyAgICAgIC8vIHJlY29yZCB3aXRoIHRoYXQgaGFuZGxlIGFscmVhZHkgZXhpc3RzCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IFJlY29yZCBhbHJlYWR5IGV4aXN0cyB3aXRoIGhhbmRsZSAweCV4IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGhhbmRsZSk7CisKKyAgICAgIC8qIEFwcGxpY2F0aW9uIGlzIHRyeWluZyB0byBtb2RpZnkgc29tZSBvZiB0aGUgVHNwZWMgcGFyYW1zLiBBbGxvdyBpdCAqLworICAgICAgc21lU3RhdHVzID0gc21lX1Fvc01vZGlmeVJlcShXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRb3NDb250ZXh0LT5xb3NGbG93SWQpOworCisgICAgICAvLyBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYW5kIGFjdCBhcHByb3ByaWF0ZWx5CisgICAgICBzd2l0Y2ggKHNtZVN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgY2FzZSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfUEVORElOR19SU1A6CisgICAgICAgICAgc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfUEVORElORzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1A6CisgICAgICAgICAgc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19NT0RJRllfU1VDQ0VTU19OT19BQ01fTk9fVUFQU0Q7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWToKKyAgICAgICAgICBzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX01PRElGWV9TVUNDRVNTX05PX0FDTV9VQVBTRF9FWElTVElORzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfSU5WQUxJRF9QQVJBTVNfUlNQOgorICAgICAgICAgIHN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX0ZBSUxFRF9CQURfUEFSQU07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQOgorICAgICAgICAgIHN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX0ZBSUxFRDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9OT1RfUU9TX0FQX1JTUDoKKyAgICAgICAgICBzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9OT19XTU07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLy8gd2UgZGlkbid0IGdldCBiYWNrIG9uZSBvZiB0aGUgU01FX1FPU19TVEFUVVNfTU9ESUZZXyogc3RhdHVzIGNvZGVzCisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiB1bmV4cGVjdGVkIFNNRSBTdGF0dXM9JWRcbiIsIHNtZVN0YXR1cyApOworICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgcmV0dXJuIEhERF9XTEFOX1dNTV9TVEFUVVNfTU9ESUZZX0ZBSUxFRDsKKyAgICAgIH0KKworICAgICAgLy8gd2Ugd2VyZSBzdWNjZXNzZnVsLCBzYXZlIHRoZSBzdGF0dXMKKyAgICAgIHBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gc3RhdHVzOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgcFFvc0NvbnRleHQgPSBrbWFsbG9jKHNpemVvZigqcFFvc0NvbnRleHQpLCBHRlBfS0VSTkVMKTsKKyAgIGlmIChOVUxMID09IHBRb3NDb250ZXh0KQorICAgeworICAgICAgLy8gbm8gbWVtb3J5IGZvciBRb1MgY29udGV4dC4gIE5vdGhpbmcgd2UgY2FuIGRvCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBRb1MgY29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gSEREX1dMQU5fV01NX1NUQVRVU19JTlRFUk5BTF9GQUlMVVJFOworICAgfQorCisgICAvLyB3ZSBhc3N1bWUgdGhlIHRzcGVjIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGJ5IHRoZSBjYWxsZXIKKworICAgcFFvc0NvbnRleHQtPmhhbmRsZSA9IGhhbmRsZTsKKyAgIHBRb3NDb250ZXh0LT5hY1R5cGUgPSBoZGRXbW1VcFRvQWNNYXBbcFRzcGVjLT50c19pbmZvLnVwXTsKKyAgIHBRb3NDb250ZXh0LT5wQWRhcHRlciA9IHBBZGFwdGVyOworICAgcFFvc0NvbnRleHQtPnFvc0Zsb3dJZCA9IDA7CisgICBwUW9zQ29udGV4dC0+bWFnaWMgPSBIRERfV01NX0NUWF9NQUdJQzsKKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiJXM6IFNldHRpbmcgdXAgUW9TLCBjb250ZXh0ICVwIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBRb3NDb250ZXh0KTsKKworICAgbXV0ZXhfbG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKyAgIGxpc3RfYWRkKCZwUW9zQ29udGV4dC0+bm9kZSwgJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQ29udGV4dExpc3QpOworICAgbXV0ZXhfdW5sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgc21lU3RhdHVzID0gc21lX1Fvc1NldHVwUmVxKFdMQU5fSEREX0dFVF9IQUxfQ1RYKHBBZGFwdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+c2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfd21tX3NtZV9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHNwZWMtPnRzX2luZm8udXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBRb3NDb250ZXh0LT5xb3NGbG93SWQpOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlczogc21lX1Fvc1NldHVwUmVxIHJldHVybmVkICVkIGZsb3dpZCAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzbWVTdGF0dXMsIHBRb3NDb250ZXh0LT5xb3NGbG93SWQpOworCisgICAvLyBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYW5kIGFjdCBhcHByb3ByaWF0ZWx5CisgICBzd2l0Y2ggKHNtZVN0YXR1cykKKyAgIHsKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQOgorICAgICAgc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9QRU5ESU5HOworICAgICAgYnJlYWs7CisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQOgorICAgICAgc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19VQVBTRDsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFk6CisgICAgICBzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX1VBUFNEX0VYSVNUSU5HOworICAgICAgYnJlYWs7CisgICBjYXNlIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfSU5EX0FQU0RfUEVORElORzoKKyAgICAgIHN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfUEVORElORzsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9JTlZBTElEX1BBUkFNU19SU1A6CisgICAgICBoZGRfd21tX2ZyZWVfY29udGV4dChwUW9zQ29udGV4dCk7CisgICAgICByZXR1cm4gSEREX1dMQU5fV01NX1NUQVRVU19TRVRVUF9GQUlMRURfQkFEX1BBUkFNOworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDoKKyAgICAgIC8vIHdlIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3aGVuIGEgcmVxdWVzdCBmYWlscyBiZWNhdXNlCisgICAgICAvLyBBUCByZWplY3RlZCBpdCB2ZXJzdXMgd2hlbiBTTUUgZW5jb3VudGVyZCBhbiBpbnRlcm5hbCBlcnJvcgorICAgICAgaGRkX3dtbV9mcmVlX2NvbnRleHQocFFvc0NvbnRleHQpOworICAgICAgcmV0dXJuIEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfRkFJTEVEOworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19TRVRVUF9OT1RfUU9TX0FQX1JTUDoKKyAgICAgIGhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKyAgICAgIHJldHVybiBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRF9OT19XTU07CisgICBkZWZhdWx0OgorICAgICAgLy8gd2UgZGlkbid0IGdldCBiYWNrIG9uZSBvZiB0aGUgU01FX1FPU19TVEFUVVNfU0VUVVBfKiBzdGF0dXMgY29kZXMKKyAgICAgIGhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiB1bmV4cGVjdGVkIFNNRSBTdGF0dXM9JWRcbiIsIHNtZVN0YXR1cyApOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBIRERfV0xBTl9XTU1fU1RBVFVTX1NFVFVQX0ZBSUxFRDsKKyAgIH0KKyNlbmRpZgorCisgICAvLyB3ZSB3ZXJlIHN1Y2Nlc3NmdWwsIHNhdmUgdGhlIHN0YXR1cworICAgcFFvc0NvbnRleHQtPmxhc3RTdGF0dXMgPSBzdGF0dXM7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF93bW1fZGVsdHMoKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZGVsZXRlIGEgdHJhZmZpYyBzcGVjIGF0IHRoZQorICByZXF1ZXN0IG9mIGFuIGFwcGxpY2F0aW9uCisKKyAgQHBhcmFtIHBBZGFwdGVyICA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBoYW5kbGUgICAgOiBbaW5dICBoYW5kbGUgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBUUworCisgIEByZXR1cm4gICAgICAgICAgOiBIRERfV0xBTl9XTU1fU1RBVFVTXyoKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2hkZF93bGFuX3dtbV9zdGF0dXNfZSBoZGRfd21tX2RlbHRzKCBoZGRfYWRhcHRlcl90KiBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IGhhbmRsZSApCit7CisgICBoZGRfd21tX3Fvc19jb250ZXh0X3QgKnBRb3NDb250ZXh0OworICAgdl9CT09MX3QgZm91bmQgPSBWT1NfRkFMU0U7CisgICBXTEFOVExfQUNFbnVtVHlwZSBhY1R5cGUgPSAwOworICAgdl9VMzJfdCBxb3NGbG93SWQgPSAwOworICAgaGRkX3dsYW5fd21tX3N0YXR1c19lIHN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfU0VUVVBfU1VDQ0VTUyA7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgc21lX1Fvc1N0YXR1c1R5cGUgc21lU3RhdHVzOworI2VuZGlmCisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICIlczogRW50ZXJlZCB3aXRoIGhhbmRsZSAweCV4IiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworCisgICAvLyBsb2NhdGUgdGhlIGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gaGFuZGxlCisgICBtdXRleF9sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwUW9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQ29udGV4dExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIG5vZGUpCisgICB7CisgICAgICBpZiAocFFvc0NvbnRleHQtPmhhbmRsZSA9PSBoYW5kbGUpCisgICAgICB7CisgICAgICAgICBmb3VuZCA9IFZPU19UUlVFOworICAgICAgICAgYWNUeXBlID0gcFFvc0NvbnRleHQtPmFjVHlwZTsKKyAgICAgICAgIHFvc0Zsb3dJZCA9IHBRb3NDb250ZXh0LT5xb3NGbG93SWQ7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKyAgIG11dGV4X3VubG9jaygmcEFkYXB0ZXItPmhkZFdtbVN0YXR1cy53bW1Mb2NrKTsKKworICAgaWYgKFZPU19GQUxTRSA9PSBmb3VuZCkKKyAgIHsKKyAgICAgIC8vIHdlIGRpZG4ndCBmaW5kIHRoZSBoYW5kbGUKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgICIlczogaGFuZGxlIDB4JXggbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworICAgICAgcmV0dXJuIEhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9GQUlMRURfQkFEX1BBUkFNOworICAgfQorCisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICIlczogZm91bmQgaGFuZGxlIDB4JXgsIGZsb3cgJWQsIEFDICVkLCBjb250ZXh0ICVwIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGhhbmRsZSwgcW9zRmxvd0lkLCBhY1R5cGUsIHBRb3NDb250ZXh0KTsKKworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgIHNtZVN0YXR1cyA9IHNtZV9Rb3NSZWxlYXNlUmVxKCBXTEFOX0hERF9HRVRfSEFMX0NUWChwQWRhcHRlciksIHFvc0Zsb3dJZCApOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAiJXM6IFNNRSBmbG93ICVkIHJlbGVhc2VkLCBTTUUgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHFvc0Zsb3dJZCwgc21lU3RhdHVzKTsKKworICAgc3dpdGNoKHNtZVN0YXR1cykKKyAgIHsKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfUkVMRUFTRV9TVUNDRVNTX1JTUDoKKyAgICAgIC8vIHRoaXMgZmxvdyBpcyB0aGUgb25seSBvbmUgb24gdGhhdCBBQywgc28gZ28gYWhlYWQgYW5kIHVwZGF0ZQorICAgICAgLy8gb3VyIFRTUEVDIHN0YXRlIGZvciB0aGUgQUMKKyAgICAgIHBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQWNTdGF0dXNbYWNUeXBlXS53bW1BY1RzcGVjVmFsaWQgPSBWT1NfRkFMU0U7CisKKyAgICAgIC8vIG5lZWQgdG8gdGVsbCBUTCB0byBzdG9wIHRyaWdnZXIgdGltZXIsIGV0YworICAgICAgaGRkX3dtbV9kaXNhYmxlX3RsX3VhcHNkKHBRb3NDb250ZXh0KTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgIC8vIGRpc2FibGUgdGhlIGluYWN0aXZpdHkgdGltZXIKKyAgICAgIGhkZF93bW1fZGlzYWJsZV9pbmFjdGl2aXR5X3RpbWVyKHBRb3NDb250ZXh0KTsKKyNlbmRpZgorICAgICAgLy8gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGNvbnRleHQKKyAgICAgIGhkZF93bW1fZnJlZV9jb250ZXh0KHBRb3NDb250ZXh0KTsKKworICAgICAgLy8gU01FIG11c3Qgbm90IGZpcmUgYW55IG1vcmUgY2FsbGJhY2tzIGZvciB0aGlzIGZsb3cgc2luY2UgdGhlIGNvbnRleHQKKyAgICAgIC8vIGlzIG5vIGxvbmdlciB2YWxpZAorCisgICAgICByZXR1cm4gSEREX1dMQU5fV01NX1NUQVRVU19SRUxFQVNFX1NVQ0NFU1M7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfUkVMRUFTRV9SRVFfUEVORElOR19SU1A6CisgICAgICAvLyBkbyBub3RoaW5nIGFzIHdlIHdpbGwgZ2V0IGEgcmVzcG9uc2UgZnJvbSBTTUUKKyAgICAgIHN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9QRU5ESU5HOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU01FX1FPU19TVEFUVVNfUkVMRUFTRV9JTlZBTElEX1BBUkFNU19SU1A6CisgICAgICAvLyBub3RoaW5nIHdlIGNhbiBkbyB3aXRoIHRoZSBleGlzdGluZyBmbG93IGV4Y2VwdCBsZWF2ZSBpdAorICAgICAgc3RhdHVzID0gSEREX1dMQU5fV01NX1NUQVRVU19SRUxFQVNFX0ZBSUxFRF9CQURfUEFSQU07CisgICAgICBicmVhazsKKworICAgY2FzZSBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQOgorICAgICAgLy8gbm90aGluZyB3ZSBjYW4gZG8gd2l0aCB0aGUgZXhpc3RpbmcgZmxvdyBleGNlcHQgbGVhdmUgaXQKKyAgICAgIHN0YXR1cyA9IEhERF9XTEFOX1dNTV9TVEFUVVNfUkVMRUFTRV9GQUlMRUQ7CisKKyAgIGRlZmF1bHQ6CisgICAgICAvLyB3ZSBkaWRuJ3QgZ2V0IGJhY2sgb25lIG9mIHRoZSBTTUVfUU9TX1NUQVRVU19SRUxFQVNFXyogc3RhdHVzIGNvZGVzCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBXTU1fVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogdW5leHBlY3RlZCBTTUUgU3RhdHVzPSVkXG4iLCBzbWVTdGF0dXMgKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICBzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX1JFTEVBU0VfRkFJTEVEOworICAgfQorCisjZW5kaWYKKyAgIHBRb3NDb250ZXh0LT5sYXN0U3RhdHVzID0gc3RhdHVzOworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX3dtbV9jaGVja3RzKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIHJldHVybiB0aGUgc3RhdHVzIG9mIGEgdHJhZmZpYworICBzcGVjIGF0IHRoZSByZXF1ZXN0IG9mIGFuIGFwcGxpY2F0aW9uCisKKyAgQHBhcmFtIHBBZGFwdGVyICA6IFtpbl0gIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0CisgIEBwYXJhbSBoYW5kbGUgICAgOiBbaW5dICBoYW5kbGUgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBUUworCisgIEByZXR1cm4gICAgICAgICAgOiBIRERfV0xBTl9XTU1fU1RBVFVTXyoKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2hkZF93bGFuX3dtbV9zdGF0dXNfZSBoZGRfd21tX2NoZWNrdHMoIGhkZF9hZGFwdGVyX3QqIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBoYW5kbGUgKQoreworICAgaGRkX3dtbV9xb3NfY29udGV4dF90ICpwUW9zQ29udGV4dDsKKyAgIGhkZF93bGFuX3dtbV9zdGF0dXNfZSBzdGF0dXMgPSBIRERfV0xBTl9XTU1fU1RBVFVTX0xPU1Q7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgV01NX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICIlczogRW50ZXJlZCB3aXRoIGhhbmRsZSAweCV4IiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworCisgICAvLyBsb2NhdGUgdGhlIGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gaGFuZGxlCisgICBtdXRleF9sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwUW9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBBZGFwdGVyLT5oZGRXbW1TdGF0dXMud21tQ29udGV4dExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIG5vZGUpCisgICB7CisgICAgICBpZiAocFFvc0NvbnRleHQtPmhhbmRsZSA9PSBoYW5kbGUpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFdNTV9UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICAiJXM6IGZvdW5kIGhhbmRsZSAweCV4LCBjb250ZXh0ICVwIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGhhbmRsZSwgcFFvc0NvbnRleHQpOworCisgICAgICAgICBzdGF0dXMgPSBwUW9zQ29udGV4dC0+bGFzdFN0YXR1czsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorICAgbXV0ZXhfdW5sb2NrKCZwQWRhcHRlci0+aGRkV21tU3RhdHVzLndtbUxvY2spOworICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL0NPUkUvSEREL3NyYy93bGFuX2hkZF93b3dsLmMgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfd293bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNDFhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfd293bC5jCkBAIC0wLDAgKzEsMzk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBAZmlsZSB3bGFuX2hkZF93b3dsLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHdsYW5faGRkX3dvd2wuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgV09XTF9QVFJOX01BWF9TSVpFICAgICAgICAgIDEyOAorI2RlZmluZSBXT1dMX1BUUk5fTUFTS19NQVhfU0laRSAgICAgIDE2CisjZGVmaW5lIFdPV0xfTUFYX1BUUk5TX0FMTE9XRUQgICAgICAgIDgKKyNkZWZpbmUgV09XTF9JTlRFUl9QVFJOX1RPS0VOSVpFUiAgICc7JworI2RlZmluZSBXT1dMX0lOVFJBX1BUUk5fVE9LRU5JWkVSICAgJzonCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGhkZF9jb250ZXh0X3MgKnBBZGFwdGVySGFuZGxlID0gTlVMTDsKKworY2hhciAqZ19oZGRfd293bF9wdHJuc1tXT1dMX01BWF9QVFJOU19BTExPV0VEXTsgLy9QYXR0ZXJucyAwLTcgCisKK3N0YXRpYyBpbnQgcGFyc2VfaGV4KHVuc2lnbmVkIGNoYXIgYykKK3sKKyAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHJldHVybiBjLScwJzsKKyAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgIHJldHVybiBjLSdhJysxMDsKKyAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgIHJldHVybiBjLSdBJysxMDsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmluZF9wdHJuX2xlbihjb25zdCBjaGFyKiBwdHJuKQoreworICBpbnQgbGVuID0gMDsKKyAgd2hpbGUgKCpwdHJuICE9ICdcMCcgJiYgKnB0cm4gIT0gV09XTF9JTlRFUl9QVFJOX1RPS0VOSVpFUikKKyAgeworICAgIGxlbisrOyBwdHJuKys7CisgIH0KKyAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgaGRkX3dvd2xfY2FsbGJhY2soIHZvaWQgKnBDb250ZXh0LCBlSGFsU3RhdHVzIGhhbFN0YXR1cyApCit7CisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAiJXM6IFJldHVybiBjb2RlID0gKCVsZClcbiIsIF9fRlVOQ1RJT05fXywgaGFsU3RhdHVzICk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaGRkX3dvd2xfcHRybih0U2lyV293bEFkZEJjYXN0UHRybiAqcHRybikKK3sKKyAgaW50IGk7CisKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiB1Y1BhdGV0cm5JZCA9IDB4JXgiLCBfX2Z1bmNfXywgCisgICAgICBwdHJuLT51Y1BhdHRlcm5JZCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogdWNQYXR0ZXJuQnl0ZU9mZnNldCA9IDB4JXgiLCBfX2Z1bmNfXywgCisgICAgICBwdHJuLT51Y1BhdHRlcm5CeXRlT2Zmc2V0KTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiB1Y1BhdHRlcm5TaXplID0gMHgleCIsIF9fZnVuY19fLCAKKyAgICAgIHB0cm4tPnVjUGF0dGVyblNpemUpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IHVjUGF0dGVybk1hc2tTaXplID0gMHgleCIsIF9fZnVuY19fLCAKKyAgICAgIHB0cm4tPnVjUGF0dGVybk1hc2tTaXplKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBQYXR0ZXJuOiAiLCBfX2Z1bmNfXyk7CisgIGZvcihpID0gMDsgaTxwdHJuLT51Y1BhdHRlcm5TaXplOyBpKyspCisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIiAlMDJYIiwgcHRybi0+dWNQYXR0ZXJuW2ldKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBQYXR0ZXJuTWFzazogIiwgX19mdW5jX18pOworICBmb3IoaSA9IDA7IGk8cHRybi0+dWNQYXR0ZXJuTWFza1NpemU7IGkrKykKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiJTAyWCIsIHB0cm4tPnVjUGF0dGVybk1hc2tbaV0pOworfQorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9hZGRfd293bF9wdHJuKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIGFkZCB0aGUgV29XTCBwYXR0ZXJuIHRvIGJlCisgIHVzZWQgd2hlbiBQQk0gZmlsdGVyaW5nIGlzIGVuYWJsZWQKKworICBAcGFyYW0gcHRybiA6IFtpbl0gIHBvaW50ZXIgdG8gdGhlIHBhdHRlcm4gc3RyaW5nIHRvIGJlIGFkZGVkCisKKyAgQHJldHVybiAgICAgOiBGQUxTRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkCisgICAgICAgICAgICAgIDogVFJVRSBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfQk9PTF90IGhkZF9hZGRfd293bF9wdHJuIChjb25zdCBjaGFyICogcHRybikgCit7CisgIHRTaXJXb3dsQWRkQmNhc3RQdHJuIGxvY2FsUGF0dGVybjsKKyAgaW50IGksIGZpcnN0X2VtcHR5X3Nsb3QsIGxlbiwgb2Zmc2V0OworICBlSGFsU3RhdHVzIGhhbFN0YXR1czsKKyAgY29uc3QgY2hhciAqdGVtcDsKKworICBsZW4gPSBmaW5kX3B0cm5fbGVuKHB0cm4pOworCisgIC8qIFRoZXJlIGhhcyB0byBoYXZlIGF0bGVhc3QgMSBieXRlIGZvciBlYWNoIGZpZWxkIChwYXR0ZXJuIHNpemUsIG1hc2sgc2l6ZSwKKyAgICogcGF0dGVybiwgbWFzaykgZS5nLiBQUDpRUTpSUjpTUyA9PT4gMTEgY2hhcnMgKi8KKyAgd2hpbGUgKCBsZW4gPj0gMTEgKSAKKyAgeworICAgIGZpcnN0X2VtcHR5X3Nsb3QgPSAtMTsKKworICAgIC8vIEZpbmQgYW4gZW1wdHkgc2xvdCB0byBzdG9yZSB0aGUgcGF0dGVybgorICAgIGZvciAoaT0wOyBpPFdPV0xfTUFYX1BUUk5TX0FMTE9XRUQ7IGkrKykKKyAgICB7CisgICAgICBpZihnX2hkZF93b3dsX3B0cm5zW2ldID09IE5VTEwpIHsKKyAgICAgICAgZmlyc3RfZW1wdHlfc2xvdCA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIHBhdHRlcm5zIGhhdmUgYmVlbiBjb25maWd1cmVkIGFscmVhZHkKKyAgICBpZihmaXJzdF9lbXB0eV9zbG90ID09IC0xKQorICAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgIiVzOiBDYW5ub3QgYWRkIGFueW1vcmUgcGF0dGVybnMuIE5vIGZyZWUgc2xvdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19GQUxTRTsKKyAgICB9CisKKyAgICAvLyBEZXRlY3QgZHVwbGljYXRlIHBhdHRlcm4KKyAgICBmb3IgKGk9MDsgaTxXT1dMX01BWF9QVFJOU19BTExPV0VEOyBpKyspCisgICAgeworICAgICAgaWYoZ19oZGRfd293bF9wdHJuc1tpXSA9PSBOVUxMKSBjb250aW51ZTsKKworICAgICAgaWYoIW1lbWNtcChwdHJuLCBnX2hkZF93b3dsX3B0cm5zW2ldLCBsZW4pKQorICAgICAgeworICAgICAgICAvLyBQYXR0ZXJuIEFscmVhZHkgY29uZmlndXJlZCwgc2tpcCB0byBuZXh0IHBhdHRlcm4KKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJUcnlpbmcgdG8gYWRkIGR1cGxpY2F0ZSBXb1dMIHBhdHRlcm4uIFNraXAgaXQhIik7CisgICAgICAgIHB0cm4gKz0gbGVuOyAKKyAgICAgICAgZ290byBuZXh0X3B0cm47CisgICAgICB9CisgICAgfQorCisgICAgLy9WYWxpZGF0ZSB0aGUgcGF0dGVybgorICAgIGlmKHB0cm5bMl0gIT0gV09XTF9JTlRSQV9QVFJOX1RPS0VOSVpFUiB8fCAKKyAgICAgICBwdHJuWzVdICE9IFdPV0xfSU5UUkFfUFRSTl9UT0tFTklaRVIpCisgICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAiJXM6IE1hbGZvcm1lZCBwYXR0ZXJuIHN0cmluZy4gU2tpcCFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBwdHJuICs9IGxlbjsgCisgICAgICBnb3RvIG5leHRfcHRybjsKKyAgICB9CisKKyAgICAvLyBFeHRyYWN0IHRoZSBwYXR0ZXJuIHNpemUKKyAgICBsb2NhbFBhdHRlcm4udWNQYXR0ZXJuU2l6ZSA9IAorICAgICAgKCBwYXJzZV9oZXgoIHB0cm5bMF0gKSAqIDB4MTAgKSArIHBhcnNlX2hleCggcHRyblsxXSApOworCisgICAgLy8gRXh0cmFjdCB0aGUgcGF0dGVybiBtYXNrIHNpemUKKyAgICBsb2NhbFBhdHRlcm4udWNQYXR0ZXJuTWFza1NpemUgPSAKKyAgICAgICggcGFyc2VfaGV4KCBwdHJuWzNdICkgKiAweDEwICkgKyBwYXJzZV9oZXgoIHB0cm5bNF0gKTsKKworICAgIGlmKGxvY2FsUGF0dGVybi51Y1BhdHRlcm5TaXplID4gV09XTF9QVFJOX01BWF9TSVpFIHx8CisgICAgICAgbG9jYWxQYXR0ZXJuLnVjUGF0dGVybk1hc2tTaXplID4gV09XTF9QVFJOX01BU0tfTUFYX1NJWkUpCisgICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAiJXM6IEludmFsaWQgbGVuZ3RoIHNwZWNpZmllZC4gU2tpcCFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBwdHJuICs9IGxlbjsgCisgICAgICBnb3RvIG5leHRfcHRybjsKKyAgICB9CisKKyAgICAvL2NvbXB1dGUgdGhlIG9mZnNldCBvZiB0b2tlbml6ZXIgYWZ0ZXIgdGhlIHBhdHRlcm4KKyAgICBvZmZzZXQgPSA1ICsgMipsb2NhbFBhdHRlcm4udWNQYXR0ZXJuU2l6ZSArIDE7CisgICAgaWYob2Zmc2V0ID49IGxlbiB8fCBwdHJuW29mZnNldF0gIT0gV09XTF9JTlRSQV9QVFJOX1RPS0VOSVpFUikgCisgICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAiJXM6IE1hbGZvcm1lZCBwYXR0ZXJuIHN0cmluZy4uc2tpcCFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBwdHJuICs9IGxlbjsgCisgICAgICBnb3RvIG5leHRfcHRybjsKKyAgICB9CisKKyAgICAvL2NvbXB1dGUgdGhlIGVuZCBvZiBwYXR0ZXJuIHNyaW5nCisgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMipsb2NhbFBhdHRlcm4udWNQYXR0ZXJuTWFza1NpemU7CisgICAgaWYob2Zmc2V0KzEgIT0gbGVuKSAvL29mZnNldCBiZWdpbnMgd2l0aCAwCisgICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAiJXM6IE1hbGZvcm1lZCBwYXR0ZXJuIHN0cmluZy4uLnNraXAhXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgcHRybiArPSBsZW47IAorICAgICAgZ290byBuZXh0X3B0cm47CisgICAgfQorCisgICAgdGVtcCA9IHB0cm47CisKKyAgICAvLyBOb3cgYWR2YW5jZSB0byB3aGVyZSBwYXR0ZXJuIGJlZ2lucyAKKyAgICBwdHJuICs9IDY7IAorCisgICAgLy8gRXh0cmFjdCB0aGUgcGF0dGVybgorICAgIGZvcihpPTA7IGkgPCBsb2NhbFBhdHRlcm4udWNQYXR0ZXJuU2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIGxvY2FsUGF0dGVybi51Y1BhdHRlcm5baV0gPSAKKyAgICAgICAgKHBhcnNlX2hleCggcHRyblswXSApICogMHgxMCApICsgcGFyc2VfaGV4KCBwdHJuWzFdICk7CisgICAgICBwdHJuICs9IDI7IC8vc2tpcCB0byBuZXh0IGJ5dGUKKyAgICB9CisKKyAgICBwdHJuKys7IC8vIFNraXAgb3ZlciB0aGUgJzonIHNlcGVyYXRvciBhZnRlciB0aGUgcGF0dGVybgorCisgICAgLy8gRXh0cmFjdCB0aGUgcGF0dGVybiBNYXNrCisgICAgZm9yKGk9MDsgaSA8IGxvY2FsUGF0dGVybi51Y1BhdHRlcm5NYXNrU2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIGxvY2FsUGF0dGVybi51Y1BhdHRlcm5NYXNrW2ldID0gCisgICAgICAgIChwYXJzZV9oZXgoIHB0cm5bMF0gKSAqIDB4MTAgKSArIHBhcnNlX2hleCggcHRyblsxXSApOworICAgICAgcHRybiArPSAyOyAvL3NraXAgdG8gbmV4dCBieXRlCisgICAgfQorCisgICAgLy9BbGwgaXMgZ29vZC4gU3RvcmUgdGhlIHBhdHRlcm4gbG9jYWxseQorICAgIGdfaGRkX3dvd2xfcHRybnNbZmlyc3RfZW1wdHlfc2xvdF0gPSAoY2hhciopIGttYWxsb2MobGVuKzEsIEdGUF9LRVJORUwpOyAKKyAgICBpZihnX2hkZF93b3dsX3B0cm5zW2ZpcnN0X2VtcHR5X3Nsb3RdID09IE5VTEwpIAorICAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgIiVzOiBrbWFsbG9jIGZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19GQUxTRTsKKyAgICB9CisKKyAgICBtZW1jcHkoZ19oZGRfd293bF9wdHJuc1tmaXJzdF9lbXB0eV9zbG90XSwgdGVtcCwgbGVuKTsKKyAgICBnX2hkZF93b3dsX3B0cm5zW2ZpcnN0X2VtcHR5X3Nsb3RdW2xlbl0gPSAnXDAnOworICAgIGxvY2FsUGF0dGVybi51Y1BhdHRlcm5JZCA9IGZpcnN0X2VtcHR5X3Nsb3Q7CisgICAgbG9jYWxQYXR0ZXJuLnVjUGF0dGVybkJ5dGVPZmZzZXQgPSAwOworCisgICAgLy8gUmVnaXN0ZXIgdGhlIHBhdHRlcm4gZG93bnN0cmVhbQorICAgIGhhbFN0YXR1cyA9IHNtZV9Xb3dsQWRkQmNhc3RQYXR0ZXJuKCBwQWRhcHRlckhhbmRsZS0+aEhhbCwgJmxvY2FsUGF0dGVybiApOworICAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyggaGFsU3RhdHVzICkgKQorICAgIHsKKyAgICAgIC8vIEFkZCBmYWlsZWQsIHNvIGludmFsaWRhdGUgdGhlIGxvY2FsIHN0b3JhZ2UKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgInNtZV9Xb3dsQWRkQmNhc3RQYXR0ZXJuIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgKCVsZCkiLCBoYWxTdGF0dXMgKTsKKyAgICAgIGtmcmVlKGdfaGRkX3dvd2xfcHRybnNbZmlyc3RfZW1wdHlfc2xvdF0pOworICAgICAgZ19oZGRfd293bF9wdHJuc1tmaXJzdF9lbXB0eV9zbG90XSA9IE5VTEw7CisgICAgfQorCisgICAgZHVtcF9oZGRfd293bF9wdHJuKCZsb2NhbFBhdHRlcm4pOworIAorIG5leHRfcHRybjoKKyAgICBpZiAoKnB0cm4gPT0gIFdPV0xfSU5URVJfUFRSTl9UT0tFTklaRVIpCisgICAgeworICAgICAgcHRybiArPSAxOyAvLyBtb3ZlIHBhc3QgdGhlIHRva2VuaXplcgorICAgICAgbGVuID0gZmluZF9wdHJuX2xlbihwdHJuKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBlbHNlIAorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gVk9TX1RSVUU7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9kZWxfd293bF9wdHJuKCkgLSBGdW5jdGlvbiB3aGljaCB3aWxsIHJlbW92ZSBhIFdvV0wgcGF0dGVybgorCisgIEBwYXJhbSBwdHJuIDogW2luXSAgcG9pbnRlciB0byB0aGUgcGF0dGVybiBzdHJpbmcgdG8gYmUgcmVtb3ZlZAorCisgIEByZXR1cm4gICAgIDogRkFMU0UgaWYgYW55IGVycm9ycyBlbmNvdW50ZXJlZAorICAgICAgICAgICAgICA6IFRSVUUgb3RoZXJ3aXNlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X0JPT0xfdCBoZGRfZGVsX3dvd2xfcHRybiAoY29uc3QgY2hhciAqIHB0cm4pIAoreworICB0U2lyV293bERlbEJjYXN0UHRybiBkZWxQYXR0ZXJuOworICB1bnNpZ25lZCBjaGFyIGlkOworICB2X0JPT0xfdCBwYXR0ZXJuRm91bmQgPSBWT1NfRkFMU0U7CisgIGVIYWxTdGF0dXMgaGFsU3RhdHVzOworCisgIC8vIERldGVjdCBwYXR0ZXJuCisgIGZvciAoaWQ9MDsgaWQ8V09XTF9NQVhfUFRSTlNfQUxMT1dFRCAmJiBnX2hkZF93b3dsX3B0cm5zW2lkXSAhPSBOVUxMOyBpZCsrKQorICB7CisgICAgaWYoIXN0cmNtcChwdHJuLCBnX2hkZF93b3dsX3B0cm5zW2lkXSkpCisgICAgeworICAgICAgcGF0dGVybkZvdW5kID0gVk9TX1RSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBJZiBwYXR0ZXJuIHByZXNlbnQsIHJlbW92ZSBpdCBmcm9tIGRvd25zdHJlYW0KKyAgaWYocGF0dGVybkZvdW5kKQorICB7CisgICAgZGVsUGF0dGVybi51Y1BhdHRlcm5JZCA9IGlkOworICAgIGhhbFN0YXR1cyA9IHNtZV9Xb3dsRGVsQmNhc3RQYXR0ZXJuKCBwQWRhcHRlckhhbmRsZS0+aEhhbCwgJmRlbFBhdHRlcm4gKTsKKyAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggaGFsU3RhdHVzICkgKQorICAgIHsKKyAgICAgIC8vIFJlbW92ZSBmcm9tIGxvY2FsIHN0b3JhZ2UgYXMgd2VsbAorICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAiRGVsZXRlZCBwYXR0ZXJuIHdpdGggaWQgJWQgWyVzXSIsIGlkLCBnX2hkZF93b3dsX3B0cm5zW2lkXSk7CisKKyAgICAgIGtmcmVlKGdfaGRkX3dvd2xfcHRybnNbaWRdKTsKKyAgICAgIGdfaGRkX3dvd2xfcHRybnNbaWRdID0gTlVMTDsKKyAgICAgIHJldHVybiBWT1NfVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFZPU19GQUxTRTsKK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2VudGVyX3dvd2woKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZW5hYmxlIFdvV0wuIEF0bGVhc3Qgb25lCisgIG9mIE1QIGFuZCBQQk0gbXVzdCBiZSBlbmFibGVkCisKKyAgQHBhcmFtIGVuYWJsZV9tcCAgOiBbaW5dIFdoZXRoZXIgdG8gZW5hYmxlIG1hZ2ljIHBhY2tldCBXb1dMIG1vZGUKKyAgQHBhcmFtIGVuYWJsZV9wYm0gOiBbaW5dIFdoZXRoZXIgdG8gZW5hYmxlIHBhdHRlcm4gYnl0ZSBtYXRjaGluZyBXb1dMIG1vZGUKKworICBAcmV0dXJuICAgICAgICAgICA6IEZBTFNFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQKKyAgICAgICAgICAgICAgICAgICAgOiBUUlVFIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9CT09MX3QgaGRkX2VudGVyX3dvd2wgKGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyLCB2X0JPT0xfdCBlbmFibGVfbXAsIHZfQk9PTF90IGVuYWJsZV9wYm0pIAoreworICB0U2lyU21lV293bEVudGVyUGFyYW1zIHdvd1BhcmFtczsKKyAgZUhhbFN0YXR1cyBoYWxTdGF0dXM7CisKKyAgd293UGFyYW1zLnVjUGF0dGVybkZpbHRlcmluZ0VuYWJsZSA9IGVuYWJsZV9wYm07CisgIHdvd1BhcmFtcy51Y01hZ2ljUGt0RW5hYmxlID0gZW5hYmxlX21wOworICBpZihlbmFibGVfbXApCisgIHsKKyAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QgKikmKHdvd1BhcmFtcy5tYWdpY1B0cm4pLAorICAgICAgICAgICAgICAgICAgICAmKHBBZGFwdGVyLT5tYWNBZGRyZXNzQ3VycmVudCkgKTsKKyAgfQorCisgIC8vIFJlcXVlc3QgdG8gcHV0IExpYnJhIGludG8gV29XTAorICBoYWxTdGF0dXMgPSBzbWVfRW50ZXJXb3dsKCBwQWRhcHRlckhhbmRsZS0+aEhhbCwgaGRkX3dvd2xfY2FsbGJhY2ssIAorICAgICAgcEFkYXB0ZXJIYW5kbGUsICZ3b3dQYXJhbXMgKTsKKworICBpZiAoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIGhhbFN0YXR1cyApICkKKyAgeworICAgIGlmICggZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgIT0gaGFsU3RhdHVzICkKKyAgICB7CisgICAgICAvLyBXZSBmYWlsZWQgdG8gZW50ZXIgV29XTAorICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAic21lX0VudGVyV293bCBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICglbGQpIiwgaGFsU3RhdHVzICk7CisgICAgICByZXR1cm4gVk9TX0ZBTFNFOworICAgIH0KKyAgfQorICByZXR1cm4gVk9TX1RSVUU7Cit9CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGJyaWVmIGhkZF9leGl0X3dvd2woKSAtIEZ1bmN0aW9uIHdoaWNoIHdpbGwgZGlzYWJsZSBXb1dMCisKKyAgQHJldHVybiAgICAgICAgICAgOiBGQUxTRSBpZiBhbnkgZXJyb3JzIGVuY291bnRlcmVkCisgICAgICAgICAgICAgICAgICAgIDogVFJVRSBvdGhlcndpc2UKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfQk9PTF90IGhkZF9leGl0X3dvd2wgKHZvaWQpIAoreworICBlSGFsU3RhdHVzIGhhbFN0YXR1czsKKworICBoYWxTdGF0dXMgPSBzbWVfRXhpdFdvd2woIHBBZGFwdGVySGFuZGxlLT5oSGFsICk7CisgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyggaGFsU3RhdHVzICkgKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgInNtZV9FeGl0V293bCBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICglbGQpIiwgaGFsU3RhdHVzICk7CisgICAgcmV0dXJuIFZPU19GQUxTRTsKKyAgfQorCisgIHJldHVybiBWT1NfVFJVRTsKK30KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAYnJpZWYgaGRkX2luaXRfd293bCgpIC0gSW5pdCBmdW5jdGlvbiB3aGljaCB3aWxsIGluaXRpYWxpemUgdGhlIFdvV0wgbW9kdWxlCisgIGFuZCBwZXJmb3JtIGFueSByZXF1aXJlZCBpbnRpYWwgY29uZmlndXJhdGlvbiAKKworICBAcmV0dXJuICAgICAgICAgICA6IEZBTFNFIGlmIGFueSBlcnJvcnMgZW5jb3VudGVyZWQKKyAgICAgICAgICAgICAgICAgICAgOiBUUlVFIG90aGVyd2lzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9CT09MX3QgaGRkX2luaXRfd293bCAodm9pZCAqcEFkYXB0ZXIpIAoreworICBwQWRhcHRlckhhbmRsZSA9IChzdHJ1Y3QgaGRkX2NvbnRleHRfcyopcEFkYXB0ZXI7CisKKyAgbWVtc2V0KGdfaGRkX3dvd2xfcHRybnMsIDAsIHNpemVvZihnX2hkZF93b3dsX3B0cm5zKSk7CisKKyAgLy9BZGQgYW55IHN0YXRpY2FsbHkgY29uZmlndXJlZCBwYXR0ZXJucyAKKyAgaGRkX2FkZF93b3dsX3B0cm4ocEFkYXB0ZXJIYW5kbGUtPmNmZ19pbmktPndvd2xQYXR0ZXJuKTsgCisKKyAgcmV0dXJuIFZPU19UUlVFOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvaW5jL2FuaUNvbXBpbGVyLmggYi9DT1JFL01BQy9pbmMvYW5pQ29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWI2YjFlCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvaW5jL2FuaUNvbXBpbGVyLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQ29tcGlsZXIgYWJzdHJhY3Rpb24gbGF5ZXIKKyAqCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEFpcmdvIE5ldHdvcmtzLCBJbmMKKyAqIFRoaXMgZmlsZSB0cmllcyB0byBhYnN0cmFjdCB0aGUgZGlmZmVyZW5jZXMgYW1vbmcgY29tcGlsZXJzLgorICogU3VwcG9ydGVkIGNvbXBpbGVycyBhcmUgOgorICoKKyAqIC0gR05VIEMvQysrIGNvbXBpbGVyCisgKiAtIE1pY3Jvc29mdCBDL0MrKyBjb21waWxlcgorICogLSBJbnRlbCBDL0MrKyBjb21waWxlcgorICoKKyAqIFdyaXR0ZW4gYnkgSG8gTGVlCisgKi8KKworI2lmbmRlZiBfX0FOSV9DT01QSUxFUl9BQlNUUkFDVF9ICisjZGVmaW5lIF9fQU5JX0NPTVBJTEVSX0FCU1RSQUNUX0gKKworLyoKKyAqIDEuIEdOVSBDL0MrKyBDb21waWxlcgorICoKKyAqIEhvdyB0byBkZXRlY3QgZ2NjIDogX19HTlVDX18KKyAqIEhvdyB0byBkZXRlY3QgZ2NjIHZlcnNpb24gOiAKKyAqICAgbWFqb3IgdmVyc2lvbiA6IF9fR05VQ19fICgyID0gMi54LCAzID0gMy54LCA0ID0gNC54KQorICogICBtaW5vciB2ZXJzaW9uIDogX19HTlVDX01JTk9SX18KKyAqCisgKiAyLiBNaWNyb3NvZnQgQy9DKysgQ29tcGlsZXIKKyAqCisgKiBIb3cgdG8gZGV0ZWN0IG1zYyA6IF9NU0NfVkVSCisgKiBIb3cgdG8gZGV0ZWN0IG1zYyB2ZXJzaW9uIDoKKyAqICAgX01TQ19WRVIgKDEyMDAgPSBNU1ZDIDYuMCwgMTMwMCA9IE1TVkMgNy4wLCAuLi4pCisgKgorICogMy4gSW50ZWwgQy9DKysgQ29tcGlsZXIKKyAqCisgKiBIb3cgdG8gZGV0ZWN0IGljYyA6IF9fSU5URUxfQ09NUElMRVIsIF9fSUNDIChsZWdhY3kpLCBfX0VDQyAobGVnYWN5KQorICogSG93IHRvIGRldGVjdCBpY2MgdmVyc2lvbiA6CisgKiAgIF9fSU5URUxfQ09NUElMRVIsIF9fSUNDLCBfX0VDQyAoNzAwID0gNy4wLCA5MDAgPSA5LjAsIC4uLikKKyAqCisgKiA0LiBPdGhlciBjb21waWxlcnMgKG5vdCBzdXBwb3J0ZWQpCisgKgorICogQm9ybGFuZCA6IF9fQk9STEFORENfXworICogR3JlZW5oaWxscyA6IF9fZ2hzCisgKiBNZXRyb3dlcmtzIDogX19NV0VSS1NfXworICogU0dJIE1JUFNwcm8gOiBfX3NnaQorICovCisKKy8qCisgKiBQYWNraW5nIGRpcmVjdGl2ZXMgOiBUaGVzZSBhcmUgdXNlZCB0byBmb3JjZSBjb21waWxlciB0byBwYWNrIGJpdHMgYW5kCisgKiBieXRlcyBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuIEMgc3RhbmRhcmQgZG9lcyBub3QgcmVndWxhdGUgdGhpcyBzdHJpY3RseSwKKyAqIGFuZCBtYW55IHRoaW5ncyBhcmUgdG8gY29tcGlsZXIgaW1wbGVtZW50YXRpb24uIE1hbnkgY29tcGlsZXJzIHN1cHBvcnQKKyAqIGNvbXBpbGVyIHNwZWNpZmljIGRpcmVjdGl2ZXMgb3Igb3B0aW9ucyB0aGF0IGFsbG93IGRpZmZlcmVudCBwYWNraW5nCisgKiBhbmQgYWxpZ25tZW50LgorICoKKyAqIEFsaWdubWVudCBkaXJlY3RpdmVzIDogQ29tcGlsZXIgbWF5IHRoaW5rIHBhY2tlZCBkYXRhIHN0cnVjdHVyZXMgaGF2ZQorICogbm8gc3BlY2lmaWMgYWxpZ25tZW50IHJlcXVpcmVtZW50LiBUaGVuIGNvbXBpbGVyIG1heSBnZW5lcmF0ZSBtdWx0aXBsZQorICogYnl0ZSBhY2Nlc3NlcyB0byBhY2Nlc3MgdHdvIGJ5dGUgb3IgZm91ciBieXRlcyBkYXRhIHN0cnVjdHVyZXMuIFRoaXMKKyAqIGFmZmVjdHMgb24gcGVyZm9ybWFuY2UgZXNwZWNpYWxseSBmb3IgUklTQyBzeXN0ZW1zLiBJZiBzb21lIGRhdGEgCisgKiBzdHJ1Y3R1cmUgaXMgbG9jYXRlZCBvbiBzcGVjaWZpYyBhbGlnbm1lbnQgYWx3YXlzLCBhbGlnbm1lbnQgZGlyZWN0aXZlcworICogaGVscCBjb21waWxlciBnZW5lcmF0ZSBtb3JlIGVmZmljaWVudCBjb2Rlcy4KKyAqLworCisjdW5kZWYgX19BTklfQ09NUElMRVJfUFJBR01BX1BBQ0tfU1RBQ0sKKyN1bmRlZiBfX0FOSV9DT01QSUxFUl9QUkFHTUFfUEFDSworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgX19BTklfQ09NUElMRVJfUFJBR01BX1BBQ0tfU1RBQ0sgICAgICAgIDEKKyNkZWZpbmUgX19BTklfQ09NUElMRVJfUFJBR01BX1BBQ0sgICAgICAgICAgICAgIDEKKyNkZWZpbmUgX19hbmlfYXR0cl9wcmVfcGFja2VkIAorI2RlZmluZSBfX2FuaV9hdHRyX3BhY2tlZCAKKyNkZWZpbmUgX19hbmlfYXR0cl9hbGlnbmVkXzIKKyNkZWZpbmUgX19hbmlfYXR0cl9hbGlnbmVkXzQKKyNkZWZpbmUgX19hbmlfYXR0cl9hbGlnbmVkXzgKKyNkZWZpbmUgX19hbmlfYXR0cl9hbGlnbmVkXzE2CisjZGVmaW5lIF9fYW5pX2F0dHJfYWxpZ25lZF8zMgorI2VsaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSB8fCBkZWZpbmVkKF9fSUNDKSB8fCBkZWZpbmVkKF9fRUNDKQorI2RlZmluZSBfX0FOSV9DT01QSUxFUl9QUkFHTUFfUEFDSyAgICAgICAgICAgICAgMQorI2RlZmluZSBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgCisjZGVmaW5lIF9fYW5pX2F0dHJfcGFja2VkIAorI2RlZmluZSBfX2FuaV9hdHRyX2FsaWduZWRfMgorI2RlZmluZSBfX2FuaV9hdHRyX2FsaWduZWRfNAorI2RlZmluZSBfX2FuaV9hdHRyX2FsaWduZWRfOAorI2RlZmluZSBfX2FuaV9hdHRyX2FsaWduZWRfMTYKKyNkZWZpbmUgX19hbmlfYXR0cl9hbGlnbmVkXzMyCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgCisjZGVmaW5lIF9fYW5pX2F0dHJfcGFja2VkICAgICAgICAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2RlZmluZSBfX2FuaV9hdHRyX2FsaWduZWRfMiAgICAgICAgICAgICAgICAgICAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyKSkpCisjZGVmaW5lIF9fYW5pX2F0dHJfYWxpZ25lZF80ICAgICAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkKKyNkZWZpbmUgX19hbmlfYXR0cl9hbGlnbmVkXzggICAgICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKQorI2RlZmluZSBfX2FuaV9hdHRyX2FsaWduZWRfMTYgICAgICAgICAgICAgICAgICAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKQorI2RlZmluZSBfX2FuaV9hdHRyX2FsaWduZWRfMzIgICAgICAgICAgICAgICAgICAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKQorI2VsaWYgZGVmaW5lZChBTklfQ09NUElMRVJfVFlQRV9SVkNUKQorLyogTm90aGluZyBkZWZpbmVkIHNvIGZhciAqLworI2RlZmluZSBfX2FuaV9hdHRyX3BhY2tlZAorI2RlZmluZSBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgICAgICAgICAgICAgICAgICAgX19wYWNrZWQKKyNkZWZpbmUgX19hbmlfYXR0cl9hbGlnbmVkXzIgICAgICAgICAgICAgICAgICAgIF9fYWxpZ24oMikKKyNkZWZpbmUgX19hbmlfYXR0cl9hbGlnbmVkXzQgICAgICAgICAgICAgICAgICAgIF9fYWxpZ24oNCkKKyNkZWZpbmUgX19hbmlfYXR0cl9hbGlnbmVkXzggICAgICAgICAgICAgICAgICAgIF9fYWxpZ24oOCkKKyNkZWZpbmUgX19hbmlfYXR0cl9hbGlnbmVkXzE2ICAgICAgICAgICAgICAgICAgIF9fYWxpZ24oMTYpCisjZGVmaW5lIF9fYW5pX2F0dHJfYWxpZ25lZF8zMiAgICAgICAgICAgICAgICAgICBfX2FsaWduKDMyKQorI2Vsc2UKKyNlcnJvciAiVW5rbm93biBjb21waWxlciIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChBTklfREFUQVBBVEhfU0VDVElPTikKKyNkZWZpbmUgIF9fRFBfU1JDX1JYICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18gICgoc2VjdGlvbigiLmRwc3JjcngiKSkpCisjZGVmaW5lICBfX0RQX1NSQ19UWCAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fICAoKHNlY3Rpb24oIi5kcHNyY3R4IikpKQorI2RlZmluZSAgX19EUF9TUkMgICAgICAgICAgICAgICAgICAgX19hdHRyaWJ1dGVfXyAgKChzZWN0aW9uKCIuZHBzcmMiKSkpCisjZGVmaW5lICBfX0FOSUhERF9NT0RVTEUgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fICAoKHNlY3Rpb24oIi5hbmloZGQiKSkpCisjZWxzZQorI2RlZmluZSAgX19EUF9TUkNfUlggCisjZGVmaW5lICBfX0RQX1NSQ19UWAorI2RlZmluZSAgX19EUF9TUkMgIAorI2RlZmluZSAgX19BTklIRERfTU9EVUxFCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL2luYy9hbmlEYmdUZXN0LmggYi9DT1JFL01BQy9pbmMvYW5pRGJnVGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MGIxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9pbmMvYW5pRGJnVGVzdC5oCkBAIC0wLDAgKzEsMTU4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0FOSURCR1RFU1RfSF8KKyNkZWZpbmUgX0FOSURCR1RFU1RfSF8KKworI2luY2x1ZGUgInNpclR5cGVzLmgiCisKKyNkZWZpbmUgTUFYX1BBUk1TX1NJWkUgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBNQVhfUkVTUE9OU0VfU0laRSAgICAgICAgICAgNTEyCisjZGVmaW5lIE1BWF9QQ0lfQ0ZHX1dSRFMgICAgICAgICAgICAxOQorI2RlZmluZSBNQVhfTlVNX1RTVF9TVEFTX1BFUl9BUCAgICAgMworCisjZGVmaW5lIEFOSV9QQ0lfQ0ZHX01JTl9HTlQgNAorI2RlZmluZSBBTklfUENJX0NGR19NQVhfTEFUIDMyCisvLy8gRUVQUk9NIFByb2R1Y3QgSWRzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgTklDcy4KKyNkZWZpbmUgRUVQX1BST0RVQ1RfSURfTVBDSV8zXzIgICAgMQorI2RlZmluZSBFRVBfUFJPRFVDVF9JRF9NUENJXzJfMiAgICAyCisjZGVmaW5lIEVFUF9QUk9EVUNUX0lEX0NBUkRCVVMgICAgIDMKKyNkZWZpbmUgRUVQX1BST0RVQ1RfSURfSEVBUF9XX0lOVCAgNAorI2RlZmluZSBFRVBfUFJPRFVDVF9JRF9IRUFQX1dfRVhUICA1CisjZGVmaW5lIEVFUF9QUk9EVUNUX0lEX01SQVAgICAgICAgIDYKKworI2RlZmluZSBBTklfQ0FSREJVU19FWFBFQ1RFRF9DSVMgXAorICAgICAgICAgICAgICAgICAgKCgoMHgzNDE2ICsgc2l6ZW9mKHRQb2xTeXN0ZW1QYXJhbWV0ZXJzKSkgPDwgMyl8MSkKKworCisvLy8gSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgdGVzdCBzdHJ1Y3R1cmUKK3R5cGVkZWYgZW51bSBzQU5JX1RFU1RfSUQKK3sKKyAgICAvLyBBbGwgRFZUIHRlc3QgSWRzLCBiZWdpbm5pbmcgd2l0aCBCTVUsIElOVCwgSElGLCBTUCwgVEZQLCBSSFAsCisgICAgLy8gUkZQLCBTWVMsIFBIWSwgU1BJLCBDWUcsIExPLCBhbmQgRUVQUk9NIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuCisgICAgQU5JX1RFU1RJRF9OT05FID0gMCwKKworICAgIC8vIFBMRUFTRSBQUkVTRVJWRSBUSEUgT1JERVI7IElGIFlPVSBORUVEIFRPIENIQU5HRS4KKyAgICAvLyBURVNUIFNDUklQVFMgREVQRU5EIE9OIFRISVMgT1JERVIuCisKKyAgICBBTklfQlVTX0FDQ0VTU19URVNULAorICAgIEFOSV9NRU1PUllfVEVTVCwKKyAgICBBTklfSU5URVJSVVBUX1RFU1QsCisgICAgQU5JX1JFR19SRUFEX1dSSVRFX1RFU1QsCisgICAgQU5JX0JNVV9JTklUX1BEVV9URVNULAorICAgIEFOSV9IQVNIX1RCTF9BRERfREVMX0dFVF9URVNUX0lELAorICAgIEFOSV9IQVNIX1RCTF9NVUxUX0VOVFJZX1RFU1RfSUQsCisKKyAgICAvLyBEYXRhIHBhdGggdGVzdHMKKyAgICBBTklfU0VORF9DT05USU5VT1VTX1RFU1QsCisgICAgQU5JX1BLVF9ST1VUSU5HX1RFU1QsCisKKyAgICBBTklfQUREX1NUQV9URVNUX0lELAorICAgIEFOSV9ERUxFVEVfU1RBX1RFU1RfSUQsCisKKyAgICAvLyBISUYgVGVzdHMKKyAgICBBTklfQlVSU1RfUkVBRF9XUklURV9URVNUX0lELAorICAgIEFOSV9NT1ZFX0FDS19URVNUX0lELAorICAgIEFOSV9SRVNFVF9XUV9URVNUX0lELAorICAgIEFOSV9ISUZfTFBCS19URVNUX0lELAorCisgICAgLy8gU1AgVGVzdHMKKworICAgIC8vIFRGUCBUZXN0cworICAgIEFOSV9CQ05fR0VOX1RFU1RfSUQsCisKKyAgICAvLyBSSFAgVGVzdHMKKworICAgIEFOSV9IQVNIX1RCTF9ERUxFVEVfVEVTVF9JRCwKKyAgICBBTklfSEFTSF9UQkxfR0VUX1RFU1RfSUQsCisKKyAgICAvLyBSSFAgVGVzdHMKKyAgICBBTklfQUdJTkdfVEVTVF9JRCwKKyAgICBBTklfQ09VTlRFUlNfVEVTVF9JRCwKKworICAgIC8vIFNZUyBUZXN0cworICAgIEFOSV9TRVRfUFJPTU9TQ09VU19NT0RFX1RFU1RfSUQsCisgICAgQU5JX1NFVF9TQ0FOX01PREVfVEVTVF9JRCwKKworICAgIC8vIFNQSSBUZXN0cworICAgIEFOSV9TRVRfQ1lHX1JFR19SRUFEX1dSSVRFX1RFU1RfSUQsCisKKyAgICAvLyBDWUcgVGVzdHMKKyAgICBBTklfU0VUX0JCX0NBTF9URVNUX0lELAorCisgICAgLy8gTE8gVGVzdHMKKyAgICBBTklfU0VUX0xPX0NIQU5fVEVTVF9JRCwKKworICAgIC8vIEVFUFJPTSBUZXN0cworCisgICAgLy8gQ2FsIHRlc3QKKyAgICBBTklfQ0FMX1RFU1RfSUQsCisKKyAgICAvLyBISUYgQnVyc3QgRE1BIHRlc3QKKyAgICBBTklfSElGX0JVUlNUX0RNQV9URVNUX0lELAorCisgICAgLy8gQWRkIGFsbCB5b3VyIHRlc3QgSWRzIGFib3ZlIHRoaXMuCisgICAgQU5JX1RFU1RTX01BWAorfSB0QU5JX1RFU1RfSUQ7CisKKy8vLyBUZXN0IElEcyBmb3IgdGVzdHMgZGlyZWN0bHkgaGFuZGxlZCBieSB0aGUgSERECit0eXBlZGVmIGVudW0gc0FOSV9IRERfVEVTVF9JRCB7CisgICAgQU5JX0hERF9URVNUU19TVEFSVCA9IDB4MTAwMDAsCisgICAgQU5JX1BDSV9DRkdfVEVTVCA9IEFOSV9IRERfVEVTVFNfU1RBUlQsCisgICAgQU5JX0VFUFJPTV9URVNULAorCisgICAgLy8gQWRkIGFsbCB5b3VyIEhERCB0ZXN0IElkcyBhYm92ZSB0aGlzLgorICAgIEFOSV9IRERfVEVTVFNfTUFYCisKK30gdEFOSV9IRERfVEVTVF9JRDsKKworLy8vIFRlc3QgdHJpZ2dlciB0eXBlcyBjYW4gYmUgZW5oYW5jZWQgd2l0aCB0aGlzIGVudW1lcmF0aW9uCit0eXBlZGVmIGVudW0gc0FOSV9URVNUX1RSSUdfVFlQRQoreworICAgIEFOSV9UUklHX1RZUEVfTk9ORSA9IDAsCisKKyAgICBBTklfVFJJR19UWVBFX0NGRywKKyAgICBBTklfVFJJR19UWVBFX1NUQVJULAorICAgIEFOSV9UUklHX1RZUEVfR0VUX1JFU1VMVFMsCisgICAgQU5JX1RSSUdfVFlQRV9TVE9QLAorCisgICAgQU5JX1RSSUdfVFlQRV9NQVgKK30gdEFOSV9URVNUX1RSSUdfVFlQRTsKKworLy8vIFRlc3Qgc3RhdGVzCit0eXBlZGVmIGVudW0gc0FOSV9EQkdfVEVTVF9TVEFURQoreworICAgIEFOSV9URVNUX1NUQVRFX0lETEUgPSAwLAorICAgIEFOSV9URVNUX1NUQVRFX0lOX1BST0dSRVNTLAorICAgIEFOSV9URVNUX1NUQVRFX0RPTkUKKworfSB0QU5JX0RCR19URVNUX1NUQVRFOworCisvKioKKyAqIFRoZSBmb2xsb3dpbmcgQ0ZHIFR5cGVzIGFyZSBkZWZpbmVkIGZvciBlYWNoIHR5cGUgb2YgYSBwYXJhbWV0ZXIgdGhhdCBjYW4KKyAqIGJlIGluZGVwZW5kZW50bHkgc2V0CisgKi8KK3R5cGVkZWYgZW51bSBzQU5JX0RCR19DRkdfVFlQRVMKK3sKKyAgICBBTklfREJHX0NGR19QSFlfTU9ERV9SQVRFLAorICAgIEFOSV9EQkdfQ0ZHX1JPVVRJTkdfRkxBR1MsCisgICAgQU5JX0RCR19DRkdfU1RBX0lELAorICAgIEFOSV9EQkdfQ0ZHX0lTX0lORlJBU1RSVUNUVVJFX01PREUsCisgICAgQU5JX0RCR19DRkdfVVNFX1JFQUxfUEhZLAorICAgIEFOSV9EQkdfQ0ZHX1BIWV9EUk9QUywKKyAgICBBTklfREJHX0NGR19BRERfU1RBLAorICAgIEFOSV9EQkdfQ0ZHX0RFTF9TVEEsCisgICAgQU5JX0RCR19DRkdfRU5BQkxFX1NUQV9UWCwKKyAgICBBTklfREJHX0NGR19ESVNBQkxFX1NUQV9UWCwKKyAgICBBTklfREJHX0NGR19SRUFEX1JFR0lTVEVSLAorICAgIEFOSV9EQkdfQ0ZHX1dSSVRFX1JFR0lTVEVSLAorICAgIEFOSV9EQkdfQ0ZHX0dFVF9BUlFfV0lORE9XX1NJWkUsCisgICAgQU5JX0RCR19DRkdfU0VUX0FSUV9XSU5ET1dfU0laRSwKKyAgICBBTklfREJHX0NGR19TRVRfQ0hBTk5FTCwKKyAgICBBTklfREJHX0NGR19TRVRfTUFDX0FERFJFU1MsCisgICAgQU5JX0RCR19DRkdfU0VUX01FTSwKKyAgICBBTklfREJHX0NGR19HRVRfTUVNLAorICAgIEFOSV9EQkdfQ0ZHX0NUUkxfVFhXUSwKKyAgICBBTklfREJHX0NGR19HRVRfQUNUSVZJVFlfU0VULAorICAgIEFOSV9EQkdfQ0ZHX1NFVF9BQ0tfUE9MSUNZLAorICAgIEFOSV9EQkdfQ0ZHX0FHSU5HX0NNRCwKKyAgICBBTklfREJHX0NGR19TRVRfS0VZLAorICAgIEFOSV9EQkdfQ0ZHX1NFVF9QRVJfU1RBX0tFWSwKKyAgICBBTklfREJHX0NGR19URlBfQUJPUlQsCisgICAgQU5JX0RCR19DRkdfR0VUX0FDVF9DSEFJTlMsCisgICAgQU5JX0RCR19DRkdfSVNfQ0hBSU5fQUNUSVZFLAorICAgIEFOSV9EQkdfQ0ZHX0JCX0ZJTFRFUl9DQUwsCisgICAgQU5JX0RCR19DRkdfRENPX0NBTCwKKyAgICBBTklfREJHX0NGR19JUV9DQUwsCisgICAgQU5JX0RCR19DRkdfVFhfTE9fTEVBS0FHRV9DQUwsCisgICAgQU5JX0RCR19DRkdfU0VORF9QS1RTLAorICAgIEFOSV9EQkdfQ0ZHX1NUT1BfUEtUUywKKyAgICBBTklfREJHX0NGR19FTkFCTEVfRElTQUJMRV9CRUFDT05fR0VOLAorICAgIEFOSV9EQkdfQ0ZHX0RDT19HRVQsCisgICAgQU5JX0RCR19DRkdfRENPX1NFVCwKKyAgICBBTklfREJHX0NGR19TRVRfUFdSX1RFTVBMLAorICAgIEFOSV9EQkdfQ0ZHX0dFVF9QV1JfVEVNUEwsCisgICAgQU5JX0RCR19DRkdfSU5JVCwKKyAgICBBTklfREJHX0NGR19TRVRfRUVQUk9NX0ZMRCwKKyAgICBBTklfREJHX0NGR19HRVRfRUVQUk9NX0ZMRCwKKyAgICBBTklfREJHX0NGR19TRVRfTlVNX1RSQU5TTUlUVEVSUywKKyAgICBBTklfREJHX0NGR19TRVRfUlhfQ0hBSU5TLAorICAgIEFOSV9EQkdfQ0ZHX0hDRl9URVNULAorICAgIEFOSV9EQkdfQ0ZHX1BPTEFSSVNfUkVWX0lELAorICAgIEFOSV9EQkdfQ0ZHX1VQREFURV9EQVRBX0ZST01fRUVQUk9NLAorICAgIEFOSV9EQkdfQ0ZHX0dFVF9URU1QLAorICAgIEFOSV9EQkdfQ0ZHX1NFVF9TVEFfQUREUkxTVCwKKyAgICBBTklfREJHX0NGR19HRVRfUFdSX0dBSU4sCisgICAgQU5JX0RCR19DRkdfU1dfQ0xPU0VEX0xPT1BfVFBDLAorCisgICAgQU5JX0RCR19DRkdfVFlQRV9NQVgKK30gdEFOSV9EQkdfQ0ZHX1RZUEVTOworCisvKioKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZW5ndGggZGVmaW5pdGlvbnMgZm9yIGVhY2ggQ0ZHIFRZUEUgZGVmaW5lZAorICogaW4gZWFybGllciBUeXBlIGVudW0uCisgKi8KKworLy8gZmlyc3QgYnl0ZSBtb2RlIGFuZCBzZWNvbmQgcmF0ZQorIyBkZWZpbmUgQU5JX0RCR19DRkdfUEhZX01PREVfUkFURV9MRU4gMgorCisvLyBNU04gaXMgdHlwZSBhbmQgTFNOIGlzIHN1Yi10eXBlIGluIHRoZSBNU0IuIDQgTFNCcyBhcmUgcm91dGluZyBmbGFncworIyBkZWZpbmUgQU5JX0RCR19DRkdfUk9VVElOR19GTEFHU19MRU4gNQorCisjIGRlZmluZSBBTklfREJHX0NGR19TVEFfSURfTEVOICAgICAgICAyCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIHRoZSBjb25maWcgaW5wdXQgcGFyYW1ldGVycworLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3V0cHV0IFBhcmFtcyBmb3IgUmVhZCBSZWdpc3RlciBDb25maWcgcmVxdWVzdAordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ0dldFBvbGFyaXNWZXJzaW9uUmVzcG9uc2UKK3sKKyAgICAvLyBPdXRwdXQgcGFyYW1ldGVycworICAgIHVuc2lnbmVkIGludCByYzsgIC8vIDAgLSBTVUNDRVNTCisgICAgdW5zaWduZWQgbG9uZyB2ZXJzaW9uOworfSB0QW5pRGJnQ2ZnR2V0UG9sYXJpc1ZlcnNpb25SZXNwb25zZSwgKnRwQW5pRGJnQ2ZnR2V0UG9sYXJpc1ZlcnNpb25SZXNwb25zZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgUGFyYW1zIGZvciB0aGUgUGh5IE1vZGUgUmF0ZQorCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnUGh5TW9kZVJhdGVQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgcGh5TW9kZTsKKyAgICB1bnNpZ25lZCBpbnQgcGh5UmF0ZTsKK30gdEFuaURiZ0NmZ1BoeU1vZGVSYXRlUGFyYW1zLCAqdHBBbmlEYmdDZmdQaHlNb2RlUmF0ZVBhcmFtczsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElucHV0IFBhcmFtcyBmb3IgdGhlIFJvdXRpbmcgRmxhZ3MKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdSb3V0aW5nRmxhZ3NQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgc3ViVHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgcm91dGluZ0ZsYWdzOworfSB0QW5pRGJnQ2ZnUm91dGluZ0ZsYWdzUGFyYW1zLCAqdHBBbmlEYmdDZmdSb3V0aW5nRmxhZ3NQYXJhbXM7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgZm9yIHRoZSBTVEEgSUQKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdTdGFJZFBhcmFtcworeworICAgIHVuc2lnbmVkIGludCBzdGFJZDsKK30gdEFuaURiZ0NmZ1N0YUlkUGFyYW1zLCAqdHBBbmlEYmdDZmdTdGFJZFBhcmFtczsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElucHV0IFBhcmFtcyBmb3IgIklzIEluZnJhc3RydWN0dXJlIE1vZGUiCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnSXNJbmZyYXN0cnVjdHVyZVBhcmFtcworeworICAgIHVuc2lnbmVkIGludCBpc0luZnJhc3RydWN0dXJlTW9kZTsKK30gdEFuaURiZ0NmZ0lzSW5mcmFzdHJ1Y3R1cmVQYXJhbXMsICp0cEFuaURiZ0NmZ0lzSW5mcmFzdHJ1Y3R1cmVQYXJhbXM7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgZm9yIHRoZSBSZWFsIFBoeQordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ1JlYWxQaHlQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgdXNlUmVhbFBoeTsKK30gdEFuaURiZ0NmZ1JlYWxQaHlQYXJhbXMsICp0cEFuaURiZ0NmZ1JlYWxQaHlQYXJhbXM7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgZm9yIFBoeSBEcm9wcwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ1BoeURyb3BQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgdXNlUGh5RHJvcHM7CisgICAgdW5zaWduZWQgaW50IHJhdGU7CisgICAgdW5zaWduZWQgaW50IGJ1cnN0U2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgbW9kZTsKK30gdEFuaURiZ0NmZ1BoeURyb3BQYXJhbXMsICp0cEFuaURiZ0NmZ1BoeURyb3BQYXJhbXM7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgZm9yIEFkZCBTdGEKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdBZGRTdGFQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3RhSWQ7CisgICAgdW5zaWduZWQgY2hhciBtYWNBZGRyWzZdOworICAgIHVuc2lnbmVkIGludCBwaHlNb2RlOworICAgIHVuc2lnbmVkIGludCByYXRlOworICAgIHVuc2lnbmVkIGludCBza2lwU1A7CisgICAgdW5zaWduZWQgaW50IGFja1BvbGljeTsKK30gdEFuaURiZ0NmZ0FkZFN0YVBhcmFtcywgKnRwQW5pRGJnQ2ZnQWRkU3RhUGFyYW1zOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgUGFyYW1zIGZvciBEZWxldGUgU3RhCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnRGVsU3RhUGFyYW1zCit7CisgICAgdW5zaWduZWQgaW50IHN0YUlkOworICAgIHVuc2lnbmVkIGNoYXIgbWFjQWRkcls2XTsKK30gdEFuaURiZ0NmZ0RlbFN0YVBhcmFtcywgKnRwQW5pRGJnQ2ZnRGVsU3RhUGFyYW1zOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG93ZXN0IHJlZ2lzdGVyIGFkZHJlc3MgYWxsb3dhYmxlIGZvciB0aGUgUmVhZCBSZWdpc3RlciBjYWxscworI2RlZmluZSBBTklfVElUX01JTl9SRUdfQUREUiAweDAyMDAwMDAwCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhpZ2hlc3QgcmVnaXN0ZXIgYWRkcmVzcyBhbGxvd2FibGUgZm9yIHRoZSBSZWFkIFJlZ2lzdGVyIGNhbGwKKyNkZWZpbmUgQU5JX1RJVF9NQVhfUkVHX0FERFIgMHgwMjAzZmZmZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgUGFyYW1zIGZvciBSZWFkIFJlZ2lzdGVyIENvbmZpZyByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnUmVhZFJlZ1BhcmFtcworeworICAgIHVuc2lnbmVkIGxvbmcgcmVnQWRkcjsKK30gdEFuaURiZ0NmZ1JlYWRSZWdQYXJhbXMsICp0cEFuaURiZ0NmZ1JlYWRSZWdQYXJhbXM7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgZm9yIFdyaXRlIFJlZ2lzdGVyIENvbmZpZyByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnV3JpdGVSZWdQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBsb25nIHJlZ0FkZHI7CisgICAgdW5zaWduZWQgbG9uZyByZWdWYWw7Cit9IHRBbmlEYmdDZmdXcml0ZVJlZ1BhcmFtcywgKnRwQW5pRGJnQ2ZnV3JpdGVSZWdQYXJhbXM7CisKKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBTklfREJHX0NGR19TRVRfQ0FMX1RPTkUsCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGxvbmcgdG9uZUlEOyAgIC8vMCA9IC0yOCwgMSA9IC0yNCwgLi4uLCA2ID0gLTQsIDcgPSArNCwgOCA9ICs4LCA5ID0gKzEyLCAuLi4sIDEzID0gKzI4Cit9dEFuaURiZ0NmZ1NldFRvbmVJZCwgKnRwQW5pRGJnQ2ZnU2V0VG9uZUlkOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPdXRwdXQgUGFyYW1zIGZvciBSZWFkIFJlZ2lzdGVyIENvbmZpZyByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnUmVnUmVhZFJlc3BvbnNlCit7CisgICAgLy8gT3V0cHV0IHBhcmFtZXRlcnMKKyAgICB1bnNpZ25lZCBpbnQgcmM7ICAvLyAwIC0gU1VDQ0VTUworICAgIHVuc2lnbmVkIGxvbmcgcmVnVmFsOworfSB0QW5pRGJnQ2ZnUmVhZFJlZ1Jlc3BvbnNlLCAqdHBBbmlEYmdDZmdSZWFkUmVnUmVzcG9uc2U7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPdXRwdXQgUGFyYW1zIGZvciBnZXR0aW5nIEFSUSBXaW5kb3cKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdHZXRBcnFXaW5kb3dSZXNwb25zZQoreworICAgIHVuc2lnbmVkIGludCByYzsgIC8vIDAgLSBTVUNDRVNTCisgICAgdW5zaWduZWQgbG9uZyB2YWw7Cit9IHRBbmlEYmdDZmdHZXRBcnFXaW5kb3dSZXNwb25zZSwgKnRwQW5pRGJnQ2ZnR2V0QXJxV2luZG93UmVzcG9uc2U7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgZm9yIFdyaXRlIFJlZ2lzdGVyIENvbmZpZyByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnU2V0QXJxV2luZG93UGFyYW1zCit7CisgICAgdW5zaWduZWQgbG9uZyB3aW5kb3dTaXplOworfSB0QW5pRGJnQ2ZnU2V0QXJxV2luZG93UmVnUGFyYW1zLCAqdHBBbmlEYmdDZmdTZXRBcnFXaW5kb3dQYXJhbXM7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgZm9yIFdyaXRlIFJlZ2lzdGVyIENvbmZpZyByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnU2V0Q2hhblBhcmFtcworeworICAgIHVuc2lnbmVkIGxvbmcgY2hJZDsKK30gdEFuaURiZ0NmZ1NldENoYW5QYXJhbXMsICp0cEFuaURiZ0NmZ1NldENoYW5QYXJhbXM7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElucHV0IFBhcmFtcyBmb3IgV3JpdGUgUmVnaXN0ZXIgQ29uZmlnIHJlcXVlc3QKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdTZXRNYWNBZGRyUGFyYW1zCit7CisgICAgdW5zaWduZWQgY2hhciBtYWNBZGRyWzZdOworICAgIHVuc2lnbmVkIGludCAgZmxhZzsgICAgICAgLy8gMCAtIEJTU0lEOyAxIC0gTUFDIEFkZHJlc3Mgb2YgRFVUCit9IHRBbmlEYmdDZmdTZXRNYWNBZGRyUGFyYW1zLCAqdHBBbmlEYmdDZmdTZXRNYWNBZGRyUGFyYW1zOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgUGFyYW1zIGZvciBTZXQgTWVtb3J5IHJlcXVlc3QKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdTZXRNZW1vcnlQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgZlVzZUJ1cnN0RG1hOworICAgIHVuc2lnbmVkIGludCBudW1PZldvcmRzOworICAgIHVuc2lnbmVkIGludCBhaGJBZGRyOworICAgIHVuc2lnbmVkIGludCB3cml0ZURhdGE7IC8vIFBhdHRlcm4gdG8gYmUgd3JpdHRlbiBvdXQgaW4gbWVtb3J5Cit9IHRBbmlEYmdDZmdTZXRNZW1vcnlQYXJhbXMsICp0cEFuaURiZ0NmZ1NldE1lbW9yeVBhcmFtczsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElucHV0IFBhcmFtcyBmb3IgR2V0IE1lbW9yeSByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnR2V0TWVtb3J5UGFyYW1zCit7CisgICAgdW5zaWduZWQgaW50IGZVc2VCdXJzdERtYTsKKyAgICB1bnNpZ25lZCBpbnQgbnVtT2ZXb3JkczsKKyAgICB1bnNpZ25lZCBpbnQgYWhiQWRkcjsKK30gdEFuaURiZ0NmZ0dldE1lbW9yeVBhcmFtcywgKnRwQW5pRGJnQ2ZnR2V0TWVtb3J5UGFyYW1zOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVzcG9uc2Ugc3RydWN0dXJlIGZvciB0aGUgR2V0IE1lbW9yeSByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnR2V0TWVtb3J5UmVzcG9uc2UKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmM7ICAvLyAwIC0gU1VDQ0VTUzsgT3RoZXJ3aXNlIEZBSUxFRAorICAgIHVuc2lnbmVkIGludCByZWFkRGF0YVsxXTsKK30gdEFuaURiZ0NmZ0dldE1lbW9yeVJlc3BvbnNlLCAqdHBBbmlEYmdDZmdHZXRNZW1vcnlSZXNwb25zZTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgUGFyYW1zIGZvciBDb250cm9scyBFbmFibGUvRGlzYWJsZSBvZiBUWCBXUQordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ0N0cmxUeFdxUGFyYW1zCit7CisgICAgdW5zaWduZWQgaW50IHN0YUlkOworICAgIHVuc2lnbmVkIGludCB3cUlkOworICAgIHVuc2lnbmVkIGludCBhY3Rpb247IC8vIDAgLSBEaXNhYmxlOyAxIC0gRW5hYmxlCisKK30gdEFuaURiZ0NmZ0N0cmxUeFdxUGFyYW1zLCAqdHBBbmlEYmdDZmdDdHJsVHhXcVBhcmFtczsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElucHV0IFBhcmFtcyBmb3IgR2V0dGluZyBUWC9SWCBBY3Rpdml0eSBTZXQKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdHZXRBc1BhcmFtcworeworICAgIHVuc2lnbmVkIGludCBpZDsgICAgIC8vIDAgLSB0eDsgMSAtIHJ4CisKK30gdEFuaURiZ0NmZ0dldEFzUGFyYW1zLCAqdHBBbmlEYmdDZmdHZXRBc1BhcmFtczsKKworLy8gSW5wdXQgUGFyYW1zIGZvciBHZXR0aW5nIFRYL1JYIEFjdGl2aXR5IFNldAordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ0dldEFzUmVzcG9uc2UKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmM7ICAvLyAwIC0gU3VjY2VzcworICAgIHVuc2lnbmVkIGludCBuRW50cmllczsKKyAgICB1bnNpZ25lZCBpbnQgZW50cmllc1s2NF07CisKK30gdEFuaURiZ0NmZ0dldEFzUmVzcG9uc2UsICp0cEFuaURiZ0NmZ0dldEFzUmVzcG9uc2U7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgZm9yIFNldCBBQ0sgUG9saWN5Cit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnU2V0QWNrUG9saWN5UGFyYW1zCit7CisgICAgdW5zaWduZWQgaW50IGlkOyAgICAgLy8gMCAtIHR4OyAxIC0gcngKKyAgICB1bnNpZ25lZCBpbnQgcG9saWN5OworICAgIHVuc2lnbmVkIGludCBzdGFJZDsKKyAgICB1bnNpZ25lZCBpbnQgdGNJZDsKKworfSB0QW5pRGJnQ2ZnU2V0QWNrUG9saWN5UGFyYW1zLCAqdHBBbmlEYmdDZmdTZXRBY2tQb2xpY3lQYXJhbXM7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgdG8gUnVuIEFHSU5HIGNvbW1hbmQKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdBZ2luZ0NtZFBhcmFtcworeworICAgIHVuc2lnbmVkIGludCBzdGFJZDsKKyAgICB1bnNpZ25lZCBpbnQgdGNJZDsKKworfSB0QW5pRGJnQ2ZnQWdpbmdDbWRQYXJhbXMsICp0cEFuaURiZ0NmZ0FnaW5nQ21kUGFyYW1zOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgUGFyYW1zIHRvIFRGUCBBYm9ydCBjb21tYW5kCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnVGZwQWJvcnRQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3RhSWQ7CisKK30gdEFuaURiZ0NmZ1RmcEFib3J0UGFyYW1zLCAqdHBBbmlEYmdDZmdUZnBBYm9ydFBhcmFtczsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElucHV0IFBhcmFtcyB0byBFbmFibGUvRGlzYWJsZSBCZWFjb24gY29tbWFuZAordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ0VuYWJsZUJlYWNvblBhcmFtcworeworICAgIHVuc2lnbmVkIGludCBmRW5hYmxlQmVhY29uczsKKworfSB0QW5pRGJnQ2ZnRW5hYmxlQmVhY29uUGFyYW1zLCAqdHBBbmlEYmdDZmdFbmFibGVCZWFjb25QYXJhbXM7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgdG8gU0VUIFdFUCAvIEFFUyBNVUxUSUNBU1QgS0VZCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnU2V0S2V5UGFyYW1zCit7CisgICAgdW5zaWduZWQgaW50IHR5cGU7ICAvLyAwIC0gV0VQOyAxIC0gQUVTCisgICAgdW5zaWduZWQgaW50IGtleUlkOyAvLyBJZiBBRVMsIDAgLSBUWDsgMSAtIFJYCisgICAgdW5zaWduZWQgaW50IGtleUxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGtleVsxNl07CisKK30gdEFuaURiZ0NmZ1NldEtleVBhcmFtcywgKnRwQW5pRGJnQ2ZnU2V0S2V5UGFyYW1zOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgUGFyYW1zIHRvIFNFVCBwZXIgU1RBIGtleXMKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdTZXRQZXJTdGFLZXlQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3RhSWQ7CisgICAgdW5zaWduZWQgaW50IGlkMDsKKyAgICB1bnNpZ25lZCBpbnQgaWQxOworICAgIHVuc2lnbmVkIGludCBrZXlWYWxpZDsgLy8gMCAtIFR4OyBBbnl0aGluZyBlbHNlIFJ4CisgICAgdW5zaWduZWQgaW50IHVzZURlZmF1bHRLZXk7CisgICAgdW5zaWduZWQgaW50IGRlZmF1bHRLZXlJZDsKKyAgICB1bnNpZ25lZCBpbnQgZWRQb2xpY3k7CisgICAgdW5zaWduZWQgY2hhciBrZXlbMTZdOworICAgIHVuc2lnbmVkIGNoYXIga2V5bGVuOworCit9IHRBbmlEYmdDZmdTZXRQZXJTdGFLZXlQYXJhbXMsICp0cEFuaURiZ0NmZ1NldFBlclN0YUtleVBhcmFtczsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENhbCB0ZXN0IGFuZCBTZXQgQ2hhbiBmdW5jdGlvbnMKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDYWxUZXN0UGFyYW1zCit7CisgICAgdW5zaWduZWQgaW50IGlkOyAgIC8vIDAgLSBDYWw7IDEgLSBTZXQgQ2hhbm5lbAorICAgIHVuc2lnbmVkIGludCBjaElkOyAvLyBpZiBpZCA9PSAxOyB0aGVuIGNoSWQgaXMgMSAtIDE0IG9yIDM2IC0gZW5kIG9mIDExYQorfXRBbmlEYmdDYWxUZXN0UGFyYW1zLCAqdHBBbmlEYmdDYWxUZXN0UGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2FsVGVzdFJlc3BvbnNlCit7CisgICAgdW5zaWduZWQgaW50IHJjOworfXRBbmlEYmdDYWxUZXN0UmVzcG9uc2UsICp0cEFuaURiZ0NhbFRlc3RSZXNwb25zZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBwYXJhbXMgdG8gR2V0IERDTyBwYXJhbXMKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdHZXREY29QYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgY2hhaW47CisgICAgdW5zaWduZWQgaW50IGFkZHJlc3M7Cit9IHRBbmlEYmdDZmdHZXREY29QYXJhbXMsICp0cEFuaURiZ0NmZ0dldERjb1BhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ0dldERjb1Jlc3BvbnNlCit7CisgICAgdW5zaWduZWQgaW50IHJjOworICAgIHVuc2lnbmVkIGludCB2YWw7Cit9IHRBbmlEYmdDZmdHZXREY29SZXNwb25zZSwgKnRwQW5pRGJnQ2ZnR2V0RGNvUmVzcG9uc2U7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBwYXJhbXMgdG8gR2V0IERDTyBwYXJhbXMKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdTZXREY29QYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgY2hhaW47CisgICAgdW5zaWduZWQgaW50IGFkZHJlc3M7CisgICAgdW5zaWduZWQgaW50IHZhbDsKK30gdEFuaURiZ0NmZ1NldERjb1BhcmFtcywgKnRwQW5pRGJnQ2ZnU2V0RGNvUGFyYW1zOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgcGFyYW1zIHRvIHNldHRpbmcgcG93ZXIgdGVtcGxhdGUKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdTZXRQd3JUZW1wbFBhcmFtcworeworICAgIHVuc2lnbmVkIGludCBzdGFJZDsKKyAgICB1bnNpZ25lZCBpbnQgbW9kZTsKKyAgICB1bnNpZ25lZCBpbnQgcmF0ZTsKK30gdEFuaURiZ0NmZ1NldFB3clRlbXBsUGFyYW1zLCAqdHBBbmlEYmdDZmdTZXRQd3JUZW1wbFBhcmFtczsKKworCisvLyBSZXNwb25zZSBzdHJ1Y3QgZm9yIEdldHRpbmcgcG93ZXIgdGVtcGxhdGUKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdHZXRQd3JUZW1wbFBhcmFtcworeworICAgIHVuc2lnbmVkIGludCBzdGFJZDsKK30gdEFuaURiZ0NmZ0dldFB3clRlbXBsUGFyYW1zLCAqdHBBbmlEYmdDZmdHZXRQd3JUZW1wbFBhcmFtczsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlcXVlc3Qgc3RydWN0IGZvciBTZXR0aW5nIHRoZSBpbml0IGNvbmZpZyBwYXJhbWV0ZXJzCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnSW5pdFBhcmFtcworeworICAgIHVuc2lnbmVkIGludCBtb2RlOyAvLyBkZWZhdWx0IG1vZGUKKyAgICB1bnNpZ25lZCBpbnQgcmF0ZTsgLy8gZGVmYXVsdCByYXRlCisgICAgdW5zaWduZWQgaW50IGZJc0luZk1vZGU7IC8vIFNldCAxIGZvciBpbmZyYXN0cnVjdHVyZSBtb2RlCisgICAgdW5zaWduZWQgaW50IHN0YUlkOworICAgIHVuc2lnbmVkIGNoYXIgb3duTWFjQWRkcls2XTsgLy8gU2V0IHRoZSBjb25maWd1cmVkIE1BQyBhZGRyZXNzCisgICAgdW5zaWduZWQgaW50IGZGd2QySG9zdDsgLy8gU2V0IDEgdG8gRm9yd2FyZCBkYXRhIHRvIGhvc3QKKyAgICB1bnNpZ25lZCBpbnQgZlVzZVJlYWxQaHk7IC8vIFNldCAxIHRvIHVzZSB0aGUgcmVhbCBQaHkKKyAgICB1bnNpZ25lZCBpbnQgZkVuYWJsZVBoeURyb3BzOyAvLyBTZXQgMSB0byBlbmFibGUgUGh5IGRyb3BzCisgICAgdW5zaWduZWQgaW50IGRyb3BNb2RlUmF0ZTsgLy8gU2V0IHRoaXMgd2hlbiBQaHkgZHJvcHMgYXJlIGVuYWJsZWQKKyAgICB1bnNpZ25lZCBpbnQgZHJvcE1vZGVTaXplOyAvLyBTZXQgdGhpcyB3aGVuIFBoeSBkcm9wcyBhcmUgZW5hYmxlZAorICAgIHVuc2lnbmVkIGludCBkcm9wTW9kZU1vZGU7IC8vIFNldCB0aGlzIHdoZW4gUGh5IGRyb3BzIGFyZSBlbmFibGVkCit9IHRBbmlEYmdDZmdJbml0UGFyYW1zLCAqdHBBbmlEYmdDZmdJbml0UGFyYW1zOworCisKKy8vIFJlc3BvbnNlIHN0cnVjdCBmb3IgR2V0dGluZyBwb3dlciB0ZW1wbGF0ZQordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ0dldFB3clRlbXBsUmVzcG9uc2UKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmM7CisgICAgdW5zaWduZWQgaW50IHZhbDsKK30gdEFuaURiZ0NmZ0dldFB3clRlbXBsUmVzcG9uc2UsICp0cEFuaURiZ0NmZ0dldFB3clRlbXBsUmVzcG9uc2U7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElucHV0IHBhcmFtcyBmb3Igc2V0dGluZyBhIGZpZWxkIGluIHRoZSBFRVBST00KKwordHlwZWRlZiB1bmlvbiBzQW5pRGJnQ2ZnRWVwQnl0ZVNldFBhcmFtcworeworICAgIHVuc2lnbmVkIGNoYXIgbWFzazsKKyAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworCit9IHRBbmlEYmdDZmdFZXBCeXRlU2V0UGFyYW1zLCAqdHBBbmlEYmdDZmdFZXBCeXRlU2V0UGFyYW1zOworCisKKy8vIFJlcXVlc3Qgc3RydWN0IGZvciBTZXR0aW5nIHRoZSBFRVBST00gZmllbGQKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdFZXBTZXRQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIHVuc2lnbmVkIGludCBmSXNNYXNrUHJlc2VudDsKKyAgICB1bnNpZ25lZCBjaGFyIHNldFBhcmFtc1sxXTsKK30gdEFuaURiZ0NmZ0VlcFNldFBhcmFtcywgKnRwQW5pRGJnQ2ZnRWVwU2V0UGFyYW1zOworCisvLyBUaGUgcmVzcG9uc2Ugc3RydWN0dXJlIGZvciB0aGlzIHBhcnRpY3VsYXIgcmVxdWVzdCBpcyBzYW1lIGFzCisvLyB0aGUgZ2VuZXJpYyByZXNwb25zZSBzdHJ1Y3R1cmUuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgcGFyYW1zIGZvciBnZXR0aW5nIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIGluIHRoZSBFRVBST00KKworLy8gUmVxdWVzdCBzdHJ1Y3QgZm9yIEdldHRpbmcgdGhlIEVFUFJPTSBmaWVsZAordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ0VlcEdldFBhcmFtcworeworICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisgICAgdW5zaWduZWQgaW50IHNpemU7Cit9IHRBbmlEYmdDZmdFZXBHZXRQYXJhbXMsICp0cEFuaURiZ0NmZ0VlcEdldFBhcmFtczsKKworCisvLyBSZXNwb25zZSBzdHJ1Y3QgZm9yIEdldHRpbmcgdGhlIEVFUFJPTSBmaWVsZAordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ0VlcEdldFJlc3BvbnNlCit7CisgICAgdW5zaWduZWQgaW50IHJjOworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWVbMV07Cit9IHRBbmlEYmdDZmdFZXBHZXRSZXNwb25zZSwgKnRwQW5pRGJnQ2ZnRWVwR2V0UmVzcG9uc2U7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBwYXJhbXMgZm9yIHNldHRpbmcgdGhlIG51bWJlciBvZiB0cmFuc21pdHRlcnMKKworLy8gUmVxdWVzdCBzdHJ1Y3QgZm9yIHNldHRpbmcgdGhlIG51bWJlciBvZiB0cmFuc21pdHRlcnMKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdTZXROdW1UcmFuc21pdHRlcnMKK3sKKyAgICB1bnNpZ25lZCBpbnQgbnVtVHJhbnNtaXR0ZXJzOworCit9IHRBbmlEYmdDZmdTZXROdW1UcmFuc21pdHRlcnMsICp0cEFuaURiZ0NmZ1NldE51bVRyYW5zbWl0dGVyczsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElucHV0IHBhcmFtcyBmb3IgRW5hYmxpbmcvRGlzYWJsaW5nIFJ4IGNoYWlucworCisvLyBSZXF1ZXN0IHN0cnVjdCBmb3IgRW5hYmxpbmcvRGlzYWJsaW5nIFJ4IGNoYWlucwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ1NldFJ4Q2hhaW5zCit7CisgICAgdW5zaWduZWQgaW50IG51bUNoYWluczsKKyAgICB1bnNpZ25lZCBjaGFyIGNoYWluSW5kaWNlc1szXTsKK30gdEFuaURiZ0NmZ1NldFJ4Q2hhaW5zLCAqdHBBbmlEYmdDZmdTZXRSeENoYWluczsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElucHV0IHBhcmFtcyBmb3IgZW5hYmxlL2Rpc2FibGUgU1cgY2xvc2VkIGxvb3AgVFBDCisKKy8vIFJlcXVlc3Qgc3RydWN0IGZvciBlbmFibGUvZGlzYWJsZSBTVyBjbG9zZWQgbG9vcCBUUEMKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdTd0Nsb3NlZExvb3BUcGMKK3sKKyAgICB1bnNpZ25lZCBpbnQgYWN0aW9uOworfSB0QW5pRGJnQ2ZnU3dDbG9zZWRMb29wVHBjLCAqdHBBbmlEYmdDZmdTd0Nsb3NlZExvb3BUcGM7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBwYXJhbXMgZm9yIHNldHRpbmcgdGhlIGxpc3Qgb2YgdGVzdCBTVEEgTUFDIGFkZHJlc3MsCisvLyB0aGF0IHdpbGwgYmUgb3BlcmF0aW5nIHdpdGggdGhlIEFQLCBmb3IgdGhlIE11bHRpLU5JQyB0ZXN0cy4KK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmdTZXRTdGFBZGRyTHN0Cit7CisgICAgdW5zaWduZWQgbG9uZyBudW1TdGFzOworICAgIHVuc2lnbmVkIGNoYXIgbWFjQWRkckxzdFtNQVhfTlVNX1RTVF9TVEFTX1BFUl9BUF1bNl07Cit9IHRBbmlEYmdDZmdTZXRTdGFBZGRyTHN0LCAqdHBBbmlEYmdDZmdTZXRTdGFBZGRyTHN0OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3V0cHV0IFBhcmFtcyBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBQb3dlciBhbmQgR2FpbiBzZXR0aW5ncworLy8gZm9yIGEgcGFydGljdWxhciBTVEEuCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnR2V0UHdyR2FpblJlc3BvbnNlCit7CisgICAgdW5zaWduZWQgaW50IHJjOyAgLy8gMCAtIFNVQ0NFU1MKKyAgICB1bnNpZ25lZCBsb25nIHB3ckNvZGU7CisgICAgdW5zaWduZWQgbG9uZyBnYWluMDsKKyAgICB1bnNpZ25lZCBsb25nIGdhaW4xOworfSB0QW5pRGJnQ2ZnR2V0UHdyR2FpblJlc3BvbnNlLCAqdHBBbmlEYmdDZmdHZXRQd3JHYWluUmVzcG9uc2U7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnB1dCBQYXJhbXMgY29udGFpbmluZyB0aGUgU1RBSUQgZm9yIGdldHRpbmcgdGhlIGN1cnJlbnQgUG93ZXIgYW5kIEdhaW4gc2V0dGluZ3MuCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnR2V0UHdyR2FpblBhcmFtcworeworICAgIHVuc2lnbmVkIGxvbmcgc3RhSUQ7Cit9IHRBbmlEYmdDZmdHZXRQd3JHYWluUGFyYW1zLCAqdHBBbmlEYmdDZmdHZXRQd3JHYWluUGFyYW1zOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPdXRwdXQgcGFyYW1zIGZvciBnZXR0aW5nIHRlbXBlcmF0dXJlCisKKy8vIFJlc3BvbnNlIHN0cnVjdCBmb3IgZ2V0dGluZyB0ZW1wZXJhdHVyZSBvZiB0aGUgcmFkaW8gY2FyZAorLy8gTk9URTotIFN0b3AgdGhlIHRyYWZmaWMgdG8gbWVhc3VyZSB0ZW1wZXJhdHVyZQordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0NmZ0dldFRlbXBSc3AKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmM7ICAgICAvLyAwIC0gU1VDQ0VTUzsgT3RoZXJ3aXNlIEZBSUxFRAorICAgIHVuc2lnbmVkIGludCB0ZW1wMDsgIC8vIENoYWluIDAgdGVtcGVyYXR1cmUKKyAgICB1bnNpZ25lZCBpbnQgdGVtcDE7ICAvLyBDaGFpbiAxIHRlbXBlcmF0dXJlCit9IHRBbmlEYmdDZmdHZXRUZW1wUnNwLCAqdHBBbmlEYmdDZmdHZXRUZW1wUnNwOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHZW5lcmljIFJlc3BvbnNlIHN0cnVjdHVyZSBmb3IgQ29uZmlnIHJlcXVlc3RzCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnQ2ZnUmVzcG9uc2UKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmM7ICAvLyAwIC0gU1VDQ0VTUzsgT3RoZXJ3aXNlIEZBSUxFRAorfSB0QW5pRGJnQ2ZnUmVzcG9uc2UsICp0cEFuaURiZ0NmZ1Jlc3BvbnNlOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyoKKyAgIEZvciBlYWNoIHRlc3QgdGhlcmUgd2lsbCBiZSBhIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgZmlsZSB3aXRoCisgICB0aGUgZm9sbG93aW5nIHRlc3QgZGVzY3JpcHRpb25zIG9mIHRlc3RJZCwgdGVzdCB0cmlnZ2VyIHR5cGUsIGlucHV0CisgICBwYXJhbWV0ZXJzIGFuZCBleHBlY3RlZCBvdXRwdXQKKworICAgVGhpcyBpcyBhIHRlbXBsYXRlIGZvciBEQkcgdGVzdCBzdHJ1Y3R1cmUKKworICAgdHlwZWRlZiBzdHJ1Y3Qgc0FOSUFQSV9YWFhYX1RFU1RfUEFSQU1TCisgICB7CisgICAvLyBJbnB1dCBwYXJhbXRlcnMKKyAgIGludCB4eXo7ICAvLyBUZXN0IHNwZWNpZmljCisgICB9IHRBTklBUElfWFhYWF9URVNUX1BBUkFNUzsKKworICAgdHlwZWRlZiBzdHJ1Y3Qgc0FOSUFQSV9YWFhYX1RFU1RfUkVTUE9OU0UKKyAgIHsKKyAgIC8vIE91dHB1dCBwYXJhbWV0ZXJzCisgICBpbnQgcmM7ICAvLyBNdXN0IGJlIFpFUk8gZm9yIHN1Y2Nlc3MgYW5kIG11c3QgaGF2ZSBlcnJvciBjb2RlCisgICAvLyBmb3IgZmFpbHVyZQorICAgaW50IHp5eDsgLy8gQW55IGNvdW50ZXJzIG9yIGFueSBkZWJ1ZyB0aGVzZSB3aWxsIGJlIHRlc3Qgc3BlZmljcworICAgfSB0QU5JQVBJX1hYWFhfVEVTVF9SRVNQT05TRTsKKworICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSBBTklfQ0ZHX09QRVJfR0VUICAgIDB4MAorI2RlZmluZSBBTklfQ0ZHX09QRVJfU0VUICAgIDB4MQorCisKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdDZmcKK3sKKyAgICB1bnNpZ25lZCBjaGFyIG9wZXI7CisgICAgdW5zaWduZWQgY2hhciBkYXRhWzEyNF07IC8vIHRvdGFsIHBhcm1zIHN0cnVjdHVyZSBtdXN0IGJlIE1BWCAxMjggYnl0ZXMKK30gdEFuaURiZ0NmZzsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmVzcG9uc2Ugc3RydWN0dXJlcyBmb3IgSW5pdFBkdSB0ZXN0CisvLyBObyBJbnB1dCBQYXJhbXMgZm9yIHRoaXMgdGVzdAordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0luaXRQZHVUZXN0UmVzcG9uc2UKK3sKKyAgICAvLyBPdXRwdXQgcGFyYW1ldGVycworICAgIHVuc2lnbmVkIGludCByYzsgIC8vIE11c3QgYmUgWkVSTyBmb3Igc3VjY2VzcyBhbmQgbXVzdCBoYXZlIGVycm9yIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZmFpbHVyZQorCisgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkOworICAgIHVuc2lnbmVkIGludCBpX2N1cnJlbnQ7CisgICAgdW5zaWduZWQgaW50IHRvdGFsUGR1Q291bnQ7Cit9IHRBbmlEYmdJbml0UGR1VGVzdFJlc3BvbnNlLCAqdHBBbmlEYmdJbml0UGR1VGVzdFJlc3BvbnNlOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXNwb25zZSBzdHJ1Y3R1cmVzIGZvciBCdXNBY2Nlc3MvUmVnUmVhZFdyaXRlIHRlc3RzCisvLyBObyBJbnB1dCBQYXJhbXMgZm9yIHRoaXMgdGVzdAorCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnUmVnUmVhZFdyaXRlVGVzdFJlc3BvbnNlCit7CisgICAgLy8gT3V0cHV0IHBhcmFtZXRlcnMKKyAgICB1bnNpZ25lZCBpbnQgcmM7ICAvLyAwIC0gU1VDQ0VTUzsgQW55dGhpbmcgZWxzZSBpcyBhbiBFUlJPUgorICAgIHVuc2lnbmVkIGludCByZWdpc3RlckFkZHJlc3M7CisgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkOworICAgIHVuc2lnbmVkIGludCBpX2N1cnJlbnQ7Cit9IHRBbmlEYmdSZWdSZWFkV3JpdGVUZXN0UmVzcG9uc2UsICp0cEFuaURiZ1JlZ1JlYWRXcml0ZVRlc3RSZXNwb25zZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlc3BvbnNlIHN0cnVjdHVyZXMgZm9yIEludGVycnVwdCB0ZXN0CisvLyBObyBJbnB1dCBQYXJhbXMgZm9yIHRoaXMgdGVzdAorCit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnSW50clRlc3RSZXNwb25zZQoreworICAgIC8vIE91dHB1dCBwYXJhbWV0ZXJzCisgICAgdW5zaWduZWQgaW50IHJjOyAgICAgICAvLyAwIC0gU1VDQ0VTUzsgQW55dGhpbmcgZWxzZSBpcyBhbiBFUlJPUgorICAgIHVuc2lnbmVkIGludCBzdGF0dXM7ICAgLy8gSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgorICAgIHVuc2lnbmVkIGludCBtYXNrOyAgICAgLy8gSW50ZXJydXB0IG1hc2sgaW4gdGVzdAorICAgIHVuc2lnbmVkIGludCBibXU7ICAgICAgLy8gQk1VIE1CIHN0YXR1cyByZWdpc3RlciBjb250ZW50cworCit9IHRBbmlEYmdJbnRyVGVzdFJlc3BvbnNlLCAqdHBBbmlEYmdJbnRyVGVzdFJlc3BvbnNlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm8gSW5wdXQgUGFyYW1zIGZvciB0aGlzIHRlc3QKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ01lbW9yeVRlc3RQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3RhcnRBZGRyZXNzOworICAgIHVuc2lnbmVkIGludCBlbmRBZGRyZXNzOworICAgIHVuc2lnbmVkIGludCBwYXR0ZXJuOworICAgIHVuc2lnbmVkIGludCB0ZXN0TGV2ZWw7Cit9IHRBbmlEYmdNZW1vcnlUZXN0UGFyYW1zLCAqdHBBbmlEYmdNZW1vcnlUZXN0UGFyYW1zOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmVzcG9uc2Ugc3RydWN0dXJlcyBmb3IgUmVnUmVhZFdyaXRlIHRlc3QKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ01lbW9yeVRlc3RSZXNwb25zZQoreworICAgIC8vIE91dHB1dCBwYXJhbWV0ZXJzCisgICAgdW5zaWduZWQgaW50IHJjOyAgLy8gTXVzdCBiZSBaRVJPIGZvciBzdWNjZXNzIGFuZCBtdXN0IGhhdmUgZXJyb3IgY29kZQorICAgIC8vIGZvciBmYWlsdXJlCisgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkOworICAgIHVuc2lnbmVkIGludCBpX2N1cnJlbnQ7CisgICAgdW5zaWduZWQgaW50IGN1cnJlbnRBZGRyZXNzOworICAgIHVuc2lnbmVkIGludCB0ZXN0QWRkcmVzczsKK30gdEFuaURiZ01lbW9yeVRlc3RSZXNwb25zZSwgKnRwQW5pRGJnTWVtb3J5VGVzdFJlc3BvbnNlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgUGFyYW1ldGVycyBmb3IgdGhlIEhJRiBCdXJzdCBSZWFkIFdyaXRlIHRlc3QKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0hJRkJ1cnN0UmRXcnRUZXN0UGFyYW1zCit7CisgICAgdW5zaWduZWQgaW50IEFIQkFkZHI7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgdW5zaWduZWQgY2hhciBkYXRhWzFdOworCit9IHRBbmlEYmdISUZCdXJzdFJkV3J0VGVzdFBhcmFtcywgKnRwQW5pRGJnSElGQnVyc3RSZFdydFRlc3RQYXJhbXM7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSZXNwb25zZSBzdHJ1Y3R1cmUgZm9yIHRoZSBISUYgQnVyc3QgUmVhZCBXcml0ZSB0ZXN0CisKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdISUZCdXJzdFJkV3J0VGVzdFJlc3BvbnNlCit7CisgICAgLy8gT3V0cHV0IHBhcmFtZXRlcnMKKyAgICB1bnNpZ25lZCBpbnQgcmM7ICAvLyBNdXN0IGJlIFpFUk8gZm9yIHN1Y2Nlc3MgYW5kIG11c3QgaGF2ZSBlcnJvciBjb2RlCisgICAgLy8gZm9yIGZhaWx1cmUKKyAgICB1bnNpZ25lZCBjaGFyIHJlYWREYXRhWzFdOworCit9IHRBbmlEYmdISUZCdXJzdFJkV3J0VGVzdFJlc3BvbnNlLCAqdHBBbmlEYmdISUZCdXJzdFJkV3J0VGVzdFJlc3BvbnNlOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRha2UgdGhlIHJvdXRpbmcgZmxhZ3MgYW5kIG51bWJlciBvZiBmcmFtZXMsIGFzIFBhcmFtcyBmb3IgdGhpcyB0ZXN0CisKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdTZW5kQ29udGludW91c1Rlc3RQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgIHJvdXRpbmdGbGFnczsKKworICAgIC8vIDAgLSBjb250aW51b3VzbHkgc2VuZCBwYWNrZXRzIHRpbGwgaXQgaXMgaW5zdHJ1Y3RlZCB0byBzdG9wLgorICAgIHVuc2lnbmVkIGludCAgbnVtRnJhbWVzVG9TZW5kOworCisgICAgLy8gMSAtIFRNIHJpbmcsIG90aGVyd2lzZSB0aGUgVEQgcmluZyB3aWxsIGJlIHVzZWQuCisgICAgdW5zaWduZWQgaW50ICBmVXNlVE1SaW5nOworCisgICAgLy8gMSAtIGxvb3BiYWNrIHBhY2tldHMgdGhyb3VnaCB0aGUgTUFDCisgICAgdW5zaWduZWQgaW50IGZMb29wQmtQa3RzOworfSB0QW5pRGJnU2VuZENvbnRpbnVvdXNUZXN0UGFyYW1zLCAqdHBBbmlEYmdTZW5kQ29udGludW91c1Rlc3RQYXJhbXM7CisKKy8vIFJlc3BvbnNlIHN0cnVjdHVyZXMgZm9yIFNlbmRDb250aW51b3VzIHRlc3QKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ1NlbmRDb250aW51b3VzVGVzdFJlc3BvbnNlCit7CisgICAgdW5zaWduZWQgaW50IHJjOyAgLy8gMCAtIFN1Y2Nlc3MgYW5kIGFueXRoaW5nIGVsc2UgaXMgYSBmYWlsdXJlCisKKyAgICB1bnNpZ25lZCBpbnQgbnVtUGt0c1NlbnQ7CisgICAgdW5zaWduZWQgaW50IG51bVBrdHNGYWlsZWQ7CisgICAgLy8gU2l6ZSBvZiB0aGUgbGFzdCBmcmFtZSBhdHRlbXB0ZWQgdG8gYmUgc2VudCwgaW4gY2FzZSBvZiBhIGZhaWx1cmUKKyAgICB1bnNpZ25lZCBpbnQgbGFzdEZhaWxlZFBheWxvYWRTaXplOworfSB0QW5pRGJnU2VuZENvbnRpbnVvdXNUZXN0UmVzcG9uc2UsICp0cEFuaURiZ1NlbmRDb250aW51b3VzVGVzdFJlc3BvbnNlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgcGFyYW1ldGVycyBmb3IgdGhlIFBhY2tldCBSb3V0aW5nIHRlc3QKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdQa3RSb3V0aW5nVGVzdFBhcmFtcworeworICAgIC8vIFJvdXRpbmcgZmxhZ3MgZm9yIHRoZSB0ZXN0CisgICAgdW5zaWduZWQgaW50ICByb3V0aW5nRmxhZ3M7CisKKyAgICAvLyBFbnRlciAxIGZvciBIYXJkd2FyZSBTZXFubworICAgIHVuc2lnbmVkIGludCBoc0JpdDsKKworICAgIC8vIEVudGVyIHVuaWNhc3QgYWNrUG9saWN5KDQgZm9yIHJhbmRvbSkKKyAgICB1bnNpZ25lZCBpbnQgIGFja1BvbGljeTsKKworICAgIC8vIFJUUyAoMiBmb3IgcmFuZG9tKQorICAgIHVuc2lnbmVkIGludCAgcnRzRmxhZzsKKworICAgIC8vIDAgLSBjb250aW51b3VzbHkgc2VuZCBwYWNrZXRzIHRpbGwgaXQgaXMgaW5zdHJ1Y3RlZCB0byBzdG9wLgorICAgIHVuc2lnbmVkIGludCAgbnVtUGt0c1RvU2VuZDsKKworICAgIC8vIDB4ZmZmZmZmZmYgLSBGb3IgcmFuZG9tIGZyYW1lIHR5cGVzLgorICAgIHVuc2lnbmVkIGludCAgZnJhbWVUeXBlOworCisgICAgLy8gMHhmZmZmZmZmZiAtIGdlbmVyYXRlcyByYW5kb20gZnJhbWUgc3ViLXR5cGVzLgorICAgIHVuc2lnbmVkIGludCAgZnJtU3ViVHlwZTsKKworICAgIC8vIDEgLSBUTSByaW5nOyBPdGhlcndpc2UgdGhlIFREIHJpbmcgd2lsbCBiZSB1c2VkLgorICAgIHVuc2lnbmVkIGludCAgZlVzZVRNUmluZzsKKworICAgIC8vIDAgLSByYW5kb20gcGF5bG9hZCBzaXplcworICAgIHVuc2lnbmVkIGludCAgcGF5bG9hZFNpemU7CisKKyAgICAvLyBJZiAicGF5bG9hZFNpemUiIGFib3ZlIGlzIHNldCB0byB6ZXJvIHRoZW4gdGhpcyBpcyBpZ25vcmVkCisgICAgdW5zaWduZWQgaW50ICBmcmFnU2l6ZTsKKworICAgIC8vIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGV0aGVyIGEgdW5pY2FzdCBwYWNrZXQgc2hvdWxkIGJlIGZyYWdtZW50ZWQuCisgICAgLy8gSWdub3JlZCwgaWYgInBheWxvYWRTaXplIiBhYm92ZSBpcyBzZXQgdG8gYSBub24temVybyB2YWx1ZS4KKyAgICB1bnNpZ25lZCBpbnQgIGZyYWdtZW50OworCisgICAgLy8gVXNlIGEgdmFsdWUgPjMgZm9yIHJhbmRvbSBzdGFJZCBnZW5lcmF0aW9uCisgICAgdW5zaWduZWQgaW50IHN0YUlkOworCisgICAgLy8gVXNlIGEgdmFsdWUgPjcgZm9yIHJhbmRvbSB0Y0lkIGdlbmVyYXRpb24KKyAgICB1bnNpZ25lZCBpbnQgdGNJZDsKKworICAgIC8vIEVudGVyIHJhbmRvbSBTVEEgcmFuZ2UgKDEgZm9yIFNUQXMoMC0xKSwzIGZvciBTVEFzKDAtMykpCisgICAgdW5zaWduZWQgaW50IHN0YVJhbmdlOworCisgICAgLy8gVEMgcmFuZ2UgKDEgZm9yIFRDcygwLTEpLDMgZm9yIFRDcygwLTMpLDcgZm9yIFRDcygwLTcpCisgICAgdW5zaWduZWQgaW50IHRjUmFuZ2U7CisKKyAgICAvLyBidXJzdCBzaXplICg8IDExKQorICAgIHVuc2lnbmVkIGludCBidXJzdDsKKworICAgIC8vIEVudGVyIDEgdG8gY29tcHV0ZSBDUkMKKyAgICB1bnNpZ25lZCBpbnQgY3JjOworCisgICAgLy8gRW50ZXIgMSB0byBsb29wYmFjayBwYWNrZXRzIHRocm91Z2ggdGhlIE1BQworICAgIHVuc2lnbmVkIGludCBmTG9vcEJrUGt0czsKKworfSB0QW5pRGJnUGt0Um91dGluZ1Rlc3RQYXJhbXMsICp0cEFuaURiZ1BrdFJvdXRpbmdUZXN0UGFyYW1zOworCisvLyBTdHJ1Y3R1cmVzIHdoZXJlIHJlc3BvbnNlIHBhcmFtZXRlcnMgYXJlIGNvbnN0cnVjdGVkIGJ5IHRoZQorLy8gZHZ0U2VuZFBhY2tldHMoKSByb3V0aW5lCisKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdTZW5kUGt0UmVzcG9uc2UKK3sKKyAgICAvLyBUb3RhbCBwYWNrZXRzIHNlbnQKKyAgICB1bnNpZ25lZCBpbnQgcGt0R2VuQ291bnQ7CisKKyAgICB1bnNpZ25lZCBpbnQgZnJhZ0NudDsKKworICAgIHVuc2lnbmVkIGludCBieXRlQ250OworCisgICAgdW5zaWduZWQgaW50IGxvd1BkdUNudDsKKworICAgIHVuc2lnbmVkIGludCBxRnVsbENudDsKKworICAgIC8vIFNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBmcmFtZSBhdHRlbXB0ZWQgdG8gYmUgc2VudAorICAgIHVuc2lnbmVkIGludCBsYXN0UGF5bG9hZFNpemU7CisKKyAgICAvLyBTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGxhc3QgZnJhbWUncyBmcmFnbWVudCBzaXplCisgICAgdW5zaWduZWQgaW50IGxhc3RGcmFnU2l6ZTsKKworICAgIC8vIEltbWVkaWF0ZSBBQ0sKKyAgICB1bnNpZ25lZCBpbnQgY3VtSW1tQWNrOworCisgICAgLy8gTm9BQ0sKKyAgICB1bnNpZ25lZCBpbnQgY3VtTm9BY2s7CisKKyAgICAvLyBSVFMKKyAgICB1bnNpZ25lZCBpbnQgY3VtUlRTOworCisgICAgLy8gTm8gQUNLCisgICAgdW5zaWduZWQgaW50IGN1bU5vUlRTOworCisgICAgLy8gVEMgaGlzdG9ncmFtIChwa3RzKQorICAgIHVuc2lnbmVkIGludCBjdW1UQ1s4XTsKKworICAgIC8vRnJhZ21lbnRzIGhpc3RvZ3JhbSAoZnJhZ3MpCisgICAgdW5zaWduZWQgaW50IGN1bUZyYWdbMTZdOworCisgICAgLy8gU1RBIGhpc3RvZ3JhbSAocGt0cyxmcmFncykKKyAgICB1bnNpZ25lZCBpbnQgY3VtU1RBWzRdOworICAgIHVuc2lnbmVkIGludCBjdW1TVEFGcmFnc1s0XTsKKworfSB0QW5pRGJnU2VuZFBrdFJlc3BvbnNlLCAqdHBBbmlEYmdTZW5kUGt0UmVzcG9uc2U7CisKKy8vIFJlc3BvbnNlIHN0cnVjdHVyZXMgZm9yIHRoZSBQYWNrZXQgUm91dGluZyB0ZXN0Cit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnUGt0Um91dGluZ1Rlc3RSZXNwb25zZQoreworICAgIC8vIE91dHB1dCBwYXJhbWV0ZXJzCisgICAgdW5zaWduZWQgaW50IHJjOyAgLy8gTXVzdCBiZSBaRVJPIGZvciBzdWNjZXNzIGFuZCBtdXN0IGhhdmUgZXJyb3IgY29kZQorICAgIC8vIGZvciBmYWlsdXJlCisKKyAgICAvLyBGaWVsZCB3aGVyZSByZXNwb25zZSBwYXJhbWV0ZXJzIGFyZSBjb25zdHJ1Y3RlZCBieSB0aGUKKyAgICAvLyBkdnRTZW5kUGFja2V0cygpIHJvdXRpbmUKKyAgICB0QW5pRGJnU2VuZFBrdFJlc3BvbnNlIHNlbmRQa3RzUnNwOworCit9IHRBbmlEYmdQa3RSb3V0aW5nVGVzdFJlc3BvbnNlLCAqdHBBbmlEYmdQa3RSb3V0aW5nVGVzdFJlc3BvbnNlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGVudW0gc1BjaUNmZ1Rlc3RTdGF0dXMKK3sKKyAgICBlUENJX0NGR19URVNUX1NVQ0NFU1MsCisgICAgZVBDSV9DRkdfVEVTVF9SRUFEX0ZBSUxVUkUsCisgICAgZVBDSV9DRkdfVEVTVF9WRU5fREVWX0lEX01JU01BVENILAorICAgIGVQQ0lfQ0ZHX1RFU1RfTUlOX0dOVF9NSVNNQVRDSCwKKyAgICBlUENJX0NGR19URVNUX01BWF9MQVRfTUlTTUFUQ0gsCisgICAgZVBDSV9DRkdfVEVTVF9DSVNfUFRSX01JU01BVENILAorICAgIGVQQ0lfQ0ZHX1RFU1RfQ0lTX0NPTlRFTlRTX01JU01BVENICit9IHRQY2lDZmdUZXN0U3RhdHVzOworCisvLyBSZXNwb25zZSBzdHJ1Y3R1cmVzIGZvciB0aGUgUENJIENvbmZpZyB0ZXN0Cit0eXBlZGVmIHN0cnVjdCBzQW5pRGJnUGNpQ2ZnVGVzdFJlc3BvbnNlCit7CisgICAgLy8gT3V0cHV0IHBhcmFtZXRlcnMKKyAgICB1bnNpZ25lZCBpbnQgcmM7ICAvLyBNdXN0IGJlIFpFUk8gZm9yIHN1Y2Nlc3MgYW5kIG11c3QgaGF2ZSBlcnJvciBjb2RlCisgICAgLy8gZm9yIGZhaWx1cmUKKworICAgIC8vIEZpZWxkIHdoZXJlIHRoZSBQQ0kgY29uZmlnIHdvcmRzLCBmb3IgUG9sYXJpcyBhcmUgcmV0dXJuZWQgYnkgdGhlIEhERAorICAgIHVuc2lnbmVkIGludCBwY2lDb25maWdbTUFYX1BDSV9DRkdfV1JEU107CisKK30gdEFuaURiZ1BjaUNmZ1Rlc3RSZXNwb25zZSwgKnRwQW5pRGJnUGNpQ2ZnVGVzdFJlc3BvbnNlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBWYXJpb3VzIHJldHVybiBjb2RlcyByZXR1cm5lZCBmb3IgdGhlIEVFUFJPTSB0ZXN0LgordHlwZWRlZiBlbnVtIHNFZXByb21UZXN0U3RhdHVzCit7CisgICAgZUVFUFJPTV9URVNUX1NVQ0NFU1MsCisgICAgZUVFUFJPTV9URVNUX0ZJTEVfT1BFTl9GQUlMVVJFLAorICAgIGVFRVBST01fVEVTVF9GSUxFX01BUF9GQUlMVVJFLAorICAgIGVFRVBST01fVEVTVF9JTlZBTElEX0ZJTEVfU0laRSwKKyAgICBlRUVQUk9NX1RFU1RfTUVNT1JZX0FMTE9DX0ZBSUxVUkUsCisgICAgZUVFUFJPTV9URVNUX0NSQ19NSVNNQVRDSF9GQUlMVVJFCit9IHRFZXByb21UZXN0U3RhdHVzOworCisKKy8vIFRha2UgdGhlIEVFUFJPTSBmaWxlbmFtZSwgYXMgUGFyYW1zIGZvciB0aGlzIHRlc3QKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0VlcHJvbVRlc3RQYXJhbXMKK3sKKyAgICAvLyBFRVBST00gRmlsZSBOYW1lLgorICAgIGNoYXIgIGVlcHJvbUZpbGVuYW1lWzI1Nl07CisKK30gdEFuaURiZ0VlcHJvbVRlc3RQYXJhbXMsICp0cEFuaURiZ0VlcHJvbVRlc3RQYXJhbXM7CisKKy8vIFJlc3BvbnNlIHN0cnVjdHVyZXMgZm9yIFNlbmRDb250aW51b3VzIHRlc3QKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ0VlcHJvbVRlc3RSZXNwb25zZQoreworICAgIHVuc2lnbmVkIGludCByYzsgIC8vIDAgLSBTdWNjZXNzIGFuZCBhbnl0aGluZyBlbHNlIGlzIGEgZmFpbHVyZQorCit9IHRBbmlEYmdFZXByb21UZXN0UmVzcG9uc2UsICp0cEFuaURiZ0VlcHJvbVRlc3RSZXNwb25zZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGlucHV0IHBhcmFtcyBmb3IgUkhQIEhBU0ggVEJMIHRlc3RzCisKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdSaHBIYXNoVGJsTXVsdGlwbGVFbnRyeVRlc3RQYXJhbXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgbjsgLy8gbnVtYmVyIG9mIGVudHJpZXMKKworfSB0QW5pRGJnUmhwSGFzaFRibE11bHRpcGxlRW50cnlUZXN0UGFyYW1zLAorICAgICp0cEFuaURiZ1JocEhhc2hUYmxNdWx0aXBsZUVudHJ5VGVzdFBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaURiZ1JocEhhc2hUYmxUZXN0UGFyYW1zCit7CisgICAgdW5zaWduZWQgaW50ICBzdGFJZDsKKyAgICB1bnNpZ25lZCBjaGFyIG1hY0FkZHJbNl07CisgICAgdW5zaWduZWQgaW50ICBmbGFnczsKKyAgICB1bnNpZ25lZCBpbnQgIGhhc2hGbGFnUnN2ZDsKKyAgICB1bnNpZ25lZCBpbnQgIHJzdmRGaWVsZDsKKworfSB0QW5pRGJnUmhwSGFzaFRibFRlc3RQYXJhbXMsICp0cEFuaURiZ1JocEhhc2hUYmxUZXN0UGFyYW1zOworCisKK3R5cGVkZWYgc3RydWN0IHNBbmlEYmdSaHBIYXNoVGJsVGVzdFJlc3BvbnNlCit7CisgICAgdW5zaWduZWQgaW50IHJjOyAgLy8gMCBGb3IgU3VjY2VzcworfSB0QW5pRGJnUmhwSGFzaFRibFRlc3RSZXNwb25zZSwgKnRwQW5pRGJnUmhwSGFzaFRibFRlc3RSZXNwb25zZTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBIZXJlIGJvdGggcFBhcm1zIGFuZCBwUmVzcG9uc2Ugc3RydWN0dXJlcyBhcmUgaW50ZXJwcmV0ZWQgYnkgdGhlCisvLyBVc2VyIG9mIHRoZSBBUEkgYmFzZWQgb24gdGVzdElkCisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX1RFU1RfSU5GTyB7CisKKyAgICB0QU5JX1RFU1RfSUQgdGVzdElkOworCisgICAgLy8gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhpcyB0ZXN0IHJ1bnMgc3luY2hyb25vdXNseSBvciBub3QuCisgICAgLy8gSWYgaXQgaXMgbm90LCB0aGVuLCB0aGUgdGVzdCBvcmlnaW5hdG9yIHdpbGwgaGF2ZSB0aGUKKyAgICAvLyBhYmlsaXR5IHRvIHF1ZXJ5IGZvciBpbnRlcm1lZGlhdGUgcmVzdWx0cy4KKyAgICAvLyBBTklfU1RBUlQgPSAxOyBBTklfR0VUX1JFU1VMVFMgPSAyOyBBTklfU1RPUCA9IDMKKyAgICB0QU5JX1RFU1RfVFJJR19UWVBFIHRlc3RUcmlnZ2VyVHlwZTsKKworICAgIC8vIHRlc3Qgc3RhdGUKKyAgICB0QU5JX0RCR19URVNUX1NUQVRFIHRlc3RTdGF0ZTsKKworICAgIC8vIFRoaXMgcG9pbnRzIHRvIGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIHBhcmFtZXRlcnMgZm9yCisgICAgLy8gdGVzdCBkZWZpbmVkIGJ5IGR2dFRlc3RJZC4gTWF5IGJlIE5VTEwgaWYgbm8gcGFyYW1ldGVycworICAgIC8vIGFyZSBuZWVkZWQKKyAgICB1bnNpZ25lZCBsb25nIHNpemVPZlBhcm1zOworICAgIHVuc2lnbmVkIGNoYXIgcGFybXNbTUFYX1BBUk1TX1NJWkVdOworCisgICAgLy8gVGhpcyBwb2ludHMgdG8gYSBidWZmZXIgdG8gaG9sZCByZXNwb25zZSBmcm9tIHRoZSB0ZXN0CisgICAgLy8gUmVzcG9uc2Ugc2hhbGwgYmUgdGhlcmUgZnJvbSB0aGUgdGVzdCBhbmQgaXQgTVVTVCBoYXZlCisgICAgLy8gcmV0dXJuIGNvZGUgWkVSTyBmb3IgU1VDQ0VTUyBhbmQgZXJyb3IgY29kZSBmb3IgdGVzdAorICAgIC8vIGZhaWx1cmUKKyAgICB1bnNpZ25lZCBsb25nIHNpemVPZlJlc3BvbnNlOworICAgIHVuc2lnbmVkIGNoYXIgcmVzcG9uc2VbTUFYX1JFU1BPTlNFX1NJWkVdOworCit9IHRBTklfREJHX1RFU1RfSU5GTzsKKworLy8gUmV0dXJucyB0ZXN0IHN0YXJ0IGZ1bmN0aW9uIHBvaW50ZXIgb3Igc3RvcCBmdW5jdGlvbiBwb2ludGVyIG9yCisvLyBnZXQgaW5mbyBvbiB0ZXN0IGZ1bmN0aW9uIHBvaW50ZXIgZnJvbSB0aGUgZnVuY3Rpb24gcG9pbnRlciBhcnJheQorLy8gdGhhdCBpcyBpbml0aWFsaXplZCBkdXJpbmcgdGhlIGR2dEluaXRHbG9iYWwgcm91dGluZS4KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkKiBkdnRHZXRGdW5jUHRyKHZvaWQgKiwgaW50LCBpbnQgKTsKKyNlbHNlCitleHRlcm4gdm9pZCogZHZ0R2V0RnVuY1B0cih2b2lkICosIGludCwgaW50ICk7CisjZW5kaWYKKworCisvLyBkZWNsYXJlIGEgZnVuY3Rpb24gcHJvdG90eXBlIGZvciAnc3RhcnQnLCAndXBkYXRlJyBhbmQgJ3N0b3AnIHJvdXRpbmVzCit0eXBlZGVmIHZvaWQgdF9EYmdUZXN0Um91dGluZSh2b2lkICopOworCisvLyBjYWxsZWQgYnkgdGhlIHRlc3Qgcm91dGluZSB3aGVuIGl0IGNvbXBsZXRlcworZXh0ZXJuIHZvaWQgZGJnVGVzdENvbXBsZXRlZCh2b2lkICptcEFkYXB0ZXJQdHIpOworCisKKy8vIERCRy9EVlQgZHVtcCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzICYgZGVmaW5lcworCisjZGVmaW5lIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9NSVNDICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBTklfREJHX0dSUF9JTkZPX1RZUEVfQk1VICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQU5JX0RCR19HUlBfSU5GT19UWVBFX1RGUCAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9SSFAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBTklfREJHX0dSUF9JTkZPX1RZUEVfUkZQICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQU5JX0RCR19HUlBfSU5GT19UWVBFX1NUQSAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9GUEhZICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBTklfREJHX0dSUF9JTkZPX1RZUEVfRlBIWV9GSUZPIDB4MDAwMDAwODAKKyNkZWZpbmUgQU5JX0RCR19HUlBfSU5GT19UWVBFX1JQSFkgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9IQ0YgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBBTklfREJHX0dSUF9JTkZPX1RZUEVfU1AgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQU5JX0RCR19HUlBfSU5GT19UWVBFX0NQICAgICAgICAweDAwMDAwODAwCisKKworI2RlZmluZSBBTklfREJHX0dSUF9JTkZPX1RZUEVfQUxMICAgICAgIChBTklfREJHX0dSUF9JTkZPX1RZUEVfTUlTQyB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9CTVUgfCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9URlAgfCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9SSFAgfCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9SRlAgfCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9TVEEgfCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9GUEhZfCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9GUEhZX0ZJRk8gfCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9SUEhZIHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9IQ0YgfCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9EQkdfR1JQX0lORk9fVFlQRV9TUCkKKworCisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX01JU0NfSU5GTyB7CisKKyAgICB1bnNpZ25lZCBsb25nIHN5c01vZGU7CisgICAgdW5zaWduZWQgbG9uZyBzeXNJbnRyTWFzazsKKyAgICB1bnNpZ25lZCBsb25nIGludHJNYXNrOworICAgIHVuc2lnbmVkIGxvbmcgcGh5SW50ck1hc2s7CisgICAgdW5zaWduZWQgbG9uZyBpbnRyU3RhdHVzWzMyXTsKKyAgICB1bnNpZ25lZCBsb25nIHBoeUludHJTdGF0dXNbMTZdOworICAgIHVuc2lnbmVkIGxvbmcgZW9mU29mRXhjZXB0aW9uUmVzZXRzOyAgCisgICAgdW5zaWduZWQgbG9uZyBibXVFeGNlcHRpb25SZXNldHM7ICAgICAgCisgICAgdW5zaWduZWQgbG9uZyBsb3dQZHVFeGNlcHRpb25SZXNldHM7ICAKKyAgICB1bnNpZ25lZCBsb25nIHVzZXJUcmlnZ2VyZWRSZXNldHM7CisgICAgdW5zaWduZWQgbG9uZyBsb2dQRXhjZXB0aW9uUmVzZXRzOworCit9IHRBTklfREJHX01JU0NfSU5GTzsKKworCit0eXBlZGVmIHN0cnVjdCBzQU5JX0RCR19CTVVfSU5GTyB7CisKKyAgICB1bnNpZ25lZCBsb25nIGNvbnRyb2w7CisgICAgdW5zaWduZWQgbG9uZyBmcF9ocHRyOworICAgIHVuc2lnbmVkIGxvbmcgdHB0cjsKKyAgICB1bnNpZ25lZCBsb25nIHBkdTsKKyAgICB1bnNpZ25lZCBsb25nIGV4Y2VwdGlvbjsKKyAgICB1bnNpZ25lZCBsb25nIGV4Y2VwdGlvbk1hc3RlcjsKKyAgICB1bnNpZ25lZCBsb25nIGRyb3BDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIHdvcmtRdWV1ZVsxMF1bNF07CisKK30gdEFOSV9EQkdfQk1VX0lORk87CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0FOSV9EQkdfVEZQX0lORk8geworCisgICAgdW5zaWduZWQgbG9uZyBjb250cm9sOworICAgIHVuc2lnbmVkIGxvbmcgbW9kZUVuYWJsZTsKKyAgICB1bnNpZ25lZCBsb25nIHRlbXBsRW5hYmxlOworICAgIHVuc2lnbmVkIGxvbmcgcmV0cnlRaWQ7CisgICAgdW5zaWduZWQgbG9uZyB0c2ZIaTsKKyAgICB1bnNpZ25lZCBsb25nIHRzZkxvOworICAgIHVuc2lnbmVkIGxvbmcgYmVhY29uOworICAgIHVuc2lnbmVkIGxvbmcgcHJvYmVEZWxheTsKKyAgICB1bnNpZ25lZCBsb25nIHRidHRIaTsKKyAgICB1bnNpZ25lZCBsb25nIHRidHRMbzsKKyAgICB1bnNpZ25lZCBsb25nIG5hdjsKKyAgICB1bnNpZ25lZCBsb25nIGxpc3RlbkludGVydmFsOworICAgIHVuc2lnbmVkIGxvbmcgZGVsYXlUeDsKKyAgICB1bnNpZ25lZCBsb25nIGR0aW1QZXJpb2Q7CisgICAgdW5zaWduZWQgbG9uZyBydHNDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIHJ0c0ZhaWx1cmU7CisKK30gdEFOSV9EQkdfVEZQX0lORk87CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0FOSV9EQkdfUkhQX0lORk8geworCisgICAgdW5zaWduZWQgbG9uZyBzb2Y7CisgICAgdW5zaWduZWQgbG9uZyBzb2ZfY2h1bms7CisgICAgdW5zaWduZWQgbG9uZyBmcmFnQ291bnQ7CisgICAgdW5zaWduZWQgbG9uZyBkcm9wQ291bnQ7CisgICAgdW5zaWduZWQgbG9uZyBmY3NDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIGJzc0lkTWlzbWF0Y2g7CisgICAgdW5zaWduZWQgbG9uZyBkZXN0TWlzbWF0Y2g7CisgICAgdW5zaWduZWQgbG9uZyBsZW5ndGhFcnJvcjsKKyAgICB1bnNpZ25lZCBsb25nIHBkdUVycm9yOworICAgIHVuc2lnbmVkIGxvbmcgYWJvcnRDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIHJlcVJhdGU7CisgICAgdW5zaWduZWQgbG9uZyBkZWxheUFCOworICAgIHVuc2lnbmVkIGxvbmcgbWFjQWRkckhpOworICAgIHVuc2lnbmVkIGxvbmcgbWFjQWRkckxvOworICAgIHVuc2lnbmVkIGxvbmcgYnNzSWRIaTsKKyAgICB1bnNpZ25lZCBsb25nIGJzc0lkTG87CisgICAgdW5zaWduZWQgbG9uZyByZWxheUNvdW50OworICAgIHVuc2lnbmVkIGxvbmcgaGFzaF9NaXNzQ291bnQ7CisgICAgdW5zaWduZWQgbG9uZyBoYXNoX3NyY0hpOworICAgIHVuc2lnbmVkIGxvbmcgaGFzaF9zcmNMbzsKKyAgICB1bnNpZ25lZCBsb25nIGhhc2hfdHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIGhhc2hfc3ViVHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIGRiZ19oYW5nU3RhdHVzOworICAgIHVuc2lnbmVkIGxvbmcgZGJnX2ZyYWdJZ25vcmVDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIHBkdUNvdW50OworCit9IHRBTklfREJHX1JIUF9JTkZPOworCisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX1JGUF9JTkZPIHsKKworICAgIHVuc2lnbmVkIGxvbmcgcGFja2V0czsKKyAgICB1bnNpZ25lZCBsb25nIG11bHRpY2FzdFBhY2tldHM7CisgICAgdW5zaWduZWQgbG9uZyBkdXBQYWNrZXRzOworICAgIHVuc2lnbmVkIGxvbmcgYnl0ZUNvdW50OworICAgIHVuc2lnbmVkIGxvbmcgZHJvcENvdW50OworICAgIHVuc2lnbmVkIGxvbmcgYnl0ZTY0OworICAgIHVuc2lnbmVkIGxvbmcgYnl0ZTEyODsKKyAgICB1bnNpZ25lZCBsb25nIGJ5dGUyNTY7CisgICAgdW5zaWduZWQgbG9uZyBieXRlNTEyOworICAgIHVuc2lnbmVkIGxvbmcgYnl0ZTEwMjQ7CisgICAgdW5zaWduZWQgbG9uZyBieXRlMTUxOTsKKyAgICB1bnNpZ25lZCBsb25nIGJ5dGUyMDQ4OworICAgIHVuc2lnbmVkIGxvbmcgYnl0ZTQwOTY7CisKK30gdEFOSV9EQkdfUkZQX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX1NQX0lORk8geworCisgICAgdW5zaWduZWQgbG9uZyB3ZXBfZGt5MF93MDsKKyAgICB1bnNpZ25lZCBsb25nIHdlcF9ka3kwX3cxOworICAgIHVuc2lnbmVkIGxvbmcgd2VwX2RlZmF1bHRfcmMwOworCisgICAgdW5zaWduZWQgbG9uZyB3ZXBfZGt5MV93MDsKKyAgICB1bnNpZ25lZCBsb25nIHdlcF9ka3kxX3cxOworICAgIHVuc2lnbmVkIGxvbmcgd2VwX2RlZmF1bHRfcmMxOworCisgICAgdW5zaWduZWQgbG9uZyB3ZXBfZGt5Ml93MDsKKyAgICB1bnNpZ25lZCBsb25nIHdlcF9ka3kyX3cxOworICAgIHVuc2lnbmVkIGxvbmcgd2VwX2RlZmF1bHRfcmMyOworCisgICAgdW5zaWduZWQgbG9uZyB3ZXBfZGt5M193MDsKKyAgICB1bnNpZ25lZCBsb25nIHdlcF9ka3kzX3cxOworICAgIHVuc2lnbmVkIGxvbmcgd2VwX2RlZmF1bHRfcmMzOworCit9IHRBTklfREJHX1NQX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX0NQX0lORk8geworCisgICAgdW5zaWduZWQgbG9uZyBjcF9jb250cm9sOworICAgIHVuc2lnbmVkIGxvbmcgQ29tcHJlc3Npb25fRXhwYW5zaW9uX0NudDsKKyAgICB1bnNpZ25lZCBsb25nIENvbXByZXNzaW9uX05VTV9wa3RzOworCisgICAgdW5zaWduZWQgbG9uZyBEZWNvbXByZXNzaW9uX05VTV9wa3RzOworICAgIHVuc2lnbmVkIGxvbmcgQ29tcHJlc3Npb25fNTBwX05VTV9wa3RzOworICAgIHVuc2lnbmVkIGxvbmcgQ1BfRXJyb3Jfc3RhdHVzOworCisgICAgdW5zaWduZWQgbG9uZyBDcF9tYXhpbXVtX3BrdF9sZW47CisgCit9IHRBTklfREJHX0NQX0lORk87CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0FOSV9EQkdfU1RBX1RYX1dRX0lORk8geworCisgICAgdW5zaWduZWQgbG9uZyB0eFdxQWRkcjsKKyAgICB1bnNpZ25lZCBsb25nIHR4V3FEdW1wWzRdOworCisgICAgdW5zaWduZWQgbG9uZyB0cHRyOworICAgIHVuc2lnbmVkIGxvbmcgaHB0cjsKKyAgICB1bnNpZ25lZCBsb25nIGFwdHI7CisgICAgdW5zaWduZWQgbG9uZyBhX3Rwa3RzOworICAgIHVuc2lnbmVkIGxvbmcgaF90cGt0czsKKyAgICB1bnNpZ25lZCBsb25nIGZyYWc7CisgICAgdW5zaWduZWQgbG9uZyBieXRlczsKKyAgICB1bnNpZ25lZCBsb25nIGFjazsKKyAgICB1bnNpZ25lZCBsb25nIHZhbGlkOworCit9IHRBTklfREJHX1NUQV9UWF9XUV9JTkZPOworCisKKwordHlwZWRlZiBzdHJ1Y3Qgc0FOSV9EQkdfVENfREVTQyB7CisKKyAgICB1bnNpZ25lZCBsb25nIHZhbGlkOworICAgIHVuc2lnbmVkIGxvbmcgcnhBY2tUeXBlOworICAgIHVuc2lnbmVkIGxvbmcgbmV3UGt0OworICAgIHVuc2lnbmVkIGxvbmcgcnhTZXFOdW07CisgICAgdW5zaWduZWQgbG9uZyByeFBrdFRpbWVTdGFtcDsKKyAgICB1bnNpZ25lZCBsb25nIFNWOworICAgIHVuc2lnbmVkIGxvbmcgYWNrVGltZW91dDsKKyAgICB1bnNpZ25lZCBsb25nIG51bU9mRnJhZ3NTdWNlc3NmdWw7CisgICAgdW5zaWduZWQgbG9uZyByeEJEUHRyOworICAgIHVuc2lnbmVkIGxvbmcgdHhSZXBsYXlDb3VudEhpOworICAgIHVuc2lnbmVkIGxvbmcgdHhSZXBsYXlDb3VudExvOworICAgIHVuc2lnbmVkIGxvbmcgcnhSZXBsYXlDb3VudEhpOworICAgIHVuc2lnbmVkIGxvbmcgcnhSZXBsYXlDb3VudExvOworCit9IHRBTklfREJHX1RDX0RFU0M7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0FOSV9EQkdfUFdSX1RFTVBMIHsKKworICAgIHVuc2lnbmVkIGxvbmcgcmV0cnlQaHlNb2RlOworICAgIHVuc2lnbmVkIGxvbmcgcmV0cnlDYjsKKyAgICB1bnNpZ25lZCBsb25nIHJldHJ5RXNmOworICAgIHVuc2lnbmVkIGxvbmcgc2I7CisgICAgdW5zaWduZWQgbG9uZyByYXRlOworICAgIHVuc2lnbmVkIGxvbmcgZXNmOworICAgIHVuc2lnbmVkIGxvbmcgdGlmczsKKyAgICB1bnNpZ25lZCBsb25nIGVkY2Y7CisgICAgdW5zaWduZWQgbG9uZyBjYjsKKyAgICB1bnNpZ25lZCBsb25nIG1vZGU7CisgICAgdW5zaWduZWQgbG9uZyBwd3JMdmw7CisgICAgdW5zaWduZWQgbG9uZyBuVHJhbnNtaXR0ZXJzOworICAgIHVuc2lnbmVkIGxvbmcgcmV0cnkxcmF0ZTsKKyAgICB1bnNpZ25lZCBsb25nIHJldHJ5MnJhdGU7CisKKyAgICB1bnNpZ25lZCBsb25nIHB3clRlbXBsYXRlOyAvL2VudGlyZSB2YWx1ZQorCit9IHRBTklfREJHX1BXUl9URU1QTDsKKworCit0eXBlZGVmIHN0cnVjdCBzQU5JX0RCR19TVEEgeworCisgICAgdW5zaWduZWQgbG9uZyBzdGFEZXNjQWRkcjsKKyAgICB1bnNpZ25lZCBsb25nIHN0YUR1bXBbMjU2XTsKKworICAgIHRBTklfREJHX1RDX0RFU0MgdGNEZXNjWzldOyAvLyA4IHRjIElkcyBhbmQgOXRoIG1nbXQgVEMKKworICAgIHVuc2lnbmVkIGxvbmcgY2JpdHNfaGNmOworICAgIHVuc2lnbmVkIGxvbmcgY2JpdHNfcHM7CisgICAgdW5zaWduZWQgbG9uZyBjYml0c19wczE7CisgICAgdW5zaWduZWQgbG9uZyBjYml0c190eF9lbjsKKworICAgIHVuc2lnbmVkIGxvbmcgZGVzY1N0YXRfYWVzX3NlbnQ7CisgICAgdW5zaWduZWQgbG9uZyBkZXNjU3RhdF9hZXNfcmVjdjsKKyAgICB1bnNpZ25lZCBsb25nIGRlc2NTdGF0X3JlcGxheXM7CisgICAgdW5zaWduZWQgbG9uZyBkZXNjU3RhdF9mb3JtYXRlcnI7CisgICAgdW5zaWduZWQgbG9uZyBkZXNjU3RhdF9hZXNfZGVjeXB0ZXJyX2RlZmF1bHQ7CisgICAgdW5zaWduZWQgbG9uZyBkZXNjU3RhdF9hZXNfZGVjeXB0ZXJyX3VjYXN0OworCisgICAgdW5zaWduZWQgbG9uZyB0ZnBTdGF0X2ZhaWxlZDsKKyAgICB1bnNpZ25lZCBsb25nIHRmcFN0YXRfcmV0cnk7CisgICAgdW5zaWduZWQgbG9uZyB0ZnBTdGF0X211bHRpcmV0cnk7CisgICAgdW5zaWduZWQgbG9uZyB0ZnBTdGF0X2Fja3RvOworICAgIHVuc2lnbmVkIGxvbmcgdGZwU3RhdF9mcmFnczsKKyAgICB1bnNpZ25lZCBsb25nIHRmcFN0YXRfcnRzQnJxczsKKyAgICB1bnNpZ25lZCBsb25nIHRmcFN0YXRfcGt0czsKKyAgICB1bnNpZ25lZCBsb25nIHRmcFN0YXRfY3RzQmFja1RpbWVvdXRzOworCisKKyAgICB1bnNpZ25lZCBsb25nIHBoeVN0YXRIaTsKKyAgICB1bnNpZ25lZCBsb25nIHBoeVN0YXRMbzsKKworICAgIHVuc2lnbmVkIGxvbmcgYWNrVG9Ob25QcmltUmF0ZXM7CisgICAgdW5zaWduZWQgbG9uZyBuRnJhZ1N1Y2NOb25QcmltUmF0ZXM7CisKK30gdEFOSV9EQkdfU1RBOworCisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX1NUQV9JTkZPIHsKKworICAgIHVuc2lnbmVkIGxvbmcgc3RhSWQ7ICAgIC8vIGlucHV0CisKKyAgICB0QU5JX0RCR19TVEEgc3RhOworCisgICAgdEFOSV9EQkdfU1RBX1RYX1dRX0lORk8gdHh3cVs4XTsKKworICAgIHRBTklfREJHX1BXUl9URU1QTCBwd3JUZW1wbDsKKworfSB0QU5JX0RCR19TVEFfSU5GTzsKKworCit0eXBlZGVmIHN0cnVjdCBzQU5JX0RCR19GUEhZX0lORk8geworCisgICAgdW5zaWduZWQgbG9uZyBmcGh5X3N5bVBlcjsKKyAgICB1bnNpZ25lZCBsb25nIGNjYV9kZWxheU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGNjYV9zdGFydERlbGF5OworICAgIHVuc2lnbmVkIGxvbmcgdGltZVN0YW1wX0hpOworICAgIHVuc2lnbmVkIGxvbmcgdGltZVN0YW1wX0xvOworICAgIHVuc2lnbmVkIGxvbmcgZHJvcFJhdGU7CisgICAgdW5zaWduZWQgbG9uZyBidXJzdFNpemU7CisgICAgdW5zaWduZWQgbG9uZyByZWc7CisgICAgdW5zaWduZWQgbG9uZyBzdGF0X2J5dGVzMDE7CisgICAgdW5zaWduZWQgbG9uZyBzdGF0X2J5dGVzMjM7CisgICAgdW5zaWduZWQgbG9uZyBzdGF0X2J5dGVzNDU7CisgICAgdW5zaWduZWQgbG9uZyBwa3RzX3R4OworICAgIHVuc2lnbmVkIGxvbmcgcGt0c19yeDsKKyAgICB1bnNpZ25lZCBsb25nIHBrdHNfZHJvcHM7CisgICAgdW5zaWduZWQgbG9uZyByeGluX3NvZjsKKyAgICB1bnNpZ25lZCBsb25nIHJ4aW5fZW9mOworICAgIHVuc2lnbmVkIGxvbmcgcnhvdXRfc29mOworICAgIHVuc2lnbmVkIGxvbmcgcnhvdXRfZW9mOworICAgIHVuc2lnbmVkIGxvbmcgdHhpbl9zb2Y7CisgICAgdW5zaWduZWQgbG9uZyB0eGluX2VvZjsKKyAgICB1bnNpZ25lZCBsb25nIHR4b3V0X3NvZjsKKyAgICB1bnNpZ25lZCBsb25nIHR4b3V0X2VvZjsKKworfSB0QU5JX0RCR19GUEhZX0lORk87CisKKworI2RlZmluZSBNQVhfRklGT19FTlRSSUVTX1BFUl9SRVFVRVNUIDIwMAorCit0eXBlZGVmIHN0cnVjdCBzQW5pRHZ0UGh5ZkVudHJ5Cit7CisgICAgdW5zaWduZWQgY2hhciBieXRlc1s1MF07CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBtb2RlOworICAgIHVuc2lnbmVkIGNoYXIgcGh5TGVuOworICAgIHVuc2lnbmVkIGNoYXIgbWFjTGVuOworICAgIHVuc2lnbmVkIGNoYXIgZHJvcEJ5dGU7CisgICAgdW5zaWduZWQgY2hhciByZXNlcnZlZDsKKyAgICB1bnNpZ25lZCBsb25nIHNvZjsKKyAgICB1bnNpZ25lZCBsb25nIGVvZjsKK30gdEFuaUR2dFBoeWZFbnRyeTsKKworCisjZGVmaW5lIEFOSV9EQkdfRklGT19DTURfR0VUICAgIDB4MQorI2RlZmluZSBBTklfREJHX0ZJRk9fQ01EX0NMRUFSICAweDIKKworCit0eXBlZGVmIHN0cnVjdCBzQU5JX0RCR19GUEhZX0ZJRk8geworCisgICAgdW5zaWduZWQgbG9uZyBjb21tYW5kOyAvLyBzZXQgdG8gZWl0aGVyICdnZXQnIG9mICdjbGVhcicgZmlmbworICAgIHVuc2lnbmVkIGxvbmcgZW50cmllczsgLy8gZW50cmllcyB0byByZWFkCisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7IC8vIG9mZnNldCB0byByZWFkIGZyb20KKworICAgIHVuc2lnbmVkIGxvbmcgdG90YWxCeXRlczsKKyAgICB1bnNpZ25lZCBsb25nIGFwcHJveEVudHJpZXM7CisKKyAgICB1bnNpZ25lZCBsb25nIHZhbGlkRW50cmllczsKKyAgICB0QW5pRHZ0UGh5ZkVudHJ5IEZpZm9bTUFYX0ZJRk9fRU5UUklFU19QRVJfUkVRVUVTVF07CisKK30gdEFOSV9EQkdfRlBIWV9GSUZPOworCisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX1JQSFlfTVBJX0lORk8geworCisgICAgdW5zaWduZWQgbG9uZyB0ZnBfcGh5X3NvZjsKKyAgICB1bnNpZ25lZCBsb25nIHRmcF9waHlfZW9mOworICAgIHVuc2lnbmVkIGxvbmcgcGh5X3RmcF9yZXE7CisgICAgdW5zaWduZWQgbG9uZyB0eGFfbXBpX2RhdGFfcmVxOworICAgIHVuc2lnbmVkIGxvbmcgdHhiX21waV9kYXRhX3JlcTsKKyAgICB1bnNpZ25lZCBsb25nIG1waV90eGFfZGF0YV92YWw7CisgICAgdW5zaWduZWQgbG9uZyBtcGlfdHhiX2RhdGFfdmFsOworICAgIHVuc2lnbmVkIGxvbmcgbXBpX3R4YV9wa3RlbmQ7CisgICAgdW5zaWduZWQgbG9uZyBtcGlfdHhiX3BrdGVuZDsKKyAgICB1bnNpZ25lZCBsb25nIG1waV90eGN0bF9wa3RlbmQ7CisgICAgdW5zaWduZWQgbG9uZyBtcGlfdHhjdGxfY3RsYnl0ZXNfdmFsOworCit9IHRBTklfREJHX1JQSFlfTVBJX0lORk87CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0FOSV9EQkdfUlBIWV9QTUlfSU5GTyB7CisKKyAgICB1bnNpZ25lZCBsb25nIHJ4YV9tcGlfcGt0c3RhcnQ7CisgICAgdW5zaWduZWQgbG9uZyByeGJfbXBpX3BrdHN0YXJ0OworICAgIHVuc2lnbmVkIGxvbmcgcnhhX21waV9wa3RlbmQ7CisgICAgdW5zaWduZWQgbG9uZyByeGJfbXBpX3BrdGVuZDsKKyAgICB1bnNpZ25lZCBsb25nIHJ4YV9tcGlfZGF0YV92YWw7CisgICAgdW5zaWduZWQgbG9uZyByeGJfbXBpX2RhdGFfdmFsOworICAgIHVuc2lnbmVkIGxvbmcgcmhwX3BoeV9zaHV0b2ZmOworICAgIHVuc2lnbmVkIGxvbmcgcmhwX3BoeV9zb2ZfYzsKKyAgICB1bnNpZ25lZCBsb25nIHJocF9waHlfc29mX3A7CisgICAgdW5zaWduZWQgbG9uZyByaHBfcGh5X2VvZl9jOworICAgIHVuc2lnbmVkIGxvbmcgcmhwX3BoeV9lb2ZfcDsKKyAgICB1bnNpZ25lZCBsb25nIHBoeV9yaHBfZGF0YV92YWw7CisgICAgdW5zaWduZWQgbG9uZyBwbWlfaW50OworCit9IHRBTklfREJHX1JQSFlfUE1JX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX1JQSFlfUEhZSU5UX0lORk8geworCisgICAgdW5zaWduZWQgbG9uZyBzdGF0dXM7CisgICAgdW5zaWduZWQgbG9uZyBmYXN0X21hc2s7CisgICAgdW5zaWduZWQgbG9uZyBzbG93X21hc2s7CisgICAgdW5zaWduZWQgbG9uZyBob3N0X21hc2s7CisKK30gdEFOSV9EQkdfUlBIWV9QSFlJTlRfSU5GTzsKKworCit0eXBlZGVmIHN0cnVjdCBzQU5JX0RCR19SUEhZX0lORk8geworCisgICAgdEFOSV9EQkdfUlBIWV9NUElfSU5GTyBtcGk7CisgICAgdEFOSV9EQkdfUlBIWV9QTUlfSU5GTyBwbWk7CisgICAgdEFOSV9EQkdfUlBIWV9QSFlJTlRfSU5GTyBwaHlpbnQ7CisKK30gdEFOSV9EQkdfUlBIWV9JTkZPOworCisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX1NDSF9JTkZPCit7CisgICAgdW5zaWduZWQgbG9uZyBjdXJTY2g7IC8vIFJPCisgICAgdW5zaWduZWQgbG9uZyBudW1TY2g7IC8vIFJPCisgICAgdW5zaWduZWQgbG9uZyBudW1JbnQ7IC8vIFJPCisgICAgdW5zaWduZWQgbG9uZyBudW1FbmRJbnQ7IC8vIFJPCisgICAgdW5zaWduZWQgbG9uZyBudW1DRkI7IC8vIFJPCisgICAgdW5zaWduZWQgbG9uZyBmaXJzdENGQjsgLy8gUk8KKworICAgIHVuc2lnbmVkIGxvbmcgZml4ZWRTY2g7IC8vIFJXCisgICAgdW5zaWduZWQgbG9uZyBnRHZ0UG9sbDsgLy8gUlcKKyAgICB1bnNpZ25lZCBsb25nIG1heFRpbWVvdXQ7IC8vIFJXCisgICAgdW5zaWduZWQgbG9uZyBtaW5UeG9wOyAvLyBSVworICAgIHVuc2lnbmVkIGxvbmcgbWF4VHhvcDsgLy8gUlcKKyAgICB1bnNpZ25lZCBsb25nIG1heFRjaWQ7IC8vIFJXCisgICAgdW5zaWduZWQgbG9uZyBtYXhTdGE7IC8vIFJXCisgICAgdW5zaWduZWQgbG9uZyBtaW5TdGE7IC8vIFJXCisgICAgdW5zaWduZWQgbG9uZyBtYXhJbnN0OyAvLyBSVworCisgICAgdW5zaWduZWQgbG9uZyBmaXJzdFNjaDsgLy8gUk8KKyAgICB1bnNpZ25lZCBsb25nIGNmYlN0YXJ0OyAvLyBSTworICAgIHVuc2lnbmVkIGxvbmcgY2ZiRW5kOyAvLyBSTworICAgIHVuc2lnbmVkIGxvbmcgY3VtQ0ZCOyAvLyBSTworICAgIHVuc2lnbmVkIGxvbmcgY3VtQ1A7IC8vIFJPCisKKyAgICB1bnNpZ25lZCBsb25nIGhhbHRTY2g7IC8vIFJXCisgICAgdW5zaWduZWQgbG9uZyBudW1UaW07IC8vIFJPCit9IHRBTklfREJHX1NDSF9JTkZPOworCisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX0hDRl9JTkZPIHsKKworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgYlNldEluZm87ICAgICAvLyAwID0gcmVhZCBpbmZvLCAxID0gc2V0IGluZm8KKyAgICB0QU5JX0RCR19TQ0hfSU5GTyAgIHNjaEluZm87CisKK30gdEFOSV9EQkdfSENGX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHNBTklfREJHX0FQX1NXSVRDSF9JTkZPIHsKKworCisgICAgLy8gU3BhY2UgdG8gaG9sZCB0aGUgU1NJRExpc3QgYW5kIHRoZSBCU1NJRC4KKyAgICB1bnNpZ25lZCBjaGFyICAgU1NJRF9CU1NJRF9CVUZbMjYyXTsgLy8gMjYyID09IFdOSUFQSV9NQVhfU1NJRF9MSVNUX1NUUiArIFdOSUFQSV9CU1NJRF9TSVpFCisKKworfSB0QU5JX0RCR19BUF9TV0lUQ0hfSU5GTzsKKworCit0eXBlZGVmIHN0cnVjdCBzQU5JX0RCR19JTkZPIHsKKworICAgIHVuc2lnbmVkIGxvbmcgZGJnSW5mb01hc2s7IC8vIGluZGljYXRlcyB3aGljaCBtZW1iZXJzIGFyZSB2YWxpZAorCisgICAgdEFOSV9EQkdfTUlTQ19JTkZPIG1pc2NJbmZvOworICAgIHRBTklfREJHX0JNVV9JTkZPIGJtdUluZm87CisgICAgdEFOSV9EQkdfVEZQX0lORk8gdGZwSW5mbzsKKyAgICB0QU5JX0RCR19SSFBfSU5GTyByaHBJbmZvOworICAgIHRBTklfREJHX1JGUF9JTkZPIHJmcEluZm87CisgICAgdEFOSV9EQkdfU1RBX0lORk8gc3RhSW5mbzsKKyAgICB0QU5JX0RCR19GUEhZX0lORk8gZnBoeUluZm87CisgICAgdEFOSV9EQkdfRlBIWV9GSUZPIGZwaHlGaWZvOworICAgIHRBTklfREJHX1JQSFlfSU5GTyBycGh5SW5mbzsKKyAgICB0QU5JX0RCR19IQ0ZfSU5GTyBoY2ZJbmZvOworICAgIHRBTklfREJHX1NQX0lORk8gc3BJbmZvOworICAgIHRBTklfREJHX0NQX0lORk8gY3BJbmZvOworCit9IHRBTklfREJHX0lORk87CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGR2dEdldER1bXBJbmZvKHZvaWQgKnBNYWMsIHRBTklfREJHX0lORk8gKnBEYmdJbmZvICk7CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGR2dEdldENvbmZpZ0luZm8odm9pZCAqcE1hYywgdEFOSV9EQkdfVEVTVF9JTkZPICpwVGVzdEluZm8gKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgZHZ0U2V0U3RvcFRlc3RGbGFnKCB1bnNpZ25lZCBjaGFyIHN0b3BUZXN0ICk7CisjZWxzZQorZXh0ZXJuIHZvaWQgZHZ0U2V0U3RvcFRlc3RGbGFnKCB1bnNpZ25lZCBjaGFyIHN0b3BUZXN0ICk7CisjZW5kaWYKKworCisjZW5kaWYgLy8gX0FOSURCR1RFU1RfSF8KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL2luYy9hbmlHbG9iYWwuaCBiL0NPUkUvTUFDL2luYy9hbmlHbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBhNmJmCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvaW5jL2FuaUdsb2JhbC5oCkBAIC0wLDAgKzEsMTEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiBhbmlHbG9iYWwuaDogTUFDIE1vZHVsZXMgQWRhcHRlciBEZWZpbml0aW9ucy4KKyAqIEF1dGhvcjogICAgICBWLiBLLiBLYW5kYXJwYQorICogRGF0ZTogICAgMTAvMjUvMjAwMgorICoKKyAqIEhpc3Rvcnk6LQorICogRGF0ZTogMDQvMDgvMjAwOCAgICAgTW9kaWZpZWQgYnk6IFNhbnRvc2ggTWFuZGlnYW5hbCAgICAgICAgIAorICogTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uOiBBZGRlZCB0aGUgbG9nRHVtcC5oIGhlYWRlciBmaWxlIGFuZCBkZWZpbmVkIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFRhYmxlY3VycmVudElkLCBkdW1wVGFibGVFbnRyeS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX0FOSUdMT0JBTF9ICisjZGVmaW5lIF9BTklHTE9CQUxfSAorCisvLyBUYWtlIGNhcmUgdG8gYXZvaWQgcmVkZWZpbml0aW9uIG9mIHRoaXMgdHlwZSwgaWYgaXQgaXMKKy8vIGFscmVhZHkgZGVmaW5lZCBpbiAiaGFsV21tQXBpLmgiCisjaWYgIWRlZmluZWQoX0hBTE1BQ19XTU1fQVBJX0gpCit0eXBlZGVmIHN0cnVjdCBzQW5pU2lyR2xvYmFsICp0cEFuaVNpckdsb2JhbDsKKyNlbmRpZgorCisjaW5jbHVkZSAiaGFsVHlwZXMuaCIKKyNpbmNsdWRlICJzaXJDb21tb24uaCIKKyNpbmNsdWRlICJhbmlTeXN0ZW1EZWZzLmgiCisjaWZuZGVmIEFOSV9PU19UWVBFX09TWAorI2luY2x1ZGUgInN5c0RlZi5oIgorI2VuZGlmCisjaW5jbHVkZSAiZHBoR2xvYmFsLmgiCisjaW5jbHVkZSAibGltR2xvYmFsLmgiCisjaW5jbHVkZSAicG1tR2xvYmFsLmgiCisjaW5jbHVkZSAic2NoR2xvYmFsLmgiCisjaW5jbHVkZSAic3lzR2xvYmFsLmgiCisjaW5jbHVkZSAiY2ZnR2xvYmFsLmgiCisjaW5jbHVkZSAidXRpbHNHbG9iYWwuaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxHbG9iYWwuaCIKKyNpbmNsdWRlICJoYWxEYXRhU3RydWN0LmgiCisjaW5jbHVkZSAicGh5R2xvYmFsLmgiCisjaW5jbHVkZSAicHR0TW9kdWxlLmgiCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgIndsYW5fcWN0X2hhbC5oIgorI2VuZGlmIAorCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQKKyNpbmNsdWRlICJwbWMuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiY3NyQXBpLmgiCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlICJzbWVfRlRBcGkuaCIKKyNlbmRpZgorI2luY2x1ZGUgImNzclN1cHBvcnQuaCIKKyNpbmNsdWRlICJzbWVJbnRlcm5hbC5oIgorI2luY2x1ZGUgImNjbUFwaS5oIgorI2luY2x1ZGUgImJ0Y0FwaS5oIgorI2luY2x1ZGUgImNzckludGVybmFsLmgiCisKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInNtZVJybUludGVybmFsLmgiCisjaW5jbHVkZSAicnJtR2xvYmFsLmgiCisjZW5kaWYKKyNpZiBkZWZpbmVkIEZFQVRVUkVfV0xBTl9DQ1gKKyNpbmNsdWRlICJjY3hBcGkuaCIKKyNpbmNsdWRlICJjY3hHbG9iYWwuaCIKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyNpbmNsdWRlICJwMnBfQXBpLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlIDxsaW1GVERlZnMuaD4KKyNlbmRpZgorCisKKyNpZmRlZiBBTklfRFZUX0RFQlVHCisjaW5jbHVkZSAiZHZ0TW9kdWxlLmgiCisjZW5kaWYKKworLy8gTmV3IEhBTCBBUEkgaW50ZXJmYWNlIGRlZnMuCisjaW5jbHVkZSAibG9nRHVtcC5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisvL0NoZWNrIGlmIHRoaXMgZGVmaW5pdGlvbiBjYW4gYWN0dWFsbHkgbW92ZSBoZXJlIGZyb20gaGFsSW50ZXJuYWwuaCBldmVuIGZvciBWb2xhbnMuIEluIHRoYXQgY2FzZQorLy90aGlzIGZlYXR1cml6YXRpb24gY2FuIGJlIHJlbW92ZWQuCisjZGVmaW5lIFBNQUNfU1RSVUNUKCBfaEhhbCApICAoICAodHBBbmlTaXJHbG9iYWwpX2hIYWwgKQorI2VuZGlmCisKKyNkZWZpbmUgQU5JX0RSSVZFUl9UWVBFKHBNYWMpICAgICAoKCh0cEFuaVNpckdsb2JhbCkocE1hYykpLT5nRHJpdmVyVHlwZSkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJzcyBRb3MgQ2FwcyBiaXQgbWFwIGRlZmluaXRpb24KKyNkZWZpbmUgTElNX0JTU19DQVBTX09GRlNFVF9IQ0YgMAorI2RlZmluZSBMSU1fQlNTX0NBUFNfT0ZGU0VUX1dNRSAxCisjZGVmaW5lIExJTV9CU1NfQ0FQU19PRkZTRVRfV1NNIDIKKworI2RlZmluZSBMSU1fQlNTX0NBUFNfSENGICgxIDw8IExJTV9CU1NfQ0FQU19PRkZTRVRfSENGKQorI2RlZmluZSBMSU1fQlNTX0NBUFNfV01FICgxIDw8IExJTV9CU1NfQ0FQU19PRkZTRVRfV01FKQorI2RlZmluZSBMSU1fQlNTX0NBUFNfV1NNICgxIDw8IExJTV9CU1NfQ0FQU19PRkZTRVRfV1NNKQorCisvLyBjYXAgc2hvdWxkIGJlIG9uZSBvZiBIQ0YvV01FL1dTTQorI2RlZmluZSBMSU1fQlNTX0NBUFNfR0VUKGNhcCwgdmFsKSAoKCh2YWwpICYgKExJTV9CU1NfQ0FQU18gIyMgY2FwKSkgPj4gTElNX0JTU19DQVBTX09GRlNFVF8gIyMgY2FwKQorI2RlZmluZSBMSU1fQlNTX0NBUFNfU0VUKGNhcCwgdmFsKSAodmFsKSB8PSAoTElNX0JTU19DQVBTXyAjIyBjYXAgKQorI2RlZmluZSBMSU1fQlNTX0NBUFNfQ0xSKGNhcCwgdmFsKSAodmFsKSAmPSAofiAoTElNX0JTU19DQVBTXyAjIyBjYXApKQorCisvLyA0MCBiZWFjb25zIHBlciBoZWFydCBiZWF0IGludGVydmFsIGlzIHRoZSBkZWZhdWx0ICsgMSB0byBjb3VudCB0aGUgcmVzdAorI2RlZmluZSBNQVhfTk9fQkVBQ09OU19QRVJfSEVBUlRfQkVBVF9JTlRFUlZBTCA0MQorCisvKiBtYXggbnVtYmVyIG9mIGxlZ2FjeSBic3NpZCB3ZSBjYW4gc3RvcmUgZHVyaW5nIHNjYW4gb24gb25lIGNoYW5uZWwgKi8KKyNkZWZpbmUgTUFYX05VTV9MRUdBQ1lfQlNTSURfUEVSX0NIQU5ORUwgICAgMTAKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1AyUAorI2RlZmluZSBQMlBfV0lMRENBUkRfU1NJRCAiRElSRUNULSIgLy9UT0RPIFB1dCBpdCBpbiBwcm9wZXIgcGxhY2U7CisjZGVmaW5lIFAyUF9XSUxEQ0FSRF9TU0lEX0xFTiA3CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfQ09OQ1VSUkVOVF9QMlAKKyNkZWZpbmUgTUFYX05PX09GX1AyUF9TRVNTSU9OUyAgNQorI2VuZGlmIC8vV0xBTl9GRUFUVVJFX0NPTkNVUlJFTlRfUDJQCisjZW5kaWYgLy9XTEFOX0ZFQVRVUkVfUDJQCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENoYW5nZSBjaGFubmVsIGdlbmVyaWMgc2NoZW1lCit0eXBlZGVmIHZvaWQgKCpDSEFOR0VfQ0hBTk5FTF9DQUxMQkFDSykodHBBbmlTaXJHbG9iYWwgcE1hYywgZUhhbFN0YXR1cyBzdGF0dXMsIHRBTklfVTMyICpkYXRhLAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvLy8gTElNIGdsb2JhbCBkZWZpbml0aW9ucwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVNpckxpbUlic3MKK3sKKyAgICB2b2lkICpwSGRyOworICAgIHZvaWQgKnBCZWFjb247Cit9IHRBbmlTaXJMaW1JYnNzOworCit0eXBlZGVmIHN0cnVjdCBzRGlhbG9ndWVUb2tlbgoreworICAgIC8vYnl0ZXMgMC0zCisgICAgdEFOSV9VMTYgYXNzb2NJZDsKKyAgICB0QU5JX1U4IHRva2VuOworICAgIHRBTklfVTggcnN2ZDE7CisgICAgLy9CeXRlcyA0LTcKKyAgICB0QU5JX1UxNiB0aWQ7CisgICAgdEFOSV9VOCByc3ZkMlsyXTsKKworICAgIHN0cnVjdCBzRGlhbG9ndWVUb2tlbiogbmV4dDsKK310RGlhbG9ndWVUb2tlbiwgKnRwRGlhbG9ndWVUb2tlbjsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbVRpbWVycworeworICAgIC8vVElNRVJTIElOIExJTSBBUkUgTk9UIFNVUFBPU0VEIFRPIEJFIFpFUk9FRCBPVVQgRFVSSU5HIFJFU0VULgorICAgIC8vRFVSSU5HIGxpbUluaXRpYWxpemUgRE9OT1QgWkVSTyBUSEVNIE9VVC4KKworLy9TVEEgU1BFQ0lGSUMgVElNRVJTCisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICAvLyBQZXJpb2RpYyBiYWNrZ3JvdW5kIHNjYW4gdGltZXIKKyAgICBUWF9USU1FUiAgIGdMaW1CYWNrZ3JvdW5kU2NhblRpbWVyOworI2VuZGlmCisKKyAgICBUWF9USU1FUiAgICBnTGltUHJlQXV0aENsbnVwVGltZXI7CisgICAgLy9UWF9USU1FUiAgICBnTGltQXV0aFJlc3BvbnNlVGltZXJbSEFMX05VTV9TVEFdOworCisgICAgLy8gQXNzb2NpYXRpb24gcmVsYXRlZCB0aW1lcnMKKyAgICBUWF9USU1FUiAgICBnTGltQXNzb2NGYWlsdXJlVGltZXI7CisgICAgVFhfVElNRVIgICAgZ0xpbVJlYXNzb2NGYWlsdXJlVGltZXI7CisKKworICAgIC8vLyBIZWFydGJlYXQgdGltZXIgb24gU1RBCisgICAgVFhfVElNRVIgICAgZ0xpbUhlYXJ0QmVhdFRpbWVyOworCisgICAgLy8vIFdhaXQgZm9yIFByb2JlIGFmdGVyIEhlYXJ0YmVhdCBmYWlsdXJlIHRpbWVyIG9uIFNUQQorICAgIFRYX1RJTUVSICAgIGdMaW1Qcm9iZUFmdGVySEJUaW1lcjsKKworCisgICAgLy8gQXV0aGVudGljYXRpb24gcmVsYXRlZCB0aW1lcnMKKyAgICBUWF9USU1FUiAgICAgICAgICAgIGdMaW1BdXRoRmFpbHVyZVRpbWVyOworCisgICAgLy8gSm9pbiBGYWlsdXJlIHRpbWVvdXQgb24gU1RBCisgICAgVFhfVElNRVIgICAgICAgICAgICAgIGdMaW1Kb2luRmFpbHVyZVRpbWVyOworCisgICAgLy8gS2VlcGFsaXZlIHRpbWVyCisgICAgVFhfVElNRVIgICAgZ0xpbUtlZXBhbGl2ZVRpbWVyOworCisgICAgLy8gU2NhbiByZWxhdGVkIHRpbWVycworICAgIFRYX1RJTUVSICAgIGdMaW1NaW5DaGFubmVsVGltZXI7CisgICAgVFhfVElNRVIgICAgZ0xpbU1heENoYW5uZWxUaW1lcjsKKyAgICBUWF9USU1FUiAgICBnTGltUGVyaW9kaWNQcm9iZVJlcVRpbWVyOworCisgICAgLy8gQ05GX1dBSVQgdGltZXIKKyAgICBUWF9USU1FUiAgICAgICAgICAgICpncExpbUNuZldhaXRUaW1lcjsKKworICAgIC8vIFNlbmQgRGlzYXNzb2NpYXRlIGZyYW1lIHRocmVzaG9sZCBwYXJhbWV0ZXJzCisgICAgVFhfVElNRVIgICAgICAgICAgICBnTGltU2VuZERpc2Fzc29jRnJhbWVUaHJlc2hvbGRUaW1lcjsKKworICAgIFRYX1RJTUVSICAgICAgIGdMaW1BZGR0c1JzcFRpbWVyOyAgIC8vIG1heCB3YWl0IGZvciBhIHJlc3BvbnNlCisKKyAgICAvLyBVcGRhdGUgT0xCQyBDYWNoZSBUaW1lcgorICAgIFRYX1RJTUVSICAgIGdMaW1VcGRhdGVPbGJjQ2FjaGVUaW1lcjsKKworICAgIFRYX1RJTUVSICAgICAgICAgICBnTGltQ2hhbm5lbFN3aXRjaFRpbWVyOworICAgIC8vIFRoaXMgVElNRVIgaXMgc3RhcnRlZCBvbiB0aGUgU1RBLCBhcyBpbmRpY2F0ZWQgYnkgdGhlCisgICAgLy8gQVAgaW4gaXRzIFF1aWV0IEJTUyBJRSwgZm9yIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwKKyAgICBUWF9USU1FUiAgICAgICAgICAgZ0xpbVF1aWV0VGltZXI7CisgICAgLy8gVGhpcyBUSU1FUiBpcyBzdGFydGVkIG9uIHRoZSBBUCwgcHJpb3IgdG8gdGhlIEFQIGdvaW5nCisgICAgLy8gaW50byBMRUFSTiBtb2RlCisgICAgLy8gVGhpcyBUSU1FUiBpcyBzdGFydGVkIG9uIHRoZSBTVEEsIGZvciB0aGUgc3BlY2lmaWVkCisgICAgLy8gcXVpZXQgZHVyYXRpb24KKyAgICBUWF9USU1FUiAgICAgICAgICAgZ0xpbVF1aWV0QnNzVGltZXI7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIFRYX1RJTUVSICAgICAgICAgICBnTGltRlRQcmVBdXRoUnNwVGltZXI7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICBUWF9USU1FUiAgICAgICAgICAgZ0xpbUNjeFRzbVRpbWVyOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIFRYX1RJTUVSICAgICAgICAgICBnTGltUmVtYWluT25DaGFubmVsVGltZXI7CisjZW5kaWYKKworLy8qKioqKioqKioqKioqKioqKioqKlRJTUVSIFNFQ1RJT04gRU5EUyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBBTEwgVEhFIEZJRUxEUyBCRUxPVyBUSElTIENBTiBCRSBaRVJPRUQgT1VUIGluIGxpbUluaXRpYWxpemUKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCit9dExpbVRpbWVyczsKKworCit0eXBlZGVmIHN0cnVjdCBzQW5pU2lyTGltCit7CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgIFRJTUVSIFJFTEFURUQgU1RBUlQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgdExpbVRpbWVycyBsaW1UaW1lcnM7CisgICAgLy8vIEZsYWcgdG8gdHJhY2sgaWYgTElNIHRpbWVycyBhcmUgY3JlYXRlZCBvciBub3QKKyAgICB0QU5JX1UzMiAgIGdMaW1UaW1lcnNDcmVhdGVkOworCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgVElNRVIgUkVMQVRFRCBFTkQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgIFNDQU4vTEVBUk4gUkVMQVRFRCBTVEFSVCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLyoqCisgICAgICogVGhpcyBmbGFnIHdoZW4gc2V0LCB3aWxsIHVzZSBzY2FuIG1vZGUgaW5zdGVhZCBvZgorICAgICAqIExlYXJuIG1vZGUgb24gQlAvQVAuIEJ5IGRlZmF1bHQgdGhpcyBmbGFnIGlzIHNldAorICAgICAqIHRvIHRydWUgdW50aWwgSElGIGdldHRpbmcgc3R1Y2sgaW4gMHg4MDAgc3RhdGUgaXMKKyAgICAgKiBkZWJ1Z2dlZC4KKyAgICAgKi8KKyAgICB0QU5JX1UzMiAgICAgZ0xpbVVzZVNjYW5Nb2RlRm9yTGVhcm5Nb2RlOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIG1vZHVsZXMgb3RoZXIgdGhhbiBMSU0KKyAgICAgKiB0byBzZWUgaWYgc3lzdGVtIGlzIGluIHNjYW4vbGVhcm4gbW9kZSBvciBub3QKKyAgICAgKi8KKyAgICB0QU5JX1UzMiAgICBnTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlOworCisgICAgLy8gU2NhbiByZWxhdGVkIGdsb2JhbHMgb24gU1RBCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgIGdMaW1SZXR1cm5BZnRlckZpcnN0TWF0Y2g7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgIGdMaW0yNEJhbmQxMWRTY2FuRG9uZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgZ0xpbTUwQmFuZDExZFNjYW5Eb25lOworICAgIHRBTklfVTggICAgICAgICAgICAgICBnTGltUmV0dXJuVW5pcXVlUmVzdWx0czsKKworICAgIC8vIEJhY2tncm91bmQgU2NhbiByZWxhdGVkIGdsb2JhbHMgb24gU1RBCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBnTGltTnVtT2ZCYWNrZ3JvdW5kU2NhblN1Y2Nlc3M7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBnTGltTnVtT2ZDb25zZWN1dGl2ZUJrZ25kU2NhbkZhaWx1cmU7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBnTGltTnVtT2ZGb3JjZWRCa2duZFNjYW47CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICBnTGltQmFja2dyb3VuZFNjYW5EaXNhYmxlOyAgICAgIC8vYmFzZWQgb24gQkcgdGltZXIKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgIGdMaW1Gb3JjZUJhY2tncm91bmRTY2FuRGlzYWJsZTsgLy9kZWJ1ZyBjb250cm9sIGZsYWcKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgIGdMaW1CYWNrZ3JvdW5kU2NhblRlcm1pbmF0ZTsgICAgLy9jb250cm9sbGVkIGJ5IFNNRQorICAgIHRBTklfVTggICAgICAgICAgICAgICAgZ0xpbVJlcG9ydEJhY2tncm91bmRTY2FuUmVzdWx0czsvL2NvbnRyb2xsZWQgYnkgU01FICAgIAorCisgICAgLy8vIFBsYWNlIGhvbGRlciBmb3IgY3VycmVudCBjaGFubmVsIElECisgICAgLy8vIGJlaW5nIHNjYW5uZWQKKyAgICB0QU5JX1UzMiAgIGdMaW1DdXJyZW50U2NhbkNoYW5uZWxJZDsKKworICAgIC8vIEhvbGQgb250byBTQ0FOIGNyaXRlcmlhCisgICAgdExpbU1sbVNjYW5SZXEgKmdwTGltTWxtU2NhblJlcTsKKworICAgIC8vLyBUaGlzIGluZGljYXRlcyB0b3RhbCBsZW5ndGggb2YgJ21hdGNoZWQnIHNjYW4gcmVzdWx0cworICAgIHRBTklfVTE2ICAgZ0xpbU1sbVNjYW5SZXN1bHRMZW5ndGg7CisKKyAgICAvLy8gVGhpcyBpbmRpY2F0ZXMgdG90YWwgbGVuZ3RoIG9mICdjYWNoZWQnIHNjYW4gcmVzdWx0cworICAgIHRBTklfVTE2ICAgZ0xpbVNtZVNjYW5SZXN1bHRMZW5ndGg7CisKKyAgICAvKioKKyAgICAgKiBIYXNoIHRhYmxlIGRlZmluaXRpb24gZm9yIHN0b3JpbmcgU0NBTiByZXN1bHRzCisgICAgICogVGhpcyBpcyB0aGUgcGxhY2VkIGhvbGRlciBmb3IgJ2NhY2hlZCcgc2NhbiByZXN1bHRzCisgICAgICovCisgICAgdExpbVNjYW5SZXN1bHROb2RlCisgICAgICAgICAgICpnTGltQ2FjaGVkU2Nhbkhhc2hUYWJsZVtMSU1fTUFYX05VTV9PRl9TQ0FOX1JFU1VMVFNdOworCisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICAvLy8gUGxhY2UgaG9sZGVyIGZvciBjdXJyZW50IGNoYW5uZWwgSUQKKyAgICAvLy8gYmVpbmcgc2Nhbm5lZCBkdXJpbmcgYmFja2dyb3VuZCBzY2FubmluZworICAgIHRBTklfVTMyICAgZ0xpbUJhY2tncm91bmRTY2FuQ2hhbm5lbElkOworICAgIC8vLyBmbGFnIHRvIGluZGljYXRlIHRoYXQgYmFjZ3JvdW5kIHNjYW4gdGltZXIgaGFzIGJlZW4gc3RhcnRlZAorICAgIHRBTklfVTggICAgZ0xpbUJhY2tncm91bmRTY2FuU3RhcnRlZDsKKworICAgIC8qIFVzZWQgdG8gc3RvcmUgdGhlIGxpc3Qgb2YgbGVnYWN5IGJzcyBzdGEgZGV0ZWN0ZWQgZHVyaW5nIHNjYW4gb24gb25lIGNoYW5uZWwgKi8KKyAgICB0QU5JX1UxNiAgICBnTGltUmVzdG9yZUNCTnVtU2NhbkludGVydmFsOworICAgIHRBTklfVTE2ICAgIGdMaW1SZXN0b3JlQ0JDb3VudDsKKyAgICB0U2lyTWFjQWRkciBnTGltTGVnYWN5QnNzaWRMaXN0W01BWF9OVU1fTEVHQUNZX0JTU0lEX1BFUl9DSEFOTkVMXTsKKyNlbmRpZgorCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGZsYWcgaXMgMSwKKyAgICAvLyAgIHRoZW4sIExJTSB3aWxsICJ0cnkgYW5kIHRyaWdnZXIiIGEgYmFja2dyb3VuZAorICAgIC8vICAgc2NhbiB3aGVuZXZlciBpdCByZWNlaXZlcyBhIFF1aWV0IEJTUyBJRQorICAgIC8vCisgICAgLy8gSWYgdGhpcyBmbGFnIGlzIDAsCisgICAgLy8gICB0aGVuLCBMSU0gd2lsbCBzaW1wbHkgc2h1dC1vZmYgVHgvUnggd2hlbmV2ZXIgaXQKKyAgICAvLyAgIHJlY2VpdmVzIGEgUXVpZXQgQlNTIElFLgorICAgIC8vICAgVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciB3aGVuIGEgUXVpZXQgQlNTIElFCisgICAgLy8gICBpcyByZWNlaXZlZCBhbmQgMTFIIGlzIGVuYWJsZWQKKyAgICAvLworICAgIHRBTklfVTMyIGdMaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW5EdXJpbmdRdWlldEJzczsKKworI2lmZGVmIEFOSV9BUF9TREsKKyAgICB0TGltU2NhbkR1cmF0aW9uQ29udmVydCBnTGltU2NhbkR1cmF0aW9uQ29udmVydDsgLyogVXNlZCB0byBzdG9yZSBjb252ZXJ0ZWQgc2NhbiBkdXJhdGlvbiB2YWx1ZXMgaW4gVFUgYW5kIFRJQ0tTICovCisjZW5kaWYgLyogQU5JX0FQX1NESyAqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIC8vIFRoaXMgdmFyaWFibGUgc3RvcmUgdGhlIHRvdGFsIGR1cmF0aW9uIHRvIGRvIHNjYW4KKyAgICB0QU5JX1UzMiBnVG90YWxTY2FuRHVyYXRpb247CisjZW5kaWYgICAgCisKKyAgICAvLyBhYm9ydCBzY2FuIGlzIHVzZWQgdG8gYWJvcnQgYW4gb24tZ29pbmcgc2NhbgorICAgIHRBTklfVTggYWJvcnRTY2FuOworICAgIHRMaW1TY2FuQ2huSW5mbyBzY2FuQ2huSW5mbzsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBTQ0FOL0xFQVJOIFJFTEFURUQgU1RBUlQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIHRTaXJNYWNBZGRyICAgICAgICAgZ1NlbGZNYWNBZGRyOyAgIC8vYWRkZWQgZm9yIEJULUFNUCBTdXBwb3J0IAorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBCU1MgUkVMQVRFRCBFTkQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFBsYWNlIGhvbGRlciBmb3IgU3RhcnRCc3NSZXEgbWVzc2FnZQorICAgIC8vIHJlY2VpdmVkIGJ5IFNNRSBzdGF0ZSBtYWNoaW5lCisKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgLy8gUGxhY2UgaG9sZGVyIGZvciBOZWlnaGJvciBCU1MgbGlzdCByZWNlaXZlZCBpbgorICAgIC8vIFNNRV9KT0lOL1JFQVNTT0NfUkVRIG1lc3NhZ2VzCisgICAgdFNpck11bHRpcGxlTmVpZ2hib3JCc3NJbmZvIGdMaW1OZWlnaGJvckJzc0xpc3Q7CisjZW5kaWYKKyAgdEFOSV9VOCAgICAgICAgICAgICBnTGltQ3VycmVudEJzc1VhcHNkOworCisKKy8qIFRoZXNlIGdsb2JhbCB2YXJpYmFsZXMgYXJlIG5vdyBtb3ZlZCB0byBzZXNzaW9uIFRhYmxlIGluIG9yZGVyIHRvIHN1cHBvcnQgQlQtQU1QIG9jdCA5dGggcmV2aWV3ICAqLworI2lmIDAKKyAgICAvLyBQbGFjZSBob2xkZXIgZm9yIEJTUyBkZXNjcmlwdGlvbiB0aGF0IHdlJ3JlCisgICAgLy8gY3VycmVudGx5IGpvaW5lZCB3aXRoCisgICAgdFNpck1hY0FkZHIgICAgICAgICBnTGltQ3VycmVudEJzc0lkOworICAgIHRTaXJNYWNDaGFuTnVtICAgICAgZ0xpbUN1cnJlbnRDaGFubmVsSWQ7CisgICAgdFNpck1hY1NTaWQgICAgICAgICBnTGltQ3VycmVudFNTSUQ7CisgICAgdEFOSV9VMTYgICAgICAgICAgICBnTGltQ3VycmVudEJzc0NhcHM7CisgICAgCisgICAgLy8gUW9zQ2FwcyBpcyBhIGJpdCBtYXAgb2YgdmFyaW91cyBxb3MgY2FwYWJpbGl0aWVzIC0gc2VlIGRlZm4gYWJvdmUKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGdMaW1DdXJyZW50QnNzUW9zQ2FwczsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGdMaW1DdXJyZW50QnNzUHJvcENhcDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGdMaW1TZW50Q2Fwc0NoYW5nZU50ZjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIGdMaW1DdXJyZW50VGl0YW5IdENhcHM7CisKKyAgICAvLyBQbGFjZSBob2xkZXIgZm9yIEJTUyBkZXNjcmlwdGlvbiB0aGF0CisgICAgLy8gd2UncmUgY3VycmVudGx5IFJlYXNzb2NpYXRpbmcKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgZ0xpbVJlYXNzb2NCc3NJZDsKKyAgICB0U2lyTWFjQ2hhbk51bSAgICAgICAgZ0xpbVJlYXNzb2NDaGFubmVsSWQ7CisgICAgdFNpck1hY1NTaWQgICAgICAgICAgIGdMaW1SZWFzc29jU1NJRDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgZ0xpbVJlYXNzb2NCc3NDYXBzOworICAgIHRBTklfVTggICAgICAgICAgICAgICBnTGltUmVhc3NvY0Jzc1Fvc0NhcHM7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgIGdMaW1SZWFzc29jQnNzUHJvcENhcDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgZ0xpbVJlYXNzb2NUaXRhbkh0Q2FwczsKKworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGdMaW1Cc3NJZHg7ICAvLyBCU1NJZHggaXMgbWFkZSBzZXNzaW9uIHNwZWljaWZpYyAKKyNlbmRpZgorCisgICAgdEFOSV9VOCAgICAgZ0xpbUZvcmNlTm9Qcm9wSUU7IC8qIFRoaXMgaXMgdXNlZCBmb3IgdGVzdGluZyBzdGEgbGVnYWN5IGJzcyBkZXRlY3QgZmVhdHVyZSAqLworCisgICAgLy8KKyAgICAvLyBTdG9yZSB0aGUgQlNTIEluZGV4IHJldHVybmVkIGJ5IEhBTCBkdXJpbmcKKyAgICAvLyBXREFfQUREX0JTU19SU1AgaGVyZS4KKyAgICAvLworICAgIC8vIEZvciBub3c6CisgICAgLy8gVGhpcyB3aWxsIGJlIHVzZWQgZHVyaW5nIFdEQV9TRVRfQlNTS0VZX1JFUSBpbgorICAgIC8vIG9yZGVyIHRvIHNldCB0aGUgR1RLCisgICAgLy8gTGF0ZXI6CisgICAgLy8gVGhlcmUgY291bGQgYmUgb3RoZXIgaW50ZXJmYWNlcyBuZWVkaW5nIHRoaXMgaW5mbworICAgIC8vCisKKyAgICAvLworICAgIC8vIER1ZSB0byB0aGUgYXN5bmNocm9ub3VzIG5hdHVyZSBvZiB0aGUgaW50ZXJmYWNlCisgICAgLy8gYmV0d2VlbiBQRSA8LT4gSEFMLCBzb21lIHRyYW5zaWVudCBpbmZvcm1hdGlvbgorICAgIC8vIGxpa2UgdGhpcyBuZWVkcyB0byBiZSBjYWNoZWQuCisgICAgLy8gVGhpcyBpcyBjYWNoZWQgdXBvbiByZWNlaXB0IG9mIGVXTklfU01FX1NFVENPTlRFWFRfUkVRLgorICAgIC8vIFRoaXMgaXMgcmVsZWFzZWQgd2hpbGUgcG9zdGluZyBMSU1fTUxNX1NFVEtFWVNfQ05GCisgICAgLy8KKyAgICB2b2lkKiBncExpbU1sbVNldEtleXNSZXE7CisgICAgdm9pZCogZ3BMaW1NbG1SZW1vdmVLZXlSZXE7CisKKyAgICAvL09uIFNUQTogc3RhaWQgZm9yIHNlbGYgZ2VuZXJhdGVkIGJ5IEhBTCBhbmQgc2VudCBhcyByZXNwb25zZSB0byAnQUREIFNUQScgbXNnLgorICAgIC8vT24gQVA6ICAgc3RhaWQgY29ycmVzcG9uZGluZyB0byBCU1MgZ2VuZXJhdGVkIGJ5IEhBTCBhbmQgc2VudCBhcyByZXNwb25zZSB0byAnQUREIEJTUycgbXNnLgorICAvLyAgdEFOSV9VMTYgICAgICAgICAgICAgZ0xpbVN0YWlkOyAvLyBUTyBTVVBQT1JUIEJULUFNUAorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBCU1MgUkVMQVRFRCBFTkQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBJQlNTIFJFTEFURUQgU1RBUlQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgd2UndmUgYSBwYXJ0bmVyCisgICAgLy8gdGhhdCBpcyBhbHNvIHRyYW5zbWl0dGluZyBCZWFjb24gZnJhbWUKKyAgICAvLyBpbiBJQlNTCisgICAgLy90QU5JX1U4ICAgIGdMaW1JYnNzQWN0aXZlOyAgb2N0MSByZXZpZXcKKworICAgIC8vVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIFNUQSBjb2FsZXNjZWQgYW5kIGFkYXB0ZXIgdG8gcGVlcidzIGNhcGFiaWxpdGllcyBvciBub3QuCisgICAgdEFOSV9VOCAgICBnTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZDsKKworICAgIC8vLyBEZWZpbml0aW9uIGZvciBzdG9yaW5nIElCU1MgcGVlcnMgQlNTIGRlc2NyaXB0aW9uCisgICAgdExpbUlic3NQZWVyTm9kZSAgICAgICpnTGltSWJzc1BlZXJMaXN0OworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgZ0xpbU51bUlic3NQZWVyczsKKworICAgIC8vIGlic3MgaW5mbyAtIHBhcmFtcyBmb3Igd2hpY2ggaWJzcyB0byBqb2luIHdoaWxlIGNvYWxlc2NpbmcKKyAgICB0QW5pU2lyTGltSWJzcyAgICAgIGlic3NJbmZvOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBJQlNTIFJFTEFURUQgRU5EIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgU1RBVFMvQ09VTlRFUiBSRUxBVEVEIFNUQVJUIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHRBTklfVTE2ICAgbWF4U3RhdGlvbjsKKyAgICB0QU5JX1UxNiAgIG1heEJzc0lkOworCisgICAgdEFOSV9VMzIgICAgZ0xpbU51bUJlYWNvbnNSY3ZkOworICAgIHRBTklfVTMyICAgIGdMaW1OdW1CZWFjb25zSWdub3JlZDsKKworICAgIHRBTklfVTMyICAgIGdMaW1OdW1EZWZlcnJlZE1zZ3M7CisKKyAgICAvLy8gVmFyaWFibGUgdG8ga2VlcCB0cmFjayBvZiBudW1iZXIgb2YgY3VycmVudGx5IGFzc29jaWF0ZWQgU1RBcworICAgIHRBTklfVTE2ICBnTGltTnVtT2ZDdXJyZW50U1RBczsKKyAgICB0QU5JX1UxNiAgZ0xpbU51bU9mQW5pU1RBczsgICAgICAvLyBjb3VudCBvZiBBTkkgcGVlcnMKKyAgICB0QU5JX1UxNiAgZ0xpbUFzc29jU3RhTGltaXQ7CisKKyAgICAvLy8gVGhpcyBpbmRpY2F0ZXMgbnVtYmVyIG9mIFJYZWQgQmVhY29ucyBkdXJpbmcgSEIgcGVyaW9kCisgICAvLyB0QU5JX1U4ICAgIGdMaW1SeGVkQmVhY29uQ250RHVyaW5nSEI7CisKKyAgICAvLyBIZWFydC1CZWF0IGludGVydmFsIHZhbHVlCisgICAgdEFOSV9VMzIgICBnTGltSGVhcnRCZWF0Q291bnQ7CisKKyAgICAvLyBTdGF0aXN0aWNzIHRvIGtlZXAgdHJhY2sgb2Ygbm8uIGJlYWNvbnMgcmN2ZCBpbiBoZWFydCBiZWF0IGludGVydmFsCisgICAgdEFOSV9VMTYgICAgICAgICAgICBnTGltSGVhcnRCZWF0QmVhY29uU3RhdHNbTUFYX05PX0JFQUNPTlNfUEVSX0hFQVJUX0JFQVRfSU5URVJWQUxdOworCisjaWZkZWYgV0xBTl9ERUJVRworICAgIC8vIERlYnVnIGNvdW50ZXJzCisgICAgdEFOSV9VMzIgICAgIG51bVRvdCwgbnVtQmJ0LCBudW1Qcm90RXJyLCBudW1MZWFybiwgbnVtTGVhcm5JZ25vcmU7CisgICAgdEFOSV9VMzIgICAgIG51bVNtZSwgbnVtTUFDWzRdWzE2XTsKKworICAgIC8vIERlYnVnIGNvdW50ZXIgdG8gdHJhY2sgbnVtYmVyIG9mIEFzc29jIFJlcSBmcmFtZSBkcm9wcworICAgIC8vIHdoZW4gcmVjZWl2ZWQgaW4gcFN0YURzLT5tbG1TdGF0ZSBvdGhlciB0aGFuIExJTktfRVNUQUJMSVNFRAorICAgIHRBTklfVTMyICAgIGdMaW1OdW1Bc3NvY1JlcURyb3BJbnZsZFN0YXRlOworICAgIC8vIGNvdW50ZXJzIHRvIHRyYWNrIHJlamVjdGlvbiBvZiBBc3NvYyBSZXEgZHVlIHRvIEFkbWlzc2lvbiBDb250cm9sCisgICAgdEFOSV9VMzIgICAgZ0xpbU51bUFzc29jUmVxRHJvcEFDUmVqZWN0VFM7CisgICAgdEFOSV9VMzIgICAgZ0xpbU51bUFzc29jUmVxRHJvcEFDUmVqZWN0U3RhOworICAgIC8vIERlYnVnIGNvdW50ZXIgdG8gdHJhY2sgbnVtYmVyIG9mIFJlYXNzb2MgUmVxIGZyYW1lIGRyb3BzCisgICAgLy8gd2hlbiByZWNlaXZlZCBpbiBwU3RhRHMtPm1sbVN0YXRlIG90aGVyIHRoYW4gTElOS19FU1RBQkxJU0VECisgICAgdEFOSV9VMzIgICAgZ0xpbU51bVJlYXNzb2NSZXFEcm9wSW52bGRTdGF0ZTsKKyAgICAvLyBEZWJ1ZyBjb3VudGVyIHRvIHRyYWNrIG51bWJlciBvZiBIYXNoIE1pc3MgZXZlbnQgdGhhdAorICAgIC8vIHdpbGwgbm90IGNhdXNlIGEgc2VuZGluZyBvZiBkZS1hdXRoL2RlLWFzc29jaWF0ZSBmcmFtZQorICAgIHRBTklfVTMyICAgIGdMaW1OdW1IYXNoTWlzc0lnbm9yZWQ7CisKKyAgICAvLyBEZWJ1ZyBjb3VudGVyIHRvIHRyYWNrIG51bWJlciBvZiBCZWFjb24gZnJhbWVzCisgICAgLy8gcmVjZWl2ZWQgaW4gdW5leHBlY3RlZCBzdGF0ZQorICAgIHRBTklfVTMyICAgIGdMaW1VbmV4cEJjbkNudDsKKworICAgIC8vIERlYnVnIGNvdW50ZXIgdG8gdHJhY2sgbnVtYmVyIG9mIEJlYWNvbiBmcmFtZXMKKyAgICAvLyByZWNlaXZlZCBpbiB3dC1qb2luLXN0YXRlIHRoYXQgZG8gaGF2ZSBTU0lEIG1pc21hdGNoCisgICAgdEFOSV9VMzIgICAgZ0xpbUJjblNTSURNaXNtYXRjaENudDsKKworICAgIC8vIERlYnVnIGNvdW50ZXIgdG8gdHJhY2sgbnVtYmVyIG9mIExpbmsgZXN0YWJsaXNobWVudHMgb24gU1RBL0JQCisgICAgdEFOSV9VMzIgICAgZ0xpbU51bUxpbmtFc3RzOworCisgICAgLy8gRGVidWcgY291bnRlciB0byB0cmFjayBudW1iZXIgb2YgUnggY2xlYW51cAorICAgIHRBTklfVTMyICAgIGdMaW1OdW1SeENsZWFudXA7CisKKyAgICAvLyBEZWJ1ZyBjb3VudGVyIHRvIHRyYWNrIGRpZmZlcmVudCBwYXJzZSBwcm9ibGVtCisgICAgdEFOSV9VMzIgICAgZ0xpbTExYlN0YUFzc29jUmVqZWN0Q291bnQ7CisKKyNlbmRpZiAgICAKKworICAgIC8vVGltZSBzdGFtcCBvZiB0aGUgbGFzdCBiZWFjb24gcmVjZWl2ZWQgZnJvbSB0aGUgQlNTIHRvIHdoaWNoIFNUQSBpcyBjb25uZWN0ZWQuCisgICAgdEFOSV9VNjQgZ0xhc3RCZWFjb25UaW1lU3RhbXA7CisgICAgLy9SWCBCZWFjb24gY291bnQgZm9yIHRoZSBjdXJyZW50IEJTUyB0byB3aGljaCBTVEEgaXMgY29ubmVjdGVkLgorICAgIHRBTklfVTMyIGdDdXJyZW50QnNzQmVhY29uQ250OworICAgIHRBTklfVTggZ0xhc3RCZWFjb25EdGltQ291bnQ7CisgICAgdEFOSV9VOCBnTGFzdEJlYWNvbkR0aW1QZXJpb2Q7CisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgU1RBVFMvQ09VTlRFUiBSRUxBVEVEIEVORCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgU1RBVEVTIFJFTEFURUQgU1RBUlQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvdW50cyBIZWFydGJlYXQgZmFpbHVyZXMKKyAgICB0QU5JX1U4ICAgIGdMaW1IQmZhaWx1cmVDbnRJbkxpbmtFc3RTdGF0ZTsKKyAgICB0QU5JX1U4ICAgIGdMaW1Qcm9iZUZhaWx1cmVBZnRlckhCZmFpbGVkQ250OworICAgIHRBTklfVTggICAgZ0xpbUhCZmFpbHVyZUNudEluT3RoZXJTdGF0ZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB3aGV0aGVyIExJTSBtb2R1bGUgbmVlZCB0bworICAgICAqIHNlbmQgcmVzcG9uc2UgdG8gaG9zdC4gVXNlZCB0byBpZGVudGlmeSB3aGV0aGVyIGEgcmVxdWVzdAorICAgICAqIGlzIGdlbmVyYXRlZCBpbnRlcm5hbGx5IHdpdGhpbiBMSU0gbW9kdWxlIG9yIGJ5IGhvc3QKKyAgICAgKi8KKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGdMaW1Sc3BSZXFkOworCisgICAgLy8vIFByZXZpb3VzIFNNRSBTdGF0ZQorICAgIHRMaW1TbWVTdGF0ZXMgICAgICAgZ0xpbVByZXZTbWVTdGF0ZTsKKworICAgIC8vLyBNTE0gU3RhdGUgdmlzaWJsZSBhY3Jvc3MgYWxsIFNpcml1cyBtb2R1bGVzCisgICAgdExpbU1sbVN0YXRlcyAgICAgICBnTGltTWxtU3RhdGU7CisKKyAgICAvLy8gUHJldmlvdXMgTUxNIFN0YXRlCisgICAgdExpbU1sbVN0YXRlcyAgICAgICBnTGltUHJldk1sbVN0YXRlOworCisjaWZkZWYgR0VONF9TQ0FOCisgICAgLy8gTElNIHRvIEhBTCBTQ0FOIE1hbmFnZW1lbnQgTWVzc2FnZSBJbnRlcmZhY2Ugc3RhdGVzCisgICAgdExpbUxpbUhhbFNjYW5TdGF0ZSBnTGltSGFsU2NhblN0YXRlOworLy9XTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCisgICAgU1VTUEVORF9SRVNVTUVfTElOS19DQUxMQkFDSyBncExpbVN1c3BlbmRDYWxsYmFjazsgCisgICAgdEFOSV9VMzIgKmdwTGltU3VzcGVuZERhdGE7CisgICAgU1VTUEVORF9SRVNVTUVfTElOS19DQUxMQkFDSyBncExpbVJlc3VtZUNhbGxiYWNrOyAKKyAgICB0QU5JX1UzMiAqZ3BMaW1SZXN1bWVEYXRhOworLy9lbmQgV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZAorICAgIHRBTklfVTggICAgZlNjYW5EaXNhYmxlZDsKKyAgICAvL0NhbiBiZSBzZXQgdG8gaW52YWxpZCBjaGFubmVsLiBJZiBpdCBpcyBpbnZhbGlkLCBIQUwKKyAgICAvL3Nob3VsZCBtb3ZlIHRvIHByZXZpb3VzIHZhbGlkIGNoYW5uZWwgb3Igc3RheSBpbiB0aGUKKyAgICAvL2N1cnJlbnQgY2hhbm5lbC4KKyAgICB0QU5JX1UxNiAgIGdSZXN1bWVDaGFubmVsOworICAgIC8vVE9ETyAtIEFkZCBDQiBzdGF0ZSBoZXJlLgorI2VuZGlmIC8vIEdFTjRfU0NBTgorCisgICAgLy8gQ2hhbmdlIGNoYW5uZWwgZ2VuZXJpYyBzY2hlbWUKKyAgICBDSEFOR0VfQ0hBTk5FTF9DQUxMQkFDSyBncGNoYW5nZUNoYW5uZWxDYWxsYmFjazsKKyAgICB0QU5JX1UzMiAqZ3BjaGFuZ2VDaGFubmVsRGF0YTsKKworICAgIC8vLyBTTUUgU3RhdGUgdmlzaWJsZSBhY3Jvc3MgYWxsIFNpcml1cyBtb2R1bGVzCisgICAgdExpbVNtZVN0YXRlcyAgICAgICAgIGdMaW1TbWVTdGF0ZTsKKyAgICAvLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB3ZSdyZSBhbiBBUCwgU1RBIGluIEJTUy9JQlNTCisgICAgdExpbVN5c3RlbVJvbGUgICAgICAgIGdMaW1TeXN0ZW1Sb2xlOworCisgICAgLy8gTnVtYmVyIG9mIFNUQXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBzaG9ydCBwcmVhbWJsZQorICAgIHRMaW1Ob1Nob3J0UGFyYW1zICAgICAgICAgZ0xpbU5vU2hvcnRQYXJhbXM7CisKKyAgICAvLyBOdW1iZXIgb2YgU1RBcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHNob3J0IHNsb3QgdGltZQorICAgIHRMaW1Ob1Nob3J0U2xvdFBhcmFtcyAgIGdMaW1Ob1Nob3J0U2xvdFBhcmFtczsKKworCisgICAgLy8gT0xCQyBwYXJhbWV0ZXJzCisgICAgdExpbVByb3RTdGFQYXJhbXMgIGdMaW1PdmVybGFwMTFnUGFyYW1zOworCisgICAgdExpbVByb3RTdGFQYXJhbXMgIGdMaW1PdmVybGFwMTFhUGFyYW1zOworICAgIHRMaW1Qcm90U3RhUGFyYW1zIGdMaW1PdmVybGFwSHQyMFBhcmFtczsKKyAgICB0TGltUHJvdFN0YVBhcmFtcyBnTGltT3ZlcmxhcE5vbkdmUGFyYW1zOworCisgICAgLy8KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tIERQSCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIHRoZXNlIHVzZWQgdG8gbGl2ZSBpbiBEUEggYnV0IGFyZSBub3cgbW92ZWQgaGVyZSAod2hlcmUgdGhleSBiZWxvbmcpCisgICAgdEFOSV9VMzIgICAgICAgICAgIGdMaW1QaHlNb2RlOworICAgIHRBTklfVTMyICAgICAgICAgICBwcm9wUmF0ZUFkanVzdFBlcmlvZDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgc2NhblN0YXJ0VGltZTsgICAgLy8gdXNlZCB0byBtZWFzdXJlIHNjYW4gdGltZQorCisgICAgdEFOSV9VOCAgICAgICAgICAgIGdMaW1Cc3NpZFs2XTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgZ0xpbU15TWFjQWRkcls2XTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgYWNrUG9saWN5OworCisgICAgdEFOSV9VOCAgICAgICAgICAgIGdMaW1Rb3NFbmFibGVkOjE7IC8vMTFFCisgICAgdEFOSV9VOCAgICAgICAgICAgIGdMaW1XbWVFbmFibGVkOjE7IC8vV01FCisgICAgdEFOSV9VOCAgICAgICAgICAgIGdMaW1Xc21FbmFibGVkOjE7IC8vV1NNCisgICAgdEFOSV9VOCAgICAgICAgICAgIGdMaW1IY2ZFbmFibGVkOjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgIGdMaW0xMWRFbmFibGVkOjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgIGdMaW1Qcm9iZVJlc3BEaXNhYmxlRmxhZzoxOyAvLyBjb250cm9sIG92ZXIgcHJvYmUgcmVzcG9uc2UKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tIERQSCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBTVEFURVMgUkVMQVRFRCBFTkQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBNSVNDIFJFTEFURUQgU1RBUlQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgIC8vIFBsYWNlIGhvbGRlciBmb3IgYWx0ZXJuYXRlIHJhZGlvIGxpc3QKKyAgICB0U2lyTXVsdGlwbGVBbHRlcm5hdGVSYWRpb0luZm8gZ0xpbUFsdGVybmF0ZVJhZGlvTGlzdDsKKyNlbmRpZgorCisgICAgLy8gUGxhY2UgaG9sZGVyIGZvciBNZWFzdXJlbWVudCBSZXEvUnNwL0luZCByZWxhdGVkIGluZm8KKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIHRwU2lyU21lTWVhc3VyZW1lbnRSZXEgICAgZ3BMaW1NZWFzUmVxOworICAgIHRMaW1NZWFzUGFyYW1zICAgICAgICAgICAgZ0xpbU1lYXNQYXJhbXM7CisgICAgdHBMaW1NZWFzRGF0YSAgICAgICAgICAgICBncExpbU1lYXNEYXRhOworI2VuZGlmCisKKyAgICAvLyBXRFMgaW5mbworICAgIHRBTklfVTMyICAgICAgICAgICAgZ0xpbU51bVdkc0luZm9JbmQ7CisgICAgdEFOSV9VMzIgICAgICAgICAgICBnTGltTnVtV2RzSW5mb1NldDsKKyAgICB0U2lyV2RzSW5mbyAgICAgICAgIGdMaW1XZHNJbmZvOworCisgICAgLy8gRGVmZXJyZWQgUXVldWUgUGFyYW10ZXJzCisgICAgdExpbURlZmVycmVkTXNnUVBhcmFtcyAgICBnTGltRGVmZXJyZWRNc2dROworCisgICAgLy8gYWRkdHMgcmVxdWVzdCBpZiBhbnkgLSBvbmx5IG9uZSBjYW4gYmUgb3V0c3RhbmRpbmcgYXQgYW55IHRpbWUKKyAgICB0U2lyQWRkdHNSZXEgICAgICAgZ0xpbUFkZHRzUmVxOworICAgIHRBTklfVTggICAgICAgICAgICBnTGltQWRkdHNTZW50OworICAgIHRBTklfVTggICAgICAgICAgICBnTGltQWRkdHNSc3BUaW1lckNvdW50OworCisgICAgLy9wcm90ZWN0aW9uIHJlbGF0ZWQgY29uZmlnIGNhY2hlCisgICAgdENmZ1Byb3RlY3Rpb24gICAgY2ZnUHJvdGVjdGlvbjsKKworICAgIHRBTklfVTggZ0xpbVByb3RlY3Rpb25Db250cm9sOworICAgIC8vUkYgYmFuZCB0byBkZXRlcm1pYmUgMi40LzUgR0haCisKKyAgICAvLyBhbHRlcm5hdGUgcmFkaW8gaW5mbyB1c2VkIGJ5IFNUQQorICAgIHRTaXJBbHRlcm5hdGVSYWRpb0luZm8gIGdMaW1BbHRlcm5hdGVSYWRpbzsKKworICAgIC8vVGhpcyBmbGFnIHdpbGwgcmVtYWluIHRvIGJlIHNldCBleGNlcHQgd2hpbGUgTElNIGlzIHdhaXRpbmcgZm9yIHNwZWNpZmljIHJlc3BvbnNlIG1lc3NhZ2VzCisgICAgLy9mcm9tIEhBTC4gZS5nIHdoZW4gTElNIGlzc3VlcyBBRERfU1RBIHJlcSBpdCB3aWxsIGNsZWFyIHRoaXMgZmxhZyBhbmQgd2hlbiBpdCB3aWxsIHJlY2VpdmUKKyAgICAvL3RoZSByZXNwb25zZSB0aGUgZmxhZyB3aWxsIGJlIHNldC4KKyAgICB0QU5JX1U4ICAgZ0xpbVByb2Nlc3NEZWZkTXNnczsKKworICAgIC8vIFVBUFNEIGZsYWcgdXNlZCBvbiBBUAorICAgIHRBTklfVTggIGdVYXBzZEVuYWJsZTsgICAgICAgICAgCisKKyAgICAvKiBVc2VkIG9uIFNUQSwgdGhpcyBpcyBhIHN0YXRpYyBVQVBTRCBtYXNrIHNldHRpbmcgIAorICAgICAqIGRlcml2ZWQgIGZyb20gU01FX0pPSU5fUkVRIGFuZCBTTUVfUkVBU1NPQ19SRVEuIElmIGEgCisgICAgICogcGFydGljdWxhciBBQyBiaXQgaXMgc2V0LCBpdCBtZWFucyB0aGUgQUMgaXMgYm90aCAgCisgICAgICogdHJpZ2dlciBlbmFibGVkIGFuZCBkZWxpdmVyeSBlbmFibGVkLiAKKyAgICAgKi8KKyAgICB0QU5JX1U4ICBnVWFwc2RQZXJBY0JpdG1hc2s7ICAgCisKKyAgICAvKiBVc2VkIG9uIFNUQSwgdGhpcyBpcyBhIGR5bmFtaWMgVVBBU0QgbWFzayBzZXR0aW5nIAorICAgICAqIGRlcml2ZWQgZnJvbSBBZGRUUyBSc3AgYW5kIERlbFRTIGZyYW1lLiBJZiBhIAorICAgICAqIHBhcnRpY3VsYXIgQUMgYml0IGlzIHNldCwgaXQgbWVhbnMgQUMgaXMgdHJpZ2dlcgorICAgICAqIGVuYWJsZWQuIAorICAgICAqLworICAgIHRBTklfVTggIGdVYXBzZFBlckFjVHJpZ2dlckVuYWJsZU1hc2s7ICAKKworICAgIC8qIFVzZWQgb24gU1RBLCBkeW5hbWljIFVQQVNEIG1hc2sgc2V0dGluZworICAgICAqIGRlcml2ZWQgZnJvbSBBZGRUUyBSc3AgYW5kIERlbFRzIGZyYW1lLiBJZiAKKyAgICAgKiBhIHBhcnRpY3VsYXIgQUMgYml0IGlzIHNldCwgaXQgbWVhbnMgQUMgaXMgCisgICAgICogZGVsaXZlcnkgZW5hYmxlZC4gCisgICAgICovIAorICAgIHRBTklfVTggIGdVYXBzZFBlckFjRGVsaXZlcnlFbmFibGVNYXNrOyAKKyAgICAKKyAgICAvKiBVc2VkIG9uIFNUQSBmb3IgQUMgZG93bmdyYWRlLiBUaGlzIGlzIGEgZHluYW1pYyBtYXNrCisgICAgICogc2V0dGluZyB3aGljaCBrZWVwIHRyYWNrcyBvZiBBQ3MgYmVpbmcgYWRtaXR0ZWQuIAorICAgICAqIElmIGJpdCBpcyBzZXQgdG8gMDogVGhhdCBwYXJ0aXVsYXIgQUMgaXMgbm90IGFkbWl0dGVkCisgICAgICogSWYgYml0IGlzIHNldCB0byAxOiBUaGF0IHBhcnRpY3VsYXIgQUMgaXMgYWRtaXR0ZWQKKyAgICAgKi8KKyAgICB0QU5JX1U4ICBnQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fRElSRUNUXTsKKworICAgIC8vZGlhbG9ndWUgdG9rZW4gTGlzdCBoZWFkL3RhaWwgZm9yIEFjdGlvbiBmcmFtZXMgcmVxdWVzdCBzZW50LgorICAgIHRwRGlhbG9ndWVUb2tlbiBwRGlhbG9ndWVUb2tlbkhlYWQ7CisgICAgdHBEaWFsb2d1ZVRva2VuIHBEaWFsb2d1ZVRva2VuVGFpbDsKKworICAgIHRMaW1Uc3BlY0luZm8gdHNwZWNJbmZvW0xJTV9OVU1fVFNQRUNfTUFYXTsKKworICAgIC8vIGFkbWlzc2lvbiBjb250cm9sIHBvbGljeSBpbmZvcm1hdGlvbgorICAgIHRMaW1BZG1pdFBvbGljeUluZm8gYWRtaXRQb2xpY3lJbmZvOworCisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgTUlTQyBSRUxBVEVEIEVORCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgIEFTU09DIFJFTEFURUQgU1RBUlQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFBsYWNlIGhvbGRlciBmb3IgSm9pblJlcSBtZXNzYWdlCisgICAgLy8gcmVjZWl2ZWQgYnkgU01FIHN0YXRlIG1hY2hpbmUKKyAgIC8vIHRwU2lyU21lSm9pblJlcSAgICAgICBncExpbUpvaW5SZXE7CisKKyAgICAvLyBQbGFjZSBob2xkZXIgZm9yIFJlYXNzb2NSZXEgbWVzc2FnZQorICAgIC8vIHJlY2VpdmVkIGJ5IFNNRSBzdGF0ZSBtYWNoaW5lCisgICAgLy90cFNpclNtZVJlYXNzb2NSZXEgICAgZ3BMaW1SZWFzc29jUmVxOyAgc2VwMjMgcmV2aWV3CisKKyAgICAvKioKKyAgICAgKiBGb2xsb3dpbmcgaXMgdGhlIHBsYWNlIGhvbGRlciBmb3IgZnJlZSBBSUQgcG9vbC4KKyAgICAgKiBBIG5vbi16ZXJvIHZhbHVlIGluZGljYXRlcyB0aGF0IEFJRCBpcyBhdmFpbGFibGUKKyAgICAgKiBmb3IgYXNzaWdubWVudC4KKyAgICAgKi8KKyAgICB0QU5JX1U4ICAgICpncExpbUFJRHBvb2w7CisgICAgdEFOSV9VOCAgICBmcmVlQWlkSGVhZDsKKyAgICB0QU5JX1U4ICAgIGZyZWVBaWRUYWlsOworCisgICAgLy8gQ3VycmVudCBBdXRoZW50aWNhdGlvbiB0eXBlIHVzZWQgYXQgU1RBCisgICAgLy90QW5pQXV0aFR5cGUgICAgICAgIGdMaW1DdXJyZW50QXV0aFR5cGU7CisKKyAgICAvLyBQbGFjZSBob2xkZXIgZm9yIGN1cnJlbnQgYXV0aGVudGljYXRpb24gcmVxdWVzdAorICAgIC8vIGJlaW5nIGhhbmRsZWQKKyAgICB0TGltTWxtQXV0aFJlcSAgICAgKmdwTGltTWxtQXV0aFJlcTsKKworICAgIC8vIFBsYWNlIGhvbGRlciBmb3IgSm9pbiByZXF1ZXN0IHRoYXQgd2UncmUKKyAgICAvLyBjdXJyZW50bHkgYXR0ZW1wdGluZworICAgIHRMaW1NbG1Kb2luUmVxICAgICAgICpncExpbU1sbUpvaW5SZXE7CisKKyAgICAvLyBSZWFzb24gY29kZSB0byBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgY2hhbmdlIGNvbnRleHQgd2hpbGUgc2VuZGluZyAKKyAgICAvLyBXREFfQ0hOTF9TV0lUQ0hfUkVRIG1lc3NhZ2UgdG8gSEFMICAgICAgIAorICAgIHRBTklfVTMyIGNoYW5uZWxDaGFuZ2VSZWFzb25Db2RlOworICAgIAorICAgIC8vLyBNQUMgbGV2ZWwgUHJlLWF1dGhlbnRpY2F0aW9uIHJlbGF0ZWQgZ2xvYmFscworICAgIHRTaXJNYWNDaGFuTnVtICAgICAgICBnTGltUHJlQXV0aENoYW5uZWxOdW1iZXI7CisgICAgdEFuaUF1dGhUeXBlICAgICAgICAgIGdMaW1QcmVBdXRoVHlwZTsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgZ0xpbVByZUF1dGhQZWVyQWRkcjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgZ0xpbU51bVByZUF1dGhDb250ZXh0czsKKyAgICB0TGltUHJlQXV0aFRhYmxlICAgICAgZ0xpbVByZUF1dGhUaW1lclRhYmxlOworCisgICAgLy8gUGxhY2VkIGhvbGRlciB0byBkZWF1dGggcmVhc29uCisgICAgdEFOSV9VMTYgZ0xpbURlYXV0aFJlYXNvbkNvZGU7CisKKyAgICAvLyBQbGFjZSBob2xkZXIgZm9yIFByZS1hdXRoZW50aWNhdGlvbiBub2RlIGxpc3QKKyAgICBzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICogIHBMaW1QcmVBdXRoTGlzdDsKKworICAgIC8vIFNlbmQgRGlzYXNzb2NpYXRlIGZyYW1lIHRocmVzaG9sZCBwYXJhbWV0ZXJzCisgICAgdEFOSV9VMTYgICAgICAgICAgICBnTGltRGlzYXNzb2NGcmFtZVRocmVzaG9sZDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGdMaW1EaXNhc3NvY0ZyYW1lQ3JlZGl0OworCisgICAgLy8gQXNzb2Mgb3IgUmVBc3NvYyBSZXNwb25zZSBEYXRhL0ZyYW1lCisgICAgdm9pZCAgICAgICAgICAgICAgICAqZ0xpbUFzc29jUmVzcG9uc2VEYXRhOworCisgICAgLy9PbmUgY2FjaGUgZm9yIGVhY2ggb3ZlcmxhcCBhbmQgYXNzb2NpYXRlZCBjYXNlLgorICAgIHRDYWNoZVBhcmFtcyAgICBwcm90U3RhT3ZlcmxhcENhY2hlW0xJTV9QUk9UX1NUQV9PVkVSTEFQX0NBQ0hFX1NJWkVdOworICAgIHRDYWNoZVBhcmFtcyAgICBwcm90U3RhQ2FjaGVbTElNX1BST1RfU1RBX0NBQ0hFX1NJWkVdOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICBBU1NPQyBSRUxBVEVEIEVORCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworICAgIC8vIDExaCBTcGVjdHJ1bSBNYW5hZ2VtZW50IFJlbGF0ZWQgRmxhZworICAgIHRBTklfVTMyICAgICAgICAgICBnTGltMTFoRW5hYmxlOworICAgIHRMaW1TcGVjTWdtdEluZm8gICBnTGltU3BlY01nbXQ7CisgICAgLy8gQ0IgUHJpbWFyeS9TZWNvbmRhcnkgQ2hhbm5lbCBTd2l0Y2ggSW5mbworICAgIHRMaW1DaGFubmVsU3dpdGNoSW5mbyAgZ0xpbUNoYW5uZWxTd2l0Y2g7CisKKworICAgIC8vIENoYW5uZWwgQm9uZGluZyBtb2RlLCBhcyBjb25maWd1cmVkIGJ5IFNNRQorICAgIHRBTklfVTggZ0NiTW9kZTsKKworICAgIC8vCisgICAgLy8gSWRlbnRpZmllcyB0aGUgcnVudGltZSBPUEVSQVRJT05BTCBzdGF0ZSBvZiBDaGFubmVsCisgICAgLy8gQm9uZGluZy4gVGhpcyBpbmZvIGlzIGVuY29kZWQgYXMgYSBiaXRtYXAsIGFzCisgICAgLy8gY29uZmlndXJlZCB2aWEgZ0NiTW9kZS4KKyAgICAvLworICAgIC8vICBiNyAgYjYgIGI1ICBiNCAgYjMgIGIyICBiMSAgYjAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIHwgWCB8IFggfCBYIHwgQVV8Q1N8VS9EfCBPIHwgQSB8CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLworICAgIHRBTklfVTggZ0NiU3RhdGU7CisKKyAgICAvLworICAgIC8vIEZvciBERUJVRyBwdXJwb3NlcworICAgIC8vIFByaW1hcmlseSBmb3IgLSBUSVRBTiBCRUFDT04gd29ya2Fyb3VuZAorICAgIC8vIFN5bXB0b20gLSBURlAvUEhZIGdldHMgc3R1Y2sKKyAgICAvLworICAgIHRBTklfVTMyIGdMaW1TY2FuT3ZlcnJpZGU7CisgICAgLy8gSG9sZHMgdGhlIGRlc2lyZWQgdFNpclNjYW5UeXBlLCBhcyByZXF1ZXN0ZWQgYnkgU01FCisgICAgdFNpclNjYW5UeXBlIGdMaW1TY2FuT3ZlcnJpZGVTYXZlZDsKKworICAgIC8vIE92ZXJyaWRlIHdpdGggdGhpcyBQaHkgQ0Igc3RhdGUgYWx3YXlzCisgICAgLy9lUGh5Q2hhbkJvbmRTdGF0ZSBnTGltUGh5Q0JTdGF0ZTsKKworICAgIC8vIFdoZW4gb3BlcmF0aW5nIHdpdGggLQorICAgIC8vIGEpIENoYW5uZWwgQm9uZGluZyBtb2RlIChhcyBjb25maWd1cmVkIGJ5IFNNRSkgQU5ECisgICAgLy8gYikgQ0IgU3RhdGUgcHJvdGVjdGlvbiB0dXJuZWQgT04KKyAgICAvLyB0aGlzIG9iamVjdCB3aWxsIHNhdmUgdGhlIENCIHN0YXRlIGFzIGRlc2lyZWQgYnkgU01FCisgICAgLy8KKyAgICAvLyBUaGlzIG9iamVjdCBtaW1pY3MgdGhlIGJpdG1hcCBlbmNvZGluZyBvZiB0aGUKKyAgICAvLyBnQ2JTdGF0ZSBvYmplY3QsIGFzIGZvbGxvd3M6CisgICAgLy8KKyAgICAvLyAgYjcgIGI2ICBiNSAgYjQgIGIzICBiMiAgYjEgIGIwCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyB8IFggfCBYIHwgWCB8IEFVfENTfFUvRHwgTyB8IEEgfAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8KKyAgICB0QU5JX1U4IGdDYlN0YXRlUHJvdGVjdGVkOworCisgICAgLy8KKyAgICAvLyBDQiBTdGF0ZSBwcm90ZWN0aW9uLCBvcGVyYXRlZCB1cG9uIGFzIGZvbGxvd3M6CisgICAgLy8gMSAtIENCIGlzIGVuYWJsZWQgaW4gdGhlIGhhcmR3YXJlIE9OTFkgV0hFTiBhIFRpdGFuCisgICAgLy8gU1RBIGFzc29jaWF0ZXMgd2l0aCB0aGUgQVAKKyAgICAvLyAwIC0gQ0IgaXMgZW5hYmxlZC9kaXNhYmxlZCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbgorICAgIC8vIHJlY2VpdmVkIGFzIHBlciBlV05JX1NNRV9TVEFSVF9CU1NfUkVRCisgICAgLy8KKyAgICB0QU5JX1UzMiBnTGltQ0JTdGF0ZVByb3RlY3Rpb247CisKKyAgICAvLyBDb3VudCBvZiBUSVRBTiBTVEEncyBjdXJyZW50bHkgYXNzb2NpYXRlZAorICAgIHRBTklfVTE2IGdMaW1UaXRhblN0YUNvdW50OworCisgICAgLy8KKyAgICAvLyBGb3IgREVCVUcgcHVycG9zZXMKKyAgICAvLyBQcmltYXJpbHkgZm9yIC0gVElUQU4gd29ya2Fyb3VuZAorICAgIC8vIFN5bXB0b20gLSBBdm9pZCBOVUxMIGRhdGEgZnJhbWVzCisgICAgICAgIC8vIEFwcGxpZXMgdG8gQVAgb25seQorICAgIC8vCisgICAgdEFOSV9VMzIgZ0xpbUJsb2NrTm9uVGl0YW5TdGE7CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFRJVEFOIHJlbGF0ZWQgZ2xvYmFscyAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIEhUIFJFTEFURUQgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vCisgICAgLy8gVGhlIGZvbGxvd2luZyBnbG9iYWwgTElNIHZhcmlhYmxlcyBtYWludGFpbi9tYW5hZ2UKKyAgICAvLyB0aGUgcnVudGltZSBjb25maWd1cmF0aW9ucyByZWxhdGVkIHRvIDgwMi4xMW4KKworICAgIC8vIDgwMi4xMW4gU3RhdGlvbiBkZXRlY3RlZCBIVCBjYXBhYmlsaXR5IGluIEJlYWNvbiBGcmFtZQorICAgIHRBTklfVTggaHRDYXBhYmlsaXR5UHJlc2VudEluQmVhY29uOworCisgICAgLy8gODAyLjExIEhUIGNhcGFiaWxpdHk6IEVuYWJsZWQgb3IgRGlzYWJsZWQKKyAgICB0QU5JX1U4IGh0Q2FwYWJpbGl0eTsKKworCisgICAgdEFOSV9VOCBnSFRHcmVlbmZpZWxkOworCisgICAgLy8wLTIwTWh6CisgICAgLy8xLTQwTWh6CisgICAgdEFOSV9VOCBnSFRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisKKyAgICB0QU5JX1U4IGdIVFNob3J0R0k0ME1oejsKKyAgICB0QU5JX1U4IGdIVFNob3J0R0kyME1oejsKKworICAgIC8vU2V0IHRvIDAgZm9yIDM4Mzkgb2N0ZXRzCisgICAgLy9TZXQgdG8gMSBmb3IgNzkzNSBvY3RldHMKKyAgICB0QU5JX1U4IGdIVE1heEFtc2R1TGVuZ3RoOworCisKKyAgICAvLyBEU1NTL0NDSyBhdCA0MCBNSHo6IEVuYWJsZWQgMSBvciBEaXNhYmxlZAorICAgIHRBTklfVTggZ0hURHNzc0Nja1JhdGU0ME1IelN1cHBvcnQ7CisKKyAgICAvLyBQU01QIFN1cHBvcnQ6IEVuYWJsZWQgMSBvciBEaXNhYmxlZCAwCisgICAgdEFOSV9VOCBnSFRQU01QU3VwcG9ydDsKKworICAgIC8vIEwtU0lHIFRYT1AgUHJvdGVjdGlvbiB1c2VkIG9ubHkgaWYgcGVlciBzdXBwb3J0IGF2YWlsYWJsZQorICAgIHRBTklfVTggZ0hUTHNpZ1RYT1BQcm90ZWN0aW9uOworCisgICAgLy8gTUlNTyBQb3dlciBTYXZlCisgICAgdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIGdIVE1JTU9QU1N0YXRlOworCisgICAgLy8gU2NhbiBJbiBQb3dlciBTYXZlCisgICAgdEFOSV9VOCBnU2NhbkluUG93ZXJzYXZlOworCisgICAgLy8KKyAgICAvLyBBLU1QRFUgRGVuc2l0eQorICAgIC8vIDAwMCAtIE5vIHJlc3RyaWN0aW9uCisgICAgLy8gMDAxIC0gMS84IHVzZWMKKyAgICAvLyAwMTAgLSAxLzQgdXNlYworICAgIC8vIDAxMSAtIDEvMiB1c2VjCisgICAgLy8gMTAwIC0gMSB1c2VjCisgICAgLy8gMTAxIC0gMiB1c2VjCisgICAgLy8gMTEwIC0gNCB1c2VjCisgICAgLy8gMTExIC0gOCB1c2VjCisgICAgLy8KKyAgICB0QU5JX1U4IGdIVEFNcGR1RGVuc2l0eTsKKworICAgIHRBTklfQk9PTEVBTiBnTWF4QW1zZHVTaXplRW5hYmxlZDsKKyAgICAvLyBNYXhpbXVtIFR4L1J4IEEtTVBEVSBmYWN0b3IKKyAgICB0QU5JX1U4IGdIVE1heFJ4QU1wZHVGYWN0b3I7CisKKyAgICAvLworICAgIC8vIFNjaGVkdWxlZCBQU01QIHJlbGF0ZWQgLSBTZXJ2aWNlIEludGVydmFsIEdyYW51bGFyaXR5CisgICAgLy8gMDAwIC0gNSBtcworICAgIC8vIDAwMSAtIDEwIG1zCisgICAgLy8gMDEwIC0gMTUgbXMKKyAgICAvLyAwMTEgLSAyMCBtcworICAgIC8vIDEwMCAtIDI1IG1zCisgICAgLy8gMTAxIC0gMzAgbXMKKyAgICAvLyAxMTAgLSAzNSBtcworICAgIC8vIDExMSAtIDQwIG1zCisgICAgLy8KKyAgICB0QU5JX1U4IGdIVFNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5OworCisgICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgYW4gQVAgd2FudHMgdG8gYXNzb2NpYXRlIFBTTVAgZW5hYmxlZCBTdGF0aW9ucworICAgIHRBTklfVTggZ0hUQ29udHJvbGxlZEFjY2Vzc09ubHk7CisKKyAgICAvLyBSSUZTIE1vZGUuIFNldCBpZiBubyBBUFNEIGxlZ2FjeSBkZXZpY2VzIGFzc29jaWF0ZWQKKyAgICB0QU5JX1U4IGdIVFJpZnNNb2RlOworICAgLy8gT0JzcyBNb2RlIC4gc2V0IHdoZW4gd2UgaGF2ZSBOb24gSFQgU1RBIGlzIGFzc29jaWF0ZWQgb3Igd2l0aCBpbiBvdmVybGFwIGJzcworICAgIHRBTklfVTggIGdIVE9ic3NNb2RlOworICAgIC8vCisgICAgLy8gUmVjb21tZW5kZWQgVHggV2lkdGggU2V0CisgICAgLy8gMCAtIHVzZSAyMCBNSHogY2hhbm5lbCAoY29udHJvbCBjaGFubmVsKQorICAgIC8vIDEgLSB1c2UgY2hhbm5lbCB3aWR0aCBlbmFibGVkIHVuZGVyIFN1cHBvcnRlZCBDaGFubmVsIFdpZHRoIFNldAorICAgIC8vCisgICAgdEFOSV9VOCBnSFRSZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisKKyAgICAvLyBJZGVudGlmaWVzIHRoZSA0MCBNSHogZXh0ZW5zaW9uIGNoYW5uZWwKKyAgICB0U2lyTWFjSFRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0IGdIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisKKyAgICAvLyBJZGVudGlmaWVzIHRoZSBjdXJyZW50IE9wZXJhdGluZyBNb2RlCisgICAgdFNpck1hY0hUT3BlcmF0aW5nTW9kZSBnSFRPcGVyTW9kZTsKKworICAgIC8vIEluZGljYXRlcyBpZiBQQ08gaXMgYWN0aXZhdGVkIGluIHRoZSBCU1MKKyAgICB0QU5JX1U4IGdIVFBDT0FjdGl2ZTsKKworICAgIC8vCisgICAgLy8gSWYgUENPIGlzIGFjdGl2ZSwgaW5kaWNhdGVzIHdoaWNoIFBDTyBwaGFzZSB0byB1c2UKKyAgICAvLyAwIC0gc3dpdGNoIHRvIDIwIE1IeiBwaGFzZQorICAgIC8vIDEgLSBzd2l0Y2ggdG8gNDAgTUh6IHBoYXNlCisgICAgLy8KKyAgICB0QU5JX1U4IGdIVFBDT1BoYXNlOworCisgICAgLy8KKyAgICAvLyBVc2VkIG9ubHkgaW4gYmVhY29ucy4gRm9yIFBSLCB0aGlzIGlzIHNldCB0byAwCisgICAgLy8gMCAtIFByaW1hcnkgYmVhY29uCisgICAgLy8gMSAtIFNlY29uZGFyeSBiZWFjb24KKyAgICAvLworICAgIHRBTklfVTggZ0hUU2Vjb25kYXJ5QmVhY29uOworCisgICAgLy8KKyAgICAvLyBEdWFsIENUUyBQcm90ZWN0aW9uCisgICAgLy8gMCAtIFVzZSBSVFMvQ1RTCisgICAgLy8gMSAtIER1YWwgQ1RTIFByb3RlY3Rpb24gaXMgdXNlZAorICAgIC8vCisgICAgdEFOSV9VOCBnSFREdWFsQ1RTUHJvdGVjdGlvbjsKKworICAgIC8vCisgICAgLy8gSWRlbnRpZmllcyBhIHNpbmdsZSBTVEJDIE1DUyB0aGF0IHNoYWxsIG5lIHVzZWQgZm9yCisgICAgLy8gU1RCQyBjb250cm9sIGZyYW1lcyBhbmQgU1RCQyBiZWFjb25zCisgICAgLy8KKyAgICB0QU5JX1U4IGdIVFNUQkNCYXNpY01DUzsKKworICAgIHRBTklfVTggZ0hUTm9uR0ZEZXZpY2VzUHJlc2VudDsKKworICAgIHRBTklfVTggICBnQWRkQkFfRGVjbGluZWQ7ICAgICAgICAgICAgICAgLy8gRmxhZyB0byBEZWNsaW5lIHRoZSBCQVIgaWYgdGhlIHBhcnRpY3VsYXIgYml0ICgwLTcpIGlzIGJlaW5nIHNldAorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIEhUIFJFTEFURUQgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKyAgICAvLyB3c2MgaW5mbyByZXF1aXJlZCB0byBmb3JtIHRoZSB3c2MgSUUKKyAgICB0TGltV3NjSWVJbmZvIHdzY0llSW5mbzsKKyAgICB0cFBFU2Vzc2lvbiBncFNlc3Npb24gOyAgIC8vUG9pbnRlciB0byAgc2Vzc2lvbiB0YWJsZSAgIAorICAgIC8qCisgICAgKiBzZXNzaW9uSUQgYW5kIHRyYW5zYWN0aW9uSUQgZnJvbSBTTUUgaXMgc3RvcmVkIGhlcmUgZm9yIHRob3NlIG1lc3NhZ2VzLCBmb3Igd2hpY2gKKyAgICAqIHRoZXJlIGlzIG5vIHNlc3Npb24gY29udGV4dCBpbiBQRSwgZS5nLiBTY2FuIHJlbGF0ZWQgbWVzc2FnZXMuCisgICAgKiovCisgICAgdEFOSV9VOCAgIGdTbWVTZXNzaW9uSWQ7CisgICAgdEFOSV9VMTYgZ1RyYW5zYWN0aW9uSWQ7CisKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICB0U2lyUmVtYWluT25DaG5SZXEgICpncExpbVJlbWFpbk9uQ2hhblJlcTsgLy9ob2xkIHJlbWFpbiBvbiBjaGFuIHJlcXVlc3QgaW4gdGhpcyBidWYKKyAgICB2b3NfbGlzdF90ICBnTGltTWdtdEZyYW1lUmVnaXN0cmF0aW5RdWV1ZTsKKyAgICB0QU5JX1UzMiAgICBhY3Rpb25GcmFtZVNlc3Npb25JZDsKKyNlbmRpZgorfSB0QW5pU2lyTGltLCAqdHBBbmlTaXJMaW07CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCit0eXBlZGVmIHN0cnVjdCBzTGltTWdtdEZyYW1lUmVnaXN0cmF0aW9uCit7CisgICAgdm9zX2xpc3Rfbm9kZV90IG5vZGU7ICAgICAvLyBNVVNUIGJlIGZpcnN0IGVsZW1lbnQKKyAgICB0QU5JX1UxNiAgICAgICAgZnJhbWVUeXBlOworICAgIHRBTklfVTE2ICAgICAgICBtYXRjaExlbjsKKyAgICB0QU5JX1UxNiAgICAgICAgc2Vzc2lvbklkOworICAgIHRBTklfVTggICAgICAgICBtYXRjaERhdGFbMV07Cit9IHRMaW1NZ210RnJhbWVSZWdpc3RyYXRpb24sICp0cExpbU1nbXRGcmFtZVJlZ2lzdHJhdGlvbjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCit0eXBlZGVmIHN0cnVjdCBzUnJtQ29udGV4dAoreworICB0UnJtU01FQ29udGV4dCBycm1TbWVDb250ZXh0OworICB0UnJtUEVDb250ZXh0ICBycm1QRUNvbnRleHQ7IAorfXRScm1Db250ZXh0LCAqdHBScm1Db250ZXh0OworI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCit0eXBlZGVmIHN0cnVjdCBzRlRDb250ZXh0Cit7CisgIHRmdFNNRUNvbnRleHQgZnRTbWVDb250ZXh0OworICB0ZnRQRUNvbnRleHQgIGZ0UEVDb250ZXh0OyAKK30gdGZ0Q29udGV4dCwgKnRwRlRDb250ZXh0OworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKy8vQ2hlY2sgaWYgdGhpcyBkZWZpbml0aW9uIGNhbiBhY3R1YWxseSBtb3ZlIGhlcmUgZXZlbiBmb3IgVm9sYW5zLiBJbiB0aGF0IGNhc2UKKy8vdGhpcyBmZWF0dXJpemF0aW9uIGNhbiBiZSByZW1vdmVkLgorLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAKKworICAgIFx0eXBlZGVmIHREcml2ZXJUeXBlCisgICAgCisgICAgXGJyaWVmICAgSW5kaWNhdGUgdGhlIGRyaXZlciB0eXBlIHRvIHRoZSBtYWMsIGFuZCBiYXNlZCBvbiB0aGlzIGRvCisgICAgICAgICAgICAgYXBwcm9wcmlhdGUgaW5pdGlhbGl6YXRpb24uCisgICAgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordHlwZWRlZiBlbnVtCit7CisgICAgZURSSVZFUl9UWVBFX1BST0RVQ1RJT04gID0gMCwKKyAgICBlRFJJVkVSX1RZUEVfTUZHICAgICAgICAgPSAxLAorICAgIGVEUklWRVJfVFlQRV9EVlQgICAgICAgICA9IDIKK30gdERyaXZlclR5cGU7CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICogCisKKyAgICBcdHlwZWRlZiB0TWFjT3BlblBhcmFtZXRlcnMKKyAgICAKKyAgICBcYnJpZWYgUGFyYW1ldGVycyBuZWVkZWQgZm9yIEVudW1lcmF0aW9uIG9mIGFsbCBzdGF0dXMgY29kZXMgcmV0dXJuZWQgYnkgdGhlIGhpZ2hlciBsZXZlbCAKKyAgICBpbnRlcmZhY2UgZnVuY3Rpb25zLgorICAgIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYgc3RydWN0IHNNYWNPcGVuUGFyYW1ldGVycworeworICAgIHRBTklfVTE2IG1heFN0YXRpb247CisgICAgdEFOSV9VMTYgbWF4QnNzSWQ7CisgICAgdEFOSV9VMzIgZnJhbWVUcmFuc1JlcXVpcmVkOworICAgIHREcml2ZXJUeXBlICBkcml2ZXJUeXBlOworfSB0TWFjT3BlblBhcmFtZXRlcnM7CisKK3R5cGVkZWYgZW51bQoreworICAgIEhBTF9TVE9QX1RZUEVfU1lTX1JFU0VULAorICAgIEhBTF9TVE9QX1RZUEVfU1lTX0RFRVBfU0xFRVAsCisgICAgSEFMX1NUT1BfVFlQRV9SRl9LSUxMICAgCit9dEhhbFN0b3BUeXBlOworCit0eXBlZGVmIHN0cnVjdCBzSGFsTWFjU3RhcnRQYXJhbWV0ZXJzCit7CisgICAgLy8gcGFyYW1ldGVzIGZvciB0aGUgRmlybXdhcmUKKyAgICAvL3RIYWxGaXJtd2FyZVBhcmFtZXRlcnMgRlc7ICAgIAorICAgIHREcml2ZXJUeXBlICBkcml2ZXJUeXBlOworCit9IHRIYWxNYWNTdGFydFBhcmFtZXRlcnM7CisjZW5kaWYgCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBNQUMgU2lyaXVzIHBhcmFtZXRlciBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IHNBbmlTaXJHbG9iYWwKKworeworICAgIHREcml2ZXJUeXBlICBnRHJpdmVyVHlwZTsKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX1JUQUlfTElOVVgpCisgICAgc3RydWN0IHJ0TGliQXBwICogcnQ7CisjZW5kaWYKKworICAgIC8vIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNhdmUgdGhpcyBoZGRIYW5kbGUgaW4gaGVyZSBhbmQgZGVwcmVjYXRlCisgICAgLy8gdGhlIHBBZGFwdGVyLiAgRm9yIG5vdywgY29tcGlsZXMgYXJlIGEgcHJvYmxlbSBiZWNhdXNlIHRoZXJlCisgICAgLy8gYXJlIGRlcGVuZGVuY2lkZXMgb24gdGhlIGhlYWRlciBmaWxlcyB0aGF0IGFyZSBub3QgaGFuZGxpbmcgdGhlCisgICAgLy8gY29tcGlsZXIgdmVyeSBncmFjZWZ1bGx5LgorLy8gICAgdEhkZEhhbmRsZSAgIGhIZGQ7ICAgICAgIC8vIEhhbmRsZSB0byB0aGUgSERELgorICAgIC8vdm9pZCAgICAgICAgKmhIZGQ7CisgICAgdm9pZCAgICAgICAgKnBBZGFwdGVyOyAgIC8vIGRlcHJlY2F0ZSB0aGlzIHBBZGFwdGVyIHBvaW50ZXIgZXZlbnR1YWxseS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgaW50ZXJmYWNlcyB0byB0aGUgSEREIHNob3VsZCBwYXNzIGhIZGQsIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN0b3JlZCBpbiB0aGlzIHN0cnVjdCBhYm92ZS4uLi4uCisgICAgdFNpck1iTXNnKiAgIHBSZXNldE1zZzsKKyAgICB0QW5pU2lyQ2ZnICAgY2ZnOworICAgIHRBbmlTaXJMaW0gICBsaW07CisgICAgLy90QW5pU2lyRHBoICAgZHBoOworICAgIHRBbmlTaXJQbW0gICBwbW07CisgICAgdEFuaVNpclNjaCAgIHNjaDsKKyAgICB0QW5pU2lyU3lzICAgc3lzOworICAgIHRBbmlTaXJVdGlscyB1dGlsczsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgdEFuaVNpckhhbCAgIGhhbDsKKyAgICB0QW5pU2lyUGh5ICAgaHBoeTsKKyNlbmRpZiAKKworI2lmbmRlZiBXTEFOX0ZUTV9TVFVCIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICB0UHR0TW9kdWxlVmFyaWFibGVzIHB0dDsKKyNlbmRpZgorI2VuZGlmCisKKyAgICB0QW5pU2lyVHhXcmFwcGVyIHR4V3JhcHBlcjsKKyAgICAvLyBQQUwvSEREIGhhbmRsZQorICAgIHRIZGRIYW5kbGUgaEhkZDsKKworI2lmZGVmIEFOSV9EVlRfREVCVUcKKyAgICB0QW5pU2lyRHZ0ICAgZHZ0OworI2VuZGlmCisKKyAgICB0U21lU3RydWN0IHNtZTsKKyAgICB0Q3NyU2NhblN0cnVjdCBzY2FuOworICAgIHRDc3JSb2FtU3RydWN0IHJvYW07CisKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UCisgICAgdFBtY0luZm8gICAgIHBtYzsKKyAgICB0U21lQnRjSW5mbyAgYnRjOworI2VuZGlmCisKKyAgICB0Q2NtIGNjbTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIHRScm1Db250ZXh0IHJybTsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfQ09OQ1VSUkVOVF9QMlAKKyAgICB0cDJwQ29udGV4dCBwMnBDb250ZXh0W01BWF9OT19PRl9QMlBfU0VTU0lPTlNdOworI2Vsc2UKKyAgICB0cDJwQ29udGV4dCBwMnBDb250ZXh0OworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICB0ZnRDb250ZXh0ICAgZnQ7CisjZW5kaWYKKworICAgIHRBTklfVTMyICAgICBnQ3VycmVudExvZ1NpemU7CisgICAgdEFOSV9VMzIgICAgIG1lbnVDdXJyZW50OworICAgIC8qIGxvZ0R1bXAgc3BlY2lmaWMgKi8KKyAgICB0QU5JX1UzMiBkdW1wVGFibGVjdXJyZW50SWQ7CisgICAgLyogSW5zdGVhZCBvZiBzdGF0aWMgYWxsb2NhdGlvbiBJIHdpbGwgZHlhbmFtaWNhbGx5IGFsbG9jYXRlIG1lbW9yeSBmb3IgZHVtcFRhYmxlRW50cnkKKyAgICAgICAgVGhpbmtpbmcgb2YgdXNpbmcgbGlua2VkbGlzdCAgKi8gCisgICAgdER1bXBNb2R1bGVFbnRyeSAqZHVtcFRhYmxlRW50cnlbTUFYX0RVTVBfVEFCTEVfRU5UUlldOworICAgIAorfSB0QW5pU2lyR2xvYmFsOworCisKKworI2VuZGlmIC8qIF9BTklHTE9CQUxfSCAqLworCmRpZmYgLS1naXQgYS9DT1JFL01BQy9pbmMvYW5pUGFyYW0uaCBiL0NPUkUvTUFDL2luYy9hbmlQYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YTM2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9pbmMvYW5pUGFyYW0uaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyogCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZAorICogYW5pUGFyYW0uaDogTUFDIHBhcmFtZXRlciBpbnRlcmZhY2UuCisgKiBBdXRob3I6ICBLZXZpbiBOZ3V5ZW4KKyAqIERhdGU6ICAgIDA5LzA5LzIwMDIKKyAqCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgIE1vZGlmaWVkIGJ5ICAgICAgICAgICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX0FOSVBBUkFNX0gKKyNkZWZpbmUgX0FOSVBBUkFNX0gKKworI2luY2x1ZGUgImhhbFR5cGVzLmgiCisKKy8qKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqICBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgb25seSBpbnRlcmZhY2UgcGFzc2VkIGJldHdlZW4gdGhlIE1BQyBGVyBhbmQgdGhlICoKKyAqICBob3N0IGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBIb3N0LXRvLU1BQyBwYXJhbWV0ZXJzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICA9PT09PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICByYWRpb0lkOiAgICAgICAgIHJhZGlvIElEICgxIG9yIDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBwUGFja2V0QnVmQWxsb2M6IGZ1bmN0aW9uIHBvaW50ZXIgZm9yIFNLQnVmZmVyIGFsbG9jYXRpb24gICAgICAgICAgICAgICoKKyAqICBwUGFja2V0QnVmRnJlZSA6IGZ1bmN0aW9uIHBvaW50ZXIgZm9yIFNLQnVmZmVyIGZyZWUgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICAvLyBIREQgdG8gTUFDIHBhcmFtZXRlcnMKKyAgICBpbnQgICAgICAgICAgICAgcmFkaW9JZDsKKworICAgIHZvaWQgICAgICAgICAgKCpwUGFja2V0QnVmQWxsb2MpKHVuc2lnbmVkIHNob3J0IHNpemUsIHZvaWQgKipwcEJ1ZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnBwU2tiLCB2b2lkICpkZXYpOworICAgIHZvaWQgICAgICAgICAgKCpwUGFja2V0QnVmRnJlZSkodm9pZCogcEJ1Ziwgdm9pZCAqcFNrYik7CisKKyAgICBpbnQgcnhfdGFza2xldDsKKworICAgIC8vIGJsb2NrIHRhYmxlIGFsbG9jYXRlZCBieSBIREQKKyAgICB2b2lkICogYmxvY2tfdGFibGU7CisKKyAgICB0SGFsSGFuZGxlIGhIYWxIYW5kbGU7CisKK30gdEFuaU1hY1BhcmFtOworCisKKyNpZmRlZiBBTklfQVBfU0RLCisjZGVmaW5lIE5VTV9SQURJTyAxCisjZWxzZQorI2RlZmluZSBOVU1fUkFESU8gMgorI2VuZGlmCisKKworI2VuZGlmIC8qIF9BTklQQVJBTV9IICovCisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvaW5jL2FuaVN5c3RlbURlZnMuaCBiL0NPUkUvTUFDL2luYy9hbmlTeXN0ZW1EZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiMWY5ZgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL2luYy9hbmlTeXN0ZW1EZWZzLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgYW5pU3lzdGVtRGVmcy5oIGNvbnRhaW5zIGRlZmluaXRpb25zIHVzZWQgYnkKKyAqIHZhcmlvdXMgQU5JIGVudGl0aWVzCisgKiBBdXRob3I6ICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgMDkvMTgvMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fQU5JX1NZU1RFTV9ERUZTX0gKKyNkZWZpbmUgX19BTklfU1lTVEVNX0RFRlNfSAorCisjaW5jbHVkZSAic2lyVHlwZXMuaCIKKyNpbmNsdWRlICJzaXJNYWNQcm90RGVmLmgiCisKKyNkZWZpbmUgQU5JX09VSSAgMHgwMDBBRjUKKworLy8vIE1heCBXRFMgaW5mbyBsZW5ndGguCisjZGVmaW5lIEFOSV9XRFNfSU5GT19NQVhfTEVOR1RIICAgICAgICA2NAorCisKKy8vLyBNYXggbnVtYmVyIG9mIFNTSURzIHRvIHN1cHBvcnQgTXVsdGlwbGUgU1NJRCBmZWF0dXJlCisjZGVmaW5lIEFOSV9NQVhfTlVNX09GX1NTSURTICAgICAgICAgICAxNgorCisvL1RoaXMgaXMgdG8gZm9yY2UgY29tcGlsZXIgdG8gdXNlIHRoZSBtYXhpbXVtIG9mIGFuIGludCBmb3IgZW51bQorI2RlZmluZSBTSVJfTUFYX0VOVU1fU0laRSAgICAweDdGRkZGRkZGCisKKy8qIE1heCBrZXkgc2l6ZSAgaW5jbHVkaW5nIHRoZSBXQVBJIGFuZCBUS0lQICovCisjZGVmaW5lIFdMQU5fTUFYX0tFWV9SU0NfTEVOICAgICAgICAgMTYKKyNkZWZpbmUgV0xBTl9XQVBJX0tFWV9SU0NfTEVOICAgICAgICAxNgorCisKKworI2lmbmRlZiBGQUxTRQorI3VuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgMAorI2VuZGlmCisjaWZuZGVmIFRSVUUKKyN1bmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgICAgMQorI2VuZGlmCisKK3R5cGVkZWYgZW51bSBlQW5pQm9vbAoreworICAgIGVTSVJfRkFMU0UsCisgICAgZVNJUl9UUlVFLAorICAgIGVTSVJfRE9OT1RfVVNFX0JPT0wgPSBTSVJfTUFYX0VOVU1fU0laRQorfSB0QW5pQm9vbDsKKworLy8vIEF1dGhlbnRpY2F0aW9uIHR5cGUgZW51bSB1c2VkIHdpdGggcGVlcgordHlwZWRlZiBlbnVtIGVBbmlBdXRoVHlwZQoreworICAgIGVTSVJfT1BFTl9TWVNURU0sCisgICAgZVNJUl9TSEFSRURfS0VZLAorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBlU0lSX0ZUX0FVVEgsCisjZW5kaWYKKyNpZiBkZWZpbmVkIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICBlU0lSX0xFQVBfQVVUSCA9IDB4ODAsCisjZW5kaWYKKyAgICBlU0lSX0FVVE9fU1dJVENILAorICAgIGVTSVJfRE9OT1RfVVNFX0FVVEhfVFlQRSA9IFNJUl9NQVhfRU5VTV9TSVpFCit9IHRBbmlBdXRoVHlwZTsKKworLy8vIEVuY3J5cHRpb24gdHlwZSBlbnVtIHVzZWQgd2l0aCBwZWVyCit0eXBlZGVmIGVudW0gZUFuaUVkVHlwZQoreworICAgIGVTSVJfRURfTk9ORSwKKyAgICBlU0lSX0VEX1dFUDQwLAorICAgIGVTSVJfRURfV0VQMTA0LAorICAgIGVTSVJfRURfVEtJUCwKKyAgICBlU0lSX0VEX0NDTVAsCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKyAgICBlU0lSX0VEX1dQSSwKKyNlbmRpZgorICAgIC8qRFBVIEhXIHRyZWF0cyBlbmNyeXB0aW9uIG1vZGUgNCBwbHVzIFJNRiBiaXQgc2V0IGluIFRYIEJEIGFzIEJJUC4KKyAgICAgIFRodXMgd2hpbGUgc2V0dGluZyBCSVAgZW5jcnlwdGlvbiBtb2RlIGluIGNvcnJlc3BvbmRpbmcgRFBVIERlc2MKKyAgICAgIGVTSVJfRURfQUVTXzEyOF9DTUFDIHNob3VsZCBiZSBzZXQgdG8gZVNJUl9FRF9DQ01QKi8KKyAgICBlU0lSX0VEX0FFU18xMjhfQ01BQywKKyAgICBlU0lSX0VEX05PVF9JTVBMRU1FTlRFRCA9IFNJUl9NQVhfRU5VTV9TSVpFCit9IHRBbmlFZFR5cGU7CisKKwordHlwZWRlZiBlbnVtIGVBbmlXZXBUeXBlCit7CisgICAgZVNJUl9XRVBfU1RBVElDLAorICAgIGVTSVJfV0VQX0RZTkFNSUMsCit9IHRBbmlXZXBUeXBlOworCisvLy8gRW51bSB0byBzcGVjaWZ5IHdoZXRoZXIga2V5IGlzIHVzZWQKKy8vLyBmb3IgVFggb25seSwgUlggb25seSBvciBib3RoCit0eXBlZGVmIGVudW0gZUFuaUtleURpcmVjdGlvbgoreworICAgIGVTSVJfVFhfT05MWSwKKyAgICBlU0lSX1JYX09OTFksCisgICAgZVNJUl9UWF9SWCwKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgZVNJUl9UWF9ERUZBVUxULAorI2VuZGlmCisgICAgZVNJUl9ET05PVF9VU0VfS0VZX0RJUkVDVElPTiA9IFNJUl9NQVhfRU5VTV9TSVpFCit9IHRBbmlLZXlEaXJlY3Rpb247CisKKy8vLyBFbnVtIGZvciByYXRlCit0eXBlZGVmIGVudW0gZUFuaVJhdGUKK3sKKyAgICBlU0lSX0FOWV9SQVRFCit9IHRBbmlSYXRlOworCit0eXBlZGVmIHN0cnVjdCBzQW5pU1NJRAoreworICAgIHRBTklfVTggICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICBzc0lkW1NJUl9NQUNfTUFYX1NTSURfTEVOR1RIXTsKK30gdEFuaVNTSUQsICp0cEFuaVNTSUQ7CisKK3R5cGVkZWYgc3RydWN0IHNBbmlBcE5hbWUKK3sKKyAgICB0QU5JX1U4ICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgbmFtZVtTSVJfTUFDX01BWF9TU0lEX0xFTkdUSF07Cit9IHRBbmlBcE5hbWUsICp0cEFuaUFwTmFtZTsKKworLy8vIFJTTiBJRSBpbmZvcm1hdGlvbgordHlwZWRlZiBzdHJ1Y3Qgc1NpclJTTmllCit7CisgICAgdEFOSV9VMTYgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgIHJzbklFZGF0YVtTSVJfTUFDX01BWF9JRV9MRU5HVEgrMl07Cit9IHRTaXJSU05pZSwgKnRwU2lyUlNOaWU7CisKKy8vLyBBZGRpdGlvbmFsIElFIGluZm9ybWF0aW9uIDoKKy8vLyBUaGlzIGNhbiBpbmNsdWRlIFdTQyBJRSwgUDJQIElFLCBhbmQvb3IgRlRJRSBmcm9tIHVwcGVyIGxheWVyLgorLy8vIE1BQyBsYXllciB0cmFuc3BhcmVudGx5IGNvbnZleSB0aGVzZSBJRSBpbmZvIGJldHdlZW4gcGVlciBTVEEgYW5kIHVwcGVyIGxheWVyLAorLy8vIGJ1dCBuZXZlciByZXF1aXJlcyB0byBwYXJzZSBpdC4KK3R5cGVkZWYgc3RydWN0IHNTaXJBZGRpZQoreworICAgIHRBTklfVTE2ICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICBhZGRJRWRhdGFbU0lSX01BQ19NQVhfSUVfTEVOR1RIKzJdOworfSB0U2lyQWRkaWUsICp0cFNpckFkZGllOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorCisvLyBUaGUgQ0NLTSBJRSBuZWVkcyB0byBiZSBpbiB0aGUgCisvLyBKb2luIGFuZCBSZWFzc29jIFJlcS4gCit0eXBlZGVmIHN0cnVjdCBzU2lyQ0NLTWllCit7CisgICAgdEFOSV9VMTYgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgIGNja21JRWRhdGFbU0lSX01BQ19NQVhfSUVfTEVOR1RIKzJdOyAgCit9IHRTaXJDQ0tNaWUsICp0cFNpckNDS01pZTsKKworI2VuZGlmCisKKy8vLyBOZWVkIHRvIHJlZmluZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIEtleWluZyBtYXRlcmlhbCwKKy8vLyBRb1MgcG9saWN5LCBldGMKKworLy8vIERlZmluaXRpb24gUXVhbGl0eSBvZiBTZXJ2aWNlCit0eXBlZGVmIHN0cnVjdCBzU2lyUW9zCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgdGVtcDE7ICAvLyBOZWVkIHRvIGRlZmluZSBsYXRlcgorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHRlbXAyOyAgLy8gTmVlZCB0byBkZWZpbmUgbGF0ZXIKK30gdFNpclFvcywgKnRwU2lyUW9zOworCisvLy8gRGVmaW5pdGlvbiBmb3IgRW5jcnlwdGlvbiBLZXlzCit0eXBlZGVmIHN0cnVjdCBzU2lyS2V5cworeworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICBrZXlJZDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgdW5pY2FzdDsgICAgIC8vIDAgZm9yIG11bHRpY2FzdAorICAgIHRBbmlLZXlEaXJlY3Rpb24gICAga2V5RGlyZWN0aW9uOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICBrZXlSc2NbV0xBTl9NQVhfS0VZX1JTQ19MRU5dOyAgIC8vIFVzYWdlIGlzIHVua25vd24KKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgcGFlUm9sZTsgICAgIC8vID0xIGZvciBhdXRoZW50aWNhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID0wIGZvciBzdXBwbGljYW50CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgIGtleUxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAga2V5W1NJUl9NQUNfTUFYX0tFWV9MRU5HVEhdOworfSB0U2lyS2V5cywgKnRwU2lyS2V5czsKKworLy8vIERlZmluaXRpb24gZm9yIEtleWluZyBtYXRlcmlhbAordHlwZWRlZiBzdHJ1Y3Qgc1NpcktleU1hdGVyaWFsCit7CisgICAgdEFOSV9VMTYgICAgICAgICBsZW5ndGg7ICAgIC8vIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgdGhhdCBmb2xsb3dzCisgICAgdEFuaUVkVHlwZSAgZWRUeXBlOyAgICAvLyBFbmNyeXB0aW9uL0RlY3J5cHRpb24gdHlwZQorICAgIHRBTklfVTggICAgICAgICAgbnVtS2V5czsKKyAgICB0U2lyS2V5cyAgICBrZXlbMV07Cit9IHRTaXJLZXlNYXRlcmlhbCwgKnRwU2lyS2V5TWF0ZXJpYWw7CisKKyNkZWZpbmUgU0lSX0NJUEhFUl9TRVFfQ1RSX1NJWkUgNgorLy8vIERlZmluaXRpb24gZm9yIE1JQyBmYWlsdXJlIGluZGljYXRpb24KK3R5cGVkZWYgc3RydWN0IHNTaXJNaWNGYWlsdXJlSW5mbworeworICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgc3JjTWFjQWRkcjsgLy9hZGRyZXNzIHVzZWQgdG8gY29tcHV0ZSBNSUMKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgIHRhTWFjQWRkcjsgLy90cmFuc21pdHRlciBhZGRyZXNzCisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICBkc3RNYWNBZGRyOworICAgIHRBbmlCb29sICAgICAgICAgICAgICAgbXVsdGljYXN0OworICAgIHRBTklfVTggICAgIElWMTsgICAgICAgICAgICAvLyBmaXJzdCBieXRlIG9mIElWCisgICAgdEFOSV9VOCAgICAga2V5SWQ7ICAgICAgICAgIC8vIHNlY29uZCBieXRlIG9mIElWCisgICAgdEFOSV9VOCAgICAgVFNDW1NJUl9DSVBIRVJfU0VRX0NUUl9TSVpFXTsgLy8gc2VxdWVuY2UgbnVtYmVyCisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICByeE1hY0FkZHI7IC8vIHJlY2VpdmUgYWRkcmVzcworCit9IHRTaXJNaWNGYWlsdXJlSW5mbywgKnRwU2lyTWljRmFpbHVyZUluZm87CisKKy8vIEJvYSBjb21tYW5kLiBVc2VkIG1haW5seSBmb3IgcmFkYXIgaW5mbyBwZXJzaXN0YW5jZQordHlwZWRlZiBzdHJ1Y3Qgc0JvYUNvbW1hbmQKK3sKKyAgICB0QU5JX1U4ICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgY21kWzY0XTsKK310Qm9hQ29tbWFuZDsKKworI2VuZGlmIC8qIF9fQU5JX1NZU1RFTV9ERUZTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvaW5jL2xvZ0R1bXAuaCBiL0NPUkUvTUFDL2luYy9sb2dEdW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmOWNkZAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL2luYy9sb2dEdW1wLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29weXJpZ2h0IChjKSAyMDA3IFFVQUxDT01NIEluY29ycG9yYXRlZC4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCitRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5CisKK2xvZ0R1bXAuaAorCitQcm92aWRlcyBhcGkncyBmb3IgZHVtcCBjb21tYW5kcy4KKworQXV0aG9yOiAgICBTYW50b3NoIE1hbmRpZ2FuYWwKK0RhdGU6ICAgICAgMDQvMDYvMjAwOAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworI2lmbmRlZiBfX0xPR0RVTVBfSF9fCisjZGVmaW5lIF9fTE9HRFVNUF9IX18KKworI2RlZmluZSBNQVhfRFVNUF9DTUQgICAgICAgICAgICA5OTkKKyNkZWZpbmUgTUFYX0RVTVBfVEFCTEVfRU5UUlkgICAgMTAKKwordHlwZWRlZiBjaGFyICogKCp0cEZ1bmMpKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiwgdEFOSV9VMzIsIHRBTklfVTMyLCB0QU5JX1UzMiwgY2hhciAqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0R1bXBGdW5jRW50cnkgIHsKKyAgICB0QU5JX1UzMiAgICBpZDsKKyAgICBjaGFyICAgICAgICpkZXNjcmlwdGlvbjsKKyAgICB0cEZ1bmMgICAgICBmdW5jOworfSB0RHVtcEZ1bmNFbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0R1bXBNb2R1bGVFbnRyeSAgeworICAgIHRBTklfVTMyICAgIG1pbmR1bXBpZDsKKyAgICB0QU5JX1UzMiAgICBtYXhkdW1waWQ7CisgICAgdEFOSV9VMzIgICAgbkl0ZW1zOworICAgIHREdW1wRnVuY0VudHJ5ICAgICAqZHVtcFRhYmxlOworfSB0RHVtcE1vZHVsZUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBzUmVnTGlzdCB7CisgICAgdEFOSV9VMzIgICAgYWRkcjsKKyAgICBjaGFyICAgICAgICpuYW1lOworfSB0TG9nZFJlZ0xpc3Q7CisKK2ludCBsb2dfc3ByaW50Zih0cEFuaVNpckdsb2JhbCBwTWFjLCBjaGFyICpwQnVmLCBjaGFyICpmbXQsIC4uLiApOworCitjaGFyICoKK2R1bXBfdGhyZWFkX2luZm8oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApOworCitjaGFyICoKK2R1bXBfbG9nX2xldmVsX3NldCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCk7CisKK2NoYXIgKgorZHVtcF9jZmdfc2V0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCAKKyAgICAgICAgICAgICAgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCk7CisKK2NoYXIgKgorZHVtcF9jZmdfZ2V0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCAKKyAgICAgICAgICAgICAgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCk7CisKK2NoYXIgKgorZHVtcF9jZmdfZ3JvdXBfZ2V0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLAorICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKTsKKwordm9pZCBsb2dEdW1wUmVnaXN0ZXJUYWJsZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdER1bXBGdW5jRW50cnkgKnBFbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgIG5JdGVtcyApOworCisKK3ZvaWQgbG9nRHVtcEluaXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKyNlbmRpZiAvKiBfX0xPR0RVTVBfSF9fICovCmRpZmYgLS1naXQgYS9DT1JFL01BQy9pbmMvbWFjSW5pdEFwaS5oIGIvQ09SRS9NQUMvaW5jL21hY0luaXRBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWQwYzMyCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvaW5jL21hY0luaXRBcGkuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogbWFjSW5pdEFwaS5jIC0gSGVhZGVyIGZpbGUgZm9yIG1hYyBsZXZlbCBpbml0IGZ1bmN0aW9ucworICAqIEF1dGhvcjogICAgRGluZXNoIFVwYWRoeWF5CisgKiBEYXRlOiAgICAgIDA0LzIzLzIwMDcKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICBNb2RpZmllZCBieSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpZm5kZWYgX19NQUNfSU5JVF9BUElfSAorI2RlZmluZSBfX01BQ19JTklUX0FQSV9ICisKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKwordFNpclJldFN0YXR1cyBtYWNTdGFydCh0SGFsSGFuZGxlIGhIYWwsIHZvaWQqIHBIYWxNYWNTdGFydFBhcmFtcyk7Cit0U2lyUmV0U3RhdHVzIG1hY1N0b3AodEhhbEhhbmRsZSBoSGFsLCB0SGFsU3RvcFR5cGUgc3RvcFR5cGUpOwordFNpclJldFN0YXR1cyBtYWNPcGVuKHRIYWxIYW5kbGUgKiBwSGFsSGFuZGxlLCB0SGRkSGFuZGxlIGhIZGQsIHRNYWNPcGVuUGFyYW1ldGVycyAqIHBNYWNPcGVuUGFybXMpOwordFNpclJldFN0YXR1cyBtYWNDbG9zZSh0SGFsSGFuZGxlIGhIYWwpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DIAordFNpclJldFN0YXR1cyBtYWNQcmVTdGFydCh0SGFsSGFuZGxlIGhIYWwpOworI2VuZGlmCisKKyNlbmRpZiAvL19fTUFDX0lOSVRfQVBJX0gKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvaW5jL21hY1RyYWNlLmggYi9DT1JFL01BQy9pbmMvbWFjVHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGUyNjdjCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvaW5jL21hY1RyYWNlLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgXGZpbGUgIG1hY1RyYWNlLmgKKworICBcYnJpZWYgZGVmaW5pdGlvbiBmb3IgdHJhY2UgcmVsYXRlZCBBUElzCisKKyAgXGF1dGhvciBTdW5pdCBCaGF0aWEKKworICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisjaWZuZGVmIF9fTUFDX1RSQUNFX0gKKyNkZWZpbmUgX19NQUNfVFJBQ0VfSAorCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisKKworI2lmZGVmIFRSQUNFX1JFQ09SRAorCisjZGVmaW5lIENBU0VfUkVUVVJOX1NUUklORyggc3RyICkgICAgICAgICAgIFwKKyAgICBjYXNlICggKCBzdHIgKSApOiByZXR1cm4oICh0QU5JX1U4KikoI3N0cikgKTsgYnJlYWsgXAorCisjZGVmaW5lIE1BQ19UUkFDRV9HRVRfTU9EVUxFX0lEKGRhdGEpICgoZGF0YSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIE1BQ19UUkFDRV9HRVRfTVNHX0lEKGRhdGEpICAgICAgIChkYXRhICYgMHhmZmZmKQorCisKK3R5cGVkZWYgc3RydWN0ICBzVHJhY2VSZWNvcmQKK3sKKyAgICB0QU5JX1UxNiB0aW1lOworICAgIHRBTklfVTggbW9kdWxlOworICAgIHRBTklfVTggY29kZTsKKyAgICB0QU5JX1U4IHNlc3Npb247CisgICAgdEFOSV9VMzIgZGF0YTsKK310VHJhY2VSZWNvcmQsICp0cFRyYWNlUmVjb3JkOworCisKKworI2RlZmluZSBNQVhfVFJBQ0VfUkVDT1JEUyA1MDAKKyNkZWZpbmUgSU5WQUxJRF9UUkFDRV9BRERSIDB4ZmZmZmZmZmYKKyNkZWZpbmUgREVGQVVMVF9UUkFDRV9EVU1QX0NPVU5UIDIwMAorCisKKwordHlwZWRlZiB2b2lkICgqdHBUcmFjZUNiKSh0cEFuaVNpckdsb2JhbCwgdHBUcmFjZVJlY29yZCwgdEFOSV9VMTYpOworCisKKworCit0eXBlZGVmIHN0cnVjdCBzVHJhY2VEYXRhCit7CisgICAgdEFOSV9VMzIgaGVhZDsKKyAgICB0QU5JX1UzMiB0YWlsOworICAgIHRBTklfVTMyIG51bTsKKyAgICB0QU5JX1UxNiBudW1TaW5jZUxhc3REdW1wOworCisgICAgLy9Db25maWcgZm9yIGNvbnRyb2xsaW5nIHRoZSB0cmFjZQorICAgIHRBTklfVTggZW5hYmxlOworICAgIHRBTklfVTE2IGR1bXBDb3VudDsgLy93aWxsIGR1bXAgYWZ0ZXIgbnVtYmVyIG9mIHJlY29yZHMgcmVhY2ggdGhpcyBudW1iZXIuCisKK310VHJhY2VEYXRhOworCisKKwordm9pZCBtYWNUcmFjZUluaXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIG1hY1RyYWNlUmVzZXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIG1hY1RyYWNlKHRwQW5pU2lyR2xvYmFsIHBNYWMsICB0QU5JX1U4IGNvZGUsIHRBTklfVTggc2Vzc2lvbiwgdEFOSV9VMzIgZGF0YSk7Cit2b2lkIG1hY1RyYWNlTmV3KHRwQW5pU2lyR2xvYmFsIHBNYWMsICB0QU5JX1U4IG1vZHVsZSwgdEFOSV9VOCBjb2RlLCB0QU5JX1U4IHNlc3Npb24sIHRBTklfVTMyIGRhdGEpOwordm9pZCBtYWNUcmFjZUR1bXBBbGwodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjb2RlLCB0QU5JX1U4IHNlc3Npb24sIHRBTklfVTMyIGNvdW50KTsKK3ZvaWQgbWFjVHJhY2VDZmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgZW5hYmxlLCB0QU5JX1UzMiBkdW1wV2hlbkZ1bGwsIHRBTklfVTMyIGNvZGUsIHRBTklfVTMyIHNlc3Npb24pOwordm9pZCBtYWNUcmFjZVJlZ2lzdGVyKCB0cEFuaVNpckdsb2JhbCBwTWFjLCBWT1NfTU9EVUxFX0lEIG1vZHVsZUlkLCAgICB0cFRyYWNlQ2IgdHJhY2VDYik7Cit0QU5JX1U4KiBtYWNUcmFjZUdldENmZ01zZ1N0cmluZyggdEFOSV9VMTYgY2ZnTXNnICk7Cit0QU5JX1U4KiBtYWNUcmFjZUdldExpbU1zZ1N0cmluZyggdEFOSV9VMTYgbGltTXNnICk7Cit0QU5JX1U4KiBtYWNUcmFjZUdldEhhbE1zZ1N0cmluZyggdEFOSV9VMTYgaGFsTXNnICk7Cit0QU5JX1U4KiBtYWNUcmFjZUdldFNtZU1zZ1N0cmluZyggdEFOSV9VMTYgc21lTXNnICk7Cit0QU5JX1U4KiBtYWNUcmFjZUdldE1vZHVsZVN0cmluZyggdEFOSV9VOCBtb2R1bGVJZCk7CisKKworCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL2luYy9xd2xhbl92ZXJzaW9uLmggYi9DT1JFL01BQy9pbmMvcXdsYW5fdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlM2M2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9pbmMvcXdsYW5fdmVyc2lvbi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFFXTEFOX1ZFUlNJT05fSAorI2RlZmluZSBRV0xBTl9WRVJTSU9OX0gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZJTEU6IAorICAgcXdsYW5fdmVyc2lvbi5oCisKK0JSSUVGIERFU0NSSVBUSU9OOgorICAgV0xBTiBIb3N0IFZlcnNpb24gZmlsZS4KKyAgIEJ1aWxkIG51bWJlciBhdXRvbWF0aWNseSB1cGRhdGVkIGJ5IGJ1aWxkIHNjcmlwdHMuCisKKworICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOC0yMDExIFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgICBBbGwgUmlnaHQgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBRV0xBTl9WRVJTSU9OX01BSk9SICAgICAgICAgICAgMworI2RlZmluZSBRV0xBTl9WRVJTSU9OX01JTk9SICAgICAgICAgICAgMQorI2RlZmluZSBRV0xBTl9WRVJTSU9OX1BBVENIICAgICAgICAgICAgNworI2RlZmluZSBRV0xBTl9WRVJTSU9OX0VYVFJBICAgICAgICAgICAgIiIKKyNkZWZpbmUgUVdMQU5fVkVSU0lPTl9CVUlMRCAgICAgICAgICAgIDkKKworI2RlZmluZSBRV0xBTl9WRVJTSU9OU1RSICAgICAgICAgICAgICAgIjMuMS43LjkiCisKKyNlbmRpZiAvKiBRV0xBTl9WRVJTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL2luYy9zaXJBcGkuaCBiL0NPUkUvTUFDL2luYy9zaXJBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGFhZDcwCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvaW5jL3NpckFwaS5oCkBAIC0wLDAgKzEsNDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHNpckFwaS5oIGNvbnRhaW5zIGRlZmluaXRpb25zIGV4cG9ydGVkIGJ5CisgKiBTaXJpdXMgc29mdHdhcmUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwNC8xNi8yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fU0lSX0FQSV9ICisjZGVmaW5lIF9fU0lSX0FQSV9ICisKKyNpbmNsdWRlICJzaXJUeXBlcy5oIgorI2luY2x1ZGUgInNpck1hY1Byb3REZWYuaCIKKyNpbmNsdWRlICJhbmlTeXN0ZW1EZWZzLmgiCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisjaW5jbHVkZSAiY2N4R2xvYmFsLmgiCisjZW5kaWYKKworLy8vIE1heGltdW0gbnVtYmVyIG9mIFNUQXMgYWxsb3dlZCBpbiB0aGUgQlNTCisjZGVmaW5lIFNJUl9NQVhfTlVNX1NUQSAgICAgICAgICAgICAgICAyNTYKKworLy8vIE1heGltdW0gbnVtYmVyIG9mIE5laWdoYm9ycyByZXBvcnRlZCBieSBTVEEgZm9yIExCIGZlYXR1cmUKKyNkZWZpbmUgU0lSX01BWF9OVU1fTkVJR0hCT1JfQlNTICAgICAgIDMKKworLy8vIE1heGltdW0gbnVtYmVyIG9mIE5laWdoYm9ycyByZXBvcnRlZCBieSBTVEEgZm9yIExCIGZlYXR1cmUKKyNkZWZpbmUgU0lSX01BWF9OVU1fQUxURVJOQVRFX1JBRElPUyAgIDUKKworLy8vIE1heGltdW0gc2l6ZSBvZiBTQ0FOX1JTUCBtZXNzYWdlCisjZGVmaW5lIFNJUl9NQVhfU0NBTl9SU1BfTVNHX0xFTkdUSCAgICAyNjAwCisKKy8vLyBTdGFydCBvZiBTaXJpdXMgc29mdHdhcmUvSG9zdCBkcml2ZXIgbWVzc2FnZSB0eXBlcworI2RlZmluZSBTSVJfSEFMX0hPU1RfTVNHX1NUQVJUICAgICAgICAgMHgxMDAwCisKKy8vLyBQb3dlciBzYXZlIGxldmVsIGRlZmluaXRpb25zCisjZGVmaW5lIFNJUl9NQVhfUE9XRVJfU0FWRSAgICAgICAgICAzCisjZGVmaW5lIFNJUl9JTlRFUk1FRElBVEVfUE9XRVJfU0FWRSA0CisjZGVmaW5lIFNJUl9OT19QT1dFUl9TQVZFICAgICAgICAgICA1CisKKy8vLyBNYXggc3VwcG9ydGVkIGNoYW5uZWwgbGlzdAorI2RlZmluZSBTSVJfTUFYX1NVUFBPUlRFRF9DSEFOTkVMX0xJU1QgICAgICA5NgorCisvLy8gTWF4aW11bSBEVElNIEZhY3RvcgorI2RlZmluZSBTSVJfTUFYX0RUSU1fRkFDVE9SICAgICAgICAgMzIKKworI2RlZmluZSBTSVJfTURJRV9TSVpFICAgICAgICAgICAgICAgMworCisKKworI2RlZmluZSBTSVJfTlVNXzExQl9SQVRFUyA0ICAgLy8xLDIsNS41LDExCisjZGVmaW5lIFNJUl9OVU1fMTFBX1JBVEVTIDggIC8vNiw5LDEyLDE4LDI0LDM2LDQ4LDU0CisjZGVmaW5lIFNJUl9OVU1fUE9MQVJJU19SQVRFUyAzIC8vNzIsOTYsMTA4CisjZGVmaW5lIFNJUl9OVU1fVElUQU5fUkFURVMgMjYKKyNkZWZpbmUgU0lSX05VTV9UQVVSVVNfUkFURVMgNCAvLzEzNi41LCAxNTEuNywyODMuNSwzMTUKKyNkZWZpbmUgU0lSX05VTV9QUk9QX1JBVEVTICAoU0lSX05VTV9USVRBTl9SQVRFUyArIFNJUl9OVU1fVEFVUlVTX1JBVEVTKQorCisjZGVmaW5lIFNJUl8xMU5fUFJPUF9SQVRFXzEzNl81ICgxPDwyOCkKKyNkZWZpbmUgU0lSXzExTl9QUk9QX1JBVEVfMTUxXzcgKDE8PDI5KQorI2RlZmluZSBTSVJfMTFOX1BST1BfUkFURV8yODNfNSAoMTw8MzApCisjZGVmaW5lIFNJUl8xMU5fUFJPUF9SQVRFXzMxNSAgICAgKDE8PDMxKQorI2RlZmluZSBTSVJfMTFOX1BST1BfUkFURV9CSVRNQVAgMHg4MDAwMDAwMCAvL29ubHkgMzE1TUJQUyByYXRlIGlzIHN1cHBvcnRlZCB0b2RheQorLy9UYXVydXMgaXMgZ29pbmcgdG8gc3VwcG9ydCAyNiBUaXRhbiBSYXRlcyhubyBFU0YvY29uY2F0IFJhdGVzIHdpbGwgYmUgc3VwcG9ydGVkKQorLy9GaXJzdCAyNiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgVGl0YW4gYW5kIGxhc3QgNCBiaXRzIGZvciBUYXVydXMsIDIoMjcgYW5kIDI4KSBiaXRzIGFyZSByZXNlcnZlZC4KKy8vI2RlZmluZSBTSVJfVElUQU5fUFJPUF9SQVRFX0JJVE1BUCAweDAzRkZGRkZGCisvL0Rpc2FibGUgYWxsIFRpdGFuIHJhdGVzCisjZGVmaW5lIFNJUl9USVRBTl9QUk9QX1JBVEVfQklUTUFQIDAKKyNkZWZpbmUgU0lSX0NPTlZFUlRfMl9VMzJfQklUTUFQKG5SYXRlcykgKChuUmF0ZXMgKyAzMSkvMzIpCisKKy8qICN0QU5JX1UzMidzIG5lZWRlZCBmb3IgYSBiaXRtYXAgcmVwcmVzZW50YXRpb24gZm9yIGFsbCBwcm9wIHJhdGVzICovCisjZGVmaW5lIFNJUl9OVU1fVTMyX01BUF9SQVRFUyAgICBTSVJfQ09OVkVSVF8yX1UzMl9CSVRNQVAoU0lSX05VTV9QUk9QX1JBVEVTKQorCisKKyNkZWZpbmUgU0lSX1BNX1NMRUVQX01PREUgICAwCisjZGVmaW5lIFNJUl9QTV9BQ1RJVkVfTU9ERSAgICAgICAgMQorCisvLyBVc2VkIGJ5IHZhcmlvdXMgbW9kdWxlcyB0byBsb2FkIEFMTCBDRkcncworI2RlZmluZSBBTklfSUdOT1JFX0NGR19JRCAweEZGRkYKKworLy9oaWRkZW4gU1NJRCBvcHRpb25zCisjZGVmaW5lIFNJUl9TQ0FOX05PX0hJRERFTl9TU0lEICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX1NDQU5fSElEREVOX1NTSURfUEVfREVDSVNJT04gICAgICAgICAgICAgMQorI2RlZmluZSBTSVJfU0NBTl9ISURERU5fU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgU0lSX01BQ19BRERSX0xFTiAgICAgICAgNgorI2RlZmluZSBTSVJfSVBWNF9BRERSX0xFTiAgICAgICA0CisKK3R5cGVkZWYgdEFOSV9VOCB0U2lySXB2NEFkZHJbU0lSX0lQVjRfQUREUl9MRU5dOworCisjZGVmaW5lIFNJUl9WRVJTSU9OX1NUUklOR19MRU4gNjQKK3R5cGVkZWYgdEFOSV9VOCB0U2lyVmVyc2lvblN0cmluZ1tTSVJfVkVSU0lPTl9TVFJJTkdfTEVOXTsKKworZW51bSBlU2lySG9zdE1zZ1R5cGVzCit7CisgICAgU0lSX0hBTF9BUFBfU0VUVVBfTlRGID0gU0lSX0hBTF9IT1NUX01TR19TVEFSVCwKKyAgICBTSVJfSEFMX0lOSVRJQUxfQ0FMX0ZBSUxFRF9OVEYsCisgICAgU0lSX0hBTF9OSUNfT1BFUl9OVEYsCisgICAgU0lSX0hBTF9JTklUX1NUQVJUX1JFUSwKKyAgICBTSVJfSEFMX1NIVVRET1dOX1JFUSwKKyAgICBTSVJfSEFMX1NIVVRET1dOX0NORiwKKyAgICBTSVJfSEFMX1JFU0VUX1JFUSwKKyAgICBTSVJfSEFMX1JBRElPX09OX09GRl9JTkQsICAgIAorICAgIFNJUl9IQUxfUkVTRVRfQ05GLAorICAgIFNJUl9XUklURV9UT19URCwKKyAgICBTSVJfSEFMX0hERF9BRERCQV9SRVEsIC8vIE1BQyAtPiBIREQKKyAgICBTSVJfSEFMX0hERF9BRERCQV9SU1AsIC8vIEhERCAtPiBIQUwgICAgICAgIAorICAgIFNJUl9IQUxfREVMRVRFQkFfSU5ELCAvLyBNQUMgLT4gSERECisgICAgU0lSX0hBTF9CQV9GQUlMX0lORCwgLy8gSEREIC0+IE1BQworICAgIFNJUl9UTF9IQUxfRkxVU0hfQUNfUkVRLCAKKyAgICBTSVJfSEFMX1RMX0ZMVVNIX0FDX1JTUAorfTsKKworCisKKy8qKgorICogTW9kdWxlIElEIGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKyAgICBTSVJfQk9PVF9NT0RVTEVfSUQgPSAxLAorICAgIFNJUl9IQUxfTU9EVUxFX0lEICA9IDB4MTAsCisgICAgU0lSX0NGR19NT0RVTEVfSUQsCisgICAgU0lSX0xJTV9NT0RVTEVfSUQsCisgICAgU0lSX0FSUV9NT0RVTEVfSUQsCisgICAgU0lSX1NDSF9NT0RVTEVfSUQsCisgICAgU0lSX1BNTV9NT0RVTEVfSUQsCisgICAgU0lSX01OVF9NT0RVTEVfSUQsCisgICAgU0lSX0RCR19NT0RVTEVfSUQsCisgICAgU0lSX0RQSF9NT0RVTEVfSUQsCisgICAgU0lSX1NZU19NT0RVTEVfSUQsCisgICAgU0lSX1NNU19NT0RVTEVfSUQsCisKKyAgICBTSVJfUEhZX01PRFVMRV9JRCA9IDB4MjAsCisKKworICAgIC8vIEFkZCBhbnkgbW9kdWxlcyBhYm92ZSB0aGlzIGxpbmUKKyAgICBTSVJfRFZUX01PRFVMRV9JRAorfTsKKworI2RlZmluZSBTSVJfV0RBX01PRFVMRV9JRCBTSVJfSEFMX01PRFVMRV9JRAorCisvKioKKyAqIEZpcnN0IGFuZCBsYXN0IG1vZHVsZSBkZWZpbml0aW9uIGZvciBsb2dnaW5nIHV0aWxpdHkKKyAqCisgKiBOT1RFOiAgVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBuZWVkIHRvIGJlIHVwZGF0ZWQgaWYKKyAqICAgICAgICB0aGUgYWJvdmUgbGlzdCBpcyBjaGFuZ2VkLgorICovCisjZGVmaW5lIFNJUl9GSVJTVF9NT0RVTEVfSUQgICAgIFNJUl9IQUxfTU9EVUxFX0lECisjZGVmaW5lIFNJUl9MQVNUX01PRFVMRV9JRCAgICAgIFNJUl9EVlRfTU9EVUxFX0lECisKKworLy8gVHlwZSBkZWNsYXJhdGlvbnMgdXNlZCBieSBGaXJtd2FyZSBhbmQgSG9zdCBzb2Z0d2FyZQorCisvLyBTY2FuIHR5cGUgZW51bSB1c2VkIGluIHNjYW4gcmVxdWVzdAordHlwZWRlZiBlbnVtIGVTaXJTY2FuVHlwZQoreworICAgIGVTSVJfUEFTU0lWRV9TQ0FOLAorICAgIGVTSVJfQUNUSVZFX1NDQU4sCit9IHRTaXJTY2FuVHlwZTsKKworLy8vIFJlc3VsdCBjb2RlcyBGaXJtd2FyZSByZXR1cm4gdG8gSG9zdCBTVwordHlwZWRlZiBlbnVtIGVTaXJSZXN1bHRDb2RlcworeworICAgIGVTSVJfU01FX1NVQ0NFU1MsCisKKyAgICBlU0lSX0VPRl9TT0ZfRVhDRVBUSU9OLAorICAgIGVTSVJfQk1VX0VYQ0VQVElPTiwKKyAgICBlU0lSX0xPV19QRFVfRVhDRVBUSU9OLAorICAgIGVTSVJfVVNFUl9UUklHX1JFU0VULAorICAgIGVTSVJfTE9HUF9FWENFUFRJT04sCisgICAgZVNJUl9DUF9FWENFUFRJT04sCisgICAgZVNJUl9TVE9QX0JTUywKKyAgICBlU0lSX0FIQl9IQU5HX0VYQ0VQVElPTiwKKyAgICBlU0lSX0RQVV9FWENFUFRJT04sCisgICAgZVNJUl9SUEVfRVhDRVBUSU9OLAorICAgIGVTSVJfVFBFX0VYQ0VQVElPTiwKKyAgICBlU0lSX0RYRV9FWENFUFRJT04sCisgICAgZVNJUl9SWFBfRVhDRVBUSU9OLAorICAgIGVTSVJfTUNQVV9FWENFUFRJT04sCisgICAgZVNJUl9NQ1VfRVhDRVBUSU9OLAorICAgIGVTSVJfTVRVX0VYQ0VQVElPTiwKKyAgICBlU0lSX01JRl9FWENFUFRJT04sCisgICAgZVNJUl9GV19FWENFUFRJT04sCisgICAgZVNJUl9QU19NVVRFWF9SRUFEX0VYQ0VQVElPTiwKKyAgICBlU0lSX1BIWV9IQU5HX0VYQ0VQVElPTiwKKyAgICBlU0lSX01BSUxCT1hfU0FOSVRZX0NIS19GQUlMRUQsCisgICAgZVNJUl9SQURJT19IV19TV0lUQ0hfU1RBVFVTX0lTX09GRiwgLy8gT25seSB3aGVyZSB0aGlzIHN3aXRjaCBpcyBwcmVzZW50CisgICAgZVNJUl9DRkJfRkxBR19TVFVDS19FWENFUFRJT04sCisKKyAgICBlU0lSX1NNRV9CQVNJQ19SQVRFU19OT1RfU1VQUE9SVEVEX1NUQVRVUz0zMCwKKworICAgIGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUz01MDAsCisgICAgZVNJUl9TTUVfVU5FWFBFQ1RFRF9SRVFfUkVTVUxUX0NPREUsCisgICAgZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFLAorICAgIGVTSVJfU01FX1NDQU5fRkFJTEVELCAgIC8vIFVuYWJsZSB0byBmaW5kIGEgQnNzRGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyByZXF1ZXN0ZWQgc2NhbiBjcml0ZXJpYQorICAgIGVTSVJfU01FX0JTU19BTFJFQURZX1NUQVJURURfT1JfSk9JTkVELAorICAgIGVTSVJfU01FX0xPU1RfTElOS19XSVRIX1BFRVJfUkVTVUxUX0NPREUsCisgICAgZVNJUl9TTUVfUkVGVVNFRCwKKyAgICBlU0lSX1NNRV9KT0lOX1RJTUVPVVRfUkVTVUxUX0NPREUsCisgICAgZVNJUl9TTUVfQVVUSF9USU1FT1VUX1JFU1VMVF9DT0RFLAorICAgIGVTSVJfU01FX0FTU09DX1RJTUVPVVRfUkVTVUxUX0NPREUsCisgICAgZVNJUl9TTUVfUkVBU1NPQ19USU1FT1VUX1JFU1VMVF9DT0RFLAorICAgIGVTSVJfU01FX01BWF9OVU1fT0ZfUFJFX0FVVEhfUkVBQ0hFRCwKKyAgICBlU0lSX1NNRV9BVVRIX1JFRlVTRUQsCisgICAgZVNJUl9TTUVfSU5WQUxJRF9XRVBfREVGQVVMVF9LRVksCisgICAgZVNJUl9TTUVfTk9fS0VZX01BUFBJTkdfS0VZX0ZPUl9QRUVSLAorICAgIGVTSVJfU01FX0FTU09DX1JFRlVTRUQsCisgICAgZVNJUl9TTUVfUkVBU1NPQ19SRUZVU0VELAorICAgIGVTSVJfU01FX0RFQVVUSF9XSElMRV9KT0lOLCAvL1JlY2VpdmVkIERlYXV0aCB3aGlsZSBqb2luaW5nIG9yIHByZS1hdWh0ZW50aWNhdGlvbi4KKyAgICBlU0lSX1NNRV9ESVNBU1NPQ19XSElMRV9KT0lOLCAvL1JlY2VpdmVkIERpc2Fzc29jaWF0aW9uIHdoaWxlIGpvaW5pbmcuCisgICAgZVNJUl9TTUVfREVBVVRIX1dISUxFX1JFQVNTT0MsIC8vUmVjZWl2ZWQgRGVhdXRoIHdoaWxlIFJlQXNzb2NpYXRlLgorICAgIGVTSVJfU01FX0RJU0FTU09DX1dISUxFX1JFQVNTT0MsIC8vUmVjZWl2ZWQgRGlzYXNzb2NpYXRpb24gd2hpbGUgUmVBc3NvY2lhdGUKKyAgICBlU0lSX1NNRV9TVEFfTk9UX0FVVEhFTlRJQ0FURUQsCisgICAgZVNJUl9TTUVfU1RBX05PVF9BU1NPQ0lBVEVELAorICAgIGVTSVJfU01FX1NUQV9ESVNBU1NPQ0lBVEVELAorICAgIGVTSVJfU01FX0FMUkVBRFlfSk9JTkVEX0FfQlNTLAorICAgIGVTSVJfVUxBX0NPTVBMRVRFRCwKKyAgICBlU0lSX1VMQV9GQUlMVVJFLAorICAgIGVTSVJfU01FX0xJTktfRVNUQUJMSVNIRUQsCisgICAgZVNJUl9TTUVfVU5BQkxFX1RPX1BFUkZPUk1fTUVBU1VSRU1FTlRTLAorICAgIGVTSVJfU01FX1VOQUJMRV9UT19QRVJGT1JNX0RGUywKKyAgICBlU0lSX1NNRV9ERlNfRkFJTEVELAorICAgIGVTSVJfU01FX1RSQU5TRkVSX1NUQSwgLy8gVG8gYmUgdXNlZCB3aGVuIFNUQSBuZWVkIHRvIGJlIExCJ2VkCisgICAgZVNJUl9TTUVfSU5WQUxJRF9MSU5LX1RFU1RfUEFSQU1FVEVSUywvLyBHaXZlbiBpbiBMSU5LX1RFU1RfU1RBUlRfUlNQCisgICAgZVNJUl9TTUVfTElOS19URVNUX01BWF9FWENFRURFRCwgICAgLy8gR2l2ZW4gaW4gTElOS19URVNUX1NUQVJUX1JTUAorICAgIGVTSVJfU01FX1VOU1VQUE9SVEVEX1JBVEUsICAgICAgICAgIC8vIEdpdmVuIGluIExJTktfVEVTVF9SU1AgaWYgcGVlciBkb2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCByZXF1ZXN0ZWQgcmF0ZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExJTktfVEVTVF9SRVEKKyAgICBlU0lSX1NNRV9MSU5LX1RFU1RfVElNRU9VVCwgICAgICAgICAvLyBHaXZlbiBpbiBMSU5LX1RFU1RfSU5EIGlmIHBlZXIgZG9lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCByZXNwb25kIGJlZm9yZSBuZXh0IHRlc3QgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc2VudAorICAgIGVTSVJfU01FX0xJTktfVEVTVF9DT01QTEVURSwgICAgICAgIC8vIEdpdmVuIGluIExJTktfVEVTVF9JTkQgYXQgdGhlIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGxpbmsgdGVzdAorICAgIGVTSVJfU01FX0xJTktfVEVTVF9JTlZBTElEX1NUQVRFLCAgIC8vIEdpdmVuIGluIExJTktfVEVTVF9TVEFSVF9SU1AKKyAgICBlU0lSX1NNRV9MSU5LX1RFU1RfVEVSTUlOQVRFLCAgICAgICAvLyBHaXZlbiBpbiBMSU5LX1RFU1RfU1RBUlRfUlNQCisgICAgZVNJUl9TTUVfTElOS19URVNUX0lOVkFMSURfQUREUkVTUywgLy8gR2l2ZW4gaW4gTElOS19URVNUX1NUT1BfUlNQCisgICAgZVNJUl9TTUVfUE9MQVJJU19SRVNFVCwgICAgICAgICAgICAgLy8gR2l2ZW4gaW4gU01FX1NUT1BfQlNTX1JFUQorICAgIGVTSVJfU01FX1NFVENPTlRFWFRfRkFJTEVELCAgICAgICAgIC8vIEdpdmVuIGluIFNNRV9TRVRDT05URVhUX1JFUSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5hYmxlIHRvIHBsdW1iIGRvd24ga2V5cworICAgIGVTSVJfU01FX0JTU19SRVNUQVJULCAgICAgICAgICAgICAgIC8vIEdpdmVuIGluIFNNRV9TVE9QX0JTU19SRVEKKworICAgIGVTSVJfU01FX01PUkVfU0NBTl9SRVNVTFRTX0ZPTExPVywgIC8vIEdpdmVuIGluIFNNRV9TQ0FOX1JTUCBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBtb3JlIFNNRV9TQ0FOX1JTUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGFyZSBmb2xsb3dpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU01FX1NDQU5fUlNQIG1lc3NhZ2Ugd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVTSVJfU01FX1NVQ0NFU1Mgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZSBpcyB0aGUgbGFzdCBvbmUuCisgICAgZVNJUl9TTUVfSU5WQUxJRF9BU1NPQ19SU1BfUlhFRCwgICAgLy8gU2VudCBpbiBTTUVfSk9JTi9SRUFTU09DX1JTUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIHVwb24gcmVjZWl2aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCBSZS9Bc3NvYyBSc3AgZnJhbWUuCisgICAgZVNJUl9TTUVfTUlDX0NPVU5URVJfTUVBU1VSRVMsICAgICAgLy8gU1RPUCBCU1MgdHJpZ2dlcmVkIGJ5IE1JQyBmYWlsdXJlczogTUFDIHNvZnR3YXJlIHRvIGRpc2Fzc29jIGFsbCBzdGF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggTUlDX0ZBSUxVUkUgcmVhc29uIGNvZGUgYW5kIHBlcmZvcm0gdGhlIHN0b3AgYnNzIG9wZXJhdGlvbgorICAgIGVTSVJfU01FX0FERFRTX1JTUF9USU1FT1VULCAgICAgICAgIC8vIGRpZG4ndCBnZXQgcmVzcG9uc2UgZnJvbSBwZWVyIHdpdGhpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQgaW50ZXJ2YWwKKyAgICBlU0lSX1NNRV9BRERUU19SU1BfRkFJTEVELCAgICAgICAgICAvLyBkaWRuJ3QgZ2V0IHN1Y2Nlc3MgcmVzcG9uc2UgZnJvbSBIQUwKKyAgICBlU0lSX1NNRV9SRUNFSVZFRCwKKyAgICAvLyBUQkEgLSBUU1BFQyByZWxhdGVkIFJlc3VsdCBDb2RlcworCisgICAgZVNJUl9TTUVfQ0hBTk5FTF9TV0lUQ0hfRkFJTCwgICAgICAgIC8vIGZhaWxlZCB0byBzZW5kIG91dCBDaGFubmVsIFN3aXRjaCBBY3Rpb24gRnJhbWUKKyAgICBlU0lSX1NNRV9JTlZBTElEX1NUQV9ST0xFLAorICAgIGVTSVJfU01FX0lOVkFMSURfU1RBVEUsCisjaWZkZWYgR0VONF9TQ0FOCisgICAgZVNJUl9TTUVfQ0hBTk5FTF9TV0lUQ0hfRElTQUJMRUQsICAgIC8vIGVpdGhlciAxMWggaXMgZGlzYWJsZWQgb3IgY2hhbm5lbFN3aXRjaCBpcyBjdXJyZW50bHkgYWN0aXZlCisgICAgZVNJUl9TTUVfSEFMX1NDQU5fSU5JVF9GQUlMRUQsICAgICAgIC8vIFNJUl9IQUxfU0lSX0hBTF9JTklUX1NDQU5fUlNQIHJldHVybmVkIGZhaWxlZCBzdGF0dXMKKyAgICBlU0lSX1NNRV9IQUxfU0NBTl9TVEFSVF9GQUlMRUQsICAgICAgLy8gU0lSX0hBTF9TVEFSVF9TQ0FOX1JTUCByZXR1cm5lZCBmYWlsZWQgc3RhdHVzCisgICAgZVNJUl9TTUVfSEFMX1NDQU5fRU5EX0ZBSUxFRCwgICAgICAgIC8vIFNJUl9IQUxfRU5EX1NDQU5fUlNQIHJldHVybmVkIGZhaWxlZCBzdGF0dXMKKyAgICBlU0lSX1NNRV9IQUxfU0NBTl9GSU5JU0hfRkFJTEVELCAgICAgLy8gU0lSX0hBTF9GSU5JU0hfU0NBTl9SU1AgcmV0dXJuZWQgZmFpbGVkIHN0YXR1cworICAgIGVTSVJfU01FX0hBTF9TRU5EX01FU1NBR0VfRkFJTCwgICAgICAvLyBGYWlsZWQgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gSEFMCisjZWxzZSAvLyBHRU40X1NDQU4KKyAgICBlU0lSX1NNRV9DSEFOTkVMX1NXSVRDSF9ESVNBQkxFRCwgICAgLy8gZWl0aGVyIDExaCBpcyBkaXNhYmxlZCBvciBjaGFubmVsU3dpdGNoIGlzIGN1cnJlbnRseSBhY3RpdmUKKyAgICBlU0lSX1NNRV9IQUxfU0VORF9NRVNTQUdFX0ZBSUwsICAgICAgLy8gRmFpbGVkIHRvIHNlbmQgYSBtZXNzYWdlIHRvIEhBTAorI2VuZGlmIC8vIEdFTjRfU0NBTgorICAgIGVTSVJfU01FX1NUT1BfQlNTX0ZBSUxVUkUsICAgICAgICAgICAvLyBGYWlsZWQgdG8gc3RvcCB0aGUgYnNzCisgICAgZVNJUl9TTUVfU1RBX0FTU09DSUFURUQsCisgICAgZVNJUl9TTUVfSU5WQUxJRF9QTU1fU1RBVEUsCisgICAgZVNJUl9TTUVfQ0FOTk9UX0VOVEVSX0lNUFMsCisgICAgZVNJUl9TTUVfSU1QU19SRVFfRkFJTEVELAorICAgIGVTSVJfU01FX0JNUFNfUkVRX0ZBSUxFRCwKKyAgICBlU0lSX1NNRV9VQVBTRF9SRVFfRkFJTEVELAorICAgIGVTSVJfU01FX1dPV0xfRU5URVJfUkVRX0ZBSUxFRCwKKyAgICBlU0lSX1NNRV9XT1dMX0VYSVRfUkVRX0ZBSUxFRCwKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgZVNJUl9TTUVfRlRfUkVBU1NPQ19USU1FT1VUX0ZBSUxVUkUsCisgICAgZVNJUl9TTUVfRlRfUkVBU1NPQ19GQUlMVVJFLAorI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIGVTSVJfU01FX1NFTkRfQUNUSU9OX0ZBSUwsCisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworICAgIGVTSVJfU01FX1BDX0ZJTFRFUl9NQVRDSF9DT1VOVF9SRVFfRkFJTEVELAorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisgICAgCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisgICAgZVNJUl9TTUVfR1RLX09GRkxPQURfR0VUSU5GT19SRVFfRkFJTEVELAorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorICAgIGVTSVJfRE9OT1RfVVNFX1JFU1VMVF9DT0RFID0gU0lSX01BWF9FTlVNX1NJWkUgICAgCit9IHRTaXJSZXN1bHRDb2RlczsKKworLy8KKy8vIEVudW1lcmF0ZWQgY29uc3RhbnRzIHRvIGlkZW50aWZ5CisvLyAxKSB0aGUgb3BlcmF0aW5nIHN0YXRlIG9mIENoYW5uZWwgQm9uZGluZworLy8gMikgdGhlIHNlY29uZGFyeSBDQiBjaGFubmVsIHRvIGJlIHVzZWQKKy8vCit0eXBlZGVmIGVudW0gZUFuaUNCU2Vjb25kYXJ5TW9kZQoreworICAgIGVBTklfQ0JfU0VDT05EQVJZX05PTkUsCisgICAgZUFOSV9DQl9TRUNPTkRBUllfRE9XTiwKKyAgICBlQU5JX0NCX1NFQ09OREFSWV9VUCwKKyAgICBlQU5JX0RPTk9UX1VTRV9TRUNPTkRBUllfTU9ERSA9IFNJUl9NQVhfRU5VTV9TSVpFCit9IHRBbmlDQlNlY29uZGFyeU1vZGU7CisKKworCisKKy8qIGVhY2ggc3RhdGlvbiBhZGRlZCBoYXMgYSByYXRlIG1vZGUgd2hpY2ggc3BlY2lmaWVzIHRoZSBzdGEgYXR0cmlidXRlcyAqLwordHlwZWRlZiBlbnVtIGVTdGFSYXRlTW9kZSB7CisgICAgZVNUQV9UQVVSVVMgPSAwLAorICAgIGVTVEFfVElUQU4sCisgICAgZVNUQV9QT0xBUklTLAorICAgIGVTVEFfMTFiLAorICAgIGVTVEFfMTFiZywKKyAgICBlU1RBXzExYSwKKyAgICBlU1RBXzExbiwKKyAgICBlU1RBX0lOVkFMSURfUkFURV9NT0RFCit9IHRTdGFSYXRlTW9kZSwgKnRwU3RhUmF0ZU1vZGU7CisKKy8vYWx0aG91Z2ggaW4gdFNpclN1cHBvcnRlZFJhdGVzIGVhY2ggSUUgaXMgMTZiaXQgYnV0IFBFIG9ubHkgcGFzc2VzIElFcyBpbiA4IGJpdHMgd2l0aCBNU0I9MSBmb3IgYmFzaWMgcmF0ZXMuCisvL2NoYW5nZSB0aGUgbWFzayBmb3IgYml0MC03IG9ubHkgc28gSEFMIGdldHMgY29ycmVjdCBiYXNpYyByYXRlcyBmb3Igc2V0dGluZyByZXNwb25zZSByYXRlcy4KKyNkZWZpbmUgSUVSQVRFX0JBU0lDUkFURV9NQVNLICAgICAweDgwCisjZGVmaW5lIElFUkFURV9SQVRFX01BU0sgICAgICAgICAgMHg3ZgorI2RlZmluZSBJRVJBVEVfSVNfQkFTSUNSQVRFKHgpICAgKCh4KSAmIElFUkFURV9CQVNJQ1JBVEVfTUFTSykKKyNkZWZpbmUgQU5JRU5IQU5DRURfVEFVUlVTX1JBVEVNQVBfQklUT0ZGU0VUX1NUQVJUICAyOAorCit0eXBlZGVmIHN0cnVjdCBzU2lyU3VwcG9ydGVkUmF0ZXMgeworICAgIC8qCisgICAgKiBGb3IgU2VsZiBTVEEgRW50cnk6IHRoaXMgcmVwcmVzZW50cyBTZWxmIE1vZGUuCisgICAgKiBGb3IgUGVlciBTdGF0aW9ucywgdGhpcyByZXByZXNlbnRzIHRoZSBtb2RlIG9mIHRoZSBwZWVyLgorICAgICogT24gU3RhdGlvbjoKKyAgICAqIC0tdGhpcyBtb2RlIGlzIHVwZGF0ZWQgd2hlbiBQRSBhZGRzIHRoZSBTZWxmIEVudHJ5LgorICAgICogLS0gT1Igd2hlbiBQRSBzZW5kcyAnQUREX0JTUycgbWVzc2FnZSBhbmQgc3RhdGlvbiBjb250ZXh0IGluIEJTUyBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBtb2RlIG9mIHRoZSBBUC4KKyAgICAqIE9OIEFQOgorICAgICogLS0gdGhpcyBtb2RlIGlzIHVwZGF0ZWQgd2hlbiBQRSBzZW5kcyAnQUREX0JTUycgYW5kIFN0YSBlbnRyeSBmb3IgdGhhdCBCU1MgaXMgdXNlZAorICAgICogICAgIHRvIGluZGljYXRlIHRoZSBzZWxmIG1vZGUgb2YgdGhlIEFQLgorICAgICogLS0gT1Igd2hlbiBhIHN0YXRpb24gaXMgYXNzb2NpYXRlZCwgUEUgc2VuZHMgJ0FERF9TVEEnIG1lc3NhZ2Ugd2l0aCB0aGlzIG1vZGUgdXBkYXRlZC4KKyAgICAqLworCisgICAgdFN0YVJhdGVNb2RlICAgICAgICBvcFJhdGVNb2RlOworICAgIC8vIDExYiwgMTFhIGFuZCBhbmlMZWdhY3lSYXRlcyBhcmUgSUUgcmF0ZXMgd2hpY2ggZ2l2ZXMgcmF0ZSBpbiB1bml0IG9mIDUwMEticHMKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBsbGJSYXRlc1tTSVJfTlVNXzExQl9SQVRFU107CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgbGxhUmF0ZXNbU0lSX05VTV8xMUFfUkFURVNdOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIGFuaUxlZ2FjeVJhdGVzW1NJUl9OVU1fUE9MQVJJU19SQVRFU107CisKKyAgICAvL1RhdXJ1cyBvbmx5IHN1cHBvcnRzIDI2IFRpdGFuIFJhdGVzKG5vIEVTRi9jb25jYXQgUmF0ZXMgd2lsbCBiZSBzdXBwb3J0ZWQpCisgICAgLy9GaXJzdCAyNiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgdGhvc2UgVGl0YW4gcmF0ZXMgYW5kCisgICAgLy90aGUgbGFzdCA0IGJpdHMoYml0MjgtMzEpIGZvciBUYXVydXMsIDIoYml0MjYtMjcpIGJpdHMgYXJlIHJlc2VydmVkLgorICAgIHRBTklfVTMyICAgICAgICAgICAgIGFuaUVuaGFuY2VkUmF0ZUJpdG1hcDsgLy9UaXRhbiBhbmQgVGF1cnVzIFJhdGVzCisKKyAgICAvKgorICAgICogMC03NiBiaXRzIHVzZWQsIHJlbWFpbmluZyByZXNlcnZlZAorICAgICogYml0cyAwLTE1IGFuZCAzMiBzaG91bGQgYmUgc2V0LgorICAgICovCisgICAgdEFOSV9VOCBzdXBwb3J0ZWRNQ1NTZXRbU0lSX01BQ19NQVhfU1VQUE9SVEVEX01DU19TRVRdOworCisgICAgLyoKKyAgICAgKiBSWCBIaWdoZXN0IFN1cHBvcnRlZCBEYXRhIFJhdGUgZGVmaW5lcyB0aGUgaGlnaGVzdCBkYXRhCisgICAgICogcmF0ZSB0aGF0IHRoZSBTVEEgaXMgYWJsZSB0byByZWNlaXZlLCBpbiB1bml0ZXMgb2YgMU1icHMuCisgICAgICogVGhpcyB2YWx1ZSBpcyBkZXJpdmVkIGZyb20gIlN1cHBvcnRlZCBNQ1MgU2V0IGZpZWxkIiBpbnNpZGUKKyAgICAgKiB0aGUgSFQgY2FwYWJpbGl0eSBlbGVtZW50LgorICAgICAqLworICAgIHRBTklfVTE2IHJ4SGlnaGVzdERhdGFSYXRlOworCit9IHRTaXJTdXBwb3J0ZWRSYXRlcywgKnRwU2lyU3VwcG9ydGVkUmF0ZXM7CisKKwordHlwZWRlZiBlbnVtIGVTaXJSRkJhbmQKK3sKKyAgICBTSVJfQkFORF9VTktOT1dOLAorICAgIFNJUl9CQU5EXzJfNF9HSFosCisgICAgU0lSX0JBTkRfNV9HSFosCit9IHRTaXJSRkJhbmQ7CisKKworLyoKKyogU3BlY2lmaWVzIHdoaWNoIGJlYWNvbnMgYXJlIHRvIGJlIGluZGljYXRlZCB1cHRvIHRoZSBob3N0IGRyaXZlciB3aGVuCisqIFN0YXRpb24gaXMgaW4gcG93ZXIgc2F2ZSBtb2RlLgorKi8KK3R5cGVkZWYgZW51bSBlQmVhY29uRm9yd2FyZGluZworeworICAgIGVQTV9CRUFDT05fRldEX05USCwKKyAgICBlUE1fQkVBQ09OX0ZXRF9USU0sCisgICAgZVBNX0JFQUNPTl9GV0RfRFRJTSwKKyAgICBlUE1fQkVBQ09OX0ZXRF9OT05FCit9IHRCZWFjb25Gb3J3YXJkaW5nOworCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCit0eXBlZGVmIHN0cnVjdCBzU2lyUmVtYWluT25DaG5SZXEKK3sKKyAgICB0QU5JX1UxNiBtZXNzYWdlVHlwZTsKKyAgICB0QU5JX1UxNiBsZW5ndGg7CisgICAgdEFOSV9VOCBzZXNzaW9uSWQ7CisgICAgdFNpck1hY0FkZHIgc2VsZk1hY0FkZHI7CisgICAgdEFOSV9VOCAgY2huTnVtOworICAgIHRBTklfVTggIHBoeU1vZGU7CisgICAgdEFOSV9VMzIgZHVyYXRpb247CisgICAgdEFOSV9VOCAgcHJvYmVSc3BJZVsxXTsKK310U2lyUmVtYWluT25DaG5SZXEsICp0cFNpclJlbWFpbk9uQ2huUmVxOworCit0eXBlZGVmIHN0cnVjdCBzU2lyUmVnaXN0ZXJNZ210RnJhbWUKK3sKKyAgICB0QU5JX1UxNiBtZXNzYWdlVHlwZTsKKyAgICB0QU5JX1UxNiBsZW5ndGg7CisgICAgdEFOSV9VOCBzZXNzaW9uSWQ7CisgICAgdEFOSV9CT09MRUFOIHJlZ2lzdGVyRnJhbWU7CisgICAgdEFOSV9VMTYgZnJhbWVUeXBlOworICAgIHRBTklfVTE2IG1hdGNoTGVuOworICAgIHRBTklfVTggIG1hdGNoRGF0YVsxXTsKK310U2lyUmVnaXN0ZXJNZ210RnJhbWUsICp0cFNpclJlZ2lzdGVyTWdtdEZyYW1lOworI2VuZGlmCisKKy8vCisvLyBBIGJpdC1lbmNvZGluZywgaWRlbnRpZnlpbmcgdGhlIG5ldyBUSVRBTiBjYXBhYmlsaXRpZXMKKy8vIGFuZCBzdGF0ZSBpbmZvcm1hdGlvbi4gVGhlIGNhcGFiaWxpdGllcyBiZWluZyBleHBvc2VkCisvLyBhcmUgLQorLy8gQ29uY2F0ZW5hdGlvbgorLy8gQ29tcHJlc3Npb24KKy8vRklYTUVfQ0JNT0RFOiBuZWVkIHRvIHNlcGVyYXRlIG91dCBIVCBhbmQgVElUQU4gQ0IgbW9kZSBmaWVsZHMuCisvLyBDaGFubmVsIEJvbmRpbmcgLSBPbmx5IHRoaXMgZmlsZWQgaXMgdXNlZCBmb3IgSFQgYWxzby4gCisvLyBSZXZlcnNlIEZDUworLy8KKy8vIFRoZSBiaXRmaWVsZCBlbmNvZGluZyBpcyBhcyBmb2xsb3dzIC0KKy8vCisvLyAgYjcgIGI2ICAgYjUgICBiNCAgIGIzICAgYjIgICBiMSAgIGIwCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gfCBYIHwgWCB8Q0IvT3xDQi9PfENCL0F8UkZDU3wgQ1AgfCBDQyB8CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gd2hlcmUsCisvLyBDQyAgIC0gQ29uY2F0ZW5hdGlvbjogMSAtIE9OLCAwIC0gT0ZGCisvLyBDUCAgIC0gQ29tcHJlc3Npb246IDEgLSBPTiwgMCAtIE9GRgorLy8gUkZDUyAtIFJldmVyc2UgRkNTIFN1cHBvcnQ6IDEgLSBPTiwgMCAtIE9GRgorLy8gQ0IvQSAtIENoYW5uZWwgQm9uZGluZyAiQWRtaW4iIHN0YXRlOiAxIC0gT04sIDAgLSBPRkYKKy8vIENCL08gLSBDaGFubmVsIEJvbmRpbmcgIk9wZXIiIHN0YXRlOgorLy8gICAgICAgIDAwIC0gQ0IgT3BlciBzdGF0ZSBPRkYKKy8vICAgICAgICAwMSAtIENCIFNlY29uZGFyeSBjaGFubmVsIERPV04KKy8vICAgICAgICAxMCAtIENCIFNlY29uZGFyeSBjaGFubmVsIFVQCisvLyAgICAgICAgMTEgLSBSZXNlcnZlZAorLy8gWCAgICAtIERvbid0IGNhcmUKKy8vCisvLyBUaGlzIGVudW1lcmF0ZWQgZGF0YSB0eXBlIGlzIHVzZWQgZm9yIElQQyBiZXR3ZWVuIHRoZQorLy8gTElNIGFuZCBTTUUgKFdTTS9IREQpIGZvciB0aGUgZm9sbG93aW5nIG5vcnRoYm91bmQKKy8vIGludGVyZmFjZXMgLQorLy8gTElNIC0+IFdTTQorLy8gdFNpck5laWdoYm9yQnNzSW5mbywKKy8vIHRTaXJTbWVBc3NvY0luZCwKKy8vIHRTaXJTbWVSZWFzc29jSW5kCisvLworLy8gTElNIC0+IEhERC9Sb2FtaW5nCisvLyB0U2lyQnNzRGVzY3JpcHRpb24KKy8vCit0eXBlZGVmIHRBTklfVTggdEFuaVRpdGFuSHRDYXBhYmlsaXR5SW5mbzsKKworLy8KKy8vIElkZW50aWZpZXMgdGhlIG5laWdoYm9yIEJTUycgdGhhdCB3YXMod2VyZSkgZGV0ZWN0ZWQKKy8vIGJ5IGFuIFNUQSBhbmQgcmVwb3J0ZWQgdG8gdGhlIEFQCisvLwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVRpdGFuQ0JOZWlnaGJvckluZm8KK3sKKyAgLy8gQSBCU1Mgd2FzIGZvdW5kIG9uIHRoZSBQcmltYXJ5CisgIHRBTklfVTggY2JCc3NGb3VuZFByaTsKKworICAvLyBBIEJTUyB3YXMgZm91bmQgb24gdGhlIGFkamFjZW50IFVwcGVyIFNlY29uZGFyeQorICB0QU5JX1U4IGNiQnNzRm91bmRTZWNVcDsKKworICAvLyBBIEJTUyB3YXMgZm91bmQgb24gdGhlIGFkamFjZW50IExvd2VyIFNlY29uZGFyeQorICB0QU5JX1U4IGNiQnNzRm91bmRTZWNEb3duOworCit9IHRBbmlUaXRhbkNCTmVpZ2hib3JJbmZvLCAqdHBBbmlUaXRhbkNCTmVpZ2hib3JJbmZvOworCisvLworLy8gTUFDUk8ncyB0byBleHRyYWN0IGluZm8gZnJvbSB0QW5pVGl0YW5IdENhcGFiaWxpdHlJbmZvCisvLworI2RlZmluZSBTTUVfR0VUX0NPTkNBVF9TVEFURSh0aXRhbkh0Q2FwcykgXAorICAgICAgICAodGl0YW5IdENhcHMgJiAweDAxKQorI2RlZmluZSBTTUVfU0VUX0NPTkNBVF9TVEFURSh0aXRhbkh0Q2FwcyxzdGF0ZSkgXAorICAgICAgICAoKChzdGF0ZSkgPT0gZUhBTF9DTEVBUik/IFwKKyAgICAgICAgICAoKHRpdGFuSHRDYXBzKSA9ICh0aXRhbkh0Q2FwcykgJiAoMHgzRSkpOiBcCisgICAgICAgICAgKCh0aXRhbkh0Q2FwcykgPSAodGl0YW5IdENhcHMpIHwgKDB4MDEpKSkKKworI2RlZmluZSBTTUVfR0VUX0NPTVBSRVNTSU9OX1NUQVRFKHRpdGFuSHRDYXBzKSBcCisgICAgICAgICgodGl0YW5IdENhcHMgJiAweDAyKSA+PiAxKQorI2RlZmluZSBTTUVfU0VUX0NPTVBSRVNTSU9OX1NUQVRFKHRpdGFuSHRDYXBzLHN0YXRlKSBcCisgICAgICAgICgoKHN0YXRlKSA9PSBlSEFMX0NMRUFSKT8gXAorICAgICAgICAgICgodGl0YW5IdENhcHMpID0gKHRpdGFuSHRDYXBzKSAmICgweDNEKSk6IFwKKyAgICAgICAgICAoKHRpdGFuSHRDYXBzKSA9ICh0aXRhbkh0Q2FwcykgfCAoMHgwMikpKQorCisjZGVmaW5lIFNNRV9HRVRfUkZDU19TVEFURSh0aXRhbkh0Q2FwcykgXAorICAgICAgICAoKHRpdGFuSHRDYXBzICYgMHgwNCkgPj4gMikKKyNkZWZpbmUgU01FX1NFVF9SRkNTX1NUQVRFKHRpdGFuSHRDYXBzLHN0YXRlKSBcCisgICAgICAgICgoKHN0YXRlKSA9PSBlSEFMX0NMRUFSKT8gXAorICAgICAgICAgICgodGl0YW5IdENhcHMpID0gKHRpdGFuSHRDYXBzKSAmICgweDNCKSk6IFwKKyAgICAgICAgICAoKHRpdGFuSHRDYXBzKSA9ICh0aXRhbkh0Q2FwcykgfCAoMHgwNCkpKQorCisjZGVmaW5lIFNNRV9HRVRfQ0JfQURNSU5fU1RBVEUodGl0YW5IdENhcHMpIFwKKyAgICAgICAgKCh0aXRhbkh0Q2FwcyAmIDB4MDgpID4+IDMpCisjZGVmaW5lIFNNRV9TRVRfQ0JfQURNSU5fU1RBVEUodGl0YW5IdENhcHMsc3RhdGUpIFwKKyAgICAgICAgKCgoc3RhdGUpID09IGVIQUxfQ0xFQVIpPyBcCisgICAgICAgICAgKCh0aXRhbkh0Q2FwcykgPSAodGl0YW5IdENhcHMpICYgKDB4MzcpKTogXAorICAgICAgICAgICgodGl0YW5IdENhcHMpID0gKHRpdGFuSHRDYXBzKSB8ICgweDA4KSkpCisKKy8vIE5PVEUgLSBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBNQUNSTywgU01FX0dFVF9DQl9PUEVSX1NUQVRFLAorLy8gY2FuIGJlIHVzZWQgYWxvbmcgd2l0aCB0aGUgZW51bWVyYXRlZCB0eXBlLAorLy8gdEFuaUNCU2Vjb25kYXJ5TW9kZSwgdG8gaWRlbnRpZnkgdGhlIEFkbWluL09wZXIgc3RhdGUgb2YgQ0IKKyNkZWZpbmUgU01FX0dFVF9DQl9PUEVSX1NUQVRFKHRpdGFuSHRDYXBzKSBcCisgICAgICAgICgodGl0YW5IdENhcHMgJiAweDMwKSA+PiA0KQorI2RlZmluZSBTTUVfU0VUX0NCX09QRVJfU1RBVEUodGl0YW5IdENhcHMsc3RhdGUpIFwKKyAgICAgICAgKCh0aXRhbkh0Q2FwcykgPSAodEFOSV9VOCkoKCh0aXRhbkh0Q2FwcykgJiAoMHgwRikpIHwgKChzdGF0ZSkgPDwgNCkpKQorCisvLy8gR2VuZXJpYyB0eXBlIGZvciBzZW5kaW5nIGEgcmVzcG9uc2UgbWVzc2FnZQorLy8vIHdpdGggcmVzdWx0IGNvZGUgdG8gaG9zdCBzb2Z0d2FyZQordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVJzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV8qX1JTUAorICAgIHRBTklfVTE2ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBzZXNzaW9uSWQ7ICAvLyBUbyBzdXBwb3J0IEJULUFNUAorICAgIHRBTklfVTE2ICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAgLy8gVG8gc3VwcG9ydCBCVC1BTVAKKyAgICB0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZTsKK30gdFNpclNtZVJzcCwgKnRwU2lyU21lUnNwOworCisvLy8gRGVmaW5pdGlvbiBmb3Iga2ljayBzdGFydGluZyBGaXJtd2FyZSBvbiBTVEEKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTdGFydFJlcQoreworICAgIHRBTklfVTE2ICAgbWVzc2FnZVR5cGU7ICAgICAgLy8gZVdOSV9TTUVfU1RBUlRfUkVRCisgICAgdEFOSV9VMTYgICBsZW5ndGg7ICAgIAorICAgIHRBTklfVTggICAgICBzZXNzaW9uSWQ7ICAgICAgLy9BZGRlZCBmb3IgQlQtQU1QIFN1cHBvcnQKKyAgICB0QU5JX1UxNiAgICAgdHJhbnNjYXRpb25JZDsgIC8vQWRkZWQgZm9yIEJULUFNUCBTdXBwb3J0CisgICAgdFNpck1hY0FkZHIgIGJzc0lkOyAgICAgICAgICAvL0FkZGVkIEZvciBCVC1BTVAgU3VwcG9ydCAgIAorICAgIHRBTklfVTMyICAgcm9hbWluZ0F0UG9sYXJpczsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBXTEFOX1NUQSkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICB0QU5JX1UzMiAgIHNlbmROZXdCc3NJbmQ7CisjZW5kaWYKK30gdFNpclNtZVN0YXJ0UmVxLCAqdHBTaXJTbWVTdGFydFJlcTsKKworLy8vIERlZmluaXRpb24gZm9yIGluZGljYXRpbmcgYWxsIG1vZHVsZXMgcmVhZHkgb24gU1RBCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lUmVhZHlSZXEKK3sKKyAgICB0QU5JX1UxNiAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9TWVNfUkVBRFlfSU5ECisgICAgdEFOSV9VMTYgICBsZW5ndGg7CisgICAgdEFOSV9VMTYgICB0cmFuc2FjdGlvbklkOyAgICAgCit9IHRTaXJTbWVSZWFkeVJlcSwgKnRwU2lyU21lUmVhZHlSZXE7CisKKy8vLyBEZWZpbml0aW9uIGZvciByZXNwb25zZSBtZXNzYWdlIHRvIHByZXZpb3VzbHkgaXNzdWVkIHN0YXJ0IHJlcXVlc3QKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTdGFydFJzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9TVEFSVF9SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBsZW5ndGg7CisgICAgdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgICAgIAorfSB0U2lyU21lU3RhcnRSc3AsICp0cFNpclNtZVN0YXJ0UnNwOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorLyoqCisgKiBUcmlnZ2VyIFR5cGUKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICAvLyBEdXJpbmcgSW5pdGlhbGl6YXRpb24gYW5kIE5NIHRyaWdnZXJzIG9ubHkKKyAgICBlU0lSX1RSSUdHRVJfSU5JVF9OTSwKKworICAgIC8vIER1cmluZyBJbml0aWFsaXphdGlvbiwgTk0gdHJpZ2dlcnMgYW5kIFBlcmlvZGljIGV2YWx1YXRpb24KKyAgICBlU0lSX1RSSUdHRVJfSU5JVF9OTV9QRVJJT0RJQworfXRTaXJEZnNUcmlnVHlwZTsKKyNlbmRpZgorCisvLy8gRGVmaW5pdGlvbiBmb3IgTG9hZCBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IHNTaXJMb2FkCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgbnVtU3RhczsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBjaGFubmVsVXRpbGl6YXRpb247Cit9IHRTaXJMb2FkLCAqdHBTaXJMb2FkOworCisvLy8gQlNTIHR5cGUgZW51bSB1c2VkIGluIHdoaWxlIHNjYW5uaW5nL2pvaW5pbmcgZXRjCit0eXBlZGVmIGVudW0gZVNpckJzc1R5cGUKK3sKKyAgICBlU0lSX0lORlJBU1RSVUNUVVJFX01PREUsCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGVTSVJfSU5GUkFfQVBfTU9ERSwgICAgICAgICAgICAgICAgICAgIC8vQWRkZWQgZm9yIHNvZnRBUCBzdXBwb3J0CisjZW5kaWYKKyAgICBlU0lSX0lCU1NfTU9ERSwKKyAgICBlU0lSX0JUQU1QX1NUQV9NT0RFLCAgICAgICAgICAgICAgICAgICAgIC8vQWRkZWQgZm9yIEJULUFNUCBzdXBwb3J0CisgICAgZVNJUl9CVEFNUF9BUF9NT0RFLCAgICAgICAgICAgICAgICAgICAgIC8vQWRkZWQgZm9yIEJULUFNUCBzdXBwb3J0CisgICAgZVNJUl9BVVRPX01PREUsCisgICAgZVNJUl9ET05PVF9VU0VfQlNTX1RZUEUgPSBTSVJfTUFYX0VOVU1fU0laRQorfSB0U2lyQnNzVHlwZTsKKworLy8vIERlZmluaXRpb24gZm9yIFdEUyBJbmZvcm1hdGlvbgordHlwZWRlZiBzdHJ1Y3Qgc1Npcldkc0luZm8KK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICB3ZHNMZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgd2RzQnl0ZXNbQU5JX1dEU19JTkZPX01BWF9MRU5HVEhdOworfSB0U2lyV2RzSW5mbywgKnRwU2lyV2RzSW5mbzsKKworLy8vIFBvd2VyIENhcGFiaWxpdHkgaW5mbyB1c2VkIGluIDExSAordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1Bvd2VyQ2FwSW5mbworeworICAgIHRBTklfVTggICAgICAgICAgICAgIG1pblR4UG93ZXI7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgbWF4VHhQb3dlcjsKK30gdFNpck1hY1Bvd2VyQ2FwSW5mbywgKnRwU2lyTWFjUG93ZXJDYXBJbmZvOworCisvLy8gU3VwcG9ydGVkIENoYW5uZWwgaW5mbyB1c2VkIGluIDExSAordHlwZWRlZiBzdHJ1Y3Qgc1NpclN1cENobmwKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBudW1DaG5sOworICAgIHRBTklfVTggICAgICAgICAgICAgIGNoYW5uZWxMaXN0W1NJUl9NQVhfU1VQUE9SVEVEX0NIQU5ORUxfTElTVF07Cit9IHRTaXJTdXBDaG5sLCAqdHBTaXJTdXBDaG5sOworCit0eXBlZGVmIGVudW0gZVNpck53VHlwZQoreworICAgIGVTSVJfMTFBX05XX1RZUEUsCisgICAgZVNJUl8xMUJfTldfVFlQRSwKKyAgICBlU0lSXzExR19OV19UWVBFLAorICAgIGVTSVJfMTFOX05XX1RZUEUsCisgICAgZVNJUl9ET05PVF9VU0VfTldfVFlQRSA9IFNJUl9NQVhfRU5VTV9TSVpFCit9IHRTaXJOd1R5cGU7CisKKy8vLyBEZWZpbml0aW9uIGZvciBuZXcgaUJzcyBwZWVyIGluZm8KK3R5cGVkZWYgc3RydWN0IHNTaXJOZXdJYnNzUGVlckluZm8KK3sKKyAgICB0U2lyTWFjQWRkciAgICBwZWVyQWRkcjsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGFpZDsKK30gdFNpck5ld0lic3NQZWVySW5mbywgKnRwU2lyTmV3SWJzc1BlZXJJbmZvOworCisvLy8gRGVmaW5pdGlvbiBmb3IgQWx0ZXJuYXRlIEJTUyBpbmZvCit0eXBlZGVmIHN0cnVjdCBzU2lyQWx0ZXJuYXRlUmFkaW9JbmZvCit7CisgICAgdFNpck1hY0FkZHIgICAgYnNzSWQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBjaGFubmVsSWQ7Cit9IHRTaXJBbHRlcm5hdGVSYWRpb0luZm8sICp0cFNpckFsdGVybmF0ZVJhZGlvSW5mbzsKKworLy8vIERlZmluaXRpb24gZm9yIEFsdGVybmF0ZSBCU1MgbGlzdAordHlwZWRlZiBzdHJ1Y3Qgc1NpckFsdGVybmF0ZVJhZGlvTGlzdAoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgIG51bUJzczsKKyAgICB0U2lyQWx0ZXJuYXRlUmFkaW9JbmZvICAgYWx0ZXJuYXRlUmFkaW9bMV07Cit9IHRTaXJBbHRlcm5hdGVSYWRpb0xpc3QsICp0cFNpckFsdGVybmF0ZVJhZGlvTGlzdDsKKworLy8vIERlZmluaXRpb24gZm9yIGtpY2sgc3RhcnRpbmcgQlNTCisvLy8gLS0tPiBNQUMKKy8qKgorICogVXNhZ2Ugb2Ygc3NJZCwgbnVtU1NJRCAmIHNzSWRMaXN0OgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAxLiBzc0lkLmxlbmd0aCBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IEJyb2FkY2FzdC9TdXBwcmVzcyBTU0lECisgKiAgICBmZWF0dXJlIGlzIGVuYWJsZWQuCisgKiAyLiBJZiBzc0lkLmxlbmd0aCBpcyB6ZXJvLCBNQUMgU1cgd2lsbCBhZHZlcnRpc2UgTlVMTCBTU0lECisgKiAgICBhbmQgaW50ZXJwcmV0IHRoZSBTU0lEIGxpc3QgZnJvbSBudW1TU0lEICYgc3NJZExpc3QuCisgKiAzLiBJZiBzc0lkLmxlbmd0aCBpcyBub24temVybywgTUFDIFNXIHdpbGwgYWR2ZXJ0aXNlIHRoZSBTU0lECisgKiAgICBzcGVjaWZpZWQgaW4gdGhlIHNzSWQgZmllbGQgYW5kIGl0IGlzIGV4cGVjdGVkIHRoYXQKKyAqICAgIGFwcGxpY2F0aW9uIHdpbGwgc2V0IG51bVNTSUQgdG8gb25lIChvbmx5IG9uZSBTU0lEIHByZXNlbnQKKyAqICAgIGluIHRoZSBsaXN0KSBhbmQgU1NJRCBpbiB0aGUgbGlzdCBpcyBzYW1lIGFzIHNzSWQgZmllbGQuCisgKiA0LiBBcHBsaWNhdGlvbiB3aWxsIGFsd2F5cyBzZXQgbnVtU1NJRCA+PSAxLgorICovCisvLyoqKioqTk9URTogUGxlYXNlIG1ha2Ugc3VyZSBhbGwgY29kZXMgYXJlIHVwZGF0ZWQgaWYgaW5zZXJ0aW5nIGZpZWxkIGludG8gdGhpcyBzdHJ1Y3R1cmUuLioqKioqKioqKioKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTdGFydEJzc1JlcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAgICAgICAvLyBlV05JX1NNRV9TVEFSVF9CU1NfUkVRCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNlc3Npb25JZDsgICAgICAgLy9BZGRlZCBmb3IgQlQtQU1QIFN1cHBvcnQKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAgIC8vQWRkZWQgZm9yIEJULUFNUCBTdXBwb3J0CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgYnNzSWQ7ICAgICAgICAgICAvL0FkZGVkIGZvciBCVC1BTVAgU3VwcG9ydAorICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgIHNlbGZNYWNBZGRyOyAgICAgLy9BZGRlZCBmb3IgQlQtQU1QIFN1cHBvcnQKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBiZWFjb25JbnRlcnZhbDsgIC8vQWRkZWQgZm9yIEJULUFNUCBTdXBwb3J0CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgZG90MTFtb2RlOworICAgIHRTaXJCc3NUeXBlICAgICAgICAgICAgIGJzc1R5cGU7CisgICAgdFNpck1hY1NTaWQgICAgICAgICAgICAgc3NJZDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBjaGFubmVsSWQ7CisgICAgdEFuaUNCU2Vjb25kYXJ5TW9kZSAgICAgY2JNb2RlOworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0U2lyQWx0ZXJuYXRlUmFkaW9MaXN0ICBhbHRlcm5hdGVSYWRpb0xpc3Q7CisgICAgdEFOSV9TOCAgICAgICAgICAgICAgICAgcG93ZXJMZXZlbDsKKyAgICB0U2lyV2RzSW5mbyAgICAgICAgICAgICB3ZHNJbmZvOworI2VuZGlmCisgICAgCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHByaXZhY3k7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgYXBVYXBzZEVuYWJsZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBzc2lkSGlkZGVuOworICAgIHRBTklfQk9PTEVBTiAgICAgICAgICAgIGZ3ZFdQU1BCQ1Byb2JlUmVxOworICAgIHRBTklfQk9PTEVBTiAgICAgICAgICAgIHByb3RFbmFibGVkOworICAgIHRBTklfQk9PTEVBTiAgICAgICAgICAgIG9ic3NQcm90RW5hYmxlZDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBodF9jYXBhYjsKKyAgICB0QW5pQXV0aFR5cGUgICAgICAgICAgICBhdXRoVHlwZTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBkdGltUGVyaW9kOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHdwc19zdGF0ZTsKKyNlbmRpZgorICAgIHRWT1NfQ09OX01PREUgICAgICAgICAgIGJzc1BlcnNvbmE7CisKKyAgICB0U2lyUlNOaWUgICAgICAgICAgICAgICByc25JRTsgICAgICAgICAgICAgLy8gUlNOIElFIHRvIGJlIHNlbnQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmVhY29uIGFuZCBQcm9iZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBmcmFtZXMKKyAgICB0U2lyTndUeXBlICAgICAgICAgICAgICBud1R5cGU7ICAgICAgICAgICAgLy8gSW5kaWNhdGVzIDExYS9iL2cKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgICBvcGVyYXRpb25hbFJhdGVTZXQ7Ly8gSGFzIDExYSBvciAxMWIgcmF0ZXMKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgICBleHRlbmRlZFJhdGVTZXQ7ICAgIC8vIEhhcyAxMWcgcmF0ZXMKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBudW1TU0lEOworICAgIHRTaXJNYWNTU2lkICAgICAgICAgICAgIHNzSWRMaXN0W0FOSV9NQVhfTlVNX09GX1NTSURTXTsKKyNlbmRpZgorfSB0U2lyU21lU3RhcnRCc3NSZXEsICp0cFNpclNtZVN0YXJ0QnNzUmVxOworCisjZGVmaW5lIEdFVF9JRV9MRU5fSU5fQlNTKGxlbkluQnNzKSAoIGxlbkluQnNzICsgc2l6ZW9mKGxlbkluQnNzKSAtIFwKKyAgICAgICAgICAgICAgKChpbnQpIE9GRlNFVF9PRiggdFNpckJzc0Rlc2NyaXB0aW9uLCBpZUZpZWxkcykpKQorCisjZGVmaW5lIFdTQ0lFX1BST0JFX1JTUF9MRU4gKDMxNyArIDIpCisKK3R5cGVkZWYgc3RydWN0IHNTaXJCc3NEZXNjcmlwdGlvbgoreworICAgIC8vb2Zmc2V0IG9mIHRoZSBpZUZpZWxkcyBmcm9tIGJzc0lkLgorICAgIHRBTklfVTE2ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICBic3NJZDsKKyAgICB2X1RJTUVfdCAgICAgICAgICAgICBzY2FuU3lzVGltZU1zZWM7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgdGltZVN0YW1wWzJdOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIGJlYWNvbkludGVydmFsOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIGNhcGFiaWxpdHlJbmZvOworICAgIHRTaXJOd1R5cGUgICAgICAgICAgIG53VHlwZTsgLy8gSW5kaWNhdGVzIDExYS9iL2cKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBhbmlJbmRpY2F0b3I7CisgICAgdEFOSV9TOCAgICAgICAgICAgICAgcnNzaTsKKyAgICB0QU5JX1M4ICAgICAgICAgICAgICBzaW5yOworICAgIC8vY2hhbm5lbElkIHdoYXQgcGVlciBzZW50IGluIGJlYWNvbi9wcm9iZXJzcC4KKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBjaGFubmVsSWQ7CisgICAgLy9jaGFubmVsSWQgb24gd2hpY2ggd2UgYXJlIHBhcmtlZCBhdC4KKyAgICAvL3VzZWQgb25seSBpbiBzY2FuIGNhc2UuCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgY2hhbm5lbElkU2VsZjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBzU2lyQnNzRGVzY3JpcHRpb25Sc3ZkWzNdOworICAgIC8vCisgICAgLy8gRklYTUUgLSBUaGlzIHN0cnVjdHVyZSBpcyBub3QgcGFja2VkIQorICAgIC8vIFRodXMsIHRoZSBmaWVsZHMgc2hvdWxkIGJlIGFsaWduZWQgYXQgRFdPUkQgYm91bmRhcmllcworICAgIC8vIEVsc2V3aGVyZSwgdGl0YW5IdENhcHMgaXMgb2YgdHlwZSB0QW5pVGl0YW5IdENhcGFiaWxpdHlJbmZvCisgICAgLy8KKyAgICB0QU5JX1UzMiAgICAgICAgICAgICB0aXRhbkh0Q2FwczsKKyAgICB0QU5JX1RJTUVTVEFNUCBuUmVjZWl2ZWRUaW1lOyAgICAgLy9iYXNlIG9uIGEgdGljayBjb3VudC4gSXQgaXMgYSB0aW1lIHN0YW1wLCBub3QgYSByZWxhdGl2ZSB0aW1lLgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIHRBTklfVTMyICAgICAgIHBhcmVudFRTRjsKKyAgICB0QU5JX1UzMiAgICAgICBzdGFydFRTRlsyXTsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgbWRpZVByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgbWRpZVtTSVJfTURJRV9TSVpFXTsgICAgICAgICAgICAgICAgLy8gTURJRSBmb3IgMTFyLCBwaWNrZWQgZnJvbSB0aGUgYmVhY29ucworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIHRBTklfVTE2ICAgICAgICAgICAgIFFCU1NMb2FkX3ByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgUUJTU0xvYWRfYXZhaWw7IAorI2VuZGlmCisgICAgLy8gUGxlYXNlIGtlZXAgdGhlIHN0cnVjdHVyZSA0IGJ5dGVzIGFsaWduZWQgYWJvdmUgdGhlIGllRmllbGRzCisKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBmUHJvYmVSc3A7IC8vd2hldGhlciBpdCBpcyBmcm9tIGEgcHJvYmUgcnNwCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgV3NjSWVMZW47CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgV3NjSWVQcm9iZVJzcFtXU0NJRV9QUk9CRV9SU1BfTEVOXTsKKworICAgIHRBTklfVTMyICAgICAgICAgICAgIGllRmllbGRzWzFdOworfSB0U2lyQnNzRGVzY3JpcHRpb24sICp0cFNpckJzc0Rlc2NyaXB0aW9uOworCisvLy8gRGVmaW5pdGlvbiBmb3IgcmVzcG9uc2UgbWVzc2FnZSB0byBwcmV2aW91c2x5CisvLy8gaXNzdWVkIHN0YXJ0IEJTUyByZXF1ZXN0CisvLy8gTUFDIC0tLT4KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTdGFydEJzc1JzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1NUQVJUX0JTU19SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHNlc3Npb25JZDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7Ly90cmFuc2FjdGlvbiBJRCBmb3IgY21kCisgICAgdFNpclJlc3VsdENvZGVzICAgICBzdGF0dXNDb2RlOworICAgIHRTaXJCc3NUeXBlICAgICAgICAgYnNzVHlwZTsvL0FkZCBuZXcgdHlwZSBmb3IgV0RTIG1vZGUKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGJlYWNvbkludGVydmFsOy8vQmVhY29uIEludGVydmFsIGZvciBib3RoIHR5cGUKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIHN0YUlkOy8vU3RhaW9uIElEIGZvciBTZWxmICAKKyAgICB0U2lyQnNzRGVzY3JpcHRpb24gIGJzc0Rlc2NyaXB0aW9uOy8vUGVlciBCU1MgZGVzY3JpcHRpb24KK30gdFNpclNtZVN0YXJ0QnNzUnNwLCAqdHBTaXJTbWVTdGFydEJzc1JzcDsKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKK3R5cGVkZWYgc3RydWN0IHNTaXJNZWFzQ29udHJvbAoreworICAgIC8vIFBlcmlvZGljIE1lYXN1cmVtZW50cyBlbmFibGVkIGZsYWcKKyAgICB0QW5pQm9vbCAgICAgICAgICAgICBwZXJpb2RpY01lYXNFbmFibGVkOworICAgIC8vIEluZGljYXRlcyB3aGV0aGVyIHRvIGludm9sdmUgU1RBcyBpbiBtZWFzdXJlbWVudHMgb3Igbm90CisgICAgdEFuaUJvb2wgICAgICAgICAgICAgaW52b2x2ZVNUQXM7CisgICAgLy8gQmFzaWMgb3IgZW5oYW5jZWQgbWVhc3VyZW1lbnQgbWV0cmljcworICAgIC8vIDAgLSBmb3IgYmFzaWMsIDEgLSBmb3IgZW5oYW5jZWQKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIG1ldHJpY3NUeXBlOworICAgIC8vIEluZGljYXRlcyBhY3RpdmUgb3IgcGFzc2l2ZSBzY2FubmluZworICAgIHRTaXJTY2FuVHlwZSAgICAgICAgIHNjYW5UeXBlOworICAgIC8vIEZvbGxvd2luZyBpbmRpY2F0ZXMgaG93IG9mdGVuIG1lYXN1cmVtZW50cworICAgIC8vIG9uIGVhY2ggY2hhbm5lbCBhcmUgbWFkZSBmb3IgbG9uZy1zY2FuLWR1cmF0aW9uCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBsb25nQ2hhbm5lbFNjYW5QZXJpb2RpY2l0eTsKKyAgICAvLworICAgIC8vIENoYW5uZWwgQm9uZGluZyBwbHVzIDExSCByZWxhdGVkIHNjYW4gY29udHJvbAorICAgIC8vIDAgLSBDQiBhbmQvb3IgMTFIIGlzIGRpc2FibGVkCisgICAgLy8gMSAtIENCIGFuZCAxMUggaXMgZW5hYmxlZAorICAgIC8vCisgICAgdEFOSV9CT09MRUFOICAgIGNiMTFoRW5hYmxlZDsKK30gdFNpck1lYXNDb250cm9sLCAqdHBTaXJNZWFzQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npck1lYXNEdXJhdGlvbgoreworICAgIC8vIEZvbGxvd2luZyBpbmRpY2F0ZXMgdGltZSBkdXJhdGlvbiBvdmVyIHdoaWNoCisgICAgLy8gYWxsIGNoYW5uZWxzIGluIHRoZSBjaGFubmVsTGlzdCB0byBiZSBtZWFzdXJlZCBvbmNlCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICBzaG9ydFRlcm1QZXJpb2Q7CisgICAgLy8gRm9sbG93aW5nIGluZGljYXRlcyB0aW1lIGR1cmF0aW9uIG92ZXIgd2hpY2gKKyAgICAvLyBjYWNoZWQgREZTIG1lYXN1cmVtZW50cyBhcmUgYXZlcmFnZWQKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgIGF2ZXJhZ2luZ1BlcmlvZDsKKyAgICAvLyBGb2xsb3dpbmcgaW5kaWNhdGVzIHRpbWUgZHVyYXRpb24gZm9yIG1ha2luZworICAgIC8vIERGUyBtZWFzdXJlbWVudHMgb24gZWFjaCBjaGFubmVsCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICBzaG9ydENoYW5uZWxTY2FuRHVyYXRpb247CisgICAgLy8gRm9sbG93aW5nIGluZGljYXRlcyB0aW1lIGR1cmF0aW9uIGZvciBtYWtpbmcKKyAgICAvLyBERlMgbWVhc3VyZW1lbnRzIG9uIGVhY2ggY2hhbm5lbCBmb3IgbG9uZyB0ZXJtIG1lYXN1cmVtZW50cworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgbG9uZ0NoYW5uZWxTY2FuRHVyYXRpb247Cit9IHRTaXJNZWFzRHVyYXRpb24sICp0cFNpck1lYXNEdXJhdGlvbjsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzU2lyQ2hhbm5lbExpc3QKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgIG51bUNoYW5uZWxzOworICAgIHRBTklfVTggICAgICAgICAgY2hhbm5lbE51bWJlclsxXTsKK30gdFNpckNoYW5uZWxMaXN0LCAqdHBTaXJDaGFubmVsTGlzdDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKK3R5cGVkZWYgc3RydWN0IHNUc3BlY0luZm8geworICAgIHRBTklfVTggICAgICAgICB2YWxpZDsKKyAgICB0U2lyTWFjVHNwZWNJRSAgdHNwZWM7Cit9IHRUc3BlY0luZm87CisKKyNkZWZpbmUgU0lSX0NDWF9NQVhfVFNQRUNfSUVTICAgNAordHlwZWRlZiBzdHJ1Y3Qgc0NDWFRzcGVjVHNwZWNJbmZvIHsKKyAgICB0QU5JX1U4IG51bVRzcGVjczsKKyAgICB0VHNwZWNJbmZvIHRzcGVjW1NJUl9DQ1hfTUFYX1RTUEVDX0lFU107Cit9IHRDQ1hUc3BlY0luZm87CisjZW5kaWYKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorLy8vIERlZmluaXRpb24gZm9yIE5laWdoYm9yIEJTUyBpbmZvCit0eXBlZGVmIHN0cnVjdCBzU2lyTmVpZ2hib3JCc3NJbmZvCit7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgYnNzSWQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgY2hhbm5lbElkOworICAgIHRBbmlUaXRhbkh0Q2FwYWJpbGl0eUluZm8gdGl0YW5IdENhcHM7CisgICAgdEFuaUJvb2wgICAgICAgICAgICAgICAgd25pSW5kaWNhdG9yOworICAgIHRTaXJCc3NUeXBlICAgICAgICAgICAgIGJzc1R5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2lucjsKKyAgICB0QU5JX1M4ICAgICAgICAgICAgICAgICByc3NpOworICAgIHRTaXJMb2FkICAgICAgICAgICAgICAgIGxvYWQ7CisgICAgdEFuaVNTSUQgICAgICAgICAgICAgICAgc3NJZDsKKyAgICB0QW5pQXBOYW1lICAgICAgICAgICAgICBhcE5hbWU7CisgICAgdFNpclJTTmllICAgICAgICAgICAgICAgcnNuSUU7CisjaWYgMCAgICAKKyAgICB0RG90MTFmSUVIVENhcHMgICAgICAgICBIVENhcHM7CisgICAgdERvdDExZklFSFRJbmZvICAgICAgICAgSFRJbmZvOworI2VuZGlmCisgICAgdFNpck53VHlwZSAgICAgICAgICAgICAgbndUeXBlOyAgICAgICAgICAgICAvLyBJbmRpY2F0ZXMgMTFhL2IvZworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlJbmZvOworICAgIHRTaXJNYWNSYXRlU2V0ICAgICAgICAgIG9wZXJhdGlvbmFsUmF0ZVNldDsgLy8gSGFzIDExYSBvciAxMWIgcmF0ZXMKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgICBleHRlbmRlZFJhdGVTZXQ7ICAgIC8vIEhhcyAxMWcgcmF0ZXMKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBiZWFjb25JbnRlcnZhbDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBkdGltUGVyaW9kOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIEhUQ2Fwc1ByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgSFRJbmZvUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICB3bWVJbmZvUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICB3bWVFZGNhUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICB3c21DYXBhYmxlUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBoY2ZFbmFibGVkOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHByb3BJRUNhcGFiaWxpdHk7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgbG9jYWxQb3dlckNvbnN0cmFpbnRzOworICAgIHRBTklfUzMyICAgICAgICAgICAgICAgIGFnZ3JSc3NpOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIGRhdGFDb3VudDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICB0b3RhbFBhY2tldHM7Cit9IHRTaXJOZWlnaGJvckJzc0luZm8sICp0cFNpck5laWdoYm9yQnNzSW5mbzsKKworCisvLy8gRGVmaW5pdGlvbiBmb3IgTmVpZ2hib3IgQlNTIHdpdGggV0RTIGluZm8KK3R5cGVkZWYgc3RydWN0IHNTaXJOZWlnaGJvckJzc1dkc0luZm8KK3sKKyAgICB0U2lyTmVpZ2hib3JCc3NJbmZvICAgIG5laWdoYm9yQnNzSW5mbzsKKyAgICB0U2lyV2RzSW5mbyAgICAgICAgICAgIHdkc0luZm87Cit9IHRTaXJOZWlnaGJvckJzc1dkc0luZm8sICp0cFNpck5laWdoYm9yQnNzV2RzSW5mbzsKKworLy8vIERlZmluaXRpb24gZm9yIE5laWdoYm9yIEJTUyBsaXN0Cit0eXBlZGVmIHN0cnVjdCBzU2lyTmVpZ2hib3JCc3NMaXN0Cit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICBudW1Cc3M7CisgICAgdFNpck5laWdoYm9yQnNzSW5mbyAgYnNzTGlzdFsxXTsKK30gdFNpck5laWdoYm9yQnNzTGlzdCwgKnRwU2lyTmVpZ2hib3JCc3NMaXN0OworCisvLy8gRGVmaW5pdGlvbiBmb3IgTmVpZ2hib3IgQlNTIGxpc3Qgd2l0aCBXRFMgaW5mbwordHlwZWRlZiBzdHJ1Y3Qgc1Npck5laWdoYm9yQnNzV2RzTGlzdAoreworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICAgbnVtQnNzV2RzOworICAgIHRTaXJOZWlnaGJvckJzc1dkc0luZm8gIGJzc1dkc0xpc3RbMV07Cit9IHRTaXJOZWlnaGJvckJzc1dkc0xpc3QsICp0cFNpck5laWdoYm9yQnNzV2RzTGlzdDsKKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorLy8vIERlZmluaXRpb24gZm9yIGtpY2sgc3RhcnRpbmcgbWVhc3VyZW1lbnRzCisvLy8gLS0tPiBNQUMKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVNZWFzdXJlbWVudFJlcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX01FQVNVUkVNRU5UX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJNZWFzQ29udHJvbCAgICAgIG1lYXNDb250cm9sOworICAgIHRTaXJNZWFzRHVyYXRpb24gICAgIG1lYXNEdXJhdGlvbjsKKyAgICAvLyBUaGlzIGluZGljYXRlcyBob3cgb2Z0ZW4gU01FX01FQVNVUkVNRU5UX0lORCBtZXNzYWdlCisgICAgLy8gaXMgc2VudCB0byBob3N0CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICBtZWFzSW5kUGVyaW9kOworICAgIC8vIFRoaXMgY2hhbm5lbCBsaXN0IHdpbGwgaGF2ZSBjdXJyZW50IGNoYW5uZWwgYWxzbworICAgIHRTaXJDaGFubmVsTGlzdCAgICAgIGNoYW5uZWxMaXN0OworfSB0U2lyU21lTWVhc3VyZW1lbnRSZXEsICp0cFNpclNtZU1lYXN1cmVtZW50UmVxOworCisvLy8gRGVmaW5pdGlvbiBmb3IgcmVzcG9uc2UgbWVzc2FnZSB0byBwcmV2aW91c2x5CisvLy8gaXNzdWVkIE1lYXN1cmVtZW50IHJlcXVlc3QKKy8vLyBNQUMgLS0tPgordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZU1lYXN1cmVtZW50UnNwCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9NRUFTVVJFTUVOVF9SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICAgICAgc3RhdHVzQ29kZTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAgICAvLyBUcmFuc2FjdGlvbiBJRCBmb3IgY21kCit9IHRTaXJTbWVNZWFzdXJlbWVudFJzcCwgKnRwU2lyU21lTWVhc3VyZW1lbnRSc3A7CisKKy8vLyBEZWZpbml0aW9uIGZvciBNZWFzdXJlbWVudCBNYXRyaXggaW5mbworLy8gTk9URTogVGhpcyBzaG91bGQgaW5jbHVkZSBjdXJyZW50IGNoYW5uZWwgbWVhc3VyZW1lbnRzCit0eXBlZGVmIHN0cnVjdCBzU2lyTWVhc01hdHJpeEluZm8KK3sKKyAgICB0QU5JX1U4ICAgICAgICAgIGNoYW5uZWxOdW1iZXI7CisgICAgdEFOSV9TOCAgICAgICAgICBjb21wb3NpdGVSc3NpOworICAgIHRBTklfUzMyICAgICAgICAgYWdnclJzc2k7ICAgICAvLyBEdWUgdG8gYWxsIHBhY2tldHMgaW4gdGhpcyBjaGFubmVsCisgICAgdEFOSV9VMzIgICAgICAgICB0b3RhbFBhY2tldHM7Cit9IHRTaXJNZWFzTWF0cml4SW5mbywgKnRwU2lyTWVhc01hdHJpeEluZm87CisKKy8vLyBEZWZpbml0aW9uIGZvciBNZWFzdXJlbWVudCBNYXRyaXggTGlzdAordHlwZWRlZiBzdHJ1Y3Qgc1Npck1lYXNNYXRyaXhMaXN0Cit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzOworICAgIHRTaXJNZWFzTWF0cml4SW5mbyAgbWVhc01hdHJpeExpc3RbMV07Cit9IHRTaXJNZWFzTWF0cml4TGlzdCwgKnRwU2lyTWVhc01hdHJpeExpc3Q7CisvLy8gRGVmaW5pdGlvbiBmb3IgTWVhc3VyZW1lbnQgaW5kaWNhdGlvbgorLy8vIE1BQyAtLS0+CisvLy8gTm90ZSA6IFRoaXMgaXMgb25seSBzZW50IHdoZW4gdGhlcmUgd2FzIHByaW9yCisvLy8gICAgICAgIFNNRV9NRUFTVVJFTUVOVF9SRVEgcmVjZWl2ZWQgYnkgTUFDCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lTWVhc3VyZW1lbnRJbmQKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX01FQVNVUkVNRU5UX0lORAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBkdXJhdGlvbjsKKyAgICB0U2lyTG9hZCAgICAgICAgICAgICAgIGN1cnJlbnRMb2FkOyAvLyBvbiB0aGlzIEFQIHJhZGlvCisgICAgdFNpck1lYXNNYXRyaXhMaXN0ICAgICBtZWFzTWF0cml4TGlzdDsKKyAgICB0U2lyTmVpZ2hib3JCc3NXZHNMaXN0IG5laWdoYm9yQnNzV2RzTGlzdDsKK30gdFNpclNtZU1lYXN1cmVtZW50SW5kLCAqdHBTaXJTbWVNZWFzdXJlbWVudEluZDsKKworLy8vIERlZmluaXRpb24gZm9yIEJhY2toYXVsIExpbmsgc3RhdHVzIGNoYW5nZSBJbmRpY2F0aW9uCisvLy8gTUFDIC0tLT4KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVXZHNJbmZvSW5kCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1dEU19JTkZPX0lORAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0U2lyV2RzSW5mbyAgICAgICAgd2RzSW5mbzsKK30gdFNpclNtZVdkc0luZm9JbmQsICp0cFNpclNtZVdkc0luZm9JbmQ7CisKKy8vLyBEZWZpbml0aW9uIGZvciBCYWNraGF1bCBMaW5rIEluZm8gU2V0IFJlcXVlc3QKKy8vLyAtLS0+IE1BQwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVNldFdkc0luZm9SZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfU0VUX1dEU19JTkZPX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAgICAgCisgICAgdFNpcldkc0luZm8gICAgICAgIHdkc0luZm87Cit9IHRTaXJTbWVTZXRXZHNJbmZvUmVxLCAqdHBTaXJTbWVTZXRXZHNJbmZvUmVxOworCisvLy8gRGVmaW5pdGlvbiBmb3IgQmFja2hhdWwgTGluayBMbmZvIFNldCBSZXNwb25zZQorLy8vIE1BQyAtLS0+Cit0eXBlZGVmIHN0cnVjdCBzU2lyU21lU2V0V2RzSW5mb1JzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9TRVRfV0RTX0lORk9fUlNQCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICBzdGF0dXNDb2RlOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAgICAKK30gdFNpclNtZVNldFdkc0luZm9Sc3AsICp0cFNpclNtZVNldFdkc0luZm9Sc3A7CisjZW5kaWYKKyNlbmRpZgorCisvLy8gRGVmaW5pdGlvbiBmb3IgUmFkYXIgSW5mbwordHlwZWRlZiBzdHJ1Y3Qgc1NpclJhZGFySW5mbworeworICAgIHRBTklfVTggICAgICAgICAgY2hhbm5lbE51bWJlcjsKKyAgICB0QU5JX1UxNiAgICAgICAgIHJhZGFyUHVsc2VXaWR0aDsgLy8gaW4gdXNlY29uZAorICAgIHRBTklfVTE2ICAgICAgICAgbnVtUmFkYXJQdWxzZTsKK30gdFNpclJhZGFySW5mbywgKnRwU2lyUmFkYXJJbmZvOworCisjZGVmaW5lIFNJUl9SQURBUl9JTkZPX1NJWkUgICAgICAgICAgICAgICAgKHNpemVvZih0QU5JX1U4KSArIDIgKnNpemVvZih0QU5JX1UxNikpCisKKy8vLyBUd28gQmFja2dyb3VuZCBTY2FuIG1vZGUKK3R5cGVkZWYgZW51bSBlU2lyQmFja2dyb3VuZFNjYW5Nb2RlCit7CisgICAgZVNJUl9BR0dSRVNTSVZFX0JBQ0tHUk9VTkRfU0NBTiA9IDAsCisgICAgZVNJUl9OT1JNQUxfQkFDS0dST1VORF9TQ0FOID0gMQorfSB0U2lyQmFja2dyb3VuZFNjYW5Nb2RlOworCisvLy8gVHdvIHR5cGVzIG9mIHRyYWZmaWMgY2hlY2sKK3R5cGVkZWYgZW51bSBlU2lyTGlua1RyYWZmaWNDaGVjaworeworICAgIGVTSVJfRE9OVF9DSEVDS19MSU5LX1RSQUZGSUNfQkVGT1JFX1NDQU4gPSAwLAorICAgIGVTSVJfQ0hFQ0tfTElOS19UUkFGRklDX0JFRk9SRV9TQ0FOID0gMQorfSB0U2lyTGlua1RyYWZmaWNDaGVjazsKKworI2RlZmluZSBTSVJfQkdfU0NBTl9SRVRVUk5fQ0FDSEVEX1JFU1VMVFMgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBTSVJfQkdfU0NBTl9QVVJHRV9SRVNVVExTICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgU0lSX0JHX1NDQU5fUkVUVVJOX0ZSRVNIX1JFU1VMVFMgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFNJUl9TQ0FOX01BWF9OVU1fU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSAKKworLy8vIERlZmluaXRpb24gZm9yIHNjYW4gcmVxdWVzdAordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVNjYW5SZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1NDQU5fUkVRCisgICAgdEFOSV9VMTYgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgc2Vzc2lvbklkOyAgICAgICAgIC8vIFNlc3Npb24gSUQKKyAgICB0QU5JX1UxNiAgICAgICAgdHJhbnNhY3Rpb25JZDsgICAgIC8vIFRyYW5zYWN0aW9uIElEIGZvciBjbWQKKyAgICB0U2lyTWFjQWRkciAgICAgYnNzSWQ7CisgICAgdFNpck1hY1NTaWQgICAgIHNzSWRbU0lSX1NDQU5fTUFYX05VTV9TU0lEXTsKKyAgICB0U2lyTWFjQWRkciAgICAgc2VsZk1hY0FkZHI7IC8vQWRkZWQgRm9yIEJULUFNUCBTdXBwb3J0CisgICAgdFNpckJzc1R5cGUgICAgIGJzc1R5cGU7CisgICAgdEFOSV9VOCAgICAgICAgIGRvdDExbW9kZTsKKyAgICB0U2lyU2NhblR5cGUgICAgc2NhblR5cGU7CisgICAgLyoqCisgICAgICogbWluQ2hhbm5lbFRpbWUuIE5vdCB1c2VkIGlmIHNjYW5UeXBlIGlzIHBhc3NpdmUuCisgICAgICogMHgwIC0gRG9udCBVc2UgbWluIGNoYW5uZWwgdGltZXIuIE9ubHkgbWF4IGNoYW5uZWwgdGltZW91dCB3aWxsIHVzZWQuCisgICAgICogICAgICAgMTFrIG1lYXN1cmVtZW50cyBzZXQgdGhpcyB0byB6ZXJvIHRvIHVzZXIgb25seSBzaW5nbGUgZHVyYXRpb24gZm9yIHNjYW4uCisgICAgICogPHZhbGlkIHRpbWVvdXQ+IC0gVGltZW91dCB2YWx1ZSB1c2VkIGZvciBtaW4gY2hhbm5lbCB0aW1lb3V0LgorICAgICAqLworICAgIHRBTklfVTMyICAgICAgICBtaW5DaGFubmVsVGltZTsKKyAgICAvKioKKyAgICAgKiBtYXhDaGFubmVsVGltZS4KKyAgICAgKiAweDAgLSBJbnZhbGlkLiBJbiBjYXNlIG9mIGFjdGl2ZSBzY2FuLgorICAgICAqIEluIGNhc2Ugb2YgcGFzc2l2ZSBzY2FuLCBNQVgoIG1heENoYW5uZWxUaW1lLCBXTklfQ0ZHX1BBU1NJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUUpIGlzIHVzZWQuIAorICAgICAqCisgICAgICovCisgICAgdEFOSV9VMzIgICAgICAgIG1heENoYW5uZWxUaW1lOworICAgIC8qKgorICAgICAqIHJldHVybkFmdGVyRmlyc3RNYXRjaCBjYW4gdGFrZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAqIDB4MDAgLSBSZXR1cm4gU0NBTl9SU1AgbWVzc2FnZSBhZnRlciBjb21wbGV0ZSBjaGFubmVsIHNjYW4KKyAgICAgKiAweDAxIC0gIFJldHVybiBTQ0FOX1JTUCBtZXNzYWdlIGFmdGVyIGNvbGxlY3RpbmcgQlNTIGRlc2NyaXB0aW9uCisgICAgICogICAgICAgIHRoYXQgbWF0Y2hlcyBzY2FuIGNyaXRlcmlhLgorICAgICAqIDB4QzAgLSBSZXR1cm4gYWZ0ZXIgY29sbGVjdGluZyBmaXJzdCAxMWQgSUUgZnJvbSAyLjQgR0h6ICYKKyAgICAgKiAgICAgICAgNSBHSHogYmFuZCBjaGFubmVscworICAgICAqIDB4ODAgLSBSZXR1cm4gYWZ0ZXIgY29sbGVjdGluZyBmaXJzdCAxMWQgSUUgZnJvbSA1IEdIeiBiYW5kCisgICAgICogICAgICAgIGNoYW5uZWxzCisgICAgICogMHg0MCAtIFJldHVybiBhZnRlciBjb2xsZWN0aW5nIGZpcnN0IDExZCBJRSBmcm9tIDIuNCBHSHoKKyAgICAgKiAgICAgICAgYmFuZCBjaGFubmVscworICAgICAqCisgICAgICogVmFsdWVzIG9mIDB4QzAsIDB4ODAgJiAweDQwIGFyZSB0byBiZSB1c2VkIGJ5CisgICAgICogUm9hbWluZy9hcHBsaWNhdGlvbiB3aGVuIDExZCBpcyBlbmFibGVkLgorICAgICAqLworICAgIHRBTklfVTggICAgICAgICAgICAgIHJldHVybkFmdGVyRmlyc3RNYXRjaDsKKworICAgIC8qKgorICAgICAqIHJldHVyblVuaXF1ZVJlc3VsdHMgY2FuIHRha2UgZm9sbG93aW5nIHZhbHVlczoKKyAgICAgKiAwIC0gQ29sbGVjdCAmIHJlcG9ydCBhbGwgcmVjZWl2ZWQgQlNTIGRlc2NyaXB0aW9ucyBmcm9tIHNhbWUgQlNTLgorICAgICAqIDEgLSBDb2xsZWN0ICYgcmVwb3J0IHVuaXF1ZSBCU1MgZGVzY3JpcHRpb24gZnJvbSBzYW1lIEJTUy4KKyAgICAgKi8KKyAgICB0QU5JX1U4ICAgICAgICAgICAgICByZXR1cm5VbmlxdWVSZXN1bHRzOworCisgICAgLyoqCisgICAgICogcmV0dXJuRnJlc2hSZXN1bHRzIGNhbiB0YWtlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgICogMHgwMCAtIFJldHVybiBiYWNrZ3JvdW5kIHNjYW4gcmVzdWx0cy4KKyAgICAgKiAweDgwIC0gUmV0dXJuICYgcHVyZ2UgYmFja2dyb3VuZCBzY2FuIHJlc3VsdHMKKyAgICAgKiAweDAxIC0gVHJpZ2dlciBmcmVzaCBzY2FuIGluc3RlYWQgb2YgcmV0dXJuaW5nIGJhY2tncm91bmQgc2NhbgorICAgICAqICAgICAgICByZXN1bHRzLgorICAgICAqIDB4ODEgLSBUcmlnZ2VyIGZyZXNoIHNjYW4gaW5zdGVhZCBvZiByZXR1cm5pbmcgYmFja2dyb3VuZCBzY2FuCisgICAgICogICAgICAgIHJlc3VsdHMgYW5kIHB1cmdlIGJhY2tncm91bmQgc2NhbiByZXN1bHRzLgorICAgICAqLworICAgIHRBTklfVTggICAgICAgICAgICAgIHJldHVybkZyZXNoUmVzdWx0czsKKworICAgIC8qICBiYWNrZ3JvdW5kU2Nhbk1vZGUgY2FuIHRha2UgZm9sbG93aW5nIHZhbHVlczoKKyAgICAgKiAgMHgwIC0gYWdyZXNzaXZlIHNjYW4KKyAgICAgKiAgMHgxIC0gbm9ybWFsIHNjYW4gd2hlcmUgSEFMIHdpbGwgY2hlY2sgZm9yIGxpbmsgdHJhZmZpYyAKKyAgICAgKiAgICAgICAgcHJpb3IgdG8gcHJvY2VlZGluZyB3aXRoIHRoZSBzY2FuCisgICAgICovCisgICAgdFNpckJhY2tncm91bmRTY2FuTW9kZSAgIGJhY2tncm91bmRTY2FuTW9kZTsKKworICAgIHRBTklfVTggICAgICAgICAgICAgIGhpZGRlblNzaWQ7CisKKyAgICAvKiBOdW1iZXIgb2YgU1NJRHMgdG8gc2NhbiAqLworICAgIHRBTklfVTggICAgICAgICAgICAgbnVtU3NpZDsKKyAgICAKKyAgICAvL2NoYW5uZWxMaXN0IGhhcyB0byBiZSB0aGUgbGFzdCBtZW1iZXIgb2YgdGhpcyBzdHJ1Y3R1cmUuIENoZWNrIHRTaXJDaGFubmVsTGlzdCBmb3IgdGhlIHJlYXNvbi4KKyAgICAvKiBUaGlzIE1VU1QgYmUgdGhlIGxhc3QgZmllbGQgb2YgdGhlIHN0cnVjdHVyZSAqLworICAgIAorIAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgICBwMnBTZWFyY2g7CisjZW5kaWYKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICB1SUVGaWVsZExlbjsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICB1SUVGaWVsZE9mZnNldDsKKworICAgIC8vY2hhbm5lbExpc3QgTVVTVCBiZSB0aGUgbGFzdCBmaWVsZCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIHRTaXJDaGFubmVsTGlzdCBjaGFubmVsTGlzdDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICB0U2lyU21lU2NhblJlcS4uLi4KKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICB1SUVGaWxlZExlbiAKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICB1SUVGaWxlZE9mZnNldCAgICAgICAgICAgICAgIC0tLS0rCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICB8CisgICAgICBjaGFubmVsTGlzdC5udW1DaGFubmVscyAgICAgICAgICB8CisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICB8CisgICAgICAuLi4gdmFyaWFibGUgc2l6ZSB1cCB0byAgICAgICAgICB8CisgICAgICBjaGFubmVsTnVtYmVyW251bUNoYW5uZWxzLTFdICAgICB8CisgICAgICBUaGlzIGNhbiBiZSB6ZXJvLCBpZiAgICAgICAgICAgICB8CisgICAgICBudW1DaGFubmVsIGlzIHplcm8uICAgICAgICAgICAgICB8CisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA8LS0rCisgICAgICAuLi4gdmFyaWFibGUgc2l6ZSB1SUVGaWxlZCAKKyAgICAgIHVwIHRvIHVJRUZpZWxkTGVuIChjYW4gYmUgMCkKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK30gdFNpclNtZVNjYW5SZXEsICp0cFNpclNtZVNjYW5SZXE7CisKKworLy8vIERlZmluaXRpb24gZm9yIHJlc3BvbnNlIG1lc3NhZ2UgdG8gcHJldmlvdXNseSBpc3N1ZWQgc2NhbiByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzU2lyU21lU2NhblJzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfU0NBTl9SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgc3RhdHVzQ29kZTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgdHJhbnNjYXRpb25JZDsgCisgICAgdFNpckJzc0Rlc2NyaXB0aW9uIGJzc0Rlc2NyaXB0aW9uWzFdOworfSB0U2lyU21lU2NhblJzcCwgKnRwU2lyU21lU2NhblJzcDsKKworLy8vIFNtZSBSZXEgbWVzc2FnZSB0byBzZXQgdGhlIEJhY2tncm91bmQgU2NhbiBtb2RlCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lQmFja2dyb3VuZFNjYW5Nb2RlUmVxCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX0JBQ0tHUk9VTkRfU0NBTl9NT0RFX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0U2lyQmFja2dyb3VuZFNjYW5Nb2RlICAgbW9kZTsKK30gdFNpclNtZUJhY2tncm91bmRTY2FuTW9kZVJlcSwgKnRwU2lyU21lQmFja2dyb3VuZFNjYW5Nb2RlUmVxOworCisvLy8gQmFja2dyb3VuZCBTY2FuIFN0YXRpc2ljcwordHlwZWRlZiBzdHJ1Y3Qgc1NpckJhY2tncm91bmRTY2FuSW5mbyB7CisgICAgdEFOSV9VMzIgICAgICAgIG51bU9mU2NhblN1Y2Nlc3M7CisgICAgdEFOSV9VMzIgICAgICAgIG51bU9mU2NhbkZhaWx1cmU7CisgICAgdEFOSV9VMzIgICAgICAgIHJlc2VydmVkOworfSB0U2lyQmFja2dyb3VuZFNjYW5JbmZvLCAqdHBTaXJCYWNrZ3JvdW5kU2NhbkluZm87CisKKyNkZWZpbmUgU0lSX0JBQ0tHUk9VTkRfU0NBTl9JTkZPX1NJWkUgICAgICAgICgzICogc2l6ZW9mKHRBTklfVTMyKSkKKworLy8vIERlZmluaXRpb24gZm9yIEF1dGhlbnRpY2F0aW9uIHJlcXVlc3QKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVBdXRoUmVxCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9BVVRIX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgIHNlc3Npb25JZDsgICAgICAgIC8vIFNlc3Npb24gSUQKKyAgICB0QU5JX1UxNiAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgICAgLy8gVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRTaXJNYWNBZGRyICAgICAgICBic3NJZDsgICAgICAgICAgICAvLyBTZWxmIEJTU0lECisgICAgdFNpck1hY0FkZHIgICAgICAgIHBlZXJNYWNBZGRyOworICAgIHRBbmlBdXRoVHlwZSAgICAgICBhdXRoVHlwZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgY2hhbm5lbE51bWJlcjsKK30gdFNpclNtZUF1dGhSZXEsICp0cFNpclNtZUF1dGhSZXE7CisKKy8vLyBEZWZpbml0aW9uIGZvciByZXBvbnNlIG1lc3NhZ2UgdG8gcHJldmlvdXNseSBpc3N1ZWQgQXV0aCByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzU2lyU21lQXV0aFJzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfQVVUSF9SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAgLy8gU2Vzc2lvbiBJRAorICAgIHRBTklfVTE2ICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAgLy8gVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRTaXJNYWNBZGRyICAgICAgICBwZWVyTWFjQWRkcjsKKyAgICB0QW5pQXV0aFR5cGUgICAgICAgYXV0aFR5cGU7CisgICAgdFNpclJlc3VsdENvZGVzICAgIHN0YXR1c0NvZGU7CisgICAgdEFOSV9VMTYgICAgICAgICAgIHByb3RTdGF0dXNDb2RlOyAvL0l0IGhvbGRzIHJlYXNvbkNvZGUgd2hlbiBQcmUtQXV0aCBmYWlscyBkdWUgdG8gZGVhdXRoIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9PdGhlcndpc2UgaXQgaG9sZHMgc3RhdHVzIGNvZGUuCit9IHRTaXJTbWVBdXRoUnNwLCAqdHBTaXJTbWVBdXRoUnNwOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisvLy8gQXNzb2NpYXRpb24gdHlwZQordHlwZWRlZiBlbnVtIGVTaXJBc3NvY1R5cGUKK3sKKyAgICBlU0lSX05PUk1BTCwKKyAgICBlU0lSX1RSQU5TRkVSUkVELAorICAgIGVTSVJfRE9OT1RfVVNFX0FTU09DX1RZUEUgPSBTSVJfTUFYX0VOVU1fU0laRQorfSB0U2lyQXNzb2NUeXBlOworI2VuZGlmCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgCit0eXBlZGVmIGVudW0gZVNpckJwSW5kaWNhdG9yVHlwZQoreworICAgIGVTSVJfV0lSRUxFU1NfQlAsCisgICAgZVNJUl9XSVJFRF9CUAorfSB0U2lyQnBJbmRpY2F0b3JUeXBlOworCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworLy8vIERlZmluaXRpb24gZm9yIEpvaW4vUmVhc3NvYyBpbmZvIC0gUmVzaG1pOiBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgaXMgYSBkZWYgd2hpY2ggbW92ZWQgZnJvbSBlbHNlaHdlcmUuCit0eXBlZGVmIHN0cnVjdCBzSm9pblJlYXNzb2NJbmZvCit7CisgICAgdEFuaVRpdGFuQ0JOZWlnaGJvckluZm8gY2JOZWlnaGJvcnM7CisgICAgdEFuaUJvb2wgICAgICAgICAgICBzcGVjdHJ1bU1ndEluZGljYXRvcjsKKyAgICB0U2lyTWFjUG93ZXJDYXBJbmZvIHBvd2VyQ2FwOworICAgIHRTaXJTdXBDaG5sICAgICAgICAgc3VwcG9ydGVkQ2hhbm5lbHM7Cit9IHRKb2luUmVhc3NvY0luZm8sICp0cEpvaW5SZWFzc29jSW5mbzsKKyNlbmRpZgorCisvLy8gRGVmaW5pdGlvbiBmb3Igam9pbiByZXF1ZXN0CisvLy8gLS0tPiBNQUMKKy8vLyBXQVJOSU5HISBJZiB5b3UgYWRkIGEgZmllbGQgaW4gSk9JTiBSRVEuIAorLy8vICAgICAgICAgTWFrZSBzdXJlIHRvIGFkZCBpdCBpbiBSRUFTU09DIFJFUSAKKy8vLyBUaGUgU2VyZGVzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFuZCBpdHMgCisvLy8gc2hhcmVkIHdpdGggUkVBU1NPQy4gU28gaWYgd2UgYWRkIGEgZmllbGQKKy8vICBoZXJlIGFuZCBkb250IGFkZCBpdCBpbiBSRUFTU09DIFJFUS4gSXQgd2lsbCBCUkVBSyEhISBSRUFTU09DLgordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZUpvaW5SZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAgICAgICAgICAgIC8vIGVXTklfU01FX0pPSU5fUkVRCisgICAgdEFOSV9VMTYgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAgICAgICAgICAKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAKKyAgICB0U2lyTWFjU1NpZCAgICAgICAgIHNzSWQ7CisgICAgdFNpck1hY0FkZHIgICAgICAgICBzZWxmTWFjQWRkcjsgICAgICAgICAgICAvLyBzZWxmIE1hYyBhZGRyZXNzCisgICAgdFNpckJzc1R5cGUgICAgICAgICBic3N0eXBlOyAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IHR5cGUgZm9yIEJUIC1BTVAgU1RBIGFuZCBBUCBNb2R1bGVzCisgICAgdEFOSV9VOCAgICAgICAgICAgICBkb3QxMW1vZGU7ICAgICAgICAgICAgICAvLyB0byBzdXBwb3J0IEJULUFNUCAgICAgCisgICAgdFZPU19DT05fTU9ERSAgICAgICBzdGFQZXJzb25hOyAgICAgICAgLy9QZXJzb25hCisKKyAgICAvKlRoaXMgY29udGFpbnMgdGhlIFVBUFNEIEZsYWcgZm9yIGFsbCA0IEFDCisgICAgICogQjA6IEFDX1ZPIFVBUFNEIEZMQUcKKyAgICAgKiBCMTogQUNfVkkgVUFQU0QgRkxBRworICAgICAqIEIyOiBBQ19CSyBVQVBTRCBGTEFHCisgICAgICogQjM6IEFDX0JFIFVBU1BEIEZMQUcKKyAgICAgKi8KKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICB1YXBzZFBlckFjQml0bWFzazsKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgIHRTaXJBc3NvY1R5cGUgICAgICAgYXNzb2NUeXBlOyAgICAgICAgICAgICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgU1RBIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kaW5nIChSZSkgQXNzb2NpYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1ZSB0byBsb2FkIGJhbGFuY2Ugb3Igbm90CisjZW5kaWYKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgIG9wZXJhdGlvbmFsUmF0ZVNldDsvLyBIYXMgMTFhIG9yIDExYiByYXRlcworICAgIHRTaXJNYWNSYXRlU2V0ICAgICAgZXh0ZW5kZWRSYXRlU2V0OyAgICAvLyBIYXMgMTFnIHJhdGVzCisgICAgdFNpclJTTmllICAgICAgICAgICByc25JRTsgICAgICAgICAgICAgICAgICAvLyBSU04gSUUgdG8gYmUgc2VudCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFJlKSBBc3NvY2lhdGlvbiBSZXF1ZXN0CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIHRTaXJDQ0tNaWUgICAgICAgICAgY2NrbUlFOyAgICAgICAgICAgICAvLyBDQ01LIElFIHRvIGJlIGluY2x1ZGVkIGFzIGhhbmRsZXIgZm9yIGpvaW4gYW5kIHJlYXNzb2MgaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lLiBUaGUgam9pbiB3aWxsIG5ldmVyIGNhcnJ5IGNja20sIGJ1dCB3aWxsIGJlIHNldCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwLiAKKyNlbmRpZgorCisgICAgdFNpckFkZGllICAgICAgICAgICBhZGRJRVNjYW47ICAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsIElFIHRvIGJlIHNlbnQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1bmljYXN0KSBQcm9iZSBSZXF1ZXN0IGF0IHRoZSB0aW1lIG9mIGpvaW4KKworICAgIHRTaXJBZGRpZSAgICAgICAgICAgYWRkSUVBc3NvYzsgICAgICAgICAgICAgLy8gQWRkaXRpb25hbCBJRSB0byBiZSBzZW50IGluIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFJlKSBBc3NvY2lhdGlvbiBSZXF1ZXN0CisKKyAgICB0QW5pRWRUeXBlICAgICAgICAgIFVDRW5jcnlwdGlvblR5cGU7CisKKyAgICB0QW5pRWRUeXBlICAgICAgICAgIE1DRW5jcnlwdGlvblR5cGU7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICB0QW5pQm9vbCAgICAgICAgICAgIGlzMTFSY29ubmVjdGlvbjsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICB0QW5pQm9vbCAgICAgICAgICAgIGlzQ0NYY29ubmVjdGlvbjsKKyAgICB0Q0NYVHNwZWNJbmZvICAgICAgIGNjeFRzcGVjSW5mbzsKKyNlbmRpZgorICAgIAorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgfHwgZGVmaW5lZCBGRUFUVVJFX1dMQU5fQ0NYCisgICAgdEFuaUJvb2wgICAgICAgICAgICBpc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZDsKKyNlbmRpZgorICAgIAorI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QW5pQm9vbCAgICAgICAgICAgIGJwSW5kaWNhdG9yOworICAgIHRTaXJCcEluZGljYXRvclR5cGUgYnBUeXBlOworICAgIHRTaXJOZWlnaGJvckJzc0xpc3QgbmVpZ2hib3JCc3NMaXN0OyAgICAgICAgLy8gVEJEIE1vdmUgdGhpcyBvdXRzaWRlICdBUCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWcKKyNlbmRpZgorICAgIHRBbmlUaXRhbkNCTmVpZ2hib3JJbmZvIGNiTmVpZ2hib3JzOworICAgIHRBbmlCb29sICAgICAgICAgICAgc3BlY3RydW1NZ3RJbmRpY2F0b3I7CisgICAgdFNpck1hY1Bvd2VyQ2FwSW5mbyBwb3dlckNhcDsKKyAgICB0U2lyU3VwQ2hubCAgICAgICAgIHN1cHBvcnRlZENoYW5uZWxzOworLy8jaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gV0xBTl9TVEEgKQorICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAgYnNzRGVzY3JpcHRpb247CisvLyNlbmRpZgorCit9IHRTaXJTbWVKb2luUmVxLCAqdHBTaXJTbWVKb2luUmVxOworCisvLy8gRGVmaW5pdGlvbiBmb3IgcmVwb25zZSBtZXNzYWdlIHRvIHByZXZpb3VzbHkgaXNzdWVkIGpvaW4gcmVxdWVzdAorLy8vIE1BQyAtLS0+Cit0eXBlZGVmIHN0cnVjdCBzU2lyU21lSm9pblJzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9KT0lOX1JTUAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAgICAgLy8gU2Vzc2lvbiBJRAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAgICAvLyBUcmFuc2FjdGlvbiBJRCBmb3IgY21kCisgICAgdFNpclJlc3VsdENvZGVzICAgIHN0YXR1c0NvZGU7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gV0xBTl9TVEEpCisgICAgdEFuaUF1dGhUeXBlICAgICAgIGF1dGhUeXBlOworLy8gICAgdEFOSV9VMTYgICAgICAgICAgIHN0YUlkOyAgICAgICAgICAgICAvLyBTdGF0aW9uIElEIGZvciBwZWVyCisjZW5kaWYKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICAvLyBGb2xsb3dpbmcgYXJlIG5lZWRlZCBmb3IgUm9hbWluZyBhbGdvcml0aG0KKyAgICAvLyB0byAnYXNzb2NpYXRlJyB3aXRoIGFuIGFsdGVybmF0ZSBCU1MuCisgICAgdFNpck1hY0FkZHIgICAgICAgIGFsdGVybmF0ZUJzc0lkOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGFsdGVybmF0ZUNoYW5uZWxJZDsKKyNlbmRpZgorICAgIHRBTklfVTE2ICAgICAgICBwcm90U3RhdHVzQ29kZTsgLy9JdCBob2xkcyByZWFzb25Db2RlIHdoZW4gam9pbiBmYWlscyBkdWUgdG8gZGVhdXRoL2Rpc2Fzc29jIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9PdGhlcndpc2UgaXQgaG9sZHMgc3RhdHVzIGNvZGUuCisgICAgdEFOSV9VMTYgICAgICAgIGFpZDsKKyAgICB0QU5JX1UzMiAgICAgICAgYmVhY29uTGVuZ3RoOworICAgIHRBTklfVTMyICAgICAgICBhc3NvY1JlcUxlbmd0aDsKKyAgICB0QU5JX1UzMiAgICAgICAgYXNzb2NSc3BMZW5ndGg7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICB0QU5JX1UzMiAgICAgICAgcGFyc2VkUmljUnNwTGVuOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIHRBTklfVTMyICAgICAgICB0c3BlY0llTGVuOworI2VuZGlmCisgICAgdEFOSV9VMzIgICAgICAgIHN0YUlkOy8vU3RhdGlvbiBJRCBmb3IgcGVlcgorCisgICAgLypUaGUgRFBVIHNpZ25hdHVyZXMgd2lsbCBiZSBzZW50IGV2ZW50dWFsbHkgdG8gVEwgdG8gaGVscCBpdCBkZXRlcm1pbmUgdGhlIAorICAgICAgYXNzb2NpYXRpb24gdG8gd2hpY2ggYSBwYWNrZXQgYmVsb25ncyB0byovCisgICAgLypVbmljYXN0IERQVSBzaWduYXR1cmUqLworICAgIHRBTklfVTggICAgICAgICAgICB1Y2FzdFNpZzsKKworICAgIC8qQnJvYWRjYXN0IERQVSBzaWduYXR1cmUqLworICAgIHRBTklfVTggICAgICAgICAgICBiY2FzdFNpZzsKKworICAgIHRBTklfVTggICAgICAgICBmcmFtZXNbIDEgXTsKK30gdFNpclNtZUpvaW5Sc3AsICp0cFNpclNtZUpvaW5Sc3A7CisKKy8vLyBEZWZpbml0aW9uIGZvciBBdXRoZW50aWNhdGlvbiBpbmRpY2F0aW9uIGZyb20gcGVlcgordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZUF1dGhJbmQKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX0FVVEhfSU5ECisgICAgdEFOSV9VMTYgICAgICAgICAgIGxlbmd0aDsgICAgICAgICAKKyAgICB0QU5JX1U4ICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRTaXJNYWNBZGRyICAgICAgICBic3NJZDsgICAgICAgICAgICAgLy8gU2VsZiBCU1NJRAorICAgIHRTaXJNYWNBZGRyICAgICAgICBwZWVyTWFjQWRkcjsKKyAgICB0QW5pQXV0aFR5cGUgICAgICAgYXV0aFR5cGU7Cit9IHRTaXJTbWVBdXRoSW5kLCAqdHBTaXJTbWVBdXRoSW5kOworCisvLy8gcHJvYmVyZXEgZnJvbSBwZWVyLCB3aGVuIHdzYyBpcyBlbmFibGVkCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lUHJvYmVyZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1BST0JFX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgIHNlc3Npb25JZDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgcGVlck1hY0FkZHI7CisgICAgdEFOSV9VMTYgICAgICAgICAgIGRldmljZVBhc3N3ZElkOworfSB0U2lyU21lUHJvYmVSZXEsICp0cFNpclNtZVByb2JlUmVxOworCisvLy8gRGVmaW5pdGlvbiBmb3IgQXNzb2NpYXRpb24gaW5kaWNhdGlvbiBmcm9tIHBlZXIKKy8vLyBNQUMgLS0tPgordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZUFzc29jSW5kCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX0FTU09DX0lORAorICAgIHRBTklfVTE2ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBzZXNzaW9uSWQ7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgcGVlck1hY0FkZHI7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgYWlkOworICAgIHRTaXJNYWNBZGRyICAgICAgICAgIGJzc0lkOyAvLyBTZWxmIEJTU0lECisgICAgdEFOSV9VMTYgICAgICAgICAgICAgc3RhSWQ7IC8vIFN0YXRpb24gSUQgZm9yIHBlZXIKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICB1bmlTaWc7ICAvLyBEUFUgc2lnbmF0dXJlIGZvciB1bmljYXN0IHBhY2tldHMKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBiY2FzdFNpZzsgLy8gRFBVIHNpZ25hdHVyZSBmb3IgYnJvYWRjYXN0IHBhY2tldHMKKyAgICB0QW5pQXV0aFR5cGUgICAgICAgICBhdXRoVHlwZTsgICAgCisgICAgdEFuaVNTSUQgICAgICAgICAgICAgc3NJZDsgLy8gU1NJRCB1c2VkIGJ5IFNUQSB0byBhc3NvY2lhdGUKKyAgICB0U2lyUlNOaWUgICAgICAgICAgICByc25JRTsvLyBSU04gSUUgcmVjZWl2ZWQgZnJvbSBwZWVyCisgICAgdFNpckFkZGllICAgICAgICAgICAgYWRkSUU7Ly8gQWRkaXRpb25hbCBJRSByZWNlaXZlZCBmcm9tIHBlZXIsIHdoaWNoIHBvc3NpYmx5IGluY2x1ZGUgV1NDIElFIGFuZC9vciBQMlAgSUUKKworI2lmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICBzZXFOdW07CisgICAgdEFuaUJvb2wgICAgICAgICAgICAgd25pSW5kaWNhdG9yOworICAgIHRBbmlCb29sICAgICAgICAgICAgIGJwSW5kaWNhdG9yOworICAgIHRTaXJCcEluZGljYXRvclR5cGUgIGJwVHlwZTsKKyAgICB0U2lyQXNzb2NUeXBlICAgICAgICBhc3NvY1R5cGU7IC8vIEluZGljYXRlcyB3aGV0aGVyIFNUQSBpcyBMQidlZCBvciBub3QKKyAgICB0U2lyTG9hZCAgICAgICAgICAgICBsb2FkOyAvLyBDdXJyZW50IGxvYWQgb24gdGhlIHJhZGlvIGZvciBMQgorICAgIHRTaXJOZWlnaGJvckJzc0xpc3QgIG5laWdoYm9yTGlzdDsgLy8gTGlzdCByZWNlaXZlZCBmcm9tIFNUQQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eUluZm87IC8vIFNUQSBjYXBhYmlsaXR5CisgICAgdFNpck53VHlwZSAgICAgICAgICAgbndUeXBlOyAgICAgICAgICAgIC8vIEluZGljYXRlcyAxMWEvYi9nCisjZW5kaWYKKyAgICB0QW5pVGl0YW5IdENhcGFiaWxpdHlJbmZvIHRpdGFuSHRDYXBzOworICAgIC8vIHBvd2VyQ2FwICYgc3VwcG9ydGVkQ2hhbm5lbHMgYXJlIHByZXNlbnQgb25seSB3aGVuCisgICAgLy8gc3BlY3RydW1NZ3RJbmRpY2F0b3IgZmxhZyBpcyBzZXQKKyAgICB0QW5pQm9vbCAgICAgICAgICAgICAgICBzcGVjdHJ1bU1ndEluZGljYXRvcjsKKyAgICB0U2lyTWFjUG93ZXJDYXBJbmZvICAgICBwb3dlckNhcDsKKyAgICB0U2lyU3VwQ2hubCAgICAgICAgICAgICBzdXBwb3J0ZWRDaGFubmVsczsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgdEFuaUJvb2wgICAgICAgICAgICAgd21tRW5hYmxlZFN0YTsgLyogaWYgcHJlc2VudCAtIFNUQSBpcyBXTU0gZW5hYmxlZCAqLworICAgIHRBbmlCb29sICAgICAgICAgICAgIHJlYXNzb2NSZXE7CisgICAgLy8gUmVxdWlyZWQgZm9yIGluZGljYXRpbmcgdGhlIGZyYW1lcyB0byB1cHBlciBsYXllcgorICAgIHRBTklfVTMyICAgICAgICAgICAgIGJlYWNvbkxlbmd0aDsKKyAgICB0QU5JX1U4KiAgICAgICAgICAgICBiZWFjb25QdHI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgYXNzb2NSZXFMZW5ndGg7CisgICAgdEFOSV9VOCogICAgICAgICAgICAgYXNzb2NSZXFQdHI7CisjZW5kaWYKK30gdFNpclNtZUFzc29jSW5kLCAqdHBTaXJTbWVBc3NvY0luZDsKKworCisvLy8gRGVmaW5pdGlvbiBmb3IgQXNzb2NpYXRpb24gY29uZmlybQorLy8vIC0tLT4gTUFDCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lQXNzb2NDbmYKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfQVNTT0NfQ05GCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICAgIHN0YXR1c0NvZGU7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgYnNzSWQ7ICAgICAgLy8gU2VsZiBCU1NJRAorICAgIHRTaXJNYWNBZGRyICAgICAgICAgIHBlZXJNYWNBZGRyOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIGFpZDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICBhbHRlcm5hdGVCc3NJZDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBhbHRlcm5hdGVDaGFubmVsSWQ7Cit9IHRTaXJTbWVBc3NvY0NuZiwgKnRwU2lyU21lQXNzb2NDbmY7CisKKy8vLyBEZWZpbml0aW9uIGZvciBSZWFzc29jaWF0aW9uIHJlcXVlc3QKKy8vLyAtLS0+IE1BQworLy8vIFdBUk5JTkchIElmIHlvdSBhZGQgYSBmaWVsZCBpbiBSRUFTU09DIFJFUS4gCisvLy8gICAgICAgICBNYWtlIHN1cmUgdG8gYWRkIGl0IGluIEpPSU4gUkVRIAorLy8vIFRoZSBTZXJkZXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYW5kIGl0cyAKKy8vLyBzaGFyZWQgd2l0aCBSRUFTU09DLiBTbyBpZiB3ZSBhZGQgYSBmaWVsZAorLy8gIGhlcmUgYW5kIGRvbnQgYWRkIGl0IGluIEpPSU4gUkVRLiBJdCB3aWxsIEJSRUFLISEhIEpPSU4uCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lUmVhc3NvY1JlcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1JFQVNTT0NfUkVRCisgICAgdEFOSV9VMTYgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAgICAgICAgICAKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAKKyAgICB0U2lyTWFjU1NpZCAgICAgICAgIHNzSWQ7CisgICAgdFNpck1hY0FkZHIgICAgICAgICBzZWxmTWFjQWRkcjsgICAgICAgICAgICAvLyBzZWxmIE1hYyBhZGRyZXNzCisgICAgdFNpckJzc1R5cGUgICAgICAgICBic3N0eXBlOyAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IHR5cGUgZm9yIEJUIC1BTVAgU1RBIGFuZCBBUCBNb2R1bGVzCisgICAgdEFOSV9VOCAgICAgICAgICAgICBkb3QxMW1vZGU7ICAgICAgICAgICAgICAvLyB0byBzdXBwb3J0IEJULUFNUCAgICAgCisgICAgdFZPU19DT05fTU9ERSAgICAgICBzdGFQZXJzb25hOyAgICAgICAgLy9QZXJzb25hCisKKyAgICAvKlRoaXMgY29udGFpbnMgdGhlIFVBUFNEIEZsYWcgZm9yIGFsbCA0IEFDCisgICAgICogQjA6IEFDX1ZPIFVBUFNEIEZMQUcKKyAgICAgKiBCMTogQUNfVkkgVUFQU0QgRkxBRworICAgICAqIEIyOiBBQ19CSyBVQVBTRCBGTEFHCisgICAgICogQjM6IEFDX0JFIFVBU1BEIEZMQUcKKyAgICAgKi8KKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHVhcHNkUGVyQWNCaXRtYXNrOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgdFNpckFzc29jVHlwZSAgICAgICBhc3NvY1R5cGU7IC8vIEluZGljYXRlcyB3aGV0aGVyIFNUQSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kaW5nIChSZSkgQXNzb2NpYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIGxvYWQgYmFsYW5jZSBvciBub3QKKyNlbmRpZgorCisgICAgdFNpck1hY1JhdGVTZXQgICAgICAgICAgb3BlcmF0aW9uYWxSYXRlU2V0Oy8vIEhhcyAxMWEgb3IgMTFiIHJhdGVzCisgICAgdFNpck1hY1JhdGVTZXQgICAgICAgICAgZXh0ZW5kZWRSYXRlU2V0OyAgICAvLyBIYXMgMTFnIHJhdGVzCisKKyAgICB0U2lyUlNOaWUgICAgICAgICAgIHJzbklFOyAgICAgLy8gUlNOIElFIHRvIGJlIHNlbnQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFJlKSBBc3NvY2lhdGlvbiBSZXF1ZXN0CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgdFNpckNDS01pZSAgICAgICAgICBjY2ttSUU7ICAgIC8vIENDTUsgSUUgdG8gYmUgaW5jbHVkZWQgaW4gUmVBc3NvYyBpZiBsZW5ndGggIT0gMC4KKyNlbmRpZgorICAgIHRTaXJBZGRpZSAgICAgICAgICAgYWRkSUVTY2FuOyAvLyBBZGR0aW9uYWwgSUUgdG8gYmUgc2VudCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodW5pY2FzdCkgUHJvYmUgUmVxdWVzdCBhdCB0aGUgdGltZSBvZiBqb2luCisKKyAgICB0U2lyQWRkaWUgICAgICAgICAgIGFkZElFQXNzb2M7IC8vIEFkZGl0aW9uYWwgSUUgdG8gYmUgc2VudCBpbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChSZSkgQXNzb2NpYXRpb24gUmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB0QW5pRWRUeXBlICAgICAgICAgIFVDRW5jcnlwdGlvblR5cGU7CisgICAgdEFuaUVkVHlwZSAgICAgICAgICBNQ0VuY3J5cHRpb25UeXBlOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgdEFuaUJvb2wgICAgICAgICAgICBpczExUmNvbm5lY3Rpb247CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgdEFuaUJvb2wgICAgICAgICAgICBpc0NDWGNvbm5lY3Rpb247CisgICAgdENDWFRzcGVjSW5mbyAgICAgICBjY3hUc3BlY0luZm87CisjZW5kaWYKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSIHx8IGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgIHRBbmlCb29sICAgICAgICAgICAgaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQ7CisjZW5kaWYKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QW5pQm9vbCAgICAgICAgICAgICBicEluZGljYXRvcjsKKyAgICB0U2lyQnBJbmRpY2F0b3JUeXBlICBicFR5cGU7CisgICAgdFNpck5laWdoYm9yQnNzTGlzdCAgbmVpZ2hib3JCc3NMaXN0OworI2VuZGlmCisgICAgdEFuaVRpdGFuQ0JOZWlnaGJvckluZm8gY2JOZWlnaGJvcnM7CisgICAgdEFuaUJvb2wgICAgICAgICAgICAgICAgc3BlY3RydW1NZ3RJbmRpY2F0b3I7CisgICAgdFNpck1hY1Bvd2VyQ2FwSW5mbyAgICAgcG93ZXJDYXA7CisgICAgdFNpclN1cENobmwgICAgICAgICAgICAgc3VwcG9ydGVkQ2hhbm5lbHM7CisvLyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBXTEFOX1NUQSApCisgICAgdFNpckJzc0Rlc2NyaXB0aW9uICBic3NEZXNjcmlwdGlvbjsKKy8vI2VuZGlmCit9IHRTaXJTbWVSZWFzc29jUmVxLCAqdHBTaXJTbWVSZWFzc29jUmVxOworCisvLy8gRGVmaW5pdGlvbiBmb3IgcmVwb25zZSBtZXNzYWdlIHRvIHByZXZpb3VzbHkgaXNzdWVkCisvLy8gUmVhc3NvY2lhdGlvbiByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzU2lyU21lUmVhc3NvY1JzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfUkVBU1NPQ19SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAgICAgLy8gU2Vzc2lvbiBJRAorICAgIHRBTklfVTE2ICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAgICAgLy8gVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRTaXJSZXN1bHRDb2RlcyAgICBzdGF0dXNDb2RlOworICAgIHRBTklfVTggICAgICAgICAgICBzdGFJZDsgICAgICAgICAgICAgLy8gU3RhdGlvbiBJRCBmb3IgcGVlcgorI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IFdMQU5fU1RBKQorICAgIHRBbmlBdXRoVHlwZSAgICAgICBhdXRoVHlwZTsKKyNlbmRpZgorI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgIHRTaXJNYWNBZGRyICAgICAgICBhbHRlcm5hdGVCc3NJZDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBhbHRlcm5hdGVDaGFubmVsSWQ7CisjZW5kaWYKK30gdFNpclNtZVJlYXNzb2NSc3AsICp0cFNpclNtZVJlYXNzb2NSc3A7CisKKy8vLyBEZWZpbml0aW9uIGZvciBSZWFzc29jaWF0aW9uIGluZGljYXRpb24gZnJvbSBwZWVyCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lUmVhc3NvY0luZAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1JFQVNTT0NfSU5ECisgICAgdEFOSV9VMTYgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAgICAgLy8gU2Vzc2lvbiBJRAorICAgIHRTaXJNYWNBZGRyICAgICAgICAgcGVlck1hY0FkZHI7CisgICAgdFNpck1hY0FkZHIgICAgICAgICBvbGRNYWNBZGRyOworICAgIHRBTklfVTE2ICAgICAgICAgICAgYWlkOworICAgIHRTaXJNYWNBZGRyICAgICAgICAgYnNzSWQ7ICAgICAgICAgICAvLyBTZWxmIEJTU0lECisgICAgdEFOSV9VMTYgICAgICAgICAgICBzdGFJZDsgICAgICAgICAgIC8vIFN0YXRpb24gSUQgZm9yIHBlZXIKKyAgICB0QW5pQXV0aFR5cGUgICAgICAgIGF1dGhUeXBlOworICAgIHRBbmlTU0lEICAgICAgICAgICAgc3NJZDsgICAvLyBTU0lEIHVzZWQgYnkgU1RBIHRvIHJlYXNzb2NpYXRlCisgICAgdFNpclJTTmllICAgICAgICAgICByc25JRTsgIC8vIFJTTiBJRSByZWNlaXZlZCBmcm9tIHBlZXIKKworICAgIHRTaXJBZGRpZSAgICAgICAgICAgYWRkSUU7ICAvLyBBZGRpdGlvbmFsIElFIHJlY2VpdmVkIGZyb20gcGVlcgorICAgIAorI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgIHRBTklfVTE2ICAgICAgICAgICAgIHNlcU51bTsKKyAgICB0QW5pQm9vbCAgICAgICAgICAgICB3bmlJbmRpY2F0b3I7CisgICAgdEFuaUJvb2wgICAgICAgICAgICAgYnBJbmRpY2F0b3I7CisgICAgdFNpckJwSW5kaWNhdG9yVHlwZSAgYnBUeXBlOworICAgIHRTaXJBc3NvY1R5cGUgICAgICAgIHJlYXNzb2NUeXBlOyAvLyBJbmRpY2F0ZXMgd2hldGhlciBTVEEgaXMgTEInZWQgb3Igbm90CisgICAgdFNpckxvYWQgICAgICAgICAgICAgbG9hZDsgLy8gQ3VycmVudCBsb2FkIG9uIHRoZSByYWRpbyBmb3IgTEIKKyAgICB0U2lyTmVpZ2hib3JCc3NMaXN0ICBuZWlnaGJvckxpc3Q7IC8vIExpc3QgcmVjZWl2ZWQgZnJvbSBTVEEKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBjYXBhYmlsaXR5SW5mbzsgLy8gU1RBIGNhcGFiaWxpdHkKKyAgICB0U2lyTndUeXBlICAgICAgICAgICBud1R5cGU7ICAgICAgICAgICAgLy8gSW5kaWNhdGVzIDExYS9iL2cKKyNlbmRpZgorICAgIHRBbmlUaXRhbkh0Q2FwYWJpbGl0eUluZm8gdGl0YW5IdENhcHM7CisgICAgLy8gcG93ZXJDYXAgJiBzdXBwb3J0ZWRDaGFubmVscyBhcmUgcHJlc2VudCBvbmx5IHdoZW4KKyAgICAvLyBzcGVjdHJ1bU1ndEluZGljYXRvciBmbGFnIGlzIHNldAorICAgIHRBbmlCb29sICAgICAgICAgICAgICAgIHNwZWN0cnVtTWd0SW5kaWNhdG9yOworICAgIHRTaXJNYWNQb3dlckNhcEluZm8gICAgIHBvd2VyQ2FwOworICAgIHRTaXJTdXBDaG5sICAgICAgICAgICAgIHN1cHBvcnRlZENoYW5uZWxzOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAvLyBSZXF1aXJlZCBmb3IgaW5kaWNhdGluZyB0aGUgZnJhbWVzIHRvIHVwcGVyIGxheWVyCisgICAgLy8gVE9ETzogdXNlIHRoZSBhcHByb3ByaWF0ZSBuYW1lcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBvdGhlciBzaW1pbGFyIG5hbWVzIHVzZWQgYWJvdmUgZm9yIHN0YXRpb24gbW9kZSBvZiBvcGVyYXRpb24KKyAgICB0QU5JX1UzMiAgICAgICAgICAgICBiZWFjb25MZW5ndGg7CisgICAgdEFOSV9VOCogICAgICAgICAgICAgYmVhY29uUHRyOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGFzc29jUmVxTGVuZ3RoOworICAgIHRBTklfVTgqICAgICAgICAgICAgIGFzc29jUmVxUHRyOworI2VuZGlmCit9IHRTaXJTbWVSZWFzc29jSW5kLCAqdHBTaXJTbWVSZWFzc29jSW5kOworCisvLy8gRGVmaW5pdGlvbiBmb3IgUmVhc3NvY2lhdGlvbiBjb25maXJtCisvLy8gLS0tPiBNQUMKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVSZWFzc29jQ25mCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfUkVBU1NPQ19DTkYKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgICBzdGF0dXNDb2RlOworICAgIHRTaXJNYWNBZGRyICAgICAgICAgIGJzc0lkOyAgICAgICAgICAgICAvLyBTZWxmIEJTU0lECisgICAgdFNpck1hY0FkZHIgICAgICAgICAgcGVlck1hY0FkZHI7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICBhaWQ7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgYWx0ZXJuYXRlQnNzSWQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGVDaGFubmVsSWQ7Cit9IHRTaXJTbWVSZWFzc29jQ25mLCAqdHBTaXJTbWVSZWFzc29jQ25mOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQordHlwZWRlZiBlbnVtIHsKKyAgICAvLyBCYXNlZCBvbiBQZXJpb2RpYyBldmFsdWF0aW9uCisgICAgZVNJUl9QRVJJT0RJQ19FVkFMQVRJT04sCisKKyAgICAvLyBEZWN0ZWN0aW9uIG9mIHByaW1hcnkgdXNlcnMgc3VjaCBhcyBSQURBUnMKKyAgICBlU0lSX0RFVEVDVElPTl9PRl9SQURBUiwKKworICAgIC8vIERlZ3JhZGF0aW9uIGluIHN5c3RlbSBwZXJmb3JtYW5jZSAoZWcuIFRyaWdnZXJlZCBieQorICAgIC8vICBpbmNyZWFzZSBpbiBQRVIgYmV5b25kIGEgY2VydGFpbiB0aHJlc2hvbGQpCisgICAgZVNJUl9QRVJGT1JNQU5DRV9ERUdSQURBVElPTiwKKworICAgIC8vIEZyZXF1ZW5jeSBjaGFuZ2VkIGR1ZSB0byBwcmV2aW91c2x5IGlzc3VlZCBTV0lUQ0hfQ0hBTk5FTF9SRVEKKyAgICBlU0lSX1VQUEVSX0xBWUVSX1RSSUdHRVJFRAorfXRTaXJGcmVxQ2hhbmdlUmVhc29uOworI2VuZGlmCisKKy8vLyBFbnVtIGRlZmluaXRpb24gZm9yICBXaXJlbGVzcyBtZWRpdW0gc3RhdHVzIGNoYW5nZSBjb2RlcwordHlwZWRlZiBlbnVtIGVTaXJTbWVTdGF0dXNDaGFuZ2VDb2RlCit7CisgICAgZVNJUl9TTUVfREVBVVRIX0ZST01fUEVFUiwKKyAgICBlU0lSX1NNRV9ESVNBU1NPQ19GUk9NX1BFRVIsCisgICAgZVNJUl9TTUVfTE9TVF9MSU5LX1dJVEhfUEVFUiwKKyAgICBlU0lSX1NNRV9DSEFOTkVMX1NXSVRDSCwKKyAgICBlU0lSX1NNRV9KT0lORURfTkVXX0JTUywKKyAgICBlU0lSX1NNRV9MRUFWSU5HX0JTUywKKyAgICBlU0lSX1NNRV9JQlNTX0FDVElWRSwKKyAgICBlU0lSX1NNRV9JQlNTX0lOQUNUSVZFLAorICAgIGVTSVJfU01FX0lCU1NfUEVFUl9ERVBBUlRFRCwKKyAgICBlU0lSX1NNRV9SQURBUl9ERVRFQ1RFRCwKKyAgICBlU0lSX1NNRV9JQlNTX05FV19QRUVSLAorICAgIGVTSVJfU01FX0FQX0NBUFNfQ0hBTkdFRCwKKyAgICBlU0lSX1NNRV9CQUNLR1JPVU5EX1NDQU5fRkFJTCwKKyAgICBlU0lSX1NNRV9DQl9MRUdBQ1lfQlNTX0ZPVU5EX0JZX0FQLAorICAgIGVTSVJfU01FX0NCX0xFR0FDWV9CU1NfRk9VTkRfQllfU1RBCit9IHRTaXJTbWVTdGF0dXNDaGFuZ2VDb2RlOworCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lTmV3QnNzSW5mbworeworICAgIHRTaXJNYWNBZGRyICAgYnNzSWQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgIGNoYW5uZWxOdW1iZXI7CisgICAgdEFOSV9VOCAgICAgICAgICAgIHJlc2VydmVkOworICAgIHRTaXJNYWNTU2lkICAgc3NJZDsKK30gdFNpclNtZU5ld0Jzc0luZm8sICp0cFNpclNtZU5ld0Jzc0luZm87CisKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVBcE5ld0NhcHMKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgY2FwYWJpbGl0eUluZm87CisgICAgdFNpck1hY0FkZHIgICBic3NJZDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgY2hhbm5lbElkOworICAgIHRBTklfVTggICAgICAgICAgICByZXNlcnZlZFszXTsKKyAgICB0U2lyTWFjU1NpZCAgIHNzSWQ7Cit9IHRTaXJTbWVBcE5ld0NhcHMsICp0cFNpclNtZUFwTmV3Q2FwczsKKworLyoqCisgKiBUYWJsZSBiZWxvdyBpbmRpY2F0ZXMgd2hhdCBpbmZvcm1hdGlvbiBpcyBwYXNzZWQgZm9yIGVhY2ggb2YKKyAqIHRoZSBXaXJlbGVzcyBNZWRpYSBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbnM6CisgKgorICogU3RhdHVzIENoYW5nZSBjb2RlICAgICAgICAgICBTdGF0dXMgY2hhbmdlIGluZm8KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGVTSVJfU01FX0RFQVVUSF9GUk9NX1BFRVIgICAgICAgIFJlYXNvbiBjb2RlIHJlY2VpdmVkIGluIERFQVVUSCBmcmFtZQorICogZVNJUl9TTUVfRElTQVNTT0NfRlJPTV9QRUVSICAgICAgUmVhc29uIGNvZGUgcmVjZWl2ZWQgaW4gRElTQVNTT0MgZnJhbWUKKyAqIGVTSVJfU01FX0xPU1RfTElOS19XSVRIX1BFRVIgICAgIE5vbmUKKyAqIGVTSVJfU01FX0NIQU5ORUxfU1dJVENIICAgICAgICAgIE5ldyBjaGFubmVsIG51bWJlcgorICogZVNJUl9TTUVfSk9JTkVEX05FV19CU1MgICAgICAgICAgQlNTSUQsIFNTSUQgYW5kIGNoYW5uZWwgbnVtYmVyCisgKiBlU0lSX1NNRV9MRUFWSU5HX0JTUyAgICAgICAgICAgICBOb25lCisgKiBlU0lSX1NNRV9JQlNTX0FDVElWRSAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCBhbm90aGVyIFNUQSBqb2luZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCU1MgYXBhcnQgZnJvbSB0aGlzIFNUQSB0aGF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkIElCU1MKKyAqIGVTSVJfU01FX0lCU1NfSU5BQ1RJVkUgICAgICAgICAgIEluZGljYXRlcyB0aGF0IG9ubHkgdGhpcyBTVEEgaXMgbGVmdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gSUJTUworICogZVNJUl9TTUVfUkFEQVJfREVURUNURUQgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgcmFkYXIgaXMgZGV0ZWN0ZWQKKyAqIGVTSVJfU01FX0lCU1NfTkVXX1BFRVIgICAgICAgICAgIEluZGljYXRlcyB0aGF0IGEgbmV3IHBlZXIgaXMgZGV0ZWN0ZWQKKyAqIGVTSVJfU01FX0FQX0NBUFNfQ0hBTkdFRCAgICAgICAgIEluZGljYXRlcyB0aGF0IGNhcGFiaWxpdGllcyBvZiB0aGUgQVAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgU1RBIGlzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgY2hhbmdlZC4KKyAqIGVTSVJfU01FX0JBQ0tHUk9VTkRfU0NBTl9GQUlMICAgIEluZGljYXRlcyBiYWNrZ3JvdW5kIHNjYW4gZmFpbHVyZQorICovCisKKy8vLyBEZWZpbml0aW9uIGZvciBXaXJlbGVzcyBtZWRpdW0gc3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVXbVN0YXR1c0NoYW5nZU50ZgoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1dNX1NUQVRVU19DSEFOR0VfTlRGCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAgICAgLy8gU2Vzc2lvbiBJRAorICAgIHRTaXJTbWVTdGF0dXNDaGFuZ2VDb2RlIHN0YXR1c0NoYW5nZUNvZGU7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgYnNzSWQ7ICAgICAgICAgICAgIC8vIFNlbGYgQlNTSUQKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgIGRlQXV0aFJlYXNvbkNvZGU7IC8vIGVTSVJfU01FX0RFQVVUSF9GUk9NX1BFRVIKKyAgICAgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgIGRpc2Fzc29jUmVhc29uQ29kZTsgLy8gZVNJUl9TTUVfRElTQVNTT0NfRlJPTV9QRUVSCisgICAgICAgIC8vIG5vbmUgZm9yIGVTSVJfU01FX0xPU1RfTElOS19XSVRIX1BFRVIKKyAgICAgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIG5ld0NoYW5uZWxJZDsgICAvLyBlU0lSX1NNRV9DSEFOTkVMX1NXSVRDSAorICAgICAgICB0U2lyU21lTmV3QnNzSW5mbyAgIG5ld0Jzc0luZm87ICAgICAvLyBlU0lSX1NNRV9KT0lORURfTkVXX0JTUworICAgICAgICAvLyBub25lIGZvciBlU0lSX1NNRV9MRUFWSU5HX0JTUworICAgICAgICAvLyBub25lIGZvciBlU0lSX1NNRV9JQlNTX0FDVElWRQorICAgICAgICAvLyBub25lIGZvciBlU0lSX1NNRV9JQlNTX0lOQUNUSVZFCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgICAgICB0U2lyUmFkYXJJbmZvICAgICAgICAgIHJhZGFySW5mbzsgICAgICAgICAvLyBlU0lSX1NNRV9SQURBUl9ERVRFQ1RFRAorI2VuZGlmCisgICAgICAgIHRTaXJOZXdJYnNzUGVlckluZm8gICAgIG5ld0lic3NQZWVySW5mbzsgIC8vIGVTSVJfU01FX0lCU1NfTkVXX1BFRVIKKyAgICAgICAgdFNpclNtZUFwTmV3Q2FwcyAgICAgICAgYXBOZXdDYXBzOyAgICAgICAgLy8gZVNJUl9TTUVfQVBfQ0FQU19DSEFOR0VECisgICAgICAgIHRTaXJCYWNrZ3JvdW5kU2NhbkluZm8gIGJrZ25kU2NhbkluZm87ICAgIC8vIGVTSVJfU01FX0JBQ0tHUk9VTkRfU0NBTl9GQUlMCisgICAgICAgIHRBbmlUaXRhbkNCTmVpZ2hib3JJbmZvIGNiTmVpZ2hib3JzOyAgICAgIC8vIGVTSVJfU01FX0NCX0xFR0FDWV9CU1NfRk9VTkRfQllfU1RBCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgICAgIHRTaXJOZWlnaGJvckJzc1dkc0luZm8gIG5laWdoYm9yV2RzSW5mbzsgIC8vIGVTSVJfU01FX0NCX0xFR0FDWV9CU1NfRk9VTkRfQllfQVAKKyNlbmRpZgorICAgIH0gc3RhdHVzQ2hhbmdlSW5mbzsKK30gdFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmLCAqdHBTaXJTbWVXbVN0YXR1c0NoYW5nZU50ZjsKKworLy8vIERlZmluaXRpb24gZm9yIERpc2Fzc29jaWF0aW9uIHJlcXVlc3QKK3R5cGVkZWYKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCitfX2FuaV9hdHRyX3ByZV9wYWNrZWQKKyNlbmRpZgorc3RydWN0IHNTaXJTbWVEaXNhc3NvY1JlcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX0RJU0FTU09DX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICAgc2Vzc2lvbklkOyAgICAgICAgIC8vIFNlc3Npb24gSUQKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAgICAvLyBUcmFuc2FjdGlvbiBJRCBmb3IgY21kCisgICAgdFNpck1hY0FkZHIgICAgICAgICBic3NJZDsgICAgICAgICAgICAgLy8gUGVlciBCU1NJRAorICAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworICAgIHRBTklfVTE2ICAgICAgICAgcmVhc29uQ29kZTsKKyAgICB0QU5JX1U4ICAgICAgICAgIGRvTm90U2VuZE92ZXJUaGVBaXI7ICAvL1RoaXMgZmxhZyB0ZWxscyBMSU0gd2hldGhlciB0byBzZW5kIHRoZSBkaXNhc3NvYyBPVEEgb3Igbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGlzIHdpbGwgYmUgc2V0IGluIHdoaWxlIGhhbmRpbmcgb2ZmIGZyb20gb25lIEFQIHRvIG90aGVyCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgdEFOSV9VMTYgICAgICAgICBhaWQ7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgdEFOSV9VMTYgICAgICAgICBzZXFOdW07CisjZW5kaWYKKyNlbmRpZgorfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK19fYW5pX2F0dHJfcGFja2VkCisjZW5kaWYKK3RTaXJTbWVEaXNhc3NvY1JlcSwgKnRwU2lyU21lRGlzYXNzb2NSZXE7CisKKy8vLyBEZWZpbml0aW9uIGZvciBUa2lwIGNvdW50ZXJtZWFzdXJlcyByZXF1ZXN0CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJTbWVUa2lwQ250ck1lYXNSZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAgICAvLyBlV05JX1NNRV9ESVNBU1NPQ19SRVEKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHNlc3Npb25JZDsgICAgICAvLyBTZXNzaW9uIElECisgICAgdEFOSV9VMTYgICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAgLy8gVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRTaXJNYWNBZGRyICAgICAgICAgYnNzSWQ7ICAgICAgICAgIC8vIFBlZXIgQlNTSUQKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgIGJFbmFibGU7ICAgICAgICAvLyBTdGFydC9zdG9wIGNvdW50ZXJtZWFzdXJlcworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyU21lVGtpcENudHJNZWFzUmVxLCAqdHBTaXJTbWVUa2lwQ250ck1lYXNSZXE7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaTY0Qml0Q291bnRlcnMKK3sKKyAgICB0QU5JX1UzMiBIaTsKKyAgICB0QU5JX1UzMiBMbzsKK310QW5pNjRCaXRDb3VudGVycywgKnRwQW5pNjRCaXRDb3VudGVyczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVNlY3VyaXR5U3RhdAoreworICAgIHRBbmk2NEJpdENvdW50ZXJzIHR4QmxrczsKKyAgICB0QW5pNjRCaXRDb3VudGVycyByeEJsa3M7CisgICAgdEFuaTY0Qml0Q291bnRlcnMgZm9ybWF0RXJyb3JDbnQ7CisgICAgdEFuaTY0Qml0Q291bnRlcnMgZGVjcnlwdEVycjsKKyAgICB0QW5pNjRCaXRDb3VudGVycyBwcm90RXhjbENudDsKKyAgICB0QW5pNjRCaXRDb3VudGVycyB1bkRlY3J5cHRhYmxlQ250OworICAgIHRBbmk2NEJpdENvdW50ZXJzIGRlY3J5cHRPa0NudDsKKworfXRBbmlTZWN1cml0eVN0YXQsICp0cEFuaVNlY3VyaXR5U3RhdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVR4UnhDb3VudGVycworeworICAgIHRBTklfVTMyIHR4RnJhbWVzOyAvLyBJbmNyZW1lbnRlZCBmb3IgZXZlcnkgcGFja2V0IHR4CisgICAgdEFOSV9VMzIgcnhGcmFtZXM7ICAgIAorICAgIHRBTklfVTMyIG5SY3ZCeXRlczsKKyAgICB0QU5JX1UzMiBuWG1pdEJ5dGVzOworfXRBbmlUeFJ4Q291bnRlcnMsICp0cEFuaVR4UnhDb3VudGVyczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVR4UnhTdGF0cworeworICAgIHRBbmk2NEJpdENvdW50ZXJzIHR4RnJhbWVzOworICAgIHRBbmk2NEJpdENvdW50ZXJzIHJ4RnJhbWVzOworICAgIHRBbmk2NEJpdENvdW50ZXJzIG5SY3ZCeXRlczsKKyAgICB0QW5pNjRCaXRDb3VudGVycyBuWG1pdEJ5dGVzOworCit9dEFuaVR4UnhTdGF0cywqdHBBbmlUeFJ4U3RhdHM7CisKK3R5cGVkZWYgc3RydWN0IHNBbmlTZWNTdGF0cworeworICAgIHRBbmlTZWN1cml0eVN0YXQgYWVzOworICAgIHRBbmk2NEJpdENvdW50ZXJzIGFlc1JlcGxheXM7CisgICAgdEFuaVNlY3VyaXR5U3RhdCB0a2lwOworICAgIHRBbmk2NEJpdENvdW50ZXJzIHRraXBSZXBsYXlzOworICAgIHRBbmk2NEJpdENvdW50ZXJzIHRraXBNaWNFcnJvcjsKKworICAgIHRBbmlTZWN1cml0eVN0YXQgd2VwOworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX1dBUEkpICYmICFkZWZpbmVkKExJQlJBX1dBUElfU1VQUE9SVCkKKyAgICB0QW5pU2VjdXJpdHlTdGF0IHdwaTsKKyAgICB0QW5pNjRCaXRDb3VudGVycyB3cGlSZXBsYXlzOworICAgIHRBbmk2NEJpdENvdW50ZXJzIHdwaU1pY0Vycm9yOworI2VuZGlmCit9dEFuaVNlY1N0YXRzLCAqdHBBbmlTZWNTdGF0czsgICAgCisKKyNkZWZpbmUgU0lSX01BWF9SWF9DSEFJTlMgMworCit0eXBlZGVmIHN0cnVjdCBzQW5pU3RhU3RhdFN0cnVjdAoreworICAgIC8qIGZvbGxvd2luZyBzdGF0aXN0aWMgZWxlbWVudHMgdGlsbCBleHBhbmRQa3RSeENudExvIGFyZSBub3QgZmlsbGVkIHdpdGggdmFsaWQgZGF0YS4KKyAgICAgKiBUaGVzZSBhcmUga2VwdCBhcyBpdCBpcywgc2luY2UgV1NNIGlzIHVzaW5nIHRoaXMgc3RydWN0dXJlLgorICAgICAqIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSByZW1vdmVkIHdoZW5ldmVyIFdTTSBpcyB1cGRhdGVkLgorICAgICAqIFBoeXN0YXRzIGlzIHVzZWQgdG8gaG9sZCBwaHlzdGF0cyBmcm9tIEJELgorICAgICAqLworICAgIHRBTklfVTMyIHNlbnRBZXNCbGtzVWNhc3RIaTsKKyAgICB0QU5JX1UzMiBzZW50QWVzQmxrc1VjYXN0TG87CisgICAgdEFOSV9VMzIgcmVjdkFlc0Jsa3NVY2FzdEhpOworICAgIHRBTklfVTMyIHJlY3ZBZXNCbGtzVWNhc3RMbzsKKyAgICB0QU5JX1UzMiBhZXNGb3JtYXRFcnJvclVjYXN0Q250czsKKyAgICB0QU5JX1UzMiBhZXNSZXBsYXlzVWNhc3Q7CisgICAgdEFOSV9VMzIgYWVzRGVjcnlwdEVyclVjYXN0OworICAgIHRBTklfVTMyIHNpbmdsZVJldHJ5UGt0czsKKyAgICB0QU5JX1UzMiBmYWlsZWRUeFBrdHM7CisgICAgdEFOSV9VMzIgYWNrVGltZW91dHM7CisgICAgdEFOSV9VMzIgbXVsdGlSZXRyeVBrdHM7CisgICAgdEFOSV9VMzIgZnJhZ1R4Q250c0hpOworICAgIHRBTklfVTMyIGZyYWdUeENudHNMbzsKKyAgICB0QU5JX1UzMiB0cmFuc21pdHRlZFBrdHNIaTsKKyAgICB0QU5JX1UzMiB0cmFuc21pdHRlZFBrdHNMbzsKKyAgICB0QU5JX1UzMiBwaHlTdGF0SGk7IC8vVGhlc2UgYXJlIHVzZWQgdG8gZmlsbCBpbiB0aGUgcGh5c3RhdHMuCisgICAgdEFOSV9VMzIgcGh5U3RhdExvOyAvL1RoaXMgaXMgb25seSBmb3IgcHJpdmF0ZSB1c2UuCisKKyAgICB0QU5JX1UzMiB1cGxpbmtSc3NpOworICAgIHRBTklfVTMyIHVwbGlua1NpbnI7CisgICAgdEFOSV9VMzIgdXBsaW5rUmF0ZTsKKyAgICB0QU5JX1UzMiBkb3dubGlua1Jzc2k7CisgICAgdEFOSV9VMzIgZG93bmxpbmtTaW5yOworICAgIHRBTklfVTMyIGRvd25saW5rUmF0ZTsKKyAgICB0QU5JX1UzMiBuUmN2Qnl0ZXM7CisgICAgdEFOSV9VMzIgblhtaXRCeXRlczsKKworICAgIC8vIHRpdGFuIDNjIHN0YXRzCisgICAgdEFOSV9VMzIgY2h1bmtzVHhDbnRIaTsgICAgICAgICAgLy8gTnVtYmVyIG9mIENodW5rcyBUcmFuc21pdHRlZAorICAgIHRBTklfVTMyIGNodW5rc1R4Q250TG87CisgICAgdEFOSV9VMzIgY29tcFBrdFJ4Q250SGk7ICAgICAgICAgLy8gTnVtYmVyIG9mIFBhY2tldHMgUmVjZWl2ZWQgdGhhdCB3ZXJlIGFjdHVhbGx5IGNvbXByZXNzZWQKKyAgICB0QU5JX1UzMiBjb21wUGt0UnhDbnRMbzsKKyAgICB0QU5JX1UzMiBleHBhblBrdFJ4Q250SGk7ICAgICAgICAvLyBOdW1iZXIgb2YgUGFja2V0cyBSZWNlaXZlZCB0aGF0IGdvdCBleHBhbmRlZAorICAgIHRBTklfVTMyIGV4cGFuUGt0UnhDbnRMbzsKKworCisgICAgLyogRm9sbG93aW5nIGVsZW1lbnRzIGFyZSB2YWxpZCBhbmQgZmlsbGVkIGluIGNvcnJlY3RseS4gVGhleSBoYXZlIHZhbGlkIHZhbHVlcy4KKyAgICAgKi8KKworICAgIC8vVW5pY2FzdCBmcmFtZXMgYW5kIGJ5dGVzLgorICAgIHRBbmlUeFJ4U3RhdHMgdWNTdGF0czsKKworICAgIC8vQnJvYWRjYXN0IGZyYW1lcyBhbmQgYnl0ZXMuCisgICAgdEFuaVR4UnhTdGF0cyBiY1N0YXRzOworCisgICAgLy9NdWx0aWNhc3QgZnJhbWVzIGFuZCBieXRlcy4KKyAgICB0QW5pVHhSeFN0YXRzIG1jU3RhdHM7CisKKyAgICB0QU5JX1UzMiAgICAgIGN1cnJlbnRUeFJhdGU7IAorICAgIHRBTklfVTMyICAgICAgY3VycmVudFJ4UmF0ZTsgLy9SYXRlIGluIDEwMEticHMKKworICAgIHRBTklfVTMyICAgICAgbWF4VHhSYXRlOworICAgIHRBTklfVTMyICAgICAgbWF4UnhSYXRlOworCisgICAgdEFOSV9TOCAgICAgICByc3NpW1NJUl9NQVhfUlhfQ0hBSU5TXTsgCisKKworICAgIHRBbmlTZWNTdGF0cyAgIHNlY3VyaXR5U3RhdHM7CisKKyAgICB0QU5JX1U4ICAgICAgIGN1cnJlbnRSeFJhdGVJZHg7IC8vVGhpcyB0aGUgc29mdG1hYyByYXRlIEluZGV4LgorICAgIHRBTklfVTggICAgICAgY3VycmVudFR4UmF0ZUlkeDsKKworfSB0QW5pU3RhU3RhdFN0cnVjdCwgKnRwQW5pU3RhU3RhdFN0cnVjdDsKKworLy9TdGF0aXN0aWNzIHRoYXQgYXJlIG5vdCBtYWludGFpbmVkIHBlciBzdGF0aW9ucy4KK3R5cGVkZWYgc3RydWN0IHNBbmlHbG9iYWxTdGF0U3RydWN0Cit7CisgIHRBbmk2NEJpdENvdW50ZXJzIHR4RXJyb3I7CisgIHRBbmk2NEJpdENvdW50ZXJzIHJ4RXJyb3I7CisgIHRBbmk2NEJpdENvdW50ZXJzIHJ4RHJvcE5vQnVmZmVyOworICB0QW5pNjRCaXRDb3VudGVycyByeERyb3BEdXA7CisgIHRBbmk2NEJpdENvdW50ZXJzIHJ4Q1JDRXJyb3I7CisKKyAgdEFuaTY0Qml0Q291bnRlcnMgc2luZ2xlUmV0cnlQa3RzOworICB0QW5pNjRCaXRDb3VudGVycyBmYWlsZWRUeFBrdHM7CisgIHRBbmk2NEJpdENvdW50ZXJzIGFja1RpbWVvdXRzOworICB0QW5pNjRCaXRDb3VudGVycyBtdWx0aVJldHJ5UGt0czsKKyAgdEFuaTY0Qml0Q291bnRlcnMgZnJhZ1R4Q250czsKKyAgdEFuaTY0Qml0Q291bnRlcnMgZnJhZ1J4Q250czsKKworICB0QW5pNjRCaXRDb3VudGVycyB0eFJUU1N1Y2Nlc3M7CisgIHRBbmk2NEJpdENvdW50ZXJzIHR4Q1RTU3VjY2VzczsKKyAgdEFuaTY0Qml0Q291bnRlcnMgcnhSVFNTdWNjZXNzOworICB0QW5pNjRCaXRDb3VudGVycyByeENUU1N1Y2Nlc3M7CisKKyAgdEFuaVNlY1N0YXRzICAgICAgc2VjdXJpdHlTdGF0czsKKworICB0QW5pVHhSeFN0YXRzICAgICBtY1N0YXRzOworICB0QW5pVHhSeFN0YXRzICAgICBiY1N0YXRzOworICAgIAorfXRBbmlHbG9iYWxTdGF0U3RydWN0LCp0cEFuaUdsb2JhbFN0YXRTdHJ1Y3Q7CisKK3R5cGVkZWYgZW51bSBzUGFja2V0VHlwZQoreworICAgIGVQQUNLRVRfVFlQRV9VTktOT1dOLAorICAgIGVQQUNLRVRfVFlQRV8xMUEsCisgICAgZVBBQ0tFVF9UWVBFXzExRywKKyAgICBlUEFDS0VUX1RZUEVfMTFCLAorICAgIGVQQUNLRVRfVFlQRV8xMU4KKworfXRQYWNrZXRUeXBlLCAqdHBQYWNrZXRUeXBlOworCit0eXBlZGVmIHN0cnVjdCBzQW5pU3RhdFN1bW1hcnlTdHJ1Y3QKK3sKKyAgICB0QW5pVHhSeFN0YXRzIHVjOyAvL1VuaWNhc3QgY291bnRlcnMuCisgICAgdEFuaVR4UnhTdGF0cyBiYzsgLy9Ccm9hZGNhc3QgY291bnRlcnMuCisgICAgdEFuaVR4UnhTdGF0cyBtYzsgLy9NdWx0aWNhc3QgY291bnRlcnMuCisgICAgdEFuaTY0Qml0Q291bnRlcnMgdHhFcnJvcjsKKyAgICB0QW5pNjRCaXRDb3VudGVycyByeEVycm9yOworICAgIHRBTklfUzggICAgIHJzc2lbU0lSX01BWF9SWF9DSEFJTlNdOyAvL0ZvciBlYWNoIGNoYWluLgorICAgIHRBTklfVTMyICAgIHJ4UmF0ZTsgLy8gUnggcmF0ZSBvZiB0aGUgbGFzdCByZWNlaXZlZCBwYWNrZXQuCisgICAgdEFOSV9VMzIgICAgdHhSYXRlOworICAgIHRBTklfVTE2ICAgIHJ4TUNTSWQ7IC8vTUNTIGluZGV4IGlzIHZhbGlkIG9ubHkgd2hlbiBwYWNrZXQgdHlwZSBpcyBlUEFDS0VUX1RZUEVfMTFOCisgICAgdEFOSV9VMTYgICAgdHhNQ1NJZDsKKyAgICB0UGFja2V0VHlwZSByeFBhY2tldFR5cGU7CisgICAgdFBhY2tldFR5cGUgdHhQYWNrZXRUeXBlOworICAgIHRTaXJNYWNBZGRyIG1hY0FkZHI7IC8vTWFjIEFkZHJlc3Mgb2YgdGhlIHN0YXRpb24gZnJvbSB3aGljaCBhYm92ZSBSU1NJIGFuZCByYXRlIGlzIGZyb20uCit9dEFuaVN0YXRTdW1tYXJ5U3RydWN0LCp0cEFuaVN0YXRTdW1tYXJ5U3RydWN0OworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gV0xBTl9TVEEpCisvL3N0cnVjdHVyZSBmb3Igc3RhdHMgdGhhdCBtYXkgYmUgcmVzZXQsIGxpa2UgdGhlIG9uZXMgaW4gc3RhIGRlc2NyaXB0b3IKKy8vVGhlIHN0YXRzIGFyZSBzYXZlZCBpbnRvIGhlcmUgYmVmb3JlIHJlc2V0LiBJdCBzaG91bGQgYmUgdEFOSV9VMzIgYWxpZ25lZC4KK3R5cGVkZWYgc3RydWN0IF9zUGVybVN0YVN0YXRzCit7CisgICAgLy90QU5JX1UzMiBzZW50QWVzQmxrc1VjYXN0SGk7CisgICAgLy90QU5JX1UzMiBzZW50QWVzQmxrc1VjYXN0TG87CisgICAgLy90QU5JX1UzMiByZWN2QWVzQmxrc1VjYXN0SGk7CisgICAgLy90QU5JX1UzMiByZWN2QWVzQmxrc1VjYXN0TG87CisgICAgdEFOSV9VMzIgYWVzRm9ybWF0RXJyb3JVY2FzdENudHM7CisgICAgdEFOSV9VMzIgYWVzUmVwbGF5c1VjYXN0OworICAgIHRBTklfVTMyIGFlc0RlY3J5cHRFcnJVY2FzdDsKKyAgICB0QU5JX1UzMiBzaW5nbGVSZXRyeVBrdHM7CisgICAgdEFOSV9VMzIgZmFpbGVkVHhQa3RzOworICAgIHRBTklfVTMyIGFja1RpbWVvdXRzOworICAgIHRBTklfVTMyIG11bHRpUmV0cnlQa3RzOworICAgIHRBTklfVTMyIGZyYWdUeENudHNIaTsKKyAgICB0QU5JX1UzMiBmcmFnVHhDbnRzTG87CisgICAgdEFOSV9VMzIgdHJhbnNtaXR0ZWRQa3RzSGk7CisgICAgdEFOSV9VMzIgdHJhbnNtaXR0ZWRQa3RzTG87CisKKyAgICAvLyB0aXRhbiAzYyBzdGF0cworICAgIHRBTklfVTMyIGNodW5rc1R4Q250SGk7ICAgICAgICAgIC8vIE51bWJlciBvZiBDaHVua3MgVHJhbnNtaXR0ZWQKKyAgICB0QU5JX1UzMiBjaHVua3NUeENudExvOworICAgIHRBTklfVTMyIGNvbXBQa3RSeENudEhpOyAgICAgICAgIC8vIE51bWJlciBvZiBQYWNrZXRzIFJlY2VpdmVkIHRoYXQgd2VyZSBhY3R1YWxseSBjb21wcmVzc2VkCisgICAgdEFOSV9VMzIgY29tcFBrdFJ4Q250TG87CisgICAgdEFOSV9VMzIgZXhwYW5Qa3RSeENudEhpOyAgICAgICAgLy8gTnVtYmVyIG9mIFBhY2tldHMgUmVjZWl2ZWQgdGhhdCBnb3QgZXhwYW5kZWQKKyAgICB0QU5JX1UzMiBleHBhblBrdFJ4Q250TG87Cit9dFBlcm1hbmVudFN0YVN0YXRzOworCisjZW5kaWYvLyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBXTEFOX1NUQSkKKworCisKKy8vLyBEZWZpbml0aW9uIGZvciBEaXNhc3NvY2lhdGlvbiByZXNwb25zZQordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZURpc2Fzc29jUnNwCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9ESVNBU1NPQ19SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAgICAgLy8gU2Vzc2lvbiBJRAorICAgIHRBTklfVTE2ICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAgICAgLy8gVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRTaXJSZXN1bHRDb2RlcyAgICBzdGF0dXNDb2RlOworICAgIHRTaXJNYWNBZGRyICAgICAgICBwZWVyTWFjQWRkcjsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1UxNiAgICAgICAgICAgYWlkOworI2VuZGlmCisgICAgdEFuaVN0YVN0YXRTdHJ1Y3QgIHBlclN0YVN0YXRzOyAvLyBTVEEgc3RhdHMKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgdEFOSV9VMTYgICAgICAgICAgIHN0YUlkOworI2VuZGlmICAgICAKK30KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCitfX2FuaV9hdHRyX3BhY2tlZAorI2VuZGlmCisgdFNpclNtZURpc2Fzc29jUnNwLCAqdHBTaXJTbWVEaXNhc3NvY1JzcDsKKworLy8vIERlZmluaXRpb24gZm9yIERpc2Fzc29jaWF0aW9uIGluZGljYXRpb24gZnJvbSBwZWVyCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lRGlzYXNzb2NJbmQKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9ESVNBU1NPQ19JTkQKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHNlc3Npb25JZDsgIC8vIFNlc3Npb24gSWRlbnRpZmllcgorICAgIHRBTklfVTE2ICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgICAvLyBUcmFuc2FjdGlvbiBJZGVudGlmaWVyIHdpdGggUEUKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgIHN0YXR1c0NvZGU7CisgICAgdFNpck1hY0FkZHIgICAgICAgICBic3NJZDsgICAgICAgICAgICAKKyAgICB0U2lyTWFjQWRkciAgICAgICAgIHBlZXJNYWNBZGRyOworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgIHRBTklfVTE2ICAgICAgICAgICAgYWlkOworI2VuZGlmCisgICAgdEFuaVN0YVN0YXRTdHJ1Y3QgIHBlclN0YVN0YXRzOyAvLyBTVEEgc3RhdHMKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgdEFOSV9VMTYgICAgICAgICAgICBzdGFJZDsKKyNlbmRpZgorfSB0U2lyU21lRGlzYXNzb2NJbmQsICp0cFNpclNtZURpc2Fzc29jSW5kOworCisvLy8gRGVmaW5pdGlvbiBmb3IgRGlzYXNzb2NpYXRpb24gY29uZmlybQorLy8vIE1BQyAtLS0+Cit0eXBlZGVmIHN0cnVjdCBzU2lyU21lRGlzYXNzb2NDbmYKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9ESVNBU1NPQ19DTkYKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgIHN0YXR1c0NvZGU7CisgICAgdFNpck1hY0FkZHIgICAgICAgICBic3NJZDsgICAgICAgICAgICAKKyAgICB0U2lyTWFjQWRkciAgICAgICAgIHBlZXJNYWNBZGRyOworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgIHRBTklfVTE2ICAgICAgICAgICAgYWlkOworI2VuZGlmCit9IHRTaXJTbWVEaXNhc3NvY0NuZiwgKnRwU2lyU21lRGlzYXNzb2NDbmY7CisKKy8vLyBEZWZpbml0aW9uIGZvciBEZWF1dGhldGljYXRpb24gcmVxdWVzdAordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZURlYXV0aFJlcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgbWVzc2FnZVR5cGU7ICAgLy8gZVdOSV9TTUVfREVBVVRIX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICAgc2Vzc2lvbklkOyAgICAgLy8gU2Vzc2lvbiBJRAorICAgIHRBTklfVTE2ICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgLy8gVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRTaXJNYWNBZGRyICAgICAgICAgYnNzSWQ7ICAgICAgICAgLy8gQVAgQlNTSUQKKyAgICB0U2lyTWFjQWRkciAgICAgICAgIHBlZXJNYWNBZGRyOworICAgIHRBTklfVTE2ICAgICAgICAgICAgcmVhc29uQ29kZTsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1UxNiAgICAgICAgIGFpZDsKKyNlbmRpZgorfSB0U2lyU21lRGVhdXRoUmVxLCAqdHBTaXJTbWVEZWF1dGhSZXE7CisKKy8vLyBEZWZpbml0aW9uIGZvciBEZWF1dGhldGljYXRpb24gcmVzcG9uc2UKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVEZWF1dGhSc3AKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfREVBVVRIX1JTUAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHNlc3Npb25JZDsgICAgICAgICAvLyBTZXNzaW9uIElECisgICAgdEFOSV9VMTYgICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAgICAgLy8gVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRTaXJSZXN1bHRDb2RlcyAgICAgc3RhdHVzQ29kZTsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgcGVlck1hY0FkZHI7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgYWlkOworI2VuZGlmCit9IHRTaXJTbWVEZWF1dGhSc3AsICp0cFNpclNtZURlYXV0aFJzcDsKKworLy8vIERlZmluaXRpb24gZm9yIERlYXV0aGV0aWNhdGlvbiBpbmRpY2F0aW9uIGZyb20gcGVlcgordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZURlYXV0aEluZAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX0RFQVVUSF9JTkQKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgc2Vzc2lvbklkOyAgICAgICAvL0FkZGVkIGZvciBCVC1BTVAKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAvL0FkZGVkIGZvciBCVC1BTVAKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgIHN0YXR1c0NvZGU7CisgICAgdFNpck1hY0FkZHIgICAgICAgICBic3NJZDsvLyBBUCBCU1NJRAorICAgIHRTaXJNYWNBZGRyICAgICAgICAgcGVlck1hY0FkZHI7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgdEFOSV9VMTYgICAgICAgICAgICBhaWQ7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHN0YUlkOworI2VuZGlmCit9IHRTaXJTbWVEZWF1dGhJbmQsICp0cFNpclNtZURlYXV0aEluZDsKKworLy8vIERlZmluaXRpb24gZm9yIERlYXV0aGVudGljYXRpb24gY29uZmlybQorLy8vIE1BQyAtLS0+Cit0eXBlZGVmIHN0cnVjdCBzU2lyU21lRGVhdXRoQ25mCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX0RFQVVUSF9DTkYKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdFNpclJlc3VsdENvZGVzICAgICBzdGF0dXNDb2RlOworICAgIHRTaXJNYWNBZGRyICAgICAgICAgYnNzSWQ7ICAgICAgICAgICAgIC8vIEFQIEJTU0lECisgICAgdFNpck1hY0FkZHIgICAgICAgIHBlZXJNYWNBZGRyOworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGFpZDsKKyNlbmRpZgorfSB0U2lyU21lRGVhdXRoQ25mLCAqdHBTaXJTbWVEZWF1dGhDbmY7CisKKy8vLyBEZWZpbml0aW9uIGZvciBzdG9wIEJTUyByZXF1ZXN0IG1lc3NhZ2UKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTdG9wQnNzUmVxCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7ICAgIC8vIGVXTklfU01FX1NUT1BfQlNTX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHNlc3Npb25JZDsgICAgICAvL1Nlc3Npb24gSUQKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAvL3RyYW5TYWN0aW9uIElEIGZvciBjbWQKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgICAgICByZWFzb25Db2RlOworICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgIGJzc0lkOyAgICAgICAgICAvL1NlbGYgQlNTSUQKK30gdFNpclNtZVN0b3BCc3NSZXEsICp0cFNpclNtZVN0b3BCc3NSZXE7CisKKy8vLyBEZWZpbml0aW9uIGZvciBzdG9wIEJTUyByZXNwb25zZSBtZXNzYWdlCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lU3RvcEJzc1JzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9TVE9QX0JTU19SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBsZW5ndGg7CisgICAgdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAgICAgLy8gU2Vzc2lvbiBJRAorICAgIHRBTklfVTE2ICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgICAgIC8vIFRyYW5zYWN0aW9uIElEIGZvciBjbWQKK30gdFNpclNtZVN0b3BCc3NSc3AsICp0cFNpclNtZVN0b3BCc3NSc3A7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisvLy8gRGVmaW5pdGlvbiBmb3IgQ2hhbm5lbCBTZWxlY3QgcmVxdWVzdAorLy8vIC0tLT4gTUFDCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lU2VsZWN0Q2hhbm5lbFJlcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9TRUxFQ1RfQ0hMX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAgICAvLyBUcmFuc2FjdGlvbiBJRCBmb3IgY21kCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgY2hhbm5lbElkOworfSB0U2lyU21lU2VsZWN0Q2hhbm5lbFJlcSwgKnRwU2lyU21lU2VsZWN0Q2hhbm5lbFJlcTsKKworLy8vIERlZmluaXRpb24gZm9yIENoYW5uZWwgU2VsZWN0IHJlc3BvbnNlCisvLy8gTUFDIC0tLT4KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTZWxlY3RDaGFubmVsUnNwCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1NFTEVDVF9DSExfUlNQCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICBzdGF0dXNDb2RlOworICAgIHRBTklfVTE2ICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgICAgIC8vIFRyYW5zYWN0aW9uIElEIGZvciBjbWQKK30gdFNpclNtZVNlbGVjdENoYW5uZWxSc3AsICp0cFNpclNtZVNlbGVjdENoYW5uZWxSc3A7CisKKy8vLyBEZWZpbml0aW9uIGZvciBDaGFubmVsIFN3aXRjaCByZXF1ZXN0CisvLy8gLS0tPiBNQUMKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTd2l0Y2hDaGFubmVsUmVxCit7CisgICAgLy8gZVdOSV9TTUVfU1dJVENIX0NITF9SRVEsCisgICAgLy8gZVdOSV9TTUVfU1dJVENIX0NITF9DQl9QUklNQVJZX1JFUSwKKyAgICAvLyBlV05JX1NNRV9TV0lUQ0hfQ0hMX0NCX1NFQ09OREFSWV9SRVEKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZTsKKworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAgICAvLyBUcmFuc2FjdGlvbiBJRCBmb3IgY21kCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgY2hhbm5lbElkOworICAgIC8vCisgICAgLy8gVGhlIGNiTW9kZSBmaWVsZCBpcyBhcHBsaWNhYmxlIHRvIFRJVEFOIG9ubHkuCisgICAgLy8gVGhpcyBpbmRpY2F0ZXMgYXMgdG8gaG93IHRoZSBDQiBzZWNvbmRhcnkKKyAgICAvLyBjaGFubmVsIHdpbGwgYmUgdXNlZCAoaWYgYXQgYWxsKS4KKyAgICAvLworICAgIC8vIEluIGEgbm9uLUNCIGVudmlyb25tZW50LCB3aXRoIDExSCBlbmFibGVkLAorICAgIC8vIHRoaXMgZmllbGQgd2lsbCBiZSBpZ25vcmVkCisgICAgLy8KKyAgICB0QW5pQ0JTZWNvbmRhcnlNb2RlIGNiTW9kZTsKKworICAgIC8vIGR0aW1GYWN0b3IgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgRFRJTQorICAgIC8vIEJlYWNvbiBiZWZvcmUgTElNIHN3aXRjaGVzIGNoYW5uZWwKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBkdGltRmFjdG9yOworfSB0U2lyU21lU3dpdGNoQ2hhbm5lbFJlcSwgKnRwU2lyU21lU3dpdGNoQ2hhbm5lbFJlcTsKKworLy8vIERlZmluaXRpb24gZm9yIENoYW5uZWwgU3dpdGNoIHJlc3BvbnNlCisvLy8gTUFDIC0tLT4KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTd2l0Y2hDaGFubmVsUnNwCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1NXSVRDSF9DSExfUlNQCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICBzdGF0dXNDb2RlOworICAgIHRBTklfVTE2ICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgICAgIC8vIFRyYW5zYWN0aW9uIElEIGZvciBjbWQKK30gdFNpclNtZVN3aXRjaENoYW5uZWxSc3AsICp0cFNpclNtZVN3aXRjaENoYW5uZWxSc3A7CisKKyNlbmRpZgorCisKKy8vLyBEZWZpbml0aW9uIGZvciBDaGFubmVsIFN3aXRjaCBpbmRpY2F0aW9uIGZvciBzdGF0aW9uCisvLy8gTUFDIC0tLT4KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTd2l0Y2hDaGFubmVsSW5kCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1NXSVRDSF9DSExfUkVRCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNlc3Npb25JZDsKKyAgICB0QU5JX1UxNiAgICBuZXdDaGFubmVsSWQ7CisgICAgdFNpck1hY0FkZHIgICAgICAgIGJzc0lkOyAgICAgIC8vIEJTU0lECit9IHRTaXJTbWVTd2l0Y2hDaGFubmVsSW5kLCAqdHBTaXJTbWVTd2l0Y2hDaGFubmVsSW5kOworCisvLy8gRGVmaW5pdGlvbiBmb3IgVUxBIGNvbXBsZXRlIGluZGljYXRpb24gbWVzc2FnZQordHlwZWRlZiBzdHJ1Y3Qgc2lyVWxhQ29tcGxldGVJbmQKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9VTEFfQ09NUExFVEVfSU5ECisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICBzdGF0dXNDb2RlOworICAgIHRTaXJNYWNBZGRyICAgICAgICBwZWVyTWFjQWRkcjsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhaWQ7CisjZW5kaWYKK30gdFNpclVsYUNvbXBsZXRlSW5kLCAqdHBTaXJVbGFDb21wbGV0ZUluZDsKKworLy8vIERlZmluaXRpb24gZm9yIFVMQSBjb21wbGV0ZSBjb25maXJtYXRpb24gbWVzc2FnZQordHlwZWRlZiBzdHJ1Y3Qgc2lyVWxhQ29tcGxldGVDbmYKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9VTEFfQ09NUExFVEVfQ05GCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICBzdGF0dXNDb2RlOworICAgIHRTaXJNYWNBZGRyICAgICAgICBwZWVyTWFjQWRkcjsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhaWQ7CisjZW5kaWYKK30gdFNpclVsYUNvbXBsZXRlQ25mLCAqdHBTaXJVbGFDb21wbGV0ZUNuZjsKKworLy8vIERlZmluaXRpb24gZm9yIE5laWdoYm9yIEJTUyBpbmRpY2F0aW9uCisvLy8gTUFDIC0tLT4KKy8vLyBNQUMgcmVwb3J0cyB0aGlzIGVhY2ggdGltZSBhIG5ldyBJL0JTUyBpcyBkZXRlY3RlZAordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZU5laWdoYm9yQnNzSW5kCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9ORUlHSEJPUl9CU1NfSU5ECisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0U2lyTmVpZ2hib3JCc3NJbmZvICAgIG5laWdoYm9ySW5mbzsKKyAgICB0U2lyV2RzSW5mbyAgICAgICAgICAgIHdkc0luZm87CisjZWxzZQorICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAgICAgYnNzRGVzY3JpcHRpb25bMV07CisjZW5kaWYKK30gdFNpclNtZU5laWdoYm9yQnNzSW5kLCAqdHBTaXJTbWVOZWlnaGJvckJzc0luZDsKKworLy8vIERlZmluaXRpb24gZm9yIE1JQyBmYWlsdXJlIGluZGljYXRpb24KKy8vLyBNQUMgLS0tPgorLy8vIE1BQyByZXBvcnRzIHRoaXMgZWFjaCB0aW1lIGEgTUlDIGZhaWx1cmUgb2NjdXJlcyBvbiBSeCBUS0lQIHBhY2tldAordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZU1pY0ZhaWx1cmVJbmQKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX01JQ19GQUlMVVJFX0lORAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgIGJzc0lkOyAgICAgICAgICAgICAvLyBCU1NJRAorICAgIHRTaXJNaWNGYWlsdXJlSW5mbyAgICAgaW5mbzsKK30gdFNpclNtZU1pY0ZhaWx1cmVJbmQsICp0cFNpclNtZU1pY0ZhaWx1cmVJbmQ7CisKKworLy8vIERlZmluaXRpb24gZm9yIFNldCBDb250ZXh0IHJlcXVlc3QKKy8vLyAtLS0+IE1BQwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZVNldENvbnRleHRSZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1NFVF9DT05URVhUX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgc2Vzc2lvbklkOyAgLy9TZXNzaW9uIElECisgICAgdEFOSV9VMTYgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7IC8vVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRTaXJNYWNBZGRyICAgICAgICBwZWVyTWFjQWRkcjsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgYnNzSWQ7ICAgICAgLy8gQlNTSUQKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhaWQ7CisjZW5kaWYKKyAgICAvLyBUQkQgRm9sbG93aW5nIFFPUyBmaWVsZHMgdG8gYmUgdW5jb21tZW50ZWQKKyAgICAvL3RBbmlCb29sICAgICAgICAgICBxb3NJbmZvUHJlc2VudDsKKyAgICAvL3RTaXJRb3MgICAgICAgICAgICBxb3M7CisgICAgdFNpcktleU1hdGVyaWFsICAgIGtleU1hdGVyaWFsOworfSB0U2lyU21lU2V0Q29udGV4dFJlcSwgKnRwU2lyU21lU2V0Q29udGV4dFJlcTsKKworLy8vIERlZmluaXRpb24gZm9yIFNldCBDb250ZXh0IHJlc3BvbnNlCisvLy8gTUFDIC0tLT4KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTZXRDb250ZXh0UnNwCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX1NFVF9DT05URVhUX1JTUAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHNlc3Npb25JZDsgICAgICAgICAvLyBTZXNzaW9uIElECisgICAgdEFOSV9VMTYgICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAgICAgLy8gVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRTaXJSZXN1bHRDb2RlcyAgICAgc3RhdHVzQ29kZTsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICBwZWVyTWFjQWRkcjsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhaWQ7CisjZW5kaWYKK30gdFNpclNtZVNldENvbnRleHRSc3AsICp0cFNpclNtZVNldENvbnRleHRSc3A7CisKKy8vLyBEZWZpbml0aW9uIGZvciBSZW1vdmUgS2V5IENvbnRleHQgcmVxdWVzdAorLy8vIC0tLT4gTUFDCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lUmVtb3ZlS2V5UmVxCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7ICAgIC8vIGVXTklfU01FX1JFTU9WRV9LRVlfUkVRCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICAgc2Vzc2lvbklkOyAgICAgICAgIC8vIFNlc3Npb24gSUQKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAgICAvLyBUcmFuc2FjdGlvbiBJRCBmb3IgY21kCisgICAgdFNpck1hY0FkZHIgICAgICAgICBic3NJZDsgICAgICAgICAgICAgLy8gQlNTSUQKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICBwZWVyTWFjQWRkcjsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhaWQ7CisjZW5kaWYKKyAgICB0QU5JX1U4ICAgIGVkVHlwZTsKKyAgICB0QU5JX1U4ICAgIHdlcFR5cGU7CisgICAgdEFOSV9VOCAgICBrZXlJZDsKKyAgICB0QU5JX0JPT0xFQU4gdW5pY2FzdDsKK30gdFNpclNtZVJlbW92ZUtleVJlcSwgKnRwU2lyU21lUmVtb3ZlS2V5UmVxOworCisvLy8gRGVmaW5pdGlvbiBmb3IgUmVtb3ZlIEtleSBDb250ZXh0IHJlc3BvbnNlCisvLy8gTUFDIC0tLT4KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVSZW1vdmVLZXlSc3AKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfUkVNT1ZFX0tFWV9SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQ7ICAgICAgICAgLy8gU2Vzc2lvbiBJRAorICAgIHRBTklfVTE2ICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgICAgIC8vIFRyYW5zYWN0aW9uIElEIGZvciBjbWQKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgIHN0YXR1c0NvZGU7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgcGVlck1hY0FkZHI7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgYWlkOworI2VuZGlmCit9IHRTaXJTbWVSZW1vdmVLZXlSc3AsICp0cFNpclNtZVJlbW92ZUtleVJzcDsKKworLy8vIERlZmluaXRpb24gZm9yIFNldCBQb3dlciByZXF1ZXN0CisvLy8gLS0tPiBNQUMKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTZXRQb3dlclJlcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9TRVRfUE9XRVJfUkVRCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTE2ICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgICAgIC8vIFRyYW5zYWN0aW9uIElEIGZvciBjbWQKKyAgICB0QU5JX1M4ICAgICAgICAgICAgICAgICBwb3dlckxldmVsOworfSB0U2lyU21lU2V0UG93ZXJSZXEsICp0cFNpclNtZVNldFBvd2VyUmVxOworCisvLy8gRGVmaW5pdGlvbiBmb3IgU2V0IFBvd2VyIHJlc3BvbnNlCisvLy8gTUFDIC0tLT4KK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTZXRQb3dlclJzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9TRVRfUE9XRVJfUlNQCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICBzdGF0dXNDb2RlOworICAgIHRBTklfVTE2ICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgICAgIC8vIFRyYW5zYWN0aW9uIElEIGZvciBjbWQKK30gdFNpclNtZVNldFBvd2VyUnNwLCAqdHBTaXJTbWVTZXRQb3dlclJzcDsKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKy8vLyBEZWZpbml0aW9uIGZvciBDbGllbnQgU2lkZSBMb2FkIEJhbGFuY2luZyByZXF1ZXN0CisvLy8gLS0tPiBNQUMKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVTZXRDbGllbnRMb2FkQmFsYW5jZVJlcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9DTElFTlRfTE9BRF9CQUxBTkNFX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAgICAvLyBUcmFuc2FjdGlvbiBJRCBmb3IgY21kCisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgYWx0ZXJuYXRlQnNzSWQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlQ2hhbm5lbElkOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIG51bWJlclN0YXM7Cit9IHRTaXJTbWVDbGllbnRMb2FkQmFsYW5jZVJlcSwgKnRwU2lyU21lQ2xpZW50TG9hZEJhbGFuY2VSZXE7CisKKy8vLyBEZWZpbml0aW9uIGZvciBDbGllbnQgU2lkZSBMb2FkIEJhbGFuY2luZyByZXNwb25zZQorLy8vIE1BQyAtLS0+Cit0eXBlZGVmIHN0cnVjdCBzU2lyU21lU2V0Q2xpZW50TG9hZEJhbGFuY2VSc3AKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfQ0xJRU5UX0xPQURfQkFMQU5DRV9SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VMTYgICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAgICAgLy8gVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRTaXJSZXN1bHRDb2RlcyAgICAgICAgIHN0YXR1c0NvZGU7Cit9IHRTaXJTbWVDbGllbnRMb2FkQmFsYW5jZVJzcCwgKnRwU2lyU21lQ2xpZW50TG9hZEJhbGFuY2VSc3A7CisjZW5kaWYKKworLy8vIERlZmluaXRpb24gZm9yIExpbmsgVGVzdCBTdGFydCByZXNwb25zZQorLy8vIE1BQyAtLS0+Cit0eXBlZGVmIHN0cnVjdCBzU2lyU21lTGlua1Rlc3RTdGFydFJzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9MSU5LX1RFU1RfU1RBUlRfUlNQCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJNYWNBZGRyICAgICAgICBwZWVyTWFjQWRkcjsKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgc3RhdHVzQ29kZTsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhaWQ7CisjZW5kaWYKK30gdFNpclNtZUxpbmtUZXN0U3RhcnRSc3AsICp0cFNpclNtZUxpbmtUZXN0U3RhcnRSc3A7CisKKy8vLyBEZWZpbml0aW9uIGZvciBMaW5rIFRlc3QgU3RvcCByZXNwb25zZQorLy8vIFdTTSAtLS0+IE1BQwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZUxpbmtUZXN0U3RvcFJzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9MSU5LX1RFU1RfU1RPUF9SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdFNpck1hY0FkZHIgICAgICAgIHBlZXJNYWNBZGRyOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICBzdGF0dXNDb2RlOworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGFpZDsKKyNlbmRpZgorfSB0U2lyU21lTGlua1Rlc3RTdG9wUnNwLCAqdHBTaXJTbWVMaW5rVGVzdFN0b3BSc3A7CisKKy8vLyBEZWZpbml0aW9uIGZvciBraWNrIHN0YXJ0aW5nIERGUyBtZWFzdXJlbWVudHMKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVERlNyZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfREZTX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7ICAgICAvLyBUcmFuc2FjdGlvbiBJRCBmb3IgY21kCit9IHRTaXJTbWVERlNyZXF1ZXN0LCAqdHBTaXJTbWVERlNyZXF1ZXN0OworCisvLy8gRGVmaW5pdGlvbiBmb3IgcmVzcG9uc2UgbWVzc2FnZSB0byBwcmV2aW91c2x5CisvLy8gaXNzdWVkIERGUyByZXF1ZXN0Cit0eXBlZGVmIHN0cnVjdCBzU2lyU21lREZTcnNwCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX0RGU19SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBsZW5ndGg7CisgICAgdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisgICAgdEFOSV9VMTYgICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAgICAgLy8gVHJhbnNhY3Rpb24gSUQgZm9yIGNtZAorICAgIHRBTklfVTMyICAgICAgICAgICAgIGRmc1JlcG9ydFsxXTsKK30gdFNpclNtZURGU3JzcCwgKnRwU2lyU21lREZTcnNwOworCisvLy8gU3RhdGlzdGljIGRlZmluaXRpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFBlciBTVEEgc3RhdGlzdGljIHN0cnVjdHVyZTsgVGhpcyBzYW1lIHN0cnVjdCB3aWxsIGJlIHVzZWQgZm9yIEFnZ3JlZ2F0ZQorLy8gU1RBIHN0YXRzIGFzIHdlbGwuCisKKy8vIENsZWFyIHJhZGlvIHN0YXRzIGFuZCBjbGVhciBwZXIgc3RhIHN0YXRzCit0eXBlZGVmIGVudW0KK3sKKyAgICBlQU5JX0NMRUFSX0FMTF9TVEFUUywgLy8gQ2xlYXJzIGFsbCBzdGF0cworICAgIGVBTklfQ0xFQVJfUlhfU1RBVFMsICAvLyBDbGVhcnMgUlggc3RhdGlzdGljcyBvZiB0aGUgcmFkaW8gaW50ZXJmYWNlCisgICAgZUFOSV9DTEVBUl9UWF9TVEFUUywgIC8vIENsZWFycyBUWCBzdGF0aXN0aWNzIG9mIHRoZSByYWRpbyBpbnRlcmZhY2UKKyAgICBlQU5JX0NMRUFSX1JBRElPX1NUQVRTLCAgIC8vIENsZWFycyBhbGwgdGhlIHJhZGlvIHN0YXRzCisgICAgZUFOSV9DTEVBUl9QRVJfU1RBX1NUQVRTLCAvLyBDbGVhcnMgUGVyIFNUQSBzdGF0cworICAgIGVBTklfQ0xFQVJfQUdHUl9QRVJfU1RBX1NUQVRTLCAvLyBDbGVhcnMgYWdncmVnYXRlIHN0YXRzCisKKyAgICAvLyBVc2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gcGVyIHN0YSB0byBzZWN1cml0eSBzdGF0cy4KKyAgICAvLyBVc2VkIG9ubHkgYnkgQVAsIEZXIGp1c3QgcmV0dXJucyB0aGUgc2FtZSBwYXJhbWV0ZXIgYXMgaXQgcmVjZWl2ZWQuCisgICAgZUFOSV9MSU5LX1NUQVRTLCAgICAgLy8gR2V0IFBlciBTVEEgc3RhdHMKKyAgICBlQU5JX1NFQ1VSSVRZX1NUQVRTLCAvLyBHZXQgUGVyIFNUQSBzZWN1cml0eSBzdGF0cworCisgICAgZUFOSV9DTEVBUl9TVEFUX1RZUEVTX0VORAorfSB0QW5pU3RhdFN1YlR5cGVzOworCit0eXBlZGVmIHN0cnVjdCBzQW5pVHhDdHJzCit7CisgICAgLy8gYWRkIHRoZSByYXRlIGNvdW50ZXJzIGhlcmUKKyAgICB0QU5JX1UzMiB0eDFNYnBzOworICAgIHRBTklfVTMyIHR4Mk1icHM7CisgICAgdEFOSV9VMzIgdHg1XzVNYnBzOworICAgIHRBTklfVTMyIHR4Nk1icHM7CisgICAgdEFOSV9VMzIgdHg5TWJwczsKKyAgICB0QU5JX1UzMiB0eDExTWJwczsKKyAgICB0QU5JX1UzMiB0eDEyTWJwczsKKyAgICB0QU5JX1UzMiB0eDE4TWJwczsKKyAgICB0QU5JX1UzMiB0eDI0TWJwczsKKyAgICB0QU5JX1UzMiB0eDM2TWJwczsKKyAgICB0QU5JX1UzMiB0eDQ4TWJwczsKKyAgICB0QU5JX1UzMiB0eDU0TWJwczsKKyAgICB0QU5JX1UzMiB0eDcyTWJwczsKKyAgICB0QU5JX1UzMiB0eDk2TWJwczsKKyAgICB0QU5JX1UzMiB0eDEwOE1icHM7CisKKyAgICAvLyB0eCBwYXRoIHJhZGlvIGNvdW50cworICAgIHRBTklfVTMyIHR4RnJhZ0hpOworICAgIHRBTklfVTMyIHR4RnJhZ0xvOworICAgIHRBTklfVTMyIHR4RnJhbWVIaTsKKyAgICB0QU5JX1UzMiB0eEZyYW1lTG87CisgICAgdEFOSV9VMzIgdHhNdWx0aWNhc3RGcmFtZUhpOworICAgIHRBTklfVTMyIHR4TXVsdGljYXN0RnJhbWVMbzsKKyAgICB0QU5JX1UzMiB0eEZhaWxlZEhpOworICAgIHRBTklfVTMyIHR4RmFpbGVkTG87CisgICAgdEFOSV9VMzIgbXVsdGlwbGVSZXRyeUhpOworICAgIHRBTklfVTMyIG11bHRpcGxlUmV0cnlMbzsKKyAgICB0QU5JX1UzMiBzaW5nbGVSZXRyeUhpOworICAgIHRBTklfVTMyIHNpbmdsZVJldHJ5TG87CisgICAgdEFOSV9VMzIgYWNrRmFpbHVyZUhpOworICAgIHRBTklfVTMyIGFja0ZhaWx1cmVMbzsKKyAgICB0QU5JX1UzMiB4bWl0QmVhY29uczsKKworICAgIC8vIHRpdGFuIDNjIHN0YXRzCisgICAgdEFOSV9VMzIgdHhDYkVzY1BrdENudEhpOyAgICAgICAgICAgIC8vIFRvdGFsIE51bWJlciBvZiBDaGFubmVsIEJvbmRlZC9Fc2NvcnQgUGFja2V0IFRyYW5zbWl0dGVkCisgICAgdEFOSV9VMzIgdHhDYkVzY1BrdENudExvOworICAgIHRBTklfVTMyIHR4Q2h1bmtzQ250SGk7ICAgICAgICAgICAgICAvLyBUb3RhbCBOdW1iZXIgb2YgQ2h1bmtzIFRyYW5zbWl0dGVkCisgICAgdEFOSV9VMzIgdHhDaHVua3NDbnRMbzsKKyAgICB0QU5JX1UzMiB0eENvbXBQa3RDbnRIaTsgICAgICAgICAgICAgLy8gVG90YWwgTnVtYmVyIG9mIENvbXByZXNzc2VkIFBhY2tldCBUcmFuc21pdHRlZAorICAgIHRBTklfVTMyIHR4Q29tcFBrdENudExvOworICAgIHRBTklfVTMyIHR4NTBQZXJDb21wUGt0Q250SGk7ICAgICAgICAvLyBUb3RhbCBOdW1iZXIgb2YgUGFja2V0cyB3aXRoIDUwJSBvciBtb3JlIGNvbXByZXNzaW9uCisgICAgdEFOSV9VMzIgdHg1MFBlckNvbXBQa3RDbnRMbzsKKyAgICB0QU5JX1UzMiB0eEV4cGFuUGt0Q250SGk7ICAgICAgICAgICAgLy8gVG90YWwgTnVtYmVyIG9mIFBhY2tldHMgVHJhbnNtaXR0ZWQgdGhhdCBnb3QgZXhwYW5kZWQKKyAgICB0QU5JX1UzMiB0eEV4cGFuUGt0Q250TG87Cit9IHRBbmlUeEN0cnMsICp0cEFuaVR4Q3RyczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVJ4Q3RycworeworICAgIC8vIHJlY2VpdmUgZnJhbWUgcmF0ZSBjb3VudGVycworICAgIHRBTklfVTMyIHJ4MU1icHM7CisgICAgdEFOSV9VMzIgcngyTWJwczsKKyAgICB0QU5JX1UzMiByeDVfNU1icHM7CisgICAgdEFOSV9VMzIgcng2TWJwczsKKyAgICB0QU5JX1UzMiByeDlNYnBzOworICAgIHRBTklfVTMyIHJ4MTFNYnBzOworICAgIHRBTklfVTMyIHJ4MTJNYnBzOworICAgIHRBTklfVTMyIHJ4MThNYnBzOworICAgIHRBTklfVTMyIHJ4MjRNYnBzOworICAgIHRBTklfVTMyIHJ4MzZNYnBzOworICAgIHRBTklfVTMyIHJ4NDhNYnBzOworICAgIHRBTklfVTMyIHJ4NTRNYnBzOworICAgIHRBTklfVTMyIHJ4NzJNYnBzOworICAgIHRBTklfVTMyIHJ4OTZNYnBzOworICAgIHRBTklfVTMyIHJ4MTA4TWJwczsKKworICAgIC8vIHJlY2VpdmUgc2l6ZSBjb3VudGVyczsgJ0x0ZScgPSBMZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgICB0QU5JX1UzMiByeEx0ZTY0OworICAgIHRBTklfVTMyIHJ4THRlMTI4R3Q2NDsKKyAgICB0QU5JX1UzMiByeEx0ZTI1Nkd0MTI4OworICAgIHRBTklfVTMyIHJ4THRlNTEyR3QyNTY7CisgICAgdEFOSV9VMzIgcnhMdGUxa0d0NTEyOworICAgIHRBTklfVTMyIHJ4THRlMTUxOEd0MWs7CisgICAgdEFOSV9VMzIgcnhMdGUya0d0MTUxODsKKyAgICB0QU5JX1UzMiByeEx0ZTRrR3QyazsKKworICAgIC8vIHJ4IHJhZGlvIHN0YXRzCisgICAgdEFOSV9VMzIgcnhGcmFnOworICAgIHRBTklfVTMyIHJ4RnJhbWU7CisgICAgdEFOSV9VMzIgZmNzRXJyb3I7CisgICAgdEFOSV9VMzIgcnhNdWx0aWNhc3Q7CisgICAgdEFOSV9VMzIgZHVwbGljYXRlOworICAgIHRBTklfVTMyIHJ0c1N1Y2Nlc3M7CisgICAgdEFOSV9VMzIgcnRzRmFpbGVkOworICAgIHRBTklfVTMyIHdlcFVuZGVjcnlwdGFibGVzOworICAgIHRBTklfVTMyIGRyb3BzOworICAgIHRBTklfVTMyIGFlc0Zvcm1hdEVycm9yVWNhc3RDbnRzOworICAgIHRBTklfVTMyIGFlc1JlcGxheXNVY2FzdDsKKyAgICB0QU5JX1UzMiBhZXNEZWNyeXB0RXJyVWNhc3Q7CisKKyAgICAvLyB0aXRhbiAzYyBzdGF0cworICAgIHRBTklfVTMyIHJ4RGVjb21wUGt0Q250SGk7ICAgICAgICAgICAvLyBUb3RhbCBOdW1iZXIgb2YgUGFja2V0cyB0aGF0IGdvdCBkZWNvbXByZXNzZWQKKyAgICB0QU5JX1UzMiByeERlY29tcFBrdENudExvOworICAgIHRBTklfVTMyIHJ4Q29tcFBrdENudEhpOyAgICAgICAgICAgICAvLyBUb3RhbCBOdW1iZXIgb2YgUGFja2V0cyByZWNlaXZlZCB0aGF0IHdlcmUgYWN0dWFsbHkgY29tcHJlc3NlZAorICAgIHRBTklfVTMyIHJ4Q29tcFBrdENudExvOworICAgIHRBTklfVTMyIHJ4RXhwYW5Qa3RDbnRIaTsgICAgICAgICAgICAvLyBUb3RhbCBOdW1iZXIgb2YgUGFja2V0cyByZWNlaXZlZCB0aGF0IGdvdCBleHBhbmRlZAorICAgIHRBTklfVTMyIHJ4RXhwYW5Qa3RDbnRMbzsKK30gdEFuaVJ4Q3RycywgKnRwQW5pUnhDdHJzOworCisvLyBSYWRpbyBzdGF0cwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVJhZGlvU3RhdHMKK3sKKyAgICB0QW5pVHhDdHJzIHR4OworICAgIHRBbmlSeEN0cnMgcng7Cit9IHRBbmlSYWRpb1N0YXRzLCAqdHBBbmlSYWRpb1N0YXRzOworCisvLyBHZXQgUmFkaW8gU3RhdHMgcmVxdWVzdCBzdHJ1Y3R1cmUKKy8vIFRoaXMgc3RydWN0dXJlIHNoYWxsIGJlIHVzZWQgZm9yIGJvdGggUmFkaW8gc3RhdHMgYW5kIEFnZ3JlZ2F0ZSBzdGF0cworLy8gQSB2YWxpZCByZXF1ZXN0IG11c3QgY29udGFpbiBlbnRpcmUgc3RydWN0dXJlIHdpdGgvd2l0aG91dCB2YWxpZCBmaWVsZHMuCisvLyBCYXNlZCBvbiB0aGUgcmVxdWVzdCB0eXBlLCB0aGUgdmFsaWQgZmllbGRzIHdpbGwgYmUgY2hlY2tlZC4KK3R5cGVkZWYgc3RydWN0IHNBbmlHZXRTdGF0c1JlcQoreworICAgIC8vIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXF1ZXN0cworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1zZ1R5cGU7ICAgIC8vIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtc2dMZW47ICAgICAvLyBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOyAgLy9TZXNzaW9uIElECisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICBic3NJZDsgICAgICAvL0JTU0lECisgICAgLy8gb25seSB1c2VkIGZvciBjbGVhciBzdGF0cyBhbmQgcGVyIHN0YSBzdGF0cyBjbGVhcgorICAgIHRBbmlTdGF0U3ViVHlwZXMgICAgICAgIHN0YXQ7ICAgLy8gQ2xlYXJzIHRoZSBzdGF0cyBvZiB0aGUgZGVzY3JpYmVkIHR5cGVzLgorICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIHN0YUlkOyAgLy8gUGVyIFNUQSBzdGF0cyByZXF1ZXN0IG11c3QgY29udGFpbiB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIG1hY0FkZHJbNl07Cit9IHRBbmlHZXRTdGF0c1JlcSwgKnRwQW5pR2V0U3RhdHNSZXE7CisKKy8vIEdldCBSYWRpbyBTdGF0cyByZXNwb25zZSBzdHJ1Y3QKK3R5cGVkZWYgc3RydWN0IHNBbmlHZXRSYWRpb1N0YXRzUnNwCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICB0eXBlOyAgIC8vIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIG1zZ0xlbjsgLy8gbGVuZ3RoIG9mIHRoZSBlbnRpcmUgcmVxdWVzdAorICAgIHRBTklfVTMyICAgICAgICAgICAgcmM7CisgICAgdEFOSV9VMTYgICAgICAgICAgICB0cmFuc2FjdGlvbklkOworICAgIHRBbmlSYWRpb1N0YXRzIHJhZGlvOworfSB0QW5pR2V0UmFkaW9TdGF0c1JzcCwgKnRwQW5pR2V0UmFkaW9TdGF0c1JzcDsKKworLy8gUGVyIFN0YSBzdGF0cyByZXNwb25zZSBzdHJ1Y3QKK3R5cGVkZWYgc3RydWN0IHNBbmlHZXRQZXJTdGFTdGF0c1JzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgdHlwZTsgICAvLyBtZXNzYWdlIHR5cGUgaXMgc2FtZSBhcyB0aGUgcmVxdWVzdCB0eXBlCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICBtc2dMZW47IC8vIGxlbmd0aCBvZiB0aGUgZW50aXJlIHJlcXVlc3QKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgIHJjOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsKKyAgICB0QW5pU3RhdFN1YlR5cGVzICBzdGF0OyAgIC8vIFN1YiB0eXBlIG5lZWRlZCBieSBBUC4gUmV0dXJucyB0aGUgc2FtZSB2YWx1ZQorICAgIHRBbmlTdGFTdGF0U3RydWN0IHN0YTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgIHN0YUlkOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgbWFjQWRkcls2XTsKK30gdEFuaUdldFBlclN0YVN0YXRzUnNwLCAqdHBBbmlHZXRQZXJTdGFTdGF0c1JzcDsKKworLy8gR2V0IEFnZ3JlZ2F0ZSBzdGF0cwordHlwZWRlZiBzdHJ1Y3Qgc0FuaUdldEFnZ3JTdGFTdGF0c1JzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgdHlwZTsgICAvLyBtZXNzYWdlIHR5cGUgaXMgc2FtZSBhcyB0aGUgcmVxdWVzdCB0eXBlCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICBtc2dMZW47IC8vIGxlbmd0aCBvZiB0aGUgZW50aXJlIHJlcXVlc3QKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgIHJjOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsKKyAgICB0QW5pU3RhU3RhdFN0cnVjdCBzdGE7Cit9IHRBbmlHZXRBZ2dyU3RhU3RhdHNSc3AsICp0cEFuaUdldEFnZ3JTdGFTdGF0c1JzcDsKKworLy8gQ2xlYXIgc3RhdHMgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugc3RydWN0dXJlLiAncmMnIGZpZWxkIGlzIHVudXNlZCBpbgorLy8gcmVxdWVzdCBhbmQgdGhpcyBmaWVsZCBpcyB1c2VkIGluIHJlc3BvbnNlIGZpZWxkLgordHlwZWRlZiBzdHJ1Y3Qgc0FuaUNsZWFyU3RhdHNSc3AKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICB0eXBlOyAgIC8vIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtc2dMZW47IC8vIGxlbmd0aCBvZiB0aGUgZW50aXJlIHJlcXVlc3QKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICByYzsgICAgIC8vIHJldHVybiBjb2RlIC0gd2lsbCBiZSBmaWxsZWQgYnkgRlcgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZS4KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSB0cmFuc2FjdGlvbiBJRCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBGVworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7CisgICAgdEFuaVN0YXRTdWJUeXBlcyAgIHN0YXQ7ICAgICAgIC8vIENsZWFycyB0aGUgc3RhdHMgb2YgdGhlIGRlc2NyaWJlZCB0eXBlcy4KKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBzdGFJZDsgICAgICAvLyBBcHBsaWNhYmxlIG9ubHkgdG8gUEVSIFNUQSBzdGF0cyBjbGVhcmluZworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIG1hY0FkZHJbNl07IC8vIEFwcGxpY2FibGUgb25seSB0byBQRVIgU1RBIHN0YXRzIGNsZWFyaW5nCit9IHRBbmlDbGVhclN0YXRzUnNwLCAqdHBBbmlDbGVhclN0YXRzUnNwOworCit0eXBlZGVmIHN0cnVjdCBzQW5pR2V0R2xvYmFsU3RhdHNSc3AKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHR5cGU7ICAgLy8gbWVzc2FnZSB0eXBlIGlzIHNhbWUgYXMgdGhlIHJlcXVlc3QgdHlwZQorICAgIHRBTklfVTE2ICAgICAgICAgICAgbXNnTGVuOyAvLyBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0CisgICAgdEFOSV9VMzIgICAgICAgICAgICByYzsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7CisgICAgdEFuaUdsb2JhbFN0YXRTdHJ1Y3QgZ2xvYmFsOworfSB0QW5pR2V0R2xvYmFsU3RhdHNSc3AsICp0cEFuaUdldEdsb2JhbFN0YXRzUnNwOworCit0eXBlZGVmIHN0cnVjdCBzQW5pR2V0U3RhdFN1bW1hcnlSc3AKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgIHR5cGU7ICAgLy8gbWVzc2FnZSB0eXBlIGlzIHNhbWUgYXMgdGhlIHJlcXVlc3QgdHlwZQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgbXNnTGVuOyAvLyBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0IC0tV2h5PworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgcmM7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkOworICAgIHRBbmlTdGF0U3VtbWFyeVN0cnVjdCBzdGF0OworfSB0QW5pR2V0U3RhdFN1bW1hcnlSc3AsICp0cEFuaUdldFN0YXRTdW1tYXJ5UnNwOworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKy8qKioqKioqKioqKioqKioqKioqUEUgU3RhdGlzdGljcyoqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0KK3sKKyAgICBQRV9TVU1NQVJZX1NUQVRTX0lORk8gICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgICBQRV9HTE9CQUxfQ0xBU1NfQV9TVEFUU19JTkZPICAgID0gMHgwMDAwMDAwMiwKKyAgICBQRV9HTE9CQUxfQ0xBU1NfQl9TVEFUU19JTkZPICAgID0gMHgwMDAwMDAwNCwKKyAgICBQRV9HTE9CQUxfQ0xBU1NfQ19TVEFUU19JTkZPICAgID0gMHgwMDAwMDAwOCwKKyAgICBQRV9HTE9CQUxfQ0xBU1NfRF9TVEFUU19JTkZPICAgID0gMHgwMDAwMDAxMCwKKyAgICBQRV9QRVJfU1RBX1NUQVRTX0lORk8gICAgICAgICAgID0gMHgwMDAwMDAyMAorfWVQRVN0YXRzTWFzazsKKworLyoKKyAqIHRwQW5pR2V0UEVTdGF0c1JlcSBpcyB0aWVkIHRvIAorICogZm9yIFNNRSA9PT4gUEUgZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUkVRIG1zZ0lkICBhbmQgCisgKiBmb3IgUEUgPT0+IEhBTCBTSVJfSEFMX0dFVF9TVEFUSVNUSUNTX1JFUSBtc2dJZAorICovCit0eXBlZGVmIHN0cnVjdCBzQW5pR2V0UEVTdGF0c1JlcQoreworICAgIC8vIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXF1ZXN0cworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1zZ1R5cGU7ICAgIC8vIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtc2dMZW47ICAvLyBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgc3RhSWQ7ICAvLyBQZXIgU1RBIHN0YXRzIHJlcXVlc3QgbXVzdCBjb250YWluIHZhbGlkCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgc3RhdHNNYXNrOyAgLy8gY2F0ZWdvcmllcyBvZiBzdGF0cyByZXF1ZXN0ZWQuIGxvb2sgYXQgZVBFU3RhdHNNYXNrCit9IHRBbmlHZXRQRVN0YXRzUmVxLCAqdHBBbmlHZXRQRVN0YXRzUmVxOworCisvKgorICogdHBBbmlHZXRQRVN0YXRzUnNwIGlzIHRpZWQgdG8gCisgKiBmb3IgUEUgPT0+IFNNRSBlV05JX1NNRV9HRVRfU1RBVElTVElDU19SU1AgbXNnSWQgIGFuZCAKKyAqIGZvciBIQUwgPT0+IFBFIFNJUl9IQUxfR0VUX1NUQVRJU1RJQ1NfUlNQIG1zZ0lkCisgKi8KK3R5cGVkZWYgc3RydWN0IHNBbmlHZXRQRVN0YXRzUnNwCit7CisgICAgLy8gQ29tbW9uIGZvciBhbGwgdHlwZXMgYXJlIHJlc3BvbnNlcworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1zZ1R5cGU7ICAgIC8vIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtc2dMZW47ICAvLyBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0LCBpbmNsdWRlcyB0aGUgcFN0YXRzQnVmIGxlbmd0aCB0b28KKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIHJjOyAgICAgICAgIC8vc3VjY2Vzcy9mYWlsdXJlCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgc3RhSWQ7ICAvLyBQZXIgU1RBIHN0YXRzIHJlcXVlc3QgbXVzdCBjb250YWluIHZhbGlkCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgc3RhdHNNYXNrOyAgLy8gY2F0ZWdvcmllcyBvZiBzdGF0cyByZXF1ZXN0ZWQuIGxvb2sgYXQgZVBFU3RhdHNNYXNrCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8vdm9pZCAgICAgICAgICAgICAgICAgICpwU3RhdHNCdWY7CisgICAgVGhlIFN0YXRzIGJ1ZmZlciBzdGFydHMgaGVyZSBhbmQgY2FuIGJlIGFuIGFnZ3JlZ2F0ZSBvZiBtb3JlIHRoYW4gb25lIHN0YXRpc3RpY3MgCisgICAgc3RydWN0dXJlIGRlcGVuZGluZyBvbiBzdGF0c01hc2suVGhlIHZvaWQgcG9pbnRlciAicFN0YXRzQnVmIiBpcyBjb21tZW50ZWQgb3V0IAorICAgIGludGVudGlvbmFsbHkgYW5kIHRoZSBzcmMgY29kZSB0aGF0IHVzZXMgdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIHRha2UgdGhhdCBpbnRvIGFjY291bnQuIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9IHRBbmlHZXRQRVN0YXRzUnNwLCAqdHBBbmlHZXRQRVN0YXRzUnNwOworCit0eXBlZGVmIHN0cnVjdCBzQW5pR2V0UnNzaVJlcQoreworICAgIC8vIENvbW1vbiBmb3IgYWxsIHR5cGVzIGFyZSByZXF1ZXN0cworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1zZ1R5cGU7ICAgIC8vIG1lc3NhZ2UgdHlwZSBpcyBzYW1lIGFzIHRoZSByZXF1ZXN0IHR5cGUKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBtc2dMZW47ICAvLyBsZW5ndGggb2YgdGhlIGVudGlyZSByZXF1ZXN0CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHN0YUlkOyAgCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnJzc2lDYWxsYmFjazsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcERldkNvbnRleHQ7IC8vZGV2aWNlIGNvbnRleHQKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcFZvc0NvbnRleHQ7IC8vdm9zcyBjb250ZXh0CisgICAgCit9IHRBbmlHZXRSc3NpUmVxLCAqdHBBbmlHZXRSc3NpUmVxOworCisvKiBDaGFuZ2UgY291bnRyeSBjb2RlIHJlcXVlc3QgTVNHIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0FuaUNoYW5nZUNvdW50cnlDb2RlUmVxCit7CisgICAgLy8gQ29tbW9uIGZvciBhbGwgdHlwZXMgYXJlIHJlcXVlc3RzCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbXNnVHlwZTsgICAgLy8gbWVzc2FnZSB0eXBlIGlzIHNhbWUgYXMgdGhlIHJlcXVlc3QgdHlwZQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1zZ0xlbjsgICAgIC8vIGxlbmd0aCBvZiB0aGUgZW50aXJlIHJlcXVlc3QKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZVtXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU5dOyAgIC8vMyBjaGFyIGNvdW50cnkgY29kZQorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpjaGFuZ2VDQ0NhbGxiYWNrOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwRGV2Q29udGV4dDsgLy9kZXZpY2UgY29udGV4dAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwVm9zQ29udGV4dDsgLy92b3NzIGNvbnRleHQKKyAgICAKK30gdEFuaUNoYW5nZUNvdW50cnlDb2RlUmVxLCAqdHBBbmlDaGFuZ2VDb3VudHJ5Q29kZVJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVN1bW1hcnlTdGF0c0luZm8KK3sKKyAgICB0QU5JX1UzMiByZXRyeV9jbnRbNF07ICAgICAgICAgLy9Ub3RhbCBudW1iZXIgb2YgcGFja2V0cyhwZXIgQUMpIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgd2l0aCByZXRyaWVzCisgICAgdEFOSV9VMzIgbXVsdGlwbGVfcmV0cnlfY250WzRdOy8vVGhlIG51bWJlciBvZiBNU0RVIHBhY2tldHMgYW5kIE1NUERVIGZyYW1lcyBwZXIgQUMgdGhhdCB0aGUgODAyLjExIAorICAgIC8vIHN0YXRpb24gc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkIGFmdGVyIG1vcmUgdGhhbiBvbmUgcmV0cmFuc21pc3Npb24gYXR0ZW1wdAorCisgICAgdEFOSV9VMzIgdHhfZnJtX2NudFs0XTsgICAgICAgIC8vVG90YWwgbnVtYmVyIG9mIHBhY2tldHMocGVyIEFDKSB0aGF0IHdlcmUgc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyh3aXRoIGFuZCB3aXRob3V0IHJldHJpZXMsIGluY2x1ZGluZyBtdWx0aS1jYXN0LCBicm9hZGNhc3QpICAgICAKKyAgICAvL3RBTklfVTMyIHR4X2ZhaWxfY250OworICAgIC8vdEFOSV9VMzIgbnVtX3J4X2ZybV9jcmNfZXJyOyAgIC8vVG90YWwgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYW1lcyB3aXRoIENSQyBFcnJvcgorICAgIC8vdEFOSV9VMzIgbnVtX3J4X2ZybV9jcmNfb2s7ICAgIC8vVG90YWwgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBmcmFtZXMgd2l0aCBvdXQgQ1JDIEVycm9yCisgICAgdEFOSV9VMzIgcnhfZnJtX2NudDsgICAgICAgICAgIC8vVG90YWwgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZXJlIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8oYWZ0ZXIgYXBwcm9wcmlhdGUgZmlsdGVyIHJ1bGVzIGluY2x1ZGluZyBtdWx0aS1jYXN0LCBicm9hZGNhc3QpICAgIAorICAgIHRBTklfVTMyIGZybV9kdXBfY250OyAgICAgICAgICAvL1RvdGFsIG51bWJlciBvZiBkdXBsaWNhdGUgZnJhbWVzIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseQorICAgIHRBTklfVTMyIGZhaWxfY250WzRdOyAgICAgICAgICAvL1RvdGFsIG51bWJlciBwYWNrZXRzKHBlciBBQykgZmFpbGVkIHRvIHRyYW5zbWl0CisgICAgdEFOSV9VMzIgcnRzX2ZhaWxfY250OyAgICAgICAgIC8vVG90YWwgbnVtYmVyIG9mIFJUUy9DVFMgc2VxdWVuY2UgZmFpbHVyZXMgZm9yIHRyYW5zbWlzc2lvbiBvZiBhIHBhY2tldAorICAgIHRBTklfVTMyIGFja19mYWlsX2NudDsgICAgICAgICAvL1RvdGFsIG51bWJlciBwYWNrZXRzIGZhaWxlZCB0cmFuc21pdCBiZWNhdXNlIG9mIG5vIEFDSyBmcm9tIHRoZSByZW1vdGUgZW50aXR5CisgICAgdEFOSV9VMzIgcnRzX3N1Y2NfY250OyAgICAgICAgIC8vVG90YWwgbnVtYmVyIG9mIFJUUy9DVFMgc2VxdWVuY2Ugc3VjY2VzcyBmb3IgdHJhbnNtaXNzaW9uIG9mIGEgcGFja2V0IAorICAgIHRBTklfVTMyIHJ4X2Rpc2NhcmRfY250OyAgICAgICAvL1RoZSBzdW0gb2YgdGhlIHJlY2VpdmUgZXJyb3IgY291bnQgYW5kIGRyb3BwZWQtcmVjZWl2ZS1idWZmZXIgZXJyb3IgY291bnQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0hBTCB3aWxsIHByb3ZpZGUgdGhpcyBhcyBhIHN1bSBvZiAoRkNTIGVycm9yKSArIChGYWlsIGdldCBCRC9QRFUgaW4gSFcpCisgICAgdEFOSV9VMzIgcnhfZXJyb3JfY250OyAgICAgICAgIC8vVGhlIHJlY2VpdmUgZXJyb3IgY291bnQuIEhBTCB3aWxsIHByb3ZpZGUgdGhlIFJ4UCBGQ1MgZXJyb3IgZ2xvYmFsIGNvdW50ZXIuCisgICAgdEFOSV9VMzIgdHhfYnl0ZV9jbnQ7ICAgICAgICAgIC8vVGhlIHN1bSBvZiB0aGUgdHJhbnNtaXQtZGlyZWN0ZWQgYnl0ZSBjb3VudCwgdHJhbnNtaXQtbXVsdGljYXN0IGJ5dGUgY291bnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHRyYW5zbWl0LWJyb2FkY2FzdCBieXRlIGNvdW50LiBIQUwgd2lsbCBzdW0gVFBFIFVDL01DL0JDQVNUIGdsb2JhbCBjb3VudGVycyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90byBwcm92aWRlIHRoaXMuCisjaWYgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgLy9wcm92aWRpbmcgdGhlIGZvbGxvd2luZyBzdGF0cywgaW4gY2FzZSBvZiB3cmFwIGFyb3VuZCBmb3IgdHhfYnl0ZV9jbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHRBTklfVTMyIHR4X3VuaWNhc3RfbG93ZXJfYnl0ZV9jbnQ7CisgICAgdEFOSV9VMzIgdHhfdW5pY2FzdF91cHBlcl9ieXRlX2NudDsKKyAgICB0QU5JX1UzMiB0eF9tdWx0aWNhc3RfbG93ZXJfYnl0ZV9jbnQ7CisgICAgdEFOSV9VMzIgdHhfbXVsdGljYXN0X3VwcGVyX2J5dGVfY250OworICAgIHRBTklfVTMyIHR4X2Jyb2FkY2FzdF9sb3dlcl9ieXRlX2NudDsKKyAgICB0QU5JX1UzMiB0eF9icm9hZGNhc3RfdXBwZXJfYnl0ZV9jbnQ7CisjZW5kaWYKKworfXRBbmlTdW1tYXJ5U3RhdHNJbmZvLCAqdHBBbmlTdW1tYXJ5U3RhdHNJbmZvOworCit0eXBlZGVmIGVudW0gZVR4UmF0ZUluZm8KK3sKKyAgIGVIQUxfVFhfUkFURV9MRUdBQ1kgPSAweDEsICAgIC8qIExlZ2FjeSByYXRlcyAqLworICAgZUhBTF9UWF9SQVRFX0hUMjAgICA9IDB4MiwgICAgLyogSFQyMCByYXRlcyAqLworICAgZUhBTF9UWF9SQVRFX0hUNDAgICA9IDB4NCwgICAgLyogSFQ0MCByYXRlcyAqLworICAgZUhBTF9UWF9SQVRFX1NHSSAgICA9IDB4OCwgICAgLyogUmF0ZSB3aXRoIFNob3J0IGd1YXJkIGludGVydmFsICovCisgICBlSEFMX1RYX1JBVEVfTEdJICAgID0gMHgxMCAgICAvKiBSYXRlIHdpdGggTG9uZyBndWFyZCBpbnRlcnZhbCAqLworfSB0VHhyYXRlaW5mb2ZsYWdzOworCit0eXBlZGVmIHN0cnVjdCBzQW5pR2xvYmFsQ2xhc3NBU3RhdHNJbmZvCit7CisgICAgdEFOSV9VMzIgcnhfZnJhZ19jbnQ7ICAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiBNUERVIGZyYW1lcyByZWNlaXZlZCBieSB0aGUgODAyLjExIHN0YXRpb24gZm9yIE1TRFUgcGFja2V0cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL29yIE1NUERVIGZyYW1lcworICAgIHRBTklfVTMyIHByb21pc2N1b3VzX3J4X2ZyYWdfY250OyAvL1RoZSBudW1iZXIgb2YgTVBEVSBmcmFtZXMgcmVjZWl2ZWQgYnkgdGhlIDgwMi4xMSBzdGF0aW9uIGZvciBNU0RVIHBhY2tldHMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vciBNTVBEVSBmcmFtZXMgd2hlbiBhIHByb21pc2N1b3VzIHBhY2tldCBmaWx0ZXIgd2FzIGVuYWJsZWQKKyAgICAvL3RBTklfVTMyIHJ4X2Zjc19lcnI7ICAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgTVBEVSBmcmFtZXMgdGhhdCB0aGUgODAyLjExIHN0YXRpb24gcmVjZWl2ZWQgd2l0aCBGQ1MgZXJyb3JzCisgICAgdEFOSV9VMzIgcnhfaW5wdXRfc2Vuc2l0aXZpdHk7ICAgIC8vVGhlIHJlY2VpdmVyIGlucHV0IHNlbnNpdGl2aXR5IHJlZmVyZW5jZWQgdG8gYSBGRVIgb2YgOCUgYXQgYW4gTVBEVSBsZW5ndGggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vZiAxMDI0IGJ5dGVzIGF0IHRoZSBhbnRlbm5hIGNvbm5lY3Rvci4gRWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSBzaGFsbCBjb3JyZXNwb25kIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gYSBzdXBwb3J0ZWQgcmF0ZSBhbmQgdGhlIG9yZGVyIHNoYWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBzdXBwb3J0ZVJhdGVzIHBhcmFtZXRlci4KKyAgICB0QU5JX1UzMiBtYXhfcHdyOyAgICAgICAgICAgICAgICAgLy9UaGUgbWF4aW11bSB0cmFuc21pdCBwb3dlciBpbiBkQm0gdXB0byBvbmUgZGVjaW1hbC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIGVnOiBpZiBpdCBpcyAxMC41ZEJtLCB0aGUgdmFsdWUgd291bGQgYmUgMTA1IAorICAgIC8vdEFOSV9VMzIgZGVmYXVsdF9wd3I7ICAgICAgICAgICAgIC8vVGhlIG5vbWluYWwgdHJhbnNtaXQgbGV2ZWwgdXNlZCBhZnRlciBub3JtYWwgcG93ZXIgb24gc2VxdWVuY2UKKyAgICB0QU5JX1UzMiBzeW5jX2ZhaWxfY250OyAgICAgICAgICAgLy9OdW1iZXIgb2YgdGltZXMgdGhlIHJlY2VpdmVyIGZhaWxlZCB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZSBpbmNvbWluZyBzaWduYWwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hZnRlciBkZXRlY3RpbmcgdGhlIHN5bmMgaW4gdGhlIHByZWFtYmxlIG9mIHRoZSB0cmFuc21pdHRlZCBQTENQIHByb3RvY29sIGRhdGEgdW5pdC4gCisgICAgdEFOSV9VMzIgdHhfcmF0ZTsgICAgICAgICAgICAgICAgLy9MZWdhY3kgdHJhbnNtaXQgcmF0ZSwgaW4gdW5pdHMgb2YgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy81MDAga2JpdC9zZWMsIGZvciB0aGUgbW9zdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JlY2VudGx5IHRyYW5zbWl0dGVkIGZyYW1lIAorICAgIHRBTklfVTMyICBtY3NfaW5kZXg7ICAgICAgICAgICAgIC8vbWNzIGluZGV4IGZvciBIVDIwIGFuZCBIVDQwIHJhdGVzCisgICAgdEFOSV9VMzIgIHR4X3JhdGVfZmxhZ3M7ICAgICAgICAgLy90byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gSFQyMCBhbmQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9IVDQwIHJhdGVzOyAgc2hvcnQgYW5kIGxvbmcgZ3VhcmQgaW50ZXJ2YWwKKworfXRBbmlHbG9iYWxDbGFzc0FTdGF0c0luZm8sICp0cEFuaUdsb2JhbENsYXNzQVN0YXRzSW5mbzsKKworCit0eXBlZGVmIHN0cnVjdCBzQW5pR2xvYmFsU2VjdXJpdHlTdGF0cworeworICAgIHRBTklfVTMyIHJ4X3dlcF91bmVuY3J5cHRlZF9mcm1fY250OyAvL1RoZSBudW1iZXIgb2YgdW5lbmNyeXB0ZWQgcmVjZWl2ZWQgTVBEVSBmcmFtZXMgdGhhdCB0aGUgTUFDIGxheWVyIGRpc2NhcmRlZCB3aGVuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlIElFRUUgODAyLjExIGRvdDExRXhjbHVkZVVuZW5jcnlwdGVkIG1hbmFnZW1lbnQgaW5mb3JtYXRpb24gYmFzZSAoTUlCKSBvYmplY3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pcyBlbmFibGVkCisgICAgdEFOSV9VMzIgcnhfbWljX2ZhaWxfY250OyAgICAgICAgICAgIC8vVGhlIG51bWJlciBvZiByZWNlaXZlZCBNU0RVIHBhY2tldHMgdGhhdCB0aGF0IHRoZSA4MDIuMTEgc3RhdGlvbiBkaXNjYXJkZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWNhdXNlIG9mIE1JQyBmYWlsdXJlcworICAgIHRBTklfVTMyIHRraXBfaWN2X2VycjsgICAgICAgICAgICAgICAvL1RoZSBudW1iZXIgb2YgZW5jcnlwdGVkIE1QRFUgZnJhbWVzIHRoYXQgdGhlIDgwMi4xMSBzdGF0aW9uIGZhaWxlZCB0byBkZWNyeXB0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYmVjYXVzZSBvZiBhIFRLSVAgSUNWIGVycm9yCisgICAgdEFOSV9VMzIgYWVzX2NjbXBfZm9ybWF0X2VycjsgICAgICAgIC8vVGhlIG51bWJlciBvZiByZWNlaXZlZCBNUERVIGZyYW1lcyB0aGF0IHRoZSA4MDIuMTEgZGlzY2FyZGVkIGJlY2F1c2Ugb2YgYW4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbnZhbGlkIEFFUy1DQ01QIGZvcm1hdAorICAgIHRBTklfVTMyIGFlc19jY21wX3JlcGxheV9jbnQ7ICAgICAgICAvL1RoZSBudW1iZXIgb2YgcmVjZWl2ZWQgTVBEVSBmcmFtZXMgdGhhdCB0aGUgODAyLjExIHN0YXRpb24gZGlzY2FyZGVkIGJlY2F1c2Ugb2YgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGUgQUVTLUNDTVAgcmVwbGF5IHByb3RlY3Rpb24gcHJvY2VkdXJlCisgICAgdEFOSV9VMzIgYWVzX2NjbXBfZGVjcnB0X2VycjsgICAgICAgIC8vVGhlIG51bWJlciBvZiByZWNlaXZlZCBNUERVIGZyYW1lcyB0aGF0IHRoZSA4MDIuMTEgc3RhdGlvbiBkaXNjYXJkZWQgYmVjYXVzZSBvZiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vycm9ycyBkZXRlY3RlZCBieSB0aGUgQUVTLUNDTVAgZGVjcnlwdGlvbiBhbGdvcml0aG0KKyAgICB0QU5JX1UzMiB3ZXBfdW5kZWNyeXB0YWJsZV9jbnQ7ICAgICAgLy9UaGUgbnVtYmVyIG9mIGVuY3J5cHRlZCBNUERVIGZyYW1lcyByZWNlaXZlZCBmb3Igd2hpY2ggYSBXRVAgZGVjcnlwdGlvbiBrZXkgd2FzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbm90IGF2YWlsYWJsZSBvbiB0aGUgODAyLjExIHN0YXRpb24KKyAgICB0QU5JX1UzMiB3ZXBfaWN2X2VycjsgICAgICAgICAgICAgICAgLy9UaGUgbnVtYmVyIG9mIGVuY3J5cHRlZCBNUERVIGZyYW1lcyB0aGF0IHRoZSA4MDIuMTEgc3RhdGlvbiBmYWlsZWQgdG8gZGVjcnlwdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2JlY2F1c2Ugb2YgYSBXRVAgSUNWIGVycm9yCisgICAgdEFOSV9VMzIgcnhfZGVjcnlwdF9zdWNjX2NudDsgICAgICAgIC8vVGhlIG51bWJlciBvZiByZWNlaXZlZCBlbmNyeXB0ZWQgcGFja2V0cyB0aGF0IHRoZSA4MDIuMTEgc3RhdGlvbiBzdWNjZXNzZnVsbHkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kZWNyeXB0ZWQKKyAgICB0QU5JX1UzMiByeF9kZWNyeXB0X2ZhaWxfY250OyAgICAgICAgLy9UaGUgbnVtYmVyIG9mIGVuY3J5cHRlZCBwYWNrZXRzIHRoYXQgdGhlIDgwMi4xMSBzdGF0aW9uIGZhaWxlZCB0byBkZWNyeXB0CisKK310QW5pR2xvYmFsU2VjdXJpdHlTdGF0cywgKnRwQW5pR2xvYmFsU2VjdXJpdHlTdGF0czsKKyAgIAordHlwZWRlZiBzdHJ1Y3Qgc0FuaUdsb2JhbENsYXNzQlN0YXRzSW5mbworeworICAgIHRBbmlHbG9iYWxTZWN1cml0eVN0YXRzIHVjU3RhdHM7CisgICAgdEFuaUdsb2JhbFNlY3VyaXR5U3RhdHMgbWNiY1N0YXRzOworfXRBbmlHbG9iYWxDbGFzc0JTdGF0c0luZm8sICp0cEFuaUdsb2JhbENsYXNzQlN0YXRzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaUdsb2JhbENsYXNzQ1N0YXRzSW5mbworeworICAgIHRBTklfVTMyIHJ4X2Ftc2R1X2NudDsgICAgICAgICAgIC8vVGhpcyBjb3VudGVyIHNoYWxsIGJlIGluY3JlbWVudGVkIGZvciBhIHJlY2VpdmVkIEEtTVNEVSBmcmFtZSB3aXRoIHRoZSBzdGF0aW9ucyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTUFDIGFkZHJlc3MgaW4gdGhlIGFkZHJlc3MgMSBmaWVsZCBvciBhbiBBLU1TRFUgZnJhbWUgd2l0aCBhIGdyb3VwIGFkZHJlc3MgaW4gdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hZGRyZXNzIDEgZmllbGQKKyAgICB0QU5JX1UzMiByeF9hbXBkdV9jbnQ7ICAgICAgICAgICAvL1RoaXMgY291bnRlciBzaGFsbCBiZSBpbmNyZW1lbnRlZCB3aGVuIHRoZSBNQUMgcmVjZWl2ZXMgYW4gQU1QRFUgZnJvbSB0aGUgUEhZCisgICAgdEFOSV9VMzIgdHhfMjBfZnJtX2NudDsgICAgICAgICAgLy9UaGlzIGNvdW50ZXIgc2hhbGwgYmUgaW5jcmVtZW50ZWQgd2hlbiBhIEZyYW1lIGlzIHRyYW5zbWl0dGVkIG9ubHkgb24gdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmltYXJ5IGNoYW5uZWwKKyAgICB0QU5JX1UzMiByeF8yMF9mcm1fY250OyAgICAgICAgICAvL1RoaXMgY291bnRlciBzaGFsbCBiZSBpbmNyZW1lbnRlZCB3aGVuIGEgRnJhbWUgaXMgcmVjZWl2ZWQgb25seSBvbiB0aGUgcHJpbWFyeSBjaGFubmVsCisgICAgdEFOSV9VMzIgcnhfbXBkdV9pbl9hbXBkdV9jbnQ7ICAgLy9UaGlzIGNvdW50ZXIgc2hhbGwgYmUgaW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBNUERVcyByZWNlaXZlZCBpbiB0aGUgQS1NUERVIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93aGVuIGFuIEEtTVBEVSBpcyByZWNlaXZlZAorICAgIHRBTklfVTMyIGFtcGR1X2RlbGltaXRlcl9jcmNfZXJyOy8vVGhpcyBjb3VudGVyIHNoYWxsIGJlIGluY3JlbWVudGVkIHdoZW4gYW4gTVBEVSBkZWxpbWl0ZXIgaGFzIGEgQ1JDIGVycm9yIHdoZW4gdGhpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaXMgdGhlIGZpcnN0IENSQyBlcnJvciBpbiB0aGUgcmVjZWl2ZWQgQU1QRFUgb3Igd2hlbiB0aGUgcHJldmlvdXMgZGVsaW1pdGVyIGhhcyBiZWVuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kZWNvZGVkIGNvcnJlY3RseQorCit9dEFuaUdsb2JhbENsYXNzQ1N0YXRzSW5mbywgKnRwQW5pR2xvYmFsQ2xhc3NDU3RhdHNJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzQW5pUGVyU3RhU3RhdHNJbmZvCit7CisgICAgdEFOSV9VMzIgdHhfZnJhZ19jbnRbNF07ICAgICAgIC8vVGhlIG51bWJlciBvZiBNUERVIGZyYW1lcyB0aGF0IHRoZSA4MDIuMTEgc3RhdGlvbiB0cmFuc21pdHRlZCBhbmQgYWNrbm93bGVkZ2VkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3VnaCBhIHJlY2VpdmVkIDgwMi4xMSBBQ0sgZnJhbWUKKyAgICB0QU5JX1UzMiB0eF9hbXBkdV9jbnQ7ICAgICAgICAgLy9UaGlzIGNvdW50ZXIgc2hhbGwgYmUgaW5jcmVtZW50ZWQgd2hlbiBhbiBBLU1QRFUgaXMgdHJhbnNtaXR0ZWQgCisgICAgdEFOSV9VMzIgdHhfbXBkdV9pbl9hbXBkdV9jbnQ7IC8vVGhpcyBjb3VudGVyIHNoYWxsIGluY3JlbWVudCBieSB0aGUgbnVtYmVyIG9mIE1QRFVzIGluIHRoZSBBTVBEVSB3aGVuIGFuIEEtTVBEVSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIHRyYW5zbWl0dGVkCisKK310QW5pUGVyU3RhU3RhdHNJbmZvLCAqdHBBbmlQZXJTdGFTdGF0c0luZm87CisKKy8qKioqKioqKioqKioqKioqKioqKioqUEUgU3RhdGlzdGljcyBlbmQqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclJTU0lUaHJlc2hvbGRzCit7CisjaWZkZWYgQU5JX0JJR19CWVRFX0VORElBTgorICAgIHRBTklfUzggICB1Y1Jzc2lUaHJlc2hvbGQxICAgICA6IDg7CisgICAgdEFOSV9TOCAgIHVjUnNzaVRocmVzaG9sZDIgICAgIDogODsKKyAgICB0QU5JX1M4ICAgdWNSc3NpVGhyZXNob2xkMyAgICAgOiA4OworICAgIHRBTklfVTggICBiUnNzaVRocmVzMVBvc05vdGlmeSA6IDE7CisgICAgdEFOSV9VOCAgIGJSc3NpVGhyZXMxTmVnTm90aWZ5IDogMTsKKyAgICB0QU5JX1U4ICAgYlJzc2lUaHJlczJQb3NOb3RpZnkgOiAxOworICAgIHRBTklfVTggICBiUnNzaVRocmVzMk5lZ05vdGlmeSA6IDE7CisgICAgdEFOSV9VOCAgIGJSc3NpVGhyZXMzUG9zTm90aWZ5IDogMTsKKyAgICB0QU5JX1U4ICAgYlJzc2lUaHJlczNOZWdOb3RpZnkgOiAxOworICAgIHRBTklfVTggICBiUmVzZXJ2ZWQxMCAgICAgICAgICA6IDI7CisjZWxzZQorICAgIHRBTklfVTggICBiUmVzZXJ2ZWQxMCAgICAgICAgICA6IDI7CisgICAgdEFOSV9VOCAgIGJSc3NpVGhyZXMzTmVnTm90aWZ5IDogMTsKKyAgICB0QU5JX1U4ICAgYlJzc2lUaHJlczNQb3NOb3RpZnkgOiAxOworICAgIHRBTklfVTggICBiUnNzaVRocmVzMk5lZ05vdGlmeSA6IDE7CisgICAgdEFOSV9VOCAgIGJSc3NpVGhyZXMyUG9zTm90aWZ5IDogMTsKKyAgICB0QU5JX1U4ICAgYlJzc2lUaHJlczFOZWdOb3RpZnkgOiAxOworICAgIHRBTklfVTggICBiUnNzaVRocmVzMVBvc05vdGlmeSA6IDE7CisgICAgdEFOSV9TOCAgIHVjUnNzaVRocmVzaG9sZDMgICAgIDogODsKKyAgICB0QU5JX1M4ICAgdWNSc3NpVGhyZXNob2xkMiAgICAgOiA4OworICAgIHRBTklfUzggICB1Y1Jzc2lUaHJlc2hvbGQxICAgICA6IDg7CisjZW5kaWYKKworfXRTaXJSU1NJVGhyZXNob2xkcywgKnRwU2lyUlNTSVRocmVzaG9sZHM7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJSU1NJTm90aWZpY2F0aW9uCit7CisjaWZkZWYgQU5JX0JJR19CWVRFX0VORElBTgorICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMxUG9zQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMxTmVnQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMyUG9zQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMyTmVnQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMzUG9zQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMzTmVnQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSZXNlcnZlZCAgICAgICAgICAgOiAyNjsKKyNlbHNlCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgYlJlc2VydmVkICAgICAgICAgICA6IDI2OworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMzTmVnQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMzUG9zQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMyTmVnQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMyUG9zQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMxTmVnQ3Jvc3MgOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGJSc3NpVGhyZXMxUG9zQ3Jvc3MgOiAxOworI2VuZGlmCisgICAgCit9dFNpclJTU0lOb3RpZmljYXRpb24sICp0cFNpclJTU0lOb3RpZmljYXRpb247CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCit0eXBlZGVmIHN0cnVjdCBzU2lyUDJQTm9hQXR0cgoreworI2lmZGVmIEFOSV9CSUdfQllURV9FTkRJQU4KKyAgIHRBTklfVTMyICAgICAgaW5kZXggOjg7CisgICB0QU5JX1UzMiAgICAgIG9wcFBzRmxhZyA6MTsKKyAgIHRBTklfVTMyICAgICAgY3RXaW4gICAgIDo3OworICAgdEFOSV9VMzIgICAgICByc3ZkMTogMTY7CisjZWxzZQorICAgdEFOSV9VMzIgICAgICByc3ZkMTogMTY7CisgICB0QU5JX1UzMiAgICAgIGN0V2luICAgICA6NzsKKyAgIHRBTklfVTMyICAgICAgb3BwUHNGbGFnIDoxOworICAgdEFOSV9VMzIgICAgICBpbmRleCA6ODsKKyNlbmRpZgorCisjaWZkZWYgQU5JX0JJR19CWVRFX0VORElBTgorICAgdEFOSV9VMzIgICAgICAgdU5vYTFJbnRlcnZhbENudDo4OworICAgdEFOSV9VMzIgICAgICAgcnN2ZDI6MjQ7CisjZWxzZQorICAgdEFOSV9VMzIgICAgICAgcnN2ZDI6MjQ7CisgICB0QU5JX1UzMiAgICAgICB1Tm9hMUludGVydmFsQ250Ojg7CisjZW5kaWYKKyAgIHRBTklfVTMyICAgICAgIHVOb2ExRHVyYXRpb247CisgICB0QU5JX1UzMiAgICAgICB1Tm9hMUludGVydmFsOworICAgdEFOSV9VMzIgICAgICAgdU5vYTFTdGFydFRpbWU7CisKKyNpZmRlZiBBTklfQklHX0JZVEVfRU5ESUFOCisgICB0QU5JX1UzMiAgICAgICB1Tm9hMkludGVydmFsQ250Ojg7CisgICB0QU5JX1UzMiAgICAgICByc3ZkMzoyNDsKKyNlbHNlCisgICB0QU5JX1UzMiAgICAgICByc3ZkMzoyNDsKKyAgIHRBTklfVTMyICAgICAgIHVOb2EySW50ZXJ2YWxDbnQ6ODsKKyNlbmRpZgorICAgdEFOSV9VMzIgICAgICAgdU5vYTJEdXJhdGlvbjsKKyAgIHRBTklfVTMyICAgICAgIHVOb2EySW50ZXJ2YWw7CisgICB0QU5JX1UzMiAgICAgICB1Tm9hMlN0YXJ0VGltZTsKK30gdFNpclAyUE5vYUF0dHIsICp0cFNpclAyUE5vYUF0dHI7CisjZW5kaWYKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJUY2xhc0luZm8KK3sKKyAgICB0U2lyTWFjVGNsYXNJRSAgIHRjbGFzOworICAgIHRBTklfVTggICAgICAgICAgICAgICB2ZXJzaW9uOyAvLyBhcHBsaWVzIG9ubHkgZm9yIGNsYXNzaWZpZXIgdHlwZSBpcAorICAgIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCB1bmlvbiB7CisgICAgICAgIHRTaXJNYWNUY2xhc1BhcmFtRXRoZXJuZXQgZXRoOworICAgICAgICB0U2lyTWFjVGNsYXNQYXJhbUlQdjQgICAgIGlwdjQ7CisgICAgICAgIHRTaXJNYWNUY2xhc1BhcmFtSVB2NiAgICAgaXB2NjsKKyAgICAgICAgdFNpck1hY1RjbGFzUGFyYW04MDIxZHEgICB0ODAyMWRxOworICAgIH1fX2FuaV9hdHRyX3BhY2tlZCB0Y2xhc1BhcmFtczsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpclRjbGFzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckFkZHRzUmVxSW5mbworeworICAgIHRBTklfVTggICAgICAgICAgICAgICBkaWFsb2dUb2tlbjsKKyAgICB0U2lyTWFjVHNwZWNJRSAgIHRzcGVjOworCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgIG51bVRjbGFzOyAvLyBudW1iZXIgb2YgVGNsYXMgZWxlbWVudHMKKyAgICB0U2lyVGNsYXNJbmZvICAgIHRjbGFzSW5mb1tTSVJfTUFDX1RDTEFTSUVfTUFYTlVNXTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgdGNsYXNQcm9jOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICB0U2lyTWFjQ0NYVFNSU0lFICAgICAgdHNyc0lFOworICAgIHRBTklfVTggICAgICAgICAgICAgICB0c3JzUHJlc2VudDoxOworI2VuZGlmCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgIHdtZVRzcGVjUHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICB3c21Uc3BlY1ByZXNlbnQ6MTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgbGxlVHNwZWNQcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgIHRjbGFzUHJvY1ByZXNlbnQ6MTsKK30gdFNpckFkZHRzUmVxSW5mbywgKnRwU2lyQWRkdHNSZXFJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzU2lyQWRkdHNSc3BJbmZvCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgZGlhbG9nVG9rZW47CisgICAgdFNpck1hY1N0YXR1c0NvZGVzIHN0YXR1czsKKyAgICB0U2lyTWFjVHNEZWxheUlFICAgZGVsYXk7CisKKyAgICB0U2lyTWFjVHNwZWNJRSAgICAgdHNwZWM7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgbnVtVGNsYXM7IC8vIG51bWJlciBvZiBUY2xhcyBlbGVtZW50cworICAgIHRTaXJUY2xhc0luZm8gICAgICB0Y2xhc0luZm9bU0lSX01BQ19UQ0xBU0lFX01BWE5VTV07CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgdGNsYXNQcm9jOworICAgIHRTaXJNYWNTY2hlZHVsZUlFICBzY2hlZHVsZTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgdFNpck1hY0NDWFRTTUlFICAgIHRzbUlFOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHRzbVByZXNlbnQ6MTsKKyNlbmRpZgorICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHdtZVRzcGVjUHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHdzbVRzcGVjUHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGxsZVRzcGVjUHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHRjbGFzUHJvY1ByZXNlbnQ6MTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBzY2hlZHVsZVByZXNlbnQ6MTsKK30gdFNpckFkZHRzUnNwSW5mbywgKnRwU2lyQWRkdHNSc3BJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzU2lyRGVsdHNSZXFJbmZvCit7CisgICAgdFNpck1hY1RTSW5mbyAgICAgIHRzaW5mbzsKKyAgICB0U2lyTWFjVHNwZWNJRSAgICAgdHNwZWM7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgd21lVHNwZWNQcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgd3NtVHNwZWNQcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgbGxlVHNwZWNQcmVzZW50OjE7Cit9IHRTaXJEZWx0c1JlcUluZm8sICp0cFNpckRlbHRzUmVxSW5mbzsKKworLy8vIEFkZCBhIHRzcGVjIGFzIGRlZmluZWQKK3R5cGVkZWYgc3RydWN0IHNTaXJBZGR0c1JlcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9BRERUU19SRVEKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOyAgLy9TZXNzaW9uIElECisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICBic3NJZDsgICAgICAvL0JTU0lECisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgdGltZW91dDsgLy8gaW4gbXMKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICByc3BSZXFkOworICAgIHRTaXJBZGR0c1JlcUluZm8gICAgICAgIHJlcTsKK30gdFNpckFkZHRzUmVxLCAqdHBTaXJBZGR0c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckFkZHRzUnNwCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX0FERFRTX1JTUAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ7ICAvLyBzbWUgc2Vzc2lvbklkICBBZGRlZCBmb3IgQlQtQU1QIHN1cHBvcnQgCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsgLy9zbWUgdHJhbnNhY3Rpb24gSWQgQWRkZWQgZm9yIEJULUFNUCBTdXBwb3J0IAorICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIHJjOyAgICAgICAgICAvLyByZXR1cm4gY29kZQorICAgIHRTaXJBZGR0c1JzcEluZm8gICAgICAgIHJzcDsKK30gdFNpckFkZHRzUnNwLCAqdHBTaXJBZGR0c1JzcDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckRlbHRzUmVxCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7IC8vIGVXTklfU01FX0RFTFRTX1JFUQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ7Ly9TZXNzaW9uIElECisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICBic3NJZDsgIC8vQlNTSUQKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhaWQ7ICAvLyB1c2UgMCBpZiBtYWNBZGRyIGlzIGJlaW5nIHNwZWNpZmllZAorICAgIHRBTklfVTggICAgICAgICAgICAgICAgIG1hY0FkZHJbNl07IC8vIG9ubHkgb24gQVAgdG8gc3BlY2lmeSB0aGUgU1RBCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgcnNwUmVxZDsKKyAgICB0U2lyRGVsdHNSZXFJbmZvICAgICAgICByZXE7Cit9IHRTaXJEZWx0c1JlcSwgKnRwU2lyRGVsdHNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJEZWx0c1JzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9ERUxUU19SU1AKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOyAgLy8gc21lIHNlc3Npb25JZCAgQWRkZWQgZm9yIEJULUFNUCBzdXBwb3J0IAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ7IC8vc21lIHRyYW5zYWN0aW9uIElkIEFkZGVkIGZvciBCVC1BTVAgU3VwcG9ydCAKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICByYzsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhaWQ7ICAvLyB1c2UgMCBpZiBtYWNBZGRyIGlzIGJlaW5nIHNwZWNpZmllZAorICAgIHRBTklfVTggICAgICAgICAgICAgICAgIG1hY0FkZHJbNl07IC8vIG9ubHkgb24gQVAgdG8gc3BlY2lmeSB0aGUgU1RBCisgICAgdFNpckRlbHRzUmVxSW5mbyAgICAgICAgcnNwOworfSB0U2lyRGVsdHNSc3AsICp0cFNpckRlbHRzUnNwOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiB8fCBkZWZpbmVkIEZFQVRVUkVfV0xBTl9DQ1gKKworI2RlZmluZSBTSVJfUU9TX05VTV9UU1BFQ19NQVggMgorI2RlZmluZSBTSVJfUU9TX05VTV9BQ19NQVggNAorCit0eXBlZGVmIHN0cnVjdCBzU2lyQWdnclFvc1JlcUluZm8KK3sKKyAgICB0QU5JX1UxNiB0c3BlY0lkeDsKKyAgICB0U2lyQWRkdHNSZXFJbmZvIGFnZ3JBZGRUc0luZm9bU0lSX1FPU19OVU1fQUNfTUFYXTsKK310U2lyQWdnclFvc1JlcUluZm8sICp0cFNpckFnZ3JRb3NSZXFJbmZvOworCit0eXBlZGVmIHN0cnVjdCBzU2lyQWdnclFvc1JlcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9BRERUU19SRVEKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOyAgLy9TZXNzaW9uIElECisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICBic3NJZDsgICAgICAvL0JTU0lECisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgdGltZW91dDsgLy8gaW4gbXMKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICByc3BSZXFkOworICAgIHRTaXJBZ2dyUW9zUmVxSW5mbyAgICAgIGFnZ3JJbmZvOworfXRTaXJBZ2dyUW9zUmVxLCAqdHBTaXJBZ2dyUW9zUmVxOworCit0eXBlZGVmIHN0cnVjdCBzU2lyQWdnclFvc1JzcEluZm8KK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICB0c3BlY0lkeDsKKyAgICB0U2lyQWRkdHNSc3BJbmZvICAgICAgICBhZ2dyUnNwW1NJUl9RT1NfTlVNX0FDX01BWF07Cit9IHRTaXJBZ2dyUW9zUnNwSW5mbywgKnRwU2lyQWdnclFvc1JzcEluZm87CisKK3R5cGVkZWYgc3RydWN0IHNTaXJBZ2dyUW9zUnNwCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGU7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNlc3Npb25JZDsKKyAgICB0U2lyQWdnclFvc1JzcEluZm8gICAgICBhZ2dySW5mbzsKK30gdFNpckFnZ3JRb3NSc3AsICp0cFNpckFnZ3JRb3NSc3A7CisKKyNlbmRpZi8qV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgfHwgRkVBVFVSRV9XTEFOX0NDWCovCisKK3R5cGVkZWYgc3RydWN0IHNTaXJTZXRUeFBvd2VyUmVxCit7CisgICAgdEFOSV9VMTYgICAgbWVzc2FnZVR5cGU7CisgICAgdEFOSV9VMTYgICAgbGVuZ3RoOworICAgIHRBTklfVTMyICAgIHR4UG93ZXI7Cit9IHRTaXJTZXRUeFBvd2VyUmVxLCAqdHBTaXJTZXRUeFBvd2VyUmVxOworCit0eXBlZGVmIHN0cnVjdCBzU2lyU2V0VHhQb3dlclJzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgbWVzc2FnZVR5cGU7CisgICAgdEFOSV9VMTYgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1UzMiAgICAgICAgc3RhdHVzOworfSB0U2lyU2V0VHhQb3dlclJzcCwgKnRwU2lyU2V0VHhQb3dlclJzcDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckdldFR4UG93ZXJSZXEKK3sKKyAgICB0QU5JX1UxNiAgICBtZXNzYWdlVHlwZTsKKyAgICB0QU5JX1UxNiAgICBsZW5ndGg7CisgICAgdEFOSV9VMTYgICAgc3RhaWQ7Cit9IHRTaXJHZXRUeFBvd2VyUmVxLCAqdHBTaXJHZXRUeFBvd2VyUmVxOworCit0eXBlZGVmIHN0cnVjdCBzU2lyR2V0VHhQb3dlclJzcAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgbWVzc2FnZVR5cGU7CisgICAgdEFOSV9VMTYgICAgICAgICAgICBsZW5ndGg7IC8vIGxlbmd0aCBvZiB0aGUgZW50aXJlIHJlcXVlc3QKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIHBvd2VyOyAgLy8gdW5pdHMgb2YgbWlsbGl3YXR0cworICAgIHRBTklfVTMyICAgICAgICAgICAgc3RhdHVzOworfSB0U2lyR2V0VHhQb3dlclJzcCwgKnRwU2lyR2V0VHhQb3dlclJzcDsKKworCit0eXBlZGVmIHRBTklfVTMyIHRTaXJNYWNOb2lzZVszXTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckdldE5vaXNlUnNwIAoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgbWVzc2FnZVR5cGU7CisgICAgdEFOSV9VMTYgICAgICAgICAgICBsZW5ndGg7IAorICAgIHRTaXJNYWNOb2lzZSAgICAgICAgbm9pc2U7Cit9IHRTaXJHZXROb2lzZVJzcCwgKnRwU2lyR2V0Tm9pc2VSc3A7CisKKworLy8KKy8vIFBNQyAtLT4gUEUgLS0+IEhBTAorLy8gUG93ZXIgc2F2ZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCit0eXBlZGVmIHN0cnVjdCBzU2lyUG93ZXJTYXZlQ2ZnCit7CisgICAgdEFOSV9VMTYgICAgbGlzdGVuSW50ZXJ2YWw7CisgICAKKyAgICAvKiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbWlzc2VkIGJlYWNvbnMgYmVmb3JlIAorICAgICAqIGhhcmR3YXJlIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgdG8gd2FrZSB1cCAKKyAgICAgKiB0aGUgaG9zdC4gSW4gdW5pdHMgb2YgbGlzdGVuIGludGVydmFsLgorICAgICAqLworICAgIHRBTklfVTMyIEhlYXJ0QmVhdENvdW50OworCisgICAgLyogc3BlY2lmaWVzIHdoaWNoIGJlYWNvbnMgYXJlIHRvIGJlIGZvcndhcmRlZAorICAgICAqIHRvIGhvc3Qgd2hlbiBiZWFjb24gZmlsdGVyaW5nIGlzIGVuYWJsZWQuCisgICAgICogSW4gdW5pdHMgb2YgbGlzdGVuIGludGVydmFsLgorICAgICAqLworICAgIHRBTklfVTMyICAgIG50aEJlYWNvbkZpbHRlcjsKKworICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIFBTLVBvbGwgc2VuZCBiZWZvcmUgCisgICAgICogZmlybXdhcmUgc2VuZHMgZGF0YSBudWxsIHdpdGggUE0gc2V0IHRvIDAuCisgICAgICovCisgICAgdEFOSV9VMzIgICAgbWF4UHNQb2xsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIC8qIElmIHRoZSBhdmVyYWdlIFJTU0kgdmFsdWUgZmFsbHMgYmVsb3cgdGhlIAorICAgICAqIG1pblJzc2lUaHJlc2hvbGQsIHRoZW4gRlcgd2lsbCBzZW5kIGFuIAorICAgICAqIGludGVycnVwdCB0byB3YWtlIHVwIHRoZSBob3N0LiAKKyAgICAgKi8KKyAgICB0QU5JX1UzMiAgICBtaW5Sc3NpVGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgLyogTnVtYmVyIG9mIGJlYWNvbnMgZm9yIHdoaWNoIGZpcm13YXJlIHdpbGwgCisgICAgICogY29sbGVjdCB0aGUgUlNTSSB2YWx1ZXMgYW5kIGNvbXB1dGUgdGhlIGF2ZXJhZ2UuCisgICAgICovCisgICAgdEFOSV9VOCAgICAgbnVtQmVhY29uUGVyUnNzaUF2ZXJhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAvKiBGVyBjb2xsZWN0cyB0aGUgUlNTSSBzdGF0cyBmb3IgdGhpcyBwZXJpb2QKKyAgICAgKiBpbiBCTVBTIG1vZGUuICAKKyAgICAgKi8KKyAgICB0QU5JX1U4ICAgICByc3NpRmlsdGVyUGVyaW9kOworCisgICAgLy8gRW5hYmxpbmcvZGlzYWJsaW5nIGJyb2FkY2FzdCBmcmFtZSBmaWx0ZXIgZmVhdHVyZQorICAgIHRBTklfVTggICAgIGJyb2FkY2FzdEZyYW1lRmlsdGVyOyAgICAKKworICAgIC8vIEVuYWJsaW5nL2Rpc2FibGluZyB0aGUgaWdub3JlIERUSU0gZmVhdHVyZQorICAgIHRBTklfVTggICAgIGlnbm9yZUR0aW07CisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUga2VwdAorICAgICAqIGluIG9yZGVyIHRvIGJlIGJhY2t3YXJkIGNvbXBhdGlibGUgZm9yIEdlbjUuIAorICAgICAqIFRoZXNlIHdpbGwgTk9UIGJlIHVzZWQgZm9yIEdlbjYgTGlicmEgY2hpcAorICAgICAqLworICAgIHRCZWFjb25Gb3J3YXJkaW5nIGJlYWNvbkZ3ZDsKKyAgICB0QU5JX1UxNiBudGhCZWFjb25Gd2Q7CisgICAgdEFOSV9VOCBmRW5hYmxlUHdyU2F2ZUltbWVkaWF0ZWx5OworICAgIHRBTklfVTggZlBTUG9sbDsKKworICAgIC8vIEVuYWJsaW5nL2Rpc2FibGluZyBCZWFjb24gRWFybHkgVGVybWluYXRpb24gZmVhdHVyZQorICAgIHRBTklfVTggICAgIGZFbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uOyAgICAKKyAgICB0QU5JX1U4ICAgICBiY25FYXJseVRlcm1XYWtlSW50ZXJ2YWw7ICAgIAorCit9dFNpclBvd2VyU2F2ZUNmZywgKnRwU2lyUG93ZXJTYXZlQ2ZnOworCisvKiBSZWFzb24gY29kZSBmb3IgcmVxdWVzdGluZyBGdWxsIFBvd2VyLiBUaGlzIHJlYXNvbiBjb2RlIGlzIHVzZWQgYnkgCisgICBhbnkgbW9kdWxlIHJlcXVlc3RpbmcgZnVsbCBwb3dlciBmcm9tIFBNQyBhbmQgYWxzbyBieSBQRSB3aGVuIGl0CisgICBzZW5kcyB0aGUgZVdOSV9QTUNfRVhJVF9CTVBTX0lORCB0byBQTUMqLwordHlwZWRlZiBlbnVtIGVSZXF1ZXN0RnVsbFBvd2VyUmVhc29uCit7CisgICBlU01FX01JU1NFRF9CRUFDT05fSU5EX1JDVkQsICAgIC8qIFBFIHJlY2VpdmVkIGEgTUFYX01JU1NFRF9CRUFDT05fSU5EICovCisgICBlU01FX0JNUFNfU1RBVFVTX0lORF9SQ1ZELCAgICAgIC8qIFBFIHJlY2VpdmVkIGEgU0lSX0hBTF9CTVBTX1NUQVRVU19JTkQgKi8KKyAgIGVTTUVfQk1QU19NT0RFX0RJU0FCTEVELCAgICAgICAgLyogQk1QUyBtb2RlIHdhcyBkaXNhYmxlZCBieSBIREQgaW4gU01FICovCisgICBlU01FX0xJTktfRElTQ09OTkVDVEVEX0JZX0hERCwgIC8qIExpbmsgaGFzIGJlZW4gZGlzY29ubmVjdGVkIHJlcXVlc3RlZCBieSBIREQgKi8KKyAgIGVTTUVfTElOS19ESVNDT05ORUNURURfQllfT1RIRVIsLyogRGlzY29ubmVjdCBkdWUgdG8gbGlua2xvc3Qgb3IgcmVxdWVzdGVkIGJ5IHBlZXIgKi8KKyAgIGVTTUVfRlVMTF9QV1JfTkVFREVEX0JZX0hERCwgICAgLyogSEREIHJlcXVlc3QgZnVsbCBwb3dlciBmb3Igc29tZSByZWFzb24gKi8KKyAgIGVTTUVfRlVMTF9QV1JfTkVFREVEX0JZX0JBUCwgICAgLyogQkFQIHJlcXVlc3QgZnVsbCBwb3dlciBmb3IgQlRfQU1QICovCisgICBlU01FX0ZVTExfUFdSX05FRURFRF9CWV9DU1IsICAgIC8qIENTUiByZXF1ZXN0cyBmdWxsIHBvd2VyICovCisgICBlU01FX0ZVTExfUFdSX05FRURFRF9CWV9RT1MsICAgIC8qIFFPUyByZXF1ZXN0cyBmdWxsIHBvd2VyICovCisgICBlU01FX0ZVTExfUFdSX05FRURFRF9CWV9DSEFOTkVMX1NXSVRDSCwgLyogY2hhbm5lbCBzd2l0Y2ggcmVxdWVzdCBmdWxsIHBvd2VyKi8KKyAgIGVTTUVfUkVBU09OX09USEVSICAgICAgICAgICAgICAgLyogTm8gc3BlY2lmaWMgcmVhc29uLiBHZW5lcmFsIHJlYXNvbiBjb2RlICovIAorfSB0UmVxdWVzdEZ1bGxQb3dlclJlYXNvbiwgdEV4aXRCbXBzUmVhc29uOworCisKKworLy9UaGlzIGlzIHNlbnQgYWxvbmd3aXRoIGVXTklfUE1DX0VYSVRfQk1QU19SRVEgbWVzc2FnZQordHlwZWRlZiBzdHJ1Y3Qgc0V4aXRCbXBzSW5mbworeworICAgdEV4aXRCbXBzUmVhc29uIGV4aXRCbXBzUmVhc29uOyAgLypSZWFzb24gZm9yIGV4aXRpbmcgQk1QUyAqLworfXRFeGl0Qm1wc0luZm8sICp0cEV4aXRCbXBzSW5mbzsKKworCisvLyBNQUMgU1cgLS0+IFNNRQorLy8gTWVzc2FnZSBpbmRpY2F0aW5nIHRvIFNNRSB0byBleGl0IEJNUFMgc2xlZXAgbW9kZQordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZUV4aXRCbXBzSW5kCit7CisgICAgdEFOSV9VMTYgIG1lc2dUeXBlOyAgICAgICAgICAgICAgIC8qIGVXTklfUE1DX0VYSVRfQk1QU19JTkQgKi8KKyAgICB0QU5JX1UxNiAgbWVzZ0xlbjsKKyAgICB0U2lyUmVzdWx0Q29kZXMgIHN0YXR1c0NvZGU7CisgICAgdEV4aXRCbXBzUmVhc29uICBleGl0Qm1wc1JlYXNvbjsgIC8qUmVhc29uIGZvciBleGl0aW5nIEJNUFMgKi8KKworfSB0U2lyU21lRXhpdEJtcHNJbmQsICp0cFNpclNtZUV4aXRCbXBzSW5kOworCisKKy8vCisvLyBIREQgLT4gTElNCisvLyB0U2lyTXNnUS50eXBlID0gZVdOSV9TTUVfREVMX0JBX1BFRVJfSU5ECisvLyB0U2lyTXNnUS5yZXNlcnZlZCA9IDAKKy8vIHRTaXJNc2dRLmJvZHkgPSBpbnN0YW5jZSBvZiB0RGVsQkFQYXJhbXMKKy8vCit0eXBlZGVmIHN0cnVjdCBzU21lRGVsQkFQZWVySW5kCit7CisgICAgLy8gTWVzc2FnZSBUeXBlCisgICAgdEFOSV9VMTYgbWVzZ1R5cGU7CisKKyAgICB0U2lyTWFjQWRkciBic3NJZDsvL0JTU0lEIAorCisgICAgLy8gTWVzc2FnZSBMZW5ndGgKKyAgICB0QU5JX1UxNiBtZXNnTGVuOworCisgICAgLy8gU3RhdGlvbiBJbmRleAorICAgIHRBTklfVTE2IHN0YUlkeDsKKworICAgIC8vIFRJRCBmb3Igd2hpY2ggdGhlIEJBIHNlc3Npb24gaXMgYmVpbmcgZGVsZXRlZAorICAgIHRBTklfVTggYmFUSUQ7CisKKyAgICAvLyBERUxCQSBkaXJlY3Rpb24KKyAgICAvLyBlQkFfSU5JVElBVE9SIC0gT3JpZ2luYXRvcgorICAgIC8vIGVCQV9SRUNFSVBJRU5UIC0gUmVjaXBpZW50CisgICAgdEFOSV9VOCBiYURpcmVjdGlvbjsKK30gdFNtZURlbEJBUGVlckluZCwgKnRwU21lRGVsQkFQZWVySW5kOworCit0eXBlZGVmIHN0cnVjdCBzU21lSWJzc1BlZXJJbmQKK3sKKyAgICB0QU5JX1UxNiAgICBtZXNnVHlwZTsKKyAgICB0QU5JX1UxNiAgICBtZXNnTGVuOworICAgIHRBTklfVTggICAgIHNlc3Npb25JZDsKKworICAgIHRTaXJNYWNBZGRyIHBlZXJBZGRyOworICAgIHRBTklfVTE2ICAgIHN0YUlkOworCisgICAgLypUaGUgRFBVIHNpZ25hdHVyZXMgd2lsbCBiZSBzZW50IGV2ZW50dWFsbHkgdG8gVEwgdG8gaGVscCBpdCBkZXRlcm1pbmUgdGhlIAorICAgICAgYXNzb2NpYXRpb24gdG8gd2hpY2ggYSBwYWNrZXQgYmVsb25ncyB0byovCisgICAgLypVbmljYXN0IERQVSBzaWduYXR1cmUqLworICAgIHRBTklfVTggICAgICAgICAgICB1Y2FzdFNpZzsKKworICAgIC8qQnJvYWRjYXN0IERQVSBzaWduYXR1cmUqLworICAgIHRBTklfVTggICAgICAgICAgICBiY2FzdFNpZzsKKworICAgIC8vQmVhY29uIHdpbGwgYmUgYXBwZW5kZWQgZm9yIG5ldyBQZWVyIGluZGljYXRpb24uCit9dFNtZUlic3NQZWVySW5kLCAqdHBTbWVJYnNzUGVlckluZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbVNjYW5DaG4KK3sKKyAgICB0QU5JX1UxNiBudW1UaW1lU2NhbjsgICAvL2hvdyBtYW55IHRpbWUgdGhpcyBjaGFubmVsIGlzIHNjYW4KKyAgICB0QU5JX1U4IGNoYW5uZWxJZDsKK310TGltU2NhbkNobjsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NtZUdldFNjYW5DaG5Sc3AKK3sKKyAgICAvLyBNZXNzYWdlIFR5cGUKKyAgICB0QU5JX1UxNiBtZXNnVHlwZTsKKyAgICAvLyBNZXNzYWdlIExlbmd0aAorICAgIHRBTklfVTE2IG1lc2dMZW47CisgICAgdEFOSV9VOCAgIHNlc3Npb25JZDsKKyAgICB0QU5JX1U4IG51bUNobjsKKyAgICB0TGltU2NhbkNobiBzY2FuQ2huWzFdOworfSB0U21lR2V0U2NhbkNoblJzcCwgKnRwU21lR2V0U2NhbkNoblJzcDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbVNjYW5DaG5JbmZvCit7CisgICAgdEFOSV9VOCBudW1DaG5JbmZvOyAgICAgLy9udW1iZXIgb2YgY2hhbm5lbHMgaW4gc2NhbkNobgorICAgIHRMaW1TY2FuQ2huIHNjYW5DaG5bU0lSX01BWF9TVVBQT1JURURfQ0hBTk5FTF9MSVNUXTsKK310TGltU2NhbkNobkluZm87CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lR2V0QXNzb2NTVEFzUmVxCit7CisgICAgdEFOSV9VMTYgICAgbWVzc2FnZVR5cGU7ICAgIC8vIGVXTklfU01FX0dFVF9BU1NPQ19TVEFTX1JFUQorICAgIHRBTklfVTE2ICAgIGxlbmd0aDsgICAgCisgICAgdFNpck1hY0FkZHIgYnNzSWQ7ICAgICAgICAgIC8vIEJTU0lECisgICAgdEFOSV9VMTYgICAgbW9kSWQ7CisgICAgdm9pZCAgICAgICAgKnBVc3JDb250ZXh0OworICAgIHZvaWQgICAgICAgICpwU2FwRXZlbnRDYWxsYmFjazsKKyAgICB2b2lkICAgICAgICAqcEFzc29jU3Rhc0FycmF5Oy8vIFBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSBwYXNzZWQgaW4gV0xBTlNBUF9HZXRBc3NvY1N0YXRpb25zIEFQSQorfSB0U2lyU21lR2V0QXNzb2NTVEFzUmVxLCAqdHBTaXJTbWVHZXRBc3NvY1NUQXNSZXE7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc1NtZU1heEFzc29jSW5kCit7CisgICAgdEFOSV9VMTYgICAgbWVzZ1R5cGU7ICAgIC8vIGVXTklfU01FX01BWF9BU1NPQ19FWENFRURFRAorICAgIHRBTklfVTE2ICAgIG1lc2dMZW47ICAgIAorICAgIHRBTklfVTggICAgIHNlc3Npb25JZDsgICAgCisgICAgdFNpck1hY0FkZHIgcGVlck1hYzsgICAgIC8vIHRoZSBuZXcgcGVlciB0aGF0IGdvdCByZWplY3RlZCBkdWUgdG8gc29mdGFwIG1heCBhc3NvYyBsaW1pdCByZWFjaGVkCit9IHRTbWVNYXhBc3NvY0luZCwgKnRwU21lTWF4QXNzb2NJbmQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQm9vdExvYWRlciBtZXNzYWdlIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVyBpbWFnZSBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTSVJfRldfSU1BR0VfU0laRSAgICAgICAgICAgIDE0NjMzMgorCisKKyNkZWZpbmUgU0lSX0JPT1RfTU9EVUxFX0lEICAgICAgICAgICAxCisKKyNkZWZpbmUgU0lSX0JPT1RfU0VUVVBfSU5EICAgICAgICAgICAoKFNJUl9CT09UX01PRFVMRV9JRCA8PCA4KSB8IDB4MTEpCisjZGVmaW5lIFNJUl9CT09UX1BPU1RfUkVTVUxUX0lORCAgICAgKChTSVJfQk9PVF9NT0RVTEVfSUQgPDwgOCkgfCAweDEyKQorI2RlZmluZSBTSVJfQk9PVF9ETkxEX1JFU1VMVF9JTkQgICAgICgoU0lSX0JPT1RfTU9EVUxFX0lEIDw8IDgpIHwgMHgxMykKKyNkZWZpbmUgU0lSX0JPT1RfRE5MRF9ERVZfUkVRICAgICAgICAoKFNJUl9CT09UX01PRFVMRV9JRCA8PCA4KSB8IDB4NDEpCisjZGVmaW5lIFNJUl9CT09UX0ROTERfREVWX1JTUCAgICAgICAgKChTSVJfQk9PVF9NT0RVTEVfSUQgPDwgOCkgfCAweDgxKQorI2RlZmluZSBTSVJfQk9PVF9ETkxEX1JFUSAgICAgICAgICAgICgoU0lSX0JPT1RfTU9EVUxFX0lEIDw8IDgpIHwgMHg0MikKKyNkZWZpbmUgU0lSX0JPT1RfRE5MRF9SU1AgICAgICAgICAgICAoKFNJUl9CT09UX01PRFVMRV9JRCA8PCA4KSB8IDB4ODIpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQm9vdGxvYWRlciBtZXNzYWdlIHN5bnRheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8gTWVzc2FnZSBoZWFkZXIKKyNkZWZpbmUgU0lSX0JPT1RfTUJfSEVBREVSICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNJUl9CT09UX01CX0hFQURFUjIgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFNJUl9CT09UX01TR19IRFJfTUFTSyAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBTSVJfQk9PVF9NU0dfTEVOX01BU0sgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKworLy8gQk9PVF9TRVRVUF9JTkQgcGFyYW1ldGVyIGluZGljZXMKKyNkZWZpbmUgU0lSX0JPT1RfU0VUVVBfSU5EX01CQUREUiAgICAgICAgICAyCisjZGVmaW5lIFNJUl9CT09UX1NFVFVQX0lORF9NQlNJWkUgICAgICAgICAgMworI2RlZmluZSBTSVJfQk9PVF9TRVRVUF9JTkRfTUVNT1BUICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX0JPT1RfU0VUVVBfSU5EX0xFTiAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0lSX0JPT1RfU0VUVVBfSU5EX01FTU9QVCsxKTw8MikKKworLy8gQk9PVF9QT1NUX1JFU1VMVF9JTkQgcGFyYW1ldGVyIGluZGljZXMKKyNkZWZpbmUgU0lSX0JPT1RfUE9TVF9SRVNVTFRfSU5EX1JFUyAgICAgICAyCisjZGVmaW5lIFNJUl9CT09UX1BPU1RfUkVTVUxUX0lORF9MRU4gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0lSX0JPT1RfUE9TVF9SRVNVTFRfSU5EX1JFUysxKTw8MikKKworI2RlZmluZSBTSVJfQk9PVF9QT1NUX1JFU1VMVF9JTkRfU1VDQ0VTUyAgICAgICAxCisjZGVmaW5lIFNJUl9CT09UX1BPU1RfUkVTVUxUX0lORF9NQl9GQUlMRUQgICAgIDIKKyNkZWZpbmUgU0lSX0JPT1RfUE9TVF9SRVNVTFRfSU5EX1NEUkFNX0ZBSUxFRCAgMworI2RlZmluZSBTSVJfQk9PVF9QT1NUX1JFU1VMVF9JTkRfRVNSQU1fRkFJTEVEICA0CisKKworLy8gQk9PVF9ETkxEX1JFU1VMVF9JTkQgcGFyYW1ldGVyIGluZGljZXMKKyNkZWZpbmUgU0lSX0JPT1RfRE5MRF9SRVNVTFRfSU5EX1JFUyAgICAgICAyCisjZGVmaW5lIFNJUl9CT09UX0ROTERfUkVTVUxUX0lORF9MRU4gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJUl9CT09UX0ROTERfUkVTVUxUX0lORF9SRVMrMSk8PDIpCisKKyNkZWZpbmUgU0lSX0JPT1RfRE5MRF9SRVNVTFRfSU5EX1NVQ0NFU1MgICAxCisjZGVmaW5lIFNJUl9CT09UX0ROTERfUkVTVUxUX0lORF9IRFJfRVJSICAgMgorI2RlZmluZSBTSVJfQk9PVF9ETkxEX1JFU1VMVF9JTkRfRVJSICAgICAgIDMKKworLy8gQk9PVF9ETkxEX0RFVl9SRVEKKyNkZWZpbmUgU0lSX0JPT1RfRE5MRF9ERVZfUkVRX1NEUkFNU0laRSAgICAyCisjZGVmaW5lIFNJUl9CT09UX0ROTERfREVWX1JFUV9GTEFTSFNJWkUgICAgMworI2RlZmluZSBTSVJfQk9PVF9ETkxEX0RFVl9SRVFfTEVOICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0lSX0JPT1RfRE5MRF9ERVZfUkVRX0ZMQVNIU0laRSsxKTw8MikKKworLy8gQk9PVF9ETkxEX0RFVl9SU1AKKyNkZWZpbmUgU0lSX0JPT1RfRE5MRF9ERVZfUlNQX0RFVlRZUEUgICAgICAyCisjZGVmaW5lIFNJUl9CT09UX0ROTERfREVWX1JTUF9MRU4gICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJUl9CT09UX0ROTERfREVWX1JTUF9ERVZUWVBFKzEpPDwyKQorCisjZGVmaW5lIFNJUl9CT09UX0ROTERfREVWX1JTUF9TUkFNICAgICAgICAgMQorI2RlZmluZSBTSVJfQk9PVF9ETkxEX0RFVl9SU1BfRkxBU0ggICAgICAgIDIKKworLy8gQk9PVF9ETkxEX1JFUQorI2RlZmluZSBTSVJfQk9PVF9ETkxEX1JFUV9PRkZTRVQgICAgICAgICAgIDIKKyNkZWZpbmUgU0lSX0JPT1RfRE5MRF9SRVFfV1JBRERSICAgICAgICAgICAzCisjZGVmaW5lIFNJUl9CT09UX0ROTERfUkVRX1NJWkUgICAgICAgICAgICAgNAorI2RlZmluZSBTSVJfQk9PVF9ETkxEX1JFUV9MRU4gICAgICAgICAgICAgICgoU0lSX0JPT1RfRE5MRF9SRVFfU0laRSsxKTw8MikKKworLy8gQk9PVF9ETkxEX1JTUAorI2RlZmluZSBTSVJfQk9PVF9ETkxEX1JTUF9TSVpFICAgICAgICAgICAgIDIKKyNkZWZpbmUgU0lSX0JPT1RfRE5MRF9SU1BfTEVOICAgICAgICAgICAgICAoKFNJUl9CT09UX0ROTERfUlNQX1NJWkUrMSk8PDIpCisKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX1JUQUlfTElOVVgpCisvLyBSVEFJIFdSQVBQRVIgZGVmaW5pdGlvbiAtIEJ1ZmZlciBibG9jayBjb250cm9sIGVudHJ5CisvLyB0aGUgbmV3IGJsb2NrIENvbnRyb2wgZW50cnkgaXMgaW5pdGlhbGl6ZWQgYnkgSERECisvLyBtZW1vcnkgYnVmZmVycyAoYmxrUG9vbCkgYXJlIGFsbG9jYXRlZCBieSBIREQKKy8vIFRoZSB0YWJsZSByZXNpZGVzIGluIHBsbWFjX3J0YWkuYworI2RlZmluZSBCTE9DS19BTExPQ0FURURfQllfSEREIDEKKyNkZWZpbmUgUkVEX1pPTkUgICAgICAgICAgICAgICAxNiAvLyAxNiBieXRlcyBiZXR3ZWVuIGJ1ZmZlcnMKKyNkZWZpbmUgTlVNX1BPT0wgICAgICAgICAgICAgICAxNiAvLyBOVU1fUE9PTCBkZWZpbmVkIGhlcmUgZm9yIG5vdywgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gZ29vZAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgYmxrU2l6ZTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgYmxrTnVtOworICAgIHZvaWQgICAgICAgICAgICAgKmJsa1Bvb2w7IC8vIHBvaW50ZXIgdG8gbWVtb3J5IGJ1ZmZlcgorCit9IHRfbWFjX2Jsb2NrX3RhYmxlOworCisjZW5kaWYKKworLy8gYm9hcmQgY2FwYWJpbGl0aWVzIGZpZWxkcyBhcmUgZGVmaW5lZCBoZXJlLgordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJCb2FyZENhcGFiaWxpdGllcworeworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgICB0QU5JX1UzMiBjb25jYXQ6MTsgICAgICAgIC8vIDAgLSBDb25jYXQgaXMgbm90IHN1cHBvcnRlZCwgMSAtIENvbmNhdCBpcyBzdXBwb3J0ZWQKKyAgICB0QU5JX1UzMiBjb21wcmVzc2lvbjoxOyAgIC8vIDAgLSBDb21wcmVzc2lvbiBpcyBub3Qgc3VwcG9ydGVkLCAxIC0gQ29tcHJlc3Npb24gaXMgc3VwcG9ydGVkCisgICAgdEFOSV9VMzIgY2hubEJvbmRpbmc6MTsgICAvLyAwIC0gQ2hhbm5lbCBCb25kaW5nIGlzIG5vdCBzdXBwb3J0ZWQsIDEgLSBDaGFubmVsIEJvbmRpbmcgaXMgc3VwcG9ydGVkCisgICAgdEFOSV9VMzIgcmV2ZXJzZUZDUzoxOyAgICAvLyAwIC0gUmV2ZXJzZSBGQ1MgaXMgbm90IHN1cHBvcnRlZCwgMSAtIFJldmVyc2UgRkNTIGlzIHN1cHBvcnRlZAorICAgIHRBTklfVTMyIHJzdmQxOjI7CisgICAgLy8gKHByb2R1Y3RJZCBkZXJpdmVzIHN1Yi1jYXRlZ29yeSBpbiB0aGUgZm9sbG93aW5nIHRocmVlIGZhbWlsaWVzKQorICAgIHRBTklfVTMyIGNiRmFtaWx5OjE7ICAgICAgLy8gMCAtIE5vdCBDQiBmYW1pbHksIDEgLSBDYXJkYnVzCisgICAgdEFOSV9VMzIgYXBGYW1pbHk6MTsgICAgICAvLyAwIC0gTm90IEFQIGZhbWlseSwgMSAtIEFQCisgICAgdEFOSV9VMzIgbXBjaUZhbWlseToxOyAgICAvLyAwIC0gTm90IE1QQ0kgZmFtaWx5LCAxIC0gTVBDSQorICAgIHRBTklfVTMyIGJnT25seToxOyAgICAgICAgLy8gMCAtIGRlZmF1bHQgYS9iL2c7IDEgLSBiL2cgb25seQorICAgIHRBTklfVTMyIGJiQ2hpcFZlcjo0OyAgICAgLy8gQmFzZWJhbmQgY2hpcCB2ZXJzaW9uCisgICAgdEFOSV9VMzIgbG9UeXBlOjI7ICAgICAgICAvLyAwID0gbm8gTE8sIDEgPSBTSUxBQlMsIDIgPSBPUklPTgorICAgIHRBTklfVTMyIHJhZGlvT246MjsgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpcyAzIG9yIDIsIDAgPSBPZmYgYW5kIDEgPSBPbgorICAgIHRBTklfVTMyIG5SZWNlaXZlcnM6MjsgICAgLy8gMCBiYXNlZC4KKyAgICB0QU5JX1UzMiBuVHJhbnNtaXR0ZXJzOjE7IC8vIDAgPSAxIHRyYW5zbWl0dGVyLCAxID0gMiB0cmFuc21pdHRlcnMKKyAgICB0QU5JX1UzMiBzZHJhbToxOyAgICAgICAgIC8vIDAgPSBubyBTRFJBTSwgMSA9IFNEUkFNCisgICAgdEFOSV9VMzIgcnN2ZDoxOworICAgIHRBTklfVTMyIGV4dFZzSW50QW50OjE7ICAgLy8gMCA9IGV4dCBhbnRlbm5hLCAxID0gaW50ZXJuYWwgYW50ZW5uYQorI2Vsc2UKKworICAgIHRBTklfVTMyIGV4dFZzSW50QW50OjE7ICAgLy8gMCA9IGV4dCBhbnRlbm5hLCAxID0gaW50ZXJuYWwgYW50ZW5uYQorICAgIHRBTklfVTMyIHJzdmQ6MTsKKyAgICB0QU5JX1UzMiBzZHJhbToxOyAgICAgICAgIC8vIDAgPSBubyBTRFJBTSwgMSA9IFNEUkFNCisgICAgdEFOSV9VMzIgblRyYW5zbWl0dGVyczoxOyAvLyAwID0gMSB0cmFuc21pdHRlciwgMSA9IDIgdHJhbnNtaXR0ZXJzCisgICAgdEFOSV9VMzIgblJlY2VpdmVyczoyOyAgICAvLyAwIGJhc2VkLgorICAgIHRBTklfVTMyIHJhZGlvT246MjsgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpcyAzIG9yIDIsIDAgPSBPZmYgYW5kIDEgPSBPbgorICAgIHRBTklfVTMyIGxvVHlwZToyOyAgICAgICAgLy8gMCA9IG5vIExPLCAxID0gU0lMQUJTLCAyID0gT1JJT04KKyAgICB0QU5JX1UzMiBiYkNoaXBWZXI6NDsgICAgIC8vIEJhc2ViYW5kIGNoaXAgdmVyc2lvbgorICAgIHRBTklfVTMyIGJnT25seToxOyAgICAgICAgLy8gMCAtIGRlZmF1bHQgYS9iL2c7IDEgLSBiL2cgb25seQorICAgIC8vIChwcm9kdWN0SWQgZGVyaXZlcyBzdWItY2F0ZWdvcnkgaW4gdGhlIGZvbGxvd2luZyB0aHJlZSBmYW1pbGllcykKKyAgICB0QU5JX1UzMiBtcGNpRmFtaWx5OjE7ICAgIC8vIDAgLSBOb3QgTVBDSSBmYW1pbHksIDEgLSBNUENJCisgICAgdEFOSV9VMzIgYXBGYW1pbHk6MTsgICAgICAvLyAwIC0gTm90IEFQIGZhbWlseSwgMSAtIEFQCisgICAgdEFOSV9VMzIgY2JGYW1pbHk6MTsgICAgICAvLyAwIC0gTm90IENCIGZhbWlseSwgMSAtIENhcmRidXMKKyAgICB0QU5JX1UzMiByc3ZkMToyOworICAgIHRBTklfVTMyIHJldmVyc2VGQ1M6MTsgICAgLy8gMCAtIFJldmVyc2UgRkNTIGlzIG5vdCBzdXBwb3J0ZWQsIDEgLSBSZXZlcnNlIEZDUyBpcyBzdXBwb3J0ZWQKKyAgICB0QU5JX1UzMiBjaG5sQm9uZGluZzoxOyAgIC8vIDAgLSBDaGFubmVsIEJvbmRpbmcgaXMgbm90IHN1cHBvcnRlZCwgMSAtIENoYW5uZWwgQm9uZGluZyBpcyBzdXBwb3J0ZWQKKyAgICB0QU5JX1UzMiBjb21wcmVzc2lvbjoxOyAgIC8vIDAgLSBDb21wcmVzc2lvbiBpcyBub3Qgc3VwcG9ydGVkLCAxIC0gQ29tcHJlc3Npb24gaXMgc3VwcG9ydGVkCisgICAgdEFOSV9VMzIgY29uY2F0OjE7ICAgICAgICAvLyAwIC0gQ29uY2F0IGlzIG5vdCBzdXBwb3J0ZWQsIDEgLSBDb25jYXQgaXMgc3VwcG9ydGVkCisjZW5kaWYKK30gX19hbmlfYXR0cl9wYWNrZWQgIHRTaXJCb2FyZENhcGFiaWxpdGllcywgKnRwU2lyQm9hcmRDYXBhYmlsaXRpZXM7CisKKyMgZGVmaW5lIEFOSV9CQ0FQX0VYVF9WU19JTlRfQU5UX01BU0sgICAweDEKKyMgZGVmaW5lIEFOSV9CQ0FQX0VYVF9WU19JTlRfQU5UX09GRlNFVCAwCisKKyMgZGVmaW5lIEFOSV9CQ0FQX0dBTF9PTl9CT0FSRF9NQVNLICAgICAweDIKKyMgZGVmaW5lIEFOSV9CQ0FQX0dBTF9PTl9CT0FSRF9PRkZTRVQgICAxCisKKyMgZGVmaW5lIEFOSV9CQ0FQX1NEUkFNX01BU0sgICAgICAgICAgICAweDQKKyMgZGVmaW5lIEFOSV9CQ0FQX1NEUkFNX09GRlNFVCAgICAgICAgICAyCisKKyMgZGVmaW5lIEFOSV9CQ0FQX05VTV9UUkFOU01JVFRFUlNfTUFTSyAgIDB4OAorIyBkZWZpbmUgQU5JX0JDQVBfTlVNX1RSQU5TTUlUVEVSU19PRkZTRVQgMworCisjIGRlZmluZSBBTklfQkNBUF9OVU1fUkVDRUlWRVJTX01BU0sgICAgMHgzMAorIyBkZWZpbmUgQU5JX0JDQVBfTlVNX1JFQ0VJVkVSU19PRkZTRVQgIDQKKworIyBkZWZpbmUgQU5JX0JDQVBfUkFESU9fT05fTUFTSyAgICAgICAgIDB4QzAKKyMgZGVmaW5lIEFOSV9CQ0FQX1JBRElPX09OX09GRlNFVCAgICAgICA2CisKKyMgZGVmaW5lIEFOSV9CQ0FQX0xPX1RZUEVfTUFTSyAgICAgICAgICAweDMwMAorIyBkZWZpbmUgQU5JX0JDQVBfTE9fVFlQRV9PRkZTRVQgICAgICAgIDgKKworIyBkZWZpbmUgQU5JX0JDQVBfQkJfQ0hJUF9WRVJfTUFTSyAgICAgIDB4QzAwCisjIGRlZmluZSBBTklfQkNBUF9CQl9DSElQX1ZFUl9PRkZTRVQgICAgMTAKKworIyBkZWZpbmUgQU5JX0JDQVBfQ1lHX0RBVEVfQ09ERV9NQVNLICAgIDB4RkYwMDAKKyMgZGVmaW5lIEFOSV9CQ0FQX0NZR19EQVRFX0NPREVfT0ZGU0VUICAxMgorCisjIGRlZmluZSBBTklfQkNBUF9SQURJT19PRkYgICAgICAgICAgICAgIDAKKyMgZGVmaW5lIEFOSV9CQ0FQX1JBRElPX09OICAgICAgICAgICAgICAgMQorIyBkZWZpbmUgQU5JX0JDQVBfUkFESU9fT05fTk9UX1NVUFBPUlRFRCAzCisKKworLy8vIFdPVyByZWxhdGVkIHN0cnVjdHVyZXMKKy8vIFNNRSAtPiBQRSA8LT4gSEFMCisjZGVmaW5lIFNJUl9XT1dMX0JDQVNUX1BBVFRFUk5fTUFYX1NJWkUgMTI4CisjZGVmaW5lIFNJUl9XT1dMX0JDQVNUX01BWF9OVU1fUEFUVEVSTlMgMTYKKworLy8gU01FIC0+IFBFIC0+IEhBTCAtIFRoaXMgaXMgdG8gYWRkIFdPV0wgQkNBU1Qgd2FrZS11cCBwYXR0ZXJuLiAKKy8vIFNNRS9IREQgbWFpbnRhaW5zIHRoZSBsaXN0IG9mIHRoZSBCQ0FTVCB3YWtlLXVwIHBhdHRlcm5zLgorLy8gVGhpcyBpcyBhIHBhc3MgdGhyb3VnaCBtZXNzYWdlIGZvciBQRQordHlwZWRlZiBzdHJ1Y3Qgc1Npcldvd2xBZGRCY2FzdFB0cm4KK3sKKyAgICB0QU5JX1U4ICB1Y1BhdHRlcm5JZDsgICAgICAgICAgIC8vIFBhdHRlcm4gSUQKKyAgICAvLyBQYXR0ZXJuIGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHRoZSA4MDIuMTEgcGFja2V0IHRvIHN0YXJ0IG9mIHRoZQorICAgIC8vIHdha2UtdXAgcGF0dGVybgorICAgIHRBTklfVTggIHVjUGF0dGVybkJ5dGVPZmZzZXQ7ICAgCisgICAgdEFOSV9VOCAgdWNQYXR0ZXJuU2l6ZTsgICAgICAgICAvLyBOb24tWmVybyBQYXR0ZXJuIHNpemUKKyAgICB0QU5JX1U4ICB1Y1BhdHRlcm5bU0lSX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRV07IC8vIFBhdHRlcm4KKyAgICB0QU5JX1U4ICB1Y1BhdHRlcm5NYXNrU2l6ZTsgICAgIC8vIE5vbi16ZXJvIHBhdHRlcm4gbWFzayBzaXplCisgICAgdEFOSV9VOCAgdWNQYXR0ZXJuTWFza1tTSVJfV09XTF9CQ0FTVF9QQVRURVJOX01BWF9TSVpFXTsgLy8gUGF0dGVybiBtYXNrCisgICAgLy8gRXh0cmEgcGF0dGVybiBkYXRhIGJleW9uZCAxMjggYnl0ZXMKKyAgICB0QU5JX1U4ICB1Y1BhdHRlcm5FeHRbU0lSX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRV07IC8vIEV4dHJhIFBhdHRlcm4KKyAgICB0QU5JX1U4ICB1Y1BhdHRlcm5NYXNrRXh0W1NJUl9XT1dMX0JDQVNUX1BBVFRFUk5fTUFYX1NJWkVdOyAvLyBFeHRyYSBQYXR0ZXJuIG1hc2sKK30gdFNpcldvd2xBZGRCY2FzdFB0cm4sICp0cFNpcldvd2xBZGRCY2FzdFB0cm47CisKKworLy8gU01FIC0+IFBFIC0+IEhBTCAtIFRoaXMgaXMgdG8gZGVsZXRlIFdPV0wgQkNBU1Qgd2FrZS11cCBwYXR0ZXJuLiAKKy8vIFNNRS9IREQgbWFpbnRhaW5zIHRoZSBsaXN0IG9mIHRoZSBCQ0FTVCB3YWtlLXVwIHBhdHRlcm5zLgorLy8gVGhpcyBpcyBhIHBhc3MgdGhyb3VnaCBtZXNzYWdlIGZvciBQRQordHlwZWRlZiBzdHJ1Y3Qgc1Npcldvd2xEZWxCY2FzdFB0cm4KK3sKKyAgICAvKiBQYXR0ZXJuIElEIG9mIHRoZSB3YWtldXAgcGF0dGVybiB0byBiZSBkZWxldGVkICovCisgICAgdEFOSV9VOCAgdWNQYXR0ZXJuSWQ7Cit9dFNpcldvd2xEZWxCY2FzdFB0cm4sICp0cFNpcldvd2xEZWxCY2FzdFB0cm47CisKKworLy8gU01FLT5QRTogRW50ZXIgV09XTEFOIHBhcmFtZXRlcnMgCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lV293bEVudGVyUGFyYW1zCit7CisgICAgLyogRW5hYmxlcy9kaXNhYmxlcyBtYWdpYyBwYWNrZXQgZmlsdGVyaW5nICovCisgICAgdEFOSV9VOCAgIHVjTWFnaWNQa3RFbmFibGU7IAorCisgICAgLyogTWFnaWMgcGF0dGVybiAqLworICAgIHRTaXJNYWNBZGRyIG1hZ2ljUHRybjsKKworICAgIC8qIEVuYWJsZXMvZGlzYWJsZXMgcGFja2V0IHBhdHRlcm4gZmlsdGVyaW5nICovCisgICAgdEFOSV9VOCAgIHVjUGF0dGVybkZpbHRlcmluZ0VuYWJsZTsgCisKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gZGlyZWN0cyB0aGUgV29XIHBhY2tldCBmaWx0ZXJpbmcgdG8gbG9vayBmb3IgRUFQLUlECisgICAgICogcmVxdWVzdHMgZW1iZWRkZWQgaW4gRUFQT0wgZnJhbWVzIGFuZCB1c2UgdGhpcyBhcyBhIHdha2Ugc291cmNlLgorICAgICAqLworICAgIHRBTklfVTggICB1Y1dvV0VBUElEUmVxdWVzdEVuYWJsZTsKKworICAgIC8qIFRoaXMgY29uZmlndXJhdGlvbiBkaXJlY3RzIHRoZSBXb1cgcGFja2V0IGZpbHRlcmluZyB0byBsb29rIGZvciBFQVBPTC00V0FZCisgICAgICogcmVxdWVzdHMgYW5kIHVzZSB0aGlzIGFzIGEgd2FrZSBzb3VyY2UuCisgICAgICovCisgICAgdEFOSV9VOCAgIHVjV29XRUFQT0w0V2F5RW5hYmxlOworCisgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGFsbG93cyBhIGhvc3Qgd2FrZXVwIG9uIGFuIG5ldHdvcmsgc2NhbiBvZmZsb2FkIG1hdGNoLgorICAgICAqLworICAgIHRBTklfVTggICB1Y1dvd05ldFNjYW5PZmZsb2FkTWF0Y2g7CisKKyAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gYWxsb3dzIGEgaG9zdCB3YWtldXAgb24gYW55IEdUSyByZWtleWluZyBlcnJvci4KKyAgICAgKi8KKyAgICB0QU5JX1U4ICAgdWNXb3dHVEtSZWtleUVycm9yOworCisgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGFsbG93cyBhIGhvc3Qgd2FrZXVwIG9uIEJTUyBjb25uZWN0aW9uIGxvc3MuCisgICAgICovCisgICAgdEFOSV9VOCAgIHVjV29XQlNTQ29ubkxvc3M7CisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisKK30gdFNpclNtZVdvd2xFbnRlclBhcmFtcywgKnRwU2lyU21lV293bEVudGVyUGFyYW1zOworCisKKy8vIFBFPC0+SEFMOiBFbnRlciBXT1dMQU4gcGFyYW1ldGVycyAKK3R5cGVkZWYgc3RydWN0IHNTaXJIYWxXb3dsRW50ZXJQYXJhbXMKK3sKKyAgICAvKiBFbmFibGVzL2Rpc2FibGVzIG1hZ2ljIHBhY2tldCBmaWx0ZXJpbmcgKi8KKyAgICB0QU5JX1U4ICAgdWNNYWdpY1BrdEVuYWJsZTsgCisKKyAgICAvKiBNYWdpYyBwYXR0ZXJuICovCisgICAgdFNpck1hY0FkZHIgbWFnaWNQdHJuOworCisgICAgLyogRW5hYmxlcy9kaXNhYmxlcyBwYWNrZXQgcGF0dGVybiBmaWx0ZXJpbmcgaW4gZmlybXdhcmUuIAorICAgICAgIEVuYWJsaW5nIHRoaXMgZmxhZyBlbmFibGVzIGJyb2FkY2FzdCBwYXR0ZXJuIG1hdGNoaW5nIAorICAgICAgIGluIEZpcm13YXJlLiBJZiB1bmljYXN0IHBhdHRlcm4gbWF0Y2hpbmcgaXMgYWxzbyBkZXNpcmVkLCAgCisgICAgICAgdWNVY2FzdFBhdHRlcm5GaWx0ZXJpbmdFbmFibGUgZmxhZyBtdXN0IGJlIHNldCB0b3QgdHJ1ZSAKKyAgICAgICBhcyB3ZWxsIAorICAgICovCisgICAgdEFOSV9VOCAgIHVjUGF0dGVybkZpbHRlcmluZ0VuYWJsZTsKKworICAgIC8qIEVuYWJsZXMvZGlzYWJsZXMgdW5pY2FzdCBwYWNrZXQgcGF0dGVybiBmaWx0ZXJpbmcuIAorICAgICAgIFRoaXMgZmxhZyBzcGVjaWZpZXMgd2hldGhlciB3ZSB3YW50IHRvIGRvIHBhdHRlcm4gbWF0Y2ggCisgICAgICAgb24gdW5pY2FzdCBwYWNrZXRzIGFzIHdlbGwgYW5kIG5vdCBqdXN0IGJyb2FkY2FzdCBwYWNrZXRzLiAKKyAgICAgICBUaGlzIGZsYWcgaGFzIG5vIGVmZmVjdCBpZiB0aGUgdWNQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlIAorICAgICAgIChtYWluIGNvbnRyb2xsaW5nIGZsYWcpIGlzIHNldCB0byBmYWxzZQorICAgICovCisgICAgdEFOSV9VOCAgIHVjVWNhc3RQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlOyAgICAgICAgICAgICAgICAgICAgIAorCisgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGlzIHZhbGlkIG9ubHkgd2hlbiBtYWdpY1BrdEVuYWJsZT0xLiAKKyAgICAgKiBJdCByZXF1ZXN0cyBoYXJkd2FyZSB0byB3YWtlIHVwIHdoZW4gaXQgcmVjZWl2ZXMgdGhlIAorICAgICAqIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBGcmFtZS4KKyAgICAgKi8KKyAgICB0QU5JX1U4ICAgdWNXb3dDaG5sU3dpdGNoUmN2OworCisgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGlzIHZhbGlkIG9ubHkgd2hlbiBtYWdpY1BrdEVuYWJsZT0xLiAKKyAgICAgKiBJdCByZXF1ZXN0cyBoYXJkd2FyZSB0byB3YWtlIHVwIHdoZW4gaXQgcmVjZWl2ZXMgdGhlIAorICAgICAqIERlYXV0aGVudGljYXRpb24gRnJhbWUuIAorICAgICAqLworICAgIHRBTklfVTggICB1Y1dvd0RlYXV0aFJjdjsKKworICAgIC8qIFRoaXMgY29uZmlndXJhdGlvbiBpcyB2YWxpZCBvbmx5IHdoZW4gbWFnaWNQa3RFbmFibGU9MS4gCisgICAgICogSXQgcmVxdWVzdHMgaGFyZHdhcmUgdG8gd2FrZSB1cCB3aGVuIGl0IHJlY2VpdmVzIHRoZSAKKyAgICAgKiBEaXNhc3NvY2lhdGlvbiBGcmFtZS4gCisgICAgICovCisgICAgdEFOSV9VOCAgIHVjV293RGlzYXNzb2NSY3Y7CisKKyAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQgb25seSB3aGVuIG1hZ2ljUGt0RW5hYmxlPTEuIAorICAgICAqIEl0IHJlcXVlc3RzIGhhcmR3YXJlIHRvIHdha2UgdXAgd2hlbiBpdCBoYXMgbWlzc2VkCisgICAgICogY29uc2VjdXRpdmUgYmVhY29ucy4gVGhpcyBpcyBhIGhhcmR3YXJlIHJlZ2lzdGVyCisgICAgICogY29uZmlndXJhdGlvbiAoTk9UIGEgZmlybXdhcmUgY29uZmlndXJhdGlvbikuIAorICAgICAqLworICAgIHRBTklfVTggICB1Y1dvd01heE1pc3NlZEJlYWNvbnM7CisKKyAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQgb25seSB3aGVuIG1hZ2ljUGt0RW5hYmxlPTEuIAorICAgICAqIFRoaXMgaXMgYSB0aW1lb3V0IHZhbHVlIGluIHVuaXRzIG9mIG1pY3Jvc2VjLiBJdCByZXF1ZXN0cworICAgICAqIGhhcmR3YXJlIHRvIHVuY29uZGl0aW9uYWxseSB3YWtlIHVwIGFmdGVyIGl0IGhhcyBzdGF5ZWQKKyAgICAgKiBpbiBXb1dMQU4gbW9kZSBmb3Igc29tZSB0aW1lLiBTZXQgMCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4gICAgICAKKyAgICAgKi8KKyAgICB0QU5JX1U4ICAgdWNXb3dNYXhTbGVlcFVzZWM7CisKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gZGlyZWN0cyB0aGUgV29XIHBhY2tldCBmaWx0ZXJpbmcgdG8gbG9vayBmb3IgRUFQLUlECisgICAgICogcmVxdWVzdHMgZW1iZWRkZWQgaW4gRUFQT0wgZnJhbWVzIGFuZCB1c2UgdGhpcyBhcyBhIHdha2Ugc291cmNlLgorICAgICAqLworICAgIHRBTklfVTggICB1Y1dvV0VBUElEUmVxdWVzdEVuYWJsZTsKKworICAgIC8qIFRoaXMgY29uZmlndXJhdGlvbiBkaXJlY3RzIHRoZSBXb1cgcGFja2V0IGZpbHRlcmluZyB0byBsb29rIGZvciBFQVBPTC00V0FZCisgICAgICogcmVxdWVzdHMgYW5kIHVzZSB0aGlzIGFzIGEgd2FrZSBzb3VyY2UuCisgICAgICovCisgICAgdEFOSV9VOCAgIHVjV29XRUFQT0w0V2F5RW5hYmxlOworCisgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGFsbG93cyBhIGhvc3Qgd2FrZXVwIG9uIGFuIG5ldHdvcmsgc2NhbiBvZmZsb2FkIG1hdGNoLgorICAgICAqLworICAgIHRBTklfVTggICB1Y1dvd05ldFNjYW5PZmZsb2FkTWF0Y2g7CisKKyAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gYWxsb3dzIGEgaG9zdCB3YWtldXAgb24gYW55IEdUSyByZWtleWluZyBlcnJvci4KKyAgICAgKi8KKyAgICB0QU5JX1U4ICAgdWNXb3dHVEtSZWtleUVycm9yOworCisgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGFsbG93cyBhIGhvc3Qgd2FrZXVwIG9uIEJTUyBjb25uZWN0aW9uIGxvc3MuCisgICAgICovCisgICAgdEFOSV9VOCAgIHVjV29XQlNTQ29ubkxvc3M7CisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisKKyAgICAvKiBTdGF0dXMgY29kZSB0byBiZSBmaWxsZWQgYnkgSEFMIHdoZW4gaXQgc2VuZHMKKyAgICAgKiBTSVJfSEFMX1dPV0xfRU5URVJfUlNQIHRvIFBFLiAKKyAgICAgKi8gIAorICAgIGVIYWxTdGF0dXMgIHN0YXR1czsKK30gdFNpckhhbFdvd2xFbnRlclBhcmFtcywgKnRwU2lySGFsV293bEVudGVyUGFyYW1zOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorCisjZGVmaW5lIFNJUl9NQVhfTkFNRV9TSVpFIDY0CisjZGVmaW5lIFNJUl9NQVhfVEVYVF9TSVpFIDMyCisKK3R5cGVkZWYgc3RydWN0IHNTaXJOYW1lIHsKKyAgICB2X1U4X3QgbnVtX25hbWU7CisgICAgdl9VOF90IG5hbWVbU0lSX01BWF9OQU1FX1NJWkVdOworfSB0U2lyTmFtZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclRleHQgeworICAgIHZfVThfdCBudW1fdGV4dDsKKyAgICB2X1U4X3QgdGV4dFtTSVJfTUFYX1RFWFRfU0laRV07Cit9IHRTaXJUZXh0OworCisKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX1ZFUl9QUkVTRU5UICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX1NUQVRFX1BSRVNFTlQgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTSVJfV1BTX1BST0JSU1BfQVBTRVRVUExPQ0tfUFJFU0VOVCAgICAweDAwMDAwMDA0CisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9TRUxFQ1RFRFJFR0lTVFJBX1BSRVNFTlQgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTSVJfV1BTX1BST0JSU1BfREVWSUNFUEFTU1dPUkRJRF9QUkVTRU5UICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX1NFTEVDVEVEUkVHSVNUUkFDRkdNRVRIT0RfUFJFU0VOVCAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9SRVNQT05TRVRZUEVfUFJFU0VOVCAgICAweDAwMDAwMDQwCisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9VVUlERV9QUkVTRU5UICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX01BTlVGQUNUVVJFX1BSRVNFTlQgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTSVJfV1BTX1BST0JSU1BfTU9ERUxOQU1FX1BSRVNFTlQgICAgMHgwMDAwMDIwMAorI2RlZmluZSBTSVJfV1BTX1BST0JSU1BfTU9ERUxOVU1CRVJfUFJFU0VOVCAgICAweDAwMDAwNDAwCisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9TRVJJQUxOVU1CRVJfUFJFU0VOVCAgICAweDAwMDAwODAwCisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9QUklNQVJZREVWSUNFVFlQRV9QUkVTRU5UICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgU0lSX1dQU19QUk9CUlNQX0RFVklDRU5BTUVfUFJFU0VOVCAgICAweDAwMDAyMDAwCisjZGVmaW5lIFNJUl9XUFNfUFJPQlJTUF9DT05GSUdNRVRIT0RTX1BSRVNFTlQgICAgMHgwMDAwNDAwMAorI2RlZmluZSBTSVJfV1BTX1BST0JSU1BfUkZfQkFORFNfUFJFU0VOVCAgICAweDAwMDA4MDAwCisKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldQU1Byb2JlUnNwSUUgeworICAgdl9VMzJfdCAgRmllbGRQcmVzZW50OworICAgdl9VMzJfdCAgVmVyc2lvbjsgICAgICAgICAgIC8vIFZlcnNpb24uIDB4MTAgPSB2ZXJzaW9uIDEuMCwgMHgxMSA9IGV0Yy4KKyAgIHZfVTMyX3QgIHdwc1N0YXRlOyAgICAgICAgICAvLyAxID0gdW5jb25maWd1cmVkLCAyID0gY29uZmlndXJlZC4gICAgCisgICB2X0JPT0xfdCBBUFNldHVwTG9ja2VkOyAgICAgLy8gTXVzdCBiZSBpbmNsdWRlZCBpZiB2YWx1ZSBpcyBUUlVFCisgICB2X0JPT0xfdCBTZWxlY3RlZFJlZ2lzdHJhOyAgLy9CT09MOiAgaW5kaWNhdGVzIGlmIHRoZSB1c2VyIGhhcyByZWNlbnRseSBhY3RpdmF0ZWQgYSBSZWdpc3RyYXIgdG8gYWRkIGFuIEVucm9sbGVlLgorICAgdl9VMTZfdCAgRGV2aWNlUGFzc3dvcmRJRDsgIC8vIERldmljZSBQYXNzd29yZCBJRAorICAgdl9VMTZfdCAgU2VsZWN0ZWRSZWdpc3RyYUNmZ01ldGhvZDsgLy8gU2VsZWN0ZWQgUmVnaXN0cmFyIGNvbmZpZyBtZXRob2QKKyAgIHZfVThfdCAgIFJlc3BvbnNlVHlwZTsgICAgICAvLyBSZXNwb25zZSB0eXBlCisgICB2X1U4X3QgICBVVUlEX0VbMTZdOyAgICAgICAgIC8vIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBBUC4KKyAgIHRTaXJOYW1lICAgTWFudWZhY3R1cmU7CisgICB0U2lyVGV4dCAgIE1vZGVsTmFtZTsKKyAgIHRTaXJUZXh0ICAgTW9kZWxOdW1iZXI7CisgICB0U2lyVGV4dCAgU2VyaWFsTnVtYmVyOworICAgdl9VMzJfdCAgUHJpbWFyeURldmljZUNhdGVnb3J5IDsgLy8gRGV2aWNlIENhdGVnb3J5IElEOiAxQ29tcHV0ZXIsIDJJbnB1dCBEZXZpY2UsIC4uLgorICAgdl9VOF90ICAgUHJpbWFyeURldmljZU9VSVs0XSA7IC8vIFZlbmRvciBzcGVjaWZpYyBPVUkgZm9yIERldmljZSBTdWIgQ2F0ZWdvcnkKKyAgIHZfVTMyX3QgIERldmljZVN1YkNhdGVnb3J5IDsgLy8gRGV2aWNlIFN1YiBDYXRlZ29yeSBJRDogMS1QQywgMi1TZXJ2ZXIgaWYgRGV2aWNlIENhdGVnb3J5IElEIGlzIGNvbXB1dGVyCisgICB0U2lyVGV4dCBEZXZpY2VOYW1lOworICAgdl9VMTZfdCAgQ29uZmlnTWV0aG9kOyAgICAgLy8gQ29uZmlndWFyYXRpb24gbWV0aG9kCisgICB2X1U4X3QgICBSRkJhbmQ7ICAgICAgICAgICAvLyBSRiBiYW5kcyBhdmFpbGFibGUgb24gdGhlIEFQCit9IHRTaXJXUFNQcm9iZVJzcElFOworCisjZGVmaW5lIFNJUl9XUFNfQkVBQ09OX1ZFUl9QUkVTRU5UICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0lSX1dQU19CRUFDT05fU1RBVEVfUFJFU0VOVCAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNJUl9XUFNfQkVBQ09OX0FQU0VUVVBMT0NLX1BSRVNFTlQgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTSVJfV1BTX0JFQUNPTl9TRUxFQ1RFRFJFR0lTVFJBX1BSRVNFTlQgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTSVJfV1BTX0JFQUNPTl9ERVZJQ0VQQVNTV09SRElEX1BSRVNFTlQgICAgMHgwMDAwMDAxMAorI2RlZmluZSBTSVJfV1BTX0JFQUNPTl9TRUxFQ1RFRFJFR0lTVFJBQ0ZHTUVUSE9EX1BSRVNFTlQgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTSVJfV1BTX0JFQUNPTl9VVUlERV9QUkVTRU5UICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgU0lSX1dQU19CRUFDT05fUkZfQkFORFNfUFJFU0VOVCAgICAweDAwMDAwMTAwCisKK3R5cGVkZWYgc3RydWN0IHNTaXJXUFNCZWFjb25JRSB7CisgICB2X1UzMl90ICBGaWVsZFByZXNlbnQ7CisgICB2X1UzMl90ICBWZXJzaW9uOyAgICAgICAgICAgLy8gVmVyc2lvbi4gMHgxMCA9IHZlcnNpb24gMS4wLCAweDExID0gZXRjLgorICAgdl9VMzJfdCAgd3BzU3RhdGU7ICAgICAgICAgIC8vIDEgPSB1bmNvbmZpZ3VyZWQsIDIgPSBjb25maWd1cmVkLiAgICAKKyAgIHZfQk9PTF90IEFQU2V0dXBMb2NrZWQ7ICAgICAvLyBNdXN0IGJlIGluY2x1ZGVkIGlmIHZhbHVlIGlzIFRSVUUKKyAgIHZfQk9PTF90IFNlbGVjdGVkUmVnaXN0cmE7ICAvL0JPT0w6ICBpbmRpY2F0ZXMgaWYgdGhlIHVzZXIgaGFzIHJlY2VudGx5IGFjdGl2YXRlZCBhIFJlZ2lzdHJhciB0byBhZGQgYW4gRW5yb2xsZWUuCisgICB2X1UxNl90ICBEZXZpY2VQYXNzd29yZElEOyAgLy8gRGV2aWNlIFBhc3N3b3JkIElECisgICB2X1UxNl90ICBTZWxlY3RlZFJlZ2lzdHJhQ2ZnTWV0aG9kOyAvLyBTZWxlY3RlZCBSZWdpc3RyYXIgY29uZmlnIG1ldGhvZAorICAgdl9VOF90ICAgVVVJRF9FWzE2XTsgICAgICAgIC8vIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBBUC4KKyAgIHZfVThfdCAgIFJGQmFuZDsgICAgICAgICAgIC8vIFJGIGJhbmRzIGF2YWlsYWJsZSBvbiB0aGUgQVAKK30gdFNpcldQU0JlYWNvbklFOworCisjZGVmaW5lIFNJUl9XUFNfQVNTT0NSU1BfVkVSX1BSRVNFTlQgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTSVJfV1BTX0FTU09DUlNQX1JFU1BPTlNFVFlQRV9QUkVTRU5UICAgIDB4MDAwMDAwMDIKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldQU0Fzc29jUnNwSUUgeworICAgdl9VMzJfdCBGaWVsZFByZXNlbnQ7CisgICB2X1UzMl90IFZlcnNpb247CisgICB2X1U4X3QgUmVzcG9zZVR5cGU7Cit9IHRTaXJXUFNBc3NvY1JzcElFOworCit0eXBlZGVmIHN0cnVjdCBzU2lyQVBXUFNJRXMgeworICAgdFNpcldQU1Byb2JlUnNwSUUgIFNpcldQU1Byb2JlUnNwSUU7ICAgIC8qV1BTIFNldCBQcm9iZSBSZXNwb3NlIElFKi8KKyAgIHRTaXJXUFNCZWFjb25JRSAgICBTaXJXUFNCZWFjb25JRTsgICAgICAvKldQUyBTZXQgQmVhY29uIElFKi8KKyAgIHRTaXJXUFNBc3NvY1JzcElFICBTaXJXUFNBc3NvY1JzcElFOyAgICAvKldQUyBTZXQgQXNzb2MgUmVzcG9uc2UgSUUqLworfSB0U2lyQVBXUFNJRXMsICp0cFNpcmlBUFdQU0lFczsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclVwZGF0ZUFQV1BTSUVzUmVxCit7CisgICAgdEFOSV9VMTYgICAgICAgbWVzc2FnZVR5cGU7ICAgICAvLyBlV05JX1NNRV9VUERBVEVfQVBXUFNJRV9SRVEKKyAgICB0QU5JX1UxNiAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VMTYgICAgICAgdHJhbnNhY3Rpb25JZDsgICAvL1RyYW5zYWN0aW9uIElEIGZvciBjbWQKKyAgICB0U2lyTWFjQWRkciAgICBic3NJZDsgICAgICAgICAgIC8vIEJTU0lECisgICAgdEFOSV9VOCAgICAgICAgc2Vzc2lvbklkOyAgICAgICAvL1Nlc3Npb24gSUQKKyAgICB0U2lyQVBXUFNJRXMgICBBUFdQU0lFczsKK30gdFNpclVwZGF0ZUFQV1BTSUVzUmVxLCAqdHBTaXJVcGRhdGVBUFdQU0lFc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclVwZGF0ZVBhcmFtcworeworICAgIHRBTklfVTE2ICAgICAgIG1lc3NhZ2VUeXBlOyAgICAgCisgICAgdEFOSV9VMTYgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgIHNlc3Npb25JZDsgICAgICAvLyBTZXNzaW9uIElECisgICAgdEFOSV9VOCAgICAgICAgc3NpZEhpZGRlbjsgICAgIC8vIEhpZGUgU1NJRAorfSB0U2lyVXBkYXRlUGFyYW1zLCAqdHBTaXJVcGRhdGVQYXJhbXM7CisKKyNkZWZpbmUgU0lSX1dQU19VVUlEX0xFTiAxNgorI2RlZmluZSBTSVJfV1BTX1BCQ19XQUxLX1RJTUUgICAxMjAgIC8vIDEyMCBTZWNvbmQKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldQU1BCQ1Nlc3Npb24geworICAgIHN0cnVjdCBzU2lyV1BTUEJDU2Vzc2lvbiAqbmV4dDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICAgYWRkcjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgdXVpZF9lW1NJUl9XUFNfVVVJRF9MRU5dOworICAgIHRBTklfVElNRVNUQU1QICAgICAgICAgICB0aW1lc3RhbXA7Cit9IHRTaXJXUFNQQkNTZXNzaW9uOworCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lR2V0V1BTUEJDU2Vzc2lvbnNSZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgbWVzc2FnZVR5cGU7ICAgIC8vIGVXTklfU01FX0dFVF9XUFNQQkNfU0VTU0lPTl9SRVEKKyAgICB0QU5JX1UxNiAgICAgICAgbGVuZ3RoOworICAgIHZvaWQgICAgICAgICAgICAqcFVzckNvbnRleHQ7CisgICAgdm9pZCAgICAgICAgICAgICpwU2FwRXZlbnRDYWxsYmFjazsKKyAgICB0U2lyTWFjQWRkciAgICAgYnNzSWQ7ICAgICAgICAgIC8vIEJTU0lECisgICAgdFNpck1hY0FkZHIgICAgIHBSZW1vdmVNYWM7ICAgICAgLy8gTUFDIEFkZHJlc3Mgb2YgU1RBIGluIFdQUyBTZXNzaW9uIHRvIGJlIHJlbW92ZWQKK30gIHRTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcSwgKnRwU2lyU21lR2V0V1BTUEJDU2Vzc2lvbnNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJXUFNQQkNQcm9iZVJlcQoreworICAgIHRTaXJNYWNBZGRyICAgICAgICBwZWVyTWFjQWRkcjsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgcHJvYmVSZXFJRUxlbjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgcHJvYmVSZXFJRVs1MTJdOworfSB0U2lyV1BTUEJDUHJvYmVSZXEsICp0cFNpcldQU1BCQ1Byb2JlUmVxOworCisvLyBwcm9iZXJlcSBmcm9tIHBlZXIsIHdoZW4gd3NjIGlzIGVuYWJsZWQKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVQcm9iZVJlcUluZAoreworICAgIHRBTklfVTE2ICAgICAgICAgICBtZXNzYWdlVHlwZTsgLy8gIGVXTklfU01FX1dQU19QQkNfUFJPQkVfUkVRX0lORAorICAgIHRBTklfVTE2ICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgIHNlc3Npb25JZDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgYnNzSWQ7CisgICAgdFNpcldQU1BCQ1Byb2JlUmVxIFdQU1BCQ1Byb2JlUmVxOworfSB0U2lyU21lUHJvYmVSZXFJbmQsICp0cFNpclNtZVByb2JlUmVxSW5kOworCit0eXBlZGVmIHN0cnVjdCBzU2lyVXBkYXRlQVBXUEFSU05JRXNSZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICBtZXNzYWdlVHlwZTsgICAgICAvLyBlV05JX1NNRV9TRVRfQVBXUEFSU05JRXNfUkVRCisgICAgdEFOSV9VMTYgICAgICAgbGVuZ3RoOyAgICAKKyAgICB0QU5JX1UxNiAgICAgICB0cmFuc2FjdGlvbklkOyAvL1RyYW5zYWN0aW9uIElEIGZvciBjbWQKKyAgICB0U2lyTWFjQWRkciAgICBic3NJZDsgICAgICAvLyBCU1NJRAorICAgIHRBTklfVTggICAgICAgIHNlc3Npb25JZDsgIC8vU2Vzc2lvbiBJRCAgICAKKyAgICB0U2lyUlNOaWUgICAgICBBUFdQQVJTTklFczsKK30gdFNpclVwZGF0ZUFQV1BBUlNOSUVzUmVxLCAqdHBTaXJVcGRhdGVBUFdQQVJTTklFc1JlcTsKKworI2VuZGlmCisKKy8vIFNNRSAtPiBIQUwgLSBUaGlzIGlzIHRoZSBob3N0IG9mZmxvYWQgcmVxdWVzdC4gCisjZGVmaW5lIFNJUl9JUFY0X0FSUF9SRVBMWV9PRkZMT0FEICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfSVBWNl9ORUlHSEJPUl9ESVNDT1ZFUllfT0ZGTE9BRCAgICAgICAgIDEKKyNkZWZpbmUgU0lSX0lQVjZfTlNfT0ZGTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNJUl9PRkZMT0FEX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfT0ZGTE9BRF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX09GRkxPQURfQkNBU1RfRklMVEVSX0VOQUJMRSAgICAgICAgICAgICAweDIKKyNkZWZpbmUgU0lSX09GRkxPQURfQVJQX0FORF9CQ0FTVF9GSUxURVJfRU5BQkxFICAgICAoU0lSX09GRkxPQURfRU5BQkxFfFNJUl9PRkZMT0FEX0JDQVNUX0ZJTFRFUl9FTkFCTEUpCisKKyNpZmRlZiBXTEFOX05TX09GRkxPQUQKK3R5cGVkZWYgc3RydWN0IHNTaXJOc09mZmxvYWRSZXEKK3sKKyAgICB0QU5JX1U4IHNyY0lQdjZBZGRyWzE2XTsKKyAgICB0QU5JX1U4IHNlbGZJUHY2QWRkclsxNl07CisgICAgLy9Pbmx5IHN1cHBvcnQgMiBwb3NzaWJsZSBOZXR3b3JrIEFkdmVydGlzZW1lbnQgSVB2NiBhZGRyZXNzCisgICAgdEFOSV9VOCB0YXJnZXRJUHY2QWRkcltTSVJfTUFDX05VTV9UQVJHRVRfSVBWNl9OU19PRkZMT0FEX05BXVsxNl07CisgICAgdEFOSV9VOCBzZWxmTWFjQWRkcls2XTsKKyAgICB0QU5JX1U4IHNyY0lQdjZBZGRyVmFsaWQ7CisgICAgdEFOSV9VOCB0YXJnZXRJUHY2QWRkclZhbGlkW1NJUl9NQUNfTlVNX1RBUkdFVF9JUFY2X05TX09GRkxPQURfTkFdOworfSB0U2lyTnNPZmZsb2FkUmVxLCAqdHBTaXJOc09mZmxvYWRSZXE7CisjZW5kaWYgLy9XTEFOX05TX09GRkxPQUQKKwordHlwZWRlZiBzdHJ1Y3Qgc1Npckhvc3RPZmZsb2FkUmVxCit7CisgICAgdEFOSV9VOCBvZmZsb2FkVHlwZTsKKyAgICB0QU5JX1U4IGVuYWJsZU9yRGlzYWJsZTsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgdEFOSV9VOCBob3N0SXB2NEFkZHIgWzRdOworICAgICAgICB0QU5JX1U4IGhvc3RJcHY2QWRkciBbMTZdOworICAgIH0gcGFyYW1zOworI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorICAgIHRTaXJOc09mZmxvYWRSZXEgbnNPZmZsb2FkSW5mbzsKKyNlbmRpZiAvL1dMQU5fTlNfT0ZGTE9BRAorfSB0U2lySG9zdE9mZmxvYWRSZXEsICp0cFNpckhvc3RPZmZsb2FkUmVxOworCisvKiBQYWNrZXQgVHlwZXMuICovCisjZGVmaW5lIFNJUl9LRUVQX0FMSVZFX05VTExfUEtUICAgICAgICAgICAgICAxCisjZGVmaW5lIFNJUl9LRUVQX0FMSVZFX1VOU09MSUNJVF9BUlBfUlNQICAgICAyCisKKy8qIEVuYWJsZSBvciBkaXNhYmxlIG9mZmxvYWQuICovCisjZGVmaW5lIFNJUl9LRUVQX0FMSVZFX0RJU0FCTEUgICAwCisjZGVmaW5lIFNJUl9LRUVQX0FMSVZFX0VOQUJMRSAgICAxCisKKy8qIEtlZXAgQWxpdmUgcmVxdWVzdC4gKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJLZWVwQWxpdmVSZXEKK3sKKyAgICB2X1U4X3QgICAgICAgICAgcGFja2V0VHlwZTsKKyAgICB2X1UzMl90ICAgICAgICAgdGltZVBlcmlvZDsKKyAgICB0U2lySXB2NEFkZHIgICAgaG9zdElwdjRBZGRyOyAKKyAgICB0U2lySXB2NEFkZHIgICAgZGVzdElwdjRBZGRyOworICAgIHRTaXJNYWNBZGRyICAgICBkZXN0TWFjQWRkcjsKKworfSB0U2lyS2VlcEFsaXZlUmVxLCAqdHBTaXJLZWVwQWxpdmVSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVBZGRTdGFTZWxmUmVxCit7CisgICAgdEFOSV9VMTYgICAgICAgIG1lc2dUeXBlOworICAgIHRBTklfVTE2ICAgICAgICBtZXNnTGVuOworICAgIHRTaXJNYWNBZGRyICAgICBzZWxmTWFjQWRkcjsKK310U2lyU21lQWRkU3RhU2VsZlJlcSwgKnRwU2lyU21lQWRkU3RhU2VsZlJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZURlbFN0YVNlbGZSZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgbWVzZ1R5cGU7CisgICAgdEFOSV9VMTYgICAgICAgIG1lc2dMZW47CisgICAgdFNpck1hY0FkZHIgICAgIHNlbGZNYWNBZGRyOworfXRTaXJTbWVEZWxTdGFTZWxmUmVxLCAqdHBTaXJTbWVEZWxTdGFTZWxmUmVxOworCit0eXBlZGVmIHN0cnVjdCBzU2lyU21lQWRkU3RhU2VsZlJzcAoreworICAgIHRBTklfVTE2ICAgICAgICBtZXNnVHlwZTsKKyAgICB0QU5JX1UxNiAgICAgICAgbWVzZ0xlbjsKKyAgICB0QU5JX1UxNiAgICAgICAgc3RhdHVzOworICAgIHRTaXJNYWNBZGRyICAgICBzZWxmTWFjQWRkcjsKK310U2lyU21lQWRkU3RhU2VsZlJzcCwgKnRwU2lyU21lQWRkU3RhU2VsZlJzcDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZURlbFN0YVNlbGZSc3AKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgbWVzZ1R5cGU7CisgICAgdEFOSV9VMTYgICAgICAgIG1lc2dMZW47CisgICAgdEFOSV9VMTYgICAgICAgIHN0YXR1czsKKyAgICB0U2lyTWFjQWRkciAgICAgc2VsZk1hY0FkZHI7Cit9dFNpclNtZURlbFN0YVNlbGZSc3AsICp0cFNpclNtZURlbFN0YVNlbGZSc3A7CisKKy8qIENvZXggSW5kaWNhdGlvbiBkZWZpbmVzIC0gCisgICBzaG91bGQgbWF0Y2ggV0xBTl9DT0VYX0lORF9EQVRBX1NJWkUgCisgICBzaG91bGQgbWF0Y2ggV0xBTl9DT0VYX0lORF9UWVBFX0RJU0FCTEVfSEJfTU9OSVRPUiAKKyAgIHNob3VsZCBtYXRjaCBXTEFOX0NPRVhfSU5EX1RZUEVfRU5BQkxFX0hCX01PTklUT1IgKi8KKyNkZWZpbmUgU0lSX0NPRVhfSU5EX0RBVEFfU0laRSAoNCkKKyNkZWZpbmUgU0lSX0NPRVhfSU5EX1RZUEVfRElTQUJMRV9IQl9NT05JVE9SICgwKQorI2RlZmluZSBTSVJfQ09FWF9JTkRfVFlQRV9FTkFCTEVfSEJfTU9OSVRPUiAoMSkKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNtZUNvZXhJbmQKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgbWVzZ1R5cGU7CisgICAgdEFOSV9VMTYgICAgICAgIG1lc2dMZW47CisgICAgdEFOSV9VMzIgICAgICAgIGNvZXhJbmRUeXBlOworICAgIHRBTklfVTMyICAgICAgICBjb2V4SW5kRGF0YVtTSVJfQ09FWF9JTkRfREFUQV9TSVpFXTsKK310U2lyU21lQ29leEluZCwgKnRwU2lyU21lQ29leEluZDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVNZ210RnJhbWVJbmQKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgbWVzZ1R5cGU7CisgICAgdEFOSV9VMTYgICAgICAgIG1lc2dMZW47CisgICAgdEFOSV9VOCAgICAgICAgc2Vzc2lvbklkOworICAgIHRBTklfVTggICAgICAgICBmcmFtZVR5cGU7CisgICAgdEFOSV9VMzIgICAgICAgIHJ4Q2hhbjsKKyAgICB0QU5JX1U4ICBmcmFtZUJ1ZlsxXTsgLy92YXJpYWJsZQorfXRTaXJTbWVNZ210RnJhbWVJbmQsICp0cFNpclNtZU1nbXRGcmFtZUluZDsKKyNlbmRpZgorCisjZGVmaW5lIFNJUl9JU19GVUxMX1BPV0VSX1JFQVNPTl9ESVNDT05ORUNURUQoZVJlYXNvbikgXAorICAgICggKCBlU01FX0xJTktfRElTQ09OTkVDVEVEX0JZX0hERCA9PSAoZVJlYXNvbikgKSB8fCBcCisgICAgICAoIGVTTUVfTElOS19ESVNDT05ORUNURURfQllfT1RIRVIgPT0gKGVSZWFzb24pICkgfHwgXAorICAgICAgKGVTTUVfRlVMTF9QV1JfTkVFREVEX0JZX0NIQU5ORUxfU1dJVENIID09IChlUmVhc29uKSkpCisjZGVmaW5lIFNJUl9JU19GVUxMX1BPV0VSX05FRURFRF9CWV9IREQoZVJlYXNvbikgXAorICAgICggKCBlU01FX0xJTktfRElTQ09OTkVDVEVEX0JZX0hERCA9PSAoZVJlYXNvbikgKSB8fCAoIGVTTUVfRlVMTF9QV1JfTkVFREVEX0JZX0hERCA9PSAoZVJlYXNvbikgKSApCisKKy8qIFAyUCBQb3dlciBTYXZlIFJlbGF0ZWQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCit0eXBlZGVmIHN0cnVjdCBzU2lyTm9BUGFyYW0KK3sKKyAgICB0QU5JX1U4IGN0V2luZG93Ojc7CisgICAgdEFOSV9VOCBPcHBQUzoxOworICAgIHRBTklfVTggY291bnQ7CisgICAgdEFOSV9VMzIgZHVyYXRpb247CisgICAgdEFOSV9VMzIgaW50ZXJ2YWw7CisgICAgdEFOSV9VMzIgc2luZ2xlTm9BRHVyYXRpb247CisgICAgdEFOSV9VOCAgIHBzU2VsZWN0aW9uOworfXRTaXJOb0FQYXJhbSwgKnRwU2lyTm9BUGFyYW07CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldsYW5TdXNwZW5kUGFyYW0KK3sKKyAgICB0QU5JX1U4IGNvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmc7Cit9dFNpcldsYW5TdXNwZW5kUGFyYW0sKnRwU2lyV2xhblN1c3BlbmRQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldsYW5SZXN1bWVQYXJhbQoreworICAgIHRBTklfVTggY29uZmlndXJlZE1jc3RCY3N0RmlsdGVyU2V0dGluZzsKK310U2lyV2xhblJlc3VtZVBhcmFtLCp0cFNpcldsYW5SZXN1bWVQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpcldsYW5TZXRSeHBGaWx0ZXJzCit7CisgICAgdEFOSV9VOCBjb25maWd1cmVkTWNzdEJjc3RGaWx0ZXJTZXR0aW5nOworICAgIHRBTklfVTggc2V0TWNzdEJjc3RGaWx0ZXI7Cit9dFNpcldsYW5TZXRSeHBGaWx0ZXJzLCp0cFNpcldsYW5TZXRSeHBGaWx0ZXJzOworI2VuZGlmCisKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworLy8KKy8vIFBOTyBNZXNzYWdlcworLy8KKworLy8gU2V0IFBOTyAKKyNkZWZpbmUgU0lSX1BOT19NQVhfTkVUV19DSEFOTkVMUyAgMjYKKyNkZWZpbmUgU0lSX1BOT19NQVhfU1VQUF9ORVRXT1JLUyAgMTYKKyNkZWZpbmUgU0lSX1BOT19NQVhfU0NBTl9USU1FUlMgICAgMTAKKworLypzaXplIGJhc2VkIG9mIGRvdDExIGRlY2xhcmF0aW9uIHdpdGhvdXQgZXh0cmEgSUVzIGFzIHdlIHdpbGwgbm90IGNhcnJ5IHRob3NlIGZvciBQTk8qLworI2RlZmluZSBTSVJfUE5PX01BWF9QQl9SRVFfU0laRSAgICA0NTAgCisKKyNkZWZpbmUgU0lSX1BOT18yNEdfREVGQVVMVF9DSCAgICAgMQorI2RlZmluZSBTSVJfUE5PXzVHX0RFRkFVTFRfQ0ggICAgICAzNgorCit0eXBlZGVmIGVudW0KK3sKKyAgIFNJUl9QTk9fTU9ERV9JTU1FRElBVEUsCisgICBTSVJfUE5PX01PREVfT05fU1VTUEVORCwKKyAgIFNJUl9QTk9fTU9ERV9PTl9SRVNVTUUsCisgICBTSVJfUE5PX01PREVfTUFYIAorfSBlU2lyUE5PTW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIHRTaXJNYWNTU2lkIHNzSWQ7CisgIHRBTklfVTMyICAgIGF1dGhlbnRpY2F0aW9uOyAKKyAgdEFOSV9VMzIgICAgZW5jcnlwdGlvbjsgCisgIHRBTklfVTMyICAgIGJjYXN0TmV0d1R5cGU7IAorICB0QU5JX1U4ICAgICB1Y0NoYW5uZWxDb3VudDsKKyAgdEFOSV9VOCAgICAgYUNoYW5uZWxzW1NJUl9QTk9fTUFYX05FVFdfQ0hBTk5FTFNdOyAKKyAgdEFOSV9VOCAgICAgcnNzaVRocmVzaG9sZDsKK30gdFNpck5ldHdvcmtUeXBlOyAKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIHRBTklfVTMyICAgIHVUaW1lclZhbHVlOyAKKyAgdEFOSV9VMzIgICAgdVRpbWVyUmVwZWF0OyAKK310U2lyU2NhblRpbWVyOyAKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdEFOSV9VOCAgICAgICAgdWNTY2FuVGltZXJzQ291bnQ7IAorICB0U2lyU2NhblRpbWVyICBhVGltZXJWYWx1ZXNbU0lSX1BOT19NQVhfU0NBTl9USU1FUlNdOyAKK30gdFNpclNjYW5UaW1lcnNUeXBlOworCit0eXBlZGVmIHN0cnVjdCBzU2lyUE5PU2NhblJlcQoreworICB0QU5JX1U4ICAgICAgICAgICAgIGVuYWJsZTsKKyAgZVNpclBOT01vZGUgICAgICAgICBtb2RlUE5POworICB0QU5JX1U4ICAgICAgICAgICAgIHVjTmV0d29ya3NDb3VudDsgCisgIHRTaXJOZXR3b3JrVHlwZSAgICAgYU5ldHdvcmtzW1NJUl9QTk9fTUFYX1NVUFBfTkVUV09SS1NdOworICB0U2lyU2NhblRpbWVyc1R5cGUgIHNjYW5UaW1lcnM7CisgIAorICAvKmFkZGVkIGJ5IFNNRSovCisgIHRBTklfVTE2ICB1czI0R1Byb2JlVGVtcGxhdGVMZW47IAorICB0QU5JX1U4ICAgcDI0R1Byb2JlVGVtcGxhdGVbU0lSX1BOT19NQVhfUEJfUkVRX1NJWkVdOworICB0QU5JX1UxNiAgdXM1R1Byb2JlVGVtcGxhdGVMZW47IAorICB0QU5JX1U4ICAgcDVHUHJvYmVUZW1wbGF0ZVtTSVJfUE5PX01BWF9QQl9SRVFfU0laRV07IAorfSB0U2lyUE5PU2NhblJlcSwgKnRwU2lyUE5PU2NhblJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNldFJTU0lGaWx0ZXJSZXEKK3sKKyAgdEFOSV9VOCAgICAgcnNzaVRocmVzaG9sZDsKK30gdFNpclNldFJTU0lGaWx0ZXJSZXEsICp0cFNpclNldFJTU0lGaWx0ZXJSZXE7CisKKworLy8gVXBkYXRlIFNjYW4gUGFyYW1zIAordHlwZWRlZiBzdHJ1Y3QgeworICB0QU5JX1U4ICAgYjExZEVuYWJsZWQ7IAorICB0QU5JX1U4ICAgYjExZFJlc29sdmVkOworICB0QU5JX1U4ICAgdWNDaGFubmVsQ291bnQ7IAorICB0QU5JX1U4ICAgYUNoYW5uZWxzW1NJUl9QTk9fTUFYX05FVFdfQ0hBTk5FTFNdOyAKKyAgdEFOSV9VMTYgIHVzUGFzc2l2ZU1pbkNoVGltZTsgCisgIHRBTklfVTE2ICB1c1Bhc3NpdmVNYXhDaFRpbWU7IAorICB0QU5JX1UxNiAgdXNBY3RpdmVNaW5DaFRpbWU7IAorICB0QU5JX1UxNiAgdXNBY3RpdmVNYXhDaFRpbWU7IAorICB0QU5JX1U4ICAgdWNDQlN0YXRlOyAKK30gdFNpclVwZGF0ZVNjYW5QYXJhbXMsICogdHBTaXJVcGRhdGVTY2FuUGFyYW1zOworCisvLyBQcmVmZXJyZWQgTmV0d29yayBGb3VuZCBJbmRpY2F0aW9uCit0eXBlZGVmIHN0cnVjdAoreyAgCisgIHRBTklfVTE2ICAgICAgICBtZXNnVHlwZTsKKyAgdEFOSV9VMTYgICAgICAgIG1lc2dMZW47CisgIC8qIE5ldHdvcmsgdGhhdCB3YXMgZm91bmQgd2l0aCB0aGUgaGlnaGVzdCBSU1NJKi8KKyAgdFNpck1hY1NTaWQgc3NJZDsKKyAgLyogSW5kaWNhdGVzIHRoZSBSU1NJICovCisgIHRBTklfVTggICAgICAgIHJzc2k7Cit9IHRTaXJQcmVmTmV0d29ya0ZvdW5kSW5kLCAqdHBTaXJQcmVmTmV0d29ya0ZvdW5kSW5kOworI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCisjZGVmaW5lIFNJUl9OT0NIQU5HRV9QT1dFUl9WQUxVRSAgMHhGRkZGRkZGRgorCisvL1Bvd2VyIFBhcmFtZXRlcnMgVHlwZQordHlwZWRlZiBlbnVtCit7CisgICBlU0lSX0lHTk9SRV9EVElNICAgICAgICA9IDEsCisgICBlU0lSX0xJU1RFTl9JTlRFUlZBTCAgICA9IDIsIAorICAgZVNJUl9NQ0FTVF9CQ0FTVF9GSUxURVIgPSAzLCAKKyAgIGVTSVJfRU5BQkxFX0JFVCAgICAgICAgID0gNCwgCisgICBlU0lSX0JFVF9JTlRFUlZBTCAgICAgICA9IDUgCit9dFBvd2VyUGFyYW1UeXBlOworCisvL1Bvd2VyIFBhcmFtZXRlcnMgVmFsdWUgcwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIC8qICBJZ25vcmUgRFRJTSAqLworICB0QU5JX1UzMiB1SWdub3JlRFRJTTsKKworICAvKiBEVElNIFBlcmlvZCAqLworICB0QU5JX1UzMiB1RFRJTVBlcmlvZDsgCisKKyAgLyogTGlzdGVuIEludGVydmFsICovCisgIHRBTklfVTMyIHVMaXN0ZW5JbnRlcnZhbDsKKworICAvKiBCcm9hZGNhc3QgTXVsdGljYXMgRmlsdGVyICAqLworICB0QU5JX1UzMiB1QmNhc3RNY2FzdEZpbHRlcjsKKworICAvKiBCZWFjb24gRWFybHkgVGVybWluYXRpb24gKi8KKyAgdEFOSV9VMzIgdUVuYWJsZUJFVDsKKworICAvKiBCZWFjb24gRWFybHkgVGVybWluYXRpb24gSW50ZXJ2YWwgKi8KKyAgdEFOSV9VMzIgdUJFVEludGVydmFsOyAKKworfXRTaXJTZXRQb3dlclBhcmFtc1JlcSwgKnRwU2lyU2V0UG93ZXJQYXJhbXNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJUeFBlclRyYWNraW5nUGFyYW0KK3sKKyAgICB0QU5JX1U4ICB1Y1R4UGVyVHJhY2tpbmdFbmFibGU7ICAgICAgICAgICAvKiAwOiBkaXNhYmxlLCAxOmVuYWJsZSAqLworICAgIHRBTklfVTggIHVjVHhQZXJUcmFja2luZ1BlcmlvZDsgICAgICAgICAgICAgIC8qIENoZWNrIHBlcmlvZCwgdW5pdCBpcyBzZWMuIE9uY2UgdHhfc3RhdF9jaGsgZW5hYmxlLCBmaXJtd2FyZSB3aWxsIGNoZWNrIFBFUiBpbiB0aGlzIHBlcmlvZCBwZXJpb2RpY2FsbHkgKi8KKyAgICB0QU5JX1U4ICB1Y1R4UGVyVHJhY2tpbmdSYXRpbzsgICAgICAgICAgICAvKiAoRmFpbCBUWCBwYWNrZXQpLyhUb3RhbCBUWCBwYWNrZXQpIHJhdGlvLCB0aGUgdW5pdCBpcyAxMCUuIGZvciBleGFtcGxlLCA1IG1lYW5zIDUwJSBUWCBmYWlsZWQgcmF0ZSwgZGVmYXVsdCBpcyA1LiBJZiBjdXJyZW50IFRYIHBhY2tldCBmYWlsZWQgcmF0ZSBiaWdnZXIgdGhhbiB0aGlzIHJhdGlvIHRoZW4gZmlybXdhcmUgc2VuZCBXTENfRV9UWF9TVEFUX0VSUk9SIGV2ZW50IHRvIGRyaXZlciAqLworICAgIHRBTklfVTMyIHVUeFBlclRyYWNraW5nV2F0ZXJtYXJrOyAgICAgICAgICAgICAgIC8qIEEgd2F0ZXJtYXJrIG9mIGNoZWNrIG51bWJlciwgb25jZSB0aGUgdHggcGFja2V0IGV4Y2VlZCB0aGlzIG51bWJlciwgd2UgZG8gdGhlIGNoZWNrLCBkZWZhdWx0IGlzIDUgKi8KK310U2lyVHhQZXJUcmFja2luZ1BhcmFtLCAqdHBTaXJUeFBlclRyYWNraW5nUGFyYW07CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUGFja2V0IEZpbHRlcmluZyBQYXJhbWV0ZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSAgICBTSVJfSVBWNF9BRERSX0xFTiAgICAgICAgICAgICAgICAgNAorI2RlZmluZSAgICBTSVJfTUFDX0FERFJfTEVOICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSAgICBTSVJfTUFYX0ZJTFRFUl9URVNUX0RBVEFfTEVOICAgICAgIDgKKyNkZWZpbmUgICAgU0lSX01BWF9OVU1fTVVMVElDQVNUX0FERFJFU1MgICAgMjQwCisjZGVmaW5lICAgIFNJUl9NQVhfTlVNX0ZJTFRFUlMgICAgICAgICAgICAgICAyMCAKKyNkZWZpbmUgICAgU0lSX01BWF9OVU1fVEVTVFNfUEVSX0ZJTFRFUiAgICAgIDEwIAorCisvLworLy8gUmVjZWl2ZSBGaWx0ZXIgUGFyYW1ldGVycworLy8KK3R5cGVkZWYgZW51bQoreworICBTSVJfUkNWX0ZJTFRFUl9UWVBFX0lOVkFMSUQsCisgIFNJUl9SQ1ZfRklMVEVSX1RZUEVfRklMVEVSX1BLVCwKKyAgU0lSX1JDVl9GSUxURVJfVFlQRV9CVUZGRVJfUEtULAorICBTSVJfUkNWX0ZJTFRFUl9UWVBFX01BWF9FTlVNX1NJWkUKK31lU2lyUmVjZWl2ZVBhY2tldEZpbHRlclR5cGU7CisKK3R5cGVkZWYgZW51bSAKK3sKKyAgU0lSX0ZJTFRFUl9IRFJfVFlQRV9JTlZBTElELAorICBTSVJfRklMVEVSX0hEUl9UWVBFX01BQywKKyAgU0lSX0ZJTFRFUl9IRFJfVFlQRV9BUlAsCisgIFNJUl9GSUxURVJfSERSX1RZUEVfSVBWNCwKKyAgU0lSX0ZJTFRFUl9IRFJfVFlQRV9JUFY2LAorICBTSVJfRklMVEVSX0hEUl9UWVBFX1VEUCwKKyAgU0lSX0ZJTFRFUl9IRFJfVFlQRV9NQVgKK31lU2lyUmN2UGt0Rmx0UHJvdG9jb2xUeXBlOworCit0eXBlZGVmIGVudW0gCit7CisgIFNJUl9GSUxURVJfQ01QX1RZUEVfSU5WQUxJRCwKKyAgU0lSX0ZJTFRFUl9DTVBfVFlQRV9FUVVBTCwKKyAgU0lSX0ZJTFRFUl9DTVBfVFlQRV9NQVNLX0VRVUFMLAorICBTSVJfRklMVEVSX0NNUF9UWVBFX05PVF9FUVVBTCwKKyAgU0lSX0ZJTFRFUl9DTVBfVFlQRV9NQVNLX05PVF9FUVVBTCwKKyAgU0lSX0ZJTFRFUl9DTVBfVFlQRV9NQVgKK31lU2lyUmN2UGt0Rmx0Q21wRmxhZ1R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJSY3ZQa3RGaWx0ZXJGaWVsZFBhcmFtcworeworICBlU2lyUmN2UGt0Rmx0UHJvdG9jb2xUeXBlICAgICAgICBwcm90b2NvbExheWVyOworICBlU2lyUmN2UGt0Rmx0Q21wRmxhZ1R5cGUgICAgICAgICBjbXBGbGFnOworICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgdG8gY29tcGFyZSAqLworICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoOyAKKyAgLyogZnJvbSBzdGFydCBvZiB0aGUgcmVzcGVjdGl2ZSBmcmFtZSBoZWFkZXIgKi8KKyAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldDsgCisgIC8qIFJlc2VydmVkIGZpZWxkICovCisgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkOyAKKyAgLyogRGF0YSB0byBjb21wYXJlICovCisgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVEYXRhW1NJUl9NQVhfRklMVEVSX1RFU1RfREFUQV9MRU5dOworICAvKiBNYXNrIHRvIGJlIGFwcGxpZWQgb24gdGhlIHJlY2VpdmVkIHBhY2tldCBkYXRhIGJlZm9yZSBjb21wYXJlICovCisgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFNYXNrW1NJUl9NQVhfRklMVEVSX1RFU1RfREFUQV9MRU5dOyAgIAorfXRTaXJSY3ZQa3RGaWx0ZXJGaWVsZFBhcmFtcywgKnRwU2lyUmN2UGt0RmlsdGVyRmllbGRQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJSY3ZQa3RGaWx0ZXJDZmcKK3sKKyAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJJZDsgCisgIGVTaXJSZWNlaXZlUGFja2V0RmlsdGVyVHlwZSAgICAgZmlsdGVyVHlwZTsKKyAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICAgICBudW1GaWVsZFBhcmFtczsKKyAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICAgICBjb2FsZXNjZVRpbWU7CisgIHRTaXJSY3ZQa3RGaWx0ZXJGaWVsZFBhcmFtcyAgICAgcGFyYW1zRGF0YVtTSVJfTUFYX05VTV9URVNUU19QRVJfRklMVEVSXTsKK310U2lyUmN2UGt0RmlsdGVyQ2ZnVHlwZSwgKnRwU2lyUmN2UGt0RmlsdGVyQ2ZnVHlwZTsKKworLy8KKy8vIEZpbHRlciBQYWNrZXQgTWF0Y2ggQ291bnQgUGFyYW1ldGVycworLy8KK3R5cGVkZWYgc3RydWN0IHNTaXJSY3ZGbHRQa3RNYXRjaENudAoreworICB0QU5JX1U4ICAgIGZpbHRlcklkOworICB0QU5JX1UzMiAgIG1hdGNoQ250OworfSB0U2lyUmN2Rmx0UGt0TWF0Y2hDbnQsIHRwU2lyUmN2Rmx0UGt0TWF0Y2hDbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNTaXJSY3ZGbHRQa3RNYXRjaFJzcAoreworICB0QU5JX1UxNiAgICAgICAgbWVzZ1R5cGU7CisgIHRBTklfVTE2ICAgICAgICBtZXNnTGVuOworICAgIAorICAvKiBTdWNjZXNzIG9yIEZhaWx1cmUgKi8KKyAgdEFOSV9VMzIgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgdFNpclJjdkZsdFBrdE1hdGNoQ250ICAgIGZpbHRlck1hdGNoQ250W1NJUl9NQVhfTlVNX0ZJTFRFUlNdOworfSB0U2lyUmN2Rmx0UGt0TWF0Y2hSc3AsICp0cFNpclJjdkZsdFBrdE1hdGNoUnNwOworCisvLworLy8gUmVjZWl2ZSBGaWx0ZXIgQ2xlYXIgUGFyYW1ldGVycworLy8KK3R5cGVkZWYgc3RydWN0IHNTaXJSY3ZGbHRQa3RDbGVhclBhcmFtCit7CisgIHRBTklfVTMyICAgc3RhdHVzOyAgLyogb25seSB2YWxpZCBmb3IgcmVzcG9uc2UgbWVzc2FnZSAqLworICB0QU5JX1U4ICAgIGZpbHRlcklkOworfXRTaXJSY3ZGbHRQa3RDbGVhclBhcmFtLCAqdHBTaXJSY3ZGbHRQa3RDbGVhclBhcmFtOworCisvLworLy8gTXVsdGljYXN0IEFkZHJlc3MgTGlzdCBQYXJhbWV0ZXJzCisvLwordHlwZWRlZiBzdHJ1Y3Qgc1NpclJjdkZsdE1jQWRkckxpc3QKK3sKKyAgdEFOSV9VMzIgICAgICAgdWxNdWx0aWNhc3RBZGRyQ250OworICB0U2lyTWFjQWRkciAgICBtdWx0aWNhc3RBZGRyW1NJUl9NQVhfTlVNX01VTFRJQ0FTVF9BRERSRVNTXTsKK30gdFNpclJjdkZsdE1jQWRkckxpc3QsICp0cFNpclJjdkZsdE1jQWRkckxpc3Q7CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKworLy8KKy8vIEdlbmVyaWMgdmVyc2lvbiBpbmZvcm1hdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHRBTklfVTggICAgcmV2aXNpb247CisgIHRBTklfVTggICAgdmVyc2lvbjsKKyAgdEFOSV9VOCAgICBtaW5vcjsKKyAgdEFOSV9VOCAgICBtYWpvcjsKK30gdFNpclZlcnNpb25UeXBlOworCit0eXBlZGVmIHN0cnVjdCBzQW5pQnRBbXBMb2dMaW5rUmVxCit7CisgICAgLy8gQ29tbW9uIGZvciBhbGwgdHlwZXMgYXJlIHJlcXVlc3RzCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbXNnVHlwZTsgICAgLy8gbWVzc2FnZSB0eXBlIGlzIHNhbWUgYXMgdGhlIHJlcXVlc3QgdHlwZQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG1zZ0xlbjsgIC8vIGxlbmd0aCBvZiB0aGUgZW50aXJlIHJlcXVlc3QKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ7IC8vc21lIFNlc3Npb24gSWQKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICpidGFtcEhhbmRsZTsgLy9BTVAgY29udGV4dAorICAgIAorfSB0QW5pQnRBbXBMb2dMaW5rUmVxLCAqdHBBbmlCdEFtcExvZ0xpbmtSZXE7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIFdEQV9HVEtfT0ZGTE9BRF9SRVEKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICB0QU5JX1UzMiAgICAgdWxGbGFnczsgICAgICAgICAgICAgLyogb3B0aW9uYWwgZmxhZ3MgKi8KKyAgdEFOSV9VOCAgICAgIGFLQ0tbMTZdOyAgICAgICAgICAgIC8qIEtleSBjb25maXJtYXRpb24ga2V5ICovIAorICB0QU5JX1U4ICAgICAgYUtFS1sxNl07ICAgICAgICAgICAgLyoga2V5IGVuY3J5cHRpb24ga2V5ICovCisgIHRBTklfVTY0ICAgICB1bGxLZXlSZXBsYXlDb3VudGVyOyAvKiByZXBsYXkgY291bnRlciAqLworfSB0U2lyR3RrT2ZmbG9hZFBhcmFtcywgKnRwU2lyR3RrT2ZmbG9hZFBhcmFtczsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogV0RBX0dUS19PRkZMT0FEX0dFVElORk9fUkVRCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHRBTklfVTE2ICAgbWVzZ1R5cGU7CisgICB0QU5JX1UxNiAgIG1lc2dMZW47CisKKyAgIHRBTklfVTMyICAgdWxTdGF0dXM7ICAgICAgICAgICAgIC8qIHN1Y2Nlc3Mgb3IgZmFpbHVyZSAqLworICAgdEFOSV9VNjQgICB1bGxLZXlSZXBsYXlDb3VudGVyOyAgLyogY3VycmVudCByZXBsYXkgY291bnRlciB2YWx1ZSAqLworICAgdEFOSV9VMzIgICB1bFRvdGFsUmVrZXlDb3VudDsgICAgLyogdG90YWwgcmVrZXkgYXR0ZW1wdHMgKi8KKyAgIHRBTklfVTMyICAgdWxHVEtSZWtleUNvdW50OyAgICAgIC8qIHN1Y2Nlc3NmdWwgR1RLIHJla2V5cyAqLworICAgdEFOSV9VMzIgICB1bElHVEtSZWtleUNvdW50OyAgICAgLyogc3VjY2Vzc2Z1bCBpR1RLIHJla2V5cyAqLworfSB0U2lyR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXMsICp0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zOworI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB0U2lyV2FrZVJlYXNvbkluZCAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreyAgCisgICAgdEFOSV9VMTYgICAgICBtZXNnVHlwZTsKKyAgICB0QU5JX1UxNiAgICAgIG1lc2dMZW47CisgICAgdEFOSV9VMzIgICAgICB1bFJlYXNvbjsgICAgICAgIC8qIHNlZSB0V2FrZVJlYXNvblR5cGUgKi8KKyAgICB0QU5JX1UzMiAgICAgIHVsUmVhc29uQXJnOyAgICAgLyogYXJndW1lbnQgc3BlY2lmaWMgdG8gdGhlIHJlYXNvbiB0eXBlICovCisgICAgdEFOSV9VMzIgICAgICB1bFN0b3JlZERhdGFMZW47IC8qIGxlbmd0aCBvZiBvcHRpb25hbCBkYXRhIHN0b3JlZCBpbiB0aGlzIG1lc3NhZ2UsIGluIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTCB0cnVuY2F0ZXMgdGhlIGRhdGEgKGkuZS4gZGF0YSBwYWNrZXRzKSB0aGlzIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsZXNzIHRoYW4gdGhlIGFjdHVhbCBsZW5ndGggKi8KKyAgICB0QU5JX1UzMiAgICAgIHVsQWN0dWFsRGF0YUxlbjsgLyogYWN0dWFsIGxlbmd0aCBvZiBkYXRhICovCisgICAgdEFOSV9VOCAgICAgICBhRGF0YVN0YXJ0WzFdOyAgLyogdmFyaWFibGUgbGVuZ3RoIHN0YXJ0IG9mIGRhdGEgKGxlbmd0aCA9PSBzdG9yZWREYXRhTGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgc3BlY2lmaWMgd2FrZSB0eXBlICovIAorfSB0U2lyV2FrZVJlYXNvbkluZCwgKnRwU2lyV2FrZVJlYXNvbkluZDsKKyNlbmRpZiAvLyBXTEFOX1dBS0VVUF9FVkVOVFMKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgc0FuaVNldFRtTGV2ZWxSZXEgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVNldFRtTGV2ZWxSZXEKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICB0bU1vZGU7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbmV3VG1MZXZlbDsKK30gdEFuaVNldFRtTGV2ZWxSZXEsICp0cEFuaVNldFRtTGV2ZWxSZXE7CisKKyNlbmRpZiAvKiBfX1NJUl9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvaW5jL3Npck1hY1Byb3BFeHRzLmggYi9DT1JFL01BQy9pbmMvc2lyTWFjUHJvcEV4dHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzY4ZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvaW5jL3Npck1hY1Byb3BFeHRzLmgKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgc2lyTWFjUHJvcEV4dHMuaCBjb250YWlucyB0aGUgTUFDIHByb3RvY29sCisgKiBleHRlbnNpb25zIHRvIHN1cHBvcnQgQU5JIGZlYXR1cmUgc2V0LgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMTEvMjcvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKi8KKyNpZm5kZWYgX19NQUNfUFJPUF9FWFRTX0gKKyNkZWZpbmUgX19NQUNfUFJPUF9FWFRTX0gKKworI2luY2x1ZGUgInNpclR5cGVzLmgiCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAiYW5pU3lzdGVtRGVmcy5oIgorCisvLy8gRUlEIChFbGVtZW50IElEKSBkZWZpbml0aW9ucworCisvLyBQcm9wcmlldGFyeSBJRXMKKworLy8gVHlwZXMgZGVmaW5pdGlvbnMgdXNlZCB3aXRoaW4gcHJvcHJpZXRhcnkgSUUKKyNkZWZpbmUgU0lSX01BQ19QUk9QX0VYVF9SQVRFU19UWVBFICAgICAwCisjZGVmaW5lIFNJUl9NQUNfUFJPUF9BUF9OQU1FX1RZUEUgICAgICAgMQorI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorI2RlZmluZSBTSVJfTUFDX1BST1BfSENGX1RZUEUgICAgICAgICAgIDIKKyNkZWZpbmUgU0lSX01BQ19QUk9QX1dEU19UWVBFICAgICAgICAgICAzCisjZGVmaW5lIFNJUl9NQUNfUFJPUF9CUF9JTkRfVFlQRSAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX1BST1BfTkVJR0hCT1JfQlNTX1RZUEUgIDUKKyNlbmRpZgorI2RlZmluZSBTSVJfTUFDX1BST1BfTE9BRF9JTkZPX1RZUEUgICAgIDYKKyNkZWZpbmUgU0lSX01BQ19QUk9QX0FTU09DX1RZUEUgICAgICAgICA3CisjZGVmaW5lIFNJUl9NQUNfUFJPUF9MT0FEX0JBTEFOQ0VfVFlQRSAgOAorI2RlZmluZSBTSVJfTUFDX1BST1BfTExfQVRUUl9UWVBFICAgICAgIDkKKyNkZWZpbmUgU0lSX01BQ19QUk9QX0NBUEFCSUxJVFkgICAgICAgICAxMCAgLy8gcHJvcHJpZXRhcnkgY2FwYWJpbGl0aWVzCisjZGVmaW5lIFNJUl9NQUNfUFJPUF9WRVJTSU9OICAgICAgICAgICAgMTEgIC8vIHZlcnNpb24gaW5mbworI2RlZmluZSBTSVJfTUFDX1BST1BfRURDQVBBUkFNUyAgICAgICAgIDEyICAvLyBlZGNhIHBhcmFtcyBmb3IgMTFlIGFuZCB3bWUKKyNkZWZpbmUgU0lSX01BQ19QUk9QX1NSQ01BQyAgICAgICAgICAgICAxMyAgLy8gc2VuZGVyJ3MgbWFjIGFkZHJlc3MKKyNkZWZpbmUgU0lSX01BQ19QUk9QX1RJVEFOICAgICAgICAgICAgICAxNCAgLy8gQWR2ZXJ0aXNlcyBhIFRJVEFOIGRldmljZQorI2RlZmluZSBTSVJfTUFDX1BST1BfQ0hBTk5FTF9TV0lUQ0ggICAgIDE1ICAvLyBwcm9wcmlldGFyeSBjaGFubmVsIHN3aXRjaCBpbmZvCisjZGVmaW5lIFNJUl9NQUNfUFJPUF9RVUlFVF9CU1MgICAgICAgICAgMTYgIC8vIEJyb2FkY2FzdCdzIFJFUSBmb3IgUXVpZXQgQlNTCisjZGVmaW5lIFNJUl9NQUNfUFJPUF9UUklHX1NUQV9CS19TQ0FOICAgMTcgIC8vIHRyaWdnZXIgc3RhdGlvbiBiayBzY2FuIGR1cmluZyBxdWlldCBic3MgZHVyYXRpb24KKyNkZWZpbmUgU0lSX01BQ19QUk9QX1RBVVJVUyAgICAgICAgICAgICAgMTggIC8vIEFkdmVydGlzZXMgYSBUQVVSVVMgZGV2aWNlCisKKy8vIGNhcGFiaWxpdHkgaWUgaW5mbworI2RlZmluZSBTSVJfTUFDX1BST1BfQ0FQQUJJTElUWV9NSU4gICAgICBzaXplb2YodEFOSV9VMTYpCisKKy8vIHRyaWdnZXIgc3RhIHNjYW4gaWUgbGVuZ3RoIGRlZmluZXMKKyNkZWZpbmUgU0lSX01BQ19QUk9QX1RSSUdfU1RBX0JLX1NDQU5fRUlEX01JTiAgICAgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX1BST1BfVFJJR19TVEFfQktfU0NBTl9FSURfTUFYICAgICAgICAgICAxCisKKy8vIHRoZSBiaXQgbWFwIGlzIGFsc28gdXNlZCBhcyBhIGNvbmZpZyBlbmFibGUsIHNldHRpbmcgYSBiaXQgaW4gdGhlCisvLyBwcm9wSUUgY29uZmlnIHZhcmlhYmxlLCBlbmFibGVzIHRoZSBjb3JyZXNwb25kaW5nIGNhcGFiaWxpdHkgaW4gdGhlIHByb3BJRQorLy8gdGhlIGVuYWJsZXMgc2ltcGx5IHJlc3VsdCBpbiBpbmNsdWRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiB0aGUKKy8vIHByb3BJRQorLy8gRXg6IHNldHRpbmcgdGhlIGNhcGFiaWxpdHkgYml0IEhDRiB3b3VsZCByZXN1bHQgaW4gdXNpbmcgdGhlIGNhcGFiaWxpdHkgYml0IG1hcCBmb3IKKy8vIGhjZiBpbnN0ZWFkIG9mIGluY2x1ZGluZyB0aGUgZnVsbCBIQ0YgZWxlbWVudCBpbiB0aGUgSUUKKy8vIGNhcGFiaWxpdGllcyBiaXQgbWFwIC0gYml0IG9mZnNldHMKKy8vIHNldHRpbmcgMTFlUW9zIGhhcyBlZmZlY3Qgb25seSBpZiBRb1MgaXMgYWxzbyBlbmFibGVkLiB0aGVuIGl0IG92ZXJyaWRlcworLy8gMTFlIHN1cHBvcnQgYW5kIGltcGxlbWVudHMgaXQgc2lsZW50bHkgKGFzIHBhcnQgb2YgdGhlIHByb3AgaWUpCisjZGVmaW5lIFNJUl9NQUNfUFJPUF9DQVBBQklMSVRZX0hDRiAgICAgICAgICAgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfSENGCisjZGVmaW5lIFNJUl9NQUNfUFJPUF9DQVBBQklMSVRZXzExRVFPUyAgICAgICAgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfMTFFUU9TCisjZGVmaW5lIFNJUl9NQUNfUFJPUF9DQVBBQklMSVRZX1dNRSAgICAgICAgICAgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfV01FCisjZGVmaW5lIFNJUl9NQUNfUFJPUF9DQVBBQklMSVRZX1dTTSAgICAgICAgICAgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfV1NNCisjZGVmaW5lIFNJUl9NQUNfUFJPUF9DQVBBQklMSVRZX0VYVFJBVEVTICAgICAgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfRVhUUkFURVMKKy8vIGFwLT5zdGEgb25seSwgcmVxdWVzdCBTVEEgdG8gc3RvcCB1c2luZyBwcm9wIHJhdGVzIGZvciBzb21lIHRpbWUKKyNkZWZpbmUgU0lSX01BQ19QUk9QX0NBUEFCSUxJVFlfRVhUUkFURV9TVE9QICBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9FWFRSQVRFX1NUT1AKKyNkZWZpbmUgU0lSX01BQ19QUk9QX0NBUEFCSUxJVFlfVElUQU4gICAgICAgICBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9USVRBTgorI2RlZmluZSBTSVJfTUFDX1BST1BfQ0FQQUJJTElUWV9UQVVSVVMgICAgICAgICBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9UQVVSVVMKKyNkZWZpbmUgU0lSX01BQ19QUk9QX0NBUEFCSUxJVFlfRVNDT1JUX1BLVCAgICBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9FU0NPUlRfUEtUCisvLyB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOS0xMgorI2RlZmluZSBTSVJfTUFDX1BST1BfQ0FQQUJJTElUWV9FRENBUEFSQU1TICAgIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX0VEQ0FQQVJBTVMKKyNkZWZpbmUgU0lSX01BQ19QUk9QX0NBUEFCSUxJVFlfTE9BRElORk8gICAgICBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9MT0FESU5GTworI2RlZmluZSBTSVJfTUFDX1BST1BfQ0FQQUJJTElUWV9WRVJTSU9OICAgICAgIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX1ZFUlNJT04KKyNkZWZpbmUgU0lSX01BQ19QUk9QX0NBUEFCSUxJVFlfTUFYQklUT0ZGU0VUICBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9NQVhCSVRPRkZTRVQKKworLy8gbWFjcm8gdG8gc2V0L2dldCBhIGNhcGFiaWxpdHkgYml0LCBiaXRuYW1lIGlzIG9uZSBvZiBIQ0YvMTFFUU9TL2V0Yy4uLgorI2RlZmluZSBQUk9QX0NBUEFCSUxJVFlfU0VUKGJpdG5hbWUsIHZhbHVlKSBcCisgICAgICAgICh2YWx1ZSkgPSAodmFsdWUpIHwgKCh0QU5JX1UxNikoMSA8PCBTSVJfTUFDX1BST1BfQ0FQQUJJTElUWV8gIyMgYml0bmFtZSkpCisKKyNkZWZpbmUgUFJPUF9DQVBBQklMSVRZX1JFU0VUKGJpdG5hbWUsIHZhbHVlKSBcCisgICAgICAgICh2YWx1ZSkgPSAodmFsdWUpICYgfigodEFOSV9VMTYpKDEgPDwgU0lSX01BQ19QUk9QX0NBUEFCSUxJVFlfICMjIGJpdG5hbWUpKQorICAgICAgICAKKyNkZWZpbmUgUFJPUF9DQVBBQklMSVRZX0dFVChiaXRuYW1lLCB2YWx1ZSkgXAorICAgICAgICAoKCh2YWx1ZSkgPj4gU0lSX01BQ19QUk9QX0NBUEFCSUxJVFlfICMjIGJpdG5hbWUpICYgMSkKKworCisjZGVmaW5lIElTX0RPVDExX01PREVfUFJPUFJJRVRBUlkoZG90MTFNb2RlKSBcCisgICAgICAgICgoKGRvdDExTW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfUE9MQVJJUykgfHwgXAorICAgICAgICAgIChkb3QxMU1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFX1RJVEFOKSB8fCBcCisgICAgICAgICAgKGRvdDExTW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfVEFVUlVTKSB8fCBcCisgICAgICAgICAgKGRvdDExTW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfQUxMKSkgPyBUUlVFOiBGQUxTRSkKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNkZWZpbmUgSVNfRE9UMTFfTU9ERV9IVChkb3QxMU1vZGUpIFwKKyAgICAgICAgKCgoZG90MTFNb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU4pIHx8IFwKKyAgICAgICAgICAoZG90MTFNb2RlID09ICBXTklfQ0ZHX0RPVDExX01PREVfMTFOX09OTFkpIHx8IFwKKyAgICAgICAgICAoZG90MTFNb2RlID09ICBXTklfQ0ZHX0RPVDExX01PREVfVEFVUlVTKSB8fCBcCisgICAgICAgICAgKGRvdDExTW9kZSA9PSAgV05JX0NGR19ET1QxMV9NT0RFX0FMTCkpID8gVFJVRTogRkFMU0UpCisjZWxzZQorI2RlZmluZSBJU19ET1QxMV9NT0RFX0hUKGRvdDExTW9kZSkgXAorICAgICAgICAoKChkb3QxMU1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExTikgfHwgXAorICAgICAgICAgIChkb3QxMU1vZGUgPT0gIFdOSV9DRkdfRE9UMTFfTU9ERV9UQVVSVVMpIHx8IFwKKyAgICAgICAgICAoZG90MTFNb2RlID09ICBXTklfQ0ZHX0RPVDExX01PREVfQUxMKSkgPyBUUlVFOiBGQUxTRSkKKyNlbmRpZgorICAgICAgICAvKgorICAgICAgICAqIFdoZW4gVGl0YW4gY2FwYWJpbGl0aWVzIGNhbiBiZSB0dXJuZWQgb24gYmFzZWQgb24gdGhlIAorICAgICAgICAqIFByb3ByaWV0YXJ5IEV4dGVuc2lvbnMgQ0ZHLCB0aGVuIHRoaXMgbWFjcm8gY2FuIGJlIHVzZWQuCisgICAgICAgICogSGVyZSBUaXRhbiBjYXBhYmlsaXRpZXMgY2FuIGJlIHR1cm5lZCBvbiBmb3IgMTFHL0dvbmx5L04vTk9ubHkgbW9kZSBhbHNvLgorICAgICAgICAqLworI2RlZmluZSBJU19ET1QxMV9NT0RFX1RJVEFOX0FMTE9XRUQoZG90MTFNb2RlKSBcCisgICAgICAgICgoKGRvdDExTW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfVElUQU4pIHx8IFwKKyAgICAgICAgICAoZG90MTFNb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV9UQVVSVVMpIHx8IFwKKyAgICAgICAgICAoZG90MTFNb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUcpIHx8IFwKKyAgICAgICAgICAoZG90MTFNb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU4pIHx8IFwKKyAgICAgICAgICAoZG90MTFNb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV9BTEwpKSA/IFRSVUU6IEZBTFNFKQorCisKKyAgICAgICAgLyoKKyAgICAgICAgKiBXaGVuIFRhdXJ1cyBjYXBhYmlsaXRpZXMgY2FuIGJlIHR1cm5lZCBvbiBiYXNlZCBvbiB0aGUgCisgICAgICAgICogUHJvcHJpZXRhcnkgRXh0ZW5zaW9ucyBDRkcsIHRoZW4gdGhpcyBtYWNybyBjYW4gYmUgdXNlZC4KKyAgICAgICAgKiBIZXJlIFRhdXJ1cyBjYXBhYmlsaXRpZXMgY2FuIGJlIHR1cm5lZCBvbiBmb3IgMTFOL05vbmx5IG1vZGUgYWxzby4KKyAgICAgICAgKi8KKyNkZWZpbmUgSVNfRE9UMTFfTU9ERV9UQVVSVVNfQUxMT1dFRChkb3QxMU1vZGUpIFwKKyAgICAgICAgKCgoZG90MTFNb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV9UQVVSVVMpIHx8IFwKKyAgICAgICAgICAoZG90MTFNb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU4pIHx8IFwKKyAgICAgICAgICAoZG90MTFNb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV9BTEwpKSA/IFRSVUU6IEZBTFNFKQorCisKKworI2RlZmluZSBJU19ET1QxMV9NT0RFX1BPTEFSSVMoZG90MTFNb2RlKSAgIElTX0RPVDExX01PREVfUFJPUFJJRVRBUlkoZG90MTFNb2RlKQorCisjZGVmaW5lIElTX0RPVDExX01PREVfMTFCKGRvdDExTW9kZSkgIFwKKyAgICAgICAgICAgICgoZG90MTFNb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUIpID8gVFJVRSA6IEZBTFNFKQorCisvLy8gQU5JIHByb3ByaWV0YXJ5IFN0YXR1cyBDb2RlcyBlbnVtCisvLy8gKHByZXNlbnQgaW4gTWFuYWdlbWVudCByZXNwb25zZSBmcmFtZXMpCit0eXBlZGVmIGVudW0gZVNpck1hY1Byb3BTdGF0dXNDb2RlcworeworICAgIGR1bW15Cit9IHRTaXJNYWNQcm9wU3RhdHVzQ29kZXM7CisKKy8qKgorICogQU5JIHByb3ByaWV0YXJ5IFJlYXNvbiBDb2RlcyBlbnVtCisgKiAocHJlc2VudCBpbiBEZWF1dGhlbnRpY2F0aW9uL0Rpc2Fzc29jaWF0aW9uIE1hbmFnZW1lbnQgZnJhbWVzKQorICovCit0eXBlZGVmIGVudW0gZVNpck1hY1Byb3BSZWFzb25Db2RlcworeworICAgIGVTSVJfTUFDX1VMQV9USU1FT1VUX1JFQVNPTj0weEZGMDAKK30gdFNpck1hY1Byb3BSZWFzb25Db2RlczsKKworCisvLy8gUHJvcHJpZXRhcnkgSUUgZGVmaW5pdGlvbgordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1Byb3BJRQoreworICAgIHRBTklfVTggICAgZWxlbWVudElEOyAgICAvLyBTSVJfTUFDX0FOSV9QUk9QX0lFX0VJRAorICAgIHRBTklfVTggICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgb3VpWzNdOyAgICAgICAvLyBBTklfT1VJIGZvciBBaXJnbyBwcm9kdWN0cworICAgIHRBTklfVTggICAgaW5mb1sxXTsKK30gdFNpck1hY1Byb3BJRSwgKnRwU2lyTWFjUHJvcElFOworCisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNQcm9wUmF0ZVNldAoreworICAgIHRBTklfVTggIG51bVByb3BSYXRlczsKKyAgICB0QU5JX1U4ICBwcm9wUmF0ZVs4XTsKK30gdFNpck1hY1Byb3BSYXRlU2V0LCAqdHBTaXJNYWNQcm9wUmF0ZVNldDsKKworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjUHJvcExMU2V0Cit7CisgICAgdEFOSV9VMzIgIGRlZmVyVGhyZXNob2xkOworfSB0U2lyTWFjUHJvcExMU2V0LCAqdHBTaXJNYWNQcm9wTExTZXQ7CisKKyNkZWZpbmUgU0lSX1BST1BfVkVSU0lPTl9TVFJfTUFYIDIwCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjUHJvcFZlcnNpb24KK3sKKyAgICB0QU5JX1UzMiAgY2hpcF9yZXY7ICAgICAgIC8vIGJvYXJkLCBjaGlwc2V0IGluZm8KKyAgICB0QU5JX1U4ICAgY2FyZF90eXBlOyAgICAgIC8vIFR5cGUgb2YgQ2FyZAorICAgIHRBTklfVTggIGJ1aWxkX3ZlcnNpb25bU0lSX1BST1BfVkVSU0lPTl9TVFJfTUFYXTsgLy9idWlsZCB2ZXJzaW9uIHN0cmluZworfSB0U2lyTWFjUHJvcFZlcnNpb24sICp0cFNpck1hY1Byb3BWZXJzaW9uOworI2RlZmluZSBTSVJfTUFDX1BST1BfVkVSU0lPTl9NSU4gKFNJUl9QUk9QX1ZFUlNJT05fU1RSX01BWCArIHNpemVvZih0QU5JX1UzMikpCisKKworLy8gVENJRCBNQUNSTydzCisjZGVmaW5lIFRDSURfMCAgIDB4MDEKKyNkZWZpbmUgVENJRF8xICAgMHgwMgorI2RlZmluZSBUQ0lEXzIgICAweDA0CisjZGVmaW5lIFRDSURfMyAgIDB4MDgKKyNkZWZpbmUgVENJRF80ICAgMHgxMAorI2RlZmluZSBUQ0lEXzUgICAweDIwCisjZGVmaW5lIFRDSURfNiAgIDB4NDAKKyNkZWZpbmUgVENJRF83ICAgMHg4MAorI2RlZmluZSBUQ0lEX0FMTCAweEZGCisKKy8vIEdldCBzdGF0ZSBvZiBDb25jYXRlbmF0aW9uCisjZGVmaW5lIEdFVF9DT05DQVRfU1RBVEUoY2NCaXRtYXAsdGNpZCkgXAorICAgICAgICAoKGNjQml0bWFwKSAmICh0Y2lkKSkKKworLy8gR2V0IHN0YXRlIG9mIENvbXByZXNzaW9uCisjZGVmaW5lIEdFVF9DT01QUkVTU0lPTl9TVEFURShjcEJpdG1hcCx0Y2lkKSBcCisgICAgICAgICgoY3BCaXRtYXApICYgKHRjaWQpKQorCisvLyBHZXQvU2V0IHN0YXRlIG9mIENoYW5uZWwgQm9uZGluZworLy8KKy8vIFRoZSBDQiBiaXRmaWVsZCBlbmNvZGluZyBpcyAtCisvLworLy8gICAgIGI3ICAgIGI2ICAgYjUgIGI0ICBiMyAgYjIgIGIxICBiMAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHxDQ0FfQ0IgfENDQSB8SUNFIHwgQVV8Q1N8VS9EfCBPIHwgQSB8CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNkZWZpbmUgR0VUX0NCX0FETUlOX1NUQVRFKGNiU3RhdGUpICAgIChjYlN0YXRlICYgMHgwMSkKKyNkZWZpbmUgR0VUX0NCX09QRVJfU1RBVEUoY2JTdGF0ZSkgICAgICgoY2JTdGF0ZSAmIDB4MDIpID4+IDEpCisjZGVmaW5lIEdFVF9DQl9TRUNfQ0hBTk5FTChjYlN0YXRlKSAgICAoKGNiU3RhdGUgJiAweDA0KSA+PiAyKQorI2RlZmluZSBHRVRfQ0JfQ1NfSU5fUFJPR1JFU1MoY2JTdGF0ZSkgKChjYlN0YXRlICYgMHgwOCkgPj4gMykKKyNkZWZpbmUgR0VUX0NCX0NTX0FVVE9fVVBEQVRFKGNiU3RhdGUpICgoY2JTdGF0ZSAmIDB4MTApID4+IDQpCisjZGVmaW5lIEdFVF9DQl9JQ0VfU1RBVEUoY2JTdGF0ZSkgICAgICAoKGNiU3RhdGUgJiAweDIwKSA+PiA1KQorI2RlZmluZSBHRVRfQ0JfQ0NBX01PREUoY2JTdGF0ZSkgICAgICAgKChjYlN0YXRlICYgMHg0MCkgPj4gNikKKyNkZWZpbmUgR0VUX0NCX0NDQV9DQl9TVEFURShjYlN0YXRlKSAgICgoY2JTdGF0ZSAmIDB4ODApID4+IDcpCisKKyNkZWZpbmUgU0VUX0NCX1NUQVRFX0RJU0FCTEUoY2JTdGF0ZSkgXAorICAgICAgICAoKGNiU3RhdGUpID0gKDB4MDApKQorI2RlZmluZSBTRVRfQ0JfU1RBVEVfRU5BQkxFKGNiU3RhdGUpIFwKKyAgICAgICAgKChjYlN0YXRlKSA9ICgweDAzKSkKKyNkZWZpbmUgU0VUX0NCX0FVX0VOQUJMRShjYlN0YXRlKSBcCisgICAgICAgICgoY2JTdGF0ZSkgPSAoKGNiU3RhdGUpIHwgMHgxMCkpCisjZGVmaW5lIFNFVF9DQl9BVV9ESVNBQkxFKGNiU3RhdGUpIFwKKyAgICAgICAgKChjYlN0YXRlKSA9ICgoY2JTdGF0ZSkgJiAweEVGKSkKKyNkZWZpbmUgU0VUX0NCX09QRVJfU1RBVEUoY2JTdGF0ZSxzdGF0ZSkgXAorICAgICAgICAoKChzdGF0ZSkgPT0gZUhBTF9DTEVBUik/IFwKKyAgICAgICAgICAoKGNiU3RhdGUpID0gKGNiU3RhdGUpICYgKDB4ZkQpKTogXAorICAgICAgICAgICgoY2JTdGF0ZSkgPSAoY2JTdGF0ZSkgfCAoMHgwMikpKQorI2RlZmluZSBTRVRfQ0JfU0VDX0NIQU5ORUwoY2JTdGF0ZSxzdGF0ZSkgXAorICAgICAgICAoKChzdGF0ZSkgPT0gZUhBTF9DTEVBUik/IFwKKyAgICAgICAgICAoKGNiU3RhdGUpID0gKGNiU3RhdGUpICYgKDB4ZkIpKTogXAorICAgICAgICAgICgoY2JTdGF0ZSkgPSAoY2JTdGF0ZSkgfCAoMHgwNCkpKQorI2RlZmluZSBTRVRfQ0JfSUNFX0RJU0FCTEUoY2JTdGF0ZSkgXAorICAgICAgICAoKGNiU3RhdGUpID0gKChjYlN0YXRlKSAmIDB4REYpKQorI2RlZmluZSBTRVRfQ0JfSUNFX0VOQUJMRShjYlN0YXRlKSBcCisgICAgICAgICgoY2JTdGF0ZSkgPSAoKGNiU3RhdGUpIHwgMHgyMCkpCisjZGVmaW5lIFNFVF9DQl9DQ0FfTU9ERV9UV0VOVFkoY2JTdGF0ZSkgXAorICAgICAgICAoKGNiU3RhdGUpID0gKChjYlN0YXRlKSAmIDB4QkYpKQorI2RlZmluZSBTRVRfQ0JfQ0NBX01PREVfRk9VUlRZKGNiU3RhdGUpIFwKKyAgICAgICAgKChjYlN0YXRlKSA9ICgoY2JTdGF0ZSkgfCAweDQwKSkKKyNkZWZpbmUgU0VUX0NCX0NDQV9DQl9ESVNBQkxFKGNiU3RhdGUpIFwKKyAgICAgICAgKChjYlN0YXRlKSA9ICgoY2JTdGF0ZSkgJiAweDdGKSkKKyNkZWZpbmUgU0VUX0NCX0NDQV9DQl9FTkFCTEUoY2JTdGF0ZSkgXAorICAgICAgICAoKGNiU3RhdGUpID0gKChjYlN0YXRlKSB8IDB4ODApKQorCisvLyBHZXQvU2V0IHRoZSBzdGF0ZSBvZiBSZXZlcnNlIEZDUworI2RlZmluZSBHRVRfUkZDU19PUEVSX1NUQVRFKHJldkZjc1N0YXRlKSAocmV2RmNzU3RhdGUgJiAweDAxKQorI2RlZmluZSBHRVRfUkZDU19QQVRURVJOX0lEKHJldkZjc1N0YXRlKSAoKHJldkZjc1N0YXRlICYgMHgwRSkgPj4gMSkKKworLyogU1RBIENCIExlZ2FjeSBCc3MgZGV0ZWN0IHN0YXRlcyAqLworI2RlZmluZSBMSU1fQ0JfTEVHQUNZX0JTU19ERVRFQ1RfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExJTV9DQl9MRUdBQ1lfQlNTX0RFVEVDVF9SVU5OSU5HICAgICAgICAgICAgICAgIDEKKworLyogRGVmYXVsdCB2YWx1ZSBmb3IgZ0xpbVJlc3RvcmVDQk51bVNjYW5JbnRlcnZhbCAqLworI2RlZmluZSBMSU1fUkVTVE9SRV9DQl9OVU1fU0NBTl9JTlRFUlZBTF9ERUZBVUxUICAgICAgICAyCisKKy8vCisvLyBQcm9wcmlldGFyeSBRdWl0ZSBCU1MgSUUgc3RydWN0dXJlCisvLworLy8gQmFzZWQgb24gdGhlIHNldHRpbmcgb2YgdGhlICJUaXRhbiIgcHJvcHJpZXRhcnkgYml0CisvLyBpbiB0aGUgdFNpclByb3BJRVN0cnVjdC5jYXBhYmlsaXR5IGZpZWxkIChiaXQgIzYpLAorLy8gdGhpcyBJRSB3aWxsIGJlIHNlbnQgYXBwcm9wcmlhdGVseSB0byBhbGwgdGhlIEFOSQorLy8gcGVlcnMgaW4gdGhlIGZvbGxvd2luZyBtYW5hZ2VtZW50IGZyYW1lcyAtCisvLyAxKSBCZWFjb25zCisvLyAyKSBQcm9iZSBSc3AKKy8vCit0eXBlZGVmIHN0cnVjdCBzUXVpZXRCc3NJRVN0cnVjdAoreworCisgIC8vIEluZGljYXRlcyB0aGUgbnVtYmVyIG9mIFRCVFQncyB1bnRpbCB0aGUgbmV4dCBiZWFjb24KKyAgLy8gaW50ZXJ2YWwgZHVyaW5nIHdoaWNoIHRoZSBuZXh0IHF1aWV0IGludGVydmFsIHdpbGwKKyAgLy8gc3RhcnQKKyAgLy8gMSAtIFF1aWV0IEludGVydmFsIHdpbGwgc3RhcnQgZHVyaW5nIHRoZSBiZWFjb24KKyAgLy8gaW50ZXJ2YWwgc3RhcnRpbmcgYXQgdGhlIG5leHQgVEJUVAorICAvLyAwIC0gUmVzZXJ2ZWQKKyAgdEFOSV9VOCBxdWlldENvdW50OworCisgIC8vIFNoYWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIG9mIGJlYWNvbiBpbnRlcnZhbHMgYmV0d2VlbgorICAvLyB0aGUgc3RhcnQgb2YgcmVndWxhcmx5IHNjaGVkdWxlZCBxdWlldCBpbnRlcnZhbHMKKyAgLy8gZGVmaW5lZCBieSB0aGlzIFF1aWV0IEVsZW1lbnQKKyAgLy8gMCAtIE5vIHBlcmlvZGljIHF1aWV0IGludGVydmFsIGlzIGRlZmluZWQKKyAgdEFOSV9VOCBxdWlldFBlcmlvZDsKKworICAvLyBEdXJhdGlvbiBvZiB0aGUgcXVpZXQgaW50ZXJ2YWwsIGV4cHJlc3NlZCBpbiBUVXMKKyAgLy8gMSBUVSA9IDEwMjQgbWljcm9zZWNvbmRzPz8KKyAgdEFOSV9VMTYgcXVpZXREdXJhdGlvbjsKKworICAvLyBTZXQgdG8gdGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIHF1aWV0IGludGVydmFsCisgIC8vIGZyb20gdGhlIFRCVFQgc3BlY2lmaWVkIGJ5IHRoZSBxdWlldENvdW50IGZpZWxkLAorICAvLyBleHByZXNzZWQgaW4gVFVzLiBUaGUgdmFsdWUgb2YgdGhpcyBvZmZzZXQgZmllbGQgd2lsbAorICAvLyBiZSBsZXNzIHRoYW4gb25lIGJlYWNvbiBpbnRlcnZhbAorICAvLyAxIFRVID0gMTAyNCBtaWNyb3NlY29uZHM/PworICB0QU5JX1UxNiBxdWlldE9mZnNldDsKKworfSB0UXVpZXRCc3NJRVN0cnVjdCwgKnRwUXVpZXRCc3NJRVN0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0NoYW5uZWxTd2l0Y2hQcm9wSUVTdHJ1Y3QKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgbW9kZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgcHJpbWFyeUNoYW5uZWw7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIHN1YkJhbmQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIGNoYW5uZWxTd2l0Y2hDb3VudDsKKworfSB0Q2hhbm5lbFN3aXRjaFByb3BJRVN0cnVjdCwgKnRwQ2hhbm5lbFN3aXRjaFByb3BJRVN0cnVjdDsKKworLy8gZ2VuZXJpYyBwcm9wcmlldGFyeSBJRSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgordHlwZWRlZiBzdHJ1Y3Qgc1NpclByb3BJRVN0cnVjdAoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGFuaUluZGljYXRvcjsKKworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIHByb3BSYXRlc1ByZXNlbnQ6MTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICBhcE5hbWVQcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgbG9hZEJhbGFuY2VJbmZvUHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIHZlcnNpb25QcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgZWRjYVBhcmFtUHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlQcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgdGl0YW5QcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgdGF1cnVzUHJlc2VudDoxOyAgCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgcHJvcENoYW5uZWxTd2l0Y2hQcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgcXVpZXRCc3NQcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclN0YVNjYW5QcmVzZW50OjE7ICAgICAgICAgICAgICAgIAorICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIHJzdmQ6NTsKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGhjZlByZXNlbnQ6MTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICB3ZHNQcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3JMaXN0UHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGxvYWRJbmZvUHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGxsc2V0UHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGJwaW5kUHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGFzc29jVHlwZVByZXNlbnQ6MTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICByc3ZkMToxOworI2VuZGlmCisKKyAgICB0U2lyTWFjUHJvcFJhdGVTZXQgICAgcHJvcFJhdGVzOworICAgIHRBbmlBcE5hbWUgICAgICAgICAgICBhcE5hbWU7ICAgICAgICAgICAvLyB1c2VkIGluIGJlYWNvbi9wcm9iZSBvbmx5CisgICAgdFNpckFsdGVybmF0ZVJhZGlvSW5mbyAgYWx0ZXJuYXRlUmFkaW87IC8vIHVzZWQgaW4gYXNzb2MgcmVzcG9uc2Ugb25seQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICBjYXBhYmlsaXR5OyAgICAgICAvLyBjYXBhYmlsaXR5IGJpdCBtYXAKKyAgICB0U2lyTWFjUHJvcFZlcnNpb24gICAgdmVyc2lvbjsKKyAgICB0U2lyTWFjRWRjYVBhcmFtU2V0SUUgZWRjYTsKKyAgICB0Q2hhbm5lbFN3aXRjaFByb3BJRVN0cnVjdCAgY2hhbm5lbFN3aXRjaDsKKyAgICB0UXVpZXRCc3NJRVN0cnVjdCAgICAgcXVpZXRCc3M7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgIHRyaWdnZXJTdGFTY2FuRW5hYmxlOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgaGNmRW5hYmxlZDsKKyAgICAvLyB1c2VkIGluIGJlYWNvbi9wcm9iZSByZXNwb25zZSBvbmx5CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgd2RzTGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIHdkc0RhdGFbQU5JX1dEU19JTkZPX01BWF9MRU5HVEhdOworICAgIHRTaXJMb2FkICAgICAgICAgICAgICBsb2FkOworICAgIHRTaXJNYWNQcm9wTExTZXQgICAgICBsbFNldDsgCisgICAgLy8gdXNlZCBpbiBhc3NvYyByZXF1ZXN0IG9ubHkKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICBicEluZGljYXRvcjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICBicFR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgbnVtQnNzOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGFzc29jVHlwZTsKKyAgICB0cFNpck5laWdoYm9yQnNzSW5mbyAgcEJzc0xpc3Q7CisjZW5kaWYKKworfSB0U2lyUHJvcElFU3RydWN0LCAqdHBTaXJQcm9wSUVTdHJ1Y3Q7CisKKworCisjZW5kaWYgLyogX19NQUNfUFJPUF9FWFRTX0ggKi8KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL2luYy9zaXJNYWNQcm90RGVmLmggYi9DT1JFL01BQy9pbmMvc2lyTWFjUHJvdERlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMmYxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9pbmMvc2lyTWFjUHJvdERlZi5oCkBAIC0wLDAgKzEsMjU4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHNpck1hY1Byb3REZWYuaCBjb250YWlucyB0aGUgTUFDL1BIWSBwcm90b2NvbAorICogZGVmaW5pdGlvbnMgdXNlZCBhY3Jvc3MgdmFyaW91cyBwcm9qZWN0cy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzI3LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpZm5kZWYgX19NQUNfUFJPVF9ERUZTX0gKKyNkZWZpbmUgX19NQUNfUFJPVF9ERUZTX0gKKworI2luY2x1ZGUgInBhbFR5cGVzLmgiCisjaW5jbHVkZSAic2lyVHlwZXMuaCIKKyNpbmNsdWRlICJ3bmlDZmdBcC5oIgorI2luY2x1ZGUgImFuaUNvbXBpbGVyLmgiCisKKworLy8vQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiByZWxhdGVkCisjZGVmaW5lIENBUEFCSUxJVFlfSU5GT19ERUxBWUVEX0JBX0JJVCAxNAorI2RlZmluZSBDQVBBQklMSVRZX0lORk9fSU1NRURJQVRFX0JBX0JJVCAxNQorCisvLy8gMTFkIE1BQyBkZWZhdWx0cworI2RlZmluZSBTSVJfMTFCX0NIQU5ORUxfSURfQkVHSU4gICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX1RPVEFMX05VTV8xMUJfQ0hBTk5FTFMgICAgICAgICAxNAorI2RlZmluZSBTSVJfMTFCX0RFRkFVTFRfTUFYX1RSQU5TTUlUX1BPV0VSIDIwCisjZGVmaW5lIFNJUl8xMUFfQ0hBTk5FTF9JRF9CRUdJTiAgICAgICAgICAgMjQwCisjZGVmaW5lIFNJUl9UT1RBTF9OVU1fMTFBX0NIQU5ORUxTICAgICAgICAgMzQKKyNkZWZpbmUgU0lSXzExQV9ERUZBVUxUX01BWF9UUkFOU01JVF9QT1dFUiAxNgorCisvLy8gMTFoIE1BQyBkZWZhdWx0cworI2RlZmluZSBTSVJfMTFBX0NIQU5ORUxfQkVHSU4gICAgICAgICAgIDM0CisjZGVmaW5lIFNJUl8xMUFfQ0hBTk5FTF9FTkQgICAgICAgICAgICAgMTY1CisjZGVmaW5lIFNJUl8xMUJfQ0hBTk5FTF9CRUdJTiAgICAgICAgICAgMQorI2RlZmluZSBTSVJfMTFCX0NIQU5ORUxfRU5EICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNJUl8xMUFfRlJFUVVFTkNZX09GRlNFVCAgICAgICAgNAorI2RlZmluZSBTSVJfMTFCX0ZSRVFVRU5DWV9PRkZTRVQgICAgICAgIDEKKworCisjZGVmaW5lIFBSSU1fREVWSUNFX0xFTiAgICAgICAgICAgICAgICAgKDgpCisKKy8vLyBNYXhpbXVtIGZyYWdtZW50IHNpemUKKyNkZWZpbmUgU0lSX01BQ19NQVhfRlJBR19TSVpFICAyMzk4CisKKy8vIG1heGltdW0gODAyLjExIFBEVSBzaXplCisjZGVmaW5lIFNJUl9NQUNfTUFYX1BEVV9TSVpFICAgMjM0NgorCisvLy8gTGVuZ3RoIG9mIHRoZSBGcmFtZSBDaGVjayBTdW0gZmllbGQgYXQgdGhlIGVuZCBvZiBldmVyeSBNQUMgZnJhbWUKKyNkZWZpbmUgU0lSX01BQ19GQ1NfTEVOR1RIIDQKKworLy8gU2l6ZXMgb2YgY29udHJvbCBmcmFtZXMKKyNkZWZpbmUgU0lSX01BQ19BQ0tfU0laRSAgICAgICAgMTQKKyNkZWZpbmUgU0lSX01BQ19DVFNfU0laRSAgICAgICAgMTQKKyNkZWZpbmUgU0lSX01BQ19SVFNfU0laRSAgICAgICAgMjAKKyNkZWZpbmUgU0lSX01BQ19CUlFfU0laRSAgICAgICAgMjQKKyNkZWZpbmUgU0lSX01BQ19CQUNLX1NJWkUgICAgICAgMjYKKworLy8vIEN1cnJlbnQgdmVyc2lvbiBvZiA4MDIuMTEKKyNkZWZpbmUgU0lSX01BQ19QUk9UT0NPTF9WRVJTSU9OIDAKKworLy8gRnJhbWUgVHlwZSBkZWZpbml0aW9ucworCisjZGVmaW5lIFNJUl9NQUNfTUdNVF9GUkFNRSAgICAweDAKKyNkZWZpbmUgU0lSX01BQ19DVFJMX0ZSQU1FICAgIDB4MQorI2RlZmluZSBTSVJfTUFDX0RBVEFfRlJBTUUgICAgMHgyCisKKyNkZWZpbmUgU0lSX01BQ19GUkFNRV9UWVBFX1NUQVJUICAgMHgwCisjZGVmaW5lIFNJUl9NQUNfRlJBTUVfVFlQRV9FTkQgICAgIDB4MworCisvLyBDb250cm9sIGZyYW1lIHN1YnR5cGUgZGVmaW5pdGlvbnMKKworI2RlZmluZSBTSVJfTUFDX0NUUkxfUlIgICAgICAgICA0CisjZGVmaW5lIFNJUl9NQUNfQ1RSTF9CQVIgICAgICAgIDgKKyNkZWZpbmUgU0lSX01BQ19DVFJMX0JBICAgICAgICAgOQorI2RlZmluZSBTSVJfTUFDX0NUUkxfUFNfUE9MTCAgICAxMAorI2RlZmluZSBTSVJfTUFDX0NUUkxfUlRTICAgICAgICAxMQorI2RlZmluZSBTSVJfTUFDX0NUUkxfQ1RTICAgICAgICAxMgorI2RlZmluZSBTSVJfTUFDX0NUUkxfQUNLICAgICAgICAxMworI2RlZmluZSBTSVJfTUFDX0NUUkxfQ0ZfRU5EICAgICAxNAorI2RlZmluZSBTSVJfTUFDX0NUUkxfQ0ZfRU5EX0FDSyAxNQorCisjZGVmaW5lIEdFTjRfU0NBTiAgICAgICAgIDEKKyNpZmRlZiBHRU40X1NDQU4KKyNkZWZpbmUgU0lSX01BQ19NQVhfRFVSQVRJT05fTUlDUk9fU0VDT05EUyAgICAgICAzMjc2NworI2VuZGlmIC8vIEdFTjRfU0NBTgorCisvLyBEYXRhIGZyYW1lIHN1YnR5cGUgZGVmaW5pdGlvbnMKKyNkZWZpbmUgU0lSX01BQ19EQVRBX0RBVEEgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19EQVRBX0RBVEFfQUNLICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19EQVRBX0RBVEFfUE9MTCAgICAgICAgICAgIDIKKyNkZWZpbmUgU0lSX01BQ19EQVRBX0RBVEFfQUNLX1BPTEwgICAgICAgIDMKKyNkZWZpbmUgU0lSX01BQ19EQVRBX05VTEwgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19EQVRBX05VTExfQUNLICAgICAgICAgICAgIDUKKyNkZWZpbmUgU0lSX01BQ19EQVRBX05VTExfUE9MTCAgICAgICAgICAgIDYKKyNkZWZpbmUgU0lSX01BQ19EQVRBX05VTExfQUNLX1BPTEwgICAgICAgIDcKKyNkZWZpbmUgU0lSX01BQ19EQVRBX1FPU19EQVRBICAgICAgICAgICAgIDgKKyNkZWZpbmUgU0lSX01BQ19EQVRBX1FPU19EQVRBX0FDSyAgICAgICAgIDkKKyNkZWZpbmUgU0lSX01BQ19EQVRBX1FPU19EQVRBX1BPTEwgICAgICAgIDEwCisjZGVmaW5lIFNJUl9NQUNfREFUQV9RT1NfREFUQV9BQ0tfUE9MTCAgICAxMQorI2RlZmluZSBTSVJfTUFDX0RBVEFfUU9TX05VTEwgICAgICAgICAgICAgMTIKKyNkZWZpbmUgU0lSX01BQ19EQVRBX1FPU19OVUxMX0FDSyAgICAgICAgIDEzCisjZGVmaW5lIFNJUl9NQUNfREFUQV9RT1NfTlVMTF9QT0xMICAgICAgICAxNAorI2RlZmluZSBTSVJfTUFDX0RBVEFfUU9TX05VTExfQUNLX1BPTEwgICAgMTUKKworI2RlZmluZSBTSVJfTUFDX0ZSQU1FX1NVQlRZUEVfU1RBUlQgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX0ZSQU1FX1NVQlRZUEVfRU5EICAgICAgICAgMTYKKworI2RlZmluZSBTSVJfTUFDX0RBVEFfUU9TX01BU0sgICAgICAgICAgICAgOAorI2RlZmluZSBTSVJfTUFDX0RBVEFfTlVMTF9NQVNLICAgICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX0RBVEFfUE9MTF9NQVNLICAgICAgICAgICAgMgorI2RlZmluZSBTSVJfTUFDX0RBVEFfQUNLX01BU0sgICAgICAgICAgICAgMQorCisvLyBNYW5hZ2VtZW50IGZyYW1lIHN1YnR5cGUgZGVmaW5pdGlvbnMKKworI2RlZmluZSBTSVJfTUFDX01HTVRfQVNTT0NfUkVRICAgIDB4MAorI2RlZmluZSBTSVJfTUFDX01HTVRfQVNTT0NfUlNQICAgIDB4MQorI2RlZmluZSBTSVJfTUFDX01HTVRfUkVBU1NPQ19SRVEgIDB4MgorI2RlZmluZSBTSVJfTUFDX01HTVRfUkVBU1NPQ19SU1AgIDB4MworI2RlZmluZSBTSVJfTUFDX01HTVRfUFJPQkVfUkVRICAgIDB4NAorI2RlZmluZSBTSVJfTUFDX01HTVRfUFJPQkVfUlNQICAgIDB4NQorI2RlZmluZSBTSVJfTUFDX01HTVRfQkVBQ09OICAgICAgIDB4OAorI2RlZmluZSBTSVJfTUFDX01HTVRfQVRJTSAgICAgICAgIDB4OQorI2RlZmluZSBTSVJfTUFDX01HTVRfRElTQVNTT0MgICAgIDB4QQorI2RlZmluZSBTSVJfTUFDX01HTVRfQVVUSCAgICAgICAgIDB4QgorI2RlZmluZSBTSVJfTUFDX01HTVRfREVBVVRIICAgICAgIDB4QworI2RlZmluZSBTSVJfTUFDX01HTVRfQUNUSU9OICAgICAgIDB4RAorI2RlZmluZSBTSVJfTUFDX01HTVRfUkVTRVJWRUQxNSAgIDB4RgorCisvLyBBY3Rpb24gZnJhbWUgY2F0ZWdvcmllcworCisjZGVmaW5lIFNJUl9NQUNfQUNUSU9OX1NQRUNUUlVNX01HTVQgICAwCisjZGVmaW5lIFNJUl9NQUNfQUNUSU9OX1FPU19NR01UICAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfQUNUSU9OX0RMUCAgICAgICAgICAgICAyCisjZGVmaW5lIFNJUl9NQUNfQUNUSU9OX0JMS0FDSyAgICAgICAgICAzCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisjZGVmaW5lIFNJUl9NQUNfQUNUSU9OX1JSTSAgICAgICAgICAgICA1CisjZW5kaWYKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fSFQgICAgICAgICAgICAgIDcKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fV01FICAgICAgICAgICAgMTcKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9QMlAKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fUFVCTElDX1VTQUdFIDQKKyNlbmRpZgorCisvLyBRb1MgbWFuYWdlbWVudCBhY3Rpb24gY29kZXMKKworI2RlZmluZSBTSVJfTUFDX1FPU19BRERfVFNfUkVRICAgICAgMAorI2RlZmluZSBTSVJfTUFDX1FPU19BRERfVFNfUlNQICAgICAgMQorI2RlZmluZSBTSVJfTUFDX1FPU19ERUxfVFNfUkVRICAgICAgMgorI2RlZmluZSBTSVJfTUFDX1FPU19TQ0hFRFVMRSAgICAgICAgMworLy8gYW5kIHRoZXNlIGFyZSBwcm9wcmlldGFyeQorI2RlZmluZSBTSVJfTUFDX1FPU19ERUZfQkFfUkVRICAgICAgNAorI2RlZmluZSBTSVJfTUFDX1FPU19ERUZfQkFfUlNQICAgICAgNQorI2RlZmluZSBTSVJfTUFDX1FPU19ERUxfQkFfUkVRICAgICAgNgorI2RlZmluZSBTSVJfTUFDX1FPU19ERUxfQkFfUlNQICAgICAgNworCisjaWZkZWYgQU5JX1NVUFBPUlRfMTFICisvLyBTcGVjdHJ1bSBtYW5hZ2VtZW50IGFjdGlvbiBjb2RlcworI2RlZmluZSBTSVJfTUFDX0FDVElPTl9NRUFTVVJFX1JFUVVFU1RfSUQgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfQUNUSU9OX01FQVNVUkVfUkVQT1JUX0lEICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fVFBDX1JFUVVFU1RfSUQgICAgICAgICAgMgorI2RlZmluZSBTSVJfTUFDX0FDVElPTl9UUENfUkVQT1JUX0lEICAgICAgICAgICAzCisjZW5kaWYgLy9BTklfU1VQUE9SVF8xMUgKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fQ0hBTk5FTF9TV0lUQ0hfSUQgICAgICAgNAorCisKKyNpZmRlZiBBTklfU1VQUE9SVF8xMUgKKy8vIE1lYXN1cmVtZW50IFJlcXVlc3QvUmVwb3J0IFR5cGUKKyNkZWZpbmUgU0lSX01BQ19CQVNJQ19NRUFTVVJFTUVOVF9UWVBFICAgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX0NDQV9NRUFTVVJFTUVOVF9UWVBFICAgICAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfUlBJX01FQVNVUkVNRU5UX1RZUEUgICAgICAgICAgIDIKKyNlbmRpZiAvL0FOSV9TVVBQT1JUXzExSAorCisvL1JSTSByZWxhdGVkLgorLy9SZWZlciBJRUVFIFN0ZCA4MDIuMTFrLTIwMDgsIFNlY3Rpb24gNy4zLjIuMjEsIHRhYmxlIDcuMjkKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKworI2RlZmluZSBTSVJfTUFDX1JSTV9DSEFOTkVMX0xPQURfVFlQRSAgICAgICAgICAzCisjZGVmaW5lIFNJUl9NQUNfUlJNX05PSVNFX0hJU1RPR1JBTV9CRUFDT04gICAgIDQKKyNkZWZpbmUgU0lSX01BQ19SUk1fQkVBQ09OX1RZUEUgICAgICAgICAgICAgICAgNQorI2RlZmluZSBTSVJfTUFDX1JSTV9GUkFNRV9UWVBFICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFNJUl9NQUNfUlJNX1NUQV9TVEFUSVNUSUNTX1RZUEUgICAgICAgIDcKKyNkZWZpbmUgU0lSX01BQ19SUk1fTENJX1RZUEUgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBTSVJfTUFDX1JSTV9UU01fVFlQRSAgICAgICAgICAgICAgICAgICA5CisKKy8vUlJNIGFjdGlvbiBjb2RlcworI2RlZmluZSBTSVJfTUFDX1JSTV9SQURJT19NRUFTVVJFX1JFUSAgICAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfUlJNX1JBRElPX01FQVNVUkVfUlBUICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19SUk1fTElOS19NRUFTVVJFTUVOVF9SRVEgICAgICAgMgorI2RlZmluZSBTSVJfTUFDX1JSTV9MSU5LX01FQVNVUkVNRU5UX1JQVCAgICAgICAzCisjZGVmaW5lIFNJUl9NQUNfUlJNX05FSUdIQk9SX1JFUSAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19SUk1fTkVJR0hCT1JfUlBUICAgICAgICAgICAgICAgNQorCisjZW5kaWYKKworLy8gSFQgQWN0aW9uIEZpZWxkIENvZGVzCisjZGVmaW5lIFNJUl9NQUNfU01fUE9XRVJfU0FWRSAgICAgICAxCisKKy8vIERMUCBhY3Rpb24gZnJhbWUgdHlwZXMKKyNkZWZpbmUgU0lSX01BQ19ETFBfUkVRICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19ETFBfUlNQICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19ETFBfVEVBUkRPV04gICAgICAgIDIKKworLy8gYmxvY2sgYWNrbm93bGVkZ2VtZW50IGFjdGlvbiBmcmFtZSB0eXBlcworI2RlZmluZSBTSVJfTUFDX0JMS0FDS19BRERfUkVRICAgICAgMAorI2RlZmluZSBTSVJfTUFDX0JMS0FDS19BRERfUlNQICAgICAgMQorI2RlZmluZSBTSVJfTUFDX0JMS0FDS19ERUwgICAgICAgICAgMgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1AyUAorI2RlZmluZSBTSVJfTUFDX0FDVElPTl9WRU5ET1JfU1BFQ0lGSUMgOQorI2RlZmluZSBTSVJfTUFDX0FDVElPTl9WRU5ET1JfU1BFQ0lGSUNfQ0FURUdPUlkgICAgIDB4N0YKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fUDJQX1NVQlRZUEVfUFJFU0VOQ0VfUlNQICAgICAyCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKy8vMTF3IFNBIHF1ZXJ5IHJlcXVlc3QvcmVzcG9uc2UgYWN0aW9uIGZyYW1lIGNhdGVnb3J5IGNvZGUKKyNkZWZpbmUgU0lSX01BQ19BQ1RJT05fU0FfUVVFUlkgICAgICAgICAgICAgICA4IAorI2VuZGlmCisKKyNkZWZpbmUgU0lSX01BQ19NQVhfUkFORE9NX0xFTkdUSCAgIDIzMDYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRUlEIChFbGVtZW50IElEKSBkZWZpbml0aW9ucworLy8gYW5kIHRoZWlyIG1pbi9tYXggbGVuZ3RocworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFNJUl9NQUNfU1NJRF9FSUQgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfU1NJRF9FSURfTUlOICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX1NTSURfRUlEX01BWCAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFNJUl9NQUNfUkFURVNFVF9FSUQgICAgICAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfUkFURVNFVF9FSURfTUlOICAgICAgICAgICAgMQorI2RlZmluZSBTSVJfTUFDX1JBVEVTRVRfRUlEX01BWCAgICAgICAgICAgIDEyCisjZGVmaW5lIFNJUl9NQUNfRkhfUEFSQU1fU0VUX0VJRCAgICAgICAyCisjZGVmaW5lIFNJUl9NQUNfRkhfUEFSQU1fU0VUX0VJRF9NSU4gICAgICAgNQorI2RlZmluZSBTSVJfTUFDX0ZIX1BBUkFNX1NFVF9FSURfTUFYICAgICAgIDUKKyNkZWZpbmUgU0lSX01BQ19EU19QQVJBTV9TRVRfRUlEICAgICAgIDMKKyNkZWZpbmUgU0lSX01BQ19EU19QQVJBTV9TRVRfRUlEX01JTiAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfRFNfUEFSQU1fU0VUX0VJRF9NQVggICAgICAgMQorI2RlZmluZSBTSVJfTUFDX0NGX1BBUkFNX1NFVF9FSUQgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX0NGX1BBUkFNX1NFVF9FSURfTUlOICAgICAgIDYKKyNkZWZpbmUgU0lSX01BQ19DRl9QQVJBTV9TRVRfRUlEX01BWCAgICAgICA2CisjZGVmaW5lIFNJUl9NQUNfVElNX0VJRCAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNJUl9NQUNfVElNX0VJRF9NSU4gICAgICAgICAgICAgICAgMworI2RlZmluZSBTSVJfTUFDX1RJTV9FSURfTUFYICAgICAgICAgICAgICAgIDI1NAorI2RlZmluZSBTSVJfTUFDX0lCU1NfUEFSQU1fU0VUX0VJRCAgICAgNgorI2RlZmluZSBTSVJfTUFDX0lCU1NfUEFSQU1fU0VUX0VJRF9NSU4gICAgIDIKKyNkZWZpbmUgU0lSX01BQ19JQlNTX1BBUkFNX1NFVF9FSURfTUFYICAgICAyCisjZGVmaW5lIFNJUl9NQUNfQ09VTlRSWV9FSUQgICAgICAgICAgICA3CisjZGVmaW5lIFNJUl9NQUNfQ09VTlRSWV9FSURfTUlOICAgICAgICAgICAgNgorI2RlZmluZSBTSVJfTUFDX0NPVU5UUllfRUlEX01BWCAgICAgICAgICAgIDI1NAorI2RlZmluZSBTSVJfTUFDX0ZIX1BBUkFNU19FSUQgICAgICAgICAgOAorI2RlZmluZSBTSVJfTUFDX0ZIX1BBUkFNU19FSURfTUlOICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19GSF9QQVJBTVNfRUlEX01BWCAgICAgICAgICA0CisjZGVmaW5lIFNJUl9NQUNfRkhfUEFUVEVSTl9FSUQgICAgICAgICA5CisjZGVmaW5lIFNJUl9NQUNfRkhfUEFUVEVSTl9FSURfTUlOICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX0ZIX1BBVFRFUk5fRUlEX01BWCAgICAgICAgIDI1NAorI2RlZmluZSBTSVJfTUFDX1JFUVVFU1RfRUlEICAgICAgICAgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19SRVFVRVNUX0VJRF9NSU4gICAgICAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfUkVRVUVTVF9FSURfTUFYICAgICAgICAgICAgMjU1CisjZGVmaW5lIFNJUl9NQUNfUUJTU19MT0FEX0VJRCAgICAgICAgICAxMQorI2RlZmluZSBTSVJfTUFDX1FCU1NfTE9BRF9FSURfTUlOICAgICAgICAgIDUKKyNkZWZpbmUgU0lSX01BQ19RQlNTX0xPQURfRUlEX01BWCAgICAgICAgICA1CisjZGVmaW5lIFNJUl9NQUNfRURDQV9QQVJBTV9TRVRfRUlEICAgICAxMiAvLyBFRENBIHBhcmFtZXRlciBzZXQKKyNkZWZpbmUgU0lSX01BQ19FRENBX1BBUkFNX1NFVF9FSURfTUlOICAgICAxOAorI2RlZmluZSBTSVJfTUFDX0VEQ0FfUEFSQU1fU0VUX0VJRF9NQVggICAgIDIwIC8vIFRCRCB0ZW1wIC0gY2hhbmdlIGJhY2t0byAxOAorI2RlZmluZSBTSVJfTUFDX1RTUEVDX0VJRCAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgU0lSX01BQ19UU1BFQ19FSURfTUlOICAgICAgICAgICAgICA1NQorI2RlZmluZSBTSVJfTUFDX1RTUEVDX0VJRF9NQVggICAgICAgICAgICAgIDU1CisjZGVmaW5lIFNJUl9NQUNfVENMQVNfRUlEICAgICAgICAgICAgICAxNAorI2RlZmluZSBTSVJfTUFDX1RDTEFTX0VJRF9NSU4gICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19UQ0xBU19FSURfTUFYICAgICAgICAgICAgICAyNTUKKyNkZWZpbmUgU0lSX01BQ19RT1NfU0NIRURVTEVfRUlEICAgICAgIDE1CisjZGVmaW5lIFNJUl9NQUNfUU9TX1NDSEVEVUxFX0VJRF9NSU4gICAgICAgMTQKKyNkZWZpbmUgU0lSX01BQ19RT1NfU0NIRURVTEVfRUlEX01BWCAgICAgICAxNAorI2RlZmluZSBTSVJfTUFDX0NIQUxMRU5HRV9URVhUX0VJRCAgICAgMTYKKyNkZWZpbmUgU0lSX01BQ19DSEFMTEVOR0VfVEVYVF9FSURfTUlOICAgICAxCisjZGVmaW5lIFNJUl9NQUNfQ0hBTExFTkdFX1RFWFRfRUlEX01BWCAgICAgMjUzCisvLyByZXNlcnZlZCAgICAgICAxNy0zMQorI2RlZmluZSBTSVJfTUFDX1BXUl9DT05TVFJBSU5UX0VJRCAgICAgMzIKKyNkZWZpbmUgU0lSX01BQ19QV1JfQ09OU1RSQUlOVF9FSURfTUlOICAgICAxCisjZGVmaW5lIFNJUl9NQUNfUFdSX0NPTlNUUkFJTlRfRUlEX01BWCAgICAgMQorI2RlZmluZSBTSVJfTUFDX1BXUl9DQVBBQklMSVRZX0VJRCAgICAgMzMKKyNkZWZpbmUgU0lSX01BQ19QV1JfQ0FQQUJJTElUWV9FSURfTUlOICAgICAyCisjZGVmaW5lIFNJUl9NQUNfUFdSX0NBUEFCSUxJVFlfRUlEX01BWCAgICAgMgorI2RlZmluZSBTSVJfTUFDX1RQQ19SRVFfRUlEICAgICAgICAgICAgMzQKKyNkZWZpbmUgU0lSX01BQ19UUENfUkVRX0VJRF9NSU4gICAgICAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfVFBDX1JFUV9FSURfTUFYICAgICAgICAgICAgMjU1CisvLyBTSVJfTUFDX0VYVEVOREVEX0NBUF9FSUQgICAgMzUKKyNkZWZpbmUgU0lSX01BQ19UUENfUlBUX0VJRCAgICAgICAgICAgIDM1CisjZGVmaW5lIFNJUl9NQUNfVFBDX1JQVF9FSURfTUlOICAgICAgICAgICAgMgorI2RlZmluZSBTSVJfTUFDX1RQQ19SUFRfRUlEX01BWCAgICAgICAgICAgIDIKKyNkZWZpbmUgU0lSX01BQ19TUFJURF9DSE5MU19FSUQgICAgICAgIDM2CisjZGVmaW5lIFNJUl9NQUNfU1BSVERfQ0hOTFNfRUlEX01JTiAgICAgICAgMgorI2RlZmluZSBTSVJfTUFDX1NQUlREX0NITkxTX0VJRF9NQVggICAgICAgIDI1NAorI2RlZmluZSBTSVJfTUFDX0NITkxfU1dJVENIX0FOTl9FSUQgICAgMzcKKyNkZWZpbmUgU0lSX01BQ19DSE5MX1NXSVRDSF9BTk5fRUlEX01JTiAgICAzCisjZGVmaW5lIFNJUl9NQUNfQ0hOTF9TV0lUQ0hfQU5OX0VJRF9NQVggICAgMworI2RlZmluZSBTSVJfTUFDX01FQVNfUkVRX0VJRCAgICAgICAgICAgMzgKKyNkZWZpbmUgU0lSX01BQ19NRUFTX1JFUV9FSURfTUlOICAgICAgICAgICAzCisjZGVmaW5lIFNJUl9NQUNfTUVBU19SRVFfRUlEX01BWCAgICAgICAgICAgMjU1CisjZGVmaW5lIFNJUl9NQUNfTUVBU19SUFRfRUlEICAgICAgICAgICAzOQorI2RlZmluZSBTSVJfTUFDX01FQVNfUlBUX0VJRF9NSU4gICAgICAgICAgIDMKKyNkZWZpbmUgU0lSX01BQ19NRUFTX1JQVF9FSURfTUFYICAgICAgICAgICAyNTUKKyNkZWZpbmUgU0lSX01BQ19RVUlFVF9FSUQgICAgICAgICAgICAgIDQwCisjZGVmaW5lIFNJUl9NQUNfUVVJRVRfRUlEX01JTiAgICAgICAgICAgICAgNgorI2RlZmluZSBTSVJfTUFDX1FVSUVUX0VJRF9NQVggICAgICAgICAgICAgIDYKKyNkZWZpbmUgU0lSX01BQ19JQlNTX0RGU19FSUQgICAgICAgICAgIDQxCisjZGVmaW5lIFNJUl9NQUNfSUJTU19ERlNfRUlEX01JTiAgICAgICAgICAgNworI2RlZmluZSBTSVJfTUFDX0lCU1NfREZTX0VJRF9NQVggICAgICAgICAgIDI1NQorI2RlZmluZSBTSVJfTUFDX0VSUF9JTkZPX0VJRCAgICAgICAgICAgNDIKKyNkZWZpbmUgU0lSX01BQ19FUlBfSU5GT19FSURfTUlOICAgICAgICAgICAwCisjZGVmaW5lIFNJUl9NQUNfRVJQX0lORk9fRUlEX01BWCAgICAgICAgICAgMjU1CisjZGVmaW5lIFNJUl9NQUNfVFNfREVMQVlfRUlEICAgICAgICAgICA0MworI2RlZmluZSBTSVJfTUFDX1RTX0RFTEFZX0VJRF9NSU4gICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19UU19ERUxBWV9FSURfTUFYICAgICAgICAgICA0CisjZGVmaW5lIFNJUl9NQUNfVENMQVNfUFJPQ19FSUQgICAgICAgICA0NAorI2RlZmluZSBTSVJfTUFDX1RDTEFTX1BST0NfRUlEX01JTiAgICAgICAgIDEKKyNkZWZpbmUgU0lSX01BQ19UQ0xBU19QUk9DX0VJRF9NQVggICAgICAgICAxCisjZGVmaW5lIFNJUl9NQUNfUU9TX0NBUEFCSUxJVFlfRUlEICAgICA0NgorI2RlZmluZSBTSVJfTUFDX1FPU19DQVBBQklMSVRZX0VJRF9NSU4gICAgIDEKKyNkZWZpbmUgU0lSX01BQ19RT1NfQ0FQQUJJTElUWV9FSURfTUFYICAgICAxCisjZGVmaW5lIFNJUl9NQUNfUlNOX0VJRCAgICAgICAgICAgICAgICA0OAorI2RlZmluZSBTSVJfTUFDX1JTTl9FSURfTUlOICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19SU05fRUlEX01BWCAgICAgICAgICAgICAgICAyNTQKKworLy91c2luZyByZXNlcnZlZCBFSUQgZm9yIFFvcyBBY3Rpb24gSUUgZm9yIG5vdywKKy8vbmVlZCB0byBjaGVjayAxMWUgc3BlYyBmb3IgdGhlIGFjdHVhbCBFSUQKKyNkZWZpbmUgU0lSX01BQ19RT1NfQUNUSU9OX0VJRCAgICAgICAgIDQ5CisjZGVmaW5lIFNJUl9NQUNfUU9TX0FDVElPTl9FSURfTUlOICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX1FPU19BQ1RJT05fRUlEX01BWCAgICAgICAgIDI1NQorI2RlZmluZSBTSVJfTUFDX0VYVEVOREVEX1JBVEVfRUlEICAgICAgNTAKKyNkZWZpbmUgU0lSX01BQ19FWFRFTkRFRF9SQVRFX0VJRF9NSU4gICAgICAwCisjZGVmaW5lIFNJUl9NQUNfRVhURU5ERURfUkFURV9FSURfTUFYICAgICAgMjU1CisvLyByZXNlcnZlZCAgICAgICA1MS0yMjAKKyNkZWZpbmUgU0lSX01BQ19XUEFfRUlEICAgICAgICAgICAgICAgIDIyMQorI2RlZmluZSBTSVJfTUFDX1dQQV9FSURfTUlOICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19XUEFfRUlEX01BWCAgICAgICAgICAgICAgICAyNTUKKworI2RlZmluZSBTSVJfTUFDX0VJRF9WRU5ET1IgICAgICAgICAgICAgICAgMjIxCisKKy8vIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMi0yNTQKKyNkZWZpbmUgU0lSX01BQ19IVF9DQVBBQklMSVRJRVNfRUlEICAgIDQ1CisjZGVmaW5lIFNJUl9NQUNfSFRfQ0FQQUJJTElUSUVTX0VJRF9NSU4gICAgMAorI2RlZmluZSBTSVJfTUFDX0hUX0NBUEFCSUxJVElFU19FSURfTUFYICAgIDI1NQorI2RlZmluZSBTSVJfTUFDX0hUX0lORk9fRUlEICAgICAgNjEKKyNkZWZpbmUgU0lSX01BQ19IVF9JTkZPX0VJRF9NSU4gICAgMAorI2RlZmluZSBTSVJfTUFDX0hUX0lORk9fRUlEX01BWCAgICAyNTUKKworI2RlZmluZSBTSVJfTUFDX01BWF9TVVBQT1JURURfTUNTX1NFVCAgICAxNgorCisvLy8gV29ya2Fyb3VuZCBJRSB0byBjaGFuZ2UgYmVhY29uIGxlbmd0aCB3aGVuIGl0IGlzIDQqbisxCisjZGVmaW5lIFNJUl9NQUNfQU5JX1dPUktBUk9VTkRfRUlEICAgICAyNTUKKyNkZWZpbmUgU0lSX01BQ19BTklfV09SS0FST1VORF9FSURfTUlOICAgICAwCisjZGVmaW5lIFNJUl9NQUNfQU5JX1dPUktBUk9VTkRfRUlEX01BWCAgICAgMjU1CisKKy8vLyBNYXhpbXVtIGxlbmd0aCBvZiBlYWNoIElFCisjZGVmaW5lIFNJUl9NQUNfTUFYX0lFX0xFTkdUSCAgICAgICAyNTUKKworLy8vIE1heGltdW0gbGVuZ3RoIG9mIGVhY2ggSUUKKyNkZWZpbmUgU0lSX01BQ19SU05fSUVfTUFYX0xFTkdUSCAgIDI1NQorI2RlZmluZSBTSVJfTUFDX1dQQV9JRV9NQVhfTEVOR1RIICAgMjU1CisvLy8gTWluaW11bSBsZW5ndGggb2YgZWFjaCBJRQorI2RlZmluZSBTSVJfTUFDX1JTTl9JRV9NSU5fTEVOR1RIICAgMgorI2RlZmluZSBTSVJfTUFDX1dQQV9JRV9NSU5fTEVOR1RIICAgNgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorI2RlZmluZSBDQ1hfVkVSU0lPTl80ICAgICAgICAgICAgICAgNAorI2RlZmluZSBDQ1hfVkVSU0lPTl9TVVBQT1JURUQgICAgICAgQ0NYX1ZFUlNJT05fNAorCisvLyBXaGVuIHN0YXRpb24gc2VuZHMgUmFkaW8gTWFuYWdlbWVudCBDYXAuCisvLyBTdGF0ZSBzaG91bGQgYmUgbm9ybWFsPTEKKy8vIE1ic3NpZCBNYXNrIHNob3VsZCBiZSAwCisjZGVmaW5lIFJNX1NUQVRFX05PUk1BTCAgICAgICAgICAgICAxIAorI2VuZGlmCisKKyNkZWZpbmUgU0lSX01BQ19PVUlfVkVSU0lPTl8xICAgICAgICAgMQorCisvLyBPVUkgYW5kIHR5cGUgZGVmaW5pdGlvbiBmb3IgV1BBIElFIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorI2RlZmluZSBTSVJfTUFDX1dQQV9PVUkgICAgICAgICAgICAgMHgwMUYyNTAwMAorI2RlZmluZSBTSVJfTUFDX1dNRV9PVUkgICAgICAgICAgICAgMHgwMkYyNTAwMAorI2RlZmluZSBTSVJfTUFDX1dTTV9PVUkgICAgICAgICAgICAgU0lSX01BQ19XTUVfT1VJCisjZGVmaW5lIFNJUl9NQUNfV1NDX09VSSAgICAgICAgICAgICAiXHgwMFx4NTBceGYyXHgwNCIKKyNkZWZpbmUgU0lSX01BQ19XU0NfT1VJX1NJWkUgICAgICAgIDQKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisjZGVmaW5lIFNJUl9NQUNfUDJQX09VSSAgICAgICAgICAgICAiXHg1MFx4NmZceDlhXHgwOSIKKyNkZWZpbmUgU0lSX01BQ19QMlBfT1VJX1NJWkUgICAgICAgIDQKKyNkZWZpbmUgU0lSX1AyUF9OT0FfQVRUUiAgICAgICAgICAgIDEyCisjZGVmaW5lIFNJUl9NQVhfTk9BX0FUVFJfTEVOICAgICAgICAzMQorI2RlZmluZSBTSVJfTUFYX05PQV9ERVNDUiAgICAgICAgICAgMgorI2RlZmluZSBTSVJfUDJQX0lFX0hFQURFUl9MRU4gICAgICAgNgorI2VuZGlmCisKKy8vIG1pbiBzaXplIG9mIHdtZSBvdWkgaGVhZGVyOiBvdWkoMykgKyB0eXBlICsgc3VidHlwZSArIHZlcnNpb24KKyNkZWZpbmUgU0lSX01BQ19PVUlfV01FX0hEUl9NSU4gICAgICAgNgorCisvLyBPVUkgc3VidHlwZSBhbmQgdGhlaXIgbGVuZ3RocworI2RlZmluZSBTSVJfTUFDX09VSV9TVUJUWVBFX1dNRV9JTkZPICAwCisjZGVmaW5lIFNJUl9NQUNfT1VJX1dNRV9JTkZPX01JTiAgICAgIDcKKyNkZWZpbmUgU0lSX01BQ19PVUlfV01FX0lORk9fTUFYICAgICAgNworCisjZGVmaW5lIFNJUl9NQUNfT1VJX1NVQlRZUEVfV01FX1BBUkFNIDEKKyNkZWZpbmUgU0lSX01BQ19PVUlfV01FX1BBUkFNX01JTiAgICAgMjQKKyNkZWZpbmUgU0lSX01BQ19PVUlfV01FX1BBUkFNX01BWCAgICAgMjQKKworI2RlZmluZSBTSVJfTUFDX09VSV9TVUJUWVBFX1dNRV9UU1BFQyAyCisjZGVmaW5lIFNJUl9NQUNfT1VJX1dNRV9UU1BFQ19NSU4gICAgIDYxCisjZGVmaW5lIFNJUl9NQUNfT1VJX1dNRV9UU1BFQ19NQVggICAgIDYxCisKKyNkZWZpbmUgU0lSX01BQ19PVUlfU1VCVFlQRV9XU01fVFNQRUMgMiAgIC8vIHNhbWUgYXMgV01FIFRTUEVDCisjZGVmaW5lIFNJUl9NQUNfT1VJX1dTTV9UU1BFQ19NSU4gICAgIDYxCisjZGVmaW5lIFNJUl9NQUNfT1VJX1dTTV9UU1BFQ19NQVggICAgIDYxCisKKy8vIHJlc2VydmVkIHN1YnR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgMy00CisvLyBXU00gY2FwYWJpbGl0eQorI2RlZmluZSBTSVJfTUFDX09VSV9TVUJUWVBFX1dTTV9DQVBBQkxFICAgICA1CisjZGVmaW5lIFNJUl9NQUNfT1VJX1dTTV9DQVBBQkxFX01JTiAgICAgICAgIDcKKyNkZWZpbmUgU0lSX01BQ19PVUlfV1NNX0NBUEFCTEVfTUFYICAgICAgICAgNworLy8gV1NNIGNsYXNzaWZpZXIKKyNkZWZpbmUgU0lSX01BQ19PVUlfU1VCVFlQRV9XU01fVENMQVMgICAgICAgNgorI2RlZmluZSBTSVJfTUFDX09VSV9XU01fVENMQVNfTUlOICAgICAgICAgICAxMAorI2RlZmluZSBTSVJfTUFDX09VSV9XU01fVENMQVNfTUFYICAgICAgICAgICAyNTUKKy8vIGNsYXNzaWZpZXIgcHJvY2Vzc2luZyBlbGVtZW50CisjZGVmaW5lIFNJUl9NQUNfT1VJX1NVQlRZUEVfV1NNX1RDTEFTUFJPQyAgIDcKKyNkZWZpbmUgU0lSX01BQ19PVUlfV1NNX1RDTEFTUFJPQ19NSU4gICAgICAgNworI2RlZmluZSBTSVJfTUFDX09VSV9XU01fVENMQVNQUk9DX01BWCAgICAgICA3CisvLyB0c3BlYyBkZWxheSBlbGVtZW50CisjZGVmaW5lIFNJUl9NQUNfT1VJX1NVQlRZUEVfV1NNX1RTREVMQVkgICAgIDgKKyNkZWZpbmUgU0lSX01BQ19PVUlfV1NNX1RTREVMQVlfTUlOICAgICAgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19PVUlfV1NNX1RTREVMQVlfTUFYICAgICAgICAgMTAKKy8vIHNjaGVkdWxlIGVsZW1lbnQKKyNkZWZpbmUgU0lSX01BQ19PVUlfU1VCVFlQRV9XU01fU0NIRURVTEUgICAgOQorI2RlZmluZSBTSVJfTUFDX09VSV9XU01fU0NIRURVTEVfTUlOICAgICAgICAyMAorI2RlZmluZSBTSVJfTUFDX09VSV9XU01fU0NIRURVTEVfTUFYICAgICAgICAyMAorCisjaWZkZWYgV0xBTl9OU19PRkZMT0FECisjZGVmaW5lIFNJUl9NQUNfTlNfT0ZGTE9BRF9TSVpFICAgICAgICAxICAvL3N1cHBvcnQgb25seSBvbmUgSVB2NiBvZmZsb2FkCisjZGVmaW5lIFNJUl9NQUNfTlVNX1RBUkdFVF9JUFY2X05TX09GRkxPQURfTkEgICAyIC8vTnVtYmVyIG9mIHRhcmdldCBJUCBpbiBOQSBmcmFtZXMuIEl0IG11c3QgYmUgYXQgbGVhc3QgMgorI2VuZGlmIC8vV0xBTl9OU19PRkZMT0FECisjZGVmaW5lIFNJUl9NQUNfQVJQX09GRkxPQURfU0laRSAgICAgICAgMQorCisvLyB0b3RhbCBsZW5ndGggb2YgYW4gSW5mbyBlbGVtZW50IGluY2x1ZGluZyBUL0wgZmllbGRzCisjZGVmaW5lIEVJRF9MRU4oZWlkKSAoMiArIChlaWQpKQorCisvLyBzdXBwb3J0IGZvciByYWRhciBEZXRlY3QsIENoYW5uZWwgU3dpdGNoCisjZGVmaW5lIENIQU5ORUxfU1dJVENIX01BWF9GUkFNRV9TSVpFICAgICAgICAgICAgICAgMjU2CisKKworLy8gTGVuZ3RoIG9mIENoYW5uZWwgU3dpdGNoIHJlbGF0ZWQgbWVzc2FnZQorI2RlZmluZSBTSVJfU01FX0NIQU5ORUxfU1dJVENIX1NJWkUgICAgICAgIChzaXplb2YodEFOSV9VOCkgKyAyICpzaXplb2YodEFOSV9VMTYpICsgc2l6ZW9mKHRBTklfVTMyKSArIHNpemVvZih0QW5pQ0JTZWNvbmRhcnlNb2RlKSkKKyNkZWZpbmUgU0lSX0NIQU5ORUxfU1dJVENIX0lFX1NJWkUgICAgICAgICBFSURfTEVOKFNJUl9NQUNfQ0hOTF9TV0lUQ0hfQU5OX0VJRF9NSU4pCisKKy8vTWVhc3VyZW1lbnQgUmVxdWVzdC9SZXBvcnQgbWVzc2FnZXMKKyNkZWZpbmUgU0lSX01FQVNfUkVRX0ZJRUxEX1NJWkUgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgU0lSX01FQVNfUkVRX0lFX1NJWkUgICAgICAgICAgICAgICAgICAgKDUgKyBTSVJfTUVBU19SRVFfRklFTERfU0laRSkKKyNkZWZpbmUgU0lSX01FQVNfUkVRX0FDVElPTl9GUkFNRV9TSVpFICAgICAgICAgKDMgKyBTSVJfTUVBU19SRVFfSUVfU0laRSkKKyNkZWZpbmUgU0lSX01FQVNfTUFYX0ZSQU1FX1NJWkUgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIFNJUl9NRUFTX1JFUE9SVF9NSU5fRlJBTUVfU0laRSAgICAgICAgICgzICsgRUlEX0xFTihTSVJfTUFDX01FQVNfUlBUX0VJRF9NSU4pKQorCisjZGVmaW5lIFNJUl9NQUNfU0VUX01FQVNfUkVRX0VOQUJMRSh4KSAgICAgICAgICgoKHRBTklfVTgpIHgpIHwgMikKKyNkZWZpbmUgU0lSX01BQ19TRVRfTUVBU19SRVFfUkVRVUVTVCh4KSAgICAgICAgKCgodEFOSV9VOCkgeCkgfCA0KQorI2RlZmluZSBTSVJfTUFDX1NFVF9NRUFTX1JFUV9SRVBPUlQoeCkgICAgICAgICAoKCh0QU5JX1U4KSB4KSB8IDgpCisKKyNkZWZpbmUgU0lSX01BQ19TRVRfTUVBU19SRVBPUlRfTEFURSh4KSAgICAgICAgKCgodEFOSV9VOCkgeCkgfCAxKQorI2RlZmluZSBTSVJfTUFDX1NFVF9NRUFTX1JFUE9SVF9JTkNBUEFCTEUoeCkgICAoKCh0QU5JX1U4KSB4KSB8IDIpCisjZGVmaW5lIFNJUl9NQUNfU0VUX01FQVNfUkVQT1JUX1JFRlVTRSh4KSAgICAgICgoKHRBTklfVTgpIHgpIHwgNCkKKworLy8gTGVuZ3RoIG9mIFRQQyBSZXF1ZXN0IEFjdGlvbiBGcmFtZQorI2RlZmluZSBTSVJfVFBDX1JFUV9BQ1RJT05fRlJBTUVfU0laRSAgICAgICAgICAoMyArIEVJRF9MRU4oU0lSX01BQ19UUENfUkVRX0VJRF9NSU4pKQorI2RlZmluZSBTSVJfVFBDX1JFUE9SVF9BQ1RJT05fRlJBTUVfU0laRSAgICAgICAoMyArIEVJRF9MRU4oU0lSX01BQ19UUENfUlBUX0VJRF9NSU4pKQorI2RlZmluZSBTSVJfVFBDX01BWF9GUkFNRV9TSVpFICAgICAgICAgICAgICAgICAyNTYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gT0ZGU0VUIGRlZmluaXRpb25zIGZvciBmaXhlZCBmaWVsZHMgaW4gTWFuYWdlbWVudCBmcmFtZXMKKworLy8gQmVhY29uL1Byb2JlIFJlc3BvbnNlIG9mZnNldHMKKyNkZWZpbmUgU0lSX01BQ19UU19PRkZTRVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19CRUFDT05fSU5UX09GRlNFVCAgICAgICAgICAgIDggICAgLy8gQmVhY29uIEludGVydmFsIG9mZnNldAorI2RlZmluZSBTSVJfTUFDX0JfUFJfQ0FQQUJfT0ZGU0VUICAgICAgICAgICAgMTAKKyNkZWZpbmUgU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VUICAgICAgICAgICAgIDEyCisKKy8vIEFzc29jaWF0aW9uL1JlYXNzb2NpYXRpb24gb2Zmc2V0cworI2RlZmluZSBTSVJfTUFDX0FTU09DX0NBUEFCX09GRlNFVCAgICAgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX0xJU1RFTl9JTlRfT0ZGU0VUICAgICAgICAgICAgMiAgICAvLyBMaXN0ZW4gSW50ZXJ2YWwgb2Zmc2V0CisjZGVmaW5lIFNJUl9NQUNfQVNTT0NfU1NJRF9PRkZTRVQgICAgICAgICAgICA0CisjZGVmaW5lIFNJUl9NQUNfQ1VSUkVOVF9BUF9PRkZTRVQgICAgICAgICAgICA0CisjZGVmaW5lIFNJUl9NQUNfUkVBU1NPQ19TU0lEX09GRlNFVCAgICAgICAgICAxMAorI2RlZmluZSBTSVJfTUFDX0FTU09DX1NUQVRVU19DT0RFX09GRlNFVCAgICAgMgorI2RlZmluZSBTSVJfTUFDX0FTU09DX0FJRF9PRkZTRVQgICAgICAgICAgICAgNAorI2RlZmluZSBTSVJfTUFDX0FTU09DX1JTUF9SQVRFX09GRlNFVCAgICAgICAgNgorCisvLyBEaXNhc3NvY2lhdGlvbi9EZWF1dGhlbnRpY2F0aW9uIG9mZnNldHMKKyNkZWZpbmUgU0lSX01BQ19SRUFTT05fQ09ERV9PRkZTRVQgICAgICAgICAgIDAKKworLy8gUHJvYmUgUmVxdWVzdCBvZmZzZXQKKyNkZWZpbmUgU0lSX01BQ19QUk9CRV9SRVFfU1NJRF9PRkZTRVQgICAgICAgIDAKKworLy8gQXV0aGVudGljYXRpb24gb2Zmc2V0cworI2RlZmluZSBTSVJfTUFDX0FVVEhfQUxHT19PRkZTRVQgICAgICAgICAgICAgMAorI2RlZmluZSBTSVJfTUFDX0FVVEhfWEFDVF9TRVFOVU1fT0ZGU0VUICAgICAgMgorI2RlZmluZSBTSVJfTUFDX0FVVEhfU1RBVFVTX0NPREVfT0ZGU0VUICAgICAgNAorI2RlZmluZSBTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX09GRlNFVCAgICAgICAgNgorCisvLy8gVHJhbnNhY3Rpb24gc2VxdWVuY2UgbnVtYmVyIGRlZmluaXRpb25zICh1c2VkIGluIEF1dGhlbnRpY2F0aW9uIGZyYW1lcykKKyNkZWZpbmUgICAgU0lSX01BQ19BVVRIX0ZSQU1FXzEgICAgICAgIDEKKyNkZWZpbmUgICAgU0lSX01BQ19BVVRIX0ZSQU1FXzIgICAgICAgIDIKKyNkZWZpbmUgICAgU0lSX01BQ19BVVRIX0ZSQU1FXzMgICAgICAgIDMKKyNkZWZpbmUgICAgU0lSX01BQ19BVVRIX0ZSQU1FXzQgICAgICAgIDQKKworLy8vIFByb3RvY29sIGRlZmluZWQgTUFYIGRlZmluaXRpb25zCisjZGVmaW5lIFNJUl9NQUNfQUREUl9MRU5HVEggICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFNJUl9NQUNfTUFYX1NTSURfTEVOR1RIICAgICAgICAgICAgICAzMgorI2RlZmluZSBTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVMgICAgICAgICAgMTIKKyNkZWZpbmUgU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZUyAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19LRVlfTEVOR1RIICAgICAgICAgICAgICAgICAgIDEzICAgLy8gV0VQIE1heGltdW0ga2V5IGxlbmd0aCBzaXplCisjZGVmaW5lIFNJUl9NQUNfQVVUSF9DSEFMTEVOR0VfTEVOR1RIICAgICAgICAxMjgKKyNkZWZpbmUgU0lSX01BQ19XRVBfSVZfTEVOR1RIICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0lSX01BQ19XRVBfSUNWX0xFTkdUSCAgICAgICAgICAgICAgIDQKKworLy8vIE1BWCBrZXkgbGVuZ3RoIHdoZW4gVUxBIGlzIHVzZWQKKyNkZWZpbmUgU0lSX01BQ19NQVhfS0VZX0xFTkdUSCAgICAgICAgICAgICAgIDMyCisKKy8vLyBNYWNybyBkZWZpbml0aW9ucyBmb3IgZ2V0L3NldCBvbiBGQyBmaWVsZHMKKyNkZWZpbmUgU0lSX01BQ19HRVRfUFJPVF9WRVJTSU9OKHgpICAgICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4MDMwMCkgPj4gOCkKKyNkZWZpbmUgU0lSX01BQ19HRVRfRlJBTUVfVFlQRSh4KSAgICAgICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4MEMwMCkgPj4gOCkKKyNkZWZpbmUgU0lSX01BQ19HRVRfRlJBTUVfU1VCX1RZUEUoeCkgICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4RjAwMCkgPj4gMTIpCisjZGVmaW5lIFNJUl9NQUNfR0VUX1dFUF9CSVRfSU5fRkMoeCkgICAgICgoKHRBTklfVTE2KSB4KSAmIDB4MDA0MCkKKyNkZWZpbmUgU0lSX01BQ19TRVRfUFJPVF9WRVJTSU9OKHgpICAgICAgKCh0QU5JX1UxNikgeCkKKyNkZWZpbmUgU0lSX01BQ19TRVRfRlJBTUVfVFlQRSh4KSAgICAgICAgKCgodEFOSV9VMTYpIHgpIDw8IDIpCisjZGVmaW5lIFNJUl9NQUNfU0VUX0ZSQU1FX1NVQl9UWVBFKHgpICAgICgoKHRBTklfVTE2KSB4KSA8PCA0KQorI2RlZmluZSBTSVJfTUFDX1NFVF9XRVBfQklUX0lOX0ZDKHgpICAgICAoKCh0QU5JX1UxNikgeCkgPDwgMTQpCisKKy8vLyBNYWNybyBkZWZpbml0aW9ucyBmb3IgZ2V0L3NldCBvbiBjYXBhYmlsaXR5SW5mbyBiaXRzCisjZGVmaW5lIFNJUl9NQUNfR0VUX0VTUyh4KSAgICAgICAgICAgICAgICgoKHRBTklfVTE2KSB4KSAmIDB4MDAwMSkKKyNkZWZpbmUgU0lSX01BQ19HRVRfSUJTUyh4KSAgICAgICAgICAgICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4MDAwMikgPj4gMSkKKyNkZWZpbmUgU0lSX01BQ19HRVRfQ0ZfUE9MTEFCTEUoeCkgICAgICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4MDAwNCkgPj4gMikKKyNkZWZpbmUgU0lSX01BQ19HRVRfQ0ZfUE9MTF9SRVEoeCkgICAgICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4MDAwOCkgPj4gMykKKyNkZWZpbmUgU0lSX01BQ19HRVRfUFJJVkFDWSh4KSAgICAgICAgICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4MDAxMCkgPj4gNCkKKyNkZWZpbmUgU0lSX01BQ19HRVRfU0hPUlRfUFJFQU1CTEUoeCkgICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4MDAyMCkgPj4gNSkKKyNkZWZpbmUgU0lSX01BQ19HRVRfU1BFQ1RSVU1fTUdNVCh4KSAgICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4MDEwMCkgPj4gOCkKKyNkZWZpbmUgU0lSX01BQ19HRVRfUU9TKHgpICAgICAgICAgICAgICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4MDIwMCkgPj4gOSkKKyNkZWZpbmUgU0lSX01BQ19HRVRfU0hPUlRfU0xPVF9USU1FKHgpICAgKCgoKHRBTklfVTE2KSB4KSAmIDB4MDQwMCkgPj4gMTApCisjZGVmaW5lIFNJUl9NQUNfR0VUX0FQU0QoeCkgICAgICAgICAgICAgICgoKCh0QU5JX1UxNikgeCkgJiAweDA4MDApID4+IDExKQorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2RlZmluZSBTSVJfTUFDX0dFVF9SUk0oeCkgICAgICAgICAgICAgICAoKCgodEFOSV9VMTYpIHgpICYgMHgxMDAwKSA+PiAxMikKKyNlbmRpZgorI2RlZmluZSBTSVJfTUFDX0dFVF9CTE9DS19BQ0soeCkgICAgICAgICAoKCgodEFOSV9VMTYpIHgpICYgMHhjMDAwKSA+PiBDQVBBQklMSVRZX0lORk9fREVMQVlFRF9CQV9CSVQpCisjZGVmaW5lIFNJUl9NQUNfU0VUX0VTUyh4KSAgICAgICAgICAgICAgICgoKHRBTklfVTE2KSB4KSB8IDB4MDAwMSkKKyNkZWZpbmUgU0lSX01BQ19TRVRfSUJTUyh4KSAgICAgICAgICAgICAgKCgodEFOSV9VMTYpIHgpIHwgMHgwMDAyKQorI2RlZmluZSBTSVJfTUFDX1NFVF9DRl9QT0xMQUJMRSh4KSAgICAgICAoKCh0QU5JX1UxNikgeCkgfCAweDAwMDQpCisjZGVmaW5lIFNJUl9NQUNfU0VUX0NGX1BPTExfUkVRKHgpICAgICAgICgoKHRBTklfVTE2KSB4KSB8IDB4MDAwOCkKKyNkZWZpbmUgU0lSX01BQ19TRVRfUFJJVkFDWSh4KSAgICAgICAgICAgKCgodEFOSV9VMTYpIHgpIHwgMHgwMDEwKQorI2RlZmluZSBTSVJfTUFDX1NFVF9TSE9SVF9QUkVBTUJMRSh4KSAgICAoKCh0QU5JX1UxNikgeCkgfCAweDAwMjApCisjZGVmaW5lIFNJUl9NQUNfU0VUX1NQRUNUUlVNX01HTVQoeCkgICAgICgoKHRBTklfVTE2KSB4KSB8IDB4MDEwMCkKKyNkZWZpbmUgU0lSX01BQ19TRVRfUU9TKHgpICAgICAgICAgICAgICAgKCgodEFOSV9VMTYpIHgpIHwgMHgwMjAwKQorI2RlZmluZSBTSVJfTUFDX1NFVF9TSE9SVF9TTE9UX1RJTUUoeCkgICAoKCh0QU5JX1UxNikgeCkgfCAweDA0MDApCisjZGVmaW5lIFNJUl9NQUNfU0VUX0FQU0QoeCkgICAgICAgICAgICAgICgoKHRBTklfVTE2KSB4KSB8IDB4MDgwMCkKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNkZWZpbmUgU0lSX01BQ19TRVRfUlJNKHgpICAgICAgICAgICAgICAgKCgodEFOSV9VMTYpIHgpIHwgMHgxMDAwKSAKKyNlbmRpZgorI2RlZmluZSBTSVJfTUFDX1NFVF9HUk9VUF9BQ0soeCkgICAgICAgICAoKCh0QU5JX1UxNikgeCkgfCAweDQwMDApCisKKy8vIGJpdG5hbWUgbXVzdCBiZSBvbmUgb2YgdGhlIGFib3ZlLCBlZyBFU1MsIENGX1BPTExBQkxFLCBldGMuCisjZGVmaW5lIFNJUl9NQUNfQ0xFQVJfQ0FQQUJJTElUWSh1MTZ2YWx1ZSwgYml0bmFtZSkgXAorICAgICh1MTZ2YWx1ZSkgJj0gKH4oU0lSX01BQ19TRVRfIyNiaXRuYW1lKDApKSkKKworLy8vIFN0YXR1cyBDb2RlIChwcmVzZW50IGluIE1hbmFnZW1lbnQgcmVzcG9uc2UgZnJhbWVzKSBlbnVtCisKK3R5cGVkZWYgZW51bSBlU2lyTWFjU3RhdHVzQ29kZXMKK3sKKyAgICBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAvL1Jlc2VydmVkCisgICAgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTICAgICAgICAgICAgICAgID0gMSwgLy9VbnNwZWNpZmllZCByZWFzb24KKyAgICAvLyA4MDIuMTEgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLTkKKyAgICAvKgorICAgIFdNTSBzdGF0dXMgY29kZXMoc3RhbmRhcmQgMS4xIHRhYmxlIDkpCisgICAgICBUYWJsZSA5IEFERFRTIFJlc3BvbnNlIFN0YXR1cyBDb2RlcworICAgICAgVmFsdWUgT3BlcmF0aW9uCisgICAgICAwIEFkbWlzc2lvbiBhY2NlcHRlZAorICAgICAgMSBJbnZhbGlkIHBhcmFtZXRlcnMKKyAgICAgIDIgUmVzZXJ2ZWQKKyAgICAgIDMgUmVmdXNlZAorICAgICAgNC0yNTUgUmVzZXJ2ZWQKKyAgICAqLworICAgIGVTSVJfTUFDX1dNRV9JTlZBTElEX1BBUkFNU19TVEFUVVMgICAgICAgICAgICA9IDEsIC8vID8/CisgICAgZVNJUl9NQUNfV01FX1JFRlVTRURfU1RBVFVTICAgICAgICAgICAgICAgICAgID0gMywgLy8gPz8KKyAgICBlU0lSX01BQ19DQVBBQklMSVRJRVNfTk9UX1NVUFBPUlRFRF9TVEFUVVMgICAgPSAxMCwgLy9DYW5ub3Qgc3VwcG9ydCBhbGwgcmVxdWVzdGVkIGNhcGFiaWxpdGllcyBpbiB0aGUgQ2FwYWJpbGl0eSBJbmZvcm1hdGlvbiBmaWVsZAorICAgIGVTSVJfTUFDX0lOQUJMSVRZX1RPX0NPTkZJUk1fQVNTT0NfU1RBVFVTICAgICA9IDExLCAvL1JlYXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byBpbmFiaWxpdHkgdG8gY29uZmlybSB0aGF0IGFzc29jaWF0aW9uIGV4aXN0cworICAgIGVTSVJfTUFDX09VVFNJREVfU0NPUEVfT0ZfU1BFQ19TVEFUVVMgICAgICAgICA9IDEyLCAvL0Fzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVhc29uIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgc3RhbmRhcmQKKyAgICBlU0lSX01BQ19BVVRIX0FMR09fTk9UX1NVUFBPUlRFRF9TVEFUVVMgICAgICAgPSAxMywgLy9SZXNwb25kaW5nIHN0YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobQorICAgIGVTSVJfTUFDX0FVVEhfRlJBTUVfT1VUX09GX1NFUV9TVEFUVVMgICAgICAgICA9IDE0LCAvL1JlY2VpdmVkIGFuIEF1dGhlbnRpY2F0aW9uIGZyYW1lIHdpdGggYXV0aGVudGljYXRpb24gdHJhbnNhY3Rpb24gc2VxdWVuY2UgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb3V0IG9mIGV4cGVjdGVkIHNlcXVlbmNlCisgICAgZVNJUl9NQUNfQ0hBTExFTkdFX0ZBSUxVUkVfU1RBVFVTICAgICAgICAgICAgID0gMTUsIC8vQXV0aGVudGljYXRpb24gcmVqZWN0ZWQgYmVjYXVzZSBvZiBjaGFsbGVuZ2UgZmFpbHVyZQorICAgIGVTSVJfTUFDX0FVVEhfUlNQX1RJTUVPVVRfU1RBVFVTICAgICAgICAgICAgICA9IDE2LCAvL0F1dGhlbnRpY2F0aW9uIHJlamVjdGVkIGR1ZSB0byB0aW1lb3V0IHdhaXRpbmcgZm9yIG5leHQgZnJhbWUgaW4gc2VxdWVuY2UgCisgICAgZVNJUl9NQUNfTUFYX0FTU09DX1NUQV9SRUFDSEVEX1NUQVRVUyAgICAgICAgID0gMTcsIC8vQXNzb2NpYXRpb24gZGVuaWVkIGJlY2F1c2UgQVAgaXMgdW5hYmxlIHRvIGhhbmRsZSBhZGRpdGlvbmFsIGFzc29jaWF0ZWQgc3RhdGlvbnMKKyAgICBlU0lSX01BQ19CQVNJQ19SQVRFU19OT1RfU1VQUE9SVEVEX1NUQVRVUyAgICAgPSAxOCwgLy9Bc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIHJlcXVlc3Rpbmcgc3RhdGlvbiBub3Qgc3VwcG9ydGluZyBhbGwgb2YgdGhlIGRhdGEgcmF0ZXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQlNTQmFzaWNSYXRlU2V0IHBhcmFtZXRlcgorICAgIGVTSVJfTUFDX1NIT1JUX1BSRUFNQkxFX05PVF9TVVBQT1JURURfU1RBVFVTICA9IDE5LCAvL0Fzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVxdWVzdGluZyBzdGF0aW9uIG5vdCBzdXBwb3J0aW5nIHRoZSBzaG9ydCBwcmVhbWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL29wdGlvbgorICAgIGVTSVJfTUFDX1BCQ0NfTk9UX1NVUFBPUlRFRF9TVEFUVVMgICAgICAgICAgICA9IDIwLCAvL0Fzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVxdWVzdGluZyBzdGF0aW9uIG5vdCBzdXBwb3J0aW5nIHRoZSBQQkNDIG1vZHVsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vcHRpb24KKyAgICBlU0lSX01BQ19DSEFOTkVMX0FHSUxJVFlfTk9UX1NVUFBPUlRFRF9TVEFUVVMgPSAyMSwgLy9Bc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIHJlcXVlc3Rpbmcgc3RhdGlvbiBub3Qgc3VwcG9ydGluZyB0aGUgQ2hhbm5lbCBBZ2lsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb3B0aW9uCisgICAgZVNJUl9NQUNfU1BFQ1RSVU1fTUdNVF9SRVFEX1NUQVRVUyAgICAgICAgICAgID0gMjIsIC8vQXNzb2NpYXRpb24gcmVxdWVzdCByZWplY3RlZCBiZWNhdXNlIFNwZWN0cnVtIE1hbmFnZW1lbnQgY2FwYWJpbGl0eSBpcyByZXF1aXJlZAorICAgIGVTSVJfTUFDX1BXUl9DQVBBQklMSVRZX0JBRF9TVEFUVVMgICAgICAgICAgICA9IDIzLCAvL0Fzc29jaWF0aW9uIHJlcXVlc3QgcmVqZWN0ZWQgYmVjYXVzZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIFBvd2VyIENhcGFiaWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lbGVtZW50IGlzIHVuYWNjZXB0YWJsZQorICAgIGVTSVJfTUFDX1NQUlREX0NIQU5ORUxTX0JBRF9TVEFUVVMgICAgICAgICAgICA9IDI0LCAvL0Fzc29jaWF0aW9uIHJlcXVlc3QgcmVqZWN0ZWQgYmVjYXVzZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIFN1cHBvcnRlZCBDaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VsZW1lbnQgaXMgdW5hY2NlcHRhYmxlCisgICAgZVNJUl9NQUNfU0hPUlRfU0xPVF9OT1RfU1VQT1JURURfU1RBVFVTICAgICAgID0gMjUsIC8vQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgdGhlIFNob3J0IFNsb3QgVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL29wdGlvbgorICAgIGVTSVJfTUFDX0RTU1NfT0ZETV9OT1RfU1VQUE9SVEVEX1NUQVRVUyAgICAgICA9IDI2LCAvL0Fzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVxdWVzdGluZyBzdGF0aW9uIG5vdCBzdXBwb3J0aW5nIHRoZSBEU1NTLU9GRE0gb3B0aW9uCisgICAgLy8gcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjctMzEKKyAgICBlU0lSX01BQ19RT1NfVU5TUEVDSUZJRURfRkFJTFVSRV9TVEFUVVMgICAgICAgPSAzMiwgLy9VbnNwZWNpZmllZCwgUW9TLXJlbGF0ZWQgZmFpbHVyZQorICAgIGVTSVJfTUFDX1FBUF9OT19CQU5EV0lEVEhfU1RBVFVTICAgICAgICAgICAgICA9IDMzLCAvL0Fzc29jaWF0aW9uIGRlbmllZCBiZWNhdXNlIFFvUyBBUCBoYXMgaW5zdWZmaWNpZW50IGJhbmR3aWR0aCB0byBoYW5kbGUgYW5vdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1FvUyBTVEEKKyAgICBlU0lSX01BQ19YU19GUkFNRV9MT1NTX1NUQVRVUyAgICAgICAgICAgICAgICAgPSAzNCwgLy9Bc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIGV4Y2Vzc2l2ZSBmcmFtZSBsb3NzIHJhdGVzIGFuZC9vciBwb29yIGNvbmRpdGlvbnMgb24gY3VyLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JlbnQgb3BlcmF0aW5nIGNoYW5uZWwKKyAgICBlU0lSX01BQ19TVEFfUU9TX05PVF9TVVBQT1JURURfU1RBVFVTICAgICAgICAgPSAzNSwgLy9Bc3NvY2lhdGlvbiAod2l0aCBRb1MgQlNTKSBkZW5pZWQgYmVjYXVzZSB0aGUgcmVxdWVzdGluZyBTVEEgZG9lcyBub3Qgc3VwcG9ydCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Rb1MgZmFjaWxpdHkKKyAgICBlU0lSX01BQ19TVEFfQkxLX0FDS19OT1RfU1VQUE9SVEVEX1NUQVRVUyAgICAgPSAzNiwgLy9SZXNlcnZlZAorICAgIGVTSVJfTUFDX1JFUV9ERUNMSU5FRF9TVEFUVVMgICAgICAgICAgICAgICAgICA9IDM3LCAvL1RoZSByZXF1ZXN0IGhhcyBiZWVuIGRlY2xpbmVkCisgICAgZVNJUl9NQUNfSU5WQUxJRF9QQVJBTV9TVEFUVVMgICAgICAgICAgICAgICAgID0gMzgsIC8vVGhlIHJlcXVlc3QgaGFzIG5vdCBiZWVuIHN1Y2Nlc3NmdWwgYXMgb25lIG9yIG1vcmUgcGFyYW1ldGVycyBoYXZlIGludmFsaWQgdmFsdWVzCisgICAgZVNJUl9NQUNfVFNfTk9UX0hPTk9VUkVEX1NUQVRVUyAgICAgICAgICAgICAgID0gMzksIC8vVGhlIFRTIGhhcyBub3QgYmVlbiBjcmVhdGVkIGJlY2F1c2UgdGhlIHJlcXVlc3QgY2Fubm90IGJlIGhvbm9yZWQ7IGhvd2V2ZXIsIGEgc3VnZ2VzdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVFNQRUMgaXMgcHJvdmlkZWQgc28gdGhhdCB0aGUgaW5pdGlhdGluZyBTVEEgbWF5IGF0dGVtcHQgdG8gc2V0IGFub3RoZXIgVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93aXRoIHRoZSBzdWdnZXN0ZWQgY2hhbmdlcyB0byB0aGUgVFNQRUMKKyAgICBlU0lSX01BQ19JTlZBTElEX0lORk9STUFUSU9OX0VMRU1FTlRfU1RBVFVTICAgPSA0MCwgLy9JbnZhbGlkIGluZm9ybWF0aW9uIGVsZW1lbnQsIGkuZS4sIGFuIGluZm9ybWF0aW9uIGVsZW1lbnQgZGVmaW5lZCBpbiB0aGlzIHN0YW5kYXJkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3doaWNoIHRoZSBjb250ZW50IGRvZXMgbm90IG1lZXQgdGhlIHNwZWNpZmljYXRpb25zIGluIENsYXVzZSA3CisgICAgZVNJUl9NQUNfSU5WQUxJRF9HUk9VUF9DSVBIRVJfU1RBVFVTICAgICAgICAgID0gNDEsIC8vSW52YWxpZCBncm91cCBjaXBoZXIKKyAgICBlU0lSX01BQ19JTlZBTElEX1BBSVJXSVNFX0NJUEhFUl9TVEFUVVMgICAgICAgPSA0MiwgLy9JbnZhbGlkIHBhaXJ3aXNlIGNpcGhlcgorICAgIGVTSVJfTUFDX0lOVkFMSURfQUtNUF9TVEFUVVMgICAgICAgICAgICAgICAgICA9IDQzLCAvL0ludmFsaWQgQUtNUAorICAgIGVTSVJfTUFDX1VOU1VQUE9SVEVEX1JTTl9JRV9WRVJTSU9OX1NUQVRVUyAgICA9IDQ0LCAvL1Vuc3VwcG9ydGVkIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50IHZlcnNpb24KKyAgICBlU0lSX01BQ19JTlZBTElEX1JTTl9JRV9DQVBBQklMSVRJRVNfU1RBVFVTICAgPSA0NSwgLy9JbnZhbGlkIFJTTiBpbmZvcm1hdGlvbiBlbGVtZW50IGNhcGFiaWxpdGllcworICAgIGVTSVJfTUFDX0NJUEhFUl9TVUlURV9SRUpFQ1RFRF9TVEFUVVMgICAgICAgICA9IDQ2LCAvL0NpcGhlciBzdWl0ZSByZWplY3RlZCBiZWNhdXNlIG9mIHNlY3VyaXR5IHBvbGljeQorICAgIGVTSVJfTUFDX1RTX05PVF9DUkVBVEVEX1NUQVRVUyAgICAgICAgICAgICAgICA9IDQ3LCAvL1RoZSBUUyBoYXMgbm90IGJlZW4gY3JlYXRlZDsgaG93ZXZlciwgdGhlIEhDIG1heSBiZSBjYXBhYmxlIG9mIGNyZWF0aW5nIGEgVFMsIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzcG9uc2UgdG8gYSByZXF1ZXN0LCBhZnRlciB0aGUgdGltZSBpbmRpY2F0ZWQgaW4gdGhlIFRTIERlbGF5IGVsZW1lbnQKKyAgICBlU0lSX01BQ19ETF9OT1RfQUxMT1dFRF9TVEFUVVMgICAgICAgICAgICAgICAgPSA0OCwgLy9EaXJlY3QgbGluayBpcyBub3QgYWxsb3dlZCBpbiB0aGUgQlNTIGJ5IHBvbGljeQorICAgIGVTSVJfTUFDX0RFU1RfU1RBX05PVF9LTk9XTl9TVEFUVVMgICAgICAgICAgICA9IDQ5LCAvL1RoZSBEZXN0aW5hdGlvbiBTVEEgaXMgbm90IHByZXNlbnQgd2l0aGluIHRoaXMgQlNTCisgICAgZVNJUl9NQUNfREVTVF9TVEFfTk9UX1FTVEFfU1RBVFVTICAgICAgICAgICAgID0gNTAsIC8vVGhlIERlc3RpbmF0aW9uIFNUQSBpcyBub3QgYSBRb1MgU1RBCisgICAgZVNJUl9NQUNfSU5WQUxJRF9MSVNURU5fSU5URVJWQUxfU1RBVFVTICAgICAgID0gNTEsIC8vQXNzb2NpYXRpb24gZGVuaWVkIGJlY2F1c2UgdGhlIExpc3RlbkludGVydmFsIGlzIHRvbyBsYXJnZQorCisgICAgZVNJUl9NQUNfRFNTU19DQ0tfUkFURV9NVVNUX1NVUFBPUlRfU1RBVFVTICAgID0gNTIsIC8vRklYTUU6IAorICAgIGVTSVJfTUFDX0RTU1NfQ0NLX1JBVEVfTk9UX1NVUFBPUlRfU1RBVFVTICAgICA9IDUzLAorICAgIGVTSVJfTUFDX1BTTVBfQ09OVFJPTExFRF9BQ0NFU1NfT05MWV9TVEFUVVMgICA9IDU0LAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1ggICAgCisgICAgZVNJUl9NQUNfQ0NYX1VOU1BFQ0lGSUVEX1FPU19GQUlMVVJFX1NUQVRVUyAgID0gMjAwLCAvL0NDWC1VbnNwZWNpZmllZCwgUW9TIHJlbGF0ZWQgZmFpbHVyZSBpbiAoUmUpQXNzb2MgcmVzcG9uc2UgZnJhbWVzCisgICAgZVNJUl9NQUNfQ0NYX1RTUEVDX1JFUV9SRUZVU0VEX1NUQVRVUyAgICAgICAgID0gMjAxLCAvL0NDWC1UU1BFQyByZXF1ZXN0IHJlZnVzZWQgZHVlIHRvIEFQJ3MgcG9saWN5IGNvbmZpZ3VyYXRpb24gaW4gQWRkVHMgUnNwLCAoUmUpQXNzb2MgUnNwLgorICAgIGVTSVJfTUFDX0NDWF9BU1NPQ19ERU5JRURfSU5TVUZGX0JXX1NUQVRVUyAgICA9IDIwMiwgLy9DQ1gtQXNzb2MgZGVuaWVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgYmFuZHdpZHRoIHRvIGhhbmRsZSBuZXcgVFMgaW4gKFJlKUFzc29jIFJzcC4KKyAgICBlU0lSX01BQ19DQ1hfSU5WQUxJRF9QQVJBTUVURVJTX1NUQVRVUyAgICAgICAgPSAyMDMsIC8vQ0NYLUludmFsaWQgcGFyYW1ldGVycy4gKFJlKUFzc29jIHJlcXVlc3QgaGFkIG9uZSBvciBtb3JlIFRTUEVDIHBhcmFtZXRlcnMgd2l0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaW52YWxpZCB2YWx1ZXMuCisjZW5kaWYKKworfSB0U2lyTWFjU3RhdHVzQ29kZXM7CisKKy8qKgorICogUmVhc29uIENvZGUgKHByZXNlbnQgaW4gRGVhdXRoZW50aWNhdGlvbi9EaXNhc3NvY2lhdGlvbgorICogTWFuYWdlbWVudCBmcmFtZXMpIGVudW0KKyAqLwordHlwZWRlZiBlbnVtIGVTaXJNYWNSZWFzb25Db2RlcworeworICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTiAgICAgICAgICAgICAgICAgICA9IDEsIC8vVW5zcGVjaWZpZWQgcmVhc29uCisgICAgZVNJUl9NQUNfUFJFVl9BVVRIX05PVF9WQUxJRF9SRUFTT04gICAgICAgICAgICAgID0gMiwgLy9QcmV2aW91cyBhdXRoZW50aWNhdGlvbiBubyBsb25nZXIgdmFsaWQKKyAgICBlU0lSX01BQ19ERUFVVEhfTEVBVklOR19CU1NfUkVBU09OICAgICAgICAgICAgICAgPSAzLCAvL0RlYXV0aGVudGljYXRlZCBiZWNhdXNlIHNlbmRpbmcgc3RhdGlvbiBpcyBsZWF2aW5nIChvciBoYXMgbGVmdCkgSUJTUyBvciBFU1MKKyAgICBlU0lSX01BQ19ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWV9SRUFTT04gICAgICAgPSA0LCAvL0Rpc2Fzc29jaWF0ZWQgZHVlIHRvIGluYWN0aXZpdHkKKyAgICBlU0lSX01BQ19ESVNBU1NPQ19EVUVfVE9fRElTQUJJTElUWV9SRUFTT04gICAgICAgPSA1LCAvL0Rpc2Fzc29jaWF0ZWQgYmVjYXVzZSBBUCBpcyB1bmFibGUgdG8gaGFuZGxlIGFsbCBjdXJyZW50bHkgYXNzb2NpYXRlZCBzdGF0aW9ucworICAgIGVTSVJfTUFDX0NMQVNTMl9GUkFNRV9GUk9NX05PTl9BVVRIX1NUQV9SRUFTT04gICA9IDYsIC8vQ2xhc3MgMiBmcmFtZSByZWNlaXZlZCBmcm9tIG5vbmF1dGhlbnRpY2F0ZWQgc3RhdGlvbgorICAgIGVTSVJfTUFDX0NMQVNTM19GUkFNRV9GUk9NX05PTl9BU1NPQ19TVEFfUkVBU09OICA9IDcsIC8vQ2xhc3MgMyBmcmFtZSByZWNlaXZlZCBmcm9tIG5vbmFzc29jaWF0ZWQgc3RhdGlvbgorICAgIGVTSVJfTUFDX0RJU0FTU09DX0xFQVZJTkdfQlNTX1JFQVNPTiAgICAgICAgICAgICA9IDgsIC8vRGlzYXNzb2NpYXRlZCBiZWNhdXNlIHNlbmRpbmcgc3RhdGlvbiBpcyBsZWF2aW5nIChvciBoYXMgbGVmdCkgQlNTCisgICAgZVNJUl9NQUNfU1RBX05PVF9QUkVfQVVUSEVOVElDQVRFRF9SRUFTT04gICAgICAgID0gOSwgLy9TdGF0aW9uIHJlcXVlc3RpbmcgKHJlKWFzc29jaWF0aW9uIGlzIG5vdCBhdXRoZW50aWNhdGVkIHdpdGggcmVzcG9uZGluZyBzdGF0aW9uCisgICAgZVNJUl9NQUNfUFdSX0NBUEFCSUxJVFlfQkFEX1JFQVNPTiAgICAgICAgICAgICAgID0gMTAsIC8vRGlzYXNzb2NpYXRlZCBiZWNhdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgUG93ZXIgQ2FwYWJpbGl0eSBlbGVtZW50IGlzIHVuYWNjZXB0YWJsZQorICAgIGVTSVJfTUFDX1NQUlREX0NIQU5ORUxTX0JBRF9SRUFTT04gICAgICAgICAgICAgICA9IDExLCAvL0Rpc2Fzc29jaWF0ZWQgYmVjYXVzZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIFN1cHBvcnRlZCBDaGFubmVscyBlbGVtZW50IGlzIHVuYWNjZXB0YWJsZQorICAgIC8vIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisgICAgZVNJUl9NQUNfSU5WQUxJRF9JRV9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgID0gMTMsIC8vSW52YWxpZCBpbmZvcm1hdGlvbiBlbGVtZW50LCBpLmUuLCBhbiBpbmZvcm1hdGlvbiBlbGVtZW50IGRlZmluZWQgaW4gdGhpcyBzdGFuZGFyZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93aGljaCB0aGUgY29udGVudCBkb2VzIG5vdCBtZWV0IHRoZSBzcGVjaWZpY2F0aW9ucyBpbiBDbGF1c2UgNworICAgIGVTSVJfTUFDX01JQ19GQUlMVVJFX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAvL01lc3NhZ2UgaW50ZWdyaXR5IGNvZGUgKE1JQykgZmFpbHVyZQorICAgIGVTSVJfTUFDXzRXQVlfSEFORFNIQUtFX1RJTUVPVVRfUkVBU09OICAgICAgICAgICA9IDE1LCAvLzQtV2F5IEhhbmRzaGFrZSB0aW1lb3V0CisgICAgZVNJUl9NQUNfR1JfS0VZX1VQREFURV9USU1FT1VUX1JFQVNPTiAgICAgICAgICAgID0gMTYsIC8vR3JvdXAgS2V5IEhhbmRzaGFrZSB0aW1lb3V0CisgICAgZVNJUl9NQUNfUlNOX0lFX01JU01BVENIX1JFQVNPTiAgICAgICAgICAgICAgICAgID0gMTcsIC8vSW5mb3JtYXRpb24gZWxlbWVudCBpbiA0LVdheSBIYW5kc2hha2UgZGlmZmVyZW50IGZyb20gKFJlKUFzc29jaWF0aW9uIFJlcXVlc3QvUHJvYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZXNwb25zZS9CZWFjb24gZnJhbWUKKyAgICBlU0lSX01BQ19JTlZBTElEX01DX0NJUEhFUl9SRUFTT04gICAgICAgICAgICAgICAgPSAxOCwgLy9JbnZhbGlkIGdyb3VwIGNpcGhlcgorICAgIGVTSVJfTUFDX0lOVkFMSURfVUNfQ0lQSEVSX1JFQVNPTiAgICAgICAgICAgICAgICA9IDE5LCAvL0ludmFsaWQgcGFpcndpc2UgY2lwaGVyCisgICAgZVNJUl9NQUNfSU5WQUxJRF9BS01QX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgID0gMjAsIC8vSW52YWxpZCBBS01QCisgICAgZVNJUl9NQUNfVU5TVVBQT1JURURfUlNOX0lFX1ZFUl9SRUFTT04gICAgICAgICAgID0gMjEsIC8vVW5zdXBwb3J0ZWQgUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQgdmVyc2lvbgorICAgIGVTSVJfTUFDX0lOVkFMSURfUlNOX0NBUEFCSUxJVElFU19SRUFTT04gICAgICAgICA9IDIyLCAvL0ludmFsaWQgUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQgY2FwYWJpbGl0aWVzCisgICAgZVNJUl9NQUNfMVhfQVVUSF9GQUlMVVJFX1JFQVNPTiAgICAgICAgICAgICAgICAgID0gMjMsIC8vSUVFRSA4MDIuMVggYXV0aGVudGljYXRpb24gZmFpbGVkCisgICAgZVNJUl9NQUNfQ0lQSEVSX1NVSVRFX1JFSkVDVEVEX1JFQVNPTiAgICAgICAgICAgID0gMjQsIC8vQ2lwaGVyIHN1aXRlIHJlamVjdGVkIGJlY2F1c2Ugb2YgdGhlIHNlY3VyaXR5IHBvbGljeQorICAgIC8vIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1IC0gMzEKKyAgICBlU0lSX01BQ19RT1NfVU5TUEVDSUZJRURfUkVBU09OICAgICAgICAgICAgICAgICAgPSAzMiwgLy9EaXNhc3NvY2lhdGVkIGZvciB1bnNwZWNpZmllZCwgUW9TLXJlbGF0ZWQgcmVhc29uCisgICAgZVNJUl9NQUNfUUFQX05PX0JBTkRXSURUSF9SRUFTT04gICAgICAgICAgICAgICAgID0gMzMsIC8vRGlzYXNzb2NpYXRlZCBiZWNhdXNlIFFvUyBBUCBsYWNrcyBzdWZmaWNpZW50IGJhbmR3aWR0aCBmb3IgdGhpcyBRb1MgU1RBCisgICAgZVNJUl9NQUNfWFNfVU5BQ0tFRF9GUkFNRVNfUkVBU09OICAgICAgICAgICAgICAgID0gMzQsIC8vRGlzYXNzb2NpYXRlZCBiZWNhdXNlIGV4Y2Vzc2l2ZSBudW1iZXIgb2YgZnJhbWVzIG5lZWQgdG8gYmUgYWNrbm93bGVkZ2VkLCBidXQgYXJlIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Fja25vd2xlZGdlZCBkdWUgdG8gQVAgdHJhbnNtaXNzaW9ucyBhbmQvb3IgcG9vciBjaGFubmVsIGNvbmRpdGlvbnMKKyAgICBlU0lSX01BQ19CQURfVFhPUF9VU0VfUkVBU09OICAgICAgICAgICAgICAgICAgICAgPSAzNSwgLy9EaXNhc3NvY2lhdGVkIGJlY2F1c2UgU1RBIGlzIHRyYW5zbWl0dGluZyBvdXRzaWRlIHRoZSBsaW1pdHMgb2YgaXRzIFRYT1BzCisgICAgZVNJUl9NQUNfUEVFUl9TVEFfUkVRX0xFQVZJTkdfQlNTX1JFQVNPTiAgICAgICAgID0gMzYsIC8vUmVxdWVzdGVkIGZyb20gcGVlciBTVEEgYXMgdGhlIFNUQSBpcyBsZWF2aW5nIHRoZSBCU1MgKG9yIHJlc2V0dGluZykKKyAgICBlU0lSX01BQ19QRUVSX1JFSkVDVF9NRUNIQU5JU0lNX1JFQVNPTiAgICAgICAgICAgPSAzNywgLy9SZXF1ZXN0ZWQgZnJvbSBwZWVyIFNUQSBhcyBpdCBkb2VzIG5vdCB3YW50IHRvIHVzZSB0aGUgbWVjaGFuaXNtCisgICAgZVNJUl9NQUNfTUVDSEFOSVNNX05PVF9TRVRVUF9SRUFTT04gICAgICAgICAgICAgID0gMzgsIC8vUmVxdWVzdGVkIGZyb20gcGVlciBTVEEgYXMgdGhlIFNUQSByZWNlaXZlZCBmcmFtZXMgdXNpbmcgdGhlIG1lY2hhbmlzbSBmb3Igd2hpY2ggYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NldHVwIGlzIHJlcXVpcmVkCisgICAgZVNJUl9NQUNfUEVFUl9USU1FRE9VVF9SRUFTT04gICAgICAgICAgICAgICAgICAgID0gMzksIC8vUmVxdWVzdGVkIGZyb20gcGVlciBTVEEgZHVlIHRvIHRpbWVvdXQKKyAgICBlU0lSX01BQ19DSVBIRVJfTk9UX1NVUFBPUlRFRF9SRUFTT04gICAgICAgICAgICAgPSA0NSwgIC8vUGVlciBTVEEgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIGNpcGhlciBzdWl0ZQorICAgIGVTSVJfTUFDX0RJU0FTU09DX0RVRV9UT19GVEhBTkRPRkZfUkVBU09OICAgICAgICA9IDQ2LCAvL0ZUIHJlYXNvbgorICAgIC8vcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3IC0gNjU1MzUuCisgICAgZVNJUl9CRUFDT05fTUlTU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU1MzQsIC8vV2UgaW52ZW50ZWQgdGhpcyB0byB0ZWxsIGJlYWNvbiBtaXNzZWQgY2FzZQorfSB0U2lyTWFjUmVhc29uQ29kZXM7CisKKwordHlwZWRlZiBlbnVtIGVTaXJNYWNDaGFubmVsVHlwZQoreworICAgIGVTSVJfTUFDXzExQV9CQU5ELAorICAgIGVTSVJfTUFDXzExQl9CQU5ELAorICAgIGVTSVJfTUFDX1VOS05PV05fQkFORAorfSB0U2lyTWFjQ2hhbm5lbFR5cGU7CisKKy8vIEJBIEluaXRpYXRvciB2L3MgUmVjaXBpZW50Cit0eXBlZGVmIGVudW0gZUJBRGlyZWN0aW9uCit7CisgIGVCQV9SRUNJUElFTlQsCisgIGVCQV9JTklUSUFUT1IKK30gdEJBRGlyZWN0aW9uOworCisvLyBBLU1QRFUvQkEgRW5hYmxlL0Rpc2FibGUgaW4gVHgvUnggZGlyZWN0aW9uCit0eXBlZGVmIGVudW0gZUJBRW5hYmxlCit7CisgIGVCQV9ESVNBQkxFLAorICBlQkFfRU5BQkxFCit9IHRCQUVuYWJsZTsKKworLy8gQS1NUERVL0JBIFBvbGljeQordHlwZWRlZiBlbnVtIGVCQVBvbGljeQoreworICBlQkFfVU5DT01QUkVTU0VELAorICBlQkFfQ09NUFJFU1NFRAorfSB0QkFQb2xpY3k7CisKKy8vIEEtTVBEVS9CQSBQb2xpY3kKK3R5cGVkZWYgZW51bSBlQkFQb2xpY3lUeXBlCit7CisgIGVCQV9QT0xJQ1lfREVMQVlFRCwKKyAgZUJBX1BPTElDWV9JTU1FRElBVEUKK30gdEJBUG9saWN5VHlwZTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRkkKKy8qIEJhc2VkIG9uIHRhYmxlIDctNDNhIGZyb20gODAyLjExayBTcGVjICovCit0eXBlZGVmIGVudW0gZVJybU5laWdoYm9yUmVhY2hhYmlsaXR5Cit7CisgICAgZVJFQUNIQUJJTElUWV9SRVNFUlZFRCwKKyAgICBlUkVBQ0hBQklMSVRZX05PVF9SRUFDSEFCTEUsCisgICAgZVJFQUNIQUJJTElUWV9VTktOT1dOLAorICAgIGVSRUFDSEFCSUxJVFlfUkVBQ0hBQkxFLAorfSB0UnJtTmVpZ2hib3JSZWFjaGFiaWxpdHk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSSAqLworCisvLy8gRnJhbWUgY29udHJvbCBmaWVsZCBmb3JtYXQgKDIgYnl0ZXMpCit0eXBlZGVmICBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNGcmFtZUN0bAoreworCisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorCisgICAgdEFOSV9VOCBzdWJUeXBlIDo0OworICAgIHRBTklfVTggdHlwZSA6MjsKKyAgICB0QU5JX1U4IHByb3RWZXIgOjI7CisKKyAgICB0QU5JX1U4IG9yZGVyIDoxOworICAgIHRBTklfVTggd2VwIDoxOworICAgIHRBTklfVTggbW9yZURhdGEgOjE7CisgICAgdEFOSV9VOCBwb3dlck1nbXQgOjE7CisgICAgdEFOSV9VOCByZXRyeSA6MTsKKyAgICB0QU5JX1U4IG1vcmVGcmFnIDoxOworICAgIHRBTklfVTggZnJvbURTIDoxOworICAgIHRBTklfVTggdG9EUyA6MTsKKworI2Vsc2UKKworICAgIHRBTklfVTggcHJvdFZlciA6MjsKKyAgICB0QU5JX1U4IHR5cGUgOjI7CisgICAgdEFOSV9VOCBzdWJUeXBlIDo0OworCisgICAgdEFOSV9VOCB0b0RTIDoxOworICAgIHRBTklfVTggZnJvbURTIDoxOworICAgIHRBTklfVTggbW9yZUZyYWcgOjE7CisgICAgdEFOSV9VOCByZXRyeSA6MTsKKyAgICB0QU5JX1U4IHBvd2VyTWdtdCA6MTsKKyAgICB0QU5JX1U4IG1vcmVEYXRhIDoxOworICAgIHRBTklfVTggd2VwIDoxOworICAgIHRBTklfVTggb3JkZXIgOjE7CisKKyNlbmRpZgorCit9IF9fYW5pX2F0dHJfcGFja2VkICB0U2lyTWFjRnJhbWVDdGwsICp0cFNpck1hY0ZyYW1lQ3RsOworCisvLy8gU2VxdWVuY2UgY29udHJvbCBmaWVsZAordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNTZXFDdGwKK3sKKworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKworICAgIHRBTklfVTggc2VxTnVtTG8gOiA0OworICAgIHRBTklfVTggZnJhZ051bSA6IDQ7CisKKyAgICB0QU5JX1U4IHNlcU51bUhpIDogODsKKworI2Vsc2UKKworICAgIHRBTklfVTggZnJhZ051bSA6IDQ7CisgICAgdEFOSV9VOCBzZXFOdW1MbyA6IDQ7CisgICAgdEFOSV9VOCBzZXFOdW1IaSA6IDg7CisKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjU2VxQ3RsLCAqdHBTaXJNYWNTZXFDdGw7CisKKy8vIEFDSyBwb2xpY2llcworCit0eXBlZGVmIGVudW0gZVNpck1hY0Fja1BvbGljeQoreworICAgIGVTSVJfTUFDX0lNTUVESUFURV9BQ0s9MCAsCisgICAgZVNJUl9NQUNfTk9fQUNLLAorICAgIGVTSVJfTUFDX05PX0VYUExJQ0lUX0FDSywKKyAgICBlU0lSX01BQ19CVVJTVF9BQ0sKK30gdFNpck1hY0Fja1BvbGljeTsKKworLy8vIFFvUyBjb250cm9sIGZpZWxkCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1Fvc0N0bAoreworCisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorCisgICAgdEFOSV9VOCByc3ZkIDogMTsKKyAgICB0QU5JX1U4IGFja1BvbGljeSA6IDI7CisgICAgdEFOSV9VOCBlc29wX3R4b3BVbml0IDogMTsKKyAgICB0QU5JX1U4IHRpZCA6IDQ7CisKKyAgICB0QU5JX1U4IHR4b3AgOiA4OworCisjZWxzZQorCisgICAgdEFOSV9VOCB0aWQgOiA0OworICAgIHRBTklfVTggZXNvcF90eG9wVW5pdCA6IDE7CisgICAgdEFOSV9VOCBhY2tQb2xpY3kgOiAyOworICAgIHRBTklfVTggcnN2ZCA6IDE7CisKKyAgICB0QU5JX1U4IHR4b3AgOiA4OworCisjZW5kaWYKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1Fvc0N0bCwgKnRwU2lyTWFjUW9zQ3RsOworCisvLy8gTGVuZ3RoIChpbiBieXRlcykgb2YgTUFDIGhlYWRlciBpbiAzIGFkZHJlc3MgZm9ybWF0CisjZGVmaW5lIFNJUl9NQUNfSERSX0xFTl8zQSAgICAyNAorCisvLy8gTGVuZ3RoIChpbiBieXRlcykgb2YgTUFDIGhlYWRlciBpbiA0IGFkZHJlc3MgZm9ybWF0CisjZGVmaW5lIFNJUl9NQUNfSERSX0xFTl80QSAgICAzMAorCisvLy8gTGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIFFvUyBjb250cm9sIGZpZWxkIGluIHRoZSBNQUMgaGVhZGVyCisjZGVmaW5lIFNJUl9NQUNfUU9TX0NUTF9MRU4gICAgMgorCisvLy8gMyBhZGRyZXNzIE1BQyBkYXRhIGhlYWRlciBmb3JtYXQgKDI0LzI2IGJ5dGVzKQordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNEb3QzSGRyCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgZGFbNl07CisgICAgdEFOSV9VOCAgICAgICAgICAgc2FbNl07CisgICAgdEFOSV9VMTYgICAgICAgICAgbGVuZ3RoOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjRG90M0hkciwgKnRwU2lyTWFjRG90M0hkcjsKKworCisvLy8gMyBhZGRyZXNzIE1BQyBkYXRhIGhlYWRlciBmb3JtYXQgKDI0LzI2IGJ5dGVzKQordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNEYXRhSGRyM2EKK3sKKyAgICB0U2lyTWFjRnJhbWVDdGwgZmM7CisgICAgdEFOSV9VOCAgICAgICAgICAgZHVyYXRpb25MbzsKKyAgICB0QU5JX1U4ICAgICAgICAgICBkdXJhdGlvbkhpOworICAgIHRBTklfVTggICAgICAgICAgIGFkZHIxWzZdOworICAgIHRBTklfVTggICAgICAgICAgIGFkZHIyWzZdOworICAgIHRBTklfVTggICAgICAgICAgIGFkZHIzWzZdOworICAgIHRTaXJNYWNTZXFDdGwgICBzZXFDb250cm9sOworICAgIHRTaXJNYWNRb3NDdGwgICBxb3NDb250cm9sOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjRGF0YUhkcjNhLCAqdHBTaXJNYWNEYXRhSGRyM2E7CisKKy8vLyA0IGFkZHJlc3MgTUFDIGRhdGEgaGVhZGVyIGZvcm1hdCAoMzAvMzIgYnl0ZXMpCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY0RhdGFIZHI0YQoreworICAgIHRTaXJNYWNGcmFtZUN0bCBmYzsKKyAgICB0QU5JX1U4ICAgICAgICAgICBkdXJhdGlvbkxvOworICAgIHRBTklfVTggICAgICAgICAgIGR1cmF0aW9uSGk7CisgICAgdEFOSV9VOCAgICAgICAgICAgYWRkcjFbNl07CisgICAgdEFOSV9VOCAgICAgICAgICAgYWRkcjJbNl07CisgICAgdEFOSV9VOCAgICAgICAgICAgYWRkcjNbNl07CisgICAgdFNpck1hY1NlcUN0bCAgIHNlcUNvbnRyb2w7CisgICAgdEFOSV9VOCAgICAgICAgICAgYWRkcjRbNl07CisgICAgdFNpck1hY1Fvc0N0bCAgIHFvc0NvbnRyb2w7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNEYXRhSGRyNGEsICp0cFNpck1hY0RhdGFIZHI0YTsKKworLy8vIE1hbmFnZW1lbnQgaGVhZGVyIGZvcm1hdAordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNNZ210SGRyCit7CisgICAgdFNpck1hY0ZyYW1lQ3RsIGZjOworICAgIHRBTklfVTggICAgICAgICAgIGR1cmF0aW9uTG87CisgICAgdEFOSV9VOCAgICAgICAgICAgZHVyYXRpb25IaTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBkYVs2XTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBzYVs2XTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBic3NJZFs2XTsKKyAgICB0U2lyTWFjU2VxQ3RsICAgc2VxQ29udHJvbDsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY01nbXRIZHIsICp0cFNpck1hY01nbXRIZHI7CisKKy8vLyBQUy1wb2xsIGhlYWRlciBmb3JtYXQKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjUFNwb2xsCit7CisgICAgdFNpck1hY0ZyYW1lQ3RsIGZjOworICAgIHRBTklfVTggICAgICAgICAgICAgIGFpZExvOworICAgIHRBTklfVTggICAgICAgICAgICAgIGFpZEhpOworICAgIHRBTklfVTggICAgICAgICAgICAgIGJzc0lkWzZdOworICAgIHRBTklfVTggICAgICAgICAgICAgIHRhWzZdOworICAgIHRBTklfVTggICAgICAgICAgICAgIGZjc1s0XTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1BTcG9sbCwgKnRwU2lyTWFjUFNwb2xsOworCisvLy8gRVJQIGluZm9ybWF0aW9uIGZpZWxkCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY0VycEluZm8KK3sKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisgICAgdEFOSV9VOCAgICByZXNlcnZlZDo1OworICAgIHRBTklfVTggICAgYmFya2VyUHJlYW1ibGVNb2RlOjE7CisgICAgdEFOSV9VOCAgICB1c2VQcm90ZWN0aW9uOjE7CisgICAgdEFOSV9VOCAgICBub25FcnBQcmVzZW50OjE7CisjZWxzZQorICAgIHRBTklfVTggICAgbm9uRXJwUHJlc2VudDoxOworICAgIHRBTklfVTggICAgdXNlUHJvdGVjdGlvbjoxOworICAgIHRBTklfVTggICAgYmFya2VyUHJlYW1ibGVNb2RlOjE7CisgICAgdEFOSV9VOCAgICByZXNlcnZlZDo1OworI2VuZGlmCit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNFcnBJbmZvLCAqdHBTaXJNYWNFcnBJbmZvOworCisvLy8gQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBmaWVsZAordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNDYXBhYmlsaXR5SW5mbworeworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgICB0QU5JX1UxNiAgaW1tZWRpYXRlQkE6MTsKKyAgICB0QU5JX1UxNiAgZGVsYXllZEJBOjE7CisgICAgdEFOSV9VMTYgIGRzc3NPZmRtOjE7CisgICAgdEFOSV9VMTYgIHJybToxOworICAgIHRBTklfVTE2ICBhcHNkOjE7CisgICAgdEFOSV9VMTYgIHNob3J0U2xvdFRpbWU6MTsKKyAgICB0QU5JX1UxNiAgcW9zOjE7CisgICAgdEFOSV9VMTYgIHNwZWN0cnVtTWd0OjE7CisgICAgdEFOSV9VMTYgIGNoYW5uZWxBZ2lsaXR5OjE7CisgICAgdEFOSV9VMTYgIHBiY2M6MTsKKyAgICB0QU5JX1UxNiAgc2hvcnRQcmVhbWJsZToxOworICAgIHRBTklfVTE2ICBwcml2YWN5OjE7CisgICAgdEFOSV9VMTYgIGNmUG9sbFJlcToxOworICAgIHRBTklfVTE2ICBjZlBvbGxhYmxlOjE7CisgICAgdEFOSV9VMTYgIGlic3M6MTsKKyAgICB0QU5JX1UxNiAgZXNzOjE7CisjZWxzZQorICAgIHRBTklfVTE2ICBlc3M6MTsKKyAgICB0QU5JX1UxNiAgaWJzczoxOworICAgIHRBTklfVTE2ICBjZlBvbGxhYmxlOjE7CisgICAgdEFOSV9VMTYgIGNmUG9sbFJlcToxOworICAgIHRBTklfVTE2ICBwcml2YWN5OjE7CisgICAgdEFOSV9VMTYgIHNob3J0UHJlYW1ibGU6MTsKKyAgICB0QU5JX1UxNiAgcGJjYzoxOworICAgIHRBTklfVTE2ICBjaGFubmVsQWdpbGl0eToxOworICAgIHRBTklfVTE2ICBzcGVjdHJ1bU1ndDoxOworICAgIHRBTklfVTE2ICBxb3M6MTsKKyAgICB0QU5JX1UxNiAgc2hvcnRTbG90VGltZToxOworICAgIHRBTklfVTE2ICBhcHNkOjE7CisgICAgdEFOSV9VMTYgIHJybToxOworICAgIHRBTklfVTE2ICBkc3NzT2ZkbToxOworICAgIHRBTklfVTE2ICBkZWxheWVkQkE6MTsKKyAgICB0QU5JX1UxNiAgaW1tZWRpYXRlQkE6MTsKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjQ2FwYWJpbGl0eUluZm8sICp0cFNpck1hY0NhcGFiaWxpdHlJbmZvOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY0NmUGFyYW1TZXQKK3sKKyAgICB0QU5JX1U4ICAgIGNmcENvdW50OworICAgIHRBTklfVTggICAgY2ZwUGVyaW9kOworICAgIHRBTklfVTE2ICAgY2ZwTWF4RHVyYXRpb247CisgICAgdEFOSV9VMTYgICBjZnBEdXJSZW1haW5pbmc7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNDZlBhcmFtU2V0OworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1RpbQoreworICAgIHRBTklfVTggICAgZHRpbUNvdW50OworICAgIHRBTklfVTggICAgZHRpbVBlcmlvZDsKKyAgICB0QU5JX1U4ICAgIGJpdG1hcENvbnRyb2w7CisgICAgdEFOSV9VOCAgICBiaXRtYXBMZW5ndGg7CisgICAgdEFOSV9VOCAgICBiaXRtYXBbMjUxXTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1RpbTsKKworLy8xMiBCeXRlcyBsb25nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHJhdGUKKy8vYW5kIGV4dGVuZGVkIHJhdGUgc2V0IElFcworLy9UaGUgcGFyc2VyIGFzc3VtZSB0aGlzIHRvIGJlIGF0IGxlYXN0IDEyCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1JhdGVTZXQKK3sKKyAgICB0QU5JX1U4ICBudW1SYXRlczsKKyAgICB0QU5JX1U4ICByYXRlW1NJUl9NQUNfUkFURVNFVF9FSURfTUFYXTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1JhdGVTZXQ7CisKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNTU2lkCit7CisgICAgdEFOSV9VOCAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgIHNzSWRbMzJdOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjU1NpZDsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNXcGFJbmZvCit7CisgICAgdEFOSV9VOCAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgIGluZm9bU0lSX01BQ19NQVhfSUVfTEVOR1RIXTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1dwYUluZm8sICp0cFNpck1hY1dwYUluZm8sIHRTaXJNYWNSc25JbmZvLCAqdHBTaXJNYWNSc25JbmZvOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0KKyAqICBFRENBIFByb2ZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIEVEQ0FfQUNfQkUgMAorI2RlZmluZSBFRENBX0FDX0JLIDEKKyNkZWZpbmUgRURDQV9BQ19WSSAyCisjZGVmaW5lIEVEQ0FfQUNfVk8gMworI2RlZmluZSBBQ19NR01UX0xPIDQKKyNkZWZpbmUgQUNfTUdNVF9ISSA1CisjZGVmaW5lIE1BWF9OVU1fQUMgNAorI2RlZmluZSBUT1RfTlVNX0FDIChNQVhfTlVNX0FDICsgMikgICAvKiArMiBmb3IgQUNfTUdNVF94eCAqLworCisvKgorI2RlZmluZSAgIEVEQ0FfSU5ERVhfMF9SU1ZEICAgICAgICAgICAgMAorI2RlZmluZSAgIEVEQ0FfSU5ERVhfMV9CRUFDT04gICAgICAgICAgMQorI2RlZmluZSAgIEVEQ0FfSU5ERVhfMl9NR01UX1BST0JFUlNQICAgMgorI2RlZmluZSAgIEVEQ0FfSU5ERVhfM19NR01UX09USEVSICAgICAgMworI2RlZmluZSAgIEVEQ0FfSU5ERVhfNF9BQ19WTyAgICAgICAgICAgNAorI2RlZmluZSAgIEVEQ0FfSU5ERVhfNV9BQ19WSSAgICAgICAgICAgNQorI2RlZmluZSAgIEVEQ0FfSU5ERVhfNl9BQ19CRSAgICAgICAgICAgNgorI2RlZmluZSAgIEVEQ0FfSU5ERVhfN19BQ19CSyAgICAgICAgICAgNworKi8KKy8vIGFjY2VzcyBjYXRlZ29yaWVzCisjZGVmaW5lIFNJUl9NQUNfRURDQUFDSV9CRVNURUZGT1JUICAoRURDQV9BQ19CRSkKKyNkZWZpbmUgU0lSX01BQ19FRENBQUNJX0JBQ0tHUk9VTkQgIChFRENBX0FDX0JLKQorI2RlZmluZSBTSVJfTUFDX0VEQ0FBQ0lfVklERU8gICAgICAgKEVEQ0FfQUNfVkkpCisjZGVmaW5lIFNJUl9NQUNfRURDQUFDSV9WT0lDRSAgICAgICAoRURDQV9BQ19WTykKKworLy8gYWNjZXNzIGNhdGVnb3J5IHJlY29yZAordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNBY2lBaWZzbgoreworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgICB0QU5JX1U4ICByc3ZkICA6IDE7CisgICAgdEFOSV9VOCAgYWNpICAgOiAyOworICAgIHRBTklfVTggIGFjbSAgIDogMTsKKyAgICB0QU5JX1U4ICBhaWZzbiA6IDQ7CisjZWxzZQorICAgIHRBTklfVTggIGFpZnNuIDogNDsKKyAgICB0QU5JX1U4ICBhY20gICA6IDE7CisgICAgdEFOSV9VOCAgYWNpICAgOiAyOworICAgIHRBTklfVTggIHJzdmQgIDogMTsKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjQWNpQWlmc247CisKKy8vIGNvbnRlbnRpb24gd2luZG93IHNpemUKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjQ1cKK3sKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisgICAgdEFOSV9VOCAgbWF4IDogNDsKKyAgICB0QU5JX1U4ICBtaW4gOiA0OworI2Vsc2UKKyAgICB0QU5JX1U4ICBtaW4gOiA0OworICAgIHRBTklfVTggIG1heCA6IDQ7CisjZW5kaWYKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY0NXOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY0VkY2FQYXJhbVJlY29yZAoreworICAgIHRTaXJNYWNBY2lBaWZzbiBhY2k7CisgICAgdFNpck1hY0NXICAgICAgIGN3OworICAgIHRBTklfVTE2ICAgICAgICAgICAgIHR4b3BsaW1pdDsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY0VkY2FQYXJhbVJlY29yZDsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNRb3NJbmZvCit7CisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorICAgIHRBTklfVTggIHVhcHNkICAgOiAxOworICAgIHRBTklfVTggIHR4b3ByZXEgOiAxOworICAgIHRBTklfVTggIHFyZXEgICAgOiAxOworICAgIHRBTklfVTggIHFhY2sgICAgOiAxOworICAgIHRBTklfVTggIGNvdW50ICAgOiA0OworI2Vsc2UKKyAgICB0QU5JX1U4ICBjb3VudCAgIDogNDsKKyAgICB0QU5JX1U4ICBxYWNrICAgIDogMTsKKyAgICB0QU5JX1U4ICBxcmVxICAgIDogMTsKKyAgICB0QU5JX1U4ICB0eG9wcmVxIDogMTsKKyAgICB0QU5JX1U4ICB1YXBzZCAgIDogMTsKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjUW9zSW5mbzsKKworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1Fvc0luZm9TdGF0aW9uCit7CisjaWZkZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisgICAgdEFOSV9VOCBhY3ZvX3VhcHNkOjE7CisgICAgdEFOSV9VOCBhY3ZpX3VhcHNkOjE7CisgICAgdEFOSV9VOCBhY2JrX3VhcHNkOjE7CisgICAgdEFOSV9VOCBhY2JlX3VhcHNkOjE7CisgICAgdEFOSV9VOCBxYWNrOjE7CisgICAgdEFOSV9VOCBtYXhTcExlbjoyOworICAgIHRBTklfVTggbW9yZURhdGFBY2s6MTsKKyNlbHNlCisgICAgdEFOSV9VOCBtb3JlRGF0YUFjazoxOworICAgIHRBTklfVTggbWF4U3BMZW46MjsKKyAgICB0QU5JX1U4IHFhY2s6MTsKKyAgICB0QU5JX1U4IGFjYmVfdWFwc2Q6MTsKKyAgICB0QU5JX1U4IGFjYmtfdWFwc2Q6MTsKKyAgICB0QU5JX1U4IGFjdmlfdWFwc2Q6MTsKKyAgICB0QU5JX1U4IGFjdm9fdWFwc2Q6MTsKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCAgdFNpck1hY1Fvc0luZm9TdGF0aW9uLCAqdHBTaXJNYWNRb3NJbmZvU3RhdGlvbjsKKworCisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjRWRjYVBhcmFtU2V0SUUKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgdHlwZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJNYWNRb3NJbmZvICAgICAgICAgcW9zSW5mbzsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgcnN2ZDsKKyAgICB0U2lyTWFjRWRjYVBhcmFtUmVjb3JkIGFjYmU7IC8vIGJlc3QgZWZmb3J0CisgICAgdFNpck1hY0VkY2FQYXJhbVJlY29yZCBhY2JrOyAvLyBiYWNrZ3JvdW5kCisgICAgdFNpck1hY0VkY2FQYXJhbVJlY29yZCBhY3ZpOyAvLyB2aWRlbworICAgIHRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgYWN2bzsgLy8gdm9pY2UKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY0VkY2FQYXJhbVNldElFOworCisjaWYgMQordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNRb1NQYXJhbXMKK3sKKyAgICB0QU5JX1U4ICAgICAgICBjb3VudDsKKyAgICB0QU5JX1UxNiAgICAgICBsaW1pdDsKKyAgICB0QU5JX1U4ICAgICAgICBDV21pbls4XTsKKyAgICB0QU5JX1U4ICAgICAgICBBSUZTWzhdOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjUW9TUGFyYW1zOworI2VuZGlmCisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjUWJzc0xvYWRJRQoreworICAgIHRBTklfVTggICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTE2ICAgICAgIHN0YUNvdW50OworICAgIHRBTklfVTggICAgICAgIGNobmxVdGlsOworICAgIHRBTklfVTE2ICAgICAgIGFkbWl0Q2FwYWNpdHk7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNRYnNzTG9hZElFOworCisvLyB0cyBpbmZvIGRpcmVjdGlvbiBmaWVsZCBjYW4gdGFrZSBhbnkgb2YgdGhlc2UgdmFsdWVzCisjZGVmaW5lIFNJUl9NQUNfRElSRUNUSU9OX1VQTElOSyAgICAwCisjZGVmaW5lIFNJUl9NQUNfRElSRUNUSU9OX0ROTElOSyAgICAxCisjZGVmaW5lIFNJUl9NQUNfRElSRUNUSU9OX0RJUkVDVCAgICAyCisjZGVmaW5lIFNJUl9NQUNfRElSRUNUSU9OX0JJRElSICAgICAzCisKKy8vIGFjY2VzcyBwb2xpY3kKKy8vIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX01BQ19BQ0NFU1NQT0xJQ1lfRURDQSAgIDEKKyNkZWZpbmUgU0lSX01BQ19BQ0NFU1NQT0xJQ1lfSENDQSAgIDIKKyNkZWZpbmUgU0lSX01BQ19BQ0NFU1NQT0xJQ1lfQk9USCAgIDMKKworI2RlZmluZSBTSVJfTUFDX0hDQ0FfVFNJRF9NSU4gICAgICAgOCAvLyB2YWxpZCBIQ0NBIHRzaWQncyBhcmUgOCBvciBoaWdoZXIKKyNkZWZpbmUgU0lSX01BQ19USURfTUFYICAgICAgICAgICAgMTUKKyNkZWZpbmUgTUFDX0JBX1RJRF9NQVggICAgICAgICAgICAgIDgKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNUU0luZm9UZmMKK3sKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisgICAgdEFOSV9VOCAgICAgICAgYnVyc3RTaXplRGVmbiA6IDE7CisgICAgdEFOSV9VOCAgICAgICAgcmVzZXJ2ZWQgOjc7CisjZWxzZQorICAgIHRBTklfVTggICAgICAgIHJlc2VydmVkIDo3OworICAgIHRBTklfVTggICAgICAgIGJ1cnN0U2l6ZURlZm4gOiAxOworI2VuZGlmCisKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisgICAgdEFOSV9VMTYgICAgICAgYWNrUG9saWN5IDogMjsKKyAgICB0QU5JX1UxNiAgICAgICB1c2VyUHJpbyA6IDM7CisgICAgdEFOSV9VMTYgICAgICAgcHNiIDogMTsKKyAgICB0QU5JX1UxNiAgICAgICBhZ2dyZWdhdGlvbiA6IDE7CisgICAgdEFOSV9VMTYgICAgICAgYWNjZXNzUG9saWN5IDogMjsKKyAgICB0QU5JX1UxNiAgICAgICBkaXJlY3Rpb24gOiAyOworICAgIHRBTklfVTE2ICAgICAgIHRzaWQgOiA0OworICAgIHRBTklfVTE2ICAgICAgIHRyYWZmaWNUeXBlIDogMTsKKyNlbHNlCisgICAgdEFOSV9VMTYgICAgICAgdHJhZmZpY1R5cGUgOiAxOworICAgIHRBTklfVTE2ICAgICAgIHRzaWQgOiA0OworICAgIHRBTklfVTE2ICAgICAgIGRpcmVjdGlvbiA6IDI7CisgICAgdEFOSV9VMTYgICAgICAgYWNjZXNzUG9saWN5IDogMjsKKyAgICB0QU5JX1UxNiAgICAgICBhZ2dyZWdhdGlvbiA6IDE7CisgICAgdEFOSV9VMTYgICAgICAgcHNiIDogMTsKKyAgICB0QU5JX1UxNiAgICAgICB1c2VyUHJpbyA6IDM7CisgICAgdEFOSV9VMTYgICAgICAgYWNrUG9saWN5IDogMjsKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjVFNJbmZvVGZjOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1RTSW5mb1NjaAoreworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgICB0QU5JX1U4ICAgICAgICByc3ZkIDogNzsKKyAgICB0QU5JX1U4ICAgICAgICBzY2hlZHVsZSA6IDE7CisjZWxzZQorICAgIHRBTklfVTggICAgICAgIHNjaGVkdWxlIDogMTsKKyAgICB0QU5JX1U4ICAgICAgICByc3ZkIDogNzsKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjVFNJbmZvU2NoOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1RTSW5mbworeworICAgIHRTaXJNYWNUU0luZm9UZmMgdHJhZmZpYzsKKyAgICB0U2lyTWFjVFNJbmZvU2NoIHNjaGVkdWxlOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjVFNJbmZvOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1RzcGVjSUUKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBsZW5ndGg7CisgICAgdFNpck1hY1RTSW5mbyAgICAgICB0c2luZm87CisgICAgdEFOSV9VMTYgICAgICAgICAgICBub21Nc2R1U3o7CisgICAgdEFOSV9VMTYgICAgICAgICAgICBtYXhNc2R1U3o7CisgICAgdEFOSV9VMzIgICAgICAgICAgICBtaW5TdmNJbnRlcnZhbDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIG1heFN2Y0ludGVydmFsOworICAgIHRBTklfVTMyICAgICAgICAgICAgaW5hY3RJbnRlcnZhbDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIHN1c3BlbmRJbnRlcnZhbDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIHN2Y1N0YXJ0VGltZTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIG1pbkRhdGFSYXRlOworICAgIHRBTklfVTMyICAgICAgICAgICAgbWVhbkRhdGFSYXRlOworICAgIHRBTklfVTMyICAgICAgICAgICAgcGVha0RhdGFSYXRlOworICAgIHRBTklfVTMyICAgICAgICAgICAgbWF4QnVyc3RTejsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIGRlbGF5Qm91bmQ7CisgICAgdEFOSV9VMzIgICAgICAgICAgICBtaW5QaHlSYXRlOworICAgIHRBTklfVTE2ICAgICAgICAgICAgc3VycGx1c0J3OworICAgIHRBTklfVTE2ICAgICAgICAgICAgbWVkaXVtVGltZTsKK30KKyNpZm5kZWYgTFg1MjgwCitfX2FuaV9hdHRyX3BhY2tlZAorI2Vsc2UKK19fYW5pX2F0dHJfYWxpZ25lZF80ICBfX2FuaV9hdHRyX3BhY2tlZAorI2VuZGlmCit0U2lyTWFjVHNwZWNJRTsKKworLy8gbWF4IHNpemUgb2YgdGhlIGNsYXNzaWZpZXIgcGFyYW1zIGluIHRoZSB0Y2xhcyBJRQorI2RlZmluZSBTSVJfTUFDX0NMU1BBUkFNX0xFTiAyNTMKKworLy8gZnJhbWUgY2xhc3NpZmllciB0eXBlcworI2RlZmluZSBTSVJfTUFDX1RDTEFTVFlQRV9FVEhFUk5FVCAwCisjZGVmaW5lIFNJUl9NQUNfVENMQVNUWVBFX1RDUFVEUElQIDEKKyNkZWZpbmUgU0lSX01BQ19UQ0xBU1RZUEVfODAyMURRICAgMgorLy8gcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAzLTI1NQorCisjZGVmaW5lIFNJUl9NQUNfVENMQVNfUEFSQU1fRVRIRVJORVRfTUlOICAxNAordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNUY2xhc1BhcmFtRXRoZXJuZXQKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHNyY0FkZHJbNl07CisgICAgdEFOSV9VOCAgICAgICAgICAgICBkc3RBZGRyWzZdOworICAgIHRBTklfVTE2ICAgICAgICAgICAgdHlwZTsKK31fX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjVGNsYXNQYXJhbUV0aGVybmV0OworCisjZGVmaW5lIFNJUl9NQUNfVENMQVNfUEFSQU1fSVBWNF9NSU4gIDE2Cit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1RjbGFzUGFyYW1JUHY0Cit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICB2ZXJzaW9uOworICAgIHRBTklfVTMyICAgICAgICAgICAgc3JjSXBBZGRyOworICAgIHRBTklfVTMyICAgICAgICAgICAgZHN0SXBBZGRyOworICAgIHRBTklfVTE2ICAgICAgICAgICAgc3JjUG9ydDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGRzdFBvcnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBkc2NwOworICAgIHRBTklfVTggICAgICAgICAgICAgcHJvdG9jb2w7CisgICAgdEFOSV9VOCAgICAgICAgICAgICByc3ZkOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjVGNsYXNQYXJhbUlQdjQ7CisKKyNkZWZpbmUgU0lSX01BQ19UQ0xBU19JUFY0ICA0CisjZGVmaW5lIFNJUl9NQUNfVENMQVNfSVBWNiAgNgorCisjZGVmaW5lIFNJUl9NQUNfVENMQVNfUEFSQU1fSVBWNl9NSU4gIDQwCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1RjbGFzUGFyYW1JUHY2Cit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICB2ZXJzaW9uOworICAgIHRBTklfVTggICAgICAgICAgICAgc3JjSXBBZGRyWzE2XTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGRzdElwQWRkclsxNl07CisgICAgdEFOSV9VMTYgICAgICAgICAgICBzcmNQb3J0OworICAgIHRBTklfVTE2ICAgICAgICAgICAgZHN0UG9ydDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGZsb3dMYWJlbFszXTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1RjbGFzUGFyYW1JUHY2OworCisjZGVmaW5lIFNJUl9NQUNfVENMQVNfUEFSQU1fODAyMURRX01JTiAgMgordHlwZWRlZiAgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjVGNsYXNQYXJhbTgwMjFkcQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgdGFnOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjVGNsYXNQYXJhbTgwMjFkcTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNUY2xhc0lFCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICB0eXBlOworICAgIHRBTklfVTggICAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICAgdXNlclByaW87CisgICAgdEFOSV9VOCAgICAgICAgICAgICBjbGFzc2lmaWVyVHlwZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGNsYXNzaWZpZXJNYXNrOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjVGNsYXNJRTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNUc0RlbGF5SUUKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VMzIgICAgICAgICAgICBkZWxheTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1RzRGVsYXlJRTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNUY2xhc1Byb2NJRQoreworICAgIHRBTklfVTggICAgICAgICAgICAgdHlwZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHByb2Nlc3Npbmc7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNUY2xhc1Byb2NJRTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNTY2hlZHVsZUluZm8KK3sKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisgICAgdEFOSV9VMTYgICAgICAgICAgICByc3ZkIDogOTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGRpcmVjdGlvbiA6IDI7CisgICAgdEFOSV9VMTYgICAgICAgICAgICB0c2lkIDogNDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGFnZ3JlZ2F0aW9uIDogMTsKKyNlbHNlCisgICAgdEFOSV9VMTYgICAgICAgICAgICBhZ2dyZWdhdGlvbiA6IDE7CisgICAgdEFOSV9VMTYgICAgICAgICAgICB0c2lkIDogNDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGRpcmVjdGlvbiA6IDI7CisgICAgdEFOSV9VMTYgICAgICAgICAgICByc3ZkIDogOTsKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjU2NoZWR1bGVJbmZvOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1NjaGVkdWxlSUUKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgdHlwZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJNYWNTY2hlZHVsZUluZm8gaW5mbzsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgc3ZjU3RhcnRUaW1lOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICBzdmNJbnRlcnZhbDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgbWF4U3ZjRHVyYXRpb247CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgIHNwZWNJbnRlcnZhbDsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1NjaGVkdWxlSUU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjUW9zQ2FwYWJpbGl0eUlFCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0U2lyTWFjUW9zSW5mbyAgICAgIHFvc0luZm87Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNRb3NDYXBhYmlsaXR5SUU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjUW9zQ2FwYWJpbGl0eVN0YUlFCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0U2lyTWFjUW9zSW5mb1N0YXRpb24gICAgcW9zSW5mbzsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1Fvc0NhcGFiaWxpdHlTdGFJRTsKKworCisjZGVmaW5lICBBRERUUwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNRb3NBY3Rpb25JRQoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICB0eXBlOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIHFvc0FjdGlvbjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgcW9zQm9keVsxXTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1Fvc0FjdGlvbklFOworCit0eXBlZGVmIHRBTklfVTMyIHRTaXJNYWNUaW1lU3RhbXBbMl07CisKK3R5cGVkZWYgdEFOSV9VMTYgdFNpck1hY0JlYWNvbkludGVydmFsOworCit0eXBlZGVmIHRBTklfVTE2IHRTaXJNYWNMaXN0ZW5JbnRlcnZhbDsKKwordHlwZWRlZiB0QU5JX1U4IHRTaXJNYWNDaGFuTnVtOworCit0eXBlZGVmIHRBTklfVTggdFNpck1hY0FkZHJbNl07CisKKworLy8gSUUgZGVmaW5pdGlvbnMKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjSUUKK3sKKyAgICB0QU5JX1U4ICAgIGVsZW1lbnRJRDsKKyAgICB0QU5JX1U4ICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgIGluZm9bMV07Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNJRTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNTU2lkSUUKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICB0eXBlOworICAgIHRTaXJNYWNTU2lkICAgICBzc0lkOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjU1NpZElFOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1JhdGVTZXRJRQoreworICAgIHRBTklfVTggICAgICAgICAgICAgIHR5cGU7CisgICAgdFNpck1hY1JhdGVTZXQgIHN1cHBvcnRlZFJhdGVTZXQ7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNSYXRlU2V0SUU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjRHNQYXJhbVNldElFCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICB0eXBlOworICAgIHRBTklfVTggICAgICAgICAgICAgbGVuZ3RoOworICAgIHRTaXJNYWNDaGFuTnVtIGNoYW5uZWxOdW1iZXI7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNEc1BhcmFtU2V0SUU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjQ2ZQYXJhbVNldElFCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0U2lyTWFjQ2ZQYXJhbVNldCAgIGNmUGFyYW1zOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjQ2ZQYXJhbVNldElFOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY0NoYW5JbmZvCit7CisgICAgdFNpck1hY0NoYW5OdW0gZmlyc3RDaGFuTnVtOworICAgIHRBTklfVTggICAgICAgICAgICAgbnVtQ2hhbm5lbHM7CisgICAgdEFOSV9TOCAgICAgICAgICAgICBtYXhUeFBvd2VyOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjQ2hhbkluZm87CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjQ291bnRyeQoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGNvdW50cnlTdHJpbmdbM107ICAgIC8vIFRoaXMgZnJvbSBDRkdfQ09VTlRSWV9TVFJJTkcKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBudW1DaGFuSW5mbzsKKyAgICB0U2lyTWFjQ2hhbkluZm8gICAgY2hhbkluZm9bMV07Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNDb3VudHJ5OworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY0NvdW50cnlJRQoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgdHlwZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0U2lyTWFjQ291bnRyeSAgICBjb3VudHJ5OworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjQ291bnRyeUlFOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY05vbkVycFByZXNlbnRJRQoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgdHlwZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgIGVycDsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY05vbkVycFByZXNlbnRJRTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNXcGFJRQoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgdHlwZTsKKyAgICB0U2lyTWFjV3BhSW5mbyAgICB3cGE7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNXcGFJRTsKKwordHlwZWRlZiAgc3RydWN0IHNTaXJNYWNQb3dlckNhcGFiaWxpdHlJRQoreworICAgIHRBTklfVTggICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgIG1pblR4UG93ZXI7CisgICAgdEFOSV9VOCAgICAgICAgbWF4VHhQb3dlcjsKK30gdFNpck1hY1Bvd2VyQ2FwYWJpbGl0eUlFOworCit0eXBlZGVmICBzdHJ1Y3Qgc1Npck1hY1N1cHBvcnRlZENoYW5uZWxJRQoreworICAgIHRBTklfVTggICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgIHN1cHBvcnRlZENoYW5uZWxzWzk2XTsKK30gdFNpck1hY1N1cHBvcnRlZENoYW5uZWxJRTsKKwordHlwZWRlZiAgc3RydWN0IHNTaXJNYWNNZWFzUmVxRmllbGQKK3sKKyAgICB0QU5JX1U4ICAgICAgICBjaGFubmVsTnVtYmVyOworICAgIHRBTklfVTggICAgICAgIG1lYXNTdGFydFRpbWVbOF07CisgICAgdEFOSV9VMTYgICAgICAgbWVhc0R1cmF0aW9uOworfSB0U2lyTWFjTWVhc1JlcUZpZWxkLCAqdHBTaXJNYWNNZWFzUmVxRmllbGQ7CisKK3R5cGVkZWYgIHN0cnVjdCBzU2lyTWFjTWVhc1JlcUlFCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgbWVhc1Rva2VuOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICBtZWFzUmVxTW9kZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgbWVhc1R5cGU7CisgICAgdFNpck1hY01lYXNSZXFGaWVsZCAgICBtZWFzUmVxRmllbGQ7Cit9IHRTaXJNYWNNZWFzUmVxSUUsICp0cFNpck1hY01lYXNSZXFJRTsKKworLy8gQmFzaWMgTWVhc3VyZW1lbnQgUmVwb3J0Cit0eXBlZGVmICBzdHJ1Y3Qgc1Npck1hY0Jhc2ljUmVwb3J0Cit7CisgICAgdEFOSV9VOCAgICAgICAgY2hhbm5lbE51bWJlcjsKKyAgICB0QU5JX1U4ICAgICAgICBtZWFzU3RhcnRUaW1lWzhdOworICAgIHRBTklfVTE2ICAgICAgIG1lYXNEdXJhdGlvbjsKKyAgICB0QU5JX1U4ICAgICAgICBtYXBGaWVsZDsKK30gdFNpck1hY0Jhc2ljUmVwb3J0LCAqdHBTaXJNYWNCYXNpY1JlcG9ydDsKKwordHlwZWRlZiAgc3RydWN0IHNTaXJNYWNCYXNpY1JlcG9ydElFCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgbWVhc1Rva2VuOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgIG1lYXNSZXBvcnRNb2RlOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgIG1lYXNUeXBlOworICAgIHRTaXJNYWNCYXNpY1JlcG9ydCAgICAgICBiYXNpY1JlcG9ydDsKK30gdFNpck1hY0Jhc2ljUmVwb3J0SUUsICp0cFNpck1hY0Jhc2ljUmVwb3J0SUU7CisKKy8vIENDQSBNZWFzdXJlbWVudCBSZXBvcnQKK3R5cGVkZWYgIHN0cnVjdCBzU2lyTWFjQ2NhUmVwb3J0Cit7CisgICAgdEFOSV9VOCAgICAgICAgY2hhbm5lbE51bWJlcjsKKyAgICB0QU5JX1U4ICAgICAgICBtZWFzU3RhcnRUaW1lWzhdOworICAgIHRBTklfVTE2ICAgICAgIG1lYXNEdXJhdGlvbjsKKyAgICB0QU5JX1U4ICAgICAgICBjY2FCdXN5RnJhY3Rpb247Cit9IHRTaXJNYWNDY2FSZXBvcnQsICp0cFNpck1hY0NjYVJlcG9ydDsKKwordHlwZWRlZiAgc3RydWN0IHNTaXJNYWNDY2FSZXBvcnRJRQoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgIG1lYXNUb2tlbjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICBtZWFzUmVwb3J0TW9kZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICBtZWFzVHlwZTsKKyAgICB0U2lyTWFjQ2NhUmVwb3J0ICAgICAgICAgY2NhUmVwb3J0OworfSB0U2lyTWFjQ2NhUmVwb3J0SUUsICp0cFNpck1hY0NjYVJlcG9ydElFOworCisvLyBSUEkgSGlzdG9ncmFtIE1lYXN1cmVtZW50IFJlcG9ydAordHlwZWRlZiAgc3RydWN0IHNTaXJNYWNScGlSZXBvcnQKK3sKKyAgICB0QU5JX1U4ICAgICAgICBjaGFubmVsTnVtYmVyOworICAgIHRBTklfVTggICAgICAgIG1lYXNTdGFydFRpbWVbOF07CisgICAgdEFOSV9VMTYgICAgICAgbWVhc0R1cmF0aW9uOworICAgIHRBTklfVTggICAgICAgIHJwaURlbnNpdHlbOF07Cit9IHRTaXJNYWNScGlSZXBvcnQsICp0cFNpck1hY1JwaVJlcG9ydDsKKwordHlwZWRlZiAgc3RydWN0IHNTaXJNYWNScGlSZXBvcnRJRQoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgIHR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgIG1lYXNUb2tlbjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICBtZWFzUmVwb3J0TW9kZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICBtZWFzVHlwZTsKKyAgICB0U2lyTWFjUnBpUmVwb3J0ICAgICBycGlSZXBvcnQ7Cit9IHRTaXJNYWNScGlSZXBvcnRJRSwgKnRwU2lyTWFjUnBpUmVwb3J0SUU7CisKKworLy8gSFQgQ2FwIGFuZCBIVCBJRSBTaXplIGRlZmluZXMKKyNkZWZpbmUgSFRfQ0FQQUJJTElUWV9JRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBIVF9JTkZPX0lFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNAorCisvLworLy8gRGV0ZXJtaW5lcyB0aGUgY3VycmVudCBvcGVyYXRpbmcgbW9kZSBvZiB0aGUgODAyLjExbiBTVEEKKy8vCit0eXBlZGVmIGVudW0gZVNpck1hY0hUT3BlcmF0aW5nTW9kZQoreworICBlU0lSX0hUX09QX01PREVfUFVSRSwgLy8gTm8gUHJvdGVjdGlvbgorICBlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1ksIC8vIE92ZXJsYXAgTGVnYWN5IGRldmljZSBwcmVzZW50LCBwcm90ZWN0aW9uIGlzIG9wdGlvbmFsCisgIGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQsIC8vIE5vIGxlZ2FjeSBkZXZpY2UsIGJ1dCAyMCBNSHogSFQgcHJlc2VudAorICBlU0lSX0hUX09QX01PREVfTUlYRUQgLy8gUHJvdGV0aW9uIGlzIHJlcXVpcmVkCit9IHRTaXJNYWNIVE9wZXJhdGluZ01vZGU7CisKKworLy8gU3BhdGlhbCBNdWx0aXBsZXhpbmcoU00pIFBvd2VyIFNhdmUgbW9kZQordHlwZWRlZiBlbnVtIGVTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZQoreworICBlU0lSX0hUX01JTU9fUFNfU1RBVElDID0gMCwgLy8gU3RhdGljIFNNIFBvd2VyIFNhdmUgbW9kZQorICBlU0lSX0hUX01JTU9fUFNfRFlOQU1JQyA9IDEsIC8vIER5bmFtaWMgU00gUG93ZXIgU2F2ZSBtb2RlCisgIGVTSVJfSFRfTUlNT19QU19OQSA9IDIsIC8vIHJlc2VydmVkCisgIGVTSVJfSFRfTUlNT19QU19OT19MSU1JVCA9IDMgLy8gU00gUG93ZXIgU2F2ZSBkaXNhYmxlZAorfSB0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGU7CisKKwordHlwZWRlZiBlbnVtIGVTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQKK3sKKyAgICBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX05PTkUgPSAwLAorICAgIGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfVVAgPSAxLAorICAgIGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfRE9XTiA9IDMKK30gdFNpck1hY0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKwordHlwZWRlZiBlbnVtIGVTaXJNYWNIVENoYW5uZWxXaWR0aAoreworICAgIGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaID0gMCwKKyAgICBlSFRfQ0hBTk5FTF9XSURUSF80ME1IWiA9IDEKK30gdFNpck1hY0hUQ2hhbm5lbFdpZHRoOworCisvL1BhY2tldCBzdHJ1Y3QgZm9yIEhUIGNhcGFiaWxpdHkKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzSHRDYXBzIHsKKyAgICB0QU5JX1UxNiAgICAgYWR2Q29kaW5nQ2FwOiAxOworICAgIHRBTklfVTE2IHN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDogMTsKKyAgICB0QU5JX1UxNiAgICBtaW1vUG93ZXJTYXZlOiAyOworICAgIHRBTklfVTE2ICAgICAgIGdyZWVuRmllbGQ6IDE7CisgICAgdEFOSV9VMTYgICAgIHNob3J0R0kyME1IejogMTsKKyAgICB0QU5JX1UxNiAgICAgc2hvcnRHSTQwTUh6OiAxOworICAgIHRBTklfVTE2ICAgICAgICAgICB0eFNUQkM6IDE7CisgICAgdEFOSV9VMTYgICAgICAgICAgIHJ4U1RCQzogMjsKKyAgICB0QU5JX1UxNiAgICAgICAgZGVsYXllZEJBOiAxOworICAgIHRBTklfVTE2IG1heGltYWxBTVNEVXNpemU6IDE7CisgICAgdEFOSV9VMTYgZHNzc0Nja01vZGU0ME1IejogMTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBwc21wOiAxOworICAgIHRBTklfVTE2IHN0YmNDb250cm9sRnJhbWU6IDE7CisgICAgdEFOSV9VMTYgbHNpZ1RYT1BQcm90ZWN0aW9uOiAxOworICAgIHRBTklfVTggbWF4UnhBTVBEVUZhY3RvcjogMjsKKyAgICB0QU5JX1U4ICAgICAgbXBkdURlbnNpdHk6IDM7CisgICAgdEFOSV9VOCAgICAgICAgcmVzZXJ2ZWQxOiAzOworICAgIHRBTklfVTggICAgICBzdXBwb3J0ZWRNQ1NTZXRbMTZdOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICBwY286IDE7CisgICAgdEFOSV9VMTYgICB0cmFuc2l0aW9uVGltZTogMjsKKyAgICB0QU5JX1UxNiAgICAgICAgcmVzZXJ2ZWQyOiA1OworICAgIHRBTklfVTE2ICAgICAgbWNzRmVlZGJhY2s6IDI7CisgICAgdEFOSV9VMTYgICAgICAgIHJlc2VydmVkMzogNjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICB0eEJGOiAxOworICAgIHRBTklfVTMyIHJ4U3RhZ2dlcmVkU291bmRpbmc6IDE7CisgICAgdEFOSV9VMzIgdHhTdGFnZ2VyZWRTb3VuZGluZzogMTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIHJ4WkxGOiAxOworICAgIHRBTklfVTMyICAgICAgICAgICAgdHhaTEY6IDE7CisgICAgdEFOSV9VMzIgICAgIGltcGxpY2l0VHhCRjogMTsKKyAgICB0QU5JX1UzMiAgICAgIGNhbGlicmF0aW9uOiAyOworICAgIHRBTklfVTMyICBleHBsaWNpdENTSVR4QkY6IDE7CisgICAgdEFOSV9VMzIgZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeDogMTsKKyAgICB0QU5JX1UzMiBleHBsaWNpdEJGQ1NJRmVlZGJhY2s6IDM7CisgICAgdEFOSV9VMzIgZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrOiAzOworICAgIHRBTklfVTMyIGV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2s6IDM7CisgICAgdEFOSV9VMzIgY3NpTnVtQkZBbnRlbm5hZTogMjsKKyAgICB0QU5JX1UzMiB1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU6IDI7CisgICAgdEFOSV9VMzIgY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZTogMjsKKyAgICB0QU5JX1UzMiAgICAgICAgcmVzZXJ2ZWQ0OiA3OworICAgIHRBTklfVTggYW50ZW5uYVNlbGVjdGlvbjogMTsKKyAgICB0QU5JX1U4IGV4cGxpY2l0Q1NJRmVlZGJhY2tUeDogMTsKKyAgICB0QU5JX1U4IGFudGVubmFJbmRpY2VzRmVlZGJhY2tUeDogMTsKKyAgICB0QU5JX1U4IGV4cGxpY2l0Q1NJRmVlZGJhY2s6IDE7CisgICAgdEFOSV9VOCBhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrOiAxOworICAgIHRBTklfVTggICAgICAgICAgICAgcnhBUzogMTsKKyAgICB0QU5JX1U4ICB0eFNvdW5kaW5nUFBEVXM6IDE7CisgICAgdEFOSV9VOCAgICAgICAgcmVzZXJ2ZWQ1OiAxOworCit9IF9fYW5pX2F0dHJfcGFja2VkIHRIdENhcHM7CisKKy8qIER1cmluZyAxMWggY2hhbm5lbCBzd2l0Y2gsIHRoZSBBUCBjYW4gaW5kaWNhdGUgaWYgdGhlCisgKiBTVEEgbmVlZHMgdG8gc3RvcCB0aGUgdHJhbnNtaXNzaW9uIG9yIGNvbnRpbnVlIHVudGlsIHRoZSAKKyAqIGNoYW5uZWwtc3dpdGNoLgorICogZVNJUl9DSEFOU1dfTU9ERV9OT1JNQUwgLSBTVEEgY2FuIGNvbnRpbnVlIHRyYW5zbWlzc2lvbgorICogZVNJUl9DSEFOU1dfTU9ERV9TSUxFTlQgLSBTVEEgc2hvdWxkIHN0b3AgdHJhbnNtaXNzaW9uCisgKi8KK3R5cGVkZWYgZW51bSBlU2lyTWFjQ2hhblN3TW9kZSAKK3sKKyAgICBlU0lSX0NIQU5TV19NT0RFX05PUk1BTCA9IDAsCisgICAgZVNJUl9DSEFOU1dfTU9ERV9TSUxFTlQgPSAxCit9IHRTaXJNYWNDaGFuU3dpdGNoTW9kZTsKKworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3QgX0JhckNvbnRyb2wgeworCisjaWZuZGVmIEFOSV9CSUdfQllURV9FTkRJQU4KKworICAgIHRBTklfVTE2ICAgIGJhckFja1BvbGljeToxOworICAgIHRBTklfVTE2ICAgIG11bHRpVElEOjE7CisgICAgdEFOSV9VMTYgICAgYml0TWFwOjE7CisgICAgdEFOSV9VMTYgICAgcnN2ZDo5OworICAgIHRBTklfVTE2ICAgIG51bVRJRDo0OworCisjZWxzZQorICAgIHRBTklfVTE2ICAgIG51bVRJRDo0OworICAgIHRBTklfVTE2ICAgIHJzdmQ6OTsKKyAgICB0QU5JX1UxNiAgICBiaXRNYXA6MTsKKyAgICB0QU5JX1UxNiAgICBtdWx0aVRJRDoxOworICAgIHRBTklfVTE2ICAgIGJhckFja1BvbGljeToxOworCisjZW5kaWYKKworfV9fYW5pX2F0dHJfcGFja2VkIGJhckN0cmxUeXBlOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3QgX0JBUkZybVN0cnVjdCB7CisgICAgdFNpck1hY0ZyYW1lQ3RsICAgZmM7CisgICAgdEFOSV9VMTYgICAgICAgICAgZHVyYXRpb247CisgICAgdFNpck1hY0FkZHIgICAgICAgcnhBZGRyOworICAgIHRTaXJNYWNBZGRyICAgICAgIHR4QWRkcjsKKyAgICBiYXJDdHJsVHlwZSAgICAgICBiYXJDb250cm9sOworICAgIHRTaXJNYWNTZXFDdGwgICAgIHNzbkN0cmw7Cit9X19hbmlfYXR0cl9wYWNrZWQgQkFSRnJtVHlwZTsKKworCisjaWYgMAorLy8gVHlwZWRlZiBmb3IgSFQgQ2FwYWJpbGl0eSBJRQorLy8gVHlwZWRlZiBmb3IgSFQgQ2FwYWJpbGl0eSBJbmZvIEZpZWxkCisjZGVmaW5lIFNVUFBPUlRfQURWQU5DRV9DT0RJTkdfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5PVF9TVVBQT1JUX0FEVkFOQ0VfQ09ESU5HXzAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNVUFBPUlRfQ0hBTk5FTF9XSURUSF9TRVRfMjBfNDBfTUhaICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5PVF9TVVBQT1JUX0NIQU5ORUxfV0lEVEhfU0VUXzIwX01IWl9PTkxZICAgICAgICAgICAwCisjZGVmaW5lIERPX05PVF9TRU5EX01JTU9fU0VRX1NUQVRJQ19QT1dFUl9TQVZFICAgICAgICAgICAgICAwCisjZGVmaW5lIFJUU19QUkVDRURFX01JTU9fU0VRX0RZTl9QT1dFUl9TQVZFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JTU9fUE9XRVJfU0FWRV9OQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE5PX0xJTUlUX09OX01JTU9fU0VRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIERFVklDRV9JU19BQkxFX1RPX1JDVkVfUFBEVV9XSVRIX0dGX1BSRUFNQkxFICAgICAgICAxCisjZGVmaW5lIERFVklDRV9OT1RfQUJMRV9UT19SQ1ZFX1BQRFVfV0lUSF9HRl9QUkVBTUJMRSAgICAgICAwCisjZGVmaW5lIFNVUFBPUlRfU0hPUlRfR0lfRk9SXzIwX01IWiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5PVF9TVVBQT1JUX1NIT1JUX0dJX0ZPUl8yMF9NSFogICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNVUFBPUlRfU0hPUlRfR0lfRk9SXzQwX01IWiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5PVF9TVVBQT1JUX1NIT1JUX0dJX0ZPUl80MF9NSFogICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRSQU5TTUlUVEVSX1NVUFBPUlRfU1RCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRSQU5TTUlUVEVSX05PVF9TVVBQT1JUX1NUQkMgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJYX05PVF9TVVBQT1JUX1NUQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJYX1NVUFBPUlRfU1RCQ19PTkVfU1BBVElBTF9TVFJFQU0gICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJYX1NVUFBPUlRfU1RCQ19PTkVfQU5EX1RXT19TUEFUSUFMX1NUUkVBTSAgICAgICAgICAyCisjZGVmaW5lIFJYX1NVUFBPUlRfU1RCQ19PTkVfVFdPX1RIUkVFX1NQQVRJQUxfU1RSRUFNICAgICAgICAzCisjZGVmaW5lIFNVUFBPUlRfREVMQVlFRF9CQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5PVF9TVVBQT1JUX0RFTEFZRURfQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJFQ0VJVkVSX01BWF9BX01TRFVfU0laRV83OTM1ICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJFQ0VJVkVSX01BWF9BX01TRFVfU0laRV8zODM5ICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJTU19PUl9ERVZJQ0VfQUxMT1dfVVNFX0RTU1NfQ0NLICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJTU19PUl9ERVZJQ0VfTk9UX0FMTE9XX1VTRV9EU1NTX0NDSyAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJTU19PUl9ERVZJQ0VfU1VQUE9SVF9VU0VfUFNNUCAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJTU19PUl9ERVZJQ0VfTk9UX1NVUFBPUlRfVVNFX1BTTVAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJTU19PUl9ERVZJQ0VfU1VQUE9SVF9VU0VfU1RCQ19DT05UUk9MX0ZSQU1FICAgICAgICAxCisjZGVmaW5lIEJTU19PUl9ERVZJQ0VfTk9UX1NVUFBPUlRfVVNFX1NUQkNfQ09OVFJPTF9GUkFNRSAgICAwCisjZGVmaW5lIFNVUFBPUlRfTF9TSUdfVFhPUF9QUk9URUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5PVF9TVVBQT1JUX0xfU0lHX1RYT1BfUFJPVEVDVElPTiAgICAgICAgICAgICAgICAgICAwCisKKy8vIFR5cGVkZWYgZm9yIEhUIFBhcmFtZXRlcnMgSW5mbyBGaWVsZAorI2RlZmluZSBNQVhfUlhfQU1QRFVfRkFDVE9SXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNQVhfUlhfQU1QRFVfRkFDVE9SXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNQVhfUlhfQU1QRFVfRkFDVE9SXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfUlhfQU1QRFVfRkFDVE9SXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNUERVX0RFTlNJVFlfTk9fUkVTVFJJQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNUERVX0RFTlNJVFlfT05FX0VJR0hUSF9VU0VDT05EICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNUERVX0RFTlNJVFlfT05FX0ZPVVJUSF9VU0VDT05EICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNUERVX0RFTlNJVFlfT05FX0hBTEZfVVNFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNUERVX0RFTlNJVFlfT05FX1VTRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBNUERVX0RFTlNJVFlfVFdPX1VTRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBNUERVX0RFTlNJVFlfRk9VUl9VU0VDT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBNUERVX0RFTlNJVFlfRUlHSFRfVVNFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2VuZGlmCisKKy8vIFN1cHBvcnRlZCBNQ1Mgc2V0CisjZGVmaW5lIFNJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFNJWkVfT0ZfQkFTSUNfTUNTX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFZBTElEX01DU19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc3IC8vMC03NgorI2RlZmluZSBNQ1NfUlhfSElHSEVTVF9TVVBQT1JURURfUkFURV9CWVRFX09GRlNFVCAgICAgICAgICAxMAorLy8gVGhpcyBpcyBub3QgY2xlYXIsIENvdW50IDggYmFzZWQgZnJvbSBOViBzdXBwb3J0ZWQgTUNTIGNvdW50ICAgIAorI2RlZmluZSBWQUxJRF9NQVhfTUNTX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisKKyNpZiAwCisvLyBUeXBlZGVmIEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbyBGaWVsZAorI2RlZmluZSBTVVBQT1JUX1BDTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTk9UX1NVUFBPUlRfUENPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRSQU5TSVRJT05fVElNRV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTVEFfRE9FU19OT1RfUFJPVklERV9NQ1NfRkVFREJBQ0sgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVTRVJWRV9WQUxVRV9GT1JfU1RBX01DU19GRUVEQkFDSyAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNUQV9QUk9WSURFX1VOU09MSUNJVEVEX01DU19GRUVEQkFDSyAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTVEFfUFJPVklERV9PTl9NUlFfQU5EX1VOU09MSUNJVEVEX01DU19GRUVEQkFDSyAgICAgICAgIDMKKworLy8gVHlwZWRlZiBUcmFuc21pdCBCZWFtZm9ybWluZyBDYXBhYmlsaXR5CisjZGVmaW5lIFRYX0JFQU1GT1JNSU5HX0NBUEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWF9CRUFNRk9STUlOR19JTkNBUEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0FQQUJMRV9SRUNFSVZFX1NUQUdHRVJFRF9TT1VORElORyAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5PVF9DQVBBQkxFX1JFQ0VJVkVfU1RBR0dFUkVEX1NPVU5ESU5HICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDQVBBQkxFX1RSQU5TTUlUX1NUQUdHRVJFRF9TT1VORElORyAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTk9UX0NBUEFCTEVfVFJBTlNNSVRfU1RBR0dFUkVEX1NPVU5ESU5HICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENBUEFCTEVfUkVDRUlWRV9aTEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBOT1RfQ0FQQUJMRV9SRUNFSVZFX1pMRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0FQQUJMRV9UUkFOU01JVF9aTEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5PVF9DQVBBQkxFX1RSQU5TTUlUX1pMRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDQVBBQkxFX0lNUExJQ0lUX1RYQkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTk9UX0NBUEFCTEVfSU1QTElDSVRfVFhCRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOQ0FQQUJMRV9DQUxJQlJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMSU1JVEVEX0NBTElCUkFUSU9OX0NBTk5PVF9JTklUSUFURSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTElNSVRFRF9DQUxJQlJBVElPTl9DQU5fSU5JVElBVEUgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEZVTExUX0NBUEFCTEVfQ0FMSUJSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDQVBBQkxFX0VYUExJQ0lUX0NTSV9UWEJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5DQVBBQkxFX0VYUExJQ0lUX0NTSV9UWEJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENBUEFCTEVfRVhQTElDSVRfVU5DT01QUkVTU0VEX1NURUVSSU5HX01BVFJJWCAgICAgICAgICAgMQorI2RlZmluZSBJTkNBUEFCTEVfRVhQTElDSVRfVU5DT01QUkVTU0VEX1NURUVSSU5HX01BVFJJWCAgICAgICAgIDAKKyNkZWZpbmUgSU5DQVBBQkxFX0VYUExJQ0lUX0JGQ0lfRkVFREJBQ0sgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENBUEFCTEVfVU5TT0xJQ0lURURfQkZDSV9GRUVEQkFDSyAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDQVBBQkxFX0lNTUVESUFURV9CRkNJX0ZFRURCQUNLICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ0FQQUJMRV9BR0dSRUdBVEVfQkZDSV9GRUVEQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElOQ0FQQUJMRV9FWFBMSUNJVF9VTkNPTVBSRVNTRURfU1RFRVJJTkdfTUFUUklYX0ZFRURCQUMgMAorI2RlZmluZSBDQVBBQkxFX1VOU09MSUNJVEVEX1VOQ09NUFJFU1NFRF9TVEVFUklOR19NQVRSSVggICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJMRV9JTU1FRElBVEVfVU5DT01QUkVTU0VEX1NURUVSSU5HX01BVFJJWCAgICAgICAgICAyCisjZGVmaW5lIENBUEFCTEVfQUdHUkVHQVRFRF9VTkNPTVBSRVNTRURfU1RFRVJJTkdfTUFUUklYICAgICAgICAgNAorI2RlZmluZSBJTkNBUEFCTEVfRVhQTElDSVRfQ09NUFJFU1NFRF9TVEVFUklOR19NQVRSSVhfRkVFREJBQyAgIDAKKyNkZWZpbmUgQ0FQQUJMRV9VTlNPTElDSVRFRF9DT01QUkVTU0VEX1NURUVSSU5HX01BVFJJWCAgICAgICAgICAxCisjZGVmaW5lIENBUEFCTEVfSU1NRURJQVRFX0NPTVBSRVNTRURfU1RFRVJJTkdfTUFUUklYICAgICAgICAgICAgMgorI2RlZmluZSBDQVBBQkxFX0FHR1JFR0FURURfQ09NUFJFU1NFRF9TVEVFUklOR19NQVRSSVggICAgICAgICAgIDQKKyNkZWZpbmUgU1VQUE9SVF9DU0lfQkVBTUZPUk1JTkdfU0lOR0xFX1RYX0FOVEVOTkFfU09VTkRJTkcgICAgICAwCisjZGVmaW5lIFNVUFBPUlRfQ1NJX0JFQU1GT1JNSU5HXzJfVFhfQU5URU5OQV9TT1VORElORyAgICAgICAgICAgMQorI2RlZmluZSBTVVBQT1JUX0NTSV9CRUFNRk9STUlOR18zX1RYX0FOVEVOTkFfU09VTkRJTkcgICAgICAgICAgIDIKKyNkZWZpbmUgU1VQUE9SVF9DU0lfQkVBTUZPUk1JTkdfNF9UWF9BTlRFTk5BX1NPVU5ESU5HICAgICAgICAgICAzCisjZGVmaW5lIFNVUFBPUlRfVU5DT01QUkVTU0VEX1NURUVSSU5HX01BVFJJWF8xX1RYX0FOVEVOTkFfU09VTkRJTkcgIDAKKyNkZWZpbmUgU1VQUE9SVF9VTkNPTVBSRVNTRURfU1RFRVJJTkdfTUFUUklYXzJfVFhfQU5URU5OQV9TT1VORElORyAgMQorI2RlZmluZSBTVVBQT1JUX1VOQ09NUFJFU1NFRF9TVEVFUklOR19NQVRSSVhfM19UWF9BTlRFTk5BX1NPVU5ESU5HICAyCisjZGVmaW5lIFNVUFBPUlRfVU5DT01QUkVTU0VEX1NURUVSSU5HX01BVFJJWF80X1RYX0FOVEVOTkFfU09VTkRJTkcgIDMKKyNkZWZpbmUgU1VQUE9SVF9DT01QUkVTU0VEX1NURUVSSU5HX01BVFJJWF8xX1RYX0FOVEVOTkFfU09VTkRJTkcgIDAKKyNkZWZpbmUgU1VQUE9SVF9DT01QUkVTU0VEX1NURUVSSU5HX01BVFJJWF8yX1RYX0FOVEVOTkFfU09VTkRJTkcgIDEKKyNkZWZpbmUgU1VQUE9SVF9DT01QUkVTU0VEX1NURUVSSU5HX01BVFJJWF8zX1RYX0FOVEVOTkFfU09VTkRJTkcgIDIKKyNkZWZpbmUgU1VQUE9SVF9DT01QUkVTU0VEX1NURUVSSU5HX01BVFJJWF80X1RYX0FOVEVOTkFfU09VTkRJTkcgIDMKKworLy8gVHlwZWRlZiBBbnRlbm5hIFNlbGVjdGlvbiBDYXBhYmlsaXR5CisjZGVmaW5lIENBUEFCTEVfQU5URU5OQV9TRUxFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTkNBUEFCTEVfQU5URU5OQV9TRUxFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0FQQUJMRV9FWFBMSUNJVF9DU0lfRkVFREJBQ0tfQkFTRURfVFhfQVMgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOQ0FQQUJMRV9FWFBMSUNJVF9DU0lfRkVFREJBQ0tfQkFTRURfVFhfQVMgICAgICAgICAgICAgMAorI2RlZmluZSBDQVBBQkxFX0FOVEVOTkFfSU5ESUNFU19GRUVEQkFDS19CQVNFRF9UWF9BUyAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5DQVBBQkxFX0FOVEVOTkFfSU5ESUNFU19GRUVEQkFDS19CQVNFRF9UWF9BUyAgICAgICAgICAwCisjZGVmaW5lIENBUEFCTEVfRVhQTElDSVRfQ1NJX0ZFRURCQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTkNBUEFCTEVfRVhQTElDSVRfQ1NJX0ZFRURCQUNLICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0FQQUJMRV9BTlRFTk5BX0lORElDRVNfRkVFREJBQ0tfQkFTRURfVFhfQVMgICAgICAgICAgICAxCisjZGVmaW5lIElOQ0FQQUJMRV9BTlRFTk5BX0lORElDRVNfRkVFREJBQ0tfQkFTRURfVFhfQVMgICAgICAgICAgMAorI2RlZmluZSBDQVBBQkxFX1JYX0FTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5DQVBBQkxFX1JYX0FTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENBUEFCTEVfVFJBTlNNSVRfU09VTkRJTkdfUFBEVSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTkNBUEFCTEVfVFJBTlNNSVRfU09VTkRJTkdfUFBEVSAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLy8gVHlwZWRlZiBBZGRpdGlvbmFsIEhUIEluZm9tYXRpb24gRWxlbWVudHMKKyNkZWZpbmUgQ09OVFJPTF9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgT0ZGU0VUX05PX0VYVEVOU0lPTl9DSEFOTkVMX0lTX1BSRVNFTlQgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE9GRlNFVF9FWFRFTlNJT05fQ0hBTk5FTF9BQk9WRV9DT05UUk9MX0NIQU5ORUwgICAgICAgICAgMQorI2RlZmluZSBPRkZTRVRfRVhURU5TSU9OX0NIQU5ORUxfQkVMT1dfQ09OVFJPTF9DSEFOTkVMICAgICAgICAgIDMKKyNkZWZpbmUgVVNFXzIwX01IWl9DT05UUk9MX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFVTRV9BTllfU1VQUE9SVEVEX0NIQU5ORUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBVU0VfUklGU19NT0RFX1BST0hJQklURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVVNFX1JJRlNfTU9ERV9QRVJNSVRURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENPTlRST0xMRURfQUNDRVNTX05PVF9PTkxZX1BTTVAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDT05UUk9MTEVEX0FDQ0VTU19PTkxZX1BTTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0VSVklDRV9JTlRFUlZBTF9HUkFOVUxBUklUWV81TVMgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNFUlZJQ0VfSU5URVJWQUxfR1JBTlVMQVJJVFlfMTBNUyAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTRVJWSUNFX0lOVEVSVkFMX0dSQU5VTEFSSVRZXzE1TVMgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU0VSVklDRV9JTlRFUlZBTF9HUkFOVUxBUklUWV8yME1TICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFNFUlZJQ0VfSU5URVJWQUxfR1JBTlVMQVJJVFlfMjVNUyAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBTRVJWSUNFX0lOVEVSVkFMX0dSQU5VTEFSSVRZXzMwTVMgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgU0VSVklDRV9JTlRFUlZBTF9HUkFOVUxBUklUWV8zNU1TICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFNFUlZJQ0VfSU5URVJWQUxfR1JBTlVMQVJJVFlfNDBNUyAgICAgICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIE9QRVJBVElPTl9NT0RFX1BVUkVfTk9fUFJPVEVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBPUEVSQVRJT05fTU9ERV9PUFRJT05BTF9QUk9URUNUSU9OICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgT1BFUkFUSU9OX01PREVfTk9fTEVHQUNZX1NUQV80ME1IWl9QUk9URUNURUQgICAgICAgICAgICAyCisjZGVmaW5lIE9QRVJBVElPTl9NT0RFX01JWEVEX1BST1RFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIERVQUxfQ1RTX1BST1RFQ1RJT05fSVNfVVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSRUdVTEFSX1JUU19DVFNfSVNfVVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0VDT05EQVJZX0JFQUNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBSSU1BUllfQkVBQ09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMU0lHX1RYT1BfUFJPVEVDVElPTl9GVUxMX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTFNJR19UWE9QX1BST1RFQ1RJT05fTk9UX0ZVTExfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBDT19JU19BQ1RJVkFURURfSU5fQlNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQ09fSVNfTk9UX0FDVElWQVRFRF9JTl9CU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUENPX1BIQVNFX1JFUVVFU1RfU1dJVENIX0tFRVBfVE9fMjBNSFogICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBDT19QSEFTRV9SRVFVRVNUX1NXSVRDSF9LRUVQX1RPXzQwTUhaICAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8vCisvLyBUaGUgZm9sbG93aW5nIGVudW1zIHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlICJjdXJyZW50IiBIVCBDYXBhYmlsaXRpZXMgb2YKKy8vIHRoZSBsb2NhbCBTVEEgaW4gYSBnZW5lcmljIGZhc2hpb24uIEluIG90aGVyIHdvcmRzLCB0aGUgZm9sbG93aW5nIGVudW1zCisvLyBpZGVudGlmeSB0aGUgSFQgY2FwYWJpbGl0aWVzIHRoYXQgY2FuIGJlIHF1ZXJpZWQgb3Igc2V0LgorLy8KK3R5cGVkZWYgZW51bSBlSFRDYXBhYmlsaXR5Cit7CisgIGVIVF9MU0lHX1RYT1BfUFJPVEVDVElPTiwKKyAgZUhUX1NUQkNfQ09OVFJPTF9GUkFNRSwKKyAgZUhUX1BTTVAsCisgIGVIVF9EU1NTX0NDS19NT0RFXzQwTUhaLAorICBlSFRfTUFYX0FNU0RVX0xFTkdUSCwKKyAgZUhUX0RFTEFZRURfQkEsCisgIGVIVF9SWF9TVEJDLAorICBlSFRfVFhfU1RCQywKKyAgZUhUX1NIT1JUX0dJXzQwTUhaLAorICBlSFRfU0hPUlRfR0lfMjBNSFosCisgIGVIVF9HUkVFTkZJRUxELAorICBlSFRfTUlNT19QT1dFUl9TQVZFLAorICBlSFRfU1VQUE9SVEVEX0NIQU5ORUxfV0lEVEhfU0VULAorICBlSFRfQURWQU5DRURfQ09ESU5HLAorICBlSFRfTUFYX1JYX0FNUERVX0ZBQ1RPUiwKKyAgZUhUX01QRFVfREVOU0lUWSwKKyAgZUhUX1BDTywKKyAgZUhUX1RSQU5TSVRJT05fVElNRSwKKyAgZUhUX01DU19GRUVEQkFDSywKKyAgZUhUX1RYX0JFQU1GT1JNSU5HLAorICBlSFRfQU5URU5OQV9TRUxFQ1RJT04sCisgIC8vIFRoZSBmb2xsb3dpbmcgY29tZSB1bmRlciBBZGRpdGlvbmFsIEhUIENhcGFiaWxpdGllcworICBlSFRfU0lfR1JBTlVMQVJJVFksCisgIGVIVF9DT05UUk9MTEVEX0FDQ0VTUywKKyAgZUhUX1JJRlNfTU9ERSwKKyAgZUhUX1JFQ09NTUVOREVEX1RYX1dJRFRIX1NFVCwKKyAgZUhUX0VYVEVOU0lPTl9DSEFOTkVMX09GRlNFVCwKKyAgZUhUX09QX01PREUsCisgIGVIVF9CQVNJQ19TVEJDX01DUywKKyAgZUhUX0RVQUxfQ1RTX1BST1RFQ1RJT04sCisgIGVIVF9MU0lHX1RYT1BfUFJPVEVDVElPTl9GVUxMX1NVUFBPUlQsCisgIGVIVF9QQ09fQUNUSVZFLAorICBlSFRfUENPX1BIQVNFCit9IHRIVENhcGFiaWxpdHk7CisKKy8vIEhUIENhcGFiaWxpdGllcyBJbmZvCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY0hUQ2FwYWJpbGl0eUluZm8KK3sKKyNpZm5kZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisgIHRBTklfVTE2ICBsc2lnVFhPUFByb3RlY3Rpb246MTsgLy8gRHluYW1pYyBzdGF0ZQorICB0QU5JX1UxNiAgc3RiY0NvbnRyb2xGcmFtZToxOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UxNiAgcHNtcDoxOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UxNiAgZHNzc0Nja01vZGU0ME1IejoxOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UxNiAgbWF4aW1hbEFNU0RVc2l6ZToxOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UxNiAgZGVsYXllZEJBOjE7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTE2ICByeFNUQkM6MjsgLy8gU3RhdGljIHZpYSBDRkcKKyAgdEFOSV9VMTYgIHR4U1RCQzoxOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UxNiAgc2hvcnRHSTQwTUh6OjE7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTE2ICBzaG9ydEdJMjBNSHo6MTsgLy8gU3RhdGljIHZpYSBDRkcKKyAgdEFOSV9VMTYgIGdyZWVuRmllbGQ6MTsgLy8gU3RhdGljIHZpYSBDRkcKKyAgdEFOSV9VMTYgIG1pbW9Qb3dlclNhdmU6MjsgLy8gRHluYW1pYyBzdGF0ZQorICB0QU5JX1UxNiAgc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OjE7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTE2ICBhZHZDb2RpbmdDYXA6MTsgLy8gU3RhdGljIHZpYSBDRkcKKyNlbHNlCisgIHRBTklfVTE2ICBhZHZDb2RpbmdDYXA6MTsKKyAgdEFOSV9VMTYgIHN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDoxOworICB0QU5JX1UxNiAgbWltb1Bvd2VyU2F2ZToyOworICB0QU5JX1UxNiAgZ3JlZW5GaWVsZDoxOworICB0QU5JX1UxNiAgc2hvcnRHSTIwTUh6OjE7CisgIHRBTklfVTE2ICBzaG9ydEdJNDBNSHo6MTsKKyAgdEFOSV9VMTYgIHR4U1RCQzoxOworICB0QU5JX1UxNiAgcnhTVEJDOjI7CisgIHRBTklfVTE2ICBkZWxheWVkQkE6MTsKKyAgdEFOSV9VMTYgIG1heGltYWxBTVNEVXNpemU6MTsKKyAgdEFOSV9VMTYgIGRzc3NDY2tNb2RlNDBNSHo6MTsKKyAgdEFOSV9VMTYgIHBzbXA6MTsKKyAgdEFOSV9VMTYgIHN0YmNDb250cm9sRnJhbWU6MTsKKyAgdEFOSV9VMTYgIGxzaWdUWE9QUHJvdGVjdGlvbjoxOworI2VuZGlmCit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNIVENhcGFiaWxpdHlJbmZvOworCisvLyBIVCBQYXJhbWV0ZXJzIEluZm8KK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjSFRQYXJhbWV0ZXJzSW5mbworeworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgdEFOSV9VOCAgcmVzZXJ2ZWQ6MzsKKyAgdEFOSV9VOCAgbXBkdURlbnNpdHk6MzsgLy8gRHluYW1pYyBzdGF0ZQorICB0QU5JX1U4ICBtYXhSeEFNUERVRmFjdG9yOjI7IC8vIER5bmFtaWMgc3RhdGUKKyNlbHNlCisgIHRBTklfVTggIG1heFJ4QU1QRFVGYWN0b3I6MjsKKyAgdEFOSV9VOCAgbXBkdURlbnNpdHk6MzsKKyAgdEFOSV9VOCAgcmVzZXJ2ZWQ6MzsKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjSFRQYXJhbWV0ZXJzSW5mbzsKKworLy8gRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm8KK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjRXh0ZW5kZWRIVENhcGFiaWxpdHlJbmZvCit7CisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorICB0QU5JX1UxNiAgcmVzZXJ2ZWQyOjY7CisgIHRBTklfVTE2ICBtY3NGZWVkYmFjazoyOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UxNiAgcmVzZXJ2ZWQxOjU7CisgIHRBTklfVTE2ICB0cmFuc2l0aW9uVGltZToyOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UxNiAgcGNvOjE7IC8vIFN0YXRpYyB2aWEgQ0ZHCisjZWxzZQorICB0QU5JX1UxNiAgcGNvOjE7CisgIHRBTklfVTE2ICB0cmFuc2l0aW9uVGltZToyOworICB0QU5JX1UxNiAgcmVzZXJ2ZWQxOjU7CisgIHRBTklfVTE2ICBtY3NGZWVkYmFjazoyOworICB0QU5JX1UxNiAgcmVzZXJ2ZWQyOjY7CisjZW5kaWYKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY0V4dGVuZGVkSFRDYXBhYmlsaXR5SW5mbzsKKworLy9JRUVFIDgwMi4xMW4vRDcuMCAtIDcuMy4yLjU3LjQKKy8vUGFydCBvZiB0aGUgInN1cHBvcnRlZCBNQ1Mgc2V0IGZpZWxkIgordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNSeEhpZ2hlc3RTdXBwb3J0UmF0ZQoreworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgICB0QU5JX1UxNiByZXNlcnZlZCA6IDY7CisgICAgdEFOSV9VMTYgcmF0ZSA6IDEwOworI2Vsc2UKKyAgICB0QU5JX1UxNiByYXRlIDogMTA7CisgICAgdEFOSV9VMTYgcmVzZXJ2ZWQgOiA2OworI2VuZGlmCit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNSeEhpZ2hlc3RTdXBwb3J0UmF0ZSwgKnRwU2lyTWFjUnhIaWdoZXN0U3VwcG9ydFJhdGU7CisKKworLy8gVHJhbnNtaXQgQmVhbSBGb3JtaW5nIENhcGFiaWxpdGllcyBJbmZvCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1R4QkZDYXBhYmlsaXR5SW5mbworeworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgdEFOSV9VMzIgIHJlc2VydmVkOjc7CisgIHRBTklfVTMyICBjb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlOjI7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTMyICB1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU6MjsgLy8gU3RhdGljIHZpYSBDRkcKKyAgdEFOSV9VMzIgIGNzaU51bUJGQW50ZW5uYWU6MjsgLy8gU3RhdGljIHZpYSBDRkcKKyAgdEFOSV9VMzIgIGV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2s6MzsgLy8gU3RhdGljIHZpYSBDRkcKKyAgdEFOSV9VMzIgIGV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjazozOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UzMiAgZXhwbGljaXRCRkNTSUZlZWRiYWNrOjM7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTMyICBleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4OjE7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTMyICBleHBsaWNpdENTSVR4QkY6MTsgLy8gU3RhdGljIHZpYSBDRkcKKyAgdEFOSV9VMzIgIGNhbGlicmF0aW9uOjI7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTMyICBpbXBsaWNpdFR4QkY6MTsgLy8gU3RhdGljIHZpYSBDRkcKKyAgdEFOSV9VMzIgIHR4WkxGOjE7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTMyICByeFpMRjoxOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UzMiAgdHhTdGFnZ2VyZWRTb3VuZGluZzoxOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UzMiAgcnhTdGFnZ2VyZWRTb3VuZGluZzoxOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1UzMiAgdHhCRjoxOyAvLyBTdGF0aWMgdmlhIENGRworI2Vsc2UKKyAgdEFOSV9VMzIgIHR4QkY6MTsKKyAgdEFOSV9VMzIgIHJ4U3RhZ2dlcmVkU291bmRpbmc6MTsKKyAgdEFOSV9VMzIgIHR4U3RhZ2dlcmVkU291bmRpbmc6MTsKKyAgdEFOSV9VMzIgIHJ4WkxGOjE7CisgIHRBTklfVTMyICB0eFpMRjoxOworICB0QU5JX1UzMiAgaW1wbGljaXRUeEJGOjE7CisgIHRBTklfVTMyICBjYWxpYnJhdGlvbjoyOworICB0QU5JX1UzMiAgZXhwbGljaXRDU0lUeEJGOjE7CisgIHRBTklfVTMyICBleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4OjE7CisgIHRBTklfVTMyICBleHBsaWNpdEJGQ1NJRmVlZGJhY2s6MzsKKyAgdEFOSV9VMzIgIGV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjazozOworICB0QU5JX1UzMiAgZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjazozOworICB0QU5JX1UzMiAgY3NpTnVtQkZBbnRlbm5hZToyOworICB0QU5JX1UzMiAgdW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlOjI7CisgIHRBTklfVTMyICBjb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlOjI7CisgIHRBTklfVTMyICByZXNlcnZlZDo3OworI2VuZGlmCit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNUeEJGQ2FwYWJpbGl0eUluZm87CisKKy8vIEFudGVubmEgU2VsZWN0aW9uIENhcGFiaWxpdHkgSW5mbwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNBU0NhcGFiaWxpdHlJbmZvCit7CisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorICB0QU5JX1U4ICByZXNlcnZlZDI6MTsKKyAgdEFOSV9VOCAgdHhTb3VuZGluZ1BQRFVzOjE7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTggIHJ4QVM6MTsgLy8gU3RhdGljIHZpYSBDRkcKKyAgdEFOSV9VOCAgYW50ZW5uYUluZGljZXNGZWVkYmFjazoxOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1U4ICBleHBsaWNpdENTSUZlZWRiYWNrOjE7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTggIGFudGVubmFJbmRpY2VzRmVlZGJhY2tUeDoxOyAvLyBTdGF0aWMgdmlhIENGRworICB0QU5JX1U4ICBleHBsaWNpdENTSUZlZWRiYWNrVHg6MTsgLy8gU3RhdGljIHZpYSBDRkcKKyAgdEFOSV9VOCAgYW50ZW5uYVNlbGVjdGlvbjoxOyAvLyBTdGF0aWMgdmlhIENGRworI2Vsc2UKKyAgdEFOSV9VOCAgYW50ZW5uYVNlbGVjdGlvbjoxOworICB0QU5JX1U4ICBleHBsaWNpdENTSUZlZWRiYWNrVHg6MTsKKyAgdEFOSV9VOCAgYW50ZW5uYUluZGljZXNGZWVkYmFja1R4OjE7CisgIHRBTklfVTggIGV4cGxpY2l0Q1NJRmVlZGJhY2s6MTsKKyAgdEFOSV9VOCAgYW50ZW5uYUluZGljZXNGZWVkYmFjazoxOworICB0QU5JX1U4ICByeEFTOjE7CisgIHRBTklfVTggIHR4U291bmRpbmdQUERVczoxOworICB0QU5JX1U4ICByZXNlcnZlZDI6MTsKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjQVNDYXBhYmlsaXR5SW5mbzsKKworLy8gQWRkaXRpb25hbCBIVCBJRSBGaWVsZDEKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjSFRJbmZvRmllbGQxCit7CisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorICB0QU5JX1U4ICBzZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eTozOyAvLyBEeW5hbWljIHN0YXRlCisgIHRBTklfVTggIGNvbnRyb2xsZWRBY2Nlc3NPbmx5OjE7IC8vIFN0YXRpYyB2aWEgQ0ZHCisgIHRBTklfVTggIHJpZnNNb2RlOjE7IC8vIER5bmFtaWMgc3RhdGUKKyAgdEFOSV9VOCAgcmVjb21tZW5kZWRUeFdpZHRoU2V0OjE7IC8vIER5bmFtaWMgc3RhdGUKKyAgdEFOSV9VOCAgc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDoyOyAvLyBEeW5hbWljIHN0YXRlCisjZWxzZQorICB0QU5JX1U4ICBzZWNvbmRhcnlDaGFubmVsT2Zmc2V0OjI7CisgIHRBTklfVTggIHJlY29tbWVuZGVkVHhXaWR0aFNldDoxOworICB0QU5JX1U4ICByaWZzTW9kZToxOworICB0QU5JX1U4ICBjb250cm9sbGVkQWNjZXNzT25seToxOworICB0QU5JX1U4ICBzZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eTozOworI2VuZGlmCit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNIVEluZm9GaWVsZDE7CisKKy8vIEFkZGl0aW9uYWwgSFQgSUUgRmllbGQyCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY0hUSW5mb0ZpZWxkMgoreworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgdEFOSV9VMTYgIHJlc2VydmVkOjExOworICB0QU5JX1UxNiAgb2Jzc05vbkhUU3RhUHJlc2VudDoxOyAgLyphZGRlZCBmb3IgT2JzcyAgKi8KKyAgdEFOSV9VMTYgIHRyYW5zbWl0QnVyc3RMaW1pdDogMTsKKyAgdEFOSV9VMTYgIG5vbkdGRGV2aWNlc1ByZXNlbnQ6MTsKKyAgdEFOSV9VMTYgIG9wTW9kZToyOyAvLyBEeW5hbWljIHN0YXRlCisjZWxzZQorICB0QU5JX1UxNiAgb3BNb2RlOjI7CisgIHRBTklfVTE2ICBub25HRkRldmljZXNQcmVzZW50OjE7CisgIHRBTklfVTE2ICB0cmFuc21pdEJ1cnN0TGltaXQ6IDE7CisgIHRBTklfVTE2ICBvYnNzTm9uSFRTdGFQcmVzZW50OjE7ICAvKmFkZGVkIGZvciBPYnNzICAqLworICB0QU5JX1UxNiAgcmVzZXJ2ZWQ6MTE7CisjZW5kaWYKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY0hUSW5mb0ZpZWxkMjsKKworLy8gQWRkaXRpb25hbCBIVCBJRSBGaWVsZDMKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjSFRJbmZvRmllbGQzCit7CisjaWZuZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorICB0QU5JX1UxNiAgcmVzZXJ2ZWQ6NDsKKyAgdEFOSV9VMTYgIHBjb1BoYXNlOjE7IC8vIER5bmFtaWMgc3RhdGUKKyAgdEFOSV9VMTYgIHBjb0FjdGl2ZToxOyAvLyBEeW5hbWljIHN0YXRlCisgIHRBTklfVTE2ICBsc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDoxOyAvLyBEeW5hbWljIHN0YXRlCisgIHRBTklfVTE2ICBzZWNvbmRhcnlCZWFjb246MTsgLy8gRHluYW1pYyBzdGF0ZQorICB0QU5JX1UxNiAgZHVhbENUU1Byb3RlY3Rpb246MTsgLy8gRHluYW1pYyBzdGF0ZQorICB0QU5JX1UxNiAgYmFzaWNTVEJDTUNTOjc7IC8vIER5bmFtaWMgc3RhdGUKKyNlbHNlCisgIHRBTklfVTE2ICBiYXNpY1NUQkNNQ1M6NzsKKyAgdEFOSV9VMTYgIGR1YWxDVFNQcm90ZWN0aW9uOjE7CisgIHRBTklfVTE2ICBzZWNvbmRhcnlCZWFjb246MTsKKyAgdEFOSV9VMTYgIGxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OjE7CisgIHRBTklfVTE2ICBwY29BY3RpdmU6MTsKKyAgdEFOSV9VMTYgIHBjb1BoYXNlOjE7CisgIHRBTklfVTE2ICByZXNlcnZlZDo0OworI2VuZGlmCit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNIVEluZm9GaWVsZDM7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjUHJvYmVSZXFGcmFtZQoreworICAgIHRTaXJNYWNTU2lkSUUgICAgICBzc0lkSUU7CisgICAgdFNpck1hY1JhdGVTZXRJRSAgIHJhdGVTZXRJRTsKKyAgICB0U2lyTWFjUmF0ZVNldElFICAgICAgICAgZXh0ZW5kZWRSYXRlU2V0SUU7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNQcm9iZVJlcUZyYW1lLCAqdHBTaXJNYWNQcm9iZVJlcUZyYW1lOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1Byb2JlUnNwRnJhbWUKK3sKKyAgICB0U2lyTWFjVGltZVN0YW1wICAgICAgICAgdHM7CisgICAgdFNpck1hY0JlYWNvbkludGVydmFsICAgIGJlYWNvbkludGVydmFsOworICAgIHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAgICBjYXBhYmlsaXR5SW5mbzsKKyAgICB0U2lyTWFjU1NpZElFICAgICAgICAgICAgc3NJZElFOworICAgIHRTaXJNYWNSYXRlU2V0SUUgICAgICAgICByYXRlU2V0SUU7CisgICAgdFNpck1hY1JhdGVTZXRJRSAgICAgICAgIGV4dGVuZGVkUmF0ZVNldElFOworICAgIHRTaXJNYWNOb25FcnBQcmVzZW50SUUgICBub25FcnBQcmVzZW50OworICAgIHRTaXJNYWNEc1BhcmFtU2V0SUUgICAgICBkc1BhcmFtc0lFOworICAgIHRTaXJNYWNDZlBhcmFtU2V0SUUgICAgICBjZlBhcmFtc0lFOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjUHJvYmVSc3BGcmFtZSwgKnRwU2lyTWFjUHJvYmVSc3BGcmFtZTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNBdXRoRnJhbWVCb2R5Cit7CisgICAgdEFOSV9VMTYgICAgIGF1dGhBbGdvTnVtYmVyOworICAgIHRBTklfVTE2ICAgICBhdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXI7CisgICAgdEFOSV9VMTYgICAgIGF1dGhTdGF0dXNDb2RlOworICAgIHRBTklfVTggICAgICB0eXBlOyAgIC8vID0gU0lSX01BQ19DSEFMTEVOR0VfVEVYVF9FSUQKKyAgICB0QU5JX1U4ICAgICAgbGVuZ3RoOyAvLyA9IFNJUl9NQUNfQVVUSF9DSEFMTEVOR0VfTEVOR1RICisgICAgdEFOSV9VOCAgICAgIGNoYWxsZW5nZVRleHRbU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9MRU5HVEhdOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjQXV0aEZyYW1lQm9keSwgKnRwU2lyTWFjQXV0aEZyYW1lQm9keTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNBdXRoZW50aWNhdGlvbkZyYW1lCit7CisgICAgdFNpck1hY0F1dGhGcmFtZUJvZHkgIGF1dGhGcmFtZUJvZHk7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNBdXRoRnJhbWUsICp0cFNpck1hY0F1dGhGcmFtZTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNBc3NvY1JlcUZyYW1lCit7CisgICAgdFNpck1hY0NhcGFiaWxpdHlJbmZvICAgIGNhcGFiaWxpdHlJbmZvOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbkludGVydmFsOworICAgIHRTaXJNYWNTU2lkSUUgICAgICAgICAgICBzc0lkSUU7CisgICAgdFNpck1hY1JhdGVTZXRJRSAgICAgICAgIHJhdGVTZXRJRTsKKyAgICB0U2lyTWFjUmF0ZVNldElFICAgICAgICAgZXh0ZW5kZWRSYXRlU2V0SUU7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNBc3NvY1JlcUZyYW1lLCAqdHBTaXJNYWNBc3NvY1JlcUZyYW1lOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY0Fzc29jUnNwRnJhbWUKK3sKKyAgICB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gICAgY2FwYWJpbGl0eUluZm87CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgICBhaWQ7CisgICAgdFNpck1hY1JhdGVTZXRJRSAgICAgICAgIHN1cHBvcnRlZFJhdGVzOworICAgIHRTaXJNYWNSYXRlU2V0SUUgICAgICAgICBleHRlbmRlZFJhdGVTZXRJRTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY0Fzc29jUnNwRnJhbWUsICp0cFNpck1hY0Fzc29jUnNwRnJhbWU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjRGlzYXNzb2NGcmFtZQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHJlYXNvbkNvZGU7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNEaXNhc3NvY0ZyYW1lLCAqdHBTaXJNYWNEaXNhc3NvY0ZyYW1lOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc0RTaXJNYWNEZWF1dGhGcmFtZQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHJlYXNvbkNvZGU7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNEZWF1dGhGcmFtZSwgKnRwU2lyTWFjRGVhdXRoRnJhbWU7CisKKy8vLyBDb21tb24gaGVhZGVyIGZvciBhbGwgYWN0aW9uIGZyYW1lcwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNBY3Rpb25GcmFtZUhkcgoreworICAgIHRBTklfVTggICAgY2F0ZWdvcnk7CisgICAgdEFOSV9VOCAgICBhY3Rpb25JRDsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY0FjdGlvbkZyYW1lSGRyLCAqdHBTaXJNYWNBY3Rpb25GcmFtZUhkcjsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1AyUAordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNWZW5kb3JTcGVjaWZpY1B1YmxpY0FjdGlvbkZyYW1lSGRyCit7CisgICAgdEFOSV9VOCAgICBjYXRlZ29yeTsKKyAgICB0QU5JX1U4ICAgIGFjdGlvbklEOworICAgIHRBTklfVTggICAgT3VpWzRdOworICAgIHRBTklfVTggICAgT3VpU3ViVHlwZTsKKyAgICB0QU5JX1U4ICAgIGRpYWxvZ1Rva2VuOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjVmVuZG9yU3BlY2lmaWNQdWJsaWNBY3Rpb25GcmFtZUhkciwgKnRwU2lyTWFjVmVuZG9yU3BlY2lmaWNQdWJsaWNBY3Rpb25GcmFtZUhkcjsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNQMlBBY3Rpb25GcmFtZUhkcgoreworICAgIHRBTklfVTggICAgY2F0ZWdvcnk7CisgICAgdEFOSV9VOCAgICBPdWlbNF07CisgICAgdEFOSV9VOCAgICBPdWlTdWJUeXBlOworICAgIHRBTklfVTggICAgZGlhbG9nVG9rZW47Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNQMlBBY3Rpb25GcmFtZUhkciwgKnRwU2lyTWFjUDJQQWN0aW9uRnJhbWVIZHI7CisKKworI2VuZGlmCisKK3R5cGVkZWYgIHN0cnVjdCBzU2lyTWFjTWVhc0FjdGlvbkZyYW1lSGRyCit7CisgICAgdEFOSV9VOCAgICBjYXRlZ29yeTsKKyAgICB0QU5JX1U4ICAgIGFjdGlvbklEOworICAgIHRBTklfVTggICAgZGlhbG9nVG9rZW47Cit9IHRTaXJNYWNNZWFzQWN0aW9uRnJhbWVIZHIsICp0cFNpck1hY01lYXNBY3Rpb25GcmFtZUhkcjsKKworCisjaWZkZWYgQU5JX1NVUFBPUlRfMTFICit0eXBlZGVmICBzdHJ1Y3Qgc1Npck1hY1RwY1JlcUFjdGlvbkZyYW1lCit7CisgICAgdFNpck1hY01lYXNBY3Rpb25GcmFtZUhkciAgIGFjdGlvbkhlYWRlcjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKK30gdFNpck1hY1RwY1JlcUFjdGlvbkZyYW1lLCAqdHBTaXJNYWNUcGNSZXFBY3Rpb25GcmFtZTsKKwordHlwZWRlZiAgc3RydWN0IHNTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUKK3sKKyAgICB0U2lyTWFjTWVhc0FjdGlvbkZyYW1lSGRyICAgYWN0aW9uSGVhZGVyOworICAgIHRTaXJNYWNNZWFzUmVxSUUgICAgICAgICAgICBtZWFzUmVxSUU7Cit9IHRTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUsICp0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZTsKKyNlbmRpZgorCit0eXBlZGVmICBzdHJ1Y3Qgc1Npck1hY0Jhc2ljTWVhc1JlcG9ydEFjdGlvbkZyYW1lCit7CisgICAgdFNpck1hY01lYXNBY3Rpb25GcmFtZUhkciAgIGFjdGlvbkhlYWRlcjsKKyAgICB0U2lyTWFjQmFzaWNSZXBvcnRJRSAgICAgICAgbWVhc1JlcG9ydElFOworfSB0U2lyTWFjQmFzaWNNZWFzUmVwb3J0QWN0aW9uRnJhbWUsICp0cFNpck1hY0Jhc2ljTWVhc1JlcG9ydEFjdGlvbkZyYW1lOworCit0eXBlZGVmICBzdHJ1Y3Qgc1Npck1hY0NjYU1lYXNSZXBvcnRBY3Rpb25GcmFtZQoreworICAgIHRTaXJNYWNNZWFzQWN0aW9uRnJhbWVIZHIgICBhY3Rpb25IZWFkZXI7CisgICAgdFNpck1hY0NjYVJlcG9ydElFICAgICAgICAgIG1lYXNSZXBvcnRJRTsKK30gdFNpck1hY0NjYU1lYXNSZXBvcnRBY3Rpb25GcmFtZSwgKnRwU2lyTWFjQ2NhTWVhc1JlcG9ydEFjdGlvbkZyYW1lOworCit0eXBlZGVmICBzdHJ1Y3Qgc1Npck1hY1JwaU1lYXNSZXBvcnRBY3Rpb25GcmFtZQoreworICAgIHRTaXJNYWNNZWFzQWN0aW9uRnJhbWVIZHIgICBhY3Rpb25IZWFkZXI7CisgICAgdFNpck1hY1JwaVJlcG9ydElFICAgICAgICAgIG1lYXNSZXBvcnRJRTsKK30gdFNpck1hY1JwaU1lYXNSZXBvcnRBY3Rpb25GcmFtZSwgKnRwU2lyTWFjUnBpTWVhc1JlcG9ydEFjdGlvbkZyYW1lOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNOZWlnaGJvclJlcG9ydFJlcQoreworICAgdEFOSV9VOCBkaWFsb2dUb2tlbjsKKyAgIHRBTklfVTggc3NpZF9wcmVzZW50OworICAgdFNpck1hY1NTaWQgc3NpZDsgIAorfSB0U2lyTWFjTmVpZ2hib3JSZXBvcnRSZXEsICp0cFNpck1hY05laWdoYm9yUmVwb3J0UmVxOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTWFjTGlua1JlcG9ydAoreworICAgdEFOSV9VOCBkaWFsb2dUb2tlbjsKKyAgIHRBTklfVTggdHhQb3dlcjsKKyAgIHRBTklfVTggcnhBbnRlbm5hOworICAgdEFOSV9VOCB0eEFudGVubmE7CisgICB0QU5JX1U4IHJjcGk7CisgICB0QU5JX1U4IHJzbmk7Cit9IHRTaXJNYWNMaW5rUmVwb3J0LCAqdHBTaXJNYWNMaW5rUmVwb3J0OworCisjZGVmaW5lIEJFQUNPTl9SRVBPUlRfTUFYX0lFUyAyMjQgLy9SZWZlciBJRUVFIDgwMi4xMWstMjAwOCwgVGFibGUgNy0zMWQKK3R5cGVkZWYgc3RydWN0IHNTaXJNYWNCZWFjb25SZXBvcnQKK3sKKyAgIHRBTklfVTggcmVnQ2xhc3M7CisgICB0QU5JX1U4IGNoYW5uZWw7CisgICB0QU5JX1U4IG1lYXNTdGFydFRpbWVbOF07CisgICB0QU5JX1U4IG1lYXNEdXJhdGlvbjsKKyAgIHRBTklfVTggcGh5VHlwZTsKKyAgIHRBTklfVTggYmNuUHJvYmVSc3A7CisgICB0QU5JX1U4IHJzbmk7CisgICB0QU5JX1U4IHJjcGk7CisgICB0U2lyTWFjQWRkciBic3NpZDsKKyAgIHRBTklfVTggYW50ZW5uYUlkOworICAgdEFOSV9VMzIgcGFyZW50VFNGOworICAgdEFOSV9VOCBudW1JZXM7CisgICB0QU5JX1U4IEllc1tCRUFDT05fUkVQT1JUX01BWF9JRVNdOyAgCisKK30gdFNpck1hY0JlYWNvblJlcG9ydCwgKnRwU2lyTWFjQmVhY29uUmVwb3J0OworCisjZGVmaW5lIFJBRElPX1JFUE9SVFNfTUFYX0lOX0FfRlJBTUUgNAordHlwZWRlZiBzdHJ1Y3Qgc1Npck1hY1JhZGlvTWVhc3VyZVJlcG9ydAoreworICAgdEFOSV9VOCAgICAgdG9rZW47CisgICB0QU5JX1U4ICAgICByZWZ1c2VkOworICAgdEFOSV9VOCAgICAgaW5jYXBhYmxlOworICAgdEFOSV9VOCAgICAgdHlwZTsgIAorICAgdW5pb24gCisgICB7CisgICAgIHRTaXJNYWNCZWFjb25SZXBvcnQgYmVhY29uUmVwb3J0OworICAgfXJlcG9ydDsgIAorCit9dFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCwgKnRwU2lyTWFjUmFkaW9NZWFzdXJlUmVwb3J0OworCisjZW5kaWYKKworLy8gUU9TIGFjdGlvbiBmcmFtZSBkZWZpbml0aW9ucworCisvLyBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIHRjbGFzIGVsZW1lbnRzIGluIGFueSBmcmFtZQorI2RlZmluZSBTSVJfTUFDX1RDTEFTSUVfTUFYTlVNICAyCisKKy8vIEFERFRTIHJlcXVlc3QKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjUW9zQWRkdHNSZXFBRgoreworICAgIHRTaXJNYWNBY3Rpb25GcmFtZUhkciBhZkhkcjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICBkbGdUb2tlbjsKKyAgICB0U2lyTWFjVHNwZWNJRSAgICAgICAgdHNwZWM7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgdGNsYXNbMV07IC8vIHZhcmlhYmxlIGxlbmd0aCBlbGVtZW50Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNRb3NBZGR0c1JlcUFGOworCisvLyBBRERUUyByZXNwb25zZQordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNRb3NBZGR0c1JzcEFGCit7CisgICAgdFNpck1hY0FjdGlvbkZyYW1lSGRyIGFmSGRyOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGRsZ1Rva2VuOworICAgIHRTaXJNYWNTdGF0dXNDb2RlcyAgICBzdGF0dXM7CisgICAgdFNpck1hY1RzRGVsYXlJRSAgICAgIGRlbGF5OworICAgIHRTaXJNYWNUc3BlY0lFICAgICAgICB0c3BlYzsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICB0Y2xhc1sxXTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1Fvc0FkZHRzUnNwQUY7CisKKy8vIERFTFRTIGZyYW1lCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1Fvc0RlbHRzQUYKK3sKKyAgICB0U2lyTWFjQWN0aW9uRnJhbWVIZHIgYWZIZHI7CisgICAgdFNpck1hY1RTSW5mbyAgICAgICAgIHRzaW5mbzsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1Fvc0RlbHRzQUY7CisKKy8vIFNjaGVkdWxlIGZyYW1lCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1Fvc1NjaGVkdWxlQUYKK3sKKyAgICB0U2lyTWFjQWN0aW9uRnJhbWVIZHIgYWZIZHI7CisgICAgdFNpck1hY1NjaGVkdWxlSUUgICAgIHNjaGVkdWxlOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjUW9zU2NoZWR1bGVBRjsKKworLy8gRExQIGFjdGlvbiBmcmFtZSBkZWZpbml0aW9ucworCisvLyBETFAgcmVxdWVzdAordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNRb3NEbHBSZXFBRgoreworICAgIHRTaXJNYWNBY3Rpb25GcmFtZUhkciBhZkhkcjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICBkc3RNQUNbNl07CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgc3JjTUFDWzZdOworICAgIHRTaXJNYWNRb3NDYXBhYmlsaXR5SUUgcW9zQ2FwYWJpbGl0eTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICBkbHBUaW1lb3V0OworICAgIHRTaXJNYWNSYXRlU2V0SUUgICAgICBzdXBwb3J0ZWRSYXRlczsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1Fvc0RscFJlcUFGOworCisvLyBETFAgcmVzcG9uc2UKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjUW9zRGxwUnNwQUYKK3sKKyAgICB0U2lyTWFjQWN0aW9uRnJhbWVIZHIgYWZIZHI7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgZHN0TUFDWzZdOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIHNyY01BQ1s2XTsKKyAgICB0U2lyTWFjU3RhdHVzQ29kZXMgICAgc3RhdHVzOworICAgIHRTaXJNYWNRb3NDYXBhYmlsaXR5SUUgcW9zQ2FwYWJpbGl0eTsKKyAgICB0U2lyTWFjUmF0ZVNldElFICAgICAgc3VwcG9ydGVkUmF0ZXM7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNRb3NEbHBSc3BBRjsKKworLy8gRExQIHRlYXJkb3duCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1Fvc0RscFRkbkFGCit7CisgICAgdFNpck1hY0FjdGlvbkZyYW1lSGRyIGFmSGRyOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGRzdE1BQ1s2XTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICBzcmNNQUNbNl07Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNRb3NEbHBUZG5BRjsKKworCisKKworLy8KKy8vLyBDb21tb24gaGVhZGVyIGZvciBhbGwgQU5JIHByb3ByaWV0YXJ5IGFjdGlvbiBmcmFtZXMKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjQW5pQWN0aW9uRnJhbWUKK3sKKyAgICB0U2lyTWFjQWN0aW9uRnJhbWVIZHIgYWZIZHI7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgYW5pT3VpWzNdOyAvLyAwMCAwQSBGNQorICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIHR5cGU7ICAgICAgLy8gMCAtIHJlcXVlc3Q7IDEgLSByZXBvcnQ7IDIgLSBzbnIKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY0FuaUFjdGlvbkZyYW1lLCAqdHBTaXJNYWNBbmlBY3Rpb25GcmFtZTsKKworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY0xpbmtUZXN0UmVxRGF0YQoreworICAgIHRTaXJNYWNBbmlBY3Rpb25GcmFtZSBoZHI7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGF0dXM7IC8vIGJpdDAgLSBmaXJzdCBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0MSAtIGxhc3QgZnJhbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBib3RoIGJpdDAvMSBhcmUgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcm1lZGlhdGUgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdDItNyAtIHJlc2VydmVkCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgcmF0ZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICByYW5kb21EYXRhW1NJUl9NQUNfTUFYX1JBTkRPTV9MRU5HVEhdOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjTGlua1Rlc3RSZXFEYXRhLCAqdHBTaXJNYWNMaW5rVGVzdFJlcURhdGE7CisKKy8vLyBTTlIgcmVwb3J0IHNwZWNpZmljIGZpZWxkcwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNTbnJSZXBvcnQKK3sKKyAgICB0U2lyTWFjQW5pQWN0aW9uRnJhbWUgaGRyOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXM7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgc25yOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgIHNuckNvbXA7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgc3E7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgcnNzaTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1NuclJlcG9ydCwgKnRwU2lyTWFjU25yUmVwb3J0OworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1N0YUNiTGVnYWN5QnNzRGV0ZWN0Cit7CisgICAgdFNpck1hY0FuaUFjdGlvbkZyYW1lIGhkcjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgY2hhbm5lbE51bTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgbnVtTGVnYWN5QnNzaWQ7CisgICAgLyogQmVsb3cgaXMgZGVjbGFyZWQgYXMgYSBwbGFjZSBob2xkZXIuICBEb24ndCBhZGQgYW55dGhpbmcgYWZ0ZXIgaXQgc2luY2UgTGVnYWN5QnNzaWRMaXN0IHdpbGwgdGFrZSB1cCBtZW1vcnkgYWZ0ZXIgaXQgKi8KKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgTGVnYWN5QnNzaWRMaXN0WzFdOyAvKiBOZWVkIHRvIGRlY2xhcmUgc2l6ZSAxIGNhdXNlIHdpbiBidWlsZCBkb2Vzbid0IGxpa2Ugc2l6ZSAwICovCit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNTdGFDYkxlZ2FjeUJzc0RldGVjdCwgKnRwU2lyTWFjU3RhQ2JMZWdhY3lCc3NEZXRlY3Q7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjUW9TRGVmQkFSZXEKK3sKKyAgICB0U2lyTWFjQWN0aW9uRnJhbWVIZHIgaGRyOworCisgICAgdEFOSV9VOCAgcnN2ZDE7CisKKyNpZmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgICB0QU5JX1U4ICB0aWQ6IDQ7CisgICAgdEFOSV9VOCAgcnN2ZDI6IDQ7CisjZWxzZQorICAgIHRBTklfVTggIHJzdmQyOiA0OworICAgIHRBTklfVTggIHRpZDogNDsKKyNlbmRpZgorfSBfX2FuaV9hdHRyX3BhY2tlZCB0U2lyTWFjUW9TRGVmQkFSZXEsICp0cFNpck1hY1FvU0RlZkJBUmVxOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc1Npck1hY1FvU0RlZkJBUnNwCit7CisgICAgdFNpck1hY0FjdGlvbkZyYW1lSGRyIGhkcjsKKworI2lmZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorICAgIHRBTklfVTggdGlkOiA0OworICAgIHRBTklfVTggcG9saWN5OiAxOworICAgIHRBTklfVTggcmVqZWN0OiAxOworICAgIHRBTklfVTggcnN2ZDE6IDI7CisjZWxzZQorICAgIHRBTklfVTggcnN2ZDE6IDI7CisgICAgdEFOSV9VOCByZWplY3Q6IDE7CisgICAgdEFOSV9VOCBwb2xpY3k6IDE7CisgICAgdEFOSV9VOCB0aWQ6IDQ7CisjZW5kaWYKKworICAgIHRBTklfVTggYnVmZmVyU2l6ZTsKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1FvU0RlZkJBUnNwLCAqdHBTaXJNYWNRb1NEZWZCQVJzcDsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNRb1NEZWxCQVJlcQoreworICAgIHRTaXJNYWNBY3Rpb25GcmFtZUhkciBoZHI7CisgICAgdEFOSV9VOCByc3ZkMTsKKworI2lmZGVmIEFOSV9MSVRUTEVfQklUX0VORElBTgorICAgIHRBTklfVTggcnN2ZDI6IDM7CisgICAgdEFOSV9VOCBkaXJlY3Rpb246IDE7CisgICAgdEFOSV9VOCB0aWQ6IDQ7CisjZWxzZQorICAgIHRBTklfVTggdGlkOiA0OworICAgIHRBTklfVTggZGlyZWN0aW9uOiAxOworICAgIHRBTklfVTggcnN2ZDI6IDM7CisjZW5kaWYKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1FvU0RlbEJBUmVxLCAqdHBTaXJNYWNRb1NEZWxCQVJlcTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJNYWNRb1NEZWxCQVJzcAoreworICAgIHRTaXJNYWNBY3Rpb25GcmFtZUhkciBoZHI7CisKKyNpZmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgICB0QU5JX1U4IHRpZDogNDsKKyAgICB0QU5JX1U4IHBvbGljeTogMTsKKyAgICB0QU5JX1U4IHJlamVjdDogMTsKKyAgICB0QU5JX1U4IHJzdmQxOiAyOworI2Vsc2UKKyAgICB0QU5JX1U4IHJzdmQxOiAyOworICAgIHRBTklfVTggcmVqZWN0OiAxOworICAgIHRBTklfVTggcG9saWN5OiAxOworICAgIHRBTklfVTggdGlkOiA0OworI2VuZGlmCisKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpck1hY1FvU0RlbEJBUnNwLCAqdHBTaXJNYWNRb1NEZWxCQVJzcDsKKworCisKKy8vIDExYiByYXRlIGVuY29kaW5nIGluIE1BQyBmb3JtYXQKKworI2RlZmluZSBTSVJfTUFDX1JBVEVfMSAgIDB4MDIKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzIgICAweDA0CisjZGVmaW5lIFNJUl9NQUNfUkFURV81XzUgMHgwQgorI2RlZmluZSBTSVJfTUFDX1JBVEVfMTEgIDB4MTYKKworLy8gMTFhL2cgcmF0ZSBlbmNvZGluZyBpbiBNQUMgZm9ybWF0CisKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzYgICAweDBDCisjZGVmaW5lIFNJUl9NQUNfUkFURV85ICAgMHgxMgorI2RlZmluZSBTSVJfTUFDX1JBVEVfMTIgIDB4MTgKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzE4ICAweDI0CisjZGVmaW5lIFNJUl9NQUNfUkFURV8yNCAgMHgzMAorI2RlZmluZSBTSVJfTUFDX1JBVEVfMzYgIDB4NDgKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzQ4ICAweDYwCisjZGVmaW5lIFNJUl9NQUNfUkFURV81NCAgMHg2QworCisvLyBBTkkgbGVnYWN5IHN1cHBvcnRlZCByYXRlcworI2RlZmluZSBTSVJfTUFDX1JBVEVfNzIgIDB4MDEKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzk2ICAweDAzCisjZGVmaW5lIFNJUl9NQUNfUkFURV8xMDggMHgwNQorCisvLyBBTkkgZW5oYW5jZWQgcmF0ZXMKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzQyICAxMDAwCisjZGVmaW5lIFNJUl9NQUNfUkFURV84NCAgMTAwMQorI2RlZmluZSBTSVJfTUFDX1JBVEVfMTI2IDEwMDIKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzE0NCAxMDAzCisjZGVmaW5lIFNJUl9NQUNfUkFURV8xNjggMTAwNAorI2RlZmluZSBTSVJfTUFDX1JBVEVfMTkyIDEwMDUKKyNkZWZpbmUgU0lSX01BQ19SQVRFXzIxNiAxMDA2CisjZGVmaW5lIFNJUl9NQUNfUkFURV8yNDAgMTAwNworCisKKyNkZWZpbmUgc2lySXNBcmF0ZSh4KSAoKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzEyKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzE4KXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzI0KXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzM2KXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzQ4KXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzU0KSkKKworI2RlZmluZSBzaXJJc0JyYXRlKHgpICgoKCh0QU5JX1U4KXgpPT1TSVJfTUFDX1JBVEVfMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICgoKHRBTklfVTgpeCk9PVNJUl9NQUNfUkFURV81XzUpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAoKCh0QU5JX1U4KXgpPT1TSVJfTUFDX1JBVEVfMTEpKQorCisjZGVmaW5lIHNpcklzR3JhdGUoeCkgKCgoKHRBTklfVTgpeCk9PVNJUl9NQUNfUkFURV8xKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAoKCh0QU5JX1U4KXgpPT1TSVJfTUFDX1JBVEVfMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzVfNSl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICgoKHRBTklfVTgpeCk9PVNJUl9NQUNfUkFURV8xMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAoKCh0QU5JX1U4KXgpPT1TSVJfTUFDX1JBVEVfNikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzkpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICgoKHRBTklfVTgpeCk9PVNJUl9NQUNfUkFURV8xMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAoKCh0QU5JX1U4KXgpPT1TSVJfTUFDX1JBVEVfMTgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzI0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICgoKHRBTklfVTgpeCk9PVNJUl9NQUNfUkFURV8zNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAoKCh0QU5JX1U4KXgpPT1TSVJfTUFDX1JBVEVfNDgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzU0KSkKKworI2RlZmluZSBzaXJJc1Byb3ByYXRlKHgpICgoKCh0QU5JX1U4KXgpPT1TSVJfTUFDX1JBVEVfNzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodEFOSV9VOCl4KT09U0lSX01BQ19SQVRFXzk2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHRBTklfVTgpeCk9PVNJUl9NQUNfUkFURV8xMDgpKQorCisjZGVmaW5lIHNpcklzRW5oYW5jZWRSYXRlKHgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KT09U0lSX01BQ19SQVRFXzQyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpPT1TSVJfTUFDX1JBVEVfODQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCk9PVNJUl9NQUNfUkFURV8xMjYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KT09U0lSX01BQ19SQVRFXzE0NCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpPT1TSVJfTUFDX1JBVEVfMTY4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCk9PVNJUl9NQUNfUkFURV8xOTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KT09U0lSX01BQ19SQVRFXzIxNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpPT1TSVJfTUFDX1JBVEVfMjQwKSkKKworLy8vIFRhYmxlIHRoYXQgaGFzIE1BQzwtLT5QSFkgcmF0ZSBlbmNvZGluZ3MKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzU2lyTWFjUGh5UmF0ZXMKK3sKKyAgICB0QU5JX1U4ICAgIHJhdGVJZDsKKyAgICB0QU5JX1U4ICAgIHBoeVJhdGU7ICAgICAgICAvLyBSYXRlIGluIFBIWSBlbmNvZGluZyBmb3JtYXQKKyAgICB0QU5JX1UxNiAgIG1hY1JhdGU7ICAgICAgICAgLy8gUmF0ZSBpbiBNQUMgZW5jb2RpbmcgZm9ybWF0Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTaXJNYWNQaHlSYXRlcywgKnRwU2lyTWFjUGh5UmF0ZXM7CisKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNTaXJQaHkxMWFIZHIKK3sKKworI2lmbmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKworICAgIHRBTklfVTggbGVuZ3RoTG8gOiAzOworICAgIHRBTklfVTggcmVzZXJ2ZWQgOiAxOworICAgIHRBTklfVTggcmF0ZSA6IDQ7CisKKyAgICB0QU5JX1U4IGxlbmd0aE1pZCA6IDg7CisKKyAgICB0QU5JX1U4IHRhaWw6IDY7CisgICAgdEFOSV9VOCBwYXJpdHkgOiAxOworICAgIHRBTklfVTggbGVuZ3RoSGkgOiAxOworCisgICAgdEFOSV9VOCBzZXJ2aWNlTG87CisgICAgdEFOSV9VOCBzZXJ2aWNlSGk7CisjZWxzZQorICAgIHRBTklfVTggcmF0ZSA6IDQ7CisgICAgdEFOSV9VOCByZXNlcnZlZCA6IDE7CisgICAgdEFOSV9VOCBsZW5ndGhMbyA6IDM7CisKKyAgICB0QU5JX1U4IGxlbmd0aE1pZCA6IDg7CisKKyAgICB0QU5JX1U4IGxlbmd0aEhpIDogMTsKKyAgICB0QU5JX1U4IHBhcml0eSA6IDE7CisgICAgdEFOSV9VOCB0YWlsOiA2OworCisgICAgdEFOSV9VOCBzZXJ2aWNlTG87CisgICAgdEFOSV9VOCBzZXJ2aWNlSGk7CisjZW5kaWYKK30gX19hbmlfYXR0cl9wYWNrZWQgdFNpclBoeTExYUhkciwgKnRwU2lyUGh5MTFhSGRyOworCisjZW5kaWYgLyogX19NQUNfUFJPVF9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL2luYy9zaXJUeXBlcy5oIGIvQ09SRS9NQUMvaW5jL3NpclR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3ZGNjNwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL2luYy9zaXJUeXBlcy5oCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHNpclR5cGVzLmggY29udGFpbnMgdGhlIGNvbW1vbiB0eXBlcworICoKKyAqIEF1dGhvcjogICAgVi4gSy4gS2FuZGFycGEKKyAqIERhdGU6ICAgICAgMDQvMTIvMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgIE1vZGlmaWVkIGJ5ICAgICAgICAgICAgICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfX1NJUl9UWVBFU19ICisjZGVmaW5lIF9fU0lSX1RZUEVTX0gKKworI2luY2x1ZGUgImhhbFR5cGVzLmgiCisvKgorIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgdEFOSV9VODsKKyB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHRBTklfVTE2OworIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgdEFOSV9VMzI7CisgdHlwZWRlZiBzaWduZWQgY2hhciAgICB0QU5JX1M4OworIHR5cGVkZWYgc2lnbmVkIHNob3J0ICAgdEFOSV9TMTY7CisgdHlwZWRlZiBzaWduZWQgbG9uZyAgICB0QU5JX1MzMjsKKworICNpZm5kZWYgdEFOSV9CT09MRUFOCisgI2RlZmluZSB0QU5JX0JPT0xFQU4gdEFOSV9VOAorICNlbmRpZgorKi8KKworCisjaWYgZGVmaW5lZCggQU5JX09TX1RZUEVfV0lORE9XUyApCisjZGVmaW5lIGlubGluZSBfX2lubGluZQorI2VuZGlmCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBTSVJJVVMgRVJST1IgQ29kZXMgLyBSZXR1cm4gQ29kZXMgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8vLyBSZXR1cm4gc3RhdHVzIHR5cGUKK3R5cGVkZWYgZW51bSBlU2lyUmV0U3RhdHVzCit7CisgICAgZVNJUl9TVUNDRVNTLAorICAgIGVTSVJfRkFJTFVSRSwKKworICAgIC8vLyBTeXN0ZW0gRXJyb3JzCisgICAgZVNJUl9TWVNfRVJST1JfQkFTRT0weDEwMCwKKyAgICBlU0lSX1NZU19UWF9USFJFQURfQ1JFQVRFX0ZBSUxFRCwKKyAgICBlU0lSX1NZU19UWF9USFJFQURfUkVTVU1FX0ZBSUxFRCwKKyAgICBlU0lSX1NZU19UWF9NU0dfUV9DUkVBVEVfRkFJTEVELAorICAgIGVTSVJfU1lTX1RYX1FfU0VORF9GQUlMRUQsCisgICAgZVNJUl9TWVNfVFhfUV9SRUNWX0ZBSUxFRCwKKyAgICBlU0lSX1NZU19UWF9USU1FUl9BQ1RJVkFURV9GQUlMRUQsCisgICAgZVNJUl9TWVNfVFhfVElNRVJfQ0hBTkdFX0ZBSUxFRCwKKyAgICBlU0lSX1NZU19UWF9USU1FUl9DUkVBVEVfRkFJTEVELAorICAgIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRCwKKyAgICBlU0lSX1BDSV9FUlJPUiwKKworICAgIC8vIERyaXZlciBSZXR1cm4gQ29kZXMKKyAgICBlU0lSX0hBTF9FUlJPUl9CQVNFPTB4MTAwMCwKKyAgICBlU0lSX0hBTF9TVEFJRF9JTlZBTElELCAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgZVNJUl9IQUxfVENERVNDX0lOVkFMSUQsICAgICAgICAgICAgICAgICAgLy8gMgorICAgIGVTSVJfSEFMX1RYX1dRX05PVF9WQUxJRCwgICAgICAgICAgICAgICAgIC8vIDMKKyAgICBlU0lSX0hBTF9QUkVWX0JNVV9DTURfSU5DT01QTEVURSwgICAgICAgICAvLyA0CisgICAgZVNJUl9IQUxfRUVQUk9NX0NSQ19GQUlMRUQsICAgICAgICAgICAgICAgLy8gNQorICAgIGVTSVJfSEFMX1BDSV9SRVZJRF9JTlZBTElELCAgICAgICAgICAgICAgIC8vIDYKKyAgICBlU0lSX0hBTF9TVEFfVENfSURfSU5WQUxJRCwgICAgICAgICAgICAgICAvLyA3CisgICAgZVNJUl9IQUxfVFhXUV9FTVBUWSwgICAgICAgICAgICAgICAgICAgICAgLy8gOAorICAgIGVTSVJfSEFMX1JPVVRfVEJMX1RZUEVfU1RZUEVfSU5WQUxJRCwgICAgIC8vIDkKKyAgICBlU0lSX0hBTF9URlBfRU5BQkxFX0ZBSUxFRCwgICAgICAgICAgICAgICAvLyBhCisgICAgZVNJUl9IQUxfVEZQX0FCT1JUX0NNRF9GQUlMRUQsICAgICAgICAgICAgLy8gYgorICAgIGVTSVJfSEFMX1RGUF9URU1QTF9CQ05MRU5fSU5WQUxJRCwgICAgICAgIC8vIGMKKyAgICBlU0lSX0hBTF9URlBfVEVNUExfU0NITEVOX0lOVkFMSUQsICAgICAgICAvLyBkCisgICAgZVNJUl9IQUxfVEZQX1RFTVBMX0NGRU5ETEVOX0lOVkFMSUQsICAgICAgLy8gZQorICAgIGVTSVJfSEFMX1RGUF9URU1QTF9SUkxFTl9JTlZBTElELCAgICAgICAgIC8vIGYKKyAgICBlU0lSX0hBTF9URlBfVEVNUExfUFNQT0xMTEVOX0lOVkFMSUQsICAgICAvLyAxMAorICAgIGVTSVJfSEFMX1RGUF9URU1QTF9DVFNMRU5fSU5WQUxJRCwgICAgICAgIC8vIDExCisgICAgZVNJUl9IQUxfVEZQX1RFTVBMX0NGUE9MTExFTl9JTlZBTElELCAgICAgLy8gMTIKKyAgICBlU0lSX0hBTF9URlBfVEVNUExfQkFDS0xFTl9JTlZBTElELCAgICAgICAvLyAxMworICAgIGVTSVJfSEFMX0lOUFVUX0lOVkFMSUQsICAgICAgICAgICAgICAgICAgIC8vIDE0CisgICAgZVNJUl9IQUxfR0VUX1BEVV9GQUlMRUQsICAgICAgICAgICAgICAgICAgLy8gMTUKKyAgICBlU0lSX0hBTF9BRERfU1RBX0FDS19QT0xJQ1lfSU5WQUxJRCwgICAgICAvLyAxNgorICAgIGVTSVJfSEFMX1NUQV9FWElTVFMsICAgICAgICAgICAgICAgICAgICAgIC8vIDE3CisgICAgZVNJUl9IQUxfU1RBX0RPRVNfTk9UX0VYSVNULCAgICAgICAgICAgICAgLy8gMTgKKyAgICBlU0lSX0hBTF9NQVNURVJfV1FfSURfSU5WQUxJRCwgICAgICAgICAgICAvLyAxOQorICAgIGVTSVJfSEFMX1dRX05PVF9FTVBUWSwgICAgICAgICAgICAgICAgICAgIC8vIDFhCisgICAgZVNJUl9IQUxfV1FfRU1QVFksICAgICAgICAgICAgICAgICAgICAgICAgLy8gMWIKKyAgICBlU0lSX0hBTF9QRFVDTlRfQU5EX05FWFRQVFJfTUlTTUFUQ0gsICAgICAvLyAxYworICAgIGVTSVJfSEFMX0VSUl9OVU1fQllURVNfVE9fQkVfU0VUX1RPT19CSUcsIC8vIDFkCisgICAgZVNJUl9IQUxfR0VUX1BLVF9MRU5HVEhfSU5WQUxJRCwgICAgICAgICAgLy8gMWUKKyAgICBlU0lSX0hBTF9BU19DTlRfSU5WQUxJRCwgICAgICAgICAgICAgICAgICAvLyAxZgorICAgIGVTSVJfSEFMX1JGUF9BR0VfQ01EX1NFUUZBSUwsICAgICAgICAgICAgIC8vIDIwCisgICAgZVNJUl9IQUxfUkZQX0FHRV9DTURfQUdFX0NNRF9UQ0ZBSUwsICAgICAgLy8gMjEKKyAgICBlU0lSX0hBTF9SRlBfQUdFX0NNRF9QQVNTLCAgICAgICAgICAgICAgICAvLyAyMgorICAgIGVTSVJfSEFMX1JGUF9BR0VfQ01EX1RJTUVET1VULCAgICAgICAgICAgIC8vIDIzCisgICAgZVNJUl9IQUxfUkhQX0hBU0hfQ01EX1RJTUVPVVQsICAgICAgICAgICAgLy8gMjQKKyAgICBlU0lSX0hBTF9SSFBfUk9VVElOR19UQkxfU0VUX0ZBSUxFRCwgICAgICAvLyAyNQorICAgIGVTSVJfSEFMX1JIUF9ST1VUSU5HX1RCTF9HRVRfRkFJTEVELCAgICAgIC8vIDI2CisKKyAgICBlU0lSX0hBTF9DQUxfU1RBVFVTX0NIS19GQUlMRUQsCisKKyAgICBlU0lSX0hBTF9TWVNfQVJNX0RCR19NT0RFX1NFVF9GQUlMRUQsCisgICAgZVNJUl9IQUxfVEZQX0JDTl9TRU5ULAorICAgIGVTSVJfSEFMX1RGUF9CQ05fTk9UX1NFTlQsCisgICAgZVNJUl9IQUxfVEZQX0JLT0ZfSURfSU5WQUxJRCwKKyAgICBlU0lSX0hBTF9URlBfQ0ZCX0VOQUJMRV9JTlBVVF9JTlZBTElELAorICAgIGVTSVJfSEFMX1RGUF9FRENGX1RYT1BfSU5WQUxJRCwKKyAgICBlU0lSX0hBTF9URlBfVEVNUExfTEVOX0lOVkFMSUQsCisgICAgZVNJUl9IQUxfS0VZX0lEX0lOVkFMSUQsCisgICAgZVNJUl9IQUxfS0VZX0xFTl9JTlZBTElELAorICAgIGVTSVJfSEFMX0NISURfSU5WQUxJRCwKKyAgICBlU0lSX0hBTF9ISUZfQlVSU1RfUkVBRF9GQUlMRUQsCisgICAgZVNJUl9IQUxfSElGX0JVUlNUX1dSSVRFX0ZBSUxFRCwKKyAgICBlU0lSX0hBTF9ISUZfQlVSU1RfTEVOX1JFUV9JTlZBTElELAorICAgIGVTSVJfSEFMX0hJRl9UWF9OT19GUkFHX0RFU0MsCisKKyAgICBlU0lSX0hBTF9JTlZBTElEX1BST0RVQ1RfSUQsICAgICAgICAgIC8vIDQ0CisKKyAgICBlU0lSX0hBTF9JTlZBTElEX0NBUEFCSUxJVFksIC8vIDQ4CisgICAgZVNJUl9IQUxfQ0JfTk9UX0VOQUJMRUQsIC8vIDQ5CisgICAgZVNJUl9IQUxfTUFDX1JBVEVfSU5WQUxJRCwgLy8gNGEKKyAgICBlU0lSX0hBTF9SSFBfSEFORywgLy8gNGIKKyAgICBlU0lSX0hBTF9VTlNVUFBPUlRFRCwgLy8gNGMKKyAgICBlU0lSX0hBTF9UU1BFQ19JTlZBTElELCAvLyA0ZAorCisgICAgLy8gTklNIFJldHVybiBDb2RlcworICAgIGVTSVJfTklNX0VSUk9SX0JBU0U9MHgyMDAwLAorICAgIGVTSVJfTklNX0VSUl9JTlZBTElEX0VWRU5ULAorCisKKyAgICAvLyBNTUggUmV0dXJuIENvZGVzCisgICAgZVNJUl9OSU1fTU1IX0VSUk9SX0JBU0U9MHgyMTAwLAorICAgIGVTSVJfTklNX01NSF9FUlJfSU5WX0VWRU5ULAorICAgIGVTSVJfTklNX01NSF9FUlJfTVNHX0xFTiwKKyAgICBlU0lSX05JTV9NTUhfRVJSX0lOX1FfVFlQRSwKKworICAgIC8vIE1OVCBSZXR1cm4gQ29kZXMKKyAgICBlU0lSX05JTV9NTlRfRVJST1JfQkFTRT0weDIxNDAsCisKKyAgICAvLyBXRFQgRXJyb3JzCisgICAgZVNJUl9OSU1fV0RUX0VSUk9SX0JBU0U9MHgyMTgwLAorCisgICAgLy8gTElNIFJldHVybiBDb2RlcworICAgIGVTSVJfTElNX0VSUk9SX0JBU0U9MHgyMjAwLAorICAgIGVTSVJfTElNX0lHTk9SRV9CRUFDT04sCisgICAgZVNJUl9MSU1fSU5WQUxJRF9TVEEsCisgICAgZVNJUl9MSU1fTUFYX1NUQV9SRUFDSEVEX0VSUk9SLAorCisgICAgLy8gU0NIIFJldHVybiBDb2RlcworICAgIGVTSVJfU0NIX0VSUk9SX0JBU0U9MHgyMzAwLAorCisgICAgLy8gUE1NIFJldHVybiBDb2RlcworICAgIGVTSVJfUE1NX0VSUk9SX0JBU0U9MHgyNDAwLAorICAgIGVTSVJfUE1NX0lOVkFMSURfTU9ERSwKKyAgICBlU0lSX1BNTV9JTlZBTElEX1NUQVRFLAorICAgIGVTSVJfUE1NX0lOVkFMSURfUk9MRSwKKyAgICBlU0lSX1BNTV9TVEFfTk9UX0FTU09DSUFURUQsCisgICAgZVNJUl9QTU1fSEVBUlRfQkVBVF9UTU9VVCwKKyAgICBlU0lSX1BNTV9OVEhfQkVBQ09OX0RFTElWRVJZLAorCisgICAgLy8gQVJRIFJldHVybiBDb2RlcworICAgIGVTSVJfQVJRX0VSUk9SX0JBU0U9MHgyNTAwLAorCisgICAgLy8gQ0ZHIFJldHVybiBDb2RlcworICAgIGVTSVJfQ0ZHX0VSUk9SX0JBU0U9MjYwMCwKKyAgICBlU0lSX0NGR19JTlZBTElEX0lELAorICAgIGVTSVJfQ0ZHX0lOVkFMSURfTEVOLAorCisgICAgLy8gcGFyc2VyIFJldHVybiBDb2RlcworICAgIGVTSVJfUFJTX0VSUk9SX0JBU0U9MHgyNzAwLAorICAgIGVTSVJfSUdOT1JFX0lFLAorCisgICAgLy8gUHV0IGFsbCB5b3VyIHJldHVybiBjb2RlcyBhYm92ZSB0aGlzIGxpbmUKKyAgICBlU0lSX0VSUk9SX0xBU1QKKworfSB0U2lyUmV0U3RhdHVzOworCisjIGVuZGlmIC8vIF9fU0lSX1RZUEVTX0gKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL2luYy93bmlBcGkuaCBiL0NPUkUvTUFDL2luYy93bmlBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGRjOWIzCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvaW5jL3duaUFwaS5oCkBAIC0wLDAgKzEsNjUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgd25pQXBpLmggY29udGFpbnMgbWVzc2FnZSBkZWZpbml0aW9ucyBleHBvcnRlZCBieQorICogU2lyaXVzIHNvZnR3YXJlIG1vZHVsZXMuCisgKiBOT1RFOiBTZWUgcHJvamVjdHMvc2lyaXVzL2luY2x1ZGUvc2lyQXBpLmggZm9yIHN0cnVjdHVyZQorICogZGVmaW5pdGlvbnMgb2YgdGhlIGhvc3QvRlcgbWVzc2FnZXMuCisgKgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDQvMTEvMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfX1dOSV9BUElfSAorI2RlZmluZSBfX1dOSV9BUElfSAorCisvLyBEUEggcmV0dXJuIGVycm9yIGNvZGVzCisjZGVmaW5lIEFOSV9EUEhfU1VDQ0VTUyAgICAgICAgICAgIDAKKworI2RlZmluZSBBTklfRFBIX1JYX1NUQV9JTlZBTElEICAgICAxCisKKyNkZWZpbmUgQU5JX0RQSF9ET19US0lQIDIKKworI2RlZmluZSBBTklfRFBIX1BPUlRfQkxPQ0tFRCAzCisjZGVmaW5lIEFOSV9EUEhfVFhfUFVTSF9FUlJPUiAgICAgIDEwCisjZGVmaW5lIEFOSV9EUEhfVFhfTUFDX0hEUl9FUlJPUiAgIDExCisjZGVmaW5lIEFOSV9EUEhfVFhfSU5WQUxJRF9QQVlMT0FEIDEyCisjZGVmaW5lIEFOSV9EUEhfVFhfU1RBX0lOVkFMSUQgICAgIDEzCisjZGVmaW5lIEFOSV9EUEhfVFhfSEFTSF9NSVNTICAgICAgIDE0CisjZGVmaW5lIEFOSV9EUEhfVFhfVU5JTklUSUFMSVpFRCAgIDE1CisjZGVmaW5lIEFOSV9EUEhfVFhfUkFESU9fSU5fRElBR19NT0RFIDE2CisjZGVmaW5lIEFOSV9EUEhfV01NX0RST1AgMTcKKyNkZWZpbmUgQU5JX0RQSF9BUFNEX0RST1AgMTgKKyNkZWZpbmUgQU5JX0RQSF9VTktOT1dOX1NUQSAxOQorCisvLy8gSEREIHR5cGUgZm9yIHNwZWNpYWwgaGFuZGxpbmcgb2YgQkRzIGluIHRoZSBUWCBwa3RzCisvLy8gVXNlZCBpbiB0aGUgc3RydWN0dXJlIGFuaV9tb2RfaW5mb190LT5iZF9zcGxfcHJvY190eXBlCisjZGVmaW5lIEFOSV9IRERfTk9fU1BMX1BST0MgICAgICAgICAgICAgMAorI2RlZmluZSBBTklfSEREX0RVTU1ZX1BLVF9TUExfUFJPQyAgICAgIDEKKyNkZWZpbmUgQU5JX0hERF9QUkVfRFVNTVlfUEtUX1NQTF9QUk9DICAyCisjZGVmaW5lIEFOSV9IRERfV05TX0wyX1VQREFURV9TUExfUFJPQyAgMworI2RlZmluZSBBTklfSEREX0RVTU1ZX0RBVEEgICAgICAgICAgICAgIDQKKyNpZmRlZiBXTU1fQVBTRAorI2RlZmluZSBBTklfSEREX0VPU1BfUEtUICAgICAgICAgICAgICAgIDUKKyNlbmRpZgorCisvLy8gTWVzc2FnZSBvZmZzZXQgZm9yIHRoZSBjbWQgdG8gZW5xdWV1ZSBhIGR1bW15IHBrdCB0byBIREQgVEQgcmluZworI2RlZmluZSBBTklfRFVNTVlfUEtUX01TR19UWVBFX09GRlNFVCAgICAwCisjZGVmaW5lIEFOSV9EVU1NWV9QS1RfTVNHX0xFTl9PRkZTRVQgICAgIDIKKyNkZWZpbmUgQU5JX0RVTU1ZX1BLVF9NQUNfQUREUl9PRkZTRVQgICAgNAorI2RlZmluZSBBTklfRFVNTVlfUEtUX1NUQV9JRF9PRkZTRVQgICAgICAxMAorI2RlZmluZSBBTklfRFVNTVlfUEtUX1JUX0ZMX09GRlNFVCAgICAgICAxMgorI2RlZmluZSBBTklfRFVNTVlfUEtUX01TR19MRU4gICAgICAgICAgICAxNgorI2RlZmluZSBBTklfRFVNTVlfREFUQV9QQVlMT0FEX09GRlNFVCAgICAxMAorCisvKioKKyAqIFByb2R1Y3QgSURzIHN0b3JlZCBpbiB0aGUgRUVQUk9NIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIEFQIHJhZGlvIGNhcmRzCisgKiBzdXBwb3J0ZWQgYnkgUG9sYXJpcworICovCisjZGVmaW5lIEFHTjEzMjNBUl8wMCAgICAgIDQKKyNkZWZpbmUgQUdOMTMyM0FSXzAxICAgICAgNQorI2RlZmluZSBBR04xMjIzQVJfMDAgICAgICA2CisjZGVmaW5lIEFHTjEyMjNBUl8wMSAgICAgIDcKKyNkZWZpbmUgQUdOMTIyM0FSXzAyICAgICAgOAorI2RlZmluZSBBR05fRUVQX1BST0RVQ1RfSURfTUFYICAgOAorCisKKworCisvLy8gU3RhcnQgb2YgU2lyaXVzL0hvc3QgbWVzc2FnZSB0eXBlcworI2RlZmluZSBXTklfSE9TVF9NU0dfU1RBUlQgICAgICAgICAgICAgMHgxMTAwCisKK2VudW0gZVduaU1zZ1R5cGVzCit7CisgICAgLy8vIENGRyBtZXNzYWdlIHR5cGVzCisgICAgZVdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOPVdOSV9IT1NUX01TR19TVEFSVCwKKyAgICBlV05JX0NGR19NU0dfVFlQRVNfRU5EPWVXTklfQ0ZHX01TR19UWVBFU19CRUdJTisweEZGLAorCisgICAgLy8vIFNNRSBtZXNzYWdlIHR5cGVzCisgICAgZVdOSV9TTUVfTVNHX1RZUEVTX0JFR0lOPWVXTklfQ0ZHX01TR19UWVBFU19FTkQsCisgICAgZVdOSV9TTUVfU1RBUlRfUkVRLAorICAgIGVXTklfU01FX1NUQVJUX1JTUCwKKyAgICBlV05JX1NNRV9TWVNfUkVBRFlfSU5ELAorICAgIGVXTklfU01FX1NDQU5fUkVRLAorICAgIGVXTklfU01FX1NDQU5fQUJPUlRfSU5ELAorICAgIGVXTklfU01FX1NDQU5fUlNQLAorICAgIGVXTklfU01FX0pPSU5fUkVRLAorICAgIGVXTklfU01FX0pPSU5fUlNQLAorICAgIGVXTklfU01FX1NFVENPTlRFWFRfUkVRLAorICAgIGVXTklfU01FX1NFVENPTlRFWFRfUlNQLAorICAgIGVXTklfU01FX1JFQVNTT0NfUkVRLAorICAgIGVXTklfU01FX1JFQVNTT0NfUlNQLAorICAgIGVXTklfU01FX0FVVEhfUkVRLAorICAgIGVXTklfU01FX0FVVEhfUlNQLAorICAgIGVXTklfU01FX0RJU0FTU09DX1JFUSwKKyAgICBlV05JX1NNRV9ESVNBU1NPQ19SU1AsCisgICAgZVdOSV9TTUVfRElTQVNTT0NfSU5ELAorICAgIGVXTklfU01FX0RJU0FTU09DX0NORiwKKyAgICBlV05JX1NNRV9ERUFVVEhfUkVRLAorICAgIGVXTklfU01FX0RFQVVUSF9SU1AsCisgICAgZVdOSV9TTUVfREVBVVRIX0lORCwKKyAgICBlV05JX1NNRV9XTV9TVEFUVVNfQ0hBTkdFX05URiwKKyAgICBlV05JX1NNRV9JQlNTX05FV19QRUVSX0lORCwKKyAgICBlV05JX1NNRV9JQlNTX1BFRVJfREVQQVJURURfSU5ELAorICAgIGVXTklfU01FX1NUQVJUX0JTU19SRVEsCisgICAgZVdOSV9TTUVfU1RBUlRfQlNTX1JTUCwKKyAgICBlV05JX1NNRV9BVVRIX0lORCwKKyAgICBlV05JX1NNRV9BU1NPQ19JTkQsCisgICAgZVdOSV9TTUVfQVNTT0NfQ05GLAorICAgIGVXTklfU01FX1JFQVNTT0NfSU5ELAorICAgIGVXTklfU01FX1JFQVNTT0NfQ05GLAorICAgIGVXTklfU01FX1NXSVRDSF9DSExfUkVRLAorICAgIGVXTklfU01FX1NXSVRDSF9DSExfUlNQLAorICAgIGVXTklfU01FX1NUT1BfQlNTX1JFUSwKKyAgICBlV05JX1NNRV9TVE9QX0JTU19SU1AsCisgICAgZVdOSV9TTUVfREVMX0JBX1BFRVJfSU5ELAorI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgICAgZVdOSV9TTUVfREVGSU5FX1FPU19SRVEsCisgICAgZVdOSV9TTUVfREVGSU5FX1FPU19SU1AsCisgICAgZVdOSV9TTUVfREVMRVRFX1FPU19SRVEsCisgICAgZVdOSV9TTUVfREVMRVRFX1FPU19SU1AsCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisgICAgZVdOSV9TTUVfUFJPTUlTQ1VPVVNfTU9ERV9SRVEsCisgICAgZVdOSV9TTUVfUFJPTUlTQ1VPVVNfTU9ERV9SU1AsCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgICBlV05JX1NNRV9MSU5LX1RFU1RfU1RBUlRfUkVRLAorICAgIGVXTklfU01FX0xJTktfVEVTVF9TVEFSVF9SU1AsCisgICAgZVdOSV9TTUVfTElOS19URVNUX1NUT1BfUkVRLAorICAgIGVXTklfU01FX0xJTktfVEVTVF9TVE9QX1JTUCwKKyAgICBlV05JX1NNRV9MSU5LX1RFU1RfUkVQT1JUX0lORCwKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKyAgICBlV05JX1NNRV9ORUlHSEJPUl9CU1NfSU5ELAorICAgIGVXTklfU01FX01FQVNVUkVNRU5UX1JFUSwKKyAgICBlV05JX1NNRV9NRUFTVVJFTUVOVF9SU1AsCisgICAgZVdOSV9TTUVfTUVBU1VSRU1FTlRfSU5ELAorICAgIGVXTklfU01FX1NFVF9XRFNfSU5GT19SRVEsCisgICAgZVdOSV9TTUVfU0VUX1dEU19JTkZPX1JTUCwKKyAgICBlV05JX1NNRV9XRFNfSU5GT19JTkQsCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgICBlV05JX1NNRV9TRVRfUE9XRVJfUkVRLAorICAgIGVXTklfU01FX1NFVF9QT1dFUl9SU1AsCisgICAgZVdOSV9TTUVfQ0xJRU5UX1NJREVfTE9BRF9CQUxBTkNFX1JFUSwKKyAgICBlV05JX1NNRV9DTElFTlRfU0lERV9MT0FEX0JBTEFOQ0VfUlNQLAorICAgIGVXTklfU01FX1NFTEVDVF9DSEFOTkVMX1JFUSwKKyAgICBlV05JX1NNRV9TRUxFQ1RfQ0hBTk5FTF9SU1AsCisgICAgZVdOSV9TTUVfU0VUX1BST1BSSUVUQVJZX0lFX1JFUSwKKyAgICBlV05JX1NNRV9TRVRfUFJPUFJJRVRBUllfSUVfUlNQLCAvLyAjZW5kaWYKKyAgICBlV05JX1NNRV9ESVNDQVJEX1NLQl9OVEYsICAvLyBVc2VkIHRvIGNsZWFudXAgU0tCcyBieSBIREQKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKyAgICBlV05JX1NNRV9ERUFVVEhfQ05GLAorICAgIGVXTklfU01FX01JQ19GQUlMVVJFX0lORCwKKyAgICBlV05JX1NNRV9BRERUU19SRVEsCisgICAgZVdOSV9TTUVfQUREVFNfUlNQLAorICAgIGVXTklfU01FX0FERFRTX0NORiwKKyAgICBlV05JX1NNRV9BRERUU19JTkQsCisgICAgZVdOSV9TTUVfREVMVFNfUkVRLAorICAgIGVXTklfU01FX0RFTFRTX1JTUCwKKyAgICBlV05JX1NNRV9ERUxUU19JTkQsCisgICAgZVdOSV9TTUVfU0VUX0JBQ0tHUk9VTkRfU0NBTl9NT0RFX1JFUSwKKyAgICBlV05JX1NNRV9TV0lUQ0hfQ0hMX0NCX1BSSU1BUllfUkVRLAorICAgIGVXTklfU01FX1NXSVRDSF9DSExfQ0JfUFJJTUFSWV9SU1AsCisgICAgZVdOSV9TTUVfU1dJVENIX0NITF9DQl9TRUNPTkRBUllfUkVRLAorICAgIGVXTklfU01FX1NXSVRDSF9DSExfQ0JfU0VDT05EQVJZX1JTUCwKKyAgICBlV05JX1NNRV9QUk9CRV9SRVEsCisgICAgZVdOSV9TTUVfU1RBX1NUQVRfUkVRLAorICAgIGVXTklfU01FX1NUQV9TVEFUX1JTUCwKKyAgICBlV05JX1NNRV9BR0dSX1NUQVRfUkVRLAorICAgIGVXTklfU01FX0FHR1JfU1RBVF9SU1AsCisgICAgZVdOSV9TTUVfR0xPQkFMX1NUQVRfUkVRLAorICAgIGVXTklfU01FX0dMT0JBTF9TVEFUX1JTUCwKKyAgICBlV05JX1NNRV9TVEFUX1NVTU1fUkVRLAorICAgIGVXTklfU01FX1NUQVRfU1VNTV9SU1AsCisgICAgZVdOSV9TTUVfUkVNT1ZFS0VZX1JFUSwKKyAgICBlV05JX1NNRV9SRU1PVkVLRVlfUlNQLAorICAgIGVXTklfU01FX0dFVF9TQ0FOTkVEX0NIQU5ORUxfUkVRLAorICAgIGVXTklfU01FX0dFVF9TQ0FOTkVEX0NIQU5ORUxfUlNQLAorICAgIGVXTklfU01FX1NFVF9UWF9QT1dFUl9SRVEsCisgICAgZVdOSV9TTUVfU0VUX1RYX1BPV0VSX1JTUCwKKyAgICBlV05JX1NNRV9HRVRfVFhfUE9XRVJfUkVRLAorICAgIGVXTklfU01FX0dFVF9UWF9QT1dFUl9SU1AsCisgICAgZVdOSV9TTUVfR0VUX05PSVNFX1JFUSwKKyAgICBlV05JX1NNRV9HRVRfTk9JU0VfUlNQLAorICAgIGVXTklfU01FX0xPV19SU1NJX0lORCwKKyAgICBlV05JX1NNRV9HRVRfU1RBVElTVElDU19SRVEsCisgICAgZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUlNQLAorICAgIGVXTklfU01FX0dFVF9SU1NJX1JFUSwKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgZVdOSV9TTUVfR0VUX0FTU09DX1NUQVNfUkVRLAorICAgIGVXTklfU01FX1RLSVBfQ05UUl9NRUFTX1JFUSwKKyAgICBlV05JX1NNRV9VUERBVEVfQVBXUFNJRV9SRVEsCisgICAgZVdOSV9TTUVfR0VUX1dQU1BCQ19TRVNTSU9OX1JFUSwKKyAgICBlV05JX1NNRV9XUFNfUEJDX1BST0JFX1JFUV9JTkQsCisgICAgZVdOSV9TTUVfU0VUX0FQV1BBUlNOSUVzX1JFUSwKKyAgICBlV05JX1NNRV9VUFBFUl9MQVlFUl9BU1NPQ19DTkYsCisgICAgZVdOSV9TTUVfSElERV9TU0lEX1JFUSwKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICBlV05JX1NNRV9SRU1BSU5fT05fQ0hBTk5FTF9SRVEsCisgICAgZVdOSV9TTUVfUkVNQUlOX09OX0NITl9JTkQsCisgICAgZVdOSV9TTUVfUkVNQUlOX09OX0NITl9SU1AsCisgICAgZVdOSV9TTUVfTUdNVF9GUk1fSU5ELAorICAgIGVXTklfU01FX1JFTUFJTl9PTl9DSE5fUkRZX0lORCwKKyAgICBlV05JX1NNRV9TRU5EX0FDVElPTl9GUkFNRV9JTkQsCisgICAgZVdOSV9TTUVfQUNUSU9OX0ZSQU1FX1NFTkRfQ05GLAorICAgIGVXTklfU01FX0FCT1JUX1JFTUFJTl9PTl9DSEFOX0lORCwKKyAgICBlV05JX1NNRV9VUERBVEVfTk9BLAorI2VuZGlmCisgICAgZVdOSV9TTUVfUFJFX0NIQU5ORUxfU1dJVENIX0ZVTExfUE9XRVIsCisgICAgLy9HZW5lcmFsIFBvd2VyIFNhdmUgTWVzc2FnZXMKKyAgICBlV05JX1BNQ19NU0dfVFlQRVNfQkVHSU4sCisgICAgZVdOSV9QTUNfUFdSX1NBVkVfQ0ZHLAorCisgICAgLy9CTVBTIE1lc3NhZ2VzCisgICAgZVdOSV9QTUNfRU5URVJfQk1QU19SRVEsCisgICAgZVdOSV9QTUNfRU5URVJfQk1QU19SU1AsCisgICAgZVdOSV9QTUNfRVhJVF9CTVBTX1JFUSwKKyAgICBlV05JX1BNQ19FWElUX0JNUFNfUlNQLAorICAgIGVXTklfUE1DX0VYSVRfQk1QU19JTkQsCisKKyAgICAvL0lNUFMgTWVzc2FnZXMuCisgICAgZVdOSV9QTUNfRU5URVJfSU1QU19SRVEsCisgICAgZVdOSV9QTUNfRU5URVJfSU1QU19SU1AsCisgICAgZVdOSV9QTUNfRVhJVF9JTVBTX1JFUSwKKyAgICBlV05JX1BNQ19FWElUX0lNUFNfUlNQLAorCisgICAgLy9VQVBTRCBNZXNzYWdlcworICAgIGVXTklfUE1DX0VOVEVSX1VBUFNEX1JFUSwKKyAgICBlV05JX1BNQ19FTlRFUl9VQVBTRF9SU1AsCisgICAgZVdOSV9QTUNfRVhJVF9VQVBTRF9SRVEsCisgICAgZVdOSV9QTUNfRVhJVF9VQVBTRF9SU1AsCisKKyAgICAvL1dPV0wgTWVzc2FnZXMKKyAgICBlV05JX1BNQ19TTVBTX1NUQVRFX0lORCwKKworICAgIC8vV29XTEFOIE1lc3NhZ2VzCisgICAgZVdOSV9QTUNfV09XTF9BRERfQkNBU1RfUFRSTiwKKyAgICBlV05JX1BNQ19XT1dMX0RFTF9CQ0FTVF9QVFJOLAorICAgIGVXTklfUE1DX0VOVEVSX1dPV0xfUkVRLAorICAgIGVXTklfUE1DX0VOVEVSX1dPV0xfUlNQLAorICAgIGVXTklfUE1DX0VYSVRfV09XTF9SRVEsCisgICAgZVdOSV9QTUNfRVhJVF9XT1dMX1JTUCwKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisgICAgZVdOSV9QTUNfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JTUCwKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisgICAgZVdOSV9QTUNfTVNHX1RZUEVTX0VORCwKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIGVXTklfU01FX1JSTV9NU0dfVFlQRV9CRUdJTiwKKworICAgIGVXTklfU01FX05FSUdIQk9SX1JFUE9SVF9SRVFfSU5ELAorICAgIGVXTklfU01FX05FSUdIQk9SX1JFUE9SVF9JTkQsCisgICAgZVdOSV9TTUVfQkVBQ09OX1JFUE9SVF9SRVFfSU5ELAorICAgIGVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVTUF9YTUlUX0lORCwKKworICAgIGVXTklfU01FX1JSTV9NU0dfVFlQRV9FTkQsCisKKyNlbmRpZgorICAgIGVXTklfU01FX0FERF9TVEFfU0VMRl9SRVEsCisgICAgZVdOSV9TTUVfQUREX1NUQV9TRUxGX1JTUCwKKyAgICBlV05JX1NNRV9ERUxfU1RBX1NFTEZfUkVRLAorICAgIGVXTklfU01FX0RFTF9TVEFfU0VMRl9SU1AsCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgZVdOSV9TTUVfRlRfUFJFX0FVVEhfUkVRLAorICAgIGVXTklfU01FX0ZUX1BSRV9BVVRIX1JTUCwKKyAgICBlV05JX1NNRV9GVF9VUERBVEVfS0VZLAorICAgIGVXTklfU01FX0ZUX0FHR1JfUU9TX1JFUSwKKyAgICBlV05JX1NNRV9GVF9BR0dSX1FPU19SU1AsCisjZW5kaWYKKworI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgIGVXTklfU01FX0NDWF9BREpBQ0VOVF9BUF9SRVBPUlQsCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICBlV05JX1NNRV9SRUdJU1RFUl9NR01UX0ZSQU1FX1JFUSwKKyNlbmRpZgorCisgICAgZVdOSV9TTUVfQ09FWF9JTkQsCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKyAgICBlV05JX1NNRV9QUkVGX05FVFdPUktfRk9VTkRfSU5ELAorI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCisgICAgZVdOSV9TTUVfVFhfUEVSX0hJVF9JTkQsCisKKyAgICBlV05JX1NNRV9DSEFOR0VfQ09VTlRSWV9DT0RFLAorICAgIGVXTklfU01FX1BSRV9TV0lUQ0hfQ0hMX0lORCwKKyAgICBlV05JX1NNRV9QT1NUX1NXSVRDSF9DSExfSU5ELAorCisgICAgZVdOSV9TTUVfTUFYX0FTU09DX0VYQ0VFREVELAorCisgICAgZVdOSV9TTUVfQlRBTVBfTE9HX0xJTktfSU5ELC8vdG8gc2VyaWFsaXplIHRoZSBjcmVhdGUvYWNjcGV0IExMIHJlcSBmcm9tIEhDSQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisgICAgZVdOSV9QTUNfR1RLX09GRkxPQURfR0VUSU5GT19SU1AsCisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgICBlV05JX1NNRV9XQUtFX1JFQVNPTl9JTkQsCisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisKKyAgICBlV05JX1NNRV9NU0dfVFlQRVNfRU5ECit9OworCisjZGVmaW5lIFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOICAgICAgICAweDExMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ0ZHIE1vZHVsZSBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENGRyBtZXNzYWdlIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV05JX0NGR19NU0dfSERSX01BU0sgICAgMHhmZmZmMDAwMAorI2RlZmluZSBXTklfQ0ZHX01TR19MRU5fTUFTSyAgICAweDAwMDBmZmZmCisjZGVmaW5lIFdOSV9DRkdfTUJfSERSX0xFTiAgICAgIDQKKyNkZWZpbmUgV05JX0NGR19NQVhfUEFSQU1fTlVNICAgMzIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDRkcgdG8gSEREIG1lc3NhZ2UgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdOSV9DRkdfUEFSQU1fVVBEQVRFX0lORCAgICAgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDAwKQorI2RlZmluZSBXTklfQ0ZHX0ROTERfUkVRICAgICAgICAgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwMSkKKyNkZWZpbmUgV05JX0NGR19ETkxEX0NORiAgICAgICAgICAgICAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4MDIpCisjZGVmaW5lIFdOSV9DRkdfR0VUX1JTUCAgICAgICAgICAgICAgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDAzKQorI2RlZmluZSBXTklfQ0ZHX1NFVF9DTkYgICAgICAgICAgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwNCkKKyNkZWZpbmUgV05JX0NGR19HRVRfQVRUUklCX1JTUCAgICAgICAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4MDUpCisjZGVmaW5lIFdOSV9DRkdfQUREX0dSUF9BRERSX0NORiAgICAgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDA2KQorI2RlZmluZSBXTklfQ0ZHX0RFTF9HUlBfQUREUl9DTkYgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwNykKKworI2RlZmluZSBBTklfQ0ZHX0dFVF9SQURJT19TVEFUX1JTUCAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwOCkKKyNkZWZpbmUgQU5JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JTUCAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4MDkpCisjZGVmaW5lIEFOSV9DRkdfR0VUX0FHR19TVEFfU1RBVF9SU1AgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDBhKQorI2RlZmluZSBBTklfQ0ZHX0NMRUFSX1NUQVRfUlNQICAgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwYikKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDRkcgdG8gSEREIG1lc3NhZ2UgcGFyYW10ZXIgaW5kaWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZSBmb2xsb3dpbmdzIGFyZSB3b3JkIGluZGljZXMgc3RhcnRpbmcgZnJvbSB0aGUgbWVzc2FnZSBib2R5ICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFdOSV9DRkdfeHh4eF94eHh4X3h4eHg6ICAgICAgICAgaW5kZXggb2YgcGFyYW1ldGVyICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFdOSV9DRkdfeHh4eF94eHh4X05VTTogICAgICAgICAgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gbWVzc2FnZSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFdOSV9DRkdfeHh4eF94eHh4X0xFTjogICAgICAgICAgYnl0ZSBsZW5ndGggb2YgbWVzc2FnZSBpbmNsdWRpbmcgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUIgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFdOSV9DRkdfeHh4eF94eHh4X1BBUlRJQUxfTEVOOiAgYnl0ZSBsZW5ndGggb2YgbWVzc2FnZSBpbmNsdWRpbmcgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBhbmQgTUIgaGVhZGVyIGJ1dCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkaW5nIHZhcmlhYmxlIGRhdGEgbGVuZ3RoICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorLy8gUGFyYW1ldGVyIHVwZGF0ZSBpbmRpY2F0aW9uCisjZGVmaW5lIFdOSV9DRkdfUEFSQU1fVVBEQVRFX0lORF9QSUQgICAwCisKKyNkZWZpbmUgV05JX0NGR19QQVJBTV9VUERBVEVfSU5EX05VTSAgIDEKKyNkZWZpbmUgV05JX0NGR19QQVJBTV9VUERBVEVfSU5EX0xFTiAgIChXTklfQ0ZHX01CX0hEUl9MRU4gKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV05JX0NGR19QQVJBTV9VUERBVEVfSU5EX05VTSA8PCAyKSkKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworLy8gQ29uZmlndXJhdGlvbiBkb3dubG9hZCByZXF1ZXN0CisjZGVmaW5lIFdOSV9DRkdfRE5MRF9SRVFfTlVNICAgICAgICAgICAwCisjZGVmaW5lIFdOSV9DRkdfRE5MRF9SRVFfTEVOICAgICAgICAgICBXTklfQ0ZHX01CX0hEUl9MRU4KKworLy8gQ29uZmlndXJhdGlvbiBkb3dubG9hZCBjb25maXJtCisjZGVmaW5lIFdOSV9DRkdfRE5MRF9DTkZfUkVTICAgICAgICAgICAwCisKKyNkZWZpbmUgV05JX0NGR19ETkxEX0NORl9OVU0gICAgICAgICAgIDEKKyNkZWZpbmUgV05JX0NGR19ETkxEX0NORl9MRU4gICAgICAgICAgIChXTklfQ0ZHX01CX0hEUl9MRU4gKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV05JX0NGR19ETkxEX0NORl9OVU0gPDwgMikpCisvLyBHZXQgcmVzcG9uc2UKKyNkZWZpbmUgV05JX0NGR19HRVRfUlNQX1JFUyAgICAgICAgICAgIDAKKyNkZWZpbmUgV05JX0NGR19HRVRfUlNQX1BJRCAgICAgICAgICAgIDEKKyNkZWZpbmUgV05JX0NGR19HRVRfUlNQX1BMRU4gICAgICAgICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX0dFVF9SU1BfTlVNICAgICAgICAgICAgMworI2RlZmluZSBXTklfQ0ZHX0dFVF9SU1BfUEFSVElBTF9MRU4gICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTklfQ0ZHX0dFVF9SU1BfTlVNIDw8IDIpKQorLy8gU2V0IGNvbmZpcm0KKyNkZWZpbmUgV05JX0NGR19TRVRfQ05GX1JFUyAgICAgICAgICAgIDAKKyNkZWZpbmUgV05JX0NGR19TRVRfQ05GX1BJRCAgICAgICAgICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1NFVF9DTkZfTlVNICAgICAgICAgICAgMgorI2RlZmluZSBXTklfQ0ZHX1NFVF9DTkZfTEVOICAgICAgICAgICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTklfQ0ZHX1NFVF9DTkZfTlVNIDw8IDIpKQorLy8gR2V0IGF0dHJpYnV0ZSByZXNwb25zZQorI2RlZmluZSBXTklfQ0ZHX0dFVF9BVFRSSUJfUlNQX1JFUyAgICAgMAorI2RlZmluZSBXTklfQ0ZHX0dFVF9BVFRSSUJfUlNQX1BJRCAgICAgMQorI2RlZmluZSBXTklfQ0ZHX0dFVF9BVFRSSUJfUlNQX1RZUEUgICAgMgorI2RlZmluZSBXTklfQ0ZHX0dFVF9BVFRSSUJfUlNQX1BMRU4gICAgMworI2RlZmluZSBXTklfQ0ZHX0dFVF9BVFRSSUJfUlNQX1JXICAgICAgNAorCisjZGVmaW5lIFdOSV9DRkdfR0VUX0FUVFJJQl9SU1BfTlVNICAgICA1CisjZGVmaW5lIFdOSV9DRkdfR0VUX0FUVFJJQl9SU1BfTEVOICAgICAoV05JX0NGR19NQl9IRFJfTEVOICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdOSV9DRkdfR0VUX0FUVFJJQl9SU1BfTlVNIDw8IDIpKQorCisvLyBBZGQgZ3JvdXAgYWRkcmVzcyBjb25maXJtCisjZGVmaW5lIFdOSV9DRkdfQUREX0dSUF9BRERSX0NORl9SRVMgICAwCisKKyNkZWZpbmUgV05JX0NGR19BRERfR1JQX0FERFJfQ05GX05VTSAgIDEKKyNkZWZpbmUgV05JX0NGR19BRERfR1JQX0FERFJfQ05GX0xFTiAgIChXTklfQ0ZHX01CX0hEUl9MRU4gKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV05JX0NGR19BRERfR1JQX0FERFJfQ05GX05VTSA8PCAyKSkKKworLy8gRGVsZXRlIGdyb3VwIGFkZHJlc3MgY29uZmlybQorI2RlZmluZSBXTklfQ0ZHX0RFTF9HUlBfQUREUl9DTkZfUkVTICAgMAorCisjZGVmaW5lIFdOSV9DRkdfREVMX0dSUF9BRERSX0NORl9OVU0gICAxCisjZGVmaW5lIFdOSV9DRkdfREVMX0dSUF9BRERSX0NORl9MRU4gICAoV05JX0NGR19NQl9IRFJfTEVOICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdOSV9DRkdfREVMX0dSUF9BRERSX0NORl9OVU0gPDwyKSkKKworCisjZGVmaW5lIElTX0NGR19NU0cobXNnKSAoKG1zZyAmIDB4ZmYwMCkgPT0gV05JX0NGR19NU0dfVFlQRVNfQkVHSU4pCisKKy8vIENsZWFyIHN0YXRzIHR5cGVzLgorI2RlZmluZSBBTklfQ0xFQVJfQUxMX1NUQVRTICAgICAgICAgIDAKKyNkZWZpbmUgQU5JX0NMRUFSX1JYX1NUQVRTICAgICAgICAgICAxCisjZGVmaW5lIEFOSV9DTEVBUl9UWF9TVEFUUyAgICAgICAgICAgMgorI2RlZmluZSBBTklfQ0xFQVJfUEVSX1NUQV9TVEFUUyAgICAgIDMKKyNkZWZpbmUgQU5JX0NMRUFSX0FHR1JfUEVSX1NUQV9TVEFUUyA0CisjZGVmaW5lIEFOSV9DTEVBUl9TVEFUX1RZUEVTX0VORCAgICAgNQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBIREQgdG8gQ0ZHIG1lc3NhZ2UgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdOSV9DRkdfRE5MRF9SU1AgICAgICAgICAgICAgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDgwKQorI2RlZmluZSBXTklfQ0ZHX0dFVF9SRVEgICAgICAgICAgICAgICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHg4MSkKKyNkZWZpbmUgV05JX0NGR19TRVRfUkVRICAgICAgICAgICAgICAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4ODIpCisjZGVmaW5lIFdOSV9DRkdfU0VUX1JFUV9OT19SU1AgICAgICAgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDgzKSAvL05vIFJTUCBmb3IgdGhpcyBzZXQKKworLy8gU2hhbGwgYmUgcmVtb3ZlZCBhZnRlciBzdGF0cyBpbnRlZ3JhdGlvbgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEhERCB0byBDRkcgbWVzc2FnZSBwYXJhbXRlciBpbmRpY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlIGZvbGxvd2luZ3MgYXJlIHdvcmQgaW5kaWNlcyBzdGFydGluZyBmcm9tIHRoZSBtZXNzYWdlIGJvZHkgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgV05JX0NGR194eHh4X3h4eHhfeHh4eDogICAgICAgICBpbmRleCBvZiBwYXJhbWV0ZXIgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgV05JX0NGR194eHh4X3h4eHhfTlVNOiAgICAgICAgICBudW1iZXIgb2YgcGFyYW1ldGVycyBpbiBtZXNzYWdlICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgV05JX0NGR194eHh4X3h4eHhfTEVOOiAgICAgICAgICBieXRlIGxlbmd0aCBvZiBtZXNzYWdlIGluY2x1ZGluZyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQiBoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgV05JX0NGR194eHh4X3h4eHhfUEFSVElBTF9MRU46ICBieXRlIGxlbmd0aCBvZiBtZXNzYWdlIGluY2x1ZGluZyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFuZCBNQiBoZWFkZXIgYnV0ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRpbmcgdmFyaWFibGUgZGF0YSBsZW5ndGggICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8gRG93bmxvYWQgcmVzcG9uc2UKKyNkZWZpbmUgV05JX0NGR19ETkxEX1JTUF9CSU5fTEVOICAgICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0ROTERfUlNQX05VTSAgICAgICAgICAgMQorI2RlZmluZSBXTklfQ0ZHX0ROTERfUlNQX1BBUlRJQUxfTEVOICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTklfQ0ZHX0ROTERfUlNQX05VTSA8PCAyKSkKKworLy8gU2V0IHBhcmFtZXRlciByZXF1ZXN0CisjZGVmaW5lIFdOSV9DRkdfU0VUX1JFUV9QSUQgICAgICAgICAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0VUX1JFUV9QTEVOICAgICAgICAgICAxCisKKy8qCisvLyBHZXQgYXR0cmlidXRlIHJlcXVlc3QKKy8vI2RlZmluZSBXTklfQ0ZHX0dFVF9BVFRSSUJfUkVRX1BJRCAgIDAKKworLy8jZGVmaW5lIFdOSV9DRkdfR0VUX0FUVFJJQl9SRVFfTlVNICAgICAxCisvLyNkZWZpbmUgV05JX0NGR19HRVRfQVRUUklCX1JFUV9MRU4gICAgIChXTklfQ0ZHX01CX0hEUl9MRU4gKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV05JX0NGR19HRVRfQVRUUklCX1JFUV9OVU0gPDwgMikpCisvLyBBZGQgZ3JvdXAgYWRkcmVzcyByZXF1ZXN0CisjZGVmaW5lIFdOSV9DRkdfQUREX0dSUF9BRERSX1JFUV9NQUNfQUREUiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BRERfR1JQX0FERFJfUkVRX05VTSAgIDEKKyNkZWZpbmUgV05JX0NGR19BRERfR1JQX0FERFJfUkVRX0xFTiAgIChXTklfQ0ZHX01CX0hEUl9MRU4gKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV05JX0NGR19BRERfR1JQX0FERFJfUkVRX05VTSA8PCAyKSkKKy8vIERlbGV0ZSBncm91cCBhZGRyZXNzIHJlcXVlc3QKKyNkZWZpbmUgV05JX0NGR19ERUxfR1JQX0FERFJfUkVRX01BQ19BRERSICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0RFTF9HUlBfQUREUl9SRVFfTlVNICAgMQorI2RlZmluZSBXTklfQ0ZHX0RFTF9HUlBfQUREUl9SRVFfTEVOICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTklfQ0ZHX0RFTF9HUlBfQUREUl9SRVFfTlVNIDw8IDIpKQorKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDRkcgcmV0dXJuIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdOSV9DRkdfU1VDQ0VTUyAgICAgICAgICAgICAxCisjZGVmaW5lIFdOSV9DRkdfTk9UX1JFQURZICAgICAgICAgICAyCisjZGVmaW5lIFdOSV9DRkdfSU5WQUxJRF9QSUQgICAgICAgICAzCisjZGVmaW5lIFdOSV9DRkdfSU5WQUxJRF9MRU4gICAgICAgICA0CisjZGVmaW5lIFdOSV9DRkdfUk9fUEFSQU0gICAgICAgICAgICA1CisjZGVmaW5lIFdOSV9DRkdfV09fUEFSQU0gICAgICAgICAgICA2CisjZGVmaW5lIFdOSV9DRkdfSU5WQUxJRF9TVEFJRCAgICAgICA3CisjZGVmaW5lIFdOSV9DRkdfT1RIRVJfRVJST1IgICAgICAgICA4CisjZGVmaW5lIFdOSV9DRkdfTkVFRF9SRVNUQVJUICAgICAgICA5CisjZGVmaW5lIFdOSV9DRkdfTkVFRF9SRUxPQUQgICAgICAgIDEwCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ0ZHIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXTklfQ0ZHX1RZUEVfU1RSICAgICAgICAgICAgMHgwMDAwMDAwCisjZGVmaW5lIFdOSV9DRkdfVFlQRV9JTlQgICAgICAgICAgICAweDAwMDAwMDEKKyNkZWZpbmUgV05JX0NGR19IT1NUX1JFICAgICAgICAgICAgIDB4MDAwMDAwMgorI2RlZmluZSBXTklfQ0ZHX0hPU1RfV0UgICAgICAgICAgICAgMHgwMDAwMDA0CisKKworLy8gU2hhbGwgYmUgcmVtb3ZlZCBhZnRlciBpbnRlZ3JhdGlvbiBvZiBzdGF0cy4KKy8vIEdldCBzdGF0aXN0aWMgcmVzcG9uc2UKKyNkZWZpbmUgV05JX0NGR19HRVRfU1RBVF9SU1BfUkVTICAgICAgIDAKKyNkZWZpbmUgV05JX0NGR19HRVRfU1RBVF9SU1BfUEFSQU1JRCAgIDEKKyNkZWZpbmUgV05JX0NGR19HRVRfU1RBVF9SU1BfVkFMVUUgICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX0dFVF9TVEFUX1JTUF9OVU0gICAgICAgMworI2RlZmluZSBXTklfQ0ZHX0dFVF9TVEFUX1JTUF9MRU4gICAgICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV05JX0NGR19HRVRfU1RBVF9SU1BfTlVNIDw8MikpCisvLyBHZXQgcGVyIHN0YXRpb24gc3RhdGlzdGljIHJlc3BvbnNlCisjZGVmaW5lIFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SU1BfUkVTICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTklfQ0ZHX0dFVF9QRVJfU1RBX1NUQVRfUlNQX1NUQUlEICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV05JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JTUF9GSVJTVF9QQVJBTSAgICAgICAgICAgICAgICAyCisKKy8vIFBlciBTVEEgc3RhdGlzdGljIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3Qgc0FuaUNmZ1BlclN0YVN0YXRTdHJ1Y3QKK3sKKyAgICAgICB1bnNpZ25lZCBsb25nICAgICBzZW50QWVzQmxrc1VjYXN0SGk7CisgICAgICAgdW5zaWduZWQgbG9uZyAgICAgc2VudEFlc0Jsa3NVY2FzdExvOworCisgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcmVjdkFlc0Jsa3NVY2FzdEhpOworICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHJlY3ZBZXNCbGtzVWNhc3RMbzsKKworICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIGFlc0Zvcm1hdEVycm9yVWNhc3RDbnRzOworCisgICAgICAgdW5zaWduZWQgbG9uZyAgICAgYWVzUmVwbGF5c1VjYXN0OworCisgICAgICAgdW5zaWduZWQgbG9uZyAgICAgYWVzRGVjcnlwdEVyclVjYXN0OworCisgICAgICAgdW5zaWduZWQgbG9uZyAgICAgc2luZ2xlUmV0cnlQa3RzOworCisgICAgICAgdW5zaWduZWQgbG9uZyAgICAgZmFpbGVkVHhQa3RzOworCisgICAgICAgdW5zaWduZWQgbG9uZyAgICAgYWNrVGltZW91dHM7CisKKyAgICAgICB1bnNpZ25lZCBsb25nICAgICBtdWx0aVJldHJ5UGt0czsKKworICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIGZyYWdUeENudHNIaTsKKyAgICAgICB1bnNpZ25lZCBsb25nICAgICBmcmFnVHhDbnRzTG87CisKKyAgICAgICB1bnNpZ25lZCBsb25nICAgICB0cmFuc21pdHRlZFBrdHNIaTsKKyAgICAgICB1bnNpZ25lZCBsb25nICAgICB0cmFuc21pdHRlZFBrdHNMbzsKKworICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHBoeVN0YXRIaTsKKyAgICAgICB1bnNpZ25lZCBsb25nICAgICBwaHlTdGF0TG87Cit9IHRDZmdQZXJTdGFTdGF0U3RydWN0LCAqdHBBbmlDZmdQZXJTdGFTdGF0U3RydWN0OworCisjZGVmaW5lIFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SU1BfTlVNICAgICAgICAgICAgICAgICAgICAgICAyMworI2RlZmluZSBXTklfQ0ZHX0dFVF9QRVJfU1RBX1NUQVRfUlNQX0xFTiAgICAoV05JX0NGR19NQl9IRFJfTEVOICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV05JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JTUF9OVU0gPDwgMikpCisKKworLy8gU2hhbGwgYmUgcmVtb3ZlZCBhZnRlciBpbnRlZ3JhdGluZyBzdGF0cy4KKyNkZWZpbmUgV05JX0NGR19HRVRfU1RBVF9SU1AgICAgICAgICAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4MDgpCisjZGVmaW5lIFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SU1AgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDA5KQorI2RlZmluZSBXTklfQ0ZHX0dFVF9BR0dfU1RBX1NUQVRfUlNQICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHgwYSkKKyNkZWZpbmUgV05JX0NGR19HRVRfVFhfUkFURV9DVFJfUlNQICAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4MGIpCisKKyNkZWZpbmUgV05JX0NGR19HRVRfQUdHX1NUQV9TVEFUX1JTUF9OVU0gICAgMjEKKyNkZWZpbmUgV05JX0NGR19HRVRfQUdHX1NUQV9TVEFUX1JTUF9MRU4gICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdOSV9DRkdfR0VUX0FHR19TVEFfU1RBVF9SU1BfTlVNIDw8IDIpKQorI2RlZmluZSBXTklfQ0ZHX0dFVF9BR0dfU1RBX1NUQVRfUlNQX1JFUyAwCisKKyAgLy8gR2V0IFRYIHJhdGUgYmFzZWQgc3RhdHMKKyNkZWZpbmUgV05JX0NGR19HRVRfVFhfUkFURV9DVFJfUlNQX1JFUyAgICAgICAgICAgICAgICAgICAgICAgIDAKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaUNmZ1R4UmF0ZUN0cnMKK3sKKy8vIGFkZCB0aGUgcmF0ZSBjb3VudGVycyBoZXJlCisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc18xTWJwczsKKyAgICB1bnNpZ25lZCBsb25nIFR4RnJhbWVzXzJNYnBzOworICAgIHVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfNV81TWJwczsKKyAgICB1bnNpZ25lZCBsb25nIFR4RnJhbWVzXzZNYnBzOworICAgIHVuc2lnbmVkIGxvbmcgVHhGcmFtZXNfOU1icHM7CisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc18xMU1icHM7CisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc18xMk1icHM7CisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc18xOE1icHM7CisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc18yNE1icHM7CisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc18zNk1icHM7CisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc180OE1icHM7CisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc181NE1icHM7CisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc183Mk1icHM7CisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc185Nk1icHM7CisgICAgdW5zaWduZWQgbG9uZyBUeEZyYW1lc18xMDhNYnBzOworCit9IHRBbmlDZmdUeFJhdGVDdHJzLCAqdHBBbmlDZmdUeFJhdGVDdHJzOworCisKKyNkZWZpbmUgV05JX0NGR19HRVRfU1RBVF9SRVEgICAgICAgICAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4ODYpCisjZGVmaW5lIFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SRVEgICAoV05JX0NGR19NU0dfVFlQRVNfQkVHSU4gfCAweDg3KQorI2RlZmluZSBXTklfQ0ZHX0dFVF9BR0dfU1RBX1NUQVRfUkVRICAgKFdOSV9DRkdfTVNHX1RZUEVTX0JFR0lOIHwgMHg4OCkKKyNkZWZpbmUgV05JX0NGR19HRVRfVFhfUkFURV9DVFJfUkVRICAgIChXTklfQ0ZHX01TR19UWVBFU19CRUdJTiB8IDB4ODkpCisKKy8vIEdldCBzdGF0aXN0aWMgcmVxdWVzdAorI2RlZmluZSBXTklfQ0ZHX0dFVF9TVEFUX1JFUV9QQVJBTUlEICAgMAorCisjZGVmaW5lIFdOSV9DRkdfR0VUX1NUQVRfUkVRX05VTSAgICAgICAxCisjZGVmaW5lIFdOSV9DRkdfR0VUX1NUQVRfUkVRX0xFTiAgICAgICAoV05JX0NGR19NQl9IRFJfTEVOICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdOSV9DRkdfR0VUX1NUQVRfUkVRX05VTSA8PCAyKSkKKworICAvLyBHZXQgcGVyIHN0YXRpb24gc3RhdGlzdGljIHJlcXVlc3QKKyNkZWZpbmUgV05JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JFUV9TVEFJRCAwCisKKyNkZWZpbmUgV05JX0NGR19HRVRfUEVSX1NUQV9TVEFUX1JFUV9OVU0gICAxCisjZGVmaW5lIFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SRVFfTEVOICAgKFdOSV9DRkdfTUJfSERSX0xFTiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SRVFfTlVNIDw8IDIpKQorCisKKworCisjZGVmaW5lIERZTkFNSUNfQ0ZHX1RZUEVfU0VMRUNURURfUkVHSVNUUkFSICAgKDApCisjZGVmaW5lIERZTkFNSUNfQ0ZHX1RZUEVfV1BTX1NUQVRFICAgICAgICAgICAgKDEpCisKKyNlbmRpZiAvKiBfX1dOSV9BUElfSCAqLworCmRpZmYgLS1naXQgYS9DT1JFL01BQy9pbmMvd25pQ2ZnQXAuaCBiL0NPUkUvTUFDL2luYy93bmlDZmdBcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOWYxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9pbmMvd25pQ2ZnQXAuaApAQCAtMCwwICsxLDIxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLgorICovCisKKy8qCisgKiBETyBOT1QgRURJVCAtIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljbGx5CisgKi8KKworLyoKKyAqIElNUE9SVEFOVDogIFRoaXMgZmlsZSBpcyBmb3Igc3lzdGVtIHRoYXQgc3VwcG9ydHMgYm90aCBTVEEgYW5kIEFQIG1vZGUuCisgKi8KKworCisjaWZuZGVmIF9fV05JQ0ZHQVBfSAorI2RlZmluZSBfX1dOSUNGR0FQX0gKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIElEIGZvciBTVEEgYW5kIEFQCisgKi8KKworI2RlZmluZSBXTklfQ0ZHX1NUQV9JRCAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0ZfUE9MTEFCTEUgICAgMQorI2RlZmluZSBXTklfQ0ZHX0NGUF9QRVJJT0QgICAgMgorI2RlZmluZSBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT04gICAgMworI2RlZmluZSBXTklfQ0ZHX1NTSUQgICAgNAorI2RlZmluZSBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTCAgICA1CisjZGVmaW5lIFdOSV9DRkdfRFRJTV9QRVJJT0QgICAgNgorI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIICAgIDcKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfVEFCTEUgICAgOAorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV9UQUJMRV9ST1cgICAgNAorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV9UQUJMRV9DT0wgICAgMQorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8xICAgIDgKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfMiAgICA5CisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzMgICAgMTAKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfNCAgICAxMQorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEICAgIDEyCisjZGVmaW5lIFdOSV9DRkdfRVhDTFVERV9VTkVOQ1JZUFRFRCAgICAxMworI2RlZmluZSBXTklfQ0ZHX1JUU19USFJFU0hPTEQgICAgMTQKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9SRVRSWV9MSU1JVCAgICAxNQorI2RlZmluZSBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVQgICAgMTYKKyNkZWZpbmUgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAgICAxNworI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRSAgICAxOAorI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSAgICAxOQorI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUgICAgMjAKKyNkZWZpbmUgV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FICAgIDIxCisjZGVmaW5lIFdOSV9DRkdfSk9JTl9GQUlMVVJFX1RJTUVPVVQgICAgMjIKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVEVfRkFJTFVSRV9USU1FT1VUICAgIDIzCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VUICAgIDI0CisjZGVmaW5lIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUICAgIDI1CisjZGVmaW5lIFdOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQgICAgMjYKKyNkZWZpbmUgV05JX0NGR19SQV9QRVJJT0RJQ0lUWV9USU1FT1VUX0lOX1BTICAgIDI3CisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVIgICAgMjgKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfSEVBUlRfQkVBVCAgICAyOQorI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1IgICAgMzAKKyNkZWZpbmUgV05JX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVCAgICAzMQorI2RlZmluZSBXTklfQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLICAgIDMyCisjZGVmaW5lIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQiAgICAzMworI2RlZmluZSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUEgICAgMzQKKyNkZWZpbmUgV05JX0NGR19QSFlfTU9ERSAgICAzNQorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREUgICAgMzYKKyNkZWZpbmUgV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVCAgICAzNworI2RlZmluZSBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VUICAgIDM4CisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfT1BFUkFUSU9OQUxfUkFURV9TRVQgICAgMzkKKyNkZWZpbmUgV05JX0NGR19CU1NJRCAgICA0MAorI2RlZmluZSBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTCAgICA0MQorI2RlZmluZSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCAgICA0MgorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTCAgICA0MworI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haICAgIDQ0CisjZGVmaW5lIFdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haICAgIDQ1CisjZGVmaW5lIFdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEUgICAgNDYKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFICAgIDQ3CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFogICAgNDgKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF81R0haICAgIDQ5CisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWSAgICA1MAorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9TRUNPTkRBUlkgICAgNTEKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfVEVSVElBUlkgICAgNTIKKyNkZWZpbmUgV05JX0NGR19BUFNEX0VOQUJMRUQgICAgNTMKKyNkZWZpbmUgV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFICAgIDU0CisjZGVmaW5lIFdOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEUgICAgNTUKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFICAgIDU2CisjZGVmaW5lIFdOSV9DRkdfQ0ZfUE9MTF9SRVFVRVNUICAgIDU3CisjZGVmaW5lIFdOSV9DRkdfUFJJVkFDWV9FTkFCTEVEICAgIDU4CisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEUgICAgNTkKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9TTE9UX1RJTUUgICAgNjAKKyNkZWZpbmUgV05JX0NGR19BQ0NFUFRfU0hPUlRfU0xPVF9BU1NPQ19PTkxZICAgIDYxCisjZGVmaW5lIFdOSV9DRkdfUU9TX0VOQUJMRUQgICAgNjIKKyNkZWZpbmUgV05JX0NGR19IQ0ZfRU5BQkxFRCAgICA2MworI2RlZmluZSBXTklfQ0ZHX1JTTl9FTkFCTEVEICAgIDY0CisjZGVmaW5lIFdOSV9DRkdfQkFDS0dST1VORF9TQ0FOX1BFUklPRCAgICA2NQorI2RlZmluZSBXTklfQ0ZHX01BWF9OVU1fUFJFX0FVVEggICAgNjYKKyNkZWZpbmUgV05JX0NGR19QUkVBVVRIX0NMTlVQX1RJTUVPVVQgICAgNjcKKyNkZWZpbmUgV05JX0NGR19SRUxFQVNFX0FJRF9USU1FT1VUICAgIDY4CisjZGVmaW5lIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQgICAgNjkKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9BRlRFUl9IQl9GQUlMX1RJTUVPVVQgICAgNzAKKyNkZWZpbmUgV05JX0NGR19NQU5VRkFDVFVSRVJfT1VJICAgIDcxCisjZGVmaW5lIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX05BTUUgICAgNzIKKyNkZWZpbmUgV05JX0NGR19NT0RFTF9OVU1CRVIgICAgNzMKKyNkZWZpbmUgV05JX0NGR19NT0RFTF9OQU1FICAgIDc0CisjZGVmaW5lIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfTkFNRSAgICA3NQorI2RlZmluZSBXTklfQ0ZHX01BTlVGQUNUVVJFUl9QUk9EVUNUX1ZFUlNJT04gICAgNzYKKyNkZWZpbmUgV05JX0NGR18xMURfRU5BQkxFRCAgICA3NworI2RlZmluZSBXTklfQ0ZHX01BWF9UWF9QT1dFUl8yXzQgICAgNzgKKyNkZWZpbmUgV05JX0NGR19NQVhfVFhfUE9XRVJfNSAgICA3OQorI2RlZmluZSBXTklfQ0ZHX05FVFdPUktfREVOU0lUWSAgICA4MAorI2RlZmluZSBXTklfQ0ZHX0FEQVBUSVZFX1RIUkVTSE9MRF9BTEdPUklUSE0gICAgODEKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1RYX0FOVEVOTkEgICAgODIKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1JYX0FOVEVOTkEgICAgODMKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMICAgIDg0CisjZGVmaW5lIFdOSV9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOICAgIDg1CisjZGVmaW5lIFdOSV9DRkdfTkVXX0JTU19GT1VORF9JTkQgICAgODYKKyNkZWZpbmUgV05JX0NGR19QUk9QUklFVEFSWV9BTklfRkVBVFVSRVNfRU5BQkxFRCAgICA4NworI2RlZmluZSBXTklfQ0ZHX1BST1BSSUVUQVJZX1JBVEVTX0VOQUJMRUQgICAgODgKKyNkZWZpbmUgV05JX0NGR19BUF9OT0RFX05BTUUgICAgODkKKyNkZWZpbmUgV05JX0NGR19DT1VOVFJZX0NPREUgICAgOTAKKyNkZWZpbmUgV05JX0NGR18xMUhfRU5BQkxFRCAgICA5MQorI2RlZmluZSBXTklfQ0ZHX1dUX0NORl9USU1FT1VUICAgIDkyCisjZGVmaW5lIFdOSV9DRkdfS0VFUEFMSVZFX1RJTUVPVVQgICAgOTMKKyNkZWZpbmUgV05JX0NGR19QUk9YSU1JVFkgICAgOTQKKyNkZWZpbmUgV05JX0NGR19MT0dfTEVWRUwgICAgOTUKKyNkZWZpbmUgV05JX0NGR19PTEJDX0RFVEVDVF9USU1FT1VUICAgIDk2CisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEICAgIDk3CisjZGVmaW5lIFdOSV9DRkdfMTFHX1BST1RFQ1RJT05fQUxXQVlTICAgIDk4CisjZGVmaW5lIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04gICAgOTkKKyNkZWZpbmUgV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRCAgICAxMDAKKyNkZWZpbmUgV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRUQgICAgMTAxCisjZGVmaW5lIFdOSV9DRkdfQ0FMX1BFUklPRCAgICAxMDIKKyNkZWZpbmUgV05JX0NGR19TVEFUU19QRVJJT0QgICAgMTAzCisjZGVmaW5lIFdOSV9DRkdfQ0FMX0NPTlRST0wgICAgMTA0CisjZGVmaW5lIFdOSV9DRkdfMTFHX09OTFlfUE9MSUNZICAgIDEwNQorI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTiAgICAxMDYKKyNkZWZpbmUgV05JX0NGR19XTUVfRU5BQkxFRCAgICAxMDcKKyNkZWZpbmUgV05JX0NGR19BRERUU19SU1BfVElNRU9VVCAgICAxMDgKKyNkZWZpbmUgV05JX0NGR19NQVhfU1BfTEVOR1RIICAgIDEwOQorI2RlZmluZSBXTklfQ0ZHX0tFRVBfQUxJVkVfU1RBX0xJTUlUX1RIUkVTSE9MRCAgICAxMTAKKyNkZWZpbmUgV05JX0NGR19TRU5EX1NJTkdMRV9TU0lEX0FMV0FZUyAgICAxMTEKKyNkZWZpbmUgV05JX0NGR19XU01fRU5BQkxFRCAgICAxMTIKKyNkZWZpbmUgV05JX0NGR19QUk9QX0NBUEFCSUxJVFkgICAgMTEzCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFICAgIDExNAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUwgICAgMTE1CisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNCRV9MT0NBTCAgICAxMTYKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ1ZJX0xPQ0FMICAgIDExNworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDVk9fTE9DQUwgICAgMTE4CisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNCSyAgICAxMTkKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ0JFICAgIDEyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDVkkgICAgMTIxCisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNWTyAgICAxMjIKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ0JLX0xPQ0FMICAgIDEyMworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDQkVfTE9DQUwgICAgMTI0CisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNWSV9MT0NBTCAgICAxMjUKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ1ZPX0xPQ0FMICAgIDEyNgorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDQksgICAgMTI3CisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNCRSAgICAxMjgKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ1ZJICAgIDEyOQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVk8gICAgMTMwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ0JLX0xPQ0FMICAgIDEzMQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNCRV9MT0NBTCAgICAxMzIKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDVklfTE9DQUwgICAgMTMzCisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ1ZPX0xPQ0FMICAgIDEzNAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNCSyAgICAxMzUKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDQkUgICAgMTM2CisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ1ZJICAgIDEzNworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNWTyAgICAxMzgKKyNkZWZpbmUgV05JX0NGR19SREVUX0ZMQUcgICAgMTM5CisjZGVmaW5lIFdOSV9DRkdfUkFEQVJfQ0hBTk5FTF9MSVNUICAgIDE0MAorI2RlZmluZSBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlQgICAgMTQxCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfUE9MSUNZICAgIDE0MgorI2RlZmluZSBXTklfQ0ZHX0FETUlUX0JXRkFDVE9SICAgIDE0MworI2RlZmluZSBXTklfQ0ZHX01BWF9DT05TRUNVVElWRV9CQUNLR1JPVU5EX1NDQU5fRkFJTFVSRSAgICAxNDQKKyNkZWZpbmUgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSAgICAxNDUKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURSAgICAxNDYKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPICAgIDE0NworI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORSAgICAxNDgKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV08gICAgMTQ5CisjZGVmaW5lIFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTiAgICAxNTAKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HICAgIDE1MQorI2RlZmluZSBXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNUICAgIDE1MgorI2RlZmluZSBXTklfQ0ZHX01JTU9fRU5BQkxFRCAgICAxNTMKKyNkZWZpbmUgV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRCAgICAxNTQKKyNkZWZpbmUgV05JX0NGR19CQV9BQ1RJVklUWV9DSEVDS19USU1FT1VUICAgIDE1NQorI2RlZmluZSBXTklfQ0ZHX0hUX1JYX1NUQkMgICAgMTU2CisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk8gICAgMTU3CisjZGVmaW5lIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TICAgIDE1OAorI2RlZmluZSBXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VUICAgIDE1OQorI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GTyAgICAxNjAKKyNkZWZpbmUgV05JX0NGR19UWF9CRl9DQVAgICAgMTYxCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQICAgIDE2MgorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQxICAgIDE2MworI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQyICAgIDE2NAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzICAgIDE2NQorI2RlZmluZSBXTklfQ0ZHX0JBU0lDX01DU19TRVQgICAgMTY2CisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9NQ1NfU0VUICAgIDE2NworI2RlZmluZSBXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWSAgICAxNjgKKyNkZWZpbmUgV05JX0NGR19NQVhfQU1TRFVfTEVOR1RIICAgIDE2OQorI2RlZmluZSBXTklfQ0ZHX01QRFVfREVOU0lUWSAgICAxNzAKKyNkZWZpbmUgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SICAgIDE3MQorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaICAgIDE3MgorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaICAgIDE3MworI2RlZmluZSBXTklfQ0ZHX1JJRlNfRU5BQkxFRCAgICAxNzQKKyNkZWZpbmUgV05JX0NGR19NQVhfUFNfUE9MTCAgICAxNzUKKyNkZWZpbmUgV05JX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0UgICAgMTc2CisjZGVmaW5lIFdOSV9DRkdfUlNTSV9GSUxURVJfUEVSSU9EICAgIDE3NworI2RlZmluZSBXTklfQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRCAgICAxNzgKKyNkZWZpbmUgV05JX0NGR19NSU5fUlNTSV9USFJFU0hPTEQgICAgMTc5CisjZGVmaW5lIFdOSV9DRkdfTlRIX0JFQUNPTl9GSUxURVIgICAgMTgwCisjZGVmaW5lIFdOSV9DRkdfQlJPQURDQVNUX0ZSQU1FX0ZJTFRFUl9FTkFCTEUgICAgMTgxCisjZGVmaW5lIFdOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkUgICAgMTgyCisjZGVmaW5lIFdOSV9DRkdfSUdOT1JFX0RUSU0gICAgMTgzCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX1VDQVNUX1BBVFRFUk5fRklMVEVSX0VOQUJMRSAgICAxODQKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fQ0hBTk5FTF9TV0lUQ0hfRU5BQkxFICAgIDE4NQorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9ERUFVVEhfRU5BQkxFICAgIDE4NgorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9ESVNBU1NPQ19FTkFCTEUgICAgMTg3CisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX01BWF9NSVNTRURfQkVBQ09OICAgIDE4OAorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9NQVhfU0xFRVBfUEVSSU9EICAgIDE4OQorI2RlZmluZSBXTklfQ0ZHX0JBX1RJTUVPVVQgICAgMTkwCisjZGVmaW5lIFdOSV9DRkdfQkFfVEhSRVNIT0xEX0hJR0ggICAgMTkxCisjZGVmaW5lIFdOSV9DRkdfTUFYX0JBX0JVRkZFUlMgICAgMTkyCisjZGVmaW5lIFdOSV9DRkdfTUFYX0JBX1NFU1NJT05TICAgIDE5MworI2RlZmluZSBXTklfQ0ZHX0JBX0FVVE9fU0VUVVAgICAgMTk0CisjZGVmaW5lIFdOSV9DRkdfQUREQkFfUkVRX0RFQ0xJTkUgICAgMTk1CisjZGVmaW5lIFdOSV9DRkdfQkdfU0NBTl9DSEFOTkVMX0xJU1QgICAgMTk2CisjZGVmaW5lIFdOSV9DRkdfTUFYX01FRElVTV9USU1FICAgIDE5NworI2RlZmluZSBXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVSAgICAxOTgKKyNkZWZpbmUgV05JX0NGR19JQlNTX0FVVE9fQlNTSUQgICAgMTk5CisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9GTEFHICAgIDIwMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfREFUQSAgICAyMDEKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0ZMQUcgICAgMjAyCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMSAgICAyMDMKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEyICAgIDIwNAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTMgICAgMjA1CisjZGVmaW5lIFdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9GTEFHICAgIDIwNgorI2RlZmluZSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfREFUQSAgICAyMDcKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0ZMQUcgICAgMjA4CisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9EQVRBICAgIDIwOQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0ZMQUcgICAgMjEwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfREFUQSAgICAyMTEKKyNkZWZpbmUgV05JX0NGR19XUFNfRU5BQkxFICAgIDIxMgorI2RlZmluZSBXTklfQ0ZHX1dQU19TVEFURSAgICAyMTMKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJPQkVfUkVRX0ZMQUcgICAgMjE0CisjZGVmaW5lIFdOSV9DRkdfV1BTX1ZFUlNJT04gICAgMjE1CisjZGVmaW5lIFdOSV9DRkdfV1BTX1JFUVVFU1RfVFlQRSAgICAyMTYKKyNkZWZpbmUgV05JX0NGR19XUFNfQ0ZHX01FVEhPRCAgICAyMTcKKyNkZWZpbmUgV05JX0NGR19XUFNfVVVJRCAgICAyMTgKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJJTUFSWV9ERVZJQ0VfQ0FURUdPUlkgICAgMjE5CisjZGVmaW5lIFdOSV9DRkdfV1BTX1BJTUFSWV9ERVZJQ0VfT1VJICAgIDIyMAorI2RlZmluZSBXTklfQ0ZHX1dQU19ERVZJQ0VfU1VCX0NBVEVHT1JZICAgIDIyMQorI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ0lBVElPTl9TVEFURSAgICAyMjIKKyNkZWZpbmUgV05JX0NGR19XUFNfQ09ORklHVVJBVElPTl9FUlJPUiAgICAyMjMKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEICAgIDIyNAorI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ19NRVRIT0QgICAgMjI1CisjZGVmaW5lIFdOSV9DRkdfTE9XX0dBSU5fT1ZFUlJJREUgICAgMjI2CisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX1BIWV9BR0NfTElTVEVOX01PREUgICAgMjI3CisjZGVmaW5lIFdOSV9DRkdfUlBFX1BPTExJTkdfVEhSRVNIT0xEICAgIDIyOAorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMF9SRUcgICAgMjI5CisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMxX1JFRyAgICAyMzAKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzJfUkVHICAgIDIzMQorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDM19SRUcgICAgMjMyCisjZGVmaW5lIFdOSV9DRkdfTk9fT0ZfT05DSElQX1JFT1JERVJfU0VTU0lPTlMgICAgMjMzCisjZGVmaW5lIFdOSV9DRkdfU0lOR0xFX1RJRF9SQyAgICAyMzQKKyNkZWZpbmUgV05JX0NGR19SUk1fRU5BQkxFRCAgICAyMzUKKyNkZWZpbmUgV05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYICAgIDIzNgorI2RlZmluZSBXTklfQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYICAgIDIzNworI2RlZmluZSBXTklfQ0ZHX1RYX1BXUl9DVFJMX0VOQUJMRSAgICAyMzgKKyNkZWZpbmUgV05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElORyAgICAyMzkKKyNkZWZpbmUgV05JX0NGR19CVENfREhDUF9CVF9TTE9UU19UT19CTE9DSyAgICAyNDAKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BTX1BPTExfVkFMVUUgICAgMjQxCisjZGVmaW5lIFdOSV9DRkdfUFNfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VUICAgIDI0MgorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTiAgICAyNDMKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSSAgICAyNDQKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlMgICAgMjQ1CisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJICAgIDI0NgorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlMgICAgMjQ3CisjZGVmaW5lIFdOSV9DRkdfQlRDX0EyRFBfREhDUF9CVF9TVUJfSU5URVJWQUxTICAgIDI0OAorI2RlZmluZSBXTklfQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRCAgICAyNDkKKyNkZWZpbmUgV05JX0NGR19BU1NPQ19TVEFfTElNSVQgICAgMjUwCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX1NUQVJUX0NIQU5ORUwgICAgMjUxCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX0VORF9DSEFOTkVMICAgIDI1MgorI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9PUEVSQVRJTkdfQkFORCAgICAyNTMKKyNkZWZpbmUgV05JX0NGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EICAgIDI1NAorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWCAgICAyNTYKKyNkZWZpbmUgV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVQgICAgMjU3CisjZGVmaW5lIFdOSV9DRkdfR09fS0VFUF9BTElWRV9USU1FT1VUICAgIDI1OAorCisvKgorICogU3RyaW5nIHBhcmFtZXRlciBsZW5ndGhzIAorICovCisKKyNkZWZpbmUgV05JX0NGR19TVEFfSURfTEVOICAgIDYKKyNkZWZpbmUgV05JX0NGR19TU0lEX0xFTiAgICAzMgorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8xX0xFTiAgICAxMworI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8yX0xFTiAgICAxMworI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8zX0xFTiAgICAxMworI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV80X0xFTiAgICAxMworI2RlZmluZSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUJfTEVOICAgIDQKKyNkZWZpbmUgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBX0xFTiAgICA4CisjZGVmaW5lIFdOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOICAgIDEyCisjZGVmaW5lIFdOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOICAgIDgKKyNkZWZpbmUgV05JX0NGR19QUk9QUklFVEFSWV9PUEVSQVRJT05BTF9SQVRFX1NFVF9MRU4gICAgNAorI2RlZmluZSBXTklfQ0ZHX0JTU0lEX0xFTiAgICA2CisjZGVmaW5lIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTiAgICAxMDAKKyNkZWZpbmUgV05JX0NGR19NQU5VRkFDVFVSRVJfT1VJX0xFTiAgICAzCisjZGVmaW5lIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX05BTUVfTEVOICAgIDY1CisjZGVmaW5lIFdOSV9DRkdfTU9ERUxfTlVNQkVSX0xFTiAgICAzMworI2RlZmluZSBXTklfQ0ZHX01PREVMX05BTUVfTEVOICAgIDMzCisjZGVmaW5lIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfTkFNRV9MRU4gICAgMzMKKyNkZWZpbmUgV05JX0NGR19NQU5VRkFDVFVSRVJfUFJPRFVDVF9WRVJTSU9OX0xFTiAgICAzMworI2RlZmluZSBXTklfQ0ZHX01BWF9UWF9QT1dFUl8yXzRfTEVOICAgIDEyOAorI2RlZmluZSBXTklfQ0ZHX01BWF9UWF9QT1dFUl81X0xFTiAgICAxMjgKKyNkZWZpbmUgV05JX0NGR19BUF9OT0RFX05BTUVfTEVOICAgIDMyCisjZGVmaW5lIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiAgICAzCisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDVklfTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNWT19MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ0JLX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDQkVfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNWSV9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ1ZPX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDQktfTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNCRV9MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ1ZJX0xPQ0FMX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVk9fTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNCS19MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ0JFX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVklfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNWT19MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDQktfTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ0JFX0xPQ0FMX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNWSV9MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDVk9fTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ0JLX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNCRV9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDVklfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ1ZPX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX1JBREFSX0NIQU5ORUxfTElTVF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVF9MRU4gICAgMTI4CisjZGVmaW5lIFdOSV9DRkdfU1VQUE9SVEVEX01DU19TRVRfTEVOICAgIDE2CisjZGVmaW5lIFdOSV9DRkdfQkFTSUNfTUNTX1NFVF9MRU4gICAgMTYKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX01DU19TRVRfTEVOICAgIDE2CisjZGVmaW5lIFdOSV9DRkdfQkdfU0NBTl9DSEFOTkVMX0xJU1RfTEVOICAgIDEwMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfREFUQV9MRU4gICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMV9MRU4gICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMl9MRU4gICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBM19MRU4gICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9EQVRBX0xFTiAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0RBVEFfTEVOICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEFfTEVOICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1dQU19VVUlEX0xFTiAgICAxNgorCisvKgorICogSW50ZWdlciBwYXJhbWV0ZXIgbWluL21heC9kZWZhdWx0IHZhbHVlcyAKKyAqLworCisjZGVmaW5lIFdOSV9DRkdfQ0ZfUE9MTEFCTEVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NGX1BPTExBQkxFX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19DRl9QT0xMQUJMRV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19DRlBfUEVSSU9EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0ZQX1BFUklPRF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfQ0ZQX1BFUklPRF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfQ0ZQX1BFUklPRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0ZQX1BFUklPRF9BUE1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19DRlBfUEVSSU9EX0FQREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT05fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19DRlBfTUFYX0RVUkFUSU9OX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT05fU1RBREVGICAgIDMwMDAwCisKKyNkZWZpbmUgV05JX0NGR19DRlBfTUFYX0RVUkFUSU9OX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19DRlBfTUFYX0RVUkFUSU9OX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQ0ZQX01BWF9EVVJBVElPTl9BUERFRiAgICAzMDAwMAorCisjZGVmaW5lIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTF9TVEFERUYgICAgMTAwCisKKyNkZWZpbmUgV05JX0NGR19CRUFDT05fSU5URVJWQUxfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTF9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTF9BUERFRiAgICAxMDAKKworI2RlZmluZSBXTklfQ0ZHX0RUSU1fUEVSSU9EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFRJTV9QRVJJT0RfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfRFRJTV9QRVJJT0RfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0RUSU1fUEVSSU9EX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19EVElNX1BFUklPRF9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0RUSU1fUEVSSU9EX0FQREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIX1NUQU1JTiAgICA1CisjZGVmaW5lIFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfU1RBTUFYICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfU1RBREVGICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIX0FQTUlOICAgIDUKKyNkZWZpbmUgV05JX0NGR19XRVBfS0VZX0xFTkdUSF9BUE1BWCAgICAxMworI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIX0FQREVGICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzUgICAgNQorI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzICAgIDEzCisKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEX1NUQU1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRF9BUE1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSURfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSURfMCAgICAwCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSURfMSAgICAxCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSURfMiAgICAyCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSURfMyAgICAzCisKKyNkZWZpbmUgV05JX0NGR19FWENMVURFX1VORU5DUllQVEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRVhDTFVERV9VTkVOQ1JZUFRFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURURfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURURfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURURfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JUU19USFJFU0hPTERfU1RBTUFYICAgIDIzNDcKKyNkZWZpbmUgV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQURFRiAgICAyMzQ3CisKKyNkZWZpbmUgV05JX0NGR19SVFNfVEhSRVNIT0xEX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SVFNfVEhSRVNIT0xEX0FQTUFYICAgIDIzNDcKKyNkZWZpbmUgV05JX0NGR19SVFNfVEhSRVNIT0xEX0FQREVGICAgIDIzNDcKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVRfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlUX1NUQURFRiAgICA2CisKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9SRVRSWV9MSU1JVF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVRfQVBNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVRfQVBERUYgICAgNgorCisjZGVmaW5lIFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVRfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVRfU1RBREVGICAgIDYKKworI2RlZmluZSBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVRfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVRfQVBNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVF9BUERFRiAgICA2CisKKyNkZWZpbmUgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNSU4gICAgMjU2CisjZGVmaW5lIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBTUFYICAgIDgwMDAKKyNkZWZpbmUgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFERUYgICAgODAwMAorCisjZGVmaW5lIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfQVBNSU4gICAgMjU2CisjZGVmaW5lIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfQVBNQVggICAgODAwMAorI2RlZmluZSBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX0FQREVGICAgIDgwMDAKKworI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19BQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUVfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19BQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9BUERFRiAgICAyMAorCisjZGVmaW5lIFdOSV9DRkdfQUNUSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQUNUSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NQVhJTVVNX0NIQU5ORUxfVElNRV9TVEFERUYgICAgNDAKKworI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NQVhJTVVNX0NIQU5ORUxfVElNRV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQUNUSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQUNUSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX0FQREVGICAgIDQwCisKKyNkZWZpbmUgV05JX0NGR19QQVNTSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUEFTU0lWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19QQVNTSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FX1NUQURFRiAgICA2MAorCisjZGVmaW5lIFdOSV9DRkdfUEFTU0lWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUEFTU0lWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUVfQVBERUYgICAgNjAKKworI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBREVGICAgIDExMAorCisjZGVmaW5lIFdOSV9DRkdfUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRV9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfQVBERUYgICAgMTEwCisKKyNkZWZpbmUgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0pPSU5fRkFJTFVSRV9USU1FT1VUX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0pPSU5fRkFJTFVSRV9USU1FT1VUX1NUQURFRiAgICAzMDAwCisKKyNkZWZpbmUgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSk9JTl9GQUlMVVJFX1RJTUVPVVRfQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVF9BUERFRiAgICAzMDAwCisKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVEVfRkFJTFVSRV9USU1FT1VUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVEVfRkFJTFVSRV9USU1FT1VUX1NUQURFRiAgICAxMDAwCisKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVEVfRkFJTFVSRV9USU1FT1VUX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVEVfRkFJTFVSRV9USU1FT1VUX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVF9BUERFRiAgICAxMDAwCisKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVEVfUlNQX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVEVfUlNQX1RJTUVPVVRfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VUX1NUQURFRiAgICAxMDAwCisKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVEVfUlNQX1RJTUVPVVRfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9SU1BfVElNRU9VVF9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9SU1BfVElNRU9VVF9BUERFRiAgICAxMDAwCisKKyNkZWZpbmUgV05JX0NGR19BU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVRfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUX1NUQURFRiAgICAyMDAwCisKKyNkZWZpbmUgV05JX0NGR19BU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVRfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9BUERFRiAgICAzMDAwCisKKyNkZWZpbmUgV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JFQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1JFQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUX1NUQURFRiAgICAyMDAwCisKKyNkZWZpbmUgV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVRfQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9BUERFRiAgICAzMDAwCisKKyNkZWZpbmUgV05JX0NGR19SQV9QRVJJT0RJQ0lUWV9USU1FT1VUX0lOX1BTX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkFfUEVSSU9ESUNJVFlfVElNRU9VVF9JTl9QU19TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SQV9QRVJJT0RJQ0lUWV9USU1FT1VUX0lOX1BTX1NUQURFRiAgICAxMDAwCisKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9CQ05fRklMVEVSX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVJfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9IRUFSVF9CRUFUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX0hFQVJUX0JFQVRfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfSEVBUlRfQkVBVF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1JfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfUlNTSV9NT05JVE9SX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9TVEFERUYgICAgMjAKKworI2RlZmluZSBXTklfQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkZfU0VUVExJTkdfVElNRV9DTEtfU1RBTUFYICAgIDYwMDAwCisjZGVmaW5lIFdOSV9DRkdfUkZfU0VUVExJTkdfVElNRV9DTEtfU1RBREVGICAgIDE1MDAKKworI2RlZmluZSBXTklfQ0ZHX1BIWV9NT0RFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUEhZX01PREVfU1RBTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19QSFlfTU9ERV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUEhZX01PREVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BIWV9NT0RFX0FQTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19QSFlfTU9ERV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QSFlfTU9ERV8xMUEgICAgMAorI2RlZmluZSBXTklfQ0ZHX1BIWV9NT0RFXzExQiAgICAxCisjZGVmaW5lIFdOSV9DRkdfUEhZX01PREVfMTFHICAgIDIKKyNkZWZpbmUgV05JX0NGR19QSFlfTU9ERV9OT05FICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19ET1QxMV9NT0RFX1NUQU1BWCAgICA5CisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9BUE1BWCAgICA5CisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19ET1QxMV9NT0RFX0FMTCAgICAwCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUEgICAgMQorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfMTFCICAgIDIKKyNkZWZpbmUgV05JX0NGR19ET1QxMV9NT0RFXzExRyAgICAzCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV8xMU4gICAgNAorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfUE9MQVJJUyAgICA1CisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9USVRBTiAgICA2CisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9UQVVSVVMgICAgNworI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfMTFHX09OTFkgICAgOAorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfMTFOX09OTFkgICAgOQorCisjZGVmaW5lIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19MSVNURU5fSU5URVJWQUxfQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19MSVNURU5fSU5URVJWQUxfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1BWCAgICAxNjUKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX0NIQU5ORUxfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX0FQTUFYICAgIDE2NQorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTF9BUERFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haX1NUQU1BWCAgICAxMQorI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haX1NUQURFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWl9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzVHSFpfQVBNQVggICAgMTEKKyNkZWZpbmUgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWl9BUERFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFpfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFpfU1RBTUFYICAgIDMxCisjZGVmaW5lIFdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFpfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWl9BUE1BWCAgICAzMQorI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWl9BUERFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19SQVRFX0FEQVBUQVRJT05fVFlQRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JBVEVfQURBUFRBVElPTl9UWVBFX1NUQU1BWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1JBVEVfQURBUFRBVElPTl9UWVBFX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SQVRFX0FEQVBUQVRJT05fVFlQRV9BUE1BWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEVfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEVfRklYRUQgICAgMAorI2RlZmluZSBXTklfQ0ZHX1JBVEVfQURBUFRBVElPTl9UWVBFX0FVVE8gICAgMQorI2RlZmluZSBXTklfQ0ZHX1JBVEVfQURBUFRBVElPTl9UWVBFX1NOUl9CQVNFRCAgICAyCisKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9TVEFNQVggICAgMzEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX0FQTUFYICAgIDMxCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX0FVVE8gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMU1CUFMgICAgMQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMk1CUFMgICAgMgorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNV81TUJQUyAgICAzCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8xMU1CUFMgICAgNAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNk1CUFMgICAgNQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfOU1CUFMgICAgNgorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMTJNQlBTICAgIDcKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzE4TUJQUyAgICA4CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8yNE1CUFMgICAgOQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMzZNQlBTICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV80OE1CUFMgICAgMTEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzU0TUJQUyAgICAxMgorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNl81TUJQU19NQ1MwXzIwTUhaX1NJTU8gICAgMTMKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzEzTUJQU19NQ1MxXzIwTUhaX1NJTU8gICAgMTQKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzE5XzVNQlBTX01DUzJfMjBNSFpfU0lNTyAgICAxNQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMjZNQlBTX01DUzNfMjBNSFpfU0lNTyAgICAxNgorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMzlNQlBTX01DUzRfMjBNSFpfU0lNTyAgICAxNworI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNTJNQlBTX01DUzVfMjBNSFpfU0lNTyAgICAxOAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNThfNU1CUFNfTUNTNl8yME1IWl9TSU1PICAgIDE5CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV82NU1CUFNfTUNTN18yME1IWl9TSU1PICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV83XzJNQlBTX01DUzBfMjBNSFpfU0lNT19TR0kgICAgMjEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzE0XzRNQlBTX01DUzFfMjBNSFpfU0lNT19TR0kgICAgMjIKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzIxXzdNQlBTX01DUzJfMjBNSFpfU0lNT19TR0kgICAgMjMKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzI4XzlNQlBTX01DUzNfMjBNSFpfU0lNT19TR0kgICAgMjQKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzQzXzNNQlBTX01DUzRfMjBNSFpfU0lNT19TR0kgICAgMjUKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzU3XzhNQlBTX01DUzVfMjBNSFpfU0lNT19TR0kgICAgMjYKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzY1TUJQU19NQ1M2XzIwTUhaX1NJTU9fU0dJICAgIDI3CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV83Ml8yTUJQU19NQ1M3XzIwTUhaX1NJTU9fU0dJICAgIDI4CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8wXzI1TUJQU19TTFJfMjBNSFpfU0lNTyAgICAyOQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMF81TUJQU19TTFJfMjBNSFpfU0lNTyAgICAzMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNjhfMjVNQlBTX1FDX1BST1BfMjBNSFpfU0lNTyAgICAzMQorCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFpfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWl9TVEFNQVggICAgMzEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWl9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFpfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzI0R0haX0FQTUFYICAgIDMxCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFpfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFpfU1RBTUFYICAgIDMxCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWl9TVEFERUYgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWl9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWl9BUE1BWCAgICAzMQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFpfQVBERUYgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfU1RBREVGICAgIDQKKworI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfQVBNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9BUERFRiAgICA0CisKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfUE9MSUNZX01JTl9TVVBQT1JURUQgICAgMAorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfUFJJTUFSWSAgICAxCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9SRVNFUlZFRCAgICAyCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9DTE9TRVNUICAgIDMKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfUE9MSUNZX0FVVE9TRUxFQ1QgICAgNAorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfTUFYICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9TRUNPTkRBUllfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9TRUNPTkRBUllfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfVEVSVElBUllfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BUFNEX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BUFNEX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19BUFNEX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FQU0RfRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVBTRF9FTkFCTEVEX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19BUFNEX0VOQUJMRURfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfU0hBUkVEX0tFWV9BVVRIX0VOQUJMRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NIQVJFRF9LRVlfQVVUSF9FTkFCTEVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFX0FQREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX09QRU5fU1lTVEVNX0FVVEhfRU5BQkxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19PUEVOX1NZU1RFTV9BVVRIX0VOQUJMRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX09QRU5fU1lTVEVNX0FVVEhfRU5BQkxFX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19PUEVOX1NZU1RFTV9BVVRIX0VOQUJMRV9BUERFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRJT05fVFlQRV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRJT05fVFlQRV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19DRl9QT0xMX1JFUVVFU1RfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NGX1BPTExfUkVRVUVTVF9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQ0ZfUE9MTF9SRVFVRVNUX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJJVkFDWV9FTkFCTEVEX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUklWQUNZX0VOQUJMRURfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRF9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9QUkVBTUJMRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9QUkVBTUJMRV9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEVfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9TTE9UX1RJTUVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRV9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FDQ0VQVF9TSE9SVF9TTE9UX0FTU09DX09OTFlfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BQ0NFUFRfU0hPUlRfU0xPVF9BU1NPQ19PTkxZX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQUNDRVBUX1NIT1JUX1NMT1RfQVNTT0NfT05MWV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQUNDRVBUX1NIT1JUX1NMT1RfQVNTT0NfT05MWV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQUNDRVBUX1NIT1JUX1NMT1RfQVNTT0NfT05MWV9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQUNDRVBUX1NIT1JUX1NMT1RfQVNTT0NfT05MWV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19RT1NfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1FPU19FTkFCTEVEX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUU9TX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1FPU19FTkFCTEVEX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19RT1NfRU5BQkxFRF9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUU9TX0VOQUJMRURfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfSENGX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19IQ0ZfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0hDRl9FTkFCTEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19IQ0ZfRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSENGX0VOQUJMRURfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0hDRl9FTkFCTEVEX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1JTTl9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlNOX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19SU05fRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUlNOX0VOQUJMRURfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JTTl9FTkFCTEVEX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19SU05fRU5BQkxFRF9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19CQUNLR1JPVU5EX1NDQU5fUEVSSU9EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQkFDS0dST1VORF9TQ0FOX1BFUklPRF9TVEFNQVggICAgMTgwMDAwCisjZGVmaW5lIFdOSV9DRkdfQkFDS0dST1VORF9TQ0FOX1BFUklPRF9TVEFERUYgICAgNTAwMAorCisjZGVmaW5lIFdOSV9DRkdfQkFDS0dST1VORF9TQ0FOX1BFUklPRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQkFDS0dST1VORF9TQ0FOX1BFUklPRF9BUE1BWCAgICAxODAwMAorI2RlZmluZSBXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9QRVJJT0RfQVBERUYgICAgNTAwMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX05VTV9QUkVfQVVUSF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9OVU1fUFJFX0FVVEhfU1RBTUFYICAgIDI1NgorI2RlZmluZSBXTklfQ0ZHX01BWF9OVU1fUFJFX0FVVEhfU1RBREVGICAgIDY0CisKKyNkZWZpbmUgV05JX0NGR19NQVhfTlVNX1BSRV9BVVRIX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfTlVNX1BSRV9BVVRIX0FQTUFYICAgIDI1NgorI2RlZmluZSBXTklfQ0ZHX01BWF9OVU1fUFJFX0FVVEhfQVBERUYgICAgNjQKKworI2RlZmluZSBXTklfQ0ZHX1BSRUFVVEhfQ0xOVVBfVElNRU9VVF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJFQVVUSF9DTE5VUF9USU1FT1VUX0FQTUFYICAgIDEyMDAwMAorI2RlZmluZSBXTklfQ0ZHX1BSRUFVVEhfQ0xOVVBfVElNRU9VVF9BUERFRiAgICAzMDAwMAorCisjZGVmaW5lIFdOSV9DRkdfUkVMRUFTRV9BSURfVElNRU9VVF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkVMRUFTRV9BSURfVElNRU9VVF9BUE1BWCAgICAxMDAwMDAKKyNkZWZpbmUgV05JX0NGR19SRUxFQVNFX0FJRF9USU1FT1VUX0FQREVGICAgIDEwMDAKKworI2RlZmluZSBXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTERfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTERfU1RBREVGICAgIDQwCisKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9BRlRFUl9IQl9GQUlMX1RJTUVPVVRfU1RBTUlOICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VUX1NUQU1BWCAgICAxMDAwMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVF9TVEFERUYgICAgNDAKKworI2RlZmluZSBXTklfQ0ZHX1BST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVF9BUE1JTiAgICAxMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVF9BUE1BWCAgICAxMDAwMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVF9BUERFRiAgICA0MAorCisjZGVmaW5lIFdOSV9DRkdfMTFEX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR18xMURfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHXzExRF9FTkFCTEVEX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR18xMURfRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfMTFEX0VOQUJMRURfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHXzExRF9FTkFCTEVEX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX05FVFdPUktfREVOU0lUWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX05FVFdPUktfREVOU0lUWV9TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX05FVFdPUktfREVOU0lUWV9TVEFERUYgICAgMworCisjZGVmaW5lIFdOSV9DRkdfTkVUV09SS19ERU5TSVRZX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfQVBNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX05FVFdPUktfREVOU0lUWV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfTE9XICAgIDAKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfTUVESVVNICAgIDEKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfSElHSCAgICAyCisjZGVmaW5lIFdOSV9DRkdfTkVUV09SS19ERU5TSVRZX0FEQVBUSVZFICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX0FEQVBUSVZFX1RIUkVTSE9MRF9BTEdPUklUSE1fU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19BREFQVElWRV9USFJFU0hPTERfQUxHT1JJVEhNX1NUQU1BWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfQURBUFRJVkVfVEhSRVNIT0xEX0FMR09SSVRITV9TVEFERUYgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfQURBUFRJVkVfVEhSRVNIT0xEX0FMR09SSVRITV9BUE1JTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfQURBUFRJVkVfVEhSRVNIT0xEX0FMR09SSVRITV9BUE1BWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfQURBUFRJVkVfVEhSRVNIT0xEX0FMR09SSVRITV9BUERFRiAgICAyCisKKyNkZWZpbmUgV05JX0NGR19BREFQVElWRV9USFJFU0hPTERfQUxHT1JJVEhNX0NBUlJJRVIgICAgMQorI2RlZmluZSBXTklfQ0ZHX0FEQVBUSVZFX1RIUkVTSE9MRF9BTEdPUklUSE1fQ09SUkVMQVRJT04gICAgMgorCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BX1NUQU1JTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1RYX0FOVEVOTkFfQVBNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfVFhfQU5URU5OQV9BUE1BWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BX0FQREVGICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfUlhfQU5URU5OQV9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfUlhfQU5URU5OQV9TVEFNQVggICAgMgorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfUlhfQU5URU5OQV9TVEFERUYgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BX0FQTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1JYX0FOVEVOTkFfQVBNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfUlhfQU5URU5OQV9BUERFRiAgICAzCisKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9TVEFNQVggICAgMTI4CisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9TVEFERUYgICAgMjcKKworI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfVFhfUE9XRVJfTEVWRUxfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfVFhfUE9XRVJfTEVWRUxfQVBNQVggICAgMTI4CisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9BUERFRiAgICAyNworCisjZGVmaW5lIFdOSV9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9TVEFERUYgICAgNzg1CisKKyNkZWZpbmUgV05JX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU5fQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9BUERFRiAgICA3ODUKKworI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9PRkYgICAgMAorI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9PTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOX1RYICAgIDIKKyNkZWZpbmUgV05JX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU5fUlggICAgMworI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9NQVNLICAgIDE1CisjZGVmaW5lIFdOSV9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOX0NIQUlOXzBfT0ZGU0VUICAgIDAKKyNkZWZpbmUgV05JX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU5fQ0hBSU5fMV9PRkZTRVQgICAgNAorI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9DSEFJTl8yX09GRlNFVCAgICA4CisKKyNkZWZpbmUgV05JX0NGR19ORVdfQlNTX0ZPVU5EX0lORF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX05FV19CU1NfRk9VTkRfSU5EX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfTkVXX0JTU19GT1VORF9JTkRfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX05FV19CU1NfRk9VTkRfSU5EX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19ORVdfQlNTX0ZPVU5EX0lORF9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfTkVXX0JTU19GT1VORF9JTkRfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfQU5JX0ZFQVRVUkVTX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9QUklFVEFSWV9BTklfRkVBVFVSRVNfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST1BSSUVUQVJZX0FOSV9GRUFUVVJFU19FTkFCTEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9QUklFVEFSWV9BTklfRkVBVFVSRVNfRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfQU5JX0ZFQVRVUkVTX0VOQUJMRURfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST1BSSUVUQVJZX0FOSV9GRUFUVVJFU19FTkFCTEVEX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BST1BSSUVUQVJZX1JBVEVTX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9QUklFVEFSWV9SQVRFU19FTkFCTEVEX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRF9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRF9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR18xMUhfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHXzExSF9FTkFCTEVEX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfMTFIX0VOQUJMRURfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHXzExSF9FTkFCTEVEX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR18xMUhfRU5BQkxFRF9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfMTFIX0VOQUJMRURfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfU1RBTUlOICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfU1RBTUFYICAgIDMwMDAKKyNkZWZpbmUgV05JX0NGR19XVF9DTkZfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfQVBNSU4gICAgMTAKKyNkZWZpbmUgV05JX0NGR19XVF9DTkZfVElNRU9VVF9BUE1BWCAgICAzMDAwCisjZGVmaW5lIFdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfQVBERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfS0VFUEFMSVZFX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19LRUVQQUxJVkVfVElNRU9VVF9TVEFNQVggICAgMzYwMDAwMAorI2RlZmluZSBXTklfQ0ZHX0tFRVBBTElWRV9USU1FT1VUX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19LRUVQQUxJVkVfVElNRU9VVF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfS0VFUEFMSVZFX1RJTUVPVVRfQVBNQVggICAgMzYwMDAwMAorI2RlZmluZSBXTklfQ0ZHX0tFRVBBTElWRV9USU1FT1VUX0FQREVGICAgIDMwMDAKKworI2RlZmluZSBXTklfQ0ZHX1BST1hJTUlUWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST1hJTUlUWV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST1hJTUlUWV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPWElNSVRZX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9YSU1JVFlfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST1hJTUlUWV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9YSU1JVFlfT0ZGICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9YSU1JVFlfT04gICAgMQorCisjZGVmaW5lIFdOSV9DRkdfTE9HX0xFVkVMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTE9HX0xFVkVMX1NUQU1BWCAgICA3CisjZGVmaW5lIFdOSV9DRkdfTE9HX0xFVkVMX1NUQURFRiAgICAzCisKKyNkZWZpbmUgV05JX0NGR19MT0dfTEVWRUxfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0xPR19MRVZFTF9BUE1BWCAgICA3CisjZGVmaW5lIFdOSV9DRkdfTE9HX0xFVkVMX0FQREVGICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX09MQkNfREVURUNUX1RJTUVPVVRfU1RBTUlOICAgIDEwMDAKKyNkZWZpbmUgV05JX0NGR19PTEJDX0RFVEVDVF9USU1FT1VUX1NUQU1BWCAgICAzMDAwMAorI2RlZmluZSBXTklfQ0ZHX09MQkNfREVURUNUX1RJTUVPVVRfU1RBREVGICAgIDEwMDAwCisKKyNkZWZpbmUgV05JX0NGR19PTEJDX0RFVEVDVF9USU1FT1VUX0FQTUlOICAgIDEwMDAKKyNkZWZpbmUgV05JX0NGR19PTEJDX0RFVEVDVF9USU1FT1VUX0FQTUFYICAgIDMwMDAwCisjZGVmaW5lIFdOSV9DRkdfT0xCQ19ERVRFQ1RfVElNRU9VVF9BUERFRiAgICAxMDAwMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9TVEFERUYgICAgNjU1MzUKKworI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX0FQREVGICAgIDY1NTM1CisKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfRlJPTV9sbEEgICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9GUk9NX2xsQiAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX0ZST01fbGxHICAgIDIKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfSFRfMjAgICAgMworI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9OT05fR0YgICAgNAorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9MU0lHX1RYT1AgICAgNQorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9SSUZTICAgIDYKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0JTUyAgICA3CisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09MQkNfRlJPTV9sbEEgICAgOAorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX0ZST01fbGxCICAgIDkKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0xCQ19GUk9NX2xsRyAgICAxMAorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX0hUMjAgICAgMTEKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0xCQ19OT05fR0YgICAgMTIKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0xCQ19MU0lHX1RYT1AgICAgMTMKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0xCQ19SSUZTICAgIDE0CisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09MQkNfT0JTUyAgICAxNQorCisjZGVmaW5lIFdOSV9DRkdfMTFHX1BST1RFQ1RJT05fQUxXQVlTX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfMTFHX1BST1RFQ1RJT05fQUxXQVlTX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfMTFHX1BST1RFQ1RJT05fQUxXQVlTX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR18xMUdfUFJPVEVDVElPTl9BTFdBWVNfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHXzExR19QUk9URUNUSU9OX0FMV0FZU19BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfMTFHX1BST1RFQ1RJT05fQUxXQVlTX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fU1RBTUFYICAgIDUKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9TVEFERUYgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0FQTUFYICAgIDUKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9BUERFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFICAgIDAKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9DVFMgICAgMQorI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX1JUUyAgICAyCisjZGVmaW5lIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fRFVBTF9DVFMgICAgMworI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX1JUU19BTFdBWVMgICAgNAorI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0FVVE8gICAgNQorCisjZGVmaW5lIFdOSV9DRkdfMTFHX1NIT1JUX1BSRUFNQkxFX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHXzExR19TSE9SVF9QUkVBTUJMRV9FTkFCTEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfMTFHX1NIT1JUX1BSRUFNQkxFX0VOQUJMRURfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHXzExR19TSE9SVF9QUkVBTUJMRV9FTkFCTEVEX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVEX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRF9BUERFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19DQUxfUEVSSU9EX1NUQU1JTiAgICAyCisjZGVmaW5lIFdOSV9DRkdfQ0FMX1BFUklPRF9TVEFNQVggICAgMTAKKyNkZWZpbmUgV05JX0NGR19DQUxfUEVSSU9EX1NUQURFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19DQUxfUEVSSU9EX0FQTUlOICAgIDIKKyNkZWZpbmUgV05JX0NGR19DQUxfUEVSSU9EX0FQTUFYICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfQ0FMX1BFUklPRF9BUERFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19TVEFUU19QRVJJT0RfU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19TVEFUU19QRVJJT0RfU1RBTUFYICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfU1RBVFNfUEVSSU9EX1NUQURFRiAgICAxMAorCisjZGVmaW5lIFdOSV9DRkdfU1RBVFNfUEVSSU9EX0FQTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19TVEFUU19QRVJJT0RfQVBNQVggICAgMTAKKyNkZWZpbmUgV05JX0NGR19TVEFUU19QRVJJT0RfQVBERUYgICAgMTAKKworI2RlZmluZSBXTklfQ0ZHX0NBTF9DT05UUk9MX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0FMX0NPTlRST0xfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19DQUxfQ09OVFJPTF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQ0FMX0NPTlRST0xfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NBTF9DT05UUk9MX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19DQUxfQ09OVFJPTF9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19DQUxfQ09OVFJPTF9DQUxfT04gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NBTF9DT05UUk9MX0NBTF9PRkYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfMTFHX09OTFlfUE9MSUNZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfMTFHX09OTFlfUE9MSUNZX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfMTFHX09OTFlfUE9MSUNZX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR18xMUdfT05MWV9QT0xJQ1lfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHXzExR19PTkxZX1BPTElDWV9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfMTFHX09OTFlfUE9MSUNZX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUEFDS0VUX0NMQVNTSUZJQ0FUSU9OX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QQUNLRVRfQ0xBU1NJRklDQVRJT05fQVBNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QQUNLRVRfQ0xBU1NJRklDQVRJT05fRElTQUJMRUQgICAgMAorI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9EU0NQICAgIDEKKyNkZWZpbmUgV05JX0NGR19QQUNLRVRfQ0xBU1NJRklDQVRJT05fODAyMVAgICAgMgorI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9BTEwgICAgMworCisjZGVmaW5lIFdOSV9DRkdfV01FX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XTUVfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dNRV9FTkFCTEVEX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19XTUVfRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV01FX0VOQUJMRURfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dNRV9FTkFCTEVEX0FQREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0FERFRTX1JTUF9USU1FT1VUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQUREVFNfUlNQX1RJTUVPVVRfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQUREVFNfUlNQX1RJTUVPVVRfU1RBREVGICAgIDEwMDAKKworI2RlZmluZSBXTklfQ0ZHX0FERFRTX1JTUF9USU1FT1VUX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BRERUU19SU1BfVElNRU9VVF9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FERFRTX1JTUF9USU1FT1VUX0FQREVGICAgIDEwMDAKKworI2RlZmluZSBXTklfQ0ZHX01BWF9TUF9MRU5HVEhfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfU1BfTEVOR1RIX1NUQU1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfTUFYX1NQX0xFTkdUSF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX1NQX0xFTkdUSF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX1NQX0xFTkdUSF9BUE1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfTUFYX1NQX0xFTkdUSF9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19LRUVQX0FMSVZFX1NUQV9MSU1JVF9USFJFU0hPTERfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0tFRVBfQUxJVkVfU1RBX0xJTUlUX1RIUkVTSE9MRF9BUE1BWCAgICAzMgorI2RlZmluZSBXTklfQ0ZHX0tFRVBfQUxJVkVfU1RBX0xJTUlUX1RIUkVTSE9MRF9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19TRU5EX1NJTkdMRV9TU0lEX0FMV0FZU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NFTkRfU0lOR0xFX1NTSURfQUxXQVlTX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0VORF9TSU5HTEVfU1NJRF9BTFdBWVNfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1NFTkRfU0lOR0xFX1NTSURfQUxXQVlTX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19TRU5EX1NJTkdMRV9TU0lEX0FMV0FZU19BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0VORF9TSU5HTEVfU1NJRF9BTFdBWVNfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1NNX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XU01fRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dTTV9FTkFCTEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XU01fRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1NNX0VOQUJMRURfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dTTV9FTkFCTEVEX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfU1RBREVGICAgIDU3NTM1CisKKyNkZWZpbmUgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9BUERFRiAgICA0OTMyMQorCisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX0hDRiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZXzExRVFPUyAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX1dNRSAgICAyCisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX1dTTSAgICAzCisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX0VYVFJBVEVTICAgIDQKKyNkZWZpbmUgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfRVhUUkFURV9TVE9QICAgIDUKKyNkZWZpbmUgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfVElUQU4gICAgNgorI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9UQVVSVVMgICAgNworI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9FRENBUEFSQU1TICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX0xPQURJTkZPICAgIDE0CisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX1ZFUlNJT04gICAgMTUKKyNkZWZpbmUgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfTUFYQklUT0ZGU0VUICAgIDE1CisKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfQVBNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0FQREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9BTkkgICAgMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9XTU0gICAgMQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9USVRfREVNTyAgICAyCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX01BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0FDTV9JRFggICAgMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9BSUZTTl9JRFggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01JTkFfSURYICAgIDIKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNQVhBX0lEWCAgICA0CisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX1RYT1BBX0lEWCAgICA2CisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUlOQl9JRFggICAgNworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01BWEJfSURYICAgIDkKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfVFhPUEJfSURYICAgIDExCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUlOR19JRFggICAgMTIKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNQVhHX0lEWCAgICAxNAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9UWE9QR19JRFggICAgMTYKKworI2RlZmluZSBXTklfQ0ZHX1JERVRfRkxBR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JERVRfRkxBR19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1JERVRfRkxBR19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUkRFVF9GTEFHX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SREVUX0ZMQUdfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1JERVRfRkxBR19BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19SREVUX0ZMQUdfRU5BQkxFICAgIDEKKyNkZWZpbmUgV05JX0NGR19SREVUX0ZMQUdfRElTQUJMRSAgICAwCisKKyNkZWZpbmUgV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5UX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVF9BUE1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5UX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9TVEFNQVggICAgMgorI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfUE9MSUNZX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BRE1JVF9QT0xJQ1lfQVBNQVggICAgMgorI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BRE1JVF9QT0xJQ1lfQURNSVRfQUxMICAgIDAKKyNkZWZpbmUgV05JX0NGR19BRE1JVF9QT0xJQ1lfUkVKRUNUX0FMTCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfUE9MSUNZX0JXX0ZBQ1RPUiAgICAyCisKKyNkZWZpbmUgV05JX0NGR19BRE1JVF9CV0ZBQ1RPUl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FETUlUX0JXRkFDVE9SX1NUQU1BWCAgICAxMDAKKyNkZWZpbmUgV05JX0NGR19BRE1JVF9CV0ZBQ1RPUl9TVEFERUYgICAgMjAKKworI2RlZmluZSBXTklfQ0ZHX0FETUlUX0JXRkFDVE9SX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BRE1JVF9CV0ZBQ1RPUl9BUE1BWCAgICAxMDAKKyNkZWZpbmUgV05JX0NGR19BRE1JVF9CV0ZBQ1RPUl9BUERFRiAgICAyMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX0NPTlNFQ1VUSVZFX0JBQ0tHUk9VTkRfU0NBTl9GQUlMVVJFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX0NPTlNFQ1VUSVZFX0JBQ0tHUk9VTkRfU0NBTl9GQUlMVVJFX1NUQU1BWCAgICAyNTYKKyNkZWZpbmUgV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkVfU1RBREVGICAgIDYwCisKKyNkZWZpbmUgV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9DT05TRUNVVElWRV9CQUNLR1JPVU5EX1NDQU5fRkFJTFVSRV9BUE1BWCAgICAyNTYKKyNkZWZpbmUgV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkVfQVBERUYgICAgNjAKKworI2RlZmluZSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfU1RBTUFYICAgIDQKKyNkZWZpbmUgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0FQTUFYICAgIDQKKyNkZWZpbmUgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFICAgIDAKKyNkZWZpbmUgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9FTkFCTEUgICAgMQorI2RlZmluZSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0lGX05PX0xFR0FDWV9CU1MgICAgMgorI2RlZmluZSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0lGX05PX0xFR0FDWV9BTEwgICAgMworI2RlZmluZSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0lOVEVMTElHRU5UICAgIDQKKworI2RlZmluZSBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfU1RBTUFYICAgIDIKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFX0FQTUFYICAgIDIKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9OT05FICAgIDAKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9MT1dFUiAgICAxCisjZGVmaW5lIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfSElHSEVSICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk9fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPX1NUQURFRiAgICAyCisKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk9fQVBERUYgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9PTkVfU1RBREVGICAgIDQKKworI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORV9BUERFRiAgICA0CisKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV09fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV09fU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1RXT19TVEFERUYgICAgNgorCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfVFdPX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV09fQVBNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfVFdPX0FQREVGICAgIDYKKworI2RlZmluZSBXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU5fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19UUklHX1NUQV9CS19TQ0FOX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTl9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTl9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTl9BUERFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QUk9GSUxFX1NXSVRDSElOR19TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QUk9GSUxFX1NXSVRDSElOR19TVEFERUYgICAgMjU1CisKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfUFJPRklMRV9TV0lUQ0hJTkdfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QUk9GSUxFX1NXSVRDSElOR19VTlVTRUQgICAgMjU1CisKKyNkZWZpbmUgV05JX0NGR19NSU1PX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NSU1PX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19NSU1PX0VOQUJMRURfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX01JTU9fRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUlNT19FTkFCTEVEX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19NSU1PX0VOQUJMRURfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfTUlNT19FTkFCTEVEX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfTUlNT19FTkFCTEVEX0RJU0FCTEUgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRURfQVBNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEX0RFTEFZRUQgICAgMAorI2RlZmluZSBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEX0lNTUVESUFURSAgICAxCisKKyNkZWZpbmUgV05JX0NGR19CQV9BQ1RJVklUWV9DSEVDS19USU1FT1VUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQkFfQUNUSVZJVFlfQ0hFQ0tfVElNRU9VVF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19CQV9BQ1RJVklUWV9DSEVDS19USU1FT1VUX1NUQURFRiAgICAxMDAwCisKKyNkZWZpbmUgV05JX0NGR19CQV9BQ1RJVklUWV9DSEVDS19USU1FT1VUX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19CQV9BQ1RJVklUWV9DSEVDS19USU1FT1VUX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQkFfQUNUSVZJVFlfQ0hFQ0tfVElNRU9VVF9BUERFRiAgICAxMDAwCisKKyNkZWZpbmUgV05JX0NGR19IVF9SWF9TVEJDX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfUlhfU1RCQ19TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX0hUX1JYX1NUQkNfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0hUX1JYX1NUQkNfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX1JYX1NUQkNfQVBNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX0hUX1JYX1NUQkNfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19TVEFERUYgICAgMzY0CisKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19BUERFRiAgICA0MjA2CisKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19BRFZBTkNFX0NPRElORyAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fU1VQUE9SVEVEX0NIQU5fV0lEVEhfU0VUICAgIDEKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19TTV9QT1dFUl9TQVZFICAgIDIKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19HUkVFTl9GSUVMRCAgICA0CisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fU0hPUlRfR0lfMjBNSFogICAgNQorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NIT1JUX0dJXzQwTUhaICAgIDYKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19UWF9TVEJDICAgIDcKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19SWF9TVEJDICAgIDgKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19ERUxBWUVEX0JBICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fTUFYX0FNU0RVX1NJWkUgICAgMTEKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19EU1NTX0NDS19NT0RFXzQwTUhaICAgIDEyCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fUFNNUCAgICAxMworI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NUQkNfQ09OVFJPTF9GUkFNRSAgICAxNAorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX0xTSUdfVFhPUF9QUk9URUNUSU9OICAgIDE1CisKKyNkZWZpbmUgV05JX0NGR19IVF9BTVBEVV9QQVJBTVNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9BTVBEVV9QQVJBTVNfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNU19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9BTVBEVV9QQVJBTVNfQVBNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TX0FQREVGICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNU19NQVhfUlhfQU1QRFVfRkFDVE9SICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9BTVBEVV9QQVJBTVNfTVBEVV9ERU5TSVRZICAgIDIKKyNkZWZpbmUgV05JX0NGR19IVF9BTVBEVV9QQVJBTVNfUkVTRVJWRUQgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19TVEFERUYgICAgMTAyNAorCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19FWFRfSFRfQ0FQX0lORk9fQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19FWFRfSFRfQ0FQX0lORk9fQVBERUYgICAgMTAyNAorCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1BDTyAgICAwCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1RSQU5TSVRJT05fVElNRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1JFU0VSVkVEMSAgICAzCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX01DU19GRUVEQkFDSyAgICA4CisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX0hUQ19TVVBQT1JUICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPX1JEX1JFU1BPTkRFUiAgICAxMQorI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19SRVNFUlZFRDIgICAgMTIKKworI2RlZmluZSBXTklfQ0ZHX1RYX0JGX0NBUF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1RYX0JGX0NBUF9TVEFNQVggICAgNDI5NDk2NzI5NQorI2RlZmluZSBXTklfQ0ZHX1RYX0JGX0NBUF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVFhfQkZfQ0FQX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19UWF9CRl9DQVBfQVBNQVggICAgNDI5NDk2NzI5NQorI2RlZmluZSBXTklfQ0ZHX1RYX0JGX0NBUF9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BU19DQVBfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BU19DQVBfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BU19DQVBfQVBNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9BTlRFTk5BX1NFTEVDVElPTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX0VYUExJQ0lUX0NTSV9GRUVEQkFDS19UWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX0FOVEVOTkFfSU5ESUNFU19GRUVEQkFDS19UWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX0VYUExJQ0lUX0NTSV9GRUVEQkFDSyAgICAzCisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX0FOVEVOTkFfSU5ESUNFU19GRUVEQkFDSyAgICA0CisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX1JYX0FTICAgIDUKKyNkZWZpbmUgV05JX0NGR19BU19DQVBfVFhfU09VTkRJTkdfUFBEVVMgICAgNgorI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9SRVNFUlZFRCAgICA3CisKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQxX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9TVEFERUYgICAgMTUKKworI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQxX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9BUE1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9BUERFRiAgICAxNQorCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDFfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9SRUNPTU1FTkRFRF9DSEFOTkVMX1dJRFRIICAgIDIKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9SSUZTX01PREUgICAgMworI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQxX1BTTVBfQUNDRVNTX09OTFkgICAgNAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQxX1NFUlZJQ0VfSU5URVJWQUxfR1JBTlVMQVJJVFkgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDJfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMl9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDJfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQyX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDJfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDJfT1BfTU9ERSAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDJfTk9OX0dGX0RFVklDRVNfUFJFU0VOVCAgICAyCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDJfUkVTRVJWRUQgICAgMworCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEM19TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEM19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfQkFTSUNfU1RCQ19NQ1MgICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX0RVQUxfU1RCQ19QUk9URUNUSU9OICAgIDcKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEM19TRUNPTkRBUllfQkVBQ09OICAgIDgKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEM19MU0lHX1RYT1BfUFJPVEVDVElPTl9GVUxMX1NVUFBPUlQgICAgOQorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX1BDT19BQ1RJVkUgICAgMTAKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEM19QQ09fUEhBU0UgICAgMTEKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEM19SRVNFUlZFRCAgICAxMgorCisjZGVmaW5lIFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19HUkVFTkZJRUxEX0NBUEFCSUxJVFlfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWV9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWV9FTkFCTEUgICAgMQorI2RlZmluZSBXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWV9ESVNBQkxFICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX01BWF9BTVNEVV9MRU5HVEhfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfQU1TRFVfTEVOR1RIX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSF9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSF9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19NQVhfQU1TRFVfTEVOR1RIX1NIT1JUXzM4MzlfQllURVMgICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9BTVNEVV9MRU5HVEhfTE9OR183OTM1X19CWVRFUyAgICAxCisKKyNkZWZpbmUgV05JX0NGR19NUERVX0RFTlNJVFlfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NUERVX0RFTlNJVFlfU1RBTUFYICAgIDcKKyNkZWZpbmUgV05JX0NGR19NUERVX0RFTlNJVFlfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX01QRFVfREVOU0lUWV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTVBEVV9ERU5TSVRZX0FQTUFYICAgIDcKKyNkZWZpbmUgV05JX0NGR19NUERVX0RFTlNJVFlfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfU1RBTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SX1NUQURFRiAgICAzCisKKyNkZWZpbmUgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SX0FQTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SX0FQREVGICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV8yME1IWl9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV8yME1IWl9BUERFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV8yME1IWl9FTkFCTEUgICAgMQorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaX0RJU0FCTEUgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV80ME1IWl9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV80ME1IWl9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaX0FQREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfRElTQUJMRSAgICAwCisKKyNkZWZpbmUgV05JX0NGR19SSUZTX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SSUZTX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19SSUZTX0VOQUJMRURfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1JJRlNfRU5BQkxFRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUklGU19FTkFCTEVEX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19SSUZTX0VOQUJMRURfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfUklGU19FTkFCTEVEX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfUklGU19FTkFCTEVEX0RJU0FCTEUgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX1BTX1BPTExfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfUFNfUE9MTF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfTUFYX1BTX1BPTExfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRV9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRV9TVEFNQVggICAgMjAKKyNkZWZpbmUgV05JX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0VfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19SU1NJX0ZJTFRFUl9QRVJJT0RfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SU1NJX0ZJTFRFUl9QRVJJT0RfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1JTU0lfRklMVEVSX1BFUklPRF9TVEFERUYgICAgMjAKKworI2RlZmluZSBXTklfQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfRlRfUlNTSV9GSUxURVJfUEVSSU9EX1NUQURFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19NSU5fUlNTSV9USFJFU0hPTERfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NSU5fUlNTSV9USFJFU0hPTERfU1RBTUFYICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfTUlOX1JTU0lfVEhSRVNIT0xEX1NUQURFRiAgICAxMAorCisjZGVmaW5lIFdOSV9DRkdfTlRIX0JFQUNPTl9GSUxURVJfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19OVEhfQkVBQ09OX0ZJTFRFUl9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfTlRIX0JFQUNPTl9GSUxURVJfU1RBREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19CUk9BRENBU1RfRlJBTUVfRklMVEVSX0VOQUJMRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JST0FEQ0FTVF9GUkFNRV9GSUxURVJfRU5BQkxFX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQlJPQURDQVNUX0ZSQU1FX0ZJTFRFUl9FTkFCTEVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRV9BUERFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19JR05PUkVfRFRJTV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0lHTk9SRV9EVElNX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfSUdOT1JFX0RUSU1fU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0lHTk9SRV9EVElNX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19JR05PUkVfRFRJTV9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfSUdOT1JFX0RUSU1fQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX1VDQVNUX1BBVFRFUk5fRklMVEVSX0VOQUJMRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9VQ0FTVF9QQVRURVJOX0ZJTFRFUl9FTkFCTEVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fVUNBU1RfUEFUVEVSTl9GSUxURVJfRU5BQkxFX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fQ0hBTk5FTF9TV0lUQ0hfRU5BQkxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX0NIQU5ORUxfU1dJVENIX0VOQUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9DSEFOTkVMX1NXSVRDSF9FTkFCTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9ERUFVVEhfRU5BQkxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX0RFQVVUSF9FTkFCTEVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fREVBVVRIX0VOQUJMRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX0RJU0FTU09DX0VOQUJMRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9ESVNBU1NPQ19FTkFCTEVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fRElTQVNTT0NfRU5BQkxFX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fTUFYX01JU1NFRF9CRUFDT05fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fTUFYX01JU1NFRF9CRUFDT05fU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX01BWF9NSVNTRURfQkVBQ09OX1NUQURFRiAgICA0MAorCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX01BWF9TTEVFUF9QRVJJT0RfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fTUFYX1NMRUVQX1BFUklPRF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fTUFYX1NMRUVQX1BFUklPRF9TVEFERUYgICAgNjU1MzUKKworI2RlZmluZSBXTklfQ0ZHX0JBX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19CQV9USU1FT1VUX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0JBX1RJTUVPVVRfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0JBX1RJTUVPVVRfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JBX1RJTUVPVVRfQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19CQV9USU1FT1VUX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0JBX1RIUkVTSE9MRF9ISUdIX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQkFfVEhSRVNIT0xEX0hJR0hfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQkFfVEhSRVNIT0xEX0hJR0hfU1RBREVGICAgIDEyOAorCisjZGVmaW5lIFdOSV9DRkdfQkFfVEhSRVNIT0xEX0hJR0hfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JBX1RIUkVTSE9MRF9ISUdIX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQkFfVEhSRVNIT0xEX0hJR0hfQVBERUYgICAgMTI4CisKKyNkZWZpbmUgV05JX0NGR19NQVhfQkFfQlVGRkVSU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9CQV9CVUZGRVJTX1NUQU1BWCAgICAyNTYwCisjZGVmaW5lIFdOSV9DRkdfTUFYX0JBX0JVRkZFUlNfU1RBREVGICAgIDI1NjAKKworI2RlZmluZSBXTklfQ0ZHX01BWF9CQV9CVUZGRVJTX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfQkFfQlVGRkVSU19BUE1BWCAgICAyNTYwCisjZGVmaW5lIFdOSV9DRkdfTUFYX0JBX0JVRkZFUlNfQVBERUYgICAgMjU2MAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX0JBX1NFU1NJT05TX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX0JBX1NFU1NJT05TX1NUQU1BWCAgICA2NAorI2RlZmluZSBXTklfQ0ZHX01BWF9CQV9TRVNTSU9OU19TVEFERUYgICAgNDAKKworI2RlZmluZSBXTklfQ0ZHX01BWF9CQV9TRVNTSU9OU19BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX0JBX1NFU1NJT05TX0FQTUFYICAgIDY0CisjZGVmaW5lIFdOSV9DRkdfTUFYX0JBX1NFU1NJT05TX0FQREVGICAgIDQwCisKKyNkZWZpbmUgV05JX0NGR19CQV9BVVRPX1NFVFVQX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQkFfQVVUT19TRVRVUF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0JBX0FVVE9fU0VUVVBfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0JBX0FVVE9fU0VUVVBfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JBX0FVVE9fU0VUVVBfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0JBX0FVVE9fU0VUVVBfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfQkFfQVVUT19TRVRVUF9FTkFCTEUgICAgMQorI2RlZmluZSBXTklfQ0ZHX0JBX0FVVE9fU0VUVVBfRElTQUJMRSAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BRERCQV9SRVFfREVDTElORV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FEREJBX1JFUV9ERUNMSU5FX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19BRERCQV9SRVFfREVDTElORV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQUREQkFfUkVRX0RFQ0xJTkVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FEREJBX1JFUV9ERUNMSU5FX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0FEREJBX1JFUV9ERUNMSU5FX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19NQVhfTUVESVVNX1RJTUVfU1RBREVGICAgIDIwNDgKKworI2RlZmluZSBXTklfQ0ZHX01BWF9NRURJVU1fVElNRV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX01FRElVTV9USU1FX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfTUFYX01FRElVTV9USU1FX0FQREVGICAgIDIwNDgKKworI2RlZmluZSBXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19NQVhfTVBEVVNfSU5fQU1QRFVfU1RBREVGICAgIDY0CisKKyNkZWZpbmUgV05JX0NGR19NQVhfTVBEVVNfSU5fQU1QRFVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVV9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVV9BUERFRiAgICA2NAorCisjZGVmaW5lIFdOSV9DRkdfSUJTU19BVVRPX0JTU0lEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSUJTU19BVVRPX0JTU0lEX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfSUJTU19BVVRPX0JTU0lEX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETklFX0ZMQUdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETklFX0ZMQUdfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETklFX0ZMQUdfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfRkxBR19BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5JRV9GTEFHX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETklFX0ZMQUdfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0ZMQUdfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfRkxBR19BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBR19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBR19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9GTEFHX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BU1NPQ19SU1BfQURETklFX0ZMQUdfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBR19BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0ZMQUdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0ZMQUdfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0ZMQUdfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROUDJQSUVfRkxBR19BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9GTEFHX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0ZMQUdfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0ZMQUdfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dQU19FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfRU5BQkxFX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19XUFNfRU5BQkxFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XUFNfRU5BQkxFX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfRU5BQkxFX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1dQU19FTkFCTEVfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0VOQUJMRV9BUCAgICAxCisjZGVmaW5lIFdOSV9DRkdfV1BTX0VOQUJMRV9TVEEgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfV1BTX1NUQVRFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX1NUQVRFX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19XUFNfU1RBVEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dQU19TVEFURV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX1NUQVRFX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1dQU19TVEFURV9BUERFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJPQkVfUkVRX0ZMQUdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJPQkVfUkVRX0ZMQUdfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJPQkVfUkVRX0ZMQUdfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dQU19QUk9CRV9SRVFfRkxBR19BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX1BST0JFX1JFUV9GTEFHX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJPQkVfUkVRX0ZMQUdfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX1ZFUlNJT05fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfVkVSU0lPTl9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfV1BTX1ZFUlNJT05fU1RBREVGICAgIDE2CisKKyNkZWZpbmUgV05JX0NGR19XUFNfVkVSU0lPTl9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX1ZFUlNJT05fQVBNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfV1BTX1ZFUlNJT05fQVBERUYgICAgMTYKKworI2RlZmluZSBXTklfQ0ZHX1dQU19SRVFVRVNUX1RZUEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfUkVRVUVTVF9UWVBFX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19XUFNfUkVRVUVTVF9UWVBFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XUFNfUkVRVUVTVF9UWVBFX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfUkVRVUVTVF9UWVBFX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1dQU19SRVFVRVNUX1RZUEVfQVBERUYgICAgMworCisjZGVmaW5lIFdOSV9DRkdfV1BTX0NGR19NRVRIT0RfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfQ0ZHX01FVEhPRF9TVEFNQVggICAgNDI5NDk2NzI5NQorI2RlZmluZSBXTklfQ0ZHX1dQU19DRkdfTUVUSE9EX1NUQURFRiAgICA4CisKKyNkZWZpbmUgV05JX0NGR19XUFNfQ0ZHX01FVEhPRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX0NGR19NRVRIT0RfQVBNQVggICAgNDI5NDk2NzI5NQorI2RlZmluZSBXTklfQ0ZHX1dQU19DRkdfTUVUSE9EX0FQREVGICAgIDI1OTUyNjU0CisKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJJTUFSWV9ERVZJQ0VfQ0FURUdPUllfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJJTUFSWV9ERVZJQ0VfQ0FURUdPUllfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfV1BTX1BSSU1BUllfREVWSUNFX0NBVEVHT1JZX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJJTUFSWV9ERVZJQ0VfQ0FURUdPUllfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19QUklNQVJZX0RFVklDRV9DQVRFR09SWV9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1dQU19QUklNQVJZX0RFVklDRV9DQVRFR09SWV9BUERFRiAgICA2CisKKyNkZWZpbmUgV05JX0NGR19XUFNfUElNQVJZX0RFVklDRV9PVUlfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfUElNQVJZX0RFVklDRV9PVUlfU1RBTUFYICAgIDQyOTQ5NjcyOTUKKyNkZWZpbmUgV05JX0NGR19XUFNfUElNQVJZX0RFVklDRV9PVUlfU1RBREVGICAgIDUzMDQ4MzYKKworI2RlZmluZSBXTklfQ0ZHX1dQU19QSU1BUllfREVWSUNFX09VSV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX1BJTUFSWV9ERVZJQ0VfT1VJX0FQTUFYICAgIDQyOTQ5NjcyOTUKKyNkZWZpbmUgV05JX0NGR19XUFNfUElNQVJZX0RFVklDRV9PVUlfQVBERUYgICAgNTMwNDgzNgorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0RFVklDRV9TVUJfQ0FURUdPUllfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1NVQl9DQVRFR09SWV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1NVQl9DQVRFR09SWV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0RFVklDRV9TVUJfQ0FURUdPUllfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19ERVZJQ0VfU1VCX0NBVEVHT1JZX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfV1BTX0RFVklDRV9TVUJfQ0FURUdPUllfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0FTU09DSUFUSU9OX1NUQVRFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX0FTU09DSUFUSU9OX1NUQVRFX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ0lBVElPTl9TVEFURV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0FTU09DSUFUSU9OX1NUQVRFX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfQVNTT0NJQVRJT05fU1RBVEVfQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XUFNfQVNTT0NJQVRJT05fU1RBVEVfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1JfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfQ09ORklHVVJBVElPTl9FUlJPUl9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XUFNfQ09ORklHVVJBVElPTl9FUlJPUl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1JfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19DT05GSUdVUkFUSU9OX0VSUk9SX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1JfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0RFVklDRV9QQVNTV09SRF9JRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19ERVZJQ0VfUEFTU1dPUkRfSURfU1RBTUFYICAgIDQyOTQ5NjcyOTUKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEX0FQTUFYICAgIDQyOTQ5NjcyOTUKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ19NRVRIT0RfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfQVNTT0NfTUVUSE9EX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ19NRVRIT0RfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ19NRVRIT0RfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ19NRVRIT0RfQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XUFNfQVNTT0NfTUVUSE9EX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTE9XX0dBSU5fT1ZFUlJJREVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19MT1dfR0FJTl9PVkVSUklERV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTE9XX0dBSU5fT1ZFUlJJREVfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19MT1dfR0FJTl9PVkVSUklERV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9QSFlfQUdDX0xJU1RFTl9NT0RFX1NUQU1BWCAgICAxMjgKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERV9TVEFERUYgICAgMTI4CisKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX1BIWV9BR0NfTElTVEVOX01PREVfQVBNQVggICAgMTI4CisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX1BIWV9BR0NfTElTVEVOX01PREVfQVBERUYgICAgMTI4CisKKyNkZWZpbmUgV05JX0NGR19SUEVfUE9MTElOR19USFJFU0hPTERfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUEVfUE9MTElOR19USFJFU0hPTERfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUlBFX1BPTExJTkdfVEhSRVNIT0xEX1NUQURFRiAgICAxMAorCisjZGVmaW5lIFdOSV9DRkdfUlBFX1BPTExJTkdfVEhSRVNIT0xEX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUEVfUE9MTElOR19USFJFU0hPTERfQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SUEVfUE9MTElOR19USFJFU0hPTERfQVBERUYgICAgMTAKKworI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMF9SRUdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzBfUkVHX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMF9SRUdfU1RBREVGICAgIDMwCisKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzBfUkVHX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzBfUkVHX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMwX1JFR19BUERFRiAgICAzMAorCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMxX1JFR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUdfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMxX1JFR19TVEFERUYgICAgMzAKKworI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUdfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUdfQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzFfUkVHX0FQREVGICAgIDMwCisKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzJfUkVHX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMyX1JFR19TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzJfUkVHX1NUQURFRiAgICAzMAorCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMyX1JFR19BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMyX1JFR19BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMl9SRUdfQVBERUYgICAgMzAKKworI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDM19SRUdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzNfUkVHX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDM19SRUdfU1RBREVGICAgIDMwCisKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzNfUkVHX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzNfUkVHX0FQTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMzX1JFR19BUERFRiAgICAzMAorCisjZGVmaW5lIFdOSV9DRkdfTk9fT0ZfT05DSElQX1JFT1JERVJfU0VTU0lPTlNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19OT19PRl9PTkNISVBfUkVPUkRFUl9TRVNTSU9OU19TVEFNQVggICAgMgorI2RlZmluZSBXTklfQ0ZHX05PX09GX09OQ0hJUF9SRU9SREVSX1NFU1NJT05TX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19OT19PRl9PTkNISVBfUkVPUkRFUl9TRVNTSU9OU19BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTk9fT0ZfT05DSElQX1JFT1JERVJfU0VTU0lPTlNfQVBNQVggICAgMgorI2RlZmluZSBXTklfQ0ZHX05PX09GX09OQ0hJUF9SRU9SREVSX1NFU1NJT05TX0FQREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1NJTkdMRV9USURfUkNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19TSU5HTEVfVElEX1JDX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0lOR0xFX1RJRF9SQ19TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfU0lOR0xFX1RJRF9SQ19BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0lOR0xFX1RJRF9SQ19BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0lOR0xFX1RJRF9SQ19BUERFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19SUk1fRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JSTV9FTkFCTEVEX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUlJNX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1JSTV9FTkFCTEVEX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUk1fRU5BQkxFRF9BUE1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUlJNX0VOQUJMRURfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUlJNX09QRVJBVElOR19DSEFOX01BWF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfU1RBTUFYICAgIDgKKyNkZWZpbmUgV05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0FQTUFYICAgIDgKKyNkZWZpbmUgV05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfU1RBTUFYICAgIDgKKyNkZWZpbmUgV05JX0NGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX0FQTUFYICAgIDgKKyNkZWZpbmUgV05JX0NGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWF9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1RYX1BXUl9DVFJMX0VOQUJMRV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVFhfUFdSX0NUUkxfRU5BQkxFX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEVfQVBERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElOR19TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX01DQVNUX0JDQVNUX0ZJTFRFUl9TRVRUSU5HX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElOR19BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfQVBNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX01DQVNUX0JDQVNUX0ZJTFRFUl9TRVRUSU5HX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0JUQ19ESENQX0JUX1NMT1RTX1RPX0JMT0NLX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0tfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0JUQ19ESENQX0JUX1NMT1RTX1RPX0JMT0NLX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19CVENfREhDUF9CVF9TTE9UU19UT19CTE9DS19BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0tfQVBNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0tfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BTX1BPTExfVkFMVUVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfUFNfUE9MTF9WQUxVRV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfUFNfUE9MTF9WQUxVRV9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QU19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QU19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfU1RBTUFYICAgIDgwCisjZGVmaW5lIFdOSV9DRkdfUFNfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VUX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU5fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU5fU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU5fU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTl9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOX0FQTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU5fQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9TVEFNQVggICAgNworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX1NUQURFRiAgICAzCisKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfQVBNQVggICAgNworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0FQREVGICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0lETEVfQkNOU19TVEFNSU4gICAgNQorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0lETEVfQkNOU19TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfSURMRV9CQ05TX1NUQURFRiAgICAxMAorCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfSURMRV9CQ05TX0FQTUlOICAgIDUKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlNfQVBNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfSURMRV9CQ05TX0FQREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfU1RBTUFYICAgIDcKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfU1RBREVGICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJX0FQTUFYICAgIDcKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfQVBERUYgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJX0lETEVfQkNOU19TVEFNSU4gICAgNQorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlNfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlNfU1RBREVGICAgIDE1CisKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TX0FQTUlOICAgIDUKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlNfQVBERUYgICAgMTUKKworI2RlZmluZSBXTklfQ0ZHX0JUQ19BMkRQX0RIQ1BfQlRfU1VCX0lOVEVSVkFMU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JUQ19BMkRQX0RIQ1BfQlRfU1VCX0lOVEVSVkFMU19TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfQlRDX0EyRFBfREhDUF9CVF9TVUJfSU5URVJWQUxTX1NUQURFRiAgICA3CisKKyNkZWZpbmUgV05JX0NGR19CVENfQTJEUF9ESENQX0JUX1NVQl9JTlRFUlZBTFNfQVBNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JUQ19BMkRQX0RIQ1BfQlRfU1VCX0lOVEVSVkFMU19BUE1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19CVENfQTJEUF9ESENQX0JUX1NVQl9JTlRFUlZBTFNfQVBERUYgICAgNworCisjZGVmaW5lIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfQVBNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQU1JTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQU1BWCAgICAxMAorI2RlZmluZSBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVF9TVEFERUYgICAgMTAKKworI2RlZmluZSBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVF9BUE1JTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX0FQTUFYICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX0FQREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMX1NUQU1BWCAgICAyNTIKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX1NUQVJUX0NIQU5ORUxfQVBNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMX0FQTUFYICAgIDI1MgorI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMX0FQREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTF9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTF9TVEFNQVggICAgMjUyCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX0VORF9DSEFOTkVMX1NUQURFRiAgICAxMQorCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX0VORF9DSEFOTkVMX0FQTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfRU5EX0NIQU5ORUxfQVBNQVggICAgMjUyCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX0VORF9DSEFOTkVMX0FQREVGICAgIDExCisKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfU1RBTUFYICAgIDQKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9PUEVSQVRJTkdfQkFORF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5EX0FQTUFYICAgIDQKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfQVBERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9TVEFERUYgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRF9BUE1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfQVBERUYgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX0NMT1NFX0xPT1BfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfQ0xPU0VfTE9PUF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfQ0xPU0VfTE9PUF9BUE1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX0NMT1NFX0xPT1BfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX0FQREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX0xURV9DT0VYX0FQTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfTFRFX0NPRVhfQVBNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWF9BUERFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVRfU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVRfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0FQX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFERUYgICAgMjAKKworI2RlZmluZSBXTklfQ0ZHX0FQX0tFRVBfQUxJVkVfVElNRU9VVF9BUE1JTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfQVBfS0VFUF9BTElWRV9USU1FT1VUX0FQTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0FQX0tFRVBfQUxJVkVfVElNRU9VVF9BUERFRiAgICAyMAorCisjZGVmaW5lIFdOSV9DRkdfR09fS0VFUF9BTElWRV9USU1FT1VUX1NUQU1JTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfR09fS0VFUF9BTElWRV9USU1FT1VUX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19HT19LRUVQX0FMSVZFX1RJTUVPVVRfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19HT19LRUVQX0FMSVZFX1RJTUVPVVRfQVBNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVF9BUE1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19HT19LRUVQX0FMSVZFX1RJTUVPVVRfQVBERUYgICAgMjAKKworI2RlZmluZSBDRkdfUEFSQU1fTUFYX05VTSAgICAgICAgIDI1OQorI2RlZmluZSBDRkdfQVBfSUJVRl9NQVhfU0laRSAgICAgIDE5OAorI2RlZmluZSBDRkdfQVBfU0JVRl9NQVhfU0laRSAgICAgIDM0MjIKKyNkZWZpbmUgQ0ZHX1NUQV9JQlVGX01BWF9TSVpFICAgICAxOTMKKyNkZWZpbmUgQ0ZHX1NUQV9TQlVGX01BWF9TSVpFICAgICAzMzg4CisjZGVmaW5lIENGR19TRU1fTUFYX05VTSAgICAgICAgICAgMTIKKworI2RlZmluZSBDRkdfU1RBX01BR0lDX0RXT1JEICAgICAweGJlZWZiZWVmCisKKyNkZWZpbmUgQ0ZHX0FQX01BR0lDX0RXT1JEICAgICAgMHhkZWFkZGVhZAorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvaW5jL3duaUNmZ1N0YS5oIGIvQ09SRS9NQUMvaW5jL3duaUNmZ1N0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYWJkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9pbmMvd25pQ2ZnU3RhLmgKQEAgLTAsMCArMSwxMzk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4KKyAqLworCisvKgorICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2xseQorICovCisKKy8qCisgKiBJTVBPUlRBTlQ6ICBUaGlzIGZpbGUgaXMgZm9yIHN5c3RlbSB0aGF0IHN1cHBvcnRzIFNUQSBtb2RlIE9OTFkuCisgKi8KKworCisjaWZuZGVmIF9fV05JQ0ZHU1RBX0gKKyNkZWZpbmUgX19XTklDRkdTVEFfSAorCisvKgorICogQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgSUQgZm9yIFNUQQorICovCisKKyNkZWZpbmUgV05JX0NGR19TVEFfSUQgICAgMAorI2RlZmluZSBXTklfQ0ZHX0NGUF9QRVJJT0QgICAgMgorI2RlZmluZSBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT04gICAgMworI2RlZmluZSBXTklfQ0ZHX1NTSUQgICAgNAorI2RlZmluZSBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTCAgICA1CisjZGVmaW5lIFdOSV9DRkdfRFRJTV9QRVJJT0QgICAgNgorI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIICAgIDcKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfVEFCTEUgICAgOAorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV9UQUJMRV9ST1cgICAgNAorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV9UQUJMRV9DT0wgICAgMQorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8xICAgIDgKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfMiAgICA5CisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzMgICAgMTAKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfNCAgICAxMQorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEICAgIDEyCisjZGVmaW5lIFdOSV9DRkdfRVhDTFVERV9VTkVOQ1JZUFRFRCAgICAxMworI2RlZmluZSBXTklfQ0ZHX1JUU19USFJFU0hPTEQgICAgMTQKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9SRVRSWV9MSU1JVCAgICAxNQorI2RlZmluZSBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVQgICAgMTYKKyNkZWZpbmUgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAgICAxNworI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRSAgICAxOAorI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSAgICAxOQorI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUgICAgMjAKKyNkZWZpbmUgV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FICAgIDIxCisjZGVmaW5lIFdOSV9DRkdfSk9JTl9GQUlMVVJFX1RJTUVPVVQgICAgMjIKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVEVfRkFJTFVSRV9USU1FT1VUICAgIDIzCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VUICAgIDI0CisjZGVmaW5lIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUICAgIDI1CisjZGVmaW5lIFdOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQgICAgMjYKKyNkZWZpbmUgV05JX0NGR19SQV9QRVJJT0RJQ0lUWV9USU1FT1VUX0lOX1BTICAgIDI3CisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVIgICAgMjgKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfSEVBUlRfQkVBVCAgICAyOQorI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1IgICAgMzAKKyNkZWZpbmUgV05JX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVCAgICAzMQorI2RlZmluZSBXTklfQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLICAgIDMyCisjZGVmaW5lIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQiAgICAzMworI2RlZmluZSBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUEgICAgMzQKKyNkZWZpbmUgV05JX0NGR19QSFlfTU9ERSAgICAzNQorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREUgICAgMzYKKyNkZWZpbmUgV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVCAgICAzNworI2RlZmluZSBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VUICAgIDM4CisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfT1BFUkFUSU9OQUxfUkFURV9TRVQgICAgMzkKKyNkZWZpbmUgV05JX0NGR19CU1NJRCAgICA0MAorI2RlZmluZSBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTCAgICA0MQorI2RlZmluZSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCAgICA0MgorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTCAgICA0MworI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haICAgIDQ0CisjZGVmaW5lIFdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haICAgIDQ1CisjZGVmaW5lIFdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEUgICAgNDYKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFICAgIDQ3CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFogICAgNDgKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF81R0haICAgIDQ5CisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWSAgICA1MAorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9TRUNPTkRBUlkgICAgNTEKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfVEVSVElBUlkgICAgNTIKKyNkZWZpbmUgV05JX0NGR19BUFNEX0VOQUJMRUQgICAgNTMKKyNkZWZpbmUgV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFICAgIDU0CisjZGVmaW5lIFdOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEUgICAgNTUKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFICAgIDU2CisjZGVmaW5lIFdOSV9DRkdfUFJJVkFDWV9FTkFCTEVEICAgIDU4CisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEUgICAgNTkKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9TTE9UX1RJTUUgICAgNjAKKyNkZWZpbmUgV05JX0NGR19BQ0NFUFRfU0hPUlRfU0xPVF9BU1NPQ19PTkxZICAgIDYxCisjZGVmaW5lIFdOSV9DRkdfUU9TX0VOQUJMRUQgICAgNjIKKyNkZWZpbmUgV05JX0NGR19IQ0ZfRU5BQkxFRCAgICA2MworI2RlZmluZSBXTklfQ0ZHX1JTTl9FTkFCTEVEICAgIDY0CisjZGVmaW5lIFdOSV9DRkdfQkFDS0dST1VORF9TQ0FOX1BFUklPRCAgICA2NQorI2RlZmluZSBXTklfQ0ZHX01BWF9OVU1fUFJFX0FVVEggICAgNjYKKyNkZWZpbmUgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCAgICA2OQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVCAgICA3MAorI2RlZmluZSBXTklfQ0ZHX01BTlVGQUNUVVJFUl9PVUkgICAgNzEKKyNkZWZpbmUgV05JX0NGR19NQU5VRkFDVFVSRVJfTkFNRSAgICA3MgorI2RlZmluZSBXTklfQ0ZHX01PREVMX05VTUJFUiAgICA3MworI2RlZmluZSBXTklfQ0ZHX01PREVMX05BTUUgICAgNzQKKyNkZWZpbmUgV05JX0NGR19NQU5VRkFDVFVSRVJfUFJPRFVDVF9OQU1FICAgIDc1CisjZGVmaW5lIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfVkVSU0lPTiAgICA3NgorI2RlZmluZSBXTklfQ0ZHXzExRF9FTkFCTEVEICAgIDc3CisjZGVmaW5lIFdOSV9DRkdfTUFYX1RYX1BPV0VSXzJfNCAgICA3OAorI2RlZmluZSBXTklfQ0ZHX01BWF9UWF9QT1dFUl81ICAgIDc5CisjZGVmaW5lIFdOSV9DRkdfTkVUV09SS19ERU5TSVRZICAgIDgwCisjZGVmaW5lIFdOSV9DRkdfQURBUFRJVkVfVEhSRVNIT0xEX0FMR09SSVRITSAgICA4MQorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfVFhfQU5URU5OQSAgICA4MgorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfUlhfQU5URU5OQSAgICA4MworI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfVFhfUE9XRVJfTEVWRUwgICAgODQKKyNkZWZpbmUgV05JX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU4gICAgODUKKyNkZWZpbmUgV05JX0NGR19ORVdfQlNTX0ZPVU5EX0lORCAgICA4NgorI2RlZmluZSBXTklfQ0ZHX1BST1BSSUVUQVJZX0FOSV9GRUFUVVJFU19FTkFCTEVEICAgIDg3CisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRCAgICA4OAorI2RlZmluZSBXTklfQ0ZHX0NPVU5UUllfQ09ERSAgICA5MAorI2RlZmluZSBXTklfQ0ZHXzExSF9FTkFCTEVEICAgIDkxCisjZGVmaW5lIFdOSV9DRkdfV1RfQ05GX1RJTUVPVVQgICAgOTIKKyNkZWZpbmUgV05JX0NGR19LRUVQQUxJVkVfVElNRU9VVCAgICA5MworI2RlZmluZSBXTklfQ0ZHX1BST1hJTUlUWSAgICA5NAorI2RlZmluZSBXTklfQ0ZHX0xPR19MRVZFTCAgICA5NQorI2RlZmluZSBXTklfQ0ZHX09MQkNfREVURUNUX1RJTUVPVVQgICAgOTYKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRUQgICAgOTcKKyNkZWZpbmUgV05JX0NGR18xMUdfUFJPVEVDVElPTl9BTFdBWVMgICAgOTgKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTiAgICA5OQorI2RlZmluZSBXTklfQ0ZHXzExR19TSE9SVF9QUkVBTUJMRV9FTkFCTEVEICAgIDEwMAorI2RlZmluZSBXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRCAgICAxMDEKKyNkZWZpbmUgV05JX0NGR19DQUxfUEVSSU9EICAgIDEwMgorI2RlZmluZSBXTklfQ0ZHX1NUQVRTX1BFUklPRCAgICAxMDMKKyNkZWZpbmUgV05JX0NGR19DQUxfQ09OVFJPTCAgICAxMDQKKyNkZWZpbmUgV05JX0NGR18xMUdfT05MWV9QT0xJQ1kgICAgMTA1CisjZGVmaW5lIFdOSV9DRkdfUEFDS0VUX0NMQVNTSUZJQ0FUSU9OICAgIDEwNgorI2RlZmluZSBXTklfQ0ZHX1dNRV9FTkFCTEVEICAgIDEwNworI2RlZmluZSBXTklfQ0ZHX0FERFRTX1JTUF9USU1FT1VUICAgIDEwOAorI2RlZmluZSBXTklfQ0ZHX01BWF9TUF9MRU5HVEggICAgMTA5CisjZGVmaW5lIFdOSV9DRkdfU0VORF9TSU5HTEVfU1NJRF9BTFdBWVMgICAgMTExCisjZGVmaW5lIFdOSV9DRkdfV1NNX0VOQUJMRUQgICAgMTEyCisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZICAgIDExMworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRSAgICAxMTQKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMICAgIDExNQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDQkVfTE9DQUwgICAgMTE2CisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNWSV9MT0NBTCAgICAxMTcKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ1ZPX0xPQ0FMICAgIDExOAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDQksgICAgMTE5CisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNCRSAgICAxMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ1ZJICAgIDEyMQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDVk8gICAgMTIyCisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNCS19MT0NBTCAgICAxMjMKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ0JFX0xPQ0FMICAgIDEyNAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVklfTE9DQUwgICAgMTI1CisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNWT19MT0NBTCAgICAxMjYKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ0JLICAgIDEyNworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDQkUgICAgMTI4CisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNWSSAgICAxMjkKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ1ZPICAgIDEzMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNCS19MT0NBTCAgICAxMzEKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDQkVfTE9DQUwgICAgMTMyCisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ1ZJX0xPQ0FMICAgIDEzMworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNWT19MT0NBTCAgICAxMzQKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDQksgICAgMTM1CisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ0JFICAgIDEzNgorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNWSSAgICAxMzcKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDVk8gICAgMTM4CisjZGVmaW5lIFdOSV9DRkdfUkRFVF9GTEFHICAgIDEzOQorI2RlZmluZSBXTklfQ0ZHX1JBREFSX0NIQU5ORUxfTElTVCAgICAxNDAKKyNkZWZpbmUgV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5UICAgIDE0MQorI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWSAgICAxNDIKKyNkZWZpbmUgV05JX0NGR19BRE1JVF9CV0ZBQ1RPUiAgICAxNDMKKyNkZWZpbmUgV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkUgICAgMTQ0CisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREUgICAgMTQ1CisjZGVmaW5lIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEUgICAgMTQ2CisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfWkVSTyAgICAxNDcKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9PTkUgICAgMTQ4CisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfVFdPICAgIDE0OQorI2RlZmluZSBXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU4gICAgMTUwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QUk9GSUxFX1NXSVRDSElORyAgICAxNTEKKyNkZWZpbmUgV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVCAgICAxNTIKKyNkZWZpbmUgV05JX0NGR19NSU1PX0VOQUJMRUQgICAgMTUzCisjZGVmaW5lIFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRUQgICAgMTU0CisjZGVmaW5lIFdOSV9DRkdfQkFfQUNUSVZJVFlfQ0hFQ0tfVElNRU9VVCAgICAxNTUKKyNkZWZpbmUgV05JX0NGR19IVF9SWF9TVEJDICAgIDE1NgorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPICAgIDE1NworI2RlZmluZSBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNUyAgICAxNTgKKyNkZWZpbmUgV05JX0NGR19TVVBQT1JURURfTUNTX1NFVCAgICAxNTkKKyNkZWZpbmUgV05JX0NGR19FWFRfSFRfQ0FQX0lORk8gICAgMTYwCisjZGVmaW5lIFdOSV9DRkdfVFhfQkZfQ0FQICAgIDE2MQorI2RlZmluZSBXTklfQ0ZHX0FTX0NBUCAgICAxNjIKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMSAgICAxNjMKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMiAgICAxNjQKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMyAgICAxNjUKKyNkZWZpbmUgV05JX0NGR19CQVNJQ19NQ1NfU0VUICAgIDE2NgorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfTUNTX1NFVCAgICAxNjcKKyNkZWZpbmUgV05JX0NGR19HUkVFTkZJRUxEX0NBUEFCSUxJVFkgICAgMTY4CisjZGVmaW5lIFdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSCAgICAxNjkKKyNkZWZpbmUgV05JX0NGR19NUERVX0RFTlNJVFkgICAgMTcwCisjZGVmaW5lIFdOSV9DRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUiAgICAxNzEKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV8yME1IWiAgICAxNzIKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV80ME1IWiAgICAxNzMKKyNkZWZpbmUgV05JX0NGR19SSUZTX0VOQUJMRUQgICAgMTc0CisjZGVmaW5lIFdOSV9DRkdfTUFYX1BTX1BPTEwgICAgMTc1CisjZGVmaW5lIFdOSV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFICAgIDE3NgorI2RlZmluZSBXTklfQ0ZHX1JTU0lfRklMVEVSX1BFUklPRCAgICAxNzcKKyNkZWZpbmUgV05JX0NGR19GVF9SU1NJX0ZJTFRFUl9QRVJJT0QgICAgMTc4CisjZGVmaW5lIFdOSV9DRkdfTUlOX1JTU0lfVEhSRVNIT0xEICAgIDE3OQorI2RlZmluZSBXTklfQ0ZHX05USF9CRUFDT05fRklMVEVSICAgIDE4MAorI2RlZmluZSBXTklfQ0ZHX0JST0FEQ0FTVF9GUkFNRV9GSUxURVJfRU5BQkxFICAgIDE4MQorI2RlZmluZSBXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFICAgIDE4MgorI2RlZmluZSBXTklfQ0ZHX0lHTk9SRV9EVElNICAgIDE4MworI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9VQ0FTVF9QQVRURVJOX0ZJTFRFUl9FTkFCTEUgICAgMTg0CisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX0NIQU5ORUxfU1dJVENIX0VOQUJMRSAgICAxODUKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fREVBVVRIX0VOQUJMRSAgICAxODYKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fRElTQVNTT0NfRU5BQkxFICAgIDE4NworI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTiAgICAxODgKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fTUFYX1NMRUVQX1BFUklPRCAgICAxODkKKyNkZWZpbmUgV05JX0NGR19CQV9USU1FT1VUICAgIDE5MAorI2RlZmluZSBXTklfQ0ZHX0JBX1RIUkVTSE9MRF9ISUdIICAgIDE5MQorI2RlZmluZSBXTklfQ0ZHX01BWF9CQV9CVUZGRVJTICAgIDE5MgorI2RlZmluZSBXTklfQ0ZHX01BWF9CQV9TRVNTSU9OUyAgICAxOTMKKyNkZWZpbmUgV05JX0NGR19CQV9BVVRPX1NFVFVQICAgIDE5NAorI2RlZmluZSBXTklfQ0ZHX0FEREJBX1JFUV9ERUNMSU5FICAgIDE5NQorI2RlZmluZSBXTklfQ0ZHX0JHX1NDQU5fQ0hBTk5FTF9MSVNUICAgIDE5NgorI2RlZmluZSBXTklfQ0ZHX01BWF9NRURJVU1fVElNRSAgICAxOTcKKyNkZWZpbmUgV05JX0NGR19NQVhfTVBEVVNfSU5fQU1QRFUgICAgMTk4CisjZGVmaW5lIFdOSV9DRkdfSUJTU19BVVRPX0JTU0lEICAgIDE5OQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfRkxBRyAgICAyMDAKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETklFX0RBVEEgICAgMjAxCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHICAgIDIwMgorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTEgICAgMjAzCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMiAgICAyMDQKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEzICAgIDIwNQorI2RlZmluZSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBRyAgICAyMDYKKyNkZWZpbmUgV05JX0NGR19BU1NPQ19SU1BfQURETklFX0RBVEEgICAgMjA3CisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUkVRX0FERE5QMlBJRV9GTEFHICAgIDIwOAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROUDJQSUVfREFUQSAgICAyMDkKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHICAgIDIxMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEEgICAgMjExCisjZGVmaW5lIFdOSV9DRkdfV1BTX0VOQUJMRSAgICAyMTIKKyNkZWZpbmUgV05JX0NGR19XUFNfU1RBVEUgICAgMjEzCisjZGVmaW5lIFdOSV9DRkdfV1BTX1BST0JFX1JFUV9GTEFHICAgIDIxNAorI2RlZmluZSBXTklfQ0ZHX1dQU19WRVJTSU9OICAgIDIxNQorI2RlZmluZSBXTklfQ0ZHX1dQU19SRVFVRVNUX1RZUEUgICAgMjE2CisjZGVmaW5lIFdOSV9DRkdfV1BTX0NGR19NRVRIT0QgICAgMjE3CisjZGVmaW5lIFdOSV9DRkdfV1BTX1VVSUQgICAgMjE4CisjZGVmaW5lIFdOSV9DRkdfV1BTX1BSSU1BUllfREVWSUNFX0NBVEVHT1JZICAgIDIxOQorI2RlZmluZSBXTklfQ0ZHX1dQU19QSU1BUllfREVWSUNFX09VSSAgICAyMjAKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1NVQl9DQVRFR09SWSAgICAyMjEKKyNkZWZpbmUgV05JX0NGR19XUFNfQVNTT0NJQVRJT05fU1RBVEUgICAgMjIyCisjZGVmaW5lIFdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1IgICAgMjIzCisjZGVmaW5lIFdOSV9DRkdfV1BTX0RFVklDRV9QQVNTV09SRF9JRCAgICAyMjQKKyNkZWZpbmUgV05JX0NGR19XUFNfQVNTT0NfTUVUSE9EICAgIDIyNQorI2RlZmluZSBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFICAgIDIyNgorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9QSFlfQUdDX0xJU1RFTl9NT0RFICAgIDIyNworI2RlZmluZSBXTklfQ0ZHX1JQRV9QT0xMSU5HX1RIUkVTSE9MRCAgICAyMjgKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzBfUkVHICAgIDIyOQorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUcgICAgMjMwCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMyX1JFRyAgICAyMzEKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzNfUkVHICAgIDIzMgorI2RlZmluZSBXTklfQ0ZHX05PX09GX09OQ0hJUF9SRU9SREVSX1NFU1NJT05TICAgIDIzMworI2RlZmluZSBXTklfQ0ZHX1NJTkdMRV9USURfUkMgICAgMjM0CisjZGVmaW5lIFdOSV9DRkdfUlJNX0VOQUJMRUQgICAgMjM1CisjZGVmaW5lIFdOSV9DRkdfUlJNX09QRVJBVElOR19DSEFOX01BWCAgICAyMzYKKyNkZWZpbmUgV05JX0NGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWCAgICAyMzcKKyNkZWZpbmUgV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEUgICAgMjM4CisjZGVmaW5lIFdOSV9DRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkcgICAgMjM5CisjZGVmaW5lIFdOSV9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0sgICAgMjQwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFICAgIDI0MQorI2RlZmluZSBXTklfQ0ZHX1BTX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVCAgICAyNDIKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU4gICAgMjQzCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTEkgICAgMjQ0CisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfSURMRV9CQ05TICAgIDI0NQorI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSSAgICAyNDYKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TICAgIDI0NworI2RlZmluZSBXTklfQ0ZHX0JUQ19BMkRQX0RIQ1BfQlRfU1VCX0lOVEVSVkFMUyAgICAyNDgKKyNkZWZpbmUgV05JX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0QgICAgMjQ5CisjZGVmaW5lIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUICAgIDI1MAorI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMICAgIDI1MQorI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTCAgICAyNTIKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkQgICAgMjUzCisjZGVmaW5lIFdOSV9DRkdfQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRCAgICAyNTQKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfQ0xPU0VfTE9PUCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfTFRFX0NPRVggICAgMjU2CisjZGVmaW5lIFdOSV9DRkdfQVBfS0VFUF9BTElWRV9USU1FT1VUICAgIDI1NworI2RlZmluZSBXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVCAgICAyNTgKKworLyoKKyAqIFN0cmluZyBwYXJhbWV0ZXIgbGVuZ3RocyAKKyAqLworCisjZGVmaW5lIFdOSV9DRkdfU1RBX0lEX0xFTiAgICA2CisjZGVmaW5lIFdOSV9DRkdfU1NJRF9MRU4gICAgMzIKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfMV9MRU4gICAgMTMKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfMl9MRU4gICAgMTMKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfM19MRU4gICAgMTMKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfNF9MRU4gICAgMTMKKyNkZWZpbmUgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFCX0xFTiAgICA0CisjZGVmaW5lIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQV9MRU4gICAgOAorI2RlZmluZSBXTklfQ0ZHX09QRVJBVElPTkFMX1JBVEVfU0VUX0xFTiAgICAxMgorI2RlZmluZSBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VUX0xFTiAgICA4CisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOICAgIDQKKyNkZWZpbmUgV05JX0NGR19CU1NJRF9MRU4gICAgNgorI2RlZmluZSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4gICAgMTAwCisjZGVmaW5lIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX09VSV9MRU4gICAgMworI2RlZmluZSBXTklfQ0ZHX01BTlVGQUNUVVJFUl9OQU1FX0xFTiAgICA2NQorI2RlZmluZSBXTklfQ0ZHX01PREVMX05VTUJFUl9MRU4gICAgMzMKKyNkZWZpbmUgV05JX0NGR19NT0RFTF9OQU1FX0xFTiAgICAzMworI2RlZmluZSBXTklfQ0ZHX01BTlVGQUNUVVJFUl9QUk9EVUNUX05BTUVfTEVOICAgIDMzCisjZGVmaW5lIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfVkVSU0lPTl9MRU4gICAgMzMKKyNkZWZpbmUgV05JX0NGR19NQVhfVFhfUE9XRVJfMl80X0xFTiAgICAxMjgKKyNkZWZpbmUgV05JX0NGR19NQVhfVFhfUE9XRVJfNV9MRU4gICAgMTI4CisjZGVmaW5lIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiAgICAzCisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDVklfTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNWT19MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ0JLX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfQU5JX0FDQkVfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9BTklfQUNWSV9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX0FOSV9BQ1ZPX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDQktfTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNCRV9MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ1ZJX0xPQ0FMX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVk9fTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNCS19MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1dNRV9BQ0JFX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVklfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9XTUVfQUNWT19MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDQktfTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ0JFX0xPQ0FMX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNWSV9MT0NBTF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDVk9fTE9DQUxfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ0JLX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNCRV9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDVklfTEVOICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9USVRfREVNT19BQ1ZPX0xFTiAgICAyMAorI2RlZmluZSBXTklfQ0ZHX1JBREFSX0NIQU5ORUxfTElTVF9MRU4gICAgMjAKKyNkZWZpbmUgV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVF9MRU4gICAgMTI4CisjZGVmaW5lIFdOSV9DRkdfU1VQUE9SVEVEX01DU19TRVRfTEVOICAgIDE2CisjZGVmaW5lIFdOSV9DRkdfQkFTSUNfTUNTX1NFVF9MRU4gICAgMTYKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX01DU19TRVRfTEVOICAgIDE2CisjZGVmaW5lIFdOSV9DRkdfQkdfU0NBTl9DSEFOTkVMX0xJU1RfTEVOICAgIDEwMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfREFUQV9MRU4gICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMV9MRU4gICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMl9MRU4gICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBM19MRU4gICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9EQVRBX0xFTiAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0RBVEFfTEVOICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEFfTEVOICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1dQU19VVUlEX0xFTiAgICAxNgorCisvKgorICogSW50ZWdlciBwYXJhbWV0ZXIgbWluL21heC9kZWZhdWx0IHZhbHVlcyAKKyAqLworCisjZGVmaW5lIFdOSV9DRkdfQ0ZQX1BFUklPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NGUF9QRVJJT0RfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0NGUF9QRVJJT0RfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT05fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19DRlBfTUFYX0RVUkFUSU9OX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT05fU1RBREVGICAgIDMwMDAwCisKKyNkZWZpbmUgV05JX0NGR19CRUFDT05fSU5URVJWQUxfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19CRUFDT05fSU5URVJWQUxfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMX1NUQURFRiAgICAxMDAKKworI2RlZmluZSBXTklfQ0ZHX0RUSU1fUEVSSU9EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFRJTV9QRVJJT0RfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfRFRJTV9QRVJJT0RfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIX1NUQU1JTiAgICA1CisjZGVmaW5lIFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfU1RBTUFYICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfU1RBREVGICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzUgICAgNQorI2RlZmluZSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzICAgIDEzCisKKyNkZWZpbmUgV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEX1NUQU1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEXzAgICAgMAorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEXzEgICAgMQorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEXzIgICAgMgorI2RlZmluZSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEXzMgICAgMworCisjZGVmaW5lIFdOSV9DRkdfRVhDTFVERV9VTkVOQ1JZUFRFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19FWENMVURFX1VORU5DUllQVEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19SVFNfVEhSRVNIT0xEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlRTX1RIUkVTSE9MRF9TVEFNQVggICAgMjM0NworI2RlZmluZSBXTklfQ0ZHX1JUU19USFJFU0hPTERfU1RBREVGICAgIDIzNDcKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVRfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlUX1NUQURFRiAgICA2CisKKyNkZWZpbmUgV05JX0NGR19MT05HX1JFVFJZX0xJTUlUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVF9TVEFERUYgICAgNgorCisjZGVmaW5lIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBTUlOICAgIDI1NgorI2RlZmluZSBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX1NUQU1BWCAgICA4MDAwCisjZGVmaW5lIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTERfU1RBREVGICAgIDgwMDAKKworI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FDVElWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19BQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUVfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19BQ1RJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BQ1RJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQUNUSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX1NUQURFRiAgICA0MAorCisjZGVmaW5lIFdOSV9DRkdfUEFTU0lWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUVfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUEFTU0lWRV9NSU5JTVVNX0NIQU5ORUxfVElNRV9TVEFERUYgICAgNjAKKworI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QQVNTSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BBU1NJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUVfU1RBREVGICAgIDExMAorCisjZGVmaW5lIFdOSV9DRkdfSk9JTl9GQUlMVVJFX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVF9TVEFERUYgICAgMzAwMAorCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVRfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VUX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9SU1BfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFERUYgICAgMjAwMAorCisjZGVmaW5lIFdOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVF9TVEFERUYgICAgMjAwMAorCisjZGVmaW5lIFdOSV9DRkdfUkFfUEVSSU9ESUNJVFlfVElNRU9VVF9JTl9QU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JBX1BFUklPRElDSVRZX1RJTUVPVVRfSU5fUFNfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUkFfUEVSSU9ESUNJVFlfVElNRU9VVF9JTl9QU19TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVJfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUl9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9CQ05fRklMVEVSX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfSEVBUlRfQkVBVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9IRUFSVF9CRUFUX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX0hFQVJUX0JFQVRfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1JfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QU19FTkFCTEVfUlNTSV9NT05JVE9SX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19SRl9TRVRUTElOR19USU1FX0NMS19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLX1NUQU1BWCAgICA2MDAwMAorI2RlZmluZSBXTklfQ0ZHX1JGX1NFVFRMSU5HX1RJTUVfQ0xLX1NUQURFRiAgICAxNTAwCisKKyNkZWZpbmUgV05JX0NGR19QSFlfTU9ERV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BIWV9NT0RFX1NUQU1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfUEhZX01PREVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BIWV9NT0RFXzExQSAgICAwCisjZGVmaW5lIFdOSV9DRkdfUEhZX01PREVfMTFCICAgIDEKKyNkZWZpbmUgV05JX0NGR19QSFlfTU9ERV8xMUcgICAgMgorI2RlZmluZSBXTklfQ0ZHX1BIWV9NT0RFX05PTkUgICAgMworCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfU1RBTUFYICAgIDkKKyNkZWZpbmUgV05JX0NGR19ET1QxMV9NT0RFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19ET1QxMV9NT0RFX0FMTCAgICAwCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUEgICAgMQorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfMTFCICAgIDIKKyNkZWZpbmUgV05JX0NGR19ET1QxMV9NT0RFXzExRyAgICAzCisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV8xMU4gICAgNAorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfUE9MQVJJUyAgICA1CisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9USVRBTiAgICA2CisjZGVmaW5lIFdOSV9DRkdfRE9UMTFfTU9ERV9UQVVSVVMgICAgNworI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfMTFHX09OTFkgICAgOAorI2RlZmluZSBXTklfQ0ZHX0RPVDExX01PREVfMTFOX09OTFkgICAgOQorCisjZGVmaW5lIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMX1NUQU1BWCAgICAxNjUKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX0NIQU5ORUxfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzVHSFpfU1RBTUFYICAgIDExCisjZGVmaW5lIFdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzVHSFpfU1RBREVGICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWl9TVEFNQVggICAgMzEKKyNkZWZpbmUgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFpfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1JBVEVfQURBUFRBVElPTl9UWVBFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEVfU1RBTUFYICAgIDIKKyNkZWZpbmUgV05JX0NGR19SQVRFX0FEQVBUQVRJT05fVFlQRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfUkFURV9BREFQVEFUSU9OX1RZUEVfRklYRUQgICAgMAorI2RlZmluZSBXTklfQ0ZHX1JBVEVfQURBUFRBVElPTl9UWVBFX0FVVE8gICAgMQorI2RlZmluZSBXTklfQ0ZHX1JBVEVfQURBUFRBVElPTl9UWVBFX1NOUl9CQVNFRCAgICAyCisKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9TVEFNQVggICAgMzEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX0FVVE8gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMU1CUFMgICAgMQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMk1CUFMgICAgMgorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNV81TUJQUyAgICAzCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8xMU1CUFMgICAgNAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNk1CUFMgICAgNQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfOU1CUFMgICAgNgorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMTJNQlBTICAgIDcKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzE4TUJQUyAgICA4CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8yNE1CUFMgICAgOQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMzZNQlBTICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV80OE1CUFMgICAgMTEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzU0TUJQUyAgICAxMgorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNl81TUJQU19NQ1MwXzIwTUhaX1NJTU8gICAgMTMKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzEzTUJQU19NQ1MxXzIwTUhaX1NJTU8gICAgMTQKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzE5XzVNQlBTX01DUzJfMjBNSFpfU0lNTyAgICAxNQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMjZNQlBTX01DUzNfMjBNSFpfU0lNTyAgICAxNgorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMzlNQlBTX01DUzRfMjBNSFpfU0lNTyAgICAxNworI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNTJNQlBTX01DUzVfMjBNSFpfU0lNTyAgICAxOAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNThfNU1CUFNfTUNTNl8yME1IWl9TSU1PICAgIDE5CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV82NU1CUFNfTUNTN18yME1IWl9TSU1PICAgIDIwCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV83XzJNQlBTX01DUzBfMjBNSFpfU0lNT19TR0kgICAgMjEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzE0XzRNQlBTX01DUzFfMjBNSFpfU0lNT19TR0kgICAgMjIKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzIxXzdNQlBTX01DUzJfMjBNSFpfU0lNT19TR0kgICAgMjMKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzI4XzlNQlBTX01DUzNfMjBNSFpfU0lNT19TR0kgICAgMjQKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzQzXzNNQlBTX01DUzRfMjBNSFpfU0lNT19TR0kgICAgMjUKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzU3XzhNQlBTX01DUzVfMjBNSFpfU0lNT19TR0kgICAgMjYKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFXzY1TUJQU19NQ1M2XzIwTUhaX1NJTU9fU0dJICAgIDI3CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV83Ml8yTUJQU19NQ1M3XzIwTUhaX1NJTU9fU0dJICAgIDI4CisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV8wXzI1TUJQU19TTFJfMjBNSFpfU0lNTyAgICAyOQorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfMF81TUJQU19TTFJfMjBNSFpfU0lNTyAgICAzMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfNjhfMjVNQlBTX1FDX1BST1BfMjBNSFpfU0lNTyAgICAzMQorCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFpfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWl9TVEFNQVggICAgMzEKKyNkZWZpbmUgV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWl9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFpfU1RBTUFYICAgIDMxCisjZGVmaW5lIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWl9TVEFERUYgICAgNQorCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfU1RBREVGICAgIDQKKworI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfTUlOX1NVUFBPUlRFRCAgICAwCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9QUklNQVJZICAgIDEKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfUE9MSUNZX1JFU0VSVkVEICAgIDIKKyNkZWZpbmUgV05JX0NGR19SRVRSWVJBVEVfUE9MSUNZX0NMT1NFU1QgICAgMworI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfQVVUT1NFTEVDVCAgICA0CisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWV9NQVggICAgNQorCisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1NFQ09OREFSWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9TRUNPTkRBUllfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9TRUNPTkRBUllfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BUFNEX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BUFNEX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19BUFNEX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1NIQVJFRF9LRVlfQVVUSF9FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hBUkVEX0tFWV9BVVRIX0VOQUJMRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19PUEVOX1NZU1RFTV9BVVRIX0VOQUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX09QRU5fU1lTVEVNX0FVVEhfRU5BQkxFX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQVVUSEVOVElDQVRJT05fVFlQRV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUklWQUNZX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUklWQUNZX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUklWQUNZX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9QUkVBTUJMRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19BQ0NFUFRfU0hPUlRfU0xPVF9BU1NPQ19PTkxZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQUNDRVBUX1NIT1JUX1NMT1RfQVNTT0NfT05MWV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0FDQ0VQVF9TSE9SVF9TTE9UX0FTU09DX09OTFlfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1FPU19FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUU9TX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19RT1NfRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfSENGX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19IQ0ZfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0hDRl9FTkFCTEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19SU05fRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JTTl9FTkFCTEVEX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUlNOX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9QRVJJT0RfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19CQUNLR1JPVU5EX1NDQU5fUEVSSU9EX1NUQU1BWCAgICAxODAwMDAKKyNkZWZpbmUgV05JX0NGR19CQUNLR1JPVU5EX1NDQU5fUEVSSU9EX1NUQURFRiAgICA1MDAwCisKKyNkZWZpbmUgV05JX0NGR19NQVhfTlVNX1BSRV9BVVRIX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX05VTV9QUkVfQVVUSF9TVEFNQVggICAgMjU2CisjZGVmaW5lIFdOSV9DRkdfTUFYX05VTV9QUkVfQVVUSF9TVEFERUYgICAgNjQKKworI2RlZmluZSBXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTERfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTERfU1RBREVGICAgIDQwCisKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9BRlRFUl9IQl9GQUlMX1RJTUVPVVRfU1RBTUlOICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VUX1NUQU1BWCAgICAxMDAwMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVF9TVEFERUYgICAgNDAKKworI2RlZmluZSBXTklfQ0ZHXzExRF9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfMTFEX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR18xMURfRU5BQkxFRF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfTkVUV09SS19ERU5TSVRZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTkVUV09SS19ERU5TSVRZX1NUQU1BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfTkVUV09SS19ERU5TSVRZX1NUQURFRiAgICAzCisKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfTE9XICAgIDAKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfTUVESVVNICAgIDEKKyNkZWZpbmUgV05JX0NGR19ORVRXT1JLX0RFTlNJVFlfSElHSCAgICAyCisjZGVmaW5lIFdOSV9DRkdfTkVUV09SS19ERU5TSVRZX0FEQVBUSVZFICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX0FEQVBUSVZFX1RIUkVTSE9MRF9BTEdPUklUSE1fU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19BREFQVElWRV9USFJFU0hPTERfQUxHT1JJVEhNX1NUQU1BWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfQURBUFRJVkVfVEhSRVNIT0xEX0FMR09SSVRITV9TVEFERUYgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfQURBUFRJVkVfVEhSRVNIT0xEX0FMR09SSVRITV9DQVJSSUVSICAgIDEKKyNkZWZpbmUgV05JX0NGR19BREFQVElWRV9USFJFU0hPTERfQUxHT1JJVEhNX0NPUlJFTEFUSU9OICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfVFhfQU5URU5OQV9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfVFhfQU5URU5OQV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0NVUlJFTlRfVFhfQU5URU5OQV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BX1NUQU1JTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BX1NUQU1BWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BX1NUQURFRiAgICAyCisKKyNkZWZpbmUgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9TVEFNQVggICAgMTI4CisjZGVmaW5lIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9TVEFERUYgICAgMjcKKworI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU5fU1RBREVGICAgIDc4NQorCisjZGVmaW5lIFdOSV9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOX09GRiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOX09OICAgIDEKKyNkZWZpbmUgV05JX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU5fVFggICAgMgorI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9SWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOX01BU0sgICAgMTUKKyNkZWZpbmUgV05JX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU5fQ0hBSU5fMF9PRkZTRVQgICAgMAorI2RlZmluZSBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9DSEFJTl8xX09GRlNFVCAgICA0CisjZGVmaW5lIFdOSV9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOX0NIQUlOXzJfT0ZGU0VUICAgIDgKKworI2RlZmluZSBXTklfQ0ZHX05FV19CU1NfRk9VTkRfSU5EX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTkVXX0JTU19GT1VORF9JTkRfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19ORVdfQlNTX0ZPVU5EX0lORF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfQU5JX0ZFQVRVUkVTX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9QUklFVEFSWV9BTklfRkVBVFVSRVNfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST1BSSUVUQVJZX0FOSV9GRUFUVVJFU19FTkFCTEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9QUklFVEFSWV9SQVRFU19FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST1BSSUVUQVJZX1JBVEVTX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHXzExSF9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfMTFIX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR18xMUhfRU5BQkxFRF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfU1RBTUlOICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfV1RfQ05GX1RJTUVPVVRfU1RBTUFYICAgIDMwMDAKKyNkZWZpbmUgV05JX0NGR19XVF9DTkZfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfS0VFUEFMSVZFX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19LRUVQQUxJVkVfVElNRU9VVF9TVEFNQVggICAgMzYwMDAwMAorI2RlZmluZSBXTklfQ0ZHX0tFRVBBTElWRV9USU1FT1VUX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9YSU1JVFlfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9YSU1JVFlfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUk9YSU1JVFlfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BST1hJTUlUWV9PRkYgICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST1hJTUlUWV9PTiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19MT0dfTEVWRUxfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19MT0dfTEVWRUxfU1RBTUFYICAgIDcKKyNkZWZpbmUgV05JX0NGR19MT0dfTEVWRUxfU1RBREVGICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX09MQkNfREVURUNUX1RJTUVPVVRfU1RBTUlOICAgIDEwMDAKKyNkZWZpbmUgV05JX0NGR19PTEJDX0RFVEVDVF9USU1FT1VUX1NUQU1BWCAgICAzMDAwMAorI2RlZmluZSBXTklfQ0ZHX09MQkNfREVURUNUX1RJTUVPVVRfU1RBREVGICAgIDEwMDAwCisKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX1NUQURFRiAgICA2NTUzNQorCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX0ZST01fbGxBICAgIDAKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfRlJPTV9sbEIgICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9GUk9NX2xsRyAgICAyCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX0hUXzIwICAgIDMKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfTk9OX0dGICAgIDQKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfTFNJR19UWE9QICAgIDUKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfUklGUyAgICA2CisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09CU1MgICAgNworI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX0ZST01fbGxBICAgIDgKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0xCQ19GUk9NX2xsQiAgICA5CisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09MQkNfRlJPTV9sbEcgICAgMTAKKyNkZWZpbmUgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0xCQ19IVDIwICAgIDExCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09MQkNfTk9OX0dGICAgIDEyCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09MQkNfTFNJR19UWE9QICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09MQkNfUklGUyAgICAxNAorI2RlZmluZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX09CU1MgICAgMTUKKworI2RlZmluZSBXTklfQ0ZHXzExR19QUk9URUNUSU9OX0FMV0FZU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHXzExR19QUk9URUNUSU9OX0FMV0FZU19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHXzExR19QUk9URUNUSU9OX0FMV0FZU19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9TVEFNQVggICAgNQorI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX1NUQURFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFICAgIDAKKyNkZWZpbmUgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9DVFMgICAgMQorI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX1JUUyAgICAyCisjZGVmaW5lIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fRFVBTF9DVFMgICAgMworI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX1JUU19BTFdBWVMgICAgNAorI2RlZmluZSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0FVVE8gICAgNQorCisjZGVmaW5lIFdOSV9DRkdfMTFHX1NIT1JUX1BSRUFNQkxFX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHXzExR19TSE9SVF9QUkVBTUJMRV9FTkFCTEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRURfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0NBTF9QRVJJT0RfU1RBTUlOICAgIDIKKyNkZWZpbmUgV05JX0NGR19DQUxfUEVSSU9EX1NUQU1BWCAgICAxMAorI2RlZmluZSBXTklfQ0ZHX0NBTF9QRVJJT0RfU1RBREVGICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX1NUQVRTX1BFUklPRF9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX1NUQVRTX1BFUklPRF9TVEFNQVggICAgMTAKKyNkZWZpbmUgV05JX0NGR19TVEFUU19QRVJJT0RfU1RBREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19DQUxfQ09OVFJPTF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NBTF9DT05UUk9MX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQ0FMX0NPTlRST0xfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0NBTF9DT05UUk9MX0NBTF9PTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0FMX0NPTlRST0xfQ0FMX09GRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR18xMUdfT05MWV9QT0xJQ1lfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR18xMUdfT05MWV9QT0xJQ1lfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR18xMUdfT05MWV9QT0xJQ1lfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUEFDS0VUX0NMQVNTSUZJQ0FUSU9OX0RJU0FCTEVEICAgIDAKKyNkZWZpbmUgV05JX0NGR19QQUNLRVRfQ0xBU1NJRklDQVRJT05fRFNDUCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUEFDS0VUX0NMQVNTSUZJQ0FUSU9OXzgwMjFQICAgIDIKKyNkZWZpbmUgV05JX0NGR19QQUNLRVRfQ0xBU1NJRklDQVRJT05fQUxMICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX1dNRV9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV01FX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19XTUVfRU5BQkxFRF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfQUREVFNfUlNQX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BRERUU19SU1BfVElNRU9VVF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19BRERUU19SU1BfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX1NQX0xFTkdUSF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9TUF9MRU5HVEhfU1RBTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19NQVhfU1BfTEVOR1RIX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19TRU5EX1NJTkdMRV9TU0lEX0FMV0FZU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NFTkRfU0lOR0xFX1NTSURfQUxXQVlTX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0VORF9TSU5HTEVfU1NJRF9BTFdBWVNfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dTTV9FTkFCTEVEX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1NNX0VOQUJMRURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19XU01fRU5BQkxFRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9TVEFERUYgICAgNTc1MzUKKworI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9IQ0YgICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV8xMUVRT1MgICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9XTUUgICAgMgorI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9XU00gICAgMworI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9FWFRSQVRFUyAgICA0CisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX0VYVFJBVEVfU1RPUCAgICA1CisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX1RJVEFOICAgIDYKKyNkZWZpbmUgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfVEFVUlVTICAgIDcKKyNkZWZpbmUgV05JX0NGR19QUk9QX0NBUEFCSUxJVFlfRURDQVBBUkFNUyAgICAxMworI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9MT0FESU5GTyAgICAxNAorI2RlZmluZSBXTklfQ0ZHX1BST1BfQ0FQQUJJTElUWV9WRVJTSU9OICAgIDE1CisjZGVmaW5lIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZX01BWEJJVE9GRlNFVCAgICAxNQorCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9BTkkgICAgMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9XTU0gICAgMQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9USVRfREVNTyAgICAyCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX01BWCAgICAzCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0FDTV9JRFggICAgMAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9BSUZTTl9JRFggICAgMQorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01JTkFfSURYICAgIDIKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNQVhBX0lEWCAgICA0CisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX1RYT1BBX0lEWCAgICA2CisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUlOQl9JRFggICAgNworI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01BWEJfSURYICAgIDkKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfVFhPUEJfSURYICAgIDExCisjZGVmaW5lIFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUlOR19JRFggICAgMTIKKyNkZWZpbmUgV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNQVhHX0lEWCAgICAxNAorI2RlZmluZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9UWE9QR19JRFggICAgMTYKKworI2RlZmluZSBXTklfQ0ZHX1JERVRfRkxBR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JERVRfRkxBR19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1JERVRfRkxBR19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUkRFVF9GTEFHX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfUkRFVF9GTEFHX0RJU0FCTEUgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlRfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlRfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9TVEFNQVggICAgMgorI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfUE9MSUNZX0FETUlUX0FMTCAgICAwCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfUE9MSUNZX1JFSkVDVF9BTEwgICAgMQorI2RlZmluZSBXTklfQ0ZHX0FETUlUX1BPTElDWV9CV19GQUNUT1IgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfQldGQUNUT1JfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BRE1JVF9CV0ZBQ1RPUl9TVEFNQVggICAgMTAwCisjZGVmaW5lIFdOSV9DRkdfQURNSVRfQldGQUNUT1JfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkVfU1RBTUFYICAgIDI1NgorI2RlZmluZSBXTklfQ0ZHX01BWF9DT05TRUNVVElWRV9CQUNLR1JPVU5EX1NDQU5fRkFJTFVSRV9TVEFERUYgICAgNjAKKworI2RlZmluZSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfU1RBTUFYICAgIDQKKyNkZWZpbmUgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRSAgICAwCisjZGVmaW5lIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRU5BQkxFICAgIDEKKyNkZWZpbmUgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9JRl9OT19MRUdBQ1lfQlNTICAgIDIKKyNkZWZpbmUgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9JRl9OT19MRUdBQ1lfQUxMICAgIDMKKyNkZWZpbmUgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9JTlRFTExJR0VOVCAgICA0CisKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFX1NUQU1BWCAgICAyCisjZGVmaW5lIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFX05PTkUgICAgMAorI2RlZmluZSBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFX0xPV0VSICAgIDEKKyNkZWZpbmUgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9ISUdIRVIgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfWkVST19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk9fU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk9fU1RBREVGICAgIDIKKworI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FX1NUQURFRiAgICA0CisKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV09fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV09fU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1RXT19TVEFERUYgICAgNgorCisjZGVmaW5lIFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU5fU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19UUklHX1NUQV9CS19TQ0FOX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QUk9GSUxFX1NXSVRDSElOR19TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QUk9GSUxFX1NXSVRDSElOR19TVEFERUYgICAgMjU1CisKKyNkZWZpbmUgV05JX0NGR19EWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HX1VOVVNFRCAgICAyNTUKKworI2RlZmluZSBXTklfQ0ZHX01JTU9fRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01JTU9fRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX01JTU9fRU5BQkxFRF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfTUlNT19FTkFCTEVEX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfTUlNT19FTkFCTEVEX0RJU0FCTEUgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9ERUxBWUVEICAgIDAKKyNkZWZpbmUgV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9JTU1FRElBVEUgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfQkFfQUNUSVZJVFlfQ0hFQ0tfVElNRU9VVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JBX0FDVElWSVRZX0NIRUNLX1RJTUVPVVRfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQkFfQUNUSVZJVFlfQ0hFQ0tfVElNRU9VVF9TVEFERUYgICAgMTAwMAorCisjZGVmaW5lIFdOSV9DRkdfSFRfUlhfU1RCQ19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX1JYX1NUQkNfU1RBTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19IVF9SWF9TVEJDX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NUQURFRiAgICAzNjQKKworI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX0FEVkFOQ0VfQ09ESU5HICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19TVVBQT1JURURfQ0hBTl9XSURUSF9TRVQgICAgMQorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1NNX1BPV0VSX1NBVkUgICAgMgorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX0dSRUVOX0ZJRUxEICAgIDQKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19TSE9SVF9HSV8yME1IWiAgICA1CisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fU0hPUlRfR0lfNDBNSFogICAgNgorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1RYX1NUQkMgICAgNworI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX1JYX1NUQkMgICAgOAorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX0RFTEFZRURfQkEgICAgMTAKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19NQVhfQU1TRFVfU0laRSAgICAxMQorI2RlZmluZSBXTklfQ0ZHX0hUX0NBUF9JTkZPX0RTU1NfQ0NLX01PREVfNDBNSFogICAgMTIKKyNkZWZpbmUgV05JX0NGR19IVF9DQVBfSU5GT19QU01QICAgIDEzCisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fU1RCQ19DT05UUk9MX0ZSQU1FICAgIDE0CisjZGVmaW5lIFdOSV9DRkdfSFRfQ0FQX0lORk9fTFNJR19UWE9QX1BST1RFQ1RJT04gICAgMTUKKworI2RlZmluZSBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNU19TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19IVF9BTVBEVV9QQVJBTVNfTUFYX1JYX0FNUERVX0ZBQ1RPUiAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TX01QRFVfREVOU0lUWSAgICAyCisjZGVmaW5lIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TX1JFU0VSVkVEICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19FWFRfSFRfQ0FQX0lORk9fU1RBREVGICAgIDEwMjQKKworI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19QQ08gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19UUkFOU0lUSU9OX1RJTUUgICAgMQorI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19SRVNFUlZFRDEgICAgMworI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19NQ1NfRkVFREJBQ0sgICAgOAorI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19IVENfU1VQUE9SVCAgICAxMAorI2RlZmluZSBXTklfQ0ZHX0VYVF9IVF9DQVBfSU5GT19SRF9SRVNQT05ERVIgICAgMTEKKyNkZWZpbmUgV05JX0NGR19FWFRfSFRfQ0FQX0lORk9fUkVTRVJWRUQyICAgIDEyCisKKyNkZWZpbmUgV05JX0NGR19UWF9CRl9DQVBfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19UWF9CRl9DQVBfU1RBTUFYICAgIDQyOTQ5NjcyOTUKKyNkZWZpbmUgV05JX0NGR19UWF9CRl9DQVBfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BU19DQVBfQU5URU5OQV9TRUxFQ1RJT04gICAgMAorI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9FWFBMSUNJVF9DU0lfRkVFREJBQ0tfVFggICAgMQorI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9BTlRFTk5BX0lORElDRVNfRkVFREJBQ0tfVFggICAgMgorI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9FWFBMSUNJVF9DU0lfRkVFREJBQ0sgICAgMworI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9BTlRFTk5BX0lORElDRVNfRkVFREJBQ0sgICAgNAorI2RlZmluZSBXTklfQ0ZHX0FTX0NBUF9SWF9BUyAgICA1CisjZGVmaW5lIFdOSV9DRkdfQVNfQ0FQX1RYX1NPVU5ESU5HX1BQRFVTICAgIDYKKyNkZWZpbmUgV05JX0NGR19BU19DQVBfUkVTRVJWRUQgICAgNworCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDFfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDFfU1RBREVGICAgIDE1CisKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMV9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVQgICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQxX1JFQ09NTUVOREVEX0NIQU5ORUxfV0lEVEggICAgMgorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQxX1JJRlNfTU9ERSAgICAzCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDFfUFNNUF9BQ0NFU1NfT05MWSAgICA0CisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDFfU0VSVklDRV9JTlRFUlZBTF9HUkFOVUxBUklUWSAgICA1CisKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQyX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQyX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMl9PUF9NT0RFICAgIDAKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMl9OT05fR0ZfREVWSUNFU19QUkVTRU5UICAgIDIKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMl9SRVNFUlZFRCAgICAzCisKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEM19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEM19CQVNJQ19TVEJDX01DUyAgICAwCisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfRFVBTF9TVEJDX1BST1RFQ1RJT04gICAgNworI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX1NFQ09OREFSWV9CRUFDT04gICAgOAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX0xTSUdfVFhPUF9QUk9URUNUSU9OX0ZVTExfU1VQUE9SVCAgICA5CisjZGVmaW5lIFdOSV9DRkdfSFRfSU5GT19GSUVMRDNfUENPX0FDVElWRSAgICAxMAorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX1BDT19QSEFTRSAgICAxMQorI2RlZmluZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzX1JFU0VSVkVEICAgIDEyCisKKyNkZWZpbmUgV05JX0NGR19HUkVFTkZJRUxEX0NBUEFCSUxJVFlfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19HUkVFTkZJRUxEX0NBUEFCSUxJVFlfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19HUkVFTkZJRUxEX0NBUEFCSUxJVFlfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWV9FTkFCTEUgICAgMQorI2RlZmluZSBXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWV9ESVNBQkxFICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX01BWF9BTVNEVV9MRU5HVEhfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfQU1TRFVfTEVOR1RIX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSF9TSE9SVF8zODM5X0JZVEVTICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfQU1TRFVfTEVOR1RIX0xPTkdfNzkzNV9fQllURVMgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfTVBEVV9ERU5TSVRZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTVBEVV9ERU5TSVRZX1NUQU1BWCAgICA3CisjZGVmaW5lIFdOSV9DRkdfTVBEVV9ERU5TSVRZX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUFYX1JYX0FNUERVX0ZBQ1RPUl9TVEFNQVggICAgMworI2RlZmluZSBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1JfU1RBREVGICAgIDMKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV8yME1IWl9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFpfRU5BQkxFICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV8yME1IWl9ESVNBQkxFICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV80ME1IWl9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfU0hPUlRfR0lfNDBNSFpfRU5BQkxFICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSE9SVF9HSV80ME1IWl9ESVNBQkxFICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1JJRlNfRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JJRlNfRU5BQkxFRF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1JJRlNfRU5BQkxFRF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfUklGU19FTkFCTEVEX0VOQUJMRSAgICAxCisjZGVmaW5lIFdOSV9DRkdfUklGU19FTkFCTEVEX0RJU0FCTEUgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTUFYX1BTX1BPTExfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NQVhfUFNfUE9MTF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfTUFYX1BTX1BPTExfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRV9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRV9TVEFNQVggICAgMjAKKyNkZWZpbmUgV05JX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0VfU1RBREVGICAgIDIwCisKKyNkZWZpbmUgV05JX0NGR19SU1NJX0ZJTFRFUl9QRVJJT0RfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SU1NJX0ZJTFRFUl9QRVJJT0RfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX1JTU0lfRklMVEVSX1BFUklPRF9TVEFERUYgICAgMjAKKworI2RlZmluZSBXTklfQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfRlRfUlNTSV9GSUxURVJfUEVSSU9EX1NUQURFRiAgICA1CisKKyNkZWZpbmUgV05JX0NGR19NSU5fUlNTSV9USFJFU0hPTERfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19NSU5fUlNTSV9USFJFU0hPTERfU1RBTUFYICAgIDEwCisjZGVmaW5lIFdOSV9DRkdfTUlOX1JTU0lfVEhSRVNIT0xEX1NUQURFRiAgICAxMAorCisjZGVmaW5lIFdOSV9DRkdfTlRIX0JFQUNPTl9GSUxURVJfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19OVEhfQkVBQ09OX0ZJTFRFUl9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfTlRIX0JFQUNPTl9GSUxURVJfU1RBREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19CUk9BRENBU1RfRlJBTUVfRklMVEVSX0VOQUJMRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JST0FEQ0FTVF9GUkFNRV9GSUxURVJfRU5BQkxFX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfQlJPQURDQVNUX0ZSQU1FX0ZJTFRFUl9FTkFCTEVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1NDQU5fSU5fUE9XRVJTQVZFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfSUdOT1JFX0RUSU1fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19JR05PUkVfRFRJTV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0lHTk9SRV9EVElNX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fVUNBU1RfUEFUVEVSTl9GSUxURVJfRU5BQkxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX1VDQVNUX1BBVFRFUk5fRklMVEVSX0VOQUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9VQ0FTVF9QQVRURVJOX0ZJTFRFUl9FTkFCTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9DSEFOTkVMX1NXSVRDSF9FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fQ0hBTk5FTF9TV0lUQ0hfRU5BQkxFX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX0NIQU5ORUxfU1dJVENIX0VOQUJMRV9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX0RFQVVUSF9FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fREVBVVRIX0VOQUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9ERUFVVEhfRU5BQkxFX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fRElTQVNTT0NfRU5BQkxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV09XTEFOX0RJU0FTU09DX0VOQUJMRV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9ESVNBU1NPQ19FTkFCTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTl9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTl9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fTUFYX01JU1NFRF9CRUFDT05fU1RBREVGICAgIDQwCisKKyNkZWZpbmUgV05JX0NGR19XT1dMQU5fTUFYX1NMRUVQX1BFUklPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9NQVhfU0xFRVBfUEVSSU9EX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1dPV0xBTl9NQVhfU0xFRVBfUEVSSU9EX1NUQURFRiAgICA2NTUzNQorCisjZGVmaW5lIFdOSV9DRkdfQkFfVElNRU9VVF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0JBX1RJTUVPVVRfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfQkFfVElNRU9VVF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQkFfVEhSRVNIT0xEX0hJR0hfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19CQV9USFJFU0hPTERfSElHSF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19CQV9USFJFU0hPTERfSElHSF9TVEFERUYgICAgMTI4CisKKyNkZWZpbmUgV05JX0NGR19NQVhfQkFfQlVGRkVSU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9CQV9CVUZGRVJTX1NUQU1BWCAgICAyNTYwCisjZGVmaW5lIFdOSV9DRkdfTUFYX0JBX0JVRkZFUlNfU1RBREVGICAgIDI1NjAKKworI2RlZmluZSBXTklfQ0ZHX01BWF9CQV9TRVNTSU9OU19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9CQV9TRVNTSU9OU19TVEFNQVggICAgNjQKKyNkZWZpbmUgV05JX0NGR19NQVhfQkFfU0VTU0lPTlNfU1RBREVGICAgIDQwCisKKyNkZWZpbmUgV05JX0NGR19CQV9BVVRPX1NFVFVQX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQkFfQVVUT19TRVRVUF9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0JBX0FVVE9fU0VUVVBfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX0JBX0FVVE9fU0VUVVBfRU5BQkxFICAgIDEKKyNkZWZpbmUgV05JX0NGR19CQV9BVVRPX1NFVFVQX0RJU0FCTEUgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQUREQkFfUkVRX0RFQ0xJTkVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BRERCQV9SRVFfREVDTElORV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfQUREQkFfUkVRX0RFQ0xJTkVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19NQVhfTUVESVVNX1RJTUVfU1RBREVGICAgIDIwNDgKKworI2RlZmluZSBXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19NQVhfTVBEVVNfSU5fQU1QRFVfU1RBREVGICAgIDY0CisKKyNkZWZpbmUgV05JX0NGR19JQlNTX0FVVE9fQlNTSURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19JQlNTX0FVVE9fQlNTSURfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19JQlNTX0FVVE9fQlNTSURfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfRkxBR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfRkxBR19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROSUVfRkxBR19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BU1NPQ19SU1BfQURETklFX0ZMQUdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BU1NPQ19SU1BfQURETklFX0ZMQUdfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19BU1NPQ19SU1BfQURETklFX0ZMQUdfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROUDJQSUVfRkxBR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROUDJQSUVfRkxBR19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JFUV9BREROUDJQSUVfRkxBR19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0ZMQUdfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19XUFNfRU5BQkxFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX0VOQUJMRV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfV1BTX0VOQUJMRV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0VOQUJMRV9BUCAgICAxCisjZGVmaW5lIFdOSV9DRkdfV1BTX0VOQUJMRV9TVEEgICAgMgorCisjZGVmaW5lIFdOSV9DRkdfV1BTX1NUQVRFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX1NUQVRFX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19XUFNfU1RBVEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dQU19QUk9CRV9SRVFfRkxBR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19QUk9CRV9SRVFfRkxBR19TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX1dQU19QUk9CRV9SRVFfRkxBR19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX1ZFUlNJT05fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfVkVSU0lPTl9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfV1BTX1ZFUlNJT05fU1RBREVGICAgIDE2CisKKyNkZWZpbmUgV05JX0NGR19XUFNfUkVRVUVTVF9UWVBFX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX1JFUVVFU1RfVFlQRV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfV1BTX1JFUVVFU1RfVFlQRV9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0NGR19NRVRIT0RfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfQ0ZHX01FVEhPRF9TVEFNQVggICAgNDI5NDk2NzI5NQorI2RlZmluZSBXTklfQ0ZHX1dQU19DRkdfTUVUSE9EX1NUQURFRiAgICA4CisKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJJTUFSWV9ERVZJQ0VfQ0FURUdPUllfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfUFJJTUFSWV9ERVZJQ0VfQ0FURUdPUllfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfV1BTX1BSSU1BUllfREVWSUNFX0NBVEVHT1JZX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19XUFNfUElNQVJZX0RFVklDRV9PVUlfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfUElNQVJZX0RFVklDRV9PVUlfU1RBTUFYICAgIDQyOTQ5NjcyOTUKKyNkZWZpbmUgV05JX0NGR19XUFNfUElNQVJZX0RFVklDRV9PVUlfU1RBREVGICAgIDUzMDQ4MzYKKworI2RlZmluZSBXTklfQ0ZHX1dQU19ERVZJQ0VfU1VCX0NBVEVHT1JZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX0RFVklDRV9TVUJfQ0FURUdPUllfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfV1BTX0RFVklDRV9TVUJfQ0FURUdPUllfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ0lBVElPTl9TVEFURV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ0lBVElPTl9TVEFURV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19XUFNfQVNTT0NJQVRJT05fU1RBVEVfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dQU19DT05GSUdVUkFUSU9OX0VSUk9SX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1JfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfV1BTX0NPTkZJR1VSQVRJT05fRVJST1JfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1dQU19ERVZJQ0VfUEFTU1dPUkRfSURfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEX1NUQU1BWCAgICA0Mjk0OTY3Mjk1CisjZGVmaW5lIFdOSV9DRkdfV1BTX0RFVklDRV9QQVNTV09SRF9JRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfV1BTX0FTU09DX01FVEhPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1dQU19BU1NPQ19NRVRIT0RfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfV1BTX0FTU09DX01FVEhPRF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfTE9XX0dBSU5fT1ZFUlJJREVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19MT1dfR0FJTl9PVkVSUklERV9TVEFNQVggICAgMQorI2RlZmluZSBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9QSFlfQUdDX0xJU1RFTl9NT0RFX1NUQU1BWCAgICAxMjgKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERV9TVEFERUYgICAgMTI4CisKKyNkZWZpbmUgV05JX0NGR19SUEVfUE9MTElOR19USFJFU0hPTERfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUEVfUE9MTElOR19USFJFU0hPTERfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUlBFX1BPTExJTkdfVEhSRVNIT0xEX1NUQURFRiAgICAxMAorCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMwX1JFR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMF9SRUdfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMwX1JFR19TVEFERUYgICAgMzAKKworI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUdfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzFfUkVHX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUdfU1RBREVGICAgIDMwCisKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzJfUkVHX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMyX1JFR19TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzJfUkVHX1NUQURFRiAgICAzMAorCisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMzX1JFR19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDM19SRUdfU1RBTUFYICAgIDY1NTM1CisjZGVmaW5lIFdOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMzX1JFR19TVEFERUYgICAgMzAKKworI2RlZmluZSBXTklfQ0ZHX05PX09GX09OQ0hJUF9SRU9SREVSX1NFU1NJT05TX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTk9fT0ZfT05DSElQX1JFT1JERVJfU0VTU0lPTlNfU1RBTUFYICAgIDIKKyNkZWZpbmUgV05JX0NGR19OT19PRl9PTkNISVBfUkVPUkRFUl9TRVNTSU9OU19TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfU0lOR0xFX1RJRF9SQ19TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1NJTkdMRV9USURfUkNfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19TSU5HTEVfVElEX1JDX1NUQURFRiAgICAxCisKKyNkZWZpbmUgV05JX0NGR19SUk1fRU5BQkxFRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX1JSTV9FTkFCTEVEX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfUlJNX0VOQUJMRURfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVhfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUk1fT1BFUkFUSU5HX0NIQU5fTUFYX1NUQU1BWCAgICA4CisjZGVmaW5lIFdOSV9DRkdfUlJNX09QRVJBVElOR19DSEFOX01BWF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVhfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWF9TVEFNQVggICAgOAorI2RlZmluZSBXTklfQ0ZHX1JSTV9OT05fT1BFUkFUSU5HX0NIQU5fTUFYX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEVfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEVfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEVfU1RBREVGICAgIDEKKworI2RlZmluZSBXTklfQ0ZHX01DQVNUX0JDQVNUX0ZJTFRFUl9TRVRUSU5HX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkdfU1RBTUFYICAgIDMKKyNkZWZpbmUgV05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElOR19TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0tfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19CVENfREhDUF9CVF9TTE9UU19UT19CTE9DS19TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0tfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfUFNfUE9MTF9WQUxVRV9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0RZTkFNSUNfUFNfUE9MTF9WQUxVRV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19QU19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19QU19OVUxMREFUQV9BUF9SRVNQX1RJTUVPVVRfU1RBTUFYICAgIDgwCisjZGVmaW5lIFdOSV9DRkdfUFNfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VUX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU5fU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU5fU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU5fU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfU1RBTUFYICAgIDcKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9TVEFERUYgICAgMworCisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfSURMRV9CQ05TX1NUQU1JTiAgICA1CisjZGVmaW5lIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfSURMRV9CQ05TX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlNfU1RBREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfU1RBTUFYICAgIDcKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfU1RBREVGICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlNfU1RBTUlOICAgIDUKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TX1NUQURFRiAgICAxNQorCisjZGVmaW5lIFdOSV9DRkdfQlRDX0EyRFBfREhDUF9CVF9TVUJfSU5URVJWQUxTX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfQlRDX0EyRFBfREhDUF9CVF9TVUJfSU5URVJWQUxTX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV05JX0NGR19CVENfQTJEUF9ESENQX0JUX1NVQl9JTlRFUlZBTFNfU1RBREVGICAgIDcKKworI2RlZmluZSBXTklfQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRF9TVEFNSU4gICAgMAorI2RlZmluZSBXTklfQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRF9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV05JX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0RfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVF9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVF9TVEFNQVggICAgMTAKKyNkZWZpbmUgV05JX0NGR19BU1NPQ19TVEFfTElNSVRfU1RBREVGICAgIDEwCisKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMX1NUQU1BWCAgICAyNTIKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9TVEFERUYgICAgMQorCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX0VORF9DSEFOTkVMX1NUQU1JTiAgICAxCisjZGVmaW5lIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX0VORF9DSEFOTkVMX1NUQU1BWCAgICAyNTIKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfRU5EX0NIQU5ORUxfU1RBREVGICAgIDExCisKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfU1RBTUFYICAgIDQKKyNkZWZpbmUgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfU1RBREVGICAgIDAKKworI2RlZmluZSBXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfU1RBTUlOICAgIDAKKyNkZWZpbmUgV05JX0NGR19BUF9EQVRBX0FWQUlMX1BPTExfUEVSSU9EX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0RfU1RBREVGICAgIDUKKworI2RlZmluZSBXTklfQ0ZHX0VOQUJMRV9DTE9TRV9MT09QX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX0NMT1NFX0xPT1BfU1RBTUFYICAgIDEKKyNkZWZpbmUgV05JX0NGR19FTkFCTEVfQ0xPU0VfTE9PUF9TVEFERUYgICAgMAorCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX0xURV9DT0VYX1NUQU1JTiAgICAwCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX0xURV9DT0VYX1NUQU1BWCAgICAxCisjZGVmaW5lIFdOSV9DRkdfRU5BQkxFX0xURV9DT0VYX1NUQURFRiAgICAwCisKKyNkZWZpbmUgV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVRfU1RBTUlOICAgIDEKKyNkZWZpbmUgV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVRfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXTklfQ0ZHX0FQX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFERUYgICAgMjAKKworI2RlZmluZSBXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFNSU4gICAgMQorI2RlZmluZSBXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdOSV9DRkdfR09fS0VFUF9BTElWRV9USU1FT1VUX1NUQURFRiAgICAyMAorCisjZGVmaW5lIENGR19QQVJBTV9NQVhfTlVNICAgICAgICAyNTkKKyNkZWZpbmUgQ0ZHX1NUQV9JQlVGX01BWF9TSVpFICAgIDE5MworI2RlZmluZSBDRkdfU1RBX1NCVUZfTUFYX1NJWkUgICAgMzM4OAorI2RlZmluZSBDRkdfU0VNX01BWF9OVU0gICAgICAgICAgMTIKKworI2RlZmluZSBDRkdfU1RBX01BR0lDX0RXT1JEICAgIDB4YmVlZmJlZWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL2luYy93bmlTdGF0LmggYi9DT1JFL01BQy9pbmMvd25pU3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNmI0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9pbmMvd25pU3RhdC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgd25pU3RhdC5oIGNvbnRhaW5zIHN0YXRpc3RpY3MgcmVsYXRlZCBkZWZpbml0aW9ucworICogZXhwb3J0ZWQgYnkgU2lyaXVzIHNvZnR3YXJlIG1vZHVsZXMuCisgKgorICogQXV0aG9yOiAgICAgIEtldmluIE5ndXllbiAKKyAqIERhdGU6ICAgICAgICAwOC8yMS8yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfV05JU1RBVF9ICisjZGVmaW5lIF9XTklTVEFUX0gKKworCisvLyBXTkkgU3RhdGlzdGljIFBhcmFtZXRlciBJRAorI2RlZmluZSBXTklfU1RBVF9SVFNfU1VDQ19DTlQgICAgICAgICAgICAgIDEgCisjZGVmaW5lIFdOSV9TVEFUX1JUU19GQUlMRURfQ05UICAgICAgICAgICAgMgorI2RlZmluZSBXTklfU1RBVF9QQUNLRVRfQ05UICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV05JX1NUQVRfTVVMVElfQ05UICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdOSV9TVEFUX0RVUExfRlJBR19DTlQgICAgICAgICAgICAgNQorI2RlZmluZSBXTklfU1RBVF9UT1RBTF9CWVRFX0NOVCAgICAgICAgICAgIDYKKyNkZWZpbmUgV05JX1NUQVRfUEtUX0RST1BfQ05UICAgICAgICAgICAgICA3CisjZGVmaW5lIFdOSV9TVEFUX1BLVDY0X0NOVCAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTklfU1RBVF9QS1QxMjdfQ05UICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV05JX1NUQVRfUEtUMjU1X0NOVCAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFdOSV9TVEFUX1BLVDUxMV9DTlQgICAgICAgICAgICAgICAxMQorI2RlZmluZSBXTklfU1RBVF9QS1QxMDIzX0NOVCAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV05JX1NUQVRfUEtUMTUxOF9DTlQgICAgICAgICAgICAgIDEzIAorI2RlZmluZSBXTklfU1RBVF9QS1QyMDQ3X0NOVCAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgV05JX1NUQVRfUEtUNDA5NV9DTlQgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFdOSV9TVEFUX0ZSQUdfQ05UICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBXTklfU1RBVF9GQ1NfQ05UICAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgV05JX1NUQVRfQlNTSURfTUlTU19DTlQgICAgICAgICAgIDE4CisjZGVmaW5lIFdOSV9TVEFUX1BEVV9FUlJfQ05UICAgICAgICAgICAgICAxOQorI2RlZmluZSBXTklfU1RBVF9EU1RfTUlTU19DTlQgICAgICAgICAgICAgMjAKKyNkZWZpbmUgV05JX1NUQVRfRFJPUF9DTlQgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIFdOSV9TVEFUX0FCT1JUX0NOVCAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBXTklfU1RBVF9SRUxBWV9DTlQgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgV05JX1NUQVRfSEFTSF9NSVNTX0NOVCAgICAgICAgICAgIDI0CisjZGVmaW5lIFdOSV9TVEFUX1BMQ1BfQ1JDX0VSUl9DTlQgICAgICAgICAyNQorI2RlZmluZSBXTklfU1RBVF9QTENQX1NJR19FUlJfQ05UICAgICAgICAgMjYKKyNkZWZpbmUgV05JX1NUQVRfUExDUF9TVkNfRVJSX0NOVCAgICAgICAgIDI3CisjZGVmaW5lIFdOSV9TVEFUX0JFQUNPTlNfUkVDRUlWRURfQ05UICAgICAyOAorI2RlZmluZSBXTklfU1RBVF9CRUFDT05TX1RSQU5TTUlUVEVEX0NOVCAgMjkKKyNkZWZpbmUgV05JX1NUQVRfQ1VSUkVOVF9UWF9SQVRFICAgICAgICAgIDMwCisKKyNkZWZpbmUgV05JX1NUQVRfTEFTVF9JRCAgICAgIFdOSV9TVEFUX0NVUlJFTlRfVFhfUkFURQorCisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2NmZy9jZmdBcGkuYyBiL0NPUkUvTUFDL3NyYy9jZmcvY2ZnQXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwZDBlYwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9jZmcvY2ZnQXBpLmMKQEAgLTAsMCArMSwxMTk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSBmb3IgQ0ZHIEFQSSBmdW5jdGlvbnMuCisgKgorICogQXV0aG9yOiAgICAgIEtldmluIE5ndXllbgorICogRGF0ZTogICAgICAgIDA0LzA5LzAyCisgKiBIaXN0b3J5Oi0KKyAqIDA0LzA5LzAyICAgICAgICBDcmVhdGVkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJjZmdQcml2LmgiCisjaW5jbHVkZSAiY2ZnRGVidWcuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGEuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0YXRpYyBWYXJpYWJsZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRDZmdDdGwgICBfX2dDZmdFbnRyeVtDRkdfUEFSQU1fTUFYX05VTV0gICAgICAgICAgICAgICAgOworc3RhdGljIHRBTklfVTMyICBfX2dDZmdJQnVmTWluW0NGR19TVEFfSUJVRl9NQVhfU0laRV0gICAgICAgICAgOworc3RhdGljIHRBTklfVTMyICBfX2dDZmdJQnVmTWF4W0NGR19TVEFfSUJVRl9NQVhfU0laRV0gICAgICAgICAgOworc3RhdGljIHRBTklfVTMyICBfX2dDZmdJQnVmW0NGR19TVEFfSUJVRl9NQVhfU0laRV0gICAgICAgICAgICAgOworc3RhdGljIHRBTklfVTggICBfX2dDZmdTQnVmW0NGR19TVEFfU0JVRl9NQVhfU0laRV0gICAgICAgICAgICAgOworc3RhdGljIHRBTklfVTggICBfX2dTQnVmZmVyW0NGR19NQVhfU1RSX0xFTl0gICAgICAgICAgICAgICAgICAgOworc3RhdGljIHRBTklfVTMyICBfX2dQYXJhbUxpc3RbV05JX0NGR19NQVhfUEFSQU1fTlVNICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0dFVF9QRVJfU1RBX1NUQVRfUlNQX05VTV07CisKK3N0YXRpYyB2b2lkIE5vdGlmeSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRBTklfVTMyKTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RBTklfVTMyIGNmZ05lZWRSZXN0YXJ0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IGNmZ0lkKQoreworICAgIHJldHVybiAhIShwTWFjLT5jZmcuZ0NmZ0VudHJ5W2NmZ0lkXS5jb250cm9sICYgQ0ZHX0NUTF9SRVNUQVJUKSA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEFOSV9VMzIgY2ZnTmVlZFJlbG9hZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBjZmdJZCkKK3sKKyAgICByZXR1cm4gISEocE1hYy0+Y2ZnLmdDZmdFbnRyeVtjZmdJZF0uY29udHJvbCAmIENGR19DVExfUkVMT0FEKSA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiB3bGFuX2NmZ0luaXQoKQorICoKKyAqIEZVTkNUSU9OOgorICogQ0ZHIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLgorICoKKyAqIExPR0lDOgorICogUGxlYXNlIHNlZSBDb25maWd1cmF0aW9uICYgU3RhdGlzdGljIENvbGxlY3Rpb24gTWljcm8tQXJjaGl0ZWN0dXJlCisgKiBzcGVjaWZpY2F0aW9uIGZvciB0aGUgcHNldWRvY29kZS4KKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZHVyaW5nIHN5c3RlbSBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBAcGFyYW0gTm9uZQorICogQHJldHVybiBOb25lLgorICovCisKK3ZvaWQKK3dsYW5fY2ZnSW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIC8vIFNldCBzdGF0dXMgdG8gbm90LXJlYWR5CisgICAgcE1hYy0+Y2ZnLmdDZmdTdGF0dXMgPSBDRkdfSU5DT01QTEVURTsKKyAgCisgICAgIC8vIFNlbmQgQ0ZHX0ROTERfUkVRIHRvIGhvc3QKKyAgICBQRUxPR1coY2ZnTG9nKHBNYWMsIExPR1csIEZMKCJTZW5kaW5nIENGR19ETkxEX1JFUVxuIikpOykKKyAgICBjZmdTZW5kSG9zdE1zZyhwTWFjLCBXTklfQ0ZHX0ROTERfUkVRLCBXTklfQ0ZHX0ROTERfUkVRX0xFTiwKKyAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0ROTERfUkVRX05VTSwgMCwgMCwgMCk7CisKK30gLyoqKiBlbmQgd2xhbl9jZmdJbml0KCkgKioqLworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgIT0gQVApCit0U2lyUmV0U3RhdHVzIGNmZ0luaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgIHBNYWMtPmNmZy5nQ2ZnSUJ1Zk1pbiAgPSBfX2dDZmdJQnVmTWluOworICAgcE1hYy0+Y2ZnLmdDZmdJQnVmTWF4ICA9IF9fZ0NmZ0lCdWZNYXg7CisgICBwTWFjLT5jZmcuZ0NmZ0lCdWYgICAgID0gX19nQ2ZnSUJ1ZjsKKyAgIHBNYWMtPmNmZy5nQ2ZnU0J1ZiAgICAgPSBfX2dDZmdTQnVmOworICAgcE1hYy0+Y2ZnLmdTQnVmZmVyICAgICA9IF9fZ1NCdWZmZXI7CisgICBwTWFjLT5jZmcuZ0NmZ0VudHJ5ICAgID0gX19nQ2ZnRW50cnk7CisgICBwTWFjLT5jZmcuZ1BhcmFtTGlzdCAgID0gX19nUGFyYW1MaXN0OworICAgICAgICAKKyAgIHJldHVybiAoZVNJUl9TVUNDRVNTKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIGNmZ0RlSW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgcE1hYy0+Y2ZnLmdDZmdJQnVmTWluICA9IE5VTEw7CisgICBwTWFjLT5jZmcuZ0NmZ0lCdWZNYXggID0gTlVMTDsKKyAgIHBNYWMtPmNmZy5nQ2ZnSUJ1ZiAgICAgPSBOVUxMOworICAgcE1hYy0+Y2ZnLmdDZmdTQnVmICAgICA9IE5VTEw7CisgICBwTWFjLT5jZmcuZ1NCdWZmZXIgICAgID0gTlVMTDsKKyAgIHBNYWMtPmNmZy5nQ2ZnRW50cnkgICAgPSBOVUxMOworICAgcE1hYy0+Y2ZnLmdQYXJhbUxpc3QgICA9IE5VTEw7Cit9CisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIGNmZ1NldEludCgpCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB1cGRhdGUgYW4gaW50ZWdlciBwYXJhbWV0ZXIuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiAtIFJhbmdlIGNoZWNraW5nIGlzIHBlcmZvcm1lZCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbi4gIEluIGNhc2UgdGhpcworICogICBmdW5jdGlvbiBjYWxsIGlzIGJlaW5nIHRyaWdnZXJlZCBieSBhIHJlcXVlc3QgZnJvbSBob3N0LCB0aGVuIGhvc3QKKyAqICAgaXMgcmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcgcmFuZ2UgY2hlY2tpbmcgYmVmb3JlIHNlbmRpbmcgdGhlCisgKiAgIHJlcXVlc3QuCisgKgorICogLSBIb3N0IFJXIHBlcm1pc3Npb24gY2hlY2tpbmcgc2hvdWxkIGFscmVhZHkgYmUgZG9uZSBwcmlvciB0byBjYWxsaW5nCisgKiAgIHRoaXMgZnVuY3Rpb24gYnkgdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZyBmdW5jdGlvbi4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBjZmdJZDogICAgIDE2LWJpdCBDRkcgcGFyYW1ldGVyIElECisgKiBAcGFyYW0gdmFsdWU6ICAgICAzMi1iaXQgdW5zaWduZWQgdmFsdWUKKyAqCisgKiBAcmV0dXJuIGVTSVJfU1VDQ0VTUyAgICAgICA6ICByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgXG4KKyAqIEByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9JRDogIGludmFsaWQgQ0ZHIHBhcmFtZXRlciBJRCBcbgorICovCisKK3RTaXJSZXRTdGF0dXMKK2NmZ1NldEludCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBjZmdJZCwgdEFOSV9VMzIgdmFsdWUpCit7CisgICAgdEFOSV9VMzIgICAgICBpbmRleDsKKyAgICB0QU5JX1UzMiAgICAgIGNvbnRyb2wsIG1hc2s7CisgICAgdFNpclJldFN0YXR1cyAgcmV0VmFsOworCisgICAgaWYgKGNmZ0lkID49IENGR19QQVJBTV9NQVhfTlVNKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBjZmcgaWQgJWRcbiIpLCBjZmdJZCk7KQorICAgICAgICByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKyAgICB9CisKKyAgICBjb250cm9sICA9IHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLmNvbnRyb2w7CisgICAgaW5kZXggICAgPSBjb250cm9sICYgQ0ZHX0JVRl9JTkRYX01BU0s7CisgICAgcmV0VmFsICAgPSBlU0lSX1NVQ0NFU1M7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICBpZiAoaW5kZXggPj0gQ0ZHX0FQX0lCVUZfTUFYX1NJWkUpCisjZWxzZQorICAgIGlmIChpbmRleCA+PSBDRkdfU1RBX0lCVUZfTUFYX1NJWkUpCisjZW5kaWYKKyAgICB7CisgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoImNmZyBpbmRleCBvdXQgb2YgYm91bmRzICVkXG4iKSwgaW5kZXgpOykKKyAgICAgICAgcmV0VmFsID0gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBwYXJhbWV0ZXIgaXMgdmFsaWQKKyAgICBpZiAoKGNvbnRyb2wgJiBDRkdfQ1RMX1ZBTElEKSA9PSAwKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiTm90IHZhbGlkIGNmZyBpZCAlZFxuIiksIGNmZ0lkKTspCisgICAgICAgIHJldFZhbCA9IGVTSVJfQ0ZHX0lOVkFMSURfSUQ7CisgICAgfQorI2lmIDAKKyAgICBlbHNlIGlmICgoKGNvbnRyb2wgJiBDRkdfQ1RMX1JFU1RBUlQpICYmICFSZXN0YXJ0aW5nKHBNYWMpKSB8fAorICAgICAgICAgICAgICgoY29udHJvbCAmIENGR19DVExfUkVMT0FEKSAmJiAhUmVsb2FkaW5nKHBNYWMpKSkKKyAgICB7CisgICAgICAgIGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2hhbmdlIHJlcXVpcmVzIGEgcmVzdGFydC9yZWxvYWQgY2ZnIGlkICVkIHN0YXRlICVkXG4iKSwKKyAgICAgICAgICAgICAgIGNmZ0lkLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTsKKyAgICAgICAgcmV0VmFsID0gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIGlmICgocE1hYy0+Y2ZnLmdDZmdJQnVmTWluW2luZGV4XSA+IHZhbHVlKSB8fAorICAgICAgICAgICAgIChwTWFjLT5jZmcuZ0NmZ0lCdWZNYXhbaW5kZXhdIDwgdmFsdWUpKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiVmFsdWUgJWQgb3V0IG9mIHJhbmdlIFslZCwlZF0gY2ZnIGlkICVkXG4iKSwKKyAgICAgICAgICAgICAgIHZhbHVlLCBwTWFjLT5jZmcuZ0NmZ0lCdWZNaW5baW5kZXhdLAorICAgICAgICAgICAgICAgcE1hYy0+Y2ZnLmdDZmdJQnVmTWF4W2luZGV4XSwgY2ZnSWQpOykKKyAgICAgICAgcmV0VmFsID0gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIGludGVnZXIgdmFsdWUKKyAgICAgICAgICAgIHBNYWMtPmNmZy5nQ2ZnSUJ1ZltpbmRleF0gPSB2YWx1ZTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGhhcmR3YXJlIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgbWFzayA9IGNvbnRyb2wgJiBDRkdfQ1RMX05URl9NQVNLOworICAgICAgICAgICAgaWYgKChtYXNrICYgQ0ZHX0NUTF9OVEZfSFcpICE9IDApCisgICAgICAgICAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiQ0ZHIE5vdGlmeSBIVyBub3Qgc3VwcG9ydGVkISEhXG4iKSk7KQorCisgICAgICAgICAgICAvLyBOb3RpZnkgb3RoZXIgbW9kdWxlcyBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmICgobWFzayAmIENGR19DVExfTlRGX01BU0spICE9IDApCisgICAgICAgICAgICAgICAgTm90aWZ5KHBNYWMsIGNmZ0lkLCBtYXNrKTsKKworICAgIH0KKworICAgIHJldHVybiAocmV0VmFsKTsKKworfSAvKioqIGVuZCBjZmdTZXRJbnQgKioqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogY2ZnQ2hlY2tWYWxpZCgpCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayBpZiBhIHBhcmFtZXRlciBpcyB2YWxpZAorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGNmZ0lkOiAgMTYtYml0IENGRyBwYXJhbWV0ZXIgSUQKKyAqCisgKiBAcmV0dXJuIGVTSVJfU1VDQ0VTUzogICAgICAgICByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAqIEByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9JRDogIGludmFsaWQgQ0ZHIHBhcmFtZXRlciBJRAorICovCisKK3RTaXJSZXRTdGF0dXMKK2NmZ0NoZWNrVmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgY2ZnSWQpCit7CisgICAgdEFOSV9VMzIgICAgICBjb250cm9sOworCisgICAgaWYgKGNmZ0lkID49IENGR19QQVJBTV9NQVhfTlVNKQorICAgIHsKKyAgICAgICAgUEVMT0czKGNmZ0xvZyhwTWFjLCBMT0czLCBGTCgiSW52YWxpZCBjZmcgaWQgJWRcbiIpLCBjZmdJZCk7KQorICAgICAgICByZXR1cm4oZVNJUl9DRkdfSU5WQUxJRF9JRCk7CisgICAgfQorCisgICAgY29udHJvbCA9IHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLmNvbnRyb2w7CisKKyAgICAvLyBDaGVjayBpZiBwYXJhbWV0ZXIgaXMgdmFsaWQKKyAgICBpZiAoKGNvbnRyb2wgJiBDRkdfQ1RMX1ZBTElEKSA9PSAwKQorICAgIHsKKyAgICAgICAgUEVMT0czKGNmZ0xvZyhwTWFjLCBMT0czLCBGTCgiTm90IHZhbGlkIGNmZyBpZCAlZFxuIiksIGNmZ0lkKTspCisgICAgICAgIHJldHVybihlU0lSX0NGR19JTlZBTElEX0lEKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4oZVNJUl9TVUNDRVNTKTsKKworfSAvKioqIGVuZCBjZmdDaGVja1ZhbGlkKCkgKioqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogd2xhbl9jZmdHZXRJbnQoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCBhbiBpbnRlZ2VyIHBhcmFtZXRlci4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBjZmdJZDogIDE2LWJpdCBDRkcgcGFyYW1ldGVyIElECisgKiBAcGFyYW0gcFZhbDogICBhZGRyZXNzIHdoZXJlIHBhcmFtZXRlciB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4KKyAqCisgKiBAcmV0dXJuIGVTSVJfU1VDQ0VTUzogICAgICAgICByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAqIEByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9JRDogIGludmFsaWQgQ0ZHIHBhcmFtZXRlciBJRAorICovCisKK3RTaXJSZXRTdGF0dXMKK3dsYW5fY2ZnR2V0SW50KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IGNmZ0lkLCB0QU5JX1UzMiAqcFZhbHVlKQoreworICAgIHRBTklfVTMyICAgICAgaW5kZXg7CisgICAgdEFOSV9VMzIgICAgICBjb250cm9sOworICAgIHRTaXJSZXRTdGF0dXMgIHJldFZhbDsKKworICAgIGlmIChjZmdJZCA+PSBDRkdfUEFSQU1fTUFYX05VTSkKKyAgICB7CisgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgY2ZnIGlkICVkXG4iKSwgY2ZnSWQpOykKKyAgICAgICAgcmV0VmFsID0gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICBjb250cm9sID0gcE1hYy0+Y2ZnLmdDZmdFbnRyeVtjZmdJZF0uY29udHJvbDsKKyAgICBpbmRleCAgID0gY29udHJvbCAmIENGR19CVUZfSU5EWF9NQVNLOworICAgIHJldFZhbCAgPSBlU0lSX1NVQ0NFU1M7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICBpZiAoaW5kZXggPj0gQ0ZHX0FQX0lCVUZfTUFYX1NJWkUpCisjZWxzZQorICAgIGlmIChpbmRleCA+PSBDRkdfU1RBX0lCVUZfTUFYX1NJWkUpCisjZW5kaWYKKyAgICB7CisgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoImNmZyBpbmRleCBvdXQgb2YgYm91bmRzICVkXG4iKSwgaW5kZXgpOykKKyAgICAgICAgcmV0VmFsID0gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBwYXJhbWV0ZXIgaXMgdmFsaWQKKyAgICBpZiAoKGNvbnRyb2wgJiBDRkdfQ1RMX1ZBTElEKSA9PSAwKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiTm90IHZhbGlkIGNmZyBpZCAlZFxuIiksIGNmZ0lkKTspCisgICAgICAgIHJldFZhbCA9IGVTSVJfQ0ZHX0lOVkFMSURfSUQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBHZXQgaW50ZWdlciB2YWx1ZQorICAgICAgICBpZihpbmRleCA8IENGR19BUF9JQlVGX01BWF9TSVpFKQorICAgICAgICAgICAgKnBWYWx1ZSA9IHBNYWMtPmNmZy5nQ2ZnSUJ1ZltpbmRleF07CisgICAgfQorCisgICAgcmV0dXJuIChyZXRWYWwpOworCit9IC8qKiogZW5kIHdsYW5fY2ZnR2V0SW50KCkgKioqLworCisjaWZkZWYgTk9UX0NVUlJFTlRMWV9VU0VECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogY2ZnSW5jcmVtZW50SW50KCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGluY3JlbWVudCBhbiBpbnRlZ2VyIHBhcmFtZXRlciBieSBuLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogLSBObyByYW5nZSBjaGVja2luZyB3aWxsIGJlIHBlcmZvcm1lZC4KKyAqIC0gSG9zdCBSVyBwZXJtaXNzaW9uIHNob3VsZCBiZSBjaGVja2VkIHByaW9yIHRvIGNhbGxpbmcgdGhpcworICogICBmdW5jdGlvbi4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBjZmdJZDogICAgIDE2LWJpdCBDRkcgcGFyYW1ldGVyIElECisgKiBAcGFyYW0gdmFsdWU6ICAgICBpbmNyZW1lbnQgdmFsdWUKKyAqCisgKiBAcmV0dXJuIGVTSVJfU1VDQ0VTUzogICAgICAgICByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAqIEByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9JRDogIGludmFsaWQgQ0ZHIHBhcmFtZXRlciBJRAorICovCisKK3RTaXJSZXRTdGF0dXMKK2NmZ0luY3JlbWVudEludCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBjZmdJZCwgdEFOSV9VMzIgdmFsdWUpCit7CisgICAgdEFOSV9VMzIgICAgICBpbmRleDsKKyAgICB0QU5JX1UzMiAgICAgIGNvbnRyb2w7CisgICAgdFNpclJldFN0YXR1cyAgcmV0VmFsOworCisgICAgaWYgKGNmZ0lkID49IENGR19QQVJBTV9NQVhfTlVNKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBjZmcgaWQgJWRcbiIpLCBjZmdJZCk7KQorICAgICAgICByZXRWYWwgPSBlU0lSX0NGR19JTlZBTElEX0lEOworICAgIH0KKworICAgIGNvbnRyb2wgID0gcE1hYy0+Y2ZnLmdDZmdFbnRyeVtjZmdJZF0uY29udHJvbDsKKyAgICBpbmRleCAgICA9IGNvbnRyb2wgJiBDRkdfQlVGX0lORFhfTUFTSzsKKyAgICByZXRWYWwgICA9IGVTSVJfU1VDQ0VTUzsKKworICAgIC8vIENoZWNrIGlmIHBhcmFtZXRlciBpcyB2YWxpZAorICAgIGlmICgoY29udHJvbCAmIENGR19DVExfVkFMSUQpID09IDApCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJOb3QgdmFsaWQgY2ZnIGlkICVkXG4iKSwgY2ZnSWQpOykKKyAgICAgICAgcmV0VmFsID0gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgICAgIC8vIEluY3JlbWVudCBpbnRlZ2VyIHZhbHVlCisgICAgICAgICAgICBwTWFjLT5jZmcuZ0NmZ0lCdWZbaW5kZXhdICs9IHZhbHVlOworCisgICAgfQorCisgICAgcmV0dXJuIChyZXRWYWwpOworfQorI2VuZGlmIC8vIE5PVF9DVVJSRU5UTFlfVVNFRAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogY2ZnU2V0U3RyKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCBhIHN0cmluZyBwYXJhbWV0ZXIuCisgKgorICogTE9HSUM6IAorICogVGhpcyBmdW5jdGlvbiBpbnZva2VzIHRoZSBjZmdTZXRTdHJOb3RpZnkgZnVuY3Rpb24gcGFzc2luZyB0aGUgbm90aWZ5CisgKiBib29sZWFuIHZhbHVlIHNldCB0byBUUlVFLiBUaGlzIGJhc2ljYWxseSBtZWFucyB0aGF0IEhBTCBuZWVkcyB0byBiZSAKKyAqIG5vdGlmaWVkLiBUaGlzIGlzIHRydWUgaW4gdGhlIGNhc2Ugb2Ygbm9uLWludGVncmF0ZWQgU09DJ3Mgb3IgTGlicmEvVm9sYW5zLgorICogSW4gdGhlIGNhc2Ugb2YgUHJpbWEgdGhlIGNmZ1NldFN0ck5vdGlmeSBpcyBpbnZva2VkIHdpdGggdGhlIGJvb2xlYW4gdmFsdWUKKyAqIHNldCB0byBGQUxTRS4KKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIC0gYWx3YXlzIE5vdGlmeSBoYXMgdG8gYmUgY2FsbGVkCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gY2ZnSWQ6ICAgICAxNi1iaXQgQ0ZHIHBhcmFtZXRlciBJRAorICogQHBhcmFtIHBTdHI6ICAgICAgYWRkcmVzcyBvZiBzdHJpbmcgZGF0YQorICogQHBhcmFtIGxlbjogICAgICAgc3RyaW5nIGxlbmd0aAorICoKKyAqIEByZXR1cm4gZVNJUl9TVUNDRVNTOiAgICAgICAgIHJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICogQHJldHVybiBlU0lSX0NGR19JTlZBTElEX0lEOiAgaW52YWxpZCBDRkcgcGFyYW1ldGVyIElECisgKiBAcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfTEVOOiBpbnZhbGlkIHBhcmFtZXRlciBsZW5ndGgKKyAqCisgKi8KKwordFNpclJldFN0YXR1cyBjZmdTZXRTdHIodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgY2ZnSWQsIHRBTklfVTggKnBTdHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbGVuZ3RoKQoreworICAgcmV0dXJuIGNmZ1NldFN0ck5vdGlmeSggcE1hYywgY2ZnSWQsIHBTdHIsIGxlbmd0aCwgVFJVRSApOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogY2ZnU2V0U3RyTm90aWZ5KCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCBhIHN0cmluZyBwYXJhbWV0ZXIuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiAtIE5vIGxlbmd0aCBjaGVja2luZyB3aWxsIGJlIHBlcmZvcm1lZC4gIFNob3VsZCBiZSBkb25lIGJ5IGNhbGxpbmcKKyAqICAgbW9kdWxlLgorICogLSBIb3N0IFJXIHBlcm1pc3Npb24gc2hvdWxkIGJlIGNoZWNrZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzCisgKiAgIGZ1bmN0aW9uLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGNmZ0lkOiAgICAgMTYtYml0IENGRyBwYXJhbWV0ZXIgSUQKKyAqIEBwYXJhbSBwU3RyOiAgICAgIGFkZHJlc3Mgb2Ygc3RyaW5nIGRhdGEKKyAqIEBwYXJhbSBsZW46ICAgICAgIHN0cmluZyBsZW5ndGgKKyAqIEBwYXJhbSBub3RpZnlNb2QuIE5vdGlmeSByZXNwZWN0aXZlIE1vZHVsZQorICoKKyAqIEByZXR1cm4gZVNJUl9TVUNDRVNTOiAgICAgICAgIHJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICogQHJldHVybiBlU0lSX0NGR19JTlZBTElEX0lEOiAgaW52YWxpZCBDRkcgcGFyYW1ldGVyIElECisgKiBAcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfTEVOOiBpbnZhbGlkIHBhcmFtZXRlciBsZW5ndGgKKyAqCisgKi8KKwordFNpclJldFN0YXR1cworY2ZnU2V0U3RyTm90aWZ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IGNmZ0lkLCB0QU5JX1U4ICpwU3RyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIGxlbmd0aCwgaW50IG5vdGlmeU1vZCkKK3sKKyAgICB0QU5JX1U4ICAgICAgICpwRHN0LCAqcERzdEVuZDsKKyAgICB0QU5JX1UzMiAgICAgIGluZGV4LCBwYXJhbUxlbiwgY29udHJvbCwgbWFzazsKKyAgICB0U2lyUmV0U3RhdHVzICByZXRWYWw7CisKKyAgICBpZiAoY2ZnSWQgPj0gQ0ZHX1BBUkFNX01BWF9OVU0pCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIGNmZyBpZCAlZFxuIiksIGNmZ0lkKTspCisgICAgICAgIHJldHVybiBlU0lSX0NGR19JTlZBTElEX0lEOworICAgIH0KKworICAgIGNvbnRyb2wgID0gcE1hYy0+Y2ZnLmdDZmdFbnRyeVtjZmdJZF0uY29udHJvbDsKKyAgICBpbmRleCAgICA9IGNvbnRyb2wgJiBDRkdfQlVGX0lORFhfTUFTSzsKKyAgICByZXRWYWwgICA9IGVTSVJfU1VDQ0VTUzsKKworICAgIC8vIENoZWNrIGlmIHBhcmFtZXRlciBpcyB2YWxpZAorICAgIGlmICgoY29udHJvbCAmIENGR19DVExfVkFMSUQpID09IDApCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIGNmZyBpZCAlZFxuIiksIGNmZ0lkKTspCisgICAgICAgIHJldFZhbCA9IGVTSVJfQ0ZHX0lOVkFMSURfSUQ7CisgICAgfQorICAgIGVsc2UgaWYgKGluZGV4ID49IENGR19TVEFfU0JVRl9NQVhfU0laRSkKKyAgICB7CisgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgU2J1ZiBpbmRleCAlZCAobWF4IHNpemUgJWQpXG4iKSwKKyAgICAgICAgICAgICAgIGluZGV4LCBDRkdfU1RBX1NCVUZfTUFYX1NJWkUpOykKKyAgICAgICAgcmV0VmFsID0gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgICAgIHBEc3QgPSAmcE1hYy0+Y2ZnLmdDZmdTQnVmW2luZGV4XTsKKyAgICAgICAgICAgIHBhcmFtTGVuID0gKnBEc3QrKzsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiBwYXJhbUxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIGxlbmd0aCAlZCAoPiVkKSBjZmcgaWQgJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHBhcmFtTGVuLCBjZmdJZCk7KQorICAgICAgICAgICAgICAgIHJldFZhbCA9IGVTSVJfQ0ZHX0lOVkFMSURfTEVOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwRHN0KysgPSAodEFOSV9VOClsZW5ndGg7CisgICAgICAgICAgICAgICAgcERzdEVuZCA9IHBEc3QgKyBsZW5ndGg7CisgICAgICAgICAgICAgICAgd2hpbGUgKHBEc3QgPCBwRHN0RW5kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBEc3QrKyA9ICpwU3RyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYobm90aWZ5TW9kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGhhcmR3YXJlIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICBtYXNrID0gY29udHJvbCAmIENGR19DVExfTlRGX01BU0s7CisgICAgICAgICAgICAgICAgICAgIGlmICgobWFzayAmIENGR19DVExfTlRGX0hXKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJDRkcgTm90aWZ5IEhXIG5vdCBzdXBwb3J0ZWQhISFcbiIpKTspCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgb3RoZXIgbW9kdWxlcyBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAobWFzayAmIENGR19DVExfTlRGX01BU0spICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmeShwTWFjLCBjZmdJZCwgbWFzayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgcmV0dXJuIChyZXRWYWwpOworCit9IC8qKiogZW5kIGNmZ1NldFN0ck5vdGlmeSgpICoqKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHdsYW5fY2ZnR2V0U3RyKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCBhIHN0cmluZyBwYXJhbWV0ZXIuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiAtIEhvc3QgUlcgcGVybWlzc2lvbiBzaG91bGQgYmUgY2hlY2tlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMKKyAqICAgZnVuY3Rpb24uCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gY2ZnSWQ6ICAgICAxNi1iaXQgQ0ZHIHBhcmFtZXRlciBJRAorICogQHBhcmFtIHBCdWY6ICAgICAgYWRkcmVzcyBvZiBzdHJpbmcgYnVmZmVyCisgKiBAcGFyYW0gcExlbjogICAgICBhZGRyZXNzIG9mIG1heCBidWZmZXIgbGVuZ3RoCisgKiAgICAgICAgICAgICAgICAgICBhY3R1YWwgbGVuZ3RoIHdpbGwgYmUgcmV0dXJuZWQgYXQgdGhpcyBhZGRyZXNzCisgKgorICogQHJldHVybiBlU0lSX1NVQ0NFU1M6ICAgICAgICAgcmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgKiBAcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfSUQ6ICBpbnZhbGlkIENGRyBwYXJhbWV0ZXIgSUQKKyAqIEByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9MRU46IGludmFsaWQgcGFyYW1ldGVyIGxlbmd0aAorICoKKyAqLworCit0U2lyUmV0U3RhdHVzCit3bGFuX2NmZ0dldFN0cih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBjZmdJZCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgKnBMZW5ndGgpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAqcFNyYywgKnBTcmNFbmQ7CisgICAgdEFOSV9VMzIgICAgICAgICAgICBpbmRleCwgY29udHJvbDsKKyAgICB0U2lyUmV0U3RhdHVzICByZXRWYWw7CisKKyAgICBpZiAoY2ZnSWQgPj0gQ0ZHX1BBUkFNX01BWF9OVU0pCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIGNmZyBpZCAlZFxuIiksIGNmZ0lkKTspCisgICAgICAgIHJldFZhbCA9IGVTSVJfQ0ZHX0lOVkFMSURfSUQ7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisgICAgY29udHJvbCAgPSBwTWFjLT5jZmcuZ0NmZ0VudHJ5W2NmZ0lkXS5jb250cm9sOworICAgIGluZGV4ICAgID0gY29udHJvbCAmIENGR19CVUZfSU5EWF9NQVNLOworICAgIHJldFZhbCAgID0gZVNJUl9TVUNDRVNTOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgaWYgKGluZGV4ID49IENGR19BUF9TQlVGX01BWF9TSVpFKQorI2Vsc2UKKyAgICBpZiAoaW5kZXggPj0gQ0ZHX1NUQV9TQlVGX01BWF9TSVpFKQorI2VuZGlmCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJjZmcgaW5kZXggb3V0IG9mIGJvdW5kcyAlZFxuIiksIGluZGV4KTspCisgICAgICAgIHJldFZhbCA9IGVTSVJfQ0ZHX0lOVkFMSURfSUQ7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgcGFyYW1ldGVyIGlzIHZhbGlkCisgICAgaWYgKChjb250cm9sICYgQ0ZHX0NUTF9WQUxJRCkgPT0gMCkKKyAgICB7CisgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoIk5vdCB2YWxpZCBjZmcgaWQgJWRcbiIpLCBjZmdJZCk7KQorICAgICAgICByZXRWYWwgPSBlU0lSX0NGR19JTlZBTElEX0lEOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBHZXQgc3RyaW5nCisgICAgICAgIHBTcmMgID0gJnBNYWMtPmNmZy5nQ2ZnU0J1ZltpbmRleF07CisgICAgICAgIHBTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBvdmVyIG1heCBsZW5ndGgKKyAgICAgICAgaWYgKCpwTGVuZ3RoIDwgKnBTcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgbGVuZ3RoICVkICg8JWQpIGNmZyBpZCAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgKnBMZW5ndGgsICpwU3JjLCBjZmdJZCk7KQorICAgICAgICAgICAgcmV0VmFsID0gZVNJUl9DRkdfSU5WQUxJRF9MRU47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcExlbmd0aCA9ICpwU3JjKys7ICAgICAgICAgICAgICAgLy8gc2F2ZSBwYXJhbWV0ZXIgbGVuZ3RoCisgICAgICAgICAgICBwU3JjRW5kID0gcFNyYyArICpwTGVuZ3RoOworICAgICAgICAgICAgd2hpbGUgKHBTcmMgPCBwU3JjRW5kKQorICAgICAgICAgICAgICAgICpwQnVmKysgPSAqcFNyYysrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChyZXRWYWwpOworCit9IC8qKiogZW5kIHdsYW5fY2ZnR2V0U3RyKCkgKioqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogd2xhbl9jZmdHZXRTdHJNYXhMZW4oKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IGEgc3RyaW5nIG1heGltdW0gbGVuZ3RoLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogLSBIb3N0IFJXIHBlcm1pc3Npb24gc2hvdWxkIGJlIGNoZWNrZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzCisgKiAgIGZ1bmN0aW9uLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGNmZ0lkOiAgICAgMTYtYml0IENGRyBwYXJhbWV0ZXIgSUQKKyAqIEBwYXJhbSBwTGVuOiAgICAgIG1heGltdW0gbGVuZ3RoIHdpbGwgYmUgcmV0dXJuZWQgYXQgdGhpcyBhZGRyZXNzCisgKgorICogQHJldHVybiBlU0lSX1NVQ0NFU1M6ICAgICAgICAgcmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgKiBAcmV0dXJuIGVTSVJfQ0ZHX0lOVkFMSURfSUQ6ICBpbnZhbGlkIENGRyBwYXJhbWV0ZXIgSUQKKyAqCisgKi8KKwordFNpclJldFN0YXR1cword2xhbl9jZmdHZXRTdHJNYXhMZW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgY2ZnSWQsIHRBTklfVTMyICpwTGVuZ3RoKQoreworICAgIHRBTklfVTMyICAgICAgICAgICAgaW5kZXgsIGNvbnRyb2w7CisgICAgdFNpclJldFN0YXR1cyAgcmV0VmFsOworCisgICAgaWYgKGNmZ0lkID49IENGR19QQVJBTV9NQVhfTlVNKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBjZmcgaWQgJWRcbiIpLCBjZmdJZCk7KQorICAgICAgICByZXRWYWwgPSBlU0lSX0NGR19JTlZBTElEX0lEOworICAgIH0KKworICAgIGNvbnRyb2wgID0gcE1hYy0+Y2ZnLmdDZmdFbnRyeVtjZmdJZF0uY29udHJvbDsKKyAgICBpbmRleCAgICA9IGNvbnRyb2wgJiBDRkdfQlVGX0lORFhfTUFTSzsKKyAgICByZXRWYWwgICA9IGVTSVJfU1VDQ0VTUzsKKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgIGlmIChpbmRleCA+PSBDRkdfQVBfU0JVRl9NQVhfU0laRSkKKyNlbHNlCisgICAgaWYgKGluZGV4ID49IENGR19TVEFfU0JVRl9NQVhfU0laRSkKKyNlbmRpZgorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiY2ZnIGluZGV4IG91dCBvZiBib3VuZHMgJWRcbiIpLCBpbmRleCk7KQorICAgICAgICByZXRWYWwgPSBlU0lSX0NGR19JTlZBTElEX0lEOworICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHBhcmFtZXRlciBpcyB2YWxpZAorICAgIGlmICgoY29udHJvbCAmIENGR19DVExfVkFMSUQpID09IDApCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJOb3QgdmFsaWQgY2ZnIGlkICVkXG4iKSwgY2ZnSWQpOykKKyAgICAgICAgcmV0VmFsID0gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBMZW5ndGggPSBwTWFjLT5jZmcuZ0NmZ1NCdWZbaW5kZXhdOworICAgIH0KKworICAgIHJldHVybiAocmV0VmFsKTsKKworfSAvKioqIGVuZCB3bGFuX2NmZ0dldFN0ck1heExlbigpICoqKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHdsYW5fY2ZnR2V0U3RyTGVuKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCBhIHN0cmluZyBsZW5ndGguCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiAtIEhvc3QgUlcgcGVybWlzc2lvbiBzaG91bGQgYmUgY2hlY2tlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMKKyAqICAgZnVuY3Rpb24uCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gY2ZnSWQ6ICAgICAxNi1iaXQgQ0ZHIHBhcmFtZXRlciBJRAorICogQHBhcmFtIHBMZW46ICAgICAgY3VycmVudCBsZW5ndGggd2lsbCBiZSByZXR1cm5lZCBhdCB0aGlzIGFkZHJlc3MKKyAqCisgKiBAcmV0dXJuIGVTSVJfU1VDQ0VTUzogICAgICAgICByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAqIEByZXR1cm4gZVNJUl9DRkdfSU5WQUxJRF9JRDogIGludmFsaWQgQ0ZHIHBhcmFtZXRlciBJRAorICoKKyAqLworCit0U2lyUmV0U3RhdHVzCit3bGFuX2NmZ0dldFN0ckxlbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBjZmdJZCwgdEFOSV9VMzIgKnBMZW5ndGgpCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICBpbmRleCwgY29udHJvbDsKKyAgICB0U2lyUmV0U3RhdHVzICByZXRWYWw7CisKKyAgICBpZiAoY2ZnSWQgPj0gQ0ZHX1BBUkFNX01BWF9OVU0pCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIGNmZyBpZCAlZFxuIiksIGNmZ0lkKTspCisgICAgICAgIHJldFZhbCA9IGVTSVJfQ0ZHX0lOVkFMSURfSUQ7CisgICAgfQorCisgICAgY29udHJvbCAgPSBwTWFjLT5jZmcuZ0NmZ0VudHJ5W2NmZ0lkXS5jb250cm9sOworICAgIGluZGV4ICAgID0gY29udHJvbCAmIENGR19CVUZfSU5EWF9NQVNLOworICAgIHJldFZhbCAgID0gZVNJUl9TVUNDRVNTOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgaWYgKGluZGV4ID49IENGR19BUF9TQlVGX01BWF9TSVpFLTEpCisjZWxzZQorICAgIGlmIChpbmRleCA+PSBDRkdfU1RBX1NCVUZfTUFYX1NJWkUtMSkKKyNlbmRpZgorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiY2ZnIGluZGV4IG91dCBvZiBib3VuZHMgJWRcbiIpLCBpbmRleCk7KQorICAgICAgICByZXRWYWwgPSBlU0lSX0NGR19JTlZBTElEX0lEOworICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHBhcmFtZXRlciBpcyB2YWxpZAorICAgIGlmICgoY29udHJvbCAmIENGR19DVExfVkFMSUQpID09IDApCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJOb3QgdmFsaWQgY2ZnIGlkICVkXG4iKSwgY2ZnSWQpOykKKyAgICAgICAgcmV0VmFsID0gZVNJUl9DRkdfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBMZW5ndGggPSBwTWFjLT5jZmcuZ0NmZ1NCdWZbaW5kZXgrMV07CisgICAgfQorCisgICAgcmV0dXJuIChyZXRWYWwpOworCit9IC8qKiogZW5kIHdsYW5fY2ZnR2V0U3RyTGVuKCkgKioqLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgIGNmZ0dldERvdDExZFRyYW5zbWl0UG93ZXIKK1xicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWd1bGF0b3J5IG1heCB0cmFuc21pdCBwb3dlcgorXHBhcmFtICBwTWFjCitccmV0dXJuIHRQb3dlcmRCbSAtIFBvd2VyCitcLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdFBvd2VyZEJtCitjZmdHZXREb3QxMWRUcmFuc21pdFBvd2VyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2ICAgY2ZnSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgY2ZnTGVuZ3RoLCB0QU5JX1U4IGNoYW5uZWwpCit7CisgICAgdEFOSV9VOCAgICAqcENvdW50cnlJbmZvID0gTlVMTDsKKyAgICB0QU5JX1U4ICAgIGNvdW50ID0gMDsKKyAgICB0UG93ZXJkQm0gIG1heFR4UHdyID0gV0RBX01BWF9UWFBPV0VSX0lOVkFMSUQ7CisgICAgZUhhbFN0YXR1cyAgICBzdGF0dXM7CisgICAgCisgICAgLyogQXQgbGVhc3Qgb25lIGVsZW1lbnQgaXMgcHJlc2VudCAqLworICAgIGlmKGNmZ0xlbmd0aCA8IHNpemVvZih0U2lyTWFjQ2hhbkluZm8pKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBDRkdMRU5HVEggJWQgd2hpbGUgZ2V0dGluZyAxMWQgdHhwb3dlciIpLCBjZmdMZW5ndGgpOykKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcENvdW50cnlJbmZvLCBjZmdMZW5ndGgpOworICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGNmZ0xvZyhwTWFjLCBMT0dQLCBGTCgiIHBhbEFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkLCBzdGF0dXMgPSAlZCIpLCBzdGF0dXMpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICAvKiBUaGUgQ1NSIHdpbGwgYWx3YXlzIHVwZGF0ZSB0aGlzIENGRy4gVGhlIGNvbnRlbnRzIHdpbGwgYmUgZnJvbSBjb3VudHJ5IElFIGlmIHJlZ3VsYXRvcnkgZG9tYWluCisgICAgICogaXMgZW5hYmxlZCBvbiBBUCBlbHNlIHdpbGwgY29udGFpbiBFRVBST00gY29udGVudHMKKyAgICAgKi8KKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgY2ZnSWQsIHBDb3VudHJ5SW5mbywgJmNmZ0xlbmd0aCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQ291bnRyeUluZm8pOworICAgICAgICBwQ291bnRyeUluZm8gPSBOVUxMOworICAgICAgICAgICAgCisgICAgICAgIGNmZ0xvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIHJldHJpZXZlIDExZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgd2hpbGUgcmV0cmlldmluZyAxMWQgdHVwbGVzIikpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICAvKiBJZGVudGlmeSB0aGUgY2hhbm5lbCBhbmQgbWF4dHhwb3dlciAqLworICAgIHdoaWxlKGNvdW50IDw9IChjZmdMZW5ndGggLSAoc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbykpKSkKKyAgICB7CisgICAgICAgIHRBTklfVTggICAgZmlyc3RDaGFubmVsLCBtYXhDaGFubmVsczsKKworICAgICAgICBmaXJzdENoYW5uZWwgPSBwQ291bnRyeUluZm9bY291bnQrK107CisgICAgICAgIG1heENoYW5uZWxzID0gcENvdW50cnlJbmZvW2NvdW50KytdOworICAgICAgICBtYXhUeFB3ciA9IHBDb3VudHJ5SW5mb1tjb3VudCsrXTsKKworICAgICAgICBpZigoY2hhbm5lbCA+PSBmaXJzdENoYW5uZWwpICYmIAorICAgICAgICAgICAgKGNoYW5uZWwgPCAoZmlyc3RDaGFubmVsICsgbWF4Q2hhbm5lbHMpKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKK2Vycm9yOgorICAgIGlmKE5VTEwgIT0gcENvdW50cnlJbmZvKQorICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBDb3VudHJ5SW5mbyk7CisgICAgICAgCisgICAgcmV0dXJuIG1heFR4UHdyOworfQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgY2ZnR2V0UmVndWxhdG9yeU1heFRyYW5zbWl0UG93ZXIKKworXGJyaWVmICBHZXRzIHJlZ3VsYXRvcnkgdHggcG93ZXIgb24gdGhlIGN1cnJlbnQgY2hhbm5lbC4KKworXHBhcmFtICBwTWFjCitccGFyYW0gIGNoYW5uZWwKK1xwYXJhbSAgcmZCYW5kCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFBvd2VyZEJtIGNmZ0dldFJlZ3VsYXRvcnlNYXhUcmFuc21pdFBvd2VyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY2hhbm5lbCkKK3sKKyAgICB0QU5JX1UzMiAgICBjZmdMZW5ndGggPSAwOworICAgIHRBTklfVTE2ICAgIGNmZ0lkID0gMDsKKyAgICB0UG93ZXJkQm0gIG1heFR4UHdyOworICAgIGVSZkJhbmRNb2RlIHJmQmFuZCA9IGVSRl9CQU5EX1VOS05PV047CisKKyAgICBpZiAoKGNoYW5uZWwgPj0gU0lSXzExQV9DSEFOTkVMX0JFR0lOKSAmJgorICAgICAgICAoY2hhbm5lbCA8PSBTSVJfMTFBX0NIQU5ORUxfRU5EKSkKKyAgICAgICAgcmZCYW5kID0gZVJGX0JBTkRfNV9HSFo7CisgICAgZWxzZQorICAgICAgICByZkJhbmQgPSBlUkZfQkFORF8yXzRfR0haOworCisgICAgCisgICAgLyogR2V0IHRoZSBtYXggdHJhbnNtaXQgcG93ZXIgZm9yIGN1cnJlbnQgY2hhbm5lbCBmb3IgdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4gKi8KKyAgICBzd2l0Y2ggKHJmQmFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgZVJGX0JBTkRfMl80X0dIWjoKKyAgICAgICAgICAgIGNmZ0lkID0gV05JX0NGR19NQVhfVFhfUE9XRVJfMl80OworICAgICAgICAgICAgY2ZnTGVuZ3RoID0gV05JX0NGR19NQVhfVFhfUE9XRVJfMl80X0xFTjsKKyAgICAgICAgICAgIFBFTE9HMihjZmdMb2cocE1hYywgTE9HMiwgRkwoIkhBTDogUmVhZGluZyBDRkcgZm9yIDIuNCBHSHogY2hhbm5lbHMgdG8gZ2V0IHJlZ3VsYXRvcnkgbWF4IHR4IHBvd2VyIikpOykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVJGX0JBTkRfNV9HSFo6CisgICAgICAgICAgICBjZmdJZCA9IFdOSV9DRkdfTUFYX1RYX1BPV0VSXzU7CisgICAgICAgICAgICBjZmdMZW5ndGggPSBXTklfQ0ZHX01BWF9UWF9QT1dFUl81X0xFTjsKKyAgICAgICAgICAgIFBFTE9HMihjZmdMb2cocE1hYywgTE9HMiwgRkwoIkhBTDogUmVhZGluZyBDRkcgZm9yIDUuMCBHSHogY2hhbm5lbHMgdG8gZ2V0IHJlZ3VsYXRvcnkgbWF4IHR4IHBvd2VyIikpOykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVJGX0JBTkRfVU5LTk9XTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFBFTE9HMihjZmdMb2cocE1hYywgTE9HMiwgRkwoIkhBTDogSW52YWxpZCBjdXJyZW50IHdvcmtpbmcgYmFuZCBmb3IgdGhlIGRldmljZSIpKTspCisgICAgICAgICAgICByZXR1cm4gV0RBX01BWF9UWFBPV0VSX0lOVkFMSUQ7IC8vSXRzIHJldHVybiwgbm90IGJyZWFrLgorICAgIH0KKworICAgIG1heFR4UHdyID0gY2ZnR2V0RG90MTFkVHJhbnNtaXRQb3dlcihwTWFjLCBjZmdJZCwgY2ZnTGVuZ3RoLCBjaGFubmVsKTsKKworICAgIHJldHVybiAobWF4VHhQd3IpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogY2ZnR2V0Q2FwYWJpbGl0eUluZm8KKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzCitjZmdHZXRDYXBhYmlsaXR5SW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiAqcENhcCx0cFBFU2Vzc2lvbiBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMzIgdmFsID0gMDsKKyAgICB0cFNpck1hY0NhcGFiaWxpdHlJbmZvIHBDYXBJbmZvOworICAgIHRMaW1TeXN0ZW1Sb2xlIHN5c3RlbVJvbGUgPSBsaW1HZXRTeXN0ZW1Sb2xlKHNlc3Npb25FbnRyeSk7CisKKyAgICAqcENhcCA9IDA7CisgICAgcENhcEluZm8gPSAodHBTaXJNYWNDYXBhYmlsaXR5SW5mbykgcENhcDsKKworICAgIGlmIChzeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkKKyAgICAgICAgcENhcEluZm8tPmlic3MgPSAxOyAvLyBJQlNTIGJpdAorICAgIGVsc2UgaWYgKCAoc3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpIHx8KHN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSl8fChzeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSB8fAorICAgICAgICAgICAgIChzeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpICkKKyAgICAgICAgcENhcEluZm8tPmVzcyA9IDE7IC8vIEVTUyBiaXQKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9QMlAKKyAgICBlbHNlIGlmIChsaW1HZXRTeXN0ZW1Sb2xlKHNlc3Npb25FbnRyeSkgPT0gZUxJTV9QMlBfREVWSUNFX1JPTEUgKQorICAgIHsKKyAgICAgICAgcENhcEluZm8tPmVzcyA9IDA7CisgICAgICAgIHBDYXBJbmZvLT5pYnNzID0gMDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgIGNmZ0xvZyhwTWFjLCBMT0dQLCBGTCgiY2FuJ3QgZ2V0IGNhcGFiaWxpdHksIHJvbGUgaXMgVU5LTk9XTiEhXG4iKSk7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICBpZiggKHN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKSApCisgICAgeworICAgICAgICAvLyBDRi1wb2xsYWJsZSBiaXQKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQ0ZfUE9MTEFCTEUsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgY2ZnTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IFdOSV9DRkdfQ0ZfUE9MTEFCTEUgZmFpbGVkXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmICh2YWwpCisgICAgICAgICAgICBwQ2FwSW5mby0+Y2ZQb2xsYWJsZSA9IDE7CisKKyAgICAgICAgLy8gQ0YtcG9sbCByZXF1ZXN0IGJpdAorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19DRl9QT0xMX1JFUVVFU1QsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgY2ZnTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IFdOSV9DRkdfQ0ZfUE9MTF9SRVFVRVNUIGZhaWxlZFxuIikpOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsKQorICAgICAgICAgICAgcENhcEluZm8tPmNmUG9sbFJlcSA9IDE7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYoc3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgeworICAgICAgICB2YWwgPSBzZXNzaW9uRW50cnktPnByaXZhY3k7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjZW5kaWYKKyAgICAvLyBQUklWQUNZIGJpdAorICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgY2ZnTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IFdOSV9DRkdfUFJJVkFDWV9FTkFCTEVEIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgfQorI2VuZGlmCisgICAgaWYgKHZhbCkKKyAgICAgICAgcENhcEluZm8tPnByaXZhY3kgPSAxOworCisgICAgLy8gU2hvcnQgcHJlYW1ibGUgYml0CisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEUsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGNmZ0xvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBXTklfQ0ZHX1NIT1JUX1BSRUFNQkxFIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgICBpZiAodmFsKQorICAgICAgICBwQ2FwSW5mby0+c2hvcnRQcmVhbWJsZSA9IDE7CisKKworICAgIC8vIFBCQ0MgYml0CisgICAgcENhcEluZm8tPnBiY2MgPSAwOworCisgICAgLy8gQ2hhbm5lbCBhZ2lsaXR5IGJpdAorICAgIHBDYXBJbmZvLT5jaGFubmVsQWdpbGl0eSA9IDA7CisgICAgLy9JZiBTVEEvQVAgb3BlcmF0aW5nIGluIDExQiBtb2RlLCBkb24ndCBzZXQgcmVzdCBvZiB0aGUgY2FwYWJpbGl0eSBpbmZvIGJpdHMuCisgICAgaWYoc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExQikKKyAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworCisgICAgCisgICAgLy8gU2hvcnQgc2xvdCB0aW1lIGJpdAorICAgIGlmIChzeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkKKyAgICB7CisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRSwgJnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBjZmdMb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY2ZnIGdldCBXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRSBmYWlsZWRcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbCkKKyAgICAgICAgICAgIHBDYXBJbmZvLT5zaG9ydFNsb3RUaW1lID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVELCAmdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNmZ0xvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjZmcgZ2V0IFdOSV9DRkdfMTFHX1NIT1JUX1NMT1RfVElNRSBmYWlsZWRcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgLyogV2hlbiBpbiBTVEEgbW9kZSwgd2UgbmVlZCB0byBjaGVjayBpZiBzaG9ydCBzbG90IGlzIGVuYWJsZWQgYXMgd2VsbCBhcyBjaGVjayBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcKKyAgICAgICAgICogbW9kZSBpcyBzaG9ydCBzbG90IHRpbWUgYW5kIHRoZW4gZGVjaWRlIHdoZXRoZXIgdG8gZW5hYmxlIHNob3J0IHNsb3Qgb3Igbm90LiBJdCBpcyBzYWZlIHRvIGNoZWNrIGJvdGggCisgICAgICAgICAqIGNmZyB2YWx1ZXMgdG8gZGV0ZXJtaW5lIHNob3J0IHNsb3QgdmFsdWUgaW4gdGhpcyBmdW5jbiBzaW5jZSB0aGlzIGZ1bmNuIGlzIGFsd2F5cyB1c2VkIGFmdGVyIGFzc29jIHdoZW4KKyAgICAgICAgICogdGhlc2UgY2ZnIHZhbHVlcyBhcmUgYWxyZWFkeSBzZXQgYmFzZWQgb24gcGVlcidzIGNhcGFiaWxpdHkuIEV2ZW4gaW4gY2FzZSBvZiBJQlNTLCBpdHMgdmFsdWUgaXMgc2V0IHRvCisgICAgICAgICAqIGNvcnJlY3QgdmFsdWUgZWl0aGVyIGluIGRlbEJTUyBhcyBwYXJ0IG9mIGRlbGV0aW5nIHRoZSBwcmV2aW91cyBJQlNTIG9yIGluIHN0YXJ0IEJTUyBhcyBwYXJ0IG9mIGNvYWxlc2NpbmcKKyAgICAgICAgICovCisgICAgICAgIGlmICh2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRSwgJnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZmdMb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoImNmZyBnZXQgV05JX0NGR19TSE9SVF9TTE9UX1RJTUUgZmFpbGVkXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWwpCisgICAgICAgICAgICBwQ2FwSW5mby0+c2hvcnRTbG90VGltZSA9IDE7CisgICAgfQorICAgIH0KKworICAgIC8vIFNwZWN0cnVtIE1hbmFnZW1lbnQgYml0CisgICAgaWYoKGVMSU1fU1RBX0lOX0lCU1NfUk9MRSAhPSBzeXN0ZW1Sb2xlKSAmJgorICAgICAgICAgICAgc2Vzc2lvbkVudHJ5LT5saW0xMWhFbmFibGUgKQorICAgIHsKKyAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHXzExSF9FTkFCTEVELCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICB7CisgICAgICAgICAgY2ZnTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IFdOSV9DRkdfMTFIX0VOQUJMRUQgZmFpbGVkXG4iKSk7CisgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgIH0KKyAgICAgIGlmICh2YWwpCisgICAgICAgICAgcENhcEluZm8tPnNwZWN0cnVtTWd0ID0gMTsKKyAgICB9CisKKyAgICAvLyBRb1MgYml0CisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUU9TX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGNmZ0xvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBXTklfQ0ZHX1FPU19FTkFCTEVEIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgICBpZiAodmFsKQorICAgICAgICBwQ2FwSW5mby0+cW9zID0gMTsKKworICAgIC8vIEFQU0QgYml0CisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQVBTRF9FTkFCTEVELCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBjZmdMb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgV05JX0NGR19BUFNEX0VOQUJMRUQgZmFpbGVkXG4iKSk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIGlmICh2YWwpCisgICAgICAgIHBDYXBJbmZvLT5hcHNkID0gMTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIGlmICgobGltR2V0U3lzdGVtUm9sZShzZXNzaW9uRW50cnkpID09IGVMSU1fU1RBX1JPTEUpICkKKyAgICB7CisgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19SUk1fRU5BQkxFRCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgeworICAgICAgICBjZmdMb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgV05JX0NGR19SUk1fRU5BQkxFRCBmYWlsZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgIH0KKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICBQRUxPR0UoY2ZnTG9nKCBwTWFjLCBMT0dFLCAiUlJNID0gJWRcbiIsdmFsICk7KQorI2VuZGlmCisgICAgICBpZiAodmFsKQorICAgICAgICBwQ2FwSW5mby0+cnJtID0gMTsKKyAgICB9CisjZW5kaWYKKyAgICAvL0RTU1MtT0ZETQorICAgIC8vRklYTUUgOiBubyBjb25maWcgZGVmaW5lZCB5ZXQuIAorICAgIAorICAgIC8vIEJsb2NrIGFjayBiaXQKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgY2ZnTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IFdOSV9DRkdfQkxPQ0tfQUNLX0VOQUJMRUQgZmFpbGVkXG4iKSk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIHBDYXBJbmZvLT5kZWxheWVkQkEgPSAodEFOSV9VMTYpKCh2YWwgPj4gV05JX0NGR19CTE9DS19BQ0tfRU5BQkxFRF9ERUxBWUVEKSAmIDEpOworICAgIHBDYXBJbmZvLT5pbW1lZGlhdGVCQSA9ICh0QU5JX1UxNikoKHZhbCA+PiBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEX0lNTUVESUFURSkgJiAxKTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIGNmZ1NldENhcGFiaWxpdHlJbmZvCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBCUCBiYXNlZCBvbiB0aGUgY2FwYWJpbGl0aWVzCisgKiByZWNlaXZlZCBpbiBTTUVfSk9JTi9SRUFTU09DX1JFUSBtZXNzYWdlLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6IDEuIEVTUy9JQlNTIGNhcGFiaWxpdGllcyBhcmUgYmFzZWQgb24gc3lzdGVtIHJvbGUuCisgKiAgICAgICAyLiBTaW5jZSBQQkNDLCBDaGFubmVsIGFnaWxpdHkgYW5kIEV4dGVuZGVkIGNhcGFiaWxpdGllcworICogICAgICAgICAgYXJlIG5vdCBzdXBwb3J0ZWQsIHRoZXkncmUgbm90IHNldCBhdCBDRkcKKyAqCisgKiBAcGFyYW0gIHBNYWMgICBQb2ludGVyIHRvIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGNhcHMgICAxNi1iaXQgQ2FwYWJpbGl0eSBJbmZvIGZpZWxkCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitjZmdTZXRDYXBhYmlsaXR5SW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBjYXBzKQoreworI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApKQorCisgICAgaWYgKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICAgIFNJUl9NQUNfR0VUX1BSSVZBQ1koY2FwcykpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgY2ZnTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3Qgc2V0IHByaXZhY3kgYXQgQ0ZHXG4iKSk7CisKKyAgICBpZiAoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEUsCisgICAgICAgICAgICAgICAgICBTSVJfTUFDX0dFVF9TSE9SVF9QUkVBTUJMRShjYXBzKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBjZmdMb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCBzZXQgc2hvcnQgcHJlYW1ibGUgYXQgQ0ZHXG4iKSk7CisKKyAgICBpZiAoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfUU9TX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgICBTSVJfTUFDX0dFVF9RT1MoY2FwcykpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgY2ZnTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3Qgc2V0IHFvcyBhdCBDRkdcbiIpKTsKKworICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgICBTSVJfTUFDX0dFVF9TSE9SVF9TTE9UX1RJTUUoY2FwcykpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgY2ZnTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3Qgc2V0IHNob3J0IHNsb3QgdGltZSBhdCBDRkdcbiIpKTsKKworICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR19BUFNEX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgICBTSVJfTUFDX0dFVF9BUFNEKGNhcHMpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGNmZ0xvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHNldCBhcHNkIGF0IENGR1xuIikpOworCisgICAgaWYgKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVELAorICAgICAgICAgICAgICAgICAgU0lSX01BQ19HRVRfQkxPQ0tfQUNLKGNhcHMpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGNmZ0xvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHNldCBCbG9ja0FjayBhdCBDRkdcbiIpKTsKKyNlbmRpZgorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBjZmdDbGVhbnVwKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIENGRyBjbGVhbnVwIGZ1bmN0aW9uLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBkdXJpbmcgc3lzdGVtIHNodXRkb3duLgorICoKKyAqIEBwYXJhbSBOb25lCisgKgorICogQHJldHVybiBOb25lLgorICoKKyAqLworCit2b2lkCitjZmdDbGVhbnVwKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgLy8gU2V0IHN0YXR1cyB0byBub3QtcmVhZHkKKyAgICBwTWFjLT5jZmcuZ0NmZ1N0YXR1cyA9IENGR19JTkNPTVBMRVRFOworCit9IC8qKiogZW5kIENmZ0NsZWFudXAoKSAqKiovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBOb3RpZnkoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gbm90aWZ5IG90aGVyIG1vZHVsZXMgb2YgcGFyYW1ldGVyIHVwZGF0ZS4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBjZmdJZDogICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgSUQKKyAqIEBwYXJhbSBtYXNrOiAgICAgbm90aWZpY2F0aW9uIG1hc2sKKyAqCisgKiBAcmV0dXJuIE5vbmUuCisgKgorICovCisKK3N0YXRpYyB2b2lkCitOb3RpZnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgY2ZnSWQsIHRBTklfVTMyIG50Zk1hc2spCit7CisKKyAgICB0U2lyTXNnUSAgICBtbWhNc2c7CisKKyAgICBtbWhNc2cudHlwZSA9IFNJUl9DRkdfUEFSQU1fVVBEQVRFX0lORDsKKyAgICBtbWhNc2cuYm9keXZhbCA9ICh0QU5JX1UzMiljZmdJZDsKKyAgICBtbWhNc2cuYm9keXB0ciA9IE5VTEw7CisKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtbWhNc2cudHlwZSkpOworCisgICAgaWYgKChudGZNYXNrICYgQ0ZHX0NUTF9OVEZfU0NIKSAhPSAwKQorICAgICAgICBzY2hQb3N0TWVzc2FnZShwTWFjLCAmbW1oTXNnKTsKKworICAgIGlmICgobnRmTWFzayAmIENGR19DVExfTlRGX0xJTSkgIT0gMCkKKyAgICAgICAgbGltUG9zdE1zZ0FwaShwTWFjLCAmbW1oTXNnKTsKKworICAgIGlmICgobnRmTWFzayAmIENGR19DVExfTlRGX0hBTCkgIT0gMCkKKyAgICAgICAgd2RhUG9zdEN0cmxNc2cocE1hYywgJm1taE1zZyk7CisKKyAgICAvLyBOb3RpZnkgQVJRCisKK30gLyoqKiBlbmQgTm90aWZ5KCkgKioqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2NmZy9jZmdEZWJ1Zy5jIGIvQ09SRS9NQUMvc3JjL2NmZy9jZmdEZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzdjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvY2ZnL2NmZ0RlYnVnLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBjZmdEZWJ1Zy5jCisgIAorICBcYnJpZWYgaW1wbGVtZW50YXRpb24gZm9yIGxvZyBEZWJ1ZyByZWxhdGVkIEFQSXMKKworICBcYXV0aG9yIFN1bml0IEJoYXRpYQorICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJjZmdEZWJ1Zy5oIgorCit2b2lkIGNmZ0xvZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBsb2dsZXZlbCwgY29uc3QgY2hhciAqcFN0cmluZywuLi4pIAoreworI2lmZGVmIFdMQU5fREVCVUcKKyAgICAvLyBWZXJpZnkgYWdhaW5zdCBjdXJyZW50IGxvZyBsZXZlbAorICAgIGlmIChsb2dsZXZlbCA+IHBNYWMtPnV0aWxzLmdMb2dEYmdMZXZlbFtMT0dfSU5ERVhfRk9SX01PRFVMRSggU0lSX0NGR19NT0RVTEVfSUQgKV0pCisgICAgICAgIHJldHVybjsKKyAgICBlbHNlCisgICAgeworICAgICAgICB2YV9saXN0IG1hcmtlcjsKKworICAgICAgICB2YV9zdGFydCggbWFya2VyLCBwU3RyaW5nICk7ICAgICAvKiBJbml0aWFsaXplIHZhcmlhYmxlIGFyZ3VtZW50cy4gKi8KKworICAgICAgICBsb2dEZWJ1ZyhwTWFjLCBTSVJfQ0ZHX01PRFVMRV9JRCwgbG9nbGV2ZWwsIHBTdHJpbmcsIG1hcmtlcik7CisgICAgICAgIAorICAgICAgICB2YV9lbmQoIG1hcmtlciApOyAgICAgICAgICAgICAgLyogUmVzZXQgdmFyaWFibGUgYXJndW1lbnRzLiAgICAgICovCisgICAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvY2ZnL2NmZ0RlYnVnLmggYi9DT1JFL01BQy9zcmMvY2ZnL2NmZ0RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkMDUzMwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9jZmcvY2ZnRGVidWcuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogICAgICBLZXZpbiBOZ3V5ZW4gICAgCisgKiBEYXRlOiAgICAgICAgMDQvMDkvMDIKKyAqIEhpc3Rvcnk6LQorICogMDQvMDkvMDIgICAgICAgIENyZWF0ZWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX19DRkdfREVCVUdfSF9fCisjZGVmaW5lIF9fQ0ZHX0RFQlVHX0hfXworCisjaW5jbHVkZSAic2lyRGVidWcuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVRyYWNlLmgiCisKKwordm9pZCBjZmdMb2codHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHJpbmcsLi4uKSA7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2NmZy9jZmdEZWYuaCBiL0NPUkUvTUFDL3NyYy9jZmcvY2ZnRGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0MmYzZgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9jZmcvY2ZnRGVmLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgaXMgdGhlIHByaXZhdGUgaGVhZGVyIGZpbGUgZm9yIENGRyBtb2R1bGUuCisgKgorICogQXV0aG9yOiAgICAgICAgS2V2aW4gTmd1eWVuCisgKiBEYXRlOiAgICAgICAgMDMvMjAvMDIKKyAqIEhpc3Rvcnk6LQorICogMDMvMjAvMDIgICAgICAgIENyZWF0ZWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaWZuZGVmIF9fQ0ZHREVGX0gKKyNkZWZpbmUgX19DRkdERUZfSAorCisvKgorICogQ0ZHIENvbnRyb2wgRmxhZyBkZWZpbml0aW9ucworICovCisjZGVmaW5lIENGR19DVExfVkFMSUQgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIENGR19DVExfUkUgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIENGR19DVExfV0UgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIENGR19DVExfSU5UICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIENGR19DVExfU0FWRSAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIENGR19DVExfUkVTVEFSVCAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIENGR19DVExfUkVMT0FEICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIENGR19DVExfTlRGX1BIWSAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIENGR19DVExfTlRGX01BQyAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIENGR19DVExfTlRGX0xPRyAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIENGR19DVExfTlRGX0hBTCAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIENGR19DVExfTlRGX0RQSCAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIENGR19DVExfTlRGX0FSUSAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIENGR19DVExfTlRGX1NDSCAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIENGR19DVExfTlRGX0xJTSAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIENGR19DVExfTlRGX0hERCAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIENGR19DVExfTlRGX01BU0sgICAgICAweEZGRTAwMDAwCisKKyNkZWZpbmUgQ0ZHX0NUTF9OVEZfVEZQICAgICAgIENGR19DVExfTlRGX01BQworI2RlZmluZSBDRkdfQ1RMX05URl9SSFAgICAgICAgQ0ZHX0NUTF9OVEZfTUFDCisjZGVmaW5lIENGR19DVExfTlRGX1JGUCAgICAgICBDRkdfQ1RMX05URl9NQUMKKyNkZWZpbmUgQ0ZHX0NUTF9OVEZfU1AgICAgICAgIENGR19DVExfTlRGX01BQworI2RlZmluZSBDRkdfQ1RMX05URl9IVyAgICAgICAgKENGR19DVExfTlRGX01BQyB8IENGR19DVExfTlRGX1BIWSkKKworI2RlZmluZSBDRkdfQlVGX0lORFhfTUFTSyAgICAgMHgwMDAwMGZmZgorI2RlZmluZSBDRkdfU0VNX0lORFhfTUFTSyAgICAgMHgwMDAwZjAwMAorI2RlZmluZSBDRkdfU0VNX0lORFhfU0hJRlQgICAgMTIKKworCisjZW5kaWYgLyogX19DRkdERUZfSCAqLworCisKKworCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvY2ZnL2NmZ1BhcmFtTmFtZS5jIGIvQ09SRS9NQUMvc3JjL2NmZy9jZmdQYXJhbU5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzA0YzJiCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL2NmZy9jZmdQYXJhbU5hbWUuYwpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuCisgKi8KKworLyoKKyAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNsbHkKKyAqLworCisvKgorICogSU1QT1JUQU5UOiAgVGhpcyBmaWxlIGlzIGZvciBzeXN0ZW0gdGhhdCBzdXBwb3J0cyBTVEEgbW9kZSBPTkxZLgorICovCisjaW5jbHVkZSAiY2ZnUHJpdi5oIgorCit1bnNpZ25lZCBjaGFyICpnQ2ZnUGFyYW1OYW1lW10gPSB7CisgICAgKHVuc2lnbmVkIGNoYXIgKikiU1RBX0lEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJDRl9QT0xMQUJMRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQ0ZQX1BFUklPRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQ0ZQX01BWF9EVVJBVElPTiIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiU1NJRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQkVBQ09OX0lOVEVSVkFMIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJEVElNX1BFUklPRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV0VQX0tFWV9MRU5HVEgiLAorICAgICh1bnNpZ25lZCBjaGFyICopIldFUF9ERUZBVUxUX0tFWV8xIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJXRVBfREVGQVVMVF9LRVlfMiIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV0VQX0RFRkFVTFRfS0VZXzMiLAorICAgICh1bnNpZ25lZCBjaGFyICopIldFUF9ERUZBVUxUX0tFWV80IiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJXRVBfREVGQVVMVF9LRVlJRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiRVhDTFVERV9VTkVOQ1JZUFRFRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUlRTX1RIUkVTSE9MRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiU0hPUlRfUkVUUllfTElNSVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkxPTkdfUkVUUllfTElNSVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJBQ1RJVkVfTUlOSU1VTV9DSEFOTkVMX1RJTUUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkFDVElWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUEFTU0lWRV9NSU5JTVVNX0NIQU5ORUxfVElNRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiSk9JTl9GQUlMVVJFX1RJTUVPVVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkFVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkFVVEhFTlRJQ0FURV9SU1BfVElNRU9VVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJSRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUkFfUEVSSU9ESUNJVFlfVElNRU9VVF9JTl9QUyIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUFNfRU5BQkxFX0JDTl9GSUxURVIiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBTX0VOQUJMRV9IRUFSVF9CRUFUIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJQU19FTkFCTEVfUlNTSV9NT05JVE9SIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJQU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUkZfU0VUVExJTkdfVElNRV9DTEsiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlNVUFBPUlRFRF9SQVRFU18xMUIiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlNVUFBPUlRFRF9SQVRFU18xMUEiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBIWV9NT0RFIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJET1QxMV9NT0RFIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJPUEVSQVRJT05BTF9SQVRFX1NFVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBST1BSSUVUQVJZX09QRVJBVElPTkFMX1JBVEVfU0VUIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJCU1NJRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTElTVEVOX0lOVEVSVkFMIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJWQUxJRF9DSEFOTkVMX0xJU1QiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkNVUlJFTlRfQ0hBTk5FTCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiREVGQVVMVF9SQVRFX0lOREVYXzVHSFoiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkRFRkFVTFRfUkFURV9JTkRFWF8yNEdIWiIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUkFURV9BREFQVEFUSU9OX1RZUEUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkZJWEVEX1JBVEUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkZJWEVEX1JBVEVfTVVMVElDQVNUXzI0R0haIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJGSVhFRF9SQVRFX01VTFRJQ0FTVF81R0haIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJSRVRSWVJBVEVfUE9MSUNZIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJSRVRSWVJBVEVfU0VDT05EQVJZIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJSRVRSWVJBVEVfVEVSVElBUlkiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkFQU0RfRU5BQkxFRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiU0hBUkVEX0tFWV9BVVRIX0VOQUJMRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiT1BFTl9TWVNURU1fQVVUSF9FTkFCTEUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkFVVEhFTlRJQ0FUSU9OX1RZUEUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkNGX1BPTExfUkVRVUVTVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUFJJVkFDWV9FTkFCTEVEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJTSE9SVF9QUkVBTUJMRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiU0hPUlRfU0xPVF9USU1FIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJBQ0NFUFRfU0hPUlRfU0xPVF9BU1NPQ19PTkxZIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJRT1NfRU5BQkxFRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiSENGX0VOQUJMRUQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlJTTl9FTkFCTEVEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJCQUNLR1JPVU5EX1NDQU5fUEVSSU9EIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJNQVhfTlVNX1BSRV9BVVRIIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJQUkVBVVRIX0NMTlVQX1RJTUVPVVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlJFTEVBU0VfQUlEX1RJTUVPVVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkhFQVJUX0JFQVRfVEhSRVNIT0xEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJQUk9CRV9BRlRFUl9IQl9GQUlMX1RJTUVPVVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIk1BTlVGQUNUVVJFUl9PVUkiLAorICAgICh1bnNpZ25lZCBjaGFyICopIk1BTlVGQUNUVVJFUl9OQU1FIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJNT0RFTF9OVU1CRVIiLAorICAgICh1bnNpZ25lZCBjaGFyICopIk1PREVMX05BTUUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIk1BTlVGQUNUVVJFUl9QUk9EVUNUX05BTUUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIk1BTlVGQUNUVVJFUl9QUk9EVUNUX1ZFUlNJT04iLAorICAgICh1bnNpZ25lZCBjaGFyICopIjExRF9FTkFCTEVEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJNQVhfVFhfUE9XRVJfMl80IiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJNQVhfVFhfUE9XRVJfNSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTkVUV09SS19ERU5TSVRZIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJBREFQVElWRV9USFJFU0hPTERfQUxHT1JJVEhNIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJDVVJSRU5UX1RYX0FOVEVOTkEiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkNVUlJFTlRfUlhfQU5URU5OQSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUE9XRVJfU1RBVEVfUEVSX0NIQUlOIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJORVdfQlNTX0ZPVU5EX0lORCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUFJPUFJJRVRBUllfQU5JX0ZFQVRVUkVTX0VOQUJMRUQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBST1BSSUVUQVJZX1JBVEVTX0VOQUJMRUQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkFQX05PREVfTkFNRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQ09VTlRSWV9DT0RFIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSIxMUhfRU5BQkxFRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV1RfQ05GX1RJTUVPVVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIktFRVBBTElWRV9USU1FT1VUIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJQUk9YSU1JVFkiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkxPR19MRVZFTCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiT0xCQ19ERVRFQ1RfVElNRU9VVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUFJPVEVDVElPTl9FTkFCTEVEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSIxMUdfUFJPVEVDVElPTl9BTFdBWVMiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkZPUkNFX1BPTElDWV9QUk9URUNUSU9OIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSIxMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiMTFHX1NIT1JUX1NMT1RfVElNRV9FTkFCTEVEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJDQUxfUEVSSU9EIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJTVEFUU19QRVJJT0QiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkNBTF9DT05UUk9MIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSIxMUdfT05MWV9QT0xJQ1kiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBBQ0tFVF9DTEFTU0lGSUNBVElPTiIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV01FX0VOQUJMRUQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkFERFRTX1JTUF9USU1FT1VUIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJNQVhfU1BfTEVOR1RIIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJLRUVQX0FMSVZFX1NUQV9MSU1JVF9USFJFU0hPTEQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlNFTkRfU0lOR0xFX1NTSURfQUxXQVlTIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJXU01fRU5BQkxFRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUFJPUF9DQVBBQklMSVRZIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJFRENBX1BST0ZJTEUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDQktfTE9DQUwiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDQkVfTE9DQUwiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDVklfTE9DQUwiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDVk9fTE9DQUwiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDQksiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDQkUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDVkkiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfQU5JX0FDVk8iLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDQktfTE9DQUwiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDQkVfTE9DQUwiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDVklfTE9DQUwiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDVk9fTE9DQUwiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDQksiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDQkUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDVkkiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfV01FX0FDVk8iLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfVElUX0RFTU9fQUNCS19MT0NBTCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiRURDQV9USVRfREVNT19BQ0JFX0xPQ0FMIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJFRENBX1RJVF9ERU1PX0FDVklfTE9DQUwiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfVElUX0RFTU9fQUNWT19MT0NBTCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiRURDQV9USVRfREVNT19BQ0JLIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJFRENBX1RJVF9ERU1PX0FDQkUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVEQ0FfVElUX0RFTU9fQUNWSSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiRURDQV9USVRfREVNT19BQ1ZPIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJSREVUX0ZMQUciLAorICAgICh1bnNpZ25lZCBjaGFyICopIlJBREFSX0NIQU5ORUxfTElTVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQURNSVRfUE9MSUNZIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJBRE1JVF9CV0ZBQ1RPUiIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTUFYX0NPTlNFQ1VUSVZFX0JBQ0tHUk9VTkRfU0NBTl9GQUlMVVJFIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJDSEFOTkVMX0JPTkRJTkdfTU9ERSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkRZTkFNSUNfVEhSRVNIT0xEX1pFUk8iLAorICAgICh1bnNpZ25lZCBjaGFyICopIkRZTkFNSUNfVEhSRVNIT0xEX09ORSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiRFlOQU1JQ19USFJFU0hPTERfVFdPIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJUUklHX1NUQV9CS19TQ0FOIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJEWU5BTUlDX1BST0ZJTEVfU1dJVENISU5HIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJTQ0FOX0NPTlRST0xfTElTVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTUlNT19FTkFCTEVEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJCTE9DS19BQ0tfRU5BQkxFRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQkFfQUNUSVZJVFlfQ0hFQ0tfVElNRU9VVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiSFRfUlhfU1RCQyIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiSFRfQ0FQX0lORk8iLAorICAgICh1bnNpZ25lZCBjaGFyICopIkhUX0FNUERVX1BBUkFNUyIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiU1VQUE9SVEVEX01DU19TRVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVYVF9IVF9DQVBfSU5GTyIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiVFhfQkZfQ0FQIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJBU19DQVAiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkhUX0lORk9fRklFTEQxIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJIVF9JTkZPX0ZJRUxEMiIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiSFRfSU5GT19GSUVMRDMiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkJBU0lDX01DU19TRVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkNVUlJFTlRfTUNTX1NFVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiR1JFRU5GSUVMRF9DQVBBQklMSVRZIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJNQVhfQU1TRFVfTEVOR1RIIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJNUERVX0RFTlNJVFkiLAorICAgICh1bnNpZ25lZCBjaGFyICopIk1BWF9SWF9BTVBEVV9GQUNUT1IiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlNIT1JUX0dJXzIwTUhaIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJTSE9SVF9HSV80ME1IWiIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUklGU19FTkFCTEVEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJNQVhfUFNfUE9MTCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJSU1NJX0ZJTFRFUl9QRVJJT0QiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkZUX1JTU0lfRklMVEVSX1BFUklPRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTUlOX1JTU0lfVEhSRVNIT0xEIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJOVEhfQkVBQ09OX0ZJTFRFUiIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQlJPQURDQVNUX0ZSQU1FX0ZJTFRFUl9FTkFCTEUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlNDQU5fSU5fUE9XRVJTQVZFIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJJR05PUkVfRFRJTSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV09XTEFOX1VDQVNUX1BBVFRFUk5fRklMVEVSX0VOQUJMRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV09XTEFOX0NIQU5ORUxfU1dJVENIX0VOQUJMRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV09XTEFOX0RFQVVUSF9FTkFCTEUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIldPV0xBTl9ESVNBU1NPQ19FTkFCTEUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIldPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTiIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV09XTEFOX01BWF9TTEVFUF9QRVJJT0QiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkJBX1RJTUVPVVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkJBX1RIUkVTSE9MRF9ISUdIIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJNQVhfQkFfQlVGRkVSUyIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTUFYX0JBX1NFU1NJT05TIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJCQV9BVVRPX1NFVFVQIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJBRERCQV9SRVFfREVDTElORSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQkdfU0NBTl9DSEFOTkVMX0xJU1QiLAorICAgICh1bnNpZ25lZCBjaGFyICopIk1BWF9NRURJVU1fVElNRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTUFYX01QRFVTX0lOX0FNUERVIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJJQlNTX0FVVE9fQlNTSUQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBST0JFX1JFUV9BREROSUVfRkxBRyIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUFJPQkVfUkVRX0FERE5JRV9EQVRBIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJQUk9CRV9SU1BfQURETklFX0ZMQUciLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBST0JFX1JTUF9BREROSUVfREFUQTEiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBST0JFX1JTUF9BREROSUVfREFUQTIiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBST0JFX1JTUF9BREROSUVfREFUQTMiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkFTU09DX1JTUF9BREROSUVfRkxBRyIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQVNTT0NfUlNQX0FERE5JRV9EQVRBIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJQUk9CRV9SRVFfQURETlAyUElFX0ZMQUciLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBST0JFX1JFUV9BREROUDJQSUVfREFUQSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBRyIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUFJPQkVfUlNQX0JDTl9BREROSUVfREFUQSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV1BTX0VOQUJMRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV1BTX1NUQVRFIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJXUFNfUFJPQkVfUkVRX0ZMQUciLAorICAgICh1bnNpZ25lZCBjaGFyICopIldQU19WRVJTSU9OIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJXUFNfUkVRVUVTVF9UWVBFIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJXUFNfQ0ZHX01FVEhPRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV1BTX1VVSUQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIldQU19QUklNQVJZX0RFVklDRV9DQVRFR09SWSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV1BTX1BJTUFSWV9ERVZJQ0VfT1VJIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJXUFNfREVWSUNFX1NVQl9DQVRFR09SWSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV1BTX0FTU09DSUFUSU9OX1NUQVRFIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJXUFNfQ09ORklHVVJBVElPTl9FUlJPUiIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV1BTX0RFVklDRV9QQVNTV09SRF9JRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiV1BTX0FTU09DX01FVEhPRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTE9XX0dBSU5fT1ZFUlJJREUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVOQUJMRV9QSFlfQUdDX0xJU1RFTl9NT0RFIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJSUEVfUE9MTElOR19USFJFU0hPTEQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlJQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMF9SRUciLAorICAgICh1bnNpZ25lZCBjaGFyICopIlJQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMV9SRUciLAorICAgICh1bnNpZ25lZCBjaGFyICopIlJQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMl9SRUciLAorICAgICh1bnNpZ25lZCBjaGFyICopIlJQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDM19SRUciLAorICAgICh1bnNpZ25lZCBjaGFyICopIk5PX09GX09OQ0hJUF9SRU9SREVSX1NFU1NJT05TIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJTSU5HTEVfVElEX1JDIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJSUk1fRU5BQkxFRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUlJNX09QRVJBVElOR19DSEFOX01BWCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiUlJNX05PTl9PUEVSQVRJTkdfQ0hBTl9NQVgiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlRYX1BXUl9DVFJMX0VOQUJMRSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiTUNBU1RfQkNBU1RfRklMVEVSX1NFVFRJTkciLAorICAgICh1bnNpZ25lZCBjaGFyICopIkJUQ19ESENQX0JUX1NMT1RTX1RPX0JMT0NLIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJEWU5BTUlDX1BTX1BPTExfVkFMVUUiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlBTX05VTExEQVRBX0FQX1JFU1BfVElNRU9VVCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiVEVMRV9CQ05fV0FLRVVQX0VOIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJURUxFX0JDTl9UUkFOU19MSSIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiVEVMRV9CQ05fVFJBTlNfTElfSURMRV9CQ05TIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJURUxFX0JDTl9NQVhfTEkiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlRFTEVfQkNOX01BWF9MSV9JRExFX0JDTlMiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkJUQ19BMkRQX0RIQ1BfQlRfU1VCX0lOVEVSVkFMUyIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9EIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJBU1NPQ19TVEFfTElNSVQiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlNBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJTQVBfQ0hBTk5FTF9TRUxFQ1RfRU5EX0NIQU5ORUwiLAorICAgICh1bnNpZ25lZCBjaGFyICopIlNBUF9DSEFOTkVMX1NFTEVDVF9PUEVSQVRJTkdfQkFORCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQVBfREFUQV9BVkFJTF9QT0xMX1BFUklPRCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiRU5BQkxFX0NMT1NFX0xPT1AiLAorICAgICh1bnNpZ25lZCBjaGFyICopIkVOQUJMRV9MVEVfQ09FWCIsCisgICAgKHVuc2lnbmVkIGNoYXIgKikiQVBfS0VFUF9BTElWRV9USU1FT1VUIiwKKyAgICAodW5zaWduZWQgY2hhciAqKSJHT19LRUVQX0FMSVZFX1RJTUVPVVQiLAorfTsKKworCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9jZmcvY2ZnUHJpdi5oIGIvQ09SRS9NQUMvc3JjL2NmZy9jZmdQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmM2JlNwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9jZmcvY2ZnUHJpdi5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBpcyB0aGUgcHJpdmF0ZSBoZWFkZXIgZmlsZSBmb3IgQ0ZHIG1vZHVsZS4KKyAqCisgKiBBdXRob3I6ICAgICAgICBLZXZpbiBOZ3V5ZW4KKyAqIERhdGU6ICAgICAgICAwMy8yMC8wMgorICogSGlzdG9yeTotCisgKiAwMy8yMC8wMiAgICAgICAgQ3JlYXRlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19DRkdQUklWX0gKKyNkZWZpbmUgX19DRkdQUklWX0gKKworI2luY2x1ZGUgPHNpckNvbW1vbi5oPgorI2luY2x1ZGUgPHNpclR5cGVzLmg+CisjaW5jbHVkZSA8c2lyRGVidWcuaD4KKyNpbmNsdWRlIDx3bmlTdGF0Lmg+CisjaW5jbHVkZSA8dXRpbHNBcGkuaD4KKyNpbmNsdWRlIDxsaW1BcGkuaD4KKyNpbmNsdWRlIDxzY2hBcGkuaD4KKyNpbmNsdWRlIDxjZmdBcGkuaD4KKyNpbmNsdWRlICJjZmdEZWYuaCIKKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgICNpbmNsdWRlIDx3bmlDZmdBcC5oPgorI2Vsc2UKKyAgICAjaW5jbHVkZSA8d25pQ2ZnU3RhLmg+CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDRkcgbWlzY2VsbGFuZW91cyBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyBGdW5jdGlvbiBpbmRleCBiaXQgbWFzaworI2RlZmluZSBDRkdfRlVOQ19JTkRYX01BU0sgICAweDdmCisjZGVmaW5lIENGR19HRVRfRlVOQ19JTkRYKHZhbCkgKHZhbCAmIENGR19GVU5DX0lORFhfTUFTSykKKworLy8gTWFjcm8gdG8gY29udmVydCByZXR1cm4gY29kZSB0byBkZWJ1ZyBzdHJpbmcgaW5kZXgKKyNkZWZpbmUgQ0ZHX0dFVF9EQkdfSU5EWCh2YWwpICh2YWwgLSBlQ0ZHX1NVQ0NFU1MgLSAxKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQmluYXJ5IGhlYWRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNDZmdCaW5IZHIKK3sKKyAgICB0QU5JX1UzMiAgIGhkckluZm87CisgICAgdEFOSV9VMzIgICBjb250cm9sU2l6ZTsKKyAgICB0QU5JX1UzMiAgIGlCdWZTaXplOworICAgIHRBTklfVTMyICAgc0J1ZlNpemU7Cit9IHRDZmdCaW5IZHIsICp0cENmZ0JpbkhkcjsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFBvbGFyaXMgSFcgY291bnRlciBhY2Nlc3Mgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHRBTklfVTMyICAgIGFkZHI7CisgICAgdEFOSV9VMzIgICAgbWFzazsKKyAgICB0QU5JX1UzMiAgICBzaGlmdDsKK30gdENmZ0h3Q250OworCisKKyNkZWZpbmUgQ0ZHX1NUQVRfQ05UX0xPX01BU0sgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBDRkdfU1RBVF9DTlRfSElfTUFTSyAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIENGR19TVEFUX0NOVF9ISV9JTkNSICAgICAgIDB4MDAwMTAwMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDRkcgZnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitleHRlcm4gdm9pZCBjZmdTZW5kSG9zdE1zZyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRBTklfVTMyLCB0QU5JX1UzMiwgdEFOSV9VMzIqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKworCisKKworCisKKyNlbmRpZiAvKiBfX0NGR1BSSVZfSCAqLworCisKKworCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvY2ZnL2NmZ1Byb2NNc2cuYyBiL0NPUkUvTUFDL3NyYy9jZmcvY2ZnUHJvY01zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5M2JmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvY2ZnL2NmZ1Byb2NNc2cuYwpAQCAtMCwwICsxLDEwNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQ0ZHIGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyBob3N0IG1lc3NhZ2VzLgorICoKKyAqIEF1dGhvcjogICAgICBLZXZpbiBOZ3V5ZW4KKyAqIERhdGU6ICAgICAgICAwNC8wOS8wMgorICogSGlzdG9yeTotCisgKiAwNC8wOS8wMiAgICAgICAgQ3JlYXRlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJwYWxUeXBlcy5oIgorI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgImNmZ1ByaXYuaCIKKyNpbmNsdWRlICJjZmdEZWJ1Zy5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIFByb2NEbmxkUnNwICAgICAgICAodHBBbmlTaXJHbG9iYWwsIHRBTklfVTE2LCB0QU5JX1UzMiopOworc3RhdGljIHZvaWQgUHJvY0dldFJlcSAgICAgICAgICh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRBTklfVTMyKik7CitzdGF0aWMgdm9pZCBQcm9jU2V0UmVxICAgICAgICAgKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdEFOSV9VMzIqKTsKK3N0YXRpYyB2b2lkIFByb2NTZXRSZXFOb1JzcCAgICAodHBBbmlTaXJHbG9iYWwsIHRBTklfVTE2LCB0QU5JX1UzMiopOworCitzdGF0aWMgdEFOSV9VOCBDaGVja1BhcmFtKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdEFOSV9VMzIsIHRBTklfVTMyLCB0QU5JX1UzMiopOworc3RhdGljIHZvaWQgR2V0U3RyVmFsdWUodEFOSV9VOCosIHRBTklfVTgqLCB0QU5JX1UzMik7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBNb2R1bGUgZ2xvYmFsIHZhcmlhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyBDRkcgZnVuY3Rpb24gdGFibGUKK3ZvaWQgICAgKCpnQ2ZnRnVuY1tdKSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRBTklfVTMyKikgPQoreyBQcm9jRG5sZFJzcCwKKyAgICBQcm9jR2V0UmVxLAorICAgIFByb2NTZXRSZXEsCisgICAgUHJvY1NldFJlcU5vUnNwCit9OworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNmZ1Byb2Nlc3NNYk1zZygpCisgKgorICpGVU5DVElPTjoKKyAqIENGRyBtYWlsYm94IG1lc3NhZ2UgcHJvY2Vzc2luZyBmdW5jdGlvbi4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gcE1zZyAgICBNZXNzYWdlIHBvaW50ZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUuCisgKgorICovCit2b2lkCitjZmdQcm9jZXNzTWJNc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1iTXNnICpwTXNnKQoreworICAgIHRBTklfVTE2ICAgIGluZGV4OworICAgIHRBTklfVTE2ICAgIGxlbjsKKyAgICB0QU5JX1UzMiAgICpwUGFyYW07CisKKyAgICAvLyBVc2UgdHlwZVs3OjBdIGFzIGluZGV4IHRvIGZ1bmN0aW9uIHRhYmxlCisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9MSU5VWCkKKyAgICBpbmRleCA9IENGR19HRVRfRlVOQ19JTkRYKHNpclJlYWRVMTZOKCh0QU5JX1U4KilwTXNnKSk7CisjZWxzZQorICAgIGluZGV4ID0gQ0ZHX0dFVF9GVU5DX0lORFgocE1zZy0+dHlwZSk7CisjZW5kaWYKKworICAgIGlmIChpbmRleCA+PSAoc2l6ZW9mKGdDZmdGdW5jKSAvIHNpemVvZihnQ2ZnRnVuY1swXSkpKQorICAgICAgICByZXR1cm47CisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9MSU5VWCkKKyAgICBsZW4gICAgPSBzaXJSZWFkVTE2TigodEFOSV9VOCopcE1zZysyKSAtIFdOSV9DRkdfTUJfSERSX0xFTjsKKyNlbHNlCisgICAgbGVuICAgID0gcE1zZy0+bXNnTGVuIC0gV05JX0NGR19NQl9IRFJfTEVOOworI2VuZGlmCisgICAgcFBhcmFtID0gKCh0QU5JX1UzMiopcE1zZykgKyAxOworCisgICAgLy8gQ2FsbCBwcm9jZXNzaW5nIGZ1bmN0aW9uCisgICAgZ0NmZ0Z1bmNbaW5kZXhdKHBNYWMsIGxlbiwgcFBhcmFtKTsKKworICAgIC8vIEZyZWUgdXAgYnVmZmVyCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQqKXBNc2cpOworCit9IC8qKiogZW5kIGNmZ1Byb2Nlc3NNYk1zZygpICoqKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcm9jRG5sZFJzcCgpCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBDRkdfRE5MRF9SU1AgbWVzc2FnZSBmcm9tIGhvc3QuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gbGVuZ3RoOiAgbWVzc2FnZSBsZW5ndGgKKyAqIEBwYXJhbSBwUGFyYW06ICBwYXJhbWV0ZXIgbGlzdCBwb2ludGVyCisgKgorICogQHJldHVybiBOb25lCisgKgorICovCitzdGF0aWMgdm9pZAorUHJvY0RubGRSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgbGVuZ3RoLCB0QU5JX1UzMiAqcFBhcmFtKQoreworICAgIHRBTklfUzMyICAgIGk7CisgICNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgdEFOSV9VMzIgYXA7CisgICNlbmRpZgorCisgICAgdEFOSV9VMzIgICAgZXhwTGVuLCByZXRWYWwsIGJ1ZlN0YXJ0LCBidWZFbmQ7CisgICAgdEFOSV9VMzIgICAgKnBTcmMsICpwRHN0LCAqcERzdEVuZDsKKyAgICB0QU5JX1UzMiAgICBzdHJTaXplLCBqOworICAgIHRBTklfVTggICAgIHBTdHJbQ0ZHX01BWF9TVFJfTEVOXTsKKyAgICB0cENmZ0JpbkhkciBwSGRyOworICAgIHRBTklfVTMyICAgIGxvZ0xldmVsOworICAgIHRTaXJNc2dRICAgIG1taE1zZzsKKworICAgIC8vIEZpcnN0IER3b3JkIG11c3QgY29udGFpbiB0aGUgQVAgb3IgU1RBIG1hZ2ljIGR3b3JkCisgICAgUEVMT0dXKGNmZ0xvZyhwTWFjLCBMT0dXLCBGTCgiQ0ZHIHNpemUgJWQgYnl0ZXMgTUFHSUMgZHdvcmQgaXMgMHgleFxuIiksCisgICAgICAgICAgIGxlbmd0aCwgc2lyUmVhZFUzMk4oKHRBTklfVTgqKXBQYXJhbSkgKTspCisKKyAgICAvLyBpZiB0aGUgc3RyaW5nIGlzIG5vdCBjb3JyZWN0LCByZXR1cm4gZmFpbHVyZQorI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX0xJTlVYKSB8fCBkZWZpbmVkKEFOSV9PU19UWVBFX09TWCkKKyAgICBpZiAoc2lyUmVhZFUzMk4oKHRBTklfVTgqKXBQYXJhbSkgPT0gQ0ZHX0FQX01BR0lDX0RXT1JEKQorI2Vsc2UKKyAgICBpZiAoKnBQYXJhbSA9PSBDRkdfQVBfTUFHSUNfRFdPUkQpCisjZW5kaWYKKyAgICAgICAgYXAgPSAxOworICAgIGVsc2UKKworCisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9MSU5VWCkgfHwgZGVmaW5lZChBTklfT1NfVFlQRV9PU1gpCisgICAgICAgIGlmIChzaXJSZWFkVTMyTigodEFOSV9VOCopcFBhcmFtKSA9PSBDRkdfU1RBX01BR0lDX0RXT1JEKQorI2Vsc2UKKyAgICAgICAgaWYgKCpwUGFyYW0gPT0gQ0ZHX1NUQV9NQUdJQ19EV09SRCkKKyNlbmRpZgorCisgICAgICAgIGFwID0gMDsKKyNlbHNlIC8qIEFOSV9QUk9EVUNUX1RZUEVfQVAqLworICAgICAgICBpZiAoKnBQYXJhbSA9PSBDRkdfU1RBX01BR0lDX0RXT1JEKSB7fQorCisjZW5kaWYvKiBBTklfUFJPRFVDVF9UWVBFX0FQKi8KKworCisKKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIG1hZ2ljIGR3b3JkIDB4JXhcbiIpLHNpclJlYWRVMzJOKCh0QU5JX1U4KilwUGFyYW0pICk7KQorICAgICAgICByZXRWYWwgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBwUGFyYW0rKzsKKyAgICBsZW5ndGggLT0gNDsKKworICAgIC8vIFZlcmlmeSBtZXNzYWdlIGxlbmd0aAorI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICBpZiAoYXApCisgICAgeworICAgICAgICBwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplID0gQ0ZHX0FQX0lCVUZfTUFYX1NJWkU7CisgICAgICAgIHBNYWMtPmNmZy5nQ2ZnTWF4U0J1ZlNpemUgPSBDRkdfQVBfU0JVRl9NQVhfU0laRTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKSAqLworICAgIHsKKyAgICAgICAgcE1hYy0+Y2ZnLmdDZmdNYXhJQnVmU2l6ZSA9IENGR19TVEFfSUJVRl9NQVhfU0laRTsKKyAgICAgICAgcE1hYy0+Y2ZnLmdDZmdNYXhTQnVmU2l6ZSA9IENGR19TVEFfU0JVRl9NQVhfU0laRTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSB0aGUgQ2ZnIGhlYWRlcgorI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfTElOVVgpIHx8IGRlZmluZWQoQU5JX09TX1RZUEVfT1NYKQorICAgIHRDZmdCaW5IZHIgaGRyOworCisgICAgaGRyLmhkckluZm8gICAgID0gc2lyUmVhZFUzMk4oKHRBTklfVTgqKXBQYXJhbSk7IHBQYXJhbSsrOworICAgIGhkci5jb250cm9sU2l6ZSA9IHNpclJlYWRVMzJOKCh0QU5JX1U4KilwUGFyYW0pOyBwUGFyYW0rKzsKKyAgICBoZHIuaUJ1ZlNpemUgICAgPSBzaXJSZWFkVTMyTigodEFOSV9VOCopcFBhcmFtKTsgcFBhcmFtKys7CisgICAgaGRyLnNCdWZTaXplICAgID0gc2lyUmVhZFUzMk4oKHRBTklfVTgqKXBQYXJhbSk7IHBQYXJhbSsrOworICAgIHBIZHI9JmhkcjsKKyNlbHNlCisgICAgcEhkciA9ICh0cENmZ0JpbkhkcikgcFBhcmFtOworICAgIHBQYXJhbSArPSAoc2l6ZW9mKHRDZmdCaW5IZHIpID4+IDIpOworI2VuZGlmCisgICAgUEVMT0dXKGNmZ0xvZyhwTWFjLCBMT0dXLCBGTCgiQ0ZHIGhkciB0b3RQYXJhbXMgJWQgaW50UGFyYW1zICVkIHN0ckJ1ZlNpemUgJWQvJWRcbiIpLAorICAgICAgICAgICBwSGRyLT5jb250cm9sU2l6ZSwgcEhkci0+aUJ1ZlNpemUsIHBIZHItPnNCdWZTaXplLCBwTWFjLT5jZmcuZ0NmZ01heFNCdWZTaXplKTspCisKKyAgICBleHBMZW4gPSAoKENGR19QQVJBTV9NQVhfTlVNICsgMyAqIHBNYWMtPmNmZy5nQ2ZnTWF4SUJ1ZlNpemUpIDw8IDIpICsKKyAgICAgICAgICAgICBwSGRyLT5zQnVmU2l6ZSArIHNpemVvZih0Q2ZnQmluSGRyKTsKKworICAgIGlmIChsZW5ndGggIT0gZXhwTGVuKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiPENGRz4gRE5MRF9SU1AgaW52YWxpZCBsZW5ndGggJWQgKGV4cCAlZClcbiIpLAorICAgICAgICAgICAgICAgbGVuZ3RoLCBleHBMZW4pOykKKyAgICAgICAgcmV0VmFsID0gV05JX0NGR19JTlZBTElEX0xFTjsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisKKyAgICBpZiAocEhkci0+Y29udHJvbFNpemUgIT0gQ0ZHX1BBUkFNX01BWF9OVU0pCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCI8Q0ZHPiBUb3RhbCBwYXJhbWV0ZXIgY291bnQgbWlzbWF0Y2hcbiIpKTspCisgICAgICAgIHJldFZhbCA9IFdOSV9DRkdfSU5WQUxJRF9MRU47CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmIChwSGRyLT5pQnVmU2l6ZSAhPSBwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiPENGRz4gSW50ZWdlciBwYXJhbWV0ZXIgY291bnQgbWlzbWF0Y2hcbiIpKTspCisgICAgICAgIHJldFZhbCA9IFdOSV9DRkdfSU5WQUxJRF9MRU47CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8vIENvcHkgY29udHJvbCBhcnJheQorICAgIHBEc3QgPSAodEFOSV9VMzIqKXBNYWMtPmNmZy5nQ2ZnRW50cnk7CisgICAgcERzdEVuZCA9IHBEc3QgKyBDRkdfUEFSQU1fTUFYX05VTTsKKyAgICBwU3JjID0gcFBhcmFtOworICAgIHdoaWxlIChwRHN0IDwgcERzdEVuZCkKKyAgICB7CisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9MSU5VWCkgfHwgZGVmaW5lZChBTklfT1NfVFlQRV9PU1gpCisgICAgICAgICpwRHN0KysgPSBzaXJSZWFkVTMyTigodEFOSV9VOCopcFNyYyk7CisgICAgICAgIHBTcmMrKzsKKyNlbHNlCisgICAgICAgICpwRHN0KysgPSAqcFNyYysrOworI2VuZGlmCisgICAgfQorICAgIC8vIENvcHkgZGVmYXVsdCB2YWx1ZXMKKyAgICBwRHN0ID0gcE1hYy0+Y2ZnLmdDZmdJQnVmOworICAgIHBEc3RFbmQgPSBwRHN0ICsgcE1hYy0+Y2ZnLmdDZmdNYXhJQnVmU2l6ZTsKKyAgICB3aGlsZSAocERzdCA8IHBEc3RFbmQpCisgICAgeworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfTElOVVgpIHx8IGRlZmluZWQoQU5JX09TX1RZUEVfT1NYKQorICAgICAgICAqcERzdCsrID0gc2lyUmVhZFUzMk4oKHRBTklfVTgqKXBTcmMpOworICAgICAgICBwU3JjKys7CisjZWxzZQorICAgICAgICAqcERzdCsrID0gKnBTcmMrKzsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIENvcHkgbWluIHZhbHVlcworICAgIHBEc3QgPSBwTWFjLT5jZmcuZ0NmZ0lCdWZNaW47CisgICAgcERzdEVuZCA9IHBEc3QgKyBwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplOworICAgIHdoaWxlIChwRHN0IDwgcERzdEVuZCkKKyAgICB7CisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9MSU5VWCkgfHwgZGVmaW5lZChBTklfT1NfVFlQRV9PU1gpCisgICAgICAgICpwRHN0KysgPSBzaXJSZWFkVTMyTigodEFOSV9VOCopcFNyYyk7CisgICAgICAgIHBTcmMrKzsKKyNlbHNlCisgICAgICAgICpwRHN0KysgPSAqcFNyYysrOworI2VuZGlmCisgICAgfQorCisgICAgLy8gQ29weSBtYXggdmFsdWVzCisgICAgcERzdCA9IHBNYWMtPmNmZy5nQ2ZnSUJ1Zk1heDsKKyAgICBwRHN0RW5kID0gcERzdCArIHBNYWMtPmNmZy5nQ2ZnTWF4SUJ1ZlNpemU7CisgICAgd2hpbGUgKHBEc3QgPCBwRHN0RW5kKQorICAgIHsKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX0xJTlVYKSB8fCBkZWZpbmVkKEFOSV9PU19UWVBFX09TWCkKKyAgICAgICAgKnBEc3QrKyA9IHNpclJlYWRVMzJOKCh0QU5JX1U4KilwU3JjKTsKKyAgICAgICAgcFNyYysrOworI2Vsc2UKKyAgICAgICAgKnBEc3QrKyA9ICpwU3JjKys7CisjZW5kaWYKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplOyBpKyspCisgICAgICAgIGlmIChwTWFjLT5jZmcuZ0NmZ0lCdWZbaV0gPCBwTWFjLT5jZmcuZ0NmZ0lCdWZNaW5baV0gfHwKKyAgICAgICAgICAgIHBNYWMtPmNmZy5nQ2ZnSUJ1ZltpXSA+IHBNYWMtPmNmZy5nQ2ZnSUJ1Zk1heFtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiY2ZnIGlkICVkIEludmFsaWQgZGVmIHZhbHVlICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluICVkIG1heCAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgaSwgcE1hYy0+Y2ZnLmdDZmdJQnVmW2ldLCBwTWFjLT5jZmcuZ0NmZ0lCdWZNaW5baV0sCisgICAgICAgICAgICAgICAgICAgcE1hYy0+Y2ZnLmdDZmdJQnVmTWF4W2ldKTspCisgICAgICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSBtYXggc3RyaW5nIGJ1ZmZlciBsZW5ndGhzIGZvciBhbGwgc3RyaW5nIHBhcmFtZXRlcnMKKyAgICBidWZFbmQgPSBwTWFjLT5jZmcuZ0NmZ01heFNCdWZTaXplOworICAgIGZvciAoaSA9IENGR19QQVJBTV9NQVhfTlVNIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgICBpZiAoKHBNYWMtPmNmZy5nQ2ZnRW50cnlbaV0uY29udHJvbCAmIENGR19DVExfSU5UKSAhPSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKChwTWFjLT5jZmcuZ0NmZ0VudHJ5W2ldLmNvbnRyb2wgJiBDRkdfQ1RMX1ZBTElEKSA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYnVmU3RhcnQgPSBwTWFjLT5jZmcuZ0NmZ0VudHJ5W2ldLmNvbnRyb2wgJiBDRkdfQlVGX0lORFhfTUFTSzsKKyAgICAgICAgcE1hYy0+Y2ZnLmdDZmdTQnVmW2J1ZlN0YXJ0XSA9ICh0QU5JX1U4KShidWZFbmQgLSBidWZTdGFydCAtIDIpOworCisgICAgICAgUEVMT0cxKGNmZ0xvZyhwTWFjLCBMT0cxLCBGTCgiaWQgJWQgbWF4ICVkIGJ1ZlN0YXJ0ICVkIGJ1ZkVuZCAlZFxuIiksCisgICAgICAgICAgICAgICBpLCBwTWFjLT5jZmcuZ0NmZ1NCdWZbYnVmU3RhcnRdLCBidWZTdGFydCwgYnVmRW5kKTspCisKKyAgICAgICAgYnVmRW5kID0gYnVmU3RhcnQ7CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBzdHJpbmcgZGVmYXVsdHMKKyAgICBzdHJTaXplID0gcEhkci0+c0J1ZlNpemU7CisgICAgd2hpbGUgKHN0clNpemUpCisgICAgeworICAgICAgICB0QU5JX1UzMiBwYXJhbUlkLCBwYXJhbUxlbiwgcGFyYW1MZW5DZWlsNDsKKworICAgICAgICBpZiAoc3RyU2l6ZSA8IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoIkVycm9yIHBhcnNpbmcgc3RyIGRlZmF1bHRzLCByZW0gJWQgYnl0ZXNcbiIpLCBzdHJTaXplKTspCisgICAgICAgICAgICByZXRWYWwgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX0xJTlVYKSB8fCBkZWZpbmVkKEFOSV9PU19UWVBFX09TWCkKKyAgICAgICAgcGFyYW1JZCA9IHNpclJlYWRVMzJOKCh0QU5JX1U4KilwU3JjKSA+PiAxNjsKKyAgICAgICAgcGFyYW1MZW4gPSBzaXJSZWFkVTMyTigodEFOSV9VOCopcFNyYykgJiAweGZmOworI2Vsc2UKKyAgICAgICAgcGFyYW1JZCA9ICpwU3JjID4+IDE2OworICAgICAgICBwYXJhbUxlbiA9ICpwU3JjICYgMHhmZjsKKyNlbmRpZgorICAgICAgICBwU3JjKys7CisgICAgICAgIHN0clNpemUgLT0gNDsKKworICAgICAgICBwYXJhbUxlbkNlaWw0ID0gKChwYXJhbUxlbiArIDMpID4+IDIpOworICAgICAgICBpZiAoc3RyU2l6ZSA8IHBhcmFtTGVuQ2VpbDQgPDwgMikKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiRXJyb3IgcGFyc2luZyBzdHIgZGVmYXVsdHMsIHJlbSAlZCBieXRlc1xuIiksIHN0clNpemUpOykKKyAgICAgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoInBhcmFtIGlkICVkIGxlbiAlZCBieXRlc1xuIiksIHBhcmFtSWQsIHBhcmFtTGVuKTspCisgICAgICAgICAgICByZXRWYWwgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqPTA7IGogPCBwYXJhbUxlbkNlaWw0OyBqKyspCisgICAgICAgIHsKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX0xJTlVYKSB8fCBkZWZpbmVkKEFOSV9PU19UWVBFX09TWCkKKyAgICAgICAgICAgIHBTdHJbNCpqXSAgID0gKHRBTklfVTgpICgoc2lyUmVhZFUzMk4oKHRBTklfVTgqKXBTcmMpID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgcFN0cls0KmorMV0gPSAodEFOSV9VOCkgKChzaXJSZWFkVTMyTigodEFOSV9VOCopcFNyYykgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICBwU3RyWzQqaisyXSA9ICh0QU5JX1U4KSAoKHNpclJlYWRVMzJOKCh0QU5JX1U4KilwU3JjKSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgcFN0cls0KmorM10gPSAodEFOSV9VOCkgKHNpclJlYWRVMzJOKCh0QU5JX1U4KilwU3JjKSAmIDB4ZmYpOworI2Vsc2UKKyAgICAgICAgICAgIHBTdHJbNCpqXSA9ICh0QU5JX1U4KSAoKnBTcmMgPj4gMjQpICYgMHhmZjsKKyAgICAgICAgICAgIHBTdHJbNCpqKzFdID0gKHRBTklfVTgpICgqcFNyYyA+PiAxNikgJiAweGZmOworICAgICAgICAgICAgcFN0cls0KmorMl0gPSAodEFOSV9VOCkgKCpwU3JjID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIHBTdHJbNCpqKzNdID0gKHRBTklfVTgpICgqcFNyYykgJiAweGZmOworI2VuZGlmCisKKyAgICAgICAgICAgIHBTcmMrKzsKKyAgICAgICAgICAgIHN0clNpemUgLT0gNDsKKyAgICAgICAgfQorCisgICAgICAgIFBFTE9HMShjZmdMb2cocE1hYywgTE9HMSwgRkwoInNldCBzdHIgaWQgJWQgbGVuICVkXG4iKSwgcGFyYW1JZCwgcGFyYW1MZW4pOykKKworICAgICAgICBpZiAoY2ZnU2V0U3RyKHBNYWMsICh0QU5JX1UxNikgcGFyYW1JZCwgcFN0ciwgcGFyYW1MZW4pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiRXJyb3Igc2V0dGluZyBzdHIgZGVmYXVsdCBwYXJhbSAlZCBsZW4gJWRcbiIpLCBwYXJhbUlkLCBwYXJhbUxlbik7KQorICAgICAgICAgICAgcmV0VmFsID0gV05JX0NGR19JTlZBTElEX0xFTjsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBkZWZhdWx0IGxvZyBsZXZlbCBiYXNlZCBvbiBjb25maWcKKyAgICB3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0xPR19MRVZFTCwgJmxvZ0xldmVsKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9HX0VOVFJZX05VTTsgaSsrKQorI2lmZGVmIExYNTI4MAorICAgICAgICBwTWFjLT51dGlscy5nTG9nRXZ0TGV2ZWxbaV0gPSBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbaV0gPSBMT0dFOworI2Vsc2UKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX1dJTkNFKQorICAgICAgICBwTWFjLT51dGlscy5nTG9nRXZ0TGV2ZWxbaV0gPSBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbaV0gPSBMT0dFOworI2Vsc2UgLy8jaWYgZGVmaW5lZChBTklfT1NfVFlQRV9XSU5DRSkKKyAgICAgICAgcE1hYy0+dXRpbHMuZ0xvZ0V2dExldmVsW2ldID0gcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW2ldID0gbG9nTGV2ZWw7CisjZW5kaWYgLy8jaWYgZGVmaW5lZChBTklfT1NfVFlQRV9XSU5DRSkKKyNlbmRpZgorCisgICAgLy8gU2V0IHN0YXR1cyB0byBSRUFEWQorICAgIHBNYWMtPmNmZy5nQ2ZnU3RhdHVzID0gQ0ZHX1NVQ0NFU1M7CisgICAgcmV0VmFsID0gV05JX0NGR19TVUNDRVNTOworICAgIFBFTE9HMShjZmdMb2cocE1hYywgTE9HMSwgIjxDRkc+IENvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiIpOykKKworICAgIGVuZDoKKworICAgIGlmICggcmV0VmFsICE9IFdOSV9DRkdfU1VDQ0VTUyApCisgICAgICAgIHBNYWMtPmNmZy5nQ2ZnU3RhdHVzID0gQ0ZHX0ZBSUxVUkU7CisKKyAgICAvLyBTZW5kIHJlc3BvbnNlIG1lc3NhZ2UgdG8gaG9zdAorI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfTElOVVgpCisgICAgc2lyU3RvcmVVMzJOKCh0QU5JX1U4ICopICYocE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19ETkxEX0NORl9SRVNdKSwgIHJldFZhbCk7CisjZWxzZQorICAgIHBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfRE5MRF9DTkZfUkVTXSA9IHJldFZhbDsKKyNlbmRpZgorICAgIGNmZ1NlbmRIb3N0TXNnKHBNYWMsIFdOSV9DRkdfRE5MRF9DTkYsIFdOSV9DRkdfRE5MRF9DTkZfTEVOLAorICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfRE5MRF9DTkZfTlVNLCBwTWFjLT5jZmcuZ1BhcmFtTGlzdCwgMCwgMCk7CisKKyAgICAvLyBOb3RpZnkgV0RBIHRoYXQgdGhlIGNvbmZpZyBoYXMgZG93bmxvYWRlZAorICAgIG1taE1zZy50eXBlID0gU0lSX0NGR19ET1dOTE9BRF9DT01QTEVURV9JTkQ7CisgICAgbW1oTXNnLmJvZHlwdHIgPSBOVUxMOworICAgIG1taE1zZy5ib2R5dmFsID0gMDsKKworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICAgaWYgKHdkYVBvc3RDdHJsTXNnKHBNYWMsICZtbWhNc2cpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoIldEQVBvc3RNc2dBcGkgZmFpbGVkIVxuIikpOykKKyAgICB9CisKK30gLyoqKiBlbmQgcHJvY0RubGRSc3AoKSAqKiovCisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcm9jR2V0UmVxKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIENGR19HRVRfUkVRIG1lc3NhZ2UgZnJvbSBob3N0LgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKiBGb3IgZXZlcnkgcGFyYW1ldGVyIElEIHNwZWNpZmllZCBvbiB0aGUgbGlzdCwgQ0ZHIHdpbGwgc2VuZCBhIHNlcGFyYXRlCisgKiBDRkdfR0VUX1JTUCBiYWNrIHRvIGhvc3QuCisgKgorICogQHBhcmFtIGxlbmd0aDogIG1lc3NhZ2UgbGVuZ3RoCisgKiBAcGFyYW0gcFBhcmFtOiAgcGFyYW1ldGVyIGxpc3QgcG9pbnRlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICoKKyAqLworc3RhdGljIHZvaWQKK1Byb2NHZXRSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgbGVuZ3RoLCB0QU5JX1UzMiAqcFBhcmFtKQoreworICAgIHRBTklfVTE2ICAgIGNmZ0lkLCBpOworICAgIHRBTklfVTMyICAgIHZhbHVlLCB2YWx1ZUxlbiwgcmVzdWx0OworICAgIHRBTklfVTMyICAgICpwVmFsdWU7CisKKyAgICBQRUxPRzEoY2ZnTG9nKHBNYWMsIExPRzEsIEZMKCJSY3ZkIGNmZyBnZXQgcmVxdWVzdCAlZCBieXRlc1xuIiksIGxlbmd0aCk7KQorICAgIGZvciAoaT0wOyBpPGxlbmd0aC80OyBpKyspCisgICAgICAgIFBFTE9HMihjZmdMb2cocE1hYywgTE9HMiwgRkwoIlslMmRdIDB4JTA4eFxuIiksIGksIHBQYXJhbVtpXSk7KQorCisgICAgaWYgKCFwTWFjLT5jZmcuZ0NmZ1N0YXR1cykKKyAgICB7CisgICAgICAgIGNmZ0lkID0gKHRBTklfVTE2KXNpclJlYWRVMzJOKCh0QU5JX1U4KilwUGFyYW0pOworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJDRkcgbm90IHJlYWR5LCBwYXJhbSAlZFxuIiksIGNmZ0lkKTspCisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9MSU5VWCkgfHwgZGVmaW5lZChBTklfT1NfVFlQRV9PU1gpCisgICAgICAgIHNpclN0b3JlVTMyTigodEFOSV9VOCAqKSAmKHBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfR0VUX1JTUF9SRVNdKSwKKyAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfTk9UX1JFQURZKTsKKyAgICAgICAgc2lyU3RvcmVVMzJOKCh0QU5JX1U4ICopICYocE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19HRVRfUlNQX1BJRF0pLAorICAgICAgICAgICAgICAgICAgICAgY2ZnSWQpOworICAgICAgICBzaXJTdG9yZVUzMk4oKHRBTklfVTggKikgJihwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX0dFVF9SU1BfUExFTl0pLAorICAgICAgICAgICAgICAgICAgICAgMCk7CisjZWxzZQorICAgICAgICBwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX0dFVF9SU1BfUkVTXSAgPSBXTklfQ0ZHX05PVF9SRUFEWTsKKyAgICAgICAgcE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19HRVRfUlNQX1BJRF0gID0gY2ZnSWQ7CisgICAgICAgIHBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfR0VUX1JTUF9QTEVOXSA9IDA7CisjZW5kaWYKKyAgICAgICAgY2ZnU2VuZEhvc3RNc2cocE1hYywgV05JX0NGR19HRVRfUlNQLCBXTklfQ0ZHX0dFVF9SU1BfUEFSVElBTF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfR0VUX1JTUF9OVU0sIHBNYWMtPmNmZy5nUGFyYW1MaXN0LCAwLCAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gUHJvY2VzcyBhbGwgcGFyYW1ldGVyIElEJ3Mgb24gdGhlIGxpc3QKKyAgICAgICAgd2hpbGUgKGxlbmd0aCA+PSBzaXplb2YodEFOSV9VMzIpKQorICAgICAgICB7CisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9MSU5VWCkKKyAgICAgICAgICAgIGNmZ0lkID0gKHRBTklfVTE2KXNpclJlYWRVMzJOKCh0QU5JX1U4KikgcFBhcmFtKTsgcFBhcmFtKys7CisjZWxzZQorICAgICAgICAgICAgY2ZnSWQgPSAodEFOSV9VMTYpKnBQYXJhbSsrOworI2VuZGlmCisgICAgICAgICAgICBwVmFsdWUgICA9IDA7CisgICAgICAgICAgICB2YWx1ZUxlbiA9IDA7CisKKyAgICAgICAgICAgIFBFTE9HMShjZmdMb2cocE1hYywgTE9HMSwgRkwoIkNmZyBnZXQgcGFyYW0gJWRcbiIpLCBjZmdJZCk7KQorCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgdmFsaWQgcGFyYW1ldGVyIElELCBldGMuLi4KKyAgICAgICAgICAgIGlmIChDaGVja1BhcmFtKHBNYWMsIGNmZ0lkLCBDRkdfQ1RMX1JFLCBXTklfQ0ZHX1dPX1BBUkFNLCAmcmVzdWx0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLmNvbnRyb2wgJiBDRkdfQ1RMX0lOVCkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEdldCBpbnRlZ2VyIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAod2xhbl9jZmdHZXRJbnQocE1hYywgY2ZnSWQsICZ2YWx1ZSkgPT0gZVNJUl9TVUNDRVNTID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfU1VDQ0VTUyA6IFdOSV9DRkdfT1RIRVJfRVJST1IpOworICAgICAgICAgICAgICAgICAgICBwVmFsdWUgICA9ICZ2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVMZW4gPSBzaXplb2YodEFOSV9VMzIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgc3RyaW5nIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICB2YWx1ZUxlbiA9IHNpemVvZihwTWFjLT5jZmcuZ1NCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAod2xhbl9jZmdHZXRTdHIocE1hYywgY2ZnSWQsIHBNYWMtPmNmZy5nU0J1ZmZlciwgJnZhbHVlTGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gZVNJUl9TVUNDRVNTID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfU1VDQ0VTUyA6IFdOSV9DRkdfT1RIRVJfRVJST1IpOworICAgICAgICAgICAgICAgICAgICBwVmFsdWUgPSAodEFOSV9VMzIqKXBNYWMtPmNmZy5nU0J1ZmZlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2hlY2sgcGFyYW0gZmFpbGVkLCBwYXJhbSAlZFxuIiksIGNmZ0lkKTspCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gV05JX0NGR19JTlZBTElEX0xFTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2VuZCByZXNwb25zZSBtZXNzYWdlIHRvIGhvc3QKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX0xJTlVYKQorICAgICAgICAgICAgc2lyU3RvcmVVMzJOKCh0QU5JX1U4ICopICYocE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19HRVRfUlNQX1JFU10pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgICAgICAgICBzaXJTdG9yZVUzMk4oKHRBTklfVTggKikgJihwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX0dFVF9SU1BfUElEXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnSWQpOworICAgICAgICAgICAgc2lyU3RvcmVVMzJOKCh0QU5JX1U4ICopICYocE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19HRVRfUlNQX1BMRU5dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUxlbik7CisjZWxzZQorICAgICAgICAgICAgcE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19HRVRfUlNQX1JFU10gID0gcmVzdWx0OworICAgICAgICAgICAgcE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19HRVRfUlNQX1BJRF0gID0gY2ZnSWQ7CisgICAgICAgICAgICBwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX0dFVF9SU1BfUExFTl0gPSB2YWx1ZUxlbjsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJvdW5kIHVwIGJ1ZmZlciBsZW5ndGggdG8gd29yZC1pbmNyZW1lbnQKKyAgICAgICAgICAgIHZhbHVlTGVuID0gKCgodmFsdWVMZW4gKyAzKSA+PiAyKSA8PCAyKTsKKyAgICAgICAgICAgIGNmZ1NlbmRIb3N0TXNnKHBNYWMsIFdOSV9DRkdfR0VUX1JTUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfR0VUX1JTUF9QQVJUSUFMX0xFTiArIHZhbHVlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19HRVRfUlNQX05VTSwgcE1hYy0+Y2ZnLmdQYXJhbUxpc3QsIHZhbHVlTGVuLCBwVmFsdWUpOworCisgICAgICAgICAgICAvLyBEZWNyZW1lbnQgbGVuZ3RoCisgICAgICAgICAgICBsZW5ndGggLT0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICAgICAgfQorICAgIH0KKworfSAvKioqIGVuZCBwcm9jR2V0UmVxKCkgKioqLworCisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcm9jU2V0UmVxSW50ZXJuYWwoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgQ0ZHX1NFVF9SRVEgbWVzc2FnZSBmcm9tIGhvc3QuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiAtIFRoZSBtZXNzYWdlIGNvbnRlbnQgaXMgY29kZWQgaW4gVExWIGZvcm1hdC4KKyAqIC0gRm9yIHN0cmluZyBwYXJhbWV0ZXIsIHRoZSBsZW5ndGggZmllbGQgaXMgYnl0ZSBhY2N1cmF0ZS4gIEhvd2V2ZXIsCisgKiAgIHRoZSBuZXh0IFRMViBzZXQgd2lsbCBiZWdpbiBvbiB0aGUgbmV4dCB3b3JkIGJvdW5kYXJ5LgorICoKKyAqIE5PVEU6CisgKiAtIEZvciBldmVyeSBwYXJhbWV0ZXIgSUQgc3BlY2lmaWVkIG9uIHRoZSBsaXN0LCBDRkcgd2lsbCBzZW5kIGEgc2VwYXJhdGUKKyAqIENGR19TRVRfUlNQIGJhY2sgdG8gaG9zdC4KKyAqCisgKiBAcGFyYW0gbGVuZ3RoOiAgbWVzc2FnZSBsZW5ndGgKKyAqIEBwYXJhbSBwUGFyYW06ICBwYXJhbWV0ZXIgbGlzdCBwb2ludGVyCisgKiBAcGFyYW0gZlJzcDogd2hldGhlciB0byBzZW5kIHJlc3BvbnNlIHRvIGhvc3QuIFRSVUUgbWVhbnMgc2VuZGluZy4KKyAqIEByZXR1cm4gTm9uZQorICoKKyAqLworc3RhdGljIHZvaWQKK1Byb2NTZXRSZXFJbnRlcm5hbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBsZW5ndGgsIHRBTklfVTMyICpwUGFyYW0sIHRBTklfQk9PTEVBTiBmUnNwKQoreworICAgIHRBTklfVTE2ICAgIGNmZ0lkLCB2YWx1ZUxlbiwgdmFsdWVMZW5Sb3VuZGVkVXA0OworICAgIHRBTklfVTMyICAgIHZhbHVlLCByZXN1bHQ7CisKKyAgICBQRUxPRzEoY2ZnTG9nKHBNYWMsIExPR1csIEZMKCJSY3ZkIGNmZyBzZXQgcmVxdWVzdCAlZCBieXRlc1xuIiksIGxlbmd0aCk7KQorICAgIC8vZm9yIChpPTA7IGk8bGVuZ3RoLzQ7IGkrKykKKyAgICAgIC8vICBQRUxPRzIoY2ZnTG9nKHBNYWMsIExPRzIsIEZMKCJbJTJkXSAweCUwOHhcbiIpLCBpLCBwUGFyYW1baV0pOykKKworICAgIGlmICghcE1hYy0+Y2ZnLmdDZmdTdGF0dXMpCisgICAgeworICAgICAgICBjZmdJZCA9ICh0QU5JX1UxNilzaXJSZWFkVTMyTigodEFOSV9VOCopcFBhcmFtKTsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiQ0ZHIG5vdCByZWFkeSwgcGFyYW0gJWRcbiIpLCBjZmdJZCk7KQorI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfTElOVVgpIHx8IGRlZmluZWQoQU5JX09TX1RZUEVfT1NYKQorICAgICAgICBzaXJTdG9yZVUzMk4oKHRBTklfVTggKikgJihwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX1NFVF9DTkZfUkVTXSksCisgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX05PVF9SRUFEWSk7CisgICAgICAgIHNpclN0b3JlVTMyTigodEFOSV9VOCAqKSAmKHBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfU0VUX0NORl9QSURdKSwKKyAgICAgICAgICAgICAgICAgICAgIGNmZ0lkKTsKKyNlbHNlCisgICAgICAgIHBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfU0VUX0NORl9SRVNdID0gV05JX0NGR19OT1RfUkVBRFk7CisgICAgICAgIHBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfU0VUX0NORl9QSURdID0gY2ZnSWQ7CisjZW5kaWYKKyAgICAgICAgaWYoIGZSc3AgKQorICAgICAgICB7CisgICAgICAgICAgIGNmZ1NlbmRIb3N0TXNnKHBNYWMsIFdOSV9DRkdfU0VUX0NORiwgV05JX0NGR19TRVRfQ05GX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19TRVRfQ05GX05VTSwgcE1hYy0+Y2ZnLmdQYXJhbUxpc3QsIDAsIDApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFByb2Nlc3MgYWxsIFRMVnMgaW4gYnVmZmVyCisgICAgICAgIHdoaWxlIChsZW5ndGggPj0gKHNpemVvZih0QU5JX1UzMikgKiAyKSkKKyAgICAgICAgeworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfTElOVVgpCisgICAgICAgICAgICAvLyBHZXQgVFlQRSAoY2ZnSUQpIGFuZCBMRU5HVEggKGxlbmd0aCkKKyAgICAgICAgICAgIGNmZ0lkID0gKHRBTklfVTE2KXNpclJlYWRVMzJOKCh0QU5JX1U4KilwUGFyYW0pO3BQYXJhbSsrOworICAgICAgICAgICAgdmFsdWVMZW4gPSAodEFOSV9VMTYpc2lyUmVhZFUzMk4oKHRBTklfVTgqKXBQYXJhbSk7cFBhcmFtKys7CisjZWxzZQorICAgICAgICAgICAgY2ZnSWQgICAgPSAodEFOSV9VMTYpICpwUGFyYW0rKzsKKyAgICAgICAgICAgIHZhbHVlTGVuID0gKHRBTklfVTE2KSAqcFBhcmFtKys7CisjZW5kaWYKKyAgICAgICAgICAgIGxlbmd0aCAtPSAoc2l6ZW9mKHRBTklfVTMyKSAqIDIpOworICAgICAgICAgICAgLy8gdmFsdWUgbGVuZ3RoIHJvdW5kZWQgdXAgdG8gYSA0IGJ5dGUgbXVsdGlwbGUKKyAgICAgICAgICAgIHZhbHVlTGVuUm91bmRlZFVwNCA9ICgoKHZhbHVlTGVuICsgMykgPj4gMikgPDwgMik7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YWxpZCByZXF1ZXN0IGJlZm9yZSBwcm9jZWVkaW5nCisgICAgICAgICAgICBpZiAoQ2hlY2tQYXJhbShwTWFjLCBjZmdJZCwgQ0ZHX0NUTF9XRSwgV05JX0NGR19ST19QQVJBTSwgJnJlc3VsdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0cxKGNmZ0xvZyhwTWFjLCBMT0dXLCAoY2hhciAqKSBnQ2ZnUGFyYW1OYW1lW2NmZ0lkXSk7KQorICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgaW50ZWdlciBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICBpZiAoKHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLmNvbnRyb2wgJiBDRkdfQ1RMX0lOVCkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCBWQUxVRQorICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVMZW4gIT0gc2l6ZW9mKHRBTklfVTMyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCB2YWx1ZSBsZW5ndGggJWQgaW4gc2V0IHBhcmFtICVkICh0b3QgJWQpXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUxlbiwgY2ZnSWQsIGxlbmd0aCk7KQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gV05JX0NGR19JTlZBTElEX0xFTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX0xJTlVYKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzaXJSZWFkVTMyTigodEFOSV9VOCopIHBQYXJhbSk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAqcFBhcmFtOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPRzEoY2ZnTG9nKHBNYWMsIExPR1csIEZMKCJDZmcgc2V0IGludCAlZCBsZW4gJWQoJWQpIHZhbCAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnSWQsIHZhbHVlTGVuLCB2YWx1ZUxlblJvdW5kZWRVcDQsIHZhbHVlKTspCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoY2ZnU2V0SW50KHBNYWMsIGNmZ0lkLCB2YWx1ZSkgPT0gZVNJUl9TVUNDRVNTID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX1NVQ0NFU1MgOiBXTklfQ0ZHX09USEVSX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gV05JX0NGR19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdOZWVkUmVzdGFydChwTWFjLCBjZmdJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBXTklfQ0ZHX05FRURfUkVTVEFSVCA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ05lZWRSZWxvYWQocE1hYywgY2ZnSWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFdOSV9DRkdfTkVFRF9SRUxPQUQgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBzdHJpbmcgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlTGVuUm91bmRlZFVwNCA+IGxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBzdHJpbmcgbGVuZ3RoICVkIGluIHNldCBwYXJhbSAlZCAodG90ICVkKVxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVMZW4sIGNmZ0lkLCBsZW5ndGgpOykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFdOSV9DRkdfSU5WQUxJRF9MRU47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXRTdHJWYWx1ZSgodEFOSV9VOCopcFBhcmFtLCBwTWFjLT5jZmcuZ1NCdWZmZXIsIHZhbHVlTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShjZmdMb2cocE1hYywgTE9HVywgRkwoIkNmZyBzZXQgc3RyICVkIGxlbiAlZCglZCkgYnl0ZXNcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZ0lkLCB2YWx1ZUxlbiwgdmFsdWVMZW5Sb3VuZGVkVXA0KTspCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoY2ZnU2V0U3RyKHBNYWMsIGNmZ0lkLCBwTWFjLT5jZmcuZ1NCdWZmZXIsIHZhbHVlTGVuKSA9PSBlU0lSX1NVQ0NFU1MgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfU1VDQ0VTUyA6IFdOSV9DRkdfT1RIRVJfRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBXTklfQ0ZHX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ05lZWRSZXN0YXJ0KHBNYWMsIGNmZ0lkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFdOSV9DRkdfTkVFRF9SRVNUQVJUIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnTmVlZFJlbG9hZChwTWFjLCBjZmdJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gV05JX0NGR19ORUVEX1JFTE9BRCA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJDaGVjayBwYXJhbSBmYWlsZWQsIHBhcmFtICVkXG4iKSwgY2ZnSWQpOykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZW5kIGNvbmZpcm0gbWVzc2FnZSB0byBob3N0CisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9MSU5VWCkKKyAgICAgICAgICAgIHNpclN0b3JlVTMyTigodEFOSV9VOCAqKSAmKHBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfU0VUX0NORl9SRVNdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgICAgICAgICAgc2lyU3RvcmVVMzJOKCh0QU5JX1U4ICopICYocE1hYy0+Y2ZnLmdQYXJhbUxpc3RbV05JX0NGR19TRVRfQ05GX1BJRF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNmZ0lkKTsKKyNlbHNlCisgICAgICAgICAgICBwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX1NFVF9DTkZfUkVTXSA9IHJlc3VsdDsKKyAgICAgICAgICAgIHBNYWMtPmNmZy5nUGFyYW1MaXN0W1dOSV9DRkdfU0VUX0NORl9QSURdID0gY2ZnSWQ7CisjZW5kaWYKKyAgICAgICAgICAgIGlmKCBmUnNwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZmdTZW5kSG9zdE1zZyhwTWFjLCBXTklfQ0ZHX1NFVF9DTkYsIFdOSV9DRkdfU0VUX0NORl9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19TRVRfQ05GX05VTSwgcE1hYy0+Y2ZnLmdQYXJhbUxpc3QsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HVyhjZmdMb2coIHBNYWMsIExPR1csICIgIENGR0lEICVkIG5vIHJzcFxuIiwgY2ZnSWQpOykKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZhbHVlTGVuUm91bmRlZFVwNCA+IGxlbmd0aCkKKyAgICAgICAgICAgICAgICBsZW5ndGggPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlbmd0aCAtPSB2YWx1ZUxlblJvdW5kZWRVcDQ7CisgICAgICAgICAgICAgICAgcFBhcmFtICs9ICh2YWx1ZUxlblJvdW5kZWRVcDQgPj4gMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCitzdGF0aWMgdm9pZAorUHJvY1NldFJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBsZW5ndGgsIHRBTklfVTMyICpwUGFyYW0pCit7CisgICAgUHJvY1NldFJlcUludGVybmFsKCBwTWFjLCBsZW5ndGgsIHBQYXJhbSwgZUFOSV9CT09MRUFOX1RSVUUgKTsKK30KKworc3RhdGljIHZvaWQKK1Byb2NTZXRSZXFOb1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBsZW5ndGgsIHRBTklfVTMyICpwUGFyYW0pCit7CisgICAgUHJvY1NldFJlcUludGVybmFsKCBwTWFjLCBsZW5ndGgsIHBQYXJhbSwgZUFOSV9CT09MRUFOX0ZBTFNFICk7Cit9CisKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENoZWNrUGFyYW0oKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrIG9uIGEgcGFyYW1ldGVyLgorICoKKyAqIExPR0lDOgorICogLSAgSWYgY2ZnSWQgaXMgb3V0IG9mIGJvdW5kIG9yIHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIHJlc3VsdAorICogICAgV05JX0NGR19JTlZBTElEX1BJRCBpcyByZXR1cm5lZCBhdCBhZGRyZXNzIHNwZWNpZmllZCBpbiBwUmVzdWx0LgorICoKKyAqIC0gIElmIHNwZWNpZmllZCAnZmxhZycgaXMgbm90IHNldCBpbiB0aGUgcGFyYW1ldGVyIGNvbnRyb2wgZW50cnksCisgKiAgICAnZmFpbGVkUmVzdWx0JyBpcyByZXR1cm5lZCBhdCBhZGRyZXNzIHNwZWNpZmllZCBpbiBwUmVzdWx0LgorICoKKyAqIEFTU1VNUFRJT05TOgorICogU2luY2UgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFsbHksICdwUmVzdWx0JyBpcyBhbHdheXMgdmFsaWQuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gTm9uZQorICoKKyAqIEByZXR1cm4gdHJ1ZTogICBQYXJhbWV0ZXIgaXMgdmFsaWQgYW5kIG1hdGNoZXMgY2hlY2tlZCBjb25kaXRpb24gXG4KKyAqIEByZXR1cm4gZmFsc2U6ICBQYXJhbWV0ZXIgZWl0aGVyIGlzIG5vdCB2YWxpZCBvciBkb2VzIG5vdCBtYXRjaAorICogICAgICAgICAgICAgICAgIGNoZWNrZWQgY29uZGl0aW9uLgorICoKKyAqLworc3RhdGljIHRBTklfVTgKK0NoZWNrUGFyYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgY2ZnSWQsIHRBTklfVTMyIGZsYWcsIHRBTklfVTMyIGZhaWxlZFJlc3VsdCwgdEFOSV9VMzIgKnBSZXN1bHQpCit7CisgICAgLy8gQ2hlY2sgaWYgcGFyYW1ldGVyIElEIGlzIG91dCBvZiBib3VuZAorICAgIGlmIChjZmdJZCA+PSBDRkdfUEFSQU1fTUFYX05VTSkKKyAgICB7CisgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgcGFyYW0gaWQgJWRcbiIpLCBjZmdJZCk7KQorICAgICAgICAqcFJlc3VsdCA9IFdOSV9DRkdfSU5WQUxJRF9QSUQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGlmIHBhcmFtZXRlciBpcyB2YWxpZAorICAgICAgICBpZiAoKHBNYWMtPmNmZy5nQ2ZnRW50cnlbY2ZnSWRdLmNvbnRyb2wgJiBDRkdfQ1RMX1ZBTElEKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJQYXJhbSBpZCAlZCBub3QgdmFsaWRcbiIpLCBjZmdJZCk7KQorICAgICAgICAgICAgKnBSZXN1bHQgPSBXTklfQ0ZHX0lOVkFMSURfUElEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ2hlY2sgY29udHJvbCBmaWVsZCBhZ2FpbnN0IGZsYWcKKyAgICAgICAgICAgIGlmICgocE1hYy0+Y2ZnLmdDZmdFbnRyeVtjZmdJZF0uY29udHJvbCAmIGZsYWcpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiUGFyYW0gaWQgJWQgd3JvbmcgcGVybWlzc2lvbnMgJXhcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICBjZmdJZCwgcE1hYy0+Y2ZnLmdDZmdFbnRyeVtjZmdJZF0uY29udHJvbCk7KQorICAgICAgICAgICAgICAgICpwUmVzdWx0ID0gZmFpbGVkUmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybih0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oZmFsc2UpOworCit9IC8qKiogY2ZnUGFyYW1DaGVjaygpICoqKi8KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdldFN0clZhbHVlKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gY29waWVzIGEgc3RyaW5nIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcEJ1ZjogICAgaW5wdXQgZGF0YSBidWZmZXIKKyAqIEBwYXJhbSBwVmFsdWU6ICBhZGRyZXNzIHdoZXJlIGRhdGEgaXMgcmV0dXJuZWQKKyAqIEBwYXJhbSBsZW5ndGg6ICBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICoKKyAqIEByZXR1cm4gTm9uZQorICoKKyAqLworc3RhdGljIHZvaWQKK0dldFN0clZhbHVlKHRBTklfVTggKnBCdWYsIHRBTklfVTggKnBWYWx1ZSwgdEFOSV9VMzIgbGVuZ3RoKQoreworICAgIHRBTklfVTggICAgICpwRW5kOworCisgICAgcEVuZCA9IHBWYWx1ZSArIGxlbmd0aDsKKyAgICB3aGlsZSAocFZhbHVlIDwgcEVuZCkKKyAgICAgICAgKnBWYWx1ZSsrID0gKnBCdWYrKzsKK30gLyoqKiBlbmQgR2V0U3RyVmFsdWUoKSAqKiovCisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBwcm9jZXNzQ2ZnRG93bmxvYWRSZXEoKQorICoKKyAqIEZVTkNUSU9OOiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIENmZyBEb3dubG9hZCBhbmQgaXMgaW52b2tlZAorICogICAgICAgICAgIG9ubHkgaW4gdGhlIGNhc2Ugb2YgUHJpbWEgb3IgdGhlIEludGVncmF0ZWQgU09DCisgKiAgICAgICAgICAgc29sdXRpb25zLiBOb3QgYXBwbGljYWJsZSB0byBWb2xhbnMgb3IgTGlicmEKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBsZW5ndGg6ICBtZXNzYWdlIGxlbmd0aAorICogQHBhcmFtIHBDb25maWc6ICBwYXJhbWV0ZXIgbGlzdCBwb2ludGVyCisgKgorICogQHJldHVybiBOb25lCisgKgorICovCisKK3ZvaWQKK3Byb2Nlc3NDZmdEb3dubG9hZFJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBsZW5ndGgsIAorICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwQ29uZmlnKQoreworICAgIHRBTklfUzMyICAgIGk7CisKKyAgICB0QU5JX1UzMiAgICBleHBMZW4sIHJldFZhbCwgYnVmU3RhcnQsIGJ1ZkVuZDsKKyAgICB0QU5JX1UzMiAgICAqcFNyYywgKnBEc3QsICpwRHN0RW5kOworICAgIHRBTklfVTMyICAgIHN0clNpemUsIGo7CisgICAgdEFOSV9VOCAgICAgcFN0cltDRkdfTUFYX1NUUl9MRU5dOworICAgIHRwQ2ZnQmluSGRyIHBIZHI7CisgICAgdEFOSV9VMzIgICAgbG9nTGV2ZWw7CisKKyAgICAvLyBGaXJzdCBEd29yZCBtdXN0IGNvbnRhaW4gdGhlIEFQIG9yIFNUQSBtYWdpYyBkd29yZAorICAgIFBFTE9HVyhjZmdMb2cocE1hYywgTE9HVywgRkwoIkNGRyBzaXplICVkIGJ5dGVzIE1BR0lDIGR3b3JkIGlzIDB4JXhcbiIpLAorICAgICAgICAgICBsZW5ndGgsIHNpclJlYWRVMzJOKCh0QU5JX1U4KilwQ29uZmlnKSApOykKKworICAgIC8vIGlmIHRoZSBzdHJpbmcgaXMgbm90IGNvcnJlY3QsIHJldHVybiBmYWlsdXJlCisgICAgaWYgKENGR19TVEFfTUFHSUNfRFdPUkQgIT0gKnBDb25maWcpCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIG1hZ2ljIGR3b3JkIDB4JXhcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lyUmVhZFUzMk4oKHRBTklfVTgqKXBDb25maWcpICk7KQorICAgICAgICByZXRWYWwgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBwQ29uZmlnKys7CisgICAgbGVuZ3RoIC09IDQ7CisKKyAgICAvLyBWZXJpZnkgbWVzc2FnZSBsZW5ndGgKKyAgICBwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplID0gQ0ZHX1NUQV9JQlVGX01BWF9TSVpFOworICAgIHBNYWMtPmNmZy5nQ2ZnTWF4U0J1ZlNpemUgPSBDRkdfU1RBX1NCVUZfTUFYX1NJWkU7CisKKyAgICAvLyBQYXJzZSB0aGUgQ2ZnIGhlYWRlcgorICAgIHBIZHIgPSAodHBDZmdCaW5IZHIpIHBDb25maWc7CisgICAgcENvbmZpZyArPSAoc2l6ZW9mKHRDZmdCaW5IZHIpID4+IDIpOworCisgICAgUEVMT0dXKGNmZ0xvZyhwTWFjLCBMT0dXLCBGTCgiQ0ZHIGhkciB0b3RQYXJhbXMgJWQgaW50UGFyYW1zICVkIHN0ckJ1ZlNpemUgJWQvJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+Y29udHJvbFNpemUscEhkci0+aUJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c0J1ZlNpemUsIHBNYWMtPmNmZy5nQ2ZnTWF4U0J1ZlNpemUpOykKKworICAgIGV4cExlbiA9ICgoQ0ZHX1BBUkFNX01BWF9OVU0gKyAzICogcE1hYy0+Y2ZnLmdDZmdNYXhJQnVmU2l6ZSkgPDwgMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zQnVmU2l6ZSArIHNpemVvZih0Q2ZnQmluSGRyKTsKKworICAgIGlmIChsZW5ndGggIT0gZXhwTGVuKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiPENGRz4gRE5MRF9SU1AgaW52YWxpZCBsZW5ndGggJWQgKGV4cCAlZClcbiIpLAorICAgICAgICAgICAgICAgbGVuZ3RoLCBleHBMZW4pOykKKyAgICAgICAgcmV0VmFsID0gV05JX0NGR19JTlZBTElEX0xFTjsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisKKyAgICBpZiAoQ0ZHX1BBUkFNX01BWF9OVU0gIT0gcEhkci0+Y29udHJvbFNpemUgKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiPENGRz4gVG90YWwgcGFyYW1ldGVyIGNvdW50IG1pc21hdGNoXG4iKSk7KQorICAgICAgICByZXRWYWwgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAocEhkci0+aUJ1ZlNpemUgIT0gcE1hYy0+Y2ZnLmdDZmdNYXhJQnVmU2l6ZSkKKyAgICB7CisgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoIjxDRkc+IEludGVnZXIgcGFyYW1ldGVyIGNvdW50IG1pc21hdGNoXG4iKSk7KQorICAgICAgICByZXRWYWwgPSBXTklfQ0ZHX0lOVkFMSURfTEVOOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICAvLyBDb3B5IGNvbnRyb2wgYXJyYXkKKyAgICBwRHN0ID0gKHRBTklfVTMyKilwTWFjLT5jZmcuZ0NmZ0VudHJ5OworICAgIHBEc3RFbmQgPSBwRHN0ICsgQ0ZHX1BBUkFNX01BWF9OVU07CisgICAgcFNyYyA9IHBDb25maWc7CisgICAgd2hpbGUgKHBEc3QgPCBwRHN0RW5kKQorICAgIHsKKyAgICAgICAgKnBEc3QrKyA9ICpwU3JjKys7CisgICAgfQorCisgICAgLy8gQ29weSBkZWZhdWx0IHZhbHVlcworICAgIHBEc3QgPSBwTWFjLT5jZmcuZ0NmZ0lCdWY7CisgICAgcERzdEVuZCA9IHBEc3QgKyBwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplOworICAgIHdoaWxlIChwRHN0IDwgcERzdEVuZCkKKyAgICB7CisgICAgICAgICpwRHN0KysgPSAqcFNyYysrOworICAgIH0KKworICAgIC8vIENvcHkgbWluIHZhbHVlcworICAgIHBEc3QgPSBwTWFjLT5jZmcuZ0NmZ0lCdWZNaW47CisgICAgcERzdEVuZCA9IHBEc3QgKyBwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplOworICAgIHdoaWxlIChwRHN0IDwgcERzdEVuZCkKKyAgICB7CisgICAgICAgICpwRHN0KysgPSAqcFNyYysrOworICAgIH0KKworICAgIC8vIENvcHkgbWF4IHZhbHVlcworICAgIHBEc3QgPSBwTWFjLT5jZmcuZ0NmZ0lCdWZNYXg7CisgICAgcERzdEVuZCA9IHBEc3QgKyBwTWFjLT5jZmcuZ0NmZ01heElCdWZTaXplOworICAgIHdoaWxlIChwRHN0IDwgcERzdEVuZCkKKyAgICB7CisgICAgICAgICpwRHN0KysgPSAqcFNyYysrOworICAgIH0KKworICAgIGZvciAoaT0wOyBpPHBNYWMtPmNmZy5nQ2ZnTWF4SUJ1ZlNpemU7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwTWFjLT5jZmcuZ0NmZ0lCdWZbaV0gPCBwTWFjLT5jZmcuZ0NmZ0lCdWZNaW5baV0gfHwKKyAgICAgICAgICAgIHBNYWMtPmNmZy5nQ2ZnSUJ1ZltpXSA+IHBNYWMtPmNmZy5nQ2ZnSUJ1Zk1heFtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiY2ZnIGlkICVkIEludmFsaWQgZGVmIHZhbHVlICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiAlZCBtYXggJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBwTWFjLT5jZmcuZ0NmZ0lCdWZbaV0sIHBNYWMtPmNmZy5nQ2ZnSUJ1Zk1pbltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+Y2ZnLmdDZmdJQnVmTWF4W2ldKTspCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgbWF4IHN0cmluZyBidWZmZXIgbGVuZ3RocyBmb3IgYWxsIHN0cmluZyBwYXJhbWV0ZXJzCisgICAgYnVmRW5kID0gcE1hYy0+Y2ZnLmdDZmdNYXhTQnVmU2l6ZTsKKyAgICBmb3IgKGkgPSBDRkdfUEFSQU1fTUFYX05VTSAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgICAgaWYgKChwTWFjLT5jZmcuZ0NmZ0VudHJ5W2ldLmNvbnRyb2wgJiBDRkdfQ1RMX0lOVCkgIT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICgocE1hYy0+Y2ZnLmdDZmdFbnRyeVtpXS5jb250cm9sICYgQ0ZHX0NUTF9WQUxJRCkgPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGJ1ZlN0YXJ0ID0gcE1hYy0+Y2ZnLmdDZmdFbnRyeVtpXS5jb250cm9sICYgQ0ZHX0JVRl9JTkRYX01BU0s7CisgICAgICAgIHBNYWMtPmNmZy5nQ2ZnU0J1ZltidWZTdGFydF0gPSAodEFOSV9VOCkoYnVmRW5kIC0gYnVmU3RhcnQgLSAyKTsKKworICAgICAgICBQRUxPRzEoY2ZnTG9nKHBNYWMsIExPRzEsIEZMKCJpZCAlZCBtYXggJWQgYnVmU3RhcnQgJWQgYnVmRW5kICVkXG4iKSwKKyAgICAgICAgICAgICAgIGksIHBNYWMtPmNmZy5nQ2ZnU0J1ZltidWZTdGFydF0sIGJ1ZlN0YXJ0LCBidWZFbmQpOykKKworICAgICAgICBidWZFbmQgPSBidWZTdGFydDsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIHN0cmluZyBkZWZhdWx0cworICAgIHN0clNpemUgPSBwSGRyLT5zQnVmU2l6ZTsKKyAgICB3aGlsZSAoc3RyU2l6ZSkKKyAgICB7CisgICAgICAgIHRBTklfVTMyIHBhcmFtSWQsIHBhcmFtTGVuLCBwYXJhbUxlbkNlaWw0OworCisgICAgICAgIGlmIChzdHJTaXplIDwgNCkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLCBGTCgiRXJyb3IgcGFyc2luZyBzdHIgZGVmYXVsdHMsIHJlbSAlZCBieXRlc1xuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyU2l6ZSk7KQorICAgICAgICAgICAgcmV0VmFsID0gV05JX0NGR19JTlZBTElEX0xFTjsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIHBhcmFtSWQgPSAqcFNyYyA+PiAxNjsKKyAgICAgICAgcGFyYW1MZW4gPSAqcFNyYyAmIDB4ZmY7CisKKyAgICAgICAgcFNyYysrOworICAgICAgICBzdHJTaXplIC09IDQ7CisKKyAgICAgICAgcGFyYW1MZW5DZWlsNCA9ICgocGFyYW1MZW4gKyAzKSA+PiAyKTsKKyAgICAgICAgaWYgKHN0clNpemUgPCBwYXJhbUxlbkNlaWw0IDw8IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwgRkwoIkVycm9yIHBhcnNpbmcgc3RyIGRlZmF1bHRzLCByZW0gJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXNcbiIpLCBzdHJTaXplKTspCisgICAgICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJwYXJhbSBpZCAlZCBsZW4gJWQgYnl0ZXNcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1JZCwgcGFyYW1MZW4pOykKKyAgICAgICAgICAgIHJldFZhbCA9IFdOSV9DRkdfSU5WQUxJRF9MRU47CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaj0wOyBqIDwgcGFyYW1MZW5DZWlsNDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBwU3RyWzQqal0gPSAodEFOSV9VOCkgKCpwU3JjID4+IDI0KSAmIDB4ZmY7CisgICAgICAgICAgICBwU3RyWzQqaisxXSA9ICh0QU5JX1U4KSAoKnBTcmMgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgIHBTdHJbNCpqKzJdID0gKHRBTklfVTgpICgqcFNyYyA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBwU3RyWzQqaiszXSA9ICh0QU5JX1U4KSAoKnBTcmMpICYgMHhmZjsKKworICAgICAgICAgICAgcFNyYysrOworICAgICAgICAgICAgc3RyU2l6ZSAtPSA0OworICAgICAgICB9CisKKyAgICAgICAgUEVMT0cxKGNmZ0xvZyhwTWFjLCBMT0cxLCBGTCgic2V0IHN0ciBpZCAlZCBsZW4gJWRcbiIpLCBwYXJhbUlkLCBwYXJhbUxlbik7KQorCisgICAgICAgIGlmIChjZmdTZXRTdHJOb3RpZnkocE1hYywgKHRBTklfVTE2KXBhcmFtSWQsIHBTdHIsIHBhcmFtTGVuLCBGQUxTRSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsIEZMKCJFcnJvciBzZXR0aW5nIHN0ciBkZWZhdWx0IHBhcmFtICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZW4gJWRcbiIpLCBwYXJhbUlkLCBwYXJhbUxlbik7KQorICAgICAgICAgICAgcmV0VmFsID0gV05JX0NGR19JTlZBTElEX0xFTjsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBkZWZhdWx0IGxvZyBsZXZlbCBiYXNlZCBvbiBjb25maWcKKyAgICB3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0xPR19MRVZFTCwgJmxvZ0xldmVsKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9HX0VOVFJZX05VTTsgaSsrKQorICAgICAgICBwTWFjLT51dGlscy5nTG9nRXZ0TGV2ZWxbaV0gPSBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbaV0gPSBsb2dMZXZlbDsKKworICAgIC8vIFNldCBzdGF0dXMgdG8gUkVBRFkKKyAgICBwTWFjLT5jZmcuZ0NmZ1N0YXR1cyA9IENGR19TVUNDRVNTOworICAgIHJldFZhbCA9IFdOSV9DRkdfU1VDQ0VTUzsKKyAgICBQRUxPRzEoY2ZnTG9nKHBNYWMsIExPRzEsICI8Q0ZHPiBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTspCisKK2VuZDoKKworICAgIGlmICggV05JX0NGR19TVUNDRVNTICE9IHJldFZhbCApCisgICAgICAgIHBNYWMtPmNmZy5nQ2ZnU3RhdHVzID0gQ0ZHX0ZBSUxVUkU7CisKKyAgICBwTWFjLT5jZmcuZ1BhcmFtTGlzdFtXTklfQ0ZHX0ROTERfQ05GX1JFU10gPSByZXRWYWw7CisKK30gLyoqKiBlbmQgUHJvY2Vzc0Rvd25sb2FkUmVxKCkgKioqLworCisKKworCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvY2ZnL2NmZ1NlbmRNc2cuYyBiL0NPUkUvTUFDL3NyYy9jZmcvY2ZnU2VuZE1zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWQ0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvY2ZnL2NmZ1NlbmRNc2cuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSBmb3IgY29tcG9zaW5nIGFuZCBzZW5kaW5nIG1lc3NhZ2VzCisgKiB0byBob3N0LgorICoKKyAqIEF1dGhvcjogICAgICBLZXZpbiBOZ3V5ZW4KKyAqIERhdGU6ICAgICAgICAwNC8wOS8wMgorICogSGlzdG9yeTotCisgKiAwNC8wOS8wMiAgICAgQ3JlYXRlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJwYWxUeXBlcy5oIgorI2luY2x1ZGUgImNmZ1ByaXYuaCIKKyNpbmNsdWRlICJsaW1UcmFjZS5oIgorI2luY2x1ZGUgImNmZ0RlYnVnLmgiCisKK2V4dGVybiB2b2lkIFN5c1Byb2Nlc3NNbWhNc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EqIHBNc2cpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEFUVEVOVElPTjogIFRoZSBmdW5jdGlvbnMgY29udGFpbmVkIGluIHRoaXMgbW9kdWxlIGFyZSB0byBiZSB1c2VkICAqLworLyogICAgICAgICAgICAgYnkgQ0ZHIG1vZHVsZSBPTkxZLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNmZ1NlbmRIb3N0TXNnKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFNlbmQgQ05GL1JTUCB0byBob3N0LgorICoKKyAqIExPR0lDOgorICogUGxlYXNlIHNlZSBDb25maWd1cmF0aW9uICYgU3RhdGlzdGljIENvbGxlY3Rpb24gTWljcm8tQXJjaGl0ZWN0dXJlCisgKiBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIG1zZ1R5cGU6ICAgICBtZXNzYWdlIHR5cGUKKyAqIEBwYXJhbSBtc2dMZW46ICAgICAgbWVzc2FnZSBsZW5ndGgKKyAqIEBwYXJhbSBwYXJhbU51bTogICAgbnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAqIEBwYXJhbSBwUGFyYW1MaXN0OiAgcG9pbnRlciB0byBwYXJhbWV0ZXIgbGlzdAorICogQHBhcmFtIGRhdGFMZW46ICAgICBkYXRhIGxlbmd0aAorICogQHBhcmFtIHBEYXRhOiAgICAgICBwb2ludGVyIHRvIGFkZGl0aW9uYWwgZGF0YQorICoKKyAqIEByZXR1cm4gTm9uZS4KKyAqCisgKi8KK3ZvaWQKK2NmZ1NlbmRIb3N0TXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IG1zZ1R5cGUsIHRBTklfVTMyIG1zZ0xlbiwgdEFOSV9VMzIgcGFyYW1OdW0sIHRBTklfVTMyICpwUGFyYW1MaXN0LAorICAgICAgICAgICAgICB0QU5JX1UzMiBkYXRhTGVuLCB0QU5JX1UzMiAqcERhdGEpCit7CisgICAgdEFOSV9VMzIgICAgICAgICpwTXNnLCAqcEVuZDsKKyAgICB0U2lyTXNnUSAgICBtbWhNc2c7CisKKyAgICAvLyBzYW5pdHkKKyAgICBpZiAoKHBhcmFtTnVtID4gMCkgJiYgKE5VTEwgPT0gcFBhcmFtTGlzdCkpCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgRkwoInBQYXJhbUxpc3QgTlVMTCB3aGVuIHBhcmFtTnVtIGdyZWF0ZXIgdGhhbiAwISIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKChkYXRhTGVuID4gMCkgJiYgKE5VTEwgPT0gcERhdGEpKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGNmZ0xvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgIEZMKCJwRGF0YSBOVUxMIHdoZW4gZGF0YUxlbiBncmVhdGVyIHRoYW4gMCEiKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgbWVzc2FnZSBidWZmZXIKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIG1zZ0xlbikpCisgICAgeworICAgICAgICBQRUxPR0UoY2ZnTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUhIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEZpbGwgaW4gbWVzc2FnZSBkZXRhaWxzCisgICAgbW1oTXNnLnR5cGUgPSBtc2dUeXBlOworICAgIG1taE1zZy5ib2R5cHRyID0gcE1zZzsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgICAgKCh0U2lyTWJNc2cqKXBNc2cpLT50eXBlICAgPSBtc2dUeXBlOworICAgICgodFNpck1iTXNnKilwTXNnKS0+bXNnTGVuID0gKHRBTklfVTE2KW1zZ0xlbjsKKworICAgIHN3aXRjaCAobXNnVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgV05JX0NGR19HRVRfUlNQOgorICAgICAgICBjYXNlIFdOSV9DRkdfUEFSQU1fVVBEQVRFX0lORDoKKyAgICAgICAgY2FzZSBXTklfQ0ZHX0ROTERfUkVROgorICAgICAgICBjYXNlIFdOSV9DRkdfRE5MRF9DTkY6CisgICAgICAgIGNhc2UgV05JX0NGR19TRVRfQ05GOgorICAgICAgICAgICAgLy8gRmlsbCBpbiBwYXJhbWV0ZXJzCisgICAgICAgICAgICBwTXNnKys7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBwUGFyYW1MaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBFbmQgID0gcE1zZyArIHBhcmFtTnVtOworICAgICAgICAgICAgICAgIHdoaWxlIChwTXNnIDwgcEVuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwTXNnKysgPSAqcFBhcmFtTGlzdCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENvcHkgZGF0YSBpZiB0aGVyZSBpcyBhbnkKKyAgICAgICAgICAgIGlmIChOVUxMICE9IHBEYXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBFbmQgPSBwTXNnICsgKGRhdGFMZW4gPj4gMik7CisgICAgICAgICAgICAgICAgd2hpbGUgKHBNc2cgPCBwRW5kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBNc2crKyA9ICpwRGF0YSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgIFBFTE9HRShjZmdMb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiVW5rbm93biBtc2cgJWQhIiksIChpbnQpIG1zZ1R5cGUpOykKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBNc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNoaXAgaXQKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtbWhNc2cudHlwZSkpOworICAgIFN5c1Byb2Nlc3NNbWhNc2cocE1hYywgJm1taE1zZyk7CisKK30gLyoqKiBlbmQgY2ZnU2VuZEhvc3RNc2coKSAqKiovCisKKworCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9jZmcvY2ZnVXRpbC9jZmcudHh0IGIvQ09SRS9NQUMvc3JjL2NmZy9jZmdVdGlsL2NmZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3MmY5OAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9jZmcvY2ZnVXRpbC9jZmcudHh0CkBAIC0wLDAgKzEsMzk4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyogICAgd25pQ2ZnU3RhLmggICAgIC0gQyBoZWFkZXIgZmlsZSBmb3IgU1RBIG1vZGUgb25seQorKiAgICB3bmlDZmdBcC5oICAgICAgLSBDIGhlYWRlciBmaWxlIGZvciBib3RoIFNUQSBhbmQgQVAKKyogICAgd25pQ2ZnU3RhLmJpbiAgIC0gQ29udHJvbCBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIFNUQSBzeXN0ZW0KKyogICAgd25pQ2ZnQXAuYmluICAgIC0gQ29udHJvbCBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIEFQIHN5c3RlbQorKgorKiBQQVJBTUVURVIgREVTQ1JJUFRJT046CisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgZGVzY3JpcHRpb24gbXVzdCBiZSBvbiBzZXBhcmF0ZSBsaW5lcyBhbmQKKyogZXhhY3RseSBhcyBzcGVjaWZpZWQgYmVsb3cuICBbXSBhcmUgY29tbWVudHMgYW5kIHNob3VsZCBub3QgYmUgaW5jbHVkZWQuCisqCisqICAgICBbQ29tbW9uIGluZm9dICAgIHBhcmFtZXRlcl9uYW1lICAgIHR5cGUgICAgbWF4TGVuICAgIHNlbUluZHgKKyogICAgIFtTVEEgZmxhZ3NdICAgICAgdmFsaWQgICAgUlcgICAgUC9OUCAgICBSRVNUQVJUL1JFTE9BRAorKiAgICAgW1NUQV9OVEZdICAgICAgICBub3RpZmljYXRpb25fbWFzaworKiAgICAgW1NUQSB2YWx1ZXNdICAgICBtaW4gICAgbWF4ICAgIHZhbHVlICBbZm9yIGludGVnZXJdCisqICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCBieXRlMSBieXRlMiAuLi4gW2ZvciBzdHJpbmddCisqICAgICBbQVAgZmxhZ3NdICAgICAgIHZhbGlkICAgIFJXL1JPL1dPICAgIFAvTlAgICAgUkVTVEFSVC9SRUxPQUQKKyogICAgIFtBUF9OVEZdICAgICAgICAgbm90aWZpY2F0aW9uX21hc2sKKyogICAgIFtBUCB2YWx1ZXNdICAgICAgbWluICAgIG1heCAgICB2YWx1ZSAgW2ZvciBpbnRlZ2VyXQorKiAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggYnl0ZTEgYnl0ZTIgLi4uIFtmb3Igc3RyaW5nXQorKgorKiBwYXJhbWV0ZXJfbmFtZToKKyogICAgICAgICBUaGlzIHdpbGwgYmUgdXNlZCBhcyB0aGUgYmFzZSBuYW1lIGZvciBDIG1hY3JvIGRlZmluaXRpb24uCisqICAgICAgICAgVGhlcmVmb3JlLCBDIHN5bnRheCBydWxlIG11c3QgYmUgb2JzZXJ2ZWQuCisqCisqIHR5cGU6CisqICAgICAgICBTcGVjaWZpZXMgcGFyYW1ldGVyIHR5cGUKKyogICAgICAgICAgICBTIC0gdmFyaWFibGUtbGVuZ3RoIHN0cmluZworKiAgICAgICAgICAgIEkgLSBpbnRlZ2VyCisqCisqIG1heExlbjoKKyogICAgICAgIFNwZWNpZmllcyBtYXhpbXVtIHBhcmFtZXRlciBsZW5ndGggaW4gYnl0ZXMuCisqCisqIHNlbUluZHg6CisqICAgICAgICBTcGVjaWZpZXMgc2VtYXBob3JlIGluZGV4IHRvIHVzZSBmb3IgbG9ja2luZyB0aGlzIHBhcmFtZXRlci4KKyogICAgICAgIE1vcmUgdGhhbiBvbmUgcGFyYW1ldGVycyAodGhvc2UgYmVsb25naW5nIHRvIHRoZSBzYW1lIGdyb3VwKQorKiAgICAgICAgY2FuIHNoYXJlIHRoZSBzYW1lIHNlbWFwaG9yZSBpbmRleC4KKyoKKyogdmFsaWQ6CisqICAgICAgICAgU3BlY2lmaWVzIGlmIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgdmFsaWQgaW4gY3VycmVudCBtb2RlLgorKiAgICAgICAgICAgIFYgIC0gVmFsaWQKKyogICAgICAgICAgICBOViAtIE5vdCB2YWxpZAorKgorKiBSVzoKKyogICAgICAgIFNwZWNpZmllcyBSZWFkL1dyaXRlIG1vZGUuCisqICAgICAgICAgICAgUk8gLSBSZWFkIG9ubHkKKyogICAgICAgICAgICBSVyAtIFJlYWQvV3JpdGUKKyogICAgICAgICAgICBXTyAtIFdyaXRlIG9ubHkKKyogICAgICAgICAgICBYWCAtIE5vdCBhY2Nlc3NpYmxlIGZyb20gaG9zdAorKgorKiBQOgorKiAgICAgICAgU3BlY2lmaWVzIHBlcnNpc3RlbnQgbWVtb3J5IG9wdGlvbgorKiAgICAgICAgICAgIFAgIC0gU2F2ZSB0byBwZXJzaXN0ZW50IG1lbW9yeQorKiAgICAgICAgICAgIE5QIC0gTm8gc2F2ZQorKgorKiBSRUxPQUQ6CisqICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzZXR0aW5nIHRoaXMgcmVxdWlyZXMgcmVsb2FkaW5nIHRoZSBNQUMgbW9kdWxlCisqICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjYW4gYmUgY2hhbmdlZCBvbmx5IHdoZW4gU01FIGlzIGluIE9GRkxJTkUgb3IgU1VTUEVORChPRkZMSU5FKSBzdGF0ZQorKgorKiBSRVNUQVJUOgorKiAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc2V0dGluZyB0aGlzIHJlcXVpcmVzIChyZSlhc3NvYyBhdCBTVEEgYW5kIHJlc3RhcnQgYXQgQVAKKyogICAgICAgIFRoaXMgYXR0cmlidXRlIGNhbiBiZSBjaGFuZ2VkIG9ubHkgd2hlbiBTTUUgaXMgaW4gT0ZGTElORSwgU1VTUEVORChPRkZMSU5FKSwKKyogICAgICAgIElETEUgb3IgU1VTUEVORChJRExFKSBzdGF0ZXMKKyoKKyogU1RBX25vdGlmaWNhdGlvbjoKKyogICAgICAgIExpc3RzIG1vZHVsZXMgdG8gYmUgbm90aWZpZWQgaW4gU1RBIG1vZGUuICBWYWxpZCBtb2R1bGVzIGFyZToKKyogICAgICAgIEhERCwgTElNLCBTQ0gsIEFSUSwgRFBILCBOSU0sIFNQLCBSRlAsIFJIUCwgVEZQLiAgTW9yZSB0aGFuIG9uZQorKiAgICAgICAgbW9kdWxlcyBjYW4gYmUgbGlzdGVkIG9uIHRoZSBzYW1lIGxpbmUgdXNpbmcgc3BhY2Ugb3IgdGFiIGFzIHRoZQorKiAgICAgICAgc2VwYXJhdG9yLiAgSWYgbm8gbm90aWZpY2F0aW9uIGlzIHJlcXVpcmVkLCAnTk9ORScgbXVzdCBiZSBzcGVjaWZpZWQuCisqCisqIEFQX25vdGlmaWNhdGlvbjoKKyogICAgICAgIExpc3RzIG1vZHVsZSB0byBiZSBub3RpZmllZCBpbiBBUCBtb2RlLiAgVmFsaWQgbW9kdWxlcyBhcmU6CisqICAgICAgICBIREQsIExJTSwgU0NILCBBUlEsIERQSCwgTklNLCBTUCwgUkZQLCBSSFAsIFRGUC4gIE1vcmUgdGhhbiBvbmUKKyogICAgICAgIG1vZHVsZXMgY2FuIGJlIGxpc3RlZCBvbiB0aGUgc2FtZSBsaW5lIHVzaW5nIHNwYWNlIG9yIHRhYiBhcyB0aGUKKyogICAgICAgIHNlcGFyYXRvci4gIElmIG5vIG5vdGlmaWNhdGlvbiBpcyByZXF1aXJlZCwgJ05PTkUnIG11c3QgYmUgc3BlY2lmaWVkLgorKgorKiBTVEEvQVAgaW50ZWdlciB2YWx1ZXM6CisqICAgICAgICBtaW46CisqICAgICAgICBTcGVjaWZpZXMgbWluaW11bSB2YWx1ZSBmb3IgYW4gaW50ZWdlciBwYXJhbWV0ZXIuICBUaGlzIGZpZWxkIGlzCisqICAgICAgICBpZ25vcmVkIGlmIHRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBzdHJpbmcuICBIb3dldmVyLCB0aGlzIGZpZWxkIG11c3QKKyogICAgICAgIG5vdCBiZSBvbWl0dGVkLgorKgorKiAgICAgICAgbWF4OgorKiAgICAgICAgU3BlY2lmaWVzIG1heGltdW0gdmFsdWUgZm9yIGFuIGludGVnZXIgcGFyYW1ldGVyLiAgVGhpcyBmaWVsZCBpcworKiAgICAgICAgaWdub3JlZCBpZiB0aGUgcGFyYW1ldGVyIHR5cGUgaXMgc3RyaW5nLiAgSG93ZXZlciwgdGhpcyBmaWVsZCBtdXN0CisqICAgICAgICBub3QgYmUgb21pdHRlZC4KKyoKKyogICAgICAgIGRlZmF1bHQ6CisqICAgICAgICBTcGVjaWZpZXMgZGVmYXVsdCB2YWx1ZSBmb3IgYW4gaW50ZWdlciBwYXJhbWV0ZXIuICBUaGlzIGZpZWxkIGlzCisqICAgICAgICBpZ25vcmVkIGlmIHRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBzdHJpbmcuICBIb3dldmVyLCB0aGlzIGZpZWxkIG11c3QKKyogICAgICAgIG5vdCBiZSBvbWl0dGVkLgorKgorKiBTVEEvQVAgc3RyaW5nIHZhbHVlczoKKyogICAgICAgIGxlbjoKKyogICAgICAgIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBzdHJpbmcKKyoKKyogICAgICAgIGJ5dGVpOgorKiAgICAgICAgYnl0ZSBpIG9mIHRoZSBzdHJpbmcgd2hlcmUgaSB2YXJpZXMgZnJvbSAxIHRvIGxlbgorKgorKiBUQUJMRSBHRU5FUkFUSU9OOgorKiAtLS0tLS0tLS0tLS0tLS0tLQorKiAgICAgICAgVGFibGUgY2FuIGJlIGdlbmVyYXRlZCB1c2luZyBrZXl3b3JkcyAnI1RBQkxFJyBhbmQgJyNFTkQnIGFzIGJlbG93OgorKgorKiAgICAgICAgI1RBQkxFICB0YWJsZV9uYW1lICAgbnVtYmVyX29mX3JvdworKiAgICAgICAgV05JX0NGR194eHh4CisqICAgICAgICAuLi4uLi4uCisqICAgICAgICAuLi4uLi4uCisqICAgICAgICAjRU5ECisqCisqICAgICAgICBUaGUgQ0ZHIHV0aWxpdHkgd2lsbCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIG91dHB1dDoKKyogICAgICAgIFdOSV9DRkdfdGFibGVfeHh4X0lEICAgIHh4eAorKiAgICAgICAgV05JX0NGR190YWJsZV94eHhfUk9XICAgbnVtYmVyX29mX3Jvd3MKKyogICAgICAgIFdOSV9DRkdfdGFibGVfeHh4X0NPTCAgIG51bWJlcl9vZl9jb2x1bW5zCisqCisqICAgICAgICBUaGVzZSB3aWxsIGJlIGZvbGxvd2VkIGJ5IHRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgZWFjaCBlbnRyeSBpbgorKiAgICAgICAgdGhlIHRhYmxlLiAgVGFibGUgaXMgb3JnYW5pemVkIGluIGNvbHVtbi1tYWpvciBvcmRlci4KKyoKKyogICAgICAgICNFTlRSWV9WQUxVRVMgMQorKiAgICAgICAgMCAgICA0ICAgIDEKKyogICAgICAgIDAgICAgMCAgICAwCisqICAgICAgICAjRU5UUllfVkFMVUVTIDIKKyogICAgICAgIDAgICAgNCAgICAyCisqICAgICAgICAwICAgIDAgICAgMAorKiAgICAgICAgI0VOVFJZX1ZBTFVFUyAzCisqICAgICAgICAwICAgIDQgICAgMworKiAgICAgICAgMCAgICAwICAgIDAKKyogICAgICAgICNFTlRSWV9WQUxVRVMgNAorKiAgICAgICAgMCAgICA0ICAgIDQKKyogICAgICAgIDAgICAgMCAgICAwCisqCisqCisqIEVOVU1FUkFUSU9OCisqIC0tLS0tLS0tLS0tCisqICAgICAgICBFbnVtZXJhdGlvbnMgY2FuIGJlIGRlZmluZSB1c2luZyBrZXl3b3JkICcjRU5VTScKKyoKKyogICAgICAgICNFTlVNIHh4eCAgIHZhbAorKgorKiAgICAgICAgVGhlIGNmZyB1dGlsaXR5IHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBvdXRwdXQgaW4gdGhlIGhlYWRlciBmaWxlCisqICAgICAgICAjZGVmaW5lIHBhcmFtbmFtZV94eHggICAgdmFsCisqCisKKworKgorKiBTdGF0aW9uIElEIChjaGFuZ2luZyByZXF1aXJlcyByZXN0YXJ0KQorKgorCitXTklfQ0ZHX1NUQV9JRCAgICBTICAgIDYgICAgMQorViAgICBSVyAgICBOUCBSRUxPQUQKK0hBTAorNiAgICAweDIyIDB4MjIgMHg0NCAweDQ0IDB4MzMgMHgzMworViAgICBSVyAgICBOUCBSRUxPQUQKK0hBTAorNiAgICAweDIyIDB4MjIgMHgxMSAweDExIDB4MzMgMHgzMworCisqCisqIENGIFBvbGxhYmxlCisqCisKK1dOSV9DRkdfQ0ZfUE9MTEFCTEUgICAgSSAgICA0ICAgIDEKK05WICAgIFJPICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMCAgICAwCitWICAgIFJPICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCisKKyoKKyogQ0ZQIFBlcmlvZAorKgorCitXTklfQ0ZHX0NGUF9QRVJJT0QgICAgSSAgICA0ICAgIDEKK1YgICAgUk8gICAgTlAKK05PTkUKKzAgICAgMjU1ICAgMQorViAgICBSVyAgICBOUAorU0NICiswICAgIDI1NSAgIDEKKworKgorKiBDRlAgTWF4IER1cmF0aW9uCisqCisKK1dOSV9DRkdfQ0ZQX01BWF9EVVJBVElPTiAgICBJICAgIDQgICAgMQorViAgICBSTyAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDMwMDAwCitWICAgIFJXICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAzMDAwMAorCisqCisqIFNTSUQgKGNoYW5naW5nIHJlcXVpcmVzIHJlc3RhcnQpCisqCisKK1dOSV9DRkdfU1NJRCAgICBTICAgIDMyICAgIDEKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMTAgICAgMSAyIDMgNCA1IDYgNyA4IDkgMAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCisxMCAgICAxIDIgMyA0IDUgNiA3IDggOSAwCisKKyoKKyogQmVhY29uIFBlcmlvZAorKiBDYW4ndCBiZSBjaGFuZ2VkIG9uIFNUQSBpbiBpbmZyYXN0cnVjdHVyZSwgaWdub3JlIG5vdGlmaWNhdGlvbiBhdCBTQ0gKKyoKKworV05JX0NGR19CRUFDT05fSU5URVJWQUwgICAgSSAgICA0ICAgIDIKK1YgICAgUlcgICAgTlAKK1NDSAorMCAgICA2NTUzNSAgICAxMDAKK1YgICAgUlcgICAgTlAKK1NDSAorMCAgICA2NTUzNSAgICAxMDAKKworKgorKiBEVElNIFBlcmlvZAorKgorCitXTklfQ0ZHX0RUSU1fUEVSSU9EICAgICAgICBJICAgIDQgICAgMgorViAgICBSTyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAxCitWICAgIFJXICAgIE5QCitTQ0gKKzAgICAgNjU1MzUgICAgMQorCisKKyoKKyogV0VQIEtleSBMZW5ndGggKDUgb3IgMTMgYnl0ZXMpCisqCisKK1dOSV9DRkdfV0VQX0tFWV9MRU5HVEggICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorNSAgICAxMyAgICA1CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzUgICAgMTMgICAgNQorCisjRU5VTSA1ICAgIDUKKyNFTlVNIDEzICAgMTMKKworKgorKiBEZWZhdWx0IEtleSBUYWJsZQorKgorCisjVEFCTEUgICAgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfVEFCTEUgICAgNAorCitXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWSAgICBTICAgIDEzICAgIDQKK1YgICAgV08gICAgTlAgUkVTVEFSVAorTk9ORQorMAorViAgICBXTyAgICBOUCBSRVNUQVJUCitOT05FCiswCisKKyNFTkQKKworKgorKiBXRVAgRGVmYXVsdCBLZXkgaWQKKyoKKworV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRCAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTElNCiswICAgIDMgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDMgICAgMAorCisjRU5VTSAwICAgIDAKKyNFTlVNIDEgICAgMQorI0VOVU0gMiAgICAyCisjRU5VTSAzICAgIDMKKworKgorKiBFeGNsdWRlIHVuZW5jcnlwdGVkIGZyYW1lcyAoV0VQKQorKgorCitXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURUQgICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKKworKgorKiBSVFMgVGhyZXNob2xkCisqCisKK1dOSV9DRkdfUlRTX1RIUkVTSE9MRCAgICBJICAgIDQgICAgNgorViAgICBSVyAgICBOUAorSEFMCiswICAgIDIzNDcgICAgMjM0NworViAgICBSVyAgICBOUAorSEFMCiswICAgIDIzNDcgICAgMjM0NworCisqCisqIFNob3J0IFJldHJ5IExpbWl0CisqCisKK1dOSV9DRkdfU0hPUlRfUkVUUllfTElNSVQgICAgSSAgICA0ICAgIDYKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAyNTUgICA2CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgNgorCisqCisqIExvbmcgUmV0cnkgTGltaXQKKyoKKworV05JX0NGR19MT05HX1JFVFJZX0xJTUlUICAgIEkgICAgNCAgICA2CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgNgorViAgICBSVyAgICBOUAorSEFMCiswICAgIDI1NSAgIDYKKworCisqCisqIEZyYWdtZW50YXRpb24gVGhyZXNob2xkCisqCisKK1dOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgICAgSSAgICA0ICAgIDYKK1YgICAgUlcgICAgTlAKK0hBTAorMjU2ICAgIDgwMDAgICAgODAwMAorViAgICBSVyAgICBOUAorSEFMCisyNTYgICAgODAwMCAgICA4MDAwCisKKworKgorKiBNaW5pbXVtIENoYW5uZWwgVGltZSAoVFUpCisqCisKK1dOSV9DRkdfQUNUSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAyMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgMjAKKworKgorKiBNYXhpbXVtIENoYW5uZWwgVGltZSAoVFUpCisqCisKK1dOSV9DRkdfQUNUSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDQwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDQwCisqCisqIE1pbmltdW0gQ2hhbm5lbCBUaW1lIChUVSkKKyoKKworV05JX0NGR19QQVNTSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICA2MAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgNjAKKworKgorKiBNYXhpbXVtIENoYW5uZWwgVGltZSAoVFUpCisqCisKK1dOSV9DRkdfUEFTU0lWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAxMTAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgMTEwCisKKyoKKyogSm9pbiBGYWlsdXJlIFRpbWVvdXQgKFRVKQorKgorCitXTklfQ0ZHX0pPSU5fRkFJTFVSRV9USU1FT1VUICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDMwMDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgMzAwMAorCisqCisqIEF1dGhlbnRpY2F0ZSBGYWlsdXJlIFRpbWVvdXQgKFRVKQorKgorCitXTklfQ0ZHX0FVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVQgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgMTAwMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAxMDAwCisKKyoKKyogQXV0aGVudGljYXRlIFJlc3BvbnNlIFRpbWVvdXQgKFRVKQorKgorCitXTklfQ0ZHX0FVVEhFTlRJQ0FURV9SU1BfVElNRU9VVCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAxMDAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDEwMDAKKworKgorKiBBc3NvY2F0aW9uIEZhaWx1cmUgVGltZW91dCAoVFUpCisqCisKK1dOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VUICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgNjU1MzUgMjAwMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDY1NTM1IDMwMDAKKworKgorKiBSZWFzc29jaWF0aW9uIEZhaWx1cmUgVGltZW91dCAoVFUpCisqCisKK1dOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgMjAwMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAzMDAwCisKKworKgorKiBSQSBwZXJpb2RpY2l0eSBUaW1lb3V0IChUVSkKKyoKKworV05JX0NGR19SQV9QRVJJT0RJQ0lUWV9USU1FT1VUX0lOX1BTICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMTAwMAorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMCAgICAwCisKKyoKKyogQmVhY29uIEZpbHRlciBFbmFibGUvRGlzYWJsZSAoVFUpCisqCisKK1dOSV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVIgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgIDEKK05WICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorCisqCisqIEhlYXJ0IEJlYXQgRW5hYmxlL0Rpc2FibGUgKFRVKQorKgorCitXTklfQ0ZHX1BTX0VOQUJMRV9IRUFSVF9CRUFUICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMSAgICAxCitOViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDEKKworKgorKiBSU1NJIE1vbml0b3IgRW5hYmxlL0Rpc2FibGUgKFRVKQorKgorCitXTklfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1IgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgIDAKK05WICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMAorCisKKyoKKyogUFMgRGF0YSBJbkFjdGl2aXR5IFRpbWVvdXQgKFRVKQorKgorCitXTklfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzEgICAgMjU1ICAgIDIwCitOViAgICBSVyAgICBOUAorTk9ORQorMSAgICAyNTUgICAgMjAKKworCisqCisqIFJGIFNldHRsaW5nIFRpbWUgQ2xrIChJbiBVUykKKyoKKworV05JX0NGR19SRl9TRVRUTElOR19USU1FX0NMSyBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDYwMDAwICAgIDE1MDAKK05WICAgIFJXICAgIE5QCitOT05FCiswICAgIDYwMDAwICAgIDE1MDAKKworKgorKiBTdXBwb3J0ZWQgUmF0ZSBTZXQgZm9yIDExYgorKgorCitXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUIgICAgUyAgICA0ICAgIDIKK1YgICAgUk8gICAgTlAKK05PTkUKKzQgICAgIDIgNCAxMSAyMgorViAgICBSTyAgICBOUAorTk9ORQorNCAgICAgMiA0IDExIDIyCisKKyoKKyogU3VwcG9ydGVkIFJhdGUgU2V0IGZvciAxMWEKKyoKKworV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBICAgIFMgICAgOCAgICA3CitWICAgIFJPICAgIE5QCitOT05FCis4ICAgIDEyIDE4IDI0IDM2IDQ4IDcyIDk2IDEwOAorViAgICBSTyAgICBOUAorTk9ORQorOCAgICAxMiAxOCAyNCAzNiA0OCA3MiA5NiAxMDgKKworCisqCisqIFBIWSBNb2RlCisqCisKK1dOSV9DRkdfUEhZX01PREUgICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAzICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAzICAgIDAKKworI0VOVU0gIDExQSAgMAorI0VOVU0gIDExQiAgMQorI0VOVU0gIDExRyAgMgorI0VOVU0gIE5PTkUgMworCisKKyoKKypUaGUgRG90MTEgbW9kZSBjYW4gY2hhbmdlIGR5bmFtaWNhbGx5IG9uIFNUQQorKgorV05JX0NGR19ET1QxMV9NT0RFICAgICBJICAgICA0ICAgICA5CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK0xJTQorMCAgICA5ICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTElNCiswICAgIDkgICAgMAorCisjRU5VTSAgQUxMICAgICAgICAgICAwCisjRU5VTSAgMTFBICAgICAgICAgICAxCisjRU5VTSAgMTFCICAgICAgICAgICAyCisjRU5VTSAgMTFHICAgICAgICAgICAzCisjRU5VTSAgMTFOICAgICAgICAgICA0CisjRU5VTSAgUE9MQVJJUyAgICAgICA1CisjRU5VTSAgVElUQU4gICAgICAgICA2CisjRU5VTSAgVEFVUlVTICAgICAgICA3CisjRU5VTSAgMTFHX09OTFkgICAgICA4CisjRU5VTSAgMTFOX09OTFkgICAgICA5CisKKworCisKKworCisqCisqIE9wZXJhdGlvbmFsIFJhdGUgU2V0IChnb2VzIGluIGJlYWNvbiwgcHJvYmUgcnNwIGFuZCBhc3NvYyByZXEpCisqCisKK1dOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVQgICAgUyAgICAxMiAgICAyCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorNCAgICAgMHg4MiAweDg0IDExIDIyCisqIDggICAgMHg4YyAxOCAyNCAzNiA0OCA3MiA5NiAxMDgKKworKgorKiBFeHRlbmRlZCBPcGVyYXRpb25hbCBSYXRlIFNldCAoZ29lcyBpbiBiZWFjb24sIGFzc29jIHJlcSkKKyogcmVxdWlyZWQgZm9yIDExZworKgorCitXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VUICAgIFMgICAgOCAgICA3CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMAorCisqCisqIFByb3ByaWV0YXJ5IE9wZXJhdGlvbmFsIFJhdGUgU2V0CisqCisKK1dOSV9DRkdfUFJPUFJJRVRBUllfT1BFUkFUSU9OQUxfUkFURV9TRVQgICAgUyAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorNCAgICAxIDMgNSA3CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzQgICAgMSAzIDUgNworCisqCisqIEJTU0lECisqIEluIElCU1MsIHRoaXMgY2FuIGJlIGNoYW5nZWQgZm9yIGNvYWxlc2NpbmcsIHNob3VsZCBTTUUgZ28gaW50byBJRExFIHN0YXRlPworKgorCitXTklfQ0ZHX0JTU0lEICAgIFMgICAgNiAgICA3CitWICAgIFJPICAgIE5QIFJFU1RBUlQKK05PTkUKKzYgICAgMHgyMiAweDIyIDB4MTEgMHgxMSAweDMzIDB4MzMKK1YgICAgUk8gICAgTlAgUkVTVEFSVAorTk9ORQorNiAgICAweDIyIDB4MjIgMHgxMSAweDExIDB4MzMgMHgzMworCisKKyoKKyogTGlzdGVuIEludGVydmFsCisqCisKK1dOSV9DRkdfTElTVEVOX0lOVEVSVkFMICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgNjU1MzUgMQorViAgICBSTyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAxCisKKyoKKyogVmFsaWQgQ2hhbm5lbCBMaXN0CisqCisKK1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUICAgIFMgICAgMTAwICAgIDgKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTElNCis1NSAgIDM2IDQwIDQ0IDQ4IDUyIDU2IDYwIDY0IDEgNiAxMSAzNCAzOCA0MiA0NiAyIDMgNCA1IDcgOCA5IDEwIDEyIDEzIDE0IDEwMCAxMDQgMTA4IDExMiAxMTYgMTIwIDEyNCAxMjggMTMyIDEzNiAxNDAgMTQ5IDE1MSAxNTMgMTU1IDE1NyAxNTkgMTYxIDUwIDU0IDU4IDYyIDI0MCAyNDIgMjQ0IDI0NiAyNDggMjUwIDI1MgorViAgICBSVyAgICBOUCBSRVNUQVJUCitMSU0KKzU1ICAgMzYgNDAgNDQgNDggNTIgNTYgNjAgNjQgMSA2IDExIDM0IDM4IDQyIDQ2IDIgMyA0IDUgNyA4IDkgMTAgMTIgMTMgMTQgMTAwIDEwNCAxMDggMTEyIDExNiAxMjAgMTI0IDEyOCAxMzIgMTM2IDE0MCAxNDkgMTUxIDE1MyAxNTUgMTU3IDE1OSAxNjEgNTAgNTQgNTggNjIgMjQwIDI0MiAyNDQgMjQ2IDI0OCAyNTAgMjUyCisKKyoKKyogQ3VycmVudCBDaGFubmVsCisqCisKK1dOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMICAgIEkgICAgNCAgICA5CitWICAgIFJPICAgIE5QCitOT05FCiswICAgIDE2NSAgICAxCitWICAgIFJPICAgIE5QCitOT05FCiswICAgIDE2NSAgICAxCisKKworKgorKiBGb3IgMTFhIG9yIHB1cmUgMTFnLCB1c2UgNk1icHMocmF0ZWluZGV4IDExKQorKiBhcyB0aGUgZGVmYXVsdCBiZWFjb25SYXRlSW5kZXggYW5kCisqIG5vbkJlYWNvblJhdGVJbmRleC4KKyoKK1dOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzVHSFogICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMTEgICAgNQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxMSAgICA1CisKKyoKKyogRm9yIDExYi9nLCB1c2UgMU1icHMgCisqIGFzIHRoZSBkZWZhdWx0IGJlYWNvblJhdGVJbmRleCBhbmQKKyogbm9uQmVhY29uUmF0ZUluZGV4LgorKgorV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFogICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMzEgICAgMQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAzMSAgICAxCisKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogUmF0ZSBhZGFwdGF0aW9uIHR5cGUKKyoKKworV05JX0NGR19SQVRFX0FEQVBUQVRJT05fVFlQRSAgSSAgIDQgICAwCitWICAgIFJXICAgIE5QCitTQ0gKKzAgICAgMiAgICAgMQorViAgICBSVyAgICBOUAorU0NICiswICAgIDIgICAgIDEKKworI0VOVU0gRklYRUQgMAorI0VOVU0gQVVUTyAgMQorI0VOVU0gU05SX0JBU0VEIDIKKworKgorKiBSYXRlIGFkYXB0YXRpb24gZml4ZWQgcmF0ZQorKiBVc2VkIHRvIGRldGVybWluZSB0aGUgcmF0ZSBmb3IgYWxsIHBlZXIgc3RhdGlvbnMKKyoKKyoKKworV05JX0NGR19GSVhFRF9SQVRFICBJICAgNCAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAzMSAgICAgMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDMxICAgICAwCisKKyNFTlVNIEFVVE8gCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisjRU5VTSAxTUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNFTlVNIDJNQlBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI0VOVU0gNV81TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjRU5VTSAxMU1CUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKworI0VOVU0gNk1CUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjRU5VTSA5TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNFTlVNIDEyTUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI0VOVU0gMThNQlBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjRU5VTSAyNE1CUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNFTlVNIDM2TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNFTlVNIDQ4TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNFTlVNIDU0TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKworI0VOVU0gNl81TUJQU19NQ1MwXzIwTUhaX1NJTU8JICAgICAgICAgICAgMTMKKyNFTlVNIDEzTUJQU19NQ1MxXzIwTUhaX1NJTU8gICAgICAgICAgICAgICAgMTQKKyNFTlVNIDE5XzVNQlBTX01DUzJfMjBNSFpfU0lNTyAgICAgICAgICAgICAgMTUKKyNFTlVNIDI2TUJQU19NQ1MzXzIwTUhaX1NJTU8gICAgICAgICAgICAgICAgMTYKKyNFTlVNIDM5TUJQU19NQ1M0XzIwTUhaX1NJTU8gICAgICAgICAgICAgICAgMTcKKyNFTlVNIDUyTUJQU19NQ1M1XzIwTUhaX1NJTU8gICAgICAgICAgICAgICAgMTgKKyNFTlVNIDU4XzVNQlBTX01DUzZfMjBNSFpfU0lNTyAgICAgICAgICAgICAgMTkKKyNFTlVNIDY1TUJQU19NQ1M3XzIwTUhaX1NJTU8gICAgICAgICAgICAgICAgMjAKKworI0VOVU0gN18yTUJQU19NQ1MwXzIwTUhaX1NJTU9fU0dJICAgICAgICAgICAyMQorI0VOVU0gMTRfNE1CUFNfTUNTMV8yME1IWl9TSU1PX1NHSSAgICAgICAgICAyMgorI0VOVU0gMjFfN01CUFNfTUNTMl8yME1IWl9TSU1PX1NHSSAgICAgICAgICAyMworI0VOVU0gMjhfOU1CUFNfTUNTM18yME1IWl9TSU1PX1NHSSAgICAgICAgICAyNAorI0VOVU0gNDNfM01CUFNfTUNTNF8yME1IWl9TSU1PX1NHSSAgICAgICAgICAyNQorI0VOVU0gNTdfOE1CUFNfTUNTNV8yME1IWl9TSU1PX1NHSSAgICAgICAgICAyNgorI0VOVU0gNjVNQlBTX01DUzZfMjBNSFpfU0lNT19TR0kgICAgICAgICAgICAyNworI0VOVU0gNzJfMk1CUFNfTUNTN18yME1IWl9TSU1PX1NHSSAgICAgICAgICAyOAorCisjRU5VTSAwXzI1TUJQU19TTFJfMjBNSFpfU0lNTyAgICAgICAgICAgICAgIDI5CisjRU5VTSAwXzVNQlBTX1NMUl8yME1IWl9TSU1PICAgICAgICAgICAgICAgIDMwCisKKyNFTlVNIDY4XzI1TUJQU19RQ19QUk9QXzIwTUhaX1NJTU8gICAgICAgICAgMzEKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogQnJvYWRjYXN0L211dGxpY2FzdCByYXRlcyBmb3IgMi40R0haCisqIHVzZXMgdGhlIHNhbWUgcmF0ZSBpbmRpY2VzIGRlZmluaXRpb24gYXMgV05JX0NGR19GSVhFRF9SQVRFCisqIGRlZmF1bHQgdmFsdWUgY29ycmVzcG9uZHMgdG8gMU0KKworV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWiAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDMxICAgIDEKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAzMSAgICAxCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEJyb2FkY2FzdC9tdXRsaWNhc3QgcmF0ZXMgZm9yIDUgR0haCisqIHVzZXMgdGhlIHNhbWUgcmF0ZSBpbmRpY2VzIGRlZmluaXRpb24gYXMgV05JX0NGR19GSVhFRF9SQVRFCisqIGRlZmF1bHQgdmFsdWUgY29ycmVzcG9uZHMgdG8gNk0KKworV05JX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF81R0haICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMzEgICA1CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMzEgICA1CisKKyoKKyogcmV0cnkgcmF0ZSBzZWxlY3Rpb24gcG9saWN5CisqIDAgPT4gdXNlIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCByYXRlCisqIDEgPT4gdXNlIHRoZSBzYW1lIHJhdGUgYXMgdGhlIGNob3NlbiBwcmltYXJ5IHJhdGUKKyogMiA9PiB1c2UgdGhlIHJhdGUgc3BlY2lmaWVkIGluIFJFVFJZUkFURV9TRUNPTkRBUlkKKyogMyA9PiB1c2UgdGhlIHJhdGUgY2xvc2VzdCB0byB0aGUgcHJpbWFyeQorKiA0ID0+IGF1dG9zZWxlY3QgdGhlIHJldHJ5IHJhdGUgYmFzZWQgb24gUkEgYWxnb3JpdGhtCisqCisKK1dOSV9DRkdfUkVUUllSQVRFX1BPTElDWSAgSSAgIDQgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA0CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA0CisKKyNFTlVNIE1JTl9TVVBQT1JURUQgMAorI0VOVU0gUFJJTUFSWSAgICAgICAxCisjRU5VTSBSRVNFUlZFRCAgICAgIDIKKyNFTlVNIENMT1NFU1QgICAgICAgMworI0VOVU0gQVVUT1NFTEVDVCAgICA0CisjRU5VTSBNQVggICAgICAgICAgIDUKKworKgorKiB0aGUgZm9sbG93aW5nIHR3byBDRkcncyBhcmUKKyogdXNlZCBvbmx5IGlmIHRoZSByZXRyeXJhdGUgcG9saWN5ID09IDIKKyogVGhlc2Ugc2hvdWxkIGJlIHNldCB0byBvbmUgb2YgdGhlIHZhbHVlcyB1c2VkCisqIGZvciBjb25maWd1cmluZyBmaXhlZCByYXRlcyAoc2VlIGVudW1lcmF0ZWQgcmF0ZXMpCisqCisKK1dOSV9DRkdfUkVUUllSQVRFX1NFQ09OREFSWSAgSSAgIDQgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICAwCisKK1dOSV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZICBJICAgNCAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAyNTUgICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAyNTUgICAgIDAKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogQXV0b21hdGljIFBvd2VyIFNhdmUgRGVsaXZlcnkgY2FwYWJpbGl0eQorKgorCitXTklfQ0ZHX0FQU0RfRU5BQkxFRCBJICAgNCAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCisKKyoKKyogU2hhcmVkIGtleSBhdXRoZW50aWNhdGlvbiBzdXBwb3J0ZWQKKyoKKworV05JX0NGR19TSEFSRURfS0VZX0FVVEhfRU5BQkxFICAgIEkgICA0ICAgOAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAxCisKKyoKKyogT3BlbiBzeXN0ZW0gYXV0aGVudGljYXRpb24gc3VwcG9ydGVkCisqCisKK1dOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEUgICAgSSAgIDQgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDEKKworKgorKiBBdXRoZW50aWNhdGlvbiBUeXBlIChjaGFuZ2UgcmVxdWlyZXMgcmVzdGFydCkKKyoKKworV05JX0NGR19BVVRIRU5USUNBVElPTl9UWVBFICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgNjU1MzUgICAgMAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDY1NTM1ICAgIDAKKworKgorKiBDRiBQb2xsIFJlcXVlc3QgKGNoYW5nZSByZXF1aXJlcyByZXN0YXJ0KQorKgorCitXTklfQ0ZHX0NGX1BPTExfUkVRVUVTVCAgICBJICAgIDQgICAgOAorTlYgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworKgorKiBQcml2YWN5IEVuYWJsZWQgKGNoYW5nZSByZXF1aXJlcyByZXN0YXJ0KQorKgorCitXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRCAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMAorCisqCisqIFNob3J0IFByZWFtYmxlIChjaGFuZ2UgcmVxdWlyZXMgcmVzdGFydCkKKyoKKworV05JX0NGR19TSE9SVF9QUkVBTUJMRSAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMQorCisqCisqIFNob3J0IFNsb3QgdGltZQorKiBUaGlzIGlzIHRoZSBvcGVyYXRpb25hbCBzdGF0ZSBvZiB0aGUgQlNTCisKK1dOSV9DRkdfU0hPUlRfU0xPVF9USU1FICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKKworCisqCisqIEFDQ0VQVCBTaG9ydCBTbG90IEFzc29jaWF0aW9uIG9ubHkKKyogICAKKyogMTogIElmIEFQIHN1cHBvcnRzIHNob3J0U2xvdCwgdGhlbiBBUCB3aWxsIGFjY2VwdCAKKyogICAgIGFzc29jaWF0aW9uIG9ubHkgZnJvbSBzdGF0aW9ucyB0aGF0IHN1cHBvcnRzCisqICAgICBzdXBwb3J0cyBzaG9ydCBzbG90CisqIDA6ICBBUCBzdXBwb3J0cyBzaG9ydFNsb3QsIGJ1dCBBUCB3aWxsIGFjY2VwdCBhc3NvY2lhdGlvbiAKKyogICAgIGZyb20gc3RhdGlvbnMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHN0YXRpb24gc3VwcG9ydHMgCisqICAgICBzaG9ydCBzbG90IG9yIGxvbmcgc2xvdAorKgorV05JX0NGR19BQ0NFUFRfU0hPUlRfU0xPVF9BU1NPQ19PTkxZICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCisKKworKgorKiBRT1MgRW5hYmxlZCAoY2hhbmdlIHJlcXVpcmVzIHJlc3RhcnQpCisqCisKK1dOSV9DRkdfUU9TX0VOQUJMRUQgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworKgorKiBIQ0YgRW5hYmxlZCAoY2hhbmdlIHJlcXVpcmVzIHJlc3RhcnQpCisqCisKK1dOSV9DRkdfSENGX0VOQUJMRUQgICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCisKKyoKKyogUlNOICgxMWkvV1BBKSBFbmFibGVkCisqCisKK1dOSV9DRkdfUlNOX0VOQUJMRUQgICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCisKKyoKKyogQmFja2dyb3VuZCBzY2FubmluZyBwZXJpb2RpY2l0eSAoa2lsbyB1c2VjKQorKgorCitXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9QRVJJT0QgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxODAwMDAgICAgNTAwMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDE4MDAwICAgIDUwMDAKKworKgorKiBNYXggbnVtYmVyIG9mIFByZWF1dGhlbnRpY2F0aW9uCisqCisKK1dOSV9DRkdfTUFYX05VTV9QUkVfQVVUSCAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTk9ORQorMCAgICAyNTYgICAgNjQKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK05PTkUKKzAgICAgMjU2ICAgIDY0CisKKyoKKyogUHJlYXV0aGVudGljYXRpb24gQ2xlYW51cCBUaW1lb3V0IChraWxvIHVzZWMpCisqCisKK1dOSV9DRkdfUFJFQVVUSF9DTE5VUF9USU1FT1VUICAgIEkgICAgNCAgICA4CitOViAgICBYWCAgICBOUAorTk9ORQorMCAgICAgMCAgICAgMAorViAgICBSVyAgICBOUAorTElNCiswICAgIDEyMDAwMCAgICAzMDAwMAorCisqCisqIFJlbGVhc2UgQUlEIFRpbWVvdXQKKyoKKworV05JX0NGR19SRUxFQVNFX0FJRF9USU1FT1VUICAgIEkgICAgNCAgICA4CitOViAgICBYWCAgICBOUAorTk9ORQorMCAgICAwICAgIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxMDAwMDAgICAgMTAwMAorKgorKiBIZWFydGJlYXQgVGhyZXNob2xkCisqCisKK1dOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICA2NTUzNSAgICA0MAorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgNDAKKworKgorKiBQcm9iZSByZXNwb25zZSB3YWl0IHRpbWUgb3V0IGFmdGVyIGhlYXJ0YmVhdCBmYWlsdXJlCisqCisKK1dOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VUICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCisxMCAgICAxMDAwMCAgICA0MAorViAgICBSVyAgICBOUAorTk9ORQorMTAgICAgMTAwMDAgICAgNDAKKworKgorKiBNYW51ZmFjdHVyZXIgT1VJIChmcm9tIGVlcHJvbSkKKyoKKworV05JX0NGR19NQU5VRkFDVFVSRVJfT1VJICAgIFMgICAgMyAgICA4CitWICAgIFJPICAgIE5QCitOT05FCiszICAgIDB4MCAweGEgMHhmNQorViAgICBSTyAgICBOUAorTk9ORQorMyAgICAweDAgMHhhIDB4ZjUKKworKgorKiBNYW51ZmFjdHVyZSBOYW1lIChmcm9tIGVlcHJvbSkKKyoKKworV05JX0NGR19NQU5VRkFDVFVSRVJfTkFNRSAgICBTICAgIDY1ICAgIDgKK1YgICAgUk8gICAgTlAKK05PTkUKKzggICAgMHg1MSAweDc1IDB4NjEgMHg2YyAweDYzIDB4NmYgMHg2RCAweDZECitWICAgIFJPICAgIE5QCitOT05FCis4ICAgIDB4NTEgMHg3NSAweDYxIDB4NmMgMHg2MyAweDZmIDB4NkQgMHg2RAorCisqCisqIE1vZGVsIE51bWJlciAoZnJvbSBlZXByb20pCisqCisKK1dOSV9DRkdfTU9ERUxfTlVNQkVSICAgIFMgICAgMzMgICAgOAorViAgICBSTyAgICBOUAorTk9ORQorNiAgICAweDRkIDB4NGUgMHgzMSAweDMyIDB4MzMgMHgzNAorViAgICBSTyAgICBOUAorTk9ORQorNiAgICAweDRkIDB4NGUgMHgzMSAweDMyIDB4MzMgMHgzNAorCisKKworKgorKiBNb2RlbCBOYW1lIChmcm9tIGVlcHJvbSkKKyogV0ZSNDAzMQorKgorCitXTklfQ0ZHX01PREVMX05BTUUgICAgUyAgICAzMyAgICA4CitWICAgIFJPICAgIE5QCitOT05FCis3ICAgIDB4NTcgMHg0NiAweDUyIDB4MzQgMHgzMCAweDMzIDB4MzEKK1YgICAgUk8gICAgTlAKK05PTkUKKzcgICAgMHg1NyAweDQ2IDB4NTIgMHgzNCAweDMwIDB4MzMgMHgzMQorCisKKworCisqCisqIE1hbnVmYWN0dXJlIFByb2R1Y3QgTmFtZSAoZnJvbSBlZXByb20pCisqCisKK1dOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfTkFNRSAgICBTICAgIDMzICAgIDgKK1YgICAgUk8gICAgTlAKK05PTkUKKzYgICAgMHgzMSAweDMxIDB4NmUgMHgyRCAweDQxIDB4NTAKK1YgICAgUk8gICAgTlAKK05PTkUKKzYgICAgMHgzMSAweDMxIDB4NmUgMHgyRCAweDQxIDB4NTAKKworCisqCisqIE1hbnVmYWN0dXJlIFByb2R1Y3QgVmVyc2lvbiAoZnJvbSBlZXByb20pCisqCisKK1dOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfVkVSU0lPTiAgICBTICAgIDMzICAgIDgKK1YgICAgUk8gICAgTlAKK05PTkUKKzYgICAgMHg1MyAweDRlIDB4MzEgMHgzMiAweDMzIDB4MzQgCitWICAgIFJPICAgIE5QCitOT05FCis2ICAgIDB4NTMgMHg0ZSAweDMxIDB4MzIgMHgzMyAweDM0IAorCisqCisqIE11bHRpIERvbWFpbiBDYXBhYmlsaXR5ICgxMWQpIEVuYWJsZQorKgorCitXTklfQ0ZHXzExRF9FTkFCTEVEICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QICBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworKgorKiBwZXIgY2hhbm5lbCBNYXggcG93ZXIgdHJhbnNtaXQgIChpbiBkQm0pCisqIHRoaXMgcGFyYW1ldGVyIGNvcnJlc3BvbmQgdG8gdGhlIE1BWF9DT1VOVFJZX0VJRAorKiB0YWJsZSBvZiAoQ2hhbm5lbCBOdW1iZXIvbnVtIGNoYW5uZWwvbWF4IHR4IHBvd2VyKQorKgorKiBUaGVyZSBpcyBvbmUgdGFibGUgZm9yIDVHSHogY2hhbm5lbHMgYW5kIG9uZSB0YWJsZSBmb3IgMi40R0h6IGNoYW5uZWxzCisqCisKK1dOSV9DRkdfTUFYX1RYX1BPV0VSXzJfNCAgICBTICAgIDEyOCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCiszICAgMSAxNCAyMAorViAgICBSVyAgICBOUAorTk9ORQorMyAgIDEgMTQgMjAKKworV05JX0NGR19NQVhfVFhfUE9XRVJfNSAgICBTICAgIDEyOCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCiszIDM2IDEyNiAxNAorViAgICBSVyAgICBOUAorTk9ORQorMyAzNiAxMjYgMTQKKworKgorKiBDZWxsIHNpemUgY29uZmlndXJhdGlvbnMuIFRoZXNlIGFyZSBjYW5uZWQgY29uZmlndXJhdGlvbnMgZm9yIGEgc3BlY2lmaWVkCisqIGNlbGwgc2l6ZS4KKyoKK1dOSV9DRkdfTkVUV09SS19ERU5TSVRZICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMyAgICAzCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMyAgICAwCisKKyNFTlVNIExPVyAgICAgIDAKKyNFTlVNIE1FRElVTSAgIDEKKyNFTlVNIEhJR0ggICAgIDIKKyNFTlVNIEFEQVBUSVZFIDMKKworCisqCisqIEFkYXB0aXZlIFRocmVzaG9sZCBBbGdvcml0aG0KKyoKK1dOSV9DRkdfQURBUFRJVkVfVEhSRVNIT0xEX0FMR09SSVRITSAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUAorSEFMCisxICAgIDIgICAgMgorViAgICBSVyAgICBOUAorSEFMCisxICAgIDIgICAgMgorCisjRU5VTSBDQVJSSUVSICAgICAgMQorI0VOVU0gQ09SUkVMQVRJT04gIDIKKworCisKKyoKKyogQ3VycmVudCBUWCBBbnRlbm5hCisqCisKK1dOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QCitIQUwKKzEgICAgMSAgICAxCitWICAgIFJXICAgIE5QCitIQUwKKzEgICAgMiAgICAyCisKKyoKKyogQ3VycmVudCBSWCBBbnRlbm5hCisqCisKK1dOSV9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QCitIQUwKKzEgICAgMiAgICAyCitWICAgIFJXICAgIE5QCitIQUwKKzEgICAgMyAgICAzCisKKyoKKyogQ3VycmVudCBUWCBQb3dlciBMZXZlbAorKgorCitXTklfQ0ZHX0NVUlJFTlRfVFhfUE9XRVJfTEVWRUwgICAgSSAgICA0ICAgIDkKK1YgICAgUk8gICAgTlAKK05PTkUKKzAgICAgMTI4ICAgIDI3CitWICAgIFJPICAgIE5QCitOT05FCiswICAgIDEyOCAgICAyNworCisKKyoKKyogUmFkaW8gUG93ZXIgU3RhdGUgZm9yIGVhY2ggQ2hhaW4KKyoKKyogVGhpcyBDRkcgaXMgaW52b2tlZCB3aGVuIHVzZXIgaXNzdWVzIHRoZSBBcHBsZSBzZXRQb3dlcigpCisqIGNvbW1hbmQsIHdoaWNoIGNvbmZpZ3VyZXMgdGhlIHBvd2VyIHN0YXRlIGZvciBlYWNoIGNoYWluLiBDdXJyZW50bHksCisqIFRhdXJ1cyBzdXBwb3J0cyB1cCB0byB0aHJlZSBjaGFpbnMsIGFuZCBlYWNoIGNoYWluIGNhbiBiZSBjb25maWd1cmVkCisqIHRvIG9uZSBvZiB0aGUgNCBmb2xsb3dpbmcgcG9zc2libGUgcG93ZXIgc3RhdGVzOgorKiAgICBQT1dFUl9PRkYgPSAweDAKKyogICAgUE9XRVJfT04gID0gMHgxCisqICAgIFBPV0VSX1RYICA9IDB4MgorKiAgICBQT1dFUl9SWCAgPSAweDMKKyoKKyogVGhlIHBvd2VyIHN0YXRlIG9mIGVhY2ggY2hhaW4gaXMgZXhwcmVzc2VkIGluIG5pYmJsZToKKyogICAgYml0WzA6M10gICAtIGNoYWluIDAKKyogICAgYml0WzQ6N10gICAtIGNoYWluIDEKKyogICAgYml0Wzg6MTFdICAtIGNoYWluIDIKKyogICAgYml0WzEyOjE1XSAtIG5vdCB1c2VkIGF0IHRoZSBtb21lbnQKKyoKKyogRXhhbXBsZXM6CisqIDB4MDAxIC0gIDF4MSAoY2hhaW4gMSBpcyBmb3IgYm90aCB0eCBhbmQgcmN2LiBjaGFpbiAxLDIgYXJlIHR1cm5lZCBvZmYpCisqIDB4MDMxIC0gIDF4MiAoY2hhaW4gMCBpcyBmb3IgYm90aCB0eCBhbmQgcmN2LiBjaGFpbiAxIGlzIHJjdiBvbmx5LiBjaGFpbiAyIGlzIHR1cm5lZCBvZmYpCisqIDB4MDExIC0gIDJ4MiAoY2hhaW4gMCwxIGFyZSB1c2VkIGZvciBib3RoIHR4IGFuZCByY3YpCisqIDB4MzExIC0gIDJ4MyAoY2hhaW4gMCwxIGFyZSB1c2VkIGZvciBib3RoIHR4IGFuZCByY3YuIGNoYWluIDIgaXMgZm9yIHJjdiBvbmx5KQorKiAweDMzMyAtICBhbGwgMyBjaGFpbnMgYXJlIHNldCB0byBSWAorKgorCitXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTiAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUAorSEFMCiswICAgIDB4ZmZmZiAgICAweDMxMQorViAgICBSVyAgICBOUAorSEFMCiswICAgIDB4ZmZmZiAgICAweDMxMQorCisjRU5VTSBPRkYgICAgICAgICAgICAgICAwCisjRU5VTSBPTiAgICAgICAgICAgICAgICAxCisjRU5VTSBUWCAgICAgICAgICAgICAgICAyCisjRU5VTSBSWCAgICAgICAgICAgICAgICAzCisjRU5VTSBNQVNLICAgICAgICAgICAgICAweGYKKyNFTlVNIENIQUlOXzBfT0ZGU0VUICAgIDAKKyNFTlVNIENIQUlOXzFfT0ZGU0VUICAgIDQgCisjRU5VTSBDSEFJTl8yX09GRlNFVCAgICA4IAorCisKKyoKKyogUGFyYW1ldGVyIHRvIGluZGljYXRlIG9yIG5vdCBuZXcgQlNTIGZvdW5kCisqCisKK1dOSV9DRkdfTkVXX0JTU19GT1VORF9JTkQgICAgICAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKK1YgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKKworKgorKiBQcm9wcmlldGFyeSBBTkkgZmVhdHVyZXMgZW5hYmxlL2Rpc2FibGUKKyoKKworV05JX0NGR19QUk9QUklFVEFSWV9BTklfRkVBVFVSRVNfRU5BQkxFRCAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworCisqCisqIFF1YWxjb21tIFByb3AgUmF0ZXMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKKyoKK1dOSV9DRkdfUFJPUFJJRVRBUllfUkFURVNfRU5BQkxFRCAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworCisqCisqIEFQIG5vZGUgTmFtZQorKgorCitXTklfQ0ZHX0FQX05PREVfTkFNRSAgICBTICAgIDMyICAgIDgKK05WICAgIFJPICAgIE5QCitOT05FCiswCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAKKworKgorKiBDb3VudHJ5IGNvZGUgKGZyb20gRUVQUk9NKQorKgorCitXTklfQ0ZHX0NPVU5UUllfQ09ERSAgICBTICAgIDMgICAgOAorViAgICBSVyAgICBOUAorTk9ORQorMAorViAgICBSVyAgICBOUAorTk9ORQorMyAweDExIDB4MjIgMHgzMworCisqCisqIFNwZWN0cnVtIE1hbmFnZW1lbnQgKDExaCkgZW5hYmxlL2Rpc2FibGUKKyoKKworV05JX0NGR18xMUhfRU5BQkxFRCAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDEKKworCisqCisqIFdhaXQgZm9yIENORiBUaW1lb3V0LiBDTkYgaW5jbHVkZSAoUkUpQVNTT0MsIERJU0FTU09DLCBBVVRILCBERUFVVEgsCisqIERVTU1ZIHBhY2tldAorKgorCitXTklfQ0ZHX1dUX0NORl9USU1FT1VUICAgIEkgICAgNCAgICAxMgorViAgIFJXICAgIE5QCitOT05FCisxMCAgICAzMDAwICAgMTAwMAorViAgICBSVyAgICBOUAorTk9ORQorMTAgICAgMzAwMCAgIDEwMDAKKworKgorKiBLZWVwYWxpdmUgVGltZW91dC4gQSBOdWxsIGRhdGEgZnJhbWUgaXMgc2VudCBvdXQgZXZlcnkgdGltZW91dC4KKyogQXBwbGljYWJsZSB0byBib3RoIEFQIGFuZCBTVEEKKyoKKworV05JX0NGR19LRUVQQUxJVkVfVElNRU9VVCAgICBJICAgIDQgICAgMTIKK1YgICBSVyAgICBOUAorTk9ORQorMCAgICAzNjAwMDAwICAgMAorViAgIFJXICAgIE5QCitOT05FCiswICAgIDM2MDAwMDAgICAzMDAwCisKKyoKKyogUHJveGltaXR5LCBzZXQgaXQgZm9yIHZlcnkgc2hvcnQgZGlzdGFuY2VzCisqIFByb3htaXR5IHNldHRpbmcgaXMgYXBwbGllZCB2aWEgaGFsUGh5U2V0TndEZW5zaXR5KCkKKyoKKyogY2xvc2UgcHJveGltaXR5IG9mZiA9IGRlbnNpdHlPbiBpcyB0cnVlLiBuZXR3b3JrIGRlbnNpdHkgY29uZmlnIGFwcGxpZXMuCisqIGNsb3NlIHByb3hpbWl0eSBvbiA9IGRlbnNpdHlPbiBpcyBmYWxzZS4gRG9uJ3QgY2FyZSBhYm91dCBuZXR3b3JrIGRlbnNpdHkgY29uZmlnLgorKgorCitXTklfQ0ZHX1BST1hJTUlUWSAgICBJICAgIDQgICAgMTIKK1YgICBSVyAgICBOUAorSEFMCiswICAgMSAgICAwCitWICAgUlcgICAgTlAKK0hBTAorMCAgIDEgICAgMAorCisjRU5VTSBPRkYgICAgICAwCisjRU5VTSBPTiAgICAgICAxCisKKyoKKyogRGVmYXVsdCBMT0cgbGV2ZWwKKyoKKworV05JX0NGR19MT0dfTEVWRUwgICAgSSAgICA0ICAgIDEyCitWICAgUlcgICAgTlAKK05PTkUKKzAgICA3ICAgMworViAgIFJXICAgIE5QCitOT05FCiswICAgNyAgIDMKKworKgorKiBPTEJDIGRldGVjdGlvbiB0aW1lb3V0CisqCisKK1dOSV9DRkdfT0xCQ19ERVRFQ1RfVElNRU9VVCAgICBJICAgIDQgICAgMTIKK1YgICBSVyAgICBOUAorTk9ORQorMTAwMCAgICAzMDAwMCAgIDEwMDAwCitWICAgIFJXICAgIE5QCitOT05FCisxMDAwICAgIDMwMDAwICAgMTAwMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQcm90ZWN0aW9uIEVuYWJsZQorKgorKkxPV0VSIGJ5dGUgZm9yIGFzc29jaWF0ZWQgc3RhdGlvbnMKKypVUFBFUiBieXRlIGZvciBvdmVybGFwcGluZyBzdGF0aW9ucy4KKyoxMWcgPT0+IHByb3RlY3Rpb24gZnJvbSAxMWcKKyoxMWIgPT0+IHByb3RlY3Rpb24gZnJvbSAxMWIKKyplYWNoIGJ5dGUgd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgaW5mbworKmJpdDcgCSAgYml0NiAJIGJpdDUgICBiaXQ0IGJpdDMgICBiaXQyICBiaXQxIGJpdDAKKypyZXNlcnZlZCByZXNlcnZlZCBSSUZTIExzaWcgbi1HRiBodDIwIDExZyAxMWIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1dOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZmZmICAgIDB4ZmZmZgorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTElNCiswICAgIDB4ZmZmZiAgICAweGZmZmYKKworI0VOVU0gRlJPTV9sbEEgMAorI0VOVU0gRlJPTV9sbEIgMQorI0VOVU0gRlJPTV9sbEcgMgorI0VOVU0gSFRfMjAgMworI0VOVU0gTk9OX0dGIDQKKyNFTlVNIExTSUdfVFhPUCA1CisjRU5VTSBSSUZTIDYKKyNFTlVNIE9CU1MgNworI0VOVU0gT0xCQ19GUk9NX2xsQSA4CisjRU5VTSBPTEJDX0ZST01fbGxCIDkKKyNFTlVNIE9MQkNfRlJPTV9sbEcgMTAKKyNFTlVNIE9MQkNfSFQyMCAxMQorI0VOVU0gT0xCQ19OT05fR0YgMTIKKyNFTlVNIE9MQkNfTFNJR19UWE9QIDEzCisjRU5VTSBPTEJDX1JJRlMgMTQKKyNFTlVNIE9MQkNfT0JTUyAxNQorCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAxMUcgUHJvdGVjdGlvbiBFbmFibGUgQWx3YXlzCisqIFZhbGlkIG9ubHkgaWYgcHJvdGVjdGlvbiBpcyBlbmFibGVkCisqIGZvcmNlcyB1c2VzIG9mIHByb3RlY3Rpb24gcmVnYXJkbGVzcyBvZiBsZWdhY3kgc3RhdGlvbnMKKyoKKworV05JX0NGR18xMUdfUFJPVEVDVElPTl9BTFdBWVMgICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QICBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRm9yY2UgcHJvdGVjdGlvbgorKiAwIDogIGRpc2FibGUgcHJvdGVjdGlvbgorKiAxIDogIENUUworKiAyIDogIFJUUyBieSB0aHJlc2hvbGQgKHRocmVzaG9sZCBub256ZXJvKQorKiAzIDogIGR1YWwgQ1RTIChub3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdykKKyogNCA6ICBSVFMgKHRocmVzaG9sZCAwKQorKiA1IDogIGF1dG8KKworV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTiAgICBJICAgIDQgICAgOSAKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQgCitIQUwKKzAgICAgNSAgICA1IAorViAgICBSVyAgICBOUCAgUkVTVEFSVCAKK0hBTAorMCAgICA1ICAgIDUKKworI0VOVU0gRElTQUJMRSAgICAgICAgICAgICAgICAwCisjRU5VTSBDVFMgICAgICAgICAgICAgICAgICAgIDEKKyNFTlVNIFJUUyAgICAgICAgICAgICAgICAgICAgMgorI0VOVU0gRFVBTF9DVFMgICAgICAgICAgICAgICAzCisjRU5VTSBSVFNfQUxXQVlTICAgICAgICAgICAgIDQKKyNFTlVNIEFVVE8gICAgICAgICAgICAgICAgICAgNQorCisKKworCisKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogMTFHIFNob3J0IFByZWFtYmxlIEVuYWJsZQorKgorCitXTklfQ0ZHXzExR19TSE9SVF9QUkVBTUJMRV9FTkFCTEVEICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QICBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTk9ORQorMCAgICAxICAgIDAKKworKgorKiAxMUcgU2hvcnQgU2xvdCBUaW1lIEVuYWJsZSAoY2hhbmdlIHJlcXVpcmVzIHJlc3RhcnQpCisqIFRoaXMgaXMgdGhlIGFkbWluIHN0YXRlIG9mIHNob3J0IHNsb3Qgc3VwcG9ydC4KKworV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRUQgICAgSSAgICA0ICAgIDkKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAxCitWICAgIFJXICAgIE5QICBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMQorCisqCisqIENhbGlicmF0aW9uIHBlcmlvZGljaXR5IChtaW51dGVzKQorKgorCitXTklfQ0ZHX0NBTF9QRVJJT0QgICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QCitIQUwKKzIgICAgMTAgICAgNQorViAgICBSVyAgICBOUAorSEFMCisyICAgIDEwICAgIDUKKworKgorKiBTdGF0aXN0aWNzIGNvbGxlY3Rpb24gcGVyaW9kaWNpdHkgKHNlY29uZHMpCisqCisKK1dOSV9DRkdfU1RBVFNfUEVSSU9EICAgIEkgICAgNCAgICAxMgorViAgICBSVyAgICBOUAorSEFMCisxICAgIDEwICAgIDEwCitWICAgIFJXICAgIE5QCitIQUwKKzEgICAgMTAgICAgMTAKKworKgorKiBDYWxpYnJhdGlvbiBvbi9vZmYgY29udHJvbAorKgorCitXTklfQ0ZHX0NBTF9DT05UUk9MICAgIEkgICAgNCAgICAxMgorViAgICBSVyAgICBOUAorSEFMCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDEgICAgMAorCisjRU5VTSBDQUxfT04gIDAKKyNFTlVNIENBTF9PRkYgMQorCisKKyoKKyogUGFyYW1ldGVyIHRvIGFsbG93IDExZyBvbmx5IFNUQXMgd2hpbGUgb3BlcmF0aW5nIGluIDExZyBtb2RlCisqCisKK1dOSV9DRkdfMTFHX09OTFlfUE9MSUNZICAgIEkgICAgNCAgICAxMgorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgIDAKKworKgorKiBQYWNrZXQgQ2xhc3NpZmljYXRpb24KKyogVGhpcyBmbGFnIGlzIGEgYml0bWFzayB1c2VkIHRvIGluZGljYXRlIHdoaWNoCisqIGZyYW1lIGNsYXNzaWZpZXIgdG8gYmUgZW5hYmxlZDoKKyogICAgYjA6IERTQ1AKKyogICAgYjE6IDgwMi4xUAorKgorCitXTklfQ0ZHX1BBQ0tFVF9DTEFTU0lGSUNBVElPTiAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAzICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAzICAgIDAKKworI0VOVU0gIERJU0FCTEVEICAwCisjRU5VTSAgRFNDUCAgICAgIDEKKyNFTlVNICA4MDIxUCAgICAgMgorI0VOVU0gIEFMTCAgICAgICAzCisKKyoKKyogV01FIEVuYWJsZWQgKGNoYW5nZSByZXF1aXJlcyByZXN0YXJ0KQorKgorCitXTklfQ0ZHX1dNRV9FTkFCTEVEICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAxCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMSAgICAxCisKKyoKKyogQUREVFMgcmVzcG9uc2UgdGltZW91dCAoaW4gbXMpCisqCisKK1dOSV9DRkdfQUREVFNfUlNQX1RJTUVPVVQgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgMTAwMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICAxMDAwCisKKworICogTWF4IFNQIExlbmd0aCBpbmRpY2F0ZXMgdGhlIG1heCBudW1iZXIgb2YgCisgKiB0b3RhbCBidWZmZXJlZCBNU0RVcyBhbmQgTU1QRFVzIHRoZSBXTU0gQVAKKyAqIG1heSBkZWxpdmVyIHRvIFdNTSBTVEEgZHVyaW5nIGFueSBzZXJ2aWNlIHBlcmlvZAorICogdHJpZ2dlcmVkIGJ5IFdNTSBTVEEuIAorICogMSkgSWYgQVAgc2VuZHMgV01NIElFIHdpdGggdGhlIFVBUFNEIGJpdCAwLCBtYXhfc3BfbGVuZ3RoPTAKKyAqIDIpIElmIFdNTSBTVEEncyBhbGwgNCBVQVBTRCBmbGFnIGFyZSBzZXQgdG8gMCwgbWF4X3NwX2xlbmd0aD0wIAorICogMykgSWYgQVAgc2VuZHMgV01NIElFIHdpdGggVUFQU0Q9MSwgYW5kIGF0IGxlYXN0IG9uZSBvZiBzdGF0aW9ucyAKKyAqICAgIFVBUFNEIGZsYWcgaXMgc2V0IHRvIDEsIHRoZW4gbWF4X3NwX2xlbmd0aCBjYW4gYmUgc2V0IHRvOgorICogICAgW2I1OmI2XT0weDAwOiBXTU0gQVAgbWF5IGRlbGl2ZXIgYWxsIGJ1ZmZlcmVkIGZyYW1lcworICogICAgW2I1OmI2XT0weDEwOiBXTU0gQVAgbWF5IGRlbGl2ZXIgbWF4IDIgYnVmZmVyZWQgZnJhbWVzCisgKiAgICBbYjU6YjZdPTB4MDE6IFdNTSBBUCBtYXkgZGVsaXZlciBtYXggNCBidWZmZXJlZCBmcmFtZXMKKyAqICAgIFtiNTpiNl09MHgxMTogV01NIEFQIG1heSBkZWxpdmVyIG1heCA2IGJ1ZmZlcmVkIGZyYW1lcworCitXTklfQ0ZHX01BWF9TUF9MRU5HVEggICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAzICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMyAgICAwCisKKworKgorKiBLRUVQIEFMSVZFIFNUQSBMaW1pdCBUaHJlc2hvbGQgLCB1c2VkIGluIEFQIHRvIGRlbGV0ZSB0aGUgU1RBCisqICAgICAgIGZyb20gU3RhdGlvbiBUYWJsZSB3aGljaCBkaWRuJ3QgcmVzcG9uZCB0byBQcm9iZSBSZXNwb25zZSBNZXNzYWdlcworKgorCitXTklfQ0ZHX0tFRVBfQUxJVkVfU1RBX0xJTUlUX1RIUkVTSE9MRCBJICAgIDQgICAgOAorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMzIgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMzIgIDAKKworKgorKiBQYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgd2hldGhlciB0byBzZW5kIFNTSUQKKyogaW4gUHJvYmUgUmVzcG9uc2Ugd2hlbiBTU0lEIGlzIHN1cHByZXNzZWQKKyoKKworV05JX0NGR19TRU5EX1NJTkdMRV9TU0lEX0FMV0FZUyAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCisKKyoKKyogV1NNIEVuYWJsZWQgKGNoYW5nZSByZXF1aXJlcyByZXN0YXJ0KQorKiBUYWtlcyBlZmZlY3Qgb25seSBpZiBXTUUgaXMgYWxzbyBlbmFibGVkCisqCisKK1dOSV9DRkdfV1NNX0VOQUJMRUQgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAwCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBQcm9wcmlldGFyeSBJRSBjYXBhYmlsaXR5IGVuYWJsZQorKiBiaXQgbWFwcGVkOgorKiAgMDpIQ0YgICAgMToxMWVRb3MgICAgIDI6V01FICAgICAgMzpXU00gIDQ6RVhUX1JBVEVTCisqICA1OkVYVFJBVEVfU1RPUAorKiAgNjpUaXRhbiBkZXZpY2UgICAgICAgICAgNzpUYXVydXMgRGV2aWNlCisqIDEzOkVEQ0EgIDE0OkxPQURJTkZPICAxNTpWRVJTSU9OCisqCisKK1dOSV9DRkdfUFJPUF9DQVBBQklMSVRZICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDB4ZmZmZiAgICAgMHhlMGJmCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDB4ZmZmZiAgICAgMHhjMGE5CisKKyNFTlVNIEhDRiAgICAgICAgICAwCisjRU5VTSAxMUVRT1MgICAgICAgMQorI0VOVU0gV01FICAgICAgICAgIDIKKyNFTlVNIFdTTSAgICAgICAgICAzCisjRU5VTSBFWFRSQVRFUyAgICAgNAorI0VOVU0gRVhUUkFURV9TVE9QIDUKKyNFTlVNIFRJVEFOICAgICAgICA2CisjRU5VTSBUQVVSVVMgICAgICA3CisjRU5VTSBFRENBUEFSQU1TICAgMTMKKyNFTlVNIExPQURJTkZPICAgICAxNAorI0VOVU0gVkVSU0lPTiAgICAgIDE1CisjRU5VTSBNQVhCSVRPRkZTRVQgMTUKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEJhY2tncm91bmQgQ2hhbm5lbCBMaXN0CisqICAgQ29udGFpbnMgcGFpcnMgb2Yge2NoYW5uZWxOdW1iZXIsIHNjYW5UeXBlfQorKiAgIHdoZXJlIHNjYW5UeXBlID0gMCBpbmRpY2F0ZXMgYWN0aXZlIHNjYW4gYW5kCisqICAgICAgICAgICAgICAgICAgPSAxIGluZGljYXRlcyBwYXNzaXZlIHNjYW4KKyoKKyoKKypXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9MSVNUICAgIFMgICAgMTI4ICAgIDgKKypWICAgIFJXICAgIE5QIFJFU1RBUlQKKypMSU0KKyo2MCAgIDM2IDAgNDAgMCA0NCAwIDQ4IDAgNTIgMCA1NiAwIDYwIDAgNjQgMCAxIDAgNiAwIDExIDAgMzQgMCAzOCAwIDQyIDAgNDYgMCAyIDAgMyAwIDQgMCA1IDAgNyAwIDggMCA5IDAgMTAgMCAxMiAwIDEzIDAgMTQgMCAxNDkgMCAxNTMgMCAxNTcgMCAxNjEgMAorKlYgICAgUlcgICAgTlAgUkVTVEFSVAorKkxJTQorKjYwICAgMSAwIDIgMCAzIDAgNCAwIDUgMCA2IDAgNyAwIDggMCA5IDAgMTAgMCAxMSAwIDEyIDAgMTMgMCAxNCAwIDM0IDAgMzYgMCAzOCAwIDQwIDAgNDIgMCA0NCAwIDQ2IDAgNDggMCA1MiAwIDU2IDAgNjAgMCA2NCAwIDE0OSAwIDE1MyAwIDE1NyAwIDE2MSAwCisqCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBFRENBIHBhcmFtdGVycyBhcmUgY29udGFpbmVkIGluIHByb2ZpbGVzIC0gZWFjaCBwcm9maWxlIGNvbnRhaW5zCisqIHRoZSBwYXJhbWV0ZXJzIFtBQ00sIEFJRlNOLCBDV21pbiwgQ1dtYXgsIFR4T3BdIGZvciBmb3VyCisqIGFjY2VzcyBjYXRlZ29yaWVzIChpLmUuLCBmb3VyIHNldHMpLiBUd28gc3VjaCBzZXRzIG9mIGZvdXIgcGFyYW1ldGVycworKiBtYWtlIGEgc2luZ2xlIHByb2ZpbGU6IE9uZSBzZXQgaXMgdXNlZCBsb2NhbGx5IGJ5IHRoZSBBUCwgdGhlIG90aGVyIHNldAorKiBpcyBicm9hZGNhc3QgZm9yIHVzZSBieSBzdGF0aW9ucy4KKyoKKyogQ3dtaW4gYW5kIEN3bWF4IGFyZSB0d28gYnl0ZXMgZWFjaCwgTVNCIGZpcnN0LiBTbyBDd21pbiBvZiBbMyAyNTVdIGlzCisqIGVxdWl2YWxlbnQgdG8gMHgzZmYsIGkuZS4gMyoyNTYrMjU1PTEwMjMKKyoKKyogVGhlIHByb2ZpbGUgdG8gdXNlIGlzIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSB2YWx1cyBvZiB0aGUgcHJvZmlsZSBzZWxlY3QgcGFyYW0KKyogU2VlIEVOVU1zIGJlbG93IGZvciBkZWZpbml0aW9ucyBvZiBwcm9maWxlIHZhbHVlcworKgorCitXTklfQ0ZHX0VEQ0FfUFJPRklMRSAgICBJICAgNCAgIDgKK1YgICBSVyAgTlAKK1NDSAorMCAgIDI1NSAgIDEKK1YgICBSVyAgTlAKK1NDSAorMCAgIDI1NSAgIDEKKworI0VOVU0gQU5JICAgICAgMAorI0VOVU0gV01NICAgICAgMQorI0VOVU0gVElUX0RFTU8gMgorI0VOVU0gTUFYICAgICAgMworCisjRU5VTSBBQ01fSURYICAgIDAKKyNFTlVNIEFJRlNOX0lEWCAgMQorI0VOVU0gQ1dNSU5BX0lEWCAyCisjRU5VTSBDV01BWEFfSURYIDQKKyNFTlVNIFRYT1BBX0lEWCAgNgorI0VOVU0gQ1dNSU5CX0lEWCA3CisjRU5VTSBDV01BWEJfSURYIDkKKyNFTlVNIFRYT1BCX0lEWCAgMTEKKyNFTlVNIENXTUlOR19JRFggMTIKKyNFTlVNIENXTUFYR19JRFggMTQKKyNFTlVNIFRYT1BHX0lEWCAgMTYKKworCisqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUHJvZmlsZSAwIChBaXJnbykgcGFyYW1ldGVycyAtIEFDX0JLIExvY2FsCisqIEFDTSwgQUlGU04sIFtDV21pbkgsIENXbWluTCwgQ1dtYXhILCBDV21heEwsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTCAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAzMSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAzMSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorCisqCisqIFByb2ZpbGUgMCAoQWlyZ28pIHBhcmFtZXRlcnMgQUNfQkUgTG9jYWwKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAxNSAgMyAyNTUgIDEwMCAgICAwIDMxICAzIDI1NSAgMTAwICAgMCAxNSAgMyAyNTUgIDEwMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgMTUgIDMgMjU1ICAxMDAgICAgMCAzMSAgMyAyNTUgIDEwMCAgIDAgMTUgIDMgMjU1ICAxMDAKKworKgorKiBQcm9maWxlIDAgKEFpcmdvKSBwYXJhbWV0ZXJzIEFDX1ZJIExvY2FsCisqIEFDTSwgQUlGU04sIFtDV21pbiwgQ1dtYXgsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9BTklfQUNWSV9MT0NBTCAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgNyAgMCAxNSAgMjAwICAgMCAxNSAgMCAzMSAgMTg4ICAgMCA3ICAwIDE1ICAyMDAKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDIgICAwIDcgIDAgMTUgIDIwMCAgIDAgMTUgIDAgMzEgIDE4OCAgIDAgNyAgMCAxNSAgMjAwCisKKyoKKyogUHJvZmlsZSAwIChBaXJnbykgcGFyYW1ldGVycyBBQ19WTyBMb2NhbAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfQU5JX0FDVk9fTE9DQUwgICBTICAgMjAgIDgKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDIgICAwIDMgIDAgNyAgMTAwICAgMCA3ICAwIDE1ICAxMDIgICAwIDMgIDAgNyAgMTAwCitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAzICAwIDcgIDEwMCAgIDAgNyAgMCAxNSAgMTAyICAgMCAzICAwIDcgIDEwMAorCisqCisqIFByb2ZpbGUgMCAoQWlyZ28pIHBhcmFtZXRlcnMgLSBBQ19CSyBCcm9hZGNhc3QKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX0FOSV9BQ0JLICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCA3ICAgMCAxNSAgMyAyNTUgIDAgICAwIDMxICAzIDI1NSAgMCAgIDAgMTUgIDMgMjU1ICAwCitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCA3ICAgMCAxNSAgMyAyNTUgIDAgICAwIDMxICAzIDI1NSAgMCAgIDAgMTUgIDMgMjU1ICAwCisKKyoKKyogUHJvZmlsZSAwIChBaXJnbykgcGFyYW1ldGVycyBBQ19CRSBCcm9hZGNhc3QKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX0FOSV9BQ0JFICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAxNSAgMyAyNTUgIDEwMCAgIDAgMzEgIDMgMjU1ICAxMDAgICAwIDE1ICAzIDI1NSAgMTAwCitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAxNSAgMyAyNTUgIDEwMCAgIDAgMzEgIDMgMjU1ICAxMDAgICAwIDE1ICAzIDI1NSAgMTAwCisKKyoKKyogUHJvZmlsZSAwIChBaXJnbykgcGFyYW1ldGVycyBBQ19WSSBCcm9hZGNhc3QKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX0FOSV9BQ1ZJICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCA3ICAwIDE1ICAyMDAgICAwIDE1ICAwIDMxICAxODggICAwIDcgIDAgMTUgIDIwMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgNyAgMCAxNSAgMjAwICAgMCAxNSAgMCAzMSAgMTg4ICAgMCA3ICAwIDE1ICAyMDAKKworKgorKiBQcm9maWxlIDAgKEFpcmdvKSBwYXJhbWV0ZXJzIEFDX1ZPIEJyb2FkY2FzdAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfQU5JX0FDVk8gICBTICAgMjAgIDgKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDIgICAwIDMgIDAgNyAgMTAwICAgMCA3ICAwIDE1ICAxMDIgICAwIDMgIDAgNyAgMTAwCitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAzICAwIDcgIDEwMCAgIDAgNyAgMCAxNSAgMTAyICAgMCAzICAwIDcgIDEwMAorCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQcm9maWxlIDEgKFdNRSkgcGFyYW1ldGVycyAtIEFDX0JLIExvY2FsCisqIEFDTSwgQUlGU04sIFtDV21pbiwgQ1dtYXgsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9XTUVfQUNCS19MT0NBTCAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAzMSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAxNSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorCisKKyoKKyogUHJvZmlsZSAxIChXTUUpIHBhcmFtZXRlcnMgQUNfQkUgTG9jYWwKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX1dNRV9BQ0JFX0xPQ0FMICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAzICAgMCAxNSAgMCA2MyAgMCAgIDAgMzEgIDMgMjU1ICAwICAgMCAxNSAgMCA2MyAgMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMyAgIDAgMTUgIDAgNjMgIDAgICAwIDE1ICAwIDYzICAwICAgMCAxNSAgMCA2MyAgMAorCisqCisqIFByb2ZpbGUgMSAoV01FKSBwYXJhbWV0ZXJzIEFDX1ZJIExvY2FsCisqIEFDTSwgQUlGU04sIFtDV21pbiwgQ1dtYXgsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9XTUVfQUNWSV9MT0NBTCAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMSAgMCA3ICAwIDE1ICA5NCAgMCA3ICAwIDE1ICAxODggICAwIDcgIDAgMTUgIDk0CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAxICAwIDcgIDAgMTUgIDk0ICAwIDcgIDAgMTUgIDE4OCAgIDAgNyAgMCAxNSAgOTQKKworKgorKiBQcm9maWxlIDEgKFdNRSkgcGFyYW1ldGVycyBBQ19WTyBMb2NhbAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfV01FX0FDVk9fTE9DQUwgICBTICAgMjAgIDgKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDEgICAwIDMgIDAgNyAgNDcgICAwIDMgIDAgNyAgMTAyICAgMCAzICAwIDcgIDQ3CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAxICAgMCAzICAwIDcgIDQ3ICAgMCAzICAwIDcgIDEwMiAgIDAgMyAgMCA3ICA0NworCisqCisqIFByb2ZpbGUgMSAoV01FKSBwYXJhbWV0ZXJzIC0gQUNfQksgQnJvYWRjYXN0CisqIEFDTSwgQUlGU04sIFtDV21pbiwgQ1dtYXgsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9XTUVfQUNCSyAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAxNSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgMTUgIDMgMjU1ICAwICAgMCAxNSAgMyAyNTUgIDAgICAwIDE1ICAzIDI1NSAgMAorCisqCisqIFByb2ZpbGUgMSAoV01FKSBwYXJhbWV0ZXJzIEFDX0JFIEJyb2FkY2FzdAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfV01FX0FDQkUgICBTICAgMjAgIDgKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDMgICAwIDE1ICAzIDI1NSAgMCAgIDAgMTUgIDMgMjU1ICAwICAgMCAxNSAgMyAyNTUgIDAKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDMgICAwIDE1ICAzIDI1NSAgMCAgIDAgMTUgIDMgMjU1ICAwICAgMCAxNSAgMyAyNTUgIDAKKworKgorKiBQcm9maWxlIDEgKFdNRSkgcGFyYW1ldGVycyBBQ19WSSBCcm9hZGNhc3QKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX1dNRV9BQ1ZJICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCA3ICAwIDE1ICA5NCAgIDAgNyAgMCAxNSAgMTg4ICAgMCA3ICAwIDE1ICA5NAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgNyAgMCAxNSAgOTQgICAwIDcgIDAgMTUgIDE4OCAgIDAgNyAgMCAxNSAgOTQKKworKgorKiBQcm9maWxlIDEgKFdNRSkgcGFyYW1ldGVycyBBQ19WTyBCcm9hZGNhc3QKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX1dNRV9BQ1ZPICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCAzICAwIDcgIDQ3ICAgMCAzICAwIDcgIDEwMiAgIDAgMyAgMCA3ICA0NworViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgMyAgMCA3ICA0NyAgIDAgMyAgMCA3ICAxMDIgICAwIDMgIDAgNyAgNDcKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFByb2ZpbGUgMihUaXRhbiBEZW1vKSBwYXJhbWV0ZXJzIC0gQUNfQksgTG9jYWwKKyogQUNNLCBBSUZTTiwgW0NXbWluSCwgQ1dtaW5MLCBDV21heEgsIENXbWF4TCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX1RJVF9ERU1PX0FDQktfTE9DQUwgICBTICAgMjAgIDgKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDcgICAwIDggIDAgMjU1ICAyMDAgICAwIDMxICAwIDI1NSAgMjAwICAgMCA4ICAwIDI1NSAgMjAwCitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCA3ICAgMCA4ICAwIDI1NSAgMjAwICAgMCAzMSAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMAorCisqCisqIFByb2ZpbGUgMihUaXRhbiBEZW1vKSBwYXJhbWV0ZXJzIEFDX0JFIExvY2FsCisqIEFDTSwgQUlGU04sIFtDV21pbiwgQ1dtYXgsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9USVRfREVNT19BQ0JFX0xPQ0FMICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCA4ICAwIDI1NSAgMjAwICAgIDAgMzEgIDAgMjU1ICAyMDAgICAwIDggIDAgMjU1ICAyMDAKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDIgICAwIDggIDAgMjU1ICAyMDAgICAgMCAzMSAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMAorCisqCisqIFByb2ZpbGUgMihUaXRhbiBEZW1vKSBwYXJhbWV0ZXJzIEFDX1ZJIExvY2FsCisqIEFDTSwgQUlGU04sIFtDV21pbiwgQ1dtYXgsIFR4T3BdLTExQS8xMUIvMTFHCisqCisKK1dOSV9DRkdfRURDQV9USVRfREVNT19BQ1ZJX0xPQ0FMICAgUyAgIDIwICA4CitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCA4ICAwIDI1NSAgMjAwICAgMCA4ICAwIDI1NSAgMjAwICAgMCA4ICAwIDI1NSAgMjAwCitWICAgUlcgIE5QIFJFU1RBUlQKK05PTkUKKzE3ICAgMCAyICAgMCA4ICAwIDI1NSAgMjAwICAgMCA4ICAwIDI1NSAgMjAwICAgMCA4ICAwIDI1NSAgMjAwCisKKyoKKyogUHJvZmlsZSAyKFRpdGFuIERlbW8pIHBhcmFtZXRlcnMgQUNfVk8gTG9jYWwKKyogQUNNLCBBSUZTTiwgW0NXbWluLCBDV21heCwgVHhPcF0tMTFBLzExQi8xMUcKKyoKKworV05JX0NGR19FRENBX1RJVF9ERU1PX0FDVk9fTE9DQUwgICBTICAgMjAgIDgKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDIgICAwIDggIDAgMjU1ICAyMDAgICAwIDggIDAgMjU1ICAyMDAgICAwIDggIDAgMjU1ICAyMDAKK1YgICBSVyAgTlAgUkVTVEFSVAorTk9ORQorMTcgICAwIDIgICAwIDggIDAgMjU1ICAyMDAgICAwIDggIDAgMjU1ICAyMDAgICAwIDggIDAgMjU1ICAyMDAKKworKgorKiBQcm9maWxlIDIoVGl0YW4gRGVtbykgcGFyYW1ldGVycyAtIEFDX0JLIEJyb2FkY2FzdAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNCSyAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgNyAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMAorCisqCisqIFByb2ZpbGUgMihUaXRhbiBEZW1vKSBwYXJhbWV0ZXJzIEFDX0JFIEJyb2FkY2FzdAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNCRSAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMAorCisqCisqIFByb2ZpbGUgMihUaXRhbiBEZW1vKSBwYXJhbWV0ZXJzIEFDX1ZJIEJyb2FkY2FzdAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNWSSAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMAorCisqCisqIFByb2ZpbGUgMihUaXRhbiBEZW1vKSBwYXJhbWV0ZXJzIEFDX1ZPIEJyb2FkY2FzdAorKiBBQ00sIEFJRlNOLCBbQ1dtaW4sIENXbWF4LCBUeE9wXS0xMUEvMTFCLzExRworKgorCitXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNWTyAgIFMgICAyMCAgOAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMAorViAgIFJXICBOUCBSRVNUQVJUCitOT05FCisxNyAgIDAgMiAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMCAgIDAgOCAgMCAyNTUgIDIwMAorCisqCisqIFJhZGFyIGRldGVjdG9yIGZsYWcgZW5hYmxlL2Rpc2FibGUKKyoKKworV05JX0NGR19SREVUX0ZMQUcgICBJICAgNCAgIDkKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMAorCisjRU5VTSBFTkFCTEUgIDEKKyNFTlVNIERJU0FCTEUgMAorCitXTklfQ0ZHX1JBREFSX0NIQU5ORUxfTElTVCAgICBTICAgIDIwICAgIDgKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTk9ORQorMTUgICA1MiA1NiA2MCA2NCAxMDAgMTA0IDEwOCAxMTIgMTE2IDEyMCAxMjQgMTI4IDEzMiAxMzYgMTQwCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzE1ICAgNTIgNTYgNjAgNjQgMTAwIDEwNCAxMDggMTEyIDExNiAxMjAgMTI0IDEyOCAxMzIgMTM2IDE0MAorCisqCisqIExvY2FsIFBvd2VyIENvbnN0cmFpbnQgKGRCbSkKKyoKKworV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5UICAgIEkgICAgNCAgICAxMgorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDI1NSAgICAwCitWICAgIFJXICAgIE5QIFJFU1RBUlQKK05PTkUKKzAgICAgMjU1ICAgIDAKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogQWRtaXNzaW9uIENvbnRyb2wgUG9saWN5CisqIHVzZWQgZm9yIGFkbWl0dGluZyB0c3BlYydzIHdoZW4gZWl0aGVyIGVkY2Egb3IgaGNjYSBhcmUgaW4gdXNlCisqCisKK1dOSV9DRkdfQURNSVRfUE9MSUNZICBJICAgNCAgIDgKK1YgIFJXICBOUCAgUkVTVEFSVAorTk9ORQorMCAgMiAgIDAKK1YgIFJXICBOUAorU0NICiswICAyICAgMAorCisjRU5VTSAgQURNSVRfQUxMICAgMAorI0VOVU0gIFJFSkVDVF9BTEwgIDEKKyNFTlVNICBCV19GQUNUT1IgICAyCisKKyoKKyogT3ZlcnN1YnNjcmlwdGlvbiBmYWN0b3IgZm9yIGFkbWlzc2lvbiBjb250cm9sCisqIHZhbGlkIG9ubHkgd2hlbiBhZG1pdCBwb2xpY3kgaXMgc2V0IHRvIEJXX0ZBQ1RPUgorKiB1bml0cyBhcmUgaW4gdGVybXMgb2YgMS8xMHRoIG9mIGF2YWlsYWJsZSBiYW5kd2lkdGgKKyoKKworV05JX0NGR19BRE1JVF9CV0ZBQ1RPUiAgSSAgIDQgICA4CitWICBSVyAgTlAgIFJFU1RBUlQKK05PTkUKKzAgIDEwMCAgIDIwCitWICBSVyAgTlAKK1NDSAorMCAgMTAwICAgMjAKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTnVtYmVyIG9mICJjb25zZWN1dGl2ZSIgQmFja2dyb3VuZCBTY2FuIEZhaWx1cmUgbmVlZGVkCisqIGJlZm9yZSBMSU0gaXMgZm9yY2VkIHRvIHBlcmZvcm0gMSBhZ2dyZXNzaXZlIGJhY2tncm91bmQgc2NhbgorKgorV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkUgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK05PTkUKKzAgICAgMjU2ICAgIDYwCitWICAgIFJXICAgIE5QICBSRVNUQVJUCitOT05FCiswICAgIDI1NiAgICA2MAorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRmVhdHVyZTogICBDaGFubmVsIEJvbmRpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogIEdsb2JhbCBmbGFnIHRvIGVuYWJsZS9kaXNhYmxlIENoYW5uZWwgQm9uZGluZworKiAgMCAtIERpc2FibGU6ICAgICAgIEZvcmNlIGRpc2FibGUgY2hhbm5lbCBib25kaW5nIGZvciBhbGwgVEMtaWRzCisqICAxIC0gRW5hYmxlOiAgICAgICAgRm9yY2UgZW5hYmxlIGNoYW5uZWwgYm9uZGluZyBmb3IgYWxsIFRDLWlkcworKiAgMiAtIG5vIGxlZ2FjeSBic3M6IEVuYWJsZSBjaGFubmVsIGJvbmRpbmcgaWYgbm8gbGVnYWN5IEJTUyBhcmUgcHJlc2VudAorKiAgMyAtIG5vIGxlZ2FjeSBhbGw6IEVuYWJsZSBjaGFubmVsIGJvbmRpbmcgaWYgbm8gbGVnYWN5IEJTUyBvciBkZXZpY2VzIGFyZSBwcmVzZW50CisqICA0IC0gaW50ZWxsaWdlbnQ6ICAgRW5hYmxlIGNoYW5uZWwgYm9uZGluZyBkZXBlbmRpbmcgb24gbG9hZCBsZXZlbCBvbiBzZWNvbmRhcnkgY2hhbm5lbAorKgorV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDQgICAgIDAKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDQgICAgIDAKKworI0VOVU0gRElTQUJMRSAgICAgICAgICAwCisjRU5VTSBFTkFCTEUgICAgICAgICAgIDEKKyNFTlVNIElGX05PX0xFR0FDWV9CU1MgMgorI0VOVU0gSUZfTk9fTEVHQUNZX0FMTCAzCisjRU5VTSBJTlRFTExJR0VOVCAgICAgIDQKKworCisqCisqICBXaGVuIHRoZSBjaGFubmVsIGlzIDQwTUh6IHdpZGUsIHRoaXMgQ0ZHIGluZGljYXRlcworKiAgaWYgdGhlIHNlY29uZGFyeSBjaGFubmVsIGlzIGxvY2F0ZWQgYWJvdmUgKGF0CisqICBhIGhpZ2hlciBmcmVxdWVuY3kpLCBvciBsb2NhdGVkIGJlbG93IChhdCBhIAorKiAgbG93ZXIgZnJlcXVlbmN5KS4gCisqCisqICAwIC0gVGhlcmUgaXMgbm8gc2Vjb25kYXJ5IGNoYW5uZWwuIFRoZSBjaGFubmVsIGlzIDIwTWh6CisqICAxIC0gTE9XRVI6ICBTZWNvbmRhcnkgY2hhbm5lbCBpcyBsb2NhdGVkIGJlbG93IHRoZSBwcmltYXJ5IGNoYW5uZWwKKyogIDIgLSBISUdIRVI6IFNlY29uZGFyeSBjaGFubmVsIGlzIGxvY2F0ZWQgYWJvdmUgdGhlIHByaW1hcnkgY2hhbm5lbCAgIAorKgorV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURSAgICBJICAgIDQgICAgMTIKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMiAgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAyICAgICAwCisKKyNFTlVNIE5PTkUgICAgICAgICAgICAgMAorI0VOVU0gTE9XRVIgICAgICAgICAgICAxCisjRU5VTSBISUdIRVIgICAgICAgICAgIDIKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZlYXR1cmU6ICAgRHluYW1pYyBSZXRyeSBSYXRlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgV2hlbiB0aGUgc2hvcnQvbG9uZyByZXRyeSBjb3VudCByZWFjaCB0aGUKKyogIGFkYXB0aXZlX3JldHJ5X3RocmVzaG9sZCgwKSwgdGhlbiB0aGUgcmV0cnkwCisqICB0ZW1wbGF0ZSBzaGFsbCBiZSB1c2VkCisqCitXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk8gICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICAyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICAyCisKKyoKKyogIFdoZW4gdGhlIHNob3J0L2xvbmcgcmV0cnkgY291bnQgcmVhY2ggdGhlCisqICBhZGFwdGl2ZV9yZXRyeV90aHJlc2hvbGQoMSksIHRoZW4gdGhlIHJldHJ5MQorKiAgdGVtcGxhdGUgc2hhbGwgYmUgdXNlZAorKgorV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9PTkUgICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA0CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA0CisKKyoKKyogIFdoZW4gdGhlIHNob3J0L2xvbmcgcmV0cnkgY291bnQgcmVhY2ggdGhlCisqICBhZGFwdGl2ZV9yZXRyeV90aHJlc2hvbGQoMiksIHRoZW4gdGhlIHJldHJ5MgorKiAgdGVtcGxhdGUgc2hhbGwgYmUgdXNlZAorKgorV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV08gICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA2CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU1ICAgICA2CisKKworKgorKiAgVHJpZ2dlciBTdGF0aW9uIEJhY2tncm91bmQgU2NhbiBGbGFnCisqCitXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU4gICAgSSAgICA0ICAgIDEyCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAxCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNvbnRyb2wgb2YgZHluYW1pYyBFRENBIHBhcmFtZXRlciBwcm9maWxlIHN3aXRjaGluZworKgorKiBPT0IsIHdlIHdvdWxkIGxpa2UgdG8gc3VwcG9ydCBXTU0gc3RhbmRhcmQgZWRjYSBwcm9maWxlCisqIEhvd2V2ZXIsIHdoZW4gQWlyZ28gU1RBJ3Mgam9pbiB0aGUgQlNTLCB3ZSB3b3VsZCBsaWtlCisqIHRvIHN3aXRjaCB0aGUgcHJvZmlsZSB0byBBaXJnbyBoaWdoLXBlcmZvcm1hbmNlICBlZGNhIHBhcmFtZXRlcnMKKyoKKyogVGhpcyBjZmcgc3VwcG9ydHMgdGhhdCBiZWhhdmlvdXIuIEl0IGlzIHVzZWQgb25seSBpZiAxMWUgcW9zCisqIGhhcyBiZWVuIGVuYWJsZWQgYW5kIGlzIGlnbm9yZWQgb3RoZXJ3aXNlLgorKgorKiBXaGVuIHNldCB0byBhbnkgdmFsdWUgKG90aGVyIHRoYW4gdW51c2VkKSwgaXQgZGV0ZXJtaW5lcyB0aGUKKyogZWRjYSBwcm9maWxlIHRvIHN3aXRjaCB0byB3aGVuIGFuIEFpcmdvIFNUQSBqb2lucyB0aGUgQlNTLgorKgorKiBCeSBkZWZhdWx0LCB3ZSBjaG9vc2UgdG8gc3dpdGNoIHRvIEFpcmdvIHByb2ZpbGUuCisqCisqIE5PVEU6IFRoaXMgcGFyYW1ldGVyIGFwcGxpZXMgb25seSB0byBhbiBBUAorKgorCitXTklfQ0ZHX0RZTkFNSUNfUFJPRklMRV9TV0lUQ0hJTkcgICAgSSAgIDQgICA4CitWICAgUlcgIE5QICBSRVNUQVJUCitOT05FCiswICAgMjU1ICAgMjU1CitWICAgUlcgIE5QICAgUkVTVEFSVAorTk9ORQorMCAgIDI1NSAgIDEKKworI0VOVU0gIFVOVVNFRCAyNTUKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogU2NhbiBjb250cm9sIGxpc3QKKyogICBDb250YWlucyBwYWlycyBvZiB7Y2hhbm5lbE51bWJlciwgYWN0aXZlU2NhbkFsbG93ZWRGbGFnfQorKiAgIHdoZXJlIHNjYW5UeXBlID0gMSBpbmRpY2F0ZXMgYWN0aXZlIHNjYW4gaXMgIGFsbG93ZWQsIGFuZAorKiAgICAgICAgICAgICAgICAgID0gMCBpbmRpY2F0ZXMgcGFzc2l2ZSBzY2FuIGlzIHVzZWQKKyogICBJZiBhIGNoYW5uZWwgaXMgbm90IG9uIHRoaXMgbGlzdCwgYWN0aXZlIHNjYW4gaXMgTk9UIGFsbG93ZWQuIFNvIGl0IGlzCisqICAgc3VmZmljaWVudCB0byBpbmx1ZGUgb25seSB0aG9zZSBjaGFubmVscyB3aGVyZSBhY3RpdmUgc2NhbiBpcyBhbGxvd2VkCisqICAgb24gdGhpcyBsaXN0LgorKgorKiAgIFRoZSBsaXN0IGRldGVybWluZXMgb25seSB3aGV0aGVyIGFjdGl2ZSBzY2FuIGlzIGFsbG93ZWQgb3Igbm90OyBpdCBkb2VzIG5vdAorKiAgIGRldGVybWluZSB3aGljaCB0eXBlIG9mIHNjYW4gaXMgYWN0dWFsbHkgcGVyZm9ybWVkLgorKgorCitXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNUICAgIFMgICAgMTI4ICAgIDgKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTElNCisxMTIgICAxIDEgMiAxIDMgMSA0IDEgNSAxIDYgMSA3IDEgOCAxIDkgMSAxMCAxIDExIDEgMTIgMSAxMyAxIDE0IDEgMzQgMSAzNiAxIDM4IDEgNDAgMSA0MiAxIDQ0IDEgNDYgMSA0OCAxIDUwIDEgNTIgMCA1NCAwIDU2IDAgNTggMCA2MCAwIDYyIDAgNjQgMCAxMDAgMCAxMDQgMCAxMDggMCAxMTIgMCAxMTYgMCAxMjAgMCAxMjQgMCAxMjggMCAxMzIgMCAxMzYgMCAxNDAgMCAxNDkgMSAxNTEgMSAxNTMgMSAxNTUgMSAxNTcgMSAxNTkgMSAxNjEgMSAxNjUgMSAyNDAgMSAyNDIgMSAyNDQgMSAyNDYgMSAyNDggMSAyNTAgMSAyNTIgMQorViAgICBSVyAgICBOUCBSRVNUQVJUCitMSU0KKzExMiAgIDEgMSAyIDEgMyAxIDQgMSA1IDEgNiAxIDcgMSA4IDEgOSAxIDEwIDEgMTEgMSAxMiAxIDEzIDEgMTQgMSAzNCAxIDM2IDEgMzggMSA0MCAxIDQyIDEgNDQgMSA0NiAxIDQ4IDEgNTAgMSA1MiAwIDU0IDAgNTYgMCA1OCAwIDYwIDAgNjIgMCA2NCAwIDEwMCAwIDEwNCAwIDEwOCAwIDExMiAwIDExNiAwIDEyMCAwIDEyNCAwIDEyOCAwIDEzMiAwIDEzNiAwIDE0MCAwIDE0OSAxIDE1MSAxIDE1MyAxIDE1NSAxIDE1NyAxIDE1OSAxIDE2MSAxIDE2NSAxIDI0MCAxIDI0MiAxIDI0NCAxIDI0NiAxIDI0OCAxIDI1MCAxIDI1MiAxCisKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE1JTU8gcmF0ZXMgZW5hYmxlZCAoZm9yIHJhdGUgYWRhcHRhdGlvbiwgdG8gc3RhcnQpCisqCisKK1dOSV9DRkdfTUlNT19FTkFCTEVEICAgSSAgIDQgICA5CitWICAgIFJXICAgIE5QIFJFTE9BRAorTk9ORQorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAgUkVMT0FECitOSU0KKzAgICAgMSAgICAxCisKKyNFTlVNIEVOQUJMRSAgMQorI0VOVU0gRElTQUJMRSAwCisKKworCisqCisqIEJMT0NLIEFDSyBFbmFibGVkIChjaGFuZ2UgcmVxdWlyZXMgcmVzdGFydCkKKyogIGNoYW5nZSBkZWZhdWx0IHRvIE9OCisqICAgYml0IDAJPT0+IGRlbGF5ZWQgQkEKKyogICBiaXQgMQk9PT4gaW1tZWRpYXRlIEJBCitXTklfQ0ZHX0JMT0NLX0FDS19FTkFCTEVEICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIFJFU1RBUlQKK0xJTQorMCAgICAzICAgIDAKK1YgICAgUlcgICAgTlAgUkVTVEFSVAorTElNCiswICAgIDMgICAgMAorCisjRU5VTSBERUxBWUVEIDAKKyNFTlVNIElNTUVESUFURSAxCisKKworKgorKkJBIEFjdGl2aXR5IGNoZWNrIGdsb2JhbCB0aW1lcgorKgorV05JX0NGR19CQV9BQ1RJVklUWV9DSEVDS19USU1FT1VUICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMTAwMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDEwMDAKKworCisqCisqIFJ4IFNUQkMgc3VwcG9ydAorKgorV05JX0NGR19IVF9SWF9TVEJDICBJCTQgICA3CitWICAgIFJXICAgIE5QICAgUkVTVEFSVAorTElNIAorMCAgCTMgCTEKK1YgICAgUlcgICAgTlAgICBSRVNUQVJUCitMSU0gCiswICAJMyAJMQorCisKKyoKKyogMS4gSFQgY2FwYWJpbGl0aWVzIEluZm86IDIgYnl0ZXMgc2l6ZQorKgorKiBTdXBwb3J0ZWQgY2hhbm5lbCBXaWR0aCBpcyBzZXQgdG8gMSAoNDAgTWh6KQorKiBTTSBQb3dlciBTYXZlIGlzIGRpc2FibGVkLgorKiBHcmVlbkZpZWxkIHN1cHBvcnQgaXMgZW5hYmxlZC4KKyogU2hvcnQgR0kgZm9yIDIwIGFuZCA0ME1oeiBpcyBlbmFibGVkLgorKiBNYXggQU1TRFUgU2l6ZSBpcyBzZXQgdG8gMCgzODM5IE9jdGV0cykKKyogRFNTUy1DQ0sgTW9kZSBpcyBlbmFibGVkLgorKiBMU0lHIFRYT1AgUHJvdGVjdGlvbiBpcyBkaXNhYmxlZAorKiBSZXN0IG9mIHRoZSBmZWF0dXJlcyBhcmUgbm90IHN1cHBvcnRlZCBhdCB0aGlzIG1vbWVudC4KKyoKKyogZmVkYyBiYTk4IDc2NTQgMzIxMAorKiAwMDAwIDAwMDEgMDAxMCAwMDAwCisqCitXTklfQ0ZHX0hUX0NBUF9JTkZPICAgSSAgICA0ICAgIDEwCitWICAgIFJXICAgIE5QICAgICAgIFJFU1RBUlQKK0xJTQorMCAgICAweGZmZmYgICAgMHgwMTZjCitWICAgIFJXICAgIE5QICAgICAgIFJFU1RBUlQKK0xJTQorMCAgICAweGZmZmYgICAgMHgxMDZlCisKKyNFTlVNIEFEVkFOQ0VfQ09ESU5HICAgICAgICAgICAgMAorI0VOVU0gU1VQUE9SVEVEX0NIQU5fV0lEVEhfU0VUICAxCisjRU5VTSBTTV9QT1dFUl9TQVZFICAgICAgICAgICAgIDIKKyNFTlVNIEdSRUVOX0ZJRUxEICAgICAgICAgICAgICAgNAorI0VOVU0gU0hPUlRfR0lfMjBNSFogICAgICAgICAgICA1CisjRU5VTSBTSE9SVF9HSV80ME1IWiAgICAgICAgICAgIDYKKyNFTlVNIFRYX1NUQkMgICAgICAgICAgICAgICAgICAgNworI0VOVU0gUlhfU1RCQyAgICAgICAgICAgICAgICAgICA4CisjRU5VTSBERUxBWUVEX0JBICAgICAgICAgICAgICAgMTAKKyNFTlVNIE1BWF9BTVNEVV9TSVpFICAgICAgICAgICAxMQorI0VOVU0gRFNTU19DQ0tfTU9ERV80ME1IWiAgICAgIDEyCisjRU5VTSBQU01QICAgICAgICAgICAgICAgICAgICAgMTMKKyNFTlVNIFNUQkNfQ09OVFJPTF9GUkFNRSAgICAgICAxNAorI0VOVU0gTFNJR19UWE9QX1BST1RFQ1RJT04gICAgIDE1CisKKyoKKyogMi4gSFQgUGFyYW1ldGVycyBJbmZvOiAxIGJ5dGUgc2l6ZQorKgorKiBNYXggQU1QRFUgUnggRmFjdG9yIGlzIGRlZmluZWQgdXNpbmcgYml0ICMwIGFuZCAjMQorKiBNUERVIERlbnNpdHkgaXMgZGVmaW5lZCB1c2luZyBiaXQgIzIgdGhydSAjNC4KKyogVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSwKKyogNzY1NCAzMjEwCisqIDAwMDAgMDAxMCAgLS0+IDIgZm9yIFJYIEFNUERVIEZhY3RvciwgMCBmb3IgTVBEVSBkZW5zaXR5CisqCitXTklfQ0ZHX0hUX0FNUERVX1BBUkFNUyAgICBJICAgNCAgIDcKK1YgICAgUlcgICBOUCAgICAgICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZiAgICAweDAwCitWICAgIFJXICAgTlAgICAgICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmYgICAgMHgwMgorCisjRU5VTSBNQVhfUlhfQU1QRFVfRkFDVE9SICAgICAgICAwCisjRU5VTSBNUERVX0RFTlNJVFkgICAgICAgICAgICAgICAyCisjRU5VTSBSRVNFUlZFRCAgICAgICAgICAgICAgICAgICA1CisKKyoKKyogMy4gU3VwcG9ydGVkIE1DUyBTZXQ6IDE2IGJ5dGVzIHNpemUKKyoKKyogTUNTICMwLTE1IGFuZCAjMzIgaXMgc3VwcG9ydGVkLgorKgorV05JX0NGR19TVVBQT1JURURfTUNTX1NFVCAgICBTICAgIDE2ICAgIDcKK1YgICAgUlcgICAgUCAgICBSRVNUQVJUCitMSU0KKzE2IDI1NSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAorViAgICBSVyAgICBQICAgIFJFU1RBUlQKK0xJTQorMTYgMjU1IDI1NSAwIDAgMSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKKworKgorKiA0LiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbzogMiBieXRlcyBzaXplCisqCisqIE9ubHkgSFRDIFN1cHBvcnQgaXMgZW5hYmxlZCwgcmVzdCBhbGwgZmVhdHVyZXMgYXJlIG5vdAorKiBzdXBwb3J0ZWQgYXQgdGhpcyBtb21lbnQuCisqCisqIGZlZGMgYmE5OCA3NjU0IDMyMTAKKyogMDAwMCAwMTAwIDAwMDAgMDAwMAorKgorV05JX0NGR19FWFRfSFRfQ0FQX0lORk8gICAgSSAgICA0ICAgIDEwCitWICAgIFJXICAgUCAgICAgICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZmZmICAgIDB4MDQwMAorViAgICBSVyAgIFAgICAgICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmZmZiAgICAweDA0MDAKKworI0VOVU0gUENPICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNFTlVNIFRSQU5TSVRJT05fVElNRSAgICAgIDEKKyNFTlVNIFJFU0VSVkVEMSAgICAgICAgICAgICAgICAzCisjRU5VTSBNQ1NfRkVFREJBQ0sgICAgICAgICAgOAorI0VOVU0gSFRDX1NVUFBPUlQgICAgICAgICAgICAxMAorI0VOVU0gUkRfUkVTUE9OREVSICAgICAgICAgICAxMQorI0VOVU0gUkVTRVJWRUQyICAgICAgICAgICAgICAgIDEyCisKKworKgorKiA1LiBUcmFuc21pdCBCZWFtIEZvcm1pbmcgQ2FwYWJpbGlyaWVzIEluZm86IDQgYnl0ZXMgc2l6ZQorKgorV05JX0NGR19UWF9CRl9DQVAgICAgSSAgIDQgICA3CitWICAgIFJPICAgTlAgICAgICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZmZmZmZmZiAgICAweDAwMDAwMDAwCitWICAgIFJPICAgTlAgICAgICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZmZmZmZmZiAgICAweDAwMDAwMDAwCisKKyoKKyogNi4gQW50ZW5uYSBTZWxlY3Rpb24gQ2FwYWJpbGl0aWVzOiAxIGJ5dGUgc2l6ZQorKgorV05JX0NGR19BU19DQVAgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICBQICAgICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmYgICAgMHgwMAorViAgICBSVyAgIFAgICAgICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZiAgICAweDAwCisKKyNFTlVNIEFOVEVOTkFfU0VMRUNUSU9OICAgICAgICAgICAgMAorI0VOVU0gRVhQTElDSVRfQ1NJX0ZFRURCQUNLX1RYICAgICAxCisjRU5VTSBBTlRFTk5BX0lORElDRVNfRkVFREJBQ0tfVFggIDIKKyNFTlVNIEVYUExJQ0lUX0NTSV9GRUVEQkFDSyAgICAgICAgMworI0VOVU0gQU5URU5OQV9JTkRJQ0VTX0ZFRURCQUNLICAgICA0CisjRU5VTSBSWF9BUyAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNFTlVNIFRYX1NPVU5ESU5HX1BQRFVTICAgICAgICAgICAgNgorI0VOVU0gUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICA3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBCZWFjb24gIEhUIChIaWdoIFRocm91Z2gpIEluZm8gSUUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAzLiBIVCBJbmZvIEZpZWxkMTogMSBieXRlIHNpemUuCisqCisqIFNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBpcyBzZXQgdG8gMyAoRG93bikgYnkgZGVmYXVsdCBhbmQgd2lsbAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVwZGF0ZWQgZHluYW1pY2FsbHkgYnkgREZTIGFsZ29yaXRobS4KKyogQ2hhbm5lbCBXaWR0aCBpcyBzZXQgdG8gMSAoNDAgTWh6KQorKiBSSUZTIE1vZGUgaXMgZW5hYmxlZAorKiBSZXN0IG9mIHRoZSBmZWF0dXJlcyBhcmUgbm90IHN1cHBvcnRlZCBhdCB0aGlzIG1vbWVudC4KKyoKKyogNzY1NCAzMjEwCisqIDAwMDAgMTExMQorKgorV05JX0NGR19IVF9JTkZPX0ZJRUxEMSAgICBJICAgIDQgICAgMTAKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmYgICAgMHgwZgorViAgICBSVyAgICBOUCAgICBSRVNUQVJUCitMSU0KKzAgICAgMHhmZiAgICAweDBmCisKKyNFTlVNIFNFQ09OREFSWV9DSEFOTkVMX09GRlNFVCAgICAgICAwCisjRU5VTSBSRUNPTU1FTkRFRF9DSEFOTkVMX1dJRFRIICAgICAgIDIKKyNFTlVNIFJJRlNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAzCisjRU5VTSBQU01QX0FDQ0VTU19PTkxZICAgICAgICAgIDQKKyNFTlVNIFNFUlZJQ0VfSU5URVJWQUxfR1JBTlVMQVJJVFkgICA1CisKKyoKKyogNC4gIEhUIEluZm8gRmllbGQyOiAyIGJ5dGVzCisqCisqIE9wZXJhdGlvbiBtb2RlIGlzIHNldCB0byAwKFB1cmUsIEdGKSB0byBiZWdpbiB3aXRoIGFuZAorKiAgICAgICAgICAgICAgICAgd2lsbCBiZSB1cGRhdGVkIGR5bmFtaWNhbGx5LgorKiAnTm9uR0YgRGV2aWNlcyBwcmVzZW50IGlzIGFsc28gc2V0IHRvIHplcm8gYW5kCisqICAgICAgICAgICAgICAgICB3aWxsIGJlIHVwZGF0ZWQgZHluYW1pY2FsbHkuCisqCisqIGZlZGMgYmE5OCA3NjU0IDMyMTAKKyogMDAwMCAwMDAwIDAwMDAgMDAwMAorKgorV05JX0NGR19IVF9JTkZPX0ZJRUxEMiAgICBJICAgIDQgICAgMTAKK1YgICAgUlcgICAgUAorTElNCiswICAgIDB4ZmZmZiAgICAweDAwCitWICAgIFJXICAgIFAKK0xJTQorMCAgICAweGZmZmYgICAgMHgwMAorCisjRU5VTSBPUF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjRU5VTSBOT05fR0ZfREVWSUNFU19QUkVTRU5UICAyCisjRU5VTSBSRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAzCisKKyoKKyogNS4gSFQgSW5mbyBGaWVsZDM6IDIgYnl0ZXMKKyoKKyogZmVkYyBiYTk4IDc2NTQgMzIxMAorKiAwMDAwIDAwMDAgMDAwMCAwMDAwCisqCisqIExTSUcgVFhPUCBGdWxsIFByb3RlY3Rpb24gd2lsbCBiZSB6ZXJvIHRvIGJlZ2luIHdpdGggYW5kCisqIHVwZGF0ZWQgZHluYW1pY2FsbHkuCisqIEV2ZXJ5dGhpbmcgZWxzZSBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgbW9tZW50LgorKgorV05JX0NGR19IVF9JTkZPX0ZJRUxEMyAgICBJICAgIDQgICAgMTAKK1YgICAgUlcgICAgUAorTElNCiswICAgIDB4ZmZmZiAgICAweDAwMDAKK1YgICAgUlcgICAgUAorTElNCiswICAgIDB4ZmZmZiAgICAweDAwMDAKKworI0VOVU0gQkFTSUNfU1RCQ19NQ1MgICAgICAgICAgICAgICAgICAgICAgMAorI0VOVU0gRFVBTF9TVEJDX1BST1RFQ1RJT04gICAgICAgICAgICAgICAgNworI0VOVU0gU0VDT05EQVJZX0JFQUNPTiAgICAgICAgICAgICAgICAgICAgOAorI0VOVU0gTFNJR19UWE9QX1BST1RFQ1RJT05fRlVMTF9TVVBQT1JUICAgOQorI0VOVU0gUENPX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAxMAorI0VOVU0gUENPX1BIQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAxMQorI0VOVU0gUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgorCisqCisqIDYuIEJhc2ljIE1DUyBTZXQ6IDE2IGJ5dGVzIHNpemUKKyoKKyogRm9yIG5vdyBzZXQgdGhpcyB0byB6ZXJvIGFuZCBkb24ndCBwdXQgYW55IHJlc3RyaWN0aW9ucy4KKyoKK1dOSV9DRkdfQkFTSUNfTUNTX1NFVCAgICBTICAgIDE2ICAgIDcKK1YgICAgUlcgICAgUCAgICBSRVNUQVJUCitMSU0KKzE2IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKK1YgICAgUlcgICAgUCAgICBSRVNUQVJUCitMSU0KKzE2IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKKworKgorKiA3LiBDdXJyZW50IHN1cHBvcnRlZCBNQ1MgU2V0OiAxNiBieXRlcyBzaXplCisqCisqIEZvciBub3cgc2V0IHRoaXMgdG8gemVybyBhbmQgZG9uJ3QgcHV0IGFueSByZXN0cmljdGlvbnMuCisqCitXTklfQ0ZHX0NVUlJFTlRfTUNTX1NFVCAgICBTICAgIDE2ICAgIDcKK1YgICAgUlcgICAgUCAgICBSRVNUQVJUCitMSU0KKzE2IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKK1YgICAgUlcgICAgUCAgICBSRVNUQVJUCitMSU0KKzE2IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKKworCisKKyoKKyogR3JlZW5maWVsZCBDYXBhYmlsaXR5CisqIEJ5IGRlZmF1bHQgR3JlZW5maWVsZCBpcyBlbmFibGVkCisqCitXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWSAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUCAgICBSRVNUQVJUCitMSU0KKzAgICAgMSAgICAwCisKKyNFTlVNIEVOQUJMRSAgICAxCisjRU5VTSBESVNBQkxFICAgMAorCisKKyoKKyogTWF4aW11bSBBTVNEVSBsZW5ndGgKKyogVXNlciBjYW4gc2V0IGl0IHRvIGVpdGhlciAzODM5IG9yIDc5MzUgYnl0ZXMuIAorKgorV05JX0NGR19NQVhfQU1TRFVfTEVOR1RIICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK0xJTQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDEgICAgMAorCisjRU5VTSBTSE9SVF8zODM5X0JZVEVTICAgMAorI0VOVU0gTE9OR183OTM1X19CWVRFUyAgIDEKKworCisqCisqIE1pbmltdW0gTVBEVSBTdGFydCBTcGFjaW5nCisqIERldGVybWluZXMgdGhlIG1pbmltdW0gdGltZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBhZGphY2VudCBNUERVcyB3aXRoaW4gYW4gQU1QRFUuCisqIFNldCB0byAwIGZvciBubyByZXN0cmljdGlvbgorKiBTZXQgdG8gMSBmb3IgMS80IHMKKyogU2V0IHRvIDIgZm9yIDEvMiBzCisqIFNldCB0byAzIGZvciAxIHMKKyogU2V0IHRvIDQgZm9yIDIgcworKiBTZXQgdG8gNSBmb3IgNCBzCisqIFNldCB0byA2IGZvciA4IHMKKyogU2V0IHRvIDcgZm9yIDE2IHMKKyogZGVmYXVsdCBpcyBzZXQgdG8gMAorV05JX0NGR19NUERVX0RFTlNJVFkgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDcgICAgMAorViAgICBSVyAgICBOUCAgICBSRVNUQVJUCitMSU0KKzAgICAgNyAgICAwCisKKworKgorKiBNYXhpbXVtIFJ4IEFNUERVIEZhY3RvcgorKiBJbmRpY2F0ZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIEEtTVBEVQorKiB0aGF0IHRoZSBTVEEgY2FuIHJlY2VpdmUuCisqIFRoZSBNYXhpbXVtIFJ4IEEtTVBEVSBkZWZpbmVkIGJ5IHRoaXMgZmllbGQgaXMgZXF1YWwgdG8gICgyIF4gKDEzICsgTUFYIFJYIEFNUERVIEZBY3RvcikpLTEgIG9jdGV0cy4KKyogTWF4aW11bSBSeCBBLU1QRFUgRmFjdG9yIGlzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDAgdG8gMy4KKyogZGVmYXVsdCBpcyBzZXQgdG8gMiBmb3IgMzJLIG1heCBSWCBzaWRlLgorKgorV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK0xJTQorMCAgICAzICAgIDMKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDMgICAgMworCisKKyoKKyogU2hvcnQgR0kgc3VwcG9ydCBmb3IgdGhlIHJlY2VwdGlvbiBvZiAyME1oeiBwYWNrZXRzCisqIEJ5IGRlZmF1bHQgaXQgaXMgZW5hYmxlZAorKgorV05JX0NGR19TSE9SVF9HSV8yME1IWiAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgICAgUkVTVEFSVAorTElNCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUCAgICBSRVNUQVJUCitMSU0KKzAgICAgMSAgICAxCisKKworI0VOVU0gRU5BQkxFICAgIDEKKyNFTlVNIERJU0FCTEUgICAwCisKKworKgorKiBTaG9ydCBHSSBzdXBwb3J0IGZvciB0aGUgcmVjZXB0aW9uIG9mIDQwTWh6IHBhY2tldHMKKyogQnkgZGVmYXVsdCBpdCBpcyBlbmFibGVkCisqCitXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaICBJICAgIDQgICAgNworViAgICBSVyAgICBOUCAgICBSRVNUQVJUCitMSU0KKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QICAgIFJFU1RBUlQKK0xJTQorMCAgICAxICAgIDEKKworCisjRU5VTSBFTkFCTEUgICAgMQorI0VOVU0gRElTQUJMRSAgIDAKKworCisqCisqIFJJRlMgc3VwcG9ydCBvbiBUWCBTaWRlCisqIG9uIFJYIHNpZGUgaXQgaXMgYWx3YXlzIHN1cHBvcnRlZCwgaXQgaXMgbWFuZGF0b3J5CisqCitXTklfQ0ZHX1JJRlNfRU5BQkxFRCAgIEkgICA0ICAgNworViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUCBSRVNUQVJUCitOT05FCiswICAgIDEgICAgMQorCisjRU5VTSBFTkFCTEUgIDEKKyNFTlVNIERJU0FCTEUgMAorCisKKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFBvd2VyIFNhdmUgQ29uZmlndXJhdGlvbgorKgorV05JX0NGR19NQVhfUFNfUE9MTCAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTElNCiswICAgICAyNTUgICAgIDAKK05WICAgIFJXICAgIE5QCitMSU0KKzAgICAgIDI1NSAgICAgMAorCisKK1dOSV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFICAgIEkgICAgNCAgICA1CitWICAgIFJXICAgIE5QCitMSU0KKzEgICAgMjAgICAgMjAKK05WICAgIFJXICAgIE5QCitMSU0KKzEgICAgMjAgICAgMjAKKworCisqCisqIFBlcmlvZCBmb3Igd2hpY2ggRmlybXdhcmUgd2lsbCBjb2xsZWN0IHRoZSAKKyogUlNTSSBzdGF0cy4gSXRzIGluIHVuaXRzIG9mIGJlYWNvbiBpbnRlcnZhbC4gCisqIFJzc2kgRmlsdGVyIHBlcmlvZCBzaG91bGQgYWx3YXlzIGJlID49CisqIHRoZSBudW1fYmVhY29uX3Blcl9yc3NpX2F2ZXJhZ2UuCisqCitXTklfQ0ZHX1JTU0lfRklMVEVSX1BFUklPRCAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTElNCiswICAgIDI1NSAgICAyMAorTlYgICAgUlcgICAgTlAKK0xJTQorMCAgICAyNTUgICAgMjAKKworKgorKiBQZXJpb2QgZm9yIHdoaWNoIEZpcm13YXJlIHdpbGwgY29sbGVjdCB0aGUgCisqIFJTU0kgc3RhdHMuIEl0cyBpbiB1bml0cyBvZiBiZWFjb24gaW50ZXJ2YWwuIAorKiBSc3NpIEZpbHRlciBwZXJpb2Qgc2hvdWxkIGFsd2F5cyBiZSA+PQorKiB0aGUgbnVtX2JlYWNvbl9wZXJfcnNzaV9hdmVyYWdlLgorKiBUaGlzIHZhbHVlIGlzIHVzZWQgT05MWSBmb3IgQ0NYIGFuZCAxMXIgRmFzdHRyYW5zaXRpb24KKyoKK1dOSV9DRkdfRlRfUlNTSV9GSUxURVJfUEVSSU9EICAgIEkgICAgNCAgICA1CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMjU1ICAgIDUKK05WICAgIFJXICAgIE5QCitMSU0KKzAgICAgMjU1ICAgIDUKKworCitXTklfQ0ZHX01JTl9SU1NJX1RIUkVTSE9MRCAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTElNCiswICAgIDEwICAgIDEwCitOViAgICBSVyAgICBOUAorTElNCiswICAgIDEwICAgIDEwCisKKworV05JX0NGR19OVEhfQkVBQ09OX0ZJTFRFUiAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTElNCiswICAgIDI1NSAgIDEwCitOViAgICBSVyAgICBOUAorTElNCiswICAgIDI1NSAgICAxMAorCisKK1dOSV9DRkdfQlJPQURDQVNUX0ZSQU1FX0ZJTFRFUl9FTkFCTEUgICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAKK0xJTQorMCAgICAxICAgIDAKK05WICAgIFJXICAgIE5QCitMSU0KKzAgICAgMSAgICAwCisKKworV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRSAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUAorTElNCiswICAgIDEgICAgMQorCisKKyoKKyogSWdub3JlIERUSU0gc3VwcG9ydCAtIElmIGRpc2FibGVkKHZhbHVlPTApLCBIQUwgd2lsbCAKKyogdHJ5IHRvIGFsaWduIHRoZSBMaXN0ZW4gSW50ZXJ2YWwgdG8gdGhlIERUSU0gCisqIHBlcmlvZCBhbmQgdGhlIGZvbGxvd2luZyBydWxlcyB3aWxsIGJlIGFwcGxpZWQ6CisqIDEpIElmIExJPURUSU0sIHRoZW4gc2V0IExJPURUSU0KKyogMikgSWYgTEk8RFRJTSwgdGhlbiBhbGlnbiBMSSB0byBEVElNCisqIDMpIElmIExJPkRUSU0sIHRoZW4gc2V0IExJPURUSU0gCisqCitXTklfQ0ZHX0lHTk9SRV9EVElNICAgIEkgICAgNCAgICA1CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDAKKworKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogV29XTEFOIENvbmZpZ3VyYXRpb24gIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbnMgCisqIGFyZSB2YWxpZCBvbmx5IHdoZW4gbWFnaWNQa3RFbmFibGUgPSAxLiAKKyoKK1dOSV9DRkdfV09XTEFOX1VDQVNUX1BBVFRFUk5fRklMVEVSX0VOQUJMRSAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAgMSAgICAgMQorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgIDEgICAgIDAKKworCitXTklfQ0ZHX1dPV0xBTl9DSEFOTkVMX1NXSVRDSF9FTkFCTEUgICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgIDEgICAgIDEKK05WICAgIFJXICAgIE5QCitOT05FCiswICAgICAxICAgICAwCisKKworV05JX0NGR19XT1dMQU5fREVBVVRIX0VOQUJMRSAgICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAgMSAgICAgMQorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgIDEgICAgIDAKKworCitXTklfQ0ZHX1dPV0xBTl9ESVNBU1NPQ19FTkFCTEUgICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgIDEgICAgIDEKK05WICAgIFJXICAgIE5QCitOT05FCiswICAgICAxICAgICAwCisKKworV05JX0NGR19XT1dMQU5fTUFYX01JU1NFRF9CRUFDT04gICBJICAgIDQgICAgNQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICA0MAorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgNDAKKworKgorKiBUaW1lb3V0IHZhbHVlIGluIHVuaXRzIG9mIHVzLiBJdCByZXF1ZXN0cworKiBoYXJkd2FyZSB0byB1bmNvbmRpdGlvbmFsbHkgd2FrZSB1cCBhZnRlcgorKiBpdCBoYXMgc3RheWVkIGluIFdvV0xBTiBtb2RlIGZvciBzb21lIHRpbWUuCisqCitXTklfQ0ZHX1dPV0xBTl9NQVhfU0xFRVBfUEVSSU9EICAgSSAgICA0ICAgIDUKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgNjU1MzUgICAgNjU1MzUKK05WICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDY1NTM1CisKKworKgorKiBCQSB0aW1lb3V0IGluIFRVcywgc2V0IHRvIDEgbWludXRlID0gYXBwcm94IDU4NTkzIFRVcworKiAxNiBiaXQgd2lkZQorKgorV05JX0NGR19CQV9USU1FT1VUICBJICAgIDQgICAgNworViAgICBSVyAgICBOUCAgIFJFU1RBUlQKK0hBTAorMCAgICAweGZmZmYgICAgMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDB4ZmZmZiAgICAwCisKKworKgorKiBUaGlzIHRocmVzaG9sZCBpcyByZWdpc3RlcmVkIHdpdGggYSB0cmFmZmljIG1vbml0b3JpbmcgaW50ZXJmYWNlIChwcm9iYWJseSBIQUwpLAorKiBvbiBhIHBlci1TVEEsIHBlci1USUQgYmFzaXMuIE9uY2UgdGhpcyB0aHJlc2hvbGQgaGFzIGJlZW4gcmVhY2hlZCwKKyogSEFMIHdpbGwgaW5kaWNhdGUgdG8gUEUgdGhhdCB0aGUgdGhyZXNob2xkIGhhcyBiZWVuIHJlYWNoZWQgZm9yIHRoYXQgVElELgorKiBQRSBpcyB0aGVuIGZyZWUgdG8gbmVnb3RpYXRlIGEgQkEgc2Vzc2lvbiBmb3IgdGhhdCBwZWVyCisqIGRlZmF1bHRzIHRvIDEyOAorKiAxNiBiaXQgd2lkZQorKgorV05JX0NGR19CQV9USFJFU0hPTERfSElHSCAgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgICBSRVNUQVJUCitIQUwKKzAgICAgMHhmZmZmICAgIDB4ODAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAweGZmZmYgICAgMHg4MAorCisKKyoKKyogTUFYIEJBIEJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkLgorKiBUaGlzIGNvdW50IGlzIHN5c3RlbSB3aWRlLgorKiAxNiBiaXQgd2lkZQorKgorV05JX0NGR19NQVhfQkFfQlVGRkVSUyAgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgICBSRVNUQVJUCitIQUwKKzAgICAgMjU2MCAgICAyNTYwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMjU2MCAgICAyNTYwCisKKworKgorKiBNQVggQkEgU2Vzc2lvbnMuCisqIFRoaXMgY291bnQgaXMgc3lzdGVtIHdpZGUuCisqIDE2IGJpdCB3aWRlCisqCitXTklfQ0ZHX01BWF9CQV9TRVNTSU9OUyAgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAgICBSRVNUQVJUCitIQUwKKzAgICAgNjQgICAgNDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NCAgICA0MAorCisKKyoKKyogQkEgc2V0dXAgYmFzZWQgb24gVHJhZmZpYworKgorV05JX0NGR19CQV9BVVRPX1NFVFVQICAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUCAgIFJFU1RBUlQKK0hBTAorMCAgICAxICAgIDEKK1YgICAgUlcgICAgTlAgIFJFU1RBUlQKK0hBTAorMCAgICAxICAgIDEKKworI0VOVU0gRU5BQkxFICAxCisjRU5VTSBESVNBQkxFIDAKKworKgorKiBEZWNsaW5lIGFuIEFEREJBIFJlcXVlc3QKKyoKK1dOSV9DRkdfQUREQkFfUkVRX0RFQ0xJTkUgICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QICAgUkVTVEFSVAorTElNCiswICAgIDB4ZmYgICAgMAorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTElNCiswICAgIDB4ZmYgICAgMAorCisqCisqIFZhbGlkIENoYW5uZWwgTGlzdAorKgorCitXTklfQ0ZHX0JHX1NDQU5fQ0hBTk5FTF9MSVNUICAgIFMgICAgMTAwICAgIDgKK1YgICAgUlcgICAgTlAKK0xJTQorNTUgICAzNiA0MCA0NCA0OCA1MiA1NiA2MCA2NCAxIDYgMTEgMzQgMzggNDIgNDYgMiAzIDQgNSA3IDggOSAxMCAxMiAxMyAxNCAxMDAgMTA0IDEwOCAxMTIgMTE2IDEyMCAxMjQgMTI4IDEzMiAxMzYgMTQwIDE0OSAxNTEgMTUzIDE1NSAxNTcgMTU5IDE2MSA1MCA1NCA1OCA2MiAyNDAgMjQyIDI0NCAyNDYgMjQ4IDI1MCAyNTIKK1YgICAgUlcgICAgTlAKK0xJTQorNTUgICAzNiA0MCA0NCA0OCA1MiA1NiA2MCA2NCAxIDYgMTEgMzQgMzggNDIgNDYgMiAzIDQgNSA3IDggOSAxMCAxMiAxMyAxNCAxMDAgMTA0IDEwOCAxMTIgMTE2IDEyMCAxMjQgMTI4IDEzMiAxMzYgMTQwIDE0OSAxNTEgMTUzIDE1NSAxNTcgMTU5IDE2MSA1MCA1NCA1OCA2MiAyNDAgMjQyIDI0NCAyNDYgMjQ4IDI1MCAyNTIKKworCisqCisqIEFNUERVIGRlZmF1bHQgVFggbWVkaXVtIFRpbWUgKGluIHVzKQorKgorV05JX0NGR19NQVhfTUVESVVNX1RJTUUgICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAyMDQ4CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMjA0OAorCisKKyoKKyogTWF4aW11bSBudW1iZXIgb2YgTVBEVXMgaW4gc2luZ2xlIEEtTVBEVS4gCisqCitXTklfQ0ZHX01BWF9NUERVU19JTl9BTVBEVSAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDY0CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgNjQKKworCisqCisqIEF1dG8gQlNTSUQgLSBXaGVuIHNldCwgQlNTSUQgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgaW4gSUJTUywgZWxzZSBCU1NJRCBpbiBjZmcgd2lsbCBiZSB1c2VkLgorKgorCitXTklfQ0ZHX0lCU1NfQVVUT19CU1NJRCAgICAgIEkgICAgNCAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAgMQorTlYgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgICAxCisKKyoKKyogSW5jbHVkZSBBZGRpdGlvbmFsIElFcyBpbiBwcm9iZSByZXF1ZXN0LgorKgorV05JX0NGR19QUk9CRV9SRVFfQURETklFX0ZMQUcgICAgSSAgICA0ICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMSAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDEgMAorCisqCisqIEluY2x1ZGUgQWRkaXRpb25hbCBJRSBpbiBwcm9iZSByZXF1ZXN0LgorKgorV05JX0NGR19QUk9CRV9SRVFfQURETklFX0RBVEEgICAgUyAgICAgMjU1ICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAwCisKKyoKKyogSW5jbHVkZSBBZGRpdGlvbmFsIElFcyBpbiBwcm9iZSByZXNwb25zZS4KKyoKK1dOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9GTEFHICAgIEkgICAgNCAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDEgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAxIDAKKworKgorKiBJbmNsdWRlIEFkZGl0aW9uYWwgSUUgaW4gcHJvYmUgcmVzcG9uc2UuCisqCitXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfREFUQTEgICAgUyAgICAgMjU1ICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAwCisKKyoKKyogSW5jbHVkZSBBZGRpdGlvbmFsIElFIGluIHByb2JlIHJlc3BvbnNlLgorKgorV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEyICAgIFMgICAgIDI1NSAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMAorCisqCisqIEluY2x1ZGUgQWRkaXRpb25hbCBJRSBpbiBwcm9iZSByZXNwb25zZS4KKyoKK1dOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMyAgICBTICAgICAyNTUgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDAKKworKgorKiBJbmNsdWRlIEFkZGl0aW9uYWwgSUVzIGluIGFzc29jIHJlc3BvbnNlLgorKgorV05JX0NGR19BU1NPQ19SU1BfQURETklFX0ZMQUcgICAgSSAgICA0ICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMSAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDEgMAorCisqCisqIEluY2x1ZGUgQWRkaXRpb25hbCBJRSBpbiBhc3NvYyByZXNwb25zZS4KKyoKK1dOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9EQVRBICAgIFMgICAgIDI1NSAgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMAorCisqCisqIEluY2x1ZGUgQWRkaXRpb25hbCBQMlAgSUVzIGluIHByb2JlIHJlcXVlc3QuCisqCitXTklfQ0ZHX1BST0JFX1JFUV9BREROUDJQSUVfRkxBRyAgICBJICAgIDQgICAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAxIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMSAwCisKKyoKKyogSW5jbHVkZSBBZGRpdGlvbmFsIFAyUCBJRSBpbiBwcm9iZSByZXF1ZXN0LgorKgorV05JX0NGR19QUk9CRV9SRVFfQURETlAyUElFX0RBVEEgICAgUyAgICAgMjU1ICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgMAorViAgICBSVyAgICBOUAorTk9ORQorMCAwCisKKworKgorKiBJbmNsdWRlIEFkZGl0aW9uYWwgSUVzIGluIHByb2JlIHJlc3BvbnNlL2JlYWNvbi4KKyoKK1dOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBRyAgICBJICAgIDQgICAgMAorViAgICBSVyAgICBOUAorTElNCiswIDEgMAorViAgICBSVyAgICBOUAorTElNCiswIDEgMAorCisKKyoKKyogSW5jbHVkZSBBZGRpdGlvbmFsIElFcyBpbiBwcm9iZSByZXNwb25zZS9iZWFjb24uCisqCitXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEEgICAgUyAgICAyNTUgICAgMAorViAgICBSVyAgICBOUAorTElNCiswIDAKK1YgICAgUlcgICAgTlAKK0xJTQorMCAwCisKKworKgorKiB3cHNBcEVuYWJsZSBhbmQgd3BzU3RhRW5hYmxlIGlzIHNwZWNpZmllZCBpbiBoZXJlCisqIHdwc0FwRW5hYmxlIGlzIGJpdCAjMCBhbmQgd3BzU3RhRW5hYmxlIGlzIGJpdCAjMQorKgorV05JX0NGR19XUFNfRU5BQkxFICBJICAgNCAgIDcKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZiAgICAwIAorViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmICAgIDAKKworI0VOVU0gQVAgICAgICAgICAxCisjRU5VTSBTVEEgICAgICAgIDIKKworV05JX0NGR19XUFNfU1RBVEUgIEkgICA0ICAgNworViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmICAgMSAKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZiAgIDEKKworKgorKiBUUlVFID0+IGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiBpbiBQcm9iZSBSZXF1ZXN0cywgRkFMU0UgPT4gb21pdCBpdAorKgorCitXTklfQ0ZHX1dQU19QUk9CRV9SRVFfRkxBRyAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTElNCiswIDEgMAorViAgICBSVyAgICBOUAorTElNCiswIDEgMAorCisqCisqIFdpLUZpIFByb3RlY3RlZCBTZXR1cCBWZXJzaW9uCisqCisqIFRoaXMgIG9uZS1ieXRlIGZpZWxkIGlzIGJyb2tlbiBpbnRvIGEgZm91ci1iaXQgbWFqb3IKKyogcGFydCB1c2luZyB0aGUgdG9wIE1TQnMgYW5kIGZvdXItYml0ICBtaW5vciBwYXJ0CisqIHVzaW5nIHRoZSBMU0JzLiBBcyBhbiBleGFtcGxlLCB2ZXJzaW9uIDMuMiB3b3VsZCBiZSAweDMyLgorKgorCitXTklfQ0ZHX1dQU19WRVJTSU9OICBJICAgNCAgIDcKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZiAgIDB4MTAgCitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmYgICAweDEwCisKKyoKKyogV2ktRmkgUHJvdGVjdGVkIFNldHVwIFJlcXVlc3QgdHlwZQorKiAweDAwOiBFbnJvbGxlZSwgSW5mbyBvbmx5CisqIDB4MDE6IEVucm9sbGVlLCBvcGVuIDgwMi4xWAorKiAweDAyOiBSZWdpc3RyYXIKKyogMHgwMzogV0xBTiBNYW5hZ2VyIFJlZ2lzdHJhcgorCitXTklfQ0ZHX1dQU19SRVFVRVNUX1RZUEUgIEkgICA0ICAgNworViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmICAgMHgwMCAKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZiAgIDB4MDMKKworKiBDb25maWd1cmF0aW9uIE1ldGhvZChzKQorKgorKiBUaGUgQ29uZmlnIE1ldGhvZHMgRGF0YSBjb21wb25lbnQgbGlzdHMgdGhlIGNvbmZpZ3VyYXRpb24gbWV0aG9kcworKiB0aGUgRW5yb2xsZWUgb3IgUmVnaXN0cmFyIHN1cHBvcnRzLiAgVGhlIGxpc3QgaXMgYSBiaXR3aXNlIE9SIG9mCisqIHZhbHVlcyBmcm9tIHRoZSB0YWJsZSBiZWxvdy4gSW4gYWRkaXRpb24gdG8gQ29uZmlnIE1ldGhvZHMsIEFQcyBhbmQKKyogU1RBcyB0aGF0IHN1cHBvcnQgdGhlIFVQblAgTWFuYWdlbWVudCBJbnRlcmZhY2UgbXVzdCBzdXBwb3J0IHRoZQorKiBQZXJtaXR0ZWQgQ29uZmlnIE1ldGhvZHMgYXR0cmlidXRlLCB3aGljaCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlCisqIENvbmZpZyBNZXRob2RzIHRoYXQgYXJlIGVuYWJsZWQgb24gdGhhdCBBUC4KKyoKKyogVmFsdWUgICBIYXJkd2FyZSBJbnRlcmZhY2UKKyogMHgwMDAxICBVU0JBIChGbGFzaCBEcml2ZSkKKyogMHgwMDAyICBFdGhlcm5ldAorKiAweDAwMDQgIExhYmVsCisqIDB4MDAwOCAgRGlzcGxheQorKiAweDAwMTAgIEV4dGVybmFsIE5GQyBUb2tlbgorKiAweDAwMjAgIEludGVncmF0ZWQgTkZDIFRva2VuCisqIDB4MDA0MCAgTkZDIEludGVyZmFjZQorKiAweDAwODAgIFB1c2hCdXR0b24KKyogMHgwMTAwICBLZXlwYWQKKyoKKyogVGhlIGJvdHRvbSAxNiBiaXRzIGNvbnRhaW4gdGhlIGNvbmZpZ3VyYXRpb24gbWV0aG9kKHMpIHdoZW4gYWN0aW5nCisqIGFzIGFuIEVucm9sbGVlLCBhbmQgdGhlIHRvcCAxNiB3aGVuIGFjdGluZyBhcyBhIFJlZ2lzdHJhci4KKyoKKyogUU5FLVRPRE86IE1lcmdlIHRoaXMgd2l0aCB0aGUgaW5hcHByb3ByaWF0ZWx5IG5hbWVkCisqICdXTklfQ0ZHX1dTQ19BUF9DRkdfTUVUSE9EJy0tIHRoaXMgb25lIGNhbiBzZXJ2ZSBib3RoIHB1cG9zZXMuCisqCisKK1dOSV9DRkdfV1BTX0NGR19NRVRIT0QgIEkgICA0ICAgNworViAgICBSVyAgICBOUAorTElNCiswICAgIDB4RkZGRkZGRkYgICAweDAwMDAwMDA4CitWICAgIFJXICAgIE5QCitMSU0KKzAgICAgMHhGRkZGRkZGRiAgIDB4MDE4YzAxOGUKKworKiBVVUlECisqIFRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciAoVVVJRCkgZWxlbWVudCBpcyBhIHVuaXF1ZQorKiBHVUlEIGdlbmVyYXRlZCBieSB0aGUgRW5yb2xsZWUgb3IgUmVnaXN0cmFyLiBJdCB1bmlxdWVseSBpZGVudGlmaWVzCisqIGFuIG9wZXJhdGlvbmFsIGRldmljZSBhbmQgc2hvdWxkIHN1cnZpdmUgcmVib290cyBhbmQgcmVzZXRzLiAgVGhlCisqIFVVSUQgaXMgcHJvdmlkZWQgaW4gYmluYXJ5IGZvcm1hdC4gSWYgdGhlIGRldmljZSBhbHNvIHN1cHBvcnRzIFVQblAsCisqIHRoZW4gdGhlIFVVSUQgY29ycmVzcG9uZHMgdG8gdGhlIFVQblAgVVVJRC4KKyoKKyogUU5FLVRPRE86IFJlLW5hbWUgdGhlaXIgY2ZnIGZyb20gJ1dOSV9DRkdfVVVJRCcKKworV05JX0NGR19XUFNfVVVJRCAgICBTICAgIDE2ICAgIDgKK1YgICAgUlcgICAgTlAKK0xJTQorNiAgICAweGEgMHhiIDB4YyAweGQgMHhlIDB4ZiAKK1YgICAgUlcgICAgTlAKK0xJTQorNiAgICAweGEgMHhiIDB4YyAweGQgMHhlIDB4ZiAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoZSBmb2xsb3dpbmcgY2ZncyBjb250YWlucyB0aGUgcHJpbWFyeSB0eXBlIG9mIHRoZSBkZXZpY2UuIEl0cyBmb3JtYXQKKyogZm9sbG93czoKKyoKKyogIDAgMSAyIDMKKyogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyogIHwgQXR0cmlidXRlIElEICAgICAgICAgICAgICAgICAgIHwgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8CisqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworKiAgfCBDYXRlZ29yeSBJRCAgICAgICAgICAgICAgICAgICAgfCBPVUkgKDEtMikgICAgICAgICAgICAgICAgICAgIHwKKyogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICB8IE9VSSAoMy00KSAgICAgICAgICAgICAgICAgICAgICB8IFN1YiBDYXRlZ29yeSBJRCAgICAgICAgICAgICAgfAorKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyoKKyogVmVuZG9yLXNwZWNpZmljIHN1Yi1jYXRlZ29yaWVzICBhcmUgZGVzaWduYXRlZCBieSAgc2V0dGluZyB0aGUgT1VJICB0byB0aGUKKyogdmFsdWUgYXNzb2NpYXRlZCB3aXRoICB0aGF0IHZlbmRvci4gIE5vdGUgdGhhdCBhICBmb3VyLWJ5dGUgc3ViZGl2aWRlZCBPVUkKKyogaXMgdXNlZC4gRm9yIHRoZSBwcmVkZWZpbmVkIHZhbHVlcywgdGhlICBXaS1GaSBBbGxpYW5jZSBPVUkgb2YgMDAgNTAgRjIgMDQKKyogaXMgdXNlZC4gIFRoZSBwcmVkZWZpbmVkIHZhbHVlcyAgZm9yIENhdGVnb3J5IElEICBhbmQgU3ViIENhdGVnb3J5ICBJRCBhcmUKKyogcHJvdmlkZWQgaW4gdGhlIG5leHQgdGFibGUuIFRoZXJlICBpcyBubyB3YXkgdG8gaW5kaWNhdGUgYSB2ZW5kb3Itc3BlY2lmaWMKKyogbWFpbiBkZXZpY2UgIGNhdGVnb3J5LiBUaGUgT1VJIGFwcGxpZXMgIG9ubHkgdG8gdGhlICBpbnRlcnByZXRhdGlvbiBvZiB0aGUKKyogU3ViIENhdGVnb3J5LiBJZiAgYSB2ZW5kb3IgZG9lcyBub3QgdXNlIHN1YiBjYXRlZ29yaWVzICBmb3IgdGhlaXIgT1VJLCB0aGUKKyogdGhyZWUtYnl0ZSBPVUkgIG9jY3VwaWVzIHRoZSBmaXJzdCAgdGhyZWUgYnl0ZXMgb2YgIHRoZSBPVUkgZmllbGQgIGFuZCB0aGUKKyogZm91cnRoIGJ5dGUgaXMgc2V0IHRvIHplcm8uCisqCisqICBDYXRlZ29yeSAgICAgICAgICAgICAgSUQgVmFsdWUgIFN1YiBDYXRlZ29yeSAgICAgICAgICAgICBJRCBWYWx1ZQorKiAgQ29tcHV0ZXIgICAgICAgICAgICAgIDEgICAgICAgICBQQyAgICAgICAgICAgICAgICAgICAgICAgMQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXIgICAgICAgICAgICAgICAgICAgMgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYSBDZW50ZXIgICAgICAgICAgICAgMworKiAgSW5wdXQgRGV2aWNlICAgICAgICAgIDIKKyogIFByaW50ZXJzLCBTY2FubmVycywgICAgICAgICAgICAgUHJpbnRlciAgICAgICAgICAgICAgICAgIDEKKyogIEZheGVzIGFuZCBDb3BpZXJzICAgICAzICAgICAgICAgU2Nhbm5lciAgICAgICAgICAgICAgICAgIDIKKyogIENhbWVyYSAgICAgICAgICAgICAgICA0ICAgICAgICAgRGlnaXRhbCBTdGlsbCBDYW1lcmEgICAgIDEKKyogIFN0b3JhZ2UgICAgICAgICAgICAgICA1ICAgICAgICAgTkFTICAgICAgICAgICAgICAgICAgICAgIDEKKyogIE5ldHdvcmsgICAgICAgICAgICAgICAgICAgICAgICAgQVAgICAgICAgICAgICAgICAgICAgICAgIDEKKyogIEluZnJhc3RydWN0dXJlICAgICAgICA2ICAgICAgICAgUm91dGVyICAgICAgICAgICAgICAgICAgIDIKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoICAgICAgICAgICAgICAgICAgIDMKKyogIERpc3BsYXlzICAgICAgICAgICAgICA3ICAgICAgICAgVGVsZXZpc2lvbiAgICAgICAgICAgICAgIDEKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlY3Ryb25pYyBQaWN0dXJlIEZyYW1lIDIKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdG9yICAgICAgICAgICAgICAgIDMKKyogIE11bHRpbWVkaWEgRGV2aWNlcyAgICA4ICAgICAgICAgREFSICAgICAgICAgICAgICAgICAgICAgIDEKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZSICAgICAgICAgICAgICAgICAgICAgIDIKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNYICAgICAgICAgICAgICAgICAgICAgIDMKKyogIEdhbWluZyBEZXZpY2VzICAgICAgICA5ICAgICAgICAgWGJveCAgICAgICAgICAgICAgICAgICAgIDEKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGJveDM2MCAgICAgICAgICAgICAgICAgIDIKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheXN0YXRpb24gICAgICAgICAgICAgIDMKKyogIFRlbGVwaG9uZSAgICAgICAgICAgICAxMCAgICAgICAgV2luZG93cyBNb2JpbGUgICAgICAgICAgIDEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisqIFFORS1UT0RPOiBSZW5hbWUgdGhlaXIgY2ZnIGZyb20gJ1dOSV9DRkdfUFJJTV9ERVZJQ0VfQ0FURUdPUlknCitXTklfQ0ZHX1dQU19QUklNQVJZX0RFVklDRV9DQVRFR09SWSAgSSAgIDQgICA3CitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmZmZiAgIDEKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmICAgNgorCisqIFFORS1UT0RPOiBSZW5hbWUgdGhlaXIgY2ZnIGZyb20gJ1dOSV9DRkdfUFJJTV9ERVZJQ0VfT1VJJworV05JX0NGR19XUFNfUElNQVJZX0RFVklDRV9PVUkgIEkgICA0ICAgNworViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmZmZmZmZmICAgMHgwMDUwZjIwNCAKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmZmZmZiAgIDB4MDA1MGYyMDQKKworKiBRTkUtVE9ETzogUmVuYW1lIHRoZWlyIGNmZyBmcm9tICdXTklfQ0ZHX1BSSU1fREVWSUNFX1NVQl9DQVRFR09SWScKK1dOSV9DRkdfV1BTX0RFVklDRV9TVUJfQ0FURUdPUlkgIEkgICA0ICAgNworViAgICBSVyAgICAgTlAKK0xJTQorMCAgICAweGZmZmYgICAxCitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmZmZiAgIDEKKworKiBBc3NvY2lhdGlvbiBTdGF0ZQorKgorCisqIFRoZSBBc3NvY2lhdGlvbiBTdGF0ZSBjb21wb25lbnQgc2hvd3MgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHByZXZpb3VzCisqIGFzc29jaWF0aW9uIHN0YXRlIG9mIHRoZSB3aXJlbGVzcyBzdGF0aW9uIHdoZW4gc2VuZGluZyBhIERpc2NvdmVyeQorKiByZXF1ZXN0LgorKgorKiBBc3NvY2lhdGlvbiBTdGF0ZSAgICBEZXNjcmlwdGlvbgorKiAwICAgICAgICAgICAgICAgICAgICBOb3QgQXNzb2NpYXRlZAorKiAxICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIFN1Y2Nlc3MKKyogMiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBGYWlsdXJlCisqIDMgICAgICAgICAgICAgICAgICAgIEFzc29jaWF0aW9uIEZhaWx1cmUKKyogNCAgICAgICAgICAgICAgICAgICAgSVAgRmFpbHVyZQorCitXTklfQ0ZHX1dQU19BU1NPQ0lBVElPTl9TVEFURSAgSSAgIDQgICA3CitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmZmZiAgIDAKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmICAgMAorCisqIENvbmZpZ3VyYXRpb24gRXJyb3IKKyoKKyogVGhlICBDb25maWd1cmF0aW9uICBFcnJvciAgY29tcG9uZW50ICAgc2hvd3MgIHRoZSAgcmVzdWx0ICBvZiAgdGhlICBkZXZpY2UKKyogYXR0ZW1wdGluZyB0byBjb25maWd1cmUgaXRzZWxmIGFuZCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgV0xBTi4KKyoKKyogIENvbmZpZ3VyYXRpb24gRXJyb3IgIERlc2NyaXB0aW9uCisqICAgMCAgICAgICAgICAgICAgICAgICBObyBFcnJvcgorKiAgIDEgICAgICAgICAgICAgICAgICAgT09CIEludGVyZmFjZSBSZWFkIEVycm9yCisqICAgMiAgICAgICAgICAgICAgICAgICBEZWNyeXB0aW9uIENSQyBGYWlsdXJlCisqICAgMyAgICAgICAgICAgICAgICAgICAyLjQgY2hhbm5lbCBub3Qgc3VwcG9ydGVkCisqICAgNCAgICAgICAgICAgICAgICAgICA1LjAgY2hhbm5lbCBub3Qgc3VwcG9ydGVkCisqICAgNSAgICAgICAgICAgICAgICAgICBTaWduYWwgdG9vIHdlYWsKKyogICA2ICAgICAgICAgICAgICAgICAgIE5ldHdvcmsgYXV0aCBmYWlsdXJlCisqICAgNyAgICAgICAgICAgICAgICAgICBOZXR3b3JrIGFzc29jaWF0aW9uIGZhaWx1cmUKKyogICA4ICAgICAgICAgICAgICAgICAgIE5vIERIQ1AgcmVzcG9uc2UKKyogICA5ICAgICAgICAgICAgICAgICAgIEZhaWxlZCBESENQIGNvbmZpZworKiAgMTAgICAgICAgICAgICAgICAgICAgSVAgYWRkcmVzcyBjb25mbGljdAorKiAgMTEgICAgICAgICAgICAgICAgICAgQ291bGRudCBjb25uZWN0IHRvIFJlZ2lzdHJhcgorKiAgMTIgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgUEJDIHNlc3Npb25zIGRldGVjdGVkCisqICAxMyAgICAgICAgICAgICAgICAgICBSb2d1ZSBhY3Rpdml0eSBzdXNwZWN0ZWQKKyogIDE0ICAgICAgICAgICAgICAgICAgIERldmljZSBidXN5CisqICAxNSAgICAgICAgICAgICAgICAgICBTZXR1cCBsb2NrZWQKKyogIDE2ICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgVGltZW91dAorKiAgMTcgICAgICAgICAgICAgICAgICAgUmVnaXN0cmF0aW9uIFNlc3Npb24gVGltZW91dAorKiAgMTggICAgICAgICAgICAgICAgICAgRGV2aWNlIFBhc3N3b3JkIEF1dGggRmFpbHVyZQorKgorKiBUaGUgRGV2aWNlIGJ1c3kgZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIHNlbmRpbmcgZGV2aWNlIGlzIHVuYWJsZSB0bworKiByZXNwb25kIHRvIHRoZSByZXF1ZXN0IGR1ZSB0byBzb21lIGludGVybmFsIGNvbmZsaWN0IG9yIHJlc291cmNlCisqIGNvbnRlbnRpb24gaXNzdWUuIEZvciBleGFtcGxlLCBpZiBhIGRldmljZSBpcyBvbmx5IGNhcGFibGUgb2YKKyogcGVyZm9ybWluZyBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgUmVnaXN0cmF0aW9uIFByb3RvY29sIGF0IGEgdGltZSwKKyogaXQgbWF5IHJldHVybiB0aGlzIGVycm9yIGluIHJlc3BvbnNlIHRvIGF0dGVtcHRzIHRvIHN0YXJ0IGFub3RoZXIKKyogaW5zdGFuY2UgaW4gdGhlIG1pZGRsZSBvZiBhbiBhY3RpdmUgc2Vzc2lvbi4KKworV05JX0NGR19XUFNfQ09ORklHVVJBVElPTl9FUlJPUiAgSSAgIDQgICA3CitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmZmZiAgIDAKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmICAgMAorCisqIERldmljZSBQYXNzd29yZCBJRAorKgorCisqIFRoaXMgIGF0dHJpYnV0ZSBpcyAgdXNlZCAgdG8gaWRlbnRpZnkgIGEgIGRldmljZSBwYXNzd29yZC4gIFRoZXJlIGFyZSAgc2l4CisqIHByZWRlZmluZWQgdmFsdWVzICBhbmQgdGVuIHJlc2VydmVkIHZhbHVlcy4gIElmIHRoZSBEZXZpY2UgIFBhc3N3b3JkIElEIGlzCisqIERlZmF1bHQsICB0aGUgRW5yb2xsZWUgIHNob3VsZCB1c2UgIGl0cyBQSU4gIHBhc3N3b3JkIChmcm9tICB0aGUgIGxhYmVsIG9yCisqIGRpc3BsYXkpLiAgVGhpcyAgcGFzc3dvcmQgbWF5ICBjb3JyZXNwb25kICB0byAgdGhlICBsYWJlbCwgZGlzcGxheSwgIG9yICBhCisqIHVzZXItZGVmaW5lZCAgcGFzc3dvcmQgdGhhdCBoYXMgIGJlZW4gY29uZmlndXJlZCAgdG8gcmVwbGFjZSAgdGhlIG9yaWdpbmFsCisqIGRldmljZSBwYXNzd29yZC4KKyoKKyogVXNlci1zcGVjaWZpZWQgaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgIGhhcyBvdmVycmlkZGVuIHRoZSBwYXNzd29yZCB3aXRoIGEKKyogbWFudWFsbHkgIHNlbGVjdGVkIHZhbHVlLiAgTWFjaGluZS1zcGVjaWZpZWQgIGluZGljYXRlcyB0aGF0ICB0aGUgb3JpZ2luYWwKKyogUElOICBwYXNzd29yZCBoYXMgIGJlZW4gb3ZlcnJpZGRlbiAgYnkgYSAgc3Ryb25nLCAgbWFjaGluZWdlbmVyYXRlZCBkZXZpY2UKKyogcGFzc3dvcmQgIHZhbHVlLiAgVGhlIFJla2V5ICB2YWx1ZSAgaW5kaWNhdGVzICB0aGF0ICB0aGUgZGV2aWNlJ3MgIDI1Ni1iaXQKKyogcmVrZXlpbmcgcGFzc3dvcmQgIHdpbGwgYmUgdXNlZC4gIFRoZSBQdXNoQnV0dG9uIHZhbHVlIGluZGljYXRlcyAgdGhhdCB0aGUKKyogUElOICBpcyAgdGhlIGFsbC16ZXJvICB2YWx1ZSAgcmVzZXJ2ZWQgIGZvciAgdGhlIFB1c2hCdXR0b24gIENvbmZpZ3VyYXRpb24KKyogbWV0aG9kLgorKgorKiBUaGUgUmVnaXN0cmFyLXNwZWNpZmllZCB2YWx1ZSBpbmRpY2F0ZXMgYSAgUElOIHRoYXQgaGFzIGJlZW4gb2J0YWluZWQgZnJvbQorKiB0aGUgUmVnaXN0cmFyICh2aWEgYSBkaXNwbGF5ICBvciBvdGhlciBvdXQtb2YtYmFuZCBtZXRob2QpLiBUaGlzIHZhbHVlIG1heQorKiBiZSBmdXJ0aGVyICBhdWdtZW50ZWQgd2l0aCB0aGUgIG9wdGlvbmFsICdJZGVudGl0eScgYXR0cmlidXRlIGluICBNMS4gVGhpcworKiBhdWdtZW50YXRpb24gaXMgdXNlZnVsIHdoZW4gbXVsdGlwbGUgcHJlZGVmaW5lZCBVc2VySUQvUElOIHBhaXJzIGhhdmUgYmVlbgorKiBlc3RhYmxpc2hlZCAgYnkgYSAgUmVnaXN0cmFyIHN1Y2ggIGFzICBhbiBhdXRoZW50aWNhdG9yICB1c2VkIGZvciAgSG90c3BvdAorKiBhY2Nlc3MuIElmIHRoZSAgRGV2aWNlIFBhc3N3b3JkIElEIGluICBNMSBpcyBub3Qgb25lIG9mICB0aGUgcHJlZGVmaW5lZCBvcgorKiByZXNlcnZlZCB2YWx1ZXMsIGl0IGNvcnJlc3BvbmRzIHRvIGEgcGFzc3dvcmQgZ2l2ZW4gdG8gdGhlIFJlZ2lzdHJhciBhcyBhbgorKiBPT0IgRGV2aWNlIFBhc3N3b3JkLgorKgorKiAgVmFsdWUgICAgICAgICAgICBEZXNjcmlwdGlvbgorKiAgMHgwMDAwICAgICAgICAgICBEZWZhdWx0IChQSU4pCisqICAweDAwMDEgICAgICAgICAgIFVzZXItc3BlY2lmaWVkCisqICAweDAwMDIgICAgICAgICAgIE1hY2hpbmUtc3BlY2lmaWVkCisqICAweDAwMDMgICAgICAgICAgIFJla2V5CisqICAweDAwMDQgICAgICAgICAgIFB1c2hCdXR0b24KKyogIDB4MDAwNSAgICAgICAgICAgUmVnaXN0cmFyLXNwZWNpZmllZAorKiAgMHgwMDA2IC0gMHgwMDBGICBSZXNlcnZlZCcKKyoKKworV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEICBJICAgNCAgIDcKK1YgICAgUlcgICAgIE5QCitMSU0KKzAgICAgMHhmZmZmZmZmZiAgIDAgCitWICAgIFJXICAgICBOUAorTElNCiswICAgIDB4ZmZmZmZmZmYgICAwCisKKyoKKyogV1BTIEFzc29jaWF0aW9uCisqCisqIFdpLUZpIFByb3RlY3RlZCBTZXR1cCByZXF1aXJlcyAgYSBwcm9zcGVjdGl2ZSBlbnJvbGxlZSB0byBhc3NvY2lhdGUgdG8KKyogYW4gQVAgIGluIHRoZSAgbmV0d29yayBpbiB3aGljaCAgdGhlIFNUQSAgd291bGQgbGlrZSB0byAgZW5yb2xsLiAgT25jZQorKiBhc3NvY2lhdGVkLCAgdGhlIGVucm9sbG1lbnQgIHRha2VzICBwbGFjZSBvdmVyICBhbiBFQVBPTCAgY29udmVyc2F0aW9uCisqICh0aGVyZSdzICBhY3R1YWxseSAgYSAgbmV3ICAgRUFQICBtZXRob2Q6ICBFQVAtV1NDKS4gICBUaGUgIFNUQSAgd291bGQKKyogcHJlc3VtYWJseSAgc2VuZCBhbiBFQVBPTC1TdGFydCAgb3ZlciBoaXMgIG5ldyBsaW5rLCAgdG8gd2hpY2ggIHRoZSBBUAorKiB3b3VsZCByZXNwb25kIHdpdGggIGFuIEVBUCBJZGVudGl0eSBSZXF1ZXN0LiAgV2hlbiAgdGhlIFNUQSBzZW5kcyBiYWNrCisqICJXU0MtRW5yb2xsZWUtMSIgYXMgaGlzIEVBUCBJZGVudGl0eSwgdGhlIEFQIGtub3dzIHRoYXQgaGUncyBnb3QgYSBXUFMKKyogc3VwcGxpY2FudCBvbiBoaXMgaGFuZHMsIGFuZCBwcm9jZWVkcyB0byB0YWxrIEVBUC1XU0MuCisqCisqIFRvd2FyZCB0aGUgZW5kIG9mIHRoZSAgc3BlY2lmaWNhdGlvbidzIGRldmVsb3BtZW50LCBhIHByb2JsZW0gY2FtZSB1cC4KKyogTWljcm9zb2Z0J3MgRUFQIHN1cHBsaWNhbnQgIG9uIFhQIFNQMSAmIFNQMiAgd2lsbCBzZW5kIGFuIEVBUE9MLVN0YXJ0LAorKiBubyBtYXR0ZXIgIHdoYXQuICBFdmVuICBpZiB0aGUgIEFQIGlzIGJlYWNvbmluZyAgV1BBLVBTSywgc2F5LCAgdGhlIE1TCisqIHN1cHBsaWNhbnQgd2lsbCBzZW5kICBhbiBFQVBPTC1TdGFydC4gIElmIGl0IHJlY2VpdmVzICBhbiBFQVAgSWRlbnRpdHkKKyogUmVxdWVzdCAgaW4gcmV0dXJuLCAgaXQgZGVjaWRlcyAgdGhhdCB0aGUgIEFQIGlzICByZWFsbHkgIHVzaW5nIDgwMi4xeAorKiBhdXRoZW50aWNhdGlvbiwgYW5kIHByb2NlZWRzIG9uIHRoYXQgYXNzdW1wdGlvbi4KKyoKKyogTm93LCBpbWFnaW5lIGFuIEFQIHRoYXQgaXMgY29uZmlndXJlZCBmb3IgV1BBLVBTSywgYW5kIGlzIFdQUy1jYXBhYmxlLgorKiBJdCByZWNlaXZlcyAgYW4gYXNzb2NpYXRpb24gIHJlcXVlc3QgZnJvbSBzb21lICBTVEEsIGFuZCB0aGVuICBzZWVzIGFuCisqIEVBUE9MLVN0YXJ0IGZyb20gdGhlIG5ld2x5IGpvaW5lZCBTVEEuICBJdCBuYXR1cmFsbHkgc2VuZHMgYmFjayBhbiBFQVAKKyogSWRlbnRpdHkgUmVxdWVzdCAgdG8gc2VlICBpZiB0aGUgIG5ldyBTVEEgd2FudHMgIHRvIHRhbGsgIEVBUC1XU0MuICBPbgorKiBXaW5kb3dzIFhQIFNQMSAmIFNQMiwgdGhlICBzdXBwbGljYW50IHdpbGwgdGFrZSB0aGF0IHRvIG1lYW4gdGhhdCB0aGlzCisqIEFQIGlzIHVzaW5nIDgwMi4xeCBhdXRoZW50aWNhdGlvbiwgYW5kIHdpbGwgbmV2ZXIgbGV0IHRoZSB1c2VyIHByb3ZpZGUKKyogdGhlIFBTSy4gQ29uc2VxdWVudGx5LCAgV1pDIHdpbGwgbmV2ZXIgYmUgYWJsZSAgdG8gYXNzb2NpYXRlIHdpdGggdGhpcworKiBBUC4KKyoKKyogTmF0dXJhbGx5LCAgTWljcm9zb2Z0J3MgIHNvbHV0aW9uIHdhcyAgdG8gIGhhdmUgIHRoZSAgd29ybGQgY2hhbmdlICB0bworKiBhY2NvbW1vZGF0ZSB0aGVtLiAgQWZ0ZXIgYSBsb3Qgb2YgYmFjayAmIGZvcnRoLCB0aGUgV0ZBIGRlY2lkZWQgb24gdGhlCisqIGZvbGxvd2luZyBjaGFuZ2UgdG8gdGhlIFdQUyBzcGVjOiB3aGVuIGFzc29jaWF0aW5nIGZvciBwdXJwb3NlcyBvZiBXUFMKKyogZW5yb2xsbWVudCwgIkEgIGNsaWVudCB0aGF0IGludGVuZHMgdG8gIHVzZSB0aGUgRUFQLVdTQyAgbWV0aG9kIHdpdGggYQorKiBXU0MgIGVuYWJsZWQgQVAgbWF5ICBpbmNsdWRlIGEgIFdTQyBJRSAgaW4gaXRzICA4MDIuMTEgKHJlKWFzc29jaWF0aW9uCisqIHJlcXVlc3QuIElmIGEgV1NDIElFIGlzIHByZXNlbnQgaW4gdGhlIChyZSlhc3NvY2lhdGlvbiByZXF1ZXN0LCB0aGUgQVAKKyogc2hhbGwgZW5nYWdlICBpbiBFQVAtV1NDIHdpdGggdGhlICBzdGF0aW9uIGFuZCBtdXN0ICBub3QgYXR0ZW1wdCBvdGhlcgorKiBzZWN1cml0eSBoYW5kc2hha2UuICBJZiB0aGUgY2xpZW50ICBkb2VzIG5vdCBpbmNsdWRlICBhIFdTQyBJRSAgaW4gaXRzCisqIDgwMi4xMSAocmUpYXNzb2NpYXRpb24gcmVxdWVzdCwgaXQgbXVzdCBzZW5kIGl0cyA4MDIuMTEgQXV0aGVudGljYXRpb24KKyogZnJhbWUgIHdpdGggIEF1dGhlbnRpY2F0aW9uIHNldCAgdG8gIG9wZW4gIGFuZCAgYW4gODAyLjExICBBc3NvY2lhdGlvbgorKiBSZXF1ZXN0IGZyYW1lIHdpdGhvdXQgIGFuIFJTTiBJRSBvciBTU04gSUUsICByZWdhcmRsZXNzIG9mIHRoZSBuZXR3b3JrCisqIHR5cGUgdGhhdCBpcyAgaG9zdGVkIGJ5IHRoZSBBUC4gT24gIHN1Y2Nlc3NmdWwgYXNzb2NpYXRpb24sIHRoZSBjbGllbnQKKyogd2lsbCAgIHRoZW4gICBzZW5kICBhbiAgIEVBUE9MLVN0YXJ0ICAgdG8gICB0aGUgICBBUCAgYW5kICAgd2FpdCAgIGZvcgorKiBFQVAtUmVxdWVzdC9JZGVudGl0eS4gIFdoZW4gIHRoZSAgIGNsaWVudCAgcmVjZWl2ZXMgIGFuICBFQVAgIFJlcXVlc3QvCisqIElkZW50aXR5LCAgIGl0ICB3aWxsICByZXNwb25kICAgd2l0aCAgRUFQLVJlc3BvbnNlL0lkZW50aXR5ICAgYW5kICB0aGUKKyogYXBwcm9wcmlhdGUgV1NDIHN0cmluZyB0byBpbmRpY2F0ZSAgaWYgaXQgaXMgYW4gRW5yb2xsZWUgb3IgUmVnaXN0cmFyLgorKiAnCisqCisqIFRoaXMgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBjb250YWlucyBhIGJpdHZlY3RvcjoKKyoKKyogMHgwMDAxIEluY2xkdWUgdGhlIFdQUyBJbmZvcm1hdGlvbiBFbGVtZW50IGluIEFzc29jIFJlcXVlc3QgZnJhbWVzCisqIDB4MDAwMiBFbGlkZSB0aGUgdGhlIFdQQSBhbmQgUlNOIEluZm9ybWF0aW9uIEVsZW1lbnRzIGZyb20gdGhlCisqICAgICAgICBBc3NvYyBSZXF1ZXN0IGZyYW1lCisqCisKK1dOSV9DRkdfV1BTX0FTU09DX01FVEhPRCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTElNCiswIDB4ZmZmZiAwCitWICAgIFJXICAgIE5QCitMSU0KKzAgMHhmZmZmIDAKKworKgorKiBMb3cgZ2FpbiBvdmVycmlkZQorKgorCitXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFICAgIEkgICAgNCAgICA5CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMSAgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMSAgICAwCisKKyoKKyogTGlzdGVuIE1vZGUgRW5hYmxlL0Rpc2FibGUKKyoKKworV05JX0NGR19FTkFCTEVfUEhZX0FHQ19MSVNURU5fTU9ERSAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDEyOCAgICAxMjgKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxMjggICAgMTI4CisKKyoKKyogT24gY2hpcCByZW9kZXJpbmcgcG9sbGluZyB0aHJlc2hvbGQKKyoKKworV05JX0NGR19SUEVfUE9MTElOR19USFJFU0hPTEQgICAgSSAgICA0ICAgIDIKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAxMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDEwCisKKyoKKyogT24gY2hpcCByZW9kZXJpbmcgYWdpbmcgdGhyZXNob2xkIGZvciBBQzAKKyoKKworV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzBfUkVHICAgIEkgICAgNCAgICAyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMzAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAzMAorCisqCisqIE9uIGNoaXAgcmVvZGVyaW5nIGFnaW5nIHRocmVzaG9sZCBmb3IgQUMxCisqCisKK1dOSV9DRkdfUlBFX0FHSU5HX1RIUkVTSE9MRF9GT1JfQUMxX1JFRyAgICBJICAgIDQgICAgMgorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDMwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMzAKKworKgorKiBPbiBjaGlwIHJlb2RlcmluZyBhZ2luZyB0aHJlc2hvbGQgZm9yIEFDMgorKgorCitXTklfQ0ZHX1JQRV9BR0lOR19USFJFU0hPTERfRk9SX0FDMl9SRUcgICAgSSAgICA0ICAgIDIKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAzMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDMwCisKKyoKKyogT24gY2hpcCByZW9kZXJpbmcgYWdpbmcgdGhyZXNob2xkIGZvciBBQzMKKyoKKworV05JX0NGR19SUEVfQUdJTkdfVEhSRVNIT0xEX0ZPUl9BQzNfUkVHICAgIEkgICAgNCAgICAyCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgNjU1MzUgICAgMzAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAzMAorCisqCisqIE51bWJlciBvZiBPbi1DaGlwIHJlb3JkZXIgc2Vzc2lvbnMKKyoKKworV05JX0NGR19OT19PRl9PTkNISVBfUkVPUkRFUl9TRVNTSU9OUyAgICBJICAgIDQgICAgMgorViAgICBSVyAgICBOUAorSEFMCiswICAgIDIgICAgMQorViAgICBSVyAgICBOUAorSEFMCiswICAgIDIgICAgMQorCisKKyoKKyogU2luZ2xlIFJDIGZvciBhbGwgVElEIAorKgorCitXTklfQ0ZHX1NJTkdMRV9USURfUkMgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAxCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorCisqCisqIFJSTSBFbmFibGVkIAorKgorCitXTklfQ0ZHX1JSTV9FTkFCTEVEICAgIEkgICAgNCAgICA4CitWICAgIFJXICAgIE5QIAorTk9ORQorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAgCitOT05FCiswICAgIDEgICAgMAorCisqCisqIFJSTSBtZWFzdXJlbWVudCBtYXggZHVyYXRpb24uIFNlY3Rpb24gMTEuMTAuMyA4MDIuMTFrLTIwMDguCisqIE1heCBEdXJhdGlvbiByZXByZXNlbnRlZCBhcyBtYXhEdXJhdGlvbiBpblRVcyA9IDJeKCpXTklfQ0ZHX1JSTV9JTl9DSEFOX01BWCAtIDQpICogYmNuSW50dmwKKyogT3BlcmF0aW5nIGNoYW5uZWwgbWF4IG1lYXN1cmVtZW50IGR1cmF0aW9uLgorKgorCitXTklfQ0ZHX1JSTV9PUEVSQVRJTkdfQ0hBTl9NQVggICAgSSAgICA0ICAgIDgKK1YgICAgUlcgICAgTlAgCitOT05FCiswICAgIDggICAgMAorViAgICBSVyAgICBOUCAKK05PTkUKKzAgICAgOCAgICAwCisKKyoKKyogTm9uLU9wZXJhdGluZyBjaGFubmVsIG1heCBtZWFzdXJlbWVudCBkdXJhdGlvbi4KKyoKKworV05JX0NGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWCAgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUCAKK05PTkUKKzAgICAgOCAgICAwCitWICAgIFJXICAgIE5QIAorTk9ORQorMCAgICA4ICAgIDAKKyAgIAorKgorKiBUWCBwb3dlciBjb250cm9sIGZlYXR1cmUKKyoKKworV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEUgICAgSSAgIDQgICA4CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgMQorViAgICBSVyAgICBOUAorTk9ORQorMCAgICAxICAgIDEKKworKgorKiAgTUNBU1QgQkNBU1QgZmlsdGVyIFNldHRpbmcKKyogIDA6IE5vIGZpbHRlciwgMTogQmxvY2sgTWNhc3QsIDI6IEJsb2NrIEJjYXN0LCAzOiBCbG9jayBNY2FzdCBhbmQgQmNhc3QKKyoKKworV05JX0NGR19NQ0FTVF9CQ0FTVF9GSUxURVJfU0VUVElORyAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDMgICAgMAorViAgICBSVyAgICBOUAorSEFMCiswICAgIDMgICAgMAorCisqCisqICBCVEMgREhDUCBObyBvZiBCdCBzbG90cyB0byBibG9jayAKKyoKK1dOSV9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0sgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAweEZGICAgICAwCitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgMHhGRiAgICAgMAorCisqCisqICBDb25maWcgcGFyYW1ldGVyIHRvIEVuYWJsZS9EaXNhYmxlIER5bmFtaWMgUFMtUG9sbCBtZWNoYW5pc20gCisqICAwOiBEaXNhYmxlLCB4OiBGVyB3aWxsIHNlbmQgeCBudW1iZXIgb2YgTlVMTCBmcmFtZXMgYmVmb3JlIHN3aXRjaGluZyB0byBQUy1Qb2xsIG1leGhhbmlzbQorKgorV05JX0NGR19EWU5BTUlDX1BTX1BPTExfVkFMVUUgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAweEZGICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAweEZGICAgIDAKKworKgorKiBQUyBEYXRhIEluQWN0aXZpdHkgVGltZW91dCAoVFUpCisqCisKK1dOSV9DRkdfUFNfTlVMTERBVEFfQVBfUkVTUF9USU1FT1VUICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitIQUwKKzAgICAgODAgICAgMAorTlYgICAgUlcgICAgTlAKK05PTkUKKzAgICAgODAgICAgMAorCisqCisqICBDb25maWcgcGFyYW1ldGVyIHRvIEVuYWJsZS9EaXNhYmxlIFRlbGVzY29waWMgQmNuIFdha2V1cHMgCisqICAwOiBEaXNhYmxlLCAxOiBFbmFibGUKKyoKKworV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU4gICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAxICAgIDAKKworCisqCisqICBDb25maWcgcGFyYW1ldGVyIGZvciBUcmFuc2llbnQgTEkgCisqICAwOiBEaXNhYmxlLCB4OiBUcmFuc2llbnQgTEkKKyoKKworV05JX0NGR19URUxFX0JDTl9UUkFOU19MSSAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDcgICAgMworViAgICBSVyAgICBOUAorSEFMCiswICAgIDcgICAgMworCisqCisqICBDb25maWcgcGFyYW1ldGVyIGZvciBJZGxlIGJjbnMgZm9yIFRyYW5zaWVudCBMSSAKKyogIHg6IE51bSBJZGxlIGJjbnMgYmVmb3JlIHN3aXRjaCB0byB0cmFucyBMSQorKgorCitXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0lETEVfQkNOUyAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCis1ICAgIDI1NSAgICAxMAorViAgICBSVyAgICBOUAorSEFMCis1ICAgIDI1NSAgICAxMAorCisqCisqICBDb25maWcgcGFyYW1ldGVyIGZvciBNYXggTEkgCisqICAwOiBEaXNhYmxlLCB4OiBNYXggTEkKKyoKKworV05JX0NGR19URUxFX0JDTl9NQVhfTEkgICAgSSAgICA0ICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA3ICAgIDUKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA3ICAgIDUKKworKgorKiAgQ29uZmlnIHBhcmFtZXRlciBmb3IgSWRsZSBiY25zIGZvciBtYXggTEkgCisqICB4OiBOdW0gSWRsZSBiY25zIGJlZm9yZSBzd2l0Y2ggdG8gbWF4IExJCisqCisKK1dOSV9DRkdfVEVMRV9CQ05fTUFYX0xJX0lETEVfQkNOUyAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCis1ICAgIDI1NSAgICAxNQorViAgICBSVyAgICBOUAorSEFMCis1ICAgIDI1NSAgICAxNQorCisqCisqICBCVEMgREhDUCBObyBvZiBCdCBzdWIgaW50ZXJ2YWwgZHVyaW5nIERIQ1AgCisqCitXTklfQ0ZHX0JUQ19BMkRQX0RIQ1BfQlRfU1VCX0lOVEVSVkFMUyAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDB4RkYgICAgIDcKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICAweEZGICAgICA3CisKKyogCisqIEluZnJhIFNUQSBtb2RlIEtlZXAgYWxpdmUgcGVyaW9kIChpbiBzZWNzKSBmb3IgCisqIHNlbmRpbmcga2VlcCBhbGl2ZSAoUW9zKU51bGwgZnJhbWVzIHRvIHRoZSBBUC4KKyogMCA9IGRpc2FibGVkLiBSZWNvbW1lbmRlZCB2YWx1ZXMgaXMgMzAgc2VjcworKgorV05JX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0QgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCiswICAgIDY1NTM1ICAgIDAKK1YgICAgUlcgICAgTlAKK0hBTAorMCAgICA2NTUzNSAgICAwCisKKyogTGltaXQgb24gbnVtYmVyIG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMKKyogKGFwcGxpZXMgdG8gcGVlciBzdGF0aW9ucyBpbiBJQlNTLCBTb2Z0QVAsIEJULUFNUCBBUCwgJiBQMlAtR08gbW9kZXMpCisqCisKK1dOSV9DRkdfQVNTT0NfU1RBX0xJTUlUICAgIEkgICA0ICAgOAorViAgICBSVyAgICBOUAorTElNCisxICAgIDEwICAgIDEwCitWICAgIFJXICAgIE5QCitMSU0KKzEgICAgMTAgICAgMTAKKworKgorKiAgU0FQIGNoYW5uZWwgc2VsZWN0IHN0YXJ0IGNoYW5uZWwgbnVtYmVyCisqCitXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMICAgIEkgICAgNCAgICA3CitWICAgIFJXICAgIE5QCitOT05FCisxICAgIDB4RkMgIDEgICAKK1YgICAgUlcgICAgTlAKK05PTkUKKzEgICAgMHhGQyAgMQorCisqCisqICBTQVAgY2hhbm5lbCBzZWxlY3QgZW5kIGNoYW5uZWwgbnVtYmVyCisqCitXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTk9ORQorMSAgICAweEZDICAxMQorViAgICBSVyAgICBOUAorTk9ORQorMSAgICAweEZDICAxMQorCisqCisqICBTQVAgY2hhbm5lbCBzZWxlY3Qgb3BlcmF0aW5nIGJhbmQKKyogIDAtIDIuNEdIWiAvIDEtIExvdyA1R0haIC8yLU1JRCAvMy1ISUdILzQtSmFwYW40LjlHSFoKKyoKK1dOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5EICAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorTk9ORQorMCAgICAweDQgICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMHg0ICAgICAwCisKKyogCisqIFNvZnRhcCBkYXRhIGF2YWlsYWJsZSBwb2xsIHBlcmlvZCAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgCisqIHF1ZXVlaW5nIChRb3MpTnVsbCBmcmFtZXMgdG8gdGhlIHN0YXRpb24gaWYgdGhlcmUgCisqIGlzIG5vIGRhdGEgYXZhaWxhYmxlIGFuZCBQUy1Qb2xsL1RyaWdnZXIgZnJhbWUgaXMgcGVuZGluZy4KKyogMCA9IGRpc2FibGVkLiBSZWNvbW1lbmRlZCB2YWx1ZXMgaXMgNW1zCisqCitXTklfQ0ZHX0FQX0RBVEFfQVZBSUxfUE9MTF9QRVJJT0QgICBJICAgIDQgICAgOAorViAgICBSVyAgICBOUAorTk9ORQorMCAgICA2NTUzNSAgICA1CitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDY1NTM1ICAgIDUKKworKgorKiBDbG9zZSBsb29wIHBvd2VyIGNvbnRyb2wgd2lsbCBiZSBlbmFibGVkIGlmIHZhbHVlIGlzIHNldCB0byAxCisqIAorKgorKgorV05JX0NGR19FTkFCTEVfQ0xPU0VfTE9PUCAgSSAgIDQgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAgMAorCisqCisqIExURSBDb2V4aXN0ZW5jZSB3aWxsIGJlIGVuYWJsZWQgaWYgdmFsdWUgaXMgc2V0IHRvIDEKKyogCisqCisqCitXTklfQ0ZHX0VOQUJMRV9MVEVfQ09FWCAgSSAgIDQgICAwCitWICAgIFJXICAgIE5QCitOT05FCiswICAgIDEgICAgIDAKK1YgICAgUlcgICAgTlAKK05PTkUKKzAgICAgMSAgICAgMAorCisqCisqIEFQIEtlZXAgQWxpdmUgVGltZW91dCAoVFUpCisqCitXTklfQ0ZHX0FQX0tFRVBfQUxJVkVfVElNRU9VVCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCisxICAgIDI1NSAgICAyMAorViAgICBSVyAgICBOUAorSEFMCisxICAgIDI1NSAgICAyMAorCisqCisqIEdPIEtlZXAgQWxpdmUgVGltZW91dCAoVFUpCisqCitXTklfQ0ZHX0dPX0tFRVBfQUxJVkVfVElNRU9VVCAgICBJICAgIDQgICAgNworViAgICBSVyAgICBOUAorSEFMCisxICAgIDI1NSAgICAyMAorViAgICBSVyAgICBOUAorSEFMCisxICAgIDI1NSAgICAyMApkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2NmZy9wb2xGaWxlLmggYi9DT1JFL01BQy9zcmMvY2ZnL3BvbEZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGU2NzNjCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL2NmZy9wb2xGaWxlLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vICBGaWxlOiAgICAgICAgIHBvbEZpbGUuaAorLy8KKy8vICBEZXNjcmlwdGlvbjogIFN0cnVjdHVyZXMgdGhhdCBkZWZpbmUgdGhlIGZpcm13YXJlIGZpbGUgZm9ybWF0LiAgICAgICAgICAgICAgICAKKy8vCisvLyAgQXV0aG9yOiAgICAgICBMYXJyeSBDYXdsZXkKKy8vIAorLy8gIENvcHlyaWdodCAyMDAyLCBXb29kc2lkZSBOZXR3b3JrcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyAgQ2hhbmdlIEhpc3Rvcnk6CisvLyAgMDQvMDkvMjAwMiAtIExBQyAtIEluaXRpYWwgdmVyc2lvbi4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZiAhZGVmaW5lZCggX19wb2xGaWxlX2hfXyApCisjZGVmaW5lIF9fcG9sRmlsZV9oX18KKworCisKKyAgIAorLy8gRmlsZSBmb3JtYXQKKy8vCisvLyAgYnl0ZSAwICAgICAgICAxICAgICAgICAyICAgICAgIDMKKy8vCisvLyArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tKworLy8gfCBNYWpvciAgIHwgTWlub3IgICB8ICAgICAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vIHwgVmVyc2lvbiB8IFZlcnNpb24gfCBTdWZmaXggfCBCdWlsZCB8ICAgRmlsZVZlcnNpb24gICAgICAgICAgICAgICB8CisvLyArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gfCBNYWpvciAgIHwgTWlub3IgICB8ICAgICAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vIHwgVmVyc2lvbiB8IFZlcnNpb24gfCBTdWZmaXggfCBCdWlsZCB8ICAgSHdDYXBhYmlsaXRpZXMgICAgICAgICAgICB8IHRQb2xGaWxlSGVhZGVyCisvLyArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vIHwgRmlsZUxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgRmlsZUxlbmd0aCAgICAgICAgICAgICAgICB8CisvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vIHwgTnVtYmVyIG9mIERpcmVjdG9yeSBFbnRyaWVzICAgICAgICB8ICAgTnVtRGlyZWN0b3J5RW50cmllcyAgICAgICB8CisvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vIHwgRGlyZWN0b3J5IEVudHJ5IDEgVHlwZSAgICAgICAgICAgICB8ICAgRGlyRW50cnlUeXBlICAgICAgICAgICAgICB8CisvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdFBvbEZpbGVEaXJFbnRyeSAxCisvLyB8IERpcmVjdG9yeSBFbnRyeSAxIEZpbGUgT2Zmc2V0ICAgICAgfCAgIERpckVudHJ5RmlsZU9mZnNldCAgICAgICAgfAorLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyB8IERpcmVjdG9yeSBFbnRyeSAxIExlbmd0aCAgICAgICAgICAgfCAgIERpckVudHJ5TGVuZ3RoICAgICAgICAgICAgfAorLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLSsKKy8vIHwgICAgICAgICAgICAuIC4gLiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgLiAuIC4gCisvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vIHwgRGlyZWN0b3J5IEVudHJ5IG4gVHlwZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHBvbEZpbGVEaXJFbnRyeSBuCisvLyB8IERpcmVjdG9yeSBFbnRyeSBuIEZpbGUgT2Zmc2V0ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyB8IERpcmVjdG9yeSBFbnRyeSBuIExlbmd0aCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gfCBGaWxlIGRhdGEgZGVzY3JpYmVkIGJ5ICAgICAgICAgICAgIHwKKy8vIHwgZGlyZWN0b3J5IGVudHJ5IDEgICAgICAgICAgICAgICAgICB8CisvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyB8ICAgICAgICAgICAgLiAuIC4gICAgICAgICAgICAgICAgICAgfAorLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gfCBGaWxlIGRhdGEgZGVzY3JpYmVkIGJ5ICAgICAgICAgICAgIHwKKy8vIHwgZGlyZWN0b3J5IGVudHJ5IG4gICAgICAgICAgICAgICAgICB8CisvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisvLyB8ICAgICAgICAgICAgICAgICAgIHwKKy8vIHwgRmlsZSBDaGVja3N1bSAgICAgfAorLy8gKy0tLS0tLS0tLSstLS0tLS0tLS0rCisvLworLy8KKy8vICAgICAgICAgCisvLworCisKKyNwcmFnbWEgcGFjayggcHVzaCApCisjcHJhZ21hIHBhY2soIDEgKQorCit0eXBlZGVmIHN0cnVjdCBzUG9sRmlsZVZlcnNpb24geworCisgIHVuc2lnbmVkIGNoYXIgIE1ham9yVmVyc2lvbjsKKyAgdW5zaWduZWQgY2hhciAgTWlub3JWZXJzaW9uOworICB1bnNpZ25lZCBjaGFyICBTdWZmaXg7CisgIHVuc2lnbmVkIGNoYXIgIEJ1aWxkOworCit9IHRQb2xGaWxlVmVyc2lvbjsKKworCit0eXBlZGVmIHN0cnVjdCBzUG9sRmlsZUhlYWRlciB7CisKKyAgdFBvbEZpbGVWZXJzaW9uIEZpbGVWZXJzaW9uOworICB0UG9sRmlsZVZlcnNpb24gSFdDYXBhYmlsaXRpZXM7CisgIHVuc2lnbmVkIGxvbmcgICBGaWxlTGVuZ3RoOworICB1bnNpZ25lZCBsb25nICAgTnVtRGlyZWN0b3J5RW50cmllczsKKworfSB0UG9sRmlsZUhlYWRlcjsKKworCit0eXBlZGVmIGVudW0gZVBvbEZpbGVEaXJUeXBlcyB7CisKKyAgZVBPTF9ESVJfVFlQRV9CT09UTE9BREVSID0gMCwKKyAgZVBPTF9ESVJfVFlQRV9TVEFfRklSTVdBUkUsCisgIGVQT0xfRElSX1RZUEVfQVBfRklSTVdBUkUsCisgIGVQT0xfRElSX1RZUEVfRElBR19GSVJNV0FSRSwKKyAgZVBPTF9ESVJfVFlQRV9TVEFfQ09ORklHLAorICBlUE9MX0RJUl9UWVBFX0FQX0NPTkZJRworCit9IHRQb2xGaWxlRGlyVHlwZXM7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc1BvbEZpbGVEaXJFbnRyeSB7CisKKyAgdW5zaWduZWQgbG9uZyBEaXJFbnRyeVR5cGU7CisgIHVuc2lnbmVkIGxvbmcgRGlyRW50cnlGaWxlT2Zmc2V0OworICB1bnNpZ25lZCBsb25nIERpckVudHJ5TGVuZ3RoOworCit9IHRQb2xGaWxlRGlyRW50cnk7CisKKworI3ByYWdtYSBwYWNrKCBwb3AgKQorCisKK19faW5saW5lIHVuc2lnbmVkIHNob3J0IHBvbEZpbGVDaGtTdW0oIHVuc2lnbmVkIHNob3J0ICpGaWxlRGF0YSwgdW5zaWduZWQgbG9uZyBOdW1Xb3JkcyApCit7CisgIHVuc2lnbmVkIGxvbmcgU3VtOworCisgIGZvciAoIFN1bSA9IDA7IE51bVdvcmRzID4gMDsgTnVtV29yZHMtLSApIHsKKworICAgIFN1bSArPSAqRmlsZURhdGErKzsKKyAgfQorCisgIFN1bSAgPSAoU3VtID4+IDE2KSArIChTdW0gJiAweGZmZmYpOyAvLyBhZGQgY2FycnkKKyAgU3VtICs9IChTdW0gPj4gMTYpOyAgICAgICAgICAgICAgICAgIC8vIG1heWJlIGxhc3QgdW5zaWduZWQgc2hvcnQKKworICByZXR1cm4oICh1bnNpZ25lZCBzaG9ydCkoIH5TdW0gKSApOworfQorCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9kcGgvZHBoSGFzaFRhYmxlLmMgYi9DT1JFL01BQy9zcmMvZHBoL2RwaEhhc2hUYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzkxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvZHBoL2RwaEhhc2hUYWJsZS5jCkBAIC0wLDAgKzEsNDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGRwaEhhc2hUYWJsZS5jYyBpbXBsZW1lbnRzIHRoZSBtZW1iZXIgZnVuY3Rpb25zIG9mCisgKiBEUEggaGFzaCB0YWJsZSBjbGFzcy4KKyAqCisgKiBBdXRob3I6ICAgICAgU2FuZGVzaCBHb2VsCisgKiBEYXRlOiAgICAgICAgMDIvMjUvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJwYWxUeXBlcy5oIgorI2luY2x1ZGUgImNmZ0FwaS5oIgorI2luY2x1ZGUgInNjaEFwaS5oIgorI2luY2x1ZGUgImRwaEdsb2JhbC5oIgorI2luY2x1ZGUgImxpbURlYnVnLmgiCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsQ29tbW9uQXBpLmgiCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbE1zZ0FwaS5oIiAKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogZHBoSGFzaFRhYmxlQ2xhc3MoKQorICoKKyAqIEZVTkNUSU9OOgorICogQ29uc3RydWN0b3IgZnVuY3Rpb24KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGRwaEhhc2hUYWJsZUNsYXNzSW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjLCBkcGhIYXNoVGFibGVDbGFzcyogcERwaEhhc2hUYWJsZSkKK3sKKyAgdEFOSV9VMTYgaTsKKworICBmb3IgKGk9MDsgaTxwRHBoSGFzaFRhYmxlLT5zaXplOyBpKyspCisgICAgeworICAgICAgcERwaEhhc2hUYWJsZS0+cEhhc2hUYWJsZVtpXSA9IDA7CisgICAgfQorCisgIGZvciAoaT0wOyBpPHBEcGhIYXNoVGFibGUtPnNpemU7IGkrKykKKyAgICB7CisgICAgICBwRHBoSGFzaFRhYmxlLT5wRHBoTm9kZUFycmF5W2ldLnZhbGlkID0gMDsKKyAgICAgIHBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbaV0uYWRkZWQgPSAwOworICAgICAgcERwaEhhc2hUYWJsZS0+cERwaE5vZGVBcnJheVtpXS5hc3NvY0lkID0gaTsKKyAgICB9CisgICAgCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBoYXNoRnVuY3Rpb24KKyAqCisgKiBGVU5DVElPTjoKKyAqIEhhc2hpbmcgZnVuY3Rpb24KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFBZGRyIE1BQyBhZGRyZXNzIG9mIHRoZSBzdGF0aW9uCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0QU5JX1UxNiBoYXNoRnVuY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBzdGFBZGRyW10sIHRBTklfVTE2IG51bVN0YSkKK3sKKyAgaW50IGk7CisgIHRBTklfVTE2IHN1bSA9IDA7CisgIAorICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgc3VtICs9IHN0YUFkZHJbaV07CisgICAKKyAgcmV0dXJuIChzdW0gJSBudW1TdGEpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogZHBoTG9va3VwSGFzaEVudHJ5CisgKgorICogRlVOQ1RJT046CisgKiBMb29rIHVwIGFuIGVudHJ5IGluIGhhc2ggdGFibGUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFBZGRyIE1BQyBhZGRyZXNzIG9mIHRoZSBzdGF0aW9uCisgKiBAcGFyYW0gcFN0YUlkIHBvaW50ZXIgdG8gdGhlIFN0YXRpb24gSUQgYXNzaWduZWQgdG8gdGhlIHN0YXRpb24KKyAqIEByZXR1cm4gcG9pbnRlciB0byBTVEEgaGFzaCBlbnRyeSBpZiBsb29rdXAgd2FzIGEgc3VjY2VzcyBcbgorICogICAgICAgICBOVUxMIGlmIGxvb2t1cCB3YXMgYSBmYWlsdXJlCisgKi8KKwordHBEcGhIYXNoTm9kZSBkcGhMb29rdXBIYXNoRW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBzdGFBZGRyW10sIHRBTklfVTE2ICpwQXNzb2NJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGhIYXNoVGFibGVDbGFzcyogcERwaEhhc2hUYWJsZSkKK3sKKyAgICB0cERwaEhhc2hOb2RlIHB0ciA9IE5VTEw7CisgICAgdEFOSV9VMTYgaW5kZXggPSBoYXNoRnVuY3Rpb24ocE1hYywgc3RhQWRkciwgcERwaEhhc2hUYWJsZS0+c2l6ZSk7CisKKyAgICBmb3IgKHB0ciA9IHBEcGhIYXNoVGFibGUtPnBIYXNoVGFibGVbaW5kZXhdOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRwaENvbXBhcmVNYWNBZGRyKHN0YUFkZHIsIHB0ci0+c3RhQWRkcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcEFzc29jSWQgPSBwdHItPmFzc29jSWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHJldHVybiBwdHI7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBkcGhHZXRIYXNoRW50cnkKKyAqCisgKiBGVU5DVElPTjoKKyAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIGhhc2ggbm9kZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHN0YUlkIFN0YXRpb24gSUQKKyAqIEByZXR1cm4gcG9pbnRlciB0byBTVEEgaGFzaCBlbnRyeSBpZiBsb29rdXAgd2FzIGEgc3VjY2VzcyBcbgorICogICAgICAgICBOVUxMIGlmIGxvb2t1cCB3YXMgYSBmYWlsdXJlCisgKi8KKwordHBEcGhIYXNoTm9kZSBkcGhHZXRIYXNoRW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgYXNzb2NJZCwgZHBoSGFzaFRhYmxlQ2xhc3MqIHBEcGhIYXNoVGFibGUpCit7CisgICAgaWYgKGFzc29jSWQgPCBwRHBoSGFzaFRhYmxlLT5zaXplKQorICAgIHsKKyAgICAgICAgaWYgKHBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbYXNzb2NJZF0uYWRkZWQpCisgICAgICAgICAgcmV0dXJuICZwRHBoSGFzaFRhYmxlLT5wRHBoTm9kZUFycmF5W2Fzc29jSWRdOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKworfQorCitzdGF0aWMgaW5saW5lIHRwRHBoSGFzaE5vZGUgZ2V0Tm9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGFzc29jSWQsIGRwaEhhc2hUYWJsZUNsYXNzKiBwRHBoSGFzaFRhYmxlKQoreworICAgIHJldHVybiAmcERwaEhhc2hUYWJsZS0+cERwaE5vZGVBcnJheVthc3NvY0lkXTsKK30KKworCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIGRwaExvb2t1cEFzc29jSWQKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gbG9va3MgdXAgYXNzb2NJRCBnaXZlbiB0aGUgc3RhdGlvbiBJZC4gSXQgdHJhdmVyc2VzIHRoZSBjb21wbGV0ZSB0YWJsZSB0byBkbyB0aGlzLgorICogTmVlZCB0byBmaW5kIGFuIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcy4KKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgcG9pbnRlciB0byBnbG9iYWwgTWFjIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBzdGFJZHggc3RhdGlvbiBJRAorICogQHBhcmFtICphc3NvY0lkIHBvaW50ZXIgdG8gYXNzb2NpZCB0byBiZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLgorICogQHJldHVybiBwb2ludGVyIHRvIHRoZSBkcGggbm9kZS4KKyAqLwordHBEcGhIYXNoTm9kZSBkcGhMb29rdXBBc3NvY0lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsICB0QU5JX1UxNiBzdGFJZHgsIHRBTklfVTE2KiBhc3NvY0lkLCBkcGhIYXNoVGFibGVDbGFzcyogcERwaEhhc2hUYWJsZSkKK3sKKyAgICB0QU5JX1U4IGk7CisKKyAgICBmb3IoaT0wOyBpPHBEcGhIYXNoVGFibGUtPnNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIChwRHBoSGFzaFRhYmxlLT5wRHBoTm9kZUFycmF5W2ldLmFkZGVkKSAmJgorICAgICAgICAgICAgICAgIChwRHBoSGFzaFRhYmxlLT5wRHBoTm9kZUFycmF5W2ldLnN0YUluZGV4ID09IHN0YUlkeCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqYXNzb2NJZCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgaWYoaT09cERwaEhhc2hUYWJsZS0+c2l6ZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICZwRHBoSGFzaFRhYmxlLT5wRHBoTm9kZUFycmF5W2ldOworCit9CisKKworCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gZHBoSW5pdFN0YVN0YXRlCitcYnJpZWYgSW5pdGlhbGl6ZSBTVEEgc3RhdGUuIHRoaXMgZnVuY3Rpb24gc2F2ZXMgdGhlIHN0YUlkIGZyb20gdGhlIGN1cnJlbnQgZW50cnkgaW4gdGhlIERQSCB0YWJsZSB3aXRoIGdpdmVuIGFzc29jSWQKK1wgaWYgdmFsaWRTdGFJZHggZmxhZyBpcyBzZXQuIE90aGVyd2lzZSBpdCBzZXRzIHRoZSBzdGFJZCB0byBpbnZhbGlkLgorXHBhcmFtICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gIHRTaXJNYWNBZGRyIHN0YUFkZHIKK1xwYXJhbSAgdEFOSV9VMTYgYXNzb2NJZAorXHBhcmFtICB0QU5JX1U4IHZhbGlkU3RhSWR4IC0gICB0cnVlID09PiB0aGUgc3RhSWQgaW4gdGhlIERQSCBlbnRyeSB3aXRoIGdpdmVuIGFzc29jSWQgaXMgdmFsaWQgYW5kIHJlc3RvcmUgaXQgYmFjay4KK1wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgPT0+IHNldCB0aGUgc3RhSWQgdG8gaW52YWxpZC4KK1xyZXR1cm4gdHBEcGhIYXNoTm9kZSAtIERQSCBoYXNoIG5vZGUgaWYgZm91bmQuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0cERwaEhhc2hOb2RlIGRwaEluaXRTdGFTdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBzdGFBZGRyLAorICAgICAgdEFOSV9VMTYgYXNzb2NJZCwgdEFOSV9VOCB2YWxpZFN0YUlkeCwgZHBoSGFzaFRhYmxlQ2xhc3MqIHBEcGhIYXNoVGFibGUpCit7CisgICAgdEFOSV9VMzIgdmFsOworCisgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisgICAgdEFOSV9VMTYgc3RhSWR4ID0gSEFMX1NUQV9JTlZBTElEX0lEWDsKKworICAgIGlmIChhc3NvY0lkID49IHBEcGhIYXNoVGFibGUtPnNpemUpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIEFzc29jIElkICVkXG4iKSwgYXNzb2NJZCk7KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwU3RhRHMgPSBnZXROb2RlKHBNYWMsICh0QU5JX1U4KSBhc3NvY0lkLCBwRHBoSGFzaFRhYmxlKTsKKyAgICBzdGFJZHggPSBwU3RhRHMtPnN0YUluZGV4OworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiQXNzb2MgSWQgJWQsIEFkZHIgJTA4WFxuIiksIGFzc29jSWQsIHBTdGFEcyk7KQorCisgICAgLy8gQ2xlYXIgdGhlIFNUQSBub2RlIGV4Y2VwdCBmb3IgdGhlIG5leHQgcG9pbnRlciAobGFzdCA0IGJ5dGVzKQorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBTdGFEcywgc2l6ZW9mKHREcGhIYXNoTm9kZSkgLSBzaXplb2YodHBEcGhIYXNoTm9kZSkpOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYXNzb2NJZAorICAgIHBTdGFEcy0+YXNzb2NJZCA9IGFzc29jSWQ7CisgICAgaWYodHJ1ZSA9PSB2YWxpZFN0YUlkeCkKKyAgICAgIHBTdGFEcy0+c3RhSW5kZXggPSBzdGFJZHg7CisgICAgZWxzZQorICAgICAgcFN0YURzLT5zdGFJbmRleCA9IEhBTF9TVEFfSU5WQUxJRF9JRFg7CisKKyAgICAvLyBJbml0aWFsaXplIFNUQSBtYWMgYWRkcmVzcworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTdGFEcy0+c3RhQWRkciwgc3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICAvLyBJbml0aWFsaXplIGZyYWdtZW50YXRpb24gdGhyZXNob2xkCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGRcbiIpKTsKKyAgICBlbHNlCisgICAgICAgIHBTdGFEcy0+ZnJhZ1NpemUgPSAodEFOSV9VMTYpIHZhbDsKKworICAgIHBTdGFEcy0+YWRkZWQgPSAxOworICAgIHBTdGFEcy0+ZW5jUG9saWN5ID0gSEFMX0VOQ19QT0xJQ1lfTlVMTDsKKworI2lmIGRlZmluZWQoIFBMTV9XRFMpJiZkZWZpbmVkKExYNTI4MCkKKyAgICBwU3RhRHMtPndkc0luZGV4PXBTdGFEcy0+d2RzUGVlckJlYWNvblNlZW49MDsKKyNlbmRpZgorCisjaWZkZWYgV01NX0FQU0QKKyAgICBwU3RhRHMtPnN0b3BRdWV1ZSA9IDA7CisgICAgcFN0YURzLT5zcFN0YXR1cyA9IDA7CisgICAgcFN0YURzLT5hcHNkTWF4U3BMZW4gPSAwOworICAgIHBTdGFEcy0+YWNNb2RlWzBdID0gcFN0YURzLT5hY01vZGVbMV0gPSBwU3RhRHMtPmFjTW9kZVsyXSA9IHBTdGFEcy0+YWNNb2RlWzNdID0gIDA7CisjZW5kaWYgLyogV01NX0FQU0QgKi8KKyAgICBwU3RhRHMtPnZhbGlkID0gMTsKKyAgICByZXR1cm4gcFN0YURzOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogZHBoQWRkSGFzaEVudHJ5CisgKgorICogRlVOQ1RJT046CisgKiBBZGQgZW50cnkgdG8gaGFzaCB0YWJsZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHN0YUFkZHIgTUFDIGFkZHJlc3Mgb2YgdGhlIHN0YXRpb24KKyAqIEBwYXJhbSBzdGFJZCBTdGF0aW9uIElEIGFzc2lnbmVkIHRvIHRoZSBzdGF0aW9uCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gU1RBIGhhc2ggZW50cnkKKyAqLworCit0cERwaEhhc2hOb2RlIGRwaEFkZEhhc2hFbnRyeSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBzdGFBZGRyLCB0QU5JX1UxNiBhc3NvY0lkLCBkcGhIYXNoVGFibGVDbGFzcyogcERwaEhhc2hUYWJsZSkKK3sKKyAgICB0cERwaEhhc2hOb2RlIHB0ciwgbm9kZTsKKyAgICB0QU5JX1UxNiBpbmRleCA9IGhhc2hGdW5jdGlvbihwTWFjLCBzdGFBZGRyLCBwRHBoSGFzaFRhYmxlLT5zaXplKTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoImFzc29jSWQgJWQgaW5kZXggJWQgU1RBIGFkZHJcbiIpLAorICAgICAgICAgICBhc3NvY0lkLCBpbmRleCk7CisgICAgZHBoUHJpbnRNYWNBZGRyKHBNYWMsIHN0YUFkZHIsIExPRzEpOykKKworICAgIGlmIChhc3NvY0lkID49IHBEcGhIYXNoVGFibGUtPnNpemUpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJpbnZhbGlkIFNUQSBpZCAlZFxuIiksIGFzc29jSWQpOykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbYXNzb2NJZF0uYWRkZWQpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJhbHJlYWR5IGFkZGVkIFNUQSAlZFxuIiksIGFzc29jSWQpOykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChwdHIgPSBwRHBoSGFzaFRhYmxlLT5wSGFzaFRhYmxlW2luZGV4XTsgcHRyOyBwdHIgPSBwdHItPm5leHQpCisgICAgeworICAgICAgICBpZiAocHRyID09IHB0ci0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiSW5maW5pdGUgTG9vcFxuIikpOykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRwaENvbXBhcmVNYWNBZGRyKHN0YUFkZHIsIHB0ci0+c3RhQWRkcikgfHwgcHRyLT5hc3NvY0lkPT0gYXNzb2NJZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChwdHIpCisgICAgeworICAgICAgICAvLyBEdXBsaWNhdGUgZW50cnkKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJhc3NvY0lkICVkIGhhc2hJbmRleCAlZCBlbnRyeSBleGlzdHNcbiIpLAorICAgICAgICAgICAgICAgICAgICAgYXNzb2NJZCwgaW5kZXgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGRwaEluaXRTdGFTdGF0ZShwTWFjLCBzdGFBZGRyLCBhc3NvY0lkLCBmYWxzZSwgcERwaEhhc2hUYWJsZSkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IEluaXQgU1RBaWQ9JWRcbiIpLCBhc3NvY0lkKTspCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBsaW5rIGxpc3QKKyAgICAgICAgcERwaEhhc2hUYWJsZS0+cERwaE5vZGVBcnJheVthc3NvY0lkXS5uZXh0ID0gcERwaEhhc2hUYWJsZS0+cEhhc2hUYWJsZVtpbmRleF07CisgICAgICAgIHBEcGhIYXNoVGFibGUtPnBIYXNoVGFibGVbaW5kZXhdID0gJnBEcGhIYXNoVGFibGUtPnBEcGhOb2RlQXJyYXlbYXNzb2NJZF07CisKKyAgICAgICAgbm9kZSA9IHBEcGhIYXNoVGFibGUtPnBIYXNoVGFibGVbaW5kZXhdOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBkcGhEZWxldGVIYXNoRW50cnkKKyAqCisgKiBGVU5DVElPTjoKKyAqIERlbGV0ZSBlbnRyeSBmcm9tIGhhc2ggdGFibGUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFBZGRyIE1BQyBhZGRyZXNzIG9mIHRoZSBzdGF0aW9uCisgKiBAcGFyYW0gc3RhSWQgU3RhdGlvbiBJRCBhc3NpZ25lZCB0byB0aGUgc3RhdGlvbgorICogQHJldHVybiBlU0lSX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCxcbgorICogICAgICAgICBlU0lSX0ZBSUxVUkUgb3RoZXJ3aXNlCisgKi8KKwordFNpclJldFN0YXR1cyBkcGhEZWxldGVIYXNoRW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgc3RhQWRkciwgdEFOSV9VMTYgYXNzb2NJZCwgZHBoSGFzaFRhYmxlQ2xhc3MqIHBEcGhIYXNoVGFibGUpCit7CisgIHRwRHBoSGFzaE5vZGUgcHRyLCBwcmV2OworICB0QU5JX1UxNiBpbmRleCA9IGhhc2hGdW5jdGlvbihwTWFjLCBzdGFBZGRyLCBwRHBoSGFzaFRhYmxlLT5zaXplKTsKKworCisgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoImFzc29jSWQgJWQgaW5kZXggJWQgU1RBIGFkZHJcbiIpLAorICAgICAgICAgICAgICAgICAgYXNzb2NJZCwgaW5kZXgpOworICBkcGhQcmludE1hY0FkZHIocE1hYywgc3RhQWRkciwgTE9HMSk7KQorCisgIGlmIChhc3NvY0lkID49IHBEcGhIYXNoVGFibGUtPnNpemUpCisgIHsKKyAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImludmFsaWQgU1RBIGlkICVkXG4iKSwgYXNzb2NJZCk7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgfQorCisgIGlmIChwRHBoSGFzaFRhYmxlLT5wRHBoTm9kZUFycmF5W2Fzc29jSWRdLmFkZGVkID09IDApCisgIHsKKyAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNUQSAlZCBuZXZlciBhZGRlZFxuIiksIGFzc29jSWQpOykKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgIH0KKworCisgIGZvciAocHJldiA9IDAsIHB0ciA9IHBEcGhIYXNoVGFibGUtPnBIYXNoVGFibGVbaW5kZXhdOworICAgICAgIHB0cjsKKyAgICAgICBwcmV2ID0gcHRyLCBwdHIgPSBwdHItPm5leHQpCisgIHsKKyAgICBpZiAoZHBoQ29tcGFyZU1hY0FkZHIoc3RhQWRkciwgcHRyLT5zdGFBZGRyKSkKKyAgICAgIGJyZWFrOworICAgIGlmIChwcmV2ID09IHB0cikKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkluZmluaXRlIExvb3BcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICB9CisKKyAgaWYgKHB0cikKKyAgICB7CisgICAgICAvLy8gRGVsZXRlIHRoZSBlbnRyeSBhZnRlciBpbnZhbGlkYXRpbmcgaXQKKyAgICAgIHB0ci0+dmFsaWQgPSAwOworICAgICAgaWYgKHByZXYgPT0gMCkKKyAgICAgICAgIHBEcGhIYXNoVGFibGUtPnBIYXNoVGFibGVbaW5kZXhdID0gcHRyLT5uZXh0OworICAgICAgZWxzZQorICAgICAgICAgcHJldi0+bmV4dCA9IHB0ci0+bmV4dDsKKyAgICAgIHB0ci0+YWRkZWQgPSAwOworICAgICAgcHRyLT5uZXh0ID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvLy8gRW50cnkgbm90IHByZXNlbnQKKyAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkVudHJ5IG5vdCBwcmVzZW50IFNUQSBhZGRyXG4iKSk7CisgICAgICBkcGhQcmludE1hY0FkZHIocE1hYywgc3RhQWRkciwgTE9HRSk7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIGRwaFByaW50TWFjQWRkcgorICoKKyAqIEZVTkNUSU9OOgorICogUHJpbnQgYSBNQUMgYWRkcmVzcworICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGFkZHIgTUFDIGFkZHJlc3MKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2RwaFByaW50TWFjQWRkcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGFkZHJbXSwgdEFOSV9VMzIgbGV2ZWwpCit7CisgICAgbGltTG9nKHBNYWMsICh0QU5JX1UxNikgbGV2ZWwsIEZMKCJNQUMgQUREUiA9ICVkOiVkOiVkOiVkOiVkOiVkXG4iKSwKKyAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2RwaC9kcGhIYXNoVGFibGUuaCBiL0NPUkUvTUFDL3NyYy9kcGgvZHBoSGFzaFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0MGQzYgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9kcGgvZHBoSGFzaFRhYmxlLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBkcGhIYXNoVGFibGUuaCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc2NoZWR1bGVyIGNsYXNzLgorICoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaWZuZGVmIF9fRFBIX0hBU0hfVEFCTEVfSF9fCisjZGVmaW5lIF9fRFBIX0hBU0hfVEFCTEVfSF9fCisKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKy8vLyBDb21wYXJlIE1BQyBhZGRyZXNzZXMsIHJldHVybiB0cnVlIGlmIHNhbWUKK3N0YXRpYyBpbmxpbmUgdEFOSV9VOAorZHBoQ29tcGFyZU1hY0FkZHIodEFOSV9VOCBhZGRyMVtdLCB0QU5JX1U4IGFkZHIyW10pCit7CisjaWYgKChkZWZpbmVkKEFOSV9QUEMpKSAmJiBkZWZpbmVkKEFOSV9PU19UWVBFX1JUQUlfTElOVVgpKQorICAgIC8qCisgICAgICogT3B0aW1pemVkIGNvbXBhcmlzb24gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3NlcworICAgICAqIHN1cHBvcnRlZCBieSB0aGUgQ1BVLgorICAgICogVGhpcyBuZWVkcyB0byBiZSByZXZpZXdlZCBpZiB0aGUgQ1BVIGNoYW5nZXMuCisgICAgICovCisKKyAgICByZXR1cm4gKCgoKigodEFOSV9VMzIgKikgYWRkcjEpIC0gKigodEFOSV9VMzIgKikgYWRkcjIpKSB8CisgICAgICAgICAoKigodEFOSV9VMTYgKikgJihhZGRyMVs0XSkpIC0gKigodEFOSV9VMTYgKikgJihhZGRyMls0XSkpKSkgPT0gMCk7CisjZWxzZQorICAgIHJldHVybigoYWRkcjFbMF0gPT0gYWRkcjJbMF0pICYmCisgICAgICAgKGFkZHIxWzFdID09IGFkZHIyWzFdKSAmJgorICAgICAgIChhZGRyMVsyXSA9PSBhZGRyMlsyXSkgJiYKKyAgICAgICAoYWRkcjFbM10gPT0gYWRkcjJbM10pICYmCisgICAgICAgKGFkZHIxWzRdID09IGFkZHIyWzRdKSAmJgorICAgICAgIChhZGRyMVs1XSA9PSBhZGRyMls1XSkpOworI2VuZGlmCit9CisKKy8vLyBIYXNoIHRhYmxlIGNsYXNzCit0eXBlZGVmIHN0cnVjdAoreworCisgIC8vLyBUaGUgaGFzaCB0YWJsZSBpdHNlbGYKKyAgdHBEcGhIYXNoTm9kZSAqcEhhc2hUYWJsZTsKKworICAvLy8gVGhlIHN0YXRlIGFycmF5CisgIHREcGhIYXNoTm9kZSAgKnBEcGhOb2RlQXJyYXk7CisgIHRBTklfVTE2IHNpemU7Cit9IGRwaEhhc2hUYWJsZUNsYXNzOworCisvLy8gVGhlIGhhc2ggdGFibGUgb2JqZWN0CitleHRlcm4gZHBoSGFzaFRhYmxlQ2xhc3MgZHBoSGFzaFRhYmxlOworCisvLy8gUHJpbnQgTUFDIGFkZHJlc3NlCitleHRlcm4gdm9pZCBkcGhQcmludE1hY0FkZHIoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsIHRBTklfVTggYWRkcltdLCB0QU5JX1UzMik7CisKK3RwRHBoSGFzaE5vZGUgZHBoTG9va3VwSGFzaEVudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc3RhQWRkcltdLCB0QU5JX1UxNiAqcFN0YUlkLCBkcGhIYXNoVGFibGVDbGFzcyogcERwaEhhc2hUYWJsZSk7Cit0cERwaEhhc2hOb2RlIGRwaExvb2t1cEFzc29jSWQodHBBbmlTaXJHbG9iYWwgcE1hYywgIHRBTklfVTE2IHN0YUlkeCwgdEFOSV9VMTYqIGFzc29jSWQsIGRwaEhhc2hUYWJsZUNsYXNzKiBwRHBoSGFzaFRhYmxlKTsKKworCisvLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgaGFzaCBub2RlCitleHRlcm4gdHBEcGhIYXNoTm9kZSBkcGhHZXRIYXNoRW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgc3RhSWQsIGRwaEhhc2hUYWJsZUNsYXNzKiBwRHBoSGFzaFRhYmxlKTsKKworLy8vIEFkZCBhbiBlbnRyeSB0byB0aGUgaGFzaCB0YWJsZQorZXh0ZXJuIHRwRHBoSGFzaE5vZGUgZHBoQWRkSGFzaEVudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHN0YUFkZHIsIHRBTklfVTE2IHN0YUlkLCBkcGhIYXNoVGFibGVDbGFzcyogcERwaEhhc2hUYWJsZSk7CisKKy8vLyBEZWxldGUgYW4gZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZQorZXh0ZXJuIHRTaXJSZXRTdGF0dXMgZHBoRGVsZXRlSGFzaEVudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHN0YUFkZHIsIHRBTklfVTE2IHN0YUlkLCBkcGhIYXNoVGFibGVDbGFzcyogcERwaEhhc2hUYWJsZSk7CisKK3ZvaWQgZHBoSGFzaFRhYmxlQ2xhc3NJbml0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIGRwaEhhc2hUYWJsZUNsYXNzKiBwRHBoSGFzaFRhYmxlKTsKKy8vLyBJbml0aWFsaXplIFNUQSBzdGF0ZQorZXh0ZXJuIHRwRHBoSGFzaE5vZGUgZHBoSW5pdFN0YVN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHN0YUFkZHIsCisgICAgICAgIHRBTklfVTE2IHN0YUlkLCB0QU5JX1U4IHZhbGlkU3RhSWR4LCBkcGhIYXNoVGFibGVDbGFzcyogcERwaEhhc2hUYWJsZSk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvaW5jbHVkZS9jZmdBcGkuaCBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL2NmZ0FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjA3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvaW5jbHVkZS9jZmdBcGkuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiAgCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiAgICAgIEtldmluIE5ndXllbiAgICAKKyAqIERhdGU6ICAgICAgICAwNC8wOS8wMgorICogSGlzdG9yeTotCisgKiAwNC8wOS8wMiAgICAgICAgQ3JlYXRlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqLworCisjaWZuZGVmIF9fQ0ZHQVBJX0gKKyNkZWZpbmUgX19DRkdBUElfSAorCisjaW5jbHVkZSA8c2lyQ29tbW9uLmg+CisjaW5jbHVkZSA8c2lyUGFyYW1zLmg+CisjaW5jbHVkZSA8c2lyTWFjUHJvdERlZi5oPgorI2luY2x1ZGUgPHduaUFwaS5oPgorI2luY2x1ZGUgPGFuaUdsb2JhbC5oPgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENGRyBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0ZHX1RZUEVfU1RSICAgICAgICAgICAgICAgIDB4MDAwMDAwMAorI2RlZmluZSBDRkdfVFlQRV9JTlQgICAgICAgICAgICAgICAgMHgwMDAwMDAxCisjZGVmaW5lIENGR19IT1NUX1JFICAgICAgICAgICAgICAgICAweDAwMDAwMDIKKyNkZWZpbmUgQ0ZHX0hPU1RfV0UgICAgICAgICAgICAgICAgIDB4MDAwMDAwNAorCisvLyBDRkcgc3RhdHVzCit0eXBlZGVmIGVudW0gZUNmZ1N0YXR1c1R5cGVzIHsKKyAgICBDRkdfSU5DT01QTEVURSwKKyAgICBDRkdfU1VDQ0VTUywKKyAgICBDRkdfRkFJTFVSRQorfSB0Q2ZnU3RhdHVzVHlwZXM7CisKKy8vIFdFUCBrZXkgbWFwcGluZyB0YWJsZSByb3cgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdAoreworICAgIHRBTklfVTggICAga2V5TWFwcGluZ0FkZHJbU0lSX01BQ19BRERSX0xFTkdUSF07CisgICAgdEFOSV9VMzIgICB3ZXBPbjsKKyAgICB0QU5JX1U4ICAgIGtleVtTSVJfTUFDX0tFWV9MRU5HVEhdOyAKKyAgICB0QU5JX1UzMiAgIHN0YXR1czsKK30gdENmZ1dlcEtleUVudHJ5OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENGRyBmdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordEFOSV9VMzIgY2ZnTmVlZFJlc3RhcnQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgY2ZnSWQpIDsKK3RBTklfVTMyIGNmZ05lZWRSZWxvYWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgY2ZnSWQpIDsKKworLy8vIENGRyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgordm9pZCB3bGFuX2NmZ0luaXQodHBBbmlTaXJHbG9iYWwpOworCisvLy8gUHJvY2VzcyBob3N0IG1lc3NhZ2UKK3ZvaWQgY2ZnUHJvY2Vzc01iTXNnKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWJNc2cqKTsKKworLy8vIFNldCBpbnRlZ2VyIHBhcmFtZXRlciB2YWx1ZQordFNpclJldFN0YXR1cyBjZmdTZXRJbnQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTE2LCB0QU5JX1UzMik7CisKKy8vLyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIGlzIHZhbGlkCit0U2lyUmV0U3RhdHVzIGNmZ0NoZWNrVmFsaWQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTE2KTsKKworLy8vIEdldCBpbnRlZ2VyIHBhcmFtZXRlciB2YWx1ZQordFNpclJldFN0YXR1cyB3bGFuX2NmZ0dldEludCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRBTklfVTMyKik7CisKKy8vLyBJbmNyZW1lbnQgaW50ZWdlciBwYXJhbWV0ZXIKK3RTaXJSZXRTdGF0dXMgY2ZnSW5jcmVtZW50SW50KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdEFOSV9VMzIpOworCisvLy8gU2V0IHN0cmluZyBwYXJhbWV0ZXIgdmFsdWUKK3RTaXJSZXRTdGF0dXMgY2ZnU2V0U3RyKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdEFOSV9VOCosIHRBTklfVTMyKTsKKwordFNpclJldFN0YXR1cyBjZmdTZXRTdHJOb3RpZnkodHBBbmlTaXJHbG9iYWwsIHRBTklfVTE2LCB0QU5JX1U4KiwgdEFOSV9VMzIsIGludCk7CisKKy8vQ2ZnIERvd25sb2FkIGZ1bmN0aW9uIGZvciBQcmltYSBvciBJbnRlZ3JhdGVkIHNvbHV0aW9ucy4KK3ZvaWQgcHJvY2Vzc0NmZ0Rvd25sb2FkUmVxKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdEFOSV9VMzIqKTsKKworLy8vIEdldCBzdHJpbmcgcGFyYW1ldGVyIHZhbHVlCit0U2lyUmV0U3RhdHVzIHdsYW5fY2ZnR2V0U3RyKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdEFOSV9VOCosIHRBTklfVTMyKik7CisKKy8vLyBHZXQgc3RyaW5nIHBhcmFtZXRlciBtYXhpbXVtIGxlbmd0aAordFNpclJldFN0YXR1cyB3bGFuX2NmZ0dldFN0ck1heExlbih0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRBTklfVTMyKik7CisKKy8vLyBHZXQgc3RyaW5nIHBhcmFtZXRlciBtYXhpbXVtIGxlbmd0aAordFNpclJldFN0YXR1cyB3bGFuX2NmZ0dldFN0ckxlbih0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRBTklfVTMyKik7CisKKy8vLyBHZXQgdGhlIHJlZ3VsYXRvcnkgdHggcG93ZXIgb24gZ2l2ZW4gY2hhbm5lbAordFBvd2VyZEJtIGNmZ0dldFJlZ3VsYXRvcnlNYXhUcmFuc21pdFBvd2VyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY2hhbm5lbCk7CisKKy8vLyBEdW1wIENGRyBkYXRhIHRvIG1lbW9yeQordm9pZCBjZmdEdW1wKHRBTklfVTMyKik7CisKKy8vLyBTYXZlIHBhcmFtZXRlcnMgd2l0aCBQIGZsYWcgc2V0Cit2b2lkIGNmZ1NhdmUodm9pZCk7CisKKy8vLyBHZXQgY2FwYWJpbGl0eSBpbmZvCitleHRlcm4gdFNpclJldFN0YXR1cyBjZmdHZXRDYXBhYmlsaXR5SW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiAqcENhcCx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLy8vIFNldCBjYXBhYmlsaXR5IGluZm8KK2V4dGVybiB2b2lkIGNmZ1NldENhcGFiaWxpdHlJbmZvKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNik7CisKKy8vLyBDbGVhbnVwIENGRyBtb2R1bGUKK3ZvaWQgY2ZnQ2xlYW51cCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworZXh0ZXJuIHRBTklfVTggKmdDZmdQYXJhbU5hbWVbXTsKKworI2VuZGlmIC8qIF9fQ0ZHQVBJX0ggKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2luY2x1ZGUvY2ZnR2xvYmFsLmggYi9DT1JFL01BQy9zcmMvaW5jbHVkZS9jZmdHbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU2ZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL2luY2x1ZGUvY2ZnR2xvYmFsLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8wOS8wMworICogSGlzdG9yeTotCisgKiAwNC8wOS8wMiAgICAgICAgQ3JlYXRlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19DRkdHTE9CQUxfSAorI2RlZmluZSBfX0NGR0dMT0JBTF9ICisKKyNpbmNsdWRlICJzaXJDb21tb24uaCIKKyNpbmNsdWRlICJzaXJUeXBlcy5oIgorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyNkZWZpbmUgQ0ZHX01BWF9OVU1fU1RBICAgICAgU0lSX01BWF9OVU1fU1RBX0lOX0JTUworI2Vsc2UKKyNkZWZpbmUgQ0ZHX01BWF9OVU1fU1RBICAgICAgU0lSX01BWF9OVU1fU1RBX0lOX0lCU1MKKyNlbmRpZgorCisjZGVmaW5lIENGR19NQVhfU1RSX0xFTiAgICAgICAyNTYgICAgLy8gYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyBncm93cywgMTI4IGlzIG5vdCBiaWcgZW5vdWdoCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29uZmlndXJhdGlvbiBDb250cm9sIFN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdEFOSV9VMzIgICBjb250cm9sOworfSB0Q2ZnQ3RsOworCisKK3R5cGVkZWYgc3RydWN0IHNBbmlTaXJDZmcKK3sKKyAgICAvLyBDRkcgbW9kdWxlIHN0YXR1cworICAgIHRBTklfVTggICAgZ0NmZ1N0YXR1czsKKworICAgIHRDZmdDdGwgICAgKmdDZmdFbnRyeTsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1UzMiAgIGdDZmdJQnVmTWluW0NGR19BUF9JQlVGX01BWF9TSVpFXTsKKyAgICB0QU5JX1UzMiAgIGdDZmdJQnVmTWF4W0NGR19BUF9JQlVGX01BWF9TSVpFXTsKKyAgICB0QU5JX1UzMiAgIGdDZmdJQnVmW0NGR19BUF9JQlVGX01BWF9TSVpFXTsKKyAgICB0QU5JX1U4ICAgIGdDZmdTQnVmW0NGR19BUF9TQlVGX01BWF9TSVpFXTsKKyNlbHNlCisgICAgdEFOSV9VMzIgICAqZ0NmZ0lCdWZNaW47CisgICAgdEFOSV9VMzIgICAqZ0NmZ0lCdWZNYXg7CisgICAgdEFOSV9VMzIgICAqZ0NmZ0lCdWY7CisgICAgdEFOSV9VOCAgICAqZ0NmZ1NCdWY7CisjZW5kaWYKKworICAgIHRBTklfVTE2ICAgIGdDZmdNYXhJQnVmU2l6ZTsKKyAgICB0QU5JX1UxNiAgICBnQ2ZnTWF4U0J1ZlNpemU7CisKKyAgICAvLyBTdGF0aWMgYnVmZmVyIGZvciBzdHJpbmcgcGFyYW1ldGVyIChtdXN0IGJlIHdvcmQtYWxpZ25lZCkKKyAgICB0QU5JX1U4ICAgICpnU0J1ZmZlcjsKKworICAgIC8vIE1lc3NhZ2UgcGFyYW1ldGVyIGxpc3QgYnVmZmVyIChlbm91Z2ggZm9yIGxhcmdlc3QgcG9zc2libGUgcmVzcG9uc2UpCisgICAgdEFOSV9VMzIgICAqZ1BhcmFtTGlzdDsKK30gdEFuaVNpckNmZywgICp0cEFuaVNpckNmZzsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvaW5jbHVkZS9kb3QxMWYuaCBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL2RvdDExZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZTBkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvaW5jbHVkZS9kb3QxMWYuaApAQCAtMCwwICsxLDY4ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAgKi8KKworI2lmbmRlZiBET1QxMUZfSAorI2RlZmluZSBET1QxMUZfSAorLyoqCisgICogXGZpbGUgZG90MTFmLmgKKyAgKgorICAqIFxicmllZiBTdHJ1Y3R1cmVzLCBmdW5jdGlvbiBwcm90b3R5cGVzICYgZGVmaW5pdGlvbnMKKyAgKiBmb3Igd29ya2luZyB3aXRoIDgwMi4xMSBGcmFtZXMKKyAgKgorICAqCisgICogQ29weXJpZ2h0IChDKSAyMDEyIEFpcmdvIE5ldHdvcmtzLCBJbmNvcnBvcmF0ZWQuCisgICoKKyAgKgorICAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgJ2ZyYW1lc2MnCisgICogVHVlIE1heSAxNSAxMzoxMjowMSAyMDEyIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlKHMpOgorICAqCisgICogZG90MTFmLmZybXMKKyAgKiAKKyAgKiBQTEVBU0UgRE9OJ1QgRURJVCBUSElTIEZJTEUgQlkgSEFORCEKKyAgKgorICAqIEluc3RlYWQsIHBsZWFzZSB1cGRhdGUgdGhlIGlucHV0IGZpbGVzICYgcmUtcnVuCisgICogJ2ZyYW1lc2MnICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAnZnJhbWVzYycgJiB0aGUKKyAgKiBmcmFtZXMgbGFuZ3VhZ2UsICBydW4gJ2ZyYW1lc2MgLS1oZWxwJy4KKyAgKgorICAqCisgICovCisKK3R5cGVkZWYgdEFOSV9VMzIgdERPVDExRl9VNjRbMl07CisKKyNpZiBkZWZpbmVkICggX01TQ19WRVIgKQorIyAgIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiA0MjE0KSAvKiBub25zdGFuZGFyZCBleHRlbnNpb24gdXNlZCAqLworI2VuZGlmIC8qIE1pY3Jvc29mdCBDL0MrKyAgICAgICAgICAgICBiaXQgZmllbGQgdHlwZXMgb3RoZXIgdGhhbiBpbnQgKi8KKworLyoKKyAqIEZyYW1lcyBSZXR1cm4gQ29kZXM6CisgKgorICogU3VjY2VzcyBpcyBpbmRpY2F0ZWQgYnkgYSByZXR1cm4gdmFsdWUgb2YgemVyby4gIEZhaWx1cmUgaXMgaW5kaWNhdGVkCisgKiBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGhpZ2ggYml0LiAgV2FybmluZ3MgZW5jb3VudGVyZWQgaW4gdGhlIGNvdXJzZQorICogb2YgYSBzdWNjZXNzZnVsIHBhcnNlIGFyZSBpbmRpY2F0ZWQgYnkgdmFyaW91cyBiaXRzIGluIHRoZSBsb3dlciAzMQorICogYmVpbmcgdHVybmVkIG9uLgorICoKKyAqIEZvciBpbnN0YW5jZSwgYSByZXR1cm4gdmFsdWUgb2YgMHgwMDAwMDAwYSB3b3VsZCBpbmRpY2F0ZSB0aGF0IHRoZQorICogcGFyc2Ugc3VjY2VlZGVkLCBidXQgdGhhdCBhIG1hbmRhdG9yeSBJRSB3YXNuJ3QgcHJlc2VudCwgYW5kIHNvbWUgSUUKKyAqIHdhcyBmb3VuZCB0byBiZSBjb3JydXB0LgorICoKKyAqCisgKi8KKworI2RlZmluZSBET1QxMUZfUEFSU0VfU1VDQ0VTUyAgICAgICAgICggMHgwMDAwMDAwMCApCisjZGVmaW5lIERPVDExRl9VTktOT1dOX0lFUyAgICAgICAgICAgKCAweDAwMDAwMDAxICkKKyNkZWZpbmUgRE9UMTFGX01BTkRBVE9SWV9JRV9NSVNTSU5HICAoIDB4MDAwMDAwMDIgKQorI2RlZmluZSBET1QxMUZfSU5DT01QTEVURV9JRSAgICAgICAgICggMHgwMDAwMDAwNCApCisjZGVmaW5lIERPVDExRl9TS0lQUEVEX0JBRF9JRSAgICAgICAgKCAweDAwMDAwMDA4ICkKKyNkZWZpbmUgRE9UMTFGX0xBU1RfSUVfVE9PX0xPTkcgICAgICAoIDB4MDAwMDAwMTAgKQorI2RlZmluZSBET1QxMUZfRFVQTElDQVRFX0lFICAgICAgICAgICggMHgwMDAwMDAyMCApCisjZGVmaW5lIERPVDExRl9CQURfRklYRURfVkFMVUUgICAgICAgKCAweDAwMDAwMDQwICkKKyNkZWZpbmUgRE9UMTFGX0lOQ09NUExFVEVfVExWICAgICAgICAoIDB4MDAwMDAwODAgKQorI2RlZmluZSBET1QxMUZfSU5WQUxJRF9UTFZfTEVOR1RIICAgICggMHgwMDAwMDEwMCApCisjZGVmaW5lIERPVDExRl9TS0lQUEVEX0JBRF9UTFYgICAgICAgKCAweDAwMDAwMjAwICkKKyNkZWZpbmUgRE9UMTFGX1VOS05PV05fVExWUyAgICAgICAgICAoIDB4MDAwMDA0MDAgKQorI2RlZmluZSBET1QxMUZfTEFTVF9UTFZfVE9PX0xPTkcgICAgICggMHgwMDAwMDgwMCApCisjZGVmaW5lIERPVDExRl9JTlRFUk5BTF9FUlJPUiAgICAgICAgKCAweDEwMDAwMDAxICkKKyNkZWZpbmUgRE9UMTFGX01JU1NJTkdfRklYRURfRklFTEQgICAoIDB4MTAwMDAwMDIgKQorI2RlZmluZSBET1QxMUZfQkFEX0lOUFVUX0JVRkZFUiAgICAgICggMHgxMDAwMDAwMyApCisjZGVmaW5lIERPVDExRl9CQURfT1VUUFVUX0JVRkZFUiAgICAgKCAweDEwMDAwMDA0ICkKKyNkZWZpbmUgRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyAgICAgICAoIDB4MTAwMDAwMDUgKQorI2RlZmluZSBET1QxMUZfTUFOREFUT1JZX1RMVl9NSVNTSU5HICggMHgwMDAwMTAwMCApCisjZGVmaW5lIERPVDExRl9GQUlMRUQoY29kZSkgICAgICAgICAgKCAoY29kZSkgJiAweDEwMDAwMDAwICkKKyNkZWZpbmUgRE9UMTFGX1dBUk5FRChjb2RlKSAgICAgICAgICAoICggKCAwID09IChjb2RlKSApICYgMHgxMDAwMDAwMCApICYmIGNvZGUpCisjZGVmaW5lIERPVDExRl9TVUNDRUVERUQoY29kZSkgICAgICAgKCAoY29kZSkgPT0gMCApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmQUlEIHsKKyAgICB0QU5JX1UxNiBhc3NvY2lkOworfSB0RG90MTFmRmZBSUQ7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX0FJRF9MRU4gKCAyICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZkFJRCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZkFJRCopOworCit2b2lkIGRvdDExZlBhY2tGZkFJRCh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmQUlEKiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZBY3Rpb24geworICAgIHRBTklfVTggYWN0aW9uOworfSB0RG90MTFmRmZBY3Rpb247CisKKyNkZWZpbmUgRE9UMTFGX0ZGX0FDVElPTl9MRU4gKCAxICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZkFjdGlvbih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZkFjdGlvbiopOworCit2b2lkIGRvdDExZlBhY2tGZkFjdGlvbih0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmQWN0aW9uKiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZBZGRCQVBhcmFtZXRlclNldCB7CisgICAgdEFOSV9VMTYgIGFtc2R1U3VwcG9ydGVkOiAxOworICAgIHRBTklfVTE2ICAgICAgICAgIHBvbGljeTogMTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICB0aWQ6IDQ7CisgICAgdEFOSV9VMTYgICAgICBidWZmZXJTaXplOiAxMDsKK30gdERvdDExZkZmQWRkQkFQYXJhbWV0ZXJTZXQ7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX0FEREJBUEFSQU1FVEVSU0VUX0xFTiAoIDIgKQorCit2b2lkIGRvdDExZlVucGFja0ZmQWRkQkFQYXJhbWV0ZXJTZXQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZBZGRCQVBhcmFtZXRlclNldCopOworCit2b2lkIGRvdDExZlBhY2tGZkFkZEJBUGFyYW1ldGVyU2V0KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZBZGRCQVBhcmFtZXRlclNldCosIHRBTklfVTgqKTsKKworI2RlZmluZSBBRERCQVBBUkFNRVRFUlNFVF9BTVNEVVNVUFBPUlRFRF9PRkZTRVQgMAorI2RlZmluZSBBRERCQVBBUkFNRVRFUlNFVF9BTVNEVVNVUFBPUlRFRF9XSURUSCAgMQorI2RlZmluZSBBRERCQVBBUkFNRVRFUlNFVF9QT0xJQ1lfT0ZGU0VUICAgICAgICAgMQorI2RlZmluZSBBRERCQVBBUkFNRVRFUlNFVF9QT0xJQ1lfV0lEVEggICAgICAgICAgMQorI2RlZmluZSBBRERCQVBBUkFNRVRFUlNFVF9USURfT0ZGU0VUICAgICAgICAgICAgMgorI2RlZmluZSBBRERCQVBBUkFNRVRFUlNFVF9USURfV0lEVEggICAgICAgICAgICAgNAorI2RlZmluZSBBRERCQVBBUkFNRVRFUlNFVF9CVUZGRVJTSVpFX09GRlNFVCAgICAgNgorI2RlZmluZSBBRERCQVBBUkFNRVRFUlNFVF9CVUZGRVJTSVpFX1dJRFRIICAgICAgMTAKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmQXV0aEFsZ28geworICAgIHRBTklfVTE2IGFsZ287Cit9IHREb3QxMWZGZkF1dGhBbGdvOworCisjZGVmaW5lIERPVDExRl9GRl9BVVRIQUxHT19MRU4gKCAyICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZkF1dGhBbGdvKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4KiwgdERvdDExZkZmQXV0aEFsZ28qKTsKKwordm9pZCBkb3QxMWZQYWNrRmZBdXRoQWxnbyh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmQXV0aEFsZ28qLCB0QU5JX1U4Kik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZkF1dGhTZXFObyB7CisgICAgdEFOSV9VMTYgbm87Cit9IHREb3QxMWZGZkF1dGhTZXFObzsKKworI2RlZmluZSBET1QxMUZfRkZfQVVUSFNFUU5PX0xFTiAoIDIgKQorCit2b2lkIGRvdDExZlVucGFja0ZmQXV0aFNlcU5vKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4KiwgdERvdDExZkZmQXV0aFNlcU5vKik7CisKK3ZvaWQgZG90MTFmUGFja0ZmQXV0aFNlcU5vKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZBdXRoU2VxTm8qLCB0QU5JX1U4Kik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZkJBU3RhcnRpbmdTZXF1ZW5jZUNvbnRyb2wgeworICAgIHRBTklfVTE2ICBmcmFnTnVtYmVyOiA0OworICAgIHRBTklfVTE2ICAgICAgICAgc3NuOiAxMjsKK30gdERvdDExZkZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbDsKKworI2RlZmluZSBET1QxMUZfRkZfQkFTVEFSVElOR1NFUVVFTkNFQ09OVFJPTF9MRU4gKCAyICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZkJBU3RhcnRpbmdTZXF1ZW5jZUNvbnRyb2wodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sKik7CisKK3ZvaWQgZG90MTFmUGFja0ZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbCh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbCosIHRBTklfVTgqKTsKKworI2RlZmluZSBCQVNUQVJUSU5HU0VRVUVOQ0VDT05UUk9MX0ZSQUdOVU1CRVJfT0ZGU0VUIDAKKyNkZWZpbmUgQkFTVEFSVElOR1NFUVVFTkNFQ09OVFJPTF9GUkFHTlVNQkVSX1dJRFRIICA0CisjZGVmaW5lIEJBU1RBUlRJTkdTRVFVRU5DRUNPTlRST0xfU1NOX09GRlNFVCAgICAgICAgNAorI2RlZmluZSBCQVNUQVJUSU5HU0VRVUVOQ0VDT05UUk9MX1NTTl9XSURUSCAgICAgICAgIDEyCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZkJBVGltZW91dCB7CisgICAgdEFOSV9VMTYgdGltZW91dDsKK30gdERvdDExZkZmQkFUaW1lb3V0OworCisjZGVmaW5lIERPVDExRl9GRl9CQVRJTUVPVVRfTEVOICggMiApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZCQVRpbWVvdXQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZCQVRpbWVvdXQqKTsKKwordm9pZCBkb3QxMWZQYWNrRmZCQVRpbWVvdXQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZkJBVGltZW91dCosIHRBTklfVTgqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmQmVhY29uSW50ZXJ2YWwgeworICAgIHRBTklfVTE2IGludGVydmFsOworfSB0RG90MTFmRmZCZWFjb25JbnRlcnZhbDsKKworI2RlZmluZSBET1QxMUZfRkZfQkVBQ09OSU5URVJWQUxfTEVOICggMiApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZCZWFjb25JbnRlcnZhbCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZkJlYWNvbkludGVydmFsKik7CisKK3ZvaWQgZG90MTFmUGFja0ZmQmVhY29uSW50ZXJ2YWwodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZkJlYWNvbkludGVydmFsKiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZDYXBhYmlsaXRpZXMgeworICAgIHRBTklfVTE2ICAgICAgICAgICAgIGVzczogMTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGlic3M6IDE7CisgICAgdEFOSV9VMTYgICAgICBjZlBvbGxhYmxlOiAxOworICAgIHRBTklfVTE2ICAgICAgIGNmUG9sbFJlcTogMTsKKyAgICB0QU5JX1UxNiAgICAgICAgIHByaXZhY3k6IDE7CisgICAgdEFOSV9VMTYgICBzaG9ydFByZWFtYmxlOiAxOworICAgIHRBTklfVTE2ICAgICAgICAgICAgcGJjYzogMTsKKyAgICB0QU5JX1UxNiAgY2hhbm5lbEFnaWxpdHk6IDE7CisgICAgdEFOSV9VMTYgICAgIHNwZWN0cnVtTWd0OiAxOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIHFvczogMTsKKyAgICB0QU5JX1UxNiAgIHNob3J0U2xvdFRpbWU6IDE7CisgICAgdEFOSV9VMTYgICAgICAgICAgICBhcHNkOiAxOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIHJybTogMTsKKyAgICB0QU5JX1UxNiAgICAgICAgZHNzc09mZG06IDE7CisgICAgdEFOSV9VMTYgICAgICAgZGVsYXllZEJBOiAxOworICAgIHRBTklfVTE2ICAgICBpbW1lZGlhdGVCQTogMTsKK30gdERvdDExZkZmQ2FwYWJpbGl0aWVzOworCisjZGVmaW5lIERPVDExRl9GRl9DQVBBQklMSVRJRVNfTEVOICggMiApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZDYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZDYXBhYmlsaXRpZXMqKTsKKwordm9pZCBkb3QxMWZQYWNrRmZDYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZkNhcGFiaWxpdGllcyosIHRBTklfVTgqKTsKKworI2RlZmluZSBDQVBBQklMSVRJRVNfRVNTX09GRlNFVCAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0VTU19XSURUSCAgICAgICAgICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19JQlNTX09GRlNFVCAgICAgICAgICAgMQorI2RlZmluZSBDQVBBQklMSVRJRVNfSUJTU19XSURUSCAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0NGUE9MTEFCTEVfT0ZGU0VUICAgICAyCisjZGVmaW5lIENBUEFCSUxJVElFU19DRlBPTExBQkxFX1dJRFRIICAgICAgMQorI2RlZmluZSBDQVBBQklMSVRJRVNfQ0ZQT0xMUkVRX09GRlNFVCAgICAgIDMKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0NGUE9MTFJFUV9XSURUSCAgICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19QUklWQUNZX09GRlNFVCAgICAgICAgNAorI2RlZmluZSBDQVBBQklMSVRJRVNfUFJJVkFDWV9XSURUSCAgICAgICAgIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1NIT1JUUFJFQU1CTEVfT0ZGU0VUICA1CisjZGVmaW5lIENBUEFCSUxJVElFU19TSE9SVFBSRUFNQkxFX1dJRFRIICAgMQorI2RlZmluZSBDQVBBQklMSVRJRVNfUEJDQ19PRkZTRVQgICAgICAgICAgIDYKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1BCQ0NfV0lEVEggICAgICAgICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19DSEFOTkVMQUdJTElUWV9PRkZTRVQgNworI2RlZmluZSBDQVBBQklMSVRJRVNfQ0hBTk5FTEFHSUxJVFlfV0lEVEggIDEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1NQRUNUUlVNTUdUX09GRlNFVCAgICA4CisjZGVmaW5lIENBUEFCSUxJVElFU19TUEVDVFJVTU1HVF9XSURUSCAgICAgMQorI2RlZmluZSBDQVBBQklMSVRJRVNfUU9TX09GRlNFVCAgICAgICAgICAgIDkKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1FPU19XSURUSCAgICAgICAgICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19TSE9SVFNMT1RUSU1FX09GRlNFVCAgMTAKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1NIT1JUU0xPVFRJTUVfV0lEVEggICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19BUFNEX09GRlNFVCAgICAgICAgICAgMTEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0FQU0RfV0lEVEggICAgICAgICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19SUk1fT0ZGU0VUICAgICAgICAgICAgMTIKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1JSTV9XSURUSCAgICAgICAgICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19EU1NTT0ZETV9PRkZTRVQgICAgICAgMTMKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0RTU1NPRkRNX1dJRFRIICAgICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19ERUxBWUVEQkFfT0ZGU0VUICAgICAgMTQKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0RFTEFZRURCQV9XSURUSCAgICAgICAxCisjZGVmaW5lIENBUEFCSUxJVElFU19JTU1FRElBVEVCQV9PRkZTRVQgICAgMTUKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX0lNTUVESUFURUJBX1dJRFRIICAgICAxCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZkNhdGVnb3J5IHsKKyAgICB0QU5JX1U4IGNhdGVnb3J5OworfSB0RG90MTFmRmZDYXRlZ29yeTsKKworI2RlZmluZSBET1QxMUZfRkZfQ0FURUdPUllfTEVOICggMSApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZDYXRlZ29yeSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZkNhdGVnb3J5Kik7CisKK3ZvaWQgZG90MTFmUGFja0ZmQ2F0ZWdvcnkodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZkNhdGVnb3J5KiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZDdXJyZW50QVBBZGRyZXNzIHsKKyAgICB0QU5JX1U4IG1hY1s2XTsKK30gdERvdDExZkZmQ3VycmVudEFQQWRkcmVzczsKKworI2RlZmluZSBET1QxMUZfRkZfQ1VSUkVOVEFQQUREUkVTU19MRU4gKCA2ICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZkN1cnJlbnRBUEFkZHJlc3ModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZDdXJyZW50QVBBZGRyZXNzKik7CisKK3ZvaWQgZG90MTFmUGFja0ZmQ3VycmVudEFQQWRkcmVzcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmQ3VycmVudEFQQWRkcmVzcyosIHRBTklfVTgqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmRGVsQkFQYXJhbWV0ZXJTZXQgeworICAgIHRBTklfVTE2ICAgcmVzZXJ2ZWQ6IDExOworICAgIHRBTklfVTE2ICBpbml0aWF0b3I6IDE7CisgICAgdEFOSV9VMTYgICAgICAgIHRpZDogNDsKK30gdERvdDExZkZmRGVsQkFQYXJhbWV0ZXJTZXQ7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX0RFTEJBUEFSQU1FVEVSU0VUX0xFTiAoIDIgKQorCit2b2lkIGRvdDExZlVucGFja0ZmRGVsQkFQYXJhbWV0ZXJTZXQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZEZWxCQVBhcmFtZXRlclNldCopOworCit2b2lkIGRvdDExZlBhY2tGZkRlbEJBUGFyYW1ldGVyU2V0KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZEZWxCQVBhcmFtZXRlclNldCosIHRBTklfVTgqKTsKKworI2RlZmluZSBERUxCQVBBUkFNRVRFUlNFVF9SRVNFUlZFRF9PRkZTRVQgIDAKKyNkZWZpbmUgREVMQkFQQVJBTUVURVJTRVRfUkVTRVJWRURfV0lEVEggICAxMQorI2RlZmluZSBERUxCQVBBUkFNRVRFUlNFVF9JTklUSUFUT1JfT0ZGU0VUIDExCisjZGVmaW5lIERFTEJBUEFSQU1FVEVSU0VUX0lOSVRJQVRPUl9XSURUSCAgMQorI2RlZmluZSBERUxCQVBBUkFNRVRFUlNFVF9USURfT0ZGU0VUICAgICAgIDEyCisjZGVmaW5lIERFTEJBUEFSQU1FVEVSU0VUX1RJRF9XSURUSCAgICAgICAgNAorCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZEaWFsb2dUb2tlbiB7CisgICAgdEFOSV9VOCB0b2tlbjsKK30gdERvdDExZkZmRGlhbG9nVG9rZW47CisKKyNkZWZpbmUgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiAoIDEgKQorCit2b2lkIGRvdDExZlVucGFja0ZmRGlhbG9nVG9rZW4odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZEaWFsb2dUb2tlbiopOworCit2b2lkIGRvdDExZlBhY2tGZkRpYWxvZ1Rva2VuKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZEaWFsb2dUb2tlbiosIHRBTklfVTgqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmTGlua01hcmdpbiB7CisgICAgdEFOSV9VOCBsaW5rTWFyZ2luOworfSB0RG90MTFmRmZMaW5rTWFyZ2luOworCisjZGVmaW5lIERPVDExRl9GRl9MSU5LTUFSR0lOX0xFTiAoIDEgKQorCit2b2lkIGRvdDExZlVucGFja0ZmTGlua01hcmdpbih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZkxpbmtNYXJnaW4qKTsKKwordm9pZCBkb3QxMWZQYWNrRmZMaW5rTWFyZ2luKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZMaW5rTWFyZ2luKiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZMaXN0ZW5JbnRlcnZhbCB7CisgICAgdEFOSV9VMTYgaW50ZXJ2YWw7Cit9IHREb3QxMWZGZkxpc3RlbkludGVydmFsOworCisjZGVmaW5lIERPVDExRl9GRl9MSVNURU5JTlRFUlZBTF9MRU4gKCAyICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZkxpc3RlbkludGVydmFsKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4KiwgdERvdDExZkZmTGlzdGVuSW50ZXJ2YWwqKTsKKwordm9pZCBkb3QxMWZQYWNrRmZMaXN0ZW5JbnRlcnZhbCh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmTGlzdGVuSW50ZXJ2YWwqLCB0QU5JX1U4Kik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZk1heFR4UG93ZXIgeworICAgIHRBTklfVTggbWF4VHhQb3dlcjsKK30gdERvdDExZkZmTWF4VHhQb3dlcjsKKworI2RlZmluZSBET1QxMUZfRkZfTUFYVFhQT1dFUl9MRU4gKCAxICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZk1heFR4UG93ZXIodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZNYXhUeFBvd2VyKik7CisKK3ZvaWQgZG90MTFmUGFja0ZmTWF4VHhQb3dlcih0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmTWF4VHhQb3dlciosIHRBTklfVTgqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmTnVtT2ZSZXBldGl0aW9ucyB7CisgICAgdEFOSV9VMTYgcmVwZXRpdGlvbnM7Cit9IHREb3QxMWZGZk51bU9mUmVwZXRpdGlvbnM7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX05VTU9GUkVQRVRJVElPTlNfTEVOICggMiApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZOdW1PZlJlcGV0aXRpb25zKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4KiwgdERvdDExZkZmTnVtT2ZSZXBldGl0aW9ucyopOworCit2b2lkIGRvdDExZlBhY2tGZk51bU9mUmVwZXRpdGlvbnModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZk51bU9mUmVwZXRpdGlvbnMqLCB0QU5JX1U4Kik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlAyUE9VSSB7CisgICAgdEFOSV9VMzIgb3VpOworfSB0RG90MTFmRmZQMlBPVUk7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1AyUE9VSV9MRU4gKCA0ICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlAyUE9VSSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZlAyUE9VSSopOworCit2b2lkIGRvdDExZlBhY2tGZlAyUE9VSSh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmUDJQT1VJKiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZQMlBPVUlTdWJUeXBlIHsKKyAgICB0QU5JX1U4IG91aVN1YnR5cGU7Cit9IHREb3QxMWZGZlAyUE9VSVN1YlR5cGU7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1AyUE9VSVNVQlRZUEVfTEVOICggMSApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZQMlBPVUlTdWJUeXBlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4KiwgdERvdDExZkZmUDJQT1VJU3ViVHlwZSopOworCit2b2lkIGRvdDExZlBhY2tGZlAyUE9VSVN1YlR5cGUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlAyUE9VSVN1YlR5cGUqLCB0QU5JX1U4Kik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlJDUEkgeworICAgIHRBTklfVTggcmNwaTsKK30gdERvdDExZkZmUkNQSTsKKworI2RlZmluZSBET1QxMUZfRkZfUkNQSV9MRU4gKCAxICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlJDUEkodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZSQ1BJKik7CisKK3ZvaWQgZG90MTFmUGFja0ZmUkNQSSh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmUkNQSSosIHRBTklfVTgqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmUlNOSSB7CisgICAgdEFOSV9VOCByc25pOworfSB0RG90MTFmRmZSU05JOworCisjZGVmaW5lIERPVDExRl9GRl9SU05JX0xFTiAoIDEgKQorCit2b2lkIGRvdDExZlVucGFja0ZmUlNOSSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZlJTTkkqKTsKKwordm9pZCBkb3QxMWZQYWNrRmZSU05JKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZSU05JKiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZSZWFzb24geworICAgIHRBTklfVTE2IGNvZGU7Cit9IHREb3QxMWZGZlJlYXNvbjsKKworI2RlZmluZSBET1QxMUZfRkZfUkVBU09OX0xFTiAoIDIgKQorCit2b2lkIGRvdDExZlVucGFja0ZmUmVhc29uKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4KiwgdERvdDExZkZmUmVhc29uKik7CisKK3ZvaWQgZG90MTFmUGFja0ZmUmVhc29uKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZSZWFzb24qLCB0QU5JX1U4Kik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlJ4QW50ZW5uYUlkIHsKKyAgICB0QU5JX1U4IGFudGVubmFJZDsKK30gdERvdDExZkZmUnhBbnRlbm5hSWQ7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1JYQU5URU5OQUlEX0xFTiAoIDEgKQorCit2b2lkIGRvdDExZlVucGFja0ZmUnhBbnRlbm5hSWQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZSeEFudGVubmFJZCopOworCit2b2lkIGRvdDExZlBhY2tGZlJ4QW50ZW5uYUlkKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZSeEFudGVubmFJZCosIHRBTklfVTgqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmU01Qb3dlck1vZGVTZXQgeworICAgIHRBTklfVTggIFBvd2VyU2F2ZV9FbjogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgIE1vZGU6IDE7CisgICAgdEFOSV9VOCAgICAgIHJlc2VydmVkOiA2OworfSB0RG90MTFmRmZTTVBvd2VyTW9kZVNldDsKKworI2RlZmluZSBET1QxMUZfRkZfU01QT1dFUk1PREVTRVRfTEVOICggMSApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZTTVBvd2VyTW9kZVNldCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZlNNUG93ZXJNb2RlU2V0Kik7CisKK3ZvaWQgZG90MTFmUGFja0ZmU01Qb3dlck1vZGVTZXQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlNNUG93ZXJNb2RlU2V0KiwgdEFOSV9VOCopOworCisjZGVmaW5lIFNNUE9XRVJNT0RFU0VUX1BPV0VSU0FWRV9FTl9PRkZTRVQgMAorI2RlZmluZSBTTVBPV0VSTU9ERVNFVF9QT1dFUlNBVkVfRU5fV0lEVEggIDEKKyNkZWZpbmUgU01QT1dFUk1PREVTRVRfTU9ERV9PRkZTRVQgICAgICAgICAxCisjZGVmaW5lIFNNUE9XRVJNT0RFU0VUX01PREVfV0lEVEggICAgICAgICAgMQorI2RlZmluZSBTTVBPV0VSTU9ERVNFVF9SRVNFUlZFRF9PRkZTRVQgICAgIDIKKyNkZWZpbmUgU01QT1dFUk1PREVTRVRfUkVTRVJWRURfV0lEVEggICAgICA2CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlN0YXR1cyB7CisgICAgdEFOSV9VMTYgc3RhdHVzOworfSB0RG90MTFmRmZTdGF0dXM7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1NUQVRVU19MRU4gKCAyICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlN0YXR1cyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZlN0YXR1cyopOworCit2b2lkIGRvdDExZlBhY2tGZlN0YXR1cyh0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmU3RhdHVzKiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZTdGF0dXNDb2RlIHsKKyAgICB0QU5JX1U4IHN0YXR1c0NvZGU7Cit9IHREb3QxMWZGZlN0YXR1c0NvZGU7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1NUQVRVU0NPREVfTEVOICggMSApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZTdGF0dXNDb2RlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4KiwgdERvdDExZkZmU3RhdHVzQ29kZSopOworCit2b2lkIGRvdDExZlBhY2tGZlN0YXR1c0NvZGUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlN0YXR1c0NvZGUqLCB0QU5JX1U4Kik7CisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZGZlRQQ0VsZUlEIHsKKyAgICB0QU5JX1U4IFRQQ0lkOworfSB0RG90MTFmRmZUUENFbGVJRDsKKworI2RlZmluZSBET1QxMUZfRkZfVFBDRUxFSURfTEVOICggMSApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZUUENFbGVJRCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZlRQQ0VsZUlEKik7CisKK3ZvaWQgZG90MTFmUGFja0ZmVFBDRWxlSUQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlRQQ0VsZUlEKiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZUUENFbGVMZW4geworICAgIHRBTklfVTggVFBDTGVuOworfSB0RG90MTFmRmZUUENFbGVMZW47CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1RQQ0VMRUxFTl9MRU4gKCAxICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlRQQ0VsZUxlbih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZlRQQ0VsZUxlbiopOworCit2b2lkIGRvdDExZlBhY2tGZlRQQ0VsZUxlbih0cEFuaVNpckdsb2JhbCwgdERvdDExZkZmVFBDRWxlTGVuKiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZUU0luZm8geworICAgIHRBTklfVTMyICAgIHRyYWZmaWNfdHlwZTogMTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIHRzaWQ6IDQ7CisgICAgdEFOSV9VMzIgICAgICAgZGlyZWN0aW9uOiAyOworICAgIHRBTklfVTMyICAgYWNjZXNzX3BvbGljeTogMjsKKyAgICB0QU5JX1UzMiAgICAgYWdncmVnYXRpb246IDE7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgcHNiOiAxOworICAgIHRBTklfVTMyICAgdXNlcl9wcmlvcml0eTogMzsKKyAgICB0QU5JX1UzMiAgdHNpbmZvX2Fja19wb2w6IDI7CisgICAgdEFOSV9VMzIgICAgICAgIHNjaGVkdWxlOiAxOworICAgIHRBTklfVTMyICAgICAgICAgIHVudXNlZDogMTU7Cit9IHREb3QxMWZGZlRTSW5mbzsKKworI2RlZmluZSBET1QxMUZfRkZfVFNJTkZPX0xFTiAoIDMgKQorCit2b2lkIGRvdDExZlVucGFja0ZmVFNJbmZvKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4KiwgdERvdDExZkZmVFNJbmZvKik7CisKK3ZvaWQgZG90MTFmUGFja0ZmVFNJbmZvKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmRmZUU0luZm8qLCB0QU5JX1U4Kik7CisKKyNkZWZpbmUgVFNJTkZPX1RSQUZGSUNfVFlQRV9PRkZTRVQgICAwCisjZGVmaW5lIFRTSU5GT19UUkFGRklDX1RZUEVfV0lEVEggICAgMQorI2RlZmluZSBUU0lORk9fVFNJRF9PRkZTRVQgICAgICAgICAgIDEKKyNkZWZpbmUgVFNJTkZPX1RTSURfV0lEVEggICAgICAgICAgICA0CisjZGVmaW5lIFRTSU5GT19ESVJFQ1RJT05fT0ZGU0VUICAgICAgNQorI2RlZmluZSBUU0lORk9fRElSRUNUSU9OX1dJRFRIICAgICAgIDIKKyNkZWZpbmUgVFNJTkZPX0FDQ0VTU19QT0xJQ1lfT0ZGU0VUICA3CisjZGVmaW5lIFRTSU5GT19BQ0NFU1NfUE9MSUNZX1dJRFRIICAgMgorI2RlZmluZSBUU0lORk9fQUdHUkVHQVRJT05fT0ZGU0VUICAgIDkKKyNkZWZpbmUgVFNJTkZPX0FHR1JFR0FUSU9OX1dJRFRIICAgICAxCisjZGVmaW5lIFRTSU5GT19QU0JfT0ZGU0VUICAgICAgICAgICAgMTAKKyNkZWZpbmUgVFNJTkZPX1BTQl9XSURUSCAgICAgICAgICAgICAxCisjZGVmaW5lIFRTSU5GT19VU0VSX1BSSU9SSVRZX09GRlNFVCAgMTEKKyNkZWZpbmUgVFNJTkZPX1VTRVJfUFJJT1JJVFlfV0lEVEggICAzCisjZGVmaW5lIFRTSU5GT19UU0lORk9fQUNLX1BPTF9PRkZTRVQgMTQKKyNkZWZpbmUgVFNJTkZPX1RTSU5GT19BQ0tfUE9MX1dJRFRIICAyCisjZGVmaW5lIFRTSU5GT19TQ0hFRFVMRV9PRkZTRVQgICAgICAgMTYKKyNkZWZpbmUgVFNJTkZPX1NDSEVEVUxFX1dJRFRIICAgICAgICAxCisjZGVmaW5lIFRTSU5GT19VTlVTRURfT0ZGU0VUICAgICAgICAgMTcKKyNkZWZpbmUgVFNJTkZPX1VOVVNFRF9XSURUSCAgICAgICAgICAxNQorCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZUaW1lU3RhbXAgeworICAgIHRET1QxMUZfVTY0IHRpbWVzdGFtcDsKK30gdERvdDExZkZmVGltZVN0YW1wOworCisjZGVmaW5lIERPVDExRl9GRl9USU1FU1RBTVBfTEVOICggOCApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZUaW1lU3RhbXAodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLCB0RG90MTFmRmZUaW1lU3RhbXAqKTsKKwordm9pZCBkb3QxMWZQYWNrRmZUaW1lU3RhbXAodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlRpbWVTdGFtcCosIHRBTklfVTgqKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkZmVHhBbnRlbm5hSWQgeworICAgIHRBTklfVTggYW50ZW5uYUlkOworfSB0RG90MTFmRmZUeEFudGVubmFJZDsKKworI2RlZmluZSBET1QxMUZfRkZfVFhBTlRFTk5BSURfTEVOICggMSApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZUeEFudGVubmFJZCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosIHREb3QxMWZGZlR4QW50ZW5uYUlkKik7CisKK3ZvaWQgZG90MTFmUGFja0ZmVHhBbnRlbm5hSWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlR4QW50ZW5uYUlkKiwgdEFOSV9VOCopOworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRmZUeFBvd2VyIHsKKyAgICB0QU5JX1U4IHR4UG93ZXI7Cit9IHREb3QxMWZGZlR4UG93ZXI7CisKKyNkZWZpbmUgRE9UMTFGX0ZGX1RYUE9XRVJfTEVOICggMSApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZUeFBvd2VyKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4KiwgdERvdDExZkZmVHhQb3dlciopOworCit2b2lkIGRvdDExZlBhY2tGZlR4UG93ZXIodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZGZlR4UG93ZXIqLCB0QU5JX1U4Kik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRMVnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gSUQgMSAoMHgwMDAxKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVkF1dGhvcml6ZWRNQUNzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbWFjWzZdOworfSB0RG90MTFmVExWQXV0aG9yaXplZE1BQ3M7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9BVVRIT1JJWkVETUFDUyAoIDEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfQVVUSE9SSVpFRE1BQ1NfTUlOX0xFTiAoIDYgKQorCisjZGVmaW5lIERPVDExRl9UTFZfQVVUSE9SSVpFRE1BQ1NfTUFYX0xFTiAoIDYgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2QXV0aG9yaXplZE1BQ3ModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1RsdkF1dGhvcml6ZWRNQUNzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdkF1dGhvcml6ZWRNQUNzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMyAoMHgwMDAzKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlJlcXVlc3RUb0Vucm9sbCB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHJlcTsKK30gdERvdDExZlRMVlJlcXVlc3RUb0Vucm9sbDsKKworI2RlZmluZSBET1QxMUZfVExWX1JFUVVFU1RUT0VOUk9MTCAoIDMgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfUkVRVUVTVFRPRU5ST0xMX01JTl9MRU4gKCAxICkKKworI2RlZmluZSBET1QxMUZfVExWX1JFUVVFU1RUT0VOUk9MTF9NQVhfTEVOICggMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZSZXF1ZXN0VG9FbnJvbGwodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWUmVxdWVzdFRvRW5yb2xsKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZSZXF1ZXN0VG9FbnJvbGwodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdlJlcXVlc3RUb0Vucm9sbCh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlJlcXVlc3RUb0Vucm9sbCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAwICgweDAwMDApCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWVmVyc2lvbjIgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICBtaW5vcjogNDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgbWFqb3I6IDQ7Cit9IHREb3QxMWZUTFZWZXJzaW9uMjsKKworI2RlZmluZSBET1QxMUZfVExWX1ZFUlNJT04yICggMCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9WRVJTSU9OMl9NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9WRVJTSU9OMl9NQVhfTEVOICggMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZWZXJzaW9uMih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZWZXJzaW9uMiopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2VmVyc2lvbjIodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZWZXJzaW9uMiosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2VmVyc2lvbjIodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZWZXJzaW9uMiosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA0MTgzICgweDEwNTcpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWQVBTZXR1cExvY2tlZCB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIGZMb2NrZWQ7Cit9IHREb3QxMWZUTFZBUFNldHVwTG9ja2VkOworCisjZGVmaW5lIERPVDExRl9UTFZfQVBTRVRVUExPQ0tFRCAoIDQxODMgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfQVBTRVRVUExPQ0tFRF9NSU5fTEVOICggMyApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9BUFNFVFVQTE9DS0VEX01BWF9MRU4gKCAzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1RsdkFQU2V0dXBMb2NrZWQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWQVBTZXR1cExvY2tlZCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2QVBTZXR1cExvY2tlZCh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkFQU2V0dXBMb2NrZWQqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdkFQU2V0dXBMb2NrZWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZBUFNldHVwTG9ja2VkKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDQwOTggKDB4MTAwMikKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZBc3NvY2lhdGlvblN0YXRlIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1UxNiAgICAgc3RhdGU7Cit9IHREb3QxMWZUTFZBc3NvY2lhdGlvblN0YXRlOworCisjZGVmaW5lIERPVDExRl9UTFZfQVNTT0NJQVRJT05TVEFURSAoIDQwOTggKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfQVNTT0NJQVRJT05TVEFURV9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9BU1NPQ0lBVElPTlNUQVRFX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1RsdkFzc29jaWF0aW9uU3RhdGUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWQXNzb2NpYXRpb25TdGF0ZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2QXNzb2NpYXRpb25TdGF0ZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdkFzc29jaWF0aW9uU3RhdGUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZBc3NvY2lhdGlvblN0YXRlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDExICgweDAwMGIpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWQ2hhbm5lbExpc3QgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBjb3VudHJ5U3RyaW5nWzNdOworICAgIHRBTklfVTggICAgICBudW1fY2hhbm5lbExpc3Q7CisgICAgdEFOSV9VOCAgICAgIGNoYW5uZWxMaXN0WzI1MV07Cit9IHREb3QxMWZUTFZDaGFubmVsTGlzdDsKKworI2RlZmluZSBET1QxMUZfVExWX0NIQU5ORUxMSVNUICggMTEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfQ0hBTk5FTExJU1RfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9UTFZfQ0hBTk5FTExJU1RfTUFYX0xFTiAoIDI1NSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZDaGFubmVsTGlzdCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZDaGFubmVsTGlzdCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2Q2hhbm5lbExpc3QodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZDaGFubmVsTGlzdCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2Q2hhbm5lbExpc3QodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZDaGFubmVsTGlzdCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA0MTA0ICgweDEwMDgpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWQ29uZmlnTWV0aG9kcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgIG1ldGhvZHM7Cit9IHREb3QxMWZUTFZDb25maWdNZXRob2RzOworCisjZGVmaW5lIERPVDExRl9UTFZfQ09ORklHTUVUSE9EUyAoIDQxMDQgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfQ09ORklHTUVUSE9EU19NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9DT05GSUdNRVRIT0RTX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1RsdkNvbmZpZ01ldGhvZHModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWQ29uZmlnTWV0aG9kcyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2Q29uZmlnTWV0aG9kcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkNvbmZpZ01ldGhvZHMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdkNvbmZpZ01ldGhvZHModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZDb25maWdNZXRob2RzKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDQxMDUgKDB4MTAwOSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZDb25maWd1cmF0aW9uRXJyb3IgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICBlcnJvcjsKK30gdERvdDExZlRMVkNvbmZpZ3VyYXRpb25FcnJvcjsKKworI2RlZmluZSBET1QxMUZfVExWX0NPTkZJR1VSQVRJT05FUlJPUiAoIDQxMDUgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfQ09ORklHVVJBVElPTkVSUk9SX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfVExWX0NPTkZJR1VSQVRJT05FUlJPUl9NQVhfTEVOICggNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZDb25maWd1cmF0aW9uRXJyb3IodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWQ29uZmlndXJhdGlvbkVycm9yKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZDb25maWd1cmF0aW9uRXJyb3IodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZDb25maWd1cmF0aW9uRXJyb3IqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdkNvbmZpZ3VyYXRpb25FcnJvcih0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkNvbmZpZ3VyYXRpb25FcnJvciosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA1ICgweDAwMDUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWQ29uZmlndXJhdGlvblRpbWVvdXQgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBHT0NvbmZpZ1RpbWVvdXQ7CisgICAgdEFOSV9VOCAgICAgIENMQ29uZmlnVGltZW91dDsKK30gdERvdDExZlRMVkNvbmZpZ3VyYXRpb25UaW1lb3V0OworCisjZGVmaW5lIERPVDExRl9UTFZfQ09ORklHVVJBVElPTlRJTUVPVVQgKCA1ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX0NPTkZJR1VSQVRJT05USU1FT1VUX01JTl9MRU4gKCAzICkKKworI2RlZmluZSBET1QxMUZfVExWX0NPTkZJR1VSQVRJT05USU1FT1VUX01BWF9MRU4gKCAzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1RsdkNvbmZpZ3VyYXRpb25UaW1lb3V0KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVkNvbmZpZ3VyYXRpb25UaW1lb3V0Kik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZDb25maWd1cmF0aW9uVGltZW91dCh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkNvbmZpZ3VyYXRpb25UaW1lb3V0KiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZDb25maWd1cmF0aW9uVGltZW91dCh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkNvbmZpZ3VyYXRpb25UaW1lb3V0KiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDQxMTMgKDB4MTAxMSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZEZXZpY2VOYW1lIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3RleHQ7CisgICAgdEFOSV9VOCAgICAgIHRleHRbMzJdOworfSB0RG90MTFmVExWRGV2aWNlTmFtZTsKKworI2RlZmluZSBET1QxMUZfVExWX0RFVklDRU5BTUUgKCA0MTEzICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX0RFVklDRU5BTUVfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9UTFZfREVWSUNFTkFNRV9NQVhfTEVOICggMzQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2RGV2aWNlTmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZEZXZpY2VOYW1lKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZEZXZpY2VOYW1lKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWRGV2aWNlTmFtZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2RGV2aWNlTmFtZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkRldmljZU5hbWUqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNDExNCAoMHgxMDEyKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVkRldmljZVBhc3N3b3JkSUQgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICBpZDsKK30gdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQ7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9ERVZJQ0VQQVNTV09SRElEICggNDExNCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9ERVZJQ0VQQVNTV09SRElEX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfVExWX0RFVklDRVBBU1NXT1JESURfTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2RGV2aWNlUGFzc3dvcmRJRCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElEKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZEZXZpY2VQYXNzd29yZElEKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWRGV2aWNlUGFzc3dvcmRJRCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2RGV2aWNlUGFzc3dvcmRJRCh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgOCAoMHgwMDA4KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1UxNiAgICAgYXZhaWxpYmlsaXR5UGVyaW9kOworICAgIHRBTklfVTE2ICAgICBhdmFpbGliaWxpdHlJbnRlcnZhbDsKK30gdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nOworCisjZGVmaW5lIERPVDExRl9UTFZfRVhURU5ERURMSVNURU5USU1JTkcgKCA4ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX0VYVEVOREVETElTVEVOVElNSU5HX01JTl9MRU4gKCA1ICkKKworI2RlZmluZSBET1QxMUZfVExWX0VYVEVOREVETElTVEVOVElNSU5HX01BWF9MRU4gKCA1ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZFeHRlbmRlZExpc3RlblRpbWluZyh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZFeHRlbmRlZExpc3RlblRpbWluZyh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDQgKDB4MDAwNCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZHT0ludGVudCB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIEdPSW50ZW50OworfSB0RG90MTFmVExWR09JbnRlbnQ7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9HT0lOVEVOVCAoIDQgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfR09JTlRFTlRfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9UTFZfR09JTlRFTlRfTUFYX0xFTiAoIDIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2R09JbnRlbnQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWR09JbnRlbnQqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1RsdkdPSW50ZW50KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWR09JbnRlbnQqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdkdPSW50ZW50KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWR09JbnRlbnQqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgOSAoMHgwMDA5KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIFAyUEludGVyZmFjZUFkZHJlc3NbNl07Cit9IHREb3QxMWZUTFZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3M7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9JTlRFTkRFRFAyUElOVEVSRkFDRUFERFJFU1MgKCA5ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX0lOVEVOREVEUDJQSU5URVJGQUNFQUREUkVTU19NSU5fTEVOICggNyApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9JTlRFTkRFRFAyUElOVEVSRkFDRUFERFJFU1NfTUFYX0xFTiAoIDcgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2SW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2SW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWSW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3ModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMTggKDB4MDAxMikKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZJbnZpdGF0aW9uRmxhZ3MgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBpbnZpdGF0aW9uRmxhZ3M7Cit9IHREb3QxMWZUTFZJbnZpdGF0aW9uRmxhZ3M7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9JTlZJVEFUSU9ORkxBR1MgKCAxOCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9JTlZJVEFUSU9ORkxBR1NfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9UTFZfSU5WSVRBVElPTkZMQUdTX01BWF9MRU4gKCAyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1Rsdkludml0YXRpb25GbGFncyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZJbnZpdGF0aW9uRmxhZ3MqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1Rsdkludml0YXRpb25GbGFncyh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVkludml0YXRpb25GbGFncyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2SW52aXRhdGlvbkZsYWdzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWSW52aXRhdGlvbkZsYWdzKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDYgKDB4MDAwNikKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZMaXN0ZW5DaGFubmVsIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgY291bnRyeVN0cmluZ1szXTsKKyAgICB0QU5JX1U4ICAgICAgcmVndWxhdG9yeUNsYXNzOworICAgIHRBTklfVTggICAgICBjaGFubmVsOworfSB0RG90MTFmVExWTGlzdGVuQ2hhbm5lbDsKKworI2RlZmluZSBET1QxMUZfVExWX0xJU1RFTkNIQU5ORUwgKCA2ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX0xJU1RFTkNIQU5ORUxfTUlOX0xFTiAoIDYgKQorCisjZGVmaW5lIERPVDExRl9UTFZfTElTVEVOQ0hBTk5FTF9NQVhfTEVOICggNiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZMaXN0ZW5DaGFubmVsKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVkxpc3RlbkNoYW5uZWwqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1Rsdkxpc3RlbkNoYW5uZWwodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZMaXN0ZW5DaGFubmVsKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZMaXN0ZW5DaGFubmVsKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWTGlzdGVuQ2hhbm5lbCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA0MTI5ICgweDEwMjEpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWTWFudWZhY3R1cmVyIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbnVtX25hbWU7CisgICAgdEFOSV9VOCAgICAgIG5hbWVbNjRdOworfSB0RG90MTFmVExWTWFudWZhY3R1cmVyOworCisjZGVmaW5lIERPVDExRl9UTFZfTUFOVUZBQ1RVUkVSICggNDEyOSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9NQU5VRkFDVFVSRVJfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9UTFZfTUFOVUZBQ1RVUkVSX01BWF9MRU4gKCA2NiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZNYW51ZmFjdHVyZXIodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWTWFudWZhY3R1cmVyKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZNYW51ZmFjdHVyZXIodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZNYW51ZmFjdHVyZXIqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdk1hbnVmYWN0dXJlcih0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVk1hbnVmYWN0dXJlciosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAxICgweDAwMDEpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWTWlub3JSZWFzb25Db2RlIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbWlub3JSZWFzb25Db2RlOworfSB0RG90MTFmVExWTWlub3JSZWFzb25Db2RlOworCisjZGVmaW5lIERPVDExRl9UTFZfTUlOT1JSRUFTT05DT0RFICggMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9NSU5PUlJFQVNPTkNPREVfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9UTFZfTUlOT1JSRUFTT05DT0RFX01BWF9MRU4gKCAyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1Rsdk1pbm9yUmVhc29uQ29kZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZNaW5vclJlYXNvbkNvZGUqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1Rsdk1pbm9yUmVhc29uQ29kZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVk1pbm9yUmVhc29uQ29kZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2TWlub3JSZWFzb25Db2RlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWTWlub3JSZWFzb25Db2RlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDQxMzEgKDB4MTAyMykKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZNb2RlbE5hbWUgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBudW1fdGV4dDsKKyAgICB0QU5JX1U4ICAgICAgdGV4dFszMl07Cit9IHREb3QxMWZUTFZNb2RlbE5hbWU7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9NT0RFTE5BTUUgKCA0MTMxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX01PREVMTkFNRV9NSU5fTEVOICggMiApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9NT0RFTE5BTUVfTUFYX0xFTiAoIDM0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1Rsdk1vZGVsTmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZNb2RlbE5hbWUqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1Rsdk1vZGVsTmFtZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVk1vZGVsTmFtZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2TW9kZWxOYW1lKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWTW9kZWxOYW1lKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDQxMzIgKDB4MTAyNCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZNb2RlbE51bWJlciB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIG51bV90ZXh0OworICAgIHRBTklfVTggICAgICB0ZXh0WzMyXTsKK30gdERvdDExZlRMVk1vZGVsTnVtYmVyOworCisjZGVmaW5lIERPVDExRl9UTFZfTU9ERUxOVU1CRVIgKCA0MTMyICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX01PREVMTlVNQkVSX01JTl9MRU4gKCAyICkKKworI2RlZmluZSBET1QxMUZfVExWX01PREVMTlVNQkVSX01BWF9MRU4gKCAzNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZNb2RlbE51bWJlcih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZNb2RlbE51bWJlciopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2TW9kZWxOdW1iZXIodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZNb2RlbE51bWJlciosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2TW9kZWxOdW1iZXIodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZNb2RlbE51bWJlciosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAxMiAoMHgwMDBjKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVk5vdGljZU9mQWJzZW5jZSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIGluZGV4OworICAgIHRBTklfVTggICAgICBDVFNXaW5kb3dPcHBQUzsKKyAgICB0QU5JX1U4ICAgICAgbnVtX05vQURlc2M7CisgICAgdEFOSV9VOCAgICAgIE5vQURlc2NbMzZdOworfSB0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlOworCisjZGVmaW5lIERPVDExRl9UTFZfTk9USUNFT0ZBQlNFTkNFICggMTIgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfTk9USUNFT0ZBQlNFTkNFX01JTl9MRU4gKCAzICkKKworI2RlZmluZSBET1QxMUZfVExWX05PVElDRU9GQUJTRU5DRV9NQVhfTEVOICggMzkgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2Tm90aWNlT2ZBYnNlbmNlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2Tm90aWNlT2ZBYnNlbmNlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZOb3RpY2VPZkFic2VuY2UodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZOb3RpY2VPZkFic2VuY2UqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMTcgKDB4MDAxMSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgY291bnRyeVN0cmluZ1szXTsKKyAgICB0QU5JX1U4ICAgICAgcmVndWxhdG9yeUNsYXNzOworICAgIHRBTklfVTggICAgICBjaGFubmVsOworfSB0RG90MTFmVExWT3BlcmF0aW5nQ2hhbm5lbDsKKworI2RlZmluZSBET1QxMUZfVExWX09QRVJBVElOR0NIQU5ORUwgKCAxNyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9PUEVSQVRJTkdDSEFOTkVMX01JTl9MRU4gKCA2ICkKKworI2RlZmluZSBET1QxMUZfVExWX09QRVJBVElOR0NIQU5ORUxfTUFYX0xFTiAoIDYgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2T3BlcmF0aW5nQ2hhbm5lbCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZPcGVyYXRpbmdDaGFubmVsKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWT3BlcmF0aW5nQ2hhbm5lbCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2T3BlcmF0aW5nQ2hhbm5lbCh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMiAoMHgwMDAyKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlAyUENhcGFiaWxpdHkgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBkZXZpY2VDYXBhYmlsaXR5OworICAgIHRBTklfVTggICAgICBncm91cENhcGFiaWxpdHk7Cit9IHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5OworCisjZGVmaW5lIERPVDExRl9UTFZfUDJQQ0FQQUJJTElUWSAoIDIgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfUDJQQ0FQQUJJTElUWV9NSU5fTEVOICggMyApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBDQVBBQklMSVRZX01BWF9MRU4gKCAzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlAyUENhcGFiaWxpdHkodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2UDJQQ2FwYWJpbGl0eSh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlAyUENhcGFiaWxpdHkqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdlAyUENhcGFiaWxpdHkodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5KiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDMgKDB4MDAwMykKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZQMlBEZXZpY2VJZCB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIFAyUERldmljZUFkZHJlc3NbNl07Cit9IHREb3QxMWZUTFZQMlBEZXZpY2VJZDsKKworI2RlZmluZSBET1QxMUZfVExWX1AyUERFVklDRUlEICggMyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBERVZJQ0VJRF9NSU5fTEVOICggNyApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBERVZJQ0VJRF9NQVhfTEVOICggNyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZQMlBEZXZpY2VJZCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZQMlBEZXZpY2VJZCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2UDJQRGV2aWNlSWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZQMlBEZXZpY2VJZCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2UDJQRGV2aWNlSWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZQMlBEZXZpY2VJZCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAxMyAoMHgwMDBkKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlAyUERldmljZUluZm8geworICAgIHRBTklfVTggICAgICAgICAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgUDJQRGV2aWNlQWRkcmVzc1s2XTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBjb25maWdNZXRob2Q7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgcHJpbWFyeURldmljZVR5cGVbOF07CisgICAgdERvdDExZlRMVkRldmljZU5hbWUgRGV2aWNlTmFtZTsKK30gdERvdDExZlRMVlAyUERldmljZUluZm87CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBERVZJQ0VJTkZPICggMTMgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfUDJQREVWSUNFSU5GT19NSU5fTEVOICggMTcgKQorCisjZGVmaW5lIERPVDExRl9UTFZfUDJQREVWSUNFSU5GT19NQVhfTEVOICggNTMgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2UDJQRGV2aWNlSW5mbyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZQMlBEZXZpY2VJbmZvKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWUDJQRGV2aWNlSW5mbyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2UDJQRGV2aWNlSW5mbyh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlAyUERldmljZUluZm8qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNyAoMHgwMDA3KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlAyUEdyb3VwQnNzaWQgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBQMlBHcm91cEJzc2lkWzZdOworfSB0RG90MTFmVExWUDJQR3JvdXBCc3NpZDsKKworI2RlZmluZSBET1QxMUZfVExWX1AyUEdST1VQQlNTSUQgKCA3ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX1AyUEdST1VQQlNTSURfTUlOX0xFTiAoIDcgKQorCisjZGVmaW5lIERPVDExRl9UTFZfUDJQR1JPVVBCU1NJRF9NQVhfTEVOICggNyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZQMlBHcm91cEJzc2lkKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVlAyUEdyb3VwQnNzaWQqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlAyUEdyb3VwQnNzaWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZQMlBHcm91cEJzc2lkKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZQMlBHcm91cEJzc2lkKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWUDJQR3JvdXBCc3NpZCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAxNSAoMHgwMDBmKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlAyUEdyb3VwSWQgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBkZXZpY2VBZGRyZXNzWzZdOworICAgIHRBTklfVTggICAgICBudW1fc3NpZDsKKyAgICB0QU5JX1U4ICAgICAgc3NpZFszMl07Cit9IHREb3QxMWZUTFZQMlBHcm91cElkOworCisjZGVmaW5lIERPVDExRl9UTFZfUDJQR1JPVVBJRCAoIDE1ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX1AyUEdST1VQSURfTUlOX0xFTiAoIDcgKQorCisjZGVmaW5lIERPVDExRl9UTFZfUDJQR1JPVVBJRF9NQVhfTEVOICggMzkgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2UDJQR3JvdXBJZCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZQMlBHcm91cElkKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZQMlBHcm91cElkKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWUDJQR3JvdXBJZCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2UDJQR3JvdXBJZCh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlAyUEdyb3VwSWQqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgMTQgKDB4MDAwZSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZQMlBHcm91cEluZm8geworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBudW1fUDJQQ2xpZW50SW5mb0Rlc2M7CisgICAgdEFOSV9VOCAgICAgIFAyUENsaWVudEluZm9EZXNjWzEwMjRdOworfSB0RG90MTFmVExWUDJQR3JvdXBJbmZvOworCisjZGVmaW5lIERPVDExRl9UTFZfUDJQR1JPVVBJTkZPICggMTQgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfUDJQR1JPVVBJTkZPX01JTl9MRU4gKCAxICkKKworI2RlZmluZSBET1QxMUZfVExWX1AyUEdST1VQSU5GT19NQVhfTEVOICggMTAyNSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZQMlBHcm91cEluZm8odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWUDJQR3JvdXBJbmZvKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZQMlBHcm91cEluZm8odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZQMlBHcm91cEluZm8qLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdlAyUEdyb3VwSW5mbyh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlAyUEdyb3VwSW5mbyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAwICgweDAwMDApCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWUDJQU3RhdHVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgc3RhdHVzOworfSB0RG90MTFmVExWUDJQU3RhdHVzOworCisjZGVmaW5lIERPVDExRl9UTFZfUDJQU1RBVFVTICggMCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBTVEFUVVNfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9UTFZfUDJQU1RBVFVTX01BWF9MRU4gKCAyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlAyUFN0YXR1cyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZQMlBTdGF0dXMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlAyUFN0YXR1cyh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlAyUFN0YXR1cyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2UDJQU3RhdHVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWUDJQU3RhdHVzKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDQxODAgKDB4MTA1NCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgIHByaW1hcnlfY2F0ZWdvcnk7CisgICAgdEFOSV9VOCAgICAgIG91aVs0XTsKKyAgICB0QU5JX1UxNiAgICAgc3ViX2NhdGVnb3J5OworfSB0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGU7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QUklNQVJZREVWSUNFVFlQRSAoIDQxODAgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfUFJJTUFSWURFVklDRVRZUEVfTUlOX0xFTiAoIDEwICkKKworI2RlZmluZSBET1QxMUZfVExWX1BSSU1BUllERVZJQ0VUWVBFX01BWF9MRU4gKCAxMCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZQcmltYXJ5RGV2aWNlVHlwZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2UHJpbWFyeURldmljZVR5cGUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2UHJpbWFyeURldmljZVR5cGUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA0MTU2ICgweDEwM2MpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWUkZCYW5kcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIGJhbmRzOworfSB0RG90MTFmVExWUkZCYW5kczsKKworI2RlZmluZSBET1QxMUZfVExWX1JGQkFORFMgKCA0MTU2ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX1JGQkFORFNfTUlOX0xFTiAoIDMgKQorCisjZGVmaW5lIERPVDExRl9UTFZfUkZCQU5EU19NQVhfTEVOICggMyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZSRkJhbmRzKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVlJGQmFuZHMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlJGQmFuZHModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZSRkJhbmRzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZSRkJhbmRzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWUkZCYW5kcyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA0MjAyICgweDEwNmEpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWUmVxdWVzdERldmljZVR5cGUgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICBwcmltYXJ5X2NhdGVnb3J5OworICAgIHRBTklfVTggICAgICBvdWlbNF07CisgICAgdEFOSV9VMTYgICAgIHN1Yl9jYXRlZ29yeTsKK30gdERvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlOworCisjZGVmaW5lIERPVDExRl9UTFZfUkVRVUVTVERFVklDRVRZUEUgKCA0MjAyICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX1JFUVVFU1RERVZJQ0VUWVBFX01JTl9MRU4gKCAxMCApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9SRVFVRVNUREVWSUNFVFlQRV9NQVhfTEVOICggMTAgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2UmVxdWVzdERldmljZVR5cGUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlJlcXVlc3REZXZpY2VUeXBlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdlJlcXVlc3REZXZpY2VUeXBlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNDE1NCAoMHgxMDNhKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlJlcXVlc3RUeXBlIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgcmVxVHlwZTsKK30gdERvdDExZlRMVlJlcXVlc3RUeXBlOworCisjZGVmaW5lIERPVDExRl9UTFZfUkVRVUVTVFRZUEUgKCA0MTU0ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX1JFUVVFU1RUWVBFX01JTl9MRU4gKCAzICkKKworI2RlZmluZSBET1QxMUZfVExWX1JFUVVFU1RUWVBFX01BWF9MRU4gKCAzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlJlcXVlc3RUeXBlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVlJlcXVlc3RUeXBlKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZSZXF1ZXN0VHlwZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlJlcXVlc3RUeXBlKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZSZXF1ZXN0VHlwZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlJlcXVlc3RUeXBlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDQxNTUgKDB4MTAzYikKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZSZXNwb25zZVR5cGUgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICByZXNUeXBlOworfSB0RG90MTFmVExWUmVzcG9uc2VUeXBlOworCisjZGVmaW5lIERPVDExRl9UTFZfUkVTUE9OU0VUWVBFICggNDE1NSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9SRVNQT05TRVRZUEVfTUlOX0xFTiAoIDMgKQorCisjZGVmaW5lIERPVDExRl9UTFZfUkVTUE9OU0VUWVBFX01BWF9MRU4gKCAzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlJlc3BvbnNlVHlwZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZSZXNwb25zZVR5cGUqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlJlc3BvbnNlVHlwZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlJlc3BvbnNlVHlwZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2UmVzcG9uc2VUeXBlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWUmVzcG9uc2VUeXBlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDQxNjEgKDB4MTA0MSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhciB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHNlbGVjdGVkOworfSB0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXI7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9TRUxFQ1RFRFJFR0lTVFJBUiAoIDQxNjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVJfTUlOX0xFTiAoIDMgKQorCisjZGVmaW5lIERPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVJfTUFYX0xFTiAoIDMgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2U2VsZWN0ZWRSZWdpc3RyYXIodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlNlbGVjdGVkUmVnaXN0cmFyKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdlNlbGVjdGVkUmVnaXN0cmFyKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNDE3OSAoMHgxMDUzKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgIG1ldGhvZHM7Cit9IHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHM7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9TRUxFQ1RFRFJFR0lTVFJBUkNPTkZJR01FVEhPRFMgKCA0MTc5ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX1NFTEVDVEVEUkVHSVNUUkFSQ09ORklHTUVUSE9EU19NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9TRUxFQ1RFRFJFR0lTVFJBUkNPTkZJR01FVEhPRFNfTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNDE2MiAoMHgxMDQyKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlNlcmlhbE51bWJlciB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIG51bV90ZXh0OworICAgIHRBTklfVTggICAgICB0ZXh0WzMyXTsKK30gdERvdDExZlRMVlNlcmlhbE51bWJlcjsKKworI2RlZmluZSBET1QxMUZfVExWX1NFUklBTE5VTUJFUiAoIDQxNjIgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIElEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9UTFZfU0VSSUFMTlVNQkVSX01JTl9MRU4gKCAyICkKKworI2RlZmluZSBET1QxMUZfVExWX1NFUklBTE5VTUJFUl9NQVhfTEVOICggMzQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2U2VyaWFsTnVtYmVyKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVlNlcmlhbE51bWJlciopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2U2VyaWFsTnVtYmVyKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWU2VyaWFsTnVtYmVyKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZTZXJpYWxOdW1iZXIodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZTZXJpYWxOdW1iZXIqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNDE2NyAoMHgxMDQ3KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlVVSURfRSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHV1aWRbMTZdOworfSB0RG90MTFmVExWVVVJRF9FOworCisjZGVmaW5lIERPVDExRl9UTFZfVVVJRF9FICggNDE2NyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9VVUlEX0VfTUlOX0xFTiAoIDE4ICkKKworI2RlZmluZSBET1QxMUZfVExWX1VVSURfRV9NQVhfTEVOICggMTggKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2VVVJRF9FKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVlVVSURfRSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2VVVJRF9FKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWVVVJRF9FKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZVVUlEX0UodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZVVUlEX0UqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNDE2OCAoMHgxMDQ4KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlVVSURfUiB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHV1aWRbMTZdOworfSB0RG90MTFmVExWVVVJRF9SOworCisjZGVmaW5lIERPVDExRl9UTFZfVVVJRF9SICggNDE2OCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9VVUlEX1JfTUlOX0xFTiAoIDE4ICkKKworI2RlZmluZSBET1QxMUZfVExWX1VVSURfUl9NQVhfTEVOICggMTggKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2VVVJRF9SKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVlVVSURfUiopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2VVVJRF9SKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWVVVJRF9SKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZVVUlEX1IodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZVVUlEX1IqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNDE2OSAoMHgxMDQ5KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlZlbmRvckV4dGVuc2lvbiB7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgdmVuZG9ySWRbM107CisgICAgdERvdDExZlRMVlZlcnNpb24yICAgICAgICBWZXJzaW9uMjsKKyAgICB0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MgIEF1dGhvcml6ZWRNQUNzOworICAgIHREb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwgUmVxdWVzdFRvRW5yb2xsOworfSB0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uOworCisjZGVmaW5lIERPVDExRl9UTFZfVkVORE9SRVhURU5TSU9OICggNDE2OSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9WRU5ET1JFWFRFTlNJT05fTUlOX0xFTiAoIDUgKQorCisjZGVmaW5lIERPVDExRl9UTFZfVkVORE9SRVhURU5TSU9OX01BWF9MRU4gKCAxOSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZWZW5kb3JFeHRlbnNpb24odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTE2LCB0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZWZW5kb3JFeHRlbnNpb24odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24qLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRsdlZlbmRvckV4dGVuc2lvbih0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCA0MTcwICgweDEwNGEpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWVmVyc2lvbiB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgIG1pbm9yOiA0OworICAgIHRBTklfVTggICAgICAgICAgICBtYWpvcjogNDsKK30gdERvdDExZlRMVlZlcnNpb247CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9WRVJTSU9OICggNDE3MCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9WRVJTSU9OX01JTl9MRU4gKCAzICkKKworI2RlZmluZSBET1QxMUZfVExWX1ZFUlNJT05fTUFYX0xFTiAoIDMgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2VmVyc2lvbih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZWZXJzaW9uKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZWZXJzaW9uKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWVmVyc2lvbiosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2VmVyc2lvbih0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlZlcnNpb24qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gSUQgNDE2NCAoMHgxMDQ0KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVldQU1N0YXRlIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgc3RhdGU7Cit9IHREb3QxMWZUTFZXUFNTdGF0ZTsKKworI2RlZmluZSBET1QxMUZfVExWX1dQU1NUQVRFICggNDE2NCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9XUFNTVEFURV9NSU5fTEVOICggMyApCisKKyNkZWZpbmUgRE9UMTFGX1RMVl9XUFNTVEFURV9NQVhfTEVOICggMyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZXUFNTdGF0ZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZXUFNTdGF0ZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2V1BTU3RhdGUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZXUFNTdGF0ZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2V1BTU3RhdGUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZXUFNTdGF0ZSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBJRCAxNiAoMHgwMDEwKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlRMVlAyUEludGVyZmFjZSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIFAyUERldmljZUFkZHJlc3NbNl07Cit9IHREb3QxMWZUTFZQMlBJbnRlcmZhY2U7CisKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBJTlRFUkZBQ0UgKCAxNiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX1RMVl9QMlBJTlRFUkZBQ0VfTUlOX0xFTiAoIDcgKQorCisjZGVmaW5lIERPVDExRl9UTFZfUDJQSU5URVJGQUNFX01BWF9MRU4gKCA3ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlAyUEludGVyZmFjZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VMTYsIHREb3QxMWZUTFZQMlBJbnRlcmZhY2UqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlAyUEludGVyZmFjZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZlRMVlAyUEludGVyZmFjZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkVGx2UDJQSW50ZXJmYWNlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWUDJQSW50ZXJmYWNlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIElEIDEwICgweDAwMGEpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVExWUDJQTWFuYWdlYWJpbGl0eSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIG1hbmFnZWFiaWxpdHk7Cit9IHREb3QxMWZUTFZQMlBNYW5hZ2VhYmlsaXR5OworCisjZGVmaW5lIERPVDExRl9UTFZfUDJQTUFOQUdFQUJJTElUWSAoIDEwICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfVExWX1AyUE1BTkFHRUFCSUxJVFlfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9UTFZfUDJQTUFOQUdFQUJJTElUWV9NQVhfTEVOICggMiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZQMlBNYW5hZ2VhYmlsaXR5KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1UxNiwgdERvdDExZlRMVlAyUE1hbmFnZWFiaWxpdHkqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlAyUE1hbmFnZWFiaWxpdHkodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZUTFZQMlBNYW5hZ2VhYmlsaXR5KiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUbHZQMlBNYW5hZ2VhYmlsaXR5KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmVExWUDJQTWFuYWdlYWJpbGl0eSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbmZvcm1hdGlvbiBFbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIEVJRCAxICgweDAxKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQVBOYW1lIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbnVtX25hbWU7CisgICAgdEFOSV9VOCAgICAgIG5hbWVbMzJdOworfSB0RG90MTFmSUVBUE5hbWU7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9BUE5BTUUgKCAxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0FQTkFNRV9NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0FQTkFNRV9NQVhfTEVOICggMzIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVBUE5hbWUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRUFQTmFtZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVBUE5hbWUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUFQTmFtZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVBUE5hbWUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUFQTmFtZSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgNCAoMHgwNCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUJQSW5kaWNhdG9yIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgaW5kaWNhdG9yOworICAgIHRBTklfVTggICAgICB0eXBlOworfSB0RG90MTFmSUVCUEluZGljYXRvcjsKKworI2RlZmluZSBET1QxMUZfRUlEX0JQSU5ESUNBVE9SICggNCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9CUElORElDQVRPUl9NSU5fTEVOICggMiApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0JQSU5ESUNBVE9SX01BWF9MRU4gKCAyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llQlBJbmRpY2F0b3IodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRUJQSW5kaWNhdG9yKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUJQSW5kaWNhdG9yKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVCUEluZGljYXRvciosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVCUEluZGljYXRvcih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQlBJbmRpY2F0b3IqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIgKDB4MDIpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgY291bnRyeVN0clsyXTsKK30gdERvdDExZklFQ29uZGVuc2VkQ291bnRyeVN0cjsKKworI2RlZmluZSBET1QxMUZfRUlEX0NPTkRFTlNFRENPVU5UUllTVFIgKCAyICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0NPTkRFTlNFRENPVU5UUllTVFJfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9JRV9DT05ERU5TRURDT1VOVFJZU1RSX01BWF9MRU4gKCAyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llQ29uZGVuc2VkQ291bnRyeVN0cih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFQ29uZGVuc2VkQ291bnRyeVN0ciopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVDb25kZW5zZWRDb3VudHJ5U3RyKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUNvbmRlbnNlZENvdW50cnlTdHIodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIgKDB4MDIpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVHVEsgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICAgICAgICAga2V5SWQ6IDI7CisgICAgdEFOSV9VMTYgICAgICAgICByZXNlcnZlZDogMTQ7CisgICAgdEFOSV9VOCAgICAgIGtleUxlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgUlNDWzhdOworICAgIHRBTklfVTggICAgICBudW1fa2V5OworICAgIHRBTklfVTggICAgICBrZXlbMzJdOworfSB0RG90MTFmSUVHVEs7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9HVEsgKCAyICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0dUS19NSU5fTEVOICggMTYgKQorCisjZGVmaW5lIERPVDExRl9JRV9HVEtfTUFYX0xFTiAoIDQzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llR1RLKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVHVEsqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llR1RLKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVHVEsqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFR1RLKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVHVEsqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIgKDB4MDIpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVIQ0YgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBlbmFibGVkOworfSB0RG90MTFmSUVIQ0Y7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9IQ0YgKCAyICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0hDRl9NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0hDRl9NQVhfTEVOICggMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUhDRih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFSENGKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUhDRih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFSENGKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUhDRih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFSENGKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA5ICgweDA5KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFTExBdHRyIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1UzMiAgICAgZGVmZXJfdGhyZXNob2xkOworfSB0RG90MTFmSUVMTEF0dHI7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9MTEFUVFIgKCA5ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0xMQVRUUl9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0xMQVRUUl9NQVhfTEVOICggNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUxMQXR0cih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFTExBdHRyKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUxMQXR0cih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFTExBdHRyKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUxMQXR0cih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFTExBdHRyKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA4ICgweDA4KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFTG9hZEJhbGFuY2UgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBic3NpZFs2XTsKKyAgICB0QU5JX1U4ICAgICAgY2hhbm5lbDsKK30gdERvdDExZklFTG9hZEJhbGFuY2U7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9MT0FEQkFMQU5DRSAoIDggKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfTE9BREJBTEFOQ0VfTUlOX0xFTiAoIDcgKQorCisjZGVmaW5lIERPVDExRl9JRV9MT0FEQkFMQU5DRV9NQVhfTEVOICggNyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUxvYWRCYWxhbmNlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVMb2FkQmFsYW5jZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVMb2FkQmFsYW5jZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFTG9hZEJhbGFuY2UqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFTG9hZEJhbGFuY2UodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUxvYWRCYWxhbmNlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA2ICgweDA2KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFTG9hZEluZm8geworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICBudW1fc3RhczsKKyAgICB0QU5JX1UxNiAgICAgY2hhbm5lbF91dGlsOworfSB0RG90MTFmSUVMb2FkSW5mbzsKKworI2RlZmluZSBET1QxMUZfRUlEX0xPQURJTkZPICggNiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9MT0FESU5GT19NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0xPQURJTkZPX01BWF9MRU4gKCA0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llTG9hZEluZm8odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRUxvYWRJbmZvKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUxvYWRJbmZvKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVMb2FkSW5mbyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVMb2FkSW5mbyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFTG9hZEluZm8qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDcgKDB4MDcpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQcm9wQXNzb2NUeXBlIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgdHlwZTsKK30gdERvdDExZklFUHJvcEFzc29jVHlwZTsKKworI2RlZmluZSBET1QxMUZfRUlEX1BST1BBU1NPQ1RZUEUgKCA3ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1BST1BBU1NPQ1RZUEVfTUlOX0xFTiAoIDEgKQorCisjZGVmaW5lIERPVDExRl9JRV9QUk9QQVNTT0NUWVBFX01BWF9MRU4gKCAxICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUHJvcEFzc29jVHlwZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUHJvcEFzc29jVHlwZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQcm9wQXNzb2NUeXBlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQcm9wQXNzb2NUeXBlKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVByb3BBc3NvY1R5cGUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVByb3BBc3NvY1R5cGUqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDEwICgweDBhKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUHJvcENhcGFiaWxpdHkgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICBjYXBhYmlsaXR5OworfSB0RG90MTFmSUVQcm9wQ2FwYWJpbGl0eTsKKworI2RlZmluZSBET1QxMUZfRUlEX1BST1BDQVBBQklMSVRZICggMTAgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUFJPUENBUEFCSUxJVFlfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9JRV9QUk9QQ0FQQUJJTElUWV9NQVhfTEVOICggMiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVByb3BDYXBhYmlsaXR5KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVQcm9wQ2FwYWJpbGl0eSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQcm9wQ2FwYWJpbGl0eSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUHJvcENhcGFiaWxpdHkqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUHJvcENhcGFiaWxpdHkodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVByb3BDYXBhYmlsaXR5KiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAxNSAoMHgwZikKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVByb3BDaGFublN3aXRjaEFubiB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIG1vZGU7CisgICAgdEFOSV9VOCAgICAgIHByaW1hcnlfY2hhbm5lbDsKKyAgICB0QU5JX1U4ICAgICAgc3ViX2JhbmQ7CisgICAgdEFOSV9VOCAgICAgIGNoYW5uZWxfc3dpdGNoX2NvdW50OworfSB0RG90MTFmSUVQcm9wQ2hhbm5Td2l0Y2hBbm47CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QUk9QQ0hBTk5TV0lUQ0hBTk4gKCAxNSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9QUk9QQ0hBTk5TV0lUQ0hBTk5fTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9QUk9QQ0hBTk5TV0lUQ0hBTk5fTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQcm9wQ2hhbm5Td2l0Y2hBbm4odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVByb3BDaGFublN3aXRjaEFubiopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQcm9wQ2hhbm5Td2l0Y2hBbm4odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVByb3BDaGFublN3aXRjaEFubiosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQcm9wQ2hhbm5Td2l0Y2hBbm4odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVByb3BDaGFublN3aXRjaEFubiosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMTIgKDB4MGMpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQcm9wRURDQVBhcmFtcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHFvczsKKyAgICB0QU5JX1U4ICAgICAgcmVzZXJ2ZWQ7CisgICAgdEFOSV9VOCAgICAgICBhY2JlX2FpZnNuOiA0OworICAgIHRBTklfVTggICAgICAgICBhY2JlX2FjbTogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgYWNiZV9hY2k6IDI7CisgICAgdEFOSV9VOCAgICAgICAgICB1bnVzZWQxOiAxOworICAgIHRBTklfVTggICAgICAgICBhY2JlX21pbjogNDsKKyAgICB0QU5JX1U4ICAgICAgICAgYWNiZV9tYXg6IDQ7CisgICAgdEFOSV9VMTYgICAgIGFjYmVfdHhvcGxpbWl0OworICAgIHRBTklfVTggICAgICAgYWNia19haWZzbjogNDsKKyAgICB0QU5JX1U4ICAgICAgICAgYWNia19hY206IDE7CisgICAgdEFOSV9VOCAgICAgICAgIGFjYmtfYWNpOiAyOworICAgIHRBTklfVTggICAgICAgICAgdW51c2VkMjogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgYWNia19taW46IDQ7CisgICAgdEFOSV9VOCAgICAgICAgIGFjYmtfbWF4OiA0OworICAgIHRBTklfVTE2ICAgICBhY2JrX3R4b3BsaW1pdDsKKyAgICB0QU5JX1U4ICAgICAgIGFjdmlfYWlmc246IDQ7CisgICAgdEFOSV9VOCAgICAgICAgIGFjdmlfYWNtOiAxOworICAgIHRBTklfVTggICAgICAgICBhY3ZpX2FjaTogMjsKKyAgICB0QU5JX1U4ICAgICAgICAgIHVudXNlZDM6IDE7CisgICAgdEFOSV9VOCAgICAgICAgIGFjdmlfbWluOiA0OworICAgIHRBTklfVTggICAgICAgICBhY3ZpX21heDogNDsKKyAgICB0QU5JX1UxNiAgICAgYWN2aV90eG9wbGltaXQ7CisgICAgdEFOSV9VOCAgICAgICBhY3ZvX2FpZnNuOiA0OworICAgIHRBTklfVTggICAgICAgICBhY3ZvX2FjbTogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgYWN2b19hY2k6IDI7CisgICAgdEFOSV9VOCAgICAgICAgICB1bnVzZWQ0OiAxOworICAgIHRBTklfVTggICAgICAgICBhY3ZvX21pbjogNDsKKyAgICB0QU5JX1U4ICAgICAgICAgYWN2b19tYXg6IDQ7CisgICAgdEFOSV9VMTYgICAgIGFjdm9fdHhvcGxpbWl0OworfSB0RG90MTFmSUVQcm9wRURDQVBhcmFtczsKKworI2RlZmluZSBET1QxMUZfRUlEX1BST1BFRENBUEFSQU1TICggMTIgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUFJPUEVEQ0FQQVJBTVNfTUlOX0xFTiAoIDE4ICkKKworI2RlZmluZSBET1QxMUZfSUVfUFJPUEVEQ0FQQVJBTVNfTUFYX0xFTiAoIDE4ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUHJvcEVEQ0FQYXJhbXModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVByb3BFRENBUGFyYW1zKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVByb3BFRENBUGFyYW1zKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQcm9wRURDQVBhcmFtcyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQcm9wRURDQVBhcmFtcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUHJvcEVEQ0FQYXJhbXMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDE2ICgweDEwKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUHJvcFF1aWV0QlNTIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgcXVpZXRfY291bnQ7CisgICAgdEFOSV9VOCAgICAgIHF1aWV0X3BlcmlvZDsKKyAgICB0QU5JX1UxNiAgICAgcXVpZXRfZHVyYXRpb247CisgICAgdEFOSV9VMTYgICAgIHF1aWV0X29mZnNldDsKK30gdERvdDExZklFUHJvcFF1aWV0QlNTOworCisjZGVmaW5lIERPVDExRl9FSURfUFJPUFFVSUVUQlNTICggMTYgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUFJPUFFVSUVUQlNTX01JTl9MRU4gKCA2ICkKKworI2RlZmluZSBET1QxMUZfSUVfUFJPUFFVSUVUQlNTX01BWF9MRU4gKCA2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUHJvcFF1aWV0QlNTKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVQcm9wUXVpZXRCU1MqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUHJvcFF1aWV0QlNTKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQcm9wUXVpZXRCU1MqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUHJvcFF1aWV0QlNTKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQcm9wUXVpZXRCU1MqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDAgKDB4MDApCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQcm9wU3VwcFJhdGVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3JhdGVzOworICAgIHRBTklfVTggICAgICByYXRlc1sxMl07Cit9IHREb3QxMWZJRVByb3BTdXBwUmF0ZXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QUk9QU1VQUFJBVEVTICggMCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9QUk9QU1VQUFJBVEVTX01JTl9MRU4gKCAxICkKKworI2RlZmluZSBET1QxMUZfSUVfUFJPUFNVUFBSQVRFU19NQVhfTEVOICggMTIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQcm9wU3VwcFJhdGVzKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVQcm9wU3VwcFJhdGVzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVByb3BTdXBwUmF0ZXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVByb3BTdXBwUmF0ZXMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUHJvcFN1cHBSYXRlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUHJvcFN1cHBSYXRlcyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMyAoMHgwMykKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVIwS0hfSUQgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBudW1fUE1LX1IwX0lEOworICAgIHRBTklfVTggICAgICBQTUtfUjBfSURbNDhdOworfSB0RG90MTFmSUVSMEtIX0lEOworCisjZGVmaW5lIERPVDExRl9FSURfUjBLSF9JRCAoIDMgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUjBLSF9JRF9NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1IwS0hfSURfTUFYX0xFTiAoIDQ4ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUjBLSF9JRCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUjBLSF9JRCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVSMEtIX0lEKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVSMEtIX0lEKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVIwS0hfSUQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVIwS0hfSUQqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDEgKDB4MDEpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVSMUtIX0lEIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgUE1LX1IxX0lEWzZdOworfSB0RG90MTFmSUVSMUtIX0lEOworCisjZGVmaW5lIERPVDExRl9FSURfUjFLSF9JRCAoIDEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUjFLSF9JRF9NSU5fTEVOICggNiApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1IxS0hfSURfTUFYX0xFTiAoIDYgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVSMUtIX0lEKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVSMUtIX0lEKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVIxS0hfSUQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVIxS0hfSUQqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUjFLSF9JRCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUjFLSF9JRCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMSAoMHgwMSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVRTRkluZm8geworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICBUc2ZPZmZzZXQ7CisgICAgdEFOSV9VMTYgICAgIEJlYWNvbkludHZsOworfSB0RG90MTFmSUVUU0ZJbmZvOworCisjZGVmaW5lIERPVDExRl9FSURfVFNGSU5GTyAoIDEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfVFNGSU5GT19NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1RTRklORk9fTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVUU0ZJbmZvKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVUU0ZJbmZvKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVRTRkluZm8odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVRTRkluZm8qLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFVFNGSW5mbyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFVFNGSW5mbyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMTggKDB4MTIpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVUYXVydXMgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICBiYVRJREJpdG1hcDsKKyAgICB0QU5JX1UxNiAgICAgYmFQb2xpY3k7CisgICAgdEFOSV9VMTYgICAgIGJhQnVmZmVyU2l6ZTogMTI7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgcnN2ZDogNDsKK30gdERvdDExZklFVGF1cnVzOworCisjZGVmaW5lIERPVDExRl9FSURfVEFVUlVTICggMTggKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfVEFVUlVTX01JTl9MRU4gKCA2ICkKKworI2RlZmluZSBET1QxMUZfSUVfVEFVUlVTX01BWF9MRU4gKCA2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llVGF1cnVzKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVUYXVydXMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llVGF1cnVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVUYXVydXMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFVGF1cnVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVUYXVydXMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDE0ICgweDBlKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFVGl0YW4geworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBjb25jYXRfdGNpZF9iaXRtYXA7CisgICAgdEFOSV9VOCAgICAgIGNvbXByZXNzaW9uX3RjaWRfYml0bWFwOworICAgIHRBTklfVTggICAgICBjYl9zdGF0ZTsKKyAgICB0QU5JX1U4ICAgICAgcmV2X2Zjc19zdGF0ZTsKK30gdERvdDExZklFVGl0YW47CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9USVRBTiAoIDE0ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1RJVEFOX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfSUVfVElUQU5fTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVUaXRhbih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFVGl0YW4qKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llVGl0YW4odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVRpdGFuKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVRpdGFuKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVUaXRhbiosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMTcgKDB4MTEpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVUcmlnZ2VyU3RhQmdTY2FuIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgZW5hYmxlOworfSB0RG90MTFmSUVUcmlnZ2VyU3RhQmdTY2FuOworCisjZGVmaW5lIERPVDExRl9FSURfVFJJR0dFUlNUQUJHU0NBTiAoIDE3ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1RSSUdHRVJTVEFCR1NDQU5fTUlOX0xFTiAoIDEgKQorCisjZGVmaW5lIERPVDExRl9JRV9UUklHR0VSU1RBQkdTQ0FOX01BWF9MRU4gKCAxICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llVHJpZ2dlclN0YUJnU2Nhbih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFVHJpZ2dlclN0YUJnU2NhbiopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVUcmlnZ2VyU3RhQmdTY2FuKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVUcmlnZ2VyU3RhQmdTY2FuKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVRyaWdnZXJTdGFCZ1NjYW4odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVRyaWdnZXJTdGFCZ1NjYW4qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDExICgweDBiKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFVmVyc2lvbiB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMzIgICAgIGNoaXBfcmV2OworICAgIHRBTklfVTggICAgICBjYXJkX3R5cGU7CisgICAgdEFOSV9VOCAgICAgIG51bV9idWlsZF92ZXJzaW9uOworICAgIHRBTklfVTggICAgICBidWlsZF92ZXJzaW9uWzIwXTsKK30gdERvdDExZklFVmVyc2lvbjsKKworI2RlZmluZSBET1QxMUZfRUlEX1ZFUlNJT04gKCAxMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9WRVJTSU9OX01JTl9MRU4gKCA1ICkKKworI2RlZmluZSBET1QxMUZfSUVfVkVSU0lPTl9NQVhfTEVOICggMjUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVWZXJzaW9uKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVWZXJzaW9uKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVZlcnNpb24odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVZlcnNpb24qLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFVmVyc2lvbih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFVmVyc2lvbiosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMyAoMHgwMykKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdEUyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIG51bV93ZHNEYXRhOworICAgIHRBTklfVTggICAgICB3ZHNEYXRhWzY0XTsKK30gdERvdDExZklFV0RTOworCisjZGVmaW5lIERPVDExRl9FSURfV0RTICggMyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9XRFNfTUlOX0xFTiAoIDAgKQorCisjZGVmaW5lIERPVDExRl9JRV9XRFNfTUFYX0xFTiAoIDY0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llV0RTKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVXRFMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llV0RTKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXRFMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV0RTKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXRFMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDUxICgweDMzKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQVBDaGFubmVsUmVwb3J0IHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgcmVndWxhdG9yeUNsYXNzOworICAgIHRBTklfVTggICAgICBudW1fY2hhbm5lbExpc3Q7CisgICAgdEFOSV9VOCAgICAgIGNoYW5uZWxMaXN0WzUwXTsKK30gdERvdDExZklFQVBDaGFubmVsUmVwb3J0OworCisjZGVmaW5lIERPVDExRl9FSURfQVBDSEFOTkVMUkVQT1JUICggNTEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfQVBDSEFOTkVMUkVQT1JUX01JTl9MRU4gKCAxICkKKworI2RlZmluZSBET1QxMUZfSUVfQVBDSEFOTkVMUkVQT1JUX01BWF9MRU4gKCA1MSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUFQQ2hhbm5lbFJlcG9ydCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFQVBDaGFubmVsUmVwb3J0Kik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUFQQ2hhbm5lbFJlcG9ydCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQVBDaGFubmVsUmVwb3J0KiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUFQQ2hhbm5lbFJlcG9ydCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQVBDaGFubmVsUmVwb3J0KiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyICgweDAyKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgcmVwb3J0aW5nRGV0YWlsOworfSB0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWw7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9CQ05SRVBPUlRJTkdERVRBSUwgKCAyICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0JDTlJFUE9SVElOR0RFVEFJTF9NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0JDTlJFUE9SVElOR0RFVEFJTF9NQVhfTEVOICggMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUJjblJlcG9ydGluZ0RldGFpbCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUJjblJlcG9ydGluZ0RldGFpbCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUJjblJlcG9ydGluZ0RldGFpbCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAxICgweDAxKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIG51bV9yZXBvcnRlZEZpZWxkczsKKyAgICB0QU5JX1U4ICAgICAgcmVwb3J0ZWRGaWVsZHNbMjI0XTsKK30gdERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keTsKKworI2RlZmluZSBET1QxMUZfRUlEX0JFQUNPTlJFUE9SVEZSTUJPRFkgKCAxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0JFQUNPTlJFUE9SVEZSTUJPRFlfTUlOX0xFTiAoIDAgKQorCisjZGVmaW5lIERPVDExRl9JRV9CRUFDT05SRVBPUlRGUk1CT0RZX01BWF9MRU4gKCAyMjQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVCZWFjb25SZXBvcnRGcm1Cb2R5KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5Kik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUJlYWNvblJlcG9ydEZybUJvZHkodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUJlYWNvblJlcG9ydEZybUJvZHkqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFQmVhY29uUmVwb3J0RnJtQm9keSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMSAoMHgwMSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUJlYWNvblJlcG9ydGluZyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHJlcG9ydGluZ0NvbmRpdGlvbjsKKyAgICB0QU5JX1U4ICAgICAgdGhyZXNob2xkOworfSB0RG90MTFmSUVCZWFjb25SZXBvcnRpbmc7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9CRUFDT05SRVBPUlRJTkcgKCAxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0JFQUNPTlJFUE9SVElOR19NSU5fTEVOICggMiApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0JFQUNPTlJFUE9SVElOR19NQVhfTEVOICggMiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUJlYWNvblJlcG9ydGluZyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFQmVhY29uUmVwb3J0aW5nKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUJlYWNvblJlcG9ydGluZyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQmVhY29uUmVwb3J0aW5nKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUJlYWNvblJlcG9ydGluZyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQmVhY29uUmVwb3J0aW5nKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA2NiAoMHg0MikKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBtZWFzdXJlbWVudFBpbG90OworICAgIHRBTklfVTggICAgICBudW1fdmVuZG9yU3BlY2lmaWM7CisgICAgdEFOSV9VOCAgICAgIHZlbmRvclNwZWNpZmljWzI1NV07Cit9IHREb3QxMWZJRU1lYXN1cmVtZW50UGlsb3Q7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9NRUFTVVJFTUVOVFBJTE9UICggNjYgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfTUVBU1VSRU1FTlRQSUxPVF9NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX01FQVNVUkVNRU5UUElMT1RfTUFYX0xFTiAoIDI1NiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZU1lYXN1cmVtZW50UGlsb3QodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llTWVhc3VyZW1lbnRQaWxvdCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFTWVhc3VyZW1lbnRQaWxvdCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVNZWFzdXJlbWVudFBpbG90KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90KiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA3MSAoMHg0NykKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRU11bHRpQnNzaWQgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBtYXhCU1NJREluZGljYXRvcjsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3ZlbmRvclNwZWNpZmljOworICAgIHRBTklfVTggICAgICB2ZW5kb3JTcGVjaWZpY1syNTVdOworfSB0RG90MTFmSUVNdWx0aUJzc2lkOworCisjZGVmaW5lIERPVDExRl9FSURfTVVMVElCU1NJRCAoIDcxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX01VTFRJQlNTSURfTUlOX0xFTiAoIDEgKQorCisjZGVmaW5lIERPVDExRl9JRV9NVUxUSUJTU0lEX01BWF9MRU4gKCAyNTYgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVNdWx0aUJzc2lkKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVNdWx0aUJzc2lkKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZU11bHRpQnNzaWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRU11bHRpQnNzaWQqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFTXVsdGlCc3NpZCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFTXVsdGlCc3NpZCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgNTcgKDB4MzkpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVSSUNEYXRhIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgSWRlbnRpZmllcjsKKyAgICB0QU5JX1U4ICAgICAgcmVzb3VyY2VEZXNjQ291bnQ7CisgICAgdEFOSV9VMTYgICAgIHN0YXR1c0NvZGU7Cit9IHREb3QxMWZJRVJJQ0RhdGE7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9SSUNEQVRBICggNTcgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUklDREFUQV9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1JJQ0RBVEFfTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVSSUNEYXRhKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVSSUNEYXRhKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVJJQ0RhdGEodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVJJQ0RhdGEqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUklDRGF0YSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUklDRGF0YSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgNzUgKDB4NGIpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVSSUNEZXNjcmlwdG9yIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgcmVzb3VyY2VUeXBlOworICAgIHRBTklfVTggICAgICBudW1fdmFyaWFibGVEYXRhOworICAgIHRBTklfVTggICAgICB2YXJpYWJsZURhdGFbMjU1XTsKK30gdERvdDExZklFUklDRGVzY3JpcHRvcjsKKworI2RlZmluZSBET1QxMUZfRUlEX1JJQ0RFU0NSSVBUT1IgKCA3NSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9SSUNERVNDUklQVE9SX01JTl9MRU4gKCAxICkKKworI2RlZmluZSBET1QxMUZfSUVfUklDREVTQ1JJUFRPUl9NQVhfTEVOICggMjU2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUklDRGVzY3JpcHRvcih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUklDRGVzY3JpcHRvciopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVSSUNEZXNjcmlwdG9yKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVSSUNEZXNjcmlwdG9yKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVJJQ0Rlc2NyaXB0b3IodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDcwICgweDQ2KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUlJNRW5hYmxlZENhcCB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgTGlua01lYXN1cmVtZW50OiAxOworICAgIHRBTklfVTggICAgICBOZWlnaGJvclJwdDogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgcGFyYWxsZWw6IDE7CisgICAgdEFOSV9VOCAgICAgICAgIHJlcGVhdGVkOiAxOworICAgIHRBTklfVTggICAgQmVhY29uUGFzc2l2ZTogMTsKKyAgICB0QU5JX1U4ICAgICBCZWFjb25BY3RpdmU6IDE7CisgICAgdEFOSV9VOCAgICAgIEJlYWNvblRhYmxlOiAxOworICAgIHRBTklfVTggICAgQmVhY29uUmVwQ29uZDogMTsKKyAgICB0QU5JX1U4IEZyYW1lTWVhc3VyZW1lbnQ6IDE7CisgICAgdEFOSV9VOCAgICAgIENoYW5uZWxMb2FkOiAxOworICAgIHRBTklfVTggICBOb2lzZUhpc3RvZ3JhbTogMTsKKyAgICB0QU5JX1U4ICAgICAgIHN0YXRpc3RpY3M6IDE7CisgICAgdEFOSV9VOCAgIExDSU1lYXN1cmVtZW50OiAxOworICAgIHRBTklfVTggICAgICAgTENJQXppbXV0aDogMTsKKyAgICB0QU5JX1U4ICAgIFRDTUNhcGFiaWxpdHk6IDE7CisgICAgdEFOSV9VOCAgICAgdHJpZ2dlcmVkVENNOiAxOworICAgIHRBTklfVTggICAgIEFQQ2hhblJlcG9ydDogMTsKKyAgICB0QU5JX1U4ICAgIFJSTU1JQkVuYWJsZWQ6IDE7CisgICAgdEFOSV9VOCBvcGVyYXRpbmdDaGFuTWF4OiAzOworICAgIHRBTklfVTggbm9uT3BlcmF0aW5DaGFuTWF4OiAzOworICAgIHRBTklfVTggTWVhc3VyZW1lbnRQaWxvdDogMzsKKyAgICB0QU5JX1U4IE1lYXN1cmVtZW50UGlsb3RFbmFibGVkOiAxOworICAgIHRBTklfVTggTmVpZ2hib3JUU0ZPZmZzZXQ6IDE7CisgICAgdEFOSV9VOCAgUkNQSU1lYXN1cmVtZW50OiAxOworICAgIHRBTklfVTggIFJTTklNZWFzdXJlbWVudDogMTsKKyAgICB0QU5JX1U4IEJzc0F2Z0FjY2Vzc0RlbGF5OiAxOworICAgIHRBTklfVTggQlNTQXZhaWxBZG1pc3Npb246IDE7CisgICAgdEFOSV9VOCBBbnRlbm5hSW5mb3JtYXRpb246IDE7CisgICAgdEFOSV9VOCAgICAgICAgIHJlc2VydmVkOiA2OworfSB0RG90MTFmSUVSUk1FbmFibGVkQ2FwOworCisjZGVmaW5lIERPVDExRl9FSURfUlJNRU5BQkxFRENBUCAoIDcwICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1JSTUVOQUJMRURDQVBfTUlOX0xFTiAoIDUgKQorCisjZGVmaW5lIERPVDExRl9JRV9SUk1FTkFCTEVEQ0FQX01BWF9MRU4gKCA1ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUlJNRW5hYmxlZENhcCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUlJNRW5hYmxlZENhcCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVSUk1FbmFibGVkQ2FwKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVSUk1FbmFibGVkQ2FwKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVJSTUVuYWJsZWRDYXAodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVJSTUVuYWJsZWRDYXAqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDEwICgweDBhKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUmVxdWVzdGVkSW5mbyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIG51bV9yZXF1ZXN0ZWRfZWlkczsKKyAgICB0QU5JX1U4ICAgICAgcmVxdWVzdGVkX2VpZHNbMjU1XTsKK30gdERvdDExZklFUmVxdWVzdGVkSW5mbzsKKworI2RlZmluZSBET1QxMUZfRUlEX1JFUVVFU1RFRElORk8gKCAxMCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9SRVFVRVNURURJTkZPX01JTl9MRU4gKCAwICkKKworI2RlZmluZSBET1QxMUZfSUVfUkVRVUVTVEVESU5GT19NQVhfTEVOICggMjU1ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUmVxdWVzdGVkSW5mbyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUmVxdWVzdGVkSW5mbyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVSZXF1ZXN0ZWRJbmZvKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVSZXF1ZXN0ZWRJbmZvKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVJlcXVlc3RlZEluZm8odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVJlcXVlc3RlZEluZm8qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDAgKDB4MDApCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVTU0lEIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3NzaWQ7CisgICAgdEFOSV9VOCAgICAgIHNzaWRbMzJdOworfSB0RG90MTFmSUVTU0lEOworCisjZGVmaW5lIERPVDExRl9FSURfU1NJRCAoIDAgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfU1NJRF9NSU5fTEVOICggMCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1NTSURfTUFYX0xFTiAoIDMyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llU1NJRCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFU1NJRCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVTU0lEKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVTU0lEKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVNTSUQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVNTSUQqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDE1ICgweDBmKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFU2NoZWR1bGUgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICAgYWdncmVnYXRpb246IDE7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgdHNpZDogNDsKKyAgICB0QU5JX1UxNiAgICAgICAgZGlyZWN0aW9uOiAyOworICAgIHRBTklfVTE2ICAgICAgICAgcmVzZXJ2ZWQ6IDk7CisgICAgdEFOSV9VMzIgICAgIHNlcnZpY2Vfc3RhcnRfdGltZTsKKyAgICB0QU5JX1UzMiAgICAgc2VydmljZV9pbnRlcnZhbDsKKyAgICB0QU5JX1UxNiAgICAgbWF4X3NlcnZpY2VfZHVyOworICAgIHRBTklfVTE2ICAgICBzcGVjX2ludGVydmFsOworfSB0RG90MTFmSUVTY2hlZHVsZTsKKworI2RlZmluZSBET1QxMUZfRUlEX1NDSEVEVUxFICggMTUgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfU0NIRURVTEVfTUlOX0xFTiAoIDE0ICkKKworI2RlZmluZSBET1QxMUZfSUVfU0NIRURVTEVfTUFYX0xFTiAoIDE0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llU2NoZWR1bGUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVNjaGVkdWxlKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVNjaGVkdWxlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVTY2hlZHVsZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVTY2hlZHVsZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFU2NoZWR1bGUqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDE0ICgweDBlKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFVENMQVMgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICB1c2VyX3ByaW9yaXR5OworICAgIHRBTklfVTggICAgICBjbGFzc2lmaWVyX3R5cGU7CisgICAgdEFOSV9VOCAgICAgIGNsYXNzaWZpZXJfbWFzazsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTggc291cmNlWzZdOworICAgICAgICAgICAgdEFOSV9VOCBkZXN0WzZdOworICAgICAgICAgICAgdEFOSV9VMTYgdHlwZTsKKyAgICAgICAgfSBFdGhQYXJhbXM7IC8qIGNsYXNzaWZpZXJfdHlwZSA9IDAgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTggdmVyc2lvbjsKKyAgICAgICAgICAgIHVuaW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IHNvdXJjZVs0XTsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBkZXN0WzRdOworICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiBzcmNfcG9ydDsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgZGVzdF9wb3J0OworICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IERTQ1A7CisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggcHJvdG87CisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggcmVzZXJ2ZWQ7CisgICAgICAgICAgICAgICAgfSBJcFY0UGFyYW1zOyAvKiB2ZXJzaW9uID0gNCAqLworICAgICAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBzb3VyY2VbMTZdOworICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGRlc3RbMTZdOworICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiBzcmNfcG9ydDsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgZGVzdF9wb3J0OworICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGZsb3dfbGFiZWxbM107CisgICAgICAgICAgICAgICAgfSBJcFY2UGFyYW1zOyAvKiB2ZXJzaW9uID0gNiAqLworICAgICAgICAgICAgfSBwYXJhbXM7CisgICAgICAgIH0gSXBQYXJhbXM7IC8qIGNsYXNzaWZpZXJfdHlwZSA9IDEgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTE2IHRhZ190eXBlOworICAgICAgICB9IFBhcmFtczgwMjFkcTsgLyogY2xhc3NpZmllcl90eXBlID0gMiAqLworICAgIH0gaW5mbzsKK30gdERvdDExZklFVENMQVM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9UQ0xBUyAoIDE0ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1RDTEFTX01JTl9MRU4gKCA1ICkKKworI2RlZmluZSBET1QxMUZfSUVfVENMQVNfTUFYX0xFTiAoIDQzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llVENMQVModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVRDTEFTKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVRDTEFTKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVUQ0xBUyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVUQ0xBUyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFVENMQVMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDQ0ICgweDJjKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFVENMQVNTUFJPQyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHByb2Nlc3Npbmc7Cit9IHREb3QxMWZJRVRDTEFTU1BST0M7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9UQ0xBU1NQUk9DICggNDQgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfVENMQVNTUFJPQ19NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1RDTEFTU1BST0NfTUFYX0xFTiAoIDEgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVUQ0xBU1NQUk9DKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVUQ0xBU1NQUk9DKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVRDTEFTU1BST0ModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVRDTEFTU1BST0MqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFVENMQVNTUFJPQyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFVENMQVNTUFJPQyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgNDMgKDB4MmIpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVUU0RlbGF5IHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1UzMiAgICAgZGVsYXk7Cit9IHREb3QxMWZJRVRTRGVsYXk7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9UU0RFTEFZICggNDMgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfVFNERUxBWV9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1RTREVMQVlfTUFYX0xFTiAoIDQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVUU0RlbGF5KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVUU0RlbGF5Kik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVRTRGVsYXkodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVRTRGVsYXkqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFVFNEZWxheSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFVFNEZWxheSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMTMgKDB4MGQpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVUU1BFQyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgIHRyYWZmaWNfdHlwZTogMTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICB0c2lkOiA0OworICAgIHRBTklfVTE2ICAgICAgICBkaXJlY3Rpb246IDI7CisgICAgdEFOSV9VMTYgICAgYWNjZXNzX3BvbGljeTogMjsKKyAgICB0QU5JX1UxNiAgICAgIGFnZ3JlZ2F0aW9uOiAxOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICBwc2I6IDE7CisgICAgdEFOSV9VMTYgICAgdXNlcl9wcmlvcml0eTogMzsKKyAgICB0QU5JX1UxNiAgIHRzaW5mb19hY2tfcG9sOiAyOworICAgIHRBTklfVTggICAgICAgICBzY2hlZHVsZTogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgICB1bnVzZWQ6IDc7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgc2l6ZTogMTU7CisgICAgdEFOSV9VMTYgICAgICAgICAgICBmaXhlZDogMTsKKyAgICB0QU5JX1UxNiAgICAgbWF4X21zZHVfc2l6ZTsKKyAgICB0QU5JX1UzMiAgICAgbWluX3NlcnZpY2VfaW50OworICAgIHRBTklfVTMyICAgICBtYXhfc2VydmljZV9pbnQ7CisgICAgdEFOSV9VMzIgICAgIGluYWN0aXZpdHlfaW50OworICAgIHRBTklfVTMyICAgICBzdXNwZW5zaW9uX2ludDsKKyAgICB0QU5JX1UzMiAgICAgc2VydmljZV9zdGFydF90aW1lOworICAgIHRBTklfVTMyICAgICBtaW5fZGF0YV9yYXRlOworICAgIHRBTklfVTMyICAgICBtZWFuX2RhdGFfcmF0ZTsKKyAgICB0QU5JX1UzMiAgICAgcGVha19kYXRhX3JhdGU7CisgICAgdEFOSV9VMzIgICAgIGJ1cnN0X3NpemU7CisgICAgdEFOSV9VMzIgICAgIGRlbGF5X2JvdW5kOworICAgIHRBTklfVTMyICAgICBtaW5fcGh5X3JhdGU7CisgICAgdEFOSV9VMTYgICAgIHN1cnBsdXNfYndfYWxsb3dhbmNlOworICAgIHRBTklfVTE2ICAgICBtZWRpdW1fdGltZTsKK30gdERvdDExZklFVFNQRUM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9UU1BFQyAoIDEzICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1RTUEVDX01JTl9MRU4gKCA1NSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1RTUEVDX01BWF9MRU4gKCA1NSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVRTUEVDKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVUU1BFQyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVUU1BFQyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFVFNQRUMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFVFNQRUModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVRTUEVDKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwOX0KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdNTVNjaGVkdWxlIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgdmVyc2lvbiAvKiBNdXN0IGJlIDEhICovOworICAgIHRBTklfVTE2ICAgICAgYWdncmVnYXRpb246IDE7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgdHNpZDogNDsKKyAgICB0QU5JX1UxNiAgICAgICAgZGlyZWN0aW9uOiAyOworICAgIHRBTklfVTE2ICAgICAgICAgcmVzZXJ2ZWQ6IDk7CisgICAgdEFOSV9VMzIgICAgIHNlcnZpY2Vfc3RhcnRfdGltZTsKKyAgICB0QU5JX1UzMiAgICAgc2VydmljZV9pbnRlcnZhbDsKKyAgICB0QU5JX1UxNiAgICAgbWF4X3NlcnZpY2VfZHVyOworICAgIHRBTklfVTE2ICAgICBzcGVjX2ludGVydmFsOworfSB0RG90MTFmSUVXTU1TY2hlZHVsZTsKKworI2RlZmluZSBET1QxMUZfRUlEX1dNTVNDSEVEVUxFICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1dNTVNDSEVEVUxFX01JTl9MRU4gKCAyMCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dNTVNDSEVEVUxFX01BWF9MRU4gKCAyMCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdNTVNjaGVkdWxlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVXTU1TY2hlZHVsZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXTU1TY2hlZHVsZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV01NU2NoZWR1bGUqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV01NU2NoZWR1bGUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdNTVNjaGVkdWxlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwNn0KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdNTVRDTEFTIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgdmVyc2lvbiAvKiBNdXN0IGJlIDEhICovOworICAgIHRBTklfVTggICAgICB1c2VyX3ByaW9yaXR5OworICAgIHRBTklfVTggICAgICBjbGFzc2lmaWVyX3R5cGU7CisgICAgdEFOSV9VOCAgICAgIGNsYXNzaWZpZXJfbWFzazsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTggc291cmNlWzZdOworICAgICAgICAgICAgdEFOSV9VOCBkZXN0WzZdOworICAgICAgICAgICAgdEFOSV9VMTYgdHlwZTsKKyAgICAgICAgfSBFdGhQYXJhbXM7IC8qIGNsYXNzaWZpZXJfdHlwZSA9IDAgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTggdmVyc2lvbjsKKyAgICAgICAgICAgIHVuaW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IHNvdXJjZVs0XTsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBkZXN0WzRdOworICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiBzcmNfcG9ydDsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgZGVzdF9wb3J0OworICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IERTQ1A7CisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggcHJvdG87CisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggcmVzZXJ2ZWQ7CisgICAgICAgICAgICAgICAgfSBJcFY0UGFyYW1zOyAvKiB2ZXJzaW9uID0gNCAqLworICAgICAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBzb3VyY2VbMTZdOworICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGRlc3RbMTZdOworICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiBzcmNfcG9ydDsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgZGVzdF9wb3J0OworICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGZsb3dfbGFiZWxbM107CisgICAgICAgICAgICAgICAgfSBJcFY2UGFyYW1zOyAvKiB2ZXJzaW9uID0gNiAqLworICAgICAgICAgICAgfSBwYXJhbXM7CisgICAgICAgIH0gSXBQYXJhbXM7IC8qIGNsYXNzaWZpZXJfdHlwZSA9IDEgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTE2IHRhZ190eXBlOworICAgICAgICB9IFBhcmFtczgwMjFkcTsgLyogY2xhc3NpZmllcl90eXBlID0gMiAqLworICAgIH0gaW5mbzsKK30gdERvdDExZklFV01NVENMQVM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XTU1UQ0xBUyAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9XTU1UQ0xBU19NSU5fTEVOICggMTEgKQorCisjZGVmaW5lIERPVDExRl9JRV9XTU1UQ0xBU19NQVhfTEVOICggNDkgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXTU1UQ0xBUyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFV01NVENMQVMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llV01NVENMQVModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdNTVRDTEFTKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVdNTVRDTEFTKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXTU1UQ0xBUyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDd9Cit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXTU1UQ0xBU1BST0MgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICB2ZXJzaW9uIC8qIE11c3QgYmUgMSEgKi87CisgICAgdEFOSV9VOCAgICAgIHByb2Nlc3Npbmc7Cit9IHREb3QxMWZJRVdNTVRDTEFTUFJPQzsKKworI2RlZmluZSBET1QxMUZfRUlEX1dNTVRDTEFTUFJPQyAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9XTU1UQ0xBU1BST0NfTUlOX0xFTiAoIDcgKQorCisjZGVmaW5lIERPVDExRl9JRV9XTU1UQ0xBU1BST0NfTUFYX0xFTiAoIDcgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXTU1UQ0xBU1BST0ModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdNTVRDTEFTUFJPQyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXTU1UQ0xBU1BST0ModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdNTVRDTEFTUFJPQyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXTU1UQ0xBU1BST0ModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdNTVRDTEFTUFJPQyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDh9Cit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXTU1UU0RlbGF5IHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgdmVyc2lvbiAvKiBNdXN0IGJlIDEhICovOworICAgIHRBTklfVTMyICAgICBkZWxheTsKK30gdERvdDExZklFV01NVFNEZWxheTsKKworI2RlZmluZSBET1QxMUZfRUlEX1dNTVRTREVMQVkgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfV01NVFNERUxBWV9NSU5fTEVOICggMTAgKQorCisjZGVmaW5lIERPVDExRl9JRV9XTU1UU0RFTEFZX01BWF9MRU4gKCAxMCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdNTVRTRGVsYXkodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdNTVRTRGVsYXkqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llV01NVFNEZWxheSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV01NVFNEZWxheSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXTU1UU0RlbGF5KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXTU1UU0RlbGF5KiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMn0KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdNTVRTUEVDIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgdmVyc2lvbiAvKiBNdXN0IGJlIDEhICovOworICAgIHRBTklfVTE2ICAgICB0cmFmZmljX3R5cGU6IDE7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgdHNpZDogNDsKKyAgICB0QU5JX1UxNiAgICAgICAgZGlyZWN0aW9uOiAyOworICAgIHRBTklfVTE2ICAgIGFjY2Vzc19wb2xpY3k6IDI7CisgICAgdEFOSV9VMTYgICAgICBhZ2dyZWdhdGlvbjogMTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgcHNiOiAxOworICAgIHRBTklfVTE2ICAgIHVzZXJfcHJpb3JpdHk6IDM7CisgICAgdEFOSV9VMTYgICB0c2luZm9fYWNrX3BvbDogMjsKKyAgICB0QU5JX1U4ICAgICAgdHNpbmZvX3JzdmQ6IDc7CisgICAgdEFOSV9VOCAgYnVyc3Rfc2l6ZV9kZWZuOiAxOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIHNpemU6IDE1OworICAgIHRBTklfVTE2ICAgICAgICAgICAgZml4ZWQ6IDE7CisgICAgdEFOSV9VMTYgICAgIG1heF9tc2R1X3NpemU7CisgICAgdEFOSV9VMzIgICAgIG1pbl9zZXJ2aWNlX2ludDsKKyAgICB0QU5JX1UzMiAgICAgbWF4X3NlcnZpY2VfaW50OworICAgIHRBTklfVTMyICAgICBpbmFjdGl2aXR5X2ludDsKKyAgICB0QU5JX1UzMiAgICAgc3VzcGVuc2lvbl9pbnQ7CisgICAgdEFOSV9VMzIgICAgIHNlcnZpY2Vfc3RhcnRfdGltZTsKKyAgICB0QU5JX1UzMiAgICAgbWluX2RhdGFfcmF0ZTsKKyAgICB0QU5JX1UzMiAgICAgbWVhbl9kYXRhX3JhdGU7CisgICAgdEFOSV9VMzIgICAgIHBlYWtfZGF0YV9yYXRlOworICAgIHRBTklfVTMyICAgICBidXJzdF9zaXplOworICAgIHRBTklfVTMyICAgICBkZWxheV9ib3VuZDsKKyAgICB0QU5JX1UzMiAgICAgbWluX3BoeV9yYXRlOworICAgIHRBTklfVTE2ICAgICBzdXJwbHVzX2J3X2FsbG93YW5jZTsKKyAgICB0QU5JX1UxNiAgICAgbWVkaXVtX3RpbWU7Cit9IHREb3QxMWZJRVdNTVRTUEVDOworCisjZGVmaW5lIERPVDExRl9FSURfV01NVFNQRUMgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfV01NVFNQRUNfTUlOX0xFTiAoIDYxICkKKworI2RlZmluZSBET1QxMUZfSUVfV01NVFNQRUNfTUFYX0xFTiAoIDYxICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llV01NVFNQRUModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdNTVRTUEVDKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdNTVRTUEVDKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXTU1UU1BFQyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXTU1UU1BFQyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV01NVFNQRUMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDBhLCAweGY1fQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQWlyZ28geworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICBwcmVzZW50OworICAgIHREb3QxMWZJRVByb3BTdXBwUmF0ZXMgICAgICBQcm9wU3VwcFJhdGVzOworICAgIHREb3QxMWZJRUFQTmFtZSAgICAgICAgICAgICBBUE5hbWU7CisgICAgdERvdDExZklFSENGICAgICAgICAgICAgICAgIEhDRjsKKyAgICB0RG90MTFmSUVXRFMgICAgICAgICAgICAgICAgV0RTOworICAgIHREb3QxMWZJRUJQSW5kaWNhdG9yICAgICAgICBCUEluZGljYXRvcjsKKyAgICB0RG90MTFmSUVMb2FkSW5mbyAgICAgICAgICAgTG9hZEluZm87CisgICAgdERvdDExZklFTG9hZEJhbGFuY2UgICAgICAgIExvYWRCYWxhbmNlOworICAgIHREb3QxMWZJRVByb3BBc3NvY1R5cGUgICAgICBQcm9wQXNzb2NUeXBlOworICAgIHREb3QxMWZJRUxMQXR0ciAgICAgICAgICAgICBMTEF0dHI7CisgICAgdERvdDExZklFUHJvcENhcGFiaWxpdHkgICAgIFByb3BDYXBhYmlsaXR5OworICAgIHREb3QxMWZJRVZlcnNpb24gICAgICAgICAgICBWZXJzaW9uOworICAgIHREb3QxMWZJRVByb3BFRENBUGFyYW1zICAgICBQcm9wRURDQVBhcmFtczsKKyAgICB0RG90MTFmSUVUaXRhbiAgICAgICAgICAgICAgVGl0YW47CisgICAgdERvdDExZklFUHJvcENoYW5uU3dpdGNoQW5uIFByb3BDaGFublN3aXRjaEFubjsKKyAgICB0RG90MTFmSUVQcm9wUXVpZXRCU1MgICAgICAgUHJvcFF1aWV0QlNTOworICAgIHREb3QxMWZJRVRyaWdnZXJTdGFCZ1NjYW4gICBUcmlnZ2VyU3RhQmdTY2FuOworICAgIHREb3QxMWZJRVRhdXJ1cyAgICAgICAgICAgICBUYXVydXM7Cit9IHREb3QxMWZJRUFpcmdvOworCisjZGVmaW5lIERPVDExRl9FSURfQUlSR08gKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfQUlSR09fTUlOX0xFTiAoIDMgKQorCisjZGVmaW5lIERPVDExRl9JRV9BSVJHT19NQVhfTEVOICggMjMwICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llQWlyZ28odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRUFpcmdvKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUFpcmdvKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVBaXJnbyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVBaXJnbyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQWlyZ28qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDE1NiAoMHg5Yykge09VSSAweDAwLCAweDQwLCAweDk2LCAweDAwfQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQ0NYQ2NrbU9wYXF1ZSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIG51bV9kYXRhOworICAgIHRBTklfVTggICAgICBkYXRhWzIwXTsKK30gdERvdDExZklFQ0NYQ2NrbU9wYXF1ZTsKKworI2RlZmluZSBET1QxMUZfRUlEX0NDWENDS01PUEFRVUUgKCAxNTYgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfQ0NYQ0NLTU9QQVFVRV9NSU5fTEVOICggMTAgKQorCisjZGVmaW5lIERPVDExRl9JRV9DQ1hDQ0tNT1BBUVVFX01BWF9MRU4gKCAyNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUNDWENja21PcGFxdWUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRUNDWENja21PcGFxdWUqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llQ0NYQ2NrbU9wYXF1ZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQ0NYQ2NrbU9wYXF1ZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVDQ1hDY2ttT3BhcXVlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVDQ1hDY2ttT3BhcXVlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMX0KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUNDWFJhZE1nbXRDYXAgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBtZ210X3N0YXRlOworICAgIHRBTklfVTggICAgICBtYnNzaWRfbWFzazogMzsKKyAgICB0QU5JX1U4ICAgICAgICAgcmVzZXJ2ZWQ6IDU7Cit9IHREb3QxMWZJRUNDWFJhZE1nbXRDYXA7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9DQ1hSQURNR01UQ0FQICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0NDWFJBRE1HTVRDQVBfTUlOX0xFTiAoIDYgKQorCisjZGVmaW5lIERPVDExRl9JRV9DQ1hSQURNR01UQ0FQX01BWF9MRU4gKCA2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llQ0NYUmFkTWdtdENhcCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFQ0NYUmFkTWdtdENhcCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVDQ1hSYWRNZ210Q2FwKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVDQ1hSYWRNZ210Q2FwKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUNDWFJhZE1nbXRDYXAodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUNDWFJhZE1nbXRDYXAqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDQwLCAweDk2LCAweDA3fQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQ0NYVHJhZlN0cm1NZXQgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICB0c2lkOworICAgIHRBTklfVTggICAgICBzdGF0ZTsKKyAgICB0QU5JX1UxNiAgICAgbXNtdF9pbnRlcnZhbDsKK30gdERvdDExZklFQ0NYVHJhZlN0cm1NZXQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9DQ1hUUkFGU1RSTU1FVCAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9DQ1hUUkFGU1RSTU1FVF9NSU5fTEVOICggOCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0NDWFRSQUZTVFJNTUVUX01BWF9MRU4gKCA4ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llQ0NYVHJhZlN0cm1NZXQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRUNDWFRyYWZTdHJtTWV0Kik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUNDWFRyYWZTdHJtTWV0KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVDQ1hUcmFmU3RybU1ldCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVDQ1hUcmFmU3RybU1ldCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQ0NYVHJhZlN0cm1NZXQqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDQwLCAweDk2LCAweDA4fQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQ0NYVHJhZlN0cm1SYXRlU2V0IHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgdHNpZDsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3RzcmF0ZXM7CisgICAgdEFOSV9VOCAgICAgIHRzcmF0ZXNbOF07Cit9IHREb3QxMWZJRUNDWFRyYWZTdHJtUmF0ZVNldDsKKworI2RlZmluZSBET1QxMUZfRUlEX0NDWFRSQUZTVFJNUkFURVNFVCAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9DQ1hUUkFGU1RSTVJBVEVTRVRfTUlOX0xFTiAoIDUgKQorCisjZGVmaW5lIERPVDExRl9JRV9DQ1hUUkFGU1RSTVJBVEVTRVRfTUFYX0xFTiAoIDEzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llQ0NYVHJhZlN0cm1SYXRlU2V0KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVDQ1hUcmFmU3RybVJhdGVTZXQqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llQ0NYVHJhZlN0cm1SYXRlU2V0KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVDQ1hUcmFmU3RybVJhdGVTZXQqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFQ0NYVHJhZlN0cm1SYXRlU2V0KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVDQ1hUcmFmU3RybVJhdGVTZXQqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDE1MCAoMHg5Nikge09VSSAweDAwLCAweDQwLCAweDk2LCAweDAwfQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQ0NYVHhtaXRQb3dlciB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHBvd2VyX2xpbWl0OworICAgIHRBTklfVTggICAgICByZXNlcnZlZDsKK30gdERvdDExZklFQ0NYVHhtaXRQb3dlcjsKKworI2RlZmluZSBET1QxMUZfRUlEX0NDWFRYTUlUUE9XRVIgKCAxNTAgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfQ0NYVFhNSVRQT1dFUl9NSU5fTEVOICggNiApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0NDWFRYTUlUUE9XRVJfTUFYX0xFTiAoIDYgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVDQ1hUeG1pdFBvd2VyKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVDQ1hUeG1pdFBvd2VyKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUNDWFR4bWl0UG93ZXIodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUNDWFR4bWl0UG93ZXIqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFQ0NYVHhtaXRQb3dlcih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQ0NYVHhtaXRQb3dlciosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDN9Cit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVDQ1hWZXJzaW9uIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgdmVyc2lvbjsKK30gdERvdDExZklFQ0NYVmVyc2lvbjsKKworI2RlZmluZSBET1QxMUZfRUlEX0NDWFZFUlNJT04gKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfQ0NYVkVSU0lPTl9NSU5fTEVOICggNSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0NDWFZFUlNJT05fTUFYX0xFTiAoIDUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVDQ1hWZXJzaW9uKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVDQ1hWZXJzaW9uKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUNDWFZlcnNpb24odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUNDWFZlcnNpb24qLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFQ0NYVmVyc2lvbih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFQ0NYVmVyc2lvbiosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgNCAoMHgwNCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUNGUGFyYW1zIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgY2ZwX2NvdW50OworICAgIHRBTklfVTggICAgICBjZnBfcGVyaW9kOworICAgIHRBTklfVTE2ICAgICBjZnBfbWF4ZHVyYXRpb247CisgICAgdEFOSV9VMTYgICAgIGNmcF9kdXJyZW1haW5pbmc7Cit9IHREb3QxMWZJRUNGUGFyYW1zOworCisjZGVmaW5lIERPVDExRl9FSURfQ0ZQQVJBTVMgKCA0ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0NGUEFSQU1TX01JTl9MRU4gKCA2ICkKKworI2RlZmluZSBET1QxMUZfSUVfQ0ZQQVJBTVNfTUFYX0xFTiAoIDYgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVDRlBhcmFtcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFQ0ZQYXJhbXMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llQ0ZQYXJhbXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUNGUGFyYW1zKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUNGUGFyYW1zKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVDRlBhcmFtcyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMTYgKDB4MTApCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVDaGFsbGVuZ2VUZXh0IHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3RleHQ7CisgICAgdEFOSV9VOCAgICAgIHRleHRbMjUzXTsKK30gdERvdDExZklFQ2hhbGxlbmdlVGV4dDsKKworI2RlZmluZSBET1QxMUZfRUlEX0NIQUxMRU5HRVRFWFQgKCAxNiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9DSEFMTEVOR0VURVhUX01JTl9MRU4gKCAxICkKKworI2RlZmluZSBET1QxMUZfSUVfQ0hBTExFTkdFVEVYVF9NQVhfTEVOICggMjUzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llQ2hhbGxlbmdlVGV4dCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFQ2hhbGxlbmdlVGV4dCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVDaGFsbGVuZ2VUZXh0KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVDaGFsbGVuZ2VUZXh0KiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUNoYWxsZW5nZVRleHQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUNoYWxsZW5nZVRleHQqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDM3ICgweDI1KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFQ2hhblN3aXRjaEFubiB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHN3aXRjaE1vZGU7CisgICAgdEFOSV9VOCAgICAgIG5ld0NoYW5uZWw7CisgICAgdEFOSV9VOCAgICAgIHN3aXRjaENvdW50OworfSB0RG90MTFmSUVDaGFuU3dpdGNoQW5uOworCisjZGVmaW5lIERPVDExRl9FSURfQ0hBTlNXSVRDSEFOTiAoIDM3ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0NIQU5TV0lUQ0hBTk5fTUlOX0xFTiAoIDMgKQorCisjZGVmaW5lIERPVDExRl9JRV9DSEFOU1dJVENIQU5OX01BWF9MRU4gKCAzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llQ2hhblN3aXRjaEFubih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFQ2hhblN3aXRjaEFubiopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVDaGFuU3dpdGNoQW5uKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVDaGFuU3dpdGNoQW5uKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUNoYW5Td2l0Y2hBbm4odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUNoYW5Td2l0Y2hBbm4qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDcgKDB4MDcpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVDb3VudHJ5IHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgY291bnRyeVszXTsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3RyaXBsZXRzOworICAgIHRBTklfVTggICAgICB0cmlwbGV0c1s4NF1bM107Cit9IHREb3QxMWZJRUNvdW50cnk7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9DT1VOVFJZICggNyApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9DT1VOVFJZX01JTl9MRU4gKCAzICkKKworI2RlZmluZSBET1QxMUZfSUVfQ09VTlRSWV9NQVhfTEVOICggMjU1ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llQ291bnRyeSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFQ291bnRyeSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVDb3VudHJ5KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVDb3VudHJ5KiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUNvdW50cnkodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUNvdW50cnkqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDMgKDB4MDMpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVEU1BhcmFtcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIGN1cnJfY2hhbm5lbDsKK30gdERvdDExZklFRFNQYXJhbXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9EU1BBUkFNUyAoIDMgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfRFNQQVJBTVNfTUlOX0xFTiAoIDEgKQorCisjZGVmaW5lIERPVDExRl9JRV9EU1BBUkFNU19NQVhfTEVOICggMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZURTUGFyYW1zKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVEU1BhcmFtcyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVEU1BhcmFtcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFRFNQYXJhbXMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFRFNQYXJhbXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRURTUGFyYW1zKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAxMiAoMHgwYykKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUVEQ0FQYXJhbVNldCB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHFvczsKKyAgICB0QU5JX1U4ICAgICAgcmVzZXJ2ZWQ7CisgICAgdEFOSV9VOCAgICAgICBhY2JlX2FpZnNuOiA0OworICAgIHRBTklfVTggICAgICAgICBhY2JlX2FjbTogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgYWNiZV9hY2k6IDI7CisgICAgdEFOSV9VOCAgICAgICAgICB1bnVzZWQxOiAxOworICAgIHRBTklfVTggICAgICBhY2JlX2Fjd21pbjogNDsKKyAgICB0QU5JX1U4ICAgICAgYWNiZV9hY3dtYXg6IDQ7CisgICAgdEFOSV9VMTYgICAgIGFjYmVfdHhvcGxpbWl0OworICAgIHRBTklfVTggICAgICAgYWNia19haWZzbjogNDsKKyAgICB0QU5JX1U4ICAgICAgICAgYWNia19hY206IDE7CisgICAgdEFOSV9VOCAgICAgICAgIGFjYmtfYWNpOiAyOworICAgIHRBTklfVTggICAgICAgICAgdW51c2VkMjogMTsKKyAgICB0QU5JX1U4ICAgICAgYWNia19hY3dtaW46IDQ7CisgICAgdEFOSV9VOCAgICAgIGFjYmtfYWN3bWF4OiA0OworICAgIHRBTklfVTE2ICAgICBhY2JrX3R4b3BsaW1pdDsKKyAgICB0QU5JX1U4ICAgICAgIGFjdmlfYWlmc246IDQ7CisgICAgdEFOSV9VOCAgICAgICAgIGFjdmlfYWNtOiAxOworICAgIHRBTklfVTggICAgICAgICBhY3ZpX2FjaTogMjsKKyAgICB0QU5JX1U4ICAgICAgICAgIHVudXNlZDM6IDE7CisgICAgdEFOSV9VOCAgICAgIGFjdmlfYWN3bWluOiA0OworICAgIHRBTklfVTggICAgICBhY3ZpX2Fjd21heDogNDsKKyAgICB0QU5JX1UxNiAgICAgYWN2aV90eG9wbGltaXQ7CisgICAgdEFOSV9VOCAgICAgICBhY3ZvX2FpZnNuOiA0OworICAgIHRBTklfVTggICAgICAgICBhY3ZvX2FjbTogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgYWN2b19hY2k6IDI7CisgICAgdEFOSV9VOCAgICAgICAgICB1bnVzZWQ0OiAxOworICAgIHRBTklfVTggICAgICBhY3ZvX2Fjd21pbjogNDsKKyAgICB0QU5JX1U4ICAgICAgYWN2b19hY3dtYXg6IDQ7CisgICAgdEFOSV9VMTYgICAgIGFjdm9fdHhvcGxpbWl0OworfSB0RG90MTFmSUVFRENBUGFyYW1TZXQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9FRENBUEFSQU1TRVQgKCAxMiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9FRENBUEFSQU1TRVRfTUlOX0xFTiAoIDE4ICkKKworI2RlZmluZSBET1QxMUZfSUVfRURDQVBBUkFNU0VUX01BWF9MRU4gKCAxOCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUVEQ0FQYXJhbVNldCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFRURDQVBhcmFtU2V0Kik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUVEQ0FQYXJhbVNldCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFRURDQVBhcmFtU2V0KiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUVEQ0FQYXJhbVNldCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFRURDQVBhcmFtU2V0KiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA0MiAoMHgyYSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUVSUEluZm8geworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggIG5vbl9lcnBfcHJlc2VudDogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgdXNlX3Byb3Q6IDE7CisgICAgdEFOSV9VOCAgYmFya2VyX3ByZWFtYmxlOiAxOworICAgIHRBTklfVTggICAgICAgICAgIHVudXNlZDogNTsKK30gdERvdDExZklFRVJQSW5mbzsKKworI2RlZmluZSBET1QxMUZfRUlEX0VSUElORk8gKCA0MiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9FUlBJTkZPX01JTl9MRU4gKCAxICkKKworI2RlZmluZSBET1QxMUZfSUVfRVJQSU5GT19NQVhfTEVOICggMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUVSUEluZm8odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRUVSUEluZm8qKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llRVJQSW5mbyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFRVJQSW5mbyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVFUlBJbmZvKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVFUlBJbmZvKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA2MiAoMHgzZSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUV4dENoYW5Td2l0Y2hBbm4geworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBzZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworfSB0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uOworCisjZGVmaW5lIERPVDExRl9FSURfRVhUQ0hBTlNXSVRDSEFOTiAoIDYyICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0VYVENIQU5TV0lUQ0hBTk5fTUlOX0xFTiAoIDEgKQorCisjZGVmaW5lIERPVDExRl9JRV9FWFRDSEFOU1dJVENIQU5OX01BWF9MRU4gKCAxICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llRXh0Q2hhblN3aXRjaEFubih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFRXh0Q2hhblN3aXRjaEFubiopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVFeHRDaGFuU3dpdGNoQW5uKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUV4dENoYW5Td2l0Y2hBbm4odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUV4dENoYW5Td2l0Y2hBbm4qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDUwICgweDMyKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFRXh0U3VwcFJhdGVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3JhdGVzOworICAgIHRBTklfVTggICAgICByYXRlc1sxMl07Cit9IHREb3QxMWZJRUV4dFN1cHBSYXRlczsKKworI2RlZmluZSBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUyAoIDUwICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX0VYVFNVUFBSQVRFU19NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0VYVFNVUFBSQVRFU19NQVhfTEVOICggMTIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVFeHRTdXBwUmF0ZXModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRUV4dFN1cHBSYXRlcyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVFeHRTdXBwUmF0ZXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUV4dFN1cHBSYXRlcyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVFeHRTdXBwUmF0ZXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUV4dFN1cHBSYXRlcyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMiAoMHgwMikKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUZIUGFyYW1TZXQgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICBkd2VsbF90aW1lOworICAgIHRBTklfVTggICAgICBob3Bfc2V0OworICAgIHRBTklfVTggICAgICBob3BfcGF0dGVybjsKKyAgICB0QU5JX1U4ICAgICAgaG9wX2luZGV4OworfSB0RG90MTFmSUVGSFBhcmFtU2V0OworCisjZGVmaW5lIERPVDExRl9FSURfRkhQQVJBTVNFVCAoIDIgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfRkhQQVJBTVNFVF9NSU5fTEVOICggNSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0ZIUEFSQU1TRVRfTUFYX0xFTiAoIDUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVGSFBhcmFtU2V0KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVGSFBhcmFtU2V0Kik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUZIUGFyYW1TZXQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUZIUGFyYW1TZXQqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFRkhQYXJhbVNldCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFRkhQYXJhbVNldCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgOCAoMHgwOCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUZIUGFyYW1zIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgcmFkaXg7CisgICAgdEFOSV9VOCAgICAgIG5jaGFubmVsczsKK30gdERvdDExZklFRkhQYXJhbXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9GSFBBUkFNUyAoIDggKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfRkhQQVJBTVNfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9JRV9GSFBBUkFNU19NQVhfTEVOICggMiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUZIUGFyYW1zKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVGSFBhcmFtcyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVGSFBhcmFtcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFRkhQYXJhbXMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFRkhQYXJhbXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUZIUGFyYW1zKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA5ICgweDA5KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFRkhQYXR0VGFibGUgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBmbGFnOworICAgIHRBTklfVTggICAgICBuc2V0czsKKyAgICB0QU5JX1U4ICAgICAgbW9kdWx1czsKKyAgICB0QU5JX1U4ICAgICAgb2Zmc2V0OworICAgIHRBTklfVTggICAgICBudW1fcmFuZHRhYmxlOworICAgIHRBTklfVTggICAgICByYW5kdGFibGVbMjUxXTsKK30gdERvdDExZklFRkhQYXR0VGFibGU7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9GSFBBVFRUQUJMRSAoIDkgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfRkhQQVRUVEFCTEVfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9GSFBBVFRUQUJMRV9NQVhfTEVOICggMjU1ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llRkhQYXR0VGFibGUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRUZIUGF0dFRhYmxlKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUZIUGF0dFRhYmxlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVGSFBhdHRUYWJsZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVGSFBhdHRUYWJsZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFRkhQYXR0VGFibGUqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDU1ICgweDM3KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFRlRJbmZvIHsKKyAgICB0QU5JX1U4ICAgICAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgcmVzZXJ2ZWQ6IDg7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgIElFQ291bnQ6IDg7CisgICAgdEFOSV9VOCAgICAgICAgICBNSUNbMTZdOworICAgIHRBTklfVTggICAgICAgICAgQW5vbmNlWzMyXTsKKyAgICB0QU5JX1U4ICAgICAgICAgIFNub25jZVszMl07CisgICAgdERvdDExZklFUjFLSF9JRCBSMUtIX0lEOworICAgIHREb3QxMWZJRUdUSyAgICAgR1RLOworICAgIHREb3QxMWZJRVIwS0hfSUQgUjBLSF9JRDsKK30gdERvdDExZklFRlRJbmZvOworCisjZGVmaW5lIERPVDExRl9FSURfRlRJTkZPICggNTUgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfRlRJTkZPX01JTl9MRU4gKCA4MiApCisKKyNkZWZpbmUgRE9UMTFGX0lFX0ZUSU5GT19NQVhfTEVOICggMTg1ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llRlRJbmZvKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVGVEluZm8qKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llRlRJbmZvKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVGVEluZm8qLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFRlRJbmZvKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVGVEluZm8qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDU2ICgweDM4KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFRlRUaW1lb3V0SW50ZXJ2YWwgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICB0aW1lb3V0VHlwZTsKKyAgICB0QU5JX1UzMiAgICAgdGltZW91dFZhbHVlOworfSB0RG90MTFmSUVGVFRpbWVvdXRJbnRlcnZhbDsKKworI2RlZmluZSBET1QxMUZfRUlEX0ZUVElNRU9VVElOVEVSVkFMICggNTYgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfRlRUSU1FT1VUSU5URVJWQUxfTUlOX0xFTiAoIDUgKQorCisjZGVmaW5lIERPVDExRl9JRV9GVFRJTUVPVVRJTlRFUlZBTF9NQVhfTEVOICggNSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUZUVGltZW91dEludGVydmFsKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVGVFRpbWVvdXRJbnRlcnZhbCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVGVFRpbWVvdXRJbnRlcnZhbCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFRlRUaW1lb3V0SW50ZXJ2YWwqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFRlRUaW1lb3V0SW50ZXJ2YWwodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRUZUVGltZW91dEludGVydmFsKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA0NSAoMHgyZCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUhUQ2FwcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgIGFkdkNvZGluZ0NhcDogMTsKKyAgICB0QU5JX1UxNiBzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ6IDE7CisgICAgdEFOSV9VMTYgICAgbWltb1Bvd2VyU2F2ZTogMjsKKyAgICB0QU5JX1UxNiAgICAgICBncmVlbkZpZWxkOiAxOworICAgIHRBTklfVTE2ICAgICBzaG9ydEdJMjBNSHo6IDE7CisgICAgdEFOSV9VMTYgICAgIHNob3J0R0k0ME1IejogMTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgdHhTVEJDOiAxOworICAgIHRBTklfVTE2ICAgICAgICAgICByeFNUQkM6IDI7CisgICAgdEFOSV9VMTYgICAgICAgIGRlbGF5ZWRCQTogMTsKKyAgICB0QU5JX1UxNiBtYXhpbWFsQU1TRFVzaXplOiAxOworICAgIHRBTklfVTE2IGRzc3NDY2tNb2RlNDBNSHo6IDE7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgcHNtcDogMTsKKyAgICB0QU5JX1UxNiBzdGJjQ29udHJvbEZyYW1lOiAxOworICAgIHRBTklfVTE2IGxzaWdUWE9QUHJvdGVjdGlvbjogMTsKKyAgICB0QU5JX1U4IG1heFJ4QU1QRFVGYWN0b3I6IDI7CisgICAgdEFOSV9VOCAgICAgIG1wZHVEZW5zaXR5OiAzOworICAgIHRBTklfVTggICAgICAgIHJlc2VydmVkMTogMzsKKyAgICB0QU5JX1U4ICAgICAgc3VwcG9ydGVkTUNTU2V0WzE2XTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgcGNvOiAxOworICAgIHRBTklfVTE2ICAgdHJhbnNpdGlvblRpbWU6IDI7CisgICAgdEFOSV9VMTYgICAgICAgIHJlc2VydmVkMjogNTsKKyAgICB0QU5JX1UxNiAgICAgIG1jc0ZlZWRiYWNrOiAyOworICAgIHRBTklfVTE2ICAgICAgICByZXNlcnZlZDM6IDY7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgdHhCRjogMTsKKyAgICB0QU5JX1UzMiByeFN0YWdnZXJlZFNvdW5kaW5nOiAxOworICAgIHRBTklfVTMyIHR4U3RhZ2dlcmVkU291bmRpbmc6IDE7CisgICAgdEFOSV9VMzIgICAgICAgICAgICByeFpMRjogMTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIHR4WkxGOiAxOworICAgIHRBTklfVTMyICAgICBpbXBsaWNpdFR4QkY6IDE7CisgICAgdEFOSV9VMzIgICAgICBjYWxpYnJhdGlvbjogMjsKKyAgICB0QU5JX1UzMiAgZXhwbGljaXRDU0lUeEJGOiAxOworICAgIHRBTklfVTMyIGV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXg6IDE7CisgICAgdEFOSV9VMzIgZXhwbGljaXRCRkNTSUZlZWRiYWNrOiAzOworICAgIHRBTklfVTMyIGV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjazogMzsKKyAgICB0QU5JX1UzMiBleHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrOiAzOworICAgIHRBTklfVTMyIGNzaU51bUJGQW50ZW5uYWU6IDI7CisgICAgdEFOSV9VMzIgdW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlOiAyOworICAgIHRBTklfVTMyIGNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU6IDI7CisgICAgdEFOSV9VMzIgICAgICAgIHJlc2VydmVkNDogNzsKKyAgICB0QU5JX1U4IGFudGVubmFTZWxlY3Rpb246IDE7CisgICAgdEFOSV9VOCBleHBsaWNpdENTSUZlZWRiYWNrVHg6IDE7CisgICAgdEFOSV9VOCBhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHg6IDE7CisgICAgdEFOSV9VOCBleHBsaWNpdENTSUZlZWRiYWNrOiAxOworICAgIHRBTklfVTggYW50ZW5uYUluZGljZXNGZWVkYmFjazogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHJ4QVM6IDE7CisgICAgdEFOSV9VOCAgdHhTb3VuZGluZ1BQRFVzOiAxOworICAgIHRBTklfVTggICAgICAgIHJlc2VydmVkNTogMTsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3JzdmQ7CisgICAgdEFOSV9VOCAgICAgIHJzdmRbMzJdOworfSB0RG90MTFmSUVIVENhcHM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9IVENBUFMgKCA0NSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9IVENBUFNfTUlOX0xFTiAoIDI2ICkKKworI2RlZmluZSBET1QxMUZfSUVfSFRDQVBTX01BWF9MRU4gKCA1OCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUhUQ2Fwcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFSFRDYXBzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUhUQ2Fwcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFSFRDYXBzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUhUQ2Fwcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFSFRDYXBzKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA2MSAoMHgzZCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRUhUSW5mbyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHByaW1hcnlDaGFubmVsOworICAgIHRBTklfVTggc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDogMjsKKyAgICB0QU5JX1U4IHJlY29tbWVuZGVkVHhXaWR0aFNldDogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgcmlmc01vZGU6IDE7CisgICAgdEFOSV9VOCBjb250cm9sbGVkQWNjZXNzT25seTogMTsKKyAgICB0QU5JX1U4IHNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5OiAzOworICAgIHRBTklfVTE2ICAgICAgICAgICBvcE1vZGU6IDI7CisgICAgdEFOSV9VMTYgbm9uR0ZEZXZpY2VzUHJlc2VudDogMTsKKyAgICB0QU5JX1UxNiB0cmFuc21pdEJ1cnN0TGltaXQ6IDE7CisgICAgdEFOSV9VMTYgb2Jzc05vbkhUU3RhUHJlc2VudDogMTsKKyAgICB0QU5JX1UxNiAgICAgICAgIHJlc2VydmVkOiAxMTsKKyAgICB0QU5JX1UxNiAgICAgYmFzaWNTVEJDTUNTOiA3OworICAgIHRBTklfVTE2IGR1YWxDVFNQcm90ZWN0aW9uOiAxOworICAgIHRBTklfVTE2ICBzZWNvbmRhcnlCZWFjb246IDE7CisgICAgdEFOSV9VMTYgbHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ6IDE7CisgICAgdEFOSV9VMTYgICAgICAgIHBjb0FjdGl2ZTogMTsKKyAgICB0QU5JX1UxNiAgICAgICAgIHBjb1BoYXNlOiAxOworICAgIHRBTklfVTE2ICAgICAgICByZXNlcnZlZDI6IDQ7CisgICAgdEFOSV9VOCAgICAgIGJhc2ljTUNTU2V0WzE2XTsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3JzdmQ7CisgICAgdEFOSV9VOCAgICAgIHJzdmRbMzJdOworfSB0RG90MTFmSUVIVEluZm87CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9IVElORk8gKCA2MSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9IVElORk9fTUlOX0xFTiAoIDIyICkKKworI2RlZmluZSBET1QxMUZfSUVfSFRJTkZPX01BWF9MRU4gKCA1NCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUhUSW5mbyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFSFRJbmZvKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUhUSW5mbyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFSFRJbmZvKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUhUSW5mbyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFSFRJbmZvKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA2ICgweDA2KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFSUJTU1BhcmFtcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgIGF0aW07Cit9IHREb3QxMWZJRUlCU1NQYXJhbXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9JQlNTUEFSQU1TICggNiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9JQlNTUEFSQU1TX01JTl9MRU4gKCAyICkKKworI2RlZmluZSBET1QxMUZfSUVfSUJTU1BBUkFNU19NQVhfTEVOICggMiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUlCU1NQYXJhbXModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRUlCU1NQYXJhbXMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llSUJTU1BhcmFtcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFSUJTU1BhcmFtcyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVJQlNTUGFyYW1zKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVJQlNTUGFyYW1zKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAzOSAoMHgyNykKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0IHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgdG9rZW47CisgICAgdEFOSV9VOCAgICAgICAgICAgICBsYXRlOiAxOworICAgIHRBTklfVTggICAgICAgIGluY2FwYWJsZTogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgIHJlZnVzZWQ6IDE7CisgICAgdEFOSV9VOCAgICAgICAgICAgdW51c2VkOiA1OworICAgIHRBTklfVTggICAgICB0eXBlOworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdEFOSV9VOCBjaGFubmVsOworICAgICAgICAgICAgdERPVDExRl9VNjQgbWVhc19zdGFydF90aW1lOworICAgICAgICAgICAgdEFOSV9VMTYgbWVhc19kdXJhdGlvbjsKKyAgICAgICAgICAgIHRBTklfVTggICAgICAgICAgICBic3M6IDE7CisgICAgICAgICAgICB0QU5JX1U4ICBvZmRtX3ByZWFtYmxlOiAxOworICAgICAgICAgICAgdEFOSV9VOCAgICB1bmlkX3NpZ25hbDogMTsKKyAgICAgICAgICAgIHRBTklfVTggICAgICAgICAgcmFkZXI6IDE7CisgICAgICAgICAgICB0QU5JX1U4ICAgICB1bm1lYXN1cmVkOiAxOworICAgICAgICAgICAgdEFOSV9VOCAgICAgICAgIHVudXNlZDogMzsKKyAgICAgICAgfSBCYXNpYzsgLyogdHlwZSA9IDAgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTggY2hhbm5lbDsKKyAgICAgICAgICAgIHRET1QxMUZfVTY0IG1lYXNfc3RhcnRfdGltZTsKKyAgICAgICAgICAgIHRBTklfVTE2IG1lYXNfZHVyYXRpb247CisgICAgICAgICAgICB0QU5JX1U4IGNjYV9idXN5X2ZyYWN0aW9uOworICAgICAgICB9IENDQTsgLyogdHlwZSA9IDEgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTggY2hhbm5lbDsKKyAgICAgICAgICAgIHRET1QxMUZfVTY0IG1lYXNfc3RhcnRfdGltZTsKKyAgICAgICAgICAgIHRBTklfVTE2IG1lYXNfZHVyYXRpb247CisgICAgICAgICAgICB0QU5JX1U4IHJwaTBfZGVuc2l0eTsKKyAgICAgICAgICAgIHRBTklfVTggcnBpMV9kZW5zaXR5OworICAgICAgICAgICAgdEFOSV9VOCBycGkyX2RlbnNpdHk7CisgICAgICAgICAgICB0QU5JX1U4IHJwaTNfZGVuc2l0eTsKKyAgICAgICAgICAgIHRBTklfVTggcnBpNF9kZW5zaXR5OworICAgICAgICAgICAgdEFOSV9VOCBycGk1X2RlbnNpdHk7CisgICAgICAgICAgICB0QU5JX1U4IHJwaTZfZGVuc2l0eTsKKyAgICAgICAgICAgIHRBTklfVTggcnBpN19kZW5zaXR5OworICAgICAgICB9IFJQSUhpc3RvZ3JhbTsgLyogdHlwZSA9IDIgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTggcmVnQ2xhc3M7CisgICAgICAgICAgICB0QU5JX1U4IGNoYW5uZWw7CisgICAgICAgICAgICB0RE9UMTFGX1U2NCBtZWFzX3N0YXJ0X3RpbWU7CisgICAgICAgICAgICB0QU5JX1UxNiBtZWFzX2R1cmF0aW9uOworICAgICAgICAgICAgdEFOSV9VOCAgICAgICAgY29uZGVuc2VkX1BIWTogNzsKKyAgICAgICAgICAgIHRBTklfVTggIHJlcG9ydGVkX2ZyYW1lX3R5cGU6IDE7CisgICAgICAgICAgICB0QU5JX1U4IFJDUEk7CisgICAgICAgICAgICB0QU5JX1U4IFJTTkk7CisgICAgICAgICAgICB0QU5JX1U4IEJTU0lEWzZdOworICAgICAgICAgICAgdEFOSV9VOCBhbnRlbm5hX2lkOworICAgICAgICAgICAgdEFOSV9VMzIgcGFyZW50X1RTRjsKKyAgICB0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5IEJlYWNvblJlcG9ydEZybUJvZHk7CisgICAgICAgIH0gQmVhY29uOyAvKiB0eXBlID0gNSAqLworICAgIH0gcmVwb3J0OworfSB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydDsKKworI2RlZmluZSBET1QxMUZfRUlEX01FQVNVUkVNRU5UUkVQT1JUICggMzkgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfTUVBU1VSRU1FTlRSRVBPUlRfTUlOX0xFTiAoIDMgKQorCisjZGVmaW5lIERPVDExRl9JRV9NRUFTVVJFTUVOVFJFUE9SVF9NQVhfTEVOICggMjkgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVNZWFzdXJlbWVudFJlcG9ydCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llTWVhc3VyZW1lbnRSZXBvcnQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0KiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRU1lYXN1cmVtZW50UmVwb3J0KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMzggKDB4MjYpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBtZWFzdXJlbWVudF90b2tlbjsKKyAgICB0QU5JX1U4ICAgICAgICAgcGFyYWxsZWw6IDE7CisgICAgdEFOSV9VOCAgICAgICAgICAgZW5hYmxlOiAxOworICAgIHRBTklfVTggICAgICAgICAgcmVxdWVzdDogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgICByZXBvcnQ6IDE7CisgICAgdEFOSV9VOCBkdXJhdGlvbk1hbmRhdG9yeTogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgICB1bnVzZWQ6IDM7CisgICAgdEFOSV9VOCAgICAgIG1lYXN1cmVtZW50X3R5cGU7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB0QU5JX1U4IGNoYW5uZWxfbm87CisgICAgICAgICAgICB0QU5JX1U4IG1lYXNfc3RhcnRfdGltZVs4XTsKKyAgICAgICAgICAgIHRBTklfVTE2IG1lYXNfZHVyYXRpb247CisgICAgICAgIH0gQmFzaWM7IC8qIG1lYXN1cmVtZW50X3R5cGUgPSAwICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB0QU5JX1U4IGNoYW5uZWxfbm87CisgICAgICAgICAgICB0QU5JX1U4IG1lYXNfc3RhcnRfdGltZVs4XTsKKyAgICAgICAgICAgIHRBTklfVTE2IG1lYXNfZHVyYXRpb247CisgICAgICAgIH0gQ0NBOyAvKiBtZWFzdXJlbWVudF90eXBlID0gMSAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdEFOSV9VOCBjaGFubmVsX25vOworICAgICAgICAgICAgdEFOSV9VOCBtZWFzX3N0YXJ0X3RpbWVbOF07CisgICAgICAgICAgICB0QU5JX1UxNiBtZWFzX2R1cmF0aW9uOworICAgICAgICB9IFJQSUhpc3RvZ3JhbTsgLyogbWVhc3VyZW1lbnRfdHlwZSA9IDIgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTggcmVnQ2xhc3M7CisgICAgICAgICAgICB0QU5JX1U4IGNoYW5uZWw7CisgICAgICAgICAgICB0QU5JX1UxNiByYW5kb21pemF0aW9uOworICAgICAgICAgICAgdEFOSV9VMTYgbWVhc19kdXJhdGlvbjsKKyAgICAgICAgICAgIHRBTklfVTggbWVhc19tb2RlOworICAgICAgICAgICAgdEFOSV9VOCBCU1NJRFs2XTsKKyAgICB0RG90MTFmSUVTU0lEIFNTSUQ7CisgICAgdERvdDExZklFQmVhY29uUmVwb3J0aW5nIEJlYWNvblJlcG9ydGluZzsKKyAgICB0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWwgQmNuUmVwb3J0aW5nRGV0YWlsOworICAgIHREb3QxMWZJRVJlcXVlc3RlZEluZm8gUmVxdWVzdGVkSW5mbzsKKyAgICB0QU5JX1UxNiBudW1fQVBDaGFubmVsUmVwb3J0OworICAgIHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCBBUENoYW5uZWxSZXBvcnRbMl07CisgICAgICAgIH0gQmVhY29uOyAvKiBtZWFzdXJlbWVudF90eXBlID0gNSAqLworICAgIH0gbWVhc3VyZW1lbnRfcmVxdWVzdDsKK30gdERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0OworCisjZGVmaW5lIERPVDExRl9FSURfTUVBU1VSRU1FTlRSRVFVRVNUICggMzggKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfTUVBU1VSRU1FTlRSRVFVRVNUX01JTl9MRU4gKCAxNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX01FQVNVUkVNRU5UUkVRVUVTVF9NQVhfTEVOICggMTYgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVNZWFzdXJlbWVudFJlcXVlc3QodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVNZWFzdXJlbWVudFJlcXVlc3QodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVNZWFzdXJlbWVudFJlcXVlc3QodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgNTQgKDB4MzYpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVNb2JpbGl0eURvbWFpbiB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgIE1ESUQ7CisgICAgdEFOSV9VOCAgICAgICAgb3ZlckRTQ2FwOiAxOworICAgIHRBTklfVTggICByZXNvdXJjZVJlcUNhcDogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgcmVzZXJ2ZWQ6IDY7Cit9IHREb3QxMWZJRU1vYmlsaXR5RG9tYWluOworCisjZGVmaW5lIERPVDExRl9FSURfTU9CSUxJVFlET01BSU4gKCA1NCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9NT0JJTElUWURPTUFJTl9NSU5fTEVOICggMyApCisKKyNkZWZpbmUgRE9UMTFGX0lFX01PQklMSVRZRE9NQUlOX01BWF9MRU4gKCAzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llTW9iaWxpdHlEb21haW4odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZU1vYmlsaXR5RG9tYWluKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVNb2JpbGl0eURvbWFpbiosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVNb2JpbGl0eURvbWFpbih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFTW9iaWxpdHlEb21haW4qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDUyICgweDM0KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFTmVpZ2hib3JSZXBvcnQgeworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgIGJzc2lkWzZdOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgQVBSZWFjaGFiaWxpdHk6IDI7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eTogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICAgIEtleVNjb3BlOiAxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgU3BlY01nbXRDYXA6IDE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFFvc0NhcDogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHNkOiAxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycm06IDE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5ZWRCQTogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbUJBOiAxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgTW9iaWxpdHlEb21haW46IDE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDogNTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRvcnlDbGFzczsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICBQaHlUeXBlOworICAgIHREb3QxMWZJRVRTRkluZm8gICAgICAgICAgICAgVFNGSW5mbzsKKyAgICB0RG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyIENvbmRlbnNlZENvdW50cnlTdHI7CisgICAgdERvdDExZklFTWVhc3VyZW1lbnRQaWxvdCAgICBNZWFzdXJlbWVudFBpbG90OworICAgIHREb3QxMWZJRVJSTUVuYWJsZWRDYXAgICAgICAgUlJNRW5hYmxlZENhcDsKKyAgICB0RG90MTFmSUVNdWx0aUJzc2lkICAgICAgICAgIE11bHRpQnNzaWQ7Cit9IHREb3QxMWZJRU5laWdoYm9yUmVwb3J0OworCisjZGVmaW5lIERPVDExRl9FSURfTkVJR0hCT1JSRVBPUlQgKCA1MiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9ORUlHSEJPUlJFUE9SVF9NSU5fTEVOICggMTMgKQorCisjZGVmaW5lIERPVDExRl9JRV9ORUlHSEJPUlJFUE9SVF9NQVhfTEVOICggNTQ2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llTmVpZ2hib3JSZXBvcnQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRU5laWdoYm9yUmVwb3J0Kik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZU5laWdoYm9yUmVwb3J0KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVOZWlnaGJvclJlcG9ydCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVOZWlnaGJvclJlcG9ydCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFTmVpZ2hib3JSZXBvcnQqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDUwLCAweDZmLCAweDlhLCAweDA5fSAoTXVsdGktSUUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQMlBBc3NvY1JlcSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdERvdDExZlRMVlAyUENhcGFiaWxpdHkgUDJQQ2FwYWJpbGl0eTsKKyAgICB0RG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmcgRXh0ZW5kZWRMaXN0ZW5UaW1pbmc7CisgICAgdERvdDExZlRMVlAyUERldmljZUluZm8gUDJQRGV2aWNlSW5mbzsKK30gdERvdDExZklFUDJQQXNzb2NSZXE7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBBU1NPQ1JFUSAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9QMlBBU1NPQ1JFUV9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUEFTU09DUkVRX01BWF9MRU4gKCA3MSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUEFzc29jUmVxKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVQMlBBc3NvY1JlcSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBBc3NvY1JlcSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQQXNzb2NSZXEqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQQXNzb2NSZXEodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUEFzc29jUmVxKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQQXNzb2NSZXMgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHREb3QxMWZUTFZQMlBTdGF0dXMgUDJQU3RhdHVzOworICAgIHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZyBFeHRlbmRlZExpc3RlblRpbWluZzsKK30gdERvdDExZklFUDJQQXNzb2NSZXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBBU1NPQ1JFUyAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9QMlBBU1NPQ1JFU19NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUEFTU09DUkVTX01BWF9MRU4gKCAxNSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUEFzc29jUmVzKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVQMlBBc3NvY1JlcyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBBc3NvY1Jlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQQXNzb2NSZXMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQQXNzb2NSZXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUEFzc29jUmVzKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQQmVhY29uIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSBQMlBDYXBhYmlsaXR5OworICAgIHREb3QxMWZUTFZQMlBEZXZpY2VJZCBQMlBEZXZpY2VJZDsKKyAgICB0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlIE5vdGljZU9mQWJzZW5jZTsKK30gdERvdDExZklFUDJQQmVhY29uOworCisjZGVmaW5lIERPVDExRl9FSURfUDJQQkVBQ09OICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUEJFQUNPTl9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUEJFQUNPTl9NQVhfTEVOICggNTkgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBCZWFjb24odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVAyUEJlYWNvbiopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBCZWFjb24odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUEJlYWNvbiosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBCZWFjb24odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUEJlYWNvbiosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4NTAsIDB4NmYsIDB4OWEsIDB4MDl9IChNdWx0aS1JRSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSBQMlBDYXBhYmlsaXR5OworICAgIHREb3QxMWZUTFZQMlBEZXZpY2VJZCBQMlBEZXZpY2VJZDsKKyAgICB0RG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmcgRXh0ZW5kZWRMaXN0ZW5UaW1pbmc7CisgICAgdERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSBOb3RpY2VPZkFic2VuY2U7CisgICAgdERvdDExZlRMVlAyUERldmljZUluZm8gUDJQRGV2aWNlSW5mbzsKKyAgICB0RG90MTFmVExWUDJQR3JvdXBJbmZvIFAyUEdyb3VwSW5mbzsKK30gdERvdDExZklFUDJQQmVhY29uUHJvYmVSZXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBCRUFDT05QUk9CRVJFUyAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9QMlBCRUFDT05QUk9CRVJFU19NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUEJFQUNPTlBST0JFUkVTX01BWF9MRU4gKCAxMTQ4ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQQmVhY29uUHJvYmVSZXModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUEJlYWNvblByb2JlUmVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBCZWFjb25Qcm9iZVJlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQQmVhY29uUHJvYmVSZXMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDUwLCAweDZmLCAweDlhLCAweDA5fSAoTXVsdGktSUUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQMlBEZUF1dGggeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHREb3QxMWZUTFZNaW5vclJlYXNvbkNvZGUgTWlub3JSZWFzb25Db2RlOworfSB0RG90MTFmSUVQMlBEZUF1dGg7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBERUFVVEggKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUDJQREVBVVRIX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfSUVfUDJQREVBVVRIX01BWF9MRU4gKCA4ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQRGVBdXRoKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVQMlBEZUF1dGgqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQRGVBdXRoKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBEZUF1dGgqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQRGVBdXRoKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBEZUF1dGgqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDUwLCAweDZmLCAweDlhLCAweDA5fSAoTXVsdGktSUUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHREb3QxMWZUTFZQMlBEZXZpY2VJZCBQMlBEZXZpY2VJZDsKKyAgICB0RG90MTFmVExWUDJQR3JvdXBJZCBQMlBHcm91cElkOworfSB0RG90MTFmSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXE7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUDJQREVWSUNFRElTQ09WRVJBQklMSVRZUkVRX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfSUVfUDJQREVWSUNFRElTQ09WRVJBQklMSVRZUkVRX01BWF9MRU4gKCA1NCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWUDJQU3RhdHVzIFAyUFN0YXR1czsKK30gdERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzOworCisjZGVmaW5lIERPVDExRl9FSURfUDJQREVWSUNFRElTQ09WRVJBQklMSVRZUkVTICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUERFVklDRURJU0NPVkVSQUJJTElUWVJFU19NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUERFVklDRURJU0NPVkVSQUJJTElUWVJFU19NQVhfTEVOICggOCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQRGlzQXNzb2MgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHREb3QxMWZUTFZNaW5vclJlYXNvbkNvZGUgTWlub3JSZWFzb25Db2RlOworfSB0RG90MTFmSUVQMlBEaXNBc3NvYzsKKworI2RlZmluZSBET1QxMUZfRUlEX1AyUERJU0FTU09DICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUERJU0FTU09DX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfSUVfUDJQRElTQVNTT0NfTUFYX0xFTiAoIDggKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBEaXNBc3NvYyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQRGlzQXNzb2MqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQRGlzQXNzb2ModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUERpc0Fzc29jKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUERpc0Fzc29jKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBEaXNBc3NvYyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4NTAsIDB4NmYsIDB4OWEsIDB4MDl9IChNdWx0aS1JRSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVAyUEdPTmVnQ25mIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWUDJQU3RhdHVzIFAyUFN0YXR1czsKKyAgICB0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSBQMlBDYXBhYmlsaXR5OworICAgIHREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsIE9wZXJhdGluZ0NoYW5uZWw7CisgICAgdERvdDExZlRMVkNoYW5uZWxMaXN0IENoYW5uZWxMaXN0OworICAgIHREb3QxMWZUTFZQMlBHcm91cElkIFAyUEdyb3VwSWQ7Cit9IHREb3QxMWZJRVAyUEdPTmVnQ25mOworCisjZGVmaW5lIERPVDExRl9FSURfUDJQR09ORUdDTkYgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUDJQR09ORUdDTkZfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBHT05FR0NORl9NQVhfTEVOICggMzE5ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQR09OZWdDbmYodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVAyUEdPTmVnQ25mKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUEdPTmVnQ25mKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBHT05lZ0NuZiosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBHT05lZ0NuZih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQR09OZWdDbmYqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDUwLCAweDZmLCAweDlhLCAweDA5fSAoTXVsdGktSUUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQMlBHT05lZ1JlcSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdERvdDExZlRMVlAyUENhcGFiaWxpdHkgUDJQQ2FwYWJpbGl0eTsKKyAgICB0RG90MTFmVExWR09JbnRlbnQgR09JbnRlbnQ7CisgICAgdERvdDExZlRMVkNvbmZpZ3VyYXRpb25UaW1lb3V0IENvbmZpZ3VyYXRpb25UaW1lb3V0OworICAgIHREb3QxMWZUTFZMaXN0ZW5DaGFubmVsIExpc3RlbkNoYW5uZWw7CisgICAgdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nIEV4dGVuZGVkTGlzdGVuVGltaW5nOworICAgIHREb3QxMWZUTFZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MgSW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzOworICAgIHREb3QxMWZUTFZDaGFubmVsTGlzdCBDaGFubmVsTGlzdDsKKyAgICB0RG90MTFmVExWUDJQRGV2aWNlSW5mbyBQMlBEZXZpY2VJbmZvOworICAgIHREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsIE9wZXJhdGluZ0NoYW5uZWw7Cit9IHREb3QxMWZJRVAyUEdPTmVnUmVxOworCisjZGVmaW5lIERPVDExRl9FSURfUDJQR09ORUdSRVEgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUDJQR09ORUdSRVFfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBHT05FR1JFUV9NQVhfTEVOICggMzYyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQR09OZWdSZXEodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVAyUEdPTmVnUmVxKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUEdPTmVnUmVxKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBHT05lZ1JlcSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBHT05lZ1JlcSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQR09OZWdSZXEqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDUwLCAweDZmLCAweDlhLCAweDA5fSAoTXVsdGktSUUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQMlBHT05lZ1JlcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdERvdDExZlRMVlAyUFN0YXR1cyBQMlBTdGF0dXM7CisgICAgdERvdDExZlRMVlAyUENhcGFiaWxpdHkgUDJQQ2FwYWJpbGl0eTsKKyAgICB0RG90MTFmVExWR09JbnRlbnQgR09JbnRlbnQ7CisgICAgdERvdDExZlRMVkNvbmZpZ3VyYXRpb25UaW1lb3V0IENvbmZpZ3VyYXRpb25UaW1lb3V0OworICAgIHREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsIE9wZXJhdGluZ0NoYW5uZWw7CisgICAgdERvdDExZlRMVkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcyBJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3M7CisgICAgdERvdDExZlRMVkNoYW5uZWxMaXN0IENoYW5uZWxMaXN0OworICAgIHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvIFAyUERldmljZUluZm87CisgICAgdERvdDExZlRMVlAyUEdyb3VwSWQgUDJQR3JvdXBJZDsKK30gdERvdDExZklFUDJQR09OZWdSZXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBHT05FR1JFUyAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9QMlBHT05FR1JFU19NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUEdPTkVHUkVTX01BWF9MRU4gKCAzOTIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBHT05lZ1Jlcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQR09OZWdSZXMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQR09OZWdSZXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUEdPTmVnUmVzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUEdPTmVnUmVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBHT05lZ1JlcyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9IChNdWx0aS1JRSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVAyUEdPTmVnV1BTIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWVmVyc2lvbiBWZXJzaW9uOworICAgIHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElEIERldmljZVBhc3N3b3JkSUQ7Cit9IHREb3QxMWZJRVAyUEdPTmVnV1BTOworCisjZGVmaW5lIERPVDExRl9FSURfUDJQR09ORUdXUFMgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUDJQR09ORUdXUFNfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBHT05FR1dQU19NQVhfTEVOICggMTUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBHT05lZ1dQUyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQR09OZWdXUFMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQR09OZWdXUFModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUEdPTmVnV1BTKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUEdPTmVnV1BTKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBHT05lZ1dQUyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4NTAsIDB4NmYsIDB4OWEsIDB4MDl9Cit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQMlBJRU9wYXF1ZSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIG51bV9kYXRhOworICAgIHRBTklfVTggICAgICBkYXRhWzI0OV07Cit9IHREb3QxMWZJRVAyUElFT3BhcXVlOworCisjZGVmaW5lIERPVDExRl9FSURfUDJQSUVPUEFRVUUgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUDJQSUVPUEFRVUVfTUlOX0xFTiAoIDYgKQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBJRU9QQVFVRV9NQVhfTEVOICggMjUzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQSUVPcGFxdWUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVAyUElFT3BhcXVlKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUElFT3BhcXVlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBJRU9wYXF1ZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBJRU9wYXF1ZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQSUVPcGFxdWUqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDUwLCAweDZmLCAweDlhLCAweDA5fSAoTXVsdGktSUUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQMlBJbnZpdGF0aW9uUmVxIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWQ29uZmlndXJhdGlvblRpbWVvdXQgQ29uZmlndXJhdGlvblRpbWVvdXQ7CisgICAgdERvdDExZlRMVkludml0YXRpb25GbGFncyBJbnZpdGF0aW9uRmxhZ3M7CisgICAgdERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwgT3BlcmF0aW5nQ2hhbm5lbDsKKyAgICB0RG90MTFmVExWUDJQR3JvdXBCc3NpZCBQMlBHcm91cEJzc2lkOworICAgIHREb3QxMWZUTFZDaGFubmVsTGlzdCBDaGFubmVsTGlzdDsKKyAgICB0RG90MTFmVExWUDJQR3JvdXBJZCBQMlBHcm91cElkOworICAgIHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvIFAyUERldmljZUluZm87Cit9IHREb3QxMWZJRVAyUEludml0YXRpb25SZXE7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBJTlZJVEFUSU9OUkVRICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUElOVklUQVRJT05SRVFfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBJTlZJVEFUSU9OUkVRX01BWF9MRU4gKCAzODMgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBJbnZpdGF0aW9uUmVxKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVxKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUEludml0YXRpb25SZXEodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUEludml0YXRpb25SZXEqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQSW52aXRhdGlvblJlcSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQSW52aXRhdGlvblJlcSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4NTAsIDB4NmYsIDB4OWEsIDB4MDl9IChNdWx0aS1JRSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVAyUEludml0YXRpb25SZXMgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHREb3QxMWZUTFZQMlBTdGF0dXMgUDJQU3RhdHVzOworICAgIHREb3QxMWZUTFZDb25maWd1cmF0aW9uVGltZW91dCBDb25maWd1cmF0aW9uVGltZW91dDsKKyAgICB0RG90MTFmVExWT3BlcmF0aW5nQ2hhbm5lbCBPcGVyYXRpbmdDaGFubmVsOworICAgIHREb3QxMWZUTFZQMlBHcm91cEJzc2lkIFAyUEdyb3VwQnNzaWQ7CisgICAgdERvdDExZlRMVkNoYW5uZWxMaXN0IENoYW5uZWxMaXN0OworfSB0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVzOworCisjZGVmaW5lIERPVDExRl9FSURfUDJQSU5WSVRBVElPTlJFUyAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9QMlBJTlZJVEFUSU9OUkVTX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfSUVfUDJQSU5WSVRBVElPTlJFU19NQVhfTEVOICggMjg3ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQSW52aXRhdGlvblJlcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQSW52aXRhdGlvblJlcyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBJbnZpdGF0aW9uUmVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUEludml0YXRpb25SZXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUEludml0YXRpb25SZXMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDUwLCAweDZmLCAweDlhLCAweDA5fSAoTXVsdGktSUUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVQMlBOb3RpY2VPZkFic2VuY2UgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHREb3QxMWZUTFZOb3RpY2VPZkFic2VuY2UgTm90aWNlT2ZBYnNlbmNlOworfSB0RG90MTFmSUVQMlBOb3RpY2VPZkFic2VuY2U7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBOT1RJQ0VPRkFCU0VOQ0UgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUDJQTk9USUNFT0ZBQlNFTkNFX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfSUVfUDJQTk9USUNFT0ZBQlNFTkNFX01BWF9MRU4gKCA0NSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUE5vdGljZU9mQWJzZW5jZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQTm90aWNlT2ZBYnNlbmNlKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUE5vdGljZU9mQWJzZW5jZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQTm90aWNlT2ZBYnNlbmNlKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUE5vdGljZU9mQWJzZW5jZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQTm90aWNlT2ZBYnNlbmNlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQUHJlc2VuY2VSZXNwb25zZSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdERvdDExZlRMVlAyUFN0YXR1cyBQMlBTdGF0dXM7CisgICAgdERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSBOb3RpY2VPZkFic2VuY2U7Cit9IHREb3QxMWZJRVAyUFByZXNlbmNlUmVzcG9uc2U7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBQUkVTRU5DRVJFU1BPTlNFICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUFBSRVNFTkNFUkVTUE9OU0VfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBQUkVTRU5DRVJFU1BPTlNFX01BWF9MRU4gKCA0OSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUFByZXNlbmNlUmVzcG9uc2UodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVAyUFByZXNlbmNlUmVzcG9uc2UqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQUHJlc2VuY2VSZXNwb25zZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQUHJlc2VuY2VSZXNwb25zZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBQcmVzZW5jZVJlc3BvbnNlKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBQcmVzZW5jZVJlc3BvbnNlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHg1MCwgMHg2ZiwgMHg5YSwgMHgwOX0gKE11bHRpLUlFKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQUHJvYmVSZXEgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5IFAyUENhcGFiaWxpdHk7CisgICAgdERvdDExZlRMVlAyUERldmljZUlkIFAyUERldmljZUlkOworICAgIHREb3QxMWZUTFZMaXN0ZW5DaGFubmVsIExpc3RlbkNoYW5uZWw7CisgICAgdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nIEV4dGVuZGVkTGlzdGVuVGltaW5nOworICAgIHREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsIE9wZXJhdGluZ0NoYW5uZWw7Cit9IHREb3QxMWZJRVAyUFByb2JlUmVxOworCisjZGVmaW5lIERPVDExRl9FSURfUDJQUFJPQkVSRVEgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUDJQUFJPQkVSRVFfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBQUk9CRVJFUV9NQVhfTEVOICggNDEgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBQcm9iZVJlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQUHJvYmVSZXEqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQUHJvYmVSZXEodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUFByb2JlUmVxKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUFByb2JlUmVxKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBQcm9iZVJlcSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4NTAsIDB4NmYsIDB4OWEsIDB4MDl9IChNdWx0aS1JRSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVAyUFByb2JlUmVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSBQMlBDYXBhYmlsaXR5OworICAgIHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZyBFeHRlbmRlZExpc3RlblRpbWluZzsKKyAgICB0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlIE5vdGljZU9mQWJzZW5jZTsKKyAgICB0RG90MTFmVExWUDJQRGV2aWNlSW5mbyBQMlBEZXZpY2VJbmZvOworICAgIHREb3QxMWZUTFZQMlBHcm91cEluZm8gUDJQR3JvdXBJbmZvOworfSB0RG90MTFmSUVQMlBQcm9iZVJlczsKKworI2RlZmluZSBET1QxMUZfRUlEX1AyUFBST0JFUkVTICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1AyUFBST0JFUkVTX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfSUVfUDJQUFJPQkVSRVNfTUFYX0xFTiAoIDExMzkgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBQcm9iZVJlcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQUHJvYmVSZXMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQUHJvYmVSZXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVAyUFByb2JlUmVzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUFByb2JlUmVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVQMlBQcm9iZVJlcyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4NTAsIDB4NmYsIDB4OWEsIDB4MDl9IChNdWx0aS1JRSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdERvdDExZlRMVlAyUENhcGFiaWxpdHkgUDJQQ2FwYWJpbGl0eTsKKyAgICB0RG90MTFmVExWUDJQRGV2aWNlSW5mbyBQMlBEZXZpY2VJbmZvOworICAgIHREb3QxMWZUTFZQMlBHcm91cElkIFAyUEdyb3VwSWQ7Cit9IHREb3QxMWZJRVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcTsKKworI2RlZmluZSBET1QxMUZfRUlEX1AyUFBST1ZJU0lPTkRJU0NPVkVSWVJFUSAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9QMlBQUk9WSVNJT05ESVNDT1ZFUllSRVFfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9QMlBQUk9WSVNJT05ESVNDT1ZFUllSRVFfTUFYX0xFTiAoIDEwNSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNH0gKE11bHRpLUlFKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWQ29uZmlnTWV0aG9kcyBDb25maWdNZXRob2RzOworfSB0RG90MTFmSUVQMlBXU0NQcm92aXNpb25EaXNjb3ZlcnlSZXM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QMlBXU0NQUk9WSVNJT05ESVNDT1ZFUllSRVMgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUDJQV1NDUFJPVklTSU9ORElTQ09WRVJZUkVTX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfSUVfUDJQV1NDUFJPVklTSU9ORElTQ09WRVJZUkVTX01BWF9MRU4gKCAxMCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAzMyAoMHgyMSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVBvd2VyQ2FwcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIG1pblR4UG93ZXI7CisgICAgdEFOSV9VOCAgICAgIG1heFR4UG93ZXI7Cit9IHREb3QxMWZJRVBvd2VyQ2FwczsKKworI2RlZmluZSBET1QxMUZfRUlEX1BPV0VSQ0FQUyAoIDMzICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1BPV0VSQ0FQU19NSU5fTEVOICggMiApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1BPV0VSQ0FQU19NQVhfTEVOICggMiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVBvd2VyQ2Fwcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUG93ZXJDYXBzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVBvd2VyQ2Fwcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUG93ZXJDYXBzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVBvd2VyQ2Fwcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUG93ZXJDYXBzKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAzMiAoMHgyMCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBsb2NhbFBvd2VyQ29uc3RyYWludHM7Cit9IHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9QT1dFUkNPTlNUUkFJTlRTICggMzIgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUE9XRVJDT05TVFJBSU5UU19NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1BPV0VSQ09OU1RSQUlOVFNfTUFYX0xFTiAoIDEgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQb3dlckNvbnN0cmFpbnRzKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVBvd2VyQ29uc3RyYWludHModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUG93ZXJDb25zdHJhaW50cyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUG93ZXJDb25zdHJhaW50cyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMTEgKDB4MGIpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVRQlNTTG9hZCB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgIHN0YWNvdW50OworICAgIHRBTklfVTggICAgICBjaGF1dGlsOworICAgIHRBTklfVTE2ICAgICBhdmFpbDsKK30gdERvdDExZklFUUJTU0xvYWQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9RQlNTTE9BRCAoIDExICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1FCU1NMT0FEX01JTl9MRU4gKCA1ICkKKworI2RlZmluZSBET1QxMUZfSUVfUUJTU0xPQURfTUFYX0xFTiAoIDUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVRQlNTTG9hZCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUUJTU0xvYWQqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUUJTU0xvYWQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVFCU1NMb2FkKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVFCU1NMb2FkKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVRQlNTTG9hZCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgNDYgKDB4MmUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVRT1NDYXBzQXAgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICAgICByZXNlcnZlZDogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgIHR4b3ByZXE6IDE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBxcmVxOiAxOworICAgIHRBTklfVTggICAgICAgICAgICAgcWFjazogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgY291bnQ6IDQ7Cit9IHREb3QxMWZJRVFPU0NhcHNBcDsKKworI2RlZmluZSBET1QxMUZfRUlEX1FPU0NBUFNBUCAoIDQ2ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1FPU0NBUFNBUF9NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1FPU0NBUFNBUF9NQVhfTEVOICggMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVFPU0NhcHNBcCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUU9TQ2Fwc0FwKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVFPU0NhcHNBcCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUU9TQ2Fwc0FwKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVFPU0NhcHNBcCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUU9TQ2Fwc0FwKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA0NiAoMHgyZSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVFPU0NhcHNTdGF0aW9uIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgIG1vcmVfZGF0YV9hY2s6IDE7CisgICAgdEFOSV9VOCAgICBtYXhfc3BfbGVuZ3RoOiAyOworICAgIHRBTklfVTggICAgICAgICAgICAgcWFjazogMTsKKyAgICB0QU5JX1U4ICAgICAgIGFjYmVfdWFwc2Q6IDE7CisgICAgdEFOSV9VOCAgICAgICBhY2JrX3VhcHNkOiAxOworICAgIHRBTklfVTggICAgICAgYWN2aV91YXBzZDogMTsKKyAgICB0QU5JX1U4ICAgICAgIGFjdm9fdWFwc2Q6IDE7Cit9IHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uOworCisjZGVmaW5lIERPVDExRl9FSURfUU9TQ0FQU1NUQVRJT04gKCA0NiApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9RT1NDQVBTU1RBVElPTl9NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1FPU0NBUFNTVEFUSU9OX01BWF9MRU4gKCAxICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUU9TQ2Fwc1N0YXRpb24odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVFPU0NhcHNTdGF0aW9uKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVRT1NDYXBzU3RhdGlvbih0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUU9TQ2Fwc1N0YXRpb24qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDQwICgweDI4KQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUXVpZXQgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBjb3VudDsKKyAgICB0QU5JX1U4ICAgICAgcGVyaW9kOworICAgIHRBTklfVTE2ICAgICBkdXJhdGlvbjsKKyAgICB0QU5JX1UxNiAgICAgb2Zmc2V0OworfSB0RG90MTFmSUVRdWlldDsKKworI2RlZmluZSBET1QxMUZfRUlEX1FVSUVUICggNDAgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUVVJRVRfTUlOX0xFTiAoIDYgKQorCisjZGVmaW5lIERPVDExRl9JRV9RVUlFVF9NQVhfTEVOICggNiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVF1aWV0KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVRdWlldCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVRdWlldCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUXVpZXQqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUXVpZXQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVF1aWV0KiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA1MyAoMHgzNSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVJDUElJRSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHJjcGk7Cit9IHREb3QxMWZJRVJDUElJRTsKKworI2RlZmluZSBET1QxMUZfRUlEX1JDUElJRSAoIDUzICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1JDUElJRV9NSU5fTEVOICggMSApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1JDUElJRV9NQVhfTEVOICggMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVJDUElJRSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFUkNQSUlFKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVJDUElJRSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUkNQSUlFKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVJDUElJRSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUkNQSUlFKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA1NyAoMHgzOSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVJJQ0RhdGFEZXNjIHsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgIHByZXNlbnQ7CisgICAgdERvdDExZklFUklDRGF0YSAgICAgICBSSUNEYXRhOworICAgIHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IgUklDRGVzY3JpcHRvcjsKKyAgICB0RG90MTFmSUVUU1BFQyAgICAgICAgIFRTUEVDOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgbnVtX1RDTEFTOworICAgIHREb3QxMWZJRVRDTEFTICAgICAgICAgVENMQVNbMl07CisgICAgdERvdDExZklFVENMQVNTUFJPQyAgICBUQ0xBU1NQUk9DOworICAgIHREb3QxMWZJRVRTRGVsYXkgICAgICAgVFNEZWxheTsKKyAgICB0RG90MTFmSUVTY2hlZHVsZSAgICAgIFNjaGVkdWxlOworICAgIHREb3QxMWZJRVdNTVRTUEVDICAgICAgV01NVFNQRUM7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICBudW1fV01NVENMQVM7CisgICAgdERvdDExZklFV01NVENMQVMgICAgICBXTU1UQ0xBU1syXTsKKyAgICB0RG90MTFmSUVXTU1UQ0xBU1BST0MgIFdNTVRDTEFTUFJPQzsKKyAgICB0RG90MTFmSUVXTU1UU0RlbGF5ICAgIFdNTVRTRGVsYXk7CisgICAgdERvdDExZklFV01NU2NoZWR1bGUgICBXTU1TY2hlZHVsZTsKK30gdERvdDExZklFUklDRGF0YURlc2M7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9SSUNEQVRBREVTQyAoIDU3ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1JJQ0RBVEFERVNDX01JTl9MRU4gKCAwICkKKworI2RlZmluZSBET1QxMUZfSUVfUklDREFUQURFU0NfTUFYX0xFTiAoIDU0OCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVJJQ0RhdGFEZXNjKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVSSUNEYXRhRGVzYyopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVSSUNEYXRhRGVzYyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUklDRGF0YURlc2MqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUklDRGF0YURlc2ModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVJJQ0RhdGFEZXNjKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA0OCAoMHgzMCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVJTTiB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgIHZlcnNpb24gLyogTXVzdCBiZSAxISAqLzsKKyAgICB0QU5JX1U4ICAgICAgZ3BfY2lwaGVyX3N1aXRlWzRdOworICAgIHRBTklfVTE2ICAgICBwd2lzZV9jaXBoZXJfc3VpdGVfY291bnQ7CisgICAgdEFOSV9VOCAgICAgIHB3aXNlX2NpcGhlcl9zdWl0ZXNbNF1bNF07CisgICAgdEFOSV9VMTYgICAgIGFrbV9zdWl0ZV9jb3VudDsKKyAgICB0QU5JX1U4ICAgICAgYWttX3N1aXRlc1s0XVs0XTsKKyAgICB0QU5JX1UxNiAgICAgICAgICBwcmVhdXRoOiAxOworICAgIHRBTklfVTE2ICAgICAgICAgbm9fcHdpc2U6IDE7CisgICAgdEFOSV9VMTYgUFRLU0FfcmVwbGF5X2NvdW50ZXI6IDI7CisgICAgdEFOSV9VMTYgR1RLU0FfcmVwbGF5X2NvdW50ZXI6IDI7CisgICAgdEFOSV9VMTYgICAgICAgICByZXNlcnZlZDogMTA7CisgICAgdEFOSV9VMTYgICAgIHBta2lkX2NvdW50OworICAgIHRBTklfVTggICAgICBwbWtpZFs0XVsxNl07Cit9IHREb3QxMWZJRVJTTjsKKworI2RlZmluZSBET1QxMUZfRUlEX1JTTiAoIDQ4ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1JTTl9NSU5fTEVOICggNiApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1JTTl9NQVhfTEVOICggMTEwICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUlNOKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVSU04qKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUlNOKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVSU04qLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUlNOKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVSU04qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDY1ICgweDQxKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUlNOSUlFIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgcnNuaTsKK30gdERvdDExZklFUlNOSUlFOworCisjZGVmaW5lIERPVDExRl9FSURfUlNOSUlFICggNjUgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUlNOSUlFX01JTl9MRU4gKCAxICkKKworI2RlZmluZSBET1QxMUZfSUVfUlNOSUlFX01BWF9MRU4gKCAxICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llUlNOSUlFKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVSU05JSUUqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llUlNOSUlFKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVSU05JSUUqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUlNOSUlFKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVSU05JSUUqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDQ4ICgweDMwKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFUlNOT3BhcXVlIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbnVtX2RhdGE7CisgICAgdEFOSV9VOCAgICAgIGRhdGFbMjUzXTsKK30gdERvdDExZklFUlNOT3BhcXVlOworCisjZGVmaW5lIERPVDExRl9FSURfUlNOT1BBUVVFICggNDggKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfUlNOT1BBUVVFX01JTl9MRU4gKCA2ICkKKworI2RlZmluZSBET1QxMUZfSUVfUlNOT1BBUVVFX01BWF9MRU4gKCAyNTMgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVSU05PcGFxdWUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVJTTk9wYXF1ZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVSU05PcGFxdWUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVJTTk9wYXF1ZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVSU05PcGFxdWUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVJTTk9wYXF1ZSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMzYgKDB4MjQpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVTdXBwQ2hhbm5lbHMgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBudW1fYmFuZHM7CisgICAgdEFOSV9VOCAgICAgIGJhbmRzWzQ4XVsyXTsKK30gdERvdDExZklFU3VwcENoYW5uZWxzOworCisjZGVmaW5lIERPVDExRl9FSURfU1VQUENIQU5ORUxTICggMzYgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfU1VQUENIQU5ORUxTX01JTl9MRU4gKCAyICkKKworI2RlZmluZSBET1QxMUZfSUVfU1VQUENIQU5ORUxTX01BWF9MRU4gKCA5NiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVN1cHBDaGFubmVscyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFU3VwcENoYW5uZWxzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVN1cHBDaGFubmVscyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFU3VwcENoYW5uZWxzKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVN1cHBDaGFubmVscyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFU3VwcENoYW5uZWxzKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAxICgweDAxKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFU3VwcFJhdGVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgbnVtX3JhdGVzOworICAgIHRBTklfVTggICAgICByYXRlc1sxMl07Cit9IHREb3QxMWZJRVN1cHBSYXRlczsKKworI2RlZmluZSBET1QxMUZfRUlEX1NVUFBSQVRFUyAoIDEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfU1VQUFJBVEVTX01JTl9MRU4gKCAwICkKKworI2RlZmluZSBET1QxMUZfSUVfU1VQUFJBVEVTX01BWF9MRU4gKCAxMiApCisKKyNkZWZpbmUgRE9UMTFGX0lTX0JHX1JBVEUoX3gpICAoKChfeCkgPT0gMDIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKF94KSA9PSAwNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICgoX3gpID09IDExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgKChfeCkgPT0gMjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKF94KSA9PSAxMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICgoX3gpID09IDE4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgKChfeCkgPT0gMjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKF94KSA9PSAzNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICgoX3gpID09IDQ4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgKChfeCkgPT0gNzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKF94KSA9PSA5NikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICgoX3gpID09IDEwOCkpICAKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llU3VwcFJhdGVzKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVTdXBwUmF0ZXMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llU3VwcFJhdGVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVTdXBwUmF0ZXMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFU3VwcFJhdGVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVTdXBwUmF0ZXMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDUgKDB4MDUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVUSU0geworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBkdGltX2NvdW50OworICAgIHRBTklfVTggICAgICBkdGltX3BlcmlvZDsKKyAgICB0QU5JX1U4ICAgICAgYm1wY3RsOworICAgIHRBTklfVTggICAgICBudW1fdmJtcDsKKyAgICB0QU5JX1U4ICAgICAgdmJtcFsyNTFdOworfSB0RG90MTFmSUVUSU07CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9USU0gKCA1ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1RJTV9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1RJTV9NQVhfTEVOICggMjU0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llVElNKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVUSU0qKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llVElNKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVUSU0qLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFVElNKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVUSU0qLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDM1ICgweDIzKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFVFBDUmVwb3J0IHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgdHhfcG93ZXI7CisgICAgdEFOSV9VOCAgICAgIGxpbmtfbWFyZ2luOworfSB0RG90MTFmSUVUUENSZXBvcnQ7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9UUENSRVBPUlQgKCAzNSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9UUENSRVBPUlRfTUlOX0xFTiAoIDIgKQorCisjZGVmaW5lIERPVDExRl9JRV9UUENSRVBPUlRfTUFYX0xFTiAoIDIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVUUENSZXBvcnQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVRQQ1JlcG9ydCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVUUENSZXBvcnQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVRQQ1JlcG9ydCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVUUENSZXBvcnQodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVRQQ1JlcG9ydCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMzQgKDB4MjIpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVUUENSZXF1ZXN0IHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKK30gdERvdDExZklFVFBDUmVxdWVzdDsKKworI2RlZmluZSBET1QxMUZfRUlEX1RQQ1JFUVVFU1QgKCAzNCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9UUENSRVFVRVNUX01JTl9MRU4gKCAwICkKKworI2RlZmluZSBET1QxMUZfSUVfVFBDUkVRVUVTVF9NQVhfTEVOICggMCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVRQQ1JlcXVlc3QodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVRQQ1JlcXVlc3QqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llVFBDUmVxdWVzdCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFVFBDUmVxdWVzdCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVUUENSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVUUENSZXF1ZXN0KiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA2OCAoMHg0NCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdBUEkgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTE2ICAgICB2ZXJzaW9uIC8qIE11c3QgYmUgMSEgKi87CisgICAgdEFOSV9VMTYgICAgIGFrbV9zdWl0ZV9jb3VudDsKKyAgICB0QU5JX1U4ICAgICAgYWttX3N1aXRlc1s0XVs0XTsKKyAgICB0QU5JX1UxNiAgICAgdW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQ7CisgICAgdEFOSV9VOCAgICAgIHVuaWNhc3RfY2lwaGVyX3N1aXRlc1s0XVs0XTsKKyAgICB0QU5JX1U4ICAgICAgbXVsdGljYXN0X2NpcGhlcl9zdWl0ZVs0XTsKKyAgICB0QU5JX1UxNiAgICAgICAgICBwcmVhdXRoOiAxOworICAgIHRBTklfVTE2ICAgICAgICAgcmVzZXJ2ZWQ6IDE1OworICAgIHRBTklfVTE2ICAgICBia2lkX2NvdW50OworICAgIHRBTklfVTggICAgICBia2lkWzRdWzE2XTsKK30gdERvdDExZklFV0FQSTsKKworI2RlZmluZSBET1QxMUZfRUlEX1dBUEkgKCA2OCApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9XQVBJX01JTl9MRU4gKCAxMiApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dBUElfTUFYX0xFTiAoIDExMCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdBUEkodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdBUEkqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llV0FQSSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV0FQSSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXQVBJKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXQVBJKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCA2OCAoMHg0NCkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdBUElPcGFxdWUgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBudW1fZGF0YTsKKyAgICB0QU5JX1U4ICAgICAgZGF0YVsyNTNdOworfSB0RG90MTFmSUVXQVBJT3BhcXVlOworCisjZGVmaW5lIERPVDExRl9FSURfV0FQSU9QQVFVRSAoIDY4ICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1dBUElPUEFRVUVfTUlOX0xFTiAoIDYgKQorCisjZGVmaW5lIERPVDExRl9JRV9XQVBJT1BBUVVFX01BWF9MRU4gKCAyNTMgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXQVBJT3BhcXVlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVXQVBJT3BhcXVlKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdBUElPcGFxdWUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdBUElPcGFxdWUqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV0FQSU9wYXF1ZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV0FQSU9wYXF1ZSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDgsIDB4MDB9Cit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXRkFUUEMgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICB0eFBvd2VyOworICAgIHRBTklfVTggICAgICBsaW5rTWFyZ2luOworfSB0RG90MTFmSUVXRkFUUEM7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XRkFUUEMgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfV0ZBVFBDX01JTl9MRU4gKCA3ICkKKworI2RlZmluZSBET1QxMUZfSUVfV0ZBVFBDX01BWF9MRU4gKCA3ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llV0ZBVFBDKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVXRkFUUEMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llV0ZBVFBDKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXRkFUUEMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV0ZBVFBDKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXRkFUUEMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDA1fQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV01NQ2FwcyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHZlcnNpb24gLyogTXVzdCBiZSAxISAqLzsKKyAgICB0QU5JX1U4ICAgICAgICAgcmVzZXJ2ZWQ6IDQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBxYWNrOiAxOworICAgIHRBTklfVTggICAgcXVldWVfcmVxdWVzdDogMTsKKyAgICB0QU5JX1U4ICAgICB0eG9wX3JlcXVlc3Q6IDE7CisgICAgdEFOSV9VOCAgICAgICAgIG1vcmVfYWNrOiAxOworfSB0RG90MTFmSUVXTU1DYXBzOworCisjZGVmaW5lIERPVDExRl9FSURfV01NQ0FQUyAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9XTU1DQVBTX01JTl9MRU4gKCA3ICkKKworI2RlZmluZSBET1QxMUZfSUVfV01NQ0FQU19NQVhfTEVOICggNyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdNTUNhcHModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdNTUNhcHMqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llV01NQ2Fwcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV01NQ2FwcyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXTU1DYXBzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXTU1DYXBzKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMH0KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdNTUluZm9BcCB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHZlcnNpb247CisgICAgdEFOSV9VOCAgcGFyYW1fc2V0X2NvdW50OiA0OworICAgIHRBTklfVTggICAgICAgICByZXNlcnZlZDogMzsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgdWFwc2Q6IDE7Cit9IHREb3QxMWZJRVdNTUluZm9BcDsKKworI2RlZmluZSBET1QxMUZfRUlEX1dNTUlORk9BUCAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9XTU1JTkZPQVBfTUlOX0xFTiAoIDcgKQorCisjZGVmaW5lIERPVDExRl9JRV9XTU1JTkZPQVBfTUFYX0xFTiAoIDcgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXTU1JbmZvQXAodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdNTUluZm9BcCopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXTU1JbmZvQXAodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdNTUluZm9BcCosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXTU1JbmZvQXAodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdNTUluZm9BcCosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDB9Cit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXTU1JbmZvU3RhdGlvbiB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgIHZlcnNpb247CisgICAgdEFOSV9VOCAgICAgICBhY3ZvX3VhcHNkOiAxOworICAgIHRBTklfVTggICAgICAgYWN2aV91YXBzZDogMTsKKyAgICB0QU5JX1U4ICAgICAgIGFjYmtfdWFwc2Q6IDE7CisgICAgdEFOSV9VOCAgICAgICBhY2JlX3VhcHNkOiAxOworICAgIHRBTklfVTggICAgICAgIHJlc2VydmVkMTogMTsKKyAgICB0QU5JX1U4ICAgIG1heF9zcF9sZW5ndGg6IDI7CisgICAgdEFOSV9VOCAgICAgICAgcmVzZXJ2ZWQyOiAxOworfSB0RG90MTFmSUVXTU1JbmZvU3RhdGlvbjsKKworI2RlZmluZSBET1QxMUZfRUlEX1dNTUlORk9TVEFUSU9OICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1dNTUlORk9TVEFUSU9OX01JTl9MRU4gKCA3ICkKKworI2RlZmluZSBET1QxMUZfSUVfV01NSU5GT1NUQVRJT05fTUFYX0xFTiAoIDcgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXTU1JbmZvU3RhdGlvbih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFV01NSW5mb1N0YXRpb24qKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llV01NSW5mb1N0YXRpb24odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdNTUluZm9TdGF0aW9uKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVdNTUluZm9TdGF0aW9uKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDF9Cit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXTU1QYXJhbXMgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICB2ZXJzaW9uIC8qIE11c3QgYmUgMSEgKi87CisgICAgdEFOSV9VOCAgICAgIHFvc0luZm87CisgICAgdEFOSV9VOCAgICAgIHJlc2VydmVkMjsKKyAgICB0QU5JX1U4ICAgICAgIGFjYmVfYWlmc246IDQ7CisgICAgdEFOSV9VOCAgICAgICAgIGFjYmVfYWNtOiAxOworICAgIHRBTklfVTggICAgICAgICBhY2JlX2FjaTogMjsKKyAgICB0QU5JX1U4ICAgICAgICAgIHVudXNlZDE6IDE7CisgICAgdEFOSV9VOCAgICAgIGFjYmVfYWN3bWluOiA0OworICAgIHRBTklfVTggICAgICBhY2JlX2Fjd21heDogNDsKKyAgICB0QU5JX1UxNiAgICAgYWNiZV90eG9wbGltaXQ7CisgICAgdEFOSV9VOCAgICAgICBhY2JrX2FpZnNuOiA0OworICAgIHRBTklfVTggICAgICAgICBhY2JrX2FjbTogMTsKKyAgICB0QU5JX1U4ICAgICAgICAgYWNia19hY2k6IDI7CisgICAgdEFOSV9VOCAgICAgICAgICB1bnVzZWQyOiAxOworICAgIHRBTklfVTggICAgICBhY2JrX2Fjd21pbjogNDsKKyAgICB0QU5JX1U4ICAgICAgYWNia19hY3dtYXg6IDQ7CisgICAgdEFOSV9VMTYgICAgIGFjYmtfdHhvcGxpbWl0OworICAgIHRBTklfVTggICAgICAgYWN2aV9haWZzbjogNDsKKyAgICB0QU5JX1U4ICAgICAgICAgYWN2aV9hY206IDE7CisgICAgdEFOSV9VOCAgICAgICAgIGFjdmlfYWNpOiAyOworICAgIHRBTklfVTggICAgICAgICAgdW51c2VkMzogMTsKKyAgICB0QU5JX1U4ICAgICAgYWN2aV9hY3dtaW46IDQ7CisgICAgdEFOSV9VOCAgICAgIGFjdmlfYWN3bWF4OiA0OworICAgIHRBTklfVTE2ICAgICBhY3ZpX3R4b3BsaW1pdDsKKyAgICB0QU5JX1U4ICAgICAgIGFjdm9fYWlmc246IDQ7CisgICAgdEFOSV9VOCAgICAgICAgIGFjdm9fYWNtOiAxOworICAgIHRBTklfVTggICAgICAgICBhY3ZvX2FjaTogMjsKKyAgICB0QU5JX1U4ICAgICAgICAgIHVudXNlZDQ6IDE7CisgICAgdEFOSV9VOCAgICAgIGFjdm9fYWN3bWluOiA0OworICAgIHRBTklfVTggICAgICBhY3ZvX2Fjd21heDogNDsKKyAgICB0QU5JX1UxNiAgICAgYWN2b190eG9wbGltaXQ7Cit9IHREb3QxMWZJRVdNTVBhcmFtczsKKworI2RlZmluZSBET1QxMUZfRUlEX1dNTVBBUkFNUyAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9XTU1QQVJBTVNfTUlOX0xFTiAoIDI0ICkKKworI2RlZmluZSBET1QxMUZfSUVfV01NUEFSQU1TX01BWF9MRU4gKCAyNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdNTVBhcmFtcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFV01NUGFyYW1zKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdNTVBhcmFtcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV01NUGFyYW1zKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVdNTVBhcmFtcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV01NUGFyYW1zKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMX0KK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdQQSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdEFOSV9VMTYgICAgIHZlcnNpb24gLyogTXVzdCBiZSAxISAqLzsKKyAgICB0QU5JX1U4ICAgICAgbXVsdGljYXN0X2NpcGhlcl9wcmVzZW50OyAgIC8vZmllbGQgYWRkZWQgdG8gZml4IHRoZSBidWcgaW4gZG90MTFmUGFja0lFV1BBIAorICAgIHRBTklfVTggICAgICBtdWx0aWNhc3RfY2lwaGVyWzRdOworICAgIHRBTklfVTE2ICAgICB1bmljYXN0X2NpcGhlcl9jb3VudDsKKyAgICB0QU5JX1U4ICAgICAgdW5pY2FzdF9jaXBoZXJzWzRdWzRdOworICAgIHRBTklfVTE2ICAgICBhdXRoX3N1aXRlX2NvdW50OworICAgIHRBTklfVTggICAgICBhdXRoX3N1aXRlc1s0XVs0XTsKKyAgICB0QU5JX1UxNiAgICAgY2FwczsKK30gdERvdDExZklFV1BBOworCisjZGVmaW5lIERPVDExRl9FSURfV1BBICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1dQQV9NSU5fTEVOICggNiApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dQQV9NQVhfTEVOICggNDggKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXUEEodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdQQSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXUEEodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdQQSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXUEEodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdQQSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9Cit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXUEFPcGFxdWUgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBudW1fZGF0YTsKKyAgICB0QU5JX1U4ICAgICAgZGF0YVsyNDldOworfSB0RG90MTFmSUVXUEFPcGFxdWU7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XUEFPUEFRVUUgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfV1BBT1BBUVVFX01JTl9MRU4gKCA2ICkKKworI2RlZmluZSBET1QxMUZfSUVfV1BBT1BBUVVFX01BWF9MRU4gKCAyNTMgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXUEFPcGFxdWUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdQQU9wYXF1ZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXUEFPcGFxdWUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdQQU9wYXF1ZSosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXUEFPcGFxdWUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdQQU9wYXF1ZSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9IChNdWx0aS1JRSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdTQyB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdERvdDExZlRMVlZlcnNpb24gVmVyc2lvbjsKKyAgICB0RG90MTFmVExWV1BTU3RhdGUgV1BTU3RhdGU7CisgICAgdERvdDExZlRMVkFQU2V0dXBMb2NrZWQgQVBTZXR1cExvY2tlZDsKKyAgICB0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzIFNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczsKKyAgICB0RG90MTFmVExWVVVJRF9FIFVVSURfRTsKKyAgICB0RG90MTFmVExWVVVJRF9SIFVVSURfUjsKKyAgICB0RG90MTFmVExWUkZCYW5kcyBSRkJhbmRzOworICAgIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhciBTZWxlY3RlZFJlZ2lzdHJhcjsKKyAgICB0RG90MTFmVExWQ29uZmlnTWV0aG9kcyBDb25maWdNZXRob2RzOworICAgIHREb3QxMWZUTFZBc3NvY2lhdGlvblN0YXRlIEFzc29jaWF0aW9uU3RhdGU7CisgICAgdERvdDExZlRMVkNvbmZpZ3VyYXRpb25FcnJvciBDb25maWd1cmF0aW9uRXJyb3I7CisgICAgdERvdDExZlRMVk1hbnVmYWN0dXJlciBNYW51ZmFjdHVyZXI7CisgICAgdERvdDExZlRMVk1vZGVsTmFtZSBNb2RlbE5hbWU7CisgICAgdERvdDExZlRMVk1vZGVsTnVtYmVyIE1vZGVsTnVtYmVyOworICAgIHREb3QxMWZUTFZTZXJpYWxOdW1iZXIgU2VyaWFsTnVtYmVyOworICAgIHREb3QxMWZUTFZEZXZpY2VOYW1lIERldmljZU5hbWU7CisgICAgdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQgRGV2aWNlUGFzc3dvcmRJRDsKKyAgICB0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGUgUHJpbWFyeURldmljZVR5cGU7CisgICAgdERvdDExZlRMVlJlcXVlc3RUeXBlIFJlcXVlc3RUeXBlOworICAgIHREb3QxMWZUTFZSZXNwb25zZVR5cGUgUmVzcG9uc2VUeXBlOworICAgIHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24gVmVuZG9yRXh0ZW5zaW9uOworICAgIHREb3QxMWZUTFZSZXF1ZXN0RGV2aWNlVHlwZSBSZXF1ZXN0RGV2aWNlVHlwZTsKK30gdERvdDExZklFV1NDOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ19NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ19NQVhfTEVOICggMzY2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llV1NDKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVXU0MqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llV1NDKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXU0MqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV1NDKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXU0MqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDA0fSAoTXVsdGktSUUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXc2NBc3NvY1JlcSB7CisgICAgdEFOSV9VOCAgICAgIHByZXNlbnQ7CisgICAgdERvdDExZlRMVlZlcnNpb24gVmVyc2lvbjsKKyAgICB0RG90MTFmVExWUmVxdWVzdFR5cGUgUmVxdWVzdFR5cGU7CisgICAgdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiBWZW5kb3JFeHRlbnNpb247Cit9IHREb3QxMWZJRVdzY0Fzc29jUmVxOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDQVNTT0NSRVEgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfV1NDQVNTT0NSRVFfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9XU0NBU1NPQ1JFUV9NQVhfTEVOICggMzUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXc2NBc3NvY1JlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFV3NjQXNzb2NSZXEqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llV3NjQXNzb2NSZXEodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdzY0Fzc29jUmVxKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVdzY0Fzc29jUmVxKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXc2NBc3NvY1JlcSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9IChNdWx0aS1JRSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdzY0Fzc29jUmVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWVmVyc2lvbiBWZXJzaW9uOworICAgIHREb3QxMWZUTFZSZXNwb25zZVR5cGUgUmVzcG9uc2VUeXBlOworICAgIHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24gVmVuZG9yRXh0ZW5zaW9uOworfSB0RG90MTFmSUVXc2NBc3NvY1JlczsKKworI2RlZmluZSBET1QxMUZfRUlEX1dTQ0FTU09DUkVTICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0FTU09DUkVTX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfSUVfV1NDQVNTT0NSRVNfTUFYX0xFTiAoIDM1ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llV3NjQXNzb2NSZXModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdzY0Fzc29jUmVzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdzY0Fzc29jUmVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXc2NBc3NvY1JlcyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXc2NBc3NvY1Jlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV3NjQXNzb2NSZXMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDA0fSAoTXVsdGktSUUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXc2NCZWFjb24geworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHREb3QxMWZUTFZWZXJzaW9uIFZlcnNpb247CisgICAgdERvdDExZlRMVldQU1N0YXRlIFdQU1N0YXRlOworICAgIHREb3QxMWZUTFZBUFNldHVwTG9ja2VkIEFQU2V0dXBMb2NrZWQ7CisgICAgdERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyIFNlbGVjdGVkUmVnaXN0cmFyOworICAgIHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElEIERldmljZVBhc3N3b3JkSUQ7CisgICAgdERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyBTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHM7CisgICAgdERvdDExZlRMVlVVSURfRSBVVUlEX0U7CisgICAgdERvdDExZlRMVlJGQmFuZHMgUkZCYW5kczsKKyAgICB0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uIFZlbmRvckV4dGVuc2lvbjsKK30gdERvdDExZklFV3NjQmVhY29uOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDQkVBQ09OICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0JFQUNPTl9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0JFQUNPTl9NQVhfTEVOICggODIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXc2NCZWFjb24odHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdzY0JlYWNvbiopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXc2NCZWFjb24odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdzY0JlYWNvbiosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXc2NCZWFjb24odHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdzY0JlYWNvbiosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9IChNdWx0aS1JRSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWVmVyc2lvbiBWZXJzaW9uOworICAgIHREb3QxMWZUTFZXUFNTdGF0ZSBXUFNTdGF0ZTsKKyAgICB0RG90MTFmVExWQVBTZXR1cExvY2tlZCBBUFNldHVwTG9ja2VkOworICAgIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhciBTZWxlY3RlZFJlZ2lzdHJhcjsKKyAgICB0RG90MTFmVExWRGV2aWNlUGFzc3dvcmRJRCBEZXZpY2VQYXNzd29yZElEOworICAgIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMgU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOworICAgIHREb3QxMWZUTFZSZXNwb25zZVR5cGUgUmVzcG9uc2VUeXBlOworICAgIHREb3QxMWZUTFZVVUlEX0UgVVVJRF9FOworICAgIHREb3QxMWZUTFZNYW51ZmFjdHVyZXIgTWFudWZhY3R1cmVyOworICAgIHREb3QxMWZUTFZNb2RlbE5hbWUgTW9kZWxOYW1lOworICAgIHREb3QxMWZUTFZNb2RlbE51bWJlciBNb2RlbE51bWJlcjsKKyAgICB0RG90MTFmVExWU2VyaWFsTnVtYmVyIFNlcmlhbE51bWJlcjsKKyAgICB0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGUgUHJpbWFyeURldmljZVR5cGU7CisgICAgdERvdDExZlRMVkRldmljZU5hbWUgRGV2aWNlTmFtZTsKKyAgICB0RG90MTFmVExWQ29uZmlnTWV0aG9kcyBDb25maWdNZXRob2RzOworICAgIHREb3QxMWZUTFZSRkJhbmRzIFJGQmFuZHM7CisgICAgdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiBWZW5kb3JFeHRlbnNpb247Cit9IHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDQkVBQ09OUFJPQkVSRVMgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfV1NDQkVBQ09OUFJPQkVSRVNfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9XU0NCRUFDT05QUk9CRVJFU19NQVhfTEVOICggMzE3ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llV3NjQmVhY29uUHJvYmVSZXModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdzY0JlYWNvblByb2JlUmVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXc2NCZWFjb25Qcm9iZVJlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDA0fQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV3NjSUVPcGFxdWUgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHRBTklfVTggICAgICBudW1fZGF0YTsKKyAgICB0QU5JX1U4ICAgICAgZGF0YVsyNDldOworfSB0RG90MTFmSUVXc2NJRU9wYXF1ZTsKKworI2RlZmluZSBET1QxMUZfRUlEX1dTQ0lFT1BBUVVFICggMjIxICkKKworLy8gTi5CLiBUaGVzZSAjZGVmaW5lcyBkbyAqbm90KiBpbmNsdWRlIHRoZSBFSUQgJiBsZW5ndGgKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ0lFT1BBUVVFX01JTl9MRU4gKCA2ICkKKworI2RlZmluZSBET1QxMUZfSUVfV1NDSUVPUEFRVUVfTUFYX0xFTiAoIDI1MyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdzY0lFT3BhcXVlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVXc2NJRU9wYXF1ZSopOworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXc2NJRU9wYXF1ZSh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV3NjSUVPcGFxdWUqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV3NjSUVPcGFxdWUodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdzY0lFT3BhcXVlKiwgdEFOSV9VMzIqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OyAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKy8vIEVJRCAyMjEgKDB4ZGQpIHtPVUkgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNH0gKE11bHRpLUlFKQordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZklFV3NjUHJvYmVSZXEgeworICAgIHRBTklfVTggICAgICBwcmVzZW50OworICAgIHREb3QxMWZUTFZWZXJzaW9uIFZlcnNpb247CisgICAgdERvdDExZlRMVlJlcXVlc3RUeXBlIFJlcXVlc3RUeXBlOworICAgIHREb3QxMWZUTFZDb25maWdNZXRob2RzIENvbmZpZ01ldGhvZHM7CisgICAgdERvdDExZlRMVlVVSURfRSBVVUlEX0U7CisgICAgdERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlIFByaW1hcnlEZXZpY2VUeXBlOworICAgIHREb3QxMWZUTFZSRkJhbmRzIFJGQmFuZHM7CisgICAgdERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUgQXNzb2NpYXRpb25TdGF0ZTsKKyAgICB0RG90MTFmVExWQ29uZmlndXJhdGlvbkVycm9yIENvbmZpZ3VyYXRpb25FcnJvcjsKKyAgICB0RG90MTFmVExWRGV2aWNlUGFzc3dvcmRJRCBEZXZpY2VQYXNzd29yZElEOworICAgIHREb3QxMWZUTFZNYW51ZmFjdHVyZXIgTWFudWZhY3R1cmVyOworICAgIHREb3QxMWZUTFZNb2RlbE5hbWUgTW9kZWxOYW1lOworICAgIHREb3QxMWZUTFZNb2RlbE51bWJlciBNb2RlbE51bWJlcjsKKyAgICB0RG90MTFmVExWRGV2aWNlTmFtZSBEZXZpY2VOYW1lOworICAgIHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24gVmVuZG9yRXh0ZW5zaW9uOworICAgIHREb3QxMWZUTFZSZXF1ZXN0RGV2aWNlVHlwZSBSZXF1ZXN0RGV2aWNlVHlwZTsKK30gdERvdDExZklFV3NjUHJvYmVSZXE7CisKKyNkZWZpbmUgRE9UMTFGX0VJRF9XU0NQUk9CRVJFUSAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9XU0NQUk9CRVJFUV9NSU5fTEVOICggNCApCisKKyNkZWZpbmUgRE9UMTFGX0lFX1dTQ1BST0JFUkVRX01BWF9MRU4gKCAyODQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXc2NQcm9iZVJlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCosdEFOSV9VOCwgdERvdDExZklFV3NjUHJvYmVSZXEqKTsKKwordEFOSV9VMzIgZG90MTFmUGFja0llV3NjUHJvYmVSZXEodHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdzY1Byb2JlUmVxKiwgdEFOSV9VOCosIHRBTklfVTMyLCB0QU5JX1UzMiopOworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVdzY1Byb2JlUmVxKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXc2NQcm9iZVJlcSosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvLyBFSUQgMjIxICgweGRkKSB7T1VJIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9IChNdWx0aS1JRSkKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJRVdzY1Byb2JlUmVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWVmVyc2lvbiBWZXJzaW9uOworICAgIHREb3QxMWZUTFZXUFNTdGF0ZSBXUFNTdGF0ZTsKKyAgICB0RG90MTFmVExWQVBTZXR1cExvY2tlZCBBUFNldHVwTG9ja2VkOworICAgIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhciBTZWxlY3RlZFJlZ2lzdHJhcjsKKyAgICB0RG90MTFmVExWRGV2aWNlUGFzc3dvcmRJRCBEZXZpY2VQYXNzd29yZElEOworICAgIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMgU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOworICAgIHREb3QxMWZUTFZSZXNwb25zZVR5cGUgUmVzcG9uc2VUeXBlOworICAgIHREb3QxMWZUTFZVVUlEX0UgVVVJRF9FOworICAgIHREb3QxMWZUTFZNYW51ZmFjdHVyZXIgTWFudWZhY3R1cmVyOworICAgIHREb3QxMWZUTFZNb2RlbE5hbWUgTW9kZWxOYW1lOworICAgIHREb3QxMWZUTFZNb2RlbE51bWJlciBNb2RlbE51bWJlcjsKKyAgICB0RG90MTFmVExWU2VyaWFsTnVtYmVyIFNlcmlhbE51bWJlcjsKKyAgICB0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGUgUHJpbWFyeURldmljZVR5cGU7CisgICAgdERvdDExZlRMVkRldmljZU5hbWUgRGV2aWNlTmFtZTsKKyAgICB0RG90MTFmVExWQ29uZmlnTWV0aG9kcyBDb25maWdNZXRob2RzOworICAgIHREb3QxMWZUTFZSRkJhbmRzIFJGQmFuZHM7CisgICAgdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiBWZW5kb3JFeHRlbnNpb247Cit9IHREb3QxMWZJRVdzY1Byb2JlUmVzOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDUFJPQkVSRVMgKCAyMjEgKQorCisvLyBOLkIuIFRoZXNlICNkZWZpbmVzIGRvICpub3QqIGluY2x1ZGUgdGhlIEVJRCAmIGxlbmd0aAorI2RlZmluZSBET1QxMUZfSUVfV1NDUFJPQkVSRVNfTUlOX0xFTiAoIDQgKQorCisjZGVmaW5lIERPVDExRl9JRV9XU0NQUk9CRVJFU19NQVhfTEVOICggMzE3ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KK3RBTklfVTMyIGRvdDExZlVucGFja0llV3NjUHJvYmVSZXModHBBbmlTaXJHbG9iYWwsIHRBTklfVTgqLHRBTklfVTgsIHREb3QxMWZJRVdzY1Byb2JlUmVzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdzY1Byb2JlUmVzKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVXc2NQcm9iZVJlcyosIHRBTklfVTgqLCB0QU5JX1UzMiwgdEFOSV9VMzIqKTsKKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXc2NQcm9iZVJlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV3NjUHJvYmVSZXMqLCB0QU5JX1UzMiopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworLy8gRUlEIDIyMSAoMHhkZCkge09VSSAweDAwLCAweDUwLCAweGYyLCAweDA0fSAoTXVsdGktSUUpCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmSUVXc2NSZWFzc29jUmVzIHsKKyAgICB0QU5JX1U4ICAgICAgcHJlc2VudDsKKyAgICB0RG90MTFmVExWVmVyc2lvbiBWZXJzaW9uOworICAgIHREb3QxMWZUTFZSZXNwb25zZVR5cGUgUmVzcG9uc2VUeXBlOworICAgIHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24gVmVuZG9yRXh0ZW5zaW9uOworfSB0RG90MTFmSUVXc2NSZWFzc29jUmVzOworCisjZGVmaW5lIERPVDExRl9FSURfV1NDUkVBU1NPQ1JFUyAoIDIyMSApCisKKy8vIE4uQi4gVGhlc2UgI2RlZmluZXMgZG8gKm5vdCogaW5jbHVkZSB0aGUgRUlEICYgbGVuZ3RoCisjZGVmaW5lIERPVDExRl9JRV9XU0NSRUFTU09DUkVTX01JTl9MRU4gKCA0ICkKKworI2RlZmluZSBET1QxMUZfSUVfV1NDUkVBU1NPQ1JFU19NQVhfTEVOICggMzUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXc2NSZWFzc29jUmVzKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4Kix0QU5JX1U4LCB0RG90MTFmSUVXc2NSZWFzc29jUmVzKik7CisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdzY1JlYXNzb2NSZXModHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdzY1JlYXNzb2NSZXMqLCB0QU5JX1U4KiwgdEFOSV9VMzIsIHRBTklfVTMyKik7CisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV3NjUmVhc3NvY1Jlcyh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFV3NjUmVhc3NvY1JlcyosIHRBTklfVTMyKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGcmFtZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmQWRkQkFSZXF7CisgICAgdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgICAgICAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgICAgIERpYWxvZ1Rva2VuOworICAgIHREb3QxMWZGZkFkZEJBUGFyYW1ldGVyU2V0ICAgICAgICAgQWRkQkFQYXJhbWV0ZXJTZXQ7CisgICAgdERvdDExZkZmQkFUaW1lb3V0ICAgICAgICAgICAgICAgICBCQVRpbWVvdXQ7CisgICAgdERvdDExZkZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbCBCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sOworfSB0RG90MTFmQWRkQkFSZXE7CisKKyNkZWZpbmUgRE9UMTFGX0FEREJBUkVRICggMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja0FkZEJBUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZBZGRCQVJlcSAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrQWRkQkFSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkFkZEJBUmVxICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRBZGRCQVJlcVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkFkZEJBUmVxICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZBZGRCQVJzcHsKKyAgICB0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICBBY3Rpb247CisgICAgdERvdDExZkZmRGlhbG9nVG9rZW4gICAgICAgRGlhbG9nVG9rZW47CisgICAgdERvdDExZkZmU3RhdHVzICAgICAgICAgICAgU3RhdHVzOworICAgIHREb3QxMWZGZkFkZEJBUGFyYW1ldGVyU2V0IEFkZEJBUGFyYW1ldGVyU2V0OworICAgIHREb3QxMWZGZkJBVGltZW91dCAgICAgICAgIEJBVGltZW91dDsKK30gdERvdDExZkFkZEJBUnNwOworCisjZGVmaW5lIERPVDExRl9BRERCQVJTUCAoIDIgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tBZGRCQVJzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQWRkQkFSc3AgKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja0FkZEJBUnNwKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBZGRCQVJzcCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQWRkQkFSc3BTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBZGRCQVJzcCAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmQWRkVFNSZXF1ZXN0eworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgQWN0aW9uOworICAgIHREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmSUVUU1BFQyAgICAgICAgICAgICAgVFNQRUM7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgIG51bV9UQ0xBUzsKKyAgICB0RG90MTFmSUVUQ0xBUyAgICAgICAgICAgICAgVENMQVNbMl07CisgICAgdERvdDExZklFVENMQVNTUFJPQyAgICAgICAgIFRDTEFTU1BST0M7CisgICAgdERvdDExZklFV01NVFNQRUMgICAgICAgICAgIFdNTVRTUEVDOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgICBudW1fV01NVENMQVM7CisgICAgdERvdDExZklFV01NVENMQVMgICAgICAgICAgIFdNTVRDTEFTWzJdOworICAgIHREb3QxMWZJRVdNTVRDTEFTUFJPQyAgICAgICBXTU1UQ0xBU1BST0M7CisgICAgdERvdDExZklFQ0NYVHJhZlN0cm1SYXRlU2V0IENDWFRyYWZTdHJtUmF0ZVNldDsKK30gdERvdDExZkFkZFRTUmVxdWVzdDsKKworI2RlZmluZSBET1QxMUZfQUREVFNSRVFVRVNUICggMyApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja0FkZFRTUmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQWRkVFNSZXF1ZXN0ICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tBZGRUU1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkFkZFRTUmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQWRkVFNSZXF1ZXN0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQWRkVFNSZXF1ZXN0ICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZBZGRUU1Jlc3BvbnNleworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAgICBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmRmZTdGF0dXMgICAgICAgICBTdGF0dXM7CisgICAgdERvdDExZklFVFNEZWxheSAgICAgICAgVFNEZWxheTsKKyAgICB0RG90MTFmSUVUU1BFQyAgICAgICAgICBUU1BFQzsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBudW1fVENMQVM7CisgICAgdERvdDExZklFVENMQVMgICAgICAgICAgVENMQVNbMl07CisgICAgdERvdDExZklFVENMQVNTUFJPQyAgICAgVENMQVNTUFJPQzsKKyAgICB0RG90MTFmSUVTY2hlZHVsZSAgICAgICBTY2hlZHVsZTsKKyAgICB0RG90MTFmSUVXTU1UU0RlbGF5ICAgICBXTU1UU0RlbGF5OworICAgIHREb3QxMWZJRVdNTVNjaGVkdWxlICAgIFdNTVNjaGVkdWxlOworICAgIHREb3QxMWZJRVdNTVRTUEVDICAgICAgIFdNTVRTUEVDOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIG51bV9XTU1UQ0xBUzsKKyAgICB0RG90MTFmSUVXTU1UQ0xBUyAgICAgICBXTU1UQ0xBU1syXTsKKyAgICB0RG90MTFmSUVXTU1UQ0xBU1BST0MgICBXTU1UQ0xBU1BST0M7CisgICAgdERvdDExZklFQ0NYVHJhZlN0cm1NZXQgQ0NYVHJhZlN0cm1NZXQ7Cit9IHREb3QxMWZBZGRUU1Jlc3BvbnNlOworCisjZGVmaW5lIERPVDExRl9BRERUU1JFU1BPTlNFICggNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja0FkZFRTUmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkFkZFRTUmVzcG9uc2UgKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja0FkZFRTUmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkFkZFRTUmVzcG9uc2UgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZEFkZFRTUmVzcG9uc2VTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBZGRUU1Jlc3BvbnNlICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZBc3NvY1JlcXVlc3R7CisgICAgdERvdDExZkZmQ2FwYWJpbGl0aWVzICAgQ2FwYWJpbGl0aWVzOworICAgIHREb3QxMWZGZkxpc3RlbkludGVydmFsIExpc3RlbkludGVydmFsOworICAgIHREb3QxMWZJRVNTSUQgICAgICAgICAgIFNTSUQ7CisgICAgdERvdDExZklFU3VwcFJhdGVzICAgICAgU3VwcFJhdGVzOworICAgIHREb3QxMWZJRUV4dFN1cHBSYXRlcyAgIEV4dFN1cHBSYXRlczsKKyAgICB0RG90MTFmSUVQb3dlckNhcHMgICAgICBQb3dlckNhcHM7CisgICAgdERvdDExZklFU3VwcENoYW5uZWxzICAgU3VwcENoYW5uZWxzOworICAgIHREb3QxMWZJRVJTTk9wYXF1ZSAgICAgIFJTTk9wYXF1ZTsKKyAgICB0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiBRT1NDYXBzU3RhdGlvbjsKKyAgICB0RG90MTFmSUVSUk1FbmFibGVkQ2FwICBSUk1FbmFibGVkQ2FwOworICAgIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluIE1vYmlsaXR5RG9tYWluOworICAgIHREb3QxMWZJRVdQQU9wYXF1ZSAgICAgIFdQQU9wYXF1ZTsKKyAgICB0RG90MTFmSUVIVENhcHMgICAgICAgICBIVENhcHM7CisgICAgdERvdDExZklFV01NQ2FwcyAgICAgICAgV01NQ2FwczsKKyAgICB0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiBXTU1JbmZvU3RhdGlvbjsKKyAgICB0RG90MTFmSUVBaXJnbyAgICAgICAgICBBaXJnbzsKKyAgICB0RG90MTFmSUVXc2NJRU9wYXF1ZSAgICBXc2NJRU9wYXF1ZTsKKyAgICB0RG90MTFmSUVXQVBJT3BhcXVlICAgICBXQVBJT3BhcXVlOworICAgIHREb3QxMWZJRUNDWFJhZE1nbXRDYXAgIENDWFJhZE1nbXRDYXA7CisgICAgdERvdDExZklFQ0NYVmVyc2lvbiAgICAgQ0NYVmVyc2lvbjsKKyAgICB0RG90MTFmSUVQMlBJRU9wYXF1ZSAgICBQMlBJRU9wYXF1ZTsKK30gdERvdDExZkFzc29jUmVxdWVzdDsKKworI2RlZmluZSBET1QxMUZfQVNTT0NSRVFVRVNUICggNSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja0Fzc29jUmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQXNzb2NSZXF1ZXN0ICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tBc3NvY1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkFzc29jUmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQXNzb2NSZXF1ZXN0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQXNzb2NSZXF1ZXN0ICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZBc3NvY1Jlc3BvbnNleworICAgIHREb3QxMWZGZkNhcGFiaWxpdGllcyAgIENhcGFiaWxpdGllczsKKyAgICB0RG90MTFmRmZTdGF0dXMgICAgICAgICBTdGF0dXM7CisgICAgdERvdDExZkZmQUlEICAgICAgICAgICAgQUlEOworICAgIHREb3QxMWZJRVN1cHBSYXRlcyAgICAgIFN1cHBSYXRlczsKKyAgICB0RG90MTFmSUVFeHRTdXBwUmF0ZXMgICBFeHRTdXBwUmF0ZXM7CisgICAgdERvdDExZklFRURDQVBhcmFtU2V0ICAgRURDQVBhcmFtU2V0OworICAgIHREb3QxMWZJRVJDUElJRSAgICAgICAgIFJDUElJRTsKKyAgICB0RG90MTFmSUVSU05JSUUgICAgICAgICBSU05JSUU7CisgICAgdERvdDExZklFUlJNRW5hYmxlZENhcCAgUlJNRW5hYmxlZENhcDsKKyAgICB0RG90MTFmSUVNb2JpbGl0eURvbWFpbiBNb2JpbGl0eURvbWFpbjsKKyAgICB0RG90MTFmSUVGVEluZm8gICAgICAgICBGVEluZm87CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbnVtX1JJQ0RhdGFEZXNjOworICAgIHREb3QxMWZJRVJJQ0RhdGFEZXNjICAgIFJJQ0RhdGFEZXNjWzJdOworICAgIHREb3QxMWZJRVdQQSAgICAgICAgICAgIFdQQTsKKyAgICB0RG90MTFmSUVIVENhcHMgICAgICAgICBIVENhcHM7CisgICAgdERvdDExZklFSFRJbmZvICAgICAgICAgSFRJbmZvOworICAgIHREb3QxMWZJRVdNTVBhcmFtcyAgICAgIFdNTVBhcmFtczsKKyAgICB0RG90MTFmSUVXTU1DYXBzICAgICAgICBXTU1DYXBzOworICAgIHREb3QxMWZJRUNDWFJhZE1nbXRDYXAgIENDWFJhZE1nbXRDYXA7CisgICAgdERvdDExZklFQ0NYVHJhZlN0cm1NZXQgQ0NYVHJhZlN0cm1NZXQ7CisgICAgdERvdDExZklFQ0NYVHhtaXRQb3dlciAgQ0NYVHhtaXRQb3dlcjsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBudW1fV01NVFNQRUM7CisgICAgdERvdDExZklFV01NVFNQRUMgICAgICAgV01NVFNQRUNbNF07CisgICAgdERvdDExZklFQWlyZ28gICAgICAgICAgQWlyZ287CisgICAgdERvdDExZklFV3NjQXNzb2NSZXMgICAgV3NjQXNzb2NSZXM7CisgICAgdERvdDExZklFUDJQQXNzb2NSZXMgICAgUDJQQXNzb2NSZXM7Cit9IHREb3QxMWZBc3NvY1Jlc3BvbnNlOworCisjZGVmaW5lIERPVDExRl9BU1NPQ1JFU1BPTlNFICggNiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja0Fzc29jUmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkFzc29jUmVzcG9uc2UgKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja0Fzc29jUmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkFzc29jUmVzcG9uc2UgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZEFzc29jUmVzcG9uc2VTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBc3NvY1Jlc3BvbnNlICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZBdXRoZW50aWNhdGlvbnsKKyAgICB0RG90MTFmRmZBdXRoQWxnbyAgICAgICAgICBBdXRoQWxnbzsKKyAgICB0RG90MTFmRmZBdXRoU2VxTm8gICAgICAgICBBdXRoU2VxTm87CisgICAgdERvdDExZkZmU3RhdHVzICAgICAgICAgICAgU3RhdHVzOworICAgIHREb3QxMWZJRUNoYWxsZW5nZVRleHQgICAgIENoYWxsZW5nZVRleHQ7CisgICAgdERvdDExZklFUlNOT3BhcXVlICAgICAgICAgUlNOT3BhcXVlOworICAgIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluICAgIE1vYmlsaXR5RG9tYWluOworICAgIHREb3QxMWZJRUZUSW5mbyAgICAgICAgICAgIEZUSW5mbzsKKyAgICB0RG90MTFmSUVGVFRpbWVvdXRJbnRlcnZhbCBGVFRpbWVvdXRJbnRlcnZhbDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICBudW1fUklDRGF0YURlc2M7CisgICAgdERvdDExZklFUklDRGF0YURlc2MgICAgICAgUklDRGF0YURlc2NbMl07Cit9IHREb3QxMWZBdXRoZW50aWNhdGlvbjsKKworI2RlZmluZSBET1QxMUZfQVVUSEVOVElDQVRJT04gKCA3ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrQXV0aGVudGljYXRpb24odHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkF1dGhlbnRpY2F0aW9uICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tBdXRoZW50aWNhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQXV0aGVudGljYXRpb24gKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZEF1dGhlbnRpY2F0aW9uU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQXV0aGVudGljYXRpb24gKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkJlYWNvbnsKKyAgICB0RG90MTFmRmZUaW1lU3RhbXAgICAgICAgIFRpbWVTdGFtcDsKKyAgICB0RG90MTFmRmZCZWFjb25JbnRlcnZhbCAgIEJlYWNvbkludGVydmFsOworICAgIHREb3QxMWZGZkNhcGFiaWxpdGllcyAgICAgQ2FwYWJpbGl0aWVzOworICAgIHREb3QxMWZJRVNTSUQgICAgICAgICAgICAgU1NJRDsKKyAgICB0RG90MTFmSUVTdXBwUmF0ZXMgICAgICAgIFN1cHBSYXRlczsKKyAgICB0RG90MTFmSUVGSFBhcmFtU2V0ICAgICAgIEZIUGFyYW1TZXQ7CisgICAgdERvdDExZklFRFNQYXJhbXMgICAgICAgICBEU1BhcmFtczsKKyAgICB0RG90MTFmSUVDRlBhcmFtcyAgICAgICAgIENGUGFyYW1zOworICAgIHREb3QxMWZJRUlCU1NQYXJhbXMgICAgICAgSUJTU1BhcmFtczsKKyAgICB0RG90MTFmSUVUSU0gICAgICAgICAgICAgIFRJTTsKKyAgICB0RG90MTFmSUVDb3VudHJ5ICAgICAgICAgIENvdW50cnk7CisgICAgdERvdDExZklFRkhQYXJhbXMgICAgICAgICBGSFBhcmFtczsKKyAgICB0RG90MTFmSUVGSFBhdHRUYWJsZSAgICAgIEZIUGF0dFRhYmxlOworICAgIHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgUG93ZXJDb25zdHJhaW50czsKKyAgICB0RG90MTFmSUVDaGFuU3dpdGNoQW5uICAgIENoYW5Td2l0Y2hBbm47CisgICAgdERvdDExZklFUXVpZXQgICAgICAgICAgICBRdWlldDsKKyAgICB0RG90MTFmSUVUUENSZXBvcnQgICAgICAgIFRQQ1JlcG9ydDsKKyAgICB0RG90MTFmSUVFUlBJbmZvICAgICAgICAgIEVSUEluZm87CisgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICAgICBFeHRTdXBwUmF0ZXM7CisgICAgdERvdDExZklFUlNOICAgICAgICAgICAgICBSU047CisgICAgdERvdDExZklFUUJTU0xvYWQgICAgICAgICBRQlNTTG9hZDsKKyAgICB0RG90MTFmSUVFRENBUGFyYW1TZXQgICAgIEVEQ0FQYXJhbVNldDsKKyAgICB0RG90MTFmSUVRT1NDYXBzQXAgICAgICAgIFFPU0NhcHNBcDsKKyAgICB0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQgIEFQQ2hhbm5lbFJlcG9ydDsKKyAgICB0RG90MTFmSUVSUk1FbmFibGVkQ2FwICAgIFJSTUVuYWJsZWRDYXA7CisgICAgdERvdDExZklFTW9iaWxpdHlEb21haW4gICBNb2JpbGl0eURvbWFpbjsKKyAgICB0RG90MTFmSUVXUEEgICAgICAgICAgICAgIFdQQTsKKyAgICB0RG90MTFmSUVIVENhcHMgICAgICAgICAgIEhUQ2FwczsKKyAgICB0RG90MTFmSUVIVEluZm8gICAgICAgICAgIEhUSW5mbzsKKyAgICB0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uIEV4dENoYW5Td2l0Y2hBbm47CisgICAgdERvdDExZklFV01NSW5mb0FwICAgICAgICBXTU1JbmZvQXA7CisgICAgdERvdDExZklFV01NUGFyYW1zICAgICAgICBXTU1QYXJhbXM7CisgICAgdERvdDExZklFV01NQ2FwcyAgICAgICAgICBXTU1DYXBzOworICAgIHREb3QxMWZJRVdBUEkgICAgICAgICAgICAgV0FQSTsKKyAgICB0RG90MTFmSUVDQ1hSYWRNZ210Q2FwICAgIENDWFJhZE1nbXRDYXA7CisgICAgdERvdDExZklFQ0NYVHJhZlN0cm1NZXQgICBDQ1hUcmFmU3RybU1ldDsKKyAgICB0RG90MTFmSUVDQ1hUeG1pdFBvd2VyICAgIENDWFR4bWl0UG93ZXI7CisgICAgdERvdDExZklFQWlyZ28gICAgICAgICAgICBBaXJnbzsKKyAgICB0RG90MTFmSUVXc2NCZWFjb24gICAgICAgIFdzY0JlYWNvbjsKKyAgICB0RG90MTFmSUVQMlBCZWFjb24gICAgICAgIFAyUEJlYWNvbjsKK30gdERvdDExZkJlYWNvbjsKKworI2RlZmluZSBET1QxMUZfQkVBQ09OICggOCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja0JlYWNvbih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQmVhY29uICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tCZWFjb24odHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkJlYWNvbiAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQmVhY29uU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQmVhY29uICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZCZWFjb24xeworICAgIHREb3QxMWZGZlRpbWVTdGFtcCAgICAgIFRpbWVTdGFtcDsKKyAgICB0RG90MTFmRmZCZWFjb25JbnRlcnZhbCBCZWFjb25JbnRlcnZhbDsKKyAgICB0RG90MTFmRmZDYXBhYmlsaXRpZXMgICBDYXBhYmlsaXRpZXM7CisgICAgdERvdDExZklFU1NJRCAgICAgICAgICAgU1NJRDsKKyAgICB0RG90MTFmSUVTdXBwUmF0ZXMgICAgICBTdXBwUmF0ZXM7CisgICAgdERvdDExZklFRFNQYXJhbXMgICAgICAgRFNQYXJhbXM7CisgICAgdERvdDExZklFSUJTU1BhcmFtcyAgICAgSUJTU1BhcmFtczsKK30gdERvdDExZkJlYWNvbjE7CisKKyNkZWZpbmUgRE9UMTFGX0JFQUNPTjEgKCA5ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrQmVhY29uMSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQmVhY29uMSAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrQmVhY29uMSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQmVhY29uMSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQmVhY29uMVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkJlYWNvbjEgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkJlYWNvbjJ7CisgICAgdERvdDExZklFQ291bnRyeSAgICAgICAgICBDb3VudHJ5OworICAgIHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgUG93ZXJDb25zdHJhaW50czsKKyAgICB0RG90MTFmSUVDaGFuU3dpdGNoQW5uICAgIENoYW5Td2l0Y2hBbm47CisgICAgdERvdDExZklFUXVpZXQgICAgICAgICAgICBRdWlldDsKKyAgICB0RG90MTFmSUVUUENSZXBvcnQgICAgICAgIFRQQ1JlcG9ydDsKKyAgICB0RG90MTFmSUVFUlBJbmZvICAgICAgICAgIEVSUEluZm87CisgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICAgICBFeHRTdXBwUmF0ZXM7CisgICAgdERvdDExZklFUlNOICAgICAgICAgICAgICBSU047CisgICAgdERvdDExZklFRURDQVBhcmFtU2V0ICAgICBFRENBUGFyYW1TZXQ7CisgICAgdERvdDExZklFQVBDaGFubmVsUmVwb3J0ICBBUENoYW5uZWxSZXBvcnQ7CisgICAgdERvdDExZklFUlJNRW5hYmxlZENhcCAgICBSUk1FbmFibGVkQ2FwOworICAgIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluICAgTW9iaWxpdHlEb21haW47CisgICAgdERvdDExZklFV1BBICAgICAgICAgICAgICBXUEE7CisgICAgdERvdDExZklFSFRDYXBzICAgICAgICAgICBIVENhcHM7CisgICAgdERvdDExZklFSFRJbmZvICAgICAgICAgICBIVEluZm87CisgICAgdERvdDExZklFRXh0Q2hhblN3aXRjaEFubiBFeHRDaGFuU3dpdGNoQW5uOworICAgIHREb3QxMWZJRVdNTUluZm9BcCAgICAgICAgV01NSW5mb0FwOworICAgIHREb3QxMWZJRVdNTVBhcmFtcyAgICAgICAgV01NUGFyYW1zOworICAgIHREb3QxMWZJRVdNTUNhcHMgICAgICAgICAgV01NQ2FwczsKKyAgICB0RG90MTFmSUVBaXJnbyAgICAgICAgICAgIEFpcmdvOworICAgIHREb3QxMWZJRVdzY0JlYWNvbiAgICAgICAgV3NjQmVhY29uOworICAgIHREb3QxMWZJRVdBUEkgICAgICAgICAgICAgV0FQSTsKKyAgICB0RG90MTFmSUVDQ1hSYWRNZ210Q2FwICAgIENDWFJhZE1nbXRDYXA7CisgICAgdERvdDExZklFQ0NYVHJhZlN0cm1NZXQgICBDQ1hUcmFmU3RybU1ldDsKKyAgICB0RG90MTFmSUVDQ1hUeG1pdFBvd2VyICAgIENDWFR4bWl0UG93ZXI7CisgICAgdERvdDExZklFUDJQQmVhY29uICAgICAgICBQMlBCZWFjb247Cit9IHREb3QxMWZCZWFjb24yOworCisjZGVmaW5lIERPVDExRl9CRUFDT04yICggMTAgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tCZWFjb24yKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZCZWFjb24yICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tCZWFjb24yKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZCZWFjb24yICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRCZWFjb24yU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQmVhY29uMiAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmQmVhY29uSUVzeworICAgIHREb3QxMWZJRVNTSUQgICAgICAgICAgICAgIFNTSUQ7CisgICAgdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgU3VwcFJhdGVzOworICAgIHREb3QxMWZJRUZIUGFyYW1TZXQgICAgICAgIEZIUGFyYW1TZXQ7CisgICAgdERvdDExZklFRFNQYXJhbXMgICAgICAgICAgRFNQYXJhbXM7CisgICAgdERvdDExZklFQ0ZQYXJhbXMgICAgICAgICAgQ0ZQYXJhbXM7CisgICAgdERvdDExZklFSUJTU1BhcmFtcyAgICAgICAgSUJTU1BhcmFtczsKKyAgICB0RG90MTFmSUVUSU0gICAgICAgICAgICAgICBUSU07CisgICAgdERvdDExZklFQ291bnRyeSAgICAgICAgICAgQ291bnRyeTsKKyAgICB0RG90MTFmSUVGSFBhcmFtcyAgICAgICAgICBGSFBhcmFtczsKKyAgICB0RG90MTFmSUVGSFBhdHRUYWJsZSAgICAgICBGSFBhdHRUYWJsZTsKKyAgICB0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzICBQb3dlckNvbnN0cmFpbnRzOworICAgIHREb3QxMWZJRUNoYW5Td2l0Y2hBbm4gICAgIENoYW5Td2l0Y2hBbm47CisgICAgdERvdDExZklFUXVpZXQgICAgICAgICAgICAgUXVpZXQ7CisgICAgdERvdDExZklFVFBDUmVwb3J0ICAgICAgICAgVFBDUmVwb3J0OworICAgIHREb3QxMWZJRUVSUEluZm8gICAgICAgICAgIEVSUEluZm87CisgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICAgICAgRXh0U3VwcFJhdGVzOworICAgIHREb3QxMWZJRVJTTiAgICAgICAgICAgICAgIFJTTjsKKyAgICB0RG90MTFmSUVRQlNTTG9hZCAgICAgICAgICBRQlNTTG9hZDsKKyAgICB0RG90MTFmSUVFRENBUGFyYW1TZXQgICAgICBFRENBUGFyYW1TZXQ7CisgICAgdERvdDExZklFUU9TQ2Fwc0FwICAgICAgICAgUU9TQ2Fwc0FwOworICAgIHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCAgIEFQQ2hhbm5lbFJlcG9ydDsKKyAgICB0RG90MTFmSUVSUk1FbmFibGVkQ2FwICAgICBSUk1FbmFibGVkQ2FwOworICAgIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluICAgIE1vYmlsaXR5RG9tYWluOworICAgIHREb3QxMWZJRVdQQSAgICAgICAgICAgICAgIFdQQTsKKyAgICB0RG90MTFmSUVIVENhcHMgICAgICAgICAgICBIVENhcHM7CisgICAgdERvdDExZklFSFRJbmZvICAgICAgICAgICAgSFRJbmZvOworICAgIHREb3QxMWZJRUV4dENoYW5Td2l0Y2hBbm4gIEV4dENoYW5Td2l0Y2hBbm47CisgICAgdERvdDExZklFV01NSW5mb0FwICAgICAgICAgV01NSW5mb0FwOworICAgIHREb3QxMWZJRVdNTVBhcmFtcyAgICAgICAgIFdNTVBhcmFtczsKKyAgICB0RG90MTFmSUVXTU1DYXBzICAgICAgICAgICBXTU1DYXBzOworICAgIHREb3QxMWZJRVdBUEkgICAgICAgICAgICAgIFdBUEk7CisgICAgdERvdDExZklFQ0NYVmVyc2lvbiAgICAgICAgQ0NYVmVyc2lvbjsKKyAgICB0RG90MTFmSUVDQ1hSYWRNZ210Q2FwICAgICBDQ1hSYWRNZ210Q2FwOworICAgIHREb3QxMWZJRUNDWFRyYWZTdHJtTWV0ICAgIENDWFRyYWZTdHJtTWV0OworICAgIHREb3QxMWZJRUNDWFR4bWl0UG93ZXIgICAgIENDWFR4bWl0UG93ZXI7CisgICAgdERvdDExZklFQWlyZ28gICAgICAgICAgICAgQWlyZ287CisgICAgdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMgV3NjQmVhY29uUHJvYmVSZXM7CisgICAgdERvdDExZklFUDJQQmVhY29uUHJvYmVSZXMgUDJQQmVhY29uUHJvYmVSZXM7Cit9IHREb3QxMWZCZWFjb25JRXM7CisKKyNkZWZpbmUgRE9UMTFGX0JFQUNPTklFUyAoIDExICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrQmVhY29uSUVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZCZWFjb25JRXMgKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja0JlYWNvbklFcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQmVhY29uSUVzICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRCZWFjb25JRXNTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZCZWFjb25JRXMgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkNoYW5uZWxTd2l0Y2h7CisgICAgdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmSUVDaGFuU3dpdGNoQW5uICAgIENoYW5Td2l0Y2hBbm47CisgICAgdERvdDExZklFRXh0Q2hhblN3aXRjaEFubiBFeHRDaGFuU3dpdGNoQW5uOworfSB0RG90MTFmQ2hhbm5lbFN3aXRjaDsKKworI2RlZmluZSBET1QxMUZfQ0hBTk5FTFNXSVRDSCAoIDEyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrQ2hhbm5lbFN3aXRjaCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQ2hhbm5lbFN3aXRjaCAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrQ2hhbm5lbFN3aXRjaCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQ2hhbm5lbFN3aXRjaCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQ2hhbm5lbFN3aXRjaFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkNoYW5uZWxTd2l0Y2ggKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkRlQXV0aHsKKyAgICB0RG90MTFmRmZSZWFzb24gICAgUmVhc29uOworICAgIHREb3QxMWZJRVAyUERlQXV0aCBQMlBEZUF1dGg7Cit9IHREb3QxMWZEZUF1dGg7CisKKyNkZWZpbmUgRE9UMTFGX0RFQVVUSCAoIDEzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrRGVBdXRoKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZEZUF1dGggKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja0RlQXV0aCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmRGVBdXRoICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWREZUF1dGhTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZEZUF1dGggKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkRlbEJBSW5keworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZEZWxCQVBhcmFtZXRlclNldCBEZWxCQVBhcmFtZXRlclNldDsKKyAgICB0RG90MTFmRmZSZWFzb24gICAgICAgICAgICBSZWFzb247Cit9IHREb3QxMWZEZWxCQUluZDsKKworI2RlZmluZSBET1QxMUZfREVMQkFJTkQgKCAxNCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja0RlbEJBSW5kKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZEZWxCQUluZCAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrRGVsQkFJbmQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkRlbEJBSW5kICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWREZWxCQUluZFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkRlbEJBSW5kICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZEZWxUU3sKKyAgICB0RG90MTFmRmZDYXRlZ29yeSBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICBBY3Rpb247CisgICAgdERvdDExZkZmVFNJbmZvICAgVFNJbmZvOworICAgIHREb3QxMWZGZlJlYXNvbiAgIFJlYXNvbjsKK30gdERvdDExZkRlbFRTOworCisjZGVmaW5lIERPVDExRl9ERUxUUyAoIDE1ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrRGVsVFModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkRlbFRTICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tEZWxUUyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmRGVsVFMgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZERlbFRTU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmRGVsVFMgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcXsKKyAgICB0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnk7CisgICAgdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZQMlBPVUkgICAgICAgICAgICAgICAgICAgICAgUDJQT1VJOworICAgIHREb3QxMWZGZlAyUE9VSVN1YlR5cGUgICAgICAgICAgICAgICBQMlBPVUlTdWJUeXBlOworICAgIHREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICAgICAgICAgICBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEgUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxOworfSB0RG90MTFmRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxOworCisjZGVmaW5lIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEgKCAxNiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja0RldmljZURpc2NvdmVyYWJpbGl0eVJlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXN7CisgICAgdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICAgICAgICAgICBBY3Rpb247CisgICAgdERvdDExZkZmUDJQT1VJICAgICAgICAgICAgICAgICAgICAgIFAyUE9VSTsKKyAgICB0RG90MTFmRmZQMlBPVUlTdWJUeXBlICAgICAgICAgICAgICAgUDJQT1VJU3ViVHlwZTsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgICAgICAgRGlhbG9nVG9rZW47CisgICAgdERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzIFAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlczsKK30gdERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlczsKKworI2RlZmluZSBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTICggMTcgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcyAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZERldmljZURpc2NvdmVyYWJpbGl0eVJlc1NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcyAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmRGlzYXNzb2NpYXRpb257CisgICAgdERvdDExZkZmUmVhc29uICAgICAgUmVhc29uOworICAgIHREb3QxMWZJRVAyUERpc0Fzc29jIFAyUERpc0Fzc29jOworfSB0RG90MTFmRGlzYXNzb2NpYXRpb247CisKKyNkZWZpbmUgRE9UMTFGX0RJU0FTU09DSUFUSU9OICggMTggKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tEaXNhc3NvY2lhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmRGlzYXNzb2NpYXRpb24gKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja0Rpc2Fzc29jaWF0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZEaXNhc3NvY2lhdGlvbiAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkRGlzYXNzb2NpYXRpb25TaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZEaXNhc3NvY2lhdGlvbiAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmR09EaXNjb3ZlcmFiaWxpdHlSZXF7CisgICAgdERvdDExZkZmQ2F0ZWdvcnkgICAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZQMlBPVUkgICAgICAgIFAyUE9VSTsKKyAgICB0RG90MTFmRmZQMlBPVUlTdWJUeXBlIFAyUE9VSVN1YlR5cGU7CisgICAgdERvdDExZkZmRGlhbG9nVG9rZW4gICBEaWFsb2dUb2tlbjsKK30gdERvdDExZkdPRGlzY292ZXJhYmlsaXR5UmVxOworCisjZGVmaW5lIERPVDExRl9HT0RJU0NPVkVSQUJJTElUWVJFUSAoIDE5ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrR09EaXNjb3ZlcmFiaWxpdHlSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkdPRGlzY292ZXJhYmlsaXR5UmVxICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tHT0Rpc2NvdmVyYWJpbGl0eVJlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmR09EaXNjb3ZlcmFiaWxpdHlSZXEgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZEdPRGlzY292ZXJhYmlsaXR5UmVxU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmR09EaXNjb3ZlcmFiaWxpdHlSZXEgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkdPTmVnQ25meworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgQ2F0ZWdvcnk7CisgICAgdERvdDExZkZmQWN0aW9uICAgICAgICBBY3Rpb247CisgICAgdERvdDExZkZmUDJQT1VJICAgICAgICBQMlBPVUk7CisgICAgdERvdDExZkZmUDJQT1VJU3ViVHlwZSBQMlBPVUlTdWJUeXBlOworICAgIHREb3QxMWZGZkRpYWxvZ1Rva2VuICAgRGlhbG9nVG9rZW47CisgICAgdERvdDExZklFUDJQR09OZWdDbmYgICBQMlBHT05lZ0NuZjsKK30gdERvdDExZkdPTmVnQ25mOworCisjZGVmaW5lIERPVDExRl9HT05FR0NORiAoIDIwICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrR09OZWdDbmYodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkdPTmVnQ25mICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tHT05lZ0NuZih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmR09OZWdDbmYgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZEdPTmVnQ25mU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmR09OZWdDbmYgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkdPTmVnUmVxeworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgQ2F0ZWdvcnk7CisgICAgdERvdDExZkZmQWN0aW9uICAgICAgICBBY3Rpb247CisgICAgdERvdDExZkZmUDJQT1VJICAgICAgICBQMlBPVUk7CisgICAgdERvdDExZkZmUDJQT1VJU3ViVHlwZSBQMlBPVUlTdWJUeXBlOworICAgIHREb3QxMWZGZkRpYWxvZ1Rva2VuICAgRGlhbG9nVG9rZW47CisgICAgdERvdDExZklFUDJQR09OZWdXUFMgICBQMlBHT05lZ1dQUzsKKyAgICB0RG90MTFmSUVQMlBHT05lZ1JlcSAgIFAyUEdPTmVnUmVxOworfSB0RG90MTFmR09OZWdSZXE7CisKKyNkZWZpbmUgRE9UMTFGX0dPTkVHUkVRICggMjEgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tHT05lZ1JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmR09OZWdSZXEgKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja0dPTmVnUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZHT05lZ1JlcSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkR09OZWdSZXFTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZHT05lZ1JlcSAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmR09OZWdSZXN7CisgICAgdERvdDExZkZmQ2F0ZWdvcnkgICAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZQMlBPVUkgICAgICAgIFAyUE9VSTsKKyAgICB0RG90MTFmRmZQMlBPVUlTdWJUeXBlIFAyUE9VSVN1YlR5cGU7CisgICAgdERvdDExZkZmRGlhbG9nVG9rZW4gICBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmSUVQMlBHT05lZ1dQUyAgIFAyUEdPTmVnV1BTOworICAgIHREb3QxMWZJRVAyUEdPTmVnUmVzICAgUDJQR09OZWdSZXM7Cit9IHREb3QxMWZHT05lZ1JlczsKKworI2RlZmluZSBET1QxMUZfR09ORUdSRVMgKCAyMiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja0dPTmVnUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZHT05lZ1JlcyAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrR09OZWdSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkdPTmVnUmVzICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRHT05lZ1Jlc1NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkdPTmVnUmVzICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZJbnZpdGF0aW9uUmVxeworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgQ2F0ZWdvcnk7CisgICAgdERvdDExZkZmQWN0aW9uICAgICAgICAgICBBY3Rpb247CisgICAgdERvdDExZkZmUDJQT1VJICAgICAgICAgICBQMlBPVUk7CisgICAgdERvdDExZkZmUDJQT1VJU3ViVHlwZSAgICBQMlBPVUlTdWJUeXBlOworICAgIHREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgRGlhbG9nVG9rZW47CisgICAgdERvdDExZklFUDJQSW52aXRhdGlvblJlcSBQMlBJbnZpdGF0aW9uUmVxOworfSB0RG90MTFmSW52aXRhdGlvblJlcTsKKworI2RlZmluZSBET1QxMUZfSU5WSVRBVElPTlJFUSAoIDIzICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSW52aXRhdGlvblJlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmSW52aXRhdGlvblJlcSAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrSW52aXRhdGlvblJlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSW52aXRhdGlvblJlcSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSW52aXRhdGlvblJlcVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkludml0YXRpb25SZXEgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZkludml0YXRpb25SZXN7CisgICAgdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZQMlBPVUkgICAgICAgICAgIFAyUE9VSTsKKyAgICB0RG90MTFmRmZQMlBPVUlTdWJUeXBlICAgIFAyUE9VSVN1YlR5cGU7CisgICAgdERvdDExZkZmRGlhbG9nVG9rZW4gICAgICBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVzIFAyUEludml0YXRpb25SZXM7Cit9IHREb3QxMWZJbnZpdGF0aW9uUmVzOworCisjZGVmaW5lIERPVDExRl9JTlZJVEFUSU9OUkVTICggMjQgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJbnZpdGF0aW9uUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZJbnZpdGF0aW9uUmVzICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tJbnZpdGF0aW9uUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJbnZpdGF0aW9uUmVzICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJbnZpdGF0aW9uUmVzU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSW52aXRhdGlvblJlcyAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0eworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmRmZUUENFbGVJRCAgICBUUENFbGVJRDsKKyAgICB0RG90MTFmRmZUUENFbGVMZW4gICBUUENFbGVMZW47CisgICAgdERvdDExZkZmVHhQb3dlciAgICAgVHhQb3dlcjsKKyAgICB0RG90MTFmRmZMaW5rTWFyZ2luICBMaW5rTWFyZ2luOworICAgIHREb3QxMWZGZlJ4QW50ZW5uYUlkIFJ4QW50ZW5uYUlkOworICAgIHREb3QxMWZGZlR4QW50ZW5uYUlkIFR4QW50ZW5uYUlkOworICAgIHREb3QxMWZGZlJDUEkgICAgICAgIFJDUEk7CisgICAgdERvdDExZkZmUlNOSSAgICAgICAgUlNOSTsKK30gdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydDsKKworI2RlZmluZSBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUICggMjUgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tMaW5rTWVhc3VyZW1lbnRSZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrTGlua01lYXN1cmVtZW50UmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZExpbmtNZWFzdXJlbWVudFJlcG9ydFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdHsKKyAgICB0RG90MTFmRmZDYXRlZ29yeSAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICBBY3Rpb247CisgICAgdERvdDExZkZmRGlhbG9nVG9rZW4gRGlhbG9nVG9rZW47CisgICAgdERvdDExZkZmVHhQb3dlciAgICAgVHhQb3dlcjsKKyAgICB0RG90MTFmRmZNYXhUeFBvd2VyICBNYXhUeFBvd2VyOworfSB0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdDsKKworI2RlZmluZSBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCAoIDI2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrTGlua01lYXN1cmVtZW50UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrTGlua01lYXN1cmVtZW50UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkTGlua01lYXN1cmVtZW50UmVxdWVzdFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcXVlc3QgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZk1lYXN1cmVtZW50UmVwb3J0eworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCBNZWFzdXJlbWVudFJlcG9ydDsKK30gdERvdDExZk1lYXN1cmVtZW50UmVwb3J0OworCisjZGVmaW5lIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCAoIDI3ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrTWVhc3VyZW1lbnRSZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZk1lYXN1cmVtZW50UmVwb3J0ICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tNZWFzdXJlbWVudFJlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZE1lYXN1cmVtZW50UmVwb3J0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZk1lYXN1cmVtZW50UmVxdWVzdHsKKyAgICB0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgQ2F0ZWdvcnk7CisgICAgdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgRGlhbG9nVG9rZW47CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgIG51bV9NZWFzdXJlbWVudFJlcXVlc3Q7CisgICAgdERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0IE1lYXN1cmVtZW50UmVxdWVzdFs0XTsKK30gdERvdDExZk1lYXN1cmVtZW50UmVxdWVzdDsKKworI2RlZmluZSBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUICggMjggKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tNZWFzdXJlbWVudFJlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZk1lYXN1cmVtZW50UmVxdWVzdCAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrTWVhc3VyZW1lbnRSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZNZWFzdXJlbWVudFJlcXVlc3QgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZE1lYXN1cmVtZW50UmVxdWVzdFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZk1lYXN1cmVtZW50UmVxdWVzdCAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0eworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmSUVTU0lEICAgICAgICBTU0lEOworfSB0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0OworCisjZGVmaW5lIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFUVVFU1QgKCAyOSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja05laWdoYm9yUmVwb3J0UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0ICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tOZWlnaGJvclJlcG9ydFJlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZk5laWdoYm9yUmVwb3J0UmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkTmVpZ2hib3JSZXBvcnRSZXF1ZXN0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0ICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNleworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAgICBEaWFsb2dUb2tlbjsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBudW1fTmVpZ2hib3JSZXBvcnQ7CisgICAgdERvdDExZklFTmVpZ2hib3JSZXBvcnQgTmVpZ2hib3JSZXBvcnRbNF07Cit9IHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlOworCisjZGVmaW5lIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFICggMzAgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tOZWlnaGJvclJlcG9ydFJlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tOZWlnaGJvclJlcG9ydFJlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWROZWlnaGJvclJlcG9ydFJlc3BvbnNlU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXNwb25zZSAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmTm90aWNlT2ZBYnN7CisgICAgdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZlAyUE9VSSAgICAgICAgICAgICBQMlBPVUk7CisgICAgdERvdDExZkZmUDJQT1VJU3ViVHlwZSAgICAgIFAyUE9VSVN1YlR5cGU7CisgICAgdERvdDExZkZmRGlhbG9nVG9rZW4gICAgICAgIERpYWxvZ1Rva2VuOworICAgIHREb3QxMWZJRVAyUE5vdGljZU9mQWJzZW5jZSBQMlBOb3RpY2VPZkFic2VuY2U7Cit9IHREb3QxMWZOb3RpY2VPZkFiczsKKworI2RlZmluZSBET1QxMUZfTk9USUNFT0ZBQlMgKCAzMSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja05vdGljZU9mQWJzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZOb3RpY2VPZkFicyAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrTm90aWNlT2ZBYnModHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZk5vdGljZU9mQWJzICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWROb3RpY2VPZkFic1NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZk5vdGljZU9mQWJzICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZQcmVzZW5jZVJlcXsKKyAgICB0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgQ2F0ZWdvcnk7CisgICAgdERvdDExZkZmUDJQT1VJICAgICAgICAgICAgIFAyUE9VSTsKKyAgICB0RG90MTFmRmZQMlBPVUlTdWJUeXBlICAgICAgUDJQT1VJU3ViVHlwZTsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgRGlhbG9nVG9rZW47CisgICAgdERvdDExZklFUDJQTm90aWNlT2ZBYnNlbmNlIFAyUE5vdGljZU9mQWJzZW5jZTsKK30gdERvdDExZlByZXNlbmNlUmVxOworCisjZGVmaW5lIERPVDExRl9QUkVTRU5DRVJFUSAoIDMyICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrUHJlc2VuY2VSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZlByZXNlbmNlUmVxICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tQcmVzZW5jZVJlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUHJlc2VuY2VSZXEgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFByZXNlbmNlUmVxU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUHJlc2VuY2VSZXEgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlByZXNlbmNlUmVzeworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICAgQ2F0ZWdvcnk7CisgICAgdERvdDExZkZmUDJQT1VJICAgICAgICAgICAgICBQMlBPVUk7CisgICAgdERvdDExZkZmUDJQT1VJU3ViVHlwZSAgICAgICBQMlBPVUlTdWJUeXBlOworICAgIHREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICAgRGlhbG9nVG9rZW47CisgICAgdERvdDExZklFUDJQUHJlc2VuY2VSZXNwb25zZSBQMlBQcmVzZW5jZVJlc3BvbnNlOworfSB0RG90MTFmUHJlc2VuY2VSZXM7CisKKyNkZWZpbmUgRE9UMTFGX1BSRVNFTkNFUkVTICggMzMgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tQcmVzZW5jZVJlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmUHJlc2VuY2VSZXMgKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja1ByZXNlbmNlUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZQcmVzZW5jZVJlcyAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUHJlc2VuY2VSZXNTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZQcmVzZW5jZVJlcyAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmUHJvYmVSZXF1ZXN0eworICAgIHREb3QxMWZJRVNTSUQgICAgICAgICAgU1NJRDsKKyAgICB0RG90MTFmSUVTdXBwUmF0ZXMgICAgIFN1cHBSYXRlczsKKyAgICB0RG90MTFmSUVSZXF1ZXN0ZWRJbmZvIFJlcXVlc3RlZEluZm87CisgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICBFeHRTdXBwUmF0ZXM7CisgICAgdERvdDExZklFRFNQYXJhbXMgICAgICBEU1BhcmFtczsKKyAgICB0RG90MTFmSUVIVENhcHMgICAgICAgIEhUQ2FwczsKKyAgICB0RG90MTFmSUVXc2NQcm9iZVJlcSAgIFdzY1Byb2JlUmVxOworICAgIHREb3QxMWZJRVdGQVRQQyAgICAgICAgV0ZBVFBDOworICAgIHREb3QxMWZJRVAyUFByb2JlUmVxICAgUDJQUHJvYmVSZXE7Cit9IHREb3QxMWZQcm9iZVJlcXVlc3Q7CisKKyNkZWZpbmUgRE9UMTFGX1BST0JFUkVRVUVTVCAoIDM0ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrUHJvYmVSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZQcm9iZVJlcXVlc3QgKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja1Byb2JlUmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUHJvYmVSZXF1ZXN0ICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRQcm9iZVJlcXVlc3RTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZQcm9iZVJlcXVlc3QgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlByb2JlUmVzcG9uc2V7CisgICAgdERvdDExZkZmVGltZVN0YW1wICAgICAgICBUaW1lU3RhbXA7CisgICAgdERvdDExZkZmQmVhY29uSW50ZXJ2YWwgICBCZWFjb25JbnRlcnZhbDsKKyAgICB0RG90MTFmRmZDYXBhYmlsaXRpZXMgICAgIENhcGFiaWxpdGllczsKKyAgICB0RG90MTFmSUVTU0lEICAgICAgICAgICAgIFNTSUQ7CisgICAgdERvdDExZklFU3VwcFJhdGVzICAgICAgICBTdXBwUmF0ZXM7CisgICAgdERvdDExZklFRkhQYXJhbVNldCAgICAgICBGSFBhcmFtU2V0OworICAgIHREb3QxMWZJRURTUGFyYW1zICAgICAgICAgRFNQYXJhbXM7CisgICAgdERvdDExZklFQ0ZQYXJhbXMgICAgICAgICBDRlBhcmFtczsKKyAgICB0RG90MTFmSUVJQlNTUGFyYW1zICAgICAgIElCU1NQYXJhbXM7CisgICAgdERvdDExZklFQ291bnRyeSAgICAgICAgICBDb3VudHJ5OworICAgIHREb3QxMWZJRUZIUGFyYW1zICAgICAgICAgRkhQYXJhbXM7CisgICAgdERvdDExZklFRkhQYXR0VGFibGUgICAgICBGSFBhdHRUYWJsZTsKKyAgICB0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzIFBvd2VyQ29uc3RyYWludHM7CisgICAgdERvdDExZklFQ2hhblN3aXRjaEFubiAgICBDaGFuU3dpdGNoQW5uOworICAgIHREb3QxMWZJRVF1aWV0ICAgICAgICAgICAgUXVpZXQ7CisgICAgdERvdDExZklFVFBDUmVwb3J0ICAgICAgICBUUENSZXBvcnQ7CisgICAgdERvdDExZklFRVJQSW5mbyAgICAgICAgICBFUlBJbmZvOworICAgIHREb3QxMWZJRUV4dFN1cHBSYXRlcyAgICAgRXh0U3VwcFJhdGVzOworICAgIHREb3QxMWZJRVJTTiAgICAgICAgICAgICAgUlNOOworICAgIHREb3QxMWZJRVFCU1NMb2FkICAgICAgICAgUUJTU0xvYWQ7CisgICAgdERvdDExZklFRURDQVBhcmFtU2V0ICAgICBFRENBUGFyYW1TZXQ7CisgICAgdERvdDExZklFUlJNRW5hYmxlZENhcCAgICBSUk1FbmFibGVkQ2FwOworICAgIHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCAgQVBDaGFubmVsUmVwb3J0OworICAgIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluICAgTW9iaWxpdHlEb21haW47CisgICAgdERvdDExZklFV1BBICAgICAgICAgICAgICBXUEE7CisgICAgdERvdDExZklFSFRDYXBzICAgICAgICAgICBIVENhcHM7CisgICAgdERvdDExZklFSFRJbmZvICAgICAgICAgICBIVEluZm87CisgICAgdERvdDExZklFRXh0Q2hhblN3aXRjaEFubiBFeHRDaGFuU3dpdGNoQW5uOworICAgIHREb3QxMWZJRVdNTUluZm9BcCAgICAgICAgV01NSW5mb0FwOworICAgIHREb3QxMWZJRVdNTVBhcmFtcyAgICAgICAgV01NUGFyYW1zOworICAgIHREb3QxMWZJRVdNTUNhcHMgICAgICAgICAgV01NQ2FwczsKKyAgICB0RG90MTFmSUVXQVBJICAgICAgICAgICAgIFdBUEk7CisgICAgdERvdDExZklFQ0NYUmFkTWdtdENhcCAgICBDQ1hSYWRNZ210Q2FwOworICAgIHREb3QxMWZJRUNDWFRyYWZTdHJtTWV0ICAgQ0NYVHJhZlN0cm1NZXQ7CisgICAgdERvdDExZklFQ0NYVHhtaXRQb3dlciAgICBDQ1hUeG1pdFBvd2VyOworICAgIHREb3QxMWZJRUFpcmdvICAgICAgICAgICAgQWlyZ287CisgICAgdERvdDExZklFV3NjUHJvYmVSZXMgICAgICBXc2NQcm9iZVJlczsKKyAgICB0RG90MTFmSUVQMlBQcm9iZVJlcyAgICAgIFAyUFByb2JlUmVzOworfSB0RG90MTFmUHJvYmVSZXNwb25zZTsKKworI2RlZmluZSBET1QxMUZfUFJPQkVSRVNQT05TRSAoIDM1ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrUHJvYmVSZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmUHJvYmVSZXNwb25zZSAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrUHJvYmVSZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUHJvYmVSZXNwb25zZSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUHJvYmVSZXNwb25zZVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlByb2JlUmVzcG9uc2UgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlByb3Zpc2lvbkRpc2NvdmVyeVJlcXsKKyAgICB0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICAgICAgICAgQ2F0ZWdvcnk7CisgICAgdERvdDExZkZmQWN0aW9uICAgICAgICAgICAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZQMlBPVUkgICAgICAgICAgICAgICAgICAgUDJQT1VJOworICAgIHREb3QxMWZGZlAyUE9VSVN1YlR5cGUgICAgICAgICAgICBQMlBPVUlTdWJUeXBlOworICAgIHREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICAgICAgICBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmSUVQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEgUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxOworfSB0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVxOworCisjZGVmaW5lIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEgKCAzNiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja1Byb3Zpc2lvbkRpc2NvdmVyeVJlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVxICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tQcm92aXNpb25EaXNjb3ZlcnlSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlByb3Zpc2lvbkRpc2NvdmVyeVJlcSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUHJvdmlzaW9uRGlzY292ZXJ5UmVxU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVxICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZQcm92aXNpb25EaXNjb3ZlcnlSZXN7CisgICAgdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICAgICAgICAgICBBY3Rpb247CisgICAgdERvdDExZkZmUDJQT1VJICAgICAgICAgICAgICAgICAgICAgIFAyUE9VSTsKKyAgICB0RG90MTFmRmZQMlBPVUlTdWJUeXBlICAgICAgICAgICAgICAgUDJQT1VJU3ViVHlwZTsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAgICAgICAgICAgICAgICAgRGlhbG9nVG9rZW47CisgICAgdERvdDExZklFUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzIFAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlczsKK30gdERvdDExZlByb3Zpc2lvbkRpc2NvdmVyeVJlczsKKworI2RlZmluZSBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTICggMzcgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tQcm92aXNpb25EaXNjb3ZlcnlSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZlByb3Zpc2lvbkRpc2NvdmVyeVJlcyAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrUHJvdmlzaW9uRGlzY292ZXJ5UmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZQcm92aXNpb25EaXNjb3ZlcnlSZXMgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFByb3Zpc2lvbkRpc2NvdmVyeVJlc1NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlByb3Zpc2lvbkRpc2NvdmVyeVJlcyAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydHsKKyAgICB0RG90MTFmRmZDYXRlZ29yeSAgICAgICAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICBBY3Rpb247CisgICAgdERvdDExZkZmRGlhbG9nVG9rZW4gICAgICAgRGlhbG9nVG9rZW47CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgbnVtX01lYXN1cmVtZW50UmVwb3J0OworICAgIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0IE1lYXN1cmVtZW50UmVwb3J0WzRdOworfSB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydDsKKworI2RlZmluZSBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCAoIDM4ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrUmFkaW9NZWFzdXJlbWVudFJlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydCAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrUmFkaW9NZWFzdXJlbWVudFJlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUmFkaW9NZWFzdXJlbWVudFJlcG9ydFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0eworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgICAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICAgICAgICAgQWN0aW9uOworICAgIHREb3QxMWZGZkRpYWxvZ1Rva2VuICAgICAgICBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmRmZOdW1PZlJlcGV0aXRpb25zICAgTnVtT2ZSZXBldGl0aW9uczsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgbnVtX01lYXN1cmVtZW50UmVxdWVzdDsKKyAgICB0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QgTWVhc3VyZW1lbnRSZXF1ZXN0WzJdOworfSB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3Q7CisKKyNkZWZpbmUgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUICggMzkgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tSYWRpb01lYXN1cmVtZW50UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QgKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUmFkaW9NZWFzdXJlbWVudFJlcXVlc3RTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmUmVBc3NvY1JlcXVlc3R7CisgICAgdERvdDExZkZmQ2FwYWJpbGl0aWVzICAgICAgIENhcGFiaWxpdGllczsKKyAgICB0RG90MTFmRmZMaXN0ZW5JbnRlcnZhbCAgICAgTGlzdGVuSW50ZXJ2YWw7CisgICAgdERvdDExZkZmQ3VycmVudEFQQWRkcmVzcyAgIEN1cnJlbnRBUEFkZHJlc3M7CisgICAgdERvdDExZklFU1NJRCAgICAgICAgICAgICAgIFNTSUQ7CisgICAgdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgIFN1cHBSYXRlczsKKyAgICB0RG90MTFmSUVFeHRTdXBwUmF0ZXMgICAgICAgRXh0U3VwcFJhdGVzOworICAgIHREb3QxMWZJRVBvd2VyQ2FwcyAgICAgICAgICBQb3dlckNhcHM7CisgICAgdERvdDExZklFU3VwcENoYW5uZWxzICAgICAgIFN1cHBDaGFubmVsczsKKyAgICB0RG90MTFmSUVSU05PcGFxdWUgICAgICAgICAgUlNOT3BhcXVlOworICAgIHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uICAgICBRT1NDYXBzU3RhdGlvbjsKKyAgICB0RG90MTFmSUVSUk1FbmFibGVkQ2FwICAgICAgUlJNRW5hYmxlZENhcDsKKyAgICB0RG90MTFmSUVNb2JpbGl0eURvbWFpbiAgICAgTW9iaWxpdHlEb21haW47CisgICAgdERvdDExZklFRlRJbmZvICAgICAgICAgICAgIEZUSW5mbzsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgbnVtX1JJQ0RhdGFEZXNjOworICAgIHREb3QxMWZJRVJJQ0RhdGFEZXNjICAgICAgICBSSUNEYXRhRGVzY1syXTsKKyAgICB0RG90MTFmSUVXUEFPcGFxdWUgICAgICAgICAgV1BBT3BhcXVlOworICAgIHREb3QxMWZJRUhUQ2FwcyAgICAgICAgICAgICBIVENhcHM7CisgICAgdERvdDExZklFV01NQ2FwcyAgICAgICAgICAgIFdNTUNhcHM7CisgICAgdERvdDExZklFV01NSW5mb1N0YXRpb24gICAgIFdNTUluZm9TdGF0aW9uOworICAgIHREb3QxMWZJRUFpcmdvICAgICAgICAgICAgICBBaXJnbzsKKyAgICB0RG90MTFmSUVXc2NJRU9wYXF1ZSAgICAgICAgV3NjSUVPcGFxdWU7CisgICAgdERvdDExZklFV0FQSU9wYXF1ZSAgICAgICAgIFdBUElPcGFxdWU7CisgICAgdERvdDExZklFQ0NYUmFkTWdtdENhcCAgICAgIENDWFJhZE1nbXRDYXA7CisgICAgdERvdDExZklFQ0NYVmVyc2lvbiAgICAgICAgIENDWFZlcnNpb247CisgICAgdERvdDExZklFQ0NYQ2NrbU9wYXF1ZSAgICAgIENDWENja21PcGFxdWU7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgIG51bV9XTU1UU1BFQzsKKyAgICB0RG90MTFmSUVXTU1UU1BFQyAgICAgICAgICAgV01NVFNQRUNbNF07CisgICAgdERvdDExZklFQ0NYVHJhZlN0cm1SYXRlU2V0IENDWFRyYWZTdHJtUmF0ZVNldDsKKyAgICB0RG90MTFmSUVQMlBJRU9wYXF1ZSAgICAgICAgUDJQSUVPcGFxdWU7Cit9IHREb3QxMWZSZUFzc29jUmVxdWVzdDsKKworI2RlZmluZSBET1QxMUZfUkVBU1NPQ1JFUVVFU1QgKCA0MCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja1JlQXNzb2NSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZSZUFzc29jUmVxdWVzdCAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrUmVBc3NvY1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlJlQXNzb2NSZXF1ZXN0ICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRSZUFzc29jUmVxdWVzdFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlJlQXNzb2NSZXF1ZXN0ICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZSZUFzc29jUmVzcG9uc2V7CisgICAgdERvdDExZkZmQ2FwYWJpbGl0aWVzICAgICAgIENhcGFiaWxpdGllczsKKyAgICB0RG90MTFmRmZTdGF0dXMgICAgICAgICAgICAgU3RhdHVzOworICAgIHREb3QxMWZGZkFJRCAgICAgICAgICAgICAgICBBSUQ7CisgICAgdERvdDExZklFU3VwcFJhdGVzICAgICAgICAgIFN1cHBSYXRlczsKKyAgICB0RG90MTFmSUVFeHRTdXBwUmF0ZXMgICAgICAgRXh0U3VwcFJhdGVzOworICAgIHREb3QxMWZJRUVEQ0FQYXJhbVNldCAgICAgICBFRENBUGFyYW1TZXQ7CisgICAgdERvdDExZklFUkNQSUlFICAgICAgICAgICAgIFJDUElJRTsKKyAgICB0RG90MTFmSUVSU05JSUUgICAgICAgICAgICAgUlNOSUlFOworICAgIHREb3QxMWZJRVJSTUVuYWJsZWRDYXAgICAgICBSUk1FbmFibGVkQ2FwOworICAgIHREb3QxMWZJRVJTTk9wYXF1ZSAgICAgICAgICBSU05PcGFxdWU7CisgICAgdERvdDExZklFTW9iaWxpdHlEb21haW4gICAgIE1vYmlsaXR5RG9tYWluOworICAgIHREb3QxMWZJRUZUSW5mbyAgICAgICAgICAgICBGVEluZm87CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgIG51bV9SSUNEYXRhRGVzYzsKKyAgICB0RG90MTFmSUVSSUNEYXRhRGVzYyAgICAgICAgUklDRGF0YURlc2NbMl07CisgICAgdERvdDExZklFV1BBICAgICAgICAgICAgICAgIFdQQTsKKyAgICB0RG90MTFmSUVIVENhcHMgICAgICAgICAgICAgSFRDYXBzOworICAgIHREb3QxMWZJRUhUSW5mbyAgICAgICAgICAgICBIVEluZm87CisgICAgdERvdDExZklFV01NUGFyYW1zICAgICAgICAgIFdNTVBhcmFtczsKKyAgICB0RG90MTFmSUVDQ1hSYWRNZ210Q2FwICAgICAgQ0NYUmFkTWdtdENhcDsKKyAgICB0RG90MTFmSUVDQ1hUcmFmU3RybU1ldCAgICAgQ0NYVHJhZlN0cm1NZXQ7CisgICAgdERvdDExZklFQ0NYVHhtaXRQb3dlciAgICAgIENDWFR4bWl0UG93ZXI7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgIG51bV9XTU1UU1BFQzsKKyAgICB0RG90MTFmSUVXTU1UU1BFQyAgICAgICAgICAgV01NVFNQRUNbNF07CisgICAgdERvdDExZklFQ0NYVHJhZlN0cm1SYXRlU2V0IENDWFRyYWZTdHJtUmF0ZVNldDsKKyAgICB0RG90MTFmSUVBaXJnbyAgICAgICAgICAgICAgQWlyZ287CisgICAgdERvdDExZklFV3NjUmVhc3NvY1JlcyAgICAgIFdzY1JlYXNzb2NSZXM7CisgICAgdERvdDExZklFUDJQQXNzb2NSZXMgICAgICAgIFAyUEFzc29jUmVzOworfSB0RG90MTFmUmVBc3NvY1Jlc3BvbnNlOworCisjZGVmaW5lIERPVDExRl9SRUFTU09DUkVTUE9OU0UgKCA0MSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja1JlQXNzb2NSZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmUmVBc3NvY1Jlc3BvbnNlICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tSZUFzc29jUmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlJlQXNzb2NSZXNwb25zZSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUmVBc3NvY1Jlc3BvbnNlU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUmVBc3NvY1Jlc3BvbnNlICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZTTVBvd2VyU2F2ZXsKKyAgICB0RG90MTFmRmZDYXRlZ29yeSAgICAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICAgICBBY3Rpb247CisgICAgdERvdDExZkZmU01Qb3dlck1vZGVTZXQgU01Qb3dlck1vZGVTZXQ7Cit9IHREb3QxMWZTTVBvd2VyU2F2ZTsKKworI2RlZmluZSBET1QxMUZfU01QT1dFUlNBVkUgKCA0MiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja1NNUG93ZXJTYXZlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZTTVBvd2VyU2F2ZSAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrU01Qb3dlclNhdmUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlNNUG93ZXJTYXZlICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCk7Cit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRTTVBvd2VyU2F2ZVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlNNUG93ZXJTYXZlICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZUUENSZXBvcnR7CisgICAgdERvdDExZkZmQ2F0ZWdvcnkgICAgQ2F0ZWdvcnk7CisgICAgdERvdDExZkZmQWN0aW9uICAgICAgQWN0aW9uOworICAgIHREb3QxMWZGZkRpYWxvZ1Rva2VuIERpYWxvZ1Rva2VuOworICAgIHREb3QxMWZJRVRQQ1JlcG9ydCAgIFRQQ1JlcG9ydDsKK30gdERvdDExZlRQQ1JlcG9ydDsKKworI2RlZmluZSBET1QxMUZfVFBDUkVQT1JUICggNDMgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUUENSZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZlRQQ1JlcG9ydCAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrVFBDUmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZUUENSZXBvcnQgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRQQ1JlcG9ydFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlRQQ1JlcG9ydCAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCBzRG90MTFmVFBDUmVxdWVzdHsKKyAgICB0RG90MTFmRmZDYXRlZ29yeSAgICBDYXRlZ29yeTsKKyAgICB0RG90MTFmRmZBY3Rpb24gICAgICBBY3Rpb247CisgICAgdERvdDExZkZmRGlhbG9nVG9rZW4gRGlhbG9nVG9rZW47CisgICAgdERvdDExZklFVFBDUmVxdWVzdCAgVFBDUmVxdWVzdDsKK30gdERvdDExZlRQQ1JlcXVlc3Q7CisKKyNkZWZpbmUgRE9UMTFGX1RQQ1JFUVVFU1QgKCA0NCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja1RQQ1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZlRQQ1JlcXVlc3QgKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja1RQQ1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlRQQ1JlcXVlc3QgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKTsKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFRQQ1JlcXVlc3RTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZUUENSZXF1ZXN0ICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZXTU1BZGRUU1JlcXVlc3R7CisgICAgdERvdDExZkZmQ2F0ZWdvcnkgICAgICAgICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgICAgICAgICBBY3Rpb247CisgICAgdERvdDExZkZmRGlhbG9nVG9rZW4gICAgICAgIERpYWxvZ1Rva2VuOworICAgIHREb3QxMWZGZlN0YXR1c0NvZGUgICAgICAgICBTdGF0dXNDb2RlOworICAgIHREb3QxMWZJRVdNTVRTUEVDICAgICAgICAgICBXTU1UU1BFQzsKKyAgICB0RG90MTFmSUVDQ1hUcmFmU3RybVJhdGVTZXQgQ0NYVHJhZlN0cm1SYXRlU2V0OworfSB0RG90MTFmV01NQWRkVFNSZXF1ZXN0OworCisjZGVmaW5lIERPVDExRl9XTU1BRERUU1JFUVVFU1QgKCA0NSApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogQysrICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja1dNTUFkZFRTUmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmV01NQWRkVFNSZXF1ZXN0ICpwRnJtKTsKK3RBTklfVTMyIGRvdDExZlBhY2tXTU1BZGRUU1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZldNTUFkZFRTUmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkV01NQWRkVFNSZXF1ZXN0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmV01NQWRkVFNSZXF1ZXN0ICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogRW5kIGV4dGVybiAiQyIuICovCisjZW5kaWYgLyogQysrICovCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMWZXTU1BZGRUU1Jlc3BvbnNleworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAgICBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmRmZTdGF0dXNDb2RlICAgICBTdGF0dXNDb2RlOworICAgIHREb3QxMWZJRVdNTVRTUEVDICAgICAgIFdNTVRTUEVDOworICAgIHREb3QxMWZJRUNDWFRyYWZTdHJtTWV0IENDWFRyYWZTdHJtTWV0OworfSB0RG90MTFmV01NQWRkVFNSZXNwb25zZTsKKworI2RlZmluZSBET1QxMUZfV01NQUREVFNSRVNQT05TRSAoIDQ2ICkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBDKysgKi8KKwordEFOSV9VMzIgZG90MTFmVW5wYWNrV01NQWRkVFNSZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmV01NQWRkVFNSZXNwb25zZSAqcEZybSk7Cit0QU5JX1UzMiBkb3QxMWZQYWNrV01NQWRkVFNSZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmV01NQWRkVFNSZXNwb25zZSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkV01NQWRkVFNSZXNwb25zZVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZldNTUFkZFRTUmVzcG9uc2UgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBFbmQgZXh0ZXJuICJDIi4gKi8KKyNlbmRpZiAvKiBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExZldNTURlbFRTeworICAgIHREb3QxMWZGZkNhdGVnb3J5ICAgIENhdGVnb3J5OworICAgIHREb3QxMWZGZkFjdGlvbiAgICAgIEFjdGlvbjsKKyAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiBEaWFsb2dUb2tlbjsKKyAgICB0RG90MTFmRmZTdGF0dXNDb2RlICBTdGF0dXNDb2RlOworICAgIHREb3QxMWZJRVdNTVRTUEVDICAgIFdNTVRTUEVDOworfSB0RG90MTFmV01NRGVsVFM7CisKKyNkZWZpbmUgRE9UMTFGX1dNTURFTFRTICggNDcgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIEMrKyAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tXTU1EZWxUUyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmV01NRGVsVFMgKnBGcm0pOwordEFOSV9VMzIgZG90MTFmUGFja1dNTURlbFRTKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZXTU1EZWxUUyAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpOwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkV01NRGVsVFNTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZXTU1EZWxUUyAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIEVuZCBleHRlcm4gIkMiLiAqLworI2VuZGlmIC8qIEMrKyAqLworCisjZW5kaWYgLyogRE9UMTFGX0ggKi8KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9pbmNsdWRlL2RwaEdsb2JhbC5oIGIvQ09SRS9NQUMvc3JjL2luY2x1ZGUvZHBoR2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlNWVkOQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL2RwaEdsb2JhbC5oCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19EUEhfR0xPQkFMX0hfXworI2RlZmluZSBfX0RQSF9HTE9CQUxfSF9fCisKKyNpbmNsdWRlICJsaW1HbG9iYWwuaCIKKy8vI2luY2x1ZGUgInBhcnNlckFwaS5oIgorI2luY2x1ZGUgInNpck1hY1Byb3REZWYuaCIKKyNpbmNsdWRlICJzaXJNYWNQcm9wRXh0cy5oIgorI2luY2x1ZGUgInNpckFwaS5oIgorCisvLy8gRm9sbG93aW5nIGRldGVybWluZXMgd2hldGhlciBzdGF0aXN0aWNzIGFyZSBtYWludGFpbmVkIG9yIG5vdAorI2RlZmluZSBEUEhfU1RBVFMKKworLy8vIHRyYWZmaWMgY2F0ZWdvcnkgbm90IGFsbG93ZWQKKyNkZWZpbmUgRFBIX1RJRF9OT1RBTExPV0VEICAgICAgICAgICAweEZGCisKKy8vLyBQZXJpb2RpY2l0eSBvZiBpbnZvY2F0aW9uIG9mIHJhdGUgYWRhcHRhdGlvbiAoaW4gbXMpCisjZGVmaW5lIERQSF9SQVRFX0FEQVBUQVRJT05fUEVSSU9EICAgICAyMAorCisvLyBSYXRlIGluZGljZXMKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzFfSU5ERVggICAgIDAKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzJfSU5ERVggICAgIDEKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzVfNV9JTkRFWCAgIDIKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzExX0lOREVYICAgIDMKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzZfSU5ERVggICAgIDQKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzlfSU5ERVggICAgIDUKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzEyX0lOREVYICAgIDYKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzE4X0lOREVYICAgIDcKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzI0X0lOREVYICAgIDgKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzM2X0lOREVYICAgIDkKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzQ4X0lOREVYICAgMTAKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzU0X0lOREVYICAgMTEKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzcyX0lOREVYICAgMTIKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzk2X0lOREVYICAgMTMKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzEwOF9JTkRFWCAgMTQKKyNkZWZpbmUgRFBIX1BIWV9SQVRFXzE0NF9JTkRFWCAgMTUKKyNkZWZpbmUgRFBIX1BIWV9SQVRFX01BWF9JTkRFWCAgMTYKKworLy8vIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBhIG1hbmFnZW1lbnQgcGFja2V0IHRvIGdvIG91dCAobXMpCisjZGVmaW5lIERQSF9NQVhfTUdNVF9XQUlUX1RJTUUgIDEwMDAwCisKKy8vLyBTdGVwIHNpemUgZm9yIHRoZSB3YWl0IHRpbWUgaGlzdG9ncmFtIChtcykKKyNkZWZpbmUgRFBIX1dBSVRfSElTVF9TVEVQIDIwCisKKy8vLyBOdW1iZXIgb2YgZW50cmllcyBpbiB3YWl0IHRpbWUgaGlzdG9ncmFtCisjZGVmaW5lIERQSF9XQUlUX0hJU1RfU0laRSAgMTAwCisKKy8vLyBUQ0lEIGZvciBNYW5hZ2VtZW50ICYgS2VlcCBBbGl2ZSBNZ210IGZyYW1lcworI2RlZmluZSBEUEhfTUdNVF9UQ0lEICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgRFBIX0tFRVBBTElWRV9QUk9CRV9SRVNQT05TRV9UQ0lEICAwCisKKy8vLyBTVEFJRCBmb3IgTWFuYWdlbWVudCBmcmFtZXMKKyNkZWZpbmUgRFBIX1VTRV9NR01UX1NUQUlEICAtMQorCisvLyBLZWVwIEFsaXZlIGZyYW1lcworI2RlZmluZSBEUEhfTk9OX0tFRVBBTElWRV9GUkFNRSAgMAorI2RlZmluZSBEUEhfS0VFUEFMSVZFX0ZSQU1FICAgICAgMQorCisvLy8gTWFzayBmb3Igc3VidHlwZSwgdHlwZSwgcHJvdG9jb2wgdmVyc2lvbiwgb3JkZXIgYW5kIHdlcCBmaWVsZHMgaW4gdGhlIG1hYyBmcmFtZSBjb250cm9sCisjZGVmaW5lIERQSF9GQ19CRF9GSUxMX01BU0sgIDB4RkZDQworCisvLy8gRW5hYmxlL0Rpc2FibGUgVHhvcCBnZW5lcmF0aW9uIGluIFRGUCBmb3IgSENGIG1vZGUKKyNkZWZpbmUgRFBIX0VOQUJMRV9IQ0ZfVFhPUF9HRU5fQVRfVEZQICAgMHgwMAorI2RlZmluZSBEUEhfRElTQUJMRV9IQ0ZfVFhPUF9HRU5fQVRfVEZQICAweDAyCisKKy8vLyBFbmFibGUvRGlzYWJsZSBUeG9wIGdlbmVyYXRpb24gaW4gVEZQIGZvciBFRENGIG1vZGUKKyNkZWZpbmUgRFBIX0VOQUJMRV9FRENGX1RYT1BfR0VOX0FUX1RGUCAgIDB4MDAKKyNkZWZpbmUgRFBIX0RJU0FCTEVfRURDRl9UWE9QX0dFTl9BVF9URlAgIDB4MDEKKworI2RlZmluZSBEUEhfRFVNUF9BTExfU1RBX0lEICAgICAtMQorI2RlZmluZSBEUEhfRFVNUF9SWF9CRCAgICAgICAgICAgMAorI2RlZmluZSBEUEhfRFVNUF9UWF9CRCAgICAgICAgICAgMQorI2RlZmluZSBEUEhfRFVNUF9UWF9NR01UX0JEICAgICAgMgorCisvL0RQSCBIYXNoIEluZGV4IGZvciBCU1MoU1RBJ3MgUGVlcikgb24gc3RhdGlvbi4KKyNkZWZpbmUgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIgICAxCisKK3R5cGVkZWYgc3RydWN0IHNEcGhSYXRlQmFzZWRDdHIKK3sKKyAgICB0QU5JX1UzMiBoaTsKKyAgICB0QU5JX1UzMiBsbzsKK30gdERwaFJhdGVCYXNlZEN0cjsKKwordHlwZWRlZiBzdHJ1Y3Qgc0RwaFBoeVJhdGVzCit7CisgICAgdEFOSV9VOCBkYXRhUmF0ZVgyOworICAgIHRBTklfVTggYWNrUmF0ZVgyOworICAgIHRBTklfVTggcnRzUmF0ZVgyOworfSB0RHBoUGh5UmF0ZXM7CisKK3R5cGVkZWYgc3RydWN0IHNEcGhJRlNWYWx1ZXMKK3sKKyAgICB0QU5JX1U4IHNpZnM7CisgICAgdEFOSV9VOCBwaWZzOworICAgIHRBTklfVTggZGlmczsKKyAgICB0QU5JX1U4IHByZWFtYmxlOworfSB0RHBoSUZTVmFsdWVzOworCit0eXBlZGVmIHN0cnVjdCBzRHBoUW9zUGFyYW1zCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBhZGR0c1ByZXNlbnQ7CisgICAgdFNpckFkZHRzUmVxSW5mbyAgICAgICBhZGR0czsKKyAgICB0U2lyTWFjUW9zQ2FwYWJpbGl0eVN0YUlFIGNhcGFiaWxpdHk7Cit9IHREcGhRb3NQYXJhbXM7CisKKy8vLyBRdWV1ZSBhdHRyaWJ1dGUgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCBzRHBoUXVldWVBdHRyCit7CisgICAgdEFOSV9VMTYgICAgIHZhbGlkIDogMTsKKyAgICB0QU5JX1UxNiAgICAgc2VxTnVtIDogMTI7CisgICAgdEFOSV9VMTYgICAgIGFja1BvbGljeSA6IDI7CisgICAgdEFOSV9VMTYgICAgIHJzdmQgOiAxOworfSB0RHBoUXVldWVBdHRyLCAqdHBEcGhRdWV1ZUF0dHI7CisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQordHlwZWRlZiBzdHJ1Y3Qgc0NmZ1RyYWZmaWNDbGFzcyB7CisgICAgLy9Vc2UgQmxvY2sgQUNLIG9uIHRoaXMgU1RBL1RJRAorICAgIC8vIEZpZWxkcyB1c2VkIHRvIHN0b3JlIHRoZSBkZWZhdWx0IFRDIHBhcmFtZXRlcnMgZm9yIHRoaXMgVFNQRUMuCisgICAgLy8gVGhleSB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgVFNQRUMgaXMgZGVsZXRlZC4KKyAgICB0QU5JX1U4IGZEaXNhYmxlVHg6MTsKKyAgICB0QU5JX1U4IGZEaXNhYmxlUng6MTsKKyAgICB0QU5JX1U4IGZVc2VCQVR4OjE7CisgICAgdEFOSV9VOCBmVXNlQkFSeDoxOworCisgICAgLy8gMTogZXhwZWN0IHRvIHNlZSBmcmFtZXMgd2l0aCBjb21wcmVzc2VkIEJBIGNvbWluZyBmcm9tIHRoaXMgcGVlciBNQUMKKyAgICB0QU5JX1U4IGZSeENvbXBCQToxOworICAgIHRBTklfVTggZlR4Q29tcEJBOjE7CisKKyAgICAvLyBpbW1lZGlhdGUgQUNLIG9yIGRlbGF5ZWQgQUNLIGZvciBmcmFtZXMgZnJvbSB0aGlzIHBlZXIgTUFDCisgICAgdEFOSV9VOCBmUnhCQXBvbGljeToxOworCisgICAgLy8gaW1tZWRpYXRlIEFDSyBvciBkZWxheWVkIEFDSyBmb3IgZnJhbWVzIHRvIHRoaXMgcGVlciBNQUMKKyAgICB0QU5JX1U4IGZUeEJBcG9saWN5OjE7CisKKyAgICAvL0luaXRpYXRvciBvciByZWNpcGllbnQKKyAgICB0QU5JX1U4IHJvbGU7CisKKyAgICAvL01heCAjIG9mIE1TRFUgcmVjZWl2ZWQgZnJvbSB0aGlzIFNUQSwgbmVnb3RpYXRlZCBhdCBBRERCQQorICAgIC8vIHVzZWQgZm9yIG1haW50YWluaW5nIGJsb2NrIGFjayBzdGF0ZSBpbmZvCisgICAgdEFOSV9VMTYgcnhCdWZTaXplOworCisgICAgLy9NYXggIyBvZiBNU0RVIHNlbmQgdG8gdGhpcyBTVEEsIG5lZ290aWF0ZWQgYXQgQUREQkEKKyAgICB0QU5JX1UxNiB0eEJ1ZlNpemU7CisKKyAgICAvL0JBIHRpbWVvdXQgbmVnb3RpYXRlZCBhdCBBRERCQS4gVW5pdDogVFUKKyAgICB0QU5JX1UxNiB0dVR4QkFXYWl0VGltZW91dDsgLy9UaW1lIGZvciBUeCB0byB3YWl0IGZvciBCQS4gMCBtZWFucyBubyB0aW1lb3V0CisKKyAgICB0QU5JX1UxNiB0dVJ4QkFXYWl0VGltZW91dDsgLy9UaW1lIGZvciBSeCB0byB3YWl0IGZvciBleHBsaWNpdC9pbXBsaWNpdCBCQVIuIDAgbWVhbnMgbm8gdGltZW91dAorCit9IHRDZmdUcmFmZmljQ2xhc3M7CisjZW5kaWYgLyogRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworLy8vIFNUQSBzdGF0ZSBub2RlCit0eXBlZGVmIHN0cnVjdCBzRHBoSGFzaE5vZGUKK3sKKworICAgIC8vQllURSAwCisgICAgLy8gSEFTSCBFTlRSWSBGSUVMRFMgTk9UIE5FRURFRCBJTiBIQUwuCisgICAgLy8vIFRoaXMgU1RBIHZhbGlkIG9yIG5vdAorICAgIHRBTklfVTggICB2YWxpZCA6IDE7CisgICAgdEFOSV9VOCAgIGVuY1BvbGljeSA6IDM7CisgICAgdEFOSV9VOCAgIGRlZmF1bHRLZXkgOiAxOworICAgIHRBTklfVTggICBkZWZhdWx0S2V5SWQgOiAyOworICAgIHRBTklfVTggICBxb3NNb2RlIDogMTsKKworICAgIC8vQllURSAxCisgICAgdEFOSV9VOCAgIGVycEVuYWJsZWQgOiAxOworICAgIHRBTklfVTggICBhZGRlZCA6IDE7IC8vIFRoaXMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGRwaCBoYXNoIHRhYmxlCisgICAgdEFOSV9VOCAgIGxpbmtUZXN0T24gOiAxOworICAgIHRBTklfVTggICBzaG9ydFByZWFtYmxlRW5hYmxlZCA6IDE7CisgICAgdEFOSV9VOCAgIHNob3J0U2xvdFRpbWVFbmFibGVkIDogMTsKKyAgICB0QU5JX1U4ICAgc3RvcFR4OjE7CisgICAgdEFOSV9VOCAgIHdtZUVuYWJsZWQ6IDE7IC8vIHNldCBpZiBib3RoIGFwIGFuZCBzdGEgYXJlIHdtZSBjYXBhYmxlCisgICAgdEFOSV9VOCAgIGxsZUVuYWJsZWQ6IDE7IC8vIHNldCBpZiBib3RoIGFwIGFuZCBzdGEgYXJlIDExZSBjYXBhYmxlCisKKyAgICAvL0JZVEUgMgorICAgIHRBTklfVTggICB3c21FbmFibGVkOiAxOyAvLyBzZXQgaWYgYm90aCBhcCBhbmQgc3RhIGFyZSB3c20gY2FwYWJsZQorICAgIHRBTklfVTggICB2ZXJzaW9uUHJlc2VudDoxOyAvLyBzdGF0aW9uIGdhdmUgdmVyc2lvbiBpbmZvCisgICAgdEFOSV9VOCAgIGJ1cnN0RW5hYmxlRm9yY2U6MTsgLy8gYWxsb3cgYnVyc3RpbmcgcmVnYXJkbGVzcyBvZiBxb3NNb2RlCisgICAgdEFOSV9VOCAgIHN0YUF1dGhlbnRpY2F0ZWQ6MTsgICAgCisgICAgLy8vIFdoZXRoZXIgdGhlIHBlZXIgaXMgQU5JIG9yIG5vdAorICAgIHRBTklfVTggIGFuaVBlZXI6MTsKKyAgICB0QU5JX1U4ICAgdGl0YW5QZWVyOjE7ICAgICAgICAgICAgICAgIC8vIGZsYWcgdG8gaW5kaWNhdGUgaWYgaXRzIGEgdGl0YW4gcGVlciAgICAKKyAgICB0QU5JX1U4ICBmQW5pQ291bnQ6MTsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICB0QU5JX1U4ICAgaGNmRW5hYmxlZCA6IDE7CisjZWxzZQorICAgIHRBTklfVTggICByc3ZkOjE7CisjZW5kaWYKKworICAgIC8vLyBGcmFnbWVudGF0aW9uIHNpemUKKyAgICB0QU5JX1UxNiAgIGZyYWdTaXplOworCisgICAgLy8vIExJTSBzdGF0ZQorICAgIHRMaW1NbG1TdGFDb250ZXh0IG1sbVN0YUNvbnRleHQ7CisKKyAgICAvLy8gTnVtYmVyIG9mIFRpbSB0byB3YWl0IGlmIHRoZSBTVEEgZG9lc24ndCByZXNwb25kIC8gZmV0Y2ggZGF0YQorICAgIHRBTklfVTggIHRpbVdhaXRDb3VudDsKKworICAgIC8vLyBOdW1iZXIgb2YgU3VjY2Vzc2Z1bGwgTVBEVSdzIGJlaW5nIHNlbnQKKyAgICB0QU5JX1UzMiAgICBjdXJUeE1wZHVDbnQ7CisKKworICAgIC8vLyBudW1iZXIgb2YgY29uc2VjdXRpdmUgVElNcyBzZW50IHdpdGhvdXQgcmVzcG9uc2UKKyAgICB0QU5JX1U4ICBudW1UaW1TZW50OworCisgICAgLy8gcW9zIHBhcmFtZXRlciBpbmZvCisgICAgdERwaFFvc1BhcmFtcyAgcW9zOworCisgICAgLy8gc3RhdGlvbiB2ZXJzaW9uIGluZm8gLSB2YWxpZCBvbmx5IGlmIHZlcnNpb25QcmVzZW50IGlzIHNldAorICAgIHRTaXJNYWNQcm9wVmVyc2lvbiB2ZXJzaW9uOworICAgIC8vIHN0YXRpb24gcHJvcHJpZXRhcnkgY2FwYWJpbGl0eQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHByb3BDYXBhYmlsaXR5OworCisjaWZkZWYgUExNX1dEUworICAgIHRBTklfVTggIHdkc0luZGV4OworICAgIHRBTklfVTggIHdkc1BlZXJCZWFjb25TZWVuOworI2VuZGlmCisKKyAgIC8vVGF1cnVzIGNhcGFiaWxpdGllcworICAgdEFOSV9VMTYgYmFQb2xpY3lGbGFnOyAgICAgICAgICAgICAgICAgLy9CQSBQb2xpY3kgZm9yIGVhY2ggVElELiAKKworICAgIC8qCisgICAgKiBBbGwgdGhlIGxlZ2FjeSBhbmQgYWlyZ28gc3VwcG9ydGVkIHJhdGVzLgorICAgICovCisgICAgdFNpclN1cHBvcnRlZFJhdGVzIHN1cHBvcnRlZFJhdGVzOworCisgICAgdEFOSV9VOCBodEdyZWVuZmllbGQ6MTsKKyAgICB0QU5JX1U4IGh0U2hvcnRHSTQwTWh6OjE7CisgICAgdEFOSV9VOCBodFNob3J0R0kyME1oejoxOworICAgIC8vIERTU1MvQ0NLIGF0IDQwIE1IejogRW5hYmxlZCAxIG9yIERpc2FibGVkCisgICAgdEFOSV9VOCBodERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0OjE7CisgICAgLy8gTC1TSUcgVFhPUCBQcm90ZWN0aW9uIHVzZWQgb25seSBpZiBwZWVyIHN1cHBvcnQgYXZhaWxhYmxlCisgICAgdEFOSV9VOCBodExzaWdUWE9QUHJvdGVjdGlvbjoxOworICAgIC8vIEEtTVBEVSBEZW5zaXR5CisgICAgLy8gMDAwIC0gTm8gcmVzdHJpY3Rpb24KKyAgICAvLyAwMDEgLSAxLzggdXNlYworICAgIC8vIDAxMCAtIDEvNCB1c2VjCisgICAgLy8gMDExIC0gMS8yIHVzZWMKKyAgICAvLyAxMDAgLSAxIHVzZWMKKyAgICAvLyAxMDEgLSAyIHVzZWMKKyAgICAvLyAxMTAgLSA0IHVzZWMKKyAgICAvLyAxMTEgLSA4IHVzZWMKKyAgICAvLworICAgIHRBTklfVTggaHRBTXBkdURlbnNpdHk6MzsKKworCisgICAgLy9TZXQgdG8gMCBmb3IgMzgzOSBvY3RldHMKKyAgICAvL1NldCB0byAxIGZvciA3OTM1IG9jdGV0cworICAgIHRBTklfVTggaHRNYXhBbXNkdUxlbmd0aDsKKworCisgICAgLy8gTUlNTyBQb3dlciBTYXZlCisgICAgdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIGh0TUlNT1BTU3RhdGU7CisKKyAgICAvLworCisgICAgLy8gTWF4aW11bSBSeCBBLU1QRFUgZmFjdG9yCisgICAgdEFOSV9VOCBodE1heFJ4QU1wZHVGYWN0b3I6MjsKKyAgICAvLworICAgIC8vIFJlY29tbWVuZGVkIFR4IFdpZHRoIFNldAorICAgIC8vIDAgLSB1c2UgMjAgTUh6IGNoYW5uZWwgKGNvbnRyb2wgY2hhbm5lbCkKKyAgICAvLyAxIC0gdXNlIDQwIE1oeiBjaGFubmVsCisgICAgLy8KKyAgICB0QU5JX1U4IGh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OjE7CisgICAgdEFOSV9VOCByc3ZkMTo1OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBEUEggSEFTSCBFTlRSWSBGSUVMRFMgTkVFREVEIElOIEhBTCBPTkxZCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICB0QU5JX1U4IGRwdVNpZzo0OyAgICAgICAgICAgICAgICAgICAgICAgLy8gRFBVIHNpZ25pdHVyZQorICAgIHRBTklfVTggc3RhU2lnOjQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBTVEEgc2lnbmF0dXJlCisgICAgdEFOSV9VOCBzdGFUeXBlOworCisgICAgdEFOSV9VMTYgYnNzSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCU1NJRAorICAgIHRBTklfVTE2IGFzc29jSWQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NvY2lhdGlvbiBJRAorCisKKyAgICAvL1RoaXMgaXMgdGhlIHJlYWwgc3RhIGluZGV4IGdlbmVyYXRlZCBieSBIQUwKKyAgICB0QU5JX1UxNiBzdGFJbmRleDsKKyAgICB0QU5JX1U4ICAgIHN0YUFkZHJbNl07CisgICAgLypUaGUgRFBVIHNpZ25hdHVyZXMgd2lsbCBiZSBzZW50IGV2ZW50dWFsbHkgdG8gVEwgdG8gaGVscCBpdCBkZXRlcm1pbmUgdGhlIAorICAgICAgYXNzb2NpYXRpb24gdG8gd2hpY2ggYSBwYWNrZXQgYmVsb25ncyB0byovCisgICAgLypVbmljYXN0IERQVSBzaWduYXR1cmUqLworICAgIHRBTklfVTggICAgIHVjVWNhc3RTaWc7CisKKyAgICAvKkJyb2FkY2FzdCBEUFUgc2lnbmF0dXJlKi8KKyAgICB0QU5JX1U4ICAgICB1Y0JjYXN0U2lnOworCisgICAgLy8KKyAgICAvLyBQRSBuZWVkcyB0aGlzIGluZm8gb24gYSBwZXItU1RBLCBwZXItVElEIGJhc2lzCisgICAgLy8gQXQgYW55IHBvaW50IGluIHRpbWUsIHdoZW4gdGhpcyBkYXRhIGlzIHNhbXBsZWQsCisgICAgLy8gaXQgZ2l2ZXMgYSBtZWFzdXJlIG9mOgorICAgIC8vIGEpIEFsbCB0aGUgYWN0aXZlIGJBIHNlc3Npb25zCisgICAgLy8gYikgQW5kIHRoZSBCQSBjb25maWd1cmF0aW9uIGl0c2VsZgorICAgIC8vCisgICAgdENmZ1RyYWZmaWNDbGFzcyB0Y0NmZ1tTVEFDRkdfTUFYX1RDXTsKKworICAgIC8vIEJsb2NrIEFjayBzdGF0ZQorICAgIC8vIFRoaXMgaXMgdXNlZCBiZXR3ZWVuIFBFIGFuZCBIQUwgb25seS4KKyAgICAvLyBjYW4gYmUgc2V0IHRvIG9uZSBvZiB0aGUgdmFsdWVzIGZyb20gdGhlIGZvbGxvd2luZyBlbnVtCisgICAgLyp0eXBlZGVmIGVudW0gZUxpbUJBU3RhdGUKKyAgICB7CisgICAgICAgIGVMSU1fQkFfU1RBVEVfSURMRSwgLy8gd2UgYXJlIG5vdCB3YWl0aW5nIGZvciBhbnl0aGluZyBmcm9tIEhBTC4KKyAgICAgICAgZUxJTV9CQV9TVEFURV9XVF9BRERfUlNQLCAvL1dlIGFyZSB3YWl0aW5nIGZvciBBZGQgcnNwb25zZSBmcm9tIEhBTC4KKyAgICAgICAgZUxJTV9CQV9TVEFURV9XVF9ERUxfUlNQIC8vICBXZSBhcmUgd2FpdGluZyBmb3IgRGVsIHJlc3BvbnNlIGZyb20gSEFMLgorICAgIH0gdExpbUJBU3RhdGU7ICovCisKKworICAgIC8vQkEgc3RhdGUgYml0bWFwIDIgYml0cyBwZXIgdGlkCisgICAgLy8gQkEgc3RhdGUgZm9yIHRpZCBpICA9IChiYVN0YXRlID4+IHRpZCoyKSAmIDB4MworICAgIHRBTklfVTMyIGJhU3RhdGU7CisKKyAgICAvKiBXaGVuIGEgc3RhdGlvbiB3aXRoIGFscmVhZHkgYW4gZXhpc3RpbmcgZHBoIGVudHJ5IHRyaWVzIHRvIAorICAgICAqIGFzc29jaWF0ZSBhZ2FpbiwgdGhlIG9sZCBkcGggZW50cnkgd2lsbCBiZSB6ZXJvZWQgb3V0IGV4Y2VwdCAKKyAgICAgKiBmb3IgdGhlIG5leHQgcG9pbnRlci4gVGhlIG5leHQgcG9pbnRlciBtdXN0IGJlIGRlZmluZWQgYXQgdGhlICAKKyAgICAgKiBlbmQgb2YgdGhlIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBzdHJ1Y3Qgc0RwaEhhc2hOb2RlICAqbmV4dDsKKworfSB0RHBoSGFzaE5vZGUsICp0cERwaEhhc2hOb2RlOworCisjaW5jbHVkZSAiZHBoSGFzaFRhYmxlLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZ2V0IHByb3RlY3Rpb24gb3ZlcnJpZGVzIGZyb20gY29uZmlnIHZhcmlhYmxlCisvLyBiaXQwOiBmb3JjZSBjdHMgdG8gc2VsZiBwcm90ZWN0aW9uIGZvciB0eCB0byBBaXJnbyBwZWVycworLy8gYml0MTogZm9yY2UgY3RzIHRvIHNlbGYgcHJvdGVjdGlvbiBmb3IgdHggdG8gbm9uIEFpcmdvIHBlZXJzCisjZGVmaW5lIERQSF9QUk9UX09WRVJSSURFX05PTkFOSV9QRUVSX0dFVChjZmd2YWwpICAgICgoY2ZndmFsKSAmIDEpCisjZGVmaW5lIERQSF9QUk9UX09WRVJSSURFX0FOSV9QRUVSX0dFVChjZmd2YWwpICgoKGNmZ3ZhbCkgJiAyKSA+PiAxKQorCit0eXBlZGVmIHN0cnVjdCBzQW5pU2lyRHBoCit7CisgICAgLy8vIFRoZSBoYXNoIHRhYmxlIG9iamVjdAorICAgIGRwaEhhc2hUYWJsZUNsYXNzIGRwaEhhc2hUYWJsZTsKK30gdEFuaVNpckRwaCwgKnRwQW5pU2lyRHBoOworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvaW5jbHVkZS9wYXJzZXJBcGkuaCBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL3BhcnNlckFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjNlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvaW5jbHVkZS9wYXJzZXJBcGkuaApAQCAtMCwwICsxLDg0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHBhcnNlckFwaS5oIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyB1c2VkCisgKiBmb3IgcGFyc2luZyByZWNlaXZlZCA4MDIuMTEgZnJhbWVzCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaWZuZGVmIF9fUEFSU0VfSF9fCisjZGVmaW5lIF9fUEFSU0VfSF9fCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJzaXJNYWNQcm9wRXh0cy5oIgorI2luY2x1ZGUgImRvdDExZi5oIgorI2luY2x1ZGUgImxpbVNlc3Npb24uaCIKKworI2RlZmluZSBDT1VOVFJZX1NUUklOR19MRU5HVEggICAgKCAgMyApCisjZGVmaW5lIENPVU5UUllfSU5GT19NQVhfQ0hBTk5FTCAoIDg0ICkKKyNkZWZpbmUgTUFYX1NJWkVfT0ZfVFJJUExFVFNfSU5fQ09VTlRSWV9JRSAoQ09VTlRSWV9TVFJJTkdfTEVOR1RIICogQ09VTlRSWV9JTkZPX01BWF9DSEFOTkVMKQorI2RlZmluZSBISUdIRVNUXzI0R0haX0NIQU5ORUxfTlVNICAoIDE0ICkKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckNvdW50cnlJbmZvcm1hdGlvbgoreworICAgIHRBTklfVTggY291bnRyeVN0cmluZ1tDT1VOVFJZX1NUUklOR19MRU5HVEhdOworICAgIHRBTklfVTggbnVtSW50ZXJ2YWxzOyAvL251bWJlciBvZiBjaGFubmVsIGludGVydmFscworICAgIHN0cnVjdCBjaGFubmVsUG93ZXJMaW0KKyAgICB7CisgICAgICAgIHRBTklfVTggY2hhbm5lbE51bWJlcjsKKyAgICAgICAgdEFOSV9VOCBudW1DaGFubmVsOworICAgICAgICB0QU5JX1U4IG1heFRyYW5zbWl0UG93ZXI7CisgICAgfSBjaGFubmVsVHJhbnNtaXRQb3dlcltDT1VOVFJZX0lORk9fTUFYX0NIQU5ORUxdOworfSB0U2lyQ291bnRyeUluZm9ybWF0aW9uLCp0cFNpckNvdW50cnlJbmZvcm1hdGlvbjsKKworCisvLy8gU3RydWN0dXJlIGNvbW1vbiB0byBCZWFvbnMgJiBQcm9iZSBSZXNwb25zZXMKK3R5cGVkZWYgc3RydWN0IHNTaXJQcm9iZVJlc3BCZWFjb24KK3sKKyAgICB0U2lyTWFjVGltZVN0YW1wICAgICAgICAgIHRpbWVTdGFtcDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgIGJlYWNvbkludGVydmFsOworICAgIHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAgICAgY2FwYWJpbGl0eUluZm87CisKKyAgICB0U2lyTWFjU1NpZCAgICAgICAgICAgICAgIHNzSWQ7CisgICAgdFNpck1hY1JhdGVTZXQgICAgICAgICAgICBzdXBwb3J0ZWRSYXRlczsKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgICAgIGV4dGVuZGVkUmF0ZXM7CisgICAgdFNpck1hY0NoYW5OdW0gICAgICAgICAgICBjaGFubmVsTnVtYmVyOworICAgIHRTaXJNYWNDZlBhcmFtU2V0ICAgICAgICAgY2ZQYXJhbVNldDsKKyAgICB0U2lyTWFjVGltICAgICAgICAgICAgICAgIHRpbTsKKyAgICB0U2lyTWFjRWRjYVBhcmFtU2V0SUUgICAgIGVkY2FQYXJhbXM7CisgICAgdFNpck1hY1Fvc0NhcGFiaWxpdHlJRSAgICBxb3NDYXBhYmlsaXR5OworCisgICAgdFNpckNvdW50cnlJbmZvcm1hdGlvbiAgICBjb3VudHJ5SW5mb1BhcmFtOworICAgIHRTaXJNYWNXcGFJbmZvICAgICAgICAgICAgd3BhOworICAgIHRTaXJNYWNSc25JbmZvICAgICAgICAgICAgcnNuOworCisgICAgdFNpck1hY0VycEluZm8gICAgICAgICAgICBlcnBJRUluZm87CisKKyAgICB0U2lyUHJvcElFU3RydWN0ICAgICAgICAgIHByb3BJRWluZm87CisgICAgdERvdDExZklFUG93ZXJDb25zdHJhaW50cyBsb2NhbFBvd2VyQ29uc3RyYWludDsKKyAgICB0RG90MTFmSUVUUENSZXBvcnQgICAgICAgIHRwY1JlcG9ydDsKKyAgICB0RG90MTFmSUVDaGFuU3dpdGNoQW5uICAgIGNoYW5uZWxTd2l0Y2hJRTsKKyAgICB0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uIGV4dENoYW5uZWxTd2l0Y2hJRTsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICAgIGJzc2lkOworICAgIHREb3QxMWZJRVF1aWV0ICAgICAgICAgICAgcXVpZXRJRTsKKyAgICB0RG90MTFmSUVIVENhcHMgICAgICAgICAgIEhUQ2FwczsKKyAgICB0RG90MTFmSUVIVEluZm8gICAgICAgICAgIEhUSW5mbzsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgdERvdDExZklFUDJQUHJvYmVSZXMgICAgICBQMlBQcm9iZVJlczsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBtZGllW1NJUl9NRElFX1NJWkVdOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIHREb3QxMWZJRUNDWFR4bWl0UG93ZXIgICAgY2N4VHhQd3I7CisgICAgdERvdDExZklFUUJTU0xvYWQgICAgICAgICBRQlNTTG9hZDsKKyNlbmRpZgorICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgc3NpZFByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBzdXBwUmF0ZXNQcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRSYXRlc1ByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBjZlByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBkc1BhcmFtc1ByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICB0aW1QcmVzZW50OworCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBlZGNhUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIHFvc0NhcGFiaWxpdHlQcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgd21lRWRjYVByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICB3bWVJbmZvUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIHdzbUNhcGFibGVQcmVzZW50OworCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBjb3VudHJ5SW5mb1ByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICB3cGFQcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgcnNuUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIGVycFByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBjaGFubmVsU3dpdGNoUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIGV4dENoYW5uZWxTd2l0Y2hQcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgcXVpZXRJRVByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICB0cGNSZXBvcnRQcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgcG93ZXJDb25zdHJhaW50UHJlc2VudDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBtZGllUHJlc2VudDsKKyNlbmRpZgorCit9IHRTaXJQcm9iZVJlc3BCZWFjb24sICp0cFNpclByb2JlUmVzcEJlYWNvbjsKKworLy8gcHJvYmUgUmVxdWVzdCBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IHNTaXJQcm9iZVJlcQoreworICAgIHRTaXJNYWNTU2lkICAgICAgICAgICAgICAgc3NJZDsKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgICAgIHN1cHBvcnRlZFJhdGVzOworICAgIHRTaXJNYWNSYXRlU2V0ICAgICAgICAgICAgZXh0ZW5kZWRSYXRlczsKKyAgICB0RG90MTFmSUVXc2NQcm9iZVJlcSAgICAgIHByb2JlUmVxV3NjSWVJbmZvOworICAgIHREb3QxMWZJRUhUQ2FwcyAgICAgICAgICAgSFRDYXBzOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgc3NpZFByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBzdXBwUmF0ZXNQcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRSYXRlc1ByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICB3c2NJZVByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBwMnBJZVByZXNlbnQ7CisKK30gdFNpclByb2JlUmVxLCAqdHBTaXJQcm9iZVJlcTsKKworLy8vIEFzc29jaWF0aW9uIFJlcXVlc3Qgc3RydWN0dXJlIChvbmUgZGF5IHRvIGJlIHJlcGxhY2VkIGJ5CisvLy8gdERvdDExZkFzc29jUmVxdWVzdCkKK3R5cGVkZWYgc3RydWN0IHNTaXJBc3NvY1JlcQoreworCisgICAgdFNpck1hY0NhcGFiaWxpdHlJbmZvICAgICBjYXBhYmlsaXR5SW5mbzsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgIGxpc3RlbkludGVydmFsOworICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgICAgY3VycmVudEFwQWRkcjsgLyogb25seSBpbiByZWFzc29jIGZyYW1lcyAqLworICAgIHRTaXJNYWNTU2lkICAgICAgICAgICAgICAgc3NJZDsKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgICAgIHN1cHBvcnRlZFJhdGVzOworICAgIHRTaXJNYWNSYXRlU2V0ICAgICAgICAgICAgZXh0ZW5kZWRSYXRlczsKKworICAgIHRTaXJBZGR0c1JlcUluZm8gICAgICAgICAgYWRkdHNSZXE7CisgICAgdFNpck1hY1Fvc0NhcGFiaWxpdHlTdGFJRSBxb3NDYXBhYmlsaXR5OworCisgICAgdFNpck1hY1dwYUluZm8gICAgICAgICAgICB3cGE7CisgICAgdFNpck1hY1JzbkluZm8gICAgICAgICAgICByc247CisgICAgdFNpckFkZGllICAgICAgICAgICAgICAgICBhZGRJRTsKKyAgICAKKyAgICB0U2lyUHJvcElFU3RydWN0ICAgICAgICAgIHByb3BJRWluZm87CisgICAgdFNpck1hY1Bvd2VyQ2FwYWJpbGl0eUlFICBwb3dlckNhcGFiaWxpdHk7CisgICAgdFNpck1hY1N1cHBvcnRlZENoYW5uZWxJRSBzdXBwb3J0ZWRDaGFubmVsczsKKyAgICB0RG90MTFmSUVIVENhcHMgICBIVENhcHM7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHREb3QxMWZJRVdNTUluZm9TdGF0aW9uICAgV01NSW5mb1N0YXRpb247CisjZW5kaWYKKyAgICAvLy8gVGhpcyBpcyBzZXQgaWYgdGhlIGZyYW1lIGlzIGEgcmVhc3NvYyByZXF1ZXN0OgorICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgcmVhc3NvY1JlcXVlc3Q7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBzc2lkUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIHN1cHBSYXRlc1ByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBleHRlbmRlZFJhdGVzUHJlc2VudDsKKworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgd21lSW5mb1ByZXNlbnQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBxb3NDYXBhYmlsaXR5UHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIGFkZHRzUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIHdzbUNhcGFibGVQcmVzZW50OworCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICB3cGFQcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgcnNuUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIGFkZElFUHJlc2VudDsKKworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgcG93ZXJDYXBhYmlsaXR5UHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZENoYW5uZWxzUHJlc2VudDsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgLy8ga2VlaW5nIGNvcHkgb2YgYXNzb2N0aW9uIHJlcXVlc3QgcmVjZWl2ZWQsIHRoaXMgaXMgCisgICAgLy8gcmVxdWlyZWQgZm9yIGluZGljYXRpbmcgdGhlIGZyYW1lIHRvIHVwcGVyIGxheWVycworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgYXNzb2NSZXFGcmFtZUxlbmd0aDsKKyAgICB0QU5JX1U4KiAgICAgICAgICAgICAgICAgIGFzc29jUmVxRnJhbWU7CisjZW5kaWYKK30gdFNpckFzc29jUmVxLCAqdHBTaXJBc3NvY1JlcTsKKworCisvLy8gQXNzb2NpYXRpb24gUmVzcG9uc2Ugc3RydWN0dXJlIChvbmUgZGF5IHRvIGJlIHJlcGxhY2VkIGJ5CisvLy8gdERvdDExZkFzc29jUmVxdWVzdCkKK3R5cGVkZWYgc3RydWN0IHNTaXJBc3NvY1JzcAoreworCisgICAgdFNpck1hY0NhcGFiaWxpdHlJbmZvICAgICBjYXBhYmlsaXR5SW5mbzsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgIGFpZDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU7CisgICAgdFNpck1hY1JhdGVTZXQgICAgICAgICAgICBzdXBwb3J0ZWRSYXRlczsKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgICAgIGV4dGVuZGVkUmF0ZXM7CisgICAgdFNpclByb3BJRVN0cnVjdCAgICAgICAgICBwcm9wSUVpbmZvOworICAgIHRTaXJNYWNFZGNhUGFyYW1TZXRJRSAgICAgZWRjYTsKKyAgICB0U2lyQWRkdHNSc3BJbmZvICAgICAgICAgIGFkZHRzUnNwOworICAgIHREb3QxMWZJRUhUQ2FwcyAgIEhUQ2FwczsKKyAgICB0RG90MTFmSUVIVEluZm8gICAgICAgICAgIEhUSW5mbzsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgdERvdDExZklFRlRJbmZvICAgICAgICAgICBGVEluZm87CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBtZGllW1NJUl9NRElFX1NJWkVdOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgbnVtX1JJQ0RhdGE7IAorICAgIHREb3QxMWZJRVJJQ0RhdGFEZXNjICAgICAgUklDRGF0YVsyXTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgbnVtX3RzcGVjczsKKyAgICB0RG90MTFmSUVXTU1UU1BFQyAgICAgICAgIFRTUEVDSW5mb1tTSVJfQ0NYX01BWF9UU1BFQ19JRVNdOworICAgIHRTaXJNYWNDQ1hUU01JRSAgICAgICAgICAgdHNtSUU7CisjZW5kaWYKKworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgc3VwcFJhdGVzUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUmF0ZXNQcmVzZW50OworCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICBlZGNhUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIHdtZUVkY2FQcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgYWRkdHNQcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgd3NtQ2FwYWJsZVByZXNlbnQ7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgZnRpbmZvUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIG1kaWVQcmVzZW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgcmljUHJlc2VudDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIHRzcGVjUHJlc2VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgIHRzbVByZXNlbnQ7CisjZW5kaWYgICAgCit9IHRTaXJBc3NvY1JzcCwgKnRwU2lyQXNzb2NSc3A7CisKK3RBTklfVTgKK3NpcklzUHJvcENhcGFiaWxpdHlFbmFibGVkKHN0cnVjdCBzQW5pU2lyR2xvYmFsICpwTWFjLCB0QU5JX1UzMiBiaXRudW0pOworCit0U2lyUmV0U3RhdHVzCitzaXJHZXRDZmdQcm9wQ2FwcyhzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqLCB0QU5JX1UxNiAqKTsKKwordm9pZCBkb3QxMWZMb2codHBBbmlTaXJHbG9iYWwgcE1hYywgaW50IG5TZXYsIGNvbnN0IGNoYXIgKmxwc3pGb3JtYXQsIC4uLik7CisKKyNkZWZpbmUgQ0ZHX0dFVF9JTlQoblN0YXR1cywgcE1hYywgbkl0ZW0sIGNmZyApICAgICAgICAgICAgICAgICBcCisgICAgKG5TdGF0dXMpID0gd2xhbl9jZmdHZXRJbnQoIChwTWFjKSwgKG5JdGVtKSwgJiAoY2ZnKSApOyAgICAgICAgICBcCisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gKG5TdGF0dXMpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG90MTFmTG9nKCAocE1hYyksIExPR1AsIEZMKCJGYWlsZWQgdG8gcmV0cmlldmUgIiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbkl0ZW0gIiBmcm9tIENGRyAoJWQpLlxuIiksICAgXAorICAgICAgICAgICAgICAgIChuU3RhdHVzKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG5TdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIENGR19HRVRfSU5UX05PX1NUQVRVUyhuU3RhdHVzLCBwTWFjLCBuSXRlbSwgY2ZnICkgICAgICAgXAorICAgIChuU3RhdHVzKSA9IHdsYW5fY2ZnR2V0SW50KCAocE1hYyksIChuSXRlbSksICYgKGNmZykgKTsgICAgICAgICAgXAorICAgIGlmICggZVNJUl9TVUNDRVNTICE9IChuU3RhdHVzKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdDExZkxvZyggKHBNYWMpLCBMT0dQLCBGTCgiRmFpbGVkIHRvIHJldHJpZXZlICIgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI25JdGVtICIgZnJvbSBDRkcgKCVkKS5cbiIpLCAgIFwKKyAgICAgICAgICAgICAgICAoblN0YXR1cykgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBDRkdfR0VUX1NUUihuU3RhdHVzLCBwTWFjLCBuSXRlbSwgY2ZnLCBuQ2ZnLCBuTWF4Q2ZnKSAgIFwKKyAgICAobkNmZykgPSAobk1heENmZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKG5TdGF0dXMpID0gd2xhbl9jZmdHZXRTdHIoIChwTWFjKSwgKG5JdGVtKSwgKGNmZyksICYgKG5DZmcpICk7ICBcCisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gKG5TdGF0dXMpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG90MTFmTG9nKCAocE1hYyksIExPR1AsIEZMKCJGYWlsZWQgdG8gcmV0cmlldmUgIiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbkl0ZW0gIiBmcm9tIENGRyAoJWQpLlxuIiksICAgXAorICAgICAgICAgICAgICAgIChuU3RhdHVzKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG5TdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIENGR19HRVRfU1RSX05PX1NUQVRVUyhuU3RhdHVzLCBwTWFjLCBuSXRlbSwgY2ZnLCBuQ2ZnLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1heENmZykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobkNmZykgPSAobk1heENmZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKG5TdGF0dXMpID0gd2xhbl9jZmdHZXRTdHIoIChwTWFjKSwgKG5JdGVtKSwgKGNmZyksICYgKG5DZmcpICk7ICBcCisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gKG5TdGF0dXMpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG90MTFmTG9nKCAocE1hYyksIExPR1AsIEZMKCJGYWlsZWQgdG8gcmV0cmlldmUgIiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbkl0ZW0gIiBmcm9tIENGRyAoJWQpLlxuIiksICAgXAorICAgICAgICAgICAgICAgIChuU3RhdHVzKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCit2b2lkIHN3YXBCaXRGaWVsZDE2KHRBTklfVTE2IGluLCB0QU5JX1UxNiAqb3V0KTsKKworLy8gQ3VycmVudGx5IGltcGxlbWVudGVkIGFzICJzaGltcyIgYmV0d2VlbiBjYWxsZXJzICYgdGhlIG5ldyBmcmFtZXNjLQorLy8gZ2VuZXJhdGVkIGNvZGU6CisKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnRQcm9iZVJlcUZyYW1lMlN0cnVjdChzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJQcm9iZVJlcSBwcm9iZSk7CisKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnRQcm9iZUZyYW1lMlN0cnVjdChzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywgdEFOSV9VOCAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uIHByb2JlKTsKKwordFNpclJldFN0YXR1cworc2lyQ29udmVydEFzc29jUmVxRnJhbWUyU3RydWN0KHN0cnVjdCBzQW5pU2lyR2xvYmFsICpwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKiBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJBc3NvY1JlcSBhc3NvYyk7CisKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnRBc3NvY1Jlc3BGcmFtZTJTdHJ1Y3Qoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKiBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpckFzc29jUnNwIGFzc29jKTsKKwordFNpclJldFN0YXR1cworc2lyQ29udmVydFJlYXNzb2NSZXFGcmFtZTJTdHJ1Y3Qoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICogZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpckFzc29jUmVxIGFzc29jKTsKKwordFNpclJldFN0YXR1cworc2lyUGFyc2VCZWFjb25JRShzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywKKyAgICAgICAgICAgICAgICAgdHBTaXJQcm9iZVJlc3BCZWFjb24gICBwQmVhY29uU3RydWN0LAorICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAqcFBheWxvYWQsCisgICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICBwYXlsb2FkTGVuZ3RoKTsKKwordFNpclJldFN0YXR1cworc2lyQ29udmVydEJlYWNvbkZyYW1lMlN0cnVjdChzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJlYWNvbkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpclByb2JlUmVzcEJlYWNvbiBwQmVhY29uU3RydWN0KTsKKwordFNpclJldFN0YXR1cworc2lyQ29udmVydEF1dGhGcmFtZTJTdHJ1Y3Qoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICogZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpck1hY0F1dGhGcmFtZUJvZHkgYXV0aCk7CisKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnRBZGR0c1JlcTJTdHJ1Y3Qoc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJBZGR0c1JlcUluZm8gKmFkZFRzKTsKKwordFNpclJldFN0YXR1cworc2lyQ29udmVydEFkZHRzUnNwMlN0cnVjdChzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckFkZHRzUnNwSW5mbyAqYWRkdHMpOworCit0U2lyUmV0U3RhdHVzCitzaXJDb252ZXJ0RGVsdHNSZXEyU3RydWN0KHN0cnVjdCBzQW5pU2lyR2xvYmFsICpwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyRGVsdHNSZXFJbmZvICpkZWxUcyk7CisKKyNpZmRlZiBBTklfU1VQUE9SVF8xMUgKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnRUcGNSZXFGcmFtZTJTdHJ1Y3Qoc3RydWN0IHNBbmlTaXJHbG9iYWwgKiwgdEFOSV9VOCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpck1hY1RwY1JlcUFjdGlvbkZyYW1lLCB0QU5JX1UzMik7CisKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnRNZWFzUmVxRnJhbWUyU3RydWN0KHN0cnVjdCBzQW5pU2lyR2xvYmFsICosIHRBTklfVTggKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lLCB0QU5JX1UzMik7CisjZW5kaWYKKworCisvKioKKyAqIFxicmllZiBQb3B1bGF0ZWQgYSB0RG90MTFmRmZDYXBhYmlsaXRpZXMKKyAqCisgKiBcc2EgUG9wdWxhdGVkRG90MTFmQ2FwYWJpbGl0aWVzMgorICoKKyAqCisgKiBccGFyYW0gcE1hYyBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIGRhdGFzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcERvdDExZiBBZGRyZXNzIG9mIGEgdERvdDExZkZmQ2FwYWJpbGl0aWVzIHRvIGJlIGZpbGxlZCBpbgorICoKKyAqCisgKiBcbm90ZSBJZiBTSVJfTUFDX1BST1BfQ0FQQUJJTElUWV8xMUVRT1MgaXMgZW5hYmxlZCwgd2UnbGwgY2xlYXIgdGhlIFFPUworICogYml0IGluIHBEb3QxMWYKKyAqCisgKgorICovCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmQ2FwYWJpbGl0aWVzKHRwQW5pU2lyR2xvYmFsICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZkNhcGFiaWxpdGllcyAqcERvdDExZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgcHNlc3Npb25FbnRyeSk7CisKKy8qKgorICogXGJyaWVmIFBvcHVsYXRlZCBhIHREb3QxMWZGZkNhcGFiaWxpdGllcworICoKKyAqIFxzYSBQb3B1bGF0ZWREb3QxMWZDYXBhYmlsaXRpZXMyCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgZGF0YXN0cnVjdHVyZQorICoKKyAqIFxwYXJhbSBwRG90MTFmIEFkZHJlc3Mgb2YgYSB0RG90MTFmRmZDYXBhYmlsaXRpZXMgdG8gYmUgZmlsbGVkIGluCisgKgorICogXHBhcmFtIHBTdGEgUG9pbnRlciB0byBhIHREcGhIYXNoTm9kZSByZXByZXNlbnRpbmcgYSBwZWVyCisgKgorICoKKyAqIFxub3RlIElmIFNJUl9NQUNfUFJPUF9DQVBBQklMSVRZXzExRVFPUyBpcyBlbmFibGVkIG9uIG91ciBwZWVyLCB3ZSdsbAorICogY2xlYXIgdGhlIFFPUyBiaXQgaW4gcERvdDExZgorICoKKyAqCisgKi8KKworc3RydWN0IHNEcGhIYXNoTm9kZTsKKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZDYXBhYmlsaXRpZXMyKHRwQW5pU2lyR2xvYmFsICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZDYXBhYmlsaXRpZXMgKnBEb3QxMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNEcGhIYXNoTm9kZSAgICpwU3RhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgcHNlc3Npb25FbnRyeSk7CisKKy8vLyBQb3B1bGF0ZSBhIHREb3QxMWZJRUNoYW5Td2l0Y2hBbm4KK3ZvaWQKK1BvcHVsYXRlRG90MTFmQ2hhblN3aXRjaEFubih0cEFuaVNpckdsb2JhbCAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUNoYW5Td2l0Y2hBbm4gKnBEb3QxMWYpOworCisvLy8gUG9wdWxhdGUgYSB0RG90MTFmSUVDaGFuU3dpdGNoQW5uCit2b2lkCitQb3B1bGF0ZURvdDExZkV4dENoYW5Td2l0Y2hBbm4odHBBbmlTaXJHbG9iYWwgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRXh0Q2hhblN3aXRjaEFubiAqcERvdDExZik7CisKKy8vLyBQb3B1bGF0ZSBhIHREb3QxMWZJRUNvdW50cnkKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmQ291bnRyeSh0cEFuaVNpckdsb2JhbCAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUNvdW50cnkgKnBEb3QxMWYsICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLy8vIFBvcHVsYXRlZCBhIFBvcHVsYXRlRG90MTFmRFNQYXJhbXMKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmRFNQYXJhbXModHBBbmlTaXJHbG9iYWwgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRURTUGFyYW1zICpwRG90MTFmLCB0QU5JX1U4IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisKKy8vLyBQb3B1bGF0ZWQgYSB0RG90MTFmSUVFRENBUGFyYW1TZXQKK3ZvaWQKK1BvcHVsYXRlRG90MTFmRURDQVBhcmFtU2V0KHRwQW5pU2lyR2xvYmFsICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUVEQ0FQYXJhbVNldCAqcERvdDExZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZFUlBJbmZvKHRwQW5pU2lyR2xvYmFsICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRVJQSW5mbyAqcERvdDExZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZWxzZQordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZFUlBJbmZvKHRwQW5pU2lyR2xvYmFsICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRVJQSW5mbyAqcERvdDExZik7CisjZW5kaWYKKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZFeHRTdXBwUmF0ZXModHBBbmlTaXJHbG9iYWwgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgbkNoYW5uZWxOdW0sIHREb3QxMWZJRUV4dFN1cHBSYXRlcyAqcERvdDExZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCit0U2lyUmV0U3RhdHVzIAorUG9wdWxhdGVEb3QxMWZCZWFjb25SZXBvcnQodHBBbmlTaXJHbG9iYWwgICAgICAgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCAqcERvdDExZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQmVhY29uUmVwb3J0ICpwQmVhY29uUmVwb3J0ICk7CisjZW5kaWYKKworLyoqCisgKiBcYnJpZWYgUG9wdWxhdGUgYSB0RG90MTFmSUVFeHRTdXBwUmF0ZXMKKyAqCisgKgorICogXHBhcmFtIHBNYWMgUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBkYXRhc3RydWN0dXJlCisgKgorICogXHBhcmFtIG5DaGFubmVsTnVtIENoYW5uZWwgb24gd2hpY2ggdGhlIGVuY2xvc2luZyBmcmFtZSB3aWxsIGJlIGdvaW5nIG91dAorICoKKyAqIFxwYXJhbSBwRG90MTFmIEFkZHJlc3Mgb2YgYSB0RG90MTFmSUVFeHRTdXBwUmF0ZXMgc3RydWN0IHRvIGJlIGZpbGxlZCBpbi4KKyAqCisgKgorICogVGhpcyBtZXRob2QgaXMgYSBOT1AgaWYgdGhlIGNoYW5uZWwgaXMgZ3JlYXRlciB0aGFuIDE0LgorICoKKyAqCisgKi8KKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZFeHRTdXBwUmF0ZXMxKHRwQW5pU2lyR2xvYmFsICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZIQ0YodHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgICAgY2FwRW5hYmxlLAorICAgICAgICAgICAgICAgICAgdERvdDExZklFSENGICAgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZkhUQ2Fwcyh0cEFuaVNpckdsb2JhbCAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFSFRDYXBzICpwRG90MTFmKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmSFRJbmZvKHRwQW5pU2lyR2xvYmFsICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUhUSW5mbyAqcERvdDExZiwKKyAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uICAgICAgcHNlc3Npb25FbnRyeSk7CisjZWxzZQordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZIVEluZm8odHBBbmlTaXJHbG9iYWwgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFSFRJbmZvICpwRG90MTFmKTsKKyNlbmRpZgorCit2b2lkIFBvcHVsYXRlRG90MTFmSUJTU1BhcmFtcyh0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICAgICB0RG90MTFmSUVJQlNTUGFyYW1zICpwRG90MTFmLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworI2lmZGVmIEFOSV9TVVBQT1JUXzExSAordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZNZWFzdXJlbWVudFJlcG9ydDAodHBBbmlTaXJHbG9iYWwgICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSAgcFJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICpwRG90MTFmKTsKKworLy8vIFBvcHVsYXRlIGEgdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgd2hlbiB0aGUgcmVwb3J0IHR5cGUgaXMgQ0NBCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZk1lYXN1cmVtZW50UmVwb3J0MSh0cEFuaVNpckdsb2JhbCAgICAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lICBwUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgKnBEb3QxMWYpOworCisvLy8gUG9wdWxhdGUgYSB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCB3aGVuIHRoZSByZXBvcnQgdHlwZSBpcyBSUEkgSGlzdAordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZNZWFzdXJlbWVudFJlcG9ydDIodHBBbmlTaXJHbG9iYWwgICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSAgcFJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICpwRG90MTFmKTsKKyNlbmRpZiAgLy9BTklfU1VQUE9SVF8xMUgKKworLy8vIFBvcHVsYXRlIGEgdERvdDExZklFUG93ZXJDYXBzCit2b2lkCitQb3B1bGF0ZURvdDExZlBvd2VyQ2Fwcyh0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVBvd2VyQ2FwcyAqcENhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IG5Bc3NvY1R5cGUsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8vLyBQb3B1bGF0ZSBhIHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmUG93ZXJDb25zdHJhaW50cyh0cEFuaVNpckdsb2JhbCAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZlByb3BDYXBhYmlsaXR5KHRwQW5pU2lyR2xvYmFsICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgICBjYXBFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVByb3BDYXBhYmlsaXR5ICpwRG90MTFmKTsKKwordm9pZAorUG9wdWxhdGVEb3QxMWZQcm9wQ2hhbm5Td2l0Y2hBbm4odHBBbmlTaXJHbG9iYWwgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcEVuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVByb3BDaGFublN3aXRjaEFubiAqcERvdDExZik7CisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmUHJvcEVEQ0FQYXJhbXModHBBbmlTaXJHbG9iYWwgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgICAgIGNhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVByb3BFRENBUGFyYW1zICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZQcm9wU3VwcFJhdGVzKHRwQW5pU2lyR2xvYmFsICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICBjYXBFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUHJvcFN1cHBSYXRlcyAqcERvdDExZik7CisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmUU9TQ2Fwc0FwKHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVFPU0NhcHNBcCAqcERvdDExZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmUU9TQ2Fwc1N0YXRpb24odHBBbmlTaXJHbG9iYWwgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cyAKK1BvcHVsYXRlRG90MTFmUlNOKHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgICAgICAgICAgICAgICAgdHBTaXJSU05pZSAgICAgIHBSc25JZSwKKyAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVJTTiAgICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZSU05PcGFxdWUoIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgIHRwU2lyUlNOaWUgICAgICBwUnNuSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUlNOT3BhcXVlICpwRG90MTFmICk7CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZldBUEkodHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgICAgICAgICAgICAgICB0cFNpclJTTmllICAgICAgcFJzbkllLAorICAgICAgICAgICAgICAgICAgdERvdDExZklFV0FQSSAgICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZldBUElPcGFxdWUoIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUlNOaWUgICAgICAgICAgcFJzbkllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV0FQSU9wYXF1ZSAqcERvdDExZiApOworCisjZW5kaWYgLy9kZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorCisvLy8gUG9wdWxhdGUgYSB0RG90MTFmSUVTU0lEIGdpdmVuIGEgdFNpck1hY1NTaWQKK3ZvaWQKK1BvcHVsYXRlRG90MTFmU1NJRCh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgIHRTaXJNYWNTU2lkICAgKnBJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTU0lEICpwRG90MTFmKTsKKworLy8vIFBvcHVsYXRlIGEgdERvdDExZklFU1NJRCBmcm9tIENGRwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZTU0lEMih0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTU0lEICpwRG90MTFmKTsKKworCisvKioKKyAqIFxicmllZiBQb3B1bGF0ZSBhIHREb3QxMWZJRVNjaGVkdWxlCisgKgorICogXHNhIFBvcHVsYXRlRG90MTFmV01NU2NoZWR1bGUKKyAqCisgKgorICogXHBhcmFtIHBTY2hlZHVsZSBBZGRyZXNzIG9mIGEgdFNpck1hY1NjaGVkdWxlSUUgc3RydWN0CisgKgorICogXHBhcmFtIHBEb3QxMWYgQWRkcmVzcyBvZiBhIHREb3QxMWZJRVNjaGVkdWxlIHRvIGJlIGZpbGxlZCBpbgorICoKKyAqCisgKi8KKwordm9pZAorUG9wdWxhdGVEb3QxMWZTY2hlZHVsZSh0U2lyTWFjU2NoZWR1bGVJRSAqcFNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTY2hlZHVsZSAqcERvdDExZik7CisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmU3VwcENoYW5uZWxzKHRwQW5pU2lyR2xvYmFsICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVN1cHBDaGFubmVscyAqcERvdDExZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggbkFzc29jVHlwZSx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLyoqCisgKiBcYnJpZWYgUG9wdWxhdGVkIGEgdERvdDExZklFU3VwcFJhdGVzCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgZGF0YXN0cnVjdHVyZQorICoKKyAqIFxwYXJhbSBuQ2hhbm5lbE51bSBDaGFubmVsIHRoZSBlbmNsb3NpbmcgZnJhbWUgd2lsbCBiZSBnb2luZyBvdXQgb247IHNlZQorICogYmVsb3cKKyAqCisgKiBccGFyYW0gcERvdDExZiBBZGRyZXNzIG9mIGEgdERvdDExZklFU3VwcFJhdGVzIHN0cnVjdCB0byBiZSBmaWxsZWQgaW4uCisgKgorICoKKyAqIElmIG5DaGFubmVsTnVtIGlzIGdyZWF0ZXIgdGhhbiAxMywgdGhlIHN1cHBvcnRlZCByYXRlcyB3aWxsIGJlCisgKiBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUIuICBJZiBpdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTMsIHRoZQorICogc3VwcG9ydGVkIHJhdGVzIHdpbGwgYmUgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBLiAgSWYgbkNoYW5uZWxOdW0gaXMKKyAqIHNldCB0byB0aGUgc2VudGluZWwgdmFsdWUgUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLCB0aGUgc3RydWN0CisgKiB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIFdOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVQuCisgKgorICoKKyAqLworCisjZGVmaW5lIFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCAoIDB4ZmYgKQorCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZlN1cHBSYXRlcyh0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgbkNoYW5uZWxOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTdXBwUmF0ZXMgKnBEb3QxMWYsdHBQRVNlc3Npb24pOworCisKK3RTaXJSZXRTdGF0dXMgUG9wdWxhdGVEb3QxMWZUUENSZXBvcnQodHBBbmlTaXJHbG9iYWwgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUUENSZXBvcnQgKnBEb3QxMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvLy8gUG9wdWxhdGUgYSB0RG90MTFGZlRTSW5mbwordm9pZCBQb3B1bGF0ZURvdDExZlRTSW5mbyh0U2lyTWFjVFNJbmZvICAgKnBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZUU0luZm8gKnBEb3QxMWYpOworCisKK3ZvaWQgUG9wdWxhdGVEb3QxMWZXTU0odHBBbmlTaXJHbG9iYWwgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1JbmZvQXAgICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NUGFyYW1zICpwUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1DYXBzICAgKnBDYXBzLAorICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiAgICAgICAgcHNlc3Npb25FbnRyeSk7CisKK3ZvaWQgUG9wdWxhdGVEb3QxMWZXTU1DYXBzKHREb3QxMWZJRVdNTUNhcHMgKnBDYXBzKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKK3ZvaWQgUG9wdWxhdGVEb3QxMVRTUlNJRSh0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQ0NYVFNSU0lFICAgICAqcE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDQ1hUcmFmU3RybVJhdGVTZXQgICpwRG90MTFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggcmF0ZV9sZW5ndGgpOwordm9pZCBQb3B1bGF0ZURvdDExZlJlQXNzb2NUc3BlYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmUmVBc3NvY1JlcXVlc3QgKnBSZWFzc29jLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZgorCit2b2lkIFBvcHVsYXRlRG90MTFmV01NSW5mb0FwKHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NSW5mb0FwICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3ZvaWQgUG9wdWxhdGVEb3QxMWZXTU1JbmZvU3RhdGlvbih0cEFuaVNpckdsb2JhbCAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiAqcEluZm8pOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordm9pZCBQb3B1bGF0ZURvdDExZldNTVBhcmFtcyh0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdNTVBhcmFtcyAqcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gICAgICAgIHBzZXNzaW9uRW50cnkpOworI2Vsc2UKK3ZvaWQgUG9wdWxhdGVEb3QxMWZXTU1QYXJhbXModHBBbmlTaXJHbG9iYWwgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1QYXJhbXMgKnBQYXJhbXMpOworI2VuZGlmCisKKy8qKgorICogXGJyaWVmIFBvcHVsYXRlIGEgdERvdDExZklFV01NU2NoZWR1bGUKKyAqCisgKiBcc2EgUG9wdWxhdGVkRG90MTFmU2NoZWR1bGUKKyAqCisgKgorICogXHBhcmFtIHBTY2hlZHVsZSBBZGRyZXNzIG9mIGEgdFNpck1hY1NjaGVkdWxlSUUgc3RydWN0CisgKgorICogXHBhcmFtIHBEb3QxMWYgQWRkcmVzcyBvZiBhIHREb3QxMWZJRVdNTVNjaGVkdWxlIHRvIGJlIGZpbGxlZCBpbgorICoKKyAqCisgKi8KKwordm9pZAorUG9wdWxhdGVEb3QxMWZXTU1TY2hlZHVsZSh0U2lyTWFjU2NoZWR1bGVJRSAgICAqcFNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1TY2hlZHVsZSAqcERvdDExZik7CisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmV1BBKHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgICAgICAgICAgICAgICAgdHBTaXJSU05pZSAgICAgIHBSc25JZSwKKyAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdQQSAgICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZXUEFPcGFxdWUoIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpclJTTmllICAgICAgICAgIHBSc25JZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXUEFPcGFxdWUgKnBEb3QxMWYgKTsKKwordm9pZAorUG9wdWxhdGVEb3QxMWZUU1BFQyh0U2lyTWFjVHNwZWNJRSAgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVRTUEVDICAqcERvdDExZik7CisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmV01NVFNQRUModFNpck1hY1RzcGVjSUUgICAgICpwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1UU1BFQyAgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZlRDTEFTKHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgICAgICAgICAgICAgICAgICB0U2lyVGNsYXNJbmZvICAqcE9sZCwKKyAgICAgICAgICAgICAgICAgICAgdERvdDExZklFVENMQVMgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZldNTVRDTEFTKHRwQW5pU2lyR2xvYmFsICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICB0U2lyVGNsYXNJbmZvICAgICAqcE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NVENMQVMgKnBEb3QxMWYpOworCisjaWYgKCBXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQICkKKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZDRlBhcmFtcyh0cEFuaVNpckdsb2JhbCAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZkNhcGFiaWxpdGllcyAqcENhcHMsCisgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUNGUGFyYW1zICAgICAqcERvdDExZik7CisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmUXVpZXQodHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVF1aWV0ICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZBUE5hbWUodHBBbmlTaXJHbG9iYWwgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgIGNhcEVuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUFQTmFtZSAqcERvdDExZik7CisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmUHJvcFF1aWV0QlNTKHRwQW5pU2lyR2xvYmFsICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICBjYXBzRW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUHJvcFF1aWV0QlNTICpwRG90MTFmKTsKKwordm9pZAorUG9wdWxhdGVEb3QxMWZUcmlnU3RhQmtTY2FuKHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICAgICBjYXBzRW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVRyaWdnZXJTdGFCZ1NjYW4gKnBEb3QxMWYpOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmV0RTKHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgY2FwRW5hYmxlLAorICAgICAgICAgICAgICAgICAgdERvdDExZklFV0RTICAgKnBEb3QxMWYgKTsKKworI2VuZGlmIC8vIFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQKKworI2VuZGlmIC8vIFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVAKKwordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZldzYyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXc2NCZWFjb24gKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzIFBvcHVsYXRlRG90MTFmV3NjUmVnaXN0cmFySW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV3NjQmVhY29uICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cyBEZVBvcHVsYXRlRG90MTFmV3NjUmVnaXN0cmFySW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXc2NCZWFjb24gKnBEb3QxMWYpOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZlByb2JlUmVzV1BTSUVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRVdzY1Byb2JlUmVzICpwRG90MTFmLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3RTaXJSZXRTdGF0dXMgUG9wdWxhdGVEb3QxMWZBc3NvY1Jlc1dQU0lFcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVXc2NBc3NvY1JlcyAqcERvdDExZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit0U2lyUmV0U3RhdHVzIFBvcHVsYXRlRG90MTFmQmVhY29uV1BTSUVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRVdzY0JlYWNvbiAqcERvdDExZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKwordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZldzY0luUHJvYmVSZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdzY1Byb2JlUmVzICpwRG90MTFmKTsKKwordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZldzY1JlZ2lzdHJhckluZm9JblByb2JlUmVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV3NjUHJvYmVSZXMgKnBEb3QxMWYpOworCit0U2lyUmV0U3RhdHVzIERlUG9wdWxhdGVEb3QxMWZXc2NSZWdpc3RyYXJJbmZvSW5Qcm9iZVJlcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV3NjUHJvYmVSZXMgKnBEb3QxMWYpOworCisKK3RTaXJSZXRTdGF0dXMgUG9wdWxhdGVEb3QxMWZBc3NvY1Jlc1dzY0lFKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV3NjQXNzb2NSZXMgKnBEb3QxMWYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJBc3NvY1JlcSBwUmN2ZEFzc29jUmVxKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKK3RTaXJSZXRTdGF0dXMgUG9wdWxhdGVEb3QxMUFzc29jUmVzUDJQSUUodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQMlBBc3NvY1JlcyAqcERvdDExZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpckFzc29jUmVxIHBSY3ZkQXNzb2NSZXEpOworI2VuZGlmCisKK3RTaXJSZXRTdGF0dXMgUG9wdWxhdGVEb3QxMWZXc2NJbkFzc29jUmVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXc2NBc3NvY1JlcyAqcERvdDExZik7CisKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZldGQVRQQyggdHBBbmlTaXJHbG9iYWwgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXRkFUUEMgKnBEb3QxMWYsIHRBTklfVTggdHhQb3dlciwgdEFOSV9VOCBsaW5rTWFyZ2luICk7CisKK3RTaXJSZXRTdGF0dXMgUG9wdWxhdGVEb3QxMWZSUk1JZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVJSTUVuYWJsZWRDYXAgKnBEb3QxMWYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiAgICBwc2Vzc2lvbkVudHJ5ICk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK3ZvaWQgUG9wdWxhdGVNRElFKCB0cEFuaVNpckdsb2JhbCAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVNb2JpbGl0eURvbWFpbiAqcERvdDExZiwgdEFOSV9VOCBtZGllW10gKTsKK3ZvaWQgUG9wdWxhdGVGVEluZm8oIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUZUSW5mbyAgICAgKnBEb3QxMWYgKTsKKyNlbmRpZgorCit2b2lkIFBvcHVsYXRlRG90MTFmQXNzb2NSc3BSYXRlcyAoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRVN1cHBSYXRlcyAqcFN1cHAsIAorICAgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICpwRXh0LCB0QU5JX1UxNiAqXzExYlJhdGVzLCB0QU5JX1UxNiAqXzExYVJhdGVzICk7CisKK2ludCBGaW5kSUVMb2NhdGlvbiggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUlNOaWUgcFJzbkllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBFSUQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvaW5jbHVkZS9waHlHbG9iYWwuaCBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL3BoeUdsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZGFmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvaW5jbHVkZS9waHlHbG9iYWwuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLCBDb3B5cmlnaHQgMjAwNQorICogVGhpcyBwcm9ncmFtIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IHByb2R1Y3Qgb2YgQWlyZ28gTmV0d29ya3MgSW5jLgorICogQW55IFVuYXV0aG9yaXplZCB1c2UsIHJlcHJvZHVjdGlvbiBvciB0cmFuc2ZlciBvZiB0aGlzIHByb2dyYW0gaXMgc3RyaWN0bHkgcHJvaGliaXRlZC4KKyAqIAorICogcGh5R2xvYmFsLmg6IEhvbGRzIGFsbCBnbG9iYWxzIGZvciB0aGUgcGh5LCByZiwgYW5kIGFzaWMgbGF5ZXJzIGluIGhhbAorICogQXV0aG9yOiAgTWFyayBOZWxzb24KKyAqIERhdGU6ICAgIDQvOS8wNQorICoKKyAqIEhpc3RvcnkgLQorICogRGF0ZSAgICAgICAgTW9kaWZpZWQgYnkgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgUEhZR0xPQkFMX0gKKyNkZWZpbmUgUEhZR0xPQkFMX0gKKworI2luY2x1ZGUgImhhbFBoeVZvcy5oIgorI2luY2x1ZGUgIndsYW5fcmYuaCIKKyNpbmNsdWRlICJ3bGFuX3BoeS5oIgorI2luY2x1ZGUgInBoeVR4UG93ZXIuaCIKKyNpbmNsdWRlIDxxd2xhbmh3X3ZvbGFucy5oPgorI2luY2x1ZGUgImFzaWMuaCIKKyNpbmNsdWRlICJ3bGFuX252LmgiCisKKworCisvLyNkZWZpbmUgQU5JX01BTkZfRElBRyAgICAgICAvL3RlbXBvcmFyeSB1bnRpbCB0aGlzIGlzIHBhcnQgb2YgbWFuZkRpYWcgYnVpbGQgLSBhbmlHbG9iYWwuaCBuZWVkcyB0aGlzIHRvIGJ1aWxkIHRoZSBwdHQgZ2xvYmFscworCisjaWZkZWYgVk9MQU5TX1ZTV1JfV09SS0FST1VORAorI2RlZmluZSBPUEVOX0xPT1BfVFhfSElHSF9HQUlOX09WRVJSSURFICAgICA2ICAvL3VzZWQgZm9yIFJWUiB0ZXN0cyBpbiBvcGVuIGxvb3AgbW9kZQorI2Vsc2UKKyNkZWZpbmUgT1BFTl9MT09QX1RYX0hJR0hfR0FJTl9PVkVSUklERSAgICAgMTAgIC8vdXNlZCBmb3IgUlZSIHRlc3RzIGluIG9wZW4gbG9vcCBtb2RlCisjZW5kaWYKKyNkZWZpbmUgT1BFTl9MT09QX1RYX0xPV19HQUlOX09WRVJSSURFICAgICAgMyAgIC8vdXNlZCBmb3IgdGhyb3VnaHB1dCB0ZXN0cyBpbiBvcGVuIGxvb3AgbW9kZQorCisvLyBGdW5jdGlvbiBwb2ludGVyIGZvciB0byB0aGUgQ0IgZnVuY3Rpb24gYWZ0ZXIgc2V0IGNoYW5uZWwgcmVzcG9uc2UgZnJvbSBGVwordHlwZWRlZiB2b2lkICgqZnVuY0hhbFNldENoYW5DQikodHBBbmlTaXJHbG9iYWwsIHZvaWQqLCB0QU5JX1UzMiwgdEFOSV9VMTYpOworCisvLyBTdHJ1Y3R1cmUgdG8gc2F2ZSB0aGUgY29udGV4dCBmcm9tIHdoZXJlIHRoZSBzZXQgY2hhbm5lbCBpcyBjYWxsZWQKK3R5cGVkZWYgc3RydWN0IHNQaHlTZXRDaGFuQ250eCB7CisgICAgdEFOSV9VOCBuZXdDaGFubmVsOworICAgIHRBTklfVTggbmV3UmZCYW5kOworICAgIHRBTklfVTggbmV3Q2JTdGF0ZTsKKyAgICB0QU5JX1U4IG5ld0NhbFJlcWQ7CisgICAgdm9pZCogICBwRGF0YTsKKyAgICBmdW5jSGFsU2V0Q2hhbkNCIHBGdW5jOworICAgIHRBTklfVTE2IGRpYWxvZ190b2tlbjsKK30gdFBoeVNldENoYW5DbnR4LCAqdHBQaHlTZXRDaGFuQ250eDsKKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHNIYWxOdiBudkNhY2hlOworICAgIHZvaWQgKm52VGFibGVzW05VTV9OVl9UQUJMRV9JRFNdOworCisgICAgLy9ldmVudCBvYmplY3QgZm9yIGJsb2NrZWQgd2FpdCBhcm91bmQgaGFsUGh5U2V0Q2hhbm5lbAorICAgIEhBTF9QSFlfU0VUX0NIQU5fRVZFTlRfVFlQRSBzZXRDaGFuRXZlbnQ7CisgICAgdEFOSV9VMzIgZndTZXRDaGFubmVsU3RhdHVzOworCisgICAgdFBoeVNldENoYW5DbnR4IHNldENoYW5DbnR4OworCisgICAgLy9waHlzaWNhbCBsYXllciBkYXRhIC0gY29ycmVzcG9uZHMgdG8gaW5kaXZpZHVhbCBtb2R1bGVzCisgICAgdFBoeSAgICAgICAgcGh5OworICAgIHRBc2ljVHhGaXIgIHR4ZmlyOworICAgIC8vdFBoeVR4UG93ZXIgcGh5VFBDOworICAgIHRSRiAgICAgICAgIHJmOworICAgIHRBc2ljQWdjICAgIGFnYzsKKworICAgIHRBTklfQk9PTEVBTiB3Zm1fY2xrODA7IC8vPU9OIGlmIDIwTUhaIGNsb2NrIHNhbXBsZXMsID1PRkYgZm9yIDgwTUhaIGNsb2NrIHNhbXBsZXMKKyAgICB0QU5JX1U4ICAgICBjYWxQZXJpb2RUaWNrczsgICAgIC8vY291bnRzIHBlaW9kaWMgaW50ZXJydXB0cyBzaW5jZSBsYXN0IHBlcmlvZGljIGNhbGlicmF0aW9uCisgICAgdEFOSV9CT09MRUFOIGRlbnNpdHlFbmFibGVkOworICAgIGVQaHlOd0RlbnNpdHkgbndEZW5zaXR5MjBNSHo7ICAgICAvLyBOZXR3b3JrIGRlbnNpdHkgdmFsdWUgZm9yIDIwTUh6IGNoYW5uZWwgd2lkdGgKKyAgICBlUGh5TndEZW5zaXR5IG53RGVuc2l0eTQwTUh6OyAgICAgLy8gTmV0d29yayBkZW5zaXR5IHZhbHVlIGZvciA0ME1IeiBjaGFubmVsIHdpZHRoCisgICAgZVBoeVJ4RGlzYWJsZWRQa3RUeXBlcyBtb2RUeXBlczsgIC8vY3VycmVudCBkaXNhYmxlZCBwYWNrZXQgdHlwZXMKKyAgICB2b2xhdGlsZSB0QU5JX0JPT0xFQU4gc2V0UGh5TXNnRXZlbnQ7CisgICAgdEFOSV9VMzIgaGRldFJlc2lkdWFsRENPOworfXRBbmlTaXJQaHk7CisKKyNlbmRpZiAvKiBQSFlHTE9CQUxfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2luY2x1ZGUvc2lyQ29tbW9uLmggYi9DT1JFL01BQy9zcmMvaW5jbHVkZS9zaXJDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzg3MzdmCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL2luY2x1ZGUvc2lyQ29tbW9uLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBzaXJDb21tb24uaCBjb250YWlucyB0aGUgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsCisgKiBGaXJtd2FyZSBtb2R1bGVzLgorICoKKyAqIEF1dGhvcjogICAgICBWLiBLLiBLYW5kYXJwYQorICogRGF0ZTogICAgICAgIDA0LzEyLzIwMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fU0lSQ09NTU9OX0gKKyNkZWZpbmUgX19TSVJDT01NT05fSAorCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAic2lyUGFyYW1zLmgiCisjaW5jbHVkZSAic2lyV3JhcHBlci5oIgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCBUWF9OVUxMCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBTSVJJVVMgU1lTVEVNIEVYVEVSTkFMIEdMT0JBTFMgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKy8vIEFsbCB0aGUgZm9sbG93aW5nIGFyZSByZXNvdXJjZSBkZWZpbml0aW9ucworCisjZW5kaWYgLyogX19TSVJDT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2luY2x1ZGUvc2lyRGVidWcuaCBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL3NpckRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ODBkMwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL3NpckRlYnVnLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19QT0xfREVCVUdfSF9fCisjZGVmaW5lIF9fUE9MX0RFQlVHX0hfXworCisjZGVmaW5lIExPR09GRiAgMAorI2RlZmluZSBMT0dQICAgIDEKKyNkZWZpbmUgTE9HRSAgICAyCisjZGVmaW5lIExPR1cgICAgMworI2RlZmluZSBMT0cxICAgIDQKKyNkZWZpbmUgTE9HMiAgICA1CisjZGVmaW5lIExPRzMgICAgNgorI2RlZmluZSBMT0c0ICAgIDcKKworI2lmZGVmIEFOSV9ERUJVRworI2RlZmluZSBQTU1fTE9HX0xFVkVMIExPRzQKKyNkZWZpbmUgU0NIX0xPR19MRVZFTCBMT0c0CisjZGVmaW5lIEFSUV9MT0dfTEVWRUwgTE9HNAorI2RlZmluZSBMSU1fTE9HX0xFVkVMIExPRzQKKyNkZWZpbmUgSEFMX0xPR19MRVZFTCBMT0c0CisjZGVmaW5lIFNZU19MT0dfTEVWRUwgTE9HNAorI2RlZmluZSBDRkdfTE9HX0xFVkVMIExPRzQKKyNkZWZpbmUgRFBIX0xPR19MRVZFTCBMT0c0CisjZWxzZQorI2RlZmluZSBQTU1fTE9HX0xFVkVMIExPR1cKKyNkZWZpbmUgU0NIX0xPR19MRVZFTCBMT0dXCisjZGVmaW5lIEFSUV9MT0dfTEVWRUwgTE9HVworI2RlZmluZSBMSU1fTE9HX0xFVkVMIExPR1cKKyNkZWZpbmUgSEFMX0xPR19MRVZFTCBMT0dXCisjZGVmaW5lIFNZU19MT0dfTEVWRUwgTE9HVworI2RlZmluZSBDRkdfTE9HX0xFVkVMIExPR1cKKyNkZWZpbmUgRFBIX0xPR19MRVZFTCBMT0dXCisjZW5kaWYKKworCisjaWZkZWYgIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorI2lmZGVmIFBFX0RFQlVHX0xPR0UKKyNkZWZpbmUgUEVMT0dFKHApIHsgcCB9CisjZWxzZQorI2RlZmluZSBQRUxPR0UocCkgeyB9CisjZW5kaWYKKworI2lmZGVmIFBFX0RFQlVHX0xPR1cKKyNkZWZpbmUgUEVMT0dXKHApIHsgcCB9CisjZWxzZQorI2RlZmluZSBQRUxPR1cocCkgeyB9CisjZW5kaWYKKworI2RlZmluZSBQRUxPRzEocCkgeyB9CisjZGVmaW5lIFBFTE9HMihwKSB7IH0KKyNkZWZpbmUgUEVMT0czKHApIHsgfQorI2RlZmluZSBQRUxPRzQocCkgeyB9CisKKworI2Vsc2UgLyogV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUICovCisKKyNpZmRlZiBQRV9ERUJVR19MT0dFCisjZGVmaW5lIFBFTE9HRShwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0dFKHApIHsgfQorI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0dXCisjZGVmaW5lIFBFTE9HVyhwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0dXKHApIHsgfQorI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0cxCisjZGVmaW5lIFBFTE9HMShwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0cxKHApIHsgfQorI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0cyCisjZGVmaW5lIFBFTE9HMihwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0cyKHApIHsgfQorI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0czCisjZGVmaW5lIFBFTE9HMyhwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0czKHApIHsgfQorI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0c0CisjZGVmaW5lIFBFTE9HNChwKSB7IHAgfQorI2Vsc2UKKyNkZWZpbmUgUEVMT0c0KHApIHsgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQgKi8KKworI2RlZmluZSBGTCh4KSAgICAiJXM6ICVkOiAiXAorICAgICAgICAgICAgICAgICB4LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2luY2x1ZGUvc2lyUGFyYW1zLmggYi9DT1JFL01BQy9zcmMvaW5jbHVkZS9zaXJQYXJhbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmRhMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL2luY2x1ZGUvc2lyUGFyYW1zLmgKQEAgLTAsMCArMSw2ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBzaXJQYXJhbXMuaCBjb250YWlucyB0aGUgY29tbW9uIHBhcmFtZXRlciBkZWZpbml0aW9ucywgd2hpY2gKKyAqIGFyZSBub3QgZGVwZW5kZW50IG9uIHRocmVhZFggQVBJLiBUaGVzZSBjYW4gYmUgdXNlZCBieSBhbGwgRmlybXdhcmUKKyAqIG1vZHVsZXMuCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDA0LzEzLzIwMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fU0lSUEFSQU1TX0gKKyNkZWZpbmUgX19TSVJQQVJBTVNfSAorCisjIGluY2x1ZGUgInNpclR5cGVzLmgiCisKKyNkZWZpbmUgU0lSX1NES19PUFRfTUFYX05VTV9QUkVfQVVUSCAgICAzMgorCisvLyBGaXJtd2FyZSB3aWRlIGNvbnN0YW50cworCisjZGVmaW5lIFNJUl9NQVhfUEFDS0VUX1NJWkUgICAgIDIwNDgKKyNkZWZpbmUgU0lSX01BWF9OVU1fQ0hBTk5FTFMgICAgNjQKKyNkZWZpbmUgU0lSX01BWF9OVU1fU1RBX0lOX0lCU1MgMTYKKyNkZWZpbmUgU0lSX01BWF9OVU1fU1RBX0lOX0JTUyAgMjU2CisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQordHlwZWRlZiBlbnVtCit7CisgICAgUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEID0gMCwgICAgICAgIC8vIDIwTUh6IElGIGJhbmR3aWR0aCBjZW50ZXJlZCBvbiBJRiBjYXJyaWVyCisgICAgUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZID0gMSwgICAgIC8vIDQwTUh6IElGIGJhbmR3aWR0aCB3aXRoIGxvd2VyIDIwTUh6IHN1cHBvcnRpbmcgdGhlIHByaW1hcnkgY2hhbm5lbAorICAgIC8vbm90IGFsbG93ZWQgUEhZX0RPVUJMRV9DSEFOTkVMX0NFTlRFUkVEID0gMiwgICAgICAgIC8vIDQwTUh6IElGIGJhbmR3aWR0aCBjZW50ZXJlZCBvbiBJRiBjYXJyaWVyCisgICAgUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWSA9IDMgICAgIC8vIDQwTUh6IElGIGJhbmR3aWR0aCB3aXRoIGhpZ2hlciAyME1IeiBzdXBwb3J0aW5nIHRoZSBwcmltYXJ5IGNoYW5uZWwKK31lUGh5Q2hhbkJvbmRTdGF0ZTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKwordHlwZWRlZiBlbnVtIGVTcmlMaW5rU3RhdGUgeworICAgIGVTSVJfTElOS19JRExFX1NUQVRFICAgICAgICA9IDAsCisgICAgZVNJUl9MSU5LX1BSRUFTU09DX1NUQVRFICAgID0gMSwKKyAgICBlU0lSX0xJTktfUE9TVEFTU09DX1NUQVRFICAgPSAyLAorICAgIGVTSVJfTElOS19BUF9TVEFURSAgICAgICAgICA9IDMsCisgICAgZVNJUl9MSU5LX0lCU1NfU1RBVEUgICAgICAgID0gNCwKKyAgICAvLyBCVC1BTVAgQ2FzZQorICAgIGVTSVJfTElOS19CVEFNUF9QUkVBU1NPQ19TVEFURSAgPSA1LAorICAgIGVTSVJfTElOS19CVEFNUF9QT1NUQVNTT0NfU1RBVEUgID0gNiwKKyAgICBlU0lSX0xJTktfQlRBTVBfQVBfU1RBVEUgID0gNywKKyAgICBlU0lSX0xJTktfQlRBTVBfU1RBX1NUQVRFICA9IDgsCisKKyAgICAvLyBSZXNlcnZlZCBmb3IgSEFMIGludGVybmFsIHVzZQorICAgIGVTSVJfTElOS19MRUFSTl9TVEFURSAgICAgICA9IDksCisgICAgZVNJUl9MSU5LX1NDQU5fU1RBVEUgICAgICAgID0gMTAsCisgICAgZVNJUl9MSU5LX0ZJTklTSF9TQ0FOX1NUQVRFID0gMTEsCisgICAgZVNJUl9MSU5LX0lOSVRfQ0FMX1NUQVRFICAgID0gMTIsCisgICAgZVNJUl9MSU5LX0ZJTklTSF9DQUxfU1RBVEUgID0gMTMsCisgICAgZVNJUl9MSU5LX0xJU1RFTl9TVEFURSA9IDE0Cit9IHRTaXJMaW5rU3RhdGU7CisKKworLy8vIE1lc3NhZ2UgcXVldWUgc3RydWN0dXJlIHVzZWQgYWNyb3NzIFNpcml1cyBwcm9qZWN0LgorLy8vIE5PVEU6IHRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBtdWx0aXBsZXMgb2YgYSB3b3JkIHNpemUgKDRieXRlcykKKy8vLyBhcyB0aGlzIGlzIHVzZWQgaW4gdHhfcXVldWUgd2hlcmUgaXQgZXhwZWN0cyB0byBiZSBtdWx0aXBsZXMgb2YgNCBieXRlcy4KK3R5cGVkZWYgc3RydWN0IHNTaXJNc2dRCit7CisgICAgdEFOSV9VMTYgdHlwZTsKKyAgICAvKgorICAgICAqIFRoaXMgZmllbGQgY2FuIGJlIHVzZWQgYXMgc2VxdWVuY2UgbnVtYmVyL2RpYWxvZyB0b2tlbiBmb3IgbWF0Y2hpbmcKKyAgICAgKiByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLgorICAgICAqLworICAgIHRBTklfVTE2IHJlc2VydmVkOworICAgIC8qKgorICAgICAqIEJhc2VkIG9uIHRoZSB0eXBlIGVpdGhlciBhIGJvZHlwdHIgcG9pbnRlciBpbnRvCisgICAgICogbWVtb3J5IG9yIGJvZHl2YWwgYXMgYSAzMiBiaXQgZGF0YSBpcyB1c2VkLgorICAgICAqIGJvZHlwdHI6IGlzIGFsd2F5cyBhIGZyZWVhYmxlIHBvaW50ZXIsIG9uZSBzaG91bGQgYWx3YXlzCisgICAgICogbWFrZSBzdXJlIHRoYXQgYm9keXB0ciBpcyBhbHdheXMgZnJlZWFibGUuCisgICAgICoKKyAgICAgKiBNZXNzYWdlcyBzaG91bGQgdXNlIGVpdGhlciBib2R5cHRyIG9yIGJvZHl2YWw7IG5vdCBib3RoICEhIS4KKyAgICAgKi8KKyAgICB2b2lkICpib2R5cHRyOworICAgIHRBTklfVTMyIGJvZHl2YWw7Cit9IHRTaXJNc2dRLCAqdHBTaXJNc2dROworCisvLy8gTWFpbGJveCBNZXNzYWdlIFN0cnVjdHVyZSBEZWZpbmUKK3R5cGVkZWYgc3RydWN0IHNTaXJNYk1zZworeworICAgIHRBTklfVTE2IHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGxlbmd0aCBpbmNsdWRlcyA0IGJ5dGVzIG9mIGhlYWRlciwgdGhhdCBpcywKKyAgICAgKiAyIGJ5dGVzIHR5cGUgKyAyIGJ5dGVzIG1zZ0xlbiArIG4qNCBieXRlcyBvZiBkYXRhLgorICAgICAqIFRoaXMgZmllbGQgaXMgYnl0ZSBsZW5ndGguCisgICAgICovCisgICAgdEFOSV9VMTYgbXNnTGVuOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgZmlyc3QgZGF0YSB3b3JkIGluIHRoZSBtYWlsYm94IG1lc3NhZ2UuCisgICAgICogSXQgaXMgZm9sbG93ZWQgYnkgbiB3b3JkcyBvZiBkYXRhLgorICAgICAqIE5PVEU6IGRhdGFbMV0gaXMgbm90IGEgcGxhY2UgaG9sZGVyIHRvIHN0b3JlIGRhdGEKKyAgICAgKiBpbnN0ZWFkIHRvIGRlcmVmZXJlbmNlIHRoZSBtZXNzYWdlIGJvZHkuCisgICAgICovCisgICAgdEFOSV9VMzIgZGF0YVsxXTsKK30gdFNpck1iTXNnLCAqdHBTaXJNYk1zZzsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKy8vLyBNYWlsYm94IE1lc3NhZ2UgU3RydWN0dXJlIGZvciBQMlAgCit0eXBlZGVmIHN0cnVjdCBzU2lyTWJNc2dQMnAKK3sKKyAgICB0QU5JX1UxNiB0eXBlOworCisgICAgLyoqCisgICAgICogVGhpcyBsZW5ndGggaW5jbHVkZXMgNCBieXRlcyBvZiBoZWFkZXIsIHRoYXQgaXMsCisgICAgICogMiBieXRlcyB0eXBlICsgMiBieXRlcyBtc2dMZW4gKyBuKjQgYnl0ZXMgb2YgZGF0YS4KKyAgICAgKiBUaGlzIGZpZWxkIGlzIGJ5dGUgbGVuZ3RoLgorICAgICAqLworICAgIHRBTklfVTE2IG1zZ0xlbjsKKworICAgIHRBTklfVTMyIHNlc3Npb25JZDsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBmaXJzdCBkYXRhIHdvcmQgaW4gdGhlIG1haWxib3ggbWVzc2FnZS4KKyAgICAgKiBJdCBpcyBmb2xsb3dlZCBieSBuIHdvcmRzIG9mIGRhdGEuCisgICAgICogTk9URTogZGF0YVsxXSBpcyBub3QgYSBwbGFjZSBob2xkZXIgdG8gc3RvcmUgZGF0YQorICAgICAqIGluc3RlYWQgdG8gZGVyZWZlcmVuY2UgdGhlIG1lc3NhZ2UgYm9keS4KKyAgICAgKi8KKyAgICB0QU5JX1UzMiBkYXRhWzFdOworfSB0U2lyTWJNc2dQMnAsICp0cFNpck1iTXNnUDJwOworI2VuZGlmCisKKy8vLyBNZXNzYWdlIHF1ZXVlIGRlZmluaXRpb25zCisvLyAgbXNndHlwZSgyYnl0ZXMpIHJlc2VydmVkKDJieXRlcykgYm9keXB0cig0Ynl0ZXMpIGJvZHl2YWwoNGJ5dGVzKQorLy8gIE5PVEUgdFNpck1zZ1Egc2hvdWxkIGJlIGFsd2F5cyBtdWx0aXBsZXMgb2YgV09SRCg0Qnl0ZXMpCisvLyAgQWxsIFF1ZXVlIE1lc3NhZ2UgU2l6ZSBhcmUgbXVsdGlwbGVzIG9mIHdvcmQgU2l6ZSAoNCBieXRlcykKKyNkZWZpbmUgU1lTX01TR19TSVpFICAgICAgICAgICAgKHNpemVvZih0U2lyTXNnUSkvNCkKKworLy8vIGdIYWxNc2dRCisKKyNkZWZpbmUgU1lTX0hBTF9NU0dfU0laRSAgICAgICAgU1lTX01TR19TSVpFCisKKy8vLyBnTU1IaGlQcmlvcml0eU1zZ1EKKworI2RlZmluZSBTWVNfTU1IX0hJX1BSSV9NU0dfU0laRSBTWVNfTVNHX1NJWkUKKworLy8vIGdNTUhwcm90b2NvbE1zZ1EKKworI2RlZmluZSBTWVNfTU1IX1BST1RfTVNHX1NJWkUgICBTWVNfTVNHX1NJWkUKKworLy8vIGdNTUhkZWJ1Z01zZ1EKKworI2RlZmluZSBTWVNfTU1IX0RFQlVHX01TR19TSVpFICBTWVNfTVNHX1NJWkUKKworLy8vIGdNQUlOVG1zZ1EKKworI2RlZmluZSBTWVNfTU5UX01TR19TSVpFICAgICAgICBTWVNfTVNHX1NJWkUKKworLy8vIExJTSBNZXNzYWdlIFF1ZXVlCisKKyNkZWZpbmUgU1lTX0xJTV9NU0dfU0laRSAgICAgICAgU1lTX01TR19TSVpFCisKKy8vLyBBUlEgTWVzc2FnZSBRdWV1ZQorCisjZGVmaW5lIFNZU19BUlFfTVNHX1NJWkUgICAgICAgIFNZU19NU0dfU0laRQorCisvLy8gU2NoZWR1bGVyIE1lc3NhZ2UgUXVldWUKKworI2RlZmluZSBTWVNfU0NIX01TR19TSVpFICAgICAgICBTWVNfTVNHX1NJWkUKKworLy8vIFBNTSBNZXNzYWdlIFF1ZXVlCisKKyNkZWZpbmUgU1lTX1BNTV9NU0dfU0laRSAgICAgICAgU1lTX01TR19TSVpFCisKKy8vLyBUWCBNZXNzYWdlIFF1ZXVlCisKKyNkZWZpbmUgU1lTX1RYX01TR19TSVpFICAgICAgICAgKHNpemVvZih2b2lkICopLzQpICAvLyBNZXNzYWdlIHBvaW50ZXIgc2l6ZQorCisvLy8gUlggTWVzc2FnZSBRdWV1ZQorCisjZGVmaW5lIFNZU19SWF9NU0dfU0laRSAgICAgICAgIChzaXplb2Yodm9pZCAqKS80KSAgLy8gTWVzc2FnZSBwb2ludGVyIHNpemUKKworLy8vIFBUVCAgTWVzc2FnZSBRdWV1ZQorI2RlZmluZSBTWVNfTklNX1BUVF9NU0dfU0laRSAgICBTWVNfTVNHX1NJWkUgIC8vIE1lc3NhZ2UgcG9pbnRlciBzaXplCisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICBCbG9jayBwb29sIGNvbmZpZ3VyYXRpb24gICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8vIFRoZSBmb2xsb3dpbmcgdmFsdWVzIHNwZWNpZnkgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgY3JlYXRlZAorLy8gZm9yIGVhY2ggYmxvY2sgcG9vbCBzaXplLgorCisjZGVmaW5lIFNJUl9CVUZfQkxLXzMyX05VTSAgICAgICAgICAgNjQKKyNkZWZpbmUgU0lSX0JVRl9CTEtfNjRfTlVNICAgICAgICAgICAxMjgKKyNkZWZpbmUgU0lSX0JVRl9CTEtfOTZfTlVNICAgICAgICAgICAxNgorI2RlZmluZSBTSVJfQlVGX0JMS18xMjhfTlVNICAgICAgICAgIDEyOAorI2RlZmluZSBTSVJfQlVGX0JMS18xNjBfTlVNICAgICAgICAgIDgKKyNkZWZpbmUgU0lSX0JVRl9CTEtfMTkyX05VTSAgICAgICAgICAwCisjZGVmaW5lIFNJUl9CVUZfQkxLXzIyNF9OVU0gICAgICAgICAgMAorI2RlZmluZSBTSVJfQlVGX0JMS18yNTZfTlVNICAgICAgICAgIDEyOAorI2RlZmluZSBTSVJfQlVGX0JMS181MTJfTlVNICAgICAgICAgIDAKKyNkZWZpbmUgU0lSX0JVRl9CTEtfNzY4X05VTSAgICAgICAgICAwCisjZGVmaW5lIFNJUl9CVUZfQkxLXzEwMjRfTlVNICAgICAgICAgMgorI2RlZmluZSBTSVJfQlVGX0JMS18xMjgwX05VTSAgICAgICAgIDAKKyNkZWZpbmUgU0lSX0JVRl9CTEtfMTUzNl9OVU0gICAgICAgICAyCisjZGVmaW5lIFNJUl9CVUZfQkxLXzE3OTJfTlVNICAgICAgICAgMAorI2RlZmluZSBTSVJfQlVGX0JMS18yMDQ4X05VTSAgICAgICAgIDIKKyNkZWZpbmUgU0lSX0JVRl9CTEtfMjMwNF9OVU0gICAgICAgICAwCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgIFNJUklVUyBNRVNTQUdFIFRZUEVTICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1lc3NhZ2UgdHlwZXMgaGF2ZSBib3VuZHMgZGVmaW5lZCBmb3IgZWFjaCBtb2R1bGUgZm9yCisgKiBpbnRlciB0aHJlYWQvbW9kdWxlIGNvbW11bmljYXRpb25zLgorICogRWFjaCBtb2R1bGUgd2lsbCBnZXQgMjU2IG1lc3NhZ2UgdHlwZXMgaW4gdG90YWwuCisgKiBOb3RlIHRoYXQgbWVzc2FnZSB0eXBlIGRlZmluaXRpb25zIGZvciBtYWlsYm94IG1lc3NhZ2VzIGZvcgorICogY29tbXVuaWNhdGlvbiB3aXRoIEhvc3QgYXJlIGluIHduaUFwaS5oIGZpbGUuCisgKgorICogQW55IGFkZGl0aW9uL2RlbGV0aW9uIHRvIHRoaXMgbWVzc2FnZSBsaXN0IHNob3VsZCBhbHNvIGJlCisgKiByZWZsZWN0ZWQgaW4gdGhlIGhhbFV0aWxfZ2V0TXNnU3RyaW5nKCkgcm91dGluZS4KKyAqLworCisvLyBIQUwgbWVzc2FnZSB0eXBlcworI2RlZmluZSBTSVJfSEFMX01TR19UWVBFU19CRUdJTiAgICAgICAgICAgIChTSVJfSEFMX01PRFVMRV9JRCA8PCA4KQorI2RlZmluZSBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gICAgICAgIFNJUl9IQUxfTVNHX1RZUEVTX0JFR0lOKzB4MjAKKyNkZWZpbmUgU0lSX0hBTF9SQURBUl9ERVRFQ1RFRF9JTkQgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4KKyNkZWZpbmUgU0lSX0hBTF9XRFRfS0FNX1JTUCAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxCisjZGVmaW5lIFNJUl9IQUxfVElNRVJfVEVNUF9NRUFTX1JFUSAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMgorI2RlZmluZSBTSVJfSEFMX1RJTUVSX1BFUklPRElDX1NUQVRTX0NPTExFQ1RfUkVRICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMworI2RlZmluZSBTSVJfSEFMX0NBTF9SRVFfTlRGICAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDQKKyNkZWZpbmUgU0lSX0hBTF9NTlRfT1BFTl9UUENfVEVNUF9NRUFTX1JFUSBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA1CisjZGVmaW5lIFNJUl9IQUxfQ0NBX01PTklUT1JfSU5URVJWQUxfVE8gICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNgorI2RlZmluZSBTSVJfSEFMX0NDQV9NT05JVE9SX0RVUkFUSU9OX1RPICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDcKKyNkZWZpbmUgU0lSX0hBTF9DQ0FfTU9OSVRPUl9TVEFSVCAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA4CisjZGVmaW5lIFNJUl9IQUxfQ0NBX01PTklUT1JfU1RPUCAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgOQorI2RlZmluZSBTSVJfSEFMX0NDQV9DSEFOR0VfTU9ERSAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEwCisjZGVmaW5lIFNJUl9IQUxfVElNRVJfV1JBUF9BUk9VTkRfU1RBVFNfQ09MTEVDVF9SRVEgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMQorCisvKgorICogTmV3IFRhdXJ1cyByZWxhdGVkIG1lc3NhZ2VzCisgKi8KKyNkZWZpbmUgU0lSX0hBTF9BRERfU1RBX1JFUSAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMworI2RlZmluZSBTSVJfSEFMX0FERF9TVEFfUlNQICAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE0CisjZGVmaW5lIFNJUl9IQUxfREVMRVRFX1NUQV9SRVEgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTUKKyNkZWZpbmUgU0lSX0hBTF9ERUxFVEVfU1RBX1JTUCAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNgorI2RlZmluZSBTSVJfSEFMX0FERF9CU1NfUkVRICAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE3CisjZGVmaW5lIFNJUl9IQUxfQUREX0JTU19SU1AgICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTgKKyNkZWZpbmUgU0lSX0hBTF9ERUxFVEVfQlNTX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxOQorI2RlZmluZSBTSVJfSEFMX0RFTEVURV9CU1NfUlNQICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIwCisjZGVmaW5lIFNJUl9IQUxfSU5JVF9TQ0FOX1JFUSAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjEKKyNkZWZpbmUgU0lSX0hBTF9JTklUX1NDQU5fUlNQICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyMgorI2RlZmluZSBTSVJfSEFMX1NUQVJUX1NDQU5fUkVRICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDIzCisjZGVmaW5lIFNJUl9IQUxfU1RBUlRfU0NBTl9SU1AgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjQKKyNkZWZpbmUgU0lSX0hBTF9FTkRfU0NBTl9SRVEgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyNQorI2RlZmluZSBTSVJfSEFMX0VORF9TQ0FOX1JTUCAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDI2CisjZGVmaW5lIFNJUl9IQUxfRklOSVNIX1NDQU5fUkVRICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMjcKKyNkZWZpbmUgU0lSX0hBTF9GSU5JU0hfU0NBTl9SU1AgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyOAorI2RlZmluZSBTSVJfSEFMX1NFTkRfQkVBQ09OX1JFUSAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDI5CisjZGVmaW5lIFNJUl9IQUxfU0VORF9CRUFDT05fUlNQICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzAKKworI2RlZmluZSBTSVJfSEFMX0lOSVRfQ0ZHX1JFUSAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDMxCisjZGVmaW5lIFNJUl9IQUxfSU5JVF9DRkdfUlNQICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzIKKworI2RlZmluZSBTSVJfSEFMX0lOSVRfV01fQ0ZHX1JFUSAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDMzCisjZGVmaW5lIFNJUl9IQUxfSU5JVF9XTV9DRkdfUlNQICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzQKKworI2RlZmluZSBTSVJfSEFMX1NFVF9CU1NLRVlfUkVRICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDM1CisjZGVmaW5lIFNJUl9IQUxfU0VUX0JTU0tFWV9SU1AgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzYKKyNkZWZpbmUgU0lSX0hBTF9TRVRfU1RBS0VZX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAzNworI2RlZmluZSBTSVJfSEFMX1NFVF9TVEFLRVlfUlNQICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDM4CisjZGVmaW5lIFNJUl9IQUxfRFBVX1NUQVRTX1JFUSAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMzkKKyNkZWZpbmUgU0lSX0hBTF9EUFVfU1RBVFNfUlNQICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA0MAorI2RlZmluZSBTSVJfSEFMX0dFVF9EUFVJTkZPX1JFUSAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDQxCisjZGVmaW5lIFNJUl9IQUxfR0VUX0RQVUlORk9fUlNQICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNDIKKworI2RlZmluZSBTSVJfSEFMX1VQREFURV9FRENBX1BST0ZJTEVfSU5EICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDQzCisKKyNkZWZpbmUgU0lSX0hBTF9VUERBVEVfU1RBUkFURUlORk9fUkVRICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA0NQorI2RlZmluZSBTSVJfSEFMX1VQREFURV9TVEFSQVRFSU5GT19SU1AgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDQ2CisKKyNkZWZpbmUgU0lSX0hBTF9VUERBVEVfQkVBQ09OX0lORCAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA0NworI2RlZmluZSBTSVJfSEFMX1VQREFURV9DRl9JTkQgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDQ4CisjZGVmaW5lIFNJUl9IQUxfQ0hOTF9TV0lUQ0hfUkVRICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNDkKKyNkZWZpbmUgU0lSX0hBTF9BRERfVFNfUkVRICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA1MAorI2RlZmluZSBTSVJfSEFMX0RFTF9UU19SRVEgICAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDUxCisjZGVmaW5lIFNJUl9IQUxfU09GVE1BQ19UWFNUQVRfUkVQT1JUICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNTIKKworI2RlZmluZSBTSVJfSEFMX01CT1hfU0VORE1TR19DT01QTEVURV9JTkQgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDYxCisjZGVmaW5lIFNJUl9IQUxfRVhJVF9CTVBTX1JFUSAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNTMKKyNkZWZpbmUgU0lSX0hBTF9FWElUX0JNUFNfUlNQICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA1NAorI2RlZmluZSBTSVJfSEFMX0VYSVRfQk1QU19JTkQgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDU1CisjZGVmaW5lIFNJUl9IQUxfRU5URVJfQk1QU19SRVEgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNTYKKyNkZWZpbmUgU0lSX0hBTF9FTlRFUl9CTVBTX1JTUCAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA1NworI2RlZmluZSBTSVJfSEFMX0JNUFNfU1RBVFVTX0lORCAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDU4CisjZGVmaW5lIFNJUl9IQUxfTUlTU0VEX0JFQUNPTl9JTkQgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNTkKKworI2RlZmluZSBTSVJfSEFMX1NXSVRDSF9DSEFOTkVMX1JTUCAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDYwCisjZGVmaW5lIFNJUl9IQUxfUFdSX1NBVkVfQ0ZHICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNjIKKworI2RlZmluZSBTSVJfSEFMX1JFR0lTVEVSX1BFX0NBTExCQUNLICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDYzCisjZGVmaW5lIFNJUl9IQUxfU09GVE1BQ19NRU1fUkVBRFJFUVVFU1QgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNjQKKyNkZWZpbmUgU0lSX0hBTF9TT0ZUTUFDX01FTV9XUklURVJFUVVFU1QgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA2NQorCisjZGVmaW5lIFNJUl9IQUxfU09GVE1BQ19NRU1fUkVBRFJFU1BPTlNFICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNjYKKyNkZWZpbmUgU0lSX0hBTF9TT0ZUTUFDX0JVTEtSRUdXUklURV9DT05GSVJNICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNjcKKyNkZWZpbmUgU0lSX0hBTF9TT0ZUTUFDX0JVTEtSRUdSRUFEX1JFU1BPTlNFICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNjgKKyNkZWZpbmUgU0lSX0hBTF9TT0ZUTUFDX0hPU1RNRVNHX01TR1BST0NFU1NSRVNVTFQgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNjkKKworI2RlZmluZSBTSVJfSEFMX0FEREJBX1JFUSAgICAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDcwCisjZGVmaW5lIFNJUl9IQUxfQUREQkFfUlNQICAgICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNzEKKyNkZWZpbmUgU0lSX0hBTF9ERUxCQV9JTkQgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA3MgorI2RlZmluZSBTSVJfSEFMX0RFTF9CQV9JTkQgICAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDczCisKKy8vbWVzc2FnZSBmcm9tIHNtZSB0byBpbml0aWF0ZSBkZWxldGUgYmxvY2sgYWNrIHNlc3Npb24uCisjZGVmaW5lIFNJUl9IQUxfREVMQkFfUkVRICAgICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNzQKKyNkZWZpbmUgU0lSX0hBTF9JQlNTX1NUQV9BREQgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA3NQorI2RlZmluZSBTSVJfSEFMX1RJTUVSX0FESlVTVF9BREFQVElWRV9USFJFU0hPTERfSU5EICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNzYKKyNkZWZpbmUgU0lSX0hBTF9TRVRfTElOS19TVEFURSAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA3NworI2RlZmluZSBTSVJfSEFMX0VOVEVSX0lNUFNfUkVRICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDc4CisjZGVmaW5lIFNJUl9IQUxfRU5URVJfSU1QU19SU1AgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgNzkKKyNkZWZpbmUgU0lSX0hBTF9FWElUX0lNUFNfUlNQICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA4MAorI2RlZmluZSBTSVJfSEFMX0VYSVRfSU1QU19SRVEgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDgxCisjZGVmaW5lIFNJUl9IQUxfU09GVE1BQ19IT1NUTUVTR19QU19TVEFUVVNfSU5EICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA4MgorI2RlZmluZSBTSVJfSEFMX1BPU1RQT05FX0VOVEVSX0lNUFNfUlNQICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDgzCisjZGVmaW5lIFNJUl9IQUxfU1RBX1NUQVRfUkVRICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgODQKKyNkZWZpbmUgU0lSX0hBTF9HTE9CQUxfU1RBVF9SRVEgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA4NQorI2RlZmluZSBTSVJfSEFMX0FHR1JfU1RBVF9SRVEgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDg2CisjZGVmaW5lIFNJUl9IQUxfU1RBX1NUQVRfUlNQICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgODcKKyNkZWZpbmUgU0lSX0hBTF9HTE9CQUxfU1RBVF9SU1AgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA4OAorI2RlZmluZSBTSVJfSEFMX0FHR1JfU1RBVF9SU1AgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDg5CisjZGVmaW5lIFNJUl9IQUxfU1RBVF9TVU1NX1JFUSAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgOTAKKyNkZWZpbmUgU0lSX0hBTF9TVEFUX1NVTU1fUlNQICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA5MgorI2RlZmluZSBTSVJfSEFMX1JFTU9WRV9CU1NLRVlfUkVRICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDkzCisjZGVmaW5lIFNJUl9IQUxfUkVNT1ZFX0JTU0tFWV9SU1AgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgOTQKKyNkZWZpbmUgU0lSX0hBTF9SRU1PVkVfU1RBS0VZX1JFUSAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA5NQorI2RlZmluZSBTSVJfSEFMX1JFTU9WRV9TVEFLRVlfUlNQICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDk2CisjZGVmaW5lIFNJUl9IQUxfU0VUX1NUQV9CQ0FTVEtFWV9SRVEgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgOTcKKyNkZWZpbmUgU0lSX0hBTF9TRVRfU1RBX0JDQVNUS0VZX1JTUCAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA5OAorI2RlZmluZSBTSVJfSEFMX1JFTU9WRV9TVEFfQkNBU1RLRVlfUkVRICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDk5CisjZGVmaW5lIFNJUl9IQUxfUkVNT1ZFX1NUQV9CQ0FTVEtFWV9SU1AgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTAwCisjZGVmaW5lIFNJUl9IQUxfQUREX1RTX1JTUCAgICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTAxCisjZGVmaW5lIFNJUl9IQUxfRFBVX01JQ19FUlJPUiAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTAyCisjZGVmaW5lIFNJUl9IQUxfVElNRVJfQkFfQUNUSVZJVFlfUkVRICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTAzCisjZGVmaW5lIFNJUl9IQUxfVElNRVJfQ0hJUF9NT05JVE9SX1RJTUVPVVQgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTA0CisjZGVmaW5lIFNJUl9IQUxfVElNRVJfVFJBRkZJQ19BQ1RJVklUWV9SRVEgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTA1CisjZGVmaW5lIFNJUl9IQUxfVElNRVJfQURDX1JTU0lfU1RBVFMgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTA2CisjZGVmaW5lIFNJUl9IQUxfTUlDX0ZBSUxVUkVfSU5EICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTA3CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisvLzEwNyAuLi4gU2xvdHMgaXMgRnJlZSBmb3IgdXNlLgorI2RlZmluZSBTSVJfSEFMX1VQREFURV9VQVBTRF9JTkQgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDEwOAorI2VuZGlmCisKKyNkZWZpbmUgU0lSX0hBTF9TRVRfTUlNT1BTX1JFUSAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMDkKKyNkZWZpbmUgU0lSX0hBTF9TRVRfTUlNT1BTX1JTUCAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTAKKyNkZWZpbmUgU0lSX0hBTF9TWVNfUkVBRFlfSU5EICAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTEKKyNkZWZpbmUgU0lSX0hBTF9TRVRfVFhfUE9XRVJfUkVRICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTIKKyNkZWZpbmUgU0lSX0hBTF9TRVRfVFhfUE9XRVJfUlNQICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTMKKyNkZWZpbmUgU0lSX0hBTF9HRVRfVFhfUE9XRVJfUkVRICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTQKKyNkZWZpbmUgU0lSX0hBTF9HRVRfVFhfUE9XRVJfUlNQICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTUKKyNkZWZpbmUgU0lSX0hBTF9HRVRfTk9JU0VfUkVRICAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTYKKyNkZWZpbmUgU0lSX0hBTF9HRVRfTk9JU0VfUlNQICAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTcKKworLyogTWVzc2FnZXMgdG8gc3VwcG9ydCB0cmFuc21pdF9oYWx0IGFuZCB0cmFuc21pdF9yZXN1bWUgKi8KKyNkZWZpbmUgU0lSX0hBTF9UUkFOU01JU1NJT05fQ09OVFJPTF9JTkQgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMTgKKy8qIEluZGljYXRpb24gZnJvbSBMSU0gdG8gSEFMIHRvIEluaXRpYWxpemUgcmFkYXIgaW50ZXJydXB0ICovCisjZGVmaW5lIFNJUl9IQUxfSU5JVF9SQURBUl9JTkQgICAgICAgICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTE5CisvKiBNZXNzYWdlcyB0byBzdXBwb3J0IHRyYW5zbWl0X2hhbHQgYW5kIHRyYW5zbWl0X3Jlc3VtZSAqLworCisKKyNkZWZpbmUgU0lSX0hBTF9CRUFDT05fUFJFX0lORCAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjAKKyNkZWZpbmUgU0lSX0hBTF9FTlRFUl9VQVBTRF9SRVEgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjEKKyNkZWZpbmUgU0lSX0hBTF9FTlRFUl9VQVBTRF9SU1AgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjIKKyNkZWZpbmUgU0lSX0hBTF9FWElUX1VBUFNEX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjMKKyNkZWZpbmUgU0lSX0hBTF9FWElUX1VBUFNEX1JTUCAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjQKKyNkZWZpbmUgU0lSX0hBTF9MT1dfUlNTSV9JTkQgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjUKKyNkZWZpbmUgU0lSX0hBTF9CRUFDT05fRklMVEVSX0lORCAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjYKKy8vLyBQRSA8LT4gSEFMIFdPV0wgbWVzc2FnZXMKKyNkZWZpbmUgU0lSX0hBTF9XT1dMX0FERF9CQ0FTVF9QVFJOICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjcKKyNkZWZpbmUgU0lSX0hBTF9XT1dMX0RFTF9CQ0FTVF9QVFJOICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjgKKyNkZWZpbmUgU0lSX0hBTF9XT1dMX0VOVEVSX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMjkKKyNkZWZpbmUgU0lSX0hBTF9XT1dMX0VOVEVSX1JTUCAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzAKKyNkZWZpbmUgU0lSX0hBTF9XT1dMX0VYSVRfUkVRICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzEKKyNkZWZpbmUgU0lSX0hBTF9XT1dMX0VYSVRfUlNQICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzIKKyNkZWZpbmUgU0lSX0hBTF9UWF9DT01QTEVURV9JTkQgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzMKKyNkZWZpbmUgU0lSX0hBTF9USU1FUl9SQV9DT0xMRUNUX0FORF9BREFQVCBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzQKKy8vLyBQRSA8LT4gSEFMIHN0YXRpc3RpY3MgbWVzc2FnZXMKKyNkZWZpbmUgU0lSX0hBTF9HRVRfU1RBVElTVElDU19SRVEgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzUKKyNkZWZpbmUgU0lSX0hBTF9HRVRfU1RBVElTVElDU19SU1AgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzYKKyNkZWZpbmUgU0lSX0hBTF9TRVRfS0VZX0RPTkUgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxMzcKKworLy8vIFBFIDwtPiBIQUwgQlRDIG1lc3NhZ2VzCisjZGVmaW5lIFNJUl9IQUxfQlRDX1NFVF9DRkcgICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTM4CisjZGVmaW5lIFNJUl9IQUxfU0lHTkFMX0JUX0VWRU5UICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTM5CisjZGVmaW5lIFNJUl9IQUxfSEFORExFX0ZXX01CT1hfUlNQICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTQwCisjZGVmaW5lIFNJUl9IQUxfVVBEQVRFX1BST0JFX1JTUF9URU1QTEFURV9JTkQgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE0MQorCisjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TCisvKiBQRSA8LT4gSEFMIGFkZHIyIG1pc21hdGNoIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU0lSX0xJTV9BRERSMl9NSVNTX0lORCAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNDIKKyNlbmRpZgorCisjZGVmaW5lIFNJUl9IQUxfU0VUX01BWF9UWF9QT1dFUl9SRVEgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTQ2CisjZGVmaW5lIFNJUl9IQUxfU0VUX01BWF9UWF9QT1dFUl9SU1AgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTQ3CisKKyNkZWZpbmUgU0lSX0hBTF9TRU5EX01TR19DT01QTEVURSAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNDgKKworLy8vIFBFIDwtPiBIQUwgSG9zdCBPZmZsb2FkIG1lc3NhZ2UKKyNkZWZpbmUgU0lSX0hBTF9TRVRfSE9TVF9PRkZMT0FEICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNDkKKworI2RlZmluZSBTSVJfSEFMX0FERF9TVEFfU0VMRl9SRVEgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1MAorI2RlZmluZSBTSVJfSEFMX0FERF9TVEFfU0VMRl9SU1AgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1MQorI2RlZmluZSBTSVJfSEFMX0RFTF9TVEFfU0VMRl9SRVEgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1MgorI2RlZmluZSBTSVJfSEFMX0RFTF9TVEFfU0VMRl9SU1AgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1MworI2RlZmluZSBTSVJfSEFMX1NJR05BTF9CVEFNUF9FVkVOVCAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1NAorCisjZGVmaW5lIFNJUl9IQUxfQ0ZHX1JYUF9GSUxURVJfUkVRICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTU1CisjZGVmaW5lIFNJUl9IQUxfQ0ZHX1JYUF9GSUxURVJfUlNQICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTU2CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2RlZmluZSBTSVJfSEFMX0FHR1JfQUREX1RTX1JFUSAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1NworI2RlZmluZSBTSVJfSEFMX0FHR1JfQUREX1RTX1JTUCAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1OAorI2RlZmluZSBTSVJfSEFMX0FHR1JfUU9TX1JFUSAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE1OQorI2RlZmluZSBTSVJfSEFMX0FHR1JfUU9TX1JTUCAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE2MAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisvKiBQMlAgPC0+IEhBTCBQMlAgbXNnICovCisjZGVmaW5lIFNJUl9IQUxfU0VUX1AyUF9HT19OT0FfUkVRICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTYxCisjZGVmaW5lIFNJUl9IQUxfUDJQX05PQV9BVFRSX0lORCAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTYyCisjZW5kaWYKKworI2RlZmluZSBTSVJfSEFMX1NFVF9MSU5LX1NUQVRFX1JTUCAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNjUKKworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjZGVmaW5lIFNJUl9IQUxfV0xBTl9TVVNQRU5EX0lORCAgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE2NgorI2RlZmluZSBTSVJfSEFMX1dMQU5fUkVTVU1FX1JFUSAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNjcKKyNlbmRpZgorCisvLy8gUEUgPC0+IEhBTCBLZWVwIEFsaXZlIG1lc3NhZ2UKKyNkZWZpbmUgU0lSX0hBTF9TRVRfS0VFUF9BTElWRSAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNjgKKworI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorI2RlZmluZSBTSVJfSEFMX1NFVF9OU19PRkZMT0FEICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE2OQorI2VuZGlmIC8vV0xBTl9OU19PRkZMT0FECisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKyNkZWZpbmUgU0lSX0hBTF9TRVRfUE5PX1JFUSAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNzAKKyNkZWZpbmUgU0lSX0hBTF9TRVRfUE5PX0NIQU5HRURfSU5EICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNzEKKyNkZWZpbmUgU0lSX0hBTF9VUERBVEVfU0NBTl9QQVJBTVMgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNzIKKyNkZWZpbmUgU0lSX0hBTF9TRVRfUlNTSV9GSUxURVJfUkVRICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNzMgIAorI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCisKKyNkZWZpbmUgU0lSX0hBTF9TRVRfVFhfUEVSX1RSQUNLSU5HX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNzQKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisjZGVmaW5lIFNJUl9IQUxfODAyM19NVUxUSUNBU1RfTElTVF9SRVEgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNzUKKyNkZWZpbmUgU0lSX0hBTF9SRUNFSVZFX0ZJTFRFUl9TRVRfRklMVEVSX1JFUSAgICAgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTc2CisjZGVmaW5lIFNJUl9IQUxfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JFUSAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxNzcKKyNkZWZpbmUgU0lSX0hBTF9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUlNQICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE3OAorI2RlZmluZSBTSVJfSEFMX1JFQ0VJVkVfRklMVEVSX0NMRUFSX0ZJTFRFUl9SRVEgICAgICAgICAgICAgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTc5ICAgICAgICAgICAgICAgICAKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisjZGVmaW5lIFNJUl9IQUxfU0VUX1BPV0VSX1BBUkFNU19SRVEgU0lSX0hBTF9JVENfTVNHX1RZUEVTX0JFR0lOICsgMTgwCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKyNkZWZpbmUgU0lSX0hBTF9HVEtfT0ZGTE9BRF9SRVEgICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxODEKKyNkZWZpbmUgU0lSX0hBTF9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JFUSAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxODIKKyNkZWZpbmUgU0lSX0hBTF9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JTUCAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxODMKKyNlbmRpZiAvL1dMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorI2RlZmluZSBTSVJfSEFMX1RTTV9TVEFUU19SRVEgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE4NAorI2RlZmluZSBTSVJfSEFMX1RTTV9TVEFUU19SU1AgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE4NQorI2VuZGlmCisKKworI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUworI2RlZmluZSBTSVJfSEFMX1dBS0VfUkVBU09OX0lORCAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDE4NgorI2VuZGlmIC8vV0xBTl9XQUtFVVBfRVZFTlRTCisKKyNkZWZpbmUgU0lSX0hBTF9TRVRfVE1fTEVWRUxfUkVRICAgICAgICAgICBTSVJfSEFMX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAxODcKKworI2RlZmluZSBTSVJfSEFMX01TR19UWVBFU19FTkQgICAgICAgICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTiArIDB4RkYKKy8vIENGRyBtZXNzYWdlIHR5cGVzCisjZGVmaW5lIFNJUl9DRkdfTVNHX1RZUEVTX0JFR0lOICAgICAgICAoU0lSX0NGR19NT0RVTEVfSUQgPDwgOCkKKyNkZWZpbmUgU0lSX0NGR19JVENfTVNHX1RZUEVTX0JFR0lOICAgIFNJUl9DRkdfTVNHX1RZUEVTX0JFR0lOKzB4QjAKKyNkZWZpbmUgU0lSX0NGR19QQVJBTV9VUERBVEVfSU5EICAgICAgIFNJUl9DRkdfSVRDX01TR19UWVBFU19CRUdJTgorI2RlZmluZSBTSVJfQ0ZHX0RPV05MT0FEX0NPTVBMRVRFX0lORCAgU0lSX0NGR19JVENfTVNHX1RZUEVTX0JFR0lOICsgMQorI2RlZmluZSBTSVJfQ0ZHX01TR19UWVBFU19FTkQgICAgICAgICAgU0lSX0NGR19NU0dfVFlQRVNfQkVHSU4rMHhGRgorCisvLyBMSU0gbWVzc2FnZSB0eXBlcworI2RlZmluZSBTSVJfTElNX01TR19UWVBFU19CRUdJTiAgICAgICAgKFNJUl9MSU1fTU9EVUxFX0lEIDw8IDgpCisjZGVmaW5lIFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTiAgICBTSVJfTElNX01TR19UWVBFU19CRUdJTisweEIwCisvLyBNZXNzYWdlcyB0by9mcm9tIEhBTAorI2RlZmluZSBTSVJfTElNX1JFU1VNRV9BQ1RJVklUWV9OVEYgICAgICAgIFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTgorI2RlZmluZSBTSVJfTElNX1NVU1BFTkRfQUNUSVZJVFlfUkVRICAgICAgIFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTiArIDEKKyNkZWZpbmUgU0lSX0hBTF9TVVNQRU5EX0FDVElWSVRZX1JTUCAgICAgICBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAyCisvLyBNZXNzYWdlIGZyb20gSVNSIHVwb24gVEZQIHJldHJ5IGludGVycnVwdAorI2RlZmluZSBTSVJfTElNX1JFVFJZX0lOVEVSUlVQVF9NU0cgICAgICAgIFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTiArIDMKKy8vIE1lc3NhZ2UgZnJvbSBCQiBUcmFuc3BvcnQKKyNkZWZpbmUgU0lSX0JCX1hQT1JUX01HTVRfTVNHICAgICAgICAgICAgICBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA0CisvLyBVTlVTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOICsgNgorLy8gTWVzc2FnZSBmcm9tIElTUiB1cG9uIFNQJ3MgSW52YWxpZCBzZXNzaW9uIGtleSBpbnRlcnJ1cHQKKyNkZWZpbmUgU0lSX0xJTV9JTlZfS0VZX0lOVEVSUlVQVF9NU0cgICAgICBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA3CisvLyBNZXNzYWdlIGZyb20gSVNSIHVwb24gU1AncyBJbnZhbGlkIGtleSBJRCBpbnRlcnJ1cHQKKyNkZWZpbmUgU0lSX0xJTV9LRVlfSURfSU5URVJSVVBUX01TRyAgICAgICBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyA4CisvLyBNZXNzYWdlIGZyb20gSVNSIHVwb24gU1AncyBSZXBsYXkgdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0CisjZGVmaW5lIFNJUl9MSU1fUkVQTEFZX1RIUkVTX0lOVEVSUlVQVF9NU0cgU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOICsgOQorLy8gTWVzc2FnZSBmcm9tIEhERCBhZnRlciB0aGUgVEQgZHVtbXkgcGFja2V0IGlzIGNsZWFuZWQgdXAKKyNkZWZpbmUgU0lSX0xJTV9URF9EVU1NWV9DQUxMQkFDS19NU0cgICAgICBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAweEEKKy8vIE1lc3NhZ2UgZnJvbSBTQ0ggd2hlbiB0aGUgU1RBIGlzIHJlYWR5IHRvIGJlIGRlbGV0ZWQKKyNkZWZpbmUgU0lSX0xJTV9TQ0hfQ0xFQU5fTVNHICAgICAgICAgICAgICBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAweEIKKy8vIE1lc3NhZ2UgZnJvbSBJU1IgdXBvbiBSYWRhciBEZXRlY3Rpb24KKyNkZWZpbmUgU0lSX0xJTV9SQURBUl9ERVRFQ1RfSU5EICAgICAgICAgICBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAweEMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gbWVzc2FnZSBpZCBBdmFpbGFibGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKy8vIE1lc3NhZ2UgZnJvbSBIYWwgdG8gc2VuZCBvdXQgYSBERUwtVFMgaW5kaWNhdGlvbgorI2RlZmluZSBTSVJfTElNX0RFTF9UU19JTkQgICAgICAgICAgICAgICAgICBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAweEUKKy8vTWVzc2FnZSBmcm9tIEhBTCB0byBzZW5kIEJBIGdsb2JhbCB0aW1lciB0aW1lb3V0CisjZGVmaW5lIFNJUl9MSU1fQUREX0JBX0lORCAgICAgICAgICAgICAgICAgIFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTiArIDB4RgorLy9JbmRpY2F0aW9uIGZyb20gSEFMIHRvIGRlbGV0ZSBhbGwgdGhlIEJBIHNlc3Npb25zIHdoZW4gdGhlIEJBIGFjdGl2aXR5IGNoZWNrIHRpbWVyIGlzIGRpc2FibGVkCisjZGVmaW5lIFNJUl9MSU1fREVMX0JBX0FMTF9JTkQgICAgICAgICAgICAgICAgICBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4gKyAweDEwCisvL0luZGljYXRpb24gZnJvbSBIQUwgdG8gZGVsZXRlIFN0YXRpb24gY29udGV4dAorI2RlZmluZSBTSVJfTElNX0RFTEVURV9TVEFfQ09OVEVYVF9JTkQgICAgICAgICAgU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOICsgMHgxMQorLy9JbmRpY2F0aW9uIGZyb20gSEFMIHRvIGRlbGV0ZSBCQQorI2RlZmluZSBTSVJfTElNX0RFTF9CQV9JTkQgICAgICAgICAgICAgICAgICAgICAgU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOICsgMHgxMgorI2RlZmluZSBTSVJfTElNX1VQREFURV9CRUFDT04gICAgICAgICAgICAgICAgICAgU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOICsgMHgxMyAKKworCisvLyBMSU0gVGltZW91dCBtZXNzYWdlcworI2RlZmluZSBTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICAgICAgKFNJUl9MSU1fTU9EVUxFX0lEICA8PCA4KSArIDB4RDAKKyNkZWZpbmUgU0lSX0xJTV9NSU5fQ0hBTk5FTF9USU1FT1VUICAgIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQKKyNkZWZpbmUgU0lSX0xJTV9NQVhfQ0hBTk5FTF9USU1FT1VUICAgIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAxCisjZGVmaW5lIFNJUl9MSU1fSk9JTl9GQUlMX1RJTUVPVVQgICAgICBTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMgorI2RlZmluZSBTSVJfTElNX0FVVEhfRkFJTF9USU1FT1VUICAgICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDMKKyNkZWZpbmUgU0lSX0xJTV9BVVRIX1JTUF9USU1FT1VUICAgICAgIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyA0CisjZGVmaW5lIFNJUl9MSU1fQVNTT0NfRkFJTF9USU1FT1VUICAgICBTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgNQorI2RlZmluZSBTSVJfTElNX1JFQVNTT0NfRkFJTF9USU1FT1VUICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDYKKyNkZWZpbmUgU0lSX0xJTV9IRUFSVF9CRUFUX1RJTUVPVVQgICAgIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyA3CisvLyBjdXJyZW50bHkgdW51c2VkICAgICAgICAgICAgICAgICAgICBTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHg4CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisjZGVmaW5lIFNJUl9MSU1fUFJFQVVUSF9DTE5VUF9USU1FT1VUICBTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHg5CisjZW5kaWYKKy8vIExpbmsgTW9uaXRvcmluZyBNZXNzYWdlcworI2RlZmluZSBTSVJfTElNX0NIQU5ORUxfU0NBTl9USU1FT1VUICAgICBTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHhBCisjZGVmaW5lIFNJUl9MSU1fUFJPQkVfSEJfRkFJTFVSRV9USU1FT1VUIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweEIKKyNkZWZpbmUgU0lSX0xJTV9BRERUU19SU1BfVElNRU9VVCAgICAgICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4QworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKSAmJiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyNkZWZpbmUgU0lSX0xJTV9NRUFTVVJFTUVOVF9JTkRfVElNRU9VVCAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MTAKKyNkZWZpbmUgU0lSX0xJTV9MRUFSTl9JTlRFUlZBTF9USU1FT1VUICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MTEKKyNkZWZpbmUgU0lSX0xJTV9MRUFSTl9EVVJBVElPTl9USU1FT1VUICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MTIKKyNlbmRpZgorI2RlZmluZSBTSVJfTElNX0xJTktfVEVTVF9EVVJBVElPTl9USU1FT1VUIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDEzCisjZGVmaW5lIFNJUl9MSU1fSEFTSF9NSVNTX1RIUkVTX1RJTUVPVVQgIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDE2CisjZGVmaW5lIFNJUl9MSU1fQ05GX1dBSVRfVElNRU9VVCAgICAgICAgIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDE3CisjZGVmaW5lIFNJUl9MSU1fS0VFUEFMSVZFX1RJTUVPVVQgICAgICAgIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDE4CisjZGVmaW5lIFNJUl9MSU1fVVBEQVRFX09MQkNfQ0FDSEVMX1RJTUVPVVQgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MTkKKyNkZWZpbmUgU0lSX0xJTV9DSEFOTkVMX1NXSVRDSF9USU1FT1VUICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MUEKKyNkZWZpbmUgU0lSX0xJTV9RVUlFVF9USU1FT1VUICAgICAgICAgICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MUIKKyNkZWZpbmUgU0lSX0xJTV9RVUlFVF9CU1NfVElNRU9VVCAgICAgICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MUMKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNkZWZpbmUgU0lSX0xJTV9XUFNfT1ZFUkxBUF9USU1FT1VUICAgICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MUQKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjZGVmaW5lIFNJUl9MSU1fRlRfUFJFQVVUSF9SU1BfVElNRU9VVCAgIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDFFCisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisjZGVmaW5lIFNJUl9MSU1fUkVNQUlOX0NITl9USU1FT1VUICAgICAgIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDFGCisjZW5kaWYKKworI2lmZGVmIFdNTV9BUFNECisjZGVmaW5lIFNJUl9MSU1fV01NX0FQU0RfU1BfU1RBUlRfTVNHX1RZUEUgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MjEKKyNkZWZpbmUgU0lSX0xJTV9XTU1fQVBTRF9TUF9FTkRfTVNHX1RZUEUgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MjIKKyNlbmRpZgorI2RlZmluZSBTSVJfTElNX0JFQUNPTl9HRU5fSU5EICAgICAgICAgIFNJUl9MSU1fVElNRU9VVF9NU0dfU1RBUlQgKyAweDIzCisjZGVmaW5lIFNJUl9MSU1fUEVSSU9ESUNfUFJPQkVfUkVRX1RJTUVPVVQgICAgU0lSX0xJTV9USU1FT1VUX01TR19TVEFSVCArIDB4MjQKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisjZGVmaW5lIFNJUl9MSU1fQ0NYX1RTTV9USU1FT1VUICAgICAgICBTSVJfTElNX1RJTUVPVVRfTVNHX1NUQVJUICsgMHgyNQorI2VuZGlmCisKKyNkZWZpbmUgU0lSX0xJTV9NU0dfVFlQRVNfRU5EICAgICAgICAgICAgU0lSX0xJTV9NU0dfVFlQRVNfQkVHSU4rMHhGRgorCisvLyBTQ0ggbWVzc2FnZSB0eXBlcworI2RlZmluZSBTSVJfU0NIX01TR19UWVBFU19CRUdJTiAgICAgICAgKFNJUl9TQ0hfTU9EVUxFX0lEIDw8IDgpCisjZGVmaW5lIFNJUl9TQ0hfQ0hBTk5FTF9TV0lUQ0hfUkVRVUVTVCBTSVJfU0NIX01TR19UWVBFU19CRUdJTgorI2RlZmluZSBTSVJfU0NIX1NUQVJUX1NDQU5fUkVRICAgICAgICAgU0lSX1NDSF9NU0dfVFlQRVNfQkVHSU4gKyAxCisjZGVmaW5lIFNJUl9TQ0hfU1RBUlRfU0NBTl9SU1AgICAgICAgICBTSVJfU0NIX01TR19UWVBFU19CRUdJTiArIDIKKyNkZWZpbmUgU0lSX1NDSF9FTkRfU0NBTl9OVEYgICAgICAgICAgIFNJUl9TQ0hfTVNHX1RZUEVTX0JFR0lOICsgMworI2RlZmluZSBTSVJfU0NIX01TR19UWVBFU19FTkQgICAgICAgICAgU0lSX1NDSF9NU0dfVFlQRVNfQkVHSU4rMHhGRgorCisvLyBQTU0gbWVzc2FnZSB0eXBlcworI2RlZmluZSBTSVJfUE1NX01TR19UWVBFU19CRUdJTiAgICAgICAgKFNJUl9QTU1fTU9EVUxFX0lEIDw8IDgpCisjZGVmaW5lIFNJUl9QTU1fQ0hBTkdFX1BNX01PREUgICAgICAgICBTSVJfUE1NX01TR19UWVBFU19CRUdJTgorI2RlZmluZSBTSVJfUE1NX0NIQU5HRV9JTVBTX01PREUgICAgICAgKFNJUl9QTU1fTVNHX1RZUEVTX0JFR0lOICsgMSkgICAgICAgIC8vZm9yIElkbGUgbW9kZSBwb3dlciBzYXZlCisjZGVmaW5lIFNJUl9QTU1fTVNHX1RZUEVTX0VORCAgICAgICAgICAoU0lSX1BNTV9NU0dfVFlQRVNfQkVHSU4rMHhGRikKKworLy8gTU5UIG1lc3NhZ2UgdHlwZXMKKyNkZWZpbmUgU0lSX01OVF9NU0dfVFlQRVNfQkVHSU4gICAgICAgIChTSVJfTU5UX01PRFVMRV9JRCA8PCA4KQorI2RlZmluZSBTSVJfTU5UX1JFTEVBU0VfQkQgICAgICAgICAgICAgU0lSX01OVF9NU0dfVFlQRVNfQkVHSU4gKyAwCisjZGVmaW5lIFNJUl9NTlRfTVNHX1RZUEVTX0VORCAgICAgICAgICBTSVJfTU5UX01TR19UWVBFU19CRUdJTiArIDB4RkYKKworLy8gRFZUIG1lc3NhZ2UgdHlwZXMKKyNkZWZpbmUgU0lSX0RWVF9NU0dfVFlQRVNfQkVHSU4gICAgICAgIChTSVJfRFZUX01PRFVMRV9JRCA8PCA4KQorI2RlZmluZSBTSVJfRFZUX0lUQ19NU0dfVFlQRVNfQkVHSU4gICAgU0lSX0RWVF9NU0dfVFlQRVNfQkVHSU4rMHgwRgorI2RlZmluZSBTSVJfRFZUX01TR19UWVBFU19FTkQgICAgICAgICAgU0lSX0RWVF9JVENfTVNHX1RZUEVTX0JFR0lOKzB4RkZGCisKKworLy9QVFQgbWVzc2FnZSB0eXBlcworI2RlZmluZSBTSVJfUFRUX01TR19UWVBFU19CRUdJTiAgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBTSVJfUFRUX01TR19UWVBFU19FTkQgICAgICAgICAgICAgIDB4MzMwMAorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICBFVkVOVCBUWVBFIERlZmludGlvbnMgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLy8gTU1IIEV2ZW50cyB0aGF0IGFyZSB1c2VkIGluIG90aGVyIG1vZHVsZXMgdG8gcG9zdCBldmVudHMgdG8gTU1ICisjIGRlZmluZSBTSVJfSEFMX01NSF9UWE1CX1JFQURZX0VWVCAgICAgMHgwMDAwMDAwMgorIyBkZWZpbmUgU0lSX0hBTF9NTUhfUlhNQl9ET05FX0VWVCAgICAgIDB4MDAwMDAwMDQKKyMgZGVmaW5lIFNJUl9IQUxfTU1IX01TR1FfTkVfRVZUICAgICAgICAweDAwMDAwMDA4CisKKyMgZGVmaW5lIFNJUl9IU1RFTVVMX1RYTUJfRE9ORV9FVlQgICAgICAgICAweDAwMDAwMTAwCisjIGRlZmluZSBTSVJfSFNURU1VTF9SWE1CX1JFQURZX0VWVCAgICAgICAgMHgwMDAwMDIwMAorIyBkZWZpbmUgU0lSX0hTVEVNVUxfTVNHUV9ORV9FVlQgICAgICAgICAgIDB4MDAwMDA0MDAKKworIyBkZWZpbmUgU0lSX1RTVF9YTUlUX01TR19RU19FTVBUWV9FVlQgICAgIDB4MDAwMDAwODAKKworLy9hZGRlZCBmb3IgT0JTUworCisvL1BhcmFtIENoYW5nZSBCaXRtYXAgc2VudCB0byBIQUwKKyNkZWZpbmUgUEFSQU1fQkNOX0lOVEVSVkFMX0NIQU5HRUQgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUEFSQU1fU0hPUlRfUFJFQU1CTEVfQ0hBTkdFRCAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgUEFSQU1fU0hPUlRfU0xPVF9USU1FX0NIQU5HRUQgICAgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFBBUkFNX2xsQUNPRVhJU1RfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBQQVJBTV9sbEJDT0VYSVNUX0NIQU5HRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgUEFSQU1fbGxHQ09FWElTVF9DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIFBBUkFNX0hUMjBNSFpDT0VYSVNUX0NIQU5HRUQgICAgICAgICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgUEFSQU1fTk9OX0dGX0RFVklDRVNfUFJFU0VOVF9DSEFOR0VEICgxPDw3KQorI2RlZmluZSBQQVJBTV9SSUZTX01PREVfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgUEFSQU1fTFNJR19UWE9QX0ZVTExfU1VQUE9SVF9DSEFOR0VEICAgKDE8PDkpCisjZGVmaW5lIFBBUkFNX09CU1NfTU9ERV9DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwxMCkKKyNkZWZpbmUgUEFSQU1fQkVBQ09OX1VQREFURV9NQVNLICAgICAgICAgICAgICAgIChQQVJBTV9CQ05fSU5URVJWQUxfQ0hBTkdFRHxQQVJBTV9TSE9SVF9QUkVBTUJMRV9DSEFOR0VEfFBBUkFNX1NIT1JUX1NMT1RfVElNRV9DSEFOR0VEfFBBUkFNX2xsQUNPRVhJU1RfQ0hBTkdFRCB8UEFSQU1fbGxCQ09FWElTVF9DSEFOR0VEfFwKKyAgICBQQVJBTV9sbEdDT0VYSVNUX0NIQU5HRUR8UEFSQU1fSFQyME1IWkNPRVhJU1RfQ0hBTkdFRHxQQVJBTV9OT05fR0ZfREVWSUNFU19QUkVTRU5UX0NIQU5HRUR8UEFSQU1fUklGU19NT0RFX0NIQU5HRUR8UEFSQU1fTFNJR19UWE9QX0ZVTExfU1VQUE9SVF9DSEFOR0VEfCBQQVJBTV9PQlNTX01PREVfQ0hBTkdFRCkKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2luY2x1ZGUvc2lyV3JhcHBlci5oIGIvQ09SRS9NQUMvc3JjL2luY2x1ZGUvc2lyV3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MTAxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvaW5jbHVkZS9zaXJXcmFwcGVyLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHNpcldyYXBwZXIuaCBjb250YWlucyB0aGUgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsCisgKiBGaXJtd2FyZSBtb2R1bGVzLgorICoKKyAqIEF1dGhvcjogICAgICBTdXNhbiBUc2FvCisgKiBEYXRlOiAgICAgICAgMDkvMjQvMjAwNworICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX19TSVJfV1JBUFBFUl9IXworI2RlZmluZSBfX1NJUl9XUkFQUEVSX0hfCisKKyNpZiBkZWZpbmVkIFZPU1NfRU5BQkxFRAorI2luY2x1ZGUgIlZvc3NXcmFwcGVyLmgiCisjZWxpZiBkZWZpbmVkIEFOSV9PU19UWVBFX09TWAorI2luY2x1ZGUgIk9TWFdyYXBwZXIuaCIKKyNlbHNlICAgLy8gQU5JX09TX1RZUEUgdW5kZWZpbmVkCisjZXJyb3IgVW5rbm93biBvciBtaXNzaW5nIEFOSV9PU19UWVBFIG1hY3JvCisjZW5kaWYgIC8vIEFOSV9PU19UWVBFCisKKworCisKKyNlbmRpZiAvL19fU0lSX1dSQVBQRVJfSF8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2luY2x1ZGUvc2lyV3JhcHBlci5ofiBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL3NpcldyYXBwZXIuaH4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwM2QzZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL3NpcldyYXBwZXIuaH4KQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBRdWFsY29tbSBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHNpcldyYXBwZXIuaCBjb250YWlucyB0aGUgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsCisgKiBGaXJtd2FyZSBtb2R1bGVzLgorICoKKyAqIEF1dGhvcjogICAgICBTdXNhbiBUc2FvCisgKiBEYXRlOiAgICAgICAgMDkvMjQvMjAwNworICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX19TSVJfV1JBUFBFUl9IXworI2RlZmluZSBfX1NJUl9XUkFQUEVSX0hfCisKKyNpZiBkZWZpbmVkIFZPU1NfRU5BQkxFRAorI2luY2x1ZGUgIlZvc3NXcmFwcGVyLmgiCisjZWxpZiBkZWZpbmVkIEFOSV9PU19UWVBFX09TWAorI2luY2x1ZGUgIk9TWFdyYXBwZXIuaCIKKyNlbHNlICAgLy8gQU5JX09TX1RZUEUgdW5kZWZpbmVkCisjZXJyb3IgVW5rbm93biBvciBtaXNzaW5nIEFOSV9PU19UWVBFIG1hY3JvCisjZW5kaWYgIC8vIEFOSV9PU19UWVBFCisKKworCisKKyNlbmRpZiAvL19fU0lSX1dSQVBQRVJfSF8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2luY2x1ZGUvc3lzR2xvYmFsLmggYi9DT1JFL01BQy9zcmMvaW5jbHVkZS9zeXNHbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGZmYWE2Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL2luY2x1ZGUvc3lzR2xvYmFsLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19TWVNfR0xPQkFMX0hfXworI2RlZmluZSBfX1NZU19HTE9CQUxfSF9fCisKK3R5cGVkZWYgc3RydWN0IHNBbmlTaXJTeXMKK3sKKyAgICB0QU5JX1UzMiBhYm9ydDsgLyogc3lzdGVtIGlzIGFib3J0aW5nIGFuZCB3aWxsIGJlIHVubG9hZGVkLCBvbmx5IE1NSCB0aHJlYWQgaXMgcnVubmluZyAqLworCisgICAgLy8gUmFkaW8gSUQKKyAgICB0QU5JX1UzMiBnU2lyUmFkaW9JZDsKKworICAgIHRBTklfVTMyIGdTeXNGcmFtZUNvdW50WzRdWzE2XTsKKyAgICB0QU5JX1UzMiBnU3lzQmJ0UmVjZWl2ZWQ7CisgICAgdEFOSV9VMzIgZ1N5c0JidFBvc3RlZFRvTGltOworICAgIHRBTklfVTMyIGdTeXNCYnRQb3N0ZWRUb1NjaDsKKyAgICB0QU5JX1UzMiBnU3lzQmJ0UG9zdGVkVG9QbW07CisgICAgdEFOSV9VMzIgZ1N5c0JidFBvc3RlZFRvSGFsOworICAgIHRBTklfVTMyIGdTeXNCYnREcm9wcGVkOworICAgIHRBTklfVTMyIGdTeXNCYnROb25MZWFybkZyYW1lSW52OworICAgIHRBTklfVTMyIGdTeXNCYnRMZWFybkZyYW1lSW52OworICAgIHRBTklfVTMyIGdTeXNCYnRDcmNGYWlsOworICAgIHRBTklfVTMyIGdTeXNCYnREdXBsaWNhdGVzOworICAgIHRBTklfVTMyIGdTeXNSZWxlYXNlQ291bnQ7CisgICAgdEFOSV9VMzIgcHJvYmVFcnJvciwgcHJvYmVCYWRTc2lkLCBwcm9iZUlnbm9yZSwgcHJvYmVSZXNwb25kOworCisgICAgdEFOSV9VMzIgZ1N5c0ZyYW1lc1NlbnRbNF1bMTZdOworCisgICAgdEFOSV9VMzIgZ1N5c0VuYWJsZUxlYXJuTW9kZTsKKyAgICB0QU5JX1UzMiBnU3lzRW5hYmxlU2Nhbk1vZGU7CisgICAgdEFOSV9VMzIgZ1N5c0VuYWJsZUxpbmtNb25pdG9yTW9kZTsKKworICAgIHRBTklfVTMyIGdTeXNSZXNldENvdW50czsKKworICAgIFRYX1RIUkVBRCBnU2lyU2NoVGhyZWFkOworICAgIFRYX1RIUkVBRCBnU2lyUG1tVGhyZWFkOworICAgIFRYX1RIUkVBRCBnU2lyTGltVGhyZWFkOworICAgIFRYX1RIUkVBRCBnU2lySGFsVGhyZWFkOworICAgIFRYX1RIUkVBRCBnU2lyTW50VGhyZWFkOworICAgIFRYX1RIUkVBRCBnU2lyTW1oVGhyZWFkOworCisgICAgVFhfUVVFVUUgZ1NpckhhbE1zZ1E7ICAgICAgICAgICAgLy8gTWVzc2FnZSBRdWV1ZSB2YXJpYWJsZXMKKyAgICBUWF9RVUVVRSBnU2lyTW50TXNnUTsKKyAgICBUWF9RVUVVRSBnU2lyTGltTXNnUTsKKyAgICBUWF9RVUVVRSBnU2lyTGltRGVmZXJyZWRNc2dROworICAgIFRYX1FVRVVFIGdTaXJTY2hNc2dROworICAgIFRYX1FVRVVFIGdTaXJQbW1Nc2dROworCisgICAgVFhfVEhSRUFEIGdTaXJOaW1QdHRUaHJlYWQ7CisgICAgVFhfUVVFVUUgZ1Npck5pbVJETXNnUTsKKworICAgIFRYX1FVRVVFIGdTaXJIYWxFdnRROworICAgIFRYX1FVRVVFIGdTaXJUeE1zZ1E7CisgICAgVFhfUVVFVUUgZ1NpclJ4TXNnUTsKKworICAgIC8vIFRoZSBzeXN0ZW0gaXMgYmFzZWQgb24gdGhlIEhBTCBzdGF0ZXMuIFRoZSBmb2xsb3dpbmcgc3RhdGljIGRlZmluaXRpb24KKyAgICAvLyBvZiB0aGUgSEFMIHN0YXRlLgorICAgIHRBTklfVTE2IGdTaXJUaHJlYWRDb3VudDsKKworICAgIHRBTklfVTggZGVidWdPblJlc2V0OworCisgICAgdEFOSV9CT09MRUFOIGZUZXN0UmFkYXI7CisgICAgdEFOSV9VOCAgIGRldFJhZGFyQ2hJZHNbMjBdOworICAgIHRBTklfVTMyICByYWRhckRldGVjdENvdW50OworICAgIHRBTklfVTggICByYWRhckRldGVjdGVkOworICAgIHRBTklfVTggICBnU3lzZHJvcExpbVBrdHM7Cit9IHRBbmlTaXJTeXMsICp0cEFuaVNpclN5czsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvaW5jbHVkZS91dGlsc0FwaS5oIGIvQ09SRS9NQUMvc3JjL2luY2x1ZGUvdXRpbHNBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGI3MWRkCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL2luY2x1ZGUvdXRpbHNBcGkuaApAQCAtMCwwICsxLDg1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBdXRob3I6ICAgICAgICAgICAgICBLZXZpbiBOZ3V5ZW4KKyAqIERhdGU6ICAgICAgICAgICAgICAgIDAyLzI3LzAyCisgKiBIaXN0b3J5Oi0KKyAqIDAyLzEyLzAyICAgICAgICAgICAgIENyZWF0ZWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaWZuZGVmIF9fVVRJTFNBUElfSAorI2RlZmluZSBfX1VUSUxTQVBJX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHNpckNvbW1vbi5oPgorI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgInV0aWxzR2xvYmFsLmgiCisjaWYgZGVmaW5lZCBWT1NTX0VOQUJMRUQKKyNpbmNsdWRlICJWb3NzV3JhcHBlci5oIgorI2VsaWYgZGVmaW5lZCBBTklfT1NfVFlQRV9MSU5VWAorI2luY2x1ZGUgInJ0YWlXcmFwcGVyLmgiCisjZWxpZiBkZWZpbmVkIEFOSV9PU19UWVBFX09TWAorI2luY2x1ZGUgInBhbEFwaVBjaS5oIgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgQU5JX09TX1RZUEVfTElOVVgKKworZXh0ZXJuIHZvaWQgcnRfc2NoZWRfbG9jaygpOworZXh0ZXJuIHZvaWQgcnRfc2NoZWRfdW5sb2NrKCk7CisKKyNkZWZpbmUgU0lSX0RFQ0xBUkVfRkxBR1MgICB0QU5JX1UzMiBmbGFncworI2RlZmluZSBTSVJfU0NIRURfTE9DSygpICAgIHJ0X3NjaGVkX2xvY2soKQorI2RlZmluZSBTSVJfU0NIRURfVU5MT0NLKCkgIHJ0X3NjaGVkX3VubG9jaygpCisKKyNlbHNlCisKKyNkZWZpbmUgU0lSX0RFQ0xBUkVfRkxBR1MKKyNkZWZpbmUgU0lSX1NDSEVEX0xPQ0soKSAgICBUWF9ESVNBQkxFX0lOVFI7CisjZGVmaW5lIFNJUl9TQ0hFRF9VTkxPQ0soKSAgVFhfRU5BQkxFX0lOVFI7CisKKyNlbmRpZgorCisjZGVmaW5lIExPR19JTkRFWF9GT1JfTU9EVUxFKCBtb2RJZCApICggKCBtb2RJZCApIC0gTE9HX0ZJUlNUX01PRFVMRV9JRCApCisjZGVmaW5lIEdFVF9NSU5fVkFMVUUoX192YWwxLCBfX3ZhbDIpICgoX192YWwxIDwgX192YWwyKSA/IF9fdmFsMSA6IF9fdmFsMikKKworLy8gVGhlIGNhbGxlciBtdXN0IGNoZWNrIGxvZ2xldmVsLiBUaGlzIEFQSSBhc3N1bWVzIGxvZ2xldmVsIGlzIGdvb2QKK2V4dGVybiB2b2lkIGxvZ0RlYnVnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggbW9kSWQsIHRBTklfVTMyIGRlYnVnTGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHIsIHZhX2xpc3QgbWFya2VyKTsKKworZXh0ZXJuIHZvaWQgbG9nRGJnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggbW9kSWQsIHRBTklfVTMyIGRlYnVnTGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHIsLi4uKTsKKworZXh0ZXJuIHRBTklfVTMyIGdQa3RBbGxvY0NudCwgZ1BrdEZyZWVDbnQ7CisKKy8vLyBEZWJ1ZyBkdW1wcworZXh0ZXJuIHZvaWQgbG9nUHJpbnRmKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiwgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCk7CisKKy8vLyBSVEFJIGR1bXAKK2V4dGVybiBpbnQgbG9nUnRhaUR1bXAodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyLCB0QU5JX1UzMiwgdEFOSV9VMzIsIHRBTklfVTMyLCB0QU5JX1UzMiwgdEFOSV9VOCAqKTsKKworLy8vIExvZyBpbml0aWFsaXphdGlvbgorZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbG9nSW5pdCAodHBBbmlTaXJHbG9iYWwpOworCitleHRlcm4gdm9pZAorbG9nRGVpbml0KHRwQW5pU2lyR2xvYmFsICk7CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGNmZ0luaXQodHBBbmlTaXJHbG9iYWwpOworZXh0ZXJuIHZvaWQgY2ZnRGVJbml0KHRwQW5pU2lyR2xvYmFsKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzaXJEdW1wQnVmKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGR1bXAgYSBidWZmZXIgd2l0aCBhIGNlcnRhaW4gbGV2ZWwKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcEJ1ZjogYnVmZmVyIHBvaW50ZXIKKyAqIEByZXR1cm4gTm9uZS4KKyAqLworCit2b2lkIHNpckR1bXBCdWYodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBtb2RJZCwgdEFOSV9VMzIgbGV2ZWwsIHRBTklfVTggKmJ1ZiwgdEFOSV9VMzIgc2l6ZSk7CisKKyNpZiBkZWZpbmVkIEFOSV9PU19UWVBFX0xJTlVYCisKKworICAgIHN0cnVjdCBydExpYkFwcDsKKyAgICB2b2lkKiBydGFpQnVmQWxsb2Moc3RydWN0IHJ0TGliQXBwICogcnQsIHRBTklfVTE2IHNpemUsIHRBTklfVTMyIHdhaXRPcHQpOworICAgIHRTaXJSZXRTdGF0dXMgcnRhaUJ1ZkluaXQodW5zaWduZWQgaW50IHJhZGlvSWQsICB0X21hY19ibG9ja190YWJsZSogYmxvY2tfdGFibGUpOworICAgIHRBTklfVTE2IHJ0YWlCdWZBdmFpbCh0QU5JX1UxNiBzaXplKTsKKworZXh0ZXJuIHZvaWQgc3lzU3VzcGVuZFRocmVhZHModHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKyNkZWZpbmUgc2hhcmVkQnVmQWxsb2MocE1hYywgeCwgeSkgcnRhaUJ1ZkFsbG9jKHBNYWMtPnJ0LHgseSkKKyNkZWZpbmUgYnVmSW5pdCh4KSBydGFpQnVmSW5pdCh4KQorI2RlZmluZSBidWZBdmFpbCh4KSBydGFpQnVmQXZhaWwoeCkKKworI2RlZmluZSBCVUZfMzIgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBCVUZfNjQgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBCVUZfOTYgICAgICAgICAgICAgICAgICA5NgorI2RlZmluZSBCVUZfMTI4ICAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgQlVGXzE2MCAgICAgICAgICAgICAgICAgMTYwCisjZGVmaW5lIEJVRl8yNTYgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBCVUZfNTEyICAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgQlVGXzEwMjQgICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBCVUZfMTUzNiAgICAgICAgICAgICAgICAxNTM2CisjZGVmaW5lIEJVRl8yMDQ4ICAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgQlVGXzgxOTIgICAgICAgICAgICAgICAgODE5MgorI2RlZmluZSBSVEFJX01BWF9CVUZfU0laRSAgICAgICBCVUZfODE5MgorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2lyU3dhcFUxNigpCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzd2FwIHR3byBVOHMgb2YgYW4gdEFOSV9VMTYgdmFsdWUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHZhbCAgICB0QU5JX1UxNiB2YWx1ZSB0byBiZSB0QU5JX1U4IHN3YXBwZWQKKyAqIEByZXR1cm4gICAgICAgIFN3YXBwZWQgdEFOSV9VMTYgdmFsdWUKKyAqLworCitzdGF0aWMgaW5saW5lIHRBTklfVTE2CitzaXJTd2FwVTE2KHRBTklfVTE2IHZhbCkKK3sKKyAgICByZXR1cm4oKCh2YWwgJiAweDAwRkYpIDw8IDgpIHwgKCh2YWwgJiAweEZGMDApID4+IDgpKTsKK30vKioqIGVuZCBzaXJTd2FwVTE2KCkgKioqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzaXJTd2FwVTE2aWZOZWVkZWQoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3dhcCB0d28gVThzIG9mIGFuIHRBTklfVTE2IHZhbHVlIGRlcGVuZGluZworICogb24gZW5kaWFubmVzIG9mIHRoZSB0YXJnZXQgcHJvY2Vzc29yL2NvbXBpbGVyIHRoZSBzb2Z0d2FyZSBpcworICogcnVubmluZyBvbgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgdmFsICAgIHRBTklfVTE2IHZhbHVlIHRvIGJlIHRBTklfVTggc3dhcHBlZAorICogQHJldHVybiAgICAgICAgU3dhcHBlZCB0QU5JX1UxNiB2YWx1ZQorICovCisKK3N0YXRpYyBpbmxpbmUgdEFOSV9VMTYKK3NpclN3YXBVMTZpZk5lZWRlZCh0QU5JX1UxNiB2YWwpCit7CisjaWZuZGVmIEFOSV9MSVRUTEVfQllURV9FTkRJQU4KKyAgICByZXR1cm4gc2lyU3dhcFUxNih2YWwpOworI2Vsc2UKKyAgICByZXR1cm4gdmFsOworI2VuZGlmCit9LyoqKiBlbmQgc2lyU3dhcFUxNmlmTmVlZGVkKCkgKioqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzaXJTd2FwVTMyKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN3YXAgZm91ciBVOHMgb2YgYW4gdEFOSV9VMzIgdmFsdWUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHZhbCAgICB0QU5JX1UzMiB2YWx1ZSB0byBiZSB0QU5JX1U4IHN3YXBwZWQKKyAqIEByZXR1cm4gICAgICAgIFN3YXBwZWQgdEFOSV9VMzIgdmFsdWUKKyAqLworCitzdGF0aWMgaW5saW5lIHRBTklfVTMyCitzaXJTd2FwVTMyKHRBTklfVTMyIHZhbCkKK3sKKyAgICByZXR1cm4oKHZhbCA8PCAyNCkgfAorICAgICAgICAgICAodmFsID4+IDI0KSB8CisgICAgICAgICAgICgodmFsICYgMHgwMDAwRkYwMCkgPDwgOCkgfAorICAgICAgICAgICAoKHZhbCAmIDB4MDBGRjAwMDApID4+IDgpKTsKK30vKioqIGVuZCBzaXJTd2FwVTMyKCkgKioqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzaXJTd2FwVTMyaWZOZWVkZWQoKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3dhcCBVOHMgb2YgYW4gdEFOSV9VMzIgdmFsdWUgZGVwZW5kaW5nCisgKiBvbiBlbmRpYW5uZXMgb2YgdGhlIHRhcmdldCBwcm9jZXNzb3IvY29tcGlsZXIgdGhlIHNvZnR3YXJlIGlzCisgKiBydW5uaW5nIG9uCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICB2YWwgICAgdEFOSV9VMzIgdmFsdWUgdG8gYmUgdEFOSV9VOCBzd2FwcGVkCisgKiBAcmV0dXJuICAgICAgICBTd2FwcGVkIHRBTklfVTMyIHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB0QU5JX1UzMgorc2lyU3dhcFUzMmlmTmVlZGVkKHRBTklfVTMyIHZhbCkKK3sKKyNpZm5kZWYgQU5JX0xJVFRMRV9CWVRFX0VORElBTgorICAgIHJldHVybiBzaXJTd2FwVTMyKHZhbCk7CisjZWxzZQorICAgIHJldHVybiB2YWw7CisjZW5kaWYKK30vKioqIGVuZCBzaXJTd2FwVTMyaWZOZWVkZWQoKSAqKiovCisKKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2lyU3dhcFUzMkJ1ZgorICoKKyAqIEZVTkNUSU9OOgorICogSXQgc3dhcHMgTiBkd29yZHMgaW50byB0aGUgc2FtZSBidWZmZXIKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHB0ciBhZGRyZXNzIG9mIHRBTklfVTMyIGFycmF5CisgKiBAcmV0dXJuIHZvaWQKKyAqCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzaXJTd2FwVTMyQnVmKHRBTklfVTMyICpwdHIsIHRBTklfVTMyIG5Xb3JkcykKK3sKKyAgICB0QU5JX1UzMiAgICAgaTsKKworICAgIGZvciAoaT0wOyBpIDwgbldvcmRzOyBpKyspCisgICAgICAgIHB0cltpXSA9IHNpclN3YXBVMzIocHRyW2ldKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2lyU3dhcFUzMkJ1ZklmTmVlZGVkKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN3YXAgVThzIG9mIFUzMnMgaW4gdGhlIGJ1ZmZlciBkZXBlbmRpbmcKKyAqIG9uIGVuZGlhbm5lcyBvZiB0aGUgdGFyZ2V0IHByb2Nlc3Nvci9jb21waWxlciB0aGUgc29mdHdhcmUgaXMKKyAqIHJ1bm5pbmcgb24KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHBCdWYgICBCdWZmZXIgdGhhdCB3aWxsIGdldCBzd2FwcGVkCisgKiBAcGFyYW0gIG5Xb3JkcyBOdW1iZXIgRFdPUkRTIHdpbGwgYmUgc3dhcHBlZAorICogQHJldHVybiAgICAgICAgdm9pZAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2lyU3dhcFUzMkJ1ZklmTmVlZGVkKHRBTklfVTMyKiBwQnVmLCB0QU5JX1UzMiBuV29yZHMpCit7CisjaWZkZWYgQU5JX0xJVFRMRV9CWVRFX0VORElBTgorICAgIHNpclN3YXBVMzJCdWYocEJ1ZiwgbldvcmRzKTsKKyNlbmRpZgorfS8qKiogZW5kIHNpclN3YXBVMzJpZk5lZWRlZCgpICoqKi8KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzaXJTd2FwQkRJZk5lZWRlZAorICoKKyAqIEZVTkNUSU9OOgorICogQnl0ZSBzd2FwIGFsbCB0aGUgZHdvcmRzIGluIHRoZSBCRCwgZXhjZXB0IHRoZSBQSFkvTUFDIGhlYWRlcnMKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHBCZCAgICBCRCB0aGF0IHdpbGwgZ2V0IHN3YXBwZWQKKyAqIEByZXR1cm4gICAgICAgIHZvaWQKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK3NpclN3YXBCRElmTmVlZGVkKHRBTklfVTMyICpwQmQpCit7CisgICAgc2lyU3dhcFUzMkJ1ZklmTmVlZGVkKHBCZCwgNik7CisgICAgc2lyU3dhcFUzMkJ1ZklmTmVlZGVkKHBCZCsxOCwgMTQpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2lyU3RvcmVVMTZOCisgKgorICogRlVOQ1RJT046CisgKiBJdCBzdG9yZXMgYSAxNiBiaXQgbnVtYmVyIGludG8gdGhlIGJ5dGUgYXJyYXkgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKiBpLmUuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICBwdHIgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBieXRlIGFycmF5CisgKiBAcGFyYW0gIHZhbCB2YWx1ZSB0byBzdG9yZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzaXJTdG9yZVUxNk4odEFOSV9VOCAqcHRyLCB0QU5JX1UxNiB2YWwpCit7CisgICAgKnB0cisrID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisgICAgKnB0ciA9IHZhbCAmIDB4ZmY7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2lyU3RvcmVVMzJOCisgKgorICogRlVOQ1RJT046CisgKiBJdCBzdG9yZXMgYSAzMiBiaXQgbnVtYmVyIGludG8gdGhlIGJ5dGUgYXJyYXkgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKiBpLmUuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICBwdHIgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBieXRlIGFycmF5CisgKiBAcGFyYW0gIHZhbCB2YWx1ZSB0byBzdG9yZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzaXJTdG9yZVUzMk4odEFOSV9VOCAqcHRyLCB0QU5JX1UzMiB2YWwpCit7CisgICAgKnB0cisrID0gKHRBTklfVTgpICh2YWwgPj4gMjQpICYgMHhmZjsKKyAgICAqcHRyKysgPSAodEFOSV9VOCkgKHZhbCA+PiAxNikgJiAweGZmOworICAgICpwdHIrKyA9ICh0QU5JX1U4KSAodmFsID4+IDgpICYgMHhmZjsKKyAgICAqcHRyID0gKHRBTklfVTgpICh2YWwpICYgMHhmZjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzaXJTdG9yZVUxNgorICoKKyAqIEZVTkNUSU9OOgorICogSXQgc3RvcmVzIGEgMTYgYml0IG51bWJlciBpbnRvIHRoZSBieXRlIGFycmF5IGluIE5PTi1uZXR3b3JrIGJ5dGUgb3JkZXIKKyAqIGkuZS4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIHB0ciBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkKKyAqIEBwYXJhbSAgdmFsIHZhbHVlIHRvIHN0b3JlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK3NpclN0b3JlVTE2KHRBTklfVTggKnB0ciwgdEFOSV9VMTYgdmFsKQoreworICAgICpwdHIrKyA9IHZhbCAmIDB4ZmY7CisgICAgKnB0ciA9ICh2YWwgPj4gOCkgJiAweGZmOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHNpclN0b3JlVTMyCisgKgorICogRlVOQ1RJT046CisgKiBJdCBzdG9yZXMgYSAzMiBiaXQgbnVtYmVyIGludG8gdGhlIGJ5dGUgYXJyYXkgaW4gTk9OLW5ldHdvcmsgYnl0ZSBvcmRlcgorICogaS5lLiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgcHRyIGFkZHJlc3Mgb2YgZGVzdGluYXRpb24gYnl0ZSBhcnJheQorICogQHBhcmFtICB2YWwgdmFsdWUgdG8gc3RvcmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2lyU3RvcmVVMzIodEFOSV9VOCAqcHRyLCB0QU5JX1UzMiB2YWwpCit7CisgICAgKnB0cisrID0gKHRBTklfVTgpIHZhbCAmIDB4ZmY7CisgICAgKnB0cisrID0gKHRBTklfVTgpICh2YWwgPj4gOCkgJiAweGZmOworICAgICpwdHIrKyA9ICh0QU5JX1U4KSAodmFsID4+IDE2KSAmIDB4ZmY7CisgICAgKnB0ciA9ICh0QU5JX1U4KSAodmFsID4+IDI0KSAmIDB4ZmY7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2lyU3RvcmVVMzJCdWZOCisgKgorICogRlVOQ1RJT046CisgKiBJdCBzdG9yZXMgYSAzMiBiaXQgbnVtYmVyIGludG8gdGhlIGJ5dGUgYXJyYXkgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKiBpLmUuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0LiBJdCBwZXJmb3JtcyB0aGUgYWJvdmUgb3BlcmF0aW9uCisgKiBvbiBlbnRpcmUgYnVmZmVyIGFuZCB3cml0ZXMgdG8gdGhlIGRzdCBidWZmZXIKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIEFzc3VtZXMgdGhhdCB0aGUgcFNyYyBidWZmZXIgaXMgb2YgYWxsIHRBTklfVTMyIGRhdGEgdHlwZSBmaWVsZHMuCisgKgorICogTk9URToKKyAqIE11c3QgYmUgdXNlZCBpZiBhbGwgdGhlIGZpZWxkcyBpbiB0aGUgYnVmZmVyIG11c3QgYmUgb2YgdEFOSV9VMzIgdHlwZXMuCisgKgorICogQHBhcmFtICBwRHN0ICAgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBieXRlIGFycmF5CisgKiBAcGFyYW0gIHBTcmMgICBhZGRyZXNzIG9mIHRoZSBzb3VyY2UgRFdPUkQgYXJyYXkKKyAqIEBwYXJhbSAgbGVuZ3RoIG51bWJlciBvZiBEV09SRHMKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2lyU3RvcmVCdWZOKHRBTklfVTgqIHBEc3QsIHRBTklfVTMyKiBwU3JjLCB0QU5JX1UzMiBsZW5ndGgpCit7CisgICAgd2hpbGUgKGxlbmd0aCkKKyAgICB7CisgICAgICAgIHNpclN0b3JlVTMyTihwRHN0LCAqcFNyYyk7CisgICAgICAgIHBEc3QgKz0gNDsKKyAgICAgICAgcFNyYysrOworICAgICAgICBsZW5ndGgtLTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2lyUmVhZFUxNk4KKyAqCisgKiBGVU5DVElPTjoKKyAqIEl0IHJlYWRzIGEgMTYgYml0IG51bWJlciBmcm9tIHRoZSBieXRlIGFycmF5IGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICogaS5lLiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgcHRyIGFkZHJlc3Mgb2YgIGJ5dGUgYXJyYXkKKyAqIEByZXR1cm4gMTYgYml0IHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB0QU5JX1UxNgorc2lyUmVhZFUxNk4odEFOSV9VOCAqcHRyKQoreworICAgIHJldHVybigoKCpwdHIpIDw8IDgpIHwKKyAgICAgICAgICAgKCoocHRyKzEpKSk7Cit9CisvKioKKyAqIHNpclN3YXBVMzJCdWYKKyAqCisgKiBGVU5DVElPTjoKKyAqIEl0IHN3YXBzIE4gZHdvcmRzIGludG8gdGhlIHNhbWUgYnVmZmVyCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICBwdHIgYWRkcmVzcyBvZiB0QU5JX1UzMiBhcnJheQorICogQHJldHVybiB2b2lkCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2lyU3dhcE5TdG9yZSh0QU5JX1UzMiAqc3JjLCB0QU5JX1UzMiAqZHN0LCB0QU5JX1UzMiBuV29yZHMpCit7CisgICAgdEFOSV9VMzIgICAgIGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IG5Xb3JkczsgaSsrKQorICAgICAgICBkc3RbaV0gPSBzaXJTd2FwVTMyKHNyY1tpXSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2lyUmVhZFUzMk4KKyAqCisgKiBGVU5DVElPTjoKKyAqIEl0IHJlYWRzIGEgMzIgYml0IG51bWJlciBmcm9tIHRoZSBieXRlIGFycmF5IGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICogaS5lLiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgcHRyIGFkZHJlc3Mgb2YgIGJ5dGUgYXJyYXkKKyAqIEByZXR1cm4gMzIgYml0IHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB0QU5JX1UzMgorc2lyUmVhZFUzMk4odEFOSV9VOCAqcHRyKQoreworICAgIHJldHVybigoKihwdHIpIDw8IDI0KSB8CisgICAgICAgICAgICgqKHB0cisxKSA8PCAxNikgfAorICAgICAgICAgICAoKihwdHIrMikgPDwgOCkgfAorICAgICAgICAgICAoKihwdHIrMykpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzaXJSZWFkVTE2CisgKgorICogRlVOQ1RJT046CisgKiBJdCByZWFkcyBhIDE2IGJpdCBudW1iZXIgZnJvbSB0aGUgYnl0ZSBhcnJheSBpbiBOT04tbmV0d29yayBieXRlIG9yZGVyCisgKiBpLmUuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICBwdHIgYWRkcmVzcyBvZiAgYnl0ZSBhcnJheQorICogQHJldHVybiAxNiBiaXQgdmFsdWUKKyAqLworCitzdGF0aWMgaW5saW5lIHRBTklfVTE2CitzaXJSZWFkVTE2KHRBTklfVTggKnB0cikKK3sKKyAgICByZXR1cm4oKCpwdHIpIHwKKyAgICAgICAgICAgKCoocHRyKzEpIDw8IDgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzaXJSZWFkVTMyCisgKgorICogRlVOQ1RJT046CisgKiBJdCByZWFkcyBhIDMyIGJpdCBudW1iZXIgZnJvbSB0aGUgYnl0ZSBhcnJheSBpbiBOT04tbmV0d29yayBieXRlIG9yZGVyCisgKiBpLmUuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICBwdHIgYWRkcmVzcyBvZiAgYnl0ZSBhcnJheQorICogQHJldHVybiAzMiBiaXQgdmFsdWUKKyAqLworCitzdGF0aWMgaW5saW5lIHRBTklfVTMyCitzaXJSZWFkVTMyKHRBTklfVTggKnB0cikKK3sKKyAgICByZXR1cm4oKCoocHRyKSkgfAorICAgICAgICAgICAoKihwdHIrMSkgPDwgOCkgfAorICAgICAgICAgICAoKihwdHIrMikgPDwgMTYpIHwKKyAgICAgICAgICAgKCoocHRyKzMpIDw8IDI0KSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLy8gQ29weSBhIE1BQyBhZGRyZXNzIGZyb20gJ2Zyb20nIHRvICd0bycKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2lyQ29weU1hY0FkZHIodEFOSV9VOCB0b1tdLCB0QU5JX1U4IGZyb21bXSkKK3sKKyNpZiBkZWZpbmVkKCBfWDg2XyApCisgICAgdEFOSV9VMzIgYWxpZ24gPSAoMHgzICYgKCh0QU5JX1UzMikgdG8gfCAodEFOSV9VMzIpIGZyb20gKSk7CisgICAgaWYoIGFsaWduID09MCl7CisgICAgICAgKigodEFOSV9VMTYgKikgJih0b1s0XSkpID0gKigodEFOSV9VMTYgKikgJihmcm9tWzRdKSk7CisgICAgICAgKigodEFOSV9VMzIgKikgdG8pID0gKigodEFOSV9VMzIgKikgZnJvbSk7CisgICAgfWVsc2UgaWYgKGFsaWduID09IDIpeworICAgICAgICAqKCh0QU5JX1UxNiAqKSAmdG9bNF0pID0gKigodEFOSV9VMTYgKikgJmZyb21bNF0pOworICAgICAgICAqKCh0QU5JX1UxNiAqKSAmdG9bMl0pID0gKigodEFOSV9VMTYgKikgJmZyb21bMl0pOworICAgICAgICAqKCh0QU5JX1UxNiAqKSAmdG9bMF0pID0gKigodEFOSV9VMTYgKikgJmZyb21bMF0pOworICAgIH1lbHNleworICAgICAgIHRvWzVdID0gZnJvbVs1XTsKKyAgICAgICB0b1s0XSA9IGZyb21bNF07CisgICAgICAgdG9bM10gPSBmcm9tWzNdOworICAgICAgIHRvWzJdID0gZnJvbVsyXTsKKyAgICAgICB0b1sxXSA9IGZyb21bMV07CisgICAgICAgdG9bMF0gPSBmcm9tWzBdOworICAgIH0KKyNlbHNlCisgICAgICAgdG9bMF0gPSBmcm9tWzBdOworICAgICAgIHRvWzFdID0gZnJvbVsxXTsKKyAgICAgICB0b1syXSA9IGZyb21bMl07CisgICAgICAgdG9bM10gPSBmcm9tWzNdOworICAgICAgIHRvWzRdID0gZnJvbVs0XTsKKyAgICAgICB0b1s1XSA9IGZyb21bNV07CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB0QU5JX1U4CitzaXJDb21wYXJlTWFjQWRkcih0QU5JX1U4IGFkZHIxW10sIHRBTklfVTggYWRkcjJbXSkKK3sKKyNpZiBkZWZpbmVkKCBfWDg2XyApCisgICAgdEFOSV9VMzIgYWxpZ24gPSAoMHgzICYgKCh0QU5JX1UzMikgYWRkcjEgfCAodEFOSV9VMzIpIGFkZHIyICkpOworCisgICAgaWYoIGFsaWduID09MCl7CisgICAgICAgIHJldHVybiAoKCooKHRBTklfVTE2ICopICYoYWRkcjFbNF0pKSA9PSAqKCh0QU5JX1UxNiAqKSAmKGFkZHIyWzRdKSkpJiYKKyAgICAgICAgICAgICAgICAoKigodEFOSV9VMzIgKikgYWRkcjEpID09ICooKHRBTklfVTMyICopIGFkZHIyKSkpOworICAgIH1lbHNlIGlmKGFsaWduID09IDIpeworICAgICAgICByZXR1cm4gKCgqKCh0QU5JX1UxNiAqKSAmYWRkcjFbNF0pID09ICooKHRBTklfVTE2ICopICZhZGRyMls0XSkpICYmCisgICAgICAgICAgICAoKigodEFOSV9VMTYgKikgJmFkZHIxWzJdKSA9PSAqKCh0QU5JX1UxNiAqKSAmYWRkcjJbMl0pKSAmJgorICAgICAgICAgICAgKCooKHRBTklfVTE2ICopICZhZGRyMVswXSkgPT0gKigodEFOSV9VMTYgKikgJmFkZHIyWzBdKSkpOworICAgIH1lbHNleworICAgICAgICByZXR1cm4gKCAoYWRkcjFbNV09PWFkZHIyWzVdKSYmCisgICAgICAgICAgICAoYWRkcjFbNF09PWFkZHIyWzRdKSYmCisgICAgICAgICAgICAoYWRkcjFbM109PWFkZHIyWzNdKSYmCisgICAgICAgICAgICAoYWRkcjFbMl09PWFkZHIyWzJdKSYmCisgICAgICAgICAgICAoYWRkcjFbMV09PWFkZHIyWzFdKSYmCisgICAgICAgICAgICAoYWRkcjFbMF09PWFkZHIyWzBdKSk7CisgICAgfQorI2Vsc2UKKyAgICAgICAgIHJldHVybiAoIChhZGRyMVswXT09YWRkcjJbMF0pJiYKKyAgICAgICAgICAgIChhZGRyMVsxXT09YWRkcjJbMV0pJiYKKyAgICAgICAgICAgIChhZGRyMVsyXT09YWRkcjJbMl0pJiYKKyAgICAgICAgICAgIChhZGRyMVszXT09YWRkcjJbM10pJiYKKyAgICAgICAgICAgIChhZGRyMVs0XT09YWRkcjJbNF0pJiYKKyAgICAgICAgICAgIChhZGRyMVs1XT09YWRkcjJbNV0pKTsKKyNlbmRpZgorfQorCisKKy8qCisqIGNvbnZlcnRzIHRBTklfVTE2IENXIHZhbHVlIHRvIDQgYml0IHZhbHVlIHRvIGJlIGluc2VydGVkIGluIElFCisqLworc3RhdGljIGlubGluZSB0QU5JX1U4IGNvbnZlcnRDVyh0QU5JX1UxNiBjdykKK3sKKyAgICB0QU5JX1U4IHZhbCA9IDA7CisgICAgd2hpbGUgKGN3ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsKys7CisgICAgICAgICAgICBjdyA+Pj0gMTsKKyAgICAgICAgfQorICAgIGlmICh2YWwgPiAxNSkKKyAgICAgICAgcmV0dXJuIDB4RjsKKyAgICByZXR1cm4gdmFsOworfQorCisvKiBUaGUgdXNlciBwcmlvcml0eSB0byBBQyBtYXBwaW5nIGlzIHN1Y2g6CisgKiAgIFVQKDEsIDIpIC0tLT4gQUNfQksoMSkKKyAqICAgVVAoMCwgMykgLS0tPiBBQ19CRSgwKQorICogICBVUCg0LCA1KSAtLS0+IEFDX1ZJKDIpCisgKiAgIFVQKDYsIDcpIC0tLT4gQUNfVk8oMykKKyAqLworI2RlZmluZSBXTEFOX1VQX1RPX0FDX01BUCAgICAgICAgICAgIDB4MzMyMjAxMTAKKyNkZWZpbmUgdXBUb0FjKHVwKSAgICAgICAgICAgICAgICAoKFdMQU5fVVBfVE9fQUNfTUFQID4+ICgodXApIDw8IDIpKSAmIDB4MDMpCisKKyNpZiBkZWZpbmVkIFZPU1NfRU5BQkxFRAorCisjZGVmaW5lIHNpckJ1c3lXYWl0KG1pY3Jvc2Vjb25kKSAgIHZvc19idXN5X3dhaXQobWljcm9zZWNvbmQgLyAxMDAwKQorI2RlZmluZSBzaXJTbGVlcFdhaXQoZHVyYXRpb24pICB2b3Nfc2xlZXBfdXMoZHVyYXRpb24pCisKKyNlbGlmIGRlZmluZWQgQU5JX09TX1RZUEVfTElOVVgKKyAgICAvL3J0X2J1c3lfc2xlZXAoZHVyYXRpb24pCisKKyNkZWZpbmUgc2lyQnVzeVdhaXQoZHVyYXRpb24pICAgdHhfYnVzeV93YWl0KGR1cmF0aW9uKQorCisjZGVmaW5lIHNpclNsZWVwV2FpdChkdXJhdGlvbikgIHNpclNsZWVwV2FpdEludGVybihkdXJhdGlvbikKKworI2VsaWYgZGVmaW5lZCBBTklfT1NfVFlQRV9XSU5ET1dTCisKKyNkZWZpbmUgc2lyQnVzeVdhaXQoZHVyYXRpb24pICAgc2lyQnVzeVdhaXRJbnRlcm4ocE1hYywgZHVyYXRpb24pCisKKyNkZWZpbmUgc2lyU2xlZXBXYWl0KGR1cmF0aW9uKSAgc2lyU2xlZXBXYWl0SW50ZXJuKHBNYWMsIGR1cmF0aW9uKQorCisjZWxpZiBkZWZpbmVkIEFOSV9PU19UWVBFX09TWAorI2RlZmluZSBzaXJCdXN5V2FpdChkdXJhdGlvbikgcGFsQnVzeVdhaXQoZHVyYXRpb24pCisjZGVmaW5lIHNpclNsZWVwV2FpdChkdXJhdGlvbikgcGFsU2xlZXBXYWl0KGR1cmF0aW9uKQorI2VuZGlmCisKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNpclNsZWVwV2FpdAorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8geWllbGQgdGhlIENQVSBmb3IgYSBnaXZlbiBkdXJhdGlvbgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgZHVyYXRpb24gICAgRHVyYXRpb24gdG8geWllbGQgKG5hbm9zZWNvbmRzKQorICogQHJldHVybiBOb25lCisgKi8KKworI2lmIGRlZmluZWQgQU5JX09TX1RZUEVfV0lORE9XUworCitzdGF0aWMgaW5saW5lIHZvaWQKK3NpclNsZWVwV2FpdEludGVybih2b2lkICpwTWFjLCB0QU5JX1UzMiBkdXJhdGlvbikKKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkCitzaXJTbGVlcFdhaXRJbnRlcm4odEFOSV9VMzIgZHVyYXRpb24pCisKKyNlbmRpZgoreworI2lmIGRlZmluZWQgQU5JX09TX1RZUEVfTElOVVgKKyAgICAvL3RlbXBvcmFyeSBtZWFzdXJlOiBub3Qgc3VyZSB3ZSBjYW4gc2xlZXAgbGVzcyB0aGFuIDUwMHVzZWMgb24gcnRhaQorICAgIC8vc28gc2xlZXAgYXQgdGhpcyBhbW91bnQgb2YgdGltZSBzbyBhcyB3ZSBhcmUgZ2FyYW50ZWVkIHRvIHlpZWxkCisgICAgaWYgKGR1cmF0aW9uPDUwMDAwMCkKKyAgICAgICAgZHVyYXRpb249NTAwMDAwOworICAgIHR4X3RocmVhZF9zbGVlcChkdXJhdGlvbik7CisgICAgLy8gICAgcnRfc2xlZXAoZHVyYXRpb24vNDAvKnRlbXBvcmFyeSBtYWdpYyBudW1iZXI6IGNsb2NrIGlzIDI1TUh6Ki8pOworI2VsaWYgZGVmaW5lZCBBTklfT1NfVFlQRV9XSU5ET1dTCisgICAgLy8gQ2FuJ3Qgc2xlZXAgb24gd2luZG93cyBhdCBkaXNwYXRjaCBsZXZlbAorICAgIC8vIHdoYXQgdG8gZG8gaGVyZT8KKyAgICBpZiAoZHVyYXRpb24gPj0gNTAwMDApCisgICAgeworICAgICAgICB0QU5JX1UzMiAgICAgaTsKKworICAgICAgICBmb3IgKGkgPSBkdXJhdGlvbiAvIDUwMDAwOyBpOyBpLS0pCisgICAgICAgICAgICBzaXJCdXN5V2FpdCg1MDAwMCk7CisgICAgfQorI2VuZGlmCit9IC8vIHNpclNsZWVwV2FpdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLyBQYXJzZSB0aGUgbmV4dCBJRSBpbiBhIG1lc3NhZ2UKK2V4dGVybiB0U2lyUmV0U3RhdHVzIHNpclBhcnNlTmV4dElFKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4ICpwUGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiBwYXlsb2FkTGVuZ3RoLCB0QU5JX1MxNiBsYXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwVHlwZSwgdEFOSV9VOCAqcExlbmd0aCk7CisKKy8vLyBDaGVjayBpZiB0aGUgZ2l2ZW4gY2hhbm5lbCBpcyAxMWIgY2hhbm5lbAorI2RlZmluZSBTSVJfSVNfQ0hBTk5FTF8xMUIoY2hJZCkgIChjaElkIDw9IDE0KQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIGhhbFJvdW5kUzMyCisgKgorICogRlVOQ1RJT046CisgKiBQZXJmb3JtcyBpbnRlZ2VyIHJvdW5kaW5nIGxpa2UgcmV0dXJucyAxMjM0NiBmb3IgMTIzNDU2IG9yIC0xMjM0NiBmb3IgLTEyMzQ1NgorICogTm90ZSB0aGF0IGEgZGVjaW1hbCBwbGFjZSBpcyBsb3N0LgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgdEFOSV9TMzIgaW5wdXQKKyAqIEByZXR1cm4gcm91bmRlZCBudW1iZXIKKyAqLworc3RhdGljIGlubGluZSB0QU5JX1MzMgoraGFsUm91bmRTMzIodEFOSV9TMzIgcCkKK3sKKyAgICB0QU5JX1MzMiAgaywgaSwgajsKKworICAgIGkgPSBwLzEwOworICAgIGogPSBwJTEwOworICAgIGlmIChwID4gMCkKKyAgICAgICAgayA9IGkgKyAoaiA+IDQgPyAxIDogMCk7CisgICAgZWxzZSBpZiAocCA8IDApCisgICAgICAgIGsgPSBpICsgKGogPCAtNSA/IC0xIDogMCk7CisgICAgZWxzZQorICAgICAgICBrID0gcDsKKworICAgICAgICByZXR1cm4oayk7Cit9CisKKy8vIE5ldyBmdW5jdGlvbnMgZm9yIGVuZGlhbmVzcyBjb252ZXJzaW9uCisjaWZkZWYgQU5JX0xJVFRMRV9CWVRFX0VORElBTgorI2RlZmluZSBhbmlfY3B1X3RvX2JlMTYoeCkgc2lyU3dhcFUxNigoeCkpCisjZGVmaW5lIGFuaV9jcHVfdG9fbGUxNih4KSAoeCkKKyNkZWZpbmUgYW5pX2NwdV90b19iZTMyKHgpIHNpclN3YXBVMzIoKHgpKQorI2RlZmluZSBhbmlfY3B1X3RvX2xlMzIoeCkgKHgpCisjZWxzZSAvLyBBTklfTElUVExFX0JZVEVfRU5ESUFOCisjZGVmaW5lIGFuaV9jcHVfdG9fYmUxNih4KSAoeCkKKyNkZWZpbmUgYW5pX2NwdV90b19sZTE2KHgpIHNpclN3YXBVMTYoKHgpKQorI2RlZmluZSBhbmlfY3B1X3RvX2JlMzIoeCkgKHgpCisjZGVmaW5lIGFuaV9jcHVfdG9fbGUzMih4KSBzaXJTd2FwVTMyKCh4KSkKKyNlbmRpZiAvLyBBTklfTElUVExFX0JZVEVfRU5ESUFOCisKKyNkZWZpbmUgYW5pX2xlMTZfdG9fY3B1KHgpICBhbmlfY3B1X3RvX2xlMTYoeCkKKyNkZWZpbmUgYW5pX2xlMzJfdG9fY3B1KHgpICBhbmlfY3B1X3RvX2xlMzIoeCkKKyNkZWZpbmUgYW5pX2JlMTZfdG9fY3B1KHgpICBhbmlfY3B1X3RvX2JlMTYoeCkKKyNkZWZpbmUgYW5pX2JlMzJfdG9fY3B1KHgpICBhbmlfY3B1X3RvX2JlMzIoeCkKKwordm9pZCBDb252ZXJ0dG9CaWdFbmRpYW4odm9pZCAqcHRyLCB0QU5JX1UxNiBzaXplKTsKK3ZvaWQgQ3JlYXRlU2NhbkN0c0ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNNZ210SGRyICptYWNNZ210SGRyLCB0U2lyTWFjQWRkciBzZWxmTWFjKTsKK3ZvaWQgQ3JlYXRlU2NhbkRhdGFOdWxsRnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY01nbXRIZHIgKm1hY01nbXRIZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggcHdyTWdtdCwgdFNpck1hY0FkZHIgYnNzaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciBzZWxmTWFjQWRkcik7Cit2b2lkIENyZWF0ZUluaXRTY2FuUmF3RnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY01nbXRIZHIgKm1hY01nbXRIZHIsIHRCc3NTeXN0ZW1Sb2xlIHJvbGUpOwordm9pZCBDcmVhdGVGaW5pc2hTY2FuUmF3RnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY01nbXRIZHIgKm1hY01nbXRIZHIsIHRCc3NTeXN0ZW1Sb2xlIHJvbGUpOworCisjZW5kaWYgLyogX19VVElMU0FQSV9IICovCisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL2luY2x1ZGUvdXRpbHNHbG9iYWwuaCBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL3V0aWxzR2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwNjA4MgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9pbmNsdWRlL3V0aWxzR2xvYmFsLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKi8KKworI2lmbmRlZiBfX1VUSUxTX0dMT0JBTF9IX18KKyNkZWZpbmUgX19VVElMU19HTE9CQUxfSF9fCisKKyNpbmNsdWRlICJzaXJQYXJhbXMuaCIKKworLyoKKyAqIEN1cnJlbnQgZGVidWcgYW5kIGV2ZW50IGxvZyBsZXZlbAorICovCisjZGVmaW5lIExPR19GSVJTVF9NT0RVTEVfSUQgICAgU0lSX0ZJUlNUX01PRFVMRV9JRAorI2RlZmluZSBMT0dfTEFTVF9NT0RVTEVfSUQgICAgIFNJUl9MQVNUX01PRFVMRV9JRAorI2RlZmluZSBMT0dfRU5UUllfTlVNICAgICAgICAgIChMT0dfTEFTVF9NT0RVTEVfSUQgLSBMT0dfRklSU1RfTU9EVUxFX0lEICsgMSkKKwordHlwZWRlZiBzdHJ1Y3Qgc0FuaVNpclV0aWxzCit7CisgICAgdEFOSV9VMzIgIGdMb2dFdnRMZXZlbFtMT0dfRU5UUllfTlVNXTsKKyAgICB0QU5JX1UzMiAgZ0xvZ0RiZ0xldmVsW0xPR19FTlRSWV9OVU1dOworCit9IHRBbmlTaXJVdGlscywgKnRwQW5pU2lyVXRpbHM7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvbGltQWRtaXRDb250cm9sLmggYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9saW1BZG1pdENvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThhOTRhCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvbGltQWRtaXRDb250cm9sLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogICAgICBEaW5lc2ggVXBhZGh5YXkKKyAqIERhdGU6ICAgICAgICAxMC8yNC8wNgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaWZuZGVmIF9fTElNX0FETUlUX0NPTlRST0xfSF9fCisjZGVmaW5lIF9fTElNX0FETUlUX0NPTlRST0xfSF9fCisKKyNpbmNsdWRlICJzaXJDb21tb24uaCIKKyNpbmNsdWRlICJzaXJNYWNQcm90RGVmLmgiCisKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKwordFNpclJldFN0YXR1cworbGltVHNwZWNGaW5kQnlBc3NvY0lkKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdFNpck1hY1RzcGVjSUUqLCB0cExpbVRzcGVjSW5mbywgdHBMaW1Uc3BlY0luZm8gKik7CisKKy8vIEFkZCBUU1BFQyBpbiBsaW0gbG9jYWwgdGFibGUKK3RTaXJSZXRTdGF0dXMgbGltVHNwZWNBZGQoCisgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYywKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgKnBBZGRyLAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgYXNzb2NJZCwKKyAgICB0U2lyTWFjVHNwZWNJRSAgICpwVHNwZWMsCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBpbnRlcnZhbCwKKyAgICB0cExpbVRzcGVjSW5mbyAgICpwcEluZm8pOworICAgIAorCisvLyBhZG1pdCBjb250cm9sIGludGVyZmFjZQorZXh0ZXJuIHRTaXJSZXRTdGF0dXMKK2xpbUFkbWl0Q29udHJvbEFkZFRTKAorICAgIHRwQW5pU2lyR2xvYmFsICAgICAgICAgIHBNYWMsCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICpwQWRkciwKKyAgICB0U2lyQWRkdHNSZXFJbmZvICAgICAgICphZGR0cywKKyAgICB0U2lyTWFjUW9zQ2FwYWJpbGl0eVN0YUlFICpxb3MsCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgICBhc3NvY0lkLAorICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgIGFsbG9jLAorICAgIHRTaXJNYWNTY2hlZHVsZUlFICAgICAgKnBTY2gsCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAqcFRzcGVjSWR4ICwvL2luZGV4IHRvIHRoZSBsaW0gdHNwZWMgdGFibGUuCisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeQorICAgICk7CisKK3N0YXRpYyBpbmxpbmUgdFNpclJldFN0YXR1cworbGltQWRtaXRDb250cm9sQWRkU3RhKAorICAgIHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgIHRBTklfVTggICAgICAgICAgICAgKnN0YUFkZHIsCisgICAgdEFOSV9VOCAgICAgICAgICAgIGFsbG9jKQoreyByZXR1cm4gZVNJUl9TVUNDRVNTO30KKworZXh0ZXJuIHRTaXJSZXRTdGF0dXMKK2xpbUFkbWl0Q29udHJvbERlbGV0ZVN0YSgKKyAgICB0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBhc3NvY0lkKTsKKworZXh0ZXJuIHRTaXJSZXRTdGF0dXMKK2xpbUFkbWl0Q29udHJvbERlbGV0ZVRTKAorICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMsCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICBhc3NvY0lkLAorICAgIHRTaXJNYWNUU0luZm8gICAgKnRzaW5mbywKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgKnRzU3RhdHVzLAorICAgIHRBTklfVTggICp0c3BlY0lkeCk7CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzCitsaW1VcGRhdGVBZG1pdFBvbGljeSgKKyAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjKTsKKwordFNpclJldFN0YXR1cyBsaW1BZG1pdENvbnRyb2xJbml0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCit0U2lyUmV0U3RhdHVzIGxpbVNlbmRIYWxNc2dBZGRUcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBzdGFJZHgsIHRBTklfVTggdHNwZWNJZHgsIHRTaXJNYWNUc3BlY0lFIHRzcGVjSUUsIHRBTklfVTggc2Vzc2lvbklkKTsKK3RTaXJSZXRTdGF0dXMgbGltU2VuZEhhbE1zZ0RlbFRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsICB0QU5JX1UxNiBzdGFJZHgsICB0QU5JX1U4IHRzcGVjSWR4LCAgdFNpckRlbHRzUmVxSW5mbyBkZWx0cyk7Cit2b2lkIGxpbVByb2Nlc3NIYWxBZGRUc1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9saW1BcGkuaCBiL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL2xpbUFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjJhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9saW1BcGkuaApAQCAtMCwwICsxLDMyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1BcGkuaCBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZXhwb3J0ZWQgYnkKKyAqIExJTSBtb2R1bGUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaWZuZGVmIF9fTElNX0FQSV9ICisjZGVmaW5lIF9fTElNX0FQSV9ICisKKyNpbmNsdWRlICJ3bmlBcGkuaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJzaXJNYWNQcm90RGVmLmgiCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisjaW5jbHVkZSAic2lyTWFjUHJvcEV4dHMuaCIKKyNlbmRpZgorI2luY2x1ZGUgInNpckNvbW1vbi5oIgorI2luY2x1ZGUgInNpckRlYnVnLmgiCisjaW5jbHVkZSAic2NoR2xvYmFsLmgiCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJsaW1HbG9iYWwuaCIKKyNpbmNsdWRlICJoYWxNc2dBcGkuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfZHMuaCIKKyNlbmRpZgorI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIgorCisjZGVmaW5lIExJTV9QT0xfU1lTX1NDQU5fTU9ERSAgICAgIDAKKyNkZWZpbmUgTElNX1BPTF9TWVNfTEVBUk5fTU9ERSAgICAgMQorCisKKy8qIE1hY3JvIHRvIGNvdW50IGhlYXJ0YmVhdCAqLworCisjZGVmaW5lIGxpbVJlc2V0SEJQa3RDb3VudChwc2Vzc2lvbkVudHJ5KSAgIChwc2Vzc2lvbkVudHJ5LT5MaW1SeGVkQmVhY29uQ250RHVyaW5nSEIgPSAwKQorCisKKworLyogVXNlZnVsIG1hY3JvcyBmb3IgZmV0Y2hpbmcgdmFyaW91cyBzdGF0ZXMgaW4gcE1hYy0+bGltICovCisvKiBnTGltU3lzdGVtUm9sZSAqLworI2RlZmluZSBHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisjZGVmaW5lIExJTV9JU19BUF9ST0xFKHBzZXNzaW9uRW50cnkpICAgICAgICAgICAoR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSA9PSBlTElNX0FQX1JPTEUpCisjZGVmaW5lIExJTV9JU19TVEFfUk9MRShwc2Vzc2lvbkVudHJ5KSAgICAgICAgICAoR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSA9PSBlTElNX1NUQV9ST0xFKQorI2RlZmluZSBMSU1fSVNfSUJTU19ST0xFKHBzZXNzaW9uRW50cnkpICAgICAgICAgKEdFVF9MSU1fU1lTVEVNX1JPTEUocHNlc3Npb25FbnRyeSkgPT0gZUxJTV9TVEFfSU5fSUJTU19ST0xFKQorLyogZ0xpbVNtZVN0YXRlICovCisjZGVmaW5lIEdFVF9MSU1fU01FX1NUQVRFKHBNYWMpICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkKKyNkZWZpbmUgU0VUX0xJTV9TTUVfU1RBVEUocE1hYywgc3RhdGUpICAgICAgICAgIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID0gc3RhdGUpCisvKiBnTGltTWxtU3RhdGUgKi8KKyNkZWZpbmUgR0VUX0xJTV9NTE1fU1RBVEUocE1hYykgICAgICAgICAgICAgICAgIChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKQorI2RlZmluZSBTRVRfTElNX01MTV9TVEFURShwTWFjLCBzdGF0ZSkgICAgICAgICAgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPSBzdGF0ZSkKKy8qdHBkcGhIYXNoTm9kZSBtbG1TdGFDb250ZXh0Ki8KKyNkZWZpbmUgR0VUX0xJTV9TVEFfQ09OVEVYVF9NTE1fU1RBVEUocFN0YURzKSAgIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpCisjZGVmaW5lIFNFVF9MSU1fU1RBX0NPTlRFWFRfTUxNX1NUQVRFKHBTdGFEcywgc3RhdGUpICAocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0gc3RhdGUpCisvKiBnTGltUXVpZXRTdGF0ZSAqLworI2RlZmluZSBHRVRfTElNX1FVSUVUX1NUQVRFKHBNYWMpICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSkKKyNkZWZpbmUgU0VUX0xJTV9RVUlFVF9TVEFURShwTWFjLCBzdGF0ZSkgICAgICAgIChwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPSBzdGF0ZSkKKworI2RlZmluZSBMSU1fSVNfQ09OTkVDVElPTl9BQ1RJVkUocHNlc3Npb25FbnRyeSkgIChwc2Vzc2lvbkVudHJ5LT5MaW1SeGVkQmVhY29uQ250RHVyaW5nSEIpCisKKy8qcE1hYy0+bGltLmdMaW1Qcm9jZXNzRGVmZE1zZ3MqLworI2RlZmluZSBHRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjKSAocE1hYy0+bGltLmdMaW1Qcm9jZXNzRGVmZE1zZ3MpCisjZGVmaW5lIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHZhbCkgKHBNYWMtPmxpbS5nTGltUHJvY2Vzc0RlZmRNc2dzID0gdmFsKQorLy8gTElNIGV4cG9ydGVkIGZ1bmN0aW9uIHRlbXBsYXRlcworLy9pbmxpbmUgdEFOSV9VMTYKKy8vbGltR2V0TnVtQW5pUGVlcnNJbkJzcyh0cEFuaVNpckdsb2JhbCBwTWFjKQorLy97IHJldHVybiBwTWFjLT5saW0uZ0xpbU51bU9mQW5pU1RBczsgfQorI2RlZmluZSBMSU1fSVNfUkFEQVJfREVURUNURUQocE1hYykgICAgICAgICAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5mUmFkYXJEZXRDdXJPcGVyQ2hhbikKKyNkZWZpbmUgTElNX1NFVF9SQURBUl9ERVRFQ1RFRChwTWFjLCB2YWwpICAgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZlJhZGFyRGV0Q3VyT3BlckNoYW4gPSB2YWwpCisjZGVmaW5lIExJTV9NSU5fQkNOX1BSX0xFTkdUSCAgMTIKKyNkZWZpbmUgTElNX0JDTl9QUl9DQVBBQklMSVRZX09GRlNFVCAxMAorCit0eXBlZGVmIGVudW0gZU1nbXRGcm1Ecm9wUmVhc29uCit7CisgICAgZU1HTVRfRFJPUF9OT19EUk9QLAorICAgIGVNR01UX0RST1BfTk9UX0xBU1RfSUJTU19CQ04sCisgICAgZU1HTVRfRFJPUF9JTkZSQV9CQ05fSU5fSUJTUywKKyAgICBlTUdNVF9EUk9QX1NDQU5fTU9ERV9GUkFNRSwKKyAgICBlTUdNVF9EUk9QX05PTl9TQ0FOX01PREVfRlJBTUUsCisgICAgZU1HTVRfRFJPUF9JTlZBTElEX1NJWkUsCit9dE1nbXRGcm1Ecm9wUmVhc29uOworCisKKworCisvLy8gRHVyaW5nIFREIHJpbmcgY2xlYW4gdXAgYXQgSEREIGluIFJUQUksIHdpbGwgY2FsbCB0aGlzIGNhbGwgYmFjaworZXh0ZXJuIHZvaWQgbGltUG9zdFRkRHVtbXlQa3RDYWxsYmFrKHZvaWQqIHBNYWNHbG9iYWxzLCB1bnNpZ25lZCBpbnQqIHBCZCk7CisKKy8qKgorICogRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBMSU0gc3RhdGUgbWFjaGluZXMuCisgKiBUaGlzIGNhbGxlZCB1cG9uIExJTSB0aHJlYWQgY3JlYXRpb24uCisgKi8KK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbUluaXRpYWxpemUodHBBbmlTaXJHbG9iYWwpOwordFNpclJldFN0YXR1cyBwZU9wZW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdE1hY09wZW5QYXJhbWV0ZXJzICpwTWFjT3BlblBhcmFtKTsKK3RTaXJSZXRTdGF0dXMgcGVDbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKK3RTaXJSZXRTdGF0dXMgbGltU3RhcnQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisjZW5kaWYKKy8qKgorICogRnVuY3Rpb24gdG8gSW5pdGlhbGl6ZSByYWRhciBpbnRlcnJ1cHRzLgorICovCit2b2lkIGxpbVJhZGFySW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKwordFNpclJldFN0YXR1cyBwZVN0YXJ0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBwZVN0b3AodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit0U2lyUmV0U3RhdHVzIHBlUG9zdE1zZ0FwaSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSogcE1zZyk7Cit0U2lyUmV0U3RhdHVzIHBlUHJvY2Vzc01zZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSogbGltTXNnKTsKK3ZvaWQgbGltRHVtcEluaXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8qKgorICogRnVuY3Rpb24gdG8gY2xlYW51cCBMSU0gc3RhdGUuCisgKiBUaGlzIGNhbGxlZCB1cG9uIHJlc2V0L3BlcnNvbmEgY2hhbmdlIGV0YworICovCitleHRlcm4gdm9pZCBsaW1DbGVhbnVwKHRwQW5pU2lyR2xvYmFsKTsKKworLy8vIEZ1bmN0aW9uIHRvIHBvc3QgbWVzc2FnZXMgdG8gTElNIHRocmVhZAorZXh0ZXJuIHRBTklfVTMyICBsaW1Qb3N0TXNnQXBpKHRwQW5pU2lyR2xvYmFsLCB0U2lyTXNnUSAqKTsKKworLyoqCisgKiBGdW5jdGlvbiB0byBmZXRjaCBtZXNzYWdlcyBwb3N0ZWQgTElNIHRocmVhZAorICovCitleHRlcm4gdm9pZCBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKHRwQW5pU2lyR2xvYmFsKTsKKworLyoqCisgKiBGdW5jdGlvbiB0byBwcm9jZXNzIG1lc3NhZ2VzIHBvc3RlZCB0byBMSU0gdGhyZWFkCisgKiBhbmQgZGlzcGF0Y2ggdG8gdmFyaW91cyBzdWIgbW9kdWxlcyB3aXRoaW4gTElNIG1vZHVsZS4KKyAqLworZXh0ZXJuIHZvaWQgbGltTWVzc2FnZVByb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCwgdHBTaXJNc2dRKTsKK2V4dGVybiB2b2lkIGxpbVByb2Nlc3NNZXNzYWdlcyh0cEFuaVNpckdsb2JhbCwgdHBTaXJNc2dRKTsgLy8gRFQgdGVzdCBhbHQgZGVmZXJyZWQgMgorCisvKioKKyAqIEZ1bmN0aW9uIHRvIGNoZWNrIHRoZSBMSU0gc3RhdGUgaWYgc3lzdGVtIGNhbiBiZSBwdXQgaW4KKyAqIExlYXJuIE1vZGUuCisgKiBUaGlzIGlzIGNhbGxlZCBieSBTQ0ggdXBvbiByZWNlaXZpbmcgU0NIX1NUQVJUX0xFQVJOX01PREUKKyAqIG1lc3NhZ2UgZnJvbSBMSU0uCisgKi8KK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbUNoZWNrU3RhdGVGb3JMZWFybk1vZGUodHBBbmlTaXJHbG9iYWwpOworCisvKioKKyAqIEZ1bmN0aW9uIHRvIGNoZWNrIHRoZSBMSU0gc3RhdGUgaWYgc3lzdGVtIGlzIGluIFNjYW4vTGVhcm4gc3RhdGUuCisgKi8KK2V4dGVybiB0QU5JX1U4IGxpbUlzU3lzdGVtSW5TY2FuU3RhdGUodHBBbmlTaXJHbG9iYWwpOworCisjaWYgKGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgfHwgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQX1NESykpCisvKioKKyAqIEZ1bmN0aW9uIHRvIHNldHVwIFBvbGFyaXMgaW50byBMZWFybiBtb2RlLgorICogVGhpcyBpcyBhbHNvIGNhbGxlZCBieSBTQ0ggdXBvbiByZWNlaXZpbmcgU0NIX1NUQVJUX0xFQVJOX01PREUKKyAqIG1lc3NhZ2UgZnJvbSBMSU0uCisgKi8KK2V4dGVybiB2b2lkIGxpbVNldExlYXJuTW9kZSh0cEFuaVNpckdsb2JhbCk7CisKKy8qKgorICogRnVuY3Rpb24gdG8gcmUtZW5hYmxlIExlYXJuIG1vZGUgbWVhc3VyZW1lbnRzCisgKi8KK2V4dGVybiB2b2lkIGxpbVJlRW5hYmxlTGVhcm5Nb2RlKHRwQW5pU2lyR2xvYmFsKTsKKworI2VuZGlmIC8vI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApIHx8IGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUF9TREspKQorCisvKioKKyAqIEZ1bmN0aW9uIHRvIGhhbmRsZSBJQlNTIGNvYWxlc2NpbmcuCisgKiBCZWFjb24gUHJvY2Vzc2luZyBtb2R1bGUgdG8gY2FsbCB0aGlzLgorICovCitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1IYW5kbGVJQlNTY29hbGVzY2luZyh0cEFuaVNpckdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNjaEJlYWNvblN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICosdHBQRVNlc3Npb24pOworCisvLy8gRnVuY3Rpb24gdXNlZCBieSBvdGhlciBTaXJpdXMgbW9kdWxlcyB0byByZWFkIGdsb2JhbCBTTUUgc3RhdGUKKyBzdGF0aWMgaW5saW5lIHRMaW1TbWVTdGF0ZXMKK2xpbUdldFNtZVN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpIHsgcmV0dXJuIHBNYWMtPmxpbS5nTGltU21lU3RhdGU7IH0KKworLy8vIEZ1bmN0aW9uIHVzZWQgYnkgb3RoZXIgU2lyaXVzIG1vZHVsZXMgdG8gcmVhZCBnbG9iYWwgc3lzdGVtIHJvbGUKKyBzdGF0aWMgaW5saW5lIHRMaW1TeXN0ZW1Sb2xlCitsaW1HZXRTeXN0ZW1Sb2xlKHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpIHsgcmV0dXJuIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGU7IH0KKworLy9saW1HZXRBSUQodHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkgeyByZXR1cm4gcHNlc3Npb25FbnRyeS0+bGltQUlEOyB9CisKK2V4dGVybiB2b2lkIGxpbVJlY2VpdmVkSEJIYW5kbGVyKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4LCB0cFBFU2Vzc2lvbik7CisvL2V4dGVybiB2b2lkIGxpbVJlc2V0SEJQa3RDb3VudCh0cFBFU2Vzc2lvbik7CisKK2V4dGVybiB2b2lkIGxpbUNoZWNrQW5kUXVpZXRCU1ModHBBbmlTaXJHbG9iYWwpOworCisvLy8gRnVuY3Rpb24gdG8gc2VuZCBXRFMgaW5mbyB0byBXU00gaWYgbmVlZGVkCitleHRlcm4gdm9pZCBsaW1Qcm9jZXNzV2RzSW5mbyh0cEFuaVNpckdsb2JhbCwgdFNpclByb3BJRVN0cnVjdCk7CisKKy8vLyBGdW5jdGlvbiB0byBpbml0aWFsaXplIFdEUyBpbmZvIHBhcmFtcworZXh0ZXJuIHZvaWQgbGltSW5pdFdkc0luZm9QYXJhbXModHBBbmlTaXJHbG9iYWwpOworCisvLy8gRnVuY3Rpb24gdGhhdCB0cmlnZ2VycyBTVEEgY29udGV4dCBkZWxldGlvbgorZXh0ZXJuIHZvaWQgbGltVHJpZ2dlclNUQWRlbGV0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YURzLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworCisvLy8gRnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGNoYW5nZSBpbiBBUCdzIGNhcGFiaWx0aWVzIG9uIFNUQQorZXh0ZXJuIHZvaWQgbGltRGV0ZWN0Q2hhbmdlSW5BcENhcGFiaWxpdGllcyh0cEFuaVNpckdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uLHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgbGltVXBkYXRlU2hvcnRTbG90KHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJQcm9iZVJlc3BCZWFjb24gcEJlYWNvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLHRwUEVTZXNzaW9uKTsKKworCisvLy8gY3JlYXRlcyBhbiBhZGR0cyByZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgc2VuZHMgaXQgb3V0IHRvIHN0YWlkCitleHRlcm4gdm9pZCBsaW1TZW5kQWRkdHNSZXEgKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IHN0YWlkLCB0QU5JX1U4IHRzaWQsIHRBTklfVTggdXNlclByaW8sIHRBTklfVTggd21lKTsKKy8vLyBjcmVhdGVzIGEgZGVsdHMgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIHNlbmRzIGl0IG91dCB0byBzdGFpZAorZXh0ZXJuIHZvaWQgbGltU2VuZERlbHRzUmVxICh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBzdGFpZCwgdEFOSV9VOCB0c2lkLCB0QU5JX1U4IHVzZXJQcmlvLCB0QU5JX1U4IHdtZSk7CisvLy8gY3JlYXRlcyBhIFNNIFBvd2VyIFN0YXRlIE1vZGUgdXBkYXRlIHJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBzZW5kcyBpdCBvdXQgdG8gc3RhaWQKK2V4dGVybiB2b2lkIGxpbVBvc3RTdGFydExlYXJuTW9kZU1zZ1RvU2NoKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCitleHRlcm4gZVBoeUNoYW5Cb25kU3RhdGUgbGltR2V0UGh5Q0JTdGF0ZSggdHBBbmlTaXJHbG9iYWwgcE1hYyApOwordFNpck1hY0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAgICBsaW1HZXRIVENCU3RhdGUodEFuaUNCU2Vjb25kYXJ5TW9kZSBhbmlDQk1vZGUpOwordEFuaUNCU2Vjb25kYXJ5TW9kZSAgICAgbGltR2V0QW5pQ0JTdGF0ZSggdFNpck1hY0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCBodENCTW9kZSkgOworCisKKworCisKK3RBTklfVTggbGltSXNTeXN0ZW1JbkFjdGl2ZVN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisjaWYgMCAvKiBDdXJyZW50bHksIHRoaXMgZnVuY3Rpb24gaXMgbm90IHVzZWQgYnV0IGtlZXAgaXQgYXJvdW5kIGZvciB3aGVuIHdlIGRvIG5lZWQgaXQgKi8KK3RTaXJSZXRTdGF0dXMgbGltVXBkYXRlR2xvYmFsQ2hhbm5lbEJvbmRpbmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdEhhbEJpdFZhbCBjYkJpdCk7CisjZW5kaWYgLyogMCAqLworCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCitleHRlcm4gdm9pZCBzZXR1cFF1aWV0QnNzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBsZWFybkludGVydmFsICk7CitleHRlcm4gdEFOSV9CT09MRUFOIGxpbVVwZGF0ZVF1aWV0SUVJbkJlYWNvbnMoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKTsKKyNlbmRpZgorCisjaWZkZWYgQU5JX0FQX1NESworZXh0ZXJuIHZvaWQgbGltQ29udmVydFNjYW5EdXJhdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjKTsKKyNlbmRpZiAvKiBBTklfQVBfU0RLICovCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKK3RTaXJSZXRTdGF0dXMgbGltUHJvY2Vzc0NjYU1vbml0b3JNb2RlQ2hhbmdlTm90aWZpY2F0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGNjYUNiTW9kZSk7CisjZW5kaWYgLyogV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCAqLworCit2b2lkIGxpbUhhbmRsZUxvd1Jzc2lJbmQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGxpbUhhbmRsZUJtcHNTdGF0dXNJbmQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGxpbUhhbmRsZU1pc3NlZEJlYWNvbkluZCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3RNZ210RnJtRHJvcFJlYXNvbiBsaW1Jc1BrdENhbmRpZGF0ZUZvckRyb3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbywgdEFOSV9VMzIgc3ViVHlwZSk7Cit2b2lkIGxpbU1pY0ZhaWx1cmVJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBUaGVzZSB1c2VkIHRvIGJlIGluIERQSAorZXh0ZXJuIHZvaWQgbGltU2V0QnNzaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqYnNzSWQpOworZXh0ZXJuIHZvaWQgbGltR2V0QnNzaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqYnNzSWQpOworZXh0ZXJuIHZvaWQgbGltR2V0TXlNYWNBZGRyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKm1hYyk7CitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1DaGVja1J4U2VxTnVtYmVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8pOworCisjZGVmaW5lIGxpbUdldFFvc01vZGUocHNlc3Npb25FbnRyeSwgcFZhbCkgKihwVmFsKSA9IChwc2Vzc2lvbkVudHJ5KS0+bGltUW9zRW5hYmxlZAorI2RlZmluZSBsaW1HZXRXbWVNb2RlKHBzZXNzaW9uRW50cnksIHBWYWwpICoocFZhbCkgPSAocHNlc3Npb25FbnRyeSktPmxpbVdtZUVuYWJsZWQKKyNkZWZpbmUgbGltR2V0V3NtTW9kZShwc2Vzc2lvbkVudHJ5LCBwVmFsKSAqKHBWYWwpID0gKHBzZXNzaW9uRW50cnkpLT5saW1Xc21FbmFibGVkCisjZGVmaW5lIGxpbUdldDExZE1vZGUocHNlc3Npb25FbnRyeSwgcFZhbCkgKihwVmFsKSA9IChwc2Vzc2lvbkVudHJ5KS0+bGltMTFkRW5hYmxlZAorI2RlZmluZSBsaW1HZXRBY2tQb2xpY3kocE1hYywgcFZhbCkgICAgICAgICAqKHBWYWwpID0gcE1hYy0+bGltLmFja1BvbGljeQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSB2b2lkIGxpbUdldFBoeU1vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBoeU1vZGUsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAqcGh5TW9kZSA9IHBzZXNzaW9uRW50cnkgPyBwc2Vzc2lvbkVudHJ5LT5nTGltUGh5TW9kZSA6IHBNYWMtPmxpbS5nTGltUGh5TW9kZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaW1HZXRSZkJhbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclJGQmFuZCAqYmFuZCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICpiYW5kID0gcHNlc3Npb25FbnRyeSA/IHBzZXNzaW9uRW50cnktPmxpbVJGQmFuZCA6IFNJUl9CQU5EX1VOS05PV047Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBwZVByb2Nlc3NNZXNzYWdlcygpIC0gTWVzc2FnZSBQcm9jZXNzb3IgZm9yIFBFCisgIAorICBWb3NzIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gZGlzcGF0Y2ggdGhlIG1lc3NhZ2UgdG8gUEUKKyAgCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICBccGFyYW0gcE1zZyAtIFBvaW50ZXIgdG8gdGhlIG1lc3NhZ2Ugc3RydWN0dXJlCisgIAorICBccmV0dXJuICB0QU5JX1UzMiAtIFRYX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgcGVQcm9jZXNzTWVzc2FnZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EqIHBNc2cpOworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIHBlRnJlZU1zZworXGJyaWVmIENhbGxlZCBieSBWT1Mgc2NoZWR1bGVyIChmdW5jdGlvbiB2b3Nfc2NoZWRfZmx1c2hfbWNfbXFzKQorXCAgICAgIHRvIGZyZWUgYSBnaXZlbiBQRSBtZXNzYWdlIG9uIHRoZSBUWCBhbmQgTUMgdGhyZWFkLgorXCAgICAgIFRoaXMgaGFwcGVucyB3aGVuIHRoZXJlIGFyZSBtZXNzYWdlcyBwZW5kaW5nIGluIHRoZSBQRSAKK1wgICAgICBxdWV1ZSB3aGVuIHN5c3RlbSBpcyBiZWluZyBzdG9wcGVkIGFuZCByZXNldC4gCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gICB0U2lyTXNnUSAgICAgICBwTXNnCitccmV0dXJuIG5vbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVk9JRF90IHBlRnJlZU1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EqIHBNc2cpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIF9fTElNX0FQSV9IICovCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL2xpbUZULmggYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9saW1GVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZGJhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9saW1GVC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgIE1hY3JvcyBhbmQgRnVuY3Rpb24gcHJvdG90eXBlcyBGVCBhbmQgODAyLjExUiBwdXJwb3NlcyAKKworICAgQ29weXJpZ2h0IDIwMTAgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZm5kZWYgX19MSU1GVF9IX18KKyNkZWZpbmUgX19MSU1GVF9IX18KKworCisjaW5jbHVkZSA8cGFsVHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1HbG9iYWwuaD4KKyNpbmNsdWRlIDxhbmlHbG9iYWwuaD4KKyNpbmNsdWRlIDxsaW1EZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbVNlckRlc1V0aWxzLmg+CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIHZvaWQgbGltRlRPcGVuKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworZXh0ZXJuIHZvaWQgbGltRlRDbGVhbnVwKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworZXh0ZXJuIHZvaWQgbGltRlRJbml0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworZXh0ZXJuIGludCAgbGltUHJvY2Vzc0ZUUHJlQXV0aFJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZyk7CitleHRlcm4gdm9pZCBsaW1QZXJmb3JtRlRQcmVBdXRoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgc3RhdHVzLCB0QU5JX1UzMiAqZGF0YSwgCisgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkICAgICAgICBsaW1QZXJmb3JtUG9zdEZUUHJlQXV0aCh0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHN0YXR1cywgdEFOSV9VMzIgKmRhdGEsIAorICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCAgICAgICAgbGltRlRSZXN1bWVMaW5rQ2IodHBBbmlTaXJHbG9iYWwgcE1hYywgZUhhbFN0YXR1cyBzdGF0dXMsIHRBTklfVTMyICpkYXRhKTsKK3ZvaWQgICAgICAgIGxpbVBvc3RGVFByZUF1dGhSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgZUhhbFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgdEFOSV9VOCAqYXV0aF9yc3AsIHRBTklfVTE2ICBhdXRoX3JzcF9sZW5ndGgsCisgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkICAgICAgICBsaW1IYW5kbGVGVFByZUF1dGhSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgZUhhbFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgdEFOSV9VOCAqYXV0aF9yc3AsIHRBTklfVTE2ICBhdXRoX3JzcF9sZW4sCisgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkICAgICAgICBsaW1Qcm9jZXNzTWxtRlRSZWFzc29jUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmLAorICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCAgICAgICAgbGltUHJvY2Vzc0ZUUHJlYXV0aFJzcFRpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKK2ludCAgICAgICAgIGxpbWlzRmFzdFRyYW5zaXRpb25SZXF1aXJlZCh0cEFuaVNpckdsb2JhbCBwTWFjLCBpbnQgU2Vzc2lvbklkKTsKK3RBTklfQk9PTEVBTiAgIGxpbVByb2Nlc3NGVFVwZGF0ZUtleSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZiApOwordFNpclJldFN0YXR1cyAgbGltUHJvY2Vzc0ZUQWdnclFvc1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZiApOwordm9pZCAgICAgICAgbGltUHJvY2Vzc0ZUQWdnclFvU1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKTsKKworI2VuZGlmIC8qIF9fTElNRlRfSF9fICovIAorCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL2xpbUZURGVmcy5oIGIvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvbGltRlREZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2OWJjMQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL2xpbUZURGVmcy5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgICBNYWNyb3MgYW5kIEZ1bmN0aW9uIHByb3RvdHlwZXMgRlQgYW5kIDgwMi4xMVIgcHVycG9zZXMgCisKKyAgIENvcHlyaWdodCAyMDEwIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZm5kZWYgX19MSU1GVERFRlNfSF9fCisjZGVmaW5lIF9fTElNRlRERUZTX0hfXworCisKKyNpbmNsdWRlIDxwYWxUeXBlcy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTSVJfTURJRV9TSVpFICAgICAgICAgICAgICAgMyAvLyBNRCBJRCgyIGJ5dGVzKSwgQ2FwYWJpbGl0eSgxIGJ5dGUpCisjZGVmaW5lIE1BWF9USURTICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE1BWF9GVElFX1NJWkUgICAgICAgICAgICAgMjU2IC8vIE1heCBzaXplIGxpbWl0ZWQgdG8gMjU2LCBvbiBhY2N0LiBvZiBJVyBjdXN0b20gZXZlbnRzCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEZUIFByZSBBdXRoIFJlcSBTTUU8LT5QRSAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNTaXJGVFByZUF1dGhSZXEKK3sKKyAgIHRBTklfVTE2ICAgIG1lc3NhZ2VUeXBlOyAgICAgIC8vIGVXTklfU01FX0ZUX1BSRV9BVVRIX1JFUQorICAgdEFOSV9VMTYgICAgbGVuZ3RoOworICAgdEFOSV9VOCAgICAgcHJlQXV0aGNoYW5uZWxOdW07CisgICB0U2lyTWFjQWRkciBjdXJyYnNzSWQ7ICAgICAgICAvLyBCU1NJRCBjdXJyZW50bHkgYXNzb2NpYXRlZCB0byBzdXNwZW5kIHRoZSBsaW5rCisgICB0U2lyTWFjQWRkciBwcmVBdXRoYnNzSWQ7ICAgICAvLyBCU1NJRCB0byBwcmVhdXRoIHRvCisgICB0QU5JX1UxNiAgICBmdF9pZXNfbGVuZ3RoOworICAgdEFOSV9VOCAgICAgZnRfaWVzW01BWF9GVElFX1NJWkVdOworICAgdHBTaXJCc3NEZXNjcmlwdGlvbiAgcGJzc0Rlc2NyaXB0aW9uOworfSB0U2lyRlRQcmVBdXRoUmVxLCAqdHBTaXJGVFByZUF1dGhSZXE7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBGVCBQcmUgQXV0aCBSc3AgUEU8LT5TTUUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCBzU2lyRlRQcmVBdXRoUnNwCit7CisgICB0QU5JX1UxNiAgICBtZXNzYWdlVHlwZTsgICAgICAvLyBlV05JX1NNRV9GVF9QUkVfQVVUSF9SU1AKKyAgIHRBTklfVTE2ICAgIGxlbmd0aDsKKyAgIHRBTklfVTggICAgIHNtZVNlc3Npb25JZDsKKyAgIHRTaXJNYWNBZGRyIHByZUF1dGhic3NJZDsgICAgIC8vIEJTU0lEIHRvIHByZWF1dGggdG8KKyAgIHRBTklfVTggICAgIHN0YXR1czsKKyAgIHRBTklfVTE2ICAgIGZ0X2llc19sZW5ndGg7CisgICB0QU5JX1U4ICAgICBmdF9pZXNbTUFYX0ZUSUVfU0laRV07CisgICB0QU5JX1UxNiAgICByaWNfaWVzX2xlbmd0aDsKKyAgIHRBTklfVTggICAgIHJpY19pZXNbTUFYX0ZUSUVfU0laRV07Cit9IHRTaXJGVFByZUF1dGhSc3AsICp0cFNpckZUUHJlQXV0aFJzcDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRlQgUHJlIEF1dGggUmVxIFNNRTwtPlBFIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc1NpckZUVXBkYXRlS2V5SW5mbworeworICAgdEFOSV9VMTYgICAgICAgICAgbWVzc2FnZVR5cGU7CisgICB0QU5JX1UxNiAgICAgICAgICBsZW5ndGg7CisgICB0U2lyS2V5TWF0ZXJpYWwgICBrZXlNYXRlcmlhbDsKK30gdFNpckZUVXBkYXRlS2V5SW5mbywgKnRwU2lyRlRVcGRhdGVLZXlJbmZvOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgR2xvYmFsIEZUIEluZm9ybWF0aW9uIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc0ZUUEVDb250ZXh0Cit7CisgICAgdHBTaXJGVFByZUF1dGhSZXEgcEZUUHJlQXV0aFJlcTsgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZWQgRlQgUHJlIEF1dGggUmVxCisgICAgdm9pZCAgICAgICAgICAgICAgKnBzYXZlZHNlc3Npb25FbnRyeTsgICAgICAgICAgICAgICAgCisgICAgdEFOSV9VOCAgICAgICAgICAgZnRQcmVBdXRoU3RhdHVzOworICAgIHRBTklfVTE2ICAgICAgICAgIHNhdmVkX2F1dGhfcnNwX2xlbmd0aDsKKyAgICB0QU5JX1U4ICAgICAgICAgICBzYXZlZF9hdXRoX3JzcFtNQVhfRlRJRV9TSVpFXTsKKworICAgIC8vIEl0ZW1zIGNyZWF0ZWQgZm9yIHRoZSBuZXcgRlQsIHNlc3Npb24KKyAgICB2b2lkICAgICAgICAgICAgICAqcGZ0U2Vzc2lvbkVudHJ5OyAgICAgICAgICAgICAgICAgICAvLyBTYXZlZCBzZXNzaW9uIGNyZWF0ZWQgZm9yIHByZS1hdXRoIAorICAgIHZvaWQgICAgICAgICAgICAgICpwQWRkQnNzUmVxOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgYWRkIGJzcyByZXEuCisgICAgdm9pZCAgICAgICAgICAgICAgKnBBZGRTdGFSZXE7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSBhZGQgc3RhIHJlcS4KKworfSB0ZnRQRUNvbnRleHQsICp0cGZ0UEVDb250ZXh0OyAKKworCisjZW5kaWYgLyogX19MSU1GVERFRlNfSF9fICovIAorCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL2xpbUdsb2JhbC5oIGIvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvbGltR2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1YTZkZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL2xpbUdsb2JhbC5oCkBAIC0wLDAgKzEsNzE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbUdsb2JhbC5oIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBleHBvcnRlZCBieQorICogTElNIG1vZHVsZS4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzExLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpZm5kZWYgX19MSU1fR0xPQkFMX0gKKyNkZWZpbmUgX19MSU1fR0xPQkFMX0gKKworI2luY2x1ZGUgInduaUFwaS5oIgorI2luY2x1ZGUgInNpckFwaS5oIgorI2luY2x1ZGUgInNpck1hY1Byb3REZWYuaCIKKyNpbmNsdWRlICJzaXJNYWNQcm9wRXh0cy5oIgorI2luY2x1ZGUgInNpckNvbW1vbi5oIgorI2luY2x1ZGUgInNpckRlYnVnLmgiCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjaW5jbHVkZSAiY3NyQXBpLmgiCisjaW5jbHVkZSAic2FwQXBpLmgiCisjZW5kaWYKKworLy8vIE1heGltdW0gbnVtYmVyIG9mIHNjYW4gaGFzaCB0YWJsZSBlbnRyaWVzCisjZGVmaW5lIExJTV9NQVhfTlVNX09GX1NDQU5fUkVTVUxUUyAyNTYKKworLy8gTGluayBUZXN0IFJlcG9ydCBTdGF0dXMuIFRoaXMgYXBwZWFycyBpbiB0aGUgcmVwb3J0IGZyYW1lCisjZGVmaW5lIExJTktfVEVTVF9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgTElOS19URVNUX1NUQVRVU19VTlNVUFBPUlRFRF9SQVRFICAgICAgIDB4MgorI2RlZmluZSBMSU5LX1RFU1RfU1RBVFVTX0lOVkFMSURfQUREUiAgICAgICAgICAgMHgzCisKKy8vIEFtb3VudCBvZiB0aW1lIGluIG5hbm9zZWMgdG8gYmUgc2xlZXAtd2FpdGVkIGJlZm9yZQorLy8gZW5hYmxpbmcgUkhQICgxIG1pbGxpc2VjKQorI2RlZmluZSBMSU1fUkhQX1dPUktfQVJPVU5EX0RVUkFUSU9OIDEwMDAwMDAKKworLy8gTWF4aW11bSBhbW91bnQgb2YgUXVpZXQgZHVyYXRpb24gaW4gbWlsbGlzZWMKKyNkZWZpbmUgTElNX01BWF9RVUlFVF9EVVJBVElPTiAzMgorCisjZGVmaW5lIExJTV9UWF9XUV9FTVBUWV9TTEVFUF9OUyAgICAgICAgICAgICAgICAxMDAwMDAKKworLy8gU2VuZGluZyBEaXNhc3NvY2lhdGUgZnJhbWVzIHRocmVzaG9sZAorI2RlZmluZSBMSU1fU0VORF9ESVNBU1NPQ19GUkFNRV9USFJFU0hPTEQgICAgICAgMgorI2RlZmluZSBMSU1fSEFTSF9NSVNTX1RJTUVSX01TICAgICAgICAgICAgICAgICAgMTAwMDAKKworLy8gRGVmZXJyZWQgTWVzc2FnZSBRdWV1ZSBMZW5ndGgKKyNkZWZpbmUgTUFYX0RFRkVSUkVEX1FVRVVFX0xFTiAgICAgICAgICAgICAgICAgIDIwCisKKy8vIE1heGltdW0gQnVmZmVyIHNpemUKKyNkZWZpbmUgTElNX01BWF9CVUZfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDgxOTIKKworLy8gTWF4aW11bSBudW1iZXIgb2YgUFMgLSBUSU0ncyB0byBiZSBzZW50IHdpdGggb3V0IHdha2V1cCBmcm9tIFNUQQorI2RlZmluZSBMSU1fVElNX1dBSVRfQ09VTlRfRkFDVE9SICAgICAgICAgIDUKKworLyoqIFVzZSB0aGlzIGNvdW50IGlmIChMSU1fVElNX1dBSVRfRkFDVE9SICogTGlzdGVuSW50ZXJ2YWwpIGlzIGxlc3MgdGhhbiBMSU1fTUlOX1RJTV9XQUlUX0NOVCovCisjZGVmaW5lIExJTV9NSU5fVElNX1dBSVRfQ09VTlQgICAgICAgICAgNTAgIAorCisjZGVmaW5lIEdFVF9USU1fV0FJVF9DT1VOVChMSW50cnZsKSAgICAgICAgKChMSW50cnZsICogTElNX1RJTV9XQUlUX0NPVU5UX0ZBQ1RPUikgPiBMSU1fTUlOX1RJTV9XQUlUX0NPVU5UID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTEludHJ2bCAqIExJTV9USU1fV0FJVF9DT1VOVF9GQUNUT1IpIDogTElNX01JTl9USU1fV0FJVF9DT1VOVCkKKworLy8gZW51bXMgZXhwb3J0ZWQgYnkgTElNIGFyZSBhcyBmb2xsb3dzCisKKy8vLyBTeXN0ZW0gcm9sZSBkZWZpbml0aW9uCit0eXBlZGVmIGVudW0gZUxpbVN5c3RlbVJvbGUKK3sKKyAgICBlTElNX1VOS05PV05fUk9MRSwKKyAgICBlTElNX0FQX1JPTEUsCisgICAgZUxJTV9TVEFfSU5fSUJTU19ST0xFLAorICAgIGVMSU1fU1RBX1JPTEUsCisgICAgZUxJTV9CVF9BTVBfU1RBX1JPTEUsCisgICAgZUxJTV9CVF9BTVBfQVBfUk9MRQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAsZUxJTV9QMlBfREVWSUNFX1JPTEUKKyAgICAsZUxJTV9QMlBfREVWSUNFX0dPCisgICAgLGVMSU1fUDJQX0RFVklDRV9DTElORVQKKyNlbmRpZgorfSB0TGltU3lzdGVtUm9sZTsKKworLyoqCisgKiBTTUUgc3RhdGUgZGVmaW5pdGlvbiBhY2Nlc3NpYmxlIGFjcm9zcyBhbGwgU2lyaXVzIG1vZHVsZXMuCisgKiBBUCBvbmx5IHN0YXRlcyBhcmUgTElNX1NNRV9DSEFOTkVMX1NDQU5fU1RBVEUgJgorICogTElNX1NNRV9OT1JNQUxfQ0hBTk5FTF9TQ0FOX1NUQVRFLgorICogTm90ZSB0aGF0IHRoZXNlIHN0YXRlcyBtYXkgYWxzbyBiZSBwcmVzZW50IGluIFNUQQorICogc2lkZSB0b28gd2hlbiBERlMgc3VwcG9ydCBpcyBwcmVzZW50IGZvciBhIFNUQSBpbiBJQlNTIG1vZGUuCisgKi8KK3R5cGVkZWYgZW51bSBlTGltU21lU3RhdGVzCit7CisgICAgZUxJTV9TTUVfT0ZGTElORV9TVEFURSwKKyAgICBlTElNX1NNRV9JRExFX1NUQVRFLAorICAgIGVMSU1fU01FX1NVU1BFTkRfU1RBVEUsCisgICAgZUxJTV9TTUVfV1RfU0NBTl9TVEFURSwKKyAgICBlTElNX1NNRV9XVF9KT0lOX1NUQVRFLAorICAgIGVMSU1fU01FX1dUX0FVVEhfU1RBVEUsCisgICAgZUxJTV9TTUVfV1RfQVNTT0NfU1RBVEUsCisgICAgZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURSwKKyAgICBlTElNX1NNRV9XVF9SRUFTU09DX0xJTktfRkFJTF9TVEFURSwKKyAgICBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEUsCisgICAgZUxJTV9TTUVfQVNTT0NJQVRFRF9TVEFURSwKKyAgICBlTElNX1NNRV9SRUFTU09DSUFURURfU1RBVEUsCisgICAgZUxJTV9TTUVfTElOS19FU1RfU1RBVEUsCisgICAgZUxJTV9TTUVfTElOS19FU1RfV1RfU0NBTl9TVEFURSwKKyAgICBlTElNX1NNRV9XVF9QUkVfQVVUSF9TVEFURSwKKyAgICBlTElNX1NNRV9XVF9ESVNBU1NPQ19TVEFURSwKKyAgICBlTElNX1NNRV9XVF9ERUFVVEhfU1RBVEUsCisgICAgZUxJTV9TTUVfV1RfU1RBUlRfQlNTX1NUQVRFLAorICAgIGVMSU1fU01FX1dUX1NUT1BfQlNTX1NUQVRFLAorICAgIGVMSU1fU01FX05PUk1BTF9TVEFURSwKKyAgICBlTElNX1NNRV9DSEFOTkVMX1NDQU5fU1RBVEUsCisgICAgZUxJTV9TTUVfTk9STUFMX0NIQU5ORUxfU0NBTl9TVEFURQorfSB0TGltU21lU3RhdGVzOworCisvKioKKyAqIE1MTSBzdGF0ZSBkZWZpbml0aW9uLgorICogV2hpbGUgdGhlc2Ugc3RhdGVzIGFyZSBwcmVzZW50IG9uIEFQIHRvbyB3aGVuIGl0IGlzCisgKiBTVEEgbW9kZSwgcGVyLVNUQSBNTE0gc3RhdGUgZXhjbHVzaXZlIHRvIEFQIGlzOgorICogZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTMuCisgKi8KK3R5cGVkZWYgZW51bSBlTGltTWxtU3RhdGVzCit7CisgICAgZUxJTV9NTE1fT0ZGTElORV9TVEFURSwKKyAgICBlTElNX01MTV9JRExFX1NUQVRFLAorICAgIGVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUsCisgICAgZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFLAorICAgIGVMSU1fTUxNX1dUX0pPSU5fQkVBQ09OX1NUQVRFLAorICAgIGVMSU1fTUxNX0pPSU5FRF9TVEFURSwKKyAgICBlTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURSwKKyAgICBlTElNX01MTV9XVF9BVVRIX0ZSQU1FMl9TVEFURSwKKyAgICBlTElNX01MTV9XVF9BVVRIX0ZSQU1FM19TVEFURSwKKyAgICBlTElNX01MTV9XVF9BVVRIX0ZSQU1FNF9TVEFURSwKKyAgICBlTElNX01MTV9BVVRIX1JTUF9USU1FT1VUX1NUQVRFLAorICAgIGVMSU1fTUxNX0FVVEhFTlRJQ0FURURfU1RBVEUsCisgICAgZUxJTV9NTE1fV1RfQVNTT0NfUlNQX1NUQVRFLAorICAgIGVMSU1fTUxNX1dUX1JFQVNTT0NfUlNQX1NUQVRFLAorICAgIGVMSU1fTUxNX0FTU09DSUFURURfU1RBVEUsCisgICAgZUxJTV9NTE1fUkVBU1NPQ0lBVEVEX1NUQVRFLAorICAgIGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUsCisgICAgZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFLAorICAgIGVMSU1fTUxNX0xFQVJOX1NUQVRFLAorICAgIGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1NUQVRFLAorICAgIGVMSU1fTUxNX1dUX0RFTF9CU1NfUlNQX1NUQVRFLAorICAgIGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0FTU09DX1NUQVRFLAorICAgIGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1JFQVNTT0NfU1RBVEUsCisgICAgZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUFJFQVNTT0NfU1RBVEUsCisgICAgZUxJTV9NTE1fV1RfQUREX1NUQV9SU1BfU1RBVEUsCisgICAgZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEUsCisgICAgLy9NTE0gZ29lcyB0byB0aGlzIHN0YXRlIHdoZW4gTElNIGluaXRpYXRlcyBERUxFVEVfU1RBIGFzIHByb2Nlc3Npbmcgb2YgQXNzb2MgcmVxIGJlY2F1c2UKKyAgICAvL3RoZSBlbnRyeSBhbHJlYWR5IGV4aXN0cy4gTElNIGNvbWVzIG91dCBvZiB0aGlzIHN0YXRlIHdoZW4gREVMRVRFX1NUQSByZXNwb25zZSBmcm9tCisgICAgLy9IQUwgaXMgcmVjZWl2ZWQuIExJTSBuZWVkcyB0byBtYWludGFpbiB0aGlzIHN0YXRlIHNvIHRoYXQgQUREX1NUQSBjYW4gYmUgaXNzdWVkIHdoaWxlCisgICAgLy9wcm9jZXNzaW5nIERFTEVURV9TVEEgcmVzcG9uc2UgZnJvbSBIQUwuCisgICAgZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEUsCisgICAgZUxJTV9NTE1fV1RfU0VUX0JTU19LRVlfU1RBVEUsCisgICAgZUxJTV9NTE1fV1RfU0VUX1NUQV9LRVlfU1RBVEUsCisgICAgZUxJTV9NTE1fV1RfU0VUX1NUQV9CQ0FTVEtFWV9TVEFURSwgICAgCisgICAgZUxJTV9NTE1fV1RfQUREQkFfUlNQX1NUQVRFLAorICAgIGVMSU1fTUxNX1dUX1JFTU9WRV9CU1NfS0VZX1NUQVRFLAorICAgIGVMSU1fTUxNX1dUX1JFTU9WRV9TVEFfS0VZX1NUQVRFLAorICAgIGVMSU1fTUxNX1dUX1NFVF9NSU1PUFNfU1RBVEUsCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0ZUX1JFQVNTT0NfU1RBVEUsCisgICAgZUxJTV9NTE1fV1RfRlRfUkVBU1NPQ19SU1BfU1RBVEUsCisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgZUxJTV9NTE1fUDJQX0xJU1RFTl9TVEFURSwKKyNlbmRpZgorfSB0TGltTWxtU3RhdGVzOworCisvLyAxMWggY2hhbm5lbCBxdWlldCBzdGF0ZXMKKy8qIFRoaXMgZW51bSBpbmRpY2F0ZXMgaW4gd2hpY2ggc3RhdGUgdGhlIGRldmljZSBpcyBpbgorICogd2hlbiBpdCByZWNlaXZlcyBxdWlldCBlbGVtZW50IGluIGJlYWNvbiBvciBwcm9iZS1yZXNwb25zZS4KKyAqIFRoZSBkZWZhdWx0IHF1aWV0IHN0YXRlIG9mIHRoZSBkZXZpY2UgaXMgYWx3YXlzIElOSVQKKyAqIGVMSU1fUVVJRVRfQkVHSU4gLSBXaGVuIFF1aWV0IHBlcmlvZCBpcyBzdGFydGVkCisgKiBlTElNX1FVSUVUX0NIQU5HRUQgLSBXaGVuIFF1aWV0IHBlcmlvZCBpcyB1cGRhdGVkCisgKiBlTElNX1FVSUVUX1JVTk5JTkcgLSBCZXR3ZWVuIHR3byBzdWNjZXNzaXZlIFF1aWV0IHVwZGF0ZXMKKyAqIGVMSU1fUVVJRVRfRU5EIC0gV2hlbiBxdWlldCBwZXJpb2QgZW5kcworICovCit0eXBlZGVmIGVudW0gZUxpbVF1aWV0U3RhdGVzCit7CisgICAgZUxJTV9RVUlFVF9JTklULAorICAgIGVMSU1fUVVJRVRfQkVHSU4sCisgICAgZUxJTV9RVUlFVF9DSEFOR0VELAorICAgIGVMSU1fUVVJRVRfUlVOTklORywKKyAgICBlTElNX1FVSUVUX0VORAorfSB0TGltUXVpZXRTdGF0ZXM7CisKKy8vIDExaCBjaGFubmVsIHN3aXRjaCBzdGF0ZXMKKy8qIFRoaXMgZW51bSBpbmRpY2F0ZXMgaW4gd2hpY2ggc3RhdGUgdGhlIGNoYW5uZWwtc3dpdGgKKyAqIGlzIHByZXNlbnRseSBvcGVyYXRpbmcuCisgKiBlTElNXzExSF9DSEFOU1dfSU5JVCAtIERlZmF1bHQgc3RhdGUKKyAqIGVMSU1fMTFIX0NIQU5TV19SVU5OSU5HIC0gV2hlbiBjaGFubmVsIHN3aXRjaCBpcyBydW5uaW5nCisgKiBlTElNXzExSF9DSEFOU1dfRU5EIC0gQWZ0ZXIgY2hhbm5lbCBzd2l0Y2ggaXMgY29tcGxldGUKKyAqLwordHlwZWRlZiBlbnVtIGVMaW1Eb3QxMWhDaGFuU3dTdGF0ZXMKK3sKKyAgICBlTElNXzExSF9DSEFOU1dfSU5JVCwKKyAgICBlTElNXzExSF9DSEFOU1dfUlVOTklORywKKyAgICBlTElNXzExSF9DSEFOU1dfRU5ECit9IHRMaW1Eb3QxMWhDaGFuU3dTdGF0ZXM7CisKKyNpZmRlZiBHRU40X1NDQU4KKworLy9XTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCit0eXBlZGVmIHZvaWQgKCpTVVNQRU5EX1JFU1VNRV9MSU5LX0NBTExCQUNLKSh0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHN0YXR1cywgdEFOSV9VMzIgKmRhdGEpOworCisvLyBMSU0gdG8gSEFMIFNDQU4gTWFuYWdlbWVudCBNZXNzYWdlIEludGVyZmFjZSBzdGF0ZXMKK3R5cGVkZWYgZW51bSBlTGltSGFsU2NhblN0YXRlCit7CisgIGVMSU1fSEFMX0lETEVfU0NBTl9TVEFURSwKKyAgZUxJTV9IQUxfSU5JVF9TQ0FOX1dBSVRfU1RBVEUsCisgIGVMSU1fSEFMX1NUQVJUX1NDQU5fV0FJVF9TVEFURSwKKyAgZUxJTV9IQUxfRU5EX1NDQU5fV0FJVF9TVEFURSwKKyAgZUxJTV9IQUxfRklOSVNIX1NDQU5fV0FJVF9TVEFURSwKKyAgZUxJTV9IQUxfSU5JVF9MRUFSTl9XQUlUX1NUQVRFLAorICBlTElNX0hBTF9TVEFSVF9MRUFSTl9XQUlUX1NUQVRFLAorICBlTElNX0hBTF9FTkRfTEVBUk5fV0FJVF9TVEFURSwKKyAgZUxJTV9IQUxfRklOSVNIX0xFQVJOX1dBSVRfU1RBVEUsCisgIGVMSU1fSEFMX1NDQU5OSU5HX1NUQVRFLAorLy9XTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCisgIGVMSU1fSEFMX1NVU1BFTkRfTElOS19XQUlUX1NUQVRFLAorICBlTElNX0hBTF9TVVNQRU5EX0xJTktfU1RBVEUsCisgIGVMSU1fSEFMX1JFU1VNRV9MSU5LX1dBSVRfU1RBVEUsCisvL2VuZCBXTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCit9IHRMaW1MaW1IYWxTY2FuU3RhdGU7CisjZW5kaWYgLy8gR0VONF9TQ0FOCisKKy8vIExJTSBzdGF0ZXMgcmVsYXRlZCB0byBBLU1QRFUvQkEKKy8vIFRoaXMgaXMgdXNlZCBmb3IgbWFpbnRhaW5pbmcgdGhlIHN0YXRlIGJldHdlZW4gUEUgYW5kIEhBTCBvbmx5LgordHlwZWRlZiBlbnVtIGVMaW1CQVN0YXRlCit7CisgIGVMSU1fQkFfU1RBVEVfSURMRSwgLy8gd2UgYXJlIG5vdCB3YWl0aW5nIGZvciBhbnl0aGluZyBmcm9tIEhBTC4KKyAgZUxJTV9CQV9TVEFURV9XVF9BRERfUlNQLCAvL1dlIGFyZSB3YWl0aW5nIGZvciBBZGQgcnNwb25zZSBmcm9tIEhBTC4KKyAgZUxJTV9CQV9TVEFURV9XVF9ERUxfUlNQIC8vICBXZSBhcmUgd2FpdGluZyBmb3IgRGVsIHJlc3BvbnNlIGZyb20gSEFMLgorfSB0TGltQkFTdGF0ZTsKKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKSAmJiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKK3R5cGVkZWYgc3RydWN0IHNMaW1NZWFzUGFyYW1zCit7CisgICAgVFhfVElNRVIgICAgbWVhc3VyZW1lbnRJbmRUaW1lcjsKKyAgICBUWF9USU1FUiAgICBsZWFybkludGVydmFsVGltZXI7CisgICAgVFhfVElNRVIgICAgbGVhcm5EdXJhdGlvblRpbWVyOworICAgIHRBTklfVTMyICAgIHJzc2lBbHBoYTsKKyAgICB0QU5JX1UzMiAgICBjaGFuVXRpbEFscGhhOworICAgIHRBTklfVTggICAgIHNob3J0RHVyYXRpb25Db3VudDsKKyAgICB0QU5JX1U4ICAgICBpc01lYXNJbmRUaW1lckFjdGl2ZToxOworICAgIHRBTklfVTggICAgIGRpc2FibGVNZWFzdXJlbWVudHM6MTsKKyAgICB0QU5JX1U4ICAgICByc3ZkOjY7CisgICAgdEFOSV9VOCAgICAgbmV4dExlYXJuQ2hhbm5lbElkOworfSB0TGltTWVhc1BhcmFtcywgKnRwTGltTWVhc1BhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QgdExpbU1lYXNNYXRyaXhOb2RlIHRMaW1NZWFzTWF0cml4Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHBMaW1NZWFzTWF0cml4Tm9kZTsKK3N0cnVjdCB0TGltTWVhc01hdHJpeE5vZGUKK3sKKyAgICB0U2lyTWVhc01hdHJpeEluZm8gICAgIG1hdHJpeDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgYXZnUnNzaTsKKyAgICB0cExpbU1lYXNNYXRyaXhOb2RlICAgIG5leHQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCB0TGltTmVpZ2hib3JCc3NXZHNOb2RlIHRMaW1OZWlnaGJvckJzc1dkc05vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0cExpbU5laWdoYm9yQnNzV2RzTm9kZTsKK3N0cnVjdCB0TGltTmVpZ2hib3JCc3NXZHNOb2RlCit7CisgICAgdFNpck5laWdoYm9yQnNzV2RzSW5mbyAgICAgaW5mbzsKKyAgICB0cExpbU5laWdoYm9yQnNzV2RzTm9kZSAgICBuZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1lYXNEYXRhCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgZHVyYXRpb247ICAKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBwcmV2VHNmTG87CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgcHJldkNoYW5uZWxVdGlsaXphdGlvbjsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhdmdDaGFubmVsVXRpbGl6YXRpb247CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgbnVtTWF0cml4Tm9kZXM7CisgICAgdHBMaW1NZWFzTWF0cml4Tm9kZSAgICAgcE1lYXNNYXRyaXhJbmZvOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIG51bUJzc1dkczsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICB0b3RhbEJzc1NpemU7CisgICAgdHBMaW1OZWlnaGJvckJzc1dkc05vZGUgcE5laWdoYm9yV2RzSW5mbzsKK30gdExpbU1lYXNEYXRhLCAqdHBMaW1NZWFzRGF0YTsKKyNlbmRpZgorCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisvLy8gRGVmaW5pdGlvbiBmb3IgQWx0ZXJuYXRlIEJTUyBsaXN0Cit0eXBlZGVmIHN0cnVjdCBzU2lyTXVsdGlwbGVBbHRlcm5hdGVSYWRpb0luZm8KK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICBudW1Cc3M7CisgICAgdFNpckFsdGVybmF0ZVJhZGlvSW5mbyAgIGFsdGVybmF0ZVJhZGlvW1NJUl9NQVhfTlVNX0FMVEVSTkFURV9SQURJT1NdOworfSB0U2lyTXVsdGlwbGVBbHRlcm5hdGVSYWRpb0luZm8sICp0cFNpck11bHRpcGxlQWx0ZXJuYXRlUmFkaW9JbmZvOworCisvLy8gRGVmaW5pdGlvbiBmb3IgTmVpZ2hib3IgQlNTIGxpc3QKK3R5cGVkZWYgc3RydWN0IHNTaXJNdWx0aXBsZU5laWdoYm9yQnNzSW5mbworeworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgbnVtQnNzOworICAgIHRTaXJOZWlnaGJvckJzc0luZm8gIGJzc0xpc3RbU0lSX01BWF9OVU1fTkVJR0hCT1JfQlNTXTsKK30gdFNpck11bHRpcGxlTmVpZ2hib3JCc3NJbmZvLCAqdHBTaXJNdWx0aXBsZU5laWdoYm9yQnNzSW5mbzsKKyNlbmRpZgorCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKy8qKgorICogRm9sbG93aW5nIGlzIGRlZmluaXRpb24gb2YgdG8tYmUtcmVsZWFzZWQgQUlEIGxpc3QuCisgKiBXaGVuICdzZWVuJyBBSUQgaXMgbW92ZWQgZnJvbSB0by1iZS1yZWxlYXNlZCBsaXN0CisgKiB0byBmcmVlIHBvb2wuCisgKi8KK3R5cGVkZWYgc3RydWN0IHNMaW1BSUR0YnIKK3sKKyAgICB0QU5JX1U4IHRicjoxOworICAgIHRBTklfVTggc2VlbjoxOworfSB0TGltQUlEdGJyOworI2VuZGlmCisKKy8vIE1MTSBSZXEvQ25mIHN0cnVjdHVyZSBkZWZpbml0aW9ucwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbUF1dGhSZXEKK3sKKyAgICB0U2lyTWFjQWRkciAgICBwZWVyTWFjQWRkcjsKKyAgICB0QW5pQXV0aFR5cGUgICBhdXRoVHlwZTsKKyAgICB0QU5JX1UzMiAgICAgICBhdXRoRmFpbHVyZVRpbWVvdXQ7CisgICAgdEFOSV9VOCAgICAgICAgc2Vzc2lvbklkOyAKK30gdExpbU1sbUF1dGhSZXEsICp0cExpbU1sbUF1dGhSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1Kb2luUmVxCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBqb2luRmFpbHVyZVRpbWVvdXQ7CisgICAgdFNpck1hY1JhdGVTZXQgICAgICAgICBvcGVyYXRpb25hbFJhdGVTZXQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAgICAgYnNzRGVzY3JpcHRpb247Cit9IHRMaW1NbG1Kb2luUmVxLCAqdHBMaW1NbG1Kb2luUmVxOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtU2NhblJlcQoreworICAgIHRTaXJCc3NUeXBlICAgICAgICBic3NUeXBlOworICAgIHRTaXJNYWNBZGRyICAgICAgICBic3NJZDsKKyAgICB0U2lyTWFjU1NpZCAgICAgICAgc3NJZFtTSVJfU0NBTl9NQVhfTlVNX1NTSURdOworICAgIHRTaXJTY2FuVHlwZSAgICAgICBzY2FuVHlwZTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgbWluQ2hhbm5lbFRpbWU7CisgICAgdEFOSV9VMzIgICAgICAgICAgIG1heENoYW5uZWxUaW1lOworICAgIHRTaXJCYWNrZ3JvdW5kU2Nhbk1vZGUgIGJhY2tncm91bmRTY2FuTW9kZTsKKyAgICB0QU5JX1UzMiBkb3QxMW1vZGU7CisgICAgLyogTnVtYmVyIG9mIFNTSURzIHRvIHNjYW4oc2VuZCBQcm9iZSByZXF1ZXN0KSAqLworICAgIHRBTklfVTggICAgICAgICAgICBudW1Tc2lkOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIHRBTklfQk9PTEVBTiAgIHAycFNlYXJjaDsKKyNlbmRpZgorICAgIHRBTklfVTE2ICAgICAgICAgICB1SUVGaWVsZExlbjsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgdUlFRmllbGRPZmZzZXQ7CisKKyAgICAvL2NoYW5uZWxMaXN0IE1VU1QgYmUgdGhlIGxhc3QgZmllbGQgb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICB0U2lyQ2hhbm5lbExpc3QgICAgY2hhbm5lbExpc3Q7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgdExpbU1sbVNjYW5SZXEuLi4uCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgdUlFRmlsZWRMZW4gCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgdUlFRmlsZWRPZmZzZXQgICAgICAgICAgICAgICAtLS0tKworICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgfAorICAgICAgY2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgICAgICAgICAgfAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgfAorICAgICAgLi4uIHZhcmlhYmxlIHNpemUgdXAgdG8gICAgICAgICAgfAorICAgICAgY2hhbm5lbE51bWJlcltudW1DaGFubmVscy0xXSAgICAgfAorICAgICAgVGhpcyBjYW4gYmUgemVybywgaWYgICAgICAgICAgICAgfAorICAgICAgbnVtQ2hhbm5lbCBpcyB6ZXJvLiAgICAgICAgICAgICAgfAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC0tKworICAgICAgLi4uIHZhcmlhYmxlIHNpemUgdUlFRmlsZWQgCisgICAgICB1cCB0byB1SUVGaWVsZExlbiAoY2FuIGJlIDApCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9IHRMaW1NbG1TY2FuUmVxLCAqdHBMaW1NbG1TY2FuUmVxOworCit0eXBlZGVmIHN0cnVjdCB0TGltU2NhblJlc3VsdE5vZGUgdExpbVNjYW5SZXN1bHROb2RlOworc3RydWN0IHRMaW1TY2FuUmVzdWx0Tm9kZQoreworICAgIHRMaW1TY2FuUmVzdWx0Tm9kZSAqbmV4dDsKKyAgICB0U2lyQnNzRGVzY3JpcHRpb24gYnNzRGVzY3JpcHRpb247Cit9OworCisKKy8vIFByZS1hdXRoZW50aWNhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgordHlwZWRlZiBzdHJ1Y3QgdExpbVByZUF1dGhOb2RlCit7CisgICAgc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAgICAgKm5leHQ7CisgICAgdFNpck1hY0FkZHIgICAgICAgICBwZWVyTWFjQWRkcjsKKyAgICB0QW5pQXV0aFR5cGUgICAgICAgIGF1dGhUeXBlOworICAgIHRMaW1NbG1TdGF0ZXMgICAgICAgbWxtU3RhdGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBhdXRoTm9kZUlkeDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGNoYWxsZW5nZVRleHRbU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9MRU5HVEhdOworICAgIHRBTklfVTggICAgICAgICAgICAgZlRpbWVyU3RhcnRlZDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgZlNlZW46MTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGZGcmVlOjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICByc3ZkOjU7CisgICAgVFhfVElNRVIgICAgICAgICAgICB0aW1lcjsKK310TGltUHJlQXV0aE5vZGUsICp0cExpbVByZUF1dGhOb2RlOworCisvLyBQcmUtYXV0aGVudGljYXRpb24gdGFibGUgZGVmaW5pdGlvbgordHlwZWRlZiBzdHJ1Y3QgdExpbVByZUF1dGhUYWJsZQoreworICAgIHRBTklfVTMyICAgICAgICBudW1FbnRyeTsKKyAgICB0cExpbVByZUF1dGhOb2RlIHBUYWJsZTsKK310TGltUHJlQXV0aFRhYmxlLCAqdHBMaW1QcmVBdXRoVGFibGU7CisKKy8vLyBQZXIgU1RBIGNvbnRleHQgc3RydWN0dXJlIGRlZmluaXRpb24KK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1TdGFDb250ZXh0Cit7CisgICAgdExpbU1sbVN0YXRlcyAgICAgICAgICAgbWxtU3RhdGU7CisgICAgdEFuaUF1dGhUeXBlICAgICAgICAgICAgYXV0aFR5cGU7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGlzdGVuSW50ZXJ2YWw7CisgICAgdFNpck1hY0NhcGFiaWxpdHlJbmZvICAgY2FwYWJpbGl0eUluZm87CisgICAgdFNpck1hY1Byb3BSYXRlU2V0ICAgICAgcHJvcFJhdGVTZXQ7CisgICAgdFNpck1hY1JlYXNvbkNvZGVzICAgICAgZGlzYXNzb2NSZWFzb247CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgY2xlYW51cFRyaWdnZXI7CisKKyAgICB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZTsKKyAgICB0QU5JX1UxNiBwcm90U3RhdHVzQ29kZTsKKyAgICAKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBzdWJUeXBlOjE7IC8vIEluZGljYXRlcyBBU1NPQyAoMCkgb3IgUkVBU1NPQyAoMSkKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICB1cGRhdGVDb250ZXh0OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2NoQ2xlYW46MTsKKyAgICAvLyA4MDIuMTFuIEhUIENhcGFiaWxpdHkgaW4gU3RhdGlvbjogRW5hYmxlZCAxIG9yIERJc2FibGVkIDAKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBodENhcGFiaWxpdHk6MTsKK30gdExpbU1sbVN0YUNvbnRleHQsICp0cExpbU1sbVN0YUNvbnRleHQ7CisKKy8vIFN0cnVjdHVyZSBkZWZpbml0aW9uIHRvIGhvbGQgZGVmZXJyZWQgbWVzc2FnZXMgcXVldWUgcGFyYW1ldGVycwordHlwZWRlZiBzdHJ1Y3Qgc0xpbURlZmVycmVkTXNnUVBhcmFtcworeworICAgIHRTaXJNc2dRICAgIGRlZmVycmVkUXVldWVbTUFYX0RFRkVSUkVEX1FVRVVFX0xFTl07CisgICAgdEFOSV9VMTYgICAgICAgICBzaXplOworICAgIHRBTklfVTE2ICAgICAgICAgcmVhZDsKKyAgICB0QU5JX1UxNiAgICAgICAgIHdyaXRlOworfSB0TGltRGVmZXJyZWRNc2dRUGFyYW1zLCAqdHBMaW1EZWZlcnJlZE1zZ1FQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1UcmFjZVEKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICB0eXBlOworICAgIHRMaW1TbWVTdGF0ZXMgICAgICBzbWVTdGF0ZTsKKyAgICB0TGltTWxtU3RhdGVzICAgICAgbWxtU3RhdGU7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgdmFsdWU7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgdmFsdWUyOworfSB0TGltVHJhY2VROworCit0eXBlZGVmIHN0cnVjdCBzTGltVHJhY2VQYXJhbXMKK3sKKyAgICB0TGltVHJhY2VRICAgIHRyYWNlUXVldWVbMTAyNF07CisgICAgdEFOSV9VMTYgICAgICAgICAgIHdyaXRlOworICAgIHRBTklfVTE2ICAgICAgICAgICBlbmFibGVkOworfSB0TGltVHJhY2VQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHNDZmdQcm90ZWN0aW9uCit7CisgICAgdEFOSV9VMzIgb3ZlcmxhcEZyb21sbGE6MTsKKyAgICB0QU5JX1UzMiBvdmVybGFwRnJvbWxsYjoxOworICAgIHRBTklfVTMyIG92ZXJsYXBGcm9tbGxnOjE7CisgICAgdEFOSV9VMzIgb3ZlcmxhcEh0MjA6MTsKKyAgICB0QU5JX1UzMiBvdmVybGFwTm9uR2Y6MTsKKyAgICB0QU5JX1UzMiBvdmVybGFwTHNpZ1R4b3A6MTsKKyAgICB0QU5JX1UzMiBvdmVybGFwUmlmczoxOworICAgIHRBTklfVTMyIG92ZXJsYXBPQlNTOjE7IC8qIGFkZGVkIGZvciBvYnNzICovCisgICAgdEFOSV9VMzIgZnJvbWxsYToxOworICAgIHRBTklfVTMyIGZyb21sbGI6MTsKKyAgICB0QU5JX1UzMiBmcm9tbGxnOjE7CisgICAgdEFOSV9VMzIgaHQyMDoxOworICAgIHRBTklfVTMyIG5vbkdmOjE7CisgICAgdEFOSV9VMzIgbHNpZ1R4b3A6MTsKKyAgICB0QU5JX1UzMiByaWZzOjE7CisgICAgdEFOSV9VMzIgb2JzczoxOyAvKiBhZGRlZCBmb3IgT2JzcyAqLworfXRDZmdQcm90ZWN0aW9uLCAqdHBDZmdQcm90ZWN0aW9uOworCit0eXBlZGVmIGVudW0gZUxpbVByb3RTdGFDYWNoZVR5cGUKK3sKKyAgICBlTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfSU5WQUxJRCwKKyAgICBlTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfbGxCLAorICAgIGVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9sbEcsICAKKyAgICBlTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfSFQyMAorfXRMaW1Qcm90U3RhQ2FjaGVUeXBlOworCit0eXBlZGVmIHN0cnVjdCBzQ2FjaGVQYXJhbXMKK3sKKyAgICB0QU5JX1U4ICAgICAgICBhY3RpdmU7CisgICAgdFNpck1hY0FkZHIgICBhZGRyOyAgICAKKyAgICB0TGltUHJvdFN0YUNhY2hlVHlwZSBwcm90U3RhQ2FjaGVUeXBlOworICAgIAorfSB0Q2FjaGVQYXJhbXMsICp0cENhY2hlUGFyYW1zOworCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorI2RlZmluZSBMSU1fUFJPVF9TVEFfT1ZFUkxBUF9DQUNIRV9TSVpFICAgICAxMAorI2RlZmluZSBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRSAyNTYKKyNlbHNlCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorI2RlZmluZSBMSU1fUFJPVF9TVEFfT1ZFUkxBUF9DQUNIRV9TSVpFICAgIEhBTF9OVU1fQVNTT0NfU1RBCisjZGVmaW5lIExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFICAgICAgICAgICAgSEFMX05VTV9BU1NPQ19TVEEKKyNlbHNlCisjZGVmaW5lIExJTV9QUk9UX1NUQV9PVkVSTEFQX0NBQ0hFX1NJWkUgICAgNQorI2RlZmluZSBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRSAgICAgICAgICAgIDUKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHNMaW1Qcm90U3RhUGFyYW1zCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgIG51bVN0YTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgcHJvdGVjdGlvbkVuYWJsZWQ7Cit9IHRMaW1Qcm90U3RhUGFyYW1zLCAqdHBMaW1Qcm90U3RhUGFyYW1zOworCisKK3R5cGVkZWYgc3RydWN0IHNMaW1Ob1Nob3J0UGFyYW1zCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgbnVtTm9uU2hvcnRQcmVhbWJsZVN0YTsKKyAgICB0Q2FjaGVQYXJhbXMgICAgICBzdGFOb1Nob3J0Q2FjaGVbTElNX1BST1RfU1RBX0NBQ0hFX1NJWkVdOworfSB0TGltTm9TaG9ydFBhcmFtcywgKnRwTGltTm9TaG9ydFBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU5vU2hvcnRTbG90UGFyYW1zCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgbnVtTm9uU2hvcnRTbG90U3RhOworICAgIHRDYWNoZVBhcmFtcyAgICAgIHN0YU5vU2hvcnRTbG90Q2FjaGVbTElNX1BST1RfU1RBX0NBQ0hFX1NJWkVdOworfSB0TGltTm9TaG9ydFNsb3RQYXJhbXMsICp0cExpbU5vU2hvcnRTbG90UGFyYW1zOworCisKK3R5cGVkZWYgc3RydWN0IHRMaW1JYnNzUGVlck5vZGUgdExpbUlic3NQZWVyTm9kZTsKK3N0cnVjdCB0TGltSWJzc1BlZXJOb2RlCit7CisgICAgdExpbUlic3NQZWVyTm9kZSAgICAgICAgICpuZXh0OworICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgICBwZWVyTWFjQWRkcjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICBhbmlJbmRpY2F0b3I6MTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZFJhdGVzUHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgIGVkY2FQcmVzZW50OjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgd21lRWRjYVByZXNlbnQ6MTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICB3bWVJbmZvUHJlc2VudDoxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgIGh0Q2FwYWJsZToxOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgIHJzdmQ6MjsKKyAgICB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gICAgY2FwYWJpbGl0eUluZm87CisgICAgdFNpck1hY1JhdGVTZXQgICAgICAgICAgIHN1cHBvcnRlZFJhdGVzOworICAgIHRTaXJNYWNSYXRlU2V0ICAgICAgICAgICBleHRlbmRlZFJhdGVzOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkTUNTU2V0W1NJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVRdOworICAgIHRTaXJNYWNFZGNhUGFyYW1TZXRJRSAgICBlZGNhUGFyYW1zOworICAgIHRBTklfVTE2IHByb3BDYXBhYmlsaXR5OworICAgIHRBTklfVTggIGVycEllUHJlc2VudDsKKworICAgIC8vSFQgQ2FwYWJpbGl0aWVzIG9mIElCU1MgUGVlcgorICAgIHRBTklfVTggaHRHcmVlbmZpZWxkOworICAgIHRBTklfVTggaHRTaG9ydEdJNDBNaHo7CisgICAgdEFOSV9VOCBodFNob3J0R0kyME1oejsKKworICAgIC8vIERTU1MvQ0NLIGF0IDQwIE1IejogRW5hYmxlZCAxIG9yIERpc2FibGVkCisgICAgdEFOSV9VOCBodERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0OworCisgICAgLy8gTUlNTyBQb3dlciBTYXZlCisgICAgdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIGh0TUlNT1BTU3RhdGU7CisKKyAgICAvLworICAgIC8vIEEtTVBEVSBEZW5zaXR5CisgICAgLy8gMDAwIC0gTm8gcmVzdHJpY3Rpb24KKyAgICAvLyAwMDEgLSAxLzggdXNlYworICAgIC8vIDAxMCAtIDEvNCB1c2VjCisgICAgLy8gMDExIC0gMS8yIHVzZWMKKyAgICAvLyAxMDAgLSAxIHVzZWMKKyAgICAvLyAxMDEgLSAyIHVzZWMKKyAgICAvLyAxMTAgLSA0IHVzZWMKKyAgICAvLyAxMTEgLSA4IHVzZWMKKyAgICAvLworICAgIHRBTklfVTggaHRBTXBkdURlbnNpdHk7CisKKyAgICAvLyBNYXhpbXVtIFJ4IEEtTVBEVSBmYWN0b3IKKyAgICB0QU5JX1U4IGh0TWF4UnhBTXBkdUZhY3RvcjsKKworICAgIC8vU2V0IHRvIDAgZm9yIDM4Mzkgb2N0ZXRzCisgICAgLy9TZXQgdG8gMSBmb3IgNzkzNSBvY3RldHMKKyAgICB0QU5JX1U4IGh0TWF4QW1zZHVMZW5ndGg7CisKKyAgICAvLworICAgIC8vIFJlY29tbWVuZGVkIFR4IFdpZHRoIFNldAorICAgIC8vIDAgLSB1c2UgMjAgTUh6IGNoYW5uZWwgKGNvbnRyb2wgY2hhbm5lbCkKKyAgICAvLyAxIC0gdXNlIDQwIE1oeiBjaGFubmVsCisgICAgLy8KKyAgICB0QU5JX1U4IGh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworCisgICAgdEFOSV9VOCBiZWFjb25IQkNvdW50OworICAgIHRBTklfVTggaGVhcnRiZWF0RmFpbHVyZTsKKworICAgIHRBTklfVTggKmJlYWNvbjsgLy9Ib2xkIGJlYWNvbiB0byBiZSBzZW50IHRvIEhERC9DU1IKKyAgICB0QU5JX1UxNiBiZWFjb25MZW47CisgICAgCit9OworCisvLyBFbnVtcyB1c2VkIGZvciBjaGFubmVsIHN3aXRjaGluZy4KK3R5cGVkZWYgZW51bSBlTGltQ2hhbm5lbFN3aXRjaFN0YXRlCit7CisgICAgZUxJTV9DSEFOTkVMX1NXSVRDSF9JRExFLAorICAgIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9PTkxZLAorICAgIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfU0VDT05EQVJZX09OTFksCisgICAgZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX0FORF9TRUNPTkRBUlkKK30gdExpbUNoYW5uZWxTd2l0Y2hTdGF0ZTsKKworCisvLyBDaGFubmVsIFN3aXRjaCBJbmZvCit0eXBlZGVmIHN0cnVjdCBzTGltQ2hhbm5lbFN3aXRjaEluZm8KK3sKKyAgICB0TGltQ2hhbm5lbFN3aXRjaFN0YXRlICAgc3RhdGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIHByaW1hcnlDaGFubmVsOworICAgIHRBbmlDQlNlY29uZGFyeU1vZGUgICAgICBzZWNvbmRhcnlTdWJCYW5kOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICBzd2l0Y2hDb3VudDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgc3dpdGNoVGltZW91dFZhbHVlOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICBzd2l0Y2hNb2RlOworfSB0TGltQ2hhbm5lbFN3aXRjaEluZm8sICp0cExpbUNoYW5uZWxTd2l0Y2hJbmZvOworCisvLyBFbnVtcyB1c2VkIHdoZW4gc3RvcHBpbmcgdGhlIFR4LgordHlwZWRlZiBlbnVtIGVMaW1RdWlldFR4TW9kZQoreworICAgIGVMSU1fVFhfQUxMID0gMCwgICAgICAgLyogU3RvcHMvcmVzdW1lcyB0aGUgdHJhbnNtaXNzaW9uIG9mIGFsbCBzdGF0aW9ucywgVXNlcyB0aGUgZ2xvYmFsIGZsYWcuICovCisgICAgZUxJTV9UWF9TVEEsICAgICAgICAgICAvKiBTdG9wcy9yZXN1bWVzIHRoZSB0cmFuc21pc3Npb24gb2Ygc3BlY2lmaWMgc3RhdGlvbnMgaWRlbnRpZmllZCBieSBzdGFJZC4gKi8KKyAgICBlTElNX1RYX0JTUywgICAgICAgICAgIC8qIFN0b3BzL3Jlc3VtZXMgdGhlIHRyYW5zbWlzc2lvbiBvZiBhbGwgdGhlIHBhY2tldHMgaW4gQlNTICovCisgICAgZUxJTV9UWF9CU1NfQlVUX0JFQUNPTiAvKiBTdG9wcy9yZXN1bWVzIHRoZSB0cmFuc21pc3Npb24gb2YgYWxsIHBhY2tldHMgZXhjZXB0IGJlYWNvbnMgaW4gQlNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIHVzZWQgd2hlbiByYWRhciBpcyBkZXRlY3RlZCBpbiB0aGUgY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEJlYWNvbiBoYXMgdG8gYmUgc2VudCB0byBub3RpZnkgdGhlIHN0YXRpb25zIGFzc29jaWF0ZWQgYWJvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzY2hlZHVsZWQgY2hhbm5lbCBzd2l0Y2ggKi8KK30gdExpbVF1aWV0VHhNb2RlOworCit0eXBlZGVmIGVudW0gZUxpbUNvbnRyb2xUeAoreworICAgIGVMSU1fUkVTVU1FX1RYID0gMCwKKyAgICBlTElNX1NUT1BfVFgKK30gdExpbUNvbnRyb2xUeDsKKworI2lmZGVmIEFOSV9BUF9TREsKK3R5cGVkZWYgc3RydWN0IHNMaW1TY2FuRHVyYXRpb25Db252ZXJ0Cit7CisgICAgdEFOSV9VMzIgc2hvcnRDaGFubmVsU2NhbkR1cmF0aW9uX3RpY2s7IC8qIFVzZWQgdG8gdXBkYXRlIHRpbWVycywgZm9yIG9wdGltaXphdGlvbiBwdXJwb3Nlcy4gIFZhbHVlIGNvbnZlcnRlZCB0byBUSUNLUyBvbmNlICovCisgICAgdEFOSV9VMzIgc2hvcnRDaGFubmVsU2NhbkR1cmF0aW9uX1RVOyAvKiBVc2VkIGJ5IHF1aWV0QlNTIGR1cmF0aW9uLiAgQ29udmVydGVkIHRvIFRVIG9uY2UgKi8KKyAgICB0QU5JX1UzMiBsb25nQ2hhbm5lbFNjYW5EdXJhdGlvbl90aWNrOyAvKiBVc2VkIHRvIHVwZGF0ZSB0aW1lcnMsIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMuICBWYWx1ZSBjb252ZXJ0ZWQgdG8gVElDS1Mgb25jZSAqLworICAgIHRBTklfVTMyIGxvbmdDaGFubmVsU2NhbkR1cmF0aW9uX1RVOyAvKiBVc2VkIGJ5IHF1aWV0QlNTIGR1cmF0aW9uLiAgQ29udmVydGVkIHRvIFRVIG9uY2UgKi8KK30gdExpbVNjYW5EdXJhdGlvbkNvbnZlcnQsICp0cExpbVNjYW5EdXJhdGlvbkNvbnZlcnQ7CisjZW5kaWYgLyogQU5JX0FQX1NESyAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc0xpbVRzcGVjSW5mbworeworICAgIHRBTklfVTggICAgICAgICAgaW51c2U7ICAgICAgIC8vIDA9PWZyZWUsIGVsc2UgdXNlZAorICAgIHRBTklfVTggICAgICAgICAgaWR4OyAgICAgICAgIC8vIGluZGV4IGluIGxpc3QKKyAgICB0QU5JX1U4ICAgICAgICAgIHN0YUFkZHJbNl07CisgICAgdEFOSV9VMTYgICAgICAgICBhc3NvY0lkOworICAgIHRTaXJNYWNUc3BlY0lFICAgdHNwZWM7CisgICAgdEFOSV9VOCAgICAgICAgICBudW1UY2xhczsgLy8gbnVtYmVyIG9mIFRjbGFzIGVsZW1lbnRzCisgICAgdFNpclRjbGFzSW5mbyAgICB0Y2xhc0luZm9bU0lSX01BQ19UQ0xBU0lFX01BWE5VTV07CisgICAgdEFOSV9VOCAgICAgICAgICB0Y2xhc1Byb2M7CisgICAgdEFOSV9VOCAgICAgICAgICB0Y2xhc1Byb2NQcmVzZW50OjE7IC8vdGNsYXNzUHJvYyBpcyB2YWxpZCBvbmx5IGlmIHRoaXMgaXMgc2V0IHRvIDEuCit9IF9fYW5pX2F0dHJfcGFja2VkIHRMaW1Uc3BlY0luZm8sICp0cExpbVRzcGVjSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbUFkbWl0UG9saWN5SW5mbworeworICAgIHRBTklfVTggICAgICAgICAgdHlwZTsgICAgICAvLyBhZG1pdCBjb250cm9sIHBvbGljeSB0eXBlCisgICAgdEFOSV9VOCAgICAgICAgICBid19mYWN0b3I7IC8vIG92ZXJzdWJzY3JpcHRpb24gZmFjdG9yIDogMCBtZWFucyBub3RoaW5nIGlzIGFsbG93ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbGlkIG9ubHkgd2hlbiAndHlwZScgaXMgc2V0IEJXX0ZBQ1RPUgorfSB0TGltQWRtaXRQb2xpY3lJbmZvLCAqdHBMaW1BZG1pdFBvbGljeUluZm87CisKKwordHlwZWRlZiBlbnVtIGVMaW1Xc2NFbnJvbGxTdGF0ZQoreworICAgIGVMSU1fV1NDX0VOUk9MTF9OT09QLAorICAgIGVMSU1fV1NDX0VOUk9MTF9CRUdJTiwKKyAgICBlTElNX1dTQ19FTlJPTExfSU5fUFJPR1JFU1MsCisgICAgZUxJTV9XU0NfRU5ST0xMX0VORAorICAgIAorfSB0TGltV3NjRW5yb2xsU3RhdGU7CisKKyNkZWZpbmUgV1NDX1BBU1NXRF9JRF9QVVNIX0JVVFRPTiAgICAgICAgICgweDAwMDQpCisKK3R5cGVkZWYgc3RydWN0IHNMaW1Xc2NJZUluZm8KK3sKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgYXBTZXR1cExvY2tlZDsKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgc2VsZWN0ZWRSZWdpc3RyYXI7CisgICAgdEFOSV9VMTYgICAgICAgICAgIHNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczsKKyAgICB0TGltV3NjRW5yb2xsU3RhdGUgd3NjRW5yb2xsbWVudFN0YXRlOworICAgIHRMaW1Xc2NFbnJvbGxTdGF0ZSBwcm9iZVJlc3BXc2NFbnJvbGxtZW50U3RhdGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgIHJlcVR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgIHJlc3BUeXBlOworfSB0TGltV3NjSWVJbmZvLCAqdHBMaW1Xc2NJZUluZm87CisKKy8vIG1heGltdW0gbnVtYmVyIG9mIHRzcGVjJ3Mgc3VwcG9ydGVkCisjZGVmaW5lIExJTV9OVU1fVFNQRUNfTUFYICAgICAgNAorCisKKy8vc3RydWN0dXJlIHRvIGhvbGQgYWxsIDExaCBzcGVjaWZpYyBkYXRhCit0eXBlZGVmIHN0cnVjdCBzTGltU3BlY01nbXRJbmZvCit7CisgICAgdExpbVF1aWV0U3RhdGVzICAgIHF1aWV0U3RhdGU7CisgICAgdEFOSV9VMzIgICAgICAgICAgIHF1aWV0Q291bnQ7CisgICAgdEFOSV9VMzIgICAgICAgICAgIHF1aWV0RHVyYXRpb247ICAgIC8qIFRoaXMgaXMgaW4gdW5pdHMgb2Ygc3lzdGVtIFRJQ0tTICovCisgICAgdEFOSV9VMzIgICAgICAgICAgIHF1aWV0RHVyYXRpb25fVFU7IC8qIFRoaXMgaXMgaW4gdW5pdHMgb2YgVFUsIGZvciBvdmVyIHRoZSBhaXIgdHJhbnNtaXNzaW9uICovCisgICAgdEFOSV9VMzIgICAgICAgICAgIHF1aWV0VGltZW91dFZhbHVlOyAvKiBBZnRlciB0aGlzIHRpbWVvdXQsIGFjdHVhbCBxdWlldCBzdGFydHMgKi8KKyAgICB0QU5JX0JPT0xFQU4gICAgICAgZlF1aWV0RW5hYmxlZDsgICAgLyogVXNlZCBvbiBBUCwgaWYgcXVpZXQgaXMgZW5hYmxlZCBkdXJpbmcgbGVhcm5pbmcgKi8KKworICAgIHRMaW1Eb3QxMWhDaGFuU3dTdGF0ZXMgZG90MTFoQ2hhblN3U3RhdGU7CisgICAgICAgIAorICAgIHRBTklfQk9PTEVBTiAgICAgICBmUmFkYXJEZXRDdXJPcGVyQ2hhbjsgLyogUmFkYXIgZGV0ZWN0ZWQgaW4gY3VyIG9wZXIgY2hhbiBvbiBBUCAqLworICAgIHRBTklfQk9PTEVBTiAgICAgICBmUmFkYXJJbnRyQ29uZmlndXJlZDsgLyogV2hldGhlciByYWRhciBpbnRlcnJ1cHQgaGFzIGJlZW4gY29uZmlndXJlZCAqLworfXRMaW1TcGVjTWdtdEluZm8sICp0cExpbVNwZWNNZ210SW5mbzsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvbGltU2Vzc2lvbi5oIGIvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvbGltU2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MTI4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9saW1TZXNzaW9uLmgKQEAgLTAsMCArMSw0MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fTElNX1NFU1NJT05fSCApCisjZGVmaW5lIF9fTElNX1NFU1NJT05fSAorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBsaW1TZXNzaW9uLmgKKyAgCisgIFxicmllZiBwcm90b3R5cGUgZm9yIGxpbSBTZXNzaW9uIHJlbGF0ZWQgQVBJcworCisgIFxhdXRob3IgU3VuaXQgQmhhdGlhCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNkZWZpbmUgTlVNX1dFUF9LRVlTIDQKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgICAgdFNpck1hY0JlYWNvbkludGVydmFsICAgYmVhY29uSW50ZXJ2YWw7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgZlNob3J0UHJlYW1ibGU7ICAgCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgbGxhQ29leGlzdDsgICAgCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgbGxiQ29leGlzdDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBsbGdDb2V4aXN0OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGh0MjBDb2V4aXN0OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGxsbk5vbkdGQ29leGlzdDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBmUklGU01vZGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGdIVE9ic3NNb2RlOyAKK310QmVhY29uUGFyYW1zLCAqdHBCZWFjb25QYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHNQRVNlc3Npb24gICAgICAgICAgIC8vIEFkZGVkIHRvIFN1cHBvcnQgQlQtQU1QCit7CisgICAgLyogVG8gY2hlY2sgc2Vzc2lvbiB0YWJsZSBpcyBpbiB1c2Ugb3IgZnJlZSovCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgYXZhaWxhYmxlOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHBlU2Vzc2lvbklkOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNtZVNlc3Npb25JZDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkOworCisgICAgLy9JbiBBUCByb2xlOiBCU1NJRCBhbmQgc2VsZk1hY0FkZHIgd2lsbCBiZSB0aGUgc2FtZS4KKyAgICAvL0luIFNUQSByb2xlOiB0aGV5IHdpbGwgYmUgZGlmZmVyZW50CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgYnNzSWQ7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgc2VsZk1hY0FkZHI7CisgICAgdFNpck1hY1NTaWQgICAgICAgICAgICAgc3NJZDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBic3NJZHg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgdmFsaWQ7CisgICAgdExpbU1sbVN0YXRlcyAgICAgICAgICAgbGltTWxtU3RhdGU7ICAgICAgICAgICAgLy9NTE0gU3RhdGUKKyAgICB0TGltTWxtU3RhdGVzICAgICAgICAgICBsaW1QcmV2TWxtU3RhdGU7ICAgICAgICAvL1ByZXZpb3VzIE1MTSBTdGF0ZQorICAgIHRMaW1TbWVTdGF0ZXMgICAgICAgICAgIGxpbVNtZVN0YXRlOyAgICAgICAgICAgIC8vU01FIFN0YXRlCisgICAgdExpbVNtZVN0YXRlcyAgICAgICAgICAgbGltUHJldlNtZVN0YXRlOyAgICAgICAgLy9QcmV2aW91cyBTTUUgU3RhdGUKKyAgICB0TGltU3lzdGVtUm9sZSAgICAgICAgICBsaW1TeXN0ZW1Sb2xlOworICAgIHRTaXJCc3NUeXBlICAgICAgICAgICAgIGJzc1R5cGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgb3Blck1vZGU7ICAgICAgICAgICAgICAgLy8gQVAgLSAwOyBTVEEgLSAxIDsgCisgICAgdFNpck53VHlwZSAgICAgICAgICAgICAgbndUeXBlOworICAgIHRwU2lyU21lU3RhcnRCc3NSZXEgICAgIHBMaW1TdGFydEJzc1JlcTsgICAgICAgIC8vaGFuZGxlIHRvIHNtZXN0YXJ0IGJzcyByZXEKKyAgICB0cFNpclNtZUpvaW5SZXEgICAgICAgICBwTGltSm9pblJlcTsgICAgICAgICAgICAvLyBoYW5kbGUgdG8gc21lIGpvaW4gcmVxCisgICAgdHBTaXJTbWVSZWFzc29jUmVxICAgICAgcExpbVJlQXNzb2NSZXE7ICAgICAgICAgLy9oYW5kbGUgdG8gc21lIHJlYXNzb2MgcmVxCisgICAgdHBMaW1NbG1Kb2luUmVxICAgICAgICAgcExpbU1sbUpvaW5SZXE7ICAgICAgICAgLy9oYW5kbGUgdG8gTUxNIGpvaW4gUmVxCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBMaW1NbG1SZWFzc29jUmVxOyAgICAgIC8vaGFuZGxlIHRvIE1MTSByZWFzc29jIFJlcQorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGNoYW5uZWxDaGFuZ2VSZWFzb25Db2RlOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGRvdDExbW9kZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBodENhcGFiYWxpdHk7CisgICAgdFNpclJGQmFuZCAgICAgICAgICAgICAgbGltUkZCYW5kOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGxpbUlic3NBY3RpdmU7ICAgICAgICAgIC8vVE8gU1VQUE9SVCBDT05DVVJSRU5DWQorCisgICAgLyogVGhlc2UgZ2xvYmFsIHZhcmliYWxlcyBtb3ZlZCB0byBzZXNzaW9uIFRhYmxlIHRvIHN1cHBvcnQgQlQtQU1QIDogT2N0IDl0aCByZXZpZXcgKi8KKyAgICB0QW5pQXV0aFR5cGUgICAgICAgICAgICBsaW1DdXJyZW50QXV0aFR5cGU7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGltQ3VycmVudEJzc0NhcHM7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgbGltQ3VycmVudEJzc1Fvc0NhcHM7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGltQ3VycmVudEJzc1Byb3BDYXA7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgbGltU2VudENhcHNDaGFuZ2VOdGY7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgbGltQ3VycmVudFRpdGFuSHRDYXBzOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGxpbUFJRDsKKworICAgIC8qIFBhcmFtZXRlcnMgIEZvciBSZWFzc29jaWF0aW9uICovCisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgbGltUmVBc3NvY2Jzc0lkOworICAgIHRTaXJNYWNDaGFuTnVtICAgICAgICAgIGxpbVJlYXNzb2NDaGFubmVsSWQ7CisgICAgdFNpck1hY1NTaWQgICAgICAgICAgICAgbGltUmVhc3NvY1NTSUQ7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGltUmVhc3NvY0Jzc0NhcHM7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgbGltUmVhc3NvY0Jzc1Fvc0NhcHM7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbGltUmVhc3NvY0Jzc1Byb3BDYXA7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgbGltUmVhc3NvY1RpdGFuSHRDYXBzOworCisgICAgLy8gQXNzb2Mgb3IgUmVBc3NvYyBSZXNwb25zZSBEYXRhL0ZyYW1lCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqbGltQXNzb2NSZXNwb25zZURhdGE7CisgICAgCisKKworICAgIC8qKiBCU1MgVGFibGUgcGFyYW1ldGVycyAqKi8KKworCisgICAgLyoKKyAgICAqIHN0YUlkOiAgU3RhcnQgQlNTOiB0aGlzIGlzIHRoZSAgU3RhIElkIGZvciB0aGUgQlNTLgorICAgICAgICAgICAgICAgICBKb2luOiB0aGlzIGlzIHRoZSBzZWxmU3RhSWQKKyAgICAgIEluIGJvdGggY2FzZXMgYWJvdmUsIHRoZSBwZWVyIFNUQSBJRCB3bGwgYmUgc3RvcmVkIGluIGRwaCBoYXNoIHRhYmxlLgorICAgICovCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgc3RhSWQ7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgc3RhdHlwZUZvckJzczsgICAgICAgICAgLy90byBrbm93IHNlc3Npb24gaXMgZm9yIFBFRVIgb3IgU0VMRgorICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNob3J0U2xvdFRpbWVTdXBwb3J0ZWQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgZHRpbVBlcmlvZDsKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICByYXRlU2V0OworICAgIHRTaXJNYWNSYXRlU2V0ICAgICAgIGV4dFJhdGVTZXQ7CisgICAgdFNpck1hY0hUT3BlcmF0aW5nTW9kZSAgaHRPcGVyTW9kZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBjdXJyZW50T3BlckNoYW5uZWw7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgY3VycmVudFJlcUNoYW5uZWw7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgTGltUnhlZEJlYWNvbkNudER1cmluZ0hCOworICAgIAorICAgIC8vVGltZSBzdGFtcCBvZiB0aGUgbGFzdCBiZWFjb24gcmVjZWl2ZWQgZnJvbSB0aGUgQlNTIHRvIHdoaWNoIFNUQSBpcyBjb25uZWN0ZWQuCisgICAgdEFOSV9VNjQgICAgICAgICAgICAgICAgbGFzdEJlYWNvblRpbWVTdGFtcDsKKyAgICAvL1JYIEJlYWNvbiBjb3VudCBmb3IgdGhlIGN1cnJlbnQgQlNTIHRvIHdoaWNoIFNUQSBpcyBjb25uZWN0ZWQuCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgY3VycmVudEJzc0JlYWNvbkNudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBsYXN0QmVhY29uRHRpbUNvdW50OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGxhc3RCZWFjb25EdGltUGVyaW9kOworCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgYmNuTGVuOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICpiZWFjb247ICAgICAgICAgICAgICAgIC8vVXNlZCB0byBzdG9yZSBsYXN0IGJlYWNvbiAvIHByb2JlIHJlc3BvbnNlIGJlZm9yZSBhc3NvYy4KKworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIGFzc29jUmVxTGVuOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICphc3NvY1JlcTsgICAgICAgICAgICAgIC8vVXNlZCB0byBzdG9yZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lIHNlbnQgb3V0IHdoaWxlIGFzc29jaWF0aW5nLgorCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgYXNzb2NSc3BMZW47CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgKmFzc29jUnNwOyAgICAgICAgICAgICAgLy9Vc2VkIHRvIHN0b3JlIGFzc29jaWF0aW9uIHJlc3BvbnNlIHJlY2VpdmVkIHdoaWxlIGFzc29jaWF0aW5nCisgICAgdEFuaVNpckRwaCAgICAgICAgICAgICAgZHBoOworICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICpwYXJzZWRBc3NvY1JlcTsgICAgICAgIC8vVXNlZCB0byBzdG9yZSBwYXJzZWQgYXNzb2MgcmVxIGZyb20gdmFyaW91cyByZXF1ZXN0aW5nIHN0YXRpb24KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAgICAKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBSSUNEYXRhTGVuOyAgICAgICAgICAgICAvL1VzZWQgdG8gc3RvcmUgdGhlIFJpYyBkYXRhIHJlY2VpdmVkIGluIHRoZSBhc3NvYyByZXNwb25zZQorICAgIHRBTklfVTggICAgICAgICAgICAgICAgICpyaWNEYXRhOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWCAgICAKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICB0c3BlY0xlbjsgICAgICAgICAgICAgICAvL1VzZWQgdG8gc3RvcmUgdGhlIFRTUEVDIElFcyByZWNlaXZlZCBpbiB0aGUgYXNzb2MgcmVzcG9uc2UKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAqdHNwZWNJZXM7CisjZW5kaWYKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBlbmNyeXB0VHlwZTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgICAgICBiVGtpcENudHJNZWFzQWN0aXZlOyAgICAvLyBVc2VkIHRvIGtlZXAgcmVjb3JkIG9mIFRLSVAgY291bnRlciBtZWFzdXJlcyBzdGFydC9zdG9wCisKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBnTGltUHJvdGVjdGlvbkNvbnRyb2w7ICAvL3VzZWQgZm9yIDExbiBwcm90ZWN0aW9uCisKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBnSFROb25HRkRldmljZXNQcmVzZW50OworCisgICAgLy9wcm90ZWN0aW9uIHJlbGF0ZWQgY29uZmlnIGNhY2hlCisgICAgdENmZ1Byb3RlY3Rpb24gICAgICAgICAgY2ZnUHJvdGVjdGlvbjsKKworICAgIC8vIE51bWJlciBvZiBsZWdhY3kgU1RBcyBhc3NvY2lhdGVkCisgICAgdExpbVByb3RTdGFQYXJhbXMgICAgICAgICAgZ0xpbTExYlBhcmFtczsKKworICAgIC8vIE51bWJlciBvZiAxMUEgU1RBcyBhc3NvY2lhdGVkCisgICAgdExpbVByb3RTdGFQYXJhbXMgICAgICAgICAgZ0xpbTExYVBhcmFtczsKKworICAgIC8vIE51bWJlciBvZiBub24taHQgbm9uLWxlZ2FjeSBTVEFzIGFzc29jaWF0ZWQKKyAgICB0TGltUHJvdFN0YVBhcmFtcyAgICAgICAgICBnTGltMTFnUGFyYW1zOworCisgICAgLy9OdW1iZXIgb2Ygbm9uR2YgU1RBIGFzc29jaWF0ZWQKKyAgICB0TGltUHJvdFN0YVBhcmFtcyAgICAgICBnTGltTm9uR2ZQYXJhbXM7CisKKyAgICAvL051bWJlciBvZiBIVCAyMCBTVEFzIGFzc29jaWF0ZWQKKyAgICB0TGltUHJvdFN0YVBhcmFtcyAgICAgICAgICBnTGltSHQyMFBhcmFtczsKKworICAgIC8vTnVtYmVyIG9mIExzaWcgVHhvcCBub3Qgc3VwcG9ydGVkIFNUQXMgYXNzb2NpYXRlZAorICAgIHRMaW1Qcm90U3RhUGFyYW1zICAgICAgICAgIGdMaW1Mc2lnVHhvcFBhcmFtczsKKworICAgIC8vIE51bWJlciBvZiBTVEFzIHRoYXQgZG8gbm90IHN1cHBvcnQgc2hvcnQgcHJlYW1ibGUKKyAgICB0TGltTm9TaG9ydFBhcmFtcyAgICAgICAgIGdMaW1Ob1Nob3J0UGFyYW1zOworCisgICAgLy8gTnVtYmVyIG9mIFNUQXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBzaG9ydCBzbG90IHRpbWUKKyAgICB0TGltTm9TaG9ydFNsb3RQYXJhbXMgICBnTGltTm9TaG9ydFNsb3RQYXJhbXM7CisKKworICAgIC8vIE9MQkMgcGFyYW1ldGVycworICAgIHRMaW1Qcm90U3RhUGFyYW1zICBnTGltT2xiY1BhcmFtczsKKworICAgIC8vIE9MQkMgcGFyYW1ldGVycworICAgIHRMaW1Qcm90U3RhUGFyYW1zICBnTGltT3ZlcmxhcDExZ1BhcmFtczsKKworICAgIHRMaW1Qcm90U3RhUGFyYW1zICBnTGltT3ZlcmxhcDExYVBhcmFtczsKKyAgICB0TGltUHJvdFN0YVBhcmFtcyBnTGltT3ZlcmxhcEh0MjBQYXJhbXM7CisgICAgdExpbVByb3RTdGFQYXJhbXMgZ0xpbU92ZXJsYXBOb25HZlBhcmFtczsKKworICAgIC8vY2FjaGUgZm9yIGVhY2ggb3ZlcmxhcAorICAgIHRDYWNoZVBhcmFtcyAgICAgcHJvdFN0YUNhY2hlW0xJTV9QUk9UX1NUQV9DQUNIRV9TSVpFXTsKKworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHByaXZhY3k7CisgICAgdEFuaUF1dGhUeXBlICAgICAgICAgICAgYXV0aFR5cGU7CisgICAgdFNpcktleU1hdGVyaWFsICAgICAgICAgV0VQS2V5TWF0ZXJpYWxbTlVNX1dFUF9LRVlTXTsKKworICAgIHREb3QxMWZJRVJTTiAgICAgICAgICAgIGdTdGFydEJzc1JTTkllOworICAgIHREb3QxMWZJRVdQQSAgICAgICAgICAgIGdTdGFydEJzc1dQQUllOworICAgIHRTaXJBUFdQU0lFcyAgICAgICAgICAgIEFQV1BTSUVzOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGFwVWFwc2RFbmFibGU7CisgICAgdFNpcldQU1BCQ1Nlc3Npb24gICAgICAgKnBBUFdQU1BCQ1Nlc3Npb247CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgRGVmUHJvYmVSc3BJZUJpdG1hcFs4XTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBwcm94eVByb2JlUnNwRW47CisgICAgdERvdDExZlByb2JlUmVzcG9uc2UgICAgcHJvYmVSZXNwRnJhbWU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc3NpZEhpZGRlbjsKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgICAgICBmd2RXUFNQQkNQcm9iZVJlcTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICB3cHNfc3RhdGU7CisjZW5kaWYKKworICAgIHRBTklfVTggICAgICAgICAgICBsaW1Rb3NFbmFibGVkOjE7IC8vMTFFCisgICAgdEFOSV9VOCAgICAgICAgICAgIGxpbVdtZUVuYWJsZWQ6MTsgLy9XTUUKKyAgICB0QU5JX1U4ICAgICAgICAgICAgbGltV3NtRW5hYmxlZDoxOyAvL1dTTQorICAgIHRBTklfVTggICAgICAgICAgICBsaW1IY2ZFbmFibGVkOjE7CisgICAgdEFOSV9VOCAgICAgICAgICAgIGxpbTExZEVuYWJsZWQ6MTsKKworICAgIHRBTklfVTMyICAgICAgICAgICBsaW0xMWhFbmFibGU7CisKKyAgICB0UG93ZXJkQm0gIG1heFR4UG93ZXI7ICAgLy9NSU4gKFJlZ3VsYXRvcnkgYW5kIGxvY2FsIHBvd2VyIGNvbnN0cmFpbnQpCisgICAgdFZPU19DT05fTU9ERSAgICAgIHBlUGVyc29uYTsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICB0UG93ZXJkQm0gIHR4TWdtdFBvd2VyOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIHRBbmlCb29sICAgICAgICAgICAgaXMxMVJjb25uZWN0aW9uOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgdEFuaUJvb2wgICAgICAgICAgICBpc0NDWGNvbm5lY3Rpb247CisgICAgdENjeFBFQ29udGV4dCAgICAgICBjY3hDb250ZXh0OworI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiB8fCBkZWZpbmVkIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICB0QW5pQm9vbCAgICAgICAgICAgIGlzRmFzdFRyYW5zaXRpb25FbmFibGVkOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIHRTaXJOb0FQYXJhbSBwMnBOb0E7CisgICAgdFNpclAyUE5vYUF0dHIgcDJwR29Qc1VwZGF0ZTsKKyNlbmRpZgorCisgICAgLyogRURDQSBRb1MgcGFyYW1ldGVycworICAgICAqIGdMaW1FZGNhUGFyYW1zIC0gVGhlc2UgRURDQSBwYXJhbWV0ZXJzIGFyZSB1c2VkIGxvY2FsbHkgb24gQVAgb3IgU1RBLgorICAgICAqIElmIFNUQSwgdGhlbiB0aGVzZSBhcmUgdmFsdWVzIHRha2VuIGZyb20gdGhlIEFzc29jIFJzcCB3aGVuIGFzc29jaWF0aW5nLAorICAgICAqIG9yIEJlYWNvbnMvUHJvYmUgUmVzcG9uc2UgYWZ0ZXIgYXNzb2NpYXRpb24uICBJZiBBUCwgdGhlbiB0aGVzZSBhcmUgCisgICAgICogdmFsdWVzIG9yaWdpbmFsbHkgc2V0IGxvY2FsbHkgb24gQVAuIAorICAgICAqCisgICAgICogZ0xpbUVkY2FQYXJhbXNCQyAtIFRoZXNlIEVEQ0EgcGFyYW1ldGVycyBhcmUgdXNlIGJ5IEFQIHRvIGJyb2FkY2FzdCAKKyAgICAgKiB0byBvdGhlciBTVEFUSU9OcyBpbiB0aGUgQlNTLiAKKyAgICAgKgorICAgICAqIGdMaW1FZGNhUGFyYW1zQWN0aXZlOiBUaGVzZSBFRENBIHBhcmFtZXRlcnMgYXJlIHdoYXQncyBhY3RpdmVseSBiZWluZworICAgICAqIHVzZWQgb24gc3RhdGlvbi4gU3BlY2lmaWMgQUMgdmFsdWVzIG1heSBiZSBkb3duZ3JhZGVkIGRlcGVuZGluZyBvbiAKKyAgICAgKiBhZG1pc3Npb24gY29udHJvbCBmb3IgdGhhdCBwYXJ0aWN1bGFyIEFDLiAKKyAgICAgKi8KKyAgICB0U2lyTWFjRWRjYVBhcmFtUmVjb3JkIGdMaW1FZGNhUGFyYW1zW01BWF9OVU1fQUNdOyAgIC8vdXNlZCBsb2NhbGx5IAorICAgIHRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgZ0xpbUVkY2FQYXJhbXNCQ1tNQVhfTlVNX0FDXTsgLy91c2VkIGZvciBicm9hZGNhc3QKKyAgICB0U2lyTWFjRWRjYVBhcmFtUmVjb3JkIGdMaW1FZGNhUGFyYW1zQWN0aXZlW01BWF9OVU1fQUNdOyAKKworICAgIHRBTklfVTggIGdMaW1FZGNhUGFyYW1TZXRDb3VudDsKKworICAgIHRCZWFjb25QYXJhbXMgYmVhY29uUGFyYW1zOworCisgICAgdEFOSV9VOCAgICAgICAgICAgIHNwZWN0cnVtTWd0RW5hYmxlZDsKKworICAgIC8qRmxhZyB0byBUcmFjayBTdGF0dXMvSW5kaWNhdGUgSEJGYWlsdXJlIG9uIHRoaXMgc2Vzc2lvbiAqLworICAgIHRBTklfQk9PTEVBTiBMaW1IQkZhaWx1cmVTdGF0dXM7CisgICAgdEFOSV9VMzIgICAgICAgICAgIGdMaW1QaHlNb2RlOworfXRQRVNlc3Npb24sICp0cFBFU2Vzc2lvbjsKKworI2RlZmluZSBMSU1fTUFYX0FDVElWRV9TRVNTSU9OUyA0CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBwZUNyZWF0ZVNlc3Npb24oKSAtIGNyZWF0ZXMgYSBuZXcgUEUgc2Vzc2lvbiBnaXZlbiB0aGUgQlNTSUQKKworICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNlc3Npb24gY29udGV4dCBhbmQgdGhlIHNlc3Npb24gSUQgaWYgdGhlIHNlc3Npb24gCisgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhc3NlZCBCU1NJRCBpcyBmb3VuZCBpbiB0aGUgUEUgc2Vzc2lvbiB0YWJsZS4KKyAgICAKKyAgXHBhcmFtIHBNYWMgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIGdsb2JhbCBhZGFwdGVyIGNvbnRleHQKKyAgXHBhcmFtIGJzc2lkICAgICAgICAgICAgICAgICAgIC0gQlNTSUQgb2YgdGhlIG5ldyBzZXNzaW9uCisgIFxwYXJhbSBzZXNzaW9uSWQgICAgICAgICAgICAgLXNlc3Npb24gSUQgaXMgcmV0dXJuZWQgaGVyZSwgaWYgc2Vzc2lvbiBpcyBjcmVhdGVkLgorICAKKyAgXHJldHVybiB0cFBFU2Vzc2lvbiAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gY29udGV4dCBvciBOVUxMIGlmIHNlc3Npb24gY2FuIG5vdCBiZSBjcmVhdGVkLgorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0cFBFU2Vzc2lvbiBwZUNyZWF0ZVNlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqYnNzaWQgLCB0QU5JX1U4KiBzZXNzaW9uSWQsIHRBTklfVTE2IG51bVN0YSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgcGVGaW5kU2Vzc2lvbkJ5QnNzaWQoKSAtIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGdpdmVuIHRoZSBCU1NJRC4KKworICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNlc3Npb24gY29udGV4dCBhbmQgdGhlIHNlc3Npb24gSUQgaWYgdGhlIHNlc3Npb24gCisgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEJTU0lEIGlzIGZvdW5kIGluIHRoZSBQRSBzZXNzaW9uIHRhYmxlLgorICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccGFyYW0gYnNzaWQgICAgICAgICAgICAgICAgICAgLSBCU1NJRCBvZiB0aGUgc2Vzc2lvbgorICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC1zZXNzaW9uIElEIGlzIHJldHVybmVkIGhlcmUsIGlmIHNlc3Npb24gaXMgZm91bmQuIAorICAKKyAgXHJldHVybiB0cFBFU2Vzc2lvbiAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gY29udGV4dCBvciBOVUxMIGlmIHNlc3Npb24gaXMgbm90IGZvdW5kLgorICAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RwUEVTZXNzaW9uIHBlRmluZFNlc3Npb25CeUJzc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsICB0QU5JX1U4KiAgYnNzaWQsICAgIHRBTklfVTgqIHNlc3Npb25JZCk7CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBwZUZpbmRTZXNzaW9uQnlQZWVyU3RhKCkgLSBsb29rcyB1cCB0aGUgUEUgc2Vzc2lvbiBnaXZlbiB0aGUgUGVlciBTdGF0aW9uIEFkZHJlc3MuCisKKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgYW5kIHRoZSBzZXNzaW9uIElEIGlmIHRoZSBzZXNzaW9uIAorICBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIGZvdW5kIGluIHRoZSBQRSBzZXNzaW9uIHRhYmxlLgorICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccGFyYW0gc2EgICAgICAgICAgICAgICAgICAgLSBQZWVyIFNUQSBBZGRyZXNzIG9mIHRoZSBzZXNzaW9uCisgIFxwYXJhbSBzZXNzaW9uSWQgICAgICAgICAgICAgLXNlc3Npb24gSUQgaXMgcmV0dXJuZWQgaGVyZSwgaWYgc2Vzc2lvbiBpcyBmb3VuZC4gCisgIAorICBccmV0dXJuIHRwUEVTZXNzaW9uICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgc2Vzc2lvbiBjb250ZXh0IG9yIE5VTEwgaWYgc2Vzc2lvbiBpcyBub3QgZm91bmQuCisgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHBQRVNlc3Npb24gcGVGaW5kU2Vzc2lvbkJ5UGVlclN0YSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4KiAgc2EsIHRBTklfVTgqIHNlc3Npb25JZCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHBlRmluZFNlc3Npb25CeVNlc3Npb25JZCgpIC0gbG9va3MgdXAgdGhlIFBFIHNlc3Npb24gZ2l2ZW4gdGhlIHNlc3Npb24gSUQuCisKKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgIGlmIHRoZSBzZXNzaW9uIAorICBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBzZXNzaW9uIElEIGlzIGZvdW5kIGluIHRoZSBQRSBzZXNzaW9uIHRhYmxlLgorICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC1zZXNzaW9uIElEIGZvciB3aGljaCBzZXNzaW9uIGNvbnRleHQgbmVlZHMgdG8gYmUgbG9va2VkIHVwLgorICAKKyAgXHJldHVybiB0cFBFU2Vzc2lvbiAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gY29udGV4dCBvciBOVUxMIGlmIHNlc3Npb24gaXMgbm90IGZvdW5kLgorICAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyB0cFBFU2Vzc2lvbiBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQodHBBbmlTaXJHbG9iYWwgcE1hYyAsIHRBTklfVTggc2Vzc2lvbklkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgcGVGaW5kU2Vzc2lvbkJ5QnNzaWQoKSAtIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGdpdmVuIHN0YWlkLgorCisgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2Vzc2lvbiBjb250ZXh0IGFuZCB0aGUgc2Vzc2lvbiBJRCBpZiB0aGUgc2Vzc2lvbgorICBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBTdGFJZCBpcyBmb3VuZCBpbiB0aGUgUEUgc2Vzc2lvbiB0YWJsZS4KKyAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgIFxwYXJhbSBzdGFpZCAgICAgICAgICAgICAgICAgLSBTdGFJZCBvZiB0aGUgc2Vzc2lvbgorICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC0gc2Vzc2lvbiBJRCBpcyByZXR1cm5lZCBoZXJlLCBpZiBzZXNzaW9uIGlzIGZvdW5kLgorCisgIFxyZXR1cm4gdHBQRVNlc3Npb24gICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBzZXNzaW9uIGNvbnRleHQgb3IgTlVMTCBpZiBzZXNzaW9uIGlzIG5vdCBmb3VuZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIHRwUEVTZXNzaW9uIHBlRmluZFNlc3Npb25CeVN0YUlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsICB0QU5JX1U4ICBzdGFpZCwgICAgdEFOSV9VOCogc2Vzc2lvbklkKTsKKyAKKworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgcGVEZWxldGVTZXNzaW9uKCkgLSBkZWxldGVzIHRoZSBQRSBzZXNzaW9uIGdpdmVuIHRoZSBzZXNzaW9uIElELgorCisgICAgCisgIFxwYXJhbSBwTWFjICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgIFxwYXJhbSBzZXNzaW9uSWQgICAgICAgICAgICAgLXNlc3Npb24gSUQgb2YgdGhlIHNlc3Npb24gd2hpY2ggbmVlZHMgdG8gYmUgZGVsZXRlZC4KKyAgICAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgcGVEZWxldGVTZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHBlRGVsZXRlU2Vzc2lvbigpIC0gUmV0dXJucyB0aGUgU01FIHNlc3Npb24gSUQgYW5kIFRyYW5zYWN0aW9uIElEIC4KKworICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC1zZXNzaW9uIElEIG9mIHRoZSBzZXNzaW9uIHdoaWNoIG5lZWRzIHRvIGJlIGRlbGV0ZWQuCisgICAgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworI2VuZGlmIC8vI2lmICFkZWZpbmVkKCBfX0xJTV9TRVNTSU9OX0ggKQorCisKKworCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL2xpbVRyYWNlLmggYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9saW1UcmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYzJhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9saW1UcmFjZS5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFxmaWxlICBsaW1UcmFjZS5oCisKKyAgXGJyaWVmIGRlZmluaXRpb24gZm9yIHRyYWNlIHJlbGF0ZWQgQVBJcworCisgIFxhdXRob3IgU3VuaXQgQmhhdGlhCisKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworI2lmbmRlZiBfX0xJTV9UUkFDRV9ICisjZGVmaW5lIF9fTElNX1RSQUNFX0gKKworI2luY2x1ZGUgImxpbUdsb2JhbC5oIgorI2luY2x1ZGUgIm1hY1RyYWNlLmgiCisjaWZkZWYgTElNX1RSQUNFX1JFQ09SRAorCisjZGVmaW5lIENBU0VfUkVUVVJOX1NUUklORyggc3RyICkgICAgICAgICAgIFwKKyAgICBjYXNlICggKCBzdHIgKSApOiByZXR1cm4oICNzdHIgKTsgYnJlYWsgXAorCisKKyNkZWZpbmUgTElNX1RSQUNFX0dFVF9TU04oZGF0YSkgICAgKCgoZGF0YSkgPj4gMTYpICYgMHhmZikKKyNkZWZpbmUgTElNX1RSQUNFX0dFVF9TVUJUWVBFKGRhdGEpICAgIChkYXRhICYgMHhmZikKKyNkZWZpbmUgTElNX1RSQUNFX0dFVF9ERUZFUlJFRChkYXRhKSAoZGF0YSAmIDB4ODAwMDAwMDApCisjZGVmaW5lIExJTV9UUkFDRV9HRVRfREVGUkRfT1JfRFJPUFBFRChkYXRhKSAoZGF0YSAmIDB4YzAwMDAwMDApCisKKyNkZWZpbmUgTElNX01TR19QUk9DRVNTRUQgMAorI2RlZmluZSBMSU1fTVNHX0RFRkVSUkVEICAgMQorI2RlZmluZSBMSU1fTVNHX0RST1BQRUQgICAgIDIKKworI2RlZmluZSBMSU1fVFJBQ0VfTUFLRV9SWE1HTVQodHlwZSwgc3NuKSBcCisgICAgKChzc24gPDwgMTYpIHwgKHR5cGUpICkKKyNkZWZpbmUgTElNX1RSQUNFX01BS0VfUlhNU0cobXNnLCBhY3Rpb24pIFwKKyAgICAoKG1zZykgfCAoYWN0aW9uIDw8IDMwKSApCisKKworCisKK3R5cGVkZWYgZW51bSB7CisgICAgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsCisgICAgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsCisgICAgVFJBQ0VfQ09ERV9UWF9NR01ULAorICAgIFRSQUNFX0NPREVfUlhfTUdNVCwKKyAgICBUUkFDRV9DT0RFX1JYX01HTVRfVFNGLAorICAgIFRSQUNFX0NPREVfVFhfQ09NUExFVEUsCisgICAgVFJBQ0VfQ09ERV9UWF9TTUVfTVNHLAorICAgIFRSQUNFX0NPREVfUlhfU01FX01TRywKKyAgICBUUkFDRV9DT0RFX1RYX0hBTF9NU0csCisgICAgVFJBQ0VfQ09ERV9SWF9IQUxfTVNHLAorICAgIFRSQUNFX0NPREVfVFhfTElNX01TRywKKyAgICBUUkFDRV9DT0RFX1JYX0xJTV9NU0csCisgICAgVFJBQ0VfQ09ERV9UWF9DRkdfTVNHLAorICAgIFRSQUNFX0NPREVfUlhfQ0ZHX01TRywKKyAgICBUUkFDRV9DT0RFX1JYX01HTVRfRFJPUCwKKworICAgIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsCisgICAgVFJBQ0VfQ09ERV9USU1FUl9ERUFDVElWQVRFLAorfTsKKworCisKKworCisKK3ZvaWQgbGltVHJhY2VJbml0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBsaW1UcmFjZVJlc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBsaW1UcmFjZVVwZGF0ZU1nbXRTdGF0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc3VidHlwZSk7Cit2b2lkIGxpbVRyYWNlRHVtcE1nbXRTdGF0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc3VidHlwZSk7Cit0QU5JX1U4KiBsaW1UcmFjZUdldE1sbVN0YXRlU3RyaW5nKCB0QU5JX1UzMiBtbG1TdGF0ZSApOwordEFOSV9VOCogbGltVHJhY2VHZXRTbWVTdGF0ZVN0cmluZyggdEFOSV9VMzIgc21lU3RhdGUgKTsKK3ZvaWQgbGltVHJhY2VEdW1wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwVHJhY2VSZWNvcmQgcFJlY29yZCwgdEFOSV9VMTYgcmVjSW5kZXgpOwordm9pZCBtYWNUcmFjZU1zZ1R4KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc2Vzc2lvbiwgdEFOSV9VMzIgZGF0YSk7Cit2b2lkIG1hY1RyYWNlTXNnUngodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBzZXNzaW9uLCB0QU5JX1UzMiBkYXRhKTsKKwordm9pZCBtYWNUcmFjZU1zZ1J4TmV3KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggbW9kdWxlLCB0QU5JX1U4IHNlc3Npb24sIHRBTklfVTMyIGRhdGEpOwordm9pZCBtYWNUcmFjZU1zZ1R4TmV3KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggbW9kdWxlLCB0QU5JX1U4IHNlc3Npb24sIHRBTklfVTMyIGRhdGEpOworCisKKworCisKKyNkZWZpbmUgTVRSQUNFKHApIHAKKworI2Vsc2UKKyNkZWZpbmUgTVRSQUNFKHApIHsgIH0KKworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9wbW1BcGkuaCBiL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL3BtbUFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTk5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9wbW1BcGkuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaWZuZGVmIF9fUE1NX0FQSV9IX18KKyNkZWZpbmUgX19QTU1fQVBJX0hfXworCisjaW5jbHVkZSAic2lyQ29tbW9uLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAiaGFsTXNnQXBpLmgiCisKKworLy8vIEluaXRpYWxpemUgUE1NCitleHRlcm4gdFNpclJldFN0YXR1cyBwbW1Jbml0aWFsaXplKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvLy8gUG9zdCBhIG1lc3NhZ2UgdG8gUE1NIG1vZHVsZQorZXh0ZXJuIHRTaXJSZXRTdGF0dXMgcG1tUG9zdE1lc3NhZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpOworCisvLy8gUmVzZXQgUE1NIGJlYWNvbiBtb2RlIHBvd2VyIHNhdmUgc3RhdGlzdGljcworZXh0ZXJuIHZvaWQgcG1tUmVzZXRTdGF0cyh2b2lkICpwdk1hYyk7CisKKy8vLyBQcm9jZXNzIHRoZSBuZXh0IFBNIG1lc3NhZ2UKK2V4dGVybiB2b2lkIHBtbVByb2Nlc3NNZXNzYWdlKHRwQW5pU2lyR2xvYmFsLCB0cFNpck1zZ1EpOworCisvLy8gUHJvY2VzcyB0aGUgUE0gbWVzc2FnZSBxdWV1ZQorZXh0ZXJuIHZvaWQgcG1tUHJvY2Vzc01lc3NhZ2VRdWV1ZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworZXh0ZXJuIHZvaWQgcG1tUHJvY2Vzc1BTUG9sbCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqKTsKK2V4dGVybiB2b2lkIHBtbVVwZGF0ZVBTUG9sbFN0YXRlKHRwQW5pU2lyR2xvYmFsKTsKK2V4dGVybiB2b2lkIHBtbVByb2Nlc3NSeEFjdGl2aXR5KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdEFOSV9VOCk7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCitleHRlcm4gdm9pZCBwbW1HZW5lcmF0ZVRJTSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqKiwgdEFOSV9VMTYgKiwgdEFOSV9VOCk7CisjZWxzZQorZXh0ZXJuIHZvaWQgcG1tR2VuZXJhdGVUSU0odHBBbmlTaXJHbG9iYWwsIHRBTklfVTggKiosIHRBTklfVTE2ICopOworI2VuZGlmCisKKwordm9pZCBwbW1VcGRhdGVUSU0odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBCZWFjb25HZW5QYXJhbXMgcEJlYWNvbkdlblBhcmFtcyk7CisKKy8vLyBVcGRhdGUgdGhlIFBNIG1vZGUKK2V4dGVybiB2b2lkIHBtbVVwZGF0ZVBNTW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBzdGFJZCwgdEFOSV9VOCBwbU1vZGUpOworCisvLy8gVXBkYXRlIFBvd2VyIE1vZGUKK2V4dGVybiB2b2lkIHBtbVVwZGF0ZVBvbGxhYmxlUE1Nb2RlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdEFOSV9VOCwgdEFOSV9VMTYpOworZXh0ZXJuIHZvaWQgcG1tVXBkYXRlTm9uUG9sbGFibGVQTU1vZGUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTE2LCB0QU5JX1U4LCB0QU5JX1UxNik7CisKKy8qKiBNb25pdG9yIHRoZSBTVEEgaW4gUFMqLwordm9pZCBwbW1IYW5kbGVUaW1CYXNlZERpc2Fzc29jaWF0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvL2dvIGludG8gc2xlZXAgc3RhdGUKK3ZvaWQgcG1tSW5pdEJtcHNQd3JTYXZlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordFNpclJldFN0YXR1cyAgcG1tU2VuZEluaXRQb3dlclNhdmVNc2codHBBbmlTaXJHbG9iYWwgcE1hYyx0cFBFU2Vzc2lvbik7Cit2b2lkIHBtbUluaXRCbXBzUmVzcG9uc2VIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgcnNwU3RhdHVzKTsKK3RTaXJSZXRTdGF0dXMgIHBtbVNlbmRDaGFuZ2VQb3dlclNhdmVNc2codHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit0U2lyUmV0U3RhdHVzIHBtbVNlbmRTbGVlcEluZGljYXRpb25Ub0hhbCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworLy9nbyBpbnRvIHdha2V1cCBzdGF0ZQordm9pZCBwbW1FeGl0Qm1wc1JlcXVlc3RIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRXhpdEJtcHNJbmZvIHBFeGl0Qm1wc0luZm8pOwordm9pZCBwbW1FeGl0Qm1wc1Jlc3BvbnNlSGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKSA7Cit2b2lkIHBtbU1pc3NlZEJlYWNvbkhhbmRsZXIodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8vaGFuZGxsaW5nIGFsbCBVQVBTRCBtZXNzYWdlcwordm9pZCBwbW1FbnRlclVhcHNkUmVxdWVzdEhhbmRsZXIgKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBwbW1FbnRlclVhcHNkUmVzcG9uc2VIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpOwordm9pZCBwbW1FeGl0VWFwc2RSZXF1ZXN0SGFuZGxlciAodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIHBtbUV4aXRVYXBzZFJlc3BvbnNlSGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHJzcFN0YXR1cyk7Cit0U2lyUmV0U3RhdHVzIHBtbVVhcHNkU2VuZENoYW5nZVB3clNhdmVNc2cgKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggbW9kZSk7CisKKy8vIGhhbmRsaW5nIG9mIGFsbCBpZGxlIG1vZGUgcG93ZXIgc2F2ZSBtZXNzYWdlcwordm9pZCBwbW1FbnRlckltcHNSZXF1ZXN0SGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgcG1tRW50ZXJJbXBzUmVzcG9uc2VIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgcnNwU3RhdHVzKTsKK3ZvaWQgcG1tRXhpdEltcHNSZXF1ZXN0SGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgcG1tRXhpdEltcHNSZXNwb25zZUhhbmRsZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgZUhhbFN0YXR1cyByc3BTdGF0dXMpOworCisvLyBoYW5kbGluZyBXT1dMQU4gbWVzc2FnZXMKK3ZvaWQgcG1tU2VuZFdvd2xBZGRCY2FzdFB0cm4odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpOwordm9pZCBwbW1TZW5kV293bERlbEJjYXN0UHRybih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZyk7Cit2b2lkIHBtbUVudGVyV293bFJlcXVlc3RIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKTsKK3RTaXJSZXRTdGF0dXMgcG1tU2VuZFdvd2xFbnRlclJlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJIYWxXb3dsRW50ZXJQYXJhbXMgcEhhbFdvd2xQYXJhbXMpOwordm9pZCBwbW1FbnRlcldvd2xhblJlc3BvbnNlSGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKTsKK3RTaXJSZXRTdGF0dXMgIHBtbVNlbmRFeGl0V293bFJlcSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgcG1tRXhpdFdvd2xhblJlcXVlc3RIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBwbW1FeGl0V293bGFuUmVzcG9uc2VIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgcnNwU3RhdHVzKTsKKworLy8gdXBkYXRlIGlkbGUgbW9kZSBzdGF0aXN0aWNzCit2b2lkIHBtbUltcHNVcGRhdGVQd3JTYXZlU3RhdHModHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIHBtbUltcHNVcGRhdGVXYWtldXBTdGF0cyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3RTaXJSZXRTdGF0dXMgcG1tSW1wc1NlbmRDaGFuZ2VQd3JTYXZlTXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggbW9kZSk7Cit2b2lkIHBtbUltcHNVcGRhdGVTbGVlcEVyclN0YXRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJSZXRTdGF0dXMgcmV0U3RhdHVzKTsKK3ZvaWQgcG1tSW1wc1VwZGF0ZVdha2V1cEVyclN0YXRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJSZXRTdGF0dXMgcmV0U3RhdHVzKTsKK3ZvaWQgcG1tSW1wc1VwZGF0ZUVyclN0YXRlU3RhdHModHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIHBtbUltcHNVcGRhdGVQa3REcm9wU3RhdHModHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKK3ZvaWQgcG1tVXBkYXRlUHdyU2F2ZVN0YXRzKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBwbW1VcGRhdGVXYWtldXBTdGF0cyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgcG1tQm1wc1VwZGF0ZVBrdERyb3BTdGF0cyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgcG1tQm1wc1VwZGF0ZUhhbFJlcUZhaWx1cmVDbnQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIHBtbUJtcHNVcGRhdGVJbml0RmFpbHVyZUNudCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgcG1tQm1wc1VwZGF0ZUludmFsaWRTdGF0ZUNudCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgcG1tQm1wc1VwZGF0ZVBrdERyb3BTdGF0cyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgcG1tQm1wc1VwZGF0ZVJlcUluSW52YWxpZFJvbGVDbnQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIHBtbUJtcHNVcGRhdGVTbGVlcFJlcUZhaWx1cmVDbnQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIHBtbUJtcHNVcGRhdGVXYWtldXBJbmRDbnQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIHBtbUJtcHNVcGRhdGVXYWtldXBSZXFGYWlsdXJlQ250KHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBwbW1SZXNldFBtbVN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBwbW1TZW5kTWVzc2FnZVRvTGltKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIG1zZ0lkKTsKKworLy9Qb3dlciBTYXZlIENGRwordFNpclJldFN0YXR1cyAgcG1tU2VuZFBvd2VyU2F2ZUNmZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclBvd2VyU2F2ZUNmZyBwVXBkYXRlZFB3clNhdmVDZmcpOworCisvL0hhbmRsZSBMb3cgUlNTSSBJbmRpY2F0aW9uCit2b2lkIHBtbUxvd1Jzc2lIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKK3ZvaWQgcG1tRmlsdGVyTWF0Y2hDb3VudFJlc3BvbnNlSGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKTsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECit2b2lkIHBtbUdUS09mZmxvYWRHZXRJbmZvUmVzcG9uc2VIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpOworI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL3BtbUdsb2JhbC5oIGIvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvcG1tR2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4YTM0NAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL3BtbUdsb2JhbC5oCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19QTU1fR0xPQkFMX0hfXworI2RlZmluZSBfX1BNTV9HTE9CQUxfSF9fCisKKyNpbmNsdWRlICJzaXJBcGkuaCIKKwordHlwZWRlZiBzdHJ1Y3Qgc1BtbVN0YVN0YXRlCit7CisgICAgLy8vIFdoZXRoZXIgdGhpcyBTVEEgaXMgaW4gcG93ZXJzYXZlIG9yIG5vdAorICAgIHRBTklfVTggcG93ZXJTYXZlIDogMTsKKyAgICAvLy8gV2hldGhlciB0aGlzIFNUQSBpcyBDRi1wb2xsYWJsZSBvciBub3QKKyAgICB0QU5JX1U4IGNmUG9sbGFibGUgOiAxOworICAgIC8vLyBjb3VudGVyIHRvIGluZGljYXRlIFBTIHN0YXRlIHVwZGF0ZSBkdWUgdG8gYXN5bmNocm9ub3VzIFBTIFBvbGwKKyAgICB0QU5JX1U4IHBzUG9sbFVwZGF0ZToyOworCisgICAgLy8vIFJlc2VydmVkCisgICAgdEFOSV9VOCByc3ZkIDogNDsKKworICAgIC8vLyBJbmRleCBvZiB0aGUgbmV4dCBTVEEgaW4gUFMgY2xvc2VzdCB0byB0aGlzIG9uZQorICAgIHRBTklfVTggbmV4dFBTOworfSB0UG1tU3RhU3RhdGUsICp0cFBtbVN0YVN0YXRlOworCisKKyNkZWZpbmUgTk9fU1RBVEVfQ0hBTkdFIDB4RkYKKwordHlwZWRlZiBlbnVtIGVQbW1TdGF0ZQoreworICAgIGVQTU1fU1RBVEVfSU5WQUxJRCwKKyAgICBlUE1NX1NUQVRFX1JFQURZLAorICAgIC8vQk1QUworICAgIGVQTU1fU1RBVEVfQk1QU19XVF9JTklUX1JTUCwKKyAgICBlUE1NX1NUQVRFX0JNUFNfV1RfU0xFRVBfUlNQLAorICAgIGVQTU1fU1RBVEVfQk1QU19TTEVFUCwKKyAgICBlUE1NX1NUQVRFX0JNUFNfV1RfV0FLRVVQX1JTUCwKKyAgICBlUE1NX1NUQVRFX0JNUFNfV0FLRVVQLAorICAgIC8vSU1QUworICAgIGVQTU1fU1RBVEVfSU1QU19XVF9TTEVFUF9SU1AsCisgICAgZVBNTV9TVEFURV9JTVBTX1NMRUVQLAorICAgIGVQTU1fU1RBVEVfSU1QU19XVF9XQUtFVVBfUlNQLAorICAgIGVQTU1fU1RBVEVfSU1QU19XQUtFVVAsCisgICAgLy9VQVBTRAorICAgIGVQTU1fU1RBVEVfVUFQU0RfV1RfU0xFRVBfUlNQLAorICAgIGVQTU1fU1RBVEVfVUFQU0RfU0xFRVAsCisgICAgZVBNTV9TVEFURV9VQVBTRF9XVF9XQUtFVVBfUlNQLCAKKworICAgIC8vV09XTEFOCisgICAgZVBNTV9TVEFURV9XT1dMQU4sCisKKyAgICBlUE1NX1NUQVRFX0VSUk9SLAorICAgIGVQTU1fU1RBVEVfTEFTVCwKK310UG1tU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHNQbW1TdGFJbmZvCit7CisgICAgdEFOSV9VMTYgYXNzb2NJZDsKKyAgICB0QU5JX1UzMiBzdGFUeEFja0NudDsgICAKK310UG1tU3RhSW5mbywgKnRwUG1tU3RhSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1BtbVRpbQoreworICAgIHRBTklfVTggKnBUaW07ICAgICAgICAgICAgICAgICAgICAvKiogVGltIEJpdCBBcnJheSovCisgICAgdEFOSV9VOCBtaW5Bc3NvY0lkOworICAgIHRBTklfVTggbWF4QXNzb2NJZDsKKyAgICB0QU5JX1U4IGR0aW1Db3VudDsKKyAgICAvKiogUmVtYWluaW5nIE1lbWJlcnMgYXJlIG5lZWRlZCBmb3IgTGlua01vbml0YXJpbmcgb2YgdGhlIFNUQSBpbiBQUyovCisgICAgdEFOSV9VOCBudW1TdGFXaXRoRGF0YTsgIC8qKiBOdW1iZXIgb2Ygc3RhdGlvbnMgaW4gcG93ZXIgc2F2ZSwgd2hvIGhhdmUgZGF0YSBwZW5kaW5nKi8KKyAgICB0cFBtbVN0YUluZm8gICAgcFN0YUluZm87ICAgLyoqIFBvaW50cyB0byAxc3QgSW5zdGFudCBvZiB0aGUgQXJyYXkgb2YgTWF4U1RBIFN0YUluZm8gKi8KK30gdFBtbVRpbSwgKnRwUG1tVGltOworCit0eXBlZGVmIHN0cnVjdCBzQW5pU2lyUG1tCit7CisKKworICAgIC8vdEFOSV9VMzIgZGlzTW9kZUJlZm9yZVNsZWVwaW5nOworICAgIC8vdEFOSV9VMzIgdHhNQ2FzdEN0cmw7CisgICAgLy90QU5JX1UzMiBuTGlzdGVuQmVmb3JlU2xlZXBpbmc7CisgICAgLy90QU5JX1UzMiB0eFRyYWZmaWNJZGxlVGhyZXNob2xkOworICAgIC8vdEFOSV9VMzIgcnhUcmFmZmljSWRsZVRocmVzaG9sZDsKKyAgICAvL3RBTklfVTMyIGxlZEluZm9CZWZvcmVTbGVlcGluZzsKKworCisgICAgdEFOSV9VNjQgQm1wc21heFNsZWVwVGltZTsKKyAgICB0QU5JX1U2NCBCbXBzYXZnU2xlZXBUaW1lOworICAgIHRBTklfVTY0IEJtcHNtaW5TbGVlcFRpbWU7CisgICAgdEFOSV9VNjQgQm1wc2NudFNsZWVwOworCisgICAgdEFOSV9VNjQgQm1wc21heFRpbWVBd2FrZTsKKyAgICB0QU5JX1U2NCBCbXBzYXZnVGltZUF3YWtlOworICAgIHRBTklfVTY0IEJtcHNtaW5UaW1lQXdha2U7CisgICAgdEFOSV9VNjQgQm1wc2NudEF3YWtlOworCisgICAgdEFOSV9VNjQgQm1wc1dha2V1cFRpbWVTdGFtcDsKKyAgICB0QU5JX1U2NCBCbXBzU2xlZXBUaW1lU3RhbXA7CisKKyAgICAvLyBkZWJ1ZyBzdGF0aXN0aWNzCisgICAgdEFOSV9VNjQgQm1wc1BrdERycEluU2xlZXBNb2RlOworICAgIHRBTklfVTY0IEJtcHNJbml0RmFpbENudDsKKyAgICB0QU5JX1U2NCBCbXBzU2xlZVJlcUZhaWxDbnQ7CisgICAgdEFOSV9VNjQgQm1wc1dha2V1cFJlcUZhaWxDbnQ7CisgICAgdEFOSV9VNjQgQm1wc0ludlN0YXRlQ250OworICAgIHRBTklfVTY0IEJtcHNXYWtldXBJbmRDbnQ7CisgICAgdEFOSV9VNjQgQm1wc0hhbFJlcUZhaWxDbnQ7CisgICAgdEFOSV9VNjQgQm1wc1JlcUluSW52YWxpZFJvbGVDbnQ7CisKKyAgICAvKiBBZGQgd2FrZXVwIGFuZCBzbGVlcCB0aW1lIHN0YW1wcyBoZXJlICovCisgICAgdEFOSV9VNjQgSW1wc1dha2V1cFRpbWVTdGFtcDsKKyAgICB0QU5JX1U2NCBJbXBzU2xlZXBUaW1lU3RhbXA7CisKKyAgICB0QU5JX1U2NCBJbXBzTWF4VGltZUF3YWtlOworICAgIHRBTklfVTY0IEltcHNNaW5UaW1lQXdha2U7CisgICAgdEFOSV9VNjQgSW1wc0F2Z1RpbWVBd2FrZTsKKyAgICB0QU5JX1U2NCBJbXBzQ250QXdha2U7CisKKyAgICB0QU5JX1U2NCBJbXBzQ250U2xlZXA7CisgICAgdEFOSV9VNjQgSW1wc01heFNsZWVwVGltZTsKKyAgICB0QU5JX1U2NCBJbXBzTWluU2xlZXBUaW1lOworICAgIHRBTklfVTY0IEltcHNBdmdTbGVlcFRpbWU7CisKKyAgICB0QU5JX1U2NCBJbXBzU2xlZXBFcnJDbnQ7CisgICAgdEFOSV9VNjQgSW1wc1dha2V1cEVyckNudDsKKyAgICB0QU5JX1U2NCBJbXBzTGFzdEVycjsKKworICAgIHRBTklfVTY0IEltcHNJbnZhbGlkU3RhdGVDbnQ7CisgICAgdEFOSV9VNjQgSW1wc1BrdERycEluU2xlZXBNb2RlOworCisKKyAgIC8vLyBOZXh0IFNUQSB0byBiZSBzZXJ2aWNlZCBpbiBQUyBzdGF0ZQorICAgIHRBTklfVTE2IGdQbW1OZXh0U3RhOworCisgICAgLy8vIE5leHQgQ0YtcG9sbGFibGUgU1RBIHRvIGJlIHNlcnZpY2VkIGluIFBTIHN0YXRlCisgICAgdEFOSV9VMTYgZ1BtbU5leHRDRlBTdGE7CisKKyAgICAvLy8gTnVtYmVyIG9mIFNUQXMgaW4gUFMgc3RhdGUKKyAgICB0QU5JX1UxNiBnUG1tTnVtU3RhOworCisgICAgdEFOSV9VOCAgZ1BtbVBzUG9sbFVwZGF0ZToxOyAvLyBzZXQgd2hlbiBhbnkgc3RhIHN0YXRlIGlzIHVwZGF0ZSBkdWUgdG8gUFMtUG9sbAorICAgIHRBTklfVTggIHJzdmQ6IDc7CisgICAKKyAgIC8vLyBTVEEgUG93ZXIgbWFuYWdlbWVudCBzdGF0ZSBhcnJheQorICAgIC8qKgorICAgICAqIEFuIGVudHJ5IGluIHRoaXMgYXJyYXkgcmVjb3JkcyB0aGUgcG93ZXIgc2F2ZSBzdGF0ZSBmb3IgYW4gU1RBCisgICAgICogSXQgYWxzbyBwb2ludHMgdG8gdGhlIG5leHQgY2xvc2VzdCBTVEEgaW4gcG93ZXIgc2F2ZSBzdGF0ZS4KKyAgICAgKi8KKworICAgIHRBTklfVTMyIGdQbW1CZWFjb25JbnRlcnZhbDsgICAgIC8vcG1tIGtlZXBzIGl0cyB3b24gY29weSBvZiBiZWFjb24gaW50ZXJ2YWwsIGRlZmF1bHQgdG8gMTAwbXMKKyAgICB0U2lyUG93ZXJTYXZlQ2ZnIGdQbW1DZmc7ICAvL3BtbSBrZWVwcyBhIGNvcHkgb2YgUG93ZXIgU2F2ZSBjb25maWcgcGFyYW1ldGVycyBzZW50IHRvIHNvZnRtYWMuCisgICAgLy8vIEN1cnJlbnQgUE0gc3RhdGUgb2YgdGhlIHN0YXRpb24KKyAgICB0UG1tU3RhdGUgZ1BtbVN0YXRlOworICAgIC8vLyBGbGFnIHRvIHRyYWNrIGlmIHdlIGFyZSBpbiBhIG1pc3NlZCBiZWFjb24gc2NlbmFyaW8KKyAgICB0QU5JX1U4IGluTWlzc2VkQmVhY29uU2NlbmFyaW87CisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgdFBtbVN0YVN0YXRlICpncFBtbVN0YVN0YXRlOyAvLyBVc2VkIGZvciBIQ0YgLSBQUyBQb2xsIAorICAgIHRBTklfVTggKmdwUG1tUFNTdGF0ZTsgICAgICAgICAgLy8gVG8gU3RvcmUgdGhlIFBTIFN0YXRlcyBpbiBBUAorI2VuZGlmCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHRQbW1UaW0gZ1BtbVRpbTsKKyNlbmRpZgorCisKKyAgICAvL1JlYXNvbiBmb3Igd2hpY2ggUE1DIGlzIHNlbmRpbmcgYW4gRVhJVF9CTVBTX1JFUSB0byBQRQorICAgIHRFeGl0Qm1wc1JlYXNvbiAgIGdQbW1FeGl0Qm1wc1JlYXNvbkNvZGU7CisgICAgdEFOSV9VOCAgc2Vzc2lvbklkOyAgICAgIC8vVGhpcyBzZXNzaW8gSWQgaXMgYWRkZWQgdG8ga25vdyB0aGUgYnNzdHlwZSAsIGluZnJhL2J0YW1wIC4uLi4uLi5pbiBwb3dlciBzYXZlIG1vZGUKKworfSB0QW5pU2lyUG1tLCAqdHBBbmlTaXJQbW07CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvcnJtQXBpLmggYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9ycm1BcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODU1ZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvcnJtQXBpLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiAqLworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHJybUFwaS5oCisgIAorICBcYnJpZWYgUlJNIEFQSXMKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisjaWZuZGVmIF9fUlJNX0FQSV9IX18KKyNkZWZpbmUgX19SUk1fQVBJX0hfXworCisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIHJybUluaXRpYWxpemUodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIHJybUNsZWFudXAodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgcnJtUHJvY2Vzc0xpbmtNZWFzdXJlbWVudFJlcXVlc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBSeFBhY2tldEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcXVlc3QgKnBMaW5rUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkgKTsKKworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgcnJtUHJvY2Vzc1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciBwZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCAqcFJSTVJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5ICk7CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIHJybVByb2Nlc3NOZWlnaGJvclJlcG9ydFJlc3BvbnNlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXNwb25zZSAqcE5laWdoYm9yUmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkgKTsKKworZXh0ZXJuIHZvaWQgcnJtUHJvY2Vzc01lc3NhZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJNc2dRIHBNc2cpOworCitleHRlcm4gdFNpclJldFN0YXR1cyBycm1TZW5kU2V0TWF4VHhQb3dlclJlcSAoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQb3dlcmRCbSB0eFBvd2VyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5ICk7CisKK2V4dGVybiB0UG93ZXJkQm0gcnJtR2V0TWdtdFR4UG93ZXIgKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5ICk7CisKK2V4dGVybiB2b2lkIHJybUNhY2hlTWdtdFR4UG93ZXIgKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UG93ZXJkQm0gdHhQb3dlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSApOworCitleHRlcm4gdHBSUk1DYXBzIHJybUdldENhcGFiaWxpdGllcyAoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSApOworCitleHRlcm4gdm9pZCBycm1VcGRhdGVDb25maWcgKCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkgKTsKKworZXh0ZXJuIHZvaWQgcnJtR2V0U3RhcnRUU0YgKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcFN0YXJ0VFNGICk7CisKK2V4dGVybiB2b2lkIHJybVVwZGF0ZVN0YXJ0VFNGICggdHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgc3RhcnRUU0ZbMl0gKTsKKworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgcnJtU2V0TWF4VHhQb3dlclJzcCAoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTXNnUSBsaW1Nc2dRICk7CisKK2V4dGVybiB0U2lyUmV0U3RhdHVzCitycm1Qcm9jZXNzTmVpZ2hib3JSZXBvcnRSZXEoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJOZWlnaGJvclJlcG9ydFJlcUluZCBwTmVpZ2hib3JSZXEgKTsKK2V4dGVybiB0U2lyUmV0U3RhdHVzCitycm1Qcm9jZXNzQmVhY29uUmVwb3J0WG1pdCggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpckJlYWNvblJlcG9ydFhtaXRJbmQgcEJjblJlcG9ydCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL3JybUdsb2JhbC5oIGIvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvcnJtR2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyNDBiMgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL3JybUdsb2JhbC5oCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqICovCisKKyNpZiAhZGVmaW5lZCggX19SUk1HTE9CQUxfSCApCisjZGVmaW5lIF9fUlJNR0xPQkFMX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFxmaWxlICBycm1HbG9iYWwuaAorCisgIFxicmllZiBEZWZpbml0aW9ucyBmb3IgU01FIEFQSXMKKworICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgU0lSX0JDTl9SRVBPUlRfTUFYX0JTU19ERVNDICAgICAgICAgICAgICAgIDQKKwordHlwZWRlZiBlbnVtIGVScm1SZXRTdGF0dXMKK3sKKyAgICBlUlJNX1NVQ0NFU1MsCisgICAgZVJSTV9JTkNBUEFCTEUsCisgICAgZVJSTV9SRUZVU0VELAorICAgIGVSUk1fRkFJTFVSRQorfSB0UnJtUmV0U3RhdHVzOworCit0eXBlZGVmIHN0cnVjdCBzU2lyQ2hhbm5lbEluZm8KK3sKKyAgIHRBTklfVTggcmVndWxhdG9yeUNsYXNzOworICAgdEFOSV9VOCBjaGFubmVsTnVtOworfSB0U2lyQ2hhbm5lbEluZm8sICogdHBTaXJDaGFubmVsSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckJlYWNvblJlcG9ydFJlcUluZAoreworICAgdEFOSV9VMTYgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9CRUFDT05fUkVQT1JUX1JFUV9JTkQKKyAgIHRBTklfVTE2ICAgICBsZW5ndGg7CisgICB0U2lyTWFjQWRkciAgYnNzSWQ7CisgICB0QU5JX1UxNiAgICAgbWVhc3VyZW1lbnREdXJhdGlvbjsgICAvL21zCisgICB0QU5JX1UxNiAgICAgcmFuZG9taXphdGlvbkludGVydmFsOyAvL21zCisgICB0U2lyQ2hhbm5lbEluZm8gY2hhbm5lbEluZm87CisgICB0U2lyTWFjQWRkciAgICAgIG1hY2FkZHJCc3NpZDsgICAvLzA6IHdpbGRjYXJkCisgICB0QU5JX1U4ICAgICAgZk1lYXN1cmVtZW50dHlwZTsgIC8vMDpQYXNzaXZlLCAxOiBBY3RpdmUsIDI6IHRhYmxlIG1vZGUKKyAgIHRBbmlTU0lEICAgICBzc0lkOyAgICAgICAgICAgICAgLy9NYXkgYmUgd2lsY2FyZC4KKyAgIHRBTklfVTE2ICAgICAgdURpYWxvZ1Rva2VuOworICAgdFNpckNoYW5uZWxMaXN0IGNoYW5uZWxMaXN0OyAvL0Zyb20gQVAgY2hhbm5lbCByZXBvcnQuCit9IHRTaXJCZWFjb25SZXBvcnRSZXFJbmQsICogdHBTaXJCZWFjb25SZXBvcnRSZXFJbmQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpckJlYWNvblJlcG9ydFhtaXRJbmQKK3sKKyAgIHRBTklfVTE2ICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9CRUFDT05fUkVQT1JUX1JFU1BfWE1JVF9JTkQKKyAgIHRBTklfVTE2ICAgIGxlbmd0aDsKKyAgIHRTaXJNYWNBZGRyIGJzc0lkOworICAgdEFOSV9VMTYgICAgIHVEaWFsb2dUb2tlbjsKKyAgIHRBTklfVTggICAgIGZNZWFzdXJlRG9uZTsKKyAgIHRBTklfVTE2ICAgIGR1cmF0aW9uOworICAgdEFOSV9VOCAgICAgcmVnQ2xhc3M7CisgICB0QU5JX1U4ICAgICBudW1Cc3NEZXNjOworICAgdHBTaXJCc3NEZXNjcmlwdGlvbiBwQnNzRGVzY3JpcHRpb25bU0lSX0JDTl9SRVBPUlRfTUFYX0JTU19ERVNDXTsKK30gdFNpckJlYWNvblJlcG9ydFhtaXRJbmQsICogdHBTaXJCZWFjb25SZXBvcnRYbWl0SW5kOworCit0eXBlZGVmIHN0cnVjdCBzU2lyTmVpZ2hib3JSZXBvcnRSZXFJbmQKK3sKKyAgIHRBTklfVTE2ICAgICBtZXNzYWdlVHlwZTsgLy8gZVdOSV9TTUVfTkVJR0hCT1JfUkVQT1JUX1JFUV9JTkQKKyAgIHRBTklfVTE2ICAgICBsZW5ndGg7CisgICB0U2lyTWFjQWRkciAgYnNzSWQ7ICAvL0ZvciB0aGUgc2Vzc2lvbi4KKyAgIHRBTklfVTE2ICAgICBub1NTSUQ7IC8vVFJVRSAtIGRvbnQgaW5jbHVkZSBTU0lEIGluIHRoZSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgLy9GQUxTRSAgaW5jbHVkZSB0aGUgU1NJRC4gSXQgbWF5IGJlIG51bGwgKHdpbGRjYXJkKQorICAgdFNpck1hY1NTaWQgIHVjU1NJRDsgIAorfSB0U2lyTmVpZ2hib3JSZXBvcnRSZXFJbmQsICogdHBTaXJOZWlnaGJvclJlcG9ydFJlcUluZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK3R5cGVkZWYgc3RydWN0IHNTaXJOZWlnaGJvckJzc0Rlc2NyaXB0aW9uCit7CisgICB0QU5JX1UxNiAgICAgICAgbGVuZ3RoOworICAgdFNpck1hY0FkZHIgICAgIGJzc0lkOworICAgdEFOSV9VOCAgICAgICAgIHJlZ0NsYXNzOworICAgdEFOSV9VOCAgICAgICAgIGNoYW5uZWw7CisgICB0QU5JX1U4ICAgICAgICAgcGh5VHlwZTsKKyAgIHVuaW9uIHNTaXJOZWlnaGJvckJzc2lkSW5mbyB7CisgICAgICAgICBzdHJ1Y3QgX3JybUluZm8geworICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgZkFwUHJlYXV0aFJlYWNoYWJsZToyOyAgLy9zZWUgSUVFRSA4MDIuMTFrIFRhYmxlIDctNDNhCisgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICBmU2FtZVNlY3VyaXR5TW9kZToxOworICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgZlNhbWVBdXRoZW50aWNhdG9yOjE7CisgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICBmQ2FwU3BlY3RydW1NZWFzdXJlbWVudDoxOyAvL3NlZSBJRUVFIDgwMi4xMWsgVGFibGUgNy05NWQKKyAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgIGZDYXBRb3M6MTsgCisgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICBmQ2FwQXBzZDoxOyAKKyAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgIGZDYXBSYWRpb01lYXN1cmVtZW50OjE7IAorICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgZkNhcERlbGF5ZWRCbG9ja0FjazoxOyAKKyAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgIGZDYXBJbW1lZGlhdGVCbG9ja0FjazoxOworICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgZk1vYmlsaXR5RG9tYWluOjE7CisgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICByZXNlcnZlZDoyMTsgCisgICAgICAgICB9IHJybUluZm87CisgICAgICAgICBzdHJ1Y3QgX2NjeEluZm8geworICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgY2hhbm5lbEJhbmQ6ODsKKyAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgIG1pblJlY3ZTaWdQb3dlcjo4OworICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgYXBUeFBvd2VyOjg7CisgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICByb2FtSHlzdGVyZXNpczo4OworICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgYWRhcHRTY2FuVGhyZXM6ODsKKworICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgdHJhbnNpdGlvblRpbWU6ODsKKyAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgIHRzZk9mZnNldDoxNjsKKworICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgYmVhY29uSW50ZXJ2YWw6MTY7CisgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICByZXNlcnZlZDogMTY7CisgICAgICAgICB9IGNjeEluZm87CisgICB9IGJzc2lkSW5mbzsKKyAKKyAgIC8vT3B0aW9uYWwgc3ViIElFcy4uLi5pZ25vcmluZyBmb3Igbm93LgorfXRTaXJOZWlnaGJvckJzc0Rlc2NyaXB0aW9uLCAqdHBTaXJOZWlnaGJvckJzc0Rlc2NyaXB0b247CisKK3R5cGVkZWYgc3RydWN0IHNTaXJOZWlnaGJvclJlcG9ydEluZAoreworICAgdEFOSV9VMTYgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9ORUlHSEJPUl9SRVBPUlRfSU5ECisgICB0QU5JX1UxNiAgICAgbGVuZ3RoOworICAgdEFOSV9VMTYgICAgIG51bU5laWdoYm9yUmVwb3J0czsKKyAgIHRTaXJNYWNBZGRyICBic3NJZDsgIC8vRm9yIHRoZSBzZXNzaW9uLgorICAgLy90U2lyUmVzdWx0Q29kZXMgICAgc3RhdHVzQ29kZTsKKyAgIHRTaXJOZWlnaGJvckJzc0Rlc2NyaXB0aW9uIHNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uWzFdOworfSB0U2lyTmVpZ2hib3JSZXBvcnRJbmQsICogdHBTaXJOZWlnaGJvclJlcG9ydEluZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1JSTUJlYWNvblJlcG9ydFJlcXVlc3RlZEllcworeworICAgdEFOSV9VOCBudW07CisgICB0QU5JX1U4ICpwRWxlbWVudElkczsKK310UlJNQmVhY29uUmVwb3J0UmVxdWVzdGVkSWVzLCAqdHBSUk1CZWFjb25SZXBvcnRSZXF1ZXN0ZWRJZXM7CisKKy8vUmVwb3J0aW5nIGRldGFpbCBkZWZpbmVzLgorLy9SZWZlcmVuY2UgLSBJRUVFIFN0ZCA4MDIuMTFrLTIwMDggc2VjdGlvbiA3LjMuMi4yMS42IFRhYmxlIDctMjloCisjZGVmaW5lIEJFQUNPTl9SRVBPUlRJTkdfREVUQUlMX05PX0ZGX0lFIDAKKyNkZWZpbmUgQkVBQ09OX1JFUE9SVElOR19ERVRBSUxfQUxMX0ZGX1JFUV9JRSAxCisjZGVmaW5lIEJFQUNPTl9SRVBPUlRJTkdfREVUQUlMX0FMTF9GRl9JRSAyCisKKwordHlwZWRlZiBzdHJ1Y3Qgc1JSTVJlcQoreworICAgdEFOSV9VOCBkaWFsb2dfdG9rZW47IC8vSW4gYWN0aW9uIGZyYW1lOworICAgdEFOSV9VOCB0b2tlbjsgLy9XaXRoaW4gaW5kaXZpZHVhbCByZXF1ZXN0OworICAgdEFOSV9VOCB0eXBlOworICAgdW5pb24geworICAgICAgc3RydWN0IHsKKyAgICAgICAgIHRBTklfVTggcmVwb3J0aW5nRGV0YWlsOworICAgICAgICAgdFJSTUJlYWNvblJlcG9ydFJlcXVlc3RlZEllcyByZXFJZXM7CisgICAgICB9QmVhY29uOworICAgfXJlcXVlc3Q7Cit9dFJSTVJlcSwgKnRwUlJNUmVxOworCit0eXBlZGVmIHN0cnVjdCBzUlJNQ2FwcworeworICAgIHRBTklfVTggIExpbmtNZWFzdXJlbWVudDogMTsKKyAgICB0QU5JX1U4ICAgICAgTmVpZ2hib3JScHQ6IDE7CisgICAgdEFOSV9VOCAgICAgICAgIHBhcmFsbGVsOiAxOworICAgIHRBTklfVTggICAgICAgICByZXBlYXRlZDogMTsKKyAgICB0QU5JX1U4ICAgIEJlYWNvblBhc3NpdmU6IDE7CisgICAgdEFOSV9VOCAgICAgQmVhY29uQWN0aXZlOiAxOworICAgIHRBTklfVTggICAgICBCZWFjb25UYWJsZTogMTsKKyAgICB0QU5JX1U4ICAgIEJlYWNvblJlcENvbmQ6IDE7CisgICAgdEFOSV9VOCBGcmFtZU1lYXN1cmVtZW50OiAxOworICAgIHRBTklfVTggICAgICBDaGFubmVsTG9hZDogMTsKKyAgICB0QU5JX1U4ICAgTm9pc2VIaXN0b2dyYW06IDE7CisgICAgdEFOSV9VOCAgICAgICBzdGF0aXN0aWNzOiAxOworICAgIHRBTklfVTggICBMQ0lNZWFzdXJlbWVudDogMTsKKyAgICB0QU5JX1U4ICAgICAgIExDSUF6aW11dGg6IDE7CisgICAgdEFOSV9VOCAgICBUQ01DYXBhYmlsaXR5OiAxOworICAgIHRBTklfVTggICAgIHRyaWdnZXJlZFRDTTogMTsKKyAgICB0QU5JX1U4ICAgICBBUENoYW5SZXBvcnQ6IDE7CisgICAgdEFOSV9VOCAgICBSUk1NSUJFbmFibGVkOiAxOworICAgIHRBTklfVTggTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQ6IDE7CisgICAgdEFOSV9VOCBOZWlnaGJvclRTRk9mZnNldDogMTsKKyAgICB0QU5JX1U4ICBSQ1BJTWVhc3VyZW1lbnQ6IDE7CisgICAgdEFOSV9VOCAgUlNOSU1lYXN1cmVtZW50OiAxOworICAgIHRBTklfVTggQnNzQXZnQWNjZXNzRGVsYXk6IDE7CisgICAgdEFOSV9VOCBCU1NBdmFpbEFkbWlzc2lvbjogMTsKKyAgICB0QU5JX1U4IEFudGVubmFJbmZvcm1hdGlvbjogMTsKKworICAgIHRBTklfVTggb3BlcmF0aW5nQ2hhbk1heDsKKyAgICB0QU5JX1U4IG5vbk9wZXJhdGluZ0NoYW5NYXg7CisgICAgdEFOSV9VOCBNZWFzdXJlbWVudFBpbG90OworfXRSUk1DYXBzLCAqdHBSUk1DYXBzOworCit0eXBlZGVmIHN0cnVjdCBzUnJtUEVDb250ZXh0Cit7CisgICB0QU5JX1U4ICBycm1FbmFibGU7CisgICAvL3RDaGFubmVsTGlzdCBBUGNoYW5uZWxSZXBvcnQ7CisgICB0QU5JX1UzMiAgIHN0YXJ0VFNGWzJdOyAvL1VzZWQgZHVyaW5nIHNjYW4vbWVhc3VyZW1lbnQgdG8gc3RvcmUgdGhlIHN0YXJ0IFRTRi4gdGhpcyBpcyBub3QgdXNlZCBkaXJlY3RseSBpbiBiZWFjb24gcmVwb3J0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhpcyB2YWx1ZSBpcyBzdG9yZWQgaW50byBic3NkZXNjcmlwdGlvbiBhbmQgYmVhY29uIHJlcG9ydCBnZXRzIGl0IGZyb20gYnNzIGRlY3NyaXB0aW9uLgorICAgdFJSTUNhcHMgICBycm1FbmFibGVkQ2FwczsKKyAgIHRQb3dlcmRCbSAgdHhNZ210UG93ZXI7CisgICB0QU5JX1U4ICBEaWFsb2dUb2tlbjsgLy9EaWFsb2cgdG9rZW4gZm9yIHRoZSByZXF1ZXN0IGluaXRpYXRlZCBmcm9tIHN0YXRpb24uCisgICB0cFJSTVJlcSBwQ3VycmVudFJlcTsKK310UnJtUEVDb250ZXh0LCAqdHBScm1QRUNvbnRleHQ7CisKKy8vIDIwMDggMTFrIHNwZWMgcmVmZXJlbmNlOiAxOC40LjguNSBSQ1BJIE1lYXN1cmVtZW50CisjZGVmaW5lIFJDUElfTE9XX1JTU0lfVkFMVUUgICAoLTExMCkKKyNkZWZpbmUgUkNQSV9NQVhfVkFMVUUgICAgICAgICgyMjApCisjZGVmaW5lIENBTENVTEFURV9SQ1BJKHJzc2kpICAoKChyc3NpKSArIDExMCkgKiAyKQorCisKKyNlbmRpZiAvLyNpZiBkZWZpbmVkIF9fUlJNR0xPQkFMX0gKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL3NjaEFwaS5oIGIvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvc2NoQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3Njg5OAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL3NjaEFwaS5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19TQ0hfQVBJX0hfXworI2RlZmluZSBfX1NDSF9BUElfSF9fCisKKyNpbmNsdWRlICJzaXJDb21tb24uaCIKKyNpbmNsdWRlICJzaXJNYWNQcm90RGVmLmgiCisKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKworLy8vIFNlbmQgc3RhcnQgc2NhbiByZXNwb25zZSBtZXNzYWdlCitleHRlcm4gdm9pZCBzY2hTZW5kU3RhcnRTY2FuUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvLy8gU2V0IGluaXQgdGltZSBwYXJhbXMKK2V4dGVybiB2b2lkIHNjaFNldEluaXRQYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8vLyBTZXQgcW9zIGRlZmF1bHQgcGFyYW1zCitleHRlcm4gdm9pZCBzY2hVcGRhdGVRb3NJbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvLyB1cGRhdGUgb25seSB0aGUgYnJvYWRjYXN0IHFvcyBwYXJhbXMKK2V4dGVybiB2b2lkIHNjaFFvc1VwZGF0ZUJyb2FkY2FzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLy8gZmlsbCBpbiB0aGUgZGVmYXVsdCBsb2NhbCBlZGNhIHBhcmFtZXRlciBpbnRvIGdMaW1FZGNhUGFyYW1zW10KK2V4dGVybiB2b2lkIHNjaFNldERlZmF1bHRFZGNhUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRSk7CisKKy8vIHVwZGF0ZSBvbmx5IGxvY2FsIHFvcyBwYXJhbXMKK2V4dGVybiB2b2lkIHNjaFFvc1VwZGF0ZUxvY2FsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvLyB1cGRhdGUgdGhlIGVkY2EgcHJvZmlsZSBwYXJhbWV0ZXJzCitleHRlcm4gdm9pZCBzY2hFZGNhUHJvZmlsZVVwZGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworLy8vIENoZWNrIGZvciBSUiB0aW1lciBleHBpcnkKK2V4dGVybiB2b2lkIHNjaENoZWNrUlJUaW1lckV4cGlyeSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworLy8vIFNldCB0aGUgZml4ZWQgZmllbGRzIGluIGEgYmVhY29uIGZyYW1lCitleHRlcm4gdFNpclJldFN0YXR1cyBzY2hTZXRGaXhlZEJlYWNvbkZpZWxkcyh0cEFuaVNpckdsb2JhbCBwTWFjLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvLy8gSW5pdGlhbGl6YXRpb25zCitleHRlcm4gdm9pZCBzY2hJbml0aWFsaXplKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvLy8gSW5pdGlhbGl6ZSBnbG9iYWxzCitleHRlcm4gdm9pZCBzY2hJbml0R2xvYmFscyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworLy8vIEluaXRpYWxpemUgQ0YgUG9sbCB0ZW1wbGF0ZQorZXh0ZXJuIHZvaWQgc2NoSW5pdGlhbGl6ZUNmUG9sbFRlbXBsYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvLy8gSW5pdGlhbGl6ZSBDRiBFbmQgdGVtcGxhdGUKK2V4dGVybiB2b2lkIHNjaEluaXRpYWxpemVDZkVuZFRlbXBsYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvLy8gUHJvY2VzcyB0aGUgdHJhbnNtaXQgYWN0aXZpdHkgcXVldWUKK2V4dGVybiB2b2lkIHNjaFByb2Nlc3NUeEFjdGl2aXR5UXVldWUodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8vLyBBZGQgdG8gdGhlIERQSCBhY3Rpdml0eSBxdWV1ZQorZXh0ZXJuIHZvaWQgc2NoQWRkRHBoQWN0aXZpdHlRdWV1ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiwgdEFOSV9VOCk7CisKKy8vLyBBZGQgdG8gdGhlIFRYIElOIChEUEgpIGFjdGl2aXR5IHF1ZXVlCitleHRlcm4gdm9pZCBzY2hBZGRUeEluQWN0aXZpdHlRdWV1ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwdHIpOworCisvLy8gUHJvY2VzcyB0aGUgc2NoZWR1bGVyIG1lc3NhZ2UgcXVldWUKK2V4dGVybiB2b2lkIHNjaFByb2Nlc3NNZXNzYWdlUXVldWUodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8vLyBQcm9jZXNzIHRoZSBzY2hlZHVsZXIgbWVzc2FnZXMKK2V4dGVybiB2b2lkIHNjaFByb2Nlc3NNZXNzYWdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsdHBTaXJNc2dRIHBTY2hNc2cpOworCisvLy8gUHJvY2VzcyB0aGUgRFBIIGFjdGl2aXR5IHF1ZXVlCitleHRlcm4gdm9pZCBzY2hQcm9jZXNzRHBoQWN0aXZpdHlRdWV1ZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworLy8vIFRoZSBiZWFjb24gSW5kaWNhdGlvbiBoYW5kbGVyIGZ1bmN0aW9uCitleHRlcm4gdm9pZCBzY2hQcm9jZXNzUHJlQmVhY29uSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpOworCisvLy8gUG9zdCBhIG1lc3NhZ2UgdG8gdGhlIHNjaGVkdWxlciBtZXNzYWdlIHF1ZXVlCitleHRlcm4gdFNpclJldFN0YXR1cyBzY2hQb3N0TWVzc2FnZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZyk7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKy8vLyBUaGUgc2NoZWR1bGluZyBpbnRlcnJ1cHQgaGFuZGxlcgorZXh0ZXJuIHZvaWQgc2NoU2NoZWR1bGluZ0ludGVycnVwdEhhbmRsZXIodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8vLyBUaGUgc2NoZWR1bGluZyBlbmQgaW50ZXJydXB0IGZ1bmN0aW9uCitleHRlcm4gdm9pZCBzY2hTY2hlZHVsaW5nRW5kSW50ZXJydXB0SGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworLy8vIEZ1bmN0aW9uIHVzZWQgYnkgb3RoZXIgU2lyaXVzIG1vZHVsZXMgdG8gcmVhZCBDRlBjb3VudAorZXh0ZXJuIHRBTklfVTggc2NoR2V0Q0ZQQ291bnQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8vLyBGdW5jdGlvbiB1c2VkIGJ5IG90aGVyIFNpcml1cyBtb2R1bGVzIHRvIHJlYWQgQ0ZQRHVyYXRpb24gcmVtYWluaW5nCitleHRlcm4gdEFOSV9VMTYgc2NoR2V0Q0ZQRHVyUmVtYWluaW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgc2NoQmVhY29uUHJvY2Vzcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK2V4dGVybiB0U2lyUmV0U3RhdHVzIHNjaEJlYWNvbkVkY2FQcm9jZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNFZGNhUGFyYW1TZXRJRSAqZWRjYSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKworI2RlZmluZSBTQ0hfUlJfVElNRU9VVCAgICAgICAgICAgICAgICAgICAoU0NIX1JSX1RJTUVPVVRfTVMgLyBTWVNfVElDS19EVVJfTVMpCisKK3ZvaWQgc2NoU2V0QmVhY29uSW50ZXJ2YWwodHBBbmlTaXJHbG9iYWwgcE1hYyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKwordFNpclJldFN0YXR1cyBzY2hTZW5kQmVhY29uUmVxKCB0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqLCB0QU5JX1UxNiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSApOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordm9pZCBsaW1VcGRhdGVQcm9iZVJzcFRlbXBsYXRlSWVCaXRtYXBCZWFjb24xKHRwQW5pU2lyR2xvYmFsLHREb3QxMWZCZWFjb24xKix0QU5JX1UzMiosdERvdDExZlByb2JlUmVzcG9uc2UqKTsKK3ZvaWQgbGltVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZUllQml0bWFwQmVhY29uMih0cEFuaVNpckdsb2JhbCx0RG90MTFmQmVhY29uMiosdEFOSV9VMzIqLHREb3QxMWZQcm9iZVJlc3BvbnNlKik7Cit2b2lkIFNldFByb2JlUnNwSWVCaXRtYXAodEFOSV9VMzIqLHRBTklfVTMyKTsKK3RBTklfVTMyIGxpbVNlbmRQcm9iZVJzcFRlbXBsYXRlVG9IYWwodHBBbmlTaXJHbG9iYWwsdHBQRVNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiopOworI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9zY2hHbG9iYWwuaCBiL0NPUkUvTUFDL3NyYy9wZS9pbmNsdWRlL3NjaEdsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NmNlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS9zY2hHbG9iYWwuaApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaWZuZGVmIF9fU0NIX0dMT0JBTF9IX18KKyNkZWZpbmUgX19TQ0hfR0xPQkFMX0hfXworCisjaW5jbHVkZSAic2lyTWFjUHJvcEV4dHMuaCIKKyNpbmNsdWRlICJsaW1HbG9iYWwuaCIKKworI2luY2x1ZGUgInBhcnNlckFwaS5oIgorCisKKyNkZWZpbmUgQU5JX1NDSF9BREFQVElWRV9USFJFU0hPTERfVEhfQ0QgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBTklfU0NIX0FEQVBUSVZFX1RIUkVTSE9MRF9USF9EMCAgICAweDAwMDAwMDAyCisKKyNkZWZpbmUgQU5JX1NDSF9BREFQVElWRV9USFJFU0hPTERfQUxMICAgICAgKEFOSV9TQ0hfQURBUFRJVkVfVEhSRVNIT0xEX1RIX0NEIHwgQU5JX1NDSF9BREFQVElWRV9USFJFU0hPTERfVEhfRDApCisKKyNkZWZpbmUgQU5JX1NDSF9BREFQVElWRV9BTEdPX0JBTkRfMkdIWiAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBTklfU0NIX0FEQVBUSVZFX0FMR09fQkFORF81R0haICAgICAweDAwMDAwMDAyCisKKyNkZWZpbmUgQU5JX1NDSF9BREFQVElWRV9BTEdPX0JBTkRfQUxMICAgICAgKEFOSV9TQ0hfQURBUFRJVkVfQUxHT19CQU5EXzJHSFogfCBBTklfU0NIX0FEQVBUSVZFX0FMR09fQkFORF81R0haKQorCisKKy8vIERpYWdub3N0aWMgYml0bWFwIGRlZmluZXMKKworI2RlZmluZSBTQ0hfRElBR19SUl9USU1FT1VUX0RFTEVURSAgICAweDEKKyNkZWZpbmUgU0NIX0RJQUdfUlJfTE9XRVJfUkFURSAgICAgICAgMHgyCisKKyNkZWZpbmUgVElNX0lFX1NJWkUgMHg2CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlYWNvbiBwcm9jZXNzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy8gQmVhY29uIHN0cnVjdHVyZQorI2RlZmluZSB0U2NoQmVhY29uU3RydWN0IHRTaXJQcm9iZVJlc3BCZWFjb24KKyNkZWZpbmUgdHBTY2hCZWFjb25TdHJ1Y3Qgc3RydWN0IHNTaXJQcm9iZVJlc3BCZWFjb24gKgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vKioqKioqKioqKioqKioqKioqIE1JU0MgZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8vIE1heGltdW0gYWxsb3dhYmxlIHNpemUgb2YgYSBiZWFjb24gZnJhbWUKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyNkZWZpbmUgU0NIX01BWF9CRUFDT05fU0laRSAgICAyMDQ4CisjZWxzZQorI2RlZmluZSBTQ0hfTUFYX0JFQUNPTl9TSVpFICAgIDUxMgorI2VuZGlmCisKKyNkZWZpbmUgU0NIX01BWF9QUk9CRV9SRVNQX1NJWkUgNTEyCisKK3N0cnVjdCBzY2hNaXNjIHsKKworICAgIHRBTklfVTggKmdTY2hQcm9iZVJzcFRlbXBsYXRlOworCisgICAgLy8vIEJlZ2lubmluZyBwb3J0aW9uIG9mIHRoZSBiZWFjb24gZnJhbWUgdG8gYmUgd3JpdHRlbiB0byBURlAKKyAgICB0QU5JX1U4ICpnU2NoQmVhY29uRnJhbWVCZWdpbjsKKworICAgIC8vLyBUcmFpbGluZyBwb3J0aW9uIG9mIHRoZSBiZWFjb24gZnJhbWUgdG8gYmUgd3JpdHRlbiB0byBURlAKKyAgICB0QU5JX1U4ICpnU2NoQmVhY29uRnJhbWVFbmQ7CisgICAgCisgICAgLy8vIFNpemUgb2YgdGhlIGJlZ2lubmluZyBwb3J0aW9uCisgICAgdEFOSV9VMTYgZ1NjaEJlYWNvbk9mZnNldEJlZ2luOworICAgIC8vLyBTaXplIG9mIHRoZSB0cmFpbGluZyBwb3J0aW9uCisgICAgdEFOSV9VMTYgZ1NjaEJlYWNvbk9mZnNldEVuZDsKKworICAgIHRBTklfVTE2IGdTY2hCZWFjb25JbnRlcnZhbDsKKworICAgIC8vLyBDdXJyZW50IENGUCBjb3VudAorICAgIHRBTklfVTggZ1NjaENGUENvdW50OworCisgICAgLy8vIENGUCBEdXJhdGlvbiByZW1haW5pbmcKKyAgICB0QU5JX1U4IGdTY2hDRlBEdXJSZW1haW5pbmc7CisKKyAgICAvLy8gQ0ZQIE1heGltdW0gRHVyYXRpb24KKyAgICB0QU5JX1U4IGdTY2hDRlBNYXhEdXJhdGlvbjsKKworICAgIC8vLyBDdXJyZW50IERUSU0gY291bnQKKyAgICB0QU5JX1U4IGdTY2hEVElNQ291bnQ7CisKKyAgICAvLy8gV2hldGhlciB3ZSBoYXZlIGluaXRpYXRlZCBhIENGUCBvciBub3QKKyAgICB0QU5JX1U4IGdTY2hDRlBJbml0aWF0ZWQ7CisKKyAgICAvLy8gV2hldGhlciB3ZSBoYXZlIGluaXRpYXRlZCBhIENGQiBvciBub3QKKyAgICB0QU5JX1U4IGdTY2hDRkJJbml0aWF0ZWQ7CisKKyAgICAvLy8gQ0ZQIGlzIGVuYWJsZWQgYW5kIEFQIGlzIGNvbmZpZ3VyZWQgYXMgSENGCisgICAgdEFOSV9VOCBnU2NoQ0ZQRW5hYmxlZDsKKworICAgIC8vLyBDRkIgaXMgZW5hYmxlZCBhbmQgQVAgaXMgY29uZmlndXJlZCBhcyBIQ0YKKyAgICB0QU5JX1U4IGdTY2hDRkJFbmFibGVkOworCisgICAgLy8gLS0tLS0tLS0tIFNUQSBPTkxZIHN0YXRlIC0tLS0tLS0tLS0tCisKKyAgICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgUlIgdGltZXIgaXMgcnVubmluZyBvciBub3QKKyAgICB0QU5JX1U4ICByclRpbWVyWzhdOworCisgICAgLy8vIEluZGljYXRlcyB0aGUgcmVtYWluaW5nIFJSIHRpbWVvdXQgdmFsdWUgaWYgdGhlIFJSIHRpbWVyIGlzIHJ1bm5pbmcKKyAgICB0QU5JX1UxNiAgcnJUaW1lb3V0WzhdOworCisgICAgLy8vIE51bWJlciBvZiBSUnMgdHJhbnNtaXR0ZWQKKyAgICB0QU5JX1UxNiAgbnVtUlJbOF07CisgICAgdEFOSV9VMTYgIG51bVJSdGltZW91dHNbOF07CisKKyAgICAvLy8gZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGJlYWNvbiB0ZW1wbGF0ZSBoYXMgYmVlbiB1cGRhdGVkCisgICAgdEFOSV9VOCAgIGZCZWFjb25DaGFuZ2VkOworCisjaWYgZGVmaW5lZChXTEFOX1NPRlRBUF9GRUFUVVJFKSAmJiBkZWZpbmVkKFdMQU5fRkVBVFVSRV9QMlApIAorICAgIHRBTklfVTE2IHAycEllT2Zmc2V0OworI2VuZGlmCisKK307CisKKy8vKioqKioqKioqKioqKioqKioqIE1JU0MgZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwordHlwZWRlZiBzdHJ1Y3Qgc2NoU3RhV2FpdExpc3QKK3sKKyAgICB0QU5JX1UxNiBzdGFJZDsKKyAgICB0QU5JX1UxNiBjb3VudDsKK30gdFN0YVdhaXRMaXN0LCAqdHBTdGFXYWl0TGlzdDsKKworCisvLy8gR2xvYmFsIFNDSCBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IHNBbmlTaXJTY2gKK3sKKyAgICAvLy8gVGhlIHNjaGVkdWxlciBvYmplY3QKKyAgICBzdHJ1Y3QgIHNjaE1pc2Mgc2NoT2JqZWN0OworCisgICAgLy8gc2NoUW9TQ2xhc3MgdW5zb2xpY2l0ZWQ7CisKKyAgICAvLy8gV2hldGhlciBIQ0YgaXMgZW5hYmxlZCBvciBub3QKKyAgICB0QU5JX1U4IGdTY2hIY2ZFbmFibGVkOworCisgICAgLy8vIFdoZXRoZXIgc2NhbiBpcyByZXF1ZXN0ZWQgYnkgTElNIG9yIG5vdAorICAgIHRBTklfVTggZ1NjaFNjYW5SZXF1ZXN0ZWQ7CisKKyAgICAvLy8gV2hldGhlciBzY2FuIHJlcXVlc3QgaXMgcmVjZWl2ZWQgYnkgU0NIIG9yIG5vdAorICAgIHRBTklfVTggZ1NjaFNjYW5SZXFSY3ZkOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgdEFOSV9VOCBnU2NoUlJSZWNkOworI2VuZGlmCisKKyAgICAvLy8gRGVidWcgZmxhZyB0byBkaXNhYmxlIGJlYWNvbiBnZW5lcmF0aW9uCisgICAgdEFOSV9VMzIgZ1NjaEdlbkJlYWNvbjsKKworI2RlZmluZSBTQ0hfTUFYX0FSUiAxMDAKKyAgICB0QU5JX1UzMiBnU2NoQmVhY29uc1dyaXR0ZW47CisgICAgdEFOSV9VMzIgZ1NjaEJlYWNvbnNTZW50OworICAgIHRBTklfVTMyIGdTY2hCQlhwb3J0UmN2Q250OworICAgIHRBTklfVTMyIGdTY2hSUlJjdkNudCwgcW9zTnVsbENudDsKKyAgICB0QU5JX1UzMiBnU2NoQmNuUmN2Q250OworICAgIHRBTklfVTMyIGdTY2hVbmtub3duUmN2Q250OworCisgICAgdEFOSV9VMzIgZ1NjaEJjblBhcnNlRXJyb3JDbnQ7CisgICAgdEFOSV9VMzIgZ1NjaEJjbklnbm9yZWQ7CisKKyAgICAvLyB0VG1wSW5zdEJ1ZmZlciBUSUI7CisgICAgLy8gdEFOSV9VMTYgZ1NjaFF1YW50dW1bOF07CisKKyAgICB0QU5JX1UzMiBudW1Qb2xsLCBudW1EYXRhLCBudW1Db3JydXB0OworICAgIHRBTklfVTMyIG51bUJvZ3VzSW50LCBudW1UeEFjdDA7CisKKyNkZWZpbmUgU0NIX01BWF9OVU1fU0NIIDIxCisgICAgLy8gdEFOSV9VMzIgbnVtU2NoSGlzdFtTQ0hfTUFYX05VTV9TQ0hdOworICAgIC8vIHRBTklfVTMyIGRlZmF1bHRUeG9wOworCisgICAgdEFOSV9VMzIgbGFzdEJlYWNvbkxlbmd0aDsKKyAgICB0QU5JX1UxNiByclRpbWVvdXQ7CisgICAgdEFOSV9VMzIgcG9sbFBlcmlvZDsKKyAgICB0QU5JX1UzMiBrZWVwQWxpdmU7CisgICAgdEFOSV9VMzIgbXVsdGlwbGVTY2hlZDsKKyAgICB0QU5JX1UzMiBwb2xsRmVlZGJhY2tIaXN0WzhdOworICAgIHRBTklfVTMyIGRhdGFGZWVkYmFja0hpc3RbOF07CisgICAgdEFOSV9VMzIgbWF4UG9sbFRpbWVvdXRzOworICAgIHRBTklfVTMyIGNoZWNrQ2ZiRmxhZ1N0dWNrOworCisgICAgLy8vIFN0YSBXYWl0IGxpc3QKKyAgICB0cFN0YVdhaXRMaXN0IHBTdGFXYWl0TGlzdDsKKworICAgIC8vLyBQb2ludGVyIHRvIG5leHQgYXZhaWxhYmxlIGVudHJ5IGluIHN0YSB3YWl0IGxpc3QKKyAgICB0QU5JX1UxNiBzdGFXYWl0TGlzdEluOworICAgIC8vLyBQb2ludGVyIHRvIGZpcnN0IHdhaXRpbmcgc3RhIGluIHN0YSB3YWl0IGxpc3QKKyAgICB0QU5JX1UxNiBzdGFXYWl0TGlzdE91dDsKKyAgICAvLy8gVG90YWwgbnVtYmVyIG9mIHdhaXRpbmcgU1RBcyBpbiBzdGEgd2FpdCBsaXN0CisgICAgdEFOSV9VMTYgc3RhV2FpdExpc3RDb3VudDsKKyAgICAvLy8gVG90YWwgbnVtYmVyIG9mIHNjaGVkdWxlcyB0byBiZSB3YWl0ZWQKKyAgICB0QU5JX1UxNiBzdGFXYWl0TGlzdFRvdGFsV2FpdDsKKworICAgIC8vLyBOdW1iZXIgb2YgZW50cmllcyBpbiBEUEggYWN0aXZpdHkgcXVldWUgdGhhdCB3ZXJlIGlnbm9yZWQKKyAgICB0QU5JX1UzMiBpZ25vcmVEcGg7CisKK30gdEFuaVNpclNjaCwgKnRwQW5pU2lyU2NoOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvd21tQXBzZC5oIGIvQ09SRS9NQUMvc3JjL3BlL2luY2x1ZGUvd21tQXBzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzMxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvaW5jbHVkZS93bW1BcHNkLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBfX1dNTUFQU0RfSF9fCisjZGVmaW5lIF9fV01NQVBTRF9IX18KKworI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorCisvLyBXTU0gSW5mbyBFbGVtZW50IE9VSSBzdWJ0eXBlcyAKKyNkZWZpbmUgV01NX0FQU0RfSU5GT19FTEVNRU5UICAwCisjZGVmaW5lIFdNTV9BUFNEX1BBUkFNX0VMRU1FTlQgMQorCisvLyBMZW5ndGggb2YgSUVzIChJbmNsdWRpbmcgdGhlIEVJRCBieXRlKS4KKyNkZWZpbmUgV01NX0lORk9fRUxFTUVOVF9MRU5HVEhfVE9UQUwgOAorI2RlZmluZSBXTU1fUEFSQU1fRUxFTUVOVF9MRU5HVEhfVE9UQUwgMjUKKworLy8gSUUgbGVuZ2h0LgorI2RlZmluZSBXTU1fSU5GT19FTEVNRU5UX0xFTkdUSCA3CisjZGVmaW5lIFdNTV9QQVJBTV9FTEVNRU5UX0xFTkdUSCAyNAorCisKKy8vIFVBUFNEIEZsYWcgZm9yIGVhY2ggQUMgKFdNTSBzcGVjIDIuMi4xKQorI2RlZmluZSBMSU1fVUFQU0RfQklUT0ZGU0VUX0FDVk8gICAgIDAKKyNkZWZpbmUgTElNX1VBUFNEX0JJVE9GRlNFVF9BQ1ZJICAgICAxCisjZGVmaW5lIExJTV9VQVBTRF9CSVRPRkZTRVRfQUNCSyAgICAgMgorI2RlZmluZSBMSU1fVUFQU0RfQklUT0ZGU0VUX0FDQkUgICAgIDMKKworI2RlZmluZSBMSU1fVUFQU0RfRkxBR19BQ1ZPICAgICAoMSA8PCBMSU1fVUFQU0RfQklUT0ZGU0VUX0FDVk8pCisjZGVmaW5lIExJTV9VQVBTRF9GTEFHX0FDVkkgICAgICgxIDw8IExJTV9VQVBTRF9CSVRPRkZTRVRfQUNWSSkKKyNkZWZpbmUgTElNX1VBUFNEX0ZMQUdfQUNCSyAgICAgKDEgPDwgTElNX1VBUFNEX0JJVE9GRlNFVF9BQ0JLKQorI2RlZmluZSBMSU1fVUFQU0RfRkxBR19BQ0JFICAgICAoMSA8PCBMSU1fVUFQU0RfQklUT0ZGU0VUX0FDQkUpCisKKyNkZWZpbmUgTElNX1VBUFNEX0dFVChhYywgbWFzaykgICAgICAoKChtYXNrKSAmIChMSU1fVUFQU0RfRkxBR18gIyMgYWMpKSA+PiBMSU1fVUFQU0RfQklUT0ZGU0VUXyAjIyBhYykKKworLy8gRGVmaW5pdGlvbnMgZm9yIEFDIG1vZGUuCisjZGVmaW5lIEFDX0RFTElWRVJZX0VOQUJMRUQgMHgxCisjZGVmaW5lIEFDX1RSSUdHRVJfRU5BQkxFRCAgMHgyCisjZGVmaW5lIEFMTF9BQ19VQVBTRF9TRVQgICAgMHgwRgorCisvLyBEZWZpbml0aW9uIGZvciBzZXR0aW5nL2NsZWFyaW5nIFVhcHNkIE1hc2sKKyNkZWZpbmUgU0VUX1VBUFNEX01BU0sgICAgMQorI2RlZmluZSBDTEVBUl9VQVBTRF9NQVNLICAwCisKKyNkZWZpbmUgYWMydGNJZChhYykgKGFjIDw8IDEpCisKKy8vIEZ1bmN0aW9uIHByb3RvdHlwZXMuCitleHRlcm4gdm9pZCBhcHNkU2VuZFFvc051bGwodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgc3RhSWQsIHRBTklfVTggdGNJZCwgdEFOSV9VOCAqc3RhQWRkcik7CisKKworI2VuZGlmIC8qIF9fV01NQVBTRF9IX18gKi8KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltQUlEbWdtdC5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1BSURtZ210LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3OGViNgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltQUlEbWdtdC5jCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbUFJRG1nbXQuY2MgY29udGFpbnMgdGhlIGZ1bmN0aW9ucyByZWxhdGVkIHRvCisgKiBBSUQgcG9vbCBtYW5hZ2VtZW50IGxpa2UgaW5pdGlhbGl6YXRpb24sIGFzc2lnbm1lbnQgZXRjLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDMvMjAvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisgCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJ3bmlDZmdTdGEuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJjZmdBcGkuaCIKKyNpbmNsdWRlICJzaXJQYXJhbXMuaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbVRpbWVyVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZXNzaW9uLmgiCisKKyNkZWZpbmUgTElNX1NUQVJUX0FJRCAgIDEKKworCisvKioKKyAqIGxpbUluaXRBSURwb29sKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgc3RhcnRpbmcgYSBCU1MgYXQgQVAKKyAqIHRvIGluaXRpYWxpemUgQUlEIHBvb2wuIFRoaXMgbWF5IGFsc28gYmUgY2FsbGVkIHdoaWxlCisgKiBzdGFydGluZy9qb2luaW5nIGFuIElCU1MgaWYgJ0Fzc29jaWF0aW9uJyBpcyBhbGxvd2VkCisgKiBpbiBJQlNTLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1Jbml0QUlEcG9vbCh0cEFuaVNpckdsb2JhbCBwTWFjLHRwUEVTZXNzaW9uIHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1U4IGk7CisgICAgdEFOSV9VOCBtYXhBc3NvY1N0YSA9IHBNYWMtPmxpbS5nTGltQXNzb2NTdGFMaW1pdDsKKworICAgIHBNYWMtPmxpbS5ncExpbUFJRHBvb2xbMF09MDsKKyAgICBwTWFjLT5saW0uZnJlZUFpZEhlYWQ9TElNX1NUQVJUX0FJRDsKKworICAgIGZvciAoaT1wTWFjLT5saW0uZnJlZUFpZEhlYWQ7aTxtYXhBc3NvY1N0YTsgaSsrKQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdwTGltQUlEcG9vbFtpXSAgICAgICAgID0gaSsxOworICAgIH0KKyAgICBwTWFjLT5saW0uZ3BMaW1BSURwb29sW2ldICAgICAgICAgPSAgMDsKKworICAgIHBNYWMtPmxpbS5mcmVlQWlkVGFpbD1pOworCit9CisKKworLyoqCisgKiBsaW1Bc3NpZ25BSUQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgQXNzb2NpYXRpb24vUmVhc3NvY2lhdGlvbgorICogZnJhbWUgaGFuZGxpbmcgdG8gYXNzaWduIGFzc29jaWF0aW9uIElEIChhaWQpIHRvIGEgU1RBLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gYWlkICAtIGFzc2lnbmVkIEFzc29jaWF0aW9uIElEIGZvciBTVEEKKyAqLworCit0QU5JX1UxNgorbGltQXNzaWduQUlEKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VMTYgYWlkOworCisgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgZXhjZWVkZWQgdGhlIGNvbmZpZ3VyYWJsZSBsaW1pdCBvbiBhc3NvY2lhdGlvbnMKKyAgICBpZiAocE1hYy0+bGltLmdMaW1OdW1PZkN1cnJlbnRTVEFzID49IHBNYWMtPmxpbS5nTGltQXNzb2NTdGFMaW1pdCkKKyAgICB7CisgICAgICAgIC8vIHRvbyBtYW55IGFzc29jaWF0aW9ucyBhbHJlYWR5IGFjdGl2ZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gaGVhZCBvZiBmcmVlIGxpc3QgKi8KKworICAgIGlmIChwTWFjLT5saW0uZnJlZUFpZEhlYWQpCisgICAgeworICAgICAgICBhaWQ9cE1hYy0+bGltLmZyZWVBaWRIZWFkOworICAgICAgICBwTWFjLT5saW0uZnJlZUFpZEhlYWQ9cE1hYy0+bGltLmdwTGltQUlEcG9vbFtwTWFjLT5saW0uZnJlZUFpZEhlYWRdOworICAgICAgICBpZiAocE1hYy0+bGltLmZyZWVBaWRIZWFkPT0wKQorICAgICAgICAgICAgcE1hYy0+bGltLmZyZWVBaWRUYWlsPTA7CisgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtT2ZDdXJyZW50U1RBcysrOworICAgICAgICAvL1BFTE9HMihsaW1Mb2cocE1hYywgTE9HMixGTCgiQXNzaWduIGFpZCAlZCwgbnVtU3RhICVkLCBoZWFkICVkIHRhaWwgJWQgXG4iKSxhaWQscE1hYy0+bGltLmdMaW1OdW1PZkN1cnJlbnRTVEFzLHBNYWMtPmxpbS5mcmVlQWlkSGVhZCxwTWFjLT5saW0uZnJlZUFpZFRhaWwpOykKKyAgICAgICAgcmV0dXJuIGFpZDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsgLyogbm8gbW9yZSBmcmVlIGFpZHMgKi8KK30KKworCisvKioKKyAqIGxpbVJlbGVhc2VBSUQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgU1RBIGNvbnRleHQgaXMgcmVtb3ZlZAorICogYXQgQVAgKG9yIGF0IGEgU1RBIGluIElCU1MgbW9kZSkgdG8gcmV0dXJuIGFzc29jaWF0aW9uIElEIChhaWQpCisgKiB0byBmcmVlIHBvb2wuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBhaWQgLSBBc3NvY2lhdGlvbiBJRCB0aGF0IG5lZWQgdG8gcmV0dXJuIHRvIGZyZWUgcG9vbAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVJlbGVhc2VBSUQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgYWlkKQoreworICAgIHBNYWMtPmxpbS5nTGltTnVtT2ZDdXJyZW50U1RBcy0tOworCisgICAgLyogaW5zZXJ0IGF0IHRhaWwgb2YgZnJlZSBsaXN0ICovCisgICAgaWYgKHBNYWMtPmxpbS5mcmVlQWlkVGFpbCkKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5ncExpbUFJRHBvb2xbcE1hYy0+bGltLmZyZWVBaWRUYWlsXT0odEFOSV9VOClhaWQ7CisgICAgICAgIHBNYWMtPmxpbS5mcmVlQWlkVGFpbD0odEFOSV9VOClhaWQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5mcmVlQWlkVGFpbD1wTWFjLT5saW0uZnJlZUFpZEhlYWQ9KHRBTklfVTgpYWlkOworICAgIH0KKyAgICBwTWFjLT5saW0uZ3BMaW1BSURwb29sWyh0QU5JX1U4KWFpZF09MDsKKyAgICAvL1BFTE9HMihsaW1Mb2cocE1hYywgTE9HMixGTCgiUmVsZWFzZSBhaWQgJWQsIG51bVN0YSAlZCwgaGVhZCAlZCB0YWlsICVkIFxuIiksYWlkLHBNYWMtPmxpbS5nTGltTnVtT2ZDdXJyZW50U1RBcyxwTWFjLT5saW0uZnJlZUFpZEhlYWQscE1hYy0+bGltLmZyZWVBaWRUYWlsKTspCisKK30KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltQWRtaXRDb250cm9sLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbUFkbWl0Q29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNGU1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbUFkbWl0Q29udHJvbC5jCkBAIC0wLDAgKzEsMTI1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBjb250YWlucyBUU1BFQyBhbmQgU1RBIGFkbWl0IGNvbnRyb2wgcmVsYXRlZCBmdW5jdGlvbnMKKyAqIE5PVEU6IGFwcGxpZXMgb25seSB0byBBUCBidWlsZHMKKyAqCisgKiBBdXRob3I6ICAgICAgU2FuZGVzaCBHb2VsCisgKiBEYXRlOiAgICAgICAgMDIvMjUvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJsaW1EZWJ1Zy5oIgorI2luY2x1ZGUgInN5c0RlZi5oIgorI2luY2x1ZGUgImxpbUFwaS5oIgorI2luY2x1ZGUgImNmZ0FwaS5oIiAvLyB3bGFuX2NmZ0dldEludCgpCisjaW5jbHVkZSAibGltVHJhY2UuaCIKKyNpbmNsdWRlICJsaW1TZW5kU21lUnNwTWVzc2FnZXMuaCIKKyNpbmNsdWRlICJsaW1UeXBlcy5oIgorCisKKyNkZWZpbmUgQURNSVRfQ09OVFJPTF9MT0dMRVZFTCAgICAgICAgTE9HMQorI2RlZmluZSBBRE1JVF9DT05UUk9MX1BPTElDWV9MT0dMRVZFTCBMT0cxCisjZGVmaW5lIEFETUlUX0NPTlRST0xfTUlOX0lOVEVSVkFMICAgIDEwMDAgLy8gbWluIGFjY2VwdGFibGUgc2VydmljZSBpbnRlcnZhbCAxbVNlYworCisvKiB0b3RhbCBhdmFpbGFibGUgYmFuZHdpZHRoIGluIGJwcyBpbiBlYWNoIHBoeSBtb2RlCisgKiB0aGVzZSBzaG91bGQgYmUgZGVmaW5lZCBpbiBoYWwgb3IgZHBoIC0gcmVwbGFjZSB0aGVzZSBsYXRlcgorICovCisjZGVmaW5lIExJTV9UT1RBTF9CV18xMUEgICA1NDAwMDAwMAorI2RlZmluZSBMSU1fTUlOX0JXXzExQSAgICAgNjAwMDAwMAorI2RlZmluZSBMSU1fVE9UQUxfQldfMTFCICAgMTEwMDAwMDAKKyNkZWZpbmUgTElNX01JTl9CV18xMUIgICAgIDEwMDAwMDAKKyNkZWZpbmUgTElNX1RPVEFMX0JXXzExRyAgIExJTV9UT1RBTF9CV18xMUEKKyNkZWZpbmUgTElNX01JTl9CV18xMUcgICAgIExJTV9NSU5fQldfMTFCCisKKy8vIGNvbnZlcnNpb24gZmFjdG9ycworI2RlZmluZSBMSU1fQ09OVkVSVF9TSVpFX0JJVFMobnVtQnl0ZXMpICgobnVtQnl0ZXMpICogOCkKKyNkZWZpbmUgTElNX0NPTlZFUlRfUkFURV9NQlBTKHJhdGUpICAgICAoKHJhdGUpLzEwMDAwMDApCisKKy8qIEFOSSBzdGEncyBzdXBwb3J0IGVuaGFuY2VkIHJhdGVzLCBzbyB0aGUgZWZmZWN0aXZlIG1lZGl1bSB0aW1lIHVzZWQgaXMKKyAqIGhhbGYgdGhhdCBvZiBvdGhlciBzdGF0aW9ucy4gVGhpcyBpcyB0aGUgc2FtZSBhcyBpZiB0aGV5IHdlcmUgcmVxdWVzdGluZworICogaGFsZiB0aGUgYmFkbndpZHRoIC0gc28gd2UgYWRqdXN0IEFOSSBzdGEncyBhY2NvcmRpbmdseSBmb3IgYmFuZHdpZHRoCisgKiBjYWxjdWxhdGlvbnMuIEFsc28gZW5oYW5jZWQgcmF0ZXMgYXBwbHkgb25seSBpbiBjYXNlIG9mIG5vbiAxMUIgbW9kZS4KKyAqLworI2RlZmluZSBMSU1fU1RBX0JXX0FESlVTVChhbmlQZWVyLCBwaHlNb2RlLCBidykgXAorICAgICAgICAgICAgKCgoYW5pUGVlcikgJiYgKChwaHlNb2RlKSAhPSBXTklfQ0ZHX1BIWV9NT0RFXzExQikpIFwKKyAgICAgICAgICAgICAgPyAgICgoYncpLzIpIDogKGJ3KSkKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgcHJvdG9zCisKK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitsaW1DYWxjdWxhdGVTdmNJbnQodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNUc3BlY0lFICosIHRBTklfVTMyICopOworI2lmIDAgLy9vbmx5IEVEQ0EgaXMgc3VwcG9ydGVkIG5vdworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2xpbVZhbGlkYXRlVHNwZWNIY2NhKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjVHNwZWNJRSAqKTsKKyNlbmRpZgorc3RhdGljIHRTaXJSZXRTdGF0dXMKK2xpbVZhbGlkYXRlVHNwZWNFZGNhKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjVHNwZWNJRSAqLCB0cFBFU2Vzc2lvbik7CitzdGF0aWMgdFNpclJldFN0YXR1cworbGltVmFsaWRhdGVUc3BlYyh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1RzcGVjSUUgKiwgdHBQRVNlc3Npb24pOworc3RhdGljIHZvaWQKK2xpbUNvbXB1dGVNZWFuQndVc2VkKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqLCB0QU5JX1UzMiwgdHBMaW1Uc3BlY0luZm8sIHRwUEVTZXNzaW9uKTsKK3N0YXRpYyB2b2lkCitsaW1HZXRBdmFpbGFibGVCdyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKiwgdEFOSV9VMzIgKiwgdEFOSV9VMzIsIHRBTklfVTMyKTsKK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitsaW1BZG1pdFBvbGljeU92ZXJzdWJzY3JpcHRpb24odHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNUc3BlY0lFICosIHRwTGltQWRtaXRQb2xpY3lJbmZvLCB0cExpbVRzcGVjSW5mbywgdHBQRVNlc3Npb24pOworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2xpbVRzcGVjRmluZEJ5U3RhQWRkcih0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqLCB0U2lyTWFjVHNwZWNJRSosIHRwTGltVHNwZWNJbmZvLCB0cExpbVRzcGVjSW5mbyAqKTsKK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitsaW1WYWxpZGF0ZUFjY2Vzc1BvbGljeSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCwgdEFOSV9VMTYsIHRwUEVTZXNzaW9uKTsKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbUNhbGN1bGF0ZVN2Y0ludAorXGJyaWVmIFRTUEVDIHZhbGlkYXRpb24gYW5kIHNlcnZjaWUgaW50ZXJ2YWwgZGV0ZXJtaW5hdGlvbgorXHBhcmFtICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gICAgICAgICB0U2lyTWFjVHNwZWNJRSAqcFRzcGVjCitccGFyYW0gICAgICAgICB0QU5JX1UzMiAgICAgICAgICAgICpwU3ZjSW50CitccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMgb2YgdGhlIGNvbXBhcmlzb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitsaW1DYWxjdWxhdGVTdmNJbnQoCisgICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgdFNpck1hY1RzcGVjSUUgKnBUc3BlYywKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICpwU3ZjSW50KQoreworICAgIHRBTklfVTMyIG1zZHVTeiwgZGF0YVJhdGU7CisgICAgKnBTdmNJbnQgPSAwOworCisgICAgLy8gaWYgYSBzZXJ2aWNlIGludGVydmFsIGlzIGFscmVhZHkgc3BlY2lmaWVkLCB3ZSBhcmUgZG9uZQorICAgIGlmICgocFRzcGVjLT5taW5TdmNJbnRlcnZhbCAhPSAwKSB8fCAocFRzcGVjLT5tYXhTdmNJbnRlcnZhbCAhPSAwKSkKKyAgICB7CisgICAgICAgICpwU3ZjSW50ID0gKHBUc3BlYy0+bWF4U3ZjSW50ZXJ2YWwgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBwVHNwZWMtPm1heFN2Y0ludGVydmFsIDogcFRzcGVjLT5taW5TdmNJbnRlcnZhbDsKKyAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICB9CisgICAgCisgICAgLyogTWFza2luZyBvZmYgdGhlIGZpeGVkIGJpdHMgYWNjb3JkaW5nIHRvIGRlZmluaXRpb24gb2YgTVNEVSBzaXplCisgICAgICogaW4gSUVFRSA4MDIuMTEtMjAwNyBzcGVjIChzZWN0aW9uIDcuMy4yLjMwKS4gTm9taW5hbCBNU0RVIHNpemUKKyAgICAgKiBpcyBkZWZpbmVkIGFzOiAgQml0WzA6MTRdPVNpemUsIEJpdFsxNV09Rml4ZWQKKyAgICAgKi8KKyAgICBpZiAocFRzcGVjLT5ub21Nc2R1U3ogIT0gMCkgCisgICAgICAgIG1zZHVTeiA9IChwVHNwZWMtPm5vbU1zZHVTeiAmIDB4N2ZmZik7CisgICAgZWxzZSBpZiAocFRzcGVjLT5tYXhNc2R1U3ogIT0gMCkgCisgICAgICAgIG1zZHVTeiA9IHBUc3BlYy0+bWF4TXNkdVN6OworICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIk1zZHVTaXplIG5vdCBzcGVjaWZpZWRcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogbmVlZCB0byBjYWxjdWxhdGUgYSByZWFzb25hYmxlIHNlcnZpY2UgaW50ZXJ2YWwKKyAgICAgKiB0aGlzIGlzIHNpbXBseSB0aGUgbXNkdVN6L21lYW5EYXRhUmF0ZQorICAgICAqLworICAgIGlmICAgICAgKHBUc3BlYy0+bWVhbkRhdGFSYXRlICE9IDApIGRhdGFSYXRlID0gcFRzcGVjLT5tZWFuRGF0YVJhdGU7CisgICAgZWxzZSBpZiAocFRzcGVjLT5wZWFrRGF0YVJhdGUgIT0gMCkgZGF0YVJhdGUgPSBwVHNwZWMtPnBlYWtEYXRhUmF0ZTsKKyAgICBlbHNlIGlmIChwVHNwZWMtPm1pbkRhdGFSYXRlICAhPSAwKSBkYXRhUmF0ZSA9IHBUc3BlYy0+bWluRGF0YVJhdGU7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRGF0YVJhdGUgbm90IHNwZWNpZmllZFxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAqcFN2Y0ludCA9IExJTV9DT05WRVJUX1NJWkVfQklUUyhtc2R1U3opIC8gTElNX0NPTlZFUlRfUkFURV9NQlBTKGRhdGFSYXRlKTsKKyAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworfQorCisjaWYgMCAvL29ubHkgRURDQSBpcyBzdXBwb3J0ZWQgbm93CisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVZhbGlkYXRlVHNwZWNIY2NhCitcYnJpZWYgIHZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzIGluIHRoZSBoY2NhIHRzcGVjCisgICAgICAgICBtYW5kYXRvcnkgZmllbGRzIGFyZSBkZXJpdmVkIGZyb20gMTFlIEFubmV4IEkgKFRhYmxlIEkuMSkKK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xwYXJhbSAgICAgICB0U2lyTWFjVHNwZWNJRSAqcFRzcGVjCitccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdFNpclJldFN0YXR1cworbGltVmFsaWRhdGVUc3BlY0hjY2EoCisgICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgdFNpck1hY1RzcGVjSUUgKnBUc3BlYykKK3sKKyAgICB0QU5JX1UzMiBtYXhQaHlSYXRlLCBtaW5QaHlSYXRlOworICAgIHRBTklfVTMyIHBoeU1vZGU7CisKKyAgICB0U2lyUmV0U3RhdHVzIHJldHZhbCA9IGVTSVJfU1VDQ0VTUzsKKyAgICAvKiBtYWtlIHN1cmUgYSBUU0lEIGlzIGJlaW5nIHJlcXVlc3RlZCAqLworICAgIGlmIChwVHNwZWMtPnRzaW5mby50cmFmZmljLnRzaWQgPCBTSVJfTUFDX0hDQ0FfVFNJRF9NSU4pCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoInRzaWQgJWQgbXVzdCBiZSA+JWQpXG4iKSwKKyAgICAgICAgICAgICAgIHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMudHNpZCwgU0lSX01BQ19IQ0NBX1RTSURfTUlOKTsKKyAgICAgICAgcmV0dmFsID0gIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBXaXRoIFBvbGFyaXMsIHRoZXJlIGlzIGEgbGltaXRhdGlvbiBpbiB0aGF0IHRoZSB0c2lkIGNhbm5vdCBiZSBhcmJpdGFyeQorICAgICAqIGJ1dCBpcyBiYXNlZCBvbiB0aGUgcWlkLiBUaHVzLCB3ZSBjYW5ub3QgaGF2ZSBhIHRzcGVjIHdoaWNoIHJlcXVlc3RzCisgICAgICogYSB0c2lkIG9mIDEzIGFuZCB1c2VyUHJpbyBvZiA3LCB0aGUgYm90dG9tIHRocmVlIGJpdHMgb2YgdGhlIHRzaWQgbXVzdAorICAgICAqIGNvcnJlc3BvbmQgdG8gdGhlIHVzZXJQcmlvCisgICAgICovCisgICAgaWYgKHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMudXNlclByaW8gIT0KKyAgICAgICAgKHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMudHNpZCAtIFNJUl9NQUNfSENDQV9UU0lEX01JTikpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlRTaWQ9MHgleCwgdXNlclByaW89JWQ6IGlzIG5vdCBhbGxvd2VkXG4iKSwKKyAgICAgICAgICAgICAgIHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMudHNpZCwgcFRzcGVjLT50c2luZm8udHJhZmZpYy51c2VyUHJpbyk7CisgICAgICAgIHJldHZhbCA9IGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgLy8gYW4gaW5hY3Rpdml0eSBpbnRlcnZhbCBpcyBtYW5kYXRvcnkKKyAgICBpZiAocFRzcGVjLT5pbmFjdEludGVydmFsID09IDApCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJpbmFjdEludGVydmFsIHVuc3BlY2lmaWVkIVxuIikpOykKKyAgICAgICAgcmV0dmFsID0gIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgLy8gc3VycGx1cyBCVyBtdXN0IGJlIHNwZWNpZmllZCBpZiBhIGRlbGF5IEJvdW5kIGlzIHNwZWNpZmllZAorICAgIGlmICgocFRzcGVjLT5kZWxheUJvdW5kICE9IDApICYmIChwVHNwZWMtPnN1cnBsdXNCdyA9PSAwKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiZGVsYXlCb3VuZCAlZCwgYnV0IHN1cnBsdXNCdyB1bnNwZWNpZmllZCFcbiIpLAorICAgICAgICAgICAgICAgcFRzcGVjLT5kZWxheUJvdW5kKTsKKyAgICAgICAgcmV0dmFsID0gIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgLy8gbWluUGh5UmF0ZSBtdXN0IGFsd2F5cyBiZSBzcGVjaWZpZWQgYW5kIGNhbm5vdCBleGNlZWQgbWF4aW11bSBzdXBwb3J0ZWQKKyAgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlKTsKKyAgICAvL2xpbUdldEF2YWlsYWJsZUJ3KHBNYWMsICZtYXhQaHlSYXRlLCAmbWluUGh5UmF0ZSwgcE1hYy0+ZHBoLmdEcGhQaHlNb2RlLAorICAgIC8vICAgICAgICAgICAgICAgICAgMSAvKiBiYW5kd2lkdGggbXVsdCBmYWN0b3IgKi8pOworICAgIGxpbUdldEF2YWlsYWJsZUJ3KHBNYWMsICZtYXhQaHlSYXRlLCAmbWluUGh5UmF0ZSwgcGh5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAxIC8qIGJhbmR3aWR0aCBtdWx0IGZhY3RvciAqLyk7CisgICAgaWYgKChwVHNwZWMtPm1pblBoeVJhdGUgPT0gMCkKKyAgICAgICAgfHwgKHBUc3BlYy0+bWluUGh5UmF0ZSA+IG1heFBoeVJhdGUpCisgICAgICAgIHx8IChwVHNwZWMtPm1pblBoeVJhdGUgPCBtaW5QaHlSYXRlKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgibWluUGh5UmF0ZSAoJWQpIGludmFsaWRcbiIpLAorICAgICAgICAgICAgICAgcFRzcGVjLT5taW5QaHlSYXRlKTsKKyAgICAgICAgcmV0dmFsID0gIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgLyogTk9URTogd2Ugd2lsbCByZXF1aXJlIGFsbCBUc3BlYydzIHRvIHNwZWNpZnkgYSBtZWFuIGRhdGEgcmF0ZSAoYW5kIHNvCisgICAgICogYWxzbyB0aGUgbWluIGFuZCBwZWFrIGRhdGEgcmF0ZXMpCisgICAgICovCisgICAgaWYgKChwVHNwZWMtPm1pbkRhdGFSYXRlICA9PSAwKSB8fAorICAgICAgICAocFRzcGVjLT5tZWFuRGF0YVJhdGUgPT0gMCkgfHwKKyAgICAgICAgKHBUc3BlYy0+cGVha0RhdGFSYXRlID09IDApKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJEYXRhUmF0ZSBtdXN0IGJlIHNwZWNpZmllZCAobWluICVkLCBtZWFuICVkLCBwZWFrICVkKVxuIiksCisgICAgICAgICAgICAgICBwVHNwZWMtPm1pbkRhdGFSYXRlLCBwVHNwZWMtPm1lYW5EYXRhUmF0ZSwgcFRzcGVjLT5wZWFrRGF0YVJhdGUpOworICAgICAgICByZXR2YWwgPSAgZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIC8vIG1lYW4gZGF0YSByYXRlIGNhbid0IGJlIG1vcmUgdGhhbiB0aGUgbWluIHBoeSByYXRlCisgICAgaWYgKHBUc3BlYy0+bWVhbkRhdGFSYXRlID4gcFRzcGVjLT5taW5QaHlSYXRlKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJEYXRhIHJhdGUgKCVkKSBpcyBtb3JlIHRoYW4gUGh5cmF0ZSAlZFxuIiksCisgICAgICAgICAgICAgICBwVHNwZWMtPm1lYW5EYXRhUmF0ZSwgcFRzcGVjLT5taW5QaHlSYXRlKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgdHNwZWMgc3BlY2lmaWVzIGEgc2VydmljZSBpbnRlcnZhbCwgd2Ugd29uJ3QgYWNjZXB0IHRzcGVjJ3MKKyAgICAgKiB3aXRoIHNlcnZpY2UgaW50ZXJ2YWwgbGVzcyB0aGFuIG91ciBhbGxvd2VkIG1pbmltdW0sIGFsc28gZWl0aGVyIGJvdGgKKyAgICAgKiBtaW4gYW5kIG1heCBtdXN0IGJlIHNwZWNpZmllZCBvciBuZWl0aGVyIHNob3VsZCBiZSBzcGVjaWZpZWQgKGluIHdoaWNoCisgICAgICogY2FzZSwgSEMgZGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgc2VydmljZSBpbnRlcnZhbAorICAgICAqLworICAgIGlmICgocFRzcGVjLT5taW5TdmNJbnRlcnZhbCAhPSAwKSB8fCAocFRzcGVjLT5tYXhTdmNJbnRlcnZhbCAhPSAwKSkKKyAgICB7CisgICAgICAgIC8vIG1heCA8IG1pbiBpcyByaWRpY3Vsb3VzCisgICAgICAgIGlmIChwVHNwZWMtPm1heFN2Y0ludGVydmFsIDwgcFRzcGVjLT5taW5TdmNJbnRlcnZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJtYXhTdmNJbnQgJWQgID4gbWluU3ZjSW50ZXJ2YWwgJWQhIVxuIiksCisgICAgICAgICAgICAgICAgICAgcFRzcGVjLT5tYXhTdmNJbnRlcnZhbCwgcFRzcGVjLT5taW5TdmNJbnRlcnZhbCk7CisgICAgICAgICAgICByZXR2YWwgPSAgZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmIChwVHNwZWMtPm1heFN2Y0ludGVydmFsIDwgQURNSVRfQ09OVFJPTF9NSU5fSU5URVJWQUwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgibWF4U3ZjSW50ICVkIG11c3QgYmUgPiVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwVHNwZWMtPm1heFN2Y0ludGVydmFsLCBBRE1JVF9DT05UUk9MX01JTl9JTlRFUlZBTCk7CisgICAgICAgICAgICByZXR2YWwgPSAgZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gbWluIGFuZCBtYXggYm90aCB1bnNwZWNpZmllZAorICAgIHsKKyAgICAgICAgLyogbm8gc2VydmljZSBpbnRlcnZhbCBpcyBzcGVjaWZpZWQsIHNvIG1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVycworICAgICAgICAgKiBuZWVkZWQgdG8gZGV0ZXJtaW5lIG9uZSBhcmUgc3BlY2lmaWVkIGluIHRoZSB0c3BlYworICAgICAgICAgKiBtaW5QaHlSYXRlLCBtZWFuRGF0YVJhdGUgYW5kIG5vbU1zZHVTeiBhcmUgbmVlZGVkLCBvbmx5IG5vbU1zZHVTegorICAgICAgICAgKiBtdXN0IGJlIGNoZWNrZWQgaGVyZSBzaW5jZSB0aGUgb3RoZXIgdHdvIGFyZSBhbHJlYWR5IHZhbGlkYXRlZAorICAgICAgICAgKi8KKyAgICAgICAgIGlmIChwVHNwZWMtPm5vbU1zZHVTeiA9PSAwKQorICAgICAgICAgeworICAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIk5vIHN2Y0ludCBhbmQgbm8gTXNkdVNpemUgc3BlY2lmaWVkXG4iKSk7KQorICAgICAgICAgICAgIHJldHZhbCA9IGVTSVJfRkFJTFVSRTsKKyAgICAgICAgIH0KKyAgICB9CisKKyAgICBsaW1Mb2cocE1hYywgQURNSVRfQ09OVFJPTF9MT0dMRVZFTCwgRkwoInJldHVybiBzdGF0dXMgJWRcbiIpLCByZXR2YWwpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvL29ubHkgZWRjYSBpcyBzdXBwb3J0ZWQgbm93LgorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVZhbGlkYXRlVHNwZWNFZGNhCitcYnJpZWYgdmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIGVkY2EgdHNwZWMKKyAgICAgICAgIG1hbmRhdG9yeSBmaWVsZHMgYXJlIGRlcml2ZWQgZnJvbSAxMWUgQW5uZXggSSAoVGFibGUgSS4xKQorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworXHBhcmFtICAgICAgICB0U2lyTWFjVHNwZWNJRSAqcFRzcGVjCitccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdFNpclJldFN0YXR1cworbGltVmFsaWRhdGVUc3BlY0VkY2EoCisgICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgdFNpck1hY1RzcGVjSUUgKnBUc3BlYywKKyAgICB0cFBFU2Vzc2lvbiAgcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgICAgbWF4UGh5UmF0ZSwgbWluUGh5UmF0ZTsKKyAgICB0QU5JX1UzMiBwaHlNb2RlOworICAgIHRTaXJSZXRTdGF0dXMgcmV0dmFsID0gZVNJUl9TVUNDRVNTOworCisgICAgbGltR2V0UGh5TW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICAvL2xpbUdldEF2YWlsYWJsZUJ3KHBNYWMsICZtYXhQaHlSYXRlLCAmbWluUGh5UmF0ZSwgcE1hYy0+ZHBoLmdEcGhQaHlNb2RlLAorICAgIC8vICAgICAgICAgICAgICAgICAgMSAvKiBiYW5kd2lkdGggbXVsdCBmYWN0b3IgKi8pOworICAgIGxpbUdldEF2YWlsYWJsZUJ3KHBNYWMsICZtYXhQaHlSYXRlLCAmbWluUGh5UmF0ZSwgcGh5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAxIC8qIGJhbmR3aWR0aCBtdWx0IGZhY3RvciAqLyk7CisgICAgLy8gbWFuZGF0b3J5IGZpZWxkcyBhcmUgZGVyaXZlZCBmcm9tIDExZSBBbm5leCBJIChUYWJsZSBJLjEpCisgICAgaWYgKChwVHNwZWMtPm5vbU1zZHVTeiAgICA9PSAwKSB8fAorICAgICAgICAocFRzcGVjLT5tZWFuRGF0YVJhdGUgPT0gMCkgfHwKKyAgICAgICAgKHBUc3BlYy0+c3VycGx1c0J3ICAgID09IDApIHx8CisgICAgICAgIChwVHNwZWMtPm1pblBoeVJhdGUgICA9PSAwKSB8fAorICAgICAgICAocFRzcGVjLT5taW5QaHlSYXRlICAgPiBtYXhQaHlSYXRlKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiSW52YWxpZCBFRENBIFRzcGVjOiBOb21Nc2R1ICVkLCBtZWFuRGF0YVJhdGUgJWQsIHN1cnBsdXNCdyAlZCwgbWluUGh5UmF0ZSAlZFxuIiksCisgICAgICAgICAgICAgICBwVHNwZWMtPm5vbU1zZHVTeiwgcFRzcGVjLT5tZWFuRGF0YVJhdGUsIHBUc3BlYy0+c3VycGx1c0J3LCBwVHNwZWMtPm1pblBoeVJhdGUpOworICAgICAgICByZXR2YWwgPSBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgbGltTG9nKHBNYWMsIEFETUlUX0NPTlRST0xfTE9HTEVWRUwsIEZMKCJyZXR1cm4gc3RhdHVzICVkXG4iKSwgcmV0dmFsKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVZhbGlkYXRlVHNwZWMKK1xicmllZiB2YWxpZGF0ZSB0aGUgb2ZmZXJlZCB0c3BlYworXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworXHBhcmFtICAgICAgICAgdFNpck1hY1RzcGVjSUUgKnBUc3BlYworXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdFNpclJldFN0YXR1cworbGltVmFsaWRhdGVUc3BlYygKKyAgICB0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICB0U2lyTWFjVHNwZWNJRSAqcFRzcGVjLAorICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJSZXRTdGF0dXMgcmV0dmFsID0gZVNJUl9TVUNDRVNTOworICAgIHN3aXRjaCAocFRzcGVjLT50c2luZm8udHJhZmZpYy5hY2Nlc3NQb2xpY3kpCisgICAgeworICAgICAgICBjYXNlIFNJUl9NQUNfQUNDRVNTUE9MSUNZX0VEQ0E6CisgICAgICAgICAgICBpZiAoKHJldHZhbCA9IGxpbVZhbGlkYXRlVHNwZWNFZGNhKHBNYWMsIHBUc3BlYywgcHNlc3Npb25FbnRyeSkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJFRENBIHRzcGVjIGludmFsaWRcbiIpKTspCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9NQUNfQUNDRVNTUE9MSUNZX0hDQ0E6CisjaWYgMCAvL05vdCBzdXBwb3J0ZWQgcmlnaHQgbm93LiAgICAKKyAgICAgICAgICAgIGlmICgocmV0dmFsID0gbGltVmFsaWRhdGVUc3BlY0hjY2EocE1hYywgcFRzcGVjKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkhDQ0EgdHNwZWMgaW52YWxpZFxuIikpOykKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgY2FzZSBTSVJfTUFDX0FDQ0VTU1BPTElDWV9CT1RIOgorICAgICAgICAgLy8gVEJEOiBzaG91bGQgd2Ugc3VwcG9ydCBoeWJyaWQgdHNwZWMgYXMgd2VsbD8/IGZvciBub3csIGp1c3QgZmFsbCB0aHJvdWdoCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIkFjY2Vzc1R5cGUgJWQgbm90IHN1cHBvcnRlZFxuIiksCisgICAgICAgICAgICAgICAgICAgcFRzcGVjLT50c2luZm8udHJhZmZpYy5hY2Nlc3NQb2xpY3kpOworICAgICAgICAgICAgcmV0dmFsID0gZVNJUl9GQUlMVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFkbWl0IENvbnRyb2wgUG9saWN5CisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1Db21wdXRlTWVhbkJ3VXNlZAorXGJyaWVmIGRldGVybWltZSB0aGUgdXNlZC9hbGxvY2F0ZWQgYmFuZHdpZHRoCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICpwQncKK1xwYXJhbSAgICAgICB0QU5JX1UzMiAgICAgICAgICAgICAgIHBoeU1vZGUKK1xwYXJhbSAgICAgICB0cExpbVRzcGVjSW5mbyAgICBwVHNwZWNJbmZvCitccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkCitsaW1Db21wdXRlTWVhbkJ3VXNlZCgKKyAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjLAorICAgIHRBTklfVTMyICAgICAgICAgICAgICAqcEJ3LAorICAgIHRBTklfVTMyICAgICAgICAgICAgICAgcGh5TW9kZSwKKyAgICB0cExpbVRzcGVjSW5mbyAgICBwVHNwZWNJbmZvLAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMzIgY3RzcGVjOworICAgICpwQncgPSAwOworICAgIGZvciAoY3RzcGVjID0gMDsgY3RzcGVjIDwgTElNX05VTV9UU1BFQ19NQVg7IGN0c3BlYysrLCBwVHNwZWNJbmZvKyspCisgICAgeworICAgICAgICBpZiAocFRzcGVjSW5mby0+aW51c2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRwRHBoSGFzaE5vZGUgcFN0YSA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBwVHNwZWNJbmZvLT5hc3NvY0lkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgICAgICAgICBpZiAocFN0YSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG1heWJlIHdlIHNob3VsZCBkZWxldGUgdGhlIHRzcGVjPz8KKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlRzcGVjICVkIChhc3NvY0lkICVkKTogZHBoTm9kZSBub3QgZm91bmRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICBjdHNwZWMsIHBUc3BlY0luZm8tPmFzc29jSWQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9GSVhNRTogbmVlZCB0byB0YWtlIGNhcmUgb2YgdGF1cnVzUGVlciwgdGl0YW5QZWVyLCAxMW5wZWVyIHRvby4KKyAgICAgICAgICAgICpwQncgKz0gTElNX1NUQV9CV19BREpVU1QocFN0YS0+YW5pUGVlciwgcGh5TW9kZSwgcFRzcGVjSW5mby0+dHNwZWMubWVhbkRhdGFSYXRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1HZXRBdmFpbGFibGVCdworXGJyaWVmIGJhc2VkIG9uIHRoZSBwaHkgbW9kZSBhbmQgdGhlIGJ3X2ZhY3RvciwgZGV0ZXJtaW5lIHRoZSB0b3RhbCBiYW5kd2lkdGggdGhhdAorICAgICAgIGNhbiBiZSBzdXBwb3J0ZWQKK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xwYXJhbSAgICAgICB0QU5JX1UzMiAgICAgICAgICAgICAgKnBNYXhCdworXHBhcmFtICAgICAgIHRBTklfVTMyICAgICAgICAgICAgICAqcE1pbkJ3CitccGFyYW0gICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBwaHlNb2RlCitccGFyYW0gICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBid19mYWN0b3IKK1xyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQKK2xpbUdldEF2YWlsYWJsZUJ3KAorICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMsCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICpwTWF4QncsCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICpwTWluQncsCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBwaHlNb2RlLAorICAgIHRBTklfVTMyICAgICAgICAgICAgICAgYndfZmFjdG9yKQoreworICAgIHN3aXRjaCAocGh5TW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgV05JX0NGR19QSFlfTU9ERV8xMUI6CisgICAgICAgICAgICAqcE1heEJ3ID0gTElNX1RPVEFMX0JXXzExQjsKKyAgICAgICAgICAgICpwTWluQncgPSBMSU1fTUlOX0JXXzExQjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV05JX0NGR19QSFlfTU9ERV8xMUE6CisgICAgICAgICAgICAqcE1heEJ3ID0gTElNX1RPVEFMX0JXXzExQTsKKyAgICAgICAgICAgICpwTWluQncgPSBMSU1fTUlOX0JXXzExQTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV05JX0NGR19QSFlfTU9ERV8xMUc6CisgICAgICAgIGNhc2UgV05JX0NGR19QSFlfTU9ERV9OT05FOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgKnBNYXhCdyA9IExJTV9UT1RBTF9CV18xMUc7CisgICAgICAgICAgICAqcE1pbkJ3ID0gTElNX01JTl9CV18xMUc7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKnBNYXhCdyAqPSBid19mYWN0b3I7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltQWRtaXRQb2xpY3lPdmVyc3Vic2NyaXB0aW9uCitcYnJpZWYgc2ltcGxlIGFkbWlzc2lvbiBjb250cm9sIHBvbGljeSBiYXNlZCBvbiBvdmVyc3Vic2NyaXB0aW9uCisgICAgICAgICBpZiB0aGUgdG90YWwgYmFuZHdpZHRoIG9mIGFsbCBhZG1pdHRlZCB0c3BlYydzIGV4Y2VlZHMgKGZhY3RvciAqIHBoeS1idykgdGhlbgorICAgICAgICAgcmVqZWN0IHRoZSB0c3BlYywgZWxzZSBhZG1pdCBpdC4gVGhlIHBoeS1idyBpcyB0aGUgcGVhayBhdmFpbGFibGUgYncgaW4gdGhlCisgICAgICAgICBjdXJyZW50IHBoeSBtb2RlLiBUaGUgJ2ZhY3RvcicgaXMgdGhlIGNvbmZpZ3VyZWQgb3ZlcnN1YnNjcmlwdGlvbiBmYWN0b3IuCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gICAgICAgdFNpck1hY1RzcGVjSUUgICAgICAgKnBUc3BlYworXHBhcmFtICAgICAgIHRwTGltQWRtaXRQb2xpY3lJbmZvICBwQWRtaXRQb2xpY3kKK1xwYXJhbSAgICAgICB0cExpbVRzcGVjSW5mbyAgICAgICAgcFRzcGVjSW5mbworXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogc2ltcGxlIGFkbWlzc2lvbiBjb250cm9sIHBvbGljeSBiYXNlZCBvbiBvdmVyc3Vic2NyaXB0aW9uCisgKiBpZiB0aGUgdG90YWwgYmFuZHdpZHRoIG9mIGFsbCBhZG1pdHRlZCB0c3BlYydzIGV4Y2VlZHMgKGZhY3RvciAqIHBoeS1idykgdGhlbgorICogcmVqZWN0IHRoZSB0c3BlYywgZWxzZSBhZG1pdCBpdC4gVGhlIHBoeS1idyBpcyB0aGUgcGVhayBhdmFpbGFibGUgYncgaW4gdGhlCisgKiBjdXJyZW50IHBoeSBtb2RlLiBUaGUgJ2ZhY3RvcicgaXMgdGhlIGNvbmZpZ3VyZWQgb3ZlcnN1YnNjcmlwdGlvbiBmYWN0b3IuCisgKi8KK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitsaW1BZG1pdFBvbGljeU92ZXJzdWJzY3JpcHRpb24oCisgICAgdHBBbmlTaXJHbG9iYWwgICAgICAgIHBNYWMsCisgICAgdFNpck1hY1RzcGVjSUUgICAgICAgKnBUc3BlYywKKyAgICB0cExpbUFkbWl0UG9saWN5SW5mbyAgcEFkbWl0UG9saWN5LAorICAgIHRwTGltVHNwZWNJbmZvICAgICAgICBwVHNwZWNJbmZvLAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMzIgdG90YWxidywgbWluYncsIHVzZWRidzsKKyAgICB0QU5JX1UzMiBwaHlNb2RlOworCisgICAgLy8gZGV0ZXJtaW5lIHRvdGFsIGJhbmR3aWR0aCB1c2VkIHNvIGZhcgorICAgIGxpbUdldFBoeU1vZGUocE1hYywgJnBoeU1vZGUsIHBzZXNzaW9uRW50cnkpOworCisgICAgLy9saW1Db21wdXRlTWVhbkJ3VXNlZChwTWFjLCAmdXNlZGJ3LCBwTWFjLT5kcGguZ0RwaFBoeU1vZGUsIHBUc3BlY0luZm8pOworICAgIGxpbUNvbXB1dGVNZWFuQndVc2VkKHBNYWMsICZ1c2VkYncsIHBoeU1vZGUsIHBUc3BlY0luZm8sIHBzZXNzaW9uRW50cnkpOworCisgICAgLy8gZGV0ZXJtaW5lIGhvdyBtdWNoIGJhbmR3aWR0aCBpcyBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgcGh5IG1vZGUKKyAgICAvL2xpbUdldEF2YWlsYWJsZUJ3KHBNYWMsICZ0b3RhbGJ3LCAmbWluYncsIHBNYWMtPmRwaC5nRHBoUGh5TW9kZSwgcEFkbWl0UG9saWN5LT5id19mYWN0b3IpOworICAgIGxpbUdldEF2YWlsYWJsZUJ3KHBNYWMsICZ0b3RhbGJ3LCAmbWluYncsIHBoeU1vZGUsIHBBZG1pdFBvbGljeS0+YndfZmFjdG9yKTsKKworICAgIGlmICh1c2VkYncgPiB0b3RhbGJ3KSAvLyB0aGlzIGNhbid0IHBvc3NpYmx5IGhhcHBlbgorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgaWYgKCh0b3RhbGJ3IC0gdXNlZGJ3KSA8IHBUc3BlYy0+bWVhbkRhdGFSYXRlKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIEFETUlUX0NPTlRST0xfUE9MSUNZX0xPR0xFVkVMLAorICAgICAgICAgICAgICAgRkwoIlRvdGFsIEJXICVkLCBVc2VkICVkLCBUc3BlYyByZXF1ZXN0ICVkIG5vdCBwb3NzaWJsZVxuIiksCisgICAgICAgICAgICAgICB0b3RhbGJ3LCB1c2VkYncsIHBUc3BlYy0+bWVhbkRhdGFSYXRlKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1BZG1pdFBvbGljeQorXGJyaWVmIGRldGVybWluZSB0aGUgY3VycmVudCBhZG1pdCBjb250cm9sIHBvbGljeSBhbmQgYXBwbHkgaXQgZm9yIHRoZSBvZmZlcmVkIHRzcGVjCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gICAgICAgICB0U2lyTWFjVHNwZWNJRSAgICpwVHNwZWMKK1xyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBsaW1BZG1pdFBvbGljeSgKKyAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjLAorICAgIHRTaXJNYWNUc3BlY0lFICAgKnBUc3BlYywKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJSZXRTdGF0dXMgcmV0dmFsID0gZVNJUl9GQUlMVVJFOworICAgIHRwTGltQWRtaXRQb2xpY3lJbmZvIHBBZG1pdFBvbGljeSA9ICZwTWFjLT5saW0uYWRtaXRQb2xpY3lJbmZvOworCisgICAgc3dpdGNoIChwQWRtaXRQb2xpY3ktPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIFdOSV9DRkdfQURNSVRfUE9MSUNZX0FETUlUX0FMTDoKKyAgICAgICAgICAgIHJldHZhbCA9IGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV05JX0NGR19BRE1JVF9QT0xJQ1lfQldfRkFDVE9SOgorICAgICAgICAgICAgcmV0dmFsID0gbGltQWRtaXRQb2xpY3lPdmVyc3Vic2NyaXB0aW9uKHBNYWMsIHBUc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICZwTWFjLT5saW0uYWRtaXRQb2xpY3lJbmZvLCAmcE1hYy0+bGltLnRzcGVjSW5mb1swXSwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICBpZiAocmV0dmFsICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJyZWplY3RlZCBieSBCV0ZhY3RvciBwb2xpY3lcbiIpKTspCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdOSV9DRkdfQURNSVRfUE9MSUNZX1JFSkVDVF9BTEw6CisgICAgICAgICAgICByZXR2YWwgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dmFsID0gZVNJUl9TVUNDRVNTOworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJBZG1pdCBQb2xpY3kgJWQgdW5rbm93biwgYWRtaXR0aW5nIGFsbCB0cmFmZmljXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwQWRtaXRQb2xpY3ktPnR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltVHNwZWNEZWxldGUKK1xicmllZiBkZWxldGUgdGhlIHNwZWNpZmllZCB0c3BlYworXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworXHBhcmFtICAgICB0cExpbVRzcGVjSW5mbyBwSW5mbworXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZWxldGUgdGhlIHNwZWNpZmllZCB0c3BlYwordm9pZCBsaW1Uc3BlY0RlbGV0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cExpbVRzcGVjSW5mbyBwSW5mbykKK3sKKyAgICBpZiAocEluZm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAvL3BpZXJyZQorICAgIGxpbUxvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgidHNwZWMgZW50cnkgPSAlZFxuIiksIHBJbmZvLT5pZHgpOworICAgIGxpbUxvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgiZGVsZXRlIHRzcGVjICUwOFhcbiIpLHBJbmZvKTsKKyAgICBwSW5mby0+aW51c2UgPSAwOworCisgICAgLy8gY2xlYXIgdGhlIGhjY2EvcGFyYW1ldGVyaXplZCBxdWV1ZSBpbmRpY2F0b3IKKyNpZiAwCisgICAgaWYgKChwSW5mby0+dHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX1VQTElOSykgfHwKKyAgICAgICAgKHBJbmZvLT50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fQklESVIpKQorICAgICAgICBxdWV1ZVtwSW5mby0+c3RhaWRdW3BJbmZvLT50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpb11bU0NIX1VMX1FVRVVFXS50cyA9IDA7CisjZW5kaWYKKworICAgIHJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1Uc3BlY0ZpbmRCeVN0YUFkZHIKK1xicmllZiBTZW5kIGhhbE1zZ19BZGRUcyB0byBIQUwKK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xwYXJhbSAgIFxwYXJhbSAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgKnBBZGRyCitccGFyYW0gICAgICAgdFNpck1hY1RzcGVjSUUgICAgKnBUc3BlY0lFCitccGFyYW0gICAgICAgdHBMaW1Uc3BlY0luZm8gICAgcFRzcGVjTGlzdAorXHBhcmFtICAgICAgIHRwTGltVHNwZWNJbmZvICAgKnBwSW5mbworXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyBmaW5kIHRoZSBzcGVjaWZpZWQgdHNwZWMgaW4gdGhlIGxpc3QKK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitsaW1Uc3BlY0ZpbmRCeVN0YUFkZHIoCisgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYywKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgKnBBZGRyLAorICAgIHRTaXJNYWNUc3BlY0lFICAgICpwVHNwZWNJRSwKKyAgICB0cExpbVRzcGVjSW5mbyAgICBwVHNwZWNMaXN0LAorICAgIHRwTGltVHNwZWNJbmZvICAgKnBwSW5mbykKK3sKKyAgICBpbnQgY3RzcGVjOworCisgICAgKnBwSW5mbyA9IE5VTEw7CisKKyAgICBmb3IgKGN0c3BlYyA9IDA7IGN0c3BlYyA8IExJTV9OVU1fVFNQRUNfTUFYOyBjdHNwZWMrKywgcFRzcGVjTGlzdCsrKQorICAgIHsKKyAgICAgICAgaWYgKChwVHNwZWNMaXN0LT5pbnVzZSkKKyAgICAgICAgICAgICYmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCxwQWRkciwgcFRzcGVjTGlzdC0+c3RhQWRkciwgc2l6ZW9mKHBUc3BlY0xpc3QtPnN0YUFkZHIpKSkKKyAgICAgICAgICAgICYmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwodEFOSV9VOCAqKSBwVHNwZWNJRSwgKHRBTklfVTggKikgJnBUc3BlY0xpc3QtPnRzcGVjLCBzaXplb2YodFNpck1hY1RzcGVjSUUpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwcEluZm8gPSBwVHNwZWNMaXN0OworICAgICAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVRzcGVjRmluZEJ5QXNzb2NJZAorXGJyaWVmIGZpbmQgdHNwZWMgd2l0aCBtYXRjaGluIHN0YWlkIGFuZCBUc3BlYyAKK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xwYXJhbSAgICAgICB0QU5JX1UzMiAgICAgICAgICAgICAgIHN0YWlkCitccGFyYW0gICAgICAgdFNpck1hY1RzcGVjSUUgICAgKnBUc3BlY0lFCitccGFyYW0gICAgICAgdHBMaW1Uc3BlY0luZm8gICAgcFRzcGVjTGlzdAorXHBhcmFtICAgICAgIHRwTGltVHNwZWNJbmZvICAgKnBwSW5mbworXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzCitsaW1Uc3BlY0ZpbmRCeUFzc29jSWQoCisgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYywKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgIGFzc29jSWQsCisgICAgdFNpck1hY1RzcGVjSUUgKnBUc3BlY0lFLAorICAgIHRwTGltVHNwZWNJbmZvICAgIHBUc3BlY0xpc3QsCisgICAgdHBMaW1Uc3BlY0luZm8gICAqcHBJbmZvKQoreworICAgIGludCBjdHNwZWM7CisKKyAgICAqcHBJbmZvID0gTlVMTDsKKworICAgIGxpbUxvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgiVHJ5aW5nIHRvIGZpbmQgdHNwZWMgZW50cnkgZm9yIGFzc29jSWQgPSAlZFxuIiksIGFzc29jSWQpOworICAgIGxpbUxvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgicFRzSW5mby0+dHJhZmZpYy5kaXJlY3Rpb24gPSAlZCwgcFRzSW5mby0+dHJhZmZpYy50c2lkID0gJWRcbiIpLAorICAgICAgICAgICAgICAgIHBUc3BlY0lFLT50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24sIHBUc3BlY0lFLT50c2luZm8udHJhZmZpYy50c2lkKTsKKworICAgIGZvciAoY3RzcGVjID0gMDsgY3RzcGVjIDwgTElNX05VTV9UU1BFQ19NQVg7IGN0c3BlYysrLCBwVHNwZWNMaXN0KyspCisgICAgeworICAgICAgICBpZiAoKHBUc3BlY0xpc3QtPmludXNlKQorICAgICAgICAgICAgJiYgKGFzc29jSWQgPT0gcFRzcGVjTGlzdC0+YXNzb2NJZCkKKyAgICAgICAgICAgICYmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwodEFOSV9VOCAqKSBwVHNwZWNJRSwgKHRBTklfVTggKikgJnBUc3BlY0xpc3QtPnRzcGVjLCBzaXplb2YodFNpck1hY1RzcGVjSUUpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwcEluZm8gPSBwVHNwZWNMaXN0OworICAgICAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbUZpbmRUc3BlYworXGJyaWVmIGZpbmRpbmcgYSBUU1BFQyBlbnRyeSB3aXRoIGFzc29jSWQsIHRzaW5mby5kaXJlY3Rpb24gYW5kIHRzaW5mby50c2lkCitccGFyYW0gICAgdEFOSV9VMTYgICAgICAgICAgICAgICBhc3NvY0lkCitccGFyYW0gICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xwYXJhbSAgICAgdFNpck1hY1RTSW5mbyAgICpwVHNJbmZvCitccGFyYW0gICAgICAgICB0cExpbVRzcGVjSW5mbyAgICBwVHNwZWNMaXN0CitccGFyYW0gICAgICAgICB0cExpbVRzcGVjSW5mbyAgICpwcEluZm8KK1xyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cyBvZiB0aGUgY29tcGFyaXNvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cworbGltRmluZFRzcGVjKAorICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMsCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICBhc3NvY0lkLCAgICAKKyAgICB0U2lyTWFjVFNJbmZvICAgKnBUc0luZm8sCisgICAgdHBMaW1Uc3BlY0luZm8gICAgcFRzcGVjTGlzdCwKKyAgICB0cExpbVRzcGVjSW5mbyAgICpwcEluZm8pCit7CisgICAgaW50IGN0c3BlYzsKKworICAgICpwcEluZm8gPSBOVUxMOworCisgICAgbGltTG9nKHBNYWMsIEFETUlUX0NPTlRST0xfTE9HTEVWRUwsIEZMKCJUcnlpbmcgdG8gZmluZCB0c3BlYyBlbnRyeSBmb3IgYXNzb2NJZCA9ICVkXG4iKSwgYXNzb2NJZCk7CisgICAgbGltTG9nKHBNYWMsIEFETUlUX0NPTlRST0xfTE9HTEVWRUwsIEZMKCJwVHNJbmZvLT50cmFmZmljLmRpcmVjdGlvbiA9ICVkLCBwVHNJbmZvLT50cmFmZmljLnRzaWQgPSAlZFxuIiksCisgICAgICAgICAgICAgICAgcFRzSW5mby0+dHJhZmZpYy5kaXJlY3Rpb24sIHBUc0luZm8tPnRyYWZmaWMudHNpZCk7CisKKyAgICBmb3IgKGN0c3BlYyA9IDA7IGN0c3BlYyA8IExJTV9OVU1fVFNQRUNfTUFYOyBjdHNwZWMrKywgcFRzcGVjTGlzdCsrKQorICAgIHsKKyAgICAgICAgaWYgKChwVHNwZWNMaXN0LT5pbnVzZSkKKyAgICAgICAgICAgICYmIChhc3NvY0lkID09IHBUc3BlY0xpc3QtPmFzc29jSWQpCisgICAgICAgICAgICAmJiAocFRzSW5mby0+dHJhZmZpYy5kaXJlY3Rpb24gPT0gcFRzcGVjTGlzdC0+dHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uKQorICAgICAgICAgICAgJiYgKHBUc0luZm8tPnRyYWZmaWMudHNpZCA9PSBwVHNwZWNMaXN0LT50c3BlYy50c2luZm8udHJhZmZpYy50c2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBwSW5mbyA9IHBUc3BlY0xpc3Q7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltVHNwZWNBZGQKK1xicmllZiBhZGQgb3IgdXBkYXRlIHRoZSBzcGVjaWZpZWQgdHNwZWMgdG8gdGhlIHRzcGVjIGxpc3QKK1xwYXJhbSB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gdEFOSV9VOCAgICAgICAgICAgICAgICpwQWRkcgorXHBhcmFtIHRBTklfVTE2ICAgICAgICAgICAgICAgYXNzb2NJZAorXHBhcmFtIHRTaXJNYWNUc3BlY0lFICAgKnBUc3BlYworXHBhcmFtIHRBTklfVTMyICAgICAgICAgICAgICAgaW50ZXJ2YWwKK1xwYXJhbSB0cExpbVRzcGVjSW5mbyAgICpwcEluZm8KKworXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzIG9mIHRoZSBjb21wYXJpc29uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzIGxpbVRzcGVjQWRkKAorICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMsCisgICAgdEFOSV9VOCAgICAgICAgICAgKnBBZGRyLAorICAgIHRBTklfVTE2ICAgICAgICAgIGFzc29jSWQsCisgICAgdFNpck1hY1RzcGVjSUUgICAgKnBUc3BlYywKKyAgICB0QU5JX1UzMiAgICAgICAgICBpbnRlcnZhbCwKKyAgICB0cExpbVRzcGVjSW5mbyAgICAqcHBJbmZvKQoreworICAgIHRwTGltVHNwZWNJbmZvIHBUc3BlY0xpc3QgPSAmcE1hYy0+bGltLnRzcGVjSW5mb1swXTsKKyAgICAqcHBJbmZvID0gTlVMTDsgICAgCisKKyAgICAvLyB2YWxpZGF0ZSB0aGUgYXNzb2NJZAorICAgIGlmIChhc3NvY0lkID49IHBNYWMtPmxpbS5tYXhTdGF0aW9uKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBhc3NvY0lkIDB4JXhcbiIpLCBhc3NvY0lkKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy9kZWNpZGUgd2hldGhlciB0byBhZGQvdXBkYXRlCisgICAgeworICAgICAgKnBwSW5mbyA9IE5VTEw7CisKKyAgICAgIGlmKGVTSVJfU1VDQ0VTUyA9PSBsaW1GaW5kVHNwZWMocE1hYywgYXNzb2NJZCwgJnBUc3BlYy0+dHNpbmZvLCBwVHNwZWNMaXN0LCBwcEluZm8pKQorICAgICAgeworICAgICAgICAgICAgLy91cGRhdGUgdGhpcyBlbnRyeS4KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgidXBkYXRpbmcgVFNQRUMgdGFibGUgZW50cnkgPSAlZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCpwcEluZm8pLT5pZHgpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIC8qIFdlIGRpZG4ndCBmaW5kIG9uZSB0byB1cGRhdGUuIFNvIGZpbmQgYSBmcmVlIHNsb3QgaW4gdGhlIAorICAgICAgICAgICAqIExJTSBUU1BFQyBsaXN0IGFuZCBhZGQgdGhpcyBuZXcgZW50cnkKKyAgICAgICAgICAgKi8gCisgICAgICAgICAgdEFOSV9VOCBjdHNwZWMgPSAwOworICAgICAgICAgIGZvciAoY3RzcGVjID0gMCAsIHBUc3BlY0xpc3QgPSAmcE1hYy0+bGltLnRzcGVjSW5mb1swXTsgY3RzcGVjIDwgTElNX05VTV9UU1BFQ19NQVg7IGN0c3BlYysrLCBwVHNwZWNMaXN0KyspCisgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoISBwVHNwZWNMaXN0LT5pbnVzZSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJGb3VuZCBmcmVlIHNsb3QgaW4gVFNQRUMgbGlzdC4gQWRkIHRvIFRTUEVDIHRhYmxlIGVudHJ5ICVkIiksIGN0c3BlYyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChjdHNwZWMgPj0gTElNX05VTV9UU1BFQ19NQVgpCisgICAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAgICAgICAvL1JlY29yZCB0aGUgbmV3IGluZGV4IGVudHJ5IAorICAgICAgICAgIHBUc3BlY0xpc3QtPmlkeCA9IGN0c3BlYzsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1cGRhdGUgdGhlIHRzcGVjIGluZm8KKyAgICBwVHNwZWNMaXN0LT50c3BlYyA9ICpwVHNwZWM7CisgICAgcFRzcGVjTGlzdC0+YXNzb2NJZCA9IGFzc29jSWQ7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFRzcGVjTGlzdC0+c3RhQWRkciwgcEFkZHIsIHNpemVvZihwVHNwZWNMaXN0LT5zdGFBZGRyKSk7CisKKyAgICAvLyBmb3IgZWRjYSB0c3BlYydzLCB3ZSBhcmUgYWxsIGRvbmUKKyAgICBpZiAocFRzcGVjLT50c2luZm8udHJhZmZpYy5hY2Nlc3NQb2xpY3kgPT0gU0lSX01BQ19BQ0NFU1NQT0xJQ1lfRURDQSkKKyAgICB7CisgICAgICAgIHBUc3BlY0xpc3QtPmludXNlID0gMTsKKyAgICAgICAgKnBwSW5mbyA9IHBUc3BlY0xpc3Q7CisgICAgICAgIGxpbUxvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgiYWRkZWQgZW50cnkgZm9yIEVEQ0EgQWNjZXNzUG9saWN5XG4iKSk7CisgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBmb3IgaGNjYSB0c3BlYydzLCBtdXN0IHNldCB0aGUgcGFyYW1ldGVyaXplZCBiaXQgaW4gdGhlIHF1ZXVlcworICAgICAqIHRoZSAndHMnIGJpdCBpbiB0aGUgcXVldWUgZGF0YSBzdHJ1Y3R1cmUgaW5kaWNhdGVzIHRoYXQgdGhlIHF1ZXVlIGlzCisgICAgICogcGFyYW1ldGVyaXplZCAoaGNjYSkuIFdoZW4gdGhlIHNjaGVkdWxlIGlzIHdyaXR0ZW4gdGhpcyBiaXQgaXMgdXNlZAorICAgICAqIGluIHRoZSB0c2lkIGZpZWxkIChiaXQgMykgYW5kIHRoZSBvdGhlciB0aHJlZSBiaXRzICgwLTIpIGFyZSBzaW1wbHkKKyAgICAgKiBmaWxsZWQgaW4gYXMgdGhlIHVzZXIgcHJpb3JpdHkgKG9yIHFpZCkuIFRoaXMgYXBwbGllcyBvbmx5IHRvIHVwbGluaworICAgICAqIHBvbGxzIHdoZXJlIHRoZSBxb3MgY29udHJvbCBmaWVsZCBtdXN0IGNvbnRhaW4gdGhlIHRzaWQgc3BlY2lmaWVkIGluIHRoZQorICAgICAqIHRzcGVjLgorICAgICAqLworI2lmIDAKKyAgICBpZiAoKHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX1VQTElOSykgfHwKKyAgICAgICAgKHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX0JJRElSKSkKKyAgICAgICAgcXVldWVbc3RhaWRdW3BUc3BlYy0+dHNpbmZvLnRyYWZmaWMudXNlclByaW9dW1NDSF9VTF9RVUVVRV0udHMgPSAxOworI2VuZGlmCisgICAgcFRzcGVjTGlzdC0+aW51c2UgPSAxOworICAgICpwcEluZm8gPSBwVHNwZWNMaXN0OworICAgIGxpbUxvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgiYWRkZWQgZW50cnkgZm9yIEhDQ0EgQWNjZXNzUG9saWN5XG4iKSk7CisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1WYWxpZGF0ZUFjY2Vzc1BvbGljeQorXGJyaWVmIFZhbGlkYXRlcyBBY2Nlc3MgcG9saWN5CitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gICAgICAgdEFOSV9VOCAgICAgICAgICAgICAgYWNjZXNzUG9saWN5CitccGFyYW0gICAgICAgdEFOSV9VMTYgICAgICAgICAgICAgYXNzb2NJZAorXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdFNpclJldFN0YXR1cworbGltVmFsaWRhdGVBY2Nlc3NQb2xpY3koCisgICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgYWNjZXNzUG9saWN5LAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICBhc3NvY0lkLAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFNpclJldFN0YXR1cyByZXR2YWwgPSBlU0lSX0ZBSUxVUkU7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIGFzc29jSWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgIGlmICgocFN0YSA9PSBOVUxMKSB8fCAoISBwU3RhLT52YWxpZCkpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJpbnZhbGlkIHN0YXRpb24gYWRkcmVzcyBwYXNzZWRcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgc3dpdGNoIChhY2Nlc3NQb2xpY3kpCisgICAgeworICAgICAgICBjYXNlIFNJUl9NQUNfQUNDRVNTUE9MSUNZX0VEQ0E6CisgICAgICAgICAgICBpZiAocFN0YS0+d21lRW5hYmxlZCB8fCBwU3RhLT5sbGVFbmFibGVkKQorICAgICAgICAgICAgICAgIHJldHZhbCA9IGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lSX01BQ19BQ0NFU1NQT0xJQ1lfSENDQToKKyAgICAgICAgY2FzZSBTSVJfTUFDX0FDQ0VTU1BPTElDWV9CT1RIOgorI2lmIDAgLy9vbmx5IEVEQ0Egc3VwcG9ydGVkIGZvciBub3cuICAgICAgICAgIAorICAgICAgICAgICAgLy8gVEJEOiBjaGVjayB3c20gZG9lc24ndCBzdXBwb3J0IHRoZSBoeWJyaWQgYWNjZXNzIHBvbGljeQorICAgICAgICAgICAgaWYgKHBTdGEtPndzbUVuYWJsZWQgfHwgcFN0YS0+bGxlRW5hYmxlZCkKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBlU0lSX1NVQ0NFU1M7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAgLy9vbmx5IEVEQ0Egc3VwcG9ydGVkIGZvciBub3cuCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIGFjY2Vzc1BvbGljeSAlZFxuIiksIGFjY2Vzc1BvbGljeSk7KQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHJldHZhbCAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiZmFpbGVkIChhY2NQb2wgJWQsIHN0YUlkICVkLCBsbGUgJWQsIHdtZSAlZCwgd3NtICVkKVxuIiksCisgICAgICAgICAgICAgICBhY2Nlc3NQb2xpY3ksIHBTdGEtPnN0YUluZGV4LCBwU3RhLT5sbGVFbmFibGVkLCBwU3RhLT53bWVFbmFibGVkLCBwU3RhLT53c21FbmFibGVkKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltQWRtaXRDb250cm9sQWRkVFMKK1xicmllZiBEZXRlcm1pbmUgaWYgU1RBIHdpdGggdGhlIHNwZWNpZmllZCBUU1BFQyBjYW4gYmUgYWRtaXR0ZWQuIElmIGl0IGNhbiwKKyAgICAgYSBzY2hlZHVsZSBlbGVtZW50IGlzIHByb3ZpZGVkCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gICAgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICpwQWRkciwKK1xwYXJhbSAgICAgICB0U2lyQWRkdHNSZXFJbmZvICAgICAgICpwQWRkdHMsCitccGFyYW0gICAgICAgdFNpck1hY1Fvc0NhcGFiaWxpdHlJRSAqcFFvcywKK1xwYXJhbSAgICAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgIGFzc29jSWQsIC8vIGFzc29jSWQsIHZhbGlkIG9ubHkgaWYgYWxsb2M9PXRydWUKK1xwYXJhbSAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICBhbGxvYywgLy8gdHJ1ZT0+YWxsb2NhdGUgYncgZm9yIHRoaXMgdHNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgZGV0ZXJtaW5lIG9ubHkgaWYgc3BhY2UgaXMgYXZhaWxhYmxlCitccGFyYW0gICAgICAgdFNpck1hY1NjaGVkdWxlSUUgICAgICAqcFNjaCwKK1xwYXJhbSAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICpwVHNwZWNJZHggLy9pbmRleCB0byB0aGUgbGltIHRzcGVjIHRhYmxlLgorXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzIGxpbUFkbWl0Q29udHJvbEFkZFRTKAorICAgIHRwQW5pU2lyR2xvYmFsICAgICAgICAgIHBNYWMsCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICpwQWRkciwKKyAgICB0U2lyQWRkdHNSZXFJbmZvICAgICAgICpwQWRkdHMsCisgICAgdFNpck1hY1Fvc0NhcGFiaWxpdHlTdGFJRSAqcFFvcywKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgIGFzc29jSWQsIC8vIGFzc29jSWQsIHZhbGlkIG9ubHkgaWYgYWxsb2M9PXRydWUKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICBhbGxvYywgLy8gdHJ1ZT0+YWxsb2NhdGUgYncgZm9yIHRoaXMgdHNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgZGV0ZXJtaW5lIG9ubHkgaWYgc3BhY2UgaXMgYXZhaWxhYmxlCisgICAgdFNpck1hY1NjaGVkdWxlSUUgICAgICAqcFNjaCwKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICpwVHNwZWNJZHgsIC8vaW5kZXggdG8gdGhlIGxpbSB0c3BlYyB0YWJsZS4KKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5CisgICAgKQoreworICAgIHRwTGltVHNwZWNJbmZvIHBUc3BlY0luZm87CisgICAgdFNpclJldFN0YXR1cyAgcmV0dmFsOworICAgIHRBTklfVTMyICAgICAgICAgICAgc3ZjSW50ZXJ2YWw7CisgICAgKHZvaWQpIHBRb3M7CisKKyAgICAvLyBUQkQ6IG1vZGlmeSB0c3BlYyBhcyBuZWVkZWQKKyAgICAvLyBFRENBOiBuZWVkIHRvIGZpbGwgaW4gdGhlIG1lZGl1bSB0aW1lIGFuZCB0aGUgbWluaW11bSBwaHkgcmF0ZQorICAgIC8vIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGVzaXJlZCB0cmFmZmljIHBhcmFtZXRlcnMuCisKKyAgICBsaW1Mb2cocE1hYywgQURNSVRfQ09OVFJPTF9MT0dMRVZFTCwgRkwoInRzaWQgJWQsIGRpcmVjdG4gJWQsIHN0YXJ0ICVkLCBpbnR2bCAlZCwgYWNjUG9saWN5ICVkLCB1cCAlZFxuIiksCisgICAgICAgICAgIHBBZGR0cy0+dHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZCwgcEFkZHRzLT50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24sCisgICAgICAgICAgIHBBZGR0cy0+dHNwZWMuc3ZjU3RhcnRUaW1lLCBwQWRkdHMtPnRzcGVjLm1pblN2Y0ludGVydmFsLAorICAgICAgICAgICBwQWRkdHMtPnRzcGVjLnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSwgcEFkZHRzLT50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbyk7CisKKyAgICAvLyBjaGVjayBmb3IgZHVwbGljYXRlIHRzcGVjCisgICAgcmV0dmFsID0gKGFsbG9jKQorICAgICAgICAgICAgICA/IGxpbVRzcGVjRmluZEJ5QXNzb2NJZChwTWFjLCBhc3NvY0lkLCAmcEFkZHRzLT50c3BlYywgJnBNYWMtPmxpbS50c3BlY0luZm9bMF0sICZwVHNwZWNJbmZvKQorICAgICAgICAgICAgICA6IGxpbVRzcGVjRmluZEJ5U3RhQWRkcihwTWFjLCBwQWRkciwgJnBBZGR0cy0+dHNwZWMsICZwTWFjLT5saW0udHNwZWNJbmZvWzBdLCAmcFRzcGVjSW5mbyk7CisKKyAgICBpZiAocmV0dmFsID09IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgiZHVwbGljYXRlIHRzcGVjIChpbmRleCAlZCkhXG4iKSwgcFRzcGVjSW5mby0+aWR4KTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBjaGVjayB0aGF0IHRoZSB0c3BlYydzIGFyZSB3ZWxsIGZvcm1lZCBhbmQgYWNjZXB0YWJsZQorICAgIGlmIChsaW1WYWxpZGF0ZVRzcGVjKHBNYWMsICZwQWRkdHMtPnRzcGVjLCBwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJ0c3BlYyB2YWxpZGF0aW9uIGZhaWxlZFxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBkZXRlcm1pbmUgYSBzZXJ2aWNlIGludGVydmFsIGZvciB0aGUgdHNwZWMKKyAgICBpZiAobGltQ2FsY3VsYXRlU3ZjSW50KHBNYWMsICZwQWRkdHMtPnRzcGVjLCAmc3ZjSW50ZXJ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIlN2Y0ludCBjYWxjdWxhdGUgZmFpbGVkXG4iKSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIC8vIGRldGVybWluZSBpZiB0aGUgdHNwZWMgY2FuIGJlIGFkbWl0dGVkIG9yIG5vdCBiYXNlZCBvbiBjdXJyZW50IHBvbGljeQorICAgIGlmIChsaW1BZG1pdFBvbGljeShwTWFjLCAmcEFkZHRzLT50c3BlYywgcHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgidHNwZWMgcmVqZWN0ZWQgYnkgYWRtaXQgY29udHJvbCBwb2xpY3lcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gZmlsbCBpbiBhIHNjaGVkdWxlIGlmIHJlcXVlc3RlZAorICAgIGlmIChwU2NoICE9IE5VTEwpCisgICAgeworICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwU2NoLCBzaXplb2YoKnBTY2gpKTsKKyAgICAgICAgcFNjaC0+c3ZjU3RhcnRUaW1lICAgPSBwQWRkdHMtPnRzcGVjLnN2Y1N0YXJ0VGltZTsKKyAgICAgICAgcFNjaC0+c3ZjSW50ZXJ2YWwgICAgPSBzdmNJbnRlcnZhbDsKKyAgICAgICAgcFNjaC0+bWF4U3ZjRHVyYXRpb24gPSAodEFOSV9VMTYpIHBTY2gtPnN2Y0ludGVydmFsOyAvLyB1c2UgU1AgPSBTSQorICAgICAgICBwU2NoLT5zcGVjSW50ZXJ2YWwgICA9IDB4MTAwMDsgLy8gZml4ZWQgZm9yIG5vdzogVEJECisKKyAgICAgICAgcFNjaC0+aW5mby5kaXJlY3Rpb24gICA9IHBBZGR0cy0+dHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uOworICAgICAgICBwU2NoLT5pbmZvLnRzaWQgICAgICAgID0gcEFkZHRzLT50c3BlYy50c2luZm8udHJhZmZpYy50c2lkOworICAgICAgICBwU2NoLT5pbmZvLmFnZ3JlZ2F0aW9uID0gMDsgLy8gbm8gc3VwcG9ydCBmb3IgYWdncmVnYXRpb24gZm9yIG5vdzogVEJECisgICAgfQorCisgICAgLy8gaWYgbm8gYWxsb2NhdGlvbiBpcyByZXF1ZXN0ZWQsIGRvbmUKKyAgICBpZiAoISBhbGxvYykKKyAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworICAgIC8vIGNoZWNrIHRoYXQgd2UgYXJlIGluIHRoZSBwcm9wZXIgbW9kZSB0byBkZWFsIHdpdGggdGhlIHRzcGVjIHR5cGUKKyAgICBpZiAobGltVmFsaWRhdGVBY2Nlc3NQb2xpY3kocE1hYywgKHRBTklfVTgpIHBBZGR0cy0+dHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5LCBhc3NvY0lkLCBwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIkFjY2Vzc1BvbGljeSAlZCBpcyBub3QgdmFsaWQgaW4gY3VycmVudCBtb2RlXG4iKSwKKyAgICAgICAgICAgICAgIHBBZGR0cy0+dHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5KTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBhZGQgdHNwZWMgdG8gbGlzdAorICAgIGlmIChsaW1Uc3BlY0FkZChwTWFjLCBwQWRkciwgYXNzb2NJZCwgJnBBZGR0cy0+dHNwZWMsIHN2Y0ludGVydmFsLCAmcFRzcGVjSW5mbykKKyAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgibm8gc3BhY2UgaW4gdHNwZWMgbGlzdFxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvL3Bhc3NpbmcgbGltIHRzcGVjIHRhYmxlIGluZGV4IHRvIHRoZSBjYWxsZXIKKyAgICAqcFRzcGVjSWR4ID0gcFRzcGVjSW5mby0+aWR4OworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1BZG1pdENvbnRyb2xEZWxldGVUUworXGJyaWVmIERlbGV0ZSB0aGUgc3BlY2lmaWVkIFRzcGVjIGZvciB0aGUgc3BlY2lmaWVkIFNUQQorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworXHBhcmFtICAgICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgYXNzb2NJZAorXHBhcmFtICAgICAgIHRTaXJNYWNUU0luZm8gICAgKnBUc0luZm8KK1xwYXJhbSAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgKnBUc1N0YXR1cworXHBhcmFtICAgICAgIHRBTklfVTggICAgICAgICAgICAgKnB0c3BlY0lkeAorXHJldHVybiBlU2lyUmV0U3RhdHVzIC0gc3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzCitsaW1BZG1pdENvbnRyb2xEZWxldGVUUygKKyAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjLAorICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgYXNzb2NJZCwKKyAgICB0U2lyTWFjVFNJbmZvICAgICpwVHNJbmZvLAorICAgIHRBTklfVTggICAgICAgICAgICAgICAqcFRzU3RhdHVzLAorICAgIHRBTklfVTggICAgICAgICAgICAgKnB0c3BlY0lkeCkKK3sKKyAgICB0cExpbVRzcGVjSW5mbyBwVHNwZWNJbmZvID0gTlVMTDsKKworICAgIGlmIChwVHNTdGF0dXMgIT0gTlVMTCkKKyAgICAgICAgKnBUc1N0YXR1cyA9IDA7CisKKyAgICBpZiAobGltRmluZFRzcGVjKHBNYWMsIGFzc29jSWQsIHBUc0luZm8sICZwTWFjLT5saW0udHNwZWNJbmZvWzBdLCAmcFRzcGVjSW5mbykgPT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgaWYocFRzcGVjSW5mbyAhPSBOVUxMKSAgICAKKyAgICAgICAgeworICAgICAgICAgIGxpbUxvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgiVHNwZWMgZW50cnkgJWQgZm91bmRcbiIpLCBwVHNwZWNJbmZvLT5pZHgpOworICAgICAgICAKKyAgICAgICAgICAqcHRzcGVjSWR4ID0gcFRzcGVjSW5mby0+aWR4OworICAgICAgICAgIGxpbVRzcGVjRGVsZXRlKHBNYWMsIHBUc3BlY0luZm8pOworICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1BZG1pdENvbnRyb2xEZWxldGVTdGEKK1xicmllZiBEZWxldGUgYWxsIFRTUEVDIGZvciB0aGUgc3BlY2lmaWVkIFNUQQorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworXHBhcmFtICAgICB0QU5JX1UxNiBhc3NvY0lkCitccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMKK2xpbUFkbWl0Q29udHJvbERlbGV0ZVN0YSgKKyAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjLAorICAgIHRBTklfVTE2IGFzc29jSWQpCit7CisgICAgdHBMaW1Uc3BlY0luZm8gcFRzcGVjSW5mbyA9ICZwTWFjLT5saW0udHNwZWNJbmZvWzBdOworICAgIGludCBjdHNwZWM7CisKKyAgICBmb3IgKGN0c3BlYyA9IDA7IGN0c3BlYyA8IExJTV9OVU1fVFNQRUNfTUFYOyBjdHNwZWMrKywgcFRzcGVjSW5mbysrKQorICAgIHsKKyAgICAgICAgaWYgKGFzc29jSWQgPT0gcFRzcGVjSW5mby0+YXNzb2NJZCkKKyAgICAgICAgeworICAgICAgICAgICAgbGltVHNwZWNEZWxldGUocE1hYywgcFRzcGVjSW5mbyk7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgQURNSVRfQ09OVFJPTF9MT0dMRVZFTCwgRkwoIkRlbGV0aW5nIFRTUEVDICVkIGZvciBhc3NvY0lkICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICBjdHNwZWMsIGFzc29jSWQpOworICAgICAgICB9CisgICAgfQorICAgIGxpbUxvZyhwTWFjLCBBRE1JVF9DT05UUk9MX0xPR0xFVkVMLCBGTCgiYXNzb2NJZCAlZCBkb25lXG4iKSwgYXNzb2NJZCk7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbUFkbWl0Q29udHJvbEluaXQKK1xicmllZiBpbml0IHRzcGVjIHRhYmxlCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U2lyUmV0U3RhdHVzIGxpbUFkbWl0Q29udHJvbEluaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPmxpbS50c3BlY0luZm8gLCBMSU1fTlVNX1RTUEVDX01BWCAqIHNpemVvZih0TGltVHNwZWNJbmZvKSk7CisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1VcGRhdGVBZG1pdFBvbGljeQorXGJyaWVmIFNldCB0aGUgYWRtaXQgY29udHJvbCBwb2xpY3kgYmFzZWQgb24gQ0ZHIHBhcmFtZXRlcnMKK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBsaW1VcGRhdGVBZG1pdFBvbGljeSh0cEFuaVNpckdsb2JhbCAgICBwTWFjKQoreworICAgIHRBTklfVTMyIHZhbDsKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19BRE1JVF9QT0xJQ1ksICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGdldCBDRkdfQURNSVRfUE9MSUNZXG4iKSk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIHBNYWMtPmxpbS5hZG1pdFBvbGljeUluZm8udHlwZSA9ICh0QU5JX1U4KSB2YWw7CisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQURNSVRfQldGQUNUT1IsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGdldCBDRkdfQURNSVRfQldGQUNUT1JcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgcE1hYy0+bGltLmFkbWl0UG9saWN5SW5mby5id19mYWN0b3IgPSAodEFOSV9VOCkgdmFsOworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiTElNOiBBZG1pdFBvbGljeSAlZCwgYndfZmFjdG9yICVkXG4iKSwKKyAgICAgICAgICBwTWFjLT5saW0uYWRtaXRQb2xpY3lJbmZvLnR5cGUsIHBNYWMtPmxpbS5hZG1pdFBvbGljeUluZm8uYndfZmFjdG9yKTspCisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltU2VuZEhhbE1zZ0FkZFRzCitcYnJpZWYgU2VuZCBoYWxNc2dfQWRkVHMgdG8gSEFMCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gICAgIHRBTklfVTE2ICAgICAgICBzdGFJZHgKK1xwYXJhbSAgICAgdEFOSV9VOCAgICAgICAgIHRzcGVjSWR4CitccGFyYW0gICAgICAgdFNpck1hY1RzcGVjSUUgdHNwZWNJRQorXHBhcmFtICAgICAgIHRTaXJUY2xhc0luZm8gICAqdGNsYXNJbmZvCitccGFyYW0gICAgICAgdEFOSV9VOCAgICAgICAgICAgdGNsYXNQcm9jCitccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMKK2xpbVNlbmRIYWxNc2dBZGRUcygKKyAgdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgdEFOSV9VMTYgICAgICAgc3RhSWR4LAorICB0QU5JX1U4ICAgICAgICAgdHNwZWNJZHgsCisgIHRTaXJNYWNUc3BlY0lFIHRzcGVjSUUsCisgIHRBTklfVTggICAgICAgIHNlc3Npb25JZCkKK3sKKyAgICB0U2lyTXNnUSBtc2c7CisgICAgdHBBZGRUc1BhcmFtcyBwQWRkVHNQYXJhbTsKKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcEFkZFRzUGFyYW0sIHNpemVvZih0QWRkVHNQYXJhbXMpKSkKKyAgICB7CisgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgicGFsQWxsb2NhdGVNZW1vcnkoKSBmYWlsZWRcbiIpKTspCisgICAgICAgcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsgICAgICAgICAgCisgICAgfQorCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKilwQWRkVHNQYXJhbSwgc2l6ZW9mKHRBZGRUc1BhcmFtcykpOworICAgIHBBZGRUc1BhcmFtLT5zdGFJZHggPSBzdGFJZHg7CisgICAgcEFkZFRzUGFyYW0tPnRzcGVjSWR4ID0gdHNwZWNJZHg7CisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcEFkZFRzUGFyYW0tPnRzcGVjLCAmdHNwZWNJRSwgc2l6ZW9mKHRTaXJNYWNUc3BlY0lFKSk7CisgICAgcEFkZFRzUGFyYW0tPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAKKyAgICBtc2cudHlwZSA9IFdEQV9BRERfVFNfUkVROworICAgIG1zZy5ib2R5cHRyID0gcEFkZFRzUGFyYW07CisgICAgbXNnLmJvZHl2YWwgPSAwOworCisgICAgLyogV2UgbmVlZCB0byBkZWZlciBhbnkgaW5jb21pbmcgbWVzc2FnZXMgdW50aWwgd2UgZ2V0IGEKKyAgICAgKiBXREFfQUREX1RTX1JTUCBmcm9tIEhBTC4KKyAgICAgKi8KKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCBmYWxzZSk7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnLnR5cGUpKTsKKworICAgIGlmKGVTSVJfU1VDQ0VTUyAhPSB3ZGFQb3N0Q3RybE1zZyhwTWFjLCAmbXNnKSkKKyAgICB7CisgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgid2RhUG9zdEN0cmxNc2coKSBmYWlsZWRcbiIpKTspCisgICAgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCopcEFkZFRzUGFyYW0pOworICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVNlbmRIYWxNc2dEZWxUcworXGJyaWVmIFNlbmQgaGFsTXNnX0FkZFRzIHRvIEhBTAorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworXHBhcmFtICAgICB0QU5JX1UxNiAgICAgICAgc3RhSWR4CitccGFyYW0gICAgIHRBTklfVTggICAgICAgICB0c3BlY0lkeAorXHBhcmFtICAgICB0U2lyQWRkdHNSZXFJbmZvIGFkZHRzCitccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMKK2xpbVNlbmRIYWxNc2dEZWxUcygKKyAgdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgdEFOSV9VMTYgICAgICAgc3RhSWR4LAorICB0QU5JX1U4ICAgICAgICAgdHNwZWNJZHgsCisgIHRTaXJEZWx0c1JlcUluZm8gZGVsdHMpCit7CisgIHRTaXJNc2dRIG1zZzsKKyAgdHBEZWxUc1BhcmFtcyBwRGVsVHNQYXJhbTsKKworICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBEZWxUc1BhcmFtLCBzaXplb2YodERlbFRzUGFyYW1zKSkpCisgIHsKKyAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZFxuIikpOworICAgICByZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICB9CisKKyAgbXNnLnR5cGUgPSBXREFfREVMX1RTX1JFUTsKKyAgbXNnLmJvZHlwdHIgPSBwRGVsVHNQYXJhbTsKKyAgbXNnLmJvZHl2YWwgPSAwOworICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXBEZWxUc1BhcmFtLCBzaXplb2YodERlbFRzUGFyYW1zKSk7CisKKyAgLy9maWxsaW5nIG1lc3NhZ2UgcGFyYW1ldGVycy4KKyAgcERlbFRzUGFyYW0tPnN0YUlkeCA9IHN0YUlkeDsKKyAgcERlbFRzUGFyYW0tPnRzcGVjSWR4ID0gdHNwZWNJZHg7CisKKyAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiY2FsbGluZyB3ZGFQb3N0Q3RybE1zZygpXG4iKSk7KQorICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2cudHlwZSkpOworCisgIGlmKGVTSVJfU1VDQ0VTUyAhPSB3ZGFQb3N0Q3RybE1zZyhwTWFjLCAmbXNnKSkKKyAgeworICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJ3ZGFQb3N0Q3RybE1zZygpIGZhaWxlZFxuIikpOykKKyAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCopcERlbFRzUGFyYW0pOworICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICB9CisgIHJldHVybiBlU0lSX1NVQ0NFU1M7ICAKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgbGltUHJvY2Vzc0hhbEFkZFRzUnNwCitcYnJpZWYgIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgV0RBX0FERF9UU19SU1AgZnJvbSBIQUwuIAorXCAgICAgICBJZiByZXNwb25zZSBpcyBzdWNjZXNzZnVsLCB0aGVuIHNlbmQgYmFjayBTTUVfQUREVFNfUlNQLgorXCAgICAgICBPdGhlcndpc2UsIHNlbmQgREVMVFMgYWN0aW9uIGZyYW1lIHRvIHBlZXIgYW5kIHRoZW4gCitcICAgICAgIHRoZW4gc2VuZCBiYWNrIFNNRV9BRERUU19SU1AuIAorXAorXHBhcmFtICB0cEFuaVNpckdsb2JhbCAgcE1hYworXHBhcmFtICB0cFNpck1zZ1EgICBsaW1Nc2cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1Qcm9jZXNzSGFsQWRkVHNSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZykKK3sKKyAgICB0cEFkZFRzUGFyYW1zICBwQWRkVHNSc3BNc2cgPSBOVUxMOworICAgIHRwRHBoSGFzaE5vZGUgIHBTdGEgPSBOVUxMOworICAgIHRBTklfVTE2ICBhc3NvY0lkID0wOworICAgIHRTaXJNYWNBZGRyICBwZWVyTWFjQWRkcjsKKyAgICB0QU5JX1U4ICAgcnNwUmVxZCA9IDE7CisgICAgdHBQRVNlc3Npb24gIHBzZXNzaW9uRW50cnkgPSBOVUxMOworCisKKyAgICAvKiBOZWVkIHRvIHByb2Nlc3MgYWxsIHRoZSBkZWZlcnJlZCBtZXNzYWdlcyBlbnF1ZXVlZCAKKyAgICAgKiBzaW5jZSBzZW5kaW5nIHRoZSBXREFfQUREX1RTX1JFUS4KKyAgICAgKi8KKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKworICAgIGlmIChOVUxMID09IGxpbU1zZy0+Ym9keXB0cikKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiUmVjZWl2ZWQgV0RBX0FERF9UU19SU1Agd2l0aCBOVUxMICIpKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgcEFkZFRzUnNwTXNnID0gKHRwQWRkVHNQYXJhbXMpIChsaW1Nc2ctPmJvZHlwdHIpOworCisgICAgLy8gMDkwODAzOiBVc2UgcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKCkgdG8gb2J0YWluIHRoZSBQRSBzZXNzaW9uIGNvbnRleHQgICAgICAgCisgICAgLy8gZnJvbSB0aGUgc2Vzc2lvbklkIGluIHRoZSBSc3AgTXNnIGZyb20gSEFMCisgICAgcHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCBwQWRkVHNSc3BNc2ctPnNlc3Npb25JZCk7CisKKyAgICBpZihwc2Vzc2lvbkVudHJ5ID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoIlNlc3Npb24gZG9lcyBOb3QgZXhpc3Qgd2l0aCBnaXZlbiBzZXNzaW9uSWQgOiVkIFxuIiksIHBBZGRUc1JzcE1zZy0+c2Vzc2lvbklkKTspCisgICAgICAgIGxpbVNlbmRTbWVBZGR0c1JzcChwTWFjLCByc3BSZXFkLCBlU0lSX1NNRV9BRERUU19SU1BfRkFJTEVELCBwc2Vzc2lvbkVudHJ5LCBwQWRkVHNSc3BNc2ctPnRzcGVjLCAKKyAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1BZGR0c1JlcS5zZXNzaW9uSWQsIHBNYWMtPmxpbS5nTGltQWRkdHNSZXEudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmKHBBZGRUc1JzcE1zZy0+c3RhdHVzID09IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBzdWNjZXNzZnVsIEFERFRTIHJlc3BvbnNlIGZyb20gSEFMIFxuIikpOykKKyAgICAgICAgLy8gVXNlIHRoZSBzbWVzZXNzaW9uSWQgYW5kIHNtZXRyYW5zYWN0aW9uSWQgZnJvbSB0aGUgUEUgc2Vzc2lvbiBjb250ZXh0CisgICAgICAgIGxpbVNlbmRTbWVBZGR0c1JzcChwTWFjLCByc3BSZXFkLCBlU0lSX1NNRV9TVUNDRVNTLCBwc2Vzc2lvbkVudHJ5LCBwQWRkVHNSc3BNc2ctPnRzcGVjLAorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwgcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBmYWlsdXJlIEFERFRTIHJlc3BvbnNlIGZyb20gSEFMIFxuIikpOykKKworICAgICAgICAvLyBTZW5kIERFTFRTIGFjdGlvbiBmcmFtZSB0byBBUCAgICAgICAgCisgICAgICAgIC8vIDA5MDgwMzogR2V0IHBlZXIgTUFDIGFkZHIgZnJvbSBzZXNzaW9uICAgICAgICAKKyNpZiAwICAKKyAgICAgICAgY2ZnTGVuID0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsIFdOSV9DRkdfQlNTSUQsIHBlZXJNYWNBZGRyLCAmY2ZnTGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbCB0byByZXRyaWV2ZSBCU1NJRCBcbiIpKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisjZW5kaWYgLy9UTyBTVVBQT1JUIEJULUFNUAorICAgICAgICBzaXJDb3B5TWFjQWRkcihwZWVyTWFjQWRkcixwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyAgICAgICAgLy8gMDkwODAzOiBBZGQgdGhlIFNNRSBTZXNzaW9uIElEICAgICAgICAKKyAgICAgICAgbGltU2VuZERlbHRzUmVxQWN0aW9uRnJhbWUocE1hYywgcGVlck1hY0FkZHIsIHJzcFJlcWQsICZwQWRkVHNSc3BNc2ctPnRzcGVjLnRzaW5mbywgJnBBZGRUc1JzcE1zZy0+dHNwZWMsCisgICAgICAgICAgICAgICAgLy9wc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnkpOworCisgICAgICAgIC8vIERlbGV0ZSBUU1BFQworICAgICAgICAvLyAwOTA4MDM6IFB1bGwgdGhlIGhhc2ggdGFibGUgZnJvbSB0aGUgc2Vzc2lvbiAgICAgICAgCisgICAgICAgIHBTdGEgPSBkcGhMb29rdXBBc3NvY0lkKHBNYWMsIHBBZGRUc1JzcE1zZy0+c3RhSWR4LCAmYXNzb2NJZCwgCisgICAgICAgICAgICAgICAgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOyAgICAKKyAgICAgICAgaWYgKHBTdGEgIT0gTlVMTCkKKyAgICAgICAgICAgIGxpbUFkbWl0Q29udHJvbERlbGV0ZVRTKHBNYWMsIGFzc29jSWQsICZwQWRkVHNSc3BNc2ctPnRzcGVjLnRzaW5mbywgTlVMTCwgKHRBTklfVTggKikmcEFkZFRzUnNwTXNnLT50c3BlY0lkeCk7CisKKyAgICAgICAgLy8gU2VuZCBTTUVfQUREVFNfUlNQCisgICAgICAgIC8vIDA5MDgwMzogVXNlIHRoZSBzbWVzZXNzaW9uSWQgYW5kIHNtZXRyYW5zYWN0aW9uSWQgZnJvbSB0aGUgUEUgc2Vzc2lvbiBjb250ZXh0CisgICAgICAgIGxpbVNlbmRTbWVBZGR0c1JzcChwTWFjLCByc3BSZXFkLCBlU0lSX1NNRV9BRERUU19SU1BfRkFJTEVELCBwc2Vzc2lvbkVudHJ5LCBwQWRkVHNSc3BNc2ctPnRzcGVjLAorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwgcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGdvdG8gZW5kOworICAgfQorCitlbmQ6CisgICAgaWYoIHBBZGRUc1JzcE1zZyAhPSBOVUxMICkKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKilwQWRkVHNSc3BNc2cgKTsKKyAgICByZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltQXBpLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbUFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzZjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbUFwaS5jCkBAIC0wLDAgKzEsMjczOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbUFwaS5jYyBjb250YWlucyB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlCisgKiBleHBvcnRlZCBieSBMSU0gdG8gb3RoZXIgbW9kdWxlcy4KKyAqCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNlbHNlCisjaW5jbHVkZSAid25pQ2ZnU3RhLmgiCisjaW5jbHVkZSAid25pQXBpLmgiCisjZW5kaWYKKyNpbmNsdWRlICJzaXJDb21tb24uaCIKKyNpbmNsdWRlICJzaXJEZWJ1Zy5oIgorI2luY2x1ZGUgImFuaVBhcmFtLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisKKyNpbmNsdWRlICJzY2hBcGkuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbUFwaS5oIgorI2luY2x1ZGUgImxpbUdsb2JhbC5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltUHJvcEV4dHNVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAibGltSWJzc1BlZXJNZ210LmgiCisjaW5jbHVkZSAibGltQWRtaXRDb250cm9sLmgiCisjaW5jbHVkZSAicG1tQXBpLmgiCisjaW5jbHVkZSAibG9nRHVtcC5oIgorI2luY2x1ZGUgImxpbVNlbmRTbWVSc3BNZXNzYWdlcy5oIgorI2luY2x1ZGUgIndtbUFwc2QuaCIKKyNpbmNsdWRlICJsaW1UcmFjZS5oIgorI2luY2x1ZGUgImxpbVNlc3Npb24uaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGEuaCIKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybUFwaS5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1GVC5oPgorCisjaWZkZWYgVk9TU19FTkFCTEVECisjaW5jbHVkZSAidm9zX3R5cGVzLmgiCisjaW5jbHVkZSAidm9zX3BhY2tldC5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3RsLmgiCisjaW5jbHVkZSAic3lzU3RhcnR1cC5oIgorI2VuZGlmCisKKworc3RhdGljIHZvaWQgX19saW1Jbml0U2NhblZhcnModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBwTWFjLT5saW0uZ0xpbVVzZVNjYW5Nb2RlRm9yTGVhcm5Nb2RlID0gMTsKKworICAgIHBNYWMtPmxpbS5nTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlID0gMDsKKworICAgIC8vIFNjYW4gcmVsYXRlZCBnbG9iYWxzIG9uIFNUQQorICAgIHBNYWMtPmxpbS5nTGltUmV0dXJuQWZ0ZXJGaXJzdE1hdGNoID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbTI0QmFuZDExZFNjYW5Eb25lID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbTUwQmFuZDExZFNjYW5Eb25lID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbVJldHVyblVuaXF1ZVJlc3VsdHMgPSAwOworCisgICAgLy8gQmFja2dyb3VuZCBTY2FuIHJlbGF0ZWQgZ2xvYmFscyBvbiBTVEEKKyAgICBwTWFjLT5saW0uZ0xpbU51bU9mQmFja2dyb3VuZFNjYW5TdWNjZXNzID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbU51bU9mQ29uc2VjdXRpdmVCa2duZFNjYW5GYWlsdXJlID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbU51bU9mRm9yY2VkQmtnbmRTY2FuID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuRGlzYWJsZSA9IGZhbHNlOyAgICAgIC8vYmFzZWQgb24gQkcgdGltZXIKKyAgICBwTWFjLT5saW0uZ0xpbUZvcmNlQmFja2dyb3VuZFNjYW5EaXNhYmxlID0gZmFsc2U7IC8vZGVidWcgY29udHJvbCBmbGFnCisgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhblRlcm1pbmF0ZSA9IFRSVUU7ICAgIC8vY29udHJvbGxlZCBieSBTTUUKKyAgICBwTWFjLT5saW0uZ0xpbVJlcG9ydEJhY2tncm91bmRTY2FuUmVzdWx0cyA9IEZBTFNFOyAgICAvL2NvbnRyb2xsZWQgYnkgU01FICAgIAorCisgICAgcE1hYy0+bGltLmdMaW1DdXJyZW50U2NhbkNoYW5uZWxJZCA9IDA7CisgICAgcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcSA9IE5VTEw7CisgICAgcE1hYy0+bGltLmdMaW1NbG1TY2FuUmVzdWx0TGVuZ3RoID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbVNtZVNjYW5SZXN1bHRMZW5ndGggPSAwOworCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ0xpbUNhY2hlZFNjYW5IYXNoVGFibGUsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihwTWFjLT5saW0uZ0xpbUNhY2hlZFNjYW5IYXNoVGFibGUpKTsKKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQpIHx8IGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhbkNoYW5uZWxJZCA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhblN0YXJ0ZWQgPSAwOworICAgIHBNYWMtPmxpbS5nTGltUmVzdG9yZUNCTnVtU2NhbkludGVydmFsID0gTElNX1JFU1RPUkVfQ0JfTlVNX1NDQU5fSU5URVJWQUxfREVGQVVMVDsKKyAgICBwTWFjLT5saW0uZ0xpbVJlc3RvcmVDQkNvdW50ID0gMDsKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5nTGltTGVnYWN5QnNzaWRMaXN0LCBzaXplb2YocE1hYy0+bGltLmdMaW1MZWdhY3lCc3NpZExpc3QpKTsKKyNlbmRpZgorCisgICAgLyogRmlsbCBpbiBkZWZhdWx0IHZhbHVlcyAqLworICAgIHBNYWMtPmxpbS5nTGltVHJpZ2dlckJhY2tncm91bmRTY2FuRHVyaW5nUXVpZXRCc3MgPSAwOworCisjaWZkZWYgQU5JX0FQX1NESworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBNYWMtPmxpbS5nTGltU2NhbkR1cmF0aW9uQ29udmVydCwgc2l6ZW9mKHRMaW1TY2FuRHVyYXRpb25Db252ZXJ0KSk7IC8qIFVzZWQgdG8gc3RvcmUgY29udmVydGVkIHNjYW4gZHVyYXRpb24gdmFsdWVzIGluIFRVIGFuZCBUSUNLUyAqLworI2VuZGlmIC8qIEFOSV9BUF9TREsgKi8KKworICAgIC8vIGFib3J0IHNjYW4gaXMgdXNlZCB0byBhYm9ydCBhbiBvbi1nb2luZyBzY2FuCisgICAgcE1hYy0+bGltLmFib3J0U2NhbiA9IDA7CisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcE1hYy0+bGltLnNjYW5DaG5JbmZvLCBzaXplb2YodExpbVNjYW5DaG5JbmZvKSk7CisKKy8vV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZAorICAgIHBNYWMtPmxpbS5ncExpbVN1c3BlbmRDYWxsYmFjayA9IE5VTEw7CisgICAgcE1hYy0+bGltLmdwTGltUmVzdW1lQ2FsbGJhY2sgPSBOVUxMOworLy9lbmQgV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZAorfQorCisKK3N0YXRpYyB2b2lkIF9fbGltSW5pdEJzc1ZhcnModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgICh2b2lkKilwTWFjLT5saW0uZ3BTZXNzaW9uLCAgIHNpemVvZigqcE1hYy0+bGltLmdwU2Vzc2lvbikqcE1hYy0+bGltLm1heEJzc0lkKTsKKworCisgICAgLy9wTWFjLT5saW0uZ3BMaW1TdGFydEJzc1JlcSA9IE5VTEw7CisKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcE1hYy0+bGltLmdMaW1OZWlnaGJvckJzc0xpc3QsIHNpemVvZih0U2lyTXVsdGlwbGVOZWlnaGJvckJzc0luZm8pKTsKKyNlbmRpZgorCisKKworLyogVGhlc2UgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbW92ZWQgdG8gc2Vzc2lvbiB0YWJsZSBhbmQgaW50aWFsaXphdGlvbiBpcyBkb25lIGR1cmluZyBzZXNzaW9uIGNyZWF0aW9uIE9jdCA5dGggUmV2aWV3ICovCisjaWYgMAorCisgICAvLyBQbGFjZSBob2xkZXIgZm9yIEJTUyBkZXNjcmlwdGlvbiB0aGF0IHdlJ3JlCisgICAvLyBjdXJyZW50bHkgam9pbmVkIHdpdGgKKyAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBNYWMtPmxpbS5nTGltQ3VycmVudEJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgIHBNYWMtPmxpbS5nTGltQ3VycmVudENoYW5uZWxJZCA9IEhBTF9JTlZBTElEX0NIQU5ORUxfSUQ7CisgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwTWFjLT5saW0uZ0xpbUN1cnJlbnRTU0lELCBzaXplb2YodFNpck1hY1NTaWQpKTsKKyAgIHBNYWMtPmxpbS5nTGltQ3VycmVudEJzc0NhcHMgPSAwOworICAgUW9zQ2FwcyBpcyBhIGJpdCBtYXAgb2YgdmFyaW91cyBxb3MgY2FwYWJpbGl0aWVzIC0gc2VlIGRlZm4gYWJvdmUKKyAgIHBNYWMtPmxpbS5nTGltQ3VycmVudEJzc1Fvc0NhcHMgPSAwOworICAgcE1hYy0+bGltLmdMaW1DdXJyZW50QnNzUHJvcENhcCA9IDA7CisgICBwTWFjLT5saW0uZ0xpbVNlbnRDYXBzQ2hhbmdlTnRmID0gMDsKKworICAgLy8gUGxhY2UgaG9sZGVyIGZvciBCU1MgZGVzY3JpcHRpb24gdGhhdAorICAgLy8gd2UncmUgY3VycmVudGx5IFJlYXNzb2NpYXRpbmcKKyAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBNYWMtPmxpbS5nTGltUmVhc3NvY0Jzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgIHBNYWMtPmxpbS5nTGltUmVhc3NvY0NoYW5uZWxJZCA9IDA7CisgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwTWFjLT5saW0uZ0xpbVJlYXNzb2NTU0lELCBzaXplb2YodFNpck1hY1NTaWQpKTsKKyAgIHBNYWMtPmxpbS5nTGltUmVhc3NvY0Jzc0NhcHMgPSAwOworICAgcE1hYy0+bGltLmdMaW1SZWFzc29jQnNzUW9zQ2FwcyA9IDA7CisgICBwTWFjLT5saW0uZ0xpbVJlYXNzb2NCc3NQcm9wQ2FwID0gMDsKKyAjZW5kaWYKKworICAgIC8qIFRoaXMgaXMgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSwgYmUgZGVmYXVsdCBzaG91bGQgYWx3YXlzIGJlIG9mZiAqLworICAgIHBNYWMtPmxpbS5nTGltRm9yY2VOb1Byb3BJRSA9IDA7CisKKyAgIC8vIHBNYWMtPmxpbS5nTGltQnNzSWR4ID0gMDsKKworICAgIHBNYWMtPmxpbS5ncExpbU1sbVNldEtleXNSZXEgPSBOVUxMOworICAgIHBNYWMtPmxpbS5ncExpbU1sbVJlbW92ZUtleVJlcSA9IE5VTEw7CisgIC8vICBwTWFjLT5saW0uZ0xpbVN0YWlkID0gMDsgLy9UTyBTVVBQT1JUIEJULUFNUAorCit9CisKKworc3RhdGljIHZvaWQgX19saW1Jbml0U3RhdHNWYXJzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgcE1hYy0+bGltLmdMaW1OdW1CZWFjb25zUmN2ZCA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1OdW1CZWFjb25zSWdub3JlZCA9IDA7CisKKyAgICBwTWFjLT5saW0uZ0xpbU51bURlZmVycmVkTXNncyA9IDA7CisKKyAgICAvLy8gVmFyaWFibGUgdG8ga2VlcCB0cmFjayBvZiBudW1iZXIgb2YgY3VycmVudGx5IGFzc29jaWF0ZWQgU1RBcworICAgIHBNYWMtPmxpbS5nTGltTnVtT2ZDdXJyZW50U1RBcyA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1OdW1PZkFuaVNUQXMgPSAwOyAgICAgIC8vIGNvdW50IG9mIEFOSSBwZWVycworCisgICAgLy8vIFRoaXMgaW5kaWNhdGVzIG51bWJlciBvZiBSWGVkIEJlYWNvbnMgZHVyaW5nIEhCIHBlcmlvZAorICAgIC8vcE1hYy0+bGltLmdMaW1SeGVkQmVhY29uQ250RHVyaW5nSEIgPSAwOworCisgICAgLy8gSGVhcnQtQmVhdCBpbnRlcnZhbCB2YWx1ZQorICAgIHBNYWMtPmxpbS5nTGltSGVhcnRCZWF0Q291bnQgPSAwOworCisgICAgLy8gU3RhdGlzdGljcyB0byBrZWVwIHRyYWNrIG9mIG5vLiBiZWFjb25zIHJjdmQgaW4gaGVhcnQgYmVhdCBpbnRlcnZhbAorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1IZWFydEJlYXRCZWFjb25TdGF0cywgc2l6ZW9mKHBNYWMtPmxpbS5nTGltSGVhcnRCZWF0QmVhY29uU3RhdHMpKTsKKworI2lmZGVmIFdMQU5fREVCVUcgICAgCisgICAgLy8gRGVidWcgY291bnRlcnMKKyAgICBwTWFjLT5saW0ubnVtVG90ID0gMDsKKyAgICBwTWFjLT5saW0ubnVtQmJ0ID0gMDsKKyAgICBwTWFjLT5saW0ubnVtUHJvdEVyciA9IDA7CisgICAgcE1hYy0+bGltLm51bUxlYXJuID0gMDsKKyAgICBwTWFjLT5saW0ubnVtTGVhcm5JZ25vcmUgPSAwOworICAgIHBNYWMtPmxpbS5udW1TbWUgPSAwOworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLm51bU1BQywgc2l6ZW9mKHBNYWMtPmxpbS5udW1NQUMpKTsKKyAgICBwTWFjLT5saW0uZ0xpbU51bUFzc29jUmVxRHJvcEludmxkU3RhdGUgPSAwOworICAgIHBNYWMtPmxpbS5nTGltTnVtQXNzb2NSZXFEcm9wQUNSZWplY3RUUyA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1OdW1Bc3NvY1JlcURyb3BBQ1JlamVjdFN0YSA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1OdW1SZWFzc29jUmVxRHJvcEludmxkU3RhdGUgPSAwOworICAgIHBNYWMtPmxpbS5nTGltTnVtSGFzaE1pc3NJZ25vcmVkID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbVVuZXhwQmNuQ250ID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbUJjblNTSURNaXNtYXRjaENudCA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1OdW1MaW5rRXN0cyA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1OdW1SeENsZWFudXAgPSAwOworICAgIHBNYWMtPmxpbS5nTGltMTFiU3RhQXNzb2NSZWplY3RDb3VudCA9IDA7CisjZW5kaWYgICAgCit9CisKKworCitzdGF0aWMgdm9pZCBfX2xpbUluaXRTdGF0ZXModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICAvLyBDb3VudHMgSGVhcnRiZWF0IGZhaWx1cmVzCisgICAgcE1hYy0+bGltLmdMaW1IQmZhaWx1cmVDbnRJbkxpbmtFc3RTdGF0ZSA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1Qcm9iZUZhaWx1cmVBZnRlckhCZmFpbGVkQ250ID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbUhCZmFpbHVyZUNudEluT3RoZXJTdGF0ZXMgPSAwOworICAgIHBNYWMtPmxpbS5nTGltUnNwUmVxZCA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1QcmV2U21lU3RhdGUgPSBlTElNX1NNRV9PRkZMSU5FX1NUQVRFOworCisgICAgLy8vIE1MTSBTdGF0ZSB2aXNpYmxlIGFjcm9zcyBhbGwgU2lyaXVzIG1vZHVsZXMKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIGVMSU1fTUxNX0lETEVfU1RBVEUpKTsKKyAgICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKworICAgIC8vLyBQcmV2aW91cyBNTE0gU3RhdGUKKyAgICBwTWFjLT5saW0uZ0xpbVByZXZNbG1TdGF0ZSA9IGVMSU1fTUxNX09GRkxJTkVfU1RBVEU7CisKKyNpZmRlZiBHRU40X1NDQU4KKyAgICAvLyBMSU0gdG8gSEFMIFNDQU4gTWFuYWdlbWVudCBNZXNzYWdlIEludGVyZmFjZSBzdGF0ZXMKKyAgICBwTWFjLT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSA9IGVMSU1fSEFMX0lETEVfU0NBTl9TVEFURTsKKyNlbmRpZiAvLyBHRU40X1NDQU4KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgc3RhdGUgdG8gZUxJTV9NTE1fT0ZGTElORV9TVEFURQorICAgICAqLworICAgIHBNYWMtPmxpbS5nTGltU21lU3RhdGUgICAgID0gZUxJTV9NTE1fT0ZGTElORV9TVEFURTsKKyNlbHNlCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBzdGF0ZSB0byBzdXNwZW5kZWQgc3RhdGUgYW5kIHdhaXQgZm9yCisgICAgICogSEFMIHRvIHNlbmQgTElNX1JFU1VNRV9BQ1RJVklUWV9OVEYgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKyAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlICAgICA9IGVMSU1fU01FX1NVU1BFTkRfU1RBVEU7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKKyAgICAvKioKKyAgICAgKiBCeSBkZWZhdWx0IGFzc3VtZSAndW5rbm93bicgcm9sZS4gVGhpcyB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiB3aGVuIFNNRV9TVEFSVF9CU1NfUkVRIGlzIHJlY2VpdmVkLgorICAgICAqLworCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcE1hYy0+bGltLmdMaW1PdmVybGFwMTFnUGFyYW1zLCBzaXplb2YodExpbVByb3RTdGFQYXJhbXMpKTsKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWFQYXJhbXMsIHNpemVvZih0TGltUHJvdFN0YVBhcmFtcykpOworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBNYWMtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMsIHNpemVvZih0TGltUHJvdFN0YVBhcmFtcykpOworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBNYWMtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLCBzaXplb2YodExpbVByb3RTdGFQYXJhbXMpKTsKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwTWFjLT5saW0uZ0xpbU5vU2hvcnRQYXJhbXMsIHNpemVvZih0TGltTm9TaG9ydFBhcmFtcykpOworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBNYWMtPmxpbS5nTGltTm9TaG9ydFNsb3RQYXJhbXMsIHNpemVvZih0TGltTm9TaG9ydFNsb3RQYXJhbXMpKTsKKworICAgIHBNYWMtPmxpbS5nTGltUGh5TW9kZSA9IDA7IAorICAgIHBNYWMtPmxpbS5zY2FuU3RhcnRUaW1lID0gMDsgICAgLy8gdXNlZCB0byBtZWFzdXJlIHNjYW4gdGltZQorCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ0xpbUJzc2lkLCBzaXplb2YocE1hYy0+bGltLmdMaW1Cc3NpZCkpOworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1NeU1hY0FkZHIsIHNpemVvZihwTWFjLT5saW0uZ0xpbU15TWFjQWRkcikpOworICAgIHBNYWMtPmxpbS5hY2tQb2xpY3kgPSAwOworCisjaWYgMCAvKiBNb3ZpbmcgYWxsIHRoZXNlIHRvIHNlc3Npb24gc3BlY2lmaWMgZWxlbWVudHMgKi8KKyAgICBwTWFjLT5saW0uZ0xpbVFvc0VuYWJsZWQgPSAwOyAvLzExRQorICAgIHBNYWMtPmxpbS5nTGltV21lRW5hYmxlZCA9IDA7IC8vV01FCisgICAgcE1hYy0+bGltLmdMaW1Xc21FbmFibGVkID0gMDsgLy9XU00KKyAgICBwTWFjLT5saW0uZ0xpbUhjZkVuYWJsZWQgPSAwOworICAgIHBNYWMtPmxpbS5nTGltMTFkRW5hYmxlZCA9IDA7CisjZW5kaWYKKworICAgIHBNYWMtPmxpbS5nTGltUHJvYmVSZXNwRGlzYWJsZUZsYWcgPSAwOyAvLyBjb250cm9sIG92ZXIgcHJvYmUgcmVzcG9uc2UKK30KKworc3RhdGljIHZvaWQgX19saW1Jbml0VmFycyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcE1hYy0+bGltLmdMaW1BbHRlcm5hdGVSYWRpb0xpc3QsIHNpemVvZih0U2lyTXVsdGlwbGVBbHRlcm5hdGVSYWRpb0luZm8pKTsKKyNlbmRpZgorCisgICAgLy8gUGxhY2UgaG9sZGVyIGZvciBNZWFzdXJlbWVudCBSZXEvUnNwL0luZCByZWxhdGVkIGluZm8KKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEgPSBOVUxMOworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcywgc2l6ZW9mKHRMaW1NZWFzUGFyYW1zKSk7CisgICAgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEgPSBOVUxMOworI2VuZGlmCisKKyAgICAvLyBXRFMgaW5mbworICAgIHBNYWMtPmxpbS5nTGltTnVtV2RzSW5mb0luZCA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1OdW1XZHNJbmZvU2V0ID0gMDsKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwTWFjLT5saW0uZ0xpbVdkc0luZm8sIHNpemVvZih0U2lyV2RzSW5mbykpOworICAgIC8qIGluaXRpYWxpemUgc29tZSBwYXJhbWV0ZXJzICovCisgICAgbGltSW5pdFdkc0luZm9QYXJhbXMocE1hYyk7CisKKyAgICAvLyBEZWZlcnJlZCBRdWV1ZSBQYXJhbXRlcnMKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUSwgc2l6ZW9mKHRTaXJBZGR0c1JlcSkpOworCisgICAgLy8gYWRkdHMgcmVxdWVzdCBpZiBhbnkgLSBvbmx5IG9uZSBjYW4gYmUgb3V0c3RhbmRpbmcgYXQgYW55IHRpbWUKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwTWFjLT5saW0uZ0xpbUFkZHRzUmVxLCBzaXplb2YodFNpckFkZHRzUmVxKSk7CisgICAgcE1hYy0+bGltLmdMaW1BZGR0c1NlbnQgPSAwOworICAgIHBNYWMtPmxpbS5nTGltQWRkdHNSc3BUaW1lckNvdW50ID0gMDsKKworICAgIC8vcHJvdGVjdGlvbiByZWxhdGVkIGNvbmZpZyBjYWNoZQorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLCBzaXplb2YodENmZ1Byb3RlY3Rpb24pKTsKKyAgICBwTWFjLT5saW0uZ0xpbVByb3RlY3Rpb25Db250cm9sID0gMDsKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwTWFjLT5saW0uZ0xpbUFsdGVybmF0ZVJhZGlvLCBzaXplb2YodFNpckFsdGVybmF0ZVJhZGlvSW5mbykpOworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCisgICAgLy8gMTFoIFNwZWN0cnVtIE1hbmFnZW1lbnQgUmVsYXRlZCBGbGFnCisgICAgLy9wTWFjLT5saW0uZ0xpbTExaEVuYWJsZSA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5kb3QxMWhDaGFuU3dTdGF0ZSA9IGVMSU1fMTFIX0NIQU5TV19JTklUOworICAgIExJTV9TRVRfUkFEQVJfREVURUNURUQocE1hYywgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICBwTWFjLT5zeXMuZ1N5c0VuYWJsZUxlYXJuTW9kZSA9IGVBTklfQk9PTEVBTl9UUlVFOworCisgICAgLy8gMTFoIFF1aWV0IEVsZW1lbnQgUmVsYXRlZCBGbGFnCisgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID0gZUxJTV9RVUlFVF9JTklUOworICAgIC8vIEEgY291bnQtZG93biB2YWx1ZSwgdXNlZCBvbiB0aGUgQVAsIHRvIHNlbmQgb3V0IHRoZQorICAgIC8vIFF1aWV0IEJTUyBJRSBpbiB0aGF0IG1hbnkgQmVhY29uJ3MKKyAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0Q291bnQgPSAwOworICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZlF1aWV0RW5hYmxlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LmZSYWRhckludHJDb25maWd1cmVkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworCisgICAgLy8gV01NIFJlbGF0ZWQgRmxhZworICAgIHBNYWMtPmxpbS5nVWFwc2RFbmFibGUgPSAwOworICAgIHBNYWMtPmxpbS5nVWFwc2RQZXJBY0JpdG1hc2sgPSAwOworICAgIHBNYWMtPmxpbS5nVWFwc2RQZXJBY1RyaWdnZXJFbmFibGVNYXNrID0gMDsKKyAgICBwTWFjLT5saW0uZ1VhcHNkUGVyQWNEZWxpdmVyeUVuYWJsZU1hc2sgPSAwOworCisgICAgLy8gUW9TLUFDIERvd25ncmFkZTogSW5pdGlhbGx5LCBubyBBQyBpcyBhZG1pdHRlZAorICAgIHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LXSA9IDA7CisgICAgcE1hYy0+bGltLmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9ETkxJTktdID0gMDsKKworICAgIC8vZGlhbG9ndWUgdG9rZW4gTGlzdCBoZWFkL3RhaWwgZm9yIEFjdGlvbiBmcmFtZXMgcmVxdWVzdCBzZW50LgorICAgIHBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlbkhlYWQgPSBOVUxMOworICAgIHBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlblRhaWwgPSBOVUxMOworCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcE1hYy0+bGltLnRzcGVjSW5mbywgc2l6ZW9mKHRMaW1Uc3BlY0luZm8pICogTElNX05VTV9UU1BFQ19NQVgpOworCisgICAgLy8gYWRtaXNzaW9uIGNvbnRyb2wgcG9saWN5IGluZm9ybWF0aW9uCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcE1hYy0+bGltLmFkbWl0UG9saWN5SW5mbywgc2l6ZW9mKHRMaW1BZG1pdFBvbGljeUluZm8pKTsKKworICAgIHBNYWMtPmxpbS5nTGFzdEJlYWNvbkR0aW1Db3VudCA9IDA7CisgICAgcE1hYy0+bGltLmdMYXN0QmVhY29uRHRpbVBlcmlvZCA9IDA7CisKKyAgICAvL1NjYW4gaW4gUG93ZXIgU2F2ZSBGbGFnCisgICAgcE1hYy0+bGltLmdTY2FuSW5Qb3dlcnNhdmUgPSAwOworfQorCitzdGF0aWMgdm9pZCBfX2xpbUluaXRBc3NvY1ZhcnModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5ncExpbUFJRHBvb2wsCisgICAgICAgICAgICAgICAgICBzaXplb2YoKnBNYWMtPmxpbS5ncExpbUFJRHBvb2wpICogKFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQU1BWCsxKSk7CisgICAgcE1hYy0+bGltLmZyZWVBaWRIZWFkID0gMDsKKyAgICBwTWFjLT5saW0uZnJlZUFpZFRhaWwgPSAwOworICAgIHBNYWMtPmxpbS5nTGltQXNzb2NTdGFMaW1pdCA9IFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQURFRjsKKworICAgIC8vIFBsYWNlIGhvbGRlciBmb3IgY3VycmVudCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0CisgICAgLy8gYmVpbmcgaGFuZGxlZAorICAgIHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEgPSBOVUxMOworICAgIHBNYWMtPmxpbS5ncExpbU1sbUpvaW5SZXEgPSBOVUxMOworCisgICAgLy8vIE1BQyBsZXZlbCBQcmUtYXV0aGVudGljYXRpb24gcmVsYXRlZCBnbG9iYWxzCisgICAgcE1hYy0+bGltLmdMaW1QcmVBdXRoQ2hhbm5lbE51bWJlciA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1QcmVBdXRoVHlwZSA9IGVTSVJfT1BFTl9TWVNURU07CisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcE1hYy0+bGltLmdMaW1QcmVBdXRoUGVlckFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBNYWMtPmxpbS5nTGltTnVtUHJlQXV0aENvbnRleHRzID0gMDsKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwTWFjLT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlLCBzaXplb2YodExpbVByZUF1dGhUYWJsZSkpOworCisgICAgLy8gUGxhY2VkIGhvbGRlciB0byBkZWF1dGggcmVhc29uCisgICAgcE1hYy0+bGltLmdMaW1EZWF1dGhSZWFzb25Db2RlID0gMDsKKworICAgIC8vIFBsYWNlIGhvbGRlciBmb3IgUHJlLWF1dGhlbnRpY2F0aW9uIG5vZGUgbGlzdAorICAgIHBNYWMtPmxpbS5wTGltUHJlQXV0aExpc3QgPSBOVUxMOworCisgICAgLy8gU2VuZCBEaXNhc3NvY2lhdGUgZnJhbWUgdGhyZXNob2xkIHBhcmFtZXRlcnMKKyAgICBwTWFjLT5saW0uZ0xpbURpc2Fzc29jRnJhbWVUaHJlc2hvbGQgPSBMSU1fU0VORF9ESVNBU1NPQ19GUkFNRV9USFJFU0hPTEQ7CisgICAgcE1hYy0+bGltLmdMaW1EaXNhc3NvY0ZyYW1lQ3JlZGl0ID0gMDsKKworICAgIC8vT25lIGNhY2hlIGZvciBlYWNoIG92ZXJsYXAgYW5kIGFzc29jaWF0ZWQgY2FzZS4KKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5wcm90U3RhT3ZlcmxhcENhY2hlLCBzaXplb2YodENhY2hlUGFyYW1zKSAqIExJTV9QUk9UX1NUQV9PVkVSTEFQX0NBQ0hFX1NJWkUpOworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLnByb3RTdGFDYWNoZSwgc2l6ZW9mKHRDYWNoZVBhcmFtcykgKiBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRSk7CisKKyAgICAvLyBJbml0aWFsaXplIEFzc29jL1JlQXNzb2MgUmVzcG9uc2UgRGF0YS9GcmFtZQorICAgIC8vcE1hYy0+bGltLmdMaW1Bc3NvY1Jlc3BvbnNlRGF0YSA9IE5VTEw7CisKK30KKworCitzdGF0aWMgdm9pZCBfX2xpbUluaXRUaXRhblZhcnModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBwTWFjLT5saW0uZ0NiTW9kZSA9IFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRTsKKyAgICBTRVRfQ0JfU1RBVEVfRElTQUJMRSggcE1hYy0+bGltLmdDYlN0YXRlICk7CisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLCBzaXplb2YodExpbUNoYW5uZWxTd2l0Y2hJbmZvKSk7CisKKyAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUgICAgICAgICAgICAgICA9IGVMSU1fQ0hBTk5FTF9TV0lUQ0hfSURMRTsKKyAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc2Vjb25kYXJ5U3ViQmFuZCAgICA9IGVBTklfQ0JfU0VDT05EQVJZX05PTkU7CisKKyAgICAvLyBEZWJ1ZyB3b3JrYXJvdW5kIGZvciBCRUFDT04ncworICAgIC8vIFN0YXRlIGNoYW5nZSB0cmlnZ2VyZWQgYnkgImR1bXAgMjIyIgorICAgIHBNYWMtPmxpbS5nTGltU2Nhbk92ZXJyaWRlID0gMTsKKyAgICBwTWFjLT5saW0uZ0xpbVNjYW5PdmVycmlkZVNhdmVkID0gZVNJUl9BQ1RJVkVfU0NBTjsKKworCisgICAgLy8gQ2FjaGVzIHRoZSBDQiBTdGF0ZSBhcyBkZXNpcmVkIGJ5IFNNRQorICAgIFNFVF9DQl9TVEFURV9ESVNBQkxFKCBwTWFjLT5saW0uZ0NiU3RhdGVQcm90ZWN0ZWQgKTsKKworICAgIC8vIFRPRE8gLSBUaGlzIG5lZWRzIHRvIGJlIHJlYWQgb2ZmIG9mIGEgQ0ZHIHZhcmlhYmxlCisKKyAgICBwTWFjLT5saW0uZ0xpbVRpdGFuU3RhQ291bnQgPSAwOworICAgIHBNYWMtPmxpbS5nTGltQmxvY2tOb25UaXRhblN0YSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fbGltSW5pdEhUVmFycyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHBNYWMtPmxpbS5odENhcGFiaWxpdHlQcmVzZW50SW5CZWFjb24gPSAwOworICAgIHBNYWMtPmxpbS5odENhcGFiaWxpdHkgPSAwOworICAgIHBNYWMtPmxpbS5nSFRHcmVlbmZpZWxkID0gMDsKKyAgICBwTWFjLT5saW0uZ0hUU3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0gMDsKKyAgICBwTWFjLT5saW0uZ0hUU2hvcnRHSTQwTWh6ID0gMDsKKyAgICBwTWFjLT5saW0uZ0hUU2hvcnRHSTIwTWh6ID0gMDsKKyAgICBwTWFjLT5saW0uZ0hUTWF4QW1zZHVMZW5ndGggPSAwOworICAgIHBNYWMtPmxpbS5nSFREc3NzQ2NrUmF0ZTQwTUh6U3VwcG9ydCA9IDA7CisgICAgcE1hYy0+bGltLmdIVFBTTVBTdXBwb3J0ID0gMDsKKyAgICBwTWFjLT5saW0uZ0hUTHNpZ1RYT1BQcm90ZWN0aW9uID0gMDsKKyAgICBwTWFjLT5saW0uZ0hUTUlNT1BTU3RhdGUgPSBlU0lSX0hUX01JTU9fUFNfU1RBVElDOworICAgIHBNYWMtPmxpbS5nSFRBTXBkdURlbnNpdHkgPSAwOworCisgICAgcE1hYy0+bGltLmdNYXhBbXNkdVNpemVFbmFibGVkID0gZmFsc2U7CisgICAgcE1hYy0+bGltLmdIVE1heFJ4QU1wZHVGYWN0b3IgPSAwOworICAgIHBNYWMtPmxpbS5nSFRTZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSA9IDA7CisgICAgcE1hYy0+bGltLmdIVENvbnRyb2xsZWRBY2Nlc3NPbmx5ID0gMDsKKyAgICBwTWFjLT5saW0uZ0hUUmVjb21tZW5kZWRUeFdpZHRoU2V0ID0gMDsKKyAgICBwTWFjLT5saW0uZ0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfTk9ORTsKKyAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfUFVSRTsKKyAgICBwTWFjLT5saW0uZ0hUUENPQWN0aXZlID0gMDsKKworICAgIHBNYWMtPmxpbS5nSFRQQ09QaGFzZSA9IDA7CisgICAgcE1hYy0+bGltLmdIVFNlY29uZGFyeUJlYWNvbiA9IDA7CisgICAgcE1hYy0+bGltLmdIVER1YWxDVFNQcm90ZWN0aW9uID0gMDsKKyAgICBwTWFjLT5saW0uZ0hUU1RCQ0Jhc2ljTUNTID0gMDsKKyAgICBwTWFjLT5saW0uZ0FkZEJBX0RlY2xpbmVkID0gMDsgICAgICAgICAgICAgICAvLyBGbGFnIHRvIERlY2xpbmUgdGhlIEJBUiBpZiB0aGUgcGFydGljdWxhciBiaXQgKDAtNykgaXMgYmVpbmcgc2V0ICAgCit9CisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorc3RhdGljIHRTaXJSZXRTdGF0dXMgX19saW1Jbml0Q29uZmlnKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgIHRBTklfVTMyIHZhbDEsIHZhbDIsIHZhbDMsIGxlbjsKKyAgIHRBTklfVTE2IHZhbDE2OworICAgdEFOSV9VOCB2YWw4OworICAgdFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gICAqcEhUQ2FwYWJpbGl0eUluZm87CisgICB0U2lyTWFjSFRJbmZvRmllbGQxICAgICAgICpwSFRJbmZvRmllbGQxOworICAgdHBTaXJQb3dlclNhdmVDZmcgICAgICAgICAgcFBvd2VyU2F2ZUNvbmZpZzsKKyAgIHRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvICAgKnBBbXBkdVBhcmFtSW5mbzsKKworICAgLyogUmVhZCBhbGwgdGhlIENGR3MgaGVyZSB0aGF0IHdlcmUgdXBkYXRlZCBiZWZvcmUgcGVTdGFydCBpcyBjYWxsZWQgKi8KKworICAgLyogV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSAqLworCisgICBoYW5kbGVDQkNGR0NoYW5nZSggcE1hYywgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSApOworICAgICAgICAgCisgICAvL2ZvciBTZWNvbmRhcnkgY2hhbm5lbCwgY2hhbmdlIHNldHVwQ0JNb2RlIGZ1bmN0aW9uIE9SIHRoZSBjYWxsZXIgb2YgdGhhdAorICAgLy9mdW5jdGlvbiBkdXJpbmcgSm9pbiAoU1RBKSBvciBTdGFydCBCU1MoQVAvSUJTUykgTm93IHVwZGF0ZSB0aGUgSFQgQ2FwYWJpbGl0eQorICAgLy9DRkcgYmFzZWQgb24gQ2hhbm5lbCBCb25kaW5nIENGRworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgJnZhbDEpICE9IGVTSVJfU1VDQ0VTUykgCisgICB7CisgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgSFQgQ2FwIENGR1xuIikpOykKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICB9CisKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREUsICZ2YWwyKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIENoYW5uZWwgQm9uZGluZyBDRkdcbiIpKTspCisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorICAgdmFsMTYgPSAoIHRBTklfVTE2ICkgdmFsMTsKKyAgIHBIVENhcGFiaWxpdHlJbmZvID0gKCB0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyogKSAmdmFsMTY7CisgIAorICAgLy9jaGFubmVsIGJvbmRpbmcgbW9kZSBjb3VsZCBiZSBzZXQgdG8gYW55dGhpbmcgZnJvbSAwIHRvIDQoVGl0YW4gaGFkIHRoZXNlIAorICAgLy8gbW9kZXMgQnV0IGZvciBUYXVydXMgd2UgaGF2ZSBvbmx5IHR3byBtb2RlczogZW5hYmxlKD4wKSBvciBkaXNhYmxlKD0wKQorICAgcEhUQ2FwYWJpbGl0eUluZm8tPnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9IHZhbDIgPyAKKyAgICAgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9FTkFCTEUgOiBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisgICBpZihjZmdTZXRJbnQocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgKih0QU5JX1UxNiopcEhUQ2FwYWJpbGl0eUluZm8pIAorICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHVwZGF0ZSBIVCBDYXAgSW5mbyBDRkdcbiIpKTspCisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorCisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0hUX0lORk9fRklFTEQxLCAmdmFsMSkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEhUIElORk8gRmllbGQxIENGR1xuIikpOykKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICB9CisKKyAgIHZhbDggPSAoIHRBTklfVTggKSB2YWwxOworICAgcEhUSW5mb0ZpZWxkMSA9ICggdFNpck1hY0hUSW5mb0ZpZWxkMSogKSAmdmFsODsKKyAgIHBIVEluZm9GaWVsZDEtPnJlY29tbWVuZGVkVHhXaWR0aFNldCA9IAorICAgICAodEFOSV9VOClwSFRDYXBhYmlsaXR5SW5mby0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworICAgcE1hYy0+bGltLmdIVFJlY29tbWVuZGVkVHhXaWR0aFNldCA9IHBIVEluZm9GaWVsZDEtPnJlY29tbWVuZGVkVHhXaWR0aFNldDsKKyAgIGlmKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0hUX0lORk9fRklFTEQxLCAqKHRBTklfVTgqKXBIVEluZm9GaWVsZDEpIAorICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHVwZGF0ZSBIVCBJbmZvIEZpZWxkXG4iKSk7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKworICAgLyogV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCAqLworICAKKyAgIGlmKCB3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xELCAmdmFsMSkgIT0gCisgICAgICAgZVNJUl9TVUNDRVNTICkgCisgICB7CisgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCBDRkdcbiIpKTspIAorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKyAgIGlmKCF2YWwxKSAKKyAgIHsKKyAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0hFQVJUX0JFQVRfVElNRVIpOworICAgICAgcE1hYy0+c3lzLmdTeXNFbmFibGVMaW5rTW9uaXRvck1vZGUgPSAwOworICAgfSAKKyAgIGVsc2UgCisgICB7CisgICAgICAvL05vIG5lZWQgdG8gYWN0aXZhdGUgdGhlIHRpbWVyIGR1cmluZyBpbml0IHRpbWUuCisgICAgICBwTWFjLT5zeXMuZ1N5c0VuYWJsZUxpbmtNb25pdG9yTW9kZSA9IDE7CisgICB9CisKKyAgIC8qIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFogKi8KKworICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEhUIENhcCBDRkdcbiIpKTspCisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfR0lfMjBNSFosICZ2YWwyKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIHNob3J0R0kgMjBNaHogQ0ZHXG4iKSk7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKyAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1NIT1JUX0dJXzQwTUhaLCAmdmFsMykgIT0gZVNJUl9TVUNDRVNTKSAKKyAgIHsKKyAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBzaG9ydEdJIDQwTWh6IENGR1xuIikpOykKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICB9CisKKyAgIHZhbDE2ID0gKCB0QU5JX1UxNiApIHZhbDE7CisgICBwSFRDYXBhYmlsaXR5SW5mbyA9ICggdFNpck1hY0hUQ2FwYWJpbGl0eUluZm8qICkgJnZhbDE2OworICAgcEhUQ2FwYWJpbGl0eUluZm8tPnNob3J0R0kyME1IeiA9ICh0QU5JX1UxNil2YWwyOworICAgcEhUQ2FwYWJpbGl0eUluZm8tPnNob3J0R0k0ME1IeiA9ICh0QU5JX1UxNil2YWwzOworCisgICBpZihjZmdTZXRJbnQocE1hYywgIFdOSV9DRkdfSFRfQ0FQX0lORk8sICoodEFOSV9VMTYqKXBIVENhcGFiaWxpdHlJbmZvKSAhPSAKKyAgICAgIGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgQ2FwIEluZm8gQ0ZHXG4iKSk7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKworICAgLyogV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SICovCisKKyAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNUywgJnZhbDEpICE9IGVTSVJfU1VDQ0VTUykgCisgICB7CisgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgSFQgQU1QRFUgUGFyYW0gQ0ZHXG4iKSk7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKyAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1IsICZ2YWwyKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEFNUERVIEZhY3RvciBDRkdcbiIpKTspCisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorICAgdmFsMTYgPSAoIHRBTklfVTE2ICkgdmFsMTsKKyAgIHBBbXBkdVBhcmFtSW5mbyA9ICggdFNpck1hY0hUUGFyYW1ldGVyc0luZm8qICkgJnZhbDE2OworICAgcEFtcGR1UGFyYW1JbmZvLT5tYXhSeEFNUERVRmFjdG9yID0gKHRBTklfVTgpdmFsMjsKKyAgIGlmKGNmZ1NldEludChwTWFjLCAgV05JX0NGR19IVF9BTVBEVV9QQVJBTVMsICoodEFOSV9VOCopcEFtcGR1UGFyYW1JbmZvKSAhPSAKKyAgICAgIGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgQU1QRFUgUGFyYW0gQ0ZHXG4iKSk7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKworICAgLyogV05JX0NGR19TSE9SVF9QUkVBTUJMRSAtIHRoaXMgb25lIGlzIG5vdCB1cGRhdGVkIGluIAorICAgICAgbGltSGFuZGxlQ0ZHcGFyYW1VcGRhdGUgZG8gd2Ugd2FudCB0byB1cGRhdGUgdGhpcz8gKi8KKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEUsICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgc2hvcnQgcHJlYW1ibGUgZmFpbGVkXG4iKSk7CisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorCisgICAvKiBXTklfQ0ZHX0JTU0lEIC0gdGhpcyBvbmUgaXMgbm90IHVwZGF0ZWQgaW4gbGltSGFuZGxlQ0ZHcGFyYW1VcGRhdGUgZG8gd2UKKyAgICAgIHdhbnQgdG8gdXBkYXRlIHRoaXM/ICovCisgICBsZW4gPSA2OworICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsIFdOSV9DRkdfQlNTSUQsIHBNYWMtPmxpbS5nTGltQnNzaWQsICZsZW4pICE9IAorICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBic3NpZCBmYWlsZWRcbiIpKTsKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIFdOSV9DRkdfTUFYX1BTX1BPTEwgKi8KKworICAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gcG93ZXIgc2F2ZSBjb25maWd1cmF0aW9uLiAqLworICAgaWYgKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwUG93ZXJTYXZlQ29uZmlnLAorICAgICAgICBzaXplb2YodFNpclBvd2VyU2F2ZUNmZykpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICB7CisgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJMSU06IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBvd2VyIHNhdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWd1cmF0aW9uXG4iKSk7KSAKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICB9CisgICAgICAgCisgICAvKiBUaGlzIGNvbnRleHQgc2hvdWxkIGJlIHZhbGlkIGlmIHBvd2VyLXNhdmUgY29uZmlndXJhdGlvbiBtZXNzYWdlIGhhcyBiZWVuCisgICAgKiBhbHJlYWR5IGRpc3BhdGNoZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuIFJlLXVzaW5nIHRoZSBwcmVzZW50CisgICAgKiBjb25maWd1cmF0aW9uIG1hc2sKKyAgICAqLworICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwUG93ZXJTYXZlQ29uZmlnLCAodEFOSV9VOCAqKSZwTWFjLT5wbW0uZ1BtbUNmZywgCisgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyUG93ZXJTYXZlQ2ZnKSk7CisKKyAgIC8qIE5vdGU6IGl0IGlzIG9rYXkgdG8gZG8gdGhpcyBzaW5jZSBEQUwvSEFMIGlzIGFscmFkeSBzdGFydGVkICovCisgICBpZiAoIChwbW1TZW5kUG93ZXJTYXZlQ2ZnKHBNYWMsIHBQb3dlclNhdmVDb25maWcpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJMSU06IHBtbVNlbmRQb3dlclNhdmVDZmcoKSBmYWlsZWQgXG4iKSk7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKworICAgLyogV05JX0NGR19CR19TQ0FOX0NIQU5ORUxfTElTVF9DSEFOTkVMX0xJU1QgKi8KKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IFdMQU5fU1RBKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgRkwoIlZBTElEX0NIQU5ORUxfTElTVCBoYXMgY2hhbmdlZCwgcmVzZXQgbmV4dCBiZyBzY2FuIGNoYW5uZWxcbiIpKTspCisgICBwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuQ2hhbm5lbElkID0gMDsKKyNlbmRpZgorCisgICAvKiBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEEgLSBub3QgbmVlZGVkICovCisKKyAgIC8qIFRoaXMgd2FzIGluaXRpYWxseSBkb25lIGFmdGVyIHJlc3VtZSBub3RpZmljYXRpb24gZnJvbSBIQUwuIE5vdywgREFMIGlzCisgICAgICBzdGFydGVkIGJlZm9yZSBQRSBzbyB0aGlzIGNhbiBiZSBkb25lIGhlcmUgKi8KKyAgIGhhbmRsZUNCQ0ZHQ2hhbmdlKCBwTWFjLCBBTklfSUdOT1JFX0NGR19JRCApOworICAgaGFuZGxlSFRDYXBhYmlsaXR5YW5kSFRJbmZvKHBNYWMpOworCisgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorI2VuZGlmICAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworLyoKKyAgIGxpbVN0YXJ0CisgICBUaGlzIGZ1bmN0aW9uIGlzIHRvIHJlcGxhY2UgdGhlIF9fbGltUHJvY2Vzc1NtZVN0YXJ0UmVxIHNpbmNlIHRoZXJlIGlzIG5vIAorICAgZVdOSV9TTUVfU1RBUlRfUkVRIHBvc3QgdG8gUEUuCisqLwordFNpclJldFN0YXR1cyBsaW1TdGFydCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgdFNpclJlc3VsdENvZGVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisKKyAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIiBlbnRlclxuIikpOykKKworICAgaWYgKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgPT0gZUxJTV9TTUVfT0ZGTElORV9TVEFURSkKKyAgIHsKKyAgICAgIHBNYWMtPmxpbS5nTGltU21lU3RhdGUgPSBlTElNX1NNRV9JRExFX1NUQVRFOworCisgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKworICAgICAgLy8gQnkgZGVmYXVsdCBkbyBub3QgcmV0dXJuIGFmdGVyIGZpcnN0IHNjYW4gbWF0Y2gKKyAgICAgIHBNYWMtPmxpbS5nTGltUmV0dXJuQWZ0ZXJGaXJzdE1hdGNoID0gMDsKKworICAgICAgLy8gSW5pdGlhbGl6ZSBNTE0gc3RhdGUgbWFjaGluZQorICAgICAgbGltSW5pdE1sbShwTWFjKTsKKworICAgICAgLy8gQnkgZGVmYXVsdCByZXR1cm4gdW5pcXVlIHNjYW4gcmVzdWx0cworICAgICAgcE1hYy0+bGltLmdMaW1SZXR1cm5VbmlxdWVSZXN1bHRzID0gdHJ1ZTsKKyAgICAgIHBNYWMtPmxpbS5nTGltU21lU2NhblJlc3VsdExlbmd0aCA9IDA7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAvKioKKyAgICAgICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIGVXTklfU01FX1NUQVJUX1JFUSBpbiBzdGF0ZXMKKyAgICAgICogb3RoZXIgdGhhbiBPRkZMSU5FLiBSZXR1cm4gcmVzcG9uc2UgdG8gaG9zdCBhbmQKKyAgICAgICogbG9nIGVycm9yCisgICAgICAqLworICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIFNNRSBzdGF0ZSAlWFxuIikscE1hYy0+bGltLmdMaW1TbWVTdGF0ZSApOworICAgICAgcmV0Q29kZSA9IGVTSVJfRkFJTFVSRTsKKyAgIH0KKyAgIAorICAgcmV0dXJuIHJldENvZGU7Cit9CisKKy8qKgorICogbGltSW5pdGlhbGl6ZSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gTElNIHRocmVhZCBlbnRyeSBmdW5jdGlvbi4KKyAqIExJTSByZWxhdGVkIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24uCisgKgorICpMT0dJQzoKKyAqIE5BCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1Jbml0aWFsaXplKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisKKyAgICBfX2xpbUluaXRBc3NvY1ZhcnMocE1hYyk7CisgICAgX19saW1Jbml0VmFycyhwTWFjKTsKKyAgICBfX2xpbUluaXRTdGF0ZXMocE1hYyk7CisgICAgX19saW1Jbml0U3RhdHNWYXJzKHBNYWMpOworICAgIF9fbGltSW5pdEJzc1ZhcnMocE1hYyk7CisgICAgX19saW1Jbml0U2NhblZhcnMocE1hYyk7CisgICAgX19saW1Jbml0SFRWYXJzKHBNYWMpOworICAgIF9fbGltSW5pdFRpdGFuVmFycyhwTWFjKTsKKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgICAgc3RhdHVzID0gbGltU3RhcnQocE1hYyk7CisgICAgaWYoZVNJUl9TVUNDRVNTICE9IHN0YXR1cykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisgICAgLyoKKyAgICAgKiBNTE0gd2lsbCBiZSBpbnRpdGFsaXplZCB3aGVuICdTVEFSVCcgcmVxdWVzdCBjb21lcyBmcm9tIFNNRS4KKyAgICAgKiBsaW1Jbml0TWxtIGNhbGxzIGxpbUNyZWF0ZVRpbWVycywgd2hpY2ggYWN0dWFsbHkgcmVsaWVzIG9uCisgICAgICogQ0ZHIHRvIGJlIGRvd25sb2FkZWQuIFNvIGl0IHNob3VsZCBub3QgYmUgY2FsbGVkIGFzIHBhcnQgb2YKKyAgICAgKiBwZVN0YXJ0LCBhcyBDRkcgZG93bmxvYWQgaXMgaGFwcGVuaW5nIGFmdGVyIHBlU3RhcnQuCisgICAgICovCisgICAgLy9saW1Jbml0TWxtKHBNYWMpOworICAgIC8vIEluaXRpYWxpemF0aW9ucyBmb3IgbWFpbnRhaW5pbmcgcGVlcnMgaW4gSUJTUworICAgIGxpbUlic3NJbml0KHBNYWMpOworCisgICAgcG1tSW5pdGlhbGl6ZShwTWFjKTsKKworICAgIAorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIHJybUluaXRpYWxpemUocE1hYyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgbGltRlRPcGVuKHBNYWMpOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgdm9zX2xpc3RfaW5pdCgmcE1hYy0+bGltLmdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlKTsKKyNlbmRpZiAgICAKKworI2lmIDAKKworICAgIHZvc190cmFjZV9zZXRMZXZlbChWT1NfTU9EVUxFX0lEX1BFLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IpOworICAgIHZvc190cmFjZV9zZXRMZXZlbChWT1NfTU9EVUxFX0lEX1BFLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTik7CisgICAgdm9zX3RyYWNlX3NldExldmVsKFZPU19NT0RVTEVfSURfUEUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCk7CisKKyAgICB2b3NfdHJhY2Vfc2V0TGV2ZWwoVk9TX01PRFVMRV9JRF9IQUwsIFZPU19UUkFDRV9MRVZFTF9XQVJOKTsKKyAgICB2b3NfdHJhY2Vfc2V0TGV2ZWwoVk9TX01PRFVMRV9JRF9IQUwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUik7CisKKyAgICB2b3NfdHJhY2Vfc2V0TGV2ZWwoVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9XQVJOKTsKKyAgICB2b3NfdHJhY2Vfc2V0TGV2ZWwoVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUik7CisgICAgdm9zX3RyYWNlX3NldExldmVsKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUik7CisgICAgCisgICAgdm9zX3RyYWNlX3NldExldmVsKFZPU19NT0RVTEVfSURfU0FMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IpOworICAgIAorICAgIHZvc190cmFjZV9zZXRMZXZlbChWT1NfTU9EVUxFX0lEX1NTQywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SKTsKKyAgICAKKyAgICB2b3NfdHJhY2Vfc2V0TGV2ZWwoVk9TX01PRFVMRV9JRF9TQUwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUik7CisgICAgdm9zX3RyYWNlX3NldExldmVsKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SKTsKKworICAgIHZvc190cmFjZV9zZXRMZXZlbChWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SKTsKKworICAgIAorICAgIHZvc190cmFjZV9zZXRMZXZlbChWT1NfTU9EVUxFX0lEX0JBTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SKTsKKyAgICAKKyAgICB2b3NfdHJhY2Vfc2V0TGV2ZWwoVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUik7CisjZW5kaWYKKyAgICBNVFJBQ0UobGltVHJhY2VJbml0KHBNYWMpKTsKKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgICAgLy9Jbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9ucyBuZWVkZWQgYnkgUEUKKyAgICBpZiggZVNJUl9GQUlMVVJFID09IF9fbGltSW5pdENvbmZpZyhwTWFjKSkKKyAgICB7CisgICAgICAgLy9XZSBuZWVkIHRvIHVuZG8gZXZlcnl0aGluZyBpbiBsaW1TdGFydAorICAgICAgIGxpbUNsZWFudXBNbG0ocE1hYyk7CisgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgIC8vaW5pdGlhbGl6ZSB0aGUgVFNQRUMgYWRtaXNzaW9uIGNvbnRyb2wgdGFibGUuCisgICAvL05vdGUgdGhhdCB0aGlzIHdhcyBpbml0aWFsbHkgZG9uZSBhZnRlciByZXN1bWUgbm90aWZpY2F0aW9uIGZyb20gSEFMLgorICAgLy9Ob3csIERBTCBpcyBzdGFydGVkIGJlZm9yZSBQRSBzbyB0aGlzIGNhbiBiZSBkb25lIGhlcmUKKyAgIGxpbUFkbWl0Q29udHJvbEluaXQocE1hYyk7CisgICBsaW1SZWdpc3RlckhhbEluZENhbGxCYWNrKHBNYWMpOworI2VuZGlmIC8qRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DKi8KKworICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIAorfSAvKioqIGVuZCBsaW1Jbml0aWFsaXplKCkgKioqLworCisKKworLyoqCisgKiBsaW1DbGVhbnVwKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiByZXNldCBvciBwZXJzb25hIGNoYW5nZQorICogdG8gY2xlYW51cCBMSU0gc3RhdGUKKyAqCisgKkxPR0lDOgorICogTkEKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbUNsZWFudXAodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyNpZmRlZiBWT1NTX0VOQUJMRUQKKyAgICB2X1BWT0lEX3QgcHZvc0dDVHg7CisgICAgVk9TX1NUQVRVUyByZXRTdGF0dXM7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKy8vQmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGxpc3QgbWFraW5nIHN1cmUgYWxsIHRoZSBub2RlcyBoYXZlIGJlZW4gZGVsZXRlZC4KKy8vV2hpY2ggc2hvdWxkIGJlIHRoZSBub3JtYWwgY2FzZSwgYnV0IGEgbWVtb3J5IGxlYWsgaGFzIGJlZW4gcmVwb3J0ZWQuCisKKyAgICB0cExpbU1nbXRGcmFtZVJlZ2lzdHJhdGlvbiBwTGltTWdtdFJlZ2lzdHJhdGlvbiA9IE5VTEw7CisgICAgCisgICAgd2hpbGUodm9zX2xpc3RfcmVtb3ZlX2Zyb250KCZwTWFjLT5saW0uZ0xpbU1nbXRGcmFtZVJlZ2lzdHJhdGluUXVldWUsCisgICAgICAgICAgICAodm9zX2xpc3Rfbm9kZV90KiopJnBMaW1NZ210UmVnaXN0cmF0aW9uKSA9PSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9QRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgRkwoIkZpeGluZyBsZWFrISBEZWFsbG9jYXRpbmcgcExpbU1nbXRSZWdpc3RyYXRpb24gbm9kZSIpKTsKKworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMsIHBMaW1NZ210UmVnaXN0cmF0aW9uKTsKKyAgICB9CisKKyAgICB2b3NfbGlzdF9kZXN0cm95KCZwTWFjLT5saW0uZ0xpbU1nbXRGcmFtZVJlZ2lzdHJhdGluUXVldWUpOworI2VuZGlmCisKKyAgICBsaW1DbGVhbnVwTWxtKHBNYWMpOworICAgIGxpbUNsZWFudXBMbW0ocE1hYyk7CisKKyAgICAvLyBmcmVlIHVwIHByZUF1dGggdGFibGUKKyAgICBpZiAocE1hYy0+bGltLmdMaW1QcmVBdXRoVGltZXJUYWJsZS5wVGFibGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1QcmVBdXRoVGltZXJUYWJsZS5wVGFibGUpOworICAgICAgICBwTWFjLT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlLnBUYWJsZSA9IE5VTEw7CisgICAgICAgIHBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUubnVtRW50cnkgPSAwOworICAgIH0KKworICAgIGlmKE5VTEwgIT0gcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuSGVhZCkKKyAgICB7CisgICAgICAgIGxpbURlbGV0ZURpYWxvZ3VlVG9rZW5MaXN0KHBNYWMpOworICAgIH0KKworICAgIGlmKE5VTEwgIT0gcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuVGFpbCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikgcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuVGFpbCk7CisgICAgICAgIHBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlblRhaWwgPSBOVUxMOworICAgIH0KKworICAgICMgaWYgMAorICAgIGlmIChwTWFjLT5saW0uZ3BMaW1TdGFydEJzc1JlcSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ3BMaW1TdGFydEJzc1JlcSk7CisgICAgICAgIHBNYWMtPmxpbS5ncExpbVN0YXJ0QnNzUmVxID0gTlVMTDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiAocE1hYy0+bGltLmdwTGltTWxtU2V0S2V5c1JlcSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ3BMaW1NbG1TZXRLZXlzUmVxKTsKKyAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtU2V0S2V5c1JlcSA9IE5VTEw7CisgICAgfQorCisgICAgI2lmIDAKKyAgICBpZiAocE1hYy0+bGltLmdwTGltSm9pblJlcSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ3BMaW1Kb2luUmVxKTsKKyAgICAgICAgcE1hYy0+bGltLmdwTGltSm9pblJlcSA9IE5VTEw7CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYgKHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcSk7CisgICAgICAgIHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEgPSBOVUxMOworICAgIH0KKworICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NbG1Kb2luUmVxICE9IE5VTEwpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5ncExpbU1sbUpvaW5SZXEpOworICAgICAgICBwTWFjLT5saW0uZ3BMaW1NbG1Kb2luUmVxID0gTlVMTDsKKyAgICB9CisKKyAgICAjaWYgMAorICAgIGlmIChwTWFjLT5saW0uZ3BMaW1SZWFzc29jUmVxICE9IE5VTEwpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5ncExpbVJlYXNzb2NSZXEpOworICAgICAgICBwTWFjLT5saW0uZ3BMaW1SZWFzc29jUmVxID0gTlVMTDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiAocE1hYy0+bGltLmdwTGltTWxtUmVtb3ZlS2V5UmVxICE9IE5VTEwpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5ncExpbU1sbVJlbW92ZUtleVJlcSk7CisgICAgICAgIHBNYWMtPmxpbS5ncExpbU1sbVJlbW92ZUtleVJlcSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcSk7CisgICAgICAgIHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEgPSBOVUxMOworICAgIH0KKworI2lmIDAKKyAgICBpZihOVUxMICE9IHBNYWMtPmxpbS5iZWFjb24pCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKikgcE1hYy0+bGltLmJlYWNvbik7CisgICAgICAgIHBNYWMtPmxpbS5iZWFjb24gPSBOVUxMOworICAgICB9CisjZW5kaWYKKyAgICAjaWYgMAorICAgIGlmKE5VTEwgIT0gcE1hYy0+bGltLmFzc29jUmVxKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopIHBNYWMtPmxpbS5hc3NvY1JlcSk7CisgICAgICAgIHBNYWMtPmxpbS5hc3NvY1JlcT0gTlVMTDsKKyAgICAgfQorICAgICNlbmRpZgorCisjaWYgMAorICAgIGlmKE5VTEwgIT0gcE1hYy0+bGltLmFzc29jUnNwKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopIHBNYWMtPmxpbS5hc3NvY1JzcCk7CisgICAgICAgIHBNYWMtPmxpbS5hc3NvY1JzcD0gTlVMTDsKKyAgICAgfQorI2VuZGlmCisgICAgLy8gTm93LCBmaW5hbGx5IHJlc2V0IHRoZSBkZWZlcnJlZCBtZXNzYWdlIHF1ZXVlIHBvaW50ZXJzCisgICAgbGltUmVzZXREZWZlcnJlZE1zZ1EocE1hYyk7CisKKyNpZmRlZiBWT1NTX0VOQUJMRUQKKworICAgIHB2b3NHQ1R4ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1BFLCAodl9WT0lEX3QgKikgcE1hYyk7CisgICAgcmV0U3RhdHVzID0gV0xBTlRMX0RlUmVnaXN0ZXJNZ210RnJtQ2xpZW50KHB2b3NHQ1R4KTsKKworICAgIGlmICggcmV0U3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUyApCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkRlUmVnaXN0ZXJpbmcgdGhlIFBFIEhhbmRsZSB3aXRoIFRMIGhhcyBmYWlsZWQgYmFpbGluZyBvdXQuLi5cbiIpKTspCisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIHJybUNsZWFudXAocE1hYyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgbGltRlRDbGVhbnVwKHBNYWMpOworI2VuZGlmCisKK30gLyoqKiBlbmQgbGltQ2xlYW51cCgpICoqKi8KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIHBlT3BlbgorXGJyaWVmIHdpbGwgYmUgY2FsbGVkIGluIE9wZW4gc2VxdWVuY2UgZnJvbSBtYWNPcGVuCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gICB0SGFsT3BlblBhcmFtZXRlcnMgKnBIYWxPcGVuUGFyYW0KK1xyZXR1cm4gIHRTaXJSZXRTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgcGVPcGVuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRNYWNPcGVuUGFyYW1ldGVycyAqcE1hY09wZW5QYXJhbSkKK3sKKyAgICBwTWFjLT5saW0ubWF4QnNzSWQgPSBwTWFjT3BlblBhcmFtLT5tYXhCc3NJZDsKKyAgICBwTWFjLT5saW0ubWF4U3RhdGlvbiA9IHBNYWNPcGVuUGFyYW0tPm1heFN0YXRpb247CisKKyAgICBpZiAoKHBNYWMtPmxpbS5tYXhCc3NJZCA9PSAwKSB8fCAocE1hYy0+bGltLm1heFN0YXRpb24gPT0gMCkpCisgICAgeworICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgibWF4IG51bWJlciBvZiBCc3NpZCBvciBTdGF0aW9ucyBjYW5ub3QgYmUgemVybyFcbiIpKTspCisgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICh2b2lkICoqKSAmcE1hYy0+bGltLmxpbVRpbWVycy5ncExpbUNuZldhaXRUaW1lciwgc2l6ZW9mKFRYX1RJTUVSKSpwTWFjLT5saW0ubWF4U3RhdGlvbikpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkIVxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAodm9pZCAqKikgJnBNYWMtPmxpbS5ncExpbUFJRHBvb2wsIAorICAgICAgICAgICAgICBzaXplb2YoKnBNYWMtPmxpbS5ncExpbUFJRHBvb2wpICogKFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUX1NUQU1BWCsxKSkpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkIVxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLAorICAgICAgICAodm9pZCAqKikgJnBNYWMtPmxpbS5ncFNlc3Npb24sIHNpemVvZih0UEVTZXNzaW9uKSogcE1hYy0+bGltLm1heEJzc0lkKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgibWVtb3J5IGFsbG9jYXRlIGZhaWxlZCFcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ3BTZXNzaW9uLCBzaXplb2YodFBFU2Vzc2lvbikqcE1hYy0+bGltLm1heEJzc0lkKTsKKworCisgLyoKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAodm9pZCAqKikgJnBNYWMtPmRwaC5kcGhIYXNoVGFibGUucEhhc2hUYWJsZSwgc2l6ZW9mKHRwRHBoSGFzaE5vZGUpKnBNYWMtPmxpbS5tYXhTdGF0aW9uKSkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIm1lbW9yeSBhbGxvY2F0ZSBmYWlsZWQhXG4iKSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICh2b2lkICoqKSAmcE1hYy0+ZHBoLmRwaEhhc2hUYWJsZS5wRHBoTm9kZUFycmF5LCBzaXplb2YodERwaEhhc2hOb2RlKSpwTWFjLT5saW0ubWF4U3RhdGlvbikpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkIVxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgKi8KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAodm9pZCAqKikgJnBNYWMtPnBtbS5nUG1tVGltLnBUaW0sIHNpemVvZih0QU5JX1U4KSpwTWFjLT5saW0ubWF4U3RhdGlvbikpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkIGZvciBwVGltIVxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5wbW0uZ1BtbVRpbS5wVGltLCBzaXplb2YodEFOSV9VOCkqcE1hYy0+bGltLm1heFN0YXRpb24pOworI2VuZGlmCisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgKHZvaWQgKiopICZwTWFjLT5wbW0uZ1BtbVRpbS5wU3RhSW5mbywgc2l6ZW9mKCpwTWFjLT5wbW0uZ1BtbVRpbS5wU3RhSW5mbykgKiBwTWFjLT5saW0ubWF4U3RhdGlvbikpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkIGZvciBwU3RhSW5mbyFcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgKHZvaWQgKiopICZwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZSwgc2l6ZW9mKHRQbW1TdGFTdGF0ZSkqcE1hYy0+bGltLm1heFN0YXRpb24pKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgibWVtb3J5IGFsbG9jYXRlIGZhaWxlZCFcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgKHZvaWQgKiopICZwTWFjLT5wbW0uZ3BQbW1QU1N0YXRlLCBzaXplb2YodEFOSV9VOCkqcE1hYy0+bGltLm1heFN0YXRpb24pKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgibWVtb3J5IGFsbG9jYXRlIGZhaWxlZCFcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorI2VuZGlmCisKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gcGVDbG9zZQorXGJyaWVmIHdpbGwgYmUgY2FsbGVkIGluIGNsb3NlIHNlcXVlbmNlIGZyb20gbWFjQ2xvc2UKK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xyZXR1cm4gIHRTaXJSZXRTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgcGVDbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTggaTsKKworICAgIGlmIChBTklfRFJJVkVSX1RZUEUocE1hYykgPT0gZURSSVZFUl9UWVBFX01GRykKKyAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmxpbVRpbWVycy5ncExpbUNuZldhaXRUaW1lcik7CisgICAgcE1hYy0+bGltLmxpbVRpbWVycy5ncExpbUNuZldhaXRUaW1lciA9IE5VTEw7CisgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ3BMaW1BSURwb29sKTsKKyAgICBwTWFjLT5saW0uZ3BMaW1BSURwb29sID0gTlVMTDsKKworICAgCisgICAgZm9yKGkgPTA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcGVEZWxldGVTZXNzaW9uKHBNYWMsJnBNYWMtPmxpbS5ncFNlc3Npb25baV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ3BTZXNzaW9uKTsKKyAgICBwTWFjLT5saW0uZ3BTZXNzaW9uID0gTlVMTDsKKyAgICAvKgorICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+ZHBoLmRwaEhhc2hUYWJsZS5wSGFzaFRhYmxlKTsKKyAgICBwTWFjLT5kcGguZHBoSGFzaFRhYmxlLnBIYXNoVGFibGUgPSBOVUxMOworICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+ZHBoLmRwaEhhc2hUYWJsZS5wRHBoTm9kZUFycmF5KTsKKyAgICBwTWFjLT5kcGguZHBoSGFzaFRhYmxlLnBEcGhOb2RlQXJyYXkgPSBOVUxMOworICAgICovCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+cG1tLmdQbW1UaW0ucFRpbSk7CisgICAgcE1hYy0+cG1tLmdQbW1UaW0ucFRpbSA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5wbW0uZ1BtbVRpbS5wU3RhSW5mbyk7CisgICAgcE1hYy0+cG1tLmdQbW1UaW0ucFN0YUluZm8gPSBOVUxMOworICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+cG1tLmdwUG1tU3RhU3RhdGUpOworICAgIHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlID0gTlVMTDsKKyAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPnBtbS5ncFBtbVBTU3RhdGUpOworICAgIHBNYWMtPnBtbS5ncFBtbVBTU3RhdGUgPSBOVUxMOworI2VuZGlmCisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIHBlU3RhcnQKK1xicmllZiB3aWxsIGJlIGNhbGxlZCBpbiBzdGFydCBzZXF1ZW5jZSBmcm9tIG1hY1N0YXJ0CitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccmV0dXJuIG5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgcGVTdGFydCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworCisgICAgc3RhdHVzID0gbGltSW5pdGlhbGl6ZShwTWFjKTsKKyNpZiBkZWZpbmVkKEFOSV9MT0dEVU1QKQorICAgIGxpbUR1bXBJbml0KHBNYWMpOworI2VuZGlmIC8vI2lmIGRlZmluZWQoQU5JX0xPR0RVTVApCisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIHBlU3RvcAorXGJyaWVmIHdpbGwgYmUgY2FsbGVkIGluIHN0b3Agc2VxdWVuY2UgZnJvbSBtYWNTdG9wCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccmV0dXJuIG5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgcGVTdG9wKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgbGltQ2xlYW51cChwTWFjKTsKKyAgICBTRVRfTElNX01MTV9TVEFURShwTWFjLCBlTElNX01MTV9PRkZMSU5FX1NUQVRFKTsKKyAgICByZXR1cm47Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gcGVGcmVlTXNnCitcYnJpZWYgQ2FsbGVkIGJ5IFZPUyBzY2hlZHVsZXIgKGZ1bmN0aW9uIHZvc19zY2hlZF9mbHVzaF9tY19tcXMpCitcICAgICAgdG8gZnJlZSBhIGdpdmVuIFBFIG1lc3NhZ2Ugb24gdGhlIFRYIGFuZCBNQyB0aHJlYWQuCitcICAgICAgVGhpcyBoYXBwZW5zIHdoZW4gdGhlcmUgYXJlIG1lc3NhZ2VzIHBlbmRpbmcgaW4gdGhlIFBFIAorXCAgICAgIHF1ZXVlIHdoZW4gc3lzdGVtIGlzIGJlaW5nIHN0b3BwZWQgYW5kIHJlc2V0LiAKK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xwYXJhbSAgIHRTaXJNc2dRICAgICAgIHBNc2cKK1xyZXR1cm4gbm9uZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9WT0lEX3QgcGVGcmVlTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSogcE1zZykKK3sgIAorICAgIGlmIChwTXNnICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoTlVMTCAhPSBwTXNnLT5ib2R5cHRyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoU0lSX0JCX1hQT1JUX01HTVRfTVNHID09IHBNc2ctPnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCh2b3NfcGt0X3QgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90KilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwTXNnLT5ib2R5cHRyID0gMDsKKyAgICAgICAgcE1zZy0+Ym9keXZhbCA9IDA7CisgICAgICAgIHBNc2ctPnR5cGUgPSAwOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyoqCisgKiBUaGUgZnVuY3Rpb24gY2hlY2tzIGlmIGEgcGFydGljdWxhciB0aW1lciBzaG91bGQgYmUgYWxsb3dlZAorICogaW50byBMSU0gd2hpbGUgZGV2aWNlIGlzIHNsZWVwaW5nCisgKi8KK3RBTklfVTggbGltSXNUaW1lckFsbG93ZWRJblBvd2VyU2F2ZVN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKQoreworICAgIHRBTklfVTggcmV0U3RhdHVzID0gVFJVRTsKKworICAgIGlmKCFsaW1Jc1N5c3RlbUluQWN0aXZlU3RhdGUocE1hYykpCisgICAgeworICAgICAgICBzd2l0Y2gocE1zZy0+dHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRG9uJ3QgYWxsb3cgZm9sbG93aW5nIHRpbWVyIG1lc3NhZ2VzIGlmIGluIHNsZWVwICovCisgICAgICAgICAgICBjYXNlIFNJUl9MSU1fTUlOX0NIQU5ORUxfVElNRU9VVDoKKyAgICAgICAgICAgIGNhc2UgU0lSX0xJTV9NQVhfQ0hBTk5FTF9USU1FT1VUOgorICAgICAgICAgICAgY2FzZSBTSVJfTElNX1BFUklPRElDX1BST0JFX1JFUV9USU1FT1VUOgorICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogTWF5IGFsbG93IGZvbGxvd2luZyB0aW1lciBtZXNzYWdlcyBpbiBzbGVlcCBtb2RlICovCisgICAgICAgICAgICBjYXNlIFNJUl9MSU1fSEFTSF9NSVNTX1RIUkVTX1RJTUVPVVQ6CisKKyAgICAgICAgICAgIC8qIFNhZmUgdG8gYWxsb3cgYXMgb2YgdG9kYXksIHRoaXMgdHJpZ2dlcnMgYmFja2dyb3VuZCBzY2FuCisgICAgICAgICAgICAgKiB3aGljaCB3aWxsIG5vdCBiZSBzdGFydGVkIGlmIHRoZSBkZXZpY2UgaXMgaW4gcG93ZXItc2F2ZSBtb2RlCisgICAgICAgICAgICAgKiBtaWdodCBuZWVkIHRvIGJsb2NrIGluIHRoZSBmdXR1cmUgaWYgd2UgZGVjaWRlIHRvIGltcGxlbWVudAorICAgICAgICAgICAgICogc3BlY3RydW0gbWFuYWdlbWVudAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjYXNlIFNJUl9MSU1fUVVJRVRfVElNRU9VVDoKKworICAgICAgICAgICAgLyogU2FmZSB0byBhbGxvdyBhcyBvZiB0b2RheSwgdGhpcyB0cmlnZ2VycyBiYWNrZ3JvdW5kIHNjYW4KKyAgICAgICAgICAgICAqIHdoaWNoIHdpbGwgbm90IGJlIHN0YXJ0ZWQgaWYgdGhlIGRldmljZSBpcyBpbiBwb3dlci1zYXZlIG1vZGUKKyAgICAgICAgICAgICAqIG1pZ2h0IG5lZWQgdG8gYmxvY2sgaW4gdGhlIGZ1dHVyZSBpZiB3ZSBkZWNpZGUgdG8gaW1wbGVtZW50CisgICAgICAgICAgICAgKiBzcGVjdHJ1bSBtYW5hZ2VtZW50CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNhc2UgU0lSX0xJTV9RVUlFVF9CU1NfVElNRU9VVDoKKworICAgICAgICAgICAgLyogU2FmZSB0byBhbGxvdyB0aGlzIHRpbWVybWVzc2FnZSwgdHJpZ2dlcnMgYmFja2dyb3VuZCBzY2FuCisgICAgICAgICAgICAgKiB3aGljaCBpcyBibG9ja2VkIGluIHNsZWVwIG1vZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2FzZSBTSVJfTElNX0NIQU5ORUxfU0NBTl9USU1FT1VUOgorCisgICAgICAgICAgICAvKiBTYWZlIHRvIGFsbG93IHRoaXMgdGltZXIsIHNpbmNlLCB3aGlsZSBpbiBJTVBTIHRoaXMgdGltZXIgd2lsbCBub3QKKyAgICAgICAgICAgICAqIGJlIHN0YXJ0ZWQuIEluIGNhc2Ugb2YgQk1QUyBzbGVlcCwgU29mdE1BQyBoYW5kbGVzIHRoZSBoZWFydC1iZWF0CisgICAgICAgICAgICAgKiB3aGVuIGhlYXJ0LWJlYXQgY29udHJvbCBpcyBoYW5kbGVkIGJhY2sgdG8gUEUsIGRldmljZSB3b3VsZCBoYXZlCisgICAgICAgICAgICAgKiBhbHJlYWR5IHdva2VuLXVwIGR1ZSB0byBFWElUX0JNUFNfSU5EIG1lc2FnZSBmcm9tIFNvZnRNQUMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2FzZSBTSVJfTElNX0hFQVJUX0JFQVRfVElNRU9VVDoKKyAgICAgICAgICAgIGNhc2UgU0lSX0xJTV9QUk9CRV9IQl9GQUlMVVJFX1RJTUVPVVQ6CisKKyAgICAgICAgICAgIC8qIFNhZmUgdG8gYWxsb3csIFBFIGlzIG5vdCBoYW5kbGluZyB0aGlzIG1lc3NhZ2UgYXMgb2Ygbm93LiBNYXkgbmVlZAorICAgICAgICAgICAgICogdG8gYmxvY2sgaXQsIGJhc2ljYWxseSwgZnJlZSB0aGUgYnVmZmVyIGFuZCByZXN0YXJ0IHRoZSB0aW1lcgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjYXNlIFNJUl9MSU1fUkVBU1NPQ19GQUlMX1RJTUVPVVQ6CisgICAgICAgICAgICBjYXNlIFNJUl9MSU1fSk9JTl9GQUlMX1RJTUVPVVQ6CisgICAgICAgICAgICBjYXNlIFNJUl9MSU1fQVNTT0NfRkFJTF9USU1FT1VUOgorICAgICAgICAgICAgY2FzZSBTSVJfTElNX0FVVEhfRkFJTF9USU1FT1VUOgorICAgICAgICAgICAgY2FzZSBTSVJfTElNX0FERFRTX1JTUF9USU1FT1VUOgorICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIGJ5IGRlZmF1bHQgYWxsb3cgcmVzdCBvZiBtZXNzYWdlcyAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXRTdGF0dXMgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXRTdGF0dXM7CisKK30KKworCisKKy8qKgorICogbGltUG9zdE1zZ0FwaSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gb3RoZXIgdGhyZWFkIHdoaWxlIHBvc3RpbmcgYQorICogbWVzc2FnZSB0byBMSU0gbWVzc2FnZSBRdWV1ZSBnU2lyTGltTXNnUS4KKyAqCisgKkxPR0lDOgorICogTkEKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcE1zZyAtIFBvaW50ZXIgdG8gdGhlIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0QU5JX1UzMgorbGltUG9zdE1zZ0FwaSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSAqcE1zZykKK3sKKyNpZmRlZiBWT1NTX0VOQUJMRUQKKyAgICByZXR1cm4gIHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01RX0lEX1BFLCAodm9zX21zZ190ICopIHBNc2cpOworCisKKyNlbGlmIGRlZmluZWQoQU5JX09TX1RZUEVfTElOVVgpIHx8IGRlZmluZWQoQU5JX09TX1RZUEVfT1NYKQorICAgIHJldHVybiB0eF9xdWV1ZV9zZW5kKCZwTWFjLT5zeXMuZ1NpckxpbU1zZ1EsIHBNc2csIFRYX1dBSVRfRk9SRVZFUik7CisKKyNlbHNlCisgICAgLyogQ2hlY2sgaWYgdGhpcyBpcyBhIHRpbWVvdXQgbWVzc2FnZSBmcm9tIGEgdGltZXIKKyAgICAgKiBhbmQgaWYgdGhlIHRpbWVvdXQgbWVzc2FnZSBpcyBhbGxvd2VkIGlmIHRoZSBkZXZpY2UgaXMgaW4gcG93ZXItc2F2ZSBzdGF0ZQorICAgICAqLworICAgIGlmKCFsaW1Jc1RpbWVyQWxsb3dlZEluUG93ZXJTYXZlU3RhdGUocE1hYywgcE1zZykpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgICBGTCgiVGltZW91dCBtZXNzYWdlICVkIGlzIG5vdCBhbGxvd2VkIHdoaWxlIGRldmljZSBpcyBpbiBQb3dlci1TYXZlIG1vZGVcbiIpLAorICAgICAgICAgICAgICAgIHBNc2ctPnR5cGUpOworCisgICAgICAgIHJldHVybiBUWF9TVUNDRVNTOworICAgIH0KKyAgICBpZihwTWFjLT5nRHJpdmVyVHlwZSAhPSBlRFJJVkVSX1RZUEVfTUZHKQorICAgIHsKKyAgICAgICAgbGltTWVzc2FnZVByb2Nlc3NvcihwTWFjLCBwTXNnKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFhfU1VDQ0VTUzsKKworI2VuZGlmCit9IC8qKiogZW5kIGxpbVBvc3RNc2dBcGkoKSAqKiovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBwZVBvc3RNc2dBcGkoKSAtIEEgd3JhcHBlciBmdW5jdGlvbiB0byBwb3N0IG1lc3NhZ2UgdG8gVm9zcyBtc2cgcXVldWVzCisKKyAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGJ5IGxlZ2FjeSBjb2RlIHRvIHBvc3QgbWVzc2FnZSB0byB2b3NzIHF1ZXVlcyBPUgorICBsZWdhY3kgY29kZSBtYXkga2VlcCBvbiBpbnZva2luZyAnbGltUG9zdE1zZ0FwaScgdG8gcG9zdCB0aGUgbWVzc2FnZSB0byB2b3NzIHF1ZXVlCisgIGZvciBkaXNwYXRjaGluZyBpdCBsYXRlci4KKworICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAgXHBhcmFtIHBNc2cgLSBQb2ludGVyIHRvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZQorCisgIFxyZXR1cm4gIHRBTklfVTMyIC0gVFhfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgcGVQb3N0TXNnQXBpKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKQoreworICAgcmV0dXJuICh0U2lyUmV0U3RhdHVzKWxpbVBvc3RNc2dBcGkocE1hYywgcE1zZyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgcGVQcm9jZXNzTWVzc2FnZXMoKSAtIE1lc3NhZ2UgUHJvY2Vzc29yIGZvciBQRQorCisgIFZvc3MgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBkaXNwYXRjaCB0aGUgbWVzc2FnZSB0byBQRQorCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICBccGFyYW0gcE1zZyAtIFBvaW50ZXIgdG8gdGhlIG1lc3NhZ2Ugc3RydWN0dXJlCisKKyAgXHJldHVybiAgdEFOSV9VMzIgLSBUWF9TVUNDRVNTIGZvciBzdWNjZXNzLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBwZVByb2Nlc3NNZXNzYWdlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSogcE1zZykKK3sKKyAgIGlmKHBNYWMtPmdEcml2ZXJUeXBlID09IGVEUklWRVJfVFlQRV9NRkcpCisgICB7CisgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgfQorICAgLyoqCisgICAgKiAgIElmIHRoZSBNZXNzYWdlIHRvIGJlIGhhbmRsZWQgaXMgZm9yIENGRyBNb2R1bGUgY2FsbCB0aGUgQ0ZHIE1zZyBIYW5kbGVyIGFuZAorICAgICogICBmb3IgYWxsIHRoZSBvdGhlciBjYXNlcyBwb3N0IGl0IHRvIExJTQorICAgICovCisgICAgaWYgKCBTSVJfQ0ZHX1BBUkFNX1VQREFURV9JTkQgIT0gcE1zZy0+dHlwZSAmJiBJU19DRkdfTVNHKHBNc2ctPnR5cGUpKQorICAgICAgICBjZmdQcm9jZXNzTWJNc2cocE1hYywgKHRTaXJNYk1zZyopcE1zZy0+Ym9keXB0cik7CisgICAgZWxzZQorICAgICAgICBsaW1NZXNzYWdlUHJvY2Vzc29yKHBNYWMsIHBNc2cpOworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKworI2lmZGVmIFZPU1NfRU5BQkxFRAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcGVIYW5kbGVNZ210RnJhbWUKKyAqCisgKiBGVU5DVElPTjoKKyAqICAgIFByb2Nlc3MgdGhlIE1hbmFnZW1lbnQgZnJhbWVzIGZyb20gVEwKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzogVEwgc2VuZHMgdGhlIHBhY2tldCBhbG9uZyB3aXRoIHRoZSBWT1MgR2xvYmFsQ29udGV4dAorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHB2b3NHQ3R4ICBHbG9iYWwgVm9zIENvbnRleHQKKyAqIEBwYXJhbSB2b3NzQnVmZiAgUGFja2V0CisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitWT1NfU1RBVFVTIHBlSGFuZGxlTWdtdEZyYW1lKCB2X1BWT0lEX3QgcHZvc0dDdHgsIHZfUFZPSURfdCB2b3NCdWZmKQoreworICAgIHRwQW5pU2lyR2xvYmFsICBwTWFjOworICAgIHRwU2lyTWFjTWdtdEhkciBtSGRyOworICAgIHRTaXJNc2dRICAgICAgICBtc2c7CisgICAgdm9zX3BrdF90ICAgICAgKnBWb3NQa3Q7CisgICAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1czsKKyAgICB2X1U4X3QgICAgICAgICAqcFJ4UGFja2V0SW5mbzsKKworICAgIHBWb3NQa3QgPSAodm9zX3BrdF90ICopdm9zQnVmZjsKKyAgICBpZiAoTlVMTCA9PSBwVm9zUGt0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsIHB2b3NHQ3R4KTsKKyAgICBpZiAoTlVMTCA9PSBwTWFjKQorICAgIHsKKyAgICAgICAgLy8gY2Fubm90IGxvZyBhIGZhaWx1cmUgd2l0aG91dCBhIHZhbGlkIHBNYWMKKyAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBWb3NQa3QpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgdm9zU3RhdHVzID0gV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHBWb3NQa3QsICh2b2lkICopJnBSeFBhY2tldEluZm8sIFZPU19GQUxTRSApOworCisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgIHsKKyAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBWb3NQa3QpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisKKyAgICAvLworICAgIC8vICBUaGUgTVBEVSBoZWFkZXIgaXMgbm93IHByZXNlbnQgYXQgYSBjZXJ0YWluICJvZmZzZXQiIGluCisgICAgLy8gdGhlIEJEIGFuZCBpcyBzcGVjaWZpZWQgaW4gdGhlIEJEIGl0c2VsZgorICAgIC8vCisgICAgbUhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKyAgICBpZihtSGRyLT5mYy50eXBlID09IFNJUl9NQUNfTUdNVF9GUkFNRSkgCisgICAgeworICAgIFBFTE9HMShsaW1Mb2coIHBNYWMsIExPRzEsCisgICAgICAgRkwgKCAiUnhCZD0lcCBtSGRyPSVwIFR5cGU6ICVkIFN1YnR5cGU6ICVkICBTaXplczpGQyVkIE1nbXQlZFxuIiksCisgICAgICAgcFJ4QmQsIG1IZHIsIG1IZHItPmZjLnR5cGUsIG1IZHItPmZjLnN1YlR5cGUsIHNpemVvZih0U2lyTWFjRnJhbWVDdGwpLCBzaXplb2YodFNpck1hY01nbXRIZHIpICk7KQorCisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfUlhfTUdNVCwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICBMSU1fVFJBQ0VfTUFLRV9SWE1HTVQobUhkci0+ZmMuc3ViVHlwZSwgIAorICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTE2KSAoKCh0QU5JX1UxNikgKG1IZHItPnNlcUNvbnRyb2wuc2VxTnVtSGkgPDwgNCkpIHwgbUhkci0+c2VxQ29udHJvbC5zZXFOdW1MbykpKTspCisgICAgfQorCisKKyAgICAvLyBGb3J3YXJkIHRvIE1BQyB2aWEgbWVzZyA9IFNJUl9CQl9YUE9SVF9NR01UX01TRworICAgIG1zZy50eXBlID0gU0lSX0JCX1hQT1JUX01HTVRfTVNHOworICAgIG1zZy5ib2R5cHRyID0gdm9zQnVmZjsKKyAgICBtc2cuYm9keXZhbCA9IDA7CisKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IHN5c0JidFByb2Nlc3NNZXNzYWdlQ29yZSggcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhkci0+ZmMudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhkci0+ZmMuc3ViVHlwZSApKQorICAgIHsKKyAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBWb3NQa3QpOworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgICAgICAgICAgRkwgKCAic3lzQmJ0UHJvY2Vzc01lc3NhZ2VDb3JlIGZhaWxlZCB0byBwcm9jZXNzIFNJUl9CQl9YUE9SVF9NR01UX01TR1xuIiApKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiAgVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcGVSZWdpc3RlclRMSGFuZGxlCisgKgorICogRlVOQ1RJT046CisgKiAgICBSZWdpc3RlcnMgdGhlIEhhbmRsZXIgd2hpY2gsIHByb2Nlc3MgdGhlIE1hbmFnZW1lbnQgZnJhbWVzIGZyb20gVEwKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgcGVSZWdpc3RlclRMSGFuZGxlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdl9QVk9JRF90IHB2b3NHQ1R4OworICAgIFZPU19TVEFUVVMgcmV0U3RhdHVzOworCisgICAgcHZvc0dDVHggPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsICh2X1ZPSURfdCAqKSBwTWFjKTsKKworICAgIHJldFN0YXR1cyA9IFdMQU5UTF9SZWdpc3Rlck1nbXRGcm1DbGllbnQocHZvc0dDVHgsIHBlSGFuZGxlTWdtdEZyYW1lKTsKKworICAgIGlmIChyZXRTdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJSZWdpc3RlcmluZyB0aGUgUEUgSGFuZGxlIHdpdGggVEwgaGFzIGZhaWxlZCBiYWlsaW5nIG91dC4uLlxuIikpOworCit9CisjZW5kaWYKKworCisvKioKKyAqIGxpbUNoZWNrU3RhdGVGb3JMZWFybk1vZGUoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBTQ0ggdG8gdmVyaWZ5IGlmIExJTSBpcyBpbiBhIHN0YXRlCisgKiB0byBwdXQgc3lzdGVtIGludG8gTGVhcm4gbW9kZQorICoKKyAqTE9HSUM6CisgKiBOQQorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIGVTSVJfU1VDQ0VTUyAtIExJTSBpcyBpbiBhIHN0YXRlIHRvIHB1dCBzeXN0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW50byBMZWFybiBNb2RlCisgKiAgICAgICAgIGVTSVJfRkFJTFVSRSAtIExJTSBpcyBOT1QgaW4gYSBzdGF0ZSB0byBwdXQgc3lzdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGludG8gTGVhcm4gTW9kZQorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbUNoZWNrU3RhdGVGb3JMZWFybk1vZGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBzd2l0Y2ggKHBNYWMtPmxpbS5nTGltU21lU3RhdGUpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fU01FX09GRkxJTkVfU1RBVEU6CisgICAgICAgIGNhc2UgZUxJTV9TTUVfSURMRV9TVEFURToKKyAgICAgICAgY2FzZSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEU6CisgICAgICAgIGNhc2UgZUxJTV9TTUVfTk9STUFMX1NUQVRFOgorICAgICAgICBjYXNlIGVMSU1fU01FX0xJTktfRVNUX1NUQVRFOgorICAgICAgICAgICAgLy8gTElNIGlzIGluIGEgc3RhdGUgdG8gcHV0IHN5c3RlbSBpbnRvIExlYXJuIG1vZGUKKyAgICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIExJTSBpcyBOT1QgaW4gYSBzdGF0ZSB0byBwdXQgc3lzdGVtIGludG8gTGVhcm4gbW9kZQorICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9Cit9IC8qKiogZW5kIGxpbUNoZWNrU3RhdGVGb3JMZWFybk1vZGUoKSAqKiovCisKKworCisvKioKKyAqIGxpbUlzU3lzdGVtSW5TY2FuU3RhdGUoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB2YXJpb3VzIE1BQyBzb2Z0d2FyZSBtb2R1bGVzIHRvCisgKiBkZXRlcm1pbmUgaWYgU3lzdGVtIGlzIGluIFNjYW4vTGVhcm4gc3RhdGUKKyAqCisgKkxPR0lDOgorICogTkEKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gdHJ1ZSAgLSBTeXN0ZW0gaXMgaW4gU2Nhbi9MZWFybiBzdGF0ZQorICogICAgICAgICBmYWxzZSAtIFN5c3RlbSBpcyBOT1QgaW4gU2Nhbi9MZWFybiBzdGF0ZQorICovCisKK3RBTklfVTgKK2xpbUlzU3lzdGVtSW5TY2FuU3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBzd2l0Y2ggKHBNYWMtPmxpbS5nTGltU21lU3RhdGUpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fU01FX0NIQU5ORUxfU0NBTl9TVEFURToKKyAgICAgICAgY2FzZSBlTElNX1NNRV9OT1JNQUxfQ0hBTk5FTF9TQ0FOX1NUQVRFOgorICAgICAgICBjYXNlIGVMSU1fU01FX0xJTktfRVNUX1dUX1NDQU5fU1RBVEU6CisgICAgICAgIGNhc2UgZUxJTV9TTUVfV1RfU0NBTl9TVEFURToKKyAgICAgICAgICAgIC8vIFN5c3RlbSBpcyBpbiBMZWFybiBtb2RlCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gU3lzdGVtIGlzIE5PVCBpbiBMZWFybiBtb2RlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfSAvKioqIGVuZCBsaW1Jc1N5c3RlbUluU2NhblN0YXRlKCkgKioqLworCisKKworLyoqCisgKiBsaW1Jc1N5c3RlbUluQWN0aXZlU3RhdGUoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB2YXJpb3VzIE1BQyBzb2Z0d2FyZSBtb2R1bGVzIHRvCisgKiBkZXRlcm1pbmUgaWYgU3lzdGVtIGlzIGluIEFjdGl2ZS9XYWtldXAgc3RhdGUKKyAqCisgKkxPR0lDOgorICogTkEKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gdHJ1ZSAgLSBTeXN0ZW0gaXMgaW4gQWN0aXZlIHN0YXRlCisgKiAgICAgICAgIGZhbHNlIC0gU3lzdGVtIGlzIG5vdCBpbiBBY3RpdmUgc3RhdGUKKyAqLworCit0QU5JX1U4IGxpbUlzU3lzdGVtSW5BY3RpdmVTdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHN3aXRjaCAocE1hYy0+cG1tLmdQbW1TdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgZVBNTV9TVEFURV9CTVBTX1dBS0VVUDoKKyAgICAgICAgY2FzZSBlUE1NX1NUQVRFX0lNUFNfV0FLRVVQOgorICAgICAgICBjYXNlIGVQTU1fU1RBVEVfUkVBRFk6CisgICAgICAgICAgICAvLyBTeXN0ZW0gaXMgaW4gQWN0aXZlIG1vZGUKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIC8vIFN5c3RlbSBpcyBOT1QgaW4gQWN0aXZlIG1vZGUKKyAgICB9Cit9CisKKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisvKioKKyAqIGxpbUNoZWNrQW5kUXVpZXRCU1MoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1TZXRMZWFybk1vZGUoKSB0byBjaGVjaworICogaWYgQlNTIG5lZWRzIHRvIGJlIHF1aWV0ZWQgYW5kIGNhbGwgbGltUXVpZXRCU1MoKSB0bworICogc2VuZCBkYXRhIGZyYW1lIHRvIHNlbGYgZm9yIHRoYXQgcHVycG9zZS4KKyAqCisgKkxPR0lDOgorICogTkEKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltQ2hlY2tBbmRRdWlldEJTUyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTMyIGR1cjsKKworICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgIHsKKyAgICAgICAgLy8gTElNIGlzIGluIEFQIHJvbGUuIFF1aWV0IHRoZSBCU1MgYmVmb3JlCisgICAgICAgIC8vIHN3aXRjaGluZyB0byBjaGFubmVsIHRvIGJlIGxlYXJuZWQKKyAgICAgICAgaWYgKHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb24gPgorICAgICAgICAgICAgTElNX01BWF9RVUlFVF9EVVJBVElPTikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWF5IG5lZWQgdG8gcXVpZXQgQlNTIG11bHRpcGxlIHRpbWVzLgorICAgICAgICAgICAgLy8gUXVpZXQgZm9yIGEgbGltaXQgb2YgMzIgbXNlY3Mgb24gTGVhcm4KKyAgICAgICAgICAgIC8vIGR1cmF0aW9uIGZvciBub3cuCisgICAgICAgICAgICBkdXIgPSBMSU1fTUFYX1FVSUVUX0RVUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZHVyID0KKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb247CisgICAgICAgIH0KKyAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsCisgICAgICAgICAgICAgICBGTCgiKioqIEdvaW5nIHRvIHF1aWV0IEJTUyBmb3IgZHVyYXRpb249JWQgbXNlY1xuIiksCisgICAgICAgICAgICAgICBkdXIpOykKKworICAgICAgICBsaW1RdWlldEJzcyhwTWFjLCBkdXIpOworICAgIH0KK30gLyoqKiBlbmQgbGltQ2hlY2tBbmRRdWlldEJTUygpICoqKi8KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgfHwgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQX1NESykpCisvKioKKyAqIGxpbVNldExlYXJuTW9kZSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldHVwIHN5c3RlbSBpbnRvIExlYXJuIG1vZGUKKyAqIHRvIGNvbGxlY3QgREZTIG1lYXN1cmVtZW50cy4KKyAqCisgKkxPR0lDOgorICogTkEKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltU2V0TGVhcm5Nb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgbGltU2VuZEhhbEluaXRTY2FuUmVxKHBNYWMsIGVMSU1fSEFMX0lOSVRfTEVBUk5fV0FJVF9TVEFURSwgZVNJUl9ET05UX0NIRUNLX0xJTktfVFJBRkZJQ19CRUZPUkVfU0NBTik7CisgICAgcmV0dXJuOworfSAvKioqIGVuZCBsaW1TZXRMZWFybk1vZGUoKSAqKiovCisKKy8qKgorICogbGltQ29udGludWVDaGFubmVsTGVhcm4oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkbyBtZWFzdXJlbWVudCAobGVhcm4pIG9uIGN1cnJlbnQgY2hhbm5lbC4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbUNvbnRpbnVlQ2hhbm5lbExlYXJuKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCAgICAgICAgY2hhbk51bTsKKyAgICB0U2lyTWFjU1NpZCAgICBzc0lkOworICAgIHRTaXJNYWNBZGRyICAgIGJzc0lkID0gezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9OworCisgICAgLy8gVGltZSB0byBjb2xsZWN0IG1lYXN1cmVtZW50cworICAgIGNoYW5OdW0gPSBsaW1HZXRDdXJyZW50TGVhcm5DaGFubmVsKHBNYWMpOworCisgICAgLy8gU3dpdGNoIGNoYW5uZWwKKyAgICBwTWFjLT5saW0uZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSA9IDE7CisKKyAgICBpZiAocE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0NvbnRyb2wuc2NhblR5cGUgPT0gZVNJUl9BQ1RJVkVfU0NBTikKKyAgICB7CisgICAgICAgIC8vLyBQcmVwYXJlIGFuZCBzZW5kIFByb2JlIFJlcXVlc3QgZnJhbWUKKyAgICAgICAgc3NJZC5sZW5ndGggPSAwOworICAgICAgICAvKiBmb3IgbGVhcm5pbmcgY2hhbm5lbCwgd2UgZG9uJ3QgaW5jbHVkZSBhbnkgYWRkaXRpb25hbCBJRSAqLworICAgICAgICBsaW1TZW5kUHJvYmVSZXFNZ210RnJhbWUocE1hYywgJnNzSWQsIGJzc0lkLCBjaGFuTnVtLHBNYWMtPmxpbS5nU2VsZk1hY0FkZHIsIDAgLCBOVUxMKTsKKyAgICB9CisKKyAgICAvLyBBY3RpdmF0ZSBMZWFybiBkdXJhdGlvbiB0aW1lciBkdXJpbmcgd2hpY2gKKyAgICAvLyBERlMgbWVhc3VyZW1lbnRzIGFyZSBtYWRlLgorICAgIHBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5zaG9ydER1cmF0aW9uQ291bnQrKzsKKyAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9MRUFSTl9EVVJBVElPTl9USU1FUik7CisKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9MRUFSTl9EVVJBVElPTl9USU1FUikpOworICAgIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLmxlYXJuRHVyYXRpb25UaW1lcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLy8vIENvdWxkIG5vdCBhY3RpdmF0ZSBsZWFybiBkdXJhdGlvbiB0aW1lci4KKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IGFjdGl2YXRlIGxlYXJuIGR1cmF0aW9uIHRpbWVyXG4iKSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30gLyoqKiBlbmQgbGltQ29udGludWVDaGFubmVsTGVhcm4oKSAqKiovCisKKworLyoqCisgKiBsaW1SZUVuYWJsZUxlYXJuTW9kZSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHZhcmlvdXMgTUFDIHNvZnR3YXJlIG1vZHVsZXMgdG8KKyAqIHJlLWVuYWJsZSBMZWFybiBtb2RlIG1lYXN1cmVtZW50cy4KKyAqCisgKkxPR0lDOgorICogTkEKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUmVFbmFibGVMZWFybk1vZGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgIFBFTE9HNChsaW1Mb2cocE1hYywgTE9HNCwgRkwoInF1aWV0RW5hYmxlZCA9ICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5mUXVpZXRFbmFibGVkKTspCisKKyAgICAvKiogU3RvcCBtZWFzdXJlbWVudCB0ZW1wZXJvcmlseSB3aGVuIHJhZGFyIGlzIGRldGVjdGVkIG9yIGNoYW5uZWwKKyAgICAgKiBzd2l0Y2ggaXMgcnVubmluZyBhcyBwYXJ0IG9mIHBlcmlvZGljIERGUyAqLworICAgIGlmICghcE1hYy0+bGltLmdwTGltTWVhc1JlcSB8fCBMSU1fSVNfUkFEQVJfREVURUNURUQocE1hYykgfHwKKyAgICAgICAgICAgIChwTWFjLT5saW0uZ0xpbVNwZWNNZ210LmRvdDExaENoYW5Td1N0YXRlICA9PSBlTElNXzExSF9DSEFOU1dfUlVOTklORykpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZlF1aWV0RW5hYmxlZCkKKyAgICB7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX1FVSUVUX0JTU19USU1FUikpOworI2lmZGVmIEdFTjZfVE9ETworICAgICAgICAvKiByZXZpc2l0IHRoaXMgcGllY2Ugb2YgY29kZSB0byBhc3NpZ24gdGhlIGFwcHJvcHJpYXRlIHNlc3Npb25JZCBiZWxvdworICAgICAgICAgKiBwcmlvcml0eSAtIEhJR0gKKyAgICAgICAgICovCisgICAgICAgIHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0QnNzVGltZXIuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworI2VuZGlmCisgICAgICAgIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgKKyAgICAgICAgICAgICAgICAgJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0QnNzVGltZXIpCisgICAgICAgICAgICAgICAgICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHN0YXJ0IFF1aWV0IEJzcyB0aW1lclxuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfSU5JVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fTEVBUk5fSU5URVJWQUxfVElNRVIpOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9MRUFSTl9JTlRFUlZBTF9USU1FUikpOworI2lmZGVmIEdFTjZfVE9ETworICAgICAgICAvKiByZXZpc2l0IHRoaXMgcGllY2Ugb2YgY29kZSB0byBhc3NpZ24gdGhlIGFwcHJvcHJpYXRlIHNlc3Npb25JZCBiZWxvdworICAgICAgICAqLworICAgICAgICBwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubGVhcm5JbnRlcnZhbFRpbWVyLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyNlbmRpZgorICAgICAgICBpZiAodHhfdGltZXJfYWN0aXZhdGUoCisgICAgICAgICAgICAgICAgICAgICAmcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLmxlYXJuSW50ZXJ2YWxUaW1lcikKKyAgICAgICAgICAgICAgICAgICAgICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgYWN0aXZhdGUgTGVhcm4gSW50ZXJ2YWwgdGltZXIuCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHN0YXJ0IExlYXJuIEludGVydmFsIHRpbWVyXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJSZS1lbmFibGVkIExlYXJuIG1vZGUgTWVhc3VyZW1lbnRzXG4iKSk7KQorICAgIHBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5kaXNhYmxlTWVhc3VyZW1lbnRzID0gMDsKKworICAgIHJldHVybjsKK30gLyoqKiBlbmQgbGltUmVFbmFibGVMZWFybk1vZGUoKSAqKiovCisKKyNlbmRpZiAvLyNpZiAoZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSB8fCBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKworCisvKiogCisqXGJyaWVmIGxpbVJlY2VpdmVkSEJIYW5kbGVyKCkgCisqIAorKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBzY2hCZWFjb25Qcm9jZXNzKCkgdXBvbgorKiByZWNlaXZpbmcgYSBCZWFjb24gb24gU1RBLiBUaGlzIGFsc28gZ2V0cyBjYWxsZWQgdXBvbgorKiByZWNlaXZpbmcgUHJvYmUgUmVzcG9uc2UgYWZ0ZXIgaGVhdCBiZWF0IGZhaWx1cmUgaXMKKyogZGV0ZWN0ZWQuICAKKyogICAKKyogcGFyYW0gcE1hYyAtIGdsb2JhbCBtYWMgc3RydWN0dXJlCisqIHBhcmFtIGNoYW5uZWwgLSBjaGFubmVsIG51bWJlciBpbmRpY2F0ZWQgaW4gQmVhY29uLCBQcm9iZSBSZXNwb25zZQorKiByZXR1cm4gLSBub25lCisqLworCisKK3ZvaWQKK2xpbVJlY2VpdmVkSEJIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY2hhbm5lbElkLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIGlmKChjaGFubmVsSWQgPT0gMCApIHx8IChjaGFubmVsSWQgPT0gcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSApCisgICAgcHNlc3Npb25FbnRyeS0+TGltUnhlZEJlYWNvbkNudER1cmluZ0hCKys7CisKKyAgICBwTWFjLT5wbW0uaW5NaXNzZWRCZWFjb25TY2VuYXJpbyA9IEZBTFNFOworfSAvKioqIGVuZCBsaW1SZWNlaXZlZEhCSGFuZGxlcigpICoqKi8KKworCisKKyNpZiAwCit2b2lkIGxpbVJlc2V0SEJQa3RDb3VudCh0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHBzZXNzaW9uRW50cnktPkxpbVJ4ZWRCZWFjb25DbnREdXJpbmdIQiA9IDA7Cit9CisjZW5kaWYKKworCisvKgorICogbGltUHJvY2Vzc1dkc0luZm8oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHNjaEJlYWNvblByb2Nlc3MgaW4gQlAKKyAqCisgKlBBUkFNUzoKKyAqIEBwYXJhbSBwTWFjICAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwcm9wSUVJbmZvIC0gcHJvcHJpZXRhcnkgSUUgaW5mbworICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICoKKyAqCisgKlJFVFVSTlM6CisgKgorICovCisKK3ZvaWQgbGltUHJvY2Vzc1dkc0luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgdFNpclByb3BJRVN0cnVjdCBwcm9wSUVJbmZvKQoreworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgdHBTaXJTbWVXZHNJbmZvSW5kICBwU2lyU21lV2RzSW5mb0luZDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgKnBUZW1wOworICAgIHRTaXJNc2dRICAgICAgICAgICAgbW1oTXNnOworCisgICAgaWYgKHByb3BJRUluZm8ud2RzTGVuZ3RoICYmCisgICAgICAgIHByb3BJRUluZm8ud2RzTGVuZ3RoIDw9IEFOSV9XRFNfSU5GT19NQVhfTEVOR1RIKQorICAgIHsKKyAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltV2RzSW5mby53ZHNMZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgocHJvcElFSW5mby53ZHNMZW5ndGggPT0KKyAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1XZHNJbmZvLndkc0xlbmd0aCkgJiYKKyAgICAgICAgICAgICAgICAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQscHJvcElFSW5mby53ZHNEYXRhLAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVdkc0luZm8ud2RzQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltV2RzSW5mby53ZHNMZW5ndGgpICkpCisKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGRpZmZlcmVuY2UgaW4gV0RTIGluZm8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoIkNhY2hlZCBXRFMgSW5mbzogbGVuZ3RoICVkIGJ5dGVzIGlzOiAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1XZHNJbmZvLndkc0xlbmd0aCk7CisgICAgICAgICAgICAgICAgc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVdkc0luZm8ud2RzQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1XZHNJbmZvLndkc0xlbmd0aCk7KQorCisgICAgICAgICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJOZXcgV0RTIEluZm86IGxlbmd0aCAlZCBieXRlcyBpczogIiksCisgICAgICAgICAgICAgICAgICAgICAgIHByb3BJRUluZm8ud2RzTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BJRUluZm8ud2RzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wSUVJbmZvLndkc0xlbmd0aCk7KQorCisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1XZHNJbmZvLndkc0xlbmd0aCA9IHByb3BJRUluZm8ud2RzTGVuZ3RoOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5nTGltV2RzSW5mby53ZHNCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcElFSW5mby53ZHNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wSUVJbmZvLndkc0xlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAvLyBzZW5kIElORCB0byBXU00KKyAgICAgICAgICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgICAgICAgICAgICAgICBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJnBTaXJTbWVXZHNJbmZvSW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpclNtZVdkc0luZm9JbmQpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkIGZvciBXRFNfSU5GT19JTkRcbiIpKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcFNpclNtZVdkc0luZm9JbmQtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfV0RTX0lORk9fSU5EOworICAgICAgICAgICAgICAgIHBTaXJTbWVXZHNJbmZvSW5kLT5sZW5ndGggPSBzaXplb2YodFNpclNtZVdkc0luZm9JbmQpOworCisgICAgICAgICAgICAgICAgcFNpclNtZVdkc0luZm9JbmQtPndkc0luZm8ud2RzTGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1XZHNJbmZvLndkc0xlbmd0aDsKKworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTaXJTbWVXZHNJbmZvSW5kLT53ZHNJbmZvLndkc0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVdkc0luZm8ud2RzQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltV2RzSW5mby53ZHNMZW5ndGgpOworCisgICAgICAgICAgICAgICAgcFRlbXAgPSAodEFOSV9VOCAqKSBwU2lyU21lV2RzSW5mb0luZDsKKworICAgICAgICAgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiZVdOSV9TTUVfV0RTX0lORk9fSU5EIGxlbmd0aCAlZCBieXRlcyBpczogIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBTaXJTbWVXZHNJbmZvSW5kLT5sZW5ndGgpOworICAgICAgICAgICAgICAgIHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzIsIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXJTbWVXZHNJbmZvSW5kLT5sZW5ndGgpOykKKworICAgICAgICAgICAgICAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfV0RTX0lORk9fSU5EOworICAgICAgICAgICAgICAgIG1taE1zZy5ib2R5cHRyID0gcFNpclNtZVdkc0luZm9JbmQ7CisgICAgICAgICAgICAgICAgbW1oTXNnLmJvZHl2YWwgPSAwOworICAgICAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICAgICAgICAgICAgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1OdW1XZHNJbmZvSW5kKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBmaXJzdCBXRFMgaW5mbworICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1XZHNJbmZvLndkc0xlbmd0aCA9IHByb3BJRUluZm8ud2RzTGVuZ3RoOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1XZHNJbmZvLndkc0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BJRUluZm8ud2RzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wSUVJbmZvLndkc0xlbmd0aCk7CisKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkZpcnN0IFdEUyBJbmZvOiBsZW5ndGggJWQgYnl0ZXMgaXM6XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVdkc0luZm8ud2RzTGVuZ3RoKTsKKyAgICAgICAgICAgIHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1XZHNJbmZvLndkc0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltV2RzSW5mby53ZHNMZW5ndGgpOykKKworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLAorICAgICAgICAgICAgICAgRkwoIklsbGVnYWwgV0RTIGxlbmd0aCA9ICVkXG4iKSwKKyAgICAgICAgICAgICAgIHByb3BJRUluZm8ud2RzTGVuZ3RoKTspCisgICAgfQorI2VuZGlmCit9CisKKworCisvKioKKyAqIGxpbUluaXRXZHNJbmZvUGFyYW1zKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgcHJvY2Vzc2luZworICogU1RBUlRfQlNTL0pPSU4vUkVBU1NPQ19SRVEgIHRvIGluaXRpYWxpemUgV0RTIGluZm8KKyAqIGluZC9zZXQgcmVsYXRlZCBwYXJhbWV0ZXJzLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltSW5pdFdkc0luZm9QYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBwTWFjLT5saW0uZ0xpbVdkc0luZm8ud2RzTGVuZ3RoID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbU51bVdkc0luZm9JbmQgICAgID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbU51bVdkc0luZm9TZXQgICAgID0gMDsKK30gLyoqKiBsaW1Jbml0V2RzSW5mb1BhcmFtcygpICoqKi8KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVVwZGF0ZU92ZXJsYXBTdGFQYXJhbQorXGJyaWVmIFVwZGF0ZXMgb3ZlcmxhcCBjYWNoZSBhbmQgcGFyYW0gZGF0YSBzdHJ1Y3R1cmUKK1xwYXJhbSAgICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xwYXJhbSAgICAgIHRTaXJNYWNBZGRyIGJzc0lkCitccGFyYW0gICAgICB0cExpbVByb3RTdGFQYXJhbXMgcFN0YVBhcmFtcworXHJldHVybiAgICAgIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1VcGRhdGVPdmVybGFwU3RhUGFyYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgYnNzSWQsIHRwTGltUHJvdFN0YVBhcmFtcyBwU3RhUGFyYW1zKQoreworICAgIGludCBpOworICAgIGlmICghcFN0YVBhcmFtcy0+bnVtU3RhKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbMF0uYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgcE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbMF0uYWN0aXZlID0gdHJ1ZTsKKworICAgICAgICBwU3RhUGFyYW1zLT5udW1TdGEgPSAxOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxMSU1fUFJPVF9TVEFfT1ZFUkxBUF9DQUNIRV9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAocE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbaV0uYWN0aXZlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQscE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbaV0uYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGkgPT0gTElNX1BST1RfU1RBX09WRVJMQVBfQ0FDSEVfU0laRSkKKyAgICB7CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIk92ZXJsYXAgY2FjaGUgaXMgZnVsbFxuIikpOykKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbaV0uYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgcE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbaV0uYWN0aXZlID0gdHJ1ZTsKKworICAgICAgICBwU3RhUGFyYW1zLT5udW1TdGErKzsKKyAgICB9Cit9CisKKworLyoqCisgKiBsaW1IYW5kbGVJQlNTY29hbGVzY2luZygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24gcmVjZWl2aW5nIEJlYWNvbi9Qcm9iZSBSZXNwb25zZQorICogd2hpbGUgb3BlcmF0aW5nIGluIElCU1MgbW9kZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEJlYWNvbiAtIFBhcnNlZCBCZWFjb24gRnJhbWUgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBSeFBhY2tldEluZm8gLSBQb2ludGVyIHRvIFJYIHBhY2tldCBpbmZvIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gU3RhdHVzIHdoZXRoZXIgdG8gcHJvY2VzcyBvciBpZ25vcmUgcmVjZWl2ZWQgQmVhY29uIEZyYW1lCisgKi8KKwordFNpclJldFN0YXR1cworbGltSGFuZGxlSUJTU2NvYWxlc2NpbmcoCisgICAgdHBBbmlTaXJHbG9iYWwgICAgICBwTWFjLAorICAgIHRwU2NoQmVhY29uU3RydWN0ICAgcEJlYWNvbiwKKyAgICB0QU5JX1U4ICAgICAgICAgICAgKnBSeFBhY2tldEluZm8sdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0cFNpck1hY01nbXRIZHIgcEhkcjsKKyAgICB0U2lyUmV0U3RhdHVzICAgcmV0Q29kZTsKKworICAgIHBIZHIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisgICAgaWYgKCAoIXBCZWFjb24tPmNhcGFiaWxpdHlJbmZvLmlic3MpIHx8IChsaW1DbXBTU2lkKHBNYWMsICZwQmVhY29uLT5zc0lkLHBzZXNzaW9uRW50cnkpICE9IHRydWUpICkKKyAgICAgICAgLyogUmVjZWl2ZWQgU1NJRCBkb2VzIG5vdCBtYXRjaCA9PiBJZ25vcmUgcmVjZWl2ZWQgQmVhY29uIGZyYW1lLiAqLworICAgICAgICByZXRDb2RlID0gIGVTSVJfTElNX0lHTk9SRV9CRUFDT047CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdEFOSV9VMzIgaWVMZW47CisgICAgICAgIHRBTklfVTE2IHRzZkxhdGVyOworICAgICAgICB0QU5JX1U4ICpwSUVzOworICAgICAgICBpZUxlbiAgICA9IFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbyk7CisgICAgICAgIHRzZkxhdGVyID0gV0RBX0dFVF9SWF9UU0ZfTEFURVIocFJ4UGFja2V0SW5mbyk7CisgICAgICAgIHBJRXMgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKyAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiQkVGT1JFIENvYWxlc2NpbmcgdHNmTGF0ZXIgdmFsIDolZCIpLCB0c2ZMYXRlcik7KQorICAgICAgICByZXRDb2RlICA9IGxpbUlic3NDb2FsZXNjZShwTWFjLCBwSGRyLCBwQmVhY29uLCBwSUVzLCBpZUxlbiwgdHNmTGF0ZXIscHNlc3Npb25FbnRyeSk7CisgICAgfQorICAgIHJldHVybiByZXRDb2RlOworfSAvKioqIGVuZCBsaW1IYW5kbGVJQlNTY29hbGVzY2luZygpICoqKi8KKworCisKKy8qKgorICogbGltRGV0ZWN0Q2hhbmdlSW5BcENhcGFiaWxpdGllcygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoaWxlIFNDSCBpcyBwcm9jZXNzaW5nCisgKiByZWNlaXZlZCBCZWFjb24gZnJvbSBBUCBvbiBTVEEgdG8gZGV0ZWN0IGFueQorICogY2hhbmdlIGluIEFQJ3MgY2FwYWJpbGl0aWVzLiBJZiB0aGVyZSBhbnkgY2hhbmdlCisgKiBpcyBkZXRlY3RlZCwgUm9hbWluZyBpcyBpbmZvcm1lZCBvZiBzdWNoIGNoYW5nZQorICogc28gdGhhdCBpdCBjYW4gdHJpZ2dlciByZWFzc29jaWF0aW9uLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKiBOb3RpZmljYXRpb24gaXMgZW5hYmxlZCBmb3IgU1RBIHByb2R1Y3Qgb25seSBzaW5jZQorICogaXQgaXMgbm90IGEgcmVxdWlyZW1lbnQgb24gQlAgc2lkZS4KKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBCZWFjb24gICBQb2ludGVyIHRvIHBhcnNlZCBCZWFjb24gc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1EZXRlY3RDaGFuZ2VJbkFwQ2FwYWJpbGl0aWVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uIHBCZWFjb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBsZW47CisgICAgdFNpclNtZUFwTmV3Q2FwcyAgIGFwTmV3Q2FwczsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgbmV3Q2hhbm5lbDsKKyAgICBhcE5ld0NhcHMuY2FwYWJpbGl0eUluZm8gPSBsaW1HZXRVMTYoKHRBTklfVTggKikgJnBCZWFjb24tPmNhcGFiaWxpdHlJbmZvKTsKKyAgICBuZXdDaGFubmVsID0gKHRBTklfVTgpIHBCZWFjb24tPmNoYW5uZWxOdW1iZXI7CisKKyAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVNlbnRDYXBzQ2hhbmdlTnRmID09IGZhbHNlKSAmJiAKKyAgICAgICAgKCgoIWxpbUlzTnVsbFNzaWQoJnBCZWFjb24tPnNzSWQpKSAmJiAobGltQ21wU1NpZChwTWFjLCAmcEJlYWNvbi0+c3NJZCwgcHNlc3Npb25FbnRyeSkgPT0gZmFsc2UpKSB8fCAKKyAgICAgICAgKChTSVJfTUFDX0dFVF9FU1MoYXBOZXdDYXBzLmNhcGFiaWxpdHlJbmZvKSAhPSBTSVJfTUFDX0dFVF9FU1MocHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc0NhcHMpKSB8fAorICAgICAgICAgKFNJUl9NQUNfR0VUX1BSSVZBQ1koYXBOZXdDYXBzLmNhcGFiaWxpdHlJbmZvKSAhPSAgIFNJUl9NQUNfR0VUX1BSSVZBQ1kocHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc0NhcHMpKSB8fAorICAgICAgICAgKFNJUl9NQUNfR0VUX1NIT1JUX1BSRUFNQkxFKGFwTmV3Q2Fwcy5jYXBhYmlsaXR5SW5mbykgIT0gIFNJUl9NQUNfR0VUX1NIT1JUX1BSRUFNQkxFKHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzKSkgfHwKKyAgICAgICAgIChTSVJfTUFDX0dFVF9RT1MoYXBOZXdDYXBzLmNhcGFiaWxpdHlJbmZvKSAhPSAgIFNJUl9NQUNfR0VUX1FPUyhwc2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QnNzQ2FwcykpIHx8CisgICAgICAgICAobmV3Q2hhbm5lbCAhPSAgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSAKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICAgICAgIHx8IChMSU1fQlNTX0NBUFNfR0VUKEhDRiwgcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc1Fvc0NhcHMpICE9CisgICAgICAgICAgcEJlYWNvbi0+cHJvcElFaW5mby5oY2ZFbmFibGVkKQorI2VuZGlmCisgICAgICAgICApKSkKKyAgICB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJTUyBjYXBhYmlsaXRpZXMgaGF2ZSBjaGFuZ2VkLgorICAgICAgICAgKiBJbmZvcm0gUm9hbWluZy4KKyAgICAgICAgICovCisgICAgICAgIGxlbiA9IHNpemVvZih0U2lyTWFjQ2FwYWJpbGl0eUluZm8pICsKKyAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSArIHNpemVvZih0QU5JX1U4KSArCisgICAgICAgICAgICAgIDMgKiBzaXplb2YodEFOSV9VOCkgKyAvLyByZXNlcnZlZCBmaWVsZHMKKyAgICAgICAgICAgICAgcEJlYWNvbi0+c3NJZC5sZW5ndGggKyAxOworCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIGFwTmV3Q2Fwcy5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgaWYgKG5ld0NoYW5uZWwgIT0gcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJDaGFubmVsIENoYW5nZSBmcm9tICVkIC0tPiAlZCAgLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyBiZWFjb24hXG4iKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwgbmV3Q2hhbm5lbCk7KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFwTmV3Q2Fwcy5jaGFubmVsSWQgPSBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWw7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZhcE5ld0NhcHMuc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcEJlYWNvbi0+c3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICBwQmVhY29uLT5zc0lkLmxlbmd0aCArIDEpOworCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNlbnRDYXBzQ2hhbmdlTnRmID0gdHJ1ZTsKKyAgICAgICAgbGltU2VuZFNtZVdtU3RhdHVzQ2hhbmdlTnRmKHBNYWMsIGVTSVJfU01FX0FQX0NBUFNfQ0hBTkdFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmYXBOZXdDYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQpOworICAgIH0KKyNlbmRpZgorfSAvKioqIGxpbURldGVjdENoYW5nZUluQXBDYXBhYmlsaXRpZXMoKSAqKiovCisKKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBsaW1VcGRhdGVTaG9ydFNsb3QKKyAqCisgKiBGVU5DVElPTjoKKyAqIEVuYWJsZS9EaXNhYmxlIHNob3J0IHNsb3QKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBlbmFibGUgICAgICAgIEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgc2hvcnQgc2xvdAorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cyBsaW1VcGRhdGVTaG9ydFNsb3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJQcm9iZVJlc3BCZWFjb24gcEJlYWNvbiwgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCisgICAgdFNpclNtZUFwTmV3Q2FwcyAgIGFwTmV3Q2FwczsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBjU2hvcnRTbG90LCBuU2hvcnRTbG90OworIAorICAgIGFwTmV3Q2Fwcy5jYXBhYmlsaXR5SW5mbyA9IGxpbUdldFUxNigodEFOSV9VOCAqKSAmcEJlYWNvbi0+Y2FwYWJpbGl0eUluZm8pOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FLCAmY1Nob3J0U2xvdCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInVuYWJsZSB0byBnZXQgc2hvcnQgc2xvdCB0aW1lXG4iKSk7CisKKyAgICAvLyAgRWFybGllciBpbXBsZW1lbnRhdGlvbjogZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBzaG9ydCBzbG90IG1vZGUgYmFzZWQgb24gQVAgYWR2ZXJ0aXNlZCBtb2RlcworICAgIC8vIHdoZW4gZXJwIGlzIHByZXNlbnQsIGFwcGx5IHNob3J0IHNsb3QgYWx3YXlzIHVubGVzcywgcHJvdD1vbiAgJiYgc2hvcnRTbG90PW9mZgorICAgIC8vIGlmIG5vIGVycCBwcmVzZW50LCB1c2Ugc2hvcnQgc2xvdCBiYXNlZCBvbiBjdXJyZW50IGFwIGNhcHMKKworICAgIC8vIElzc3VlIHdpdGggZWFybGllciBpbXBsZW1lbnRhdGlvbiA6IENpc2NvIDEyMzEgQkcgaGFzIHNob3J0U2xvdCA9IDAsIGVycElFUHJlc2VudCBhbmQgdXNlUHJvdGVjdGlvbiA9IDAgKENhc2U0KTsKKworICAgIC8vUmVzb2x1dGlvbiA6IGFsd2F5cyB1c2UgdGhlIHNob3J0U2xvdCBzZXR0aW5nIHRoZSBjYXBhYmlsaXR5IGluZm8gdG8gZGVjaWRlIHNsb3QgdGltZS4gCisgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZWFybGllciBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlIG5ldyBvbmUgaXMgb25seSBDYXNlNC4KKyAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgRVJQIElFIFByZXNlbnQgIHwgICB1c2VQcm90ZWN0aW9uICAgfCAgIHNob3J0U2xvdCAgID0gICBRQyBTVEEgU2hvcnQgU2xvdAorICAgICAgIENhc2UxICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAvL0FQIHNob3VsZCBub3QgYWR2ZXJ0aXNlIHRoaXMgY29tYmluYXRpb24uIAorICAgICAgIENhc2UyICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgQ2FzZTMgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICBDYXNlNCAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgIENhc2U1ICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgICAgQ2FzZTYgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICBDYXNlNyAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgIENhc2U4ICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgKi8KKyAgICBuU2hvcnRTbG90ID0gU0lSX01BQ19HRVRfU0hPUlRfU0xPVF9USU1FKGFwTmV3Q2Fwcy5jYXBhYmlsaXR5SW5mbyk7CisKKyAgICBpZiAoblNob3J0U2xvdCAhPSBjU2hvcnRTbG90KQorICAgIHsKKyAgICAgICAgLy8gU2hvcnQgc2xvdCB0aW1lIGNhcGFiaWxpdHkgb2YgQVAgaGFzIGNoYW5nZWQuIEFkb3B0IHRvIGl0LgorICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTaG9ydHNsb3QgY2FwYWJpbGl0eSBvZiBBUCBjaGFuZ2VkOiAlZFxuIiksICBuU2hvcnRTbG90KTspCisgICAgICAgICgodHBTaXJNYWNDYXBhYmlsaXR5SW5mbykmcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc0NhcHMpLT5zaG9ydFNsb3RUaW1lID0gKHRBTklfVTE2KW5TaG9ydFNsb3Q7CisgICAgICAgIHBCZWFjb25QYXJhbXMtPmZTaG9ydFNsb3RUaW1lID0gKHRBTklfVTgpIG5TaG9ydFNsb3Q7CisgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX1NIT1JUX1NMT1RfVElNRV9DSEFOR0VEOworCisgICAgICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR19TSE9SVF9TTE9UX1RJTUUsIG5TaG9ydFNsb3QpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgIEZMKCJjb3VsZCBub3QgdXBkYXRlIHNob3J0IHNsb3QgdGltZSBhdCBDRkdcbiIpKTspCisgICAgfQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisKKy8qKgorICogbGltVXBkYXRlUXVpZXRJRUluQmVhY29ucygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHNwZWNpYWxCZWFjb25Qcm9jZXNzaW5nKCksCisgKiB3aGVuIGl0IGlzIHRpbWUgdG8gZ2VuZXJhdGUgdGhlIG5leHQgYmVhY29uLgorICogSWYgZ0xpbVF1aWV0U3RhdGUgaXMgbm90IGluIHRoZSBJTklUIHN0YXRlLCB0aGVuIGl0CisgKiBtZWFucyB0aGF0IHRoZSBuZXh0IGJlYWNvbiBtYXkgbmVlZCB0byBpbmNsdWRlIHNvbWUKKyAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBRdWlldCBCU1MgSUUuCisgKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIHRoYXQgZGVjaXNpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAqIHN0YXRlIG9mIGdMaW1RdWlldFN0YXRlCisgKgorICpMT0dJQzoKKyAqIFRoaXMgcm91dGluZSBpbnZva2VzIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKCkgb25seQorICogaWYgbmVjZXNzYXJ5LCBhcyBpdCBpcyBleHBlbnNpdmUgdG8gdXBkYXRlIHRoZSBmaXhlZAorICogYmVhY29uIGZpZWxkcyBkdXJpbmcgZWFjaCBiZWFjb24gaW50ZXJ2YWwuCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIFRoaXMgUXVpZXQgQlNTIElFIHdpbGwgYmUgc2VudCBvdXQgYXMgcGFydCBvZgorICogUHJvcHJpZXRhcnkgSUUncy4gSWYgODAyLjExSCBpcyBlbmFibGVkLCB0aGlzIElFCisgKiB3aWxsIGJlIHNlbnQgb3V0IGFzIGRlZmluZWQgaW4gdGhlIDExSCBzcGVjCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBiZWFjb24gZmllbGRzIG5lZWQgdXBkYXRpbmcKKyAqICAgICAgICAgZmFsc2UsIGlmIG5vdAorICovCit0QU5JX0JPT0xFQU4gbGltVXBkYXRlUXVpZXRJRUluQmVhY29ucyggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgIHRBTklfQk9PTEVBTiBmVXBkYXRlQmVhY29uRmllbGRzID0gZUFOSV9CT09MRUFOX1RSVUU7CisKKyAgbGltTG9nKCBwTWFjLCBMT0cyLCBGTCgiUXVpZXQgQlNTIFN0YXRlID0gJWRcbiIpLAorICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSApOworICBzd2l0Y2goIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSApCisgIHsKKyAgICBjYXNlIGVMSU1fUVVJRVRfQkVHSU46CisgICAgICAvLyBXZSBuZWVkIHRvIHN0YXJ0IGJyb2FkY2FzdGluZyB0aGUgUXVpZXQgQlNTIElFCisgICAgICAvLyBUcmFuc2l0aW9uIHRvIGVMSU1fUVVJRVRfUlVOTklORworICAgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID0gZUxJTV9RVUlFVF9SVU5OSU5HOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVMSU1fUVVJRVRfUlVOTklORzoKKyAgICAgIC8vIFN0YXJ0IGRvd24tY291bnRpbmcuLi4KKyAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRDb3VudC0tOworICAgICAgaWYoIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRDb3VudCA9PSAwICkKKyAgICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2Ugbm8gbG9uZ2VyIG5lZWQgdG8gYnJvYWRjYXN0IHRoZSBRdWlldCBCU1MgSUUKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTk9URSAtIFdlIHN0aWxsIG5lZWQgdG8gY2FsbCBzY2hTZXRGaXhlZEJlYWNvbkZpZWxkcygpCisgICAgICAgIC8vIG9uZSBsYXN0IHRpbWUsIGp1c3QgdG8gcmVtb3ZlIHRoZSBRdWlldCBCU1MgSUUgZnJvbQorICAgICAgICAvLyB0aGUgbGlzdCBvZiBmaXhlZCBiZWFjb24gZmllbGRzCisgICAgICAgIC8vCisgICAgICAgIC8vIFRyYW5zaXRpb24gdG8gZUxJTV9RVUlFVF9FTkQKKyAgICAgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID0gZUxJTV9RVUlFVF9FTkQ7CisgICAgICAgIGxpbVByb2Nlc3NMZWFybkludGVydmFsVGltZW91dChwTWFjKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlTElNX1FVSUVUX0NIQU5HRUQ6CisgICAgICAvLworICAgICAgLy8gU3RhdGUgcG9zc2libHkgY2hhbmdlZCB2aWEgc2V0dXBRdWlldEJzcygpLgorICAgICAgLy8gVGhpcyBtZWFucywgZ0xpbVF1aWV0Q291bnQgaGFzIGJlZW4gY2hhbmdlZCEhCisgICAgICAvLworICAgICAgLy8gTk9URSAtIFdlIHN0aWxsIG5lZWQgdG8gY2FsbCBzY2hTZXRGaXhlZEJlYWNvbkZpZWxkcygpCisgICAgICAvLyBvbmUgbGFzdCB0aW1lLCBqdXN0IHRvIHJlbW92ZSB0aGUgUXVpZXQgQlNTIElFIGZyb20KKyAgICAgIC8vIHRoZSBsaXN0IG9mIGZpeGVkIGJlYWNvbiBmaWVsZHMKKyAgICAgIC8vCisKKyAgICAgIC8vIFRyYW5zaXRpb24gdG8gZUxJTV9RVUlFVF9FTkQKKyAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfRU5EOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVMSU1fUVVJRVRfSU5JVDoKKyAgICBjYXNlIGVMSU1fUVVJRVRfRU5EOgorICAgICAgLy8gVHJhbnNpdGlvbiB0byBlTElNX1FVSUVUX0lOSVQKKyAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfSU5JVDsKKyAgICAgIC8vIEZhbGwgdGhydScuLi4KKyAgICBkZWZhdWx0OgorICAgICAgZlVwZGF0ZUJlYWNvbkZpZWxkcyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGZVcGRhdGVCZWFjb25GaWVsZHM7Cit9CisKKyNlbmRpZgorCisjaWYgKChkZWZpbmVkIEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIChkZWZpbmVkIEFOSV9BUF9TREspKQordm9pZCBsaW1Db252ZXJ0U2NhbkR1cmF0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdHBTaXJTbWVNZWFzdXJlbWVudFJlcSBwTWVhc1JlcSA9IHBNYWMtPmxpbS5ncExpbU1lYXNSZXE7CisgICAgdHBMaW1TY2FuRHVyYXRpb25Db252ZXJ0IHNjYW5EdXJDb252ID0gJnBNYWMtPmxpbS5nTGltU2NhbkR1cmF0aW9uQ29udmVydDsKKworICAgIC8qIFRoaXMgaXMgbm90IGEgZ29vZCBpZGVhIHRvIGNvbnZlcnQge2xvbmd9c2hvcnRDaGFubmVsU2NhbkR1cmF0aW9uIGZyb20gbVMgdG8gVElDS1MgKgorICAgICAgICAgKiBUaGUgcmVhc29uIGlzIHRoYXQge2xvbmd9c2hvcnRDaGFubmVsU2NhbkR1cmF0aW9uIGlzIHVzZWQgYWxsIG92ZXIgYW5kIGEgbG90IG9mIGNvZGUgKgorICAgICAgICAgKiB0aGF0IGFzc3VtZXMgdGhlIG9sZCBtUyBkZWZpbml0aW9uIHdhcyBuZXZlciBjaGFuZ2VkIHRvIGFjY29tbW9kYXRlIHRoaXMgbmV3IGNoYW5nZSB0byBUSUNLUy4gKgorICAgICAgICAgKiBJZiBvcHRpbWl6YXRpb24gaXMgbmVlZGVkLCBjcmVhdGUgYW5vdGhlciBzZXQgb2Ygc2hhZG93IHZhcmlhYmxlcyB0byBzdG9yZSB0aGUgY29udmVydGVkICoKKyAgICAgICAgICogdmFsdWVzIGluIFRpY2tzLCBhbmQgVFUuICAqLworICAgIHNjYW5EdXJDb252LT5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb25fdGljayA9CisgICAgICAgICAgICAgICAgICAgICBTWVNfTVNfVE9fVElDS1MocE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb24gK1NZU19USUNLX0RVUl9NUy0xKTsKKworICAgIC8qIGNvbnZlcnQgc2hvcnRDaGFubmVsU2NhbkR1cmF0aW9uIHRvIFRVIGFsc28gZm9yIENCIHNjYW4sIHVzZWQgdG8gc2V0IGdMaW1RdWlldER1cmF0aW9uICovCisgICAgLyogKHNob3J0Q2hhbm5lU2NhbkR1cmF0aW9uICogMTAwMCkgLyAyXjEwICovCisgICAgc2NhbkR1ckNvbnYtPnNob3J0Q2hhbm5lbFNjYW5EdXJhdGlvbl9UVSA9IChwTWVhc1JlcS0+bWVhc0R1cmF0aW9uLnNob3J0Q2hhbm5lbFNjYW5EdXJhdGlvbiAqIDEwMDApID4+IDEwOworCisgICAgc2NhbkR1ckNvbnYtPmxvbmdDaGFubmVsU2NhbkR1cmF0aW9uX3RpY2sgPQorICAgICAgICAgICAgICAgICAgICAgU1lTX01TX1RPX1RJQ0tTKHBNZWFzUmVxLT5tZWFzRHVyYXRpb24ubG9uZ0NoYW5uZWxTY2FuRHVyYXRpb24gK1NZU19USUNLX0RVUl9NUy0xKTsKKworICAgIC8qIGNvbnZlcnQgc2hvcnRDaGFubmVsU2NhbkR1cmF0aW9uIHRvIFRVIGFsc28gZm9yIENCIHNjYW4sIHVzZWQgdG8gc2V0IGdMaW1RdWlldER1cmF0aW9uICovCisgICAgLyogKGxvbmdDaGFubmVTY2FuRHVyYXRpb24gKiAxMDAwKSAvIDJeMTAgKi8KKyAgICBzY2FuRHVyQ29udi0+bG9uZ0NoYW5uZWxTY2FuRHVyYXRpb25fVFUgPSAocE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5sb25nQ2hhbm5lbFNjYW5EdXJhdGlvbiAqIDEwMDApID4+IDEwOworfQorI2VuZGlmIC8qICgoZGVmaW5lZCBBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiAoZGVmaW5lZCBBTklfQVBfU0RLKSkgKi8KKworCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBsaW1Jc1JhZGFyRW5hYmxlZAorCitcYnJpZWYgIENoZWNrcyBpZiByYWRhciBpcyBlbmFibGVkCitccGFyYW0gIHBNYWMKK1xyZXR1cm4gdHJ1ZSAtIGlmIEJvdGggMTFoIGFuZCByYWRhciBlbmFibGVkCisgICAgICAgIGZhbHNlIC0gaWYgZWl0aGVyIGlzIG5vdCBlbmFibGVkLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RBTklfQk9PTEVBTiBsaW1Jc1JhZGFyRW5hYmxlZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTMyIGZFbmFibGVkOworCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR18xMUhfRU5BQkxFRCwgJmZFbmFibGVkKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkhBTDogY291bGQgbm90IHJldHJpZXZlIHJhZGFyIGNvbmZpZyBmcm9tIENGRyIpKTsKKyAgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWZFbmFibGVkKQorICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19SREVUX0ZMQUcsICZmRW5hYmxlZCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJIQUw6IGNvdWxkIG5vdCByZXRyaWV2ZSByYWRhciBjb25maWcgZnJvbSBDRkciKSk7CisgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorCisgICAgaWYgKGZFbmFibGVkKQorICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUU7CisKKyAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgbGltUmFkYXJJbml0CitcYnJpZWYgIEluaXRpYWxpemUgUmFkYXIgSW50ZXJydXB0LgorCitccGFyYW0gIHBNYWMKK1xyZXR1cm4gTm9uZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1SYWRhckluaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1UzMiAgICBzdGF0dXM7CisgICAgdFNpck1zZ1EgICAgbXNnOworCisgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJSYWRhciBJbnRlcnJ1cHQgQWxyZWFkeSBjb25maWd1cmVkPyAlc1xuIiksCisgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZlJhZGFySW50ckNvbmZpZ3VyZWQ/IlllcyI6Ik5vIik7KQorICAgIC8qKiBUbyBhdm9pZCBjb25maWd1cmluZyB0aGUgcmFkYXIgbXVsdGlwbGUgdGltZXMgKi8KKyAgICBpZiAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5mUmFkYXJJbnRyQ29uZmlndXJlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFsaW1Jc1JhZGFyRW5hYmxlZChwTWFjKSkKKyAgICAgICAgcmV0dXJuOworICAgIC8vIFByZXBhcmUgYW5kIHBvc3QgbWVzc2FnZSB0byBIQUwgTWVzc2FnZSBRdWV1ZQorICAgIG1zZy50eXBlID0gV0RBX0lOSVRfUkFEQVJfSU5EOworICAgIG1zZy5ib2R5cHRyID0gTlVMTDsKKyAgICBtc2cuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnLnR5cGUpKTsKKyAgICBzdGF0dXMgPSB3ZGFQb3N0Q3RybE1zZyhwTWFjLCAmbXNnKTsKKyAgICBpZiAoc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJwb3N0aW5nIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lZFxuIiksIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5mUmFkYXJJbnRyQ29uZmlndXJlZCA9IGVBTklfQk9PTEVBTl9UUlVFOworfSAvKioqKioqIGVuZCBsaW1SYWRhckluaXQoKSAqKioqKiovCisKKyNlbmRpZgorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgbGltSGFuZGxlTG93UnNzaUluZCgpIC0gaGFuZGxlcyBsb3cgcnNzaSBpbmRpY2F0aW9uCisgCisgIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgU0lSX0hBTF9MT1dfUlNTSV9JTkQgbWVzc2FnZSBmcm9tCisgIEhBTCwgYW5kIHNlbmRzIGEgZVdOSV9TTUVfTE9XX1JTU0lfSU5EIHRvIENTUi4KKworICBccGFyYW0gcE1hYyAtIGdsb2JhbCBtYWMgc3RydWN0dXJlCisKKyAgXHJldHVybiAgCisKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIGxpbUhhbmRsZUxvd1Jzc2lJbmQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyNpZiAwICAvL1JTU0kgcmVsYXRlZCBpbmRpY2F0aW9ucyB3aWxsIG5vdyBnbyB0byBUTCBhbmQgbm90IFBFCisgICAgaWYgKCAocE1hYy0+cG1tLmdQbW1TdGF0ZSA9PSBlUE1NX1NUQVRFX0JNUFNfU0xFRVApIHx8CisgICAgICAgICAocE1hYy0+cG1tLmdQbW1TdGF0ZSA9PSBlUE1NX1NUQVRFX1VBUFNEX1NMRUVQKXx8CisgICAgICAgICAocE1hYy0+cG1tLmdQbW1TdGF0ZSA9PSBlUE1NX1NUQVRFX1dPV0xBTikgKQorICAgIHsKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBMT1dfUlNTSV9JTkQgdG8gU01FIFxuIikpOykKKyAgICAgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1NNRV9MT1dfUlNTSV9JTkQsIGVTSVJfU01FX1NVQ0NFU1MsIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgIEZMKCJSZWNlaXZlZCBTSVJfSEFMX0xPV19SU1NJX0lORCB3aGlsZSBpbiBpbmNvcnJlY3Qgc3RhdGU6ICVkXG4iKSwKKyAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUpOworICAgIH0KKyAgICByZXR1cm47CisjZW5kaWYKK30KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIGxpbUhhbmRsZUJtcHNTdGF0dXNJbmQoKSAtIGhhbmRsZXMgQk1QUyBzdGF0dXMgaW5kaWNhdGlvbgorIAorICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIFNJUl9IQUxfQk1QU19TVEFUVVNfSU5EIG1lc3NhZ2UgZnJvbSBIQUwsIAorICBhbmQgaW52b2tlcyBsaW1TZW5kRXhpdEJtcHNJbmQoICkgdG8gc2VuZCBhbiBlV05JX1BNQ19FWElUX0JNUFNfSU5EIAorICB0byBTTUUgd2l0aCByZWFzb24gY29kZSAnZVNNRV9FWElUX0JNUFNfSU5EX1JDVkQnLiAKKyAgCisgIEhBTCBzZW5kcyB0aGlzIG1lc3NhZ2Ugd2hlbiBGaXJtd2FyZSBmYWlscyB0byBlbnRlciBCTVBTIG1vZGUgJ0FGVEVSJworICBIQUwgaGFkIGFscmVhZHkgc2VuZCBQRSBhIFNJUl9IQUxfRU5URVJfQk1QU19SU1Agd2l0aCBzdGF0dXMgCisgIGNvZGUgInN1Y2Nlc3MiLiAgSGVuY2UsIEhBTCBuZWVkcyB0byBub3RpZnkgUEUgdG8gZ2V0IG91dCBvZiBCTVBTIG1vZGUuIAorICBUaGlzIG1lc3NhZ2UgY2FuIGFsc28gY29tZSBmcm9tIEZXIGFueXRpbWUgYWZ0ZXIgd2UgaGF2ZSBlbnRlcmVkIEJNUFMuIAorICBUaGlzIG1lYW5zIHdlIHNob3VsZCBoYW5kbGUgaXQgaW4gV29XTCBhbmQgVUFQU0Qgc3RhdGVzIGFzIHdlbGwKKyAgIAorICBccGFyYW0gcE1hYyAtIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgIFxyZXR1cm4gLSBub25lCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBsaW1IYW5kbGVCbXBzU3RhdHVzSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgc3dpdGNoKHBNYWMtPnBtbS5nUG1tU3RhdGUpCisgICAgeworICAgICAgICBjYXNlIGVQTU1fU1RBVEVfQk1QU19TTEVFUDoKKyAgICAgICAgY2FzZSBlUE1NX1NUQVRFX1VBUFNEX1dUX1NMRUVQX1JTUDoKKyAgICAgICAgY2FzZSBlUE1NX1NUQVRFX1VBUFNEX1NMRUVQOgorICAgICAgICBjYXNlIGVQTU1fU1RBVEVfVUFQU0RfV1RfV0FLRVVQX1JTUDoKKyAgICAgICAgY2FzZSBlUE1NX1NUQVRFX1dPV0xBTjoKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgRVhJVF9CTVBTX0lORCB0byBTTUUgXG4iKSk7KQorICAgICAgICAgICAgbGltU2VuZEV4aXRCbXBzSW5kKHBNYWMsIGVTTUVfQk1QU19TVEFUVVNfSU5EX1JDVkQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgIEZMKCJSZWNlaXZlZCBTSVJfSEFMX0JNUFNfU1RBVFVTX0lORCB3aGlsZSBpbiBpbmNvcnJlY3Qgc3RhdGU6ICVkXG4iKSwKKyAgICAgICAgICAgICAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBsaW1IYW5kbGVNaXNzZWRCZWFjb25JbmQoKSAtIGhhbmRsZXMgbWlzc2VkIGJlYWNvbiBpbmRpY2F0aW9uCisgCisgIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgU0lSX0hBTF9NSVNTRURfQkVBQ09OX0lORCBtZXNzYWdlIGZyb20gSEFMLAorICBhbmQgaW52b2tlcyBsaW1TZW5kRXhpdEJtcHNJbmQoICkgdG8gc2VuZCBhbiBlV05JX1BNQ19FWElUX0JNUFNfSU5EIAorICB0byBTTUUgd2l0aCByZWFzb24gY29kZSAnZVNNRV9NSVNTRURfQkVBQ09OX0lORF9SQ1ZEJy4KKyAgCisgIFxwYXJhbSBwTWFjIC0gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAgXHJldHVybiAtIG5vbmUgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBsaW1IYW5kbGVNaXNzZWRCZWFjb25JbmQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBpZiAoIChwTWFjLT5wbW0uZ1BtbVN0YXRlID09IGVQTU1fU1RBVEVfQk1QU19TTEVFUCkgfHwKKyAgICAgICAgIChwTWFjLT5wbW0uZ1BtbVN0YXRlID09IGVQTU1fU1RBVEVfVUFQU0RfU0xFRVApfHwKKyAgICAgICAgIChwTWFjLT5wbW0uZ1BtbVN0YXRlID09IGVQTU1fU1RBVEVfV09XTEFOKSApCisgICAgeworICAgICAgICBwTWFjLT5wbW0uaW5NaXNzZWRCZWFjb25TY2VuYXJpbyA9IFRSVUU7CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgRVhJVF9CTVBTX0lORCB0byBTTUUgXG4iKSk7KQorICAgICAgICBsaW1TZW5kRXhpdEJtcHNJbmQocE1hYywgZVNNRV9NSVNTRURfQkVBQ09OX0lORF9SQ1ZEKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCgiUmVjZWl2ZWQgU0lSX0hBTF9NSVNTRURfQkVBQ09OX0lORCB3aGlsZSBpbiBpbmNvcnJlY3Qgc3RhdGU6ICVkXG4iKSwKKyAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgbGltTWljRmFpbHVyZUluZCgpIC0gaGFuZGxlcyBtaWMgZmFpbHVyZSAgaW5kaWNhdGlvbgorIAorICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIFNJUl9IQUxfTUlDX0ZBSUxVUkVfSU5EIG1lc3NhZ2UgZnJvbSBIQUwsCisKKyAgXHBhcmFtIHBNYWMgLSBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICBccmV0dXJuIC0gbm9uZSAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIGxpbU1pY0ZhaWx1cmVJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisgICAgdHBTaXJTbWVNaWNGYWlsdXJlSW5kIHBTaXJTbWVNaWNGYWlsdXJlSW5kOworICAgIHRwU2lyU21lTWljRmFpbHVyZUluZCBwU2lyTWljRmFpbHVyZUluZCA9ICh0cFNpclNtZU1pY0ZhaWx1cmVJbmQpcE1zZy0+Ym9keXB0cjsKKyAgICB0U2lyTXNnUSAgICAgICAgICAgIG1taE1zZzsKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5IDsKKyAgICB0QU5JX1U4ICAgICBzZXNzaW9uSWQ7CisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMscFNpck1pY0ZhaWx1cmVJbmQtPmJzc0lkLCZzZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gQlNTSWRcbiIpKTsKKyAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgICAgICAgICAgICAgICBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJnBTaXJTbWVNaWNGYWlsdXJlSW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpclNtZU1pY0ZhaWx1cmVJbmQpKSkKKyAgICB7CisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoIm1lbW9yeSBhbGxvY2F0ZSBmYWlsZWQgZm9yIGVXTklfU01FX01JQ19GQUlMVVJFX0lORFxuIikpOworICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwU2lyU21lTWljRmFpbHVyZUluZC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9NSUNfRkFJTFVSRV9JTkQ7CisgICAgcFNpclNtZU1pY0ZhaWx1cmVJbmQtPmxlbmd0aCA9IHNpemVvZihwU2lyU21lTWljRmFpbHVyZUluZCk7CisgICAgcFNpclNtZU1pY0ZhaWx1cmVJbmQtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworICAgIHZvc19tZW1fY29weShwU2lyU21lTWljRmFpbHVyZUluZC0+YnNzSWQsCisgICAgICAgIHBTaXJNaWNGYWlsdXJlSW5kLT5ic3NJZCwKKyAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICB2b3NfbWVtX2NvcHkocFNpclNtZU1pY0ZhaWx1cmVJbmQtPmluZm8uc3JjTWFjQWRkciwKKyAgICAgICAgcFNpck1pY0ZhaWx1cmVJbmQtPmluZm8uc3JjTWFjQWRkciwKKyAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICB2b3NfbWVtX2NvcHkocFNpclNtZU1pY0ZhaWx1cmVJbmQtPmluZm8udGFNYWNBZGRyLAorICAgICAgICBwU2lyTWljRmFpbHVyZUluZC0+aW5mby50YU1hY0FkZHIsCisgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgdm9zX21lbV9jb3B5KHBTaXJTbWVNaWNGYWlsdXJlSW5kLT5pbmZvLmRzdE1hY0FkZHIsCisgICAgICAgIHBTaXJNaWNGYWlsdXJlSW5kLT5pbmZvLmRzdE1hY0FkZHIsCisgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgdm9zX21lbV9jb3B5KHBTaXJTbWVNaWNGYWlsdXJlSW5kLT5pbmZvLnJ4TWFjQWRkciwKKyAgICAgICAgcFNpck1pY0ZhaWx1cmVJbmQtPmluZm8ucnhNYWNBZGRyLAorICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICAgIHBTaXJTbWVNaWNGYWlsdXJlSW5kLT5pbmZvLm11bHRpY2FzdCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2lyTWljRmFpbHVyZUluZC0+aW5mby5tdWx0aWNhc3Q7CisKKyAgICBwU2lyU21lTWljRmFpbHVyZUluZC0+aW5mby5rZXlJZD0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpck1pY0ZhaWx1cmVJbmQtPmluZm8ua2V5SWQ7CisKKyAgICBwU2lyU21lTWljRmFpbHVyZUluZC0+aW5mby5JVjE9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXJNaWNGYWlsdXJlSW5kLT5pbmZvLklWMTsKKworICAgIHZvc19tZW1fY29weShwU2lyU21lTWljRmFpbHVyZUluZC0+aW5mby5UU0MsCisgICAgICAgICBwU2lyTWljRmFpbHVyZUluZC0+aW5mby5UU0MsU0lSX0NJUEhFUl9TRVFfQ1RSX1NJWkUpOworCisgICAgbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9NSUNfRkFJTFVSRV9JTkQ7CisgICAgbW1oTXNnLmJvZHlwdHIgPSBwU2lyU21lTWljRmFpbHVyZUluZDsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyAgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKyAgICByZXR1cm47Cit9CisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBsaW1Jc1BrdENhbmRpZGF0ZUZvckRyb3AoKSAtIGRlY2lkZXMgd2hldGhlciB0byBkcm9wIHRoZSBmcmFtZSBvciBub3QKKworICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgZW5xdWV1aW5nIHRoZSBmcmFtZSB0byBQRSBxdWV1ZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgorICBUaGlzIHByZXZlbnRzIHVubmVjZXNzYXJ5IGZyYW1lcyBnZXR0aW5nIGludG8gUEUgUXVldWUgYW5kIGRyb3BzIHRoZW0gcmlnaHQgYXdheS4KKyAgRnJhbWVzIHdpbGwgYmUgZHJvcGVkIGluIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW9zOgorICAKKyAgIC0gSW4gU2NhbiBTdGF0ZSwgZHJvcCB0aGUgZnJhbWVzIHdoaWNoIGFyZSBub3QgbWFya2VkIGFzIHNjYW4gZnJhbWVzCisgICAtIEluIG5vbi1TY2FuIHN0YXRlLCBkcm9wIHRoZSBmcmFtZXMgd2hpY2ggYXJlIG1hcmtlZCBhcyBzY2FuIGZyYW1lcy4KKyAgIC0gRHJvcCBJTkZSQSBCZWFjb25zIGFuZCBQcm9iZSBSZXNwb25zZXMgaW4gSUJTUyBNb2RlCisgICAtIERyb3AgdGhlIFByb2JlIFJlcXVlc3QgaW4gSUJTUyBtb2RlLCBpZiBTVEEgZGlkIG5vdCBzZW5kIG91dCB0aGUgbGFzdCBiZWFjb24KKyAgCisgIFxwYXJhbSBwTWFjIC0gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAgXHJldHVybiAtIG5vbmUgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0TWdtdEZybURyb3BSZWFzb24gbGltSXNQa3RDYW5kaWRhdGVGb3JEcm9wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8sIHRBTklfVTMyIHN1YlR5cGUpCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICBmcmFtZWxlbjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICpwQm9keTsKKyAgICB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gICAgIGNhcGFiaWxpdHlJbmZvOworCisgICAgLyoKKyAgICAqIAorICAgICogSW4gc2NhbiBtb2RlLCBkcm9wIG9ubHkgQmVhY29uL1Byb2JlIFJlc3BvbnNlIHdoaWNoIGFyZSBOT1QgbWFya2VkIGFzIHNjYW4tZnJhbWVzLgorICAgICogSW4gbm9uLXNjYW4gbW9kZSwgZHJvcCBvbmx5IEJlYWNvbi9Qcm9iZSBSZXNwb25zZSB3aGljaCBhcmUgbWFya2VkIGFzIHNjYW4gZnJhbWVzLiAKKyAgICAqIEFsbG93IG90aGVyIG1nbXQgZnJhbWVzLCB0aGV5IG11c3QgYmUgZnJvbSBvdXIgb3duIEFQLCBhcyB3ZSBkb24ndCBhbGxvdworICAgICogb3RoZXIgdGhhbiBiZWFjb25zIG9yIHByb2JlIHJlc3BvbnNlcyBpbiBzY2FuIHN0YXRlLgorICAgICovCisgICAgaWYoIChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9CRUFDT04pIHx8CisgICAgICAgIChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApKQorICAgIHsKKyAgICAgICAgaWYocE1hYy0+cG1tLmluTWlzc2VkQmVhY29uU2NlbmFyaW8pCisgICAgICAgIHsKKyAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRG8gbm90IGRyb3AgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZSAtIE1pc3NlZCBiZWFjb24gc2NlYW5yaW8iKSk7KQorICAgICAgICAgICByZXR1cm4gZU1HTVRfRFJPUF9OT19EUk9QOworICAgICAgICB9CisgICAgICAgIGlmIChsaW1Jc1N5c3RlbUluU2NhblN0YXRlKHBNYWMpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggV0RBX0lTX1JYX0lOX1NDQU4ocFJ4UGFja2V0SW5mbykgKQorICAgICAgICAgICAgICAgIHJldHVybiBlTUdNVF9EUk9QX05PX0RST1A7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGVNR01UX0RST1BfTk9OX1NDQU5fTU9ERV9GUkFNRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChXREFfSVNfUlhfSU5fU0NBTihwUnhQYWNrZXRJbmZvKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVNR01UX0RST1BfU0NBTl9NT0RFX0ZSQU1FOworICAgICAgICB9CisgICAgfQorCisgICAgZnJhbWVsZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pOworICAgIHBCb2R5ICAgID0gV0RBX0dFVF9SWF9NUERVX0RBVEEocFJ4UGFja2V0SW5mbyk7CisKKyAgIC8qIE5vdGUgc3VyZSBpZiB0aGlzIGlzIHN1ZmZpY2llbnQsIGJhc2ljYWxseSB0aGlzIGNvbmRpdGlvbiBhbGxvd3MgYWxsIHByb2JlIHJlc3BvbnNlcyBhbmQgCisgICAgKiAgIGJlYWNvbnMgZnJvbSBhbiBpbmZyYXN0cnVjdHVyZSBuZXR3b3JrIAorICAgICovCisgICAgICAgICooKHRBTklfVTE2KikgJmNhcGFiaWxpdHlJbmZvKSA9IHNpclJlYWRVMTYocEJvZHkrIExJTV9CQ05fUFJfQ0FQQUJJTElUWV9PRkZTRVQpOworICAgIGlmKCFjYXBhYmlsaXR5SW5mby5pYnNzKQorICAgICAgICByZXR1cm4gZU1HTVRfRFJPUF9OT19EUk9QOworI2lmIDAKKyAgICAvL0FsbG93IHRoZSBtZ210IGZyYW1lcyB0byBiZSBxdWV1ZWQgaWYgU1RBIG5vdCBpbiBJQlNTIG1vZGUuCisgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSAhPSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpCisgICAgICAgIHJldHVybiBlTUdNVF9EUk9QX05PX0RST1A7CisjZW5kaWYKKworICAgIC8vRHJvcCBJTkZSQSBCZWFjb25zIGFuZCBQcm9iZSBSZXNwb25zZXMgaW4gSUJTUyBNb2RlCisgICAgaWYoIChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9CRUFDT04pIHx8CisgICAgICAgIChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApKQorICAgIHsKKyAgICAgICAgLy9kcm9wIHRoZSBmcmFtZSBpZiBsZW5ndGggaXMgbGVzcyB0aGFuIDEyCisgICAgICAgIGlmKGZyYW1lbGVuIDwgTElNX01JTl9CQ05fUFJfTEVOR1RIKQorICAgICAgICAgICAgcmV0dXJuIGVNR01UX0RST1BfSU5WQUxJRF9TSVpFOworICAgICAgICAKKyAgICAgICAgKigodEFOSV9VMTYqKSAmY2FwYWJpbGl0eUluZm8pID0gc2lyUmVhZFUxNihwQm9keSsgTElNX0JDTl9QUl9DQVBBQklMSVRZX09GRlNFVCk7CisKKyAgICAgICAgLy9UaGlzIGNhbiBiZSBlbmhhbmNlZCB0byBldmVuIGNoZWNrIHRoZSBTU0lEIGJlZm9yZSBkZWNpZGluZyB0byBlbnF1ZSB0aGUgZnJhbWUuCisgICAgICAgIGlmKGNhcGFiaWxpdHlJbmZvLmVzcykKKyAgICAgICAgICAgIHJldHVybiBlTUdNVF9EUk9QX0lORlJBX0JDTl9JTl9JQlNTOworICAgIH0KKyAgICBlbHNlIGlmKCAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfUFJPQkVfUkVRKSAmJgorICAgICAgICAgICAgICAgICghV0RBX0dFVF9SWF9CRUFDT05fU0VOVChwUnhQYWNrZXRJbmZvKSkpCisgICAgeworICAgICAgICAvL0Ryb3AgdGhlIFByb2JlIFJlcXVlc3QgaW4gSUJTUyBtb2RlLCBpZiBTVEEgZGlkIG5vdCBzZW5kIG91dCB0aGUgbGFzdCBiZWFjb24KKyAgICAgICAgLy9JbiBJQlNTLCB0aGUgbm9kZSB3aGljaCBzZW5kcyBvdXQgdGhlIGJlYWNvbiwgaXMgc3VwcG9zZWQgdG8gcmVzcG9uZCB0byBQcm9iZVJlcQorICAgICAgICByZXR1cm4gZU1HTVRfRFJPUF9OT1RfTEFTVF9JQlNTX0JDTjsKKyAgICB9CisKKyAgICByZXR1cm4gZU1HTVRfRFJPUF9OT19EUk9QOworfQorCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltQXNzb2NVdGlscy5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Bc3NvY1V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwMmRkYQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltQXNzb2NVdGlscy5jCkBAIC0wLDAgKzEsMzc5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbUFzc29jVXRpbHMuY2MgY29udGFpbnMgdGhlIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBMSU0gdXNlcyB3aGlsZSBwcm9jZXNzaW5nIChSZSkgQXNzb2NpYXRpb24gbWVzc2FnZXMuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMy8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAwNS8yNi8xMCAgICAgICBqcyAgICAgICAgICAgICBXUEEgaGFuZGxpbmcgaW4gKFJlKUFzc29jIGZyYW1lcworICogCisgKi8KKyAKKyNpbmNsdWRlICJwYWxUeXBlcy5oIgorI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgInduaUFwaS5oIgorI2luY2x1ZGUgInNpckNvbW1vbi5oIgorCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNlbHNlCisjaW5jbHVkZSAid25pQ2ZnU3RhLmgiCisjZW5kaWYKKyNpbmNsdWRlICJwbW1BcGkuaCIKKyNpbmNsdWRlICJjZmdBcGkuaCIKKworI2luY2x1ZGUgInNjaEFwaS5oIgorI2luY2x1ZGUgInV0aWxzQXBpLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VjdXJpdHlVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAibGltU3RhSGFzaEFwaS5oIgorI2luY2x1ZGUgImxpbUFkbWl0Q29udHJvbC5oIgorI2luY2x1ZGUgImxpbVNlbmRNZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbUlic3NQZWVyTWdtdC5oIgorI2luY2x1ZGUgImxpbVNlc3Npb24uaCIKKworI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIgorCisvKgorICogZmlsbCB1cCB0aGUgcmF0ZSBpbmZvIHByb3Blcmx5IGJhc2VkIG9uIHdoYXQgaXMgYWN0dWFsbHkgc3VwcG9ydGVkIGJ5IHRoZSBwZWVyCisgKiBUQkQgVEJEIFRCRAorICovCit2b2lkCitsaW1GaWxsU3VwcG9ydGVkUmF0ZXNJbmZvKAorICAgIHRwQW5pU2lyR2xvYmFsICAgICAgICAgIHBNYWMsCisgICAgdHBEcGhIYXNoTm9kZSAgICAgICAgICAgcFN0YSwKKyAgICB0cFNpclN1cHBvcnRlZFJhdGVzICAgcFJhdGVzLAorICAgIHRwUEVTZXNzaW9uICAgICAgICAgICBwc2Vzc2lvbkVudHJ5KQoreworICAgIC8vcFN0YSB3aWxsIGJlIE5VTEwgZm9yIHNlbGYgZW50cnksIHNvIGdldCB0aGUgb3BSYXRlTW9kZSBiYXNlZCBvbiB0aGUgc2VsZiBtb2RlLgorICAgIC8vRm9yIHRoZSBwZWVyIGVudHJ5IGdldCBpdCBmcm9tIHRoZSBwZWVyIENhcGFiaWxpdGllcyBwcmVzZW50IGluIGhhc2ggdGFibGUKKyAgICBpZihwU3RhID09IE5VTEwpCisgICAgICAgIHBSYXRlcy0+b3BSYXRlTW9kZSA9IGxpbUdldFN0YVJhdGVNb2RlKCh0QU5JX1U4KXBzZXNzaW9uRW50cnktPmRvdDExbW9kZSk7CisgICAgZWxzZQorICAgICAgICBwUmF0ZXMtPm9wUmF0ZU1vZGUgPSBsaW1HZXRTdGFQZWVyVHlwZShwTWFjLCBwU3RhLCBwc2Vzc2lvbkVudHJ5KTsKKworfQorCisKKy8qKgorICogbGltQ21wU1NpZCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHZhcmlvdXMgcGxhY2VzIHdpdGhpbiBMSU0gY29kZQorICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgcmVjZWl2ZWQgU1NpZCBpcyBzYW1lIGFzIFNTSUQgaW4gdXNlLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gICpwcnhTU2lkIC0gcG9pbnRlciB0byBTU0lEIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gc3RhdHVzIC0gdHJ1ZSBmb3IgU1NJRCBtYXRjaCBlbHNlIGZhbHNlLgorICovCisKK3RBTklfVTgKK2xpbUNtcFNTaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY1NTaWQgKnByeFNTaWQsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworICAgIGlmKCBwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwgICh0QU5JX1U4KiApIHByeFNTaWQsICh0QU5JX1U4ICopICZwc2Vzc2lvbkVudHJ5LT5zc0lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KSAocHNlc3Npb25FbnRyeS0+c3NJZC5sZW5ndGggKyAxKSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCit9IC8qKioqKiogZW5kIGxpbUNtcFNTaWQoKSAqKioqKiovCisKKworCisvKioKKyAqIGxpbUNvbXBhcmVDYXBhYmlsaXRpZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgQXNzb2NpYXRpb24vUmVhc3NvY2lhdGlvbgorICogZnJhbWUgaGFuZGxpbmcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgcmVjZWl2ZWQgY2FwYWJpbGl0aWVzCisgKiBtYXRjaCB3aXRoIGxvY2FsIGNhcGFiaWxpdGllcyBvciBub3QuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwQXNzb2NSZXEgICAgLSBQb2ludGVyIHRvIHJlY2VpdmVkIEFzc29jIFJlcSBmcmFtZQorICogQHBhcmFtICBwTG9jYWxDYXBhYnMgLSBQb2ludGVyIHRvIGxvY2FsIGNhcGFiaWxpdGllcworICoKKyAqIEByZXR1cm4gc3RhdHVzIC0gdHJ1ZSBmb3IgQ2FwYWJpbGl0aXR5IG1hdGNoIGVsc2UgZmFsc2UuCisgKi8KKwordEFOSV9VOAorbGltQ29tcGFyZUNhcGFiaWxpdGllcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICB0U2lyQXNzb2NSZXEgKnBBc3NvY1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0NhcGFiaWxpdHlJbmZvICpwTG9jYWxDYXBhYnMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UzMiAgIHZhbDsKKworCisgICAgaWYgKCAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKXx8CisgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKSkgJiYKKyAgICAgICAgIChwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmlic3MpICkKKyAgICB7CisgICAgICAgIC8vIFJlcXVlc3RpbmcgU1RBIGFzc2VydGluZyBJQlNTIGNhcGFiaWxpdHkuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb21wYXJlIENGIGNhcGFiaWxpdGllcworICAgIGlmIChwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbGFibGUgfHwKKyAgICAgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5jZlBvbGxSZXEpCisgICAgeworICAgICAgICAvLyBBUCBkb2VzIG5vdCBzdXBwb3J0IFBDRiBmdW5jdGlvbmFsaXR5CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiAwICAgIC8vU2VlIENSMjQ2OTYgZm9yIGFuYWx5c2lzCisgICAgLy8gQ29tcGFyZSBwcml2YWN5IGNhcGFiaWxpdHkKKyAgICBpZiAocEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5wcml2YWN5ICE9IHBMb2NhbENhcGFicy0+cHJpdmFjeSkKKyAgICB7CisgICAgICAgIC8vIEFQIGRvZXMgbm90IHN1cHBvcnQgcHJpdmFjeQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisgICAgCisgICAgLy8gQ29tcGFyZSBzaG9ydCBwcmVhbWJsZSBjYXBhYmlsaXR5CisgICAgaWYgKHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZSAmJgorICAgICAgICAocEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5zaG9ydFByZWFtYmxlICE9CisgICAgICAgICBwTG9jYWxDYXBhYnMtPnNob3J0UHJlYW1ibGUpKQorICAgIHsKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgiQWxsb3dpbmcgYSBTVEEgcmVxdWVzdGluZyBzaG9ydCBwcmVhbWJsZSB3aGlsZSBBUCBkb2VzIG5vdCBzdXBwb3J0IGl0XG4iKSk7KQorI2lmIDAKKyAgICAgICAgLy8gQVAgZG9lcyBub3Qgc3VwcG9ydCBzaG9ydCBwcmVhbWFibGUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAgfQorCisKKyAgICBsaW1Mb2cocE1hYywgTE9HVywgIlFvUyBpbiBBc3NvY1JlcTogJWQsIGxvY2FsIFNob3J0UDogJWRcbiIsIAorICAgICAgICAgICAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnFvcywKKyAgICAgICAgICAgICAgcExvY2FsQ2FwYWJzLT5xb3MpOworCisgICAgLy8gQ29tcGFyZSBRb1MgY2FwYWJpbGl0eQorICAgIGlmIChwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnFvcyAmJgorICAgICAgICAocEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5xb3MgIT0gcExvY2FsQ2FwYWJzLT5xb3MpKQorICAgIHsKKyAgICAgICAgLypUZW1wb3JhcnkgaGFjayBmb3IgVVBGIHRvIHNraXAgMTFlIGNhcGFiaWxpdHkgY2hlY2sgaW4gb3JkZXIgdG8gaW50ZXJvcCB3aXRoIAorICAgICAgICAgIENTUiAtIHByb3BlciBmaXggbmVlZHMgdG8gYmUgcHV0IGluIHBsYWNlKi8KKyAgICAgICAgaWYgKCAwICE9IHZvc19nZXRfc2tpcF8xMWVfY2hlY2soKSkKKyAgICAgICAgeworICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiUmVjZWl2ZWQgdW5tYXRjaGVkIFFPUyBidXQgY2ZnIHRvIHN1cHByZXNzIC0gY29udGludWluZ1xuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAvLyBBUCBkb2VzIG5vdCBzdXBwb3J0IFFvUyBjYXBhYmlsaXR5CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogCisgICAgICogSWYgQVAgc3VwcG9ydHMgc2hvcnRTbG90IGFuZCBpZiBhcHBsZSB1c2VyIGhhcworICAgICAqIGVuZm9yY2VkIGFzc29jaWF0aW9uIG9ubHkgZnJvbSBzaG9ydFNsb3Qgc3RhdGlvbiwKKyAgICAgKiB0aGVuIEFQIG11c3QgcmVqZWN0IGFueSBzdGF0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydAorICAgICAqIHNob3J0U2xvdAorICAgICAqLworICAgIGlmICggKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSl8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpKSAmJiAocExvY2FsQ2FwYWJzLT5zaG9ydFNsb3RUaW1lID09IDEpICkKKworICAgIHsKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQUNDRVBUX1NIT1JUX1NMT1RfQVNTT0NfT05MWSwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImVycm9yIGdldHRpbmcgV05JX0NGR19GT1JDRV9TSE9SVF9TTE9UX0FTU09DX09OTFkgXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYodmFsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5zaG9ydFNsb3RUaW1lICE9IHBMb2NhbENhcGFicy0+c2hvcnRTbG90VGltZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgICAgIAorICAgIHJldHVybiB0cnVlOworfSAvKioqKioqIGVuZCBsaW1Db21wYXJlQ2FwYWJpbGl0aWVzKCkgKioqKioqLworCisKKy8qKgorICogbGltQ2hlY2tSeEJhc2ljUmF0ZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgQXNzb2NpYXRpb24vUmVhc3NvY2lhdGlvbgorICogZnJhbWUgaGFuZGxpbmcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgcmVjZWl2ZWQgcmF0ZXMgaW4KKyAqIEFzc29jL1JlYXNzb2MgcmVxdWVzdCBmcmFtZXMgaW5jbHVkZSBhbGwgQlNTIGJhc2ljIHJhdGVzCisgKiBvciBub3QuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcnhSYXRlU2V0IC0gcG9pbnRlciB0byBTU0lEIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gc3RhdHVzIC0gdHJ1ZSBpZiBBTEwgQlNTIGJhc2ljIHJhdGVzIGFyZSBwcmVzZW50IGluIHRoZQorICogICAgICAgICAgICAgICAgICByZWNlaXZlZCByYXRlc2V0IGVsc2UgZmFsc2UuCisgKi8KKwordEFOSV9VOAorbGltQ2hlY2tSeEJhc2ljUmF0ZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY1JhdGVTZXQgcnhSYXRlU2V0LHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFNpck1hY1JhdGVTZXQgICAgKnBSYXRlU2V0LCBiYXNpY1JhdGU7CisgICAgdEFOSV9VOCAgICBpLCBqLCBrLCBtYXRjaDsKKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFJhdGVTZXQsIHNpemVvZih0U2lyTWFjUmF0ZVNldCkpKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIFJBVEVTRVRcbiIpKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgCisgICAgI2lmIDAKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVCwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwUmF0ZVNldC0+cmF0ZSwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmY2ZnTGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCBPcGVyYXRpb25hbCByYXRlc2V0IGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIE9wZXJhdGlvbmFsIHJhdGVzZXRcbiIpKTsKKworICAgICAgICAvLyBGcmVlIHVwIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHJhdGVzZXQKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcFJhdGVTZXQpOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKworICAgIC8qIENvcHkgb3BlcmF0aW9uYWwgcmF0ZSBzZXQgZnJvbSBzZXNzaW9uIEVudHJ5ICovCisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAgcFJhdGVTZXQtPnJhdGUsICAocHNlc3Npb25FbnRyeS0+cmF0ZVNldC5yYXRlKSwgIHBzZXNzaW9uRW50cnktPnJhdGVTZXQubnVtUmF0ZXMpOworICAgIAorICAgIHBSYXRlU2V0LT5udW1SYXRlcyA9IHBzZXNzaW9uRW50cnktPnJhdGVTZXQubnVtUmF0ZXM7CisKKyAgICAvLyBFeHRyYWN0IEJTUyBiYXNpYyByYXRlc2V0IGZyb20gb3BlcmF0aW9uYWwgcmF0ZXNldAorICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgcFJhdGVTZXQtPm51bVJhdGVzOyBpKyspCisgICAgeworICAgICAgICBpZiAoKHBSYXRlU2V0LT5yYXRlW2ldICYgMHg4MCkgPT0gMHg4MCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbXNiIGlzIHNldCwgc28gdGhpcyBpcyBhIGJhc2ljIHJhdGUKKyAgICAgICAgICAgIGJhc2ljUmF0ZS5yYXRlW2orK10gPSBwUmF0ZVNldC0+cmF0ZVtpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogRm9yIGVhY2ggQlNTIGJhc2ljIHJhdGUsIGZpbmQgaWYgaXQgaXMgcHJlc2VudCBpbiB0aGUKKyAgICAgKiByZWNlaXZlZCByYXRlc2V0LgorICAgICAqLworICAgIGZvciAoayA9IDA7IGsgPCBqOyBrKyspCisgICAgeworICAgICAgICBtYXRjaCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByeFJhdGVTZXQubnVtUmF0ZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChyeFJhdGVTZXQucmF0ZVtpXSB8IDB4ODApID09ICAgIGJhc2ljUmF0ZS5yYXRlW2tdKQorICAgICAgICAgICAgICAgIG1hdGNoID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbWF0Y2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZyZWUgdXAgbWVtb3J5IGFsbG9jYXRlZCBmb3IgcmF0ZXNldAorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcFJhdGVTZXQpOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGcmVlIHVwIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHJhdGVzZXQKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwUmF0ZVNldCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30gLyoqKioqKiBlbmQgbGltQ2hlY2tSeEJhc2ljUmF0ZXMoKSAqKioqKiovCisKKworCisvKioKKyAqIGxpbUNoZWNrTUNTU2V0KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIEFzc29jaWF0aW9uL1JlYXNzb2NpYXRpb24KKyAqIGZyYW1lIGhhbmRsaW5nIHRvIGRldGVybWluZSB3aGV0aGVyIHJlY2VpdmVkIE1DUyByYXRlcyBpbgorICogQXNzb2MvUmVhc3NvYyByZXF1ZXN0IGZyYW1lcyBpbmNsdWRlcyBhbGwgQmFzaWMgTUNTIFJhdGUgU2V0IG9yIG5vdC4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBzdXBwb3J0ZWRNQ1NTZXQgLSBwb2ludGVyIHRvIFN1cHBvcnRlZCBNQ1MgUmF0ZSBTZXQKKyAqCisgKiBAcmV0dXJuIHN0YXR1cyAtIHRydWUgaWYgQUxMIE1DUyBCYXNpYyBSYXRlIFNldCByYXRlcyBhcmUgcHJlc2VudCBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgcmF0ZXNldCBlbHNlIGZhbHNlLgorICovCisKK3RBTklfVTgKK2xpbUNoZWNrTUNTU2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTgqIHN1cHBvcnRlZE1DU1NldCkKK3sKKyAgICB0QU5JX1U4IGJhc2ljTUNTU2V0W1NJWkVfT0ZfQkFTSUNfTUNTX1NFVF0gPSB7MH07CisgICAgdEFOSV9VMzIgICBjZmdMZW4gPSAwOworICAgIHRBTklfVTggaTsKKyAgICB0QU5JX1U4IHZhbGlkQnl0ZXM7CisgICAgdEFOSV9VOCBsYXN0Qnl0ZU1DU01hc2sgPSAweDFmOworCisKKyAgICBjZmdMZW4gPSBXTklfQ0ZHX0JBU0lDX01DU19TRVRfTEVOOworICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0JBU0lDX01DU19TRVQsCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBiYXNpY01DU1NldCwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmY2ZnTGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCBCYXNpYyBNQ1MgcmF0ZXNldCBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBCYXNpYyBNQ1MgcmF0ZXNldFxuIikpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmFsaWRCeXRlcyA9IFZBTElEX01DU19TSVpFLzg7CisKKyAgICAvL2NoZWNrIGlmIGFsbCB0aGUgQmFzaWMgTUNTIEJpdHMgYXJlIHNldCBpbiBzdXBwb3J0ZWQgTUNTIGJpdG1hcAorICAgIGZvcihpPTA7IGk8dmFsaWRCeXRlczsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoIChiYXNpY01DU1NldFtpXSAmIHN1cHBvcnRlZE1DU1NldFtpXSkgIT0gYmFzaWNNQ1NTZXRbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiT25lIG9mIEJhc2ljIE1DUyBTZXQgUmF0ZXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgU3RhdGlvbi4iKSk7KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvL2NoZWNrIHRoZSBsYXN0IDUgYml0cyBvZiB0aGUgdmFsaWQgTUNTIGJpdG1hcAorICAgIGlmKCAoKGJhc2ljTUNTU2V0W2ldICYgbGFzdEJ5dGVNQ1NNYXNrKSAmIChzdXBwb3J0ZWRNQ1NTZXRbaV0gJiBsYXN0Qnl0ZU1DU01hc2spKSAhPQorICAgICAgICAgIChiYXNpY01DU1NldFtpXSAmIGxhc3RCeXRlTUNTTWFzaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIk9uZSBvZiBCYXNpYyBNQ1MgU2V0IFJhdGVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFN0YXRpb24uIikpOykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisKKyNkZWZpbmUgU0VDVVJJVFlfU1VJVEVfVFlQRV9NQVNLIDB4RkYKKyNkZWZpbmUgU0VDVVJJVFlfU1VJVEVfVFlQRV9XRVA0MCAweDEKKyNkZWZpbmUgU0VDVVJJVFlfU1VJVEVfVFlQRV9US0lQIDB4MgorI2RlZmluZSBTRUNVUklUWV9TVUlURV9UWVBFX0NDTVAgMHg0CisjZGVmaW5lIFNFQ1VSSVRZX1NVSVRFX1RZUEVfV0VQMTA0IDB4NAorCisvKioKKyAqIGxpbUNoZWNrUnhSU05JZU1hdGNoKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIEFzc29jaWF0aW9uL1JlYXNzb2NpYXRpb24KKyAqIGZyYW1lIGhhbmRsaW5nIHRvIGRldGVybWluZSB3aGV0aGVyIHJlY2VpdmVkIFJTTiBpbgorICogQXNzb2MvUmVhc3NvYyByZXF1ZXN0IGZyYW1lcyBpbmNsdWRlIHN1cHBvcnRlZCBjaXBoZXIgc3VpdGVzIG9yIG5vdC4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICByeFJTTkllIC0gcmVjZWl2ZWQgUlNOIElFIGluIChSZSlBc3NjbyByZXEKKyAqCisgKiBAcmV0dXJuIHN0YXR1cyAtIHRydWUgaWYgQUxMIEJTUyBiYXNpYyByYXRlcyBhcmUgcHJlc2VudCBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgcmF0ZXNldCBlbHNlIGZhbHNlLgorICovCisKK3RBTklfVTgKK2xpbUNoZWNrUnhSU05JZU1hdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRVJTTiByeFJTTkllLHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnksIHRBTklfVTggc3RhSXNIVCkKK3sKKyAgICB0RG90MTFmSUVSU04gICAgKnBSU05JZTsKKyAgICB0QU5JX1U4ICAgICAgICAgaSwgaiwgbWF0Y2gsIG9ubHlOb25IdENpcGhlciA9IDE7CisKKworICAgIC8vUlNOIElFIHNob3VsZCBiZSByZWNlaXZlZCBmcm9tIFBFCisgICAgcFJTTkllID0gJnBTZXNzaW9uRW50cnktPmdTdGFydEJzc1JTTkllOworCisgICAgLy8gQ2hlY2sgZ3JvdXB3aXNlIGNpcGhlciBzdWl0ZQorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YocnhSU05JZS5ncF9jaXBoZXJfc3VpdGUpOyBpKyspCisgICAgeworICAgICAgICBpZiAocFJTTkllLT5ncF9jaXBoZXJfc3VpdGVbaV0gIT0gcnhSU05JZS5ncF9jaXBoZXJfc3VpdGVbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlU0lSX01BQ19JTlZBTElEX0dST1VQX0NJUEhFUl9TVEFUVVM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBlYWNoIFBhaXJ3aXNlIGNpcGhlciBzdWl0ZSBjaGVjayB3aGV0aGVyIHdlIHN1cHBvcnQKKyAgICAgKiByZWNlaXZlZCBwYWlyd2lzZQorICAgICAqLworICAgIG1hdGNoID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcnhSU05JZS5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGZvcihqID0gMDsgaiA8IHBSU05JZS0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBhbEVxdWFsTWVtb3J5KHBNYWMsJnJ4UlNOSWUucHdpc2VfY2lwaGVyX3N1aXRlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJTTkllLT5wd2lzZV9jaXBoZXJfc3VpdGVzW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwUlNOSWUtPnB3aXNlX2NpcGhlcl9zdWl0ZXNbal0pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXRjaCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHN0YUlzSFQpIAorI2lmZGVmIEFOSV9MSVRUTEVfQllURV9FTkRJQU4KKyAgICAgICAgICAgICYmKCAocnhSU05JZS5wd2lzZV9jaXBoZXJfc3VpdGVzW2ldWzNdICYgU0VDVVJJVFlfU1VJVEVfVFlQRV9NQVNLKSA9PSBTRUNVUklUWV9TVUlURV9UWVBFX0NDTVApKQorI2Vsc2UKKyAgICAgICAgICAgICYmKCAocnhSU05JZS5wd2lzZV9jaXBoZXJfc3VpdGVzW2ldWzBdICYgU0VDVVJJVFlfU1VJVEVfVFlQRV9NQVNLKSA9PSBTRUNVUklUWV9TVUlURV9UWVBFX0NDTVApKQorI2VuZGlmICAgICAgICAgICAgCisgICAgICAgIHsKKyAgICAgICAgICAgICBvbmx5Tm9uSHRDaXBoZXI9MDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKCghbWF0Y2gpIHx8ICgoc3RhSXNIVCkgJiYgb25seU5vbkh0Q2lwaGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlU0lSX01BQ19JTlZBTElEX1BBSVJXSVNFX0NJUEhFUl9TVEFUVVM7CisgICAgfQorICAgIC8qIENoZWNrIFJTTiBjYXBhYmlsaXRpZXMgKi8KKyAgICBpZihyeFJTTkllLnByZWF1dGggPT0gdHJ1ZSkgLy90aGlzIGlzIHN1cHBvcnRlZCBieSBBUCBvbmx5CisgICAgeworICAgICAgICByZXR1cm4gZVNJUl9NQUNfSU5WQUxJRF9SU05fSUVfQ0FQQUJJTElUSUVTX1NUQVRVUzsKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqKioqIGVuZCBsaW1DaGVja1J4UlNOSWVNYXRjaCgpICoqKioqKi8KKworLyoqCisgKiBsaW1DaGVja1J4V1BBSWVNYXRjaCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBBc3NvY2lhdGlvbi9SZWFzc29jaWF0aW9uCisgKiBmcmFtZSBoYW5kbGluZyB0byBkZXRlcm1pbmUgd2hldGhlciByZWNlaXZlZCBSU04gaW4KKyAqIEFzc29jL1JlYXNzb2MgcmVxdWVzdCBmcmFtZXMgaW5jbHVkZSBzdXBwb3J0ZWQgY2lwaGVyIHN1aXRlcyBvciBub3QuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcnhXUEFJZSAtIFJlY2VpdmVkIFdQQSBJRSBpbiAoUmUpQXNzY28gcmVxCisgKgorICogQHJldHVybiBzdGF0dXMgLSB0cnVlIGlmIEFMTCBCU1MgYmFzaWMgcmF0ZXMgYXJlIHByZXNlbnQgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIHJhdGVzZXQgZWxzZSBmYWxzZS4KKyAqLworCit0QU5JX1U4CitsaW1DaGVja1J4V1BBSWVNYXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVXUEEgcnhXUEFJZSx0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5LCB0QU5JX1U4IHN0YUlzSFQpCit7CisgICAgdERvdDExZklFV1BBICAgICpwV1BBSWU7CisgICAgdEFOSV9VOCAgICAgICAgIGksIGosIG1hdGNoLCBvbmx5Tm9uSHRDaXBoZXIgPSAxOworCisgICAgLy8gV1BBIElFIHNob3VsZCBiZSByZWNlaXZlZCBmcm9tIFBFCisgICAgcFdQQUllID0gJnBTZXNzaW9uRW50cnktPmdTdGFydEJzc1dQQUllOworCisgICAgLy8gQ2hlY2sgZ3JvdXB3aXNlIGNpcGhlciBzdWl0ZQorICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBpZiAocFdQQUllLT5tdWx0aWNhc3RfY2lwaGVyW2ldICE9IHJ4V1BBSWUubXVsdGljYXN0X2NpcGhlcltpXSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVTSVJfTUFDX0lOVkFMSURfR1JPVVBfQ0lQSEVSX1NUQVRVUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogRm9yIGVhY2ggUGFpcndpc2UgY2lwaGVyIHN1aXRlIGNoZWNrIHdoZXRoZXIgd2Ugc3VwcG9ydAorICAgICAqIHJlY2VpdmVkIHBhaXJ3aXNlCisgICAgICovCisgICAgbWF0Y2ggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCByeFdQQUllLnVuaWNhc3RfY2lwaGVyX2NvdW50OyBpKyspCisgICAgeworICAgICAgICBmb3IoaiA9IDA7IGogPCBwV1BBSWUtPnVuaWNhc3RfY2lwaGVyX2NvdW50OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBhbEVxdWFsTWVtb3J5KHBNYWMscnhXUEFJZS51bmljYXN0X2NpcGhlcnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdQQUllLT51bmljYXN0X2NpcGhlcnNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChzdGFJc0hUKSAKKyNpZmRlZiBBTklfTElUVExFX0JZVEVfRU5ESUFOCisgICAgICAgICAgICAmJiggKHJ4V1BBSWUudW5pY2FzdF9jaXBoZXJzW2ldWzNdICYgU0VDVVJJVFlfU1VJVEVfVFlQRV9NQVNLKSA9PSBTRUNVUklUWV9TVUlURV9UWVBFX0NDTVApKQorI2Vsc2UKKyAgICAgICAgICAgICYmKCAocnhXUEFJZS51bmljYXN0X2NpcGhlcnNbaV1bMF0gJiBTRUNVUklUWV9TVUlURV9UWVBFX01BU0spID09IFNFQ1VSSVRZX1NVSVRFX1RZUEVfQ0NNUCkpCisjZW5kaWYgICAgICAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgIG9ubHlOb25IdENpcGhlcj0wOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBpZiAoKCFtYXRjaCkgfHwgKChzdGFJc0hUKSAmJiBvbmx5Tm9uSHRDaXBoZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVTSVJfTUFDX0NJUEhFUl9TVUlURV9SRUpFQ1RFRF9TVEFUVVM7CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyoqKioqKiBlbmQgbGltQ2hlY2tSeFdQQUllTWF0Y2goKSAqKioqKiovCisKKyNlbmRpZiAvKiBXTEFOX1NPRlRBUF9GRUFUVVJFICovCisKKy8qKgorICogbGltQ2xlYW51cFJ4UGF0aCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsZWFudXAgU1RBIHN0YXRlIGF0IFNQICYgUkZQLgorICoKKyAqTE9HSUM6CisgKiBUbyBjaXJjdW12ZW50IFJGUCdzIGhhbmRsaW5nIG9mIGR1bW15IHBhY2tldCB3aGVuIGl0IGRvZXMgbm90CisgKiBoYXZlIGFuIGluY29tcGxldGUgcGFja2V0IGZvciB0aGUgU1RBIHRvIGJlIGRlbGV0ZWQsIGEgcGFja2V0CisgKiB3aXRoICdtb3JlIGZyYW1nZW50cycgYml0IHNldCB3aWxsIGJlIHF1ZXVlZCB0byBSRlAncyBXUSBiZWZvcmUKKyAqIHF1ZXVpbmcgJ2R1bW15IHBhY2tldCcuCisgKiBBICdkdW1teScgQkQgaXMgcHVzaGVkIGludG8gUkZQJ3MgV1Egd2l0aCB0eXBlPTAwLCBzdWJ0eXBlPTEwMTAKKyAqIChEaXNhc3NvY2lhdGlvbiBmcmFtZSkgYW5kIHJvdXRpbmcgZmxhZ3MgaW4gQkQgc2V0IHRvIGVDUFUncworICogTG93IFByaW9yaXR5IFdRLgorICogUkZQIGNsZWFucyB1cCBpdHMgbG9jYWwgY29udGV4dCBmb3IgdGhlIFNUQSBpZCBtZW50aW9uZWQgaW4gdGhlCisgKiBCRCBhbmQgdGhlbiBwdXNoZXMgQkQgdG8gZUNQVSdzIGxvdyBwcmlvcml0eSBXUS4KKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwU3RhRHMgIFBvaW50ZXIgdG8gdGhlIHBlciBTVEEgZGF0YSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGJ5IExJTSBhbmQgbWFpbnRhaW5lZCBhdCBEUEgKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1DbGVhbnVwUnhQYXRoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YURzLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFNpclJldFN0YXR1cyAgICAgICByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworCisKKyAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiKipJbml0aWF0ZSBjbGVhbnVwXG4iKSk7KQorCisgICAgbGltQWJvcnRCYWNrZ3JvdW5kU2NhbiggcE1hYyApOworCisgICAgaWYgKHBNYWMtPmxpbS5nTGltQWRkdHNTZW50KQorICAgIHsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfREVBQ1RJVkFURSwgMCwgZUxJTV9BRERUU19SU1BfVElNRVIpKTsKKyAgICAgICAgdHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQWRkdHNSc3BUaW1lcik7CisgICAgfQorCisgICAgaWYgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9BU1NPQ19DTkZfU1RBVEUpCisgICAgeworICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlUGVyU3RhSWRUaW1lcihwTWFjLCBlTElNX0NORl9XQUlUX1RJTUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkKTsKKworICAgICAgICBpZiAoIXBTdGFEcy0+bWxtU3RhQ29udGV4dC51cGRhdGVDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZXJlIGlzIG5vIGNvbnRleHQgYXQgUG9sYXJpcyB0byBkZWxldGUuCisgICAgICAgICAgICAgKiBSZWxlYXNlIG91ciBhc3NpZ25lZCBBSUQgYmFjayB0byB0aGUgZnJlZSBwb29sCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpIHx8IAorICAgICAgICAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpKQorICAgICAgICAgICAgeyAgICAKKyAgICAgICAgICAgICAgICBsaW1SZWxlYXNlQUlEKHBNYWMsIHBTdGFEcy0+YXNzb2NJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW1EZWxldGVEcGhIYXNoRW50cnkocE1hYywgcFN0YURzLT5zdGFBZGRyLCBwU3RhRHMtPmFzc29jSWQscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgIHJldHVybiByZXRDb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgLy9kZWxldGUgYWxsIHRzcGVjcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGEuCisgICAgbGltQWRtaXRDb250cm9sRGVsZXRlU3RhKHBNYWMsIHBTdGFEcy0+YXNzb2NJZCk7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVD09QVApCisgICAgLy8gUmVzZXQgUE1NIHN0YXRlIGZvciB0aGlzIFNUQSBpZiBpdCBleGlzdHMKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpfHwocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKQorICAgICAgICBwbW1VcGRhdGVQTU1vZGUocE1hYywgcFN0YURzLT5hc3NvY0lkLCAwKTsKKyNlbmRpZgorCisgICAgLyoqCisgICAgICogTWFrZSBTVEEgaGFzaCBlbnRyeSBpbnZhbGlkIGF0IGVDUFUgc28gdGhhdCBEUEgKKyAgICAgKiBkb2VzIG5vdCBwcm9jZXNzIGFueSBtb3JlIGRhdGEgcGFja2V0cyBhbmQKKyAgICAgKiByZWxlYXNlcyB0aG9zZSBCRHMKKyAgICAgKi8KKyAgICBwU3RhRHMtPnZhbGlkICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICAgPSBlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURTsKKworICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKXx8KHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpKQorICAgIHsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURSkpOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFKSk7CisgICAgICAgIC8qIERlYWN0aXZhdGluZyBwcm9iZSBhZnRlciBoZWFydCBiZWF0IHRpbWVyICovCisgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX1BST0JFX0FGVEVSX0hCX1RJTUVSKTsKKyAgICAgICAgbGltSGVhcnRCZWF0RGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9LRUVQQUxJVkVfVElNRVIpOworICAgICAgICBwTWFjLT5saW0uZ0xhc3RCZWFjb25EdGltQ291bnQgPSAwOworICAgICAgICBwTWFjLT5saW0uZ0xhc3RCZWFjb25EdGltUGVyaW9kID0gMDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsZUxJTV9UU01fVElNRVIpOworI2VuZGlmCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIGZvciBQTU0gbW9kdWxlCisgICAgICAgICAqLworICAgICAgICBwbW1SZXNldFBtbVN0YXRlKHBNYWMpOworICAgIH0KKyNpZmRlZiBXTEFOX0RFQlVHICAgIAorICAgIC8vIGluY3JlbWVudCBhIGRlYnVnIGNvdW50CisgICAgcE1hYy0+bGltLmdMaW1OdW1SeENsZWFudXArKzsKKyNlbmRpZgorCisgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX0pPSU5fRkFJTFVSRV9TVEFURSkgeworICAgICAgICByZXRDb2RlID0gbGltRGVsQnNzKCBwTWFjLCBwU3RhRHMsIHBzZXNzaW9uRW50cnktPmJzc0lkeCwgcHNlc3Npb25FbnRyeSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0Q29kZSA9IGxpbURlbFN0YSggcE1hYywgcFN0YURzLCB0cnVlLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgIHJldHVybiByZXRDb2RlOworCit9IC8qKiogZW5kIGxpbUNsZWFudXBSeFBhdGgoKSAqKiovCisKKworLyoqCisgKiBsaW1TZW5kRGVsU3RhQ25mKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gIHNlbmQgYXBwcm9wcmlhdGUgQ05GIG1lc3NhZ2UgdG8gU01FCisgKgorICpMT0dJQzoKKyAqCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAqIEBwYXJhbSB0U2lyTWFjQWRkciBzdGFEc0FkZHIsCisgKiBAcGFyYW0gdEFOSV9VMTYgc3RhRHNBc3NvY0lkLAorICogQHBhcmFtIHRMaW1NbG1TdGFDb250ZXh0IG1sbVN0YUNvbnRleHQsCisgKiBAcGFyYW0gdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGUKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1TZW5kRGVsU3RhQ25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHN0YURzQWRkciwKKyAgICAgICB0QU5JX1UxNiBzdGFEc0Fzc29jSWQsIHRMaW1NbG1TdGFDb250ZXh0IG1sbVN0YUNvbnRleHQsIHRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyAgICB0TGltTWxtRGlzYXNzb2NDbmYgbWxtRGlzYXNzb2NDbmY7CisgICAgdExpbU1sbURlYXV0aENuZiAgIG1sbURlYXV0aENuZjsKKyAgICB0TGltTWxtUHVyZ2VTdGFJbmQgbWxtUHVyZ2VTdGFJbmQ7CisKKyAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSl8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSkKKyAgICB7CisgICAgICAgIC8vIFNldCBCU1NJRCBhdCBDRkcgdG8gbnVsbAorICAgICAgICB0U2lyTWFjQWRkciBudWxsQWRkciA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKyAgICAgICAgI2lmIDAKKyAgICAgICAgaWYgKGNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX0JTU0lELCAodEFOSV9VOCAqKSAmbnVsbEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvLy8gQ291bGQgbm90IHVwZGF0ZSBCU1NJRCBhdCBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHVwZGF0ZSBCU1NJRCBhdCBDRkdcbiIpKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICNlbmRpZi8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICAgICAgCisgICAgICAgIHNpckNvcHlNYWNBZGRyKG51bGxBZGRyLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworICAgICAgICAvLyBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIEpvaW5SZXEgaGVsZCBieQorICAgICAgICAvLyBNTE0gc3RhdGUgbWFjaGluZQorICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBzZXNzaW9uRW50cnktPnBMaW1NbG1Kb2luUmVxKTsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1NbG1Kb2luUmVxID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbUFJRCA9IDA7CisKKworICAgIH0KKworICAgIGlmICgobWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX0hPU1RfRElTQVNTT0MpIHx8CisgICAgICAgIChtbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fTElOS19NT05JVE9SSU5HX0RJU0FTU09DKSB8fAorICAgICAgICAobWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX1BST01JU0NVT1VTX01PREVfRElTQVNTT0MpKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhvc3Qgb3IgTE1NIGRyaXZlbiBEaXNhc3NvY2lhdGlvbi4KKyAgICAgICAgICogSXNzdWUgRGlzYXNzb2MgQ29uZmlybSB0byBTTUUuCisgICAgICAgICAqLworICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJMaW0gUG9zdGluZyBESVNBU1NPQ19DTkYgdG8gU21lLiBUcmlnZ2VyOiAlWFxuIiksIG1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIpOworCisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmbWxtRGlzYXNzb2NDbmYucGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgc3RhRHNBZGRyLAorICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBtbG1EaXNhc3NvY0NuZi5yZXN1bHRDb2RlID0gc3RhdHVzQ29kZTsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICAgICAgbWxtRGlzYXNzb2NDbmYuYWlkICAgICAgICA9IHN0YURzQXNzb2NJZDsKKyNlbmRpZgorICAgICAgICBtbG1EaXNhc3NvY0NuZi5kaXNhc3NvY1RyaWdnZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyOworICAgICAgICAvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJZCovCisgICAgICAgIG1sbURpc2Fzc29jQ25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisgICAgICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9NTE1fRElTQVNTT0NfQ05GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJm1sbURpc2Fzc29jQ25mKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKG1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX0hPU1RfREVBVVRIKSB8fAorICAgICAgICAgICAgIChtbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9MSU5LX01PTklUT1JJTkdfREVBVVRIKSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBIb3N0IG9yIExNTSBkcml2ZW4gRGVhdXRoZW50aWNhdGlvbi4KKyAgICAgICAgICogSXNzdWUgRGVhdXRoIENvbmZpcm0gdG8gU01FLgorICAgICAgICAgKi8KKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiTGltIFBvc3RpbmcgREVBVVRIX0NORiB0byBTbWUuIFRyaWdnZXI6ICVYXG4iKSwgbWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcik7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZtbG1EZWF1dGhDbmYucGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgc3RhRHNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBtbG1EZWF1dGhDbmYucmVzdWx0Q29kZSAgICA9IHN0YXR1c0NvZGU7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgICAgIG1sbURlYXV0aENuZi5haWQgICAgICAgICAgID0gc3RhRHNBc3NvY0lkOworI2VuZGlmCisgICAgICAgIG1sbURlYXV0aENuZi5kZWF1dGhUcmlnZ2VyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcjsKKyAgICAgICAgLyogUEUgc2Vzc2lvbiBJZCAqLworICAgICAgICBtbG1EZWF1dGhDbmYuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKyAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9ERUFVVEhfQ05GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJm1sbURlYXV0aENuZik7CisgICAgfQorICAgIGVsc2UgaWYgKChtbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX1BFRVJfRU5USVRZX0RJU0FTU09DKSB8fAorICAgICAgICAgICAgIChtbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9QRUVSX0VOVElUWV9ERUFVVEgpKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY2VpdmVkIERpc2Fzc29jaWF0aW9uL0RlYXV0aGVudGljYXRpb24gZnJvbSBwZWVyLgorICAgICAgICAgKiBJc3N1ZSBQdXJnZSBJbmQgdG8gU01FLgorICAgICAgICAgKi8KKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiTGltIFBvc3RpbmcgUFVSR0VfU1RBX0lORCB0byBTbWUuIFRyaWdnZXI6ICVYXG4iKSwgbWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcikgOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmbWxtUHVyZ2VTdGFJbmQucGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgc3RhRHNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBtbG1QdXJnZVN0YUluZC5yZWFzb25Db2RlICAgPSAodEFOSV9VOCkgbWxtU3RhQ29udGV4dC5kaXNhc3NvY1JlYXNvbjsKKyAgICAgICAgbWxtUHVyZ2VTdGFJbmQuYWlkICAgICAgICAgID0gc3RhRHNBc3NvY0lkOworICAgICAgICBtbG1QdXJnZVN0YUluZC5wdXJnZVRyaWdnZXIgPSBtbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyOworICAgICAgICBtbG1QdXJnZVN0YUluZC5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworICAgICAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fTUxNX1BVUkdFX1NUQV9JTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmbWxtUHVyZ2VTdGFJbmQpOworICAgIH0KKyAgICBlbHNlIGlmKG1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIgPT0gZUxJTV9KT0lOX0ZBSUxVUkUpCisgICAgeworICAgICAgICAvL1BFIHNldHVwIHRoZSBwZWVyIGVudHJ5IGluIEhXIHVwZnJvbnQsIHJpZ2h0IGFmdGVyIGpvaW4gaXMgY29tcGxldGVkLgorICAgICAgICAvL0lmIHRoZXJlIGlzIGEgZmFpbHVyZSBkdXJpbmcgcmVzdCBvZiB0aGUgYXNzb2Mgc2VxdWVuY2UsIHRoaXMgY29udGV4dCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLgorICAgICAgICB0QU5JX1U4ICAgICAgICAgc21lc2Vzc2lvbklkOworICAgICAgICB0QU5JX1UxNiAgICAgICAgc21ldHJhbnNhY3Rpb25JZDsKKworICAgICAgICBzbWVzZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisgICAgICAgIHNtZXRyYW5zYWN0aW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkOworCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcSk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxID0gTlVMTDsKKworICAgICAgICBpZihtbG1TdGFDb250ZXh0LnJlc3VsdENvZGUgIT0gZVNJUl9TTUVfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcGVEZWxldGVTZXNzaW9uKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKyAgICAgICAgfSAKKyAgICAgICAgCisgICAgICAgIGxpbVNlbmRTbWVKb2luUmVhc3NvY1JzcChwTWFjLCBlV05JX1NNRV9KT0lOX1JTUCwgbWxtU3RhQ29udGV4dC5yZXN1bHRDb2RlLCBtbG1TdGFDb250ZXh0LnByb3RTdGF0dXNDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeSwgc21lc2Vzc2lvbklkLCBzbWV0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgCisgICAgfSAKKworICAgIGlmKChOVUxMICE9IHBzZXNzaW9uRW50cnkpCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAmJiAoZUxJTV9BUF9ST0xFICE9IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgKQorI2VuZGlmICAgICAKKyAgICApICAgICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGVEZWxldGVTZXNzaW9uKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeSA9IE5VTEw7CisgICAgICAgICAgICB9Cit9CisKKy8qKgorICogbGltUmVqZWN0QXNzb2NpYXRpb24oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBSZS9Bc3NvY2lhdGlvbiBSZXF1ZXN0IG5lZWQKKyAqIHRvIGJlIHJlamVjdGVkIGR1ZSB0byBmYWlsdXJlIGluIGFzc2lnbmluZyBhbiBBSUQgb3IgZmFpbHVyZQorICogaW4gYWRkaW5nIFNUQSBjb250ZXh0IGF0IFBvbGFyaXMgb3IgcmVqZWN0IGJ5IGFwcGxpY2F0aW9ucy4KKyAqCisgKkxPR0lDOgorICogUmVzb3VyY2VzIGFsbG9jYXRlZCBpZiBhbnkgYXJlIGZyZWVkdXAgYW5kIChSZSkgQXNzb2NpYXRpb24KKyAqIFJlc3BvbnNlIGZyYW1lIGlzIHNlbnQgdG8gcmVxdWVzdGluZyBTVEEuIFByZS1BdXRoIGNvbnRleHQKKyAqIHdpbGwgYmUgYWRkZWQgZm9yIHRoaXMgU1RBIGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gICpwQmQgICAgLSBBIHBvaW50ZXIgdG8gQnVmZmVyIGRlc2NyaXB0b3IgKyBhc3NvY2lhdGVkIFBEVXMKKyAqIEBwYXJhbSAgc3ViVHlwZSAtIEluZGljYXRlcyB3aGV0aGVyIGl0IGlzIEFzc29jaWF0aW9uIFJlcXVlc3QgKD0wKSBvcgorICogICAgICAgICAgICAgICAgICAgUmVhc3NvY2lhdGlvbiBSZXF1ZXN0ICg9MSkgZnJhbWUKKyAqIEBwYXJhbSAgYWRkUHJlQXV0aENvbnRleHQgLSBJbmRpY2F0ZXMgd2hldGhlciBwcmUtYXV0aCBjb250ZXh0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgYWRkZWQgZm9yIHRoaXMgU1RBCisgKiBAcGFyYW0gIGF1dGhUeXBlIC0gSW5kaWNhdGVzIGF1dGggdHlwZSB0byBiZSBhZGRlZAorICogQHBhcmFtICBzdGFJZCAgICAtIEluZGljYXRlcyBzdGFJZCBvZiB0aGUgU1RBIGJlaW5nIHJlamVjdGVkCisgKiAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRpb24KKyAqIEBwYXJhbSAgZGVsZXRlU3RhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGVsZXRlIFNUQSBjb250ZXh0CisgKiAgICAgICAgICAgICAgICAgICAgIGF0IFBvbGFyaXMKKyAqIEBwYXJhbSAgckNvZGUgICAgLSBJbmRpY2F0ZXMgd2hhdCByZWFzb25Db2RlIHRvIGJlIHNlbnQgaW4KKyAqICAgICAgICAgICAgICAgICAgICBSZS9Bc3NvYyByZXNwb25zZSB0byBTVEEKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1SZWplY3RBc3NvY2lhdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyQWRkciwgdEFOSV9VOCBzdWJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBhZGRQcmVBdXRoQ29udGV4dCwgdEFuaUF1dGhUeXBlIGF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgc3RhSWQsIHRBTklfVTggZGVsZXRlU3RhLCB0U2lyUmVzdWx0Q29kZXMgckNvZGUsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgKQoreworICAgIHRwRHBoSGFzaE5vZGUgICAgICAgcFN0YURzOworCisgICAgaWYgKGFkZFByZUF1dGhDb250ZXh0KQorICAgIHsKKyAgICAgICAgLy8gQ3JlYXRlIGVudHJ5IGZvciB0aGlzIFNUQSBpbiBwcmUtYXV0aCBsaXN0CisgICAgICAgIHN0cnVjdCB0TGltUHJlQXV0aE5vZGUgKnBBdXRoTm9kZTsKKworICAgICAgICBwQXV0aE5vZGUgPSBsaW1BY3F1aXJlRnJlZVByZUF1dGhOb2RlKHBNYWMsICZwTWFjLT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlKTsKKworICAgICAgICBpZiAocEF1dGhOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQXV0aE5vZGUtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgICAgICBwQXV0aE5vZGUtPmZUaW1lclN0YXJ0ZWQgPSAwOworICAgICAgICAgICAgcEF1dGhOb2RlLT5tbG1TdGF0ZSA9IGVMSU1fTUxNX0FVVEhFTlRJQ0FURURfU1RBVEU7CisgICAgICAgICAgICBwQXV0aE5vZGUtPmF1dGhUeXBlID0gKHRBbmlBdXRoVHlwZSkgYXV0aFR5cGU7CisgICAgICAgICAgICBsaW1BZGRQcmVBdXRoTm9kZShwTWFjLCBwQXV0aE5vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRlbGV0ZVN0YSA9PSB0cnVlKQorICAgIHsKKyAgICAgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIHN0YUlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisKKyAgICAgICAgaWYgKHBTdGFEcyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgICAgICBGTCgiTm8gU1RBIGNvbnRleHQsIHlldCByZWplY3RpbmcgQXNzb2NpYXRpb25cbiIpKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBvbGFyaXMgaGFzIHN0YXRlIGZvciB0aGlzIFNUQS4KKyAgICAgICAgICogVHJpZ2dlciBjbGVhbnVwLgorICAgICAgICAgKi8KKyAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID0gZUxJTV9SRUFTU09DX1JFSkVDVDsKKworICAgICAgICAvLyBSZWNlaXZlIHBhdGggY2xlYW51cAorICAgICAgICBsaW1DbGVhbnVwUnhQYXRoKHBNYWMsIHBTdGFEcywgcHNlc3Npb25FbnRyeSk7CisgICAKKyAgICAgICAgLy8gU2VuZCBSZS9Bc3NvY2lhdGlvbiBSZXNwb25zZSB3aXRoCisgICAgICAgIC8vIHN0YXR1cyBjb2RlIHRvIHJlcXVlc3RpbmcgU1RBLgorICAgICAgICBsaW1TZW5kQXNzb2NSc3BNZ210RnJhbWUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgMCxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICBpZiAoIHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGFEcy0+YXNzb2NJZF0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXNzb2N0aW9uIGNvbmZpcm1hdGlvbiBpcyBjb21wbGV0ZSwgZnJlZSB0aGUgY29weSBvZiBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lCisgICAgICAgICAgICBpZiAoICgodHBTaXJBc3NvY1JlcSkocHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSkpLT5hc3NvY1JlcUZyYW1lKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsKCh0cFNpckFzc29jUmVxKShwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcVtwU3RhRHMtPmFzc29jSWRdKSktPmFzc29jUmVxRnJhbWUpOworICAgICAgICAgICAgICAgICgodHBTaXJBc3NvY1JlcSkocHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSkpLT5hc3NvY1JlcUZyYW1lID0gTlVMTDsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSk7ICAgIAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19NQVhfQVNTT0NfU1RBX1JFQUNIRURfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgMCxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICBGTCgicmVjZWl2ZWQgUmUvQXNzb2MgcmVxIHdoZW4gbWF4IGFzc29jaWF0ZWQgU1RBcyByZWFjaGVkIGZyb20gXG4iKSk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwZWVyQWRkciwgTE9HVyk7CisgICAgICAgIGxpbVNlbmRTbWVNYXhBc3NvY0V4Y2VlZGVkTnRmKHBNYWMsIHBlZXJBZGRyLCBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQpOworICAgIH0KK30gLyoqKiBlbmQgbGltUmVqZWN0QXNzb2NpYXRpb24oKSAqKiovCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltRGVjaWRlQXBQcm90ZWN0aW9uT25IdDIwRGVsZXRlCitcYnJpZWYgcHJvdGVjdGlvbiByZWxhdGVkIGZ1bmN0aW9uIHdoaWxlIEhUMjAgc3RhdGlvbiBpcyBnZXR0aW5nIGRlbGV0ZWQuCitccGFyYW0gICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gICAgICB0cERwaEhhc2hOb2RlIHBTdGFEcworXHBhcmFtICAgICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcworXHJldHVybiAgICAgIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZAorbGltRGVjaWRlQXBQcm90ZWN0aW9uT25IdDIwRGVsZXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgIFBFTE9HMSggbGltTG9nKHBNYWMsIExPRzEsIEZMKCIoJWQpIEEgSFQgMjAgU1RBIGlzIGRpc2Fzc29jaWF0ZWQuIEFkZHIgaXMgIiksCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1IdDIwUGFyYW1zLm51bVN0YSk7CisgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgTE9HMSk7KQorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5udW1TdGEgPiAwKQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8TElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hY3RpdmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5zdGFBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1IdDIwUGFyYW1zLm51bVN0YS0tOworICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5udW1TdGEgPT0gMCkKKyAgICB7CisgICAgICAgIC8vIGRpc2FibGUgcHJvdGVjdGlvbgorICAgICAgICBsaW1FbmFibGVIVDIwUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgfQorfQorLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1EZWNpZGVBcFByb3RlY3Rpb25PbkRlbGV0ZQorXGJyaWVmIERlY2lkZXMgYWJvdXQgcHJvdGVjdGlvbiByZWxhdGVkIHNldHRpbmdzIHdoZW4gYSBzdGF0aW9uIGlzIGdldHRpbmcgZGVsZXRlZC4KK1xwYXJhbSAgICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xwYXJhbSAgICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzCitccGFyYW0gICAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zCitccmV0dXJuICAgICAgTm9uZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQKK2xpbURlY2lkZUFwUHJvdGVjdGlvbk9uRGVsZXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UzMiBwaHlNb2RlOworICAgIHRIYWxCaXRWYWwgZXJwRW5hYmxlZCA9IGVIQUxfQ0xFQVI7CisgICAgdFNpclJGQmFuZCByZkJhbmQgPSBTSVJfQkFORF9VTktOT1dOOworICAgIHRBTklfVTMyIGk7ICAgIAorICAgIAorICAgIGlmKE5VTEwgPT0gcFN0YURzKQorICAgICAgcmV0dXJuOworCisgICAgbGltR2V0UmZCYW5kKHBNYWMsICZyZkJhbmQsIHBzZXNzaW9uRW50cnkpOworICAgIGlmKFNJUl9CQU5EXzVfR0haID09IHJmQmFuZCkKKyAgICB7CisgICAgICAgIC8vd2UgYXJlIEhULiBpZiB3ZSBhcmUgMTFBLCB0aGVuIHByb3RlY3Rpb24gaXMgbm90IHJlcXVpcmVkLgorICAgICAgICBpZih0cnVlID09IHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSkKKyAgICAgICAgeworICAgICAgICAgICAgLy93ZSBhcmUgSFQgYW5kIDExQSBzdGF0aW9uIGlzIGxlYXZpbmcuCisgICAgICAgICAgICAvL3Byb3RlY3Rpb24gY29uc2lkZXJhdGlvbiByZXF1aXJlZC4KKyAgICAgICAgICAgIC8vSFQgc3RhdGlvbiBsZWF2aW5nID09PiB0aGlzIGNhc2UgaXMgY29tbW9ubHkgaGFuZGxlZCBiZXR3ZWVuIGJvdGggdGhlIGJhbmRzIGJlbG93LgorICAgICAgICAgICAgaWYoKHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGFDb2V4aXN0KSAmJiAKKyAgICAgICAgICAgICAgKGZhbHNlID09IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIiglZCkgQSAxMUEgU1RBIGlzIGRpc2Fzc29jaWF0ZWQuIEFkZHIgaXMgIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW0xMWFQYXJhbXMubnVtU3RhKTsKKyAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcFN0YURzLT5zdGFBZGRyLCBMT0cxKTspCisgICAgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmdMaW0xMWFQYXJhbXMubnVtU3RhID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCxwc2Vzc2lvbkVudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+c3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltMTFhUGFyYW1zLm51bVN0YS0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmdMaW0xMWFQYXJhbXMubnVtU3RhID09IDApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBwcm90ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlMTFhUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoU0lSX0JBTkRfMl80X0dIWiA9PSByZkJhbmQpCisgICAgeworICAgICAgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICBlcnBFbmFibGVkID0gcFN0YURzLT5lcnBFbmFibGVkOworICAgICAgICAvL3dlIGFyZSBIVCBvciAxMUcgYW5kIDExQiBzdGF0aW9uIGlzIGdldHRpbmcgZGVsZXRlZC4KKyAgICAgICAgaWYgKCgocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykgfHwKKyAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KSAmJgorICAgICAgICAgICAgICAoZXJwRW5hYmxlZCA9PSBlSEFMX0NMRUFSKSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiKCVkKSBBIGxlZ2FjeSBTVEEgaXMgZGlzYXNzb2NpYXRlZC4gQWRkciBpcyAiKSwKKyAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltMTFiUGFyYW1zLm51bVN0YSk7CisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcFN0YURzLT5zdGFBZGRyLCBMT0cxKTspCisgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5udW1TdGEgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMubnVtU3RhLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5udW1TdGEgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJObyAxMUIgU1RBIGV4aXN0c1xuIikpOykKKyAgICAgICAgICAgICAgICBsaW1FbmFibGUxMWdQcm90ZWN0aW9uKHBNYWMsIGZhbHNlLCBmYWxzZSwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyhub24tMTFCIHN0YXRpb24gaXMgbGVhdmluZykgb3IgKHdlIGFyZSBub3QgMTFHIG9yIEhUIEFQKQorICAgICAgICBlbHNlIGlmKHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSkKKyAgICAgICAgeyAvL3dlIGFyZSBIVCBBUCBhbmQgbm9uLTExQiBzdGF0aW9uIGlzIGxlYXZpbmcuCisKKyAgICAgICAgICAgIC8vMTFnIHN0YXRpb24gaXMgbGVhdmluZyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIXBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiKCVkKSBBIDExZyBTVEEgaXMgZGlzYXNzb2NpYXRlZC4gQWRkciBpcyAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5udW1TdGEpOworICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIExPRzEpOykKKyAgICAgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+Z0xpbTExZ1BhcmFtcy5udW1TdGEgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8TElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hY3RpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5zdGFBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMubnVtU3RhLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMubnVtU3RhID09IDApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBwcm90ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRQcm90ZWN0aW9uRnJvbTExZyhwTWFjLCBmYWxzZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vTFNJRyBUWE9QIG5vdCBzdXBwb3J0aW5nIHN0YWl0b24gbGVhdmluZy4gYXBwbGllcyB0byAyLjQgYXMgd2VsbCBhcyA1IEdIWi4KKyAgICBpZigodHJ1ZSA9PSBwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkpICYmCisgICAgICAgICh0cnVlID09IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpKQorICAgIHsKKyAgICAgICAgLy9IVCBub24tR0YgbGVhdmluZworICAgICAgICBpZighcFN0YURzLT5odEdyZWVuZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIiglZCkgQSBub24tR0YgU1RBIGlzIGRpc2Fzc29jaWF0ZWQuIEFkZHIgaXMgIiksCisgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU5vbkdmUGFyYW1zLm51bVN0YSk7CisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcFN0YURzLT5zdGFBZGRyLCBMT0cxKTspCisgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+Z0xpbU5vbkdmUGFyYW1zLm51bVN0YSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8TElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQscHNlc3Npb25FbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+c3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU5vbkdmUGFyYW1zLm51bVN0YS0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmdMaW1Ob25HZlBhcmFtcy5udW1TdGEgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICBsaW1FbmFibGVIVE5vbkdmUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9IVCAyME1oeiBzdGF0aW9uIGxlYXZpbmcuCisgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdCAmJgorICAgICAgICAgICAgICAgIChlSFRfQ0hBTk5FTF9XSURUSF8yME1IWiA9PSBwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltRGVjaWRlQXBQcm90ZWN0aW9uT25IdDIwRGVsZXRlKHBNYWMsIHBTdGFEcywgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgJiYKKyAgICAgICAgICAgICAgICAoZmFsc2UgPT0gcFN0YURzLT5odExzaWdUWE9QUHJvdGVjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgUEVMT0cxKCBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIiglZCkgQSBIVCBMU0lHIG5vdCBzdXBwb3J0aW5nIFNUQSBpcyBkaXNhc3NvY2lhdGVkLiBBZGRyIGlzICIpLAorICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1Mc2lnVHhvcFBhcmFtcy5udW1TdGEpOworICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgTE9HMSk7KQorICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmdMaW1Mc2lnVHhvcFBhcmFtcy5udW1TdGEgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1Mc2lnVHhvcFBhcmFtcy5udW1TdGEtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5nTGltTHNpZ1R4b3BQYXJhbXMubnVtU3RhID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBwcm90ZWN0aW9uCisgICAgICAgICAgICAgICAgbGltRW5hYmxlSFRMc2lnVHhvcFByb3RlY3Rpb24ocE1hYywgdHJ1ZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgCisgICAgfQorfQorCisjZW5kaWYKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbURlY2lkZVNob3J0UHJlYW1ibGUKK1xicmllZiBEZWNpZGVzIGFib3V0IGFueSBzaG9ydCBwcmVhbWJsZSByZWF0ZWQgY2hhbmdlIGJlY2F1c2Ugb2YgbmV3IHN0YXRpb24gam9pbmluZy4KK1xwYXJhbSAgICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xwYXJhbSAgICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzCitccGFyYW0gICAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zCitccmV0dXJuICAgICAgTm9uZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltRGVjaWRlU2hvcnRQcmVhbWJsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICB0cERwaEhhc2hOb2RlIHBTdGFEcywgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSApCit7CisgICB0QU5JX1UzMiBpOworCisgICBpZiAocFN0YURzLT5zaG9ydFByZWFtYmxlRW5hYmxlZCA9PSBlSEFMX0NMRUFSKQorICAgeworICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiKCVkKSBBIG5vbi1zaG9ydCBwcmVhbWJsZSBTVEEgaXMgZGlzYXNzb2NpYXRlZC4gQWRkciBpcyAiKSwKKyAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltTm9TaG9ydFBhcmFtcy5udW1Ob25TaG9ydFByZWFtYmxlU3RhKTsKKyAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIExPRzEpOykKKyAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5nTGltTm9TaG9ydFBhcmFtcy5udW1Ob25TaG9ydFByZWFtYmxlU3RhID4gMCkKKyAgICAgIHsKKyAgICAgICAgICBmb3IgKGk9MDsgaTxMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+Z0xpbU5vU2hvcnRQYXJhbXMuc3RhTm9TaG9ydENhY2hlW2ldLmFjdGl2ZSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5nTGltTm9TaG9ydFBhcmFtcy5zdGFOb1Nob3J0Q2FjaGVbaV0uYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5zdGFBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLm51bU5vblNob3J0UHJlYW1ibGVTdGEtLTsKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU5vU2hvcnRQYXJhbXMuc3RhTm9TaG9ydENhY2hlW2ldLmFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLm51bU5vblNob3J0UHJlYW1ibGVTdGEgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgIC8vIGVuYWJsZSBzaG9ydCBwcmVhbWJsZQorICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiQWxsIGFzc29jaWF0ZWQgU1RBcyBoYXZlIHNob3J0IHByZWFtYmxlIHN1cHBvcnQgbm93LlxuIikpOykKKyAgICAgICAgIC8vcmVzZXQgdGhlIGNhY2hlCisgICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSZwc2Vzc2lvbkVudHJ5LT5nTGltTm9TaG9ydFBhcmFtcyAsIHNpemVvZih0TGltTm9TaG9ydFBhcmFtcykpOworICAgICAgICAgaWYgKGxpbUVuYWJsZVNob3J0UHJlYW1ibGUocE1hYywgdHJ1ZSwgcEJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBlbmFibGUgc2hvcnQgcHJlYW1ibGVcbiIpKTspCisgICAgICB9CisgICB9Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltRGVjaWRlU2hvcnRTbG90CitcYnJpZWYgRGVjaWRlcyBhYm91dCBhbnkgc2hvcnQgc2xvdCB0aW1lIHJlbGF0ZWQgY2hhbmdlIGJlY2F1c2Ugb2Ygc3RhdGlvbiBsZWF2aW5nIHRoZSBCU1MuCitccGFyYW0gICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gICAgICB0cERwaEhhc2hOb2RlIHBTdGFEcworXHJldHVybiAgICAgIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQKK2xpbURlY2lkZVNob3J0U2xvdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywgIAorICAgICAgICAgICAgICAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgIHRBTklfVTMyIGksIHZhbDsKKyAgaWYgKHBTdGFEcy0+c2hvcnRTbG90VGltZUVuYWJsZWQgPT0gZUhBTF9DTEVBUikKKyAgeworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIiglZCkgQSBub24tc2hvcnQgc2xvdHRpbWUgU1RBIGlzIGRpc2Fzc29jaWF0ZWQuIEFkZHIgaXMgIiksCisgICAgICAgcE1hYy0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5udW1Ob25TaG9ydFNsb3RTdGEpOworICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIExPRzEpOykKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICkgJiYKKyAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltTm9TaG9ydFNsb3RQYXJhbXMubnVtTm9uU2hvcnRTbG90U3RhPiAwKQorICAgICAgIHsKKyAgICAgICAgICBmb3IgKGk9MDsgaTxMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+Z0xpbU5vU2hvcnRTbG90UGFyYW1zLnN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWN0aXZlKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5zdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFkZHIsCisgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+c3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5udW1Ob25TaG9ydFNsb3RTdGEtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5zdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBlbHNlIAorI2VuZGlmCisgICAgICAgeworICAgICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5udW1Ob25TaG9ydFNsb3RTdGE+IDApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICBmb3IgKGk9MDsgaTxMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLnN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWN0aXZlKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLnN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTm9TaG9ydFNsb3RQYXJhbXMubnVtTm9uU2hvcnRTbG90U3RhLS07CisgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5zdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICB3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHXzExR19TSE9SVF9TTE9UX1RJTUVfRU5BQkxFRCwgJnZhbCk7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICBpZiAoIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSApICYmCisgICAgICAgICAodmFsICYmIHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5udW1Ob25TaG9ydFNsb3RTdGEgPT0gMCkpCisgICAgICB7CisgICAgICAgICAvLyBlbmFibGUgc2hvcnQgc2xvdCB0aW1lCisgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJBbGwgYXNzb2NpYXRlZCBTVEFzIGhhdmUgc2hvcnQgc2xvdCB0aW1lIHN1cHBvcnQgbm93LlxuIikpOykKKyAgICAgICAgIC8vcmVzZXQgdGhlIGNhY2hlCisgICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSZwc2Vzc2lvbkVudHJ5LT5nTGltTm9TaG9ydFNsb3RQYXJhbXMgLCBzaXplb2YodExpbU5vU2hvcnRTbG90UGFyYW1zKSk7CisgICAgICAgICAvLyBpbiBjYXNlIG9mIEFQIHNldCBTSE9SVF9TTE9UX1RJTUUgdG8gZW5hYmxlCisgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgICB7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5mU2hvcnRTbG90VGltZSA9IHRydWU7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9TSE9SVF9TTE9UX1RJTUVfQ0hBTkdFRDsKKworICAgICAgICAgICAgaWYgKGNmZ1NldEludChwTWFjLCAgV05JX0NGR19TSE9SVF9TTE9UX1RJTUUsICB0cnVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCAgRkwoImNvdWxkIG5vdCB1cGRhdGUgc2hvcnQgc2xvdCB0aW1lIGF0IENGR1xuIikpOykKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgIGlmICh2YWwgJiYgcE1hYy0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5udW1Ob25TaG9ydFNsb3RTdGEgPT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGVuYWJsZSBzaG9ydCBzbG90IHRpbWUKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkFsbCBhc3NvY2lhdGVkIFNUQXMgaGF2ZSBzaG9ydCBzbG90IHRpbWUgc3VwcG9ydCBub3cuXG4iKSk7KQorICAgICAgICAgICAgLy9yZXNldCB0aGUgY2FjaGUKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopJnBNYWMtPmxpbS5nTGltTm9TaG9ydFNsb3RQYXJhbXMgLCBzaXplb2YodExpbU5vU2hvcnRTbG90UGFyYW1zKSk7CisgICAgICAgICAgICAvLyBpbiBjYXNlIG9mIEFQIHNldCBTSE9SVF9TTE9UX1RJTUUgdG8gZW5hYmxlCisgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5mU2hvcnRTbG90VGltZSA9IHRydWU7CisgICAgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9TSE9SVF9TTE9UX1RJTUVfQ0hBTkdFRDsKKworICAgICAgICAgICAgICAgaWYgKGNmZ1NldEludChwTWFjLCAgV05JX0NGR19TSE9SVF9TTE9UX1RJTUUsICB0cnVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICBGTCgiY291bGQgbm90IHVwZGF0ZSBzaG9ydCBzbG90IHRpbWUgYXQgQ0ZHXG4iKSk7KQorICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgfQorICAgfQorfQorCisvKioKKyAqIGxpbVJlc3RvcmVQcmVSZWFzc29jU3RhdGUoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBTVEEgcm9sZSB3aGVuZXZlciBSZWFzb2NpYXRpb24KKyAqIFJlc3BvbnNlIHdpdGggYSByZWplY3QgY29kZSBpcyByZWNlaXZlZCBmcm9tIEFQLgorICoKKyAqTE9HSUM6CisgKiBSZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIgaXMgc3RvcHBlZCwgT2xkIChvciBjdXJyZW50KSBBUCdzCisgKiBjb250ZXh0IGlzIHJlc3RvcmVkIGJvdGggYXQgUG9sYXJpcyAmIHNvZnR3YXJlCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICByZXN1bHRDb2RlIC0gUmVzdWx0IGNvZGUgdGhhdCBzcGVjaWZpZXMgd2h5IFJlYXNzb2NpYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcCBmYWlsZWQKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1SZXN0b3JlUHJlUmVhc3NvY1N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiBwcm90U3RhdHVzQ29kZSx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICBjaGFuTnVtOworICAgIHRMaW1NbG1SZWFzc29jQ25mICAgbWxtUmVhc3NvY0NuZjsKKworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkpOworICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURTsKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKTsKKworICAgIC8vICdDaGFuZ2UnIHRpbWVyIGZvciBmdXR1cmUgYWN0aXZhdGlvbnMKKyAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9SRUFTU09DX0ZBSUxfVElNRVIpOworCisgICAgLy8gVXBkYXRlIEJTU0lEIGF0IENGRyBkYXRhYmFzZQorICAgICNpZiAwCisgICAgaWYgKGNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX0JTU0lELAorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DdXJyZW50QnNzSWQsCisgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IHVwZGF0ZSBCU1NJRCBhdCBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgdXBkYXRlIEJTU0lEIGF0IENGR1xuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgICNlbmRpZgorCisgICAvLyBjaGFuTnVtID0gcE1hYy0+bGltLmdMaW1DdXJyZW50Q2hhbm5lbElkOworCisgICAvKiAgVG8gc3VwcG9ydCBCVC1BTVAgKi8KKyAgIGNoYW5OdW0gPSBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWw7CisKKyAgICBsaW1TZXRDaGFubmVsKHBNYWMsIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRUaXRhbkh0Q2FwcywgY2hhbk51bSwgcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworCisgICAgLyoqIEBUb0RvIDogTmVlZCB0byBJbnRlZ3JhdGUgdGhlIFNUT1AgdGhlIERhdGFUcmFuc2ZlciB0byB0aGUgQVAgZnJvbSAxMUggY29kZSAqLworCisgICAgbWxtUmVhc3NvY0NuZi5yZXN1bHRDb2RlID0gcmVzdWx0Q29kZTsKKyAgICBtbG1SZWFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gcHJvdFN0YXR1c0NvZGU7CisgICAgLyogVXBkYXRlIFBFIHNlc3Npb24gSWQgKi8KKyAgICBtbG1SZWFzc29jQ25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9SRUFTU09DX0NORiwKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJm1sbVJlYXNzb2NDbmYpOworfSAvKioqIGVuZCBsaW1SZXN0b3JlUHJlUmVhc3NvY1N0YXRlKCkgKioqLworCisKKworLyoqCisgKiBsaW1Jc1JlYXNzb2NJblByb2dyZXNzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VlIGlmIFNUQSBpcyBpbiB3dC1yZWFzc29jLXJzcCBzdGF0ZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFICBXaGVuIFNUQSBpcyB3YWl0aW5nIGZvciBSZWFzc29jIHJlc3BvbnNlIGZyb20gQVAgXG4KKyAqICAgICAgICAgZWxzZSBlQU5JX0JPT0xFQU5fRkFMU0UKKyAqLworCitlQW5pQm9vbGVhbgorbGltSXNSZWFzc29jSW5Qcm9ncmVzcyh0cEFuaVNpckdsb2JhbCBwTWFjLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgaWYoKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpIHx8IChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSkmJgorICAgICAgICAgICAgKChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFKSB8fCAKKyAgICAgICAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9XVF9SRUFTU09DX0xJTktfRkFJTF9TVEFURSkpKQorICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIAorICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7Cit9IC8qKiogZW5kIGxpbUlzUmVhc3NvY0luUHJvZ3Jlc3MoKSAqKiovCisKKworCisvKioKKyAqIGxpbVBvcHVsYXRlT3duUmF0ZVNldAorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc0Fzc29jUnNwKCkgb3IKKyAqIGxpbUFkZFN0YUluSUJTUygpCisgKiAtIEl0IGNyZWF0ZXMgYSBjb21iaW5lZCByYXRlIHNldCBvZiAxMiByYXRlcyBtYXggd2hpY2gKKyAqICAgY29tcHJpc2VzIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgcmF0ZXMgcmVhZCBmcm9tIENGRworICogLSBJdCBzb3J0cyB0aGUgY29tYmluZWQgcmF0ZSBTZXQgYW5kIGNvcHkgaXQgaW4gdGhlCisgKiAgIHJhdGUgYXJyYXkgb2YgdGhlIHBTVEEgZGVzY3JpcHRvcgorICogLSBJdCBzZXRzIHRoZSBlcnBFbmFibGVkIGJpdCBvZiB0aGUgU1RBIGRlc2NyaXB0b3IKKyAqCisgKiBOT1RFOgorICogRVJQIGJpdCBpcyBzZXQgaWZmIHRoZSBkcGggUEhZIG1vZGUgaXMgMTFHIGFuZCB0aGVyZSBpcyBhdCBsZWFzdAorICogYW4gQSByYXRlIGluIHRoZSBzdXBwb3J0ZWQgb3IgZXh0ZW5kZWQgcmF0ZSBzZXRzCisgKgorICogQHBhcmFtICBwTWFjICAgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGJhc2ljT25seSAtIFdoZW4gcGFzc2VkIHZhbHVlIGlzIHRydWUsIG9ubHkgYmFzaWMKKyAqICAgICAgICAgICAgICAgICAgICAgcmF0ZXMgYXJlIGNvcGllZCB0byBEUEggbm9kZSBlbHNlCisgKiAgICAgICAgICAgICAgICAgICAgIGFsbCBzdXBwb3J0ZWQgcmF0ZXMgYXJlIGNvcGllZAorICogQHJldHVybiBlU0lSX1NVQ0NFU1Mgb3IgZVNJUl9GQUlMVVJFCisgKgorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbVBvcHVsYXRlT3duUmF0ZVNldCh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgIHRwU2lyU3VwcG9ydGVkUmF0ZXMgcFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTgqIHBTdXBwb3J0ZWRNQ1NTZXQsCisgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBiYXNpY09ubHksCisgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgICB0ZW1wUmF0ZVNldDsKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgICB0ZW1wUmF0ZVNldDI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICBpLGosdmFsLG1pbixpc0FyYXRlOworICAgIHRBTklfVTMyIHBoeU1vZGUgPSAwOworCisgICAgaXNBcmF0ZSA9IDA7CisKKyAgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgIC8vIEdldCBvd24gcmF0ZSBzZXQKKyAgICAjaWYgMAorICAgIHZhbCA9IFdOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOOworICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX09QRVJBVElPTkFMX1JBVEVfU0VULAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnRlbXBSYXRlU2V0LnJhdGUsCisgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCByYXRlc2V0IGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIHJhdGVzZXRcbiIpKTsKKyAgICB9CisgICAgI2VuZGlmIC8vIFRPIFNVUFBPUlQgQlQtQU1QCisgICAgCisgICAgLyogY29weSBvcGVyYXRpb25hbCByYXRlIHNldCBmcm9tIHBzZXNzaW9uRW50cnkgKi8KKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHRBTklfVTggKil0ZW1wUmF0ZVNldC5yYXRlLCh0QU5JX1U4KikocHNlc3Npb25FbnRyeS0+cmF0ZVNldC5yYXRlKSwgcHNlc3Npb25FbnRyeS0+cmF0ZVNldC5udW1SYXRlcyk7CisgICAgdGVtcFJhdGVTZXQubnVtUmF0ZXMgPSBwc2Vzc2lvbkVudHJ5LT5yYXRlU2V0Lm51bVJhdGVzOworCisgICAgaWYgKHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpCisgICAgeworCisgICAgICAgIC8vIGdldCBvd24gZXh0ZW5kZWQgcmF0ZSBzZXQKKyAgICAgICAgI2lmIDAKKyAgICAgICAgdmFsID0gV05JX0NGR19FWFRFTkRFRF9PUEVSQVRJT05BTF9SQVRFX1NFVF9MRU47CisgICAgICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VULAorICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZ0ZW1wUmF0ZVNldDIucmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgZ2V0IGV4dGVuZGVkIHJhdGVzZXQgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIGV4dGVuZGVkIHJhdGVzZXRcbiIpKTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wUmF0ZVNldDIubnVtUmF0ZXMgPSAodEFOSV9VOCkgdmFsOworICAgICAgICAjZW5kaWYKKworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHRBTklfVTggKil0ZW1wUmF0ZVNldDIucmF0ZSwgKHRBTklfVTgqKShwc2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0LnJhdGUpLCBwc2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0Lm51bVJhdGVzKTsKKyAgICAgICAgdGVtcFJhdGVTZXQyLm51bVJhdGVzID0gcHNlc3Npb25FbnRyeS0+ZXh0UmF0ZVNldC5udW1SYXRlczsKKworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHRlbXBSYXRlU2V0Mi5udW1SYXRlcyA9IDA7CisKKworICAgIGlmICgodGVtcFJhdGVTZXQubnVtUmF0ZXMgKyB0ZW1wUmF0ZVNldDIubnVtUmF0ZXMpID4gMTIpCisgICAgeworICAgICAgICAvL3dlIGFyZSBpbiBiaWcgdHJvdWJsZQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIm1vcmUgdGhhbiAxMiByYXRlcyBpbiBDRkdcbiIpKTsKKyAgICAgICAgLy9wYW5pYworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworCisgICAgLy9jb3B5IGFsbCByYXRlcyBpbiB0ZW1wUmF0ZVNldCwgdGhlcmUgYXJlIDEyIHJhdGVzIG1heAorICAgIGZvciAoaSA9IDA7aSA8IHRlbXBSYXRlU2V0Mi5udW1SYXRlczsgaSsrKQorICAgICAgdGVtcFJhdGVTZXQucmF0ZVtpICsgdGVtcFJhdGVTZXQubnVtUmF0ZXNdID0gdGVtcFJhdGVTZXQyLnJhdGVbaV07CisgICAgdGVtcFJhdGVTZXQubnVtUmF0ZXMgKz0gdGVtcFJhdGVTZXQyLm51bVJhdGVzOworCisgICAgLyoqCisgICAgICogU29ydCByYXRlcyBpbiB0ZW1wUmF0ZVNldCAodGhleSBhcmUgbGlrZWx5IHRvIGJlIGFscmVhZHkgc29ydGVkKQorICAgICAqIHB1dCB0aGUgcmVzdWx0IGluIHBTdXBwb3J0ZWRSYXRlcworICAgICAqLworICAgIHsKKyAgICAgICAgdEFOSV9VOCBhUmF0ZUluZGV4ID0gMDsKKyAgICAgICAgdEFOSV9VOCBiUmF0ZUluZGV4ID0gMDsKKworICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwUmF0ZXMsIHNpemVvZih0U2lyU3VwcG9ydGVkUmF0ZXMpKTsKKyAgICAgICAgZm9yKGkgPSAwO2kgPCB0ZW1wUmF0ZVNldC5udW1SYXRlczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBtaW4gPSAwOworICAgICAgICAgICAgdmFsID0gMHhmZjsKKyAgICAgICAgICAgIGlzQXJhdGUgPSAwOworICAgICAgICAgICAgZm9yKGogPSAwO2ogPCB0ZW1wUmF0ZVNldC5udW1SYXRlczsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodEFOSV9VMzIpICh0ZW1wUmF0ZVNldC5yYXRlW2pdICYgMHg3ZikgPCB2YWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGVtcFJhdGVTZXQucmF0ZVtqXSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgICAgICBtaW4gPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpcklzQXJhdGUodGVtcFJhdGVTZXQucmF0ZVttaW5dICYgMHg3ZikpCisgICAgICAgICAgICAgICAgaXNBcmF0ZSA9IDE7CisKKyAgICAvKgorICAgICogSEFMIG5lZWRzIHRvIGtub3cgd2hldGhlciB0aGUgcmF0ZSBpcyBiYXNpYyByYXRlIG9yIG5vdCwgYXMgaXQgbmVlZHMgdG8gCisgICAgKiB1cGRhdGUgdGhlIHJlc3BvbnNlIHJhdGUgdGFibGUgYWNjb3JkaW5nbHkuIGUuZy4gaWYgb25lIG9mIHRoZSAxMWEgcmF0ZXMgaXMKKyAgICAqIGJhc2ljIHJhdGUsIHRoZW4gdGhhdCByYXRlIGNhbiBiZSB1c2VkIGZvciBzZW5kaW5nIGNvbnRyb2wgZnJhbWVzLgorICAgICogSEFMIHVwZGF0ZXMgdGhlIHJlc3BvbnNlIHJhdGUgdGFibGUgd2hlbmV2ZXIgYmFzaWMgcmF0ZSBzZXQgaXMgY2hhbmdlZC4KKyAgICAqLworICAgICAgICAgICAgaWYgKGJhc2ljT25seSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGVtcFJhdGVTZXQucmF0ZVttaW5dICYgMHg4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0FyYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5sbGFSYXRlc1thUmF0ZUluZGV4KytdID0gdGVtcFJhdGVTZXQucmF0ZVttaW5dOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPmxsYlJhdGVzW2JSYXRlSW5kZXgrK10gPSB0ZW1wUmF0ZVNldC5yYXRlW21pbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpc0FyYXRlKQorICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPmxsYVJhdGVzW2FSYXRlSW5kZXgrK10gPSB0ZW1wUmF0ZVNldC5yYXRlW21pbl07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPmxsYlJhdGVzW2JSYXRlSW5kZXgrK10gPSB0ZW1wUmF0ZVNldC5yYXRlW21pbl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wUmF0ZVNldC5yYXRlW21pbl0gPSAweGZmOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIGlmKElTX0RPVDExX01PREVfSFQocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSkKKyAgICB7CisgICAgICAgIHZhbCA9IFNJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVQ7CisgICAgICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+c3VwcG9ydGVkTUNTU2V0LAorICAgICAgICAgICAgICAgICAgICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBnZXQgcmF0ZXNldCBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIHN1cHBvcnRlZE1DU1NldFxuIikpOykKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworCisgICAgICAgIC8vaWYgc3VwcG9ydGVkIE1DUyBTZXQgb2YgdGhlIHBlZXIgaXMgcGFzc2VkIGluLCB0aGVuIGRvIHRoZSBpbnRlcnNlY3Rpb24KKyAgICAgICAgLy9lbHNlIHVzZSB0aGUgTUNTIHNldCBmcm9tIGxvY2FsIENGRy4KKworICAgICAgICBpZihwU3VwcG9ydGVkTUNTU2V0ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8U0lSX01BQ19NQVhfU1VQUE9SVEVEX01DU19TRVQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5zdXBwb3J0ZWRNQ1NTZXRbaV0gJj0gcFN1cHBvcnRlZE1DU1NldFtpXTsKKworICAgICAgICB9CisKKyAgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiTUNTIFJhdGUgU2V0IEJpdG1hcDogXG4iKSk7KQorICAgICAgICBmb3IoaT0wOyBpPFNJUl9NQUNfTUFYX1NVUFBPUlRFRF9NQ1NfU0VUOyBpKyspCisgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPRzIsRkwoIiV4ICIpICwgcFJhdGVzLT5zdXBwb3J0ZWRNQ1NTZXRbaV0pOykKKyAgICB9CisKKworCisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCisgZXJyb3I6CisKKyAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworfSAvKioqIGxpbVBvcHVsYXRlT3duUmF0ZVNldCgpICoqKi8KKworCisKKy8qKgorICogbGltUG9wdWxhdGVNYXRjaGluZ1JhdGVTZXQKKyAqIEZVTkNUSU9OOgorICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIHRpbWUgb2YgQXNzb2NpYXRpb24gUmVxdWVzdAorICogcHJvY2Vzc2luZyBvbiBBUCBhbmQgd2hpbGUgYWRkaW5nIHBlZXIncyBjb250ZXh0CisgKiBpbiBJQlNTIHJvbGUgdG8gcHJvY2VzcyB0aGUgQ0ZHIHJhdGUgc2V0cyBhbmQKKyAqIHRoZSByYXRlIHNldHMgcmVjZWl2ZWQgaW4gdGhlIEFzc29jIHJlcXVlc3Qgb24gQVAKKyAqIG9yIEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBmcm9tIHBlZXIgaW4gSUJTUy4KKyAqCisgKiBMT0dJQzoKKyAqIDEuIEl0IG1ha2VzIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiBvdXIgb3duIHJhdGUgU2F0CisgKiAgICBhbmQgZXh0ZW1jZGVkIHJhdGUgc2V0IGFuZCB0aGUgb25lcyByZWNlaXZlZCBpbiB0aGUKKyAqICAgIGFzc29jaWF0aW9uIHJlcXVlc3QuCisgKiAyLiBJdCBjcmVhdGVzIGEgY29tYmluZWQgcmF0ZSBzZXQgb2YgMTIgcmF0ZXMgbWF4IHdoaWNoCisgKiAgICBjb21wcmlzZWQgdGhlIGJhc2ljIGFuZCBleHRlbmRlZCByYXRlcworICogMy4gSXQgc29ydHMgdGhlIGNvbWJpbmVkIHJhdGUgU2V0IGFuZCBjb3B5IGl0IGluIHRoZQorICogICAgcmF0ZSBhcnJheSBvZiB0aGUgcFNUQSBkZXNjcmlwdG9yCisgKgorICogQVNTVU1QVElPTjoKKyAqIFRoZSBwYXJzZXIgaGFzIGFscmVhZHkgZW5zdXJlZCB1bmljaXR5IG9mIHRoZSByYXRlcyBpbiB0aGUKKyAqIGFzc29jaWF0aW9uIHJlcXVlc3Qgc3RydWN0dXJlCisgKgorICogQHBhcmFtOiBwTWFjICAgICAgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiAgICAgICAgIHBTdGFEcyAgICAgICAtIFBvaW50ZXIgdG8gRFBIIG5vZGUKKyAqICAgICAgICAgcE9wZXJSYXRlU2V0IC0gUG9pbnRlciB0byBwZWVyJ3Mgc3VwcG9ydGVkIHJhdGVzZXQKKyAqICAgICAgICAgcEV4dFJhdGVTZXQgIC0gUG9pbnRlciB0byBwZWVyJ3MgZXh0ZW5kZWQgcmF0ZXNldAorICoKKyAqIEByZXR1cm46ICBlU0lSX1NVQ0NFU1Mgb3IgZVNJUl9GQUlMVVJFCisgKi8KKwordFNpclJldFN0YXR1cworbGltUG9wdWxhdGVNYXRjaGluZ1JhdGVTZXQodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY1JhdGVTZXQgKnBPcGVyUmF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNSYXRlU2V0ICpwRXh0UmF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTgqIHBTdXBwb3J0ZWRNQ1NTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjUHJvcFJhdGVTZXQgKnBBbmlMZWdSYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gIHBzZXNzaW9uRW50cnkpCit7CisgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgICB0ZW1wUmF0ZVNldDsKKyAgIHRTaXJNYWNSYXRlU2V0ICAgICAgICAgIHRlbXBSYXRlU2V0MjsKKyAgIHRBTklfVTMyICAgICAgICAgICAgICAgIGksaix2YWwsbWluLGlzQXJhdGU7CisgICB0QU5JX1UzMiBwaHlNb2RlOworICAgdEFOSV9VOCBtY3NTZXRbU0laRV9PRl9TVVBQT1JURURfTUNTX1NFVF07CisKKyAgIGlzQXJhdGU9MDsKKworICAgLy8gbGltR2V0UGh5TW9kZShwTWFjLCAmcGh5TW9kZSk7CisgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgLy8gZ2V0IG93biByYXRlIHNldAorICAgLy8gdmFsID0gV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVF9MRU47CisgICAjaWYgMAorICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX09QRVJBVElPTkFMX1JBVEVfU0VULAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnRlbXBSYXRlU2V0LnJhdGUsCisgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCByYXRlc2V0IGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIHJhdGVzZXRcbiIpKTsKKyAgICB9CisKKyAgICAjZW5kaWYgLy8gVE8gU1VQUE9SVCBCVC1BTVAKKworICAgIC8qIGNvcHkgb3BlcmF0aW9uYWwgcmF0ZSBzZXQgZnJvbSBwc2Vzc2lvbkVudHJ5ICovCisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCh0ZW1wUmF0ZVNldC5yYXRlKSwocHNlc3Npb25FbnRyeS0+cmF0ZVNldC5yYXRlKSxwc2Vzc2lvbkVudHJ5LT5yYXRlU2V0Lm51bVJhdGVzKTsKKyAgICB0ZW1wUmF0ZVNldC5udW1SYXRlcyA9ICh0QU5JX1U4KSBwc2Vzc2lvbkVudHJ5LT5yYXRlU2V0Lm51bVJhdGVzOworCisgICAgaWYgKHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpCisgICAgeworCisgICAgICAgICNpZiAwCisgICAgICAgIC8vIGdldCBvd24gZXh0ZW5kZWQgcmF0ZSBzZXQKKyAgICAgICAgdmFsID0gV05JX0NGR19FWFRFTkRFRF9PUEVSQVRJT05BTF9SQVRFX1NFVF9MRU47CisgICAgICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VULAorICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZ0ZW1wUmF0ZVNldDIucmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICNlbmRpZgorICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHRlbXBSYXRlU2V0Mi5yYXRlKSwocHNlc3Npb25FbnRyeS0+ZXh0UmF0ZVNldC5yYXRlKSxwc2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0Lm51bVJhdGVzKTsKKyAgICAgICAgdGVtcFJhdGVTZXQyLm51bVJhdGVzID0gKHRBTklfVTgpIHBzZXNzaW9uRW50cnktPmV4dFJhdGVTZXQubnVtUmF0ZXM7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgdGVtcFJhdGVTZXQyLm51bVJhdGVzID0gMDsKKworICAgIGlmICgodGVtcFJhdGVTZXQubnVtUmF0ZXMgKyB0ZW1wUmF0ZVNldDIubnVtUmF0ZXMpID4gMTIpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJtb3JlIHRoYW4gMTIgcmF0ZXMgaW4gQ0ZHXG4iKSk7KQorICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsaW5nIG9mIHRoZSByYXRlIHNldCBJRXMgaXMgdGhlIGZvbGxvd2luZzoKKyAgICAgKiAtIGtlZXAgb25seSByYXRlcyB0aGF0IHdlIHN1cHBvcnQgYW5kIHRoYXQgdGhlIHN0YXRpb24gc3VwcG9ydHMKKyAgICAgKiAtIHNvcnQgYW5kIHRoZSByYXRlcyBpbnRvIHRoZSBwU3RhLT5yYXRlIGFycmF5CisgICAgICovCisKKyAgICAvLyBDb3B5IGFsbCByYXRlcyBpbiB0ZW1wUmF0ZVNldCwgdGhlcmUgYXJlIDEyIHJhdGVzIG1heAorICAgIGZvcihpID0gMDsgaSA8IHRlbXBSYXRlU2V0Mi5udW1SYXRlczsgaSsrKQorICAgICAgICB0ZW1wUmF0ZVNldC5yYXRlW2kgKyB0ZW1wUmF0ZVNldC5udW1SYXRlc10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSYXRlU2V0Mi5yYXRlW2ldOworCisgICAgdGVtcFJhdGVTZXQubnVtUmF0ZXMgKz0gdGVtcFJhdGVTZXQyLm51bVJhdGVzOworCisgICAgLyoqCisgICAgICogU29ydCByYXRlcyBpbiB0ZW1wUmF0ZVNldCAodGhleSBhcmUgbGlrZWx5IHRvIGJlIGFscmVhZHkgc29ydGVkKQorICAgICAqIHB1dCB0aGUgcmVzdWx0IGluIHRlbXBSYXRlU2V0MgorICAgICAqLworICAgIHRlbXBSYXRlU2V0Mi5udW1SYXRlcyA9IDA7CisKKyAgICBmb3IoaSA9IDA7aSA8IHRlbXBSYXRlU2V0Lm51bVJhdGVzOyBpKyspCisgICAgeworICAgICAgICBtaW4gPSAwOworICAgICAgICB2YWwgPSAweGZmOworCisgICAgICAgIGZvcihqID0gMDtqIDwgdGVtcFJhdGVTZXQubnVtUmF0ZXM7IGorKykKKyAgICAgICAgICAgIGlmICgodEFOSV9VMzIpICh0ZW1wUmF0ZVNldC5yYXRlW2pdICYgMHg3ZikgPCB2YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsID0gdGVtcFJhdGVTZXQucmF0ZVtqXSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgbWluID0gajsKKyAgICAgICAgICAgIH0KKworICAgICAgICB0ZW1wUmF0ZVNldDIucmF0ZVt0ZW1wUmF0ZVNldDIubnVtUmF0ZXMrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSYXRlU2V0LnJhdGVbbWluXTsKKyAgICAgICAgdGVtcFJhdGVTZXQucmF0ZVttaW5dID0gMHhmZjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgcmVjZWl2ZWQgcmF0ZXMgaW4gdGVtcFJhdGVTZXQsIHRoZSBwYXJzZXIgaGFzIGVuc3VyZWQKKyAgICAgKiB1bmljaXR5IG9mIHRoZSByYXRlcyBzbyB0aGVyZSBjYW5ub3QgYmUgbW9yZSB0aGFuIDEyCisgICAgICovCisgICAgZm9yKGkgPSAwOyBpIDwgcE9wZXJSYXRlU2V0LT5udW1SYXRlczsgaSsrKQorICAgIHsKKyAgICAgICAgdGVtcFJhdGVTZXQucmF0ZVtpXSA9IHBPcGVyUmF0ZVNldC0+cmF0ZVtpXTsKKyAgICB9CisKKyAgICB0ZW1wUmF0ZVNldC5udW1SYXRlcyA9IHBPcGVyUmF0ZVNldC0+bnVtUmF0ZXM7CisKKyAgICBpZiAocEV4dFJhdGVTZXQtPm51bVJhdGVzKQorICAgIHsKKyAgICAgIGlmKCh0ZW1wUmF0ZVNldC5udW1SYXRlcyArIHBFeHRSYXRlU2V0LT5udW1SYXRlcykgPiAxMiApCisgICAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HMiwKKyAgICAgICAgICAgICJTdW0gb2YgU1VQUE9SVEVEIGFuZCBFWFRFTkRFRCBSYXRlIFNldCAoJTFkKSBleGNlZWRzIDEyISIsCisgICAgICAgICAgICB0ZW1wUmF0ZVNldC5udW1SYXRlcyArIHBFeHRSYXRlU2V0LT5udW1SYXRlcyApOworCisgICAgICAgIGlmKCB0ZW1wUmF0ZVNldC5udW1SYXRlcyA8IDEyICkKKyAgICAgICAgeworICAgICAgICAgaW50IGZvdW5kID0gMDsKKyAgICAgICAgIGludCB0YWlsID0gdGVtcFJhdGVTZXQubnVtUmF0ZXM7CisKKyAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcEV4dFJhdGVTZXQtPm51bVJhdGVzOyBpKysgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvdW5kID0gMDsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAodEFOSV9VMzIpIHRhaWw7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmKCh0ZW1wUmF0ZVNldC5yYXRlW2pdICYgMHg3RikgPT0KKyAgICAgICAgICAgICAgICAgIChwRXh0UmF0ZVNldC0+cmF0ZVtpXSAmIDB4N0YpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAhZm91bmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0ZW1wUmF0ZVNldC5yYXRlW3RlbXBSYXRlU2V0Lm51bVJhdGVzKytdID0KKyAgICAgICAgICAgICAgICBwRXh0UmF0ZVNldC0+cmF0ZVtpXTsKKworICAgICAgICAgICAgICBpZiggdGVtcFJhdGVTZXQubnVtUmF0ZXMgPj0gMTIgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0cyLAorICAgICAgICAgICAgICAiUmVseWluZyBvbmx5IG9uIHRoZSBTVVBQT1JURUQgUmF0ZSBTZXQgSUUuLi4iICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvcihqID0gMDsgaiA8IHBFeHRSYXRlU2V0LT5udW1SYXRlczsgaisrKQorICAgICAgICAgICAgdGVtcFJhdGVTZXQucmF0ZVtpK2pdID0gcEV4dFJhdGVTZXQtPnJhdGVbal07CisKKyAgICAgICAgdGVtcFJhdGVTZXQubnVtUmF0ZXMgKz0gcEV4dFJhdGVTZXQtPm51bVJhdGVzOworICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgdHBTaXJTdXBwb3J0ZWRSYXRlcyAgcmF0ZXMgPSAmcFN0YURzLT5zdXBwb3J0ZWRSYXRlczsKKyAgICAgICAgdEFOSV9VOCBhUmF0ZUluZGV4ID0gMDsKKyAgICAgICAgdEFOSV9VOCBiUmF0ZUluZGV4ID0gMDsKKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcmF0ZXMsIHNpemVvZih0U2lyU3VwcG9ydGVkUmF0ZXMpKTsKKyAgICAgICAgZm9yKGkgPSAwO2kgPCB0ZW1wUmF0ZVNldDIubnVtUmF0ZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGogPSAwO2ogPCB0ZW1wUmF0ZVNldC5udW1SYXRlczsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGVtcFJhdGVTZXQyLnJhdGVbaV0gJiAweDdGKSA9PQorICAgICAgICAgICAgICAgICAgICAodGVtcFJhdGVTZXQucmF0ZVtqXSAmIDB4N0YpKQorICAgICAgICAgICAgICAgIHsgCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgICAgICAgICAgICAgICAgICBpZiAoKGJSYXRlSW5kZXggPiBIQUxfTlVNXzExQl9SQVRFUykgfHwgKGFSYXRlSW5kZXggPiBIQUxfTlVNXzExQV9SQVRFUykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBudW1iZXIgb2YgcmF0ZXMgKDExYi0+JWQsIDExYS0+JWQpXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJhdGVJbmRleCwgYVJhdGVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlmIChzaXJJc0FyYXRlKHRlbXBSYXRlU2V0Mi5yYXRlW2ldICYgMHg3ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzQXJhdGU9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVzLT5sbGFSYXRlc1thUmF0ZUluZGV4KytdID0gdGVtcFJhdGVTZXQyLnJhdGVbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZXMtPmxsYlJhdGVzW2JSYXRlSW5kZXgrK10gPSB0ZW1wUmF0ZVNldDIucmF0ZVtpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvL05vdyBhZGQgdGhlIFBvbGFyaXMgcmF0ZXMgb25seSB3aGVuIFByb3ByaWV0YXJ5IHJhdGVzIGFyZSBlbmFibGVkLgorICAgICAgICB2YWwgPSAwOworICAgICAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1BST1BSSUVUQVJZX1JBVEVTX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgcHJvcCByYXRlIGVuYWJsZWQgZmxhZyBmcm9tIENGR1xuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYodmFsKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaT0wOyBpPHBBbmlMZWdSYXRlU2V0LT5udW1Qcm9wUmF0ZXM7IGkrKykKKyAgICAgICAgICAgICAgICByYXRlcy0+YW5pTGVnYWN5UmF0ZXNbaV0gPSBwQW5pTGVnUmF0ZVNldC0+cHJvcFJhdGVbaV07CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy9jb21wdXRlIHRoZSBtYXRjaGluZyBNQ1MgcmF0ZSBzZXQsIGlmIHBlZXIgaXMgMTFuIGNhcGFibGUgYW5kIHNlbGYgbW9kZSBpcyAxMW4KKyAgICBpZihJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSkgJiYKKyAgICAgIChwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5KSkKKyAgICB7CisgICAgICAgIHZhbCA9IFNJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVQ7CisgICAgICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorICAgICAgICAgICAgICAgICAgICAgIG1jc1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgZ2V0IHJhdGVzZXQgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIHN1cHBvcnRlZE1DU1NldFxuIikpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihpPTA7IGk8dmFsOyBpKyspCisgICAgICAgICAgIHBTdGFEcy0+c3VwcG9ydGVkUmF0ZXMuc3VwcG9ydGVkTUNTU2V0W2ldID0gbWNzU2V0W2ldICYgcFN1cHBvcnRlZE1DU1NldFtpXTsKKworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJsaW1Qb3B1bGF0ZU1hdGNoaW5nUmF0ZVNldDogTUNTIFJhdGUgU2V0IEJpdG1hcCBmcm9tICBDRkcgYW5kIERQSCA6IFxuIikpOykKKyAgICAgICAgZm9yKGk9MDsgaTxTSVJfTUFDX01BWF9TVVBQT1JURURfTUNTX1NFVDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsRkwoIiV4ICV4ICIpLCBtY3NTZXRbaV0sIHBTdGFEcy0+c3VwcG9ydGVkUmF0ZXMuc3VwcG9ydGVkTUNTU2V0W2ldKTspCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgICogU2V0IHRoZSBlcnBFbmFibGVkIGJpdCBpZmYgdGhlIHBoeSBpcyBpbiBHIG1vZGUgYW5kIGF0IGxlYXN0CisgICAgICAqIG9uZSBBIHJhdGUgaXMgc3VwcG9ydGVkCisgICAgICAqLworICAgIGlmICgocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykgJiYgaXNBcmF0ZSkKKyAgICAgICAgcFN0YURzLT5lcnBFbmFibGVkID0gZUhBTF9TRVQ7CisKKyAgICAKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKKyBlcnJvcjoKKworICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7Cit9IC8qKiogbGltUG9wdWxhdGVNYXRjaGluZ1JhdGVTZXQoKSAqKiovCisKKworCisvKioKKyAqIGxpbUFkZFN0YSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFkZCBhbiBTVEEgY29udGV4dCBhdCBoYXJkd2FyZQorICogd2hlbmV2ZXIgYSBTVEEgaXMgKFJlKSBBc3NvY2lhdGVkLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBTdGFEcyAgLSBQb2ludGVyIHRvIHRoZSBTVEEgZGF0YXN0cnVjdHVyZSBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICBMSU0gYW5kIG1haW50YWluZWQgYnkgRFBICisgKiBAcmV0dXJuIHJldENvZGUgLSBJbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlIHJldHVybiBjb2RlCisgKi8KKwordFNpclJldFN0YXR1cworbGltQWRkU3RhKAorICAgIHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgIHRwRHBoSGFzaE5vZGUgICBwU3RhRHMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0cEFkZFN0YVBhcmFtcyBwQWRkU3RhUGFyYW1zID0gTlVMTDsKKyAgICB0U2lyTXNnUSBtc2dROworICAgIHRTaXJSZXRTdGF0dXMgICAgIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICAgdFNpck1hY0FkZHIgICAgIHN0YU1hYywgKnBTdGFBZGRyOworICAgIHRBTklfVTggaTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgdHBTaXJBc3NvY1JlcSAgIHBBc3NvY1JlcTsKKyAgICB0QU5JX1U4ICAqcDJwSWUgPSBOVUxMOworI2VuZGlmCisgICAgI2lmIDAKKyAgICByZXRDb2RlID0gd2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19TVEFfSUQsIHN0YU1hYywgJmNmZyk7CisgICAgaWYgKHJldENvZGUgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgU1RBIE1BQ1xuIikpOworICAgICNlbmRpZiAvL1RvIFNVUFBPUlQgQlQtQU1QCisKKyAgICAKKyAgICBzaXJDb3B5TWFjQWRkcihzdGFNYWMscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0KKyAgICAgICAgcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSAmcEFkZFN0YVBhcmFtcywgc2l6ZW9mKCB0QWRkU3RhUGFyYW1zICkpKQorICAgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgQUREX1NUQVxuIiApKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgIH0KKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQWRkU3RhUGFyYW1zLCBzaXplb2YodEFkZFN0YVBhcmFtcykpOworCisgICAgaWYgKChsaW1HZXRTeXN0ZW1Sb2xlKHBzZXNzaW9uRW50cnkpID09IGVMSU1fQVBfUk9MRSkgfHwKKyAgICAgICAgKGxpbUdldFN5c3RlbVJvbGUocHNlc3Npb25FbnRyeSkgPT0gZUxJTV9TVEFfSU5fSUJTU19ST0xFKSB8fAorICAgICAgICAobGltR2V0U3lzdGVtUm9sZShwc2Vzc2lvbkVudHJ5KSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKSApCisgICAgICAgIHBTdGFBZGRyID0gJnBTdGFEcy0+c3RhQWRkcjsKKyAgICBlbHNlCisgICAgICAgIHBTdGFBZGRyID0gJnN0YU1hYzsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBBZGRTdGFQYXJhbXMtPnN0YU1hYywKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICpwU3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcEFkZFN0YVBhcmFtcy0+YnNzSWQsCisgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgbGltRmlsbFN1cHBvcnRlZFJhdGVzSW5mbyhwTWFjLCBwU3RhRHMsICZwU3RhRHMtPnN1cHBvcnRlZFJhdGVzLHBzZXNzaW9uRW50cnkpOworCisgICAgLy9Db3B5IGxlZ2FjeSByYXRlcworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTgqKSZwQWRkU3RhUGFyYW1zLT5zdXBwb3J0ZWRSYXRlcywKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4KikmcFN0YURzLT5zdXBwb3J0ZWRSYXRlcywgc2l6ZW9mKHRTaXJTdXBwb3J0ZWRSYXRlcykpOworCisgICAgcEFkZFN0YVBhcmFtcy0+YXNzb2NJZCA9IHBTdGFEcy0+YXNzb2NJZDsKKworICAgIHBBZGRTdGFQYXJhbXMtPndtbUVuYWJsZWQgPSBwU3RhRHMtPnFvc01vZGU7CisgICAgcEFkZFN0YVBhcmFtcy0+bGlzdGVuSW50ZXJ2YWwgPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQubGlzdGVuSW50ZXJ2YWw7CisgICAgcEFkZFN0YVBhcmFtcy0+c2hvcnRQcmVhbWJsZVN1cHBvcnRlZCA9IHBTdGFEcy0+c2hvcnRQcmVhbWJsZUVuYWJsZWQ7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKChsaW1HZXRTeXN0ZW1Sb2xlKHBzZXNzaW9uRW50cnkpID09IGVMSU1fQVBfUk9MRSkgJiYgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlID09IExJTV9SRUFTU09DKSkKKyAgICB7CisgICAgICAgIC8qIFRCRCAtIG5lZWQgdG8gcmVtb3ZlIHRoaXMgUkVBU1NPQyBjaGVjayBhZnRlciBmaXhpbmYgcm1tb2QgaXNzdWUgKi8KKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+dXBkYXRlU3RhID0gcFN0YURzLT5tbG1TdGFDb250ZXh0LnVwZGF0ZUNvbnRleHQ7CisgICAgfQorI2VuZGlmCisgICAgcFN0YURzLT52YWxpZCAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPSBlTElNX01MTV9XVF9BRERfU1RBX1JTUF9TVEFURTsKKworICAvLyBUaGlzIHdpbGwgaW5kaWNhdGUgSEFMIHRvICJhbGxvY2F0ZSIgYSBuZXcgU1RBIGluZGV4CisgICAgcEFkZFN0YVBhcmFtcy0+c3RhSWR4ID0gSEFMX1NUQV9JTlZBTElEX0lEWDsKKyAgICBwQWRkU3RhUGFyYW1zLT5zdGFUeXBlID0gcFN0YURzLT5zdGFUeXBlOworCisgICAgcEFkZFN0YVBhcmFtcy0+c3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICBwQWRkU3RhUGFyYW1zLT5yZXNwUmVxZCA9IDE7CisgICAgLy9VcGRhdGUgSFQgQ2FwYWJpbGl0eQorCisgICAgaWYgKChsaW1HZXRTeXN0ZW1Sb2xlKHBzZXNzaW9uRW50cnkpID09IGVMSU1fQVBfUk9MRSkgfHwobGltR2V0U3lzdGVtUm9sZShwc2Vzc2lvbkVudHJ5KSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKSB8fCAobGltR2V0U3lzdGVtUm9sZShwc2Vzc2lvbkVudHJ5KSA9PSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpKQorICAgICAgICBwQWRkU3RhUGFyYW1zLT5odENhcGFibGUgPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5OworICAgIGVsc2UKKyAgICAgICAgICBwQWRkU3RhUGFyYW1zLT5odENhcGFibGUgPSBwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHk7CisKKyAgICBwQWRkU3RhUGFyYW1zLT5ncmVlbkZpZWxkQ2FwYWJsZSA9IHBTdGFEcy0+aHRHcmVlbmZpZWxkOworICAgIHBBZGRTdGFQYXJhbXMtPm1heEFtcGR1RGVuc2l0eT0gcFN0YURzLT5odEFNcGR1RGVuc2l0eTsKKyAgICBwQWRkU3RhUGFyYW1zLT5tYXhBbXBkdVNpemUgPSBwU3RhRHMtPmh0TWF4UnhBTXBkdUZhY3RvcjsKKyAgICBwQWRkU3RhUGFyYW1zLT5mRHNzc0Nja01vZGU0ME1oeiA9IHBTdGFEcy0+aHREc3NzQ2NrUmF0ZTQwTUh6U3VwcG9ydDsKKyAgICBwQWRkU3RhUGFyYW1zLT5mU2hvcnRHSTIwTWh6ID0gcFN0YURzLT5odFNob3J0R0kyME1oejsKKyAgICBwQWRkU3RhUGFyYW1zLT5mU2hvcnRHSTQwTWh6ID0gcFN0YURzLT5odFNob3J0R0k0ME1oejsKKyAgICBwQWRkU3RhUGFyYW1zLT5sc2lnVHhvcFByb3RlY3Rpb24gPSBwU3RhRHMtPmh0THNpZ1RYT1BQcm90ZWN0aW9uOworICAgIHBBZGRTdGFQYXJhbXMtPm1heEFtc2R1U2l6ZSA9IHBTdGFEcy0+aHRNYXhBbXNkdUxlbmd0aDsKKyAgICBwQWRkU3RhUGFyYW1zLT50eENoYW5uZWxXaWR0aFNldCA9IHBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisgICAgcEFkZFN0YVBhcmFtcy0+bWltb1BTID0gcFN0YURzLT5odE1JTU9QU1N0YXRlOworICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElEKi8KKyAgICBwQWRkU3RhUGFyYW1zLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcSAhPSBOVUxMKQorICAgIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgLy8gR2V0IGEgY29weSBvZiB0aGUgYWxyZWFkeSBwYXJzZWQgQXNzb2MgUmVxdWVzdAorICAgICAgIHBBc3NvY1JlcSA9ICh0cFNpckFzc29jUmVxKSBwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcVtwU3RhRHMtPmFzc29jSWRdOworICAgICAgIGlmICggcEFzc29jUmVxICYmIHBBc3NvY1JlcS0+YWRkSUVQcmVzZW50ICYmIHBBc3NvY1JlcS0+YWRkSUUubGVuZ3RoICkgeworICAgICAgICAgICBwMnBJZSA9IGxpbUdldFAycElFUHRyKHBNYWMsIHBBc3NvY1JlcS0+YWRkSUUuYWRkSUVkYXRhLCBwQXNzb2NSZXEtPmFkZElFLmxlbmd0aCk7CisgICAgICAgfQorICAgICAgIHBBZGRTdGFQYXJhbXMtPnAycENhcGFibGVTdGEgPSAocDJwSWUgIT0gTlVMTCk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvL0Rpc2FibGUgQkEuIEl0IHdpbGwgYmUgc2V0IGFzIHBhcnQgb2YgQUREQkEgbmVnb3RpYXRpb24uCisgICAgZm9yKCBpID0gMDsgaSA8IFNUQUNGR19NQVhfVEM7IGkrKyApCisgICAgeworICAgICAgICAgIHBBZGRTdGFQYXJhbXMtPnN0YVRDUGFyYW1zW2ldLnR4VXNlQkEgPSBlQkFfRElTQUJMRTsKKyAgICAgICAgICBwQWRkU3RhUGFyYW1zLT5zdGFUQ1BhcmFtc1tpXS5yeFVzZUJBID0gZUJBX0RJU0FCTEU7CisgICAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKHBTdGFEcy0+d21lRW5hYmxlZCAmJiAoZUxJTV9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpKQorICAgIHsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+dUFQU0QgPSAwOworICAgICAgICAvKiB1cGRhdGUgVUFQU0QgYW5kIHNlbmQgaXQgdG8gTElNIHRvIGFkZCBTVEEgKi8KKyAgICAgICAgLy8gYml0bWFwIE1TQiA8LSBMU0IgTVNCIDQgYml0cyBhcmUgZm9yCisgICAgICAgIC8vIHRyaWdnZXIgZW5hYmxlZCBBQyBzZXR0aW5nIGFuZCBMU0IgNCBiaXRzCisgICAgICAgIC8vIGFyZSBmb3IgZGVsaXZlcnkgZW5hYmxlZCBBQyBzZXR0aW5nCisgICAgICAgIC8vIDcgICA2ICAgIDUgICAgNCAgICAzICAgIDIgICAgMSAgICAwCisgICAgICAgIC8vIEJFICBCSyAgIFZJICAgVk8gICBCRSAgIEJLICAgVkkgICBWTworICAgICAgICBwQWRkU3RhUGFyYW1zLT51QVBTRCB8PSBwU3RhRHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8uYWN2b191YXBzZDsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+dUFQU0QgfD0gKHBTdGFEcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mby5hY3ZpX3VhcHNkIDw8IDEpOworICAgICAgICBwQWRkU3RhUGFyYW1zLT51QVBTRCB8PSAocFN0YURzLT5xb3MuY2FwYWJpbGl0eS5xb3NJbmZvLmFjYmtfdWFwc2QgPDwgMik7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPnVBUFNEIHw9IChwU3RhRHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8uYWNiZV91YXBzZCA8PCAzKTsKKyAgICAgICAgLy9tYWtpbmcgZGVsaXZlcnkgZW5hYmxlZCBhbmQgdHJpZ2dlciBlbmFibGVkIHNldHRpbmcgdGhlIHNhbWUuCisgICAgICAgIHBBZGRTdGFQYXJhbXMtPnVBUFNEIHw9IHBBZGRTdGFQYXJhbXMtPnVBUFNEIDw8IDQ7CisKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+bWF4U1BMZW4gPSBwU3RhRHMtPnFvcy5jYXBhYmlsaXR5LnFvc0luZm8ubWF4U3BMZW47CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJ1QVBTRCA9IDB4JXgsIG1heFNwTGVuID0gJWQiICksCisgICAgICAgICAgICBwQWRkU3RhUGFyYW1zLT51QVBTRCwgcEFkZFN0YVBhcmFtcy0+bWF4U1BMZW4pOworICAgIH0KKyNlbmRpZgorICAvL3dlIG5lZWQgdG8gZGVmZXIgdGhlIG1lc3NhZ2UgdW50aWwgd2UgZ2V0IHRoZSByZXNwb25zZSBiYWNrIGZyb20gSEFMLgorICAgIGlmIChwQWRkU3RhUGFyYW1zLT5yZXNwUmVxZCkKKyAgICAgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgZmFsc2UpOworICBtc2dRLnR5cGUgPSBXREFfQUREX1NUQV9SRVE7CisKKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwQWRkU3RhUGFyYW1zOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiU2VuZGluZyBTSVJfSEFMX0FERF9TVEFfUkVRIGZvciBhc3NvY0lkICVkXG4iICksCisgICAgICAgICAgICBwU3RhRHMtPmFzc29jSWQpOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworCisgICAgcmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApOworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkFERF9TVEFfUkVRIGZvciBhSWQgJWQgZmFpbGVkIChyZWFzb24gJVgpXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmFzc29jSWQsIHJldENvZGUgKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopcEFkZFN0YVBhcmFtcyk7CisgICAgfQorCisgIHJldHVybiByZXRDb2RlOworfQorCisKKy8qKgorICogbGltRGVsU3RhKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVsZXRlIGFuIFNUQSBjb250ZXh0IGF0IGhhcmR3YXJlCisgKiB3aGVuZXZlciBhIFNUQSBpcyBkaXNhc3NvY2lhdGVkCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzICAtIFBvaW50ZXIgdG8gdGhlIFNUQSBkYXRhc3RydWN0dXJlIGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgIExJTSBhbmQgbWFpbnRhaW5lZCBieSBEUEgKKyAqIEBwYXJhbSAgZlJlc3BSZXFkIC0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBkZWxldGUgaXMgc3luY2hyb25vdXMgKHRydWUpCisgKiAgICAgICAgICAgICAgICAgICBvciBub3QgKGZhbHNlKQorICogQHJldHVybiByZXRDb2RlIC0gSW5kaWNhdGVzIHN1Y2Nlc3Mgb3IgZmFpbHVyZSByZXR1cm4gY29kZQorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbURlbFN0YSgKKyAgICB0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlICAgcFN0YURzLAorICAgIHRBTklfQk9PTEVBTiAgICBmUmVzcFJlcWQsCisgICAgdHBQRVNlc3Npb24gICAgIHBzZXNzaW9uRW50cnkpCit7CisgICAgdHBEZWxldGVTdGFQYXJhbXMgcERlbFN0YVBhcmFtcyA9IE5VTEw7CisgICAgdFNpck1zZ1EgbXNnUTsKKyAgICB0U2lyUmV0U3RhdHVzICAgICByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSAmcERlbFN0YVBhcmFtcywgc2l6ZW9mKCB0RGVsZXRlU3RhUGFyYW1zICkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBBRERfU1RBXG4iICkpOworICAgICAgICByZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBEZWxTdGFQYXJhbXMsIHNpemVvZih0RGVsZXRlU3RhUGFyYW1zKSk7CisKKyAgLy8KKyAgLy8gRFBIIGNvbnRhaW5zIHRoZSBTVEEgaW5kZXggb25seSBmb3IgInBlZXIiIFNUQSBlbnRyaWVzLgorICAvLyBMSU0gZ2xvYmFsIGNvbnRhaW5zICJzZWxmIiBTVEEgaW5kZXgKKyAgLy8gVGh1cywKKyAgLy8gICAgaWYoIFNUQSByb2xlICkKKyAgLy8gICAgICBnZXQgU1RBIGluZGV4IGZyb20gTElNIGdsb2JhbAorICAvLyAgICBlbHNlCisgIC8vICAgICAgZ2V0IFNUQSBpbmRleCBmcm9tIERQSAorICAvLworCisjaWYgMCAgICAKKyAgICAvKiBTaW5jZSB3ZSBoYXZlIG5vdCBjcmVhdGVkIGFueSBTVEEsIG5vIG5lZWQgdG8gc2VuZCBtc2cgdG8gZGVsZXRlIAorICAgICAqIFNUQSB0byBIQUwgKi8KKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFKSB7CisgICAgICAgIHBEZWxTdGFQYXJhbXMtPnN0YUlkeCA9IDE7IC8qIFRPRE8gOiBUaGlzIGlzIHdvcmthcm91bmQuIE5lZWQgdG8gZmluZCByaWdodCBTVEEgSW5kZXggYmVmb3JlIHNlbmRpbmcgdG8gSEFMICovCisgICAgICAgIC8vcmV0dXJuIHJldENvZGU7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggKGVMSU1fU1RBX1JPTEUgPT0gR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSkgfHwoZUxJTV9CVF9BTVBfU1RBX1JPTEUgPT0gR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSkgKQorICAgICAgcERlbFN0YVBhcmFtcy0+c3RhSWR4PSBwc2Vzc2lvbkVudHJ5LT5zdGFJZDsKKyAgICAKKyAgICBlbHNlCisgICAgICBwRGVsU3RhUGFyYW1zLT5zdGFJZHg9IHBTdGFEcy0+c3RhSW5kZXg7CisKKyAgICBwRGVsU3RhUGFyYW1zLT5hc3NvY0lkID0gcFN0YURzLT5hc3NvY0lkOworICAgIHBTdGFEcy0+dmFsaWQgICAgICAgICAgICAgPSAwOworCisgICAgaWYgKCEgZlJlc3BSZXFkKQorICAgICAgICBwRGVsU3RhUGFyYW1zLT5yZXNwUmVxZCA9IDA7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy93aGVuIGxpbURlbFN0YSBpcyBjYWxsZWQgZnJvbSBwcm9jZXNzU21lQXNzb2NDbmYgdGhlbiBtbG1TdGF0ZSBpcyBhbHJlYWR5IHNldCBwcm9wZXJseS4KKyAgICAgICAgaWYoZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEUgIT0gR0VUX0xJTV9TVEFfQ09OVEVYVF9NTE1fU1RBVEUocFN0YURzKSkKKyAgICAgICAgeworICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURSkpOworICAgICAgICAgICAgU0VUX0xJTV9TVEFfQ09OVEVYVF9NTE1fU1RBVEUocFN0YURzLCBlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoZUxJTV9TVEFfUk9MRSA9PSBHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpKSB8fCAKKyAgICAgICAgICAgICAoZUxJTV9CVF9BTVBfU1RBX1JPTEUgPT0gR0VUX0xJTV9TWVNURU1fUk9MRShwc2Vzc2lvbkVudHJ5KSkgKQorICAgICAgICB7CisgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFKSk7CisKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEU7IAorICAgIAorICAgICAgICB9CisgICAgICAgIHBEZWxTdGFQYXJhbXMtPnJlc3BSZXFkID0gMTsKKyAgICAgICAgLy93ZSBuZWVkIHRvIGRlZmVyIHRoZSBtZXNzYWdlIHVudGlsIHdlIGdldCB0aGUgcmVzcG9uc2UgYmFjayBmcm9tIEhBTC4KKyAgICAgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgZmFsc2UpOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElEKi8KKyAgICBwRGVsU3RhUGFyYW1zLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAKKyAgICBwRGVsU3RhUGFyYW1zLT5zdGF0dXMgID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICBtc2dRLnR5cGUgPSBXREFfREVMRVRFX1NUQV9SRVE7CisgICAgbXNnUS5yZXNlcnZlZCA9IDA7CisgICAgbXNnUS5ib2R5cHRyID0gcERlbFN0YVBhcmFtczsKKyAgICBtc2dRLmJvZHl2YWwgPSAwOworCisgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIlNlbmRpbmcgU0lSX0hBTF9ERUxFVEVfU1RBX1JFUSBmb3IgU1RBSUQ6ICVYIGFuZCBBc3NvY0lEOiAlZFxuIiApLAorICAgIHBEZWxTdGFQYXJhbXMtPnN0YUlkeCwgcERlbFN0YVBhcmFtcy0+YXNzb2NJZCk7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisgICAgcmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApOworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIlBvc3RpbmcgREVMRVRFX1NUQV9SRVEgdG8gSEFMIGZhaWxlZCwgcmVhc29uPSVYXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldENvZGUgKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopcERlbFN0YVBhcmFtcyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldENvZGU7Cit9CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbGltQWRkRlRTdGFTZWxmKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgYSBTVEEgb25jZSB3ZSBoYXZlIGNvbm5lY3RlZCB3aXRoIGEgbmV3CisgKiBBUCwgdGhhdCB3ZSBoYXZlIHBlcmZvcm1lZCBhbiBGVCB0by4gCisgKgorICogVGhlIEFkZCBTVEEgUmVzcG9uc2UgaXMgY3JlYXRlZCBhbmQgbm93IGFmdGVyIHRoZSBBREQgQnNzIElzIFN1Y2Nlc3NmdWwKKyAqIHdlIGFkZCB0aGUgc2VsZiBzdGEuIFdlIHVwZGF0ZSB3aXRoIHRoZSBhc3NvY2lhdGlvbiBpZCBmcm9tIHRoZSByZWFzc29jCisgKiByZXNwb25zZSBmcm9tIHRoZSBBUC4gCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit0U2lyUmV0U3RhdHVzIGxpbUFkZEZUU3RhU2VsZih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBhc3NvY0lkLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRwQWRkU3RhUGFyYW1zIHBBZGRTdGFQYXJhbXMgPSBOVUxMOworICAgIHRTaXJNc2dRIG1zZ1E7CisgICAgdFNpclJldFN0YXR1cyAgICAgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKworICAgIHBBZGRTdGFQYXJhbXMgPSBwTWFjLT5mdC5mdFBFQ29udGV4dC5wQWRkU3RhUmVxOworICAgIHBBZGRTdGFQYXJhbXMtPmFzc29jSWQgPSBhc3NvY0lkOworCisgICAgbXNnUS50eXBlID0gU0lSX0hBTF9BRERfU1RBX1JFUTsKKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwQWRkU3RhUGFyYW1zOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiU2VuZGluZyBTSVJfSEFMX0FERF9TVEFfUkVRLi4uIChhaWQgJWQpIiApLCBwQWRkU3RhUGFyYW1zLT5hc3NvY0lkKTsKKyNlbmRpZgorICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworCisgICAgcHNlc3Npb25FbnRyeS0+bGltUHJldk1sbVN0YXRlID0gcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGU7CisgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9BRERfU1RBX1JTUF9TVEFURTsKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiUG9zdGluZyBBRERfU1RBX1JFUSB0byBIQUwgZmFpbGVkLCByZWFzb249JVhcbiIpLCByZXRDb2RlICk7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKXBBZGRTdGFQYXJhbXMpOworICAgIH0KKyAgICAvLworICAgIC8vIERvbnQgbmVlZCBpdCBhbnkgbW9yZQorICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBBZGRTdGFSZXEgPSBOVUxMOworICAgIHJldHVybiByZXRDb2RlOworfQorCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworLyoqCisgKiBsaW1BZGRTdGFTZWxmKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGFuIFNUQSBjb250ZXh0IGF0IGhhcmR3YXJlCisgKiB3aGVuZXZlciBhIFNUQSBpcyAoUmUpIEFzc29jaWF0ZWQuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzICAtIFBvaW50ZXIgdG8gdGhlIFNUQSBkYXRhc3RydWN0dXJlIGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgIExJTSBhbmQgbWFpbnRhaW5lZCBieSBEUEgKKyAqIEByZXR1cm4gcmV0Q29kZSAtIEluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUgcmV0dXJuIGNvZGUKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1BZGRTdGFTZWxmKHRwQW5pU2lyR2xvYmFsIHBNYWMsdEFOSV9VMTYgc3RhSWR4LCB0QU5JX1U4IHVwZGF0ZVN0YSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0cEFkZFN0YVBhcmFtcyBwQWRkU3RhUGFyYW1zID0gTlVMTDsKKyAgICB0U2lyTXNnUSBtc2dROworICAgIHRTaXJSZXRTdGF0dXMgICAgIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICAgdFNpck1hY0FkZHIgc3RhTWFjOworICAgIHRBTklfVTMyIGxpc3RlbkludGVydmFsID0gV05JX0NGR19MSVNURU5fSU5URVJWQUxfU1RBREVGOworCisgICAgI2lmIDAKKyAgICByZXRDb2RlID13bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX1NUQV9JRCwgc3RhTWFjLCAmY2ZnKTsKKyAgICBpZiAocmV0Q29kZSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgZ2V0IEJTU0lEIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBTVEEgTUFDXG4iKSk7CisgICAgICAgIHJldHVybiByZXRDb2RlOworICAgICAgICB9CisgICAgI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICBzaXJDb3B5TWFjQWRkcihzdGFNYWMscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0KKyAgICAgICAgcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSAmcEFkZFN0YVBhcmFtcywgc2l6ZW9mKCB0QWRkU3RhUGFyYW1zICkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBBRERfU1RBXG4iICkpOworICAgICAgICByZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQWRkU3RhUGFyYW1zLCBzaXplb2YodEFkZFN0YVBhcmFtcykpOworCisgICAgLy8vIEFkZCBTVEEgY29udGV4dCBhdCBNQUMgSFcgKEJNVSwgUkhQICYgVEZQKQorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBBZGRTdGFQYXJhbXMtPnN0YU1hYywKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHN0YU1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQWRkU3RhUGFyYW1zLT5ic3NJZCwKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICBwQWRkU3RhUGFyYW1zLT5hc3NvY0lkID0gcHNlc3Npb25FbnRyeS0+bGltQUlEOworICAgIHBBZGRTdGFQYXJhbXMtPnN0YVR5cGUgPSBTVEFfRU5UUllfU0VMRjsKKyAgICBwQWRkU3RhUGFyYW1zLT5zdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHBBZGRTdGFQYXJhbXMtPnJlc3BSZXFkID0gMTsKKworICAgIC8qIFVwZGF0ZSAgUEUgc2Vzc2lvbiBJRCAqLworICAgIHBBZGRTdGFQYXJhbXMtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIAorICAvLyBUaGlzIHdpbGwgaW5kaWNhdGUgSEFMIHRvICJhbGxvY2F0ZSIgYSBuZXcgU1RBIGluZGV4CisgICAgcEFkZFN0YVBhcmFtcy0+c3RhSWR4ID0gc3RhSWR4OworICAgIHBBZGRTdGFQYXJhbXMtPnVwZGF0ZVN0YSA9IHVwZGF0ZVN0YTsKKworICAgIHBBZGRTdGFQYXJhbXMtPnNob3J0UHJlYW1ibGVTdXBwb3J0ZWQgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGU7CisgICAgbGltUG9wdWxhdGVPd25SYXRlU2V0KHBNYWMsICZwQWRkU3RhUGFyYW1zLT5zdXBwb3J0ZWRSYXRlcywgTlVMTCwgZmFsc2UscHNlc3Npb25FbnRyeSk7CisKKyAgICBpZiggcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KQorICAgIHsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+aHRDYXBhYmxlID0gcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5OworI2lmZGVmIERJU0FCTEVfR0ZfRk9SX0lOVEVST1AKKyAgICAgICAgLyoKKyAgICAgICAgICogVG8gcmVzb2x2ZSB0aGUgaW50ZXJvcCBwcm9ibGVtIHdpdGggQnJvYWRjb20gQVAsIAorICAgICAgICAgKiB3aGVyZSBUUSBTVEEgY291bGQgbm90IHBhc3MgdHJhZmZpYyB3aXRoIEdGIGVuYWJsZWQsCisgICAgICAgICAqIFRRIFNUQSB3aWxsIGRvIEdyZWVuZmllbGQgb25seSB3aXRoIFRRIEFQLCBmb3IgCisgICAgICAgICAqIGV2ZXJ5Ym9keSBlbHNlIGl0IHdpbGwgYmUgdHVybmVkIG9mZi4KKyAgICAgICAgKi8KKyAgICAgICAgaWYoIChwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcSAhPSBOVUxMKSAmJiAoIXBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5hbmlJbmRpY2F0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCIgVHVybmluZyBvZmYgR3JlZW5maWVsZCwgd2hlbiBhZGRpbmcgc2VsZiBlbnRyeSIpKTsKKyAgICAgICAgICAgIHBBZGRTdGFQYXJhbXMtPmdyZWVuRmllbGRDYXBhYmxlID0gV05JX0NGR19HUkVFTkZJRUxEX0NBUEFCSUxJVFlfRElTQUJMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+Z3JlZW5GaWVsZENhcGFibGUgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9HUkVFTkZJRUxELCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+dHhDaGFubmVsV2lkdGhTZXQgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9TVVBQT1JURURfQ0hBTk5FTF9XSURUSF9TRVQsIHBzZXNzaW9uRW50cnkpOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5taW1vUFMgICAgICAgICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX01JTU9fUE9XRVJfU0FWRSwgcHNlc3Npb25FbnRyeSApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5yaWZzTW9kZSAgICAgICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1JJRlNfTU9ERSwgcHNlc3Npb25FbnRyeSApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5sc2lnVHhvcFByb3RlY3Rpb24gPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9MU0lHX1RYT1BfUFJPVEVDVElPTiwgcHNlc3Npb25FbnRyeSApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5kZWxCQVN1cHBvcnQgICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX0RFTEFZRURfQkEsIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+bWF4QW1wZHVEZW5zaXR5ICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9NUERVX0RFTlNJVFksIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+bWF4QW1wZHVTaXplICAgPSBsaW1HZXRIVENhcGFiaWxpdHkocE1hYywgZUhUX01BWF9SWF9BTVBEVV9GQUNUT1IsIHBzZXNzaW9uRW50cnkpOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5tYXhBbXNkdVNpemUgICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX01BWF9BTVNEVV9MRU5HVEgsIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+ZkRzc3NDY2tNb2RlNDBNaHogPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9EU1NTX0NDS19NT0RFXzQwTUhaLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+ZlNob3J0R0kyME1oeiAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9TSE9SVF9HSV8yME1IWiwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPmZTaG9ydEdJNDBNaHogICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfU0hPUlRfR0lfNDBNSFosIHBzZXNzaW9uRW50cnkpOworI2Vsc2UKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+Z3JlZW5GaWVsZENhcGFibGUgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9HUkVFTkZJRUxEICk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPnR4Q2hhbm5lbFdpZHRoU2V0ID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfU1VQUE9SVEVEX0NIQU5ORUxfV0lEVEhfU0VUICk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPm1pbW9QUyAgICAgICAgICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfTUlNT19QT1dFUl9TQVZFICk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPnJpZnNNb2RlICAgICAgICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfUklGU19NT0RFICk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPmxzaWdUeG9wUHJvdGVjdGlvbiA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX0xTSUdfVFhPUF9QUk9URUNUSU9OICk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPmRlbEJBU3VwcG9ydCAgICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfREVMQVlFRF9CQSApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5tYXhBbXBkdURlbnNpdHkgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX01QRFVfREVOU0lUWSApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5tYXhBbXBkdVNpemUgICA9IGxpbUdldEhUQ2FwYWJpbGl0eShwTWFjLCBlSFRfTUFYX1JYX0FNUERVX0ZBQ1RPUik7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPm1heEFtc2R1U2l6ZSAgICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfTUFYX0FNU0RVX0xFTkdUSCApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5mRHNzc0Nja01vZGU0ME1oeiA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX0RTU1NfQ0NLX01PREVfNDBNSFopOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5mU2hvcnRHSTIwTWh6ICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1NIT1JUX0dJXzIwTUhaKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+ZlNob3J0R0k0ME1oeiAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9TSE9SVF9HSV80ME1IWik7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTCwgJmxpc3RlbkludGVydmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDb3VsZG4ndCBnZXQgTElTVEVOX0lOVEVSVkFMXG4iKSk7CisgICAgcEFkZFN0YVBhcmFtcy0+bGlzdGVuSW50ZXJ2YWwgPSAodEFOSV9VMTYpbGlzdGVuSW50ZXJ2YWw7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgaWYgKFZPU19QMlBfQ0xJRU5UX01PREUgPT0gcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hKQorICAgIHsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+cDJwQ2FwYWJsZVN0YSA9IDE7ICAgICAgIAorICAgIH0KKyNlbmRpZgorCisgICAgbGltRmlsbFN1cHBvcnRlZFJhdGVzSW5mbyhwTWFjLCBOVUxMLCAmcEFkZFN0YVBhcmFtcy0+c3VwcG9ydGVkUmF0ZXMscHNlc3Npb25FbnRyeSk7CisKKyAgICBtc2dRLnR5cGUgPSBXREFfQUREX1NUQV9SRVE7CisgIC8vCisgIC8vIEZJWE1FX0dFTjQKKyAgLy8gQSBnbG9iYWwgY291bnRlciAoZGlhbG9nIHRva2VuKSBpcyByZXF1aXJlZCB0byBrZWVwIHRyYWNrIG9mCisgIC8vIGFsbCBQRSA8LT4gSEFMIGNvbW11bmljYXRpb24ocykKKyAgLy8KKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwQWRkU3RhUGFyYW1zOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCAiU2VuZGluZyBTSVJfSEFMX0FERF9TVEFfUkVRLi4uIChhaWQgJWQpIiApLAorICAgICAgICAgIHBBZGRTdGFQYXJhbXMtPmFzc29jSWQpOworICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKworICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiUG9zdGluZyBBRERfU1RBX1JFUSB0byBIQUwgZmFpbGVkLCByZWFzb249JVhcbiIpLCByZXRDb2RlICk7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKXBBZGRTdGFQYXJhbXMpOworICAgIH0KKyAgICAgIHJldHVybiByZXRDb2RlOworfQorCisKKy8qKgorICogbGltVGVhcmRvd25JbmZyYUJTUygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHZhcmlvdXMgTElNIGZ1bmN0aW9ucyB0byB0ZWFyZG93bgorICogYW4gZXN0YWJsaXNoZWQgSW5mcmFzdHJ1Y3R1cmUgQlNTCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1UZWFyZG93bkluZnJhQnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyTWFjQWRkciAgIGJjQWRkciA9IHsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2VuZCBCcm9hZGNhc3QgRGlzYXNzb2NpYXRlIGZyYW1lIHdpdGgKKyAgICAgICAgICogJ2xlYXZpbmcgQlNTJyByZWFzb24uCisgICAgICAgICAqLworICAgICAgICBsaW1TZW5kRGlzYXNzb2NNZ210RnJhbWUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX0RJU0FTU09DX0xFQVZJTkdfQlNTX1JFQVNPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjQWRkcixwc2Vzc2lvbkVudHJ5KTsKK30gLyoqKiBlbmQgbGltVGVhcmRvd25JbmZyYUJzcygpICoqKi8KKworCisvKioKKyAqIGxpbUhhbmRsZUNuZldhaXRUaW1lb3V0KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSB0byBoYW5kbGUKKyAqIHZhcmlvdXMgY29uZmlybWF0aW9uIGZhaWx1cmUgY2FzZXMuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBTdGFEcyAtIFBvaW50ZXIgdG8gYSBzdGEgZGVzY3JpcHRvcgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1IYW5kbGVDbmZXYWl0VGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBzdGFJZCkKK3sKKyAgICB0cERwaEhhc2hOb2RlICAgICAgIHBTdGFEczsKKyAgICB0TGltU3lzdGVtUm9sZSBzeXN0ZW1Sb2xlOworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSBOVUxMOworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgcE1hYy0+bGltLmxpbVRpbWVycy5ncExpbUNuZldhaXRUaW1lcltzdGFJZF0uc2Vzc2lvbklkKSk9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLEZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSURcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzeXN0ZW1Sb2xlID0gbGltR2V0U3lzdGVtUm9sZShwc2Vzc2lvbkVudHJ5KTsKKyAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgc3RhSWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgIGlmIChwU3RhRHMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIk5vIFNUQSBjb250ZXh0IGluIFNJUl9MSU1fQ05GX1dBSVRfVElNRU9VVC5cbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSkgeworICAgICAgICBjYXNlIGVMSU1fTUxNX1dUX0FTU09DX0NORl9TVEFURToKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkRpZCBub3QgcmVjZWl2ZSBBc3NvYyBDbmYgaW4gZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFIHN0YSBBc3NvYyBpZCAlZFxuIiksIHBTdGFEcy0+YXNzb2NJZCk7KQorICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgTE9HVyk7CisKKyAgICAgICAgICAgIGlmICggKHN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKXx8IChzeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1SZWplY3RBc3NvY2lhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+c3RhQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuc3ViVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmFzc29jSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodFNpclJlc3VsdENvZGVzKSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJSZWNlaXZlZCBDTkZfV0FJVF9USU1FT1VUIGluIHN0YXRlICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpOworICAgIH0KK30KKworCisvKioKKyAqIGxpbURlbGV0ZURwaEhhc2hFbnRyeSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIHdlIG5lZWQgdG8gZGVsZXRlCisgKiB0aGUgZHBoIGhhc2ggZW50cnkKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgdEFOSV9VMTYgICAgICAgc3RhSWQKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbURlbGV0ZURwaEhhc2hFbnRyeSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBzdGFBZGRyLCB0QU5JX1UxNiBzdGFJZCx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICBhaWQ7CisgICAgdHBEcGhIYXNoTm9kZSAgICBwU3RhRHM7CisgICAgdFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25QYXJhbXM7ICAgIAorICAgIHRMaW1TeXN0ZW1Sb2xlIHN5c3RlbVJvbGU7CisKKyAgICBiZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXAgPSAwOworICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VQZXJTdGFJZFRpbWVyKHBNYWMsIGVMSU1fQ05GX1dBSVRfVElNRVIsIHN0YUlkKTsKKyAgICBpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiTlVMTCBwc2Vzc2lvbkVudHJ5IikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzeXN0ZW1Sb2xlID0gbGltR2V0U3lzdGVtUm9sZShwc2Vzc2lvbkVudHJ5KTsKKyAgICBiZWFjb25QYXJhbXMuYnNzSWR4ID0gcHNlc3Npb25FbnRyeS0+YnNzSWR4OworICAgIHBTdGFEcyA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBzdGFBZGRyLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgaWYgKHBTdGFEcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkRlbGV0aW5nIERQSCBIYXNoIGVudHJ5IGZvciBTVEFJRDogJVhcbiAiKSwgc3RhSWQpOykKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBzdGF0aW9uIGNvdW50IGFuZCBwZXJmb3JtIGFzc29jaWF0ZWQgYWN0aW9ucworICAgICAgICAvLyBkbyB0aGlzIGJlZm9yZSBkZWxldGluZyB0aGUgZHBoIGhhc2ggZW50cnkKKyAgICAgICAgbGltVXRpbENvdW50U3RhRGVsKHBNYWMsIHBTdGFEcywgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgaWYoKGVMSU1fQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKSB8fAorICAgICAgICAgICAgICAoZUxJTV9TVEFfSU5fSUJTU19ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpKQorICAgICAgICB7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKXsKKyAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0gV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKXsKKyAgICAgICAgICAgICAgICBsaW1EZWNpZGVBcFByb3RlY3Rpb25PbkRlbGV0ZShwTWFjLCBwU3RhRHMsICZiZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmICAgICAgICAgCisKKyAgICAgICAgICAgIGlmKGVMSU1fU1RBX0lOX0lCU1NfUk9MRSA9PSBzeXN0ZW1Sb2xlKQorICAgICAgICAgICAgICAgIGxpbUlic3NEZWNpZGVQcm90ZWN0aW9uT25EZWxldGUocE1hYywgcFN0YURzLCAmYmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgbGltRGVjaWRlU2hvcnRQcmVhbWJsZShwTWFjLCBwU3RhRHMsICZiZWFjb25QYXJhbXMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgbGltRGVjaWRlU2hvcnRTbG90KHBNYWMsIHBTdGFEcywgJmJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgIC8vU2VuZCBtZXNzYWdlIHRvIEhBTCBhYm91dCBiZWFjb24gcGFyYW1ldGVyIGNoYW5nZS4KKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoInBhcmFtIGJpdG1hcCA9ICVkIFxuIiksIGJlYWNvblBhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcCk7KQorICAgICAgICAgICAgaWYoYmVhY29uUGFyYW1zLnBhcmFtQ2hhbmdlQml0bWFwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMscHNlc3Npb25FbnRyeSk7ICAgIAorICAgICAgICAgICAgICAgIGxpbVNlbmRCZWFjb25QYXJhbXMocE1hYywgJmJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkcGhEZWxldGVIYXNoRW50cnkocE1hYywgc3RhQWRkciwgc3RhSWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiZXJyb3IgZGVsZXRpbmcgaGFzaCBlbnRyeVxuIikpOworICAgIH0KK30KKworCisKKy8qKgorICogbGltQ2hlY2tBbmRBbm5vdW5jZUpvaW5TdWNjZXNzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiByZWNlaXZpbmcgQmVhY29uL1Byb2JlIFJlc3BvbnNlCisgKiBmcmFtZSBpbiBXVF9KT0lOX0JFQUNPTl9TVEFURSB0byBjaGVjayBpZiB0aGUgcmVjZWl2ZWQKKyAqIEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBpcyBmcm9tIHRoZSBCU1MgdGhhdCB3ZSdyZSBhdHRlbXB0aW5nCisgKiB0byBqb2luLgorICoKKyAqTE9HSUM6CisgKiBJZiB0aGUgQmVhY29uL1Byb2JlIFJlc3BvbnNlIGlzIGluZGVlZCBmcm9tIHRoZSBCU1Mgd2UncmUKKyAqIGF0dGVtcHRpbmcgdG8gam9pbiwgam9pbiBzdWNjZXNzIGlzIHNlbnQgdG8gU01FLgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEJQUiAgICAgIFBvaW50ZXIgdG8gcmVjZWl2ZWQgQmVhY29uL1Byb2JlIFJlc3BvbnNlCisgKiBAcGFyYW0gIHBIZHIgICAgICBQb2ludGVyIHRvIHJlY2VpdmVkIEJlYWNvbi9Qcm9iZSBSZXNwb25zZQorICogICAgICAgICAgICAgICAgICAgTUFDIGhlYWRlcgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltQ2hlY2tBbmRBbm5vdW5jZUpvaW5TdWNjZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclByb2JlUmVzcEJlYWNvbiAqcEJQUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpck1hY01nbXRIZHIgcEhkcix0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJNYWNTU2lkICAgICAgICAgIGN1cnJlbnRTU0lEOworICAgIHRMaW1NbG1Kb2luQ25mICAgICAgIG1sbUpvaW5DbmY7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBjdXJyZW50U1NJRC5zc0lkLAorICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNzSWQubGVuZ3RoKTsKKyAgIAorICAgIGN1cnJlbnRTU0lELmxlbmd0aCA9ICh0QU5JX1U4KXBzZXNzaW9uRW50cnktPnNzSWQubGVuZ3RoIDsKKworICAgIGlmICgKKyAgICAgICAgLyogQ2hlY2sgZm9yIFNTSUQgb25seSBpbiBwcm9iZSByZXNwb25zZS4gQmVhY29ucyBtYXkgbm90IGNhcnJ5CisgICAgICAgICAgIFNTSUQgaW5mb3JtYXRpb24gaW4gaGlkZGVuIFNTSUQgY2FzZSAqLworICAgICAgICAoIChTSVJfTUFDX01HTVRfRlJBTUUgID09IHBIZHItPmZjLnR5cGUpICYmCisgICAgICAgICAgKFNJUl9NQUNfTUdNVF9QUk9CRV9SU1AgPT0gcEhkci0+ZmMuc3ViVHlwZSkgKSAmJgorICAgICAgICBjdXJyZW50U1NJRC5sZW5ndGggJiYKKyAgICAgICAgKCFwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwodEFOSV9VOCAqKSAmcEJQUi0+c3NJZCwKKyAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmY3VycmVudFNTSUQsCisgICAgICAgICAgICAgICAgICAgKHRBTklfVTgpICgxICsgY3VycmVudFNTSUQubGVuZ3RoKSkgKSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWNlaXZlZCBTU0lEIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIG9uZSB3ZSd2ZS4KKyAgICAgICAgICogSWdub3JlIHJlY2VpdmVkIEJlYWNvbiBmcmFtZQorICAgICAgICAgKi8KKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU1NJRCByZWNlaXZlZCBpbiBCZWFjb24gZG9lcyBub3QgbWF0Y2hcbiIpKTspCisjaWZkZWYgV0xBTl9ERUJVRyAgICAgICAgICAgIAorICAgICAgICBwTWFjLT5saW0uZ0xpbUJjblNTSURNaXNtYXRjaENudCsrOworI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiggKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpfHwocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKSkKKyAgICB7CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIEJlYWNvbi9QUiB3aXRoIG1hdGNoaW5nIEJTU0lEXG4iKSk7KQorCisgICAgICAgIC8vIERlYWN0aXZhdGUgSm9pbiBGYWlsdXJlIHRpbWVyCisgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0pPSU5fRkFJTF9USU1FUik7CisKKyAgICAgICAgLy8gVXBkYXRlIEJlYWNvbiBJbnRlcnZhbCBhdCBDRkcgZGF0YWJhc2UKKworICAgICAgICBpZiAoIHBCUFItPkhUQ2Fwcy5wcmVzZW50ICkKKyAgICAgICAgICAgIGxpbVVwZGF0ZVN0YVJ1blRpbWVIVENhcGFiaWxpdHkoIHBNYWMsICZwQlBSLT5IVENhcHMgKTsKKyAgICAgICAgaWYgKCBwQlBSLT5IVEluZm8ucHJlc2VudCApCisgICAgICAgICAgICBsaW1VcGRhdGVTdGFSdW5UaW1lSFRJbmZvKCBwTWFjLCAmcEJQUi0+SFRJbmZvLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9KT0lORURfU1RBVEU7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgZUxJTV9NTE1fSk9JTkVEX1NUQVRFKSk7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICAgICAgLy8gSW4gY2FzZSBvZiBCUCwgd2UgbmVlZCB0byBhZG9wdCB0byBhbGwgcmF0ZXMKKyAgICAgICAgLy8gYWR2ZXJ0aXNlZCBieSBBUC4gVXBkYXRlIHRoZSBvcGVyYXRpb25hbCByYXRlcyBhdCBDRkcKKyAgICBpZiAoY2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnBCUFItPnN1cHBvcnRlZFJhdGVzLnJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgcEJQUi0+c3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXMpCisgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCB1cGRhdGUgT3Blci5yYXRlcyBhdCBDRkdcbiIpKTsKKyAgICAgICAKKyNlbmRpZgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbm5vdW5jZSBqb2luIHN1Y2Nlc3MgYnkgc2VuZGluZworICAgICAgICAgKiBKb2luIGNvbmZpcm0gdG8gU01FLgorICAgICAgICAgKi8KKyAgICAgICAgbWxtSm9pbkNuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICAgICAgbWxtSm9pbkNuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTOworICAgICAgICAvKiBVcGRhdGUgUEUgc2Vzc2lvbklkKi8KKyAgICAgICAgbWxtSm9pbkNuZi5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywgTElNX01MTV9KT0lOX0NORiwgKHRBTklfVTMyICopICZtbG1Kb2luQ25mKTsKKyAgICB9IC8vIGlmICgocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IElCU1MuLi4uCit9CisKKy8qKgorICogbGltRXh0cmFjdEFwQ2FwYWJpbGl0aWVzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZXh0cmFjdCBhbGwgb2YgdGhlIEFQJ3MgY2FwYWJpbGl0aWVzCisgKiBmcm9tIHRoZSBJRXMgcmVjZWl2ZWQgZnJvbSBpdCBpbiBCZWFjb24vUHJvYmUgUmVzcG9uc2UgZnJhbWVzCisgKgorICpMT0dJQzoKKyAqIFRoaXMgcm91dGluZSBtaW1pY3MgdGhlIGxpbUV4dHJhY3RBcENhcGFiaWxpdHkoKSBBUEkuIFRoZSBkaWZmZXJlbmNlIGhlcmUKKyAqIGlzIHRoYXQgdGhpcyBBUEkgcmV0dXJucyB0aGUgZW50aXJlIHRTaXJQcm9iZVJlc3BCZWFjb24gaW5mbyBhcyBpcy4gSXQgaXMKKyAqIGxlZnQgdG8gdGhlIGNhbGxlciBvZiB0aGlzIEFQSSB0byB1c2UgdGhpcyBpbmZvIGFzIHJlcXVpcmVkCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICBwSUUgICAgICAgICAgUG9pbnRlciB0byBzdGFydGluZyBJRSBpbiBCZWFjb24vUHJvYmUgUmVzcG9uc2UKKyAqIEBwYXJhbSAgIGllTGVuICAgICAgICBMZW5ndGggb2YgYWxsIElFcyBjb21iaW5lZAorICogQHBhcmFtICAgYmVhY29uU3RydWN0IEEgcG9pbnRlciB0byB0U2lyUHJvYmVSZXNwQmVhY29uIHRoYXQgbmVlZHMgdG8gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZWQKKyAqIEByZXR1cm4gIHN0YXR1cyAgICAgICBBIHN0YXR1cyByZXBvcnRpbmcgZVNJUl9TVUNDRVNTIG9yIGVTSVJfRkFJTFVSRQorICovCit0U2lyUmV0U3RhdHVzIGxpbUV4dHJhY3RBcENhcGFiaWxpdGllcyggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0QU5JX1U4ICpwSUUsCisgICAgdEFOSV9VMTYgaWVMZW4sCisgICAgdHBTaXJQcm9iZVJlc3BCZWFjb24gYmVhY29uU3RydWN0ICkKK3sKKyAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgYmVhY29uU3RydWN0LCBzaXplb2YoIHRTaXJQcm9iZVJlc3BCZWFjb24gKSk7CisKKyAgUEVMT0czKGxpbUxvZyggcE1hYywgTE9HMywKKyAgICAgIEZMKCAiSW4gbGltRXh0cmFjdEFwQ2FwYWJpbGl0aWVzOiBUaGUgSUUncyBiZWluZyByZWNlaXZlZCBhcmU6XG4iICkpOworICBzaXJEdW1wQnVmKCBwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMywgcElFLCBpZUxlbiApOykKKworICAvLyBQYXJzZSB0aGUgQmVhY29uIElFJ3MsIERvbid0IHRyeSB0byBwYXJzZSBpZiB3ZSBkb250IGhhdmUgYW55dGhpbmcgaW4gSUUKKyAgaWYgKGllTGVuID4gMCkgeworICBpZiggZVNJUl9TVUNDRVNTICE9IHNpclBhcnNlQmVhY29uSUUoIHBNYWMsIGJlYWNvblN0cnVjdCwgcElFLCAodEFOSV9VMzIpaWVMZW4gKSkKKyAgeworICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkFQQ2FwRXh0cmFjdDogQmVhY29uIHBhcnNpbmcgZXJyb3IhXG4iKSk7CisgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgfQorICB9CisKKyAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworCisvKioKKyAqIGxpbURlbEJzcygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBCU1MgY29udGV4dCBhdCBoYXJkd2FyZQorICogd2hlbmV2ZXIgYSBTVEEgaXMgZGlzYXNzb2NpYXRlZAorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBTdGFEcyAgLSBQb2ludGVyIHRvIHRoZSBTVEEgZGF0YXN0cnVjdHVyZSBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICBMSU0gYW5kIG1haW50YWluZWQgYnkgRFBICisgKiBAcmV0dXJuIHJldENvZGUgLSBJbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlIHJldHVybiBjb2RlCisgKi8KKwordFNpclJldFN0YXR1cworbGltRGVsQnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YURzLCB0QU5JX1UxNiBic3NJZHgsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0cERlbGV0ZUJzc1BhcmFtcyBwRGVsQnNzUGFyYW1zID0gTlVMTDsKKyAgICB0U2lyTXNnUSBtc2dROworICAgIHRTaXJSZXRTdGF0dXMgICAgIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICAgCisgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAgIHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikgJnBEZWxCc3NQYXJhbXMsIHNpemVvZiggdERlbGV0ZUJzc1BhcmFtcyApKSkKKyAgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCAiVW5hYmxlIHRvIFBBTCBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIEFERF9CU1NcbiIgKSk7CisgICAgICAgIHJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgIH0KKyAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcERlbEJzc1BhcmFtcywgc2l6ZW9mKHREZWxldGVCc3NQYXJhbXMpKTsKKworCisgICAgcERlbEJzc1BhcmFtcy0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7IC8vdXBkYXRlIFBFIHNlc3Npb24gSWQKKworICAgIC8vRFBIIHdhcyBzdG9yaW5nIHRoZSBBc3NvY0lEIGluIHN0YUlEIGZpZWxkLAorICAgIC8vc3RhSUQgaXMgYWN0dWFsbHkgYXNzaWduZWQgYnkgSEFMIHdoZW4gQWRkU1RBIG1lc3NhZ2UgaXMgc2VudC4KKyAgICBpZiAocFN0YURzICE9IE5VTEwpCisgICAgeworICAgICAgICBwRGVsQnNzUGFyYW1zLT5ic3NJZHg9IHBTdGFEcy0+YnNzSWQ7CisgICAgICAgIHBTdGFEcy0+dmFsaWQgICAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0RFTF9CU1NfUlNQX1NUQVRFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBEZWxCc3NQYXJhbXMtPmJzc0lkeCAgICAgICAgICA9IGJzc0lkeDsKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0RFTF9CU1NfUlNQX1NUQVRFOworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgZUxJTV9NTE1fV1RfREVMX0JTU19SU1BfU1RBVEUpKTsKKworICAgIHBEZWxCc3NQYXJhbXMtPnN0YXR1cz0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICBwRGVsQnNzUGFyYW1zLT5yZXNwUmVxZCA9IDE7CisgICBQRUxPR1cobGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiU2VuZGluZyBIQUxfREVMRVRFX0JTU19SRVEgZm9yIEJTU0lEOiAlWFxuIiksCisgICAgICAgICAgcERlbEJzc1BhcmFtcy0+YnNzSWR4KTspCisKKyAgICAvL3dlIG5lZWQgdG8gZGVmZXIgdGhlIG1lc3NhZ2UgdW50aWwgd2UgZ2V0IHRoZSByZXNwb25zZSBiYWNrIGZyb20gSEFMLgorICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKworICAgIG1zZ1EudHlwZSA9IFdEQV9ERUxFVEVfQlNTX1JFUTsKKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwRGVsQnNzUGFyYW1zOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gKHJldENvZGUgPSB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKSkpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJQb3N0aW5nIERFTEVURV9CU1NfUkVRIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWFxuIiksIHJldENvZGUgKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopcERlbEJzc1BhcmFtcyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldENvZGU7Cit9CisKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UCisKKy8qKgorICogbGltU2VuZEFkZEJzcygpCisgKgorICpGVU5DVElPTjoKKyAqCisgKkxPR0lDOgorICogMSkgTElNIHJlY2VpdmVzIGVXTklfU01FX0pPSU5fUkVRCisgKiAyKSBGb3IgYSB2YWxpZCBlV05JX1NNRV9KT0lOX1JFUSwgTElNIHNlbmRzCisgKiBTSVJfSEFMX0FERF9CU1NfUkVRIHRvIEhBTAorICoKKyAqQVNTVU1QVElPTlM6CisgKiBKT0lOIFJFUSBwYXJhbWV0ZXJzIGFyZSBzYXZlZCBpbiBwTWFjLT5saW0uZ0xpbU1sbUpvaW5SZXEKKyAqIEFERCBCU1MgcGFyYW1ldGVycyBjYW4gYmUgb2J0YWluZWQgZnJvbSB0d28gc291cmNlczoKKyAqIDEpIHBNYWMtPmxpbS5nTGltTWxtSm9pblJlcQorICogMikgYmVhY29uU3RydWN0LCBwYXNzZWQgYXMgcGFyYW10ZXIKKyAqIFNvLCBpZiBhIHJlcWQgcGFyYW1ldGVyIGlzIGZvdW5kIGluIGJzc0Rlc2NyaXB0aW9ucworICogdGhlbiBpdCBpcyBnaXZlbiBwcmVmZXJlbmNlIG92ZXIgYmVhY29uU3RydWN0CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiAgICAgICAgICAgICAgcEFzc29jUnNwICAgIGNvbnRhaW5zIHRoZSBzdHJ1Y3R1cmVkIGFzc29jL3JlYXNzb2MgUmVzcG9uc2UgZ290IGZyb20gQVAKKyAqICAgICAgICAgICAgICBiZWFjb25zdHJ1Y3QgICAgICAgIEhhcyB0aGUgUHJvYmVSc3AvQmVhY29uIHN0cnVjdHVyZWQgZGV0YWlscworICogICAgICAgICAgICAgIGJzc0Rlc2NyaXB0aW9uICAgICAgYnNzRGVzY3JpcHRpb24gcGFzc2VkIHRvIFBFIGZyb20gdGhlIFNNRQorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cyBsaW1TdGFTZW5kQWRkQnNzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpckFzc29jUnNwIHBBc3NvY1JzcCwKKyAgICB0cFNjaEJlYWNvblN0cnVjdCBwQmVhY29uU3RydWN0LCB0cFNpckJzc0Rlc2NyaXB0aW9uIGJzc0Rlc2NyaXB0aW9uLCB0QU5JX1U4IHVwZGF0ZUVudHJ5LAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCisKK3sKKyAgICB0U2lyTXNnUSBtc2dROworICAgIHRwQWRkQnNzUGFyYW1zIHBBZGRCc3NQYXJhbXMgPSBOVUxMOworICAgIHRBTklfVTMyIHJldENvZGU7CisgICAgdEFOSV9VOCBpOworICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzID0gTlVMTDsKKyAgICB0QU5JX1U4IGNoYW5XaWR0aFN1cHAgPSAwOworICAgIC8vIFBhY2thZ2UgU0lSX0hBTF9BRERfQlNTX1JFUSBtZXNzYWdlIHBhcmFtZXRlcnMKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopICZwQWRkQnNzUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRBZGRCc3NQYXJhbXMgKSkpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgRkwoICJVbmFibGUgdG8gUEFMIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgQUREX0JTU1xuIiApKTsKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgICAgZ290byByZXR1cm5GYWlsdXJlOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBBZGRCc3NQYXJhbXMsIHNpemVvZiggdEFkZEJzc1BhcmFtcyApKTsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICBwQWRkQnNzUGFyYW1zLT5ic3NJZCxic3NEZXNjcmlwdGlvbi0+YnNzSWQsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0U2lyTWFjQWRkciApKTsKKyAgICAvLyBGaWxsIGluIHRBZGRCc3NQYXJhbXMgc2VsZk1hY0FkZHIKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAgcEFkZEJzc1BhcmFtcy0+c2VsZk1hY0FkZHIsIAorICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgIHNpemVvZiggdFNpck1hY0FkZHIgKSk7CisgICAgCisgICAgaWYocHNlc3Npb25FbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX0FQX01PREUpCisgICAgeworICAgICAgICAgcEFkZEJzc1BhcmFtcy0+YnNzVHlwZSA9IGVTSVJfQlRBTVBfQVBfTU9ERTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+YnNzVHlwZSA9IGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERTsKKyAgICB9CisgICAgCisgICAgcEFkZEJzc1BhcmFtcy0+b3Blck1vZGUgPSBCU1NfT1BFUkFUSU9OQUxfTU9ERV9TVEE7CisKKyAgICAvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJRCAqLworICAgIHBBZGRCc3NQYXJhbXMtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisgICAgcEFkZEJzc1BhcmFtcy0+YmVhY29uSW50ZXJ2YWwgPSBic3NEZXNjcmlwdGlvbi0+YmVhY29uSW50ZXJ2YWw7CisgICAgCisgICAgcEFkZEJzc1BhcmFtcy0+ZHRpbVBlcmlvZCA9IHBCZWFjb25TdHJ1Y3QtPnRpbS5kdGltUGVyaW9kOworICAgIHBBZGRCc3NQYXJhbXMtPnVwZGF0ZUJzcyA9IHVwZGF0ZUVudHJ5OworCisKKyAgICBwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcENvdW50ID0gcEJlYWNvblN0cnVjdC0+Y2ZQYXJhbVNldC5jZnBDb3VudDsKKyAgICBwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcFBlcmlvZCA9IHBCZWFjb25TdHJ1Y3QtPmNmUGFyYW1TZXQuY2ZwUGVyaW9kOworICAgIHBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwTWF4RHVyYXRpb24gPSBwQmVhY29uU3RydWN0LT5jZlBhcmFtU2V0LmNmcE1heER1cmF0aW9uOworICAgIHBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwRHVyUmVtYWluaW5nID0gcEJlYWNvblN0cnVjdC0+Y2ZQYXJhbVNldC5jZnBEdXJSZW1haW5pbmc7CisKKyAgICBwQWRkQnNzUGFyYW1zLT5yYXRlU2V0Lm51bVJhdGVzID0gcEFzc29jUnNwLT5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlczsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAgcEFkZEJzc1BhcmFtcy0+cmF0ZVNldC5yYXRlLAorICAgICAgICAgICAgICAgICAgIHBBc3NvY1JzcC0+c3VwcG9ydGVkUmF0ZXMucmF0ZSwgcEFzc29jUnNwLT5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlcyApOworCisgICAgcEFkZEJzc1BhcmFtcy0+bndUeXBlID0gYnNzRGVzY3JpcHRpb24tPm53VHlwZTsKKyAgICAKKyAgICBwQWRkQnNzUGFyYW1zLT5zaG9ydFNsb3RUaW1lU3VwcG9ydGVkID0gKHRBTklfVTgpcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5zaG9ydFNsb3RUaW1lOyAgICAKKyAgICBwQWRkQnNzUGFyYW1zLT5sbGFDb2V4aXN0ID0gKHRBTklfVTgpIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGFDb2V4aXN0OyAgICAKKyAgICBwQWRkQnNzUGFyYW1zLT5sbGJDb2V4aXN0ID0gKHRBTklfVTgpIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0OworICAgIHBBZGRCc3NQYXJhbXMtPmxsZ0NvZXhpc3QgPSAodEFOSV9VOCkgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsZ0NvZXhpc3Q7CisgICAgcEFkZEJzc1BhcmFtcy0+aHQyMENvZXhpc3QgPSAodEFOSV9VOCkgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmh0MjBDb2V4aXN0OyAgIAorCisKKyAgICAvLyBVc2UgdGhlIGFkdmVydGlzZWQgY2FwYWJpbGl0aWVzIGZyb20gdGhlIHJlY2VpdmVkIGJlYWNvbi9QUgorCisKKyAgICBpZiAoSVNfRE9UMTFfTU9ERV9IVChwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUpICYmICggcEFzc29jUnNwLT5IVENhcHMucHJlc2VudCApKQorICAgIHsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+aHRDYXBhYmxlID0gcEFzc29jUnNwLT5IVENhcHMucHJlc2VudDsKKworICAgICAgICBpZiAoIHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5wcmVzZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+aHRPcGVyTW9kZSA9ICh0U2lyTWFjSFRPcGVyYXRpbmdNb2RlKXBBc3NvY1JzcC0+SFRJbmZvLm9wTW9kZTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmR1YWxDVFNQcm90ZWN0aW9uID0gKCB0QU5JX1U4ICkgcEFzc29jUnNwLT5IVEluZm8uZHVhbENUU1Byb3RlY3Rpb247CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgY2hhbldpZHRoU3VwcCA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVCwgcHNlc3Npb25FbnRyeSk7CisjZWxzZQorICAgICAgICAgICAgY2hhbldpZHRoU3VwcCA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVCk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmKCAocEFzc29jUnNwLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KSAmJgorICAgICAgICAgICAgICAgIChjaGFuV2lkdGhTdXBwKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+dHhDaGFubmVsV2lkdGhTZXQgPSAoIHRBTklfVTggKXBBc3NvY1JzcC0+SFRJbmZvLnJlY29tbWVuZGVkVHhXaWR0aFNldDsKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5jdXJyZW50RXh0Q2hhbm5lbCA9IHBBc3NvY1JzcC0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+dHhDaGFubmVsV2lkdGhTZXQgPSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisgICAgICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+Y3VycmVudEV4dENoYW5uZWwgPSBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgPSAodEFOSV9VOClwQXNzb2NSc3AtPkhUSW5mby5ub25HRkRldmljZXNQcmVzZW50OworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+ZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0gKHRBTklfVTgpcEFzc29jUnNwLT5IVEluZm8ubHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5mUklGU01vZGUgPSBwQXNzb2NSc3AtPkhUSW5mby5yaWZzTW9kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBBZGRCc3NQYXJhbXMtPmN1cnJlbnRPcGVyQ2hhbm5lbCA9IGJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQ7CisKKyAgICAvLyBQb3B1bGF0ZSB0aGUgU1RBLXJlbGF0ZWQgcGFyYW1ldGVycyBoZXJlCisgICAgLy8gTm90ZSB0aGF0IHRoZSBTVEEgaGVyZSByZWZlcnMgdG8gdGhlIEFQCisgICAgeworICAgICAgICAvKiBzdGFUeXBlID0gUEVFUiovCisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhVHlwZSA9IFNUQV9FTlRSWV9PVEhFUjsgLy8gSWRlbnRpZnlpbmcgQVAgYXMgYW4gU1RBCisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuYnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgIGJzc0Rlc2NyaXB0aW9uLT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0U2lyTWFjQWRkciApKTsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5saXN0ZW5JbnRlcnZhbCA9IGJzc0Rlc2NyaXB0aW9uLT5iZWFjb25JbnRlcnZhbDsKKworICAgICAgICAvKiBGaWxsIEFzc29jIGlkIGZyb20gdGhlIGRwaCB0YWJsZSAqLworICAgICAgICBwU3RhRHMgPSBkcGhMb29rdXBIYXNoRW50cnkocE1hYywgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5ic3NJZCwgCisgICAgICAgICAgICAgICAgJnBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuYXNzb2NJZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgICAgICBpZiAocFN0YURzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkNvdWxkbid0IGdldCBhc3NvYyBpZCBmb3IiCisgICAgICAgICAgICAgICAgICAgICAgICJNQUMgQUREUjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFNYWNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhTWFjWzFdLAorICAgICAgICAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YU1hY1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFNYWNbM10sCisgICAgICAgICAgICAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhTWFjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YU1hY1s1XQorICAgICAgICAgICAgICAgICAgICAgICApOykKKyAgICAgICAgfQorICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnVBUFNEID0gMDsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhTUExlbiA9IDA7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc2hvcnRQcmVhbWJsZVN1cHBvcnRlZCA9ICh0QU5JX1U4KXBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZTsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51cGRhdGVTdGEgPSB1cGRhdGVFbnRyeTsKKworICAgICAgICBpZiAoSVNfRE9UMTFfTU9ERV9IVChwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUpICYmICggcEJlYWNvblN0cnVjdC0+SFRDYXBzLnByZXNlbnQgKSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51czMyTWF4QW1wZHVEdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmh0Q2FwYWJsZSA9IDE7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmdyZWVuRmllbGRDYXBhYmxlICA9ICggdEFOSV9VOCApcEFzc29jUnNwLT5IVENhcHMuZ3JlZW5GaWVsZDsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubHNpZ1R4b3BQcm90ZWN0aW9uID0gKCB0QU5JX1U4IClwQXNzb2NSc3AtPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb247CisgICAgICAgICAgICBpZiggKHBBc3NvY1JzcC0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgJiYKKyAgICAgICAgICAgICAgICAoY2hhbldpZHRoU3VwcCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudHhDaGFubmVsV2lkdGhTZXQgPSAoIHRBTklfVTggKXBBc3NvY1JzcC0+SFRJbmZvLnJlY29tbWVuZGVkVHhXaWR0aFNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnR4Q2hhbm5lbFdpZHRoU2V0ID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1pbW9QUyAgICAgICAgICAgICA9ICh0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpcEFzc29jUnNwLT5IVENhcHMubWltb1Bvd2VyU2F2ZTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZGVsQkFTdXBwb3J0ICAgICAgID0gKCB0QU5JX1U4IClwQXNzb2NSc3AtPkhUQ2Fwcy5kZWxheWVkQkE7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtc2R1U2l6ZSAgICAgICA9ICggdEFOSV9VOCApcEFzc29jUnNwLT5IVENhcHMubWF4aW1hbEFNU0RVc2l6ZTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4QW1wZHVEZW5zaXR5ICAgID0gICAgICAgICAgICBwQXNzb2NSc3AtPkhUQ2Fwcy5tcGR1RGVuc2l0eTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZkRzc3NDY2tNb2RlNDBNaHogPSAodEFOSV9VOClwQXNzb2NSc3AtPkhUQ2Fwcy5kc3NzQ2NrTW9kZTQwTUh6OworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mU2hvcnRHSTIwTWh6ID0gKHRBTklfVTgpcEFzc29jUnNwLT5IVENhcHMuc2hvcnRHSTIwTUh6OworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mU2hvcnRHSTQwTWh6ID0gKHRBTklfVTgpcEFzc29jUnNwLT5IVENhcHMuc2hvcnRHSTQwTUh6OworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhBbXBkdVNpemU9IHBBc3NvY1JzcC0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3I7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBwQmVhY29uU3RydWN0LT5IVEluZm8ucHJlc2VudCApCisgICAgICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5yaWZzTW9kZSA9IHBBc3NvY1JzcC0+SFRJbmZvLnJpZnNNb2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkICYmIHBBc3NvY1JzcC0+d21lRWRjYVByZXNlbnQpIHx8CisgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQgJiYgcEFzc29jUnNwLT5lZGNhUHJlc2VudCkpCisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LndtbUVuYWJsZWQgPSAxOworICAgICAgICBlbHNlIAorICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC53bW1FbmFibGVkID0gMDsKKworICAgICAgICAvL1VwZGF0ZSB0aGUgcmF0ZXMKKworICAgICAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICAgICAgaWYgKHBTdGFEcyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1GaWxsU3VwcG9ydGVkUmF0ZXNJbmZvKHBNYWMsIHBTdGFEcywgJnBTdGFEcy0+c3VwcG9ydGVkUmF0ZXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh0QU5JX1U4KikmcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdXBwb3J0ZWRSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KikmcFN0YURzLT5zdXBwb3J0ZWRSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyU3VwcG9ydGVkUmF0ZXMpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgVXBkYXRlIHRoZSBzdXBwb3J0ZWQgcmF0ZXMuXG4iKSk7KQorCisgICAgfQorCisgICAgLy9EaXNhYmxlIEJBLiBJdCB3aWxsIGJlIHNldCBhcyBwYXJ0IG9mIEFEREJBIG5lZ290aWF0aW9uLgorICAgIGZvciggaSA9IDA7IGkgPCBTVEFDRkdfTUFYX1RDOyBpKysgKQorICAgIHsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFUQ1BhcmFtc1tpXS50eFVzZUJBICAgID0gZUJBX0RJU0FCTEU7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhVENQYXJhbXNbaV0ucnhVc2VCQSAgICA9IGVCQV9ESVNBQkxFOworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YVRDUGFyYW1zW2ldLnR4QkFwb2xpY3kgPSBlQkFfUE9MSUNZX0lNTUVESUFURTsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFUQ1BhcmFtc1tpXS5yeEJBcG9saWN5ID0gZUJBX1BPTElDWV9JTU1FRElBVEU7CisgICAgfQorCisgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5lbmNyeXB0VHlwZSA9ICBwc2Vzc2lvbkVudHJ5LT5lbmNyeXB0VHlwZTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSSAgCisgICAgcEFkZEJzc1BhcmFtcy0+bWF4VHhQb3dlciA9IHBzZXNzaW9uRW50cnktPm1heFR4UG93ZXI7CisjZW5kaWYKKyAgICAvLyBGSVhNRV9HRU40IC0gQW55IG90aGVyIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGluaXRpYWxpemF0aW9uPworICAgIHBBZGRCc3NQYXJhbXMtPnN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgcEFkZEJzc1BhcmFtcy0+cmVzcFJlcWQgPSB0cnVlOworCisgICAgcEFkZEJzc1BhcmFtcy0+aGFsUGVyc29uYSA9ICh0QU5JX1U4KXBzZXNzaW9uRW50cnktPnBlUGVyc29uYTsgLy91cGRhdGUgcGVyc29uYQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIGlmIChWT1NfUDJQX0NMSUVOVF9NT0RFID09IHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSkKKyAgICB7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQucDJwQ2FwYWJsZVN0YSA9IDE7ICAgICAgIAorICAgIH0KKyNlbmRpZgorCisgICAgcEFkZEJzc1BhcmFtcy0+YlNwZWN0cnVtTWd0RW5hYmxlZCA9IHBzZXNzaW9uRW50cnktPnNwZWN0cnVtTWd0RW5hYmxlZDsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbVZhbGlkID0gMDsKKyNlbmRpZgorCisgICAgLy8gU2V0IGEgbmV3IHN0YXRlIGZvciBNTE1FCisgICAgaWYoIGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSApCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfQVNTT0NfU1RBVEU7CisgICAgZWxzZQorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1JFQVNTT0NfU1RBVEU7CisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKyAgICAvL3dlIG5lZWQgdG8gZGVmZXIgdGhlIG1lc3NhZ2UgdW50aWwgd2UgZ2V0IHRoZSByZXNwb25zZSBiYWNrIGZyb20gSEFMLgorICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKworICAgIG1zZ1EudHlwZSA9IFdEQV9BRERfQlNTX1JFUTsKKyAgICAvKiogQFRvRG8gOiBVcGRhdGUgdGhlIEdsb2JhbCBjb3VudGVyIHRvIGtlZXB0cmFjayBvZiB0aGUgUEUgPC0tPiBIQUwgbWVzc2FnZXMqLworICAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgIG1zZ1EuYm9keXB0ciA9IHBBZGRCc3NQYXJhbXM7CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKworICAgIGxpbUxvZyggcE1hYywgTE9HMSwgRkwoICJTZW5kaW5nIFNJUl9IQUxfQUREX0JTU19SRVEuLi4iICkpOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworCisgICAgcmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApOworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkgCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBBZGRCc3NQYXJhbXMpOworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJQb3N0aW5nIEFERF9CU1NfUkVRIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWFxuIiksCisgICAgICAgICAgICAgICAgcmV0Q29kZSApOworICAgICAgICBnb3RvIHJldHVybkZhaWx1cmU7CisKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcmV0Q29kZTsKKworIHJldHVybkZhaWx1cmU6CisgICAgLy8gQ2xlYW4tdXAgd2lsbCBiZSBkb25lIGJ5IHRoZSBjYWxsZXIuLi4KKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworCisKKwordFNpclJldFN0YXR1cyBsaW1TdGFTZW5kQWRkQnNzUHJlQXNzb2MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggdXBkYXRlRW50cnksIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFNpck1zZ1EgbXNnUTsKKyAgICB0cEFkZEJzc1BhcmFtcyBwQWRkQnNzUGFyYW1zID0gTlVMTDsKKyAgICB0QU5JX1UzMiByZXRDb2RlOworICAgIHRBTklfVTggaTsKKyAgICB0U2NoQmVhY29uU3RydWN0IGJlYWNvblN0cnVjdDsKKyAgICB0QU5JX1U4IGNoYW5XaWR0aFN1cHAgPSAwOworICAgIHRwU2lyQnNzRGVzY3JpcHRpb24gYnNzRGVzY3JpcHRpb24gPSAmcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uOworCisKKyAgICAvLyBQYWNrYWdlIFNJUl9IQUxfQUREX0JTU19SRVEgbWVzc2FnZSBwYXJhbWV0ZXJzCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcEFkZEJzc1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0QWRkQnNzUGFyYW1zICkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgIEZMKCAiVW5hYmxlIHRvIFBBTCBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIEFERF9CU1NcbiIgKSk7CisgICAgICAgIHJldENvZGUgPSBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgICAgIGdvdG8gcmV0dXJuRmFpbHVyZTsKKyAgICB9CisgICAgCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcEFkZEJzc1BhcmFtcywgc2l6ZW9mKCB0QWRkQnNzUGFyYW1zICkpOworCisKKyAgICBsaW1FeHRyYWN0QXBDYXBhYmlsaXRpZXMoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgYnNzRGVzY3JpcHRpb24tPmllRmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUdldElFbGVuRnJvbUJzc0Rlc2NyaXB0aW9uKCBic3NEZXNjcmlwdGlvbiApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiZWFjb25TdHJ1Y3QgKTsKKworICAgIGlmKHBNYWMtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0gV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorICAgICAgICBsaW1EZWNpZGVTdGFQcm90ZWN0aW9uT25Bc3NvYyhwTWFjLCAmYmVhY29uU3RydWN0LCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgIHBBZGRCc3NQYXJhbXMtPmJzc0lkLGJzc0Rlc2NyaXB0aW9uLT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRTaXJNYWNBZGRyICkpOworCisgICAgLy8gRmlsbCBpbiB0QWRkQnNzUGFyYW1zIHNlbGZNYWNBZGRyCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgIHBBZGRCc3NQYXJhbXMtPnNlbGZNYWNBZGRyLCAKKyAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRTaXJNYWNBZGRyICkpOworCisgICAgLyogSW5jb3JyZWN0IEJTUyBUeXBlIHdoaWNoIGNhdXNlZCBVTUEgRGVzY3JpcHRvciB0byBiZSBvdmVyd3JpdHRlbiBvbgorICAgICAqIHRvcCBvZiBhbiBhbHJlYWR5IGVzdGFibGlzaGVkIEluZnJhIGxpbmsuIFRoaXMgbGVhZCB0byBpc3N1ZXMgaW4gCisgICAgICogY29uY3VycmVudCBkYXRhIHRyYW5zZmVyLgorICAgICAqLworCisgICAgcEFkZEJzc1BhcmFtcy0+YnNzVHlwZSA9IHBzZXNzaW9uRW50cnktPmJzc1R5cGU7Ly9lU0lSX0lORlJBU1RSVUNUVVJFX01PREU7CisgICAgcEFkZEJzc1BhcmFtcy0+b3Blck1vZGUgPSBCU1NfT1BFUkFUSU9OQUxfTU9ERV9TVEE7CisKKyAgICBwQWRkQnNzUGFyYW1zLT5iZWFjb25JbnRlcnZhbCA9IGJzc0Rlc2NyaXB0aW9uLT5iZWFjb25JbnRlcnZhbDsKKyAgICAKKyAgICBwQWRkQnNzUGFyYW1zLT5kdGltUGVyaW9kID0gYmVhY29uU3RydWN0LnRpbS5kdGltUGVyaW9kOworICAgIHBBZGRCc3NQYXJhbXMtPnVwZGF0ZUJzcyA9IHVwZGF0ZUVudHJ5OworCisKKyAgICBwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcENvdW50ID0gYmVhY29uU3RydWN0LmNmUGFyYW1TZXQuY2ZwQ291bnQ7CisgICAgcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBQZXJpb2QgPSBiZWFjb25TdHJ1Y3QuY2ZQYXJhbVNldC5jZnBQZXJpb2Q7CisgICAgcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBNYXhEdXJhdGlvbiA9IGJlYWNvblN0cnVjdC5jZlBhcmFtU2V0LmNmcE1heER1cmF0aW9uOworICAgIHBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwRHVyUmVtYWluaW5nID0gYmVhY29uU3RydWN0LmNmUGFyYW1TZXQuY2ZwRHVyUmVtYWluaW5nOworCisKKyAgICBwQWRkQnNzUGFyYW1zLT5yYXRlU2V0Lm51bVJhdGVzID0gYmVhY29uU3RydWN0LnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICBwQWRkQnNzUGFyYW1zLT5yYXRlU2V0LnJhdGUsCisgICAgICAgICAgICAgICAgICAgYmVhY29uU3RydWN0LnN1cHBvcnRlZFJhdGVzLnJhdGUsIGJlYWNvblN0cnVjdC5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlcyApOworCisgICAgcEFkZEJzc1BhcmFtcy0+bndUeXBlID0gYnNzRGVzY3JpcHRpb24tPm53VHlwZTsKKyAgICAKKyAgICBwQWRkQnNzUGFyYW1zLT5zaG9ydFNsb3RUaW1lU3VwcG9ydGVkID0gKHRBTklfVTgpYmVhY29uU3RydWN0LmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWU7IAorICAgIHBBZGRCc3NQYXJhbXMtPmxsYUNvZXhpc3QgPSAodEFOSV9VOCkgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3Q7CisgICAgcEFkZEJzc1BhcmFtcy0+bGxiQ29leGlzdCA9ICh0QU5JX1U4KSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxiQ29leGlzdDsKKyAgICBwQWRkQnNzUGFyYW1zLT5sbGdDb2V4aXN0ID0gKHRBTklfVTgpIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0OworICAgIHBBZGRCc3NQYXJhbXMtPmh0MjBDb2V4aXN0ID0gKHRBTklfVTgpIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdDsgCisKKyAgICAvLyBVc2UgdGhlIGFkdmVydGlzZWQgY2FwYWJpbGl0aWVzIGZyb20gdGhlIHJlY2VpdmVkIGJlYWNvbi9QUgorICAgIGlmIChJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSkgJiYgKCBiZWFjb25TdHJ1Y3QuSFRDYXBzLnByZXNlbnQgKSkKKyAgICB7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPmh0Q2FwYWJsZSA9IGJlYWNvblN0cnVjdC5IVENhcHMucHJlc2VudDsKKworICAgICAgICBpZiAoIGJlYWNvblN0cnVjdC5IVEluZm8ucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmh0T3Blck1vZGUgPSAodFNpck1hY0hUT3BlcmF0aW5nTW9kZSliZWFjb25TdHJ1Y3QuSFRJbmZvLm9wTW9kZTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmR1YWxDVFNQcm90ZWN0aW9uID0gKCB0QU5JX1U4ICkgYmVhY29uU3RydWN0LkhUSW5mby5kdWFsQ1RTUHJvdGVjdGlvbjsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgIGNoYW5XaWR0aFN1cHAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9TVVBQT1JURURfQ0hBTk5FTF9XSURUSF9TRVQsIHBzZXNzaW9uRW50cnkpOworI2Vsc2UgCisgICAgICAgICAgICBjaGFuV2lkdGhTdXBwID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfU1VQUE9SVEVEX0NIQU5ORUxfV0lEVEhfU0VUKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYoIChiZWFjb25TdHJ1Y3QuSFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkgJiYKKyAgICAgICAgICAgICAgICAoY2hhbldpZHRoU3VwcCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnR4Q2hhbm5lbFdpZHRoU2V0ID0gKCB0QU5JX1U4ICkgYmVhY29uU3RydWN0LkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisgICAgICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+Y3VycmVudEV4dENoYW5uZWwgPSBiZWFjb25TdHJ1Y3QuSFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+dHhDaGFubmVsV2lkdGhTZXQgPSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisgICAgICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+Y3VycmVudEV4dENoYW5uZWwgPSBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgPSAodEFOSV9VOCliZWFjb25TdHJ1Y3QuSFRJbmZvLm5vbkdGRGV2aWNlc1ByZXNlbnQ7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSAodEFOSV9VOCliZWFjb25TdHJ1Y3QuSFRJbmZvLmxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+ZlJJRlNNb2RlID0gYmVhY29uU3RydWN0LkhUSW5mby5yaWZzTW9kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBBZGRCc3NQYXJhbXMtPmN1cnJlbnRPcGVyQ2hhbm5lbCA9IGJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQ7CisKKyAgICAvLyBQb3B1bGF0ZSB0aGUgU1RBLXJlbGF0ZWQgcGFyYW1ldGVycyBoZXJlCisgICAgLy8gTm90ZSB0aGF0IHRoZSBTVEEgaGVyZSByZWZlcnMgdG8gdGhlIEFQCisgICAgeworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YVR5cGUgPSBTVEFfRU5UUllfT1RIRVI7IC8vIElkZW50aWZ5aW5nIEFQIGFzIGFuIFNUQQorCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICBic3NEZXNjcmlwdGlvbi0+YnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggdFNpck1hY0FkZHIgKSk7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubGlzdGVuSW50ZXJ2YWwgPSBic3NEZXNjcmlwdGlvbi0+YmVhY29uSW50ZXJ2YWw7CisKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5hc3NvY0lkID0gMDsgLy8gSXMgU01BQyBPSyB3aXRoIHRoaXM/CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudUFQU0QgPSAwOworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heFNQTGVuID0gMDsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zaG9ydFByZWFtYmxlU3VwcG9ydGVkID0gKHRBTklfVTgpYmVhY29uU3RydWN0LmNhcGFiaWxpdHlJbmZvLnNob3J0UHJlYW1ibGU7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudXBkYXRlU3RhID0gdXBkYXRlRW50cnk7CisKKyAgICAgICAgaWYgKElTX0RPVDExX01PREVfSFQocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSAmJiAoIGJlYWNvblN0cnVjdC5IVENhcHMucHJlc2VudCApKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnVzMzJNYXhBbXBkdUR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuaHRDYXBhYmxlID0gMTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZ3JlZW5GaWVsZENhcGFibGUgID0gKCB0QU5JX1U4ICkgYmVhY29uU3RydWN0LkhUQ2Fwcy5ncmVlbkZpZWxkOworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5sc2lnVHhvcFByb3RlY3Rpb24gPSAoIHRBTklfVTggKSBiZWFjb25TdHJ1Y3QuSFRDYXBzLmxzaWdUWE9QUHJvdGVjdGlvbjsKKyAgICAgICAgICAgIGlmKCAoYmVhY29uU3RydWN0LkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpICYmCisgICAgICAgICAgICAgICAgKGNoYW5XaWR0aFN1cHApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnR4Q2hhbm5lbFdpZHRoU2V0ID0gKCB0QU5JX1U4ICliZWFjb25TdHJ1Y3QuSFRJbmZvLnJlY29tbWVuZGVkVHhXaWR0aFNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnR4Q2hhbm5lbFdpZHRoU2V0ID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1pbW9QUyAgICAgICAgICAgICA9ICh0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpYmVhY29uU3RydWN0LkhUQ2Fwcy5taW1vUG93ZXJTYXZlOworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5kZWxCQVN1cHBvcnQgICAgICAgPSAoIHRBTklfVTggKSBiZWFjb25TdHJ1Y3QuSFRDYXBzLmRlbGF5ZWRCQTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4QW1zZHVTaXplICAgICAgID0gKCB0QU5JX1U4ICkgYmVhY29uU3RydWN0LkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplOworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhBbXBkdURlbnNpdHkgICAgPSAgICAgICAgICAgICBiZWFjb25TdHJ1Y3QuSFRDYXBzLm1wZHVEZW5zaXR5OworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mRHNzc0Nja01vZGU0ME1oeiA9ICh0QU5JX1U4KWJlYWNvblN0cnVjdC5IVENhcHMuZHNzc0Nja01vZGU0ME1IejsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZlNob3J0R0kyME1oeiA9ICh0QU5JX1U4KWJlYWNvblN0cnVjdC5IVENhcHMuc2hvcnRHSTIwTUh6OworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mU2hvcnRHSTQwTWh6ID0gKHRBTklfVTgpYmVhY29uU3RydWN0LkhUQ2Fwcy5zaG9ydEdJNDBNSHo7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtcGR1U2l6ZT0gYmVhY29uU3RydWN0LkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggYmVhY29uU3RydWN0LkhUSW5mby5wcmVzZW50ICkKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnJpZnNNb2RlID0gYmVhY29uU3RydWN0LkhUSW5mby5yaWZzTW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCAmJiBiZWFjb25TdHJ1Y3Qud21lRWRjYVByZXNlbnQpIHx8CisgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQgJiYgYmVhY29uU3RydWN0LmVkY2FQcmVzZW50KSkKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQud21tRW5hYmxlZCA9IDE7CisgICAgICAgIGVsc2UgCisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LndtbUVuYWJsZWQgPSAwOworCisgICAgICAgIC8vVXBkYXRlIHRoZSByYXRlcworICAgICAgICAKKyAgICAgICAgbGltUG9wdWxhdGVPd25SYXRlU2V0KHBNYWMsICZwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN1cHBvcnRlZFJhdGVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb25TdHJ1Y3QuSFRDYXBzLnN1cHBvcnRlZE1DU1NldCwgZmFsc2UscHNlc3Npb25FbnRyeSk7CisgICAgICAgIGxpbUZpbGxTdXBwb3J0ZWRSYXRlc0luZm8ocE1hYywgTlVMTCwgJnBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3VwcG9ydGVkUmF0ZXMscHNlc3Npb25FbnRyeSk7CisKKyAgICB9CisKKworICAgIC8vRGlzYWJsZSBCQS4gSXQgd2lsbCBiZSBzZXQgYXMgcGFydCBvZiBBRERCQSBuZWdvdGlhdGlvbi4KKyAgICBmb3IoIGkgPSAwOyBpIDwgU1RBQ0ZHX01BWF9UQzsgaSsrICkKKyAgICB7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhVENQYXJhbXNbaV0udHhVc2VCQSAgICA9IGVCQV9ESVNBQkxFOworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YVRDUGFyYW1zW2ldLnJ4VXNlQkEgICAgPSBlQkFfRElTQUJMRTsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFUQ1BhcmFtc1tpXS50eEJBcG9saWN5ID0gZUJBX1BPTElDWV9JTU1FRElBVEU7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhVENQYXJhbXNbaV0ucnhCQXBvbGljeSA9IGVCQV9QT0xJQ1lfSU1NRURJQVRFOworICAgIH0KKworICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZW5jcnlwdFR5cGUgPSBwc2Vzc2lvbkVudHJ5LT5lbmNyeXB0VHlwZTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSSAgCisgICAgcEFkZEJzc1BhcmFtcy0+bWF4VHhQb3dlciA9IHBzZXNzaW9uRW50cnktPm1heFR4UG93ZXI7CisjZW5kaWYKKworICAgIHBBZGRCc3NQYXJhbXMtPnN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgcEFkZEJzc1BhcmFtcy0+cmVzcFJlcWQgPSB0cnVlOworCisgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICBwQWRkQnNzUGFyYW1zLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAKKyAgICBwQWRkQnNzUGFyYW1zLT5oYWxQZXJzb25hID0gKHRBTklfVTgpcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hOyAvL3VwZGF0ZSBwZXJzb25hCisKKyAgICBwQWRkQnNzUGFyYW1zLT5iU3BlY3RydW1NZ3RFbmFibGVkID0gcHNlc3Npb25FbnRyeS0+c3BlY3RydW1NZ3RFbmFibGVkOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIHBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtVmFsaWQgPSAwOworI2VuZGlmCisKKyAgICAvLyBTZXQgYSBuZXcgc3RhdGUgZm9yIE1MTUUKKworICAgIC8vcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1BSRUFTU09DX1NUQVRFOworICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUFJFQVNTT0NfU1RBVEU7CisgICAgCisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKyAgICAvL3dlIG5lZWQgdG8gZGVmZXIgdGhlIG1lc3NhZ2UgdW50aWwgd2UgZ2V0IHRoZSByZXNwb25zZSBiYWNrIGZyb20gSEFMLgorICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKyAKKyAgICBtc2dRLnR5cGUgPSBXREFfQUREX0JTU19SRVE7CisgICAgLyoqIEBUb0RvIDogVXBkYXRlIHRoZSBHbG9iYWwgY291bnRlciB0byBrZWVwdHJhY2sgb2YgdGhlIFBFIDwtLT4gSEFMIG1lc3NhZ2VzKi8KKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwQWRkQnNzUGFyYW1zOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICBsaW1Mb2coIHBNYWMsIExPRzEsIEZMKCAiU2VuZGluZyBTSVJfSEFMX0FERF9CU1NfUkVRLi4uIiApKTsKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKworICAgIHJldENvZGUgPSB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKTsKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IHJldENvZGUpIAorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQWRkQnNzUGFyYW1zKTsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiUG9zdGluZyBBRERfQlNTX1JFUSB0byBIQUwgZmFpbGVkLCByZWFzb249JVhcbiIpLAorICAgICAgICAgICAgICAgIHJldENvZGUgKTsKKyAgICAgICAgZ290byByZXR1cm5GYWlsdXJlOworCisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHJldENvZGU7CisKKyByZXR1cm5GYWlsdXJlOgorICAgIC8vIENsZWFuLXVwIHdpbGwgYmUgZG9uZSBieSB0aGUgY2FsbGVyLi4uCisgICAgcmV0dXJuIHJldENvZGU7Cit9CisKKworCisKKworI2VsaWYgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKK3RTaXJSZXRTdGF0dXMgbGltU3RhU2VuZEFkZEJzcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJBc3NvY1JzcCBwQXNzb2NSc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJOZWlnaGJvckJzc0luZm8gbmVpZ2hib3JCc3NJbmZvLCB0QU5JX1U4IHVwZGF0ZUVudHJ5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJNc2dRIG1zZ1E7CisgICAgdHBBZGRCc3NQYXJhbXMgcEFkZEJzc1BhcmFtcyA9IE5VTEw7CisgICAgdEFOSV9VMzIgcmV0Q29kZTsKKyAgICB0QU5JX1U4IGk7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworICAgIAorICAgIC8vIFBhY2thZ2UgU0lSX0hBTF9BRERfQlNTX1JFUSBtZXNzYWdlIHBhcmFtZXRlcnMKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopICZwQWRkQnNzUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRBZGRCc3NQYXJhbXMgKSkpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgRkwoICJVbmFibGUgdG8gUEFMIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgQUREX0JTU1xuIiApKTsKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgICAgZ290byByZXR1cm5GYWlsdXJlOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBBZGRCc3NQYXJhbXMsIHNpemVvZiggdEFkZEJzc1BhcmFtcyApKTsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICBwQWRkQnNzUGFyYW1zLT5ic3NJZCxuZWlnaGJvckJzc0luZm8tPmJzc0lkLAorICAgICAgICAgICAgICAgICAgIHNpemVvZiggdFNpck1hY0FkZHIgKSk7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgLy8gRmlsbCBpbiB0QWRkQnNzUGFyYW1zIHNlbGZNYWNBZGRyCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEFkZEJzc1BhcmFtcy0+c2VsZk1hY0FkZHIsIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0U2lyTWFjQWRkciApKTsKKyNlbmRpZgorCisgICAgcEFkZEJzc1BhcmFtcy0+YnNzVHlwZSA9IGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERTsKKyAgICBwQWRkQnNzUGFyYW1zLT5vcGVyTW9kZSA9IEJTU19PUEVSQVRJT05BTF9NT0RFX1NUQTsKKyAgICBwQWRkQnNzUGFyYW1zLT5iZWFjb25JbnRlcnZhbCA9ICh0QU5JX1UxNikgbmVpZ2hib3JCc3NJbmZvLT5iZWFjb25JbnRlcnZhbDsKKyAgICBwQWRkQnNzUGFyYW1zLT5kdGltUGVyaW9kID0gbmVpZ2hib3JCc3NJbmZvLT5kdGltUGVyaW9kOworICAgIHBBZGRCc3NQYXJhbXMtPnVwZGF0ZUJzcyA9IHVwZGF0ZUVudHJ5OworCisgICAKKyAgICAvKiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIGNvbW1lbnRlZCBzaW5jZSB0aGUgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmcm9tIHRoZSAKKyAgICAgKiBuZWlnaGJvckJzc0luZm8uIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQgbGF0ZXIgKi8KKyNpZiAwICAgIAorCisgICAgcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBDb3VudCA9IGJlYWNvblN0cnVjdC5jZlBhcmFtU2V0LmNmcENvdW50OworICAgIHBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwUGVyaW9kID0gYmVhY29uU3RydWN0LmNmUGFyYW1TZXQuY2ZwUGVyaW9kOworICAgIHBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwTWF4RHVyYXRpb24gPSBiZWFjb25TdHJ1Y3QuY2ZQYXJhbVNldC5jZnBNYXhEdXJhdGlvbjsKKyAgICBwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcER1clJlbWFpbmluZyA9IGJlYWNvblN0cnVjdC5jZlBhcmFtU2V0LmNmcER1clJlbWFpbmluZzsKKyNlbmRpZgorICAgIHBBZGRCc3NQYXJhbXMtPnJhdGVTZXQubnVtUmF0ZXMgPSBwQXNzb2NSc3AtPnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICBwQWRkQnNzUGFyYW1zLT5yYXRlU2V0LnJhdGUsCisgICAgICAgICAgICAgICAgICAgcEFzc29jUnNwLT5zdXBwb3J0ZWRSYXRlcy5yYXRlLCBwQXNzb2NSc3AtPnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzICk7CisKKyAgICAgLyogVXBkYXRlIFBFIHNlc3Npb24gSUQgKi8KKyAgICBwQWRkQnNzUGFyYW1zLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworICAgIHBBZGRCc3NQYXJhbXMtPm53VHlwZSA9IG5laWdoYm9yQnNzSW5mby0+bndUeXBlOworICAgIAorICAgIHBBZGRCc3NQYXJhbXMtPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQgPSAodEFOSV9VOClwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWU7ICAgIAorICAgIHBBZGRCc3NQYXJhbXMtPmxsYUNvZXhpc3QgPSAodEFOSV9VOCkgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3Q7ICAgIAorICAgIHBBZGRCc3NQYXJhbXMtPmxsYkNvZXhpc3QgPSAodEFOSV9VOCkgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYkNvZXhpc3Q7CisgICAgcEFkZEJzc1BhcmFtcy0+bGxnQ29leGlzdCA9ICh0QU5JX1U4KSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxnQ29leGlzdDsKKyAgICBwQWRkQnNzUGFyYW1zLT5odDIwQ29leGlzdCA9ICh0QU5JX1U4KSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuaHQyMENvZXhpc3Q7ICAgIAorCisgICAgLy8gVXNlIHRoZSBhZHZlcnRpc2VkIGNhcGFiaWxpdGllcyBmcm9tIHRoZSByZWNlaXZlZCBiZWFjb24vUFIKKyAgICBpZiAoSVNfRE9UMTFfTU9ERV9IVChwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUpICYmICggbmVpZ2hib3JCc3NJbmZvLT5IVENhcHNQcmVzZW50ICkpCisgICAgeworICAgICAgICBwQWRkQnNzUGFyYW1zLT5odENhcGFibGUgPSBwQXNzb2NSc3AtPkhUQ2Fwcy5wcmVzZW50OworCisgICAgICAgIGlmICggbmVpZ2hib3JCc3NJbmZvLT5IVEluZm9QcmVzZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+aHRPcGVyTW9kZSA9IHBBc3NvY1JzcC0+SFRJbmZvLm9wTW9kZTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmR1YWxDVFNQcm90ZWN0aW9uID0gKCB0QU5JX1U4IClwQXNzb2NSc3AtPkhUSW5mby5kdWFsQ1RTUHJvdGVjdGlvbjsKKyAKKyAgICAgICAgICAgIGlmKHBBc3NvY1JzcC0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT50eENoYW5uZWxXaWR0aFNldCA9ICggdEFOSV9VOCApcEFzc29jUnNwLT5IVEluZm8ucmVjb21tZW5kZWRUeFdpZHRoU2V0OworICAgICAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmN1cnJlbnRFeHRDaGFubmVsID0gcEFzc29jUnNwLT5IVEluZm8uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT50eENoYW5uZWxXaWR0aFNldCA9ICh0QU5JX1U4KXBBc3NvY1JzcC0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5jdXJyZW50RXh0Q2hhbm5lbCA9IGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmxsbk5vbkdGQ29leGlzdCA9ICh0QU5JX1U4KXBBc3NvY1JzcC0+SFRJbmZvLm5vbkdGRGV2aWNlc1ByZXNlbnQ7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSAodEFOSV9VOClwQXNzb2NSc3AtPkhUSW5mby5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmZSSUZTTW9kZSA9IHBBc3NvY1JzcC0+SFRJbmZvLnJpZnNNb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgcEFkZEJzc1BhcmFtcy0+Y3VycmVudE9wZXJDaGFubmVsID0gbmVpZ2hib3JCc3NJbmZvLT5jaGFubmVsSWQ7CisKKyAgICAvLyBQb3B1bGF0ZSB0aGUgU1RBLXJlbGF0ZWQgcGFyYW1ldGVycyBoZXJlCisgICAgLy8gTm90ZSB0aGF0IHRoZSBTVEEgaGVyZSByZWZlcnMgdG8gdGhlIEFQCisgICAgeworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YVR5cGUgPSBTVEFfRU5UUllfT1RIRVI7IC8vIElkZW50aWZ5aW5nIEFQIGFzIGFuIFNUQQorCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICBuZWlnaGJvckJzc0luZm8tPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRTaXJNYWNBZGRyICkpOworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmxpc3RlbkludGVydmFsID0gKHRBTklfVTgpIG5laWdoYm9yQnNzSW5mby0+YmVhY29uSW50ZXJ2YWw7CisKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5hc3NvY0lkID0gMDsgLy8gSXMgU01BQyBPSyB3aXRoIHRoaXM/CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudUFQU0QgPSAwOworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heFNQTGVuID0gMDsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zaG9ydFByZWFtYmxlU3VwcG9ydGVkID0gKHRBTklfVTgpcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5zaG9ydFByZWFtYmxlOworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnVwZGF0ZVN0YSA9IHVwZGF0ZUVudHJ5OworCisKKyAgICAgICAgaWYgKElTX0RPVDExX01PREVfSFQocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSAmJiAoIHBBc3NvY1JzcC0+SFRDYXBzLnByZXNlbnQgKSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51czMyTWF4QW1wZHVEdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lmh0Q2FwYWJsZSA9IDE7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmdyZWVuRmllbGRDYXBhYmxlICA9ICggdEFOSV9VOCApcEFzc29jUnNwLT5IVENhcHMuZ3JlZW5GaWVsZDsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubHNpZ1R4b3BQcm90ZWN0aW9uID0gKCB0QU5JX1U4IClwQXNzb2NSc3AtPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb247CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnR4Q2hhbm5lbFdpZHRoU2V0ICA9ICggdEFOSV9VOCApKHBBc3NvY1JzcC0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvY1JzcC0+SFRJbmZvLnJlY29tbWVuZGVkVHhXaWR0aFNldCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NSc3AtPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWltb1BTICAgICAgICAgICAgID0gICAgICAgICAgICAgcEFzc29jUnNwLT5IVENhcHMubWltb1Bvd2VyU2F2ZTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZGVsQkFTdXBwb3J0ICAgICAgID0gKCB0QU5JX1U4IClwQXNzb2NSc3AtPkhUQ2Fwcy5kZWxheWVkQkE7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtc2R1U2l6ZSAgICAgICA9ICggdEFOSV9VOCApcEFzc29jUnNwLT5IVENhcHMubWF4aW1hbEFNU0RVc2l6ZTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4QW1wZHVEZW5zaXR5ICAgID0gICAgICAgICAgICAgcEFzc29jUnNwLT5IVENhcHMubXBkdURlbnNpdHk7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmZEc3NzQ2NrTW9kZTQwTWh6ID0gKHRBTklfVTgpcEFzc29jUnNwLT5IVENhcHMuZHNzc0Nja01vZGU0ME1IejsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZlNob3J0R0kyME1oeiA9ICh0QU5JX1U4KXBBc3NvY1JzcC0+SFRDYXBzLnNob3J0R0kyME1IejsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZlNob3J0R0k0ME1oeiA9ICh0QU5JX1U4KXBBc3NvY1JzcC0+SFRDYXBzLnNob3J0R0k0ME1IejsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4QW1wZHVTaXplPSBwQXNzb2NSc3AtPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggcEFzc29jUnNwLT5IVEluZm8ucHJlc2VudCApCisgICAgICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5yaWZzTW9kZSA9IHBBc3NvY1JzcC0+SFRJbmZvLnJpZnNNb2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkICYmIHBBc3NvY1JzcC0+d21lRWRjYVByZXNlbnQpIHx8CisgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQgJiYgcEFzc29jUnNwLT5lZGNhUHJlc2VudCkpCisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LndtbUVuYWJsZWQgPSAxOworICAgICAgICBlbHNlIAorICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC53bW1FbmFibGVkID0gMDsKKworICAgICAgICAvL1VwZGF0ZSB0aGUgcmF0ZXMKKworICAgICAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICAgICAgaWYgKHBTdGFEcyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1GaWxsU3VwcG9ydGVkUmF0ZXNJbmZvKHBNYWMsIHBTdGFEcywgJnBTdGFEcy0+c3VwcG9ydGVkUmF0ZXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh0QU5JX1U4KikmcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdXBwb3J0ZWRSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KikmcFN0YURzLT5zdXBwb3J0ZWRSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyU3VwcG9ydGVkUmF0ZXMpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgVXBkYXRlIHRoZSBzdXBwb3J0ZWQgcmF0ZXMuXG4iKSk7KQorCisgICAgfQorCisgICAgLy9EaXNhYmxlIEJBLiBJdCB3aWxsIGJlIHNldCBhcyBwYXJ0IG9mIEFEREJBIG5lZ290aWF0aW9uLgorICAgIGZvciggaSA9IDA7IGkgPCBTTUFDX1NUQUNGR19NQVhfVEM7IGkrKyApCisgICAgeworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YVRDUGFyYW1zW2ldLnR4VXNlQkEgICAgPSBlQkFfRElTQUJMRTsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFUQ1BhcmFtc1tpXS5yeFVzZUJBICAgID0gZUJBX0RJU0FCTEU7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhVENQYXJhbXNbaV0udHhCQXBvbGljeSA9IGVCQV9QT0xJQ1lfSU1NRURJQVRFOworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YVRDUGFyYW1zW2ldLnJ4QkFwb2xpY3kgPSBlQkFfUE9MSUNZX0lNTUVESUFURTsKKyAgICB9CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkgIAorICAgIHBBZGRCc3NQYXJhbXMtPm1heFR4UG93ZXIgPSBwc2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyOworI2VuZGlmCisgICAgLy8gRklYTUVfR0VONCAtIEFueSBvdGhlciB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbml0aWFsaXphdGlvbj8KKyAgICBwQWRkQnNzUGFyYW1zLT5zdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHBBZGRCc3NQYXJhbXMtPnJlc3BSZXFkID0gdHJ1ZTsKKworICAgIHBBZGRCc3NQYXJhbXMtPmhhbFBlcnNvbmEgPSAodEFOSV9VOClwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmE7IC8vdXBkYXRlIHBlcnNvbmEKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbVZhbGlkID0gMDsKKyNlbmRpZgorCisgICAgLy8gU2V0IGEgbmV3IHN0YXRlIGZvciBNTE1FCisgICAgaWYoIGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSApCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfQVNTT0NfU1RBVEU7CisgICAgZWxzZQorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1JFQVNTT0NfU1RBVEU7CisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKyAgICAvL3dlIG5lZWQgdG8gZGVmZXIgdGhlIG1lc3NhZ2UgdW50aWwgd2UgZ2V0IHRoZSByZXNwb25zZSBiYWNrIGZyb20gSEFMLgorICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKworICAgIG1zZ1EudHlwZSA9IFNJUl9IQUxfQUREX0JTU19SRVE7CisgICAgLyoqIEBUb0RvIDogVXBkYXRlIHRoZSBHbG9iYWwgY291bnRlciB0byBrZWVwdHJhY2sgb2YgdGhlIFBFIDwtLT4gSEFMIG1lc3NhZ2VzKi8KKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwQWRkQnNzUGFyYW1zOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICBsaW1Mb2coIHBNYWMsIExPRzEsIEZMKCAiU2VuZGluZyBTSVJfSEFMX0FERF9CU1NfUkVRLi4uIiApKTsKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKworICAgIHJldENvZGUgPSBoYWxQb3N0TXNnQXBpKCBwTWFjLCAmbXNnUSApOworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkgCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBBZGRCc3NQYXJhbXMpOworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJQb3N0aW5nIEFERF9CU1NfUkVRIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWFxuIiksCisgICAgICAgICAgICAgICAgcmV0Q29kZSApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiByZXRDb2RlOworCisgcmV0dXJuRmFpbHVyZToKKyAgICAvLyBDbGVhbi11cCB3aWxsIGJlIGRvbmUgYnkgdGhlIGNhbGxlci4uLgorICAgIHJldHVybiByZXRDb2RlOworfQorCisjZW5kaWYgLy8gQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1QcmVwYXJlQW5kU2VuZERlbFN0YUNuZgorXGJyaWVmIGRlbGV0ZXMgRFBIIGVudHJ5CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgdGhlIE1MTSBtb2RlIGZvciBzdGF0aW9uLgorICAgICAgICAgICAgICAgICAgICBjYWxscyBsaW1TZW5kRGVsU3RhQ25mCitccGFyYW0gICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xwYXJhbSAgICAgICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzCitccmV0dXJuIG5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwordm9pZAorbGltUHJlcGFyZUFuZFNlbmREZWxTdGFDbmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhRHMsIHRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMTYgc3RhRHNBc3NvY0lkID0gMDsKKyAgICB0U2lyTWFjQWRkciBzdGFEc0FkZHI7CisgICAgdExpbU1sbVN0YUNvbnRleHQgbWxtU3RhQ29udGV4dDsKKworICAgIGlmKHBTdGFEcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoInBTdGFEcyBpcyBOVUxMXG4iKSk7KQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGFEc0Fzc29jSWQgPSBwU3RhRHMtPmFzc29jSWQ7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKilzdGFEc0FkZHIsCisgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHIsCisgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICAgIG1sbVN0YUNvbnRleHQgPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQ7CisgICAgaWYoZVNJUl9TTUVfU1VDQ0VTUyA9PSBzdGF0dXNDb2RlKQorICAgIHsKKyAgICAgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgfHwKKyAgICAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1SZWxlYXNlQUlEKHBNYWMsIHBTdGFEcy0+YXNzb2NJZCk7CisgICAgICAgIH0KKworICAgICAgICBsaW1EZWxldGVEcGhIYXNoRW50cnkocE1hYywgcFN0YURzLT5zdGFBZGRyLCBwU3RhRHMtPmFzc29jSWQscHNlc3Npb25FbnRyeSk7CisgICAgfQorICAgIGlmICggKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSl8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSkKKyAgICB7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisgICAgfQorCisgICAgbGltU2VuZERlbFN0YUNuZihwTWFjLCBzdGFEc0FkZHIsIHN0YURzQXNzb2NJZCwgbWxtU3RhQ29udGV4dCwgc3RhdHVzQ29kZSxwc2Vzc2lvbkVudHJ5KTsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1HZXRTdGFSYXRlTW9kZQorXGJyaWVmIEdldHMgdGhlIFN0YXRpb24gUmF0ZSBNb2RlLgorXHBhcmFtICAgICB0QU5JX1U4IGRvdDExTW9kZQorXHJldHVybiBub25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFN0YVJhdGVNb2RlIGxpbUdldFN0YVJhdGVNb2RlKHRBTklfVTggZG90MTFNb2RlKQoreworICAgIHN3aXRjaChkb3QxMU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgV05JX0NGR19ET1QxMV9NT0RFXzExQToKKyAgICAgICAgICAgICAgICByZXR1cm4gZVNUQV8xMWE7CisgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVTVEFfMTFiOworICAgICAgICAgICAgY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFHOgorICAgICAgICAgICAgICAgIHJldHVybiBlU1RBXzExYmc7CisgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRE9UMTFfTU9ERV8xMU46CisgICAgICAgICAgICAgICAgcmV0dXJuIGVTVEFfMTFuOworICAgICAgICAgICAgY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfQUxMOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZVNUQV8xMW47ICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICB9Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltSW5pdFByZUF1dGhUaW1lclRhYmxlCitcYnJpZWYgSW5pdGlhbGl6ZSB0aGUgUHJlIEF1dGggVGFubGUgYW5kIGNyZWF0ZXMgdGhlIHRpbWVyIGZvciAKKyAgICAgICBlYWNoIG5vZGUgZm9yIHRoZSB0aW1lb3V0IHZhbHVlIGdvdCBmcm9tIGNmZy4KK1xwYXJhbSAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworXHBhcmFtICAgICB0cExpbVByZUF1dGhUYWJsZSBwUHJlQXV0aFRpbWVyVGFibGUKK1xyZXR1cm4gbm9uZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltSW5pdFByZUF1dGhUaW1lclRhYmxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwTGltUHJlQXV0aFRhYmxlIHBQcmVBdXRoVGltZXJUYWJsZSkKK3sKKyAgICB0QU5JX1UzMiBjZmdWYWx1ZTsKKyAgICB0QU5JX1UzMiBhdXRoTm9kZUlkeDsKKyAgICB0cExpbVByZUF1dGhOb2RlIHBBdXRoTm9kZSA9IHBQcmVBdXRoVGltZXJUYWJsZS0+cFRhYmxlOworICAgIAorICAgIC8vIEdldCBBVVRIX1JTUCBUaW1lcnMgdmFsdWUKKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9SU1BfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKgorICAgICAgICAqKiBDb3VsZCBub3QgZ2V0IEFVVEhfUlNQIHRpbWVvdXQgdmFsdWUKKyAgICAgICAgKiogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgKiovCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBBVVRIX1JTUCB0aW1lb3V0IHZhbHVlXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisgICAgZm9yKGF1dGhOb2RlSWR4PTA7IGF1dGhOb2RlSWR4PHBQcmVBdXRoVGltZXJUYWJsZS0+bnVtRW50cnk7IGF1dGhOb2RlSWR4KyssIHBBdXRoTm9kZSsrKQorICAgIHsKKyAgICAgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcEF1dGhOb2RlLT50aW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBVVRIIFJFU1BPTlNFIFRJTUVPVVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbGltQXV0aFJlc3BvbnNlVGltZXJIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aE5vZGVJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICBjZmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ2Fubm90IGNyZWF0ZSB0aW1lci4gIExvZyBlcnJvci4KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ2Fubm90IGNyZWF0ZSBBdXRoIFJzcCB0aW1lciBvZiBJbmRleCA6JWQuXG4iKSwgYXV0aE5vZGVJZHgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBBdXRoTm9kZS0+YXV0aE5vZGVJZHggPSAodEFOSV9VOClhdXRoTm9kZUlkeDsKKyAgICAgICAgcEF1dGhOb2RlLT5mRnJlZSA9IDE7CisgICAgfQorCit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltQWNxdWlyZUZyZWVQcmVBdXRoTm9kZQorXGJyaWVmIFJldHJpdmVzIGEgZnJlZSBQcmUgQXV0aCBub2RlIGZyb20gUHJlIEF1dGggVGFibGUuCitccGFyYW0gICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xwYXJhbSAgICAgdHBMaW1QcmVBdXRoVGFibGUgcFByZUF1dGhUaW1lclRhYmxlCitccmV0dXJuIG5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0TGltUHJlQXV0aE5vZGUgKiBsaW1BY3F1aXJlRnJlZVByZUF1dGhOb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwTGltUHJlQXV0aFRhYmxlIHBQcmVBdXRoVGltZXJUYWJsZSkKK3sKKyAgICB0QU5JX1UzMiBpOworICAgIHRMaW1QcmVBdXRoTm9kZSAqcFRlbXBOb2RlID0gcFByZUF1dGhUaW1lclRhYmxlLT5wVGFibGU7CisgICAgZm9yIChpPTA7IGk8cFByZUF1dGhUaW1lclRhYmxlLT5udW1FbnRyeTsgaSsrLHBUZW1wTm9kZSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBUZW1wTm9kZS0+ZkZyZWUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgcFRlbXBOb2RlLT5mRnJlZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gcFRlbXBOb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltR2V0UHJlQXV0aE5vZGVGcm9tSW5kZXgKK1xicmllZiBEZXBlbmRpbmcgb24gdGhlIEluZGV4IHRoaXMgcmV0cml2ZXMgdGhlIHByZSBhdXRoIG5vZGUuCitccGFyYW0gICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xwYXJhbSAgICAgdHBMaW1QcmVBdXRoVGFibGUgcEF1dGhUYWJsZQorXHBhcmFtICAgICB0QU5JX1UzMiBhdXRoTm9kZUlkeAorXHJldHVybiBub25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordExpbVByZUF1dGhOb2RlICogbGltR2V0UHJlQXV0aE5vZGVGcm9tSW5kZXgodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBMaW1QcmVBdXRoVGFibGUgcEF1dGhUYWJsZSwgdEFOSV9VMzIgYXV0aE5vZGVJZHgpCit7CisgICAgaWYgKChhdXRoTm9kZUlkeCA+PSBwQXV0aFRhYmxlLT5udW1FbnRyeSkgfHwgKHBBdXRoVGFibGUtPnBUYWJsZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBBdXRoIFRpbWVyIEluZGV4IDogJWQgTnVtRW50cnkgOiAlZFxuIiksIAorICAgICAgICAgICAgICAgICAgYXV0aE5vZGVJZHgsIHBBdXRoVGFibGUtPm51bUVudHJ5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIAorICAgIHJldHVybiBwQXV0aFRhYmxlLT5wVGFibGUgKyBhdXRoTm9kZUlkeDsKK30KKworLyogVXRpbCBBUEkgdG8gY2hlY2sgaWYgdGhlIGNoYW5uZWxzIHN1cHBvcnRlZCBieSBTVEEgaXMgd2l0aGluIHJhbmdlICovCit0U2lyUmV0U3RhdHVzIGxpbUlzRG90MTFoU3VwcG9ydGVkQ2hhbm5lbHNWYWxpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQXNzb2NSZXEgKmFzc29jKQoreworICAgIC8qCisgICAgICAgICAqIEFsbG93IGFsbCB0aGUgc3RhdGlvbnMgdG8gam9pbiB3aXRoIHVzLgorICAgICAgICAgKiA4MDIuMTFoLTIwMDMgMTEuNi4xID0+IEFuIEFQIG1heSB1c2UgdGhlIHN1cHBvcnRlZCBjaGFubmVscyBsaXN0IGZvciBhc3NvY2lhdGVkIFNUQXMKKyAgICAgICAgICogYXMgYW4gaW5wdXQgaW50byBhbiBhbGdvcml0aG0gdXNlZCB0byBzZWxlY3QgYSBuZXcgY2hhbm5lbCBmb3IgdGhlIEJTUy4KKyAgICAgICAgICogVGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGFsZ29yaXRobSBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgYW1lbmRtZW50LgorICAgICAgICAgKi8KKworICAgIHJldHVybiAoZVNJUl9TVUNDRVNTKTsgIAorfQorCisvKiBVdGlsIEFQSSB0byBjaGVjayBpZiB0aGUgdHhwb3dlciBzdXBwb3J0ZWQgYnkgU1RBIGlzIHdpdGhpbiByYW5nZSAqLwordFNpclJldFN0YXR1cyBsaW1Jc0RvdDExaFBvd2VyQ2FwYWJpbGl0aWVzSW5SYW5nZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQXNzb2NSZXEgKmFzc29jLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFBvd2VyZEJtIGxvY2FsTWF4VHhQb3dlcjsKKyAgICB0QU5JX1UzMiBsb2NhbFB3ckNvbnN0cmFpbnQ7IAorCisgICAgbG9jYWxNYXhUeFBvd2VyID0gY2ZnR2V0UmVndWxhdG9yeU1heFRyYW5zbWl0UG93ZXIocE1hYywgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKTsKKworICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCwgJmxvY2FsUHdyQ29uc3RyYWludCkgIT0gZVNJUl9TVUNDRVNTKSB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoICJVbmFibGUgdG8gZ2V0IExvY2FsIFBvd2VyIENvbnN0cmFpbnQgZnJvbSBjZmdcbiIgKSk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIGxvY2FsTWF4VHhQb3dlciAtPSAodFBvd2VyZEJtKWxvY2FsUHdyQ29uc3RyYWludDsKKworICAgIC8qKgorICAgICAgICAgKiAgVGhlIG1pbiBUeCBQb3dlciBvZiB0aGUgYXNzb2NpYXRpbmcgc3RhdGlvbiBzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbiAocmVndWxhdG9yeQorICAgICAgICAgKiAgbWF4IHR4IHBvd2VyIC0gbG9jYWwgcG93ZXIgY29uc3RyYWludCBjb25maWd1cmVkIG9uIEFQKS4KKyAgICAgICAgICovCisgICAgaWYoYXNzb2MtPnBvd2VyQ2FwYWJpbGl0eS5taW5UeFBvd2VyID4gbG9jYWxNYXhUeFBvd2VyKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJtaW5UeFBvd2VyIChTVEEpID0gJWQsIGxvY2FsTWF4VHhQb3dlciAoQVApID0gJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICBhc3NvYy0+cG93ZXJDYXBhYmlsaXR5Lm1pblR4UG93ZXIsIGxvY2FsTWF4VHhQb3dlcik7CisgICAgICAgIHJldHVybiAoZVNJUl9GQUlMVVJFKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChlU0lSX1NVQ0NFU1MpOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBsaW1GaWxsUnhIaWdoZXN0U3VwcG9ydGVkUmF0ZQorXGJyaWVmICBGaWxscyBpbiB0aGUgUnggSGlnaGVzdCBTdXBwb3J0ZWQgRGF0YSBSYXRlIGZpZWxkIGZyb20gCitcICAgICAgIHRoZSAnc3VwcG9ydGVkIE1DUyBzZXQnIGZpZWxkIGluIEhUIGNhcGFiaWxpdHkgZWxlbWVudC4gCitccGFyYW0gIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xwYXJhbSAgdHBTaXJTdXBwb3J0ZWRSYXRlcyAgcFJhdGVzCitccGFyYW0gIHRBTklfVTgqICBwU3VwcG9ydGVkTUNTU2V0CitccmV0dXJuIG5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbUZpbGxSeEhpZ2hlc3RTdXBwb3J0ZWRSYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2ICpyeEhpZ2hlc3RSYXRlLCB0QU5JX1U4KiBwU3VwcG9ydGVkTUNTU2V0KQoreworICAgIHRTaXJNYWNSeEhpZ2hlc3RTdXBwb3J0UmF0ZSAgKnBSeEhpZ2hlc3RSYXRlOworICAgIHRBTklfVTggICpwQnVmOyAKKyAgICB0QU5JX1UxNiAgcmF0ZT0wOworCisgICAgcEJ1ZiA9IHBTdXBwb3J0ZWRNQ1NTZXQgKyBNQ1NfUlhfSElHSEVTVF9TVVBQT1JURURfUkFURV9CWVRFX09GRlNFVDsKKyAgICByYXRlID0gbGltR2V0VTE2KHBCdWYpOworCisgICAgcFJ4SGlnaGVzdFJhdGUgPSAodFNpck1hY1J4SGlnaGVzdFN1cHBvcnRSYXRlICopICZyYXRlOworICAgICpyeEhpZ2hlc3RSYXRlID0gcFJ4SGlnaGVzdFJhdGUtPnJhdGU7CisKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbUFzc29jVXRpbHMuaCBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltQXNzb2NVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NmY3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbUFzc29jVXRpbHMuaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgbGltQXNzb2NVdGlscy5oIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGRlZmluaXRpb25zCisgKiBMSU0gdXNlcyB3aGlsZSBwcm9jZXNzaW5nIFJlL0Fzc29jaWF0aW9uIG1lc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMDUvMjYvMTAgICAgICAganMgICAgICAgICAgICAgV1BBIGhhbmRsaW5nIGluIChSZSlBc3NvYyBmcmFtZXMKKyAqIAorICovCisjaWZuZGVmIF9fTElNX0FTU09DX1VUSUxTX0gKKyNkZWZpbmUgX19MSU1fQVNTT0NfVVRJTFNfSAorCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAic2lyRGVidWcuaCIKKyNpbmNsdWRlICJjZmdBcGkuaCIKKworI2luY2x1ZGUgImxpbVR5cGVzLmgiCisKKwordEFOSV9VOCAgICAgICAgIGxpbUNtcFNTaWQodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNTU2lkICosdHBQRVNlc3Npb24pOwordEFOSV9VOCAgICAgICAgIGxpbUNvbXBhcmVDYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQXNzb2NSZXEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqLHRwUEVTZXNzaW9uKTsKK3RBTklfVTggICAgICAgICBsaW1DaGVja1J4QmFzaWNSYXRlcyh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1JhdGVTZXQsdHBQRVNlc3Npb24pOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3RBTklfVTggICAgICAgICBsaW1DaGVja1J4UlNOSWVNYXRjaCh0cEFuaVNpckdsb2JhbCwgdERvdDExZklFUlNOLCB0cFBFU2Vzc2lvbiwgdEFOSV9VOCk7Cit0QU5JX1U4ICAgICAgICAgbGltQ2hlY2tSeFdQQUllTWF0Y2godHBBbmlTaXJHbG9iYWwsIHREb3QxMWZJRVdQQSwgdHBQRVNlc3Npb24sIHRBTklfVTgpOworI2VuZGlmCit0QU5JX1U4ICAgICAgICAgbGltQ2hlY2tNQ1NTZXQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCogc3VwcG9ydGVkTUNTU2V0KTsKK3ZvaWQgICAgICAgICAgICBsaW1Qb3N0RHVtbXlUb1RtUmluZyh0cEFuaVNpckdsb2JhbCwgdHBEcGhIYXNoTm9kZSk7Cit2b2lkICAgICAgICAgICAgbGltUG9zdFBhY2tldFRvVGRSaW5nKHRwQW5pU2lyR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cERwaEhhc2hOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4KTsKK3RTaXJSZXRTdGF0dXMgICBsaW1DbGVhbnVwUnhQYXRoKHRwQW5pU2lyR2xvYmFsLCB0cERwaEhhc2hOb2RlLHRwUEVTZXNzaW9uKTsKK3ZvaWQgICAgICAgICAgICBsaW1SZWplY3RBc3NvY2lhdGlvbih0cEFuaVNpckdsb2JhbCAsIHRTaXJNYWNBZGRyLCB0QU5JX1U4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggLCB0QW5pQXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYsIHRBTklfVTgsIHRTaXJSZXN1bHRDb2RlcywgdHBQRVNlc3Npb24pOworCit0U2lyUmV0U3RhdHVzIGxpbVBvcHVsYXRlT3duUmF0ZVNldCh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyU3VwcG9ydGVkUmF0ZXMgcFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTgqIHBTdXBwb3J0ZWRNQ1NTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBiYXNpY09ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3RTaXJSZXRTdGF0dXMgICBsaW1Qb3B1bGF0ZU1hdGNoaW5nUmF0ZVNldCh0cEFuaVNpckdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cERwaEhhc2hOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNSYXRlU2V0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY1JhdGVTZXQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4KiBwU3VwcG9ydGVkTUNTU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNQcm9wUmF0ZVNldCAqLCB0cFBFU2Vzc2lvbik7Cit0U2lyUmV0U3RhdHVzICAgbGltQWRkU3RhKHRwQW5pU2lyR2xvYmFsLCB0cERwaEhhc2hOb2RlLHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgICBsaW1EZWxCc3ModHBBbmlTaXJHbG9iYWwsIHRwRHBoSGFzaE5vZGUsIHRBTklfVTE2LCB0cFBFU2Vzc2lvbik7Cit0U2lyUmV0U3RhdHVzICAgbGltRGVsU3RhKHRwQW5pU2lyR2xvYmFsLCB0cERwaEhhc2hOb2RlLCB0QU5JX0JPT0xFQU4sIHRwUEVTZXNzaW9uKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgordFNpclJldFN0YXR1cyAgIGxpbUFkZEZUU3RhU2VsZih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBhc3NvY0lkLCAKKyAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KK3RTaXJSZXRTdGF0dXMgICBsaW1BZGRTdGFTZWxmKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdEFOSV9VOCwgdHBQRVNlc3Npb24pOwordFN0YVJhdGVNb2RlIGxpbUdldFN0YVJhdGVNb2RlKHRBTklfVTggZG90MTFNb2RlKTsKKworCit2b2lkICAgICAgICAgICAgbGltVGVhcmRvd25JbmZyYUJzcyh0cEFuaVNpckdsb2JhbCx0cFBFU2Vzc2lvbik7Cit2b2lkICAgICAgICAgICAgbGltUmVzdG9yZVByZVJlYXNzb2NTdGF0ZSh0cEFuaVNpckdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJSZXN1bHRDb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2LHRwUEVTZXNzaW9uKTsgCitlQW5pQm9vbGVhbiAgICAgbGltSXNSZWFzc29jSW5Qcm9ncmVzcyh0cEFuaVNpckdsb2JhbCx0cFBFU2Vzc2lvbik7Cit2b2lkCitsaW1TZW5kRGVsU3RhQ25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHN0YURzQWRkciwKKyAgICAgICB0QU5JX1UxNiBzdGFEc0Fzc29jSWQsIHRMaW1NbG1TdGFDb250ZXh0IG1sbVN0YUNvbnRleHQsIHRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2b2lkICAgICAgICAgICAgbGltSGFuZGxlQ25mV2FpdFRpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgc3RhSWQpOwordm9pZCAgICAgICAgICAgIGxpbURlbGV0ZURwaEhhc2hFbnRyeSh0cEFuaVNpckdsb2JhbCwgdFNpck1hY0FkZHIsIHRBTklfVTE2LHRwUEVTZXNzaW9uKTsKK3ZvaWQgICAgICAgICAgICBsaW1DaGVja0FuZEFubm91bmNlSm9pblN1Y2Nlc3ModHBBbmlTaXJHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJQcm9iZVJlc3BCZWFjb24gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJNYWNNZ210SGRyLHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltVXBkYXRlUmVBc3NvY0dsb2JhbHModHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyQXNzb2NSc3AgcEFzc29jUnNwLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2b2lkIGxpbVVwZGF0ZUFzc29jU3RhRGF0YXModHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzLHRwU2lyQXNzb2NSc3AgcEFzc29jUnNwLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZAorbGltRmlsbFN1cHBvcnRlZFJhdGVzSW5mbygKKyAgICB0cEFuaVNpckdsb2JhbCAgICAgICAgICBwTWFjLAorICAgIHRwRHBoSGFzaE5vZGUgICAgICAgICAgIHBTdGEsCisgICAgdHBTaXJTdXBwb3J0ZWRSYXRlcyAgIHBSYXRlcywKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgcHNlc3Npb25FbnRyeSk7CisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0NMSUVOVAorLy9tYWtlIG5vbi1jb25kaXRpb25hbCB1bnRpbCB0aGUgY2FsbGVyIGlzICNpZmRlZmVkCit0U2lyUmV0U3RhdHVzIGxpbVN0YVNlbmRBZGRCc3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJBc3NvY1JzcCBwQXNzb2NSc3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTY2hCZWFjb25TdHJ1Y3QgcEJlYWNvblN0cnVjdCwgdHBTaXJCc3NEZXNjcmlwdGlvbiBic3NEZXNjcmlwdGlvbiwgdEFOSV9VOCB1cGRhdGVFbnRyeSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit0U2lyUmV0U3RhdHVzIGxpbVN0YVNlbmRBZGRCc3NQcmVBc3NvYyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCB1cGRhdGVFbnRyeSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKworCisjZWxpZiBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQordFNpclJldFN0YXR1cyBsaW1TdGFTZW5kQWRkQnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyQXNzb2NSc3AgcEFzc29jUnNwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTmVpZ2hib3JCc3NJbmZvIG5laWdoYm9yQnNzSW5mbyx0QU5JX1U4IHVwZGF0ZUVudHJ5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisKK3ZvaWQgbGltUHJlcGFyZUFuZFNlbmREZWxTdGFDbmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhRHMsIHRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlLHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgbGltRXh0cmFjdEFwQ2FwYWJpbGl0aWVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKiBwSUUsIHRBTklfVTE2IGllTGVuLCB0cFNpclByb2JlUmVzcEJlYWNvbiBiZWFjb25TdHJ1Y3QpOwordm9pZCBsaW1Jbml0UHJlQXV0aFRpbWVyVGFibGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBMaW1QcmVBdXRoVGFibGUgcFByZUF1dGhUaW1lclRhYmxlKTsKK3RwTGltUHJlQXV0aE5vZGUgbGltQWNxdWlyZUZyZWVQcmVBdXRoTm9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cExpbVByZUF1dGhUYWJsZSBwUHJlQXV0aFRpbWVyVGFibGUpOwordHBMaW1QcmVBdXRoTm9kZSBsaW1HZXRQcmVBdXRoTm9kZUZyb21JbmRleCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cExpbVByZUF1dGhUYWJsZSBwQXV0aFRhYmxlLCB0QU5JX1UzMiBhdXRoTm9kZUlkeCk7CisKKy8qIFV0aWwgQVBJIHRvIGNoZWNrIGlmIHRoZSBjaGFubmVscyBzdXBwb3J0ZWQgYnkgU1RBIGlzIHdpdGhpbiByYW5nZSAqLwordFNpclJldFN0YXR1cyBsaW1Jc0RvdDExaFN1cHBvcnRlZENoYW5uZWxzVmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckFzc29jUmVxICphc3NvYyk7CisKKy8qIFV0aWwgQVBJIHRvIGNoZWNrIGlmIHRoZSB0eHBvd2VyIHN1cHBvcnRlZCBieSBTVEEgaXMgd2l0aGluIHJhbmdlICovCit0U2lyUmV0U3RhdHVzIGxpbUlzRG90MTFoUG93ZXJDYXBhYmlsaXRpZXNJblJhbmdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJBc3NvY1JlcSAqYXNzb2MsdHBQRVNlc3Npb24pOworCisvKiBBUEkgdG8gcmUtYWRkIHRoZSBzYW1lIEJTUyBkdXJpbmcgcmUtYXNzb2NpYXRpb24gKi8KK3ZvaWQgbGltSGFuZGxlQWRkQnNzSW5SZUFzc29jQ29udGV4dCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8qIEFQSSB0byBmaWxsIGluIFJYIEhpZ2hlc3QgU3VwcG9ydGVkIGRhdGEgUmF0ZSAqLwordm9pZCBsaW1GaWxsUnhIaWdoZXN0U3VwcG9ydGVkUmF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiAqcnhIaWdoZXN0UmF0ZSwgdEFOSV9VOCogcFN1cHBvcnRlZE1DU1NldCk7CisKKworI2VuZGlmIC8qIF9fTElNX0FTU09DX1VUSUxTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1EZWJ1Zy5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1EZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2UzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbURlYnVnLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBsaW1EZWJ1Zy5jCisgIAorICBcYnJpZWYgaW1wbGVtZW50YXRpb24gZm9yIGxvZyBEZWJ1ZyByZWxhdGVkIEFQSXMKKworICBcYXV0aG9yIFN1bml0IEJoYXRpYQorICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJsaW1EZWJ1Zy5oIgorCit2b2lkIGxpbUxvZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBsb2dsZXZlbCwgY29uc3QgY2hhciAqcFN0cmluZywuLi4pIAoreworI2lmZGVmIFdMQU5fREVCVUcKKyAgICAvLyBWZXJpZnkgYWdhaW5zdCBjdXJyZW50IGxvZyBsZXZlbAorICAgIGlmICggbG9nbGV2ZWwgPiBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbTE9HX0lOREVYX0ZPUl9NT0RVTEUoIFNJUl9MSU1fTU9EVUxFX0lEICldICkKKyAgICAgICAgcmV0dXJuOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZhX2xpc3QgbWFya2VyOworCisgICAgICAgIHZhX3N0YXJ0KCBtYXJrZXIsIHBTdHJpbmcgKTsgICAgIC8qIEluaXRpYWxpemUgdmFyaWFibGUgYXJndW1lbnRzLiAqLworCisgICAgICAgIGxvZ0RlYnVnKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBsb2dsZXZlbCwgcFN0cmluZywgbWFya2VyKTsKKyAgICAgICAgCisgICAgICAgIHZhX2VuZCggbWFya2VyICk7ICAgICAgICAgICAgICAvKiBSZXNldCB2YXJpYWJsZSBhcmd1bWVudHMuICAgICAgKi8KKyAgICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltRGVidWcuaCBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE1ZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1EZWJ1Zy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGxpbURlYnVnLmggY29udGFpbnMgbG9nIGZ1bmN0aW9uIGNhbGxlZCBieSBMSU0gbW9kdWxlLgorICoKKyAqIEF1dGhvcjogICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgMDIvMTEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICovCisKKyNpZm5kZWYgX19MSU1fREVCVUdfSF9fCisjZGVmaW5lIF9fTElNX0RFQlVHX0hfXworCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJzaXJEZWJ1Zy5oIgorCisKK3ZvaWQgbGltTG9nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGxvZ2xldmVsLCBjb25zdCBjaGFyICpwU3RyaW5nLC4uLikgOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltRlQuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltRlQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2NmNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1GVC5jCkBAIC0wLDAgKzEsMTQyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGJyaWVmIGltcGxlbWVudGF0aW9uIGZvciBQRSAxMXIgVm9XaUZpIEZUIFByb3RvY29sIAorICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8bGltU2VuZE1lc3NhZ2VzLmg+CisjaW5jbHVkZSA8bGltVHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1GVC5oPgorI2luY2x1ZGUgPGxpbUZURGVmcy5oPgorI2luY2x1ZGUgPGxpbVV0aWxzLmg+CisjaW5jbHVkZSA8bGltUHJvcEV4dHNVdGlscy5oPgorI2luY2x1ZGUgPGxpbUFzc29jVXRpbHMuaD4KKyNpbmNsdWRlIDxsaW1TZXNzaW9uLmg+CisjaW5jbHVkZSA8bGltQWRtaXRDb250cm9sLmg+CisjaW5jbHVkZSAid21tQXBzZC5oIgorCisjZGVmaW5lIExJTV9GVF9SSUNfQkFfU1NOICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExJTV9GVF9SSUNfQkFfRElBTE9HX1RPS0VOX1RJRF8wICAgICAgICAgMjQ4CisjZGVmaW5lIExJTV9GVF9SSUNfREVTQ1JJUFRPUl9SRVNPVVJDRV9UWVBFX0JBICAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5pdGlhbGl6ZSB0aGUgRlQgdmFyaWFibGVzLiAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltRlRPcGVuKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSA9IE5VTEw7CisgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucHNhdmVkc2Vzc2lvbkVudHJ5ID0gTlVMTDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBDbGVhbnVwIEZUIHZhcmlhYmxlcy4gCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbUZUQ2xlYW51cCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGlmIChwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxKSAKKyAgICB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6IEZyZWVpbmcgcEZUUHJlQXV0aFJlcT0gJXBcbiIsIAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxKTspIAorI2VuZGlmCisgICAgICAgIHZvc19tZW1fZnJlZShwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxKTsKKyAgICAgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSA9IE5VTEw7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB0aGUgb2xkIHNlc3Npb24sIHNob3VsZCBiZSBkZWxldGVkIGVsc2Ugd2hlcmUuCisgICAgLy8gV2Ugc2hvdWxkIG5vdCBiZSBjbGVhbmluZyBpdCBoZXJlLCBqdXN0IHNldCBpdCB0byBOVUxMLgorICAgIGlmIChwTWFjLT5mdC5mdFBFQ29udGV4dC5wc2F2ZWRzZXNzaW9uRW50cnkpCisgICAgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIiVzOiBTZXR0aW5nIHBzYXZlZHNlc3Npb25FbnRyeT0gJXAgdG8gTlVMTFxuIiwgCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBzYXZlZHNlc3Npb25FbnRyeSk7KSAKKyNlbmRpZgorICAgICAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5wc2F2ZWRzZXNzaW9uRW50cnkgPSBOVUxMOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgdGhlIGV4dHJhIHNlc3Npb24gd2UgYWRkZWQgYXMgcGFydCBvZiBBdXRoIHJlc3AKKyAgICAvLyBjbGVhbiBpdCB1cC4KKyAgICBpZiAocE1hYy0+ZnQuZnRQRUNvbnRleHQucGZ0U2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgICAgaWYgKCgoKHRwUEVTZXNzaW9uKShwTWFjLT5mdC5mdFBFQ29udGV4dC5wZnRTZXNzaW9uRW50cnkpKS0+dmFsaWQpICYmCisgICAgICAgICAgICAoKCh0cFBFU2Vzc2lvbikocE1hYy0+ZnQuZnRQRUNvbnRleHQucGZ0U2Vzc2lvbkVudHJ5KSktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6IERlbGV0aW5nIFByZWF1dGggU2Vzc2lvbiAlZFxuIiwgX19mdW5jX18sICgodHBQRVNlc3Npb24pcE1hYy0+ZnQuZnRQRUNvbnRleHQucGZ0U2Vzc2lvbkVudHJ5KS0+cGVTZXNzaW9uSWQpOykKKyAgICAgICAgICAgIHBlRGVsZXRlU2Vzc2lvbihwTWFjLCBwTWFjLT5mdC5mdFBFQ29udGV4dC5wZnRTZXNzaW9uRW50cnkpOworICAgICAgICB9CisgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBmdFNlc3Npb25FbnRyeSA9IE5VTEw7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6IFNldHRpbmcgcHNhdmVkc2Vzc2lvbkVudHJ5PSAlcCB0byBOVUxMXG4iLCAKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcE1hYy0+ZnQuZnRQRUNvbnRleHQucHNhdmVkc2Vzc2lvbkVudHJ5KTspIAorI2VuZGlmCisgICAgfQorCisgICAgaWYgKHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBBZGRCc3NSZXEpCisgICAgeworICAgICAgICB2b3NfbWVtX2ZyZWUocE1hYy0+ZnQuZnRQRUNvbnRleHQucEFkZEJzc1JlcSk7CisgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBBZGRCc3NSZXEgPSBOVUxMOworICAgIH0KKworICAgIGlmIChwTWFjLT5mdC5mdFBFQ29udGV4dC5wQWRkU3RhUmVxKQorICAgIHsKKyAgICAgICAgdm9zX21lbV9mcmVlKHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBBZGRTdGFSZXEpOworICAgICAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5wQWRkU3RhUmVxID0gTlVMTDsKKyAgICB9CisKKyAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5mdFByZUF1dGhTdGF0dXMgPSBlU0lSX1NVQ0NFU1M7IAorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5pdCBGVCB2YXJpYWJsZXMuIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1GVEluaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBpZiAocE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSkgCisgICAgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIiVzOiBGcmVlaW5nIHBGVFByZUF1dGhSZXE9ICVwXG4iLCAKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSk7KSAKKyNlbmRpZgorICAgICAgICB2b3NfbWVtX2ZyZWUocE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSk7CisgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgPSBOVUxMOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgdGhlIG9sZCBzZXNzaW9uLCBzaG91bGQgYmUgZGVsZXRlZCBlbHNlIHdoZXJlLgorICAgIC8vIFdlIHNob3VsZCBub3QgYmUgY2xlYW5pbmcgaXQgaGVyZSwganVzdCBzZXQgaXQgdG8gTlVMTC4KKyAgICBpZiAocE1hYy0+ZnQuZnRQRUNvbnRleHQucHNhdmVkc2Vzc2lvbkVudHJ5KQorICAgIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICIlczogU2V0dGluZyBwc2F2ZWRzZXNzaW9uRW50cnk9ICVwIHRvIE5VTExcbiIsIAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwTWFjLT5mdC5mdFBFQ29udGV4dC5wc2F2ZWRzZXNzaW9uRW50cnkpOykgCisjZW5kaWYKKyAgICAgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucHNhdmVkc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHRoZSBleHRyYSBzZXNzaW9uIHdlIGFkZGVkIGFzIHBhcnQgb2YgQXV0aCByZXNwCisgICAgLy8gY2xlYW4gaXQgdXAuCisgICAgaWYgKHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBmdFNlc3Npb25FbnRyeSkKKyAgICB7CisgICAgICAgIC8qIENhbm5vdCBkZWxldGUgc2Vzc2lvbnMgYWNyb3NzIGFzc29jaWF0aW9ucyAqLworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIiVzOiBEZWxldGluZyBzZXNzaW9uID0gJXAgXG4iLCAKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcE1hYy0+ZnQuZnRQRUNvbnRleHQucGZ0U2Vzc2lvbkVudHJ5KTspIAorI2VuZGlmCisgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBmdFNlc3Npb25FbnRyeSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBBZGRCc3NSZXEpCisgICAgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIiVzOiBGcmVlaW5nIEFkZEJzc1JlcSA9ICVwIFxuIiwgCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBBZGRCc3NSZXEpOykgCisjZW5kaWYKKyAgICAgICAgdm9zX21lbV9mcmVlKHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBBZGRCc3NSZXEpOworICAgICAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5wQWRkQnNzUmVxID0gTlVMTDsKKyAgICB9CisKKworICAgIGlmIChwTWFjLT5mdC5mdFBFQ29udGV4dC5wQWRkU3RhUmVxKQorICAgIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICIlczogRnJlZWluZyBBZGRTdGFSZXEgPSAlcCBcbiIsIAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwTWFjLT5mdC5mdFBFQ29udGV4dC5wQWRkU3RhUmVxKTspIAorI2VuZGlmCisgICAgICAgIHZvc19tZW1fZnJlZShwTWFjLT5mdC5mdFBFQ29udGV4dC5wQWRkU3RhUmVxKTsKKyAgICAgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEFkZFN0YVJlcSA9IE5VTEw7CisgICAgfQorCisgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQuZnRQcmVBdXRoU3RhdHVzID0gZVNJUl9TVUNDRVNTOyAKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiBUaGlzIGlzIHRoZSBoYW5kbGVyIGFmdGVyIHN1c3BlbmRpbmcgdGhlIGxpbmsuCisgKiBXZSBzdXNwZW5kIHRoZSBsaW5rIGFuZCB0aGVuIG5vdyBwcm9jZWVkIHRvIHN3aXRjaCBjaGFubmVsLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRlRQcmVBdXRoU3VzcGVuZExpbmtIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgc3RhdHVzLCB0QU5JX1UzMiAqZGF0YSkKK3sKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworICAgIAorICAgIC8vIFRoZSBsaW5rIGlzIHN1c3BlbmRlZCBvZiBub3QgPworICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykgCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6IFJldHVybmluZyBcbiIsIF9fRlVOQ1RJT05fXyk7KQorICAgICAgICAvLyBQb3N0IHRoZSBGVCBQcmUgQXV0aCBSZXNwb25zZSB0byBTTUUKKyAgICAgICAgbGltUG9zdEZUUHJlQXV0aFJzcChwTWFjLCBlU0lSX0ZBSUxVUkUsIE5VTEwsIDAsICh0cFBFU2Vzc2lvbilkYXRhKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHNlc3Npb25FbnRyeSA9ICh0cFBFU2Vzc2lvbilkYXRhOworICAgIC8vIFN1c3BlbmRlZCwgbm93IG1vdmUgdG8gYSBkaWZmZXJlbnQgY2hhbm5lbC4KKyAgICAvLyBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrIGJlZm9yZSBwcm9jZWVkaW5nLgorICAgIGlmICgocE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSkgJiYgcHNlc3Npb25FbnRyeSkKKyAgICB7CisgICAgICAgIGxpbUNoYW5nZUNoYW5uZWxXaXRoQ2FsbGJhY2socE1hYywgCisgICAgICAgICAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5wcmVBdXRoY2hhbm5lbE51bSwKKyAgICAgICAgICAgIGxpbVBlcmZvcm1GVFByZUF1dGgsIE5VTEwsIHBzZXNzaW9uRW50cnkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRWxzZSByZXR1cm4gZXJyb3IuCisgICAgbGltUG9zdEZUUHJlQXV0aFJzcChwTWFjLCBlU0lSX0ZBSUxVUkUsIE5VTEwsIDAsIHBzZXNzaW9uRW50cnkpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW4gdGhpcyBmdW5jdGlvbiwgd2UgcHJvY2VzcyB0aGUgRlQgUHJlIEF1dGggUmVxLgorICBXZSByZWNlaXZlIFByZS1BdXRoCisgIFN1c3BlbmQgbGluaworICBSZWdpc3RlciBhIGNhbGwgYmFjaworICBJbiB0aGUgY2FsbCBiYWNrLCB3ZSB3aWxsIG5lZWQgdG8gYWNjZXB0IGZyYW1lcyBmcm9tIHRoZSBuZXcgYnNzaWQKKyAgU2VuZCBvdXQgdGhlIGF1dGggcmVxIHRvIG5ldyBBUC4KKyAgU3RhcnQgdGltZXIgYW5kIHdoZW4gdGhlIHRpbWVyIGlzIGRvbmUgb3IgaWYgd2UgcmVjZWl2ZSB0aGUgQXV0aCByZXNwb25zZQorICBXZSBjaGFuZ2UgY2hhbm5lbAorICBSZXN1bWUgbGluaworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGxpbVByb2Nlc3NGVFByZUF1dGhSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisgICAgaW50IGJ1ZkNvbnN1bWVkID0gRkFMU0U7CisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKyAgICB0QU5JX1U4IHNlc3Npb25JZDsKKworICAgIC8vIE5vdyB3ZSBhcmUgc3RhcnRpbmcgZnJlc2ggbWFrZSBzdXJlIGFsbCdzIGNsZWFudXAuCisgICAgbGltRlRJbml0KHBNYWMpOworICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LmZ0UHJlQXV0aFN0YXR1cyA9IGVTSVJfRkFJTFVSRTsgIC8vIENhbiBzZXQgaXQgb25seSBhZnRlciBzZW5kaW5nIGF1dGgKKworICAgIC8vIFdlIG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgUHJlLUF1dGggUmVxLiBMZXRzIHNhdmUgdGhhdAorICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgPSAodHBTaXJGVFByZUF1dGhSZXEpcE1zZy0+Ym9keXB0cjsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6IFBFIEF1dGggZnRfaWVzX2xlbmd0aD0lMDJ4JTAyeCUwMnhcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+ZnRfaWVzWzBdLAorICAgICAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5mdF9pZXNbMV0sCisgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPmZ0X2llc1syXSk7KQorI2VuZGlmCisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiBlbnRyeQorICAgIHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLCAKKyAgICAgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+Y3VycmJzc0lkLCAmc2Vzc2lvbklkKTsKKyAgICBpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIiVzOiBVbmFibGUgdG8gZmluZCBzZXNzaW9uIGZvciB0aGUgZm9sbG93aW5nIGJzc2lkXG4iLCAKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7KQorICAgICAgICBsaW1QcmludE1hY0FkZHIoIHBNYWMsIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPmN1cnJic3NJZCwgTE9HRSApOworICAgICAgICAvLyBQb3N0IHRoZSBGVCBQcmUgQXV0aCBSZXNwb25zZSB0byBTTUUKKyAgICAgICAgbGltUG9zdEZUUHJlQXV0aFJzcChwTWFjLCBlU0lSX0ZBSUxVUkUsIE5VTEwsIDAsIE5VTEwpOyAKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gRG9udCBuZWVkIHRvIHN1c3BlbmQgaWYgQVBzIGFyZSBpbiBzYW1lIGNoYW5uZWwKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsICE9IHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnByZUF1dGhjaGFubmVsTnVtKSAKKyAgICB7CisgICAgICAgIC8vIE5lZWQgdG8gc3VzcGVuZCBsaW5rIG9ubHkgaWYgdGhlIGNoYW5uZWxzIGFyZSBkaWZmZXJlbnQKKyAgICAgICAgbGltU3VzcGVuZExpbmsocE1hYywgZVNJUl9DSEVDS19MSU5LX1RSQUZGSUNfQkVGT1JFX1NDQU4sIEZUUHJlQXV0aFN1c3BlbmRMaW5rSGFuZGxlciwgCisgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKXBzZXNzaW9uRW50cnkpOyAKKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICIlczogUGVyZm9ybWluZyBwcmUtYXV0aCBvbiBzYW1lIGNoYW5uZWxcbiIsIAorICAgICAgICAgICAgX19GVU5DVElPTl9fKTspCisgICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgc2FtZSBjaGFubmVsLiBQZXJmb3JtIHByZS1hdXRoCisgICAgICAgIGxpbVBlcmZvcm1GVFByZUF1dGgocE1hYywgZUhBTF9TVEFUVVNfU1VDQ0VTUywgTlVMTCwgcHNlc3Npb25FbnRyeSk7CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZkNvbnN1bWVkOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VuZCB0aGUgQXV0aDEgCisgKiBSZWNlaXZlIGJhY2sgQXV0aDIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltUGVyZm9ybUZUUHJlQXV0aCh0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHN0YXR1cywgdEFOSV9VMzIgKmRhdGEsIAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFNpck1hY0F1dGhGcmFtZUJvZHkgYXV0aEZyYW1lOworCisgICAgaWYgKHBzZXNzaW9uRW50cnktPmlzMTFSY29ubmVjdGlvbikKKyAgICB7CisgICAgICAgIC8vIE9ubHkgMTFyIGFzc29jIGhhcyBGVCBJRXMuCisgICAgICAgIGlmIChwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5mdF9pZXMgPT0gTlVMTCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICIlczogRlRJRXMgZm9yIEF1dGggUmVxIFNlcSAxIGlzIGFic2VudFxuIik7KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykgCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6IENoYW5nZSBjaGFubmVsIG5vdCBzdWNjZXNzZnVsIGZvciBGVCBwcmUtYXV0aFxuIik7KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBzYXZlZHNlc3Npb25FbnRyeSA9IHBzZXNzaW9uRW50cnk7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIkVudGVyZWQgd2FpdCBhdXRoMiBzdGF0ZSBmb3IgRlRcbiIpOykKKyNlbmRpZgorCisKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+aXMxMVJjb25uZWN0aW9uKQorICAgIHsKKyAgICAgICAgLy8gTm93IHdlIGFyZSBvbiB0aGUgcmlnaHQgY2hhbm5lbCBhbmQgbmVlZCB0byBzZW5kIG91dCBBdXRoMSBhbmQgCisgICAgICAgIC8vIHJlY2VpdmUgQXV0aDIuCisgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfRlRfQVVUSDsgLy8gU2V0IHRoZSBhdXRoIHR5cGUgdG8gRlQKKyAgICB9CisjaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fQ0NYCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gV2lsbCBuZWVkIHRvIG1ha2UgaXNDQ1hjb25uZWN0aW9uIGEgZW51bSBtYXkgYmUgZm9yIGZ1cnRoZXIKKyAgICAgICAgLy8gaW1wcm92ZW1lbnRzIHRvIHRoaXMgdG8gbWF0Y2ggdGhpcyBhbGdvcml0aG0gbnVtYmVyCisgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfT1BFTl9TWVNURU07IC8vIEZvciBub3cgaWYgaXRzIENDWCBhbmQgMTFyIEZULiAKKyAgICB9CisjZW5kaWYKKyAgICBhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0gU0lSX01BQ19BVVRIX0ZSQU1FXzE7CisgICAgYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0gMDsKKworICAgIC8vIFN0YXJ0IHRpbWVyIGhlcmUgdG8gY29tZSBiYWNrIHRvIG9wZXJhdGluZyBjaGFubmVsLgorICAgIHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUZUUHJlQXV0aFJzcFRpbWVyLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIGlmKFRYX1NVQ0NFU1MgIT0gIHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1GVFByZUF1dGhSc3BUaW1lcikpCisgICAgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIiVzOiBGVCBBdXRoIFJzcCBUaW1lciBTdGFydCBGYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7KQorI2VuZGlmCisgICAgfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICIlczogRlQgQXV0aCBSc3AgVGltZXIgU3RhcnRlZFxuIiwgX19GVU5DVElPTl9fKTspCisjZW5kaWYKKworICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnByZUF1dGhic3NJZCwKKyAgICAgICAgTElNX05PX1dFUF9JTl9GQywgcHNlc3Npb25FbnRyeSk7CisKKyAgICByZXR1cm47Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDcmVhdGUgdGhlIG5ldyBBZGQgQnNzIFJlcSB0byB0aGUgbmV3IEFQLgorICogVGhpcyB3aWxsIGJlIHVzZWQgd2hlbiB3ZSBhcmUgcmVhZHkgdG8gRlQgdG8gdGhlIG5ldyBBUC4KKyAqIFRoZSBuZXdseSBjcmVhdGVkIGZ0IFNlc3Npb24gZW50cnkgaXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U2lyUmV0U3RhdHVzIGxpbUZUUHJlcGFyZUFkZEJzc1JlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgdEFOSV9VOCB1cGRhdGVFbnRyeSwgdHBQRVNlc3Npb24gcGZ0U2Vzc2lvbkVudHJ5LCAKKyAgICB0cFNpckJzc0Rlc2NyaXB0aW9uIGJzc0Rlc2NyaXB0aW9uICkKK3sKKyAgICB0cEFkZEJzc1BhcmFtcyBwQWRkQnNzUGFyYW1zID0gTlVMTDsKKyAgICB0QU5JX1U4IGk7CisgICAgdEFOSV9VOCBjaGFuV2lkdGhTdXBwID0gMDsKKyAgICB0U2NoQmVhY29uU3RydWN0IGJlYWNvblN0cnVjdDsKKworCisgICAgLy8gUGFja2FnZSBTSVJfSEFMX0FERF9CU1NfUkVRIG1lc3NhZ2UgcGFyYW1ldGVycworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAodm9pZCAqKikgJnBBZGRCc3NQYXJhbXMsIHNpemVvZiggdEFkZEJzc1BhcmFtcyApKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IGZvciBjcmVhdGluZyBBRERfQlNTXG4iICkpOworICAgICAgICByZXR1cm4gKGVTSVJfTUVNX0FMTE9DX0ZBSUxFRCk7CisgICAgfQorICAgIAorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBBZGRCc3NQYXJhbXMsIHNpemVvZiggdEFkZEJzc1BhcmFtcyApKTsKKworCisgICAgbGltRXh0cmFjdEFwQ2FwYWJpbGl0aWVzKCBwTWFjLAorICAgICAgICAodEFOSV9VOCAqKSBic3NEZXNjcmlwdGlvbi0+aWVGaWVsZHMsCisgICAgICAgIGxpbUdldElFbGVuRnJvbUJzc0Rlc2NyaXB0aW9uKCBic3NEZXNjcmlwdGlvbiApLCAmYmVhY29uU3RydWN0ICk7CisKKyAgICBpZiAocE1hYy0+bGltLmdMaW1Qcm90ZWN0aW9uQ29udHJvbCAhPSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0RJU0FCTEUpCisgICAgICAgIGxpbURlY2lkZVN0YVByb3RlY3Rpb25PbkFzc29jKHBNYWMsICZiZWFjb25TdHJ1Y3QsIHBmdFNlc3Npb25FbnRyeSk7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQWRkQnNzUGFyYW1zLT5ic3NJZCwgYnNzRGVzY3JpcHRpb24tPmJzc0lkLAorICAgICAgICBzaXplb2YoIHRTaXJNYWNBZGRyICkpOworCisgICAgLy8gRmlsbCBpbiB0QWRkQnNzUGFyYW1zIHNlbGZNYWNBZGRyCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgIHBBZGRCc3NQYXJhbXMtPnNlbGZNYWNBZGRyLCBwZnRTZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLAorICAgICAgICBzaXplb2YoIHRTaXJNYWNBZGRyICkpOworCisgICAgcEFkZEJzc1BhcmFtcy0+YnNzVHlwZSA9IHBmdFNlc3Npb25FbnRyeS0+YnNzVHlwZTsvL2VTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERTsKKyAgICBwQWRkQnNzUGFyYW1zLT5vcGVyTW9kZSA9IEJTU19PUEVSQVRJT05BTF9NT0RFX1NUQTsKKworICAgIHBBZGRCc3NQYXJhbXMtPmJlYWNvbkludGVydmFsID0gYnNzRGVzY3JpcHRpb24tPmJlYWNvbkludGVydmFsOworICAgIAorICAgIHBBZGRCc3NQYXJhbXMtPmR0aW1QZXJpb2QgPSBiZWFjb25TdHJ1Y3QudGltLmR0aW1QZXJpb2Q7CisgICAgcEFkZEJzc1BhcmFtcy0+dXBkYXRlQnNzID0gdXBkYXRlRW50cnk7CisKKworICAgIHBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwQ291bnQgPSBiZWFjb25TdHJ1Y3QuY2ZQYXJhbVNldC5jZnBDb3VudDsKKyAgICBwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcFBlcmlvZCA9IGJlYWNvblN0cnVjdC5jZlBhcmFtU2V0LmNmcFBlcmlvZDsKKyAgICBwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcE1heER1cmF0aW9uID0gYmVhY29uU3RydWN0LmNmUGFyYW1TZXQuY2ZwTWF4RHVyYXRpb247CisgICAgcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBEdXJSZW1haW5pbmcgPSBiZWFjb25TdHJ1Y3QuY2ZQYXJhbVNldC5jZnBEdXJSZW1haW5pbmc7CisKKworICAgIHBBZGRCc3NQYXJhbXMtPnJhdGVTZXQubnVtUmF0ZXMgPSBiZWFjb25TdHJ1Y3Quc3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXM7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgIHBBZGRCc3NQYXJhbXMtPnJhdGVTZXQucmF0ZSwKKyAgICAgICAgICAgICAgICAgICBiZWFjb25TdHJ1Y3Quc3VwcG9ydGVkUmF0ZXMucmF0ZSwgYmVhY29uU3RydWN0LnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzICk7CisKKyAgICBwQWRkQnNzUGFyYW1zLT5ud1R5cGUgPSBic3NEZXNjcmlwdGlvbi0+bndUeXBlOworICAgIAorICAgIHBBZGRCc3NQYXJhbXMtPnNob3J0U2xvdFRpbWVTdXBwb3J0ZWQgPSAodEFOSV9VOCliZWFjb25TdHJ1Y3QuY2FwYWJpbGl0eUluZm8uc2hvcnRTbG90VGltZTsgCisgICAgcEFkZEJzc1BhcmFtcy0+bGxhQ29leGlzdCA9ICh0QU5JX1U4KSBwZnRTZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGFDb2V4aXN0OworICAgIHBBZGRCc3NQYXJhbXMtPmxsYkNvZXhpc3QgPSAodEFOSV9VOCkgcGZ0U2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxiQ29leGlzdDsKKyAgICBwQWRkQnNzUGFyYW1zLT5sbGdDb2V4aXN0ID0gKHRBTklfVTgpIHBmdFNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsZ0NvZXhpc3Q7CisgICAgcEFkZEJzc1BhcmFtcy0+aHQyMENvZXhpc3QgPSAodEFOSV9VOCkgcGZ0U2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuaHQyMENvZXhpc3Q7CisKKyAgICAvLyBVc2UgdGhlIGFkdmVydGlzZWQgY2FwYWJpbGl0aWVzIGZyb20gdGhlIHJlY2VpdmVkIGJlYWNvbi9QUgorICAgIGlmIChJU19ET1QxMV9NT0RFX0hUKHBmdFNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSAmJiAoIGJlYWNvblN0cnVjdC5IVENhcHMucHJlc2VudCApKQorICAgIHsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+aHRDYXBhYmxlID0gYmVhY29uU3RydWN0LkhUQ2Fwcy5wcmVzZW50OworCisgICAgICAgIGlmICggYmVhY29uU3RydWN0LkhUSW5mby5wcmVzZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+aHRPcGVyTW9kZSA9ICh0U2lyTWFjSFRPcGVyYXRpbmdNb2RlKWJlYWNvblN0cnVjdC5IVEluZm8ub3BNb2RlOworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+ZHVhbENUU1Byb3RlY3Rpb24gPSAoIHRBTklfVTggKSBiZWFjb25TdHJ1Y3QuSFRJbmZvLmR1YWxDVFNQcm90ZWN0aW9uOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgY2hhbldpZHRoU3VwcCA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVCwgcGZ0U2Vzc2lvbkVudHJ5KTsKKyNlbHNlIAorICAgICAgICAgICAgY2hhbldpZHRoU3VwcCA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVCk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmKCAoYmVhY29uU3RydWN0LkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpICYmCisgICAgICAgICAgICAgICAgKGNoYW5XaWR0aFN1cHApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT50eENoYW5uZWxXaWR0aFNldCA9ICggdEFOSV9VOCApIGJlYWNvblN0cnVjdC5IVEluZm8ucmVjb21tZW5kZWRUeFdpZHRoU2V0OworICAgICAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmN1cnJlbnRFeHRDaGFubmVsID0gYmVhY29uU3RydWN0LkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnR4Q2hhbm5lbFdpZHRoU2V0ID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworICAgICAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmN1cnJlbnRFeHRDaGFubmVsID0gZUhUX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVF9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+bGxuTm9uR0ZDb2V4aXN0ID0gKHRBTklfVTgpYmVhY29uU3RydWN0LkhUSW5mby5ub25HRkRldmljZXNQcmVzZW50OworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+ZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0gKHRBTklfVTgpYmVhY29uU3RydWN0LkhUSW5mby5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmZSSUZTTW9kZSA9IGJlYWNvblN0cnVjdC5IVEluZm8ucmlmc01vZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwQWRkQnNzUGFyYW1zLT5jdXJyZW50T3BlckNoYW5uZWwgPSBic3NEZXNjcmlwdGlvbi0+Y2hhbm5lbElkOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJTSVJfSEFMX0FERF9CU1NfUkVRIHdpdGggY2hhbm5lbCA9ICVkLi4uIiApLCAKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+Y3VycmVudE9wZXJDaGFubmVsKTsKKyNlbmRpZgorCisKKyAgICAvLyBQb3B1bGF0ZSB0aGUgU1RBLXJlbGF0ZWQgcGFyYW1ldGVycyBoZXJlCisgICAgLy8gTm90ZSB0aGF0IHRoZSBTVEEgaGVyZSByZWZlcnMgdG8gdGhlIEFQCisgICAgeworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YVR5cGUgPSBTVEFfRU5UUllfT1RIRVI7IC8vIElkZW50aWZ5aW5nIEFQIGFzIGFuIFNUQQorCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICBic3NEZXNjcmlwdGlvbi0+YnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggdFNpck1hY0FkZHIgKSk7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubGlzdGVuSW50ZXJ2YWwgPSBic3NEZXNjcmlwdGlvbi0+YmVhY29uSW50ZXJ2YWw7CisKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5hc3NvY0lkID0gMDsgLy8gSXMgU01BQyBPSyB3aXRoIHRoaXM/CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudUFQU0QgPSAwOworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heFNQTGVuID0gMDsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zaG9ydFByZWFtYmxlU3VwcG9ydGVkID0gKHRBTklfVTgpYmVhY29uU3RydWN0LmNhcGFiaWxpdHlJbmZvLnNob3J0UHJlYW1ibGU7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQudXBkYXRlU3RhID0gdXBkYXRlRW50cnk7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZW5jcnlwdFR5cGUgPSBwZnRTZXNzaW9uRW50cnktPmVuY3J5cHRUeXBlOworCisgICAgICAgIGlmIChJU19ET1QxMV9NT0RFX0hUKHBmdFNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSAmJiAoIGJlYWNvblN0cnVjdC5IVENhcHMucHJlc2VudCApKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnVzMzJNYXhBbXBkdUR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuaHRDYXBhYmxlID0gMTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZ3JlZW5GaWVsZENhcGFibGUgID0gKCB0QU5JX1U4ICkgYmVhY29uU3RydWN0LkhUQ2Fwcy5ncmVlbkZpZWxkOworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5sc2lnVHhvcFByb3RlY3Rpb24gPSAoIHRBTklfVTggKSBiZWFjb25TdHJ1Y3QuSFRDYXBzLmxzaWdUWE9QUHJvdGVjdGlvbjsKKyAgICAgICAgICAgIGlmKCAoYmVhY29uU3RydWN0LkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpICYmCisgICAgICAgICAgICAgICAgKGNoYW5XaWR0aFN1cHApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnR4Q2hhbm5lbFdpZHRoU2V0ID0gKCB0QU5JX1U4ICliZWFjb25TdHJ1Y3QuSFRJbmZvLnJlY29tbWVuZGVkVHhXaWR0aFNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnR4Q2hhbm5lbFdpZHRoU2V0ID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1pbW9QUyAgICAgICAgICAgICA9ICh0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpYmVhY29uU3RydWN0LkhUQ2Fwcy5taW1vUG93ZXJTYXZlOworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5kZWxCQVN1cHBvcnQgICAgICAgPSAoIHRBTklfVTggKSBiZWFjb25TdHJ1Y3QuSFRDYXBzLmRlbGF5ZWRCQTsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQubWF4QW1zZHVTaXplICAgICAgID0gKCB0QU5JX1U4ICkgYmVhY29uU3RydWN0LkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplOworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5tYXhBbXBkdURlbnNpdHkgICAgPSAgICAgICAgICAgICBiZWFjb25TdHJ1Y3QuSFRDYXBzLm1wZHVEZW5zaXR5OworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mRHNzc0Nja01vZGU0ME1oeiA9ICh0QU5JX1U4KWJlYWNvblN0cnVjdC5IVENhcHMuZHNzc0Nja01vZGU0ME1IejsKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuZlNob3J0R0kyME1oeiA9ICh0QU5JX1U4KWJlYWNvblN0cnVjdC5IVENhcHMuc2hvcnRHSTIwTUh6OworICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5mU2hvcnRHSTQwTWh6ID0gKHRBTklfVTgpYmVhY29uU3RydWN0LkhUQ2Fwcy5zaG9ydEdJNDBNSHo7CisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0Lm1heEFtcGR1U2l6ZT0gYmVhY29uU3RydWN0LkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggYmVhY29uU3RydWN0LkhUSW5mby5wcmVzZW50ICkKKyAgICAgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnJpZnNNb2RlID0gYmVhY29uU3RydWN0LkhUSW5mby5yaWZzTW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocGZ0U2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkICYmIGJlYWNvblN0cnVjdC53bWVFZGNhUHJlc2VudCkgfHwKKyAgICAgICAgICAgICAgICAocGZ0U2Vzc2lvbkVudHJ5LT5saW1Rb3NFbmFibGVkICYmIGJlYWNvblN0cnVjdC5lZGNhUHJlc2VudCkpCisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LndtbUVuYWJsZWQgPSAxOworICAgICAgICBlbHNlIAorICAgICAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC53bW1FbmFibGVkID0gMDsKKworICAgICAgICAvL1VwZGF0ZSB0aGUgcmF0ZXMKKyAgICAgICAgCisgICAgICAgIGxpbVBvcHVsYXRlT3duUmF0ZVNldChwTWFjLCAmcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdXBwb3J0ZWRSYXRlcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhY29uU3RydWN0LkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsIGZhbHNlLHBmdFNlc3Npb25FbnRyeSk7CisgICAgICAgIGxpbUZpbGxTdXBwb3J0ZWRSYXRlc0luZm8ocE1hYywgTlVMTCwgJnBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3VwcG9ydGVkUmF0ZXMscGZ0U2Vzc2lvbkVudHJ5KTsKKworICAgIH0KKworCisgICAgLy9EaXNhYmxlIEJBLiBJdCB3aWxsIGJlIHNldCBhcyBwYXJ0IG9mIEFEREJBIG5lZ290aWF0aW9uLgorICAgIGZvciggaSA9IDA7IGkgPCBTVEFDRkdfTUFYX1RDOyBpKysgKQorICAgIHsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFUQ1BhcmFtc1tpXS50eFVzZUJBICAgID0gZUJBX0RJU0FCTEU7CisgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhVENQYXJhbXNbaV0ucnhVc2VCQSAgICA9IGVCQV9ESVNBQkxFOworICAgICAgICBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YVRDUGFyYW1zW2ldLnR4QkFwb2xpY3kgPSBlQkFfUE9MSUNZX0lNTUVESUFURTsKKyAgICAgICAgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFUQ1BhcmFtc1tpXS5yeEJBcG9saWN5ID0gZUJBX1BPTElDWV9JTU1FRElBVEU7CisgICAgfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJICAKKyAgICBwQWRkQnNzUGFyYW1zLT5tYXhUeFBvd2VyID0gcGZ0U2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyOworI2VuZGlmCisKKyAgICBwQWRkQnNzUGFyYW1zLT5zdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHBBZGRCc3NQYXJhbXMtPnJlc3BSZXFkID0gdHJ1ZTsKKworICAgIHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc2Vzc2lvbklkID0gcGZ0U2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICBwQWRkQnNzUGFyYW1zLT5zZXNzaW9uSWQgPSBwZnRTZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIAorICAgIC8vIFNldCBhIG5ldyBzdGF0ZSBmb3IgTUxNRQorCisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0ZUX1JFQVNTT0NfU1RBVEU7CisKKyAgICBwQWRkQnNzUGFyYW1zLT5oYWxQZXJzb25hPSh0QU5JX1U4KXBmdFNlc3Npb25FbnRyeS0+cGVQZXJzb25hOyAvL3Bhc3Mgb24gdGhlIHNlc3Npb24gcGVyc29uYSB0byBoYWwKKyAgICAKKyAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5wQWRkQnNzUmVxID0gcEFkZEJzc1BhcmFtczsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiU2F2aW5nIFNJUl9IQUxfQUREX0JTU19SRVEgZm9yIHByZS1hdXRoIGFwLi4uIiApKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU2V0dXAgdGhlIG5ldyBzZXNzaW9uIGZvciB0aGUgcHJlLWF1dGggQVAuIAorICogUmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHNlc3Npb24gZW50cnkuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHBQRVNlc3Npb24gbGltRmlsbEZUU2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRwU2lyQnNzRGVzY3JpcHRpb24gIHBic3NEZXNjcmlwdGlvbiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0cFBFU2Vzc2lvbiAgICAgIHBmdFNlc3Npb25FbnRyeTsKKyAgICB0QU5JX1U4ICAgICAgICAgIGN1cnJlbnRCc3NVYXBzZDsKKyAgICB0QU5JX1U4ICAgICAgICAgIHNlc3Npb25JZDsKKyAgICB0UG93ZXJkQm0gICAgICAgIGxvY2FsUG93ZXJDb25zdHJhaW50OworICAgIHRQb3dlcmRCbSAgICAgICAgcmVnTWF4OworICAgIHRTY2hCZWFjb25TdHJ1Y3QgYmVhY29uU3RydWN0OworCisgICAgaWYoKHBmdFNlc3Npb25FbnRyeSA9IHBlQ3JlYXRlU2Vzc2lvbihwTWFjLCBwYnNzRGVzY3JpcHRpb24tPmJzc0lkLAorICAgICAgICAmc2Vzc2lvbklkLCBwTWFjLT5saW0ubWF4U3RhdGlvbikpID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNlc3Npb24gQ2FuIG5vdCBiZSBjcmVhdGVkIGZvciBwcmUtYXV0aCAxMVIgQVBcbiIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICAgICAKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHIHx8IGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwYnNzRGVzY3JpcHRpb24tPmJzc0lkLCBMT0dFKTsKKyNlbmRpZgorCisgICAgLyogU3RvcmUgUEUgc2Vzc2lvbiBJZCBpbiBzZXNzaW9uIFRhYmxlICovCisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworICAgIHBmdFNlc3Npb25FbnRyeS0+ZG90MTFtb2RlID0gcHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlOworICAgIHBmdFNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5ID0gcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5OworCisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkID0gcHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZDsKKyAgICBwZnRTZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQgPSBwc2Vzc2lvbkVudHJ5LT5saW1Rb3NFbmFibGVkOworICAgIHBmdFNlc3Npb25FbnRyeS0+bGltV3NtRW5hYmxlZCA9IHBzZXNzaW9uRW50cnktPmxpbVdzbUVuYWJsZWQ7CisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5saW0xMWhFbmFibGUgPSBwc2Vzc2lvbkVudHJ5LT5saW0xMWhFbmFibGU7CisKKyAgICAvLyBGaWVsZHMgdG8gYmUgZmlsbGVkIGxhdGVyCisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcSA9IE5VTEw7IAorICAgIHBmdFNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkID0gMDsgCisgICAgcGZ0U2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkID0gMDsgCisKKyAgICBsaW1FeHRyYWN0QXBDYXBhYmlsaXRpZXMoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcGJzc0Rlc2NyaXB0aW9uLT5pZUZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1HZXRJRWxlbkZyb21Cc3NEZXNjcmlwdGlvbiggcGJzc0Rlc2NyaXB0aW9uICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJlYWNvblN0cnVjdCApOworCisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5yYXRlU2V0Lm51bVJhdGVzID0gYmVhY29uU3RydWN0LnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICBwZnRTZXNzaW9uRW50cnktPnJhdGVTZXQucmF0ZSwKKyAgICAgICAgYmVhY29uU3RydWN0LnN1cHBvcnRlZFJhdGVzLnJhdGUsIGJlYWNvblN0cnVjdC5zdXBwb3J0ZWRSYXRlcy5udW1SYXRlcyApOworCisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0Lm51bVJhdGVzID0gYmVhY29uU3RydWN0LmV4dGVuZGVkUmF0ZXMubnVtUmF0ZXM7CisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwZnRTZXNzaW9uRW50cnktPmV4dFJhdGVTZXQucmF0ZSwgCisgICAgICAgIGJlYWNvblN0cnVjdC5leHRlbmRlZFJhdGVzLnJhdGUsIHBmdFNlc3Npb25FbnRyeS0+ZXh0UmF0ZVNldC5udW1SYXRlcyk7CisKKworICAgIHBmdFNlc3Npb25FbnRyeS0+c3NJZC5sZW5ndGggPSBiZWFjb25TdHJ1Y3Quc3NJZC5sZW5ndGg7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcGZ0U2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWQsIGJlYWNvblN0cnVjdC5zc0lkLnNzSWQsCisgICAgICAgIHBmdFNlc3Npb25FbnRyeS0+c3NJZC5sZW5ndGgpOworCisKKyAgICAvLyBTZWxmIE1hYworICAgIHNpckNvcHlNYWNBZGRyKHBmdFNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKTsKKyAgICBzaXJDb3B5TWFjQWRkcihwZnRTZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCwgcGJzc0Rlc2NyaXB0aW9uLT5ic3NJZCk7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRyB8fCBkZWZpbmVkIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcGZ0U2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWQsIExPR0UpOworI2VuZGlmCisKKyAgICAvKiBTdG9yZSBiZWFjb25JbnRlcnZhbCAqLworICAgIHBmdFNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmJlYWNvbkludGVydmFsID0gcGJzc0Rlc2NyaXB0aW9uLT5iZWFjb25JbnRlcnZhbDsKKyAgICBwZnRTZXNzaW9uRW50cnktPmJzc1R5cGUgPSBwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlOworCisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5zdGF0eXBlRm9yQnNzID0gU1RBX0VOVFJZX1BFRVI7CisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5ud1R5cGUgPSBwYnNzRGVzY3JpcHRpb24tPm53VHlwZTsKKworICAgIC8qIENvcHkgVGhlIGNoYW5uZWwgSWQgdG8gdGhlIHNlc3Npb24gVGFibGUgKi8KKyAgICBwZnRTZXNzaW9uRW50cnktPmxpbVJlYXNzb2NDaGFubmVsSWQgPSBwYnNzRGVzY3JpcHRpb24tPmNoYW5uZWxJZDsKKyAgICBwZnRTZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCA9IHBic3NEZXNjcmlwdGlvbi0+Y2hhbm5lbElkOworICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICBpZiAocGZ0U2Vzc2lvbkVudHJ5LT5ic3NUeXBlID09IGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERSkKKyAgICB7CisgICAgICAgIHBmdFNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9IGVMSU1fU1RBX1JPTEU7CisgICAgfQorICAgIGVsc2UgaWYocGZ0U2Vzc2lvbkVudHJ5LT5ic3NUeXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSkKKyAgICB7CisgICAgICAgIHBmdFNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9IGVMSU1fQlRfQU1QX1NUQV9ST0xFOworICAgIH0KKyAgICBlbHNlCisgICAgeyAgIAorICAgICAgICAvKiBUaHJvdyBhbiBlcnJvciBhbmQgcmV0dXJuIGFuZCBtYWtlIHN1cmUgdG8gZGVsZXRlIHRoZSBzZXNzaW9uLiovCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBic3MgdHlwZVxuIikpOworICAgIH0gICAgCisgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHBmdFNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc0NhcHMgPSBwYnNzRGVzY3JpcHRpb24tPmNhcGFiaWxpdHlJbmZvOworICAgIHBmdFNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0Jzc0NhcHMgPSBwYnNzRGVzY3JpcHRpb24tPmNhcGFiaWxpdHlJbmZvOworICAgICAgICAgICAgCisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50VGl0YW5IdENhcHM9CisgICAgICAgICAgICAgICAgICAgIHBic3NEZXNjcmlwdGlvbi0+dGl0YW5IdENhcHM7CisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jVGl0YW5IdENhcHM9CisgICAgICAgIHBmdFNlc3Npb25FbnRyeS0+bGltQ3VycmVudFRpdGFuSHRDYXBzOworCisgICAgcmVnTWF4ID0gY2ZnR2V0UmVndWxhdG9yeU1heFRyYW5zbWl0UG93ZXIoIHBNYWMsIHBmdFNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsICk7IAorICAgIGxvY2FsUG93ZXJDb25zdHJhaW50ID0gcmVnTWF4OworICAgIGxpbUV4dHJhY3RBcENhcGFiaWxpdHkoIHBNYWMsICh0QU5JX1U4ICopIHBic3NEZXNjcmlwdGlvbi0+aWVGaWVsZHMsIAorICAgICAgICBsaW1HZXRJRWxlbkZyb21Cc3NEZXNjcmlwdGlvbihwYnNzRGVzY3JpcHRpb24pLAorICAgICAgICAmcGZ0U2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QnNzUW9zQ2FwcywKKyAgICAgICAgJnBmdFNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc1Byb3BDYXAsCisgICAgICAgICZjdXJyZW50QnNzVWFwc2QgLCAmbG9jYWxQb3dlckNvbnN0cmFpbnQpOworCisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUW9zQ2FwcyA9CisgICAgICAgIHBmdFNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc1Fvc0NhcHM7CisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUHJvcENhcCA9CisgICAgICAgIHBmdFNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc1Byb3BDYXA7CisKKworICAgIHBmdFNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciA9IFZPU19NSU4oIHJlZ01heCAsIChsb2NhbFBvd2VyQ29uc3RyYWludCkgKTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsICIlczogUmVndWxhdG9yeSBtYXggPSAlZCwgbG9jYWwgcG93ZXIgY29uc3RyYWludCA9ICVkLCBtYXggdHggPSAlZCIsIAorICAgICAgICBfX0ZVTkNUSU9OX18sIHJlZ01heCwgbG9jYWxQb3dlckNvbnN0cmFpbnQsIHBmdFNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciApOworI2VuZGlmCisKKyAgICBwZnRTZXNzaW9uRW50cnktPmxpbVJGQmFuZCA9IGxpbUdldFJGQmFuZChwZnRTZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCk7CisKKyAgICBwZnRTZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZSA9IHBmdFNlc3Npb25FbnRyeS0+bGltU21lU3RhdGU7CisgICAgcGZ0U2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEU7CisKKyAgICBwZnRTZXNzaW9uRW50cnktPmVuY3J5cHRUeXBlID0gcHNlc3Npb25FbnRyeS0+ZW5jcnlwdFR5cGU7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIiVzOiBDcmVhdGVkIHNlc3Npb24gd2l0aCB0aGUgaWQgPSAlZFxuIiwgCisgICAgICAgX19GVU5DVElPTl9fLCBwZnRTZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTspCisjZW5kaWYKKworICAgIHJldHVybiBwZnRTZXNzaW9uRW50cnk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU2V0dXAgdGhlIHNlc3Npb24gYW5kIHRoZSBhZGQgYnNzIHJlcSBmb3IgdGhlIHByZS1hdXRoIEFQLiAKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbUZUU2V0dXBBdXRoU2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRwUEVTZXNzaW9uIHBmdFNlc3Npb25FbnRyeTsKKworICAgIC8vIFByZXBhcmUgdGhlIHNlc3Npb24gcmlnaHQgbm93IHdpdGggYXMgbXVjaCBhcyBwb3NzaWJsZS4KKyAgICBwZnRTZXNzaW9uRW50cnkgPSBsaW1GaWxsRlRTZXNzaW9uKHBNYWMsIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnBic3NEZXNjcmlwdGlvbiwgcHNlc3Npb25FbnRyeSk7CisKKyAgICBpZiAocGZ0U2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgICAgcGZ0U2Vzc2lvbkVudHJ5LT5pczExUmNvbm5lY3Rpb24gPSBwc2Vzc2lvbkVudHJ5LT5pczExUmNvbm5lY3Rpb247CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICBwZnRTZXNzaW9uRW50cnktPmlzQ0NYY29ubmVjdGlvbiA9IHBzZXNzaW9uRW50cnktPmlzQ0NYY29ubmVjdGlvbjsKKyNlbmRpZgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgfHwgZGVmaW5lZCBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgIHBmdFNlc3Npb25FbnRyeS0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQgPSBwc2Vzc2lvbkVudHJ5LT5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZDsKKyNlbmRpZgorICAgICAgICBsaW1GVFByZXBhcmVBZGRCc3NSZXEoIHBNYWMsIEZBTFNFLCBwZnRTZXNzaW9uRW50cnksIAorICAgICAgICAgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+cGJzc0Rlc2NyaXB0aW9uICk7CisgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBmdFNlc3Npb25FbnRyeSA9IHBmdFNlc3Npb25FbnRyeTsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXN1bWUgTGluayBDYWxsIEJhY2sgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbUZUUHJvY2Vzc1ByZUF1dGhSZXN1bHQodHBBbmlTaXJHbG9iYWwgcE1hYywgZUhhbFN0YXR1cyBzdGF0dXMsIHRBTklfVTMyICpkYXRhKQoreworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisKKyAgICBwc2Vzc2lvbkVudHJ5ID0gKHRwUEVTZXNzaW9uKWRhdGE7CisKKyAgICBpZiAocE1hYy0+ZnQuZnRQRUNvbnRleHQuZnRQcmVBdXRoU3RhdHVzID09IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUZUU2V0dXBBdXRoU2Vzc2lvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisKKyAgICAvLyBQb3N0IHRoZSBGVCBQcmUgQXV0aCBSZXNwb25zZSB0byBTTUUKKyAgICBsaW1Qb3N0RlRQcmVBdXRoUnNwKHBNYWMsIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LmZ0UHJlQXV0aFN0YXR1cywKKyAgICAgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQuc2F2ZWRfYXV0aF9yc3AsCisgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnNhdmVkX2F1dGhfcnNwX2xlbmd0aCwgcHNlc3Npb25FbnRyeSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlc3VtZSBMaW5rIENhbGwgQmFjayAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltUGVyZm9ybVBvc3RGVFByZUF1dGhBbmRDaGFubmVsQ2hhbmdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgc3RhdHVzLCB0QU5JX1UzMiAqZGF0YSwgCisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICAvL1NldCB0aGUgcmVzdW1lIGNoYW5uZWwgdG8gQW55IHZhbGlkIGNoYW5uZWwgKGludmFsaWQpLiAKKyAgICAvL1RoaXMgd2lsbCBpbnN0cnVjdCBIQUwgdG8gc2V0IGl0IHRvIGFueSBwcmV2aW91cyB2YWxpZCBjaGFubmVsLgorICAgIHBlU2V0UmVzdW1lQ2hhbm5lbChwTWFjLCAwLCAwKTsKKyAgICBsaW1SZXN1bWVMaW5rKHBNYWMsIGxpbUZUUHJvY2Vzc1ByZUF1dGhSZXN1bHQsICh0QU5JX1UzMiAqKXBzZXNzaW9uRW50cnkpOworfQorCit0U2lyUmV0U3RhdHVzIGxpbUNyZWF0ZVJJQ0Jsb2NrQWNrSUUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCB0aWQsIHRDZmdUcmFmZmljQ2xhc3MgKnBUcmFmZmljQ2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpyaWNfaWVzLCB0QU5JX1UzMiAqaWVMZW5ndGgpCit7CisgICAgdERvdDExZklFUklDRGF0YURlc2MgcmljSWU7CisgICAgdERvdDExZkZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbCBiYVNzbkNvbnRyb2w7CisgICAgdERvdDExZkZmQWRkQkFQYXJhbWV0ZXJTZXQgYmFQYXJhbVNldDsKKyAgICB0RG90MTFmRmZCQVRpbWVvdXQgIGJhVGltZW91dDsKKworICAgIHZvc19tZW1femVybygmcmljSWUsIHNpemVvZih0RG90MTFmSUVSSUNEYXRhRGVzYykpOworICAgIHZvc19tZW1femVybygmYmFTc25Db250cm9sLCBzaXplb2YodERvdDExZkZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbCkpOworICAgIHZvc19tZW1femVybygmYmFQYXJhbVNldCwgc2l6ZW9mKHREb3QxMWZGZkFkZEJBUGFyYW1ldGVyU2V0KSk7CisgICAgdm9zX21lbV96ZXJvKCZiYVRpbWVvdXQsIHNpemVvZih0RG90MTFmRmZCQVRpbWVvdXQpKTsKKworICAgIHJpY0llLnByZXNlbnQgPSAxOworICAgIHJpY0llLlJJQ0RhdGEucHJlc2VudCA9IDE7CisgICAgcmljSWUuUklDRGF0YS5yZXNvdXJjZURlc2NDb3VudCA9IDE7CisgICAgcmljSWUuUklDRGF0YS5JZGVudGlmaWVyID0gTElNX0ZUX1JJQ19CQV9ESUFMT0dfVE9LRU5fVElEXzAgKyB0aWQ7CisgICAgcmljSWUuUklDRGVzY3JpcHRvci5wcmVzZW50ID0gMTsKKyAgICByaWNJZS5SSUNEZXNjcmlwdG9yLnJlc291cmNlVHlwZSA9IExJTV9GVF9SSUNfREVTQ1JJUFRPUl9SRVNPVVJDRV9UWVBFX0JBOworICAgIGJhUGFyYW1TZXQudGlkID0gdGlkOworICAgIGJhUGFyYW1TZXQucG9saWN5ID0gcFRyYWZmaWNDbGFzcy0+ZlR4QkFwb2xpY3k7ICAvLyBJbW1lZGlhdGUgQmxvY2sgQWNrCisgICAgYmFQYXJhbVNldC5idWZmZXJTaXplID0gcFRyYWZmaWNDbGFzcy0+dHhCdWZTaXplOworICAgIHZvc19tZW1fY29weSgodl9WT0lEX3QgKikmYmFUaW1lb3V0LCAodl9WT0lEX3QgKikmcFRyYWZmaWNDbGFzcy0+dHVUeEJBV2FpdFRpbWVvdXQsIHNpemVvZihiYVRpbWVvdXQpKTsKKyAgICBiYVNzbkNvbnRyb2wuZnJhZ051bWJlciA9IDA7CisgICAgYmFTc25Db250cm9sLnNzbiA9IExJTV9GVF9SSUNfQkFfU1NOOworCisgICAgZG90MTFmUGFja0ZmQWRkQkFQYXJhbWV0ZXJTZXQocE1hYywgJmJhUGFyYW1TZXQsICZyaWNJZS5SSUNEZXNjcmlwdG9yLnZhcmlhYmxlRGF0YVtyaWNJZS5SSUNEZXNjcmlwdG9yLm51bV92YXJpYWJsZURhdGFdKTsKKyAgICAvL3Zvc19tZW1fY29weSgmcmljSWUuUklDRGVzY3JpcHRvci52YXJpYWJsZURhdGFbcmljSWUuUklDRGVzY3JpcHRvci5udW1fdmFyaWFibGVEYXRhXSwgJmJhUGFyYW1TZXQsIHNpemVvZih0RG90MTFmRmZBZGRCQVBhcmFtZXRlclNldCkpOworICAgIHJpY0llLlJJQ0Rlc2NyaXB0b3IubnVtX3ZhcmlhYmxlRGF0YSArPSBzaXplb2YodERvdDExZkZmQWRkQkFQYXJhbWV0ZXJTZXQpOworCisgICAgZG90MTFmUGFja0ZmQkFUaW1lb3V0KHBNYWMsICZiYVRpbWVvdXQsICZyaWNJZS5SSUNEZXNjcmlwdG9yLnZhcmlhYmxlRGF0YVtyaWNJZS5SSUNEZXNjcmlwdG9yLm51bV92YXJpYWJsZURhdGFdKTsKKyAgICAvL3Zvc19tZW1fY29weSgmcmljSWUuUklDRGVzY3JpcHRvci52YXJpYWJsZURhdGFbcmljSWUuUklDRGVzY3JpcHRvci5udW1fdmFyaWFibGVEYXRhXSwgJmJhVGltZW91dCwgc2l6ZW9mKHREb3QxMWZGZkJBVGltZW91dCkpOworICAgIHJpY0llLlJJQ0Rlc2NyaXB0b3IubnVtX3ZhcmlhYmxlRGF0YSArPSBzaXplb2YodERvdDExZkZmQkFUaW1lb3V0KTsKKworICAgIGRvdDExZlBhY2tGZkJBU3RhcnRpbmdTZXF1ZW5jZUNvbnRyb2wocE1hYywgJmJhU3NuQ29udHJvbCwgJnJpY0llLlJJQ0Rlc2NyaXB0b3IudmFyaWFibGVEYXRhW3JpY0llLlJJQ0Rlc2NyaXB0b3IubnVtX3ZhcmlhYmxlRGF0YV0pOworICAgIC8vdm9zX21lbV9jb3B5KCZyaWNJZS5SSUNEZXNjcmlwdG9yLnZhcmlhYmxlRGF0YVtyaWNJZS5SSUNEZXNjcmlwdG9yLm51bV92YXJpYWJsZURhdGFdLCAmYmFTc25Db250cm9sLCBzaXplb2YodERvdDExZkZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbCkpOworICAgIHJpY0llLlJJQ0Rlc2NyaXB0b3IubnVtX3ZhcmlhYmxlRGF0YSArPSBzaXplb2YodERvdDExZkZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbCk7CisKKyAgICByZXR1cm4gKHRTaXJSZXRTdGF0dXMpIGRvdDExZlBhY2tJZVJJQ0RhdGFEZXNjKHBNYWMsICZyaWNJZSwgcmljX2llcywgc2l6ZW9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjKSwgaWVMZW5ndGgpOworfQorCit0U2lyUmV0U3RhdHVzIGxpbUZURmlsbFJJQ0Jsb2NrQWNrSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpyaWNfaWVzLCB0QU5JX1UzMiAqcmljX2llc19sZW5ndGgpCit7CisgICAgdEFOSV9VOCB0aWQgPSAwOworICAgIHRwRHBoSGFzaE5vZGUgcFN0YTsKKyAgICB0QU5JX1UxNiBudW1CQSA9IDAsIGFpZCA9IDA7CisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9IHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBzYXZlZHNlc3Npb25FbnRyeTsKKyAgICB0QU5JX1UzMiBvZmZzZXQgPSAwLCBpZUxlbmd0aCA9IDA7CisgICAgdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisgICAgCisgICAgLy8gRmlyc3QsIGV4dHJhY3QgdGhlIERQSCBlbnRyeQorICAgIHBTdGEgPSBkcGhMb29rdXBIYXNoRW50cnkoIHBNYWMsIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPmN1cnJic3NJZCwgJmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgIGlmKCBOVUxMID09IHBTdGEgKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgIEZMKCAiU1RBIGNvbnRleHQgbm90IGZvdW5kIGZvciBzYXZlZCBzZXNzaW9uJ3MgQlNTSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIgKSwKKyAgICAgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPmN1cnJic3NJZFswXSwgCisgICAgICAgICAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5jdXJyYnNzSWRbMV0sIAorICAgICAgICAgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+Y3VycmJzc0lkWzJdLCAKKyAgICAgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPmN1cnJic3NJZFszXSwgCisgICAgICAgICAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5jdXJyYnNzSWRbNF0sIAorICAgICAgICAgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+Y3VycmJzc0lkWzVdICk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGZvciAodGlkID0gMDsgdGlkIDwgU1RBQ0ZHX01BWF9UQzsgdGlkKyspCisgICAgeworICAgICAgICBpZiAocFN0YS0+dGNDZmdbdGlkXS5mVXNlQkFUeCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gbGltQ3JlYXRlUklDQmxvY2tBY2tJRShwTWFjLCB0aWQsICZwU3RhLT50Y0NmZ1t0aWRdLCByaWNfaWVzICsgb2Zmc2V0LCAmaWVMZW5ndGgpOworICAgICAgICAgICAgaWYgKGVTSVJfU1VDQ0VTUyA9PSBzdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGllTGVuZ3RoOworICAgICAgICAgICAgICAgICpyaWNfaWVzX2xlbmd0aCArPSBpZUxlbmd0aDsKKyAgICAgICAgICAgICAgICBudW1CQSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkJBIFJJQyBJRSBjcmVhdGlvbiBmb3IgVElEICVkIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIpLCB0aWQsIHN0YXR1cyk7KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiTnVtYmVyIG9mIEJBIFJJQyBJRXMgY3JlYXRlZCA9ICVkOiBUb3RhbCBsZW5ndGggPSAlZFxuIiksIG51bUJBLCAqcmljX2llc19sZW5ndGgpOykKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBXaWxsIHBvc3QgcHJlIGF1dGggcmVzcG9uc2UgdG8gU01FLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltUG9zdEZUUHJlQXV0aFJzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHN0YXR1cywKKyAgICB0QU5JX1U4ICphdXRoX3JzcCwgdEFOSV9VMTYgIGF1dGhfcnNwX2xlbmd0aCwKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRwU2lyRlRQcmVBdXRoUnNwIHBGVFByZUF1dGhSc3A7CisgICAgdFNpck1zZ1EgICAgICAgICAgbW1oTXNnOworICAgIHRBTklfVTE2IHJzcExlbiA9IHNpemVvZih0U2lyRlRQcmVBdXRoUnNwKTsgICAKKyAgICB0U2lyUmV0U3RhdHVzICAgc2lyU3RhdHVzID0gZVNJUl9TVUNDRVNTOworCisgICAgcEZUUHJlQXV0aFJzcCA9ICh0cFNpckZUUHJlQXV0aFJzcCl2b3NfbWVtX21hbGxvYyhyc3BMZW4pOworICAgIGlmKE5VTEwgPT0gcEZUUHJlQXV0aFJzcCkKKyAgICB7CisgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOykKKyAgICAgICBWT1NfQVNTRVJUKHBGVFByZUF1dGhSc3AgIT0gTlVMTCk7CisgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2b3NfbWVtX3plcm8oIHBGVFByZUF1dGhSc3AsIHJzcExlbik7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICIlczogQXV0aCBSc3AgPSAlcFxuIiwgcEZUUHJlQXV0aFJzcCk7KQorI2VuZGlmCisgICAgICAgICAKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMsICh0QU5JX1U4KilwRlRQcmVBdXRoUnNwLCByc3BMZW4pOworICAgIHBGVFByZUF1dGhSc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfRlRfUFJFX0FVVEhfUlNQOworICAgIHBGVFByZUF1dGhSc3AtPmxlbmd0aCA9ICh0QU5JX1UxNikgcnNwTGVuOworICAgIHBGVFByZUF1dGhSc3AtPnN0YXR1cyA9IHN0YXR1czsKKyAgICBpZiAocHNlc3Npb25FbnRyeSkKKyAgICAgICAgcEZUUHJlQXV0aFJzcC0+c21lU2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCisgICAgLy8gVGhlIGJzc2lkIG9mIHRoZSBBUCB3ZSBhcmUgc2VuZGluZyBBdXRoMSB0by4KKyAgICBpZiAocE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcSkKKyAgICAgICAgc2lyQ29weU1hY0FkZHIocEZUUHJlQXV0aFJzcC0+cHJlQXV0aGJzc0lkLCAKKyAgICAgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnByZUF1dGhic3NJZCk7CisgICAgCisgICAgLy8gQXR0YWNoIHRoZSBhdXRoIHJlc3BvbnNlIG5vdyBiYWNrIHRvIFNNRQorICAgIHBGVFByZUF1dGhSc3AtPmZ0X2llc19sZW5ndGggPSAwOworICAgIGlmICgoYXV0aF9yc3AgIT0gTlVMTCkgJiYgKGF1dGhfcnNwX2xlbmd0aCA8IE1BWF9GVElFX1NJWkUpKQorICAgIHsKKyAgICAgICAgLy8gT25seSAxMXIgYXNzb2MgaGFzIEZUIElFcy4KKyAgICAgICAgdm9zX21lbV9jb3B5KHBGVFByZUF1dGhSc3AtPmZ0X2llcywgYXV0aF9yc3AsIGF1dGhfcnNwX2xlbmd0aCk7IAorICAgICAgICBwRlRQcmVBdXRoUnNwLT5mdF9pZXNfbGVuZ3RoID0gYXV0aF9yc3BfbGVuZ3RoOworICAgIH0KKyAgICAKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGlmICgocHNlc3Npb25FbnRyeSkgJiYgKHBzZXNzaW9uRW50cnktPmlzMTFSY29ubmVjdGlvbikpCisgICAgeworICAgICAgICAvKiBGaWxsIGluIHRoZSBCbG9jayBBY2sgUklDIElFcyBpbiB0aGUgcHJlQXV0aFJzcCAqLworICAgICAgICBzaXJTdGF0dXMgPSBsaW1GVEZpbGxSSUNCbG9ja0Fja0luZm8ocE1hYywgcEZUUHJlQXV0aFJzcC0+cmljX2llcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSZwRlRQcmVBdXRoUnNwLT5yaWNfaWVzX2xlbmd0aCk7CisgICAgICAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gc2lyU3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJGaWxsIFJJQyBCQSBJbmZvIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIpLCBzaXJTdGF0dXMpOykKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIAorICAgIG1taE1zZy50eXBlID0gcEZUUHJlQXV0aFJzcC0+bWVzc2FnZVR5cGU7CisgICAgbW1oTXNnLmJvZHlwdHIgPSBwRlRQcmVBdXRoUnNwOworICAgIG1taE1zZy5ib2R5dmFsID0gMDsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiUG9zdGVkIEF1dGggUnNwIHRvIFNNRVxuIik7KQorI2VuZGlmCisgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIlBvc3RlZCBBdXRoIFJzcCB0byBTTUUgd2l0aCBzdGF0dXMgb2YgJWRcbiIsIHN0YXR1cyk7KQorICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgIGVQUk9UKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZW5kIHRoZSBGVCBQcmUgQXV0aCBSZXNwb25zZSB0byBTTUUgd2hlbiBldmVyIHdlIGhhdmUgYSBzdGF0dXMKKyAqIHJlYWR5IHRvIGJlIHNlbnQgdG8gU01FCisgKgorICogU01FIHdpbGwgYmUgdGhlIG9uZSB0byBzZW5kIGl0IHVwIHRvIHRoZSBzdXBwbGljYW50IHRvIHJlY2VpdmUgCisgKiBGVElFcyB3aGljaCB3aWxsIGJlIHJlcXVpcmVkIGZvciBSZWFzc29jIFJlcS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbUhhbmRsZUZUUHJlQXV0aFJzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHN0YXR1cywKKyAgICB0QU5JX1U4ICphdXRoX3JzcCwgdEFOSV9VMTYgIGF1dGhfcnNwX2xlbmd0aCwKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCisgICAgLy8gU2F2ZSB0aGUgc3RhdHVzIG9mIHByZS1hdXRoCisgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQuZnRQcmVBdXRoU3RhdHVzID0gc3RhdHVzOyAKKworICAgIC8vIFNhdmUgdGhlIGF1dGggcnNwLCBzbyB3ZSBjYW4gc2VuZCBpdCB0byAKKyAgICAvLyBTTUUgb25jZSB3ZSByZXN1bWUgbGluay4gCisgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQuc2F2ZWRfYXV0aF9yc3BfbGVuZ3RoID0gMDsgCisgICAgaWYgKChhdXRoX3JzcCAhPSBOVUxMKSAmJiAoYXV0aF9yc3BfbGVuZ3RoIDwgTUFYX0ZUSUVfU0laRSkpCisgICAgeworICAgICAgICB2b3NfbWVtX2NvcHkocE1hYy0+ZnQuZnRQRUNvbnRleHQuc2F2ZWRfYXV0aF9yc3AsCisgICAgICAgICAgICBhdXRoX3JzcCwgYXV0aF9yc3BfbGVuZ3RoKTsgCisgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnNhdmVkX2F1dGhfcnNwX2xlbmd0aCA9IGF1dGhfcnNwX2xlbmd0aDsKKyAgICB9CisKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsICE9IAorICAgICAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5wcmVBdXRoY2hhbm5lbE51bSkgCisgICAgeworICAgICAgICAvLyBOZWVkIHRvIG1vdmUgdG8gdGhlIG9yaWdpbmFsIEFQIGNoYW5uZWwKKyAgICAgICAgbGltQ2hhbmdlQ2hhbm5lbFdpdGhDYWxsYmFjayhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwsIAorICAgICAgICAgICAgICAgIGxpbVBlcmZvcm1Qb3N0RlRQcmVBdXRoQW5kQ2hhbm5lbENoYW5nZSwgTlVMTCwgcHNlc3Npb25FbnRyeSk7CisgICAgfQorICAgIGVsc2UgCisgICAgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICJQcmUgYXV0aCBvbiBzYW1lIGNoYW5uZWwgYXMgY29ubmVjdGVkIEFQIGNoYW5uZWwgJWRcbiIsIAorICAgICAgICAgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+cHJlQXV0aGNoYW5uZWxOdW0pOykKKyNlbmRpZgorICAgICAgICBsaW1GVFByb2Nlc3NQcmVBdXRoUmVzdWx0KHBNYWMsIHN0YXR1cywgKHRBTklfVTMyICopcHNlc3Npb25FbnRyeSk7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIDExUiBSZWFzc29jIFJlcSBmcm9tIFNNRQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltUHJvY2Vzc01sbUZUUmVhc3NvY1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZiwKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTggc21lU2Vzc2lvbklkID0gMDsKKyAgICB0QU5JX1UxNiB0cmFuc2FjdGlvbklkID0gMDsKKyAgICB0QU5JX1U4IGNoYW5OdW0gPSAwOyAKKyAgICB0TGltTWxtUmVhc3NvY1JlcSAgKnBNbG1SZWFzc29jUmVxOworICAgIHRBTklfVTE2IGNhcHM7CisgICAgdEFOSV9VMzIgdmFsOworICAgIHRTaXJNc2dRIG1zZ1E7CisgICAgdFNpclJldFN0YXR1cyByZXRDb2RlOworICAgIHRBTklfVTMyIHRlbGVCY25FbiA9IDA7CisKKyAgICBjaGFuTnVtID0gcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsOyAKKyAgICBsaW1HZXRTZXNzaW9uSW5mbyhwTWFjLCh0QU5JX1U4KilwTXNnQnVmLCAmc21lU2Vzc2lvbklkLCAmdHJhbnNhY3Rpb25JZCk7CisgICAgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkID0gc21lU2Vzc2lvbklkOworICAgIHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworCisKKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1sbVJlYXNzb2NSZXEsIAorICAgICAgICBzaXplb2YodExpbU1sbVJlYXNzb2NSZXEpKSkKKyAgICB7CisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1SZWFzc29jUmVxXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTWxtUmVhc3NvY1JlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJnBNbG1SZWFzc29jUmVxLT5yZWFzc29jRmFpbHVyZVRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ291bGQgbm90IGdldCBSZWFzc29jRmFpbHVyZVRpbWVvdXQgdmFsdWUKKyAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIFJlYXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNmZ0dldENhcGFiaWxpdHlJbmZvKHBNYWMsICZjYXBzLHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IENhcGFiaWxpdGllcyB2YWx1ZQorICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQ2FwYWJpbGl0aWVzIHZhbHVlXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcE1sbVJlYXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvID0gY2FwczsKKyAgICAKKyAgICAvKiBVcGRhdGUgUEUgc2Vzc2lvbklkKi8KKyAgICBwTWxtUmVhc3NvY1JlcS0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKyAgICAvKiBJZiB0ZWxlc2NvcGljIGJlYWNvbmluZyBpcyBlbmFibGVkLCBzZXQgbGlzdGVuIGludGVydmFsIHRvIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJICovCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU4sICZ0ZWxlQmNuRW4pICE9IAorICAgICAgIGVTSVJfU1VDQ0VTUykgCisgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDb3VsZG4ndCBnZXQgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU5cbiIpKTsKKworICAgIGlmKHRlbGVCY25FbikKKyAgICB7CisgICAgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19URUxFX0JDTl9NQVhfTEksICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgICogQ291bGQgbm90IGdldCBMaXN0ZW5JbnRlcnZhbCB2YWx1ZQorICAgICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICovCisgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgTGlzdGVuSW50ZXJ2YWxcbiIpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMLCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICB7CisgICAgICAgICAvKioKKyAgICAgICAgICAgICogQ291bGQgbm90IGdldCBMaXN0ZW5JbnRlcnZhbCB2YWx1ZQorICAgICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgKi8KKyAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIExpc3RlbkludGVydmFsXG4iKSk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGlmIChsaW1TZXRMaW5rU3RhdGUocE1hYywgZVNJUl9MSU5LX1BSRUFTU09DX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19QUkVBU1NPQ19TVEFURSwgcHNlc3Npb25FbnRyeS0+YnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgTlVMTCwgTlVMTCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19QT1NUQVNTT0NfU1RBVEUsIHBzZXNzaW9uRW50cnktPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsIE5VTEwsIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcE1sbVJlYXNzb2NSZXEtPmxpc3RlbkludGVydmFsID0gKHRBTklfVTE2KSB2YWw7CisKKyAgICBwc2Vzc2lvbkVudHJ5LT5wTGltTWxtUmVhc3NvY1JlcSA9IHBNbG1SZWFzc29jUmVxOworCisKKyAgICAvL3dlIG5lZWQgdG8gZGVmZXIgdGhlIG1lc3NhZ2UgdW50aWwgd2UgZ2V0IHRoZSByZXNwb25zZSBiYWNrIGZyb20gSEFMLgorICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKyAKKyAgICBtc2dRLnR5cGUgPSBTSVJfSEFMX0FERF9CU1NfUkVROworICAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgIG1zZ1EuYm9keXB0ciA9IHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBBZGRCc3NSZXE7CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJTZW5kaW5nIFNJUl9IQUxfQUREX0JTU19SRVEuLi4iICkpOworI2VuZGlmCisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisKKyAgICByZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICk7CisgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSByZXRDb2RlKSAKKyAgICB7CisgICAgICAgIHZvc19tZW1fZnJlZShwTWFjLT5mdC5mdFBFQ29udGV4dC5wQWRkQnNzUmVxKTsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiUG9zdGluZyBBRERfQlNTX1JFUSB0byBIQUwgZmFpbGVkLCByZWFzb249JVhcbiIpLAorICAgICAgICAgICAgICAgIHJldENvZGUgKTsKKyAgICB9CisgICAgLy8gRG9udCBuZWVkIHRoaXMgYW55bW9yZQorICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBBZGRCc3NSZXEgPSBOVUxMOworICAgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiBwcmVhdXRoIHJlc3BvbnNlIGlzIG5vdCByZWNlaXZlZCBmcm9tIHRoZSBBUAorICogd2l0aGluIHRoaXMgdGltZW91dCB3aGlsZSBGVCBpbiBwcm9ncmVzcworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltUHJvY2Vzc0ZUUHJlYXV0aFJzcFRpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCisgICAgLy8gV2UgaGF2ZSBmYWlsZWQgcHJlIGF1dGguIFdlIG5lZWQgdG8gcmVzdW1lIGxpbmsgYW5kIGdldCBiYWNrIG9uCisgICAgLy8gaG9tZSBjaGFubmVsLgorCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltRlRQcmVBdXRoUnNwVGltZXIuc2Vzc2lvbklkKSk9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBPaywgc28gYXR0ZW1wdGVkIGF0IFByZS1BdXRoIGFuZCBmYWlsZWQuIElmIHdlIGFyZSBvZmYgY2hhbm5lbC4gV2UgbmVlZAorICAgIC8vIHRvIGdldCBiYWNrLgorICAgIGxpbUhhbmRsZUZUUHJlQXV0aFJzcChwTWFjLCBlU0lSX0ZBSUxVUkUsIE5VTEwsIDAsIHBzZXNzaW9uRW50cnkpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyB0aGUgdXBkYXRlIGtleSByZXF1ZXN0IGZyb20gU01FCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9CT09MRUFOIGxpbVByb2Nlc3NGVFVwZGF0ZUtleSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZiApCit7CisgICB0QWRkQnNzUGFyYW1zICogcEFkZEJzc1BhcmFtczsKKyAgIHRTaXJGVFVwZGF0ZUtleUluZm8gKiBwS2V5SW5mbzsKKyAgIHRBTklfVTMyIHZhbCA9IDA7CisKKyAgIC8qIFNhbml0eSBDaGVjayAqLworICAgaWYoIHBNYWMgPT0gTlVMTCB8fCBwTXNnQnVmID09IE5VTEwgKQorICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICB9CisKKyAgIHBBZGRCc3NQYXJhbXMgPSBwTWFjLT5mdC5mdFBFQ29udGV4dC5wQWRkQnNzUmVxOworICAgcEtleUluZm8gPSAodFNpckZUVXBkYXRlS2V5SW5mbyAqKXBNc2dCdWY7CisKKyAgIC8qIFN0b3JlIHRoZSBrZXkgaW5mb3JtYXRpb24gaW4gdGhlIEFERCBCU1MgcGFyYW1ldGVycyAqLworICAgcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW1WYWxpZCA9IDE7CisgICBwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5lbmNUeXBlID0gcEtleUluZm8tPmtleU1hdGVyaWFsLmVkVHlwZTsKKyAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZwQWRkQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXksCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcEtleUluZm8tPmtleU1hdGVyaWFsLmtleSwgc2l6ZW9mKCB0U2lyS2V5cyApKTsKKyAgaWYoZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU0lOR0xFX1RJRF9SQywgJnZhbCkpCisgIHsKKyAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCggIlVuYWJsZSB0byByZWFkIFdOSV9DRkdfU0lOR0xFX1RJRF9SQ1xuIiApKTsKKyAgfQorCisgIHBBZGRCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLnNpbmdsZVRpZFJjID0gdmFsOyAgICAKKworICByZXR1cm4gVFJVRTsgICAKK30KKwordFNpclJldFN0YXR1cworbGltUHJvY2Vzc0ZUQWdnclFvc1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZiApCit7CisgICAgdFNpck1zZ1EgbXNnOworICAgIHRTaXJBZ2dyUW9zUmVxICogYWdnclFvc1JlcSA9ICh0U2lyQWdnclFvc1JlcSAqKXBNc2dCdWY7CisgICAgdHBBZ2dyQWRkVHNQYXJhbXMgcEFnZ3JBZGRUc1BhcmFtOworICAgIHRwUEVTZXNzaW9uICBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKyAgICB0cExpbVRzcGVjSW5mbyAgIHRzcGVjSW5mbzsKKyAgICB0QU5JX1U4ICAgICAgICAgIGFjOyAKKyAgICB0cERwaEhhc2hOb2RlICAgIHBTdGE7CisgICAgdEFOSV9VMTYgICAgICAgICBhaWQ7CisgICAgdEFOSV9VOCBzZXNzaW9uSWQ7CisgICAgaW50IGk7CisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKikmcEFnZ3JBZGRUc1BhcmFtLAorICAgICAgICAgICAgICAgIHNpemVvZih0QWdnckFkZFRzUGFyYW1zKSkpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZFxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICB9CisKKyAgICBwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYywgYWdnclFvc1JlcS0+YnNzSWQsICZzZXNzaW9uSWQpOworCisgICAgaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJwc2Vzc2lvbiBFbnRyeSBOdWxsIGZvciBzZXNzaW9uSWQgPSAlZFxuIiksIGFnZ3JRb3NSZXEtPnNlc3Npb25JZCk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHBTdGEgPSBkcGhMb29rdXBIYXNoRW50cnkocE1hYywgYWdnclFvc1JlcS0+YnNzSWQsICZhaWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICBpZiAocFN0YSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU3RhdGlvbiBjb250ZXh0IG5vdCBmb3VuZCAtIGlnbm9yaW5nIEFkZFRzUnNwXG4iKSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopcEFnZ3JBZGRUc1BhcmFtLAorICAgICAgICAgICAgc2l6ZW9mKHRBZ2dyQWRkVHNQYXJhbXMpKTsKKyAgICBwQWdnckFkZFRzUGFyYW0tPnN0YUlkeCA9IHBzZXNzaW9uRW50cnktPnN0YUlkOworICAgIC8vIEZpbGwgaW4gdGhlIHNlc3Npb25JZCBzcGVjaWZpYyB0byBQRQorICAgIHBBZ2dyQWRkVHNQYXJhbS0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIHBBZ2dyQWRkVHNQYXJhbS0+dHNwZWNJZHggPSBhZ2dyUW9zUmVxLT5hZ2dySW5mby50c3BlY0lkeDsKKworICAgIGZvciggaSA9IDA7IGkgPCBIQUxfUU9TX05VTV9BQ19NQVg7IGkrKyApCisgICAgeworICAgICAgICBpZiAoYWdnclFvc1JlcS0+YWdnckluZm8udHNwZWNJZHggJiAoMTw8aSkpIAorICAgICAgICB7CisgICAgICAgICAgICB0U2lyTWFjVHNwZWNJRSAqcFRzcGVjID0gJmFnZ3JRb3NSZXEtPmFnZ3JJbmZvLmFnZ3JBZGRUc0luZm9baV0udHNwZWM7CisgICAgICAgICAgICAvKiBTaW5jZSBBZGRUUyByZXNwb25zZSB3YXMgc3VjY2Vzc2Z1bCwgY2hlY2sgZm9yIHRoZSBQU0IgZmxhZworICAgICAgICAgICAgICogYW5kIGRpcmVjdGlvbmFsIGZsYWcgaW5zaWRlIHRoZSBUUyBJbmZvIGZpZWxkLiAKKyAgICAgICAgICAgICAqIEFuIEFDIGlzIHRyaWdnZXIgZW5hYmxlZCBBQyBpZiB0aGUgUFNCIHN1YmZpZWxkIGlzIHNldCB0byAxICAKKyAgICAgICAgICAgICAqIGluIHRoZSB1cGxpbmsgZGlyZWN0aW9uLgorICAgICAgICAgICAgICogQW4gQUMgaXMgZGVsaXZlcnkgZW5hYmxlZCBBQyBpZiB0aGUgUFNCIHN1YmZpZWxkIGlzIHNldCB0byAxIAorICAgICAgICAgICAgICogaW4gdGhlIGRvd25saW5rIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAqIEFuIEFDIGlzIHRyaWdnZXIgYW5kIGRlbGl2ZXJ5IGVuYWJsZWQgQUMgaWYgdGhlIFBTQiBzdWJmaWVsZCAgCisgICAgICAgICAgICAgKiBpcyBzZXQgdG8gMSBpbiB0aGUgYmktZGlyZWN0aW9uIGZpZWxkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocFRzcGVjLT50c2luZm8udHJhZmZpYy5wc2IgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1TZXRUc3BlY1VhcHNkTWFzayhwTWFjLCAmcFRzcGVjLT50c2luZm8sIFNFVF9VQVBTRF9NQVNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgbGltU2V0VHNwZWNVYXBzZE1hc2socE1hYywgJnBUc3BlYy0+dHNpbmZvLCBDTEVBUl9VQVBTRF9NQVNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEFERFRTIHN1Y2Nlc3MsIHNvIEFDIGlzIG5vdyBhZG1pdHRlZC4gV2Ugc2hhbGwgbm93IHVzZSB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICogRURDQSBwYXJhbWV0ZXJzIGFzIGFkdmVydGlzZWQgYnkgQVAgYW5kIHNlbmQgdGhlIHVwZGF0ZWQgRURDQSBwYXJhbXMKKyAgICAgICAgICAgICAqIHRvIEhBTC4gCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFjID0gdXBUb0FjKHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMudXNlclByaW8pOworICAgICAgICAgICAgaWYocFRzcGVjLT50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LXSB8PSAoMSA8PCBhYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX0ROTElOSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX0ROTElOS10gfD0gKDEgPDwgYWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihwVHNwZWMtPnRzaW5mby50cmFmZmljLmRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9CSURJUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX1VQTElOS10gfD0gKDEgPDwgYWMpOworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LXSB8PSAoMSA8PCBhYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpbVNldEFjdGl2ZUVkY2FQYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXMsIHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICBpZiAocFN0YS0+YW5pUGVlciA9PSBlQU5JX0JPT0xFQU5fVFJVRSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltU2VuZEVkY2FQYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmUsIHBTdGEtPmJzc0lkLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbVNlbmRFZGNhUGFyYW1zKHBNYWMsIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQWN0aXZlLCBwU3RhLT5ic3NJZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoZVNJUl9TVUNDRVNTICE9IGxpbVRzcGVjQWRkKHBNYWMsIHBTdGEtPnN0YUFkZHIsIHBTdGEtPmFzc29jSWQsIHBUc3BlYywgIDAsICZ0c3BlY0luZm8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkFkZGluZyBlbnRyeSBpbiBsaW0gVHNwZWMgVGFibGUgZmFpbGVkIFxuIikpOykKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7IC8vRXJyb3IgaGFuZGxpbmcuIHNlbmQgdGhlIHJlc3BvbnNlIHdpdGggZXJyb3Igc3RhdHVzLiBuZWVkIHRvIHNlbmQgRGVsVFMgdG8gdGVhciBkb3duIHRoZSBUU1BFQyBzdGF0dXMuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvcHkgdGhlIFRTUEVDIHBhcmFtdGVycworICAgICAgICBwQWdnckFkZFRzUGFyYW0tPnRzcGVjW2ldID0gYWdnclFvc1JlcS0+YWdnckluZm8uYWdnckFkZFRzSW5mb1tpXS50c3BlYzsKKyAgICB9CisgICAgfQorCisgICAgbXNnLnR5cGUgPSBXREFfQUdHUl9RT1NfUkVROworICAgIG1zZy5ib2R5cHRyID0gcEFnZ3JBZGRUc1BhcmFtOworICAgIG1zZy5ib2R5dmFsID0gMDsKKworICAgIC8qIFdlIG5lZWQgdG8gZGVmZXIgYW55IGluY29taW5nIG1lc3NhZ2VzIHVudGlsIHdlIGdldCBhCisgICAgICogV0RBX0FHR1JfUU9TX1JTUCBmcm9tIEhBTC4KKyAgICAgKi8KKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCBmYWxzZSk7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnLnR5cGUpKTsKKworICAgIGlmKGVTSVJfU1VDQ0VTUyAhPSB3ZGFQb3N0Q3RybE1zZyhwTWFjLCAmbXNnKSkKKyAgICB7CisgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgid2RhUG9zdEN0cmxNc2coKSBmYWlsZWRcbiIpKTspCisgICAgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCopcEFnZ3JBZGRUc1BhcmFtKTsKKyAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3ZvaWQKK2xpbUZUU2VuZEFnZ3JRb3NSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCByc3BSZXFkLAorICAgICAgICAgICAgICAgICAgICB0cEFnZ3JBZGRUc1BhcmFtcyBhZ2dyUW9zUnNwLCB0QU5JX1U4IHNtZXNlc3Npb25JZCkKK3sKKyAgICB0cFNpckFnZ3JRb3NSc3AgIHJzcDsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBpZiAoISByc3BSZXFkKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcnNwLAorICAgICAgICAgICAgICAgIHNpemVvZih0U2lyQWdnclFvc1JzcCkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIHRTaXJBZ2dyUW9zUnNwIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcnNwLCBzaXplb2YoKnJzcCkpOworICAgIHJzcC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9GVF9BR0dSX1FPU19SU1A7CisgICAgcnNwLT5zZXNzaW9uSWQgPSBzbWVzZXNzaW9uSWQ7CisgICAgcnNwLT5sZW5ndGggPSBzaXplb2YoKnJzcCk7CisgICAgcnNwLT5hZ2dySW5mby50c3BlY0lkeCA9IGFnZ3JRb3NSc3AtPnRzcGVjSWR4OworCisgICAgZm9yKCBpID0gMDsgaSA8IFNJUl9RT1NfTlVNX0FDX01BWDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCAoMSA8PCBpKSAmIGFnZ3JRb3NSc3AtPnRzcGVjSWR4ICkKKyAgICAgICAgeworICAgICAgICAgICAgcnNwLT5hZ2dySW5mby5hZ2dyUnNwW2ldLnN0YXR1cyA9IGFnZ3JRb3NSc3AtPnN0YXR1c1tpXTsKKyAgICAgICAgICAgIHJzcC0+YWdnckluZm8uYWdnclJzcFtpXS50c3BlYyA9IGFnZ3JRb3NSc3AtPnRzcGVjW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgbGltU2VuZFNtZUFnZ3JRb3NSc3AocE1hYywgcnNwLCBzbWVzZXNzaW9uSWQpOworICAgIHJldHVybjsKK30KKworCit2b2lkIGxpbVByb2Nlc3NGVEFnZ3JRb1NSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZykKK3sKKyAgICB0cEFnZ3JBZGRUc1BhcmFtcyBwQWdnclFvc1JzcE1zZyA9IE5VTEw7CisgICAgLy90cEFnZ3JRb3NQYXJhbXMgIHBBZ2dyUW9zUnNwTXNnID0gTlVMTDsKKyAgICB0QWRkVHNQYXJhbXMgICAgIGFkZFRzUGFyYW0gPSB7MH07CisgICAgdHBEcGhIYXNoTm9kZSAgcFN0YSA9IE5VTEw7CisgICAgdEFOSV9VMTYgIGFzc29jSWQgPTA7CisgICAgdFNpck1hY0FkZHIgIHBlZXJNYWNBZGRyOworICAgIHRBTklfVTggICByc3BSZXFkID0gMTsKKyAgICB0cFBFU2Vzc2lvbiAgcHNlc3Npb25FbnRyeSA9IE5VTEw7CisgICAgaW50IGkgPSAwOworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiIFJlY2VpdmVkIEFHR1JfUU9TX1JTUCBmcm9tIEhBTFxuIikpOykKKworICAgIC8qIE5lZWQgdG8gcHJvY2VzcyBhbGwgdGhlIGRlZmVycmVkIG1lc3NhZ2VzIGVucXVldWVkIHNpbmNlIHNlbmRpbmcgdGhlCisgICAgICAgU0lSX0hBTF9BR0dSX0FERF9UU19SRVEgKi8KKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKworICAgIHBBZ2dyUW9zUnNwTXNnID0gKHRwQWdnckFkZFRzUGFyYW1zKSAobGltTXNnLT5ib2R5cHRyKTsKKyAgICBpZiAoTlVMTCA9PSBwQWdnclFvc1JzcE1zZykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIk5VTEwgcEFnZ3JRb3NSc3BNc2ciKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCBwQWdnclFvc1JzcE1zZy0+c2Vzc2lvbklkKTsKKyAgICBpZiAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgICAgLy8gQ2FudCBmaW5kIHNlc3Npb24gZW50cnkKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiQ2FudCBmaW5kIHNlc3Npb24gZW50cnkgZm9yICVzXG4iKSwgX19GVU5DVElPTl9fKTspCisgICAgICAgIGlmKCBwQWdnclFvc1JzcE1zZyAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKilwQWdnclFvc1JzcE1zZyApOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgSEFMX1FPU19OVU1fQUNfTUFYOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoKCgoMSA8PCBpKSAmIHBBZ2dyUW9zUnNwTXNnLT50c3BlY0lkeCkpICYmCisgICAgICAgICAgICAgICAgKHBBZ2dyUW9zUnNwTXNnLT5zdGF0dXNbaV0gIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlbmQgREVMVFMgdG8gdGhlIHN0YXRpb24gKi8KKyAgICAgICAgICAgIHNpckNvcHlNYWNBZGRyKHBlZXJNYWNBZGRyLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworICAgICAgICAgICAgYWRkVHNQYXJhbS5zdGFJZHggPSBwQWdnclFvc1JzcE1zZy0+c3RhSWR4OworICAgICAgICAgICAgYWRkVHNQYXJhbS5zZXNzaW9uSWQgPSBwQWdnclFvc1JzcE1zZy0+c2Vzc2lvbklkOworICAgICAgICAgICAgYWRkVHNQYXJhbS50c3BlYyA9IHBBZ2dyUW9zUnNwTXNnLT50c3BlY1tpXTsKKyAgICAgICAgICAgIGFkZFRzUGFyYW0udHNwZWNJZHggPSBwQWdnclFvc1JzcE1zZy0+dHNwZWNJZHg7CisKKyAgICAgICAgICAgIGxpbVNlbmREZWx0c1JlcUFjdGlvbkZyYW1lKHBNYWMsIHBlZXJNYWNBZGRyLCByc3BSZXFkLAorICAgICAgICAgICAgICAgICAgICAmYWRkVHNQYXJhbS50c3BlYy50c2luZm8sCisgICAgICAgICAgICAgICAgICAgICZhZGRUc1BhcmFtLnRzcGVjLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgcFN0YSA9IGRwaExvb2t1cEFzc29jSWQocE1hYywgYWRkVHNQYXJhbS5zdGFJZHgsICZhc3NvY0lkLAorICAgICAgICAgICAgICAgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgICAgICAgICBpZiAocFN0YSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUFkbWl0Q29udHJvbERlbGV0ZVRTKHBNYWMsIGFzc29jSWQsICZhZGRUc1BhcmFtLnRzcGVjLnRzaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICh0QU5JX1U4ICopJmFkZFRzUGFyYW0udHNwZWNJZHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogU2VuZCB0aGUgQWdnciBRb1MgcmVzcG9uc2UgdG8gU01FICovCisKKyAgICBsaW1GVFNlbmRBZ2dyUW9zUnNwKHBNYWMsIHJzcFJlcWQsIHBBZ2dyUW9zUnNwTXNnLAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkKTsKKyAgICBpZiggcEFnZ3JRb3NSc3BNc2cgIT0gTlVMTCApCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKXBBZ2dyUW9zUnNwTXNnICk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICBEZXRlcm1pbmVzIGlmIGEgc2Vzc2lvbiB3aXRoIGNjeCBvciAxMXIgYXNzb2MgaXMgcHJlc2VudC4KKyAgICAgICAgSWYgcHJlc2VudCBpdCB3aWxsIHJldHVybiBUUlVFIGVsc2UgRkFMU0UKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBsaW1pc0Zhc3RUcmFuc2l0aW9uUmVxdWlyZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgaW50IHNlc3Npb25JZCkKK3sKKyAgICBpZihwTWFjLT5saW0uZ3BTZXNzaW9uW3Nlc3Npb25JZF0udmFsaWQgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIC8vIElmIGNjeCBvciAxMXIgY29ubmVjdGlvbiBpcyBmb3VuZCB3ZSBuZWVkIHRvIHJldHVybiBUUlVFCisgICAgICAgIGlmKChwTWFjLT5saW0uZ3BTZXNzaW9uW3Nlc3Npb25JZF0uYnNzVHlwZSA9PSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREUpICYmCisgICAgICAgICAgICgoKHBNYWMtPmxpbS5ncFNlc3Npb25bc2Vzc2lvbklkXS5pczExUmNvbm5lY3Rpb24pIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgICAgfHwgKHBNYWMtPmxpbS5ncFNlc3Npb25bc2Vzc2lvbklkXS5pc0NDWGNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgICAgKSYmIAorICAgICAgICAgICAgcE1hYy0+bGltLmdwU2Vzc2lvbltzZXNzaW9uSWRdLmlzRmFzdFRyYW5zaXRpb25FbmFibGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgMTFyL0NDWCBhbmQgRlQgZW5hYmxlZCBvbmx5IHRoZW4gd2UgbmVlZAorICAgICAgICAgICAgLy8gdGhlIHZhbHVlcyB0byBiZSBhbHRlcmVkIGZyb20gY2ZnIGZvciBGVyBSU1NJIFBlcmlvZCBhbHRlcmF0aW9uLgorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1JYnNzUGVlck1nbXQuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltSWJzc1BlZXJNZ210LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4YWVhZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltSWJzc1BlZXJNZ210LmMKQEAgLTAsMCArMSwxNjY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltSWJzc1BlZXJNZ210LmNjIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucworICogTElNIHVzZXMgdG8gbWFpbnRhaW4gcGVlcnMgaW4gSUJTUy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAzLzEyLzA0CisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgInBhbFR5cGVzLmgiCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAic2lyQ29tbW9uLmgiCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNlbHNlCisjaW5jbHVkZSAid25pQ2ZnU3RhLmgiCisjZW5kaWYKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbUFzc29jVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TdGFIYXNoQXBpLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiICAgICAgICAgIC8vIHNjaFNldEZpeGVkQmVhY29uRmllbGRzIGZvciBJQlNTIGNvYWxlc2NlCisjaW5jbHVkZSAibGltU2VjdXJpdHlVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlbmRNZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbVNlc3Npb24uaCIKKyNpbmNsdWRlICJsaW1JYnNzUGVlck1nbXQuaCIKKworCisvKioKKyAqIGlic3NfcGVlcl9maW5kCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoaWxlIGFkZGluZyBhIGNvbnRleHQgYXQKKyAqIERQSCAmIFBvbGFyaXMgZm9yIGEgcGVlciBpbiBJQlNTLgorICogSWYgcGVlciBpcyBmb3VuZCBpbiB0aGUgbGlzdCwgY2FwYWJpbGl0aWVzIGZyb20gdGhlCisgKiByZXR1cm5lZCBCU1MgZGVzY3JpcHRpb24gYXJlIHVzZWQgYXQgRFBIIG5vZGUgJiBQb2xhcmlzLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBtYWNBZGRyIC0gTUFDIGFkZHJlc3Mgb2YgdGhlIHBlZXIKKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gcGVlciBub2RlIGlmIGZvdW5kLCBlbHNlIE5VTEwKKyAqLworCitzdGF0aWMgdExpbUlic3NQZWVyTm9kZSAqCitpYnNzX3BlZXJfZmluZCgKKyAgICB0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICB0U2lyTWFjQWRkciAgICAgbWFjQWRkcikKK3sKKyAgICB0TGltSWJzc1BlZXJOb2RlICpwVGVtcE5vZGUgPSBwTWFjLT5saW0uZ0xpbUlic3NQZWVyTGlzdDsKKworICAgIHdoaWxlIChwVGVtcE5vZGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwodEFOSV9VOCAqKSBtYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwVGVtcE5vZGUtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwVGVtcE5vZGUgPSBwVGVtcE5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBwVGVtcE5vZGU7Cit9IC8qKiogZW5kIGlic3NfcGVlcl9maW5kKCkgKioqLworCisvKioKKyAqIGlic3NfcGVlcl9hZGQKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBpcyBjYWxsZWQgb24gYSBTVEEgaW4gSUJTUyB1cG9uIHJlY2VpdmluZyBCZWFjb24vCisgKiBQcm9iZSBSZXNwb25zZSBmcm9tIGEgcGVlci4KKyAqCisgKkxPR0lDOgorICogTm9kZSBpcyBhbHdheXMgYWRkZWQgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBQZWVyTm9kZSAtIFBvaW50ZXIgdG8gcGVlciBub2RlIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0LgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB0U2lyUmV0U3RhdHVzCitpYnNzX3BlZXJfYWRkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaW1JYnNzUGVlck5vZGUgKnBQZWVyTm9kZSkKK3sKKyNpZmRlZiBBTklfU0lSX0lCU1NfUEVFUl9DQUNISU5HCisgICAgdEFOSV9VMzIgbnVtSWJzc1BlZXJzID0gKDIgKiBwTWFjLT5saW0ubWF4U3RhdGlvbik7CisKKyAgICBpZiAocE1hYy0+bGltLmdMaW1OdW1JYnNzUGVlcnMgPj0gbnVtSWJzc1BlZXJzKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWNoZWQgbWF4IG51bWJlciBvZiBwZWVycyB0byBiZSBtYWludGFpbmVkLgorICAgICAgICAgKiBEZWxldGUgbGFzdCBlbnRyeSAmIGFkZCBuZXcgZW50cnkgYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgICAgICovCisgICAgICAgIHRMaW1JYnNzUGVlck5vZGUgKnBUZW1wLCAqcFByZXY7CisgICAgICAgIHBUZW1wID0gcFByZXYgPSBwTWFjLT5saW0uZ0xpbUlic3NQZWVyTGlzdDsKKyAgICAgICAgd2hpbGUgKHBUZW1wLT5uZXh0ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcmV2ID0gcFRlbXA7CisgICAgICAgICAgICBwVGVtcCA9IHBUZW1wLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmKHBUZW1wLT5iZWFjb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFRlbXAtPmJlYWNvbik7CisgICAgICAgIH0KKworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwVGVtcCk7CisgICAgICAgIHBQcmV2LT5uZXh0ID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtSWJzc1BlZXJzKys7CisKKyAgICBwUGVlck5vZGUtPm5leHQgPSBwTWFjLT5saW0uZ0xpbUlic3NQZWVyTGlzdDsKKyAgICBwTWFjLT5saW0uZ0xpbUlic3NQZWVyTGlzdCA9IHBQZWVyTm9kZTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLyoqKiBlbmQgbGltQWRkSWJzc1BlZXJUb0xpc3QoKSAqKiovCisKKy8qKgorICogaWJzc19wZWVyX2NvbGxlY3QKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBpcyBjYWxsZWQgdG8gY29sbGVjdCBJQlNTIHBlZXIgaW5mb3JtYXRpb24KKyAqIGZyb20gcmVjZWl2ZWQgQmVhY29uL1Byb2JlIFJlc3BvbnNlIGZyYW1lIGZyb20gaXQuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBCZWFjb24gLSBQYXJzZWQgQmVhY29uIEZyYW1lIHN0cnVjdHVyZQorICogQHBhcmFtICBwQkQgICAgIC0gUG9pbnRlciB0byByZWNlaXZlZCBCRAorICogQHBhcmFtICBwUGVlciAgIC0gUG9pbnRlciB0byBJQlNTIHBlZXIgbm9kZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitpYnNzX3BlZXJfY29sbGVjdCgKKyAgICB0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgdHBTY2hCZWFjb25TdHJ1Y3QgICBwQmVhY29uLAorICAgIHRwU2lyTWFjTWdtdEhkciAgICAgcEhkciwKKyAgICB0TGltSWJzc1BlZXJOb2RlICAgICpwUGVlciwKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnkpCit7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFBlZXItPnBlZXJNYWNBZGRyLCBwSGRyLT5zYSwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICBwUGVlci0+Y2FwYWJpbGl0eUluZm8gICAgICAgPSBwQmVhY29uLT5jYXBhYmlsaXR5SW5mbzsKKyAgICBwUGVlci0+ZXh0ZW5kZWRSYXRlc1ByZXNlbnQgPSBwQmVhY29uLT5leHRlbmRlZFJhdGVzUHJlc2VudDsKKyAgICBwUGVlci0+ZWRjYVByZXNlbnQgICAgICAgICAgPSBwQmVhY29uLT5lZGNhUHJlc2VudDsKKyAgICBwUGVlci0+d21lRWRjYVByZXNlbnQgICAgICAgPSBwQmVhY29uLT53bWVFZGNhUHJlc2VudDsKKyAgICBwUGVlci0+d21lSW5mb1ByZXNlbnQgICAgICAgPSBwQmVhY29uLT53bWVJbmZvUHJlc2VudDsKKworICAgIGlmKElTX0RPVDExX01PREVfSFQocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSAmJgorICAgICAgICAocEJlYWNvbi0+SFRDYXBzLnByZXNlbnQpKQorICAgIHsKKyAgICAgICAgcFBlZXItPmh0Q2FwYWJsZSA9ICBwQmVhY29uLT5IVENhcHMucHJlc2VudDsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXBQZWVyLT5zdXBwb3J0ZWRNQ1NTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKXBCZWFjb24tPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocFBlZXItPnN1cHBvcnRlZE1DU1NldCkpOworICAgICAgICBwUGVlci0+aHRHcmVlbmZpZWxkID0gKHRBTklfVTgpcEJlYWNvbi0+SFRDYXBzLmdyZWVuRmllbGQ7CisgICAgICAgIHBQZWVyLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9ICggdEFOSV9VOCApIHBCZWFjb24tPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisgICAgICAgIHBQZWVyLT5odE1JTU9QU1N0YXRlID0gICh0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpcEJlYWNvbi0+SFRDYXBzLm1pbW9Qb3dlclNhdmU7CisgICAgICAgIHBQZWVyLT5odE1heEFtc2R1TGVuZ3RoID0gKCB0QU5JX1U4ICkgcEJlYWNvbi0+SFRDYXBzLm1heGltYWxBTVNEVXNpemU7CisgICAgICAgIHBQZWVyLT5odEFNcGR1RGVuc2l0eSA9ICAgICAgICAgICAgIHBCZWFjb24tPkhUQ2Fwcy5tcGR1RGVuc2l0eTsKKyAgICAgICAgcFBlZXItPmh0RHNzc0Nja1JhdGU0ME1IelN1cHBvcnQgPSAodEFOSV9VOClwQmVhY29uLT5IVENhcHMuZHNzc0Nja01vZGU0ME1IejsKKyAgICAgICAgcFBlZXItPmh0U2hvcnRHSTIwTWh6ID0gKHRBTklfVTgpcEJlYWNvbi0+SFRDYXBzLnNob3J0R0kyME1IejsKKyAgICAgICAgcFBlZXItPmh0U2hvcnRHSTQwTWh6ID0gKHRBTklfVTgpcEJlYWNvbi0+SFRDYXBzLnNob3J0R0k0ME1IejsKKyAgICAgICAgcFBlZXItPmh0TWF4UnhBTXBkdUZhY3RvciA9IHBCZWFjb24tPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yOworICAgIH0KKworICAgIHBQZWVyLT5lcnBJZVByZXNlbnQgPSBwQmVhY29uLT5lcnBQcmVzZW50OworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBQZWVyLT5zdXBwb3J0ZWRSYXRlcywKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwQmVhY29uLT5zdXBwb3J0ZWRSYXRlcywKKyAgICAgICAgICAgICAgICAgIHBCZWFjb24tPnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzICsgMSk7CisgICAgaWYgKHBQZWVyLT5leHRlbmRlZFJhdGVzUHJlc2VudCkKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBQZWVyLT5leHRlbmRlZFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcEJlYWNvbi0+ZXh0ZW5kZWRSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEJlYWNvbi0+ZXh0ZW5kZWRSYXRlcy5udW1SYXRlcyArIDEpOworICAgIGVsc2UKKyAgICAgICAgcFBlZXItPmV4dGVuZGVkUmF0ZXMubnVtUmF0ZXMgPSAwOworCisgICAgLy8gVEJEIGNvcHkgRURDQSBwYXJhbWV0ZXJzCisgICAgLy8gcFBlZXItPmVkY2FQYXJhbXM7CisKKyAgICBwUGVlci0+bmV4dCA9IE5VTEw7Cit9IC8qKiogZW5kIGlic3NfcGVlcl9jb2xsZWN0KCkgKioqLworCisvLyBoYW5kbGUgY2hhbmdlIGluIHBlZXIgcW9zL3dtZSBjYXBhYmlsaXRpZXMKK3N0YXRpYyB2b2lkCitpYnNzX3N0YV9jYXBzX3VwZGF0ZSgKKyAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjLAorICAgIHRMaW1JYnNzUGVlck5vZGUgKnBQZWVyTm9kZSwKKyAgICB0cFBFU2Vzc2lvbiAgICAgICBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTE2ICAgICAgYWlkOworICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzOworCisgICAgcFBlZXJOb2RlLT5iZWFjb25IQkNvdW50Kys7IC8vVXBkYXRlIGJlYWNvbiBjb3VudC4KKworICAgIC8vIGlmIHRoZSBwZWVyIG5vZGUgZXhpc3RzLCB1cGRhdGUgaXRzIHFvcyBjYXBhYmlsaXRpZXMKKyAgICBpZiAoKHBTdGFEcyA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBwUGVlck5vZGUtPnBlZXJNYWNBZGRyLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSkpID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworCisgICAgLy9VcGRhdGUgSFQgQ2FwYWJpbGl0aWVzCisgICAgaWYoSVNfRE9UMTFfTU9ERV9IVChwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUpKQorICAgIHsKKyAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lmh0Q2FwYWJpbGl0eSA9IHBQZWVyTm9kZS0+aHRDYXBhYmxlOworICAgICAgICBpZiAocFBlZXJOb2RlLT5odENhcGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdGFEcy0+aHRHcmVlbmZpZWxkID0gcFBlZXJOb2RlLT5odEdyZWVuZmllbGQ7CisgICAgICAgICAgICBwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0gIHBQZWVyTm9kZS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisgICAgICAgICAgICBwU3RhRHMtPmh0TUlNT1BTU3RhdGUgPSAgICAgICAgICAgICBwUGVlck5vZGUtPmh0TUlNT1BTU3RhdGU7CisgICAgICAgICAgICBwU3RhRHMtPmh0TWF4QW1zZHVMZW5ndGggPSAgcFBlZXJOb2RlLT5odE1heEFtc2R1TGVuZ3RoOworICAgICAgICAgICAgcFN0YURzLT5odEFNcGR1RGVuc2l0eSA9ICAgICAgICAgICAgIHBQZWVyTm9kZS0+aHRBTXBkdURlbnNpdHk7CisgICAgICAgICAgICBwU3RhRHMtPmh0RHNzc0Nja1JhdGU0ME1IelN1cHBvcnQgPSBwUGVlck5vZGUtPmh0RHNzc0Nja1JhdGU0ME1IelN1cHBvcnQ7CisgICAgICAgICAgICBwU3RhRHMtPmh0U2hvcnRHSTIwTWh6ID0gcFBlZXJOb2RlLT5odFNob3J0R0kyME1oejsKKyAgICAgICAgICAgIHBTdGFEcy0+aHRTaG9ydEdJNDBNaHogPSBwUGVlck5vZGUtPmh0U2hvcnRHSTQwTWh6OworICAgICAgICAgICAgcFN0YURzLT5odE1heFJ4QU1wZHVGYWN0b3IgPSBwUGVlck5vZGUtPmh0TWF4UnhBTXBkdUZhY3RvcjsKKyAgICAgICAgICAgIC8vIEluIHRoZSBmdXR1cmUsIG1heSBuZWVkIHRvIGNoZWNrIGZvciAiZGVsYXllZEJBIgorICAgICAgICAgICAgLy8gRm9yIG5vdywgaXQgaXMgSU1NRURJQVRFIEJBIG9ubHkgb24gQUxMIFRJRCdzCisgICAgICAgICAgICBwU3RhRHMtPmJhUG9saWN5RmxhZyA9IDB4RkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihJU19ET1QxMV9NT0RFX1BST1BSSUVUQVJZKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSkgJiYKKyAgICAgIHBQZWVyTm9kZS0+YW5pSW5kaWNhdG9yKQorICAgIHsKKyAgICAgICAgcFN0YURzLT5hbmlQZWVyID0gcFBlZXJOb2RlLT5hbmlJbmRpY2F0b3I7CisgICAgICAgIHBTdGFEcy0+cHJvcENhcGFiaWxpdHkgPSBwUGVlck5vZGUtPnByb3BDYXBhYmlsaXR5OworICAgIH0KKworCisgICAgLy8gcGVlciBpcyAxMWUgY2FwYWJsZSBidXQgaXMgbm90IDExZSBlbmFibGVkIHlldAorICAgIC8vIHNvbWUgU1RBJ3Mgd2hlbiBqb2luaW5nIEFpcmdvIElCU1MsIGFzc2VydCBxb3MgY2FwYWJpbGl0eSBldmVuIHdoZW4KKyAgICAvLyB0aGV5IGRvbid0IHN1cG9ydCBxb3MuIGhvd2V2ZXIsIHRoZXkgZG8gbm90IGluY2x1ZGUgdGhlIGVkY2EgcGFyYW1ldGVyCisgICAgLy8gc2V0LiBzbyBsZXQncyBjaGVjayBmb3IgZWRjYVBhcmFtIGluIGFkZGl0aW9uIHRvIHRoZSBxb3MgY2FwYWJpbGl0eQorICAgIGlmIChwUGVlck5vZGUtPmNhcGFiaWxpdHlJbmZvLnFvcyAmJiAocHNlc3Npb25FbnRyeS0+bGltUW9zRW5hYmxlZCkgJiYgcFBlZXJOb2RlLT5lZGNhUHJlc2VudCkKKyAgICB7CisgICAgICAgIHBTdGFEcy0+cW9zTW9kZSAgICA9IDE7CisgICAgICAgIHBTdGFEcy0+d21lRW5hYmxlZCA9IDA7CisgICAgICAgIGlmICghIHBTdGFEcy0+bGxlRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgcFN0YURzLT5sbGVFbmFibGVkID0gMTsKKyAgICAgICAgICAgIC8vZHBoU2V0QUNNKHBNYWMsIHBTdGFEcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBwZWVyIGlzIG5vdCAxMWUgY2FwYWJsZSBub3cgYnV0IHdhcyAxMWUgZW5hYmxlZCBlYXJsaWVyCisgICAgZWxzZSBpZiAocFN0YURzLT5sbGVFbmFibGVkKQorICAgIHsKKyAgICAgICAgcFN0YURzLT5xb3NNb2RlICAgICAgPSAwOworICAgICAgICBwU3RhRHMtPmxsZUVuYWJsZWQgICA9IDA7CisgICAgfQorCisgICAgLy8gcGVlciBpcyB3bWUgY2FwYWJsZSBidXQgaXMgbm90IHdtZSBlbmFibGVkIHlldAorICAgIGlmIChwUGVlck5vZGUtPndtZUluZm9QcmVzZW50ICYmICBwc2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkKQorICAgIHsKKyAgICAgICAgcFN0YURzLT5xb3NNb2RlICAgID0gMTsKKyAgICAgICAgcFN0YURzLT5sbGVFbmFibGVkID0gMDsKKyAgICAgICAgaWYgKCEgcFN0YURzLT53bWVFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBwU3RhRHMtPndtZUVuYWJsZWQgPSAxOworICAgICAgICAgICAgLy9kcGhTZXRBQ00ocE1hYywgcFN0YURzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIFdoZW4gdGhlIHBlZXIgZGV2aWNlIHN1cHBvcnRzIEVEQ0EgcGFyYW1ldGVycywgdGhlbiB3ZSB3ZXJlIG5vdCAKKyAgICAgIGNvbnNpZGVyaW5nLiBBZGRlZCB0aGlzIGNvZGUgd2hlbiB3ZSBzYXcgdGhhdCBvbmUgb2YgdGhlIFBlZXIgRGV2aWNlCisgICAgICB3YXMgYWR2ZXJ0aXNpbmcgV01NIHBhcmFtIHdoZXJlIHdlIHdlcmUgbm90IGhvbm91cmluZyB0aGF0LiBDUiMgMjEwNzU2CisgICAgKi8KKyAgICBpZiAocFBlZXJOb2RlLT53bWVFZGNhUHJlc2VudCAmJiBwc2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkKSB7CisgICAgICAgIHBTdGFEcy0+cW9zTW9kZSAgICA9IDE7CisgICAgICAgIHBTdGFEcy0+bGxlRW5hYmxlZCA9IDA7CisgICAgICAgIGlmICghIHBTdGFEcy0+d21lRW5hYmxlZCkgeworICAgICAgICAgICAgcFN0YURzLT53bWVFbmFibGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gcGVlciBpcyBub3Qgd21lIGNhcGFibGUgbm93IGJ1dCB3YXMgd21lIGVuYWJsZWQgZWFybGllcgorICAgIGVsc2UgaWYgKHBTdGFEcy0+d21lRW5hYmxlZCkKKyAgICB7CisgICAgICAgIHBTdGFEcy0+cW9zTW9kZSAgICAgID0gMDsKKyAgICAgICAgcFN0YURzLT53bWVFbmFibGVkICAgPSAwOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZAoraWJzc19zdGFfcmF0ZXNfdXBkYXRlKAorICAgIHRwQW5pU2lyR2xvYmFsICAgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlICAgIHBTdGFEcywKKyAgICB0TGltSWJzc1BlZXJOb2RlICpwUGVlciwKKyAgICB0cFBFU2Vzc2lvbiAgICAgICBwc2Vzc2lvbkVudHJ5KQoreworICAgIC8vIFBvcHVsYXRlIHN1cHBvcnRlZCByYXRlc2V0CisgICAgbGltUG9wdWxhdGVNYXRjaGluZ1JhdGVTZXQocE1hYywgcFN0YURzLCAmcFBlZXItPnN1cHBvcnRlZFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUGVlci0+ZXh0ZW5kZWRSYXRlcywgcFBlZXItPnN1cHBvcnRlZE1DU1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFN0YURzLT5tbG1TdGFDb250ZXh0LnByb3BSYXRlU2V0LHBzZXNzaW9uRW50cnkpOworCisgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmNhcGFiaWxpdHlJbmZvID0gcFBlZXItPmNhcGFiaWxpdHlJbmZvOworfSAvKioqIGVuZCBpYnNzX3N0YV9pbmZvX3VwZGF0ZSgpICoqKi8KKworLyoqCisgKiBpYnNzX3N0YV9pbmZvX3VwZGF0ZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGlzIGNhbGxlZCB0byBwcm9ncmFtIGJvdGggU1cgJiBQb2xhcmlzIGNvbnRleHQKKyAqIGZvciBwZWVyIGluIElCU1MuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzIC0gUG9pbnRlciB0byBEUEggbm9kZQorICogQHBhcmFtICBwUGVlciAgLSBQb2ludGVyIHRvIElCU1MgcGVlciBub2RlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2lic3Nfc3RhX2luZm9fdXBkYXRlKAorICAgIHRwQW5pU2lyR2xvYmFsICAgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlICAgIHBTdGFEcywKKyAgICB0TGltSWJzc1BlZXJOb2RlICpwUGVlciwKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHBTdGFEcy0+c3RhVHlwZSA9IFNUQV9FTlRSWV9QRUVSOworICAgIGlic3Nfc3RhX2NhcHNfdXBkYXRlKHBNYWMsIHBQZWVyLHBzZXNzaW9uRW50cnkpOworICAgIGlic3Nfc3RhX3JhdGVzX3VwZGF0ZShwTWFjLCBwU3RhRHMsIHBQZWVyLHBzZXNzaW9uRW50cnkpOworfSAvKioqIGVuZCBpYnNzX3N0YV9pbmZvX3VwZGF0ZSgpICoqKi8KKworc3RhdGljIHZvaWQKK2lic3NfY29hbGVzY2VfZnJlZSgKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGlmIChwTWFjLT5saW0uaWJzc0luZm8ucEhkciAhPSBOVUxMKQorICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5pYnNzSW5mby5wSGRyKTsKKyAgICBpZiAocE1hYy0+bGltLmlic3NJbmZvLnBCZWFjb24gIT0gTlVMTCkKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uaWJzc0luZm8ucEJlYWNvbik7CisKKyAgICBwTWFjLT5saW0uaWJzc0luZm8ucEhkciAgICA9IE5VTEw7CisgICAgcE1hYy0+bGltLmlic3NJbmZvLnBCZWFjb24gPSBOVUxMOworfQorCisvKgorICogc2F2ZSB0aGUgYmVhY29uIHBhcmFtcyBmb3IgdXNlIHdoZW4gYWRkaW5nIHRoZSBic3MKKyAqLworc3RhdGljIHZvaWQKK2lic3NfY29hbGVzY2Vfc2F2ZSgKKyAgICB0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgdHBTaXJNYWNNZ210SGRyICAgICBwSGRyLAorICAgIHRwU2NoQmVhY29uU3RydWN0ICAgcEJlYWNvbikKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKworICAgIC8vIGdldCByaWQgb2YgYW55IHNhdmVkIGluZm8KKyAgICBpYnNzX2NvYWxlc2NlX2ZyZWUocE1hYyk7CisKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikgJnBNYWMtPmxpbS5pYnNzSW5mby5wSGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcEhkcikpOworICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImliYnMtc2F2ZTogRmFpbGVkIG1hbGxvYyBwSGRyXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSAmcE1hYy0+bGltLmlic3NJbmZvLnBCZWFjb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwQmVhY29uKSk7CisgICAgaWYgKHN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiaWJicy1zYXZlOiBGYWlsZWQgbWFsbG9jIHBCZWFjb25cbiIpKTspCisgICAgICAgIGlic3NfY29hbGVzY2VfZnJlZShwTWFjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmlic3NJbmZvLnBIZHIsIHBIZHIsIHNpemVvZigqcEhkcikpOworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmlic3NJbmZvLnBCZWFjb24sIHBCZWFjb24sIHNpemVvZigqcEJlYWNvbikpOworfQorCisvKgorICogdHJpZXMgdG8gYWRkIGEgbmV3IGVudHJ5IHRvIGRwaCBoYXNoIG5vZGUKKyAqIGlmIG5lY2Vzc2FyeSwgYW4gZXhpc3RpbmcgZW50cnkgaXMgZWxpbWluYXRlZAorICovCitzdGF0aWMgdFNpclJldFN0YXR1cworaWJzc19kcGhfZW50cnlfYWRkKAorICAgIHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgIHRTaXJNYWNBZGRyICAgICBwZWVyQWRkciwKKyAgICB0cERwaEhhc2hOb2RlICAgKnBwU3RhLAorICAgIHRwUEVTZXNzaW9uICAgICBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTE2ICAgICAgYWlkOworICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzOworCisgICAgKnBwU3RhID0gTlVMTDsKKworICAgIHBTdGFEcyA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBwZWVyQWRkciwgJmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgIGlmIChwU3RhRHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFRyeWluZyB0byBhZGQgY29udGV4dCBmb3IgYWxyZWFkeSBleGlzdGluZyBTVEEgaW4gSUJTUyAqLworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJTVEEgZXhpc3RzIGFscmVhZHkgIikpOykKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBlZXJBZGRyLCBMT0dFKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ24gYW4gQUlELCBkZWxldGUgY29udGV4dCBleGlzdGluZyB3aXRoIHRoYXQKKyAgICAgKiBBSUQgYW5kIHRoZW4gYWRkIGFuIGVudHJ5IHRvIGhhc2ggdGFibGUgbWFpbnRhaW5lZAorICAgICAqIGJ5IERQSCBtb2R1bGUuCisgICAgICovCisgICAgYWlkID0gbGltQXNzaWduQUlEKHBNYWMpOworCisgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIGFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgIGlmIChwU3RhRHMpCisgICAgeworICAgICAgICAodm9pZCkgbGltRGVsU3RhKHBNYWMsIHBTdGFEcywgZmFsc2UgLyphc3luY2hyb25vdXMqLyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgbGltRGVsZXRlRHBoSGFzaEVudHJ5KHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgYWlkLHBzZXNzaW9uRW50cnkpOworICAgIH0KKworICAgIHBTdGFEcyA9IGRwaEFkZEhhc2hFbnRyeShwTWFjLCBwZWVyQWRkciwgYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgaWYgKHBTdGFEcyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gQ291bGQgbm90IGFkZCBoYXNoIHRhYmxlIGVudHJ5CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCBhZGQgaGFzaCBlbnRyeSBhdCBEUEggZm9yIGFpZD0lZCBNQUNhZGRyOlxuIiksIGFpZCk7KQorICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcGVlckFkZHIsIExPR0UpOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgICpwcFN0YSA9IHBTdGFEczsKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvLyBzZW5kIGEgc3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24KK3N0YXRpYyB2b2lkCitpYnNzX3N0YXR1c19jaGdfbm90aWZ5KAorICAgIHRwQW5pU2lyR2xvYmFsICAgICAgICAgIHBNYWMsCisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgcGVlckFkZHIsCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgc3RhSW5kZXgsCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgdWNhc3RTaWcsIAorICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGJjYXN0U2lnLCAKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBzdGF0dXMsCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKQoreworCisgICAgdExpbUlic3NQZWVyTm9kZSAqcGVlck5vZGU7CisgICAgdEFOSV9VOCAqYmVhY29uID0gTlVMTDsKKyAgICB0QU5JX1UxNiBiY25MZW4gPSAwOworCisKKyAgICBwZWVyTm9kZSA9IGlic3NfcGVlcl9maW5kKHBNYWMscGVlckFkZHIpOworICAgIGlmKHBlZXJOb2RlICE9IE5VTEwpCisgICAgeworICAgICAgICBpZihwZWVyTm9kZS0+YmVhY29uID09IE5VTEwpIHBlZXJOb2RlLT5iZWFjb25MZW4gPSAwOworICAgICAgICBiZWFjb24gPSBwZWVyTm9kZS0+YmVhY29uOworICAgICAgICBiY25MZW4gPSBwZWVyTm9kZS0+YmVhY29uTGVuOworICAgICAgICBwZWVyTm9kZS0+YmVhY29uID0gTlVMTDsKKyAgICAgICAgcGVlck5vZGUtPmJlYWNvbkxlbiA9IDA7CisgICAgfQorCisgICAgbGltU2VuZFNtZUlCU1NQZWVySW5kKHBNYWMscGVlckFkZHIsIHN0YUluZGV4LCB1Y2FzdFNpZywgYmNhc3RTaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvbiwgYmNuTGVuLCBzdGF0dXMsIHNlc3Npb25JZCk7CisKKyAgICBpZihiZWFjb24gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgYmVhY29uKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2lic3NfYnNzX2FkZCgKKyAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjLAorICAgIHRwUEVTZXNzaW9uICAgICAgIHBzZXNzaW9uRW50cnkpCit7CisgICAgdExpbU1sbVN0YXJ0UmVxICAgbWxtU3RhcnRSZXE7CisgICAgdEFOSV9VMzIgICAgICAgICAgY2ZnOworICAgIHRwU2lyTWFjTWdtdEhkciAgIHBIZHIgICAgPSAodHBTaXJNYWNNZ210SGRyKSAgIHBNYWMtPmxpbS5pYnNzSW5mby5wSGRyOworICAgIHRwU2NoQmVhY29uU3RydWN0IHBCZWFjb24gPSAodHBTY2hCZWFjb25TdHJ1Y3QpIHBNYWMtPmxpbS5pYnNzSW5mby5wQmVhY29uOworICAgIHRBTklfVTggbnVtRXh0UmF0ZXMgPSAwOworCisgICAgaWYgKChwSGRyID09IE5VTEwpIHx8IChwQmVhY29uID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5hYmxlIHRvIGFkZCBCU1MgKG5vIGNhY2hlZCBCU1MgaW5mbylcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgcEhkci0+YnNzSWQsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICAjaWYgMAorICAgIGlmIChjZmdTZXRTdHIocE1hYywgV05JX0NGR19CU1NJRCwgKHRBTklfVTggKikgcEhkci0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpCisgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgdXBkYXRlIEJTU0lEIGF0IENGR1xuIikpOworICAgICNlbmRpZiAvL1RPIFNVUFBPUlQgQlQtQU1QCisKKyAgICBzaXJDb3B5TWFjQWRkcihwSGRyLT5ic3NJZCxwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisgICAgLyogV2UgbmVlZCBub3QgdXNlIGdsb2JhbCBNYWMgYWRkcmVzcyBzaW5jZSBwZXIgc2Vlc2lvbiBCU1NJRCBpcyBhdmFpbGFibGUgKi8KKyAgICAvL2xpbVNldEJzc2lkKHBNYWMsIHBIZHItPmJzc0lkKTsKKworI2lmIDAKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19CRUFDT05fSU5URVJWQUwsICZjZmcpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDYW4ndCByZWFkIGJlYWNvbiBpbnRlcnZhbFxuIikpOworI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICAvKiBDb3B5IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHNlc3Npb25UYWJsZSAqLworICAgIGNmZyA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbDsKKyAgICBpZiAoY2ZnICE9IHBCZWFjb24tPmJlYWNvbkludGVydmFsKQorICAgICAgICAjaWYgMAorICAgICAgICBpZiAoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMLCBwQmVhY29uLT5iZWFjb25JbnRlcnZhbCkKKyAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ2FuJ3QgdXBkYXRlIGJlYWNvbiBpbnRlcnZhbFxuIikpOworICAgICAgICAjZW5kaWYvL1RPIFNVUFBPUlQgQlQtQU1QCisgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbCA9IHBCZWFjb24tPmJlYWNvbkludGVydmFsOworCisgICAgLyogVGhpcyBmdW5jdGlvbiBpYnNzX2Jzc19hZGQgKGFuZCBoZW5jZSB0aGUgYmVsb3cgY29kZSkgaXMgb25seSBjYWxsZWQgZHVyaW5nIGlic3MgY29hbGVzY2luZy4gV2UgbmVlZCB0byAKKyAgICAgKiBhZGFwdCB0byBwZWVyJ3MgY2FwYWJpbGl0eSB3aXRoIHJlc3BlY3QgdG8gc2hvcnQgc2xvdCB0aW1lLiBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIGxpbUFwcGx5Q29uZmlndXJhdGlvbigpIAorICAgICAqIHNvIHRoYXQgdGhlIElCU1MgZG9lc250IGJsaW5kbHkgc3RhcnQgd2l0aCBzaG9ydCBzbG90ID0gMS4gSWYgSUJTUyBzdGFydCBpcyBwYXJ0IG9mIGNvYWxlc2NpbmcgdGhlbiBpdCB3aWxsIGFkYXB0CisgICAgICogdG8gcGVlcidzIHNob3J0IHNsb3QgdXNpbmcgY29kZSBiZWxvdy4KKyAgICAgKi8KKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19TSE9SVF9TTE9UX1RJTUUsICZjZmcpCisgICAgICAgICAgICAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIElmIGNmZyBpcyBhbHJlYWR5IHNldCB0byBjdXJyZW50IHBlZXIncyBjYXBhYmlsaXR5IHRoZW4gbm8gbmVlZCB0byBzZXQgaXQgYWdhaW4gKi8KKyAgICBpZiAoY2ZnICE9IHBCZWFjb24tPmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWUpCisgICAgeworICAgICAgICBpZiAoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FLCBwQmVhY29uLT5jYXBhYmlsaXR5SW5mby5zaG9ydFNsb3RUaW1lKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHVwZGF0ZSBzaG9ydCBzbG90IHRpbWUgYXQgQ0ZHXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAodEFOSV9VOCAqKSAmcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQsCisgICAgICAgKHRBTklfVTggKikgJnBCZWFjb24tPnN1cHBvcnRlZFJhdGVzLAorICAgICAgIHBCZWFjb24tPnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzKTsKKworICAgICNpZiAwCisgICAgaWYgKGNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX09QRVJBVElPTkFMX1JBVEVfU0VULAorICAgICAgICAgICAodEFOSV9VOCAqKSAmcE1hYy0+bGltLmdwTGltU3RhcnRCc3NSZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlLAorICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1TdGFydEJzc1JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzKQorICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHVwZGF0ZSBPcGVyUmF0ZXNldCBhdCBDRkdcbiIpKTsKKyAgICAjZW5kaWYgLy9UTyBTVVBQT1JUIEJULUFNUAorCisgICAgLyoqCisgICAgKiBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VUIENGRyBuZWVkcyB0byBiZSByZXNldCwgd2hlbgorICAgICogdGhlcmUgaXMgbm8gZXh0ZW5kZWQgcmF0ZSBJRSBwcmVzZW50IGluIGJlYWNvbi4gVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB3aGVuCisgICAgKiBzdXBwb3J0ZWRSYXRlU2V0IElFIGNvbnRhaW5zIGFsbCB0aGUgZXh0ZW5kZWQgcmF0ZXMgYXMgd2VsbCBhbmQgU1RBIGRlY2lkZXMgdG8gY29hbGVzY2UuCisgICAgKiBJbiB0aGlzIElCU1MgY29hbGVzY2luZyBzY2VuYXJpbyBMSU0gd2lsbCB0ZWFyIGRvd24gdGhlIEJTUyBhbmQgQWRkIGEgbmV3IG9uZS4gU28gTElNIG5lZWRzIHRvCisgICAgKiByZXNldCB0aGlzIENGRywganVzdCBpbiBjYXNlIENTUiBvcmlnaW5hbGx5IGhhZCBzZXQgdGhpcyBDRkcgd2hlbiBJQlNTIHdhcyBzdGFydGVkIGZyb20gdGhlIGxvY2FsIHByb2ZpbGUuCisgICAgKiBJZiBJQlNTIHdhcyBzdGFydGVkIGJ5IENTUiBmcm9tIHRoZSBCc3NEZXNjcmlwdGlvbiwgdGhlbiBpdCB3b3VsZCByZXNldCB0aGlzIENGRyBiZWZvcmUgU3RhcnRCc3MgaXMgaXNzdWVkLgorICAgICogVGhlIGlkZWEgaXMgdGhhdCB0aGUgY291bnQgb2YgT3BSYXRlU2V0IGFuZCBFeHRlbmRlZE9wUmF0ZVNldCByYXRlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAxMi4KKyAgICAqLworCisgICAgaWYocEJlYWNvbi0+ZXh0ZW5kZWRSYXRlc1ByZXNlbnQpCisgICAgICAgIG51bUV4dFJhdGVzID0gcEJlYWNvbi0+ZXh0ZW5kZWRSYXRlcy5udW1SYXRlczsKKyAgICBpZiAoY2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVQsCisgICAgICAgICAgICh0QU5JX1U4ICopICZwQmVhY29uLT5leHRlbmRlZFJhdGVzLnJhdGUsIG51bUV4dFJhdGVzKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgdXBkYXRlIEV4dGVuZGVkT3BlclJhdGVzZXQgYXQgQ0ZHXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9IAorCisKKyAgICAvKgorICAgICogRWFjaCBJQlNTIG5vZGUgd2lsbCBhZHZlcnRpc2UgaXRzIG93biBIVCBDYXBhYmlsaXRpZXMgaW5zdGVhZCBvZiBhZGFwdGluZyB0byB0aGUgUGVlcidzIGNhcGFiaWxpdGllcworICAgICogSWYgd2UgZG9uJ3QgZG8gdGhpcyB0aGVuIElCU1MgbWF5IG5vdCBnbyBiYWNrIHRvIGZ1bGwgY2FwYWJpbGl0aWVzIHdoZW4gdGhlIFNUQSB3aXRoIGxvd2VyIGNhcGFiaWxpdGllcworICAgICogbGVhdmVzIHRoZSBJQlNTLiAgZS5nLiB3aGVuIG5vbi1DQiBTVEEgam9pbnMgYW4gSUJTUyBhbmQgdGhlbiBsZWF2ZXMsIHRoZSBJQlNTIHdpbGwgYmUgc3R1Y2sgYXQgbm9uLUNCIG1vZGUKKyAgICAqIGV2ZW4gdGhvdWdoIGFsbCB0aGUgbm9kZXMgYXJlIGNhcGFibGUgb2YgZG9pbmcgQ0IuCisgICAgKiBzbyBpdCBpcyBkZWNpZGVkIHRvIGxlYXZlIHRoZSBzZWxmIEhUIGNhcGFiaWx0aWVzIGludGFjdC4gVGhpcyBtYXkgY2hhbmdlIGlmIHNvbWUgaXNzdWVzIGFyZSBmb3VuZCBpbiBpbnRlcm9wLgorICAgICovCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSAmbWxtU3RhcnRSZXEsIHNpemVvZihtbG1TdGFydFJlcSkpOworCisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBtbG1TdGFydFJlcS5ic3NJZCwgcEhkci0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIG1sbVN0YXJ0UmVxLnJhdGVTZXQubnVtUmF0ZXMgPSBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlczsKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZtbG1TdGFydFJlcS5yYXRlU2V0LnJhdGVbMF0sCisgICAgICAgICAgICAgICAgICAmcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVswXSwKKyAgICAgICAgICAgICAgICAgIG1sbVN0YXJ0UmVxLnJhdGVTZXQubnVtUmF0ZXMpOworICAgIG1sbVN0YXJ0UmVxLmJzc1R5cGUgICAgICAgICAgICAgPSBlU0lSX0lCU1NfTU9ERTsKKyAgICBtbG1TdGFydFJlcS5iZWFjb25QZXJpb2QgICAgICAgID0gcEJlYWNvbi0+YmVhY29uSW50ZXJ2YWw7CisgICAgbWxtU3RhcnRSZXEubndUeXBlICAgICAgICAgICAgICA9IHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+bndUeXBlOyAvL3BzZXNzaW9uRW50cnktPm53VHlwZSBpcyBhbHNvIE9LPz8/PworICAgIG1sbVN0YXJ0UmVxLmh0Q2FwYWJsZSAgICAgICAgICAgPSBwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHk7CisgICAgbWxtU3RhcnRSZXEuaHRPcGVyTW9kZSAgICAgICAgICA9IHBNYWMtPmxpbS5nSFRPcGVyTW9kZTsKKyAgICBtbG1TdGFydFJlcS5kdWFsQ1RTUHJvdGVjdGlvbiAgID0gcE1hYy0+bGltLmdIVER1YWxDVFNQcm90ZWN0aW9uOworICAgIG1sbVN0YXJ0UmVxLnR4Q2hhbm5lbFdpZHRoU2V0ICAgPSBwTWFjLT5saW0uZ0hUUmVjb21tZW5kZWRUeFdpZHRoU2V0OworCisgICAgI2lmIDAKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19DVVJSRU5UX0NIQU5ORUwsICZjZmcpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDdXJyZW50Q2hhbm5lbCBDRkcgZ2V0IGZpYWxlZCFcbiIpKTsKKyAgICAjZW5kaWYKKworICAgIC8vbWxtU3RhcnRSZXEuY2hhbm5lbE51bWJlciAgICAgICA9ICh0U2lyTWFjQ2hhbk51bSkgY2ZnOworCisgICAgLyogcmVhZGluZyB0aGUgY2hhbm5lbCBudW0gZnJvbSBzZXNzaW9uIFRhYmxlICovCisgICAgbWxtU3RhcnRSZXEuY2hhbm5lbE51bWJlciA9IHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbDsKKworICAgIG1sbVN0YXJ0UmVxLmNiTW9kZSAgICAgICAgICAgICAgPSBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPmNiTW9kZTsKKworICAgIC8vIENvcHkgdGhlIFNTSUQgZm9yIFJ4UCBmaWx0ZXJpbmcgYmFzZWQgb24gU1NJRC4KKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmbWxtU3RhcnRSZXEuc3NJZCwKKyAgICAgICAgKHRBTklfVTggKikgJnBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+c3NJZCwKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5zc0lkLmxlbmd0aCArIDEpOworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiaW52b2tpbmcgQUREX0JTUyBhcyBwYXJ0IG9mIGNvYWxlc2NpbmchXG4iKSk7KQorICAgIGlmIChsaW1NbG1BZGRCc3MocE1hYywgJm1sbVN0YXJ0UmVxLHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJBZGRCc3MgZmFpbHVyZVxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFVwZGF0ZSBmaWVsZHMgaW4gQmVhY29uCisgICAgaWYgKHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMscHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiKioqIFVuYWJsZSB0byBzZXQgZml4ZWQgQmVhY29uIGZpZWxkcyAqKipcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKK30KKworCisKKy8qIGRlbGV0ZSB0aGUgY3VycmVudCBCU1MgKi8KK3N0YXRpYyB2b2lkCitpYnNzX2Jzc19kZWxldGUoCisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cFBFU2Vzc2lvbiAgICBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJSZXRTdGF0dXMgc3RhdHVzOworICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkluaXRpYXRpbmcgSUJTUyBEZWxldGUgQlNTXG4iKSk7KSAKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgIT0gZUxJTV9NTE1fQlNTX1NUQVJURURfU1RBVEUpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIkluY29ycmVjdCBMSU0gTUxNIHN0YXRlIGZvciBkZWxCc3MgKCVkKVxuIiksCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RhdHVzID0gbGltRGVsQnNzKHBNYWMsIE5VTEwsIHBzZXNzaW9uRW50cnktPmJzc0lkeCwgcHNlc3Npb25FbnRyeSk7CisgICAgaWYgKHN0YXR1cyAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImRlbEJzcyBmYWlsZWQgZm9yIGJzcyAlZFxuIiksIHBzZXNzaW9uRW50cnktPmJzc0lkeCk7KQorfQorCisvKioKKyAqIGxpbUlic3NJbml0CisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoaWxlIHN0YXJ0aW5nIGFuIElCU1MKKyAqIHRvIGluaXRpYWxpemUgbGlzdCB1c2VkIHRvIG1haW50YWluIElCU1MgcGVlcnMuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1JYnNzSW5pdCgKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIC8vcE1hYy0+bGltLmdMaW1JYnNzQWN0aXZlID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbUlic3NDb2FsZXNjaW5nSGFwcGVuZWQgPSAwOworICAgIHBNYWMtPmxpbS5nTGltSWJzc1BlZXJMaXN0ID0gTlVMTDsKKyAgICBwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycyA9IDA7CisKKyAgICAvLyBpYnNzIGluZm8gLSBwYXJhbXMgZm9yIHdoaWNoIGlic3MgdG8gam9pbiB3aGlsZSBjb2FsZXNjaW5nCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcE1hYy0+bGltLmlic3NJbmZvLCBzaXplb2YodEFuaVNpckxpbUlic3MpKTsKK30gLyoqKiBlbmQgbGltSWJzc0luaXQoKSAqKiovCisKKy8qKgorICogbGltSWJzc0RlbGV0ZUFsbFBlZXJzCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBhbGwgcGVlcnMuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbUlic3NEZWxldGVBbGxQZWVycyggdHBBbmlTaXJHbG9iYWwgcE1hYyAsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0TGltSWJzc1BlZXJOb2RlICAgICpwQ3Vyck5vZGUsICpwVGVtcE5vZGU7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisgICAgdEFOSV9VMTYgYWlkOworCisgICAgcEN1cnJOb2RlID0gcFRlbXBOb2RlID0gcE1hYy0+bGltLmdMaW1JYnNzUGVlckxpc3Q7CisKKyAgICB3aGlsZSAocEN1cnJOb2RlICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoIXBNYWMtPmxpbS5nTGltTnVtSWJzc1BlZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJOdW1iZXIgb2YgcGVlcnMgaW4gdGhlIGxpc3QgaXMgemVybyBhbmQgbm9kZSBwcmVzZW50IikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qIERlbGV0ZSB0aGUgZHBoIGVudHJ5IGZvciB0aGUgc3RhdGlvbgorICAgICAgICAgICAgICAqIFNpbmNlIGl0IGlzIGNhbGxlZCB0byByZW1vdmUgYWxsIHBlZXJzLCBqdXN0IGRlbGV0ZSBmcm9tIGRwaCwKKyAgICAgICAgICAgICAgKiBubyBuZWVkIHRvIGRvIGFueSBiZWFjb24gcmVsYXRlZCBwYXJhbXMgaS5lLiwgZG9udCBjYWxsIGxpbURlbGV0ZURwaEhhc2hFbnRyeQorICAgICAgICAgICAgICAqLworICAgICAgICBwU3RhRHMgPSBkcGhMb29rdXBIYXNoRW50cnkocE1hYywgcEN1cnJOb2RlLT5wZWVyTWFjQWRkciwgJmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgICAgICBpZiggcFN0YURzICkKKyAgICAgICAgeworCisgICAgICAgICAgICBpYnNzX3N0YXR1c19jaGdfbm90aWZ5KCBwTWFjLCBwQ3Vyck5vZGUtPnBlZXJNYWNBZGRyLCBwU3RhRHMtPnN0YUluZGV4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+dWNVY2FzdFNpZywgcFN0YURzLT51Y0JjYXN0U2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVdOSV9TTUVfSUJTU19QRUVSX0RFUEFSVEVEX0lORCwgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkICk7CisgICAgICAgICAgICBkcGhEZWxldGVIYXNoRW50cnkocE1hYywgcFN0YURzLT5zdGFBZGRyLCBhaWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHBUZW1wTm9kZSA9IHBDdXJyTm9kZS0+bmV4dDsKKworICAgICAgICAvKiBUT0RPIDpTZXNzaW9uaXplIHRoaXMgY29kZSAqLworICAgICAgICAvKiBGaXggQ1IgMjI3NjQyOiBQZWVyTGlzdCBzaG91bGQgcG9pbnQgdG8gdGhlIG5leHQgbm9kZSBzaW5jZSB0aGUgY3VycmVudCBub2RlIGlzIGJlaW5nCisgICAgICAgICAgICAgICAgKiBmcmVlZCBpbiB0aGUgbmV4dCBsaW5lLiBJbiBpYnNzX3BlZXJmaW5kIGluIGlic3Nfc3RhdHVzX2NoZ19ub3RpZnkgYWJvdmUsIHdlIHVzZSB0aGlzCisgICAgICAgICAgICAgICAgKiBwZWVyIGxpc3QgdG8gZmluZCB0aGUgbmV4dCBwZWVyLiBTbyB0aGlzIGxpc3QgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIHRoZSBubyBvZiBwZWVycyBsZWZ0CisgICAgICAgICAgICAgICAgKiBhZnRlciBlYWNoIGl0ZXJhdGlvbiBpbiB0aGlzIHdoaWxlIGxvb3Agc2luY2Ugb25lIGJ5IG9uZSBwZWVycyBhcmUgZGVsZXRlZCAoZnJlZWQpIGluIHRoaXMKKyAgICAgICAgICAgICAgICAqIGxvb3AgY2F1c2luZyB0aGUgbGltLmdMaW1JYnNzUGVlckxpc3QgdG8gcG9pbnQgdG8gc29tZSBmcmVlZCBtZW1vcnkuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcE1hYy0+bGltLmdMaW1JYnNzUGVlckxpc3QgPSBwVGVtcE5vZGU7CisKKyAgICAgICAgaWYocEN1cnJOb2RlLT5iZWFjb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEN1cnJOb2RlLT5iZWFjb24pOworICAgICAgICB9CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBDdXJyTm9kZSk7CisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycyA+IDApIC8vIGJlIHBhcmFub2lkCisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycy0tOworICAgICAgICBwQ3Vyck5vZGUgPSBwVGVtcE5vZGU7CisgICAgfQorCisgICAgaWYgKHBNYWMtPmxpbS5nTGltTnVtSWJzc1BlZXJzKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIk51bWJlciBvZiBwZWVyc1slZF0gaW4gdGhlIGxpc3QgaXMgbm9uLXplcm8iKSwKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycyk7CisKKyAgICBwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycyA9IDA7CisgICAgcE1hYy0+bGltLmdMaW1JYnNzUGVlckxpc3QgPSBOVUxMOworCit9CisvKioKKyAqIGxpbUlic3NEZWxldGUKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgdGVhcmluZyBkb3duIGFuIElCU1MuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1JYnNzRGVsZXRlKAorICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICBsaW1JYnNzRGVsZXRlQWxsUGVlcnMocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKworICAgIGlic3NfY29hbGVzY2VfZnJlZShwTWFjKTsKK30gLyoqKiBlbmQgbGltSWJzc0RlbGV0ZSgpICoqKi8KKworLyoqIENvbW1lbnRpbmcgdGhpcyBDb2RlIGFzIGZyb20gbm8gd2hlcmUgaXQgaXMgYmVpbmcgaW52b2tlZCAqLworI2lmIDAKKy8qKgorICogbGltSWJzc1BlZXJEZWxldGUKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGEgU1RBIGluIElCU1MgdG8gZGVsZXRlIGEgcGVlcgorICogZnJvbSB0aGUgbGlzdC4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcGVlck1hY0FkZHIgLSBNQUMgYWRkcmVzcyBvZiB0aGUgcGVlciBTVEEgdGhhdAorICogICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gYmUgZGVsZXRlZCBmcm9tIHBlZXIgbGlzdC4KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1JYnNzUGVlckRlbGV0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBtYWNBZGRyKQoreworICAgIHRMaW1JYnNzUGVlck5vZGUgICAgKnBQcmV2Tm9kZSwgKnBUZW1wTm9kZTsKKworICAgIHBUZW1wTm9kZSA9IHBQcmV2Tm9kZSA9IHBNYWMtPmxpbS5nTGltSWJzc1BlZXJMaXN0OworCisgICAgaWYgKHBUZW1wTm9kZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICB3aGlsZSAocFRlbXBOb2RlICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsKHRBTklfVTggKikgbWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcFRlbXBOb2RlLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZvdW5kIG5vZGUgdG8gYmUgZGVsZXRlZAorICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltSWJzc1BlZXJMaXN0ID09IHBUZW1wTm9kZSkgLyoqIEZpcnN0IE5vZGUgdG8gYmUgZGVsZXRlZCovCisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1JYnNzUGVlckxpc3QgPSBwVGVtcE5vZGUtPm5leHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcFByZXZOb2RlLT5uZXh0ID0gcFRlbXBOb2RlLT5uZXh0OworCisgICAgICAgICAgICBpZihwVGVtcE5vZGUtPmJlYWNvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBUZW1wTm9kZS0+YmVhY29uKTsKKyAgICAgICAgICAgICAgICBwVGVtcE5vZGUtPmJlYWNvbiA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwVGVtcE5vZGUpOworICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1OdW1JYnNzUGVlcnMtLTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHBQcmV2Tm9kZSA9IHBUZW1wTm9kZTsKKyAgICAgICAgcFRlbXBOb2RlID0gcFRlbXBOb2RlLT5uZXh0OworICAgIH0KKworICAgIC8vIFNob3VsZCBub3QgYmUgaGVyZQorICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoInBlZXIgbm90IGZvdW5kIGluIHRoZSBsaXN0LCBhZGRyPSAiKSk7KQorICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBtYWNBZGRyLCBMT0dFKTsKK30gLyoqKiBlbmQgbGltSWJzc1BlZXJEZWxldGUoKSAqKiovCisKKyNlbmRpZgorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltSWJzc1NldFByb3RlY3Rpb24KK1xicmllZiBEZWNpZGVzIGFsbCB0aGUgcHJvdGVjdGlvbiByZWxhdGVkIGluZm9ybWF0aW9uLgorXAorXHBhcmFtICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyCitccGFyYW0gIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gTm9uZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkCitsaW1JYnNzU2V0UHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGVuYWJsZSwgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyAgICBpZighcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24uZnJvbWxsYikKKyAgICB7CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoInByb3RlY3Rpb24gZnJvbSAxMWIgaXMgZGlzYWJsZWRcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlKQorICAgIHsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgICAgIGlmKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0LypwTWFjLT5saW0ubGxiQ29leGlzdCovKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCI9PiBJQlNTOiBFbmFibGUgUHJvdGVjdGlvbiBcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5sbGJDb2V4aXN0ID0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYkNvZXhpc3QgPSB0cnVlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxCQ09FWElTVF9DSEFOR0VEOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHRydWUgPT0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYkNvZXhpc3QvKnBNYWMtPmxpbS5sbGJDb2V4aXN0Ki8pCisgICAgeworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltMTFiUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gZmFsc2U7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIj09PT4gSUJTUzogRGlzYWJsZSBwcm90ZWN0aW9uIFxuIikpOykKKyAgICAgICAgcEJlYWNvblBhcmFtcy0+bGxiQ29leGlzdCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0ID0gZmFsc2U7CisgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX2xsQkNPRVhJU1RfQ0hBTkdFRDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltSWJzc1VwZGF0ZVByb3RlY3Rpb25QYXJhbXMKK1xicmllZiBEZWNpZGVzIGFsbCB0aGUgcHJvdGVjdGlvbiByZWxhdGVkIGluZm9ybWF0aW9uLgorXAorXHBhcmFtICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyCitccGFyYW0gIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gTm9uZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkCitsaW1JYnNzVXBkYXRlUHJvdGVjdGlvblBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwgdExpbVByb3RTdGFDYWNoZVR5cGUgcHJvdFN0YUNhY2hlVHlwZSwKKyAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgdEFOSV9VMzIgaTsKKworICBQRUxPRzEobGltTG9nKHBNYWMsTE9HMSwgRkwoIkEgU1RBIGlzIGFzc29jaWF0ZWQ6IikpOworICBsaW1Mb2cocE1hYyxMT0cxLCBGTCgiQWRkciA6ICIpKTsKKyAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBlZXJNYWNBZGRyLCBMT0cxKTspCisKKyAgZm9yIChpPTA7IGk8TElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykKKyAgeworICAgICAgaWYgKHBNYWMtPmxpbS5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlKQorICAgICAgeworICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkFkZHI6ICIpKTspCisgICAgICAgICAgUEVMT0cxKGxpbVByaW50TWFjQWRkcihwTWFjLCBwTWFjLT5saW0ucHJvdFN0YUNhY2hlW2ldLmFkZHIsIExPRzEpOykKKworICAgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgcE1hYy0+bGltLnByb3RTdGFDYWNoZVtpXS5hZGRyLAorICAgICAgICAgICAgICBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJtYXRjaGluZyBjYWNoZSBlbnRyeSBhdCAlZCBhbHJlYWR5IGFjdGl2ZS5cbiIpLCBpKTspCisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKworICBmb3IgKGk9MDsgaTxMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKQorICB7CisgICAgICBpZiAoIXBNYWMtPmxpbS5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlKQorICAgICAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGkgPj0gTElNX1BST1RfU1RBX0NBQ0hFX1NJWkUpCisgIHsKKyAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIk5vIHNwYWNlIGluIFByb3RTdGFDYWNoZVxuIikpOykKKyAgICAgIHJldHVybjsKKyAgfQorCisgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5wcm90U3RhQ2FjaGVbaV0uYWRkciwKKyAgICAgICAgICAgICAgICBwZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICBwTWFjLT5saW0ucHJvdFN0YUNhY2hlW2ldLnByb3RTdGFDYWNoZVR5cGUgPSBwcm90U3RhQ2FjaGVUeXBlOworICBwTWFjLT5saW0ucHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSA9IHRydWU7CisgIGlmKGVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9sbEIgPT0gcHJvdFN0YUNhY2hlVHlwZSkKKyAgeworICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5udW1TdGErKzsKKyAgfQorICBlbHNlIGlmKGVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9sbEcgPT0gcHJvdFN0YUNhY2hlVHlwZSkKKyAgeworICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbTExZ1BhcmFtcy5udW1TdGErKzsKKyAgfQorfQorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltSWJzc0RlY2lkZVByb3RlY3Rpb24KK1xicmllZiBEZWNpZGVzIGFsbCB0aGUgcHJvdGVjdGlvbiByZWxhdGVkIGluZm9ybWF0aW9uLgorXAorXHBhcmFtICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyCitccGFyYW0gIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gTm9uZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkCitsaW1JYnNzRGVjaWRlUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFNpclJGQmFuZCByZkJhbmQgPSBTSVJfQkFORF9VTktOT1dOOworICAgIHRBTklfVTMyIHBoeU1vZGU7CisgICAgdExpbVByb3RTdGFDYWNoZVR5cGUgcHJvdFN0YUNhY2hlVHlwZSA9IGVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9JTlZBTElEOworCisgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgPSAwOworCisgICAgaWYoTlVMTCA9PSBwU3RhRHMpCisgICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgicFN0YURzIGlzIE5VTExcbiIpKTspCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGltR2V0UmZCYW5kKHBNYWMsICZyZkJhbmQsIHBzZXNzaW9uRW50cnkpOworICAgIGlmKFNJUl9CQU5EXzJfNF9HSFo9PSByZkJhbmQpCisgICAgeworICAgICAgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAvL1dlIGFyZSAxMUcgb3IgMTFuLiBDaGVjayBpZiB3ZSBuZWVkIHByb3RlY3Rpb24gZnJvbSAxMWIgU3RhdGlvbnMuCisgICAgICAgIGlmICgocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykgfHwgKHBNYWMtPmxpbS5odENhcGFiaWxpdHkpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBBcyB3ZSBmb3VuZCBpbiB0aGUgcGFzdCwgaXQgaXMgcG9zc2libGUgdGhhdCBhIDExbiBTVEEgc2VuZHMKKyAgICAgICAgICAgICAqIEJlYWNvbiB3aXRoIEhUIElFIGJ1dCBub3QgRVJQIElFLiAgU28gdGhlIGFic2Vuc2Ugb2YgRVJQIElFCisgICAgICAgICAgICAgKiBpbiB0aGUgQmVhY29uIGlzIG5vdCBlbm91Z2ggdG8gY29uY2x1ZGUgdGhhdCBTVEEgaXMgMTFiLiAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChwU3RhRHMtPmVycEVuYWJsZWQgPT0gZUhBTF9DTEVBUikgJiYKKyAgICAgICAgICAgICAgICAoIXBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3RTdGFDYWNoZVR5cGUgPSBlTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfbGxCOworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkVuYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFCXG4iKSk7KQorICAgICAgICAgICAgICAgIGxpbUlic3NTZXRQcm90ZWN0aW9uKHBNYWMsIHRydWUsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbGltSWJzc1VwZGF0ZVByb3RlY3Rpb25QYXJhbXMocE1hYywgcFN0YURzLT5zdGFBZGRyLCBwcm90U3RhQ2FjaGVUeXBlLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICByZXR1cm47Cit9CisKKworLyoqCisgKiBsaW1JYnNzU3RhQWRkKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGFuIFNUQSBjb250ZXh0IGluIElCU1Mgcm9sZQorICogd2hlbmV2ZXIgYSBkYXRhIGZyYW1lIGlzIHJlY2VpdmVkIGZyb20vZm9yIGEgU1RBIHRoYXQgZmFpbGVkCisgKiBoYXNoIGxvb2t1cCBhdCBEUEguCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBlZXJBZGRkciAgTUFDIGFkZHJlc3Mgb2YgdGhlIHBlZXIgYmVpbmcgYWRkZWQKKyAqIEByZXR1cm4gcmV0Q29kZSAgICBJbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlIHJldHVybiBjb2RlCisgKiBAcmV0dXJuCisgKi8KKwordFNpclJldFN0YXR1cworbGltSWJzc1N0YUFkZCgKKyAgICB0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICB2b2lkICpwQm9keSwKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0cERwaEhhc2hOb2RlICAgICAgIHBTdGFEczsKKyAgICB0TGltSWJzc1BlZXJOb2RlICAgICpwUGVlck5vZGU7CisgICAgdExpbU1sbVN0YXRlcyAgICAgICBwcmV2U3RhdGU7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAqcFBlZXJBZGRyID0gKHRTaXJNYWNBZGRyICopIHBCb2R5OworICAgIHRVcGRhdGVCZWFjb25QYXJhbXMgYmVhY29uUGFyYW1zOyAKKworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZiZWFjb25QYXJhbXMsIHNpemVvZih0VXBkYXRlQmVhY29uUGFyYW1zKSk7CisKKyAgICBpZiAocEJvZHkgPT0gMCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgSUJTUyBBZGRTdGFcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUnggQWRkLUlic3MtU3RhIGZvciBNQUM6XG4iKSk7KQorICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCAqcFBlZXJBZGRyLCBMT0dFKTsKKworICAgIHBQZWVyTm9kZSA9IGlic3NfcGVlcl9maW5kKHBNYWMsICpwUGVlckFkZHIpOworICAgIGlmKE5VTEwgIT0gcFBlZXJOb2RlKQorICAgIHsKKyAgICAgICAgcmV0Q29kZSA9IGlic3NfZHBoX2VudHJ5X2FkZChwTWFjLCAqcFBlZXJBZGRyLCAmcFN0YURzLHBzZXNzaW9uRW50cnkpOworICAgICAgICBpZiAoZVNJUl9TVUNDRVNTID09IHJldENvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZTdGF0ZSA9IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZTsKKyAgICAgICAgICAgIHBTdGFEcy0+ZXJwRW5hYmxlZCA9IHBQZWVyTm9kZS0+ZXJwSWVQcmVzZW50OworCisgICAgICAgICAgICBpYnNzX3N0YV9pbmZvX3VwZGF0ZShwTWFjLCBwU3RhRHMsIHBQZWVyTm9kZSxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoImluaXRpYXRpbmcgQUREIFNUQSBmb3IgdGhlIElCU1MgcGVlci5cbiIpKTspCisgICAgICAgICAgICByZXRDb2RlID0gbGltQWRkU3RhKHBNYWMsIHBTdGFEcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIGlmKHJldENvZGUgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImlic3Mtc3RhLWFkZCBmYWlsZWQgKHJlYXNvbiAleClcbiIpLCByZXRDb2RlKTspCisgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsICpwUGVlckFkZHIsIExPR0UpOworICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gcFN0YURzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0gcHJldlN0YXRlOworICAgICAgICAgICAgICAgICAgICBkcGhEZWxldGVIYXNoRW50cnkocE1hYywgcFN0YURzLT5zdGFBZGRyLCBwU3RhRHMtPmFzc29jSWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYocE1hYy0+bGltLmdMaW1Qcm90ZWN0aW9uQ29udHJvbCAhPSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgICAgIGxpbUlic3NEZWNpZGVQcm90ZWN0aW9uKHBNYWMsIHBTdGFEcywgJmJlYWNvblBhcmFtcyAsIHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgaWYoYmVhY29uUGFyYW1zLnBhcmFtQ2hhbmdlQml0bWFwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiLS0tPiBVcGRhdGUgQmVhY29uIFBhcmFtcyBcbiIpKTspCisgICAgICAgICAgICAgICAgICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMsIHBzZXNzaW9uRW50cnkpOyAgICAKKyAgICAgICAgICAgICAgICAgICAgbGltU2VuZEJlYWNvblBhcmFtcyhwTWFjLCAmYmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiaGFzaFRibEFkZCBmYWlsZWQgKHJlYXNvbiAleClcbiIpLCByZXRDb2RlKTspCisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgKnBQZWVyQWRkciwgTE9HRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworLyogaGFuZGxlIHRoZSByZXNwb25zZSBmcm9tIEhBTCBmb3IgYW4gQUREIFNUQSByZXF1ZXN0ICovCit0U2lyUmV0U3RhdHVzCitsaW1JYnNzQWRkU3RhUnNwKAorICAgIHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgIHZvaWQgKm1zZyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRwRHBoSGFzaE5vZGUgICBwU3RhRHM7CisgICAgdEFOSV9VMTYgICAgICAgIGFpZDsKKyAgICB0cEFkZFN0YVBhcmFtcyAgcEFkZFN0YVBhcmFtcyA9ICh0cEFkZFN0YVBhcmFtcykgbXNnOworCisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgaWYgKHBBZGRTdGFQYXJhbXMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIklCU1M6IEFERF9TVEFfUlNQIHdpdGggbm8gYm9keSFcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgcFN0YURzID0gZHBoTG9va3VwSGFzaEVudHJ5KHBNYWMsIHBBZGRTdGFQYXJhbXMtPnN0YU1hYywgJmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgIGlmIChwU3RhRHMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIklCU1M6IEFERF9TVEFfUlNQIGZvciB1bmtub3duIE1BQyBhZGRyICIpKTspCisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwQWRkU3RhUGFyYW1zLT5zdGFNYWMsIExPR0UpOworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwQWRkU3RhUGFyYW1zICk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKHBBZGRTdGFQYXJhbXMtPnN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiSUJTUzogQUREX1NUQV9SU1AgZXJyb3IgKCV4KSAiKSwgcEFkZFN0YVBhcmFtcy0+c3RhdHVzKTspCisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwQWRkU3RhUGFyYW1zLT5zdGFNYWMsIExPR0UpOworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwQWRkU3RhUGFyYW1zICk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgcFN0YURzLT5ic3NJZCAgICAgICAgICAgICAgICAgID0gcEFkZFN0YVBhcmFtcy0+YnNzSWR4OworICAgIHBTdGFEcy0+c3RhSW5kZXggICAgICAgICAgICAgICA9IHBBZGRTdGFQYXJhbXMtPnN0YUlkeDsKKyAgICBwU3RhRHMtPnVjVWNhc3RTaWcgICAgICAgICAgICAgPSBwQWRkU3RhUGFyYW1zLT51Y1VjYXN0U2lnOworICAgIHBTdGFEcy0+dWNCY2FzdFNpZyAgICAgICAgICAgICA9IHBBZGRTdGFQYXJhbXMtPnVjQmNhc3RTaWc7CisgICAgcFN0YURzLT52YWxpZCAgICAgICAgICAgICAgICAgID0gMTsKKyAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFOworCisgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiSUJTUzogc2VuZGluZyBJQlNTX05FV19QRUVSIG1zZyB0byBTTUUhXG4iKSk7KQorCisgICAgaWJzc19zdGF0dXNfY2hnX25vdGlmeShwTWFjLCBwQWRkU3RhUGFyYW1zLT5zdGFNYWMsIHBTdGFEcy0+c3RhSW5kZXgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT51Y1VjYXN0U2lnLCBwU3RhRHMtPnVjQmNhc3RTaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9JQlNTX05FV19QRUVSX0lORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCk7CisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcEFkZFN0YVBhcmFtcyApOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworCisKK3ZvaWQgbGltSWJzc0RlbEJzc1JzcFdoZW5Db2FsZXNjaW5nKHRwQW5pU2lyR2xvYmFsICBwTWFjLCAgdm9pZCAqbXNnLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICB0cERlbGV0ZUJzc1BhcmFtcyBwRGVsQnNzID0gKHRwRGVsZXRlQnNzUGFyYW1zKSBtc2c7CisKKyAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJJQlNTOiBERUxfQlNTX1JTUCBSY3ZkIGR1cmluZyBjb2FsZXNjaW5nIVxuIikpOykKKworICAgIGlmIChwRGVsQnNzID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJJQlNTOiBERUxfQlNTX1JTUChjb2FsZXNjZSkgd2l0aCBubyBib2R5IVxuIikpOykKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKHBEZWxCc3MtPnN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJJQlNTOiBERUxfQlNTX1JTUChjb2FsZXNjZSkgZXJyb3IgKCV4KSBCc3MgJWQgIiksCisgICAgICAgICAgICAgICBwRGVsQnNzLT5zdGF0dXMsIHBEZWxCc3MtPmJzc0lkeCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICAvL0RlbGV0ZSBwZWVyIGVudHJpZXMuCisgICAgbGltSWJzc0RlbGV0ZUFsbFBlZXJzKHBNYWMscHNlc3Npb25FbnRyeSk7CisKKyAgICAvKiBhZGQgdGhlIG5ldyBic3MgKi8KKyAgICBpYnNzX2Jzc19hZGQocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKworICAgIGVuZDoKKyAgICBpZihwRGVsQnNzICE9IE5VTEwpCisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBEZWxCc3MgKTsKK30KKworCisKK3ZvaWQgbGltSWJzc0FkZEJzc1JzcFdoZW5Db2FsZXNjaW5nKHRwQW5pU2lyR2xvYmFsICBwTWFjLCB2b2lkICptc2csIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgaW5mb0xlbjsKKyAgICB0U2lyU21lTmV3QnNzSW5mbyBuZXdCc3NJbmZvOworCisgICAgdHBBZGRCc3NQYXJhbXMgcEFkZEJzcyA9ICh0cEFkZEJzc1BhcmFtcykgbXNnOworCisgICAgdHBTaXJNYWNNZ210SGRyICAgcEhkciAgICA9ICh0cFNpck1hY01nbXRIZHIpICAgcE1hYy0+bGltLmlic3NJbmZvLnBIZHI7CisgICAgdHBTY2hCZWFjb25TdHJ1Y3QgcEJlYWNvbiA9ICh0cFNjaEJlYWNvblN0cnVjdCkgcE1hYy0+bGltLmlic3NJbmZvLnBCZWFjb247CisKKyAgICBpZiAoKHBIZHIgPT0gTlVMTCkgfHwgKHBCZWFjb24gPT0gTlVMTCkpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gaGFuZGxlIEFkZEJzc1JzcFdoZW5Db2FsZXNjaW5nIChubyBjYWNoZWQgQlNTIGluZm8pXG4iKSk7KQorICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICAvLyBJbmZvcm0gSG9zdCBvZiBJQlNTIGNvYWxlc2NpbmcKKyAgICBpbmZvTGVuID0gc2l6ZW9mKHRTaXJNYWNBZGRyKSArIHNpemVvZih0U2lyTWFjQ2hhbk51bSkgKworICAgICAgICAgICAgICBzaXplb2YodEFOSV9VOCkgKyBwQmVhY29uLT5zc0lkLmxlbmd0aCArIDE7CisKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopICZuZXdCc3NJbmZvLCBzaXplb2YobmV3QnNzSW5mbykpOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIG5ld0Jzc0luZm8uYnNzSWQsIHBIZHItPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBuZXdCc3NJbmZvLmNoYW5uZWxOdW1iZXIgPSAodFNpck1hY0NoYW5OdW0pIHBBZGRCc3MtPmN1cnJlbnRPcGVyQ2hhbm5lbDsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmbmV3QnNzSW5mby5zc0lkLAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnBCZWFjb24tPnNzSWQsIHBCZWFjb24tPnNzSWQubGVuZ3RoICsgMSk7CisKKyAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJTZW5kaW5nIEpPSU5FRF9ORVdfQlNTIG5vdGlmaWNhdGlvbiB0byBTTUUuXG4iKSk7KQorCisgICAgbGltU2VuZFNtZVdtU3RhdHVzQ2hhbmdlTnRmKHBNYWMsIGVTSVJfU01FX0pPSU5FRF9ORVdfQlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJm5ld0Jzc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9MZW4scFNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgeworICAgICAgICAvL0NvbmZpZ3VyZSBiZWFjb24gYW5kIHNlbmQgYmVhY29ucyB0byBIQUwKKyAgICAgICAgbGltU2VuZEJlYWNvbkluZChwTWFjLCBwU2Vzc2lvbkVudHJ5KTsKKyAgICB9CisjZW5kaWYKKyAgICAKKworICAgIGVuZDoKKyAgICBpYnNzX2NvYWxlc2NlX2ZyZWUocE1hYyk7Cit9CisKKworCit2b2lkCitsaW1JYnNzRGVsQnNzUnNwKAorICAgIHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgIHZvaWQgKm1zZyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJSZXN1bHRDb2RlcyByYyA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgdHBEZWxldGVCc3NQYXJhbXMgcERlbEJzcyA9ICh0cERlbGV0ZUJzc1BhcmFtcykgbXNnOworICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgIG51bGxCc3NpZCA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgaWYgKHBEZWxCc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIklCU1M6IERFTF9CU1NfUlNQIHdpdGggbm8gYm9keSFcbiIpKTspCisgICAgICAgIHJjID0gZVNJUl9TTUVfUkVGVVNFRDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwRGVsQnNzLT5zZXNzaW9uSWQpKT09TlVMTCkKKyAgICB7CisgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLEZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSURcbiIpKTsKKyAgICAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisKKyAgICAvKgorICAgICogSWYgZGVsQnNzIHdhcyBpc3N1ZWQgYXMgcGFydCBvZiBJQlNTIENvYWxlc2NpbmcsIGdMaW1JYnNzQ29hbGVzY2luZ0hhcHBlbmVkIGZsYWcgd2lsbCBiZSB0cnVlLgorICAgICogQlNTIGhhcyB0byBiZSBhZGRlZCBhZ2FpbiBpbiB0aGlzIHNjZW5hcmlvLCBzbyB0aGlzIGNhc2UgbmVlZHMgdG8gYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgorICAgICogSWYgZGVsQnNzIHdhcyBpc3N1ZWQgYXMgYSByZXN1bHQgb2YgdHJpZ2dlciBmcm9tIFNNRV9TVE9QX0JTUyBSZXF1ZXN0LCB0aGVuIGxpbVNtZSBzdGF0ZSBjaGFuZ2VzIHRvCisgICAgKiAnSURMRScgYW5kIGdMaW1JYnNzQ29hbGVzY2luZ0hhcHBlbmVkIGZsYWcgd2lsbCBiZSBmYWxzZS4gSW4gdGhpcyBjYXNlIFNUT1AgQlNTIFJTUCBoYXMgdG8gYmUgc2VudCB0byBTTUUuCisgICAgKi8KKyAgICBpZih0cnVlID09IHBNYWMtPmxpbS5nTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZCkKKyAgICB7CisgICAgICAgCisgICAgICAgIGxpbUlic3NEZWxCc3NSc3BXaGVuQ29hbGVzY2luZyhwTWFjLG1zZyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisKKyAgICBpZiAocERlbEJzcy0+c3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJJQlNTOiBERUxfQlNTX1JTUCBlcnJvciAoJXgpIEJzcyAlZCAiKSwKKyAgICAgICAgICAgICAgIHBEZWxCc3MtPnN0YXR1cywgcERlbEJzcy0+YnNzSWR4KTspCisgICAgICAgIHJjID0gZVNJUl9TTUVfU1RPUF9CU1NfRkFJTFVSRTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisKKworICAgIGlmKGxpbVNldExpbmtTdGF0ZShwTWFjLCBlU0lSX0xJTktfSURMRV9TVEFURSwgbnVsbEJzc2lkLCAgCisgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJJQlNTOiBERUxfQlNTX1JTUCBzZXRMaW5rU3RhdGUgZmFpbGVkXG4iKSk7KQorICAgICAgICByYyA9IGVTSVJfU01FX1JFRlVTRUQ7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGRwaEhhc2hUYWJsZUNsYXNzSW5pdChwTWFjLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgbGltRGVsZXRlUHJlQXV0aExpc3QocE1hYyk7CisKKyAgICBsaW1JYnNzRGVsZXRlKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9JRExFX1NUQVRFOworCisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9TVEFfUk9MRTsKKworICAgIC8qIENoYW5nZSB0aGUgc2hvcnQgc2xvdCBvcGVyYXRpbmcgbW9kZSB0byBEZWZhdWx0ICh3aGljaCBpcyAxIGZvciBub3cpIHNvIHRoYXQgd2hlbiBJQlNTIHN0YXJ0cyBuZXh0IHRpbWUgd2l0aCBMaWJyYQorICAgICAqIGFzIG9yaWdpbmF0b3IsIGl0IHBpY2tzIHVwIHRoZSBkZWZhdWx0LiBUaGlzIGVuYWJsZXMgdXMgdG8gcmVtb3ZlIGhhcmQgY29kaW5nIG9mIHNob3J0IHNsb3QgPSAxIGZyb20gbGltQXBwbHlDb25maWd1cmF0aW9uIAorICAgICAqLworICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR19TSE9SVF9TTE9UX1RJTUUsIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FX1NUQURFRikgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgdXBkYXRlIHNob3J0IHNsb3QgdGltZSBhdCBDRkdcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVuZDoKKyAgICBpZihwRGVsQnNzICE9IE5VTEwpCisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBEZWxCc3MgKTsKKyAgICAvKiBEZWxldGUgUEUgc2Vzc2lvbiBvbmNlIEJTUyBpcyBkZWxldGVkICovCisgICAgaWYgKE5VTEwgIT0gcHNlc3Npb25FbnRyeSkgeworICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NUT1BfQlNTX1JTUCwgcmMscHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQpOworICAgICAgICBwZURlbGV0ZVNlc3Npb24ocE1hYywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIHBzZXNzaW9uRW50cnkgPSBOVUxMOworICAgIH0KK30KKworLyoqCisgKiBsaW1JYnNzQ29hbGVzY2UoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIHJlY2VpdmluZyBCZWFjb24vUHJvYmUgUmVzcG9uc2UKKyAqIHdoaWxlIG9wZXJhdGluZyBpbiBJQlNTIG1vZGUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBCZWFjb24gLSBQYXJzZWQgQmVhY29uIEZyYW1lIHN0cnVjdHVyZQorICogQHBhcmFtICBwQkQgICAgIC0gUG9pbnRlciB0byByZWNlaXZlZCBCRAorICoKKyAqIEByZXR1cm4gU3RhdHVzIHdoZXRoZXIgdG8gcHJvY2VzcyBvciBpZ25vcmUgcmVjZWl2ZWQgQmVhY29uIEZyYW1lCisgKi8KKwordFNpclJldFN0YXR1cworbGltSWJzc0NvYWxlc2NlKAorICAgIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICB0cFNpck1hY01nbXRIZHIgICAgIHBIZHIsCisgICAgdHBTY2hCZWFjb25TdHJ1Y3QgICBwQmVhY29uLAorICAgIHRBTklfVTggICAgICAgICAgICAgICpwSUVzLAorICAgIHRBTklfVTMyICAgICAgICAgICAgaWVMZW4sCisgICAgdEFOSV9VMTYgICAgICAgICAgICBmVHNmTGF0ZXIsCisgICAgdHBQRVNlc3Npb24gICAgICAgICBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgYWlkOworICAgIHRTaXJNYWNBZGRyICAgICAgICAgY3VycmVudEJzc0lkOworICAgIHRMaW1JYnNzUGVlck5vZGUgICAgKnBQZWVyTm9kZTsKKyAgICB0cERwaEhhc2hOb2RlICAgICAgIHBTdGFEczsKKyAgICB0VXBkYXRlQmVhY29uUGFyYW1zIGJlYWNvblBhcmFtczsgCisKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmYmVhY29uUGFyYW1zLCBzaXplb2YodFVwZGF0ZUJlYWNvblBhcmFtcykpOworCisgICAgc2lyQ29weU1hY0FkZHIoY3VycmVudEJzc0lkLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworICAgIC8qIENoZWNrIGZvciBJQlNTIENvYWxlc2Npbmcgb25seSBpZiBCZWFjb24gaXMgZnJvbSBkaWZmZXJlbnQgQlNTICovCisgICAgaWYgKCAhcGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsIGN1cnJlbnRCc3NJZCwgcEhkci0+YnNzSWQsIHNpemVvZiggdFNpck1hY0FkZHIgKSApICkKKyAgICB7CisgICAgICAgIGlmICghIGZUc2ZMYXRlcikgLy8gTm8gQ29hbGVzY2luZyBoYXBwZW5lZC4KKyAgICAgICAgICAgIHJldHVybiBlU0lSX0xJTV9JR05PUkVfQkVBQ09OOworICAgICAgICAvKgorICAgICAgICAgKiBJQlNTIENvYWxlc2NpbmcgaGFwcGVuZWQuCisgICAgICAgICAqIHNhdmUgdGhlIHJlY2VpdmVkIGJlYWNvbiwgYW5kIGRlbGV0ZSB0aGUgY3VycmVudCBCU1MuIFRoZSByZXN0IG9mIHRoZQorICAgICAgICAgKiBwcm9jZXNzaW5nIHdpbGwgYmUgZG9uZSBpbiB0aGUgZGVsQnNzIHJlc3BvbnNlIHByb2Nlc3NpbmcKKyAgICAgICAgICovCisgICAgICAgIHBNYWMtPmxpbS5nTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZCA9IHRydWU7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIklCU1MgQ29hbGVzY2luZyBoYXBwZW5lZFxuIikpOykKKyAgICAgICAgaWJzc19jb2FsZXNjZV9zYXZlKHBNYWMsIHBIZHIsIHBCZWFjb24pOworICAgICAgICBpYnNzX2Jzc19kZWxldGUocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvLyBTVEEgaW4gSUJTUyBtb2RlIGFuZCBTU0lEIG1hdGNoZXMgd2l0aCBvdXJzCisgICAgcFBlZXJOb2RlID0gaWJzc19wZWVyX2ZpbmQocE1hYywgcEhkci0+c2EpOworICAgIGlmIChwUGVlck5vZGUgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFBlZXIgbm90IGluIHRoZSBsaXN0IC0gQ29sbGVjdCBCU1MgZGVzY3JpcHRpb24gJiBhZGQgdG8gdGhlIGxpc3QgKi8KKyAgICAgICAgdEFOSV9VMzIgICAgICBmcmFtZUxlbjsKKyAgICAgICAgdFNpclJldFN0YXR1cyByZXRDb2RlOworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJJQlNTIFBlZXIgbm9kZSBkb2VzIG5vdCBleGlzdCwgYWRkaW5nIGl0KioqXG4iKSk7KQorCisjaWZuZGVmIEFOSV9TSVJfSUJTU19QRUVSX0NBQ0hJTkcKKyAgICAgICAgLyoqIExpbWl0IHRoZSBNYXggbnVtYmVyIG9mIElCU1MgUGVlcnMgYWxsb3dlZCBhcyB0aGUgbWF4IG51bWJlciBvZiBTVEEncyBhbGxvd2VkCisgICAgICAgICAqLworICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1OdW1JYnNzUGVlcnMgPj0gcE1hYy0+bGltLm1heFN0YXRpb24pCisgICAgICAgICAgICByZXR1cm4gZVNJUl9MSU1fTUFYX1NUQV9SRUFDSEVEX0VSUk9SOworI2VuZGlmCisgICAgICAgIGZyYW1lTGVuID0gc2l6ZW9mKHRMaW1JYnNzUGVlck5vZGUpICsgaWVMZW4gLSBzaXplb2YodEFOSV9VMzIpOworCisgICAgICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAgICAgICBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikgJnBQZWVyTm9kZSwgKHRBTklfVTE2KWZyYW1lTGVuKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJhbGxvYyBmYWlsICglZCBieXRlcykgc3RvcmluZyBJQlNTIHBlZXIgaW5mb1xuIiksCisgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4pOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgICAgfQorCisgICAgICAgIHBQZWVyTm9kZS0+YmVhY29uID0gTlVMTDsKKyAgICAgICAgcFBlZXJOb2RlLT5iZWFjb25MZW4gPSAwOworCisgICAgICAgIGlic3NfcGVlcl9jb2xsZWN0KHBNYWMsIHBCZWFjb24sIHBIZHIsIHBQZWVyTm9kZSxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgICAgICAgICAgIHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKiopJnBQZWVyTm9kZS0+YmVhY29uLCBpZUxlbikpCisgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgYmVhY29uIikpOykKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFBlZXJOb2RlLT5iZWFjb24sIHBJRXMsIGllTGVuKTsKKyAgICAgICAgICAgIHBQZWVyTm9kZS0+YmVhY29uTGVuID0gKHRBTklfVTE2KWllTGVuOworICAgICAgICB9CisgICAgICAgIGlic3NfcGVlcl9hZGQocE1hYywgcFBlZXJOb2RlKTsKKworICAgICAgICBwU3RhRHMgPSBkcGhMb29rdXBIYXNoRW50cnkocE1hYywgcFBlZXJOb2RlLT5wZWVyTWFjQWRkciwgJmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgICAgICBpZiAocFN0YURzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBEUEggbm9kZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHBlZXIKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkRQSCBOb2RlIHByZXNlbnQgZm9yIGp1c3QgbGVhcm5lZCBwZWVyXG4iKSk7KQorICAgICAgICAgICAgUEVMT0cxKGxpbVByaW50TWFjQWRkcihwTWFjLCBwUGVlck5vZGUtPnBlZXJNYWNBZGRyLCBMT0cxKTspCisgICAgICAgICAgICBpYnNzX3N0YV9pbmZvX3VwZGF0ZShwTWFjLCBwU3RhRHMsIHBQZWVyTm9kZSxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgfQorICAgICAgICByZXRDb2RlID0gbGltSWJzc1N0YUFkZChwTWFjLCBwUGVlck5vZGUtPnBlZXJNYWNBZGRyLHBzZXNzaW9uRW50cnkpOworICAgICAgICBpZiAocmV0Q29kZSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImxpbS1pYnNzLXN0YS1hZGQgZmFpbGVkIChyZWFzb24gJXgpXG4iKSwgcmV0Q29kZSk7KQorICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBQZWVyTm9kZS0+cGVlck1hY0FkZHIsIExPR0UpOworICAgICAgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWNpZGUgcHJvdGVjdGlvbiBtb2RlCisgICAgICAgIHBTdGFEcyA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBwUGVlck5vZGUtPnBlZXJNYWNBZGRyLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgICAgIGlmKHBNYWMtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0gV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorICAgICAgICAgICAgbGltSWJzc0RlY2lkZVByb3RlY3Rpb24ocE1hYywgcFN0YURzLCAmYmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICBpZihiZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImJlYWNvblBhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcD0xIC0tLT4gVXBkYXRlIEJlYWNvbiBQYXJhbXMgXG4iKSk7KQorICAgICAgICAgICAgc2NoU2V0Rml4ZWRCZWFjb25GaWVsZHMocE1hYywgcHNlc3Npb25FbnRyeSk7ICAgIAorICAgICAgICAgICAgbGltU2VuZEJlYWNvblBhcmFtcyhwTWFjLCAmYmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBpYnNzX3N0YV9jYXBzX3VwZGF0ZShwTWFjLCBwUGVlck5vZGUscHNlc3Npb25FbnRyeSk7CisKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKQorICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCisgICAgLy8gUmVjZWl2ZWQgQmVhY29uIGZyb20gc2FtZSBJQlNTIHdlJ3JlCisgICAgLy8gY3VycmVudGx5IHBhcnQgb2YuIEluZm9ybSBSb2FtaW5nIGFsZ29yaXRobQorICAgIC8vIGlmIG5vdCBhbHJlYWR5IHRoYXQgSUJTUyBpcyBhY3RpdmUuCisgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbUlic3NBY3RpdmUgPT0gZmFsc2UpCisgICAgeworICAgICAgICBsaW1SZXNldEhCUGt0Q291bnQocHNlc3Npb25FbnRyeSk7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIlBhcnRuZXIgam9pbmVkIG91ciBJQlNTLCBTZW5kaW5nIElCU1NfQUNUSVZFIE5vdGlmaWNhdGlvbiB0byBTTUVcbiIpKTspCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbUlic3NBY3RpdmUgPSB0cnVlOworICAgICAgICBsaW1TZW5kU21lV21TdGF0dXNDaGFuZ2VOdGYocE1hYywgZVNJUl9TTUVfSUJTU19BQ1RJVkUsIE5VTEwsIDAsIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCk7CisgICAgICAgIGxpbUhlYXJ0QmVhdERlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsIDAsIGVMSU1fSEVBUlRfQkVBVF9USU1FUikpOworICAgICAgICBpZiAobGltQWN0aXZhdGVIZWFyQmVhdFRpbWVyKHBNYWMpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCBhY3RpdmF0ZSBIZWFydGJlYXQgdGltZXJcbiIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqIGVuZCBsaW1IYW5kbGVJQlNTY29hbGVzY2luZygpICoqKi8KKworCit2b2lkIGxpbUlic3NIZWFydEJlYXRIYW5kbGUodHBBbmlTaXJHbG9iYWwgcE1hYyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRMaW1JYnNzUGVlck5vZGUgKnBUZW1wTm9kZSwgKnBQcmV2Tm9kZTsKKyAgICB0TGltSWJzc1BlZXJOb2RlICpwVGVtcE5leHROb2RlID0gTlVMTDsKKyAgICB0QU5JX1UxNiAgICAgIGFpZDsKKyAgICB0cERwaEhhc2hOb2RlIHBTdGFEczsKKyAgICB0QU5JX1UzMiB0aHJlc2hvbGQ7CisgICAgdEFOSV9VMTYgc3RhSW5kZXg7CisgICAgdEFOSV9VOCB1Y1VjYXN0U2lnOworICAgIHRBTklfVTggdWNCY2FzdFNpZzsKKworICAgIC8qKiBNTE0gQlNTIGlzIHN0YXJ0ZWQgYW5kIGlmIFBFIGluIHNjYW5tb2RlIHRoZW4gTUxNIHN0YXRlIHdpbGwgYmUgd2FpdGluZyBmb3IgcHJvYmUgcmVzcC4KKyAgICAgKiAgSWYgSGVhcnQgYmVhdCB0aW1lb3V0IHRyaWdnZXJzIGR1cmluZyB0aGlzIGNvcm5lciBjYXNlIHRoZW4gd2UgbmVlZCB0byByZWFjdGl2YXRlIEhlYXJ0QmVhdCB0aW1lciAKKyAgICAgKi8KKyAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSAhPSBlTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURSkgeworICAgICAgICAvKioqKioqIAorICAgICAgICAgKiBOb3RlOiBVc2UgdGhpcyBjb2RlIG9uY2UgeW91IGhhdmUgY29udmVydGVkIGFsbCAgCisgICAgICAgICAqIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcigpIGNhbGxzIHRvIAorICAgICAgICAgKiBsaW1SZWFjdGl2YXRlVGltZXIoKSBjYWxscy4KKyAgICAgICAgICogCisgICAgICAgICAqKioqKiovCisgICAgICAgIC8vbGltUmVhY3RpdmF0ZVRpbWVyKHBNYWMsIGVMSU1fSEVBUlRfQkVBVF9USU1FUiwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiogSWYgTGlua01vbml0b3IgaXMgRGlzYWJsZWQgKi8KKyAgICBpZighcE1hYy0+c3lzLmdTeXNFbmFibGVMaW5rTW9uaXRvck1vZGUpCisgICAgICAgIHJldHVybjsKKworICAgIHBQcmV2Tm9kZSA9IHBUZW1wTm9kZSAgPSBwTWFjLT5saW0uZ0xpbUlic3NQZWVyTGlzdDsKKyAgICB0aHJlc2hvbGQgPSAocE1hYy0+bGltLmdMaW1OdW1JYnNzUGVlcnMgLyA0ICkgKyAxOworCisgICAgLyoqIE1vbml0b3IgdGhlIEhlYXJ0QmVhdCB3aXRoIHRoZSBJbmRpdmlkdWFsIFBFRVJTIGluIHRoZSBJQlNTICovCisgICAgd2hpbGUgKHBUZW1wTm9kZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcFRlbXBOZXh0Tm9kZSA9IHBUZW1wTm9kZS0+bmV4dDsKKyAgICAgICAgaWYocFRlbXBOb2RlLT5iZWFjb25IQkNvdW50KSAvL1RoZXJlIHdhcyBhIGJlYWNvbiBmb3IgdGhpcyBwZWVyIGR1cmluZyBoZWFydCBiZWF0LgorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcE5vZGUtPmJlYWNvbkhCQ291bnQgPSAwOworICAgICAgICAgICAgcFRlbXBOb2RlLT5oZWFydGJlYXRGYWlsdXJlID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vVGhlcmUgd2FzbnQgYW55IGJlYWNvbiByZWNlaXZlZCBkdXJpbmcgaGVhcnRiZWF0IHRpbWVyLgorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcE5vZGUtPmhlYXJ0YmVhdEZhaWx1cmUrKzsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkhlYXJ0YmVhdCBmYWlsID0gJWQgIHRocmVzID0gJWQiKSwgcFRlbXBOb2RlLT5oZWFydGJlYXRGYWlsdXJlLCBwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycyk7KQorICAgICAgICAgICAgaWYocFRlbXBOb2RlLT5oZWFydGJlYXRGYWlsdXJlID49IHRocmVzaG9sZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9SZW1vdmUgdGhpcyBlbnRyeSBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgIHBTdGFEcyA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBwVGVtcE5vZGUtPnBlZXJNYWNBZGRyLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgICAgICAgICAgICAgaWYgKHBTdGFEcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YUluZGV4ID0gcFN0YURzLT5zdGFJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgdWNVY2FzdFNpZyA9IHBTdGFEcy0+dWNVY2FzdFNpZzsKKyAgICAgICAgICAgICAgICAgICAgdWNCY2FzdFNpZyA9IHBTdGFEcy0+dWNCY2FzdFNpZzsKKworICAgICAgICAgICAgICAgICAgICAodm9pZCkgbGltRGVsU3RhKHBNYWMsIHBTdGFEcywgZmFsc2UgLyphc3luY2hyb25vdXMqLyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgbGltRGVsZXRlRHBoSGFzaEVudHJ5KHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgYWlkLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgIC8vU2VuZCBpbmRpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICBpYnNzX3N0YXR1c19jaGdfbm90aWZ5KCBwTWFjLCBwVGVtcE5vZGUtPnBlZXJNYWNBZGRyLCBzdGFJbmRleCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjVWNhc3RTaWcsIHVjQmNhc3RTaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVXTklfU01FX0lCU1NfUEVFUl9ERVBBUlRFRF9JTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihwVGVtcE5vZGUgPT0gcE1hYy0+bGltLmdMaW1JYnNzUGVlckxpc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUlic3NQZWVyTGlzdCA9IHBUZW1wTm9kZS0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgcFByZXZOb2RlID0gcE1hYy0+bGltLmdMaW1JYnNzUGVlckxpc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcFByZXZOb2RlLT5uZXh0ID0gcFRlbXBOb2RlLT5uZXh0OworCisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLHBUZW1wTm9kZSk7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1OdW1JYnNzUGVlcnMtLTsKKworICAgICAgICAgICAgICAgIHBUZW1wTm9kZSA9IHBUZW1wTmV4dE5vZGU7IC8vU2luY2Ugd2UgZGVsZXRlZCBjdXJyZW50IG5vZGUsIHByZXZOb2RlIHJlbWFpbnMgc2FtZS4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgcFByZXZOb2RlID0gcFRlbXBOb2RlOworICAgICAgICBwVGVtcE5vZGUgPSBwVGVtcE5leHROb2RlOworICAgIH0KKworICAgIC8qKiBHZW5lcmFsIElCU1MgQWN0aXZpdHkgTW9uaXRvciwgY2hlY2sgaWYgaW4gSUJTUyBNb2RlIHdlIGFyZSByZWNlaXZlZCBhbnkgQmVhY29ucyAqLworICAgIGlmKHBNYWMtPmxpbS5nTGltTnVtSWJzc1BlZXJzKQorICAgIHsKKyAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+TGltUnhlZEJlYWNvbkNudER1cmluZ0hCIDwgTUFYX05PX0JFQUNPTlNfUEVSX0hFQVJUX0JFQVRfSU5URVJWQUwpCisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhlYXJ0QmVhdEJlYWNvblN0YXRzW3BzZXNzaW9uRW50cnktPkxpbVJ4ZWRCZWFjb25DbnREdXJpbmdIQl0rKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1IZWFydEJlYXRCZWFjb25TdGF0c1swXSsrOworCisgICAgICAgIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAvLyBSZXNldCBudW1iZXIgb2YgYmVhY29ucyByZWNlaXZlZAorICAgICAgICBsaW1SZXNldEhCUGt0Q291bnQocHNlc3Npb25FbnRyeSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJIZWFydGJlYXQgRmFpbHVyZVxuIikpOykKKyAgICAgICAgcE1hYy0+bGltLmdMaW1IQmZhaWx1cmVDbnRJbkxpbmtFc3RTdGF0ZSsrOworCisgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1JYnNzQWN0aXZlID09IHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHJlY2VpdmUgQmVhY29uIGZyYW1lcyBmcm9tIGFueQorICAgICAgICAgICAgLy8gb3RoZXIgU1RBIGluIElCU1MuIEFubm91bmNlIElCU1MgaW5hY3RpdmUKKyAgICAgICAgICAgIC8vIHRvIFJvYW1pbmcgYWxnb3JpdGhtCisgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJBbG9uZSBpbiBJQlNTXG4iKSk7KQorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltSWJzc0FjdGl2ZSA9IGZhbHNlOworCisgICAgICAgICAgICBsaW1TZW5kU21lV21TdGF0dXNDaGFuZ2VOdGYocE1hYywgZVNJUl9TTUVfSUJTU19JTkFDVElWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1JYnNzRGVjaWRlUHJvdGVjdGlvbk9uRGVsZXRlCitcYnJpZWYgRGVjaWRlcyBhbGwgdGhlIHByb3RlY3Rpb24gcmVsYXRlZCBpbmZvcm1hdGlvbi4KK1wKK1xwYXJhbSAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworXHBhcmFtICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkcgorXHBhcmFtICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zCitccmV0dXJuIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1JYnNzRGVjaWRlUHJvdGVjdGlvbk9uRGVsZXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTMyIHBoeU1vZGU7CisgICAgdEhhbEJpdFZhbCBlcnBFbmFibGVkID0gZUhBTF9DTEVBUjsKKyAgICB0U2lyUkZCYW5kIHJmQmFuZCA9IFNJUl9CQU5EX1VOS05PV047CisgICAgdEFOSV9VMzIgaTsgICAgCisgICAgCisgICAgaWYoTlVMTCA9PSBwU3RhRHMpCisgICAgICByZXR1cm47CisKKyAgICBsaW1HZXRSZkJhbmQocE1hYywgJnJmQmFuZCwgcHNlc3Npb25FbnRyeSk7CisgICAgaWYoU0lSX0JBTkRfMl80X0dIWiA9PSByZkJhbmQpCisgICAgeworICAgICAgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgZXJwRW5hYmxlZCA9IHBTdGFEcy0+ZXJwRW5hYmxlZDsKKyAgICAgICAgLy93ZSBhcmUgSFQgb3IgMTFHIGFuZCAxMUIgc3RhdGlvbiBpcyBnZXR0aW5nIGRlbGV0ZWQuCisgICAgICAgIGlmICggKChwaHlNb2RlID09IFdOSV9DRkdfUEhZX01PREVfMTFHKSB8fCBwTWFjLT5saW0uaHRDYXBhYmlsaXR5KSAKKyAgICAgICAgICAgICAgJiYgKGVycEVuYWJsZWQgPT0gZUhBTF9DTEVBUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIiglZCkgQSBsZWdhY3kgU1RBIGlzIGRpc2Fzc29jaWF0ZWQuIEFkZHIgaXMgIiksCisgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5udW1TdGEpOworICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgTE9HRSk7KQorICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMubnVtU3RhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5wcm90U3RhQ2FjaGVbaV0uYWN0aXZlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQscE1hYy0+bGltLnByb3RTdGFDYWNoZVtpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMubnVtU3RhLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLnByb3RTdGFDYWNoZVtpXS5hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMubnVtU3RhID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiTm8gbW9yZSAxMUIgU1RBIGV4aXN0cy4gRGlzYWJsZSBwcm90ZWN0aW9uLiBcbiIpKTspCisgICAgICAgICAgICAgICAgbGltSWJzc1NldFByb3RlY3Rpb24ocE1hYywgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbUlic3NQZWVyTWdtdC5oIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1JYnNzUGVlck1nbXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjNhMzlmCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1JYnNzUGVlck1nbXQuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbUlic3NQZWVyTWdtdC5oIGNvbnRhaW5zIHByb3RvdHlwZXMgZm9yCisgKiB0aGUgdXRpbGl0eSBmdW5jdGlvbnMgTElNIHVzZXMgdG8gbWFpbnRhaW4gcGVlcnMgaW4gSUJTUy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAzLzEyLzA0CisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAic2lyQ29tbW9uLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKwordm9pZCBsaW1JYnNzSW5pdCh0cEFuaVNpckdsb2JhbCk7Cit2b2lkIGxpbUlic3NEZWxldGUodHBBbmlTaXJHbG9iYWwsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit0U2lyUmV0U3RhdHVzIGxpbUlic3NDb2FsZXNjZSh0cEFuaVNpckdsb2JhbCwgdHBTaXJNYWNNZ210SGRyLCB0cFNjaEJlYWNvblN0cnVjdCwgdEFOSV9VOCosdEFOSV9VMzIsIHRBTklfVTE2LHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgbGltSWJzc1N0YUFkZCh0cEFuaVNpckdsb2JhbCwgdm9pZCAqLHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgbGltSWJzc0FkZFN0YVJzcCggdHBBbmlTaXJHbG9iYWwsIHZvaWQgKix0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbUlic3NEZWxCc3NSc3AoIHRwQW5pU2lyR2xvYmFsLCB2b2lkICosdHBQRVNlc3Npb24pOwordm9pZCBsaW1JYnNzRGVsQnNzUnNwV2hlbkNvYWxlc2NpbmcodHBBbmlTaXJHbG9iYWwsICB2b2lkICosdHBQRVNlc3Npb24pOwordm9pZCBsaW1JYnNzQWRkQnNzUnNwV2hlbkNvYWxlc2NpbmcodHBBbmlTaXJHbG9iYWwgIHBNYWMsIHZvaWQgKiBtc2csIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkpOwordm9pZCBsaW1JYnNzRGVjaWRlUHJvdGVjdGlvbk9uRGVsZXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YURzLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkpOwordm9pZCBsaW1JYnNzSGVhcnRCZWF0SGFuZGxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltTGlua01vbml0b3JpbmdBbGdvLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbUxpbmtNb25pdG9yaW5nQWxnby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzEwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbUxpbmtNb25pdG9yaW5nQWxnby5jCkBAIC0wLDAgKzEsNTUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltTGlua01vbml0b3JpbmdBbGdvLmNjIGNvbnRhaW5zIHRoZSBjb2RlIGZvcgorICogTGluayBtb25pdG9yaW5nIGFsZ29yaXRobSBvbiBBUCBhbmQgaGVhcnQgYmVhdCBmYWlsdXJlCisgKiBoYW5kbGluZyBvbiBTVEEuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMy8wMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJ3bmlDZmdBcC5oIgorI2luY2x1ZGUgImNmZ0FwaS5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbERhdGFTdHJ1Y3QuaCIKKyNpbmNsdWRlICJoYWxDb21tb25BcGkuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAicG1tQXBpLmgiCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltVHlwZXMuaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbVByb3BFeHRzVXRpbHMuaCIKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorI2luY2x1ZGUgInZvc19kaWFnX2NvcmVfbG9nLmgiCisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisjaW5jbHVkZSAibGltU2Vzc2lvbi5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisKKworLyoqCisgKiBsaW1TZW5kS2VlcEFsaXZlVG9QZWVyKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBLZWVwIGFsaXZlIG1lc3NhZ2UgdG8gcGVlcgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1TZW5kS2VlcEFsaXZlVG9QZWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQICAgLy9vY3QgM3JkIHJldmlldworCisgICAgdHBEcGhIYXNoTm9kZSAgIHBTdGFEczsKKyAgICAvL2ZldGNoIHRoZSBzZXNzaW9uRW50cnkgYmFzZWQgb24gdGhlIHNlc3Npb25JZAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1LZWVwYWxpdmVUaW1lci5zZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiBrZWVwIGxpdmUgaGFzIGJlZW4gZGlzYWJsZWQsIGV4aXQKKyAgICBpZiAocE1hYy0+c2NoLmtlZXBBbGl2ZSA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIChsaW1Jc1N5c3RlbUluU2NhblN0YXRlKHBNYWMpID09IGZhbHNlKSAmJgorICAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkpCisgICAgeworICAgICAgICB0QU5JX1UxNiBpOworICAgICAgICB0QU5JX1UzMiAgICAgICAgbGVuID0gU0lSX01BQ19NQVhfU1NJRF9MRU5HVEg7CisgICAgICAgIHRBbmlTU0lEICAgc3NJZDsKKworICAgICAgICAvKgorICAgICAgICAqKiBzZW5kIGtlZXBhbGl2ZSBOVUxMIGRhdGEgZnJhbWUgZm9yIGVhY2gKKyAgICAgICAgKiogYXNzb2NpYXRlZCBTVEE7CisgICAgICAgICovCisKKyAgICAgICAgZm9yIChpPTI7IGk8cE1hYy0+bGltLm1heFN0YXRpb247IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIGksICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgICAgICAgICAgaWYgKHBTdGFEcyAmJiBwU3RhRHMtPmFkZGVkICYmCisgICAgICAgICAgICAgICAgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9PSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTUC1UeCBoYW5ncyBhdCB0aW1lcyB3aGVuIGEgemVyby1sZW5naHQgcGFja2V0IGlzIHRyYW5zbWl0dGVkCisgICAgICAgICAgICAgICAgLy8gVG8gYXZvaWQgYW55IGludGVyb3BlcmFiaWxpdHkgaXNzdWUgd2l0aCB0aGlyZCBwYXJ0eSBjbGluZXQKKyAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHNlbmRpbmcgYSBub24temVybyBkYXRhLW51bGwgcGFja2V0LCBBUCBzZW5kcyBhCisgICAgICAgICAgICAgICAgLy8gcHJvYmUgcmVzcG9uc2UgYXMgYSBrZWVwIGFsaXZlIHBhY2tldC4KKyAgICAgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19TU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmc3NJZC5zc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJmxlbikgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgZ2V0IFNTSUQgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgU1NJRFxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzc0lkLmxlbmd0aCA9ICh0QU5JX1U4KSBsZW47CisKKyAgICAgICAgICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsICBGTCgiU2VuZGluZyBrZWVwYWxpdmUgUHJvYmUgUnNwIE1zZyB0byAiKSk7CisgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgTE9HMik7KQorICAgICAgICAgICAgICAgIGxpbVNlbmRQcm9iZVJzcE1nbXRGcmFtZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUEhfS0VFUEFMSVZFX0ZSQU1FLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYKK30gLyoqKiBsaW1TZW5kS2VlcEFsaXZlVG9QZWVyKCkgKioqLworCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgIGxpbURlbGV0ZVN0YUNvbnRleHQKK1xicmllZiAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgbWVzc2FnZSBmcm9tIEhBTDoKK1wgICAgICAgIFdEQV9ERUxFVEVfU1RBX0NPTlRFWFRfSU5ELiBUaGlzIGZ1bmN0aW9uCitcICAgICAgICB2YWxpZGF0ZXMgdGhhdCB0aGUgZ2l2ZW4gc3RhdGlvbiBpZCBleGlzdCwgYW5kIGlmIHNvLAorXCAgICAgICAgZGVsZXRlcyB0aGUgc3RhdGlvbiBieSBjYWxsaW5nIGxpbVRyaWdnZXJTVEFkZWxldGlvbi4KK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xwYXJhbSAgIHRwU2lyTXNnUSAgICAgIGxpbU1zZworXHJldHVybiAgbm9uZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1EZWxldGVTdGFDb250ZXh0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpCit7CisgICAgdHBEZWxldGVTdGFDb250ZXh0ICBwTXNnID0gKHRwRGVsZXRlU3RhQ29udGV4dClsaW1Nc2ctPmJvZHlwdHI7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgICBwU3RhRHM7CisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA7CisgICAgdEFOSV9VOCAgICAgc2Vzc2lvbklkOworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLHBNc2ctPmJzc0lkLCZzZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJZFxuIikpOykKKyAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKE5VTEwgIT0gcE1zZykKKyAgICB7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBzd2l0Y2gocE1zZy0+cmVhc29uQ29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBIQUxfREVMX1NUQV9SRUFTT05fQ09ERV9LRUVQX0FMSVZFOgorICAgICAgICAgICAgY2FzZSBIQUxfREVMX1NUQV9SRUFTT05fQ09ERV9USU1fQkFTRUQ6CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiIERlbGV0aW5nIHN0YXRpb246IHN0YUlkID0gJWQsIHJlYXNvbkNvZGUgPSAlZFxuIiksIHBNc2ctPnN0YUlkLCBwTXNnLT5yZWFzb25Db2RlKTspCisjZW5kaWYgICAgICAgIAorICAgICAgICAgICAgICAgIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBwTXNnLT5hc3NvY0lkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgICAgICAgICAgICAgaWYgKCEgcFN0YURzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJTa2lwIFNUQSBkZWxldGlvbiAoaW52YWxpZCBTVEEpXG4iKSk7KQorICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGNoZWNrIGFuZCBzZWUgaWYgc2FtZSBzdGFJZC4gVGhpcyBpcyB0byBhdm9pZCB0aGUgc2NlbmFyaW8KKyAgICAgICAgICAgICAgICAqIHdoZXJlIHdlJ3JlIHRyeWluZyB0byBkZWxldGUgYSBzdGFJZCB3ZSBqdXN0IGFkZGVkLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHBTdGFEcy0+c3RhSW5kZXggIT0gcE1zZy0+c3RhSWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJzdGFpZCBtaXNtYXRjaDogJWQgdnMgJWQgXG4iKSwgcFN0YURzLT5zdGFJbmRleCwgcE1zZy0+c3RhSWQpOykKKyAgICAgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKChlTElNX0JUX0FNUF9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpIHx8CisgICAgICAgICAgICAgICAgICAgKGVMSU1fQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNBUDpsaW0gRGVsZXRlIFN0YXRpb24gQ29udGV4dCAoc3RhSWQ6ICVkLCBhc3NvY0lkOiAlZCkgXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTXNnLT5zdGFJZCwgcE1zZy0+YXNzb2NJZCk7KQorICAgICAgICAgICAgICAgICAgICBsaW1UcmlnZ2VyU1RBZGVsZXRpb24ocE1hYywgcFN0YURzLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9UZWFyRG93bkxpbmsgd2l0aCBBUAorICAgICAgICAgICAgICAgICAgICB0TGltTWxtRGVhdXRoSW5kICBtbG1EZWF1dGhJbmQ7CisgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoImxpbSBEZWxldGUgU3RhdGlvbiBDb250ZXh0IChzdGFJZDogJWQsIGFzc29jSWQ6ICVkKSBcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2ctPnN0YUlkLCBwTXNnLT5hc3NvY0lkKTspCisKKyAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OOworICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIgPSBlTElNX0xJTktfTU9OSVRPUklOR19ERUFVVEg7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgRGVhdXRoIEluZGljYXRpb24gdG8gU01FLgorICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmbWxtRGVhdXRoSW5kLnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgICAgICAgICBtbG1EZWF1dGhJbmQucmVhc29uQ29kZSAgICA9ICh0QU5JX1U4KSBwU3RhRHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb247CisgICAgICAgICAgICAgICAgICAgIG1sbURlYXV0aEluZC5kZWF1dGhUcmlnZ2VyID0gIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcjsKKworICAgICAgICAgICAgICAgICAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX0RFQVVUSF9JTkQsICh0QU5JX1UzMiAqKSAmbWxtRGVhdXRoSW5kKTsKKyAKKyAgICAgICAgICAgICAgICAgICAgbGltU2VuZFNtZURlYXV0aEluZChwTWFjLCBwU3RhRHMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBIQUxfREVMX1NUQV9SRUFTT05fQ09ERV9VTktOT1dOX0EyOgorICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIiBEZWxldGluZyBVbmtub3duIHN0YXRpb24gXG4iKSk7KQorICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwTXNnLT5hZGRyMiwgTE9HRSk7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBsaW1TZW5kRGVhdXRoTWdtdEZyYW1lKCBwTWFjLCBlU0lSX01BQ19DTEFTUzNfRlJBTUVfRlJPTV9OT05fQVNTT0NfU1RBX1JFQVNPTiwgcE1zZy0+YWRkcjIsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIiBVbmtub3duIHJlYXNvbiBjb2RlIFxuIikpOykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2cpOworICAgIHJldHVybjsKK30KKworCisvKioKKyAqIGxpbVRyaWdnZXJTVEFkZWxldGlvbigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHRyaWdnZXIgU1RBIGNvbnRleHQgZGVsZXRpb24KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAtIFBvaW50ZXIgdG8gZ2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzIC0gUG9pbnRlciB0byBpbnRlcm5hbCBTVEEgRGF0YXN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVRyaWdnZXJTVEFkZWxldGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyU21lRGVhdXRoUmVxICAgICpwU21lRGVhdXRoUmVxOworICAgIHRBTklfVTggICAgICAgICAgICAgKnBCdWY7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAqcExlbjsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIG1zZ0xlbmd0aCA9IDA7CisKKyAgICBpZiAoISBwU3RhRHMpCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJTa2lwIFNUQSBkZWxldGlvbiAoaW52YWxpZCBTVEEpXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qKgorICAgICAqIE1BQyBiYXNlZCBBdXRoZW50aWNhdGlvbiB3YXMgdXNlZC4gVHJpZ2dlcgorICAgICAqIERlYXV0aGVudGljYXRpb24gZnJhbWUgdG8gcGVlciBzaW5jZSBpdCB3aWxsCisgICAgICogdGFrZSBjYXJlIG9mIGRpc2Fzc29jaWF0aW9uIGFzIHdlbGwuCisgICAgICovCisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTbWVEZWF1dGhSZXEsIHNpemVvZih0U2lyU21lRGVhdXRoUmVxKSkpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfREVBVVRIX1JFUSBcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBCdWYgPSAodEFOSV9VOCAqKSAmcFNtZURlYXV0aFJlcS0+bWVzc2FnZVR5cGU7CisKKyAgICAvL21lc3NhZ2VUeXBlCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGxpbUNvcHlVMTYoKHRBTklfVTgqKXBCdWYsIGVXTklfU01FX0RJU0FTU09DX1JFUSk7CisjZWxzZQorICAgIGxpbUNvcHlVMTYoKHRBTklfVTgqKXBCdWYsIGVXTklfU01FX0RFQVVUSF9SRVEpOworI2VuZGlmCisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIG1zZ0xlbmd0aCArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgLy9sZW5ndGgKKyAgICBwTGVuID0gcEJ1ZjsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbXNnTGVuZ3RoICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgCisgICAgLy9zZXNzaW9uSWQKKyAgICAqcEJ1ZiA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIHBCdWYrKzsKKyAgICBtc2dMZW5ndGgrKzsKKyAgCisgICAgLy90cmFuc2FjdGlvbklkCisgICAgbGltQ29weVUxNigodEFOSV9VOCopcEJ1ZiwgcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIG1zZ0xlbmd0aCArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgLy9ic3NJZAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsIHBzZXNzaW9uRW50cnktPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpICk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIG1zZ0xlbmd0aCArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisgICAgLy9wZWVyTWFjQWRkcgorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsIHBTdGFEcy0+c3RhQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBtc2dMZW5ndGggKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKworICAgIC8vcmVhc29uQ29kZSAKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgbGltQ29weVUxNigodEFOSV9VOCopcEJ1ZiwgKHRBTklfVTE2KWVMSU1fTElOS19NT05JVE9SSU5HX0RJU0FTU09DKTsKKyNlbHNlCisgICAgbGltQ29weVUxNigodEFOSV9VOCopcEJ1ZiwgKHRBTklfVTE2KWVMSU1fTElOS19NT05JVE9SSU5HX0RFQVVUSCk7CisjZW5kaWYKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbXNnTGVuZ3RoICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICAvL0RvIG5vdCBzZW5kIGRpc2Fzc29jIE9UQQorICAgIC8vcEJ1ZlswXSA9IDEgbWVhbnMgZG8gbm90IHNlbmQgdGhlIGRpc2Fzc29jIGZyYW1lIG92ZXIgdGhlIGFpcgorICAgIC8vcEJ1ZlswXSA9IDAgbWVhbnMgc2VuZCB0aGUgZGlzYXNzb2MgZnJhbWUgb3ZlciB0aGUgYWlyCisgICAgcEJ1ZlswXT0gMDsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1U4KTsKKyAgICBtc2dMZW5ndGggKz0gc2l6ZW9mKHRBTklfVTgpOworCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICAvL2FpZAorICAgIGxpbUNvcHlVMTYoKHRBTklfVTgqKXBCdWYsIHBTdGFEcy0+YXNzb2NJZCk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIG1zZ0xlbmd0aCArPSBzaXplb2YodEFOSV9VMTYpOworI2VuZGlmCisgIAorICAgIC8vRmlsbCBpbiBsZW5ndGgKKyAgICBsaW1Db3B5VTE2KCh0QU5JX1U4KilwTGVuLCBtc2dMZW5ndGgpOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsIGVXTklfU01FX0RJU0FTU09DX1JFUSwgKHRBTklfVTMyICopIHBTbWVEZWF1dGhSZXEpOworI2Vsc2UKKyAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBlV05JX1NNRV9ERUFVVEhfUkVRLCAodEFOSV9VMzIgKikgcFNtZURlYXV0aFJlcSk7CisjZW5kaWYKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwU21lRGVhdXRoUmVxICk7CisKK30gLyoqKiBlbmQgbGltVHJpZ2dlclNUQWRlbGV0aW9uKCkgKioqLworCisKKworLyoqCisgKiBsaW1UZWFyRG93bkxpbmtXaXRoQXAoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGhlYXJ0YmVhdCAoYmVhY29uIHJlY2VwdGlvbikKKyAqIGZhaWxzIG9uIFNUQQorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltVGVhckRvd25MaW5rV2l0aEFwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc2Vzc2lvbklkLCB0U2lyTWFjUmVhc29uQ29kZXMgcmVhc29uQ29kZSkKK3sKKyAgICB0cERwaEhhc2hOb2RlIHBTdGFEcyA9IE5VTEw7CisKKyAgICAvL3RlYXIgZG93biB0aGUgZm9sbG93aW5nIHNlc3Npb25FbnRyeQorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCBzZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyoqCisgICAgICogSGVhcnQgYmVhdCBmYWlsZWQgZm9yIHVwdG8gdGhyZXNob2xkIHZhbHVlCisgICAgICogYW5kIEFQIGRpZCBub3QgcmVzcG9uZCBmb3IgUHJvYmUgcmVxdWVzdC4KKyAgICAgKiBUcmlnZ2VyIGxpbmsgdGVhciBkb3duLgorICAgICAqLworCisgICAgcE1hYy0+cG1tLmluTWlzc2VkQmVhY29uU2NlbmFyaW8gPSBGQUxTRTsKKyAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICBGTCgiTm8gUHJvYmVSc3AgZnJvbSBBUCBhZnRlciBIQiBmYWlsdXJlLiBUZWFyaW5nIGRvd24gbGlua1xuIikpOworCisgICAgLy8gRGVhY3RpdmF0ZSBoZWFydGJlYXQgdGltZXIKKyAgICBsaW1IZWFydEJlYXREZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgcHNlc3Npb25FbnRyeSk7CisKKyAgICAvLyBBbm5vdW5jZSBsb3NzIG9mIGxpbmsgdG8gUm9hbWluZyBhbGdvcml0aG0KKyAgICAvLyBhbmQgY2xlYW51cCBieSBzZW5kaW5nIFNNRV9ESVNBU1NPQ19SRVEgdG8gU01FCisKKyAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgIAorICAgIGlmIChwU3RhRHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHRMaW1NbG1EZWF1dGhJbmQgIG1sbURlYXV0aEluZDsKKworICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb24gPSByZWFzb25Db2RlOworICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIgPSBlTElNX0xJTktfTU9OSVRPUklOR19ERUFVVEg7CisKKyAgICAgICAgLy8vIElzc3VlIERlYXV0aCBJbmRpY2F0aW9uIHRvIFNNRS4KKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJm1sbURlYXV0aEluZC5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgIG1sbURlYXV0aEluZC5yZWFzb25Db2RlICAgID0gKHRBTklfVTgpIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5kaXNhc3NvY1JlYXNvbjsKKyAgICAgICAgbWxtRGVhdXRoSW5kLmRlYXV0aFRyaWdnZXIgPSAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyOworCisgICAgICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsIExJTV9NTE1fREVBVVRIX0lORCwgKHRBTklfVTMyICopICZtbG1EZWF1dGhJbmQpOworCisgICAgICAgIGxpbVNlbmRTbWVEZWF1dGhJbmQocE1hYywgcFN0YURzLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9ICAgIAorfSAvKioqIGxpbVRlYXJEb3duTGlua1dpdGhBcCgpICoqKi8KKworCisKKworLyoqCisgKiBsaW1IYW5kbGVIZWFydEJlYXRGYWlsdXJlKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBoZWFydGJlYXQgKGJlYWNvbiByZWNlcHRpb24pCisgKiBmYWlscyBvbiBTVEEKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltSGFuZGxlSGVhcnRCZWF0RmFpbHVyZSh0cEFuaVNpckdsb2JhbCBwTWFjLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgICB2b3NfbG9nX2JlYWNvbl91cGRhdGVfcGt0X3R5cGUgKmxvZ19wdHIgPSBOVUxMOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKworICAgIC8qIElmIGdMaW1IZWFydEJlYXRUaW1lciBmaXJlcyBiZXR3ZWVuIHRoZSBpbnRlcnZhbCBvZiBzZW5kaW5nIFdEQV9FTlRFUl9CTVBTX1JFUVVFU1QgCisgICAgICogdG8gdGhlIEhBTCBhbmQgcmVjZWl2aW5nIFdEQV9FTlRFUl9CTVBTX1JTUCBmcm9tIHRoZSBIQUwsIHRoZW4gTElNIChQRSkgdHJpZXMgdG8gUHJvY2VzcyB0aGUKKyAgICAgKiBTSVJfTElNX0hFQVJfQkVBVF9USU1FT1VUIG1lc3NhZ2UgYnV0IFRoZSBQRSBzdGF0ZSBpcyBlUE1NX1NUQVRFX0JNUFNfU0xFRVAgc28gUEUgZG9udAorICAgICAqIHdhbnQgdG8gaGFuZGxlIGhlYXJ0YmVhdCB0aW1lb3V0IGluIHRoZSBCTVBTLCBiZWNhdXNlIEZpcm13YXJlIGhhbmRsZXMgaXQgaW4gQk1QUy4KKyAgICAgKiBTbyBqdXN0IHJldHVybiBmcm9tIGhlYXJ0YmVhdGZhaWx1cmUgaGFuZGxlcgorICAgICAqLworCisgICAgaWYoIWxpbUlzU3lzdGVtSW5BY3RpdmVTdGF0ZShwTWFjKSkKKyAgICAgICAgcmV0dXJuOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgV0xBTl9WT1NfRElBR19MT0dfQUxMT0MobG9nX3B0ciwgdm9zX2xvZ19iZWFjb25fdXBkYXRlX3BrdF90eXBlLCBMT0dfV0xBTl9CRUFDT05fVVBEQVRFX0MpOworICAgIGlmKGxvZ19wdHIpCisgICAgICAgIGxvZ19wdHItPmJjbl9yeF9jbnQgPSBwc2Vzc2lvbkVudHJ5LT5MaW1SeGVkQmVhY29uQ250RHVyaW5nSEI7CisgICAgV0xBTl9WT1NfRElBR19MT0dfUkVQT1JUKGxvZ19wdHIpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisgICAgLyogRW5zdXJlIEhCIFN0YXR1cyBmb3IgdGhlIHNlc3Npb24gaGFzIGJlZW4gcmVzZXRlZCAqLworICAgIHBzZXNzaW9uRW50cnktPkxpbUhCRmFpbHVyZVN0YXR1cyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAvKiogUmUgQWN0aXZhdGUgVGltZXIgaWYgdGhlIHN5c3RlbSBpcyBXYWl0aW5nIGZvciBSZUFzc29jIFJlc3BvbnNlKi8KKyAgICBpZigoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfSU5fSUJTU19ST0xFKSB8fCAKKyAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSkgfHwKKyAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpKSAmJiAKKyAgICAgICAoTElNX0lTX0NPTk5FQ1RJT05fQUNUSVZFKHBzZXNzaW9uRW50cnkpIHx8CisgICAgICAgIChsaW1Jc1JlYXNzb2NJblByb2dyZXNzKHBNYWMsIHBzZXNzaW9uRW50cnkpKSkpCisgICAgeworICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5MaW1SeGVkQmVhY29uQ250RHVyaW5nSEIgPCBNQVhfTk9fQkVBQ09OU19QRVJfSEVBUlRfQkVBVF9JTlRFUlZBTCkKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSGVhcnRCZWF0QmVhY29uU3RhdHNbcHNlc3Npb25FbnRyeS0+TGltUnhlZEJlYWNvbkNudER1cmluZ0hCXSsrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhlYXJ0QmVhdEJlYWNvblN0YXRzWzBdKys7CisKKyAgICAgICAgLyoqKioqKiAKKyAgICAgICAgICogTm90ZTogVXNlIHRoaXMgY29kZSBvbmNlIHlvdSBoYXZlIGNvbnZlcnRlZCBhbGwgIAorICAgICAgICAgKiBsaW1SZWFjdGl2YXRlSGVhcnRCZWF0VGltZXIoKSBjYWxscyB0byAKKyAgICAgICAgICogbGltUmVhY3RpdmF0ZVRpbWVyKCkgY2FsbHMuCisgICAgICAgICAqIAorICAgICAgICAgKioqKioqLworICAgICAgICAvL2xpbVJlYWN0aXZhdGVUaW1lcihwTWFjLCBlTElNX0hFQVJUX0JFQVRfVElNRVIsIHBzZXNzaW9uRW50cnkpOworICAgICAgICBsaW1SZWFjdGl2YXRlSGVhcnRCZWF0VGltZXIocE1hYywgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgLy8gUmVzZXQgbnVtYmVyIG9mIGJlYWNvbnMgcmVjZWl2ZWQKKyAgICAgICAgbGltUmVzZXRIQlBrdENvdW50KHBzZXNzaW9uRW50cnkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSl8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSkmJgorICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKQorICAgIHsKKyAgICAgICAgaWYgKCFwTWFjLT5zeXMuZ1N5c0VuYWJsZUxpbmtNb25pdG9yTW9kZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQmVhY29uIGZyYW1lIG5vdCByZWNlaXZlZCB3aXRoaW4gaGVhcnRiZWF0IHRpbWVvdXQuCisgICAgICAgICAqLworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJIZWFydGJlYXQgRmFpbHVyZVxuIikpOykKKyAgICAgICAgcE1hYy0+bGltLmdMaW1IQmZhaWx1cmVDbnRJbkxpbmtFc3RTdGF0ZSsrOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayBpZiBjb25uZWN0ZWQgb24gdGhlIERGUyBjaGFubmVsLCBpZiBub3QgY29ubmVjdGVkIG9uCisgICAgICAgICAqIERGUyBjaGFubmVsIHRoZW4gb25seSBzZW5kIHRoZSBwcm9iZSByZXF1ZXN0IG90aGVyd2lzZSB0ZWFyIGRvd24gdGhlIGxpbmsKKyAgICAgICAgICovCisgICAgICAgIGlmKCFsaW1Jc2Nvbm5lY3RlZE9uREZTQ2hhbm5lbChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorICAgICAgICB7CisgICAgICAgICAgICAvKioqIERldGVjdGVkIGNvbnRpbnVvdXMgQmVhY29uIE1pc3NlcyAqKiovCisgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+TGltSEJGYWlsdXJlU3RhdHVzPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogU2VuZCBQcm9iZSBSZXF1ZXN0IGZyYW1lIHRvIEFQIHRvIHNlZSBpZgorICAgICAgICAgICAgICogaXQgaXMgc3RpbGwgYXJvdW5kLiBXYWl0IHVudGlsIGNlcnRhaW4KKyAgICAgICAgICAgICAqIHRpbWVvdXQgZm9yIFByb2JlIFJlc3BvbnNlIGZyb20gQVAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkhlYXJ0IEJlYXQgbWlzc2VkIGZyb20gQVAuIFNlbmRpbmcgUHJvYmUgUmVxXG4iKSk7KQorICAgICAgICAgICAgLyogZm9yIHNlYXJjaGluZyBBUCwgd2UgZG9uJ3QgaW5jbHVkZSBhbnkgYWRkaXRpb25hbCBJRSAqLworICAgICAgICAgICAgbGltU2VuZFByb2JlUmVxTWdtdEZyYW1lKHBNYWMsICZwc2Vzc2lvbkVudHJ5LT5zc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsLHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUsIDAsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ29ubmVjdGVkIG9uIERGUyBjaGFubmVsIHNvIHNob3VsZCBub3Qgc2VuZCB0aGUgcHJvYmUgcmVxdWVzdAorICAgICAgICAgICAgKiB0ZWFyIGRvd24gdGhlIGxpbmsgZGlyZWN0bHkgKi8KKyAgICAgICAgICAgIGxpbVRlYXJEb3duTGlua1dpdGhBcChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCwgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEhlYXJ0YmVhdCB0aW1lciBtYXkgaGF2ZSB0aW1lZCBvdXQKKyAgICAgICAgICAgICogd2hpbGUgd2UncmUgZG9pbmcgYmFja2dyb3VuZCBzY2FubmluZy9sZWFybmluZworICAgICAgICAgICAgKiBvciBpbiBzdGF0ZXMgb3RoZXIgdGhhbiBsaW5rLWVzdGFibGlzaGVkIHN0YXRlLgorICAgICAgICAgICAgKiBMb2cgZXJyb3IuCisgICAgICAgICAgICAqLworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJyZWNlaXZlZCBoZWFydGJlYXQgdGltZW91dCBpbiBzdGF0ZSAlWFxuIiksCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7KQorICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPRzEsIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKTsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1IQmZhaWx1cmVDbnRJbk90aGVyU3RhdGVzKys7CisgICAgICAgIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9Cit9IC8qKiogbGltSGFuZGxlSGVhcnRCZWF0RmFpbHVyZSgpICoqKi8KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltTG9nRHVtcC5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Mb2dEdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3MTExOQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltTG9nRHVtcC5jCkBAIC0wLDAgKzEsMjM4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorbGltTG9nRHVtcC5jCisKK0ltcGxlbWVudHMgdGhlIGR1bXAgY29tbWFuZHMgc3BlY2lmaWMgdG8gdGhlIGxpbSBtb2R1bGUuIAorCitDb3B5cmlnaHQgKGMpIDIwMDcgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1F1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgImxpbUFwaS5oIgorCisjaWYgZGVmaW5lZChBTklfTE9HRFVNUCkKKworCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZWN1cml0eVV0aWxzLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAibGltU2VyRGVzVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisjaW5jbHVkZSAibG9nRHVtcC5oIgorI2luY2x1ZGUgImxpbVRyYWNlLmgiCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisjaW5jbHVkZSAicnJtQXBpLmgiCisjZW5kaWYKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSA8bGltRlQuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNtZUluc2lkZS5oIgorCitzdGF0aWMgY2hhciAqZ2V0Um9sZSggdExpbVN5c3RlbVJvbGUgcm9sZSApCit7CisgIHN3aXRjaCAocm9sZSkKKyAgeworICAgIGNhc2UgZUxJTV9VTktOT1dOX1JPTEU6CisgICAgICAgIHJldHVybiAiZUxJTV9VTktOT1dOX1JPTEUiOworICAgIGNhc2UgZUxJTV9BUF9ST0xFOgorICAgICAgICByZXR1cm4gImVMSU1fQVBfUk9MRSI7CisgICAgY2FzZSBlTElNX1NUQV9JTl9JQlNTX1JPTEU6CisgICAgICAgIHJldHVybiAiZUxJTV9TVEFfSU5fSUJTU19ST0xFIjsKKyAgICBjYXNlIGVMSU1fU1RBX1JPTEU6CisgICAgICAgIHJldHVybiAiZUxJTV9TVEFfUk9MRSI7CisgICAgY2FzZSBlTElNX0JUX0FNUF9TVEFfUk9MRToKKyAgICAgICAgcmV0dXJuICJlTElNX0JUX0FNUF9TVEFfUk9MRSI7CisgICAgY2FzZSBlTElNX0JUX0FNUF9BUF9ST0xFOgorICAgICAgICByZXR1cm4gImVMSU1fQlRfQU1QX0FQX1JPTEUiOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgIH0KK30KKworI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApIHx8IGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUF9TREspKQorc3RhdGljIGNoYXIgKgorZHVtcE1hY0FkZHIodHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCwgdEFOSV9VOCAqYWRkcikKK3sKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICIlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCIsCisgICAgICAgICAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworICAgIHJldHVybiBwOworfQorI2VuZGlmCisKKworY2hhciAqZHVtcExpbSggdHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCApCit7CisgICNpZmRlZiBGSVhNRV9HRU42CisgIC8vaXRlcmF0ZSB0aHJvdWdoIHRoZSBzZXNzaW9uVGFibGUgYW5kIGR1bXAgc3RhIGVudHJpZXMgZm9yIGVhY2ggc2Vzc2lvbi4KKyAgLy9LZWVwIHRoaXMgY29kZSB1bmRlciAnV0xBTl9ERUJVRycgY29tcGlsZSBmbGFnLgorCisgIHRBTklfVTE2IGksIGo7CisKKworICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcbiAtLS0tLSBMSU0gRGVidWcgSW5mb3JtYXRpb24gLS0tLS0gXG4iKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiTElNIFJvbGUgID0gKCVkKSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSwgZ2V0Um9sZShwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUpKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiU01FIFN0YXRlID0gKCVkKSAlcyIsCisgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlLCBsaW1TbWVTdGF0ZVN0cihwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIk1MTSBTdGF0ZSA9ICglZCkgJXMiLAorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSwgbGltTWxtU3RhdGVTdHIocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworCisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkNIQU5ORUwgQk9ORElORyBNb2RlICglMWQpIGFuZCBTdGF0ZSAoWHxYfFh8QVV8Q1N8VS9EfE98QSkgKDB4JTF4KVxuIiwKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nQ2JNb2RlLCBwTWFjLT5saW0uZ0NiU3RhdGUpOworICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICI4MDIuMTFuIEhUIENhcGFiaWxpdHk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5odENhcGFiaWxpdHkgPT0gMSkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiZ0xpbVByb2Nlc3NEZWZkTXNnczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1Qcm9jZXNzRGVmZE1zZ3MgPT0gMSkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKworICBpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpCisgIHsKKyAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkFJRCA9ICVYXHRcdFxuIiwgcE1hYy0+bGltLmdMaW1BSUQpOworICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiU1NJRCBtaXNtYXRjaCBpbiBCZWFjb24gQ291bnQgICAgICAgICAgICAgID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1CY25TU0lETWlzbWF0Y2hDbnQpOworICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiTnVtYmVyIG9mIGxpbmsgZXN0YWJsaXNobWVudHMgICAgICAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtTGlua0VzdHMpOworICB9CisgIGVsc2UgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgIHsKKyAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIk51bSBvZiBTVEFzIGFzc29jaWF0ZWQgICAgICAgICAgICAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtT2ZDdXJyZW50U1RBcyk7CisKKyAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIk51bSBvZiBQcmUtYXV0aCBjb250ZXh0cyAgICAgICAgICAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtUHJlQXV0aENvbnRleHRzKTsKKworICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiTnVtIG9mIEFzc29jUmVxIGRyb3BwZWQgaW4gaW52YWxpZCBTdGF0ZSAgID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1OdW1Bc3NvY1JlcURyb3BJbnZsZFN0YXRlKTsKKworICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiTnVtIG9mIFJlYXNzb2NSZXEgZHJvcHBlZCBpbiBpbnZhbGlkIFN0YXRlID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1OdW1SZWFzc29jUmVxRHJvcEludmxkU3RhdGUpOworCisgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJOdW0gb2YgSGFzaCBNaXNzIEV2ZW50IGlnbm9yZWQgICAgICAgICAgICAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU51bUhhc2hNaXNzSWdub3JlZCk7CisKKworCisKKyAgfQorCisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIk51bSBvZiBSeENsZWFudXAgQ291bnQgICAgICAgICAgICAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1OdW1SeENsZWFudXApOworICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJVbmV4cGVjdGVkIEJlYWNvbiBDb3VudCAgICAgICAgICAgICAgICAgICAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltVW5leHBCY25DbnQpOworICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJOdW1iZXIgb2YgUmUvQXNzb2MgcmVqZWN0cyBvZiAxMWIgU1RBcyAgICAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltMTFiU3RhQXNzb2NSZWplY3RDb3VudCk7CisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIk5vLiBvZiBIZWFydEJlYXQgRmFpbHVyZXMgaW4gTGlua0VzdCBTdGF0ZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1IQmZhaWx1cmVDbnRJbkxpbmtFc3RTdGF0ZSk7CisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIk5vLiBvZiBQcm9iZSBGYWlsdXJlcyBhZnRlciBIQiBmYWlsZWQgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Qcm9iZUZhaWx1cmVBZnRlckhCZmFpbGVkQ250KTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiTm8uIG9mIEhlYXJ0QmVhdCBGYWlsdXJlcyBpbiBPdGhlciBTdGF0ZXMgID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhCZmFpbHVyZUNudEluT3RoZXJTdGF0ZXMpOworICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJOby4gb2YgQmVhY29ucyBSeGVkIER1cmluZyBIQiBJbnRlcnZhbCAgICAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltUnhlZEJlYWNvbkNudER1cmluZ0hCKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiU2VsZiBPcGVyYXRpbmcgTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJXNcbiIsIGxpbURvdDExTW9kZVN0cihwTWFjLCAodEFOSV9VOClwTWFjLT5saW0uZ0xpbURvdDExTW9kZSkpOworCisKKworCisKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXG4iKTsKKworICBpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkKKyAgICAgIGkgPSAyOworICBlbHNlCisgICAgICBpID0gMTsKKworCisgIGZvciAoOyBpPCBwTWFjLT5saW0ubWF4U3RhdGlvbjsgaSsrKQorICB7CisgICAgICB0cERwaEhhc2hOb2RlIHBTdGEgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgKHVuc2lnbmVkIHNob3J0KWkpOworICAgICAgaWYgKHBTdGEgJiYgcFN0YS0+YWRkZWQpCisgICAgICB7CisgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXG5TVEEgQUlEOiAlZCAgU1RBIElEOiAlZCBWYWxpZDogJWQgQXV0aFR5cGU6ICVkIE1MTSBTdGF0ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBwU3RhLT5zdGFJbmRleCwgcFN0YS0+dmFsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGEtPm1sbVN0YUNvbnRleHQuYXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbU1sbVN0YXRlU3RyKHBTdGEtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpKTsKKworICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlx0QUlEOiUtMmQgIE9wUmF0ZU1vZGU6JXMgIFNoUHJtYmw6JWQgIEhUOiVkICBHRjolZCAgVHhDaFdpZHRoOiVkICBNaW1vUFM6JWQgIExzaWdQcm90OiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGEtPmFzc29jSWQsIGxpbVN0YU9wUmF0ZU1vZGVTdHIocFN0YS0+c3VwcG9ydGVkUmF0ZXMub3BSYXRlTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YS0+c2hvcnRQcmVhbWJsZUVuYWJsZWQsIHBTdGEtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGEtPmh0R3JlZW5maWVsZCwgcFN0YS0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YS0+aHRNSU1PUFNTdGF0ZSwgcFN0YS0+aHRMc2lnVFhPUFByb3RlY3Rpb24pOworCisgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXHRBTVBEVSBbTWF4U3ooRmFjdG9yKTolZCwgRGVuczogJWRdICBBTVNEVS1NYXhMZW46ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhLT5odE1heFJ4QU1wZHVGYWN0b3IsIHBTdGEtPmh0QU1wZHVEZW5zaXR5LHBTdGEtPmh0TWF4QW1zZHVMZW5ndGgpOworICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlx0RFNTQ0NrTW9kZTQwTWh6OiAlZCwgU0dJMjA6ICVkLCBTR0k0MDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGEtPmh0RHNzc0Nja1JhdGU0ME1IelN1cHBvcnQsIHBTdGEtPmh0U2hvcnRHSTIwTWh6LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhLT5odFNob3J0R0k0ME1oeik7CisKKyAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcdDExYiBSYXRlczogIik7CisgICAgICAgICAgZm9yKGo9MDsgajxTSVJfTlVNXzExQl9SQVRFUzsgaisrKQorICAgICAgICAgICAgICBpZihwU3RhLT5zdXBwb3J0ZWRSYXRlcy5sbGJSYXRlc1tqXSA+IDApCisgICAgICAgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICIlZCAiLCBwU3RhLT5zdXBwb3J0ZWRSYXRlcy5sbGJSYXRlc1tqXSk7CisKKyAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcblx0MTFhIFJhdGVzOiAiKTsKKyAgICAgICAgICBmb3Ioaj0wOyBqPFNJUl9OVU1fMTFBX1JBVEVTOyBqKyspCisgICAgICAgICAgICAgIGlmKHBTdGEtPnN1cHBvcnRlZFJhdGVzLmxsYVJhdGVzW2pdID4gMCkKKyAgICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiVkICIsIHBTdGEtPnN1cHBvcnRlZFJhdGVzLmxsYVJhdGVzW2pdKTsKKworICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlxuXHRQb2xhcmlzIFJhdGVzOiAiKTsKKyAgICAgICAgICBmb3Ioaj0wOyBqPFNJUl9OVU1fUE9MQVJJU19SQVRFUzsgaisrKQorICAgICAgICAgICAgICBpZihwU3RhLT5zdXBwb3J0ZWRSYXRlcy5hbmlMZWdhY3lSYXRlc1tqXSA+IDApCisgICAgICAgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICIlZCAiLCBwU3RhLT5zdXBwb3J0ZWRSYXRlcy5hbmlMZWdhY3lSYXRlc1tqXSk7CisKKyAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcblx0VGl0YW4gYW5kIFRhdXJ1cyBQcm9wcmlldGFyeSBSYXRlIEJpdG1hcDogJTA4eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YS0+c3VwcG9ydGVkUmF0ZXMuYW5pRW5oYW5jZWRSYXRlQml0bWFwKTsKKyAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcdE1DUyBSYXRlIFNldCBCaXRtYXA6ICIpOworICAgICAgICAgIGZvcihqPTA7IGo8U0lSX01BQ19NQVhfU1VQUE9SVEVEX01DU19TRVQ7IGorKykKKyAgICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiJXggIiwgcFN0YS0+c3VwcG9ydGVkUmF0ZXMuc3VwcG9ydGVkTUNTU2V0W2pdKTsKKworICAgICAgfQorICB9CisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlxuUHJvYmUgcmVzcG9uc2UgZGlzYWJsZSAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Qcm9iZVJlc3BEaXNhYmxlRmxhZyk7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBXTEFOX1NUQSkKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiU2NhbiBtb2RlIGVuYWJsZSAgICAgICAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcE1hYy0+c3lzLmdTeXNFbmFibGVTY2FuTW9kZSk7CisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkJhY2tncm91bmRTY2FuRGlzYWJsZSAgICAgICAgICAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5EaXNhYmxlKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiRm9yY2VCYWNrZ3JvdW5kU2NhbkRpc2FibGUgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Gb3JjZUJhY2tncm91bmRTY2FuRGlzYWJsZSk7CisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkxpbmtNb25pdG9yIG1vZGUgZW5hYmxlICAgICAgICAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBNYWMtPnN5cy5nU3lzRW5hYmxlTGlua01vbml0b3JNb2RlKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiUW9zIENhcGFibGUgICAgICAgICAgICAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgU0lSX01BQ19HRVRfUU9TKHBNYWMtPmxpbS5nTGltQ3VycmVudEJzc0NhcHMpKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiV21lIENhcGFibGUgICAgICAgICAgICAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgTElNX0JTU19DQVBTX0dFVChXTUUsIHBNYWMtPmxpbS5nTGltQ3VycmVudEJzc1Fvc0NhcHMpKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiV3NtIENhcGFibGUgICAgICAgICAgICAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgTElNX0JTU19DQVBTX0dFVChXU00sIHBNYWMtPmxpbS5nTGltQ3VycmVudEJzc1Fvc0NhcHMpKTsKKyAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpCisgIHsKKyAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIk51bWJlciBvZiBwZWVycyBpbiBJQlNTICAgICAgICAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU51bUlic3NQZWVycyk7CisgICAgICBpZiAocE1hYy0+bGltLmdMaW1OdW1JYnNzUGVlcnMpCisgICAgICB7CisgICAgICAgICAgdExpbUlic3NQZWVyTm9kZSAqcFRlbXA7CisgICAgICAgICAgcFRlbXAgPSBwTWFjLT5saW0uZ0xpbUlic3NQZWVyTGlzdDsKKyAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJNQUMtQWRkciAgICAgICAgICAgQW5pIEVkY2EgV21lSW5mbyBIVCAgQ2FwcyAgI1MsI0UoUmF0ZXMpXG4iKTsKKyAgICAgICAgICB3aGlsZSAocFRlbXAgIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcC0+cGVlck1hY0FkZHJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcC0+cGVlck1hY0FkZHJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcC0+cGVlck1hY0FkZHJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcC0+cGVlck1hY0FkZHJbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcC0+cGVlck1hY0FkZHJbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcC0+cGVlck1hY0FkZHJbNV0pOworICAgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICIgJWQgICAlZCwlZCAgICAgICAgJWQgICVkICAlMDRYICAlZCwlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLT5hbmlJbmRpY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcC0+ZWRjYVByZXNlbnQsIHBUZW1wLT53bWVFZGNhUHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLT53bWVJbmZvUHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLT5odENhcGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcC0+Y2FwYWJpbGl0eUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcC0+c3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcC0+ZXh0ZW5kZWRSYXRlcy5udW1SYXRlcyk7CisgICAgICAgICAgICAgIHBUZW1wID0gcFRlbXAtPm5leHQ7CisgICAgICAgICAgfQorICAgICAgfQorICB9CisjZWxzZQorICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJNZWFzdXJlbWVudHMgZW5hYmxlZCAgICAgICAgICAgID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBwTWFjLT5zeXMuZ1N5c0VuYWJsZUxlYXJuTW9kZSk7CisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlNjYW4gTW9kZSBmb3IgTGVhcm4gTW9kZSBlbmFibGUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltVXNlU2Nhbk1vZGVGb3JMZWFybk1vZGUpOworI2VuZGlmCisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlN5c3RlbSBTY2FuL0xlYXJuIE1vZGUgYml0ICAgICAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiU2NhbiBvdmVycmlkZSAgICAgICAgICAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TY2FuT3ZlcnJpZGUpOworICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJDQiBTdGF0ZSBwcm90ZWN0aW9uICAgICAgICAgICAgID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNCU3RhdGVQcm90ZWN0aW9uKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiQ291bnQgb2YgVGl0YW4gU1RBJ3MgICAgICAgICAgICA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1UaXRhblN0YUNvdW50KTsKKworICAvL2N1cnJlbnQgQlNTIGNhcGFiaWxpdHkKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiKioqKioqKioqKkN1cnJlbnQgQlNTIENhcGFiaWxpdHkqKioqKioqKlxuIik7CisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkVzcyA9ICVkLCAiLCBTSVJfTUFDX0dFVF9FU1MocE1hYy0+bGltLmdMaW1DdXJyZW50QnNzQ2FwcykpOworICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJQcml2YWN5ID0gJWQsICIsIFNJUl9NQUNfR0VUX1BSSVZBQ1kocE1hYy0+bGltLmdMaW1DdXJyZW50QnNzQ2FwcykpOworICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJTaG9ydCBQcmVhbWJsZSA9ICVkLCAiLCBTSVJfTUFDX0dFVF9TSE9SVF9QUkVBTUJMRShwTWFjLT5saW0uZ0xpbUN1cnJlbnRCc3NDYXBzKSk7CisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlNob3J0IFNsb3QgPSAlZCwgIiwgU0lSX01BQ19HRVRfU0hPUlRfU0xPVF9USU1FKHBNYWMtPmxpbS5nTGltQ3VycmVudEJzc0NhcHMpKTsKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiUW9zID0gJWRcbiIsIFNJUl9NQUNfR0VUX1FPUyhwTWFjLT5saW0uZ0xpbUN1cnJlbnRCc3NDYXBzKSk7CisKKyAgLy9Qcm90ZWN0aW9uIHJlbGF0ZWQgaW5mb3JtYXRpb24KKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiKioqKipQcm90ZWN0aW9uIHJlbGF0ZWQgaW5mb3JtYXRpb24qKioqKipcbiIpOworICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJQcm90ZWN0aW9uICVzXG4iLCBwTWFjLT5saW0uZ0xpbVByb3RlY3Rpb25Db250cm9sID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiT0JTUyBNT0RFID0gJWRcbiIsIHBNYWMtPmxpbS5nSFRPYnNzTW9kZSk7CisjaWYgKGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgfHwgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQX1NESykpCisKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcbk51bWJlciBvZiBhY3RpdmUgT0xCQyBkZXRlY3RlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU9sYmNQYXJhbXMubnVtU3RhKTsKKyAgICBpZiAocE1hYy0+bGltLmdMaW1PbGJjUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJQcm90ZWN0aW9uIGR1ZSB0byBPTEJDIGlzIE9OXG4iKTsKKyAgICBlbHNlCisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlByb3RlY3Rpb24gZHVlIHRvIE9MQkMgaXMgT0ZGXG4iKTsKKworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkNvbnRlbnQgb2YgT0xCQyBjYWNoZTogXG4iKTsKKyAgICBmb3IgKGk9MDsgaTxMSU1fUFJPVF9TVEFfT1ZFUkxBUF9DQUNIRV9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAocE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbaV0uYWN0aXZlKQorICAgICAgICB7CisgICAgICAgICAgICBwID0gZHVtcE1hY0FkZHIocE1hYywgcCwgcE1hYy0+bGltLnByb3RTdGFPdmVybGFwQ2FjaGVbaV0uYWRkcik7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiQ29udGVudCBvZiBQcm90ZWN0aW9uIGNhY2hlOiBcbiIpOworICAgIGZvciAoaT0wOyBpPExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAocE1hYy0+bGltLnByb3RTdGFDYWNoZVtpXS5hY3RpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHAgPSBkdW1wTWFjQWRkcihwTWFjLCBwLCBwTWFjLT5saW0ucHJvdFN0YUNhY2hlW2ldLmFkZHIpOworICAgICAgICAgICAgaWYocE1hYy0+bGltLnByb3RTdGFDYWNoZVtpXS5wcm90U3RhQ2FjaGVUeXBlID09IGVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9IVDIwKQorICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiBUeXBlOiBIVDIwXG4iKTsKKyAgICAgICAgICAgIGVsc2UgaWYocE1hYy0+bGltLnByb3RTdGFDYWNoZVtpXS5wcm90U3RhQ2FjaGVUeXBlID09IGVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9sbEIpCisgICAgICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiIFR5cGU6IDExQlxuIik7CisgICAgICAgICAgICAgZWxzZSBpZihwTWFjLT5saW0ucHJvdFN0YUNhY2hlW2ldLnByb3RTdGFDYWNoZVR5cGUgPT0gZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX2xsRykKKyAgICAgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICIgVHlwZTogMTFHXG4iKTsKKworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJDb3VudCBvZiBkaWZmZXJlbnQgdHlwZSBzdGEgYXNzb2NpYXRlZFxuIik7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiMTFCICAgICAgICAgPSAlZCwgUHJvdGVjdGlvbjogJWRcbiIsIHBNYWMtPmxpbS5nTGltMTFiUGFyYW1zLm51bVN0YSwgcE1hYy0+bGltLmdMaW0xMWJQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIjExRyAgICAgICAgID0gJWQsIFByb3RlY3Rpb246ICVkXG4iLCBwTWFjLT5saW0uZ0xpbTExZ1BhcmFtcy5udW1TdGEsIHBNYWMtPmxpbS5nTGltMTFnUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJub25HRiAgICAgID0gJWQsIFByb3RlY3Rpb246ICVkXG4iLCBwTWFjLT5saW0uZ0xpbU5vbkdmUGFyYW1zLm51bVN0YSwgcE1hYy0+bGltLmdMaW1Ob25HZlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiIUxzaWdUeG9wID0gJWQsIFByb3RlY3Rpb246ICVkXG4iLCBwTWFjLT5saW0uZ0xpbUxzaWdUeG9wUGFyYW1zLm51bVN0YSwgcE1hYy0+bGltLmdMaW1Mc2lnVHhvcFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiaHQyMCAgICAgICAgID0gJWQgUHJvdGVjdGlvbjogICVkXG4iLCBwTWFjLT5saW0uZ0xpbUh0MjBQYXJhbXMubnVtU3RhLCBwTWFjLT5saW0uZ0xpbUh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpOworCisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXG5OdW1iZXIgb2YgU1RBIGRvIG5vdCBzdXBwb3J0IHNob3J0IHByZWFtYmxlID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU5vU2hvcnRQYXJhbXMubnVtTm9uU2hvcnRQcmVhbWJsZVN0YSk7CisgICAgZm9yIChpPTA7IGk8TElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbU5vU2hvcnRQYXJhbXMuc3RhTm9TaG9ydENhY2hlW2ldLmFjdGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcCA9IGR1bXBNYWNBZGRyKHBNYWMsIHAsIHBNYWMtPmxpbS5nTGltTm9TaG9ydFBhcmFtcy5zdGFOb1Nob3J0Q2FjaGVbaV0uYWRkcik7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXG5OdW1iZXIgb2YgU1RBIGRvIG5vdCBzdXBwb3J0IHNob3J0IHNsb3QgdGltZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLm51bU5vblNob3J0U2xvdFN0YSk7CisgICAgZm9yIChpPTA7IGk8TElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLnN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWN0aXZlKQorICAgICAgICB7CisgICAgICAgICAgICBwID0gZHVtcE1hY0FkZHIocE1hYywgcCwgcE1hYy0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5zdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFkZHIpOworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworCisjZW5kaWYKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiSFQgb3BlcmF0aW5nIE1vZGUgPSAlZCwgbGxiQ29leGlzdCA9ICVkLCBsbGdDb2V4aXN0ID0gJWQsIGh0MjBDb2V4aXN0ID0gJWQsIG5vbkdmUHJlc2VudCA9ICVkLCBSaWZzTW9kZSA9ICVkLCBsc2lnVHhvcCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSwgcE1hYy0+bGltLmxsYkNvZXhpc3QsIHBNYWMtPmxpbS5sbGdDb2V4aXN0LAorICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5odDIwTWh6Q29leGlzdCwgcE1hYy0+bGltLmdIVE5vbkdGRGV2aWNlc1ByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdIVFJpZnNNb2RlLCBwTWFjLT5saW0uZ0hUTFNpZ1RYT1BGdWxsU3VwcG9ydCk7CisKKyAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICIybmQgQ2hhbm5lbCBvZmZzZXQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKKyNlbmRpZgorICAgIHJldHVybiBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRlVOQ1RJT046IHRyaWdnZXJCZWFjb25HZW4oKQorICoKKyAqIFRoaXMgbG9nZHVtcCBzZW5kcyBTSVJfU0NIX0JFQUNPTl9HRU5fSU5EIHRvIFNDSC4KKyAqIFNDSCB0aGVuIHByb2NlZWRzIHRvIGdlbmVyYXRlIGEgYmVhY29uIHRlbXBsYXRlCisgKiBhbmQgY29weSBpdCB0byB0aGUgSG9zdC9Tb2Z0TUFDIHNoYXJlZCBtZW1vcnkKKyAqCisgKiBUT0RPIC0gVGhpcyByb3V0aW5lIGNhbiBzYWZlbHkgYmUgZGVsZXRlZCBvbmNlCisgKiBiZWFjb24gZ2VuZXJhdGlvbiBpcyB3b3JraW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2hhciAqdHJpZ2dlckJlYWNvbkdlbiggdHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCApCit7CisgICAgdFNpck1zZ1EgbWVzZyA9IHsgKHRBTklfVTE2KSBTSVJfTElNX0JFQUNPTl9HRU5fSU5ELCAodEFOSV9VMTYpIDAsICh0QU5JX1UzMikgMCB9OworICAgIAorICAgIHBNYWMtPmxpbS5nTGltU21lU3RhdGUgPSBlTElNX1NNRV9OT1JNQUxfU1RBVEU7CisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisgICAgcE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID0gZUxJTV9BUF9ST0xFOworICAgIAorICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsCisgICAgICAgICAgIlBvc3RlZCBTSVJfTElNX0JFQUNPTl9HRU5fSU5EIHdpdGggcmVzdWx0ID0gJXNcbiIsCisgICAgICAgICAgKGVTSVJfU1VDQ0VTUyA9PSBsaW1Qb3N0TXNnQXBpKCBwTWFjLCAmbWVzZyApKT8KKyAgICAgICAgICAgICJTdWNjZXNzIjogIkZhaWx1cmUiICk7CisgICAgCisgICAgcmV0dXJuIHA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZVTkNUSU9OOiB0ZXN0TGltU2VuZFByb2JlUnNwKCkKKyAqCisgKiBUaGlzIGxvZ2R1bXAgc2VuZHMgU0lSX01BQ19NR01UX1BST0JFX1JTUAorICoKKyAqIFRPRE8gLSBUaGlzIHJvdXRpbmUgY2FuIHNhZmVseSBiZSBkZWxldGVkIG9uY2UKKyAqIHRoZSBNR01UIGZyYW1lIHRyYW5zbWlzc2lvbiBpcyB3b3JraW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2hhciAqdGVzdExpbVNlbmRQcm9iZVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCApCit7CisgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIgPSB7IDAsIDEsIDIsIDMsIDQsIDUgfTsKKyAgICB0QW5pU1NJRCBzc0lkOworICAgIHRBTklfVTMyIGxlbiA9IFNJUl9NQUNfTUFYX1NTSURfTEVOR1RIOworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSAmcE1hYy0+bGltLmdwU2Vzc2lvblswXTsgIC8vVEJELVJBSkVTSCBIT1cgVE8gR0VUIHNlc3Npb25FbnRyeT8/Pz8/CisKKworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gd2xhbl9jZmdHZXRTdHIoIHBNYWMsCisgICAgICAgIFdOSV9DRkdfU1NJRCwKKyAgICAgICAgKHRBTklfVTggKikgJnNzSWQuc3NJZCwKKyAgICAgICAgKHRBTklfVTMyICopICZsZW4gKSkKKyAgICB7CisgICAgICAgIC8vIENvdWxkIG5vdCBnZXQgU1NJRCBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiVW5hYmxlIHRvIHJldHJpZXZlIFNTSURcbiIgKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3NJZC5sZW5ndGggPSAodEFOSV9VOCkgbGVuOworCisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIkNhbGxpbmcgbGltU2VuZFByb2JlUnNwTWdtdEZyYW1lLi4uXG4iICk7CisgICAgbGltU2VuZFByb2JlUnNwTWdtdEZyYW1lKCBwTWFjLCBwZWVyTWFjQWRkciwgJnNzSWQsIC0xLCAxLCBwc2Vzc2lvbkVudHJ5ICwgMCk7CisKKyAgICByZXR1cm4gcDsKK30KKworCitzdGF0aWMgY2hhciAqc2VuZFNtZVNjYW5SZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCkKK3sKKyAgICB0U2lyTXNnUSAgICAgICAgIG1zZzsKKyAgICB0U2lyU21lU2NhblJlcSAgIHNjYW5SZXEsICpwU2NhblJlcTsKKworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgInNlbmRTbWVTY2FuUmVxOiBQcmVwYXJpbmcgZVdOSV9TTUVfU0NBTl9SRVEgbWVzc2FnZVxuIik7CisKKyAgICBwU2NhblJlcSA9ICh0U2lyU21lU2NhblJlcSAqKSAmc2NhblJlcTsKKworICAgIGlmIChwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNjYW5SZXEsIHNpemVvZih0U2lyU21lU2NhblJlcSkpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsInNlbmRTbWVTY2FuUmVxOiBwYWxBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZCBcbiIpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBwU2NhblJlcS0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9TQ0FOX1JFUTsKKyAgICBwU2NhblJlcS0+bWluQ2hhbm5lbFRpbWUgPSAzMDsKKyAgICBwU2NhblJlcS0+bWF4Q2hhbm5lbFRpbWUgPSAxMzA7CisgICAgcFNjYW5SZXEtPmJzc1R5cGUgPSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREU7CisgICAgbGltR2V0TXlNYWNBZGRyKHBNYWMsIHBTY2FuUmVxLT5ic3NJZCk7CisgICAgcFNjYW5SZXEtPm51bVNzaWQgPSAxOworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikgJnBTY2FuUmVxLT5zc0lkWzBdLnNzSWQsICh2b2lkICopIkl2YW4iLCA0KTsKKyAgICBwU2NhblJlcS0+c3NJZFswXS5sZW5ndGggPSA0OworICAgIHBTY2FuUmVxLT5zY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgcFNjYW5SZXEtPnJldHVybkFmdGVyRmlyc3RNYXRjaCA9IDA7CisgICAgcFNjYW5SZXEtPnJldHVyblVuaXF1ZVJlc3VsdHMgPSAwOworICAgIHBTY2FuUmVxLT5yZXR1cm5GcmVzaFJlc3VsdHMgPSBTSVJfQkdfU0NBTl9QVVJHRV9SRVNVVExTfFNJUl9CR19TQ0FOX1JFVFVSTl9GUkVTSF9SRVNVTFRTOworICAgIHBTY2FuUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9IDE7CisgICAgcFNjYW5SZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXJbMF0gPSA2OworICAgIHBTY2FuUmVxLT51SUVGaWVsZExlbiA9IDA7CisgICAgcFNjYW5SZXEtPnVJRUZpZWxkT2Zmc2V0ID0gc2l6ZW9mKHRTaXJTbWVTY2FuUmVxKTsKKyAgICBwU2NhblJlcS0+c2Vzc2lvbklkID0gMDsKKworICAgIG1zZy50eXBlID0gZVdOSV9TTUVfU0NBTl9SRVE7CisgICAgbXNnLmJvZHlwdHIgPSBwU2NhblJlcTsKKyAgICBtc2cuYm9keXZhbCA9IDA7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAic2VuZFNtZVNjYW5SZXE6IGxpbVBvc3RNc2dBcGkoZVdOSV9TTUVfU0NBTl9SRVEpIFxuIik7CisgICAgbGltUG9zdE1zZ0FwaShwTWFjLCAmbXNnKTsKKworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqc2VuZFNtZURpc0Fzc29jUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGNoYXIgKnAsdEFOSV9VMzIgYXJnMSAsdEFOSV9VMzIgYXJnMikKK3sKKworICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzOworICAgIHRTaXJNc2dRICBtc2c7CisgICAgdFNpclNtZURpc2Fzc29jUmVxICpwRGlzQXNzb2NSZXE7CisgICAgdHBQRVNlc3Npb24gIHBzZXNzaW9uRW50cnk7CisKKyAgICAvL2FyZzEgLSBhc3NvY0lkCisgICAgLy9hcmcyIC0gc2Vzc2lvbklkCisgICAgaWYoIGFyZzEgPCAxICkKKyAgICB7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwiSW52YWxpZCBzZXNzaW9uIE9SIEFzc29jIElEICBcbiIpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCh0QU5JX1U4KWFyZzIpICk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uIElkICBcbiIpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgKHRBTklfVTE2KWFyZzEsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgIGlmKE5VTEwgPT0gcFN0YURzKQorICAgIHsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkNvdWxkIG5vdCBmaW5kIHN0YXRpb24gd2l0aCBhc3NvY0lkID0gJWRcbiIsIGFyZzEpOworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgaWYgKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRGlzQXNzb2NSZXEsIHNpemVvZih0U2lyU21lRGlzYXNzb2NSZXEpKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCJzZW5kU21lRGlzQXNzb2NSZXE6IHBhbEFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkIFxuIik7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIGlmKCAoIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpIHx8CisgICAgICAgICAgKHBzZXNzaW9uRW50cnkgLT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSApICYmCisgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5zdGF0eXBlRm9yQnNzID09IFNUQV9FTlRSWV9QRUVSKSkKKyAgICB7CisgICAgICAgIHNpckNvcHlNYWNBZGRyKHBEaXNBc3NvY1JlcS0+YnNzSWQscHNlc3Npb25FbnRyeS0+YnNzSWQpOworICAgICAgICBzaXJDb3B5TWFjQWRkcihwRGlzQXNzb2NSZXEtPnBlZXJNYWNBZGRyLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKyAgICB9CisgICAgaWYoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorI2VuZGlmCisgICAgKQorICAgIHsKKyAgICAgICAgc2lyQ29weU1hY0FkZHIocERpc0Fzc29jUmVxLT5wZWVyTWFjQWRkcixwU3RhRHMtPnN0YUFkZHIpOworICAgICAgICBzaXJDb3B5TWFjQWRkcihwRGlzQXNzb2NSZXEtPmJzc0lkLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKyAgICB9CisKKyAgICBwRGlzQXNzb2NSZXEtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfRElTQVNTT0NfUkVROworCisgICAgcERpc0Fzc29jUmVxLT5sZW5ndGggPSBzaXplb2YodFNpclNtZURpc2Fzc29jUmVxKTsKKworICAgIHBEaXNBc3NvY1JlcS0+cmVhc29uQ29kZSA9ICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT047CisKKyAgICBwRGlzQXNzb2NSZXEtPnNlc3Npb25JZCA9IDA7CisKKyAgICBwRGlzQXNzb2NSZXEtPnRyYW5zYWN0aW9uSWQgPSAwOyAKKworICAgIG1zZy50eXBlID0gZVdOSV9TTUVfRElTQVNTT0NfUkVROworICAgIG1zZy5ib2R5cHRyID0gcERpc0Fzc29jUmVxOworICAgIG1zZy5ib2R5dmFsID0gMDsKKworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgInNlbmRTbWVEaXNBc3NvY1JlcTogbGltUG9zdE1zZ0FwaShlV05JX1NNRV9ESVNBU1NPQ19SRVEpIFxuIik7CisgICAgbGltUG9zdE1zZ0FwaShwTWFjLCAmbXNnKTsKKworICAgIHJldHVybiBwOworfQorCisKK3N0YXRpYyBjaGFyICpzZW5kU21lU3RhcnRCc3NSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCx0QU5JX1UzMiBhcmcxKQoreworICAgIHRTaXJNc2dRICBtc2c7CisgICAgdFNpclNtZVN0YXJ0QnNzUmVxICAqcFN0YXJ0QnNzUmVxOworICAgIHVuc2lnbmVkIGNoYXIgKnBCdWY7CisgICAgdEFuaUNCU2Vjb25kYXJ5TW9kZSAgY2JNb2RlOworICAgIHRTaXJOd1R5cGUgIG53VHlwZTsKKworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgInNlbmRTbWVTdGFydEJzc1JlcTogUHJlcGFyaW5nIGVXTklfU01FX1NUQVJUX0JTU19SRVEgbWVzc2FnZVxuIik7CisgICAKKyAgICBpZihhcmcxID4gMikKKyAgICB7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwiSW52YWxpZCBBcmd1bWVudDEgXG4iKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgaWYgKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU3RhcnRCc3NSZXEsIHNpemVvZih0U2lyU21lU3RhcnRCc3NSZXEpKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCJzZW5kU21lU3RhcnRCc3NSZXE6IHBhbEFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkIFxuIik7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIHBTdGFydEJzc1JlcS0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9TVEFSVF9CU1NfUkVROworICAgIHBTdGFydEJzc1JlcS0+bGVuZ3RoID0gMjk7ICAgIC8vIDB4MWQKKyAgICAKKyAgICBpZihhcmcxID09IDApIC8vQlRBTVAgU1RBVElPTiAKKyAgICB7CisgICAgICAgIHBTdGFydEJzc1JlcS0+YnNzVHlwZSA9IGVTSVJfQlRBTVBfU1RBX01PREU7CisKKyAgICAgICAgcFN0YXJ0QnNzUmVxLT5zc0lkLmxlbmd0aCA9IDU7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikgJnBTdGFydEJzc1JlcS0+c3NJZC5zc0lkLCAodm9pZCAqKSJCVFNUQSIsIDUpOyAgIAorICAgIH0KKyAgICBlbHNlIGlmKGFyZzEgPT0gMSkgLy9CVEFNUCBBUCAKKyAgICB7CisgICAgICAgIHBTdGFydEJzc1JlcS0+YnNzVHlwZSA9IGVTSVJfQlRBTVBfQVBfTU9ERTsKKyAgICAgICAgcFN0YXJ0QnNzUmVxLT5zc0lkLmxlbmd0aCA9IDQ7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikgJnBTdGFydEJzc1JlcS0+c3NJZC5zc0lkLCAodm9pZCAqKSJCVEFQIiwgNCk7IAorICAgIH0KKyAgICBlbHNlICAvL0lCU1MKKyAgICB7CisgICAgICAgIHBTdGFydEJzc1JlcS0+YnNzVHlwZSA9IGVTSVJfSUJTU19NT0RFOworICAgICAgICBwU3RhcnRCc3NSZXEtPnNzSWQubGVuZ3RoID0gNDsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSAmcFN0YXJ0QnNzUmVxLT5zc0lkLnNzSWQsICh2b2lkICopIklic3MiLCA0KTsKKyAgICB9CisKKyAgICAvLyBGaWxsaW5nIGluIGNoYW5uZWwgSUQgNgorICAgIHBCdWYgPSAmKHBTdGFydEJzc1JlcS0+c3NJZC5zc0lkW3BTdGFydEJzc1JlcS0+c3NJZC5sZW5ndGhdKTsKKyAgICAqcEJ1ZiA9IDY7CisgICAgcEJ1ZisrOworCisgICAgLy8gRmlsbGluZyBpbiBDQiBtb2RlCisgICAgY2JNb2RlID0gZUFOSV9DQl9TRUNPTkRBUllfTk9ORTsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSZjYk1vZGUsIHNpemVvZih0QW5pQ0JTZWNvbmRhcnlNb2RlKSApOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlDQlNlY29uZGFyeU1vZGUpOworCisgICAgLy8gRmlsbGluZyBpbiBSU04gSUUgTGVuZ3RoIHRvIHplcm8KKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBzaXplb2YodEFOSV9VMTYpICk7ICAgIC8vdFNpclJTTmllLT5sZW5ndGgKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICAvLyBGaWxsaW5nIGluIE5XIFR5cGUKKyAgICBud1R5cGUgPSBlU0lSXzExR19OV19UWVBFOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICh0QU5JX1U4ICopJm53VHlwZSwgc2l6ZW9mKHRTaXJOd1R5cGUpICk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck53VHlwZSk7CisKKyAgICAvKiAtLS0tIFRvIGJlIGZpbGxlZCBieSBMSU0gbGF0ZXIgLS0tLSAKKyAgICBwU3RhcnRCc3NSZXEtPm9wZXJhdGlvbmFsUmF0ZVNldAorICAgIHBTdGFydEJzc1JlcS0+ZXh0ZW5kZWRSYXRlU2V0CisgICAgcFN0YXJ0QnNzUmVxLT5kb3QxMW1vZGUKKyAgICBwU3RhcnRCc3NSZXEtPmJzc0lkCisgICAgcFN0YXJ0QnNzUmVxLT5zZWxmTWFjQWRkcgorICAgIHBTdGFydEJzc1JlcS0+YmVhY29uSW50ZXJ2YWwKKyAgICBwU3RhcnRCc3NSZXEtPnNlc3Npb25JZCA9IDA7CisgICAgcFN0YXJ0QnNzUmVxLT50cmFuc2FjdGlvbklkID0gMDsgCisgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIG1zZy50eXBlID0gZVdOSV9TTUVfU1RBUlRfQlNTX1JFUTsKKyAgICBtc2cuYm9keXB0ciA9IHBTdGFydEJzc1JlcTsKKyAgICBtc2cuYm9keXZhbCA9IDA7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAic2VuZFNtZVN0YXJ0QnNzUmVxOiBsaW1Qb3N0TXNnQXBpKGVXTklfU01FX1NUQVJUX0JTU19SRVEpIFxuIik7CisgICAgbGltUG9zdE1zZ0FwaShwTWFjLCAmbXNnKTsKKworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqc2VuZFNtZVN0b3BCc3NSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCwgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIHRTaXJNc2dRICBtc2c7CisgICAgdFNpclNtZVN0b3BCc3NSZXEgIHN0b3BCc3NSZXEsICpwU3RvcEJzc1JlcTsKKyAgICB0QU5JX1UxNiAgbXNnTGVuID0gMDsKKyAgICB0cFBFU2Vzc2lvbiAgcHNlc3Npb25FbnRyeTsKKworICAgIHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgKHRBTklfVTgpc2Vzc2lvbklkKTsKKyAgICBpZiAoIHBzZXNzaW9uRW50cnkgPT0gTlVMTCApCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlNlc3Npb24gZW50cnkgZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JRCBcbiIpKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAic2VuZFNtZVN0b3BCc3NSZXE6IFByZXBhcmluZyBlV05JX1NNRV9TVE9QX0JTU19SRVEgbWVzc2FnZVxuIik7CisgICAgcFN0b3BCc3NSZXEgPSAodFNpclNtZVN0b3BCc3NSZXEgKikgJnN0b3BCc3NSZXE7CisKKyAgICBpZiAocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTdG9wQnNzUmVxLCBzaXplb2YodFNpclNtZVN0b3BCc3NSZXEpKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCJzZW5kU21lU3RvcEJzc1JlcTogcGFsQWxsb2NhdGVNZW1vcnkoKSBmYWlsZWQgXG4iKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgcFN0b3BCc3NSZXEtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfU1RPUF9CU1NfUkVROworICAgIG1zZ0xlbiArPSBzaXplb2YodEFOSV9VMzIpOyAgICAvLyBtc2dUeXBlICsgbGVuZ3RoCisgICAKKyAgICBwU3RvcEJzc1JlcS0+cmVhc29uQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgbXNnTGVuICs9IHNpemVvZih0U2lyUmVzdWx0Q29kZXMpOworCisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSAmcFN0b3BCc3NSZXEtPmJzc0lkLCAodm9pZCAqKXBzZXNzaW9uRW50cnktPmJzc0lkLCA2KTsgIAorICAgIG1zZ0xlbiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisgICAgcFN0b3BCc3NSZXEtPnNlc3Npb25JZCA9ICh0QU5JX1U4KXNlc3Npb25JZDsKKyAgICBtc2dMZW4gKz0gc2l6ZW9mKHRBTklfVTgpOworCisgICAgcFN0b3BCc3NSZXEtPnRyYW5zYWN0aW9uSWQgPSAwOworICAgIG1zZ0xlbiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgcFN0b3BCc3NSZXEtPmxlbmd0aCA9IG1zZ0xlbjsKKworICAgIG1zZy50eXBlID0gZVdOSV9TTUVfU1RPUF9CU1NfUkVROworICAgIG1zZy5ib2R5cHRyID0gcFN0b3BCc3NSZXE7CisgICAgbXNnLmJvZHl2YWwgPSAwOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgInNlbmRTbWVTdG9wQnNzUmVxOiBsaW1Qb3N0TXNnQXBpKGVXTklfU01FX1NUT1BfQlNTX1JFUSkgXG4iKTsKKyAgICBsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpOworCisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICpzZW5kU21lSm9pblJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCBjaGFyICpwKQoreworICAgIHRTaXJNc2dRICBtc2c7CisgICAgdFNpclNtZUpvaW5SZXEgICpwSm9pblJlcTsKKyAgICB1bnNpZ25lZCBjaGFyICAqcEJ1ZjsKKyAgICB0QU5JX1UxNiAgbXNnTGVuID0gMzA3OworCisgICAgdEFOSV9VOCAgbXNnRHVtcFszMDddID0geworICAgICAgICAweDA2LCAweDEyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMSwgMHgwMCwgCisgICAgICAgIDB4REUsIDB4QUQsIDB4QkEsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDIxLCAweDA0LCAweDAyLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHgwMCwgMHgwMSwgMHgxRSwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4ODUsIDB4NEYsIDB4N0EsIDB4MDAsIDB4MDYsIDB4NDEsIAorICAgICAgICAweDZFLCAweDY5LCAweDRFLCAweDY1LCAweDc0LCAweDAxLCAweDA0LCAweDgyLCAweDg0LCAweDhCLCAKKyAgICAgICAgMHg5NiwgMHgwMywgMHgwMSwgMHgwNiwgMHgwNywgMHgwNiwgMHg1NSwgMHg1MywgMHg0OSwgMHgwMSwgCisgICAgICAgIDB4MEUsIDB4MUUsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MzIsIDB4MDgsIDB4MEMsIDB4MTIsIDB4MTgsIAorICAgICAgICAweDI0LCAweDMwLCAweDQ4LCAweDYwLCAweDZDLCAweDJELCAweDFBLCAweEVFLCAweDExLCAweDAzLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDNELCAweDE2LCAweDA2LCAweDA3LCAweDExLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4MTgsIDB4MDAsIAorICAgICAgICAweDUwLCAweEYyLCAweDAyLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAzLCAweEE0LCAweDAwLCAKKyAgICAgICAgMHgwMCwgMHgyNywgMHhBNCwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MywgMHg1RSwgMHgwMCwgMHg2MiwgCisgICAgICAgIDB4MzIsIDB4MkYsIDB4MDAsIDB4REQsIDB4MTQsIDB4MDAsIDB4MEEsIDB4RjUsIDB4MDAsIDB4MDMsIAorICAgICAgICAweDAxLCAweDAzLCAweDA1LCAweDBBLCAweDAyLCAweDgwLCAweEMwLCAweDEyLCAweDA2LCAweEZGLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNiwgMHgwRCwgMHhERCwgMHg2RSwgMHgwMCwgMHg1MCwgMHhGMiwgCisgICAgICAgIDB4MDQsIDB4MTAsIDB4NEEsIDB4MDAsIDB4MDEsIDB4MTAsIDB4MTAsIDB4NDQsIDB4MDAsIDB4MDEsIAorICAgICAgICAweDAxLCAweDEwLCAweDNCLCAweDAwLCAweDAxLCAweDAzLCAweDEwLCAweDQ3LCAweDAwLCAweDEwLCAKKyAgICAgICAgMHhEQiwgMHhDNiwgMHg3NywgMHgyOCwgMHhCOSwgMHhGMywgMHhEOCwgMHg1OCwgMHg4NiwgMHhGRiwgCisgICAgICAgIDB4RkMsIDB4NkIsIDB4QjYsIDB4QjksIDB4MjcsIDB4NzksIDB4MTAsIDB4MjEsIDB4MDAsIDB4MDgsIAorICAgICAgICAweDUxLCAweDc1LCAweDYxLCAweDZDLCAweDYzLCAweDZGLCAweDZELCAweDZELCAweDEwLCAweDIzLCAKKyAgICAgICAgMHgwMCwgMHgwNywgMHg1NywgMHg0NiwgMHg1MiwgMHgzNCwgMHgzMCwgMHgzMywgMHgzMSwgMHgxMCwKKyAgICAgICAgMHgyNCwgMHgwMCwgMHgwNiwgMHg0RCwgMHg0RSwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgxMCwgCisgICAgICAgIDB4NDIsIDB4MDAsIDB4MDYsIDB4NTMsIDB4NEUsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MTAsIAorICAgICAgICAweDU0LCAweDAwLCAweDA4LCAweDAwLCAweDA2LCAweDAwLCAweDUwLCAweEYyLCAweDA0LCAweDAwLCAKKyAgICAgICAgMHgwMSwgMHgxMCwgMHgxMSwgMHgwMCwgMHgwNiwgMHgzMSwgMHgzMSwgMHg2RSwgMHgyRCwgMHg0MSwgCisgICAgICAgIDB4NTAsIDB4MTAsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MDEsIDB4OEUKKyAgICB9OworCisgICAgIGlmIChwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcEpvaW5SZXEsIG1zZ0xlbikgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwic2VuZFNtZUpvaW5SZXE6IHBhbEFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkIFxuIik7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIHBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBKb2luUmVxOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICh0QU5JX1U4ICopbXNnRHVtcCwgbXNnTGVuICk7CisKKyAgICBtc2cudHlwZSA9IGVXTklfU01FX0pPSU5fUkVROworICAgIG1zZy5ib2R5cHRyID0gcEpvaW5SZXE7CisgICAgbXNnLmJvZHl2YWwgPSAwOworICAgIGxpbVBvc3RNc2dBcGkocE1hYywgJm1zZyk7CisKKyAgICByZXR1cm4gcDsKK30KKworCitzdGF0aWMgY2hhciAqcHJpbnRTZXNzaW9uSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCBjaGFyICpwKQoreworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSAmcE1hYy0+bGltLmdwU2Vzc2lvblswXTsgIAorICAgIHRBTklfVTggIGk7CisKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiRHVtcCBQRSBTZXNzaW9uIFxuIik7CisKKyAgICBmb3IoaT0wOyBpIDwgcE1hYy0+bGltLm1heEJzc0lkOyBpKyspCisgICAgeworICAgICAgICBpZiggcE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnkgPSAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXTsgIAorICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiICAgIFBFIFNlc3Npb24gWyVkXSAgICBcbiIsIGkpOyAgIAorICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiYXZhaWxhYmxlOiAlZCBcbiIsIHBzZXNzaW9uRW50cnktPmF2YWlsYWJsZSk7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJwZVNlc3Npb25JZDogJWQsICBzbWVTZXNzaW9uSWQ6ICVkLCB0cmFuc2FjdGlvbklkOiAlZCBcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImJzc0lkOiAgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzBdLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZFsxXSwgcHNlc3Npb25FbnRyeS0+YnNzSWRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZFszXSwgcHNlc3Npb25FbnRyeS0+YnNzSWRbNF0sIHBzZXNzaW9uRW50cnktPmJzc0lkWzVdKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgInNlbGZNYWNBZGRyOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyWzBdLCBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkclsxXSwgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkclszXSwgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHJbNF0sIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyWzVdKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImJzc0lkeDogJWQgXG4iLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZHgpOworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAidmFsaWQ6ICVkIFxuIiwgcHNlc3Npb25FbnRyeS0+dmFsaWQpOworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAibGltTWxtU3RhdGU6ICglZCkgJXMgIiwgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIGxpbU1sbVN0YXRlU3RyKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKSApOworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAibGltUHJldk1sbVN0YXRlOiAoJWQpICVzICIsIHBzZXNzaW9uRW50cnktPmxpbVByZXZNbG1TdGF0ZSwgbGltTWxtU3RhdGVTdHIocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpICk7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJsaW1TbWVTdGF0ZTogKCVkKSAlcyAiLCBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSwgbGltU21lU3RhdGVTdHIocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpICk7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJsaW1QcmV2U21lU3RhdGU6ICglZCkgICVzICIsIHBzZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZSwgbGltU21lU3RhdGVTdHIocHNlc3Npb25FbnRyeS0+bGltUHJldlNtZVN0YXRlKSApOworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAibGltU3lzdGVtUm9sZTogKCVkKSAlcyBcbiIsIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUsIGdldFJvbGUocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkgKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImJzc1R5cGU6ICglZCkgJXMgXG4iLCBwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlLCBsaW1Cc3NUeXBlU3RyKHBzZXNzaW9uRW50cnktPmJzc1R5cGUpKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIm9wZXJNb2RlOiAlZCBcbiIsIHBzZXNzaW9uRW50cnktPm9wZXJNb2RlKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImRvdDExbW9kZTogJWQgXG4iLCBwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUpOworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiaHRDYXBhYmFsaXR5OiAlZCBcbiIsIHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSk7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJsaW1SRkJhbmQ6ICVkIFxuIiwgcHNlc3Npb25FbnRyeS0+bGltUkZCYW5kKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImxpbUlic3NBY3RpdmU6ICVkIFxuIiwgcHNlc3Npb25FbnRyeS0+bGltSWJzc0FjdGl2ZSk7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJsaW1DdXJyZW50QXV0aFR5cGU6ICVkIFxuIiwgcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEF1dGhUeXBlKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImxpbUN1cnJlbnRCc3NDYXBzOiAlZCBcbiIsIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImxpbUN1cnJlbnRCc3NRb3NDYXBzOiAlZCBcbiIsIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NRb3NDYXBzKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImxpbUN1cnJlbnRCc3NQcm9wQ2FwOiAlZCBcbiIsIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NQcm9wQ2FwKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImxpbVNlbnRDYXBzQ2hhbmdlTnRmOiAlZCBcbiIsIHBzZXNzaW9uRW50cnktPmxpbVNlbnRDYXBzQ2hhbmdlTnRmKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkxpbUFJRDogJWQgXG4iLCBwc2Vzc2lvbkVudHJ5LT5saW1BSUQpOworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiUmVhc3NvY2Jzc0lkOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZFswXSwgcHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkWzFdLCBwc2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWRbM10sIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZFs0XSwgcHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkWzVdKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImxpbVJlYXNzb2NDaGFubmVsSWQ6ICVkIFxuIiwgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0NoYW5uZWxJZCk7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJsaW1SZWFzc29jQnNzQ2FwczogJWQgXG4iLCBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzQ2Fwcyk7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJsaW1SZWFzc29jQnNzUW9zQ2FwczogJWQgXG4iLCBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUW9zQ2Fwcyk7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJsaW1SZWFzc29jQnNzUHJvcENhcDogJWQgXG4iLCBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUHJvcENhcCk7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJsaW1SZWFzc29jVGl0YW5IdENhcHM6ICVkIFxuIiwgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY1RpdGFuSHRDYXBzKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcDsKK30KKwordm9pZAorbGltU2V0RWRjYUJjYXN0QUNNRmxhZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhYywgdEFOSV9VMzIgYWNtRmxhZykKK3sKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gJnBNYWMtPmxpbS5ncFNlc3Npb25bMF07ICAvL1RCRC1SQUpFU0ggSE9XIFRPIEdFVCBzZXNzaW9uRW50cnk/Pz8/PworICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbYWNdLmFjaS5hY20gPSAodEFOSV9VOClhY21GbGFnOworICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1TZXRDb3VudCsrOworICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMscHNlc3Npb25FbnRyeSk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2xpbUR1bXBFZGNhUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGNoYXIgKnApCit7CisgICAgdEFOSV9VOCBpID0gMDsKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gJnBNYWMtPmxpbS5ncFNlc3Npb25bMF07ICAvL1RCRC1SQUpFU0ggSE9XIFRPIEdFVCBzZXNzaW9uRW50cnk/Pz8/PyAgICAKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJFRENBIHBhcmFtZXRlciBzZXQgY291bnQgPSAlZFxuIiwgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1TZXRDb3VudCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiQnJvYWRjYXN0IHBhcmFtZXRlcnNcbiIpOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkFDXHRBQ0lcdEFDTVx0QUlGU05cdENXTWF4XHRDV01pblx0VHhvcExpbWl0XHRcbiIpOworICAgIGZvcihpID0gMDsgaSA8IE1BWF9OVU1fQUM7IGkrKykKKyAgICB7CisgICAgICAgIC8vcmlnaHQgbm93IEkgYW0ganVzdCBpbnRlcmVzdGVkIGluIEFDTSBiaXQuIHRoaXMgY2FuIGJlIGV4dGVuZGVkIGZvciBhbGwgb3RoZXIgRURDQSBwYXJhbXRlcnMuCisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiVkXHQlZFx0JWRcdCVkXHQlZFx0JWRcdCVkXG4iLCAgaSwKKyAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDW2ldLmFjaS5hY2ksIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uYWNpLmFjbSwKKyAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDW2ldLmFjaS5haWZzbiwgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1tpXS5jdy5tYXgsCisgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1tpXS5jdy5taW4sIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0udHhvcGxpbWl0KTsKKyAgICB9CisKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcbkxvY2FsIHBhcmFtZXRlcnNcbiIpOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkFDXHRBQ0lcdEFDTVx0QUlGU05cdENXTWF4XHRDV01pblx0VHhvcExpbWl0XHRcbiIpOworICAgIGZvcihpID0gMDsgaSA8IE1BWF9OVU1fQUM7IGkrKykKKyAgICB7CisgICAgICAgIC8vcmlnaHQgbm93IEkgYW0ganVzdCBpbnRlcmVzdGVkIGluIEFDTSBiaXQuIHRoaXMgY2FuIGJlIGV4dGVuZGVkIGZvciBhbGwgb3RoZXIgRURDQSBwYXJhbXRlcnMuCisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiVkXHQlZFx0JWRcdCVkXHQlZFx0JWRcdCVkXG4iLCAgaSwKKyAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0uYWNpLmFjaSwgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0uYWNpLmFjbSwKKyAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0uYWNpLmFpZnNuLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS5jdy5tYXgsCisgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW2ldLmN3Lm1pbiwgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0udHhvcGxpbWl0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworCitzdGF0aWMgY2hhciogbGltRHVtcFRzcGVjRW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCwgdEFOSV9VMzIgdHNwZWNFbnRyeU5vKQoreworICAgIHRwTGltVHNwZWNJbmZvIHBUc3BlY0xpc3Q7CisgICAgaWYodHNwZWNFbnRyeU5vID49IExJTV9OVU1fVFNQRUNfTUFYKQorICAgIHsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiVHNwZWMgRW50cnkgbm8uICVkIGlzIG91dCBvZiBhbGxvd2VkIHJhbmdlKDAgLi4gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdHNwZWNFbnRyeU5vLCAgKExJTV9OVU1fVFNQRUNfTUFYIC0gMSkpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisgICAgcFRzcGVjTGlzdCA9ICZwTWFjLT5saW0udHNwZWNJbmZvW3RzcGVjRW50cnlOb107CisgICAgaWYgKHBUc3BlY0xpc3QtPmludXNlKQorICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJFbnRyeSAlZCBpcyBWQUxJRFxuIiwgdHNwZWNFbnRyeU5vKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJFbnRyeSAlZCBpcyBVTlVTRURcbiIsIHRzcGVjRW50cnlObyk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcdFN0YSAlMHg6JTB4OiUweDolMHg6JTB4OiUweCwgQUlEICVkLCBJbmRleCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHNwZWNMaXN0LT5zdGFBZGRyWzBdLCBwVHNwZWNMaXN0LT5zdGFBZGRyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUc3BlY0xpc3QtPnN0YUFkZHJbMl0sIHBUc3BlY0xpc3QtPnN0YUFkZHJbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRzcGVjTGlzdC0+c3RhQWRkcls0XSwgcFRzcGVjTGlzdC0+c3RhQWRkcls1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHNwZWNMaXN0LT5hc3NvY0lkLCAgcFRzcGVjTGlzdC0+aWR4KTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcdFR5cGUgJWQsIExlbmd0aCAlZCwgYWNrUG9saWN5ICVkLCB1c2VyUHJpbyAlZCwgYWNjZXNzUG9saWN5ID0gJWQsIERpciAlZCwgdHNpZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHNwZWNMaXN0LT50c3BlYy50eXBlLCBwVHNwZWNMaXN0LT50c3BlYy5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRzcGVjTGlzdC0+dHNwZWMudHNpbmZvLnRyYWZmaWMuYWNrUG9saWN5LCBwVHNwZWNMaXN0LT50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHNwZWNMaXN0LT50c3BlYy50c2luZm8udHJhZmZpYy5hY2Nlc3NQb2xpY3ksIHBUc3BlY0xpc3QtPnRzcGVjLnRzaW5mby50cmFmZmljLmRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHNwZWNMaXN0LT50c3BlYy50c2luZm8udHJhZmZpYy50c2lkKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcdFBzYiAlZCwgQWdnICVkLCBUcmFmZmljVHlwZSAlZCwgc2NoZWR1bGUgJWQ7IG1zZHVTejogbm9tICVkLCBtYXggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRzcGVjTGlzdC0+dHNwZWMudHNpbmZvLnRyYWZmaWMucHNiLCBwVHNwZWNMaXN0LT50c3BlYy50c2luZm8udHJhZmZpYy5hZ2dyZWdhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHNwZWNMaXN0LT50c3BlYy50c2luZm8udHJhZmZpYy50cmFmZmljVHlwZSwgcFRzcGVjTGlzdC0+dHNwZWMudHNpbmZvLnNjaGVkdWxlLnNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUc3BlY0xpc3QtPnRzcGVjLm5vbU1zZHVTeiwgIHBUc3BlY0xpc3QtPnRzcGVjLm1heE1zZHVTeik7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXHRTdmNJbnQ6IE1pbiAlZCwgTWF4ICVkOyBkYXRhUmF0ZTogTWluICVkLCBtZWFuICVkLCBwZWFrICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUc3BlY0xpc3QtPnRzcGVjLm1pblN2Y0ludGVydmFsLCAgcFRzcGVjTGlzdC0+dHNwZWMubWF4U3ZjSW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRzcGVjTGlzdC0+dHNwZWMubWluRGF0YVJhdGUsICBwVHNwZWNMaXN0LT50c3BlYy5tZWFuRGF0YVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRzcGVjTGlzdC0+dHNwZWMucGVha0RhdGFSYXRlKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcdG1heEJ1cnN0U3ogJWQsIGRlbGF5Qm91bmQgJWQsIG1pblBoeVJhdGUgJWQsIHN1cnBsdXNCdyAlZCwgbWVkaXVtVGltZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHNwZWNMaXN0LT50c3BlYy5tYXhCdXJzdFN6LCBwVHNwZWNMaXN0LT50c3BlYy5kZWxheUJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUc3BlY0xpc3QtPnRzcGVjLm1pblBoeVJhdGUsIHBUc3BlY0xpc3QtPnRzcGVjLnN1cnBsdXNCdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHNwZWNMaXN0LT50c3BlYy5tZWRpdW1UaW1lKTsKKworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciogZHVtcFRzcGVjVGFibGVTdW1tYXJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwTGltVHNwZWNJbmZvIHBUc3BlY0xpc3QsIGNoYXIgKnAsIGludCBjdHNwZWMpCit7CisgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICIlZFx0JWRcdCVkXHQlZFx0JWRcdCVkXHQlZFx0JWRcdCVkXHQlZFx0JWRcbiIsCisgICAgICAgICAgICBjdHNwZWMsIHBUc3BlY0xpc3QtPmlkeCwgcFRzcGVjTGlzdC0+YXNzb2NJZCwKKyAgICAgICAgICAgIHBUc3BlY0xpc3QtPnRzcGVjLnRzaW5mby50cmFmZmljLmFja1BvbGljeSwgcFRzcGVjTGlzdC0+dHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW8sCisgICAgICAgICAgICBwVHNwZWNMaXN0LT50c3BlYy50c2luZm8udHJhZmZpYy5wc2IsIHBUc3BlY0xpc3QtPnRzcGVjLnRzaW5mby50cmFmZmljLmFnZ3JlZ2F0aW9uLAorICAgICAgICAgICAgcFRzcGVjTGlzdC0+dHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5LCBwVHNwZWNMaXN0LT50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24sCisgICAgICAgICAgICBwVHNwZWNMaXN0LT50c3BlYy50c2luZm8udHJhZmZpYy50c2lkLCBwVHNwZWNMaXN0LT50c3BlYy50c2luZm8udHJhZmZpYy50cmFmZmljVHlwZSk7CisKKyAgcmV0dXJuIHA7Cit9CisKKworc3RhdGljIGNoYXIqIGxpbUR1bXBEcGhUYWJsZVN1bW1hcnkodHBBbmlTaXJHbG9iYWwgcE1hYyxjaGFyICpwKQoreworICAgIHRBTklfVTggIGksIGo7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiRFBIIFRhYmxlIGR1bXBcbiIpOworCisgICAgZm9yKGo9MDsgaiA8IHBNYWMtPmxpbS5tYXhCc3NJZDsgaisrKQorICAgIHsKKyAgICAgICAgLyogRmluZCBmaXJzdCBmcmVlIHJvb20gaW4gc2Vzc2lvbiB0YWJsZSAqLworICAgICAgICBpZihwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLnZhbGlkKQorICAgICAgICB7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJhaWQgc3RhSWQgYnNzaWQgZW5jUG9sIHFvc01vZGUgd21lIDExZSB3c20gc3RhYWRkclxuIik7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUuc2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5hZGRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiVkICAlZCAgJWQgICAgICAlZCAgICAgICAgICVkICAgJWQgJWQgICAlZCAgJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncFNlc3Npb25bal0uZHBoLmRwaEhhc2hUYWJsZS5wRHBoTm9kZUFycmF5W2ldLmFzc29jSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncFNlc3Npb25bal0uZHBoLmRwaEhhc2hUYWJsZS5wRHBoTm9kZUFycmF5W2ldLnN0YUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwU2Vzc2lvbltqXS5kcGguZHBoSGFzaFRhYmxlLnBEcGhOb2RlQXJyYXlbaV0uZW5jUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5xb3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS53bWVFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5sbGVFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS53c21FbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5zdGFBdXRoZW50aWNhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5zdGFBZGRyWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5zdGFBZGRyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5zdGFBZGRyWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5zdGFBZGRyWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5zdGFBZGRyWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2pdLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheVtpXS5zdGFBZGRyWzVdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICAgCisgICAgICAgIH0gICAKKyAgICB9CisgICAgcmV0dXJuIHA7Cit9ICAgICAKKworLy8gYWRkIHRoZSBzcGVjaWZpZWQgdHNwZWMgdG8gdGhlIHRzcGVjIGxpc3QKK3N0YXRpYyBjaGFyKiBsaW1EdW1wVHNlY1RhYmxlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCBjaGFyKiBwKQoreworICAgIGludCBjdHNwZWM7CisgICAgdHBMaW1Uc3BlY0luZm8gIHBUc3BlY0xpc3QgPSAmcE1hYy0+bGltLnRzcGVjSW5mb1swXTsKKworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIj09PT09PT1MSU0gVFNQRUMgVEFCTEUgRFVNUFxuIik7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiTnVtXHRJZHhcdEFJRFx0QWNrUG9sXHRVUFx0UFNCXHRBZ2dcdEFjY2Vzc1BvbFx0RGlyXHRUU0lEXHR0cmFmZmljXG4iKTsKKworICAgIGZvciAoY3RzcGVjID0gMDsgY3RzcGVjIDwgTElNX05VTV9UU1BFQ19NQVg7IGN0c3BlYysrLCBwVHNwZWNMaXN0KyspCisgICAgeworICAgICAgICBpZiAocFRzcGVjTGlzdC0+aW51c2UpCisgICAgICAgICAgICBwID0gZHVtcFRzcGVjVGFibGVTdW1tYXJ5KHBNYWMsIHBUc3BlY0xpc3QsIHAsIGN0c3BlYyk7CisgICAgfQorICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX2xpbV90c3BlY190YWJsZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICAodm9pZCkgYXJnMTsgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKyAgICBwID0gbGltRHVtcFRzZWNUYWJsZShwTWFjLCBwKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fdHNwZWNfZW50cnkoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKyAgICBwID0gbGltRHVtcFRzcGVjRW50cnkocE1hYywgcCwgYXJnMSk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX2RwaF90YWJsZV9zdW1tYXJ5KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgcCA9IGxpbUR1bXBEcGhUYWJsZVN1bW1hcnkocE1hYywgcCk7CisgICAgcmV0dXJuIHA7Cit9CisKKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fbGlua19tb25pdG9yX3N0YXRzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgIHRBTklfVTMyIGluZCwgdmFsOworCisgICAgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJcbiAtLS0tLSBMSU0gSGVhcnQgQmVhdCBTdGF0cyAtLS0tLSBcbiIpOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIk5vLiBvZiBIZWFydEJlYXQgRmFpbHVyZXMgaW4gTGlua0VzdCBTdGF0ZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhCZmFpbHVyZUNudEluTGlua0VzdFN0YXRlKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJOby4gb2YgUHJvYmUgRmFpbHVyZXMgYWZ0ZXIgSEIgZmFpbGVkICAgICAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Qcm9iZUZhaWx1cmVBZnRlckhCZmFpbGVkQ250KTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJOby4gb2YgSGVhcnRCZWF0IEZhaWx1cmVzIGluIE90aGVyIFN0YXRlcyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhCZmFpbHVyZUNudEluT3RoZXJTdGF0ZXMpOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQsICZ2YWwpID09IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiQ2ZnIEhlYXJ0QmVhdCBUaHJlc2hvbGQgPSAlZFxuIiwgdmFsKTsKKworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiMgQmVhY29ucyBSY3ZkIGluIEhCIGludGVydmFsICAgICMgb2YgdGltZXNcbiIpOworCisgICAgZm9yIChpbmQgPSAxOyBpbmQgPCBNQVhfTk9fQkVBQ09OU19QRVJfSEVBUlRfQkVBVF9JTlRFUlZBTDsgaW5kKyspCisgICAgeworICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXHRcdFx0XHRcdFx0XHRcdCUyZFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQlOGRcbiIsIGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSGVhcnRCZWF0QmVhY29uU3RhdHNbaW5kXSk7CisgICAgfQorICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlx0XHRcdFx0XHRcdFx0XHQlMmQ+XHRcdFx0XHRcdFx0XHRcdFx0XHQlOGRcbiIsCisgICAgICAgICAgICAgICAgICAgIE1BWF9OT19CRUFDT05TX1BFUl9IRUFSVF9CRUFUX0lOVEVSVkFMLTEsCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSGVhcnRCZWF0QmVhY29uU3RhdHNbMF0pOworCisgICAgaWYgKGFyZzEgIT0gMCkKKyAgICB7CisgICAgICAgIGZvciAoaW5kID0gMDsgaW5kIDwgTUFYX05PX0JFQUNPTlNfUEVSX0hFQVJUX0JFQVRfSU5URVJWQUw7IGluZCsrKQorICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhlYXJ0QmVhdEJlYWNvblN0YXRzW2luZF0gPSAwOworCisgICAgICAgIHBNYWMtPmxpbS5nTGltSEJmYWlsdXJlQ250SW5MaW5rRXN0U3RhdGUgICA9IDA7CisgICAgICAgIHBNYWMtPmxpbS5nTGltUHJvYmVGYWlsdXJlQWZ0ZXJIQmZhaWxlZENudCA9IDA7CisgICAgICAgIHBNYWMtPmxpbS5nTGltSEJmYWlsdXJlQ250SW5PdGhlclN0YXRlcyAgICA9IDA7CisKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXG5SZXNldCBIZWFydEJlYXQgU3RhdGlzdGljc1xuIik7CisgICAgfQorICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX2xpbV9lZGNhX3BhcmFtcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICAodm9pZCkgYXJnMTsgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKyAgICBwID0gbGltRHVtcEVkY2FQYXJhbXMocE1hYywgcCk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX2FjbV9zZXQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgIGxpbVNldEVkY2FCY2FzdEFDTUZsYWcocE1hYywgYXJnMSAvKmFjKDAuLjMpKi8sIGFyZzIgLyooYWNtRmxhZyA9IDEgdG8gc2V0IEFDTSovKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fYmdzY2FuX3RvZ2dsZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgIHBNYWMtPmxpbS5nTGltRm9yY2VCYWNrZ3JvdW5kU2NhbkRpc2FibGUgPSAoYXJnMSA9PSAwKSA/IDEgOiAwOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkJnbmQgc2NhbiBpcyBub3cgJXNcbiIsCisgICAgICAgIChwTWFjLT5saW0uZ0xpbUZvcmNlQmFja2dyb3VuZFNjYW5EaXNhYmxlKSA/ICJEaXNhYmxlZCIgOiAiT24iKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fbGlua21vbml0b3JfdG9nZ2xlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgcE1hYy0+c3lzLmdTeXNFbmFibGVMaW5rTW9uaXRvck1vZGUgPSAoYXJnMSA9PSAwKSA/IDAgOiAxOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkxpbmtNb25pdG9yIG1vZGUgZW5hYmxlID0gJXNcbiIsCisgICAgICAgIChwTWFjLT5zeXMuZ1N5c0VuYWJsZUxpbmtNb25pdG9yTW9kZSkgPyAiT24iIDogIk9mZiIpOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX2xpbV9wcm9iZXJlc3BfdG9nZ2xlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgcE1hYy0+bGltLmdMaW1Qcm9iZVJlc3BEaXNhYmxlRmxhZyA9IChhcmcxID09IDApID8gMCA6IDE7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiUHJvYmVSZXNwb25zZSBtb2RlIGRpc2FibGUgPSAlc1xuIiwKKyAgICAgICAgKHBNYWMtPmxpbS5nTGltUHJvYmVSZXNwRGlzYWJsZUZsYWcpID8gIk9uIiA6ICJPZmYiKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fYWRkX3N0YSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyNpZmRlZiBGSVhNRV9HRU42CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9ICZwTWFjLT5saW0uZ3BTZXNzaW9uWzBdOyAgLy9UQkQtUkFKRVNIIEhPVyBUTyBHRVQgc2Vzc2lvbkVudHJ5Pz8/Pz8KKyAgICB0U2lyTWFjQWRkciBzdGFNYWMgPSB7MH07CisgICAgdEFOSV9VMTYgYWlkOworICAgIGlmKGFyZzIgPiA1KQorICAgICAgZ290byBhZGRTdGFGYWlsOworICAgIGFpZCA9IGxpbUFzc2lnbkFJRChwTWFjKTsKKyAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgYWlkKTsKKyAgICBpZihOVUxMID09IHBTdGFEcykKKyAgICB7CisgICAgICAgIHN0YU1hY1s1XSA9ICh0QU5JX1U4KSBhcmcxOworICAgICAgICBwU3RhRHMgPSBkcGhBZGRIYXNoRW50cnkocE1hYywgc3RhTWFjLCBhaWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICAgICAgaWYoTlVMTCA9PSBwU3RhRHMpCisgICAgICAgICAgZ290byBhZGRTdGFGYWlsOworCisgICAgICAgIHBTdGFEcy0+c3RhVHlwZSA9IFNUQV9FTlRSWV9QRUVSOworICAgICAgICBzd2l0Y2goYXJnMikKKyAgICAgICAgeworICAgICAgICAgICAgLy8xMWIgc3RhdGlvbgorICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+ZXJwRW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiMTFiIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vMTFnIHN0YXRpb24KKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmVycEVuYWJsZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIjExZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvL2h0MjAgc3RhdGlvbiBub24tR0YKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmVycEVuYWJsZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+aHRHcmVlbmZpZWxkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJIVDIwIG5vbi1HRiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvL2h0MjAgc3RhdGlvbiBHRgorICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+ZXJwRW5hYmxlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5odEdyZWVuZmllbGQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkhUMjAgR0YiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy9odDQwIHN0YXRpb24gbm9uLUdGCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lmh0Q2FwYWJpbGl0eSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5lcnBFbmFibGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmh0R3JlZW5maWVsZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiSFQ0MCBub24tR0YiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy9odDQwIHN0YXRpb24gR0YKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmVycEVuYWJsZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+aHRHcmVlbmZpZWxkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJIVDQwIEdGIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImFyZzIgbm90IGluIHJhbmdlIFswLi4zXS4gU3RhdGlvbiBub3QgYWRkZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBhZGRTdGFGYWlsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwU3RhRHMtPmFkZGVkID0gMTsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiIHN0YXRpb24gd2l0aCBtYWMgYWRkcmVzcyAwMDowMDowMDowMDowMDoleCBhZGRlZC5cbiIsICh0QU5JX1U4KWFyZzEpOworICAgICAgICBsaW1BZGRTdGEocE1hYywgcFN0YURzLHBzZXNzaW9uRW50cnkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworYWRkU3RhRmFpbDoKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiQ291bGQgbm90IGFkZCBzdGF0aW9uXG4iKTsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiYXJnMTogNnRoIGJ5dGUgb2YgdGhlIHN0YXRpb24gTUFDIGFkZHJlc3NcbiIpOworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJhcmcyWzAuLjVdIDogc3RhdGlvbiB0eXBlIGFzIGRlc2NyaWJlZCBiZWxvd1xuIik7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlx0IDA6IDExYiwgMTogMTFnLCAyOiBIVDIwIG5vbi1HRiwgMzogSFQyMCBHRiwgNDogSFQ0MCBub24tR0YsIDU6IEhUNDAgR0ZcbiIpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX2xpbV9kZWxfc3RhKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworCisgICAgdHBEcGhIYXNoTm9kZSAgICAgICBwU3RhRHM7CisgICAgdExpbU1sbURpc2Fzc29jSW5kICBtbG1EaXNhc3NvY0luZDsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCByZWFzb25Db2RlID0gZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFlfUkVBU09OOworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywodEFOSV9VOClhcmcyKSApPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwiU2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbiBJZCAgXG4iKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsICh0QU5JX1UxNilhcmcxLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisKKyAgICBpZihOVUxMID09IHBTdGFEcykKKyAgICB7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJDb3VsZCBub3QgZmluZCBzdGF0aW9uIHdpdGggYXNzb2NJZCA9ICVkXG4iLCBhcmcxKTsKKyAgICAgICAgICAgIHJldHVybiBwOworICAgIH0KKyAgICAKKyAgICBpZiAocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpCisgICAgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJyZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSBmcm9tIHBlZXIgdGhhdCBpcyBpbiBzdGF0ZSAlWCBcbiIsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9IGVMSU1fUEVFUl9FTlRJVFlfRElTQVNTT0M7CisgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uID0gKHRTaXJNYWNSZWFzb25Db2RlcykgcmVhc29uQ29kZTsKKworICAgIC8vIElzc3VlIERpc2Fzc29jIEluZGljYXRpb24gdG8gU01FLgorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZtbG1EaXNhc3NvY0luZC5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcFN0YURzLT5zdGFBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBtbG1EaXNhc3NvY0luZC5yZWFzb25Db2RlID0gcmVhc29uQ29kZTsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICBtbG1EaXNhc3NvY0luZC5haWQgICAgICAgID0gcFN0YURzLT5hc3NvY0lkOworI2VuZGlmCisgICAgbWxtRGlzYXNzb2NJbmQuZGlzYXNzb2NUcmlnZ2VyID0gZUxJTV9QRUVSX0VOVElUWV9ESVNBU1NPQzsKKworICAgIG1sbURpc2Fzc29jSW5kLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywgIExJTV9NTE1fRElTQVNTT0NfSU5ELCAgKHRBTklfVTMyICopICZtbG1EaXNhc3NvY0luZCk7CisgICAgLy8gUmVjZWl2ZSBwYXRoIGNsZWFudXAKKyAgICBsaW1DbGVhbnVwUnhQYXRoKHBNYWMsIHBTdGFEcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICByZXR1cm4gcDsKK30KKworCisKKworc3RhdGljIGNoYXIgKgorc2V0X2xpbV9wcm90X2NmZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUHJvdGVjdGlvbiBFbmFibGUKKyoKKypMT1dFUiBieXRlIGZvciBhc3NvY2lhdGVkIHN0YXRpb25zCisqVVBQRVIgYnl0ZSBmb3Igb3ZlcmxhcHBpbmcgc3RhdGlvbnMuCisqMTFnID09PiBwcm90ZWN0aW9uIGZyb20gMTFnCisqMTFiID09PiBwcm90ZWN0aW9uIGZyb20gMTFiCisqZWFjaCBieXRlIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGluZm8KKypiaXQ3ICAgICBiaXQ2ICAgICBiaXQ1ICAgYml0NCBiaXQzICAgYml0MiAgYml0MSBiaXQwCisqcmVzZXJ2ZWQgcmVzZXJ2ZWQgUklGUyBMc2lnIG4tR0YgaHQyMCAxMWcgMTFiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRCAgICBJICAgIDQgICAgOQorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTElNCiswICAgIDB4ZmYgICAgMHhmZgorViAgICBSVyAgICBOUCAgUkVTVEFSVAorTElNCiswICAgIDB4ZmZmZiAgICAweGZmZmYKKworI0VOVU0gRlJPTV9sbEIgMAorI0VOVU0gRlJPTV9sbEcgMQorI0VOVU0gSFRfMjAgMgorI0VOVU0gTk9OX0dGIDMKKyNFTlVNIExTSUdfVFhPUCA0CisjRU5VTSBSSUZTIDUKKyNFTlVNIE9MQkNfRlJPTV9sbEIgOAorI0VOVU0gT0xCQ19GUk9NX2xsRyA5CisjRU5VTSBPTEJDX0hUMjAgMTAKKyNFTlVNIE9MQkNfTk9OX0dGIDExCisjRU5VTSBPTEJDX0xTSUdfVFhPUCAxMgorI0VOVU0gT0xCQ19SSUZTIDEzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYoMSA9PSBhcmcxKQorICAgICAgICBkdW1wX2NmZ19zZXQocE1hYywgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRUQsIDB4ZmYsIGFyZzMsIGFyZzQsIHApOworICAgIGVsc2UgaWYoMiA9PSBhcmcxKQorICAgICAgICBkdW1wX2NmZ19zZXQocE1hYywgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRUQsIGFyZzIgJiAweGZmLCBhcmczLCBhcmc0LCBwKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJUbyBzZXQgcHJvdGVjdGlvbiBjb25maWc6XG4iKTsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiYXJnMTogb3BlcmF0aW9uIHR5cGUoMSAtPiBzZXQgdG8gRGVmYXVsdCAweGZmLCAyLT4gc2V0IHRvIGEgYXJnMiwgZWxzZSBwcmludCBoZWxwKVxuIik7CisgICAgfQorICAgIHJldHVybiBwOworfQorCisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX3NldF9wcm90ZWN0aW9uX2NvbnRyb2woIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgZHVtcF9jZmdfc2V0KHBNYWMsIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04sIGFyZzEsIGFyZzIsIGFyZzMsIHApOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBsaW1TZXRDZmdQcm90ZWN0aW9uKHBNYWMsIE5VTEwpOworI2Vsc2UKKyAgICBsaW1TZXRDZmdQcm90ZWN0aW9uKHBNYWMpOworI2VuZGlmCisgICAgcmV0dXJuIHA7Cit9CisKKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fc2VuZF9TTV9Qb3dlcl9Nb2RlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgIHRTaXJNc2dRICAgIG1zZzsKKyAgICB0cFNpck1iTXNnICBwTUJNc2c7CisgICAgICAgIHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSBzdGF0ZTsKKworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICIlczogVmVyaWZ5aW5nIHRoZSBBcmd1bWVudHNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgaWYgKChhcmcxID4gMykgfHwgKGFyZzEgPT0gMikpCisgICAgeworICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkludmFsaWQgQXJndW1lbnQgLCBlbnRlciBvbmUgb2YgdGhlIHZhbGlkIHN0YXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZSA9ICh0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpIGFyZzE7CisKKyAgICBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1CTXNnLCBXTklfQ0ZHX01CX0hEUl9MRU4gKyBzaXplb2YodFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlKSk7CisgICAgaWYoTlVMTCA9PSBwTUJNc2cpCisgICAgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJwTUJNc2cgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKyAgICBwTUJNc2ctPnR5cGUgPSBlV05JX1BNQ19TTVBTX1NUQVRFX0lORDsKKyAgICBwTUJNc2ctPm1zZ0xlbiA9ICh0QU5JX1UxNikoV05JX0NGR19NQl9IRFJfTEVOICsgc2l6ZW9mKHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSkpOworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1CTXNnLT5kYXRhLCAmc3RhdGUsIHNpemVvZih0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpKTsKKworICAgIG1zZy50eXBlID0gZVdOSV9QTUNfU01QU19TVEFURV9JTkQ7CisgICAgbXNnLmJvZHlwdHIgPSBwTUJNc2c7CisgICAgbXNnLmJvZHl2YWwgPSAwOworCisgICAgaWYgKGxpbVBvc3RNc2dBcGkocE1hYywgJm1zZykgIT0gVFhfU1VDQ0VTUykKKyAgICB7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJVcGRhdGluZyB0aGUgU01Qb3dlciBSZXF1ZXN0IGhhcyBmYWlsZWQgXG4iKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTUJNc2cpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJVcGRhdGluZyB0aGUgU01Qb3dlciBSZXF1ZXN0IGlzIERvbmUgXG4iKTsKKyAgICB9CisKKyAgICAgICAgcmV0dXJuIHA7Cit9CisKKworCisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX2FkZGJhX3JlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKK3RTaXJSZXRTdGF0dXMgc3RhdHVzOwordHBEcGhIYXNoTm9kZSBwU3RhOworICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gJnBNYWMtPmxpbS5ncFNlc3Npb25bMF07IC8vVEJELVJBSkVTSCBIT1cgVE8gR0VUIHNlc3Npb25FbnRyeT8/Pz8/CisKKworICAodm9pZCkgYXJnNDsKKworICAvLyBHZXQgRFBIIFN0YSBlbnRyeSBmb3IgdGhpcyBBU1NPQyBJRAorICBwU3RhID0gZHBoR2V0SGFzaEVudHJ5KCBwTWFjLCAodEFOSV9VMTYpIGFyZzEsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgaWYoIE5VTEwgPT0gcFN0YSApCisgIHsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLAorICAgICAgICAiXG4lczogQ291bGQgbm90IGZpbmQgZW50cnkgaW4gRFBIIHRhYmxlIGZvciBhc3NvY0lkID0gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgYXJnMSApOworICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IGxpbVBvc3RNbG1BZGRCQVJlcSggcE1hYywgcFN0YSwgKHRBTklfVTgpIGFyZzIsICh0QU5JX1UxNikgYXJnMyxwc2Vzc2lvbkVudHJ5KTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLAorICAgICAgICAiXG4lczogQXR0ZW1wdGVkIHRvIHNlbmQgYW4gQUREQkEgUmVxIHRvIFNUQSBJbmRleCAlZCwgZm9yIFRJRCAlZC4gU2VuZCBTdGF0dXMgPSAlc1xuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwU3RhLT5zdGFJbmRleCwKKyAgICAgICAgYXJnMiwKKyAgICAgICAgbGltUmVzdWx0Q29kZVN0ciggc3RhdHVzICkpOworICB9CisKKyAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX2RlbGJhX3JlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKK3RTaXJSZXRTdGF0dXMgc3RhdHVzOwordHBEcGhIYXNoTm9kZSBwU3RhOworICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gJnBNYWMtPmxpbS5ncFNlc3Npb25bMF07ICAvL1RCRC1SQUpFU0ggSE9XIFRPIEdFVCBzZXNzaW9uRW50cnk/Pz8/PworCisgIC8vIEdldCBEUEggU3RhIGVudHJ5IGZvciB0aGlzIEFTU09DIElECisgIHBTdGEgPSBkcGhHZXRIYXNoRW50cnkoIHBNYWMsICh0QU5JX1UxNikgYXJnMSwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUgKTsKKyAgaWYoIE5VTEwgPT0gcFN0YSApCisgIHsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLAorICAgICAgICAiXG4lczogQ291bGQgbm90IGZpbmQgZW50cnkgaW4gRFBIIHRhYmxlIGZvciBhc3NvY0lkID0gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgYXJnMSApOworICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IGxpbVBvc3RNbG1EZWxCQVJlcSggcE1hYywgcFN0YSwgKHRBTklfVTgpIGFyZzIsICh0QU5JX1U4KSBhcmczLCAodEFOSV9VMTYpIGFyZzQgLHBzZXNzaW9uRW50cnkpOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsCisgICAgICAgICJcbiVzOiBBdHRlbXB0ZWQgdG8gc2VuZCBhIERFTEJBIEluZCB0byBTVEEgSW5kZXggJWQsICIKKyAgICAgICAgImFzIHRoZSBCQSBcIiVzXCIgZm9yIFRJRCAlZCwgd2l0aCBSZWFzb24gY29kZSAlZC4gIgorICAgICAgICAiU2VuZCBTdGF0dXMgPSAlc1xuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwU3RhLT5zdGFJbmRleCwKKyAgICAgICAgKGFyZzIgPT0gMSk/ICJJbml0aWF0b3IiOiAiUmVjaXBpZW50IiwKKyAgICAgICAgYXJnMywgLy8gVElECisgICAgICAgIGFyZzQsIC8vIFJlYXNvbiBDb2RlCisgICAgICAgIGxpbVJlc3VsdENvZGVTdHIoIHN0YXR1cyApKTsKKyAgfQorCisgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX2xpbV9iYV90aW1lb3V0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworCisvKiBGSVhNRTogTk8gSEFMIElOIFVNQUMgZm9yIFBSSU1BICovCisjaWYgIWRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApIAorICAvLyBDYWxsIEhBTCBBUEkgdG8gdHJpZ2dlciBkZWxldGlvbiBvZiBCQSBkdWUgdG8gdGltZW91dAorICAodm9pZCloYWxNc2dfUG9zdEJBRGVsZXRlSW5kKCBwTWFjLCAodEFOSV9VMTYpIGFyZzEsICh0QU5JX1U4KSBhcmcyLCAodEFOSV9VOCkgYXJnMywKKyAgICAgICAgIEhBTF9CQV9FUlJfVElNRU9VVCApOworI2VuZGlmCisKKyAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwKKyAgICAgICJcbiVzOiBBdHRlbXB0ZWQgdG8gdHJpZ2dlciBhIEJBIFRpbWVvdXQgSW5kIHRvIFNUQSBJbmRleCAlZCwgZm9yIFRJRCAlZCwgRGlyZWN0aW9uICVkXG4iLAorICAgICAgX19GVU5DVElPTl9fLAorICAgICAgYXJnMSwgLy8gU1RBIGluZGV4CisgICAgICBhcmcyLCAvLyBUSUQKKyAgICAgIGFyZzMgKTsgLy8gQkEgRGlyZWN0aW9uCisKKyAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX2xpc3RfYWN0aXZlX2JhKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQorewordEFOSV9VMzIgaTsKK3RwRHBoSGFzaE5vZGUgcFN0YTsKKworLy9UQkQtUkFKRVNIIEhPVyBUTyBHRVQgc2Vzc2lvbkVudHJ5Pz8/Pz8KKwordHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9ICZwTWFjLT5saW0uZ3BTZXNzaW9uWzBdOyAgLy9UQkQtUkFKRVNICisKKyAgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKworICAvLyBHZXQgRFBIIFN0YSBlbnRyeSBmb3IgdGhpcyBBU1NPQyBJRAorICBwU3RhID0gZHBoR2V0SGFzaEVudHJ5KCBwTWFjLCAodEFOSV9VMTYpIGFyZzEsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgaWYoIE5VTEwgPT0gcFN0YSApCisgIHsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLAorICAgICAgICAiXG4lczogQ291bGQgbm90IGZpbmQgZW50cnkgaW4gRFBIIHRhYmxlIGZvciBhc3NvY0lkID0gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgYXJnMSApOworICB9CisgIGVsc2UKKyAgeworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsCisgICAgICAgICJcbkxpc3Qgb2YgQWN0aXZlIEJBIHNlc3Npb25zIGZvciBTVEEgSW5kZXggJWQgd2l0aCBBc3NvYyBJRCAlZFxuIiwKKyAgICAgICAgcFN0YS0+c3RhSW5kZXgsCisgICAgICAgIGFyZzEgKTsKKworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJUSURcdFJ4QkFcdFR4QkFcdFJ4QnVmZmVyU2l6ZVx0VHhCdWZmZXJTaXplXHRSeEJBVGltZW91dFx0VHhCQVRpbWVvdXRcbiIpOworICAgIGZvciggaSA9IDA7IGkgPCBTVEFDRkdfTUFYX1RDOyBpICsrICkKKyAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsCisgICAgICAgICAgIiVkXHQlZFx0JWRcdCVkXHQlZFx0JWRcdCVkXG4iLAorICAgICAgICAgIGksIC8vIFRJRAorICAgICAgICAgIHBTdGEtPnRjQ2ZnW2ldLmZVc2VCQVJ4LAorICAgICAgICAgIHBTdGEtPnRjQ2ZnW2ldLmZVc2VCQVR4LAorICAgICAgICAgIHBTdGEtPnRjQ2ZnW2ldLnJ4QnVmU2l6ZSwKKyAgICAgICAgICBwU3RhLT50Y0NmZ1tpXS50eEJ1ZlNpemUsCisgICAgICAgICAgcFN0YS0+dGNDZmdbaV0udHVSeEJBV2FpdFRpbWVvdXQsCisgICAgICAgICAgcFN0YS0+dGNDZmdbaV0udHVUeEJBV2FpdFRpbWVvdXQgKTsKKyAgfQorCisgIHJldHVybiBwOworfQorCisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX0FkZEJBX0RlY2xpbmVTdGF0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworCisgICAgaW50IFRpZCwgRW5hYmxlPShhcmcxICYgMHgxKTsKKyAgICB0QU5JX1U4IHZhbDsKKworICAgIGlmIChhcmcxID4gMSkgeworICAgICAgICBsb2dfc3ByaW50ZiggcE1hYyxwLCAiJXM6SW52YWxpZCBWYWx1ZSBpcyBlbnRlcmVkIGZvciBFbmFibGUvRGlzYWJsZSBcbiIsIF9fRlVOQ1RJT05fXyApOworICAgICAgICBhcmcxICY9IDE7CisgICAgfSAgICAgICAKKyAgICAKKyAgICB2YWwgPSBwTWFjLT5saW0uZ0FkZEJBX0RlY2xpbmVkOworICAgIAorICAgIGlmIChhcmcyID4gNykgeworICAgICAgICBsb2dfc3ByaW50ZiggcE1hYyxwLCAiJXM6SW52YWxpZCBWYWx1ZSBpcyBlbnRlcmVkIGZvciBUaWQgXG4iLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgICAgVGlkID0gYXJnMiAmIDB4NzsKKyAgICB9IGVsc2UKKyAgICAgICAgVGlkID0gYXJnMjsKKyAgICAKKyAgICAKKyAgICBpZiAoIEVuYWJsZSkKKyAgICAgICAgdmFsICB8PSBFbmFibGUgPDwgVGlkOworICAgIGVsc2UKKyAgICAgICAgdmFsICY9ICB+KDB4MSA8PCBUaWQpOworCisgICAgaWYgKGNmZ1NldEludChwTWFjLCAodEFOSV9VMTYpV05JX0NGR19BRERCQV9SRVFfREVDTElORSwgKHRBTklfVTMyKSB2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICBsb2dfc3ByaW50ZiggcE1hYyxwLCAiJXM6Q29uZmlnIFNldCBmb3IgQUREQkEgUkVRIERlY2xpbmUgaGFzIGZhaWxlZCBcbiIsIF9fRlVOQ1RJT05fXyApOworCisgICAgIGxvZ19zcHJpbnRmKCBwTWFjLHAsICIlczpEZWNsaW5lIHZhbHVlICVkIGlzIGJlaW5nIHNldCBmb3IgVElEICVkICxcbiBcdEFkZEJBX0RlY2xpbmUgQ2ZnIHZhbHVlIGlzICVkIFxuIiwgX19GVU5DVElPTl9fICwgYXJnMSwgVGlkLCAoaW50KSB2YWwpOworCisgICAgIHJldHVybiBwOworfQorc3RhdGljIGNoYXIgKgorZHVtcF9saW1fc2V0X2RvdDExX21vZGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0mcE1hYy0+bGltLmdwU2Vzc2lvblswXTsgIC8vVEJELVJBSkVTSCBIT1cgVE8gR0VUIHNlc3Npb25FbnRyeT8/Pz8/CisgICAgZHVtcF9jZmdfc2V0KHBNYWMsIFdOSV9DRkdfRE9UMTFfTU9ERSwgYXJnMSwgYXJnMiwgYXJnMywgcCk7CisgICAgaWYgKCAobGltR2V0U3lzdGVtUm9sZShwc2Vzc2lvbkVudHJ5KSA9PSBlTElNX0FQX1JPTEUpIHx8CisgICAgICAgICAgKGxpbUdldFN5c3RlbVJvbGUocHNlc3Npb25FbnRyeSkgPT0gZUxJTV9TVEFfSU5fSUJTU19ST0xFKSkKKyAgICAgICAgc2NoU2V0Rml4ZWRCZWFjb25GaWVsZHMocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJUaGUgRG90MTEgTW9kZSBpcyBzZXQgdG8gJXMiLCBsaW1Eb3QxMU1vZGVTdHIocE1hYywgKHRBTklfVTgpcHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSk7CisgICAgcmV0dXJuIHA7Cit9CisKKworc3RhdGljIGNoYXIqIGR1bXBfbGltX3VwZGF0ZV9jYl9Nb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgdEFOSV9VMzIgbG9jYWxQd3JDb25zdHJhaW50OworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSAmcE1hYy0+bGltLmdwU2Vzc2lvblswXTsgIC8vVEJELVJBSkVTSCBIT1cgVE8gR0VUIHNlc3Npb25FbnRyeT8/Pz8/CisgICAgCisgICAgaWYgKCAhcE1hYy0+bGltLmh0Q2FwYWJpbGl0eSApCisgICAgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJFcnJvcjogRG90MTEgbW9kZSBpcyBub24tSFQsIGNhbiBub3QgY2hhbmdlIHRoZSBDQiBtb2RlLlxuIik7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKyAgICAKKyAgICBwTWFjLT5saW0uZ0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IGFyZzE7CisgICAgc2V0dXBDQlN0YXRlKHBNYWMsICBsaW1HZXRBbmlDQlN0YXRlKHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0KSk7CisKKyAgICBpZihlU0lSX1NVQ0NFU1MgIT0gY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREUsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEgPyBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0VOQUJMRSA6IFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRSkpCisgICAgICAgIHAgKz0gbG9nX3NwcmludGYocE1hYyxwLCAiY2ZnU2V0SW50IGZhaWxlZCBmb3IgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERVxuIik7CisgICAgCisgICAgd2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5ULCAmbG9jYWxQd3JDb25zdHJhaW50KTsKKyAgICAgICAgCisgICAgbGltU2VuZFN3aXRjaENobmxQYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsLCBwTWFjLT5saW0uZ0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0UG93ZXJkQm0pIGxvY2FsUHdyQ29uc3RyYWludCwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworICAgIGlmICggKGxpbUdldFN5c3RlbVJvbGUocHNlc3Npb25FbnRyeSkgPT0gZUxJTV9BUF9ST0xFKSB8fAorICAgICAgICAgIChsaW1HZXRTeXN0ZW1Sb2xlKHBzZXNzaW9uRW50cnkpID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkpCisgICAgICAgICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgcmV0dXJuIHA7CisgICAgCit9CisKK3N0YXRpYyBjaGFyKiBkdW1wX2xpbV9hYm9ydF9zY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgKHZvaWQpIGFyZzE7ICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgLy9jc3JTY2FuQWJvcnRNYWNTY2FuKHBNYWMpOworICAgIHJldHVybiBwOworICAgIAorfQorCitzdGF0aWMgY2hhciogZHVtcF9saW1fc3RhcnRfc3RvcF9iZ19zY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKworIGlmIChUWF9USU1FUl9WQUxJRChwTWFjLT5saW0ubGltVGltZXJzLmdMaW1CYWNrZ3JvdW5kU2NhblRpbWVyKSkKKyB7CisgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0JBQ0tHUk9VTkRfU0NBTl9USU1FUik7CisgfQorCisgaWYoYXJnMSA9PSAxKQorIHsKKyAgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1CYWNrZ3JvdW5kU2NhblRpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgICB7CisgICAgICAgICBwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuVGVybWluYXRlID0gVFJVRTsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5UZXJtaW5hdGUgPSBGQUxTRTsKKyAgICAgICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5EaXNhYmxlID0gZmFsc2U7CisgICAgICAgICBwTWFjLT5saW0uZ0xpbUZvcmNlQmFja2dyb3VuZFNjYW5EaXNhYmxlID0gZmFsc2U7CisgICAgIH0KKyB9CisgZWxzZQorIHsKKyAgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhblRlcm1pbmF0ZSA9IFRSVUU7CisgICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5DaGFubmVsSWQgPSAwOworICAgICBwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuRGlzYWJsZSA9IHRydWU7CisgICAgIHBNYWMtPmxpbS5nTGltRm9yY2VCYWNrZ3JvdW5kU2NhbkRpc2FibGUgPSB0cnVlOworIH0KKyAgICByZXR1cm4gcDsKKyAgICAKK30KKworc3RhdGljIGNoYXIqIAorZHVtcF9saW1fZ2V0X3BlX3N0YXRpc3RpY3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdHBBbmlHZXRQRVN0YXRzUmVxIHBSZXE7CisgICAgdEFOSV9VMzIgc3RhdHNNYXNrOworCisgICAgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKworICAgIAorICAgIHN3aXRjaChhcmcxKQorICAgIHsgICAgICAgIAorICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzdGF0c01hc2sgPSBQRV9TVU1NQVJZX1NUQVRTX0lORk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgc3RhdHNNYXNrID0gUEVfR0xPQkFMX0NMQVNTX0FfU1RBVFNfSU5GTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBzdGF0c01hc2sgPSBQRV9HTE9CQUxfQ0xBU1NfQl9TVEFUU19JTkZPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHN0YXRzTWFzayA9IFBFX0dMT0JBTF9DTEFTU19DX1NUQVRTX0lORk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgc3RhdHNNYXNrID0gUEVfUEVSX1NUQV9TVEFUU19JTkZPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICB9CisgICAgCisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSAoc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkgKHBNYWMtPmhIZGQsICh2b2lkKiopICZwUmVxLCBzaXplb2YodEFuaUdldFBFU3RhdHNSZXEpKSkpCisgICAgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJFcnJvcjogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeS5cbiIpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLCBwUmVxLCBzaXplb2YoKnBSZXEpKTsKKyAgICAKKyAgICBwUmVxLT5tc2dUeXBlID0gZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUkVROworICAgIHBSZXEtPnN0YXRzTWFzayA9IHN0YXRzTWFzazsKKyAgICBwUmVxLT5zdGFJZCA9ICh0QU5JX1UxNilhcmcyOworCisgICAgcE1hYy0+bGltLmdMaW1Sc3BSZXFkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywgZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUkVRLCAodEFOSV9VMzIgKikgcFJlcSk7CisgICAgCisgICAgcmV0dXJuIHA7CisgICAgCit9CisKK2V4dGVybiBjaGFyKiBzZXRMT0dMZXZlbCggdHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCwgdEFOSV9VMzIgbW9kdWxlLCB0QU5JX1UzMiBsZXZlbCApOworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fc2V0X2xvZ19sZXZlbCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICBwID0gc2V0TE9HTGV2ZWwocE1hYywgcCwgYXJnMSwgYXJnMik7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX3VwZGF0ZV9sb2dfbGV2ZWwoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgdm9zX3RyYWNlX3NldExldmVsKCBhcmcxLCBhcmcyICk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX3NjYW5fcmVxX3NlbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzE7ICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgcCA9IHNlbmRTbWVTY2FuUmVxKHBNYWMsIHApOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX2xpbV9zZW5kX3N0YXJ0X2Jzc19yZXEoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzE7ICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgcCA9IHNlbmRTbWVTdGFydEJzc1JlcShwTWFjLCBwLGFyZzEpOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX2xpbV9zZW5kX2pvaW5fcmVxKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgIHAgPSBzZW5kU21lSm9pblJlcShwTWFjLCBwKTsgCisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX3NlbmRfZGlzYXNzb2NfcmVxKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworCisgICAgcCA9IHNlbmRTbWVEaXNBc3NvY1JlcShwTWFjLCBwLCBhcmcxICxhcmcyKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fc3RvcF9ic3NfcmVxKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgcCA9IHNlbmRTbWVTdG9wQnNzUmVxKHBNYWMsIHAsIGFyZzEpOworICAgIHJldHVybiBwOworfQorCisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX3Nlc3Npb25fcHJpbnQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzE7ICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgcCA9IHByaW50U2Vzc2lvbkluZm8ocE1hYywgcCk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX3NtZV9yZWFzc29jX3JlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQgPSBhcmcxOworICAgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyBtb2RpZnlQcm9maWxlRmllbGRzOworICAgIHRBTklfVTMyIHJvYW1JZDsKKworICAgICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisKKyAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICB7CisgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICkpKQorICAgICAgeworICAgICAgICBjc3JHZXRNb2RpZnlQcm9maWxlRmllbGRzKHBNYWMsIHNlc3Npb25JZCwgJm1vZGlmeVByb2ZpbGVGaWVsZHMpOworICAgICAgICBjc3JSZWFzc29jKCBwTWFjLCBzZXNzaW9uSWQsICZtb2RpZnlQcm9maWxlRmllbGRzLCAmcm9hbUlkLCAwKTsKKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJJbnZhbGlkIHNlc3Npb24gPSAlZFxuIiwgc2Vzc2lvbklkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fZG90MTFoX3N0YXRzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworCisgICAgcCArPSBsb2dfc3ByaW50ZihwTWFjLCBwLCAiMTFoIEVuYWJsZWQgPSAlc1xuIiwgcE1hYy0+bGltLmdMaW0xMWhFbmFibGU/ICJUUlVFIjogIkZBTFNFIik7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIk1lYXN1cmVtZW50IHJlcXVlc3QgaXNzdWVkIGJ5IFdTTSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5ncExpbU1lYXNSZXEgIT0gTlVMTCk/ICJJU1NVRUQiOiAiTk9UIElTU1VFRCIpOworICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIk1lYXN1cmVtZW50IHJlcXVlc3QgZGV0YWlscy4uLlxuIik7CisgICAgaWYgKHBNYWMtPmxpbS5ncExpbU1lYXNSZXEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIm51bUNoYW5uZWxzID0gJWQsIHBlcmlvZGljTWVhc0VuYWJsZWQgPSAlZCwgbWVhc0luZFBlcmlvZCA9ICVkLCIKKyAgICAgICAgICAgICJzaG9ydFRlcm1QZXJpb2QgPSAlZCwgYXZlcmFnaW5nUGVyaW9kID0gJWQsIHNob3J0Q2hhbm5lbFNjYW5EdXJhdGlvbiA9ICVkLCIKKyAgICAgICAgICAgICJsb25nQ2hhbm5lbFNjYW5EdXJhdGlvbiA9ICVkLCBTWVNfVElDS19EVVJfTVMgPSAlZFxuIiwKKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzLCBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5tZWFzQ29udHJvbC5wZXJpb2RpY01lYXNFbmFibGVkLAorICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0luZFBlcmlvZCwgcE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0R1cmF0aW9uLnNob3J0VGVybVBlcmlvZCwKKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNEdXJhdGlvbi5hdmVyYWdpbmdQZXJpb2QsCisgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5tZWFzRHVyYXRpb24uc2hvcnRDaGFubmVsU2NhbkR1cmF0aW9uLAorICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0R1cmF0aW9uLmxvbmdDaGFubmVsU2NhbkR1cmF0aW9uLCBTWVNfVElDS19EVVJfTVMgKTsKKworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICJNZWFzdXJlbWVudCBjaGFubmVscy4uLlxuIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVsczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICIlZCAiLCBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5jaGFubmVsTGlzdC5jaGFubmVsTnVtYmVyW2ldKTsKKyAgICAgICAgfQorICAgICAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICJcbiIpOworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICJUb3RhbCBOdW1iZXIgb2YgQlNTIGxlYXJuZWQgPSAlZFxuIiwgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPm51bUJzc1dkcyk7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIlRvdGFsIE51bWJlciBvZiBDaGFubmVscyBsZWFybmVkID0gJWRcbiIsIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5udW1NYXRyaXhOb2Rlcyk7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIkR1cmF0aW9uIG9mIGxlYXJuaW5nID0gJWRcbiIsIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5kdXJhdGlvbik7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIklzIG1lYXN1cmVtZW50IEluZGljYXRpb24gdGltZXIgYWN0aXZlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5pc01lYXNJbmRUaW1lckFjdGl2ZSk/IllFUyI6ICJOTyIpOworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICJOZXh0IGxlYXJuIGNoYW5uZWwgSWQgPSAlZFxuIiwgcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLm5leHRMZWFybkNoYW5uZWxJZCk7CisgICAgfQorICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIk1lYXN1cmVtZW50IHJ1bm5pbmcgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnN5cy5nU3lzRW5hYmxlTGVhcm5Nb2RlPyJUUlVFIjogIkZBTFNFIik7CisjZW5kaWYKKyAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICJJcyBzeXN0ZW0gaW4gbGVhcm4gbW9kZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TeXN0ZW1JblNjYW5MZWFybk1vZGU/IllFUyI6ICJOTyIpOworICAgIAorICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIlF1aWV0IEVuYWJsZWQgPSAlc1xuIiwgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZlF1aWV0RW5hYmxlZCk/IllFUyI6ICJOTyIpOworICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIlF1aWV0IHN0YXRlID0gJWRcbiIsIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSk7CisgICAgcCArPSBsb2dfc3ByaW50ZihwTWFjLCBwLCAiUXVpZXQgQ291bnQgPSAlZFxuIiwgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldENvdW50KTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICJRdWlldCBEdXJhdGlvbiBpbiB0aWNrcyA9ICVkXG4iLCBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0RHVyYXRpb24pOworICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIlF1aWV0IER1cmF0aW9uIGluIFRVID0gJWRcbiIsIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXREdXJhdGlvbl9UVSk7CisgICAgCisgICAgcCArPSBsb2dfc3ByaW50ZihwTWFjLCBwLCAiQ2hhbm5lbCBzd2l0Y2ggc3RhdGUgPSAlZFxuIiwgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5kb3QxMWhDaGFuU3dTdGF0ZSk7CisgICAgcCArPSBsb2dfc3ByaW50ZihwTWFjLCBwLCAiQ2hhbm5lbCBzd2l0Y2ggbW9kZSA9ICVzXG4iLAorICAgICAgICAgICAgKHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hNb2RlID09IGVTSVJfQ0hBTlNXX01PREVfU0lMRU5UKT8iU0lMRU5UIjogIk5PUk1BTCIpOworICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIkNoYW5uZWwgc3dpdGNoIHByaW1hcnkgY2hhbm5lbCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnByaW1hcnlDaGFubmVsKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICJDaGFubmVsIHN3aXRjaCBzZWNvbmRhcnkgc3ViIGJhbmQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zZWNvbmRhcnlTdWJCYW5kKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICJDaGFubmVsIHN3aXRjaCBzd2l0Y2ggY291bnQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hDb3VudCk7CisgICAgcCArPSBsb2dfc3ByaW50ZihwTWFjLCBwLCAiQ2hhbm5lbCBzd2l0Y2ggc3dpdGNoIHRpbWVvdXQgdmFsdWUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hUaW1lb3V0VmFsdWUpOworCisgICAgcCArPSBsb2dfc3ByaW50ZihwTWFjLCBwLCAiUmFkYXIgaW50ZXJydXB0IGNvbmZpZ3VyZWQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZlJhZGFySW50ckNvbmZpZ3VyZWQ/IllFUyI6ICJOTyIpOworICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIlJhZGFyIGRldGVjdGVkIGluIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZlJhZGFyRGV0Q3VyT3BlckNoYW4/IllFUyI6ICJOTyIpOworICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIlJhZGFyIGRldGVjdGVkIGNoYW5uZWxzLi4uXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcE1hYy0+c3lzLnJhZGFyRGV0ZWN0Q291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIiVkICIsIHBNYWMtPnN5cy5kZXRSYWRhckNoSWRzW2ldKTsKKyAgICB9CisgICAgcCArPSBsb2dfc3ByaW50ZihwTWFjLCBwLCAiXG4iKTsKKyAgICAKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fZW5hYmxlX21lYXN1cmVtZW50KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisKKyAgICBpZiAoYXJnMSkKKyAgICB7CisgICAgICAgIHBNYWMtPnN5cy5nU3lzRW5hYmxlTGVhcm5Nb2RlID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIk1lYXN1cmVtZW50IGVuYWJsZWRcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwTWFjLT5zeXMuZ1N5c0VuYWJsZUxlYXJuTW9kZSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZihwTWFjLCBwLCAiTWVhc3VyZW1lbnQgZGlzYWJsZWRcbiIpOworICAgIH0KKworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX2xpbV9lbmFibGVfcXVpZXRJRSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworCisgICAgaWYgKGFyZzEpCisgICAgeworICAgICAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LmZRdWlldEVuYWJsZWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZihwTWFjLCBwLCAiUXVpZXRJRSBlbmFibGVkXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5mUXVpZXRFbmFibGVkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICJRdWlldElFIGRpc2FibGVkXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fZGlzYWJsZV9lbmFibGVfc2NhbiggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworCisgICAgaWYgKGFyZzEpCisgICAgeworICAgICAgICBwTWFjLT5saW0uZlNjYW5EaXNhYmxlZCA9IDE7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgIlNjYW4gZGlzYWJsZWRcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwTWFjLT5saW0uZlNjYW5EaXNhYmxlZCA9IDA7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYocE1hYywgcCwgInNjYW4gZW5hYmxlZFxuIik7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICpmaW5pc2hTY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGNoYXIgKnApCit7CisgICAgdFNpck1zZ1EgICAgICAgICBtc2c7CisKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJsb2dEdW1wIGZpbmlzaFNjYW4gXG4iKTsKKworICAgIG1zZy50eXBlID0gU0lSX0xJTV9NSU5fQ0hBTk5FTF9USU1FT1VUOworICAgIG1zZy5ib2R5dmFsID0gMDsKKyAgICBtc2cuYm9keXB0ciA9IE5VTEw7CisgICAgCisgICAgbGltUG9zdE1zZ0FwaShwTWFjLCAmbXNnKTsKKyAgICByZXR1cm4gcDsKK30KKworCitzdGF0aWMgY2hhciAqCitkdW1wX2xpbV9pbmZvKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgIHAgPSBkdW1wTGltKCBwTWFjLCBwICk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX2ZpbmlzaHNjYW5fc2VuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICAodm9pZCkgYXJnMTsgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKyAgICBwID0gZmluaXNoU2NhbihwTWFjLCBwKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fcHJiX3JzcF9zZW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgIHAgPSB0ZXN0TGltU2VuZFByb2JlUnNwKCBwTWFjLCBwICk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfc2NoX2JlYWNvbl90cmlnZ2VyKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgIHAgPSB0cmlnZ2VyQmVhY29uR2VuKHBNYWMsIHApOworICAgIHJldHVybiBwOworfQorCisKK3N0YXRpYyBjaGFyKiBkdW1wX2xpbV90cmFjZV9jZmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICBNVFJBQ0UobWFjVHJhY2VDZmcocE1hYywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7KQorICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciogZHVtcF9saW1fdHJhY2VfZHVtcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgIE1UUkFDRShtYWNUcmFjZUR1bXBBbGwocE1hYywgKHRBTklfVTgpYXJnMSwgKHRBTklfVTgpYXJnMiwgYXJnMyk7KQorICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciogZHVtcF9saW1fc2V0X3NjYW5faW5fcG93ZXJzYXZlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgImxvZ0R1bXAgc2V0IHNjYW4gaW4gcG93ZXJzYXZlIHRvICVkIFxuIiwgYXJnMSk7CisgICAgZHVtcF9jZmdfc2V0KHBNYWMsIFdOSV9DRkdfU0NBTl9JTl9QT1dFUlNBVkUsIGFyZzEsIGFyZzIsIGFyZzMsIHApOworICAgIHJldHVybiBwOworfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCitzdGF0aWMgY2hhciAqCitkdW1wX2xpbV9zZW5kX3JybV9hY3Rpb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKyAgICB0U2lyTWFjUmFkaW9NZWFzdXJlUmVwb3J0IHBSUk1SZXBvcnRbNF07CisgICAgdEFOSV9VOCBudW0gPSAodEFOSV9VOCkoYXJnNCA+IDQgPyA0IDogYXJnNCk7CisgICAgdEFOSV9VOCBpOworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywodEFOSV9VOClhcmcyKSApPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwiU2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbiBJZCAgXG4iKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorICAgIHN3aXRjaCAoYXJnMykKKyAgICB7CisgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgIC8qIHNlbmQgdHdvIHJlcG9ydHMgd2l0aCBpbmNhcGFibGUgYml0IHNldCAqLworICAgICAgICAgICAgICBwUlJNUmVwb3J0WzBdLnR5cGUgPSA2OworICAgICAgICAgICAgICBwUlJNUmVwb3J0WzFdLnR5cGUgPSA3OworICAgICAgICAgICAgICBsaW1TZW5kUmFkaW9NZWFzdXJlUmVwb3J0QWN0aW9uRnJhbWUoIHBNYWMsIDEsIDIsICZwUlJNUmVwb3J0WzBdLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgcHNlc3Npb25FbnRyeSApOyAKKyAgICAgICAgICAgICAgYnJlYWs7ICAgICAKKyAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgbnVtIDsgaSsrICkgCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBwUlJNUmVwb3J0W2ldLnR5cGUgPSA1OworICAgICAgICAgICAgICAgICAgIGlmICggaSA9PSAzICkKKyAgICAgICAgICAgICAgICAgICBwUlJNUmVwb3J0W2ldLnJlZnVzZWQgPSAxOworICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICBwUlJNUmVwb3J0W2ldLnJlZnVzZWQgPSAwOworCisgICAgICAgICAgICAgICAgICAgcFJSTVJlcG9ydFtpXS5yZXBvcnQuYmVhY29uUmVwb3J0LnJlZ0NsYXNzID0gMzI7CisgICAgICAgICAgICAgICAgICAgcFJSTVJlcG9ydFtpXS5yZXBvcnQuYmVhY29uUmVwb3J0LmNoYW5uZWwgPSBpOworICAgICAgICAgICAgICAgICAgIHBSUk1SZXBvcnRbaV0ucmVwb3J0LmJlYWNvblJlcG9ydC5tZWFzRHVyYXRpb24gPSAyMzsKKyAgICAgICAgICAgICAgICAgICBwUlJNUmVwb3J0W2ldLnJlcG9ydC5iZWFjb25SZXBvcnQucGh5VHlwZSA9IGkgPDwgNDsgLy9zb21lIHZhbHVlLgorICAgICAgICAgICAgICAgICAgIHBSUk1SZXBvcnRbaV0ucmVwb3J0LmJlYWNvblJlcG9ydC5iY25Qcm9iZVJzcCA9IDE7CisgICAgICAgICAgICAgICAgICAgcFJSTVJlcG9ydFtpXS5yZXBvcnQuYmVhY29uUmVwb3J0LnJzbmkgPSAxMDsKKyAgICAgICAgICAgICAgICAgICBwUlJNUmVwb3J0W2ldLnJlcG9ydC5iZWFjb25SZXBvcnQucmNwaSA9IDQwOworCisgICAgICAgICAgICAgICAgICAgcFJSTVJlcG9ydFtpXS5yZXBvcnQuYmVhY29uUmVwb3J0LmJzc2lkWzBdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICBwUlJNUmVwb3J0W2ldLnJlcG9ydC5iZWFjb25SZXBvcnQuYnNzaWRbMV0gPSAweEFBOyAKKyAgICAgICAgICAgICAgICAgICBwUlJNUmVwb3J0W2ldLnJlcG9ydC5iZWFjb25SZXBvcnQuYnNzaWRbMl0gPSAweEJCOworICAgICAgICAgICAgICAgICAgIHBSUk1SZXBvcnRbaV0ucmVwb3J0LmJlYWNvblJlcG9ydC5ic3NpZFszXSA9IDB4Q0M7CisgICAgICAgICAgICAgICAgICAgcFJSTVJlcG9ydFtpXS5yZXBvcnQuYmVhY29uUmVwb3J0LmJzc2lkWzRdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICBwUlJNUmVwb3J0W2ldLnJlcG9ydC5iZWFjb25SZXBvcnQuYnNzaWRbNV0gPSAweDAxIDw8IGk7CisKKworICAgICAgICAgICAgICAgICAgIHBSUk1SZXBvcnRbaV0ucmVwb3J0LmJlYWNvblJlcG9ydC5hbnRlbm5hSWQgPSAxMDsKKyAgICAgICAgICAgICAgICAgICBwUlJNUmVwb3J0W2ldLnJlcG9ydC5iZWFjb25SZXBvcnQucGFyZW50VFNGID0gMHgxMjM0OworCisgICAgICAgICAgICAgICAgICAgcFJSTVJlcG9ydFtpXS5yZXBvcnQuYmVhY29uUmVwb3J0Lm51bUllcyA9IGkgKiAxMDsKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGo7CisgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHBSUk1SZXBvcnRbaV0ucmVwb3J0LmJlYWNvblJlcG9ydC5udW1JZXMgOyBqKysgKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBwUlJNUmVwb3J0W2ldLnJlcG9ydC5iZWFjb25SZXBvcnQuSWVzW2pdID0gaiArIGk7IC8vSnVuayB2YWx1ZXMuCisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxpbVNlbmRSYWRpb01lYXN1cmVSZXBvcnRBY3Rpb25GcmFtZSggcE1hYywgMSwgbnVtLCAmcFJSTVJlcG9ydFswXSwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHBzZXNzaW9uRW50cnkgKTsgCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAvL3NlbmQgTmVpZ2hib3IgcmVxdWVzdC4KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHRTaXJNYWNOZWlnaGJvclJlcG9ydFJlcSBuZWlnaGJvcjsKKyAgICAgICAgICAgICAgICAgICBuZWlnaGJvci5kaWFsb2dUb2tlbiA9IDI7CisgICAgICAgICAgICAgICAgICAgbmVpZ2hib3Iuc3NpZF9wcmVzZW50ID0gKHRBTklfVTgpIGFyZzQ7CisgICAgICAgICAgICAgICAgICAgbmVpZ2hib3Iuc3NpZC5sZW5ndGggPSA1OworICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIG5laWdoYm9yLnNzaWQuc3NJZCwgImFiY2RlIiwgNSk7CisKKyAgICAgICAgICAgICAgICAgICBsaW1TZW5kTmVpZ2hib3JSZXBvcnRSZXF1ZXN0RnJhbWUoIHBNYWMsICZuZWlnaGJvciwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHBzZXNzaW9uRW50cnkgKTsKKworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgIC8vc2VuZCBMaW5rIG1lYXN1cmUgcmVwb3J0LgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB0U2lyTWFjTGlua1JlcG9ydCBsaW5rOworICAgICAgICAgICAgICAgICAgbGluay5kaWFsb2dUb2tlbiA9IDQ7CisgICAgICAgICAgICAgICAgICBsaW5rLnR4UG93ZXIgPSAzNDsKKyAgICAgICAgICAgICAgICAgIGxpbmsucnhBbnRlbm5hID0gMjsKKyAgICAgICAgICAgICAgICAgIGxpbmsudHhBbnRlbm5hID0gMTsKKyAgICAgICAgICAgICAgICAgIGxpbmsucmNwaSA9IDk7CisgICAgICAgICAgICAgICAgICBsaW5rLnJzbmkgPSAzOworICAgICAgICAgICAgICAgICAgbGltU2VuZExpbmtSZXBvcnRBY3Rpb25GcmFtZSggcE1hYywgJmxpbmssIHBzZXNzaW9uRW50cnktPmJzc0lkLCBwc2Vzc2lvbkVudHJ5ICk7IAorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBwOyAgICAKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fdW5wYWNrX3JybV9hY3Rpb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICB0cFBFU2Vzc2lvbiAgcHNlc3Npb25FbnRyeTsKKyAgIHRBTklfVTMyICAgICBzdGF0dXM7CisKKyAgIHRBTklfVTggc2l6ZVtdID0geworICAgICAgMHgyQywKKyAgICAgIDB4MkYsCisgICAgICAweDI1LAorICAgICAgMHgyQywKKyAgICAgIDB4MUMsCisgICAgICAweDA1CisgICB9OworCisgICB0QU5JX1U4IHBCb2R5W11bMTAwXSA9IHsKKyAgICAgIHsKKyAgICAgICAgIC8qQmVhY29uIFJlcXVlc3QgMCovCisgICAgICAweDA1LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAKKyAgICAgIC8vTWVhc3VyZW1lbnQgcmVxdWVzdCBJRQorICAgICAgMHgyNiwgMHgyNSwgMHgwMSwgMHgwMCwgCisgICAgICAvL0JlYWNvbiByZXF1ZXN0IHR5cGUKKyAgICAgIDB4MDUsCisgICAgICAvL0JlYWNvbiByZXF1ZXN0IHN0YXJ0cyBoZXJlCisgICAgICAweDBDLCAweDAxLCAweDMwLCAweDAwLCAweDE0LCAweDAwLCAweDAxLAorICAgICAgLy9CU1NJRAorICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhmZiwgMHhGRiwgCisgICAgICAvL1NTSUQKKyAgICAgIDB4MDAsIDB4MDUsIDB4NTcsIDB4NjksIDB4NDYsIDB4NjksIDB4MzEsIAorICAgICAgLy9SZXBvcnRpbmcgQ29uZGl0aW9uCisgICAgICAweDAxLCAweDAyLCAweDAwLCAweDAwLAorICAgICAgLy9SZXBvcnRpbmcgRGV0YWlsCisgICAgICAweDAyLCAweDAxLCAweDEsCisgICAgICAvL1JlcXVlc3QgSUUKKyAgICAgIDB4MEEsIDB4MDUsIDB4MDAsIDB4MzAsIDB4NDYsIDB4MzYsIDB4REQKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICAvKkJlYWNvbiBSZXF1ZXN0IDEqLworICAgICAgMHgwNSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgCisgICAgICAvL01lYXN1cmVtZW50IHJlcXVlc3QgSUUKKyAgICAgIDB4MjYsIDB4MjgsIDB4MDEsIDB4MDAsIAorICAgICAgLy9CZWFjb24gcmVxdWVzdCB0eXBlCisgICAgICAweDA1LAorICAgICAgLy9CZWFjb24gcmVxdWVzdCBzdGFydHMgaGVyZQorICAgICAgMHgwQywgMHhGRiwgMHgzMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMSwKKyAgICAgIC8vQlNTSUQKKyAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ZmYsIDB4RkYsIAorICAgICAgLy9TU0lECisvKiAgICAgIDB4MDAsIDB4MDgsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4NDAsIDB4NDEsIDB4NDIsICovCisgICAgICAvL1JlcG9ydGluZyBDb25kaXRpb24KKyAgICAgIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDAsCisgICAgICAvL1JlcG9ydGluZyBEZXRhaWwKKyAgICAgIDB4MDIsIDB4MDEsIDB4MSwKKyAgICAgIC8vUmVxdWVzdCBJRQorICAgICAgMHgwQSwgMHgwNSwgMHgwMCwgMHgzMCwgMHg0NiwgMHgzNiwgMHhERCwKKyAgICAgIC8vQVAgY2hhbm5lbCByZXBvcnQKKyAgICAgIDB4MzMsIDB4MDMsIDB4MEMsIDB4MDEsIDB4MDYsICAgIAorICAgICAgMHgzMywgMHgwMywgMHgwQywgMHgyNCwgMHgzMCwgICAgCisgICAgICB9LAorICAgICAgeworICAgICAgICAgLypCZWFjb24gUmVxdWVzdCAyKi8KKyAgICAgIDB4MDUsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIAorICAgICAgLy9NZWFzdXJlbWVudCByZXF1ZXN0IElFCisgICAgICAweDI2LCAweDFFLCAweDAxLCAweDAwLCAKKyAgICAgIC8vQmVhY29uIHJlcXVlc3QgdHlwZQorICAgICAgMHgwNSwKKyAgICAgIC8vQmVhY29uIHJlcXVlc3Qgc3RhcnRzIGhlcmUKKyAgICAgIDB4MEMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDIsCisgICAgICAvL0JTU0lECisgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweGZmLCAweEZGLCAKKyAgICAgIC8vU1NJRAorICAgICAgMHgwMCwgMHgwNSwgMHg1NywgMHg2OSwgMHg0NiwgMHg2OSwgMHgzMSwgCisgICAgICAvLzB4MDAsIDB4MDgsIDB4NDEsIDB4NTMsIDB4NTQsIDB4MkQsIDB4NTcsIDB4NDEsIDB4NTAsIDB4NDksIAorICAgICAgLy9SZXBvcnRpbmcgQ29uZGl0aW9uCisgICAgICAweDAxLCAweDAyLCAweDAwLCAweDAwLAorICAgICAgLy9SZXBvcnRpbmcgRGV0YWlsCisgICAgICAweDAyLCAweDAxLCAweDAKKyAgICAgIC8vUmVxdWVzdCBJRQorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgIC8qQmVhY29uIFJlcXVlc3QgMyovCisgICAgICAweDA1LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAKKyAgICAgIC8vTWVhc3VyZW1lbnQgcmVxdWVzdCBJRQorICAgICAgMHgyNiwgMHgyNSwgMHgwMSwgMHgwMCwgCisgICAgICAvL0JlYWNvbiByZXF1ZXN0IHR5cGUKKyAgICAgIDB4MDUsCisgICAgICAvL0JlYWNvbiByZXF1ZXN0IHN0YXJ0cyBoZXJlCisgICAgICAweDBDLCAweDAxLCAweDMwLCAweDAwLCAweDY5LCAweDAwLCAweDAwLAorICAgICAgLy9CU1NJRAorICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhmZiwgMHhGRiwgCisgICAgICAvL1NTSUQKKyAgICAgIDB4MDAsIDB4MDUsIDB4NTcsIDB4NjksIDB4NDYsIDB4NjksIDB4MzEsIAorICAgICAgLy9SZXBvcnRpbmcgQ29uZGl0aW9uCisgICAgICAweDAxLCAweDAyLCAweDAwLCAweDAwLAorICAgICAgLy9SZXBvcnRpbmcgRGV0YWlsCisgICAgICAweDAyLCAweDAxLCAweDEsCisgICAgICAvL1JlcXVlc3QgSUUKKyAgICAgIDB4MEEsIDB4MDUsIDB4MDAsIDB4MzAsIDB4NDYsIDB4MzYsIDB4REQKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICAvKk5laWdoYm9yIHJlcG9ydCovCisgICAgICAweDA1LCAweDA1LCAweDAxLCAgCisgICAgICAvL01lYXN1cmVtZW50IHJlcXVlc3QgSUUKKyAgICAgIDB4MzQsIDB4MTcsICAKKyAgICAgIC8vQlNTSUQKKyAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ZmYsIDB4RkYsIAorICAgICAgLy9CU1NJRCBJTkZPbworICAgICAgMHhFRCwgMHgwMSwgMHgwMCwgMHgwMCwKKyAgICAgIC8vUmVnIGNsYXNzLCBjaGFubmVsLCBQaHkgdHlwZQorICAgICAgMHgyMCwgMHgwMSwgMHgwMiwgCisgICAgICAvL1RTRiBJbmZvCisgICAgICAweDAxLCAweDA0LCAweDAyLCAweDAwLCAweDYwLCAweDAwLAorICAgICAgLy9Db25kZW5zZWQgY291bnRyeQorICAgICAgMHgwMiwgMHgwMiwgMHg2MiwgMHg2MworICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgIC8qIExpbmsgbWVhc3VyZW1lbnQgcmVxdWVzdCAqLworICAgICAgMHgwNSwgMHgwMiwgMHgwMCwKKyAgICAgIC8vVHhwb3dlciB1c2VkCisgICAgICAweDAwLAorICAgICAgLy9NYXggVHggUG93ZXIKKyAgICAgIDB4MDAgICAKKyAgICAgIH0KKyAgIH07CisKKyAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsKHRBTklfVTgpYXJnMSkgKT09IE5VTEwpCisgICB7CisgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb24gSWQgIFxuIik7CisgICAgICByZXR1cm4gcDsKKyAgIH0KKyAgIHN3aXRjaCAoYXJnMikKKyAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCBmcm07CisgICAgICAgICAgICBpZiggKHN0YXR1cyA9IGRvdDExZlVucGFja1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0KCBwTWFjLCAmcEJvZHlbYXJnMl1bMF0sIHNpemVbYXJnMl0sICZmcm0gKSkgIT0gMCApCisgICAgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiZmFpbGVkIHRvIHVucGFjay4uLi4uc3RhdHVzID0gJXhcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBycm1Qcm9jZXNzUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QoIHBNYWMsIHBzZXNzaW9uRW50cnktPmJzc0lkLCAmZnJtLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlIGZybTsKKyAgICAgICAgICAgIHBCb2R5W2FyZzJdWzJdID0gKHRBTklfVTgpYXJnMzsgLy9EaWFsb2cgVG9rZW4KKyAgICAgICAgICAgIGlmKCAoc3RhdHVzID0gZG90MTFmVW5wYWNrTmVpZ2hib3JSZXBvcnRSZXNwb25zZSggcE1hYywgJnBCb2R5W2FyZzJdWzBdLCBzaXplW2FyZzJdLCAmZnJtICkpICE9IDAgKQorICAgICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgImZhaWxlZCB0byB1bnBhY2suLi4uLnN0YXR1cyA9ICV4XG4iLCBzdGF0dXMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgcnJtUHJvY2Vzc05laWdoYm9yUmVwb3J0UmVzcG9uc2UoIHBNYWMsICZmcm0sIHBzZXNzaW9uRW50cnkgKTsKKworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU6CisgICAgICAgICB7CisvLyBGSVhNRS4KKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgICAgICAgICB0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCBmcm07CisgICAgICAgICAgICB0SGFsQnVmRGVzYyBCZDsKKyAgICAgICAgICAgIHBCb2R5W2FyZzJdWzNdID0gKHRBTklfVTgpYXJnMzsgLy9UeFBvd2VyIHVzZWQKKyAgICAgICAgICAgIHBCb2R5W2FyZzJdWzRdID0gKHRBTklfVTgpYXJnNDsgLy9NYXggVHggcG93ZXIKKworICAgICAgICAgICAgQmQucGh5U3RhdHMwID0gMDsKKyAgICAgICAgICAgIEJkLnBoeVN0YXRzMSA9IDA7CisgICAgICAgICAgICBpZiggKHN0YXR1cyA9IGRvdDExZlVucGFja0xpbmtNZWFzdXJlbWVudFJlcXVlc3QoIHBNYWMsICZwQm9keVthcmcyXVswXSwgc2l6ZVthcmcyXSwgJmZybSApKSAhPSAwICkKKyAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJmYWlsZWQgdG8gdW5wYWNrLi4uLi5zdGF0dXMgPSAleFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHJybVByb2Nlc3NMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0KCBwTWFjLCAodEFOSV9VOCopJkJkLCAmZnJtLCBwc2Vzc2lvbkVudHJ5ICk7CisjZW5kaWYKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2OgorICAgICAgICAgeworICAgICAgICAgICAgdFBvd2VyZEJtIGxvY2FsQ29uc3RyYWludCA9ICh0UG93ZXJkQm0pIGFyZzM7CisgICAgICAgICAgICB0UG93ZXJkQm0gbWF4VHhQb3dlciA9IGNmZ0dldFJlZ3VsYXRvcnlNYXhUcmFuc21pdFBvd2VyKCBwTWFjLCBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwgKTsgCisgICAgICAgICAgICBtYXhUeFBvd2VyID0gVk9TX01JTiggbWF4VHhQb3dlciwgbWF4VHhQb3dlci1sb2NhbENvbnN0cmFpbnQgKTsKKyAgICAgICAgICAgIGlmKCBtYXhUeFBvd2VyICE9IHBzZXNzaW9uRW50cnktPm1heFR4UG93ZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcnJtU2VuZFNldE1heFR4UG93ZXJSZXEoIHBNYWMsIG1heFR4UG93ZXIsIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPm1heFR4UG93ZXIgPSBtYXhUeFBvd2VyOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIkludmFsaWQgb3B0aW9uIiApOworICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gcDsgICAgCit9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisjaWZkZWYgUlNTSV9IQUNLCisvKiBUaGlzIGR1bXAgY29tbWFuZCBpcyBuZWVkZWQgdG8gc2V0IHRoZSBSU1NJIHZhbHVlcyBpbiBUTCB3aGlsZSB0ZXN0aW5nIGhhbmRvZmYuIEhhbmRvZmYgY29kZSB3YXMgdGVzdGVkIAorICogdXNpbmcgdGhpcyBkdW1wIGNvbW1hbmQuIFdoYXRldmVyIHRoZSB2YWx1ZSBnaXZlcyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHdpbGwgYmUgY29uc2lkZXJlZCBhcyB0aGUgYXZlcmFnZSAKKyAqIFJTU0kgYnkgVEwgYW5kIGludm9rZXMgY29ycmVzcG9uZGluZyBjYWxsYmFjayByZWdpc3RlcmVkIGJ5IHRoZSBjbGllbnRzICovCitleHRlcm4gaW50IGR1bXBDbWRSU1NJOworc3RhdGljIGNoYXIgKgorZHVtcF9saW1fc2V0X3RsX2RhdGFfcGt0X3Jzc2koIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgZHVtcENtZFJTU0kgPSBhcmcxOworICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU2V0dGluZyBUTCBkYXRhIHBhY2tldCBSU1NJIHRvICVkIiksIGR1bXBDbWRSU1NJKTsKKyAgICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byB0cmlnZ2VyIEZUIFByZWF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIEFQIHdpdGggQlNTSUQgYmVsb3cgKi8KK3N0YXRpYyBjaGFyICoKK2R1bXBfbGltX2Z0X2V2ZW50KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgIHN0YXRpYyB0QU5JX1U4IG1hY0FkZHJbNl0gPSAgezB4MDAsIDB4ZGUsIDB4YWQsIDB4YWYsIDB4YWYsIDB4MDR9OworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisgICAgdFNpck1zZ1EgICAgICAgICBtc2c7CisgICAgdHBTaXJGVFByZUF1dGhSZXEgcGZ0UHJlQXV0aFJlcTsKKyAgICB0QU5JX1UxNiBhdXRoX3JlcV9sZW4gPSAwOworICAgIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSBQcm9maWxlOworCisgICAgY3NyUm9hbUNvcHlDb25uZWN0UHJvZmlsZShwTWFjLCBhcmcyLCAmUHJvZmlsZSk7CisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCh0QU5JX1U4KWFyZzIpICk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywKKyAgICAgICAgICAgIHAsIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgdXNhZ2U6IDM2MyA8MD4gc2Vzc2lvbmlkIGNoYW5uZWwgXG4iKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgc3dpdGNoIChhcmcxKQorICAgIHsKKyAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgLy8gU2VuZCBQcmUtYXV0aCBldmVudAorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJQcmVwYXJpbmcgUHJlIEF1dGggUmVxIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgICAgICAgIGF1dGhfcmVxX2xlbiA9IHNpemVvZih0U2lyRlRQcmVBdXRoUmVxKTsKKworICAgICAgICAgICAgICAgICAgIHBmdFByZUF1dGhSZXEgPSB2b3NfbWVtX21hbGxvYyhhdXRoX3JlcV9sZW4pOworICAgICAgICAgICAgICAgICAgIGlmIChwZnRQcmVBdXRoUmVxID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsIlByZSBhdXRoIGR1bXA6IHBhbEFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkIFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBwZnRQcmVBdXRoUmVxLT5wYnNzRGVzY3JpcHRpb24gPSB2b3NfbWVtX21hbGxvYyhzaXplb2YoUHJvZmlsZS5wQnNzRGVzYy0+bGVuZ3RoKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZS5wQnNzRGVzYy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgIHBmdFByZUF1dGhSZXEtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfRlRfUFJFX0FVVEhfUkVROworICAgICAgICAgICAgICAgICAgIHBmdFByZUF1dGhSZXEtPmxlbmd0aCA9IGF1dGhfcmVxX2xlbiArIHNpemVvZihQcm9maWxlLnBCc3NEZXNjLT5sZW5ndGgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZS5wQnNzRGVzYy0+bGVuZ3RoOworICAgICAgICAgICAgICAgICAgIHBmdFByZUF1dGhSZXEtPnByZUF1dGhjaGFubmVsTnVtID0gNjsgCisKKyAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopICZwZnRQcmVBdXRoUmVxLT5jdXJyYnNzSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBzZXNzaW9uRW50cnktPmJzc0lkLCA2KTsgIAorICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikgJnBmdFByZUF1dGhSZXEtPnByZUF1dGhic3NJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbWFjQWRkciwgNik7ICAKKyAgICAgICAgICAgICAgICAgICBwZnRQcmVBdXRoUmVxLT5mdF9pZXNfbGVuZ3RoID0gKHRBTklfVTE2KXBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llc19sZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAvLyBBbHNvIHNldHVwIHRoZSBtYWMgYWRkcmVzcyBpbiBzbWUgY29udGV4dC4KKyAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wcmVBdXRoYnNzSWQsIG1hY0FkZHIsIDYpOworCisgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBmdFByZUF1dGhSZXEtPmZ0X2llcywgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzX2xlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoUHJvZmlsZS5wQnNzRGVzYy0+YnNzSWQsIG1hY0FkZHIsIDYpOworCisgICAgICAgICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiXG4gLS0tLS0gTElNIERlYnVnIEluZm9ybWF0aW9uIC0tLS0tIFxuIik7CisgICAgICAgICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIiVzOiBsZW5ndGggPSAlZFxuIiwgX19GVU5DVElPTl9fLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llc19sZW5ndGgpOworICAgICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICIlczogbGVuZ3RoID0gJTAyeFxuIiwgX19GVU5DVElPTl9fLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llc1swXSk7CisgICAgICAgICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIiVzOiBBdXRoIFJlcSAlMDJ4ICUwMnggJTAyeFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwZnRQcmVBdXRoUmVxLT5mdF9pZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZ0UHJlQXV0aFJlcS0+ZnRfaWVzWzFdLCBwZnRQcmVBdXRoUmVxLT5mdF9pZXNbMl0pOworCisgICAgICAgICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIiVzOiBTZXNzaW9uICUwMnggJTAyeCAlMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzFdLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZFsyXSk7CisgICAgICAgICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIiVzOiBTZXNzaW9uICUwMnggJTAyeCAlMDJ4ICVwXG4iLCBfX0ZVTkNUSU9OX18sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmdFByZUF1dGhSZXEtPmN1cnJic3NJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZnRQcmVBdXRoUmVxLT5jdXJyYnNzSWRbMV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmdFByZUF1dGhSZXEtPmN1cnJic3NJZFsyXSwgcGZ0UHJlQXV0aFJlcSk7CisKKyAgICAgICAgICAgICAgICAgICBQcm9maWxlLnBCc3NEZXNjLT5jaGFubmVsSWQgPSAodEFOSV9VOClhcmczOworICAgICAgICAgICAgICAgICAgIHZvc19tZW1fY29weSgodm9pZCAqKXBmdFByZUF1dGhSZXEtPnBic3NEZXNjcmlwdGlvbiwgKHZvaWQgKilQcm9maWxlLnBCc3NEZXNjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZS5wQnNzRGVzYy0+bGVuZ3RoKTsgIAorCisgICAgICAgICAgICAgICAgICAgbXNnLnR5cGUgPSBlV05JX1NNRV9GVF9QUkVfQVVUSF9SRVE7CisgICAgICAgICAgICAgICAgICAgbXNnLmJvZHlwdHIgPSBwZnRQcmVBdXRoUmVxOworICAgICAgICAgICAgICAgICAgIG1zZy5ib2R5dmFsID0gMDsKKworICAgICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJsaW1Qb3N0TXNnQXBpKGVXTklfU01FX0ZUX1BSRV9BVVRIX1JFUSkgXG4iKTsKKyAgICAgICAgICAgICAgICAgICBsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHA7ICAgIAorfQorI2VuZGlmCisKK3N0YXRpYyB0RHVtcEZ1bmNFbnRyeSBsaW1NZW51RHVtcFRhYmxlW10gPSB7CisgICAgezAsICAgICAiUEUgKDMwMC00OTkpIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7MzAwLCAgICJMSU06IER1bXAgc3RhdGUocykvc3RhdGlzdGljcyIsICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfbGltX2luZm99LAorICAgIHszMDEsICAgIlBFLkxJTTogZHVtcCBUU1BFQyBUYWJsZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fdHNwZWNfdGFibGV9LAorICAgIHszMDIsICAgIlBFLkxJTTogZHVtcCBzcGVjaWZpZWQgVFNQRUMgZW50cnkgKGlkKSIsICAgICAgICAgICAgICAgZHVtcF9saW1fdHNwZWNfZW50cnl9LAorICAgIHszMDMsICAgIlBFLkxJTTogZHVtcCBFRENBIHBhcmFtcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fZWRjYV9wYXJhbXN9LAorICAgIHszMDQsICAgIlBFLkxJTTogZHVtcCBEUEggdGFibGUgc3VtbWFyeSIsICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fZHBoX3RhYmxlX3N1bW1hcnl9LAorICAgIHszMDUsICAgIlBFLkxJTTogZHVtcCBsaW5rIG1vbml0b3Igc3RhdHMiLCAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fbGlua19tb25pdG9yX3N0YXRzfSwKKyAgICB7MzA2LCAgICJQRS5MSU06ZHVtcCBTZXQgdGhlIEJBUiBEZWNsaW5lIHN0YXQoYXJnMT0gMS8wIChlbmFibGUvZGlzYWJsZSkgYXJnMiA9VElEIiwgICAgICAgICAgZHVtcF9saW1fQWRkQkFfRGVjbGluZVN0YXR9LAorICAgIHszMDcsICAgIlBFOiBMSU06IGR1bXAgQ1NSIFNlbmQgUmVBc3NvY1JlcSIsICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fc21lX3JlYXNzb2NfcmVxfSwKKyAgICB7MzA4LCAgICJQRTpMSU06IGR1bXAgYWxsIDExSCByZWxhdGVkIGRhdGEiLCAgICAgICAgICAgICAgICAgICAgIGR1bXBfbGltX2RvdDExaF9zdGF0c30sCisgICAgezMwOSwgICAiUEU6TElNOiBkdW1wIHRvIGVuYWJsZSBNZWFzdXJlbWVudCBvbiBBUCIsICAgICAgICAgICAgICBkdW1wX2xpbV9lbmFibGVfbWVhc3VyZW1lbnR9LAorICAgIHszMTAsICAgIlBFOkxJTTogZHVtcCB0byBlbmFibGUgUXVpZXRJRSBvbiBBUCIsICAgICAgICAgICAgICAgICAgZHVtcF9saW1fZW5hYmxlX3F1aWV0SUV9LAorICAgIHszMTEsICAgIlBFOkxJTTogZGlzYWJsZS9lbmFibGUgc2NhbiAxKGRpc2FibGUpIiwgICAgICAgICAgICAgICAgZHVtcF9saW1fZGlzYWJsZV9lbmFibGVfc2Nhbn0sICAgIAorICAgIHszMjAsICAgIlBFLkxJTTogc2VuZCBzbWUgc2NhbiByZXF1ZXN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fc2Nhbl9yZXFfc2VuZH0sCisKKworICAgIC8qRklYTUVfR0VONiovCisgICAgLyogVGhpcyBkdW1wIGNvbW1hbmQgaXMgbW9yZSBvZiBnZW5lcmljIGR1bXAgY21kIGFuZCBoZW5jZSBpdCBzaG91bGQgCisgICAgICogYmUgbW92ZWQgdG8gbG9nRHVtcC5jCisgICAgICovCisgICAgezMyMSwgICAiUEU6TElNOiBTZXQgTG9nIExldmVsIDxWT1MgTW9kdWxlPiA8Vk9TIExvZyBMZXZlbD4iLCAgICBkdW1wX2xpbV91cGRhdGVfbG9nX2xldmVsfSwKKyAgICB7MzIyLCAgICJQRS5MSU06IEVuYWJsZS9EaXNhYmxlIFBFIFRyYWNpbmciLCAgICAgICAgICAgICAgICAgICAgIGR1bXBfbGltX3RyYWNlX2NmZ30sCisgICAgezMyMywgICAiUEUuTElNOiBUcmFjZSBEdW1wIGlmIGVuYWJsZWQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfbGltX3RyYWNlX2R1bXB9LAorICAgIHszMzEsICAgIlBFLkxJTTogU2VuZCBmaW5pc2ggc2NhbiB0byBMSU0iLCAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fZmluaXNoc2Nhbl9zZW5kfSwKKyAgICB7MzMyLCAgICJQRS5MSU06IGZvcmNlIHByb2JlIHJzcCBzZW5kIGZyb20gTElNIiwgICAgICAgICAgICAgICAgIGR1bXBfbGltX3ByYl9yc3Bfc2VuZH0sCisgICAgezMzMywgICAiUEUuU0NIOiBUcmlnZ2VyIHRvIGdlbmVyYXRlIGEgYmVhY29uIiwgICAgICAgICAgICAgICAgICBkdW1wX3NjaF9iZWFjb25fdHJpZ2dlcn0sCisgICAgezMzNSwgICAiUEUuTElNOiBzZXQgQUNNIGZsYWcgKDAuLjMpIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wX2xpbV9hY21fc2V0fSwKKyAgICB7MzM2LCAgICJQRS5MSU06IFNlbmQgYW4gQUREQkEgUmVxIHRvIHBlZXIgTUFDIGFyZzE9YWlkLGFyZzI9dGlkLCBhcmczPXNzbiIsICAgZHVtcF9saW1fYWRkYmFfcmVxfSwKKyAgICB7MzM3LCAgICJQRS5MSU06IFNlbmQgYSBERUxCQSBJbmQgdG8gcGVlciBNQUMgYXJnMT1haWQsYXJnMj1yZWNpcGllbnQoMCkvaW5pdGlhdG9yKDEpLGFyZzM9dGlkLGFyZzQ9cmVhc29uQ29kZSIsICAgIGR1bXBfbGltX2RlbGJhX3JlcX0sCisgICAgezMzOCwgICAiUEUuTElNOiBUcmlnZ2VyIGEgQkEgdGltZW91dCBmb3IgU1RBIGluZGV4IiwgICAgICAgICAgICBkdW1wX2xpbV9iYV90aW1lb3V0fSwKKyAgICB7MzM5LCAgICJQRS5MSU06IExpc3QgYWN0aXZlIEJBIHNlc3Npb24ocykgZm9yIEFzc29jSUQiLCAgICAgICAgIGR1bXBfbGltX2xpc3RfYWN0aXZlX2JhfSwKKyAgICB7MzQwLCAgICJQRS5MSU06IFNldCBiYWNrZ3JvdW5kIHNjYW4gZmxhZyAoMC1kaXNhYmxlLCAxLWVuYWJsZSkiLGR1bXBfbGltX2Jnc2Nhbl90b2dnbGV9LAorICAgIHszNDEsICAgIlBFLkxJTTogU2V0IGxpbmsgbW9uaXRvcmluZyBtb2RlIiwgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fbGlua21vbml0b3JfdG9nZ2xlfSwKKyAgICB7MzQyLCAgICJQRS5MSU06IEFkZFN0YSA8NnRoIGJ5dGUgb2Ygc3RhdGlvbiBNYWM+IiwgICAgICAgICAgICAgIGR1bXBfbGltX2FkZF9zdGF9LAorICAgIHszNDMsICAgIlBFLkxJTTogRGVsU3RhIDxhaWQ+IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fZGVsX3N0YX0sCisgICAgezM0NCwgICAiUEUuTElNOiBTZXQgcHJvYmUgcmVzcG9uZCBmbGFnIiwgICAgICAgICAgICAgICAgICAgICAgICBkdW1wX2xpbV9wcm9iZXJlc3BfdG9nZ2xlfSwKKyAgICB7MzQ1LCAgICJQRS5MSU06IHNldCBwcm90ZWN0aW9uIGNvbmZpZyBiaXRtYXAiLCAgICAgICAgICAgICAgICAgIHNldF9saW1fcHJvdF9jZmd9LAorICAgIHszNDYsICAgIlBFOkxJTTogU2V0IHRoZSBEb3QxMSBNb2RlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fc2V0X2RvdDExX21vZGV9LAorICAgIHszNDcsICAgIlBFOkVuYWJsZSBvciBEaXNhYmxlIFByb3RlY3Rpb24iLCAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fc2V0X3Byb3RlY3Rpb25fY29udHJvbH0sCisgICAgezM0OCwgICAiUEU6TElNOiBTZW5kIFNNIFBvd2VyIE1vZGUgQWN0aW9uIGZyYW1lIiwgICAgICAgICAgICAgICBkdW1wX2xpbV9zZW5kX1NNX1Bvd2VyX01vZGV9LAorICAgIHszNDksICAgIlBFOiBMSU06IENoYW5nZSBDQiBNb2RlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fdXBkYXRlX2NiX01vZGV9LAorICAgIHszNTAsICAgIlBFOiBMSU06IGFib3J0IHNjYW4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fYWJvcnRfc2Nhbn0sCisgICAgezM1MSwgICAiUEU6IExJTTogU3RhcnQgc3RvcCBCRyBzY2FuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wX2xpbV9zdGFydF9zdG9wX2JnX3NjYW59LAorICAgIHszNTIsICAgIlBFOiBMSU06IFBFIHN0YXRpc3RpY3MgPHNjYW5tYXNrPiIsICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fZ2V0X3BlX3N0YXRpc3RpY3N9LAorICAgIHszNTMsICAgIlBFOiBMSU06IFNldCBNQUMgbG9nIGxldmVsIDxNYWMgTW9kdWxlIElEPiA8TG9nIExldmVsPiIsIGR1bXBfbGltX3NldF9sb2dfbGV2ZWx9LAorICAgIHszNTQsICAgIlBFOiBMSU06IFNldCBTY2FuIGluIFBvd2VyIFNhdmUgPDAtZGlzYWJsZSwgMS1lbmFibGU+IiwgIGR1bXBfbGltX3NldF9zY2FuX2luX3Bvd2Vyc2F2ZX0sCisgICAgezM1NSwgICAiUEUuTElNOiBzZW5kIHNtZSBzdGFydCBCU1MgcmVxdWVzdCIsICAgICAgICAgICAgICAgICAgICBkdW1wX2xpbV9zZW5kX3N0YXJ0X2Jzc19yZXF9LAorICAgIHszNTYsICAgIlBFLkxJTTogZHVtcCBwZXNlc3Npb24gaW5mbyAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fc2Vzc2lvbl9wcmludH0sCisgICAgezM1NywgICAiUEUuTElNOiBzZW5kIERpc0Fzc29jUmVxdWVzdCIsICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wX2xpbV9zZW5kX2Rpc2Fzc29jX3JlcX0sCisgICAgezM1OCwgICAiUEUuTElNOiBzZW5kIHNtZSBzdG9wIGJzcyByZXF1ZXN0IDxzZXNzaW9uIElEPiIsICAgICAgICBkdW1wX2xpbV9zdG9wX2Jzc19yZXF9LCAKKyAgICB7MzU5LCAgICJQRS5MSU06IHNlbmQgc21lIGpvaW4gcmVxdWVzdCIsICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfbGltX3NlbmRfam9pbl9yZXF9LAorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIHszNjAsICAgIlBFLkxJTTogc2VuZCBhbiBSUk0gYWN0aW9uIGZyYW1lIiwgICAgICAgICAgICAgICAgICAgICAgZHVtcF9saW1fc2VuZF9ycm1fYWN0aW9ufSwKKyAgICB7MzYxLCAgICJQRS5MSU06IHVucGFjayBhbiBSUk0gYWN0aW9uIGZyYW1lIiwgICAgICAgICAgICAgICAgICAgIGR1bXBfbGltX3VucGFja19ycm1fYWN0aW9ufSwKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisjaWZkZWYgUlNTSV9IQUNLCisgICAgezM2MiwgICAiVEwgU2V0IGN1cnJlbnQgUlNTSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wX2xpbV9zZXRfdGxfZGF0YV9wa3RfcnNzaX0sCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgezM2MywgICAiUEUuTElNOiB0cmlnZ2VyIHByZSBhdXRoL3JlYXNzb2MgZXZlbnQiLCAgICAgICAgICAgICAgICBkdW1wX2xpbV9mdF9ldmVudH0sCisjZW5kaWYKKworfTsKKworCisKK3ZvaWQgbGltRHVtcEluaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBsb2dEdW1wUmVnaXN0ZXJUYWJsZSggcE1hYywgJmxpbU1lbnVEdW1wVGFibGVbMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGltTWVudUR1bXBUYWJsZSkvc2l6ZW9mKGxpbU1lbnVEdW1wVGFibGVbMF0pICk7Cit9CisKKworI2VuZGlmIC8vI2lmIGRlZmluZWQoQU5JX0xPR0RVTVApCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUDJQLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVAyUC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGQ0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVAyUC5jCkBAIC0wLDAgKzEsOTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEwgSSBNIF8gUCAyIFAgLiBDCisKKyAgT1ZFUlZJRVc6CisKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBQcm90b2NvbCBFbmdpbmUgZm9yCisgIFAyUC4KKworICBDb3B5cmlnaHQgKGMpIDIwMTEgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICAkSGVhZGVyJCREYXRlVGltZSQkQXV0aG9yJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjAxMS0wNS0wMiAgICBkamluZGFsIENvcnJlY3RlZCBmaWxlIGluZGVudGF0aW9uIGFuZCBjaGFuZ2VkIHJlbWFpbiBvbiBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgaGFuZGxpbmcgZm9yIGNvbmN1cnJlbmN5LgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorI2luY2x1ZGUgImxpbVV0aWxzLmgiCisjaW5jbHVkZSAibGltU2Vzc2lvblV0aWxzLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisKKyNkZWZpbmUgICBQUk9CRV9SU1BfSUVfT0ZGU0VUICAgIDM2CisjZGVmaW5lICAgQlNTSURfT0ZGU0VUICAgICAgICAgICAxNgorI2RlZmluZSAgIEFERFIyX09GRlNFVCAgICAgICAgICAgMTAKKyNkZWZpbmUgICBBQ1RJT05fT0ZGU0VUICAgICAgICAgIDI0CisKKworCit2b2lkIGxpbVJlbWFpbk9uQ2hubFN1c3BlbmRMaW5rSGRscih0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpkYXRhKTsKK3ZvaWQgbGltUmVtYWluT25DaG5sU2V0TGlua1N0YXQodHBBbmlTaXJHbG9iYWwgcE1hYywgZUhhbFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpkYXRhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltRXhpdFJlbWFpbk9uQ2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqZGF0YSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbVJlbWFpbk9uQ2huUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgc3RhdHVzLCB0QU5JX1UzMiAqZGF0YSk7CitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1TZXRMaW5rU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckxpbmtTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciBic3NJZCwgdFNpck1hY0FkZHIgc2VsZk1hY0FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2V0TGlua1N0YXRlQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKmNhbGxiYWNrQXJnKTsKKworc3RhdGljIHRTaXJSZXRTdGF0dXMgbGltQ3JlYXRlU2Vzc2lvbkZvclJlbWFpbk9uQ2huKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRQRVNlc3Npb24gKipwcFAycFNlc3Npb24pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEJlbG93IGZ1bmN0aW9uIGlzIGNhbGxiYWNrIGZ1bmN0aW9uLCBpdCBpcyBjYWxsZWQgd2hlbiAKKyAqIFdEQV9TRVRfTElOS19TVEFURV9SU1AgaXMgcmVjZWl2ZWQgZnJvbSBXREkuIGNhbGxiYWNrIGZ1bmN0aW9uIGZvcgorICogUDJQIG9mIGxpbVNldExpbmtTdGF0ZQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltU2V0TGlua1N0YXRlUDJQQ2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqY2FsbGJhY2tBcmcpCit7CisgICAgLy9TZW5kIFJlYWR5IG9uIGNoYW5uZWwgaW5kaWNhdGlvbiB0byBTTUUKKyAgICBpZihwTWFjLT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEpCisgICAgeworICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1JFTUFJTl9PTl9DSE5fUkRZX0lORCwgZUhBTF9TVEFUVVNfU1VDQ0VTUywgCisgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEtPnNlc3Npb25JZCwgMCk7IAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL1RoaXMgaXMgcG9zc2libGUgaW4gY2FzZSByZW1haW4gb24gY2hhbm5lbCBpcyBhYm9ydGVkCisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIiBOVUxMIHBvaW50ZXIgb2YgZ3BMaW1SZW1haW5PbkNoYW5SZXEiKSApOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBSZW1haW4gb24gY2hhbm5lbCByZXEgaGFuZGxlci4gSW5pdGlhdGUgdGhlIElOSVRfU0NBTiwgQ0hOX0NIQU5HRQorICogYW5kIFNFVF9MSU5LIFJlcXVlc3QgZnJvbSBTTUUsIGNobk51bSBhbmQgZHVyYXRpb24gdG8gcmVtYWluIG9uIGNoYW5uZWwuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK2ludCBsaW1Qcm9jZXNzUmVtYWluT25DaG5sUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnKQoreworICAgIHRBTklfVTggaTsKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfSU5URVJOQUwKKyAgICB0cFBFU2Vzc2lvbiBwUDJwU2Vzc2lvbjsKKyNlbmRpZgorCisgICAgdFNpclJlbWFpbk9uQ2huUmVxICpNc2dCdWZmID0gKHRTaXJSZW1haW5PbkNoblJlcSAqKXBNc2c7CisgICAgcE1hYy0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxID0gTXNnQnVmZjsKKworICAgIGZvciAoaSA9MDsgaSA8IHBNYWMtPmxpbS5tYXhCc3NJZDtpKyspCisgICAgeworICAgICAgICBwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsaSk7CisKKyAgICAgICAgaWYgKCAocHNlc3Npb25FbnRyeSAhPSBOVUxMKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwgPT0gTXNnQnVmZi0+Y2huTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRBTklfVTMyIHZhbDsKKyAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciBudWxsQnNzaWQgPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKworICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgZHVyYXRpb24gZnJvbSB0aGUgcmVxdWVzdCAqLworICAgICAgICAgICAgICAgIHZhbCA9IFNZU19NU19UT19USUNLUyhNc2dCdWZmLT5kdXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsICJTdGFydCBsaXN0ZW4gZHVyYXRpb24gPSAlZCIsIHZhbCk7CisgICAgICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2NoYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZW1haW5PbkNoYW5uZWxUaW1lciwgdmFsLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiVW5hYmxlIHRvIGNoYW5nZSByZW1haW4gb24gY2hhbm5lbCBUaW1lciB2YWxcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihUWF9TVUNDRVNTICE9IHR4X3RpbWVyX2FjdGl2YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVtYWluT25DaGFubmVsVGltZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gYWN0aXZhdGUgcmVtYWluIG9uIGNoYW5uZWwgVGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fUkVNQUlOX0NITl9USU1FUik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAorICAgICAgICAgICAgICAgIC8vU2Vzc2lvbiBpcyBuZWVkZWQgdG8gc2VuZCBwcm9iZSByc3AKKyAgICAgICAgICAgICAgICBpZihlU0lSX1NVQ0NFU1MgIT0gbGltQ3JlYXRlU2Vzc2lvbkZvclJlbWFpbk9uQ2huKHBNYWMsICZwUDJwU2Vzc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsICJVbmFibGUgdG8gY3JlYXRlIHNlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGlmICgobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19MSVNURU5fU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIG51bGxCc3NpZCwgcE1hYy0+bGltLmdTZWxmTWFjQWRkciwgCisgICAgICAgICAgICAgICAgICAgIGxpbVNldExpbmtTdGF0ZVAyUENhbGxiYWNrLCBOVUxMKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCAiVW5hYmxlIHRvIGNoYW5nZSBsaW5rIHN0YXRlIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBNYWMtPmxpbS5nTGltUHJldk1sbVN0YXRlID0gcE1hYy0+bGltLmdMaW1NbG1TdGF0ZTsKKyAgICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlICAgICA9IGVMSU1fTUxNX1AyUF9MSVNURU5fU1RBVEU7CisKKyAgICBwTWFjLT5saW0uZ1RvdGFsU2NhbkR1cmF0aW9uID0gTXNnQnVmZi0+ZHVyYXRpb247CisKKyAgICAvKiAxc3Qgd2UgbmVlZCB0byBzdXNwZW5kIGxpbmsgd2l0aCBjYWxsYmFjayB0byBpbml0aWF0ZSBjaGFuZ2UgY2hhbm5lbCAqLworICAgIGxpbVN1c3BlbmRMaW5rKHBNYWMsIGVTSVJfQ0hFQ0tfTElOS19UUkFGRklDX0JFRk9SRV9TQ0FOLAorICAgICAgICAgICAgICAgICAgIGxpbVJlbWFpbk9uQ2hubFN1c3BlbmRMaW5rSGRsciwgTlVMTCk7CisgICAgcmV0dXJuIEZBTFNFOworCitlcnJvcjoKKyAgICBsaW1SZW1haW5PbkNoblJzcChwTWFjLGVIQUxfU1RBVFVTX0ZBSUxVUkUsIE5VTEwpOworICAgIC8qIHBNc2cgaXMgZnJlZWQgYnkgdGhlIGNhbGxlciAqLworICAgIHJldHVybiBGQUxTRTsKK30KKworCit0U2lyUmV0U3RhdHVzIGxpbUNyZWF0ZVNlc3Npb25Gb3JSZW1haW5PbkNobih0cEFuaVNpckdsb2JhbCBwTWFjLCB0UEVTZXNzaW9uICoqcHBQMnBTZXNzaW9uKQoreworICAgIHRTaXJSZXRTdGF0dXMgblNpclN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworICAgIHRBTklfVTggc2Vzc2lvbklkOworICAgIHRBTklfVTMyIHZhbDsKKworICAgIGlmKHBNYWMtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcSAmJiBwcFAycFNlc3Npb24pCisgICAgeworICAgICAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlQ3JlYXRlU2Vzc2lvbihwTWFjLAorICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEtPnNlbGZNYWNBZGRyLCAmc2Vzc2lvbklkLCAxKSkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJTZXNzaW9uIENhbiBub3QgYmUgY3JlYXRlZCBcbiIpKTsKKyAgICAgICAgICAgIC8qIHNlbmQgcmVtYWluIG9uIGNobiBmYWlsdXJlICovCisgICAgICAgICAgICByZXR1cm4gblNpclN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAvKiBTdG9yZSBQRSBzZXNzaW9uSWQgaW4gc2Vzc2lvbiBUYWJsZSAgKi8KKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9IGVMSU1fUDJQX0RFVklDRV9ST0xFOworICAgICAgICBDRkdfR0VUX1NUUiggblNpclN0YXR1cywgcE1hYywgIFdOSV9DRkdfU1VQUE9SVEVEX1JBVEVTXzExQSwKKyAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnJhdGVTZXQucmF0ZSwgdmFsICwgU0lSX01BQ19NQVhfTlVNQkVSX09GX1JBVEVTICk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPnJhdGVTZXQubnVtUmF0ZXMgPSB2YWw7CisKKyAgICAgICAgQ0ZHX0dFVF9TVFIoIG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVQsCisgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0LnJhdGUsIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOICk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmV4dFJhdGVTZXQubnVtUmF0ZXMgPSB2YWw7CisKKyAgICAgICAgc2lyQ29weU1hY0FkZHIocHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcS0+c2VsZk1hY0FkZHIpOworCisgICAgICAgIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCA9IHBNYWMtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcS0+Y2huTnVtOworICAgICAgICBuU2lyU3RhdHVzID0gZVNJUl9TVUNDRVNTOworICAgICAgICAqcHBQMnBTZXNzaW9uID0gcHNlc3Npb25FbnRyeTsKKyAgICB9CisKKyAgICByZXR1cm4gblNpclN0YXR1czsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGxpbVN1c3BlbkxpbmsgY2FsbGJhY2ssIG9uIHN1Y2Nlc3MgbGluayBzdXNwZW5kLCB0cmlnZ2VyIGNoYW5nZSBjaG4KKyAqCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzIGxpbVJlbWFpbk9uQ2hubENoYW5nZUNoblJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUhhbFN0YXR1cyBzdGF0dXMsIHRBTklfVTMyICpkYXRhKQoreworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCBzZXNzaW9uSWQgPSAwOworICAgIHRTaXJSZXRTdGF0dXMgblNpclN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKworICAgIGlmKCBOVUxMID09IHBNYWMtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcSApCisgICAgeworICAgICAgICAvL1JlbWFpbk9uQ2hhbm5lbCBtYXkgaGF2ZSBhYm9ydGVkCisgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCIgZ3BMaW1SZW1haW5PbkNoYW5SZXEgaXMgTlVMTCIpICk7KQorICAgICAgICByZXR1cm4gblNpclN0YXR1czsKKyAgICB9CisKKyAgICAgLyogVGhlIGxpbmsgaXMgbm90IHN1c3BlbmRlZCAqLworICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCIgU3VzcGVuZCBsaW5rIEZhaWx1cmUgIikgKTspCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKAorICAgICAgICBwTWFjLHBNYWMtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcS0+c2VsZk1hY0FkZHIsICZzZXNzaW9uSWQpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZ290byBjaGFuZ2VfY2hhbm5lbDsKKyAgICB9CisgICAgZWxzZSAvKiBTZXNzaW9uIEVudHJ5IGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJZCAqLworICAgIHsKKyAgICAgICAgLyogVHJ5IHRvIENyZWF0ZSBhIG5ldyBzZXNzaW9uICovCisgICAgICAgIGlmKGVTSVJfU1VDQ0VTUyAhPSBsaW1DcmVhdGVTZXNzaW9uRm9yUmVtYWluT25DaG4ocE1hYywgJnBzZXNzaW9uRW50cnkpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNlc3Npb24gQ2FuIG5vdCBiZSBjcmVhdGVkIFxuIikpOworICAgICAgICAgICAgLyogc2VuZCByZW1haW4gb24gY2huIGZhaWx1cmUgKi8KKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKK2NoYW5nZV9jaGFubmVsOgorICAgIC8qIGNoYW5nZSBjaGFubmVsIHRvIHRoZSByZXF1ZXN0ZWQgYnkgUmVtYWluT24gQ2huKi8KKyAgICBsaW1DaGFuZ2VDaGFubmVsV2l0aENhbGxiYWNrKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEtPmNobk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVJlbWFpbk9uQ2hubFNldExpbmtTdGF0LCBOVUxMLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworZXJyb3I6CisgICAgIGxpbVJlbWFpbk9uQ2huUnNwKHBNYWMsZUhBTF9TVEFUVVNfRkFJTFVSRSwgTlVMTCk7CisgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7Cit9CisKK3ZvaWQgbGltUmVtYWluT25DaG5sU3VzcGVuZExpbmtIZGxyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKmRhdGEpCit7CisgICAgbGltUmVtYWluT25DaG5sQ2hhbmdlQ2huUmVxKHBNYWMsIHN0YXR1cywgZGF0YSk7CisgICAgcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNldCB0aGUgTElOSyBzdGF0ZSB0byBMSVNURU4gdG8gYWxsb3cgb25seSBQUk9CRV9SRVEgYW5kIEFjdGlvbiBmcmFtZXMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGxpbVJlbWFpbk9uQ2hubFNldExpbmtTdGF0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqZGF0YSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UzMiB2YWw7CisgICAgdFNpclJlbWFpbk9uQ2huUmVxICpNc2dSZW1haW5vbkNoYW5uZWwgPSBwTWFjLT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXE7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgbnVsbEJzc2lkID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisgICAgaWYgKHN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6IENoYW5nZSBjaGFubmVsIG5vdCBzdWNjZXNzZnVsXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjE7CisgICAgfQorCisgICAgLy8gU3RhcnQgdGltZXIgaGVyZSB0byBjb21lIGJhY2sgdG8gb3BlcmF0aW5nIGNoYW5uZWwuCisgICAgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVtYWluT25DaGFubmVsVGltZXIuc2Vzc2lvbklkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisgICAgICAvKiBnZXQgdGhlIGR1cmF0aW9uIGZyb20gdGhlIHJlcXVlc3QgKi8KKyAgICB2YWwgPSBTWVNfTVNfVE9fVElDS1MoTXNnUmVtYWlub25DaGFubmVsLT5kdXJhdGlvbik7CisKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsICJTdGFydCBsaXN0ZW4gZHVyYXRpb24gPSAlZCIsIHZhbCk7CisgICAgaWYgKHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVtYWluT25DaGFubmVsVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIDApICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgIC8qKgorICAgICAgICAqIENvdWxkIG5vdCBjaGFuZ2UgUmVtYWluIG9uIGNoYW5uZWwgVGltZXIuIExvZyBlcnJvci4KKyAgICAgICAgKi8KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiVW5hYmxlIHRvIGNoYW5nZSByZW1haW4gb24gY2hhbm5lbCBUaW1lciB2YWxcbiIpKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZihUWF9TVUNDRVNTICE9CisgICAgICAgdHhfdGltZXJfYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVJlbWFpbk9uQ2hhbm5lbFRpbWVyKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICIlczogcmVtYWluIG9uIGNoYW5uZWwgVGltZXIgU3RhcnQgRmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmICgobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19MSVNURU5fU1RBVEUsbnVsbEJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nU2VsZk1hY0FkZHIsIGxpbVNldExpbmtTdGF0ZVAyUENhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCAiVW5hYmxlIHRvIGNoYW5nZSBsaW5rIHN0YXRlIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmV0dXJuOworZXJyb3I6CisgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fUkVNQUlOX0NITl9USU1FUik7CitlcnJvcjE6CisgICAgbGltUmVtYWluT25DaG5Sc3AocE1hYyxlSEFMX1NUQVRVU19GQUlMVVJFLCBOVUxMKTsKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogbGltY2hhbm5lbGNoYW5nZSBjYWxsYmFjaywgb24gc3VjY2VzcyBjaGFubmVsIGNoYW5nZSwgc2V0IHRoZQorICogbGlua19zdGF0ZSB0byBMSVNURU4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgbGltUHJvY2Vzc1JlbWFpbk9uQ2huVGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgbnVsbEJzc2lkID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fUkVNQUlOX0NITl9USU1FUik7CisKKyAgICBpZiAoTlVMTCA9PSBwTWFjLT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsICJObyBSZW1haW4gb24gY2hhbm5lbCBwZW5kaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIHByZXZpb3VzIHZhbGlkIExJTksgc3RhdGUgKi8KKyAgICBpZiAobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19JRExFX1NUQVRFLCBudWxsQnNzaWQsCisgICAgICAgIHBNYWMtPmxpbS5nU2VsZk1hY0FkZHIsIE5VTEwsIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgIlVuYWJsZSB0byBjaGFuZ2UgbGluayBzdGF0ZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgICE9IGVMSU1fTUxNX1AyUF9MSVNURU5fU1RBVEUgKQorICAgIHsKKyAgICAgICAgbGltUmVtYWluT25DaG5Sc3AocE1hYyxlSEFMX1NUQVRVU19TVUNDRVNTLCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogZ2V0IHRoZSBzZXNzaW9uICovCisgICAgICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsCisgICAgICAgICAgICBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZW1haW5PbkNoYW5uZWxUaW1lci5zZXNzaW9uSWQpKT09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgRkwoIlNlc3Npb24gRG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JRFxuIikpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGxpbUV4aXRSZW1haW5PbkNoYW5uZWwocE1hYywgZUhBTF9TVEFUVVNfU1VDQ0VTUywgTlVMTCwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIHJldHVybjsKK2Vycm9yOgorICAgICAgICBsaW1SZW1haW5PbkNoblJzcChwTWFjLGVIQUxfU1RBVFVTX0ZBSUxVUkUsIE5VTEwpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBsaW1jaGFubmVsY2hhbmdlIGNhbGxiYWNrLCBvbiBzdWNjZXNzIGNoYW5uZWwgY2hhbmdlLCBzZXQgdGhlIGxpbmtfc3RhdGUKKyAqIHRvIExJU1RFTgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBsaW1FeGl0UmVtYWluT25DaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpkYXRhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIAorICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICJSZW1haW4gb24gQ2hhbm5lbCBGYWlsZWRcbiIpOykKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgLy9TZXQgdGhlIHJlc3VtZSBjaGFubmVsIHRvIEFueSB2YWxpZCBjaGFubmVsIChpbnZhbGlkKS4gCisgICAgLy9UaGlzIHdpbGwgaW5zdHJ1Y3QgSEFMIHRvIHNldCBpdCB0byBhbnkgcHJldmlvdXMgdmFsaWQgY2hhbm5lbC4KKyAgICBwZVNldFJlc3VtZUNoYW5uZWwocE1hYywgMCwgMCk7CisgICAgbGltUmVzdW1lTGluayhwTWFjLCBsaW1SZW1haW5PbkNoblJzcCwgTlVMTCk7CisgICAgcmV0dXJuOworZXJyb3I6CisgICAgbGltUmVtYWluT25DaG5Sc3AocE1hYyxlSEFMX1NUQVRVU19GQUlMVVJFLCBOVUxMKTsKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU2VuZCByZW1haW4gb24gY2hhbm5lbCByZXNwb25lOiBTdWNjZXNzLyBGYWlsdXJlCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1SZW1haW5PbkNoblJzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHN0YXR1cywgdEFOSV9VMzIgKmRhdGEpCit7CisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHNlc3Npb25JZDsKKyAgICB0U2lyUmVtYWluT25DaG5SZXEgKk1zZ1JlbWFpbm9uQ2hhbm5lbCA9IHBNYWMtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcTsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICBudWxsQnNzaWQgPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKyAgICBpZiAoIE5VTEwgPT0gTXNnUmVtYWlub25DaGFubmVsICkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR1AsCisgICAgICAgICAgICAgIiVzOiBObyBQb2ludGVyIGZvciBSZW1haW4gb24gQ2hhbm5lbCBSZXFcbiIsIF9fRlVOQ1RJT05fXyk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9JbmNhc2Ugb2YgdGhlIFJlbWFpbiBvbiBDaGFubmVsIEZhaWx1cmUgQ2FzZQorICAgIC8vQ2xlYW51cCBFdmVyeXRoaW5nCisgICAgaWYoZUhBTF9TVEFUVVNfRkFJTFVSRSA9PSBzdGF0dXMpCisgICAgeworICAgICAgIC8vRGVhY3RpdmF0ZSBSZW1haW4gb24gQ2hhbm5lbCBUaW1lcgorICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX1JFTUFJTl9DSE5fVElNRVIpOworCisgICAgICAgLy9TZXQgdGhlIExpbmsgU3RhdGUgdG8gSWRsZQorICAgICAgIC8qIGdldCB0aGUgcHJldmlvdXMgdmFsaWQgTElOSyBzdGF0ZSAqLworICAgICAgIGlmIChsaW1TZXRMaW5rU3RhdGUocE1hYywgZVNJUl9MSU5LX0lETEVfU1RBVEUsIG51bGxCc3NpZCwKKyAgICAgICAgICAgcE1hYy0+bGltLmdTZWxmTWFjQWRkciwgTlVMTCwgTlVMTCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgIHsKKyAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCAiVW5hYmxlIHRvIGNoYW5nZSBsaW5rIHN0YXRlIik7CisgICAgICAgfQorCisgICAgICAgcE1hYy0+bGltLmdMaW1TeXN0ZW1JblNjYW5MZWFybk1vZGUgPSAwOworICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID0gZUxJTV9IQUxfSURMRV9TQ0FOX1NUQVRFOworICAgIH0KKworICAgIC8qIGRlbGV0ZSB0aGUgc2Vzc2lvbiAqLworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYywKKyAgICAgICAgICAgICAgICAgTXNnUmVtYWlub25DaGFubmVsLT5zZWxmTWFjQWRkciwmc2Vzc2lvbklkKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmICggZUxJTV9QMlBfREVWSUNFX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSApCisgICAgICAgIHsKKyAgICAgICAgICAgcGVEZWxldGVTZXNzaW9uKCBwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBQb3N0IHRoZSBtZWVzc2FnZSB0byBTbWUgKi8KKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1JFTUFJTl9PTl9DSE5fUlNQLCBzdGF0dXMsIAorICAgICAgICAgICAgICAgICAgTXNnUmVtYWlub25DaGFubmVsLT5zZXNzaW9uSWQsIDApOworCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxICk7CisgICAgcE1hYy0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxID0gTlVMTDsKKworICAgIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPSBwTWFjLT5saW0uZ0xpbVByZXZNbG1TdGF0ZTsKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSW5kaWNhdGUgdGhlIE1nbXQgRnJhbWUgcmVjZWl2ZWQgdG8gU01FIHRvIEhERCBjYWxsYmFjaworICogaGFuZGxlIFByb2JlX3JlcS9BY3Rpb24gZnJhbWUgY3VycmVudGx5CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1TZW5kU21lTWdtdEZyYW1lSW5kKAorICAgICAgICAgICAgICAgICAgICB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGZyYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgKmZyYW1lLCB0QU5JX1UzMiBmcmFtZUxlbiwgdEFOSV9VMTYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiByeENoYW5uZWwpCit7CisgICAgdFNpck1zZ1EgICAgICAgICAgICAgIG1taE1zZzsKKyAgICB0cFNpclNtZU1nbXRGcmFtZUluZCBwU2lyU21lTWdtdEZyYW1lID0gTlVMTDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgbGVuZ3RoOworCisgICAgbGVuZ3RoID0gc2l6ZW9mKHRTaXJTbWVNZ210RnJhbWVJbmQpICsgZnJhbWVMZW47CisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgICAgcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2lyU21lTWdtdEZyYW1lLCBsZW5ndGggKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfTElTVEVOX1JTUFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKXBTaXJTbWVNZ210RnJhbWUsIGxlbmd0aCk7CisKKyAgICBwU2lyU21lTWdtdEZyYW1lLT5tZXNnVHlwZSA9IGVXTklfU01FX01HTVRfRlJNX0lORDsKKyAgICBwU2lyU21lTWdtdEZyYW1lLT5tZXNnTGVuID0gbGVuZ3RoOworICAgIHBTaXJTbWVNZ210RnJhbWUtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBwU2lyU21lTWdtdEZyYW1lLT5mcmFtZVR5cGUgPSBmcmFtZVR5cGU7CisgICAgcFNpclNtZU1nbXRGcmFtZS0+cnhDaGFuID0gcnhDaGFubmVsOworCisgICAgdm9zX21lbV96ZXJvKHBTaXJTbWVNZ210RnJhbWUtPmZyYW1lQnVmLGZyYW1lTGVuKTsKKyAgICB2b3NfbWVtX2NvcHkocFNpclNtZU1nbXRGcmFtZS0+ZnJhbWVCdWYsZnJhbWUsZnJhbWVMZW4pOworCisgICAgbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9NR01UX0ZSTV9JTkQ7CisgICAgbW1oTXNnLmJvZHlwdHIgPSBwU2lyU21lTWdtdEZyYW1lOworICAgIG1taE1zZy5ib2R5dmFsID0gMDsKKyAgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKyAgICByZXR1cm47Cit9IC8qKiogZW5kIGxpbVNlbmRTbWVMaXN0ZW5Sc3AoKSAqKiovCisKKworZUhhbFN0YXR1cyBsaW1QMlBBY3Rpb25DbmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgdHhDb21wbGV0ZVN1Y2Nlc3MpCit7CisgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1NNRV9BQ1RJT05fRlJBTUVfU0VORF9DTkYsCisgICAgICAgICAgICAodHhDb21wbGV0ZVN1Y2Nlc3MgPyBlU0lSX1NNRV9TVUNDRVNTIDogZVNJUl9TTUVfU0VORF9BQ1RJT05fRkFJTCksCisgICAgICAgICAgICAgcE1hYy0+bGltLmFjdGlvbkZyYW1lU2Vzc2lvbklkLCAwKTsKKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisKK3ZvaWQgbGltU2V0SHRDYXBzKHRwQW5pU2lyR2xvYmFsIHBNYWMsdEFOSV9VOCAqcEllU3RhcnRQdHIsdEFOSV9VMzIgbkJ5dGVzKQoreworICAgIHZfVThfdCAgICAgICAgICAgICAgKnBJZT1OVUxMOworICAgIHREb3QxMWZJRUhUQ2FwcyAgICAgZG90MTFIdENhcDsKKworICAgIFBvcHVsYXRlRG90MTFmSFRDYXBzKHBNYWMsJmRvdDExSHRDYXApOworICAgIHBJZSA9IGxpbUdldElFUHRyKHBNYWMscEllU3RhcnRQdHIsIG5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPVDExRl9FSURfSFRDQVBTLE9ORV9CWVRFKTsKKyAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoInBJZSAweCV4IGRvdDExSHRDYXAuc3VwcG9ydGVkTUNTU2V0WzBdPTB4JXgiKSwKKyAgICAgICAgKHRBTklfVTMyKXBJZSxkb3QxMUh0Q2FwLnN1cHBvcnRlZE1DU1NldFswXSk7CisgICAgaWYocEllKQorICAgIHsKKyAgICAgICAgdEh0Q2FwcyAqcEh0Y2FwID0gKHRIdENhcHMgKikmcEllWzJdOyAvL2NvbnZlcnQgZnJvbSB1bnBhY2tlZCB0byBwYWNrZWQgc3RydWN0dXJlCisgICAgICAgIHBIdGNhcC0+YWR2Q29kaW5nQ2FwID0gZG90MTFIdENhcC5hZHZDb2RpbmdDYXA7CisgICAgICAgIHBIdGNhcC0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0gZG90MTFIdENhcC5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisgICAgICAgIHBIdGNhcC0+bWltb1Bvd2VyU2F2ZSA9IGRvdDExSHRDYXAubWltb1Bvd2VyU2F2ZTsKKyAgICAgICAgcEh0Y2FwLT5ncmVlbkZpZWxkID0gZG90MTFIdENhcC5ncmVlbkZpZWxkOworICAgICAgICBwSHRjYXAtPnNob3J0R0kyME1IeiA9IGRvdDExSHRDYXAuc2hvcnRHSTIwTUh6OworICAgICAgICBwSHRjYXAtPnNob3J0R0k0ME1IeiA9IGRvdDExSHRDYXAuc2hvcnRHSTQwTUh6OworICAgICAgICBwSHRjYXAtPnR4U1RCQyA9IGRvdDExSHRDYXAudHhTVEJDOworICAgICAgICBwSHRjYXAtPnJ4U1RCQyA9IGRvdDExSHRDYXAucnhTVEJDOworICAgICAgICBwSHRjYXAtPmRlbGF5ZWRCQSA9IGRvdDExSHRDYXAuZGVsYXllZEJBICA7CisgICAgICAgIHBIdGNhcC0+bWF4aW1hbEFNU0RVc2l6ZSA9IGRvdDExSHRDYXAubWF4aW1hbEFNU0RVc2l6ZTsKKyAgICAgICAgcEh0Y2FwLT5kc3NzQ2NrTW9kZTQwTUh6ID0gZG90MTFIdENhcC5kc3NzQ2NrTW9kZTQwTUh6OworICAgICAgICBwSHRjYXAtPnBzbXAgPSBkb3QxMUh0Q2FwLnBzbXA7CisgICAgICAgIHBIdGNhcC0+c3RiY0NvbnRyb2xGcmFtZSA9IGRvdDExSHRDYXAuc3RiY0NvbnRyb2xGcmFtZTsKKyAgICAgICAgcEh0Y2FwLT5sc2lnVFhPUFByb3RlY3Rpb24gPSBkb3QxMUh0Q2FwLmxzaWdUWE9QUHJvdGVjdGlvbjsKKyAgICAgICAgcEh0Y2FwLT5tYXhSeEFNUERVRmFjdG9yID0gZG90MTFIdENhcC5tYXhSeEFNUERVRmFjdG9yOworICAgICAgICBwSHRjYXAtPm1wZHVEZW5zaXR5ID0gZG90MTFIdENhcC5tcGR1RGVuc2l0eTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKilwSHRjYXAtPnN1cHBvcnRlZE1DU1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoZG90MTFIdENhcC5zdXBwb3J0ZWRNQ1NTZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBIdGNhcC0+c3VwcG9ydGVkTUNTU2V0KSk7CisgICAgICAgIHBIdGNhcC0+cGNvID0gZG90MTFIdENhcC5wY287CisgICAgICAgIHBIdGNhcC0+dHJhbnNpdGlvblRpbWUgPSBkb3QxMUh0Q2FwLnRyYW5zaXRpb25UaW1lOworICAgICAgICBwSHRjYXAtPm1jc0ZlZWRiYWNrID0gZG90MTFIdENhcC5tY3NGZWVkYmFjazsKKyAgICAgICAgcEh0Y2FwLT50eEJGID0gZG90MTFIdENhcC50eEJGOworICAgICAgICBwSHRjYXAtPnJ4U3RhZ2dlcmVkU291bmRpbmcgPSBkb3QxMUh0Q2FwLnJ4U3RhZ2dlcmVkU291bmRpbmc7CisgICAgICAgIHBIdGNhcC0+dHhTdGFnZ2VyZWRTb3VuZGluZyA9IGRvdDExSHRDYXAudHhTdGFnZ2VyZWRTb3VuZGluZzsKKyAgICAgICAgcEh0Y2FwLT5yeFpMRiA9IGRvdDExSHRDYXAucnhaTEY7CisgICAgICAgIHBIdGNhcC0+dHhaTEYgPSBkb3QxMUh0Q2FwLnR4WkxGOworICAgICAgICBwSHRjYXAtPmltcGxpY2l0VHhCRiA9IGRvdDExSHRDYXAuaW1wbGljaXRUeEJGOworICAgICAgICBwSHRjYXAtPmNhbGlicmF0aW9uID0gZG90MTFIdENhcC5jYWxpYnJhdGlvbjsKKyAgICAgICAgcEh0Y2FwLT5leHBsaWNpdENTSVR4QkYgPSBkb3QxMUh0Q2FwLmV4cGxpY2l0Q1NJVHhCRjsKKyAgICAgICAgcEh0Y2FwLT5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4ID0KKyAgICAgICAgICAgIGRvdDExSHRDYXAuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeDsKKyAgICAgICAgcEh0Y2FwLT5leHBsaWNpdEJGQ1NJRmVlZGJhY2sgPSBkb3QxMUh0Q2FwLmV4cGxpY2l0QkZDU0lGZWVkYmFjazsKKyAgICAgICAgcEh0Y2FwLT5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgPQorICAgICAgICAgICAgZG90MTFIdENhcC5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2s7CisgICAgICAgIHBIdGNhcC0+ZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayA9CisgICAgICAgICAgICBkb3QxMUh0Q2FwLmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2s7CisgICAgICAgIHBIdGNhcC0+Y3NpTnVtQkZBbnRlbm5hZSA9IGRvdDExSHRDYXAuY3NpTnVtQkZBbnRlbm5hZTsKKyAgICAgICAgcEh0Y2FwLT51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgPQorICAgICAgICAgICAgZG90MTFIdENhcC51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU7CisgICAgICAgIHBIdGNhcC0+Y29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSA9CisgICAgICAgICAgICBkb3QxMUh0Q2FwLmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU7CisgICAgICAgIHBIdGNhcC0+YW50ZW5uYVNlbGVjdGlvbiA9IGRvdDExSHRDYXAuYW50ZW5uYVNlbGVjdGlvbjsKKyAgICAgICAgcEh0Y2FwLT5leHBsaWNpdENTSUZlZWRiYWNrVHggPSBkb3QxMUh0Q2FwLmV4cGxpY2l0Q1NJRmVlZGJhY2tUeDsKKyAgICAgICAgcEh0Y2FwLT5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHggPSBkb3QxMUh0Q2FwLmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeDsKKyAgICAgICAgcEh0Y2FwLT5leHBsaWNpdENTSUZlZWRiYWNrID0gZG90MTFIdENhcC5leHBsaWNpdENTSUZlZWRiYWNrOworICAgICAgICBwSHRjYXAtPmFudGVubmFJbmRpY2VzRmVlZGJhY2sgPSBkb3QxMUh0Q2FwLmFudGVubmFJbmRpY2VzRmVlZGJhY2s7CisgICAgICAgIHBIdGNhcC0+cnhBUyA9IGRvdDExSHRDYXAucnhBUzsKKyAgICAgICAgcEh0Y2FwLT50eFNvdW5kaW5nUFBEVXMgPSBkb3QxMUh0Q2FwLnR4U291bmRpbmdQUERVczsKKyAgICB9Cit9CisKKwordm9pZCBsaW1TZW5kUDJQQWN0aW9uRnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisgICAgdFNpck1iTXNnUDJwICpwTWJNc2cgPSAodFNpck1iTXNnUDJwICopcE1zZy0+Ym9keXB0cjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIG5CeXRlczsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICpwRnJhbWU7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqcFBhY2tldDsKKyAgICBlSGFsU3RhdHVzICAgICAgICAgIGhhbHN0YXR1czsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHR4RmxhZyA9IDA7CisgICAgdHBTaXJNYWNGcmFtZUN0bCAgICBwRmMgPSAodHBTaXJNYWNGcmFtZUN0bCApIHBNYk1zZy0+ZGF0YTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIG5vYUxlbiA9IDA7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBub2FTdHJlYW1bU0lSX01BWF9OT0FfQVRUUl9MRU4gKyBTSVJfUDJQX0lFX0hFQURFUl9MRU5dOworICAgIHRBTklfVTggICAgICAgICAgICAgb3JpZ0xlbiA9IDA7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQgPSAwOworICAgIHZfVThfdCAgICAgICAgICAgICAgKnBQMlBJZSA9IE5VTEw7CisgICAgdHBQRVNlc3Npb24gICAgICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHZfVThfdCAgICAgICAgICAgICAgKnBQcmVzZW5jZVJzcE5vYUF0dHIgPSBOVUxMOworICAgIHZfVThfdCAgICAgICAgICAgICAgKnBOZXdQMlBJZSA9IE5VTEw7CisgICAgdl9VMTZfdCAgICAgICAgICAgICByZW1haW5MZW4gPSAwOworCisgICAgbkJ5dGVzID0gcE1iTXNnLT5tc2dMZW4gLSBzaXplb2YodFNpck1iTXNnKTsKKworICAgIGxpbUxvZyggcE1hYywgTE9HMSwgRkwoInNlbmRpbmcgcEZjLT50eXBlPSVkIHBGYy0+c3ViVHlwZT0lZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGYy0+dHlwZSwgcEZjLT5zdWJUeXBlKTsKKworICAgIHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLAorICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KilwTWJNc2ctPmRhdGEgKyBCU1NJRF9PRkZTRVQsICZzZXNzaW9uSWQpOworCisgICAgLyogQ2hlY2sgZm9yIHNlc3Npb24gY29ycmVzcG9uZGluZyB0byBBRERSMiBBcyBTdXBwbGljYW50IGlzIGZpbGxpbmcgCisgICAgICAgQUREUjIgIHdpdGggQlNTSUQgKi8gIAorICAgIGlmKCBOVUxMID09IHBzZXNzaW9uRW50cnkgKQorICAgIHsKKyAgICAgICAgcHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMsCisgICAgICAgICAgICAgICAgICAgKHRBTklfVTgqKXBNYk1zZy0+ZGF0YSArIEFERFIyX09GRlNFVCwgJnNlc3Npb25JZCk7CisgICAgfQorCisgICAgaWYoIE5VTEwgPT0gcHNlc3Npb25FbnRyeSApCisgICAgeworICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgIGlzU2Vzc2lvbkFjdGl2ZSA9IDA7CisgICAgICAgIHRBTklfVTggICAgICAgICAgICAgaTsKKyAgICAgICAgCisgICAgICAgIC8qIElmIHdlIGFyZSBub3QgYWJsZSB0byBmaW5kIHBzZXNzaW9uRW50cnkgZW50cnksIHRoZW4gdHJ5IHRvIGZpbmQgCisgICAgICAgICAgIGFjdGl2ZSBzZXNzaW9uLCBpZiBmb3VuZCBhbnkgYWN0aXZlIHNlc3Npb25zIHRoZW4gc2VuZCB0aGUKKyAgICAgICAgICAgYWN0aW9uIGZyYW1lLCBJZiBubyBhY3RpdmUgc2Vzc2lvbnMgZm91bmQgdGhlbiBkcm9wIHRoZSBmcmFtZSAqLyAKKyAgICAgICAgZm9yIChpID0wOyBpIDwgcE1hYy0+bGltLm1heEJzc0lkO2krKykKKyAgICAgICAgeworICAgICAgICAgICAgcHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLGkpOworICAgICAgICAgICAgaWYgKCBOVUxMICE9IHBzZXNzaW9uRW50cnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXNTZXNzaW9uQWN0aXZlID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggIWlzU2Vzc2lvbkFjdGl2ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9TTUVfQUNUSU9OX0ZSQU1FX1NFTkRfQ05GLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSwgcE1iTXNnLT5zZXNzaW9uSWQsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChTSVJfTUFDX01HTVRfRlJBTUUgPT0gcEZjLT50eXBlKSYmCisgICAgICAgICgoU0lSX01BQ19NR01UX1BST0JFX1JTUCA9PSBwRmMtPnN1YlR5cGUpfHwKKyAgICAgICAgKFNJUl9NQUNfTUdNVF9BQ1RJT04gPT0gcEZjLT5zdWJUeXBlKSkpCisgICAgeworICAgICAgICAvL2lmIHRoaXMgaXMgYSBwcm9iZSBSU1AgYmVpbmcgc2VudCBmcm9tIHdwYV9zdXBwbGljYW50CisgICAgICAgIGlmIChTSVJfTUFDX01HTVRfUFJPQkVfUlNQID09IHBGYy0+c3ViVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9nZXQgcHJvcGVyIG9mZnNldCBmb3IgUHJvYmUgUlNQCisgICAgICAgICAgICBwUDJQSWUgPSBsaW1HZXRQMnBJRVB0cihwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCopcE1iTXNnLT5kYXRhICsgUFJPQkVfUlNQX0lFX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzIC0gUFJPQkVfUlNQX0lFX09GRlNFVCk7CisgICAgICAgICAgICB3aGlsZSAoKE5VTEwgIT0gcFAyUEllKSAmJiAoU0lSX01BQ19NQVhfSUVfTEVOR1RIID09IHBQMlBJZVsxXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVtYWluTGVuID0gbkJ5dGVzIC0gKHBQMlBJZSAtICh0QU5JX1U4KilwTWJNc2ctPmRhdGEpOworICAgICAgICAgICAgICAgIGlmIChyZW1haW5MZW4gPiAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBOZXdQMlBJZSA9IGxpbUdldFAycElFUHRyKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQMlBJZStTSVJfTUFDX01BWF9JRV9MRU5HVEggKyAyLCByZW1haW5MZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocE5ld1AyUEllKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFAyUEllID0gcE5ld1AyUEllOworICAgICAgICAgICAgICAgICAgICBwTmV3UDJQSWUgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vZW5kIG9mIHdoaWxlCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoU0lSX01BQ19BQ1RJT05fVkVORE9SX1NQRUNJRklDX0NBVEVHT1JZID09CisgICAgICAgICAgICAgICAgKigodl9VOF90ICopcE1iTXNnLT5kYXRhK0FDVElPTl9PRkZTRVQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwU2lyTWFjUDJQQWN0aW9uRnJhbWVIZHIgcEFjdGlvbkhkciA9CisgICAgICAgICAgICAgICAgICAgICh0cFNpck1hY1AyUEFjdGlvbkZyYW1lSGRyKSgodl9VOF90ICopcE1iTXNnLT5kYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX09GRlNFVCk7CisgICAgICAgICAgICAgICAgaWYgKCBwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwgcEFjdGlvbkhkci0+T3VpLAorICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19QMlBfT1VJLCBTSVJfTUFDX1AyUF9PVUlfU0laRSApICYmCisgICAgICAgICAgICAgICAgICAgIChTSVJfTUFDX0FDVElPTl9QMlBfU1VCVFlQRV9QUkVTRU5DRV9SU1AgPT0KKyAgICAgICAgICAgICAgICAgICAgcEFjdGlvbkhkci0+T3VpU3ViVHlwZSkpCisgICAgICAgICAgICAgICAgeyAvL0luIGNhc2Ugb2YgUHJlc2VuY2UgUlNQIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIHBQMlBJZSA9IGxpbUdldFAycElFUHRyKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90ICopcE1iTXNnLT5kYXRhICsgQUNUSU9OX09GRlNFVCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY1AyUEFjdGlvbkZyYW1lSGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuQnl0ZXMgLSBBQ1RJT05fT0ZGU0VUIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjUDJQQWN0aW9uRnJhbWVIZHIpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBOVUxMICE9IHBQMlBJZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZXh0cmFjdCB0aGUgcHJlc2VuY2Ugb2YgTm9BIGF0dHJpYnV0ZSBpbnNpZGUgUDJQIElFCisgICAgICAgICAgICAgICAgICAgICAgICBwUHJlc2VuY2VSc3BOb2FBdHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUdldElFUHRyKHBNYWMscFAyUEllICsgU0lSX1AyUF9JRV9IRUFERVJfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFAyUEllWzFdLCBTSVJfUDJQX05PQV9BVFRSLFRXT19CWVRFKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocFAyUEllICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vZ2V0IE5vQSBhdHRyaWJ1dGUgc3RyZWFtIFAyUCBJRQorICAgICAgICAgICAgbm9hTGVuID0gbGltR2V0Tm9hQXR0clN0cmVhbShwTWFjLCBub2FTdHJlYW0sIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgLy9uZWVkIHRvIGFwcGVuZCBOb0EgYXR0cmlidXRlIGluIFAyUCBJRQorICAgICAgICAgICAgaWYgKG5vYUxlbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JpZ0xlbiA9IHBQMlBJZVsxXTsKKyAgICAgICAgICAgICAgIC8vaWYgUHJlc2VuY2UgUnNwIGhhcyBOb0F0dHIKKyAgICAgICAgICAgICAgICBpZiAocFByZXNlbmNlUnNwTm9hQXR0cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZfVTE2X3Qgbm9hQXR0ckxlbiA9IHBQcmVzZW5jZVJzcE5vYUF0dHJbMV0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUHJlc2VuY2VSc3BOb2FBdHRyWzJdPDw4KTsKKyAgICAgICAgICAgICAgICAgICAgLypPbmUgYnl0ZSBmb3IgYXR0cmlidXRlLCAyYnl0ZXMgZm9yIGxlbmd0aCovCisgICAgICAgICAgICAgICAgICAgIG9yaWdMZW4gLT0gKG5vYUF0dHJMZW4gKyAxICsgMik7CisgICAgICAgICAgICAgICAgICAgIC8vcmVtb3ZlIHRob3NlIGJ5dGVzIHRvIGNvcHkKKyAgICAgICAgICAgICAgICAgICAgbkJ5dGVzICAtPSAobm9hQXR0ckxlbiArIDEgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgLy9yZW1vdmUgTm9BIGZyb20gb3JpZ2luYWwgTGVuCisgICAgICAgICAgICAgICAgICAgIHBQMlBJZVsxXSA9IG9yaWdMZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgocFAyUEllWzFdICsgKHRBTklfVTE2KW5vYUxlbik+IFNJUl9NQUNfTUFYX0lFX0xFTkdUSCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vRm9ybSB0aGUgbmV3IE5vQSBCeXRlIGFycmF5IGluIG11bHRpcGxlIFAyUCBJRXMKKyAgICAgICAgICAgICAgICAgICAgbm9hTGVuID0gbGltR2V0Tm9hQXR0clN0cmVhbUluTXVsdFAycEllcyhwTWFjLCBub2FTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2FMZW4sKChwUDJQSWVbMV0gKyAodEFOSV9VMTYpbm9hTGVuKS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUFYX0lFX0xFTkdUSCkpOworICAgICAgICAgICAgICAgICAgICBwUDJQSWVbMV0gPSBTSVJfTUFDX01BWF9JRV9MRU5HVEg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBQMlBJZVsxXSArPSBub2FMZW47IC8vaW5jcmVtZW50IHRoZSBsZW5ndGggb2YgUDJQIElFCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5CeXRlcyArPSBub2FMZW47CisgICAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICAgRkwoIm5vYUxlbj0lZCBvcmlnTGVuPSVkIHBQMlBJZT0weCV4IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBuQnl0ZXM9JWQgbkJ5dGVzVG9Db3B5PSVkIFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vYUxlbixvcmlnTGVuLHBQMlBJZSxuQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgKChwUDJQSWUgKyBvcmlnTGVuICsgMikgLSAodl9VOF90ICopcE1iTXNnLT5kYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoU0lSX01BQ19NR01UX1BST0JFX1JTUCA9PSBwRmMtPnN1YlR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbVNldEh0Q2FwcyggcE1hYywodEFOSV9VOCopcE1iTXNnLT5kYXRhICsgUFJPQkVfUlNQX0lFX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CeXRlcyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIE9rLS0gdHJ5IHRvIGFsbG9jYXRlIHNvbWUgbWVtb3J5OgorICAgIGhhbHN0YXR1cyA9IHBhbFBrdEFsbG9jKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTE2KW5CeXRlcywgKCB2b2lkKiogKSAmcEZyYW1lLCAodm9pZCoqKSAmcFBhY2tldCk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBQcm9iZSIKKyAgICAgICAgICAiIFJlcXVlc3QuXG4iKSwgbkJ5dGVzICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBQYXJhbm9pYToKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwRnJhbWUsIG5CeXRlcyApOworCisgICAgaWYgKG5vYUxlbiA+IDApCisgICAgeworICAgICAgICAvLyBBZGQgMiBieXRlcyBmb3IgbGVuZ3RoIGFuZCBBcnJpYnV0ZSBmaWVsZAorICAgICAgICB2X1UzMl90IG5CeXRlc1RvQ29weSA9ICgocFAyUEllICsgb3JpZ0xlbiArIDIgKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1U4X3QgKilwTWJNc2ctPmRhdGEpOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRnJhbWUsIHBNYk1zZy0+ZGF0YSwgbkJ5dGVzVG9Db3B5KTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHBGcmFtZSArIG5CeXRlc1RvQ29weSksIG5vYVN0cmVhbSwgbm9hTGVuKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHBGcmFtZSArIG5CeXRlc1RvQ29weSArIG5vYUxlbiksCisgICAgICAgICAgICBwTWJNc2ctPmRhdGEgKyBuQnl0ZXNUb0NvcHksIG5CeXRlcyAtIG5CeXRlc1RvQ29weSAtIG5vYUxlbik7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwRnJhbWUsIHBNYk1zZy0+ZGF0YSwgbkJ5dGVzKTsKKyAgICB9CisKKyAgICAvKiBVc2UgQkQgcmF0ZSAyIGZvciBhbGwgUDJQIHJlbGF0ZWQgZnJhbWVzLiBBcyB0aGVzZSBmcmFtZXMgbmVlZCB0byBnbworICAgICAqIGF0IE9GRE0gcmF0ZXMuIEFuZCBCRCByYXRlMiB3ZSBjb25maWd1cmVkIGF0IDZNYnBzLgorICAgICAqLworICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworCisgICAgaWYgKFNJUl9NQUNfTUdNVF9QUk9CRV9SU1AgPT0gcEZjLT5zdWJUeXBlKQorICAgIHsKKyAgICAgICAgaGFsc3RhdHVzID0gaGFsVHhGcmFtZSggcE1hYywgcFBhY2tldCwgKHRBTklfVTE2KW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgQU5JX1RYRElSX1RPRFMsCisgICAgICAgICAgICAgICAgICAgICAgICA3LC8qU01BQ19TV0JEX1RYX1RJRF9NR01UX0hJR0ggKi8gbGltVHhDb21wbGV0ZSwgcEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHhGbGFnICk7CisKKyAgICAgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1NNRV9BQ1RJT05fRlJBTUVfU0VORF9DTkYsIAorICAgICAgICAgICAgICAgaGFsc3RhdHVzLCBwTWJNc2ctPnNlc3Npb25JZCwgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhhbHN0YXR1cyA9IGhhbFR4RnJhbWVXaXRoVHhDb21wbGV0ZSggcE1hYywgcFBhY2tldCwgKHRBTklfVTE2KW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgQU5JX1RYRElSX1RPRFMsCisgICAgICAgICAgICAgICAgICAgICAgICA3LC8qU01BQ19TV0JEX1RYX1RJRF9NR01UX0hJR0ggKi8gbGltVHhDb21wbGV0ZSwgcEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbGltUDJQQWN0aW9uQ25mLCB0eEZsYWcgKTsKKworICAgICAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTICggaGFsc3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHNlbmQgYWN0aW9uIGZyYW1lIVxuIiApKTsKKyAgICAgICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX0FDVElPTl9GUkFNRV9TRU5EX0NORiwgaGFsc3RhdHVzLCAKKyAgICAgICAgICAgICAgICBwTWJNc2ctPnNlc3Npb25JZCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgcE1hYy0+bGltLmFjdGlvbkZyYW1lU2Vzc2lvbklkID0gcE1iTXNnLT5zZXNzaW9uSWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKwordm9pZCBsaW1BYm9ydFJlbWFpbk9uQ2hhbih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGlmKFZPU19UUlVFID09IHR4X3RpbWVyX3J1bm5pbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZW1haW5PbkNoYW5uZWxUaW1lcikpCisgICAgeworICAgICAgICAvL1RPRE8gY2hlY2sgZm9yIHN0YXRlIGFuZCB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbnMKKyAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fUkVNQUlOX0NITl9USU1FUik7CisgICAgICAgIGxpbVByb2Nlc3NSZW1haW5PbkNoblRpbWVvdXQocE1hYyk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyogUG93ZXIgU2F2ZSBSZWxhdGVkIEZ1bmN0aW9ucyAqLwordFNpclJldFN0YXR1cyBfX2xpbVByb2Nlc3NTbWVOb0FVcGRhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdHBQMnBQc0NvbmZpZyBwTm9BOworICAgIHRwUDJwUHNQYXJhbXMgcE1zZ05vQTsKKyAgICB0U2lyTXNnUSBtc2c7CisKKyAgICBwTm9BID0gKHRwUDJwUHNDb25maWcpIHBNc2dCdWY7CisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSgKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmhIZGQsICh2b2lkICoqKSAmcE1zZ05vQSwgc2l6ZW9mKCB0UDJwUHNDb25maWcgKSkpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICBGTCggIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIE5vQSBVcGRhdGVcbiIgKSk7CisgICAgICAgIHJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKilwTXNnTm9BLCBzaXplb2YodFAycFBzQ29uZmlnKSk7CisgICAgcE1zZ05vQS0+b3BwX3BzID0gcE5vQS0+b3BwX3BzOworICAgIHBNc2dOb0EtPmN0V2luZG93ID0gcE5vQS0+Y3RXaW5kb3c7CisgICAgcE1zZ05vQS0+ZHVyYXRpb24gPSBwTm9BLT5kdXJhdGlvbjsKKyAgICBwTXNnTm9BLT5pbnRlcnZhbCA9IHBOb0EtPmludGVydmFsOworICAgIHBNc2dOb0EtPmNvdW50ID0gcE5vQS0+Y291bnQ7CisgICAgcE1zZ05vQS0+c2luZ2xlX25vYV9kdXJhdGlvbiA9IHBOb0EtPnNpbmdsZV9ub2FfZHVyYXRpb247CisgICAgcE1zZ05vQS0+cHNTZWxlY3Rpb24gPSBwTm9BLT5wc1NlbGVjdGlvbjsKKworICAgIG1zZy50eXBlID0gU0lSX0hBTF9TRVRfUDJQX0dPX05PQV9SRVE7CisgICAgbXNnLnJlc2VydmVkID0gMDsKKyAgICBtc2cuYm9keXB0ciA9IHBNc2dOb0E7CisgICAgbXNnLmJvZHl2YWwgPSAwOworCisgICAgaWYoZVNJUl9TVUNDRVNTICE9IHdkYVBvc3RDdHJsTXNnKHBNYWMsICZtc2cpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJoYWxQb3N0TXNnQXBpIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZUdvTmVnUmVxKCkgKioqLworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzQWN0aW9uRnJhbWUuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0FjdGlvbkZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4OWE4NwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0FjdGlvbkZyYW1lLmMKQEAgLTAsMCArMSwyMDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltUHJvY2Vzc0FjdGlvbkZyYW1lLmNjIGNvbnRhaW5zIHRoZSBjb2RlCisgKiBmb3IgcHJvY2Vzc2luZyBBY3Rpb24gRnJhbWUuCisgKiBBdXRob3I6ICAgICAgTWljaGFlbCBMdWkKKyAqIERhdGU6ICAgICAgICAwNS8yMy8wMworICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJ3bmlBcGkuaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsRGF0YVN0cnVjdC5oIgorI2VuZGlmCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNlbHNlCisjaW5jbHVkZSAid25pQ2ZnU3RhLmgiCisjZW5kaWYKKyNpbmNsdWRlICJzY2hBcGkuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VjdXJpdHlVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VuZFNtZVJzcE1lc3NhZ2VzLmgiCisjaW5jbHVkZSAicGFyc2VyQXBpLmgiCisjaW5jbHVkZSAibGltQWRtaXRDb250cm9sLmgiCisjaW5jbHVkZSAid21tQXBzZC5oIgorI2luY2x1ZGUgImxpbVNlbmRNZXNzYWdlcy5oIgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybUFwaS5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEZFQVRVUkVfV0xBTl9DQ1gKKyNpbmNsdWRlICJjY3hBcGkuaCIKKyNlbmRpZgorI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIgorCisKKyNkZWZpbmUgQkFfREVGQVVMVF9UWF9CVUZGRVJfU0laRSA2NAorCit0eXBlZGVmIGVudW0KK3sKKyAgTElNX0FEREJBX1JTUCA9IDAsCisgIExJTV9BRERCQV9SRVEgPSAxCit9dExpbUFkZEJhVmFsaWRhdGlvblJlcVR5cGU7CisKKy8qIE5vdGU6IFRoZSB0ZXN0IHBhc3NlcyBpZiB0aGUgU1RBVVQgc3RvcHMgc2VuZGluZyBhbnkgZnJhbWVzLCBhbmQgbm8gZnVydGhlcgorIGZyYW1lcyBhcmUgdHJhbnNtaXR0ZWQgb24gdGhpcyBjaGFubmVsIGJ5IHRoZSBzdGF0aW9uIHdoZW4gdGhlIEFQIGhhcyBzZW50CisgdGhlIGxhc3QgNiBiZWFjb25zLCB3aXRoIHRoZSBjaGFubmVsIHN3aXRjaCBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcyBzZWVuCisgd2l0aCB0aGUgc25pZmZlci4qLworI2RlZmluZSBTSVJfQ0hBTlNXX1RYX1NUT1BfTUFYX0NPVU5UIDYKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgIGxpbVN0b3BUeEFuZFN3aXRjaENoYW5uZWwKK1xicmllZiAgU3RvcHMgdGhlIHRyYW5zbWlzc2lvbiBpZiBjaGFubmVsIHN3aXRjaCBtb2RlIGlzIHNpbGVudCBhbmQKKyAgICAgICAgc3RhcnRzIHRoZSBjaGFubmVsIHN3aXRjaCB0aW1lci4KKworXHBhcmFtICBwTWFjCitccmV0dXJuIE5PTkUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltU3RvcFR4QW5kU3dpdGNoQ2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IHNlc3Npb25JZCkKK3sKKyAgICB0QU5JX1U4IGlzRnVsbFBvd2VyUmVxdWVzdGVkID0gMDsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkNoYW5uZWwgc3dpdGNoIE1vZGUgPT0gJWRcbiIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaE1vZGUpOykKKworICAgIGlmIChwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoTW9kZSA9PSBlU0lSX0NIQU5TV19NT0RFX1NJTEVOVCB8fAorICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQgPD0gU0lSX0NIQU5TV19UWF9TVE9QX01BWF9DT1VOVCkKKyAgICB7CisgICAgICAgIC8qIEZyZWV6ZSB0aGUgdHJhbnNtaXNzaW9uICovCisgICAgICAgIGxpbUZyYW1lVHJhbnNtaXNzaW9uQ29udHJvbChwTWFjLCBlTElNX1RYX0FMTCwgZUxJTV9TVE9QX1RYKTsKKworICAgICAgICAvKlJlcXVlc3QgZm9yIEZ1bGwgcG93ZXIgb25seSBpZiB0aGUgZGV2aWNlIGlzIGluIHBvd2Vyc2F2ZSovCisgICAgICAgIGlmKCFsaW1Jc1N5c3RlbUluQWN0aXZlU3RhdGUocE1hYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlcXVlc3QgRnVsbCBQb3dlciAqLworICAgICAgICAgICAgbGltU2VuZFNtZVByZUNoYW5uZWxTd2l0Y2hJbmQocE1hYyk7CisgICAgICAgICAgICBpc0Z1bGxQb3dlclJlcXVlc3RlZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVzdW1lIHRoZSB0cmFuc21pc3Npb24gKi8KKyAgICAgICAgbGltRnJhbWVUcmFuc21pc3Npb25Db250cm9sKHBNYWMsIGVMSU1fVFhfQUxMLCBlTElNX1JFU1VNRV9UWCk7CisgICAgfQorCisgICAgLyogY2hhbmdlIHRoZSBjaGFubmVsIGltbWVkaWF0bHkgb25seSBpZiB0aGUgY2hhbm5lbCBzd2l0Y2ggY291bnQgaXMgMCBhbmQgdGhlIAorICAgICAqIGRldmljZSBpcyBub3QgaW4gcG93ZXJzYXZlIAorICAgICAqIElmIHRoZSBkZXZpY2UgaXMgaW4gcG93ZXJzYXZlIGNoYW5uZWwgc3dpdGNoIHNob3VsZCBoYXBwZW4gb25seSBhZnRlciB0aGUKKyAgICAgKiBkZXZpY2UgY29tZXMgb3V0IG9mIHRoZSBwb3dlcnNhdmUgKi8KKyAgICBpZiAocE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaENvdW50ID09IDApIAorICAgIHsKKyAgICAgICAgaWYobGltSXNTeXN0ZW1JbkFjdGl2ZVN0YXRlKHBNYWMpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Qcm9jZXNzQ2hhbm5lbFN3aXRjaFRpbWVvdXQocE1hYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZighaXNGdWxsUG93ZXJSZXF1ZXN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBGdWxsIHBvd2VyIGlzIGFscmVhZHkgbm90IHJlcXVlc3RlZCAKKyAgICAgICAgICAgICAqIFJlcXVlc3QgRnVsbCBQb3dlciBzbyB0aGUgY2hhbm5lbCBzd2l0Y2ggaGFwcGVucyAKKyAgICAgICAgICAgICAqIGFmdGVyIGRldmljZSBjb21lcyB0byBmdWxsIHBvd2VyICovCisgICAgICAgICAgICBsaW1TZW5kU21lUHJlQ2hhbm5lbFN3aXRjaEluZChwTWFjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsIDAsIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfVElNRVIpKTsKKworICAgIHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUNoYW5uZWxTd2l0Y2hUaW1lci5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKyAgICBpZiAodHhfdGltZXJfYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUNoYW5uZWxTd2l0Y2hUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgidHhfdGltZXJfYWN0aXZhdGUgZmFpbGVkXG4iKSk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgIGxpbVN0YXJ0Q2hhbm5lbFN3aXRjaAorXGJyaWVmICBTd2l0Y2hlcyB0aGUgY2hhbm5lbCBpZiBzd2l0Y2ggY291bnQgPT0gMCwgb3RoZXJ3aXNlCisgICAgICAgIHN0YXJ0cyB0aGUgdGltZXIgZm9yIGNoYW5uZWwgc3dpdGNoIGFuZCBzdG9wcyBCRyBzY2FuCisgICAgICAgIGFuZCBoZWFydGJlYXQgdGltZXIgdGVtcG9yb3JpbHkuCisKK1xwYXJhbSAgcE1hYworXHBhcmFtICBwc2Vzc2lvbkVudHJ5CitccmV0dXJuIE5PTkUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U2lyUmV0U3RhdHVzIGxpbVN0YXJ0Q2hhbm5lbFN3aXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlN0YXJ0aW5nIHRoZSBjaGFubmVsIHN3aXRjaFxuIikpOykKKyAgICAvKiBEZWFjdGl2YXRlIGFuZCBjaGFuZ2UgcmVjb25maWd1cmUgdGhlIHRpbWVvdXQgdmFsdWUgKi8KKyAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9DSEFOTkVMX1NXSVRDSF9USU1FUik7CisKKyAgICAvKiBGb2xsb3cgdGhlIGNoYW5uZWwgc3dpdGNoLCBmb3JnZXQgYWJvdXQgdGhlIHByZXZpb3VzIHF1aWV0LiAqLworICAgIC8vSWYgcXVpZXQgaXMgcnVubmluZywgY2hhbmNlIGlzIHRoZXJlIHRvIHJlc3VtZSB0eCBvbiBpdHMgdGltZW91dC4KKyAgICAvL3NvIHN0b3AgdGltZXIgZm9yIGEgc2FmZXIgc2lkZS4KKyAgICBpZiAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID09IGVMSU1fUVVJRVRfQkVHSU4pCisgICAgeworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9ERUFDVElWQVRFLCAwLCBlTElNX1FVSUVUX1RJTUVSKSk7CisgICAgICAgIGlmICh0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldFRpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInR4X3RpbWVyX2RlYWN0aXZhdGUgZmFpbGVkXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9PSBlTElNX1FVSUVUX1JVTk5JTkcpCisgICAgeworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9ERUFDVElWQVRFLCAwLCBlTElNX1FVSUVUX0JTU19USU1FUikpOworICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRCc3NUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJ0eF90aW1lcl9kZWFjdGl2YXRlIGZhaWxlZFxuIikpOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPSBlTElNX1FVSUVUX0lOSVQ7CisKKyAgICAvKiBQcmVwYXJlIGZvciAxMWggY2hhbm5lbCBzd2l0Y2ggKi8KKyAgICBsaW1QcmVwYXJlRm9yMTFoQ2hhbm5lbFN3aXRjaChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgIC8qKiBEb250IGFkZCBhbnkgbW9yZSBzdGF0ZW1lbnRzIGhlcmUgYXMgd2UgcG9zdGVkIGZpbmlzaCBzY2FuIHJlcXVlc3QKKyAgICAgKiB0byBIQUwsIHdhaXQgdGlsbCB3ZSBnZXQgdGhlIHJlc3BvbnNlCisgICAgICovCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworCisvKioKKyAqICBfX2xpbVByb2Nlc3NDaGFubmVsU3dpdGNoQWN0aW9uRnJhbWUKKyAqCisgKkZVTkNUSU9OOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcFJ4UGFja2V0SW5mbyAtIEEgcG9pbnRlciB0byBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCisKK19fbGltUHJvY2Vzc0NoYW5uZWxTd2l0Y2hBY3Rpb25GcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyAgICB0cFNpck1hY01nbXRIZHIgICAgICAgICBwSGRyOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICpwQm9keTsKKyAgICB0RG90MTFmQ2hhbm5lbFN3aXRjaCAgICAqcENoYW5uZWxTd2l0Y2hGcmFtZTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBiZWFjb25QZXJpb2Q7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgdmFsOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIGZyYW1lTGVuOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIG5TdGF0dXM7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICAgICAgc3RhdHVzOworCisgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKyAgICBwQm9keSA9IFdEQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pOworICAgIGZyYW1lTGVuID0gV0RBX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKTsKKworICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIlJlY2VpdmVkIENoYW5uZWwgc3dpdGNoIGFjdGlvbiBmcmFtZVxuIikpOykKKyAgICBpZiAoIXBzZXNzaW9uRW50cnktPmxpbTExaEVuYWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQ2hhbm5lbFN3aXRjaEZyYW1lLCBzaXplb2YoKnBDaGFubmVsU3dpdGNoRnJhbWUpKTsKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQsIHN0YXR1cyA9ICVkIFxuIiksIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBVbnBhY2sgY2hhbm5lbCBzd2l0Y2ggZnJhbWUgKi8KKyAgICBuU3RhdHVzID0gZG90MTFmVW5wYWNrQ2hhbm5lbFN3aXRjaChwTWFjLCBwQm9keSwgZnJhbWVMZW4sIHBDaGFubmVsU3dpdGNoRnJhbWUpOworCisgICAgaWYoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgIEZMKCAiRmFpbGVkIHRvIHVucGFjayBhbmQgcGFyc2UgYW4gMTFoLUNIQU5TVyBSZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgblN0YXR1cywKKyAgICAgICAgICAgIGZyYW1lTGVuKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQ2hhbm5lbFN3aXRjaEZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmKERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgIEZMKCAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbmcgYW4gMTFoLUNIQU5TVyBSZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgblN0YXR1cywKKyAgICAgICAgICAgIGZyYW1lTGVuKTsKKyAgICB9CisKKyAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsKHRBTklfVTggKikgJnBzZXNzaW9uRW50cnktPmJzc0lkLAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpCisgICAgeworICAgICAgICAjaWYgMAorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19CRUFDT05fSU5URVJWQUwsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQ2hhbm5lbFN3aXRjaEZyYW1lKTsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEJlYWNvbiBpbnRlcnZhbFxuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICNlbmRpZi8vIFRPIFNVUFBPUlQgQlQtQU1QCisKKyAgICAgICAgLyogY29weSB0aGUgYmVhY29uIGludGVydmFsIGZyb20gcHNlc3Npb25FbnRyeSovCisgICAgICAgIHZhbCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbDsKKworICAgICAgICBiZWFjb25QZXJpb2QgPSAodEFOSV9VMTYpIHZhbDsKKworICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2gucHJpbWFyeUNoYW5uZWwgPSBwQ2hhbm5lbFN3aXRjaEZyYW1lLT5DaGFuU3dpdGNoQW5uLm5ld0NoYW5uZWw7CisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hDb3VudCA9IHBDaGFubmVsU3dpdGNoRnJhbWUtPkNoYW5Td2l0Y2hBbm4uc3dpdGNoQ291bnQ7CisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hUaW1lb3V0VmFsdWUgPSBTWVNfTVNfVE9fVElDS1MoYmVhY29uUGVyaW9kKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQ7CisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hNb2RlID0gcENoYW5uZWxTd2l0Y2hGcmFtZS0+Q2hhblN3aXRjaEFubi5zd2l0Y2hNb2RlOworCisgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiUmN2IENobmwgU3d0Y2ggRnJhbWU6IFRpbWVvdXQgaW4gJWQgdGlja3NcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoVGltZW91dFZhbHVlKTspCisKKyAgICAgICAgLyogT25seSBwcmltYXJ5IGNoYW5uZWwgc3dpdGNoIGVsZW1lbnQgaXMgcHJlc2VudCAqLworICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUgPSBlTElNX0NIQU5ORUxfU1dJVENIX1BSSU1BUllfT05MWTsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnNlY29uZGFyeVN1YkJhbmQgPSBlQU5JX0NCX1NFQ09OREFSWV9OT05FOworCisgICAgICAgIGlmKEdFVF9DQl9BRE1JTl9TVEFURShwTWFjLT5saW0uZ0NiU3RhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2gocENoYW5uZWxTd2l0Y2hGcmFtZS0+RXh0Q2hhblN3aXRjaEFubi5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZUhUX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVF9VUDoKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN0YXRlID0gZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX0FORF9TRUNPTkRBUlk7CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zZWNvbmRhcnlTdWJCYW5kID0gZUFOSV9DQl9TRUNPTkRBUllfVVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX0RPV046CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSA9IGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9BTkRfU0VDT05EQVJZOworICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc2Vjb25kYXJ5U3ViQmFuZCA9IGVBTklfQ0JfU0VDT05EQVJZX0RPV047CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX05PTkU6CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLyogTm90aGluZyB0byBiZSBkb25lIGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJMSU06IFJlY2VpdmVkIGFjdGlvbiBmcmFtZSBub3QgZnJvbSBvdXIgQlNTLCBkcm9wcGluZy4uLiIpKTspCisgICAgfQorCisgICAgaWYgKGVTSVJfU1VDQ0VTUyAhPSBsaW1TdGFydENoYW5uZWxTd2l0Y2gocE1hYywgcHNlc3Npb25FbnRyeSkpCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJDb3VsZCBub3Qgc3RhcnQgY2hhbm5lbCBzd2l0Y2hcbiIpKTspCisgICAgfQorCisgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQ2hhbm5lbFN3aXRjaEZyYW1lKTsKKyAgICByZXR1cm47Cit9IC8qKiogZW5kIGxpbVByb2Nlc3NDaGFubmVsU3dpdGNoQWN0aW9uRnJhbWUoKSAqKiovCisKKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc0FkZFRzUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8sdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKworICAgIHRTaXJBZGR0c1JlcUluZm8gYWRkdHM7CisgICAgdFNpclJldFN0YXR1cyAgICByZXR2YWw7CisgICAgdHBTaXJNYWNNZ210SGRyICBwSGRyOworICAgIHRTaXJNYWNTY2hlZHVsZUlFIHNjaGVkdWxlOworICAgIHRwRHBoSGFzaE5vZGUgICAgcFN0YTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgc3RhdHVzOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICBhaWQ7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgIGZyYW1lTGVuOworICAgIHRBTklfVTggICAgICAgICAgICAgICpwQm9keTsKKyAgICB0QU5JX1U4IHRzcGVjSWR4ID0gMDsgLy9pbmRleCBpbiB0aGUgc2NoIHRzcGVjIHRhYmxlLgorCisgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKyAgICBwQm9keSA9IFdEQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pOworICAgIGZyYW1lTGVuID0gV0RBX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKTsKKworCisgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSl8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQlRfQU1QX0FQX1JPTEUpKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiQWRkVHMgcmVxdWVzdCBhdCBub24tQVA6IGlnbm9yaW5nXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcFN0YSA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBwSGRyLT5zYSwgJmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgIGlmIChwU3RhID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJTdGF0aW9uIGNvbnRleHQgbm90IGZvdW5kIC0gaWdub3JpbmcgQWRkVHNcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csICJBZGRUcyBSZXF1ZXN0IGZyb20gU1RBICVkXG4iLCBhaWQpOykKKyAgICByZXR2YWwgPSBzaXJDb252ZXJ0QWRkdHNSZXEyU3RydWN0KHBNYWMsIHBCb2R5LCBmcmFtZUxlbiwgJmFkZHRzKTsKKyAgICBpZiAocmV0dmFsICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkFkZFRzIHBhcnNpbmcgZmFpbGVkIChlcnJvciAlZClcbiIpLCByZXR2YWwpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTOworCisKKyAgICBpZiAoYWRkdHMud21lVHNwZWNQcmVzZW50KQorICAgIHsKKyAgICAgICAgaWYgKCghIHBzZXNzaW9uRW50cnktPmxpbVdtZUVuYWJsZWQpIHx8ICghIHBTdGEtPndtZUVuYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJJZ25vcmluZyBhZGR0cyByZXF1ZXN0OiB3bWUgbm90IGVuYWJsZWQvY2FwYWJsZVxuIikpOykKKyAgICAgICAgICAgIHN0YXR1cyA9IGVTSVJfTUFDX1dNRV9SRUZVU0VEX1NUQVRVUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIldNRSBBZGR0cyByZWNlaXZlZFxuIikpOykKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChhZGR0cy53c21Uc3BlY1ByZXNlbnQpCisgICAgeworICAgICAgICBpZiAoKCEgcHNlc3Npb25FbnRyeS0+bGltV3NtRW5hYmxlZCkgfHwgKCEgcFN0YS0+d3NtRW5hYmxlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIklnbm9yaW5nIGFkZHRzIHJlcXVlc3Q6IHdzbSBub3QgZW5hYmxlZC9jYXBhYmxlXG4iKSk7KQorICAgICAgICAgICAgc3RhdHVzID0gZVNJUl9NQUNfUkVRX0RFQ0xJTkVEX1NUQVRVUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIldTTSBBZGR0cyByZWNlaXZlZFxuIikpOykKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoISBwc2Vzc2lvbkVudHJ5LT5saW1Rb3NFbmFibGVkKSB8fCAoISBwU3RhLT5sbGVFbmFibGVkKSkKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIklnbm9yaW5nIGFkZHRzIHJlcXVlc3Q6IHFvcyBub3QgZW5hYmxlZC9jYXBhYmxlXG4iKSk7KQorICAgICAgICBzdGF0dXMgPSBlU0lSX01BQ19SRVFfREVDTElORURfU1RBVFVTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCIxMWUgUW9TIEFkZHRzIHJlY2VpdmVkXG4iKSk7KQorICAgIH0KKworICAgIC8vIGZvciBlZGNhLCBpZiBubyBBZG1pdCBDb250cm9sLCBpZ25vcmUgdGhlIHJlcXVlc3QKKyAgICBpZiAoKHN0YXR1cyA9PSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUykgJiYKKyAgICAgICAgKGFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSA9PSBTSVJfTUFDX0FDQ0VTU1BPTElDWV9FRENBKSAmJgorICAgICAgICAoISBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDW3VwVG9BYyhhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbyldLmFjaS5hY20pKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJBZGRUcyB3aXRoIFVQICVkIGhhcyBubyBBQ00gLSBpZ25vcmluZyByZXF1ZXN0XG4iKSwKKyAgICAgICAgICAgICAgIGFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvKTsKKyAgICAgICAgc3RhdHVzID0gKGFkZHRzLndtZVRzcGVjUHJlc2VudCkgPworICAgICAgICAgICAgICAgICBlU0lSX01BQ19XTUVfUkVGVVNFRF9TVEFUVVMgOiBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAhPSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUykKKyAgICB7CisgICAgICAgIGxpbVNlbmRBZGR0c1JzcEFjdGlvbkZyYW1lKHBNYWMsIHBIZHItPnNhLCBzdGF0dXMsICZhZGR0cywgTlVMTCxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHRyeSB0byBhZG1pdCB0aGUgU1RBIGFuZCBzZW5kIHRoZSBhcHByb3ByaWF0ZSByZXNwb25zZQorICAgIHJldHZhbCA9IGxpbUFkbWl0Q29udHJvbEFkZFRTKHBNYWMsICZwU3RhLT5zdGFBZGRyWzBdLCAmYWRkdHMsIE5VTEwsIHBTdGEtPmFzc29jSWQsIHRydWUsICZzY2hlZHVsZSwgJnRzcGVjSWR4LCBwc2Vzc2lvbkVudHJ5KTsKKyAgICBpZiAocmV0dmFsICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIlVuYWJsZSB0byBhZG1pdCBUU1xuIikpOykKKyAgICAgICAgc3RhdHVzID0gKGFkZHRzLndtZVRzcGVjUHJlc2VudCkgPworICAgICAgICAgICAgICAgICBlU0lSX01BQ19XTUVfUkVGVVNFRF9TVEFUVVMgOiBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisgICAgfQorICAgIGVsc2UgaWYgKGFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSA9PSBTSVJfTUFDX0FDQ0VTU1BPTElDWV9FRENBKQorICAgIHsKKyAgICAgICAgaWYoZVNJUl9TVUNDRVNTICE9IGxpbVNlbmRIYWxNc2dBZGRUcyhwTWFjLCBwU3RhLT5zdGFJbmRleCwgdHNwZWNJZHgsIGFkZHRzLnRzcGVjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCkpCisgICAgICAgIHsKKyAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIkFkZFRzIHdpdGggVVAgJWQgZmFpbGVkIGluIGxpbVNlbmRIYWxNc2dBZGRUcyAtIGlnbm9yaW5nIHJlcXVlc3RcbiIpLAorICAgICAgICAgICAgICAgICBhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbyk7CisgICAgICAgICAgc3RhdHVzID0gKGFkZHRzLndtZVRzcGVjUHJlc2VudCkgPworICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX1dNRV9SRUZVU0VEX1NUQVRVUyA6IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKworICAgICAgICAgICBsaW1BZG1pdENvbnRyb2xEZWxldGVUUyhwTWFjLCBwU3RhLT5hc3NvY0lkLCAmYWRkdHMudHNwZWMudHNpbmZvLCBOVUxMLCAmdHNwZWNJZHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgIT0gZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbVNlbmRBZGR0c1JzcEFjdGlvbkZyYW1lKHBNYWMsIHBIZHItPnNhLCBzdGF0dXMsICZhZGR0cywgTlVMTCxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyNpZiAwIC8vb25seSBFRENBIGlzIHN1cHBvcnRlZCBub3cuCisgICAgZWxzZSBpZiAoYWRkdHMubnVtVGNsYXMgPiAxKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJTdGEgJWQ6IFRvbyBtYW55IFRjbGFzICglZCksIG9ubHkgMSBzdXBwb3J0ZWRcbiIpLAorICAgICAgICAgICAgICAgYWlkLCBhZGR0cy5udW1UY2xhcyk7CisgICAgICAgIHN0YXR1cyA9IChhZGR0cy53bWVUc3BlY1ByZXNlbnQpID8KKyAgICAgICAgICAgICAgICAgZVNJUl9NQUNfV01FX1JFRlVTRURfU1RBVFVTIDogZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworICAgIH0KKyAgICBlbHNlIGlmIChhZGR0cy5udW1UY2xhcyA9PSAxKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csICJBZGRUcyBSZXF1ZXN0IGZyb20gU1RBICVkOiB0c2lkICVkLCBVUCAlZCwgT0shXG4iLCBhaWQsCisgICAgICAgICAgICAgICBhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy50c2lkLCBhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbyk7CisgICAgICAgIHN0YXR1cyA9IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTOworICAgIH0KKyNlbmRpZgorCisgICAgbGltTG9nKHBNYWMsIExPR1csICJBZGRUcyBSZXF1ZXN0IGZyb20gU1RBICVkOiBTZW5kaW5nIEFkZFRzIFJlc3BvbnNlIHdpdGggc3RhdHVzICVkXG4iLAorICAgICAgICAgICBhaWQsIHN0YXR1cyk7CisKKyAgICBsaW1TZW5kQWRkdHNSc3BBY3Rpb25GcmFtZShwTWFjLCBwSGRyLT5zYSwgc3RhdHVzLCAmYWRkdHMsICZzY2hlZHVsZSxwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NBZGRUc1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFNpckFkZHRzUnNwSW5mbyBhZGR0czsKKyAgICB0U2lyUmV0U3RhdHVzICAgIHJldHZhbDsKKyAgICB0cFNpck1hY01nbXRIZHIgIHBIZHI7CisgICAgdHBEcGhIYXNoTm9kZSAgICBwU3RhOworICAgIHRBTklfVTE2ICAgICAgICAgYWlkOworICAgIHRBTklfVTMyICAgICAgICAgZnJhbWVMZW47CisgICAgdEFOSV9VOCAgICAgICAgICAqcEJvZHk7CisgICAgdHBMaW1Uc3BlY0luZm8gICB0c3BlY0luZm87CisgICAgdEFOSV9VOCAgICAgICAgICBhYzsgCisgICAgdHBEcGhIYXNoTm9kZSAgICBwU3RhRHMgPSBOVUxMOworICAgIHRBTklfVTggICAgICAgICAgcnNwUmVxZCA9IDE7CisgICAgdEFOSV9VMzIgICBjZmdMZW47CisgICAgdFNpck1hY0FkZHIgIHBlZXJNYWNBZGRyOworCisKKyAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworICAgIHBCb2R5ID0gV0RBX0dFVF9SWF9NUERVX0RBVEEocFJ4UGFja2V0SW5mbyk7CisgICAgZnJhbWVMZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pOworCisKKyAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csICJSZWN2IEFkZFRzIFJlc3BvbnNlXG4iKTspCisgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSl8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiQWRkVHNSc3AgcmVjdmQgYXQgQVA6IGlnbm9yaW5nXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcFN0YSA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBwSGRyLT5zYSwgJmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgIGlmIChwU3RhID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJTdGF0aW9uIGNvbnRleHQgbm90IGZvdW5kIC0gaWdub3JpbmcgQWRkVHNSc3BcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXR2YWwgPSBzaXJDb252ZXJ0QWRkdHNSc3AyU3RydWN0KHBNYWMsIHBCb2R5LCBmcmFtZUxlbiwgJmFkZHRzKTsKKyAgICBpZiAocmV0dmFsICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkFkZFRzUnNwIHBhcnNpbmcgZmFpbGVkIChlcnJvciAlZClcbiIpLCByZXR2YWwpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGRvbid0IGhhdmUgdG8gY2hlY2sgZm9yIHFvcy93bWUgY2FwYWJpbGl0aWVzIHNpbmNlIHdlIHdvdWxkbid0IGhhdmUgdGhpcworICAgIC8vIGZsYWcgc2V0IG90aGVyd2lzZQorICAgIGlmICghIHBNYWMtPmxpbS5nTGltQWRkdHNTZW50KQorICAgIHsKKyAgICAgICAgLy8gd2UgbmV2ZXIgc2VudCBhbiBhZGR0cyByZXF1ZXN0IQorICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csICJSZWN2ZCBBZGRUc1JzcCBidXQgbm8gcmVxdWVzdCB3YXMgZXZlciBzZW50IC0gaWdub3JpbmdcbiIpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwTWFjLT5saW0uZ0xpbUFkZHRzUmVxLnJlcS5kaWFsb2dUb2tlbiAhPSBhZGR0cy5kaWFsb2dUb2tlbikKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCAiQWRkVHNSc3A6IHRva2VuIG1pc21hdGNoIChnb3QgJWQsIGV4cCAlZCkgLSBpZ25vcmluZ1xuIiwKKyAgICAgICAgICAgICAgIGFkZHRzLmRpYWxvZ1Rva2VuLCBwTWFjLT5saW0uZ0xpbUFkZHRzUmVxLnJlcS5kaWFsb2dUb2tlbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGZvciBzdWNjZXNzZnVsIGFkZHRzIHJlcG9uc2UsIHRyeSB0byBhZGQgdGhlIGNsYXNzaWZpZXIuCisgICAgICogaWYgdGhpcyBmYWlscyBmb3IgYW55IHJlYXNvbiwgd2Ugc2hvdWxkIHNlbmQgYSBkZWx0cyByZXF1ZXN0IHRvIHRoZSBhcAorICAgICAqIGZvciBub3csIGl0cyBvayBub3QgdG8gc2VuZCBhIGRlbHRzIHNpbmNlIHdlIGFyZSBnb2luZyB0byBhZGQgc3VwcG9ydCBmb3IKKyAgICAgKiBtdWx0aXBsZSB0Y2xhcyBzb29uIGFuZCB1bnRpbCB0aGVuIHdlIHdvbid0IHNlbmQgYW55IGFkZHRzIHJlcXVlc3RzIHdpdGgKKyAgICAgKiBtdWx0aXBsZSB0Y2xhcyBlbGVtZW50cyBhbnl3YXkuCisgICAgICogSW4gY2FzZSBvZiBhZGRDbGFzc2lmaWVyIGZhaWx1cmUsIHdlIGp1c3QgbGV0IHRoZSBhZGR0cyB0aW1lciBydW4gb3V0CisgICAgICovCisgICAgaWYgKCgoYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID09IFNJUl9NQUNfQUNDRVNTUE9MSUNZX0hDQ0EpIHx8CisgICAgICAgICAoYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID09IFNJUl9NQUNfQUNDRVNTUE9MSUNZX0JPVEgpKSAmJgorICAgICAgICAoYWRkdHMuc3RhdHVzID09IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTKSkKKyAgICB7CisgICAgICAgIC8vIGFkZCB0aGUgY2xhc3NpZmllciAtIHRoaXMgc2hvdWxkIGFsd2F5cyBzdWNjZWVkCisgICAgICAgIGlmIChhZGR0cy5udW1UY2xhcyA+IDEpIC8vIGN1cnJlbnRseSBubyBzdXBwb3J0IGZvciBtdWx0aXBsZSB0Y2xhcyBlbGVtZW50cworICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlN0YSAlZDogVG9vIG1hbnkgVGNsYXMgKCVkKSwgb25seSAxIHN1cHBvcnRlZFxuIiksCisgICAgICAgICAgICAgICAgICAgYWlkLCBhZGR0cy5udW1UY2xhcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYWRkdHMubnVtVGNsYXMgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csICJBZGRUcyBSZXNwb25zZSBmcm9tIFNUQSAlZDogdHNpZCAlZCwgVVAgJWQsIE9LIVxuIiwgYWlkLAorICAgICAgICAgICAgICAgICAgIGFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnRzaWQsIGFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBsaW1Mb2cocE1hYywgTE9HVywgIlJlY3YgQWRkVHNSc3A6IHRzaWQgJWQsIFVQICVkLCBzdGF0dXMgJWQgXG4iLAorICAgICAgICAgIGFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnRzaWQsIGFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvLAorICAgICAgICAgIGFkZHRzLnN0YXR1cyk7CisKKyAgICAvLyBkZWFjdGl2YXRlIHRoZSByZXNwb25zZSB0aW1lcgorICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0FERFRTX1JTUF9USU1FUik7CisKKyAgICBpZiAoYWRkdHMuc3RhdHVzICE9IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csICJSZWN2IEFkZFRzUnNwOiB0c2lkICVkLCBVUCAlZCwgc3RhdHVzICVkIFxuIiwKKyAgICAgICAgICAgICAgYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZCwgYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW8sCisgICAgICAgICAgICAgIGFkZHRzLnN0YXR1cyk7CisgICAgICAgIGxpbVNlbmRTbWVBZGR0c1JzcChwTWFjLCB0cnVlLCBhZGR0cy5zdGF0dXMsIHBzZXNzaW9uRW50cnksIGFkZHRzLnRzcGVjLCAKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQsIHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQpOworCisgICAgICAgIC8vIGNsZWFyIHRoZSBhZGR0cyBmbGFnCisgICAgICAgIHBNYWMtPmxpbS5nTGltQWRkdHNTZW50ID0gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgaWYgKGFkZHRzLnRzbVByZXNlbnQpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgIlRTTSBJRSBQcmVzZW50XG4iKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+Y2N4Q29udGV4dC50c20udGlkID0gYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW87CisgICAgICAgIHZvc19tZW1fY29weSgmcHNlc3Npb25FbnRyeS0+Y2N4Q29udGV4dC50c20udHNtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZHRzLnRzbUlFLHNpemVvZih0U2lyTWFjQ0NYVFNNSUUpKTsKKyAgICAgICAgbGltQWN0aXZhdGVUU01TdGF0c1RpbWVyKHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgIH0KKyNlbmRpZgorICAgIC8qIFNpbmNlIEFkZFRTIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsLCBjaGVjayBmb3IgdGhlIFBTQiBmbGFnCisgICAgICogYW5kIGRpcmVjdGlvbmFsIGZsYWcgaW5zaWRlIHRoZSBUUyBJbmZvIGZpZWxkLiAKKyAgICAgKiBBbiBBQyBpcyB0cmlnZ2VyIGVuYWJsZWQgQUMgaWYgdGhlIFBTQiBzdWJmaWVsZCBpcyBzZXQgdG8gMSAgCisgICAgICogaW4gdGhlIHVwbGluayBkaXJlY3Rpb24uCisgICAgICogQW4gQUMgaXMgZGVsaXZlcnkgZW5hYmxlZCBBQyBpZiB0aGUgUFNCIHN1YmZpZWxkIGlzIHNldCB0byAxIAorICAgICAqIGluIHRoZSBkb3dubGluayBkaXJlY3Rpb24uCisgICAgICogQW4gQUMgaXMgdHJpZ2dlciBhbmQgZGVsaXZlcnkgZW5hYmxlZCBBQyBpZiB0aGUgUFNCIHN1YmZpZWxkICAKKyAgICAgKiBpcyBzZXQgdG8gMSBpbiB0aGUgYmktZGlyZWN0aW9uIGZpZWxkLgorICAgICAqLworICAgIGlmIChhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy5wc2IgPT0gMSkKKyAgICAgICAgbGltU2V0VHNwZWNVYXBzZE1hc2socE1hYywgJmFkZHRzLnRzcGVjLnRzaW5mbywgU0VUX1VBUFNEX01BU0spOworICAgIGVsc2UgCisgICAgICAgIGxpbVNldFRzcGVjVWFwc2RNYXNrKHBNYWMsICZhZGR0cy50c3BlYy50c2luZm8sIENMRUFSX1VBUFNEX01BU0spOworCisKKyAgICAvKiBBRERUUyBzdWNjZXNzLCBzbyBBQyBpcyBub3cgYWRtaXR0ZWQuIFdlIHNoYWxsIG5vdyB1c2UgdGhlIGRlZmF1bHQKKyAgICAgKiBFRENBIHBhcmFtZXRlcnMgYXMgYWR2ZXJ0aXNlZCBieSBBUCBhbmQgc2VuZCB0aGUgdXBkYXRlZCBFRENBIHBhcmFtcworICAgICAqIHRvIEhBTC4gCisgICAgICovCisgICAgYWMgPSB1cFRvQWMoYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW8pOworICAgIGlmKGFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLmRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9VUExJTkspCisgICAgeworICAgICAgcE1hYy0+bGltLmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9VUExJTktdIHw9ICgxIDw8IGFjKTsKKyAgICB9CisgICAgZWxzZSBpZihhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LKQorICAgIHsKKyAgICAgIHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LXSB8PSAoMSA8PCBhYyk7CisgICAgfQorICAgIGVsc2UgaWYoYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX0JJRElSKQorICAgIHsKKyAgICAgIHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LXSB8PSAoMSA8PCBhYyk7CisgICAgICBwTWFjLT5saW0uZ0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX0ROTElOS10gfD0gKDEgPDwgYWMpOworICAgIH0KKworICAgIGxpbVNldEFjdGl2ZUVkY2FQYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXMsIHBzZXNzaW9uRW50cnkpOworCisgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgaWYgKHBTdGFEcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKHBTdGFEcy0+YW5pUGVlciA9PSBlQU5JX0JPT0xFQU5fVFJVRSkgCisgICAgICAgICAgICBsaW1TZW5kRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwgcFN0YURzLT5ic3NJZCwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaW1TZW5kRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwgcFN0YURzLT5ic3NJZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNlbGYgZW50cnkgbWlzc2luZyBpbiBIYXNoIFRhYmxlIFxuIikpOworCisgICAgICAgIAorICAgIHNpckNvcHlNYWNBZGRyKHBlZXJNYWNBZGRyLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworICAgIC8vaWYgc2NoZWR1bGUgaXMgbm90IHByZXNlbnQgdGhlbiBhZGQgVFNQRUMgd2l0aCBzdmNJbnRlcnZhbCBhcyAwLgorICAgIGlmKCFhZGR0cy5zY2hlZHVsZVByZXNlbnQpCisgICAgICBhZGR0cy5zY2hlZHVsZS5zdmNJbnRlcnZhbCA9IDA7CisgICAgaWYoZVNJUl9TVUNDRVNTICE9IGxpbVRzcGVjQWRkKHBNYWMsIHBTdGEtPnN0YUFkZHIsIHBTdGEtPmFzc29jSWQsICZhZGR0cy50c3BlYywgIGFkZHRzLnNjaGVkdWxlLnN2Y0ludGVydmFsLCAmdHNwZWNJbmZvKSkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkFkZGluZyBlbnRyeSBpbiBsaW0gVHNwZWMgVGFibGUgZmFpbGVkIFxuIikpOykKKyAgICAgICAgbGltU2VuZERlbHRzUmVxQWN0aW9uRnJhbWUocE1hYywgcGVlck1hY0FkZHIsIHJzcFJlcWQsICZhZGR0cy50c3BlYy50c2luZm8sICZhZGR0cy50c3BlYywKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1BZGR0c1NlbnQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOyAgIC8vRXJyb3IgaGFuZGxpbmcuIHNlbmQgdGhlIHJlc3BvbnNlIHdpdGggZXJyb3Igc3RhdHVzLiBuZWVkIHRvIHNlbmQgRGVsVFMgdG8gdGVhciBkb3duIHRoZSBUU1BFQyBzdGF0dXMuCisgICAgfQorICAgIGlmKChhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy5hY2Nlc3NQb2xpY3kgIT0gU0lSX01BQ19BQ0NFU1NQT0xJQ1lfRURDQSkgfHwKKyAgICAgICAoKHVwVG9BYyhhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbykgPCBNQVhfTlVNX0FDKSAmJgorICAgICAgIChwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1t1cFRvQWMoYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW8pXS5hY2kuYWNtKSkpCisgICAgeworICAgICAgICByZXR2YWwgPSBsaW1TZW5kSGFsTXNnQWRkVHMocE1hYywgcFN0YS0+c3RhSW5kZXgsIHRzcGVjSW5mby0+aWR4LCBhZGR0cy50c3BlYywgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworICAgICAgICBpZihlU0lSX1NVQ0NFU1MgIT0gcmV0dmFsKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1BZG1pdENvbnRyb2xEZWxldGVUUyhwTWFjLCBwU3RhLT5hc3NvY0lkLCAmYWRkdHMudHNwZWMudHNpbmZvLCBOVUxMLCAmdHNwZWNJbmZvLT5pZHgpOworICAgIAorICAgICAgICAgICAgLy8gU2VuZCBERUxUUyBhY3Rpb24gZnJhbWUgdG8gQVAgICAgICAgIAorICAgICAgICAgICAgY2ZnTGVuID0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgICAgIGxpbVNlbmREZWx0c1JlcUFjdGlvbkZyYW1lKHBNYWMsIHBlZXJNYWNBZGRyLCByc3BSZXFkLCAmYWRkdHMudHNwZWMudHNpbmZvLCAmYWRkdHMudHNwZWMsCisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgbGltU2VuZFNtZUFkZHRzUnNwKHBNYWMsIHRydWUsIHJldHZhbCwgcHNlc3Npb25FbnRyeSwgYWRkdHMudHNwZWMsCisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCwgcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkFkZFRzUnNwIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseShVUCAlZCwgVFNJRCAlZClcbiIpLAorICAgICAgICAgICBhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbywgYWRkdHMudHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZCk7KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJBZGRUc1JzcCByZWNlaXZlZCBzdWNjZXNzZnVsbHkoVVAgJWQsIFRTSUQgJWQpXG4iKSwKKyAgICAgICAgICAgICAgIGFkZHRzLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvLCBhZGR0cy50c3BlYy50c2luZm8udHJhZmZpYy50c2lkKTspCisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIm5vIEFDTTogQnlwYXNzIHNlbmRpbmcgV0RBX0FERF9UU19SRVEgdG8gSEFMIFxuIikpOykKKyAgICAgICAgLy8gVXNlIHRoZSBzbWVzZXNzaW9uSWQgYW5kIHNtZXRyYW5zYWN0aW9uSWQgZnJvbSB0aGUgUEUgc2Vzc2lvbiBjb250ZXh0CisgICAgICAgIGxpbVNlbmRTbWVBZGR0c1JzcChwTWFjLCB0cnVlLCBlU0lSX1NNRV9TVUNDRVNTLCBwc2Vzc2lvbkVudHJ5LCBhZGR0cy50c3BlYywKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQsIHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQpOworICAgIH0KKworICAgIC8vIGNsZWFyIHRoZSBhZGR0cyBmbGFnCisgICAgcE1hYy0+bGltLmdMaW1BZGR0c1NlbnQgPSBmYWxzZTsKKyAgICByZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc0RlbFRzUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8sdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyUmV0U3RhdHVzICAgIHJldHZhbDsKKyAgICB0U2lyRGVsdHNSZXFJbmZvIGRlbHRzOworICAgIHRwU2lyTWFjTWdtdEhkciAgcEhkcjsKKyAgICB0cERwaEhhc2hOb2RlICAgIHBTdGE7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgIGZyYW1lTGVuOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICBhaWQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgKnBCb2R5OworICAgIHRBTklfVTggICAgICAgICAgICAgICB0c1N0YXR1czsKKyAgICB0U2lyTWFjVFNJbmZvICAgKnRzaW5mbzsKKyAgICB0QU5JX1U4IHRzcGVjSWR4OworICAgIHRBTklfVTggIGFjOworICAgIHRwRHBoSGFzaE5vZGUgIHBTdGFEcyA9IE5VTEw7CisKKworICAgIHBIZHIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisgICAgcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKyAgICBmcmFtZUxlbiA9IFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbyk7CisKKyAgICBwU3RhID0gZHBoTG9va3VwSGFzaEVudHJ5KHBNYWMsIHBIZHItPnNhLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgaWYgKHBTdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlN0YXRpb24gY29udGV4dCBub3QgZm91bmQgLSBpZ25vcmluZyBEZWxUc1xuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHBhcnNlIHRoZSBkZWx0cyByZXF1ZXN0CisgICAgcmV0dmFsID0gc2lyQ29udmVydERlbHRzUmVxMlN0cnVjdChwTWFjLCBwQm9keSwgZnJhbWVMZW4sICZkZWx0cyk7CisgICAgaWYgKHJldHZhbCAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJEZWxUcyBwYXJzaW5nIGZhaWxlZCAoZXJyb3IgJWQpXG4iKSwgcmV0dmFsKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZGVsdHMud21lVHNwZWNQcmVzZW50KQorICAgIHsKKyAgICAgICAgaWYgKCghcHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCkgfHwgKCEgcFN0YS0+d21lRW5hYmxlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIklnbm9yaW5nIGRlbHRzIHJlcXVlc3Q6IHdtZSBub3QgZW5hYmxlZC9jYXBhYmxlXG4iKSk7KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIldNRSBEZWx0cyByZWNlaXZlZFxuIikpOykKKyAgICB9CisgICAgZWxzZSBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQpICYmIHBTdGEtPmxsZUVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiMTFlIFFvUyBEZWx0cyByZWNlaXZlZFxuIikpOykKKyAgICAgICAgfQorICAgIGVsc2UgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1Xc21FbmFibGVkKSAmJiBwU3RhLT53c21FbmFibGVkKQorICAgICAgICB7CisgICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIldTTSBEZWx0cyByZWNlaXZlZFxuIikpOykKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIklnbm9yaW5nIGRlbHRzIHJlcXVlc3Q6IHFvcyBub3QgZW5hYmxlZC9jYXBhYmxlXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdHNpbmZvID0gZGVsdHMud21lVHNwZWNQcmVzZW50ID8gJmRlbHRzLnRzcGVjLnRzaW5mbyA6ICZkZWx0cy50c2luZm87CisKKyAgICAvLyBpZiBubyBBZG1pdCBDb250cm9sLCBpZ25vcmUgdGhlIHJlcXVlc3QKKyAgICBpZiAoKHRzaW5mby0+dHJhZmZpYy5hY2Nlc3NQb2xpY3kgPT0gU0lSX01BQ19BQ0NFU1NQT0xJQ1lfRURDQSkpCisgICAgeworICAgIAorI2lmKGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgfHwgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQX1NESykpCisgICAgICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgJiYKKyAgICAgICAgKCEgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1t1cFRvQWModHNpbmZvLT50cmFmZmljLnVzZXJQcmlvKV0uYWNpLmFjbSkpIHx8CisgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSAmJgorICAgICAgICAoISBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1t1cFRvQWModHNpbmZvLT50cmFmZmljLnVzZXJQcmlvKV0uYWNpLmFjbSkpKQorI2Vsc2UKKyAgICAgICAgaWYgKCh1cFRvQWModHNpbmZvLT50cmFmZmljLnVzZXJQcmlvKSA+PSBNQVhfTlVNX0FDKSB8fCAoISBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1t1cFRvQWModHNpbmZvLT50cmFmZmljLnVzZXJQcmlvKV0uYWNpLmFjbSkpCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJEZWxUcyB3aXRoIFVQICVkIGhhcyBubyBBQyAtIGlnbm9yaW5nIHJlcXVlc3RcbiIpLAorICAgICAgICAgICAgICAgICAgIHRzaW5mby0+dHJhZmZpYy51c2VyUHJpbyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0cnkgdG8gZGVsZXRlIHRoZSBUUworICAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gbGltQWRtaXRDb250cm9sRGVsZXRlVFMocE1hYywgcFN0YS0+YXNzb2NJZCwgdHNpbmZvLCAmdHNTdGF0dXMsICZ0c3BlY0lkeCkpCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJVbmFibGUgdG8gRGVsZXRlIFRTXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZWxzZSBpZiAoKHRzaW5mby0+dHJhZmZpYy5hY2Nlc3NQb2xpY3kgPT0gU0lSX01BQ19BQ0NFU1NQT0xJQ1lfSENDQSkgfHwKKyAgICAgICAgICAgICAodHNpbmZvLT50cmFmZmljLmFjY2Vzc1BvbGljeSA9PSBTSVJfTUFDX0FDQ0VTU1BPTElDWV9CT1RIKSkKKyAgICB7CisgICAgICAvL0VkY2Egb25seSBmb3Igbm93LgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy9zZW5kIG1lc3NhZ2UgdG8gSEFMIHRvIGRlbGV0ZSBUUworICAgICAgaWYoZVNJUl9TVUNDRVNTICE9IGxpbVNlbmRIYWxNc2dEZWxUcyhwTWFjLCBwU3RhLT5zdGFJbmRleCwgdHNwZWNJZHgsIGRlbHRzKSkKKyAgICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJEZWxUcyB3aXRoIFVQICVkIGZhaWxlZCBpbiBsaW1TZW5kSGFsTXNnRGVsVHMgLSBpZ25vcmluZyByZXF1ZXN0XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0c2luZm8tPnRyYWZmaWMudXNlclByaW8pOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIC8qIFdlIHN1Y2Nlc3NmdWxseSBkZWxldGVkIHRoZSBUU1BFQy4gVXBkYXRlIHRoZSBkeW5hbWljIFVBUFNEIE1hc2suCisgICAgICogVGhlIEFDIGZvciB0aGlzIFRTUEVDIGlzIG5vIGxvbmdlciB0cmlnZ2VyIGVuYWJsZWQgaWYgdGhpcyBUc3BlYworICAgICAqIHdhcyBzZXQtdXAgaW4gdXBsaW5rIGRpcmVjdGlvbiBvbmx5LgorICAgICAqIFRoZSBBQyBmb3IgdGhpcyBUU1BFQyBpcyBubyBsb25nZXIgZGVsaXZlcnkgZW5hYmxlZCBpZiB0aGlzIFRzcGVjCisgICAgICogd2FzIHNldC11cCBpbiBkb3dubGluayBkaXJlY3Rpb24gb25seS4KKyAgICAgKiBUaGUgQUMgZm9yIHRoaXMgVFNQRUMgaXMgbm8gbG9uZ2VyIHRyaWlnZXIgZW5hYmxlZCBhbmQgZGVsaXZlcnkgCisgICAgICogZW5hYmxlZCBpZiB0aGlzIFRzcGVjIHdhcyBhIGJpZGlyZWN0aW9uYWwgVFNQRUMuCisgICAgICovCisgICAgbGltU2V0VHNwZWNVYXBzZE1hc2socE1hYywgdHNpbmZvLCBDTEVBUl9VQVBTRF9NQVNLKTsKKworCisgICAgLyogV2UncmUgZGVsZXRpbmcgdGhlIFRTUEVDLgorICAgICAqIFRoZSBBQyBmb3IgdGhpcyBUU1BFQyBpcyBubyBsb25nZXIgYWRtaXR0ZWQgaW4gdXBsaW5rL2Rvd25saW5rIGRpcmVjdGlvbgorICAgICAqIGlmIHRoaXMgVFNQRUMgd2FzIHNldC11cCBpbiB1cGxpbmsvZG93bmxpbmsgZGlyZWN0aW9uIG9ubHkuCisgICAgICogVGhlIEFDIGZvciB0aGlzIFRTUEVDIGlzIG5vIGxvbmdlciBhZG1pdHRlZCBpbiBib3RoIHVwbGluayBhbmQgZG93bmxpbmsKKyAgICAgKiBkaXJlY3Rpb25zIGlmIHRoaXMgVFNQRUMgd2FzIGEgYmktZGlyZWN0aW9uYWwgVFNQRUMuCisgICAgICogSWYgQUNNIGlzIHNldCBmb3IgdGhpcyBBQyBhbmQgdGhpcyBBQyBpcyBhZG1pdHRlZCBvbmx5IGluIGRvd25saW5rCisgICAgICogZGlyZWN0aW9uLCBQRSBuZWVkcyB0byBkb3duZ3JhZGUgdGhlIEVEQ0EgcGFyYW1ldGVyIAorICAgICAqIChmb3IgdGhlIEFDIGZvciB3aGljaCBUUyBpcyBiZWluZyBkZWxldGVkKSB0byB0aGUKKyAgICAgKiBuZXh0IGJlc3QgQUMgZm9yIHdoaWNoIEFDTSBpcyBub3QgZW5hYmxlZCwgYW5kIHNlbmQgdGhlCisgICAgICogdXBkYXRlZCB2YWx1ZXMgdG8gSEFMLiAKKyAgICAgKi8gCisgICAgYWMgPSB1cFRvQWModHNpbmZvLT50cmFmZmljLnVzZXJQcmlvKTsKKworICAgIGlmKHRzaW5mby0+dHJhZmZpYy5kaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LKQorICAgIHsKKyAgICAgIHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LXSAmPSB+KDEgPDwgYWMpOworICAgIH0KKyAgICBlbHNlIGlmKHRzaW5mby0+dHJhZmZpYy5kaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LKQorICAgIHsKKyAgICAgIHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LXSAmPSB+KDEgPDwgYWMpOworICAgIH0KKyAgICBlbHNlIGlmKHRzaW5mby0+dHJhZmZpYy5kaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fQklESVIpCisgICAgeworICAgICAgcE1hYy0+bGltLmdBY0FkbWl0TWFza1tTSVJfTUFDX0RJUkVDVElPTl9VUExJTktdICY9IH4oMSA8PCBhYyk7CisgICAgICBwTWFjLT5saW0uZ0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX0ROTElOS10gJj0gfigxIDw8IGFjKTsKKyAgICB9CisKKyAgICBsaW1TZXRBY3RpdmVFZGNhUGFyYW1zKHBNYWMsIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgIGlmIChwU3RhRHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChwU3RhRHMtPmFuaVBlZXIgPT0gZUFOSV9CT09MRUFOX1RSVUUpIAorICAgICAgICAgICAgbGltU2VuZEVkY2FQYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmUsIHBTdGFEcy0+YnNzSWQsIGVBTklfQk9PTEVBTl9UUlVFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGltU2VuZEVkY2FQYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmUsIHBTdGFEcy0+YnNzSWQsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJTZWxmIGVudHJ5IG1pc3NpbmcgaW4gSGFzaCBUYWJsZSBcbiIpKTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkRlbGV0ZVRTIHN1Y2NlZWRlZFxuIikpOykKKyAgICBpZigocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX0FQX1JPTEUpJiYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX0JUX0FNUF9BUF9ST0xFKSkKKyAgICAgIGxpbVNlbmRTbWVEZWx0c0luZChwTWFjLCAmZGVsdHMsIGFpZCxwc2Vzc2lvbkVudHJ5KTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYyxlTElNX1RTTV9USU1FUik7CisjZW5kaWYKKworfQorCisKKyNpZmRlZiBBTklfU1VQUE9SVF8xMUgKKy8qKgorICogIGxpbVByb2Nlc3NCYXNpY01lYXNSZXEKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lYXN1cmVtZW50UmVxdWVzdEZyYW1lKCkKKyAqIHdoZW4gaXQgcmVjZWl2ZWQgYSBCYXNpYyBtZWFzdXJlbWVudCBSZXF1ZXN0IGFjdGlvbiBmcmFtZS4KKyAqIFN0YXRpb24vQlAgcmVjZWl2aW5nIHRoaXMgc2hvdWxkIHBlcmZvcm0gYmFzaWMgbWVhc3VyZW1lbnRzCisgKiBhbmQgdGhlbiBzZW5kIEJhc2ljIE1lYXN1cmVtZW50IFJlcG9ydC4gQVAgc2hvdWxkIG5vdCBwZXJmb3JtCisgKiBhbnkgbWVhc3VyZW1lbnRzLCBhbmQgc2VuZCByZXBvcnQgaW5kaWNhdGluZyByZWZ1c2FsLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwTWVhc1JlcUZyYW1lIC0gQSBwb2ludGVyIHRvIEJhc2ljIE1lYXMuIFJlcSBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorX19saW1Qcm9jZXNzQmFzaWNNZWFzUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lIHBNZWFzUmVxRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyKQoreworICAgIC8vIFRCRCAtIFN0YXRpb24gc2hhbGwgcGVyZm9ybSBiYXNpYyBtZWFzdXJlbWVudHMKKworICAgIGlmIChsaW1TZW5kTWVhc1JlcG9ydEZyYW1lKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lYXNSZXFGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyTWFjQWRkcikgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiZmFpbCB0byBzZW5kIEJhc2ljIE1lYXMgcmVwb3J0IFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworCisvKioKKyAqICBsaW1Qcm9jZXNzQ2NhTWVhc1JlcQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVhc3VyZW1lbnRSZXF1ZXN0RnJhbWUoKQorICogd2hlbiBpdCByZWNlaXZlZCBhIENDQSBtZWFzdXJlbWVudCBSZXF1ZXN0IGFjdGlvbiBmcmFtZS4KKyAqIFN0YXRpb24vQlAgcmVjZWl2aW5nIHRoaXMgc2hvdWxkIHBlcmZvcm0gQ0NBIG1lYXN1cmVtZW50cworICogYW5kIHRoZW4gc2VuZCBDQ0EgTWVhc3VyZW1lbnQgUmVwb3J0LiBBUCBzaG91bGQgbm90IHBlcmZvcm0KKyAqIGFueSBtZWFzdXJlbWVudHMsIGFuZCBzZW5kIHJlcG9ydCBpbmRpY2F0aW5nIHJlZnVzYWwuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBNZWFzUmVxRnJhbWUgLSBBIHBvaW50ZXIgdG8gQ0NBIE1lYXMuIFJlcSBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorX19saW1Qcm9jZXNzQ2NhTWVhc1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgdHBTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUgcE1lYXNSZXFGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyKQoreworICAgIC8vIFRCRCAtIFN0YXRpb24gc2hhbGwgcGVyZm9ybSBjY2EgbWVhc3VyZW1lbnRzCisKKyAgICBpZiAobGltU2VuZE1lYXNSZXBvcnRGcmFtZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZWFzUmVxRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlck1hY0FkZHIpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImZhaWwgdG8gc2VuZCBDQ0EgTWVhcyByZXBvcnQgXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorfQorCisKKy8qKgorICogIF9fbGltUHJvY2Vzc1JwaU1lYXNSZXEKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lYXN1cmVtZW50UmVxdWVzdEZyYW1lKCkKKyAqIHdoZW4gaXQgcmVjZWl2ZWQgYSBSUEkgbWVhc3VyZW1lbnQgUmVxdWVzdCBhY3Rpb24gZnJhbWUuCisgKiBTdGF0aW9uL0JQL0FQICByZWNlaXZpbmcgdGhpcyBzaGFsbCBub3QgcGVyZm9ybSBhbnkgbWVhc3VyZW1lbnRzLAorICogYW5kIHNlbmQgcmVwb3J0IGluZGljYXRpbmcgcmVmdXNhbC4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcE1lYXNSZXFGcmFtZSAtIEEgcG9pbnRlciB0byBSUEkgTWVhcy4gUmVxIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NScGlNZWFzUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICB0cFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZSBwTWVhc1JlcUZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIpCit7CisgICAgaWYgKGxpbVNlbmRNZWFzUmVwb3J0RnJhbWUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWVhc1JlcUZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJNYWNBZGRyKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJmYWlsIHRvIHNlbmQgUlBJIE1lYXMgcmVwb3J0IFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworCisvKioKKyAqICBfX2xpbVByb2Nlc3NNZWFzdXJlbWVudFJlcXVlc3RGcmFtZQorICoKKyAqRlVOQ1RJT046CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwUnhQYWNrZXRJbmZvIC0gQSBwb2ludGVyIHRvIHBhY2tldCBpbmZvIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc01lYXN1cmVtZW50UmVxdWVzdEZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8pCit7CisgICAgdHBTaXJNYWNNZ210SGRyICAgICAgICAgICAgICAgICAgICAgICBwSGRyOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEJvZHk7CisgICAgdHBTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUgICAgICAgICAgICBwTWVhc1JlcUZyYW1lOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbjsKKworICAgIHBIZHIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisgICAgcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKyAgICBmcmFtZUxlbiA9IFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbyk7CisKKyAgICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0KKyAgICAgICAgcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTWVhc1JlcUZyYW1lLCBzaXplb2YoIHRTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUgKSApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoImxpbVByb2Nlc3NNZWFzdXJlbWVudFJlcXVlc3RGcmFtZTogcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHNpckNvbnZlcnRNZWFzUmVxRnJhbWUyU3RydWN0KHBNYWMsIHBCb2R5LCBwTWVhc1JlcUZyYW1lLCBmcmFtZUxlbikgIT0KKyAgICAgICAgZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiUmN2IGludmFsaWQgTWVhc3VyZW1lbnQgUmVxdWVzdCBBY3Rpb24gRnJhbWUgXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICBzd2l0Y2gocE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLm1lYXNUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBTSVJfTUFDX0JBU0lDX01FQVNVUkVNRU5UX1RZUEU6CisgICAgICAgICAgICBfX2xpbVByb2Nlc3NCYXNpY01lYXNSZXEocE1hYywgcE1lYXNSZXFGcmFtZSwgcEhkci0+c2EpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTUFDX0NDQV9NRUFTVVJFTUVOVF9UWVBFOgorICAgICAgICAgICAgX19saW1Qcm9jZXNzQ2NhTWVhc1JlcShwTWFjLCBwTWVhc1JlcUZyYW1lLCBwSGRyLT5zYSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9NQUNfUlBJX01FQVNVUkVNRU5UX1RZUEU6CisgICAgICAgICAgICBfX2xpbVByb2Nlc3NScGlNZWFzUmVxKHBNYWMsIHBNZWFzUmVxRnJhbWUsIHBIZHItPnNhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJVbmtub3duIE1lYXN1cmVtZW50IFR5cGUgJWQgXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwTWVhc1JlcUZyYW1lLT5tZWFzUmVxSUUubWVhc1R5cGUpOykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworfSAvKioqIGVuZCBsaW1Qcm9jZXNzTWVhc3VyZW1lbnRSZXF1ZXN0RnJhbWUgKioqLworCisKKy8qKgorICogIGxpbVByb2Nlc3NUcGNSZXF1ZXN0RnJhbWUKKyAqCisgKkZVTkNUSU9OOgorICogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24gcmVjZWl2aW5nIFRwYyBSZXF1ZXN0IGZyYW1lLgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwUnhQYWNrZXRJbmZvIC0gQSBwb2ludGVyIHRvIHBhY2tldCBpbmZvIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc1RwY1JlcXVlc3RGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvKQoreworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgICAgICAgICAgICAgICAgcEhkcjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBCb2R5OworICAgIHRwU2lyTWFjVHBjUmVxQWN0aW9uRnJhbWUgICAgICAgICAgICAgcFRwY1JlcUZyYW1lOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbjsKKworICAgIHBIZHIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisgICAgcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKyAgICBmcmFtZUxlbiA9IFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbyk7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCIqKioqTElNOiBQcm9jZXNzaW5nIFRQQyBSZXF1ZXN0IGZyb20gcGVlciAqKioqIikpOykKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgICBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBUcGNSZXFGcmFtZSwgc2l6ZW9mKCB0U2lyTWFjVHBjUmVxQWN0aW9uRnJhbWUgKSApICkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc2lyQ29udmVydFRwY1JlcUZyYW1lMlN0cnVjdChwTWFjLCBwQm9keSwgcFRwY1JlcUZyYW1lLCBmcmFtZUxlbikgIT0KKyAgICAgICAgZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiUmN2IGludmFsaWQgVFBDIFJlcSBBY3Rpb24gRnJhbWUgXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGxpbVNlbmRUcGNSZXBvcnRGcmFtZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRwY1JlcUZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImZhaWwgdG8gc2VuZCBUUEMgUmVwb3J0IEZyYW1lLiBcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisjZW5kaWYKKworCisvKioKKyAqIFxicmllZiBWYWxpZGF0ZSBhbiBBRERCQSBSZXEgZnJvbSBwZWVyIHdpdGggcmVzcGVjdAorICogdG8gb3VyIG93biBCQSBjb25maWd1cmF0aW9uCisgKgorICogXHNhIF9fbGltVmFsaWRhdGVBZGRCQVBhcmFtZXRlclNldAorICoKKyAqIFxwYXJhbSBwTWFjIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIGJhUGFyYW1ldGVyU2V0IFRoZSBBRERCQSBQYXJhbWV0ZXIgU2V0LgorICoKKyAqIFxwYXJhbSBwRGVsQkFGbGFnIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwgZXhjZXB0IGZvciBjYWxsIGZyb20gcHJvY2Vzc0FkZEJBUmVxCisgKiAgICAgICAgZGVsQkFGbGFnIGlzIHNldCB3aGVuIGVudHJ5IGFscmVhZHkgZXhpc3RzLgorICoKKyAqIFxwYXJhbSByZXFUeXBlIEFEREJBIFJlcSB2L3MgQUREQkEgUnNwCisgKiAxIC0gQUREQkEgUmVxCisgKiAwIC0gQUREQkEgUnNwCisgKgorICogXHJldHVybiBlU0lSX1NVQ0NFU1MgaWYgc2V0dXAgY29tcGxldGVzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICBlU0lSX0ZBSUxVUkUgaXMgc29tZSBwcm9ibGVtIGlzIGVuY291bnRlcmVkCisgKi8KKworc3RhdGljIHRTaXJNYWNTdGF0dXNDb2RlcworX19saW1WYWxpZGF0ZUFkZEJBUGFyYW1ldGVyU2V0KCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRwRHBoSGFzaE5vZGUgcFN0YSwKKyAgICB0RG90MTFmRmZBZGRCQVBhcmFtZXRlclNldCBiYVBhcmFtZXRlclNldCwKKyAgICB0QU5JX1U4IGRpYWxvZ3VlVG9rZW4sCisgICAgdExpbUFkZEJhVmFsaWRhdGlvblJlcVR5cGUgcmVxVHlwZSAsCisgICAgdEFOSV9VOCogcERlbEJBRmxhZyAvKnRoaXMgcGFyYW1ldGVyIGlzIE5VTEwgZXhjZXB0IGZvciBjYWxsIGZyb20gcHJvY2Vzc0FkZEJBUmVxKi8pCit7CisgIGlmKGJhUGFyYW1ldGVyU2V0LnRpZCA+PSBTVEFDRkdfTUFYX1RDKQorICB7CisgICAgICByZXR1cm4gZVNJUl9NQUNfV01FX0lOVkFMSURfUEFSQU1TX1NUQVRVUzsKKyAgfQorCisgIC8vY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIEJBIHNlc3Npb24gc2V0dXAgd2l0aCB0aGlzIFNUQS9USUQgd2hpbGUgcHJvY2Vzc2luZyBBZGRCYVJlcQorICBpZigodHJ1ZSA9PSBwU3RhLT50Y0NmZ1tiYVBhcmFtZXRlclNldC50aWRdLmZVc2VCQVJ4KSAmJgorICAgICAgICAoTElNX0FEREJBX1JFUSA9PSByZXFUeXBlKSkKKyAgeworICAgICAgLy9UaGVyZSBpcyBhbHJlYWR5IEJBIHNlc3Npb24gc2V0dXAgZm9yIFNUQS9USUQuCisgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgICAgRkwoICJBZGRCQVJlcSByY3ZkIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhIHNlc3Npb24gZm9yIHRoaXMgU3RhSWQgPSAlZCwgdGlkID0gJWRcbiAiICksCisgICAgICAgICAgcFN0YS0+c3RhSW5kZXgsIGJhUGFyYW1ldGVyU2V0LnRpZCk7CisgICAgICBsaW1QcmludE1hY0FkZHIoIHBNYWMsIHBTdGEtPnN0YUFkZHIsIExPR1cgKTsKKworICAgICAgaWYocERlbEJBRmxhZykKKyAgICAgICAgKnBEZWxCQUZsYWcgPSB0cnVlOworICB9CisgIHJldHVybiBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUzsKK30KKworLyoqCisgKiBcYnJpZWYgVmFsaWRhdGUgYSBERUxCQSBJbmQgZnJvbSBwZWVyIHdpdGggcmVzcGVjdAorICogdG8gb3VyIG93biBCQSBjb25maWd1cmF0aW9uCisgKgorICogXHNhIF9fbGltVmFsaWRhdGVEZWxCQVBhcmFtZXRlclNldAorICoKKyAqIFxwYXJhbSBwTWFjIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIGJhUGFyYW1ldGVyU2V0IFRoZSBERUxCQSBQYXJhbWV0ZXIgU2V0LgorICoKKyAqIFxwYXJhbSBwU3RhIFJ1bnRpbWUsIFNUQS1yZWxhdGVkIGNvbmZpZ3VyYXRpb24gY2FjaGVkCisgKiBpbiB0aGUgSGFzaE5vZGUgb2JqZWN0CisgKgorICogXHJldHVybiBlU0lSX1NVQ0NFU1MgaWYgc2V0dXAgY29tcGxldGVzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICBlU0lSX0ZBSUxVUkUgaXMgc29tZSBwcm9ibGVtIGlzIGVuY291bnRlcmVkCisgKi8KK3N0YXRpYyB0U2lyTWFjU3RhdHVzQ29kZXMgCitfX2xpbVZhbGlkYXRlRGVsQkFQYXJhbWV0ZXJTZXQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdERvdDExZkZmRGVsQkFQYXJhbWV0ZXJTZXQgYmFQYXJhbWV0ZXJTZXQsCisgICAgdHBEcGhIYXNoTm9kZSBwU3RhICkKK3sKK3RTaXJNYWNTdGF0dXNDb2RlcyBzdGF0dXNDb2RlID0gZVNJUl9NQUNfU1RBX0JMS19BQ0tfTk9UX1NVUFBPUlRFRF9TVEFUVVM7CisKKyAgLy8gVmFsaWRhdGUgaWYgYSBCQSBpcyBhY3RpdmUgZm9yIHRoZSByZXF1ZXN0ZWQgVElECisgICAgaWYoIHBTdGEtPnRjQ2ZnW2JhUGFyYW1ldGVyU2V0LnRpZF0uZlVzZUJBVHggfHwKKyAgICAgICAgcFN0YS0+dGNDZmdbYmFQYXJhbWV0ZXJTZXQudGlkXS5mVXNlQkFSeCApCisgICAgeworICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTOworCisgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgICAgRkwoIlZhbGlkIERFTEJBIEluZCByZWNlaXZlZC4gVGltZSB0byBzZW5kIFdEQV9ERUxCQV9JTkQgdG8gSEFMLi4uXG4iKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICBGTCgiUmVjZWl2ZWQgYW4gSU5WQUxJRCBERUxCQSBJbmQgZm9yIFRJRCAlZC4uLlxuIiksCisgICAgICAgICAgYmFQYXJhbWV0ZXJTZXQudGlkICk7CisKKyAgcmV0dXJuIHN0YXR1c0NvZGU7Cit9CisKKy8qKgorICogXGJyaWVmIFByb2Nlc3MgYW4gQUREQkEgUkVRCisgKgorICogXHNhIGxpbVByb2Nlc3NBZGRCQVJlcQorICoKKyAqIFxwYXJhbSBwTWFjIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIHBSeFBhY2tldEluZm8gSGFuZGxlIHRvIHRoZSBSeCBwYWNrZXQgaW5mbyBmcm9tIEhERAorICoKKyAqIFxyZXR1cm4gbm9uZQorICoKKyAqLworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc0FkZEJBUmVxKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdERvdDExZkFkZEJBUmVxIGZybUFkZEJBUmVxOworICAgIHRwU2lyTWFjTWdtdEhkciBwSGRyOworICAgIHRwRHBoSGFzaE5vZGUgcFN0YTsKKyAgICB0U2lyTWFjU3RhdHVzQ29kZXMgc3RhdHVzID0gZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVM7CisgICAgdEFOSV9VMTYgYWlkOworICAgIHRBTklfVTMyIGZyYW1lTGVuLCBuU3RhdHVzOworICAgIHRBTklfVTggKnBCb2R5OworICAgIHRBTklfVTggZGVsQkFGbGFnID0wOworCisgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUiggcFJ4UGFja2V0SW5mbyApOworICAgIHBCb2R5ID0gV0RBX0dFVF9SWF9NUERVX0RBVEEoIHBSeFBhY2tldEluZm8gKTsKKyAgICBmcmFtZUxlbiA9IFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4oIHBSeFBhY2tldEluZm8gKTsKKworICAgIC8vIFVucGFjayB0aGUgcmVjZWl2ZWQgZnJhbWUKKyAgICBuU3RhdHVzID0gZG90MTFmVW5wYWNrQWRkQkFSZXEoIHBNYWMsIHBCb2R5LCBmcmFtZUxlbiwgJmZybUFkZEJBUmVxICk7CisgICAgaWYoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgIEZMKCJGYWlsZWQgdG8gdW5wYWNrIGFuZCBwYXJzZSBhbiBBRERCQSBSZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgblN0YXR1cywKKyAgICAgICAgICAgIGZyYW1lTGVuICk7CisKKyAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYoIHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwQm9keSwgZnJhbWVMZW4gKTspCisKKyAgICAgICAgLy8gV2l0aG91dCBhbiB1bnBhY2tlZCByZXF1ZXN0IHdlIGNhbm5vdCByZXNwb25kLCBzbyBzaWxlbnRseSBpZ25vcmUgdGhlIHJlcXVlc3QKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgIEZMKCAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbmcgYW4gQUREQkEgUmVxdWVzdCAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgICAgIG5TdGF0dXMsCisgICAgICAgICAgICBmcmFtZUxlbiApOworCisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKCBwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEJvZHksIGZyYW1lTGVuICk7KQorICAgIH0KKworICAgIHBTdGEgPSBkcGhMb29rdXBIYXNoRW50cnkoIHBNYWMsIHBIZHItPnNhLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSApOworICAgIGlmKCBwU3RhID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoICJTVEEgY29udGV4dCBub3QgZm91bmQgLSBpZ25vcmluZyBBRERCQSBmcm9tIFxuIiApKTsKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKCBwTWFjLCBwSGRyLT5zYSwgTE9HVyApOworCisgICAgICAgIC8vIEZJWE1FIC0gU2hvdWxkIHdlIGRvIHRoaXM/CisgICAgICAgIHN0YXR1cyA9IGVTSVJfTUFDX0lOQUJMSVRZX1RPX0NPTkZJUk1fQVNTT0NfU1RBVFVTOworICAgICAgICBnb3RvIHJldHVybkFmdGVyRXJyb3I7CisgICAgfQorCisgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgRkwoICJBRERCQSBSZXEgZnJvbSBTVEEgd2l0aCBBSUQgJWQsIHRpZCA9ICVkXG4iICksCisgICAgICBhaWQsIGZybUFkZEJBUmVxLkFkZEJBUGFyYW1ldGVyU2V0LnRpZCk7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9WU1RBX0ZFQVRVUkUKKyAgICAvLyB3ZSBjYW4gb25seSBkbyBCQSBvbiAiaGFyZCIgU1RBcworICAgIGlmICghKElTX0hXU1RBX0lEWChwU3RhLT5zdGFJbmRleCkpKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gZVNJUl9NQUNfUkVRX0RFQ0xJTkVEX1NUQVRVUzsKKyAgICAgICAgZ290byByZXR1cm5BZnRlckVycm9yOworICAgIH0KKyNlbmRpZiAvL1dMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQorCisKKyAgICAvLyBOb3csIHZhbGlkYXRlIHRoZSBBRERCQSBSZXEKKyAgICBpZiggZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMgIT0KKyAgICAgIChzdGF0dXMgPSBfX2xpbVZhbGlkYXRlQWRkQkFQYXJhbWV0ZXJTZXQoIHBNYWMsIHBTdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJtQWRkQkFSZXEuQWRkQkFQYXJhbWV0ZXJTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLy9kaWFsb2d1ZSB0b2tlbiBpcyBkb24ndCBjYXJlIGluIHJlcXVlc3QgdmFsaWRhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fQUREQkFfUkVRLCAmZGVsQkFGbGFnKSkpCisgICAgICAgIGdvdG8gcmV0dXJuQWZ0ZXJFcnJvcjsKKworICAgIC8vQkEgYWxyZWFkeSBzZXQsIHNvIHdlIG5lZWQgdG8gZGVsZXRlIGl0IGJlZm9yZSBhZGRpbmcgbmV3IG9uZS4KKyAgICBpZihkZWxCQUZsYWcpCisgICAgeworICAgICAgICBpZiggZVNJUl9TVUNDRVNTICE9IGxpbVBvc3RNc2dEZWxCQUluZCggcE1hYywKKyAgICAgICAgICAgIHBTdGEsCisgICAgICAgICAgICAodEFOSV9VOClmcm1BZGRCQVJlcS5BZGRCQVBhcmFtZXRlclNldC50aWQsCisgICAgICAgICAgICBlQkFfUkVDSVBJRU5ULHBzZXNzaW9uRW50cnkpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisgICAgICAgICAgICBnb3RvIHJldHVybkFmdGVyRXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgLy8gQ2hlY2sgaWYgdGhlIEFERCBCQSBEZWNsaW5lZCBjb25maWd1cmF0aW9uIGlzIERpc2FibGVkCisgICAgaWYgKChwTWFjLT5saW0uZ0FkZEJBX0RlY2xpbmVkICYgKCAxIDw8IGZybUFkZEJBUmVxLkFkZEJBUGFyYW1ldGVyU2V0LnRpZCApICkpIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIkRlY2xpbmVkIHRoZSBBRERCQSBSZXEgZm9yIHRoZSBUSUQgJWQgIFxuIiApLAorICAgICAgICAgICAgICAgICAgICAgICAgZnJtQWRkQkFSZXEuQWRkQkFQYXJhbWV0ZXJTZXQudGlkKTsKKyAgICAgICAgc3RhdHVzID0gZVNJUl9NQUNfUkVRX0RFQ0xJTkVEX1NUQVRVUzsKKyAgICAgICAgZ290byByZXR1cm5BZnRlckVycm9yOworICAgIH0KKworICAvLworICAvLyBQb3N0IFdEQV9BRERCQV9SRVEgdG8gSEFMLgorICAvLyBJZiBIQUwvSEREIGRlY2lkZSB0byBhbGxvdyB0aGlzIEFEREJBIFJlcSBzZXNzaW9uLAorICAvLyB0aGVuIHRoaXMgQkEgc2Vzc2lvbiBpcyB0ZXJtZWQgYWN0aXZlCisgIC8vCisKKyAgLy8gQ2hhbmdlIHRoZSBCbG9jayBBY2sgc3RhdGUgb2YgdGhpcyBTVEEgdG8gd2FpdCBmb3IKKyAgLy8gQUREQkEgUnNwIGZyb20gSEFMCisgIExJTV9TRVRfU1RBX0JBX1NUQVRFKHBTdGEsIGZybUFkZEJBUmVxLkFkZEJBUGFyYW1ldGVyU2V0LnRpZCwgZUxJTV9CQV9TVEFURV9XVF9BRERfUlNQKTsKKworICBpZiggZVNJUl9TVUNDRVNTICE9IGxpbVBvc3RNc2dBZGRCQVJlcSggcE1hYywKKyAgICAgICAgcFN0YSwKKyAgICAgICAgKHRBTklfVTgpIGZybUFkZEJBUmVxLkRpYWxvZ1Rva2VuLnRva2VuLAorICAgICAgICAodEFOSV9VOCkgZnJtQWRkQkFSZXEuQWRkQkFQYXJhbWV0ZXJTZXQudGlkLAorICAgICAgICAodEFOSV9VOCkgZnJtQWRkQkFSZXEuQWRkQkFQYXJhbWV0ZXJTZXQucG9saWN5LAorICAgICAgICBmcm1BZGRCQVJlcS5BZGRCQVBhcmFtZXRlclNldC5idWZmZXJTaXplLAorICAgICAgICBmcm1BZGRCQVJlcS5CQVRpbWVvdXQudGltZW91dCwKKyAgICAgICAgKHRBTklfVTE2KSBmcm1BZGRCQVJlcS5CQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sLnNzbiwKKyAgICAgICAgZUJBX1JFQ0lQSUVOVCxwc2Vzc2lvbkVudHJ5KSkKKyAgICBzdGF0dXMgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisgIGVsc2UKKyAgICByZXR1cm47CisKK3JldHVybkFmdGVyRXJyb3I6CisKKyAgLy8KKyAgLy8gUGFja2FnZSBMSU1fTUxNX0FEREJBX1JTUCB0byBNTE1FLCB3aXRoIHByb3BlcgorICAvLyBzdGF0dXMgY29kZS4gTUxNRSB3aWxsIHRoZW4gc2VuZCBhbiBBRERCQSBSU1AKKyAgLy8gb3ZlciB0aGUgYWlyIHRvIHRoZSBwZWVyIE1BQyBlbnRpdHkKKyAgLy8KKyAgaWYoIGVTSVJfU1VDQ0VTUyAhPSBsaW1Qb3N0TWxtQWRkQkFSc3AoIHBNYWMsCisgICAgICAgIHBIZHItPnNhLAorICAgICAgICBzdGF0dXMsCisgICAgICAgIGZybUFkZEJBUmVxLkRpYWxvZ1Rva2VuLnRva2VuLAorICAgICAgICAodEFOSV9VOCkgZnJtQWRkQkFSZXEuQWRkQkFQYXJhbWV0ZXJTZXQudGlkLAorICAgICAgICAodEFOSV9VOCkgZnJtQWRkQkFSZXEuQWRkQkFQYXJhbWV0ZXJTZXQucG9saWN5LAorICAgICAgICBmcm1BZGRCQVJlcS5BZGRCQVBhcmFtZXRlclNldC5idWZmZXJTaXplLAorICAgICAgICBmcm1BZGRCQVJlcS5CQVRpbWVvdXQudGltZW91dCxwc2Vzc2lvbkVudHJ5KSkKKyAgeworICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgRkwoICJGYWlsZWQgdG8gcG9zdCBMSU1fTUxNX0FEREJBX1JTUCB0byAiICkpOworICAgIGxpbVByaW50TWFjQWRkciggcE1hYywgcEhkci0+c2EsIExPR1cgKTsKKyAgfQorCit9CisKKy8qKgorICogXGJyaWVmIFByb2Nlc3MgYW4gQUREQkEgUlNQCisgKgorICogXHNhIGxpbVByb2Nlc3NBZGRCQVJzcAorICoKKyAqIFxwYXJhbSBwTWFjIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIHBSeFBhY2tldEluZm8gSGFuZGxlIHRvIHRoZSBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUgZnJvbSBIREQKKyAqCisgKiBccmV0dXJuIG5vbmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NBZGRCQVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQorewordERvdDExZkFkZEJBUnNwIGZybUFkZEJBUnNwOwordHBTaXJNYWNNZ210SGRyIHBIZHI7Cit0cERwaEhhc2hOb2RlIHBTdGE7Cit0U2lyTWFjUmVhc29uQ29kZXMgcmVhc29uQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTjsKK3RBTklfVTE2IGFpZDsKK3RBTklfVTMyIGZyYW1lTGVuLCBuU3RhdHVzOwordEFOSV9VOCAqcEJvZHk7CisKKyAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUiggcFJ4UGFja2V0SW5mbyApOworICBwQm9keSA9IFdEQV9HRVRfUlhfTVBEVV9EQVRBKCBwUnhQYWNrZXRJbmZvICk7CisgIGZyYW1lTGVuID0gV0RBX0dFVF9SWF9QQVlMT0FEX0xFTiggcFJ4UGFja2V0SW5mbyApOworCisgIHBTdGEgPSBkcGhMb29rdXBIYXNoRW50cnkoIHBNYWMsIHBIZHItPnNhLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSApOworICBpZiggcFN0YSA9PSBOVUxMICkKKyAgeworICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgRkwoICJTVEEgY29udGV4dCBub3QgZm91bmQgLSBpZ25vcmluZyBBRERCQSBmcm9tIFxuIiApKTsKKyAgICBsaW1QcmludE1hY0FkZHIoIHBNYWMsIHBIZHItPnNhLCBMT0dXICk7CisgICAgcmV0dXJuOworICB9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9WU1RBX0ZFQVRVUkUKKyAgLy8gV2UgY2FuIG9ubHkgZG8gQkEgb24gImhhcmQiIFNUQXMuICBXZSBzaG91bGQgbm90IGhhdmUgaXNzdWVkIGFuIEFEREJBCisgIC8vIFJlcXVlc3QsIHNvIHdlIHNob3VsZCBuZXZlciBiZSBwcm9jZXNzaW5nIGEgQUREQkEgUmVzcG9uc2UKKyAgaWYgKCEoSVNfSFdTVEFfSURYKHBTdGEtPnN0YUluZGV4KSkpCisgIHsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZiAvL1dMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQorCisgIC8vIFVucGFjayB0aGUgcmVjZWl2ZWQgZnJhbWUKKyAgblN0YXR1cyA9IGRvdDExZlVucGFja0FkZEJBUnNwKCBwTWFjLCBwQm9keSwgZnJhbWVMZW4sICZmcm1BZGRCQVJzcCApOworICBpZiggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApKQorICB7CisgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICBGTCggIkZhaWxlZCB0byB1bnBhY2sgYW5kIHBhcnNlIGFuIEFEREJBIFJlc3BvbnNlICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICBuU3RhdHVzLAorICAgICAgICBmcmFtZUxlbiApOworCisgICAgUEVMT0cyKHNpckR1bXBCdWYoIHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwQm9keSwgZnJhbWVMZW4gKTspCisgICAgZ290byByZXR1cm5BZnRlckVycm9yOworICB9CisgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICB7CisgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICBGTCggIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGFuIEFEREJBIFJlc3BvbnNlICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICBuU3RhdHVzLAorICAgICAgICBmcmFtZUxlbiApOworCisgICAgUEVMT0cyKHNpckR1bXBCdWYoIHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwQm9keSwgZnJhbWVMZW4gKTspCisgIH0KKworICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICBGTCggIkFEREJBIFJzcCBmcm9tIFNUQSB3aXRoIEFJRCAlZCwgdGlkID0gJWQsIHN0YXR1cyA9ICVkXG4iICksCisgICAgICBhaWQsIGZybUFkZEJBUnNwLkFkZEJBUGFyYW1ldGVyU2V0LnRpZCwgZnJtQWRkQkFSc3AuU3RhdHVzLnN0YXR1cyk7CisKKyAgLy9pZiB0aGVyZSBpcyBubyBtYXRjaGluIGRpYWxvdWd1ZSB0b2tlbiB0aGVuIGlnbm9yZSB0aGUgcmVzcG9uc2UuCisKKyAgaWYoZVNJUl9TVUNDRVNTICE9IGxpbVNlYXJjaEFuZERlbGV0ZURpYWxvZ3VlVG9rZW4ocE1hYywgZnJtQWRkQkFSc3AuRGlhbG9nVG9rZW4udG9rZW4sCisgICAgICAgIHBTdGEtPmFzc29jSWQsIGZybUFkZEJBUnNwLkFkZEJBUGFyYW1ldGVyU2V0LnRpZCkpCisgIHsKKyAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoImRpYWxvZ3VlVG9rZW4gaW4gcmVjZWl2ZWQgYWRkQkFSc3AgZGlkIG5vdCBtYXRjaCB3aXRoIG91dHN0YW5kaW5nIHJlcXVlc3RzXG4iKSk7KQorICAgICAgcmV0dXJuOworICB9CisKKyAgLy8gQ2hlY2sgZmlyc3QgaWYgdGhlIHBlZXIgYWNjZXB0ZWQgdGhlIEFEREJBIFJlcQorICBpZiggZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMgPT0gZnJtQWRkQkFSc3AuU3RhdHVzLnN0YXR1cyApCisgIHsKKyAgICAvL2lmIHBlZXIgcmVzcG9uZGVkIHdpdGggYnVmZmVyIHNpemUgMCB0aGVuIHdlIHNob3VsZCBwaWNrIHRoZSBkZWZhdWx0LgorICAgIGlmKDAgPT0gZnJtQWRkQkFSc3AuQWRkQkFQYXJhbWV0ZXJTZXQuYnVmZmVyU2l6ZSkKKyAgICAgICAgZnJtQWRkQkFSc3AuQWRkQkFQYXJhbWV0ZXJTZXQuYnVmZmVyU2l6ZSA9IEJBX0RFRkFVTFRfVFhfQlVGRkVSX1NJWkU7CisKKyAgICAvLyBOb3csIHZhbGlkYXRlIHRoZSBBRERCQSBSc3AKKyAgICBpZiggZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMgIT0KKyAgICAgICAgX19saW1WYWxpZGF0ZUFkZEJBUGFyYW1ldGVyU2V0KCBwTWFjLCBwU3RhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJtQWRkQkFSc3AuQWRkQkFQYXJhbWV0ZXJTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOClmcm1BZGRCQVJzcC5EaWFsb2dUb2tlbi50b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9BRERCQV9SU1AsIE5VTEwpKQorICAgICAgZ290byByZXR1cm5BZnRlckVycm9yOworICB9CisgIGVsc2UKKyAgICBnb3RvIHJldHVybkFmdGVyRXJyb3I7CisKKyAgLy8gQ2hhbmdlIFNUQSBzdGF0ZSB0byB3YWl0IGZvciBBRERCQSBSc3AgZnJvbSBIQUwKKyAgTElNX1NFVF9TVEFfQkFfU1RBVEUocFN0YSwgZnJtQWRkQkFSc3AuQWRkQkFQYXJhbWV0ZXJTZXQudGlkLCBlTElNX0JBX1NUQVRFX1dUX0FERF9SU1ApOworCisgIC8vCisgIC8vIFBvc3QgV0RBX0FEREJBX1JFUSB0byBIQUwuCisgIC8vIElmIEhBTC9IREQgZGVjaWRlIHRvIGFsbG93IHRoaXMgQUREQkEgUnNwIHNlc3Npb24sCisgIC8vIHRoZW4gdGhpcyBCQSBzZXNzaW9uIGlzIHRlcm1lZCBhY3RpdmUKKyAgLy8KKworICBpZiggZVNJUl9TVUNDRVNTICE9IGxpbVBvc3RNc2dBZGRCQVJlcSggcE1hYywKKyAgICAgICAgcFN0YSwKKyAgICAgICAgKHRBTklfVTgpIGZybUFkZEJBUnNwLkRpYWxvZ1Rva2VuLnRva2VuLAorICAgICAgICAodEFOSV9VOCkgZnJtQWRkQkFSc3AuQWRkQkFQYXJhbWV0ZXJTZXQudGlkLAorICAgICAgICAodEFOSV9VOCkgZnJtQWRkQkFSc3AuQWRkQkFQYXJhbWV0ZXJTZXQucG9saWN5LAorICAgICAgICBmcm1BZGRCQVJzcC5BZGRCQVBhcmFtZXRlclNldC5idWZmZXJTaXplLAorICAgICAgICBmcm1BZGRCQVJzcC5CQVRpbWVvdXQudGltZW91dCwKKyAgICAgICAgMCwKKyAgICAgICAgZUJBX0lOSVRJQVRPUixwc2Vzc2lvbkVudHJ5KSkKKyAgICByZWFzb25Db2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OOworICBlbHNlCisgICAgcmV0dXJuOworCityZXR1cm5BZnRlckVycm9yOgorCisgIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gc2lnbmFsIGFuIGVycm9yIHN0YXR1cyB0byBTTUUsCisgIC8vIGlmIHN0YXR1cyAhPSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUworCisgIC8vIFJlc3RvcmUgU1RBICJCQSIgU3RhdGUKKyAgTElNX1NFVF9TVEFfQkFfU1RBVEUocFN0YSwgZnJtQWRkQkFSc3AuQWRkQkFQYXJhbWV0ZXJTZXQudGlkLCBlTElNX0JBX1NUQVRFX0lETEUpOworICAvLworICAvLyBOZWVkIHRvIHNlbmQgYSBERUxCQSBJTkQgdG8gcGVlciwgd2hvCisgIC8vIHdvdWxkIGhhdmUgc2V0dXAgYSBCQSBzZXNzaW9uIHdpdGggdGhpcyBTVEEKKyAgLy8KKyAgaWYoIGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTID09IGZybUFkZEJBUnNwLlN0YXR1cy5zdGF0dXMgKQorICB7CisgICAgLy8KKyAgICAvLyBQYWNrYWdlIExJTV9NTE1fREVMQkFfUkVRIHRvIE1MTUUsIHdpdGggcHJvcGVyCisgICAgLy8gc3RhdHVzIGNvZGUuIE1MTUUgd2lsbCB0aGVuIHNlbmQgYSBERUxCQSBJTkQKKyAgICAvLyBvdmVyIHRoZSBhaXIgdG8gdGhlIHBlZXIgTUFDIGVudGl0eQorICAgIC8vCisgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSBsaW1Qb3N0TWxtRGVsQkFSZXEoIHBNYWMsCisgICAgICAgICAgcFN0YSwKKyAgICAgICAgICBlQkFfSU5JVElBVE9SLAorICAgICAgICAgICh0QU5JX1U4KSBmcm1BZGRCQVJzcC5BZGRCQVBhcmFtZXRlclNldC50aWQsCisgICAgICAgICAgcmVhc29uQ29kZSwgcHNlc3Npb25FbnRyeSkpCisgICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgIEZMKCAiRmFpbGVkIHRvIHBvc3QgTElNX01MTV9ERUxCQV9SRVEgdG8gIiApKTsKKyAgICAgIGxpbVByaW50TWFjQWRkciggcE1hYywgcEhkci0+c2EsIExPR1cgKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBcYnJpZWYgUHJvY2VzcyBhIERFTEJBIEluZGljYXRpb24KKyAqCisgKiBcc2EgbGltUHJvY2Vzc0RlbEJBSW5kCisgKgorICogXHBhcmFtIHBNYWMgVGhlIGdsb2JhbCB0cEFuaVNpckdsb2JhbCBvYmplY3QKKyAqCisgKiBccGFyYW0gcFJ4UGFja2V0SW5mbyBIYW5kbGUgdG8gdGhlIFJ4IHBhY2tldCBpbmZvIGZyb20gSERECisgKgorICogXHJldHVybiBub25lCisgKgorICovCitzdGF0aWMgdm9pZAorX19saW1Qcm9jZXNzRGVsQkFSZXEoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8sdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKK3REb3QxMWZEZWxCQUluZCBmcm1EZWxCQUluZDsKK3RwU2lyTWFjTWdtdEhkciBwSGRyOwordHBEcGhIYXNoTm9kZSBwU3RhOwordEFOSV9VMTYgYWlkOwordEFOSV9VMzIgZnJhbWVMZW4sIG5TdGF0dXM7Cit0QU5JX1U4ICpwQm9keTsKKworICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKCBwUnhQYWNrZXRJbmZvICk7CisgIHBCb2R5ID0gV0RBX0dFVF9SWF9NUERVX0RBVEEoIHBSeFBhY2tldEluZm8gKTsKKyAgZnJhbWVMZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKCBwUnhQYWNrZXRJbmZvICk7CisKKyAgcFN0YSA9IGRwaExvb2t1cEhhc2hFbnRyeSggcE1hYywgcEhkci0+c2EsICZhaWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlICk7CisgIGlmKCBwU3RhID09IE5VTEwgKQorICB7CisgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIlNUQSBjb250ZXh0IG5vdCBmb3VuZCAtIGlnbm9yaW5nIERFTEJBIGZyb20gXG4iKSk7CisgICAgbGltUHJpbnRNYWNBZGRyKCBwTWFjLCBwSGRyLT5zYSwgTE9HVyApOworICAgIHJldHVybjsKKyAgfQorCisgIGxpbUxvZyggcE1hYywgTE9HMSwgRkwoICJERUxCQSBJbmQgZnJvbSBTVEEgd2l0aCBBSUQgJWRcbiIgKSwgYWlkICk7CisKKyAgLy8gVW5wYWNrIHRoZSByZWNlaXZlZCBmcmFtZQorICBuU3RhdHVzID0gZG90MTFmVW5wYWNrRGVsQkFJbmQoIHBNYWMsIHBCb2R5LCBmcmFtZUxlbiwgJmZybURlbEJBSW5kICk7CisgIGlmKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkpCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCAiRmFpbGVkIHRvIHVucGFjayBhbmQgcGFyc2UgYSBERUxCQSBJbmRpY2F0aW9uICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICBuU3RhdHVzLAorICAgICAgICBmcmFtZUxlbiApOworCisgICAgUEVMT0cyKHNpckR1bXBCdWYoIHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwQm9keSwgZnJhbWVMZW4gKTspCisgICAgcmV0dXJuOworICB9CisgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICB7CisgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICBGTCggIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGEgREVMQkEgSW5kaWNhdGlvbiAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgblN0YXR1cywKKyAgICAgICAgZnJhbWVMZW4gKTsKKworICAgIFBFTE9HMihzaXJEdW1wQnVmKCBwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEJvZHksIGZyYW1lTGVuICk7KQorICB9CisKKyAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgRkwoICJSZWNlaXZlZCBERUxCQSBmb3IgVElEICVkLCBSZWFzb24gY29kZSAlZFxuIiApLAorICAgICAgZnJtRGVsQkFJbmQuRGVsQkFQYXJhbWV0ZXJTZXQudGlkLAorICAgICAgZnJtRGVsQkFJbmQuUmVhc29uLmNvZGUgKTsKKworICAvLyBOb3csIHZhbGlkYXRlIHRoZSBERUxCQSBJbmQKKyAgaWYoIGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTICE9IF9fbGltVmFsaWRhdGVEZWxCQVBhcmFtZXRlclNldCggcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZybURlbEJBSW5kLkRlbEJBUGFyYW1ldGVyU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YSApKQorICAgICAgcmV0dXJuOworCisgIC8vCisgIC8vIFBvc3QgV0RBX0RFTEJBX0lORCB0byBIQUwgYW5kIGRlbGV0ZSB0aGUKKyAgLy8gZXhpc3RpbmcgQkEgc2Vzc2lvbgorICAvLworICAvLyBOT1RFIC0gSUVFRSA4MDIuMTEtUkVWbWEtRDguMCwgU2VjdGlvbiA3LjMuMS4xNgorICAvLyBpcyBraW5kIG9mIGNvbmZ1c2luZy4uLgorICAvLworICBpZiggZVNJUl9TVUNDRVNTICE9IGxpbVBvc3RNc2dEZWxCQUluZCggcE1hYywKKyAgICAgICAgcFN0YSwKKyAgICAgICAgKHRBTklfVTgpIGZybURlbEJBSW5kLkRlbEJBUGFyYW1ldGVyU2V0LnRpZCwKKyAgICAgICAgKGVCQV9SRUNJUElFTlQgPT0gZnJtRGVsQkFJbmQuRGVsQkFQYXJhbWV0ZXJTZXQuaW5pdGlhdG9yKT8KKyAgICAgICAgICBlQkFfSU5JVElBVE9SOiBlQkFfUkVDSVBJRU5ULHBzZXNzaW9uRW50cnkpKQorICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJQb3N0aW5nIFdEQV9ERUxCQV9JTkQgdG8gSEFMIGZhaWxlZCBcbiIpKTsKKworICByZXR1cm47CisKK30KKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc1NNUG93ZXJTYXZlVXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8gLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyNpZiAwCisgICAgICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHI7CisgICAgICAgIHREb3QxMWZTTVBvd2VyU2F2ZSAgICAgICAgICAgICAgICAgICAgZnJtU01Qb3dlcjsKKyAgICAgICAgdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlICBzdGF0ZTsKKyAgICAgICAgdHBEcGhIYXNoTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YTsKKyAgICAgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkOworICAgICAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiwgblN0YXR1czsKKyAgICAgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQm9keTsKKworICAgICAgICBwSGRyID0gU0lSX01BQ19CRF9UT19NUERVSEVBREVSKCBwQmQgKTsKKyAgICAgICAgcEJvZHkgPSBTSVJfTUFDX0JEX1RPX01QRFVEQVRBKCBwQmQgKTsKKyAgICAgICAgZnJhbWVMZW4gPSBTSVJfTUFDX0JEX1RPX1BBWUxPQURfTEVOKCBwQmQgKTsKKworICAgICAgICBwU3RhID0gZHBoTG9va3VwSGFzaEVudHJ5KHBNYWMsIHBIZHItPnNhLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSApOworICAgICAgICBpZiggcFN0YSA9PSBOVUxMICkgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLEZMKCAiU1RBIGNvbnRleHQgbm90IGZvdW5kIC0gaWdub3JpbmcgVXBkYXRlU00gUFNhdmUgTW9kZSBmcm9tIFxuIiApKTsKKyAgICAgICAgICAgIGxpbVByaW50TWFjQWRkciggcE1hYywgcEhkci0+c2EsIExPR1cgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKlVucGFjayB0aGUgcmVjZWl2ZWQgZnJhbWUgKi8KKyAgICAgICAgblN0YXR1cyA9IGRvdDExZlVucGFja1NNUG93ZXJTYXZlKCBwTWFjLCBwQm9keSwgZnJhbWVMZW4sICZmcm1TTVBvd2VyKTsKKworICAgICAgICBpZiggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApKSB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiRmFpbGVkIHRvIHVucGFjayBhbmQgcGFyc2UgYSBVcGRhdGUgU00gUG93ZXIgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblN0YXR1cywgZnJhbWVMZW4gKTsKKyAgICAgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKCBwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEJvZHksIGZyYW1lTGVuICk7KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9ZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCggIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGEgU01Qb3dlciBTYXZlIHVwZGF0ZSAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblN0YXR1cywgZnJhbWVMZW4gKTsKKyAgICAgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKCBwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEJvZHksIGZyYW1lTGVuICk7KQorICAgICAgICB9CisKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJSZWNlaXZlZCBTTSBQb3dlciBzYXZlIE1vZGUgdXBkYXRlIEZyYW1lIHdpdGggUFNfRW5hYmxlOiVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUyBNb2RlOiAlZCIpLCBmcm1TTVBvd2VyLlNNUG93ZXJNb2RlU2V0LlBvd2VyU2F2ZV9FbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm1TTVBvd2VyLlNNUG93ZXJNb2RlU2V0Lk1vZGUpOworCisgICAgICAgIC8qKiBVcGRhdGUgaW4gdGhlIERQSCBUYWJsZSBhYm91dCB0aGUgVXBkYXRlIGluIHRoZSBTTSBQb3dlciBTYXZlIG1vZGUqLworICAgICAgICBpZiAoZnJtU01Qb3dlci5TTVBvd2VyTW9kZVNldC5Qb3dlclNhdmVfRW4gJiYgZnJtU01Qb3dlci5TTVBvd2VyTW9kZVNldC5Nb2RlKQorICAgICAgICAgICAgc3RhdGUgPSBlU0lSX0hUX01JTU9fUFNfRFlOQU1JQzsKKyAgICAgICAgZWxzZSBpZiAoKGZybVNNUG93ZXIuU01Qb3dlck1vZGVTZXQuUG93ZXJTYXZlX0VuKSAmJiAoZnJtU01Qb3dlci5TTVBvd2VyTW9kZVNldC5Nb2RlID09MCkpCisgICAgICAgICAgICBzdGF0ZSA9IGVTSVJfSFRfTUlNT19QU19TVEFUSUM7CisgICAgICAgIGVsc2UgaWYgKChmcm1TTVBvd2VyLlNNUG93ZXJNb2RlU2V0LlBvd2VyU2F2ZV9FbiA9PSAwKSAmJiAoZnJtU01Qb3dlci5TTVBvd2VyTW9kZVNldC5Nb2RlID09IDApKQorICAgICAgICAgICAgc3RhdGUgPSBlU0lSX0hUX01JTU9fUFNfTk9fTElNSVQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiUmVjZWl2ZWQgU00gUG93ZXIgc2F2ZSBNb2RlIHVwZGF0ZSBGcmFtZSB3aXRoIGludmFsaWQgbW9kZSIpKTspCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGUgPT0gcFN0YS0+aHRNSU1PUFNTdGF0ZSkgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVGhlIFBFRVIgaXMgYWxyZWFkeSBzZXQgaW4gdGhlIHNhbWUgbW9kZSIpKTspCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiogVXBkYXRlIGluIHRoZSBIQUwgU3RhdGlvbiBUYWJsZSBmb3IgdGhlIFVwZGF0ZSBvZiB0aGUgUHJvdGVjdGlvbiBNb2RlICovCisgICAgICAgIHBTdGEtPmh0TUlNT1BTU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgbGltUG9zdFNNU3RhdGVVcGRhdGUocE1hYyxwU3RhLT5zdGFJbmRleCwgcFN0YS0+aHRNSU1PUFNTdGF0ZSk7CisKKyNlbmRpZgorICAgICAgICAKK30KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCitzdGF0aWMgdm9pZAorX19saW1Qcm9jZXNzUmFkaW9NZWFzdXJlUmVxdWVzdCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbyAsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSApCit7CisgICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgICAgICAgICBwSGRyOworICAgICB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QgZnJtOworICAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4sIG5TdGF0dXM7CisgICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgICAqcEJvZHk7CisKKyAgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUiggcFJ4UGFja2V0SW5mbyApOworICAgICBwQm9keSA9IFdEQV9HRVRfUlhfTVBEVV9EQVRBKCBwUnhQYWNrZXRJbmZvICk7CisgICAgIGZyYW1lTGVuID0gV0RBX0dFVF9SWF9QQVlMT0FEX0xFTiggcFJ4UGFja2V0SW5mbyApOworCisgICAgIGlmKCBwc2Vzc2lvbkVudHJ5ID09IE5VTEwgKQorICAgICB7CisgICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICAgLyoqVW5wYWNrIHRoZSByZWNlaXZlZCBmcmFtZSAqLworICAgICBuU3RhdHVzID0gZG90MTFmVW5wYWNrUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QoIHBNYWMsIHBCb2R5LCBmcmFtZUxlbiwgJmZybSApOworCisgICAgIGlmKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkpIHsKKyAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiRmFpbGVkIHRvIHVucGFjayBhbmQgcGFyc2UgYSBSYWRpbyBNZWFzdXJlIHJlcXVlc3QgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICAgIG5TdGF0dXMsIGZyYW1lTGVuICk7CisgICAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYoIHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwQm9keSwgZnJhbWVMZW4gKTspCisgICAgICAgICAgICAgICByZXR1cm47CisgICAgIH1lbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkgeworICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCggIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGEgUmFkaW8gTWVhc3VyZSByZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgICAgICAgICBuU3RhdHVzLCBmcmFtZUxlbiApOworICAgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKCBwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEJvZHksIGZyYW1lTGVuICk7KQorICAgICB9CisKKyAgICAgLy8gQ2FsbCBycm0gZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZXF1ZXN0LgorCisgICAgIHJybVByb2Nlc3NSYWRpb01lYXN1cmVtZW50UmVxdWVzdCggcE1hYywgcEhkci0+c2EsICZmcm0sIHBzZXNzaW9uRW50cnkgKTsKK30KKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc0xpbmtNZWFzdXJlbWVudFJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbyAsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSApCit7CisgICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgICAgICAgIHBIZHI7CisgICAgIHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0IGZybTsKKyAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4sIG5TdGF0dXM7CisgICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgICpwQm9keTsKKworICAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKCBwUnhQYWNrZXRJbmZvICk7CisgICAgIHBCb2R5ID0gV0RBX0dFVF9SWF9NUERVX0RBVEEoIHBSeFBhY2tldEluZm8gKTsKKyAgICAgZnJhbWVMZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKCBwUnhQYWNrZXRJbmZvICk7CisKKyAgICAgaWYoIHBzZXNzaW9uRW50cnkgPT0gTlVMTCApCisgICAgIHsKKyAgICAgICAgICByZXR1cm47CisgICAgIH0KKworICAgICAvKipVbnBhY2sgdGhlIHJlY2VpdmVkIGZyYW1lICovCisgICAgIG5TdGF0dXMgPSBkb3QxMWZVbnBhY2tMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0KCBwTWFjLCBwQm9keSwgZnJhbWVMZW4sICZmcm0gKTsKKworICAgICBpZiggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApKSB7CisgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIkZhaWxlZCB0byB1bnBhY2sgYW5kIHBhcnNlIGEgTGluayBNZWFzdXJlIHJlcXVlc3QgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICAgIG5TdGF0dXMsIGZyYW1lTGVuICk7CisgICAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYoIHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwQm9keSwgZnJhbWVMZW4gKTspCisgICAgICAgICAgICAgICByZXR1cm47CisgICAgIH1lbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkgeworICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCggIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGEgTGluayBNZWFzdXJlIHJlcXVlc3QgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICAgIG5TdGF0dXMsIGZyYW1lTGVuICk7CisgICAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYoIHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwQm9keSwgZnJhbWVMZW4gKTspCisgICAgIH0KKworICAgICAvLyBDYWxsIHJybSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlcXVlc3QuCisKKyAgICAgcnJtUHJvY2Vzc0xpbmtNZWFzdXJlbWVudFJlcXVlc3QoIHBNYWMsIHBSeFBhY2tldEluZm8sICZmcm0sIHBzZXNzaW9uRW50cnkgKTsKKworfQorCitzdGF0aWMgdm9pZAorX19saW1Qcm9jZXNzTmVpZ2hib3JSZXBvcnQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8gLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgKQoreworICAgICB0cFNpck1hY01nbXRIZHIgICAgICAgICAgICAgICBwSGRyOworICAgICB0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXNwb25zZSBmcm07CisgICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuLCBuU3RhdHVzOworICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICAqcEJvZHk7CisKKyAgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUiggcFJ4UGFja2V0SW5mbyApOworICAgICBwQm9keSA9IFdEQV9HRVRfUlhfTVBEVV9EQVRBKCBwUnhQYWNrZXRJbmZvICk7CisgICAgIGZyYW1lTGVuID0gV0RBX0dFVF9SWF9QQVlMT0FEX0xFTiggcFJ4UGFja2V0SW5mbyApOworCisgICAgIGlmKCBwc2Vzc2lvbkVudHJ5ID09IE5VTEwgKQorICAgICB7CisgICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICAgLyoqVW5wYWNrIHRoZSByZWNlaXZlZCBmcmFtZSAqLworICAgICBuU3RhdHVzID0gZG90MTFmVW5wYWNrTmVpZ2hib3JSZXBvcnRSZXNwb25zZSggcE1hYywgcEJvZHksIGZyYW1lTGVuLCAmZnJtICk7CisKKyAgICAgaWYoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSkgeworICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJGYWlsZWQgdG8gdW5wYWNrIGFuZCBwYXJzZSBhIE5laWdoYm9yIHJlcG9ydCByZXNwb25zZSAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgblN0YXR1cywgZnJhbWVMZW4gKTsKKyAgICAgICAgICBQRUxPRzIoc2lyRHVtcEJ1ZiggcE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBCb2R5LCBmcmFtZUxlbiApOykKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgfWVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKSB7CisgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbmcgYSBOZWlnaGJvciByZXBvcnQgcmVzcG9uc2UgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICAgIG5TdGF0dXMsIGZyYW1lTGVuICk7CisgICAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYoIHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwQm9keSwgZnJhbWVMZW4gKTspCisgICAgIH0KKworICAgICAvL0NhbGwgcnJtIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4KKyAgICAgcnJtUHJvY2Vzc05laWdoYm9yUmVwb3J0UmVzcG9uc2UoIHBNYWMsICZmcm0sIHBzZXNzaW9uRW50cnkgKTsgCisKK30KKworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisvKioKKyAqIGxpbVByb2Nlc3NBY3Rpb25GcmFtZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzQWN0aW9uRnJhbWUoKSB1cG9uCisgKiBTQSBxdWVyeSByZXF1ZXN0IEFjdGlvbiBmcmFtZSByZWNlcHRpb24uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwQmQgLSBBIHBvaW50ZXIgdG8gQnVmZmVyIGRlc2NyaXB0b3IgKyBhc3NvY2lhdGVkIFBEVXMKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZCBfX2xpbVByb2Nlc3NTQVF1ZXJ5UmVxdWVzdEFjdGlvbkZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8sdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0cFNpck1hY01nbXRIZHIgICAgIHBIZHI7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAqcEJvZHk7CisgICAgdEFOSV9VMTYgICAgICAgICAgICB0cmFuc0lkID0gMDsgICAgICAgICAgIAorCisgICAgLyogUHJpbWEgIC0tLSBCZWxvdyBNYWNybyBub3QgYXZhaWxhYmxlIGluIHByaW1hIAorICAgICAgIHBIZHIgPSBTSVJfTUFDX0JEX1RPX01QRFVIRUFERVIocEJkKTsKKyAgICAgICBwQm9keSA9IFNJUl9NQUNfQkRfVE9fTVBEVURBVEEocEJkKTsgKi8KKworICAgIHBIZHIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisgICAgcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKworICAgIC8qRXh0cmFjdCAxMXcgdHJzYW5zSWQgZnJvbSBTQSBxdWVyeSByZXF1ZXN0IGFjdGlvbiBmcmFtZQorICAgICAgSW4gU0EgcXVlcnkgcmVzcG9uc2UgYWN0aW9uIGZyYW1lIHdlIHdpbGwgc2VuZCBzYW1lIHRyYW5zSWQKKyAgICAgIEluIFNBIHF1ZXJ5IHJlcXVlc3QgYWN0aW9uIGZyYW1lOgorICAgICAgQ2F0ZWdvcnkgICAgICAgOiAxIGJ5dGUKKyAgICAgIEFjdGlvbiAgICAgICAgIDogMSBieXRlCisgICAgICBUcmFuc2FjdGlvbiBJRCA6IDIgYmJ5dGVzICovCisKKyAgICB0cmFuc0lkID0gcEJvZHlbMl07CisgICAgdHJhbnNJZCA9IHRyYW5zSWQgPDwgODsKKyAgICB0cmFuc0lkIHw9IHBCb2R5WzNdOworICAgIAorICAgIC8vU2VuZCAxMXcgU0EgcXVlcnkgcmVzcG9uc2UgYWN0aW9uIGZyYW1lCisgICAgaWYgKGxpbVNlbmRTYVF1ZXJ5UmVzcG9uc2VGcmFtZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImZhaWwgdG8gc2VuZCBTQSBxdWVyeSByZXNwb25zZSBhY3Rpb24gZnJhbWUuIFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworI2VuZGlmCisKKy8qKgorICogbGltUHJvY2Vzc0FjdGlvbkZyYW1lCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NNZXNzYWdlUXVldWUoKSB1cG9uCisgKiBBY3Rpb24gZnJhbWUgcmVjZXB0aW9uLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcFJ4UGFja2V0SW5mbyAtIEEgcG9pbnRlciB0byBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVByb2Nlc3NBY3Rpb25GcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VOCAqcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKyAgICB0cFNpck1hY0FjdGlvbkZyYW1lSGRyIHBBY3Rpb25IZHIgPSAodHBTaXJNYWNBY3Rpb25GcmFtZUhkcikgcEJvZHk7CisKKyAgIAorICAgIHN3aXRjaCAocEFjdGlvbkhkci0+Y2F0ZWdvcnkpCisgICAgeworICAgICAgICBjYXNlIFNJUl9NQUNfQUNUSU9OX1FPU19NR01UOgorICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwQWN0aW9uSGRyLT5hY3Rpb25JRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19RT1NfQUREX1RTX1JFUToKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbGltUHJvY2Vzc0FkZFRzUmVxKHBNYWMsICh0QU5JX1U4ICopIHBSeFBhY2tldEluZm8scHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfUU9TX0FERF9UU19SU1A6CisgICAgICAgICAgICAgICAgICAgICAgICBfX2xpbVByb2Nlc3NBZGRUc1JzcChwTWFjLCAodEFOSV9VOCAqKSBwUnhQYWNrZXRJbmZvLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTSVJfTUFDX1FPU19ERUxfVFNfUkVROgorICAgICAgICAgICAgICAgICAgICAgICAgX19saW1Qcm9jZXNzRGVsVHNSZXEocE1hYywgKHRBTklfVTggKikgcFJ4UGFja2V0SW5mbyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJRb3MgYWN0aW9uICVkIG5vdCBoYW5kbGVkXG4iKSwgcEFjdGlvbkhkci0+YWN0aW9uSUQpOykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTUFDX0FDVElPTl9TUEVDVFJVTV9NR01UOgorICAgICAgICAgICAgc3dpdGNoIChwQWN0aW9uSGRyLT5hY3Rpb25JRCkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBBTklfU1VQUE9SVF8xMUgKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfQUNUSU9OX01FQVNVUkVfUkVRVUVTVF9JRDoKKyAgICAgICAgICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+bGltMTFoRW5hYmxlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2xpbVByb2Nlc3NNZWFzdXJlbWVudFJlcXVlc3RGcmFtZShwTWFjLCBwUnhQYWNrZXRJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19BQ1RJT05fVFBDX1JFUVVFU1RfSUQ6CisgICAgICAgICAgICAgICAgICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHBlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW0xMWhFbmFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19saW1Qcm9jZXNzVHBjUmVxdWVzdEZyYW1lKHBNYWMsIHBSeFBhY2tldEluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisjZW5kaWYKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfQUNUSU9OX0NIQU5ORUxfU1dJVENIX0lEOgorICAgICAgICAgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2xpbVByb2Nlc3NDaGFubmVsU3dpdGNoQWN0aW9uRnJhbWUocE1hYywgcFJ4UGFja2V0SW5mbyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJTcGVjdHJ1bSBtZ210IGFjdGlvbiBpZCAlZCBub3QgaGFuZGxlZFxuIiksIHBBY3Rpb25IZHItPmFjdGlvbklEKTspCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTUFDX0FDVElPTl9XTUU6CisgICAgICAgICAgICBpZiAoISBwc2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiV01FIG1vZGUgZGlzYWJsZWQgLSBkcm9wcGluZyBhY3Rpb24gZnJhbWUgJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICBwQWN0aW9uSGRyLT5hY3Rpb25JRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2gocEFjdGlvbkhkci0+YWN0aW9uSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTSVJfTUFDX1FPU19BRERfVFNfUkVROgorICAgICAgICAgICAgICAgICAgICBfX2xpbVByb2Nlc3NBZGRUc1JlcShwTWFjLCAodEFOSV9VOCAqKSBwUnhQYWNrZXRJbmZvLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19RT1NfQUREX1RTX1JTUDoKKyAgICAgICAgICAgICAgICAgICAgX19saW1Qcm9jZXNzQWRkVHNSc3AocE1hYywgKHRBTklfVTggKikgcFJ4UGFja2V0SW5mbyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfUU9TX0RFTF9UU19SRVE6CisgICAgICAgICAgICAgICAgICAgIF9fbGltUHJvY2Vzc0RlbFRzUmVxKHBNYWMsICh0QU5JX1U4ICopIHBSeFBhY2tldEluZm8scHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiV01FIGFjdGlvbiAlZCBub3QgaGFuZGxlZFxuIiksIHBBY3Rpb25IZHItPmFjdGlvbklEKTspCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTUFDX0FDVElPTl9CTEtBQ0s6CisgICAgICAgICAgICAvLyBEZXRlcm1pbmUgdGhlICJ0eXBlIiBvZiBCQSBBY3Rpb24gRnJhbWUKKyAgICAgICAgICAgIHN3aXRjaChwQWN0aW9uSGRyLT5hY3Rpb25JRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0JMS0FDS19BRERfUkVROgorICAgICAgICAgICAgICAgIF9fbGltUHJvY2Vzc0FkZEJBUmVxKCBwTWFjLCAodEFOSV9VOCAqKSBwUnhQYWNrZXRJbmZvLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19CTEtBQ0tfQUREX1JTUDoKKyAgICAgICAgICAgICAgICBfX2xpbVByb2Nlc3NBZGRCQVJzcCggcE1hYywgKHRBTklfVTggKikgcFJ4UGFja2V0SW5mbyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfQkxLQUNLX0RFTDoKKyAgICAgICAgICAgICAgICBfX2xpbVByb2Nlc3NEZWxCQVJlcSggcE1hYywgKHRBTklfVTggKikgcFJ4UGFja2V0SW5mbyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIFNJUl9NQUNfQUNUSU9OX0hUOgorICAgICAgICAvKiogVHlwZSBvZiBIVCBBY3Rpb24gdG8gYmUgcGVyZm9ybWVkKi8KKyAgICAgICAgc3dpdGNoKHBBY3Rpb25IZHItPmFjdGlvbklEKSB7CisgICAgICAgIGNhc2UgU0lSX01BQ19TTV9QT1dFUl9TQVZFOgorICAgICAgICAgICAgX19saW1Qcm9jZXNzU01Qb3dlclNhdmVVcGRhdGUocE1hYywgKHRBTklfVTggKikgcFJ4UGFja2V0SW5mbyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiQWN0aW9uIElEICVkIG5vdCBoYW5kbGVkIGluIEhUIEFjdGlvbiBjYXRlZ29yeVxuIiksIHBBY3Rpb25IZHItPmFjdGlvbklEKTspCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIGNhc2UgU0lSX01BQ19BQ1RJT05fUlJNOgorICAgICAgICBpZiggcE1hYy0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGUgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2gocEFjdGlvbkhkci0+YWN0aW9uSUQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfUlJNX1JBRElPX01FQVNVUkVfUkVROgorICAgICAgICAgICAgICAgICAgICBfX2xpbVByb2Nlc3NSYWRpb01lYXN1cmVSZXF1ZXN0KCBwTWFjLCAodEFOSV9VOCAqKSBwUnhQYWNrZXRJbmZvLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19SUk1fTElOS19NRUFTVVJFTUVOVF9SRVE6CisgICAgICAgICAgICAgICAgICAgIF9fbGltUHJvY2Vzc0xpbmtNZWFzdXJlbWVudFJlcSggcE1hYywgKHRBTklfVTggKikgcFJ4UGFja2V0SW5mbywgcHNlc3Npb25FbnRyeSApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfUlJNX05FSUdIQk9SX1JQVDogICAKKyAgICAgICAgICAgICAgICAgICAgX19saW1Qcm9jZXNzTmVpZ2hib3JSZXBvcnQoIHBNYWMsICh0QU5JX1U4KikgcFJ4UGFja2V0SW5mbywgcHNlc3Npb25FbnRyeSApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBQRUxPR0UoIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkFjdGlvbiBJRCAlZCBub3QgaGFuZGxlZCBpbiBSUk1cbiIpLCBwQWN0aW9uSGRyLT5hY3Rpb25JRCk7KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRWxzZSB3ZSB3aWxsIGp1c3QgaWdub3JlIHRoZSBSUk0gbWVzc2FnZXMuCisgICAgICAgICAgICBQRUxPR0UoIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIlJSTSBBY3Rpb24gZnJhbWUgaWdub3JlZCBhcyBSUk0gaXMgZGlzYWJsZWQgaW4gY2ZnXG4iKSk7KQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQCisgICAgY2FzZSBTSVJfTUFDX0FDVElPTl9QVUJMSUNfVVNBR0U6CisgICAgICAgIHN3aXRjaChwQWN0aW9uSGRyLT5hY3Rpb25JRCkgeworICAgICAgICBjYXNlIFNJUl9NQUNfQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdHBTaXJNYWNWZW5kb3JTcGVjaWZpY1B1YmxpY0FjdGlvbkZyYW1lSGRyIHBQdWJBY3Rpb24gPSAodHBTaXJNYWNWZW5kb3JTcGVjaWZpY1B1YmxpY0FjdGlvbkZyYW1lSGRyKSBwQWN0aW9uSGRyOworICAgICAgICAgICAgICB0cFNpck1hY01nbXRIZHIgICAgIHBIZHI7CisgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgICAgICAgZnJhbWVMZW47CisgICAgICAgICAgICAgIHRBTklfVTggUDJQT3VpW10gPSB7IDB4NTAsIDB4NkYsIDB4OUEsIDB4MDkgfTsKKworICAgICAgICAgICAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworICAgICAgICAgICAgICBmcmFtZUxlbiA9IFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbyk7CisKKyAgICAgICAgICAgICAgLy9DaGVjayBpZiBpdCBpcyBhIFAyUCBwdWJsaWMgYWN0aW9uIGZyYW1lLgorICAgICAgICAgICAgICBpZiggcGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsIHBQdWJBY3Rpb24tPk91aSwgUDJQT3VpLCA0ICkgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIC8qIEZvcndhcmQgdG8gdGhlIFNNRSB0byBIREQgdG8gd3BhX3N1cHBsaWNhbnQgKi8KKyAgICAgICAgICAgICAgICAgLy8gdHlwZSBpcyBBQ1RJT04KKyAgICAgICAgICAgICAgICAgbGltU2VuZFNtZU1nbXRGcmFtZUluZChwTWFjLCBwSGRyLT5mYy5zdWJUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgKHRBTklfVTgqKXBIZHIsIGZyYW1lTGVuICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwgMCwgCisgICAgICAgICAgICAgICAgICAgIFdEQV9HRVRfUlhfQ0goIHBSeFBhY2tldEluZm8gKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIlVuaGFuZGxlZCBwdWJsaWMgYWN0aW9uIGZyYW1lIChWZW5kb3Igc3BlY2lmaWMpLiBPVUkgJXggJXggJXggJXhcbiIpLAorICAgICAgICAgICAgICAgICAgICAgIHBQdWJBY3Rpb24tPk91aVswXSwgcFB1YkFjdGlvbi0+T3VpWzFdLCBwUHViQWN0aW9uLT5PdWlbMl0sIHBQdWJBY3Rpb24tPk91aVszXSApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJVbmhhbmRsZWQgcHVibGljIGFjdGlvbiBmcmFtZSAtLSAleCBcbiIpLCBwQWN0aW9uSGRyLT5hY3Rpb25JRCk7KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKyAgICBjYXNlIFNJUl9NQUNfQUNUSU9OX1NBX1FVRVJZOgorICAgIHsKKyAgICAgICAgLyoqMTF3IFNBIHF1ZXJ5IHJlcXVlc3QgYWN0aW9uIGZyYW1lIHJlY2VpdmVkKiovCisgICAgICAgIF9fbGltUHJvY2Vzc1NBUXVlcnlSZXF1ZXN0QWN0aW9uRnJhbWUocE1hYywodEFOSV9VOCopIHBSeFBhY2tldEluZm8sIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgYnJlYWs7CisgICAgIH0KKyNlbmRpZgorCisgICAgZGVmYXVsdDoKKyAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJBY3Rpb24gY2F0ZWdvcnkgJWQgbm90IGhhbmRsZWRcbiIpLCBwQWN0aW9uSGRyLT5jYXRlZ29yeSk7KQorICAgICAgIGJyZWFrOworICAgIH0KK30KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1AyUAorLyoqCisgKiBsaW1Qcm9jZXNzQWN0aW9uRnJhbWVOb1Nlc3Npb24KKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpIHVwb24KKyAqIEFjdGlvbiBmcmFtZSByZWNlcHRpb24gYW5kIG5vIHNlc3Npb24uCisgKiBDdXJyZW50bHkgb25seSBwdWJsaWMgYWN0aW9uIGZyYW1lcyBjYW4gYmUgcmVjZWl2ZWQgZnJvbQorICogYSBub24tYXNzb2NpYXRlZCBzdGF0aW9uLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcEJkIC0gQSBwb2ludGVyIHRvIEJ1ZmZlciBkZXNjcmlwdG9yICsgYXNzb2NpYXRlZCBQRFVzCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1Qcm9jZXNzQWN0aW9uRnJhbWVOb1Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcEJkKQoreworICAgdEFOSV9VOCAqcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwQmQpOworICAgdHBTaXJNYWNWZW5kb3JTcGVjaWZpY1B1YmxpY0FjdGlvbkZyYW1lSGRyIHBBY3Rpb25IZHIgPSAodHBTaXJNYWNWZW5kb3JTcGVjaWZpY1B1YmxpY0FjdGlvbkZyYW1lSGRyKSBwQm9keTsKKworICAgbGltTG9nKCBwTWFjLCBMT0dFLCAiUmVjZWl2ZWQgYSBBY3Rpb24gZnJhbWUgLS0gbm8gc2Vzc2lvbiIpOworCisgICBzd2l0Y2ggKCBwQWN0aW9uSGRyLT5jYXRlZ29yeSApCisgICB7CisgICAgICBjYXNlIFNJUl9NQUNfQUNUSU9OX1BVQkxJQ19VU0FHRToKKyAgICAgICAgIHN3aXRjaChwQWN0aW9uSGRyLT5hY3Rpb25JRCkgeworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0FDVElPTl9WRU5ET1JfU1BFQ0lGSUM6CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cFNpck1hY01nbXRIZHIgICAgIHBIZHI7CisgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICBmcmFtZUxlbjsKKyAgICAgICAgICAgICAgICB0QU5JX1U4IFAyUE91aVtdID0geyAweDUwLCAweDZGLCAweDlBLCAweDA5IH07CisKKyAgICAgICAgICAgICAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBCZCk7CisgICAgICAgICAgICAgICAgZnJhbWVMZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBCZCk7CisKKyAgICAgICAgICAgICAgICAvL0NoZWNrIGlmIGl0IGlzIGEgUDJQIHB1YmxpYyBhY3Rpb24gZnJhbWUuCisgICAgICAgICAgICAgICAgaWYoIHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCBwQWN0aW9uSGRyLT5PdWksIFAyUE91aSwgNCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBGb3J3YXJkIHRvIHRoZSBTTUUgdG8gSEREIHRvIHdwYV9zdXBwbGljYW50ICovCisgICAgICAgICAgICAgICAgICAvLyB0eXBlIGlzIEFDVElPTgorICAgICAgICAgICAgICAgICAgbGltU2VuZFNtZU1nbXRGcmFtZUluZChwTWFjLCBwSGRyLT5mYy5zdWJUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCopcEhkciwgZnJhbWVMZW4gKyBzaXplb2YodFNpck1hY01nbXRIZHIpLCAwLAorICAgICAgICAgICAgICAgICAgICAgIFdEQV9HRVRfUlhfQ0goIHBCZCApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIlVuaGFuZGxlZCBwdWJsaWMgYWN0aW9uIGZyYW1lIChWZW5kb3Igc3BlY2lmaWMpLiBPVUkgJXggJXggJXggJXhcbiIpLAorICAgICAgICAgICAgICAgICAgICAgIHBBY3Rpb25IZHItPk91aVswXSwgcEFjdGlvbkhkci0+T3VpWzFdLCBwQWN0aW9uSGRyLT5PdWlbMl0sIHBBY3Rpb25IZHItPk91aVszXSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5oYW5kbGVkIHB1YmxpYyBhY3Rpb24gZnJhbWUgLS0gJXggXG4iKSwgcEFjdGlvbkhkci0+YWN0aW9uSUQpOykKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5oYW5kbGVkIGFjdGlvbiBmcmFtZSB3aXRob3V0IHNlc3Npb24gLS0gJXggXG4iKSwgcEFjdGlvbkhkci0+Y2F0ZWdvcnkpOykKKyAgICAgICAgICAgIGJyZWFrOworCisgICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0Fzc29jUmVxRnJhbWUuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0Fzc29jUmVxRnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWU5NDVkCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzQXNzb2NSZXFGcmFtZS5jCkBAIC0wLDAgKzEsMTY0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbVByb2Nlc3NBc3NvY1JlcUZyYW1lLmNjIGNvbnRhaW5zIHRoZSBjb2RlCisgKiBmb3IgcHJvY2Vzc2luZyBSZS9Bc3NvY2lhdGlvbiBSZXF1ZXN0IEZyYW1lLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDMvMTgvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMDUvMjYvMTAgICAgICAganMgICAgICAgICAgICAgV1BBIGhhbmRsaW5nIGluIChSZSlBc3NvYyBmcmFtZXMKKyAqCisgKi8KKyNpbmNsdWRlICJwYWxUeXBlcy5oIgorI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisKKyNpbmNsdWRlICJzY2hBcGkuaCIKKyNpbmNsdWRlICJwbW1BcGkuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VjdXJpdHlVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAibGltU3RhSGFzaEFwaS5oIgorI2luY2x1ZGUgImxpbUFkbWl0Q29udHJvbC5oIgorI2luY2x1ZGUgInBhbEFwaS5oIgorCisKKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKy8qKgorICogbGltQ29udmVydFN1cHBvcnRlZENoYW5uZWxzCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NBc3NvY1JlcUZyYW1lKCkgdG8KKyAqIHBhcnNlIHRoZSBjaGFubmVsIHN1cHBvcnQgSUUgaW4gdGhlIEFzc29jL1JlYXNzb2MgUmVxdWVzdAorICogZnJhbWUsIGFuZCBzZW5kIHJlbGV2YW50IGluZm9ybWF0aW9uIGluIHRoZSBTTUVfQVNTT0NfSU5ECisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgIC0gQSBwb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBNbG1Bc3NvY0luZCAtIEEgcG9pbnRlciB0byBTTUUgQVNTT0MvUkVBU1NPQyBJTkQKKyAqIEBwYXJhbSAgYXNzb2NSZXEgICAgIC0gQSBwb2ludGVyIHRvIEFTU09DL1JFQVNTT0MgUmVxdWVzdCBmcmFtZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorbGltQ29udmVydFN1cHBvcnRlZENoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBMaW1NbG1Bc3NvY0luZCBwTWxtQXNzb2NJbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckFzc29jUmVxICphc3NvY1JlcSkKK3sKKworICAgIHRBTklfVTE2ICAgaSwgaiwgaW5kZXg9MDsKKyAgICB0QU5JX1U4ICAgIGZpcnN0Q2hhbm5lbE51bWJlcjsKKyAgICB0QU5JX1U4ICAgIG51bWJlck9mQ2hhbm5lbDsKKyAgICB0QU5JX1U4ICAgIG5leHRDaGFubmVsTnVtYmVyOworCisgICAgaWYoYXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzLmxlbmd0aCA+PSBTSVJfTUFYX1NVUFBPUlRFRF9DSEFOTkVMX0xJU1QpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIk51bWJlciBvZiBzdXBwb3J0ZWQgY2hhbm5lbHM6JWQgaXMgbW9yZSB0aGFuIE1BWFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY1JlcS0+c3VwcG9ydGVkQ2hhbm5lbHMubGVuZ3RoKTsKKyAgICAgICAgcE1sbUFzc29jSW5kLT5zdXBwb3J0ZWRDaGFubmVscy5udW1DaG5sID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcihpPTA7IGkgPCAoYXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzLmxlbmd0aCk7IGkrKykKKyAgICB7CisgICAgICAgIC8vIEdldCBGaXJzdCBDaGFubmVsIE51bWJlcgorICAgICAgICBmaXJzdENoYW5uZWxOdW1iZXIgPSBhc3NvY1JlcS0+c3VwcG9ydGVkQ2hhbm5lbHMuc3VwcG9ydGVkQ2hhbm5lbHNbaV07CisgICAgICAgIHBNbG1Bc3NvY0luZC0+c3VwcG9ydGVkQ2hhbm5lbHMuY2hhbm5lbExpc3RbaW5kZXhdID0gZmlyc3RDaGFubmVsTnVtYmVyOworICAgICAgICBpKys7CisgICAgICAgIGluZGV4Kys7CisgICAgICAgIGlmIChpbmRleCA+PSBTSVJfTUFYX1NVUFBPUlRFRF9DSEFOTkVMX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNbG1Bc3NvY0luZC0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubCA9IDA7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gR2V0IE51bWJlciBvZiBDaGFubmVscyBpbiBhIFN1YmJhbmQKKyAgICAgICAgbnVtYmVyT2ZDaGFubmVsID0gYXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzLnN1cHBvcnRlZENoYW5uZWxzW2ldOworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJSY3YgQXNzb2NSZXE6IGNobmw9JWQsIG51bU9mQ2hubD0lZCBcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGFubmVsTnVtYmVyLCBudW1iZXJPZkNoYW5uZWwpOykKKworICAgICAgICBpZiAobnVtYmVyT2ZDaGFubmVsID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dENoYW5uZWxOdW1iZXIgPSBmaXJzdENoYW5uZWxOdW1iZXI7CisgICAgICAgICAgICBpZihTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQoZmlyc3RDaGFubmVsTnVtYmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGo9MTsgaiA8IG51bWJlck9mQ2hhbm5lbDsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dENoYW5uZWxOdW1iZXIgKz0gU0lSXzExQV9GUkVRVUVOQ1lfT0ZGU0VUOworICAgICAgICAgICAgICAgICAgICBwTWxtQXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLmNoYW5uZWxMaXN0W2luZGV4XSA9IG5leHRDaGFubmVsTnVtYmVyOworICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gU0lSX01BWF9TVVBQT1JURURfQ0hBTk5FTF9MSVNUKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWxtQXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmwgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihTSVJfQkFORF8yXzRfR0haID09IGxpbUdldFJGQmFuZChmaXJzdENoYW5uZWxOdW1iZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaj0xOyBqIDwgbnVtYmVyT2ZDaGFubmVsOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXh0Q2hhbm5lbE51bWJlciArPSBTSVJfMTFCX0ZSRVFVRU5DWV9PRkZTRVQ7CisgICAgICAgICAgICAgICAgICAgIHBNbG1Bc3NvY0luZC0+c3VwcG9ydGVkQ2hhbm5lbHMuY2hhbm5lbExpc3RbaW5kZXhdID0gbmV4dENoYW5uZWxOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBTSVJfTUFYX1NVUFBPUlRFRF9DSEFOTkVMX0xJU1QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNbG1Bc3NvY0luZC0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwTWxtQXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmwgPSAodEFOSV9VOCkgaW5kZXg7CisgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsCisgICAgICAgIEZMKCJTZW5kIEFzc29jSW5kIHRvIFdTTTogc3BlY3RydW0gT04sIG1pblB3ciAlZCwgbWF4UHdyICVkLCBudW1DaG5sICVkXG4iKSwKKyAgICAgICAgcE1sbUFzc29jSW5kLT5wb3dlckNhcC5taW5UeFBvd2VyLAorICAgICAgICBwTWxtQXNzb2NJbmQtPnBvd2VyQ2FwLm1heFR4UG93ZXIsCisgICAgICAgIHBNbG1Bc3NvY0luZC0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubCk7KQorfQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBsaW1Qcm9jZXNzQXNzb2NSZXFGcmFtZQorXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkKK1wgICAgICAgdXBvbiBSZS9Bc3NvY2lhdGlvbiBSZXF1ZXN0IGZyYW1lIHJlY2VwdGlvbiBpbiAKK1wgICAgICAgQlRBTVAgQVAgb3IgU29mdCBBUCByb2xlLgorXAorXHBhcmFtIHBNYWMKK1xwYXJhbSAqcFJ4UGFja2V0SW5mbyAgICAtIEEgcG9pbnRlciB0byBCdWZmZXIgZGVzY3JpcHRvciArIGFzc29jaWF0ZWQgUERVcworXHBhcmFtIHN1YlR5cGUgLSBJbmRpY2F0ZXMgd2hldGhlciBpdCBpcyBBc3NvY2lhdGlvbiBSZXF1ZXN0KD0wKSAKK1wgICAgICAgICAgICAgICAgb3IgUmVhc3NvY2lhdGlvbiBSZXF1ZXN0KD0xKSBmcmFtZQorXHJldHVybiBOb25lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltUHJvY2Vzc0Fzc29jUmVxRnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggc3ViVHlwZSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICB1cGRhdGVDb250ZXh0OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICpwQm9keTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhaWQsIHRlbXA7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgdmFsOworICAgIHRBTklfUzMyICAgICAgICAgICAgICAgIGZyYW1lbGVuOworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgICAgIHN0YXR1czsKKyAgICB0cFNpck1hY01nbXRIZHIgICAgICAgICBwSGRyOworICAgIHN0cnVjdCB0TGltUHJlQXV0aE5vZGUgICpwU3RhUHJlQXV0aENvbnRleHQ7CisgICAgdEFuaUF1dGhUeXBlICAgICAgICAgICAgYXV0aFR5cGU7CisgICAgdFNpck1hY0NhcGFiaWxpdHlJbmZvICAgbG9jYWxDYXBhYmlsaXRpZXM7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgICAgICAgcFN0YURzID0gTlVMTDsKKyAgICB0cFNpckFzc29jUmVxICAgICAgICAgICBwQXNzb2NSZXE7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHRMaW1NbG1TdGF0ZXMgICAgICAgICAgIG1sbVByZXZTdGF0ZTsKKyAgICB0RG90MTFmSUVSU04gICAgICAgICAgICBEb3QxMWZJRVJTTjsKKyAgICB0RG90MTFmSUVXUEEgICAgICAgICAgICBEb3QxMWZJRVdQQTsKKyNlbmRpZgorICAgIHRBTklfVTMyIHBoeU1vZGU7CisgICAgdEhhbEJpdFZhbCBxb3NNb2RlOworICAgIHRIYWxCaXRWYWwgd3NtTW9kZSwgd21lTW9kZTsKKyAgICB0QU5JX1U4ICAgICp3cHNJZSA9IE5VTEw7CisgICAgdFNpck1hY1JhdGVTZXQgIGJhc2ljUmF0ZXM7CisgICAgdEFOSV9VOCBpID0gMCwgaiA9IDA7CisKKyAgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgIGxpbUdldFFvc01vZGUocHNlc3Npb25FbnRyeSwgJnFvc01vZGUpOworCisgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKyAgICBmcmFtZWxlbiA9IFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4UGFja2V0SW5mbyk7CisKKyAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUgfHwgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSApCisgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBBU1NPQyBSRVEgc3ViVHlwZT0lZCBmb3Igcm9sZT0lZCwgcmFkaW9JZD0lZCBmcm9tIFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlR5cGUsIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUsIHBNYWMtPnN5cy5nU2lyUmFkaW9JZCk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HRSk7CisgICAgICAgIHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzMsCisgICAgICAgIFdEQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pLCBmcmFtZWxlbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBHZXQgcG9pbnRlciB0byBSZS9Bc3NvY2lhdGlvbiBSZXF1ZXN0IGZyYW1lIGJvZHkKKyAgICBwQm9keSA9IFdEQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pOworCisgICAgaWYgKGxpbUlzR3JvdXBBZGRyKHBIZHItPnNhKSkKKyAgICB7CisgICAgICAgIC8vIFJlY2VpdmVkIFJlL0Fzc29jIFJlcSBmcmFtZSBmcm9tIGEgQkMvTUMgYWRkcmVzcworICAgICAgICAvLyBMb2cgZXJyb3IgYW5kIGlnbm9yZSBpdAorICAgICAgICBpZiAoc3ViVHlwZSA9PSBMSU1fQVNTT0MpCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoInJlY2VpdmVkIEFzc29jIGZyYW1lIGZyb20gYSBCQy9NQyBhZGRyZXNzXG4iKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgicmVjZWl2ZWQgUmVBc3NvYyBmcmFtZSBmcm9tIGEgQkMvTUMgYWRkcmVzc1xuIikpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiUmVjZWl2ZWQgQXNzb2NSZXEgRnJhbWU6ICIpKTsKKyAgICBzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cyLCAodEFOSV9VOCAqKSBwQm9keSwgZnJhbWVsZW4pOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIC8vIElmIFRLSVAgY291bnRlciBtZWFzdXJlcyBhY3RpdmUgc2VuZCBBc3NvYyBSc3AgZnJhbWUgdG8gc3RhdGlvbiB3aXRoIGVTSVJfTUFDX01JQ19GQUlMVVJFX1JFQVNPTgorICAgIGlmICgocHNlc3Npb25FbnRyeS0+YlRraXBDbnRyTWVhc0FjdGl2ZSkgJiYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKSkKKyAgICB7CisgICAgICAgIGxpbVNlbmRBc3NvY1JzcE1nbXRGcmFtZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfTUlDX0ZBSUxVUkVfUkVBU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgMCwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIEFzc29jIFJlcXVlc3QgZnJhbWUKKyAgICBpZiAoIHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQXNzb2NSZXEsIHNpemVvZigqcEFzc29jUmVxKSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlBBTCBBbGxvY2F0ZSBNZW1vcnkgZmFpbGVkIGluIEFzc29jUmVxXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKilwQXNzb2NSZXEgLCBzaXplb2YoKnBBc3NvY1JlcSkpOworICAgCisgICAgLy8gUGFyc2UgQXNzb2MgUmVxdWVzdCBmcmFtZQorICAgIGlmIChzdWJUeXBlID09IExJTV9BU1NPQykKKyAgICAgICAgc3RhdHVzID0gc2lyQ29udmVydEFzc29jUmVxRnJhbWUyU3RydWN0KHBNYWMsIHBCb2R5LCBmcmFtZWxlbiwgcEFzc29jUmVxKTsKKyAgICBlbHNlCisgICAgICAgIHN0YXR1cyA9IHNpckNvbnZlcnRSZWFzc29jUmVxRnJhbWUyU3RydWN0KHBNYWMsIHBCb2R5LCBmcmFtZWxlbiwgcEFzc29jUmVxKTsKKworICAgIGlmIChzdGF0dXMgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJQYXJzZSBlcnJvciBBc3NvY1JlcXVlc3QsIGxlbmd0aD0lZCBmcm9tIFxuIiksZnJhbWVsZW4pOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPR1cpOworICAgICAgICBsaW1TZW5kQXNzb2NSc3BNZ210RnJhbWUocE1hYywgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLCAxLCBwSGRyLT5zYSwgc3ViVHlwZSwgMCwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKCBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcEFzc29jUmVxLT5hc3NvY1JlcUZyYW1lLCBmcmFtZWxlbikgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhc3NvYyByZXEsIGxlbmd0aD0lZCBmcm9tIFxuIiksZnJhbWVsZW4pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICAKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQXNzb2NSZXEtPmFzc29jUmVxRnJhbWUsCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwQm9keSwgZnJhbWVsZW4pOworICAgIHBBc3NvY1JlcS0+YXNzb2NSZXFGcmFtZUxlbmd0aCA9IGZyYW1lbGVuOyAgICAKKworICAgIGlmIChjZmdHZXRDYXBhYmlsaXR5SW5mbyhwTWFjLCAmdGVtcCxwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBDYXBhYmlsaXRpZXNcbiIpKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pCisgICAgKih0QU5JX1UxNiopJmxvY2FsQ2FwYWJpbGl0aWVzPSh0QU5JX1UxNikodGVtcCk7CisjZWxzZQorICAgIGxpbUNvcHlVMTYoKHRBTklfVTggKikgJmxvY2FsQ2FwYWJpbGl0aWVzLCB0ZW1wKTsKKyNlbmRpZgorCisgICAgaWYgKGxpbUNvbXBhcmVDYXBhYmlsaXRpZXMocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2FsQ2FwYWJpbGl0aWVzLHBzZXNzaW9uRW50cnkpID09IGZhbHNlKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhcGFiaWxpdGllcyBvZiByZXF1ZXN0aW5nIFNUQSBkb2VzIG5vdCBtYXRjaCB3aXRoCisgICAgICAgICAqIGxvY2FsIGNhcGFiaWxpdGllcy4gUmVzcG9uZCB3aXRoICd1bnN1cHBvcnRlZCBjYXBhYmlsaXRpZXMnCisgICAgICAgICAqIHN0YXR1cyBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX0NBUEFCSUxJVElFU19OT1RfU1VQUE9SVEVEX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YlR5cGUsIDAscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJsb2NhbCBjYXBzIDB4JXggcmVjZWl2ZWQgMHgleFxuIiksIGxvY2FsQ2FwYWJpbGl0aWVzLCBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvKTsKKworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgaWYgKHN1YlR5cGUgPT0gTElNX0FTU09DKQorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXNzb2MgcmVxIHdpdGggdW5zdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIGZyb21cbiIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgUmVBc3NvYyByZXEgd2l0aCB1bnN1cHBvcnRlZCBjYXBhYmlsaXRpZXMgZnJvbVxuIikpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHVwZGF0ZUNvbnRleHQgPSBmYWxzZTsKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgIC8vIENoZWNrIGlmIG11bHRpcGxlIFNTSUQgZmVhdHVyZSBpcyBub3QgZW5hYmxlZAorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPnNzSWQubGVuZ3RoKQorICAgIHsKKyAgICAgICAgaWYgKGxpbUNtcFNTaWQocE1hYywgJnBBc3NvY1JlcS0+c3NJZCwgcHNlc3Npb25FbnRyeSkgPT0gZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qVGVtcCBoYWNrIGZvciBVUEYzNSAtIHNraXAgU1NJRCBjaGVjayBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGludGVyb3AgCisgICAgICAgICAgICAgd2l0aCBNYXJ2ZWwgLSB0aGV5IHNlbmQgdGhlaXIgb3duIFNTSUQgaW5zdGVhZCBvZiBvdXJzKi8KKyAgICAgICAgICAgIGlmICggMCAhPSB2b3NfZ2V0X3NraXBfc3NpZF9jaGVjaygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiUmVjZWl2ZWQgdW5tYXRjaGVkIFNTSUQgYnV0IGNmZyB0byBzdXBwcmVzcyAtIGNvbnRpbnVpbmdcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICogUmVjZWl2ZWQgUmUvQXNzb2NpYXRpb24gUmVxdWVzdCB3aXRoIGVpdGhlcgorICAgICAgICAgICAgICAqIEJyb2FkY2FzdCBTU0lEIE9SIHdpdGggU1NJRCB0aGF0IGRvZXMgbm90CisgICAgICAgICAgICAgICogbWF0Y2ggd2l0aCBsb2NhbCBvbmUuCisgICAgICAgICAgICAgICogUmVzcG9uZCB3aXRoIHVuc3BlY2lmaWVkIHN0YXR1cyBjb2RlLgorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBsaW1TZW5kQXNzb2NSc3BNZ210RnJhbWUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJUeXBlLCAwLHBzZXNzaW9uRW50cnkpOworICAKKyAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgIGlmIChzdWJUeXBlID09IExJTV9BU1NPQykKKyAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgicmVjZWl2ZWQgQXNzb2MgcmVxIHdpdGggdW5tYXRjaGVkIFNTSUQgZnJvbSBcbiIpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJyZWNlaXZlZCBSZUFzc29jIHJlcSB3aXRoIHVubWF0Y2hlZCBTU0lEIGZyb20gXG4iKSk7CisgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU3VwcHJlc3NlZCBTU0lELCBBcHAgaXMgZ29pbmcgdG8gY2hlY2sgU1NJRFxuIikpOworI2Vsc2UKKyAgICBpZiAobGltQ21wU1NpZChwTWFjLCAmcEFzc29jUmVxLT5zc0lkLCBwc2Vzc2lvbkVudHJ5KSA9PSBmYWxzZSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWNlaXZlZCBSZS9Bc3NvY2lhdGlvbiBSZXF1ZXN0IHdpdGggZWl0aGVyCisgICAgICAgICAqIEJyb2FkY2FzdCBTU0lEIE9SIHdpdGggU1NJRCB0aGF0IGRvZXMgbm90CisgICAgICAgICAqIG1hdGNoIHdpdGggbG9jYWwgb25lLgorICAgICAgICAgKiBSZXNwb25kIHdpdGggdW5zcGVjaWZpZWQgc3RhdHVzIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBsaW1TZW5kQXNzb2NSc3BNZ210RnJhbWUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgMCxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgaWYgKHN1YlR5cGUgPT0gTElNX0FTU09DKQorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEFzc29jIHJlcSB3aXRoIHVubWF0Y2hlZCBTU0lEIGZyb20gXG4iKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBSZUFzc29jIHJlcSB3aXRoIHVubWF0Y2hlZCBTU0lEIGZyb20gXG4iKSk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorI2VuZGlmCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqKiBWZXJpZnkgaWYgdGhlIHJlcXVlc3RlZCByYXRlcyBhcmUgYXZhaWxhYmxlIGluIHN1cHBvcnRlZCByYXRlCisgICAgICAqKiBzZXQgb3IgRXh0ZW5kZWQgcmF0ZSBzZXQuIFNvbWUgQVBzIGFyZSBhZGRpbmcgYmFzaWMgcmF0ZXMgaW4KKyAgICAgICoqIEV4dGVuZGVkIHJhdGVzZXQgSUUKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBiYXNpY1JhdGVzLm51bVJhdGVzID0gMDsKKworICAgIGZvcihpID0gMDsgaSA8IHBBc3NvY1JlcS0+c3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXM7IGkrKykKKyAgICB7CisgICAgICAgIGJhc2ljUmF0ZXMucmF0ZVtpXSA9IHBBc3NvY1JlcS0+c3VwcG9ydGVkUmF0ZXMucmF0ZVtpXTsKKyAgICAgICAgYmFzaWNSYXRlcy5udW1SYXRlcysrOworICAgIH0KKworICAgIGZvcihqID0gMDsgKGogPCBwQXNzb2NSZXEtPmV4dGVuZGVkUmF0ZXMubnVtUmF0ZXMpICYmIChpIDwgU0lSX01BQ19SQVRFU0VUX0VJRF9NQVgpOyBpKyssaisrKQorICAgIHsKKyAgICAgICAgYmFzaWNSYXRlcy5yYXRlW2ldID0gcEFzc29jUmVxLT5leHRlbmRlZFJhdGVzLnJhdGVbal07CisgICAgICAgIGJhc2ljUmF0ZXMubnVtUmF0ZXMrKzsKKyAgICB9CisgICAgaWYgKGxpbUNoZWNrUnhCYXNpY1JhdGVzKHBNYWMsIGJhc2ljUmF0ZXMsIHBzZXNzaW9uRW50cnkpID09IGZhbHNlKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3RpbmcgU1RBIGRvZXMgbm90IHN1cHBvcnQgQUxMIEJTUyBiYXNpYworICAgICAgICAgKiByYXRlcy4gUmVzcG9uZCB3aXRoICdiYXNpYyByYXRlcyBub3Qgc3VwcG9ydGVkJworICAgICAgICAgKiBzdGF0dXMgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIGxpbVNlbmRBc3NvY1JzcE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfQkFTSUNfUkFURVNfTk9UX1NVUFBPUlRFRF9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICBzdWJUeXBlLCAwLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICBpZiAoc3ViVHlwZSA9PSBMSU1fQVNTT0MpCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBBc3NvYyByZXEgd2l0aCB1bnN1cHBvcnRlZCByYXRlcyBmcm9tIFxuIikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBSZUFzc29jIHJlcSB3aXRoIHVuc3VwcG9ydGVkIHJhdGVzIGZyb21cbiIpKTsKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0dXKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisKKyAgICBpZigocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKSAmJgorICAgICAgIChwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUgPT0gV05JX0NGR19ET1QxMV9NT0RFXzExR19PTkxZKSAmJgorICAgICAgICgoIXBBc3NvY1JlcS0+ZXh0ZW5kZWRSYXRlc1ByZXNlbnQgKSB8fCAocEFzc29jUmVxLT5IVENhcHMucHJlc2VudCkpKQorICAgIHsKKyAgICAgICAgbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKCBwTWFjLCBlU0lSX01BQ19DQVBBQklMSVRJRVNfTk9UX1NVUFBPUlRFRF9TVEFUVVMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHBIZHItPnNhLCBzdWJUeXBlLCAwLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU09GVEFQIHdhcyBpbiAxMUcgb25seSBtb2RlLCByZWplY3RpbmcgbGVnYWN5IFNUQSdzXG4iKSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICB9Ly9lbmQgaWYgcGh5TW9kZSA9PSAxMUdfb25seQorIAorICAgIGlmKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgJiYgCisgICAgICAgKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSA9PSBXTklfQ0ZHX0RPVDExX01PREVfMTFOX09OTFkpICYmIAorICAgICAgICghcEFzc29jUmVxLT5IVENhcHMucHJlc2VudCkpCisgICAgeworICAgICAgICBsaW1TZW5kQXNzb2NSc3BNZ210RnJhbWUoIHBNYWMsIGVTSVJfTUFDX0NBUEFCSUxJVElFU19OT1RfU1VQUE9SVEVEX1NUQVRVUywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgcEhkci0+c2EsIHN1YlR5cGUsIDAsIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJTT0ZUQVAgd2FzIGluIDExTiBvbmx5IG1vZGUsIHJlamVjdGluZyBsZWdhY3kgU1RBJ3NcbiIpKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9Ly9lbmQgaWYgUGh5TW9kZSA9PSAxMU5fb25seQorCisjZW5kaWYKKworICAgIC8qIFNwZWN0cnVtIE1hbmFnZW1lbnQgKDExaCkgc3BlY2lmaWMgY2hlY2tzICovCisgICAgaWYgKGxvY2FsQ2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0KQorICAgIHsKKyAgICAgICAgdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisKKyAgICAgICAgLyogSWYgc3RhdGlvbiBpcyAxMWggY2FwYWJsZSwgdGhlbiBpdCBTSE9VTEQgc2VuZCBhbGwgbWFuZGF0b3J5IAorICAgICAgICAgKiBJRXMgaW4gYXNzb2MgcmVxdWVzdCBmcmFtZS4gTGV0IHVzIHZlcmlmeSB0aGF0CisgICAgICAgICAqLworICAgICAgICBpZiAocEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5zcGVjdHJ1bU1ndCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEoKHBBc3NvY1JlcS0+cG93ZXJDYXBhYmlsaXR5UHJlc2VudCkgJiYgKHBBc3NvY1JlcS0+c3VwcG9ydGVkQ2hhbm5lbHNQcmVzZW50KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogT25lIG9yIG1vcmUgcmVxdWlyZWQgaW5mb3JtYXRpb24gZWxlbWVudHMgYXJlIG1pc3NpbmcsIGxvZyB0aGUgcGVlcnMgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBpZiAoIXBBc3NvY1JlcS0+cG93ZXJDYXBhYmlsaXR5UHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHN1YlR5cGUgPT0gTElNX0FTU09DKQorICAgICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkxJTSBJbmZvOiBNaXNzaW5nIFBvd2VyIGNhcGFiaWxpdHkgSUUgaW4gYXNzb2MgcmVxdWVzdFxuIikpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiTElNIEluZm86IE1pc3NpbmcgUG93ZXIgY2FwYWJpbGl0eSBJRSBpbiBSZWFzc29jIHJlcXVlc3RcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFwQXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzUHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHN1YlR5cGUgPT0gTElNX0FTU09DKQorICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJMSU0gSW5mbzogTWlzc2luZyBTdXBwb3J0ZWQgY2hhbm5lbCBJRSBpbiBhc3NvYyByZXF1ZXN0XG4iKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiTElNIEluZm86IE1pc3NpbmcgU3VwcG9ydGVkIGNoYW5uZWwgSUUgaW4gUmVhc3NvYyByZXF1ZXN0XG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQXNzb2MgcmVxdWVzdCBoYXMgbWFuZGF0b3J5IGZpZWxkcyAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGxpbUlzRG90MTFoUG93ZXJDYXBhYmlsaXRpZXNJblJhbmdlKHBNYWMsIHBBc3NvY1JlcSwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgaWYgKGVTSVJfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3ViVHlwZSA9PSBMSU1fQVNTT0MpCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIkxJTSBJbmZvOiBBc3NvY2lhdGlvbiBNaW5UeFBvd2VyKFNUQSkgPiBNYXhUeFBvd2VyKEFQKVxuIikpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIkxJTSBJbmZvOiBSZWFzc29jaWF0aW9uIE1pblR4UG93ZXIoU1RBKSA+IE1heFR4UG93ZXIoQVApXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IGxpbUlzRG90MTFoU3VwcG9ydGVkQ2hhbm5lbHNWYWxpZChwTWFjLCBwQXNzb2NSZXEpOworICAgICAgICAgICAgICAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlR5cGUgPT0gTElNX0FTU09DKQorICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJMSU0gSW5mbzogQXNzb2NpYXRpb24gd3Jvbmcgc3VwcG9ydGVkIGNoYW5uZWxzIChTVEEpXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiTElNIEluZm86IFJlYXNzb2NpYXRpb24gd3Jvbmcgc3VwcG9ydGVkIGNoYW5uZWxzIChTVEEpXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIElFcyBhcmUgdmFsaWQsIHVzZSB0aGVtIGlmIG5lZWRlZCAqLworICAgICAgICAgICAgfQorICAgICAgICB9IC8vaWYoYXNzb2MuY2FwYWJpbGl0eUluZm8uc3BlY3RydW1NZ3QpCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogQXMgcGVyIHRoZSBjYXBhYmlpdGllcywgdGhlIHNwZWN0cnVtIG1hbmFnZW1lbnQgaXMgbm90IGVuYWJsZWQgb24gdGhlIHN0YXRpb24KKyAgICAgICAgICAgICAqIFRoZSBBUCBtYXkgYWxsb3cgdGhlIGFzc29jaWF0aW9ucyB0byBoYXBwZW4gZXZlbiBpZiBzcGVjdHJ1bSBtYW5hZ2VtZW50IGlzIG5vdAorICAgICAgICAgICAgICogYWxsb3dlZCwgaWYgdGhlIHRyYW5zbWl0IHBvd2VyIG9mIHN0YXRpb24gaXMgYmVsb3cgdGhlIHJlZ3VsYXRvcnkgbWF4aW11bQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8qIFRPRE86IHByZXNlbnRseSwgdGhpcyBpcyBub3QgaGFuZGxlZC4gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZXRhdGlvbiwgdGhlIEFQIHdvdWxkCisgICAgICAgICAgICAgKiBhbGxvdyB0aGUgc3RhdGlvbiB0byBhc3NvY2lhdGUgZXZlbiBpZiBpdCBkb2Vzbid0IHN1cHBvcnQgc3BlY3RydW0gbWFuYWdlbWVudC4KKyAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgfS8vIGVuZCBvZiBzcGVjdHJ1bSBtYW5hZ2VtZW50IHJlbGF0ZWQgcHJvY2Vzc2luZworCisgICAgaWYgKCAocEFzc29jUmVxLT5IVENhcHMucHJlc2VudCkgJiYgKGxpbUNoZWNrTUNTU2V0KHBNYWMsIHBBc3NvY1JlcS0+SFRDYXBzLnN1cHBvcnRlZE1DU1NldCkgPT0gZmFsc2UpKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3RpbmcgU1RBIGRvZXMgbm90IHN1cHBvcnQgQUxMIEJTUyBNQ1MgYmFzaWMgUmF0ZSBzZXQgcmF0ZXMuCisgICAgICAgICAqIFNwZWMgZG9lcyBub3QgZGVmaW5lIGFueSBzdGF0dXMgY29kZSBmb3IgdGhpcyBzY2VuYXJpby4KKyAgICAgICAgICovCisgICAgICAgIGxpbVNlbmRBc3NvY1JzcE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfT1VUU0lERV9TQ09QRV9PRl9TUEVDX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgIHN1YlR5cGUsIDAscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGlmIChzdWJUeXBlID09IExJTV9BU1NPQykKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEFzc29jIHJlcSB3aXRoIHVuc3VwcG9ydGVkIE1DUyBSYXRlIFNldCBmcm9tIFxuIikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBSZUFzc29jIHJlcSB3aXRoIHVuc3VwcG9ydGVkIE1DUyBSYXRlIFNldCBmcm9tXG4iKSk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy9pZiAocE1hYy0+ZHBoLmdEcGhQaHlNb2RlID09IFdOSV9DRkdfUEhZX01PREVfMTFHKQorICAgIGlmIChwaHlNb2RlID09IFdOSV9DRkdfUEhZX01PREVfMTFHKQorICAgIHsKKworICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR18xMUdfT05MWV9QT0xJQ1ksICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgMTFnLW9ubHkgZmxhZ1xuIikpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcEFzc29jUmVxLT5leHRlbmRlZFJhdGVzUHJlc2VudCAmJiB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmVjZWl2ZWQgUmUvQXNzb2NpYXRpb24gUmVxdWVzdCBmcm9tCisgICAgICAgICAgICAgKiAxMWIgU1RBIHdoZW4gMTFnIG9ubHkgcG9saWN5IG9wdGlvbgorICAgICAgICAgICAgICogaXMgc2V0LgorICAgICAgICAgICAgICogUmVqZWN0IHdpdGggdW5zcGVjaWZpZWQgc3RhdHVzIGNvZGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbVNlbmRBc3NvY1JzcE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19CQVNJQ19SQVRFU19OT1RfU1VQUE9SVEVEX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlR5cGUsIDAscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiUmVqZWN0aW5nIFJlL0Fzc29jIHJlcSBmcm9tIDExYiBTVEE6ICIpKTsKKyAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisgICAgICAgICAgICAKKyNpZmRlZiBXTEFOX0RFQlVHICAgIAorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW0xMWJTdGFBc3NvY1JlamVjdENvdW50Kys7CisjZW5kaWYKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBXTU1fQVBTRAorICAgIC8vIFNhdmUgdGhlIFFPUyBpbmZvIGVsZW1lbnQgaW4gYXNzb2MgcmVxdWVzdC4uCisgICAgbGltR2V0V21lTW9kZShwTWFjLCAmd21lTW9kZSk7CisgICAgaWYgKHdtZU1vZGUgPT0gZUhBTF9TRVQpCisgICAgeworICAgICAgICB0cFFvc0luZm9TdGEgcUluZm87CisKKyAgICAgICAgcUluZm8gPSAodHBRb3NJbmZvU3RhKSAocEFzc29jUmVxLT5xb3NDYXBhYmlsaXR5LnFvc0luZm8pOworCisgICAgICAgIGlmICgocE1hYy0+bGltLmdXbW1BcHNkLmFwc2RFbmFibGUgPT0gMCkgJiYgKHFJbmZvLT5hY19iZSB8fCBxSW5mby0+YWNfYmsgfHwgcUluZm8tPmFjX3ZvIHx8IHFJbmZvLT5hY192aSkpCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBSZWNlaXZlZCBSZS9Bc3NvY2lhdGlvbiBSZXF1ZXN0IGZyb20KKyAgICAgICAgICAgICAqIDExYiBTVEEgd2hlbiAxMWcgb25seSBwb2xpY3kgb3B0aW9uCisgICAgICAgICAgICAgKiBpcyBzZXQuCisgICAgICAgICAgICAgKiBSZWplY3Qgd2l0aCB1bnNwZWNpZmllZCBzdGF0dXMgY29kZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX1dNRV9SRUZVU0VEX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlR5cGUsIDAscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgICAgIEZMKCJSZWplY3RpbmcgUmUvQXNzb2MgcmVxIGZyb20gU1RBOiAiKSk7CisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPR1cpOworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJBUFNEIG5vdCBlbmFibGVkLCBxb3NJbmZvIC0gMHgleFxuIiksICpxSW5mbyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBDaGVjayBmb3IgODAyLjExbiBIVCBjYXBzIGNvbXBhdGliaWxpdHk7IGFyZSBIVCBDYXBhYmlsaXRpZXMKKyAgICAvLyB0dXJuZWQgb24gaW4gbGltPworICAgIGlmICggcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5ICkKKyAgICB7CisgICAgICAgIC8vIFRoZXJlIGFyZTsgYXJlIHRoZXkgdHVybmVkIG9uIGluIHRoZSBTVEE/CisgICAgICAgIGlmICggcEFzc29jUmVxLT5IVENhcHMucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBzdGF0aW9uICpkb2VzKiBzdXBwb3J0IDgwMi4xMW4gSFQgY2FwYWJpbGl0eS4uLgorCisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPRzEsIEZMKCAiQWR2Q29kaW5nQ2FwOiVkIENoYVdpZHRoU2V0OiVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3dlclNhdmU6JWQgZ3JlZW5GaWVsZDolZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvcnRHSTIwOiVkIHNob3J0R0k0MDolZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR4U1RCQzolZCByeFNUQkM6JWQgZGVsYXlCQTolZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhBTVNEVXNpemU6JWQgRFNTUy9DQ0s6JWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBTTVA6JWQgc3RiY0NudGw6JWQgbHNpZ1RYUHJvdDolZFxuIiksCisgICAgICAgICAgICAgICAgICAgIHBBc3NvY1JlcS0+SFRDYXBzLmFkdkNvZGluZ0NhcCwKKyAgICAgICAgICAgICAgICAgICAgcEFzc29jUmVxLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0LAorICAgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEtPkhUQ2Fwcy5taW1vUG93ZXJTYXZlLAorICAgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEtPkhUQ2Fwcy5ncmVlbkZpZWxkLAorICAgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEtPkhUQ2Fwcy5zaG9ydEdJMjBNSHosCisgICAgICAgICAgICAgICAgICAgIHBBc3NvY1JlcS0+SFRDYXBzLnNob3J0R0k0ME1IeiwKKyAgICAgICAgICAgICAgICAgICAgcEFzc29jUmVxLT5IVENhcHMudHhTVEJDLAorICAgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEtPkhUQ2Fwcy5yeFNUQkMsCisgICAgICAgICAgICAgICAgICAgIHBBc3NvY1JlcS0+SFRDYXBzLmRlbGF5ZWRCQSwKKyAgICAgICAgICAgICAgICAgICAgcEFzc29jUmVxLT5IVENhcHMubWF4aW1hbEFNU0RVc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgcEFzc29jUmVxLT5IVENhcHMuZHNzc0Nja01vZGU0ME1IeiwKKyAgICAgICAgICAgICAgICAgICAgcEFzc29jUmVxLT5IVENhcHMucHNtcCwKKyAgICAgICAgICAgICAgICAgICAgcEFzc29jUmVxLT5IVENhcHMuc3RiY0NvbnRyb2xGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcEFzc29jUmVxLT5IVENhcHMubHNpZ1RYT1BQcm90ZWN0aW9uICk7CisKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIFNUQSdzIGNhcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBvdXIgb3duOgorICAgICAgICAgICAgICAgIC8vMTEuMTUuMiBTdXBwb3J0IG9mIERTU1MvQ0NLIGluIDQwIE1IegorICAgICAgICAgICAgICAgIC8vdGhlIEFQIHNoYWxsIHJlZnVzZSBhc3NvY2lhdGlvbiByZXF1ZXN0cyBmcm9tIGFuIEhUIFNUQSB0aGF0IGhhcyB0aGUgRFNTUy9DQ0sgCisgICAgICAgICAgICAgICAgLy9Nb2RlIGluIDQwIE1IeiBzdWJmaWVsZCBzZXQgdG8gMTsKKworICAgICAgICAgICAgLy9GSVhNRV9CVEFNUF9BUCA6IE5lZWQgdG8gYmUgZW5hYmxlZCAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBpZiAoICFwTWFjLT5saW0uZ0hURHNzc0Nja1JhdGU0ME1IelN1cHBvcnQgJiYgcEFzc29jUmVxLT5IVENhcHMuZHNzc0Nja01vZGU0ME1IeiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfTUFDX0RTU1NfQ0NLX1JBVEVfTk9UX1NVUFBPUlRfU1RBVFVTOworICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoICJBUCBEU1NTL0NDSyBpcyBkaXNhYmxlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVEEgcmVqZWN0ZWQuXG4iICkgKTsKKyAgICAgICAgICAgICAgICAvLyBSZWplY3QgYXNzb2NpYXRpb24KKyAgICAgICAgICAgICAgICBsaW1TZW5kQXNzb2NSc3BNZ210RnJhbWUoIHBNYWMsIHN0YXR1c0NvZGUsIDEsIHBIZHItPnNhLCBzdWJUeXBlLCAwLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgfSAvLyBFbmQgaWYgb24gSFQgY2FwcyB0dXJuZWQgb24gaW4gbGltLgorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIC8qIENsZWFyIHRoZSBidWZmZXJzIHNvIHRoYXQgZnJhbWUgcGFyc2VyIGtub3dzIHRoYXQgdGhlcmUgaXNuJ3QgYSBwcmV2aW91c2x5IGRlY29kZWQgSUUgaW4gdGhlc2UgYnVmZmVycyAqLworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZEb3QxMWZJRVJTTiwgc2l6ZW9mKCBEb3QxMWZJRVJTTiApICk7CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJkRvdDExZklFV1BBLCBzaXplb2YoIERvdDExZklFV1BBICkgKTsKKworICAgIC8qIGlmIGFkZGl0aW9uYWwgSUUgaXMgcHJlc2VudCwgY2hlY2sgaWYgaXQgaGFzIFdzY0lFICovCisgICAgaWYoIHBBc3NvY1JlcS0+YWRkSUVQcmVzZW50ICYmIHBBc3NvY1JlcS0+YWRkSUUubGVuZ3RoICkKKyAgICAgICAgd3BzSWUgPSBsaW1HZXRXc2NJRVB0cihwTWFjLCBwQXNzb2NSZXEtPmFkZElFLmFkZElFZGF0YSwgcEFzc29jUmVxLT5hZGRJRS5sZW5ndGgpOworICAgIC8qIHdoZW4gd3BzSWUgaXMgcHJlc2VudCwgUlNOL1dQQSBJRSBpcyBpZ25vcmVkICovCisgICAgaWYoIHdwc0llID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgLyoqIGNoZWNrIHdoZXRoZXIgYXMgUlNOIElFIGlzIHByZXNlbnQgKi8KKyAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgCisgICAgICAgICAgICAmJiBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPnByaXZhY3kgCisgICAgICAgICAgICAmJiBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPnJzbklFLmxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoIkFQIHN1cHBvcnRzIFJTTiBlbmFibGVkIGF1dGhlbnRpY2F0aW9uXG4iKSk7CisKKyAgICAgICAgICAgIGlmKHBBc3NvY1JlcS0+cnNuUHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwQXNzb2NSZXEtPnJzbi5sZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBVbnBhY2sgdGhlIFJTTiBJRSAKKyAgICAgICAgICAgICAgICAgICAgZG90MTFmVW5wYWNrSWVSU04ocE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBc3NvY1JlcS0+cnNuLmluZm9bMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvY1JlcS0+cnNuLmxlbmd0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRvdDExZklFUlNOKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBSU04gdmVyc2lvbiBpcyBzdXBwb3J0ZWQgb3Igbm90ICovCisgICAgICAgICAgICAgICAgICAgIGlmKFNJUl9NQUNfT1VJX1ZFUlNJT05fMSA9PSBEb3QxMWZJRVJTTi52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayB0aGUgZ3JvdXB3aXNlIGFuZCBwYWlyd2lzZSBjaXBoZXIgc3VpdGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZihlU0lSX1NVQ0NFU1MgIT0gKHN0YXR1cyA9IGxpbUNoZWNrUnhSU05JZU1hdGNoKHBNYWMsIERvdDExZklFUlNOLCBwc2Vzc2lvbkVudHJ5LCBwQXNzb2NSZXEtPkhUQ2Fwcy5wcmVzZW50KSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb21lIElFIGlzIG5vdCBwcm9wZXJseSBzZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVjZWl2ZWQgQXNzb2NpYXRpb24gcmVxIGZyYW1lIHdpdGggUlNOIElFIGJ1dCBsZW5ndGggaXMgMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRBc3NvY1JzcE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlR5cGUsIDAscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIlJlamVjdGluZyBSZS9Bc3NvYyByZXEgZnJvbSBTVEE6ICIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPR1cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlY2VpdmVkIEFzc29jaWF0aW9uIHJlcSBmcmFtZSB3aXRoIFJTTiBJRSB2ZXJzaW9uIHdyb25nICovCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1TZW5kQXNzb2NSc3BNZ210RnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfVU5TVVBQT1JURURfUlNOX0lFX1ZFUlNJT05fU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgMCxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJSZWplY3RpbmcgUmUvQXNzb2MgcmVxIGZyb20gU1RBOiAiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPR1cpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlY2VpdmVkIEFzc29jaWF0aW9uIHJlcSBmcmFtZSB3aXRoIFJTTiBJRSBidXQgbGVuZ3RoIGlzIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19JTlZBTElEX0lORk9STUFUSU9OX0VMRU1FTlRfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgMCxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIlJlamVjdGluZyBSZS9Bc3NvYyByZXEgZnJvbSBTVEE6ICIpKTsKKyAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0dXKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvKiBlbmQgLSBpZihwQXNzb2NSZXEtPnJzblByZXNlbnQpICovCisgICAgICAgICAgICBpZigoIXBBc3NvY1JlcS0+cnNuUHJlc2VudCkgJiYgcEFzc29jUmVxLT53cGFQcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFVucGFjayB0aGUgV1BBIElFIAorICAgICAgICAgICAgICAgIGlmKHBBc3NvY1JlcS0+d3BhLmxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdDExZlVucGFja0llV1BBKHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXNzb2NSZXEtPndwYS5pbmZvWzRdLCAvL09VSSBpcyBub3QgdGFrZW4gY2FyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvY1JlcS0+d3BhLmxlbmd0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRvdDExZklFV1BBKTsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdGhlIGdyb3Vwd2lzZSBhbmQgcGFpcndpc2UgY2lwaGVyIHN1aXRlcyAqLworICAgICAgICAgICAgICAgICAgICBpZihlU0lSX1NVQ0NFU1MgIT0gKHN0YXR1cyA9IGxpbUNoZWNrUnhXUEFJZU1hdGNoKHBNYWMsIERvdDExZklFV1BBLCBwc2Vzc2lvbkVudHJ5LCBwQXNzb2NSZXEtPkhUQ2Fwcy5wcmVzZW50KSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlY2VpdmVkIEFzc29jaWF0aW9uIHJlcSBmcmFtZSB3aXRoIFdQQSBJRSBidXQgbWlzbWF0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRBc3NvY1JzcE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJUeXBlLCAwLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIlJlamVjdGluZyBSZS9Bc3NvYyByZXEgZnJvbSBTVEE6ICIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVjZWl2ZWQgQXNzb2NpYXRpb24gcmVxIGZyYW1lIHdpdGggaW52YWxpZCBXUEEgSUUgKi8KKyAgICAgICAgICAgICAgICAgICAgbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19JTlZBTElEX0lORk9STUFUSU9OX0VMRU1FTlRfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgMCxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIlJlamVjdGluZyBSZS9Bc3NvYyByZXEgZnJvbSBTVEE6ICIpKTsKKyAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0dXKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9LyogZW5kIC0gaWYocEFzc29jUmVxLT53cGEubGVuZ3RoKSAqLworICAgICAgICAgICAgfSAvKiBlbmQgLSBpZihwQXNzb2NSZXEtPndwYVByZXNlbnQpICovCisgICAgICAgIH0gLyogZW5kIG9mIGlmKHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+cHJpdmFjeSAKKyAgICAgICAgICAgICYmIHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+cnNuSUUtPmxlbmd0aCkgKi8KKworICAgIH0gLyogZW5kIG9mICAgICBpZiggISBwQXNzb2NSZXEtPndzY0luZm8ucHJlc2VudCApICovCisjZW5kaWYgLy9XTEFOX1NPRlRBUF9GRUFUVVJFCisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0ICdhc3NvY2lhdGVkJyBjb250ZXh0IGZvciBTVEEsIGlmIGFueS4KKyAgICAgKiBUaGlzIGlzIG1haW50YWluZWQgYnkgRFBIIGFuZCBjcmVhdGVkIGJ5IExJTS4KKyAgICAgKi8KKyAgICBwU3RhRHMgPSBkcGhMb29rdXBIYXNoRW50cnkocE1hYywgcEhkci0+c2EsICZhaWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgIC8vLyBFeHRyYWN0IHByZS1hdXRoIGNvbnRleHQgZm9yIHRoZSBTVEEsIGlmIGFueS4KKyAgICBwU3RhUHJlQXV0aENvbnRleHQgPSBsaW1TZWFyY2hQcmVBdXRoTGlzdChwTWFjLCBwSGRyLT5zYSk7CisKKyAgICBpZiAocFN0YURzID09IE5VTEwpCisgICAgeworICAgICAgICAvLy8gUmVxdWVzdGluZyBTVEEgaXMgbm90IGN1cnJlbnRseSBhc3NvY2lhdGVkCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbU51bU9mQ3VycmVudFNUQXMgPT0gcE1hYy0+bGltLm1heFN0YXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogTWF4aW11bSBudW1iZXIgb2YgU1RBcyB0aGF0IEFQIGNhbiBoYW5kbGUgcmVhY2hlZC4KKyAgICAgICAgICAgICAqIFNlbmQgQXNzb2NpYXRpb24gcmVzcG9uc2UgdG8gcGVlciBNQUMgZW50aXR5CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbVJlamVjdEFzc29jaWF0aW9uKHBNYWMsIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFuaUF1dGhUeXBlKSAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodFNpclJlc3VsdENvZGVzKSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsIHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgLy8vIENoZWNrIGlmIFNUQSBpcyBwcmUtYXV0aGVudGljYXRlZC4KKyAgICAgICAgaWYgKChwU3RhUHJlQXV0aENvbnRleHQgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgIChwU3RhUHJlQXV0aENvbnRleHQgJiYKKyAgICAgICAgICAgICAocFN0YVByZUF1dGhDb250ZXh0LT5tbG1TdGF0ZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNUQSBpcyBub3QgcHJlLWF1dGhlbnRpY2F0ZWQgeWV0IHJlcXVlc3RpbmcKKyAgICAgICAgICAgICAqIFJlL0Fzc29jaWF0aW9uIGJlZm9yZSBBdXRoZW50aWNhdGlvbi4KKyAgICAgICAgICAgICAqIE9SIFNUQSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAqIGFuZCBzZW50IFJlL0Fzc29jaWF0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICAgKiBTZW5kIERlYXV0aGVudGljYXRpb24gZnJhbWUgd2l0aCAncHJpb3IKKyAgICAgICAgICAgICAqIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJyByZWFzb24gY29kZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGltU2VuZERlYXV0aE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19TVEFfTk9UX1BSRV9BVVRIRU5USUNBVEVEX1JFQVNPTiwgLy89OQorICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgaWYgKHN1YlR5cGUgPT0gTElNX0FTU09DKQorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXNzb2MgcmVxIGZyb20gU1RBIHRoYXQgZG9lcyBub3QgaGF2ZSBwcmUtYXV0aCBjb250ZXh0LCBNQUMgYWRkciBpczogXG4iKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBSZUFzc29jIHJlcSBmcm9tIFNUQSB0aGF0IGRvZXMgbm90IGhhdmUgcHJlLWF1dGggY29udGV4dCwgTUFDIGFkZHIgaXM6IFxuIikpOworICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICAvLy8gRGVsZXRlICdwcmUtYXV0aCcgY29udGV4dCBvZiBTVEEKKyAgICAgICAgYXV0aFR5cGUgPSBwU3RhUHJlQXV0aENvbnRleHQtPmF1dGhUeXBlOworICAgICAgICBsaW1EZWxldGVQcmVBdXRoTm9kZShwTWFjLCBwSGRyLT5zYSk7CisKKyAgICAgICAgLy8gQWxsIGlzIHdlbGwuIEFzc2lnbiBBSUQgKGFmdGVyIGVsc2UgcGFydCkKKworICAgIH0gLy8gaWYgKHBTdGFEcyA9PSBOVUxMKQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFNUQSBjb250ZXh0IGRvZXMgZXhpc3QgZm9yIHRoaXMgU1RBCisKKyAgICAgICAgaWYgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJlcXVlc3RpbmcgU1RBIGlzIGluIHNvbWUgJ3RyYW5zaWVudCcgc3RhdGU/CisgICAgICAgICAgICAgKiBJZ25vcmUgdGhlIFJlL0Fzc29jIFJlcSBmcmFtZSBieSBpbmNyZW1lbnRpbmcKKyAgICAgICAgICAgICAqIGRlYnVnIGNvdW50ZXIgJiBsb2dnaW5nIGVycm9yLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoc3ViVHlwZSA9PSBMSU1fQVNTT0MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAKKyNpZmRlZiBXTEFOX0RFQlVHICAgIAorICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtQXNzb2NSZXFEcm9wSW52bGRTdGF0ZSsrOworI2VuZGlmCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJyZWNlaXZlZCBBc3NvYyByZXEgaW4gc3RhdGUgJVggZnJvbSAiKSwgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgIAorI2lmZGVmIFdMQU5fREVCVUcgICAgCisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1OdW1SZWFzc29jUmVxRHJvcEludmxkU3RhdGUrKzsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgicmVjZWl2ZWQgUmVBc3NvYyByZXEgaW4gc3RhdGUgJVggZnJvbSAiKSwgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7CisgICAgICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPRzEsICh0TGltTWxtU3RhdGVzKSBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfSAvLyBpZiAocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNUQSBzZW50IFJlL0Fzc29jaWF0aW9uIFJlcXVlc3QgZnJhbWUgd2hpbGUgYWxyZWFkeSBpbgorICAgICAgICAgKiAnYXNzb2NpYXRlZCcgc3RhdGUuIFVwZGF0ZSBTVEEgY2FwYWJpbGl0aWVzIGFuZAorICAgICAgICAgKiBzZW5kIEFzc29jaWF0aW9uIHJlc3BvbnNlIGZyYW1lIHdpdGggc2FtZSBBSUQKKyAgICAgICAgICovCisKKyAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmNhcGFiaWxpdHlJbmZvID0gcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mbzsKKworICAgICAgICBpZiAocFN0YVByZUF1dGhDb250ZXh0ICYmCisgICAgICAgICAgICAocFN0YVByZUF1dGhDb250ZXh0LT5tbG1TdGF0ZSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBTVEEgaGFzIHRyaWdnZXJlZCBwcmUtYXV0aCBhZ2FpbgorICAgICAgICAgICAgYXV0aFR5cGUgPSBwU3RhUHJlQXV0aENvbnRleHQtPmF1dGhUeXBlOworICAgICAgICAgICAgbGltRGVsZXRlUHJlQXV0aE5vZGUocE1hYywgcEhkci0+c2EpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF1dGhUeXBlID0gcFN0YURzLT5tbG1TdGFDb250ZXh0LmF1dGhUeXBlOworCisgICAgICAgIHVwZGF0ZUNvbnRleHQgPSB0cnVlOworCisgICAgICAgIGlmIChkcGhJbml0U3RhU3RhdGUocE1hYywgcEhkci0+c2EsIGFpZCwgdHJ1ZSwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpID09IE5VTEwpICAgCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IEluaXQgU1RBaWQ9JWRcbiIpLCBhaWQpOworICAgICAgICAgICAgZ290byAgZXJyb3I7CisgICAgICAgIH0KKworCisgICAgICAgIGdvdG8gc2VuZEluZFRvU21lOworICAgIH0gLy8gZW5kIGlmIChsb29rdXAgZm9yIFNUQSBpbiBwZXJTdGFEcyBmYWlscykKKworCisKKyAgICAvLyBjaGVjayBpZiBzdGEgaXMgYWxsb3dlZCBwZXIgUW9TIEFDIHJ1bGVzCisgICAgLy9pZiAocE1hYy0+ZHBoLmdEcGhRb3NFbmFibGVkIHx8IHBNYWMtPmRwaC5nRHBoV21lRW5hYmxlZCkKKyAgICBsaW1HZXRXbWVNb2RlKHBzZXNzaW9uRW50cnksICZ3bWVNb2RlKTsKKyAgICBpZiAoKHFvc01vZGUgPT0gZUhBTF9TRVQpIHx8ICh3bWVNb2RlID09IGVIQUxfU0VUKSkKKyAgICB7CisgICAgICAgIC8vIGZvciBhIHFzdGEsIGNoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgVHJhZmZpYyBzcGVjCisgICAgICAgIC8vIGlzIGFkbWlzc2libGUKKyAgICAgICAgLy8gZm9yIGEgbm9uLXFzdGEgY2hlY2sgaWYgdGhlIHN0YSBjYW4gYmUgYWRtaXR0ZWQKKyAgICAgICAgaWYgKHBBc3NvY1JlcS0+YWRkdHNQcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICB0QU5JX1U4IHRzcGVjSWR4ID0gMDsgLy9pbmRleCBpbiB0aGUgc2NoIHRzcGVjIHRhYmxlLgorICAgICAgICAgICAgaWYgKGxpbUFkbWl0Q29udHJvbEFkZFRTKHBNYWMsIHBIZHItPnNhLCAmKHBBc3NvY1JlcS0+YWRkdHNSZXEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocEFzc29jUmVxLT5xb3NDYXBhYmlsaXR5KSwgMCwgZmFsc2UsIE5VTEwsICZ0c3BlY0lkeCwgcHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiQWRtaXRDb250cm9sOiBUU1BFQyByZWplY3RlZFxuIikpOworICAgICAgICAgICAgICAgIGxpbVNlbmRBc3NvY1JzcE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX1FBUF9OT19CQU5EV0lEVEhfUkVBU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgMCxwc2Vzc2lvbkVudHJ5KTsKKyNpZmRlZiBXTEFOX0RFQlVHICAgIAorICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtQXNzb2NSZXFEcm9wQUNSZWplY3RUUysrOworI2VuZGlmCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsaW1BZG1pdENvbnRyb2xBZGRTdGEocE1hYywgcEhkci0+c2EsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiQWRtaXRDb250cm9sOiBTdGEgcmVqZWN0ZWRcbiIpKTsKKyAgICAgICAgICAgIGxpbVNlbmRBc3NvY1JzcE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfUUFQX05PX0JBTkRXSURUSF9SRUFTT04sCisgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICBzdWJUeXBlLCAwLHBzZXNzaW9uRW50cnkpOworI2lmZGVmIFdMQU5fREVCVUcgICAgCisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU51bUFzc29jUmVxRHJvcEFDUmVqZWN0U3RhKys7CisjZW5kaWYKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICAvLyBlbHNlIGFsbCBvaworICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkFkbWl0Q29udHJvbDogU3RhIE9LIVxuIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNUQSBpcyBBc3NvY2lhdGVkICEKKyAgICAgKi8KKyAgICBpZiAoc3ViVHlwZSA9PSBMSU1fQVNTT0MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgicmVjZWl2ZWQgQXNzb2MgcmVxIHN1Y2Nlc3NmdWwgZnJvbSAiKSk7CisgICAgZWxzZQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoInJlY2VpdmVkIFJlQXNzb2MgcmVxIHN1Y2Nlc3NmdWwgZnJvbSAiKSk7CisgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTsKKworICAgIC8qKgorICAgICAqIEFzc2lnbiB1bnVzZWQvbGVhc3QgcmVjZW50bHkgdXNlZCBBSUQgZnJvbSBwZXJTdGFEcy4KKyAgICAgKiBUaGlzIHdpbGwgMTItYml0IFNUQWlkIHVzZWQgYnkgTUFDIEhXLgorICAgICAqIE5PVEU6IGxpbUFzc2lnbkFJRCgpIGFzc2lnbnMgQUlEIHZhbHVlcyByYW5naW5nIGJldHdlZW4gMSAtIDI1NQorICAgICAqLworCisgICAgYWlkID0gbGltQXNzaWduQUlEKHBNYWMpOworCisgICAgaWYgKCFhaWQpCisgICAgeworICAgICAgICAvLyBDb3VsZCBub3QgYXNzaWduIEFJRAorICAgICAgICAvLyBSZWplY3QgYXNzb2NpYXRpb24KKyAgICAgICAgbGltUmVqZWN0QXNzb2NpYXRpb24ocE1hYywgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlR5cGUsIHRydWUsIGF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodFNpclJlc3VsdENvZGVzKSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsIHBzZXNzaW9uRW50cnkpOworCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGVudHJ5IHRvIGhhc2ggdGFibGUgbWFpbnRhaW5lZCBieSBEUEggbW9kdWxlCisgICAgICovCisKKyAgICBwU3RhRHMgPSBkcGhBZGRIYXNoRW50cnkocE1hYywgcEhkci0+c2EsIGFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisgICAgaWYgKHBTdGFEcyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gQ291bGQgbm90IGFkZCBoYXNoIHRhYmxlIGVudHJ5IGF0IERQSAorICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgRkwoImNvdWxkIG5vdCBhZGQgaGFzaCBlbnRyeSBhdCBEUEggZm9yIGFpZD0lZCwgTWFjQWRkcjpcbiIpLAorICAgICAgICAgICBhaWQpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPR0UpOworCisgICAgICAgIC8vIFJlbGVhc2UgQUlECisgICAgICAgIGxpbVJlbGVhc2VBSUQocE1hYywgYWlkKTsKKworICAgICAgICBsaW1SZWplY3RBc3NvY2lhdGlvbihwTWFjLCBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgdHJ1ZSwgYXV0aFR5cGUsIGFpZCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0U2lyUmVzdWx0Q29kZXMpIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKworc2VuZEluZFRvU21lOgorCisgICAgcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSA9IHBBc3NvY1JlcTsKKworICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkgPSBwQXNzb2NSZXEtPkhUQ2Fwcy5wcmVzZW50OworICAgIHBTdGFEcy0+cW9zLmFkZHRzUHJlc2VudCA9IChwQXNzb2NSZXEtPmFkZHRzUHJlc2VudD09MCkgPyBmYWxzZSA6IHRydWU7CisgICAgcFN0YURzLT5xb3MuYWRkdHMgICAgICAgID0gcEFzc29jUmVxLT5hZGR0c1JlcTsKKyAgICBwU3RhRHMtPnFvcy5jYXBhYmlsaXR5ICAgPSBwQXNzb2NSZXEtPnFvc0NhcGFiaWxpdHk7CisgICAgcFN0YURzLT52ZXJzaW9uUHJlc2VudCAgID0gMDsKKyAgICAvKiBzaG9ydCBzbG90IGFuZCBzaG9ydCBwcmVhbWJsZSBzaG91bGQgYmUgdXBkYXRlZCBiZWZvcmUgZG9pbmcgbGltYWRkc3RhICovCisgICAgcFN0YURzLT5zaG9ydFByZWFtYmxlRW5hYmxlZCA9ICh0QU5JX1U4KXBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZTsKKyAgICBwU3RhRHMtPnNob3J0U2xvdFRpbWVFbmFibGVkID0gKHRBTklfVTgpcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5zaG9ydFNsb3RUaW1lOworIAorICAgIGlmIChwQXNzb2NSZXEtPnByb3BJRWluZm8udmVyc2lvblByZXNlbnQpIC8vdXBkYXRlIFNUQSB2ZXJzaW9uIGluZm8KKyAgICB7CisgICAgICAgIHBTdGFEcy0+dmVyc2lvblByZXNlbnQgPSAxOworICAgICAgICBwU3RhRHMtPnZlcnNpb24gPSBwQXNzb2NSZXEtPnByb3BJRWluZm8udmVyc2lvbjsKKyAgICB9CisgICAgcFN0YURzLT5wcm9wQ2FwYWJpbGl0eSA9IDA7CisgICAgaWYgKHBBc3NvY1JlcS0+cHJvcElFaW5mby5jYXBhYmlsaXR5UHJlc2VudCkKKyAgICB7CisgICAgICAgIGlmIChzaXJHZXRDZmdQcm9wQ2FwcyhwTWFjLCAmcFN0YURzLT5wcm9wQ2FwYWJpbGl0eSkpCisgICAgICAgICAgICBwU3RhRHMtPnByb3BDYXBhYmlsaXR5ICY9IHBBc3NvY1JlcS0+cHJvcElFaW5mby5jYXBhYmlsaXR5OworICAgIH0KKworICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FTU09DX0NORl9TVEFURTsKKyAgICBwU3RhRHMtPnZhbGlkICAgICAgICAgICAgICAgICAgPSAwOworICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSA9IGF1dGhUeXBlOworICAgIHBTdGFEcy0+c3RhVHlwZSA9IFNUQV9FTlRSWV9QRUVSOworCisgICAgLy9UT0RPOiBJZiBsaXN0ZW4gaW50ZXJ2YWwgaXMgbW9yZSB0aGFuIGNlcnRhaW4gbGltaXQsIHJlamVjdCB0aGUgYXNzb2NpYXRpb24uCisgICAgLy9OZWVkIHRvIGNoZWNrIGN1c3RvbWVyIHJlcXVpcmVtZW50cyBhbmQgdGhlbiBpbXBsZW1lbnQuCisgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lmxpc3RlbkludGVydmFsID0gcEFzc29jUmVxLT5saXN0ZW5JbnRlcnZhbDsKKyAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2FwYWJpbGl0eUluZm8gPSBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvOworCisgICAgLyogVGhlIGZvbGxvd2luZyBjb3VudCB3aWxsIGJlIHVzZWQgdG8ga25vY2stb2ZmIHRoZSBzdGF0aW9uIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiBjb21lIGJhY2sgdG8gcmVjZWl2ZSB0aGUgYnVmZmVyZWQgZGF0YS4gVGhlIEFQIHdpbGwgd2FpdCBmb3IgbnVtVGltU2VudCBudW1iZXIKKyAgICAgKiBvZiBiZWFjb25zIGFmdGVyIHNlbmRpbmcgVElNIGluZm9ybWF0aW9uIGZvciB0aGUgc3RhdGlvbiwgYmVmb3JlIGFzc3VtaW5nIHRoYXQgCisgICAgICogdGhlIHN0YXRpb24gaXMgbm8gbW9yZSBhc3NvY2lhdGVkIGFuZCBkaXNhc3NvY2lhdGVzIGl0CisgICAgICovCisKKyAgICAvKiogdGltV2FpdENvdW50IGlzIHVzZWQgYnkgUE1NIGZvciBtb25pdG9yaW5nIHRoZSBTVEEncyBpbiBQUyBmb3IgTElOSyovCisgICAgcFN0YURzLT50aW1XYWl0Q291bnQgPSAodEFOSV9VOClHRVRfVElNX1dBSVRfQ09VTlQocEFzc29jUmVxLT5saXN0ZW5JbnRlcnZhbCk7CisgICAgCisgICAgLyoqIEluaXRpYWxpc2UgdGhlIEN1cnJlbnQgc3VjY2Vzc2Z1bCBNUERVJ3MgdHJhbmZlcmVkIHRvIHRoaXMgU1RBIGNvdW50IGFzIDAgKi8KKyAgICBwU3RhRHMtPmN1clR4TXBkdUNudCA9IDA7CisKKyAgICBpZihJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSkgJiYKKyAgICAgIChwQXNzb2NSZXEtPkhUQ2Fwcy5wcmVzZW50KSkKKyAgICB7CisgICAgICAgIHBTdGFEcy0+aHRHcmVlbmZpZWxkID0gKHRBTklfVTgpcEFzc29jUmVxLT5IVENhcHMuZ3JlZW5GaWVsZDsKKyAgICAgICAgcFN0YURzLT5odEFNcGR1RGVuc2l0eSA9IHBBc3NvY1JlcS0+SFRDYXBzLm1wZHVEZW5zaXR5OworICAgICAgICBwU3RhRHMtPmh0RHNzc0Nja1JhdGU0ME1IelN1cHBvcnQgPSAodEFOSV9VOClwQXNzb2NSZXEtPkhUQ2Fwcy5kc3NzQ2NrTW9kZTQwTUh6OworICAgICAgICBwU3RhRHMtPmh0THNpZ1RYT1BQcm90ZWN0aW9uID0gKHRBTklfVTgpcEFzc29jUmVxLT5IVENhcHMubHNpZ1RYT1BQcm90ZWN0aW9uOworICAgICAgICBwU3RhRHMtPmh0TWF4QW1zZHVMZW5ndGggPSAodEFOSV9VOClwQXNzb2NSZXEtPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplOworICAgICAgICBwU3RhRHMtPmh0TWF4UnhBTXBkdUZhY3RvciA9IHBBc3NvY1JlcS0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3I7CisgICAgICAgIHBTdGFEcy0+aHRNSU1PUFNTdGF0ZSA9IHBBc3NvY1JlcS0+SFRDYXBzLm1pbW9Qb3dlclNhdmU7CisgICAgICAgIHBTdGFEcy0+aHRTaG9ydEdJMjBNaHogPSAodEFOSV9VOClwQXNzb2NSZXEtPkhUQ2Fwcy5zaG9ydEdJMjBNSHo7CisgICAgICAgIHBTdGFEcy0+aHRTaG9ydEdJNDBNaHogPSAodEFOSV9VOClwQXNzb2NSZXEtPkhUQ2Fwcy5zaG9ydEdJNDBNSHo7CisgICAgICAgIHBTdGFEcy0+aHRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPSAodEFOSV9VOClwQXNzb2NSZXEtPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisgICAgICAgIHBTdGFEcy0+YmFQb2xpY3lGbGFnID0gMHhGRjsKKyAgICB9CisKKworCisgICAgaWYgKGxpbVBvcHVsYXRlTWF0Y2hpbmdSYXRlU2V0KHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwQXNzb2NSZXEtPnN1cHBvcnRlZFJhdGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwQXNzb2NSZXEtPmV4dGVuZGVkUmF0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEtPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocEFzc29jUmVxLT5wcm9wSUVpbmZvLnByb3BSYXRlcyksIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8vIENvdWxkIG5vdCB1cGRhdGUgaGFzaCB0YWJsZSBlbnRyeSBhdCBEUEggd2l0aCByYXRlc2V0CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICBGTCgiY291bGQgbm90IHVwZGF0ZSBoYXNoIGVudHJ5IGF0IERQSCBmb3IgYWlkPSVkLCBNYWNBZGRyOlxuIiksCisgICAgICAgICAgIGFpZCk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HRSk7CisKKyAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIEFJRAorICAgICAgICBsaW1SZWxlYXNlQUlEKHBNYWMsIGFpZCk7CisKKworICAgICAgICBsaW1SZWplY3RBc3NvY2lhdGlvbihwTWFjLCBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVHlwZSwgdHJ1ZSwgYXV0aFR5cGUsIGFpZCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAvKnJldHVybiBpdCBmcm9tIGhlcmUgcmF0aGVyIHRoYW4gZ290byBlcnJvciBzdGF0ZW1lbnQuVGhpcyBpcyBkb25lIGFzIHRoZSBtZW1vcnkgaXMgZ2V0dGluZyBmcmVlIHR3aWNlKi8KKyAgICAgICAgcmV0dXJuOworICAgICAgICAvL2dvdG8gZXJyb3I7CisgICAgfQorCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBTdGFEcy0+bWxtU3RhQ29udGV4dC5wcm9wUmF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICYocEFzc29jUmVxLT5wcm9wSUVpbmZvLnByb3BSYXRlcyksCisgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEtPnByb3BJRWluZm8ucHJvcFJhdGVzLm51bVByb3BSYXRlcyArIDEpOworCisgICAgLy8vIEFkZCBTVEEgY29udGV4dCBhdCBNQUMgSFcgKEJNVSwgUkhQICYgVEZQKQorCisgICAgcFN0YURzLT5xb3NNb2RlICAgID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHBTdGFEcy0+bGxlRW5hYmxlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBpZiAocEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5xb3MgJiYgKHFvc01vZGUgPT0gZUhBTF9TRVQpKQorICAgIHsKKyAgICAgICAgcFN0YURzLT5sbGVFbmFibGVkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIHBTdGFEcy0+cW9zTW9kZSAgICA9IGVBTklfQk9PTEVBTl9UUlVFOyAKKyAgICB9CisKKyAgICBwU3RhRHMtPndtZUVuYWJsZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgcFN0YURzLT53c21FbmFibGVkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGxpbUdldFdtZU1vZGUocHNlc3Npb25FbnRyeSwgJndtZU1vZGUpOworICAgIC8vaWYgKCghIHBTdGFEcy0+bGxlRW5hYmxlZCkgJiYgYXNzb2Mud21lSW5mb1ByZXNlbnQgJiYgcE1hYy0+ZHBoLmdEcGhXbWVFbmFibGVkKQorICAgIGlmICgoISBwU3RhRHMtPmxsZUVuYWJsZWQpICYmIHBBc3NvY1JlcS0+d21lSW5mb1ByZXNlbnQgJiYgKHdtZU1vZGUgPT0gZUhBTF9TRVQpKQorICAgIHsKKyAgICAgICAgcFN0YURzLT53bWVFbmFibGVkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIHBTdGFEcy0+cW9zTW9kZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICBsaW1HZXRXc21Nb2RlKHBzZXNzaW9uRW50cnksICZ3c21Nb2RlKTsKKyAgICAgICAgLyogV01NX0FQU0QgLSBXTU1fU0EgcmVsYXRlZCBwcm9jZXNzaW5nIHNob3VsZCBiZSBzZXBhcmF0ZTsgV01NX1NBIGFuZCBXTU1fQVBTRAorICAgICAgICAgY2FuIGNvZXhpc3QgKi8KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGlmKCBwQXNzb2NSZXEtPldNTUluZm9TdGF0aW9uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgQVAgc3VwcG9ydHMgb3Igbm90ICovCisgICAgICAgICAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICAgICAgICAgICAmJiAocHNlc3Npb25FbnRyeS0+YXBVYXBzZEVuYWJsZSA9PSAwKSAmJiAocEFzc29jUmVxLT5XTU1JbmZvU3RhdGlvbi5hY2JlX3VhcHNkIAorICAgICAgICAgICAgICAgICAgICB8fCBwQXNzb2NSZXEtPldNTUluZm9TdGF0aW9uLmFjYmtfdWFwc2QgCisgICAgICAgICAgICAgICAgICAgIHx8IHBBc3NvY1JlcS0+V01NSW5mb1N0YXRpb24uYWN2b191YXBzZCAKKyAgICAgICAgICAgICAgICAgICAgfHwgcEFzc29jUmVxLT5XTU1JbmZvU3RhdGlvbi5hY3ZpX3VhcHNkKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFJlY2VpdmVkIFJlL0Fzc29jaWF0aW9uIFJlcXVlc3QgZnJvbQorICAgICAgICAgICAgICAgICAqIFNUQSB3aGVuIFVQQVNEIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIkFQIGRvIG5vdCBzdXBwb3J0IFVQQVNEIFJFQVNTT0MgRmFpbGVkXG4iICkpOworICAgICAgICAgICAgICAgIGxpbVJlamVjdEFzc29jaWF0aW9uKHBNYWMsIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlR5cGUsIHRydWUsIGF1dGhUeXBlLCBhaWQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9NQUNfV01FX1JFRlVTRURfU1RBVFVTLCBwc2Vzc2lvbkVudHJ5KTsKKworCisgICAgICAgICAgICAgICAgLypyZXR1cm4gaXQgZnJvbSBoZXJlIHJhdGhlciB0aGFuIGdvdG8gZXJyb3Igc3RhdGVtZW50LlRoaXMgaXMgZG9uZSBhcyB0aGUgbWVtb3J5IGlzIGdldHRpbmcgZnJlZSB0d2ljZSBpbiB0aGlzIHVhcHNkIHNjZW5hcmlvKi8KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgLy9nb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBVQVBTRCBhbmQgc2VuZCBpdCB0byBMSU0gdG8gYWRkIFNUQSAqLworICAgICAgICAgICAgICAgIHBTdGFEcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mby5hY2JlX3VhcHNkID0gcEFzc29jUmVxLT5XTU1JbmZvU3RhdGlvbi5hY2JlX3VhcHNkOworICAgICAgICAgICAgICAgIHBTdGFEcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mby5hY2JrX3VhcHNkID0gcEFzc29jUmVxLT5XTU1JbmZvU3RhdGlvbi5hY2JrX3VhcHNkOworICAgICAgICAgICAgICAgIHBTdGFEcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mby5hY3ZvX3VhcHNkID0gcEFzc29jUmVxLT5XTU1JbmZvU3RhdGlvbi5hY3ZvX3VhcHNkOworICAgICAgICAgICAgICAgIHBTdGFEcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mby5hY3ZpX3VhcHNkID0gcEFzc29jUmVxLT5XTU1JbmZvU3RhdGlvbi5hY3ZpX3VhcHNkOworICAgICAgICAgICAgICAgIHBTdGFEcy0+cW9zLmNhcGFiaWxpdHkucW9zSW5mby5tYXhTcExlbiA9IHBBc3NvY1JlcS0+V01NSW5mb1N0YXRpb24ubWF4X3NwX2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8vaWYgKGFzc29jLndzbUNhcGFibGVQcmVzZW50ICYmIHBNYWMtPmRwaC5nRHBoV3NtRW5hYmxlZCkKKyAgICAgICAgaWYgKHBBc3NvY1JlcS0+d3NtQ2FwYWJsZVByZXNlbnQgJiYgKHdzbU1vZGUgPT0gZUhBTF9TRVQpKQorICAgICAgICAgICAgcFN0YURzLT53c21FbmFibGVkID0gZUFOSV9CT09MRUFOX1RSVUU7CisKKyAgICB9CisKKyAgICAvLyBSZS9Bc3NvYyBSZXNwb25zZSBmcmFtZSB0byByZXF1ZXN0aW5nIFNUQQorICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlID0gc3ViVHlwZTsKKworICAgIGlmIChwQXNzb2NSZXEtPnByb3BJRWluZm8uYW5pSW5kaWNhdG9yKQorICAgICAgICBwU3RhRHMtPmFuaVBlZXIgPSAxOworCisgICAgLy8gQlRBTVA6IFN0b3JpbmcgdGhlIHBhcnNlZCBhc3NvYyByZXF1ZXN0IGluIHRoZSBwc2Vzc2lvbkVudHJ5IGFycmF5CisgICAgcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSA9IHBBc3NvY1JlcTsKKworICAgIC8qIEJUQU1QOiBJZiBTVEEgY29udGV4dCBhbHJlYWR5IGV4aXN0IChpZS4gdXBkYXRlQ29udGV4dCA9IDEpICAKKyAgICAgKiBmb3IgdGhpcyBTVEEsIHRoZW4gd2Ugc2hvdWxkIGRlbGV0ZSB0aGUgb2xkIG9uZSwgYW5kIGFkZCAKKyAgICAgKiB0aGUgbmV3IFNUQS4gVGhpcyBpcyB0YWtlbiBjYXJlIG9mIGluIHRoZSBsaW1EZWxTdGEoKSByb3V0aW5lLiAgIAorICAgICAqCisgICAgICogUHJpb3IgdG8gQlRBTVAsIHdlIHdlcmUgc2V0dGluZyB0aGlzIGZsYWcgc28gdGhhdCB3aGVuCisgICAgICogUEUgcmVjZWl2ZXMgU01FX0FTU09DX0NORiwgYW5kIGlmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZW4gCisgICAgICogUEUgc2hhbGwgZGVsZXRlIHRoZSBvbGQgc3RhdGlvbiBhbmQgdGhlbiBhZGQuIEJ1dCBub3cgaW4KKyAgICAgKiBCVEFNUCwgd2UncmUgZGlyZWN0bHkgYWRkaW5nIHN0YXRpb24gYmVmb3JlIHdhaXRpbmcgZm9yCisgICAgICogU01FX0FTU09DX0NORiwgc28gd2UgY2FuIGRvIHRoaXMgbm93LiAgCisgICAgICovCisgICAgaWYgKCF1cGRhdGVDb250ZXh0KQorICAgIHsKKyAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnVwZGF0ZUNvbnRleHQgPSAwOworCisgICAgICAgIC8vIEJUQU1QOiBBZGQgU1RBIGNvbnRleHQgYXQgSFcgLSBpc3N1ZSBXREFfQUREX1NUQV9SRVEgdG8gSEFMCisgICAgICAgIGlmIChsaW1BZGRTdGEocE1hYywgcFN0YURzLHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgQWRkIFNUQSB3aXRoIGFzc29jSWQ9JWRcbiIpLCBwU3RhRHMtPmFzc29jSWQpOworICAgICAgICAgICAgbGltUmVqZWN0QXNzb2NpYXRpb24oIHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgcFN0YURzLT5tbG1TdGFDb250ZXh0LmF1dGhUeXBlLCBwU3RhRHMtPmFzc29jSWQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgLypyZXR1cm4gaXQgZnJvbSBoZXJlIHJhdGhlciB0aGFuIGdvdG8gZXJyb3Igc3RhdGVtZW50LlRoaXMgaXMgZG9uZSBhcyB0aGUgbWVtb3J5IGlzIGdldHRpbmcgZnJlZSB0d2ljZSovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAvL2dvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnVwZGF0ZUNvbnRleHQgPSAxOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBtbG1QcmV2U3RhdGUgPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGU7CisKKyAgICAgICAgLyogQXMgcGVyIHRoZSBIQUwvRlcgbmVlZHMgdGhlIHJlYXNzb2MgcmVxIG5lZWQgbm90IGJlIGNhbGxpbmcgbGltRGVsU3RhICovCisgICAgICAgIGlmKHN1YlR5cGUgIT0gTElNX1JFQVNTT0MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2UgbmVlZCB0byBzZXQgdGhlIG1sbVN0YXRlIGhlcmUgaW4gb3JkZXIgZGlmZmVyZW50aWF0ZSBpbiBsaW1EZWxTdGEuCisgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPSBlTElNX01MTV9XVF9BU1NPQ19ERUxfU1RBX1JTUF9TVEFURTsKKyAgICAgICAgICAgIGlmKGxpbURlbFN0YShwTWFjLCBwU3RhRHMsIHRydWUsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCBERUwgU1RBIHdpdGggYXNzb2NJZD0lZCBzdGFJZCAlZFxuIiksIHBTdGFEcy0+YXNzb2NJZCwgcFN0YURzLT5zdGFJbmRleCk7CisgICAgICAgICAgICAgICAgbGltUmVqZWN0QXNzb2NpYXRpb24oIHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsIHRydWUsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkLCB0cnVlLCh0U2lyUmVzdWx0Q29kZXMpIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAvL1Jlc3RvcmluZyB0aGUgc3RhdGUgYmFjay4KKyAgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPSBtbG1QcmV2U3RhdGU7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG1sbVN0YXRlIGlzIGNoYW5nZWQgaW4gbGltQWRkU3RhIGNvbnRleHQgKi8KKyAgICAgICAgICAgIC8qIHVzZSB0aGUgc2FtZSBBSUQsIGFscmVhZHkgYWxsb2NhdGVkICovCisgICAgICAgICAgICBpZiAobGltQWRkU3RhKHBNYWMsIHBTdGFEcyxwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJBUCBkbyBub3Qgc3VwcG9ydCBVUEFTRCBSRUFTU09DIEZhaWxlZFxuIiApKTsKKyAgICAgICAgICAgICAgICAgICAgbGltUmVqZWN0QXNzb2NpYXRpb24oIHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsIHRydWUsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+YXNzb2NJZCwgdHJ1ZSwodFNpclJlc3VsdENvZGVzKSBlU0lSX01BQ19XTUVfUkVGVVNFRF9TVEFUVVMsIHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgIC8vUmVzdG9yaW5nIHRoZSBzdGF0ZSBiYWNrLgorICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPSBtbG1QcmV2U3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICB9CisKKyAgICByZXR1cm47CisKK2Vycm9yOgorICAgIGlmIChwQXNzb2NSZXEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmICggcEFzc29jUmVxLT5hc3NvY1JlcUZyYW1lICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEFzc29jUmVxLT5hc3NvY1JlcUZyYW1lKTsKKyAgICAgICAgICAgIHBBc3NvY1JlcS0+YXNzb2NSZXFGcmFtZSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQXNzb2NSZXEpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpIAorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlBhbEZyZWUgTWVtb3J5IGZhaWxlZCBcbiIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHBTdGFEcyE9IE5VTEwpCisgICAgICAgIHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGFEcy0+YXNzb2NJZF0gPSBOVUxMOworICAgIHJldHVybjsKKworfSAvKioqIGVuZCBsaW1Qcm9jZXNzQXNzb2NSZXFGcmFtZSgpICoqKi8KKworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBsaW1TZW5kTWxtQXNzb2NJbmQKK1xicmllZiAgVGhpcyBmdW5jdGlvbiBzZW5kcyBlaXRoZXIgTElNX01MTV9BU1NPQ19JTkQgIAorXCAgICAgICBvciBMSU1fTUxNX1JFQVNTT0NfSU5EIHRvIFNNRS4KK1wKK1xwYXJhbSAgcE1hYworXHBhcmFtICAqcFN0YURzIC0gU3RhdGlvbiBEUEggaGFzaCBlbnRyeQorXHBhcmFtICBwc2Vzc2lvbkVudHJ5IC0gUEUgc2Vzc2lvbiBlbnRyeQorXHJldHVybiBOb25lCisKKyAqID8/Pz8/PyBIb3cgZG8gSSBnZXQgCisgKiAgLSBzdWJ0eXBlICAgPT09PT0+IHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxLnJlYXNzb2NSZXF1ZXN0CisgKiAgLSBhaWQgICAgICAgPT09PT0+IHBTdGFEcy0+YXNzb2NJZAorICogIC0gcEhkci0+c2EgID09PT09PiBwU3RhRHMtPnN0YUFkZHIKKyAqICAtIGF1dGhUeXBlCisgKiAgLSBwSGRyLT5zZXFDb250cm9sICA9PT09PT4gbm8gbG9uZ2VyIG5lZWRlZAorICogIC0gcFN0YURzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBsaW1TZW5kTWxtQXNzb2NJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhRHMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdHBMaW1NbG1Bc3NvY0luZCAgICAgICAgcE1sbUFzc29jSW5kID0gTlVMTDsKKyAgICB0cExpbU1sbVJlYXNzb2NJbmQgICAgICBwTWxtUmVhc3NvY0luZDsKKyAgICB0cFNpckFzc29jUmVxICAgICAgICAgICBwQXNzb2NSZXE7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgdGVtcDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBwaHlNb2RlOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHN1YlR5cGU7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHRBTklfVTggICAgICAgICAgICAgICAgICp3cHNJZSA9IE5VTEw7CisjZW5kaWYKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICB0bXA7CisvLyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOyAgICAKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBpLCBqPTA7CisKKyAgICAvLyBHZXQgYSBjb3B5IG9mIHRoZSBhbHJlYWR5IHBhcnNlZCBBc3NvYyBSZXF1ZXN0CisgICAgcEFzc29jUmVxID0gKHRwU2lyQXNzb2NSZXEpIHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGFEcy0+YXNzb2NJZF07CisKKyAgICAvLyBHZXQgdGhlIHBoeU1vZGUKKyAgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKyAKKyAgICAvLyBFeHRyYWN0IHByZS1hdXRoIGNvbnRleHQgZm9yIHRoZSBwZWVyIEJUQU1QLVNUQSwgaWYgYW55LgorIAorICAgIC8vIERldGVybWlpbmUgaWYgaXRzIEFzc29jIG9yIFJlQXNzb2MgUmVxdWVzdAorICAgIGlmIChwQXNzb2NSZXEtPnJlYXNzb2NSZXF1ZXN0ID09IDEpCisgICAgICAgIHN1YlR5cGUgPSBMSU1fUkVBU1NPQzsKKyAgICBlbHNlIAorICAgICAgICBzdWJUeXBlID0gTElNX0FTU09DOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBpZiAoc3ViVHlwZSA9PSBMSU1fQVNTT0MgfHwgc3ViVHlwZSA9PSBMSU1fUkVBU1NPQykKKyNlbHNlCisgICAgaWYgKHN1YlR5cGUgPT0gTElNX0FTU09DICkKKyNlbmRpZgorICAgIHsKKyAgICAgICAgdGVtcCAgPSBzaXplb2YodExpbU1sbUFzc29jSW5kKTsKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSAgICAgICAgCisgICAgICAgIHRlbXAgKz0gcEFzc29jUmVxLT5wcm9wSUVpbmZvLm51bUJzcyAqIHNpemVvZih0U2lyTmVpZ2hib3JCc3NJbmZvKTsKKyNlbmRpZiAgICAgICAgCisKKyAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTWxtQXNzb2NJbmQsIHRlbXApKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1SZWxlYXNlQUlEKHBNYWMsIHBTdGFEcy0+YXNzb2NJZCk7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcE1sbUFzc29jSW5kXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgcE1sbUFzc29jSW5kLCB0ZW1wKTsKKworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCh0QU5JX1U4ICopcE1sbUFzc29jSW5kLT5wZWVyTWFjQWRkciwodEFOSV9VOCAqKXBTdGFEcy0+c3RhQWRkcixzaXplb2YodFNpck1hY0FkZHIpKTsKKyAKKyAgICAgICAgcE1sbUFzc29jSW5kLT5haWQgICAgPSBwU3RhRHMtPmFzc29jSWQ7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopJnBNbG1Bc3NvY0luZC0+c3NJZCwodEFOSV9VOCAqKSYocEFzc29jUmVxLT5zc0lkKSwgcEFzc29jUmVxLT5zc0lkLmxlbmd0aCArIDEpOworICAgICAgICBwTWxtQXNzb2NJbmQtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgICAgICBwTWxtQXNzb2NJbmQtPmF1dGhUeXBlID0gIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZTsKKyAKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgICAgICAvLyBOb3RlIGZvciBCVEFNUDogbm8gbmVlZCB0byBmaWxsIGluIHBNbG1Bc3NvY0luZC0+c2VxTnVtCisgICAgICAgIHBNbG1Bc3NvY0luZC0+d25pSW5kaWNhdG9yID0gKHRBbmlCb29sKSBwQXNzb2NSZXEtPnByb3BJRWluZm8uYW5pSW5kaWNhdG9yOworICAgICAgICBwTWxtQXNzb2NJbmQtPmJwSW5kaWNhdG9yICA9ICh0QW5pQm9vbCkgcEFzc29jUmVxLT5wcm9wSUVpbmZvLmJwSW5kaWNhdG9yOworICAgICAgICBwTWxtQXNzb2NJbmQtPmJwVHlwZSAgICAgICA9ICh0U2lyQnBJbmRpY2F0b3JUeXBlKSBwQXNzb2NSZXEtPnByb3BJRWluZm8uYnBUeXBlOworICAgICAgICBpZiAocEFzc29jUmVxLT5leHRlbmRlZFJhdGVzUHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgcE1sbUFzc29jSW5kLT5ud1R5cGUgPSBlU0lSXzExR19OV19UWVBFOworICAgICAgICAgICAgbGltU2V0U3RhSGFzaEVycE1vZGUocE1hYywgcFN0YURzLT5hc3NvY0lkLCBlSEFMX1NFVCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExQSkKKyAgICAgICAgICAgICAgICBwTWxtQXNzb2NJbmQtPm53VHlwZSA9IGVTSVJfMTFBX05XX1RZUEU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE1sbUFzc29jSW5kLT5ud1R5cGUgPSBlU0lSXzExQl9OV19UWVBFOworICAgICAgICAgICAgICAgIGxpbVNldFN0YUhhc2hFcnBNb2RlKHBNYWMsIHBTdGFEcy0+YXNzb2NJZCwgZUhBTF9DTEVBUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcE1sbUFzc29jSW5kLT5hc3NvY1R5cGUgPSAodFNpckFzc29jVHlwZSlwQXNzb2NSZXEtPnByb3BJRWluZm8uYXNzb2NUeXBlOworICAgICAgICBwTWxtQXNzb2NJbmQtPmxvYWQubnVtU3RhcyA9IHBNYWMtPmxpbS5nTGltTnVtT2ZDdXJyZW50U1RBczsKKyAgICAgICAgcE1sbUFzc29jSW5kLT5sb2FkLmNoYW5uZWxVdGlsaXphdGlvbiA9KHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhKSA/IHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5hdmdDaGFubmVsVXRpbGl6YXRpb24gOiAwOworICAgICAgICBwTWxtQXNzb2NJbmQtPm51bUJzcyA9ICh0QU5JX1UzMikgcEFzc29jUmVxLT5wcm9wSUVpbmZvLm51bUJzczsKKyAgICAgICAgaWYgKHBBc3NvY1JlcS0+cHJvcElFaW5mby5udW1Cc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsKHRBTklfVTggKikgcE1sbUFzc29jSW5kLT5uZWlnaGJvckxpc3QsKHRBTklfVTggKilwQXNzb2NSZXEtPnByb3BJRWluZm8ucEJzc0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHRTaXJOZWlnaGJvckJzc0luZm8pICogcEFzc29jUmVxLT5wcm9wSUVpbmZvLm51bUJzcykpOworICAgICAgICB9IAorI2VuZGlmCisgICAgICAgIHBNbG1Bc3NvY0luZC0+Y2FwYWJpbGl0eUluZm8gPSBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvOworCisgICAgICAgIC8vIEZpbGwgaW4gUlNOIElFIGluZm9ybWF0aW9uCisgICAgICAgIHBNbG1Bc3NvY0luZC0+cnNuSUUubGVuZ3RoID0gMDsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIC8vIGlmIFdQUyBJRSBpcyBwcmVzZW50LCBpZ25vcmUgUlNOIElFCisgICAgICAgIGlmIChwQXNzb2NSZXEtPmFkZElFUHJlc2VudCAmJiBwQXNzb2NSZXEtPmFkZElFLmxlbmd0aCApIHsKKyAgICAgICAgICAgIHdwc0llID0gbGltR2V0V3NjSUVQdHIocE1hYywgcEFzc29jUmVxLT5hZGRJRS5hZGRJRWRhdGEsIHBBc3NvY1JlcS0+YWRkSUUubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocEFzc29jUmVxLT5yc25QcmVzZW50ICYmIChOVUxMID09IHdwc0llKSkKKyNlbHNlCisgICAgICAgIGlmIChwQXNzb2NSZXEtPnJzblByZXNlbnQpCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzIsIEZMKCJBc3NvYyBSZXEgUlNOIElFIGxlbiA9ICVkXG4iKSwgcEFzc29jUmVxLT5yc24ubGVuZ3RoKTsKKyAgICAgICAgICAgIHBNbG1Bc3NvY0luZC0+cnNuSUUubGVuZ3RoID0gMiArIHBBc3NvY1JlcS0+cnNuLmxlbmd0aDsKKyAgICAgICAgICAgIHBNbG1Bc3NvY0luZC0+cnNuSUUucnNuSUVkYXRhWzBdID0gU0lSX01BQ19SU05fRUlEOworICAgICAgICAgICAgcE1sbUFzc29jSW5kLT5yc25JRS5yc25JRWRhdGFbMV0gPSBwQXNzb2NSZXEtPnJzbi5sZW5ndGg7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTWxtQXNzb2NJbmQtPnJzbklFLnJzbklFZGF0YVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvY1JlcS0+cnNuLmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEtPnJzbi5sZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLy9GSVhNRTogd2UgbmVlZCB0byBoYXZlIHRoZSBjYiBpbmZvcm1hdGlvbiBzZXByYXRlZCBiZXR3ZWVuIEhUIGFuZCBUaXRhbiBsYXRlci4gCisgICAgICAgIGlmKHBBc3NvY1JlcS0+SFRDYXBzLnByZXNlbnQpCisgICAgICAgICAgICBsaW1HZXRIdENiQWRtaW5TdGF0ZShwTWFjLCBwQXNzb2NSZXEtPkhUQ2FwcywgJnBNbG1Bc3NvY0luZC0+dGl0YW5IdENhcHMpOworCisgICAgICAgIC8vIEZpbGwgaW4gODAyLjExaCByZWxhdGVkIGluZm8KKyAgICAgICAgaWYgKHBBc3NvY1JlcS0+cG93ZXJDYXBhYmlsaXR5UHJlc2VudCAmJiBwQXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzUHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgcE1sbUFzc29jSW5kLT5zcGVjdHJ1bU1ndEluZGljYXRvciA9IGVTSVJfVFJVRTsKKyAgICAgICAgICAgIHBNbG1Bc3NvY0luZC0+cG93ZXJDYXAubWluVHhQb3dlciA9IHBBc3NvY1JlcS0+cG93ZXJDYXBhYmlsaXR5Lm1pblR4UG93ZXI7CisgICAgICAgICAgICBwTWxtQXNzb2NJbmQtPnBvd2VyQ2FwLm1heFR4UG93ZXIgPSBwQXNzb2NSZXEtPnBvd2VyQ2FwYWJpbGl0eS5tYXhUeFBvd2VyOworICAgICAgICAgICAgbGltQ29udmVydFN1cHBvcnRlZENoYW5uZWxzKHBNYWMsIHBNbG1Bc3NvY0luZCwgcEFzc29jUmVxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBwTWxtQXNzb2NJbmQtPnNwZWN0cnVtTWd0SW5kaWNhdG9yID0gZVNJUl9GQUxTRTsKKworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAvKiBUaGlzIGNoZWNrIGlzIHRvIGF2b2lkIGV4dHJhIFNlYyBJRXMgcHJlc2VudCBpbmNhc2Ugb2YgV1BTICovCisgICAgICAgIGlmIChwQXNzb2NSZXEtPndwYVByZXNlbnQgJiYgKE5VTEwgPT0gd3BzSWUpKQorI2Vsc2UKKyAgICAgICAgaWYgKChwQXNzb2NSZXEtPndwYVByZXNlbnQpICYmIChwTWxtQXNzb2NJbmQtPnJzbklFLmxlbmd0aCA8IFNJUl9NQUNfTUFYX0lFX0xFTkdUSCkpCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgaWYoKHBNbG1Bc3NvY0luZC0+cnNuSUUubGVuZ3RoICsgcEFzc29jUmVxLT53cGEubGVuZ3RoKSA+PSBTSVJfTUFDX01BWF9JRV9MRU5HVEgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgicnNuSUVkYXRhIGluZGV4IG91dCBvZiBib3VuZHMgJWRcbiIpLCBwTWxtQXNzb2NJbmQtPnJzbklFLmxlbmd0aCk7KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBNbG1Bc3NvY0luZC0+cnNuSUUucnNuSUVkYXRhW3BNbG1Bc3NvY0luZC0+cnNuSUUubGVuZ3RoXSA9IFNJUl9NQUNfV1BBX0VJRDsKKyAgICAgICAgICAgIHBNbG1Bc3NvY0luZC0+cnNuSUUucnNuSUVkYXRhW3BNbG1Bc3NvY0luZC0+cnNuSUUubGVuZ3RoICsgMV0gPSBwQXNzb2NSZXEtPndwYS5sZW5ndGg7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBNbG1Bc3NvY0luZC0+cnNuSUUucnNuSUVkYXRhW3BNbG1Bc3NvY0luZC0+cnNuSUUubGVuZ3RoICsgMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEtPndwYS5pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFzc29jUmVxLT53cGEubGVuZ3RoKTsKKyAgICAgICAgICAgIHBNbG1Bc3NvY0luZC0+cnNuSUUubGVuZ3RoICs9IDIgKyBwQXNzb2NSZXEtPndwYS5sZW5ndGg7CisgICAgICAgIH0KKworCisgICAgICAgcE1sbUFzc29jSW5kLT5hZGRJRS5sZW5ndGggPSAwOworICAgICAgIGlmIChwQXNzb2NSZXEtPmFkZElFUHJlc2VudCkKKyAgICAgICB7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBNbG1Bc3NvY0luZC0+YWRkSUUuYWRkSUVkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFzc29jUmVxLT5hZGRJRS5hZGRJRWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEtPmFkZElFLmxlbmd0aCk7CisKKyAgICAgICAgICAgIHBNbG1Bc3NvY0luZC0+YWRkSUUubGVuZ3RoID0gcEFzc29jUmVxLT5hZGRJRS5sZW5ndGg7CisgICAgICAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBpZihwQXNzb2NSZXEtPndtZUluZm9QcmVzZW50KQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCAodEFOSV9VMTYpIFdOSV9DRkdfV01FX0VOQUJMRUQsICZ0bXApICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJ3bGFuX2NmZ0dldEludCBmYWlsZWQgZm9yIGlkICVkXG4iKSwgV05JX0NGR19XTUVfRU5BQkxFRCApOworCisgICAgICAgICAgICAvKiBjaGVjayB3aGV0aGVyIEFQIGlzIGVuYWJsZWQgd2l0aCBXTU0gKi8KKyAgICAgICAgICAgIGlmKHRtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWxtQXNzb2NJbmQtPldtbVN0YUluZm9QcmVzZW50ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWxtQXNzb2NJbmQtPldtbVN0YUluZm9QcmVzZW50PSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogTm90ZTogd2UgYXJlIG5vdCByZWplY3RpbmcgYXNzb2NpYXRpb24gaGVyZSBiZWNhdXNlIElPVCB3aWxsIGZhaWwgKi8KKworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvLyBSZXF1aXJlZCBmb3IgaW5kaWNhdGluZyB0aGUgZnJhbWVzIHRvIHVwcGVyIGxheWVyCisgICAgICAgIHBNbG1Bc3NvY0luZC0+YXNzb2NSZXFMZW5ndGggPSBwQXNzb2NSZXEtPmFzc29jUmVxRnJhbWVMZW5ndGg7CisgICAgICAgIHBNbG1Bc3NvY0luZC0+YXNzb2NSZXFQdHIgPSBwQXNzb2NSZXEtPmFzc29jUmVxRnJhbWU7CisgICAgICAgIAorICAgICAgICBwTWxtQXNzb2NJbmQtPmJlYWNvblB0ciA9IHBzZXNzaW9uRW50cnktPmJlYWNvbjsKKyAgICAgICAgcE1sbUFzc29jSW5kLT5iZWFjb25MZW5ndGggPSBwc2Vzc2lvbkVudHJ5LT5iY25MZW47CisKKyAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywgTElNX01MTV9BU1NPQ19JTkQsICh0QU5JX1UzMiAqKSBwTWxtQXNzb2NJbmQpOworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwTWxtQXNzb2NJbmQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBJZiBpdHMgb2YgUmVhc3NvY2lhdGlvbiBSZXF1ZXN0LCB0aGVuIHBvc3QgTElNX01MTV9SRUFTU09DX0lORCAKKyAgICAgICAgdGVtcCAgPSBzaXplb2YodExpbU1sbVJlYXNzb2NJbmQpOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgICAgIHRlbXAgKz0gcEFzc29jUmVxLT5wcm9wSUVpbmZvLm51bUJzcyAqIHNpemVvZih0U2lyTmVpZ2hib3JCc3NJbmZvKTsKKyNlbmRpZgorICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNbG1SZWFzc29jSW5kLCB0ZW1wKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcE1sbVJlYXNzb2NJbmRcbiIpKTsKKyAgICAgICAgICAgIGxpbVJlbGVhc2VBSUQocE1hYywgcFN0YURzLT5hc3NvY0lkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwTWxtUmVhc3NvY0luZCwgdGVtcCk7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwodEFOSV9VOCAqKSBwTWxtUmVhc3NvY0luZC0+cGVlck1hY0FkZHIsICh0QU5JX1U4ICopcFN0YURzLT5zdGFBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwodEFOSV9VOCAqKSBwTWxtUmVhc3NvY0luZC0+Y3VycmVudEFwQWRkciwgKHRBTklfVTggKikmKHBBc3NvY1JlcS0+Y3VycmVudEFwQWRkciksIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBwTWxtUmVhc3NvY0luZC0+YWlkID0gcFN0YURzLT5hc3NvY0lkOworICAgICAgICBwTWxtUmVhc3NvY0luZC0+YXV0aFR5cGUgPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQuYXV0aFR5cGU7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsKHRBTklfVTggKikmcE1sbVJlYXNzb2NJbmQtPnNzSWQsICh0QU5JX1U4ICopJihwQXNzb2NSZXEtPnNzSWQpLCBwQXNzb2NSZXEtPnNzSWQubGVuZ3RoICsgMSk7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgICAgICAvLyBOb3RlIGZvciBCVEFNUDogbm8gbmVlZCB0byBmaWxsIGluIHBNbG1Bc3NvY0luZC0+c2VxTnVtCisgICAgICAgIHBNbG1SZWFzc29jSW5kLT53bmlJbmRpY2F0b3IgPSAodEFuaUJvb2wpIHBBc3NvY1JlcS0+cHJvcElFaW5mby5hbmlJbmRpY2F0b3I7CisgICAgICAgIHBNbG1SZWFzc29jSW5kLT5icEluZGljYXRvciAgPSAodEFuaUJvb2wpIHBBc3NvY1JlcS0+cHJvcElFaW5mby5icEluZGljYXRvcjsKKyAgICAgICAgcE1sbVJlYXNzb2NJbmQtPmJwVHlwZSAgICAgICA9ICh0U2lyQnBJbmRpY2F0b3JUeXBlKSBwQXNzb2NSZXEtPnByb3BJRWluZm8uYnBUeXBlOworICAgICAgICBpZiAocEFzc29jUmVxLT5leHRlbmRlZFJhdGVzUHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPm53VHlwZSA9IGVTSVJfMTFHX05XX1RZUEU7CisgICAgICAgICAgICBsaW1TZXRTdGFIYXNoRXJwTW9kZShwTWFjLCBwU3RhRHMtPmFzc29jSWQsIGVIQUxfU0VUKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwaHlNb2RlID09IFdOSV9DRkdfUEhZX01PREVfMTFBKQorICAgICAgICAgICAgICAgIHBNbG1SZWFzc29jSW5kLT5ud1R5cGUgPSBlU0lSXzExQV9OV19UWVBFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBNbG1SZWFzc29jSW5kLT5ud1R5cGUgPSBlU0lSXzExQl9OV19UWVBFOworICAgICAgICAgICAgICAgIGxpbVNldFN0YUhhc2hFcnBNb2RlKHBNYWMsIHBTdGFEcy0+YXNzb2NJZCwgZUhBTF9DTEVBUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwTWxtUmVhc3NvY0luZC0+cmVhc3NvY1R5cGUgID0gKHRTaXJBc3NvY1R5cGUpcEFzc29jUmVxLT5wcm9wSUVpbmZvLmFzc29jVHlwZTsKKyAgICAgICAgcE1sbVJlYXNzb2NJbmQtPmxvYWQubnVtU3RhcyA9IHBNYWMtPmxpbS5nTGltTnVtT2ZDdXJyZW50U1RBczsKKyAgICAgICAgcE1sbVJlYXNzb2NJbmQtPmxvYWQuY2hhbm5lbFV0aWxpemF0aW9uID0gKHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5hdmdDaGFubmVsVXRpbGl6YXRpb24gOiAwOworICAgICAgICBwTWxtUmVhc3NvY0luZC0+bnVtQnNzID0gKHRBTklfVTMyKSBwQXNzb2NSZXEtPnByb3BJRWluZm8ubnVtQnNzOworICAgICAgICBpZiAocEFzc29jUmVxLT5wcm9wSUVpbmZvLm51bUJzcykKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwTWxtUmVhc3NvY0luZC0+bmVpZ2hib3JMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcEFzc29jUmVxLT5wcm9wSUVpbmZvLnBCc3NMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZih0U2lyTmVpZ2hib3JCc3NJbmZvKSAqIHBBc3NvY1JlcS0+cHJvcElFaW5mby5udW1Cc3MpKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChwQXNzb2NSZXEtPnByb3BJRWluZm8uYW5pSW5kaWNhdG9yKQorICAgICAgICAgICAgcFN0YURzLT5hbmlQZWVyID0gMTsKKworICAgICAgICBwTWxtUmVhc3NvY0luZC0+Y2FwYWJpbGl0eUluZm8gPSBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvOworICAgICAgICBwTWxtUmVhc3NvY0luZC0+cnNuSUUubGVuZ3RoID0gMDsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgaWYgKHBBc3NvY1JlcS0+YWRkSUVQcmVzZW50ICYmIHBBc3NvY1JlcS0+YWRkSUUubGVuZ3RoICkKKyAgICAgICAgICAgIHdwc0llID0gbGltR2V0V3NjSUVQdHIocE1hYywgcEFzc29jUmVxLT5hZGRJRS5hZGRJRWRhdGEsIHBBc3NvY1JlcS0+YWRkSUUubGVuZ3RoKTsKKworICAgICAgICBpZiAocEFzc29jUmVxLT5yc25QcmVzZW50ICYmIChOVUxMID09IHdwc0llKSkKKyNlbHNlCisgICAgICAgIGlmIChwQXNzb2NSZXEtPnJzblByZXNlbnQpCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzIsIEZMKCJBc3NvYyBSZXE6IFJTTiBJRSBsZW5ndGggPSAlZFxuIiksIHBBc3NvY1JlcS0+cnNuLmxlbmd0aCk7CisgICAgICAgICAgICBwTWxtUmVhc3NvY0luZC0+cnNuSUUubGVuZ3RoID0gMiArIHBBc3NvY1JlcS0+cnNuLmxlbmd0aDsKKyAgICAgICAgICAgIHBNbG1SZWFzc29jSW5kLT5yc25JRS5yc25JRWRhdGFbMF0gPSBTSVJfTUFDX1JTTl9FSUQ7CisgICAgICAgICAgICBwTWxtUmVhc3NvY0luZC0+cnNuSUUucnNuSUVkYXRhWzFdID0gcEFzc29jUmVxLT5yc24ubGVuZ3RoOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgJnBNbG1SZWFzc29jSW5kLT5yc25JRS5yc25JRWRhdGFbMl0sIHBBc3NvY1JlcS0+cnNuLmluZm8sIHBBc3NvY1JlcS0+cnNuLmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBpZihwQXNzb2NSZXEtPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICAgICAgICBsaW1HZXRIdENiQWRtaW5TdGF0ZShwTWFjLCBwQXNzb2NSZXEtPkhUQ2FwcywgICZwTWxtUmVhc3NvY0luZC0+dGl0YW5IdENhcHMgKTsKKworICAgICAgICAvLyA4MDIuMTFoIHN1cHBvcnQKKyAgICAgICAgaWYgKHBBc3NvY1JlcS0+cG93ZXJDYXBhYmlsaXR5UHJlc2VudCAmJiBwQXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzUHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPnNwZWN0cnVtTWd0SW5kaWNhdG9yID0gZVNJUl9UUlVFOworICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPnBvd2VyQ2FwLm1pblR4UG93ZXIgPSBwQXNzb2NSZXEtPnBvd2VyQ2FwYWJpbGl0eS5taW5UeFBvd2VyOworICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPnBvd2VyQ2FwLm1heFR4UG93ZXIgPSBwQXNzb2NSZXEtPnBvd2VyQ2FwYWJpbGl0eS5tYXhUeFBvd2VyOworICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmwgPSAodEFOSV9VOCkocEFzc29jUmVxLT5zdXBwb3J0ZWRDaGFubmVscy5sZW5ndGggLyAyKTsKKworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgRkwoIlNlbmRpbmcgUmVhc3NvYyBJbmQ6IHNwZWN0cnVtIE9OLCBtaW5Qd3IgJWQsIG1heFB3ciAlZCwgbnVtQ2hubCAlZFxuIiksCisgICAgICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPnBvd2VyQ2FwLm1pblR4UG93ZXIsCisgICAgICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPnBvd2VyQ2FwLm1heFR4UG93ZXIsCisgICAgICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmwpOworCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgcE1sbVJlYXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmw7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWxtUmVhc3NvY0luZC0+c3VwcG9ydGVkQ2hhbm5lbHMuY2hhbm5lbExpc3RbaV0gPSBwQXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzLnN1cHBvcnRlZENoYW5uZWxzW2pdOworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBSZWFzc29jSW5kOiBjaG5bJWRdID0gJWQgXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwgcE1sbVJlYXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLmNoYW5uZWxMaXN0W2ldKTsKKyAgICAgICAgICAgICAgICBqKz0yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBNbG1SZWFzc29jSW5kLT5zcGVjdHJ1bU1ndEluZGljYXRvciA9IGVTSVJfRkFMU0U7CisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgLyogVGhpcyBjaGVjayBpcyB0byBhdm9pZCBleHRyYSBTZWMgSUVzIHByZXNlbnQgaW5jYXNlIG9mIFdQUyAqLworICAgICAgICBpZiAocEFzc29jUmVxLT53cGFQcmVzZW50ICYmIChOVUxMID09IHdwc0llKSkKKyNlbHNlCisgICAgICAgIGlmIChwQXNzb2NSZXEtPndwYVByZXNlbnQpCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzIsIEZMKCJSZWNlaXZlZCBXUEEgSUUgbGVuZ3RoIGluIEFzc29jIFJlcSBpcyAlZFxuIiksIHBBc3NvY1JlcS0+d3BhLmxlbmd0aCk7CisgICAgICAgICAgICBwTWxtUmVhc3NvY0luZC0+cnNuSUUucnNuSUVkYXRhW3BNbG1SZWFzc29jSW5kLT5yc25JRS5sZW5ndGhdID0gU0lSX01BQ19XUEFfRUlEOworICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPnJzbklFLnJzbklFZGF0YVtwTWxtUmVhc3NvY0luZC0+cnNuSUUubGVuZ3RoICsgMV0gPSBwQXNzb2NSZXEtPndwYS5sZW5ndGg7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBNbG1SZWFzc29jSW5kLT5yc25JRS5yc25JRWRhdGFbcE1sbVJlYXNzb2NJbmQtPnJzbklFLmxlbmd0aCArIDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFzc29jUmVxLT53cGEuaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvY1JlcS0+d3BhLmxlbmd0aCk7CisgICAgICAgICAgICBwTWxtUmVhc3NvY0luZC0+cnNuSUUubGVuZ3RoICs9IDIgKyBwQXNzb2NSZXEtPndwYS5sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgIHBNbG1SZWFzc29jSW5kLT5hZGRJRS5sZW5ndGggPSAwOworICAgICAgIGlmIChwQXNzb2NSZXEtPmFkZElFUHJlc2VudCkKKyAgICAgICB7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBNbG1SZWFzc29jSW5kLT5hZGRJRS5hZGRJRWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NSZXEtPmFkZElFLmFkZElFZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvY1JlcS0+YWRkSUUubGVuZ3RoKTsKKworICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPmFkZElFLmxlbmd0aCA9IHBBc3NvY1JlcS0+YWRkSUUubGVuZ3RoOworICAgICAgIH0KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgaWYocEFzc29jUmVxLT53bWVJbmZvUHJlc2VudCkKKyAgICAgICAgeworCisgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgKHRBTklfVTE2KSBXTklfQ0ZHX1dNRV9FTkFCTEVELCAmdG1wKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgid2xhbl9jZmdHZXRJbnQgZmFpbGVkIGZvciBpZCAlZFxuIiksIFdOSV9DRkdfV01FX0VOQUJMRUQgKTsKKworICAgICAgICAgICAgLyogY2hlY2sgd2hldGhlciBBUCBpcyBlbmFibGVkIHdpdGggV01NICovCisgICAgICAgICAgICBpZih0bXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE1sbVJlYXNzb2NJbmQtPldtbVN0YUluZm9QcmVzZW50ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWxtUmVhc3NvY0luZC0+V21tU3RhSW5mb1ByZXNlbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogTm90ZTogd2UgYXJlIG5vdCByZWplY3RpbmcgUmUtYXNzb2NpYXRpb24gaGVyZSBiZWNhdXNlIElPVCB3aWxsIGZhaWwgKi8KKworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvLyBSZXF1aXJlZCBmb3IgaW5kaWNhdGluZyB0aGUgZnJhbWVzIHRvIHVwcGVyIGxheWVyCisgICAgICAgIHBNbG1SZWFzc29jSW5kLT5hc3NvY1JlcUxlbmd0aCA9IHBBc3NvY1JlcS0+YXNzb2NSZXFGcmFtZUxlbmd0aDsKKyAgICAgICAgcE1sbVJlYXNzb2NJbmQtPmFzc29jUmVxUHRyID0gcEFzc29jUmVxLT5hc3NvY1JlcUZyYW1lOworCisgICAgICAgIHBNbG1SZWFzc29jSW5kLT5iZWFjb25QdHIgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb247CisgICAgICAgIHBNbG1SZWFzc29jSW5kLT5iZWFjb25MZW5ndGggPSBwc2Vzc2lvbkVudHJ5LT5iY25MZW47CisKKyAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywgTElNX01MTV9SRUFTU09DX0lORCwgKHRBTklfVTMyICopIHBNbG1SZWFzc29jSW5kKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcE1sbVJlYXNzb2NJbmQpOworICAgIH0KKworICAgIHJldHVybjsKKworfSAvKioqIGVuZCBsaW1TZW5kTWxtQXNzb2NJbmQoKSAqKiovCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NBc3NvY1JzcEZyYW1lLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NBc3NvY1JzcEZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0ZmYxZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0Fzc29jUnNwRnJhbWUuYwpAQCAtMCwwICsxLDc4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1Qcm9jZXNzQXNzb2NSc3BGcmFtZS5jYyBjb250YWlucyB0aGUgY29kZQorICogZm9yIHByb2Nlc3NpbmcgUmUvQXNzb2NpYXRpb24gUmVzcG9uc2UgRnJhbWUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMy8xOC8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlICJ3bmlBcGkuaCIKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyNpbmNsdWRlICJ3bmlDZmdBcC5oIgorI2Vsc2UKKyNpbmNsdWRlICJ3bmlDZmdTdGEuaCIKKyNlbmRpZgorI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgImNmZ0FwaS5oIgorCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJwbW1BcGkuaCIKKyNpbmNsdWRlICJsaW1UeXBlcy5oIgorI2luY2x1ZGUgImxpbVV0aWxzLmgiCisjaW5jbHVkZSAibGltQXNzb2NVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlY3VyaXR5VXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZXJEZXNVdGlscy5oIgorI2luY2x1ZGUgImxpbVN0YUhhc2hBcGkuaCIKKyNpbmNsdWRlICJsaW1TZW5kTWVzc2FnZXMuaCIKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyNpbmNsdWRlICJjY3hBcGkuaCIKKyNlbmRpZgorCitleHRlcm4gdFNpclJldFN0YXR1cyBzY2hCZWFjb25FZGNhUHJvY2Vzcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjRWRjYVBhcmFtU2V0SUUgKmVkY2EsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisKKy8qKgorICogQGZ1bmN0aW9uIDogbGltVXBkYXRlQXNzb2NTdGFEYXRhcworICoKKyAqIEBicmllZiA6ICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBVcGRhdGUgdGhlIFN0YXRpb24gRGVzY3JpcHRvciAoZHBoKSBEZXRhaWxzIGZyb20KKyAqICAgICAgICAgICAgICAgICAgQXNzb2NpYXRpb24gLyBSZUFzc29jaWF0aW9uIFJlc3BvbnNlIEZyYW1lCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBTdGFEcyAgIC0gU3RhdGlvbiBEZXNjcmlwdG9yIGluIERQSAorICogQHBhcmFtICBwQXNzb2NSc3AgICAgLSBQb2ludGVyIHRvIEFzc29jaWF0aW9uIFJlc3BvbnNlIFN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbVVwZGF0ZUFzc29jU3RhRGF0YXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhRHMsIHRwU2lyQXNzb2NSc3AgcEFzc29jUnNwLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMzIgICAgICAgIHByb3A7CisgICAgdEFOSV9VMzIgICAgICAgIHBoeU1vZGU7CisgICAgdEFOSV9VMzIgICAgICAgIHZhbDsKKyAgICAvL3RwU2lyQm9hcmRDYXBhYmlsaXRpZXMgcEJvYXJkQ2FwczsKKyAgICB0QU5JX0JPT0xFQU4gICAgcW9zTW9kZTsgCisgICAgdEFOSV9VMTYgICAgICAgIHJ4SGlnaGVzdFJhdGUgPSAwOworCisgICAgbGltR2V0UGh5TW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICBwU3RhRHMtPnN0YVR5cGU9IFNUQV9FTlRSWV9TRUxGOworCisgICAgbGltR2V0UW9zTW9kZShwc2Vzc2lvbkVudHJ5LCAmcW9zTW9kZSk7ICAgIAorICAgIC8vIHNldCB0aGUgYW5pIHBlZXIgYml0LCBpZiBzZWxmIG1vZGUgaXMgb25lIG9mIHRoZSBwcm9wcmlldGFyeSBtb2RlcworICAgIGlmKElTX0RPVDExX01PREVfUFJPUFJJRVRBUlkocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSkgCisgICAgeworICAgICAgIHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUFJPUFJJRVRBUllfQU5JX0ZFQVRVUkVTX0VOQUJMRUQsICZwcm9wKTsKKworICAgICAgIGlmIChwcm9wKSAKKyAgICAgICB7CisgICAgICAgICAgIHBTdGFEcy0+YW5pUGVlciA9IGVIQUxfU0VUOworICAgICAgICAgICBwU3RhRHMtPnByb3BDYXBhYmlsaXR5ID0gcEFzc29jUnNwLT5wcm9wSUVpbmZvLmNhcGFiaWxpdHk7CisgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAgICAvL3BNYWMtPmxpbS5nTGltTWxtU3RhdGUgICAgICAgICA9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEU7CisgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmF1dGhUeXBlID0gcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEF1dGhUeXBlOworICAgIAorICAgICAgIC8vIEFkZCBjYXBhYmlsaXRpZXMgaW5mb3JtYXRpb24sIHJhdGVzIGFuZCBBSUQKKyAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2FwYWJpbGl0eUluZm8gPSBwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvOworICAgICAgIHBTdGFEcy0+c2hvcnRQcmVhbWJsZUVuYWJsZWQ9ICh0QU5JX1U4KXBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZTsKKyAgICAKKyAgICAgICAvL1VwZGF0ZSBIVCBDYXBhYmlsaXRlcyBvbmx5IHdoZW4gdGhlIHNlbGYgbW9kZSBzdXBwb3J0cyBIVAorICAgICAgIGlmKElTX0RPVDExX01PREVfSFQocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlKSkgeworICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5ID0gcEFzc29jUnNwLT5IVENhcHMucHJlc2VudDsKKyAgICAKKyAgICAgICAgICAgaWYgKCBwQXNzb2NSc3AtPkhUQ2Fwcy5wcmVzZW50ICkgeworICAgICAgICAgICAgICAgcFN0YURzLT5odEdyZWVuZmllbGQgPSAoIHRBTklfVTggKSBwQXNzb2NSc3AtPkhUQ2Fwcy5ncmVlbkZpZWxkOworICAgICAgICAgICAgICAgcFN0YURzLT5odFN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9ICggdEFOSV9VOCApIChwQXNzb2NSc3AtPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NSc3AtPkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NSc3AtPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKTsKKyAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmh0THNpZ1RYT1BQcm90ZWN0aW9uID0gKCB0QU5JX1U4ICkgcEFzc29jUnNwLT5IVENhcHMubHNpZ1RYT1BQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+aHRNSU1PUFNTdGF0ZSA9ICAodFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlKXBBc3NvY1JzcC0+SFRDYXBzLm1pbW9Qb3dlclNhdmU7CisgICAgICAgICAgICAgICAgICAgcFN0YURzLT5odE1heEFtc2R1TGVuZ3RoID0gKCB0QU5JX1U4ICkgcEFzc29jUnNwLT5IVENhcHMubWF4aW1hbEFNU0RVc2l6ZTsKKyAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmh0QU1wZHVEZW5zaXR5ID0gICAgICAgICAgICAgcEFzc29jUnNwLT5IVENhcHMubXBkdURlbnNpdHk7CisgICAgICAgICAgICAgICAgICAgcFN0YURzLT5odERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0ID0gKHRBTklfVTgpcEFzc29jUnNwLT5IVENhcHMuZHNzc0Nja01vZGU0ME1IejsKKyAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmh0U2hvcnRHSTIwTWh6ID0gKHRBTklfVTgpcEFzc29jUnNwLT5IVENhcHMuc2hvcnRHSTIwTUh6OworICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+aHRTaG9ydEdJNDBNaHogPSAodEFOSV9VOClwQXNzb2NSc3AtPkhUQ2Fwcy5zaG9ydEdJNDBNSHo7CisgICAgICAgICAgICAgICAgICAgcFN0YURzLT5odE1heFJ4QU1wZHVGYWN0b3IgPSBwQXNzb2NSc3AtPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yOworICAgICAgICAgICAgICAgICAgIGxpbUZpbGxSeEhpZ2hlc3RTdXBwb3J0ZWRSYXRlKHBNYWMsICZyeEhpZ2hlc3RSYXRlLCBwQXNzb2NSc3AtPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQpOworICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+c3VwcG9ydGVkUmF0ZXMucnhIaWdoZXN0RGF0YVJhdGUgPSByeEhpZ2hlc3RSYXRlOworCisgICAgICAgICAgICAgICAgICAgLy9GSVhNRV9BTVBEVQorICAgICAgICAgICAgICAgICAgIC8vIEluIHRoZSBmdXR1cmUsIG1heSBuZWVkIHRvIGNoZWNrIGZvciAiYXNzb2MuSFRDYXBzLmRlbGF5ZWRCQSIKKyAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCBpdCBpcyBJTU1FRElBVEUgQkEgb25seSBvbiBBTEwgVElEJ3MKKyAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmJhUG9saWN5RmxhZyA9IDB4RkY7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgCisgICAgICAgaWYgKGxpbVBvcHVsYXRlT3duUmF0ZVNldChwTWFjLCAmcFN0YURzLT5zdXBwb3J0ZWRSYXRlcywgcEFzc29jUnNwLT5IVENhcHMuc3VwcG9ydGVkTUNTU2V0LCBmYWxzZSxwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgZ2V0IHJhdGVzZXQgYW5kIGV4dGVuZGVkIHJhdGUgc2V0XG4iKSk7CisgICAgICAgICAgIHJldHVybjsKKyAgICAgICB9CisgICAKKyAgICAgICAvL0lmIG9uZSBvZiB0aGUgcmF0ZXMgaXMgMTFnIHJhdGVzLCBzZXQgdGhlIEVSUCBtb2RlLgorICAgICAgIGlmICgocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykgJiYgc2lySXNBcmF0ZShwU3RhRHMtPnN1cHBvcnRlZFJhdGVzLmxsYVJhdGVzWzBdICYgMHg3ZikpCisgICAgICAgICAgIHBTdGFEcy0+ZXJwRW5hYmxlZCA9IGVIQUxfU0VUOworICAgIAorICAgIAorICAgICAgIHZhbCA9IFdOSV9DRkdfUFJPUFJJRVRBUllfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOOworICAgICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX1BST1BSSUVUQVJZX09QRVJBVElPTkFMX1JBVEVfU0VULAorICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnBTdGFEcy0+bWxtU3RhQ29udGV4dC5wcm9wUmF0ZVNldC5wcm9wUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgeworICAgICAgICAgICAvLy8gQ291bGQgbm90IGdldCBwcm9wIHJhdGVzZXQgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgcHJvcCByYXRlc2V0XG4iKSk7CisgICAgICAgICAgIHJldHVybjsKKyAgICAgICB9CisgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnByb3BSYXRlU2V0Lm51bVByb3BSYXRlcyA9ICh0QU5JX1U4KSB2YWw7CisgICAgCisgICAgICAgcFN0YURzLT5xb3NNb2RlICAgID0gMDsKKyAgICAgICBwU3RhRHMtPmxsZUVuYWJsZWQgPSAwOworICAgIAorICAgICAgIC8vIHVwZGF0ZSBUU0lEIHRvIFVQIG1hcHBpbmcKKyAgICAgICAvL2lmIChwTWFjLT5saW0uZ0xpbVFvc0VuYWJsZWQpCisgICAgICAgaWYgKHFvc01vZGUpIHsKKyAgICAgICAgICAgaWYgKHBBc3NvY1JzcC0+ZWRjYVByZXNlbnQpIHsKKyAgICAgICAgICAgICAgIHRTaXJSZXRTdGF0dXMgc3RhdHVzOworICAgICAgICAgICAgICAgc3RhdHVzID0gc2NoQmVhY29uRWRjYVByb2Nlc3MocE1hYywmcEFzc29jUnNwLT5lZGNhLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLCAiRWRjYSBzZXQgdXBkYXRlIGJhc2VkIG9uIEFzc29jUnNwOiBzdGF0dXMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTspCisgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkVkY2EgZXJyb3IgaW4gQXNzb2NSZXNwIFxuIikpOykKKyAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHVwZGF0ZSBkZWZhdWx0IHRpZG1hcCBiYXNlZCBvbiBBQ00KKyAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnFvc01vZGUgICAgPSAxOworICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+bGxlRW5hYmxlZCA9IDE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgCisgICAgICAgcFN0YURzLT53bWVFbmFibGVkID0gMDsKKyAgICAgICBwU3RhRHMtPndzbUVuYWJsZWQgPSAwOworICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkICYmIHBBc3NvY1JzcC0+d21lRWRjYVByZXNlbnQpCisgICAgICAgeworICAgICAgICAgICB0U2lyUmV0U3RhdHVzIHN0YXR1czsKKyAgICAgICAgICAgc3RhdHVzID0gc2NoQmVhY29uRWRjYVByb2Nlc3MocE1hYywmcEFzc29jUnNwLT5lZGNhLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCAiV01FIEVkY2Egc2V0IHVwZGF0ZSBiYXNlZCBvbiBBc3NvY1JzcDogc3RhdHVzICVkXG4iLCBzdGF0dXMpOykKKworICAgICAgICAgICBpZiAoc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIldNRSBFZGNhIGVycm9yIGluIEFzc29jUmVzcCAtIGlnbm9yaW5nXG4iKSk7KQorICAgICAgICAgICBlbHNlIHsgLy8gdXBkYXRlIGRlZmF1bHQgdGlkbWFwIGJhc2VkIG9uIEhhc2hBQ00KKyAgICAgICAgICAgICAgIHBTdGFEcy0+cW9zTW9kZSAgICA9IDE7CisgICAgICAgICAgICAgICBwU3RhRHMtPndtZUVuYWJsZWQgPSAxOworICAgICAgICAgICB9CisgICAgICAgfSAKKyAgICAgICBlbHNlIHsKKyAgICAgICAgICAgLyogV2UgcmVjZWl2ZWQgYXNzb2MgcnNwIGZyb20gYSBsZWdhY3kgQVAuIFNvIGZpbGwgaW4gdGhlIGRlZmF1bHQgCisgICAgICAgICAgICAqIGxvY2FsIEVEQ0EgcGFyYW1zLiBUaGlzIGlzIG5lZWRlZCAocmVmZXIgdG8gYnVnICMxNDk4OSkgYXMgd2UnbGwgCisgICAgICAgICAgICAqIGJlIHBhc3NpbmcgdGhlIGdMaW1FZGNhUGFyYW1zIHRvIEhBTCBpbiBsaW1Qcm9jZXNzU3RhTWxtQWRkQnNzUnNwKCkuCisgICAgICAgICAgICAqLyAKKyAgICAgICAgICAgc2NoU2V0RGVmYXVsdEVkY2FQYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgfQorCisKK30KKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQpIHx8IGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisvKioKKyAqIEBmdW5jdGlvbiA6IGxpbVVwZGF0ZVJlQXNzb2NHbG9iYWxzCisgKgorICogQGJyaWVmIDogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIFVwZGF0ZSB0aGUgR2xvYmFscyAoTElNKSBkdXJpbmcgUmVBc3NvYy4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEFzc29jUnNwICAgIC0gUG9pbnRlciB0byBBc3NvY2lhdGlvbiBSZXNwb25zZSBTdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbVVwZGF0ZVJlQXNzb2NHbG9iYWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyQXNzb2NSc3AgcEFzc29jUnNwLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgZm9yIFBNTSBtb2R1bGUKKyAgICAgKi8KKyAgICBwbW1SZXNldFBtbVN0YXRlKHBNYWMpOworCisgICAgLy8gVXBkYXRlIHRoZSBjdXJyZW50IEJzcyBJbmZvcm1hdGlvbgorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmJzc0lkLAorICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwgPSBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQ2hhbm5lbElkOworICAgIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzICAgPSBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzQ2FwczsKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QnNzUW9zQ2FwcyA9IHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NRb3NDYXBzOworICAgIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NQcm9wQ2FwID0gcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0Jzc1Byb3BDYXA7CisgICAgcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudFRpdGFuSHRDYXBzID0gcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY1RpdGFuSHRDYXBzOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZwc2Vzc2lvbkVudHJ5LT5zc0lkLAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NTU0lELAorICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY1NTSUQubGVuZ3RoKzEpOworICAgIAorICAgIC8vIFN0b3JlIGFzc2lnbmVkIEFJRCBmb3IgVElNIHByb2Nlc3NpbmcKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1BSUQgPSBwQXNzb2NSc3AtPmFpZCAmIDB4M0ZGRjsKKyAgICAvKiogU2V0IHRoZSBTdGF0ZSBCYWNrIHRvIFJlQXNzb2MgUnNwKi8KKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX1JFQVNTT0NfUlNQX1NUQVRFOyAKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKworICAgIAorfQorI2VuZGlmCisKKy8qKgorICogQGZ1bmN0aW9uIDogbGltUHJvY2Vzc0Fzc29jUnNwRnJhbWUKKyAqCisgKiBAYnJpZWYgOiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpIHVwb24KKyAqICAgICAgICAgICAgICBSZS9Bc3NvY2lhdGlvbiBSZXNwb25zZSBmcmFtZSByZWNlcHRpb24uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwUnhQYWNrZXRJbmZvICAgIC0gQSBwb2ludGVyIHRvIFJ4IHBhY2tldCBpbmZvIHN0cnVjdHVyZQorICogQHBhcmFtICBzdWJUeXBlIC0gSW5kaWNhdGVzIHdoZXRoZXIgaXQgaXMgQXNzb2NpYXRpb24gUmVzcG9uc2UgKD0wKSBvcgorICogICAgICAgICAgICAgICAgICAgUmVhc3NvY2lhdGlvbiBSZXNwb25zZSAoPTEpIGZyYW1lCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUHJvY2Vzc0Fzc29jUnNwRnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbywgdEFOSV9VOCBzdWJUeXBlLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICpwQm9keTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgY2FwczsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgZnJhbWVMZW47CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgIGN1cnJlbnRCc3NJZDsKKyAgICB0cFNpck1hY01nbXRIZHIgICAgICAgcEhkcjsKKyAgICB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gbG9jYWxDYXBhYmlsaXRpZXM7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgICAgIHBTdGFEczsKKyAgICB0cFNpckFzc29jUnNwICAgICAgICAgcEFzc29jUnNwOworICAgIHRMaW1NbG1Bc3NvY0NuZiAgICAgICBtbG1Bc3NvY0NuZjsKKyAgICAKKyAgICAjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQKKyAgICB0U2NoQmVhY29uU3RydWN0IGJlYWNvblN0cnVjdDsKKyNlbmRpZgorCisgICAgLy9Jbml0aWFsaXplIHN0YXR1cyBjb2RlIHRvIHN1Y2Nlc3MuCisKKyAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworCisgICAgbWxtQXNzb2NDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgLyogVXBkYXRlIFBFIHNlc3Npb24gSWQqLworICAgIG1sbUFzc29jQ25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisgICAKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgfHwgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFICkKKyAgICB7CisgICAgICAgIC8vIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBSZS9Bc3NvY2lhdGlvbiBSZXNwb25zZQorICAgICAgICAvLyBmcmFtZSBvbiBBUC4gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIFJlL0Fzc29jIHJlc3BvbnNlIGZyYW1lIG9uIHJvbGUgJWQgXG4iKSwKKyAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIHBIZHIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisgICAgZnJhbWVMZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pOworCisgICAgaWYgKCgoc3ViVHlwZSA9PSBMSU1fQVNTT0MpICYmCisgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgIT0gZUxJTV9NTE1fV1RfQVNTT0NfUlNQX1NUQVRFKSkgfHwKKyAgICAgICAgKChzdWJUeXBlID09IExJTV9SRUFTU09DKSAmJgorICAgICAgICAgKChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSAhPSBlTElNX01MTV9XVF9SRUFTU09DX1JTUF9TVEFURSkgCisjaWYgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9DQ1gpCisgICAgICAgICAmJiAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgIT0gZUxJTV9NTE1fV1RfRlRfUkVBU1NPQ19SU1BfU1RBVEUpCisjZW5kaWYKKyAgICAgICAgICkpKQorICAgIHsKKyAgICAgICAgLy8vIFJlY2VpdmVkIHVuZXhwZWN0ZWQgUmUvQXNzb2NpYXRpb24gUmVzcG9uc2UgZnJhbWUKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgIEZMKCJtbG0gc3RhdGUgaXMgc2V0IHRvICVkIHNlc3Npb249JWRcbiIpLCAKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCk7KQorI2VuZGlmCisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICBpZiAoIXBIZHItPmZjLnJldHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBSZS9Bc3NvYyByc3AgZnJhbWUgaW4gdW5leHBlY3RlZCBzdGF0ZVxuIikpOworICAgICAgICAgICAgbGltUHJpbnRNbG1TdGF0ZShwTWFjLCBMT0dFLCBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorI2lmIDAKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19CU1NJRCwgY3VycmVudEJzc0lkLCAmY2ZnKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCBCU1NJRCBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBCU1NJRFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICBzaXJDb3B5TWFjQWRkcihjdXJyZW50QnNzSWQscHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisgICAgaWYgKHN1YlR5cGUgPT0gTElNX0FTU09DKQorICAgIHsKKyAgICAgICAgaWYgKCFwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCxwSGRyLT5zYSwgY3VycmVudEJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmVjZWl2ZWQgQXNzb2NpYXRpb24gUmVzcG9uc2UgZnJhbWUgZnJvbSBhbiBlbnRpdHkKKyAgICAgICAgICAgICAqIG90aGVyIHRoYW4gb25lIHRvIHdoaWNoIHJlcXVlc3Qgd2FzIGluaXRpYXRlZC4KKyAgICAgICAgICAgICAqIElnbm9yZSB0aGlzIGFuZCB3YWl0IHVudGlsIEFzc29jaWF0aW9uIEZhaWx1cmUgVGltZW91dC4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXNzb2NSc3AgZnJhbWUgZnJvbSB1bmV4cGVjdGVkIHBlZXIgIikpOworICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoICFwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCxwSGRyLT5zYSwgcHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmVjZWl2ZWQgUmVhc3NvY2lhdGlvbiBSZXNwb25zZSBmcmFtZSBmcm9tIGFuIGVudGl0eQorICAgICAgICAgICAgICogb3RoZXIgdGhhbiBvbmUgdG8gd2hpY2ggcmVxdWVzdCB3YXMgaW5pdGlhdGVkLgorICAgICAgICAgICAgICogSWdub3JlIHRoaXMgYW5kIHdhaXQgdW50aWwgUmVhc3NvY2lhdGlvbiBGYWlsdXJlIFRpbWVvdXQuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgUmVhc3NvY1JzcCBmcmFtZSBmcm9tIHVuZXhwZWN0ZWQgcGVlciAiKSk7KQorICAgICAgICAgICAgUEVMT0cxKGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7KQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgIGlmICggcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBBc3NvY1JzcCwgc2l6ZW9mKCpwQXNzb2NSc3ApKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiUGFsIEFsbG9jYXRlIE1lbW9yeSBmYWlsZWQgaW4gQXNzb2NSc3BcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgIAorICAgIC8vIEdldCBwb2ludGVyIHRvIFJlL0Fzc29jaWF0aW9uIFJlc3BvbnNlIGZyYW1lIGJvZHkKKyAgICBwQm9keSA9IFdEQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pOworCisgICAgLy8gcGFyc2UgUmUvQXNzb2NpYXRpb24gUmVzcG9uc2UgZnJhbWUuCisgICAgaWYgKHNpckNvbnZlcnRBc3NvY1Jlc3BGcmFtZTJTdHJ1Y3QoCisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLCBwQm9keSwgZnJhbWVMZW4sIHBBc3NvY1JzcCkgPT0gZVNJUl9GQUlMVVJFKSAKKyAgICB7CisgICAgICAgIGlmIChwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBBc3NvY1JzcCkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykgCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiUGFsRnJlZSBNZW1vcnkgZmFpbGVkIFxuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlBhcnNlIGVycm9yIEFzc29jIHJlc3Agc3VidHlwZSAlZCwgbGVuZ3RoPSVkXG4iKSwgZnJhbWVMZW4sc3ViVHlwZSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoIXBBc3NvY1JzcC0+c3VwcFJhdGVzUHJlc2VudCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HVywgRkwoImFzc29jIHJlc3BvbnNlIGRvZXMgbm90IGhhdmUgc3VwcG9ydGVkIHJhdGUgc2V0IikpOykKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcEFzc29jUnNwLT5zdXBwb3J0ZWRSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAmcHNlc3Npb25FbnRyeS0+cmF0ZVNldCwgc2l6ZW9mKHRTaXJNYWNSYXRlU2V0KSk7CisgICAgfQorCisgICAgbWxtQXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPSBwQXNzb2NSc3AtPnN0YXR1c0NvZGU7CisKKyAgICBpZiggcHNlc3Npb25FbnRyeS0+YXNzb2NSc3AgIT0gTlVMTCApCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmFzc29jUnNwKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+YXNzb2NSc3AgPSBOVUxMOworICAgIH0KKyAgICBpZiggKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKiopJnBzZXNzaW9uRW50cnktPmFzc29jUnNwLCBmcmFtZUxlbikpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgYXNzb2MgcmVzcG9uc2UsIGxlbiA9ICVkIiksIGZyYW1lTGVuKTspCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vU3RvcmUgdGhlIEFzc29jIHJlc3BvbnNlLiBUaGlzIGlzIHNlbnQgdG8gY3NyL2hkZCBpbiBqb2luIGNuZiByZXNwb25zZS4gCisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+YXNzb2NSc3AsIHBCb2R5LCBmcmFtZUxlbik7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmFzc29jUnNwTGVuID0gZnJhbWVMZW47CisgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+cmljRGF0YSAhPSBOVUxMKSAKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+cmljRGF0YSk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPnJpY0RhdGEgPSBOVUxMOworICAgIH0KKyAgICBpZihwQXNzb2NSc3AtPnJpY1ByZXNlbnQpCisgICAgeworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5SSUNEYXRhTGVuID0gcEFzc29jUnNwLT5udW1fUklDRGF0YSAqIHNpemVvZih0RG90MTFmSUVSSUNEYXRhRGVzYyk7CisgICAgICAgIGlmKCAocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKikmcHNlc3Npb25FbnRyeS0+cmljRGF0YSwgcHNlc3Npb25FbnRyeS0+UklDRGF0YUxlbikpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBhc3NvYyByZXNwb25zZSIpKTspCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5SSUNEYXRhTGVuID0gMDsgCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPnJpY0RhdGEsICZwQXNzb2NSc3AtPlJJQ0RhdGFbMF0sIHBzZXNzaW9uRW50cnktPlJJQ0RhdGFMZW4pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBzZXNzaW9uRW50cnktPlJJQ0RhdGFMZW4gPSAwOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5yaWNEYXRhID0gTlVMTDsKKyAgICB9CisjZW5kaWYgICAgCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYICAgIAorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT50c3BlY0llcyAhPSBOVUxMKSAKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+dHNwZWNJZXMpOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT50c3BlY0llcyA9IE5VTEw7CisgICAgfQorICAgIGlmKHBBc3NvY1JzcC0+dHNwZWNQcmVzZW50KQorICAgIHsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+dHNwZWNMZW4gPSBwQXNzb2NSc3AtPm51bV90c3BlY3MgKiBzaXplb2YodERvdDExZklFV01NVFNQRUMpOworICAgICAgICBpZiggKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKiopJnBzZXNzaW9uRW50cnktPnRzcGVjSWVzLCBwc2Vzc2lvbkVudHJ5LT50c3BlY0xlbikpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBhc3NvYyByZXNwb25zZSIpKTspCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT50c3BlY0xlbiA9IDA7IAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT50c3BlY0llcywgJnBBc3NvY1JzcC0+VFNQRUNJbmZvWzBdLCBwc2Vzc2lvbkVudHJ5LT50c3BlY0xlbik7CisgICAgICAgIH0KKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiIFRzcGVjIEVJRCBwcmVzZW50IGluIGFzc29jIHJzcCAiKSk7KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwc2Vzc2lvbkVudHJ5LT50c3BlY0xlbiA9IDA7CisgICAgICAgIHBzZXNzaW9uRW50cnktPnRzcGVjSWVzID0gTlVMTDsKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiIFRzcGVjIEVJRCAqTk9UKiBwcmVzZW50IGluIGFzc29jIHJzcCAiKSk7KQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8uaWJzcykKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWNlaXZlZCBSZS9Bc3NvY2lhdGlvbiBSZXNwb25zZSBmcm9tIHBlZXIKKyAgICAgICAgICogd2l0aCBJQlNTIGNhcGFiaWxpdHkgc2V0LgorICAgICAgICAgKiBJZ25vcmUgdGhlIGZyYW1lIGFuZCB3YWl0IHVudGlsIFJlL2Fzc29jCisgICAgICAgICAqIGZhaWx1cmUgdGltZW91dC4KKyAgICAgICAgICovCisgICAgICAgIAorICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgUmUvQXNzb2NSc3AgZnJhbWUgd2l0aCBJQlNTIGNhcGFiaWxpdHlcbiIpKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQXNzb2NSc3ApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNmZ0dldENhcGFiaWxpdHlJbmZvKHBNYWMsICZjYXBzLHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IENhcGFiaWxpdGllcyB2YWx1ZQorICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgKi8gICAgICAgICAKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQXNzb2NSc3ApOworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBDYXBhYmlsaXRpZXMgdmFsdWVcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsaW1Db3B5VTE2KCh0QU5JX1U4ICopICZsb2NhbENhcGFiaWxpdGllcywgY2Fwcyk7CisKKyAgICBpZiAoc3ViVHlwZSA9PSBMSU1fQVNTT0MpICAgICAgICAvLyBTdG9wIEFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIKKyAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fQVNTT0NfRkFJTF9USU1FUik7CisgICAgZWxzZSAgICAgICAgLy8gU3RvcCBSZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIKKyAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fUkVBU1NPQ19GQUlMX1RJTUVSKTsKKworICAgIGlmIChwQXNzb2NSc3AtPnN0YXR1c0NvZGUgIT0gZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMpCisgICAgeworICAgICAgICAvLyBSZS9Bc3NvY2lhdGlvbiByZXNwb25zZSB3YXMgcmVjZWl2ZWQKKyAgICAgICAgLy8gZWl0aGVyIHdpdGggZmFpbHVyZSBjb2RlLgorICAgICAgICAvLyBMb2cgZXJyb3IuCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoInJlY2VpdmVkIFJlL0Fzc29jUnNwIGZyYW1lIGZhaWx1cmUgY29kZSAlZFxuIiksIHBBc3NvY1JzcC0+c3RhdHVzQ29kZSk7KQorICAgICAgICAvLyBOZWVkIHRvIHVwZGF0ZSAnYXNzb2NpYXRpb24gZmFpbHVyZScgZXJyb3IgY291bnRlcgorICAgICAgICAvLyBhbG9uZyB3aXRoIFNUQVRVUyBDT0RFCisKKyAgICAgICAgLy8gUmV0dXJuIEFzc29jIGNvbmZpcm0gdG8gU01FIHdpdGggcmVjZWl2ZWQgZmFpbHVyZSBjb2RlCisKKyAgICAgICAgaWYgKHBBc3NvY1JzcC0+cHJvcElFaW5mby5sb2FkQmFsYW5jZUluZm9QcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfVFJBTlNGRVJfU1RBOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1BbHRlcm5hdGVSYWRpby5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEFzc29jUnNwLT5wcm9wSUVpbmZvLmFsdGVybmF0ZVJhZGlvLmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQWx0ZXJuYXRlUmFkaW8uY2hhbm5lbElkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEFzc29jUnNwLT5wcm9wSUVpbmZvLmFsdGVybmF0ZVJhZGlvLmNoYW5uZWxJZDsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIG1sbUFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9BU1NPQ19SRUZVU0VEOworCisgICAgICAgIC8vIERlbGV0ZSBQcmUtYXV0aCBjb250ZXh0IGZvciB0aGUgYXNzb2NpYXRlZCBCU1MKKyAgICAgICAgaWYgKGxpbVNlYXJjaFByZUF1dGhMaXN0KHBNYWMsIHBIZHItPnNhKSkKKyAgICAgICAgICAgIGxpbURlbGV0ZVByZUF1dGhOb2RlKHBNYWMsIHBIZHItPnNhKTsKKworICAgICAgICBnb3RvIGFzc29jUmVqZWN0OworICAgIH0KKyAgICBlbHNlIGlmICgocEFzc29jUnNwLT5haWQgJiAweDNGRkYpID4gMjAwNykKKyAgICB7CisgICAgICAgIC8vIFJlL0Fzc29jaWF0aW9uIHJlc3BvbnNlIHdhcyByZWNlaXZlZAorICAgICAgICAvLyB3aXRoIGludmFsaWQgQUlEIHZhbHVlCisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJyZWNlaXZlZCBSZS9Bc3NvY1JzcCBmcmFtZSB3aXRoIGludmFsaWQgYWlkICVYIFxuIiksICBwQXNzb2NSc3AtPmFpZCk7KQorICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9BU1NPQ19SU1BfUlhFRDsKKyAgICAgICAgbWxtQXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisKKyAgICAgICAgLy8gU2VuZCBhZHZpc29yeSBEaXNhc3NvY2lhdGlvbiBmcmFtZSB0byBBUAorICAgICAgICBsaW1TZW5kRGlzYXNzb2NNZ210RnJhbWUocE1hYywgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OLCBwSGRyLT5zYSxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICBnb3RvIGFzc29jUmVqZWN0OworICAgIH0KKyAgICAvLyBBc3NvY2lhdGlvbiBSZXNwb25zZSByZWNlaXZlZCB3aXRoIHN1Y2Nlc3MgY29kZQorCisgICAgaWYgKHN1YlR5cGUgPT0gTElNX1JFQVNTT0MpCisgICAgeworICAgICAgICAvLyBMb2cgc3VjY2VzcworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTdWNjZXNzZnVsbHkgUmVhc3NvY2lhdGVkIHdpdGggQlNTXG4iKSk7KQorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgeworICAgICAgICAgICAgdEFOSV9VOCBjbnQgPSAwOworICAgICAgICAgICAgaWYgKHBBc3NvY1JzcC0+dHNtUHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgIlRTTSBJRSBQcmVzZW50IGluIFJlYXNzb2MgUnNwXG4iKTsKKyAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgVFNNICB0aW1lciBvbmx5IGlmIHRoZSBUU1BFQyBJZSBpcyBwcmVzZW50IGluIHRoZSByZWFzc29jIHJzcAorICAgICAgICAgICAgICAgIGlmIChwQXNzb2NSc3AtPnRzcGVjUHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBUU1BFQyBJRSB3aXRoIFZPIHVzZXIgcHJpb3JpdHkKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjbnQ9MDsgY250PHBBc3NvY1JzcC0+bnVtX3RzcGVjczsgY250KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdXBUb0FjKHBBc3NvY1JzcC0+VFNQRUNJbmZvW2NudF0udXNlcl9wcmlvcml0eSkgPT0gRURDQV9BQ19WTykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmNjeENvbnRleHQudHNtLnRpZCA9IHBBc3NvY1JzcC0+VFNQRUNJbmZvW2NudF0udXNlcl9wcmlvcml0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBzZXNzaW9uRW50cnktPmNjeENvbnRleHQudHNtLnRzbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFzc29jUnNwLT50c21JRSwgc2l6ZW9mKHRTaXJNYWNDQ1hUU01JRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUFjdGl2YXRlVFNNU3RhdHNUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5jY3hDb250ZXh0LnRzbS50c21JbmZvLnN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmNjeENvbnRleHQudHNtLnRzbU1ldHJpY3MuUm9hbWluZ0NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICJUU00gcHJlc2VudCBidXQgVFNQRUMgSUUgbm90IHByZXNlbnQgaW4gUmVhc3NvYyBSc3BcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEpOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltQXNzb2NSZXNwb25zZURhdGEgID0gKHZvaWQgKikgcEFzc29jUnNwOyAvKiogU3RvcmUgdGhlIFJlQXNzb2NSc3AgRnJhbWUgaW4gRHBoVGFibGUgdG8gYmUgdXNlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIHByb2Nlc3NpbmcgRGVsU3RhIG5kIERlbEJzcyB0byBzZW5kIEFkZEJzcyBhZ2FpbiovCisgICAgICAgIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisgICAgICAgIGlmKCFwU3RhRHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HMSwgRkwoImNvdWxkIG5vdCBnZXQgaGFzaCBlbnRyeSBhdCBEUEggZm9yIFxuIikpOykKKyAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HRSk7CisgICAgICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9BU1NPQ19SU1BfUlhFRDsKKyAgICAgICAgICAgIG1sbUFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTZW5kIGFkdmlzb3J5IERpc2Fzc29jaWF0aW9uIGZyYW1lIHRvIEFQCisgICAgICAgICAgICBsaW1TZW5kRGlzYXNzb2NNZ210RnJhbWUocE1hYywgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OLCBwSGRyLT5zYSxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZ290byBhc3NvY1JlamVjdDsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX0ZUX1JFQVNTT0NfUlNQX1NUQVRFKQorICAgICAgICB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNlbmRpbmcgc2VsZiBzdGFcbiIpKTspCisjZW5kaWYKKyAgICAgICAgICAgIHBtbVJlc2V0UG1tU3RhdGUocE1hYyk7CisKKyAgICAgICAgICAgIGxpbVVwZGF0ZUFzc29jU3RhRGF0YXMocE1hYywgcFN0YURzLCBwQXNzb2NSc3AscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIGFzc2lnbmVkIEFJRCBmb3IgVElNIHByb2Nlc3NpbmcKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbUFJRCA9IHBBc3NvY1JzcC0+YWlkICYgMHgzRkZGOworCisgICAgICAgICAgICBsaW1BZGRGVFN0YVNlbGYocE1hYywgKHBBc3NvY1JzcC0+YWlkICYgMHgzRkZGKSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKyAgICAgICAgLyogSWYgd2UncmUgcmUtYXNzb2NpYXRpbmcgdG8gdGhlIHNhbWUgQlNTLCB3ZSBkb24ndCB3YW50IHRvIGludm9rZSBkZWxldGUKKyAgICAgICAgICogU1RBLCBkZWxldGUgQlNTLCBhcyB0aGF0IHdvdWxkIHJlbW92ZSB0aGUgYWxyZWFkeSBlc3RhYmxpc2hlZCBUU1BFQy4gIAorICAgICAgICAgKiBKdXN0IGdvIGFoZWFkIGFuZCByZS1hZGQgdGhlIEJTUywgU1RBIHdpdGggbmV3IGNhcGFiaWxpdHkgaW5mb3JtYXRpb24uIAorICAgICAgICAgKiBIb3dldmVyLCBpZiB3ZSdyZSByZS1hc3NvY2lhdGluZyB0byBhIGRpZmZlcmVudCBCU1MsIHRoZW4gZm9sbG93IHRocnUKKyAgICAgICAgICogd2l0aCBkZWwgU1RBLCBkZWwgQlNTLCBhZGQgQlNTLCBhZGQgU1RBLiAgICAgICAKKyAgICAgICAgICovCisgICAgICAgIGlmIChzaXJDb21wYXJlTWFjQWRkciggcHNlc3Npb25FbnRyeS0+YnNzSWQsIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCkpCisgICAgICAgICAgICBsaW1IYW5kbGVBZGRCc3NJblJlQXNzb2NDb250ZXh0KHBNYWMsIHBTdGFEcywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHVhcHNkIG1hc2sgc2V0dGluZ3Mgc2luY2Ugd2UncmUgcmUtYXNzb2NpYXRpbmcgdG8gbmV3IEFQCisgICAgICAgICAgICBwTWFjLT5saW0uZ1VhcHNkUGVyQWNEZWxpdmVyeUVuYWJsZU1hc2sgPSAwOworICAgICAgICAgICAgcE1hYy0+bGltLmdVYXBzZFBlckFjVHJpZ2dlckVuYWJsZU1hc2sgPSAwOworCisgICAgICAgICAgICBpZiAobGltQ2xlYW51cFJ4UGF0aChwTWFjLCBwU3RhRHMscHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIGdvdG8gYXNzb2NSZWplY3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIExvZyBzdWNjZXNzCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU3VjY2Vzc2Z1bGx5IEFzc29jaWF0ZWQgd2l0aCBCU1NcbiIpKTspCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIGlmKHBzZXNzaW9uRW50cnktPmNjeENvbnRleHQudHNtLnRzbUluZm8uc3RhdGUpCisgICAgeworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5jY3hDb250ZXh0LnRzbS50c21NZXRyaWNzLlJvYW1pbmdDb3VudCA9IDA7CisgICAgfQorI2VuZGlmCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgZm9yIFBNTSBtb2R1bGUKKyAgICAgKi8KKyAgICBwbW1SZXNldFBtbVN0YXRlKHBNYWMpOworCisgICAgLy8gU3RvcmUgYXNzaWduZWQgQUlEIGZvciBUSU0gcHJvY2Vzc2luZworICAgIHBzZXNzaW9uRW50cnktPmxpbUFJRCA9IHBBc3NvY1JzcC0+YWlkICYgMHgzRkZGOworCisKKyAgICAvL1NUQSBlbnRyeSB3YXMgY3JlYXRlZCBkdXJpbmcgcHJlLWFzc29jIHN0YXRlLgorICAgIGlmICgocFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSkpID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgLy8gQ291bGQgbm90IGFkZCBoYXNoIHRhYmxlIGVudHJ5CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCBnZXQgaGFzaCBlbnRyeSBhdCBEUEggZm9yIFxuIikpOykKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0dFKTsKKworICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworICAgICAgICBtbG1Bc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgICAgIAorCisgICAgICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsIExJTV9NTE1fQVNTT0NfQ05GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopICZtbG1Bc3NvY0NuZik7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEFzc29jUnNwKTsgCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAKKyAgICAgLy8gRGVsZXRlIFByZS1hdXRoIGNvbnRleHQgZm9yIHRoZSBhc3NvY2lhdGVkIEJTUworICAgIGlmIChsaW1TZWFyY2hQcmVBdXRoTGlzdChwTWFjLCBwSGRyLT5zYSkpCisgICAgICAgIGxpbURlbGV0ZVByZUF1dGhOb2RlKHBNYWMsIHBIZHItPnNhKTsKKworICAgIGxpbVVwZGF0ZUFzc29jU3RhRGF0YXMocE1hYywgcFN0YURzLCBwQXNzb2NSc3AscHNlc3Npb25FbnRyeSk7CisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQKKyAgICAvLyBFeHRyYWN0IHRoZSBBUCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgYmVhY29uIHRoYXQgd2FzIHJlY2VpdmVkIGVhcmxpZXIKKyAgICAvLyBUT0RPIC0gV2F0Y2ggb3V0IGZvciBhbiBlcnJvciByZXNwb25zZSEKKyAgICBsaW1FeHRyYWN0QXBDYXBhYmlsaXRpZXMoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmllRmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUdldElFbGVuRnJvbUJzc0Rlc2NyaXB0aW9uKCAmcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJlYWNvblN0cnVjdCApOworCisgICAgaWYocE1hYy0+bGltLmdMaW1Qcm90ZWN0aW9uQ29udHJvbCAhPSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0RJU0FCTEUpCisgICAgICAgIGxpbURlY2lkZVN0YVByb3RlY3Rpb25PbkFzc29jKHBNYWMsICZiZWFjb25TdHJ1Y3QsIHBzZXNzaW9uRW50cnkpOworICAgIAorICAgIGlmKGJlYWNvblN0cnVjdC5lcnBQcmVzZW50KSB7CisgICAgICAgIGlmIChiZWFjb25TdHJ1Y3QuZXJwSUVJbmZvLmJhcmtlclByZWFtYmxlTW9kZSkKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZSA9IGZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGUgPSB0cnVlOworICAgIH0KKworCisgICAgIC8vVXBkYXRlIHRoZSBCU1MgRW50cnksIHRoaXMgZW50cnkgd2FzIGFkZGVkIGR1cmluZyBwcmVhc3NvYy4KKyAgICBpZiggZVNJUl9TVUNDRVNTID09IGxpbVN0YVNlbmRBZGRCc3MoIHBNYWMsIHBBc3NvY1JzcCwgICZiZWFjb25TdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgJnBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbiwgdHJ1ZSwgcHNlc3Npb25FbnRyeSkpICAKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEFzc29jUnNwKTsgICAKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworICAgICAgICBtbG1Bc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKyAgICB9CisKKyNlbGlmIGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgaWYoIGVTSVJfU1VDQ0VTUyA9PSBsaW1TdGFTZW5kQWRkQnNzKCBwTWFjLCAqcEFzc29jUnNwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPm5laWdoYm9yQnNzTGlzdC5ic3NMaXN0WzBdLCB0cnVlKSkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEFzc29jUnNwKTsgICAKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworICAgICAgICBtbG1Bc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKyAgICB9CisjZWxzZQorICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEFzc29jUnNwKTsgICAKKyAgICByZXR1cm47CisjZW5kaWYKKyAgCisKK2Fzc29jUmVqZWN0OgorICAgIGlmICgoc3ViVHlwZSA9PSBMSU1fQVNTT0MpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgICAgICAgICAgICAgfHwgKChzdWJUeXBlID09IExJTV9SRUFTU09DKSAmJiAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfRlRfUkVBU1NPQ19SU1BfU1RBVEUpKQorI2VuZGlmCisgICAgICAgKSB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgIEZMKCJBc3NvYyBSZWplY3RlZCBieSB0aGUgcGVlci4gUmVhc29uOiAlZFxuIiksIG1sbUFzc29jQ25mLnJlc3VsdENvZGUpOykKKyAgICAgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0lETEVfU1RBVEU7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworCisgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEpOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmKGxpbVNldExpbmtTdGF0ZShwTWFjLCBlU0lSX0xJTktfSURMRV9TVEFURSxwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgCisgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsIE5VTEwsIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgIEZMKCJGYWlsZWQgdG8gc2V0IHRoZSBMaW5rU3RhdGVcbiIpKTspCisgICAgICAgIGlmIChzdWJUeXBlID09IExJTV9BU1NPQykKKyAgICAgICAgeworICAgICAgICAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX0FTU09DX0NORiwgKHRBTklfVTMyICopICZtbG1Bc3NvY0NuZik7CisgICAgICAgIH0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfRlRfUkVBU1NPQ19GQUlMVVJFOworICAgICAgICAgICAgICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsIExJTV9NTE1fUkVBU1NPQ19DTkYsICh0QU5JX1UzMiAqKSAmbWxtQXNzb2NDbmYpOworICAgICAgICB9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBsaW1SZXN0b3JlUHJlUmVhc3NvY1N0YXRlKCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgIGVTSVJfU01FX1JFQVNTT0NfUkVGVVNFRCwgbWxtQXNzb2NDbmYucHJvdFN0YXR1c0NvZGUscHNlc3Npb25FbnRyeSk7IAorICAgIH0KKworICAgIC8qIENSOiB2b3MgcGFja2V0IG1lbW9yeSBpcyBsZWFrZWQgd2hlbiBhc3NvYyByc3AgdGltZW91dGVkL2ZhaWxlZC4gKi8KKyAgICAvKiBub3RpZnkgVEwgdGhhdCBhc3NvY2lhdGlvbiBpcyBmYWlsZWQgc28gdGhhdCBUTCBjYW4gZmx1c2ggdGhlIGNhY2hlZCBmcmFtZSAgKi8KKyAgICBXTEFOVExfQXNzb2NGYWlsZWQgKHBzZXNzaW9uRW50cnktPnN0YUlkKTsKKworCisgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQXNzb2NSc3ApOyAgICAgIAorICAgIHJldHVybjsKK30gLyoqKiBlbmQgbGltUHJvY2Vzc0Fzc29jUnNwRnJhbWUoKSAqKiovCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0F1dGhGcmFtZS5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzQXV0aEZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmZDgxOAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0F1dGhGcmFtZS5jCkBAIC0wLDAgKzEsMTc0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1Qcm9jZXNzQXV0aEZyYW1lLmNjIGNvbnRhaW5zIHRoZSBjb2RlCisgKiBmb3IgcHJvY2Vzc2luZyByZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBGcmFtZS4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAzLzExLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIDA1LzEyLzIwMTAgICAgIGpzICAgICAgICAgICAgIFRvIHN1cHBvcnQgU2hhcmVkIGtleSBhdXRoZW50aWNhdGlvbiBhdCBBUCBzaWRlCisgKgorICovCisKKyNpbmNsdWRlICJ3bmlBcGkuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsRGF0YVN0cnVjdC5oIgorI2VuZGlmCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNlbHNlCisjaW5jbHVkZSAid25pQ2ZnU3RhLmgiCisjZW5kaWYKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJjZmdBcGkuaCIKKworI2luY2x1ZGUgInV0aWxzQXBpLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VjdXJpdHlVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlICJsaW1GVC5oIgorI2VuZGlmCisjaW5jbHVkZSAidm9zX3V0aWxzLmgiCisKKworLyoqCisgKiBpc0F1dGhWYWxpZAorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzQXV0aEZyYW1lKCkgdXBvbiBBdXRoZW50aWNhdGlvbgorICogZnJhbWUgcmVjZXB0aW9uLgorICoKKyAqTE9HSUM6CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdGVzdCB2YWxpZGl0eSBvZiBhdXRoIGZyYW1lOgorICogLSBBVVRIMSBhbmQgQVVUSDMgbXVzdCBiZSByZWNlaXZlZCBpbiBBUCBtb2RlCisgKiAtIEFVVEgyIGFuZCBBVVRINCBtdXN0IGJlIHJlY2VpdmVkIGluIFNUQSBtb2RlCisgKiAtIEFVVEgzIGFuZCBBVVRINCBtdXN0IGhhdmUgY2hhbGxlbmdlIHRleHQgSUUsIHRoYXQgaXMsJ3R5cGUnIGZpZWxkIGhhcyBiZWVuIHNldCB0bworICogICAgICAgICAgICAgICAgIFNJUl9NQUNfQ0hBTExFTkdFX1RFWFRfRUlEIGJ5IHBhcnNlcgorICogLQorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgKmF1dGggLSBQb2ludGVyIHRvIGV4dHJhY3RlZCBhdXRoIGZyYW1lIGJvZHkKKyAqCisgKiBAcmV0dXJuIDAgb3IgMSAoVmFsaWQpCisgKi8KKworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpc0F1dGhWYWxpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1hY0F1dGhGcmFtZUJvZHkgYXV0aCx0cFBFU2Vzc2lvbiBzZXNzaW9uRW50cnkpIHsKKyAgICB1bnNpZ25lZCBpbnQgdmFsaWQ7CisgICAgdmFsaWQ9MTsKKworICAgIGlmICggICgoYXV0aC0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyPT1TSVJfTUFDX0FVVEhfRlJBTUVfMSl8fAorICAgICAgICAgICAoYXV0aC0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyPT1TSVJfTUFDX0FVVEhfRlJBTUVfMykpICYmCisgICAgICAgICAgKChzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSl8fChzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpKSkKKyAgICAgICAgdmFsaWQ9MDsKKworICAgIGlmICggKChhdXRoLT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXI9PVNJUl9NQUNfQVVUSF9GUkFNRV8yKXx8KGF1dGgtPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlcj09U0lSX01BQ19BVVRIX0ZSQU1FXzQpKSYmCisgICAgICAgICAoKHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpfHwoc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpKSkKKyAgICAgICAgdmFsaWQ9MDsKKworICAgIGlmICggKChhdXRoLT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXI9PVNJUl9NQUNfQVVUSF9GUkFNRV8zKXx8KGF1dGgtPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlcj09U0lSX01BQ19BVVRIX0ZSQU1FXzQpKSYmCisgICAgICAgICAoYXV0aC0+dHlwZSE9U0lSX01BQ19DSEFMTEVOR0VfVEVYVF9FSUQpJiYoYXV0aC0+YXV0aEFsZ29OdW1iZXIgIT0gZVNJUl9TSEFSRURfS0VZKSkKKyAgICAgICAgdmFsaWQ9MDsKKworICAgIHJldHVybiB2YWxpZDsKK30KKworCisvKioKKyAqIGxpbVByb2Nlc3NBdXRoRnJhbWUKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpIHVwb24gQXV0aGVudGljYXRpb24KKyAqIGZyYW1lIHJlY2VwdGlvbi4KKyAqCisgKkxPR0lDOgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgcmVjZWl2ZWQgQXV0aGVudGljYXRpb24gZnJhbWUgYW5kIHJlc3BvbmRzCisgKiB3aXRoIGVpdGhlciBuZXh0IEF1dGhlbnRpY2F0aW9uIGZyYW1lIGluIHNlcXVlbmNlIHRvIHBlZXIgTUFDIGVudGl0eQorICogb3IgTElNX01MTV9BVVRIX0lORCBvbiBBUCBvciBMSU1fTUxNX0FVVEhfQ05GIG9uIFNUQS4KKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqIDEuIEF1dGhlbnRpY2F0aW9uIGZhaWx1cmVzIGFyZSByZXBvcnRlZCB0byBTTUUgd2l0aCBzYW1lIHN0YXR1cyBjb2RlCisgKiAgICByZWNlaXZlZCBmcm9tIHRoZSBwZWVyIE1BQyBlbnRpdHkuCisgKiAyLiBBdXRoZW50aWNhdGlvbiBmcmFtZTIvNCByZWNlaXZlZCB3aXRoIGFsb2dpcnRobSBudW1iZXIgb3RoZXIgdGhhbgorICogICAgb25lIHJlcXVlc3RlZCBpbiBmcmFtZTEvMyBhcmUgbG9nZ2VkIHdpdGggYW4gZXJyb3IgYW5kIGF1dGggY29uZmlybQorICogICAgd2lsbCBiZSBzZW50IHRvIFNNRSBvbmx5IGFmdGVyIGF1dGggZmFpbHVyZSB0aW1lb3V0LgorICogMy4gSW5jb25zaXN0ZW5jeSBpbiB0aGUgc3BlYzoKKyAqICAgIE9uIHJlY2VpdmluZyBBdXRoIGZyYW1lMiwgc3BlY3Mgc2F5cyB0aGF0IGlmIFdFUCBrZXkgbWFwcGluZyBrZXkKKyAqICAgIG9yIGRlZmF1bHQga2V5IGlzIE5VTEwsIEF1dGggZnJhbWUzIHdpdGggYSBzdGF0dXMgY29kZSAxNSAoY2hhbGxlbmdlCisgKiAgICBmYWlsdXJlIHRvIGJlIHJldHVybmVkIHRvIHBlZXIgZW50aXR5LiBIb3dldmVyLCBzZWN0aW9uIDcuMi4zLjEwLAorICogICAgdGFibGUgMTQgc2F5cyB0aGF0IHN0YXR1cyBjb2RlIGZpZWxkIGlzICdyZXNlcnZlZCcgZm9yIGZyYW1lMyAhCisgKiAgICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgQXV0aCBmcmFtZTMgaXMgcmV0dXJuZWQgd2l0aCBzdGF0dXMKKyAqICAgIGNvZGUgMTUgb3ZlcnJpZGluZyBzZWN0aW9uIDcuMi4zLjEwLgorICogNC4gSWYgbnVtYmVyIHByZS1hdXRoZW50aWNhdGlvbnMgcmVhY2ggY29uZmlncmFibGUgbWF4IGxpbWl0LAorICogICAgQXV0aGVudGljYXRpb24gZnJhbWUgd2l0aCAndW5zcGVjaWZpZWQgZmFpbHVyZScgc3RhdHVzIGNvZGUgaXMKKyAqICAgIHJldHVybmVkIHRvIHJlcXVlc3RpbmcgZW50aXR5LgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBSeFBhY2tldEluZm8gLSBBIHBvaW50ZXIgdG8gUnggcGFja2V0IGluZm8gc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1Qcm9jZXNzQXV0aEZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8sIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgKnBCb2R5LCBrZXlJZCwgY2ZnUHJpdmFjeU9wdEltcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0S2V5W1NJUl9NQUNfS0VZX0xFTkdUSF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jckF1dGhGcmFtZVtMSU1fRU5DUl9BVVRIX0JPRFlfTEVOXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbkJvZHlbMjU2XTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBmcmFtZUxlbjsKKyAgICAvL3RBTklfVTMyICAgICAgICAgICAgICAgIGF1dGhSc3BUaW1lb3V0LCBtYXhOdW1QcmVBdXRoLCB2YWw7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgbWF4TnVtUHJlQXV0aCwgdmFsOworICAgIHRTaXJNYWNBdXRoRnJhbWVCb2R5ICAgICpwUnhBdXRoRnJhbWVCb2R5LCByeEF1dGhGcmFtZSwgYXV0aEZyYW1lOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgIHBIZHI7CisgICAgdENmZ1dlcEtleUVudHJ5ICAgICAgICAgKnBLZXlNYXBFbnRyeSA9IE5VTEw7CisgICAgc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAgKnBBdXRoTm9kZTsKKyAgICB0TGltTWxtQXV0aEluZCAgICAgICAgICBtbG1BdXRoSW5kOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGRlY3J5cHRSZXN1bHQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgKnBDaGFsbGVuZ2U7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAga2V5X2xlbmd0aD04OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGNoYWxsZW5nZVRleHRBcnJheVtTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX0xFTkdUSF07CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHRwRHBoSGFzaE5vZGUgICAgICAgICAgIHBTdGFEcyA9IE5VTEw7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgYXNzb2NJZCA9IDA7CisjZW5kaWYKKyAgICAvKiBBZGRlZCBGb3IgQlQgLUFNUCBzdXBwb3J0ICovCisgICAgLy8gR2V0IHBvaW50ZXIgdG8gQXV0aGVudGljYXRpb24gZnJhbWUgaGVhZGVyIGFuZCBib2R5CisgCisKKyAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworICAgIGZyYW1lTGVuID0gV0RBX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKTsKKyAgICAKKworICAgIGlmICghZnJhbWVMZW4pCisgICAgeworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXV0aGVudGljYXRpb24gZnJhbWUgd2l0aCBubyBib2R5IGZyb20gIikpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPR0UpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobGltSXNHcm91cEFkZHIocEhkci0+c2EpKQorICAgIHsKKyAgICAgICAgLy8gUmVjZWl2ZWQgQXV0aCBmcmFtZSBmcm9tIGEgQkMvTUMgYWRkcmVzcworICAgICAgICAvLyBMb2cgZXJyb3IgYW5kIGlnbm9yZSBpdAorICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXV0aCBmcmFtZSBmcm9tIGEgQkMvTUMgYWRkcmVzcyAtICIpKTspCisgICAgICAgUEVMT0cxKCBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKworICAgIFBFTE9HMyhzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0czLCAodEFOSV9VOCopcEJkLCAoKHRwSGFsQnVmRGVzYykgcEJkKS0+bXBkdURhdGFPZmZzZXQgKyBmcmFtZUxlbik7KQorCisKKyAgIAorICAgIC8vLyBEZXRlcm1pbmUgaWYgV0VQIGJpdCBpcyBzZXQgaW4gdGhlIEZDIG9yIHJlY2VpdmVkIE1BQyBoZWFkZXIKKyAgICBpZiAocEhkci0+ZmMud2VwKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdFUCBiaXQgaXMgc2V0IGluIEZDIG9mIE1BQyBoZWFkZXIuCisgICAgICAgICAqLworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAvLyBJZiBUS0lQIGNvdW50ZXIgbWVhc3VyZXMgZW5hYmxlZCBpc3N1ZSBEZWF1dGggZnJhbWUgdG8gc3RhdGlvbgorICAgICAgICBpZiAoKHBzZXNzaW9uRW50cnktPmJUa2lwQ250ck1lYXNBY3RpdmUpICYmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRSggbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgiVGtpcCBjb3VudGVyIG1lYXN1cmVzIEVuYWJsZWQsIHNlbmRpbmcgRGVhdXRoIGZyYW1lIHRvIikpOyApCisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPR0UpOworCisgICAgICAgICAgICBsaW1TZW5kRGVhdXRoTWdtdEZyYW1lKCBwTWFjLCBlU0lSX01BQ19NSUNfRkFJTFVSRV9SRUFTT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwgcHNlc3Npb25FbnRyeSApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvLyBFeHRyYWN0IGtleSBJRCBmcm9tIElWIChtb3N0IDIgYml0cyBvZiA0dGggYnl0ZSBvZiBJVikKKworICAgICAgICBrZXlJZCA9ICgqKHBCb2R5ICsgMykpID4+IDY7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9uIFNUQSBpbiBpbmZyYXN0cnVjdHVyZSBCU1MsIEF1dGhlbnRpY2F0aW9uIGZyYW1lcyByZWNlaXZlZAorICAgICAgICAgKiB3aXRoIFdFUCBiaXQgc2V0IGluIHRoZSBGQyBtdXN0IGJlIHJlamVjdGVkIHdpdGggY2hhbGxlbmdlCisgICAgICAgICAqIGZhaWx1cmUgc3RhdHVzIGNvZGUgKHdpZXJkIHRoaW5nIGluIHRoZSBzcGVjIC0gdGhpcyBzaG91bGQgaGF2ZQorICAgICAgICAgKiBiZWVuIHJlamVjdGVkIHdpdGggdW5zcGVjaWZpZWQgZmFpbHVyZSBvciB1bmV4cGVjdGVkIGFzc2VydGlvbgorICAgICAgICAgKiBvZiB3ZXAgYml0ICh0aGlzIHN0YXR1cyBjb2RlIGRvZXMgbm90IGV4aXN0IHRob3VnaCkgb3IKKyAgICAgICAgICogT3V0LW9mLXNlcXVlbmNlLUF1dGhlbnRpY2F0aW9uLUZyYW1lIHN0YXR1cyBjb2RlLgorICAgICAgICAgKi8KKworICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFIHx8IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfU0hBUkVEX0tFWTsKKyAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPSBTSVJfTUFDX0FVVEhfRlJBTUVfNDsKKyAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9IGVTSVJfTUFDX0NIQUxMRU5HRV9GQUlMVVJFX1NUQVRVUzsKKworICAgICAgICAgICAgbGltU2VuZEF1dGhNZ210RnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX05PX1dFUF9JTl9GQyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZSB3aXRoIHdlcCBiaXQgc2V0IG9uIHJvbGU9JWQgZnJvbSAiKSwKKyAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICk7CisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lTGVuIDwgTElNX0VOQ1JfQVVUSF9CT0RZX0xFTikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICBGTCgiTm90IGVub3VnaCBzaXplIFslZF0gdG8gZGVjcnlwdCByZWNlaXZlZCBBdXRoIGZyYW1lIiksCisgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4pOworICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0dFKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsID0gcHNlc3Npb25FbnRyeS0+cHJpdmFjeTsgCisgICAgICAgIH0gCisgICAgICAgIGVsc2UgCisjZW5kaWYKKyAgICAgICAgLy8gQWNjZXB0IEF1dGhlbnRpY2F0aW9uIGZyYW1lIG9ubHkgaWYgUHJpdmFjeSBpcyBpbXBsZW1lbnRlZAorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QUklWQUNZX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgICAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENvdWxkIG5vdCBnZXQgUHJpdmFjeSBvcHRpb24KKyAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIFByaXZhY3kgb3B0aW9uXG4iKSk7CisgICAgICAgIH0KKworICAgICAgICBjZmdQcml2YWN5T3B0SW1wID0gKHRBTklfVTgpdmFsOworICAgICAgICBpZiAoY2ZnUHJpdmFjeU9wdEltcCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBQcml2YWN5IG9wdGlvbiBpcyBpbXBsZW1lbnRlZC4KKyAgICAgICAgICAgICAqIENoZWNrIGlmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICogZnJhbWUzIGFuZCB0aGVyZSBpcyBhIGNvbnRleHQgZm9yIHJlcXVlc3RpbmcgU1RBLgorICAgICAgICAgICAgICogSWYgbm90LCByZWplY3Qgd2l0aCB1bnNwZWNpZmllZCBmYWlsdXJlIHN0YXR1cyBjb2RlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBBdXRoTm9kZSA9IGxpbVNlYXJjaFByZUF1dGhMaXN0KHBNYWMsIHBIZHItPnNhKTsKKworICAgICAgICAgICAgaWYgKHBBdXRoTm9kZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIE5vICdwcmUtYXV0aCcgY29udGV4dCBleGlzdHMgZm9yIHRoaXMgU1RBIHRoYXQgc2VudAorICAgICAgICAgICAgICAgICAqIGFuIEF1dGhlbnRpY2F0aW9uIGZyYW1lIHdpdGggRkMgYml0IHNldC4KKyAgICAgICAgICAgICAgICAgKiBTZW5kIEF1dGggZnJhbWU0IHdpdGggJ291dCBvZiBzZXF1ZW5jZScgc3RhdHVzIGNvZGUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0gZVNJUl9TSEFSRURfS0VZOworICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorICAgICAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9GUkFNRV80OworICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisgICAgICAgICAgICAgICAgZVNJUl9NQUNfQVVUSF9GUkFNRV9PVVRfT0ZfU0VRX1NUQVRVUzsKKworICAgICAgICAgICAgICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX05PX1dFUF9JTl9GQyxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lIGZyb20gcGVlciB0aGF0IGhhcyBubyBwcmVhdXRoIGNvbnRleHQgd2l0aCBXRVAgYml0IHNldC4gQWRkciAiKSk7KQorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLy8gQ2hhbmdlIHRoZSBhdXRoLXJlc3BvbnNlIHRpbWVvdXQKKyAgICAgICAgICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlUGVyU3RhSWRUaW1lcihwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fQVVUSF9SU1BfVElNRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhOb2RlLT5hdXRoTm9kZUlkeCk7CisKKyAgICAgICAgICAgICAgICAvLy8gJ1ByZS1hdXRoJyBzdGF0dXMgZXhpc3RzIGZvciBTVEEKKyAgICAgICAgICAgICAgICBpZiAoKHBBdXRoTm9kZS0+bWxtU3RhdGUgIT0KKyAgICAgICAgICAgICAgICAgICAgIGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUzX1NUQVRFKSAmJgorICAgICAgICAgICAgICAgICAgICAocEF1dGhOb2RlLT5tbG1TdGF0ZSAhPQorICAgICAgICAgICAgICAgICAgICAgZUxJTV9NTE1fQVVUSF9SU1BfVElNRU9VVF9TVEFURSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAqIHdpdGggV0VQIGJpdCBzZXQgaW4gRkMgaW4gb3RoZXIgc3RhdGVzLgorICAgICAgICAgICAgICAgICAgICAgKiBSZWplY3QgYnkgc2VuZGluZyBBdXRoZW50aWNhdG9uIGZyYW1lIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICogb3V0IG9mIHNlcXVlbmNlIEF1dGggZnJhbWUgc3RhdHVzIGNvZGUuCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfU0hBUkVEX0tFWTsKKyAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9GUkFNRV80OworICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19BVVRIX0ZSQU1FX09VVF9PRl9TRVFfU1RBVFVTOworCisgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fTk9fV0VQX0lOX0ZDLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXV0aGVudGljYXRpb24gZnJhbWUgZnJvbSBwZWVyIHRoYXQgaXMgaW4gc3RhdGUgJWQuIEFkZHIgIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPm1sbVN0YXRlKTspCisgICAgICAgICAgICAgICAgICAgUEVMT0cxKCBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENoZWNrIGlmIHRoZXJlIGV4aXN0cyBhIGtleSBtYXBwcGluZyBrZXkKKyAgICAgICAgICAgICAqIGZvciB0aGUgU1RBIHRoYXQgc2VudCBBdXRoZW50aWNhdGlvbiBmcmFtZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwS2V5TWFwRW50cnkgPSBsaW1Mb29rVXBLZXlNYXBwaW5ncyhwSGRyLT5zYSk7CisKKyAgICAgICAgICAgIGlmIChwS2V5TWFwRW50cnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFwS2V5TWFwRW50cnktPndlcE9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEtleSBNYXBwaW5nIGVudHJ5IGhhcyBudWxsIGtleS4KKyAgICAgICAgICAgICAgICAgICAgICogU2VuZCBBdXRoZW50aWNhdGlvbiBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGNoYWxsZW5nZSBmYWlsdXJlIHN0YXR1cyBjb2RlCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPSBlU0lSX1NIQVJFRF9LRVk7CisgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX0FVVEhfRlJBTUVfNDsKKyAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKyAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfQ0hBTExFTkdFX0ZBSUxVUkVfU1RBVFVTOworCisgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fTk9fV0VQX0lOX0ZDLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXV0aCBmcmFtZTMgZnJvbSBwZWVyIHRoYXQgaGFzIE5VTEwga2V5IG1hcCBlbnRyeSwgQWRkciAiKSk7KQorICAgICAgICAgICAgICAgICAgIFBFTE9HMSggbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gLy8gaWYgKCFwS2V5TWFwRW50cnktPndlcE9uKQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlY3J5cHRSZXN1bHQgPSBsaW1EZWNyeXB0QXV0aEZyYW1lKHBNYWMsIHBLZXlNYXBFbnRyeS0+a2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW5Cb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMTYpIChmcmFtZUxlbi1TSVJfTUFDX1dFUF9JVl9MRU5HVEgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlY3J5cHRSZXN1bHQgPT0gTElNX0RFQ1JZUFRfSUNWX0ZBSUwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBJQ1YgZmFpbHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiPT09PT0+IGRlY3J5cHRSZXN1bHQgPT0gTElNX0RFQ1JZUFRfSUNWX0ZBSUwgLi4uXG4iKSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgbGltRGVsZXRlUHJlQXV0aE5vZGUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfU0hBUkVEX0tFWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19BVVRIX0ZSQU1FXzQ7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfQ0hBTExFTkdFX0ZBSUxVUkVfU1RBVFVTOworCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1TZW5kQXV0aE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9OT19XRVBfSU5fRkMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZSBmcm9tIHBlZXIgdGhhdCBmYWlsZWQgZGVjcnlwdGlvbiwgQWRkciAiKSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0cxKGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7KQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKHNpckNvbnZlcnRBdXRoRnJhbWUyU3RydWN0KHBNYWMsIHBsYWluQm9keSwgZnJhbWVMZW4tOCwgJnJ4QXV0aEZyYW1lKSE9ZVNJUl9TVUNDRVNTKXx8KCFpc0F1dGhWYWxpZChwTWFjLCAmcnhBdXRoRnJhbWUscHNlc3Npb25FbnRyeSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisKKyAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiAocEtleU1hcEVudHJ5LT5rZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIH0gLy8gaWYga2V5TWFwcGluZ3MgaGFzIGVudHJ5CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB2YWwgPSBTSVJfTUFDX0tFWV9MRU5HVEg7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFICAKKyAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkKKyAgICAgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgICAgIHRwU2lyS2V5cyBwS2V5OworICAgICAgICAgICAgICAgICAgICBwS2V5ID0gICZwc2Vzc2lvbkVudHJ5LT5XRVBLZXlNYXRlcmlhbFtrZXlJZF0ua2V5WzBdOyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIGRlZmF1bHRLZXksIHBLZXktPmtleSwgcEtleS0+a2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gcEtleS0+a2V5TGVuZ3RoOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsICh0QU5JX1UxNikgKFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzEgKyBrZXlJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0S2V5LCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLy8gQ291bGQgbm90IGdldCBEZWZhdWx0IGtleSBmcm9tIENGRy4KKyAgICAgICAgICAgICAgICAgICAgLy9Mb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBEZWZhdWx0IGtleVxuIikpOworCisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBTZW5kIEF1dGhlbnRpY2F0aW9uIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAqIHdpdGggY2hhbGxlbmdlIGZhaWx1cmUgc3RhdHVzIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0gZVNJUl9TSEFSRURfS0VZOworICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19BVVRIX0ZSQU1FXzQ7CisgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX0NIQUxMRU5HRV9GQUlMVVJFX1NUQVRVUzsKKworICAgICAgICAgICAgICAgICAgICBsaW1TZW5kQXV0aE1nbXRGcmFtZShwTWFjLCAmYXV0aEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX05PX1dFUF9JTl9GQyxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGtleV9sZW5ndGg9dmFsOworCisgICAgICAgICAgICAgICAgICAgIGRlY3J5cHRSZXN1bHQgPSBsaW1EZWNyeXB0QXV0aEZyYW1lKHBNYWMsIGRlZmF1bHRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbkJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UxNikgKGZyYW1lTGVuLVNJUl9NQUNfV0VQX0lWX0xFTkdUSCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVjcnlwdFJlc3VsdCA9PSBMSU1fREVDUllQVF9JQ1ZfRkFJTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiPT09PT0+IGRlY3J5cHRSZXN1bHQgPT0gTElNX0RFQ1JZUFRfSUNWX0ZBSUwgLi4uXG4iKSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgLy8vIElDViBmYWlsdXJlCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1EZWxldGVQcmVBdXRoTm9kZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EpOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0gZVNJUl9TSEFSRURfS0VZOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX0FVVEhfRlJBTUVfNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19DSEFMTEVOR0VfRkFJTFVSRV9TVEFUVVM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLCAmYXV0aEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX05PX1dFUF9JTl9GQyxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lIGZyb20gcGVlciB0aGF0IGZhaWxlZCBkZWNyeXB0aW9uLCBBZGRyICIpKTspCisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKHNpckNvbnZlcnRBdXRoRnJhbWUyU3RydWN0KHBNYWMsIHBsYWluQm9keSwgZnJhbWVMZW4tOCwgJnJ4QXV0aEZyYW1lKSE9ZVNJUl9TVUNDRVNTKXx8KCFpc0F1dGhWYWxpZChwTWFjLCAmcnhBdXRoRnJhbWUscHNlc3Npb25FbnRyeSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB9IC8vIEVuZCBvZiBjaGVjayBmb3IgS2V5IE1hcHBpbmcvRGVmYXVsdCBrZXkgcHJlc2VuY2UKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUHJpdmFjeSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkLgorICAgICAgICAgICAgICogU28gcmVqZWN0IEF1dGhlbnRpY2F0aW9uIGZyYW1lIHJlY2VpdmVkIHdpdGgKKyAgICAgICAgICAgICAqIFdFUCBiaXQgc2V0IGJ5IHNlbmRpbmcgQXV0aGVudGljYXRpb24gZnJhbWUKKyAgICAgICAgICAgICAqIHdpdGggJ2NoYWxsZW5nZSBmYWlsdXJlJyBzdGF0dXMgY29kZS4gVGhpcyBpcworICAgICAgICAgICAgICogYW5vdGhlciBzdHJhbmdlIHRoaW5nIGluIHRoZSBzcGVjLiBTdGF0dXMgY29kZQorICAgICAgICAgICAgICogc2hvdWxkIGhhdmUgYmVlbiAndW5zdXBwb3J0ZWQgYWxnb3JpdGhtJyBzdGF0dXMgY29kZS4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPSBlU0lSX1NIQVJFRF9LRVk7CisgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKyAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9GUkFNRV80OworICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKyAgICAgICAgICAgIGVTSVJfTUFDX0NIQUxMRU5HRV9GQUlMVVJFX1NUQVRVUzsKKworICAgICAgICAgICAgbGltU2VuZEF1dGhNZ210RnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX05PX1dFUF9JTl9GQyxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lMyBmcm9tIHBlZXIgdGhhdCB3aGlsZSBwcml2YWN5IG9wdGlvbiBpcyB0dXJuZWQgT0ZGLCBBZGRyICIpKTspCisgICAgICAgICAgICBQRUxPRzEobGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSAvLyBlbHNlIGlmICh3bGFuX2NmZ0dldEludChDRkdfUFJJVkFDWV9PUFRJT05fSU1QTEVNRU5URUQpKQorICAgIH0gLy8gaWYgKGZjLndlcCkKKyAgICBlbHNlCisgICAgeworCisKKyAgICAgICAgaWYgKChzaXJDb252ZXJ0QXV0aEZyYW1lMlN0cnVjdChwTWFjLCBwQm9keSwgZnJhbWVMZW4sICZyeEF1dGhGcmFtZSkhPWVTSVJfU1VDQ0VTUyl8fCghaXNBdXRoVmFsaWQocE1hYywgJnJ4QXV0aEZyYW1lLHBzZXNzaW9uRW50cnkpKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIHBSeEF1dGhGcmFtZUJvZHkgPSAmcnhBdXRoRnJhbWU7CisKKyAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwKKyAgICAgICAgICAgRkwoIlJlY2VpdmVkIEF1dGggZnJhbWUgd2l0aCB0eXBlPSVkIHNlcW51bT0lZCwgc3RhdHVzPSVkICglZClcbiIpLAorICAgICAgICAgICAodEFOSV9VMzIpIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyLAorICAgICAgICAgICAodEFOSV9VMzIpIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciwKKyAgICAgICAgICAgKHRBTklfVTMyKSBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSwodEFOSV9VMzIpcE1hYy0+bGltLmdMaW1OdW1QcmVBdXRoQ29udGV4dHMpOykKKworICAgIHN3aXRjaCAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyKQorICAgIHsKKyAgICAgICAgY2FzZSBTSVJfTUFDX0FVVEhfRlJBTUVfMToKKyAgICAgICAgICAgIC8vIEF1dGhGcmFtZSAxCisKKyAgICAgICAgICAgIC8vLyBDaGVjayBpZiB0aGVyZSBleGlzdHMgcHJlLWF1dGggY29udGV4dCBmb3IgdGhpcyBTVEEKKyAgICAgICAgICAgIHBBdXRoTm9kZSA9IGxpbVNlYXJjaFByZUF1dGhMaXN0KHBNYWMsIHBIZHItPnNhKTsKKyAgICAgICAgICAgIGlmIChwQXV0aE5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8vIFByZS1hdXRoIGNvbnRleHQgZXhpc3RzIGZvciB0aGUgU1RBCisgICAgICAgICAgICAgICAgaWYgKHBIZHItPmZjLnJldHJ5ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogU1RBIGlzIGluaXRpYXRpbmcgYnJhbmQtbmV3IEF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAqIHNlcXVlbmNlIGFmdGVyIGxvY2FsIEF1dGggUmVzcG9uc2UgdGltZW91dC4KKyAgICAgICAgICAgICAgICAgICAgICogT3IgU1RBIHJldHJ5aW5nIHRvIHRyYW5zbWl0IEZpcnN0IEF1dGggZnJhbWUgZHVlIHRvIHBhY2tldCBkcm9wIE9UQQorICAgICAgICAgICAgICAgICAgICAgKiBEZWxldGUgUHJlLWF1dGggbm9kZSBhbmQgZmFsbCB0aHJvdWdoLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYocEF1dGhOb2RlLT5mVGltZXJTdGFydGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlUGVyU3RhSWRUaW1lcihwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fQVVUSF9SU1BfVElNRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhOb2RlLT5hdXRoTm9kZUlkeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU1RBIGlzIGluaXRpYXRpbmcgYnJhbmQtbmV3IEF1dGhlbnRpY2F0aW9uIC4uLlxuIikpOykKKyAgICAgICAgICAgICAgICAgICAgbGltRGVsZXRlUHJlQXV0aE5vZGUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EpOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogIFNBUCBNb2RlOkRpc2Fzc29jaWF0ZSB0aGUgc3RhdGlvbiBhbmQgCisgICAgICAgICAgICAgICAgICAgICAqICBkZWxldGUgaXRzIGVudHJ5IGlmIHdlIGhhdmUgaXRzIGVudHJ5IAorICAgICAgICAgICAgICAgICAgICAgKiAgYWxyZWFkeSBhbmQgcmVjZWl2ZWQgImF1dGgiIGZyb20gdGhlIAorICAgICAgICAgICAgICAgICAgICAgKiAgc2FtZSBzdGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgKi8gIAorCisgICAgICAgICAgICAgICAgICAgIGZvciAoYXNzb2NJZCA9IDA7IGFzc29jSWQgPCBwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlLnNpemU7IGFzc29jSWQrKykvLyBTb2Z0YXAgZHBoSGFzaFRhYmxlLnNpemUgPSA4CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBhc3NvY0lkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMID09IHBTdGFEcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU3RhRHMtPnZhbGlkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsKHRBTklfVTggKikgJnBTdGFEcy0+c3RhQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJihwSGRyLT5zYSksICh0QU5JX1U4KSAoc2l6ZW9mKHRTaXJNYWNBZGRyKSkpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHBTdGFEcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgibGltIERlbGV0ZSBTdGF0aW9uIENvbnRleHQgKHN0YUlkOiAlZCwgYXNzb2NJZDogJWQpIFxuIikscFN0YURzLT5zdGFJbmRleCwgYXNzb2NJZCk7KQorICAgICAgICAgICAgICAgICAgICAgICAgbGltU2VuZERlYXV0aE1nbXRGcmFtZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTiwgKHRBTklfVTggKikgcEF1dGhOb2RlLT5wZWVyTWFjQWRkcixwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVRyaWdnZXJTVEFkZWxldGlvbihwTWFjLCBwU3RhRHMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogCisgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGZpcnN0IGF1dGhlbnRpY2F0aW9uIGZyYW1lIGlzIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICAgICAqIGJ1dCBBQ0sgbG9zdCBhdCBTVEEgc2lkZSwgaW4gdGhpcyBjYXNlIDJuZCBhdXRoIGZyYW1lIGlzIGFscmVhZHkgCisgICAgICAgICAgICAgICAgICAgICAqIGluIHRyYW5zbWlzc2lvbiBxdWV1ZQorICAgICAgICAgICAgICAgICAgICAgKiAqLworICAgICAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJTVEEgaXMgaW5pdGlhdGluZyBBdXRoZW50aWNhdGlvbiBhZnRlciBBQ0sgbG9zdC4uLlxuIikpOykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX01BWF9OVU1fUFJFX0FVVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmbWF4TnVtUHJlQXV0aCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIENvdWxkIG5vdCBnZXQgTWF4TnVtUHJlQXV0aAorICAgICAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgTWF4TnVtUHJlQXV0aFxuIikpOworICAgICAgICAgICAgfQorI2lmZGVmIEFOSV9BUF9TREtfT1BUCisgICAgICAgICAgICBpZihtYXhOdW1QcmVBdXRoID4gU0lSX1NES19PUFRfTUFYX05VTV9QUkVfQVVUSCkKKyAgICAgICAgICAgICAgICBtYXhOdW1QcmVBdXRoID0gU0lSX1NES19PUFRfTUFYX05VTV9QUkVfQVVUSDsKKyNlbmRpZiAvLyBBTklfQVBfU0RLX09QVAorICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltTnVtUHJlQXV0aENvbnRleHRzID09IG1heE51bVByZUF1dGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogTWF4aW11bSBudW1iZXIgb2YgcHJlLWF1dGggY29udGV4dHMKKyAgICAgICAgICAgICAgICAgKiByZWFjaGVkLiBTZW5kIEF1dGhlbnRpY2F0aW9uIGZyYW1lCisgICAgICAgICAgICAgICAgICogd2l0aCB1bnNwZWNpZmllZCBmYWlsdXJlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0KKyAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcjsKKyAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKyAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgKyAxOworICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisgICAgICAgICAgICAgICAgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCisgICAgICAgICAgICAgICAgbGltU2VuZEF1dGhNZ210RnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fTk9fV0VQX0lOX0ZDLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8vIE5vIFByZS1hdXRoIGNvbnRleHQgZXhpc3RzIGZvciB0aGUgU1RBLgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgIGlmIChsaW1Jc0F1dGhBbGdvU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFuaUF1dGhUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciwgcHNlc3Npb25FbnRyeSkpCisjZWxzZQorICAgICAgICAgICAgaWYgKGxpbUlzQXV0aEFsZ29TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QW5pQXV0aFR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyKSkKKworI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZVNJUl9PUEVOX1NZU1RFTToKKyAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIj09PT09PT0+IGVTSVJfT1BFTl9TWVNURU0gIC4uLlxuIikpOykKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBDcmVhdGUgZW50cnkgZm9yIHRoaXMgU1RBIGluIHByZS1hdXRoIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBdXRoTm9kZSA9IGxpbUFjcXVpcmVGcmVlUHJlQXV0aE5vZGUocE1hYywgJnBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBdXRoTm9kZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiTWF4IHByZS1hdXRoIG5vZGVzIHJlYWNoZWQgIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkFsbG9jIG5ldyBkYXRhOiAleCBwZWVyIFxuIiksIHBBdXRoTm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwQXV0aE5vZGUtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPm1sbVN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fTUxNX0FVVEhFTlRJQ0FURURfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPmF1dGhUeXBlID0gKHRBbmlBdXRoVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBdXRoTm9kZS0+ZlNlZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhOb2RlLT5mVGltZXJTdGFydGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUFkZFByZUF1dGhOb2RlKHBNYWMsIHBBdXRoTm9kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogU2VuZCBBdXRoZW50aWNhdG9uIGZyYW1lIHdpdGggU3VjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhdHVzIGNvZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0gZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVM7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1TZW5kQXV0aE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9OT19XRVBfSU5fRkMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBTZW5kIEF1dGggaW5kaWNhdGlvbiB0byBTTUUKKworICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBtbG1BdXRoSW5kLnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgICAgICAgICAgICAgbWxtQXV0aEluZC5hdXRoVHlwZSA9ICh0QW5pQXV0aFR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBtbG1BdXRoSW5kLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9NTE1fQVVUSF9JTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJm1sbUF1dGhJbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlU0lSX1NIQVJFRF9LRVk6CisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT09PT09PiBlU0lSX1NIQVJFRF9LRVkgIC4uLlxuIikpOykKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBwc2Vzc2lvbkVudHJ5LT5wcml2YWN5OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgIAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QUklWQUNZX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IFByaXZhY3kgb3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBQcml2YWN5IG9wdGlvblxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2ZnUHJpdmFjeU9wdEltcCA9ICh0QU5JX1U4KXZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2ZnUHJpdmFjeU9wdEltcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRoZW50aWNhdG9yIGRvZXMgbm90IGhhdmUgV0VQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW1wbGVtZW50ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmVqZWN0IGJ5IHNlbmRpbmcgQXV0aGVudGljYXRpb24gZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIEF1dGggYWxnb3JpdGhtIG5vdCBzdXBwb3J0ZWQgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY29kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX0FVVEhfQUxHT19OT1RfU1VQUE9SVEVEX1NUQVRVUzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX05PX1dFUF9JTl9GQyxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEF1dGggZnJhbWUgZm9yIHVuc3VwcG9ydGVkIGF1dGggYWxnb3JpdGhtICVkIGZyb20gIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyKTspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0cxKGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7KQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBlbnRyeSBmb3IgdGhpcyBTVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2luIHByZS1hdXRoIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUgPSBsaW1BY3F1aXJlRnJlZVByZUF1dGhOb2RlKHBNYWMsICZwTWFjLT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEF1dGhOb2RlID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiTWF4IHByZS1hdXRoIG5vZGVzIHJlYWNoZWQgIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPR1cpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwQXV0aE5vZGUtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPm1sbVN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX01MTV9XVF9BVVRIX0ZSQU1FM19TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPmF1dGhUeXBlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFuaUF1dGhUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdXRoTm9kZS0+ZlNlZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdXRoTm9kZS0+ZlRpbWVyU3RhcnRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltQWRkUHJlQXV0aE5vZGUocE1hYywgcEF1dGhOb2RlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkFsbG9jIG5ldyBkYXRhOiAleCBpZCAlZCBwZWVyIFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUsIHBBdXRoTm9kZS0+YXV0aE5vZGVJZHgpOykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gQ3JlYXRlIGFuZCBhY3RpdmF0ZSBBdXRoIFJlc3BvbnNlIHRpbWVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2NoYW5nZV9jb250ZXh0KCZwQXV0aE5vZGUtPnRpbWVyLCBwQXV0aE5vZGUtPmF1dGhOb2RlSWR4KSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBzdGFydCBBdXRoIHJlc3BvbnNlIHRpbWVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gY2hnIGNvbnRleHQgYXV0aCByZXNwb25zZSB0aW1lciBmb3IgcGVlciAiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HUCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlbmQgQXV0aGVudGljYXRvbiBmcmFtZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVuc3BlY2lmaWVkIGZhaWx1cmUgc3RhdHVzIGNvZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fTk9fV0VQX0lOX0ZDLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbURlbGV0ZVByZUF1dGhOb2RlKHBNYWMsIHBIZHItPnNhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUFjdGl2YXRlQXV0aFJzcFRpbWVyKHBNYWMsIHBBdXRoTm9kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPmZUaW1lclN0YXJ0ZWQgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJhbmRvbSBieXRlcyBhbmQgdXNlIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbGxlbmdlIHRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zX3JhbmRfZ2V0X2J5dGVzKCAwLCAodEFOSV9VOCAqKWNoYWxsZW5nZVRleHRBcnJheSwgU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9MRU5HVEggKSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsRkwoIkNoYWxsZW5nZSB0ZXh0IHByZXBhcmF0aW9uIGZhaWxlZCBpbiBsaW1Qcm9jZXNzQXV0aEZyYW1lIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbGxlbmdlID0gcEF1dGhOb2RlLT5jaGFsbGVuZ2VUZXh0OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgY2hhbGxlbmdlVGV4dEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYWxsZW5nZVRleHRBcnJheSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2VuZGluZyBBdXRoZW50aWNhdG9uIGZyYW1lIHdpdGggY2hhbGxlbmdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLnR5cGUgICA9IFNJUl9NQUNfQ0hBTExFTkdFX1RFWFRfRUlEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5sZW5ndGggPSBTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX0xFTkdUSDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuY2hhbGxlbmdlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhOb2RlLT5jaGFsbGVuZ2VUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX0xFTkdUSCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1TZW5kQXV0aE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMsICZhdXRoRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9OT19XRVBfSU5fRkMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmICh3bGFuX2NmZ0dldEludChDRkdfUFJJVkFDWV9PUFRJT05fSU1QTEVNRU5URUQpKQorCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXNwb25kaW5nIHBhcnR5IGRvZXMgbm90IHN1cHBvcnQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gcmVxdWVzdGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZW5kaW5nIHBhcnR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICogUmVqZWN0IGJ5IHNlbmRpbmcgQXV0aGVudGljYXRpb24gZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpdGggYXV0aCBhbGdvcml0aG0gbm90IHN1cHBvcnRlZCBzdGF0dXMgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19BVVRIX0FMR09fTk9UX1NVUFBPUlRFRF9TVEFUVVM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLCAmYXV0aEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX05PX1dFUF9JTl9GQyxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMSggbGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEF1dGggZnJhbWUgZm9yIHVuc3VwcG9ydGVkIGF1dGggYWxnb3JpdGhtICVkIGZyb20gIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIpOykKKyAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gLy8gZW5kIHN3aXRjaChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcikKKyAgICAgICAgICAgIH0gLy8gaWYgKGxpbUlzQXV0aEFsZ29TdXBwb3J0ZWQocFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIpKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFJlc3BvbmRpbmcgcGFydHkgZG9lcyBub3Qgc3VwcG9ydCB0aGUKKyAgICAgICAgICAgICAgICAgKiBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gcmVxdWVzdGVkIGJ5IHNlbmRpbmcgcGFydHkuCisgICAgICAgICAgICAgICAgICogUmVqZWN0IEF1dGhlbnRpY2F0aW9uIHdpdGggU3RhdHVzQ29kZT0xMy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPQorICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyOworICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciArIDE7CisgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKyAgICAgICAgICAgICAgICBlU0lSX01BQ19BVVRIX0FMR09fTk9UX1NVUFBPUlRFRF9TVEFUVVM7CisKKyAgICAgICAgICAgICAgICBsaW1TZW5kQXV0aE1nbXRGcmFtZShwTWFjLCAmYXV0aEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9OT19XRVBfSU5fRkMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZSBmb3IgdW5zdXBwb3J0ZWQgYXV0aCBhbGdvcml0aG0gJWQgZnJvbSAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIpOykKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSAvL2VuZCBpZiAobGltSXNBdXRoQWxnb1N1cHBvcnRlZChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcikpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9NQUNfQVVUSF9GUkFNRV8yOgorICAgICAgICAgICAgLy8gQXV0aEZyYW1lIDIKKworICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlICE9IGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUyX1NUQVRFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lMiBpbiBhbiB1bmV4cGVjdGVkIHN0YXRlLgorICAgICAgICAgICAgICAgICAqIExvZyBlcnJvciBhbmQgaWdub3JlIHRoZSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEF1dGggZnJhbWUyIGZyb20gcGVlciBpbiBzdGF0ZSAlZCwgYWRkciAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpOykKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggIXBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCh0QU5JX1U4ICopIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBSZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZSBmcm9tIGFuIGVudGl0eQorICAgICAgICAgICAgICAgICAqIG90aGVyIHRoYW4gb25lIHJlcXVlc3Qgd2FzIGluaXRpYXRlZC4KKyAgICAgICAgICAgICAgICAgKiBXYWl0IHVudGlsIEF1dGhlbnRpY2F0aW9uIEZhaWx1cmUgVGltZW91dC4KKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEF1dGggZnJhbWUyIGZyb20gdW5leHBlY3RlZCBwZWVyICIpKTspCisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7KQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSA9PQorICAgICAgICAgICAgICAgIGVTSVJfTUFDX0FVVEhfQUxHT19OT1RfU1VQUE9SVEVEX1NUQVRVUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBJbnRlcm9wZXJhYmlsaXR5IHdvcmthcm91bmQ6IExpbmtzeXMgV0FQNDQwME4gaXMgcmV0dXJuaW5nCisgICAgICAgICAgICAgICAgICogd3JvbmcgYXV0aFR5cGUgaW4gT3BlbkF1dGggcmVzcG9uc2UgaW4gY2FzZSBvZiAKKyAgICAgICAgICAgICAgICAgKiBTaGFyZWRLZXkgQVAgY29uZmlndXJhdGlvbi4gUHJldGVuZCB3ZSBkb24ndCBzZWUgdGhhdCwKKyAgICAgICAgICAgICAgICAgKiBzbyB1cHBlciBsYXllciBjYW4gZmFsbGJhY2sgdG8gU2hhcmVkS2V5IGF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAqIGFuZCBzdWNjZXNzZnVsbHkgY29ubmVjdCB0byB0aGUgQVAuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyICE9CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPmF1dGhUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5hdXRoVHlwZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciAhPQorICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPmF1dGhUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lIHdpdGggYW4gYXV0aAorICAgICAgICAgICAgICAgICAqIGFsZ29yaXRobSBvdGhlciB0aGFuIG9uZSByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgICAgICogV2FpdCB1bnRpbCBBdXRoZW50aWNhdGlvbiBGYWlsdXJlIFRpbWVvdXQuCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBBdXRoIGZyYW1lMiBmb3IgdW5leHBlY3RlZCBhdXRoIGFsZ28gbnVtYmVyICVkIGZyb20gIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyKTspCisgICAgICAgICAgICAgICBQRUxPRzEoIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7KQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSA9PQorICAgICAgICAgICAgICAgIGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciA9PQorICAgICAgICAgICAgICAgICAgICBlU0lSX09QRU5fU1lTVEVNKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEF1dGhUeXBlID0gZVNJUl9PUEVOX1NZU1RFTTsKKworICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUgPSBsaW1BY3F1aXJlRnJlZVByZUF1dGhOb2RlKHBNYWMsICZwTWFjLT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocEF1dGhOb2RlID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIk1heCBwcmUtYXV0aCBub2RlcyByZWFjaGVkICIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkFsbG9jIG5ldyBkYXRhOiAleCBwZWVyIFxuIiksIHBBdXRoTm9kZSk7KQorICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBBdXRoTm9kZS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPmZUaW1lclN0YXJ0ZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPmF1dGhUeXBlID0gcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGU7CisgICAgICAgICAgICAgICAgICAgIGxpbUFkZFByZUF1dGhOb2RlKHBNYWMsIHBBdXRoTm9kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgbGltUmVzdG9yZUZyb21BdXRoU3RhdGUocE1hYywgZVNJUl9TTUVfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aFN0YXR1c0NvZGUscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgfSAvLyBpZiAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIgPT0gZVNJUl9PUEVOX1NZU1RFTSkKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTaGFyZWQga2V5IGF1dGhlbnRpY2F0aW9uCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBwc2Vzc2lvbkVudHJ5LT5wcml2YWN5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QUklWQUNZX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIENvdWxkIG5vdCBnZXQgUHJpdmFjeSBvcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgUHJpdmFjeSBvcHRpb25cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjZmdQcml2YWN5T3B0SW1wID0gKHRBTklfVTgpdmFsOworICAgICAgICAgICAgICAgICAgICBpZiAoIWNmZ1ByaXZhY3lPcHRJbXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogUmVxdWVzdGluZyBTVEEgZG9lcyBub3QgaGF2ZSBXRVAgaW1wbGVtZW50ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWplY3Qgd2l0aCB1bnN1cHBvcnRlZCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFN0YXR1cyBjb2RlIGFuZCB3YWl0IHVudGlsIGF1dGggZmFpbHVyZSB0aW1lb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMSggbGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEF1dGggZnJhbWUgZnJvbSBwZWVyIGZvciB1bnN1cHBvcnRlZCBhdXRoIGFsZ28gJWQsIEFkZHIgIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIpOykKKyAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX0FVVEhfQUxHT19OT1RfU1VQUE9SVEVEX1NUQVRVUzsKKworICAgICAgICAgICAgICAgICAgICAgICAgbGltU2VuZEF1dGhNZ210RnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9OT19XRVBfSU5fRkMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUnhBdXRoRnJhbWVCb2R5LT50eXBlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19DSEFMTEVOR0VfVEVYVF9FSUQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXV0aCBmcmFtZSB3aXRoIGludmFsaWQgY2hhbGxlbmdlIHRleHQgSUVcbiIpKTspCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgZXhpc3RzIGEga2V5IG1hcHBwaW5nIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIHRoZSBTVEEgdGhhdCBzZW50IEF1dGhlbnRpY2F0aW9uIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBLZXlNYXBFbnRyeSA9IGxpbUxvb2tVcEtleU1hcHBpbmdzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwS2V5TWFwRW50cnkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBLZXlNYXBFbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogS2V5IE1hcHBpbmcgZW50cnkgaGFzIG51bGwga2V5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTZW5kIEF1dGggZnJhbWUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjaGFsbGVuZ2UgZmFpbHVyZSBzdGF0dXMgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19DSEFMTEVOR0VfRkFJTFVSRV9TVEFUVVM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltU2VuZEF1dGhNZ210RnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9OT19XRVBfSU5fRkMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBBdXRoIGZyYW1lIGZyb20gcGVlciB3aGVuIGtleSBtYXBwaW5nIGtleSBpcyBOVUxMLCBhZGRyICIpKTspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1SZXN0b3JlRnJvbUF1dGhTdGF0ZShwTWFjLCBlU0lSX1NNRV9OT19LRVlfTUFQUElOR19LRVlfRk9SX1BFRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTixwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZiAocEtleU1hcEVudHJ5LT5rZXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRwU2lyTWFjQXV0aEZyYW1lQm9keSkgcGxhaW5Cb2R5KS0+YXV0aEFsZ29OdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXJTd2FwVTE2aWZOZWVkZWQocFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRwU2lyTWFjQXV0aEZyYW1lQm9keSkgcGxhaW5Cb2R5KS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lyU3dhcFUxNmlmTmVlZGVkKCh0QU5JX1UxNikgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0cFNpck1hY0F1dGhGcmFtZUJvZHkpIHBsYWluQm9keSktPmF1dGhTdGF0dXNDb2RlID0gZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodHBTaXJNYWNBdXRoRnJhbWVCb2R5KSBwbGFpbkJvZHkpLT50eXBlICAgPSBTSVJfTUFDX0NIQUxMRU5HRV9URVhUX0VJRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0cFNpck1hY0F1dGhGcmFtZUJvZHkpIHBsYWluQm9keSktPmxlbmd0aCA9IFNJUl9NQUNfQVVUSF9DSEFMTEVOR0VfTEVOR1RIOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAoKHRwU2lyTWFjQXV0aEZyYW1lQm9keSkgcGxhaW5Cb2R5KS0+Y2hhbGxlbmdlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5jaGFsbGVuZ2VUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9DSEFMTEVOR0VfTEVOR1RIKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmNyeXB0QXV0aEZyYW1lKHBNYWMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEtleU1hcEVudHJ5LT5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW5Cb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3JBdXRoRnJhbWUsa2V5X2xlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9BVVRIX0ZSQU1FNF9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltU2VuZEF1dGhNZ210RnJhbWUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRwU2lyTWFjQXV0aEZyYW1lQm9keSkgZW5jckF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9XRVBfSU5fRkMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgaWYgKHBLZXlNYXBFbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmIChwS2V5TWFwRW50cnkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBEZWZhdWx0IGtleUlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgRGVmYXVsdCBrZXlJZFxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJZCA9ICh0QU5JX1U4KXZhbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFNJUl9NQUNfS0VZX0xFTkdUSDsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJLZXlzIHBLZXk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBLZXkgPSAgJnBzZXNzaW9uRW50cnktPldFUEtleU1hdGVyaWFsW2tleUlkXS5rZXlbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIGRlZmF1bHRLZXksIHBLZXktPmtleSwgcEtleS0+a2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsICh0QU5JX1UxNikgKFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzEgKyBrZXlJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBnZXQgRGVmYXVsdCBrZXkgZnJvbSBDRkcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgRGVmYXVsdCBrZXlcbiIpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoU3RhdHVzQ29kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX0NIQUxMRU5HRV9GQUlMVVJFX1NUQVRVUzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1TZW5kQXV0aE1nbXRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLCAmYXV0aEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9OT19XRVBfSU5fRkMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltUmVzdG9yZUZyb21BdXRoU3RhdGUocE1hYywgZVNJUl9TTUVfSU5WQUxJRF9XRVBfREVGQVVMVF9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTixwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9sZW5ndGg9dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRwU2lyTWFjQXV0aEZyYW1lQm9keSkgcGxhaW5Cb2R5KS0+YXV0aEFsZ29OdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXJTd2FwVTE2aWZOZWVkZWQocFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRwU2lyTWFjQXV0aEZyYW1lQm9keSkgcGxhaW5Cb2R5KS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lyU3dhcFUxNmlmTmVlZGVkKCh0QU5JX1UxNikgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0cFNpck1hY0F1dGhGcmFtZUJvZHkpIHBsYWluQm9keSktPmF1dGhTdGF0dXNDb2RlID0gZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodHBTaXJNYWNBdXRoRnJhbWVCb2R5KSBwbGFpbkJvZHkpLT50eXBlICAgPSBTSVJfTUFDX0NIQUxMRU5HRV9URVhUX0VJRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0cFNpck1hY0F1dGhGcmFtZUJvZHkpIHBsYWluQm9keSktPmxlbmd0aCA9IFNJUl9NQUNfQVVUSF9DSEFMTEVOR0VfTEVOR1RIOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAoKHRwU2lyTWFjQXV0aEZyYW1lQm9keSkgcGxhaW5Cb2R5KS0+Y2hhbGxlbmdlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5jaGFsbGVuZ2VUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9DSEFMTEVOR0VfTEVOR1RIKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmNyeXB0QXV0aEZyYW1lKHBNYWMsIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW5Cb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3JBdXRoRnJhbWUsa2V5X2xlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX01MTV9XVF9BVVRIX0ZSQU1FNF9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltU2VuZEF1dGhNZ210RnJhbWUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRwU2lyTWFjQXV0aEZyYW1lQm9keSkgZW5jckF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9XRVBfSU5fRkMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiAocEtleU1hcEVudHJ5KQorICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiAoIXdsYW5fY2ZnR2V0SW50KENGR19QUklWQUNZX09QVElPTl9JTVBMRU1FTlRFRCkpCisgICAgICAgICAgICAgICAgfSAvLyBlbmQgaWYgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyID09IGVTSVJfT1BFTl9TWVNURU0pCisgICAgICAgICAgICB9IC8vIGlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSA9PSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUykKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBBdXRoZW50aWNhdGlvbiBmYWlsdXJlLgorICAgICAgICAgICAgICAgICAqIFJldHVybiBBdXRoIGNvbmZpcm0gd2l0aCByZWNlaXZlZCBmYWlsdXJlIGNvZGUgdG8gU01FCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBBdXRoIGZyYW1lIGZyb20gcGVlciB3aXRoIGZhaWx1cmUgY29kZSAlZCBhZGRyICIpLAorICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSk7KQorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgIGxpbVJlc3RvcmVGcm9tQXV0aFN0YXRlKHBNYWMsIGVTSVJfU01FX0FVVEhfUkVGVVNFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIH0gLy8gZW5kIGlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSA9PSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUykKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTUFDX0FVVEhfRlJBTUVfMzoKKyAgICAgICAgICAgIC8vIEF1dGhGcmFtZSAzCisKKyAgICAgICAgICAgIGlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciAhPSBlU0lSX1NIQVJFRF9LRVkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogUmVjZWl2ZWQgQXV0aGVudGljYXRpb24gZnJhbWUzIHdpdGggYWxnb3JpdGhtIG90aGVyIHRoYW4KKyAgICAgICAgICAgICAgICAgKiBTaGFyZWQgS2V5IGF1dGhlbnRpY2F0aW9uIHR5cGUuIFJlamVjdCB3aXRoIEF1dGggZnJhbWU0CisgICAgICAgICAgICAgICAgICogd2l0aCAnb3V0IG9mIHNlcXVlbmNlJyBzdGF0dXMgY29kZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPSBlU0lSX1NIQVJFRF9LRVk7CisgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisgICAgICAgICAgICAgICAgU0lSX01BQ19BVVRIX0ZSQU1FXzQ7CisgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKyAgICAgICAgICAgICAgICBlU0lSX01BQ19BVVRIX0ZSQU1FX09VVF9PRl9TRVFfU1RBVFVTOworCisgICAgICAgICAgICAgICAgbGltU2VuZEF1dGhNZ210RnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fTk9fV0VQX0lOX0ZDLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXV0aCBmcmFtZTMgZnJvbSBwZWVyIHdpdGggYXV0aCBhbGdvIG51bWJlciAlZCBBZGRyICIpLAorICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcik7KQorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFIHx8IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSB8fAorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfSU5fSUJTU19ST0xFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlcCBiaXQgd2FzIHNldCBpbiBGQy4gSWYgbm90IHNldCwKKyAgICAgICAgICAgICAgICAgKiByZWplY3Qgd2l0aCBBdXRoZW50aWNhdGlvbiBmcmFtZTQgd2l0aAorICAgICAgICAgICAgICAgICAqICdjaGFsbGVuZ2UgZmFpbHVyZScgc3RhdHVzIGNvZGUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCFwSGRyLT5mYy53ZXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLy8gV0VQIGJpdCBpcyBub3Qgc2V0IGluIEZDIG9mIEF1dGggRnJhbWUzCisgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfU0hBUkVEX0tFWTsKKyAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9GUkFNRV80OworICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19DSEFMTEVOR0VfRkFJTFVSRV9TVEFUVVM7CisKKyAgICAgICAgICAgICAgICAgICAgbGltU2VuZEF1dGhNZ210RnJhbWUocE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9OT19XRVBfSU5fRkMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBBdXRoIGZyYW1lMyBmcm9tIHBlZXIgd2l0aCBubyBXRVAgYml0IHNldCwgYWRkciAiKSk7KQorICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBBdXRoTm9kZSA9IGxpbVNlYXJjaFByZUF1dGhMaXN0KHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSk7CisgICAgICAgICAgICAgICAgaWYgKHBBdXRoTm9kZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIE5vICdwcmUtYXV0aCcgY29udGV4dCBleGlzdHMgZm9yCisgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgU1RBIHRoYXQgc2VudCBhbiBBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgKiBmcmFtZTMuCisgICAgICAgICAgICAgICAgICAgICAqIFNlbmQgQXV0aCBmcmFtZTQgd2l0aCAnb3V0IG9mIHNlcXVlbmNlJworICAgICAgICAgICAgICAgICAgICAgKiBzdGF0dXMgY29kZS4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfU0hBUkVEX0tFWTsKKyAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9GUkFNRV80OworICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPQorICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19BVVRIX0ZSQU1FX09VVF9PRl9TRVFfU1RBVFVTOworCisgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fTk9fV0VQX0lOX0ZDLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXV0aEZyYW1lMyBmcm9tIHBlZXIgdGhhdCBoYXMgbm8gcHJlYXV0aCBjb250ZXh0LiBBZGRyICIpKTspCisgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBBdXRoTm9kZS0+bWxtU3RhdGUgPT0gZUxJTV9NTE1fQVVUSF9SU1BfVElNRU9VVF9TVEFURSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBSZWNlaXZlZCBBdXRoIEZyYW1lMyBhZnRlciBBdXRoIFJlc3BvbnNlIHRpbWVvdXQuCisgICAgICAgICAgICAgICAgICAgICAqIFJlamVjdCBieSBzZW5kaW5nIEF1dGggRnJhbWU0IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICogQXV0aCByZXNwb25lIHRpbWVvdXQgU3RhdHVzIENvZGUuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aEFsZ29OdW1iZXIgPSBlU0lSX1NIQVJFRF9LRVk7CisgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX0FVVEhfRlJBTUVfNDsKKyAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKyAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfQVVUSF9SU1BfVElNRU9VVF9TVEFUVVM7CisKKyAgICAgICAgICAgICAgICAgICAgbGltU2VuZEF1dGhNZ210RnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYywgJmF1dGhGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fTk9fV0VQX0lOX0ZDLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJhdXRoIHJlc3BvbnNlIHRpbWVyIHRpbWVkb3V0IGZvciBwZWVyICIpKTsKKyAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0dXKTsKKworICAgICAgICAgICAgICAgICAgICAvLy8gRGVsZXRlIHByZS1hdXRoIGNvbnRleHQgb2YgU1RBCisgICAgICAgICAgICAgICAgICAgIGxpbURlbGV0ZVByZUF1dGhOb2RlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSAvLyBlbmQgc3dpdGNoIChwQXV0aE5vZGUtPm1sbVN0YXRlKQorCisgICAgICAgICAgICAgICAgaWYgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhTdGF0dXNDb2RlICE9IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIFJlY2VpdmVkIEF1dGhlbmV0aWNhdGlvbiBGcmFtZSAzIHdpdGggc3RhdHVzIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICogb3RoZXIgdGhhbiBzdWNjZXNzLiBXYWl0IHVudGlsIEF1dGggcmVzcG9uc2UgdGltZW91dAorICAgICAgICAgICAgICAgICAgICAgKiB0byBkZWxldGUgU1RBIGNvbnRleHQuCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXV0aCBmcmFtZTMgZnJvbSBwZWVyIHdpdGggc3RhdHVzIGNvZGUgJWQsIGFkZHIgIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSk7KQorICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHJlY2VpdmVkIGNoYWxsZW5nZSB0ZXh0IGlzIHNhbWUgYXMgb25lIHNlbnQgaW4KKyAgICAgICAgICAgICAgICAgKiBBdXRoZW50aWNhdGlvbiBmcmFtZTMKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCxwUnhBdXRoRnJhbWVCb2R5LT5jaGFsbGVuZ2VUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhOb2RlLT5jaGFsbGVuZ2VUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9MRU5HVEgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8vIENoYWxsZW5nZSBtYXRjaC4gU1RBIGlzIGF1dGhldGljYXRlZCAhCisKKyAgICAgICAgICAgICAgICAgICAgLy8vIERlbGV0ZSBBdXRoZW50aWNhdGlvbiByZXNwb25zZSB0aW1lciBpZiBydW5uaW5nCisgICAgICAgICAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VQZXJTdGFJZFRpbWVyKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fQVVUSF9SU1BfVElNRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdXRoTm9kZS0+YXV0aE5vZGVJZHgpOworCisgICAgICAgICAgICAgICAgICAgIHBBdXRoTm9kZS0+ZlRpbWVyU3RhcnRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBBdXRoTm9kZS0+bWxtU3RhdGUgPSBlTElNX01MTV9BVVRIRU5USUNBVEVEX1NUQVRFOworCisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBTZW5kIEF1dGhlbnRpY2F0aW9uIEZyYW1lNCB3aXRoICdzdWNjZXNzJyBTdGF0dXMgQ29kZS4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoQWxnb051bWJlciA9IGVTSVJfU0hBUkVEX0tFWTsKKyAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9GUkFNRV80OworICAgICAgICAgICAgICAgICAgICBhdXRoRnJhbWUuYXV0aFN0YXR1c0NvZGUgPSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUzsKKworICAgICAgICAgICAgICAgICAgICBsaW1TZW5kQXV0aE1nbXRGcmFtZShwTWFjLCAmYXV0aEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX05PX1dFUF9JTl9GQyxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICAvLy8gU2VuZCBBdXRoIGluZGljYXRpb24gdG8gU01FCisgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBtbG1BdXRoSW5kLnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgbWxtQXV0aEluZC5hdXRoVHlwZSA9ICh0QW5pQXV0aFR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgbWxtQXV0aEluZC5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9BVVRIX0lORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopICZtbG1BdXRoSW5kKTsKKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIENoYWxsZW5nZSBGYWlsdXJlLgorICAgICAgICAgICAgICAgICAgICAgKiBTZW5kIEF1dGhlbnRpY2F0aW9uIGZyYW1lNCB3aXRoICdjaGFsbGVuZ2UgZmFpbHVyZScKKyAgICAgICAgICAgICAgICAgICAgICogc3RhdHVzIGNvZGUgYW5kIHdhaXQgdW50aWwgQXV0aCByZXNwb25zZSB0aW1lb3V0IHRvCisgICAgICAgICAgICAgICAgICAgICAqIGRlbGV0ZSBTVEEgY29udGV4dC4KKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhBbGdvTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIGF1dGhGcmFtZS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX0FVVEhfRlJBTUVfNDsKKyAgICAgICAgICAgICAgICAgICAgYXV0aEZyYW1lLmF1dGhTdGF0dXNDb2RlID0KKyAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfQ0hBTExFTkdFX0ZBSUxVUkVfU1RBVFVTOworCisgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKHBNYWMsICZhdXRoRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fTk9fV0VQX0lOX0ZDLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgIFBFTE9HMSggbGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiQ2hhbGxlbmdlIGZhaWx1cmUgZm9yIHBlZXIgIikpOykKKyAgICAgICAgICAgICAgICAgICAgUEVMT0cxKGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7KQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSB8fCAuLi4KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTUFDX0FVVEhfRlJBTUVfNDoKKyAgICAgICAgICAgIC8vIEF1dGhGcmFtZSA0CisgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgIT0gZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTRfU1RBVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogUmVjZWl2ZWQgQXV0aGVudGljYXRpb24gZnJhbWU0IGluIGFuIHVuZXhwZWN0ZWQgc3RhdGUuCisgICAgICAgICAgICAgICAgICogTG9nIGVycm9yIGFuZCBpZ25vcmUgdGhlIGZyYW1lLgorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBBdXRoIGZyYW1lNCBmcm9tIHBlZXIgaW4gc3RhdGUgJWQsIGFkZHIgIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKTspCisgICAgICAgICAgICAgICBQRUxPRzEoIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7KQorCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIgIT0gZVNJUl9TSEFSRURfS0VZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lNCB3aXRoIGFsZ29yaXRobSBvdGhlciB0aGFuCisgICAgICAgICAgICAgICAgICogU2hhcmVkIEtleSBhdXRoZW50aWNhdGlvbiB0eXBlLgorICAgICAgICAgICAgICAgICAqIFdhaXQgdW50aWwgQXV0aCBmYWlsdXJlIHRpbWVvdXQgdG8gcmVwb3J0IGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICogZmFpbHVyZSB0byBTTUUuCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBBdXRoIGZyYW1lNCBmcm9tIHBlZXIgd2l0aCBpbnZhbGlkIGF1dGggYWxnbyAlZCwgYWRkciAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIpOykKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cxKTspCisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggIXBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCh0QU5JX1U4ICopIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBSZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZSBmcm9tIGFuIGVudGl0eQorICAgICAgICAgICAgICAgICAqIG90aGVyIHRoYW4gb25lIHRvIHdoaWNoIHJlcXVlc3Qgd2FzIGluaXRpYXRlZC4KKyAgICAgICAgICAgICAgICAgKiBXYWl0IHVudGlsIEF1dGhlbnRpY2F0aW9uIEZhaWx1cmUgVGltZW91dC4KKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIEF1dGggZnJhbWU0IGZyb20gdW5leHBlY3RlZCBwZWVyICIpKTsKKyAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIgIT0KKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5hdXRoVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBSZWNlaXZlZCBBdXRoZW50aWNhdGlvbiBmcmFtZSB3aXRoIGFuIGF1dGggYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICogb3RoZXIgdGhhbiBvbmUgcmVxdWVzdGVkLgorICAgICAgICAgICAgICAgICAqIFdhaXQgdW50aWwgQXV0aGVudGljYXRpb24gRmFpbHVyZSBUaW1lb3V0LgorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXV0aGVudGljYXRpb24gZnJhbWUgZnJvbSBwZWVyIHdpdGggaW52YWxpZCBhdXRoIHNlcSBudW1iZXIgJWQsIGFkZHIgIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlcik7CisgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhTdGF0dXNDb2RlID09CisgICAgICAgICAgICAgICAgZVNJUl9NQUNfU1VDQ0VTU19TVEFUVVMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQXV0aGVudGljYXRpb24gU3VjY2VzcyAhCisgICAgICAgICAgICAgICAgICogSW5mb3JtIFNNRSBvZiBzYW1lLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRBdXRoVHlwZSA9IGVTSVJfU0hBUkVEX0tFWTsKKworICAgICAgICAgICAgICAgIHBBdXRoTm9kZSA9IGxpbUFjcXVpcmVGcmVlUHJlQXV0aE5vZGUocE1hYywgJnBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUpOworICAgICAgICAgICAgICAgIGlmIChwQXV0aE5vZGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJNYXggcHJlLWF1dGggbm9kZXMgcmVhY2hlZCAiKSk7CisgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJBbGxvYyBuZXcgZGF0YTogJXggcGVlciBcbiIpLCBwQXV0aE5vZGUpOworICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7KQorCisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcEF1dGhOb2RlLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgICAgIHBBdXRoTm9kZS0+ZlRpbWVyU3RhcnRlZCA9IDA7CisgICAgICAgICAgICAgICAgcEF1dGhOb2RlLT5hdXRoVHlwZSA9IHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPmF1dGhUeXBlOworICAgICAgICAgICAgICAgIGxpbUFkZFByZUF1dGhOb2RlKHBNYWMsIHBBdXRoTm9kZSk7CisKKyAgICAgICAgICAgICAgICBsaW1SZXN0b3JlRnJvbUF1dGhTdGF0ZShwTWFjLCBlU0lSX1NNRV9TVUNDRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhTdGF0dXNDb2RlLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICB9IC8vIGlmIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSA9PSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUykKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBBdXRoZW50aWNhdGlvbiBmYWlsdXJlLgorICAgICAgICAgICAgICAgICAqIFJldHVybiBBdXRoIGNvbmZpcm0gd2l0aCByZWNlaXZlZCBmYWlsdXJlIGNvZGUgdG8gU01FCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJBdXRoZW50aWNhdGlvbiBmYWlsdXJlIGZyb20gcGVlciAiKSk7CisgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgICAgICBsaW1SZXN0b3JlRnJvbUF1dGhTdGF0ZShwTWFjLCBlU0lSX1NNRV9BVVRIX1JFRlVTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ4QXV0aEZyYW1lQm9keS0+YXV0aFN0YXR1c0NvZGUscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9IC8vIGVuZCBpZiAocFJ4QXV0aEZyYW1lQm9keS0+U3RhdHVzID09IDApCisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLy8gSW52YWxpZCBBdXRoZW50aWNhdGlvbiBGcmFtZSByZWNlaXZlZC4gSWdub3JlIGl0LgorCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgQXV0aCBmcmFtZSBmcm9tIHBlZXIgd2l0aCBpbnZhbGlkIGF1dGggc2VxIG51bWJlciAlZCwgYWRkciAiKSwKKyAgICAgICAgICAgICAgICAgICBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIpOworICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gLy8gZW5kIHN3aXRjaCAocFJ4QXV0aEZyYW1lQm9keS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyKQorfSAvKioqIGVuZCBsaW1Qcm9jZXNzQXV0aEZyYW1lKCkgKioqLworCisKKworCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBQYXNzIHRoZSByZWNlaXZlZCBBdXRoIGZyYW1lLiBUaGlzIGlzIHBvc3NpYmx5IHRoZSBwcmUtYXV0aCBmcm9tIHRoZQorICogbmVpZ2hib3IgQVAsIGluIHRoZSBzYW1lIG1vYmlsaXR5IGRvbWFpbi4KKyAqIFRoaXMgd2lsbCBiZSB1c2VkIGluIGNhc2Ugb2YgMTFyIEZULgorICoKKyAqICEhISEgVGhpcyBpcyBnb2luZyB0byBiZSByZW5vdmVkIGZvciB0aGUgbmV4dCBjaGVja2luLiBXZSB3aWxsIGJlIGNyZWF0aW5nCisgKiB0aGUgc2Vzc2lvbiBiZWZvcmUgc2VuZGluZyBvdXQgdGhlIEF1dGguIFRodXMgd2hlbiBhdXRoIHJlc3BvbnNlCisgKiBpcyByZWNlaXZlZCB3ZSB3aWxsIGhhdmUgYSBzZXNzaW9uIGluIHByb2dyZXNzLiAhISEhIQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludCBsaW1Qcm9jZXNzQXV0aEZyYW1lTm9TZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBCZCwgdm9pZCAqYm9keSkKK3sKKyAgICB0cFNpck1hY01nbXRIZHIgcEhkcjsKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKyAgICB0QU5JX1U4ICpwQm9keTsKKyAgICB0QU5JX1UxNiAgZnJhbWVMZW47CisgICAgdFNpck1hY0F1dGhGcmFtZUJvZHkgcnhBdXRoRnJhbWU7CisgICAgdFNpck1hY0F1dGhGcmFtZUJvZHkgKnBSeEF1dGhGcmFtZUJvZHkgPSBOVUxMOworICAgIGludCByZXRfc3RhdHVzID0gZVNJUl9GQUlMVVJFOworCisgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwQmQpOworICAgIHBCb2R5ID0gV0RBX0dFVF9SWF9NUERVX0RBVEEocEJkKTsKKyAgICBmcmFtZUxlbiA9IFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4ocEJkKTsKKworICAgIC8vIENoZWNrIGZvciB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgYW5kIHNlZSB3aGF0IG5lZWRzIHRvIGJlIGRvbmUgbmV4dC4KKyAgICBwc2Vzc2lvbkVudHJ5ID0gcE1hYy0+ZnQuZnRQRUNvbnRleHQucHNhdmVkc2Vzc2lvbkVudHJ5OworICAgIGlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJFcnJvcjogVW5hYmxlIHRvIGZpbmQgc2Vzc2lvbiBpZCB3aGlsZSBpbiBwcmUtYXV0aCBwaGFzZSBmb3IgRlQiKSk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIE5vIEZUIGluIHByb2dyZXNzLgorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGlmIChmcmFtZUxlbiA9PSAwKSAKKyAgICB7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPmJzc0lkLCBMT0dFKTsKKyAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+cHJlQXV0aGJzc0lkLCBMT0dFKTsKKyNlbmRpZgorCisgICAgLy8gQ2hlY2sgdGhhdCBpdHMgdGhlIHNhbWUgYnNzSWQgd2UgaGF2ZSBmb3IgcHJlQXV0aAorICAgIGlmICghcGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnByZUF1dGhic3NJZCwKKyAgICAgICAgcEhkci0+YnNzSWQsIHNpemVvZiggdFNpck1hY0FkZHIgKSkpCisgICAgeworICAgICAgICAvLyBJbiB0aGlzIGNhc2UgU01FIGlmIGluZGVlZCBoYXMgdHJpZ2dlcmVkIGEgCisgICAgICAgIC8vIHByZSBhdXRoIGl0IHdpbGwgdGltZSBvdXQuCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlByZS1BdXRoIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gbmVpZ2hib3IiKSk7CisgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJQcmUtQXV0aCBkb25lIHN0YXRlIikpOworI2VuZGlmCisgICAgLy8gU3RvcHBpbmcgdGltZXIgbm93LCB0aGF0IHdlIGhhdmUgb3VyIHVuaWNhc3QgZnJvbSB0aGUgQVAKKyAgICAvLyBvZiBvdXIgY2hvaWNlLgorICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0ZUX1BSRUFVVEhfUlNQX1RJTUVSKTsKKworCisgICAgLy8gU2F2ZSBvZmYgdGhlIGF1dGggcmVzcC4KKyAgICBpZiAoKHNpckNvbnZlcnRBdXRoRnJhbWUyU3RydWN0KHBNYWMsIHBCb2R5LCBmcmFtZUxlbiwgJnJ4QXV0aEZyYW1lKSAhPSBlU0lSX1NVQ0NFU1MpKQorICAgIHsKKyAgICAgICAgbGltSGFuZGxlRlRQcmVBdXRoUnNwKHBNYWMsIGVTSVJfRkFJTFVSRSwgTlVMTCwgMCwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIHBSeEF1dGhGcmFtZUJvZHkgPSAmcnhBdXRoRnJhbWU7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgRkwoIlJlY2VpdmVkIEF1dGggZnJhbWUgd2l0aCB0eXBlPSVkIHNlcW51bT0lZCwgc3RhdHVzPSVkICglZClcbiIpLAorICAgICAgICAgICAodEFOSV9VMzIpIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyLAorICAgICAgICAgICAodEFOSV9VMzIpIHBSeEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlciwKKyAgICAgICAgICAgKHRBTklfVTMyKSBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSwodEFOSV9VMzIpcE1hYy0+bGltLmdMaW1OdW1QcmVBdXRoQ29udGV4dHMpOykKKyNlbmRpZgorCisgICAgc3dpdGNoIChwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIpCisgICAgeworICAgICAgICBjYXNlIFNJUl9NQUNfQVVUSF9GUkFNRV8yOgorICAgICAgICAgICAgaWYgKHBSeEF1dGhGcmFtZUJvZHktPmF1dGhTdGF0dXNDb2RlICE9IGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTKQorICAgICAgICAgICAgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIkF1dGggc3RhdHVzIGNvZGUgcmVjZWl2ZWQgaXMgICVkXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyKSBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSk7KQorI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldF9zdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiU2VxLiBubyBpbmNvcnJlY3QgZXhwZWN0ZWQgMiByZWNlaXZlZCAlZFxuIiwgCisgICAgICAgICAgICAgICAgKHRBTklfVTMyKSBwUnhBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIpOykKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gU2VuZCB0aGUgQXV0aCByZXNwb25zZSB0byBTTUUKKyAgICBsaW1IYW5kbGVGVFByZUF1dGhSc3AocE1hYywgcmV0X3N0YXR1cywgcEJvZHksIGZyYW1lTGVuLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgIHJldHVybiByZXRfc3RhdHVzOworfQorCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzQmVhY29uRnJhbWUuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0JlYWNvbkZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkZDMwZAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0JlYWNvbkZyYW1lLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltUHJvY2Vzc0JlYWNvbkZyYW1lLmNjIGNvbnRhaW5zIHRoZSBjb2RlCisgKiBmb3IgcHJvY2Vzc2luZyBSZWNlaXZlZCBCZWFjb24gRnJhbWUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMy8wMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyNpbmNsdWRlICJ3bmlDZmdBcC5oIgorI2Vsc2UKKyNpbmNsdWRlICJ3bmlDZmdTdGEuaCIKKyNlbmRpZgorI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgImNmZ0FwaS5oIgorI2luY2x1ZGUgInNjaEFwaS5oIgorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbENvbW1vbkFwaS5oIgorI2VuZGlmCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJsaW1UeXBlcy5oIgorI2luY2x1ZGUgImxpbVV0aWxzLmgiCisjaW5jbHVkZSAibGltQXNzb2NVdGlscy5oIgorI2luY2x1ZGUgImxpbVByb3BFeHRzVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZXJEZXNVdGlscy5oIgorCisvKioKKyAqIGxpbVByb2Nlc3NCZWFjb25GcmFtZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbiBCZWFjb24KKyAqIGZyYW1lIHJlY2VwdGlvbi4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICogMS4gQmVhY29ucyByZWNlaXZlZCBpbiAnbm9ybWFsJyBzdGF0ZSBpbiBJQlNTIGFyZSBoYW5kbGVkIGJ5CisgKiAgICBCZWFjb24gUHJvY2Vzc2luZyBtb2R1bGUuCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcFJ4UGFja2V0SW5mbyAtIEEgcG9pbnRlciB0byBSWCBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVByb2Nlc3NCZWFjb25GcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdHBTaXJNYWNNZ210SGRyICAgICAgcEhkcjsKKyAgICB0U2NoQmVhY29uU3RydWN0ICAgICBiZWFjb247CisKKyAgICBwTWFjLT5saW0uZ0xpbU51bUJlYWNvbnNSY3ZkKys7CisKKyAgICAvKiBoZXJlIGlzIGl0IHJlcXVpcmVkIHRvIGluY3JlbWVudCBzZXNzaW9uIHNwZWNpZmljIGhlYXJ0QmVhdCBiZWFjb24gY291bnRlciAqLyAgCisKKworICAgIAorICAgIHBIZHIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisKKworICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIlJlY2VpdmVkIEJlYWNvbiBmcmFtZSB3aXRoIGxlbmd0aD0lZCBmcm9tICIpLAorICAgICAgICAgICBXREFfR0VUX1JYX01QRFVfTEVOKHBSeFBhY2tldEluZm8pKTsKKyAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzIpOykKKworICAgIGlmIChsaW1EZWFjdGl2YXRlTWluQ2hhbm5lbFRpbWVyRHVyaW5nU2NhbihwTWFjKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHJldHVybjsKKworICAgIC8qKgorICAgICAqIEV4cGVjdCBCZWFjb24gb25seSB3aGVuCisgICAgICogMS4gU1RBIGlzIGluIFNjYW4gbW9kZSB3YWl0aW5nIGZvciBCZWFjb24vUHJvYmUgcmVzcG9uc2Ugb3IKKyAgICAgKiAyLiBTVEEgaXMgd2FpdGluZyBmb3IgQmVhY29uL1Byb2JlIFJlc3Bvc2UgRnJhbWUKKyAgICAgKiAgICB0byBhbm5vdW5jZSBqb2luIHN1Y2Nlc3MuCisgICAgICogMy4gU1RBL0FQIGlzIGluIExlYXJuIG1vZGUKKyAgICAgKi8KKyAgICBpZiAoKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURSkgfHwKKyAgICAgICAgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFKSB8fAorICAgICAgICAocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9MRUFSTl9TVEFURSkgfHwKKyAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX0pPSU5fQkVBQ09OX1NUQVRFKSkKKyAgICB7CisgICAgICAgIC8vIFBhcnNlIHJlY2VpdmVkIEJlYWNvbgorICAgICAgICBpZiAoc2lyQ29udmVydEJlYWNvbkZyYW1lMlN0cnVjdChwTWFjLCAodEFOSV9VOCAqKSBwUnhQYWNrZXRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmVhY29uKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlY2VpdmVkIHdyb25nbHkgZm9ybWF0dGVkL2ludmFsaWQgQmVhY29uLgorICAgICAgICAgICAgLy8gSWdub3JlIGl0IGFuZCBtb3ZlIG9uLgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICAgICAgRkwoIlJlY2VpdmVkIGludmFsaWQgQmVhY29uIGluIHN0YXRlICVYXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisgICAgICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPR1csICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworCisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1JYX01HTVRfVFNGLCAwLCBiZWFjb24udGltZVN0YW1wWzBdKTspCisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1JYX01HTVRfVFNGLCAwLCBiZWFjb24udGltZVN0YW1wWzFdKTspCisKKworICAgICAgICBpZiAoKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgID09IGVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUpIHx8CisgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSAgPT0gZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFKSkKKyAgICAgICAgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgIC8vSWYgd2UgYXJlIHNjYW5uaW5nIGZvciBQMlAsIG9ubHkgYWNjZXB0IHByb2JlIHJzcAorICAgICAgICAgICAgaWYoKHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlICE9IGVMSU1fSEFMX1NDQU5OSU5HX1NUQVRFKSB8fCAoTlVMTCA9PSBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxKSAKKyAgICAgICAgICAgICAgIHx8ICFwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5wMnBTZWFyY2ggKQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltQ2hlY2tBbmRBZGRCc3NEZXNjcmlwdGlvbihwTWFjLCAmYmVhY29uLCBwUnhQYWNrZXRJbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgKChwTWFjLT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSA9PSBlTElNX0hBTF9TQ0FOTklOR19TVEFURSkgPyBlQU5JX0JPT0xFQU5fVFJVRSA6IGVBTklfQk9PTEVBTl9GQUxTRSksIAorICAgICAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fTEVBUk5fU1RBVEUpCisgICAgICAgIHsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgICAgICAgICAvLyBTVEEvQVAgaXMgaW4gbGVhcm4gbW9kZQorICAgICAgICAgICAgLyogTm90IHN1cmUgd2hldGhlciB0aGUgYmVsb3cgMiBsaW5lcyBhcmUgbmVlZGVkIGZvciB0aGUgc3RhdGlvbi4gVE9ETyBJZiB5ZXMsIHRoaXMgc2hvdWxkIGJlIAorICAgICAgICAgICAgICogdW5jb21tZW50ZWQuIEFsc28gd2hlbiB3ZSB0ZXN0ZWQgZW5hYmxpbmcgdGhpcywgdGhlcmUgaXMgYSBjcmFzaCBhcyBzb29uIGFzIHRoZSBzdGF0aW9uCisgICAgICAgICAgICAgKiBjb21lcyB1cCB3aGljaCBuZWVkcyB0byBiZSBmaXhlZCovCisgICAgICAgICAgICAvL2lmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSkKKyAgICAgICAgICAgICAgLy8gIGxpbUNoZWNrQW5kQWRkQnNzRGVzY3JpcHRpb24ocE1hYywgJmJlYWNvbiwgcFJ4UGFja2V0SW5mbywgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICAgICAgbGltQ29sbGVjdE1lYXN1cmVtZW50RGF0YShwTWFjLCBwUnhQYWNrZXRJbmZvLCAmYmVhY29uKTsKKyAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiUGFyc2VkIFdEUyBpbmZvIGluIEJlYWNvbiBmcmFtZXM6IHdkc0xlbmd0aD0lZFxuIiksCisgICAgICAgICAgICAgICBiZWFjb24ucHJvcElFaW5mby53ZHNMZW5ndGgpOykKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHBzZXNzaW9uRW50cnktPmJlYWNvbiAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmJlYWNvbik7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uID0gTlVMTDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YmNuTGVuID0gV0RBX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKTsKKyAgICAgICAgICAgICBpZiggKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKiopJnBzZXNzaW9uRW50cnktPmJlYWNvbiwgcHNlc3Npb25FbnRyeS0+YmNuTGVuKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHN0b3JlIGJlYWNvbiIpKTspCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9TdG9yZSB0aGUgQmVhY29uL1Byb2JlUnNwLiBUaGlzIGlzIHNlbnQgdG8gY3NyL2hkZCBpbiBqb2luIGNuZiByZXNwb25zZS4gCisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5iZWFjb24sIFdEQV9HRVRfUlhfTVBEVV9EQVRBKHBSeFBhY2tldEluZm8pLCBwc2Vzc2lvbkVudHJ5LT5iY25MZW4pOworCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgLy8gU1RBIGluIFdUX0pPSU5fQkVBQ09OX1NUQVRFIChJQlNTKQorICAgICAgICAgICAgbGltQ2hlY2tBbmRBbm5vdW5jZUpvaW5TdWNjZXNzKHBNYWMsICZiZWFjb24sIHBIZHIscHNlc3Npb25FbnRyeSk7CisgICAgICAgIH0gLy8gaWYgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURSkKKyAgICB9IC8vIGlmICgocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9QUk9CRV9SRVNQX1NUQVRFKSB8fCAuLi4KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBJZ25vcmUgQmVhY29uIGZyYW1lIGluIGFsbCBvdGhlciBzdGF0ZXMKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0pPSU5FRF9TVEFURSB8fAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgID09IGVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFIHx8CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSAgPT0gZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTJfU1RBVEUgfHwKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUzX1NUQVRFIHx8CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSAgPT0gZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTRfU1RBVEUgfHwKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlICA9PSBlTElNX01MTV9BVVRIX1JTUF9USU1FT1VUX1NUQVRFIHx8CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9BVVRIRU5USUNBVEVEX1NUQVRFIHx8CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSAgPT0gZUxJTV9NTE1fV1RfQVNTT0NfUlNQX1NUQVRFIHx8CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9SRUFTU09DX1JTUF9TVEFURSB8fAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgID09IGVMSU1fTUxNX0FTU09DSUFURURfU1RBVEUgfHwKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlICA9PSBlTElNX01MTV9SRUFTU09DSUFURURfU1RBVEUgfHwKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlICA9PSBlTElNX01MTV9XVF9BU1NPQ19DTkZfU1RBVEUgfHwKKyAgICAgICAgICAgIGxpbUlzUmVhc3NvY0luUHJvZ3Jlc3MocE1hYyxwc2Vzc2lvbkVudHJ5KSkgeworICAgICAgICAgICAgLy8gbm90aGluZyB1bmV4cGVjdGVkIGFib3V0IGJlYWNvbiBpbiB0aGVzZSBzdGF0ZXMKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtQmVhY29uc0lnbm9yZWQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIEJlYWNvbiBpbiB1bmV4cGVjdGVkIHN0YXRlICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisgICAgICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPRzEsIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKTspCisjaWZkZWYgV0xBTl9ERUJVRyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVVuZXhwQmNuQ250Kys7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30gLyoqKiBlbmQgbGltUHJvY2Vzc0JlYWNvbkZyYW1lKCkgKioqLworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBsaW1Qcm9jZXNzQmVhY29uRnJhbWVOb1Nlc3Npb24KK1xicmllZiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpCitcICAgICAgIHVwb24gQmVhY29uIHJlY2VwdGlvbi4gCitcCitccGFyYW0gcE1hYworXHBhcmFtICpwUnhQYWNrZXRJbmZvICAgIC0gQSBwb2ludGVyIHRvIFJ4IHBhY2tldCBpbmZvIHN0cnVjdHVyZQorXHJldHVybiBOb25lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltUHJvY2Vzc0JlYWNvbkZyYW1lTm9TZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8pCit7CisgICAgdHBTaXJNYWNNZ210SGRyICAgICAgcEhkcjsKKyAgICB0U2NoQmVhY29uU3RydWN0ICAgICBiZWFjb247CisKKyAgICBwTWFjLT5saW0uZ0xpbU51bUJlYWNvbnNSY3ZkKys7CisgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKworICAgIGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiUmVjZWl2ZWQgQmVhY29uIGZyYW1lIHdpdGggbGVuZ3RoPSVkIGZyb20gIiksCisgICAgICAgICAgIFdEQV9HRVRfUlhfTVBEVV9MRU4ocFJ4UGFja2V0SW5mbykpOworICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMik7CisKKyAgICBpZiAobGltRGVhY3RpdmF0ZU1pbkNoYW5uZWxUaW1lckR1cmluZ1NjYW4ocE1hYykgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICByZXR1cm47CisKKyAgICAvKioKKyAgICAgKiBObyBzZXNzaW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLiBFeHBlY3QgQmVhY29uIG9ubHkgd2hlbgorICAgICAqIDEuIFNUQSBpcyBpbiBTY2FuIG1vZGUgd2FpdGluZyBmb3IgQmVhY29uL1Byb2JlIHJlc3BvbnNlIG9yCisgICAgICogMi4gU1RBL0FQIGlzIGluIExlYXJuIG1vZGUKKyAgICAgKi8KKyAgICBpZiAoKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURSkgfHwKKyAgICAgICAgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFKSB8fAorICAgICAgICAocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9MRUFSTl9TVEFURSkpCisgICAgeworICAgICAgICBpZiAoc2lyQ29udmVydEJlYWNvbkZyYW1lMlN0cnVjdChwTWFjLCAodEFOSV9VOCAqKSBwUnhQYWNrZXRJbmZvLCAmYmVhY29uKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlY2VpdmVkIHdyb25nbHkgZm9ybWF0dGVkL2ludmFsaWQgQmVhY29uLiBJZ25vcmUgYW5kIG1vdmUgb24uIAorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJSZWNlaXZlZCBpbnZhbGlkIEJlYWNvbiBpbiBnbG9iYWwgTUxNIHN0YXRlICVYXG4iKSwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSk7CisgICAgICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPR1csICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURSkgfHwKKyAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9QQVNTSVZFX1NDQU5fU1RBVEUpICkKKyAgICAgICAgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgIC8vSWYgd2UgYXJlIHNjYW5uaW5nIGZvciBQMlAsIG9ubHkgYWNjZXB0IHByb2JlIHJzcAorICAgICAgICAgICAgaWYoKHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlICE9IGVMSU1fSEFMX1NDQU5OSU5HX1NUQVRFKSB8fCAoTlVMTCA9PSBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxKSAKKyAgICAgICAgICAgICAgIHx8ICFwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5wMnBTZWFyY2ggKQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltQ2hlY2tBbmRBZGRCc3NEZXNjcmlwdGlvbihwTWFjLCAmYmVhY29uLCBwUnhQYWNrZXRJbmZvLCBlQU5JX0JPT0xFQU5fVFJVRSwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX0xFQVJOX1NUQVRFKQorICAgICAgICB7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApICYmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgICAgICAgICAgLy8gU1RBL0FQIGlzIGluIGxlYXJuIG1vZGUKKyAgICAgICAgICAgIC8qIE5vdCBzdXJlIHdoZXRoZXIgdGhlIGJlbG93IDIgbGluZXMgYXJlIG5lZWRlZCBmb3IgdGhlIHN0YXRpb24uIFRPRE8gSWYgeWVzLCB0aGlzIHNob3VsZCBiZSAKKyAgICAgICAgICAgICAqIHVuY29tbWVudGVkLiBBbHNvIHdoZW4gd2UgdGVzdGVkIGVuYWJsaW5nIHRoaXMsIHRoZXJlIGlzIGEgY3Jhc2ggYXMgc29vbiBhcyB0aGUgc3RhdGlvbgorICAgICAgICAgICAgICogY29tZXMgdXAgd2hpY2ggbmVlZHMgdG8gYmUgZml4ZWQqLworICAgICAgICAgICAgLy9pZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpCisgICAgICAgICAgICAgIC8vICBsaW1DaGVja0FuZEFkZEJzc0Rlc2NyaXB0aW9uKHBNYWMsICZiZWFjb24sIHBSeFBhY2tldEluZm8sIGVBTklfQk9PTEVBTl9UUlVFKTsKKyAgICAgICAgICAgIGxpbUNvbGxlY3RNZWFzdXJlbWVudERhdGEocE1hYywgcFJ4UGFja2V0SW5mbywgJmJlYWNvbik7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HMywgRkwoIlBhcnNlZCBXRFMgaW5mbyBpbiBCZWFjb24gZnJhbWVzOiB3ZHNMZW5ndGg9JWRcbiIpLAorICAgICAgICAgICAgICAgYmVhY29uLnByb3BJRWluZm8ud2RzTGVuZ3RoKTsKKyNlbmRpZgorICAgICAgICB9ICAvLyBlbmQgb2YgZUxJTV9NTE1fTEVBUk5fU1RBVEUpICAgICAgIAorICAgIH0gLy8gZW5kIG9mIChlTElNX01MTV9XVF9QUk9CRV9SRVNQX1NUQVRFKSB8fCAoZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFKQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiUmN2ZCBCZWFjb24gaW4gdW5leHBlY3RlZCBNTE0gc3RhdGUgJWRcbiIpLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKTsKKyAgICAgICAgbGltUHJpbnRNbG1TdGF0ZShwTWFjLCBMT0cxLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKTsKKyNpZmRlZiBXTEFOX0RFQlVHICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgcE1hYy0+bGltLmdMaW1VbmV4cEJjbkNudCsrOworI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuOworfSAvKioqIGVuZCBsaW1Qcm9jZXNzQmVhY29uRnJhbWVOb1Nlc3Npb24oKSAqKiovCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0NmZ1VwZGF0ZXMuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0NmZ1VwZGF0ZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjZkYTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzQ2ZnVXBkYXRlcy5jCkBAIC0wLDAgKzEsOTc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltUHJvY2Vzc0NmZ1VwZGF0ZXMuY2MgY29udGFpbnMgdGhlIHV0aWxpdHkgZnVuY3Rpb25zCisgKiB0byBoYW5kbGUgdmFyaW91cyBDRkcgcGFyYW1ldGVyIHVwZGF0ZSBldmVudHMKKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAxLzIwLzAzCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyNpbmNsdWRlICJ3bmlDZmdBcC5oIgorI2Vsc2UKKyNpbmNsdWRlICJ3bmlDZmdTdGEuaCIKKyNlbmRpZgorI2luY2x1ZGUgInNpck1hY1Byb3REZWYuaCIKKyNpbmNsdWRlICJjZmdBcGkuaCIKKyNpbmNsdWRlICJsaW1UeXBlcy5oIgorI2luY2x1ZGUgImxpbVV0aWxzLmgiCisjaW5jbHVkZSAibGltUHJvcEV4dHNVdGlscy5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxDb21tb25BcGkuaCIKKyNlbmRpZgorI2luY2x1ZGUgInNjaEFwaS5oIgorI2luY2x1ZGUgInBtbUFwaS5oIgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybUFwaS5oIgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGxpbVVwZGF0ZUNvbmZpZyh0cEFuaVNpckdsb2JhbCBwTWFjLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisjaWYgMAorLyoqCisgKiBsaW1HZXRDZmdJZE9mRGVmYXVsdEtleWlkKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IENGRyBJRCBvZiBkZWZhdWx0IGtleSBpZAorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIGRraWQgICAgIC0gVmFsdWUgb2YgZGVmYXVsdCBrZXkgaWQKKyAqIEByZXR1cm4gZGtDZmdJZCAgLSBDRkcgSUQgb2Yga2V5IGNvcnJlc3BvbmRpbmcgdG8gZGVmYXVsdCBrZXkgSWQKKyAqLworCitzdGF0aWMgdEFOSV9VMzIKK2xpbUdldENmZ0lkT2ZEZWZhdWx0S2V5aWQodEFOSV9VMzIgZGtpZCkKK3sKKyAgICBpZiAoZGtpZCA9PSBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWUlEXzApCisgICAgICAgIHJldHVybiBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8xOworICAgIGVsc2UgaWYgKGRraWQgPT0gV05JX0NGR19XRVBfREVGQVVMVF9LRVlJRF8xKQorICAgICAgICByZXR1cm4gV05JX0NGR19XRVBfREVGQVVMVF9LRVlfMjsKKyAgICBlbHNlIGlmIChka2lkID09IFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSURfMikKKyAgICAgICAgcmV0dXJuIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzM7CisgICAgZWxzZSAvLyBka2lkID09IFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSURfMworICAgICAgICByZXR1cm4gV05JX0NGR19XRVBfREVGQVVMVF9LRVlfNDsKK30gLyoqKiBlbmQgbGltR2V0Q2ZnSWRPZkRlZmF1bHRLZXlpZCgpICoqKi8KKyNlbmRpZgorCisKKy8qKgorICogbGltU2V0RGVmYXVsdEtleUlkQW5kS2V5cygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoaWxlIGFwcGx5aW5nIGNvbmZpZ3VyYXRpb24KKyAqIGR1cmluZyBKT0lOL1JFQVNTT0MvU1RBUlRfQlNTLgorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltU2V0RGVmYXVsdEtleUlkQW5kS2V5cyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworI2lmZGVmIEZJWE1FX0dFTjYKKyAgICB0QU5JX1UzMiB2YWw7CisgICAgdEFOSV9VMzIgZGtDZmdJZDsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNldHRpbmcgZGVmYXVsdCBrZXlzIGF0IFNQXG4iKSk7KQorCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSUQsCisgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gcmV0cmlldmUgZGVmYXVsdEtleUlkIGZyb20gQ0ZHXG4iKSk7CisgICAgfQorICAgIGRrQ2ZnSWQgPSBsaW1HZXRDZmdJZE9mRGVmYXVsdEtleWlkKHZhbCk7CisjZW5kaWYKKworfSAvKioqIGVuZCBsaW1TZXREZWZhdWx0S2V5SWRBbmRLZXlzKCkgKioqLworCisKKy8qKgorICogaGFuZGxlQ0JDRkdDaGFuZ2UoKQorICoKKyAqRlVOQ1RJT046CisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogSWYgdGhpcyBBUEkgaXMgaW52b2tlZCB3aXRoCisgKiAgIGNmZ0lkID09IEFOSV9JR05PUkVfQ0ZHX0lECisgKiBUaGVuLAorICogICB0aGlzIHJvdXRpbmUgd2lsbCB0cmF2ZXJzZSB0aHJ1JyBBTEwgdGhlCisgKiAgIHJlbGF0ZWQgQ0ZHJ3MgdGhhdCBhcmUgc3RhdGljYWxseSBzZXR1cAorICogRWxzZSwKKyAqICAgb25seSB1cGRhdGUgdGhpcyAiMSIgQ0ZHIGlkZW50aWZpZWQgYnkgY2ZnSWQKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgY2ZnSWQgLSBJRCBvZiBDRkcgcGFyYW1ldGVyIHRoYXQgZ290IHVwZGF0ZWQKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGhhbmRsZUNCQ0ZHQ2hhbmdlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBjZmdJZCApCit7Cit0QU5JX1UzMiBjZmcsIHZhbCwgaSA9IDA7Cit0QU5JX1UzMiBkZWZhdWx0Q2ZnTGlzdFtdID0geyAKKyAgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSwKKyAgQU5JX0lHTk9SRV9DRkdfSUQgfTsKKworICBkbworICB7CisgICAgLy8KKyAgICAvLyBEZXRlcm1pbmUgaWYgd2UgaGF2ZSB0byB1c2Ugb3VyIG93biBkZWZhdWx0IENGRyBsaXN0CisgICAgLy8gT1Igc2hvdWxkIHdlIHVzZSB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIHVzCisgICAgLy8KKyAgICBpZiggQU5JX0lHTk9SRV9DRkdfSUQgPT0gY2ZnSWQgKQorICAgICAgY2ZnID0gZGVmYXVsdENmZ0xpc3RbaV07IC8vICJuIiBpdGVyYXRpb25zIHJlcWQKKyAgICBlbHNlCisgICAgICBjZmcgPSBjZmdJZDsgLy8gSnVzdCAiMSIgaXRlcmF0aW9uIHJlcWQKKworICAgIHN3aXRjaCggY2ZnICkKKyAgICB7CisgICAgICBjYXNlIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREU6CisgICAgICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gd2xhbl9jZmdHZXRJbnQoIHBNYWMsCisgICAgICAgICAgICAgIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREUsCisgICAgICAgICAgICAgICZ2YWwgKSkKKyAgICAgICAgeworICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgICAgRkwoIlVuYWJsZSB0byByZXRyaWV2ZSBDSEFOTkVMIEJPTkRJTkcgTW9kZSBmcm9tIENGRy4gRGVmYXVsdGluZyB0byBESVNBQkxFXG4iKSk7CisgICAgICAgICAgcE1hYy0+bGltLmdDYk1vZGUgPSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHBNYWMtPmxpbS5nQ2JNb2RlID0gKHRBTklfVTgpIHZhbDsKKworICAgICAgICAvLyBOb3csIHNldCB0aGUgQ0hBTk5FTCBCT05ESU5HIHN0YXRlIGFwcm9wcmlhdGVseQorICAgICAgICBzd2l0Y2goIHBNYWMtPmxpbS5nQ2JNb2RlICkKKyAgICAgICAgeworICAgICAgICAgIC8vIEFsd2F5cyBPRkYKKyAgICAgICAgICBjYXNlIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRToKKyAgICAgICAgICAgIFNFVF9DQl9TVEFURV9ESVNBQkxFKCBwTWFjLT5saW0uZ0NiU3RhdGUgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgLy8gQWx3YXlzIE9OCisgICAgICAgICAgY2FzZSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0VOQUJMRToKKyAgICAgICAgICAgIFNFVF9DQl9TVEFURV9FTkFCTEUoIHBNYWMtPmxpbS5nQ2JTdGF0ZSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU0VUX0NCX1NUQVRFX0VOQUJMRSggcE1hYy0+bGltLmdDYlN0YXRlICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBERUJVRyBMT0cgdGhlIFRJVEFOIENGRydzCisgICAgbGltTG9nKCBwTWFjLCBMT0cxLAorICAgICAgICBGTCgiVGhlIFRJVEFOIHJlbGF0ZWQgZ2xvYmFsIENGRydzIGFyZTogIgorICAgICAgICAgICJjYk1vZGUgLSAlMWQgY2JTdGF0ZSAtICUxZFxuIiksCisgICAgICAgIHBNYWMtPmxpbS5nQ2JNb2RlLCBwTWFjLT5saW0uZ0NiU3RhdGUpOworCisgICAgLy8gSWYgb25seSAiMSIgQ0ZHIG5lZWRzIGFuIHVwZGF0ZSwgdGhlbiByZXR1cm4KKyAgICBpZiggQU5JX0lHTk9SRV9DRkdfSUQgPT0gY2ZnSWQgKQorICAgICAgaSsrOworICAgIGVsc2UKKyAgICAgIGJyZWFrOworCisgIH0gd2hpbGUoIEFOSV9JR05PUkVfQ0ZHX0lEICE9IGRlZmF1bHRDZmdMaXN0W2ldICk7IC8vIEVuZC1PZi1MaXN0PworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVNldENmZ1Byb3RlY3Rpb24KK1xicmllZiBzZXRzIGxpbSBnbG9iYWwgY2ZnIGNhY2hlIGZyb20gdGhlIGNvbmZpZy4KK1xwYXJhbSAgICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xyZXR1cm4gICAgICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3ZvaWQgbGltU2V0Q2ZnUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwZXNlc3Npb25FbnRyeSkKKyNlbHNlCit2b2lkIGxpbVNldENmZ1Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYykKKyNlbmRpZgoreworICAgIHRBTklfVTMyIHZhbCA9IDA7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYoKCBwZXNlc3Npb25FbnRyeSAhPSBOVUxMICkgJiYgKHBlc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSApKXsKKyAgICAgICAgaWYgKHBlc2Vzc2lvbkVudHJ5LT5nTGltUHJvdGVjdGlvbkNvbnRyb2wgPT0gV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFICkKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopJnBlc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uICwgc2l6ZW9mKHRDZmdQcm90ZWN0aW9uKSk7CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIiBmcm0xMWEgPSAlZCwgZnJvbTExYiA9ICVkLCBmcm0xMWcgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0MjAgPSAlZCwgbm9uZ2YgPSAlZCwgbHNpZ1R4b3AgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpZnMgPSAlZCwgb2JzcyA9ICVkXG4iKSwgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5mcm9tbGxhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVzZXNzaW9uRW50cnktPmNmZ1Byb3RlY3Rpb24uZnJvbWxsYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLmZyb21sbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5odDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVzZXNzaW9uRW50cnktPmNmZ1Byb3RlY3Rpb24ubm9uR2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5sc2lnVHhvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLnJpZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5vYnNzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworI2VuZGlmCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04sICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgicmVhZGluZyBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OIGNmZyBmYWlsZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBNYWMtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgPSAodEFOSV9VOCl2YWw7CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgicmVhZGluZyBwcm90ZWN0aW9uIGNmZyBmYWlsZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKHBNYWMtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgPT0gV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSZwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbiAsIHNpemVvZih0Q2ZnUHJvdGVjdGlvbikpOworICAgIGVsc2UKKyAgICAgICAgeworI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApIHx8IGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUF9TREspKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm92ZXJsYXBGcm9tbGxhID0gKHZhbCA+PiBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX0ZST01fbGxBKSAmIDE7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24ub3ZlcmxhcEZyb21sbGIgPSAodmFsID4+IFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09MQkNfRlJPTV9sbEIpICYgMTsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5vdmVybGFwRnJvbWxsZyA9ICh2YWwgPj4gV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfT0xCQ19GUk9NX2xsRykgJiAxOworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm92ZXJsYXBIdDIwID0gKHZhbCA+PiBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX0hUMjApICYgMTsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5vdmVybGFwTm9uR2YgPSAodmFsID4+IFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09MQkNfTk9OX0dGKSAmIDE7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24ub3ZlcmxhcExzaWdUeG9wID0gKHZhbCA+PiBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX0xTSUdfVFhPUCkgJiAxOworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm92ZXJsYXBSaWZzID0gKHZhbCA+PiBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX1JJRlMpICYgMTsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5vdmVybGFwT0JTUyA9ICh2YWw+PiBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9PTEJDX09CU1MgKSYxOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIHBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmZyb21sbGEgPSAodmFsID4+IFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX0ZST01fbGxBKSAmIDE7CisgICAgICAgICAgICBwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5mcm9tbGxiID0gKHZhbCA+PiBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9GUk9NX2xsQikgJiAxOworICAgICAgICAgICAgcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24uZnJvbWxsZyA9ICh2YWwgPj4gV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfRlJPTV9sbEcpICYgMTsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmh0MjAgPSAodmFsID4+IFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX0hUXzIwKSAmIDE7CisgICAgICAgICAgICBwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5ub25HZiA9ICh2YWwgPj4gV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfTk9OX0dGKSAmIDE7CisgICAgICAgICAgICBwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5sc2lnVHhvcCA9ICh2YWwgPj4gV05JX0NGR19QUk9URUNUSU9OX0VOQUJMRURfTFNJR19UWE9QKSAmIDE7CisgICAgICAgICAgICBwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5yaWZzID0gKHZhbCA+PiBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRF9SSUZTKSAmIDE7CisgICAgICAgICAgICBwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5vYnNzPSAodmFsID4+IFdOSV9DRkdfUFJPVEVDVElPTl9FTkFCTEVEX09CU1MpICYgMTsKKworICAgICAgICB9CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorfQorI2VuZGlmCit9CisKKworCisvKioKKyAqIGxpbVVwZGF0ZVRyaWdnZXJTdGFCa1NjYW5GbGFnCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGxpbSBnbG9iYWwgZ0xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzCisgKiBiYXNlZCBvbiBjZmcgY29uZmlndXJhdGlvbi4gIFVzdWFsbHkgdHJpZ2dlcmVkIGFmdGVyIGEgY2ZnU2V0SW50IGNhbGwuCisgKgorICogUEFSQU1TOgorICogcE1hYyAgICAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0YXRpYyB0U2lyUmV0U3RhdHVzIGxpbVVwZGF0ZVRyaWdnZXJTdGFCa1NjYW5GbGFnKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VMzIgdmFsOworICAgIHRBTklfVTggZmxhZzsKKworICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTiwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJGYWlsZWQgdG8gZ2V0IFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTiBmcm9tIGNmZ1xuIikpOykKKyAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGZsYWcgPSAodmFsKSA/IDEgOiAwOworICAgIGlmKGZsYWcgIT0gcE1hYy0+bGltLmdMaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW5EdXJpbmdRdWlldEJzcykKKyAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBnbG9iYWwgZmxhZyAqLworICAgICAgICBwTWFjLT5saW0uZ0xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzID0gZmxhZzsKKyAgICAgICAgLypVcGRhdGUgYmVhY29uIHByb3AgSUUgYWxzbyBpZiB3ZSdyZSBhbiBBUCAqLworCisgICAgICAgIC8vY2FsbCBhIHdyYXBwZXIgYW5kIGlmIHRoZSBzZXNzaW9uIHJvbGUgaXMgb3RoZXIgdGhhbiB0aGUgc3RhIGNhbGwgdGhpcyBmdW5jdGlvbiBzY2hzZXRmaXhlZGJlYWNvbiBmaWVsZHMgZnVuY3Rpb24KKyAgICAgICAgbGltVXBkYXRlQmVhY29uKHBNYWMpOworCisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKK30KKworCisvKioKKyAqIGxpbUhhbmRsZUNGR3BhcmFtVXBkYXRlKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VzKCkgdG8KKyAqIHdoZW5ldmVyIFNJUl9DRkdfUEFSQU1fVVBEQVRFX0lORCBtZXNzYWdlIGlzIHBvc3RlZAorICogdG8gTElNIChkdWUgdG8gYSBzZXQgb3BlcmF0aW9uIG9uIGEgQ0ZHIHBhcmFtZXRlcikuCisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgY2ZnSWQgLSBJRCBvZiBDRkcgcGFyYW1ldGVyIHRoYXQgZ290IHVwZGF0ZWQKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbUhhbmRsZUNGR3BhcmFtVXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGNmZ0lkKQoreworICAgIHRBTklfVTMyIHZhbDEsIHZhbDI7CisgICAgdEFOSV9VMTYgdmFsMTY7CisgICAgdEFOSV9VOCB2YWw4OworICAgIHRTaXJNYWNIVENhcGFiaWxpdHlJbmZvICAgKnBIVENhcGFiaWxpdHlJbmZvOworICAgIHRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvICpwQW1wZHVQYXJhbUluZm87CisgICAgdFNpck1hY0hUSW5mb0ZpZWxkMSAgICAgICAgICpwSFRJbmZvRmllbGQxOworCisgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiSGFuZGxpbmcgQ0ZHIHBhcmFtZXRlciBpZCAlWCB1cGRhdGVcbiIpLCBjZmdJZCk7KQorICAgIHN3aXRjaCAoY2ZnSWQpCisgICAgeworICAgICAgICBjYXNlIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSUQ6CisKKyAgICAgICAgICAgIC8vICEhTEFDIC0gd2hlbiB0aGUgZGVmYXVsdCBLZXlJRCBpcyBjaGFuZ2VkLCBmb3JjZSBhbGwgb2YgdGhlCisgICAgICAgICAgICAvLyBrZXlzIGFuZCB0aGUga2V5SUQgdG8gYmUgcmVwcm9ncmFtbWVkLiAgdGhpcyBhbGxvd3MgdGhlCisgICAgICAgICAgICAvLyBrZXlzIHRvIGNoYW5nZSBhZnRlciB0aGUgaW5pdGlhbCBzZXR0aW5nIG9mIHRoZSBrZXlzIHdoZW4gdGhlIENGRyB3YXMKKyAgICAgICAgICAgIC8vIGFwcGxpZWQgYXQgYXNzb2NpYXRpb24gdGltZSB0aHJvdWdoIENGRyBjaGFuZ2VzIG9mIHRoZSBrZXlzLgorICAgICAgICAgICAgbGltU2V0RGVmYXVsdEtleUlkQW5kS2V5cyggcE1hYyApOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdOSV9DRkdfRVhDTFVERV9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0VYQ0xVREVfVU5FTkNSWVBURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoIlVuYWJsZSB0byByZXRyaWV2ZSBleGNsdWRlVW5lbmNyIGZyb20gQ0ZHXG4iKSk7CisgICAgICAgICAgICB9CisjaWYgMAorICAgICAgICAgICAgaGFsU2V0U3BFeGNsVW5kZWNyeXB0ZWQocE1hYywgKHRIYWxCaXRWYWwpIHZhbCk7CisjZWxzZQorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoIlVuc3VwcG9ydGVkIENGRzogV05JX0NGR19FWENMVURFX1VORU5DUllQVEVEXG4iKSk7CisjZW5kaWYKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXTklfQ0ZHX0FTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVDoKKyAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlICE9IGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAnQ2hhbmdlJyB0aW1lciBmb3IgZnV0dXJlIGFjdGl2YXRpb25zCisgICAgICAgICAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fQVNTT0NfRkFJTF9USU1FUik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gV0xBTl9TVEEpIHx8IGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgICAgIGNhc2UgV05JX0NGR19CQUNLR1JPVU5EX1NDQU5fUEVSSU9EOgorCisKKyAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0JBQ0tHUk9VTkRfU0NBTl9USU1FUik7CisKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9QRVJJT0QsICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsICBGTCgiY291bGQgbm90IHJldHJpZXZlIEJhY2tncm91bmQgc2NhbiBwZXJpb2QgdmFsdWVcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWwxID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKworCisgICAgICAgICAgICBpZiAoIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSkgfHwKKyAgICAgICAgICAgICAgICAgKCAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkgJiYKKyAgICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9OT1JNQUxfU1RBVEUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBSZWFjdGl2YXRlIEJhY2tncm91bmQgc2NhbiB0aW1lcgorICAgICAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX0JBQ0tHUk9VTkRfU0NBTl9USU1FUikpOworICAgICAgICAgICAgICAgIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQmFja2dyb3VuZFNjYW5UaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgYWN0aXZhdGUgYmFja2dyb3VuZCBzY2FuIHRpbWVyLgorICAgICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCBhY3RpdmF0ZSBiYWNrZ3JvdW5kIHNjYW4gdGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhblN0YXJ0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhblRlcm1pbmF0ZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5TdGFydGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhblRlcm1pbmF0ZSA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiVXBkYXRlZCBCYWNrZ3JvdW5kIHNjYW4gcGVyaW9kXG4iKSk7KQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgICAgICBjYXNlIFdOSV9DRkdfUFJFQVVUSF9DTE5VUF9USU1FT1VUOgorICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9QUkVfQVVUSF9DTEVBTlVQX1RJTUVSKTsKKworI2lmZGVmIEdFTjZfVE9ETworICAgICAgICAgICAgICAgIC8qIHJldmlzaXQgdGhpcyBwaWVjZSBvZiBjb2RlIHRvIGFzc2lnbiB0aGUgYXBwcm9wcmlhdGUgc2Vzc2lvbklkIGJlbG93CisgICAgICAgICAgICAgICAgICogcHJpb3JpdHkgLSBNRURJVU0KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QcmVBdXRoQ2xudXBUaW1lci5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAvLyBSZWFjdGl2YXRlIHByZS1hdXRoIGNsZWFudXAgdGltZXIKKyAgICAgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9QUkVfQVVUSF9DTEVBTlVQX1RJTUVSKSk7CisgICAgICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QcmVBdXRoQ2xudXBUaW1lcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBhY3RpdmF0ZSBwcmUtYXV0aCBjbGVhbnVwIHRpbWVyLgorICAgICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCBhY3RpdmF0ZSBwcmVhdXRoIGNsZWFudXAgdGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJVcGRhdGVkIHByZS1hdXRoIGNsZWFudXAgdGltZW91dFxuIikpOykKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyNlbmRpZgorCisgICAgICAgIGNhc2UgV05JX0NGR19CR19TQ0FOX0NIQU5ORUxfTElTVDoKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBXTEFOX1NUQSkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgIEZMKCJWQUxJRF9DSEFOTkVMX0xJU1QgaGFzIGNoYW5nZWQsIHJlc2V0IG5leHQgYmcgc2NhbiBjaGFubmVsXG4iKSk7KQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhbkNoYW5uZWxJZCA9IDA7CisjZW5kaWYKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREU6CisgICAgICAgICBoYW5kbGVDQkNGR0NoYW5nZSggcE1hYywgY2ZnSWQgKTsKKyAgICAgICAgIC8vZm9yIFNlY29uZGFyeSBjaGFubmVsLCBjaGFuZ2Ugc2V0dXBDQk1vZGUgZnVuY3Rpb24gT1IgdGhlIGNhbGxlciBvZiB0aGF0IGZ1bmN0aW9uIGR1cmluZyBKb2luIChTVEEpIG9yIFN0YXJ0IEJTUyhBUC9JQlNTKQorICAgICAgICAgLy9Ob3cgdXBkYXRlIHRoZSBIVCBDYXBhYmlsaXR5IENGRyBiYXNlZCBvbiBDaGFubmVsIEJvbmRpbmcgQ0ZHCisgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgJnZhbDEpICE9IGVTSVJfU1VDQ0VTUykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEhUIENhcCBDRkdcbiIpKTspCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFLCAmdmFsMikgIT0gZVNJUl9TVUNDRVNTKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQ2hhbm5lbCBCb25kaW5nIENGR1xuIikpOykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgdmFsMTYgPSAoIHRBTklfVTE2ICkgdmFsMTsKKyAgICAgICAgcEhUQ2FwYWJpbGl0eUluZm8gPSAoIHRTaXJNYWNIVENhcGFiaWxpdHlJbmZvKiApICZ2YWwxNjsKKworICAgICAgICAvL2NoYW5uZWwgYm9uZGluZyBtb2RlIGNvdWxkIGJlIHNldCB0byBhbnl0aGluZyBmcm9tIDAgdG8gNChUaXRhbiBoYWQgdGhlc2UgbW9kZXMpCisgICAgICAgIC8vQnV0IGZvciBUYXVydXMgd2UgaGF2ZSBvbmx5IHR3byBtb2RlczogZW5hYmxlKD4wKSBvciBkaXNhYmxlKD0wKQorICAgICAgICBwSFRDYXBhYmlsaXR5SW5mby0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0gdmFsMiA/IFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRU5BQkxFIDogV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworICAgICAgICBpZihjZmdTZXRJbnQocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgKih0QU5JX1UxNiopcEhUQ2FwYWJpbGl0eUluZm8pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgQ2FwIEluZm8gQ0ZHXG4iKSk7KQorCisgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IVF9JTkZPX0ZJRUxEMSwgJnZhbDEpICE9IGVTSVJfU1VDQ0VTUykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEhUIElORk8gRmllbGQxIENGR1xuIikpOykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgdmFsOCA9ICggdEFOSV9VOCApIHZhbDE7CisgICAgICAgIHBIVEluZm9GaWVsZDEgPSAoIHRTaXJNYWNIVEluZm9GaWVsZDEqICkgJnZhbDg7CisgICAgICAgIHBIVEluZm9GaWVsZDEtPnJlY29tbWVuZGVkVHhXaWR0aFNldCA9ICh0QU5JX1U4KXBIVENhcGFiaWxpdHlJbmZvLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQ7CisgICAgICAgIHBNYWMtPmxpbS5nSFRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPSBwSFRJbmZvRmllbGQxLT5yZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisgICAgICAgIGlmKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0hUX0lORk9fRklFTEQxLCAqKHRBTklfVTgqKXBIVEluZm9GaWVsZDEpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgSW5mbyBGaWVsZFxuIikpOykKKworICAgICAgICBicmVhazsKKworCisgICAgY2FzZSBXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU46CisgICAgICAgIGlmKGxpbVVwZGF0ZVRyaWdnZXJTdGFCa1NjYW5GbGFnKHBNYWMpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwKKyAgICAgICAgICAgICAgIEZMKCJVcGRhdGluZyBsaW0gdHJpZ2dlciBzdGEgYmsgc2NhbiBnbG9iYWwgZmxhZyBmYWlsZWQhXG4iKSk7KQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTklfQ0ZHX1BST1RFQ1RJT05fRU5BQkxFRDoKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGxpbVNldENmZ1Byb3RlY3Rpb24ocE1hYywgTlVMTCk7CisjZWxzZQorICAgICAgICBsaW1TZXRDZmdQcm90ZWN0aW9uKHBNYWMpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHOgorICAgIHsKKyAgICAgICAgdFNpck1zZ1EgbXNnID0gezB9OworICAgICAgICB0QU5JX1UzMiBzdGF0dXM7CisKKyAgICAgICAgbXNnLnR5cGUgPSBTSVJfTElNX1VQREFURV9CRUFDT047CisKKyAgICAgICAgc3RhdHVzID0gbGltUG9zdE1zZ0FwaShwTWFjLCAmbXNnKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgbGltUG9zdE1zZ0FwaVxuIiksIHN0YXR1cyk7KQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBXTklfQ0ZHX0dSRUVORklFTERfQ0FQQUJJTElUWToKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgSFQgQ2FwIEluZm8gQ0ZHXG4iKSk7KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZLCAmdmFsMikgIT0gZVNJUl9TVUNDRVNTKSAKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEdyZWVuRmllbGQgQ0ZHXG4iKSk7KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdmFsMTYgPSAoIHRBTklfVTE2ICkgdmFsMTsKKyAgICAgICAgcEhUQ2FwYWJpbGl0eUluZm8gPSAoIHRTaXJNYWNIVENhcGFiaWxpdHlJbmZvKiApICZ2YWwxNjsKKyAgICAgICAgcEhUQ2FwYWJpbGl0eUluZm8tPmdyZWVuRmllbGQgPSAodEFOSV9VMTYpdmFsMjsKKyAgICAgICAgaWYoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICoodEFOSV9VMTYqKXBIVENhcGFiaWxpdHlJbmZvKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgdXBkYXRlIEhUIENhcCBJbmZvIENGR1xuIikpOykKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdOSV9DRkdfSFRfUlhfU1RCQzoKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgV05JX0NGR19IVF9DQVBfSU5GTyBcbiIpKTspCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IVF9SWF9TVEJDLCAmdmFsMikgIT0gZVNJUl9TVUNDRVNTKSAKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIFdOSV9DRkdfSFRfUlhfU1RCQ1xuIikpOykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZhbDE2ID0gKCB0QU5JX1UxNiApIHZhbDE7CisgICAgICAgIHBIVENhcGFiaWxpdHlJbmZvID0gKCB0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyogKSAmdmFsMTY7CisgICAgICAgIHBIVENhcGFiaWxpdHlJbmZvLT5yeFNUQkMgPSAodEFOSV9VMTYpdmFsMjsKKyAgICAgICAgaWYoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICoodEFOSV9VMTYqKXBIVENhcGFiaWxpdHlJbmZvKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgdXBkYXRlIEhUIENhcCBJbmZvIENGR1xuIikpOykKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSDoKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEhUIENhcCBJbmZvIENGR1xuIikpOykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfTUFYX0FNU0RVX0xFTkdUSCwgJnZhbDIpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgTWF4IEFNU0RVIExlbmd0aCBDRkdcbiIpKTspCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIHZhbDE2ID0gKCB0QU5JX1UxNiApIHZhbDE7CisgICAgICAgIHBIVENhcGFiaWxpdHlJbmZvID0gKCB0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyogKSAmdmFsMTY7CisgICAgICAgIHBIVENhcGFiaWxpdHlJbmZvLT5tYXhpbWFsQU1TRFVzaXplID0gKHRBTklfVTE2KXZhbDI7CisgICAgICAgIGlmKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0hUX0NBUF9JTkZPLCAqKHRBTklfVTE2KilwSFRDYXBhYmlsaXR5SW5mbykgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHVwZGF0ZSBIVCBDYXAgSW5mbyBDRkdcbiIpKTspCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaOgorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgJnZhbDEpICE9IGVTSVJfU1VDQ0VTUykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEhUIENhcCBDRkdcbiIpKTspCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1NIT1JUX0dJXzIwTUhaLCAmdmFsMikgIT0gZVNJUl9TVUNDRVNTKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgc2hvcnRHSSAyME1oeiBDRkdcbiIpKTspCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIHZhbDE2ID0gKCB0QU5JX1UxNiApIHZhbDE7CisgICAgICAgIHBIVENhcGFiaWxpdHlJbmZvID0gKCB0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyogKSAmdmFsMTY7CisgICAgICAgIHBIVENhcGFiaWxpdHlJbmZvLT5zaG9ydEdJMjBNSHogPSAodEFOSV9VMTYpdmFsMjsKKyAgICAgICAgaWYoY2ZnU2V0SW50KHBNYWMsICBXTklfQ0ZHX0hUX0NBUF9JTkZPLCAqKHRBTklfVTE2KilwSFRDYXBhYmlsaXR5SW5mbykgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHVwZGF0ZSBIVCBDYXAgSW5mbyBDRkdcbiIpKTspCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV05JX0NGR19TSE9SVF9HSV80ME1IWjoKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBIVCBDYXAgQ0ZHXG4iKSk7KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19TSE9SVF9HSV80ME1IWiwgJnZhbDIpICE9IGVTSVJfU1VDQ0VTUykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIHNob3J0R0kgNDBNaHogQ0ZHXG4iKSk7KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB2YWwxNiA9ICggdEFOSV9VMTYgKSB2YWwxOworICAgICAgICBwSFRDYXBhYmlsaXR5SW5mbyA9ICggdFNpck1hY0hUQ2FwYWJpbGl0eUluZm8qICkgJnZhbDE2OworICAgICAgICBwSFRDYXBhYmlsaXR5SW5mby0+c2hvcnRHSTQwTUh6ID0gKHRBTklfVTE2KXZhbDI7CisgICAgICAgIGlmKGNmZ1NldEludChwTWFjLCAgV05JX0NGR19IVF9DQVBfSU5GTywgKih0QU5JX1UxNiopcEhUQ2FwYWJpbGl0eUluZm8pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgQ2FwIEluZm8gQ0ZHXG4iKSk7KQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFdOSV9DRkdfTVBEVV9ERU5TSVRZOgorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IVF9BTVBEVV9QQVJBTVMsICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBIVCBBTVBEVSBQYXJhbSBDRkdcbiIpKTspCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX01QRFVfREVOU0lUWSwgJnZhbDIpICE9IGVTSVJfU1VDQ0VTUykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIE1QRFUgRGVuc2l0eSBDRkdcbiIpKTspCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIHZhbDE2ID0gKCB0QU5JX1UxNiApIHZhbDE7CisgICAgICAgIHBBbXBkdVBhcmFtSW5mbyA9ICggdFNpck1hY0hUUGFyYW1ldGVyc0luZm8qICkgJnZhbDE2OworICAgICAgICBwQW1wZHVQYXJhbUluZm8tPm1wZHVEZW5zaXR5ID0gKHRBTklfVTgpdmFsMjsKKyAgICAgICAgaWYoY2ZnU2V0SW50KHBNYWMsICBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNUywgKih0QU5JX1U4KilwQW1wZHVQYXJhbUluZm8pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgQU1QRFUgUGFyYW0gQ0ZHXG4iKSk7KQorCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV05JX0NGR19NQVhfUlhfQU1QRFVfRkFDVE9SOgorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IVF9BTVBEVV9QQVJBTVMsICZ2YWwxKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBIVCBBTVBEVSBQYXJhbSBDRkdcbiIpKTspCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX01BWF9SWF9BTVBEVV9GQUNUT1IsICZ2YWwyKSAhPSBlU0lSX1NVQ0NFU1MpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBBTVBEVSBGYWN0b3IgQ0ZHXG4iKSk7KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB2YWwxNiA9ICggdEFOSV9VMTYgKSB2YWwxOworICAgICAgICBwQW1wZHVQYXJhbUluZm8gPSAoIHRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvKiApICZ2YWwxNjsKKyAgICAgICAgcEFtcGR1UGFyYW1JbmZvLT5tYXhSeEFNUERVRmFjdG9yID0gKHRBTklfVTgpdmFsMjsKKyAgICAgICAgaWYoY2ZnU2V0SW50KHBNYWMsICBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNUywgKih0QU5JX1U4KilwQW1wZHVQYXJhbUluZm8pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCB1cGRhdGUgSFQgQU1QRFUgUGFyYW0gQ0ZHXG4iKSk7KQorICAgICAgICBicmVhazsKKyAgCisgICAgY2FzZSBXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xEOgorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCwgJnZhbDEpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQgQ0ZHXG4iKSk7KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKCF2YWwxKSAKKyAgICAgICAgeworICAgICAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fSEVBUlRfQkVBVF9USU1FUik7CisgICAgICAgICAgICBwTWFjLT5zeXMuZ1N5c0VuYWJsZUxpbmtNb25pdG9yTW9kZSA9IDA7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICJEZWFjdGl2YXRpbmcgaGVhcnRiZWF0IGxpbmsgbW9uaXRvcmluZ1xuIik7KQorICAgICAgICB9IAorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5zeXMuZ1N5c0VuYWJsZUxpbmtNb25pdG9yTW9kZSA9IDE7CisgICAgICAgICAgICAvL2xpbVJlYWN0aXZhdGVUaW1lciggcE1hYywgZUxJTV9IRUFSVF9CRUFUX1RJTUVSICk7CisgICAgICAgICAgICAvL2xpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgIlJlYWN0aXZhdGluZyBoZWFydGJlYXQgbGluayBtb25pdG9yaW5nXG4iKTspCisgICAgICAgIH0gICAgICAgIAorICAgIGNhc2UgV05JX0NGR19NQVhfUFNfUE9MTDoKKyAgICBjYXNlIFdOSV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFOgorICAgIGNhc2UgV05JX0NGR19NSU5fUlNTSV9USFJFU0hPTEQ6CisgICAgY2FzZSBXTklfQ0ZHX05USF9CRUFDT05fRklMVEVSOgorICAgIGNhc2UgV05JX0NGR19CUk9BRENBU1RfRlJBTUVfRklMVEVSX0VOQUJMRToKKyAgICAgICAgeworICAgICAgICAgICAgdHBTaXJQb3dlclNhdmVDZmcgcFBvd2VyU2F2ZUNvbmZpZzsKKworICAgICAgICAgICAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gcG93ZXIgc2F2ZSBjb25maWd1cmF0aW9uLiAqLworICAgICAgICAgICAgaWYgKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwUG93ZXJTYXZlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyUG93ZXJTYXZlQ2ZnKSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJMSU06IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBvd2VyIHNhdmUgY29uZmlndXJhdGlvblxuIikpOykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogVGhpcyBjb250ZXh0IHNob3VsZCBiZSB2YWxpZCBpZiBwb3dlci1zYXZlIGNvbmZpZ3VyYXRpb24gbWVzc2FnZSBoYXMgYmVlbiBhbHJlYWR5IGRpc3BhdGhlZCAKKyAgICAgICAgICAgICAqIGR1cmluZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzLiBSZS11c2luZyB0aGUgcHJlc2VudCBjb25maWd1cmF0aW9uIG1hc2sKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwUG93ZXJTYXZlQ29uZmlnLCAodEFOSV9VOCAqKSZwTWFjLT5wbW0uZ1BtbUNmZywgc2l6ZW9mKHRTaXJQb3dlclNhdmVDZmcpKTsKKworICAgICAgICAgICAgaWYgKCAocG1tU2VuZFBvd2VyU2F2ZUNmZyhwTWFjLCBwUG93ZXJTYXZlQ29uZmlnKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkxJTTogcG1tU2VuZFBvd2VyU2F2ZUNmZygpIGZhaWxlZCBcbiIpKTspCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKworICAgICBjYXNlIFdOSV9DRkdfRE9UMTFfTU9ERToKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfRE9UMTFfTU9ERSwgJnZhbDEpICE9IGVTSVJfU1VDQ0VTUykgCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBEb3QxMSBNb2RlICBDRkdcbiIpKTspCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBUT0RPICovCisgICAgICAgIC8vcHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlID0gdmFsMTsgICAgLy8vLyB1biBjb21tZW50IHRoaXMgbGluZSAuLi5GT1JCVUlMRCAtVEVNUEZJWC4uIEhPVyBUTyBHRVQgc2Vzc2lvbkVudHJ5Pz8/Pz8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXTklfQ0ZHX0FEREJBX1JFUV9ERUNMSU5FOgorICAgICAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0FEREJBX1JFUV9ERUNMSU5FLCAmdmFsMSkgIT0gZVNJUl9TVUNDRVNTKSB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiVW5hYmxlIHRvIGdldCBBRERCQV9SRVFfREVDTElORSBjZmdcbiIgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwTWFjLT5saW0uZ0FkZEJBX0RlY2xpbmVkID0gKHRBTklfVTgpdmFsMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRToKKyAgICAgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRSwgJnZhbDEpICE9IGVTSVJfU1VDQ0VTUykgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIlVuYWJsZSB0byBnZXQgV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRSBcbiIgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwTWFjLT5saW0uZ1NjYW5JblBvd2Vyc2F2ZSA9ICh0QU5JX1U4KXZhbDE7CisgICAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlUOgorICAgICAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0FTU09DX1NUQV9MSU1JVCwgJnZhbDEpICE9IGVTSVJfU1VDQ0VTUykgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIlVuYWJsZSB0byBnZXQgV05JX0NGR19BU1NPQ19TVEFfTElNSVQiICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcE1hYy0+bGltLmdMaW1Bc3NvY1N0YUxpbWl0ID0gKHRBTklfVTE2KXZhbDE7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30gLyoqKiBlbmQgbGltSGFuZGxlQ0ZHcGFyYW1VcGRhdGUoKSAqKiovCisKKworCisvKioKKyAqIGxpbUFwcGx5Q29uZmlndXJhdGlvbigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFwcGx5IHRoZSBjb25maWd1cmVkIHBhcmFtZXRlcnMKKyAqIGJlZm9yZSBqb2luaW5nIG9yIHJlYXNzb2NpYXRpbmcgd2l0aCBhIEJTUyBvciBzdGFydGluZyBhIEJTUy4KKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltQXBwbHlDb25maWd1cmF0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgICB2YWw9MCwgcGh5TW9kZTsKKworICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIkFwcGx5aW5nIGNvbmZpZ1xuIikpOykKKworI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApIHx8IGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUF9TREspKQorICAgIGxpbUNsZWFudXBNZWFzUmVzb3VyY2VzKHBNYWMpOworI2VuZGlmCisgICAgbGltSW5pdFdkc0luZm9QYXJhbXMocE1hYyk7CisKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1TZW50Q2Fwc0NoYW5nZU50ZiA9IGZhbHNlOworCisgICAgbGltR2V0UGh5TW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIAorICAgIC8vIFNldCBkZWZhdWx0IGtleUlkIGFuZCBrZXlzCisgICAgbGltU2V0RGVmYXVsdEtleUlkQW5kS2V5cyhwTWFjKTsKKworICAgIGxpbVVwZGF0ZUNvbmZpZyhwTWFjLHBzZXNzaW9uRW50cnkpOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FLCAmdmFsKQorICAgICAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwaHlNb2RlID09IFdOSV9DRkdfUEhZX01PREVfMTFHKQorICAgIHsKKworICAgICAgICBpZiAoKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfU1RBX1NBUF9NT0RFKSB8fAorICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfR09fTU9ERSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbCA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9ncmFtIFBvbGFyaXMgYmFzZWQgb24gQVAgY2FwYWJpbGl0eQorCisgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9KT0lOX0JFQUNPTl9TVEFURSkKKyAgICAgICAgICAgIC8vIEpvaW5pbmcgQlNTLgorICAgICAgICAgICAgdmFsID0gU0lSX01BQ19HRVRfU0hPUlRfU0xPVF9USU1FKCBwc2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QnNzQ2Fwcyk7CisgICAgICAgIGVsc2UgaWYgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX1JFQVNTT0NfUlNQX1NUQVRFKQorICAgICAgICAgICAgLy8gUmVhc3NvY2lhdGluZyB3aXRoIEFQLgorICAgICAgICAgICAgdmFsID0gU0lSX01BQ19HRVRfU0hPUlRfU0xPVF9USU1FKCBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzQ2Fwcyk7CisKKyAKKyAgICAgICAgaWYgKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRSwgdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHVwZGF0ZSBzaG9ydCBzbG90IHRpbWUgYXQgQ0ZHXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gUmVzZXQgc2hvcnQgc2xvdCB0aW1lIGF0IENGRworICAgICAgICBpZiAoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FLCAwKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHVwZGF0ZSBzaG9ydCBzbG90IHRpbWUgYXQgQ0ZHXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIH0KKyAgICAvL2FwcGx5IHByb3RlY3Rpb24gcmVsYXRlZCBjb25maWcuCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgbGltU2V0Q2ZnUHJvdGVjdGlvbihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsgICAgCisjZWxzZQorICAgIGxpbVNldENmZ1Byb3RlY3Rpb24ocE1hYyk7ICAgIAorI2VuZGlmCisKKworICAgIC8qIEFkZGVkIGZvciBCVCAtIEFNUCBTdXBwb3J0ICovCisgICAgaWYgKCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpIHx8CisgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKXx8CisgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpfHwKKyAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSApCisgICAgeworICAgICAgICAvKiBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGUgYmVhY29uIGdlbmVyYXRpb24gaXMgbm90IGRvbmUgCisgICAgICAgICAgIGFzIGEgcGFydCBvZiBqb2luIHJlcXVlc3QgZm9yIGEgQlQtQU1QIHN0YXRpb24gKi8KKworICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5zdGF0eXBlRm9yQnNzID09IFNUQV9FTlRSWV9TRUxGKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJJbml0aWFsaXppbmcgQlQtQU1QIGJlYWNvbiBnZW5lcmF0aW9uXG4iKSk7KQorICAgICAgICAgICAgc2NoU2V0QmVhY29uSW50ZXJ2YWwocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRSwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgV05JX0NGR19TQ0FOX0lOX1BPV0VSU0FWRVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBNYWMtPmxpbS5nU2NhbkluUG93ZXJzYXZlID0gKHRBTklfVTgpIHZhbDsKKworfSAvKioqIGVuZCBsaW1BcHBseUNvbmZpZ3VyYXRpb24oKSAqKiovCisKKworLyoqCisgKiBsaW1VcGRhdGVDb25maWcKKyAqCisgKiBGVU5DVElPTjoKKyAqIFVwZGF0ZSB0aGUgbG9jYWwgc3RhdGUgZnJvbSBDRkcgZGF0YWJhc2UKKyAqIChUaGlzIHVzZWQgdG8gYmUgZHBoVXBkYXRlQ29uZmlnKQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIE5vbmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitsaW1VcGRhdGVDb25maWcodHBBbmlTaXJHbG9iYWwgcE1hYyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTMyIHZhbDsKKworICAgICNpZiAwCisgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsIFdOSV9DRkdfU1RBX0lELCBwTWFjLT5saW0uZ0xpbU15TWFjQWRkciwgJmxlbikgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgc3RhIGlkIGZhaWxlZFxuIikpOworICAgICNlbmRpZiAvL1RvIFNVUFBPUlQgQlQtQU1QCisgICAgc2lyQ29weU1hY0FkZHIocE1hYy0+bGltLmdMaW1NeU1hY0FkZHIscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfUFJFQU1CTEUsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IHNob3J0IHByZWFtYmxlIGZhaWxlZFxuIikpOworICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZSA9ICh2YWwpID8gMSA6IDA7CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19XTUVfRU5BQkxFRCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgd21lIGVuYWJsZWQgZmFpbGVkXG4iKSk7CisgICAgcHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCA9ICh2YWwpID8gMSA6IDA7CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19XU01fRU5BQkxFRCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgd3NtIGVuYWJsZWQgZmFpbGVkXG4iKSk7CisgICAgcHNlc3Npb25FbnRyeS0+bGltV3NtRW5hYmxlZCA9ICh2YWwpID8gMSA6IDA7CisKKyAgICBpZiAoKCEgcHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCkgJiYgKHBzZXNzaW9uRW50cnktPmxpbVdzbUVuYWJsZWQpKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiQ2FuJ3QgZW5hYmxlIFdTTSB3aXRob3V0IFdNRVxuIikpOykKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltV3NtRW5hYmxlZCA9IDA7CisgICAgfQorCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUU9TX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IHFvcyBlbmFibGVkIGZhaWxlZFxuIikpOworICAgIHBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQgPSAodmFsKSA/IDEgOiAwOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSENGX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IGhjZiBlbmFibGVkIGZhaWxlZFxuIikpOworICAgIHBzZXNzaW9uRW50cnktPmxpbUhjZkVuYWJsZWQgPSAodmFsKSA/IDEgOiAwOworCisgICAgLy8gVXBkYXRlIHRoZSBBREQgQkEgRGVjbGluZWQgY29uZmlndXJhdGlvbiAKKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0FEREJBX1JFUV9ERUNMSU5FLCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoICJVbmFibGUgdG8gZ2V0IEFEREJBX1JFUV9ERUNMSU5FIGNmZ1xuIiApKTsKKyAgICBwTWFjLT5saW0uZ0FkZEJBX0RlY2xpbmVkID0gKHZhbCkgPyAgMHhmZiA6IDB4MDsKKworICAgIC8vIEFQOiBXU00gc2hvdWxkIGVuYWJsZSBIQ0YgYXMgd2VsbCwgZm9yIFNUQSBlbmFibGUgV1NNIG9ubHkgYWZ0ZXIKKyAgICAvLyBhc3NvY2lhdGlvbiByZXNwb25zZSBpcyByZWNlaXZlZAorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1Xc21FbmFibGVkICYmIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1IY2ZFbmFibGVkID0gMTsKKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHXzExRF9FTkFCTEVELCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCAxMWQgZW5hYmxlZCBmYWlsZWRcbiIpKTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW0xMWRFbmFibGVkID0gKHZhbCkgPyAxIDogMDsKKworICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQVNTT0NfU1RBX0xJTUlULCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCggImNmZyBnZXQgYXNzb2Mgc3RhIGxpbWl0IGZhaWxlZCIgKSk7CisgICAgfQorICAgIHBNYWMtPmxpbS5nTGltQXNzb2NTdGFMaW1pdCA9ICh0QU5JX1UxNil2YWw7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICBycm1VcGRhdGVDb25maWcoIHBNYWMsIHBzZXNzaW9uRW50cnkgKTsgCisjZW5kaWYKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJVcGRhdGVkIExpbSBzaGFkb3cgc3RhdGUgYmFzZWQgb24gQ0ZHXG4iKSk7KQorCisgICAgCit9CisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzRGVhdXRoRnJhbWUuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0RlYXV0aEZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0N2U5MAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0RlYXV0aEZyYW1lLmMKQEAgLTAsMCArMSw0NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltUHJvY2Vzc0RlYXV0aEZyYW1lLmNjIGNvbnRhaW5zIHRoZSBjb2RlCisgKiBmb3IgcHJvY2Vzc2luZyBEZWF1dGhlbnRpY2F0aW9uIEZyYW1lLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDMvMjQvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2luY2x1ZGUgInBhbFR5cGVzLmgiCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VjdXJpdHlVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisKKworCisvKioKKyAqIGxpbVByb2Nlc3NEZWF1dGhGcmFtZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbgorICogRGVhdXRoZW50aWNhdGlvbiBmcmFtZSByZWNlcHRpb24uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwUnhQYWNrZXRJbmZvIC0gQSBwb2ludGVyIHRvIEJ1ZmZlciBkZXNjcmlwdG9yICsgYXNzb2NpYXRlZCBQRFVzCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1Qcm9jZXNzRGVhdXRoRnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAqcEJvZHk7CisgICAgdEFOSV9VMTYgICAgICAgICAgYWlkLCByZWFzb25Db2RlOworICAgIHRwU2lyTWFjTWdtdEhkciAgIHBIZHI7CisgICAgdExpbU1sbUFzc29jQ25mICAgbWxtQXNzb2NDbmY7CisgICAgdExpbU1sbURlYXV0aEluZCAgbWxtRGVhdXRoSW5kOworICAgIHRwRHBoSGFzaE5vZGUgICAgIHBTdGFEczsKKworCisgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKworICAgIHBCb2R5ID0gV0RBX0dFVF9SWF9NUERVX0RBVEEocFJ4UGFja2V0SW5mbyk7CisKKworICAgIGlmICgoZUxJTV9TVEFfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKSAmJiAoZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFID09IHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSkKKyAgICB7CisgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICBGTCgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGluIERFQVVUSF9XVF9TVEFURShhbHJlYWR5IHByb2Nlc3NpbmcgcHJldmlvdXNseSByZWNlaXZlZCBERUFVVEggZnJhbWUpLi4gRHJvcHBpbmcgdGhpcy4uXG4gIikpOykKKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGxpbUlzR3JvdXBBZGRyKHBIZHItPnNhKSkKKyAgICB7CisgICAgICAgIC8vIFJlY2VpdmVkIERlYXV0aCBmcmFtZSBmcm9tIGEgQkMvTUMgYWRkcmVzcworICAgICAgICAvLyBMb2cgZXJyb3IgYW5kIGlnbm9yZSBpdAorICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGZyb20gYSBCQy9NQyBhZGRyZXNzXG4iKSk7KQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobGltSXNHcm91cEFkZHIocEhkci0+ZGEpICYmICFsaW1Jc0FkZHJCQyhwSGRyLT5kYSkpCisgICAgeworICAgICAgICAvLyBSZWNlaXZlZCBEZWF1dGggZnJhbWUgZm9yIGEgTUMgYWRkcmVzcworICAgICAgICAvLyBMb2cgZXJyb3IgYW5kIGlnbm9yZSBpdAorICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGZvciBhIE1DIGFkZHJlc3NcbiIpKTspCisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBHZXQgcmVhc29uQ29kZSBmcm9tIERlYXV0aGVudGljYXRpb24gZnJhbWUgYm9keQorICAgIHJlYXNvbkNvZGUgPSBzaXJSZWFkVTE2KHBCb2R5KTsKKworICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgRkwoInJlY2VpdmVkIERlYXV0aCBmcmFtZSAobWxtIHN0YXRlID0gJXMpIHdpdGggcmVhc29uIGNvZGUgJWQgZnJvbSAiKSwKKyAgICAgICAgbGltTWxtU3RhdGVTdHIocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSksIHJlYXNvbkNvZGUpOworICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HRSk7KQorICAgICAgCisgICAgaWYgKCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKXx8KHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkgKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyZWFzb25Db2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTjoKKyAgICAgICAgICAgIGNhc2UgZVNJUl9NQUNfREVBVVRIX0xFQVZJTkdfQlNTX1JFQVNPTjoKKyAgICAgICAgICAgICAgICAvLyBWYWxpZCByZWFzb25Db2RlIGluIHJlY2VpdmVkIERlYXV0aGVudGljYXRpb24gZnJhbWUKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIHJlYXNvbkNvZGUgaW4gcmVjZWl2ZWQgRGVhdXRoZW50aWNhdGlvbiBmcmFtZQorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvciBhbmQgaWdub3JlIHRoZSBmcmFtZQorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIHdpdGggaW52YWxpZCByZWFzb25Db2RlICVkIGZyb20gXG4iKSwKKyAgICAgICAgICAgICAgICAgICByZWFzb25Db2RlKTsKKyAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSB8fHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHJlYXNvbkNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OOgorICAgICAgICAgICAgY2FzZSBlU0lSX01BQ19QUkVWX0FVVEhfTk9UX1ZBTElEX1JFQVNPTjoKKyAgICAgICAgICAgIGNhc2UgZVNJUl9NQUNfREVBVVRIX0xFQVZJTkdfQlNTX1JFQVNPTjoKKyAgICAgICAgICAgIGNhc2UgZVNJUl9NQUNfQ0xBU1MyX0ZSQU1FX0ZST01fTk9OX0FVVEhfU1RBX1JFQVNPTjoKKyAgICAgICAgICAgIGNhc2UgZVNJUl9NQUNfQ0xBU1MzX0ZSQU1FX0ZST01fTk9OX0FTU09DX1NUQV9SRUFTT046CisgICAgICAgICAgICBjYXNlIGVTSVJfTUFDX1NUQV9OT1RfUFJFX0FVVEhFTlRJQ0FURURfUkVBU09OOgorICAgICAgICAgICAgICAgIC8vIFZhbGlkIHJlYXNvbkNvZGUgaW4gcmVjZWl2ZWQgRGVhdXRoIGZyYW1lCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZCByZWFzb25Db2RlIGluIHJlY2VpdmVkIERlYXV0aCBmcmFtZQorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvciBhbmQgaWdub3JlIHRoZSBmcmFtZQorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIHdpdGggaW52YWxpZCByZWFzb25Db2RlICVkIGZyb20gXG4iKSwKKyAgICAgICAgICAgICAgICAgICByZWFzb25Db2RlKTsKKyAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFJlY2VpdmVkIERlYXV0aCBmcmFtZSBpbiBlaXRoZXIgSUJTUworICAgICAgICAvLyBvciB1bi1rbm93biByb2xlLiBMb2cgZXJyb3IgYW5kIGlnbm9yZSBpdAorICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgRkwoInJlY2VpdmVkIERlYXV0aCBmcmFtZSB3aXRoIHJlYXNvbkNvZGUgJWQgaW4gcm9sZSAlZCBmcm9tIFxuIiksCisgICAgICAgICAgIHJlYXNvbkNvZGUsIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpOworICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HRSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qKiBJZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBSZUFzc29jLCBhIGZldyB0aGluZ3MgY291bGQgaGFwcGVuOgorICAgICAqICAtIFNUQSBpcyByZWFzc29jaWF0aW5nIHRvIGN1cnJlbnQgQVAsIGFuZCByZWNlaXZlcyBkZWF1dGggZnJvbToKKyAgICAgKiAgICAgICAgIGEpIGN1cnJlbnQgQVAgCisgICAgICogICAgICAgICBiKSBvdGhlciBBUAorICAgICAqICAtIFNUQSBpcyByZWFzc29jaWF0aW5nIHRvIGEgbmV3IEFQLCBhbmQgcmVjZWl2ZXMgZGVhdXRoIGZyb206CisgICAgICogICAgICAgICBjKSBjdXJyZW50IEFQCisgICAgICogICAgICAgICBkKSByZWFzc29jIEFQCisgICAgICogICAgICAgICBlKSBvdGhlciBBUAorICAgICAqCisgICAgICogIFRoZSBsb2dpYyBpczogCisgICAgICogIDEpIElmIHJjdiBkZWF1dGggZnJvbSBhbiBBUCBvdGhlciB0aGFuIHRoZSBvbmUgd2UncmUgdHJ5aW5nIHRvCisgICAgICogICAgIHJlYXNzb2NpYXRlIHdpdGgsIHRoZW4gZHJvcCB0aGUgZGVhdXRoIGZyYW1lIChjYXNlIGIsIGMsIGUpCisgICAgICogIDIpIElmIHJjdiBkZWF1dGggZnJvbSB0aGUgIm5ldyIgcmVhc3NvYyBBUCAoY2FzZSBkKSwgdGhlbiByZXN0b3JlCisgICAgICogICAgIGNvbnRleHQgd2l0aCBwcmV2aW91cyBBUCBhbmQgc2VuZCBTTUVfUkVBU1NPQ19SU1AgZmFpbHVyZS4KKyAgICAgKiAgMykgSWYgcmN2IGRlYXV0aCBmcm9tIHRoZSByZWFzc29jIEFQLCB3aGljaCBpcyBhbHNvIHRoZSBzYW1lCisgICAgICogICAgIEFQIHdlJ3JlIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggKGNhc2UgYSksIHRoZW4gcHJvY2VlZAorICAgICAqICAgICB3aXRoIG5vcm1hbCBkZWF1dGggcHJvY2Vzc2luZy4gCisgICAgICovCisgICAgaWYgKGxpbUlzUmVhc3NvY0luUHJvZ3Jlc3MocE1hYyxwc2Vzc2lvbkVudHJ5KSkgeworICAgICAgICBpZiAoIUlTX1JFQVNTT0NfQlNTSUQocE1hYyxwSGRyLT5zYSxwc2Vzc2lvbkVudHJ5KSkgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUmN2IERlYXV0aCBmcm9tIHVua25vd24vZGlmZmVyZW50IEFQIHdoaWxlIFJlQXNzb2MuIElnbm9yZSBcbiIpKTspCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiogUmVjZWl2ZWQgZGVhdXRoIGZyb20gdGhlIG5ldyBBUCB0byB3aGljaCB3ZSB0cmllZCB0byBSZUFzc29jaWF0ZS4KKyAgICAgICAgICogIERyb3AgUmVBc3NvYyBhbmQgUmVzdG9yZSB0aGUgUHJldmlvdXMgY29udGV4dCggY3VycmVudCBjb25uZWN0ZWQgQVApLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFJU19DVVJSRU5UX0JTU0lEKHBNYWMsIHBIZHItPnNhLHBzZXNzaW9uRW50cnkpKSB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR1csIEZMKCJyZWNlaXZlZCBEZUF1dGggZnJvbSB0aGUgTmV3IEFQIHRvIHdoaWNoIFJlQXNzb2MgaXMgc2VudCBcbiIpKTspCisgICAgICAgICAgICBsaW1SZXN0b3JlUHJlUmVhc3NvY1N0YXRlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TTUVfUkVBU1NPQ19SRUZVU0VELCByZWFzb25Db2RlLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgLyogSWYgcmVjZWl2ZWQgRGVBdXRoIGZyb20gQVAgb3RoZXIgdGhhbiB0aGUgb25lIHdlJ3JlIHRyeWluZyB0byBqb2luIHdpdGgKKyAgICAgKiBub3IgYXNzb2NpYXRlZCB3aXRoLCB0aGVuIGlnbm9yZSBkZWF1dGggYW5kIGRlbGV0ZSBQcmUtYXV0aCBlbnRyeS4KKyAgICAgKi8KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX0FQX1JPTEUgKXsKKyNlbmRpZgorICAgICAgICBpZiAoIUlTX0NVUlJFTlRfQlNTSUQocE1hYywgcEhkci0+c2EscHNlc3Npb25FbnRyeSkpIAorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJyZWNlaXZlZCBEZUF1dGggZnJvbSBhbiBBUCBvdGhlciB0aGFuIHdlJ3JlIHRyeWluZyB0byBqb2luLiBJZ25vcmUuIFxuIikpOykKKyAgICAgICAgICAgIGlmIChsaW1TZWFyY2hQcmVBdXRoTGlzdChwTWFjLCBwSGRyLT5zYSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUHJlYXV0aCBlbnRyeSBleGlzdC4gRGVsZXRpbmcuLi4gXG4iKSk7KQorICAgICAgICAgICAgICAgIGxpbURlbGV0ZVByZUF1dGhOb2RlKHBNYWMsIHBIZHItPnNhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB9CisjZW5kaWYKKworICAgICAgICAvLyBDaGVjayBmb3IgcHJlLWFzc29jIHN0YXRlcworICAgICAgICBzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgZUxJTV9TVEFfUk9MRToKKyAgICAgICAgICAgIGNhc2UgZUxJTV9CVF9BTVBfU1RBX1JPTEU6CisgICAgICAgICAgICAgICAgc3dpdGNoIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTJfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEFQIHNlbnQgRGVhdXRoIGZyYW1lIHdoaWxlIHdhaXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBBdXRoIGZyYW1lMi4gUmVwb3J0IEF1dGggZmFpbHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gU01FLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIERlYXV0aCBmcmFtZSB3aXRoIGZhaWx1cmUgY29kZSAlZCBmcm9tICIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uQ29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICAgICAgICAgICAgICAgICAgbGltUmVzdG9yZUZyb21BdXRoU3RhdGUocE1hYywgZVNJUl9TTUVfREVBVVRIX1dISUxFX0pPSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb25Db2RlLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlTElNX01MTV9BVVRIRU5USUNBVEVEX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8vIElzc3VlIERlYXV0aCBJbmRpY2F0aW9uIHRvIFNNRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJm1sbURlYXV0aEluZC5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1sbURlYXV0aEluZC5yZWFzb25Db2RlID0gcmVhc29uQ29kZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9JRExFX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9NTE1fREVBVVRIX0lORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmbWxtRGVhdXRoSW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogQVAgbWF5IGhhdmUgJ2FnZWQtb3V0JyBvdXIgUHJlLWF1dGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbnRleHQuIERlbGV0ZSBsb2NhbCBwcmUtYXV0aCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiBhbnkgYW5kIGlzc3VlIEFTU09DX0NORiB0byBTTUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW1TZWFyY2hQcmVBdXRoTGlzdChwTWFjLCBwSGRyLT5zYSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltRGVsZXRlUHJlQXV0aE5vZGUocE1hYywgcEhkci0+c2EpOworCisgICAgICAgICAgICAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfREVBVVRIX1dISUxFX0pPSU47CisgICAgICAgICAgICAgICAgICAgICAgICBtbG1Bc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IHJlYXNvbkNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBFIHNlc3Npb24gSWQqLworICAgICAgICAgICAgICAgICAgICAgICAgbWxtQXNzb2NDbmYuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltUHJldk1sbVN0YXRlOworICAgICAgICAgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWFjdGl2ZSBBc3NvY2lhdGlvbiByZXNwb25zZSB0aW1lb3V0CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX0FTU09DX0ZBSUxfVElNRVIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1Qb3N0U21lTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9NTE1fQVNTT0NfQ05GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmbWxtQXNzb2NDbmYpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlTElNX01MTV9JRExFX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgY291bGQgYmUgRGVhdXRoZW50aWNhdGlvbiBmcmFtZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhIEJTUyB3aXRoIHdoaWNoIHByZS1hdXRoZW50aWNhdGlvbiB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHBlcmZvcm1lZC4gRGVsZXRlIFByZS1hdXRoIGVudHJ5IGlmIGZvdW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGltU2VhcmNoUHJlQXV0aExpc3QocE1hYywgcEhkci0+c2EpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltRGVsZXRlUHJlQXV0aE5vZGUocE1hYywgcEhkci0+c2EpOworCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIGVMSU1fTUxNX1dUX1JFQVNTT0NfUlNQX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlTElNX01MTV9XVF9GVF9SRUFTU09DX1JTUF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBEZWF1dGggZnJhbWUgaW4gRlQgc3RhdGUgJVggd2l0aCByZWFzb25Db2RlPSVkIGZyb20gIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSwgcmVhc29uQ29kZSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBEZWF1dGggZnJhbWUgaW4gc3RhdGUgJVggd2l0aCByZWFzb25Db2RlPSVkIGZyb20gIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSwgcmVhc29uQ29kZSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgZUxJTV9TVEFfSU5fSUJTU19ST0xFOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgY2FzZSBlTElNX0FQX1JPTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgCisKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIGVMSU1fQVBfUk9MRSBvciBlTElNX0JUX0FNUF9BUF9ST0xFCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICAgICAgICAgICAgICAvLy8gQ2hlY2sgaWYgdGhlcmUgZXhpc3RzIHByZS1hdXRoIGNvbnRleHQgZm9yIHRoaXMgU1RBCisgICAgICAgICAgICAgICAgaWYgKGxpbVNlYXJjaFByZUF1dGhMaXN0KHBNYWMsIHBIZHItPnNhKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIFJlY2VpdmVkIERlYXV0aGVudGljYXRpb24gZnJvbSBhIFNUQSB0aGF0IGlzIG5laXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICogQXNzb2NpYXRlZCBub3IgUHJlLWF1dGhlbnRpY2F0ZWQuIExvZyBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICogYW5kIGlnbm9yZSBEZWF1dGhlbnRpY2F0aW9uIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGZyb20gcGVlciB0aGF0IGRvZXMgbm90IGhhdmUgY29udGV4dCwgYWRkciAiKSk7CisgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLy8gRGVsZXRlIFNUQSBmcm9tIHByZS1hdXRoIFNUQSBsaXN0CisgICAgICAgICAgICAgICAgICAgIGxpbURlbGV0ZVByZUF1dGhOb2RlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhKTsKKworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJm1sbURlYXV0aEluZC5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgICAgICAgICAgICAgIG1sbURlYXV0aEluZC5yZWFzb25Db2RlID0gcmVhc29uQ29kZTsKKyAgICAgICAgICAgICAgICAgICAgbWxtRGVhdXRoSW5kLmFpZCAgICAgICAgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9NTE1fREVBVVRIX0lORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopICZtbG1EZWF1dGhJbmQpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IC8vIGVuZCBzd2l0Y2ggKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSkKKworCisgICAgICAgIAorICAgIC8qKgorICAgICAqIEV4dHJhY3QgJ2Fzc29jaWF0ZWQnIGNvbnRleHQgZm9yIFNUQSwgaWYgYW55LgorICAgICAqIFRoaXMgaXMgbWFpbnRhaW5lZCBieSBEUEggYW5kIGNyZWF0ZWQgYnkgTElNLgorICAgICAqLworICAgIGlmKCAocFN0YURzID0gZHBoTG9va3VwSGFzaEVudHJ5KHBNYWMsIHBIZHItPnNhLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSkpID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworCisgICAgaWYgKChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEUpIHx8CisgICAgICAgIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfREVMX0JTU19SU1BfU1RBVEUpKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgZGVsZXRpbmcgY29udGV4dCBmb3IgdGhlIHBlZXIKKyAgICAgICAgICogYW5kIHJlY2VpdmVkIERlYXV0aGVudGljYXRpb24gZnJhbWUuIExvZyBhbmQgSWdub3JlLgorICAgICAgICAgKi8KKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgicmVjZWl2ZWQgRGVhdXRoIGZyYW1lIGZyb20gcGVlciB0aGF0IGlzIGluIHN0YXRlICVYLCBhZGRyICIpLAorICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0gCisgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uID0gKHRTaXJNYWNSZWFzb25Db2RlcylyZWFzb25Db2RlOworICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9IGVMSU1fUEVFUl9FTlRJVFlfREVBVVRIOworCisgICAgLy8vIElzc3VlIERlYXV0aCBJbmRpY2F0aW9uIHRvIFNNRS4KKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmbWxtRGVhdXRoSW5kLnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgcFN0YURzLT5zdGFBZGRyLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgbWxtRGVhdXRoSW5kLmFpZCAgICAgICAgICAgPSBwU3RhRHMtPmFzc29jSWQ7CisjZW5kaWYKKyAgICBtbG1EZWF1dGhJbmQucmVhc29uQ29kZSAgICA9ICh0QU5JX1U4KSBwU3RhRHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb247CisgICAgbWxtRGVhdXRoSW5kLmRlYXV0aFRyaWdnZXIgPSBlTElNX1BFRVJfRU5USVRZX0RFQVVUSDsKKworCisgICAgLyogSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBSZUFzc29jIGFuZCByZWNlaXZlZCBkZWF1dGggZnJvbSAKKyAgICAgKiB0aGUgUmVBc3NvYyBBUCwgdGhlbiBub3RpZnkgU01FIGJ5IHNlbmRpbmcgUkVBU1NPQ19SU1Agd2l0aCAKKyAgICAgKiBmYWlsdXJlIHJlc3VsdCBjb2RlLiBCeSBkZXNpZ24sIFNNRSB3aWxsIHRoZW4gaXNzdWUgIkRpc2Fzc29jIiAgCisgICAgICogYW5kIGNsZWFudXAgd2lsbCBoYXBwZW4gYXQgdGhhdCB0aW1lLiAKKyAgICAgKi8KKyAgICBpZiAobGltSXNSZWFzc29jSW5Qcm9ncmVzcyhwTWFjLHBzZXNzaW9uRW50cnkpKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBUCBtYXkgaGF2ZSAnYWdlZC1vdXQnIG91ciBQcmUtYXV0aAorICAgICAgICAgKiBjb250ZXh0LiBEZWxldGUgbG9jYWwgcHJlLWF1dGggY29udGV4dAorICAgICAgICAgKiBpZiBhbnkgYW5kIGlzc3VlIFJFQVNTT0NfQ05GIHRvIFNNRS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChsaW1TZWFyY2hQcmVBdXRoTGlzdChwTWFjLCBwSGRyLT5zYSkpCisgICAgICAgICAgICBsaW1EZWxldGVQcmVBdXRoTm9kZShwTWFjLCBwSGRyLT5zYSk7CisKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbUFzc29jUmVzcG9uc2VEYXRhKSB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmxpbUFzc29jUmVzcG9uc2VEYXRhKTsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbUFzc29jUmVzcG9uc2VEYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJSY3YgRGVhdXRoIGZyb20gUmVBc3NvYyBBUC4gSXNzdWUgUkVBU1NPQ19DTkYuIFxuIikpOykKKyAgICAgICAgbGltUmVzdG9yZVByZVJlYXNzb2NTdGF0ZShwTWFjLCBlU0lSX1NNRV9SRUFTU09DX1JFRlVTRUQsIHJlYXNvbkNvZGUscHNlc3Npb25FbnRyeSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLy8gRGVhdXRoZW50aWNhdGlvbiBmcm9tIHBlZXIgTUFDIGVudGl0eQorICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsIExJTV9NTE1fREVBVVRIX0lORCwgKHRBTklfVTMyICopICZtbG1EZWF1dGhJbmQpOworCisgICAgLy8gc2VuZCBlV05JX1NNRV9ERUFVVEhfSU5EIHRvIFNNRSAgCisgICAgbGltU2VuZFNtZURlYXV0aEluZChwTWFjLCBwU3RhRHMsIHBzZXNzaW9uRW50cnkpOworICAgIHJldHVybjsKKworfSAvKioqIGVuZCBsaW1Qcm9jZXNzRGVhdXRoRnJhbWUoKSAqKiovCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0Rpc2Fzc29jRnJhbWUuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0Rpc2Fzc29jRnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTEzOGE5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzRGlzYXNzb2NGcmFtZS5jCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbVByb2Nlc3NEaXNhc3NvY0ZyYW1lLmNjIGNvbnRhaW5zIHRoZSBjb2RlCisgKiBmb3IgcHJvY2Vzc2luZyBEaXNhc3NvY2F0aW9uIEZyYW1lLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDMvMjQvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2luY2x1ZGUgInBhbFR5cGVzLmgiCisjaW5jbHVkZSAid25pQXBpLmgiCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbERhdGFTdHJ1Y3QuaCIKKyNlbmRpZgorI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisjZWxzZQorI2luY2x1ZGUgInduaUNmZ1N0YS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VjdXJpdHlVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiCisKKworLyoqCisgKiBsaW1Qcm9jZXNzRGlzYXNzb2NGcmFtZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbgorICogRGlzYXNzb2NpYXRpb24gZnJhbWUgcmVjZXB0aW9uLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIERQSCBkcm9wcyBwYWNrZXRzIGZvciBTVEEgd2l0aCAndmFsaWQnIGJpdCBpbiBwU3RhRHMgc2V0IHRvICcwJy4KKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcFJ4UGFja2V0SW5mbyAtIEEgcG9pbnRlciB0byBSeCBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1Qcm9jZXNzRGlzYXNzb2NGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICpwQm9keTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhaWQsIHJlYXNvbkNvZGU7CisgICAgdHBTaXJNYWNNZ210SGRyICAgIHBIZHI7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgIHBTdGFEczsKKyAgICB0TGltTWxtRGlzYXNzb2NJbmQgbWxtRGlzYXNzb2NJbmQ7CisKKworICAgIHBIZHIgPSBXREFfR0VUX1JYX01BQ19IRUFERVIocFJ4UGFja2V0SW5mbyk7CisgICAgcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKworCisgICAgaWYgKGxpbUlzR3JvdXBBZGRyKHBIZHItPnNhKSkKKyAgICB7CisgICAgICAgIC8vIFJlY2VpdmVkIERpc2Fzc29jIGZyYW1lIGZyb20gYSBCQy9NQyBhZGRyZXNzCisgICAgICAgIC8vIExvZyBlcnJvciBhbmQgaWdub3JlIGl0CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSBmcm9tIGEgQkMvTUMgYWRkcmVzc1xuIikpOykKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGxpbUlzR3JvdXBBZGRyKHBIZHItPmRhKSAmJiAhbGltSXNBZGRyQkMocEhkci0+ZGEpKQorICAgIHsKKyAgICAgICAgLy8gUmVjZWl2ZWQgRGlzYXNzb2MgZnJhbWUgZm9yIGEgTUMgYWRkcmVzcworICAgICAgICAvLyBMb2cgZXJyb3IgYW5kIGlnbm9yZSBpdAorICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgRGlzYXNzb2MgZnJhbWUgZm9yIGEgTUMgYWRkcmVzc1xuIikpOykKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2V0IHJlYXNvbkNvZGUgZnJvbSBEaXNhc3NvY2lhdGlvbiBmcmFtZSBib2R5CisgICAgcmVhc29uQ29kZSA9IHNpclJlYWRVMTYocEJvZHkpOworCisgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICBGTCgiUmVjZWl2ZWQgRGlzYXNzb2MgZnJhbWUgKG1sbSBzdGF0ZSAlZCBzbWUgc3RhdGUgJWQpLCB3aXRoIHJlYXNvbiBjb2RlICVkIGZyb20gXG4iKSwgCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlLCBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSwgcmVhc29uQ29kZSk7KQorICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HRSk7CisKKyAgICAvKioKKyAgICogRXh0cmFjdCAnYXNzb2NpYXRlZCcgY29udGV4dCBmb3IgU1RBLCBpZiBhbnkuCisgICAqIFRoaXMgaXMgbWFpbnRhaW5lZCBieSBEUEggYW5kIGNyZWF0ZWQgYnkgTElNLgorICAgKi8KKyAgICAgcFN0YURzID0gZHBoTG9va3VwSGFzaEVudHJ5KHBNYWMsIHBIZHItPnNhLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisKKyAgICBpZiAocFN0YURzID09IE5VTEwpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogRGlzYXNzb2NpYXRpbmcgU1RBIGlzIG5vdCBhc3NvY2lhdGVkLgorICAgICAgICAgKiBMb2cgZXJyb3IuCisgICAgICAgICAqLworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgIEZMKCJyZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSBmcm9tIFNUQSB0aGF0IGRvZXMgbm90IGhhdmUgY29udGV4dCByZWFzb25Db2RlPSVkLCBhZGRyICIpLAorICAgICAgICAgICByZWFzb25Db2RlKTsKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cxKTspCisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qKiBJZiB3ZSBhcmUgaW4gdGhlIFdhaXQgZm9yIFJlQXNzb2MgUnNwIHN0YXRlICovCisgICAgaWYgKGxpbUlzUmVhc3NvY0luUHJvZ3Jlc3MocE1hYyxwc2Vzc2lvbkVudHJ5KSkgeworICAgICAgICAvKiogSWYgd2UgaGFkIHJlY2VpdmVkIHRoZSBEaXNBc3NvYyBmcm9tLAorICAgICAgICAqICAgICBhLiB0aGUgQ3VycmVudCBBUCBkdXJpbmcgUmVBc3NvY2lhdGUgdG8gZGlmZmVyZW50IEFQIGluIHNhbWUgRVNTCisgICAgICAgICogICAgIGIuIFVua25vd24gQVAKKyAgICAgICAgKiAgIGRyb3AvaWdub3JlIHRoZSBEaXNBc3NvYyByZWNlaXZlZAorICAgICAgICAqLworICAgICAgICBpZiAoIUlTX1JFQVNTT0NfQlNTSUQocE1hYyxwSGRyLT5zYSxwc2Vzc2lvbkVudHJ5KSkgeworICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiSWdub3JlIHRoZSBEaXNBc3NvYyByZWNlaXZlZCwgd2hpbGUgUHJvY2Vzc2luZyBSZUFzc29jIHdpdGggZGlmZmVyZW50L3Vua25vd24gQVBcbiIpKTspCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLyoqIElmIHRoZSBEaXNhc3NvYyBpcyByZWNlaXZlZCBmcm9tIHRoZSBuZXcgQVAgdG8gd2hpY2ggd2UgdHJpZWQgdG8gUmVBc3NvY2lhdGUKKyAgICAgICAgICogIERyb3AgUmVBc3NvYyBhbmQgUmVzdG9yZSB0aGUgUHJldmlvdXMgY29udGV4dCggY3VycmVudCBjb25uZWN0ZWQgQVApLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFJU19DVVJSRU5UX0JTU0lEKHBNYWMsIHBIZHItPnNhLHBzZXNzaW9uRW50cnkpKSB7CisgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJyZWNlaXZlZCBEaXNhc3NvYyBmcm9tIHRoZSBOZXcgQVAgdG8gd2hpY2ggUmVBc3NvYyBpcyBzZW50IFxuIikpOykKKyAgICAgICAgICAgIGxpbVJlc3RvcmVQcmVSZWFzc29jU3RhdGUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NNRV9SRUFTU09DX1JFRlVTRUQsIHJlYXNvbkNvZGUscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgfHwKKyAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpICkKKyAgICB7CisgICAgICAgIHN3aXRjaCAocmVhc29uQ29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT046CisgICAgICAgICAgICBjYXNlIGVTSVJfTUFDX0RJU0FTU09DX0RVRV9UT19JTkFDVElWSVRZX1JFQVNPTjoKKyAgICAgICAgICAgIGNhc2UgZVNJUl9NQUNfRElTQVNTT0NfTEVBVklOR19CU1NfUkVBU09OOgorICAgICAgICAgICAgY2FzZSBlU0lSX01BQ19NSUNfRkFJTFVSRV9SRUFTT046CisgICAgICAgICAgICBjYXNlIGVTSVJfTUFDXzRXQVlfSEFORFNIQUtFX1RJTUVPVVRfUkVBU09OOgorICAgICAgICAgICAgY2FzZSBlU0lSX01BQ19HUl9LRVlfVVBEQVRFX1RJTUVPVVRfUkVBU09OOgorICAgICAgICAgICAgY2FzZSBlU0lSX01BQ19SU05fSUVfTUlTTUFUQ0hfUkVBU09OOgorICAgICAgICAgICAgY2FzZSBlU0lSX01BQ18xWF9BVVRIX0ZBSUxVUkVfUkVBU09OOgorICAgICAgICAgICAgICAgIC8vIFZhbGlkIHJlYXNvbkNvZGUgaW4gcmVjZWl2ZWQgRGlzYXNzb2NpYXRpb24gZnJhbWUKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIHJlYXNvbkNvZGUgaW4gcmVjZWl2ZWQgRGlzYXNzb2NpYXRpb24gZnJhbWUKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSB3aXRoIGludmFsaWQgcmVhc29uQ29kZSAlZCBmcm9tIFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbkNvZGUpOworICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMSk7KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCAgKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpIHx8CisgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpKSAmJiAgCisgICAgICAgICAgICAgICAoKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX1dUX0pPSU5fU1RBVEUpICYmIAorICAgICAgICAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9XVF9BVVRIX1NUQVRFKSAgJiYKKyAgICAgICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfQVNTT0NfU1RBVEUpICAmJgorICAgICAgICAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFKSApKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyZWFzb25Db2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTjoKKyAgICAgICAgICAgIGNhc2UgZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFlfUkVBU09OOgorICAgICAgICAgICAgY2FzZSBlU0lSX01BQ19ESVNBU1NPQ19EVUVfVE9fRElTQUJJTElUWV9SRUFTT046CisgICAgICAgICAgICBjYXNlIGVTSVJfTUFDX0NMQVNTMl9GUkFNRV9GUk9NX05PTl9BVVRIX1NUQV9SRUFTT046CisgICAgICAgICAgICBjYXNlIGVTSVJfTUFDX0NMQVNTM19GUkFNRV9GUk9NX05PTl9BU1NPQ19TVEFfUkVBU09OOgorICAgICAgICAgICAgY2FzZSBlU0lSX01BQ19NSUNfRkFJTFVSRV9SRUFTT046CisgICAgICAgICAgICBjYXNlIGVTSVJfTUFDXzRXQVlfSEFORFNIQUtFX1RJTUVPVVRfUkVBU09OOgorICAgICAgICAgICAgY2FzZSBlU0lSX01BQ19HUl9LRVlfVVBEQVRFX1RJTUVPVVRfUkVBU09OOgorICAgICAgICAgICAgY2FzZSBlU0lSX01BQ19SU05fSUVfTUlTTUFUQ0hfUkVBU09OOgorICAgICAgICAgICAgY2FzZSBlU0lSX01BQ18xWF9BVVRIX0ZBSUxVUkVfUkVBU09OOgorICAgICAgICAgICAgICAgIC8vIFZhbGlkIHJlYXNvbkNvZGUgaW4gcmVjZWl2ZWQgRGlzYXNzb2NpYXRpb24gZnJhbWUKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBlU0lSX01BQ19ESVNBU1NPQ19MRUFWSU5HX0JTU19SRUFTT046CisgICAgICAgICAgICAgICAgLy8gVmFsaWQgcmVhc29uQ29kZSBpbiByZWNlaXZlZCBEaXNhc3NvY2lhdGlvbiBmcmFtZQorICAgICAgICAgICAgICAgIC8vIGFzIGxvbmcgYXMgd2UncmUgbm90IGFib3V0IHRvIGNoYW5uZWwgc3dpdGNoCisgICAgICAgICAgICAgICAgaWYocE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN0YXRlICE9IGVMSU1fQ0hBTk5FTF9TV0lUQ0hfSURMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgICAgICAgICAgRkwoIklnbm9yaW5nIGRpc2Fzc29jIGZyYW1lIGR1ZSB0byB1cGNvbWluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbCBzd2l0Y2gsIGZyb21cbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uQ29kZSk7CisgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZCByZWFzb25Db2RlIGluIHJlY2VpdmVkIERpc2Fzc29jaWF0aW9uIGZyYW1lCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yIGFuZCBpZ25vcmUgdGhlIGZyYW1lCisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgRGlzYXNzb2MgZnJhbWUgd2l0aCBpbnZhbGlkIHJlYXNvbkNvZGUgJWQgZnJvbSBcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICByZWFzb25Db2RlKTsKKyAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gUmVjZWl2ZWQgRGlzYXNzb2NpYXRpb24gZnJhbWUgaW4gZWl0aGVyIElCU1MKKyAgICAgICAgLy8gb3IgdW4ta25vd24gcm9sZS4gTG9nIGVycm9yIGFuZCBpZ25vcmUgaXQKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgRGlzYXNzb2MgZnJhbWUgd2l0aCBpbnZhbGlkIHJlYXNvbkNvZGUgJWQgaW4gcm9sZSAlZCBpbiBzbWUgc3RhdGUgJWQgZnJvbSBcbiIpLAorICAgICAgICAgICAgICAgcmVhc29uQ29kZSwgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSwgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPR0UpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEaXNhc3NvY2lhdGlvbiBmcm9tIHBlZXIgTUFDIGVudGl0eQorCisgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsCisgICAgICAgICAgIEZMKCJSZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSBmcm9tIHN0YSB3aXRoIGFzc29jSWQ9JWQsIHdpdGggcmVhc29uQ29kZT0lZFxuIiksCisgICAgICAgICAgIHBTdGFEcy0+YXNzb2NJZCwgcmVhc29uQ29kZSk7KQorCisgICAgaWYgKChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEUpIHx8CisgICAgICAgIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfREVMX0JTU19SU1BfU1RBVEUpKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgZGVsZXRpbmcgY29udGV4dCBmb3IgdGhlIHBlZXIKKyAgICAgICAgICogYW5kIHJlY2VpdmVkIERpc2Fzc29jaWF0aW9uIGZyYW1lLiBMb2cgYW5kIElnbm9yZS4KKyAgICAgICAgICovCisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBEaXNhc3NvYyBmcmFtZSBpbiBzdGF0ZSAlZCBmcm9tIiksCisgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKworICAgICAgICByZXR1cm47CisgICAgfSAKKworICAgIGlmIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0aW5nIFNUQSBpcyBpbiBzb21lICd0cmFuc2llbnQnIHN0YXRlPworICAgICAgICAgKiBMb2cgZXJyb3IuCisgICAgICAgICAqLworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgRGlzYXNzb2MgZnJhbWUgZnJvbSBwZWVyIHRoYXQgaXMgaW4gc3RhdGUgJVgsIGFkZHIgIiksCisgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzEpOykKKyAgICB9IC8vIGlmIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkKKworICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9IGVMSU1fUEVFUl9FTlRJVFlfRElTQVNTT0M7CisgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uID0gKHRTaXJNYWNSZWFzb25Db2RlcykgcmVhc29uQ29kZTsKKworICAgIC8vIElzc3VlIERpc2Fzc29jIEluZGljYXRpb24gdG8gU01FLgorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZtbG1EaXNhc3NvY0luZC5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBTdGFEcy0+c3RhQWRkciwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIG1sbURpc2Fzc29jSW5kLnJlYXNvbkNvZGUgPQorICAgICAgICAodEFOSV9VOCkgcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uOworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgIG1sbURpc2Fzc29jSW5kLmFpZCAgICAgICAgPSBwU3RhRHMtPmFzc29jSWQ7CisjZW5kaWYKKyAgICBtbG1EaXNhc3NvY0luZC5kaXNhc3NvY1RyaWdnZXIgPSBlTElNX1BFRVJfRU5USVRZX0RJU0FTU09DOworCisgICAgLyogVXBkYXRlIFBFIHNlc3Npb24gSWQgICovCisgICAgbWxtRGlzYXNzb2NJbmQuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKyAgICBpZiAobGltSXNSZWFzc29jSW5Qcm9ncmVzcyhwTWFjLHBzZXNzaW9uRW50cnkpKSB7CisKKyAgICAvKiBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIFJlQXNzb2MgYW5kIHJlY2VpdmVkIGRpc2Fzc29jIGZyb20gCisgICAgICogdGhlIFJlQXNzb2MgQVAsIHRoZW4gbm90aWZ5IFNNRSBieSBzZW5kaW5nIFJFQVNTT0NfUlNQIHdpdGggCisgICAgICogZmFpbHVyZSByZXN1bHQgY29kZS4gQnkgZGVzaWduLCBTTUUgd2lsbCB0aGVuIGlzc3VlICJEaXNhc3NvYyIgIAorICAgICAqIGFuZCBjbGVhbnVwIHdpbGwgaGFwcGVuIGF0IHRoYXQgdGltZS4gCisgICAgICovCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoInJlY2VpdmVkIERpc2Fzc29jIGZyb20gQVAgd2hpbGUgd2FpdGluZyBmb3IgUmVhc3NvYyBSc3BcbiIpKTspCisgICAgIAorICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltQXNzb2NSZXNwb25zZURhdGEpIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+bGltQXNzb2NSZXNwb25zZURhdGEpOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltQXNzb2NSZXNwb25zZURhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIGxpbVJlc3RvcmVQcmVSZWFzc29jU3RhdGUocE1hYyxlU0lSX1NNRV9SRUFTU09DX1JFRlVTRUQsIHJlYXNvbkNvZGUscHNlc3Npb25FbnRyeSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX0RJU0FTU09DX0lORCwKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJm1sbURpc2Fzc29jSW5kKTsKKworCisgICAgLy8gc2VuZCBlV05JX1NNRV9ESVNBU1NPQ19JTkQgdG8gU01FICAKKyAgICBsaW1TZW5kU21lRGlzYXNzb2NJbmQocE1hYywgcFN0YURzLHBzZXNzaW9uRW50cnkpOworCisgICAgcmV0dXJuOworfSAvKioqIGVuZCBsaW1Qcm9jZXNzRGlzYXNzb2NGcmFtZSgpICoqKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzTG1tTWVzc2FnZXMuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0xtbU1lc3NhZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjOTVjZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc0xtbU1lc3NhZ2VzLmMKQEAgLTAsMCArMSw3OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltUHJvY2Vzc0xtbU1lc3NhZ2VzLmNjIGNvbnRhaW5zIHRoZSBjb2RlCisgKiBmb3IgcHJvY2Vzc2luZyBTTUUvTE1NIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gQU5JIGZlYXR1cmUgc2V0LgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMTAvMjAvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAid25pQXBpLmgiCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNlbHNlCisjaW5jbHVkZSAid25pQ2ZnU3RhLmgiCisjZW5kaWYKKyNpbmNsdWRlICJjZmdBcGkuaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKyNpbmNsdWRlICJzY2hBcGkuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VyRGVzVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Qcm9wRXh0c1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2Vzc2lvbi5oIgorCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisvKioKKyAqIGxpbUlzU21lTWVhc3VyZW1lbnRSZXFWYWxpZCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NMbW1NZXNzYWdlcygpIHVwb24KKyAqIHJlY2VpdmluZyBTTUVfTUVBU1VSRU1FTlRfUkVRLgorICoKKyAqTE9HSUM6CisgKiBNZXNzYWdlIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNZWFzUmVxICBQb2ludGVyIHRvIFJlY2VpdmVkIE1FQVNVUkVNRU5UX1JFUSBtZXNzYWdlCisgKiBAcmV0dXJuIHRydWUgICAgICBXaGVuIHJlY2VpdmVkIFNNRV9NRUFTVVJFTUVOVF9SRVEgaXMgZm9ybWF0dGVkCisgKiAgICAgICAgICAgICAgICAgICBjb3JyZWN0bHkKKyAqICAgICAgICAgZmFsc2UgICAgIG90aGVyd2lzZQorICovCisKK2lubGluZSBzdGF0aWMgdEFOSV9CT09MRUFOCitsaW1Jc1NtZU1lYXN1cmVtZW50UmVxVmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVNZWFzdXJlbWVudFJlcSBwTWVhc1JlcSkKK3sKKyNpZmRlZiBBTklfQVBfU0RLCisgICAgaWYgKCFwTWVhc1JlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgfHwKKyAgICAgICAgKChwTWVhc1JlcS0+bWVhc0NvbnRyb2wucGVyaW9kaWNNZWFzRW5hYmxlZCkgJiYKKyAgICAgICAgICghcE1lYXNSZXEtPm1lYXNJbmRQZXJpb2QpKSB8fAorICAgICAgICAocE1lYXNSZXEtPm1lYXNJbmRQZXJpb2QgJiYKKyAgICAgICAgICgocE1lYXNSZXEtPm1lYXNJbmRQZXJpb2QgPCAxKSkpIHx8CisgICAgICAgICFwTWVhc1JlcS0+bWVhc0R1cmF0aW9uLnNob3J0VGVybVBlcmlvZCB8fAorICAgICAgICAoKHBNZWFzUmVxLT5tZWFzRHVyYXRpb24uc2hvcnRUZXJtUGVyaW9kIDwgMSkpIHx8CisgICAgICAgICFwTWVhc1JlcS0+bWVhc0R1cmF0aW9uLmF2ZXJhZ2luZ1BlcmlvZCB8fAorICAgICAgICAocE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5hdmVyYWdpbmdQZXJpb2QgPAorICAgICAgICAgcE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydFRlcm1QZXJpb2QpIHx8CisgICAgICAgICFwTWVhc1JlcS0+bWVhc0R1cmF0aW9uLnNob3J0Q2hhbm5lbFNjYW5EdXJhdGlvbiB8fAorICAgICAgICAoKHBNZWFzUmVxLT5tZWFzRHVyYXRpb24uc2hvcnRDaGFubmVsU2NhbkR1cmF0aW9uIDwKKyAgICAgICAgICAxKSkgfHwKKyAgICAgICAgIXBNZWFzUmVxLT5tZWFzRHVyYXRpb24ubG9uZ0NoYW5uZWxTY2FuRHVyYXRpb24gfHwKKyAgICAgICAgKHBNZWFzUmVxLT5tZWFzRHVyYXRpb24ubG9uZ0NoYW5uZWxTY2FuRHVyYXRpb24gPAorICAgICAgICAgcE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb24pIHx8CisgICAgICAgICgocE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5sb25nQ2hhbm5lbFNjYW5EdXJhdGlvbiA8CisgICAgICAgICAgMSkpKQorI2Vsc2UKKyAgICBpZiAoIXBNZWFzUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyB8fAorICAgICAgICAoKHBNZWFzUmVxLT5tZWFzQ29udHJvbC5wZXJpb2RpY01lYXNFbmFibGVkKSAmJgorICAgICAgICAgKCFwTWVhc1JlcS0+bWVhc0luZFBlcmlvZCkpIHx8CisgICAgICAgIChwTWVhc1JlcS0+bWVhc0luZFBlcmlvZCAmJgorICAgICAgICAgKChwTWVhc1JlcS0+bWVhc0luZFBlcmlvZCA8IFNZU19USUNLX0RVUl9NUykpKSB8fAorICAgICAgICAhcE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydFRlcm1QZXJpb2QgfHwKKyAgICAgICAgKChwTWVhc1JlcS0+bWVhc0R1cmF0aW9uLnNob3J0VGVybVBlcmlvZCA8IFNZU19USUNLX0RVUl9NUykpIHx8CisgICAgICAgICFwTWVhc1JlcS0+bWVhc0R1cmF0aW9uLmF2ZXJhZ2luZ1BlcmlvZCB8fAorICAgICAgICAocE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5hdmVyYWdpbmdQZXJpb2QgPAorICAgICAgICAgcE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydFRlcm1QZXJpb2QpIHx8CisgICAgICAgICFwTWVhc1JlcS0+bWVhc0R1cmF0aW9uLnNob3J0Q2hhbm5lbFNjYW5EdXJhdGlvbiB8fAorICAgICAgICAoKHBNZWFzUmVxLT5tZWFzRHVyYXRpb24uc2hvcnRDaGFubmVsU2NhbkR1cmF0aW9uIDwKKyAgICAgICAgICBTWVNfVElDS19EVVJfTVMpKSB8fAorICAgICAgICAhcE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5sb25nQ2hhbm5lbFNjYW5EdXJhdGlvbiB8fAorICAgICAgICAocE1lYXNSZXEtPm1lYXNEdXJhdGlvbi5sb25nQ2hhbm5lbFNjYW5EdXJhdGlvbiA8CisgICAgICAgICBwTWVhc1JlcS0+bWVhc0R1cmF0aW9uLnNob3J0Q2hhbm5lbFNjYW5EdXJhdGlvbikgfHwKKyAgICAgICAgKChwTWVhc1JlcS0+bWVhc0R1cmF0aW9uLmxvbmdDaGFubmVsU2NhbkR1cmF0aW9uIDwKKyAgICAgICAgICBTWVNfVElDS19EVVJfTVMpKSkKKworCisjZW5kaWYKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgRkwoIlJlY2VpdmVkIE1FQVNVUkVNRU5UX1JFUSB3aXRoIGludmFsaWQgZGF0YVxuIikpOworCisgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFOworCit9IC8qKiogZW5kIGxpbUlzU21lTWVhc3VyZW1lbnRSZXFWYWxpZCgpICoqKi8KKworCisvKioKKyAqIGxpbUluaXRNZWFzUmVzb3VyY2VzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc0xtbU1lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9NRUFTVVJFTUVOVF9SRVEuIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMKKyAqIHJlc291cmNlcyByZXF1aXJlZCBmb3IgbWFraW5nIG1lYXN1cmVtZW50cyBsaWtlIGNyZWF0aW5nCisgKiB0aW1lcnMgcmVsYXRlZCB0byBNZWFzdXJlbWVudCBSZXF1ZXN0IGV0Yy4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIE5vbmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK2lubGluZSBzdGF0aWMgdFNpclJldFN0YXR1cworbGltSW5pdE1lYXNSZXNvdXJjZXModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1UzMiAgICB2YWw7CisgICAgdEFOSV9VMzIgICAgYmVhY29uSW50ZXJ2YWw7CisKKyAgICAKKyAgICAvLyBDcmVhdGUgTWVhcyByZWxhdGVkIHRpbWVycyBvbmx5IHdoZW4KKyAgICAvLyBwZXJpb2RpYyBtZWFzdXJlbWVudHMgYXJlIGVuYWJsZWQKKyAgICBpZiAocE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0NvbnRyb2wucGVyaW9kaWNNZWFzRW5hYmxlZCkKKyAgICB7CisgICAgICAgIHZhbCA9IFNZU19NU19UT19USUNLUyhwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5tZWFzSW5kUGVyaW9kKTsKKyAgICAgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICZwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubWVhc3VyZW1lbnRJbmRUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZWFzIEluZCBUSU1FT1VUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVRpbWVySGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9MSU1fTUVBU1VSRU1FTlRfSU5EX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBjcmVhdGUgTWVhc0luZCB0aW1lci4KKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjYWxsIHRvIGNyZWF0ZSBNZWFzSW5kIHRpbWVyIGZhaWxlZFxuIikpOworCisgICAgICAgICAgICByZXR1cm4gZVNJUl9TWVNfVFhfVElNRVJfQ1JFQVRFX0ZBSUxFRDsKKyAgICAgICAgfQorICAgICAgICBwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMuaXNNZWFzSW5kVGltZXJBY3RpdmUgPSAwOworICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIk1lYXN1cmVtZW50SW5kaWNhdGlvbiB0aW1lciBpbml0aWFsaXplZCwgcGVyaW9kID0gJWRcbiIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5tZWFzSW5kUGVyaW9kKTspCisKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX1JUQUlfTElOVVgpCisgICAgdHhfdGltZXJfc2V0X2V4cGlyeV9saXN0KAorICAgICAgICAgICAgICZwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubWVhc3VyZW1lbnRJbmRUaW1lciwKKyAgICAgICAgICAgICBMSU1fVElNRVJfRVhQSVJZX0xJU1QpOworI2VuZGlmCisgICAgfQorCisgICAgdEFOSV9VMzIgbGVhcm5JbnRlcnZhbCA9CisgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5tZWFzRHVyYXRpb24uc2hvcnRUZXJtUGVyaW9kIC8KKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzOworICAgIGlmICh0eF90aW1lcl9jcmVhdGUoJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkludGVydmFsVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTGVhcm4gaW50ZXJ2YWwgVElNRU9VVCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1UaW1lckhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTElNX0xFQVJOX0lOVEVSVkFMX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICBTWVNfTVNfVE9fVElDS1MobGVhcm5JbnRlcnZhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGNyZWF0ZSBsZWFybkludGVydmFsIHRpbWVyLgorICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjYWxsIHRvIGNyZWF0ZSBsZWFybkludGVydmFsIHRpbWVyIGZhaWxlZFxuIikpOworCisgICAgICAgIHJldHVybiBlU0lSX1NZU19UWF9USU1FUl9DUkVBVEVfRkFJTEVEOworICAgIH0KKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfUlRBSV9MSU5VWCkKKyAgICB0eF90aW1lcl9zZXRfZXhwaXJ5X2xpc3QoCisgICAgICAgICAgICAgJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkludGVydmFsVGltZXIsCisgICAgICAgICAgICAgTElNX1RJTUVSX0VYUElSWV9MSVNUKTsKKyNlbmRpZgorCisgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb24pOworICAgIGlmICh0eF90aW1lcl9jcmVhdGUoCisgICAgICAgICAgJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkR1cmF0aW9uVGltZXIsCisgICAgICAgICAgIkxlYXJuIGR1cmF0aW9uIFRJTUVPVVQiLAorICAgICAgICAgIGxpbVRpbWVySGFuZGxlciwKKyAgICAgICAgICBTSVJfTElNX0xFQVJOX0RVUkFUSU9OX1RJTUVPVVQsCisgICAgICAgICAgdmFsLAorICAgICAgICAgIDAsCisgICAgICAgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGNyZWF0ZSBMZWFybkR1cmF0aW9uIHRpbWVyLgorICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY2FsbCB0byBjcmVhdGUgTGVhcm5EdXJhdGlvbiB0aW1lciBmYWlsZWRcbiIpKTsKKworICAgICAgICByZXR1cm4gZVNJUl9TWVNfVFhfVElNRVJfQ1JFQVRFX0ZBSUxFRDsKKyAgICB9CisKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX1JUQUlfTElOVVgpCisgICAgdHhfdGltZXJfc2V0X2V4cGlyeV9saXN0KAorICAgICAgICAgICAgICZwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubGVhcm5EdXJhdGlvblRpbWVyLAorICAgICAgICAgICAgIExJTV9USU1FUl9FWFBJUllfTElTVCk7CisjZW5kaWYKKworICAgICNpZiAwCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMLCAmYmVhY29uSW50ZXJ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ2FuJ3QgcmVhZCBiZWFjb24gaW50ZXJ2YWxcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgI2VuZGlmIC8vIFRPIFNVUFBPUlQgQlQtQU1QCisKKyAgICAgLyogQ29weSB0aGUgYmVhY29uIGludGVydmFsIGZyb20gdGhlIHNlc3NpbyBJZCAqLworICAgICBiZWFjb25JbnRlcnZhbCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbDsKKyAgIAorICAgIGlmICgobGVhcm5JbnRlcnZhbCA+ICggMiAqIGJlYWNvbkludGVydmFsKSkgJiYKKyAgICAgICAgICAgIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKSkKKyAgICB7IAorICAgICAgICAvL2xlYXJpbnRlcnZhbCBzaG91bGQgYmUgID4gMiAqIGJlYWNvbmludGVydmFsCisgICAgICAgIHZhbCA9IFNZU19NU19UT19USUNLUyhsZWFybkludGVydmFsIC0gKDIgKiBiZWFjb25JbnRlcnZhbCkpOworICAgIC8vIENyZWF0ZSBRdWlldCBCU1MgVGltZXIKKyAgICBpZiggVFhfU1VDQ0VTUyAhPQorICAgICAgICB0eF90aW1lcl9jcmVhdGUoICZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyLAorICAgICAgICAgICJRVUlFVCBCU1MgVElNRVIiLAorICAgICAgICAgIGxpbVF1aWV0QnNzVGltZXJIYW5kbGVyLAorICAgICAgICAgIFNJUl9MSU1fUVVJRVRfQlNTX1RJTUVPVVQsCisgICAgICAgICAgICB2YWwsIC8vIGluaXRpYWxfdGlja3MKKyAgICAgICAgICAwLCAvLyByZXNjaGVkdWxlX3RpY2tzCisgICAgICAgICAgVFhfTk9fQUNUSVZBVEUgKSkKKyAgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsCisgICAgICAgICAgRkwoICJGYWlsZWQgdG8gY3JlYXRlIGdMaW1RdWlldEJzc1RpbWVyIVxuIiApKTsKKyAgICAgIHJldHVybiBlU0lSX1NZU19UWF9USU1FUl9DUkVBVEVfRkFJTEVEOworICAgIH0KKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfUlRBSV9MSU5VWCkKKyAgICB0eF90aW1lcl9zZXRfZXhwaXJ5X2xpc3QoCisgICAgICAgICZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyLAorICAgICAgICBMSU1fVElNRVJfRVhQSVJZX0xJU1QgKTsKKyNlbmRpZgorICAgICAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LmZRdWlldEVuYWJsZWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB9CisKKyAgICBwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMuc2hvcnREdXJhdGlvbkNvdW50ID0gMDsKKyAgICBwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubmV4dExlYXJuQ2hhbm5lbElkID0gMDsKKworICAgIHBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5yc3NpQWxwaGEgPQorICAgICAgICAgICAoMTAwICogcE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0R1cmF0aW9uLnNob3J0VGVybVBlcmlvZCkgLworICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0R1cmF0aW9uLmF2ZXJhZ2luZ1BlcmlvZDsKKworICAgIGlmICghcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLnJzc2lBbHBoYSkKKyAgICAgICAgcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLnJzc2lBbHBoYSA9IDE7CisKKyAgICBwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMuY2hhblV0aWxBbHBoYSA9CisgICAgICAgICAgICgxMDAgKiBsZWFybkludGVydmFsKSAvIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNJbmRQZXJpb2Q7CisKKyAgICBpZiAoIXBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5jaGFuVXRpbEFscGhhKQorICAgICAgICBwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMuY2hhblV0aWxBbHBoYSA9IDE7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqIGVuZCBsaW1Jbml0TWVhc1Jlc291cmNlcygpICoqKi8KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBfX2xpbUZyZWVNZWFzQW5kU2VuZFJzcAorXGJyaWVmICBGcmVlIHRoZSBtZWFzIHJlbGF0ZWQgcmVzb3VyY2VzIGFuZCBzZW5kCisgICAgICAgIHJlc3BvbnNlIHRvIFNNRS4KK1xwYXJhbSAgcE1hYworXHBhcmFtICByZXN1bHRDb2RlCitccmV0dXJuIE5vbmUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQKK19fbGltRnJlZU1lYXNBbmRTZW5kUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlKQoreworICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NZWFzUmVxICE9IE5VTEwpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxKTsKKyAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc1JlcSAgPSBOVUxMOworICAgIH0KKworICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEpOworICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgLy8vIFNlbmQgZmFpbHVyZSByZXNwb25zZSB0byBXU00KKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX01FQVNVUkVNRU5UX1JTUCwgcmVzdWx0Q29kZSk7Cit9CisKKy8qKgorICogbGltUHJvY2Vzc1NtZU1lYXN1cmVtZW50UmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc0xtbU1lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9NRUFTVVJFTUVOVF9SRVEgZnJvbSBXU00uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitsaW1Qcm9jZXNzU21lTWVhc3VyZW1lbnRSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU01FIFN0YXRlID0gJWRcbiIpLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTspCisgICAgc3dpdGNoIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBlTElNX1NNRV9PRkZMSU5FX1NUQVRFOgorICAgICAgICBjYXNlIGVMSU1fU01FX0lETEVfU1RBVEU6CisgICAgICAgIGNhc2UgZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOgorICAgICAgICBjYXNlIGVMSU1fU01FX05PUk1BTF9TVEFURToKKyAgICAgICAgY2FzZSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURToKKyAgICAgICAgY2FzZSBlTElNX1NNRV9DSEFOTkVMX1NDQU5fU1RBVEU6CisgICAgICAgIGNhc2UgZUxJTV9TTUVfTk9STUFMX0NIQU5ORUxfU0NBTl9TVEFURToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJSZWNlaXZlZCB1bmV4cGVjdGVkIE1lYXNSZXEgbWVzc2FnZSBpbiBzdGF0ZSAlWFxuIiksCisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTsKKworICAgICAgICAgICAgLy8vIFNlbmQgZmFpbHVyZSByZXNwb25zZSB0byBob3N0CisgICAgICAgICAgICBsaW1TZW5kU21lUnNwKAorICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9NRUFTVVJFTUVOVF9SU1AsCisgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9IC8vIGVuZCBzd2l0Y2ggKHBNYWMtPmxpbS5nTGltU21lU3RhdGUpCisKKyAgICBpZiAocE1hYy0+bGltLmdwTGltTWVhc1JlcSkKKyAgICB7CisgICAgICAgIC8vIFRoZXJlIHdhcyBhIHByZXZpb3VzIG1lYXN1cmVtZW50IHJlcSBpc3N1ZWQuCisgICAgICAgIC8vIENsZWFudXAgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgdGhhdCByZXF1ZXN0LgorICAgICAgICBsaW1EZWxldGVNZWFzVGltZXJzKHBNYWMpOworICAgICAgICBsaW1DbGVhbnVwTWVhc0RhdGEocE1hYyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFRoZXJlIHdhcyBubyBwcmV2aW91cyBtZWFzdXJlbWVudCByZXEgaXNzdWVkLgorICAgICAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCBtZWFzdXJlbWVudHMuCisgICAgICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAgICAgICBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopJnBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRMaW1NZWFzRGF0YSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkIGZvciBNZWFzRGF0YVxuIikpOworCisgICAgICAgICAgICAvLy8gU2VuZCBmYWlsdXJlIHJlc3BvbnNlIHRvIGhvc3QKKyAgICAgICAgICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9TTUVfTUVBU1VSRU1FTlRfUlNQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKXBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0TGltTWVhc0RhdGEpKTsKKyAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPmR1cmF0aW9uID0gMTIwOworICAgIH0KKworICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAgIHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHRTaXJTbWVNZWFzdXJlbWVudFJlcSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BWF9OVU1fQ0hBTk5FTFMpKSkKKyAgICB7CisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkIGZvciBNZWFzUmVxXG4iKSk7KQorCisgICAgICAgIF9fbGltRnJlZU1lYXNBbmRTZW5kUnNwKHBNYWMsIGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKGxpbU1lYXN1cmVtZW50UmVxU2VyRGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwTXNnQnVmKSA9PSBlU0lSX0ZBSUxVUkUpIHx8CisgICAgICAgICFsaW1Jc1NtZU1lYXN1cmVtZW50UmVxVmFsaWQocE1hYyxwTWFjLT5saW0uZ3BMaW1NZWFzUmVxKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoIlJ4J2VkIE1lYXNSZXEgbWVzc2FnZSB3aXRoIGludmFsaWQgcGFyYW1ldGVyc1xuIikpOworCisgICAgICAgIF9fbGltRnJlZU1lYXNBbmRTZW5kUnNwKHBNYWMsIGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZkZWYgQU5JX0FQX1NESworICAgIC8qIGNvbnZlcnQgZnJvbSBtUyB0byBUVSBhbmQgVElDS1MgKi8KKyAgICBsaW1Db252ZXJ0U2NhbkR1cmF0aW9uKHBNYWMpOworI2VuZGlmIC8qIEFOSV9BUF9TREsgKi8KKworICAgIC8vIEluaXRpYWxpemUgTWVhc3VyZW1lbnQgcmVsYXRlZCByZXNvdXJjZXMKKyAgICBpZiAobGltSW5pdE1lYXNSZXNvdXJjZXMocE1hYykgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgX19saW1GcmVlTWVhc0FuZFNlbmRSc3AocE1hYywgZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLAorICAgICAgIEZMKCJOdW1DaGFubmVscz0lZCwgc2hvcnREdXJhdGlvbj0lZCwgc2hvcnRJbnRlcnZhbD0lZCwgbG9uZ0ludGVydmFsPSVkXG4iKSwKKyAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscywKKyAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5tZWFzRHVyYXRpb24uc2hvcnRUZXJtUGVyaW9kLAorICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb24sCisgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0R1cmF0aW9uLmxvbmdDaGFubmVsU2NhbkR1cmF0aW9uKTspCisKKyAgICBsaW1SYWRhckluaXQocE1hYyk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBMZWFybiBpbnRlcnZhbCB0aW1lciBzbyB0aGF0CisgICAgICogbWVhc3VyZW1lbnRzIGFyZSBtYWRlIGZyb20gdGhhdAorICAgICAqIHRpbWVvdXQgb253YXJkcy4KKyAgICAgKi8KKyAgICBsaW1SZUVuYWJsZUxlYXJuTW9kZShwTWFjKTsKKworICAgIC8vLyBBbGwgaXMgd2VsbCB3aXRoIE1lYXNSZXEuIFNlbmQgcmVzcG9uc2UgdG8gV1NNCisgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1NNRV9NRUFTVVJFTUVOVF9SU1AsCisgICAgICAgICAgICAgICAgICBlU0lSX1NNRV9TVUNDRVNTKTsKKyAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJTZW5kaW5nIHN1Y2NlcyByZXNwb25zZSB0byBTTUVcbiIpKTspCisgICAgCisgICAgaWYgKHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzID09IDEpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU3RhcnRpbmcgQ2hhbm5lbCBBdmFpbGFiaWxpdHkgQ2hlY2sgb24gQ2hhbm5lbCAlZC4uLiBXYWl0XG4iKSwKKyAgICAgICAgICAgICAgICAqcE1hYy0+bGltLmdwTGltTWVhc1JlcS0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlcik7Cit9IC8qKiogZW5kIGxpbVByb2Nlc3NTbWVNZWFzdXJlbWVudFJlcSgpICoqKi8KKworCisvKioKKyAqIGxpbVByb2Nlc3NTbWVTZXRXZHNJbmZvUmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc0xtbU1lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9TRVRfV0RTX0lORk9fUkVRIGZyb20gV1NNLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc1NtZVNldFdkc0luZm9SZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgICBpOworICAgIHRTaXJTbWVTZXRXZHNJbmZvUmVxICAgIHdkc0luZm9SZXE7CisKKyAgICBwTWFjLT5saW0uZ0xpbU51bVdkc0luZm9TZXQrKzsKKworICAgIHN3aXRjaCAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgZUxJTV9TTUVfTk9STUFMX1NUQVRFOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoIlJ4J2VkIHVuZXhwIFNldFdkc0luZm9SZXEgbWVzc2FnZSBpbiBzdGF0ZSAlWFxuIiksCisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTsKKworICAgICAgICAgICAgLy8vIFNlbmQgZmFpbHVyZSByZXNwb25zZSB0byBob3N0CisgICAgICAgICAgICBsaW1TZW5kU21lUnNwKAorICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9TRVRfV0RTX0lORk9fUlNQLAorICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NNRV9VTkVYUEVDVEVEX1JFUV9SRVNVTFRfQ09ERSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfSAvLyBlbmQgc3dpdGNoIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKQorCisgICAgaWYgKChsaW1XZHNSZXFTZXJEZXMoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZHNJbmZvUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwTXNnQnVmKSA9PSBlU0lSX0ZBSUxVUkUpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgIEZMKCJSeCdlZCBTZXRXZHNJbmZvUmVxIG1lc3NhZ2Ugd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnNcbiIpKTsKKworICAgICAgICAvLy8gU2VuZCBmYWlsdXJlIHJlc3BvbnNlIHRvIFdTTQorICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NFVF9XRFNfSU5GT19SU1AsCisgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgV0RTIGluZm8gaXMgdGhlIHNhbWUgYXMgY3VycmVudAorICAgIGlmICgod2RzSW5mb1JlcS53ZHNJbmZvLndkc0xlbmd0aCA9PQorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPndkc0luZm8ud2RzTGVuZ3RoKSAmJgorICAgICAgICAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsd2RzSW5mb1JlcS53ZHNJbmZvLndkc0J5dGVzLAorICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+d2RzSW5mby53ZHNCeXRlcywKKyAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPndkc0luZm8ud2RzTGVuZ3RoKSApICkKKyAgICB7CisgICAgICAgIC8vLyBTZW5kIHN1Y2Nlc3MgcmVzcG9uc2UgdG8gV1NNCisgICAgICAgIGxpbVNlbmRTbWVSc3AocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9TRVRfV0RTX0lORk9fUlNQLAorICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX1NVQ0NFU1MpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjb3B5IFdEUyBpbmZvCisgICAgcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT53ZHNJbmZvLndkc0xlbmd0aCA9CisgICAgICAgICAgICB3ZHNJbmZvUmVxLndkc0luZm8ud2RzTGVuZ3RoOworICAgIGZvciAoaT0wOyBpPHdkc0luZm9SZXEud2RzSW5mby53ZHNMZW5ndGg7IGkrKykKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT53ZHNJbmZvLndkc0J5dGVzW2ldID0KKyAgICAgICAgICAgIHdkc0luZm9SZXEud2RzSW5mby53ZHNCeXRlc1tpXTsKKworICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMscHNlc3Npb25FbnRyeSk7CisKKyAgICAvLy8gU2VuZCBzdWNjZXNzIHJlc3BvbnNlIHRvIFdTTQorICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9TTUVfU0VUX1dEU19JTkZPX1JTUCwKKyAgICAgICAgICAgICAgICAgIGVTSVJfU01FX1NVQ0NFU1MpOworCit9IC8qKiogZW5kIGxpbVByb2Nlc3NTbWVNZWFzdXJlbWVudFJlcSgpICoqKi8KKworCisvKioKKyAqIGxpbVByb2Nlc3NMZWFybkR1cmF0aW9uVGltZW91dCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NMbW1NZXNzYWdlcygpIHVwb24KKyAqIHJlY2VpdmluZyBMRUFSTl9EVVJBVElPTl9USU1FT1VULgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc0xlYXJuRHVyYXRpb25UaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIGlmICggcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPT0gZUxJTV9IQUxfSURMRV9TQ0FOX1NUQVRFKQorICAgIHsKKyAgICAgICAgbGltU2VuZEhhbEluaXRTY2FuUmVxKHBNYWMsIGVMSU1fSEFMX0lOSVRfTEVBUk5fV0FJVF9TVEFURSwgZVNJUl9ET05UX0NIRUNLX0xJTktfVFJBRkZJQ19CRUZPUkVfU0NBTiApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ3VycmVudCBsZWFybiBkdXJhdGlvbiBleHBpcmVkLgorICAgIGlmIChwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubmV4dExlYXJuQ2hhbm5lbElkID09CisgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzIC0gMSkKKyAgICB7CisgICAgICAgIC8vU2V0IHRoZSByZXN1bWUgY2hhbm5lbCB0byBBbnkgdmFsaWQgY2hhbm5lbCAoaW52YWxpZCkuIAorICAgICAgICAvL1RoaXMgd2lsbCBpbnN0cnVjdCBIQUwgdG8gc2V0IGl0IHRvIGFueSBwcmV2aW91cyB2YWxpZCBjaGFubmVsLgorICAgICAgICBwZVNldFJlc3VtZUNoYW5uZWwocE1hYywgMCwgMCk7CisgICAgICAgIC8vIFNlbmQgV0RBX0VORF9TQ0FOX1JFUSB0byBIQUwgZmlyc3QKKyAgICAgICAgbGltU2VuZEhhbEZpbmlzaFNjYW5SZXEocE1hYywgZUxJTV9IQUxfRklOSVNIX0xFQVJOX1dBSVRfU1RBVEUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubmV4dExlYXJuQ2hhbm5lbElkKys7CisKKyAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX1VOS05PV05fUk9MRSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTElNIGRpZCBub3QgdGFrZSBBUC9CUCByb2xlIHlldC4KKyAgICAgICAgICAgIC8vIFNvIGNvbnRpbnVlIExlYXJuIHByb2Nlc3Mgb24gcmVtYWluaW5nIGNoYW5uZWxzCisgICAgICAgICAgICAvLyBTZW5kIFdEQV9FTkRfU0NBTl9SRVEgdG8gSEFMIGZpcnN0CisgICAgICAgICAgICBsaW1TZW5kSGFsRW5kU2NhblJlcShwTWFjLCAodEFOSV9VOClwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubmV4dExlYXJuQ2hhbm5lbElkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fSEFMX0VORF9MRUFSTl9XQUlUX1NUQVRFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2V0IHRoZSByZXN1bWUgY2hhbm5lbCB0byBBbnkgdmFsaWQgY2hhbm5lbCAoaW52YWxpZCkuIAorICAgICAgICAgICAgLy9UaGlzIHdpbGwgaW5zdHJ1Y3QgSEFMIHRvIHNldCBpdCB0byBhbnkgcHJldmlvdXMgdmFsaWQgY2hhbm5lbC4KKyAgICAgICAgICAgIHBlU2V0UmVzdW1lQ2hhbm5lbChwTWFjLCAwLCAwKTsKKyAgICAgICAgICAgIC8vIFNlbmQgV0RBX0ZJTklTSF9TQ0FOX1JFUSB0byBIQUwgZmlyc3QKKyAgICAgICAgICAgIGxpbVNlbmRIYWxGaW5pc2hTY2FuUmVxKHBNYWMsIGVMSU1fSEFMX0ZJTklTSF9MRUFSTl9XQUlUX1NUQVRFKTsKKyAgICAgICAgfQorICAgIH0KK30gLyoqKiBlbmQgbGltUHJvY2Vzc0xlYXJuRHVyYXRpb25UaW1lb3V0KCkgKioqLworCisvKioKKyAqIGxpbVByb2Nlc3NMZWFybkludGVydmFsVGltZW91dCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIAorICogU0lSX0xJTV9MRUFSTl9JTlRFUlZBTF9USU1FT1VUIG1lc3NhZ2UgaXMgcmVjZWl2ZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1Qcm9jZXNzTGVhcm5JbnRlcnZhbFRpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICAKKyNpZmRlZiBHRU42X1RPRE8KKyAgICAvL2ZldGNoIHRoZSBzZXNzaW9uRW50cnkgYmFzZWQgb24gdGhlIHNlc3Npb25JZAorICAgIC8vcHJpb3JpdHkgLSBNRURJVU0KKyAgICB0cFBFU2Vzc2lvbiBzZXNzaW9uRW50cnk7CisKKyAgICBpZigoc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsIHBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkludGVydmFsVGltZXIuc2Vzc2lvbklkKSk9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLEZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSURcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiU01FIHN0YXRlID0gJWRcbiIpLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTspCisgICAgaWYgKCFwTWFjLT5zeXMuZ1N5c0VuYWJsZUxlYXJuTW9kZSkKKyAgICB7CisgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywKKyAgICAgICAgICAgICAgICAgICAgICBGTCgiSWdub3JpbmcgTEVBUk5fSU5URVJWQUxfVElNRU9VVCBiZWNhdXNlIGdTeXNFbmFibGVMZWFybk1vZGUgaXMgZGlzYWJsZWQuLi5cbiIpKTspCisgICAgICAgIGxpbVJlRW5hYmxlTGVhcm5Nb2RlKHBNYWMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlKQorICAgIHsKKyAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgIEZMKCJTZW5kaW5nIFNUQVJUX1NDQU4gZnJvbSBMSU0gd2hpbGUgb25lIHJlcSBpcyBwZW5kaW5nXG4iKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcE1hYy0+bGltLmdMaW1QcmV2U21lU3RhdGUgPSBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlOworICAgIGlmICgocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9PRkZMSU5FX1NUQVRFKSB8fAorICAgICAgICAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9JRExFX1NUQVRFKSB8fAorICAgICAgICAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEUpKQorICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID0gZUxJTV9TTUVfQ0hBTk5FTF9TQ0FOX1NUQVRFOworICAgIGVsc2UgaWYgKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKQorICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID0gZUxJTV9TTUVfTk9STUFMX0NIQU5ORUxfU0NBTl9TVEFURTsKKyAgICBlbHNlIGlmIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX0xJTktfRVNUX1NUQVRFKQorICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID0gZUxJTV9TTUVfTElOS19FU1RfV1RfU0NBTl9TVEFURTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybjsKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKworICAgIC8qIFRoZSBjb21tZW50ZWQgcGllY2Ugb2YgY29kZSBoZXJlIGlzIHRvIGhhbmRsZSB0aGUgTWVhc3VyZW1lbnQgUmVxdWVzdCBmcm9tIFdTTSBhcyBTY2FuCisgICAgICogcmVxdWVzdCBpbiB0aGUgTElNIGluIExpbnV4IFN0YXRpb24uIEN1cnJlbnRseSwgdGhlIHN0YXRpb24gdXNlcyBNZWFzdXJlbWVudCByZXF1ZXN0IHRvIAorICAgICAqIGdldCB0aGUgc2NhbiBsaXN0LiBJZiBtZWFzdXJlbWVudCByZXF1ZXN0IGl0c2VsZiBpcyB1c2VkIGZvciBzdGF0aW9uIGFsc28gd2hpbGUgc2Nhbm5pbmcsIHRoaXMKKyAgICAgKiBjb2RlIGNhbiBiZSByZW1vdmVkLiBJZiB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBhcyBzY2FuIHJlcXVlc3QsIHdlIG5lZWQgdG8gCisgICAgICogaW1wbGVtZW50IHRoZSBiZWxvdyBjb21tZW50ZWQgY29kZSBpbiBhIG1vcmUgY2xlYW5lciB3YXkoaGFuZGxpbmcgdGhlIFNDQU5fQ05GLCBtZW1vcnkgZnJlZWluZywgZXRjKQorICAgICAqLworLy8gICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSAhPSBlTElNX1NUQV9ST0xFKQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1QcmV2TWxtU3RhdGUgPSBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlOworICAgICAgICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlICAgICA9IGVMSU1fTUxNX0xFQVJOX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1TeXN0ZW1JblNjYW5MZWFybk1vZGUgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB9CisjaWYgMAorICAgIC8qKgorICAgICAqIHN0YXJ0IHRoZSB0aW1lciB0byBlbnRlciBpbnRvIExlYXJuIG1vZGUKKyAgICAgKi8KKyAgICBpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpCisgICAgeworICAgICAgICB0TGltTWxtU2NhblJlcSAgICAgKnBNbG1TY2FuUmVxOworICAgICAgICB0QU5JX1UzMiAgICAgICAgICAgIGxlbjsKKyAgICAgICAgCisgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1sbVNjYW5SZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZih0TGltTWxtU2NhblJlcSkgKyBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1TY2FuUmVxXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcE1sbVNjYW5SZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIpKHNpemVvZih0TGltTWxtU2NhblJlcSkgKyBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4gKSk7CisKKyAgICAgICAgbGVuID0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOOworICAgICAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBwTWxtU2NhblJlcS0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIFZhbGlkIGNoYW5uZWwgbGlzdFxuIikpOworICAgICAgICB9CisgICAgICAgIHBNbG1TY2FuUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9ICh0QU5JX1U4KSBsZW47CisgICAgICAgIAorICAgICAgICBwYWxGaWxsTWVtb3J5KHBNYWMtPmhIZGQsICZwTWxtU2NhblJlcS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkciksIDB4ZmYpOworICAgICAgICBwTWxtU2NhblJlcS0+YnNzVHlwZSA9IGVTSVJfQVVUT19NT0RFOworICAgICAgICBwTWxtU2NhblJlcS0+c2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgICAgICBwTWxtU2NhblJlcS0+YmFja2dyb3VuZFNjYW5Nb2RlID0gMDsKKyAgICAgICAgcE1sbVNjYW5SZXEtPm1heENoYW5uZWxUaW1lID0gNDA7CisgICAgICAgIHBNbG1TY2FuUmVxLT5taW5DaGFubmVsVGltZSA9IDIwOworICAgICAgICBsaW1Qb3N0TWxtTWVzc2FnZShwTWFjLCBMSU1fTUxNX1NDQU5fUkVRLCAodEFOSV9VMzIgKikgcE1sbVNjYW5SZXEpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgICAgICAgIAorICAgICAgICBsaW1TZXRMZWFybk1vZGUocE1hYyk7Cit9IAorCisKKy8qKgorICogbGltUHJvY2Vzc0xtbU1lc3NhZ2VzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpLiBUaGlzCisgKiBmdW5jdGlvbiBwcm9jZXNzZXMgU01FIG1lc3NhZ2VzIGZyb20gV1NNIGFuZCBNTE0gY25mL2luZAorICogbWVzc2FnZXMgZnJvbSBNTE0gbW9kdWxlLgorICoKKyAqTE9HSUM6CisgKiBEZXBlbmRpbmcgb24gdGhlIG1lc3NhZ2UgdHlwZSwgY29ycmVzcG9uZGluZyBmdW5jdGlvbiB3aWxsIGJlCisgKiBjYWxsZWQuCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBtc2dUeXBlICAgSW5kaWNhdGVzIHRoZSBTTUUgbWVzc2FnZSB0eXBlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVByb2Nlc3NMbW1NZXNzYWdlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBtc2dUeXBlLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICBzd2l0Y2ggKG1zZ1R5cGUpCisgICAgeworICAgICAgICBjYXNlIGVXTklfU01FX01FQVNVUkVNRU5UX1JFUToKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIE1FQVNVUkVNRU5UX1JFUSBtZXNzYWdlXG4iKSk7KQorICAgICAgICAgICAgbGltUHJvY2Vzc1NtZU1lYXN1cmVtZW50UmVxKHBNYWMsIHBNc2dCdWYpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX1NFVF9XRFNfSU5GT19SRVE6CisKKyAgICAgICAgICAgIGxpbVByb2Nlc3NTbWVTZXRXZHNJbmZvUmVxKHBNYWMsIHBNc2dCdWYpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9MSU1fTUVBU1VSRU1FTlRfSU5EX1RJTUVPVVQ6CisgICAgICAgICAgICAvLyBUaW1lIHRvIHNlbmQgTWVhc3VyZW1lbnQgSW5kaWNhdGlvbiB0byBXU00KKyAgICAgICAgICAgIGxpbVNlbmRTbWVNZWFzdXJlbWVudEluZChwTWFjKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTElNX0xFQVJOX0lOVEVSVkFMX1RJTUVPVVQ6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTGVhcm5JbnRlcnZhbFRpbWVvdXQocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9MSU1fTEVBUk5fRFVSQVRJT05fVElNRU9VVDoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NMZWFybkR1cmF0aW9uVGltZW91dChwTWFjLCBwTXNnQnVmKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgYnJlYWs7CisgICAgfSAvLyBzd2l0Y2ggKG1zZ1R5cGUpCisKKyAgICByZXR1cm47Cit9IC8qKiogZW5kIGxpbVByb2Nlc3NMbW1NZXNzYWdlcygpICoqKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NNZXNzYWdlUXVldWUuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDNjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NNZXNzYWdlUXVldWUuYwpAQCAtMCwwICsxLDIxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW0gUHJvY2Vzc01lc3NhZ2VRdWV1ZS5jYyBjb250YWlucyB0aGUgY29kZQorICogZm9yIHByb2Nlc3NpbmcgTElNIG1lc3NhZ2UgUXVldWUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJ3bmlBcGkuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsRGF0YVN0cnVjdC5oIgorI2luY2x1ZGUgImhhbENvbW1vbkFwaS5oIgorI2VsaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfZHMuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfcGFja2V0LmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisjZW5kaWYKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyNpbmNsdWRlICJ3bmlDZmdBcC5oIgorI2Vsc2UKKyNpbmNsdWRlICJ3bmlDZmdTdGEuaCIKKyNlbmRpZgorI2luY2x1ZGUgImNmZ0FwaS5oIgorI2luY2x1ZGUgInNpckNvbW1vbi5oIgorI2luY2x1ZGUgInV0aWxzQXBpLmgiCisjaW5jbHVkZSAibGltVHlwZXMuaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbUFzc29jVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Qcm9wRXh0c1V0aWxzLmgiCisKKyNpbmNsdWRlICJsaW1BZG1pdENvbnRyb2wuaCIKKyNpbmNsdWRlICJwbW1BcGkuaCIKKyNpbmNsdWRlICJsaW1JYnNzUGVlck1nbXQuaCIKKyNpbmNsdWRlICJzY2hBcGkuaCIKKyNpbmNsdWRlICJsaW1TZXNzaW9uLmgiCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNpbmNsdWRlICJycm1BcGkuaCIKKyNlbmRpZgorI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorI2luY2x1ZGUgImNjeEFwaS5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisjaW5jbHVkZSAibGltRlQuaCIKKyNlbmRpZgorCisjaWZkZWYgV01NX0FQU0QKKyNpbmNsdWRlICJ3bW1BcHNkLmgiCisjZW5kaWYKKworI2lmZGVmIFZPU1NfRU5BQkxFRAorI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgInZvc19wYWNrZXQuaCIKKyNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCisjZW5kaWYKKwordm9pZCBsaW1Mb2dTZXNzaW9uU3RhdGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGRlZk1zZ0RlY2lzaW9uCitcYnJpZWYgVGhlIGZ1bmN0aW9uIGRlY2lkZXMgd2hldGhlciB0byBkZWZlciBhIG1lc3NhZ2Ugb3Igbm90IGluIGxpbVByb2Nlc3NNZXNzYWdlIGZ1bmN0aW9uCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gICAgICAgdFNpck1zZ1EgIGxpbU1zZworXHBhcmFtICAgICAgIHRTaXJNYWNUc3BlY0lFICAgKnBwSW5mbworXHJldHVybiBub25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0QU5JX1U4IHN0YXRpYworZGVmTXNnRGVjaXNpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRICBsaW1Nc2cpCit7CisKKworLyogdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGNoYW5nZWQgKi8KKyAgaWYoKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgPT0gZUxJTV9TTUVfU1VTUEVORF9TVEFURSkgJiYKKyAgICAgIChsaW1Nc2ctPnR5cGUgIT0gU0lSX0xJTV9SRVNVTUVfQUNUSVZJVFlfTlRGKSkKKyAgeworICAgICAgLy8gRGVmZXIgcHJvY2Vzc3NpbmcgdGhpcyBtZXNzYWdlCisgICAgICBpZiAobGltRGVmZXJNc2cocE1hYywgbGltTXNnKSAhPSBUWF9TVUNDRVNTKQorICAgICAgeworICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlVuYWJsZSB0byBEZWZlciBtZXNzYWdlKDB4JVgpICVzIGxpbVNtZVN0YXRlICVkIChwcmV2IHNtZSBzdGF0ZSAlZCkgc3lzUm9sZSAlZCBtbG0gc3RhdGUgJWQgKHByZXYgbWxtIHN0YXRlICVkKVxuIiksCisgICAgICAgICAgICAgICAgICAgbGltTXNnLT50eXBlLCBsaW1Nc2dTdHIobGltTXNnLT50eXBlKSwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSwgIHBNYWMtPmxpbS5nTGltUHJldlNtZVN0YXRlLAorICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSwgIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUsICBwTWFjLT5saW0uZ0xpbVByZXZNbG1TdGF0ZSk7KQorICAgICAgICAgIGxpbUxvZ1Nlc3Npb25TdGF0ZXMocE1hYyk7CisgICAgICAgICAgbGltSGFuZGxlRGVmZXJNc2dFcnJvcihwTWFjLCBsaW1Nc2cpOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvL1doZW4gZGVmZXIgaXMgcmVxdWVzdGVkIHRoZW4gZGVmZXIgYWxsIHRoZSBtZXNzYWdlcyBleGNlcHQgSEFMIHJlc3BvbnNlcy4KKyAgaWYoKCFsaW1Jc1N5c3RlbUluU2NhblN0YXRlKHBNYWMpKSAmJiAodHJ1ZSAhPSBHRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjKSkgJiYKKyAgICAgICFwTWFjLT5saW0uZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSkKKyAgeworICAgICAgaWYoKGxpbU1zZy0+dHlwZSAhPSBXREFfQUREX0JTU19SU1ApICYmCisgICAgICAgIChsaW1Nc2ctPnR5cGUgIT0gV0RBX0RFTEVURV9CU1NfUlNQKSAmJgorICAgICAgICAobGltTXNnLT50eXBlICE9IFdEQV9BRERfU1RBX1JTUCkgJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfQUREX1NUQV9TRUxGX1JTUCkgJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfREVMX1NUQV9TRUxGX1JTUCkgJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfREVMRVRFX1NUQV9SU1ApJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfU0VUX0JTU0tFWV9SU1ApJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfU0VUX1NUQUtFWV9SU1ApJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfU0VUX1NUQV9CQ0FTVEtFWV9SU1ApICYmCisgICAgICAgIChsaW1Nc2ctPnR5cGUgIT0gU0lSX0xJTV9SRVNVTUVfQUNUSVZJVFlfTlRGKSYmCisgICAgICAgIChsaW1Nc2ctPnR5cGUgIT0gZVdOSV9TTUVfU1RBUlRfUkVRKSAmJgorICAgICAgICAobGltTXNnLT50eXBlICE9IFdEQV9BR0dSX1FPU19SU1ApICYmCisgICAgICAgIChsaW1Nc2ctPnR5cGUgIT0gV0RBX1JFTU9WRV9CU1NLRVlfUlNQKSAmJgorICAgICAgICAobGltTXNnLT50eXBlICE9IFdEQV9SRU1PVkVfU1RBS0VZX1JTUCkgJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfU0VUX01JTU9QU19SU1ApJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfQUREQkFfUlNQKSAmJgorICAgICAgICAobGltTXNnLT50eXBlICE9IFdEQV9FTlRFUl9CTVBTX1JTUCkgJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfRVhJVF9CTVBTX1JTUCkgJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfRU5URVJfSU1QU19SU1ApICYmCisgICAgICAgIChsaW1Nc2ctPnR5cGUgIT0gV0RBX0VYSVRfSU1QU19SU1ApICYmCisgICAgICAgIChsaW1Nc2ctPnR5cGUgIT0gV0RBX0VOVEVSX1VBUFNEX1JTUCkgJiYKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfRVhJVF9VQVBTRF9SU1ApICYmCisgICAgICAgIChsaW1Nc2ctPnR5cGUgIT0gV0RBX1dPV0xfRU5URVJfUlNQKSAmJgorICAgICAgICAobGltTXNnLT50eXBlICE9IFdEQV9XT1dMX0VYSVRfUlNQKSAmJgorICAgICAgICAobGltTXNnLT50eXBlICE9IFdEQV9TV0lUQ0hfQ0hBTk5FTF9SU1ApICYmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUCAKKyAgICAgICAgKGxpbU1zZy0+dHlwZSAhPSBXREFfUDJQX05PQV9BVFRSX0lORCkgJiYKKyNlbmRpZgorICAgICAgICAobGltTXNnLT50eXBlICE9IFdEQV9BRERfVFNfUlNQKSkKKyAgICB7CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkRlZmVyIHRoZSBjdXJyZW50IG1lc3NhZ2UgJXMgLCBnTGltUHJvY2Vzc0RlZmRNc2dzIGlzIGZhbHNlIGFuZCBzeXN0ZW0gaXMgbm90IGluIHNjYW4vbGVhcm4gbW9kZVxuIiksCisgICAgICAgICAgICAgICBsaW1Nc2dTdHIobGltTXNnLT50eXBlKSk7KQorCisgICAgICAgIC8vIERlZmVyIHByb2Nlc3NzaW5nIHRoaXMgbWVzc2FnZQorICAgICAgICBpZiAobGltRGVmZXJNc2cocE1hYywgbGltTXNnKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gRGVmZXIgbWVzc2FnZSgweCVYKSAlcyBsaW1TbWVTdGF0ZSAlZCAocHJldiBzbWUgc3RhdGUgJWQpIHN5c1JvbGUgJWQgbWxtIHN0YXRlICVkIChwcmV2IG1sbSBzdGF0ZSAlZClcbiIpLAorICAgICAgICAgICAgICAgICAgIGxpbU1zZy0+dHlwZSwgbGltTXNnU3RyKGxpbU1zZy0+dHlwZSksIHBNYWMtPmxpbS5nTGltU21lU3RhdGUsICBwTWFjLT5saW0uZ0xpbVByZXZTbWVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUsICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlLCAgcE1hYy0+bGltLmdMaW1QcmV2TWxtU3RhdGUpOykKKyAgICAgICAgICAgIGxpbUxvZ1Nlc3Npb25TdGF0ZXMocE1hYyk7CisgICAgICAgICAgICBsaW1IYW5kbGVEZWZlck1zZ0Vycm9yKHBNYWMsIGxpbU1zZyk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvKgorKiBCZWFjb24gSGFuZGxpbmcgQ2FzZXM6CisqIGR1cmluZyBzY2FubmluZywgd2hlbiBubyBzZXNzaW9uIGlzIGFjdGl2ZToKKyogICAgaGFuZGxlZCBieSBsaW1IYW5kbGVGcmFtZXNJblNjYW5TdGF0ZSBiZWZvcmUgX19saW1IYW5kbGVCZWFjb24gY2FsbCBpcyBpbnZva2VkLgorKiBkdXJpbmcgc2Nhbm5pbmcsIHdoZW4gYW55IHNlc3Npb24gaXMgYWN0aXZlLCBidXQgYmVhY29uL1ByIGRvZXMgbm90IGJlbG9uZyB0byB0aGF0IHNlc3Npb24sIHBzZXNzaW9uRW50cnkgd2lsbCBiZSBudWxsLgorKiAgICBoYW5kbGVkIGJ5IGxpbUhhbmRsZUZyYW1lc0luU2NhblN0YXRlIGJlZm9yZSBfX2xpbUhhbmRsZUJlYWNvbiBjYWxsIGlzIGludm9rZWQuCisqIGR1cmluZyBzY2FubmluZywgd2hlbiBhbnkgc2Vzc2lvbiBpcyBhY3RpdmUsIGFuZCBiZWFjb24vUHIgYmVsb25ncyB0byBvbmUgb2YgdGhlIHNlc3Npb24sIHBzZXNzaW9uRW50cnkgd2lsbCBub3QgYmUgbnVsbC4KKyogICAgaGFuZGxlZCBieSBsaW1IYW5kbGVGcmFtZXNJblNjYW5TdGF0ZSBiZWZvcmUgX19saW1IYW5kbGVCZWFjb24gY2FsbCBpcyBpbnZva2VkLgorKiBOb3Qgc2Nhbm5pbmcsIG5vIHNlc3Npb246CisqICAgIHRoZXJlIHNob3VsZCBub3QgYmUgYW55IGJlYWNvbiBjb21pbmcsIGlmIGNvbWluZywgc2hvdWxkIGJlIGRyb3BwZWQuCisqIE5vdCBTY2FubmluZywgCisqLworc3RhdGljIHZvaWQKK19fbGltSGFuZGxlQmVhY29uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIC8qIGNoZWNraW5nIGZvciBnbG9iYWwgU01FIHN0YXRlLi4uKi8KKyAgICB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvOworICAgIGxpbUdldEJEZnJvbVJ4UGFja2V0KHBNYWMsIHBNc2ctPmJvZHlwdHIsICh0QU5JX1UzMiAqKikmcFJ4UGFja2V0SW5mbyk7CisKKyAgICAvL1RoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgYmVhY29uIGlzIHJlY2VpdmVkIGluIHNjYW4gc3RhdGUuCisgICAgLy9TbyBub3QgZG9pbmcgYW55IGNoZWNrcyBmb3IgdGhlIGdsb2JhbCBzdGF0ZS4KKworICAgIGlmKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNjaEJlYWNvblByb2Nlc3MocE1hYywgcFJ4UGFja2V0SW5mbywgTlVMTCk7CisgICAgfQorICAgIGVsc2UgaWYoIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURSkgfHwKKyAgICAgICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKSkKKyAgICB7CisgICAgICAgIHNjaEJlYWNvblByb2Nlc3MocE1hYywgcFJ4UGFja2V0SW5mbywgcHNlc3Npb25FbnRyeSk7CisgICAgfQorICAgICBlbHNlCisgICAgICAgIGxpbVByb2Nlc3NCZWFjb25GcmFtZShwTWFjLCBwUnhQYWNrZXRJbmZvLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICByZXR1cm47Cit9CisKKworLy9GdWNudGlvbiBwcm90b3R5cGUKK3ZvaWQgbGltUHJvY2Vzc05vcm1hbEhkZE1zZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSAqcExpbU1zZywgdEFOSV9VOCBmUnNwUmVxZCk7CisKKy8qKgorICogbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBMSU0gdGhyZWFkIGVudHJ5IGZ1bmN0aW9uLiBUaGlzCisgKiBmdW5jdGlvbiBmZXRjaGVzIG1lc3NhZ2VzIHBvc3RlZCB0byB0aGUgbWVzc2FnZSBxdWV1ZQorICogbGltTXNnUS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRTaXJNc2dRICBsaW1Nc2cgPSB7IDAsIDAsIDAgfTsKKworICAgIGlmKHBNYWMtPmdEcml2ZXJUeXBlID09IGVEUklWRVJfVFlQRV9NRkcpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9SVEFJX0xJTlVYKQorICAgIFVMT05HIHBhcmFtOworICAgIHdoaWxlKGdldF90aW1lcl9ldmVudChMSU1fVElNRVJfRVhQSVJZX0xJU1QsJnBhcmFtKSkKKyAgICB7CisgICAgICAgIGxpbU1zZy50eXBlID0gKHRBTklfVTE2KSBwYXJhbTsKKyAgICAgICAgbGltTXNnLmJvZHl2YWwgPSAwOworICAgICAgICBsaW1Nc2cuYm9keXB0ciA9IE5VTEw7CisgICAgICAgIGxpbU1lc3NhZ2VQcm9jZXNzb3IocE1hYywgJmxpbU1zZyk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAodHhfcXVldWVfcmVjZWl2ZSggJnBNYWMtPnN5cy5nU2lyTGltTXNnUSwgKHZvaWQgKikgJmxpbU1zZywgVFhfV0FJVF9GT1JFVkVSKQorICAgICAgICAgICAgPT0gVFhfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIkxJTSBSZWNlaXZlZCBtZXNzYWdlICVzXG4iKSwgbGltTXNnU3RyKGxpbU1zZy50eXBlKSk7KQorICAgICAgICBsaW1QcmludE1zZ0luZm8ocE1hYywgTE9HMywgJmxpbU1zZyk7CisgICAgICAgIGxpbU1lc3NhZ2VQcm9jZXNzb3IocE1hYywgJmxpbU1zZyk7CisgICAgfSAvLyBpZiAodHhfcXVldWVfcmVjZWl2ZSkKKyAgICAKK30gLyoqKiBlbmQgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpICoqKi8KKworCisKKy8qKgorICogbGltRGVmZXJNc2coKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZWZlciB0aGUgbWVzc2FnZXMgcmVjZWl2ZWQKKyAqIGR1cmluZyBMZWFybiBtb2RlCisgKgorICpMT0dJQzoKKyAqIE5BCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBNc2cgb2YgdHlwZSB0U2lyTXNnUSAtIFBvaW50ZXIgdG8gdGhlIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0QU5JX1UzMgorbGltRGVmZXJNc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKnBNc2cpCit7CisgICAgdEFOSV9VMzIgcmV0Q29kZSA9IFRYX1NVQ0NFU1M7CisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9MSU5VWCkgfHwgZGVmaW5lZChBTklfT1NfVFlQRV9PU1gpCisgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJEZWZlcnJpbmcgbWVzc2FnZSAlWCBpbiBMZWFybiBtb2RlXG4iKSwKKyAgICAgICAgICAgcE1zZy0+dHlwZSk7CisgICAgbGltUHJpbnRNc2dOYW1lKHBNYWMsIExPRzMsIHBNc2ctPnR5cGUpOykKKyAgICByZXRDb2RlID0gdHhfcXVldWVfc2VuZCgmcE1hYy0+c3lzLmdTaXJMaW1EZWZlcnJlZE1zZ1EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9OT19XQUlUKTsKKyAgICBpZiAocmV0Q29kZSA9PSBUWF9TVUNDRVNTKQorICAgICAgICBwTWFjLT5saW0uZ0xpbU51bURlZmVycmVkTXNncysrOworI2Vsc2UKKworICAgICAgICByZXRDb2RlID0gbGltV3JpdGVEZWZlcnJlZE1zZ1EocE1hYywgcE1zZyk7CisKKyNlbmRpZgorICAgIGlmKHJldENvZGUgPT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlTXNnUngocE1hYywgMCwgTElNX1RSQUNFX01BS0VfUlhNU0cocE1zZy0+dHlwZSwgTElNX01TR19ERUZFUlJFRCkpOykKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlTXNnUngocE1hYywgMCwgTElNX1RSQUNFX01BS0VfUlhNU0cocE1zZy0+dHlwZSwgTElNX01TR19EUk9QUEVEKSk7KQorICAgICAgICB9CisKKworICAgIHJldHVybiByZXRDb2RlOworfSAvKioqIGVuZCBsaW1EZWZlck1zZygpICoqKi8KKworCisKKy8qKgorICogbGltSGFuZGxlRnJhbWVzSW5TY2FuU3RhdGUoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIDgwMi4xMSBmcmFtZXMKKyAqIHJlY2VpdmVkIGJ5IExJTSBpbiBzY2FuIHN0YXRlLgorICoKKyAqTE9HSUM6CisgKiBOQQorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBsaW1Nc2cgIC0gUmVjZWl2ZWQgbWVzc2FnZQorICogQHBhcmFtICBwUnhQYWNrZXRJbmZvIC0gUG9pbnRlciB0byBSeCBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgZGVmZXJNc2cgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZnJhbWUgc2hhbGwgYmUgZGVmZXJyZWQKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitsaW1IYW5kbGVGcmFtZXNJblNjYW5TdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnLCB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvLCB0QU5JX1U4ICpkZWZlck1zZywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyTWFjRnJhbWVDdGwgIGZjOworICAgIHRwU2lyTWFjTWdtdEhkciAgcEhkcjsKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIHRBTklfVTMyICAgICAgICAgaWdub3JlID0gMDsKKyAgICB0U2lyTWFjQWRkciAgICAgIGJzc0lkUmN2OworI2VuZGlmCisKKyAgICAqZGVmZXJNc2cgPSBmYWxzZTsKKyAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworICAgIGZjID0gcEhkci0+ZmM7CisgICAgbGltTG9nKCBwTWFjLCBMT0cyLCBGTCgiUHJvdFZlcnNpb24gJWQsIFR5cGUgJWQsIFN1YnR5cGUgJWRcbiIpLAorICAgICAgICAgICAgZmMucHJvdFZlciwgZmMudHlwZSwgZmMuc3ViVHlwZSApOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkKKyAgICAvLyBTeXN0ZW0gaXMgaW4gREZTIChMZWFybikgbW9kZQorICAgIHBNYWMtPmxpbS5udW1MZWFybisrOworCisgICAgLy8gUHJvY2VzcyBhbGwgQkRzIGFuZCBleHRyYWN0IFBIWSBzdGF0cworICAgIGxpbUdldEJzc2lkRnJvbUJEKHBNYWMsICh0cEhhbEJ1ZkRlc2MpIHBSeFBhY2tldEluZm8sIGJzc0lkUmN2LCAmaWdub3JlKTsKKworICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpICYmCisgICAgICAgIHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLGJzc0lkUmN2LCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAqIEZyYW1lIGZyb20gY3VycmVudCBCU1MuIERlZmVyIHByb2Nlc3Npbmcgb2YKKyAgICAgICAgICAgICAgICAgICAqIERpc2Fzc29jaWF0aW9uL0RlYXV0aGVudGljYXRpb24gZnJvbQorICAgICAgICAgICAgICAgICAgICogU1RBcyB0aGF0IGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZC4KKyAgICAgICAgICAgICAgICAgICAqIENvbGxlY3Qgc3RhdHMgZm9yIG90aGVyIHJlY2VpdmVkIGZyYW1lcy4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoKGZjLnN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0RJU0FTU09DKSB8fAorICAgICAgICAgICAgKGZjLnN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0RFQVVUSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsaW1EZWZlck1zZyhwTWFjLCBsaW1Nc2cpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5hYmxlIHRvIERlZmVyIG1lc3NhZ2UoMHglWCkgbGltU21lU3RhdGUgJWQgKHByZXYgc21lIHN0YXRlICVkKSBzeXNSb2xlICVkIG1sbSBzdGF0ZSAlZCAocHJldiBtbG0gc3RhdGUgJWQpXG4iKSwKKyAgICAgICAgICAgICAgICAgICBsaW1Nc2ctPnR5cGUsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUsICBwTWFjLT5saW0uZ0xpbVByZXZTbWVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUsICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlLCAgcE1hYy0+bGltLmdMaW1QcmV2TWxtU3RhdGUpOykKKyAgICAgICAgICAgICAgICBsaW1Mb2dTZXNzaW9uU3RhdGVzKHBNYWMpOworICAgICAgICAgICAgICAgIGxpbVByaW50TXNnTmFtZShwTWFjLCBMT0dFLCBsaW1Nc2ctPnR5cGUpOworICAgICAgICAgICAgICAgIGxpbVBrdEZyZWUocE1hYywgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCBOVUxMLCBsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBNYWMtPmxpbS5udW1MZWFybklnbm9yZSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBGcmFtZSByZWNlaXZlZCBmcm9tIG90aGVyIEJTUworICAgICAgICBpZiAoZmMudHlwZSA9PSBTSVJfTUFDX0RBVEFfRlJBTUUgJiYgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAqIERhdGEgRnJhbWUgZnJvbSBuZWlnaGJvciBCU1MuCisgICAgICAgICAgICAgICogRXh0cmFjdCBuZWlnaGJvciBCU1MgaW5mbyBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGltQ29sbGVjdE1lYXN1cmVtZW50RGF0YShwTWFjLCBwUnhQYWNrZXRJbmZvLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoZmMudHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpICYmIChmYy5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9CRUFDT04pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGxpbVByb2Nlc3NCZWFjb25GcmFtZU5vU2Vzc2lvbihwTWFjLCBwUnhQYWNrZXRJbmZvKTsKKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgbGltUHJvY2Vzc0JlYWNvbkZyYW1lKHBNYWMsIHBSeFBhY2tldEluZm8scHNlc3Npb25FbnRyeSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGZjLnR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKSAmJiAoZmMuc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfUFJPQkVfUlNQKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBsaW1Qcm9jZXNzUHJvYmVSc3BGcmFtZU5vU2Vzc2lvbihwTWFjLCBwUnhQYWNrZXRJbmZvKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsaW1Qcm9jZXNzUHJvYmVSc3BGcmFtZShwTWFjLCBwUnhQYWNrZXRJbmZvLHBzZXNzaW9uRW50cnkpOworICAgICAgICB9CisgICAgfQorCisjZWxzZQorICAgIC8vIGRlZmVyIGFsbCBtZXNzYWdlIGluIHNjYW4gc3RhdGUgZXhjZXB0IGZvciBCZWFjb25zIGFuZCBQcm9iZSBSZXNwb25zZQorICAgIGlmICgoZmMudHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpICYmIChmYy5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9CRUFDT04pKQorICAgIHsKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgIGxpbVByb2Nlc3NCZWFjb25GcmFtZU5vU2Vzc2lvbihwTWFjLCBwUnhQYWNrZXRJbmZvKTsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIGxpbVByb2Nlc3NCZWFjb25GcmFtZShwTWFjLCBwUnhQYWNrZXRJbmZvLHBzZXNzaW9uRW50cnkpOworICAgIH0KKyAgICBlbHNlIGlmICgoZmMudHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpICYmIChmYy5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApKQorICAgIHsKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgIGxpbVByb2Nlc3NQcm9iZVJzcEZyYW1lTm9TZXNzaW9uKHBNYWMsIHBSeFBhY2tldEluZm8pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaW1Qcm9jZXNzUHJvYmVSc3BGcmFtZShwTWFjLCBwUnhQYWNrZXRJbmZvLHBzZXNzaW9uRW50cnkpOworICAgIH0KKyAgICBlbHNlIGlmICgoZmMudHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpICYmIChmYy5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpKQorICAgIHsKKyAgICAgIGxpbVByb2Nlc3NQcm9iZVJlcUZyYW1lX211bHRpcGxlX0JTUyhwTWFjLCBwUnhQYWNrZXRJbmZvLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQCisgICAgZWxzZSBpZiAoKGZjLnR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKSAmJiAoZmMuc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQUNUSU9OKSkKKyAgICB7CisgICAgICAgbGltUHJvY2Vzc0FjdGlvbkZyYW1lTm9TZXNzaW9uKCBwTWFjLCBwUnhQYWNrZXRJbmZvKTsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgeworICAgICAgICAqZGVmZXJNc2cgPSB0cnVlOworICAgICAgICByZXR1cm47IAorICAgIH0KKyAKKyNlbmRpZgorICAgIGxpbVBrdEZyZWUocE1hYywgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCBwUnhQYWNrZXRJbmZvLCAodm9pZCAqKSBsaW1Nc2ctPmJvZHlwdHIpOworICAgIHJldHVybjsKKworfSAvKioqIGVuZCBsaW1IYW5kbGVGcmFtZXNJblNjYW5TdGF0ZSgpICoqKi8KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBVbmtub3duIFVuaWNhc3QgKEEyIEluZGV4KQorXCAgICAgICAgIHBhY2tldHMuCitccGFyYW0gICAgdHBBbmlTaXJHbG9iYWwgcE1hYyBHbG9iYWwgTWFjIGRhdGEgc3RydWN0dXJlCitccGFyYW0gICAgdm9pZCAqcFJ4UGFja2V0SW5mbyBQb2ludGVyIHRvIEJ1ZmZlciBEZXNjcmlwdG9yCitccmV0dXJuICAgbm9uZQorXAorXCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQgbGltSGFuZGxlVW5rbm93bkEySW5kZXhGcmFtZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqcFJ4UGFja2V0SW5mbyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworI2lmbmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKyAgICB0cFNpck1hY0RhdGFIZHIzYSBwTWFjSGRyOworCisgICAgLyoqIFRoaXMgcHJldmVudHMgZnJvbSBkaXNhc3NvYy9kZWF1dGggYmVpbmcgc2VudCBpbiBhIGJ1cnN0LAorICAgICAgICBhbmQgZ0xpbURpc2Fzc29jRnJhbWVDcmVkaXQgaXMgcmVzZXQgZm9yIGV2ZXJ5IDEwIHNlY29uZHMuKi8KKyAgICBpZiAocE1hYy0+bGltLmdMaW1EaXNhc3NvY0ZyYW1lQ3JlZGl0ID4gcE1hYy0+bGltLmdMaW1EaXNhc3NvY0ZyYW1lVGhyZXNob2xkKQorICAgICAgICByZXR1cm47CisKKyAgICBwTWFjLT5saW0uZ0xpbURpc2Fzc29jRnJhbWVDcmVkaXQrKzsKKworICAgIHBNYWNIZHIgPSBXREFfR0VUX1JYX01QRFVIRUFERVIzQShwUnhQYWNrZXRJbmZvKTsKKworICAgIGlmIChsaW1Jc0dyb3VwQWRkcihwTWFjSGRyLT5hZGRyMikpCisgICAgeworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJJZ25vcmluZyBBMiBJbnZhbGlkIFBhY2tldCByZWNlaXZlZCBmb3IgTUMvQkM6XG4iKSk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwTWFjSGRyLT5hZGRyMiwgTE9HMik7KQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkgKSYmCisgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURSkpCisgICAgeworICAgICAgICBzd2l0Y2ggKHBNYWNIZHItPmZjLnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU0lSX01BQ19NR01UX0ZSQU1FOgorICAgICAgICAgICAgICAgIHN3aXRjaCAocE1hY0hkci0+ZmMuc3ViVHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19NR01UX0FDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgRGlzYXNzb2NpYXRpb24gZnJhbWUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmRlciBpZiByb2xlIGlzIEFQCisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTZW5kIERpc2Fzc29jIEZyYW1lIGR1ZSB0byBJbnZhbGlkIEFkZHIyIHBhY2tldCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwTWFjSGRyLT5hZGRyMiwgTE9HMSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgbGltU2VuZERpc2Fzc29jTWdtdEZyYW1lKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19DTEFTUzNfRlJBTUVfRlJPTV9OT05fQVNTT0NfU1RBX1JFQVNPTiwgcE1hY0hkci0+YWRkcjIscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU0lSX01BQ19DVFJMX0ZSQU1FOgorICAgICAgICAgICAgICAgIHN3aXRjaCAocE1hY0hkci0+ZmMuc3ViVHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19DVFJMX1BTX1BPTEw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19DVFJMX0JBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgRGlzYXNzb2NpYXRpb24gZnJhbWUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmRlciBpZiByb2xlIGlzIEFQCisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTZW5kIERpc2Fzc29jIEZyYW1lIGR1ZSB0byBJbnZhbGlkIEFkZHIyIHBhY2tldCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwTWFjSGRyLT5hZGRyMiwgTE9HMSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgbGltU2VuZERpc2Fzc29jTWdtdEZyYW1lKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19DTEFTUzNfRlJBTUVfRlJPTV9OT05fQVNTT0NfU1RBX1JFQVNPTiwgcE1hY0hkci0+YWRkcjIscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfREFUQV9GUkFNRToKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBNYWNIZHItPmZjLnN1YlR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfREFUQV9OVUxMOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfREFUQV9RT1NfTlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgRGlzYXNzb2NpYXRpb24gZnJhbWUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmRlciBpZiByb2xlIGlzIEFQCisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTZW5kIERpc2Fzc29jIEZyYW1lIGR1ZSB0byBJbnZhbGlkIEFkZHIyIHBhY2tldCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwTWFjSGRyLT5hZGRyMiwgTE9HMSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgbGltU2VuZERpc2Fzc29jTWdtdEZyYW1lKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19DTEFTUzNfRlJBTUVfRlJPTV9OT05fQVNTT0NfU1RBX1JFQVNPTiwgcE1hY0hkci0+YWRkcjIscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBEZWF1dGhlbnRpY2F0aW9uIGZyYW1lIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kZXIgaWYgcm9sZSBpcyBBUAorICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBEZWF1dGggZnJhbWUgZHVlIHRvIEludmFsaWQgQWRkcjIgcGFja2V0IikpOworICAgICAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBNYWNIZHItPmFkZHIyLCBMT0cxKTspCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1TZW5kRGVhdXRoTWdtdEZyYW1lKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19DTEFTUzNfRlJBTUVfRlJPTV9OT05fQVNTT0NfU1RBX1JFQVNPTiwgcE1hY0hkci0+YWRkcjIscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgICAgLyogYWRkcjIgbWlzbWF0Y2ggaW50ZXJydXB0IG9jY3VycmVkIHRoaXMgbWVhbnMgcHJldmlvdXMgCisgICAgICAgZGlzYXNzb2NpYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsCisgICAgICAgSW4gVm9sYW5zIHBSeFBhY2tldEluZm8gb25seSBjb250YWlucyBwb2ludGVyIDQ4LWJpdCBhZGRyZXNzMiBmaWVsZCAqLworICAgICAgIC8qU2VuZCBkaXNhc3NvY2lhdGlvbiBtZXNzYWdlIGFnYWluKi8KKyAgICAgICAvL0RpbmVzaCBuZWVkIG9uZSBtb3JlIGFyZ3VlbWVudC4gCisgICAgICAgLy9saW1TZW5kRGlzYXNzb2NNZ210RnJhbWUocE1hYywgZVNJUl9NQUNfQ0xBU1MzX0ZSQU1FX0ZST01fTk9OX0FTU09DX1NUQV9SRUFTT04sKHRBTklfVTggKikgcFJ4UGFja2V0SW5mbyk7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQCisgICAgLy9UaGlzIGNvdWxkIGJlIGEgcHVibGljIGFjdGlvbiBmcmFtZS4KKyAgICBpZiggcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1AyUF9ERVZJQ0VfUk9MRSApCisgICAgICAgIGxpbVByb2Nlc3NBY3Rpb25GcmFtZU5vU2Vzc2lvbihwTWFjLCAodEFOSV9VOCAqKSBwUnhQYWNrZXRJbmZvKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisvKioKKyAqIGxpbUNoZWNrTWdtdFJlZ2lzdGVyZWRGcmFtZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIHRvIGNoZWNrIGlmIHJlY2VpdmVkIGZyYW1lIG1hdGNoIHdpdGggCisgKiBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgZnJhbWUgZnJvbSBIREQuIElmIHllcyBwYXNzIHRoaXMgZnJhbWUgdG8gU01FLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcEJkICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBCdWZmZXIgRGVzY3JpcHRvcitwYXlsb2FkCisgKiBAcGFyYW0gICpwc2Vzc2lvbkVudHJ5IFBvaW50ZXIgdG8gc2Vzc2lvbiBvbiB3aGljaCBwYWNrZXQgaXMgcmVjZWl2ZWQKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdEFOSV9CT09MRUFOCitsaW1DaGVja01nbXRSZWdpc3RlcmVkRnJhbWVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBCZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJNYWNGcmFtZUN0bCAgZmM7CisgICAgdHBTaXJNYWNNZ210SGRyICBwSGRyOworICAgIHRBTklfVTggICAgICAgICAgKnBCb2R5OworICAgIHRwTGltTWdtdEZyYW1lUmVnaXN0cmF0aW9uIHBMaW1NZ210UmVnaXN0cmF0aW9uID0gTlVMTCwgcE5leHQgPSBOVUxMOworICAgIHRBTklfVTE2IGZyYW1lVHlwZTsKKyAgICB0QU5JX1UxNiBmcmFtZWxlbjsKKyAgICB0QU5JX1U4IHR5cGUsc3ViVHlwZTsKKyAgICB0QU5JX0JPT0xFQU4gbWF0Y2ggPSBWT1NfRkFMU0U7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisKKyAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBCZCk7CisgICAgZmMgPSBwSGRyLT5mYzsKKyAgICBmcmFtZVR5cGUgPSAoZmMudHlwZSA8PCAyICkgfCAoZmMuc3ViVHlwZSA8PCA0KTsKKyAgICBwQm9keSA9IFdEQV9HRVRfUlhfTVBEVV9EQVRBKHBCZCk7CisgICAgZnJhbWVsZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBCZCk7CisKKyAgICB2b3NfbGlzdF9wZWVrX2Zyb250KCZwTWFjLT5saW0uZ0xpbU1nbXRGcmFtZVJlZ2lzdHJhdGluUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9zX2xpc3Rfbm9kZV90KiopJnBMaW1NZ210UmVnaXN0cmF0aW9uKTsKKworICAgIHdoaWxlKHBMaW1NZ210UmVnaXN0cmF0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgICB0eXBlID0gKHBMaW1NZ210UmVnaXN0cmF0aW9uLT5mcmFtZVR5cGUgPj4gMikgJiAweDAzOworICAgICAgICBzdWJUeXBlID0gKHBMaW1NZ210UmVnaXN0cmF0aW9uLT5mcmFtZVR5cGUgPj4gNCkgJiAweDBmOworICAgICAgICBpZiAoICh0eXBlID09IFNJUl9NQUNfTUdNVF9GUkFNRSkgJiYgKGZjLnR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKQorICAgICAgICAgICAgICAmJiAoc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfUkVTRVJWRUQxNSkgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPRzMsIAorICAgICAgICAgICAgICAgIEZMKCJyY3ZkIGZyYW1lIG1hdGNoIHdpdGggU0lSX01BQ19NR01UX1JFU0VSVkVEMTVcbiIpKTsKKyAgICAgICAgICAgIG1hdGNoID0gVk9TX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwTGltTWdtdFJlZ2lzdHJhdGlvbi0+ZnJhbWVUeXBlID09IGZyYW1lVHlwZSkKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGlmIChwTGltTWdtdFJlZ2lzdHJhdGlvbi0+bWF0Y2hMZW4gPiAwKQorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIGlmIChwTGltTWdtdFJlZ2lzdHJhdGlvbi0+bWF0Y2hMZW4gPD0gZnJhbWVsZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkocE1hYywgcExpbU1nbXRSZWdpc3RyYXRpb24tPm1hdGNoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCb2R5LCBwTGltTWdtdFJlZ2lzdHJhdGlvbi0+bWF0Y2hMZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIG1hdGNoISAqLyAgIAorICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IFZPU19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZm91bmQgbWF0Y2ghICovICAgCisgICAgICAgICAgICAgICAgbWF0Y2ggPSBWT1NfVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgIAorICAgICAgICB2b3NTdGF0dXMgPSAKKyAgICAgICAgICB2b3NfbGlzdF9wZWVrX25leHQgKCAmcE1hYy0+bGltLmdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b3NfbGlzdF9ub2RlX3QqKSBwTGltTWdtdFJlZ2lzdHJhdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9zX2xpc3Rfbm9kZV90KiopICZwTmV4dCApOworICAgICAgICBwTGltTWdtdFJlZ2lzdHJhdGlvbiA9IHBOZXh0OworICAgICAgICBwTmV4dCA9IE5VTEw7CisgICAgfQorICAgCisgICAgaWYgKG1hdGNoKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0cxLCAKKyAgICAgICAgICAgICAgICBGTCgicmN2ZCBmcmFtZSBtYXRjaCB3aXRoIHJlZ2lzdGVyZWQgZnJhbWUgcGFyYW1zXG4iKSk7CisKKyAgICAgICAgLyogSW5kaWNhdGUgdGhpcyB0byBTTUUgKi8KKyAgICAgICAgbGltU2VuZFNtZU1nbXRGcmFtZUluZCggcE1hYywgcEhkci0+ZmMuc3ViVHlwZSwgKHRBTklfVTgqKXBIZHIsIAorICAgICAgICAgICAgICAgICAgICAgV0RBX0dFVF9SWF9QQVlMT0FEX0xFTihwQmQpICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwgCisgICAgICAgICAgICAgICAgICAgICBwTGltTWdtdFJlZ2lzdHJhdGlvbi0+c2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgV0RBX0dFVF9SWF9DSChwQmQpICk7CisgICAgCisgICAgICAgIGlmICggKHR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKSAmJiAoZmMudHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpCisgICAgICAgICAgICAgICYmIChzdWJUeXBlID09IFNJUl9NQUNfTUdNVF9SRVNFUlZFRDE1KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZXNlIHBhY2tldHMgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkIGJ5IFBFL1NNRSBhcyB3ZWxsIGFzIEhERC4KKyAgICAgICAgICAgIC8vIElmIGl0IHJldHVybnMgVFJVRSBoZXJlLCB0aGUgcGFja2V0IGlzIGZvcndhcmRlZCB0byBIREQgb25seS4KKyAgICAgICAgICAgIG1hdGNoID0gVk9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNoOworfSAvKioqIGVuZCAgbGltQ2hlY2tNZ210UmVnaXN0ZXJlZEZyYW1lcygpICoqKi8KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUDJQICovCisKKworLyoqCisgKiBsaW1IYW5kbGU4MDIxMUZyYW1lcygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgODAyLjExIGZyYW1lcworICogcmVjZWl2ZWQgYnkgTElNLgorICoKKyAqTE9HSUM6CisgKiBOQQorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwTXNnIG9mIHR5cGUgdFNpck1zZ1EgLSBQb2ludGVyIHRvIHRoZSBtZXNzYWdlIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQgCitsaW1IYW5kbGU4MDIxMUZyYW1lcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnLCB0QU5JX1U4ICpwRGVmZXJNc2cpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAqcFJ4UGFja2V0SW5mbyA9IE5VTEw7CisgICAgdFNpck1hY0ZyYW1lQ3RsICBmYzsKKyAgICB0cFNpck1hY01nbXRIZHIgICAgcEhkcj1OVUxMOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgcHNlc3Npb25FbnRyeT1OVUxMOworICAgIHRBTklfVTggICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRBbmlCb29sICAgICAgICAgICAgaXNGcm1GdCA9IEZBTFNFOworICAgIHRBTklfVTE2ICAgICAgICAgICAgZmNPZmZzZXQgPSBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFOworCisgICAgKnBEZWZlck1zZz0gZmFsc2U7CisgICAgbGltR2V0QkRmcm9tUnhQYWNrZXQocE1hYywgbGltTXNnLT5ib2R5cHRyLCAodEFOSV9VMzIgKiopJnBSeFBhY2tldEluZm8pOworCisgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKyAgICBpc0ZybUZ0ID0gV0RBX0dFVF9SWF9GVF9ET05FKHBSeFBhY2tldEluZm8pOworICAgIGZjT2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX09GRlNFVChwUnhQYWNrZXRJbmZvKTsKKyAgICBmYyA9IHBIZHItPmZjOworCisgICAgbGltTG9nKCBwTWFjLCBMT0cxLCBGTCgiUHJvdFZlcnNpb24gJWQsIFR5cGUgJWQsIFN1YnR5cGUgJWQgcmF0ZUluZGV4PSVkXG4iKSwKKyAgICAgICAgICAgIGZjLnByb3RWZXIsIGZjLnR5cGUsIGZjLnN1YlR5cGUsIFdEQV9HRVRfUlhfTUFDX1JBVEVfSURYKHBSeFBhY2tldEluZm8pKTsKKyAgIAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIGlmIChmYy50eXBlID09IFNJUl9NQUNfREFUQV9GUkFNRSAmJiBpc0ZybUZ0KSAKKyAgICB7CisjaWYgMCAvLyBDQ1ggVEJEIE5lZWQgdG8gUE9SVAorICAgICAgICB0cFNpck1hY0RvdDNIZHIgcERhdGFGcm1IZHI7CisKKyAgICAgICAgcERhdGFGcm1IZHIgPSAodHBTaXJNYWNEb3QzSGRyKSgodEFOSV9VOCAqKXBCRCsgV0xBTkhBTF9SWF9CRF9HRVRfTVBEVV9IX09GRlNFVChwQkQpKTsKKyAgICAgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLHBEYXRhRnJtSGRyLT5zYSwmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJTZXNzaW9uIG5vdCBmb3VuZCBmb3IgRnJtIHR5cGUgJWQsIHN1YnR5cGUgJWQsIFNBOiAiKSwgZmMudHlwZSwgZmMuc3ViVHlwZSk7CisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcERhdGFGcm1IZHItPnNhLCBMT0dFKTsKKyAgICAgICAgICAgIGxpbVBrdEZyZWUocE1hYywgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCBwQkQsIGxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBzZXNzaW9uRW50cnktPmlzQ0NYY29ubmVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiTElNIHJlY2VpdmVkIFR5cGUgJWQsIFN1YnR5cGUgJWQgaW4gTm9uIENDWCBjb25uZWN0aW9uXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgZmMudHlwZSwgZmMuc3ViVHlwZSk7CisgICAgICAgICAgICBsaW1Qa3RGcmVlKHBNYWMsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgcEJELCBsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIlByb2Nlc3NpbmcgSUFQUCBGcm0gZnJvbSBTQToiKSk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwRGF0YUZybUhkci0+c2EsIExPR0UpOworI2Vsc2UKKyAgICAgICAgcHJpbnRrKCIlczogTmVlZCB0byBwb3J0IGhhbmRsaW5nIG9mIElBUFAgZnJhbWVzIHRvIFBSSU1BIGZvciBDQ1hcbiIsIF9fZnVuY19fKTsKKyNlbmRpZgorCisKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIC8qIEFkZGVkIEZvciBCVC1BTVAgU3VwcG9ydCAqLworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYyxwSGRyLT5ic3NJZCwmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICBpZiAoZmMuc3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfQVVUSCkgCisgICAgICAgIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiUHJvdFZlcnNpb24gJWQsIFR5cGUgJWQsIFN1YnR5cGUgJWQgcmF0ZUluZGV4PSVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgZmMucHJvdFZlciwgZmMudHlwZSwgZmMuc3ViVHlwZSwgV0RBX0dFVF9SWF9NQUNfUkFURV9JRFgocFJ4UGFja2V0SW5mbykpOworICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPmJzc0lkLCBMT0dFKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGxpbVByb2Nlc3NBdXRoRnJhbWVOb1Nlc3Npb24ocE1hYywgcFJ4UGFja2V0SW5mbywgbGltTXNnLT5ib2R5cHRyKSA9PSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltUGt0RnJlZShwTWFjLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsIHBSeFBhY2tldEluZm8sIGxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYoKGZjLnN1YlR5cGUgIT0gU0lSX01BQ19NR01UX1BST0JFX1JTUCApJiYKKyAgICAgICAgICAgIChmYy5zdWJUeXBlICE9IFNJUl9NQUNfTUdNVF9CRUFDT04pJiYKKyAgICAgICAgICAgIChmYy5zdWJUeXBlICE9IFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgICAgICAmJiAoZmMuc3ViVHlwZSAhPSBTSVJfTUFDX01HTVRfQUNUSU9OICkgLy9QdWJsaWMgYWN0aW9uIGZyYW1lIGNhbiBiZSByZWNlaXZlZCBmcm9tIG5vbi1hc3NvY2lhdGVkIHN0YXRpb25zLgorI2VuZGlmCisgICAgICAgICAgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5UGVlclN0YShwTWFjLHBIZHItPnNhLCZzZXNzaW9uSWQpKT09IE5VTEwpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZFxuIikpOworICAgICAgICAgICAgICAgbGltUGt0RnJlZShwTWFjLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsIHBSeFBhY2tldEluZm8sIGxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgfQorCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQIAorICAgIC8qIENoZWNrIGlmIGZyYW1lIGlzIHJlZ2lzdGVyZWQgYnkgSEREICovCisgICAgaWYobGltQ2hlY2tNZ210UmVnaXN0ZXJlZEZyYW1lcyhwTWFjLCBwUnhQYWNrZXRJbmZvLCBwc2Vzc2lvbkVudHJ5KSkKKyAgICB7ICAgICAgICAKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0cxLCBGTCgiUmVjZWl2ZWQgZnJhbWUgaXMgcGFzc2VkIHRvIFNNRVxuIikpOworICAgICAgICBsaW1Qa3RGcmVlKHBNYWMsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgcFJ4UGFja2V0SW5mbywgbGltTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAKKworCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpICYmIChMSU1fSVNfUkFEQVJfREVURUNURUQocE1hYykpKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiRHJvcGluZyB0aGUgcmVjZWl2ZWQgcGFja2V0cyBhcyByYWRhciBpcyBkZXRlY3RlZFxuIikpOykKKyAgICAgICAgbGltUGt0RnJlZShwTWFjLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsIHBSeFBhY2tldEluZm8sICh2b2lkICopIGxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChmYy5wcm90VmVyICE9IFNJUl9NQUNfUFJPVE9DT0xfVkVSU0lPTikKKyAgICB7ICAgLy8gUmVjZWl2ZWQgRnJhbWUgd2l0aCBub24temVybyBQcm90b2NvbCBWZXJzaW9uCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5leHBlY3RlZCBmcmFtZSB3aXRoIHByb3RWZXJzaW9uICVkIHJlY2VpdmVkXG4iKSwKKyAgICAgICAgICAgZmMucHJvdFZlcik7CisgICAgICAgIGxpbVBrdEZyZWUocE1hYywgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCBwUnhQYWNrZXRJbmZvLCAodm9pZCAqKSBsaW1Nc2ctPmJvZHlwdHIpOworI2lmZGVmIFdMQU5fREVCVUcgICAgICAgICAgICAKKyAgICAgICAgcE1hYy0+bGltLm51bVByb3RFcnIrKzsKKyNlbmRpZgorICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICBpZiAobGltSXNTeXN0ZW1JblNjYW5TdGF0ZShwTWFjKSkKKyAgICB7CisgICAgICAgIGxpbUhhbmRsZUZyYW1lc0luU2NhblN0YXRlKHBNYWMsIGxpbU1zZywgcFJ4UGFja2V0SW5mbywgcERlZmVyTXNnLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworLyogQ2hhbmNlIG9mIGNyYXNoaW5nIDogdG8gYmUgZG9uZSBCVC1BTVAgLi4uLi4uLi5oYXBwZW5zIHdoZW4gYnJvYWRjYXN0IHByb2JlIHJlcSBpcyByZWNlaXZlZCAqLworCisjaWYgMAorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fVU5LTk9XTl9ST0xFKSB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoICJnTGltU3lzdGVtUm9sZSBpcyAlZC4gRXhpdGluZy4uLlxuIiApLHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgKTsKKyAgICAgICAgbGltUGt0RnJlZShwTWFjLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsIHBSeFBhY2tldEluZm8sICh2b2lkICopIGxpbU1zZy0+Ym9keXB0cik7CisKKyNpZmRlZiBXTEFOX0RFQlVHICAgICAgICAKKyAgICAgICAgcE1hYy0+bGltLm51bVByb3RFcnIrKzsKKyNlbmRpZgorICAgICAgICByZXR1cm47CisgICAgfQorICNlbmRpZiAgICAgLy9IQUNLIHRvIGNvbnRpbnVlIHNjYW5uaW5nICAgIAorCisKKyNpZmRlZiBXTEFOX0RFQlVHICAgIAorICAgIHBNYWMtPmxpbS5udW1NQUNbZmMudHlwZV1bZmMuc3ViVHlwZV0rKzsKKyNlbmRpZgorICAgIAorICAgIHN3aXRjaCAoZmMudHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgU0lSX01BQ19NR01UX0ZSQU1FOgorICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmIDAgICAvL1RCRC1SQUpFU0ggZml4IHRoaXMKKyAgICAgICAgICAgICAgICBpZiAobGltSXNSZWFzc29jSW5Qcm9ncmVzcyggcE1hYyxwc2Vzc2lvbkVudHJ5KSAmJiAoZmMuc3ViVHlwZSAhPSBTSVJfTUFDX01HTVRfRElTQVNTT0MpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmMuc3ViVHlwZSAhPSBTSVJfTUFDX01HTVRfREVBVVRIKSAmJiAoZmMuc3ViVHlwZSAhPSBTSVJfTUFDX01HTVRfUkVBU1NPQ19SU1ApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJGcmFtZSB3aXRoIFR5cGUgLSAlZCwgU3VidHlwZSAtICVkIHJlY2VpdmVkIGluIFJlQXNzb2MgV2FpdCBzdGF0ZSwgZHJvcHBpbmcuLi5cbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjLnR5cGUsIGZjLnN1YlR5cGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmICAgLy9IQUNLIHRvIGNvbnRpbnVlIHNjYW5uaW5nIAorICAgICAgICAgICAgLy8gUmVjZWl2ZWQgTWFuYWdlbWVudCBmcmFtZQorICAgICAgICAgICAgc3dpdGNoIChmYy5zdWJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19NR01UX0FTU09DX1JFUToKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByb2xlIHN1cHBvcnRzIEFzc29jaWF0aW9uCisgICAgICAgICAgICAgICAgICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByb2Nlc3NBc3NvY1JlcUZyYW1lKHBNYWMsIHBSeFBhY2tldEluZm8sIExJTV9BU1NPQywgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbndhbnRlZCBtZXNzYWdlcyAtIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWQgJVhcbiIpLGxpbU1zZy0+dHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1zZ05hbWUocE1hYywgTE9HRSwgbGltTXNnLT50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19NR01UX0FTU09DX1JTUDoKKyAgICAgICAgICAgICAgICAgICAgbGltUHJvY2Vzc0Fzc29jUnNwRnJhbWUocE1hYywgcFJ4UGFja2V0SW5mbywgTElNX0FTU09DLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19NR01UX1JFQVNTT0NfUkVROgorICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJvbGUgc3VwcG9ydHMgUmVhc3NvY2lhdGlvbgorICAgICAgICAgICAgICAgICAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgICAgICAgfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorI2VuZGlmICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICApeworICAgICAgICAgICAgICAgICAgICAgICAgbGltUHJvY2Vzc0Fzc29jUmVxRnJhbWUocE1hYywgcFJ4UGFja2V0SW5mbywgTElNX1JFQVNTT0MsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW53YW50ZWQgbWVzc2FnZXMgLSBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgidW5leHBlY3RlZCBtZXNzYWdlIHJlY2VpdmVkICVYXG4iKSxsaW1Nc2ctPnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNc2dOYW1lKHBNYWMsIExPR0UsIGxpbU1zZy0+dHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9SRUFTU09DX1JTUDoKKyAgICAgICAgICAgICAgICAgICAgbGltUHJvY2Vzc0Fzc29jUnNwRnJhbWUocE1hYywgcFJ4UGFja2V0SW5mbywgTElNX1JFQVNTT0MscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTSVJfTUFDX01HTVRfUFJPQkVfUkVROgorICAgICAgICAgICAgICAgICAgICBsaW1Qcm9jZXNzUHJvYmVSZXFGcmFtZV9tdWx0aXBsZV9CU1MocE1hYywgcFJ4UGFja2V0SW5mbyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9QUk9CRV9SU1A6CisgICAgICAgICAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByb2Nlc3NQcm9iZVJzcEZyYW1lTm9TZXNzaW9uKHBNYWMsIHBSeFBhY2tldEluZm8pOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1Qcm9jZXNzUHJvYmVSc3BGcmFtZShwTWFjLCBwUnhQYWNrZXRJbmZvLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9CRUFDT046CisgICAgICAgICAgICAgICAgICAgIF9fbGltSGFuZGxlQmVhY29uKHBNYWMsIGxpbU1zZyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9ESVNBU1NPQzoKKyAgICAgICAgICAgICAgICAgICAgbGltUHJvY2Vzc0Rpc2Fzc29jRnJhbWUocE1hYywgcFJ4UGFja2V0SW5mbyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9BVVRIOgorICAgICAgICAgICAgICAgICAgICBsaW1Qcm9jZXNzQXV0aEZyYW1lKHBNYWMsIHBSeFBhY2tldEluZm8scHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTSVJfTUFDX01HTVRfREVBVVRIOgorICAgICAgICAgICAgICAgICAgICBsaW1Qcm9jZXNzRGVhdXRoRnJhbWUocE1hYywgcFJ4UGFja2V0SW5mbyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9BQ1RJT046CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgIGxpbVByb2Nlc3NBY3Rpb25GcmFtZU5vU2Vzc2lvbihwTWFjLCBwUnhQYWNrZXRJbmZvKTsKKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgaWYgKFdEQV9HRVRfUlhfVU5LTk9XTl9VQ0FTVChwUnhQYWNrZXRJbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW1IYW5kbGVVbmtub3duQTJJbmRleEZyYW1lcyhwTWFjLCBwUnhQYWNrZXRJbmZvLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByb2Nlc3NBY3Rpb25GcmFtZShwTWFjLCBwUnhQYWNrZXRJbmZvLHBzZXNzaW9uRW50cnkpOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIFJlY2VpdmVkIE1hbmFnZW1lbnQgZnJhbWUgb2YgJ3Jlc2VydmVkJyBzdWJ0eXBlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAvLyBzd2l0Y2ggKGZjLnN1YlR5cGUpCisKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgIGNhc2UgU0lSX01BQ19EQVRBX0ZSQU1FOgorICAgICAgICB7CisgICAgICAgICAgICAgLyogV2UgYWNjZXB0IGRhdGEgZnJhbWUgKElBUFAgZnJhbWUpIG9ubHkgaWYgU2Vzc2lvbiBpcworICAgICAgICAgICAgICAqIHByZXNlbnQgYW5kIGNjeCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIG9uIHRoYXQKKyAgICAgICAgICAgICAgKiBzZXNzaW9uCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnkgJiYgcHNlc3Npb25FbnRyeS0+aXNDQ1hjb25uZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgIGxpbVByb2Nlc3NJYXBwRnJhbWUocE1hYywgcFJ4UGFja2V0SW5mbywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBSZWNlaXZlZCBmcmFtZSBvZiB0eXBlICdyZXNlcnZlZCcKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfSAvLyBzd2l0Y2ggKGZjLnR5cGUpCisKKyAgICBsaW1Qa3RGcmVlKHBNYWMsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgcFJ4UGFja2V0SW5mbywgKHZvaWQgKikgbGltTXNnLT5ib2R5cHRyKSA7CisgICAgcmV0dXJuOworfSAvKioqIGVuZCBsaW1IYW5kbGU4MDIxMUZyYW1lcygpICoqKi8KKworCisvKioKKyAqIGxpbVByb2Nlc3NBYm9ydFNjYW5JbmQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIEhERCB0byBhYm9ydCB0aGUgc2NhbiB3aGljaCBpcyBwcmVzZW50bHkgYmVpbmcgcnVuCisgKgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVByb2Nlc3NBYm9ydFNjYW5JbmQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19TQ0FOX0FCT1JUX0lORF9FVkVOVCwgTlVMTCwgMCwgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgCisgICAgLyogRGVhY3RpdmF0ZSB0aGUgZ0xpbUJhY2tncm91bmRTY2FuVGltZXIgYXMgcGFydCBvZiB0aGUgYWJvcnQgc2Nhbi4KKyAgICAgKiBTTUUgc2hvdWxkIHNlbmQgV05JX0NGR19CQUNLR1JPVU5EX1NDQU5fUEVSSU9EIGluZGljYXRpb24gCisgICAgICogdG8gc3RhcnQgdGhlIGJhY2tncm91bmQgc2NhbiBhZ2FpbgorICAgICAqLworICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlByb2Nlc3NpbmcgQWJvcnRTY2FuIEluZFxuIikpOykKKworICAgIGxpbUFib3J0QmFja2dyb3VuZFNjYW4ocE1hYyk7CisKKyAgICAvKiBBYm9ydCB0aGUgc2NhbiBpZiBpdHMgcnVubmluZywgZWxzZSBqdXN0IHJldHVybiAqLworICAgIGlmKGxpbUlzU3lzdGVtSW5TY2FuU3RhdGUocE1hYykpCisgICAgeworICAgICAgICBpZiggKGVMSU1fSEFMX0lOSVRfU0NBTl9XQUlUX1NUQVRFID09IHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlICkgfHwKKyAgICAgICAgICAgIChlTElNX0hBTF9TVEFSVF9TQ0FOX1dBSVRfU1RBVEUgPT0gcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgKSB8fAorICAgICAgICAgICAgKGVMSU1fSEFMX0VORF9TQ0FOX1dBSVRfU1RBVEUgPT0gcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgKSB8fAorICAgICAgICAgICAgKGVMSU1fSEFMX0ZJTklTSF9TQ0FOX1dBSVRfU1RBVEUgPT0gcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TaW1wbHkgc2lnbmFsIHdlIG5lZWQgdG8gYWJvcnQKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIiB3YWl0aW5nIGZvciBIQUwsIHNpbXBseSBzaWduYWwgYWJvcnQgZ0xpbUhhbFNjYW5TdGF0ZSA9ICVkXG4iKSwgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgKTsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5hYm9ydFNjYW4gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9Gb3JjZSBhYm9ydAorICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiIEZvcmNlIGFib3J0aW5nIHNjYW5cbiIpICk7CisgICAgICAgICAgICBwTWFjLT5saW0uYWJvcnRTY2FuID0gMDsKKyAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01JTl9DSEFOTkVMX1RJTUVSKTsKKyAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01BWF9DSEFOTkVMX1RJTUVSKTsKKyAgICAgICAgICAgIC8vU2V0IHRoZSByZXN1bWUgY2hhbm5lbCB0byBBbnkgdmFsaWQgY2hhbm5lbCAoaW52YWxpZCkuIAorICAgICAgICAgICAgLy9UaGlzIHdpbGwgaW5zdHJ1Y3QgSEFMIHRvIHNldCBpdCB0byBhbnkgcHJldmlvdXMgdmFsaWQgY2hhbm5lbC4KKyAgICAgICAgICAgIHBlU2V0UmVzdW1lQ2hhbm5lbChwTWFjLCAwLCAwKTsKKyAgICAgICAgICAgIGxpbVNlbmRIYWxGaW5pc2hTY2FuUmVxKHBNYWMsIGVMSU1fSEFMX0ZJTklTSF9TQ0FOX1dBSVRfU1RBVEUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoqCisgKiBsaW1NZXNzYWdlUHJvY2Vzc29yCisgKgorICpGVU5DVElPTjoKKyAqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIGxpbVByb2Nlc3NNZXNzYWdlcyB3aGVuIGhhbmRsaW5nIG1lc3NhZ2VzIHJlY2VpdmVkIGJ5IExJTS4KKyAqIENvdWxkIGVpdGhlciBkZWZlciBtZXNzYWdlcyBvciBwcm9jZXNzIHRoZW0uCisgKiBAcGFyYW0gIHBNYWMgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGxpbU1zZyBSZWNlaXZlZCBMSU0gbWVzc2FnZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1NZXNzYWdlUHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpCit7CisgICAgaWYgKGVMSU1fTUxNX09GRkxJTkVfU1RBVEUgPT0gcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkKKyAgICB7CisgICAgICAgIHBlRnJlZU1zZyhwTWFjLCBsaW1Nc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFkZWZNc2dEZWNpc2lvbihwTWFjLCBsaW1Nc2cpKQorICAgIHsKKyAgICAgICAgbGltUHJvY2Vzc01lc3NhZ2VzKHBNYWMsIGxpbU1zZyk7CisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQKKyAgICAgICAgLy8gcHJvY2VzcyBkZWZlcnJlZCBtZXNzYWdlIHF1ZXVlIGlmIGFsbG93ZWQKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoISAocE1hYy0+bGltLmdMaW1BZGR0c1NlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgICghIChsaW1Jc1N5c3RlbUluU2NhblN0YXRlKHBNYWMpKSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRydWUgPT0gR0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYykpCisgICAgICAgICAgICAgICAgICBsaW1Qcm9jZXNzRGVmZXJyZWRNZXNzYWdlUXVldWUocE1hYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHsKKyAgICAgICAgLy8gcHJvY2VzcyBkZWZlcnJlZCBtZXNzYWdlIHF1ZXVlIGlmIGFsbG93ZWQKKyAgICAgICAgICAgIGlmICghIChwTWFjLT5saW0uZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSkpCisgICAgICAgICAgICB7CisjaWYgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICAgICAgICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSAmJiAocE1hYy0+bGltLmdMaW1BZGR0c1NlbnQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGlmICh0cnVlID09IEdFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMpKQorICAgICAgICAgICAgICAgICAgICAgICAgbGltUHJvY2Vzc0RlZmVycmVkTWVzc2FnZVF1ZXVlKHBNYWMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CisKKworCisvKioKKyAqIGxpbVByb2Nlc3NNZXNzYWdlcworICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlIGZ1bmN0aW9uLiBUaGlzCisgKiBmdW5jdGlvbiBwcm9jZXNzZXMgbWVzc2FnZXMgcmVjZWl2ZWQgYnkgTElNLgorICoKKyAqTE9HSUM6CisgKiBEZXBlbmRpbmcgb24gdGhlIG1lc3NhZ2UgdHlwZSwgY29ycmVzcG9uZGluZyBmdW5jdGlvbiB3aWxsIGJlCisgKiBjYWxsZWQsIGZvciBleGFtcGxlIGxpbVByb2Nlc3NTbWVNZXNzYWdlcygpIHdpbGwgYmUgY2FsbGVkIHRvCisgKiBwcm9jZXNzIFNNRSBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIEhERC9VcHBlciBsYXllciBzb2Z0d2FyZSBtb2R1bGUuCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGxpbU1zZyBSZWNlaXZlZCBMSU0gbWVzc2FnZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUHJvY2Vzc01lc3NhZ2VzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSAgbGltTXNnKQoreworICAgIHRBTklfVTggIGRlZmVyTXNnID0gZmFsc2U7CisgICAgdExpbmtTdGF0ZVBhcmFtcyAqbGlua1N0YXRlUGFyYW1zOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICB0cFBFU2Vzc2lvbiBwU2Vzc2lvbjsKKyNlbmRpZgorI2lmIGRlZmluZWQoQU5JX0RWVF9ERUJVRykKKyAgICB0U2lyTXNnUSAgbXNnUTsKKyNlbmRpZgorICAgIGlmKHBNYWMtPmdEcml2ZXJUeXBlID09IGVEUklWRVJfVFlQRV9NRkcpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorI2lmZGVmIFdMQU5fREVCVUcgICAgCisgICAgcE1hYy0+bGltLm51bVRvdCsrOworI2VuZGlmCisKKworICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgicmN2ZCBtc2dUeXBlID0gJXMsIHNtZSBzdGF0ZSA9ICVzLCBtbG0gc3RhdGUgPSAlc1xuIiksCisgICAgICBsaW1Nc2dTdHIobGltTXNnLT50eXBlKSwgbGltU21lU3RhdGVTdHIocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSksCisgICAgICBsaW1NbG1TdGF0ZVN0cihwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7KQorCisgICAgTVRSQUNFKG1hY1RyYWNlTXNnUngocE1hYywgMCwgTElNX1RSQUNFX01BS0VfUlhNU0cobGltTXNnLT50eXBlLCBMSU1fTVNHX1BST0NFU1NFRCkpOykKKworICAgIHN3aXRjaCAobGltTXNnLT50eXBlKQorICAgIHsKKyNpZiBkZWZpbmVkKEFOSV9EVlRfREVCVUcpCisgICAgICAgIGNhc2UgU0lSX0xJTV9TVVNQRU5EX0FDVElWSVRZX1JFUToKKyAgICAgICAgICAgIC8vIFRoaXMgbWVzc2FnZSBpcyBmcm9tIEhBTCBub3RpZnlpbmcgTElNCisgICAgICAgICAgICAvLyB0byBzdXNwZW5kIGFjdGl2aXR5LiAoUFRUIG5lZWRzKQorICAgICAgICAgICAgLy8gRGlzYWJsZSBURlAgJiBSSFAKKyAgICAgICAgICAgIC8vaGFsU2V0U3RhVHhFbmFibGUocE1hYywgMSwgZUhBTF9DTEVBUik7CisgICAgICAgICAgICAvL2hhbFN0b3BEYXRhVHJhZmZpYyhwTWFjKTsKKyAgICAgICAgICAgIC8vaGFsU2V0UnhFbmFibGUocE1hYywgZUhBTF9DTEVBUik7CisKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltUHJldlNtZVN0YXRlID0gcE1hYy0+bGltLmdMaW1TbWVTdGF0ZTsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU21lU3RhdGUgICAgID0gZUxJTV9TTUVfU1VTUEVORF9TVEFURTsKKyAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworCisgICAgICAgICAgICAvLyBQb3N0IG1lc3NhZ2UgYmFjayB0byBIQUwKKyAgICAgICAgICAgIG1zZ1EudHlwZSA9IFdEQV9TVVNQRU5EX0FDVElWSVRZX1JTUDsKKyAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworICAgICAgICAgICAgd2RhUG9zdEN0cmxNc2cocE1hYywgJm1zZ1EpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICBjYXNlIFNJUl9MSU1fVVBEQVRFX0JFQUNPTjoKKyAgICAgICAgICAgIGxpbVVwZGF0ZUJlYWNvbihwTWFjKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lSX0xJTV9SRVNVTUVfQUNUSVZJVFlfTlRGOgorICAgICAgICAgICAgLy8gVGhpcyBtZXNzYWdlIGlzIGZyb20gSEFMIG5vdGlmeWluZyBMSU0KKyAgICAgICAgICAgIC8vIHRvIHJlc3VtZSBhY3Rpdml0eS4KKyAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX1NVU1BFTkRfU1RBVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoIlJlY2VpdmVkIFJFU1VNRV9OVEYgaW4gU3RhdGUgJXMgb24gUm9sZSAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgbGltU21lU3RhdGVTdHIocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSksIHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSk7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9IHBNYWMtPmxpbS5nTGltUHJldlNtZVN0YXRlOworICAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworCisgICAgICAgICAgICAgICAgIGhhbmRsZUNCQ0ZHQ2hhbmdlKCBwTWFjLCBBTklfSUdOT1JFX0NGR19JRCApOworICAgICAgICAgICAgICAgICBoYW5kbGVIVENhcGFiaWxpdHlhbmRIVEluZm8ocE1hYyk7CisgICAgICAgICAgICAgICAgIC8vaW5pdGlhbGl6ZSB0aGUgVFNQRUMgYWRtaXNzaW9uIGNvbnRyb2wgdGFibGUuCisgICAgICAgICAgICAgICAgIGxpbUFkbWl0Q29udHJvbEluaXQocE1hYyk7CisgICAgICAgICAgICAgICAgIGxpbVJlZ2lzdGVySGFsSW5kQ2FsbEJhY2socE1hYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoIlJlY2VpdmVkIFJFU1VNRV9OVEYgaW4gaW52YWwgU3RhdGUgJVggb24gUm9sZSAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSwgcE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlKTsKKyAgICAgICAgICAgICAgICBsaW1QcmludFNtZVN0YXRlKHBNYWMsIExPR0UsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9DRkdfUEFSQU1fVVBEQVRFX0lORDoKKyAgICAgICAgICAgIC8vLyBDRkcgcGFyYW1ldGVyIHVwZGF0ZWQKKyAgICAgICAgICAgIGlmIChsaW1Jc1N5c3RlbUluU2NhblN0YXRlKHBNYWMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFN5c3RlbSBpcyBpbiBERlMgKExlYXJuKSBtb2RlCisgICAgICAgICAgICAgICAgLy8gRGVmZXIgcHJvY2Vzc3NpbmcgdGhpcyBtZXNzYWdlCisgICAgICAgICAgICAgICAgaWYgKGxpbURlZmVyTXNnKHBNYWMsIGxpbU1zZykgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlVuYWJsZSB0byBEZWZlciBtZXNzYWdlKDB4JVgpIGxpbVNtZVN0YXRlICVkIChwcmV2IHNtZSBzdGF0ZSAlZCkgc3lzUm9sZSAlZCBtbG0gc3RhdGUgJWQgKHByZXYgbWxtIHN0YXRlICVkKVxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1Nc2ctPnR5cGUsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUsICBwTWFjLT5saW0uZ0xpbVByZXZTbWVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSwgIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUsICBwTWFjLT5saW0uZ0xpbVByZXZNbG1TdGF0ZSk7KQorICAgICAgICAgICAgICAgICAgICBsaW1Mb2dTZXNzaW9uU3RhdGVzKHBNYWMpOworICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1zZ05hbWUocE1hYywgTE9HRSwgbGltTXNnLT50eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltSGFuZGxlQ0ZHcGFyYW1VcGRhdGUocE1hYywgbGltTXNnLT5ib2R5dmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfSU5JVF9TQ0FOX1JTUDoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NJbml0U2NhblJzcChwTWFjLCBsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfU1RBUlRfU0NBTl9SU1A6CisgICAgICAgICAgICBsaW1Qcm9jZXNzU3RhcnRTY2FuUnNwKHBNYWMsIGxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdEQV9FTkRfU0NBTl9SU1A6CisgICAgICAgICAgICBsaW1Qcm9jZXNzRW5kU2NhblJzcChwTWFjLCBsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfRklOSVNIX1NDQU5fUlNQOgorICAgICAgICAgICAgbGltUHJvY2Vzc0ZpbmlzaFNjYW5Sc3AocE1hYywgbGltTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0RBX1NXSVRDSF9DSEFOTkVMX1JTUDoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NTd2l0Y2hDaGFubmVsUnNwKHBNYWMsIGxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorI2lmZGVmIEFOSV9TSVJfSUJTU19QRUVSX0NBQ0hJTkcKKyAgICAgICAgY2FzZSBXREFfSUJTU19TVEFfQUREOgorICAgICAgICAgICAgbGltSWJzc1N0YUFkZChwTWFjLCBsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgY2FzZSBTSVJfQkJfWFBPUlRfTUdNVF9NU0c6CisgICAgICAgICAgICAvLyBUaGVzZSBtZXNzYWdlcyBhcmUgZnJvbSBQZWVyIE1BQyBlbnRpdHkuCisjaWZkZWYgV0xBTl9ERUJVRyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHBNYWMtPmxpbS5udW1CYnQrKzsKKyNlbmRpZgorCisjaWZkZWYgVk9TU19FTkFCTEVECisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdl9VMTZfdCAgICAgcGt0TGVuID0gMDsKKyAgICAgICAgICAgICAgICB2b3NfcGt0X3QgICpwVm9zUGt0OworICAgICAgICAgICAgICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1czsKKyAgICAgICAgICAgICAgICB0U2lyTXNnUSAgICBsaW1Nc2dOZXc7CisKKyAgICAgICAgICAgICAgICAvKiBUaGUgb3JpZ2luYWwgbGltTXNnIHdoaWNoIHdlIHdlcmUgZGVmZXJyaW5nIGhhdmUgdGhlIAorICAgICAgICAgICAgICAgICAqIGJvZHlQb2ludGVyIHBvaW50IHRvICdCRCcgaW5zdGVhZCBvZiAnVm9zIHBrdCcuIElmIHdlIGRvbid0IG1ha2UgYSBjb3B5CisgICAgICAgICAgICAgICAgICogb2YgbGltTXNnLCB0aGVuIHZvc19wa3RfcGVla19kYXRhIHdpbGwgb3ZlcndyaXRlIHRoZSBsaW1Nc2ctPmJvZHlQb2ludGVyLiAKKyAgICAgICAgICAgICAgICAgKiBhbmQgbmV4dCB0aW1lIHdoZW4gd2UgdHJ5IHRvIHByb2Nlc3MgdGhlIG1zZywgd2Ugd2lsbCB0cnkgdG8gdXNlICdCRCcgYXMgCisgICAgICAgICAgICAgICAgICogJ1ZvcyBQa3QnIHdoaWNoIHdpbGwgY2F1c2UgYSBjcmFzaAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYywgKHRBTklfVTgqKSZsaW1Nc2dOZXcsICh0QU5JX1U4KilsaW1Nc2csIHNpemVvZih0U2lyTXNnUSkpOworICAgICAgICAgICAgICAgIHBWb3NQa3QgPSAodm9zX3BrdF90ICopbGltTXNnTmV3LmJvZHlwdHI7CisgICAgICAgICAgICAgICAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aChwVm9zUGt0LCAmcGt0TGVuKTsKKworICAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKCBwVm9zUGt0LCAodl9QVk9JRF90ICopJmxpbU1zZ05ldy5ib2R5cHRyLCBWT1NfRkFMU0UgKTsKKworICAgICAgICAgICAgICAgIGlmKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBWb3NQa3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW1IYW5kbGU4MDIxMUZyYW1lcyhwTWFjLCAmbGltTXNnTmV3LCAmZGVmZXJNc2cpOworCisgICAgICAgICAgICAgICAgaWYgKCBkZWZlck1zZyA9PSB0cnVlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkRlZmVyIG1lc3NhZ2UgdHlwZT0lWCBcbiIpLCBsaW1Nc2ctPnR5cGUpOykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW1EZWZlck1zZyhwTWFjLCBsaW1Nc2cpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5hYmxlIHRvIERlZmVyIG1lc3NhZ2UoMHglWCkgbGltU21lU3RhdGUgJWQgKHByZXYgc21lIHN0YXRlICVkKSBzeXNSb2xlICVkIG1sbSBzdGF0ZSAlZCAocHJldiBtbG0gc3RhdGUgJWQpXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltTXNnLT50eXBlLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlLCAgcE1hYy0+bGltLmdMaW1QcmV2U21lU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSwgIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUsICBwTWFjLT5saW0uZ0xpbVByZXZNbG1TdGF0ZSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZ1Nlc3Npb25TdGF0ZXMocE1hYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNc2dOYW1lKHBNYWMsIExPR0UsIGxpbU1zZy0+dHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBWb3NQa3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBQRSBpcyBub3QgZGVmZXJyaW5nIHRoaXMgODAyLjExIGZyYW1lIHNvIHdlIG5lZWQgdG8gY2FsbCB2b3NfcGt0X3JldHVybi4gCisgICAgICAgICAgICAgICAgICAgICAqIEFzdW1wdGlvbiBoZXJlIGlzIHdoZW4gUnggbWdtdCBmcmFtZSBwcm9jZXNzaW5nIGlzIGRvbmUsCisgICAgICAgICAgICAgICAgICAgICAqIHZvc3MgcGFja2V0IGNvdWxkIGJlIGZyZWVkIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFZvc1BrdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIGxpbUhhbmRsZTgwMjExRnJhbWVzKHBNYWMsIGxpbU1zZyk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9TTUVfU0NBTl9SRVE6CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICBjYXNlIGVXTklfU01FX1JFTUFJTl9PTl9DSEFOTkVMX1JFUToKKyNlbmRpZgorICAgICAgICBjYXNlIGVXTklfU01FX0RJU0FTU09DX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ERUFVVEhfUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX1NUQV9TVEFUX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9BR0dSX1NUQVRfUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX0dMT0JBTF9TVEFUX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TVEFUX1NVTU1fUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX0dFVF9TQ0FOTkVEX0NIQU5ORUxfUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX0dFVF9TVEFUSVNUSUNTX1JFUToKKyAgICAgICAgICAgIC8vIFRoZXNlIG1lc3NhZ2VzIGFyZSBmcm9tIEhERAorICAgICAgICAgICAgbGltUHJvY2Vzc05vcm1hbEhkZE1zZyhwTWFjLCBsaW1Nc2csIHRydWUpOyAgLy9uZWVkIHRvIHJlc3BvbnNlIHRvIGhkZAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TQ0FOX0FCT1JUX0lORDoKKyAgICAgICAgICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QgKilsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgbGltTXNnLT5ib2R5cHRyID0gTlVMTDsKKyAgICAgICAgICAgIGxpbVByb2Nlc3NBYm9ydFNjYW5JbmQocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX1NUQVJUX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TWVNfUkVBRFlfSU5EOgorI2lmbmRlZiBXTklfQVNLRVlfTk9OX1NVUFBPUlRfRkVBVFVSRQorICAgICAgICBjYXNlIGVXTklfU01FX0pPSU5fUkVROgorI2VuZGlmCisgICAgICAgIGNhc2UgZVdOSV9TTUVfQVVUSF9SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfUkVBU1NPQ19SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1RBUlRfQlNTX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TVE9QX0JTU19SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1dJVENIX0NITF9SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1dJVENIX0NITF9DQl9QUklNQVJZX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TV0lUQ0hfQ0hMX0NCX1NFQ09OREFSWV9SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU0VUQ09OVEVYVF9SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfUkVNT1ZFS0VZX1JFUToKKyNpZm5kZWYgV05JX0FTS0VZX05PTl9TVVBQT1JUX0ZFQVRVUkUKKyAgICAgICAgY2FzZSBlV05JX1NNRV9QUk9NSVNDVU9VU19NT0RFX1JFUToKKyNlbmRpZgorICAgICAgICBjYXNlIGVXTklfU01FX0RJU0FTU09DX0NORjoKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ERUFVVEhfQ05GOgorICAgICAgICBjYXNlIGVXTklfU01FX0FTU09DX0NORjoKKyAgICAgICAgY2FzZSBlV05JX1NNRV9SRUFTU09DX0NORjoKKyAgICAgICAgY2FzZSBlV05JX1NNRV9BRERUU19SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfREVMVFNfUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX0RFTF9CQV9QRUVSX0lORDoKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TRVRfVFhfUE9XRVJfUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX0dFVF9UWF9QT1dFUl9SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfR0VUX05PSVNFX1JFUToKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFICAgICAgICAKKyAgICAgICAgY2FzZSBlV05JX1NNRV9HRVRfQVNTT0NfU1RBU19SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfVEtJUF9DTlRSX01FQVNfUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX1VQREFURV9BUFdQU0lFX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ISURFX1NTSURfUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX0dFVF9XUFNQQkNfU0VTU0lPTl9SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU0VUX0FQV1BBUlNOSUVzX1JFUToKKyNlbmRpZgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgICAgICBjYXNlIGVXTklfU01FX05FSUdIQk9SX1JFUE9SVF9SRVFfSU5EOgorICAgICAgICBjYXNlIGVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVTUF9YTUlUX0lORDoKKyNlbmRpZgorI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICBjYXNlIGVXTklfU01FX0NDWF9BREpBQ0VOVF9BUF9SRVBPUlQ6CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICBjYXNlIGVXTklfU01FX0ZUX1VQREFURV9LRVk6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfRlRfUFJFX0FVVEhfUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX0ZUX0FHR1JfUU9TX1JFUToKKyNlbmRpZgorICAgICAgICBjYXNlIGVXTklfU01FX0FERF9TVEFfU0VMRl9SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfREVMX1NUQV9TRUxGX1JFUToKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIGNhc2UgZVdOSV9TTUVfUkVHSVNURVJfTUdNVF9GUkFNRV9SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfVVBEQVRFX05PQToKKyNlbmRpZgorICAgICAgICAgICAgLy8gVGhlc2UgbWVzc2FnZXMgYXJlIGZyb20gSERECisgICAgICAgICAgICBsaW1Qcm9jZXNzTm9ybWFsSGRkTXNnKHBNYWMsIGxpbU1zZywgZmFsc2UpOyAgIC8vbm8gbmVlZCB0byByZXNwb25zZSB0byBoZGQKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vUG93ZXIgU2F2ZSBNZXNzYWdlcyBGcm9tIEhERAorICAgICAgICBjYXNlIGVXTklfUE1DX1BXUl9TQVZFX0NGRzoKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FTlRFUl9CTVBTX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FWElUX0JNUFNfUkVROgorICAgICAgICBjYXNlIGVXTklfUE1DX0VOVEVSX0lNUFNfUkVROgorICAgICAgICBjYXNlIGVXTklfUE1DX0VYSVRfSU1QU19SRVE6CisgICAgICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfVUFQU0RfUkVROgorICAgICAgICBjYXNlIGVXTklfUE1DX0VYSVRfVUFQU0RfUkVROgorICAgICAgICBjYXNlIGVXTklfUE1DX0VOVEVSX1dPV0xfUkVROgorICAgICAgICBjYXNlIGVXTklfUE1DX0VYSVRfV09XTF9SRVE6CisgICAgICAgIGNhc2UgZVdOSV9QTUNfV09XTF9BRERfQkNBU1RfUFRSTjoKKyAgICAgICAgY2FzZSBlV05JX1BNQ19XT1dMX0RFTF9CQ0FTVF9QVFJOOgorICAgICAgICAgICAgcG1tUHJvY2Vzc01lc3NhZ2UocE1hYywgbGltTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9QTUNfU01QU19TVEFURV9JTkQgOgorICAgICAgICB7CisjaWZkZWYgU1VQUE9SVF9lV05JX1BNQ19TTVBTX1NUQVRFX0lORAorICAgICAgICAgICAgdFNpck1iTXNnICpwTUJNc2c7CisgICAgICAgICAgICB0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUgbWltb1BTc3RhdGU7CisgICAgICAgICAgICAvKiogSXMgU3lzdGVtIHByb2Nlc3NpbmcgYW55IFNNUFMgSW5kaWNhdGlvbiovCisgICAgICAgICAgICBpZiAoIWxpbUlzU3lzdGVtSW5TZXRNaW1vcHNTdGF0ZShwTWFjKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTUJNc2cgPSAodFNpck1iTXNnICopbGltTXNnLT5ib2R5cHRyOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJm1pbW9QU3N0YXRlLCBwTUJNc2ctPmRhdGEsIHNpemVvZih0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpKTsKKyAgICAgICAgICAgICAgICBsaW1TTVBvd2VyU2F2ZVN0YXRlSW5kKHBNYWMsIG1pbW9QU3N0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobGltRGVmZXJNc2cocE1hYywgbGltTXNnKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5hYmxlIHRvIERlZmVyIG1lc3NhZ2UoMHglWCkgbGltU21lU3RhdGUgJWQgKHByZXYgc21lIHN0YXRlICVkKSBzeXNSb2xlICVkIG1sbSBzdGF0ZSAlZCAocHJldiBtbG0gc3RhdGUgJWQpXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbU1zZy0+dHlwZSwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSwgIHBNYWMtPmxpbS5nTGltUHJldlNtZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlLCAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSwgIHBNYWMtPmxpbS5nTGltUHJldk1sbVN0YXRlKTspCisgICAgICAgICAgICAgICAgICAgIGxpbUxvZ1Nlc3Npb25TdGF0ZXMocE1hYyk7CisgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TXNnTmFtZShwTWFjLCBMT0dFLCBsaW1Nc2ctPnR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYobGltTXNnLT5ib2R5cHRyKXsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTggKilsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgbGltTXNnLT5ib2R5cHRyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIGNhc2UgZVdOSV9TTUVfU0VORF9BQ1RJT05fRlJBTUVfSU5EOgorICAgICAgICAgICAgbGltU2VuZFAyUEFjdGlvbkZyYW1lKHBNYWMsIGxpbU1zZyk7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh0QU5JX1U4ICopbGltTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgIGxpbU1zZy0+Ym9keXB0ciA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9BQk9SVF9SRU1BSU5fT05fQ0hBTl9JTkQ6CisgICAgICAgICAgICBsaW1BYm9ydFJlbWFpbk9uQ2hhbihwTWFjKTsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTggKilsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgbGltTXNnLT5ib2R5cHRyID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lSX0hBTF9QMlBfTk9BX0FUVFJfSU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSAmcE1hYy0+bGltLmdwU2Vzc2lvblswXTsgIAorICAgICAgICAgICAgICAgIHRBTklfVTggIGk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJSZWNlaXZlZCBtZXNzYWdlIE5vYV9BVFRSICV4XG4iKSwgbGltTXNnLT50eXBlKTsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpIDwgcE1hYy0+bGltLm1heEJzc0lkOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAgICggKHBzZXNzaW9uRW50cnkgIT0gTlVMTCkgJiYgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpKQorICAgICAgICAgICAgICAgICAgICB7IC8vU2F2ZSBQMlAgYXR0cmlidXRlcyBmb3IgUDJQIEdvIHBlcnNvbmEKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsJnBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUsIGxpbU1zZy0+Ym9keXB0cixzaXplb2YodFNpclAyUE5vYUF0dHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIiAmcHNlc3Npb25FbnRyeS0+YnNzSWQlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBjdFdpbj0lZCBvcHBQc0ZsYWc9JWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLmN0V2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUub3BwUHNGbGFnKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCIgdU5vYTFJbnRlcnZhbENudD0lZCB1Tm9hMUR1cmF0aW9uPSVkIHVOb2ExSW50ZXJ2YWw9JWQgdU5vYTFTdGFydFRpbWU9JWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUudU5vYTFJbnRlcnZhbENudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLnVOb2ExRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMUludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUudU5vYTFTdGFydFRpbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCAqKWxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICBsaW1Nc2ctPmJvZHlwdHIgPSBOVUxMOworICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCisjZW5kaWYKKyAgICAgICAgLyogZVdOSV9TTUVfUFJFX0NIQU5ORUxfU1dJVENIX0ZVTExfUE9XRVIgTWVzc2FnZSBjb21lcyBhZnRlciB0aGUKKyAgICAgICAgICogZGV2aWNlIGNvbWVzIG91dCBvZiBmdWxsIHBvd2VyIGZvciB0aGUgZnVsbCBwb3dlciByZXF1ZXN0IHNlbnQgCisgICAgICAgICAqIGJlY2F1c2Ugb2YgY2hhbm5lbCBzd2l0Y2ggd2l0aCBzd2l0Y2ggY291bnQgYXMgMCwgc28gY2FsbCB0aGUgc2FtZSAKKyAgICAgICAgICogZnVuY3Rpb24gdXNlZCBpbiB0aW1lb3V0IGNhc2UoaS5lIFNJUl9MSU1fQ0hBTk5FTF9TV0lUQ0hfVElNRU9VVCkgCisgICAgICAgICAqIGZvciBzd2l0Y2hpbmcgdGhlIGNoYW5uZWwqLworICAgICAgICBjYXNlIGVXTklfU01FX1BSRV9DSEFOTkVMX1NXSVRDSF9GVUxMX1BPV0VSOgorICAgICAgICAgICAgbGltUHJvY2Vzc0NoYW5uZWxTd2l0Y2hUaW1lb3V0KHBNYWMpOworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCAqKWxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICBsaW1Nc2ctPmJvZHlwdHIgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy9Qb3dlciBTYXZlIFJlbGF0ZWQgTWVzc2FnZXMgRnJvbSBIQUwKKyAgICAgICAgY2FzZSBXREFfRU5URVJfQk1QU19SU1A6CisgICAgICAgIGNhc2UgV0RBX0VYSVRfQk1QU19SU1A6CisgICAgICAgIGNhc2UgV0RBX0VYSVRfQk1QU19JTkQ6CisgICAgICAgIGNhc2UgV0RBX0VOVEVSX0lNUFNfUlNQOgorICAgICAgICBjYXNlIFdEQV9FWElUX0lNUFNfUlNQOgorICAgICAgICBjYXNlIFdEQV9FTlRFUl9VQVBTRF9SU1A6CisgICAgICAgIGNhc2UgV0RBX0VYSVRfVUFQU0RfUlNQOgorICAgICAgICBjYXNlIFdEQV9XT1dMX0VOVEVSX1JTUDoKKyAgICAgICAgY2FzZSBXREFfV09XTF9FWElUX1JTUDoKKyAgICAgICAgICAgIHBtbVByb2Nlc3NNZXNzYWdlKHBNYWMsIGxpbU1zZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdEQV9MT1dfUlNTSV9JTkQ6CisgICAgICAgICAgICAvL2xpbUhhbmRsZUxvd1Jzc2lJbmQocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdEQV9CTVBTX1NUQVRVU19JTkQ6CisgICAgICAgICAgICBsaW1IYW5kbGVCbXBzU3RhdHVzSW5kKHBNYWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfTUlTU0VEX0JFQUNPTl9JTkQ6CisgICAgICAgICAgICBsaW1IYW5kbGVNaXNzZWRCZWFjb25JbmQocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXREFfTUlDX0ZBSUxVUkVfSU5EOgorICAgICAgICAgICBsaW1NaWNGYWlsdXJlSW5kKHBNYWMsIGxpbU1zZyk7CisgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTggKilsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICBsaW1Nc2ctPmJvZHlwdHIgPSBOVUxMOworICAgICAgICAgICBicmVhazsKKyAgICAKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgICAgIGNhc2UgZVdOSV9TTUVfTUVBU1VSRU1FTlRfUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX1NFVF9XRFNfSU5GT19SRVE6CisgICAgICAgICAgICAvLyBNZXNzYWdlIHRvIHN1cHBvcnQgQU5JIGZlYXR1cmUgc2V0CisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgaGFuZGxlZCBieSBMTU0gc3ViIG1vZHVsZQorICAgICAgICAgICAgaWYgKGxpbUlzU3lzdGVtSW5TY2FuU3RhdGUocE1hYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU3lzdGVtIGlzIGluIERGUyAoTGVhcm4pIG1vZGUKKyAgICAgICAgICAgICAgICAvLyBEZWZlciBwcm9jZXNzc2luZyB0aGlzIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICBpZiAobGltRGVmZXJNc2cocE1hYywgbGltTXNnKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLm51bVNtZSsrOworICAgICAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gRGVmZXIgbWVzc2FnZSgweCVYKSBsaW1TbWVTdGF0ZSAlZCAocHJldiBzbWUgc3RhdGUgJWQpIHN5c1JvbGUgJWQgbWxtIHN0YXRlICVkIChwcmV2IG1sbSBzdGF0ZSAlZClcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbGltTXNnLT50eXBlLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlLCAgcE1hYy0+bGltLmdMaW1QcmV2U21lU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUsICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlLCAgcE1hYy0+bGltLmdMaW1QcmV2TWxtU3RhdGUpOykKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nU2Vzc2lvblN0YXRlcyhwTWFjKTsKKyAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNc2dOYW1lKHBNYWMsIExPR0UsIGxpbU1zZy0+dHlwZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgYm9keQorICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGltTXNnLT50eXBlID09IGVXTklfU01FX01FQVNVUkVNRU5UX1JFUSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChHRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgdGhlIHJlc3VtZSBjaGFubmVsIHRvIEFueSB2YWxpZCBjaGFubmVsIChpbnZhbGlkKS4gCisgICAgICAgICAgICAgICAgICAgICAgICAvL1RoaXMgd2lsbCBpbnN0cnVjdCBIQUwgdG8gc2V0IGl0IHRvIGFueSBwcmV2aW91cyB2YWxpZCBjaGFubmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgcGVTZXRSZXN1bWVDaGFubmVsKHBNYWMsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgbGltU2VuZEhhbEZpbmlzaFNjYW5SZXEocE1hYywgZUxJTV9IQUxfRklOSVNIX0xFQVJOX1dBSVRfU1RBVEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5udW1TbWUrKzsKKyAgICAgICAgICAgICAgICBsaW1Qcm9jZXNzTG1tTWVzc2FnZXMocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltTXNnLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgbGltTXNnLT5ib2R5cHRyKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgYm9keQorICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIGxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9MSU1fTEVBUk5fSU5URVJWQUxfVElNRU9VVDoKKyAgICAgICAgICAgIGlmICgocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpICYmCisgICAgICAgICAgICAgICAgKChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFKSB8fAorICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9ERUxfQlNTX1JTUF9TVEFURSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEJQIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNsZWFuaW5nIHVwCisgICAgICAgICAgICAgICAgLy8gaXRzIHN0YXRlIHdpdGggcHJldmlvdXNseSBhc3NvY2FpdGVkIEFQLgorICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgcHJvY2Vzc3NpbmcgdGhpcyBtZXNzYWdlLgorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoIkRpc2NhcmRpbmcgTEVBUk5fSU5URVJWQUxfVE8gbWVzc2FnZVxuIikpOykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsaW1Qcm9jZXNzTG1tTWVzc2FnZXMocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltTXNnLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgbGltTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lSX0xJTV9NRUFTVVJFTUVOVF9JTkRfVElNRU9VVDoKKyAgICAgICAgY2FzZSBTSVJfTElNX0xFQVJOX0RVUkFUSU9OX1RJTUVPVVQ6CisgICAgICAgICAgICAvLyBUaGVzZSBtZWFzdXJlbWVudCByZWxhdGVkIHRpbWVvdXRzIGFyZQorICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBMTU0gc3ViIG1vZHVsZS4KKyAgICAgICAgICAgIGxpbVByb2Nlc3NMbW1NZXNzYWdlcyhwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbU1zZy0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgbGltTXNnLT5ib2R5cHRyKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTElNX1JBREFSX0RFVEVDVF9JTkQ6CisgICAgICAgICAgICBsaW1EZXRlY3RSYWRhcihwTWFjLCAodEFOSV9VMzIqKWxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VMzIqKWxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICBicmVhazsKKworI2VuZGlmCisKKyAgICAgICAgY2FzZSBTSVJfTElNX0FERFRTX1JTUF9USU1FT1VUOgorICAgICAgICAgICAgbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzKHBNYWMsbGltTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgY2FzZSBTSVJfTElNX0NDWF9UU01fVElNRU9VVDoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NUc21UaW1lb3V0SGFuZGxlcihwTWFjLGxpbU1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXREFfVFNNX1NUQVRTX1JTUDoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NIYWxDY3hUc21Sc3AocE1hYywgbGltTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGNhc2UgV0RBX0FERF9UU19SU1A6CisgICAgICAgICAgICBsaW1Qcm9jZXNzSGFsQWRkVHNSc3AocE1hYywgbGltTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lSX0xJTV9ERUxfVFNfSU5EOgorICAgICAgICAgIGxpbVByb2Nlc3NEZWxUc0luZChwTWFjLCBsaW1Nc2cpOworICAgICAgICBjYXNlIFNJUl9MSU1fQUREX0JBX0lORDoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NBZGRCYUluZChwTWFjLCBsaW1Nc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX0xJTV9ERUxfQkFfQUxMX0lORDoKKyAgICAgICAgICAgIGxpbURlbEFsbEJBU2Vzc2lvbnMocE1hYyk7ICAvLyByZWZlciBub3RlcyBhbmQgY2hhbmdlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTElNX0RFTF9CQV9JTkQ6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtSGFsQkFEZWxldGVJbmQoIHBNYWMsIGxpbU1zZyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgU0lSX0xJTV9CRUFDT05fR0VOX0lORDogeworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBwbW1VcGRhdGVUSU0ocE1hYywgKHRwQmVhY29uR2VuUGFyYW1zKWxpbU1zZy0+Ym9keXB0cik7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICBpZiggcE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSApCisjZW5kaWYgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc2NoUHJvY2Vzc1ByZUJlYWNvbkluZChwTWFjLCBsaW1Nc2cpOyAgICAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9MSU1fREVMRVRFX1NUQV9DT05URVhUX0lORDoKKyAgICAgICAgICAgIGxpbURlbGV0ZVN0YUNvbnRleHQocE1hYywgbGltTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lSX0xJTV9NSU5fQ0hBTk5FTF9USU1FT1VUOgorICAgICAgICBjYXNlIFNJUl9MSU1fTUFYX0NIQU5ORUxfVElNRU9VVDoKKyAgICAgICAgY2FzZSBTSVJfTElNX1BFUklPRElDX1BST0JFX1JFUV9USU1FT1VUOgorICAgICAgICBjYXNlIFNJUl9MSU1fSk9JTl9GQUlMX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgU0lSX0xJTV9BVVRIX0ZBSUxfVElNRU9VVDoKKyAgICAgICAgY2FzZSBTSVJfTElNX0FVVEhfUlNQX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgU0lSX0xJTV9BU1NPQ19GQUlMX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgU0lSX0xJTV9SRUFTU09DX0ZBSUxfVElNRU9VVDoKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICBjYXNlIFNJUl9MSU1fRlRfUFJFQVVUSF9SU1BfVElNRU9VVDoKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgY2FzZSBTSVJfTElNX1JFTUFJTl9DSE5fVElNRU9VVDoKKyNlbmRpZgorICAgICAgICAgICAgLy8gVGhlc2UgdGltZW91dCBtZXNzYWdlcyBhcmUgaGFuZGxlZCBieSBNTE0gc3ViIG1vZHVsZQorCisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtUmVxTWVzc2FnZXMocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1Nc2cpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9MSU1fSEVBUlRfQkVBVF9USU1FT1VUOgorICAgICAgICAgICAgLyoqIGNoZWNrIGlmIGhlYXJ0IGJlYXQgZmFpbGVkLCBldmVuIGlmIG9uZSBCZWFjb24KKyAgICAgICAgICAgICAgICAgICAgKiBpcyByY3ZkIHdpdGhpbiB0aGUgSGVhcnQgQmVhdCBpbnRlcnZhbCBjb250aW51ZQorICAgICAgICAgICAgICAgICAgKiBub3JtYWwgcHJvY2Vzc2luZworICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAjaWYgMCAKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkhlYXJ0YmVhdCB0aW1lb3V0LCBTTUUgJWQsIE1MTUUgJWQsICNiY24gJWRcbiIpLAorICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU21lU3RhdGUsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUsCisgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1SeGVkQmVhY29uQ250RHVyaW5nSEIpOykKKworICAgICAgICAgICAgaWYocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkKKyAgICAgICAgICAgICAgICBsaW1JYnNzSGVhcnRCZWF0SGFuZGxlKHBNYWMpOyAvL0hlYXJ0QmVhdCBmb3IgcGVlcnMuCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAqIEhlYXJ0YmVhdCBmYWlsdXJlIG9jY3VycmVkIG9uIFNUQQorICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBoYW5kbGVkIGJ5IExNTSBzdWIgbW9kdWxlLgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsaW1IYW5kbGVIZWFydEJlYXRGYWlsdXJlKHBNYWMpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICNlbmRpZiAvL1RPIFNVUFBPUlQgQlQtQU1QCisKKyAgICAgICAgICAgIGxpbUhhbmRsZUhlYXJ0QmVhdFRpbWVvdXQocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgCisgICAgICAgIGNhc2UgU0lSX0xJTV9QUk9CRV9IQl9GQUlMVVJFX1RJTUVPVVQ6CisgICAgICAgICAgICBsaW1IYW5kbGVIZWFydEJlYXRGYWlsdXJlVGltZW91dChwTWFjKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lSX0xJTV9DSEFOTkVMX1NDQU5fVElNRU9VVDoKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBCYWNrZ3JvdW5kIHNjYW4gdGltZW91dCBvY2N1cnJlZCBvbiBTVEEuCisgICAgICAgICAgICAgKiBUaGlzIGlzIGhhbmRsZWQgYnkgTE1NIHN1YiBtb2R1bGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9CQUNLR1JPVU5EX1NDQU5fVElNRVIpOworCisgICAgICAgICAgICAvL1dlIHdpbGwgZG8gYmFja2dyb3VuZCBzY2FuIGV2ZW4gaW4gYmNucHMgbW9kZQorICAgICAgICAgICAgLy9pZiAocE1hYy0+c3lzLmdTeXNFbmFibGVTY2FuTW9kZSkKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltUmVwb3J0QmFja2dyb3VuZFNjYW5SZXN1bHRzID0gRkFMU0U7CisgICAgICAgICAgICBsaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW4ocE1hYyk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgICAgICBjYXNlIFNJUl9MSU1fUFJFQVVUSF9DTE5VUF9USU1FT1VUOgorICAgICAgICAgICAgaWYgKGxpbUlzU3lzdGVtSW5TY2FuU3RhdGUocE1hYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU3lzdGVtIGlzIGluIERGUyAoTGVhcm4pIG1vZGUKKyAgICAgICAgICAgICAgICAvLyBEZWZlciBwcm9jZXNzc2luZyB0aGlzIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICBpZiAobGltRGVmZXJNc2cocE1hYywgbGltTXNnKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5hYmxlIHRvIERlZmVyIG1lc3NhZ2UoMHglWCkgbGltU21lU3RhdGUgJWQgKHByZXYgc21lIHN0YXRlICVkKSBzeXNSb2xlICVkIG1sbSBzdGF0ZSAlZCAocHJldiBtbG0gc3RhdGUgJWQpXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbU1zZy0+dHlwZSwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSwgIHBNYWMtPmxpbS5nTGltUHJldlNtZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlLCAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSwgIHBNYWMtPmxpbS5nTGltUHJldk1sbVN0YXRlKTspCisgICAgICAgICAgICAgICAgICAgIGxpbUxvZ1Nlc3Npb25TdGF0ZXMocE1hYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFByZS1hdXRoZW50aWNhdGlvbiBjb250ZXh0IGNsZWFudXAgdGltZW91dCBtZXNzYWdlCisgICAgICAgICAgICAgICAgbGltUHJlQXV0aENsbnVwSGFuZGxlcihwTWFjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICBjYXNlIFNJUl9MSU1fSEFTSF9NSVNTX1RIUkVTX1RJTUVPVVQ6CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqKiBjbGVhciB0aGUgY3JlZGl0IHRvIHRoZSBzZW5kIGRpc2Fzc29jaWF0ZSBmcmFtZSBidWNrZXQKKyAgICAgICAgICAgICoqLworCisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbURpc2Fzc29jRnJhbWVDcmVkaXQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTElNX0NORl9XQUlUX1RJTUVPVVQ6CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqKiBEb2VzIG5vdCByZWNlaXZlIENORiBvciBkdW1teSBwYWNrZXQKKyAgICAgICAgICAgICoqLworICAgICAgICAgICAgbGltSGFuZGxlQ25mV2FpdFRpbWVvdXQocE1hYywgKHRBTklfVTE2KSBsaW1Nc2ctPmJvZHl2YWwpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9MSU1fS0VFUEFMSVZFX1RJTUVPVVQ6CisgICAgICAgICAgICBsaW1TZW5kS2VlcEFsaXZlVG9QZWVyKHBNYWMpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9MSU1fUkVUUllfSU5URVJSVVBUX01TRzoKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgZnJvbSBJU1IgdXBvbiBURlAncyBtYXggcmV0cnkgbGltaXQgaW50ZXJydXB0CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lSX0xJTV9JTlZfS0VZX0lOVEVSUlVQVF9NU0c6CisgICAgICAgICAgICAvLyBNZXNzYWdlIGZyb20gSVNSIHVwb24gU1AncyBJbnZhbGlkIHNlc3Npb24ga2V5IGludGVycnVwdAorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9MSU1fS0VZX0lEX0lOVEVSUlVQVF9NU0c6CisgICAgICAgICAgICAvLyBNZXNzYWdlIGZyb20gSVNSIHVwb24gU1AncyBJbnZhbGlkIGtleSBJRCBpbnRlcnJ1cHQKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTElNX1JFUExBWV9USFJFU19JTlRFUlJVUFRfTVNHOgorICAgICAgICAgICAgLy8gTWVzc2FnZSBmcm9tIElTUiB1cG9uIFNQJ3MgUmVwbGF5IHRocmVzaG9sZCBpbnRlcnJ1cHQKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTElNX0NIQU5ORUxfU1dJVENIX1RJTUVPVVQ6CisgICAgICAgICAgICBsaW1Qcm9jZXNzQ2hhbm5lbFN3aXRjaFRpbWVvdXQocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9MSU1fUVVJRVRfVElNRU9VVDoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NRdWlldFRpbWVvdXQocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9MSU1fUVVJRVRfQlNTX1RJTUVPVVQ6CisgICAgICAgICAgICBsaW1Qcm9jZXNzUXVpZXRCc3NUaW1lb3V0KHBNYWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGNhc2UgU0lSX0xJTV9VUERBVEVfT0xCQ19DQUNIRUxfVElNRU9VVDoKKyAgICAgICAgICAgIGxpbUhhbmRsZVVwZGF0ZU9sYmNDYWNoZShwTWFjKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmIDAKKyAgICAgICAgY2FzZSBTSVJfTElNX1dQU19PVkVSTEFQX1RJTUVPVVQ6CisgICAgICAgICAgICBsaW1Qcm9jZXNzV1BTT3ZlcmxhcFRpbWVvdXQocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisjZW5kaWYKKworICAgICAgICBjYXNlIFdEQV9BRERfQlNTX1JTUDoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NNbG1BZGRCc3NSc3AoIHBNYWMsIGxpbU1zZyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfQUREX1NUQV9SU1A6CisKKyAgICAgICAgICAgIC8vY2FsbCBhIHdyYXBwZXIgYnkgcGFhc2luZyBib2R5cHRyLCB0aGVpciBnZXQgc2Vzc2lvbklEIGFuZCBhbmQgY2FsbCBwcm9wZXIgZnVuY3Rpb24gZnJvbSB0aGVyZS4KKyAgICAgICAgICAgIGxpbVByb2Nlc3NBZGRTdGFSc3AocE1hYyxsaW1Nc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfREVMRVRFX1NUQV9SU1A6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtRGVsU3RhUnNwKHBNYWMsIGxpbU1zZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdEQV9BRERfU1RBX1NFTEZfUlNQOgorICAgICAgICAgICAgbGltUHJvY2Vzc0FkZFN0YVNlbGZSc3AocE1hYywgbGltTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOyAKKyAgICAgICAgY2FzZSBXREFfREVMX1NUQV9TRUxGX1JTUDoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NEZWxTdGFTZWxmUnNwKHBNYWMsIGxpbU1zZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdEQV9ERUxFVEVfQlNTX1JTUDoKKyAgICAgICAgICAgIGxpbUhhbmRsZURlbGV0ZUJzc1JzcChwTWFjLGxpbU1zZyk7IC8vd3JhcHBlciByb3V0aW5lIHRvIGhhbmRsZSBkZWxldGUgYnNzIHJlc3BvbnNlIAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfU0VUX0JTU0tFWV9SU1A6CisgICAgICAgIGNhc2UgV0RBX1NFVF9TVEFfQkNBU1RLRVlfUlNQOgorICAgICAgICAgICAgbGltUHJvY2Vzc01sbVNldEJzc0tleVJzcCggcE1hYywgbGltTXNnICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXREFfU0VUX1NUQUtFWV9SU1A6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtU2V0U3RhS2V5UnNwKCBwTWFjLCBsaW1Nc2cgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdEQV9SRU1PVkVfQlNTS0VZX1JTUDoKKyAgICAgICAgY2FzZSBXREFfUkVNT1ZFX1NUQUtFWV9SU1A6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtUmVtb3ZlS2V5UnNwKCBwTWFjLCBsaW1Nc2cgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdEQV9BRERCQV9SU1A6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtSGFsQWRkQkFSc3AoIHBNYWMsIGxpbU1zZyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfU1RBX1NUQVRfUlNQOgorICAgICAgICBjYXNlIFdEQV9BR0dSX1NUQVRfUlNQOgorICAgICAgICBjYXNlIFdEQV9HTE9CQUxfU1RBVF9SU1A6CisgICAgICAgIGNhc2UgV0RBX1NUQVRfU1VNTV9SU1A6CisgICAgICAgICAgICBsaW1TZW5kU21lU3RhdHNSc3AgKCBwTWFjLCBsaW1Nc2ctPnR5cGUsICh2b2lkICopbGltTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0RBX0dFVF9TVEFUSVNUSUNTX1JTUDoKKyAgICAgICAgICAgIGxpbVNlbmRTbWVQRVN0YXRpc3RpY3NSc3AgKCBwTWFjLCBsaW1Nc2ctPnR5cGUsICh2b2lkICopbGltTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0RBX1NFVF9NSU1PUFNfUlNQOiAgICAgICAgICAgIC8vbGltUHJvY2Vzc1NldE1pbW9Sc3AocE1hYywgbGltTXNnKTsKKyAgICAgICAgY2FzZSBXREFfU0VUX1RYX1BPV0VSX1JTUDogICAgICAgICAgLy9saW1Qcm9jZXNzU2V0VHhQb3dlclJzcChwTWFjLCBsaW1Nc2cpOworICAgICAgICBjYXNlIFdEQV9HRVRfVFhfUE9XRVJfUlNQOiAgICAgICAgICAvL2xpbVByb2Nlc3NHZXRUeFBvd2VyUnNwKHBNYWMsIGxpbU1zZyk7CisgICAgICAgIGNhc2UgV0RBX0dFVF9OT0lTRV9SU1A6CisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90KilsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgbGltTXNnLT5ib2R5cHRyID0gTlVMTDsKKyAgICAgICAgICAgIC8vbGltUHJvY2Vzc0dldE5vaXNlUnNwKHBNYWMsIGxpbU1zZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdEQV9TRVRfTUFYX1RYX1BPV0VSX1JTUDoKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAgICAgICAgIHJybVNldE1heFR4UG93ZXJSc3AoIHBNYWMsIGxpbU1zZyApOworI2VuZGlmCisgICAgICAgICAgICBpZihsaW1Nc2ctPmJvZHlwdHIgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QqKWxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICAgICBsaW1Nc2ctPmJvZHlwdHIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKyAgICAgICBjYXNlIFNJUl9MSU1fQUREUjJfTUlTU19JTkQ6CisgICAgICAgeworICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICBGTCgiQWRkcjIgbWlzbWF0Y2ggaW50ZXJydXB0IHJlY2VpdmVkICVYXG4iKSwKKyAgICAgICAgICAgICAgICAgICBsaW1Nc2ctPnR5cGUpOworICAgICAgICAgICAvKmEgbWVzc2FnZSBmcm9tIEhBTCBpbmRpY2F0aW5nIGFkZHIyIG1pc21hdGNoIGludGVycnVwdCBvY2N1cnJlZAorICAgICAgICAgICAgIGxpbU1zZy0+Ym9keXB0ciBjb250YWlucyBvbmx5IHBvaW50ZXIgdG8gNDgtYml0IGFkZHIyIGZpZWxkKi8KKyAgICAgICAgICAgLy9EaW5lc2ggZml4IHRoaXMuIHRoZSB0aGlyZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHNlc3Npb25lbnRyeS4KKyAgICAgICAgICAgLy9saW1IYW5kbGVVbmtub3duQTJJbmRleEZyYW1lcyhwTWFjLCAodm9pZCAqKWxpbU1zZy0+Ym9keXB0cik7IAorCisgICAgICAgICAgIC8qRnJlZSBtZXNzYWdlIGJvZHkgcG9pbnRlciovIAorICAgICAgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICopKGxpbU1zZy0+Ym9keXB0cikpOworICAgICAgICAgICBicmVhazsKKyAgICAgICB9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgY2FzZSBXREFfQUdHUl9RT1NfUlNQOgorICAgICAgIGxpbVByb2Nlc3NGVEFnZ3JRb1NSc3AoIHBNYWMsIGxpbU1zZyApOworICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlIFdEQV9TRVRfTElOS19TVEFURV9SU1A6CisgICAgICAgbGlua1N0YXRlUGFyYW1zID0gKHRMaW5rU3RhdGVQYXJhbXMgKilsaW1Nc2ctPmJvZHlwdHI7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgIHBTZXNzaW9uID0gbGlua1N0YXRlUGFyYW1zLT5zZXNzaW9uOworICAgICAgIGlmKGxpbmtTdGF0ZVBhcmFtcy0+ZnQpCisgICAgICAgeworICAgICAgICAgIGxpbVNlbmRSZWFzc29jUmVxV2l0aEZUSUVzTWdtdEZyYW1lKHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wTGltTWxtUmVhc3NvY1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbik7IAorICAgICAgIH0KKyNlbmRpZgorICAgICAgIGlmKCBsaW5rU3RhdGVQYXJhbXMtPmNhbGxiYWNrICkKKyAgICAgICB7CisgICAgICAgICAgbGlua1N0YXRlUGFyYW1zLT5jYWxsYmFjayggcE1hYywgbGlua1N0YXRlUGFyYW1zLT5jYWxsYmFja0FyZyApOworICAgICAgIH0KKyAgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICopKGxpbU1zZy0+Ym9keXB0cikpOworICAgICAgIGJyZWFrOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKyAgICBjYXNlIFdEQV9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUlNQOgorICAgICAgICBwbW1Qcm9jZXNzTWVzc2FnZShwTWFjLCBsaW1Nc2cpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisgICAgY2FzZSBXREFfR1RLX09GRkxPQURfR0VUSU5GT19SU1A6CisgICAgICAgIHBtbVByb2Nlc3NNZXNzYWdlKHBNYWMsIGxpbU1zZyk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCisgICAgZGVmYXVsdDoKKyAgICAgICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCopbGltTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgbGltTXNnLT5ib2R5cHRyID0gTlVMTDsKKyAgICAgICAgLy8gVW53YW50ZWQgbWVzc2FnZXMKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgIEZMKCJEaXNjYXJkaW5nIHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCAlWFxuIiksCisgICAgICAgICAgICAgICAgbGltTXNnLT50eXBlKTsKKyAgICAgICAgbGltUHJpbnRNc2dOYW1lKHBNYWMsIExPR0UsIGxpbU1zZy0+dHlwZSk7CisgICAgICAgIGJyZWFrOworCisgICAgfSAvLyBzd2l0Y2ggKGxpbU1zZy0+dHlwZSkKKworICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiRG9uZSBQcm9jZXNzaW5nIG1zZ1R5cGUgPSAlZCwgc21lIHN0YXRlID0gJXMsIG1sbSBzdGF0ZSA9ICVzXG4iKSwKKyAgICAgICAgICAgIGxpbU1zZy0+dHlwZSwgbGltU21lU3RhdGVTdHIocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSksCisgICAgICAgICAgICBsaW1NbG1TdGF0ZVN0cihwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7KQorCit9IC8qKiogZW5kIGxpbVByb2Nlc3NNZXNzYWdlcygpICoqKi8KKworCisKKy8qKgorICogbGltUHJvY2Vzc0RlZmVycmVkTWVzc2FnZVF1ZXVlCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IExJTSB3aGlsZSBleGl0aW5nIGZyb20gTGVhcm4KKyAqIG1vZGUuIFRoaXMgZnVuY3Rpb24gZmV0Y2hlcyBtZXNzYWdlcyBwb3N0ZWQgdG8gdGhlIExJTQorICogZGVmZXJyZWQgbWVzc2FnZSBxdWV1ZSBsaW1EZWZlcnJlZE1zZ1EuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VRdWV1ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRTaXJNc2dRICBsaW1Nc2cgPSB7IDAsIDAsIDAgfTsKKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfTElOVVgpIHx8IGRlZmluZWQoQU5JX09TX1RZUEVfT1NYKQorICAgIHdoaWxlIChUWF9TVUNDRVNTID09IHR4X3F1ZXVlX3JlY2VpdmUoJnBNYWMtPnN5cy5nU2lyTGltRGVmZXJyZWRNc2dRLCAodm9pZCAqKSAmbGltTXNnLCBUWF9OT19XQUlUKSkKKyAgICB7CisgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIlByb2Nlc3NpbmcgZGVmZXJyZWQgbWVzc2FnZSAlWFxuIiksIGxpbU1zZy50eXBlKTspCisgICAgICAgIGxpbVByaW50TXNnTmFtZShwTWFjLCBMT0czLCBsaW1Nc2cudHlwZSk7CisgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtRGVmZXJyZWRNc2dzLS07CisgICAgICAgIGxpbVByb2Nlc3NNZXNzYWdlcyhwTWFjLCAmbGltTXNnKTsKKworICAgICAgICBpZih0cnVlICE9IEdFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorI2Vsc2UKKyAgICB0U2lyTXNnUSAqcmVhZE1zZzsKKyAgICB0QU5JX1UxNiAgc2l6ZTsKKworICAgIC8qCisgICAgKiogY2hlY2sgYW55IGRlZmVycmVkIG1lc3NhZ2VzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCisgICAgKiovCisgICAgc2l6ZSA9IHBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemU7CisgICAgaWYgKHNpemUgPiAwKQorICAgIHsKKyAgICAgICAgd2hpbGUgKChyZWFkTXNnID0gbGltUmVhZERlZmVycmVkTXNnUShwTWFjKSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTgqKSAmbGltTXNnLAorICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCopIHJlYWRNc2csIHNpemVvZih0U2lyTXNnUSkpOworICAgICAgICAgICAgc2l6ZS0tOyAKKyAgICAgICAgICAgIGxpbVByb2Nlc3NNZXNzYWdlcyhwTWFjLCAmbGltTXNnKTsKKworICAgICAgICAgICAgaWYoKGxpbUlzU3lzdGVtSW5TY2FuU3RhdGUocE1hYykpIHx8ICh0cnVlICE9IEdFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMpKSB8fAorICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1TeXN0ZW1JblNjYW5MZWFybk1vZGUpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2VuZGlmCit9IC8qKiogZW5kIGxpbVByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VRdWV1ZSgpICoqKi8KKworCisvKgorICogbGltUHJvY2Vzc05vcm1hbEhkZE1zZworICogRnVuY3Rpb246IHRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBjdXJyZW50IGxpbSBzdGF0ZSBhbmQgZGVjaWRlIHdoZXRoZXIgdGhlIG1lc3NhZ2UgcGFzc2VkIHNoYWxsIGJlIGRlZmZlcmVkLgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogICAgICAgICBwTGltTXNnIC0tIHRoZSBtZXNzYWdlIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCisgKiAgICAgICAgIGZSc3BSZXFkIC0tIHdoZXRoZXIgcmV0dXJuIHJlc3VsdCB0byBoZGQKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbVByb2Nlc3NOb3JtYWxIZGRNc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKnBMaW1Nc2csIHRBTklfVTggZlJzcFJlcWQpCit7CisgICAgdEFOSV9CT09MRUFOIGZEZWZlck1zZyA9IGVBTklfQk9PTEVBTl9UUlVFOworCisgICAgLyogQWRkZWQgRm9yIEJULUFNUCBTdXBwb3J0ICovICAKKyAgICBpZiAoKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpIHx8KHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8KHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8KHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX1VOS05PV05fUk9MRSkpCisgICAgeworICAgICAgICAvKiogVGhpcyBjaGVjayBpcyByZXF1aXJlZCBvbmx5IGZvciB0aGUgQVAgYW5kIGluIDIgY2FzZXMuCisgICAgICAgICAqIDEuIElmIHdlIGFyZSBpbiBsZWFybiBtb2RlIGFuZCB3ZSByZWNlaXZlIGFueSBvZiB0aGVzZSBtZXNzYWdlcywKKyAgICAgICAgICogeW91IGhhdmUgdG8gY29tZSBvdXQgb2Ygc2NhbiBhbmQgcHJvY2VzcyB0aGUgbWVzc2FnZSwgaGVuY2UgZG9udAorICAgICAgICAgKiBkZWZlciB0aGUgbWVzc2FnZSBoZXJlLiBJbiBoYW5kbGVyLCB0aGVzZSBtZXNzYWdlIGNvdWxkIGJlIGRlZmVyZWQKKyAgICAgICAgICogdGlsbCB3ZSBhY3R1YWxseSBjb21lIG91dCBvZiBzY2FuIG1vZGUuCisgICAgICAgICAqIDIuIElmIHJhZGFyIGlzIGRldGVjdGVkLCB5b3UgbWlnaHQgaGF2ZSB0byBkZWZlciBhbGwgb2YgdGhlc2UKKyAgICAgICAgICogbWVzc2FnZXMgZXhjZXB0IFN0b3AgQlNTIHJlcXVlc3QvIFN3aXRjaCBjaGFubmVsIHJlcXVlc3QuIFRoaXMKKyAgICAgICAgICogZGVjaXNpb24gaXMgYWxzbyBtYWRlIGluc2lkZSBpdHMgaGFuZGxlci4KKyAgICAgICAgICoKKyAgICAgICAgICogUGxlYXNlIGJlIGNhcmVmdWwgd2hpbGUgdXNpbmcgdGhlIGZsYWcgZkRlZmVyTXNnLiBQb3NzaWJseSB5b3UKKyAgICAgICAgICogbWlnaHQgZW5kIHVwIGluIGFuIGluZmluaXRlIGxvb3AuCisgICAgICAgICAqKi8KKyAgICAgICAgaWYgKCgocExpbU1zZy0+dHlwZSA9PSBlV05JX1NNRV9TVEFSVF9CU1NfUkVRKSB8fAorICAgICAgICAgICAgIChwTGltTXNnLT50eXBlID09IGVXTklfU01FX1NUT1BfQlNTX1JFUSkgfHwKKyAgICAgICAgICAgICAocExpbU1zZy0+dHlwZSA9PSBlV05JX1NNRV9TV0lUQ0hfQ0hMX1JFUSkgfHwKKyAgICAgICAgICAgICAocExpbU1zZy0+dHlwZSA9PSBlV05JX1NNRV9TV0lUQ0hfQ0hMX0NCX1NFQ09OREFSWV9SRVEpIHx8CisgICAgICAgICAgICAgKHBMaW1Nc2ctPnR5cGUgPT0gZVdOSV9TTUVfU1dJVENIX0NITF9DQl9QUklNQVJZX1JFUSkpKQorICAgICAgICB7CisgICAgICAgICAgICBmRGVmZXJNc2cgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBsaW1JbnN5c3RlbUluc2NhblN0YXRlKCkgcmVmZXJzIHRoZSBwc2Vzc2lvbkVudHJ5LCAgaG93IHRvIGdldCBzZXNzaW9uIEVudHJ5Pz8/PyovCisgICAgaWYgKCgocE1hYy0+bGltLmdMaW1BZGR0c1NlbnQpIHx8IChsaW1Jc1N5c3RlbUluU2NhblN0YXRlKHBNYWMpKSB8fAorICAgICAgICAgICAgICAgIChMSU1fSVNfUkFEQVJfREVURUNURUQocE1hYykpKSAmJiBmRGVmZXJNc2cpCisgICAgeworICAgICAgICAvLyBTeXN0ZW0gaXMgaW4gREZTIChMZWFybikgbW9kZSBvciBhd2FpdGluZyBhZGR0cyByZXNwb25zZQorICAgICAgICAvLyBvciBpZiByYWRhciBpcyBkZXRlY3RlZCwgRGVmZXIgcHJvY2Vzc3NpbmcgdGhpcyBtZXNzYWdlCisgICAgICAgIGlmIChsaW1EZWZlck1zZyhwTWFjLCBwTGltTXNnKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisjaWZkZWYgV0xBTl9ERUJVRyAgICAgICAgICAgIAorICAgICAgICAgICAgcE1hYy0+bGltLm51bVNtZSsrOworI2VuZGlmCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gRGVmZXIgbWVzc2FnZSgweCVYKSBsaW1TbWVTdGF0ZSAlZCAocHJldiBzbWUgc3RhdGUgJWQpIHN5c1JvbGUgJWQgbWxtIHN0YXRlICVkIChwcmV2IG1sbSBzdGF0ZSAlZClcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcExpbU1zZy0+dHlwZSwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSwgIHBNYWMtPmxpbS5nTGltUHJldlNtZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlLCAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSwgIHBNYWMtPmxpbS5nTGltUHJldk1sbVN0YXRlKTspCisgICAgICAgICAgICBsaW1Mb2dTZXNzaW9uU3RhdGVzKHBNYWMpOworICAgICAgICAgICAgbGltUHJpbnRNc2dOYW1lKHBNYWMsIExPR0UsIHBMaW1Nc2ctPnR5cGUpOworICAgICAgICAgICAgLy8gUmVsZWFzZSBib2R5CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTGltTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihmUnNwUmVxZCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlc2UgbWVzc2FnZXMgYXJlIGZyb20gSERECisgICAgICAgICAgICAvLyBTaW5jZSB0aGVzZSByZXF1ZXN0cyBtYXkgYWxzbyBiZSBnZW5lcmF0ZWQKKyAgICAgICAgICAgIC8vIGludGVybmFsbHkgd2l0aGluIExJTSBtb2R1bGUsIG5lZWQgdG8KKyAgICAgICAgICAgIC8vIGRpc3RpbnF1aXNoIGFuZCBzZW5kIHJlc3BvbnNlIHRvIGhvc3QKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltUnNwUmVxZCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICB9CisjaWZkZWYgV0xBTl9ERUJVRyAgICAgICAgICAgIAorICAgICAgICBwTWFjLT5saW0ubnVtU21lKys7CisjZW5kaWYKKyAgICAgICAgaWYobGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzKHBNYWMsIHBMaW1Nc2cpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZWxlYXNlIGJvZHkKKyAgICAgICAgICAgIC8vIGxpbVByb2Nlc3NTbWVSZXFNZXNzYWdlIGNvbnN1bWVkIHRoZSBidWZmZXIuIFdlIGNhbiBmcmVlIGl0LgorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcExpbU1zZy0+Ym9keXB0cik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQKK2hhbmRsZUhUQ2FwYWJpbGl0eWFuZEhUSW5mbyhzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYykKK3sKKyAgICB0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyBtYWNIVENhcGFiaWxpdHlJbmZvOworICAgIHRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvIG1hY0hUUGFyYW1ldGVyc0luZm87CisgICAgdFNpck1hY0hUSW5mb0ZpZWxkMSBtYWNIVEluZm9GaWVsZDE7CisgICAgdFNpck1hY0hUSW5mb0ZpZWxkMiBtYWNIVEluZm9GaWVsZDI7CisgICAgdFNpck1hY0hUSW5mb0ZpZWxkMyBtYWNIVEluZm9GaWVsZDM7CisgICAgdEFOSV9VMzIgIGNmZ1ZhbHVlOworICAgIHRBTklfVTggKnB0cjsKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gJnBNYWMtPmxpbS5ncFNlc3Npb25bMF07Ly9UQkQtUkFKRVNIIEhPVyBUTyBHRVQgc2Vzc2lvbkVudHJ5Pz8/Pz8KKworICAgIHBNYWMtPmxpbS5odENhcGFiaWxpdHkgPSBJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSk7ICAKKworCisKKyAgICAvLyBHZXQgSFQgQ2FwYWJpbGl0aWVzCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsIHRvIHJldHJpZXZlIFdOSV9DRkdfSFRfQ0FQX0lORk8gdmFsdWVcbiIpKTsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgcHRyID0gKHRBTklfVTggKikgJm1hY0hUQ2FwYWJpbGl0eUluZm87CisgICAgKigodEFOSV9VMTYgKilwdHIpID0gICh0QU5JX1UxNikgKGNmZ1ZhbHVlICYgMHhmZmZmKTsKKyAgICBwTWFjLT5saW0uZ0hUTHNpZ1RYT1BQcm90ZWN0aW9uID0gKHRBTklfVTgpbWFjSFRDYXBhYmlsaXR5SW5mby5sc2lnVFhPUFByb3RlY3Rpb247CisgICAgcE1hYy0+bGltLmdIVE1JTU9QU1N0YXRlID0gKHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSkgbWFjSFRDYXBhYmlsaXR5SW5mby5taW1vUG93ZXJTYXZlOworICAgIHBNYWMtPmxpbS5nSFRHcmVlbmZpZWxkID0gKHRBTklfVTgpbWFjSFRDYXBhYmlsaXR5SW5mby5ncmVlbkZpZWxkOworICAgIHBNYWMtPmxpbS5nSFRNYXhBbXNkdUxlbmd0aCA9ICh0QU5JX1U4KW1hY0hUQ2FwYWJpbGl0eUluZm8ubWF4aW1hbEFNU0RVc2l6ZTsKKyAgICBwTWFjLT5saW0uZ0hUU2hvcnRHSTIwTWh6ID0gKHRBTklfVTgpbWFjSFRDYXBhYmlsaXR5SW5mby5zaG9ydEdJMjBNSHo7CisgICAgcE1hYy0+bGltLmdIVFNob3J0R0k0ME1oeiA9ICh0QU5JX1U4KW1hY0hUQ2FwYWJpbGl0eUluZm8uc2hvcnRHSTQwTUh6OworICAgIHBNYWMtPmxpbS5nSFRTdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPSAodEFOSV9VOCltYWNIVENhcGFiaWxpdHlJbmZvLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKyAgICBwTWFjLT5saW0uZ0hUUFNNUFN1cHBvcnQgPSAodEFOSV9VOCltYWNIVENhcGFiaWxpdHlJbmZvLnBzbXA7CisgICAgcE1hYy0+bGltLmdIVERzc3NDY2tSYXRlNDBNSHpTdXBwb3J0ID0gKHRBTklfVTgpbWFjSFRDYXBhYmlsaXR5SW5mby5kc3NzQ2NrTW9kZTQwTUh6OworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSFRfQU1QRFVfUEFSQU1TLCAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbCB0byByZXRyaWV2ZSBXTklfQ0ZHX0hUX1BBUkFNX0lORk8gdmFsdWVcbiIpKTsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgcHRyID0gKHRBTklfVTggKikgJm1hY0hUUGFyYW1ldGVyc0luZm87CisgICAgKnB0ciA9ICAodEFOSV9VOCkgKGNmZ1ZhbHVlICYgMHhmZik7CisgICAgcE1hYy0+bGltLmdIVEFNcGR1RGVuc2l0eSA9ICh0QU5JX1U4KW1hY0hUUGFyYW1ldGVyc0luZm8ubXBkdURlbnNpdHk7CisgICAgcE1hYy0+bGltLmdIVE1heFJ4QU1wZHVGYWN0b3IgPSAodEFOSV9VOCltYWNIVFBhcmFtZXRlcnNJbmZvLm1heFJ4QU1QRFVGYWN0b3I7CisKKyAgICAvLyBHZXQgSFQgSUUgSW5mbworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0hUX0lORk9fRklFTEQxLCAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbCB0byByZXRyaWV2ZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQxIHZhbHVlXG4iKSk7CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIHB0ciA9ICh0QU5JX1U4ICopICZtYWNIVEluZm9GaWVsZDE7CisgICAgKigodEFOSV9VOCAqKXB0cikgPSAgKHRBTklfVTgpIChjZmdWYWx1ZSAmIDB4ZmYpOworICAgIHBNYWMtPmxpbS5nSFRTZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSA9ICh0QU5JX1U4KW1hY0hUSW5mb0ZpZWxkMS5zZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eTsKKyAgICBwTWFjLT5saW0uZ0hUQ29udHJvbGxlZEFjY2Vzc09ubHkgPSAodEFOSV9VOCltYWNIVEluZm9GaWVsZDEuY29udHJvbGxlZEFjY2Vzc09ubHk7CisgICAgcE1hYy0+bGltLmdIVFJpZnNNb2RlID0gKHRBTklfVTgpbWFjSFRJbmZvRmllbGQxLnJpZnNNb2RlOworICAgIHBNYWMtPmxpbS5nSFRSZWNvbW1lbmRlZFR4V2lkdGhTZXQgPSAodEFOSV9VOCltYWNIVEluZm9GaWVsZDEucmVjb21tZW5kZWRUeFdpZHRoU2V0OworICAgIHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gKHRTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQpbWFjSFRJbmZvRmllbGQxLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IVF9JTkZPX0ZJRUxEMiwgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkZhaWwgdG8gcmV0cmlldmUgV05JX0NGR19IVF9JTkZPX0ZJRUxEMiB2YWx1ZVxuIikpOworICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICBwdHIgPSAodEFOSV9VOCAqKSAmbWFjSFRJbmZvRmllbGQyOworICAgICooKHRBTklfVTE2ICopcHRyKSA9ICh0QU5JX1UxNikgKGNmZ1ZhbHVlICYgMHhmZmZmKTsKKyAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUgPSAodFNpck1hY0hUT3BlcmF0aW5nTW9kZSkgbWFjSFRJbmZvRmllbGQyLm9wTW9kZTsKKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0hUX0lORk9fRklFTEQzLCAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbCB0byByZXRyaWV2ZSBXTklfQ0ZHX0hUX0lORk9fRklFTEQzIHZhbHVlXG4iKSk7CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIHB0ciA9ICh0QU5JX1U4ICopICZtYWNIVEluZm9GaWVsZDM7CisgICAgKigodEFOSV9VMTYgKilwdHIpID0gKHRBTklfVTE2KSAoY2ZnVmFsdWUgJiAweGZmZmYpOworICAgIHBNYWMtPmxpbS5nSFRQQ09BY3RpdmUgPSAodEFOSV9VOCltYWNIVEluZm9GaWVsZDMucGNvQWN0aXZlOworICAgIHBNYWMtPmxpbS5nSFRQQ09QaGFzZSA9ICh0QU5JX1U4KW1hY0hUSW5mb0ZpZWxkMy5wY29QaGFzZTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0gKHRBTklfVTgpbWFjSFRJbmZvRmllbGQzLmxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OworICAgIHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlCZWFjb24gPSAodEFOSV9VOCltYWNIVEluZm9GaWVsZDMuc2Vjb25kYXJ5QmVhY29uOworICAgIHBNYWMtPmxpbS5nSFREdWFsQ1RTUHJvdGVjdGlvbiA9ICh0QU5JX1U4KW1hY0hUSW5mb0ZpZWxkMy5kdWFsQ1RTUHJvdGVjdGlvbjsKKyAgICBwTWFjLT5saW0uZ0hUU1RCQ0Jhc2ljTUNTID0gKHRBTklfVTgpbWFjSFRJbmZvRmllbGQzLmJhc2ljU1RCQ01DUzsKK30KKwordm9pZCBsaW1Mb2dTZXNzaW9uU3RhdGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisjaWZkZWYgV0xBTl9ERUJVRworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgcE1hYy0+bGltLm1heEJzc0lkOyBpKyspCisgICAgeworICAgICAgICBpZihwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJTZXNzaW9uWyVkXSBzeXNSb2xlKCVkKSBsaW1TbWVTdGF0ZSAlZCAocHJldiBzbWUgc3RhdGUgJWQpIG1sbSBzdGF0ZSAlZCAocHJldiBtbG0gc3RhdGUgJWQpXG4iKSwKKyAgICAgICAgICAgICAgICAgICBpLCBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUsICBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbVNtZVN0YXRlLCAgCisgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1QcmV2U21lU3RhdGUsICAgcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1NbG1TdGF0ZSwgIAorICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltUHJldk1sbVN0YXRlKTspCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy9pZmRlZiBXTEFOX0RFQlVHCit9CmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NNbG1SZXFNZXNzYWdlcy5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzTWxtUmVxTWVzc2FnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGU1MzFkCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzTWxtUmVxTWVzc2FnZXMuYwpAQCAtMCwwICsxLDQzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1Qcm9jZXNzTWxtTWVzc2FnZXMuY2MgY29udGFpbnMgdGhlIGNvZGUKKyAqIGZvciBwcm9jZXNzaW5nIE1MTSByZXF1ZXN0IG1lc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTIvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2luY2x1ZGUgInBhbFR5cGVzLmgiCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisjZWxzZQorI2luY2x1ZGUgInduaUNmZ1N0YS5oIgorI2VuZGlmCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAic2lyUGFyYW1zLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisKKyNpbmNsdWRlICJzY2hBcGkuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVV0aWxzLmgiCisjaW5jbHVkZSAibGltQXNzb2NVdGlscy5oIgorI2luY2x1ZGUgImxpbVByb3BFeHRzVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZWN1cml0eVV0aWxzLmgiCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisjaW5jbHVkZSAicG1tQXBpLmgiCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisvLyNpbmNsdWRlICJsaW1TZXNzaW9uVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZXNzaW9uVXRpbHMuaCIKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2luY2x1ZGUgPGxpbUZULmg+CisjZW5kaWYKKworCisKKy8vIE1MTSBSRVEgcHJvY2Vzc2luZyBmdW5jdGlvbiB0ZW1wbGF0ZXMKK3N0YXRpYyB2b2lkIGxpbVByb2Nlc3NNbG1TdGFydFJlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7CitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzTWxtU2NhblJlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7CitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzTWxtSm9pblJlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7CitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzTWxtQXV0aFJlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7CitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzTWxtQXNzb2NSZXEodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworc3RhdGljIHZvaWQgbGltUHJvY2Vzc01sbVJlYXNzb2NSZXEodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworc3RhdGljIHZvaWQgbGltUHJvY2Vzc01sbURpc2Fzc29jUmVxKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3N0YXRpYyB2b2lkIGxpbVByb2Nlc3NNbG1EZWF1dGhSZXEodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworc3RhdGljIHZvaWQgbGltUHJvY2Vzc01sbVNldEtleXNSZXEodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworCitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzTWxtQWRkQkFSZXEoIHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqICk7CitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzTWxtQWRkQkFSc3AoIHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqICk7CitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzTWxtRGVsQkFSZXEoIHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqICk7CisKKy8vIE1MTSBUaW1lb3V0IGV2ZW50IGhhbmRsZXIgdGVtcGxhdGVzCitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzTWluQ2hhbm5lbFRpbWVvdXQodHBBbmlTaXJHbG9iYWwpOworc3RhdGljIHZvaWQgbGltUHJvY2Vzc01heENoYW5uZWxUaW1lb3V0KHRwQW5pU2lyR2xvYmFsKTsKK3N0YXRpYyB2b2lkIGxpbVByb2Nlc3NQZXJpb2RpY1Byb2JlUmVxVGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzSm9pbkZhaWx1cmVUaW1lb3V0KHRwQW5pU2lyR2xvYmFsKTsKK3N0YXRpYyB2b2lkIGxpbVByb2Nlc3NBdXRoRmFpbHVyZVRpbWVvdXQodHBBbmlTaXJHbG9iYWwpOworc3RhdGljIHZvaWQgbGltUHJvY2Vzc0F1dGhSc3BUaW1lb3V0KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMik7CitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzQXNzb2NGYWlsdXJlVGltZW91dCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIpOworCitzdGF0aWMgdm9pZCBsaW1Qcm9jZXNzTWxtUmVtb3ZlS2V5UmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICogcE1zZ0J1Zik7Cit2b2lkIAorbGltU2V0Q2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiB0aXRhbkh0Y2FwLCB0QU5JX1U4IGNoYW5uZWwsIHRQb3dlcmRCbSBtYXhUeFBvd2VyLCB0QU5JX1U4IHBlU2Vzc2lvbklkKTsKKworCisvKgorICogZGV0ZXJtaW5lIHRoZSBzZWNvbmRhcnkgY2hhbm5lbCBzdGF0ZSBmb3IgaGFsCisgKi8KK3N0YXRpYyBlUGh5Q2hhbkJvbmRTdGF0ZQorbWxtX2dldF9leHRfY2hubCgKKyAgICB0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgdEFuaUNCU2Vjb25kYXJ5TW9kZSBjaG5sKQoreworICAgIGlmIChjaG5sID09IGVBTklfQ0JfU0VDT05EQVJZX1VQKQorICAgICAgICByZXR1cm4gUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZOworICAgIGlmIChjaG5sID09IGVBTklfQ0JfU0VDT05EQVJZX0RPV04pCisgICAgICAgIHJldHVybiBQSFlfRE9VQkxFX0NIQU5ORUxfSElHSF9QUklNQVJZOworICAgIHJldHVybiBQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQ7CisKK30KKworCisjZGVmaW5lIElTX01MTV9TQ0FOX1JFUV9CQUNLR1JPVU5EX1NDQU5fQUdHUkVTU0lWRShwTWFjKSAgICAocE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+YmFja2dyb3VuZFNjYW5Nb2RlID09IGVTSVJfQUdHUkVTU0lWRV9CQUNLR1JPVU5EX1NDQU4pCisKKworLyoqCisgKiBsaW1Qcm9jZXNzTWxtUmVxTWVzc2FnZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qb3N0TWxtTWVzc2FnZSgpLiBUaGlzCisgKiBmdW5jdGlvbiBoYW5kbGVzIE1MTSBwcmltaXRpdmVzIGludm9rZWQgYnkgU01FLgorICoKKyAqTE9HSUM6CisgKiBEZXBlbmRpbmcgb24gdGhlIG1lc3NhZ2UgdHlwZSwgY29ycmVzcG9uZGluZyBmdW5jdGlvbiB3aWxsIGJlCisgKiBjYWxsZWQuCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIDEuIFVwb24gcmVjZWl2aW5nIEJlYWNvbiBpbiBXVF9KT0lOX1NUQVRFLCBNTE0gbW9kdWxlIGludm9rZXMKKyAqICAgIEFQSXMgZXhwb3NlZCBieSBCZWFjb24gUHJvY2Vzc2luZyBtb2R1bGUgZm9yIHNldHRpbmcgcGFyYW1ldGVycworICogICAgYXQgTUFDIGhhcmR3YXJlLgorICogMi4gSWYgYXR0ZW1wdCB0byBSZWFzc29jaWF0ZSB3aXRoIGFuIEFQIGZhaWxzLCBsaW5rIHdpdGggY3VycmVudAorICogICAgQVAgaXMgcmVzdG9yZWQgYmFjay4KKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gbXNnVHlwZSAgIEluZGljYXRlcyB0aGUgTUxNIHByaW1pdGl2ZSBtZXNzYWdlIHR5cGUKKyAqIEBwYXJhbSAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1Qcm9jZXNzTWxtUmVxTWVzc2FnZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIE1zZykKK3sKKyAgICBzd2l0Y2ggKE1zZy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgTElNX01MTV9TVEFSVF9SRVE6ICAgICAgICAgICAgIGxpbVByb2Nlc3NNbG1TdGFydFJlcShwTWFjLCBNc2ctPmJvZHlwdHIpOyAgIGJyZWFrOworICAgICAgICBjYXNlIExJTV9NTE1fU0NBTl9SRVE6ICAgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtU2NhblJlcShwTWFjLCBNc2ctPmJvZHlwdHIpOyAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSU1fTUxNX0pPSU5fUkVROiAgICAgICAgICAgICAgbGltUHJvY2Vzc01sbUpvaW5SZXEocE1hYywgTXNnLT5ib2R5cHRyKTsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9BVVRIX1JFUTogICAgICAgICAgICAgIGxpbVByb2Nlc3NNbG1BdXRoUmVxKHBNYWMsIE1zZy0+Ym9keXB0cik7ICAgIGJyZWFrOworICAgICAgICBjYXNlIExJTV9NTE1fQVNTT0NfUkVROiAgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtQXNzb2NSZXEocE1hYywgTXNnLT5ib2R5cHRyKTsgICBicmVhazsKKyAgICAgICAgY2FzZSBMSU1fTUxNX1JFQVNTT0NfUkVROiAgICAgICAgICAgbGltUHJvY2Vzc01sbVJlYXNzb2NSZXEocE1hYywgTXNnLT5ib2R5cHRyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9ESVNBU1NPQ19SRVE6ICAgICAgICAgIGxpbVByb2Nlc3NNbG1EaXNhc3NvY1JlcShwTWFjLCBNc2ctPmJvZHlwdHIpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9ERUFVVEhfUkVROiAgICAgICAgICAgIGxpbVByb2Nlc3NNbG1EZWF1dGhSZXEocE1hYywgTXNnLT5ib2R5cHRyKTsgIGJyZWFrOworICAgICAgICBjYXNlIExJTV9NTE1fU0VUS0VZU19SRVE6ICAgICAgICAgICBsaW1Qcm9jZXNzTWxtU2V0S2V5c1JlcShwTWFjLCBNc2ctPmJvZHlwdHIpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9SRU1PVkVLRVlfUkVROiAgICAgICAgIGxpbVByb2Nlc3NNbG1SZW1vdmVLZXlSZXEocE1hYywgTXNnLT5ib2R5cHRyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX0xJTV9NSU5fQ0hBTk5FTF9USU1FT1VUOiAgIGxpbVByb2Nlc3NNaW5DaGFubmVsVGltZW91dChwTWFjKTsgIGJyZWFrOworICAgICAgICBjYXNlIFNJUl9MSU1fTUFYX0NIQU5ORUxfVElNRU9VVDogICBsaW1Qcm9jZXNzTWF4Q2hhbm5lbFRpbWVvdXQocE1hYyk7ICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTElNX1BFUklPRElDX1BST0JFX1JFUV9USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVByb2Nlc3NQZXJpb2RpY1Byb2JlUmVxVGltZXIocE1hYyk7ICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTElNX0pPSU5fRkFJTF9USU1FT1VUOiAgICAgbGltUHJvY2Vzc0pvaW5GYWlsdXJlVGltZW91dChwTWFjKTsgIGJyZWFrOworICAgICAgICBjYXNlIFNJUl9MSU1fQVVUSF9GQUlMX1RJTUVPVVQ6ICAgICBsaW1Qcm9jZXNzQXV0aEZhaWx1cmVUaW1lb3V0KHBNYWMpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX0xJTV9BVVRIX1JTUF9USU1FT1VUOiAgICAgIGxpbVByb2Nlc3NBdXRoUnNwVGltZW91dChwTWFjLCBNc2ctPmJvZHl2YWwpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX0xJTV9BU1NPQ19GQUlMX1RJTUVPVVQ6ICAgIGxpbVByb2Nlc3NBc3NvY0ZhaWx1cmVUaW1lb3V0KHBNYWMsIE1zZy0+Ym9keXZhbCk7ICBicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICBjYXNlIFNJUl9MSU1fRlRfUFJFQVVUSF9SU1BfVElNRU9VVDpsaW1Qcm9jZXNzRlRQcmVhdXRoUnNwVGltZW91dChwTWFjKTsgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIGNhc2UgU0lSX0xJTV9SRU1BSU5fQ0hOX1RJTUVPVVQ6ICAgIGxpbVByb2Nlc3NSZW1haW5PbkNoblRpbWVvdXQocE1hYyk7IGJyZWFrOworI2VuZGlmCisgICAgICAgIGNhc2UgTElNX01MTV9BRERCQV9SRVE6ICAgICAgICAgICAgIGxpbVByb2Nlc3NNbG1BZGRCQVJlcSggcE1hYywgTXNnLT5ib2R5cHRyICk7IGJyZWFrOworICAgICAgICBjYXNlIExJTV9NTE1fQUREQkFfUlNQOiAgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtQWRkQkFSc3AoIHBNYWMsIE1zZy0+Ym9keXB0ciApOyBicmVhazsKKyAgICAgICAgY2FzZSBMSU1fTUxNX0RFTEJBX1JFUTogICAgICAgICAgICAgbGltUHJvY2Vzc01sbURlbEJBUmVxKCBwTWFjLCBNc2ctPmJvZHlwdHIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9UU1BFQ19SRVE6ICAgICAgICAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gLy8gc3dpdGNoIChtc2dUeXBlKQorfSAvKioqIGVuZCBsaW1Qcm9jZXNzTWxtUmVxTWVzc2FnZXMoKSAqKiovCisKKworLyoqCisgKiBsaW1TZXRTY2FuTW9kZSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldHVwIHN5c3RlbSBpbnRvIFNjYW4gbW9kZQorICoKKyAqTE9HSUM6CisgKiBOQQorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1TZXRTY2FuTW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRTaXJMaW5rVHJhZmZpY0NoZWNrIGNoZWNrVHJhZmZpYzsKKworICAgIC8vLyBTZXQgY3VycmVudCBzY2FuIGNoYW5uZWwgaWQgdG8gdGhlIGZpcnN0IGluIHRoZSBjaGFubmVsIGxpc3QKKyAgICBwTWFjLT5saW0uZ0xpbUN1cnJlbnRTY2FuQ2hhbm5lbElkID0gMDsKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UICAgICAgICAgCisgICAgICAgaWYgKCBJU19NTE1fU0NBTl9SRVFfQkFDS0dST1VORF9TQ0FOX0FHR1JFU1NJVkUocE1hYykgKQorICAgICAgICAgICBjaGVja1RyYWZmaWMgPSBlU0lSX0RPTlRfQ0hFQ0tfTElOS19UUkFGRklDX0JFRk9SRV9TQ0FOOworICAgICAgIGVsc2UgCisgICAgICAgICAgIGNoZWNrVHJhZmZpYyA9IGVTSVJfQ0hFQ0tfTElOS19UUkFGRklDX0JFRk9SRV9TQ0FOOworI2Vsc2UKKyAgICAgICAgICAgIC8qIEN1cnJlbnRseSBjaGVja2luZyB0aGUgdHJhZmZpYyBiZWZvcmUgc2NhbiBmb3IgTGludXggc3RhdGlvbi4gVGhpcyBpcyBiZWNhdXNlIE1MTQorICAgICAgICAgICAgICogc2NhbiByZXF1ZXN0IGlzIG5vdCBmaWxsZWQgYXMgc2NhbiBpcyByZWNlaXZlZCB2aWEgTWVhc3VyZW1lbnQgcmVxIGluIExpbnV4LiBUaGlzCisgICAgICAgICAgICAgKiBzaG91bGQgYmUgbWFkZSBhcyBjb21tb24gY29kZSBmb3IgV2luZG93cy9MaW51eCBzdGF0aW9uIG9uY2UgdGhlIHNjYW4gcmVxdWVzdHMgYXJlCisgICAgICAgICAgICAgKiBlbmFibGVkIGluIExpbnV4CisgICAgICAgICAgICAgKiBUT0RPICovCisgICAgICAgICAgICBjaGVja1RyYWZmaWMgPSBlU0lSX0NIRUNLX0xJTktfVFJBRkZJQ19CRUZPUkVfU0NBTjsKKyNlbmRpZgorCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiQ2FsbGluZyBsaW1TZW5kSGFsSW5pdFNjYW5SZXFcbiIpKTspCisgICAgbGltU2VuZEhhbEluaXRTY2FuUmVxKHBNYWMsIGVMSU1fSEFMX0lOSVRfU0NBTl9XQUlUX1NUQVRFLCBjaGVja1RyYWZmaWMpOworCisgICAgcmV0dXJuIDsKK30gLyoqKiBlbmQgbGltU2V0U2Nhbk1vZGUoKSAqKiovCisKKy8vV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZAorCisvKiBsaW1Jc0xpbmtTdXNwZW5kZWQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaXMgbGluayBpcyBzdXNwZW5kZWQgb3Igbm90LgorICoKKyAqTE9HSUM6CisgKiBTaW5jZSBTdXNwZW4gbGluayB1c2VzIGluaXQgc2NhbiwgaXQganVzdCByZXR1cm5zIAorICogICAgICAgICAgICAgICAgICAgIGdMaW1TeXN0ZW1JblNjYW5MZWFybk1vZGUgZmxhZy4gCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCit0QU5JX1U4CitsaW1Jc0xpbmtTdXNwZW5kZWQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICByZXR1cm4gcE1hYy0+bGltLmdMaW1TeXN0ZW1JblNjYW5MZWFybk1vZGU7IAorfQorLyoqCisgKiBsaW1TdXNwZW5kTGluaygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN1c3BlbmQgdHJhZmZpYy4gSW50ZXJuYWxseSB0aGlzIGZ1bmN0aW9uIHVzZXMgV0RBX0lOSVRfU0NBTl9SRVEuCisgKgorICpMT0dJQzoKKyAqIE5BCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSB0cmFmZmljQ2hlY2sgLSBUYWtlcyB2YWx1ZSBmcm9tIGVudW0gdFNpckxpbmtUcmFmZmljQ2hlY2suIAorICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHN1c3BlbmRpbmcgdGhlIGxpbmsuCisgKiBAcGFyYW0gZGF0YSAtIFBvaW50ZXIgdG8gYW55IGJ1ZmZlciB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGNhbGxiYWNrLgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVN1c3BlbmRMaW5rKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJMaW5rVHJhZmZpY0NoZWNrIHRyYWZmaWNDaGVjaywgIFNVU1BFTkRfUkVTVU1FX0xJTktfQ0FMTEJBQ0sgY2FsbGJhY2ssIHRBTklfVTMyICpkYXRhKQoreworICAgaWYoIE5VTEwgPT0gY2FsbGJhY2sgKQorICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6JWQ6IEludmFsaWQgcGFyYW1ldGVyc1xuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyApOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiggcE1hYy0+bGltLmdwTGltU3VzcGVuZENhbGxiYWNrICkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgIiVzOiVkOiBnTGltU3VzcGVuZExpbmsgY2FsbGJhY2sgaXMgbm90IE5VTEwuLi5zb21ldGhpbmcgaXMgd3JvbmdcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18gKTsKKyAgICAgIGNhbGxiYWNrKCBwTWFjLCBlSEFMX1NUQVRVU19GQUlMVVJFLCBkYXRhICk7IAorICAgICAgcmV0dXJuOworICAgfQorCisgICBwTWFjLT5saW0uZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSA9IDE7CisgICBwTWFjLT5saW0uZ3BMaW1TdXNwZW5kQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgIHBNYWMtPmxpbS5ncExpbVN1c3BlbmREYXRhID0gZGF0YTsKKyAgIGxpbVNlbmRIYWxJbml0U2NhblJlcShwTWFjLCBlTElNX0hBTF9TVVNQRU5EX0xJTktfV0FJVF9TVEFURSwgdHJhZmZpY0NoZWNrICk7Cit9CisKKy8qKgorICogbGltUmVzdW1lTGluaygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIFJlc3VtZSB0cmFmZmljIGFmdGVyIGEgc3VzcGVuZC4gSW50ZXJuYWxseSB0aGlzIGZ1bmN0aW9uIHVzZXMgV0RBX0ZJTklTSF9TQ0FOX1JFUS4KKyAqCisgKkxPR0lDOgorICogTkEKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIFJlc3VtaW5nIHRoZSBsaW5rLgorICogQHBhcmFtIGRhdGEgLSBQb2ludGVyIHRvIGFueSBidWZmZXIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBjYWxsYmFjay4KKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1SZXN1bWVMaW5rKHRwQW5pU2lyR2xvYmFsIHBNYWMsIFNVU1BFTkRfUkVTVU1FX0xJTktfQ0FMTEJBQ0sgY2FsbGJhY2ssIHRBTklfVTMyICpkYXRhKQoreworICAgaWYoIE5VTEwgPT0gY2FsbGJhY2sgKQorICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6JWQ6IEludmFsaWQgcGFyYW1ldGVyc1xuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyApOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiggcE1hYy0+bGltLmdwTGltUmVzdW1lQ2FsbGJhY2sgKQorICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6JWQ6IGdMaW1SZXN1bWVMaW5rIGNhbGxiYWNrIGlzIG5vdCBOVUxMLi4uc29tZXRoaW5nIGlzIHdyb25nXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fICk7CisgICAgICBjYWxsYmFjayggcE1hYywgZUhBTF9TVEFUVVNfRkFJTFVSRSwgZGF0YSApOyAKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcE1hYy0+bGltLmdwTGltUmVzdW1lQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgIHBNYWMtPmxpbS5ncExpbVJlc3VtZURhdGEgPSBkYXRhOworICAgbGltU2VuZEhhbEZpbmlzaFNjYW5SZXEocE1hYywgZUxJTV9IQUxfUkVTVU1FX0xJTktfV0FJVF9TVEFURSApOworfQorLy9lbmQgV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZAorCisKKy8qKgorICoKKyAqIGxpbUNoYW5nZUNoYW5uZWxXaXRoQ2FsbGJhY2soKQorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hhbmdlIGNoYW5uZWwgYW5kIHBlcmZvcm0gb2ZmIGNoYW5uZWwgb3BlcmF0aW9uCisgKiBpZiByZXF1aXJlZC4gVGhlIGNhbGxlciByZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIGNoYW5uZWwgY2hhbmdlLiAKKyAqCisgKi8KK3ZvaWQKK2xpbUNoYW5nZUNoYW5uZWxXaXRoQ2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBuZXdDaGFubmVsLCAKKyAgICBDSEFOR0VfQ0hBTk5FTF9DQUxMQkFDSyBjYWxsYmFjaywgCisgICAgdEFOSV9VMzIgKmNiZGF0YSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICAvLyBTYW5pdHkgY2hlY2tzIGZvciB0aGUgY3VycmVudCBhbmQgbmV3IGNoYW5uZWwKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICJTd2l0Y2hpbmcgY2hhbm5lbCB0byAlZFxuIiwgbmV3Q2hhbm5lbCk7KQorI2VuZGlmCisgICAgcHNlc3Npb25FbnRyeS0+Y2hhbm5lbENoYW5nZVJlYXNvbkNvZGU9TElNX1NXSVRDSF9DSEFOTkVMX09QRVJBVElPTjsKKworICAgIHBNYWMtPmxpbS5ncGNoYW5nZUNoYW5uZWxDYWxsYmFjayA9IGNhbGxiYWNrOworICAgIHBNYWMtPmxpbS5ncGNoYW5nZUNoYW5uZWxEYXRhID0gY2JkYXRhOworCisgICAgbGltU2VuZFN3aXRjaENobmxQYXJhbXMocE1hYywgbmV3Q2hhbm5lbCwKKyAgICAgICAgZUhUX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVF9OT05FLAorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCk7CisKKyAgICByZXR1cm47Cit9CisKKworLyoqCisgKiBsaW1Db250aW51ZVBvc3RDaGFubmVsU2NhbigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNjYW4gdGhlIGN1cnJlbnQgY2hhbm5lbC4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltQ29udGludWVQb3N0Q2hhbm5lbFNjYW4odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1U4IGNoYW5uZWxOdW07CisgICAgdEFOSV9VOCBoYW5kbGVFcnJvciA9IDA7CisgICAgdEFOSV9VOCBpID0gMDsKKyAgICB0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgICAKKyAgICBpZiggcE1hYy0+bGltLmFib3J0U2NhbiB8fCAoTlVMTCA9PSBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxICkgfHwKKyAgICAgICAgKHBNYWMtPmxpbS5nTGltQ3VycmVudFNjYW5DaGFubmVsSWQgPgorICAgICAgICAgICAgKHRBTklfVTMyKShwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyAtIDEpKSkKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5hYm9ydFNjYW4gPSAwOworICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9NSU5fQ0hBTk5FTF9USU1FUik7CisgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01BWF9DSEFOTkVMX1RJTUVSKTsKKyAgICAgICAgLy9TZXQgdGhlIHJlc3VtZSBjaGFubmVsIHRvIEFueSB2YWxpZCBjaGFubmVsIChpbnZhbGlkKS4gCisgICAgICAgIC8vVGhpcyB3aWxsIGluc3RydWN0IEhBTCB0byBzZXQgaXQgdG8gYW55IHByZXZpb3VzIHZhbGlkIGNoYW5uZWwuCisgICAgICAgIHBlU2V0UmVzdW1lQ2hhbm5lbChwTWFjLCAwLCAwKTsKKworICAgICAgICBsaW1TZW5kSGFsRmluaXNoU2NhblJlcShwTWFjLCBlTElNX0hBTF9GSU5JU0hfU0NBTl9XQUlUX1NUQVRFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNoYW5uZWxOdW0gPSBsaW1HZXRDdXJyZW50U2NhbkNoYW5uZWwocE1hYyk7CisgICAgaWYgKChwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5zY2FuVHlwZSA9PSBlU0lSX0FDVElWRV9TQ0FOKSAmJgorICAgICAgICAobGltQWN0aXZlU2NhbkFsbG93ZWQocE1hYywgY2hhbm5lbE51bSkpKQorICAgIHsKKyAgICAgICAgVFhfVElNRVIgKnBlcmlvZGljU2NhblRpbWVyOworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJBQ1RJVkUgU2NhbiBjaGFuICVkLCBzZW5kaW5nIHByb2JlXG4iKSwgY2hhbm5lbE51bSk7KQorCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFByZXBhcmUgYW5kIHNlbmQgUHJvYmUgUmVxdWVzdCBmcmFtZSBmb3IgYWxsIHRoZSBTU0lEcyBwcmVzZW50IGluIHRoZSBzYXZlZCBNTE0gCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPRzEsIEZMKCJzZW5kaW5nIFByb2JlUmVxIG51bWJlciAlZCwgZm9yIFNTSUQgJXMgb24gY2hhbm5lbDogJWRcbiIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPnNzSWRbaV0uc3NJZCwgY2hhbm5lbE51bSk7KQorICAgICAgICAgICAgLy8gaW5jbHVkZSBhZGRpdGlvbmFsIElFIGlmIHRoZXJlIGlzCisgICAgICAgICAgICBzdGF0dXMgPSBsaW1TZW5kUHJvYmVSZXFNZ210RnJhbWUoIHBNYWMsICZwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5zc0lkW2ldLAorICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+YnNzSWQsIGNoYW5uZWxOdW0sIHBNYWMtPmxpbS5nU2VsZk1hY0FkZHIsIAorICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+ZG90MTFtb2RlLAorICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+dUlFRmllbGRMZW4sCisgICAgICAgICAgICAgICAodEFOSV9VOCAqKShwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxKStwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT51SUVGaWVsZE9mZnNldCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJzZW5kIFByb2JlUmVxIGZhaWxlZCBmb3IgU1NJRCAlcyBvbiBjaGFubmVsOiAlZFxuIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+c3NJZFtpXS5zc0lkLCBjaGFubmVsTnVtKTspCisgICAgICAgICAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fTUlOX0NIQU5ORUxfVElNRVIpOworICAgICAgICAgICAgICAgIGxpbVNlbmRIYWxFbmRTY2FuUmVxKHBNYWMsIGNoYW5uZWxOdW0sIGVMSU1fSEFMX0VORF9TQ0FOX1dBSVRfU1RBVEUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfSB3aGlsZSAoaSA8IHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPm51bVNzaWQpOworCisgICAgICAgIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAgICAgICAgLy9JZiBtaW5DaGFubmVsVGltZSBpcyBzZXQgdG8gemVybywgU01FIGlzIHJlcXVlc3Rpbmcgc2NhbiB0byBub3QgdXNlIG1pbiBjaGFubmVsIHRpbWVyLgorICAgICAgICAgICAvL1RoaXMgaXMgdXNlZCBpbiAxMWsgdG8gcmVxdWVzdCBmb3IgYmVhY29uIG1lYXN1cmVtZW50IHJlcXVlc3Qgd2l0aCBhIGZpeGVkIGR1cmF0aW9uIGluCisgICAgICAgICAgIC8vbWF4IGNoYW5uZWwgdGltZS4KKyAgICAgICAgICAgaWYoIHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPm1pbkNoYW5uZWxUaW1lICE9IDAgKQorICAgICAgICAgICB7CisjZW5kaWYKKyAgICAgICAgICAgIC8vLyBUWFAgaGFzIHNlbnQgUHJvYmUgUmVxdWVzdAorICAgICAgICAgICAgLy8vIEFjdGl2YXRlIG1pbkNoYW5uZWxUaW1lcgorICAgICAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fTUlOX0NIQU5ORUxfVElNRVIpOworCisjaWZkZWYgR0VONl9UT0RPCisgICAgICAgICAgICAvKiByZXZpc2l0IHRoaXMgcGllY2Ugb2YgY29kZSB0byBhc3NpZ24gdGhlIGFwcHJvcHJpYXRlIHNlc3Npb25JZCBiZWxvdworICAgICAgICAgICAgICogcHJpb3JpdHkgLSBMT1cvbWlnaHQgbm90IGJlIG5lZWRlZAorICAgICAgICAgICAgICovIAorICAgICAgICAgICAgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltTWluQ2hhbm5lbFRpbWVyLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyNlbmRpZiAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9NSU5fQ0hBTk5FTF9USU1FUikpOworCisgICAgICAgICAgICBpZiAodHhfdGltZXJfYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbU1pbkNoYW5uZWxUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCBzdGFydCBtaW4gY2hhbm5lbCB0aW1lclxuIikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBtYXggdGltZXIgdG9vCisgICAgICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9NQVhfQ0hBTk5FTF9USU1FUik7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiTWluIGNoYW5uZWwgdGltZSA9PSAwLCBVc2Ugb25seSBtYXggY2hhbiB0aW1lclxuIiApOykKKyNlbmRpZgorICAgICAgICAgICAgICAvL05vIE5lZWQgdG8gc3RhcnQgTWluIGNoYW5uZWwgdGltZXIuIFN0YXJ0IE1heCBDaGFubmVsIHRpbWVyLgorICAgICAgICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9NQVhfQ0hBTk5FTF9USU1FUik7CisgICAgICAgICAgICAgIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltTWF4Q2hhbm5lbFRpbWVyKQorICAgICAgICAgICAgICAgICAgICA9PSBUWF9USU1FUl9FUlJPUikKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAvLy8gQ291bGQgbm90IGFjdGl2YXRlIG1heCBjaGFubmVsIHRpbWVyLgorICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsTE9HUCwgRkwoImNvdWxkIG5vdCBzdGFydCBtYXggY2hhbm5lbCB0aW1lclxuIikpOworICAgICAgICAgICAgICAgICByZXR1cm47IAorICAgICAgICAgICAgICB9CisKKyAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICAvKiBTdGFydCBwZXJpZGljIHRpbWVyIHdoaWNoIHdpbGwgdHJpZ2dlciBwcm9iZSByZXEgYmFzZWQgb24gbWluL21heAorICAgICAgICAgICBjaGFubmVsIHRpbWVyICovCisgICAgICAgIHBlcmlvZGljU2NhblRpbWVyID0gJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVBlcmlvZGljUHJvYmVSZXFUaW1lcjsKKyAgICAgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKHBlcmlvZGljU2NhblRpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3Qgc3RhcnQgcGVyaW9kaWMgcHJvYmUgcmVxICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lclxuIikpOworICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwZXJpb2RpY1NjYW5UaW1lci0+c2Vzc2lvbklkID0gY2hhbm5lbE51bTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdEFOSV9VMzIgdmFsOworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJTVEFSVCBQQVNTSVZFIFNjYW4gY2hhbiAlZFxuIiksIGNoYW5uZWxOdW0pOykKKworICAgICAgICAvLy8gUGFzc2l2ZSBTY2FubmluZy4gQWN0aXZhdGUgbWF4Q2hhbm5lbFRpbWVyCisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEUsIDAsIGVMSU1fTUFYX0NIQU5ORUxfVElNRVIpKTsKKyAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbU1heENoYW5uZWxUaW1lcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ291bGQgbm90IGRlYWN0aXZhdGUgbWF4IGNoYW5uZWwgdGltZXIuCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgbWF4IGNoYW5uZWwgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1BBU1NJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUUsICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBtYXggY2hhbm5lbCB2YWx1ZQorICAgICAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgcGFzc2l2ZSBtYXggY2hhbm5lbCB2YWx1ZVxuIikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0QU5JX1UzMiB2YWwxID0gMDsKKworICAgICAgICAgICAgICAgIHZhbCA9IFNZU19NU19UT19USUNLUyh2YWwpOworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UCisgICAgICAgICAgICAgICAgLy8gSWYgYSBiYWNrZ3JvdW5kIHdhcyB0cmlnZ2VyZWQgdmlhIFF1aWV0IEJTUywKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBNSU4gYW5kIE1BWCBjaGFubmVsCisgICAgICAgICAgICAgICAgLy8gdGltZXIncyBhY2NvcmRpbmdseSB0byB0aGUgUXVpZXQgZHVyYXRpb24gdGhhdAorICAgICAgICAgICAgICAgIC8vIHdhcyBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICBpZiggZUxJTV9RVUlFVF9SVU5OSU5HID09IHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSAmJgorICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGdMaW1RdWlldER1cmF0aW9uIGlzIGFscmVhZHkgY2FjaGVkIGluIHVuaXRzIG9mCisgICAgICAgICAgICAgICAgICAgIC8vIHN5c3RlbSB0aWNrcy4gTm8gY29udmVyc2lvbiBpcyByZXFkLi4uCisgICAgICAgICAgICAgICAgICAgIHZhbDEgPSBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0RHVyYXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbDEgPSBTWVNfTVNfVE9fVElDS1MocE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+bWF4Q2hhbm5lbFRpbWUpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIC8vUGljayB0aGUgbG9uZ2VyIHN0YXkgdGltZQorICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgPiB2YWwxKSA/IHZhbCA6IHZhbDE7CisgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsIDAsIGVMSU1fTUFYX0NIQU5ORUxfVElNRVIpKTsKKyAgICAgICAgICAgICAgICBpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1NYXhDaGFubmVsVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgMCkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBjaGFuZ2UgbWF4IGNoYW5uZWwgdGltZXIuCisgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBjaGFuZ2UgbWF4IGNoYW5uZWwgdGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltTWF4Q2hhbm5lbFRpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3Qgc3RhcnQgbWF4IGNoYW5uZWwgdGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBXYWl0IGZvciBCZWFjb25zIHRvIGFycml2ZQorICAgIH0gLy8gaWYgKHBNYWMtPmxpbS5nTGltTWxtU2NhblJlcS0+c2NhblR5cGUgPT0gZVNJUl9BQ1RJVkVfU0NBTikKKworICAgIGlmKCBoYW5kbGVFcnJvciApCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBGSVhNRSAtIFdpdGggdGhpcywgTElNL1NvZnRNQUMgd2lsbCB0cnkgYW5kIHJlY292ZXIKKyAgICAgICAgLy8gc3RhdGUsIGJ1dCBlV05JX1NNRV9TQ0FOX0NORiBtYXliZSByZXBvcnRpbmcgYW4KKyAgICAgICAgLy8gaW5jb3JyZWN0IHN0YXR1cyBiYWNrIHRvIHRoZSBTTUUuIFNvbWUgb2YgdGhlIHBvc3NpYmxlCisgICAgICAgIC8vIGVycm9ycyBhcmU6CisgICAgICAgIC8vIGVTSVJfU01FX0hBTF9TQ0FOX0lOSVRfRkFJTEVECisgICAgICAgIC8vIGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRQorICAgICAgICAvLworICAgICAgICAvL1NldCB0aGUgcmVzdW1lIGNoYW5uZWwgdG8gQW55IHZhbGlkIGNoYW5uZWwgKGludmFsaWQpLiAKKyAgICAgICAgLy9UaGlzIHdpbGwgaW5zdHJ1Y3QgSEFMIHRvIHNldCBpdCB0byBhbnkgcHJldmlvdXMgdmFsaWQgY2hhbm5lbC4KKyAgICAgICAgcGVTZXRSZXN1bWVDaGFubmVsKHBNYWMsIDAsIDApOworICAgICAgICBsaW1TZW5kSGFsRmluaXNoU2NhblJlcSggcE1hYywgZUxJTV9IQUxfRklOSVNIX1NDQU5fV0FJVF9TVEFURSApOworICAgICAgICAvL2xpbUNvbXBsZXRlTWxtU2NhbihwTWFjLCBlU0lSX1NNRV9IQUxfU0NBTl9JTklUX0ZBSUxFRCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxpbUFkZFNjYW5DaGFubmVsSW5mbyhwTWFjLCBjaGFubmVsTnVtKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworCisKKy8qCisqIENyZWF0ZXMgYSBSYXcgZnJhbWUgdG8gYmUgc2VudCBiZWZvcmUgZXZlcnkgU2NhbiwgaWYgcmVxdWlyZWQuCisqIElmIG9ubHkgaW5mcmEgbGluayBpcyBhY3RpdmUgKG1sbVN0YXRlID0gTGluayBFc3RiKSwgdGhlbiBzZW5kIERhdGEgTnVsbAorKiBJZiBvbmx5IEJULUFNUC1BUCBsaW5rIGlzIGFjdGl2ZShtbG1TdGF0ZSA9IEJTU19TVEFSVEVEKSwgdGhlbiBzZW5kIENUUzJTZWxmIGZyYW1lLgorKiBJZiBvbmx5IEJULUFNUC1TVEEgbGluayBpcyBhY3RpdmUobWxtU3RhdGUgPSBCU1NfU1RBUlRFRCBvciBMaW5rIEVzdCkgdGhlbiBzZW5kIENUUzJTZWxmCisqIElmIE9ubHkgSUJTUyBsaW5rIGlzIGFjdGl2ZSwgdGhlbiBzZW5kIENUUzJTZWxmCisqIGZvciBjb25jdXJyZW50IHNjZW5hcmlvOiBJbmZyYStCVCAgb3IgSW5mcmErSUJTUywgYWx3YXlzIHNlbmQgQ1RTMlNlbGYsIG5vIG5lZWQgdG8gc2VuZCBEYXRhIE51bGwKKyoKKyovCitzdGF0aWMgdm9pZCBfX2xpbUNyZWF0ZUluaXRTY2FuUmF3RnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBJbml0U2NhblBhcmFtcyBwSW5pdFNjYW5QYXJhbSkKK3sKKyAgICB0QU5JX1U4ICAgaTsKKyAgICBwSW5pdFNjYW5QYXJhbS0+c2NhbkVudHJ5LmFjdGl2ZUJTU2NudCA9IDA7CisgICAgCisgICAgLyogRG9uJ3Qgc2VuZCBDVFMgdG8gc2VsZiBhcyB3ZSBoYXZlIGlzc3VlIHdpdGggQlRRTSBxdWV1ZXMgd2hlcmUgQlRRTSBjYW4gCisgICAgICogbm90IGhhbmRsZSB0cmFuc21pdGlvbiBvZiBDVFMyc2VsZiBmcmFtZXMuICBTZW5kaW5nIENUUyAyIHNlbGYgYXQgdGhpcyAKKyAgICAgKiBqdW5jdHVyZSBhbHNvIGRvZXNuJ3Qgc2VydmUgbXVjaCBwdXJwb3NlIGFzIHByb2JlIHJlcXVlc3QgZnJhbWVzIGdvIG91dCAKKyAgICAgKiBpbW1lZGlhdGVseSwgTm8gbmVlZCB0byBub3RpZnkgQlNTIGluIElCU1MgY2FzZS4KKyAgICAgKiAqLworCisgICAgZm9yKGkgPTA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUgIT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpICYmCisgICAgICAgICAgICAgICAgICAgKHBJbml0U2NhblBhcmFtLT5zY2FuRW50cnkuYWN0aXZlQlNTY250IDwgSEFMX05VTV9CU1NJRCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwSW5pdFNjYW5QYXJhbS0+c2NhbkVudHJ5LmJzc0lkeFtwSW5pdFNjYW5QYXJhbS0+c2NhbkVudHJ5LmFjdGl2ZUJTU2NudF0gCisgICAgICAgICAgICAgICAgICAgICAgICA9IHBNYWMtPmxpbS5ncFNlc3Npb25baV0uYnNzSWR4OworICAgICAgICAgICAgICAgICAgICBwSW5pdFNjYW5QYXJhbS0+c2NhbkVudHJ5LmFjdGl2ZUJTU2NudCsrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgIGVsc2UgaWYoIChlTElNX0FQX1JPTEUgPT0gcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlICkgCisgICAgICAgICAgICAgICAgICAgICYmICggVk9TX1AyUF9HT19NT0RFID09IHBNYWMtPmxpbS5ncFNlc3Npb25baV0ucGVQZXJzb25hICkKKyAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluaXRTY2FuUGFyYW0tPnVzZU5vQSA9IFRSVUU7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocEluaXRTY2FuUGFyYW0tPnNjYW5FbnRyeS5hY3RpdmVCU1NjbnQpCisgICAgeworICAgICAgICBwSW5pdFNjYW5QYXJhbS0+bm90aWZ5QnNzID0gVFJVRTsKKyAgICAgICAgcEluaXRTY2FuUGFyYW0tPmZyYW1lVHlwZSA9IFNJUl9NQUNfREFUQV9GUkFNRTsKKyAgICAgICAgcEluaXRTY2FuUGFyYW0tPmZyYW1lTGVuZ3RoID0gMDsKKyAgICB9Cit9CisKKy8qCisqIENyZWF0ZXMgYSBSYXcgZnJhbWUgdG8gYmUgc2VudCBkdXJpbmcgZmluaXNoIHNjYW4sIGlmIHJlcXVpcmVkLgorKiBTZW5kIGRhdGEgbnVsbCBmcmFtZSwgb25seSB3aGVuIHRoZXJlIGlzIGp1c3Qgb25lIHNlc3Npb24gYWN0aXZlIGFuZCB0aGF0IHNlc3Npb24gaXMKKyogaW4gJ2xpbmsgRXN0Yicgc3RhdGUuCisqIGlmIG1vcmUgdGhhbiBvbmUgc2Vzc2lvbiBpcyBhY3RpdmUsIGRvbid0IHNlbmQgYW55IGZyYW1lLgorKiBmb3IgY29uY3VycmVudCBzY2VuYXJpbzogSW5mcmErQlQgIG9yIEluZnJhK0lCU1MsIG5vIG5lZWQgdG8gc2VuZCBEYXRhIE51bGwKKyoKKyovCitzdGF0aWMgdm9pZCBfX2xpbUNyZWF0ZUZpbmlzaFNjYW5SYXdGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwRmluaXNoU2NhblBhcmFtcyBwRmluaXNoU2NhblBhcmFtKQoreworICAgIHRBTklfVTggICBpOworICAgIHBGaW5pc2hTY2FuUGFyYW0tPnNjYW5FbnRyeS5hY3RpdmVCU1NjbnQgPSAwOworCisgICAgZm9yKGkgPTA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vQlQtU1RBIGNhbiBlaXRoZXIgYmUgaW4gTElOSy1FU1RCIHN0YXRlIG9yIEJTU19TVEFSVEVEIFN0YXRlCisgICAgICAgICAgICAgICAgLy9mb3IgQlQsIG5lZWQgdG8gc2VuZCBDVFMyU2VsZgorICAgICAgICAgICAgICAgaWYgKChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUgIT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpICYmCisgICAgICAgICAgICAgICAgICAgKHBGaW5pc2hTY2FuUGFyYW0tPnNjYW5FbnRyeS5hY3RpdmVCU1NjbnQgPCBIQUxfTlVNX0JTU0lEKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBGaW5pc2hTY2FuUGFyYW0tPnNjYW5FbnRyeS5ic3NJZHhbcEZpbmlzaFNjYW5QYXJhbS0+c2NhbkVudHJ5LmFjdGl2ZUJTU2NudF0gCisgICAgICAgICAgICAgICAgICAgICAgICA9IHBNYWMtPmxpbS5ncFNlc3Npb25baV0uYnNzSWR4OworICAgICAgICAgICAgICAgICAgICBwRmluaXNoU2NhblBhcmFtLT5zY2FuRW50cnkuYWN0aXZlQlNTY250Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChwRmluaXNoU2NhblBhcmFtLT5zY2FuRW50cnkuYWN0aXZlQlNTY250KQorICAgIHsKKyAgICAgICAgcEZpbmlzaFNjYW5QYXJhbS0+bm90aWZ5QnNzID0gVFJVRTsKKyAgICAgICAgcEZpbmlzaFNjYW5QYXJhbS0+ZnJhbWVUeXBlID0gU0lSX01BQ19EQVRBX0ZSQU1FOworICAgICAgICBwRmluaXNoU2NhblBhcmFtLT5mcmFtZUxlbmd0aCA9IDA7CisgICAgfQorfQorCit2b2lkCitsaW1TZW5kSGFsSW5pdFNjYW5SZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpbUxpbUhhbFNjYW5TdGF0ZSBuZXh0U3RhdGUsIHRTaXJMaW5rVHJhZmZpY0NoZWNrIHRyYWZmaWNDaGVjaykKK3sKKworCisgICAgdFNpck1zZ1EgICAgICAgICAgICAgICAgbXNnOworICAgIHRwSW5pdFNjYW5QYXJhbXMgICAgICAgIHBJbml0U2NhblBhcmFtOworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgICAgIHJjID0gZVNJUl9TVUNDRVNTOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwSW5pdFNjYW5QYXJhbSwKKyAgICAgICAgICAgICAgICBzaXplb2YoKnBJbml0U2NhblBhcmFtKSkpCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZFxuIikpOykKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgCisgICAgLypJbml0aWFsaXplIHRoZSBwSW5pdFNjYW5QYXJhbSB3aXRoIDAqLworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopcEluaXRTY2FuUGFyYW0sIHNpemVvZigqcEluaXRTY2FuUGFyYW0pKTsKKworICAgIG1zZy50eXBlID0gV0RBX0lOSVRfU0NBTl9SRVE7CisgICAgbXNnLmJvZHlwdHIgPSBwSW5pdFNjYW5QYXJhbTsKKyAgICBtc2cuYm9keXZhbCA9IDA7CisKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSZwSW5pdFNjYW5QYXJhbS0+bWFjTWdtdEhkciwgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSk7CisgICAgaWYgKG5leHRTdGF0ZSA9PSBlTElNX0hBTF9JTklUX0xFQVJOX1dBSVRfU1RBVEUpCisgICAgeworICAgICAgICBwSW5pdFNjYW5QYXJhbS0+bm90aWZ5QnNzID0gVFJVRTsKKyAgICAgICAgcEluaXRTY2FuUGFyYW0tPm5vdGlmeUhvc3QgPSBGQUxTRTsKKyAgICAgICAgcEluaXRTY2FuUGFyYW0tPnNjYW5Nb2RlID0gZUhBTF9TWVNfTU9ERV9MRUFSTjsKKworI2lmIGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspIAorICAgICAgICBpZiAoR0VUX0xJTV9TWVNURU1fUk9MRShwTWFjKSA9PSBlTElNX1NUQV9ST0xFKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5pdFNjYW5QYXJhbS0+ZnJhbWVUeXBlID0gU0lSX01BQ19EQVRBX05VTEw7CisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGluZm9ybSB0aGUgQVAgb25seSB3aGVuIHdlIGFyZQorICAgICAgICAgICAgLy8gaW4gdGhlIExJTktfRVNUQUJMSVNIRUQgc3RhdGUKKyAgICAgICAgICAgIGlmKCBlTElNX1NNRV9MSU5LX0VTVF9XVF9TQ0FOX1NUQVRFICE9IHBNYWMtPmxpbS5nTGltU21lU3RhdGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbml0U2NhblBhcmFtLT5ub3RpZnlCc3MgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSAtIEhhbmRsZSB0aGlzIG9uZSBjYXJlZnVsbHkKKyAgICAgICAgICAgICAgICBwSW5pdFNjYW5QYXJhbS0+bm90aWZ5SG9zdCA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19saW1DcmVhdGVJbml0U2NhblJhd0ZyYW1lKHBNYWMsIHBJbml0U2NhblBhcmFtKTsKKyAgICAgICAgICAgIHBJbml0U2NhblBhcmFtLT5jaGVja0xpbmtUcmFmZmljID0gdHJhZmZpY0NoZWNrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBwSW5pdFNjYW5QYXJhbS0+ZnJhbWVUeXBlID0gU0lSX01BQ19DVFJMX0NUUzsKKyAgICAgICAgICAgIF9fbGltQ3JlYXRlSW5pdFNjYW5SYXdGcmFtZShwTWFjLCBwSW5pdFNjYW5QYXJhbSk7CisgICAgICAgICAgICBwSW5pdFNjYW5QYXJhbS0+Y2hlY2tMaW5rVHJhZmZpYyA9IHRyYWZmaWNDaGVjazsKKyAgICAgICAgfQorCisjaWYgKGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgfHxkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKyAgICAgICAgLyogQ3VycmVudGx5IHVzaW5nIHRoZSBBUCdzIHNjYW5EdXJhdGlvbiB2YWx1ZXMgZm9yIExpbnV4IHN0YXRpb24gYWxzby4gVGhpcyBzaG91bGQKKyAgICAgICAgICogYmUgcmV2aXNpdGVkIGlmIHRoaXMgbmVlZHMgdG8gY2hhbmdlZCBkZXBlbmRpbmcgb24gQVAgb3IgU3RhdGlvbiAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0NvbnRyb2wubG9uZ0NoYW5uZWxTY2FuUGVyaW9kaWNpdHkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5zaG9ydER1cmF0aW9uQ291bnQgPT0KKyAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNDb250cm9sLmxvbmdDaGFubmVsU2NhblBlcmlvZGljaXR5KSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBBTklfQVBfU0RLCisgICAgICAgICAgICAgICAgcEluaXRTY2FuUGFyYW0tPnNjYW5EdXJhdGlvbiA9ICh0QU5JX1UxNilwTWFjLT5saW0uZ0xpbVNjYW5EdXJhdGlvbkNvbnZlcnQubG9uZ0NoYW5uZWxTY2FuRHVyYXRpb25fdGljazsKKyNlbHNlCisgICAgICAgICAgICAgICAgcEluaXRTY2FuUGFyYW0tPnNjYW5EdXJhdGlvbiA9ICh0QU5JX1UxNilwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5tZWFzRHVyYXRpb24ubG9uZ0NoYW5uZWxTY2FuRHVyYXRpb247CisjZW5kaWYgLyogQU5JX0FQX1NESyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworI2lmZGVmIEFOSV9BUF9TREsKKyAgICAgICAgICAgICAgICBwSW5pdFNjYW5QYXJhbS0+c2NhbkR1cmF0aW9uID0gcE1hYy0+bGltLmdMaW1TY2FuRHVyYXRpb25Db252ZXJ0LnNob3J0Q2hhbm5lbFNjYW5EdXJhdGlvbl90aWNrOworI2Vsc2UKKyAgICAgICAgICAgICAgICBwSW5pdFNjYW5QYXJhbS0+c2NhbkR1cmF0aW9uID0gKHRBTklfVTE2KXBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb247CisjZW5kaWYgLyogQU5JX0FQX1NESyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgICAgICAgLy8jaWYgKGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgfHxkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYobmV4dFN0YXRlID09IGVMSU1fSEFMX1NVU1BFTkRfTElOS19XQUlUX1NUQVRFKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5pdFNjYW5QYXJhbS0+c2Nhbk1vZGUgPSBlSEFMX1NZU19NT0RFX1NVU1BFTkRfTElOSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbml0U2NhblBhcmFtLT5zY2FuTW9kZSA9IGVIQUxfU1lTX01PREVfU0NBTjsKKyAgICAgICAgfQorICAgICAgICBfX2xpbUNyZWF0ZUluaXRTY2FuUmF3RnJhbWUocE1hYywgcEluaXRTY2FuUGFyYW0pOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgaWYgKHBJbml0U2NhblBhcmFtLT51c2VOb0EpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbml0U2NhblBhcmFtLT5zY2FuRHVyYXRpb24gPSBwTWFjLT5saW0uZ1RvdGFsU2NhbkR1cmF0aW9uOworICAgICAgICB9CisjZW5kaWYgICAgICAgCisgICAgICAgIC8qIEluZm9ybSBIQUwgd2hldGhlciBpdCBzaG91bGQgY2hlY2sgZm9yIHRyYWZmaWMgb24gdGhlIGxpbmsKKyAgICAgICAgICogcHJpb3IgdG8gcGVyZm9ybWluZyBhIGJhY2tncm91bmQgc2NhbgorICAgICAgICAgKi8KKyAgICAgICAgcEluaXRTY2FuUGFyYW0tPmNoZWNrTGlua1RyYWZmaWMgPSB0cmFmZmljQ2hlY2s7CisgICAgfQorCisgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPSBuZXh0U3RhdGU7CisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgZmFsc2UpOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZy50eXBlKSk7CisKKyAgICByYyA9IHdkYVBvc3RDdHJsTXNnKHBNYWMsICZtc2cpOworICAgIGlmIChyYyA9PSBlU0lSX1NVQ0NFU1MpIHsKKyAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgid2RhUG9zdEN0cmxNc2coKSByZXR1cm4gZVNJUl9TVUNDRVNTIHBNYWM9JXggbmV4dFN0YXRlPSVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgcE1hYywgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUpOykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKyAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopcEluaXRTY2FuUGFyYW0pOworICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIndkYVBvc3RDdHJsTXNnIGZhaWxlZCwgZXJyb3IgY29kZSAlZFxuIiksIHJjKTspCisKK2Vycm9yOgorICAgIHN3aXRjaChuZXh0U3RhdGUpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fSEFMX1NUQVJUX1NDQU5fV0FJVF9TVEFURToKKyAgICAgICAgICAgIGxpbUNvbXBsZXRlTWxtU2NhbihwTWFjLCBlU0lSX1NNRV9IQUxfU0NBTl9JTklUX0ZBSUxFRCk7CisgICAgICAgICAgICBicmVhazsKKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgICAgIGNhc2UgZUxJTV9IQUxfU1RBUlRfTEVBUk5fV0FJVF9TVEFURToKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltUmVzdG9yZVByZUxlYXJuU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICAgbGltUmVFbmFibGVMZWFybk1vZGUocE1hYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworI2VuZGlmCisKKyAgICAgICAgICAgIC8vV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZAorICAgICAgICBjYXNlIGVMSU1fSEFMX1NVU1BFTkRfTElOS19XQUlUX1NUQVRFOgorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPSBlTElNX0hBTF9JRExFX1NDQU5fU1RBVEU7CisgICAgICAgICAgICBpZiggcE1hYy0+bGltLmdwTGltU3VzcGVuZENhbGxiYWNrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1TdXNwZW5kQ2FsbGJhY2soIHBNYWMsIHJjLCBwTWFjLT5saW0uZ3BMaW1TdXNwZW5kRGF0YSApOworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbVN1c3BlbmRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltU3VzcGVuZERhdGEgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TeXN0ZW1JblNjYW5MZWFybk1vZGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvL2VuZCBXTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPSBlTElNX0hBTF9JRExFX1NDQU5fU1RBVEU7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkCitsaW1TZW5kSGFsU3RhcnRTY2FuUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY2hhbm5lbE51bSwgdExpbUxpbUhhbFNjYW5TdGF0ZSBuZXh0U3RhdGUpCit7CisgICAgdFNpck1zZ1EgICAgICAgICAgICBtc2c7CisgICAgdHBTdGFydFNjYW5QYXJhbXMgICBwU3RhcnRTY2FuUGFyYW07CisgICAgdFNpclJldFN0YXR1cyAgICAgICByYyA9IGVTSVJfU1VDQ0VTUzsKKworICAgIC8qKgorICAgICAqIFRoZSBTdGFydCBzY2FuIHJlcXVlc3QgdG8gYmUgc2VudCBvbmx5IGlmIFN0YXJ0IFNjYW4gaXMgbm90IGFscmVhZHkgcmVxdWVzdGVkCisgICAgICovCisgICAgaWYocE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgIT0gZUxJTV9IQUxfU1RBUlRfU0NBTl9XQUlUX1NUQVRFKSAKKyAgICB7IAorCisgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopJnBTdGFydFNjYW5QYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwU3RhcnRTY2FuUGFyYW0pKSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgicGFsQWxsb2NhdGVNZW1vcnkoKSBmYWlsZWRcbiIpKTspCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIG1zZy50eXBlID0gV0RBX1NUQVJUX1NDQU5fUkVROworICAgICAgICBtc2cuYm9keXB0ciA9IHBTdGFydFNjYW5QYXJhbTsKKyAgICAgICAgbXNnLmJvZHl2YWwgPSAwOworICAgICAgICBwU3RhcnRTY2FuUGFyYW0tPnN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIHBTdGFydFNjYW5QYXJhbS0+c2NhbkNoYW5uZWwgPSAodEFOSV9VOCljaGFubmVsTnVtOworCisgICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID0gbmV4dFN0YXRlOworICAgICAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCBmYWxzZSk7CisKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnLnR5cGUpKTsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiQ2hhbm5lbCAlZFxuIiksIGNoYW5uZWxOdW0pOykKKworICAgICAgICAgICAgcmMgPSB3ZGFQb3N0Q3RybE1zZyhwTWFjLCAmbXNnKTsKKyAgICAgICAgaWYgKHJjID09IGVTSVJfU1VDQ0VTUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKilwU3RhcnRTY2FuUGFyYW0pOworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJ3ZGFQb3N0Q3RybE1zZyBmYWlsZWQsIGVycm9yIGNvZGUgJWRcbiIpLCByYyk7KQorCitlcnJvcjoKKyAgICAgICAgc3dpdGNoKG5leHRTdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBlTElNX0hBTF9TVEFSVF9TQ0FOX1dBSVRfU1RBVEU6CisgICAgICAgICAgICAgICAgbGltQ29tcGxldGVNbG1TY2FuKHBNYWMsIGVTSVJfU01FX0hBTF9TQ0FOX0lOSVRfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgICAgICAgICBjYXNlIGVMSU1fSEFMX1NUQVJUX0xFQVJOX1dBSVRfU1RBVEU6CisgICAgICAgICAgICAgICAgLy9pZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbVJlc3RvcmVQcmVMZWFyblN0YXRlKHBNYWMpOworICAgICAgICAgICAgICAgICAgICBsaW1SZUVuYWJsZUxlYXJuTW9kZShwTWFjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNlbmRpZgorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID0gZUxJTV9IQUxfSURMRV9TQ0FOX1NUQVRFOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkludmFsaWQgc3RhdGUgZm9yIFNUQVJUX1NDQU5fUkVRIG1lc3NhZ2U9JWRcbiIpLCBwTWFjLT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSk7KQorICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCBsaW1TZW5kSGFsRW5kU2NhblJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGNoYW5uZWxOdW0sIHRMaW1MaW1IYWxTY2FuU3RhdGUgbmV4dFN0YXRlKQoreworICAgIHRTaXJNc2dRICAgICAgICAgICAgbXNnOworICAgIHRwRW5kU2NhblBhcmFtcyAgICAgcEVuZFNjYW5QYXJhbTsKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgIHJjID0gZVNJUl9TVUNDRVNTOworCisgICAgLyoqCisgICAgICogVGhlIEVuZCBzY2FuIHJlcXVlc3QgdG8gYmUgc2VudCBvbmx5IGlmIEVuZCBTY2FuIGlzIG5vdCBhbHJlYWR5IHJlcXVlc3RlZCBvcgorICAgICAqIFN0YXJ0IHNjYW4gaXMgbm90IGFscmVhZHkgcmVxdWVzdGQKKyAgICAgKi8KKyAgICBpZigocE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgIT0gZUxJTV9IQUxfRU5EX1NDQU5fV0FJVF9TVEFURSkgICYmCisgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgIT0gZUxJTV9IQUxfU1RBUlRfU0NBTl9XQUlUX1NUQVRFKSkKKyAgICB7IAorCisgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcEVuZFNjYW5QYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwRW5kU2NhblBhcmFtKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoInBhbEFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkXG4iKSk7KQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBtc2cudHlwZSA9IFdEQV9FTkRfU0NBTl9SRVE7CisgICAgICAgIG1zZy5ib2R5cHRyID0gcEVuZFNjYW5QYXJhbTsKKyAgICAgICAgbXNnLmJvZHl2YWwgPSAwOworICAgICAgICBwRW5kU2NhblBhcmFtLT5zdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICBwRW5kU2NhblBhcmFtLT5zY2FuQ2hhbm5lbCA9ICh0QU5JX1U4KWNoYW5uZWxOdW07CisKKyAgICAgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPSBuZXh0U3RhdGU7CisgICAgICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnLnR5cGUpKTsKKworICAgICAgICByYyA9IHdkYVBvc3RDdHJsTXNnKHBNYWMsICZtc2cpOworICAgICAgICBpZiAocmMgPT0gZVNJUl9TVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKXBFbmRTY2FuUGFyYW0pOworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJ3ZGFQb3N0Q3RybE1zZyBmYWlsZWQsIGVycm9yIGNvZGUgJWRcbiIpLCByYyk7KQorCisgICAgICAgICAgICBlcnJvcjoKKyAgICAgICAgICAgIHN3aXRjaChuZXh0U3RhdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlTElNX0hBTF9FTkRfU0NBTl9XQUlUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICBsaW1Db21wbGV0ZU1sbVNjYW4ocE1hYywgZVNJUl9TTUVfSEFMX1NDQU5fRU5EX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICAgICAgICAgICAgICBjYXNlIGVMSU1fSEFMX0VORF9MRUFSTl9XQUlUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1SZXN0b3JlUHJlTGVhcm5TdGF0ZShwTWFjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVJlRW5hYmxlTGVhcm5Nb2RlKHBNYWMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJ3ZGFQb3N0Q3RybE1zZyBSY3ZkIGludmFsaWQgbmV4dFN0YXRlICVkXG4iKSwgbmV4dFN0YXRlKTspCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPSBlTElNX0hBTF9JRExFX1NDQU5fU1RBVEU7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIndkYVBvc3RDdHJsTXNnIGZhaWxlZCwgZXJyb3IgY29kZSAlZFxuIiksIHJjKTspICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJJbnZhbGlkIHN0YXRlIGZvciBFTkRfU0NBTl9SRVEgbWVzc2FnZT0lZFxuIiksIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlKTspCisgICAgfQorCisKKyAgICByZXR1cm47Cit9CisKKy8qKgorICogbGltU2VuZEhhbEZpbmlzaFNjYW5SZXEoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBmaW5pc2ggc2Nhbi9sZWFybiByZXF1ZXN0Li4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBuZXh0U3RhdGUgLSB0aGlzIHBhcmFtZXRlcnMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgY2FsbCBpcyBmb3Igc2NhbiBvciBsZWFybgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbVNlbmRIYWxGaW5pc2hTY2FuUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaW1MaW1IYWxTY2FuU3RhdGUgbmV4dFN0YXRlKQoreworCisgICAgdFNpck1zZ1EgICAgICAgICAgICBtc2c7CisgICAgdHBGaW5pc2hTY2FuUGFyYW1zICBwRmluaXNoU2NhblBhcmFtOworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgcmMgPSBlU0lSX1NVQ0NFU1M7CisKKyAgICBpZihwTWFjLT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSA9PSBuZXh0U3RhdGUpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBQRSBtYXkgcmVjZWl2ZSBtdWx0aXBsZSBwcm9iZSByZXNwb25zZXMsIHdoaWxlIHdhaXRpbmcgZm9yIEhBTCB0byBzZW5kICdGSU5JU0hfU0NBTl9SU1AnIG1lc3NhZ2UKKyAgICAgICAgICogUEUgd2FzIHNlbmRpbmcgbXVsdGlwbGUgZmluaXNoIHNjYW4gcmVxIG1lc3NhZ2VzIHRvIEhBTAorICAgICAgICAgKiB0aGlzIGNoZWNrIHdpbGwgYXZvaWQgdGhhdC4KKyAgICAgICAgICogSWYgUEUgaXMgYWxyZWFkeSB3YWl0aW5nIGZvciB0aGUgJ2ZpbmlzaF9zY2FuX3JzcCcgbWVzc2FnZSBmcm9tIEhBTCwgaXQgd2lsbCBpZ25vcmUgdGhpcyByZXF1ZXN0LgorICAgICAgICAgKi8KKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiTmV4dCBTY2FuIFN0YXRlIGlzIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3RhdGU6ICVkIFxuIiksIG5leHRTdGF0ZSk7KQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRmluaXNoU2NhblBhcmFtLAorICAgICAgICAgICAgICAgIHNpemVvZigqcEZpbmlzaFNjYW5QYXJhbSkpKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgicGFsQWxsb2NhdGVNZW1vcnkoKSBmYWlsZWRcbiIpKTspCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG1zZy50eXBlID0gV0RBX0ZJTklTSF9TQ0FOX1JFUTsKKyAgICBtc2cuYm9keXB0ciA9IHBGaW5pc2hTY2FuUGFyYW07CisgICAgbXNnLmJvZHl2YWwgPSAwOworICAgIHBGaW5pc2hTY2FuUGFyYW0tPmN1cnJlbnRPcGVyQ2hhbm5lbCA9IHBlR2V0UmVzdW1lQ2hhbm5lbChwTWFjKTsKKyAgICAvL1RPRE86IEZpeCBDQiBTdGF0ZS4gR2V0IGl0IGZyb20gc2Vzc2lvbi4gc2ltaWxhciB0byBnZXRDaGFubmVsLiAKKyAgICBwRmluaXNoU2NhblBhcmFtLT5jYlN0YXRlID0gbGltR2V0UGh5Q0JTdGF0ZSggcE1hYyApOworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopJnBGaW5pc2hTY2FuUGFyYW0tPm1hY01nbXRIZHIsIHNpemVvZih0U2lyTWFjTWdtdEhkcikpOworCisgICAgaWYgKG5leHRTdGF0ZSA9PSBlTElNX0hBTF9GSU5JU0hfTEVBUk5fV0FJVF9TVEFURSkKKyAgICB7CisgICAgICAgIC8vQVAgLSBObyBwa3QgbmVlZCB0byBiZSB0cmFuc21pdHRlZAorICAgICAgICBwRmluaXNoU2NhblBhcmFtLT5zY2FuTW9kZSA9IGVIQUxfU1lTX01PREVfTEVBUk47CisgICAgICAgIHBGaW5pc2hTY2FuUGFyYW0tPm5vdGlmeUJzcyA9IEZBTFNFOworICAgICAgICBwRmluaXNoU2NhblBhcmFtLT5ub3RpZnlIb3N0ID0gRkFMU0U7CisgICAgICAgIHBGaW5pc2hTY2FuUGFyYW0tPmZyYW1lVHlwZSA9IDA7CisgICAgICAgIHBGaW5pc2hTY2FuUGFyYW0tPmZyYW1lTGVuZ3RoID0gMDsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPSBuZXh0U3RhdGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIElmIFNUQSBpcyBhc3NvY2lhdGVkIHdpdGggYW4gQVAgKGllLiBTVEEgaXMgaW4KKyAgICAgICAgICogTElOS19FU1RBQkxJU0hFRCBzdGF0ZSksIHRoZW4gU1RBIG5lZWQgdG8gaW5mb3JtCisgICAgICAgICAqIHRoZSBBUCB2aWEgZWl0aGVyIERBVEEtTlVMTAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG5leHRTdGF0ZSA9PSBlTElNX0hBTF9SRVNVTUVfTElOS19XQUlUX1NUQVRFKQorICAgICAgICB7CisgICAgICAgICAgICBwRmluaXNoU2NhblBhcmFtLT5zY2FuTW9kZSA9IGVIQUxfU1lTX01PREVfU1VTUEVORF9MSU5LOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEZpbmlzaFNjYW5QYXJhbS0+c2Nhbk1vZGUgPSBlSEFMX1NZU19NT0RFX1NDQU47CisgICAgICAgIH0KKyAgICAgICAgcEZpbmlzaFNjYW5QYXJhbS0+bm90aWZ5SG9zdCA9IEZBTFNFOworICAgICAgICBfX2xpbUNyZWF0ZUZpbmlzaFNjYW5SYXdGcmFtZShwTWFjLCBwRmluaXNoU2NhblBhcmFtKTsKKyAgICAgICAgLy9XTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCisgICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID0gbmV4dFN0YXRlOworICAgICAgICAvL2VuZCBXTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCisgICAgfQorCisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgZmFsc2UpOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZy50eXBlKSk7CisKKyAgICByYyA9IHdkYVBvc3RDdHJsTXNnKHBNYWMsICZtc2cpOworICAgIGlmIChyYyA9PSBlU0lSX1NVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKyAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopcEZpbmlzaFNjYW5QYXJhbSk7CisgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgid2RhUG9zdEN0cmxNc2cgZmFpbGVkLCBlcnJvciBjb2RlICVkXG4iKSwgcmMpOykKKworICAgICAgICBlcnJvcjoKKyAgICAgICAgaWYobmV4dFN0YXRlID09IGVMSU1fSEFMX0ZJTklTSF9TQ0FOX1dBSVRfU1RBVEUpCisgICAgICAgICAgICBsaW1Db21wbGV0ZU1sbVNjYW4ocE1hYywgZVNJUl9TTUVfSEFMX1NDQU5fRklOSVNIX0ZBSUxFRCk7CisgICAgLy9XTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCisgICAgICAgIGVsc2UgaWYgKCBuZXh0U3RhdGUgPT0gZUxJTV9IQUxfUkVTVU1FX0xJTktfV0FJVF9TVEFURSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwTWFjLT5saW0uZ3BMaW1SZXN1bWVDYWxsYmFjayApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltUmVzdW1lQ2FsbGJhY2soIHBNYWMsIHJjLCBwTWFjLT5saW0uZ3BMaW1SZXN1bWVEYXRhICk7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltUmVzdW1lQ2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbVJlc3VtZURhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIC8vZW5kIFdMQU5fU1VTUEVORF9MSU5LIFJlbGF0ZWQKKyAgICBwTWFjLT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSA9IGVMSU1fSEFMX0lETEVfU0NBTl9TVEFURTsKKyAgICByZXR1cm47Cit9CisKKy8qKgorICogbGltQ29udGludWVDaGFubmVsU2NhbigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVBlcmZvcm1DaGFubmVsU2NhbigpLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY29udGludWUgY2hhbm5lbCBzY2FubmluZyB3aGVuCisgKiBCZWFjb24vUHJvYmUgUmVzcG9uc2UgZnJhbWUgYXJlIHJlY2VpdmVkLgorICoKKyAqTE9HSUM6CisgKiBTY2FuIGNyaXRlcmlhIHN0b3JlZCBpbiBwTWFjLT5saW0uZ0xpbU1sbVNjYW5SZXEgaXMgdXNlZAorICogdG8gcGVyZm9ybSBjaGFubmVsIHNjYW4uIEluIHRoaXMgZnVuY3Rpb24gTUxNIHN1YiBtb2R1bGUKKyAqIG1ha2VzIGNoYW5uZWwgc3dpdGNoLCBzZW5kcyBQUk9CRSBSRVFVRVNUIGZyYW1lIGluIGNhc2Ugb2YKKyAqIEFDVElWRSBTQ0FOTklORywgc3RhcnRzIG1pbi9tYXggY2hhbm5lbCB0aW1lcnMsIHByb2dyYW1zCisgKiBOQVYgdG8gcHJvYmVEZWxheSB0aW1lciBhbmQgd2FpdHMgZm9yIEJlYWNvbi9Qcm9iZSBSZXNwb25zZS4KKyAqIE9uY2UgYWxsIHJlcXVpcmVkIGNoYW5uZWxzIGFyZSBzY2FubmVkLCBMSU1fTUxNX1NDQU5fQ05GCisgKiBwcmltaXRpdmUgaXMgdXNlZCB0byBzZW5kIFNjYW4gcmVzdWx0cyB0byBTTUUgc3ViIG1vZHVsZS4KKyAqCisgKkFTU1VNUFRJT05TOgorICogMS4gSW4gY2FzZSBvZiBBY3RpdmUgc2Nhbm5pbmcsIHN0YXJ0IE1BWCBjaGFubmVsIHRpbWUgaWZmCisgKiAgICBNSU4gY2hhbm5lbCB0aW1lciBleHBpcmVkIGFuZCBhY3Rpdml0eSBpcyBvYnNlcnZlZCBvbgorICogICAgdGhlIGNoYW5uZWwuCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1Db250aW51ZUNoYW5uZWxTY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICBjaGFubmVsTnVtOworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiQ29udGludWUgU0NBTiA6IGNoYW4gJWQgdG90ICVkXG4iKSwKKyAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DdXJyZW50U2NhbkNoYW5uZWxJZCwKKyAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMpOykKKworICAgIGlmIChwTWFjLT5saW0uZ0xpbUN1cnJlbnRTY2FuQ2hhbm5lbElkID4KKyAgICAgICAgKHRBTklfVTMyKSAocE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgLSAxKSAKKyAgICAgICAgfHwgcE1hYy0+bGltLmFib3J0U2NhbikKKyAgICB7CisjaWZuZGVmIEFOSV9TTklGRkVSCisgICAgICAgIHBNYWMtPmxpbS5hYm9ydFNjYW4gPSAwOworICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9NSU5fQ0hBTk5FTF9USU1FUik7CisgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01BWF9DSEFOTkVMX1RJTUVSKTsKKworICAgICAgICAvL1NldCB0aGUgcmVzdW1lIGNoYW5uZWwgdG8gQW55IHZhbGlkIGNoYW5uZWwgKGludmFsaWQpLiAKKyAgICAgICAgLy9UaGlzIHdpbGwgaW5zdHJ1Y3QgSEFMIHRvIHNldCBpdCB0byBhbnkgcHJldmlvdXMgdmFsaWQgY2hhbm5lbC4KKyAgICAgICAgcGVTZXRSZXN1bWVDaGFubmVsKHBNYWMsIDAsIDApOworCisgICAgICAgIC8vLyBEb25lIHNjYW5uaW5nIGFsbCByZXF1aXJlZCBjaGFubmVscworICAgICAgICBsaW1TZW5kSGFsRmluaXNoU2NhblJlcShwTWFjLCBlTElNX0hBTF9GSU5JU0hfU0NBTl9XQUlUX1NUQVRFKTsKKyNlbmRpZgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8vIEF0bGVhc3Qgb25lIG1vcmUgY2hhbm5lbCBpcyB0byBiZSBzY2FubmVkCisKKyAgICBpZiAoKHBNYWMtPmxpbS5nTGltUmV0dXJuQWZ0ZXJGaXJzdE1hdGNoICYgMHg0MCkgfHwKKyAgICAgICAgKHBNYWMtPmxpbS5nTGltUmV0dXJuQWZ0ZXJGaXJzdE1hdGNoICYgMHg4MCkpCisgICAgeworICAgICAgICB3aGlsZSAocE1hYy0+bGltLmdMaW1DdXJyZW50U2NhbkNoYW5uZWxJZCA8PQorICAgICAgICAgICAgICAgKHRBTklfVTMyKSAocE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgLSAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgobGltR2V0Q3VycmVudFNjYW5DaGFubmVsKHBNYWMpIDw9IDE0KSAmJgorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW0yNEJhbmQxMWRTY2FuRG9uZSkgfHwKKyAgICAgICAgICAgICAgICAoKGxpbUdldEN1cnJlbnRTY2FuQ2hhbm5lbChwTWFjKSA+IDE0KSAmJgorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW01MEJhbmQxMWRTY2FuRG9uZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJza2lwcGluZyBjaGFuICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGltR2V0Q3VycmVudFNjYW5DaGFubmVsKHBNYWMpKTsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUN1cnJlbnRTY2FuQ2hhbm5lbElkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1DdXJyZW50U2NhbkNoYW5uZWxJZCA+CisgICAgICAgICAgICAodEFOSV9VMzIpIChwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyAtIDEpKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5saW0uYWJvcnRTY2FuID0gMDsKKyAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01JTl9DSEFOTkVMX1RJTUVSKTsKKyAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01BWF9DSEFOTkVMX1RJTUVSKTsKKyAgICAgICAgICAgIC8vLyBEb25lIHNjYW5uaW5nIGFsbCByZXF1aXJlZCBjaGFubmVscworICAgICAgICAgICAgLy9TZXQgdGhlIHJlc3VtZSBjaGFubmVsIHRvIEFueSB2YWxpZCBjaGFubmVsIChpbnZhbGlkKS4gCisgICAgICAgICAgICAvL1RoaXMgd2lsbCBpbnN0cnVjdCBIQUwgdG8gc2V0IGl0IHRvIGFueSBwcmV2aW91cyB2YWxpZCBjaGFubmVsLgorICAgICAgICAgICAgcGVTZXRSZXN1bWVDaGFubmVsKHBNYWMsIDAsIDApOworICAgICAgICAgICAgbGltU2VuZEhhbEZpbmlzaFNjYW5SZXEocE1hYywgZUxJTV9IQUxfRklOSVNIX1NDQU5fV0FJVF9TVEFURSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjaGFubmVsTnVtID0gbGltR2V0Q3VycmVudFNjYW5DaGFubmVsKHBNYWMpOworICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIkN1cnJlbnQgQ2hhbm5lbCB0byBiZSBzY2FubmVkIGlzICVkXG4iKSwKKyAgICAgICAgICAgY2hhbm5lbE51bSk7KQorCisgICAgbGltU2VuZEhhbFN0YXJ0U2NhblJlcShwTWFjLCBjaGFubmVsTnVtLCBlTElNX0hBTF9TVEFSVF9TQ0FOX1dBSVRfU1RBVEUpOworICAgIHJldHVybjsKK30gLyoqKiBlbmQgbGltQ29udGludWVDaGFubmVsU2NhbigpICoqKi8KKworCisKKy8qKgorICogbGltUmVzdG9yZVByZVNjYW5TdGF0ZSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbUNvbnRpbnVlQ2hhbm5lbFNjYW4oKQorICogdG8gcmVzdG9yZSBIVyBzdGF0ZSBwcmlvciB0byBlbnRlcmluZyAnc2NhbiBzdGF0ZScKKyAqCisgKkxPR0lDCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVJlc3RvcmVQcmVTY2FuU3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBpbnQgaTsKKyAgICAKKyAgICAvLy8gRGVhY3RpdmF0ZSBNSU4vTUFYIGNoYW5uZWwgdGltZXJzIGlmIHJ1bm5pbmcKKyAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9NSU5fQ0hBTk5FTF9USU1FUik7CisgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fTUFYX0NIQU5ORUxfVElNRVIpOworCisgICAgLyogUmUtYWN0aXZhdGUgSGVhcnRiZWF0IHRpbWVycyBmb3IgY29ubmVjdGVkIHNlc3Npb25zIGFzIHNjYW4gCisgICAgICogaXMgZG9uZSBpZiB0aGUgRFVUIGlzIGluIGFjdGl2ZSBtb2RlKi8KKyAgICBpZigoZVBNTV9TVEFURV9CTVBTX1dBS0VVUCA9PSBwTWFjLT5wbW0uZ1BtbVN0YXRlKSB8fAorICAgICAgIChlUE1NX1NUQVRFX1JFQURZID09IHBNYWMtPnBtbS5nUG1tU3RhdGUpKQorICAgIHsKKyAgICAgIGZvcihpPTA7aTxwTWFjLT5saW0ubWF4QnNzSWQ7aSsrKQorICAgICAgeworICAgICAgICBpZigocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCA9PSBUUlVFKSAmJiAKKyAgICAgICAgICAoZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSA9PSBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbU1sbVN0YXRlKSkKKyAgICAgICAgeworICAgICAgICAgIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcihwTWFjLCBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxpKSk7CisgICAgICAgIH0gIAorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNsZWFuIHVwIG1lc3NhZ2UgcXVldWUuCisgICAgICogSWYgU01FIG1lc3NhZ2VzLCByZWRpcmVjdCB0byBkZWZlcnJlZCBxdWV1ZS4KKyAgICAgKiBUaGUgcmVzdCB3aWxsIGJlIGRpc2NhcmRlZC4KKyAgICAgKi8KKyAgICAvL2xpbUNsZWFudXBNc2dRKHBNYWMpOworCisgICAgcE1hYy0+bGltLmdMaW1TeXN0ZW1JblNjYW5MZWFybk1vZGUgPSAwOworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNjYW4gZW5kZWQsIHRvb2sgJWQgdHVcbiIpLCAodHhfdGltZV9nZXQoKSAtIHBNYWMtPmxpbS5zY2FuU3RhcnRUaW1lKSk7KQorfSAvKioqIGxpbVJlc3RvcmVQcmVTY2FuU3RhdGUoKSAqKiovCisKKworc3RhdGljIHZvaWQKK21sbV9hZGRfc3RhKAorICAgIHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgIHRwQWRkU3RhUGFyYW1zICBwU3RhLAorICAgIHRBTklfVTggICAgICAgICpwQnNzaWQsCisgICAgdEFOSV9VOCAgICAgICAgIGh0Q2FwYWJsZSwKKyAgICB0cFBFU2Vzc2lvbiAgICAgcHNlc3Npb25FbnRyeSkgIC8vcHNlc3Npb25FbnRyeSAgbWF5IHJlcXVpcmVkIGluIGZ1dHVyZQoreworICAgIHRBTklfVTMyIHZhbDsKKyAgICBpbnQgICAgICBpOworICAgIAorCisgICAgcFN0YS0+c3RhVHlwZSA9IFNUQV9FTlRSWV9TRUxGOyAvLyBJZGVudGlmeWluZyBzZWxmCisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAgcFN0YS0+YnNzSWQsICAgcEJzc2lkLCAgc2l6ZW9mKCB0U2lyTWFjQWRkciApKTsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAgcFN0YS0+c3RhTWFjLCBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICAvKiBDb25maWd1cmF0aW9uIHJlbGF0ZWQgcGFyYW1ldGVycyB0byBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQgQlQtQU1QICovCisKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0SW50KCBwTWFjLCBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTCwgJnZhbCApKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkNvdWxkbid0IGdldCBMSVNURU5fSU5URVJWQUxcbiIpKTsKKyAgICAKKyAgICBwU3RhLT5saXN0ZW5JbnRlcnZhbCA9ICh0QU5JX1UxNikgdmFsOworICAgIAorICAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gd2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19TSE9SVF9QUkVBTUJMRSwgJnZhbCkgKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkNvdWxkbid0IGdldCBTSE9SVF9QUkVBTUJMRVxuIikpOworICAgIHBTdGEtPnNob3J0UHJlYW1ibGVTdXBwb3J0ZWQgPSAodEFOSV9VOCl2YWw7CisKKyAgICBwU3RhLT5hc3NvY0lkICAgICAgICAgICAgICAgPSAwOyAvLyBJcyBTTUFDIE9LIHdpdGggdGhpcz8KKyAgICBwU3RhLT53bW1FbmFibGVkICAgICAgICAgICAgPSAwOworICAgIHBTdGEtPnVBUFNEICAgICAgICAgICAgICAgICA9IDA7CisgICAgcFN0YS0+bWF4U1BMZW4gICAgICAgICAgICAgID0gMDsKKyAgICBwU3RhLT51czMyTWF4QW1wZHVEdXJhdGlvbiAgPSAwOworICAgIHBTdGEtPm1heEFtcGR1U2l6ZSAgICAgICAgICA9IDA7IC8vIDA6IDhrLCAxOiAxNmssMjogMzJrLDM6IDY0aworCisKKyAgICBpZihJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSkpIAorICAgIHsKKyAgICAgICAgcFN0YS0+aHRDYXBhYmxlICAgICAgICAgPSBodENhcGFibGU7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBwU3RhLT5ncmVlbkZpZWxkQ2FwYWJsZSA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX0dSRUVORklFTEQsIHBzZXNzaW9uRW50cnkpOworICAgICAgICBwU3RhLT50eENoYW5uZWxXaWR0aFNldCA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVCwgcHNlc3Npb25FbnRyeSApOworICAgICAgICBwU3RhLT5taW1vUFMgICAgICAgICAgICA9ICh0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfTUlNT19QT1dFUl9TQVZFLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgIHBTdGEtPnJpZnNNb2RlICAgICAgICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfUklGU19NT0RFLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgIHBTdGEtPmxzaWdUeG9wUHJvdGVjdGlvbiA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX0xTSUdfVFhPUF9QUk9URUNUSU9OLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgIHBTdGEtPmRlbEJBU3VwcG9ydCAgICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfREVMQVlFRF9CQSwgcHNlc3Npb25FbnRyeSApOworICAgICAgICBwU3RhLT5tYXhBbXBkdURlbnNpdHkgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX01QRFVfREVOU0lUWSwgcHNlc3Npb25FbnRyeSApOworICAgICAgICBwU3RhLT5tYXhBbXNkdVNpemUgICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX01BWF9BTVNEVV9MRU5HVEgsIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgcFN0YS0+ZkRzc3NDY2tNb2RlNDBNaHogPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9EU1NTX0NDS19NT0RFXzQwTUhaLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcFN0YS0+ZlNob3J0R0kyME1oeiAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9TSE9SVF9HSV8yME1IWiwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIHBTdGEtPmZTaG9ydEdJNDBNaHogICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfU0hPUlRfR0lfNDBNSFosIHBzZXNzaW9uRW50cnkpOworI2Vsc2UKKyAgICAgICAgcFN0YS0+Z3JlZW5GaWVsZENhcGFibGUgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9HUkVFTkZJRUxEICk7CisgICAgICAgIHBTdGEtPnR4Q2hhbm5lbFdpZHRoU2V0ID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfU1VQUE9SVEVEX0NIQU5ORUxfV0lEVEhfU0VUICk7CisgICAgICAgIHBTdGEtPm1pbW9QUyAgICAgICAgICAgID0gKHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSlsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9NSU1PX1BPV0VSX1NBVkUgKTsKKyAgICAgICAgcFN0YS0+cmlmc01vZGUgICAgICAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9SSUZTX01PREUgKTsKKyAgICAgICAgcFN0YS0+bHNpZ1R4b3BQcm90ZWN0aW9uID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfTFNJR19UWE9QX1BST1RFQ1RJT04gKTsKKyAgICAgICAgcFN0YS0+ZGVsQkFTdXBwb3J0ICAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9ERUxBWUVEX0JBICk7CisgICAgICAgIHBTdGEtPm1heEFtcGR1RGVuc2l0eSAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfTVBEVV9ERU5TSVRZICk7CisgICAgICAgIHBTdGEtPm1heEFtc2R1U2l6ZSAgICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfTUFYX0FNU0RVX0xFTkdUSCApOworICAgICAgICBwU3RhLT5mRHNzc0Nja01vZGU0ME1oeiA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX0RTU1NfQ0NLX01PREVfNDBNSFopOworICAgICAgICBwU3RhLT5mU2hvcnRHSTIwTWh6ICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1NIT1JUX0dJXzIwTUhaKTsKKyAgICAgICAgcFN0YS0+ZlNob3J0R0k0ME1oeiAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9TSE9SVF9HSV80ME1IWik7CisKKyNlbmRpZgorICAgIH0KKworICAgIGxpbVBvcHVsYXRlT3duUmF0ZVNldChwTWFjLCAmcFN0YS0+c3VwcG9ydGVkUmF0ZXMsIE5VTEwsIGZhbHNlLHBzZXNzaW9uRW50cnkpOworICAgIGxpbUZpbGxTdXBwb3J0ZWRSYXRlc0luZm8ocE1hYywgTlVMTCwgJnBTdGEtPnN1cHBvcnRlZFJhdGVzLHBzZXNzaW9uRW50cnkpOworICAgIAorICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJHRjogJWQsIENobmxXaWR0aDogJWQsIE1pbW9QUzogJWQsIGxzaWdUWE9QOiAlZCwgZHNzc0NDSzogJWQsIFNHSTIwOiAlZCwgU0dJNDAlZFxuIikgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YS0+Z3JlZW5GaWVsZENhcGFibGUsIHBTdGEtPnR4Q2hhbm5lbFdpZHRoU2V0LCBwU3RhLT5taW1vUFMsIHBTdGEtPmxzaWdUeG9wUHJvdGVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhLT5mRHNzc0Nja01vZGU0ME1oeixwU3RhLT5mU2hvcnRHSTIwTWh6LCBwU3RhLT5mU2hvcnRHSTQwTWh6KTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgaWYgKFZPU19QMlBfR09fTU9ERSA9PSBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEpCisgICAgIHsKKyAgICAgICAgIHBTdGEtPnAycENhcGFibGVTdGEgPSAxOworICAgICB9CisjZW5kaWYKKworICAgIC8vRGlzYWJsZSBCQS4gSXQgd2lsbCBiZSBzZXQgYXMgcGFydCBvZiBBRERCQSBuZWdvdGlhdGlvbi4KKyAgICBmb3IoIGkgPSAwOyBpIDwgU1RBQ0ZHX01BWF9UQzsgaSsrICkKKyAgICB7CisgICAgICAgIHBTdGEtPnN0YVRDUGFyYW1zW2ldLnR4VXNlQkEgPSBlQkFfRElTQUJMRTsKKyAgICAgICAgcFN0YS0+c3RhVENQYXJhbXNbaV0ucnhVc2VCQSA9IGVCQV9ESVNBQkxFOworICAgIH0KKyAgICAKK30KKworLy8KKy8vIE5ldyBIQUwgaW50ZXJmYWNlIC0gV0RBX0FERF9CU1NfUkVRCisvLyBQYWNrYWdlIFdEQV9BRERfQlNTX1JFUSB0byBIQUwsIGluIG9yZGVyIHRvIHN0YXJ0IGEgQlNTCisvLwordFNpclJlc3VsdENvZGVzCitsaW1NbG1BZGRCc3MgKAorICAgIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICB0TGltTWxtU3RhcnRSZXEgICAgKnBNbG1TdGFydFJlcSwKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFNpck1zZ1EgbXNnUTsKKyAgICB0cEFkZEJzc1BhcmFtcyBwQWRkQnNzUGFyYW1zID0gTlVMTDsKKyAgICB0QU5JX1UzMiByZXRDb2RlOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHRBTklfVTMyIHZhbCA9IDA7CisjZW5kaWYKKyAgICAKKyAgICAvLyBQYWNrYWdlIFdEQV9BRERfQlNTX1JFUSBtZXNzYWdlIHBhcmFtZXRlcnMKKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcEFkZEJzc1BhcmFtcywgc2l6ZW9mKCB0QWRkQnNzUGFyYW1zICkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBBRERfQlNTXG4iICkpOworICAgICAgICAvLyBSZXNwb25kIHRvIFNNRSB3aXRoIExJTV9NTE1fU1RBUlRfQ05GCisgICAgICAgIHJldHVybiBlU0lSX1NNRV9IQUxfU0VORF9NRVNTQUdFX0ZBSUw7CisgICAgfQorCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwQWRkQnNzUGFyYW1zLCBzaXplb2YodEFkZEJzc1BhcmFtcykpOworCisgICAgLy8gRmlsbCBpbiB0QWRkQnNzUGFyYW1zIG1lbWJlcnMKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAgcEFkZEJzc1BhcmFtcy0+YnNzSWQsIHBNbG1TdGFydFJlcS0+YnNzSWQsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0U2lyTWFjQWRkciApKTsKKworICAgIC8vIEZpbGwgaW4gdEFkZEJzc1BhcmFtcyBzZWxmTWFjQWRkcgorICAgIHBhbENvcHlNZW1vcnkgKCBwTWFjLT5oSGRkLCAgcEFkZEJzc1BhcmFtcy0+c2VsZk1hY0FkZHIsIAorICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRTaXJNYWNBZGRyICkpOworICAgIAorICAgIHBBZGRCc3NQYXJhbXMtPmJzc1R5cGUgPSBwTWxtU3RhcnRSZXEtPmJzc1R5cGU7CisgICAgaWYgKChwTWxtU3RhcnRSZXEtPmJzc1R5cGUgPT0gZVNJUl9JQlNTX01PREUpIHx8IAorICAgICAgICAocE1sbVN0YXJ0UmVxLT5ic3NUeXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSl8fCAKKyAgICAgICAgKHBNbG1TdGFydFJlcS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX1NUQV9NT0RFKSkgeworICAgICAgICBwQWRkQnNzUGFyYW1zLT5vcGVyTW9kZSAgICAgICAgICAgICAgICAgPSBCU1NfT1BFUkFUSU9OQUxfTU9ERV9TVEE7CisgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBlbHNlIGlmIChwTWxtU3RhcnRSZXEtPmJzc1R5cGUgPT0gZVNJUl9JTkZSQV9BUF9NT0RFKXsKKyNlbHNlCisgICAgZWxzZXsKKyNlbmRpZgorICAgICAgICBwQWRkQnNzUGFyYW1zLT5vcGVyTW9kZSAgICAgICAgICAgICAgICAgPSBCU1NfT1BFUkFUSU9OQUxfTU9ERV9BUDsKKyAgICB9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFICAKKyAgICBpZiggd2xhbl9jZmdHZXRJbnQgKCBwTWFjLCBXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRSwgJnZhbCApICE9IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cgKCBwTWFjLCBMT0dQLCBGTCgiIEVycm9yIDogdW5hYmxlIHRvIGZldGNoIHRoZSBXTklfQ0ZHX1NIT1JUX1NMT1RfVElNRVxuIikpOworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKilwQWRkQnNzUGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfU01FX0hBTF9TRU5EX01FU1NBR0VfRkFJTDsKKyAgICB9CisgICAgcEFkZEJzc1BhcmFtcy0+c2hvcnRTbG90VGltZVN1cHBvcnRlZCA9ICh0QU5JX1U4KXZhbDsKKyNlbmRpZgorCisKKyAgICBwQWRkQnNzUGFyYW1zLT5iZWFjb25JbnRlcnZhbCAgICAgICAgICAgICAgID0gcE1sbVN0YXJ0UmVxLT5iZWFjb25QZXJpb2Q7CisgICAgcEFkZEJzc1BhcmFtcy0+ZHRpbVBlcmlvZCAgICAgICAgICAgICAgICAgICA9IHBNbG1TdGFydFJlcS0+ZHRpbVBlcmlvZDsKKyAgICBwQWRkQnNzUGFyYW1zLT5jZlBhcmFtU2V0LmNmcENvdW50ICAgICAgICAgID0gcE1sbVN0YXJ0UmVxLT5jZlBhcmFtU2V0LmNmcENvdW50OworICAgIHBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwUGVyaW9kICAgICAgICAgPSBwTWxtU3RhcnRSZXEtPmNmUGFyYW1TZXQuY2ZwUGVyaW9kOworICAgIHBBZGRCc3NQYXJhbXMtPmNmUGFyYW1TZXQuY2ZwTWF4RHVyYXRpb24gICAgPSBwTWxtU3RhcnRSZXEtPmNmUGFyYW1TZXQuY2ZwTWF4RHVyYXRpb247CisgICAgcEFkZEJzc1BhcmFtcy0+Y2ZQYXJhbVNldC5jZnBEdXJSZW1haW5pbmcgICA9IHBNbG1TdGFydFJlcS0+Y2ZQYXJhbVNldC5jZnBEdXJSZW1haW5pbmc7CisKKyAgICBwQWRkQnNzUGFyYW1zLT5yYXRlU2V0Lm51bVJhdGVzID0gcE1sbVN0YXJ0UmVxLT5yYXRlU2V0Lm51bVJhdGVzOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICBwQWRkQnNzUGFyYW1zLT5yYXRlU2V0LnJhdGUsCisgICAgICAgICAgICAgICAgICAgcE1sbVN0YXJ0UmVxLT5yYXRlU2V0LnJhdGUsIHBNbG1TdGFydFJlcS0+cmF0ZVNldC5udW1SYXRlcyApOworCisgICAgcEFkZEJzc1BhcmFtcy0+bndUeXBlID0gcE1sbVN0YXJ0UmVxLT5ud1R5cGU7CisKKyAgICBwQWRkQnNzUGFyYW1zLT5odENhcGFibGUgICAgICAgICAgICA9IHBNbG1TdGFydFJlcS0+aHRDYXBhYmxlOworICAgIHBBZGRCc3NQYXJhbXMtPmh0T3Blck1vZGUgICAgICAgICAgID0gcE1sbVN0YXJ0UmVxLT5odE9wZXJNb2RlOworICAgIHBBZGRCc3NQYXJhbXMtPmR1YWxDVFNQcm90ZWN0aW9uICAgID0gcE1sbVN0YXJ0UmVxLT5kdWFsQ1RTUHJvdGVjdGlvbjsKKyAgICBwQWRkQnNzUGFyYW1zLT50eENoYW5uZWxXaWR0aFNldCAgICA9IHBNbG1TdGFydFJlcS0+dHhDaGFubmVsV2lkdGhTZXQ7CisKKyAgICBwQWRkQnNzUGFyYW1zLT5jdXJyZW50T3BlckNoYW5uZWwgICA9IHBNbG1TdGFydFJlcS0+Y2hhbm5lbE51bWJlcjsKKyAgICBwQWRkQnNzUGFyYW1zLT5jdXJyZW50RXh0Q2hhbm5lbCAgICA9IG1sbV9nZXRfZXh0X2NobmwocE1hYywgcE1sbVN0YXJ0UmVxLT5jYk1vZGUpOworCisgICAgLyogVXBkYXRlIFBFIHNlc3Npb25JZCovCisgICAgcEFkZEJzc1BhcmFtcy0+c2Vzc2lvbklkICAgICAgICAgICAgPSBwTWxtU3RhcnRSZXEtPnNlc3Npb25JZDsgCisKKyAgICAvL1NlbmQgdGhlIFNTSUQgdG8gSEFMIHRvIGVuYWJsZSBTU0lEIG1hdGNoaW5nIGZvciBJQlNTCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgJihwQWRkQnNzUGFyYW1zLT5zc0lkLnNzSWQpLAorICAgICAgICBwTWxtU3RhcnRSZXEtPnNzSWQuc3NJZCwKKyAgICAgICAgcE1sbVN0YXJ0UmVxLT5zc0lkLmxlbmd0aCk7CisgICAgcEFkZEJzc1BhcmFtcy0+c3NJZC5sZW5ndGggPSBwTWxtU3RhcnRSZXEtPnNzSWQubGVuZ3RoOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBwQWRkQnNzUGFyYW1zLT5iSGlkZGVuU1NJREVuID0gcE1sbVN0YXJ0UmVxLT5zc2lkSGlkZGVuOworICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJUUllJTkcgVE8gSElERSBTU0lEICVkXG4iICkscEFkZEJzc1BhcmFtcy0+YkhpZGRlblNTSURFbik7CisgICAgLy8gQ1IzMDkxODMuIERpc2FibGUgUHJveHkgUHJvYmUgUnNwLiAgSG9zdCBoYW5kbGVzIFByb2JlIFJlcXVlc3RzLiAgVW50aWwgRlcgZml4ZWQuIAorICAgIHBBZGRCc3NQYXJhbXMtPmJQcm94eVByb2JlUmVzcEVuID0gMDsKKyAgICBwQWRkQnNzUGFyYW1zLT5vYnNzUHJvdEVuYWJsZWQgPSBwTWxtU3RhcnRSZXEtPm9ic3NQcm90RW5hYmxlZDsKKworI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJICAKKyAgICBwQWRkQnNzUGFyYW1zLT5tYXhUeFBvd2VyID0gcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlcjsKKyNlbmRpZgorICAgIG1sbV9hZGRfc3RhKHBNYWMsICZwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LAorICAgICAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPmJzc0lkLCBwQWRkQnNzUGFyYW1zLT5odENhcGFibGUscHNlc3Npb25FbnRyeSk7CisKKyAgICBwQWRkQnNzUGFyYW1zLT5zdGF0dXMgICA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgcEFkZEJzc1BhcmFtcy0+cmVzcFJlcWQgPSAxOworCisgICAgLy8gU2V0IGEgbmV3IHN0YXRlIGZvciBNTE1FCisgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9BRERfQlNTX1JTUF9TVEFURTsKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKworICAgIHBBZGRCc3NQYXJhbXMtPmhhbFBlcnNvbmE9cHNlc3Npb25FbnRyeS0+cGVQZXJzb25hOyAvL3Bhc3Mgb24gdGhlIHNlc3Npb24gcGVyc29uYSB0byBoYWwKKworICAgIHBBZGRCc3NQYXJhbXMtPmJTcGVjdHJ1bU1ndEVuYWJsZWQgPSBwc2Vzc2lvbkVudHJ5LT5zcGVjdHJ1bU1ndEVuYWJsZWQ7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgcEFkZEJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW1WYWxpZCA9IDA7CisjZW5kaWYKKworICAgIC8vCisgICAgLy8gRklYTUVfR0VONAorICAgIC8vIEEgZ2xvYmFsIGNvdW50ZXIgKGRpYWxvZyB0b2tlbikgaXMgcmVxdWlyZWQgdG8ga2VlcCB0cmFjayBvZgorICAgIC8vIGFsbCBQRSA8LT4gSEFMIGNvbW11bmljYXRpb24ocykKKyAgICAvLworICAgIG1zZ1EudHlwZSAgICAgICA9IFdEQV9BRERfQlNTX1JFUTsKKyAgICBtc2dRLnJlc2VydmVkICAgPSAwOworICAgIG1zZ1EuYm9keXB0ciAgICA9IHBBZGRCc3NQYXJhbXM7CisgICAgbXNnUS5ib2R5dmFsICAgID0gMDsKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKworICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoICJTZW5kaW5nIFdEQV9BRERfQlNTX1JFUS4uLlxuIiApKTsKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiUG9zdGluZyBBRERfQlNTX1JFUSB0byBIQUwgZmFpbGVkLCByZWFzb249JVhcbiIpLCByZXRDb2RlICk7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwodm9pZCAqKXBBZGRCc3NQYXJhbXMpOworICAgICAgICByZXR1cm4gZVNJUl9TTUVfSEFMX1NFTkRfTUVTU0FHRV9GQUlMOworICAgIH0KKworICAgIHJldHVybiBlU0lSX1NNRV9TVUNDRVNTOworfQorCisKKy8qKgorICogbGltUHJvY2Vzc01sbVN0YXJ0UmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNTE1fU1RBUlRfUkVRIG1lc3NhZ2UKKyAqIGZyb20gU01FCisgKgorICpMT0dJQzoKKyAqIDEpIE1MTUUgcmVjZWl2ZXMgTElNX01MTV9TVEFSVF9SRVEgZnJvbSBMSU0KKyAqIDIpIE1MTUUgc2VuZHMgV0RBX0FERF9CU1NfUkVRIHRvIEhBTAorICogMykgTUxNRSBjaGFuZ2VzIHN0YXRlIHRvIGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1NUQVRFCisgKiBNTE1FIG5vdyB3YWl0cyBmb3IgSEFMIHRvIHNlbmQgV0RBX0FERF9CU1NfUlNQCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitsaW1Qcm9jZXNzTWxtU3RhcnRSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdExpbU1sbVN0YXJ0UmVxICAgICAgICAgICpwTWxtU3RhcnRSZXE7CisgICAgdExpbU1sbVN0YXJ0Q25mICAgICAgICAgIG1sbVN0YXJ0Q25mOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKyAgICAKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHBNbG1TdGFydFJlcSA9ICh0TGltTWxtU3RhcnRSZXEgKikgcE1zZ0J1ZjsKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBNbG1TdGFydFJlcS0+c2Vzc2lvbklkKSk9PU5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIG1sbVN0YXJ0Q25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgIT0gZUxJTV9NTE1fSURMRV9TVEFURSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgU3RhcnQgcmVxIGluIHN0YXRlcyBvdGhlciB0aGFuIGlkbGUuCisgICAgICAgICAqIFJldHVybiBTdGFydCBjb25maXJtIHdpdGggZmFpbHVyZSBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBNTE1fU1RBUlRfUkVRIGluIHN0YXRlICVYXG4iKSxwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7KQorICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPR0UsIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKTsKKyAgICAgICAgbWxtU3RhcnRDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0JTU19BTFJFQURZX1NUQVJURURfT1JfSk9JTkVEOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgCisgICAgI2lmIDAKKyAgICAgaWYgKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTCwgcE1sbVN0YXJ0UmVxLT5jaGFubmVsTnVtYmVyKSE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHNldCBDVVJSRU5UX0NIQU5ORUwgYXQgQ0ZHXG4iKSk7CisgICAgIAorICAgICAgICBwTWFjLT5saW0uZ0xpbUN1cnJlbnRDaGFubmVsSWQgPSBwTWxtU3RhcnRSZXEtPmNoYW5uZWxOdW1iZXI7CisgICAgI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKworCisgICAgLy8gVXBkYXRlIEJTU0lEICYgU1NJRCBhdCBDRkcgZGF0YWJhc2UKKyAgICAjaWYgMCAvL1dlIGFyZSBub3QgdXNpbmcgdGhlIEJTU0lEIGFuZCBTU0lEIGZyb20gdGhlIGNvbmZpZyBmaWxlLCBpbnN0ZWFkIHdlIGFyZSByZWFkaW5nIGZvcm0gdGhlIHNlc3Npb24gdGFibGUKKyAgICAgaWYgKGNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX0JTU0lELCAodEFOSV9VOCAqKSBwTWxtU3RhcnRSZXEtPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKQorICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHVwZGF0ZSBCU1NJRCBhdCBDRkdcbiIpKTsKKworICAgCisgICAgCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1DdXJyZW50QnNzSWQsCisgICAgICAgICAgICAgICAgICAgcE1sbVN0YXJ0UmVxLT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAjZW5kaWYgLy9UTyBTVVBQT1JUIEJULUFNUAorCisgICAgI2lmIDAKKyAgICBpZiAoY2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfU1NJRCwgKHRBTklfVTggKikgJnBNbG1TdGFydFJlcS0+c3NJZC5zc0lkLCBwTWxtU3RhcnRSZXEtPnNzSWQubGVuZ3RoKQorICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHVwZGF0ZSBTU0lEIGF0IENGR1xuIikpOworICAgICNlbmRpZiAvL1RvIFNVUFBPUlQgQlQtQU1QCisgICAKKyAgICAgICAgIAorICAgLy8gcE1hYy0+bGltLmdMaW1DdXJyZW50U1NJRC5sZW5ndGggPSBwTWxtU3RhcnRSZXEtPnNzSWQubGVuZ3RoOworCisgICAgICAgICNpZiAwCisgICAgICAgIGlmIChjZmdTZXRTdHIocE1hYywgV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVCwKKyAgICAgICAgICAgKHRBTklfVTggKikgJnBNYWMtPmxpbS5ncExpbVN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZSwKKyAgICAgICAgICAgcE1hYy0+bGltLmdwTGltU3RhcnRCc3NSZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlcykKKyAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCB1cGRhdGUgT3BlcmF0aW9uYWwgUmF0ZXNldCBhdCBDRkdcbiIpKTsKKyAgICAgICAgI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICAgICAgCisKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMLCBwTWFjLT5saW0uZ3BMaW1TdGFydEJzc1JlcS0+cG93ZXJMZXZlbCkKKyAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCBzZXQgV05JX0NGR19DVVJSRU5UX1RYX1BPV0VSX0xFVkVMIGF0IENGR1xuIikpOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjaWYgMCAvLyBQZXJpb2RpYyB0aW1lciBmb3IgcmVtb3ZlIFdQUyBQQkMgcHJvYmxlIHJlc3BvbnNlIGVudHJ5IGluIFBFIGlzIGRpc2JhbGVkIG5vdy4KKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgeworICAgICAgICBpZihwTWFjLT5saW0ubGltVGltZXJzLmdMaW1XUFNPdmVybGFwVGltZXJPYmouaXNUaW1lckNyZWF0ZWQgPT0gZUFOSV9CT09MRUFOX0ZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1XUFNPdmVybGFwVGltZXJPYmouZ0xpbVdQU092ZXJsYXBUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFMgT1ZFUkxBUCBUaW1lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltV1BTT3ZlcmxhcFRpbWVySGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTElNX1dQU19PVkVSTEFQX1RJTUVPVVQsIC8vIGV4cGlyYXRpb25faW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNfTVNfVE9fVElDS1MoTElNX1dQU19PVkVSTEFQX1RJTUVSX01TKSwgIC8vIGluaXRpYWxfdGlja3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNfTVNfVE9fVElDS1MoTElNX1dQU19PVkVSTEFQX1RJTUVSX01TKSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzY2hlZHVsZV90aWNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX0FVVE9fQUNUSVZBVEUgLyogVFhfTk9fQUNUSVZBVEUqLykgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImZhaWxlZCB0byBjcmVhdGUgV1BTIG92ZXJsYXAgVGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltV1BTT3ZlcmxhcFRpbWVyT2JqLnNlc3Npb25JZCA9IHBNbG1TdGFydFJlcS0+c2Vzc2lvbklkOworICAgICAgICAgICAgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltV1BTT3ZlcmxhcFRpbWVyT2JqLmlzVGltZXJDcmVhdGVkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkNyZWF0ZSBXUFMgb3ZlcmxhcCBUaW1lciwgc2Vzc2lvbj0lZFxuIiksIHBNbG1TdGFydFJlcS0+c2Vzc2lvbklkKTsKKworICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1XUFNPdmVybGFwVGltZXJPYmouZ0xpbVdQU092ZXJsYXBUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInR4X3RpbWVyX2FjdGl2YXRlIGZhaWxlZFxuIikpOworICAgICAgICAgICAgfSAgICAKKyAgICAgICB9CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworCisgICAKKyAgICBtbG1TdGFydENuZi5yZXN1bHRDb2RlID0gbGltTWxtQWRkQnNzKHBNYWMsIHBNbG1TdGFydFJlcSxwc2Vzc2lvbkVudHJ5KTsKKworZW5kOgorICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICovCisgICAgIG1sbVN0YXJ0Q25mLnNlc3Npb25JZCA9IHBNbG1TdGFydFJlcS0+c2Vzc2lvbklkOworICAgIAorICAgIC8vLyBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIExpbU1sbVNjYW5SZXEKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTXNnQnVmKTsKKworICAgIC8vCisgICAgLy8gUmVzcG9uZCBpbW1lZGlhdGVseSB0byBMSU0sIG9ubHkgaWYgTUxNRSBoYXMgbm90IGJlZW4KKyAgICAvLyBzdWNjZXNzZnVsbHkgYWJsZSB0byBzZW5kIFdEQV9BRERfQlNTX1JFUSB0byBIQUwuCisgICAgLy8gRWxzZSwgTElNX01MTV9TVEFSVF9DTkYgd2lsbCBiZSBzZW50IGFmdGVyIHJlY2VpdmluZworICAgIC8vIFdEQV9BRERfQlNTX1JTUCBmcm9tIEhBTAorICAgIC8vCisgICAgaWYoIGVTSVJfU01FX1NVQ0NFU1MgIT0gbWxtU3RhcnRDbmYucmVzdWx0Q29kZSApCisgICAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX1NUQVJUX0NORiwgKHRBTklfVTMyICopICZtbG1TdGFydENuZik7Cit9IC8qKiogbGltUHJvY2Vzc01sbVN0YXJ0UmVxKCkgKioqLworCisKKy8qCisqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIFNjYW4gaXMgYWxsb3dlZCBvciBub3QuCisqIEl0IGNoZWNrcyBlYWNoIHNlc3Npb24gYW5kIGlmIGFueSBzZXNzaW9uIGlzIG5vdCBpbiB0aGUgbm9ybWFsIHN0YXRlLAorKiBpdCB3aWxsIHJldHVybiBmYWxzZS4KKyogTm90ZTogIEJUQU1QX1NUQSBjYW4gYmUgaW4gTElOS19FU1QgYXMgd2VsbCBhcyBCU1NfU1RBUlRFRCBTdGF0ZSwgc28KKyogYm90aCBjYXNlcyBhcmUgaGFuZGxlZCBiZWxvdy4KKyovCisKK3N0YXRpYyB0QU5JX1U4IF9fbGltTWxtU2NhbkFsbG93ZWQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBpbnQgaTsKKworICAgIGlmKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgIT0gZUxJTV9TTUVfSURMRV9TVEFURSkKKyAgICB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZm9yKGkgPTA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoISggKCAoICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5ic3NUeXBlID09IGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSkpJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkgKXx8CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICggICAgKCAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5ic3NUeXBlID09IGVTSVJfSUJTU19NT0RFKXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpICkmJgorICAgICAgICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURSkgKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgICAgIHx8ICAoICggKCAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5ic3NUeXBlID09IGVTSVJfSU5GUkFfQVBfTU9ERSkgCisgICAgICAgICAgICAgICAgICAgICAgJiYgKCBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpICkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpICkKKyAgICAgICAgICAgICAgICAgICYmIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFKSApCisjZW5kaWYKKyAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworCisvKioKKyAqIGxpbVByb2Nlc3NNbG1TY2FuUmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNTE1fU0NBTl9SRVEgbWVzc2FnZQorICogZnJvbSBTTUUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBNc2dCdWYgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc01sbVNjYW5SZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdExpbU1sbVNjYW5DbmYgICAgICAgbWxtU2NhbkNuZjsKKworICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJTZW5kaW5nIFNUQVJUX1NDQU4gZnJvbSBMSU0gd2hpbGUgb25lIHJlcSBpcyBwZW5kaW5nXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgaWYoX19saW1NbG1TY2FuQWxsb3dlZChwTWFjKSAmJiAKKyAgICAoKCh0TGltTWxtU2NhblJlcSAqKSBwTXNnQnVmKS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgIT0gMCkpCisgICAgICAgIAorICAgIHsKKyAgICAgICAgLy8vIEhvbGQgb250byBTQ0FOIFJFUSBjcml0ZXJpYQorICAgICAgICBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxID0gKHRMaW1NbG1TY2FuUmVxICopIHBNc2dCdWY7CisKKyAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbiBhcmUgJWQgXG4iKSwKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzKTspCisKKyAgICAgICAgcE1hYy0+bGltLmdMaW1QcmV2TWxtU3RhdGUgPSBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlOworCisgICAgICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5zY2FuVHlwZSA9PSBlU0lSX0FDVElWRV9TQ0FOKQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEU7CisgICAgICAgIGVsc2UgLy8gZVNJUl9QQVNTSVZFX1NDQU4KKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPSBlTElNX01MTV9QQVNTSVZFX1NDQU5fU1RBVEU7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworCisgICAgICAgIHBNYWMtPmxpbS5nTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlID0gMTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgcE1hYy0+bGltLmdUb3RhbFNjYW5EdXJhdGlvbiA9IAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5tYXhDaGFubmVsVGltZSoKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHM7CisjZW5kaWYKKyAgICAgICAgbGltU2V0U2Nhbk1vZGUocE1hYyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgU0NBTiByZXEgaW4gb3RoZXIgc3RhdGVzCisgICAgICAgICAqIE9SIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBMSU1fTUxNX1NDQU5fUkVRIHdpdGgKKyAgICAgICAgICogemVybyBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICogTG9nIGVycm9yCisgICAgICAgICAqLworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIE1MTV9TQ0FOX1JFUSBpbiBzdGF0ZSAlWCBPUiB6ZXJvIG51bWJlciBvZiBjaGFubmVsczogJVhcbiIpLAorICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSwgKCh0TGltTWxtU2NhblJlcSAqKSBwTXNnQnVmKS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMpOworICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPR1csIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpOworCisgICAgICAgIC8vLyBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yCisgICAgICAgIC8vLyBwTWFjLT5saW0uZ0xpbU1sbVNjYW5SZXEKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcE1zZ0J1Zik7CisKKyAgICAgICAgLy8vIFJldHVybiBTY2FuIGNvbmZpcm0gd2l0aCBJTlZBTElEX1BBUkFNRVRFUlMKKworICAgICAgICBtbG1TY2FuQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICAgIG1sbVNjYW5DbmYuc2NhblJlc3VsdExlbmd0aCA9IDA7CisgICAgICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9TQ0FOX0NORiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJm1sbVNjYW5DbmYpOworICAgIH0KK30gLyoqKiBsaW1Qcm9jZXNzTWxtU2NhblJlcSgpICoqKi8KKworCisKKy8qKgorICogbGltUHJvY2Vzc01sbVBvc3RKb2luU3VzcGVuZExpbmsoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgc3VzcGVuZCBsaW5rIHdoaWxlIGpvaW5pbmcKKyAqIG9mZiBjaGFubmVsLgorICoKKyAqTE9HSUM6CisgKiBDaGVjayBmb3Igc3VzcGVuZCBzdGF0ZS4gCisgKiBJZiBzdWNjZXNzLCBwcm9jZWVkIHdpdGggc2V0dGluZyBsaW5rIHN0YXRlIHRvIHJlY2lldmUgdGhlIAorICogcHJvYmUgcmVzcG9uc2UvYmVhY29uIGZyb20gaW50ZW5kZWQgQVAuCisgKiBTd2l0Y2ggdG8gdGhlIEFQcyBjaGFubmVsLgorICogT24gYW4gZXJyb3IgY2FzZSwgc2VuZCB0aGUgTUxNX0pPSU5fQ05GIHdpdGggZXJyb3Igc3RhdHVzLgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgc3RhdHVzICAgIHN0YXR1cyBvZiBzdXNwZW5kIGxpbmsuCisgKiBAcGFyYW0gIGN0eCAgICAgICBwYXNzZWQgd2hpbGUgY2FsbGluZyBzdXNwZW5kIGxpbmsocHNlc3Npb25FbnRyeSkKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc01sbVBvc3RKb2luU3VzcGVuZExpbmsodHBBbmlTaXJHbG9iYWwgcE1hYywgZUhhbFN0YXR1cyBzdGF0dXMsIHRBTklfVTMyICpjdHgpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBjaGFuTnVtOworICAgIHRMaW1NbG1Kb2luQ25mICAgICAgbWxtSm9pbkNuZjsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnkgPSAodHBQRVNlc3Npb24pY3R4OworICAgIHRTaXJMaW5rU3RhdGUgICAgICAgbGlua1N0YXRlOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzICkKKyAgICB7CisgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJTdXNwZW5kIGxpbmsgZmFpbGVkLiBOb3QgcHJvY2VlZGluZyB3aXRoIGpvaW5cbiIpKTsKKyAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1QcmV2TWxtU3RhdGUgPSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0pPSU5fQkVBQ09OX1NUQVRFOworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworCisgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fSk9JTl9GQUlMX1RJTUVSKTsKKworICAgIC8vYXNzaWduIGFwcHJvcHJpYXRlIHNlc3Npb25JZCB0byB0aGUgdGltZXIgb2JqZWN0CisgICAgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltSm9pbkZhaWx1cmVUaW1lci5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworICAgIGxpbmtTdGF0ZSA9ICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSkgPyBlU0lSX0xJTktfQlRBTVBfUFJFQVNTT0NfU1RBVEUgOiBlU0lSX0xJTktfUFJFQVNTT0NfU1RBVEUpOworICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiW2xpbVByb2Nlc3NNbG1Kb2luUmVxXTogbGlua1N0YXRlOiVkXG4iKSxsaW5rU3RhdGUpOworCisgICAgaWYgKGxpbVNldExpbmtTdGF0ZShwTWFjLCBsaW5rU3RhdGUsIAorICAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmJzc0lkLCAKKyAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MgKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJsaW1TZXRMaW5rU3RhdGUgdG8gZVNJUl9MSU5LX1BSRUFTU09DX1NUQVRFIEZhaWxlZCEhXG4iKSk7CisgICAgICAgIG1sbUpvaW5DbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0lETEVfU1RBVEU7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyoqIERlcml2ZSBjaGFubmVsIGZyb20gQlNTIGRlc2NyaXB0aW9uIGFuZCBzdG9yZSBpdCBpbiB0aGUgQ0ZHICovCisgICAgLy8gY2hhbk51bSA9IHBNYWMtPmxpbS5ncExpbU1sbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmNoYW5uZWxJZDsKKyAgICAKKyAgICBjaGFuTnVtID0gcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsOworICAgIC8vc3RvcmUgdGhlIGNoYW5uZWwgc3dpdGNoIHNlc3Npb25FbnRyeSBpbiB0aGUgbGltIGdsb2JhbCB2YXIKKyAgICBwc2Vzc2lvbkVudHJ5LT5jaGFubmVsQ2hhbmdlUmVhc29uQ29kZSA9IExJTV9TV0lUQ0hfQ0hBTk5FTF9KT0lOOworCisgICAgbGltU2V0Q2hhbm5lbChwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcS0+YnNzRGVzY3JpcHRpb24udGl0YW5IdENhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuTnVtLCBwc2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCk7IAorCisgICAgcmV0dXJuOworZXJyb3I6CisgICAgbWxtSm9pbkNuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworICAgIG1sbUpvaW5DbmYuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisgICAgbWxtSm9pbkNuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKyAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX0pPSU5fQ05GLCAodEFOSV9VMzIgKikgJm1sbUpvaW5DbmYpOworCit9CisKKworCisvKioKKyAqIGxpbVByb2Nlc3NNbG1Kb2luUmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNTE1fSk9JTl9SRVEgbWVzc2FnZQorICogZnJvbSBTTUUKKyAqCisgKkxPR0lDOgorICogMSkgSW5pdGlhbGl6ZSBMSU0sIEhBTCwgRFBICisgKiAyKSBDb25maWd1cmUgdGhlIEJTUyBmb3Igd2hpY2ggdGhlIEpPSU4gUkVRIHdhcyByZWNlaXZlZAorICogICBhKSBTZW5kIFdEQV9BRERfQlNTX1JFUSB0byBIQUwgLQorICogICBUaGlzIHdpbGwgaWRlbnRpZnkgdGhlIEJTUyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluCisgKiAgIC0tQU5ELS0KKyAqICAgQWRkIGEgU1RBIGVudHJ5IGZvciB0aGUgQVAgKGluIGEgU1RBIGNvbnRleHQpCisgKiAgIGIpIFdhaXQgZm9yIFdEQV9BRERfQlNTX1JTUAorICogICBjKSBTZW5kIFdEQV9BRERfU1RBX1JFUSB0byBIQUwKKyAqICAgVGhpcyB3aWxsIGFkZCB0aGUgImxvY2FsIFNUQSIgZW50cnkgdG8gdGhlIFNUQSB0YWJsZQorICogMykgQ29udGludWUgYXMgYmVmb3JlLCBpLmUsCisgKiAgIGEpIFNlbmQgYSBQUk9CRSBSRVEKKyAqICAgYikgV2FpdCBmb3IgUFJPQkUgUlNQL0JFQUNPTiBjb250YWluaW5nIHRoZSBTU0lEIHRoYXQKKyAqICAgd2UgYXJlIGludGVyZXN0ZWQgaW4KKyAqICAgYykgVGhlbiBzdGFydCBhbiBBVVRIIHNlcQorICogICBkKSBGb2xsb3dlZCBieSB0aGUgQVNTT0Mgc2VxCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitsaW1Qcm9jZXNzTWxtSm9pblJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0TGltTWxtSm9pbkNuZiAgICAgIG1sbUpvaW5DbmY7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQ7CisgICAgdHBQRVNlc3Npb24gICAgICAgICBwc2Vzc2lvbkVudHJ5OworCisgICAgc2Vzc2lvbklkID0gKCh0cExpbU1sbUpvaW5SZXEpcE1zZ0J1ZiktPnNlc3Npb25JZDsKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWRcbiIpKTsKKworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmICgoIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSApICYmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQlRfQU1QX0FQX1JPTEUgKSkgJiYKKyAgICAgICAgICAoIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9JRExFX1NUQVRFKSB8fAorICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0pPSU5FRF9TVEFURSkpICAmJgorICAgICAgICAoU0lSX01BQ19HRVRfRVNTKCAoKHRwTGltTWxtSm9pblJlcSkgcE1zZ0J1ZiktPmJzc0Rlc2NyaXB0aW9uLmNhcGFiaWxpdHlJbmZvKSAhPQorICAgICAgICAgICAgIFNJUl9NQUNfR0VUX0lCU1MoICgodHBMaW1NbG1Kb2luUmVxKSBwTXNnQnVmKS0+YnNzRGVzY3JpcHRpb24uY2FwYWJpbGl0eUluZm8pKSkKKyAgICB7CisgICAgICAgICNpZiAwCisgICAgICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NbG1Kb2luUmVxKQorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdwTGltTWxtSm9pblJlcSk7CisgICAgICAgICNlbmRpZiAvL1RPIFNVUFBPUlQgQlQtQU1QICwgcmV2aWV3IDIzc2VwCisKKyAgICAgICAgLy8vIEhvbGQgb250byBKb2luIHJlcXVlc3QgcGFyYW1ldGVycworICAgICAgICAKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEgPSh0cExpbU1sbUpvaW5SZXEpIHBNc2dCdWY7CisgICAgICAgIAorICAgICAgICBpZiggaXNMaW1TZXNzaW9uT2ZmQ2hhbm5lbChwTWFjLCBzZXNzaW9uSWQpICkKKyAgICAgICAgeworICAgICAgICAgIC8vc3VzcGVuZCBsaW5rCisgICAgICAgICAgbGltU3VzcGVuZExpbmsocE1hYywgZVNJUl9ET05UX0NIRUNLX0xJTktfVFJBRkZJQ19CRUZPUkVfU0NBTiwgCisgICAgICAgICAgICAgICAgICAgbGltUHJvY2Vzc01sbVBvc3RKb2luU3VzcGVuZExpbmssICh0QU5JX1UzMiopcHNlc3Npb25FbnRyeSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vTm8gbmVlZCB0byBzdXNwZW5kIGxpbmsuCisgICAgICAgICAgbGltUHJvY2Vzc01sbVBvc3RKb2luU3VzcGVuZExpbmsoIHBNYWMsIGVIQUxfU1RBVFVTX1NVQ0NFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyKikgcHNlc3Npb25FbnRyeSApOworICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAgICAgICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIEpPSU4gcmVxIGluIHN0YXRlcyBvdGhlciB0aGFuCisgICAgICAgICAgICAgICogSWRsZSBzdGF0ZSBvciBvbiBBUC4KKyAgICAgICAgICAgICAgKiBSZXR1cm4gam9pbiBjb25maXJtIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzIGNvZGUuCisgICAgICAgICAgICAgICovCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJVbmV4cGVjdGVkIEpvaW4gcmVxdWVzdCBmb3Igcm9sZSAlZCBzdGF0ZSAlWFxuIiksCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlLAorICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpOykKKyAgICAgICAgbGltUHJpbnRNbG1TdGF0ZShwTWFjLCBMT0dFLCBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisgICAgICAgIAorICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlVuZXhwZWN0ZWQgSm9pbiByZXF1ZXN0IGZvciByb2xlICVkIHN0YXRlICVYXG4iKSwKKyAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpOworICAgIH0KKworZXJyb3I6IAorCisgICAgICAgIAorICAgICAgICBtbG1Kb2luQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisgICAgICAgIG1sbUpvaW5DbmYuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICBtbG1Kb2luQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworICAgICAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX0pPSU5fQ05GLCAodEFOSV9VMzIgKikgJm1sbUpvaW5DbmYpOworCisKK30gLyoqKiBsaW1Qcm9jZXNzTWxtSm9pblJlcSgpICoqKi8KKworCisKKy8qKgorICogbGltUHJvY2Vzc01sbUF1dGhSZXEoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1MTV9BVVRIX1JFUSBtZXNzYWdlCisgKiBmcm9tIFNNRQorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitsaW1Qcm9jZXNzTWxtQXV0aFJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBudW1QcmVBdXRoQ29udGV4dHM7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgY3VycmVudEJzc0lkOworICAgIHRTaXJNYWNBdXRoRnJhbWVCb2R5ICAgIGF1dGhGcmFtZUJvZHk7CisgICAgdExpbU1sbUF1dGhDbmYgICAgICAgICAgbWxtQXV0aENuZjsKKyAgICBzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICAqcHJlQXV0aE5vZGU7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgICAgICAgcFN0YURzOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNlc3Npb25JZDsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5OworCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEgPSAodExpbU1sbUF1dGhSZXEgKikgcE1zZ0J1ZjsKKyAgICBzZXNzaW9uSWQgPSBwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5zZXNzaW9uSWQ7CisgICAgaWYoKHBzZXNzaW9uRW50cnk9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHNlc3Npb25JZCkgKT09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlNlc3Npb24gRG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JZFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhwZWN0IEF1dGggcmVxdWVzdCBvbmx5IHdoZW46CisgICAgICogMS4gU1RBIGpvaW5lZC9hc3NvY2lhdGVkIHdpdGggYSBCU1Mgb3IKKyAgICAgKiAyLiBTVEEgaXMgaW4gSUJTUyBtb2RlCisgICAgICogYW5kIFNUQSBpcyBnb2luZyB0byBhdXRoZW50aWNhdGUgd2l0aCBhIHVuaWNhc3QKKyAgICAgKiBhZHJlc3MgYW5kIHJlcXVlc3RlZCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gaXMKKyAgICAgKiBzdXBwb3J0ZWQuCisgICAgICovCisgICAgICNpZiAwCisgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsIFdOSV9DRkdfQlNTSUQsIGN1cnJlbnRCc3NJZCwgJmNmZykgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLy8vIENvdWxkIG5vdCBnZXQgQlNTSUQgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQlNTSURcbiIpKTsKKyAgICB9CisgICAgI2VuZGlmIC8vVG8gU3VwcG9SVCBCVC1BTVAKKworICAgIHNpckNvcHlNYWNBZGRyKGN1cnJlbnRCc3NJZCxwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyAgICBpZiAoKCgoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGU9PSBlTElNX1NUQV9ST0xFKSB8fCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSkpICYmCisgICAgICAgICAgKChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9KT0lORURfU1RBVEUpIHx8CisgICAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKSkgfHwKKyAgICAgICAgICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpICYmCisgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFKSkpICYmCisgICAgICAgIChsaW1Jc0dyb3VwQWRkcihwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5wZWVyTWFjQWRkcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IGZhbHNlKSAmJgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgKGxpbUlzQXV0aEFsZ29TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5KSA9PSB0cnVlKQorI2Vsc2UKKyAgICAgICAgKGxpbUlzQXV0aEFsZ29TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGUpID09IHRydWUpCisjZW5kaWYKKyAgICAgICAgKSAgICAgICAgCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBpcyBhIHJlcXVlc3QgZm9yIHByZS1hdXRoZW50aWNhdGlvbi4KKyAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgZXhpc3RzIGNvbnRleHQgYWxyZWFkeSBmb3IKKyAgICAgICAgICogdGhlIHJlcXVzdGVkIHBlZXIgT1IKKyAgICAgICAgICogaWYgdGhpcyByZXF1ZXN0IGlzIGZvciB0aGUgQVAgd2UncmUgY3VycmVudGx5CisgICAgICAgICAqIGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgICAgICogSWYgeWVzLCByZXR1cm4gYXV0aCBjb25maXJtIGltbWVkaWF0ZWx5IHdoZW4KKyAgICAgICAgICogcmVxdWVzdGVkIGF1dGggdHlwZSBpcyBzYW1lIGFzIHRoZSBvbmUgdXNlZCBiZWZvcmUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKCgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKSB8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSApJiYKKyAgICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKSAmJgorICAgICAgICAgICAgICgoKHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpKSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAocE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGUgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmF1dGhUeXBlKSkgJiYKKyAgICAgICAgICAgICAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQscE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSApKSB8fAorICAgICAgICAgICAgKCgocHJlQXV0aE5vZGUgPQorICAgICAgICAgICAgICAgbGltU2VhcmNoUHJlQXV0aExpc3QoCisgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+cGVlck1hY0FkZHIpKSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgIChwcmVBdXRoTm9kZS0+YXV0aFR5cGUgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGUpKSkKKyAgICAgICAgeworICAgICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsCisgICAgICAgICAgICAgICAgICAgRkwoIkFscmVhZHkgaGF2ZSBwcmUtYXV0aCBjb250ZXh0IHdpdGggcGVlclxuIikpOworICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzIpOykKKworICAgICAgICAgICAgbWxtQXV0aENuZi5yZXN1bHRDb2RlID0gKHRTaXJSZXN1bHRDb2RlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX1NVQ0NFU1NfU1RBVFVTOworICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfTUFYX05VTV9QUkVfQVVUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopICZudW1QcmVBdXRoQ29udGV4dHMpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiQ291bGQgbm90IHJldHJpZXZlIE51bVByZUF1dGhMaW1pdCBmcm9tIENGR1xuIikpOworICAgICAgICAgICAgfQorI2lmZGVmIEFOSV9BUF9TREtfT1BUCisgICAgICAgICAgICBpZihudW1QcmVBdXRoQ29udGV4dHMgPiBTSVJfU0RLX09QVF9NQVhfTlVNX1BSRV9BVVRIKQorICAgICAgICAgICAgICAgIG51bVByZUF1dGhDb250ZXh0cyA9IFNJUl9TREtfT1BUX01BWF9OVU1fUFJFX0FVVEg7CisjZW5kaWYgLy8gQU5JX0FQX1NES19PUFQKKworICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltTnVtUHJlQXV0aENvbnRleHRzID09IG51bVByZUF1dGhDb250ZXh0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJOdW1iZXIgb2YgcHJlLWF1dGggcmVhY2hlZCBtYXggbGltaXRcbiIpKTspCisKKyAgICAgICAgICAgICAgICAvLy8gUmV0dXJuIEF1dGggY29uZmlybSB3aXRoIHJlamVjdCBjb2RlCisgICAgICAgICAgICAgICAgbWxtQXV0aENuZi5yZXN1bHRDb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NNRV9NQVhfTlVNX09GX1BSRV9BVVRIX1JFQUNIRUQ7CisKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERlbGV0ZSBwcmUtYXV0aCBub2RlIGlmIGV4aXN0cworICAgICAgICBpZiAocHJlQXV0aE5vZGUpCisgICAgICAgICAgICBsaW1EZWxldGVQcmVBdXRoTm9kZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+cGVlck1hY0FkZHIpOworCisgICAgICAgIC8vYXNzaWduIGFwcHJvcHJpYXRlIHNlc3Npb25JZCB0byB0aGUgdGltZXIgb2JqZWN0CisgICAgICAgIHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUF1dGhGYWlsdXJlVGltZXIuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICAKKyAgICAgICAgLy8gQWN0aXZhdGUgQXV0aCBmYWlsdXJlIHRpbWVyCisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX0FVVEhfRkFJTF9USU1FUikpOworICAgICAgICBpZiAodHhfdGltZXJfYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUF1dGhGYWlsdXJlVGltZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvLy8gQ291bGQgbm90IHN0YXJ0IEF1dGggZmFpbHVyZSB0aW1lci4KKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCBzdGFydCBBdXRoIGZhaWx1cmUgdGltZXJcbiIpKTsKKworICAgICAgICAgICAgLy8vIFJldHVybiBBdXRoIGNvbmZpcm0gd2l0aCBSZXNvdXJjZXMgVW5hdmFpbGFibGUKKyAgICAgICAgICAgIG1sbUF1dGhDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1QcmV2TWxtU3RhdGUgPSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9BVVRIX0ZSQU1FMl9TVEFURTsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKyAgICAgICAgLy8vIFByZXBhcmUgJiBzZW5kIEF1dGhlbnRpY2F0aW9uIGZyYW1lCisgICAgICAgIGF1dGhGcmFtZUJvZHkuYXV0aEFsZ29OdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KSBwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5hdXRoVHlwZTsKKyAgICAgICAgYXV0aEZyYW1lQm9keS5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPSBTSVJfTUFDX0FVVEhfRlJBTUVfMTsKKyAgICAgICAgYXV0aEZyYW1lQm9keS5hdXRoU3RhdHVzQ29kZSA9IDA7CisgICAgICAgIGxpbVNlbmRBdXRoTWdtdEZyYW1lKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRoRnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX05PX1dFUF9JTl9GQyxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVbmV4cGVjdGVkIGF1dGggcmVxdWVzdC4KKyAgICAgICAgICogUmV0dXJuIEF1dGggY29uZmlybSB3aXRoIEludmFsaWQgcGFyYW1ldGVycyBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgbWxtQXV0aENuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworZW5kOgorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZtbG1BdXRoQ25mLnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnBNYWMtPmxpbS5ncExpbU1sbUF1dGhSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICBtbG1BdXRoQ25mLmF1dGhUeXBlID0gcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+YXV0aFR5cGU7CisgICAgbWxtQXV0aENuZi5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKyAgICAvLy8gRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkCisgICAgLy8vIGZvciBwTWFjLT5saW0uZ0xpbU1sbUF1dGhSZXEKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxKTsKKyAgICBwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxID0gTlVMTDsKKyAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX0FVVEhfQ05GLCAodEFOSV9VMzIgKikgJm1sbUF1dGhDbmYpOworfSAvKioqIGxpbVByb2Nlc3NNbG1BdXRoUmVxKCkgKioqLworCisKKworLyoqCisgKiBsaW1Qcm9jZXNzTWxtQXNzb2NSZXEoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1MTV9BU1NPQ19SRVEgbWVzc2FnZQorICogZnJvbSBTTUUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBNc2dCdWYgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc01sbUFzc29jUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgICBjdXJyZW50QnNzSWQ7CisgICAgdExpbU1sbUFzc29jUmVxICAgICAgICAgICpwTWxtQXNzb2NSZXE7CisgICAgdExpbU1sbUFzc29jQ25mICAgICAgICAgIG1sbUFzc29jQ25mOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeTsKKyAgIC8vIHRBTklfVTggICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ7CisKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBNbG1Bc3NvY1JlcSA9ICh0TGltTWxtQXNzb2NSZXEgKikgcE1zZ0J1ZjsKKworICAgIGlmKCAocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBNbG1Bc3NvY1JlcS0+c2Vzc2lvbklkKSApPT0gTlVMTCkgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAjaWYgMAorICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0JTU0lELCBjdXJyZW50QnNzSWQsICZjZmcpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8vLyBDb3VsZCBub3QgZ2V0IEJTU0lEIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEJTU0lEXG4iKSk7CisgICAgfQorICAgICNlbmRpZiAvL1RPIFNVUFBPUlQgQlQtQU1QCisgICAgc2lyQ29weU1hY0FkZHIoY3VycmVudEJzc0lkLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKyAgICAKKyAgICBpZiAoIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSAmJiBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQlRfQU1QX0FQX1JPTEUpICYmCisgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURSB8fCBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9KT0lORURfU1RBVEUpICYmCisgICAgICAgICAocGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCxwTWxtQXNzb2NSZXEtPnBlZXJNYWNBZGRyLCBjdXJyZW50QnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpKSApCisgICAgeworICAgICAgICAvLy8gbWFwIHRoZSBzZXNzaW9uIGVudHJ5IHBvaW50ZXIgdG8gdGhlIEFzc29jRmFpbHVyZVRpbWVyIAorICAgICAgICBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Bc3NvY0ZhaWx1cmVUaW1lci5zZXNzaW9uSWQgPSBwTWxtQXNzb2NSZXEtPnNlc3Npb25JZDsKKworCisgICAgICAgIC8vLyBTdGFydCBhc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyCisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX0FTU09DX0ZBSUxfVElNRVIpKTsKKyAgICAgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Bc3NvY0ZhaWx1cmVUaW1lcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvLy8gQ291bGQgbm90IHN0YXJ0IEFzc29jIGZhaWx1cmUgdGltZXIuCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3Qgc3RhcnQgQXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lclxuIikpOworCisgICAgICAgICAgICAvLy8gUmV0dXJuIEFzc29jIGNvbmZpcm0gd2l0aCBSZXNvdXJjZXMgVW5hdmFpbGFibGUKKworICAgICAgICAgICAgbWxtQXNzb2NDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgIG1sbUFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVByZXZNbG1TdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURTsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisgCisgICAgICAgIC8vLyBQcmVwYXJlIGFuZCBzZW5kIEFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUKKyAgICAgICAgbGltU2VuZEFzc29jUmVxTWdtdEZyYW1lKHBNYWMsIHBNbG1Bc3NvY1JlcSxwc2Vzc2lvbkVudHJ5KTsKKworICAvL1NldCB0aGUgbGluayBzdGF0ZSB0byBwb3N0QXNzb2MsIHNvIEhXIGNhbiBzdGFydCByZWNlaXZpbmcgZnJhbWVzIGZyb20gQVAuCisgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlID09IGVTSVJfQlRBTVBfU1RBX01PREUpfHwKKyAgICAgICAgKChwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSkgJiYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpKSkKKyAgICB7CisgICAgICAgaWYobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19CVEFNUF9QT1NUQVNTT0NfU1RBVEUsIGN1cnJlbnRCc3NJZCwgCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICBGTCgiRmFpbGVkIHRvIHNldCB0aGUgTGlua1N0YXRlXG4iKSk7KQorICAgIH0gZWxzZSB7CisgICAgICAgaWYobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19QT1NUQVNTT0NfU1RBVEUsIGN1cnJlbnRCc3NJZCwgCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICBGTCgiRmFpbGVkIHRvIHNldCB0aGUgTGlua1N0YXRlXG4iKSk7KQorICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWNlaXZlZCBBc3NvY2lhdGlvbiByZXF1ZXN0IGVpdGhlciBpbiBpbnZhbGlkIHN0YXRlCisgICAgICAgICAqIG9yIHRvIGEgcGVlciBNQUMgZW50aXR5IHdob3NlIGFkZHJlc3MgaXMgZGlmZmVyZW50CisgICAgICAgICAqIGZyb20gb25lIHRoYXQgU1RBIGlzIGN1cnJlbnRseSBqb2luZWQgd2l0aCBvciBvbiBBUC4KKyAgICAgICAgICogUmV0dXJuIEFzc29jIGNvbmZpcm0gd2l0aCBJbnZhbGlkIHBhcmFtZXRlcnMgY29kZS4KKyAgICAgICAgICovCisKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgTUxNX0FTU09DX0NORiBpbiBzdGF0ZSAlWCBmb3Igcm9sZT0lZCwgTUFDIGFkZHI9ICIpLAorICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSwKKyAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSk7KQorICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcE1sbUFzc29jUmVxLT5wZWVyTWFjQWRkciwgTE9HVyk7CisgICAgICAgIGxpbVByaW50TWxtU3RhdGUocE1hYywgTE9HVywgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpOworCisgICAgICAgIG1sbUFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICAgIG1sbUFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworCisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworZW5kOgorICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkKi8KKyAgICBtbG1Bc3NvY0NuZi5zZXNzaW9uSWQgPSBwTWxtQXNzb2NSZXEtPnNlc3Npb25JZDsKKworICAgIC8vLyBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIGFzc29jUmVxCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcE1sbUFzc29jUmVxKTsKKworICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsIExJTV9NTE1fQVNTT0NfQ05GLCAodEFOSV9VMzIgKikgJm1sbUFzc29jQ25mKTsKK30gLyoqKiBsaW1Qcm9jZXNzTWxtQXNzb2NSZXEoKSAqKiovCisKKworCisvKioKKyAqIGxpbVByb2Nlc3NNbG1SZWFzc29jUmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNTE1fUkVBU1NPQ19SRVEgbWVzc2FnZQorICogZnJvbSBTTUUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBNc2dCdWYgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc01sbVJlYXNzb2NSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgY2hhbk51bTsKKyAgICBzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICAqcEF1dGhOb2RlOworICAgIHRMaW1NbG1SZWFzc29jUmVxICAgICAgICpwTWxtUmVhc3NvY1JlcTsKKyAgICB0TGltTWxtUmVhc3NvY0NuZiAgICAgICBtbG1SZWFzc29jQ25mOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgIHBzZXNzaW9uRW50cnk7CisKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcE1sbVJlYXNzb2NSZXEgPSAodExpbU1sbVJlYXNzb2NSZXEgKikgcE1zZ0J1ZjsKKyAgICAKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBNbG1SZWFzc29jUmVxLT5zZXNzaW9uSWQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWRcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgaWYgKCgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX0FQX1JPTEUpICYmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQlRfQU1QX0FQX1JPTEUpKSAmJgorICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKQorICAgIHsKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPnBMaW1NbG1SZWFzc29jUmVxKQorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+cExpbU1sbVJlYXNzb2NSZXEpOworCisgICAgICAgIC8qIEhvbGQgUmUtQXNzb2MgcmVxdWVzdCBhcyBwYXJ0IG9mIFNlc3Npb24sIGtub2NrLW91dCBwTWFjICovCisgICAgICAgIC8vLyBIb2xkIG9udG8gUmVhc3NvYyByZXF1ZXN0IHBhcmFtZXRlcnMKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbU1sbVJlYXNzb2NSZXEgPSBwTWxtUmVhc3NvY1JlcTsKKyAgICAgICAgCisgICAgICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHByZS1hdXRoIGNvbnRleHQgd2l0aCBuZXcgQVAKKyAgICAgICAgcEF1dGhOb2RlID0gbGltU2VhcmNoUHJlQXV0aExpc3QocE1hYywgcHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkKTsKKworICAgICAgICBpZiAoIXBBdXRoTm9kZSAmJgorICAgICAgICAgICAgKCFwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCxwTWxtUmVhc3NvY1JlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBFaXRoZXIgcHJlLWF1dGggY29udGV4dCBkb2VzIG5vdCBleGlzdCBBTkQKKyAgICAgICAgICAgIC8vIHdlIGFyZSBub3QgcmVhc3NvY2lhdGluZyB3aXRoIGN1cnJlbnRseQorICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBBUC4KKyAgICAgICAgICAgIC8vIFJldHVybiBSZWFzc29jIGNvbmZpcm0gd2l0aCBub3QgYXV0aGVudGljYXRlZAorICAgICAgICAgICAgbWxtUmVhc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfU1RBX05PVF9BVVRIRU5USUNBVEVEOworICAgICAgICAgICAgbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICAvL2Fzc2lnbiB0aGUgc2Vzc2lvbklkIHRvIHRoZSB0aW1lciBvYmplY3QKKyAgICAgICAgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVhc3NvY0ZhaWx1cmVUaW1lci5zZXNzaW9uSWQgPSBwTWxtUmVhc3NvY1JlcS0+c2Vzc2lvbklkOworCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVByZXZNbG1TdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSAgICA9IGVMSU1fTUxNX1dUX1JFQVNTT0NfUlNQX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKworI2lmIDAKKyAgICAgICAgLy8gVXBkYXRlIEJTU0lEIGF0IENGRyBkYXRhYmFzZQorICAgICAgICBpZiAod2xhbl9jZmdTZXRTdHIocE1hYywgV05JX0NGR19CU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVJlYXNzb2NCc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgdXBkYXRlIEJTU0lEIGF0IENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgdXBkYXRlIEJTU0lEIGF0IENGR1xuIikpOworICAgICAgICB9CisjZW5kaWYgLy9UTyBTVVBQT1JUIEJULUFNUAorCisgICAgLyogQ29weSBHbG9iYWwgUmVhc3NvYyBJRCovCisgICAvLyBzaXJDb3B5TWFjQWRkcihwc2Vzc2lvbkVudHJ5LT5yZWFzc29jYnNzSWQscE1hYy0+bGltLmdMaW1SZUFzc29jQnNzSWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXJpdmUgY2hhbm5lbCBmcm9tIEJTUyBkZXNjcmlwdGlvbiBhbmQKKyAgICAgICAgICogc3RvcmUgaXQgYXQgQ0ZHLgorICAgICAgICAgKi8KKworICAgICAgICBjaGFuTnVtID0gcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0NoYW5uZWxJZDsKKworCisgICAgICAgIC8qIFRvIFN1cHBvcnQgQlQtQU1QIC4uIHJlYWQgY2hhbm5lbCBudW1iZXIgZnJvbSBwc2Vzc2lvbkVudHJ5Ki8KKyAgICAgICAgLy9jaGFuTnVtID0gcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsOworCisgICAgICAgIC8vIEFwcGx5IHByZXZpb3VzbHkgc2V0IGNvbmZpZ3VyYXRpb24gYXQgSFcKKyAgICAgICAgbGltQXBwbHlDb25maWd1cmF0aW9uKHBNYWMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgLy9zdG9yZSB0aGUgY2hhbm5lbCBzd2l0Y2ggc2Vzc2lvbkVudHJ5IGluIHRoZSBsaW0gZ2xvYmFsIHZhcgorICAgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgc2F2ZWQgdGhlIFJlQXNzb2NyZXEgUG9pbnRlciBhYm9iZSAqLworICAgICAgICAvL3BzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxID0gKHZvaWQgKilwTWxtUmVhc3NvY1JlcTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+Y2hhbm5lbENoYW5nZVJlYXNvbkNvZGUgPSBMSU1fU1dJVENIX0NIQU5ORUxfUkVBU1NPQzsKKworICAgICAgICAvKiogU3dpdGNoIGNoYW5uZWxsIHRvIHRoZSBuZXcgT3BlcmF0aW5nIGNoYW5uZWwgZm9yIFJlYXNzb2MqLworICAgICAgICBsaW1TZXRDaGFubmVsKHBNYWMsIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NUaXRhbkh0Q2FwcywgY2hhbk51bSwgcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY2VpdmVkIFJlYXNzb2MgcmVxdWVzdCBpbiBpbnZhbGlkIHN0YXRlIG9yCisgICAgICAgICAqIGluIEFQIHJvbGUuUmV0dXJuIFJlYXNzb2MgY29uZmlybSB3aXRoIEludmFsaWQKKyAgICAgICAgICogcGFyYW1ldGVycyBjb2RlLgorICAgICAgICAgKi8KKworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICBGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBNTE1fUkVBU1NPQ19DTkYgaW4gc3RhdGUgJVggZm9yIHJvbGU9JWQsIE1BQyBhZGRyPSAiKSwKKyAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpOykKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBNbG1SZWFzc29jUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1cpOworICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPR1csIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKTsKKworICAgICAgICBtbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICAgIG1sbVJlYXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCitlbmQ6CisgICAgbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKyAgICAvKiBVcGRhdGUgUEUgc2Vzc2lvIElkKi8KKyAgICBtbG1SZWFzc29jQ25mLnNlc3Npb25JZCA9IHBNbG1SZWFzc29jUmVxLT5zZXNzaW9uSWQ7CisgICAgLy8vIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZCBmb3IgcmVhc3NvY1JlcQorICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBNbG1SZWFzc29jUmVxKTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcSA9IE5VTEw7CisKKyAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX1JFQVNTT0NfQ05GLCAodEFOSV9VMzIgKikgJm1sbVJlYXNzb2NDbmYpOworfSAvKioqIGxpbVByb2Nlc3NNbG1SZWFzc29jUmVxKCkgKioqLworCisKK3N0YXRpYyB2b2lkCitsaW1Qcm9jZXNzTWxtRGlzYXNzb2NSZXFQb3N0U3VzcGVuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHN1c3BlbmRTdGF0dXMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICBhaWQ7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgIGN1cnJlbnRCc3NJZDsKKyAgICB0cERwaEhhc2hOb2RlICAgICAgICAgICAgcFN0YURzOworICAgIHRMaW1NbG1EaXNhc3NvY1JlcSAgICAgICAqcE1sbURpc2Fzc29jUmVxOworICAgIHRMaW1NbG1EaXNhc3NvY0NuZiAgICAgICBtbG1EaXNhc3NvY0NuZjsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeTsKKyAgICBleHRlcm4gdEFOSV9CT09MRUFOICAgICBzZW5kRGlzYXNzb2NGcmFtZTsKKworICAgIGlmKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3VzcGVuZFN0YXR1cykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgiU3VzcGVuZCBTdGF0dXMgaXMgbm90IHN1Y2Nlc3MgJVhcbiIpLCBzdXNwZW5kU3RhdHVzKTspCisjaWYgMAorICAgICAgICAvL0l0IGNhbiBpZ25vcmUgdGhlIHN0YXR1cyBhbmQgcHJvY2VlZCB3aXRoIHRoZSBkaXNhc3NvYyBwcm9jZXNzaW5nLgorICAgICAgICBtbG1EaXNhc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKyAgICAgICAgZ290byBlbmQ7CisjZW5kaWYKKyAgICB9CisKKyAgICBwTWxtRGlzYXNzb2NSZXEgPSAodExpbU1sbURpc2Fzc29jUmVxICopIHBNc2dCdWY7CisKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMscE1sbURpc2Fzc29jUmVxLT5zZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgIAorICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICBGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkXG4iKSk7KQorICAgICAgICBtbG1EaXNhc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgI2lmIDAKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19CU1NJRCwgY3VycmVudEJzc0lkLCAmY2ZnKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCBCU1NJRCBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBCU1NJRFxuIikpOworICAgIH0KKyAgICAjZW5kaWYgLy9CVC1BTVAgU3VwcG9ydAorICAgIHNpckNvcHlNYWNBZGRyKGN1cnJlbnRCc3NJZCxwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyAgICBzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fU1RBX1JPTEU6CisgICAgICAgIGNhc2UgZUxJTV9CVF9BTVBfU1RBX1JPTEU6ICAgIAorICAgICAgICAgICAgaWYgKCAhcGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQscE1sbURpc2Fzc29jUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBNTE1fRElTQVNTT0NfUkVRIHdpdGggaW52YWxpZCBCU1MgaWQgIikpOykKKyAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcE1sbURpc2Fzc29jUmVxLT5wZWVyTWFjQWRkciwgTE9HVyk7CisKKyAgICAgICAgICAgICAgICAvLy8gUHJlcGFyZSBhbmQgU2VuZCBMSU1fTUxNX0RJU0FTU09DX0NORgorCisgICAgICAgICAgICAgICAgbWxtRGlzYXNzb2NDbmYucmVzdWx0Q29kZSAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fU1RBX0lOX0lCU1NfUk9MRToKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLy8gZUxJTV9BUF9ST0xFCisKKyAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9IC8vIGVuZCBzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGVyZSBleGlzdHMgYSBjb250ZXh0IGZvciB0aGUgcGVlciBlbnRpdHkKKyAgICAgKiB0byBiZSBkaXNhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgcFN0YURzID0gZHBoTG9va3VwSGFzaEVudHJ5KHBNYWMsIHBNbG1EaXNhc3NvY1JlcS0+cGVlck1hY0FkZHIsICZhaWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICBpZiAoKHBTdGFEcyA9PSBOVUxMKSB8fAorICAgICAgICAocFN0YURzICYmCisgICAgICAgICAoKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKSAmJgorICAgICAgICAgIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFKSAmJgorICAgICAgICAgIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9NTE1fQVNTT0NJQVRFRF9TVEFURSkpKSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWNlaXZlZCBMSU1fTUxNX0RJU0FTU09DX1JFUSBmb3IgU1RBIHRoYXQgZG9lcyBub3QKKyAgICAgICAgICogaGF2ZSBjb250ZXh0IG9yIGluIHNvbWUgdHJhbnNpdCBzdGF0ZS4KKyAgICAgICAgICogTG9nIGVycm9yCisgICAgICAgICAqLworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgIEZMKCJyZWNlaXZlZCBNTE1fRElTQVNTT0NfUkVRIGZvciBTVEEgdGhhdCBlaXRoZXIgaGFzIG5vIGNvbnRleHQgb3IgaW4gc29tZSB0cmFuc2l0IHN0YXRlLCBBZGRyPSAiKSk7KQorICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcE1sbURpc2Fzc29jUmVxLT5wZWVyTWFjQWRkciwgTE9HVyk7CisKKyAgICAgICAgLy8vIFByZXBhcmUgYW5kIFNlbmQgTElNX01MTV9ESVNBU1NPQ19DTkYKKworICAgICAgICBtbG1EaXNhc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8vcFN0YURzLT5tbG1TdGFDb250ZXh0LnJ4UHVyZ2VSZXEgPSAxOworICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5kaXNhc3NvY1JlYXNvbiA9ICh0U2lyTWFjUmVhc29uQ29kZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbURpc2Fzc29jUmVxLT5yZWFzb25Db2RlOworICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlciA9IHBNbG1EaXNhc3NvY1JlcS0+ZGlzYXNzb2NUcmlnZ2VyOworCisgICAgLy8vIFNlbmQgRGlzYXNzb2NpYXRlIGZyYW1lIHRvIHBlZXIgZW50aXR5CisgICAgaWYgKHNlbmREaXNhc3NvY0ZyYW1lKQorICAgIHsKKyAgICBsaW1TZW5kRGlzYXNzb2NNZ210RnJhbWUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbURpc2Fzc29jUmVxLT5yZWFzb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWxtRGlzYXNzb2NSZXEtPnBlZXJNYWNBZGRyLHBzZXNzaW9uRW50cnkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHNlbmREaXNhc3NvY0ZyYW1lID0gMTsgICAgCisgICAgfQorCisgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKSAKKyAgICB7CisgICAgICAgLy9TQVAgbW9kZSBkZWxheSBERUwgU1RBIGZvciAzMDBtcyBzdWNoIHRoYXQgZGlzYXNzb2MgY2FuIGJlIGRlbGl2ZXJlZCBhdCBUSU0KKyAgICAgICAvLzEwMCBtcyBmb3Igbm9ybWFsIFRJTSBhbmQgMzAwIG1zIGZvciBkeW5hbWljIFRJTQorICAgICAgIHZvc19zbGVlcCgzMDApOyAKKyAgICB9CisKKyAgICAvLy8gUmVjZWl2ZSBwYXRoIGNsZWFudXAgd2l0aCBkdW1teSBwYWNrZXQKKyAgICBpZihlU0lSX1NVQ0NFU1MgIT0gbGltQ2xlYW51cFJ4UGF0aChwTWFjLCBwU3RhRHMscHNlc3Npb25FbnRyeSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1sbURpc2Fzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBpZiAgKCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFICkgJiYgCisgICAgICAgICAgKCAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmlzQ0NYY29ubmVjdGlvbiApIHx8IAorI2VuZGlmCisgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmlzMTFSY29ubmVjdGlvbiApKSAmJgorICAgICAgICAgIChwTWxtRGlzYXNzb2NSZXEtPnJlYXNvbkNvZGUgIT0gZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0ZUSEFORE9GRl9SRUFTT04pKQorICAgIHsKKyAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJGVCBQcmVhdXRoIFNlc3Npb24gQ2xlYW51cCBcbiIpKTspCisgICAgICAgICAgbGltRlRDbGVhbnVwKHBNYWMpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8vIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZCBmb3IgbWxtRGlzYXNzb2NSZXEKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTWxtRGlzYXNzb2NSZXEpOworCisgICAgcmV0dXJuOworCitlbmQ6CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJm1sbURpc2Fzc29jQ25mLnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcE1sbURpc2Fzc29jUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIG1sbURpc2Fzc29jQ25mLmFpZCA9IHBNbG1EaXNhc3NvY1JlcS0+YWlkOworICAgIG1sbURpc2Fzc29jQ25mLmRpc2Fzc29jVHJpZ2dlciA9IHBNbG1EaXNhc3NvY1JlcS0+ZGlzYXNzb2NUcmlnZ2VyOworICAgIAorICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElEKi8KKyAgICBtbG1EaXNhc3NvY0NuZi5zZXNzaW9uSWQgPSBwTWxtRGlzYXNzb2NSZXEtPnNlc3Npb25JZDsKKworICAgIC8vLyBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIG1sbURpc2Fzc29jUmVxCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcE1sbURpc2Fzc29jUmVxKTsKKworICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9ESVNBU1NPQ19DTkYsCisgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopICZtbG1EaXNhc3NvY0NuZik7Cit9CisKKy8qKgorICogbGltUHJvY2Vzc01sbURpc2Fzc29jUmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNTE1fRElTQVNTT0NfUkVRIG1lc3NhZ2UKKyAqIGZyb20gU01FCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2xpbVByb2Nlc3NNbG1EaXNhc3NvY1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKy8vICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICBhaWQ7CisvLyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICAgY3VycmVudEJzc0lkOworLy8gICAgdHBEcGhIYXNoTm9kZSAgICAgICAgICAgIHBTdGFEczsKKyAgICB0TGltTWxtRGlzYXNzb2NSZXEgICAgICAgKnBNbG1EaXNhc3NvY1JlcTsKKy8vICAgIHRMaW1NbG1EaXNhc3NvY0NuZiAgICAgICBtbG1EaXNhc3NvY0NuZjsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeTsKKy8vICAgIGV4dGVybiB0QU5JX0JPT0xFQU4gICAgIHNlbmREaXNhc3NvY0ZyYW1lOworCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBNbG1EaXNhc3NvY1JlcSA9ICh0TGltTWxtRGlzYXNzb2NSZXEgKikgcE1zZ0J1ZjsKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMscE1sbURpc2Fzc29jUmVxLT5zZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgIAorICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICBGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoIGlzTGltU2Vzc2lvbk9mZkNoYW5uZWwocE1hYywgcE1sbURpc2Fzc29jUmVxLT5zZXNzaW9uSWQpICkKKyAgICB7CisgICAgICAvL3N1c3BlbmQgbGluaworICAgICAgbGltU3VzcGVuZExpbmsocE1hYywgZVNJUl9ET05UX0NIRUNLX0xJTktfVFJBRkZJQ19CRUZPUkVfU0NBTiwgCisgICAgICAgICAgbGltUHJvY2Vzc01sbURpc2Fzc29jUmVxUG9zdFN1c3BlbmQsICh0QU5JX1UzMiopcE1zZ0J1ZiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy9ObyBuZWVkIHRvIHN1c3BlbmQgbGluay4KKyAgICAgIGxpbVByb2Nlc3NNbG1EaXNhc3NvY1JlcVBvc3RTdXNwZW5kKCBwTWFjLCBlSEFMX1NUQVRVU19TVUNDRVNTLAorICAgICAgICAgICh0QU5JX1UzMiopIHBNc2dCdWYgKTsKKyAgICB9Cit9IC8qKiogbGltUHJvY2Vzc01sbURpc2Fzc29jUmVxKCkgKioqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc01sbURlYXV0aFJlcVBvc3RTdXNwZW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgc3VzcGVuZFN0YXR1cywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgYWlkOworICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgIGN1cnJlbnRCc3NJZDsKKyAgICB0cERwaEhhc2hOb2RlICAgICAgICAgICBwU3RhRHM7CisgICAgc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAgKnBBdXRoTm9kZTsKKyAgICB0TGltTWxtRGVhdXRoUmVxICAgICAgICAqcE1sbURlYXV0aFJlcTsKKyAgICB0TGltTWxtRGVhdXRoQ25mICAgICAgICBtbG1EZWF1dGhDbmY7CisgICAgdHBQRVNlc3Npb24gICAgICAgICAgICAgcHNlc3Npb25FbnRyeTsKKworCisgICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdXNwZW5kU3RhdHVzKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJTdXNwZW5kIFN0YXR1cyBpcyBub3Qgc3VjY2VzcyAlWFxuIiksIHN1c3BlbmRTdGF0dXMpOykKKyNpZiAwCisgICAgICAgIC8vSXQgY2FuIGlnbm9yZSB0aGUgc3RhdHVzIGFuZCBwcm9jZWVkIHdpdGggdGhlIGRpc2Fzc29jIHByb2Nlc3NpbmcuCisgICAgICAgIG1sbURpc2Fzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworICAgICAgICBnb3RvIGVuZDsKKyNlbmRpZgorICAgIH0KKworICAgIHBNbG1EZWF1dGhSZXEgPSAodExpbU1sbURlYXV0aFJlcSAqKSBwTXNnQnVmOworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwTWxtRGVhdXRoUmVxLT5zZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgIAorICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWRcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgI2lmIDAKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19CU1NJRCwgY3VycmVudEJzc0lkLCAmY2ZnKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCBCU1NJRCBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBCU1NJRFxuIikpOworICAgIH0KKyAgICAjZW5kaWYgLy9TVVBQT1JUIEJULUFNUAorICAgIHNpckNvcHlNYWNBZGRyKGN1cnJlbnRCc3NJZCxwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyAgICBzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fU1RBX1JPTEU6CisgICAgICAgIGNhc2UgZUxJTV9CVF9BTVBfU1RBX1JPTEU6CisgICAgICAgICAgICBzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZUxJTV9NTE1fSURMRV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdGluZyB0byBEZWF1dGhlbnRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGEgcHJlLWF1dGhlbnRpY2F0ZWQgcGVlci4KKyAgICAgICAgICAgICAgICAgICAgLy8gRGVhdXRoZXRpYXRlIHdpdGggcGVlciBpZiB0aGVyZQorICAgICAgICAgICAgICAgICAgICAvLyBleGlzdHMgYSBwcmUtYXV0aCBjb250ZXh0IGJlbG93LgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURToKKyAgICAgICAgICAgICAgICBjYXNlIGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURToKKyAgICAgICAgICAgICAgICBjYXNlIGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQscE1sbURlYXV0aFJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIE1MTV9ERUFVVEhfUkVRIHdpdGggaW52YWxpZCBCU1MgaWQgIikpOykKKyAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlBlZXIgTUFDIEFkZHIgOiAiKSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBNbG1EZWF1dGhSZXEtPnBlZXJNYWNBZGRyLExPR0UpOworCisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJcbiBDRkcgQlNTSUQgQWRkciA6ICIpKTspCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgY3VycmVudEJzc0lkLExPR0UpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLy8gUHJlcGFyZSBhbmQgU2VuZCBMSU1fTUxNX0RFQVVUSF9DTkYKKworICAgICAgICAgICAgICAgICAgICAgICAgbWxtRGVhdXRoQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgRGVhdXRoZW50aWNhdGlvbiBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcGVlciBlbnRpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmREZWF1dGhNZ210RnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNbG1EZWF1dGhSZXEtPnJlYXNvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNbG1EZWF1dGhSZXEtPnBlZXJNYWNBZGRyLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLy8gUHJlcGFyZSBhbmQgU2VuZCBMSU1fTUxNX0RFQVVUSF9DTkYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1sbURlYXV0aENuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBMSU5LX0VTVEFCTElTRURfU1RBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXAgUlggJiBUWCBwYXRocworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBNTE1fREVBVVRIX1JFUSB3aXRoIGluIHN0YXRlICVkIGZvciBwZWVyICIpLAorICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7KQorICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcE1sbURlYXV0aFJlcS0+cGVlck1hY0FkZHIsIExPR1cpOworICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPR1csIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKTsKKworICAgICAgICAgICAgICAgICAgICAvLy8gUHJlcGFyZSBhbmQgU2VuZCBMSU1fTUxNX0RFQVVUSF9DTkYKKyAgICAgICAgICAgICAgICAgICAgbWxtRGVhdXRoQ25mLnJlc3VsdENvZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TTUVfU1RBX05PVF9BVVRIRU5USUNBVEVEOworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fU1RBX0lOX0lCU1NfUk9MRToKKworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGRlZmF1bHQ6IC8vIGVMSU1fQVBfUk9MRQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9IC8vIGVuZCBzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGVyZSBleGlzdHMgYSBjb250ZXh0IGZvciB0aGUgcGVlciBlbnRpdHkKKyAgICAgKiB0byBiZSBkZWF1dGhlbnRpY2F0ZWQgd2l0aC4KKyAgICAgKi8KKyAgICBwU3RhRHMgPSBkcGhMb29rdXBIYXNoRW50cnkocE1hYywgcE1sbURlYXV0aFJlcS0+cGVlck1hY0FkZHIsICZhaWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgIGlmIChwU3RhRHMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vLyBDaGVjayBpZiB0aGVyZSBleGlzdHMgcHJlLWF1dGggY29udGV4dCBmb3IgdGhpcyBTVEEKKyAgICAgICAgcEF1dGhOb2RlID0gbGltU2VhcmNoUHJlQXV0aExpc3QocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbURlYXV0aFJlcS0+cGVlck1hY0FkZHIpOworCisgICAgICAgIGlmIChwQXV0aE5vZGUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBSZWNlaXZlZCBERUFVVEggUkVRIGZvciBhIFNUQSB0aGF0IGlzIG5laXRoZXIKKyAgICAgICAgICAgICAqIEFzc29jaWF0ZWQgbm9yIFByZS1hdXRoZW50aWNhdGVkLiBMb2cgZXJyb3IsCisgICAgICAgICAgICAgKiBQcmVwYXJlIGFuZCBTZW5kIExJTV9NTE1fREVBVVRIX0NORgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgTUxNX0RFQVVUSF9SRVEgZm9yIFNUQSB0aGF0IGRvZXMgbm90IGhhdmUgY29udGV4dCwgQWRkcj0iKSk7KQorICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBNbG1EZWF1dGhSZXEtPnBlZXJNYWNBZGRyLCBMT0dXKTsKKworICAgICAgICAgICAgbWxtRGVhdXRoQ25mLnJlc3VsdENvZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TTUVfU1RBX05PVF9BVVRIRU5USUNBVEVEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWxtRGVhdXRoQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCisgICAgICAgICAgICAvLy8gRGVsZXRlIFNUQSBmcm9tIHByZS1hdXRoIFNUQSBsaXN0CisgICAgICAgICAgICBsaW1EZWxldGVQcmVBdXRoTm9kZShwTWFjLCBwTWxtRGVhdXRoUmVxLT5wZWVyTWFjQWRkcik7CisKKyAgICAgICAgICAgIC8vLyBTZW5kIERlYXV0aGVudGljYXRpb24gZnJhbWUgdG8gcGVlciBlbnRpdHkKKyAgICAgICAgICAgIGxpbVNlbmREZWF1dGhNZ210RnJhbWUocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbURlYXV0aFJlcS0+cmVhc29uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbURlYXV0aFJlcS0+cGVlck1hY0FkZHIscHNlc3Npb25FbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpICYmCisgICAgICAgICAgICAgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFKSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWNlaXZlZCBMSU1fTUxNX0RFQVVUSF9SRVEgZm9yIFNUQSB0aGF0IGlzIG4KKyAgICAgICAgICogc29tZSB0cmFuc2l0IHN0YXRlLiBMb2cgZXJyb3IuCisgICAgICAgICAqLworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgIEZMKCJyZWNlaXZlZCBNTE1fREVBVVRIX1JFUSBmb3IgU1RBIHRoYXQgZWl0aGVyIGhhcyBubyBjb250ZXh0IG9yIGluIHNvbWUgdHJhbnNpdCBzdGF0ZSwgQWRkcj0iKSk7KQorICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcE1sbURlYXV0aFJlcS0+cGVlck1hY0FkZHIsIExPR1cpOworCisgICAgICAgIC8vLyBQcmVwYXJlIGFuZCBTZW5kIExJTV9NTE1fREVBVVRIX0NORgorCisgICAgICAgIG1sbURlYXV0aENuZi5yZXN1bHRDb2RlICAgID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworCisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8vcFN0YURzLT5tbG1TdGFDb250ZXh0LnJ4UHVyZ2VSZXEgICAgID0gMTsKKyAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb24gPSAodFNpck1hY1JlYXNvbkNvZGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNbG1EZWF1dGhSZXEtPnJlYXNvbkNvZGU7CisgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyID0gcE1sbURlYXV0aFJlcS0+ZGVhdXRoVHJpZ2dlcjsKKworICAgIC8vLyBTZW5kIERlYXV0aGVudGljYXRpb24gZnJhbWUgdG8gcGVlciBlbnRpdHkKKyAgICBsaW1TZW5kRGVhdXRoTWdtdEZyYW1lKHBNYWMsIHBNbG1EZWF1dGhSZXEtPnJlYXNvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWxtRGVhdXRoUmVxLT5wZWVyTWFjQWRkcixwc2Vzc2lvbkVudHJ5KTsKKworICAgIGlmKCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlU1lTVEVNX0FQX1JPTEUpKQorICAgIHsKKyAgICAgIC8vIERlbGF5IERFTCBTVEEgZm9yIDMwMG1zIHN1Y2ggdGhhdCB1bmljYXN0IGRlYXV0aCBpcyAKKyAgICAgIC8vIGRlbGl2ZXJlZCBhdCBUSU0oMTAwIGZvciBub3JtYWwgb3IgMzAwbXMgZm9yIGR5bmFtaWMpIAorICAgICAgLy8gdG8gcG93ZXIgc2F2ZSBzdGF0aW9ucyBhZnRlciBzZXR0aW5nIFBWQgorICAgICAgdm9zX3NsZWVwKDMwMCk7CisgICAgfQorCisgICAgLy8vIFJlY2VpdmUgcGF0aCBjbGVhbnVwIHdpdGggZHVtbXkgcGFja2V0CisgICAgbGltQ2xlYW51cFJ4UGF0aChwTWFjLCBwU3RhRHMscHNlc3Npb25FbnRyeSk7CisKKyAgICAvLy8gRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkIGZvciBtbG1EZWF1dGhSZXEKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTWxtRGVhdXRoUmVxKTsKKworICAgIHJldHVybjsKKworZW5kOgorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZtbG1EZWF1dGhDbmYucGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwTWxtRGVhdXRoUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIG1sbURlYXV0aENuZi5kZWF1dGhUcmlnZ2VyID0gcE1sbURlYXV0aFJlcS0+ZGVhdXRoVHJpZ2dlcjsKKyAgICBtbG1EZWF1dGhDbmYuYWlkICAgICAgICAgICA9IHBNbG1EZWF1dGhSZXEtPmFpZDsKKyAgICBtbG1EZWF1dGhDbmYuc2Vzc2lvbklkID0gcE1sbURlYXV0aFJlcS0+c2Vzc2lvbklkOworCisgICAgLy8gRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkCisgICAgLy8gZm9yIG1sbURlYXV0aFJlcQorICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBNbG1EZWF1dGhSZXEpOworCisgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICBMSU1fTUxNX0RFQVVUSF9DTkYsCisgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopICZtbG1EZWF1dGhDbmYpOworCit9CisKKy8qKgorICogbGltUHJvY2Vzc01sbURlYXV0aFJlcSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgTUxNX0RFQVVUSF9SRVEgbWVzc2FnZQorICogZnJvbSBTTUUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBNc2dCdWYgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc01sbURlYXV0aFJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKy8vICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGFpZDsKKy8vICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgIGN1cnJlbnRCc3NJZDsKKy8vICAgIHRwRHBoSGFzaE5vZGUgICAgICAgICAgIHBTdGFEczsKKy8vICAgIHN0cnVjdCB0TGltUHJlQXV0aE5vZGUgICpwQXV0aE5vZGU7CisgICAgdExpbU1sbURlYXV0aFJlcSAgICAgICAgKnBNbG1EZWF1dGhSZXE7CisvLyAgICB0TGltTWxtRGVhdXRoQ25mICAgICAgICBtbG1EZWF1dGhDbmY7CisgICAgdHBQRVNlc3Npb24gICAgICAgICAgICAgcHNlc3Npb25FbnRyeTsKKworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTExcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwTWxtRGVhdXRoUmVxID0gKHRMaW1NbG1EZWF1dGhSZXEgKikgcE1zZ0J1ZjsKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMscE1sbURlYXV0aFJlcS0+c2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoIGlzTGltU2Vzc2lvbk9mZkNoYW5uZWwocE1hYywgcE1sbURlYXV0aFJlcS0+c2Vzc2lvbklkKSApCisgICAgeworICAgICAgLy9zdXNwZW5kIGxpbmsKKyAgICAgIGxpbVN1c3BlbmRMaW5rKHBNYWMsIGVTSVJfRE9OVF9DSEVDS19MSU5LX1RSQUZGSUNfQkVGT1JFX1NDQU4sIAorICAgICAgICAgIGxpbVByb2Nlc3NNbG1EZWF1dGhSZXFQb3N0U3VzcGVuZCwgKHRBTklfVTMyKilwTXNnQnVmICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvL05vIG5lZWQgdG8gc3VzcGVuZCBsaW5rLgorICAgICAgbGltUHJvY2Vzc01sbURlYXV0aFJlcVBvc3RTdXNwZW5kKCBwTWFjLCBlSEFMX1NUQVRVU19TVUNDRVNTLAorICAgICAgICAgICh0QU5JX1UzMiopIHBNc2dCdWYgKTsKKyAgICB9Cit9IC8qKiogbGltUHJvY2Vzc01sbURlYXV0aFJlcSgpICoqKi8KKworCisKKy8qKgorICogQGZ1bmN0aW9uIDogbGltUHJvY2Vzc01sbVNldEtleXNSZXEoKQorICoKKyAqIEBicmllZiA6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgTUxNX1NFVEtFWVNfUkVRIG1lc3NhZ2UKKyAqIGZyb20gU01FCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2xpbVByb2Nlc3NNbG1TZXRLZXlzUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQorewordEFOSV9VMTYgICAgICAgICAgIGFpZDsKK3RBTklfVTE2ICAgICAgICAgICBzdGFJZHggPSAwOwordEFOSV9VMzIgICAgICAgICAgIGRlZmF1bHRLZXlJZCA9IDA7Cit0U2lyTWFjQWRkciAgICAgICAgY3VycmVudEJzc0lkOwordHBEcGhIYXNoTm9kZSAgICAgIHBTdGFEczsKK3RMaW1NbG1TZXRLZXlzUmVxICAqcE1sbVNldEtleXNSZXE7Cit0TGltTWxtU2V0S2V5c0NuZiAgbWxtU2V0S2V5c0NuZjsKK3RwUEVTZXNzaW9uICAgICAgICBwc2Vzc2lvbkVudHJ5OworCisgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgeworICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgIHJldHVybjsKKyAgfQorCisKKyAgcE1sbVNldEtleXNSZXEgPSAodExpbU1sbVNldEtleXNSZXEgKikgcE1zZ0J1ZjsKKyAgLy8gSG9sZCBvbnRvIHRoZSBTZXRLZXlzIHJlcXVlc3QgcGFyYW1ldGVycworICBwTWFjLT5saW0uZ3BMaW1NbG1TZXRLZXlzUmVxID0gKHZvaWQgKikgcE1sbVNldEtleXNSZXE7CisKKyAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwTWxtU2V0S2V5c1JlcS0+c2Vzc2lvbklkKSk9PSBOVUxMKQorICB7CisgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWRcbiIpKTspCisgICAgcmV0dXJuOworICB9CisKKyAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgRkwoICJSZWNlaXZlZCBNTE1fU0VUS0VZU19SRVEgd2l0aCBwYXJhbWV0ZXJzOlxuIgorICAgICAgICAiQUlEIFslZF0sIEVEIFR5cGUgWyVkXSwgIyBLZXlzIFslZF0gJiBQZWVyIE1BQyBBZGRyIC0gIiksCisgICAgICBwTWxtU2V0S2V5c1JlcS0+YWlkLAorICAgICAgcE1sbVNldEtleXNSZXEtPmVkVHlwZSwKKyAgICAgIHBNbG1TZXRLZXlzUmVxLT5udW1LZXlzICk7CisgIGxpbVByaW50TWFjQWRkciggcE1hYywgcE1sbVNldEtleXNSZXEtPnBlZXJNYWNBZGRyLCBMT0dXICk7CisKKyAgICAjaWYgMAorICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gd2xhbl9jZmdHZXRTdHIoIHBNYWMsIFdOSV9DRkdfQlNTSUQsIGN1cnJlbnRCc3NJZCwgJmNmZyApKSB7CisgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiQ291bGQgbm90IHJldHJpZXZlIEJTU0lEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICBzaXJDb3B5TWFjQWRkcihjdXJyZW50QnNzSWQscHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisgICAgc3dpdGNoKCBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICkgeworICAgIGNhc2UgZUxJTV9TVEFfUk9MRToKKyAgICBjYXNlIGVMSU1fQlRfQU1QX1NUQV9ST0xFOgorICAgICAgICBpZigoIWxpbUlzQWRkckJDKCBwTWxtU2V0S2V5c1JlcS0+cGVlck1hY0FkZHIgKSApICYmCisgICAgICAgICAgKCFwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCxwTWxtU2V0S2V5c1JlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKSkgKXsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlJlY2VpdmVkIE1MTV9TRVRLRVlTX1JFUSB3aXRoIGludmFsaWQgQlNTSURcbiIpKTsKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKCBwTWFjLCBwTWxtU2V0S2V5c1JlcS0+cGVlck1hY0FkZHIsIExPR1cgKTsKKworICAgICAgICAvLyBQcmVwYXJlIGFuZCBTZW5kIExJTV9NTE1fU0VUS0VZU19DTkYgd2l0aCBlcnJvciBjb2RlCisgICAgICAgIG1sbVNldEtleXNDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKyAgICAgICAgZ290byBlbmQ7CisgICAgICB9CisgICAgICAvLyBGYWxsIHRocnUnICYgJ1BsdW1iJyBrZXlzIGJlbG93CisgICAgICBicmVhazsKKyAgICBjYXNlIGVMSU1fU1RBX0lOX0lCU1NfUk9MRToKKyAgICBkZWZhdWx0OiAvLyBvdGhlcnMKKyAgICAgIC8vIEZhbGwgdGhydS4uLgorICAgICAgYnJlYWs7CisgIH0KKworICAgIC8qKgorICAgICAgKiBVc2UgdGhlICJ1bmljYXN0IiBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSAiR3JvdXAgS2V5cyIKKyAgICAgICogYXJlIGJlaW5nIHNldC4KKyAgICAgICogcE1sbVNldEtleXNSZXEtPmtleS51bmljYXN0ID0gMCAtPiBNdWx0aWNhc3QvYnJvYWRjYXN0CisgICAgICAqIHBNbG1TZXRLZXlzUmVxLT5rZXkudW5pY2FzdCAtIDEgLT4gVW5pY2FzdCBrZXlzIGFyZSBiZWluZyBzZXQKKyAgICAgICovCisgICAgaWYoIGxpbUlzQWRkckJDKCBwTWxtU2V0S2V5c1JlcS0+cGVlck1hY0FkZHIgKSkgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPRzEsIEZMKCJUcnlpbmcgdG8gc2V0IEdyb3VwIEtleXMuLi4lZCBcbiIpLCBwTWxtU2V0S2V5c1JlcS0+c2Vzc2lvbklkKTsKKyAgICAgICAgLyoqIFdoZW4gdHJ5aW5nIHRvIHNldCBHcm91cCBLZXlzIGZvciBhbnkKKyAgICAgICAgICAqIHNlY3VyaXR5IG1vZGUgb3RoZXIgdGhhbiBXRVAsIHVzZSB0aGUKKyAgICAgICAgICAqIFNUQSBJbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoZSBBUC4uLgorICAgICAgICAgICovCisgICAgICAgIHN3aXRjaCggcE1sbVNldEtleXNSZXEtPmVkVHlwZSApIHsKKyAgICAgIGNhc2UgZVNJUl9FRF9DQ01QOgorICAgICAgICAgCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworICAgICAgY2FzZSBlU0lSX0VEX0FFU18xMjhfQ01BQzoKKyNlbmRpZgorICAgICAgICBzdGFJZHggPSBwc2Vzc2lvbkVudHJ5LT5zdGFJZDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9ZWxzZSB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HMSwgRkwoIlRyeWluZyB0byBzZXQgVW5pY2FzdCBLZXlzLi4uXG4iKSk7CisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlcmUgZXhpc3RzIGEgY29udGV4dCBmb3IgdGhlCisgICAgICogcGVlciBlbnRpdHkgZm9yIHdoaWNoIGtleXMgbmVlZCB0byBiZSBzZXQuCisgICAgICovCisKKworICAgIHBTdGFEcyA9IGRwaExvb2t1cEhhc2hFbnRyeSggcE1hYywgcE1sbVNldEtleXNSZXEtPnBlZXJNYWNBZGRyLCAmYWlkICwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmICgocFN0YURzID09IE5VTEwpIHx8CisgICAgICAgICAgICgocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpICYmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkpKSB7CisjZWxzZQorICAgIGlmICgocFN0YURzID09IE5VTEwpIHx8CisgICAgICAgICAgICgocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpICkpIHsKKyNlbmRpZgorICAgICAgICAvKioKKyAgICAgICAgICogUmVjZWl2ZWQgTElNX01MTV9TRVRLRVlTX1JFUSBmb3IgU1RBCisgICAgICAgICAqIHRoYXQgZG9lcyBub3QgaGF2ZSBjb250ZXh0IG9yIGluIHNvbWUKKyAgICAgICAgICogdHJhbnNpdCBzdGF0ZS4gTG9nIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HMSwKKyAgICAgICAgICAgIEZMKCJSZWNlaXZlZCBNTE1fU0VUS0VZU19SRVEgZm9yIFNUQSB0aGF0IGVpdGhlciBoYXMgbm8gY29udGV4dCBvciBpbiBzb21lIHRyYW5zaXQgc3RhdGUsIEFkZHIgPSAiKSk7CisgICAgICAgIGxpbVByaW50TWFjQWRkciggcE1hYywgcE1sbVNldEtleXNSZXEtPnBlZXJNYWNBZGRyLCBMT0dXICk7CisKKyAgICAgICAgLy8gUHJlcGFyZSBhbmQgU2VuZCBMSU1fTUxNX1NFVEtFWVNfQ05GCisgICAgICAgIG1sbVNldEtleXNDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKyAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0gZWxzZQorICAgICAgc3RhSWR4ID0gcFN0YURzLT5zdGFJbmRleDsKKyAgfQorCisgICAgaWYgKChwTWxtU2V0S2V5c1JlcS0+bnVtS2V5cyA9PSAwKSAmJiAocE1sbVNldEtleXNSZXEtPmVkVHlwZSAhPSBlU0lSX0VEX05PTkUpKSB7CisgICAgLy8KKyAgICAvLyBCcm9hZGNhc3QvTXVsdGljYXN0IEtleXMgKGZvciBXRVAhISkgYXJlIE5PVCBzZW50CisgICAgLy8gdmlhIHRoaXMgaW50ZXJmYWNlISEKKyAgICAvLworICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRvIEhBTCB0aGF0IHRoZSBXRVAgS2V5cyBuZWVkIHRvIGJlCisgICAgLy8gZXh0cmFjdGVkIGZyb20gdGhlIENGRyBhbmQgYXBwbGllZCB0byBoYXJkd2FyZQorICAgIGRlZmF1bHRLZXlJZCA9IDB4ZmY7CisgICAgICB9ZWxzZQorICAgIGRlZmF1bHRLZXlJZCA9IDA7CisKKyAgICBsaW1Mb2coIHBNYWMsIExPRzEsCisgICAgICBGTCggIlRyeWluZyB0byBzZXQga2V5cyBmb3IgU1RBIEluZGV4IFslZF0sIHVzaW5nIGRlZmF1bHRLZXlJZCBbJWRdXG4iICksCisgICAgICBzdGFJZHgsCisgICAgICBkZWZhdWx0S2V5SWQgKTsKKworICAgIGlmKGxpbUlzQWRkckJDKCBwTWxtU2V0S2V5c1JlcS0+cGVlck1hY0FkZHIgKSkgeworICBwc2Vzc2lvbkVudHJ5LT5saW1QcmV2TWxtU3RhdGUgPSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZTsKKyAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9TRVRfQlNTX0tFWV9TVEFURTsKKyAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HMSwgRkwoIlRyeWluZyB0byBzZXQgR3JvdXAgS2V5cy4uLiVkIFxuIiksIAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworCisgICAgLy8gUGFja2FnZSBXREFfU0VUX0JTU0tFWV9SRVEgbWVzc2FnZSBwYXJhbWV0ZXJzCisgICAgICAgIGxpbVNlbmRTZXRCc3NLZXlSZXEocE1hYywgcE1sbVNldEtleXNSZXEscHNlc3Npb25FbnRyeSk7CisgICAgcmV0dXJuOworICAgIH1lbHNlIHsKKyAgICAvLyBQYWNrYWdlIFdEQV9TRVRfU1RBS0VZX1JFUSAvIFdEQV9TRVRfU1RBX0JDQVNUS0VZX1JFUSBtZXNzYWdlIHBhcmFtZXRlcnMKKyAgICAgICAgbGltU2VuZFNldFN0YUtleVJlcShwTWFjLCBwTWxtU2V0S2V5c1JlcSwgc3RhSWR4LCAodEFOSV9VOCkgZGVmYXVsdEtleUlkLHBzZXNzaW9uRW50cnkpOworICAgIHJldHVybjsKKyAgfQorCitlbmQ6CisgICAgbWxtU2V0S2V5c0NuZi5zZXNzaW9uSWQ9IHBNbG1TZXRLZXlzUmVxLT5zZXNzaW9uSWQ7CisgICAgbGltUG9zdFNtZVNldEtleXNDbmYoIHBNYWMsIHBNbG1TZXRLZXlzUmVxLCAmbWxtU2V0S2V5c0NuZiApOworCit9IC8qKiogbGltUHJvY2Vzc01sbVNldEtleXNSZXEoKSAqKiovCisKKy8qKgorICogbGltUHJvY2Vzc01sbVJlbW92ZUtleVJlcSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgTUxNX1JFTU9WRUtFWV9SRVEgbWVzc2FnZQorICogZnJvbSBTTUUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBNc2dCdWYgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc01sbVJlbW92ZUtleVJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKK3RBTklfVTE2ICAgICAgICAgICBhaWQ7Cit0QU5JX1UxNiAgICAgICAgICAgc3RhSWR4ID0gMDsKK3RTaXJNYWNBZGRyICAgICAgICBjdXJyZW50QnNzSWQ7Cit0cERwaEhhc2hOb2RlICAgICAgcFN0YURzOwordExpbU1sbVJlbW92ZUtleVJlcSAgKnBNbG1SZW1vdmVLZXlSZXE7Cit0TGltTWxtUmVtb3ZlS2V5Q25mICBtbG1SZW1vdmVLZXlDbmY7CisgICAgdHBQRVNlc3Npb24gICAgICAgICBwc2Vzc2lvbkVudHJ5OworCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBNbG1SZW1vdmVLZXlSZXEgPSAodExpbU1sbVJlbW92ZUtleVJlcSAqKSBwTXNnQnVmOworCisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBNbG1SZW1vdmVLZXlSZXEtPnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JZFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgaWYoIHBNYWMtPmxpbS5ncExpbU1sbVJlbW92ZUtleVJlcSAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIC8vIEZyZWUgYW55IHByZXZpb3VzIHJlcXVlc3RzLgorICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTWFjLT5saW0uZ3BMaW1NbG1SZW1vdmVLZXlSZXEpOworICAgICAgICBwTWFjLT5saW0uZ3BMaW1NbG1SZW1vdmVLZXlSZXEgPSBOVUxMOworICAgIH0KKyAgICAvLyBIb2xkIG9udG8gdGhlIFJlbW92ZUtleXMgcmVxdWVzdCBwYXJhbWV0ZXJzCisgICAgcE1hYy0+bGltLmdwTGltTWxtUmVtb3ZlS2V5UmVxID0gKHZvaWQgKikgcE1sbVJlbW92ZUtleVJlcTsgCisKKyAgICAjaWYgMAorICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gd2xhbl9jZmdHZXRTdHIoIHBNYWMsCisgICAgICAgIFdOSV9DRkdfQlNTSUQsCisgICAgICAgIGN1cnJlbnRCc3NJZCwKKyAgICAgICAgJmNmZyApKQorICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkNvdWxkIG5vdCByZXRyaWV2ZSBCU1NJRFxuIikpOworICAgICNlbmRpZiAvL1RPLVNVUFBPUlQgQlQtQU1QCisgICAgc2lyQ29weU1hY0FkZHIoY3VycmVudEJzc0lkLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworICAgIHN3aXRjaCggcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSApCisgICAgeworICAgICAgICBjYXNlIGVMSU1fU1RBX1JPTEU6CisgICAgICAgIGNhc2UgZUxJTV9CVF9BTVBfU1RBX1JPTEU6CisgICAgICAgIGlmKCggbGltSXNBZGRyQkMoIHBNbG1SZW1vdmVLZXlSZXEtPnBlZXJNYWNBZGRyICkgIT0gdHJ1ZSApICYmCisgICAgICAgICAgKCFwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCxwTWxtUmVtb3ZlS2V5UmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgICAgICBGTCgiUmVjZWl2ZWQgTUxNX1JFTU9WRUtFWV9SRVEgd2l0aCBpbnZhbGlkIEJTU0lEXG4iKSk7CisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIoIHBNYWMsIHBNbG1SZW1vdmVLZXlSZXEtPnBlZXJNYWNBZGRyLCBMT0dXICk7CisKKyAgICAgICAgICAgIC8vIFByZXBhcmUgYW5kIFNlbmQgTElNX01MTV9SRU1PVkVLRVlfQ05GIHdpdGggZXJyb3IgY29kZQorICAgICAgICAgICAgbWxtUmVtb3ZlS2V5Q25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fU1RBX0lOX0lCU1NfUk9MRToKKyAgICAgICAgZGVmYXVsdDogLy8gZUxJTV9BUF9ST0xFCisgICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhydS4uLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgcHNlc3Npb25FbnRyeS0+bGltUHJldk1sbVN0YXRlID0gcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGU7CisgICAgaWYobGltSXNBZGRyQkMoIHBNbG1SZW1vdmVLZXlSZXEtPnBlZXJNYWNBZGRyICkpIC8vU2Vjb25kIGNvbmRpdGlvbiBmb3IgSUJTUyBvciBBUCByb2xlLgorICAgIHsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9SRU1PVkVfQlNTX0tFWV9TVEFURTsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7ICAgIAorICAgICAgICAvLyBQYWNrYWdlIFdEQV9SRU1PVkVfQlNTS0VZX1JFUSBtZXNzYWdlIHBhcmFtZXRlcnMKKyAgICAgICAgbGltU2VuZFJlbW92ZUJzc0tleVJlcSggcE1hYyxwTWxtUmVtb3ZlS2V5UmVxLHBzZXNzaW9uRW50cnkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgIC8qKgorICAgICogQ2hlY2sgaWYgdGhlcmUgZXhpc3RzIGEgY29udGV4dCBmb3IgdGhlCisgICAgKiBwZWVyIGVudGl0eSBmb3Igd2hpY2gga2V5cyBuZWVkIHRvIGJlIHJlbW92ZWQuCisgICAgKi8KKyAgcFN0YURzID0gZHBoTG9va3VwSGFzaEVudHJ5KCBwTWFjLCBwTWxtUmVtb3ZlS2V5UmVxLT5wZWVyTWFjQWRkciwgJmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUgKTsKKyAgaWYgKChwU3RhRHMgPT0gTlVMTCkgfHwKKyAgICAgICAgIChwU3RhRHMgJiYKKyAgICAgICAgIChwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkpKQorICB7CisgICAgIC8qKgorICAgICAgICogUmVjZWl2ZWQgTElNX01MTV9SRU1PVkVLRVlfUkVRIGZvciBTVEEKKyAgICAgICAqIHRoYXQgZG9lcyBub3QgaGF2ZSBjb250ZXh0IG9yIGluIHNvbWUKKyAgICAgICAqIHRyYW5zaXQgc3RhdGUuIExvZyBlcnJvci4KKyAgICAgICAqLworICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgIEZMKCJSZWNlaXZlZCBNTE1fUkVNT1ZFS0VZU19SRVEgZm9yIFNUQSB0aGF0IGVpdGhlciBoYXMgbm8gY29udGV4dCBvciBpbiBzb21lIHRyYW5zaXQgc3RhdGUsIEFkZHIgPSAiKSk7CisgICAgICBsaW1QcmludE1hY0FkZHIoIHBNYWMsIHBNbG1SZW1vdmVLZXlSZXEtPnBlZXJNYWNBZGRyLCBMT0dXICk7CisKKyAgICAgIC8vIFByZXBhcmUgYW5kIFNlbmQgTElNX01MTV9SRU1PVkVLRVlfQ05GCisgICAgICBtbG1SZW1vdmVLZXlDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKyAgICAgIG1sbVJlbW92ZUtleUNuZi5zZXNzaW9uSWQgPSBwTWxtUmVtb3ZlS2V5UmVxLT5zZXNzaW9uSWQ7CisgICAgICAKKworICAgICAgZ290byBlbmQ7CisgIH0KKyAgZWxzZQorICAgIHN0YUlkeCA9IHBTdGFEcy0+c3RhSW5kZXg7CisgIAorCisKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX1JFTU9WRV9TVEFfS0VZX1NUQVRFOworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworCisgICAgLy8gUGFja2FnZSBXREFfUkVNT1ZFX1NUQUtFWV9SRVEgbWVzc2FnZSBwYXJhbWV0ZXJzCisgICAgbGltU2VuZFJlbW92ZVN0YUtleVJlcSggcE1hYyxwTWxtUmVtb3ZlS2V5UmVxLHN0YUlkeCxwc2Vzc2lvbkVudHJ5KTsKKyAgICByZXR1cm47CisgCitlbmQ6CisgICAgbGltUG9zdFNtZVJlbW92ZUtleUNuZiggcE1hYywKKyAgICAgIHBNbG1SZW1vdmVLZXlSZXEsCisgICAgICAmbWxtUmVtb3ZlS2V5Q25mICk7CisKK30gLyoqKiBsaW1Qcm9jZXNzTWxtUmVtb3ZlS2V5UmVxKCkgKioqLworCisKKy8qKgorICogbGltUHJvY2Vzc01pbkNoYW5uZWxUaW1lb3V0KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNaW4gQ2hhbm5lbCBUaW1lb3V0CisgKiBkdXJpbmcgY2hhbm5lbCBzY2FuLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2xpbVByb2Nlc3NNaW5DaGFubmVsVGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTggY2hhbm5lbE51bTsKKyAgICAKKyNpZmRlZiBHRU42X1RPRE8KKyAgICAvL2lmIHRoZSBtaW4gQ2hhbm5lbCBpcyBtYWludGFpbmVkIHBlciBzZXNzaW9uLCB0aGVuIHVzZSB0aGUgYmVsb3cgc2Vlc2lvbkVudHJ5CisgICAgLy9wcmlvcml0eSAtIExPVy9taWdodCBub3QgYmUgbmVlZGVkCisgICAgCisgICAgLy9UQkQtUkFKRVNIIEhPVyBUTyBHRVQgc2Vzc2lvbkVudHJ5Pz8/Pz8KKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltTWluQ2hhbm5lbFRpbWVyLnNlc3Npb25JZCkpPT0gTlVMTCkgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIAorICAgIGlmIChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUpCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTY2FubmluZyA6IG1pbiBjaGFubmVsIHRpbWVvdXQgb2NjdXJyZWRcbiIpKTspCisKKyAgICAgICAgLy8vIE1pbiBjaGFubmVsIHRpbWVyIHRpbWVkIG91dAorICAgICAgICBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY1Byb2JlUmVxVGltZXIuc2Vzc2lvbklkID0gMHhmZjsKKyAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fTUlOX0NIQU5ORUxfVElNRVIpOworICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9QRVJJT0RJQ19QUk9CRV9SRVFfVElNRVIpOworICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1DdXJyZW50U2NhbkNoYW5uZWxJZCA8PQorICAgICAgICAgICAgICAgICh0QU5JX1UzMikocE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgLSAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhbm5lbE51bSA9ICh0QU5JX1U4KWxpbUdldEN1cnJlbnRTY2FuQ2hhbm5lbChwTWFjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGJlIHRoZSBjYXNlLCBidXQgd2hlbiB0aGlzIGhhcHBlbnMsIHRoaXMgdGltZW91dCBzaG91bGQgYmUgZm9yIHRoZSBsYXN0IGNoYW5uZWxJZC4gCisgICAgICAgICAgICAvLyBHZXQgdGhlIGNoYW5uZWxOdW0gYXMgY2xvc2UgdG8gY29ycmVjdCBhcyBwb3NzaWJsZS4KKyAgICAgICAgICAgIGlmKHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhbm5lbE51bSA9IHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXJbcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNoYW5uZWxOdW0gPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGltU2VuZEhhbEVuZFNjYW5SZXEocE1hYywgY2hhbm5lbE51bSwgZUxJTV9IQUxfRU5EX1NDQU5fV0FJVF9TVEFURSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgLyoqCisgICAgICAgICAqIE1JTiBjaGFubmVsIHRpbWVyIHNob3VsZCBub3QgaGF2ZSB0aW1lZCBvdXQKKyAgICAgICAgICogaW4gc3RhdGVzIG90aGVyIHRoYW4gd2FpdF9wcm9iZV9yZXNwb25zZS4KKyAgICAgICAgICogTG9nIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIE1JTiBjaGFubmVsIHRpbWVvdXQgaW4gc3RhdGUgJVhcbiIpLAorICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKTsKKyAgICAgICAgbGltUHJpbnRNbG1TdGF0ZShwTWFjLCBMT0dFLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKTsKKyAgICB9Cit9IC8qKiogbGltUHJvY2Vzc01pbkNoYW5uZWxUaW1lb3V0KCkgKioqLworCisKKworLyoqCisgKiBsaW1Qcm9jZXNzTWF4Q2hhbm5lbFRpbWVvdXQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1heCBDaGFubmVsIFRpbWVvdXQKKyAqIGR1cmluZyBjaGFubmVsIHNjYW4uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc01heENoYW5uZWxUaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCBjaGFubmVsTnVtOworCisgICAgCisgICAgaWYgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURSB8fAorICAgICAgICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX1BBU1NJVkVfU0NBTl9TVEFURSkKKyAgICB7CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNjYW5uaW5nIDogTWF4IGNoYW5uZWwgdGltZWQgb3V0XG4iKSk7KQorICAgICAgICAvKioKKyAgICAgICAgICogTUFYIGNoYW5uZWwgdGltZXIgdGltZWQgb3V0CisgICAgICAgICAqIENvbnRpbnVlIGNoYW5uZWwgc2Nhbi4KKyAgICAgICAgICovCisgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01BWF9DSEFOTkVMX1RJTUVSKTsKKyAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fUEVSSU9ESUNfUFJPQkVfUkVRX1RJTUVSKTsKKyAgICAgICAgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUGVyaW9kaWNQcm9iZVJlcVRpbWVyLnNlc3Npb25JZCA9IDB4ZmY7CisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbUN1cnJlbnRTY2FuQ2hhbm5lbElkIDw9CisgICAgICAgICAgICAgICAgKHRBTklfVTMyKShwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyAtIDEpKQorICAgICAgICB7CisgICAgICAgIGNoYW5uZWxOdW0gPSBsaW1HZXRDdXJyZW50U2NhbkNoYW5uZWwocE1hYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5jaGFubmVsTGlzdC5jaGFubmVsTnVtYmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYW5uZWxOdW0gPSBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5jaGFubmVsTGlzdC5jaGFubmVsTnVtYmVyW3BNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzIC0gMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjaGFubmVsTnVtID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsaW1TZW5kSGFsRW5kU2NhblJlcShwTWFjLCBjaGFubmVsTnVtLCBlTElNX0hBTF9FTkRfU0NBTl9XQUlUX1NUQVRFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1BWCBjaGFubmVsIHRpbWVyIHNob3VsZCBub3QgaGF2ZSB0aW1lZCBvdXQKKyAgICAgICAgICogaW4gc3RhdGVzIG90aGVyIHRoYW4gd2FpdF9zY2FuLgorICAgICAgICAgKiBMb2cgZXJyb3IuCisgICAgICAgICAqLworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgTUFYIGNoYW5uZWwgdGltZW91dCBpbiBzdGF0ZSAlWFxuIiksCisgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpOworICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPR1csIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpOworICAgIH0KK30gLyoqKiBsaW1Qcm9jZXNzTWF4Q2hhbm5lbFRpbWVvdXQoKSAqKiovCisKKy8qKgorICogbGltUHJvY2Vzc1BlcmlvZGljUHJvYmVSZXFUaW1lcigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgcGVyaW9kaWMgcHJvYmUgcmVxdWVzdAorICogIHRvIHNlbmQgZHVyaW5nIHNjYW4uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc1BlcmlvZGljUHJvYmVSZXFUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTggY2hhbm5lbE51bTsKKyAgICB0QU5JX1U4IGkgPSAwOworICAgIHRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworICAgIFRYX1RJTUVSICpwUGVyaW9kaWNQcm9iZVJlcVRpbWVyOworICAgIHBQZXJpb2RpY1Byb2JlUmVxVGltZXIgPSAmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUGVyaW9kaWNQcm9iZVJlcVRpbWVyOworCisgICAgaWYodm9zX3RpbWVyX2dldEN1cnJlbnRTdGF0ZSgmcFBlcmlvZGljUHJvYmVSZXFUaW1lci0+dm9zVGltZXIpCisgICAgICAgICAhPSBWT1NfVElNRVJfU1RBVEVfU1RPUFBFRCkKKyAgICB7CisgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiSW52YWxpZCBzdGF0ZSBvZiB0aW1lclxuIikpOykKKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUpICYmCisgICAgICAgIChwUGVyaW9kaWNQcm9iZVJlcVRpbWVyLT5zZXNzaW9uSWQgIT0gMHhmZikpCisgICAgeworICAgICAgICB0TGltTWxtU2NhblJlcSAqcExpbU1sbVNjYW5SZXEgPSBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxOworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTY2FubmluZyA6IFBlcmlvZGljIHNjYW5uaW5nXG4iKSk7KQorICAgICAgICAvKioKKyAgICAgICAgICogUGVyaW9kaWMgY2hhbm5lbCB0aW1lciB0aW1lZCBvdXQKKyAgICAgICAgICogdG8gc2VuZCBwcm9iZSByZXF1ZXN0LgorICAgICAgICAgKi8KKyAgICAgICAgY2hhbm5lbE51bSA9IGxpbUdldEN1cnJlbnRTY2FuQ2hhbm5lbChwTWFjKTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgLyogUHJlcGFyZSBhbmQgc2VuZCBQcm9iZSBSZXF1ZXN0IGZyYW1lIGZvciBhbGwgdGhlIFNTSURzCisgICAgICAgICAgICAgKiBwcmVzZW50IGluIHRoZSBzYXZlZCBNTE0KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HVywgRkwoInNlbmRpbmcgUHJvYmVSZXEgbnVtYmVyICVkLCIKKyAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIFNTSUQgJXMgb24gY2hhbm5lbDogJWRcbiIpLAorICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHBMaW1NbG1TY2FuUmVxLT5zc0lkW2ldLnNzSWQsCisgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxOdW0pOykKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RhdHVzID0gbGltU2VuZFByb2JlUmVxTWdtdEZyYW1lKCBwTWFjLCAmcExpbU1sbVNjYW5SZXEtPnNzSWRbaV0sCisgICAgICAgICAgICAgICAgICAgICBwTGltTWxtU2NhblJlcS0+YnNzSWQsIGNoYW5uZWxOdW0sIHBNYWMtPmxpbS5nU2VsZk1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICBwTGltTWxtU2NhblJlcS0+ZG90MTFtb2RlLCBwTGltTWxtU2NhblJlcS0+dUlFRmllbGRMZW4sCisgICAgICAgICAgICAgICAodEFOSV9VOCAqKShwTGltTWxtU2NhblJlcSkgKyBwTGltTWxtU2NhblJlcS0+dUlFRmllbGRPZmZzZXQpOworCisKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJzZW5kIFByb2JlUmVxIGZhaWxlZCBmb3IgU1NJRCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb24gY2hhbm5lbDogJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW1NbG1TY2FuUmVxLT5zc0lkW2ldLnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE51bSk7KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfSB3aGlsZSAoaSA8IHBMaW1NbG1TY2FuUmVxLT5udW1Tc2lkKTsKKworICAgICAgICAvKiBBY3RpdmF0ZSB0aW1lciBhZ2FpbiAqLworICAgICAgICBpZiAodHhfdGltZXJfYWN0aXZhdGUocFBlcmlvZGljUHJvYmVSZXFUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHN0YXJ0IHBlcmlvZGljIHByb2JlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXEgdGltZXJcbiIpKTsKKyAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmlvZGljIHNjYW4gaXMgdGltZW91dCBpcyBoYXBwZW5pbmcgaW4KKyAgICAgICAgICogaW4gc3RhdGVzIG90aGVyIHRoYW4gd2FpdF9zY2FuLgorICAgICAgICAgKiBMb2cgZXJyb3IuCisgICAgICAgICAqLworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgUGVyaW9kaWMgc2NhbiB0aW1lb3V0IGluIHN0YXRlICVYXG4iKSwKKyAgICAgICAgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSk7CisgICAgfQorfSAvKioqIGxpbVByb2Nlc3NQZXJpb2RpY1Byb2JlUmVxVGltZXIoKSAqKiovCisKKy8qKgorICogbGltUHJvY2Vzc0pvaW5GYWlsdXJlVGltZW91dCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgSm9pbkZhaWx1cmVUaW1lb3V0CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc0pvaW5GYWlsdXJlVGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRMaW1NbG1Kb2luQ25mICBtbG1Kb2luQ25mOworICAgIHRTaXJNYWNBZGRyIGJzc2lkOworICAgIHRBTklfVTMyIGxlbjsKKyAgICAKKyAgICAvL2ZldGNoIHRoZSBzZXNzaW9uRW50cnkgYmFzZWQgb24gdGhlIHNlc3Npb25JZAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Kb2luRmFpbHVyZVRpbWVyLnNlc3Npb25JZCkpPT0gTlVMTCkgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgICAgIAorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9KT0lOX0JFQUNPTl9TVEFURSkKKyAgICB7CisgICAgICAgIGxlbiA9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsIFdOSV9DRkdfQlNTSUQsIGJzc2lkLCAmbGVuKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBnZXQgQlNTSUQgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEJTU0lEXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyAnQ2hhbmdlJyB0aW1lciBmb3IgZnV0dXJlIGFjdGl2YXRpb25zCisgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0pPSU5fRkFJTF9USU1FUik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElzc3VlIE1MTSBqb2luIGNvbmZpcm0gd2l0aCB0aW1lb3V0IHJlYXNvbiBjb2RlCisgICAgICAgICAqLworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICBGTCgiIEpvaW4gRmFpbHVyZSBUaW1lb3V0IG9jY3VycmVkLlxuIikpOykKKworICAgICAgICBtbG1Kb2luQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9KT0lOX1RJTUVPVVRfUkVTVUxUX0NPREU7CisgICAgICAgIG1sbUpvaW5DbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9JRExFX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKyAgICAgICAgaWYobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19JRExFX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgTlVMTCwgTlVMTCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCAgRkwoIkZhaWxlZCB0byBzZXQgdGhlIExpbmtTdGF0ZVxuIikpOykKKyAgICAgICAgLyogVXBkYXRlIFBFIHNlc3Npb24gSWQgKi8KKyAgICAgICAgbWxtSm9pbkNuZi5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAgICAgCisgICAgICAgCisgICAgICAgIC8vIEZyZWV1cCBidWZmZXIgYWxsb2NhdGVkIHRvIGpvaW4gcmVxdWVzdAorICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPnBMaW1NbG1Kb2luUmVxKTsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1NbG1Kb2luUmVxID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9KT0lOX0NORiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopICZtbG1Kb2luQ25mKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBKb2luIGZhaWx1cmUgdGltZXIgc2hvdWxkIG5vdCBoYXZlIHRpbWVkIG91dAorICAgICAgICAgKiBpbiBzdGF0ZXMgb3RoZXIgdGhhbiB3YWl0X2pvaW5fYmVhY29uIHN0YXRlLgorICAgICAgICAgKiBMb2cgZXJyb3IuCisgICAgICAgICAqLworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgSk9JTiBmYWlsdXJlIHRpbWVvdXQgaW4gc3RhdGUgJVhcbiIpLHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKTsKKyAgICAgICAgbGltUHJpbnRNbG1TdGF0ZShwTWFjLCBMT0dXLCBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisgICAgfQorfSAvKioqIGxpbVByb2Nlc3NKb2luRmFpbHVyZVRpbWVvdXQoKSAqKiovCisKKworCisvKioKKyAqIGxpbVByb2Nlc3NBdXRoRmFpbHVyZVRpbWVvdXQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIE1pbiBDaGFubmVsIFRpbWVvdXQKKyAqIGR1cmluZyBjaGFubmVsIHNjYW4uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc0F1dGhGYWlsdXJlVGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIC8vZmV0Y2ggdGhlIHNlc3Npb25FbnRyeSBiYXNlZCBvbiB0aGUgc2Vzc2lvbklkCisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsIHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUF1dGhGYWlsdXJlVGltZXIuc2Vzc2lvbklkKSk9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLEZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSURcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9BVVRIX0ZSQU1FMl9TVEFURToKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9BVVRIX0ZSQU1FNF9TVEFURToKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmVxdWVzdGluZyBTVEEgZGlkIG5vdCByZWNlaXZlIG5leHQgYXV0aCBmcmFtZQorICAgICAgICAgICAgICogYmVmb3JlIEF1dGggRmFpbHVyZSB0aW1lb3V0LgorICAgICAgICAgICAgICogSXNzdWUgTUxNIGF1dGggY29uZmlybSB3aXRoIHRpbWVvdXQgcmVhc29uIGNvZGUKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgCisgICAgICAgICAgICBsaW1SZXN0b3JlRnJvbUF1dGhTdGF0ZShwTWFjLGVTSVJfU01FX0FVVEhfVElNRU9VVF9SRVNVTFRfQ09ERSxlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT04scHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBBdXRoIGZhaWx1cmUgdGltZXIgc2hvdWxkIG5vdCBoYXZlIHRpbWVkIG91dAorICAgICAgICAgICAgICogaW4gc3RhdGVzIG90aGVyIHRoYW4gd3RfYXV0aF9mcmFtZTIvNAorICAgICAgICAgICAgICogTG9nIGVycm9yLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIEFVVEggZmFpbHVyZSB0aW1lb3V0IGluIHN0YXRlICVYXG4iKSwgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpOykKKyAgICAgICAgICAgIGxpbVByaW50TWxtU3RhdGUocE1hYywgTE9HRSwgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpOworCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9IC8qKiogbGltUHJvY2Vzc0F1dGhGYWlsdXJlVGltZW91dCgpICoqKi8KKworCisKKy8qKgorICogbGltUHJvY2Vzc0F1dGhSc3BUaW1lb3V0KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNaW4gQ2hhbm5lbCBUaW1lb3V0CisgKiBkdXJpbmcgY2hhbm5lbCBzY2FuLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2xpbVByb2Nlc3NBdXRoUnNwVGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhdXRoSW5kZXgpCit7CisgICAgc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqcEF1dGhOb2RlOworICAgIHRwUEVTZXNzaW9uICAgICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRBTklfVTggICAgICAgICAgICBzZXNzaW9uSWQ7CisKKyAgICBwQXV0aE5vZGUgPSBsaW1HZXRQcmVBdXRoTm9kZUZyb21JbmRleChwTWFjLCAmcE1hYy0+bGltLmdMaW1QcmVBdXRoVGltZXJUYWJsZSwgYXV0aEluZGV4KTsKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYywgcEF1dGhOb2RlLT5wZWVyTWFjQWRkciwgJnNlc3Npb25JZCkpID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIEJTU0lEIFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfSAKKworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSB8fAorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGV4aXN0cyBhIGNvbnRleHQgZm9yIHRoZSBTVEEKKworICAgICAgICBpZiAocEF1dGhOb2RlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQXV0aGVudGljYXRpb24gcmVzcG9uc2UgdGltZXIgdGltZWRvdXQgZm9yIGFuIFNUQQorICAgICAgICAgICAgICogdGhhdCBkb2VzIG5vdCBoYXZlIGNvbnRleHQgYXQgQVAvU1RBIGluIElCU1MgbW9kZS4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgbWVzc2FnZVxuIikpOykKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwQXV0aE5vZGUtPm1sbVN0YXRlICE9IGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUzX1NUQVRFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIEF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHRpbWVyIHRpbWVkb3V0CisgICAgICAgICAgICAgICAgICogaW4gdW5leHBlY3RlZCBzdGF0ZS4gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIEFVVEggcnNwIHRpbWVvdXQgZm9yIE1BQyBhZGRyZXNzICIpKTsKKyAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEF1dGhOb2RlLT5wZWVyTWFjQWRkciwgTE9HRSk7KQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHRpbWVyCisgICAgICAgICAgICAgICAgLy8gdGltZWRvdXQgZm9yIGFuIFNUQS4KKyAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPm1sbVN0YXRlID0gZUxJTV9NTE1fQVVUSF9SU1BfVElNRU9VVF9TVEFURTsKKyAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPmZUaW1lclN0YXJ0ZWQgPSAwOworICAgICAgICAgICAgICAgUEVMT0cxKCBsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoIkFVVEggcnNwIHRpbWVkb3V0IGZvciBNQUMgYWRkcmVzcyAiKSk7CisgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBBdXRoTm9kZS0+cGVlck1hY0FkZHIsIExPRzEpOykKKworICAgICAgICAgICAgICAgIC8vIENoYW5nZSB0aW1lciB0byByZWFjdGl2YXRlIGl0IGluIGZ1dHVyZQorICAgICAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VQZXJTdGFJZFRpbWVyKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9BVVRIX1JTUF9USU1FUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aE5vZGUtPmF1dGhOb2RlSWR4KTsKKworICAgICAgICAgICAgICAgIGxpbURlbGV0ZVByZUF1dGhOb2RlKHBNYWMsIHBBdXRoTm9kZS0+cGVlck1hY0FkZHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSAvKioqIGxpbVByb2Nlc3NBdXRoUnNwVGltZW91dCgpICoqKi8KKworCisvKioKKyAqIGxpbVByb2Nlc3NBc3NvY0ZhaWx1cmVUaW1lb3V0KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBNaW4gQ2hhbm5lbCBUaW1lb3V0CisgKiBkdXJpbmcgY2hhbm5lbCBzY2FuLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2xpbVByb2Nlc3NBc3NvY0ZhaWx1cmVUaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIE1zZ1R5cGUpCit7CisKKyAgICB0TGltTWxtQXNzb2NDbmYgICAgIG1sbUFzc29jQ25mOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgcHNlc3Npb25FbnRyeTsKKyAgICAKKyAgICAvL3RvIGZldGNoIHRoZSBsaW0vbWxtIHN0YXRlIGJhc2VkIG9uIHRoZSBzZXNzaW9uSWQsIHVzZSB0aGUgYmVsb3cgc2Vzc2lvbkVudHJ5CisgICAgdEFOSV9VOCBzZXNzaW9uSWQ7CisgICAgCisgICAgaWYoTXNnVHlwZSA9PSBMSU1fQVNTT0MpCisgICAgeworICAgICAgICBzZXNzaW9uSWQgPSBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Bc3NvY0ZhaWx1cmVUaW1lci5zZXNzaW9uSWQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNlc3Npb25JZCA9IHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVJlYXNzb2NGYWlsdXJlVGltZXIuc2Vzc2lvbklkOworICAgIH0KKyAgICAKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCBzZXNzaW9uSWQpKT09IE5VTEwpIAorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsRkwoIlNlc3Npb24gRG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JRFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIFJlL0Fzc29jaWF0aW9uIFJlc3BvbnNlIGZyYW1lCisgICAgICogbm90IHJlY2VpdmVkIHdpdGhpbiBSZS9Bc3NvY2lhdGlvbiBGYWlsdXJlIFRpbWVvdXQuCisgICAgICovCisKKworCisKKyAgICAvKiBDUjogdm9zIHBhY2tldCBtZW1vcnkgaXMgbGVha2VkIHdoZW4gYXNzb2MgcnNwIHRpbWVvdXRlZC9mYWlsZWQuICovCisgICAgLyogbm90aWZ5IFRMIHRoYXQgYXNzb2NpYXRpb24gaXMgZmFpbGVkIHNvIHRoYXQgVEwgY2FuIGZsdXNoIHRoZSBjYWNoZWQgZnJhbWUgICovCisgICAgV0xBTlRMX0Fzc29jRmFpbGVkIChwc2Vzc2lvbkVudHJ5LT5zdGFJZCk7CisKKyAgICAvLyBMb2cgZXJyb3IKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgRkwoIlJlL0Fzc29jaWF0aW9uIFJlc3BvbnNlIG5vdCByZWNlaXZlZCBiZWZvcmUgdGltZW91dCBcbiIpKTspCisKKyAgICBpZiAoKCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpIHx8IChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpICl8fAorICAgICAgICAoIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSAhPSBlTElNX01MTV9XVF9BU1NPQ19SU1BfU1RBVEUpICYmCisgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlICE9IGVMSU1fTUxNX1dUX1JFQVNTT0NfUlNQX1NUQVRFKSAgJiYgCisgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlICE9IGVMSU1fTUxNX1dUX0ZUX1JFQVNTT0NfUlNQX1NUQVRFKSkpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogUmUvQXNzb2MgZmFpbHVyZSB0aW1lciBzaG91bGQgbm90IGhhdmUgdGltZWRvdXQgb24gQVAKKyAgICAgICAgICogb3IgaW4gYSBzdGF0ZSBvdGhlciB0aGFuIHd0X3JlL2Fzc29jX3Jlc3BvbnNlLgorICAgICAgICAgKi8KKworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFJFQVNTT0MgZmFpbHVyZSB0aW1lb3V0IGluIHN0YXRlICVYIGZvciByb2xlICVkXG4iKSwKKyAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpOworICAgICAgICBsaW1QcmludE1sbVN0YXRlKHBNYWMsIExPR1csIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICBpZiAoKE1zZ1R5cGUgPT0gTElNX0FTU09DKSB8fCAKKyAgICAgICAgICAgICgoTXNnVHlwZSA9PSBMSU1fUkVBU1NPQykgJiYgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX0ZUX1JFQVNTT0NfUlNQX1NUQVRFKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgIEZMKCIoUmUpQXNzb2MgRmFpbHVyZSBUaW1lb3V0IG9jY3VycmVkLlxuIikpOykKKworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9JRExFX1NUQVRFOworICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL1NldCB0aGUgUlhQIG1vZGUgdG8gSURMRSwgc28gaXQgc3RhcnRzIGZpbHRlcmluZyB0aGUgZnJhbWVzLgorICAgICAgICAgICAgaWYobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19JRExFX1NUQVRFLHBzZXNzaW9uRW50cnktPmJzc0lkLCAKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgTlVMTCwgTlVMTCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgIEZMKCJGYWlsZWQgdG8gc2V0IHRoZSBMaW5rU3RhdGVcbiIpKTspCisgICAgICAgICAKKyAgICAgICAgICAgIC8vICdDaGFuZ2UnIHRpbWVyIGZvciBmdXR1cmUgYWN0aXZhdGlvbnMKKyAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0FTU09DX0ZBSUxfVElNRVIpOworCisgICAgICAgICAgICAvLyBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIEpvaW5SZXEgaGVsZCBieQorICAgICAgICAgICAgLy8gTUxNIHN0YXRlIG1hY2hpbmUKKyAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSk7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEgPSBOVUxMOworICAgICAgICAgICAgfQorCisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkKKyAgICAgICAgICAgIC8vVG8gcmVtb3ZlIHRoZSBwcmVhdXRoIG5vZGUgaW4gY2FzZSBvZiBmYWlsIHRvIGFzc29jaWF0ZQorICAgICAgICAgICAgaWYgKGxpbVNlYXJjaFByZUF1dGhMaXN0KHBNYWMsIHBzZXNzaW9uRW50cnktPmJzc0lkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCIgZGVsZXRlIHByZSBhdXRoIG5vZGUgZm9yICUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YnNzSWRbMF0sIHBzZXNzaW9uRW50cnktPmJzc0lkWzFdLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZFsyXSwgCisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzNdLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZFs0XSwgcHNlc3Npb25FbnRyeS0+YnNzSWRbNV0pOykKKyAgICAgICAgICAgICAgICBsaW1EZWxldGVQcmVBdXRoTm9kZShwTWFjLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgbWxtQXNzb2NDbmYucmVzdWx0Q29kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TTUVfQVNTT0NfVElNRU9VVF9SRVNVTFRfQ09ERTsKKyAgICAgICAgICAgIG1sbUFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJZCovCisgICAgICAgICAgICBtbG1Bc3NvY0NuZi5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAgICAgICAgIGlmIChNc2dUeXBlID09IExJTV9BU1NPQykKKyAgICAgICAgICAgICAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX0FTU09DX0NORiwgKHRBTklfVTMyICopICZtbG1Bc3NvY0NuZik7CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFdpbGwgY29tZSBoZXJlIG9ubHkgaW4gY2FzZSBvZiAxMXIsIENDeCBGVCB3aGVuIHJlYXNzb2MgcnNwIAorICAgICAgICAgICAgICAgICAgIGlzIG5vdCByZWNlaXZlZCBhbmQgd2UgcmVjZWl2ZSBhIHJlYXNzb2MgLSB0aW1lc291dCAqLworICAgICAgICAgICAgICAgIG1sbUFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9GVF9SRUFTU09DX1RJTUVPVVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX1JFQVNTT0NfQ05GLCAodEFOSV9VMzIgKikgJm1sbUFzc29jQ25mKTsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBSZXN0b3JlIHByZS1yZWFzc29jIHJlcSBzdGF0ZS4KKyAgICAgICAgICAgICAqIFNldCBCU1NJRCB0byBjdXJyZW50bHkgYXNzb2NpYXRlZCBBUCBhZGRyZXNzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVByZXZNbG1TdGF0ZTsKKyAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworCisgICAgICAgICAgICBsaW1SZXN0b3JlUHJlUmVhc3NvY1N0YXRlKHBNYWMsIAorICAgICAgICAgICAgICAgIGVTSVJfU01FX1JFQVNTT0NfVElNRU9VVF9SRVNVTFRfQ09ERSwgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLHBzZXNzaW9uRW50cnkpOworICAgICAgICB9CisgICAgfQorfSAvKioqIGxpbVByb2Nlc3NBc3NvY0ZhaWx1cmVUaW1lb3V0KCkgKioqLworCisKKworLyoqCisgKiBsaW1Db21wbGV0ZU1sbVNjYW4oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIE1MTV9TQ0FOX0NORiBtZXNzYWdlCisgKiB0byBTTUUgc3RhdGUgbWFjaGluZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcmV0Q29kZSAgIFJlc3VsdCBjb2RlIHRvIGJlIHNlbnQKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbUNvbXBsZXRlTWxtU2Nhbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyUmVzdWx0Q29kZXMgcmV0Q29kZSkKK3sKKyAgICB0TGltTWxtU2NhbkNuZiAgICBtbG1TY2FuQ25mOworCisgICAgLy8vIFJlc3RvcmUgcHJldmlvdXMgTUxNIHN0YXRlCisgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IHBNYWMtPmxpbS5nTGltUHJldk1sbVN0YXRlOworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworICAgIGxpbVJlc3RvcmVQcmVTY2FuU3RhdGUocE1hYyk7CisKKyAgICAvLyBGcmVlIHVwIHBNYWMtPmxpbS5nTGltTWxtU2NhblJlcQorICAgIGlmKCBOVUxMICE9IHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEgKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcSk7CisgICAgICAgIHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEgPSBOVUxMOworICAgIH0KKworICAgIG1sbVNjYW5DbmYucmVzdWx0Q29kZSAgICAgICA9IHJldENvZGU7CisgICAgbWxtU2NhbkNuZi5zY2FuUmVzdWx0TGVuZ3RoID0gcE1hYy0+bGltLmdMaW1NbG1TY2FuUmVzdWx0TGVuZ3RoOworCisgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywgTElNX01MTV9TQ0FOX0NORiwgKHRBTklfVTMyICopICZtbG1TY2FuQ25mKTsKKworfSAvKioqIGxpbUNvbXBsZXRlTWxtU2NhbigpICoqKi8KKworLyoqCisgKiBcYnJpZWYgU2V0dXAgYW4gQS1NUERVL0JBIHNlc3Npb24KKyAqCisgKiBcc2EgbGltUHJvY2Vzc01sbUFkZEJBUmVxCisgKgorICogXHBhcmFtIHBNYWMgVGhlIGdsb2JhbCB0cEFuaVNpckdsb2JhbCBvYmplY3QKKyAqCisgKiBccGFyYW0gcE1zZ0J1ZiBUaGUgTUxNRSBBRERCQSBSZXEgbWVzc2FnZSBidWZmZXIKKyAqCisgKiBccmV0dXJuIG5vbmUKKyAqLwordm9pZCBsaW1Qcm9jZXNzTWxtQWRkQkFSZXEoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdEFOSV9VMzIgKnBNc2dCdWYgKQorewordFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7Cit0cExpbU1sbUFkZEJBUmVxIHBNbG1BZGRCQVJlcTsKK3RwTGltTWxtQWRkQkFDbmYgcE1sbUFkZEJBQ25mOworICB0cFBFU2Vzc2lvbiAgICAgcHNlc3Npb25FbnRyeTsKKyAgICAKKyAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICB7CisgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMXG4iKSk7KQorICAgICAgICAgICByZXR1cm47CisgIH0KKworICBwTWxtQWRkQkFSZXEgPSAodHBMaW1NbG1BZGRCQVJlcSkgcE1zZ0J1ZjsKKyAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwTWxtQWRkQkFSZXEtPnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JZFxuIikpOykKKyAgICAgIHJldHVybjsKKyAgfQorICAKKworICAvLyBTZW5kIEFEREJBIFJlcSBvdmVyIHRoZSBhaXIKKyAgc3RhdHVzID0gbGltU2VuZEFkZEJBUmVxKCBwTWFjLCBwTWxtQWRkQkFSZXEscHNlc3Npb25FbnRyeSk7CisKKyAgLy8KKyAgLy8gUmVzcG9uZCBpbW1lZGlhdGVseSB0byBMSU0sIG9ubHkgaWYgTUxNRSBoYXMgbm90IGJlZW4KKyAgLy8gc3VjY2Vzc2Z1bGx5IGFibGUgdG8gc2VuZCBXREFfQUREQkFfUkVRIHRvIEhBTC4KKyAgLy8gRWxzZSwgTElNX01MTV9BRERCQV9DTkYgd2lsbCBiZSBzZW50IGFmdGVyIHJlY2VpdmluZworICAvLyBBRERCQSBSc3AgZnJvbSBwZWVyIGVudGl0eQorICAvLworICBpZiggZVNJUl9TVUNDRVNTICE9IHN0YXR1cyApCisgIHsKKyAgICAvLyBBbGxvY2F0ZSBmb3IgTElNX01MTV9BRERCQV9DTkYKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJnBNbG1BZGRCQUNuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRMaW1NbG1BZGRCQUNuZiApKSkKKyAgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsCisgICAgICAgICAgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWRcbiIpKTsKKyAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBNc2dCdWYgKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcE1sbUFkZEJBQ25mLCBzaXplb2YoIHRMaW1NbG1BZGRCQUNuZiApKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAodm9pZCAqKSBwTWxtQWRkQkFDbmYtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICh2b2lkICopIHBNbG1BZGRCQVJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgc2l6ZW9mKCB0U2lyTWFjQWRkciApKTsKKworICAgICAgcE1sbUFkZEJBQ25mLT5iYURpYWxvZ1Rva2VuID0gcE1sbUFkZEJBUmVxLT5iYURpYWxvZ1Rva2VuOworICAgICAgcE1sbUFkZEJBQ25mLT5iYVRJRCA9IHBNbG1BZGRCQVJlcS0+YmFUSUQ7CisgICAgICBwTWxtQWRkQkFDbmYtPmJhUG9saWN5ID0gcE1sbUFkZEJBUmVxLT5iYVBvbGljeTsKKyAgICAgIHBNbG1BZGRCQUNuZi0+YmFCdWZmZXJTaXplID0gcE1sbUFkZEJBUmVxLT5iYUJ1ZmZlclNpemU7CisgICAgICBwTWxtQWRkQkFDbmYtPmJhVGltZW91dCA9IHBNbG1BZGRCQVJlcS0+YmFUaW1lb3V0OworICAgICAgcE1sbUFkZEJBQ25mLT5zZXNzaW9uSWQgPSBwTWxtQWRkQkFSZXEtPnNlc3Npb25JZDsKKworICAgICAgLy8gVXBkYXRlIHRoZSByZXN1bHQgY29kZQorICAgICAgcE1sbUFkZEJBQ25mLT5hZGRCQVJlc3VsdENvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisKKyAgICAgIGxpbVBvc3RTbWVNZXNzYWdlKCBwTWFjLAorICAgICAgICAgIExJTV9NTE1fQUREQkFfQ05GLAorICAgICAgICAgICh0QU5JX1UzMiAqKSBwTWxtQWRkQkFDbmYgKTsKKyAgICB9CisKKyAgICAvLyBSZXN0b3JlIE1MTUUgc3RhdGUKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVByZXZNbG1TdGF0ZTsKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKworICB9CisKKyAgLy8gRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBmb3IgdExpbU1sbUFkZEJBUmVxCisgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBNc2dCdWYgKTsKKworfQorCisvKioKKyAqIFxicmllZiBTZW5kIGFuIEFEREJBIFJzcCB0byBwZWVyIFNUQSBpbiByZXNwb25zZQorICogdG8gYW4gQUREQkEgUmVxIHJlY2VpdmVkIGVhcmxpZXIKKyAqCisgKiBcc2EgbGltUHJvY2Vzc01sbUFkZEJBUnNwCisgKgorICogXHBhcmFtIHBNYWMgVGhlIGdsb2JhbCB0cEFuaVNpckdsb2JhbCBvYmplY3QKKyAqCisgKiBccGFyYW0gcE1zZ0J1ZiBUaGUgTUxNRSBBRERCQSBSc3AgbWVzc2FnZSBidWZmZXIKKyAqCisgKiBccmV0dXJuIG5vbmUKKyAqLwordm9pZCBsaW1Qcm9jZXNzTWxtQWRkQkFSc3AoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdEFOSV9VMzIgKnBNc2dCdWYgKQorewordHBMaW1NbG1BZGRCQVJzcCBwTWxtQWRkQkFSc3A7CisgICB0QU5JX1UxNiBhaWQ7CisgICB0cERwaEhhc2hOb2RlIHBTdGE7CisgICB0cFBFU2Vzc2lvbiAgcHNlc3Npb25FbnRyeTsKKworICAgIAorICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTExcbiIpKTspCisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwTWxtQWRkQkFSc3AgPSAodHBMaW1NbG1BZGRCQVJzcCkgcE1zZ0J1ZjsKKworICAgIGlmKCggcHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBNbG1BZGRCQVJzcC0+c2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb24gSURcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgIAorCisgIC8vIFNlbmQgQUREQkEgUnNwIG92ZXIgdGhlIGFpcgorICBpZiggZVNJUl9TVUNDRVNTICE9IGxpbVNlbmRBZGRCQVJzcCggcE1hYyxwTWxtQWRkQkFSc3AscHNlc3Npb25FbnRyeSkpCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgRkwoIkZhaWxlZCB0byBzZW5kIEFEREJBIFJzcCB0byBwZWVyIFxuIikpOworICAgIGxpbVByaW50TWFjQWRkciggcE1hYywgcE1sbUFkZEJBUnNwLT5wZWVyTWFjQWRkciwgTE9HRSApOworICAgIC8qIENsZWFuIHRoZSBCQSBjb250ZXh0IG1haW50YWluZWQgYnkgSEFMIGFuZCBUTCBvbiBmYWlsdXJlICovCisgICAgcFN0YSA9IGRwaExvb2t1cEhhc2hFbnRyeSggcE1hYywgcE1sbUFkZEJBUnNwLT5wZWVyTWFjQWRkciwgJmFpZCwgCisgICAgICAgICAgICAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgIGlmKCBOVUxMICE9IHBTdGEgKQorICAgIHsKKyAgICAgICAgbGltUG9zdE1zZ0RlbEJBSW5kKCBwTWFjLCBwU3RhLCBwTWxtQWRkQkFSc3AtPmJhVElELCBlQkFfUkVDSVBJRU5ULCAKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisgIH0KKworICAvLyBUaW1lIHRvIHBvc3QgYSBXREFfREVMQkFfSU5EIHRvIEhBTCBpbiBvcmRlcgorICAvLyB0byBjbGVhbnVwIHRoZSBIQUwgYW5kIFNvZnRNQUMgZW50cmllcworCisKKyAgLy8gRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBmb3IgdExpbU1sbUFkZEJBUnNwCisgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBNc2dCdWYgKTsKKworfQorCisvKioKKyAqIFxicmllZiBTZXR1cCBhbiBBLU1QRFUvQkEgc2Vzc2lvbgorICoKKyAqIFxzYSBsaW1Qcm9jZXNzTWxtRGVsQkFSZXEKKyAqCisgKiBccGFyYW0gcE1hYyBUaGUgZ2xvYmFsIHRwQW5pU2lyR2xvYmFsIG9iamVjdAorICoKKyAqIFxwYXJhbSBwTXNnQnVmIFRoZSBNTE1FIERFTEJBIFJlcSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIFxyZXR1cm4gbm9uZQorICovCit2b2lkIGxpbVByb2Nlc3NNbG1EZWxCQVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0QU5JX1UzMiAqcE1zZ0J1ZiApCit7CisgICAgdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisgICAgdHBMaW1NbG1EZWxCQVJlcSBwTWxtRGVsQkFSZXE7CisgICAgdHBMaW1NbG1EZWxCQUNuZiBwTWxtRGVsQkFDbmY7CisgICAgdHBQRVNlc3Npb24gIHBzZXNzaW9uRW50cnk7CisgIAorICAgIAorICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTExcbiIpKTspCisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLy8gVE9ETyAtIE5lZWQgdG8gdmFsaWRhdGUgTUxNRSBzdGF0ZQorICAgIHBNbG1EZWxCQVJlcSA9ICh0cExpbU1sbURlbEJBUmVxKSBwTXNnQnVmOworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwTWxtRGVsQkFSZXEtPnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gYnNzSWRcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLy8gU2VuZCBERUxCQSBJbmQgb3ZlciB0aGUgYWlyCisgIGlmKCBlU0lSX1NVQ0NFU1MgIT0KKyAgICAgIChzdGF0dXMgPSBsaW1TZW5kRGVsQkFJbmQoIHBNYWMsIHBNbG1EZWxCQVJlcSxwc2Vzc2lvbkVudHJ5KSkpCisgICAgc3RhdHVzID0gZVNJUl9TTUVfSEFMX1NFTkRfTUVTU0FHRV9GQUlMOworICBlbHNlCisgIHsKKyAgICB0QU5JX1UxNiBhaWQ7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhOworCisgICAgLy8gVGltZSB0byBwb3N0IGEgV0RBX0RFTEJBX0lORCB0byBIQUwgaW4gb3JkZXIKKyAgICAvLyB0byBjbGVhbnVwIHRoZSBIQUwgYW5kIFNvZnRNQUMgZW50cmllcworICAgIHBTdGEgPSBkcGhMb29rdXBIYXNoRW50cnkoIHBNYWMsIHBNbG1EZWxCQVJlcS0+cGVlck1hY0FkZHIsICZhaWQgLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgaWYoIE5VTEwgIT0gcFN0YSApCisgICAgeworICAgICAgICBzdGF0dXMgPSBsaW1Qb3N0TXNnRGVsQkFJbmQoIHBNYWMsCisgICAgICAgICBwU3RhLAorICAgICAgICAgIHBNbG1EZWxCQVJlcS0+YmFUSUQsCisgICAgICAgICAgcE1sbURlbEJBUmVxLT5iYURpcmVjdGlvbixwc2Vzc2lvbkVudHJ5KTsKKworICAgIH0KKyAgfQorCisgIC8vCisgIC8vIFJlc3BvbmQgaW1tZWRpYXRlbHkgdG8gU01FIHdpdGggREVMQkEgQ05GIHVzaW5nCisgIC8vIExJTV9NTE1fREVMQkFfQ05GIHdpdGggYXBwcm9wcmlhdGUgc3RhdHVzCisgIC8vCisKKyAgLy8gQWxsb2NhdGUgZm9yIExJTV9NTE1fREVMQkFfQ05GCisgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJnBNbG1EZWxCQUNuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0TGltTWxtRGVsQkFDbmYgKSkpCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWRcbiIpKTsKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTXNnQnVmICk7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UKKyAgeworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBNbG1EZWxCQUNuZiwgc2l6ZW9mKCB0TGltTWxtRGVsQkFDbmYgKSk7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAodm9pZCAqKSBwTWxtRGVsQkFDbmYsCisgICAgICAgICh2b2lkICopIHBNbG1EZWxCQVJlcSwKKyAgICAgICAgc2l6ZW9mKCB0TGltTWxtRGVsQkFSZXEgKSk7CisKKyAgICAvLyBVcGRhdGUgREVMQkEgcmVzdWx0IGNvZGUKKyAgICBwTWxtRGVsQkFDbmYtPmRlbEJBUmVhc29uQ29kZSA9IHBNbG1EZWxCQVJlcS0+ZGVsQkFSZWFzb25Db2RlOworICAgIAorICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkKi8KKyAgICBwTWxtRGVsQkFDbmYtPnNlc3Npb25JZCA9IHBNbG1EZWxCQVJlcS0+c2Vzc2lvbklkOworCisgICAgbGltUG9zdFNtZU1lc3NhZ2UoIHBNYWMsCisgICAgICAgIExJTV9NTE1fREVMQkFfQ05GLAorICAgICAgICAodEFOSV9VMzIgKikgcE1sbURlbEJBQ25mICk7CisgIH0KKworICAvLyBGcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGZvciB0TGltTWxtRGVsQkFSZXEKKyAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcE1zZ0J1ZiApOworCit9CisKKy8qKgorICogQGZ1bmN0aW9uIDogIGxpbVNNUG93ZXJTYXZlU3RhdGVJbmQoICkKKyAqCisgKiBAYnJpZWYgIDogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiByZWNlaXZpbmcgdGhlIFBNQyBJbmRpY2F0aW9uIHRvIHVwZGF0ZSB0aGUgU1RBJ3MgTWltb1BzIFN0YXRlLgorICoKKyAqICAgICAgTE9HSUM6CisgKgorICogICAgICBBU1NVTVBUSU9OUzoKKyAqICAgICAgICAgIE5BCisgKgorICogICAgICBOT1RFOgorICogICAgICAgICAgTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGxpbU1zZyAtIExpbSBNZXNzYWdlIHN0cnVjdHVyZSBvYmplY3Qgd2l0aCB0aGUgTWltb1BTcGFyYW0gaW4gYm9keQorICogQHJldHVybiBOb25lCisgKi8KKyAKK3RTaXJSZXRTdGF0dXMKK2xpbVNNUG93ZXJTYXZlU3RhdGVJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIHN0YXRlKQoreworI2lmIDAKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgICAgICByZXRTdGF0dXMgPSBlU0lSX1NVQ0NFU1M7ICAKKyNpZiAwCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICBjZmdWYWwxOyAgICAgICAgICAKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICBjZmdWYWwyOyAgICAgICAgICAgICAgICAgCisgICAgdFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gKnBIVENhcGFiaWxpdHlJbmZvOyAgICAgICAgIAorICAgIHRwRHBoSGFzaE5vZGUgcFN0YSA9IE5VTEw7CisKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ICA9ICZwTWFjLT5saW0uZ3BTZXNzaW9uWzBdOyAvL1RCRC1SQUpFU0ggSE9XIFRPIEdFVCBzZXNzaW9uRW50cnk/Pz8/PworICAgIC8qKiBWZXJpZnkgdGhlIE1vZGUgb2Ygb3BlcmF0aW9uICovICAgIAorICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgIT0gZVNZU1RFTV9TVEFfUk9MRSkgeyAgCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkdvdCBQTUMgaW5kaWNhdGlvbiB3aGVuIFN5c3RlbSBub3QgaW4gdGhlIFNUQSBSb2xlXG4iKSk7KSAgICAgICAKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsgICAgICAgCisgICAgfSAgICAgIAorCisgICAgaWYgKChwTWFjLT5saW0uZ0hUTUlNT1BTU3RhdGUgPT0gc3RhdGUpIHx8IChzdGF0ZSA9PSBlU0lSX0hUX01JTU9fUFNfTkEgKSkgeyAKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiR290IEluZGljYXRpb24gd2hlbiBhbHJlYWR5IGluIHRoZSBzYW1lIG1vZGUgb3IgU3RhdGUgcGFzc2VkIGlzIE5BOiVkIFxuIiksICBzdGF0ZSk7KSAgICAgIAorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAgIAorICAgIH0gICAgIAorCisgICAgaWYgKCFwTWFjLT5saW0uaHRDYXBhYmlsaXR5KXsgICAgICAgIAorICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCIgTm90IGluIDExbiBvciBIVCBjYXBhYmxlIG1vZGVcbiIpKTspICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsgICAKKyAgICB9ICAgICAgICAKKworICAgIC8qKiBVcGRhdGUgdGhlIENGRyBhYm91dCB0aGUgZGVmYXVsdCBNaW1vUFMgU3RhdGUgKi8KKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IVF9DQVBfSU5GTywgJmNmZ1ZhbDEpICE9IGVTSVJfU1VDQ0VTUykgeyAgCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBIVCBDYXAgQ0ZHIFxuIikpOyAgICAKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7ICAgICAKKyAgICB9ICAgICAgICAgIAorCisgICAgY2ZnVmFsMiA9ICh0QU5JX1UxNiljZmdWYWwxOyAgICAgICAgICAgIAorICAgIHBIVENhcGFiaWxpdHlJbmZvID0gKHRTaXJNYWNIVENhcGFiaWxpdHlJbmZvICopICZjZmdWYWwyOyAgICAgICAgICAKKyAgICBwSFRDYXBhYmlsaXR5SW5mby0+bWltb1Bvd2VyU2F2ZSA9IHN0YXRlOworCisgICAgaWYoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfSFRfQ0FQX0lORk8sICoodEFOSV9VMTYqKXBIVENhcGFiaWxpdHlJbmZvKSAhPSBlU0lSX1NVQ0NFU1MpIHsgICAKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgdXBkYXRlIEhUIENhcCBJbmZvIENGR1xuIikpOyAgICAgICAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIiBUaGUgSFQgQ2FwYWJpbGl0eSBmb3IgTWltbyBQd3IgaXMgdXBkYXRlZCB0byBTdGF0ZTogJXUgIFxuIiksc3RhdGUpOykgIAorICAgIGlmIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlICE9IGVMSU1fU01FX0xJTktfRVNUX1NUQVRFKSB7IAorICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsRkwoIiBUaGUgU1RBIGlzIG5vdCBpbiB0aGUgQ29ubmVjdGVkL0xpbmsgRXN0IFNtZV9TdGF0ZTogJWQgIFxuIiksIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpOykgICAgICAgICAgCisgICAgICAgIC8qKiBVcGRhdGUgaW4gdGhlIExJTSB0aGUgTUlNTyBQUyBzdGF0ZSBvZiB0aGUgU0VMRiAqLyAgIAorICAgICAgICBwTWFjLT5saW0uZ0hUTUlNT1BTU3RhdGUgPSBzdGF0ZTsgICAgICAgICAgCisgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7ICAgIAorICAgIH0gICAgICAgICAgICAgIAorCisgICAgcFN0YSA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOyAgICAKKyAgICBpZiAoIXBTdGEtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5KSB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSxGTCggImxpbVNlbmRTTVBvd2VyU3RhdGU6IFBlZXIgaXMgbm90IEhUIENhcGFibGUgXG4iICkpOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgICAgCisgICAgaWYgKGlzRW50ZXJpbmdNaW1vUFMocE1hYy0+bGltLmdIVE1JTU9QU1N0YXRlLCBzdGF0ZSkpIHsgICAgCisgICAgICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgIG1hY0FkZHI7ICAgICAgCisgICAgICAgIC8qKiBPYnRhaW4gdGhlIEFQJ3MgTWFjIEFkZHJlc3MgKi8gICAgCisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYyAtPmhIZGQsICh0QU5JX1U4ICopbWFjQWRkciwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOyAKKyAgICAgICAgLyoqIFNlbmQgQWN0aW9uIEZyYW1lIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbW9kZSAqLyAgICAgICAKKyAgICAgICAgcmV0U3RhdHVzID0gbGltU2VuZFNNUG93ZXJTdGF0ZUZyYW1lKHBNYWMsIG1hY0FkZHIsIHN0YXRlKTsgICAgICAgCisgICAgICAgIGlmIChyZXRTdGF0dXMgIT0gZVNJUl9TVUNDRVNTKSB7ICAgICAgICAgCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICJVcGRhdGUgU00gUE9XRVI6IFNlbmRpbmcgQWN0aW9uIEZyYW1lIGhhcyBmYWlsZWRcbiIpOykgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIHJldFN0YXR1czsgICAgICAgICAKKyAgICAgICAgfSAgIAorICAgIH0gICAgCisKKyAgICAvKiogVXBkYXRlIE1sbVN0YXRlIGFib3V0IHRoZSBTZXRNaW1vUFMgU3RhdGUgKi8KKyAgICBwTWFjLT5saW0uZ0xpbVByZXZNbG1TdGF0ZSA9IHBNYWMtPmxpbS5nTGltTWxtU3RhdGU7CisgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX1NFVF9NSU1PUFNfU1RBVEU7CisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKyAgICAvKiogVXBkYXRlIHRoZSBIQUwgYW5kIHMvdyBtYWMgYWJvdXQgdGhlIG1vZGUgdG8gYmUgc2V0ICovICAgIAorICAgIHJldFN0YXR1cyA9IGxpbVBvc3RTTVN0YXRlVXBkYXRlKCBwTWFjLHBzZXNzaW9uRW50cnktPnN0YUlkLCBzdGF0ZSk7ICAgICAKKworICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgIiBVcGRhdGVkIHRoZSBOZXcgU01QUyBTdGF0ZSIpOykKKyAgICAvKiogVXBkYXRlIGluIHRoZSBMSU0gdGhlIE1JTU8gUFMgc3RhdGUgb2YgdGhlIFNFTEYgKi8gICAKKyAgICBwTWFjLT5saW0uZ0hUTUlNT1BTU3RhdGUgPSBzdGF0ZTsgICAgICAgICAgCisjZW5kaWYKKyAgICByZXR1cm4gcmV0U3RhdHVzOworI2VuZGlmCityZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit2b2lkIAorbGltU2V0Q2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiB0aXRhbkh0Y2FwLCB0QU5JX1U4IGNoYW5uZWwsIHRQb3dlcmRCbSBtYXhUeFBvd2VyLCB0QU5JX1U4IHBlU2Vzc2lvbklkKQoreworI2lmICFkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICB0QU5JX1UzMiBsb2NhbFB3ckNvbnN0cmFpbnQ7CisjZW5kaWYKKworICAgIC8vIFNldHVwIHRoZSBDQiBTdGF0ZSBhcHByb3ByaWF0ZWx5LCBwcmlvciB0bworICAgIC8vIGlzc3VpbmcgYSBkcGhDaGFubmVsQ2hhbmdlKCkuIFRoaXMgaXMgZG9uZQorICAgIC8vIHNvIHRoYXQgaWYgQ0IgaXMgZW5hYmxlZCwgdGhlIENCIFNlY29uZGFyeQorICAgIC8vIENoYW5uZWwgaXMgc2V0dXAgY29ycmVjdGx5CisgICAgCisgICAgIC8qIGlmIGxvY2FsIENCIGFkbWluIHN0YXRlIGlzIG9mZiBvciBqb2luIHJlcSBDQiBhZG1pbiBzdGF0ZSBpcyBvZmYsIGRvbid0IGJvdGhlciB3aXRoIENCIGNoYW5uZWwgc2V0dXAgKi8KKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJCZWZvcmUgOiBnQ2JTdGF0ZSA9IDB4JXgsIGdDYm1vZGUgPSAleFxuIiksIHBNYWMtPmxpbS5nQ2JTdGF0ZSwgcE1hYy0+bGltLmdDYk1vZGUpOykKKyAgICBpZihHRVRfQ0JfQURNSU5fU1RBVEUocE1hYy0+bGltLmdDYlN0YXRlKSAmJgorICAgICAgICAgICAgICAgICAgICBTTUVfR0VUX0NCX0FETUlOX1NUQVRFKHRpdGFuSHRjYXApKSB7CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoInN0YXRpb24gZG9pbmcgY2hhbm5lbCBib25kaW5nXG4iKSk7KQorICAgICAgICBzZXR1cENCU3RhdGUoIHBNYWMsICh0QW5pQ0JTZWNvbmRhcnlNb2RlKVNNRV9HRVRfQ0JfT1BFUl9TVEFURSh0aXRhbkh0Y2FwKSk7CisgICAgfWVsc2UgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJzdGF0aW9uIG5vdCBkb2luZyBjaGFubmVsIGJvbmRpbmdcbiIpKTspCisgICAgICAgIHNldHVwQ0JTdGF0ZShwTWFjLCBlQU5JX0NCX1NFQ09OREFSWV9OT05FKTsKKyAgICB9CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJBZnRlciA6Z0NiU3RhdGUgPSAweCV4LCBnQ2Jtb2RlID0gJXhcbiIpLCBwTWFjLT5saW0uZ0NiU3RhdGUsIHBNYWMtPmxpbS5nQ2JNb2RlKTspCisKKyAgICAjaWYgMAorICAgIGlmICh3bGFuX2NmZ1NldEludChwTWFjLCBXTklfQ0ZHX0NVUlJFTlRfQ0hBTk5FTCwgY2hhbm5lbCkgIT0gZVNJUl9TVUNDRVNTKSB7CisgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHNldCBDVVJSRU5UX0NIQU5ORUwgYXQgQ0ZHXG4iKSk7CisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgI2VuZGlmIC8vIFRPIFNVUFBPUlQgQlQtQU1QCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkgIAorICAgIGxpbVNlbmRTd2l0Y2hDaG5sUGFyYW1zKCBwTWFjLCBjaGFubmVsLCBsaW1HZXRQaHlDQlN0YXRlKCBwTWFjICksIG1heFR4UG93ZXIsIHBlU2Vzc2lvbklkKTsKKyNlbHNlCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCwgJmxvY2FsUHdyQ29uc3RyYWludCkgIT0gZVNJUl9TVUNDRVNTKSB7CisgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJlYWQgV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5UIGZyb20gQ0ZHXG4iKSk7CisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gU2VuZCBXREFfQ0hOTF9TV0lUQ0hfSU5EIHRvIEhBTAorICAgIGxpbVNlbmRTd2l0Y2hDaG5sUGFyYW1zKCBwTWFjLCBjaGFubmVsLCBsaW1HZXRQaHlDQlN0YXRlKCBwTWFjICksICh0UG93ZXJkQm0pbG9jYWxQd3JDb25zdHJhaW50LCBwZVNlc3Npb25JZCk7CisjZW5kaWYKKyAgIAorIH0KKworCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NNbG1Sc3BNZXNzYWdlcy5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzTWxtUnNwTWVzc2FnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQzYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzTWxtUnNwTWVzc2FnZXMuYwpAQCAtMCwwICsxLDQ5OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1Qcm9jZXNzTWxtUnNwTWVzc2FnZXMuY2MgY29udGFpbnMgdGhlIGNvZGUKKyAqIGZvciBwcm9jZXNzaW5nIHJlc3BvbnNlIG1lc3NhZ2VzIGZyb20gTUxNIHN0YXRlIG1hY2hpbmUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaW5jbHVkZSAid25pQXBpLmgiCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisjZWxzZQorI2luY2x1ZGUgInduaUNmZ1N0YS5oIgorI2VuZGlmCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbUFzc29jVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZWN1cml0eVV0aWxzLmgiCisjaW5jbHVkZSAibGltU2VyRGVzVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1UaW1lclV0aWxzLmgiCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisjaW5jbHVkZSAibGltQWRtaXRDb250cm9sLmgiCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisjaW5jbHVkZSAibGltSWJzc1BlZXJNZ210LmgiCisjaW5jbHVkZSAibGltU2Vzc2lvbi5oIgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybUFwaS5oIgorI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2luY2x1ZGUgPGxpbUZULmg+CisjZW5kaWYKKworc3RhdGljIHZvaWQgbGltSGFuZGxlU21lSm9pblJlc3VsdCh0cEFuaVNpckdsb2JhbCwgdFNpclJlc3VsdENvZGVzLCB0QU5JX1UxNix0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbVByb2Nlc3NNbG1TY2FuQ25mKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3ZvaWQgbGltUHJvY2Vzc01sbUpvaW5DbmYodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOwordm9pZCBsaW1Qcm9jZXNzTWxtQXV0aENuZih0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7Cit2b2lkIGxpbVByb2Nlc3NNbG1TdGFydENuZih0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7Cit2b2lkIGxpbVByb2Nlc3NNbG1BdXRoSW5kKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3ZvaWQgbGltUHJvY2Vzc01sbUFzc29jSW5kKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3ZvaWQgbGltUHJvY2Vzc01sbUFzc29jQ25mKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3ZvaWQgbGltUHJvY2Vzc01sbVJlYXNzb2NDbmYodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOwordm9pZCBsaW1Qcm9jZXNzTWxtUmVhc3NvY0luZCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7Cit2b2lkIGxpbVByb2Nlc3NNbG1TZXRLZXlzQ25mKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3ZvaWQgbGltUHJvY2Vzc01sbURpc2Fzc29jSW5kKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3ZvaWQgbGltUHJvY2Vzc01sbURpc2Fzc29jQ25mKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3ZvaWQgbGltUHJvY2Vzc01sbURlYXV0aEluZCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7Cit2b2lkIGxpbVByb2Nlc3NNbG1EZWF1dGhDbmYodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOwordm9pZCBsaW1Qcm9jZXNzTWxtUHVyZ2VTdGFJbmQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOwordm9pZCBsaW1Qcm9jZXNzTWxtQWRkQkFDbmYodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOwordm9pZCBsaW1Qcm9jZXNzTWxtRGVsQkFDbmYodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOwordm9pZCBsaW1Qcm9jZXNzTWxtUmVtb3ZlS2V5Q25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICogcE1zZ0J1Zik7CitzdGF0aWMgdm9pZCAgbGltSGFuZGxlRGVsQnNzSW5SZUFzc29jQ29udGV4dCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGFEcyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltR2V0U2Vzc2lvbkluZm8odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqLCB0QU5JX1U4ICosIHRBTklfVTE2ICopOworc3RhdGljIHZvaWQKK2xpbVByb2Nlc3NCdGFtcEFkZEJzc1JzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworLyoqCisgKiBsaW1Qcm9jZXNzTWxtUnNwTWVzc2FnZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzZXMgdmFyaW91cyBNTE0gcmVzcG9uc2UgKENORi9JTkQKKyAqIG1lc3NhZ2VzIGZyb20gTUxNIFN0YXRlIG1hY2hpbmUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIG1zZ1R5cGUgICBJbmRpY2F0ZXMgdGhlIE1MTSBtZXNzYWdlIHR5cGUKKyAqIEBwYXJhbSAgKnBNc2dCdWYgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVByb2Nlc3NNbG1Sc3BNZXNzYWdlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBtc2dUeXBlLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKworICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKG1zZ1R5cGUpCisgICAgeworICAgICAgICBjYXNlIExJTV9NTE1fU0NBTl9DTkY6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtU2NhbkNuZihwTWFjLCBwTXNnQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBMSU1fTUxNX0FVVEhfQ05GOgorICAgICAgICAgICAgbGltUHJvY2Vzc01sbUF1dGhDbmYocE1hYywgcE1zZ0J1Zik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSU1fTUxNX0FVVEhfSU5EOgorICAgICAgICAgICAgbGltUHJvY2Vzc01sbUF1dGhJbmQocE1hYywgcE1zZ0J1Zik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSU1fTUxNX0FTU09DX0NORjoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NNbG1Bc3NvY0NuZihwTWFjLCBwTXNnQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExJTV9NTE1fU1RBUlRfQ05GOgorICAgICAgICAgICAgbGltUHJvY2Vzc01sbVN0YXJ0Q25mKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9KT0lOX0NORjoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NNbG1Kb2luQ25mKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9BU1NPQ19JTkQ6CisgICAgICAgICAgICAgbGltUHJvY2Vzc01sbUFzc29jSW5kKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9SRUFTU09DX0NORjoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NNbG1SZWFzc29jQ25mKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9SRUFTU09DX0lORDoKKyAgICAgICAgICAgbGltUHJvY2Vzc01sbVJlYXNzb2NJbmQocE1hYywgcE1zZ0J1Zik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExJTV9NTE1fRElTQVNTT0NfQ05GOgorICAgICAgICAgICAgbGltUHJvY2Vzc01sbURpc2Fzc29jQ25mKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9ESVNBU1NPQ19JTkQ6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtRGlzYXNzb2NJbmQocE1hYywgcE1zZ0J1Zik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSU1fTUxNX1BVUkdFX1NUQV9JTkQ6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtUHVyZ2VTdGFJbmQocE1hYywgcE1zZ0J1Zik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSU1fTUxNX0RFQVVUSF9DTkY6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtRGVhdXRoQ25mKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX01MTV9ERUFVVEhfSU5EOgorICAgICAgICAgICAgbGltUHJvY2Vzc01sbURlYXV0aEluZChwTWFjLCBwTXNnQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExJTV9NTE1fU0VUS0VZU19DTkY6CisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtU2V0S2V5c0NuZihwTWFjLCBwTXNnQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExJTV9NTE1fUkVNT1ZFS0VZX0NORjoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NNbG1SZW1vdmVLZXlDbmYocE1hYywgcE1zZ0J1Zik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSU1fTUxNX1RTUEVDX0NORjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExJTV9NTE1fQUREQkFfQ05GOgorICAgICAgICAgICAgbGltUHJvY2Vzc01sbUFkZEJBQ25mKCBwTWFjLCBwTXNnQnVmICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSU1fTUxNX0RFTEJBX0NORjoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NNbG1EZWxCQUNuZiggcE1hYywgcE1zZ0J1ZiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9IC8vIHN3aXRjaCAobXNnVHlwZSkKKyAgICByZXR1cm47Cit9IC8qKiogZW5kIGxpbVByb2Nlc3NNbG1Sc3BNZXNzYWdlcygpICoqKi8KKworLyoqCisgKiBsaW1Qcm9jZXNzTWxtU2NhbkNuZigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fU0NBTl9DTkYKKyAqIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnQnVmICAgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVByb2Nlc3NNbG1TY2FuQ25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHN3aXRjaChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBlTElNX1NNRV9XVF9TQ0FOX1NUQVRFOgorICAgICAgICAvL2Nhc2UgZUxJTV9TTUVfTElOS19FU1RfV1RfU0NBTl9TVEFURTogIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICAgICAgLy9jYXNlIGVMSU1fU01FX05PUk1BTF9DSEFOTkVMX1NDQU5fU1RBVEU6ICAgLy9UTyBTVVBQT1JUIEJULUFNUAorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9IHBNYWMtPmxpbS5nTGltUHJldlNtZVN0YXRlOworICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVN5c3RlbUluU2NhbkxlYXJuTW9kZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHNjYW4gY29uZmlybQorICAgICAgICAgICAgICogZnJvbSBNTE0gaW4gb3RoZXIgc3RhdGVzLgorICAgICAgICAgICAgICogTG9nIGVycm9yCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIE1MTV9TQ0FOX0NORiBpbiBzdGF0ZSAlWFxuIiksCisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTspCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8vIFByb2Nlc3MgcmVjZWl2ZWQgc2NhbiBjb25maXJtCisgICAgLy8vIEluY3JlbWVudCBsZW5ndGggb2YgY2FjaGVkIHNjYW4gcmVzdWx0cworICAgIHBNYWMtPmxpbS5nTGltU21lU2NhblJlc3VsdExlbmd0aCArPQorICAgICAgICAgICAgICAgICAgICAoKHRMaW1NbG1TY2FuQ25mICopIHBNc2dCdWYpLT5zY2FuUmVzdWx0TGVuZ3RoOworICAgIGlmICgocE1hYy0+bGltLmdMaW1Sc3BSZXFkKSB8fCBwTWFjLT5saW0uZ0xpbVJlcG9ydEJhY2tncm91bmRTY2FuUmVzdWx0cykKKyAgICB7CisgICAgICAgIHRBTklfVTE2ICAgIHNjYW5Sc3BMZW4gPSAwOworICAgICAgICAvLy8gTmVlZCB0byBzZW5kIHJlc3BvbnNlIHRvIEhvc3QKKyAgICAgICAgcE1hYy0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisgICAgICAgIGlmICgoKCh0TGltTWxtU2NhbkNuZiAqKSBwTXNnQnVmKS0+cmVzdWx0Q29kZSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TTUVfU1VDQ0VTUykgfHwKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU21lU2NhblJlc3VsdExlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzY2FuUnNwTGVuID0gc2l6ZW9mKHRTaXJTbWVTY2FuUnNwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVNjYW5SZXN1bHRMZW5ndGggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJCc3NEZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzY2FuUnNwTGVuID0gc2l6ZW9mKHRTaXJTbWVTY2FuUnNwKTsKKyAgICAgICAgfQorICAgICAgIGlmKHBNYWMtPmxpbS5nTGltUmVwb3J0QmFja2dyb3VuZFNjYW5SZXN1bHRzKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuVGVybWluYXRlID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1TbWVTY2FuUmVzdWx0TGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbVNlbmRTbWVTY2FuUnNwKHBNYWMsIHNjYW5Sc3BMZW4sIGVTSVJfU01FX1NVQ0NFU1MsIHBNYWMtPmxpbS5nU21lU2Vzc2lvbklkLCBwTWFjLT5saW0uZ1RyYW5zYWN0aW9uSWQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGltU2VuZFNtZVNjYW5Sc3AocE1hYywgc2NhblJzcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX1NVQ0NFU1MscE1hYy0+bGltLmdTbWVTZXNzaW9uSWQsIHBNYWMtPmxpbS5nVHJhbnNhY3Rpb25JZCk7CisgICAgICAgIH0KKyAgICB9IC8vIGlmIChwTWFjLT5saW0uZ0xpbVJzcFJlcWQpCisgICAgLy9jaGVjayB0byBzZWUgd2hldGhlciB3ZSBuZWVkIHRvIHJ1biBiZ1NjYW4gdGltZXIKKyAgICBpZihwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuVGVybWluYXRlID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKAorICAgICAgICAgICAgJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUJhY2tncm91bmRTY2FuVGltZXIpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgYWN0aXZhdGUgYmFja2dyb3VuZCBzY2FuIHRpbWVyLgorICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgYWN0aXZhdGUgYmFja2dyb3VuZCBzY2FuIHRpbWVyXG4iKSk7CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuU3RhcnRlZCA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhblN0YXJ0ZWQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorfSAvKioqIGVuZCBsaW1Qcm9jZXNzTWxtU2NhbkNuZigpICoqKi8KKworCisvKioKKyAqIGxpbVByb2Nlc3NNbG1TdGFydENuZigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fU1RBUlRfQ05GCisgKiBtZXNzYWdlIGZyb20gTUxNIFN0YXRlIG1hY2hpbmUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcE1zZ0J1ZiAgICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1Qcm9jZXNzTWxtU3RhcnRDbmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdHBQRVNlc3Npb24gICAgICAgICBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKyAgICB0TGltTWxtU3RhcnRDbmYgICAgICpwTGltTWxtU3RhcnRDbmY7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzbWVzZXNzaW9uSWQ7CisgICAgdEFOSV9VMTYgICAgICAgICAgICBzbWV0cmFuc2FjdGlvbklkOworCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwTGltTWxtU3RhcnRDbmYgPSAodExpbU1sbVN0YXJ0Q25mKilwTXNnQnVmOworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMscExpbU1sbVN0YXJ0Q25mLT5zZXNzaW9uSWQpKT09TlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgiU2Vzc2lvbiBkb2VzIE5vdCBleGlzdCB3aXRoIGdpdmVuIHNlc3Npb25JZCBcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICBzbWVzZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisgICBzbWV0cmFuc2FjdGlvbklkID0gcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZDsKKworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9XVF9TVEFSVF9CU1NfU1RBVEUpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIFN0YXJ0IGNvbmZpcm0gZnJvbSBNTE0KKyAgICAgICAgICogaW4gb3RoZXIgc3RhdGVzLgorICAgICAgICAgKiBMb2cgZXJyb3IKKyAgICAgICAgICovCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgTUxNX1NUQVJUX0NORiBpbiBzdGF0ZSAlWFxuIiksCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCgodExpbU1sbVN0YXJ0Q25mICopIHBNc2dCdWYpLT5yZXN1bHRDb2RlID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX1NVQ0NFU1MpCisgICAgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVcGRhdGUgZ2xvYmFsIFNNRSBzdGF0ZSBzbyB0aGF0IEJlYWNvbiBHZW5lcmF0aW9uCisgICAgICAgICAqIG1vZHVsZSBzdGFydHMgd3JpdGluZyBCZWFjb24gZnJhbWVzIGludG8gVEZQJ3MKKyAgICAgICAgICogQmVhY29uIGZpbGUgcmVnaXN0ZXIuCisgICAgICAgICAqLworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX05PUk1BTF9TVEFURTsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9TVEFfTU9ERSkKKyAgICAgICAgeworICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiKioqIFN0YXJ0ZWQgQlNTIGluIEJUX0FNUCBTVEEgU0lERSoqKlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYocHNlc3Npb25FbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX0FQX01PREUpCisgICAgICAgIHsKKyAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIioqKiBTdGFydGVkIEJTUyBpbiBCVF9BTVAgQVAgU0lERSoqKlxuIikpOworICAgICAgICB9CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBlbHNlIGlmKHBzZXNzaW9uRW50cnktPmJzc1R5cGUgPT0gZVNJUl9JTkZSQV9BUF9NT0RFKQorICAgICAgICB7CisgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCIqKiogU3RhcnRlZCBCU1MgaW4gSU5GUkEgQVAgU0lERSoqKlxuIikpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiKioqIFN0YXJ0ZWQgQlNTICoqKlxuIikpOykKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8vIFN0YXJ0IEJTUyBpcyBhIGZhaWx1cmUKKyAgICAgICAgcGVEZWxldGVTZXNzaW9uKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgIHBzZXNzaW9uRW50cnkgPSBOVUxMOworICAgIH0KKyAgICAvLy8gU2VuZCByZXNwb25zZSB0byBIb3N0CisgICAgbGltU2VuZFNtZVN0YXJ0QnNzUnNwKHBNYWMsIGVXTklfU01FX1NUQVJUX0JTU19SU1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICgodExpbU1sbVN0YXJ0Q25mICopIHBNc2dCdWYpLT5yZXN1bHRDb2RlLHBzZXNzaW9uRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZXNlc3Npb25JZCxzbWV0cmFuc2FjdGlvbklkKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYgKCgodExpbU1sbVN0YXJ0Q25mICopIHBNc2dCdWYpLT5yZXN1bHRDb2RlID09IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvL0NvbmZpZ3VyZSBiZWFjb24gYW5kIHNlbmQgYmVhY29ucyB0byBIQUwKKyAgICAgICAgbGltU2VuZEJlYWNvbkluZChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisjZW5kaWYKK30KKworIC8qKiogZW5kIGxpbVByb2Nlc3NNbG1TdGFydENuZigpICoqKi8KKworLyoqCisgKiBsaW1Qcm9jZXNzTWxtSm9pbkNuZigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fSk9JTl9DTkYKKyAqIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnQnVmICAgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVByb2Nlc3NNbG1Kb2luQ25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlOworICAgIHRMaW1NbG1Kb2luQ25mICAgICAgKnBMaW1NbG1Kb2luQ25mOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgcHNlc3Npb25FbnRyeTsKKyAgICAgcExpbU1sbUpvaW5DbmYgPSAodExpbU1sbUpvaW5DbmYqKXBNc2dCdWY7CisgICAgaWYoIChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMscExpbU1sbUpvaW5DbmYtPnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgiU2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlIT0gZUxJTV9TTUVfV1RfSk9JTl9TVEFURSkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIE1MTV9KT0lOX0NORiBpbiBzdGF0ZSAlWFxuIiksCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSk7KQorICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJlc3VsdENvZGUgPSAoKHRMaW1NbG1Kb2luQ25mICopIHBNc2dCdWYpLT5yZXN1bHRDb2RlIDsKKyAgICAvLy8gUHJvY2VzcyBKb2luIGNvbmZpcm0gZnJvbSBNTE0KKyAgICBpZiAocmVzdWx0Q29kZSA9PSAgZVNJUl9TTUVfU1VDQ0VTUykKKyAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCIqKiogSm9pbmVkIEVTUyAqKipcbiIpKTspCisgICAgICAgICAgICAvL1NldHVwIGhhcmR3YXJlIHVwZnJvbnQKKyAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiKioqIFN0YXJ0aW5nIHRvIGFkZCBCU1MqKipcbiIpKTspICAvL3JlbW92ZSBtZQorICAgICAgICAgICAvL0RvbmU6IDctMjctMjAwOS4gSklNX0ZJWF9NRSAgIHNlc3Npb25pemUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbgorICAgICAgICAgICAgaWYobGltU3RhU2VuZEFkZEJzc1ByZUFzc29jKCBwTWFjLCBmYWxzZSwgcHNlc3Npb25FbnRyeSkgPT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKyAgICB9CisgICAgeworICAgICAgICAvLy8gSm9pbiBmYWlsdXJlCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSk7CisgICAgICAgIC8vLyBTZW5kIEpvaW4gcmVzcG9uc2UgdG8gSG9zdAorICAgICAgICBsaW1IYW5kbGVTbWVKb2luUmVzdWx0KHBNYWMsIHJlc3VsdENvZGUsICgodExpbU1sbUpvaW5DbmYgKikgcE1zZ0J1ZiktPnByb3RTdGF0dXNDb2RlLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgfQorfSAvKioqIGVuZCBsaW1Qcm9jZXNzTWxtSm9pbkNuZigpICoqKi8KKworLyoqCisgKiBsaW1Qcm9jZXNzTWxtQXV0aENuZigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fQVVUSF9DTkYKKyAqIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnQnVmICAgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVByb2Nlc3NNbG1BdXRoQ25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGNhcHM7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgdmFsOworICAgIHRBbmlBdXRoVHlwZSAgICAgICBjZmdBdXRoVHlwZSwgYXV0aE1vZGU7CisgICAgdExpbU1sbUF1dGhSZXEgICAgICpwTWxtQXV0aFJlcTsKKyAgICB0TGltTWxtQXNzb2NSZXEgICAgKnBNbG1Bc3NvY1JlcTsKKyAgICB0TGltTWxtQXV0aENuZiAgICAgKnBNbG1BdXRoQ25mOworICAgIHRwUEVTZXNzaW9uICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRBTklfVTMyICAgICAgICB0ZWxlQmNuRW4gPSAwOworLy8gICAgdEFOSV9VOCAgICAgICAgIHNlc3Npb25JZDsKKworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTExcbiIpKTspCisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcE1sbUF1dGhDbmYgPSAodExpbU1sbUF1dGhDbmYqKXBNc2dCdWY7CisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwTWxtQXV0aENuZi0+c2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCgocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfQVVUSF9TVEFURSkgJiYKKyAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9XVF9QUkVfQVVUSF9TVEFURSkpIHx8CisgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSl8fCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgQVVUSCBjb25maXJtCisgICAgICAgICAqIGZyb20gTUxNIGluIG90aGVyIHN0YXRlcyBvciBvbiBBUC4KKyAgICAgICAgICogTG9nIGVycm9yCisgICAgICAgICAqLworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBNTE1fQVVUSF9DTkYgaW4gc3RhdGUgJVhcbiIpLAorICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLy8gUHJvY2VzcyBBVVRIIGNvbmZpcm0gZnJvbSBNTE0KKyAgICBpZiAoKCh0TGltTWxtQXV0aENuZiAqKSBwTXNnQnVmKS0+cmVzdWx0Q29kZSAhPSBlU0lSX1NNRV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX1dUX0FVVEhfU1RBVEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQVVUSEVOVElDQVRJT05fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopICZjZmdBdXRoVHlwZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIENvdWxkIG5vdCBnZXQgQXV0aFR5cGUgdmFsdWUgZnJvbSBDRkcuCisgICAgICAgICAgICAgICAgICogTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEF1dGhUeXBlIHZhbHVlXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBjZmdBdXRoVHlwZSA9IHBNYWMtPmxpbS5nTGltUHJlQXV0aFR5cGU7CisgICAgICAgIAorICAgICAgICBpZiAoKGNmZ0F1dGhUeXBlID09IGVTSVJfQVVUT19TV0lUQ0gpICYmCisgICAgICAgICAgICAgICAgKCgodExpbU1sbUF1dGhDbmYgKikgcE1zZ0J1ZiktPmF1dGhUeXBlID09IGVTSVJfT1BFTl9TWVNURU0pCisgICAgICAgICAgICAgICAgJiYgKGVTSVJfTUFDX0FVVEhfQUxHT19OT1RfU1VQUE9SVEVEX1NUQVRVUyA9PSAoKHRMaW1NbG1BdXRoQ25mICopIHBNc2dCdWYpLT5wcm90U3RhdHVzQ29kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogV2hlbiBPcGVuIGF1dGhlbnRpY2F0aW9uIGZhaWxzIHdpdGggcmVhc29uIGNvZGUgIjEzIiBhbmQKKyAgICAgICAgICAgICAqIGF1dGhUeXBlIHNldCB0byAnYXV0byBzd2l0Y2gnLCBUcnkgd2l0aCBTaGFyZWQgQXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXV0aE1vZGUgPSBlU0lSX1NIQVJFRF9LRVk7CisgICAgICAgICAgICAvLyBUcmlnZ2VyIE1BQyBiYXNlZCBBdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTWxtQXV0aFJlcSwgc2l6ZW9mKHRMaW1NbG1BdXRoUmVxKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1BdXRoUmVxXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcE1sbUF1dGhSZXEsIHNpemVvZih0TGltTWxtQXV0aFJlcSkpOworICAgICAgICAgICAgdmFsID0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9XVF9BVVRIX1NUQVRFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpckNvcHlNYWNBZGRyKHBNbG1BdXRoUmVxLT5wZWVyTWFjQWRkcixwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBNbG1BdXRoUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwTWFjLT5saW0uZ0xpbVByZUF1dGhQZWVyQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgcE1sbUF1dGhSZXEtPmF1dGhUeXBlID0gYXV0aE1vZGU7CisgICAgICAgICAgICAvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJZCovCisgICAgICAgICAgICBwTWxtQXV0aFJlcS0+c2Vzc2lvbklkID0gcE1sbUF1dGhDbmYtPnNlc3Npb25JZDsKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmcE1sbUF1dGhSZXEtPmF1dGhGYWlsdXJlVGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBBdXRoRmFpbHVyZVRpbWVvdXQgdmFsdWUgZnJvbSBDRkcuCisgICAgICAgICAgICAgICAgICogTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQXV0aEZhaWx1cmVUaW1lb3V0IHZhbHVlXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW1Qb3N0TWxtTWVzc2FnZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9BVVRIX1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSBwTWxtQXV0aFJlcSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNQUMgYmFzZWQgYXV0aGVudGljYXRpb24gZmFpbHVyZQorICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX1dUX0FVVEhfU1RBVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiQXV0aCBGYWlsdXJlIG9jY3VycmVkLlxuIikpOykKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX0pPSU5fRkFJTFVSRV9TVEFURTsKKyAgICAgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0lETEVfU1RBVEU7CisgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisgICAgICAgICAgICAgICAgaWYobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19JRExFX1NUQVRFLHBzZXNzaW9uRW50cnktPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgTlVMTCwgTlVMTCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgIEZMKCJGYWlsZWQgdG8gc2V0IHRoZSBMaW5rU3RhdGUuXG4iKSk7KQorI2lmIGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyIG51bGxNYWNBZGRyID0gezAsIDAsIDAsIDAsIDAsIDB9OworICAgICAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJTZXR0aW5nIGN1cnJlbnQgQlNTSUQgYXMgTlVMTCBpbiBjZmdcbiIpKTspCisgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1Cc3NpZCwgbnVsbE1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfQlNTSUQsIG51bGxNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ291bGQgbm90IHVwZGF0ZSBCU1NJRCBvbiBDRkciKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBOZWVkIHRvIHNlbmQgSm9pbiByZXNwb25zZSB3aXRoCisgICAgICAgICAgICAgICAgICogYXV0aCBmYWlsdXJlIHRvIEhvc3QuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltSGFuZGxlU21lSm9pblJlc3VsdChwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0TGltTWxtQXV0aENuZiAqKSBwTXNnQnVmKS0+cmVzdWx0Q29kZSwgKCh0TGltTWxtQXV0aENuZiAqKSBwTXNnQnVmKS0+cHJvdFN0YXR1c0NvZGUscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogUHJlLWF1dGhlbnRpY2F0aW9uIGZhaWx1cmUuCisgICAgICAgICAgICAgICAgICogU2VuZCBQcmUtYXV0aCBmYWlsdXJlIHJlc3BvbnNlIHRvIGhvc3QKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZTsKKyAgICAgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKyAgICAgICAgICAgICAgICBsaW1TZW5kU21lQXV0aFJzcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodExpbU1sbUF1dGhDbmYgKikgcE1zZ0J1ZiktPnJlc3VsdENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0TGltTWxtQXV0aENuZiAqKSBwTXNnQnVmKS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0TGltTWxtQXV0aENuZiAqKSBwTXNnQnVmKS0+YXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0TGltTWxtQXV0aENuZiAqKSBwTXNnQnVmKS0+cHJvdFN0YXR1c0NvZGUscHNlc3Npb25FbnRyeSxwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQscHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy8gZW5kIGlmIChjZmdBdXRoVHlwZSA9PSBlQVVUT19TV0lUQ0gpCisgICAgfSAvLyBpZiAoKCh0TGltTWxtQXV0aENuZiAqKSBwTXNnQnVmKS0+cmVzdWx0Q29kZSAhPSAuLi4KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfV1RfQVVUSF9TVEFURSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTdWNjZXNzZnVsIE1BQyBiYXNlZCBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICogVHJpZ2dlciBBc3NvY2lhdGlvbiB3aXRoIEJTUworICAgICAgICAgICAgICovCisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgRkwoIioqKiBBdXRoZW50aWNhdGVkIHdpdGggQlNTICoqKlxuIikpOykKKyAgICAgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1sbUFzc29jUmVxLCBzaXplb2YodExpbU1sbUFzc29jUmVxKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1Bc3NvY1JlcVxuIikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbCA9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgICAgICAgICAjaWYgMAorICAgICAgICAgICAgaWYgKGNmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0JTU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTWxtQXNzb2NSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBnZXQgQlNTSUQgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBCU1NJRFxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8vU1VQUE9SVCBCVC1BTVAKKyAgICAgICAgICAgIHNpckNvcHlNYWNBZGRyKHBNbG1Bc3NvY1JlcS0+cGVlck1hY0FkZHIscHNlc3Npb25FbnRyeS0+YnNzSWQpOworICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJnBNbG1Bc3NvY1JlcS0+YXNzb2NGYWlsdXJlVGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IEFzc29jRmFpbHVyZVRpbWVvdXQgdmFsdWUKKyAgICAgICAgICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNmZ0dldENhcGFiaWxpdHlJbmZvKHBNYWMsICZjYXBzLHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IENhcGFiaWxpdGllcyB2YWx1ZQorICAgICAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQ2FwYWJpbGl0aWVzIHZhbHVlXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKkNsZWFyIHNwZWN0cnVtIG1hbmFnZW1lbnQgYml0IGlmIEFQIGRvZXNuJ3Qgc3VwcG9ydCBpdCovCisgICAgICAgICAgICBpZighKHBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5jYXBhYmlsaXR5SW5mbyAmIExJTV9TUEVDVFJVTV9NQU5BR0VNRU5UX0JJVF9NQVNLKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKkFQIGRvZXNuJ3Qgc3VwcG9ydCBzcGVjdHJ1bSBtYW5hZ2VtZW50IGNsZWFyIHNwZWN0cnVtIG1hbmFnZW1lbnQgYml0Ki8KKyAgICAgICAgICAgICAgICBjYXBzICY9ICh+TElNX1NQRUNUUlVNX01BTkFHRU1FTlRfQklUX01BU0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwTWxtQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvID0gY2FwczsKKyAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLAorICAgICAgICAgICAgICAgRkwoIkNhcGFiaWxpdGllcyB0byBiZSB1c2VkIGluIEFzc29jUmVxPTB4JVgsIHByaXZhY3kgYml0PSV4XG4iKSwKKyAgICAgICAgICAgICAgIGNhcHMsCisgICAgICAgICAgICAgICAoKHRwU2lyTWFjQ2FwYWJpbGl0eUluZm8pICZwTWxtQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvKS0+cHJpdmFjeSk7KQorCisgICAgICAgICAgIC8qIElmIHRlbGVzY29waWMgYmVhY29uaW5nIGlzIGVuYWJsZWQsIHNldCBsaXN0ZW4gaW50ZXJ2YWwgdG8KKyAgICAgICAgICAgICAgV05JX0NGR19URUxFX0JDTl9NQVhfTEkgKi8KKyAgICAgICAgICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOLCAmdGVsZUJjbkVuKSAhPQorICAgICAgICAgICAgICAgZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDb3VsZG4ndCBnZXQgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU5cbiIpKTsKKworICAgICAgICAgICAgdmFsID0gV05JX0NGR19MSVNURU5fSU5URVJWQUxfU1RBREVGOworCisgICAgICAgICAgICBpZih0ZWxlQmNuRW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSSwgJnZhbCkgIT0KKyAgICAgICAgICAgICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBMaXN0ZW5JbnRlcnZhbCB2YWx1ZQorICAgICAgICAgICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIExpc3RlbkludGVydmFsXG4iKSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19MSVNURU5fSU5URVJWQUwsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IExpc3RlbkludGVydmFsIHZhbHVlCisgICAgICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIExpc3RlbkludGVydmFsXG4iKSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBNbG1Bc3NvY1JlcS0+bGlzdGVuSW50ZXJ2YWwgPSAodEFOSV9VMTYpdmFsOworICAgICAgICAgICAgLyogVXBkYXRlIFBFIHNlc3Npb24gSUQqLworICAgICAgICAgICAgcE1sbUFzc29jUmVxLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgICAgID0gZUxJTV9TTUVfV1RfQVNTT0NfU1RBVEU7CisgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKyAgICAgICAgICAgIGxpbVBvc3RNbG1NZXNzYWdlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fTUxNX0FTU09DX1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSBwTWxtQXNzb2NSZXEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTdWNjZXNzZnVsIFByZS1hdXRoZW50aWNhdGlvbi4KKyAgICAgICAgICAgICAqIFNlbmQgUHJlLWF1dGggcmVzcG9uc2UgdG8gaG9zdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZTsKKyAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworICAgICAgICAgICAgbGltU2VuZFNtZUF1dGhSc3AoCisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgKCh0TGltTWxtQXV0aENuZiAqKSBwTXNnQnVmKS0+cmVzdWx0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgodExpbU1sbUF1dGhDbmYgKikgcE1zZ0J1ZiktPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgKCh0TGltTWxtQXV0aENuZiAqKSBwTXNnQnVmKS0+YXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAoKHRMaW1NbG1BdXRoQ25mICopIHBNc2dCdWYpLT5wcm90U3RhdHVzQ29kZSxwc2Vzc2lvbkVudHJ5LHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCxwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0gLy8gZW5kIGlmICgoKHRMaW1NbG1BdXRoQ25mICopIHBNc2dCdWYpLT5yZXN1bHRDb2RlICE9IC4uLgorfSAvKioqIGVuZCBsaW1Qcm9jZXNzTWxtQXV0aENuZigpICoqKi8KKworLyoqCisgKiBsaW1Qcm9jZXNzTWxtQXNzb2NDbmYoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzZXMgTUxNX0FTU09DX0NORgorICogbWVzc2FnZSBmcm9tIE1MTSBTdGF0ZSBtYWNoaW5lLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2dCdWYgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltUHJvY2Vzc01sbUFzc29jQ25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRwUEVTZXNzaW9uICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRMaW1NbG1Bc3NvY0NuZiAqcExpbU1sbUFzc29jQ25mOworCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMXG4iKSk7CisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcExpbU1sbUFzc29jQ25mID0gKHRMaW1NbG1Bc3NvY0NuZiopcE1zZ0J1ZjsKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBMaW1NbG1Bc3NvY0NuZi0+c2Vzc2lvbklkKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JZFxuIikpOykKKyAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX1dUX0FTU09DX1NUQVRFIHx8CisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFIHx8IHBzZXNzaW9uRW50cnkgLT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIEFzc29jaWNhdGlvbiBjb25maXJtCisgICAgICAgICAqIGZyb20gTUxNIGluIG90aGVyIHN0YXRlcyBPUiBvbiBBUC4KKyAgICAgICAgICogTG9nIGVycm9yCisgICAgICAgICAqLworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBNTE1fQVNTT0NfQ05GIGluIHN0YXRlICVYXG4iKSwKKyAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCgodExpbU1sbUFzc29jQ25mICopIHBNc2dCdWYpLT5yZXN1bHRDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLyBBc3NvY2lhdGlvbiBmYWlsdXJlCisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIioqKiBBc3NvY2lhdGlvbiBmYWlsdXJlICoqKlxuIikpOykKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEU7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworI2lmIGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRTaXJNYWNBZGRyIG51bGxNYWNBZGRyID0gezAsIDAsIDAsIDAsIDAsIDB9OworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ0xpbUJzc2lkLCBudWxsTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgICAgICBpZiAoY2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfQlNTSUQsIG51bGxNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDb3VsZCBub3QgdXBkYXRlIEJTU0lEIG9uIENGRyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8qKgorICAgICAgICAgKiBOZWVkIHRvIHNlbmQgSm9pbiByZXNwb25zZSB3aXRoCisgICAgICAgICAqIEFzc29jaWF0aW9uIGZhaWx1cmUgdG8gSG9zdC4KKyAgICAgICAgICovCisgICAgICAgIGxpbUhhbmRsZVNtZUpvaW5SZXN1bHQocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRMaW1NbG1Bc3NvY0NuZiAqKSBwTXNnQnVmKS0+cmVzdWx0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRMaW1NbG1Bc3NvY0NuZiAqKSBwTXNnQnVmKS0+cHJvdFN0YXR1c0NvZGUscHNlc3Npb25FbnRyeSk7CisgICAgfSAvLyBpZiAoKCh0TGltTWxtQXNzb2NDbmYgKikgcE1zZ0J1ZiktPnJlc3VsdENvZGUgIT0gLi4uCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU3VjY2Vzc2Z1bCBBc3NvY2lhdGlvbgorICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCIqKiogQXNzb2NpYXRlZCB3aXRoIEJTUyAqKipcbiIpKTspCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEU7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworICAgICAgICAvKioKKyAgICAgICAgICogTmVlZCB0byBzZW5kIEpvaW4gcmVzcG9uc2Ugd2l0aAorICAgICAgICAgKiBBc3NvY2lhdGlvbiBzdWNjZXNzIHRvIEhvc3QuCisgICAgICAgICAqLworICAgICAgICBsaW1IYW5kbGVTbWVKb2luUmVzdWx0KHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0TGltTWxtQXNzb2NDbmYgKikgcE1zZ0J1ZiktPnJlc3VsdENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0TGltTWxtQXNzb2NDbmYgKikgcE1zZ0J1ZiktPnByb3RTdGF0dXNDb2RlLHBzZXNzaW9uRW50cnkpOworICAgIH0gLy8gZW5kIGlmICgoKHRMaW1NbG1Bc3NvY0NuZiAqKSBwTXNnQnVmKS0+cmVzdWx0Q29kZSAhPSAuLi4uCit9IC8qKiogZW5kIGxpbVByb2Nlc3NNbG1Bc3NvY0NuZigpICoqKi8KKworLyoqCisgKiBsaW1Qcm9jZXNzTWxtUmVhc3NvY0NuZigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fUkVBU1NPQ19DTkYKKyAqIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnQnVmICAgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVByb2Nlc3NNbG1SZWFzc29jQ25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisgICAgdExpbU1sbVJlYXNzb2NDbmYgKnBMaW1NbG1SZWFzc29jQ25mOworCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwTGltTWxtUmVhc3NvY0NuZiA9ICh0TGltTWxtUmVhc3NvY0NuZiopIHBNc2dCdWY7CisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwTGltTWxtUmVhc3NvY0NuZi0+c2Vzc2lvbklkKSk9PU5VTEwpCisgICAgeworICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbiBJZFxuIikpOykKKyAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFKSB8fAorICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKXx8KHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIFJlYXNzb2NpY2F0aW9uIGNvbmZpcm0KKyAgICAgICAgICogZnJvbSBNTE0gaW4gb3RoZXIgc3RhdGVzIE9SIG9uIEFQLgorICAgICAgICAgKiBMb2cgZXJyb3IKKyAgICAgICAgICovCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICBGTCgiUmN2IHVuZXhwZWN0ZWQgTUxNX1JFQVNTT0NfQ05GIGluIHJvbGUgJWQsIHNtZSBzdGF0ZSAweCVYXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlLCBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSk7KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxKSB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbVJlQXNzb2NSZXEgPSBOVUxMOworICAgIH0KKworICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlJjdiBNTE1fUkVBU1NPQ19DTkYgd2l0aCByZXN1bHQgY29kZSAlZFxuIiksIHBMaW1NbG1SZWFzc29jQ25mLT5yZXN1bHRDb2RlKTspCisgICAgaWYgKHBMaW1NbG1SZWFzc29jQ25mLT5yZXN1bHRDb2RlID09IGVTSVJfU01FX1NVQ0NFU1MpIHsKKyAgICAgICAgLy8gU3VjY2Vzc2Z1bCBSZWFzc29jaWF0aW9uCisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIioqKiBSZWFzc29jaWF0ZWQgd2l0aCBuZXcgQlNTICoqKlxuIikpOykKKworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX0xJTktfRVNUX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKworICAgICAgICAvKioKKyAgICAgICAgKiBOZWVkIHRvIHNlbmQgUmVhc3NvYyByZXNwb25zZSB3aXRoCisgICAgICAgICogUmVhc3NvY2lhdGlvbiBzdWNjZXNzIHRvIEhvc3QuCisgICAgICAgICovCisgICAgICAgIGxpbVNlbmRTbWVKb2luUmVhc3NvY1JzcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLCBlV05JX1NNRV9SRUFTU09DX1JTUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW1NbG1SZWFzc29jQ25mLT5yZXN1bHRDb2RlLCBwTGltTWxtUmVhc3NvY0NuZi0+cHJvdFN0YXR1c0NvZGUscHNlc3Npb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCxwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKKyAgICB9ZWxzZSBpZiAocExpbU1sbVJlYXNzb2NDbmYtPnJlc3VsdENvZGUgPT0gZVNJUl9TTUVfUkVBU1NPQ19SRUZVU0VEKSB7CisgICAgICAgIC8qKiBSZWFzc29jaWF0aW9uIGZhaWx1cmUgV2l0aCB0aGUgTmV3IEFQCisgICAgICAgICogICBidXQgd2Ugc3RpbGwgaGF2ZSB0aGUgbGluayB3aXRoIHRoZSBPbGRlciBBUAorICAgICAgICAqLworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX0xJTktfRVNUX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKworICAgICAgICAvKioKKyAgICAgICAgKiBOZWVkIHRvIHNlbmQgUmVhc3NvYyByZXNwb25zZSB3aXRoCisgICAgICAgICogQXNzb2NpYXRpb24gZmFpbHVyZSB0byBIb3N0LgorICAgICAgICAqLworICAgICAgICBsaW1TZW5kU21lSm9pblJlYXNzb2NSc3AocE1hYywgZVdOSV9TTUVfUkVBU1NPQ19SU1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGltTWxtUmVhc3NvY0NuZi0+cmVzdWx0Q29kZSwgcExpbU1sbVJlYXNzb2NDbmYtPnByb3RTdGF0dXNDb2RlLHBzZXNzaW9uRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQscHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7CisgICAgfWVsc2UgeworICAgICAgICAvLyBSZWFzc29jaWF0aW9uIGZhaWx1cmUKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEU7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworICAgICAgICAvKioKKyAgICAgICAgICogTmVlZCB0byBzZW5kIFJlYXNzb2MgcmVzcG9uc2Ugd2l0aAorICAgICAgICAgKiBBc3NvY2lhdGlvbiBmYWlsdXJlIHRvIEhvc3QuCisgICAgICAgICAqLworICAgICAgICBsaW1TZW5kU21lSm9pblJlYXNzb2NSc3AoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLCBlV05JX1NNRV9SRUFTU09DX1JTUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW1NbG1SZWFzc29jQ25mLT5yZXN1bHRDb2RlLCBwTGltTWxtUmVhc3NvY0NuZi0+cHJvdFN0YXR1c0NvZGUscHNlc3Npb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCxwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKKyAgICB9Cit9IC8qKiogZW5kIGxpbVByb2Nlc3NNbG1SZWFzc29jQ25mKCkgKioqLworCisvKioKKyAqIGxpbVByb2Nlc3NNbG1SZWFzc29jSW5kKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIE1MTV9SRUFTU09DX0lORAorICogbWVzc2FnZSBmcm9tIE1MTSBTdGF0ZSBtYWNoaW5lLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2dCdWYgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltUHJvY2Vzc01sbVJlYXNzb2NJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgbGVuOworICAgIHRTaXJNc2dRICAgICAgICAgICBtc2dROworICAgIHRTaXJTbWVSZWFzc29jSW5kICAqcFNpclNtZVJlYXNzb2NJbmQ7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgIHBTdGFEcz0wOworICAgIHRwUEVTZXNzaW9uICBwc2Vzc2lvbkVudHJ5OworICAgIHRBTklfVTggICAgICBzZXNzaW9uSWQ7CisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMsKCh0cExpbU1sbVJlYXNzb2NJbmQpcE1zZ0J1ZiktPnBlZXJNYWNBZGRyLCAmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJZFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLy8gSW5mb3JtIEhvc3Qgb2YgU1RBIHJlYXNzb2NpYXRpb24KKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICBsZW4gPSBzaXplb2YodFNpclNtZVJlYXNzb2NJbmQpIC0KKyAgICAgICAgICBzaXplb2YodFNpck5laWdoYm9yQnNzSW5mbykgKworICAgICAgICAgICgoKHRwTGltTWxtUmVhc3NvY0luZCkgcE1zZ0J1ZiktPm51bUJzcyAqCisgICAgICAgICAgIHNpemVvZih0U2lyTmVpZ2hib3JCc3NJbmZvKSkgLQorICAgICAgICAgICBTSVJfTUFDX01BWF9TU0lEX0xFTkdUSCArCisgICAgICAgICAgICgodHBMaW1NbG1SZWFzc29jSW5kKSBwTXNnQnVmKS0+c3NJZC5sZW5ndGg7CisjZWxzZQorICAgIGxlbiA9IHNpemVvZih0U2lyU21lUmVhc3NvY0luZCk7CisjZW5kaWYKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTaXJTbWVSZWFzc29jSW5kLCBsZW4pKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX1JFQVNTT0NfSU5EXG4iKSk7CisgICAgICAgIHJldHVybjsKKworICAgIH0KKyAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTggKikgJnBTaXJTbWVSZWFzc29jSW5kLT5tZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgZVdOSV9TTUVfUkVBU1NPQ19JTkQpOworICAgIGxpbVJlYXNzb2NJbmRTZXJEZXMocE1hYywgKHRwTGltTWxtUmVhc3NvY0luZCkgcE1zZ0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICYocFNpclNtZVJlYXNzb2NJbmQtPmxlbmd0aCksIHBzZXNzaW9uRW50cnkpOworCisgICAgLy8gUmVxdWlyZWQgZm9yIGluZGljYXRpbmcgdGhlIGZyYW1lcyB0byB1cHBlciBsYXllcgorICAgIHBTaXJTbWVSZWFzc29jSW5kLT5hc3NvY1JlcUxlbmd0aCA9ICgodHBMaW1NbG1SZWFzc29jSW5kKSBwTXNnQnVmKS0+YXNzb2NSZXFMZW5ndGg7CisgICAgcFNpclNtZVJlYXNzb2NJbmQtPmFzc29jUmVxUHRyID0gKCh0cExpbU1sbVJlYXNzb2NJbmQpIHBNc2dCdWYpLT5hc3NvY1JlcVB0cjsKKyAgICBwU2lyU21lUmVhc3NvY0luZC0+YmVhY29uUHRyID0gcHNlc3Npb25FbnRyeS0+YmVhY29uOworICAgIHBTaXJTbWVSZWFzc29jSW5kLT5iZWFjb25MZW5ndGggPSBwc2Vzc2lvbkVudHJ5LT5iY25MZW47CisgICAgCisgICAgbXNnUS50eXBlID0gZVdOSV9TTUVfUkVBU1NPQ19JTkQ7CisgICAgbXNnUS5ib2R5cHRyID0gcFNpclNtZVJlYXNzb2NJbmQ7CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX1JFQVNTT0NfSU5EX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAwLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgKCh0cExpbU1sbVJlYXNzb2NJbmQpIHBNc2dCdWYpLT5haWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICBpZiAoISBwU3RhRHMpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJNTE0gUmVBc3NvY0luZDogU3RhdGlvbiBjb250ZXh0IG5vIGxvbmdlciB2YWxpZCAoYWlkICVkKVxuIiksCisgICAgICAgICAgICAgICAgKCh0cExpbU1sbVJlYXNzb2NJbmQpIHBNc2dCdWYpLT5haWQpOworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTaXJTbWVSZWFzc29jSW5kKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1zZ1EsICBlUFJPVCk7CisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgIEZMKCJDcmVhdGUgQ05GX1dBSVRfVElNRVIgYWZ0ZXIgcmVjZWl2ZWQgTElNX01MTV9SRUFTU09DX0lORFxuIikpOykKKyAgICAvKgorICAgICAqKiB0dXJuIG9uIGEgdGltZXIgdG8gZGV0ZWN0IHRoZSBsb3NzIG9mIFJFQVNTT0MgQ05GCisgICAgICoqLworICAgIGxpbUFjdGl2YXRlQ25mVGltZXIocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UxNikgKCh0cExpbU1sbVJlYXNzb2NJbmQpIHBNc2dCdWYpLT5haWQsIHBzZXNzaW9uRW50cnkpOworfSAvKioqIGVuZCBsaW1Qcm9jZXNzTWxtUmVhc3NvY0luZCgpICoqKi8KKworLyoqCisgKiBsaW1Qcm9jZXNzTWxtQXV0aEluZCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fQVVUSF9JTkQKKyAqIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnQnVmICAgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVByb2Nlc3NNbG1BdXRoSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRTaXJNc2dRICAgICAgICAgICBtc2dROworICAgIHRTaXJTbWVBdXRoSW5kICAgICAqcFNpclNtZUF1dGhJbmQ7CisKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMXG4iKSk7KQorICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNpclNtZUF1dGhJbmQsIHNpemVvZih0U2lyU21lQXV0aEluZCkpKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX0FVVEhfSU5EXG4iKSk7CisgICAgfQorICAgIGxpbUNvcHlVMTYoKHRBTklfVTggKikgJnBTaXJTbWVBdXRoSW5kLT5tZXNzYWdlVHlwZSwgZVdOSV9TTUVfQVVUSF9JTkQpOworICAgIGxpbUF1dGhJbmRTZXJEZXMocE1hYywgKHRwTGltTWxtQXV0aEluZCkgcE1zZ0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICYocFNpclNtZUF1dGhJbmQtPmxlbmd0aCkpOworICAgIG1zZ1EudHlwZSA9IGVXTklfU01FX0FVVEhfSU5EOworICAgIG1zZ1EuYm9keXB0ciA9IHBTaXJTbWVBdXRoSW5kOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19BVVRIX0lORF9FVkVOVCwgTlVMTCwgMCwgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbXNnUSwgIGVQUk9UKTsKK30gLyoqKiBlbmQgbGltUHJvY2Vzc01sbUF1dGhJbmQoKSAqKiovCisKKworCisKK3ZvaWQKK2xpbUZpbGxBc3NvY0luZFBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cExpbU1sbUFzc29jSW5kIHBBc3NvY0luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclNtZUFzc29jSW5kICAgICpwU2lyU21lQXNzb2NJbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgcFNpclNtZUFzc29jSW5kLT5sZW5ndGggPSBzaXplb2YodFNpclNtZUFzc29jSW5kKTsKKyAgICBwU2lyU21lQXNzb2NJbmQtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKworICAgIC8vIFJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZXMgdG8gdXBwZXIgbGF5ZXIKKyAgICBwU2lyU21lQXNzb2NJbmQtPmFzc29jUmVxTGVuZ3RoID0gcEFzc29jSW5kLT5hc3NvY1JlcUxlbmd0aDsKKyAgICBwU2lyU21lQXNzb2NJbmQtPmFzc29jUmVxUHRyID0gcEFzc29jSW5kLT5hc3NvY1JlcVB0cjsKKworICAgIHBTaXJTbWVBc3NvY0luZC0+YmVhY29uUHRyID0gcHNlc3Npb25FbnRyeS0+YmVhY29uOworICAgIHBTaXJTbWVBc3NvY0luZC0+YmVhY29uTGVuZ3RoID0gcHNlc3Npb25FbnRyeS0+YmNuTGVuOyAgICAKKworICAgIC8vIEZpbGwgaW4gcGVlck1hY0FkZHIKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU2lyU21lQXNzb2NJbmQtPnBlZXJNYWNBZGRyLCBwQXNzb2NJbmQtPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAvLyBGaWxsIGluIGFpZAorICAgIHBTaXJTbWVBc3NvY0luZC0+YWlkID0gcEFzc29jSW5kLT5haWQ7CisgICAgLy8gRmlsbCBpbiBic3NJZAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTaXJTbWVBc3NvY0luZC0+YnNzSWQsIHBzZXNzaW9uRW50cnktPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAvLyBGaWxsIGluIHN0YUlkCisgICAgLy9wU2lyU21lQXNzb2NJbmQtPnN0YUlkID0gcHNlc3Npb25FbnRyeS0+c3RhSWQ7CisgICAgLy8gRmlsbCBpbiBhdXRoVHlwZQorICAgIHBTaXJTbWVBc3NvY0luZC0+YXV0aFR5cGUgPSBwQXNzb2NJbmQtPmF1dGhUeXBlOworICAgIC8vIEZpbGwgaW4gc3NJZAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICAodEFOSV9VOCopJnBTaXJTbWVBc3NvY0luZC0+c3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJihwQXNzb2NJbmQtPnNzSWQpLCBwQXNzb2NJbmQtPnNzSWQubGVuZ3RoICsgMSk7CisgICAgcFNpclNtZUFzc29jSW5kLT5yc25JRS5sZW5ndGggPSBwQXNzb2NJbmQtPnJzbklFLmxlbmd0aDsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCopICZwU2lyU21lQXNzb2NJbmQtPnJzbklFLnJzbklFZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJihwQXNzb2NJbmQtPnJzbklFLnJzbklFZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvY0luZC0+cnNuSUUubGVuZ3RoKTsKKworICAgIHBTaXJTbWVBc3NvY0luZC0+YWRkSUUubGVuZ3RoID0gcEFzc29jSW5kLT5hZGRJRS5sZW5ndGg7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTgqKSAmcFNpclNtZUFzc29jSW5kLT5hZGRJRS5hZGRJRWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICYocEFzc29jSW5kLT5hZGRJRS5hZGRJRWRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NJbmQtPmFkZElFLmxlbmd0aCk7CisKKyAgICAvLyBDb3B5IHRoZSBuZXcgVElUQU4gY2FwYWJpbGl0aWVzCisgICAgcFNpclNtZUFzc29jSW5kLT50aXRhbkh0Q2FwcyA9IHBBc3NvY0luZC0+dGl0YW5IdENhcHM7CisgICAgcFNpclNtZUFzc29jSW5kLT5zcGVjdHJ1bU1ndEluZGljYXRvciA9IHBBc3NvY0luZC0+c3BlY3RydW1NZ3RJbmRpY2F0b3I7CisgICAgaWYgKHBBc3NvY0luZC0+c3BlY3RydW1NZ3RJbmRpY2F0b3IgPT0gZVNJUl9UUlVFKQorICAgIHsKKyAgICAgICAgcFNpclNtZUFzc29jSW5kLT5wb3dlckNhcC5taW5UeFBvd2VyID0gcEFzc29jSW5kLT5wb3dlckNhcC5taW5UeFBvd2VyOworICAgICAgICBwU2lyU21lQXNzb2NJbmQtPnBvd2VyQ2FwLm1heFR4UG93ZXIgPSBwQXNzb2NJbmQtPnBvd2VyQ2FwLm1heFR4UG93ZXI7CisgICAgICAgIHBTaXJTbWVBc3NvY0luZC0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubCA9IHBBc3NvY0luZC0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubDsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTgqKSAmcFNpclNtZUFzc29jSW5kLT5zdXBwb3J0ZWRDaGFubmVscy5jaGFubmVsTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICYocEFzc29jSW5kLT5zdXBwb3J0ZWRDaGFubmVscy5jaGFubmVsTGlzdCksCisgICAgICAgICAgICAgICAgICAgICBwQXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmwpOworICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgLy8gRmlsbCBpbiBXbW1JbmZvCisgICAgcFNpclNtZUFzc29jSW5kLT53bW1FbmFibGVkU3RhID0gcEFzc29jSW5kLT5XbW1TdGFJbmZvUHJlc2VudDsKKyNlbmRpZgorfSAvKioqIGVuZCBsaW1Bc3NvY0luZFNlckRlcygpICoqKi8KKworCisKKy8qKgorICogbGltUHJvY2Vzc01sbUFzc29jSW5kKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIE1MTV9BU1NPQ19JTkQKKyAqIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnQnVmICAgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVByb2Nlc3NNbG1Bc3NvY0luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIGxlbjsKKyAgICB0U2lyTXNnUSAgICAgICAgICAgIG1zZ1E7CisgICAgdFNpclNtZUFzc29jSW5kICAgICpwU2lyU21lQXNzb2NJbmQ7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgICBwU3RhRHM9MDsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnk7CisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCgodHBMaW1NbG1Bc3NvY0luZCkgcE1zZ0J1ZiktPnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWRcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8vIEluZm9ybSBIb3N0IG9mIFNUQSBhc3NvY2lhdGlvbgorI2lmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgbGVuID0gc2l6ZW9mKHRTaXJTbWVBc3NvY0luZCkgLQorICAgICAgICAgICAgICBzaXplb2YodFNpck5laWdoYm9yQnNzSW5mbykgKworICAgICAgICAgICAgICAoKCh0cExpbU1sbUFzc29jSW5kKSBwTXNnQnVmKS0+bnVtQnNzICoKKyAgICAgICAgICAgICAgIHNpemVvZih0U2lyTmVpZ2hib3JCc3NJbmZvKSkgLQorICAgICAgICAgICAgICBTSVJfTUFDX01BWF9TU0lEX0xFTkdUSCArCisgICAgICAgICAgICAgICgodHBMaW1NbG1Bc3NvY0luZCkgcE1zZ0J1ZiktPnNzSWQubGVuZ3RoOworI2Vsc2UKKyAgICBsZW4gPSBzaXplb2YodFNpclNtZUFzc29jSW5kKTsKKyNlbmRpZgorICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNpclNtZUFzc29jSW5kLCBsZW4pKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9BU1NPQ19JTkRcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4ICopICZwU2lyU21lQXNzb2NJbmQtPm1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICBlV05JX1NNRV9BU1NPQ19JTkQpOworICAgIGxpbUFzc29jSW5kU2VyRGVzKHBNYWMsICh0cExpbU1sbUFzc29jSW5kKSBwTXNnQnVmLAorICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICYocFNpclNtZUFzc29jSW5kLT5sZW5ndGgpLCBwc2Vzc2lvbkVudHJ5KTsKKyNlbHNlCisgICAgcFNpclNtZUFzc29jSW5kLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0FTU09DX0lORDsKKyAgICBsaW1GaWxsQXNzb2NJbmRQYXJhbXMocE1hYywgKHRwTGltTWxtQXNzb2NJbmQpIHBNc2dCdWYsIHBTaXJTbWVBc3NvY0luZCwgcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKyAgICBtc2dRLnR5cGUgPSBlV05JX1NNRV9BU1NPQ19JTkQ7CisgICAgbXNnUS5ib2R5cHRyID0gcFNpclNtZUFzc29jSW5kOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodHBMaW1NbG1Bc3NvY0luZCkgcE1zZ0J1ZiktPmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgIGlmICghIHBTdGFEcykKKyAgICB7ICAgLy8gZ29vZCB0aW1lIHRvIHBhbmljLi4uCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiTUxNIEFzc29jSW5kOiBTdGF0aW9uIGNvbnRleHQgbm8gbG9uZ2VyIHZhbGlkIChhaWQgJWQpXG4iKSwKKyAgICAgICAgICAgICAgICgodHBMaW1NbG1Bc3NvY0luZCkgcE1zZ0J1ZiktPmFpZCk7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNpclNtZUFzc29jSW5kKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBTaXJTbWVBc3NvY0luZC0+c3RhSWQgPSBwU3RhRHMtPnN0YUluZGV4OworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgIHBTaXJTbWVBc3NvY0luZC0+cmVhc3NvY1JlcSA9IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlOworI2VuZGlmCisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19BU1NPQ19JTkRfRVZFTlQsIHBzZXNzaW9uRW50cnksIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1zZ1EsICBlUFJPVCk7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgRkwoIkNyZWF0ZSBDTkZfV0FJVF9USU1FUiBhZnRlciByZWNlaXZlZCBMSU1fTUxNX0FTU09DX0lORFxuIikpOykKKyAgICAvKgorICAgICAqKiB0dXJuIG9uIGEgdGltZXIgdG8gZGV0ZWN0IHRoZSBsb3NzIG9mIEFTU09DIENORgorICAgICAqKi8KKyAgICBsaW1BY3RpdmF0ZUNuZlRpbWVyKHBNYWMsICh0QU5JX1UxNikgKCh0cExpbU1sbUFzc29jSW5kKSBwTXNnQnVmKS0+YWlkLCBwc2Vzc2lvbkVudHJ5KTsKKworLy8gRW5hYmxlIHRoaXMgQ29tcGlsZSBmbGFnIHRvIHRlc3QgdGhlIEJULUFNUCAtQVAgYXNzb2Mgc2VxdWVuY2UKKyNpZmRlZiBURVNUX0JUQU1QX0FQCisvL3RBTklfVTMyICpwTXNnQnVmOworeworICAgIHRwU2lyU21lQXNzb2NDbmYgICAgIHBTbWVBc3NvY2NuZjsKKyAgICBpZighcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwodm9pZCAqKikmcFNtZUFzc29jY25mLHNpemVvZih0U2lyU21lQXNzb2NDbmYpKSkKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgicGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBwU21lQXNzb2NjbmYgXG4iKSk7KQorICAgIHBTbWVBc3NvY2NuZi0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9BU1NPQ19DTkY7CisgICAgcFNtZUFzc29jY25mLT5sZW5ndGggPSBzaXplb2YodFNpclNtZUFzc29jQ25mKTsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLHBTbWVBc3NvY2NuZi0+cGVlck1hY0FkZHIsKCh0cExpbU1sbUFzc29jSW5kKXBNc2dCdWYpLT5wZWVyTWFjQWRkciw2KTsKKyAgICBwU21lQXNzb2NjbmYtPnN0YXR1c0NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgIHBTbWVBc3NvY2NuZi0+YWlkID0gKCh0cExpbU1sbUFzc29jSW5kKXBNc2dCdWYpLT5haWQ7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFNtZUFzc29jY25mLT5hbHRlcm5hdGVCc3NJZCxwU21lQXNzb2NjbmYtPnBlZXJNYWNBZGRyLHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBTbWVBc3NvY2NuZi0+YWx0ZXJuYXRlQ2hhbm5lbElkID0gNjsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLHBTbWVBc3NvY2NuZi0+YnNzSWQscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsNik7CisgICAgcE1zZ0J1ZiA9ICh0QU5JX1UzMilwU21lQXNzb2NjbmY7CisgICAgX19saW1Qcm9jZXNzU21lQXNzb2NDbmZOZXcocE1hYywgZVdOSV9TTUVfQVNTT0NfQ05GLCBwTXNnQnVmKTsKKyAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQscFNtZUFzc29jY25mKTsKK30KKyNlbmRpZgorCisKK30gLyoqKiBlbmQgbGltUHJvY2Vzc01sbUFzc29jSW5kKCkgKioqLworCisKKworCisvKioKKyAqIGxpbVByb2Nlc3NNbG1EaXNhc3NvY0luZCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fRElTQVNTT0NfSU5ECisgKiBtZXNzYWdlIGZyb20gTUxNIFN0YXRlIG1hY2hpbmUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcE1zZ0J1ZiAgICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1Qcm9jZXNzTWxtRGlzYXNzb2NJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdExpbU1sbURpc2Fzc29jSW5kICAqcE1sbURpc2Fzc29jSW5kOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgcHNlc3Npb25FbnRyeTsKKyAgICBwTWxtRGlzYXNzb2NJbmQgPSAodExpbU1sbURpc2Fzc29jSW5kICopIHBNc2dCdWY7CisgICAgaWYoIChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMscE1sbURpc2Fzc29jSW5kLT5zZXNzaW9uSWQpICk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsRkwoIlNlc3Npb24gRG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JRFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN3aXRjaCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKKyAgICB7CisgICAgICAgIGNhc2UgZUxJTV9TVEFfSU5fSUJTU19ST0xFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUxJTV9TVEFfUk9MRToKKyAgICAgICAgY2FzZSBlTElNX0JUX0FNUF9TVEFfUk9MRToKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9ESVNBU1NPQ19TVEFURTsKKyAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIGVMSU1fQVBfUk9MRSAvL2VMSU1fQlRfQU1QX0FQX1JPTEUKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCIqKiogUGVlciBzdGFJZD0lZCBEaXNhc3NvY2lhdGVkICoqKlxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICBwTWxtRGlzYXNzb2NJbmQtPmFpZCk7KQorICAgICAgICAgICAgLy8gU2VuZCBTTUVfRElTQVNPQ19JTkQgYWZ0ZXIgUG9sYXJpcyBjbGVhbnVwCisgICAgICAgICAgICAvLyAoYWZ0ZXIgcmVjZWl2aW5nIExJTV9NTE1fUFVSR0VfU1RBX0lORCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gLy8gZW5kIHN3aXRjaCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKK30gLyoqKiBlbmQgbGltUHJvY2Vzc01sbURpc2Fzc29jSW5kKCkgKioqLworCisvKioKKyAqIGxpbVByb2Nlc3NNbG1EaXNhc3NvY0NuZigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fRElTQVNTT0NfQ05GCisgKiBtZXNzYWdlIGZyb20gTUxNIFN0YXRlIG1hY2hpbmUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcE1zZ0J1ZiAgICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1Qcm9jZXNzTWxtRGlzYXNzb2NDbmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdFNpclJlc3VsdENvZGVzICAgICAgICAgcmVzdWx0Q29kZTsKKyAgICB0TGltTWxtRGlzYXNzb2NDbmYgICAgICAqcE1sbURpc2Fzc29jQ25mOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgIHBzZXNzaW9uRW50cnk7CisgICAgcE1sbURpc2Fzc29jQ25mID0gKHRMaW1NbG1EaXNhc3NvY0NuZiAqKSBwTXNnQnVmOworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMscE1sbURpc2Fzc29jQ25mLT5zZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoInNlc3Npb24gRG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb24gSWRcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVzdWx0Q29kZSA9ICh0U2lyUmVzdWx0Q29kZXMpCisgICAgICAgICAgICAgICAgIChwTWxtRGlzYXNzb2NDbmYtPmRpc2Fzc29jVHJpZ2dlciA9PQorICAgICAgICAgICAgICAgICAgZUxJTV9MSU5LX01PTklUT1JJTkdfRElTQVNTT0MpID8KKyAgICAgICAgICAgICAgICAgZVNJUl9TTUVfTE9TVF9MSU5LX1dJVEhfUEVFUl9SRVNVTFRfQ09ERSA6CisgICAgICAgICAgICAgICAgIHBNbG1EaXNhc3NvY0NuZi0+cmVzdWx0Q29kZTsKKyAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSl8fCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSkpCisgICAgeworI2lmIGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgICAgIHRTaXJNYWNBZGRyICAgICAgICAgbnVsbE1hY0FkZHIgPSB7MCwgMCwgMCwgMCwgMCwgMH07CisjZW5kaWYKKyAgICAgICAgLy8gRGlzYXNzb2NpYXRlIENvbmZpcm0gZnJvbSBNTE0KKyAgICAgICAgaWYgKCAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEUpICYmCisgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSkgKQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZAorICAgICAgICAgICAgICogRGlzYXNzb2NhdGUgY29uZmlybQorICAgICAgICAgICAgICogZnJvbSBNTE0gaW4gb3RoZXIgc3RhdGVzLgorICAgICAgICAgICAgICogTG9nIGVycm9yCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIE1MTV9ESVNBU1NPQ19DTkYgaW4gc3RhdGUgJVhcbiIpLHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTspCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgICAgICAvLyBXaGVuZXZlciB0aGVyZSBpcyBhIGRpc2Fzc29jIG5vdGlmaWNhdGlvbiwgbWFrZSBzdXJlIHRoZSBic3NJZCBpcyBjbGVhcmVkIHNvIHRoYXQKKyAgICAgICAgLy8gaWYgdGhlIHN0YXRpb24gZmluZHMgdGhlIHNhbWUgQVAgdG8gd2hpY2ggaXQgd2FzIGFzc29jaWF0ZWQsIGl0IGNhbiB0cnkgdG8gYXNzb2NpYXRlCisgICAgICAgIC8vIHdpdGggaXQgYWdhaW4uIElmIHRoaXMgaXMgbm90IGRvbmUsIHRoZSBiZWFjb25zL3Byb2JlIHJzcCBmcm9tIHRoaXMgQVAgd2lsbCBub3QgYmUgZ2l2ZW4KKyAgICAgICAgLy8gdXAgdG8gV1NNIGFuZCBpdCBuZXZlciBzZWUgdGhpcyBpcyBBUCB1bmxlc3MgYSBjZ2EvcmVib290IGlzIGRvbmUuCisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1Cc3NpZCwgbnVsbE1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBpZiAoY2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfQlNTSUQsIG51bGxNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ291bGQgbm90IHVwZGF0ZSBCU1NJRCBvbiBDRkciKSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1Sc3BSZXFkKQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisgICAgICAgIGlmIChwTWxtRGlzYXNzb2NDbmYtPmRpc2Fzc29jVHJpZ2dlciA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9QUk9NSVNDVU9VU19NT0RFX0RJU0FTU09DKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1sbURpc2Fzc29jQ25mLT5yZXN1bHRDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBwc2Vzc2lvbkVudHJ5LT5saW1QcmV2U21lU3RhdGU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9PRkZMSU5FX1NUQVRFOworICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisgICAgICAgICAgICAvLyBTZW5kIFByb21pc2N1b3VzIG1vZGUgcmVzcG9uc2UgdG8gaG9zdAorICAgICAgICAgICAgbGltU2VuZFNtZVByb21pc2N1b3VzTW9kZVJzcChwTWFjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTWxtRGlzYXNzb2NDbmYtPnJlc3VsdENvZGUgIT0gZVNJUl9TTUVfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX0lETEVfU1RBVEU7CisgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKyAgICAgICAgICAgIGxpbVNlbmRTbWVEaXNhc3NvY050ZihwTWFjLCBwTWxtRGlzYXNzb2NDbmYtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbURpc2Fzc29jQ25mLT5kaXNhc3NvY1RyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbURpc2Fzc29jQ25mLT5haWQscHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQscHNlc3Npb25FbnRyeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAgKCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkgKQorICAgIHsKKyAgICAgICAgbGltU2VuZFNtZURpc2Fzc29jTnRmKHBNYWMsIHBNbG1EaXNhc3NvY0NuZi0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbURpc2Fzc29jQ25mLT5kaXNhc3NvY1RyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWxtRGlzYXNzb2NDbmYtPmFpZCxwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQscHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCxwc2Vzc2lvbkVudHJ5KTsKKyAgICB9Cit9IC8qKiogZW5kIGxpbVByb2Nlc3NNbG1EaXNhc3NvY0NuZigpICoqKi8KKworLyoqCisgKiBsaW1Qcm9jZXNzTWxtRGVhdXRoSW5kKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIE1MTV9ERUFVVEhfSU5ECisgKiBtZXNzYWdlIGZyb20gTUxNIFN0YXRlIG1hY2hpbmUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcE1zZ0J1ZiAgICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1Qcm9jZXNzTWxtRGVhdXRoSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRMaW1NbG1EZWF1dGhJbmQgICpwTWxtRGVhdXRoSW5kOworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCAgICAgc2Vzc2lvbklkOworICAgIHBNbG1EZWF1dGhJbmQgPSAodExpbU1sbURlYXV0aEluZCAqKSBwTXNnQnVmOworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYyxwTWxtRGVhdXRoSW5kLT5wZWVyTWFjQWRkciwmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gQlNTSWRcbiIpKTspCisgICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN3aXRjaCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKKyAgICB7CisgICAgICAgIGNhc2UgZUxJTV9TVEFfSU5fSUJTU19ST0xFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUxJTV9TVEFfUk9MRToKKyAgICAgICAgY2FzZSBlTElNX0JUX0FNUF9TVEFfUk9MRToKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFOworICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSkpOworCisgICAgICAgIGRlZmF1bHQ6IC8vIGVMSU1fQVBfUk9MRQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICBGTCgiKioqIFJlY2VpdmVkIERlYXV0aGVudGljYXRpb24gZnJvbSBzdGFJZD0lZCAqKipcbiIpLAorICAgICAgICAgICAgICAgICAgIHBNbG1EZWF1dGhJbmQtPmFpZCk7KQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2VuZCBTTUVfREVBVVRIX0lORCBhZnRlciBQb2xhcmlzIGNsZWFudXAKKyAgICAgICAgICAgIC8vIChhZnRlciByZWNlaXZpbmcgTElNX01MTV9QVVJHRV9TVEFfSU5EKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfSAvLyBlbmQgc3dpdGNoIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKQorfSAvKioqIGVuZCBsaW1Qcm9jZXNzTWxtRGVhdXRoSW5kKCkgKioqLworCisvKioKKyAqIGxpbVByb2Nlc3NNbG1EZWF1dGhDbmYoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzZXMgTUxNX0RFQVVUSF9DTkYKKyAqIG1lc3NhZ2UgZnJvbSBNTE0gU3RhdGUgbWFjaGluZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnQnVmICAgIEEgcG9pbnRlciB0byB0aGUgTUxNIG1lc3NhZ2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVByb2Nlc3NNbG1EZWF1dGhDbmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgYWlkOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICAgICAgIHJlc3VsdENvZGU7CisgICAgdExpbU1sbURlYXV0aENuZiAgICAgICAgKnBNbG1EZWF1dGhDbmY7CisgICAgdHBQRVNlc3Npb24gICAgICAgICAgICAgcHNlc3Npb25FbnRyeTsKKworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTExcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcE1sbURlYXV0aENuZiA9ICh0TGltTWxtRGVhdXRoQ25mICopIHBNc2dCdWY7CisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwTWxtRGVhdXRoQ25mLT5zZXNzaW9uSWQpKT09TlVMTCkKKyAgICB7CisgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb24gSWQgXG4iKSk7KQorICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJlc3VsdENvZGUgPSAodFNpclJlc3VsdENvZGVzKQorICAgICAgICAgICAgICAgICAocE1sbURlYXV0aENuZi0+ZGVhdXRoVHJpZ2dlciA9PQorICAgICAgICAgICAgICAgICAgZUxJTV9MSU5LX01PTklUT1JJTkdfREVBVVRIKSA/CisgICAgICAgICAgICAgICAgIGVTSVJfU01FX0xPU1RfTElOS19XSVRIX1BFRVJfUkVTVUxUX0NPREUgOgorICAgICAgICAgICAgICAgICBwTWxtRGVhdXRoQ25mLT5yZXN1bHRDb2RlOworICAgIGFpZCA9IChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgPworICAgICAgICAgIHBNbG1EZWF1dGhDbmYtPmFpZCA6IDE7CisgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpKQorICAgIHsKKyAgICAgICAgI2lmIGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgICAgIHRTaXJNYWNBZGRyICAgICAgICAgbnVsbE1hY0FkZHIgPSB7MCwgMCwgMCwgMCwgMCwgMH07CisgICAgICAgICNlbmRpZgorICAgICAgICAvLyBEZWF1dGggQ29uZmlybSBmcm9tIE1MTQorICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFKQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBEZWF1dGggY29uZmlybQorICAgICAgICAgICAgICogZnJvbSBNTE0gaW4gb3RoZXIgc3RhdGVzLgorICAgICAgICAgICAgICogTG9nIGVycm9yCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIE1MTV9ERUFVVEhfQ05GIGluIHN0YXRlICVYXG4iKSwKKyAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTspCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgICAgICAvLyBXaGVuZXZlciB0aGVyZSBpcyBhIGRpc2Fzc29jIG5vdGlmaWNhdGlvbiwgbWFrZSBzdXJlIHRoZSBic3NJZCBpcyBjbGVhcmVkIHNvIHRoYXQKKyAgICAgICAgLy8gaWYgdGhlIHN0YXRpb24gZmluZHMgdGhlIHNhbWUgQVAgdG8gd2hpY2ggaXQgd2FzIGFzc29jaWF0ZWQsIGl0IGNhbiB0cnkgdG8gYXNzb2NpYXRlCisgICAgICAgIC8vIHdpdGggaXQgYWdhaW4uIElmIHRoaXMgaXMgbm90IGRvbmUsIHRoZSBiZWFjb25zL3Byb2JlIHJzcCBmcm9tIHRoaXMgQVAgd2lsbCBub3QgYmUgZ2l2ZW4KKyAgICAgICAgLy8gdXAgdG8gV1NNIGFuZCBpdCBuZXZlciBzZWUgdGhpcyBpcyBBUCB1bmxlc3MgYSBjZ2EvcmVib290IGlzIGRvbmUuCisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1Cc3NpZCwgbnVsbE1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBpZiAoY2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfQlNTSUQsIG51bGxNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ291bGQgbm90IHVwZGF0ZSBCU1NJRCBvbiBDRkciKSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAocE1sbURlYXV0aENuZi0+cmVzdWx0Q29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX0lETEVfU1RBVEU7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgRkwoIioqKiBEZWF1dGhlbnRpY2F0ZWQgd2l0aCBCU1MgKioqXG4iKSk7KQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gcHNlc3Npb25FbnRyeS0+bGltUHJldlNtZVN0YXRlOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKworICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1Sc3BSZXFkKQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisgICAgfQorI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgLy8gQlAgZGVhdXRoZW50aWNhdGVkIGJ5IEFQIG9yIHZpY2UgdmVyc2EKKyAgICAvLyBTZW5kIFNNRV9ESVNBU1NPQ19SU1AgdG8gaG9zdC4KKyAgICBsaW1TZW5kU21lRGlzYXNzb2NOdGYocE1hYywgcE1sbURlYXV0aENuZi0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBNbG1EZWF1dGhDbmYtPmRlYXV0aFRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZCk7CisjZWxzZQorICAgIC8vIE9uIFNUQSBvciBvbiBCQVNJQyBBUCwgc2VuZCBTTUVfREVBVVRIX1JTUCB0byBob3N0CisgICAgbGltU2VuZFNtZURlYXV0aE50ZihwTWFjLCBwTWxtRGVhdXRoQ25mLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwTWxtRGVhdXRoQ25mLT5kZWF1dGhUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkLHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCxwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKKyNlbmRpZgorfSAvKioqIGVuZCBsaW1Qcm9jZXNzTWxtRGVhdXRoQ25mKCkgKioqLworCisvKioKKyAqIGxpbVByb2Nlc3NNbG1QdXJnZVN0YUluZCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3NlcyBNTE1fUFVSR0VfU1RBX0lORAorICogbWVzc2FnZSBmcm9tIE1MTSBTdGF0ZSBtYWNoaW5lLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2dCdWYgICAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltUHJvY2Vzc01sbVB1cmdlU3RhSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRTaXJSZXN1bHRDb2RlcyAgICAgIHJlc3VsdENvZGU7CisgICAgdHBMaW1NbG1QdXJnZVN0YUluZCAgcE1sbVB1cmdlU3RhSW5kOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgIHBzZXNzaW9uRW50cnk7CisjaWYgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICB0U2lyTWFjQWRkciAgICAgICAgIG51bGxNYWNBZGRyID0gezAsIDAsIDAsIDAsIDAsIDB9OworI2VuZGlmCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwTWxtUHVyZ2VTdGFJbmQgPSAodHBMaW1NbG1QdXJnZVN0YUluZCkgcE1zZ0J1ZjsKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBNbG1QdXJnZVN0YUluZC0+c2Vzc2lvbklkKSk9PU5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIGJzc0lkXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFB1cmdlIFNUQSBpbmRpY2F0aW9uIGZyb20gTUxNCisgICAgcmVzdWx0Q29kZSA9ICh0U2lyUmVzdWx0Q29kZXMpIHBNbG1QdXJnZVN0YUluZC0+cmVhc29uQ29kZTsKKyAgICBzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fU1RBX0lOX0lCU1NfUk9MRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVMSU1fU1RBX1JPTEU6CisgICAgICAgIGNhc2UgZUxJTV9CVF9BTVBfU1RBX1JPTEU6CisgICAgICAgIGRlZmF1bHQ6IC8vIGVMSU1fQVBfUk9MRQorICAgICAgICAgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpICYmCisgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX1NNRV9XVF9ESVNBU1NPQ19TVEFURSkgJiYKKyAgICAgICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgKiBQdXJnZSBTVEEgaW5kaWNhdGlvbgorICAgICAgICAgICAgICAgICAqIGZyb20gTUxNIGluIG90aGVyIHN0YXRlcy4KKyAgICAgICAgICAgICAgICAgKiBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgTUxNX1BVUkdFX1NUQV9JTkQgaW4gc3RhdGUgJVhcbiIpLAorICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTspCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgiKioqIFBvbGFyaXMgY2xlYW51cCBjb21wbGV0ZWQgZm9yIHN0YUlkPSVkICoqKlxuIiksCisgICAgICAgICAgICAgICBwTWxtUHVyZ2VTdGFJbmQtPmFpZCk7KQorICAgICAgICAgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpfHwocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9JRExFX1NUQVRFOworICAgICAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworCisjaWYgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICAgICAgICAgICAgICAvLyBXaGVuZXZlciB0aGVyZSBpcyBhIGRpc2Fzc29jIG5vdGlmaWNhdGlvbiwgbWFrZSBzdXJlIHRoZSBic3NJZCBpcyBjbGVhcmVkIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc3RhdGlvbiBmaW5kcyB0aGUgc2FtZSBBUCB0byB3aGljaCBpdCB3YXMgYXNzb2NpYXRlZCwgaXQgY2FuIHRyeSB0byBhc3NvY2lhdGUKKyAgICAgICAgICAgICAgICAvLyB3aXRoIGl0IGFnYWluLiBJZiB0aGlzIGlzIG5vdCBkb25lLCB0aGUgYmVhY29ucy9wcm9iZSByc3AgZnJvbSB0aGlzIEFQIHdpbGwgbm90IGJlIGdpdmVuCisgICAgICAgICAgICAgICAgLy8gdXAgdG8gV1NNIGFuZCBpdCBuZXZlciBzZWUgdGhpcyBpcyBBUCB1bmxlc3MgYSBjZ2EvcmVib290IGlzIGRvbmUuCisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ0xpbUJzc2lkLCBudWxsTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgICAgICAgICAgaWYgKGNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX0JTU0lELCBudWxsTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDb3VsZCBub3QgdXBkYXRlIEJTU0lEIG9uIENGRyIpKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwTWxtUHVyZ2VTdGFJbmQtPnB1cmdlVHJpZ2dlciA9PSBlTElNX1BFRVJfRU5USVRZX0RFQVVUSCkKKyAgICAgICAgICAgIHsKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgICAgICAgICAgICAgIC8vIEJQIGRlYXV0aGVudGljYXRlZCBieSBBUCBvciB2aWNlIHZlcnNhCisgICAgICAgICAgICAgICAgLy8gU2VuZCBTTUVfRElTQVNTT0NfSU5EIHRvIGhvc3QuCisgICAgICAgICAgICAgICAgbGltU2VuZFNtZURpc2Fzc29jTnRmKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWxtUHVyZ2VTdGFJbmQtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNbG1QdXJnZVN0YUluZC0+cHVyZ2VUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbVB1cmdlU3RhSW5kLT5haWQscHNlc3Npb25FbnRyeSk7CisjZWxzZQorICAgICAgICAgICAgICAgIGxpbVNlbmRTbWVEZWF1dGhOdGYocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWxtUHVyZ2VTdGFJbmQtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbVB1cmdlU3RhSW5kLT5wdXJnZVRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbVB1cmdlU3RhSW5kLT5haWQscHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGltU2VuZFNtZURpc2Fzc29jTnRmKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWxtUHVyZ2VTdGFJbmQtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNbG1QdXJnZVN0YUluZC0+cHVyZ2VUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbVB1cmdlU3RhSW5kLT5haWQscHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQscHNlc3Npb25FbnRyeSk7CisgICAgfSAvLyBlbmQgc3dpdGNoIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKQorfSAvKioqIGVuZCBsaW1Qcm9jZXNzTWxtUHVyZ2VTdGFJbmQoKSAqKiovCisKKy8qKgorICogbGltUHJvY2Vzc01sbVNldEtleXNDbmYoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzZXMgTUxNX1NFVEtFWVNfQ05GCisgKiBtZXNzYWdlIGZyb20gTUxNIFN0YXRlIG1hY2hpbmUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcE1zZ0J1ZiAgICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1Qcm9jZXNzTWxtU2V0S2V5c0NuZih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICAvLyBQcmVwYXJlIGFuZCBzZW5kIFNNRV9TRVRDT05URVhUX1JTUCBtZXNzYWdlCisgICAgdExpbU1sbVNldEtleXNDbmYgICpwTWxtU2V0S2V5c0NuZjsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgcHNlc3Npb25FbnRyeTsKKworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTExcbiIpKTspCisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcE1sbVNldEtleXNDbmYgPSAodExpbU1sbVNldEtleXNDbmYgKikgcE1zZ0J1ZjsKKyAgICBpZiAoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgcE1sbVNldEtleXNDbmYtPnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkIFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsaW1Mb2coIHBNYWMsIExPRzEsCisgICAgICAgIEZMKCJSZWNlaXZlZCBNTE1fU0VUS0VZU19DTkYgd2l0aCByZXN1bHRDb2RlID0gJWRcbiIpLAorICAgICAgICBwTWxtU2V0S2V5c0NuZi0+cmVzdWx0Q29kZSApOworICAgIGxpbVNlbmRTbWVTZXRDb250ZXh0UnNwKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbVNldEtleXNDbmYtPnBlZXJNYWNBZGRyLAorI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWxtU2V0S2V5c0NuZi0+YWlkLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRTaXJSZXN1bHRDb2RlcykgcE1sbVNldEtleXNDbmYtPnJlc3VsdENvZGUscHNlc3Npb25FbnRyeSxwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7Cit9IC8qKiogZW5kIGxpbVByb2Nlc3NNbG1TZXRLZXlzQ25mKCkgKioqLworLyoqCisgKiBsaW1Qcm9jZXNzTWxtUmVtb3ZlS2V5Q25mKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzc2VzIE1MTV9SRU1PVkVLRVlfQ05GCisgKiBtZXNzYWdlIGZyb20gTUxNIFN0YXRlIG1hY2hpbmUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcE1zZ0J1ZiAgICBBIHBvaW50ZXIgdG8gdGhlIE1MTSBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1Qcm9jZXNzTWxtUmVtb3ZlS2V5Q25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIC8vIFByZXBhcmUgYW5kIHNlbmQgU01FX1JFTU9WRUNPTlRFWFRfUlNQIG1lc3NhZ2UKKyAgICB0TGltTWxtUmVtb3ZlS2V5Q25mICAqcE1sbVJlbW92ZUtleUNuZjsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICBwc2Vzc2lvbkVudHJ5OworCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwTWxtUmVtb3ZlS2V5Q25mID0gKHRMaW1NbG1SZW1vdmVLZXlDbmYgKikgcE1zZ0J1ZjsKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBNbG1SZW1vdmVLZXlDbmYtPnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgic2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbiBJZFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsaW1Mb2coIHBNYWMsIExPRzEsCisgICAgICAgIEZMKCJSZWNlaXZlZCBNTE1fUkVNT1ZFS0VZU19DTkYgd2l0aCByZXN1bHRDb2RlID0gJWRcbiIpLAorICAgICAgICBwTWxtUmVtb3ZlS2V5Q25mLT5yZXN1bHRDb2RlICk7CisgICAgbGltU2VuZFNtZVJlbW92ZUtleVJzcChwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNbG1SZW1vdmVLZXlDbmYtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0U2lyUmVzdWx0Q29kZXMpIHBNbG1SZW1vdmVLZXlDbmYtPnJlc3VsdENvZGUscHNlc3Npb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQscHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7Cit9IC8qKiogZW5kIGxpbVByb2Nlc3NNbG1SZW1vdmVLZXlDbmYoKSAqKiovCisKKworLyoqCisgKiBsaW1IYW5kbGVTbWVKb2luUmVzdWx0KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBqb2luL2F1dGgvYXNzb2MgZmFpbHVyZXMKKyAqIHVwb24gcmVjZWl2aW5nIE1MTV9KT0lOL0FVVEgvQVNTT0NfQ05GIHdpdGggYSBmYWlsdXJlIGNvZGUgb3IKKyAqIE1MTV9BU1NPQ19DTkYgd2l0aCBhIHN1Y2Nlc3MgY29kZSBpbiBjYXNlIG9mIFNUQSByb2xlIGFuZAorICogTUxNX0pPSU5fQ05GIHdpdGggc3VjY2VzcyBpbiBjYXNlIG9mIFNUQSBpbiBJQlNTIHJvbGUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHJlc3VsdENvZGUgICBGYWlsdXJlIGNvZGUgdG8gYmUgc2VudAorICoKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2xpbUhhbmRsZVNtZUpvaW5SZXN1bHQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUsIHRBTklfVTE2IHByb3RTdGF0dXNDb2RlLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzID0gTlVMTDsKKyAgICB0QU5JX1U4ICAgICAgICAgc21lc2Vzc2lvbklkOworICAgIHRBTklfVTE2ICAgICAgICBzbWV0cmFuc2FjdGlvbklkOworCisgICAgLyogTmV3bHkgQWRkZWQgb24gb2N0IDExIHRoKi8KKyAgICBpZihwc2Vzc2lvbkVudHJ5ID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoInBzZXNzaW9uRW50cnkgaXMgTlVMTCBcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc21lc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworICAgIHNtZXRyYW5zYWN0aW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkOworICAgIC8qIFdoZW4gYXNzb2NpYXRpb25zIGlzIGZhaWxlZCAsIGRlbGV0ZSB0aGUgc2Vzc2lvbiBjcmVhdGVkICBhbmQgcGFzcyBOVUxMICB0byAgbGltc2VuZHNtZUpvaW5SZWFzc29jUnNwKCkgKi8KKyAgICBpZihyZXN1bHRDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgeworICAgICAgICAgIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgICAgICAgIGlmIChwU3RhRHMgIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb24gPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT047CisgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIgPSBlTElNX0pPSU5fRkFJTFVSRTsKKyAgICAgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5yZXN1bHRDb2RlID0gcmVzdWx0Q29kZTsKKyAgICAgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5wcm90U3RhdHVzQ29kZSA9IHByb3RTdGF0dXNDb2RlOworICAgICAgICAgICAgLy9Eb25lOiA3LTI3LTIwMDkuIEpJTV9GSVhfTUU6IGF0IHRoZSBlbmQgb2YgbGltQ2xlYW51cFJ4UGF0aCwgbWFrZSBzdXJlIFBFIGlzIHNlbmRpbmcgZVdOSV9TTUVfSk9JTl9SU1AgdG8gU01FCisgICAgICAgICAgICBsaW1DbGVhbnVwUnhQYXRoKHBNYWMsIHBTdGFEcywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcSk7CisgICAgcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEgPSBOVUxMOworICAgIC8vRGVsZXRlIHRlaCBzZXNzaW9uIGlmIEpPSU4gZmFpbHVyZSBvY2N1cnJlZC4KKyAgICBpZihyZXN1bHRDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgeworICAgICAgICBpZihOVUxMICE9IHBzZXNzaW9uRW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBlRGVsZXRlU2Vzc2lvbihwTWFjLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgbGltU2VuZFNtZUpvaW5SZWFzc29jUnNwKHBNYWMsIGVXTklfU01FX0pPSU5fUlNQLCByZXN1bHRDb2RlLCBwcm90U3RhdHVzQ29kZSxwc2Vzc2lvbkVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lc2Vzc2lvbklkLCAgc21ldHJhbnNhY3Rpb25JZCk7Cit9IC8qKiogZW5kIGxpbUhhbmRsZVNtZUpvaW5SZXN1bHQoKSAqKiovCisKKy8qKgorICAqIGxpbVByb2Nlc3NNbG1BZGRTdGFSc3AoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIGEgV0RBX0FERF9TVEFfUlNQIGZyb20gSEFMLgorICogVXBvbiByZWNlaXB0IG9mIHRoaXMgbWVzc2FnZSBmcm9tIEhBTCwgTUxNRSAtCisgKiA+IERldGVybWluZXMgdGhlICJzdGF0ZSIgaW4gd2hpY2ggdGhpcyBtZXNzYWdlIHdhcyByZWNlaXZlZAorICogPiBGb3J3YXJkcyBpdCB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2sKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHRTaXJNc2dRICBUaGUgTXNnUSBoZWFkZXIsIHdoaWNoIGNvbnRhaW5zIHRoZSByZXNwb25zZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBsaW1Qcm9jZXNzTWxtQWRkU3RhUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ICkKK3sKKyAgICAvL3dlIG5lZWQgdG8gcHJvY2VzcyB0aGUgZGVmZXJyZWQgbWVzc2FnZSBzaW5jZSB0aGUgaW5pdGlhdGluZyByZXEuIHRoZXJlIG1pZ2h0IGJlIG5lc3RlZCByZXF1ZXN0LgorICAgIC8vaW4gdGhlIGNhc2Ugb2YgbmVzdGVkIHJlcXVlc3QgdGhlIG5ldyByZXF1ZXN0IGluaXRpYXRlZCBmcm9tIHRoZSByZXNwb25zZSB3aWxsIHRha2UgY2FyZSBvZiByZXNldHRpbmcKKyAgICAvL3RoZSBkZWZmZXJlZCBmbGFnLgorICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgeworICAgICAgICBsaW1Qcm9jZXNzQXBNbG1BZGRTdGFSc3AocE1hYywgbGltTXNnUSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorI2VuZGlmCisgICAgKQorICAgIHsKKyAgICAgICAgbGltUHJvY2Vzc0J0QW1wQXBNbG1BZGRTdGFSc3AocE1hYywgbGltTXNnUSxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgIGxpbVByb2Nlc3NTdGFNbG1BZGRTdGFSc3AocE1hYywgbGltTXNnUSxwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZgorfQordm9pZCBsaW1Qcm9jZXNzU3RhTWxtQWRkU3RhUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSAsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0TGltTWxtQXNzb2NDbmYgbWxtQXNzb2NDbmY7CisgICAgdHBEcGhIYXNoTm9kZSAgIHBTdGFEczsKKyAgICB0QU5JX1UzMiAgICAgICAgbWVzZ1R5cGUgPSBMSU1fTUxNX0FTU09DX0NORjsKKyAgICB0cEFkZFN0YVBhcmFtcyAgcEFkZFN0YVBhcmFtcyA9ICh0cEFkZFN0YVBhcmFtcykgbGltTXNnUS0+Ym9keXB0cjsKKworICAgIGlmKE5VTEwgPT0gcEFkZFN0YVBhcmFtcyApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiRW5jb3VudGVyZWQgTlVMTCBQb2ludGVyXG4iICkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHBBZGRTdGFQYXJhbXMtPnN0YXR1cyApCisgICAgeworICAgICAgICBpZiggZUxJTV9NTE1fV1RfQUREX1NUQV9SU1BfU1RBVEUgIT0gcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVE9ETzogYW55IHJlc3BvbnNlIHRvIGJlIHNlbnQgb3V0IGhlcmUgPworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgIEZMKCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBXREFfQUREX1NUQV9SU1AgaW4gc3RhdGUgJVhcbiIgKSwKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisgICAgICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9TTUVfUkVGVVNFRDsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEUpCisgICAgICAgICAgICAgbWVzZ1R5cGUgPSBMSU1fTUxNX1JFQVNTT0NfQ05GOworICAgICAgICAvLworICAgICAgICAvLyBVcGRhdGUgdGhlIERQSCBIYXNoIEVudHJ5IGZvciB0aGlzIFNUQQorICAgICAgICAvLyB3aXRoIHByb3BlciBzdGF0ZSBpbmZvCisgICAgICAgIC8vCisgICAgICAgIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeSggcE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICAgICAgaWYoIE5VTEwgIT0gcFN0YURzKQorICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgICAgRkwoICJVbmFibGUgdG8gZ2V0IHRoZSBEUEggSGFzaCBFbnRyeSBmb3IgQUlEIC0gJWRcbiIgKSwKKyAgICAgICAgICAgIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKyAgICAgICAgLyoKKyAgICAgICAgKiBTdG9yaW5nIHRoZSBzZWxmIFN0YUluZGV4KEdlbmVyYXRlZCBieSBIQUwpIGluIHNlc3Npb24gY29udGV4dCwKKyAgICAgICAgKiBpbnN0ZWFkIG9mIHN0b3JpbmcgaXQgaW4gRFBIIEhhc2ggZW50cnkgZm9yIFNlbGYgU1RBLgorICAgICAgICAqIERQSCBlbnRyeSBmb3IgdGhlIHNlbGYgU1RBIHN0b3JlcyB0aGUgc3RhIGluZGV4IGZvciB0aGUgQlNTIGVudHJ5CisgICAgICAgICogdG8gd2hpY2ggdGhlIFNUQSBpcyBhc3NvY2lhdGVkLgorICAgICAgICAqLworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zdGFJZCA9IHBBZGRTdGFQYXJhbXMtPnN0YUlkeDsKKyAgICAgICAgLy9pZiB0aGUgQXNzb2NSc3AgZnJhbWUgaXMgbm90IGFja25vd2xlZGdlZCwgdGhlbiBrZWVwIGFsaXZlIHRpbWVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBzdGF0ZQorICAgICAgICBsaW1SZWFjdGl2YXRlSGVhcnRCZWF0VGltZXIocE1hYywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX0tFRVBBTElWRV9USU1FUikpOworCisgICAgICAgIC8vYXNzaWduIHRoZSBzZXNzaW9uSWQgdG8gdGhlIHRpbWVyIE9iamVjdAorICAgICAgICBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1LZWVwYWxpdmVUaW1lci5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1LZWVwYWxpdmVUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ2Fubm90IGFjdGl2YXRlIGtlZXBhbGl2ZSB0aW1lci5cbiIpKTsKKyNpZmRlZiBXTEFOX0RFQlVHCisgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtTGlua0VzdHMrKzsKKyNlbmRpZgorICAgICAgICAvLyBSZXR1cm4gQXNzb2MgY29uZmlybSB0byBTTUUgd2l0aCBzdWNjZXNzCisgICAgICAgIC8vIEZJWE1FX0dFTjQgLSBOZWVkIHRoZSBjb3JyZWN0IEFTU09DIFJTUCBjb2RlIHRvCisgICAgICAgIC8vIGJlIHBhc3NlZCBpbiBoZXJlLi4uLgorICAgICAgICAvL21sbUFzc29jQ25mLnJlc3VsdENvZGUgPSAodFNpclJlc3VsdENvZGVzKSBhc3NvYy5zdGF0dXNDb2RlOworICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCggIkFERF9TVEEgZmFpbGVkIVxuIikpOworICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9TTUVfUkVGVVNFRDsKKyAgICB9CitlbmQ6CisgICAgaWYoIDAgIT0gbGltTXNnUS0+Ym9keXB0ciApCisgICAgeworICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcEFkZFN0YVBhcmFtcyApOworICAgIH0KKyAgICAvKiBVcGRhdGluZyBQRSBzZXNzaW9uIElkKi8KKyAgICBtbG1Bc3NvY0NuZi5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICBsaW1Qb3N0U21lTWVzc2FnZSggcE1hYywgbWVzZ1R5cGUsICh0QU5JX1UzMiAqKSAmbWxtQXNzb2NDbmYgKTsKKyAgICByZXR1cm47Cit9Cit2b2lkIGxpbVByb2Nlc3NNbG1EZWxCc3NSc3AoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgLy93ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIGRlZmVycmVkIG1lc3NhZ2Ugc2luY2UgdGhlIGluaXRpYXRpbmcgcmVxLiB0aGVyZSBtaWdodCBiZSBuZXN0ZWQgcmVxdWVzdC4KKyAgLy9pbiB0aGUgY2FzZSBvZiBuZXN0ZWQgcmVxdWVzdCB0aGUgbmV3IHJlcXVlc3QgaW5pdGlhdGVkIGZyb20gdGhlIHJlc3BvbnNlIHdpbGwgdGFrZSBjYXJlIG9mIHJlc2V0dGluZworICAvL3RoZSBkZWZmZXJlZCBmbGFnLgorICAgLy8gdHBQRVNlc3Npb24gICAgICAgICBwc2Vzc2lvbkVudHJ5OworICAvLyAgdHBEZWxldGVCc3NQYXJhbXMgICBwRGVsZXRlQnNzUGFyYW1zID0oIHRwRGVsZXRlQnNzUGFyYW1zKWxpbU1zZ1EtPmJvZHlwdHI7CisgICAvLyBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBEZWxldGVCc3NQYXJhbXMtPnNlc3Npb25JZCkpID09IE5VTEwpCisgIC8vICB7CisgICAvLyAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIlNlc3Npb24gZGVvcyBub3QgZXhpc3Qgd2l0aCBnaXZlbiBzZXNzaW9uSWRcbiIgKSk7CisgICAvLyAgICAgcmV0dXJuOworICAvLyAgfQorICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKyAjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkKKyAgICB7CisgICAgICAgIGxpbVByb2Nlc3NBcE1sbURlbEJzc1JzcChwTWFjLCBsaW1Nc2dRKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKSAgfHwKKyAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgIHx8IChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkKKyNlbmRpZgorICAgICAgICAgKSAmJgorICAgICAgICAocHNlc3Npb25FbnRyeS0+c3RhdHlwZUZvckJzcyA9PSBTVEFfRU5UUllfU0VMRikpCisgICAgeworICAgICAgICBsaW1Qcm9jZXNzQnRBbXBBcE1sbURlbEJzc1JzcChwTWFjLCBsaW1Nc2dRLHBzZXNzaW9uRW50cnkpOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQpIHx8IGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgbGltUHJvY2Vzc1N0YU1sbURlbEJzc1JzcChwTWFjLCBsaW1Nc2dRLHBzZXNzaW9uRW50cnkpOworI2VuZGlmCit9CisKK3ZvaWQgbGltUHJvY2Vzc1N0YU1sbURlbEJzc1JzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0cERlbGV0ZUJzc1BhcmFtcyBwRGVsQnNzUGFyYW1zID0gICAodHBEZWxldGVCc3NQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSAgICAgICAgICAgICAgZHBoR2V0SGFzaEVudHJ5KHBNYWMsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGUgPSAgICAgICAgZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBwRGVsQnNzUGFyYW1zLT5zdGF0dXMgKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgICAgICAgICAgICBGTCggIlNUQSByZWNlaXZlZCB0aGUgREVMX0JTU19SU1AgZm9yIEJTU0lEOiAlWC5cbiIpLHBEZWxCc3NQYXJhbXMtPmJzc0lkeCk7KQorICAgICAgICBpZiAobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19JRExFX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKyAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgTlVMTCwgTlVMTCkgIT0gZVNJUl9TVUNDRVNTKQorCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiRmFpbHVyZSBpbiBzZXR0aW5nIGxpbmsgc3RhdGUgdG8gSURMRVxuIikpOykKKyAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYocFN0YURzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJEUEggRW50cnkgZm9yIFNUQSAxIG1pc3NpbmcuXG4iKSk7CisgICAgICAgICAgICBzdGF0dXNDb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgICBpZiggZUxJTV9NTE1fV1RfREVMX0JTU19SU1BfU1RBVEUgIT0gcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIlJlY2VpdmVkIHVuZXhwZWN0ZWQgV0RBX0RFTF9CU1NfUlNQIGluIHN0YXRlICVYXG4iICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpOykKKyAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgUEVMT0cxKGxpbUxvZyggcE1hYywgTE9HMSwgRkwoIlNUQSBBc3NvY0lEICVkIE1BQyAiKSwgcFN0YURzLT5hc3NvY0lkICk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIExPRzEpOykKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCggIkRFTCBCU1MgZmFpbGVkIVxuIiApICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICBlbmQ6CisgICAgIGlmKCAwICE9IGxpbU1zZ1EtPmJvZHlwdHIgKQorICAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBEZWxCc3NQYXJhbXMgKTsKKyAgICAgfQorICAgIGlmKHBTdGFEcyA9PSBOVUxMKQorICAgICAgICAgIHJldHVybjsKKyAgICBpZiAoICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAgPT0gZUxJTV9TVEFfUk9MRSkgfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSkgJiYKKyAgICAgICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEUgICYmCisgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSkgJiYKKyAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyICE9IGVMSU1fSk9JTl9GQUlMVVJFKQorICAgeworICAgICAgICAvKiogVGhlIENhc2Ugd2hlcmUgdGhlIERlbEJzcyBpcyBpbnZva2VkIGZyb20KKyAgICAgICAgKiAgIGNvbnRleHQgb2Ygb3RoZXIgdGhhbiBub3JtYWwgRGlzQXNzb2MgLyBEZWF1dGggT1IKKyAgICAgICAgKiAgYXMgcGFydCBvZiBKb2luIEZhaWx1cmUuCisgICAgICAgICovCisgICAgICAgIGxpbUhhbmRsZURlbEJzc0luUmVBc3NvY0NvbnRleHQocE1hYywgcFN0YURzLHBzZXNzaW9uRW50cnkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxpbVByZXBhcmVBbmRTZW5kRGVsU3RhQ25mKHBNYWMsIHBTdGFEcywgc3RhdHVzQ29kZSxwc2Vzc2lvbkVudHJ5KTsKKyAgICByZXR1cm47Cit9CisKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKK3ZvaWQgbGltUHJvY2Vzc0FwTWxtRGVsQnNzUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSkKK3sKKyAgICB0U2lyUmVzdWx0Q29kZXMgcmMgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgIHRwRGVsZXRlQnNzUGFyYW1zIHBEZWxCc3MgPSAodHBEZWxldGVCc3NQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisgICAgaWYgKHBEZWxCc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkJTUzogREVMX0JTU19SU1Agd2l0aCBubyBib2R5IVxuIikpOykKKyAgICAgICAgcmMgPSBlU0lSX1NNRV9SRUZVU0VEOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYoIGVMSU1fTUxNX1dUX0RFTF9CU1NfUlNQX1NUQVRFICE9IHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpCisgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICAgRkwoICJSZWNlaXZlZCB1bmV4cGVjdGVkIFdEQV9ERUxfQlNTX1JTUCBpbiBzdGF0ZSAlWFxuIiApLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKTsKKyAgICAgICAgICAgIHJjID0gZVNJUl9TTUVfUkVGVVNFRDsKKyAgICAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmIChwRGVsQnNzLT5zdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQlNTOiBERUxfQlNTX1JTUCBlcnJvciAoJXgpIEJzcyAlZCAiKSwKKyAgICAgICAgICAgICAgIHBEZWxCc3MtPnN0YXR1cywgcERlbEJzcy0+YnNzSWR4KTsKKyAgICAgICAgcmMgPSBlU0lSX1NNRV9TVE9QX0JTU19GQUlMVVJFOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgLy9Ob3QgdXNlZCBmb3Igc3RhdGlvbiBvciBzb2Z0YXAuCisgICAgcmMgPSBsaW1TZXRMaW5rU3RhdGUocE1hYywgZVNJUl9MSU5LX0lETEVfU1RBVEUpOworICAgIGlmKCByYyAhPSBlU0lSX1NVQ0NFU1MgKQorICAgICAgICBnb3RvIGVuZDsKKyAgICAvKiogU29mdG1hYyBtYXkgc2VuZCBhbGwgdGhlIGJ1ZmZlcmVkIHBhY2tldHMgcmlnaHQgYWZ0ZXIgcmVzdW1pbmcgdGhlIHRyYW5zbWlzc2lvbiBoZW5jZQorICAgICAqIHRvIG9jY3VweSB0aGUgbWVkaXVtIGR1cmluZyBub24gY2hhbm5lbCBvY2N1cGFuY3kgcGVyaW9kLiBTbyByZXN1bWUgdGhlIHRyYW5zbWlzc2lvbiBhZnRlcgorICAgICAqIEhBTCBnaXZlcyBiYWNrIHRoZSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBpZiAoTElNX0lTX1JBREFSX0RFVEVDVEVEKHBNYWMpKQorICAgIHsKKyAgICAgICAgIGxpbUZyYW1lVHJhbnNtaXNzaW9uQ29udHJvbChwTWFjLCBlTElNX1RYX0JTU19CVVRfQkVBQ09OLCBlTElNX1JFU1VNRV9UWCk7CisgICAgICAgICBMSU1fU0VUX1JBREFSX0RFVEVDVEVEKHBNYWMsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgfQorICAgIGRwaEhhc2hUYWJsZUNsYXNzSW5pdChwTWFjKTsKKyAgICBsaW1EZWxldGVQcmVBdXRoTGlzdChwTWFjKTsKKyAgICAvL0lzIGl0IG9rIHRvIHB1dCBMSU0gaW50byBJRExFIHN0YXRlLgorICAgIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUtPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKworICAgIGVuZDoKKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NUT1BfQlNTX1JTUCwgcmMpOworICAgIGlmKHBEZWxCc3MgIT0gTlVMTCkKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcERlbEJzcyApOworfQorI2VuZGlmCisvKiBUaGlzIGNvZGUgaXMgc2FtZSBhcyBsaW1Qcm9jZXNzQXBNbG1EZWxCc3NSc3AgdXNlZCBmb3IgQlQtQU1QICAqLwordm9pZCBsaW1Qcm9jZXNzQnRBbXBBcE1sbURlbEJzc1JzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyUmVzdWx0Q29kZXMgcmMgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgIHRwRGVsZXRlQnNzUGFyYW1zIHBEZWxCc3MgPSAodHBEZWxldGVCc3NQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgbnVsbEJzc2lkID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisgICAgaWYocHNlc3Npb25FbnRyeSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsRkwoIlNlc3Npb24gZW50cnkgcGFzc2VkIGlzIE5VTExcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwRGVsQnNzID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJCU1M6IERFTF9CU1NfUlNQIHdpdGggbm8gYm9keSFcbiIpKTspCisgICAgICAgIHJjID0gZVNJUl9TTUVfUkVGVVNFRDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPSBlTElNX01MTV9JRExFX1NUQVRFOworICAgIGlmKCBlTElNX01MTV9XVF9ERUxfQlNTX1JTUF9TVEFURSAhPSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkKKyAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgICBGTCggIlJlY2VpdmVkIHVuZXhwZWN0ZWQgV0RBX0RFTF9CU1NfUlNQIGluIHN0YXRlICVYXG4iICkscHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpOworICAgICAgICAgICAgcmMgPSBlU0lSX1NNRV9SRUZVU0VEOworICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKHBEZWxCc3MtPnN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJCU1M6IERFTF9CU1NfUlNQIGVycm9yICgleCkgQnNzICVkICIpLAorICAgICAgICAgICAgICAgcERlbEJzcy0+c3RhdHVzLCBwRGVsQnNzLT5ic3NJZHgpOworICAgICAgICByYyA9IGVTSVJfU01FX1NUT1BfQlNTX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICByYyA9IGxpbVNldExpbmtTdGF0ZShwTWFjLCBlU0lSX0xJTktfSURMRV9TVEFURSwgbnVsbEJzc2lkLAorICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgTlVMTCwgTlVMTCk7CisgICAgaWYoIHJjICE9IGVTSVJfU1VDQ0VTUyApCisgICAgICAgIGdvdG8gZW5kOworICAgIC8qKiBTb2Z0bWFjIG1heSBzZW5kIGFsbCB0aGUgYnVmZmVyZWQgcGFja2V0cyByaWdodCBhZnRlciByZXN1bWluZyB0aGUgdHJhbnNtaXNzaW9uIGhlbmNlCisgICAgICogdG8gb2NjdXB5IHRoZSBtZWRpdW0gZHVyaW5nIG5vbiBjaGFubmVsIG9jY3VwYW5jeSBwZXJpb2QuIFNvIHJlc3VtZSB0aGUgdHJhbnNtaXNzaW9uIGFmdGVyCisgICAgICogSEFMIGdpdmVzIGJhY2sgdGhlIHJlc3BvbnNlLgorICAgICAqLworICAgIGlmIChMSU1fSVNfUkFEQVJfREVURUNURUQocE1hYykpCisgICAgeworICAgICAgICAgbGltRnJhbWVUcmFuc21pc3Npb25Db250cm9sKHBNYWMsIGVMSU1fVFhfQlNTX0JVVF9CRUFDT04sIGVMSU1fUkVTVU1FX1RYKTsKKyAgICAgICAgIExJTV9TRVRfUkFEQVJfREVURUNURUQocE1hYywgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICB9CisgICAgZHBoSGFzaFRhYmxlQ2xhc3NJbml0KHBNYWMsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsvL1RCRC1SQUpFU0ggaXMgaXQgbmVlZGVkID8KKyAgICBsaW1EZWxldGVQcmVBdXRoTGlzdChwTWFjKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgLy9Jbml0aWFsaXplIG51bWJlciBvZiBhc3NvY2lhdGVkIHN0YXRpb25zIGR1cmluZyBjbGVhbnVwCisgICAgcE1hYy0+bGltLmdMaW1OdW1PZkN1cnJlbnRTVEFzID0gMDsKKyNlbmRpZgorICAgIGVuZDoKKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NUT1BfQlNTX1JTUCwgcmMsICBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQsICBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKKyAgICBwZURlbGV0ZVNlc3Npb24ocE1hYywgcHNlc3Npb25FbnRyeSk7CisKKyAgICBpZihwRGVsQnNzICE9IE5VTEwpCisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBEZWxCc3MgKTsKK30KKwordm9pZCBsaW1Qcm9jZXNzTWxtRGVsU3RhUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSApCit7CisgLy93ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIGRlZmVycmVkIG1lc3NhZ2Ugc2luY2UgdGhlIGluaXRpYXRpbmcgcmVxLiB0aGVyZSBtaWdodCBiZSBuZXN0ZWQgcmVxdWVzdC4KKyAgLy9pbiB0aGUgY2FzZSBvZiBuZXN0ZWQgcmVxdWVzdCB0aGUgbmV3IHJlcXVlc3QgaW5pdGlhdGVkIGZyb20gdGhlIHJlc3BvbnNlIHdpbGwgdGFrZSBjYXJlIG9mIHJlc2V0dGluZworICAvL3RoZSBkZWZmZXJlZCBmbGFnLgorCisgICAgdHBQRVNlc3Npb24gICAgICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRwRGVsZXRlU3RhUGFyYW1zICAgcERlbGV0ZVN0YVBhcmFtczsKKyAgICBwRGVsZXRlU3RhUGFyYW1zID0gKHRwRGVsZXRlU3RhUGFyYW1zKWxpbU1zZ1EtPmJvZHlwdHI7CisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwRGVsZXRlU3RhUGFyYW1zLT5zZXNzaW9uSWQpKT09TlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLEZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSURcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgeworICAgICAgICBsaW1Qcm9jZXNzQXBNbG1EZWxTdGFSc3AocE1hYywgbGltTXNnUSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICB8fCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisjZW5kaWYKKyAgICApCisgICAgeworICAgICAgICBsaW1Qcm9jZXNzQnRBbXBBcE1sbURlbFN0YVJzcChwTWFjLGxpbU1zZ1EscHNlc3Npb25FbnRyeSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICBsaW1Qcm9jZXNzU3RhTWxtRGVsU3RhUnNwKHBNYWMsIGxpbU1zZ1EscHNlc3Npb25FbnRyeSk7CisjZW5kaWYKK30KKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKK3ZvaWQgbGltUHJvY2Vzc0FwTWxtRGVsU3RhUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSApCit7CisgICAgdHBEZWxldGVTdGFQYXJhbXMgcERlbFN0YVBhcmFtcyA9ICh0cERlbGV0ZVN0YVBhcmFtcykgbGltTXNnUS0+Ym9keXB0cjsKKyAgICB0cERwaEhhc2hOb2RlIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBwRGVsU3RhUGFyYW1zLT5hc3NvY0lkKTsKKyAgICB0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gcERlbFN0YVBhcmFtcy0+c3RhdHVzICkKKyAgICB7CisgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgICAgICAgICAgICBGTCggIkFQIHJlY2VpdmVkIHRoZSBERUxfU1RBX1JTUCBmb3IgYXNzb2NJRDogJVguXG4iKSwgcERlbFN0YVBhcmFtcy0+YXNzb2NJZCk7CisgICAgICAgIGlmKHBTdGFEcyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgRkwoICJEUEggRW50cnkgZm9yIFNUQSAlWCBtaXNzaW5nLlxuIiksIHBEZWxTdGFQYXJhbXMtPmFzc29jSWQpOworICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgICBpZigoIGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFICE9IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSkgJiYKKyAgICAgICAgICAgICggZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEUgIT0gcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICBGTCggIlJlY2VpdmVkIHVuZXhwZWN0ZWQgV0RBX0RFTF9TVEFfUlNQIGluIHN0YXRlICVzIGZvciBzdGFJZCAlZCBhc3NvY0lkICVkIFxuIiApLAorICAgICAgICAgICAgICAgbGltTWxtU3RhdGVTdHIocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKSwgcFN0YURzLT5zdGFJbmRleCwgcFN0YURzLT5hc3NvY0lkKTsKKyAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIFBFTE9HMShsaW1Mb2coIHBNYWMsIExPRzEsCisgICAgICAgICAgICBGTCgiRGVsZXRlZCBTVEEgQXNzb2NJRCAlZCBzdGFJZCAlZCBNQUMgIiksCisgICAgICAgICAgICBwU3RhRHMtPmFzc29jSWQsIHBTdGFEcy0+c3RhSW5kZXgpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcFN0YURzLT5zdGFBZGRyLCBMT0cxKTspCisgICAgICAgaWYoZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEUgPT0gcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKQorICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAwICE9IGxpbU1zZ1EtPmJvZHlwdHIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwRGVsU3RhUGFyYW1zICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGltQWRkU3RhKHBNYWMsIHBTdGFEcyxwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IEFkZCBTVEEgd2l0aCBhc3NvY0lkPSVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkKTspCisgICAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgVFMgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZC4KKyAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIHJlc3BvbnNlIHdpdGggZXJyb3Igc3RhdHVzLgorICAgICAgICAgICAgICAgIGlmKHBTdGFEcy0+cW9zLmFkZHRzUHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB0cExpbVRzcGVjSW5mbyBwVHNwZWNJbmZvOworICAgICAgICAgICAgICAgICAgaWYoZVNJUl9TVUNDRVNTID09IGxpbVRzcGVjRmluZEJ5QXNzb2NJZChwTWFjLCBwU3RhRHMtPmFzc29jSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTdGFEcy0+cW9zLmFkZHRzLnRzcGVjLCAmcE1hYy0+bGltLnRzcGVjSW5mb1swXSwgJnBUc3BlY0luZm8pKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1BZG1pdENvbnRyb2xEZWxldGVUUyhwTWFjLCBwU3RhRHMtPmFzc29jSWQsICZwU3RhRHMtPnFvcy5hZGR0cy50c3BlYy50c2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcFRzcGVjSW5mby0+aWR4KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGltUmVqZWN0QXNzb2NpYXRpb24ocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgcFN0YURzLT5tbG1TdGFDb250ZXh0LmF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+YXNzb2NJZCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodFNpclJlc3VsdENvZGVzKSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgICAgIEZMKCAiREVMIFNUQSBmYWlsZWQhXG4iICkpOworICAgICAgICBzdGF0dXNDb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKyAgICB9CisgICAgZW5kOgorICAgIGlmKCAwICE9IGxpbU1zZ1EtPmJvZHlwdHIgKQorICAgIHsKKyAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBEZWxTdGFQYXJhbXMgKTsKKyAgICB9CisgICAgaWYoZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEUgIT0gcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKQorICAgIHsKKyAgICAgICBsaW1QcmVwYXJlQW5kU2VuZERlbFN0YUNuZihwTWFjLCBwU3RhRHMsIHN0YXR1c0NvZGUscHNlc3Npb25FbnRyeSk7CisgICAgfQorICAgICAgcmV0dXJuOworfQorI2VuZGlmCisvKiBUaGlzIGlzIHRoZSBjb3B5IG9mICBsaW1Qcm9jZXNzQXBNbG1EZWxTdGFSc3AgdXNlZCBmb3IgQlQtQU1QIFN1cHBvcnQgICovCit2b2lkIGxpbVByb2Nlc3NCdEFtcEFwTWxtRGVsU3RhUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRwRGVsZXRlU3RhUGFyYW1zIHBEZWxTdGFQYXJhbXMgPSAodHBEZWxldGVTdGFQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHM7CisgICAgdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgIGlmKGxpbU1zZ1EtPmJvZHlwdHIgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIHBEZWxTdGFQYXJhbXMtPmFzc29jSWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICBpZihwU3RhRHMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgICBGTCggIkRQSCBFbnRyeSBmb3IgU1RBICVYIG1pc3NpbmcuXG4iKSwgcERlbFN0YVBhcmFtcy0+YXNzb2NJZCk7CisgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX1NNRV9SRUZVU0VEOworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwRGVsU3RhUGFyYW1zICk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBwRGVsU3RhUGFyYW1zLT5zdGF0dXMgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgICAgIEZMKCAiQVAgcmVjZWl2ZWQgdGhlIERFTF9TVEFfUlNQIGZvciBhc3NvY0lEOiAlWC5cbiIpLCBwRGVsU3RhUGFyYW1zLT5hc3NvY0lkKTsKKworICAgICAgICBpZigoIGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFICE9IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSkgJiYKKyAgICAgICAgICAgKCBlTElNX01MTV9XVF9BU1NPQ19ERUxfU1RBX1JTUF9TVEFURSAhPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgICAgICAgIEZMKCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBXREFfREVMX1NUQV9SU1AgaW4gc3RhdGUgJXMgZm9yIHN0YUlkICVkIGFzc29jSWQgJWQgXG4iICksCisgICAgICAgICAgICAgICBsaW1NbG1TdGF0ZVN0cihwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpLCBwU3RhRHMtPnN0YUluZGV4LCBwU3RhRHMtPmFzc29jSWQpOworICAgICAgICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HMSwKKyAgICAgICAgICAgIEZMKCJEZWxldGVkIFNUQSBBc3NvY0lEICVkIHN0YUlkICVkIE1BQyAiKSwKKyAgICAgICAgICAgIHBTdGFEcy0+YXNzb2NJZCwgcFN0YURzLT5zdGFJbmRleCk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIExPRzEpOworICAgICAgIGlmKGVMSU1fTUxNX1dUX0FTU09DX0RFTF9TVEFfUlNQX1NUQVRFID09IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSkKKyAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwRGVsU3RhUGFyYW1zICk7CisgICAgICAgICAgICBpZiAobGltQWRkU3RhKHBNYWMsIHBTdGFEcyxwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IEFkZCBTVEEgd2l0aCBhc3NvY0lkPSVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkKTspCisgICAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgVFMgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZC4KKyAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIHJlc3BvbnNlIHdpdGggZXJyb3Igc3RhdHVzLgorICAgICAgICAgICAgICAgIGlmKHBTdGFEcy0+cW9zLmFkZHRzUHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB0cExpbVRzcGVjSW5mbyBwVHNwZWNJbmZvOworICAgICAgICAgICAgICAgICAgaWYoZVNJUl9TVUNDRVNTID09IGxpbVRzcGVjRmluZEJ5QXNzb2NJZChwTWFjLCBwU3RhRHMtPmFzc29jSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTdGFEcy0+cW9zLmFkZHRzLnRzcGVjLCAmcE1hYy0+bGltLnRzcGVjSW5mb1swXSwgJnBUc3BlY0luZm8pKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1BZG1pdENvbnRyb2xEZWxldGVUUyhwTWFjLCBwU3RhRHMtPmFzc29jSWQsICZwU3RhRHMtPnFvcy5hZGR0cy50c3BlYy50c2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcFRzcGVjSW5mby0+aWR4KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGltUmVqZWN0QXNzb2NpYXRpb24ocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgcFN0YURzLT5tbG1TdGFDb250ZXh0LmF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+YXNzb2NJZCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodFNpclJlc3VsdENvZGVzKSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgICAgIEZMKCAiREVMIFNUQSBmYWlsZWQhXG4iICkpOworICAgICAgICBzdGF0dXNDb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKyAgICB9CisgICAgZW5kOgorICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBEZWxTdGFQYXJhbXMgKTsKKyAgICBpZihlTElNX01MTV9XVF9BU1NPQ19ERUxfU1RBX1JTUF9TVEFURSAhPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUpCisgICAgeworICAgICAgIGxpbVByZXBhcmVBbmRTZW5kRGVsU3RhQ25mKHBNYWMsIHBTdGFEcywgc3RhdHVzQ29kZSxwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGxpbVByb2Nlc3NTdGFNbG1EZWxTdGFSc3AoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFNpclJlc3VsdENvZGVzICAgc3RhdHVzQ29kZSAgICA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgdHBEZWxldGVTdGFQYXJhbXMgcERlbFN0YVBhcmFtcyA9ICh0cERlbGV0ZVN0YVBhcmFtcykgbGltTXNnUS0+Ym9keXB0cjsKKyAgICB0cERwaEhhc2hOb2RlICAgICBwU3RhRHMgICAgICAgID0gTlVMTDsKKyAgICBpZihOVUxMID09IHBEZWxTdGFQYXJhbXMgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIkVuY291bnRlcmVkIE5VTEwgUG9pbnRlclxuIiApKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHBEZWxTdGFQYXJhbXMtPnN0YXR1cyApCisgICAgeworICAgICAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICAgICAgaWYgKHBTdGFEcyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAvL1RPRE86IGFueSByZXNwb25zZSB0byBiZSBzZW50IG91dCBoZXJlID8KKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJEUEggRW50cnkgZm9yIFNUQSAlWCBtaXNzaW5nLlxuIiksCisgICAgICAgICAgICAgICAgICAgIHBEZWxTdGFQYXJhbXMtPmFzc29jSWQpOworICAgICAgICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZiggZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEUgIT0gcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVE9ETzogYW55IHJlc3BvbnNlIHRvIGJlIHNlbnQgb3V0IGhlcmUgPworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIlJlY2VpdmVkIHVuZXhwZWN0ZWQgV0RBX0RFTEVURV9TVEFfUlNQIGluIHN0YXRlICVzXG4iICksCisgICAgICAgICAgICAgICAgICBsaW1NbG1TdGF0ZVN0cihwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkpOworICAgICAgICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBQRUxPRzEobGltTG9nKCBwTWFjLCBMT0cxLCBGTCgiU1RBIEFzc29jSUQgJWQgTUFDICIpLCBwU3RhRHMtPmFzc29jSWQgKTsKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwgTE9HMSk7KQorICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCAiREVMX1NUQV9SU1AgcmVjZWl2ZWQgZm9yIGFzc29jSUQ6ICVYXG4iKSwgcERlbFN0YVBhcmFtcy0+YXNzb2NJZCk7CisgICAgICAgIC8vd2UgbXVzdCBjb21wbGV0ZSBhbGwgY2xlYW51cCByZWxhdGVkIHRvIGRlbFN0YSBiZWZvcmUgY2FsbGluZyBsaW1EZWxCU1MuCisgICAgICAgIGlmKCAwICE9IGxpbU1zZ1EtPmJvZHlwdHIgKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwRGVsU3RhUGFyYW1zICk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzQ29kZSA9ICh0U2lyUmVzdWx0Q29kZXMpIGxpbURlbEJzcyhwTWFjLCBwU3RhRHMsIDAscHNlc3Npb25FbnRyeSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCggIkRFTF9TVEEgZmFpbGVkIVxuIiApKTsKKyAgICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisgICAgfQorZW5kOgorICAgIGlmKCAwICE9IGxpbU1zZ1EtPmJvZHlwdHIgKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcERlbFN0YVBhcmFtcyApOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCit2b2lkIGxpbVByb2Nlc3NBcE1sbUFkZFN0YVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgKQoreworICAgIHRwQWRkU3RhUGFyYW1zIHBBZGRTdGFQYXJhbXMgPSAodHBBZGRTdGFQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgcEFkZFN0YVBhcmFtcy0+YXNzb2NJZCk7CisgICAgaWYocFN0YURzID09IE5VTEwpCisgICAgeworICAgICAgICAvL1RPRE86IGFueSByZXNwb25zZSB0byBiZSBzZW50IG91dCBoZXJlID8KKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIkRQSCBFbnRyeSBmb3IgU1RBICVYIG1pc3NpbmcuXG4iKSwgcEFkZFN0YVBhcmFtcy0+YXNzb2NJZCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICAvLworICAgIC8vIFRPRE8gJiBGSVhNRV9HRU40CisgICAgLy8gTmVlZCB0byBpbnNwZWN0IHRTaXJNc2dRLnJlc2VydmVkIGZvciBhIHZhbGlkIERpYWxvZyB0b2tlbiEKKyAgICAvLworICAgIC8vVE9ETzogYW55IGNoZWNrIGZvciBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID8KKyAgICBpZiggZUxJTV9NTE1fV1RfQUREX1NUQV9SU1BfU1RBVEUgIT0gcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKQorICAgIHsKKyAgICAgICAgLy9UT0RPOiBhbnkgcmVzcG9uc2UgdG8gYmUgc2VudCBvdXQgaGVyZSA/CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICBGTCggIlJlY2VpdmVkIHVuZXhwZWN0ZWQgV0RBX0FERF9TVEFfUlNQIGluIHN0YXRlICVYXG4iICksCisgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcEFkZFN0YVBhcmFtcy0+c3RhdHVzKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRXJyb3IhIHJjdmQgZGVsU3RhIHJzcCBmcm9tIEhBTCB3aXRoIHN0YXR1cyAlZFxuIikscEFkZFN0YVBhcmFtcy0+c3RhdHVzKTspCisgICAgICAgIGxpbVJlamVjdEFzc29jaWF0aW9uKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwKKyAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisgICAgICAgICAgICAgICAgIHRydWUsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkLCB0cnVlLAorICAgICAgICAgICAgICAgICAodFNpclJlc3VsdENvZGVzKSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgcFN0YURzLT5ic3NJZCA9IHBBZGRTdGFQYXJhbXMtPmJzc0lkeDsKKyAgICBwU3RhRHMtPnN0YUluZGV4ID0gcEFkZFN0YVBhcmFtcy0+c3RhSWR4OworICAgIHBTdGFEcy0+dWNVY2FzdFNpZyAgICA9IHBBZGRTdGFQYXJhbXMtPnVjVWNhc3RTaWc7CisgICAgcFN0YURzLT51Y0JjYXN0U2lnICAgID0gcEFkZFN0YVBhcmFtcy0+dWNCY2FzdFNpZzsKKyAgICBpZihwU3RhRHMtPnFvcy5hZGR0c1ByZXNlbnQpCisgICAgeworICAgICAgICAvL25lZWQgdG8gc2VuZCBoYWxNc2dfQWRkVHMgdG8gSEFMLgorICAgICAgICB0cExpbVRzcGVjSW5mbyBwVHNwZWNJbmZvOworICAgICAgICBpZihlU0lSX1NVQ0NFU1MgPT0KKyAgICAgICAgICAgbGltVHNwZWNGaW5kQnlBc3NvY0lkKHBNYWMsIHBTdGFEcy0+YXNzb2NJZCwgJnBTdGFEcy0+cW9zLmFkZHRzLnRzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBNYWMtPmxpbS50c3BlY0luZm9bMF0sICZwVHNwZWNJbmZvKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoZVNJUl9TVUNDRVNTICE9IGxpbVNlbmRIYWxNc2dBZGRUcyhwTWFjLCBwU3RhRHMtPnN0YUluZGV4LCBwVHNwZWNJbmZvLT5pZHgsIHBTdGFEcy0+cW9zLmFkZHRzLnRzcGVjKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBkZWxldGUgdGhlIFRTIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZC4KKyAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSByZXNwb25zZSB3aXRoIGVycm9yIHN0YXR1cy4KKyAgICAgICAgICAgICAgICBsaW1BZG1pdENvbnRyb2xEZWxldGVUUyhwTWFjLCBwU3RhRHMtPmFzc29jSWQsICZwU3RhRHMtPnFvcy5hZGR0cy50c3BlYy50c2luZm8sIE5VTEwsICZwVHNwZWNJbmZvLT5pZHgpOworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgRkwoImxpbVNlbmRIYWxNc2dBZGRUcyBmYWlsZWQgZm9yIFNUQSB3aXRoIGFzc29jSWQ9JWRcbiIpLAorICAgICAgICAgICAgICAgICBwU3RhRHMtPmFzc29jSWQpOykKKyAgICAgICAgICAgICAgICBsaW1SZWplY3RBc3NvY2lhdGlvbihwTWFjLAorICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+c3RhQWRkciwgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgdHJ1ZSwgcFN0YURzLT5tbG1TdGFDb250ZXh0LmF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+YXNzb2NJZCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICBpZiggMCAhPSBsaW1Nc2dRLT5ib2R5cHRyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBBZGRTdGFQYXJhbXMgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGltRGVsU3RhKHBNYWMsIHBTdGFEcywgdHJ1ZSxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy9pZiB0aGUgQXNzb2NSc3AgZnJhbWUgaXMgbm90IGFja25vd2xlZGdlZCwgdGhlbiBrZWVwIGFsaXZlIHRpbWVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBzdGF0ZQorICAgIHBTdGFEcy0+dmFsaWQgPSAxOworICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEU7CisgICAgUEVMT0cxKGxpbUxvZyggcE1hYywgTE9HMSwKKyAgICAgICAgICAgIEZMKCJTVEEgQXNzb2NJRCAlZCBzdGFJZCAlZCBNQUMgIiksCisgICAgICAgICAgICBwU3RhRHMtPmFzc29jSWQsCisgICAgICAgICAgICBwU3RhRHMtPnN0YUluZGV4KTsKKyAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcFN0YURzLT5zdGFBZGRyLCBMT0cxKTspCisgICAgLy8gU2VuZCBSZS9Bc3NvY2lhdGlvbiBSZXNwb25zZSB3aXRoCisgICAgLy8gc3RhdHVzIGNvZGUgdG8gcmVxdWVzdGluZyBTVEEuCisgICAgbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKHBNYWMsIGVTSVJfU1VDQ0VTUywgcFN0YURzLT5hc3NvY0lkLCBwU3RhRHMtPnN0YUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlLCBwU3RhRHMscHNlc3Npb25FbnRyeSk7CitlbmQ6CisgICAgaWYoIDAgIT0gbGltTXNnUS0+Ym9keXB0ciApCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwQWRkU3RhUGFyYW1zICk7CisgICAgfQorICAgIHJldHVybjsKK30KKyNlbmRpZgorLyogVGhpcyBpcyB0aGUgY29weSBvZiAgbGltUHJvY2Vzc0FwTWxtQWRkU3RhUnNwIGZ1bmN0aW9uIC4uLi4gdXNlZCBmb3IgQlQtQU1QIEFQIFN1cHBvcnQgKi8KK3ZvaWQgbGltUHJvY2Vzc0J0QW1wQXBNbG1BZGRTdGFSc3AoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdHBBZGRTdGFQYXJhbXMgcEFkZFN0YVBhcmFtcyA9ICh0cEFkZFN0YVBhcmFtcykgbGltTXNnUS0+Ym9keXB0cjsKKyAgICB0cERwaEhhc2hOb2RlIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBwQWRkU3RhUGFyYW1zLT5hc3NvY0lkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgaWYocFN0YURzID09IE5VTEwpCisgICAgeworICAgICAgICAvL1RPRE86IGFueSByZXNwb25zZSB0byBiZSBzZW50IG91dCBoZXJlID8KKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIkRQSCBFbnRyeSBmb3IgU1RBICVYIG1pc3NpbmcuXG4iKSwgcEFkZFN0YVBhcmFtcy0+YXNzb2NJZCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICAvLworICAgIC8vIFRPRE8gJiBGSVhNRV9HRU40CisgICAgLy8gTmVlZCB0byBpbnNwZWN0IHRTaXJNc2dRLnJlc2VydmVkIGZvciBhIHZhbGlkIERpYWxvZyB0b2tlbiEKKyAgICAvLworICAgIC8vVE9ETzogYW55IGNoZWNrIGZvciBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID8KKyAgICBpZiggZUxJTV9NTE1fV1RfQUREX1NUQV9SU1BfU1RBVEUgIT0gcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKQorICAgIHsKKyAgICAgICAgLy9UT0RPOiBhbnkgcmVzcG9uc2UgdG8gYmUgc2VudCBvdXQgaGVyZSA/CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICBGTCggIlJlY2VpdmVkIHVuZXhwZWN0ZWQgV0RBX0FERF9TVEFfUlNQIGluIHN0YXRlICVYXG4iICksCisgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcEFkZFN0YVBhcmFtcy0+c3RhdHVzKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRXJyb3IhIHJjdmQgZGVsU3RhIHJzcCBmcm9tIEhBTCB3aXRoIHN0YXR1cyAlZFxuIikscEFkZFN0YVBhcmFtcy0+c3RhdHVzKTspCisgICAgICAgIGxpbVJlamVjdEFzc29jaWF0aW9uKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwKKyAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisgICAgICAgICAgICAgICAgIHRydWUsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkLCB0cnVlLAorICAgICAgICAgICAgICAgICAodFNpclJlc3VsdENvZGVzKSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsCisgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnkpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgcFN0YURzLT5ic3NJZCA9IHBBZGRTdGFQYXJhbXMtPmJzc0lkeDsKKyAgICBwU3RhRHMtPnN0YUluZGV4ID0gcEFkZFN0YVBhcmFtcy0+c3RhSWR4OworICAgIC8vaWYgdGhlIEFzc29jUnNwIGZyYW1lIGlzIG5vdCBhY2tub3dsZWRnZWQsIHRoZW4ga2VlcCBhbGl2ZSB0aW1lciB3aWxsIHRha2UgY2FyZSBvZiB0aGUgc3RhdGUKKyAgICBwU3RhRHMtPnZhbGlkID0gMTsKKyAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgPSBlTElNX01MTV9XVF9BU1NPQ19DTkZfU1RBVEU7CisgICAgbGltTG9nKCBwTWFjLCBMT0cxLAorICAgICAgICAgICAgRkwoIlNUQSBBc3NvY0lEICVkIHN0YUlkICVkIE1BQyAiKSwKKyAgICAgICAgICAgIHBTdGFEcy0+YXNzb2NJZCwKKyAgICAgICAgICAgIHBTdGFEcy0+c3RhSW5kZXgpOworICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIExPRzEpOworCisgICAgLyogRm9yIEJUQU1QLUFQLCB0aGUgZmxvdyBzZXF1ZW5jZSBzaGFsbCBiZToKKyAgICAgKiAxKSBQRSBzZW5kcyBlV05JX1NNRV9BU1NPQ19JTkQgdG8gU01FCisgICAgICogMikgUEUgcmVjZWl2ZXMgZVdOSV9TTUVfQVNTT0NfQ05GIGZyb20gU01FCisgICAgICogMykgQlRBTVAtQVAgc2VuZHMgUmUvQXNzb2NpYXRpb24gUmVzcG9uc2UgdG8gQlRBTVAtU1RBCisgICAgICovCisgICAgbGltU2VuZE1sbUFzc29jSW5kKHBNYWMsIHBTdGFEcywgcHNlc3Npb25FbnRyeSk7CisgICAgLy8gZmFsbCB0aG91Z2ggdG8gcmVjbGFpbSB0aGUgb3JpZ2luYWwgQWRkIFNUQSBSZXNwb25zZSBtZXNzYWdlCitlbmQ6CisgICAgaWYoIDAgIT0gbGltTXNnUS0+Ym9keXB0ciApCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwQWRkU3RhUGFyYW1zICk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoqCisgKiBsaW1Qcm9jZXNzQXBNbG1BZGRCc3NSc3AoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIGEgV0RBX0FERF9CU1NfUlNQIGZyb20gSEFMLgorICogVXBvbiByZWNlaXB0IG9mIHRoaXMgbWVzc2FnZSBmcm9tIEhBTCwgTUxNRSAtCisgKiA+IFZhbGlkYXRlcyB0aGUgcmVzdWx0IG9mIFdEQV9BRERfQlNTX1JFUQorICogPiBJbml0IG90aGVyIHJlbWFpbmluZyBMSU0gdmFyaWFibGVzCisgKiA+IEluaXQgdGhlIEFJRCBwb29sLCBmb3IgdGhhdCBCU1NJRAorICogPiBJbml0IHRoZSBQcmUtQVVUSCBsaXN0LCBmb3IgdGhhdCBCU1NJRAorICogPiBDcmVhdGUgTElNIHRpbWVycywgc3BlY2lmaWMgdG8gdGhhdCBCU1NJRAorICogPiBJbml0IERQSCByZWxhdGVkIHBhcmFtZXRlcnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhhdCBCU1NJRAorICogPiBUT0RPIC0gV2hlbiBkbyB3ZSBkbyB0aGUgYWN0dWFsIGNoYW5nZSBjaGFubmVsPworICoKKyAqTE9HSUM6CisgKiBTTUUgc2VuZHMgZVdOSV9TTUVfU1RBUlRfQlNTX1JFUSB0byBMSU0KKyAqIExJTSBzZW5kcyBMSU1fTUxNX1NUQVJUX1JFUSB0byBNTE1FCisgKiBNTE1FIHNlbmRzIFdEQV9BRERfQlNTX1JFUSB0byBIQUwKKyAqIEhBTCByZXNwb25kcyB3aXRoIFdEQV9BRERfQlNTX1JTUCB0byBNTE1FCisgKiBNTE1FIHJlc3BvbmRzIHdpdGggTElNX01MTV9TVEFSVF9DTkYgdG8gTElNCisgKiBMSU0gcmVzcG9uZHMgd2l0aCBlV05JX1NNRV9TVEFSVF9CU1NfUlNQIHRvIFNNRQorICoKKyAqQVNTVU1QVElPTlM6CisgKiB0U2lyTXNnUS5ib2R5IGlzIGFsbG9jYXRlZCBieSBNTE1FIGR1cmluZyBsaW1Qcm9jZXNzTWxtU3RhcnRSZXEKKyAqIHRTaXJNc2dRLmJvZHkgd2lsbCBub3cgYmUgZnJlZWQgYnkgdGhpcyByb3V0aW5lCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgdFNpck1zZ1EgIFRoZSBNc2dRIGhlYWRlciwgd2hpY2ggY29udGFpbnMgdGhlIHJlc3BvbnNlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc0FwTWxtQWRkQnNzUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSkKK3sKKyAgICB0TGltTWxtU3RhcnRDbmYgbWxtU3RhcnRDbmY7CisgICAgdEFOSV9VMzIgdmFsOworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisvLyAgICB0QU5JX1U4ICAgICBzZXNzaW9uSWQ7CisgICAgdHBBZGRCc3NQYXJhbXMgcEFkZEJzc1BhcmFtcyA9ICh0cEFkZEJzc1BhcmFtcykgbGltTXNnUS0+Ym9keXB0cjsKKyAgICBpZihOVUxMID09IHBBZGRCc3NQYXJhbXMgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIkVuY291bnRlcmVkIE5VTEwgUG9pbnRlclxuIiApKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIC8vVEJEOiBmcmVlIHRoZSBtZW1vcnkgYmVmb3JlIHJldHVybmluZywgZG8gaXQgZm9yIGFsbCBwbGFjZXMgd2hlcmUgbG9va3VwIGZhaWxzLgorICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMscEFkZEJzc1BhcmFtcy0+c2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWRcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogVXBkYXRlIFBFIHNlc3Npb24gSWQqLworICAgIG1sbVN0YXJ0Q25mLnNlc3Npb25JZCA9IHBBZGRCc3NQYXJhbXMtPnNlc3Npb25JZDsKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBwQWRkQnNzUGFyYW1zLT5zdGF0dXMgKQorICAgIHsKKyAgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiV0RBX0FERF9CU1NfUlNQIHJldHVybmVkIHdpdGggZUhBTF9TVEFUVVNfU1VDQ0VTU1xuIikpOykKKyAgICAgICAgaWYgKGxpbVNldExpbmtTdGF0ZShwTWFjLCBlU0lSX0xJTktfQVBfU1RBVEUscHNlc3Npb25FbnRyeS0+YnNzSWQsCisgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MgKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIC8vIFNldCBNTE1FIHN0YXRlCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fQlNTX1NUQVJURURfU1RBVEU7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworICAgICAgICBpZiggZVNJUl9JQlNTX01PREUgPT0gcEFkZEJzc1BhcmFtcy0+YnNzVHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKiBJQlNTIGlzICdhY3RpdmUnIHdoZW4gd2UgcmVjZWl2ZQorICAgICAgICAgICAgICogQmVhY29uIGZyYW1lcyBmcm9tIG90aGVyIFNUQXMgdGhhdCBhcmUgcGFydCBvZiBzYW1lIElCU1MuCisgICAgICAgICAgICAgKiBNYXJrIGludGVybmFsIHN0YXRlIGFzIGluYWN0aXZlIHVudGlsIHRoZW4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbUlic3NBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnN0YXR5cGVGb3JCc3MgPSBTVEFfRU5UUllfUEVFUjsgLy90byBrbm93IHNlc3Npb24gY3JlYXRlZCBmb3Igc2VsZi9wZWVyCisgICAgICAgICAgICBsaW1SZXNldEhCUGt0Q291bnQoIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgICAgIGxpbUhlYXJ0QmVhdERlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX0hFQVJUX0JFQVRfVElNRVIpKTsKKyAgICAgICAgICAgIGlmIChsaW1BY3RpdmF0ZUhlYXJCZWF0VGltZXIocE1hYykgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCBhY3RpdmF0ZSBIZWFydGJlYXQgdGltZXJcbiIpKTsKKyAgICAgICAgfQorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZHggICAgID0gKHRBTklfVTgpIHBBZGRCc3NQYXJhbXMtPmJzc0lkeDsKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9IGVMSU1fQVBfUk9MRTsKKyNlbHNlCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPSBlTElNX1NUQV9JTl9JQlNTX1JPTEU7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgaWYgKCBlU0lSX0lORlJBX0FQX01PREUgPT0gcEFkZEJzc1BhcmFtcy0+YnNzVHlwZSApCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9BUF9ST0xFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID0gZUxJTV9TVEFfSU5fSUJTU19ST0xFOworI2VuZGlmCisgICAgICAgIHNjaEVkY2FQcm9maWxlVXBkYXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICBsaW1Jbml0UHJlQXV0aExpc3QocE1hYyk7CisgICAgICAgIGxpbUluaXRBSURwb29sKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgIC8vIENyZWF0ZSB0aW1lcnMgdXNlZCBieSBMSU0KKyAgICAgICAgaWYgKCFwTWFjLT5saW0uZ0xpbVRpbWVyc0NyZWF0ZWQpCisgICAgICAgICAgICBsaW1DcmVhdGVUaW1lcnMocE1hYyk7CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgbGltIGdsb2JhbCBnTGltVHJpZ2dlckJhY2tncm91bmRTY2FuRHVyaW5nUXVpZXRCc3MgKi8KKyAgICAgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSB3bGFuX2NmZ0dldEludCggcE1hYywgV05JX0NGR19UUklHX1NUQV9CS19TQ0FOLCAmdmFsICkpCisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gZ2V0IFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTiFcbiIpKTsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW5EdXJpbmdRdWlldEJzcyA9ICh2YWwpID8gMSA6IDA7CisgICAgICAgIC8vIEFwcGx5IHByZXZpb3VzbHkgc2V0IGNvbmZpZ3VyYXRpb24gYXQgSFcKKyAgICAgICAgbGltQXBwbHlDb25maWd1cmF0aW9uKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPnN0YUlkID0gcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFJZHg7CisgICAgICAgIG1sbVN0YXJ0Q25mLnJlc3VsdENvZGUgID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIldEQV9BRERfQlNTX1JFUSBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIgKSxwQWRkQnNzUGFyYW1zLT5zdGF0dXMgKTsKKyAgICAgICAgbWxtU3RhcnRDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0hBTF9TRU5EX01FU1NBR0VfRkFJTDsKKyAgICB9CisgICAgbGltUG9zdFNtZU1lc3NhZ2UoIHBNYWMsIExJTV9NTE1fU1RBUlRfQ05GLCAodEFOSV9VMzIgKikgJm1sbVN0YXJ0Q25mICk7CisgICAgZW5kOgorICAgIGlmKCAwICE9IGxpbU1zZ1EtPmJvZHlwdHIgKQorICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwQWRkQnNzUGFyYW1zICk7Cit9CisKKworLyoqCisgKiBsaW1Qcm9jZXNzSWJzc01sbUFkZEJzc1JzcCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgYSBXREFfQUREX0JTU19SU1AgZnJvbSBIQUwuCisgKiBVcG9uIHJlY2VpcHQgb2YgdGhpcyBtZXNzYWdlIGZyb20gSEFMLCBNTE1FIC0KKyAqID4gVmFsaWRhdGVzIHRoZSByZXN1bHQgb2YgV0RBX0FERF9CU1NfUkVRCisgKiA+IEluaXQgb3RoZXIgcmVtYWluaW5nIExJTSB2YXJpYWJsZXMKKyAqID4gSW5pdCB0aGUgQUlEIHBvb2wsIGZvciB0aGF0IEJTU0lECisgKiA+IEluaXQgdGhlIFByZS1BVVRIIGxpc3QsIGZvciB0aGF0IEJTU0lECisgKiA+IENyZWF0ZSBMSU0gdGltZXJzLCBzcGVjaWZpYyB0byB0aGF0IEJTU0lECisgKiA+IEluaXQgRFBIIHJlbGF0ZWQgcGFyYW1ldGVycyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGF0IEJTU0lECisgKiA+IFRPRE8gLSBXaGVuIGRvIHdlIGRvIHRoZSBhY3R1YWwgY2hhbmdlIGNoYW5uZWw/CisgKgorICpMT0dJQzoKKyAqIFNNRSBzZW5kcyBlV05JX1NNRV9TVEFSVF9CU1NfUkVRIHRvIExJTQorICogTElNIHNlbmRzIExJTV9NTE1fU1RBUlRfUkVRIHRvIE1MTUUKKyAqIE1MTUUgc2VuZHMgV0RBX0FERF9CU1NfUkVRIHRvIEhBTAorICogSEFMIHJlc3BvbmRzIHdpdGggV0RBX0FERF9CU1NfUlNQIHRvIE1MTUUKKyAqIE1MTUUgcmVzcG9uZHMgd2l0aCBMSU1fTUxNX1NUQVJUX0NORiB0byBMSU0KKyAqIExJTSByZXNwb25kcyB3aXRoIGVXTklfU01FX1NUQVJUX0JTU19SU1AgdG8gU01FCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIHRTaXJNc2dRLmJvZHkgaXMgYWxsb2NhdGVkIGJ5IE1MTUUgZHVyaW5nIGxpbVByb2Nlc3NNbG1TdGFydFJlcQorICogdFNpck1zZ1EuYm9keSB3aWxsIG5vdyBiZSBmcmVlZCBieSB0aGlzIHJvdXRpbmUKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICB0U2lyTXNnUSAgVGhlIE1zZ1EgaGVhZGVyLCB3aGljaCBjb250YWlucyB0aGUgcmVzcG9uc2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitsaW1Qcm9jZXNzSWJzc01sbUFkZEJzc1JzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdExpbU1sbVN0YXJ0Q25mIG1sbVN0YXJ0Q25mOworICAgIHRwQWRkQnNzUGFyYW1zIHBBZGRCc3NQYXJhbXMgPSAodHBBZGRCc3NQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisgICAgdEFOSV9VMzIgdmFsOworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHBBZGRCc3NQYXJhbXMtPnN0YXR1cyApCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJXREFfQUREX0JTU19SU1AgcmV0dXJuZWQgd2l0aCBlSEFMX1NUQVRVU19TVUNDRVNTXG4iKSk7KQorICAgICAgICBpZiAobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19JQlNTX1NUQVRFLHBzZXNzaW9uRW50cnktPmJzc0lkLAorICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MgKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIC8vIFNldCBNTE1FIHN0YXRlCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fQlNTX1NUQVJURURfU1RBVEU7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworICAgICAgICAvKiogSUJTUyBpcyAnYWN0aXZlJyB3aGVuIHdlIHJlY2VpdmUKKyAgICAgICAgICogQmVhY29uIGZyYW1lcyBmcm9tIG90aGVyIFNUQXMgdGhhdCBhcmUgcGFydCBvZiBzYW1lIElCU1MuCisgICAgICAgICAqIE1hcmsgaW50ZXJuYWwgc3RhdGUgYXMgaW5hY3RpdmUgdW50aWwgdGhlbi4KKyAgICAgICAgICovCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbUlic3NBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgbGltUmVzZXRIQlBrdENvdW50KCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgIC8qIFRpbWVyIHJlbGF0ZWQgZnVuY3Rpb25zIGFyZSBub3QgbW9kaWZpZWQgZm9yIEJULUFNUCA6IFRvIGJlIERvbmUgKi8KKyAgICAgICAgbGltSGVhcnRCZWF0RGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9IRUFSVF9CRUFUX1RJTUVSKSk7CisgICAgICAgIGlmIChsaW1BY3RpdmF0ZUhlYXJCZWF0VGltZXIocE1hYykgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IGFjdGl2YXRlIEhlYXJ0YmVhdCB0aW1lclxuIikpOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZHggICAgID0gKHRBTklfVTgpIHBBZGRCc3NQYXJhbXMtPmJzc0lkeDsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9IGVMSU1fU1RBX0lOX0lCU1NfUk9MRTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+c3RhdHlwZUZvckJzcyA9IFNUQV9FTlRSWV9TRUxGOworICAgICAgICBzY2hFZGNhUHJvZmlsZVVwZGF0ZShwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgLy9UQkQtUkFKRVNIIGxpbUluaXRQcmVhdXRoTGlzdCBzaG91bGQgcmUgcmVtb3ZlZCBmb3IgSUJTUyBhbHNvID8/Pz8/CisgICAgICAgLy9saW1Jbml0UHJlQXV0aExpc3QocE1hYyk7CisgICAgICAgIGxpbUluaXRBSURwb29sKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgIC8vIENyZWF0ZSB0aW1lcnMgdXNlZCBieSBMSU0KKyNpZmRlZiBGSVhNRV9HRU42ICAvL2ZvbGxvd2luZyBjb2RlIG1heSBub3QgYmUgcmVxdWlyZWQsIGFzIGxpbUNyZWF0ZVRpbWVycyBpcyBub3cgaW52b2tlZCBmcm9tIGxpbUluaXRpYWxpemUgKHBlU3RhcnQpCisgICAgICAgIGlmICghcE1hYy0+bGltLmdMaW1UaW1lcnNDcmVhdGVkKQorICAgICAgICAgICAgbGltQ3JlYXRlVGltZXJzKHBNYWMpOworI2VuZGlmCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgbGltIGdsb2JhbCBnTGltVHJpZ2dlckJhY2tncm91bmRTY2FuRHVyaW5nUXVpZXRCc3MgKi8KKyAgICAgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSB3bGFuX2NmZ0dldEludCggcE1hYywgV05JX0NGR19UUklHX1NUQV9CS19TQ0FOLCAmdmFsICkpCisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gZ2V0IFdOSV9DRkdfVFJJR19TVEFfQktfU0NBTiFcbiIpKTsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW5EdXJpbmdRdWlldEJzcyA9ICh2YWwpID8gMSA6IDA7CisgICAgICAgIC8vIEFwcGx5IHByZXZpb3VzbHkgc2V0IGNvbmZpZ3VyYXRpb24gYXQgSFcKKyAgICAgICAgbGltQXBwbHlDb25maWd1cmF0aW9uKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPnN0YUlkID0gcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFJZHg7CisgICAgICAgIG1sbVN0YXJ0Q25mLnJlc3VsdENvZGUgID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICAgICAgLy9JZiBBREQgQlNTIHdhcyBpc3N1ZWQgYXMgcGFydCBvZiBJQlNTIGNvYWxlc2NpbmcsIGRvbid0IHNlbmQgdGhlIG1lc3NhZ2UgdG8gU01FLCBhcyB0aGF0IGlzIGludGVybmFsIHRvIExJTQorICAgICAgICBpZih0cnVlID09IHBNYWMtPmxpbS5nTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZCkKKyAgICAgICAgeworICAgICAgICAgICAgbGltSWJzc0FkZEJzc1JzcFdoZW5Db2FsZXNjaW5nKHBNYWMsIGxpbU1zZ1EtPmJvZHlwdHIsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIldEQV9BRERfQlNTX1JFUSBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIgKSwKKyAgICAgICAgICAgIHBBZGRCc3NQYXJhbXMtPnN0YXR1cyApOworICAgICAgICBtbG1TdGFydENuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfSEFMX1NFTkRfTUVTU0FHRV9GQUlMOworICAgIH0KKyAgICAvL1NlbmQgdGhpcyBtZXNzYWdlIHRvIFNNRSwgd2hlbiBBRERfQlNTIGlzIGluaXRpYXRlZCBieSBTTUUKKyAgICAvL0lmIEFERF9CU1MgaXMgZG9uZSBhcyBwYXJ0IG9mIGNvYWxlc2NpbmcsIHRoaXMgd29uJ3QgaGFwcGVuLgorICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkKi8KKyAgICBtbG1TdGFydENuZi5zZXNzaW9uSWQgPXBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIGxpbVBvc3RTbWVNZXNzYWdlKCBwTWFjLCBMSU1fTUxNX1NUQVJUX0NORiwgKHRBTklfVTMyICopICZtbG1TdGFydENuZiApOworICAgIGVuZDoKKyAgICBpZiggMCAhPSBsaW1Nc2dRLT5ib2R5cHRyICkKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcEFkZEJzc1BhcmFtcyApOworfQorCitzdGF0aWMgdm9pZAorbGltUHJvY2Vzc1N0YU1sbUFkZEJzc1JzcFByZUFzc29jKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSApCit7CisgICAgdHBBZGRCc3NQYXJhbXMgcEFkZEJzc1BhcmFtcyA9ICh0cEFkZEJzc1BhcmFtcykgbGltTXNnUS0+Ym9keXB0cjsKKyAgICB0QW5pQXV0aFR5cGUgICAgICAgY2ZnQXV0aFR5cGUsIGF1dGhNb2RlOworICAgIHRMaW1NbG1BdXRoUmVxICAgICAqcE1sbUF1dGhSZXE7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHBBZGRCc3NQYXJhbXMtPnN0YXR1cyApCisgICAgeworICAgICAgICAgICAgaWYgKChwU3RhRHMgPSBkcGhBZGRIYXNoRW50cnkocE1hYywgcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC5zdGFNYWMsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSkpID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGFkZCBoYXNoIHRhYmxlIGVudHJ5CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IGFkZCBoYXNoIGVudHJ5IGF0IERQSCBmb3IgXG4iKSk7KQorICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YU1hYywgTE9HRSk7CisgICAgICAgICAgICAgICAgZ290byBqb2luRmFpbHVyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkeCAgICAgPSAodEFOSV9VOCkgcEFkZEJzc1BhcmFtcy0+YnNzSWR4OworICAgICAgICAgICAgLy9TdWNjZXNzLCBoYW5kbGUgYmVsb3cKKyAgICAgICAgICAgIHBTdGFEcy0+YnNzSWQgPSBwQWRkQnNzUGFyYW1zLT5ic3NJZHg7CisgICAgICAgICAgICAvL1NUQSBJbmRleChnZW5yIGJ5IEhBTCkgZm9yIHRoZSBCU1MgZW50cnkgaXMgc3RvcmVkIGhlcmUKKyAgICAgICAgICAgIHBTdGFEcy0+c3RhSW5kZXggPSBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YUlkeDsKKyAgICAgICAgICAgIC8vIFRyaWdnZXIgQXV0aGVudGljYXRpb24gd2l0aCBBUAorICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQVVUSEVOVElDQVRJT05fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopICZjZmdBdXRoVHlwZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIENvdWxkIG5vdCBnZXQgQXV0aFR5cGUgZnJvbSBDRkcuCisgICAgICAgICAgICAgICAgICogTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEF1dGhUeXBlXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ZnQXV0aFR5cGUgPT0gZVNJUl9BVVRPX1NXSVRDSCkgCisgICAgICAgICAgICAgICAgYXV0aE1vZGUgPSBlU0lSX09QRU5fU1lTVEVNOyAvLyBUcnkgT3BlbiBBdXRoZW50aWNhdGlvbiBmaXJzdAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGF1dGhNb2RlID0gY2ZnQXV0aFR5cGU7CisKKyAgICAgICAgICAgIC8vIFRyaWdnZXIgTUFDIGJhc2VkIEF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNbG1BdXRoUmVxLCBzaXplb2YodExpbU1sbUF1dGhSZXEpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1BdXRoUmVxXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgIHZhbCA9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19CU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbUF1dGhSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBnZXQgQlNTSUQgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBCU1NJRFxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICAgICAgICAgIHNpckNvcHlNYWNBZGRyKHBNbG1BdXRoUmVxLT5wZWVyTWFjQWRkcixwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyAgICAgICAgICAgIHBNbG1BdXRoUmVxLT5hdXRoVHlwZSA9IGF1dGhNb2RlOworICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopICZwTWxtQXV0aFJlcS0+YXV0aEZhaWx1cmVUaW1lb3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBBdXRoRmFpbHVyZVRpbWVvdXQKKyAgICAgICAgICAgICAgICAgKiB2YWx1ZSBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQXV0aEZhaWx1cmVUaW1lb3V0IHZhbHVlXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTVU5JVF9GSVhfTUU6ICBTZXQgQk9USD8gQXNzdW1lIG5vdC4gUGxlYXNlIHZlcmlmeSBoZXJlIGFuZCBiZWxvdy4KKyAgICAgICAgICAgIC8vcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IGVMSU1fTUxNX0pPSU5FRF9TVEFURTsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSk9JTkVEX1NUQVRFOworICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBlTElNX01MTV9KT0lORURfU1RBVEUpKTsKKyAgICAgICAgICAgIHBNbG1BdXRoUmVxLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgICAgID0gZUxJTV9TTUVfV1RfQVVUSF9TVEFURTsKKyAgICAgICAgICAgIC8vIHJlbWVtYmVyIHN0YUlkIGluIGNhc2Ugb2YgYXNzb2MgdGltZW91dC9mYWlsdXJlIGhhbmRsaW5nCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zdGFJZCA9IHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhSWR4OworCisgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSk7CisgICAgICAgICAgICBsaW1Qb3N0TWxtTWVzc2FnZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9BVVRIX1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSBwTWxtQXV0aFJlcSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCitqb2luRmFpbHVyZToKKyAgICB7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSk7CisKKyAgICAgICAgLy8vIFNlbmQgSm9pbiByZXNwb25zZSB0byBIb3N0CisgICAgICAgIGxpbUhhbmRsZVNtZUpvaW5SZXN1bHQocE1hYywgIGVTSVJfU01FX1JFRlVTRUQsIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywgcHNlc3Npb25FbnRyeSk7CisKKyAgICB9CisKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uIHRvIGhhbmRsZSBXREFfQUREX0JTU19SU1AsIGluIEZUIHJlYXNzb2Mgc3RhdGUuCisgKgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbGltUHJvY2Vzc1N0YU1sbUFkZEJzc1JzcEZUKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRwRHBoSGFzaE5vZGUgcFN0YURzICAgID0gTlVMTDsKKyAgICB0cEFkZEJzc1BhcmFtcyBwQWRkQnNzUGFyYW1zID0gKHRwQWRkQnNzUGFyYW1zKSBsaW1Nc2dRLT5ib2R5cHRyOworICAgIHRwQWRkU3RhUGFyYW1zIHBBZGRTdGFQYXJhbXMgPSBOVUxMOworICAgIHRBTklfVTMyIGxpc3RlbkludGVydmFsID0gV05JX0NGR19MSVNURU5fSU5URVJWQUxfU1RBREVGOworICAgIHRMaW1NbG1SZWFzc29jUmVxICAgICAgICpwTWxtUmVhc3NvY1JlcTsKKyAgICB0TGltTWxtUmVhc3NvY0NuZiAgICAgICBtbG1SZWFzc29jQ25mOyAvLyBrZWVwIHNtZSAKKworICAgIHBNbG1SZWFzc29jUmVxID0gKHRMaW1NbG1SZWFzc29jUmVxICopKHBzZXNzaW9uRW50cnktPnBMaW1NbG1SZWFzc29jUmVxKTsKKworICAgIGlmICggZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfRlRfUkVBU1NPQ19TVEFURSAhPSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSApCisgICAgeworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAoKHBTdGFEcyA9IGRwaEFkZEhhc2hFbnRyeShwTWFjLCBwQWRkQnNzUGFyYW1zLT5ic3NJZCwgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsCisgICAgICAgICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIENvdWxkIG5vdCBhZGQgaGFzaCB0YWJsZSBlbnRyeQorICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgYWRkIGhhc2ggZW50cnkgYXQgRFBIIGZvciBcbiIpKTspCisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YU1hYywgTE9HRSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8vIFNldCB0aGUgZmlsdGVyIHN0YXRlIHRvIHBvc3QgYXNzb2MKKyAgICBpZiAobGltU2V0TGlua1N0YXRlKHBNYWMsIGVTSVJfTElOS19QT1NUQVNTT0NfU1RBVEUsCisgICAgICAgICAgICBwQWRkQnNzUGFyYW1zLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsCisgICAgICAgICAgICBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICBGTCgiRmFpbGVkIHRvIHNldCB0aGUgTGlua1N0YXRlXG4iKSk7KQorICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICAvLyBQcmVwYXJlIGFuZCBzZW5kIFJlYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZQorICAgIC8vIHN0YXJ0IHJlYXNzb2MgdGltZXIuCisgICAgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVhc3NvY0ZhaWx1cmVUaW1lci5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAvLy8gU3RhcnQgcmVhc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyCisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsIDAsIGVMSU1fUkVBU1NPQ19GQUlMX1RJTUVSKSk7CisgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZWFzc29jRmFpbHVyZVRpbWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLy8vIENvdWxkIG5vdCBzdGFydCByZWFzc29jIGZhaWx1cmUgdGltZXIuCisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgRkwoImNvdWxkIG5vdCBzdGFydCBSZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXJcbiIpKTsKKyAgICAgICAgLy8gUmV0dXJuIFJlYXNzb2MgY29uZmlybSB3aXRoCisgICAgICAgIC8vIFJlc291cmNlcyBVbmF2YWlsYWJsZQorICAgICAgICBtbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisgICAgICAgIG1sbVJlYXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVM7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBsaW1TZW5kUmVhc3NvY1JlcVdpdGhGVElFc01nbXRGcmFtZShwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wTGltTWxtUmVhc3NvY1JlcSwgcHNlc3Npb25FbnRyeSk7CisgICAgcHNlc3Npb25FbnRyeS0+bGltUHJldk1sbVN0YXRlID0gcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGU7CisgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9GVF9SRUFTU09DX1JTUF9TVEFURTsKKyAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICBGTCgiU2V0IHRoZSBtbG0gc3RhdGUgdG8gJWQgc2Vzc2lvbj0lZFxuIiksCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCk7KQorCisgICAgcHNlc3Npb25FbnRyeS0+YnNzSWR4ICAgICA9ICh0QU5JX1U4KSBwQWRkQnNzUGFyYW1zLT5ic3NJZHg7CisKKyAgICAvL1N1Y2Nlc3MsIGhhbmRsZSBiZWxvdworICAgIHBTdGFEcy0+YnNzSWQgPSBwQWRkQnNzUGFyYW1zLT5ic3NJZHg7CisgICAgLy9TVEEgSW5kZXgoZ2VuciBieSBIQUwpIGZvciB0aGUgQlNTIGVudHJ5IGlzIHN0b3JlZCBoZXJlCisgICAgcFN0YURzLT5zdGFJbmRleCA9IHBBZGRCc3NQYXJhbXMtPnN0YUNvbnRleHQuc3RhSWR4OworICAgIHBTdGFEcy0+dWNVY2FzdFNpZyAgID0gcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51Y1VjYXN0U2lnOworICAgIHBTdGFEcy0+dWNCY2FzdFNpZyAgID0gcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51Y0JjYXN0U2lnOworCisgICAgLy8gRG93bmdyYWRlIHRoZSBFRENBIHBhcmFtZXRlcnMgaWYgbmVlZGVkCisgICAgbGltU2V0QWN0aXZlRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisKKyAgICAvLyBTZW5kIHRoZSBhY3RpdmUgRURDQSBwYXJhbWV0ZXJzIHRvIEhBTAorICAgIGlmIChwU3RhRHMtPmFuaVBlZXIgPT0gZUFOSV9CT09MRUFOX1RSVUUpCisgICAgeworICAgICAgICBsaW1TZW5kRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwgcFN0YURzLT5ic3NJZCwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW1TZW5kRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwgcFN0YURzLT5ic3NJZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICBycm1DYWNoZU1nbXRUeFBvd2VyKCBwTWFjLCBwQWRkQnNzUGFyYW1zLT50eE1nbXRQb3dlciwgcHNlc3Npb25FbnRyeSApOworI2VuZGlmCisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgICBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopICZwQWRkU3RhUGFyYW1zLCBzaXplb2YoIHRBZGRTdGFQYXJhbXMgKSkpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCAiVW5hYmxlIHRvIFBBTCBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIEFERF9TVEFcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcEFkZFN0YVBhcmFtcywgc2l6ZW9mKHRBZGRTdGFQYXJhbXMpKTsKKworICAgIC8vLyBBZGQgU1RBIGNvbnRleHQgYXQgTUFDIEhXIChCTVUsIFJIUCAmIFRGUCkKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQWRkU3RhUGFyYW1zLT5zdGFNYWMsCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQWRkU3RhUGFyYW1zLT5ic3NJZCwKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICAvLyBVcGRhdGUgdGhpcyB3aGVuIHdlIGdldCByZWFzc29jIHJzcCAsIHdpdGggc3VjY2Vzcy4KKyAgICAvLyBwQWRkU3RhUGFyYW1zLT5hc3NvY0lkID0gcHNlc3Npb25FbnRyeS0+bGltQUlEOworCisgICAgcEFkZFN0YVBhcmFtcy0+c3RhVHlwZSA9IFNUQV9FTlRSWV9TRUxGOworICAgIHBBZGRTdGFQYXJhbXMtPnN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgcEFkZFN0YVBhcmFtcy0+cmVzcFJlcWQgPSAxOworCisgICAgLyogVXBkYXRlICBQRSBzZXNzaW9uIElEICovCisgICAgcEFkZFN0YVBhcmFtcy0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKyAgICAvLyBUaGlzIHdpbGwgaW5kaWNhdGUgSEFMIHRvICJhbGxvY2F0ZSIgYSBuZXcgU1RBIGluZGV4CisgICAgcEFkZFN0YVBhcmFtcy0+c3RhSWR4ID0gSEFMX1NUQV9JTlZBTElEX0lEWDsKKyAgICBwQWRkU3RhUGFyYW1zLT51cGRhdGVTdGEgPSBGQUxTRTsKKworICAgIHBBZGRTdGFQYXJhbXMtPnNob3J0UHJlYW1ibGVTdXBwb3J0ZWQgPSAodEFOSV9VOClwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGU7CisgICAgbGltUG9wdWxhdGVPd25SYXRlU2V0KHBNYWMsICZwQWRkU3RhUGFyYW1zLT5zdXBwb3J0ZWRSYXRlcywgTlVMTCwgZmFsc2UscHNlc3Npb25FbnRyeSk7CisKKyAgICBpZiggcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KQorICAgIHsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+aHRDYXBhYmxlID0gcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5OworI2lmZGVmIERJU0FCTEVfR0ZfRk9SX0lOVEVST1AKKyAgICAgICAgLyoKKyAgICAgICAgICogVG8gcmVzb2x2ZSB0aGUgaW50ZXJvcCBwcm9ibGVtIHdpdGggQnJvYWRjb20gQVAsCisgICAgICAgICAqIHdoZXJlIFRRIFNUQSBjb3VsZCBub3QgcGFzcyB0cmFmZmljIHdpdGggR0YgZW5hYmxlZCwKKyAgICAgICAgICogVFEgU1RBIHdpbGwgZG8gR3JlZW5maWVsZCBvbmx5IHdpdGggVFEgQVAsIGZvcgorICAgICAgICAgKiBldmVyeWJvZHkgZWxzZSBpdCB3aWxsIGJlIHR1cm5lZCBvZmYuCisgICAgICAgICovCisgICAgICAgIGlmKCAocHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEgIT0gTlVMTCkgJiYgKCFwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uYW5pSW5kaWNhdG9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiIFR1cm5pbmcgb2ZmIEdyZWVuZmllbGQsIHdoZW4gYWRkaW5nIHNlbGYgZW50cnkiKSk7CisgICAgICAgICAgICBwQWRkU3RhUGFyYW1zLT5ncmVlbkZpZWxkQ2FwYWJsZSA9IFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZX0RJU0FCTEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIHBBZGRTdGFQYXJhbXMtPmdyZWVuRmllbGRDYXBhYmxlID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfR1JFRU5GSUVMRCwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPnR4Q2hhbm5lbFdpZHRoU2V0ID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfU1VQUE9SVEVEX0NIQU5ORUxfV0lEVEhfU0VULCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+bWltb1BTICAgICAgICAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9NSU1PX1BPV0VSX1NBVkUsIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+cmlmc01vZGUgICAgICAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9SSUZTX01PREUsIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+bHNpZ1R4b3BQcm90ZWN0aW9uID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfTFNJR19UWE9QX1BST1RFQ1RJT04sIHBzZXNzaW9uRW50cnkgKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+ZGVsQkFTdXBwb3J0ICAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9ERUxBWUVEX0JBLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPm1heEFtcGR1RGVuc2l0eSAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfTVBEVV9ERU5TSVRZLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPm1heEFtcGR1U2l6ZSAgID0gbGltR2V0SFRDYXBhYmlsaXR5KHBNYWMsIGVIVF9NQVhfUlhfQU1QRFVfRkFDVE9SLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+bWF4QW1zZHVTaXplICAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9NQVhfQU1TRFVfTEVOR1RILCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPmZEc3NzQ2NrTW9kZTQwTWh6ID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfRFNTU19DQ0tfTU9ERV80ME1IWiwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPmZTaG9ydEdJMjBNaHogICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfU0hPUlRfR0lfMjBNSFosIHBzZXNzaW9uRW50cnkpOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5mU2hvcnRHSTQwTWh6ICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1NIT1JUX0dJXzQwTUhaLCBwc2Vzc2lvbkVudHJ5KTsKKyNlbHNlCisgICAgICAgIHBBZGRTdGFQYXJhbXMtPmdyZWVuRmllbGRDYXBhYmxlID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfR1JFRU5GSUVMRCApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT50eENoYW5uZWxXaWR0aFNldCA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVCApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5taW1vUFMgICAgICAgICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX01JTU9fUE9XRVJfU0FWRSApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5yaWZzTW9kZSAgICAgICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1JJRlNfTU9ERSApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5sc2lnVHhvcFByb3RlY3Rpb24gPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9MU0lHX1RYT1BfUFJPVEVDVElPTiApOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5kZWxCQVN1cHBvcnQgICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX0RFTEFZRURfQkEgKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+bWF4QW1wZHVEZW5zaXR5ICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9NUERVX0RFTlNJVFkgKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+bWF4QW1wZHVTaXplICAgPSBsaW1HZXRIVENhcGFiaWxpdHkocE1hYywgZUhUX01BWF9SWF9BTVBEVV9GQUNUT1IpOworICAgICAgICBwQWRkU3RhUGFyYW1zLT5tYXhBbXNkdVNpemUgICAgICA9IGxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX01BWF9BTVNEVV9MRU5HVEggKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+ZkRzc3NDY2tNb2RlNDBNaHogPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9EU1NTX0NDS19NT0RFXzQwTUhaKTsKKyAgICAgICAgcEFkZFN0YVBhcmFtcy0+ZlNob3J0R0kyME1oeiAgICAgPSBsaW1HZXRIVENhcGFiaWxpdHkoIHBNYWMsIGVIVF9TSE9SVF9HSV8yME1IWik7CisgICAgICAgIHBBZGRTdGFQYXJhbXMtPmZTaG9ydEdJNDBNaHogICAgID0gbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfU0hPUlRfR0lfNDBNSFopOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMLCAmbGlzdGVuSW50ZXJ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDb3VsZG4ndCBnZXQgTElTVEVOX0lOVEVSVkFMXG4iKSk7CisgICAgcEFkZFN0YVBhcmFtcy0+bGlzdGVuSW50ZXJ2YWwgPSAodEFOSV9VMTYpbGlzdGVuSW50ZXJ2YWw7CisKKyAgICBsaW1GaWxsU3VwcG9ydGVkUmF0ZXNJbmZvKHBNYWMsIE5VTEwsICZwQWRkU3RhUGFyYW1zLT5zdXBwb3J0ZWRSYXRlcyxwc2Vzc2lvbkVudHJ5KTsKKworICAgIC8vIExldHMgc2F2ZSB0aGlzIGZvciB3aGVuIHdlIHJlY2VpdmUgdGhlIFJlYXNzb2MgUnNwCisgICAgcE1hYy0+ZnQuZnRQRUNvbnRleHQucEFkZFN0YVJlcSA9IHBBZGRTdGFQYXJhbXM7CisgICAgcmV0dXJuOworCitlbmQ6CisgICAgLy8gRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkIGZvciByZWFzc29jUmVxCisgICAgaWYgKHBNbG1SZWFzc29jUmVxICE9IE5VTEwpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTWxtUmVhc3NvY1JlcSk7CisgICAgfQorICAgIG1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0ZUX1JFQVNTT0NfRkFJTFVSRTsKKyAgICBtbG1SZWFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW8gSWQqLworICAgIG1sbVJlYXNzb2NDbmYuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKyAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX1JFQVNTT0NfQ05GLCAodEFOSV9VMzIgKikgJm1sbVJlYXNzb2NDbmYpOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKworLyoqCisgKiBsaW1Qcm9jZXNzU3RhTWxtQWRkQnNzUnNwKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhIFdEQV9BRERfQlNTX1JTUCBmcm9tIEhBTC4KKyAqIFVwb24gcmVjZWlwdCBvZiB0aGlzIG1lc3NhZ2UgZnJvbSBIQUwsIE1MTUUgLQorICogPiBWYWxpZGF0ZXMgdGhlIHJlc3VsdCBvZiBXREFfQUREX0JTU19SRVEKKyAqID4gTm93LCBzZW5kIGFuIEFERF9TVEEgdG8gSEFMIGFuZCBBREQgdGhlICJsb2NhbCIgU1RBIGl0c2VsZgorICoKKyAqTE9HSUM6CisgKiBNTE1FIGhhZCBzZW50IFdEQV9BRERfQlNTX1JFUSB0byBIQUwKKyAqIEhBTCByZXNwb25kZWQgd2l0aCBXREFfQUREX0JTU19SU1AgdG8gTUxNRQorICogTUxNRSBub3cgc2VuZHMgV0RBX0FERF9TVEFfUkVRIHRvIEhBTAorICoKKyAqQVNTVU1QVElPTlM6CisgKiB0U2lyTXNnUS5ib2R5IGlzIGFsbG9jYXRlZCBieSBNTE1FIGR1cmluZyBsaW1Qcm9jZXNzTWxtSm9pblJlcQorICogdFNpck1zZ1EuYm9keSB3aWxsIG5vdyBiZSBmcmVlZCBieSB0aGlzIHJvdXRpbmUKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICB0U2lyTXNnUSAgVGhlIE1zZ1EgaGVhZGVyLCB3aGljaCBjb250YWlucyB0aGUgcmVzcG9uc2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitsaW1Qcm9jZXNzU3RhTWxtQWRkQnNzUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRwQWRkQnNzUGFyYW1zIHBBZGRCc3NQYXJhbXMgPSAodHBBZGRCc3NQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisgICAgdExpbU1sbUFzc29jQ25mIG1sbUFzc29jQ25mOworICAgIHRBTklfVTMyIG1lc2dUeXBlICAgICAgID0gTElNX01MTV9BU1NPQ19DTkY7CisgICAgdEFOSV9VMzIgc3ViVHlwZSAgICAgICAgPSBMSU1fQVNTT0M7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMgICAgPSBOVUxMOworICAgIHRBTklfVTE2IHN0YUlkeCA9IEhBTF9TVEFfSU5WQUxJRF9JRFg7CisgICAgdEFOSV9VOCB1cGRhdGVTdGEgPSBmYWxzZTsKKyAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlICA9IGVTSVJfU01FX1NVQ0NFU1M7CisKKyAgICBpZihlTElNX01MTV9XVF9BRERfQlNTX1JTUF9QUkVBU1NPQ19TVEFURSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSkKKyAgICB7CisgICAgICAgIC8vRG9uZTogNy0yOC0yMDA5LiBKSU1fRklYX01FOiAgc2Vzc2lvbml6ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uCisgICAgICAgIGxpbVByb2Nlc3NTdGFNbG1BZGRCc3NSc3BQcmVBc3NvYyhwTWFjLCBsaW1Nc2dRLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmKCBlTElNX01MTV9XVF9BRERfQlNTX1JTUF9SRUFTU09DX1NUQVRFID09IHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlICkKKyAgICB7CisgICAgICAgIG1lc2dUeXBlID0gTElNX01MTV9SRUFTU09DX0NORjsKKyAgICAgICAgc3ViVHlwZSA9IExJTV9SRUFTU09DOworICAgICAvL0lmIFJlYXNzb2MgaXMgaGFwcGVuaW5nIGZvciB0aGUgc2FtZSBCU1MsIHRoZW4gdXNlIHRoZSBleGlzdGluZyBTdGFJZCBhbmQgaW5kaWNhdGUgdG8gSEFMCisgICAgIC8vdG8gdXBkYXRlIHRoZSBleGlzdGluZyBTVEEgZW50cnkuCisgICAgIC8vSWYgUmVhc3NvYyBpcyBoYXBwZW5pbmcgZm9yIHRoZSBuZXcgQlNTLCB0aGVuIG9sZCBCU1MgYW5kIFNUQSBlbnRyeSB3b3VsZCBoYXZlIGJlZW4gYWxyZWFkeSBkZWxldGVkCisgICAgIC8vYmVmb3JlIFBFIHRyaWVzIHRvIGFkZCBCU1MgZm9yIHRoZSBuZXcgQlNTLCBzbyBzZXQgdGhlIHVwZGF0ZVN0YSB0byBmYWxzZSBhbmQgcGFzcyBJTlZBTElEIFNUQSBJbmRleC4KKyAgICBpZiAoc2lyQ29tcGFyZU1hY0FkZHIoIHBzZXNzaW9uRW50cnktPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGFJZHggPSBwc2Vzc2lvbkVudHJ5LT5zdGFJZDsKKyAgICAgICAgICAgIHVwZGF0ZVN0YSAgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHBBZGRCc3NQYXJhbXMtPnN0YXR1cyApCisgICAgeworI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICAgICAgaWYoIGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX0ZUX1JFQVNTT0NfU1RBVEUgPT0gcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgKQorICAgICAgICB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIk1sbT0lZCAlZFxuIiksCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsCisgICAgICAgICAgICAgICAgZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUkVBU1NPQ19TVEFURSk7KQorI2VuZGlmCisgICAgICAgICAgICBsaW1Qcm9jZXNzU3RhTWxtQWRkQnNzUnNwRlQoIHBNYWMsIGxpbU1zZ1EsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCisgICAgICAgICAvLyBTZXQgTUxNRSBzdGF0ZQorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FERF9TVEFfUlNQX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+c3RhdHlwZUZvckJzcyA9IFNUQV9FTlRSWV9QRUVSOyAvL3RvIGtub3cgdGhlIHNlc3Npb24gIHN0YXJ0ZWQgZm9yIHNlbGYgb3IgZm9yICBwZWVyIG9jdDZ0aAorICAgICAgICAvLyBOb3csIHNlbmQgV0RBX0FERF9TVEFfUkVRCisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoICJPbiBTVEE6IEFERF9CU1Mgd2FzIHN1Y2Nlc3NmdWxcbiIgKSk7CisgICAgICAgIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgICAgICBpZiAocFN0YURzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCBBZGQgU2VsZiBFbnRyeSBmb3IgdGhlIHN0YXRpb25cbiIpKTspCisgICAgICAgICAgICBtbG1Bc3NvY0NuZi5yZXN1bHRDb2RlID0gKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9TTUVfUkVGVVNFRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkeCAgICAgPSAodEFOSV9VOCkgcEFkZEJzc1BhcmFtcy0+YnNzSWR4OworICAgICAgICAgICAgLy9TdWNjZXNzLCBoYW5kbGUgYmVsb3cKKyAgICAgICAgICAgIHBTdGFEcy0+YnNzSWQgPSBwQWRkQnNzUGFyYW1zLT5ic3NJZHg7CisgICAgICAgICAgICAvL1NUQSBJbmRleChnZW5yIGJ5IEhBTCkgZm9yIHRoZSBCU1MgZW50cnkgaXMgc3RvcmVkIGhlcmUKKyAgICAgICAgICAgIHBTdGFEcy0+c3RhSW5kZXggPSBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YUlkeDsKKyAgICAgICAgICAgIHBTdGFEcy0+dWNVY2FzdFNpZyAgID0gcEFkZEJzc1BhcmFtcy0+c3RhQ29udGV4dC51Y1VjYXN0U2lnOworICAgICAgICAgICAgcFN0YURzLT51Y0JjYXN0U2lnICAgPSBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnVjQmNhc3RTaWc7CisgICAgICAgICAgICAvLyBEb3duZ3JhZGUgdGhlIEVEQ0EgcGFyYW1ldGVycyBpZiBuZWVkZWQKKyAgICAgICAgICAgIGxpbVNldEFjdGl2ZUVkY2FQYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgLy8gU2VuZCB0aGUgYWN0aXZlIEVEQ0EgcGFyYW1ldGVycyB0byBIQUwKKyAgICAgICAgICAgIGlmIChwU3RhRHMtPmFuaVBlZXIgPT0gZUFOSV9CT09MRUFOX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBsaW1TZW5kRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwgcFN0YURzLT5ic3NJZCwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsaW1TZW5kRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwgcFN0YURzLT5ic3NJZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgIH0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAgICAgICAgIHJybUNhY2hlTWdtdFR4UG93ZXIoIHBNYWMsIHBBZGRCc3NQYXJhbXMtPnR4TWdtdFBvd2VyLCBwc2Vzc2lvbkVudHJ5ICk7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKHN1YlR5cGUgPT0gTElNX1JFQVNTT0MpCisgICAgICAgICAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fS0VFUEFMSVZFX1RJTUVSKTsKKyAgICAgICAgICAgIGlmIChsaW1BZGRTdGFTZWxmKHBNYWMsc3RhSWR4LCB1cGRhdGVTdGEsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBZGQgU1RBIGNvbnRleHQgYXQgSFcKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgQWRkIFNlbGYgRW50cnkgZm9yIHRoZSBzdGF0aW9uXG4iKSk7KQorICAgICAgICAgICAgICAgIG1sbUFzc29jQ25mLnJlc3VsdENvZGUgPSAodFNpclJlc3VsdENvZGVzKSBlU0lSX1NNRV9SRUZVU0VEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoICJBRERfQlNTIGZhaWxlZCFcbiIgKSk7CisgICAgICAgIC8vIFJldHVybiBBc3NvYyBjb25maXJtIHRvIFNNRSB3aXRoIGZhaWx1cmUKKyAgICAgICAgbWxtQXNzb2NDbmYucmVzdWx0Q29kZSA9ICh0U2lyUmVzdWx0Q29kZXMpIGVTSVJfU01FX1JFRlVTRUQ7CisgICAgfQorCisgICAgaWYobWxtQXNzb2NDbmYucmVzdWx0Q29kZSAhPSBlU0lSX1NNRV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLyogVXBkYXRlIFBFIHNlc3Npb24gSWQqLworICAgICAgICBtbG1Bc3NvY0NuZi5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UoIHBNYWMsIG1lc2dUeXBlLCAodEFOSV9VMzIgKikgJm1sbUFzc29jQ25mICk7CisgICAgfQorICAgIGVuZDoKKyAgICBpZiggMCAhPSBsaW1Nc2dRLT5ib2R5cHRyICkKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwodm9pZCAqKSBwQWRkQnNzUGFyYW1zICk7Cit9CisKKworCisvKioKKyAqIGxpbVByb2Nlc3NNbG1BZGRCc3NSc3AoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIGEgV0RBX0FERF9CU1NfUlNQIGZyb20gSEFMLgorICogVXBvbiByZWNlaXB0IG9mIHRoaXMgbWVzc2FnZSBmcm9tIEhBTCwgTUxNRSAtCisgKiA+IERldGVybWluZXMgdGhlICJzdGF0ZSIgaW4gd2hpY2ggdGhpcyBtZXNzYWdlIHdhcyByZWNlaXZlZAorICogPiBGb3J3YXJkcyBpdCB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2sKKyAqCisgKkxPR0lDOgorICogV0RBX0FERF9CU1NfUlNQIGNhbiBiZSByZWNlaXZlZCBieSBNTE1FIHdoaWxlIHRoZSBMSU0gaXMKKyAqIGluIHRoZSBmb2xsb3dpbmcgdHdvIHN0YXRlczoKKyAqIDEpIEFzIEFQLCBMSU0gc3RhdGUgPSBlTElNX1NNRV9XVF9TVEFSVF9CU1NfU1RBVEUKKyAqIDIpIEFzIFNUQSwgTElNIHN0YXRlID0gZUxJTV9TTUVfV1RfSk9JTl9TVEFURQorICogQmFzZWQgb24gdGhlc2UgdHdvIHN0YXRlcywgdGhpcyBBUEkgd2lsbCBkZXRlcm1pbmUgd2hlcmUgdG8KKyAqIHJvdXRlIHRoZSBtZXNzYWdlIHRvCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICB0U2lyTXNnUSAgVGhlIE1zZ1EgaGVhZGVyLCB3aGljaCBjb250YWlucyB0aGUgcmVzcG9uc2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgbGltUHJvY2Vzc01sbUFkZEJzc1JzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgKQoreworICAgIHRMaW1NbG1TdGFydENuZiAgICAgbWxtU3RhcnRDbmY7CisgICAgdHBQRVNlc3Npb24gICAgICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRwQWRkQnNzUGFyYW1zICAgICAgcEFkZEJzc1BhcmFtcyA9ICh0cEFkZEJzc1BhcmFtcykgKGxpbU1zZ1EtPmJvZHlwdHIpOworCisgICAgaWYoTlVMTCA9PSBwQWRkQnNzUGFyYW1zICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJFbmNvdW50ZXJlZCBOVUxMIFBvaW50ZXJcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRPRE8gJiBGSVhNRV9HRU40CisgICAgLy8gTmVlZCB0byBpbnNwZWN0IHRTaXJNc2dRLnJlc2VydmVkIGZvciBhIHZhbGlkIERpYWxvZyB0b2tlbiEKKyAgICAvLworICAgIC8vd2UgbmVlZCB0byBwcm9jZXNzIHRoZSBkZWZlcnJlZCBtZXNzYWdlIHNpbmNlIHRoZSBpbml0aWF0aW5nIHJlcS4gdGhlcmUgbWlnaHQgYmUgbmVzdGVkIHJlcXVlc3QuCisgICAgLy9pbiB0aGUgY2FzZSBvZiBuZXN0ZWQgcmVxdWVzdCB0aGUgbmV3IHJlcXVlc3QgaW5pdGlhdGVkIGZyb20gdGhlIHJlc3BvbnNlIHdpbGwgdGFrZSBjYXJlIG9mIHJlc2V0dGluZworICAgIC8vdGhlIGRlZmZlcmVkIGZsYWcuCisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgLy8gVmFsaWRhdGUgU01FL0xJTSBzdGF0ZQorICAgIC8vIFZhbGlkYXRlIE1MTUUgc3RhdGUKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBBZGRCc3NQYXJhbXMtPnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWRcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogdXBkYXRlIFBFIHNlc3Npb24gSWQqLworICAgIG1sbVN0YXJ0Q25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIGlmKCBlU0lSX0lCU1NfTU9ERSA9PSBwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlICkKKyAgICAgICAgbGltUHJvY2Vzc0lic3NNbG1BZGRCc3NSc3AoIHBNYWMsIGxpbU1zZ1EsIHBzZXNzaW9uRW50cnkgKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggZUxJTV9TTUVfV1RfU1RBUlRfQlNTX1NUQVRFID09IHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGVMSU1fTUxNX1dUX0FERF9CU1NfUlNQX1NUQVRFICE9IHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBNZXNnIHJlY2VpdmVkIGZyb20gSEFMIGluIEludmFsaWQgc3RhdGUhCisgICAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgRkwoICJSZWNlaXZlZCB1bmV4cGVjdGVkIFdEQV9BRERfQlNTX1JTUCBpbiBzdGF0ZSAlWFxuIiApLAorICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgKTsKKyAgICAgICAgICAgICAgICBtbG1TdGFydENuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfQlNTX0FMUkVBRFlfU1RBUlRFRF9PUl9KT0lORUQ7CisgICAgICAgICAgICAgICAgaWYoIDAgIT0gbGltTXNnUS0+Ym9keXB0ciApCisgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBBZGRCc3NQYXJhbXMgKTsKKyAgICAgICAgICAgICAgICBsaW1Qb3N0U21lTWVzc2FnZSggcE1hYywgTElNX01MTV9TVEFSVF9DTkYsICh0QU5JX1UzMiAqKSAmbWxtU3RhcnRDbmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSl8fChwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlID09IGVTSVJfQlRBTVBfU1RBX01PREUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbVByb2Nlc3NCdGFtcEFkZEJzc1JzcChwTWFjLGxpbU1zZ1EscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICBsaW1Qcm9jZXNzQXBNbG1BZGRCc3NSc3AoIHBNYWMsbGltTXNnUSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogQ2FsbGVkIHdoaWxlIHByb2Nlc3NpbmcgYXNzb2MgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGxpbVByb2Nlc3NTdGFNbG1BZGRCc3NSc3AoIHBNYWMsIGxpbU1zZ1EscHNlc3Npb25FbnRyeSk7CisgICAgfQorfQorLyoqCisgKiBsaW1Qcm9jZXNzTWxtU2V0S2V5UnNwKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyB0aGUgZm9sbG93aW5nIHR3bworICogbWVzc2FnZXMgZnJvbSBIQUw6CisgKiAxKSBXREFfU0VUX0JTU0tFWV9SU1AKKyAqIDIpIFdEQV9TRVRfU1RBS0VZX1JTUAorICogMykgV0RBX1NFVF9TVEFfQkNBU1RLRVlfUlNQCisgKiBVcG9uIHJlY2VpcHQgb2YgdGhpcyBtZXNzYWdlIGZyb20gSEFMLAorICogTUxNRSAtCisgKiA+IERldGVybWluZXMgdGhlICJzdGF0ZSIgaW4gd2hpY2ggdGhpcyBtZXNzYWdlIHdhcyByZWNlaXZlZAorICogPiBGb3J3YXJkcyBpdCB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2sKKyAqCisgKkxPR0lDOgorICogV0RBX1NFVF9CU1NLRVlfUlNQL1dEQV9TRVRfU1RBS0VZX1JTUCBjYW4gYmUKKyAqIHJlY2VpdmVkIGJ5IE1MTUUgd2hpbGUgaW4gdGhlIGZvbGxvd2luZyBzdGF0ZToKKyAqIE1MTUUgc3RhdGUgPSBlTElNX01MTV9XVF9TRVRfQlNTX0tFWV9TVEFURSAtLU9SLS0KKyAqIE1MTUUgc3RhdGUgPSBlTElNX01MTV9XVF9TRVRfU1RBX0tFWV9TVEFURSAtLU9SLS0KKyAqIE1MTUUgc3RhdGUgPSBlTElNX01MTV9XVF9TRVRfU1RBX0JDQVNUS0VZX1NUQVRFCisgKiBCYXNlZCBvbiB0aGlzIHN0YXRlLCB0aGlzIEFQSSB3aWxsIGRldGVybWluZSB3aGVyZSB0bworICogcm91dGUgdGhlIG1lc3NhZ2UgdG8KKyAqCisgKkFTU1VNUFRJT05TOgorICogT05MWSB0aGUgTUxNRSBzdGF0ZSBpcyBiZWluZyB0YWtlbiBpbnRvIGFjY291bnQgZm9yIG5vdy4KKyAqIFRoaXMgaXMgYmVjYXVzZSwgaXQgYXBwZWFycyB0aGF0IHRoZSBoYW5kbGluZyBvZiB0aGUKKyAqIFNFVEtFWVMgUkVRIGlzIGhhbmRsZWQgc3ltbWV0cmljYWxseSBvbiBib3RoIHRoZSBBUCAmIFNUQQorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHRTaXJNc2dRICBUaGUgTXNnUSBoZWFkZXIsIHdoaWNoIGNvbnRhaW5zIHRoZSByZXNwb25zZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBsaW1Qcm9jZXNzTWxtU2V0U3RhS2V5UnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSApCit7CisgICAgdEFOSV9VOCByZXNwUmVxZCA9IDE7CisgICAgdExpbU1sbVNldEtleXNDbmYgbWxtU2V0S2V5c0NuZjsKKyAgICB0QU5JX1U4ICBzZXNzaW9uSWQgPSAwOworICAgIHRwUEVTZXNzaW9uICBwc2Vzc2lvbkVudHJ5OworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopJm1sbVNldEtleXNDbmYsIHNpemVvZiggdExpbU1sbVNldEtleXNDbmYgKSk7CisgICAvL0JUQU1QCisgICAgaWYoTlVMTCA9PSBsaW1Nc2dRLT5ib2R5cHRyKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJsaW1Nc2dRIGJvZHlwdHIgaXMgTlVMTFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXNzaW9uSWQgPSAoKHRwU2V0U3RhS2V5UGFyYW1zKSBsaW1Nc2dRLT5ib2R5cHRyKS0+c2Vzc2lvbklkOworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsIHNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklkXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBlTElNX01MTV9XVF9TRVRfU1RBX0tFWV9TVEFURSAhPSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSApCisgICAgeworICAgICAgICAvLyBNZXNnIHJlY2VpdmVkIGZyb20gSEFMIGluIEludmFsaWQgc3RhdGUhCisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoICJSZWNlaXZlZCB1bmV4cGVjdGVkIFtNZXNnIElkIC0gJWRdIGluIHN0YXRlICVYXG4iICksIGxpbU1zZ1EtPnR5cGUsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgKTsKKyAgICAgICAgLy8gVGhlcmUncyBub3QgbXVjaCB0aGF0IE1MTUUgY2FuIGRvIGF0IHRoaXMgc3RhZ2UuLi4KKyAgICAgICAgcmVzcFJlcWQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBtbG1TZXRLZXlzQ25mLnJlc3VsdENvZGUgPSAodEFOSV9VMTYpICgoKHRwU2V0U3RhS2V5UGFyYW1zKSBsaW1Nc2dRLT5ib2R5cHRyKS0+c3RhdHVzKTsKKworICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIGxpbU1zZ1EtPmJvZHlwdHIgKTsKKyAgICAvLyBSZXN0b3JlIE1MTUUgc3RhdGUKKyAgICAvL3BNYWMtPmxpbS5nTGltTWxtU3RhdGUgPSBwTWFjLT5saW0uZ0xpbVByZXZNbG1TdGF0ZTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVByZXZNbG1TdGF0ZTsKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKyAgICBpZiggcmVzcFJlcWQgKQorICAgIHsKKyAgICAgICAgdHBMaW1NbG1TZXRLZXlzUmVxIGxwTGltTWxtU2V0S2V5c1JlcSA9ICh0cExpbU1sbVNldEtleXNSZXEpIHBNYWMtPmxpbS5ncExpbU1sbVNldEtleXNSZXE7CisgICAgICAgIC8vIFByZXBhcmUgYW5kIFNlbmQgTElNX01MTV9TRVRLRVlTX0NORgorICAgICAgICBpZiggTlVMTCAhPSBscExpbU1sbVNldEtleXNSZXEgKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmbWxtU2V0S2V5c0NuZi5wZWVyTWFjQWRkciwgKHRBTklfVTggKikgbHBMaW1NbG1TZXRLZXlzUmVxLT5wZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICAgIG1sbVNldEtleXNDbmYuYWlkID0gbHBMaW1NbG1TZXRLZXlzUmVxLT5haWQ7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIEZyZWUgdGhlIGJ1ZmZlciBjYWNoZWQgZm9yIHRoZSBnbG9iYWwgcE1hYy0+bGltLmdwTGltTWxtU2V0S2V5c1JlcQorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcE1hYy0+bGltLmdwTGltTWxtU2V0S2V5c1JlcSk7CisgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NbG1TZXRLZXlzUmVxID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBtbG1TZXRLZXlzQ25mLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UoIHBNYWMsIExJTV9NTE1fU0VUS0VZU19DTkYsICh0QU5JX1UzMiAqKSAmbWxtU2V0S2V5c0NuZiApOworICAgIH0KK30KK3ZvaWQgbGltUHJvY2Vzc01sbVNldEJzc0tleVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgKQoreworICAgIHRBTklfVTggcmVzcFJlcWQgPSAxOworICAgIHRMaW1NbG1TZXRLZXlzQ25mIG1sbVNldEtleXNDbmY7CisgICAgdEFOSV9VMTYgcmVzdWx0Q29kZTsKKyAgICB0QU5JX1U4ICBzZXNzaW9uSWQgPTA7CisgICAgdHBQRVNlc3Npb24gIHBzZXNzaW9uRW50cnk7CisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikmbWxtU2V0S2V5c0NuZiwgc2l6ZW9mKCB0TGltTWxtU2V0S2V5c0NuZiApKTsKKyAgIC8vQlRBTVAKKyAgICBpZihOVUxMID09IGxpbU1zZ1EtPmJvZHlwdHIpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoImxpbU1zZ1EgYm9keXB0ciBpcyBudWxsXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNlc3Npb25JZCA9ICgodHBTZXRCc3NLZXlQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHIpLT5zZXNzaW9uSWQ7CisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSWRcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIGVMSU1fTUxNX1dUX1NFVF9CU1NfS0VZX1NUQVRFID09IHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlICkKKyAgICAgICAgcmVzdWx0Q29kZSA9ICh0QU5JX1UxNikgKCgodHBTZXRCc3NLZXlQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHIpLT5zdGF0dXMpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0Q29kZSA9ICh0QU5JX1UxNikgKCgodHBTZXRTdGFLZXlQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHIpLT5zdGF0dXMpOyAvL0JDQVNUIGtleSBhbHNvIHVzZXMgdHBTZXRTdGFLZXlQYXJhbXMuIERvbmUgdGhpcyB3YXkgZm9yIHJlYWRhYmlsdHkuCisKKyAgLy8KKyAgLy8gVE9ETyAmIEZJWE1FX0dFTjQKKyAgLy8gTmVlZCB0byBpbnNwZWN0IHRTaXJNc2dRLnJlc2VydmVkIGZvciBhIHZhbGlkIERpYWxvZyB0b2tlbiEKKyAgLy8KKyAgLy8gVmFsaWRhdGUgU01FL0xJTSBzdGF0ZSAtIFJlYWQgdGhlIGFib3ZlICJBU1NVTVBUSU9OUyIKKyAgLy9pZiggZUxJTV9TTUVfTElOS19FU1RfU1RBVEUgPT0gcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSApCisgIC8veworICAgIC8vIFZhbGlkYXRlIE1MTUUgc3RhdGUKKyAgICBpZiggZUxJTV9NTE1fV1RfU0VUX0JTU19LRVlfU1RBVEUgIT0gcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgJiYKKyAgICAgICAgZUxJTV9NTE1fV1RfU0VUX1NUQV9CQ0FTVEtFWV9TVEFURSAhPSBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSApCisgICAgeworICAgICAgICAvLyBNZXNnIHJlY2VpdmVkIGZyb20gSEFMIGluIEludmFsaWQgc3RhdGUhCisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoICJSZWNlaXZlZCB1bmV4cGVjdGVkIFtNZXNnIElkIC0gJWRdIGluIHN0YXRlICVYXG4iICksIGxpbU1zZ1EtPnR5cGUsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgKTsKKyAgICAgICAgLy8gVGhlcmUncyBub3QgbXVjaCB0aGF0IE1MTUUgY2FuIGRvIGF0IHRoaXMgc3RhZ2UuLi4KKyAgICAgICAgcmVzcFJlcWQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBtbG1TZXRLZXlzQ25mLnJlc3VsdENvZGUgPSByZXN1bHRDb2RlOworCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgbGltTXNnUS0+Ym9keXB0ciApOworICAgIC8vIFJlc3RvcmUgTUxNRSBzdGF0ZQorICAgIC8vcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IHBNYWMtPmxpbS5nTGltUHJldk1sbVN0YXRlOworICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gcHNlc3Npb25FbnRyeS0+bGltUHJldk1sbVN0YXRlOworCisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisgICAgaWYoIHJlc3BSZXFkICkKKyAgICB7CisgICAgICAgIHRwTGltTWxtU2V0S2V5c1JlcSBscExpbU1sbVNldEtleXNSZXEgPSAodHBMaW1NbG1TZXRLZXlzUmVxKSBwTWFjLT5saW0uZ3BMaW1NbG1TZXRLZXlzUmVxOworICAgICAgICBtbG1TZXRLZXlzQ25mLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworICAgICAgICAvLyBQcmVwYXJlIGFuZCBTZW5kIExJTV9NTE1fU0VUS0VZU19DTkYKKyAgICAgICAgaWYoIE5VTEwgIT0gbHBMaW1NbG1TZXRLZXlzUmVxICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJm1sbVNldEtleXNDbmYucGVlck1hY0FkZHIsICh0QU5JX1U4ICopIGxwTGltTWxtU2V0S2V5c1JlcS0+cGVlck1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgICBtbG1TZXRLZXlzQ25mLmFpZCA9IGxwTGltTWxtU2V0S2V5c1JlcS0+YWlkOworI2VuZGlmCisgICAgICAgICAgICAvLyBGcmVlIHRoZSBidWZmZXIgY2FjaGVkIGZvciB0aGUgZ2xvYmFsIHBNYWMtPmxpbS5ncExpbU1sbVNldEtleXNSZXEKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBNYWMtPmxpbS5ncExpbU1sbVNldEtleXNSZXEpOworICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtU2V0S2V5c1JlcSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UoIHBNYWMsIExJTV9NTE1fU0VUS0VZU19DTkYsICh0QU5JX1UzMiAqKSAmbWxtU2V0S2V5c0NuZiApOworICAgIH0KK30KKy8qKgorICogbGltUHJvY2Vzc01sbVJlbW92ZUtleVJzcCgpCisgKgorICpGVU5DVElPTjoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgdFNpck1zZ1EgIFRoZSBNc2dRIGhlYWRlciwgd2hpY2ggY29udGFpbnMgdGhlIHJlc3BvbnNlIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbVByb2Nlc3NNbG1SZW1vdmVLZXlSc3AoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRICkKK3sKK3RMaW1NbG1SZW1vdmVLZXlDbmYgbWxtUmVtb3ZlQ25mOwordEFOSV9VMTYgcmVzdWx0Q29kZTsKK3RwTGltTWxtUmVtb3ZlS2V5UmVxIGxwTGltTWxtUmVtb3ZlS2V5UmVxID0gKHRwTGltTWxtUmVtb3ZlS2V5UmVxKSBwTWFjLT5saW0uZ3BMaW1NbG1SZW1vdmVLZXlSZXE7CisgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgKHZvaWQgKikgJm1sbVJlbW92ZUNuZiwKKyAgICAgIHNpemVvZiggdExpbU1sbVJlbW92ZUtleUNuZiApKTsKKyAgLy8gVmFsaWRhdGUgTUxNRSBzdGF0ZQorICAgIGlmKCBlTElNX01MTV9XVF9SRU1PVkVfQlNTX0tFWV9TVEFURSAhPSBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlICYmCisgICAgICAgIGVMSU1fTUxNX1dUX1JFTU9WRV9TVEFfS0VZX1NUQVRFICE9IHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgKQorICAgIHsKKyAgICAgIC8vIE1lc2cgcmVjZWl2ZWQgZnJvbSBIQUwgaW4gSW52YWxpZCBzdGF0ZSEKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICBGTCggIlJlY2VpdmVkIHVuZXhwZWN0ZWQgW01lc2cgSWQgLSAlZF0gaW4gc3RhdGUgJVhcbiIgKSwKKyAgICAgICAgICBsaW1Nc2dRLT50eXBlLAorICAgICAgICAgIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgKTsKKyAgICAgICAgICByZXR1cm47IC8vaWdub3JlIHRoZSByZXNwb25zZS4KKyAgICB9CisKKyAgaWYoIGVMSU1fTUxNX1dUX1JFTU9WRV9CU1NfS0VZX1NUQVRFID09IHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgKQorICAgIHJlc3VsdENvZGUgPSAodEFOSV9VMTYpICgoKHRwUmVtb3ZlQnNzS2V5UGFyYW1zKSBsaW1Nc2dRLT5ib2R5cHRyKS0+c3RhdHVzKTsKKyAgZWxzZQorICAgIHJlc3VsdENvZGUgPSAodEFOSV9VMTYpICgoKHRwUmVtb3ZlU3RhS2V5UGFyYW1zKSBsaW1Nc2dRLT5ib2R5cHRyKS0+c3RhdHVzKTsKKyAgLy8KKyAgLy8gVE9ETyAmIEZJWE1FX0dFTjQKKyAgLy8gTmVlZCB0byBpbnNwZWN0IHRTaXJNc2dRLnJlc2VydmVkIGZvciBhIHZhbGlkIERpYWxvZyB0b2tlbiEKKyAgLy8KKworICBpZiggMCAhPSBsaW1Nc2dRLT5ib2R5cHRyICkKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBsaW1Nc2dRLT5ib2R5cHRyICk7CisgIC8vIFJlc3RvcmUgTUxNRSBzdGF0ZQorICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID0gcE1hYy0+bGltLmdMaW1QcmV2TWxtU3RhdGU7CisgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworICAgIC8vIFByZXBhcmUgYW5kIFNlbmQgTElNX01MTV9SRU1PVkVLRVlfQ05GCisgICAgaWYoIE5VTEwgIT0gbHBMaW1NbG1SZW1vdmVLZXlSZXEgKQorICAgIHsKKyAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgKHRBTklfVTggKikgJm1sbVJlbW92ZUNuZi5wZWVyTWFjQWRkciwKKyAgICAgICAgICAodEFOSV9VOCAqKSBscExpbU1sbVJlbW92ZUtleVJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgc2l6ZW9mKCB0U2lyTWFjQWRkciApKTsKKyAgICAgIG1sbVJlbW92ZUNuZi5yZXN1bHRDb2RlID0gcmVzdWx0Q29kZTsKKyAgICAgIC8vIEZyZWUgdGhlIGJ1ZmZlciBjYWNoZWQgZm9yIHRoZSBnbG9iYWwgcE1hYy0+bGltLmdwTGltTWxtUmVtb3ZlS2V5UmVxCisgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTWFjLT5saW0uZ3BMaW1NbG1SZW1vdmVLZXlSZXEpOworICAgICAgcE1hYy0+bGltLmdwTGltTWxtUmVtb3ZlS2V5UmVxID0gTlVMTDsKKyAgICAgfQorICAgICBsaW1Qb3N0U21lTWVzc2FnZSggcE1hYywKKyAgICAgICAgTElNX01MTV9SRU1PVkVLRVlfQ05GLAorICAgICAgICAodEFOSV9VMzIgKikgJm1sbVJlbW92ZUNuZiApOworfQorCisjaWYgKGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgfHwgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQX1NESykpCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgIF9fbGltUHJvY2Vzc0ZpbmlzaExlYXJuUnNwCitcYnJpZWYgIEhhbmRsZSBmaW5pc2ggbGVhcm4gcnNwIHN0YXRlLCBvbmx5IGZvciBBUC4KK1xwYXJhbSAgcE1hYworXHJldHVybiBOT05FCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBfX2xpbVByb2Nlc3NGaW5pc2hMZWFyblJzcCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIlN5c3RlbSBSb2xlOiAlZFxuIiksIHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSk7KQorICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NZWFzUmVxID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1SZXN0b3JlUHJlTGVhcm5TdGF0ZShwTWFjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKioKKyAgICAgICogSW5pdGlhbCBtZWFzdXJlbWVudCAtPiBwZXJpb2RpYyBtZWFzdXJlbWVudCBzaG91bGQga2VlcCBlbmFibGVkLCBzbyB0aGF0CisgICAgICAqIGlmIHN5c3RlbSBSb2xlIGlzIFVOS05PV04gTElNIGNhbiBzZW5kIGluZGljYXRpb24gdG8gV1NNLiBPdmVybG9hZGluZworICAgICAgKiBwZXJpb2RpYyBtZWFzdXJlbWVudCB0byBkaXN0aW5ndWlzaCBpbml0aWFsIG1lYXN1cmVtZW50IGFuZCByYWRhcgorICAgICAgKiBkZXRlY3QgcGFyayBiYXNpY2FsbHkgdG8gYXZvaWQgc2VuZGluZyBtZWFzdXJlbWVudCBpbmRpY2F0aW9uIGFmdGVyCisgICAgICAqIHJhZGFyIGRldGVjdCBwYXJrLgorICAgICAgKiBSYWRhciBkZXRlY3QgcGFyayAtPiBwZXJpb2RpYyBtZWFzdXJlbWVudCBzaG91bGQgYmUgZGlzYWJsZWQsIHNvIHRoYXQKKyAgICAgICogTElNIHdvbnQgc2VuZCBpbmRpY2F0aW9uIGV2ZW4gd2hlbiByb2xlIGlzIFVOS05PV04uCisgICAgICAqIEZpbmFsIG1lYXN1cmVtZW50IC0+IHBlcmlvZGljIG1lYXN1cmVtZW50IHNob3VsZCBiZSBlbmFibGVkLCBzbyB0aGF0CisgICAgICAqIExJTSBjb3VsZCBzdGFydCBtZWFzdXJlbWVudCBpbmRpY2F0aW9uIHRpbWVyLgorICAgICAgKi8KKyAgICBpZiAocE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0NvbnRyb2wucGVyaW9kaWNNZWFzRW5hYmxlZCAmJgorICAgICAgICAgICAgICAgICFwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMuaXNNZWFzSW5kVGltZXJBY3RpdmUpCisgICAgeworI2lmIDAgLyogV2lsbCB3ZSBiZSBldmVyIGluIFVOS05PV04gUk9MRTogVmVlcmVuZHJhICovCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9VTktOT1dOX1JPTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbVNlbmRTbWVNZWFzdXJlbWVudEluZChwTWFjKTsKKyAgICAgICAgICAgIGxpbUNsZWFudXBNZWFzUmVzb3VyY2VzKHBNYWMpOworICAgICAgICAgICAgbGltUmVzdG9yZVByZUxlYXJuU3RhdGUocE1hYyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyNpZmRlZiBHRU42X1RPRE8KKyAgICAgICAgICAgIC8qIHJldmlzaXQgdGhpcyBwaWVjZSBvZiBjb2RlIHRvIGFzc2lnbiB0aGUgYXBwcm9wcmlhdGUgc2Vzc2lvbklkIGJlbG93CisgICAgICAgICAgICAgKiBwcmlvcml0eSAtIE1FRElVTQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubWVhc3VyZW1lbnRJbmRUaW1lci5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIEFjdGl2YXRlIHBlcmlvZGljIG1lYXN1cmVtZW50IGluZGljYXRpb24gdGltZXIKKyAgICAgICAgICAgIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgKKyAgICAgICAgICAgICAgICZwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubWVhc3VyZW1lbnRJbmRUaW1lcikKKyAgICAgICAgICAgICAgICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3Qgc3RhcnQgTWVhcyBJTkQgdGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMuaXNNZWFzSW5kVGltZXJBY3RpdmUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubmV4dExlYXJuQ2hhbm5lbElkID49CisgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyAtIDEpCisgICAgeworICAgICAgICAvLyBBbGwgY2hhbm5lbHMgaW4gdGhlIGNoYW5uZWwgc2V0IGFyZSBsZWFybmVkLgorICAgICAgICBwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubmV4dExlYXJuQ2hhbm5lbElkID0gMDsKKyAgICB9CisgICAgLy8gR28gYmFjayB0byBwcmV2aW91cyBzdGF0ZS4KKyAgICBsaW1SZXN0b3JlUHJlTGVhcm5TdGF0ZShwTWFjKTsKKyAgICAvLyBSZXN0YXJ0IHRoZSBsZWFybiBpbnRlcnZhbCB0aW1lci4KKyAgICBpZiAocE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0NvbnRyb2wucGVyaW9kaWNNZWFzRW5hYmxlZCkKKyAgICAgICAgbGltUmVFbmFibGVMZWFybk1vZGUocE1hYyk7CisgICAgcmV0dXJuOworfQorI2VuZGlmCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgIGxpbVByb2Nlc3NJbml0U2NhblJzcAorXGJyaWVmICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBMSU0gcmVjZWl2ZXMgV0RBX0lOSVRfU0NBTl9SU1AKK1wgICAgICAgIG1lc3NhZ2UgZnJvbSBIQUwuICBJZiBzdGF0dXMgY29kZSBpcyBmYWlsdXJlLCB0aGVuCitcICAgICAgICB1cGRhdGUgdGhlIGdMaW1OdW1PZkNvbnNlY3V0aXZlQmtnbmRTY2FuRmFpbHVyZSBjb3VudC4KK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsICBwTWFjCitccGFyYW0gICB0QU5JX1UzMiAgICAgICAgYm9keQorXHJldHVybiAgbm9uZQorXCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBsaW1Qcm9jZXNzSW5pdFNjYW5Sc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgIHZvaWQgKmJvZHkpCit7CisgICAgdHBJbml0U2NhblBhcmFtcyAgICBwSW5pdFNjYW5QYXJhbTsKKyAgICBlSGFsU3RhdHVzICAgICAgICAgIHN0YXR1czsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgIHRBTklfVTggICAgICAgICAgICAgY2hhbm5lbE51bTsKKyNlbmRpZgorICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworICAgIHBJbml0U2NhblBhcmFtID0gKHRwSW5pdFNjYW5QYXJhbXMpIGJvZHk7CisgICAgc3RhdHVzID0gcEluaXRTY2FuUGFyYW0tPnN0YXR1czsKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAoY2hhciAqKWJvZHkpOworCisgICAgLy9Pbmx5IGFib3J0IHNjYW4gaWYgdGhlIHdlIGFyZSBzY2FubmluZy4KKyAgICBpZiggcE1hYy0+bGltLmFib3J0U2NhbiAmJiAKKyAgICAgICAoZUxJTV9IQUxfSU5JVF9TQ0FOX1dBSVRfU1RBVEUgPT0gcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUpICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIiBmaW5pc2ggc2NhblxuIikgKTsKKyAgICAgICAgcE1hYy0+bGltLmFib3J0U2NhbiA9IDA7CisgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01JTl9DSEFOTkVMX1RJTUVSKTsKKyAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fTUFYX0NIQU5ORUxfVElNRVIpOworICAgICAgICAvL1NldCB0aGUgcmVzdW1lIGNoYW5uZWwgdG8gQW55IHZhbGlkIGNoYW5uZWwgKGludmFsaWQpLiAKKyAgICAgICAgLy9UaGlzIHdpbGwgaW5zdHJ1Y3QgSEFMIHRvIHNldCBpdCB0byBhbnkgcHJldmlvdXMgdmFsaWQgY2hhbm5lbC4KKyAgICAgICAgcGVTZXRSZXN1bWVDaGFubmVsKHBNYWMsIDAsIDApOworICAgICAgICBsaW1TZW5kSGFsRmluaXNoU2NhblJlcShwTWFjLCBlTElNX0hBTF9GSU5JU0hfU0NBTl9XQUlUX1NUQVRFKTsKKyAgICB9CisgICAgc3dpdGNoKHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBlTElNX0hBTF9JTklUX1NDQU5fV0FJVF9TVEFURToKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gKHRBTklfVTMyKSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiSW5pdFNjYW5Sc3Agd2l0aCBmYWlsZWQgc3RhdHVzPSAlZFxuIiksIHN0YXR1cyk7KQorICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPSBlTElNX0hBTF9JRExFX1NDQU5fU1RBVEU7CisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU51bU9mQ29uc2VjdXRpdmVCa2duZFNjYW5GYWlsdXJlICs9IDE7CisgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICogT24gV2luZG93cyBlU0lSX1NNRV9IQUxfU0NBTl9JTklUX0ZBSUxFRCBtZXNzYWdlIHRvIENTUiBtYXkgdHJpZ2dlcgorICAgICAgICAgICAgICAgICogYW5vdGhlciBTY2FuIHJlcXVlc3QgaW4gdGhlIHNhbWUgY29udGV4dCAoaGFwcGVucyB3aGVuIDExZCBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgKiBhbmQgZmlyc3Qgc2NhbiByZXF1ZXN0IHdpdGggMTFkIGNoYW5uZWxzIGZhaWxzIGZvciB3aGF0ZXZlciByZWFzb24sIHRoZW4gQ1NSIGlzc3VlcyBuZXh0IGluaXQKKyAgICAgICAgICAgICAgICAqIHNjYW4gaW4gdGhlIHNhbWUgY29udGV4dCBidXQgd2l0aCBiaWdnZXIgY2hhbm5lbCBsaXN0KSwgc28gdGhlIHN0YXRlIG5lZWRzIHRvIGJlCisgICAgICAgICAgICAgICAgKiBjaGFuZ2VkIGJlZm9yZSB0aGlzIHJlc3BvbnNlIG1lc3NhZ2UgaXMgc2VudC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgbGltQ29tcGxldGVNbG1TY2FuKHBNYWMsIGVTSVJfU01FX0hBTF9TQ0FOX0lOSVRfRkFJTEVEKTsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgICAgICAgICAgICAgIC8qIEZvciBoYW5kbGluZyB0aGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBmcm9tIFdTTSBhcyBzY2FuIHJlcXVlc3QgaW4gTElNKi8KKyNpZiAwCisgICAgICAgICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUgJiYgcE1hYy0+bGltLmdwTGltTWVhc1JlcSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltUmVzdG9yZVByZUxlYXJuU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID0gZUxJTV9IQUxfSURMRV9TQ0FOX1NUQVRFOworICAgICAgICAgICAgICAgICAgICBsaW1SZUVuYWJsZUxlYXJuTW9kZShwTWFjKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNpbmNlIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHRyaWdnZXJlZCBhIGJhY2tncm91bmQgc2NhbiwKKyAgICAgICAgICAgICAgICAgKiByZXNldCB0aGUgImNvbnNlY3V0aXZlIGJrZ25kIHNjYW4gZmFpbHVyZSIgY291bnQgdG8gMAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtT2ZDb25zZWN1dGl2ZUJrZ25kU2NhbkZhaWx1cmUgPSAwOworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtT2ZCYWNrZ3JvdW5kU2NhblN1Y2Nlc3MgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbUNvbnRpbnVlQ2hhbm5lbFNjYW4ocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgICAgICBjYXNlIGVMSU1fSEFMX0lOSVRfTEVBUk5fV0FJVF9TVEFURToKKy8vICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAodEFOSV9VMzIpIGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1SZXN0b3JlUHJlTGVhcm5TdGF0ZShwTWFjKTsKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPSBlTElNX0hBTF9JRExFX1NDQU5fU1RBVEU7CisgICAgICAgICAgICAgICAgICAgIGxpbVJlRW5hYmxlTGVhcm5Nb2RlKHBNYWMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoYW5uZWxOdW0gPSBsaW1HZXRDdXJyZW50TGVhcm5DaGFubmVsKHBNYWMpOworICAgICAgICAgICAgICAgIGxpbVNlbmRIYWxTdGFydFNjYW5SZXEocE1hYywgY2hhbm5lbE51bSwgZUxJTV9IQUxfU1RBUlRfTEVBUk5fV0FJVF9TVEFURSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorLy9XTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCisgICAgICAgIGNhc2UgZUxJTV9IQUxfU1VTUEVORF9MSU5LX1dBSVRfU1RBVEU6CisgICAgICAgICAgICBpZiggcE1hYy0+bGltLmdwTGltU3VzcGVuZENhbGxiYWNrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmKCBzdGF0dXMgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSA9IGVMSU1fSEFMX1NVU1BFTkRfTElOS19TVEFURTsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID0gZUxJTV9IQUxfSURMRV9TQ0FOX1NUQVRFOworCisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1TdXNwZW5kQ2FsbGJhY2soIHBNYWMsIHN0YXR1cywgcE1hYy0+bGltLmdwTGltU3VzcGVuZERhdGEgKTsKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbVN1c3BlbmRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1TdXNwZW5kRGF0YSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsICJObyBzdXNwZW5kIGxpbmsgY2FsbGJhY2sgc2V0IGJ1dCBzdGF0aW9uIGlzIGluIHN1c3BlbmQgc3RhdGVcbiIpOworICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisvL2VuZCBXTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoImxpbVByb2Nlc3NJbml0U2NhblJzcDogUmN2ZCBJbml0U2NhblJzcCBub3QgaW4gV0FJVCBTdGF0ZSwgc3RhdGUgJWRcbiIpLAorICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit9CisvKioKKyAqIGxpbVByb2Nlc3NTd2l0Y2hDaGFubmVsUmVBc3NvY1JlcSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgdGhlIHJlYXNzb2MgcmVxIG1nbXQgZnJhbWUgYWZ0ZXIgdGhlCisgKiBzd2l0Y2hDaGFubmVsUnNwIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSBIQUwuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gIHBzZXNzaW9uRW50cnkgLSBzZXNzaW9uIHJlbGF0ZWQgaW5mb3JtYXRpb24uCisgKiBAcGFyYW0gIHN0YXR1cyAgICAgICAgLSBjaGFubmVsIHN3aXRjaCBzdWNjZXNzL2ZhaWx1cmUuCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbVByb2Nlc3NTd2l0Y2hDaGFubmVsUmVBc3NvY1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LCBlSGFsU3RhdHVzIHN0YXR1cykKK3sKKyAgICB0TGltTWxtUmVhc3NvY0NuZiAgICAgICBtbG1SZWFzc29jQ25mOworICAgIHRMaW1NbG1SZWFzc29jUmVxICAgICAgICpwTWxtUmVhc3NvY1JlcTsKKyAgICBwTWxtUmVhc3NvY1JlcSA9ICh0TGltTWxtUmVhc3NvY1JlcSAqKShwc2Vzc2lvbkVudHJ5LT5wTGltTWxtUmVhc3NvY1JlcSk7CisgICAgaWYocE1sbVJlYXNzb2NSZXEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgicExpbU1sbVJlYXNzb2NSZXEgZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHN3aXRjaENoYW5TZXNzaW9uXG4iKSk7CisgICAgICAgIG1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYoc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJDaGFuZ2UgY2hhbm5lbCBmYWlsZWQhIVxuIikpOykKKyAgICAgICAgbWxtUmVhc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfQ0hBTk5FTF9TV0lUQ0hfRkFJTDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIC8vLyBTdGFydCByZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9SRUFTU09DX0ZBSUxfVElNRVIpKTsKKyAgICBpZiAodHhfdGltZXJfYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVJlYXNzb2NGYWlsdXJlVGltZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IHN0YXJ0IHJlYXNzb2MgZmFpbHVyZSB0aW1lci4KKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICBGTCgiY291bGQgbm90IHN0YXJ0IFJlYXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lclxuIikpOworICAgICAgICAvLyBSZXR1cm4gUmVhc3NvYyBjb25maXJtIHdpdGgKKyAgICAgICAgLy8gUmVzb3VyY2VzIFVuYXZhaWxhYmxlCisgICAgICAgIG1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIC8vLyBQcmVwYXJlIGFuZCBzZW5kIFJlYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZQorICAgIGxpbVNlbmRSZWFzc29jUmVxTWdtdEZyYW1lKHBNYWMsIHBNbG1SZWFzc29jUmVxLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICByZXR1cm47CitlbmQ6CisgICAgLy8gRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkIGZvciByZWFzc29jUmVxCisgICAgaWYocE1sbVJlYXNzb2NSZXEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkKi8KKyAgICAgICAgbWxtUmVhc3NvY0NuZi5zZXNzaW9uSWQgPSBwTWxtUmVhc3NvY1JlcS0+c2Vzc2lvbklkOworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTWxtUmVhc3NvY1JlcSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1sbVJlYXNzb2NDbmYuc2Vzc2lvbklkID0gMDsKKyAgICB9CisKKyAgICBtbG1SZWFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW8gSWQqLworICAgIG1sbVJlYXNzb2NDbmYuc2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKyAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX1JFQVNTT0NfQ05GLCAodEFOSV9VMzIgKikgJm1sbVJlYXNzb2NDbmYpOworfQorLyoqCisgKiBsaW1Qcm9jZXNzU3dpdGNoQ2hhbm5lbEpvaW5SZXEoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIHRoZSBwcm9iZSByZXEgbWdtdCBmcmFtZSBhZnRlciB0aGUKKyAqIHN3aXRjaENoYW5uZWxSc3AgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIEhBTC4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgICAgICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSAgcHNlc3Npb25FbnRyeSAtIHNlc3Npb24gcmVsYXRlZCBpbmZvcm1hdGlvbi4KKyAqIEBwYXJhbSAgc3RhdHVzICAgICAgICAtIGNoYW5uZWwgc3dpdGNoIHN1Y2Nlc3MvZmFpbHVyZS4KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworc3RhdGljIHZvaWQgbGltUHJvY2Vzc1N3aXRjaENoYW5uZWxKb2luUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksIGVIYWxTdGF0dXMgc3RhdHVzKQoreworICAgIHRBTklfVTMyICAgICAgICAgICAgdmFsOworICAgIHRTaXJNYWNTU2lkICAgICAgICAgc3NJZDsKKyAgICB0TGltTWxtSm9pbkNuZiAgICAgIG1sbUpvaW5DbmY7CisgICAgaWYoc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJDaGFuZ2UgY2hhbm5lbCBmYWlsZWQhIVxuIikpOykKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoIChOVUxMID09IHBzZXNzaW9uRW50cnkgKSB8fCAoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSkgKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiaW52YWxpZCBwb2ludGVyISFcbiIpKTspCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gQWN0aXZhdGUgSm9pbiBmYWlsdXJlIHRpbWVyCisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsIDAsIGVMSU1fSk9JTl9GQUlMX1RJTUVSKSk7CisgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Kb2luRmFpbHVyZVRpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgYWN0aXZhdGUgSm9pbiBmYWlsdXJlIHRpbWVyXG4iKSk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gcHNlc3Npb25FbnRyeS0+bGltUHJldk1sbVN0YXRlOworICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisgICAgICAgIC8vbWVtb3J5IGlzIGZyZWVkIHVwIGJlbG93LgorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltTWxtSm9pblJlcSA9IE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIC8qIGVTSVJfQlRBTVBfQVBfTU9ERSBzdHJvZWQgYXMgYnNzIHR5cGUgaW4gc2Vzc2lvbiBUYWJsZSB3aGVuIGpvaW4gcmVxIGlzIHJlY2VpdmVkLCBpcyB0byBiZSB2ZWlmaWVkICAgKi8KKyAgICBpZihwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSkKKyAgICB7CisgICAgICAgIGlmIChsaW1TZXRMaW5rU3RhdGUocE1hYywgZVNJUl9MSU5LX0JUQU1QX1BSRUFTU09DX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKyAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgTlVMTCwgTlVMTCkgIT0gZVNJUl9TVUNDRVNTICkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKGxpbVNldExpbmtTdGF0ZShwTWFjLCBlU0lSX0xJTktfUFJFQVNTT0NfU1RBVEUsIHBzZXNzaW9uRW50cnktPmJzc0lkLAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsIE5VTEwsIE5VTEwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIC8vIFVwZGF0ZSBCU1NJRCBhdCBDRkcgZGF0YWJhc2UKKyNpZiAwCisgICAgaWYgKGNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX0JTU0lELCBwTWFjLT5saW0uZ3BMaW1NbG1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpCisgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgdXBkYXRlIEJTU0lEIGF0IENGR1xuIikpOworI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICAvL3NpckNvcHlNYWNBZGRyKHBzZXNzaW9uRW50cnktPnBMaW1NbG1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCxwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyAgICAvKiBVcGRhdGUgdGhlIGxpbSBnbG9iYWwgZ0xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzICovCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19UUklHX1NUQV9CS19TQ0FOLCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiZmFpbGVkIHRvIGdldCBXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU4gY2ZnIHZhbHVlIVxuIikpOworICAgIHBNYWMtPmxpbS5nTGltVHJpZ2dlckJhY2tncm91bmRTY2FuRHVyaW5nUXVpZXRCc3MgPSAodmFsKSA/IDEgOiAwOworICAgIC8vIEFwcGx5IHByZXZpb3VzbHkgc2V0IGNvbmZpZ3VyYXRpb24gYXQgSFcKKyAgICBsaW1BcHBseUNvbmZpZ3VyYXRpb24ocE1hYywgcHNlc3Npb25FbnRyeSk7CisgICAgLy8vIFdhaXQgZm9yIEJlYWNvbiB0byBhbm5vdW5jZSBqb2luIHN1Y2Nlc3MKKyNpZiAwCisgICAgaWYgKGNmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX1NTSUQsIHNzSWQuc3NJZCwgJmNmZ0xlbikgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaXZlIFNTSURcbiIpKTsKKyNlbmRpZiAvL1RvIFNVUFBPUlQgQlQtQU1QCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgc3NJZC5zc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNzSWQubGVuZ3RoKTsKKyAgICBzc0lkLmxlbmd0aCA9IHBzZXNzaW9uRW50cnktPnNzSWQubGVuZ3RoOworICAgIC8vIGluY2x1ZGUgYWRkaXRpb25hbCBJRSBpZiB0aGVyZSBpcworICAgIGxpbVNlbmRQcm9iZVJlcU1nbXRGcmFtZSggcE1hYywgJnNzSWQsCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1NbG1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsLypjaGFuTnVtKi8sCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUsCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5hZGRJRVNjYW4ubGVuZ3RoLCBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+YWRkSUVTY2FuLmFkZElFZGF0YSk7CisgICAgcmV0dXJuOworZXJyb3I6ICAKKyAgICBpZihOVUxMICE9IHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAocHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEpKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEgPSBOVUxMOworICAgICAgICBtbG1Kb2luQ25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtbG1Kb2luQ25mLnNlc3Npb25JZCA9IDA7CisgICAgfQorICAgIG1sbUpvaW5DbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICBtbG1Kb2luQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsIExJTV9NTE1fSk9JTl9DTkYsICh0QU5JX1UzMiAqKSAmbWxtSm9pbkNuZik7Cit9CisKKy8qKgorICogbGltUHJvY2Vzc1N3aXRjaENoYW5uZWxSc3AoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIHN3aXRjaENoYW5uZWxSc3AgbWVzc2FnZSBmcm9tIEhBTC4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBib2R5IC0gbWVzc2FnZSBib2R5LgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbVByb2Nlc3NTd2l0Y2hDaGFubmVsUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsICB2b2lkICpib2R5KQoreworICAgIHRwU3dpdGNoQ2hhbm5lbFBhcmFtcyBwQ2hubFBhcmFtcyA9IE5VTEw7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdEFOSV9VMTYgY2hhbm5lbENoYW5nZVJlYXNvbkNvZGU7CisgICAgdEFOSV9VOCBwZVNlc3Npb25JZDsKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworICAgIC8vd2UgbmVlZCB0byBwcm9jZXNzIHRoZSBkZWZlcnJlZCBtZXNzYWdlIHNpbmNlIHRoZSBpbml0aWF0aW5nIHJlcS4gdGhlcmUgbWlnaHQgYmUgbmVzdGVkIHJlcXVlc3QuCisgICAgLy9pbiB0aGUgY2FzZSBvZiBuZXN0ZWQgcmVxdWVzdCB0aGUgbmV3IHJlcXVlc3QgaW5pdGlhdGVkIGZyb20gdGhlIHJlc3BvbnNlIHdpbGwgdGFrZSBjYXJlIG9mIHJlc2V0dGluZworICAgIC8vdGhlIGRlZmZlcmVkIGZsYWcuCisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgcENobmxQYXJhbXMgPSAodHBTd2l0Y2hDaGFubmVsUGFyYW1zKSBib2R5OworICAgIHN0YXR1cyA9IHBDaG5sUGFyYW1zLT5zdGF0dXM7CisgICAgcGVTZXNzaW9uSWQgPSBwQ2hubFBhcmFtcy0+cGVTZXNzaW9uSWQ7CisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgcGVTZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKWJvZHkpOworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JZFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIC8vSEFMIGZpbGxzIGluIHRoZSB0eCBwb3dlciB1c2VkIGZvciBtZ210IGZyYW1lcyBpbiB0aGlzIGZpZWxkLgorICAgIC8vU3RvcmUgdGhpcyB2YWx1ZSB0byB1c2UgaW4gVFBDIHJlcG9ydCBJRS4KKyAgICBycm1DYWNoZU1nbXRUeFBvd2VyKCBwTWFjLCBwQ2hubFBhcmFtcy0+dHhNZ210UG93ZXIsIHBzZXNzaW9uRW50cnkgKTsKKyNlbmRpZgorICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopYm9keSk7CisgICAgY2hhbm5lbENoYW5nZVJlYXNvbkNvZGUgPSBwc2Vzc2lvbkVudHJ5LT5jaGFubmVsQ2hhbmdlUmVhc29uQ29kZTsKKyAgICAvLyBpbml0aWFsaXplIGl0IGJhY2sgdG8gaW52YWxpZCBpZAorICAgIHBzZXNzaW9uRW50cnktPmNoYW5uZWxDaGFuZ2VSZWFzb25Db2RlID0gMHhCQUQ7CisgICAgc3dpdGNoKGNoYW5uZWxDaGFuZ2VSZWFzb25Db2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBMSU1fU1dJVENIX0NIQU5ORUxfUkVBU1NPQzoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NTd2l0Y2hDaGFubmVsUmVBc3NvY1JlcShwTWFjLCBwc2Vzc2lvbkVudHJ5LCBzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElNX1NXSVRDSF9DSEFOTkVMX0pPSU46CisgICAgICAgICAgICBsaW1Qcm9jZXNzU3dpdGNoQ2hhbm5lbEpvaW5SZXEocE1hYywgcHNlc3Npb25FbnRyeSwgc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTElNX1NXSVRDSF9DSEFOTkVMX09QRVJBVElPTjoKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgYWJvdmUgY29kZSBzaG91bGQgYWxzbyB1c2UgdGhlIGNhbGxiYWNrLgorICAgICAgICAgICAgICogbWVjaGFuaXNtIGJlbG93LCB0aGVyZSBpcyBzY29wZSBmb3IgY2xlYW51cCBoZXJlLgorICAgICAgICAgICAgICogVEhhdCB3YXkgYWxsIHRoaXMgcmVzcG9uc2UgaGFuZGxlciBkb2VzIGlzIGNhbGwgdGhlIGNhbGwgYmFjaworICAgICAgICAgICAgICogV2UgY2FuIGdldCByaWQgb2YgdGhlIHJlYXNvbiBjb2RlIGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ3BjaGFuZ2VDaGFubmVsQ2FsbGJhY2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyggcE1hYywgTE9HMSwgIkNoYW5uZWwgY2hhbmdlZCBoZW5jZSBpbnZva2UgcmVnaXN0ZXJlZCBjYWxsIGJhY2tcbiIpOykKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BjaGFuZ2VDaGFubmVsQ2FsbGJhY2socE1hYywgc3RhdHVzLCBwTWFjLT5saW0uZ3BjaGFuZ2VDaGFubmVsRGF0YSwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKy8qKgorICogbGltUHJvY2Vzc1N0YXJ0U2NhblJzcCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3Mgc3RhcnRTY2FuUnNwIG1lc3NhZ2UgZnJvbSBIQUwuIElmIHNjYW4vbGVhcm4gd2FzIHN1Y2Nlc3NmdWwKKyAqICAgICAgdGhlbiBpdCB3aWxsIHN0YXJ0IHNjYW4vbGVhcm4gb24gdGhlIG5leHQgY2hhbm5lbC4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBib2R5IC0gbWVzc2FnZSBib2R5LgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltUHJvY2Vzc1N0YXJ0U2NhblJzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCAgdm9pZCAqYm9keSkKK3sKKyAgICB0cFN0YXJ0U2NhblBhcmFtcyAgICAgICBwU3RhcnRTY2FuUGFyYW07CisgICAgZUhhbFN0YXR1cyAgICAgICAgICAgICAgc3RhdHVzOworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworICAgIHBTdGFydFNjYW5QYXJhbSA9ICh0cFN0YXJ0U2NhblBhcmFtcykgYm9keTsKKyAgICBzdGF0dXMgPSBwU3RhcnRTY2FuUGFyYW0tPnN0YXR1czsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAvL0hBTCBmaWxscyBpbiB0aGUgdHggcG93ZXIgdXNlZCBmb3IgbWdtdCBmcmFtZXMgaW4gdGhpcyBmaWVsZC4KKyAgICAvL1N0b3JlIHRoaXMgdmFsdWUgdG8gdXNlIGluIFRQQyByZXBvcnQgSUUuCisgICAgcnJtQ2FjaGVNZ210VHhQb3dlciggcE1hYywgcFN0YXJ0U2NhblBhcmFtLT50eE1nbXRQb3dlciwgTlVMTCApOworICAgIC8vU3RvcmUgc3RhcnQgVFNGIG9mIHNjYW4gc3RhcnQuIFRoaXMgd2lsbCBiZSBzdG9yZWQgaW4gQlNTIHBhcmFtcy4KKyAgICBycm1VcGRhdGVTdGFydFRTRiggcE1hYywgcFN0YXJ0U2NhblBhcmFtLT5zdGFydFRTRiApOworI2VuZGlmCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKilib2R5KTsKKyAgICBpZiggcE1hYy0+bGltLmFib3J0U2NhbiApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCIgZmluaXNoIHNjYW5cbiIpICk7CisgICAgICAgIHBNYWMtPmxpbS5hYm9ydFNjYW4gPSAwOworICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9NSU5fQ0hBTk5FTF9USU1FUik7CisgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01BWF9DSEFOTkVMX1RJTUVSKTsKKyAgICAgICAgLy9TZXQgdGhlIHJlc3VtZSBjaGFubmVsIHRvIEFueSB2YWxpZCBjaGFubmVsIChpbnZhbGlkKS4gCisgICAgICAgIC8vVGhpcyB3aWxsIGluc3RydWN0IEhBTCB0byBzZXQgaXQgdG8gYW55IHByZXZpb3VzIHZhbGlkIGNoYW5uZWwuCisgICAgICAgIHBlU2V0UmVzdW1lQ2hhbm5lbChwTWFjLCAwLCAwKTsKKyAgICAgICAgbGltU2VuZEhhbEZpbmlzaFNjYW5SZXEocE1hYywgZUxJTV9IQUxfRklOSVNIX1NDQU5fV0FJVF9TVEFURSk7CisgICAgfQorICAgIHN3aXRjaChwTWFjLT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgZUxJTV9IQUxfU1RBUlRfU0NBTl9XQUlUX1NUQVRFOgorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAodEFOSV9VMzIpIGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJTdGFydFNjYW5Sc3Agd2l0aCBmYWlsZWQgc3RhdHVzPSAlZFxuIiksIHN0YXR1cyk7KQorICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gV2l0aCB0aGlzLCBMSU0gd2lsbCB0cnkgYW5kIHJlY292ZXIgc3RhdGUsIGJ1dAorICAgICAgICAgICAgICAgLy8gZVdOSV9TTUVfU0NBTl9DTkYgbWF5YmUgcmVwb3J0aW5nIGFuIGluY29ycmVjdAorICAgICAgICAgICAgICAgLy8gc3RhdHVzIGJhY2sgdG8gdGhlIFNNRQorICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgIC8vU2V0IHRoZSByZXN1bWUgY2hhbm5lbCB0byBBbnkgdmFsaWQgY2hhbm5lbCAoaW52YWxpZCkuIAorICAgICAgICAgICAgICAgLy9UaGlzIHdpbGwgaW5zdHJ1Y3QgSEFMIHRvIHNldCBpdCB0byBhbnkgcHJldmlvdXMgdmFsaWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgIHBlU2V0UmVzdW1lQ2hhbm5lbChwTWFjLCAwLCAwKTsKKyAgICAgICAgICAgICAgIGxpbVNlbmRIYWxGaW5pc2hTY2FuUmVxKCBwTWFjLCBlTElNX0hBTF9GSU5JU0hfU0NBTl9XQUlUX1NUQVRFICk7CisgICAgICAgICAgICAgICAvL2xpbUNvbXBsZXRlTWxtU2NhbihwTWFjLCBlU0lSX1NNRV9IQUxfU0NBTl9JTklUX0ZBSUxFRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSA9IGVMSU1fSEFMX1NDQU5OSU5HX1NUQVRFOworICAgICAgICAgICAgICAgbGltQ29udGludWVQb3N0Q2hhbm5lbFNjYW4ocE1hYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgICAgICBjYXNlIGVMSU1fSEFMX1NUQVJUX0xFQVJOX1dBSVRfU1RBVEU6CisgLy8gICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gKHRBTklfVTMyKSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9TZXQgdGhlIHJlc3VtZSBjaGFubmVsIHRvIEFueSB2YWxpZCBjaGFubmVsIChpbnZhbGlkKS4gCisgICAgICAgICAgICAgICAgICAgIC8vVGhpcyB3aWxsIGluc3RydWN0IEhBTCB0byBzZXQgaXQgdG8gYW55IHByZXZpb3VzIHZhbGlkIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgIHBlU2V0UmVzdW1lQ2hhbm5lbChwTWFjLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbGltU2VuZEhhbEZpbmlzaFNjYW5SZXEocE1hYywgZUxJTV9IQUxfRklOSVNIX0xFQVJOX1dBSVRfU1RBVEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1Db250aW51ZUNoYW5uZWxMZWFybihwTWFjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJSY3ZkIFN0YXJ0U2NhblJzcCBub3QgaW4gV0FJVCBTdGF0ZSwgc3RhdGUgJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKK30KK3ZvaWQgbGltUHJvY2Vzc0VuZFNjYW5Sc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgIHZvaWQgKmJvZHkpCit7CisgICAgdHBFbmRTY2FuUGFyYW1zICAgICBwRW5kU2NhblBhcmFtOworICAgIGVIYWxTdGF0dXMgICAgICAgICAgc3RhdHVzOworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgdEFOSV9VOCAgICAgICAgICAgICBjaGFubmVsTnVtOworI2VuZGlmCisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgcEVuZFNjYW5QYXJhbSA9ICh0cEVuZFNjYW5QYXJhbXMpIGJvZHk7CisgICAgc3RhdHVzID0gcEVuZFNjYW5QYXJhbS0+c3RhdHVzOworICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIChjaGFyICopYm9keSk7CisgICAgc3dpdGNoKHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBlTElNX0hBTF9FTkRfU0NBTl9XQUlUX1NUQVRFOgorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAodEFOSV9VMzIpIGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJFbmRTY2FuUnNwIHdpdGggZmFpbGVkIHN0YXR1cz0gJWRcbiIpLCBzdGF0dXMpOykKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID0gZUxJTV9IQUxfSURMRV9TQ0FOX1NUQVRFOworICAgICAgICAgICAgICAgbGltQ29tcGxldGVNbG1TY2FuKHBNYWMsIGVTSVJfU01FX0hBTF9TQ0FOX0lOSVRfRkFJTEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ3VycmVudFNjYW5DaGFubmVsSWQrKzsKKyAgICAgICAgICAgICAgIGxpbUNvbnRpbnVlQ2hhbm5lbFNjYW4ocE1hYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgICAgICBjYXNlIGVMSU1fSEFMX0VORF9MRUFSTl9XQUlUX1NUQVRFOgorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAodEFOSV9VMzIpIGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9TZXQgdGhlIHJlc3VtZSBjaGFubmVsIHRvIEFueSB2YWxpZCBjaGFubmVsIChpbnZhbGlkKS4gCisgICAgICAgICAgICAgICAgLy9UaGlzIHdpbGwgaW5zdHJ1Y3QgSEFMIHRvIHNldCBpdCB0byBhbnkgcHJldmlvdXMgdmFsaWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICBwZVNldFJlc3VtZUNoYW5uZWwocE1hYywgMCwgMCk7CisgICAgICAgICAgICAgICAgbGltU2VuZEhhbEZpbmlzaFNjYW5SZXEocE1hYywgZUxJTV9IQUxfRklOSVNIX0xFQVJOX1dBSVRfU1RBVEUpOworICAgICAgICAgICAgfQorI2lmIDAgLyogV2lsbCB3ZSBiZSBpbiBVTktOT1dOIFJPTEUgZXZlciBpbiB0aGlzIGNvbnRleHQ6IFZlZXJlbmRyYSAqLworICAgICAgICAgICAgZWxzZSBpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fVU5LTk9XTl9ST0xFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyoqIEJlZm9yZSBzdGFydGluZyBCU1MsIHdlIGRvIGNvbXBsZXRlIHNldCBvZiBtZWFzdXJlbWVudCBiZWZvcmUgcHV0dGluZworICAgICAgICAgICAgICAgICogICBzb2Z0bWFjIGJhY2sgaW50byBub3JtYWwgbW9kZS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgY2hhbm5lbE51bSA9IGxpbUdldEN1cnJlbnRMZWFybkNoYW5uZWwocE1hYyk7CisgICAgICAgICAgICAgICBsaW1TZW5kSGFsU3RhcnRTY2FuUmVxKHBNYWMsIGNoYW5uZWxOdW0sIGVMSU1fSEFMX1NUQVJUX0xFQVJOX1dBSVRfU1RBVEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIkVSUk9SISBUaGlzIHN0YXRlIGlzIHNldCBvbmx5IHdoZW4gQVAgaW4gVU5LTk9XTl9ST0xFXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlKTsKKyAgICAgICAgICAgICAgICBsaW1TZW5kSGFsRmluaXNoU2NhblJlcShwTWFjLCBlTElNX0hBTF9GSU5JU0hfTEVBUk5fV0FJVF9TVEFURSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJSY3ZkIGVuZFNjYW5Sc3Agbm90IGluIFdBSVQgU3RhdGUsIHN0YXRlICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit9Cit2b2lkIGxpbVByb2Nlc3NGaW5pc2hTY2FuUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsICB2b2lkICpib2R5KQoreworICAgIHRwRmluaXNoU2NhblBhcmFtcyAgICAgIHBGaW5pc2hTY2FuUGFyYW07CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgZHVtbXlTZXNzaW9uSWQgPSAwOworICAgIGVIYWxTdGF0dXMgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKyAgICBwRmluaXNoU2NhblBhcmFtID0gKHRwRmluaXNoU2NhblBhcmFtcykgYm9keTsKKyAgICBzdGF0dXMgPSBwRmluaXNoU2NhblBhcmFtLT5zdGF0dXM7CisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKGNoYXIgKilib2R5KTsKKyAgICBzd2l0Y2gocE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fSEFMX0ZJTklTSF9TQ0FOX1dBSVRfU1RBVEU6CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhhbFNjYW5TdGF0ZSA9IGVMSU1fSEFMX0lETEVfU0NBTl9TVEFURTsKKyAgICAgICAgICAgIGxpbUNvbXBsZXRlTWxtU2NhbihwTWFjLCBlU0lSX1NNRV9TVUNDRVNTKTsKKyAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVNwZWNNZ210LmRvdDExaENoYW5Td1N0YXRlID09IGVMSU1fMTFIX0NIQU5TV19SVU5OSU5HKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKiBSaWdodCB0aW1lIHRvIHN0b3AgdHggYW5kIHN0YXJ0IHRoZSB0aW1lciBmb3IgY2hhbm5lbCBzd2l0Y2ggKi8KKyAgICAgICAgICAgICAgICAvKiBTZW5kaW5nIFNlc3Npb24gSUQgMCwgbWF5IG5vdCBiZSBjb3JyZWN0LCBzaW5jZSBTQ0FOIGlzIGdsb2JhbCB0aGVyZSBzaG91bGQgbm90CisgICAgICAgICAgICAgICAgICogYmUgYW55IGFzc29jaWF0ZWQgc2Vzc2lvbiBpZAorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltU3RvcFR4QW5kU3dpdGNoQ2hhbm5lbChwTWFjLCBkdW1teVNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPT0gZUxJTV9RVUlFVF9CRUdJTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiogU3RhcnQgdGhlIHF1aWV0aW5nICovCisgICAgICAgICAgICAgICAgLyogU2VuZGluZyBTZXNzaW9uIElEIDAsIG1heSBub3QgYmUgY29ycmVjdCwgc2luY2UgU0NBTiBpcyBnbG9iYWwgdGhlcmUgc2hvdWxkIG5vdAorICAgICAgICAgICAgICAgICAqIGJlIGFueSBhc3NvY2lhdGVkIHNlc3Npb24gaWQKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbVN0YXJ0UXVpZXRUaW1lcihwTWFjLCBkdW1teVNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgICAgICAgICAgLyogRm9yIGhhbmRsaW5nIHRoZSBtZWFzdXJlbWVudCByZXF1ZXN0IGZyb20gV1NNIGFzIHNjYW4gcmVxdWVzdCBpbiBMSU0qLworI2lmIDAKKyAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSAmJiBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltU2VuZFNtZU1lYXN1cmVtZW50SW5kKHBNYWMpOworICAgICAgICAgICAgICAgIGxpbUNsZWFudXBNZWFzUmVzb3VyY2VzKHBNYWMpOworICAgICAgICAgICAgICAgIGxpbVJlc3RvcmVQcmVMZWFyblN0YXRlKHBNYWMpOworICAgICAgICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gKHRBTklfVTMyKSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiRW5kU2NhblJzcCB3aXRoIGZhaWxlZCBzdGF0dXM9ICVkXG4iKSwgc3RhdHVzKTspCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZiAoZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSB8fCBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKyAgICAgICAgY2FzZSBlTElNX0hBTF9GSU5JU0hfTEVBUk5fV0FJVF9TVEFURToKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID0gZUxJTV9IQUxfSURMRV9TQ0FOX1NUQVRFOworICAgICAgICAgICAgX19saW1Qcm9jZXNzRmluaXNoTGVhcm5Sc3AocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyNpZiAoZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSB8fCBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKy8vV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZAorICAgICAgICBjYXNlIGVMSU1fSEFMX1JFU1VNRV9MSU5LX1dBSVRfU1RBVEU6CisgICAgICAgICAgICBpZiggcE1hYy0+bGltLmdwTGltUmVzdW1lQ2FsbGJhY2sgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPSBlTElNX0hBTF9JRExFX1NDQU5fU1RBVEU7CisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1SZXN1bWVDYWxsYmFjayggcE1hYywgc3RhdHVzLCBwTWFjLT5saW0uZ3BMaW1SZXN1bWVEYXRhICk7CisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1SZXN1bWVDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1SZXN1bWVEYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3lzdGVtSW5TY2FuTGVhcm5Nb2RlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgIk5vIFJlc3VtZSBsaW5rIGNhbGxiYWNrIHNldCBidXQgc3RhdGlvbiBpcyBpbiBzdXNwZW5kIHN0YXRlXG4iKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworLy9lbmQgV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZAorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIlJjdmQgRmluaXNoU2NhblJzcCBub3QgaW4gV0FJVCBTdGF0ZSwgc3RhdGUgJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKK30KKy8qKgorICogQGZ1bmN0aW9uIDogbGltUHJvY2Vzc01sbUhhbEFkZEJBUnNwCisgKgorICogQGJyaWVmOiAgICAgUHJvY2VzcyBXREFfQUREQkFfUlNQIGNvbWluZyBmcm9tIEhBTAorICoKKyAqCisgKiBAcGFyYW0gcE1hYyBUaGUgZ2xvYmFsIHRwQW5pU2lyR2xvYmFsIG9iamVjdAorICoKKyAqIEBwYXJhbSB0U2lyTXNnUSBUaGUgTXNnUSBoZWFkZXIgY29udGFpbmluZyB0aGUgcmVzcG9uc2UgYnVmZmVyCisgKgorICogQHJldHVybiBub25lCisgKi8KK3ZvaWQgbGltUHJvY2Vzc01sbUhhbEFkZEJBUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRwU2lyTXNnUSBsaW1Nc2dRICkKK3sKKyAgICAvLyBTZW5kIExJTV9NTE1fQUREQkFfQ05GIHRvIExJTQorICAgIHRwTGltTWxtQWRkQkFDbmYgcE1sbUFkZEJBQ25mOworICAgIHRwUEVTZXNzaW9uICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRwQWRkQkFQYXJhbXMgcEFkZEJBUGFyYW1zID0gKHRwQWRkQkFQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19IQUxfQUREQkFfUlNQX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAwLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgICAvL25vdyBMSU0gY2FuIHByb2Nlc3MgYW55IGRlZmVyIG1lc3NhZ2UuCisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisgICAgaWYgKHBBZGRCQVBhcmFtcyA9PSBOVUxMKSB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgiTlVMTCBBREQgQkEgUmVzcG9uc2UgZnJvbSBIQUxcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgcEFkZEJBUGFyYW1zLT5zZXNzaW9uSWQpKT09TlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEOiAlZFxuIikscEFkZEJBUGFyYW1zLT5zZXNzaW9uSWQgKTspCisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKWxpbU1zZ1EtPmJvZHlwdHIpOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0hBTF9BRERCQV9SU1BfRVZFTlQsIHBzZXNzaW9uRW50cnksIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisgICAgLy8gQWxsb2NhdGUgZm9yIExJTV9NTE1fQUREQkFfQ05GCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgKHZvaWQgKiopICZwTWxtQWRkQkFDbmYsIHNpemVvZiggdExpbU1sbUFkZEJBQ25mICkpKSB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIiBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iKSk7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKWxpbU1zZ1EtPmJvZHlwdHIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBNbG1BZGRCQUNuZiwgc2l6ZW9mKCB0TGltTWxtQWRkQkFDbmYgKSk7CisgICAgIC8vIENvcHkgdGhlIHBlZXIgTUFDCisgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBNbG1BZGRCQUNuZi0+cGVlck1hY0FkZHIsIHBBZGRCQVBhcmFtcy0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRTaXJNYWNBZGRyICkpOworICAgICAvLyBDb3B5IG90aGVyIEFEREJBIFJzcCBwYXJhbWV0ZXJzCisgICAgIHBNbG1BZGRCQUNuZi0+YmFEaWFsb2dUb2tlbiA9IHBBZGRCQVBhcmFtcy0+YmFEaWFsb2dUb2tlbjsKKyAgICAgcE1sbUFkZEJBQ25mLT5iYVRJRCA9IHBBZGRCQVBhcmFtcy0+YmFUSUQ7CisgICAgIHBNbG1BZGRCQUNuZi0+YmFQb2xpY3kgPSBwQWRkQkFQYXJhbXMtPmJhUG9saWN5OworICAgICBwTWxtQWRkQkFDbmYtPmJhQnVmZmVyU2l6ZSA9IHBBZGRCQVBhcmFtcy0+YmFCdWZmZXJTaXplOworICAgICBwTWxtQWRkQkFDbmYtPmJhVGltZW91dCA9IHBBZGRCQVBhcmFtcy0+YmFUaW1lb3V0OworICAgICBwTWxtQWRkQkFDbmYtPmJhRGlyZWN0aW9uID0gcEFkZEJBUGFyYW1zLT5iYURpcmVjdGlvbjsKKyAgICAgcE1sbUFkZEJBQ25mLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBwQWRkQkFQYXJhbXMtPnN0YXR1cykKKyAgICAgICAgcE1sbUFkZEJBQ25mLT5hZGRCQVJlc3VsdENvZGUgPSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUzsKKyAgICAgZWxzZQorICAgICAgICBwTWxtQWRkQkFDbmYtPmFkZEJBUmVzdWx0Q29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKyAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopbGltTXNnUS0+Ym9keXB0cik7CisgICAgIC8vIFNlbmQgQUREQkEgQ05GIHRvIExJTQorICAgICBsaW1Qb3N0U21lTWVzc2FnZSggcE1hYywgTElNX01MTV9BRERCQV9DTkYsICh0QU5JX1UzMiAqKSBwTWxtQWRkQkFDbmYgKTsKK30KKy8qKgorICogXGJyaWVmIFByb2Nlc3MgTElNX01MTV9BRERCQV9DTkYKKyAqCisgKiBcc2EgbGltUHJvY2Vzc01sbUFkZEJBQ25mCisgKgorICogXHBhcmFtIHBNYWMgVGhlIGdsb2JhbCB0cEFuaVNpckdsb2JhbCBvYmplY3QKKyAqCisgKiBccGFyYW0gdFNpck1zZ1EgVGhlIE1zZ1EgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIHJlc3BvbnNlIGJ1ZmZlcgorICoKKyAqIFxyZXR1cm4gbm9uZQorICovCit2b2lkIGxpbVByb2Nlc3NNbG1BZGRCQUNuZiggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0QU5JX1UzMiAqcE1zZ0J1ZiApCit7Cit0cExpbU1sbUFkZEJBQ25mIHBNbG1BZGRCQUNuZjsKK3RwRHBoSGFzaE5vZGUgcFN0YTsKK3RBTklfVTE2IGFpZDsKK3RMaW1CQVN0YXRlIGN1ckJhU3RhdGU7Cit0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKK2lmKHBNc2dCdWYgPT0gTlVMTCkKK3sKKyAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMXG4iKSk7KQorICAgIHJldHVybjsKK30KK3BNbG1BZGRCQUNuZiA9ICh0cExpbU1sbUFkZEJBQ25mKSBwTXNnQnVmOworICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBNbG1BZGRCQUNuZi0+c2Vzc2lvbklkKSk9PSBOVUxMKQorICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSxGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gQlNTSWRcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgfQorICAvLyBGaXJzdCwgZXh0cmFjdCB0aGUgRFBIIGVudHJ5CisgIHBTdGEgPSBkcGhMb29rdXBIYXNoRW50cnkoIHBNYWMsIHBNbG1BZGRCQUNuZi0+cGVlck1hY0FkZHIsICZhaWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgaWYoIE5VTEwgPT0gcFN0YSApCisgIHsKKyAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICBGTCggIlNUQSBjb250ZXh0IG5vdCBmb3VuZCAtIGlnbm9yaW5nIEFEREJBIENORiBmcm9tIEhBTFxuIiApKTspCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcE1zZ0J1ZiApOworICAgIHJldHVybjsKKyAgfQorICBMSU1fR0VUX1NUQV9CQV9TVEFURShwU3RhLCBwTWxtQWRkQkFDbmYtPmJhVElELCAmY3VyQmFTdGF0ZSk7CisgIC8vIE5lZWQgdG8gdmFsaWRhdGUgU01FIHN0YXRlCisgIGlmKCBlTElNX0JBX1NUQVRFX1dUX0FERF9SU1AgIT0gY3VyQmFTdGF0ZSkKKyAgeworICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBBRERCQSBDTkYgd2hlbiBTVEEgQkEgc3RhdGUgaXMgJWRcbiIgKSwKKyAgICAgICAgY3VyQmFTdGF0ZSApOykKKyAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBNc2dCdWYgKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gUmVzdG9yZSBTVEEgQkEgc3RhdGUKKyAgTElNX1NFVF9TVEFfQkFfU1RBVEUocFN0YSwgcE1sbUFkZEJBQ25mLT5iYVRJRCwgZUxJTV9CQV9TVEFURV9JRExFKTsKKyAgaWYoIGVTSVJfU1VDQ0VTUyA9PSBwTWxtQWRkQkFDbmYtPmFkZEJBUmVzdWx0Q29kZSApCisgIHsKKyAgICAvLyBVcGRhdGUgTElNIGludGVybmFsIGNhY2hlLi4uCisgICAgaWYoIGVCQV9SRUNJUElFTlQgPT0gcE1sbUFkZEJBQ25mLT5iYURpcmVjdGlvbiApCisgICAgeworICAgICAgcFN0YS0+dGNDZmdbcE1sbUFkZEJBQ25mLT5iYVRJRF0uZlVzZUJBUnggPSAxOworICAgICAgcFN0YS0+dGNDZmdbcE1sbUFkZEJBQ25mLT5iYVRJRF0uZlJ4Q29tcEJBID0gMTsKKyAgICAgIHBTdGEtPnRjQ2ZnW3BNbG1BZGRCQUNuZi0+YmFUSURdLmZSeEJBcG9saWN5ID0gcE1sbUFkZEJBQ25mLT5iYVBvbGljeTsKKyAgICAgIHBTdGEtPnRjQ2ZnW3BNbG1BZGRCQUNuZi0+YmFUSURdLnJ4QnVmU2l6ZSA9IHBNbG1BZGRCQUNuZi0+YmFCdWZmZXJTaXplOworICAgICAgcFN0YS0+dGNDZmdbcE1sbUFkZEJBQ25mLT5iYVRJRF0udHVSeEJBV2FpdFRpbWVvdXQgPSBwTWxtQWRkQkFDbmYtPmJhVGltZW91dDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBTdGEtPnRjQ2ZnW3BNbG1BZGRCQUNuZi0+YmFUSURdLmZVc2VCQVR4ID0gMTsKKyAgICAgIHBTdGEtPnRjQ2ZnW3BNbG1BZGRCQUNuZi0+YmFUSURdLmZUeENvbXBCQSA9IDE7CisgICAgICBwU3RhLT50Y0NmZ1twTWxtQWRkQkFDbmYtPmJhVElEXS5mVHhCQXBvbGljeSA9IHBNbG1BZGRCQUNuZi0+YmFQb2xpY3k7CisgICAgICBwU3RhLT50Y0NmZ1twTWxtQWRkQkFDbmYtPmJhVElEXS50eEJ1ZlNpemUgPSBwTWxtQWRkQkFDbmYtPmJhQnVmZmVyU2l6ZTsKKyAgICAgIHBTdGEtPnRjQ2ZnW3BNbG1BZGRCQUNuZi0+YmFUSURdLnR1VHhCQVdhaXRUaW1lb3V0ID0gcE1sbUFkZEJBQ25mLT5iYVRpbWVvdXQ7CisgICAgfQorICB9CisgIGlmKCBlQkFfUkVDSVBJRU5UID09IHBNbG1BZGRCQUNuZi0+YmFEaXJlY3Rpb24gKQorICB7CisgICAgLy8KKyAgICAvLyBQYWNrYWdlIExJTV9NTE1fQUREQkFfUlNQIHRvIE1MTUUsIHdpdGggcHJvcGVyCisgICAgLy8gc3RhdHVzIGNvZGUuIE1MTUUgd2lsbCB0aGVuIHNlbmQgYW4gQUREQkEgUlNQCisgICAgLy8gb3ZlciB0aGUgYWlyIHRvIHRoZSBwZWVyIE1BQyBlbnRpdHkKKyAgICAvLworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gbGltUG9zdE1sbUFkZEJBUnNwKCBwTWFjLAorICAgICAgICAgIHBNbG1BZGRCQUNuZi0+cGVlck1hY0FkZHIsCisgICAgICAgICAgcE1sbUFkZEJBQ25mLT5hZGRCQVJlc3VsdENvZGUsCisgICAgICAgICAgcE1sbUFkZEJBQ25mLT5iYURpYWxvZ1Rva2VuLAorICAgICAgICAgICh0QU5JX1U4KSBwTWxtQWRkQkFDbmYtPmJhVElELAorICAgICAgICAgICh0QU5JX1U4KSBwTWxtQWRkQkFDbmYtPmJhUG9saWN5LAorICAgICAgICAgIHBNbG1BZGRCQUNuZi0+YmFCdWZmZXJTaXplLAorICAgICAgICAgIHBNbG1BZGRCQUNuZi0+YmFUaW1lb3V0LHBzZXNzaW9uRW50cnkpKQorICAgIHsKKyAgICAgIFBFTE9HVyhsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgICAgRkwoICJGYWlsZWQgdG8gcG9zdCBMSU1fTUxNX0FEREJBX1JTUCB0byAiICkpOworICAgICAgbGltUHJpbnRNYWNBZGRyKCBwTWFjLCBwTWxtQWRkQkFDbmYtPnBlZXJNYWNBZGRyLCBMT0dXICk7KQorICAgIH0KKyAgfQorICAvLyBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBMSU1fTUxNX0FEREJBX0NORgorICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwTXNnQnVmICk7Cit9CisvKioKKyAqIFxicmllZiBQcm9jZXNzIExJTV9NTE1fREVMQkFfQ05GCisgKgorICogXHNhIGxpbVByb2Nlc3NNbG1EZWxCQUNuZgorICoKKyAqIFxwYXJhbSBwTWFjIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIHRTaXJNc2dRIFRoZSBNc2dRIGhlYWRlciBjb250YWluaW5nIHRoZSByZXNwb25zZSBidWZmZXIKKyAqCisgKiBccmV0dXJuIG5vbmUKKyAqLwordm9pZCBsaW1Qcm9jZXNzTWxtRGVsQkFDbmYoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdEFOSV9VMzIgKnBNc2dCdWYgKQoreworICAgIHRwTGltTWxtRGVsQkFDbmYgICAgcE1sbURlbEJBQ25mOworICAgIHRwRHBoSGFzaE5vZGUgICAgICAgcFN0YTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGFpZDsKKy8vICAgIHRBTklfVTggICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRMaW1CQVN0YXRlICAgICAgICAgY3VyQmFTdGF0ZTsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnk7CisKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOykKKyAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcE1sbURlbEJBQ25mID0gKHRwTGltTWxtRGVsQkFDbmYpIHBNc2dCdWY7CisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgcE1sbURlbEJBQ25mLT5zZXNzaW9uSWQpKT09IE5VTEwpCisgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLEZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSURcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgfQorICAgIC8vIEZpcnN0LCBleHRyYWN0IHRoZSBEUEggZW50cnkKKyAgICBwU3RhID0gZHBoTG9va3VwSGFzaEVudHJ5KCBwTWFjLCBwTWxtRGVsQkFDbmYtPnBlZXJNYWNBZGRyLCAmYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSApOworICAgIGlmKCBOVUxMID09IHBTdGEgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoICJTVEEgY29udGV4dCBub3QgZm91bmQgLSBpZ25vcmluZyBERUxCQSBDTkYgZnJvbSBIQUxcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoTlVMTCA9PSBwTWxtRGVsQkFDbmYpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCAicE1sbURlbEJBQ25mIGlzIE5VTEwgLSBpZ25vcmluZyBERUxCQSBDTkYgZnJvbSBIQUxcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTmVlZCB0byB2YWxpZGF0ZSBiYVN0YXRlCisgICAgTElNX0dFVF9TVEFfQkFfU1RBVEUocFN0YSwgcE1sbURlbEJBQ25mLT5iYVRJRCwgJmN1ckJhU3RhdGUpOworICAgIGlmKCBlTElNX0JBX1NUQVRFX1dUX0RFTF9SU1AgIT0gY3VyQmFTdGF0ZSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBERUxCQSBDTkYgd2hlbiBTVEEgQkEgc3RhdGUgaXMgJWRcbiIgKSwKKyAgICAgICAgY3VyQmFTdGF0ZSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFJlc3RvcmUgU1RBIEJBIHN0YXRlCisgICAgTElNX1NFVF9TVEFfQkFfU1RBVEUocFN0YSwgcE1sbURlbEJBQ25mLT5iYVRJRCwgZUxJTV9CQV9TVEFURV9JRExFKTsKKyAgICAvLyBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBMSU1fTUxNX0RFTEJBX0NORgorICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBNc2dCdWYgKTsKK30KKy8qKgorICogXGJyaWVmIFByb2Nlc3MgU0lSX0xJTV9ERUxfQkFfSU5ECisgKgorICogXHNhIGxpbVByb2Nlc3NNbG1IYWxCQURlbGV0ZUluZAorICoKKyAqIFxwYXJhbSBwTWFjIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIHRTaXJNc2dRIFRoZSBNc2dRIGhlYWRlciBjb250YWluaW5nIHRoZSBpbmRpY2F0aW9uIGJ1ZmZlcgorICoKKyAqIFxyZXR1cm4gbm9uZQorICovCit2b2lkIGxpbVByb2Nlc3NNbG1IYWxCQURlbGV0ZUluZCggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cFNpck1zZ1EgbGltTXNnUSApCit7CisgICAgdFNpclJldFN0YXR1cyAgICAgICBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisgICAgdHBCQURlbGV0ZVBhcmFtcyAgICBwQkFEZWxldGVQYXJhbXM7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgICBwU3RhOworICAgIHRBTklfVTE2ICAgICAgICAgICAgYWlkOworICAgIHRMaW1CQVN0YXRlICAgICAgICAgY3VyQmFTdGF0ZTsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQ7CisKKyAgcEJBRGVsZXRlUGFyYW1zID0gKHRwQkFEZWxldGVQYXJhbXMpIGxpbU1zZ1EtPmJvZHlwdHI7CisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMscEJBRGVsZXRlUGFyYW1zLT5ic3NJZCwmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJZFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBGaXJzdCwgZXh0cmFjdCB0aGUgRFBIIGVudHJ5CisgICAgcFN0YSA9IGRwaExvb2t1cEhhc2hFbnRyeSggcE1hYywgcEJBRGVsZXRlUGFyYW1zLT5wZWVyTWFjQWRkciwgJmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUgKTsKKyAgICBpZiggTlVMTCA9PSBwU3RhICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgRkwoICJTVEEgY29udGV4dCBub3QgZm91bmQgLSBpZ25vcmluZyBCQSBEZWxldGUgSU5EIGZyb20gSEFMXG4iICkpOworICAgICAgICBnb3RvIHJldHVybkFmdGVyQ2xlYW51cDsKKyAgICB9CisKKyAgLy8gTmVlZCB0byB2YWxpZGF0ZSBCQSBzdGF0ZQorICBMSU1fR0VUX1NUQV9CQV9TVEFURShwU3RhLCBwQkFEZWxldGVQYXJhbXMtPmJhVElELCAmY3VyQmFTdGF0ZSk7CisgIGlmKCBlTElNX0JBX1NUQVRFX0lETEUgIT0gY3VyQmFTdGF0ZSApCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBCQSBEZWxldGUgSU5EIHdoZW4gU1RBIEJBIHN0YXRlIGlzICVkXG4iICksCisgICAgICAgIGN1ckJhU3RhdGUgKTsKKyAgICAgICAgZ290byByZXR1cm5BZnRlckNsZWFudXA7CisgICAgfQorCisgIC8vIFZhbGlkYXRlIGlmIGEgQkEgaXMgYWN0aXZlIGZvciB0aGUgcmVxdWVzdGVkIFRJRAorICAvLyBBTkQgaW4gdGhhdCBkZXNpcmVkIGRpcmVjdGlvbgorICBpZiggZUJBX0lOSVRJQVRPUiA9PSBwQkFEZWxldGVQYXJhbXMtPmJhRGlyZWN0aW9uICkKKyAgeworICAgIGlmKCAwID09IHBTdGEtPnRjQ2ZnW3BCQURlbGV0ZVBhcmFtcy0+YmFUSURdLmZVc2VCQVR4ICkKKyAgICAgIHN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiggMCA9PSBwU3RhLT50Y0NmZ1twQkFEZWxldGVQYXJhbXMtPmJhVElEXS5mVXNlQkFSeCApCisgICAgICBzdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisgIH0KKyAgICBpZiggZVNJUl9GQUlMVVJFID09IHN0YXR1cyApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgIEZMKCJSZWNlaXZlZCBhbiBJTlZBTElEIERFTEJBIERlbGV0ZSBJbmQgZm9yIFRJRCAlZC4uLlxuIiksCisgICAgICAgIHBCQURlbGV0ZVBhcmFtcy0+YmFUSUQgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gUG9zdCBERUxCQSBSRVEgdG8gTUxNRS4uLgorICAgICAgICBpZiggZVNJUl9TVUNDRVNTICE9CisgICAgICAgIChzdGF0dXMgPSBsaW1Qb3N0TWxtRGVsQkFSZXEoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCQURlbGV0ZVBhcmFtcy0+YmFEaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCQURlbGV0ZVBhcmFtcy0+YmFUSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTixwc2Vzc2lvbkVudHJ5ICkpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCggIkF0dGVtcHQgdG8gcG9zdCBMSU1fTUxNX0RFTEJBX1JFUSBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIgKSwgc3RhdHVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICBGTCggIkJBIERlbGV0ZSAtIFJlYXNvbiAweCUwOHguIEF0dGVtcHRpbmcgdG8gZGVsZXRlIEJBIHNlc3Npb24gZm9yIFRJRCAlZCB3aXRoIHBlZXIgU1RBICIgICksCisgICAgICAgICAgcEJBRGVsZXRlUGFyYW1zLT5yZWFzb25Db2RlLCBwQkFEZWxldGVQYXJhbXMtPmJhVElEICk7CisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIoIHBNYWMsIHBTdGEtPnN0YUFkZHIsIExPR0UgKTsKKyAgICAgICAgfQorICB9CityZXR1cm5BZnRlckNsZWFudXA6CisgIC8vIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIFNJUl9MSU1fREVMX0JBX0lORAorICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBsaW1Nc2dRLT5ib2R5cHRyICk7Cit9CisvKioKKyAqICBAZnVuY3Rpb24gOiBsaW1Qcm9jZXNzU2V0TWltb1JzcCgpCisgKgorICogIEBicmllZiA6ICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIHJlY2VpdmluZyB0aGUgV0RBX1NFVF9NSU1PUFNfUlNQIGZyb20gdGhlIEhBTAorICogICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgUHJvY2Vzc2luZyB0aGUgUmVxIGZyb20gdGhlIFNNRSAoUE1DKQorICoKKyAqICAgICAgTE9HSUM6CisgKgorICogICAgICBBU1NVTVBUSU9OUzoKKyAqICAgICAgICAgIE5BCisgKgorICogICAgICBOT1RFOgorICogICAgICAgICAgTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGxpbU1zZyAtIExpbSBNZXNzYWdlIHN0cnVjdHVyZSBvYmplY3Qgd2l0aCB0aGUgTWltb1BTcGFyYW0gaW4gYm9keQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUHJvY2Vzc1NldE1pbW9Sc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZykKK3sKKyNpZiAwCisgICAgdFNpclJldFN0YXR1cyAgICAgICAgICAgcmV0U3RhdHVzOworICAgIHRwU2V0TUlNT1BTICAgICAgICAgIHBNSU1PX1BTUGFyYW1zOworCisKKyAgICBkbyB7CisKKyAgICAgICAgcE1JTU9fUFNQYXJhbXMgPSAodHBTZXRNSU1PUFMpbGltTXNnLT5ib2R5cHRyOworICAgICAgICBpZiggTlVMTCA9PSBwTUlNT19QU1BhcmFtcyApIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgIlJlY2VpdmVkIHRoZSBXREFfU0VUX01JTU9QU19SU1Agd2l0aCBOVUxMIGFzIHRoZSBQUyBwYXJhbSIpOykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBJZiBVcGRhdGlvbiBvZiB0aGUgSEFMIEZhaWwncyovCisgICAgICAgIGlmIChwTUlNT19QU1BhcmFtcy0+c3RhdHVzICE9IGVTSVJfU1VDQ0VTUykgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJVcGRhdGUgSEFMIC8gU1cgTWFjIGZvciBNSU1PIFN0YXRlIGhhcyBGYWlsZWRcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgIT0gZVNZU1RFTV9TVEFfUk9MRSkgfHwKKyAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURSkgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IHBNYWMtPmxpbS5nTGltUHJldk1sbVN0YXRlOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKworICAgICAgICAvKiogSW4gdGhlIENhc2Ugb2YgRXhpdGluZyBvdXQgb2YgdGhlIFBvd2Vyc2F2ZSAoY2hhbmdpbmcgZnJvbSBEeW5hbWljL1N0YXRpYyBtb2RlIHRvIFNNIEVuYWJsZWQpCisgICAgICAgICAgKiAgIHNlbmQgdGhlIGFjdGlvbiBGcmFtZSB0byBQZWVyIHRvIHVwZGF0ZSB0aGUgUFMgU3RhdGUgb2YgdGhlIFNUQSAsIGZvciB0aGUgY2FzZSBvZiBFbnRlcmluZyBQb3dlclNhdmUKKyAgICAgICAgICAqICAgdGhlIEFjdGlvbiBGcmFtZSBpcyBiZWluZyBzZW50IGF0IGZpcnN0IGJlZm9yZSBzZXR0aW5nIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzCisgICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFpc0VudGVyaW5nTWltb1BTKHBNYWMtPmxpbS5nSFRNSU1PUFNTdGF0ZSwgcE1JTU9fUFNQYXJhbXMtPmh0TUlNT1BTU3RhdGUpKSB7CisgICAgICAgICAgICB0U2lyTWFjQWRkciAgICAgICAgICAgIG1hY0FkZHI7CisKKyAgICAgICAgICAgIC8qKiBPYnRhaW4gdGhlIEFQJ3MgTWFjIEFkZHJlc3MgKi8KKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYyAtPiBoSGRkLCAodEFOSV9VOCAqKW1hY0FkZHIsIHBNYWMtPmxpbS5nTGltQnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgICAgICAgICAvKiogU2VuZCBBY3Rpb24gRnJhbWUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtb2RlICovCisgICAgICAgICAgICByZXRTdGF0dXMgPSBsaW1TZW5kU01Qb3dlclN0YXRlRnJhbWUocE1hYywgbWFjQWRkciwgcE1JTU9fUFNQYXJhbXMtPmh0TUlNT1BTU3RhdGUpOworICAgICAgICAgICAgaWYgKHJldFN0YXR1cyAhPSBlU0lSX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJTZW5kaW5nIEFjdGlvbiBGcmFtZSBoYXMgZmFpbGVkXG4iKSk7KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlRoZSBTZXR0aW5nIHVwIG9mIExpbUdsb2JhbHMgaXMgc3VjY2Vzc2Z1bCBmb3IgTUlNT1BTIikpOykKKyAgICB9d2hpbGUoMCk7CisKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwTUlNT19QU1BhcmFtcyApOworI2VuZGlmCit9CisvKioKKyAgKiAgICAgQGZ1bmN0aW9uIDogbGltSGFuZGxlRGVsQnNzSW5SZUFzc29jQ29udGV4dAorICAqICAgICBAYnJpZWYgICAgICA6IFdoaWxlIFByb2Nlc3NpbmcgdGhlIFJlQXNzb2NpYXRpb24gUmVzcG9uc2UgRnJhbWUgaW4gU1RBLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgIGEuIGltbWVkaWF0ZWx5IGFmdGVyIHJlY2VpdmluZyB0aGUgUmVhc3NvYyBSZXNwb25zZSB0aGUgUnhDbGVhblVwIGlzCisgICogICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgaXNzdWVkIGFuZCB0aGUgZW5kIG9mIERlbEJTUyB0aGUgbmV3IEJTUyBpcyBiZWluZyBhZGRlZC4KKyAgKgorICAqICAgICAgICAgICAgICAgICAgICAgICAgIGIgLklmIGFuIEFQIHJlamVjdHMgdGhlIFJlQXNzb2NpYXRpb24gKERpc2Fzc29jIC8gRGVhdXRoKSB3aXRoIHNvbWUgY29udGV4dAorICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSwgV2UgbmVlZCB0byB1cGRhdGUgQ1NSIHdpdGggUmVBc3NvY0NORiBSZXNwb25zZSB3aXRoIHRoZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIFJlQXNzb2MgRmFpbCBhbmQgdGhlIHJlYXNvbiBDb2RlLCB0aGF0IGlzIGFsc28gYmVpbmcgaGFuZGxlZCBpbiB0aGUgREVMQlNTCisgICogICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCBvbmx5CisgICoKKyAgKiAgICAgQHBhcmFtIDogICBwTWFjIC0gdHBBbmlTaXJHbG9iYWwKKyAgKiAgICAgICAgICAgICAgICAgICAgIHBTdGFEcyAtIFN0YXRpb24gRGVzY3JpcHRvcgorICAqCisgICogICAgIEByZXR1cm4gOiAgbm9uZQorICAqLworc3RhdGljIHZvaWQKK2xpbUhhbmRsZURlbEJzc0luUmVBc3NvY0NvbnRleHQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhRHMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0TGltTWxtUmVhc3NvY0NuZiAgICAgICAgICAgbWxtUmVhc3NvY0NuZjsKKyAgICAvKiogU2tpcHBlZCB0aGUgRGVsZXRlRFBIIEhhc2ggRW50cnkgYXMgd2UgbmVlZCBpdCBmb3IgdGhlIG5ldyBCU1MqLworICAgIC8qKiBTZXQgdGhlIE1sbVN0YXRlIHRvIElETEUqLworICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKyAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkKi8KKyAgICBtbG1SZWFzc29jQ25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIHN3aXRjaCAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpIHsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgICAgICBjYXNlIGVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEUgOgorICAgICAgICB7CisgICAgICAgICAgICB0cFNpckFzc29jUnNwIGFzc29jUnNwOworICAgICAgICAgICAgdHBEcGhIYXNoTm9kZSAgIHBTdGFEczsKKyAgICAgICAgICAgIHRTaXJSZXRTdGF0dXMgICAgICAgcmV0U3RhdHVzID0gZVNJUl9TVUNDRVNTOworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UCisgICAgICAgICAgICB0U2NoQmVhY29uU3RydWN0IGJlYWNvblN0cnVjdDsKKyNlbmRpZgorICAgICAgICAgICAgLyoqIERlbGV0ZSB0aGUgb2xkZXIgU1RBIFRhYmxlIGVudHJ5ICovCisgICAgICAgICAgICBsaW1EZWxldGVEcGhIYXNoRW50cnkocE1hYywgcHNlc3Npb25FbnRyeS0+YnNzSWQsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAvKioKKyAgICAgICAgICAgICAqIEFkZCBhbiBlbnRyeSBmb3IgQVAgdG8gaGFzaCB0YWJsZQorICAgICAgICAgICAgICogbWFpbnRhaW5lZCBieSBEUEggbW9kdWxlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocFN0YURzID0gZHBoQWRkSGFzaEVudHJ5KHBNYWMsIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCwgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKSkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgYWRkIGhhc2ggdGFibGUgZW50cnkKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgYWRkIGhhc2ggZW50cnkgYXQgRFBIIGZvciBcbiIpKTspCisgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCwgTE9HRSk7CisgICAgICAgICAgICAgICAgbWxtUmVhc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworICAgICAgICAgICAgICAgIG1sbVJlYXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiogV2hpbGUgUHJvY2Vzc2luZyB0aGUgUmVBc3NvYyBSZXNwb25zZSBGcmFtZSB0aGUgUmVBc3NvY1JzcCBGcmFtZQorICAgICAgICAgICAgKiAgIGlzIGJlaW5nIHN0b3JlZCB0byBiZSB1c2VkIGhlcmUgZm9yIHNlbmRpbmcgQUREQlNTCisgICAgICAgICAgICAqLworICAgICAgICAgICAgYXNzb2NSc3AgPSAodHBTaXJBc3NvY1JzcClwc2Vzc2lvbkVudHJ5LT5saW1Bc3NvY1Jlc3BvbnNlRGF0YTsKKyAgICAgICAgICAgIGxpbVVwZGF0ZUFzc29jU3RhRGF0YXMocE1hYywgcFN0YURzLCBhc3NvY1JzcCxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIGxpbVVwZGF0ZVJlQXNzb2NHbG9iYWxzKHBNYWMsIGFzc29jUnNwLHBzZXNzaW9uRW50cnkpOworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UCisgICAgICAgICAgICBsaW1FeHRyYWN0QXBDYXBhYmlsaXRpZXMoIHBNYWMsCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+YnNzRGVzY3JpcHRpb24uaWVGaWVsZHMsCisgICAgICAgICAgICAgICAgICBsaW1HZXRJRWxlbkZyb21Cc3NEZXNjcmlwdGlvbiggJnBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbiApLAorICAgICAgICAgICAgICAgICAgICAmYmVhY29uU3RydWN0ICk7CisgICAgICAgICAgICBpZihwTWFjLT5saW0uZ0xpbVByb3RlY3Rpb25Db250cm9sICE9IFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fRElTQUJMRSkKKyAgICAgICAgICAgICAgICBsaW1EZWNpZGVTdGFQcm90ZWN0aW9uT25Bc3NvYyhwTWFjLCAmYmVhY29uU3RydWN0LCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICBpZihiZWFjb25TdHJ1Y3QuZXJwUHJlc2VudCkgeworICAgICAgICAgICAgICAgIGlmIChiZWFjb25TdHJ1Y3QuZXJwSUVJbmZvLmJhcmtlclByZWFtYmxlTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZTaG9ydFByZWFtYmxlID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3VwZGF0ZUJzcyBmbGFnIGlzIGZhbHNlLCBhcyBpbiB0aGlzIGNhc2UsIFBFIGlzIGZpcnN0IGRlbGV0aW5nIHRoZSBleGlzdGluZyBCU1MgYW5kIHRoZW4gYWRkaW5nIGEgbmV3IG9uZS4KKyAgICAgICAgICAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gbGltU3RhU2VuZEFkZEJzcyggcE1hYywgYXNzb2NSc3AsICZiZWFjb25TdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbiwgZmFsc2UsIHBzZXNzaW9uRW50cnkpKSAgeworICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJQb3N0aW5nIEFEREJTUyBpbiB0aGUgUmVBc3NvY0NvbnRleHQgaGFzIEZhaWxlZCBcbiIpKTsKKyAgICAgICAgICAgICAgICByZXRTdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgICAgICAgICAgaWYgKGVTSVJfU1VDQ0VTUyAhPSBsaW1TdGFTZW5kQWRkQnNzKCBwTWFjLCAoKmFzc29jUnNwKSwgJnBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5uZWlnaGJvckJzc0xpc3QuYnNzTGlzdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHBzZXNzaW9uRW50cnkpKSAgeworICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJQb3N0aW5nIEFEREJTUyBpbiB0aGUgUmVBc3NvY0NvbnRleHQgaGFzIEZhaWxlZCBcbiIpKTsKKyAgICAgICAgICAgICAgICByZXRTdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChyZXRTdGF0dXMgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICBtbG1SZWFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTOworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgYXNzb2NSc3ApOworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQXNzb2NSZXNwb25zZURhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIGFzc29jUnNwKTsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbUFzc29jUmVzcG9uc2VEYXRhID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlTElNX1NNRV9XVF9SRUFTU09DX0xJTktfRkFJTF9TVEFURToKKyAgICAgICAgeworICAgICAgICAgICAgLyoqIENhc2Ugd2hlcmVpbiB0aGUgRGlzQXNzb2MgLyBEZWF1dGgKKyAgICAgICAgICAgICAqICAgYmVpbmcgc2VudCBhcyByZXNwb25zZSB0byBSZUFzc29jIFJlcSovCisgICAgICAgICAgICAvKiogU2VuZCB0aGUgUmVhc29uIGNvZGUgYXMgdGhlIHNhbWUgcmVjZWl2ZWQgaW4gRGlzYXNzb2MgLyBEZWF1dGggRnJhbWUqLworICAgICAgICAgICAgbWxtUmVhc3NvY0NuZi5yZXN1bHRDb2RlID0gcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uOworICAgICAgICAgICAgbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5jbGVhbnVwVHJpZ2dlcjsKKyAgICAgICAgICAgIC8qKiBTZXQgdGhlIFNNRSBTdGF0ZSBiYWNrIHRvIFdUX1JlYXNzb2MgU3RhdGUqLworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFOworICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisgICAgICAgICAgICBsaW1EZWxldGVEcGhIYXNoRW50cnkocE1hYywgcFN0YURzLT5zdGFBZGRyLCBwU3RhRHMtPmFzc29jSWQscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICBpZigocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKXx8CisgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9JRExFX1NUQVRFOworICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW1Qb3N0U21lTWVzc2FnZShwTWFjLCBMSU1fTUxNX1JFQVNTT0NfQ05GLCAodEFOSV9VMzIgKikgJm1sbVJlYXNzb2NDbmYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJEZWxCc3MgaXMgYmVpbmcgaW52b2tlZCBpbiB0aGUgd3Jvbmcgc3lzdGVtIFJvbGUgL3VuaGFuZGxlZCAgU01FIFN0YXRlXG4iKSk7KQorICAgICAgICAgICAgbWxtUmVhc3NvY0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKyAgICAgICAgICAgIG1sbVJlYXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPSBlU0lSX1NNRV9VTkVYUEVDVEVEX1JFUV9SRVNVTFRfQ09ERTsKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorcmV0dXJuOworRXJyb3I6CisgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywgTElNX01MTV9SRUFTU09DX0NORiwgKHRBTklfVTMyICopICZtbG1SZWFzc29jQ25mKTsKK30KKworLyogQWRkZWQgRm9yIEJUIC1BTVAgU3VwcG9ydCAqLworc3RhdGljIHZvaWQKK2xpbVByb2Nlc3NCdGFtcEFkZEJzc1JzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdExpbU1sbVN0YXJ0Q25mIG1sbVN0YXJ0Q25mOworICAgIHRBTklfVTMyIHZhbDsKKyAgICB0cEFkZEJzc1BhcmFtcyBwQWRkQnNzUGFyYW1zID0gKHRwQWRkQnNzUGFyYW1zKSBsaW1Nc2dRLT5ib2R5cHRyOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gcEFkZEJzc1BhcmFtcy0+c3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiV0RBX0FERF9CU1NfUlNQIHJldHVybmVkIHdpdGggZUhBTF9TVEFUVVNfU1VDQ0VTU1xuIikpOworICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9BUF9NT0RFKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmIChsaW1TZXRMaW5rU3RhdGUocE1hYywgZVNJUl9MSU5LX0JUQU1QX0FQX1NUQVRFLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MgKQorICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICB9IGVsc2UgaWYgKHBzZXNzaW9uRW50cnktPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9TVEFfTU9ERSkgeworICAgICAgICAgICAgaWYgKGxpbVNldExpbmtTdGF0ZShwTWFjLCBlU0lSX0xJTktfU0NBTl9TVEFURSwgcHNlc3Npb25FbnRyeS0+YnNzSWQsCisgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBOVUxMLCBOVUxMKSAhPSBlU0lSX1NVQ0NFU1MgKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgfQorCisgICAgICAgIC8vIFNldCBNTE1FIHN0YXRlCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlPSBlTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+c3RhdHlwZUZvckJzcyA9IFNUQV9FTlRSWV9TRUxGOyAvLyB0byBrbm93IHNlc3Npb24gc3RhcnRlZCBmb3IgcGVlciBvciBmb3Igc2VsZgorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZHggPSAodEFOSV9VOCkgcEFkZEJzc1BhcmFtcy0+YnNzSWR4OworICAgICAgICBzY2hFZGNhUHJvZmlsZVVwZGF0ZShwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgbGltSW5pdEFJRHBvb2wocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgLy8gQ3JlYXRlIHRpbWVycyB1c2VkIGJ5IExJTQorICAgICAgICBpZiAoIXBNYWMtPmxpbS5nTGltVGltZXJzQ3JlYXRlZCkKKyAgICAgICAgbGltQ3JlYXRlVGltZXJzKHBNYWMpOworICAgICAgLyogVXBkYXRlIHRoZSBsaW0gZ2xvYmFsIGdMaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW5EdXJpbmdRdWlldEJzcyAqLworICAgICAgICBpZiggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0SW50KCBwTWFjLCBXTklfQ0ZHX1RSSUdfU1RBX0JLX1NDQU4sICZ2YWwgKSkKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBnZXQgV05JX0NGR19UUklHX1NUQV9CS19TQ0FOIVxuIikpOworICAgICAgICBwTWFjLT5saW0uZ0xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzID0gKHZhbCkgPyAxIDogMDsKKyAgICAgICAgLy8gQXBwbHkgcHJldmlvdXNseSBzZXQgY29uZmlndXJhdGlvbiBhdCBIVworICAgICAgICBsaW1BcHBseUNvbmZpZ3VyYXRpb24ocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+c3RhSWQgPSBwQWRkQnNzUGFyYW1zLT5zdGFDb250ZXh0LnN0YUlkeDsKKyAgICAgICAgbWxtU3RhcnRDbmYucmVzdWx0Q29kZSAgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiV0RBX0FERF9CU1NfUkVRIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiApLHBBZGRCc3NQYXJhbXMtPnN0YXR1cyApOworICAgICAgICBtbG1TdGFydENuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfSEFMX1NFTkRfTUVTU0FHRV9GQUlMOworICAgIH0KKyAgICBtbG1TdGFydENuZi5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKyAgICBsaW1Qb3N0U21lTWVzc2FnZSggcE1hYywgTElNX01MTV9TVEFSVF9DTkYsICh0QU5JX1UzMiAqKSAmbWxtU3RhcnRDbmYgKTsKKyAgICBlbmQ6CisgICAgaWYoIDAgIT0gbGltTXNnUS0+Ym9keXB0ciApCisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBBZGRCc3NQYXJhbXMgKTsKK30KKworLyoqCisgICogICAgIEBmdW5jdGlvbiA6IGxpbUhhbmRsZUFkZEJzc0luUmVBc3NvY0NvbnRleHQKKyAgKiAgICAgQGJyaWVmICAgICAgOiBXaGlsZSBQcm9jZXNzaW5nIHRoZSBSZUFzc29jaWF0aW9uIFJlc3BvbnNlIEZyYW1lIGluIFNUQSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhLiBpbW1lZGlhdGVseSBhZnRlciByZWNlaXZpbmcgdGhlIFJlYXNzb2MgUmVzcG9uc2UgdGhlIFJ4Q2xlYW5VcCBpcworICAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIGlzc3VlZCBhbmQgdGhlIGVuZCBvZiBEZWxCU1MgdGhlIG5ldyBCU1MgaXMgYmVpbmcgYWRkZWQuCisgICoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiIC5JZiBhbiBBUCByZWplY3RzIHRoZSBSZUFzc29jaWF0aW9uIChEaXNhc3NvYyAvIERlYXV0aCkgd2l0aCBzb21lIGNvbnRleHQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UsIFdlIG5lZWQgdG8gdXBkYXRlIENTUiB3aXRoIFJlQXNzb2NDTkYgUmVzcG9uc2Ugd2l0aCB0aGUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBSZUFzc29jIEZhaWwgYW5kIHRoZSByZWFzb24gQ29kZSwgdGhhdCBpcyBhbHNvIGJlaW5nIGhhbmRsZWQgaW4gdGhlIERFTEJTUworICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgb25seQorICAqCisgICogICAgIEBwYXJhbSA6ICAgcE1hYyAtIHRwQW5pU2lyR2xvYmFsCisgICogICAgICAgICAgICAgICAgICAgICBwU3RhRHMgLSBTdGF0aW9uIERlc2NyaXB0b3IKKyAgKgorICAqICAgICBAcmV0dXJuIDogIG5vbmUKKyAgKi8KK3ZvaWQKK2xpbUhhbmRsZUFkZEJzc0luUmVBc3NvY0NvbnRleHQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhRHMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdExpbU1sbVJlYXNzb2NDbmYgICAgICAgICAgIG1sbVJlYXNzb2NDbmY7CisgICAgLyoqIFNraXBwZWQgdGhlIERlbGV0ZURQSCBIYXNoIEVudHJ5IGFzIHdlIG5lZWQgaXQgZm9yIHRoZSBuZXcgQlNTKi8KKyAgICAvKiogU2V0IHRoZSBNbG1TdGF0ZSB0byBJRExFKi8KKyAgICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKyAgICBzd2l0Y2ggKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKSB7CisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICAgICAgY2FzZSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFIDogeworICAgICAgICAgICAgdHBTaXJBc3NvY1JzcCBhc3NvY1JzcDsKKyAgICAgICAgICAgIHRwRHBoSGFzaE5vZGUgICBwU3RhRHM7CisgICAgICAgICAgICB0U2lyUmV0U3RhdHVzICAgICAgIHJldFN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0NMSUVOVAorICAgICAgICAgICAgdFNjaEJlYWNvblN0cnVjdCBiZWFjb25TdHJ1Y3Q7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIEdldCB0aGUgQVAgZW50cnkgZnJvbSBEUEggaGFzaCB0YWJsZQorICAgICAgICAgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgICAgICAgICBpZiAocFN0YURzID09IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkZhaWwgdG8gZ2V0IFNUQSBQRUVSIGVudHJ5IGZyb20gaGFzaFxuIikpOykKKyAgICAgICAgICAgICAgICBtbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisgICAgICAgICAgICAgICAgbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKiBXaGlsZSBQcm9jZXNzaW5nIHRoZSBSZUFzc29jIFJlc3BvbnNlIEZyYW1lIHRoZSBSZUFzc29jUnNwIEZyYW1lCisgICAgICAgICAgICAqICAgaXMgYmVpbmcgc3RvcmVkIHRvIGJlIHVzZWQgaGVyZSBmb3Igc2VuZGluZyBBRERCU1MKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBhc3NvY1JzcCA9ICh0cFNpckFzc29jUnNwKXBzZXNzaW9uRW50cnktPmxpbUFzc29jUmVzcG9uc2VEYXRhOworICAgICAgICAgICAgbGltVXBkYXRlQXNzb2NTdGFEYXRhcyhwTWFjLCBwU3RhRHMsIGFzc29jUnNwLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIGxpbVVwZGF0ZVJlQXNzb2NHbG9iYWxzKHBNYWMsIGFzc29jUnNwLCBwc2Vzc2lvbkVudHJ5KTsKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0NMSUVOVAorICAgICAgICAgICAgbGltRXh0cmFjdEFwQ2FwYWJpbGl0aWVzKCBwTWFjLAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcHNlc3Npb25FbnRyeS0+cExpbVJlQXNzb2NSZXEtPmJzc0Rlc2NyaXB0aW9uLmllRmllbGRzLAorICAgICAgICAgICAgICAgICAgbGltR2V0SUVsZW5Gcm9tQnNzRGVzY3JpcHRpb24oICZwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+YnNzRGVzY3JpcHRpb24gKSwKKyAgICAgICAgICAgICAgICAgICAgJmJlYWNvblN0cnVjdCApOworICAgICAgICAgICAgaWYocE1hYy0+bGltLmdMaW1Qcm90ZWN0aW9uQ29udHJvbCAhPSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgbGltRGVjaWRlU3RhUHJvdGVjdGlvbk9uQXNzb2MocE1hYywgJmJlYWNvblN0cnVjdCwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgaWYoYmVhY29uU3RydWN0LmVycFByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmVhY29uU3RydWN0LmVycElFSW5mby5iYXJrZXJQcmVhbWJsZU1vZGUpCisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZSA9IDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGUgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZVNJUl9TVUNDRVNTICE9IGxpbVN0YVNlbmRBZGRCc3MoIHBNYWMsIGFzc29jUnNwLCAmYmVhY29uU3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+YnNzRGVzY3JpcHRpb24sIHRydWUsIHBzZXNzaW9uRW50cnkpKSAgeworICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJQb3N0aW5nIEFEREJTUyBpbiB0aGUgUmVBc3NvY0NvbnRleHQgaGFzIEZhaWxlZCBcbiIpKTsKKyAgICAgICAgICAgICAgICByZXRTdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgICAgICAgICAgaWYgKGVTSVJfU1VDQ0VTUyAhPSBsaW1TdGFTZW5kQWRkQnNzKCBwTWFjLCAoKmFzc29jUnNwKSwgJnBNYWMtPmxpbS5ncExpbVJlYXNzb2NSZXEtPm5laWdoYm9yQnNzTGlzdC5ic3NMaXN0WzBdLCB0cnVlKSkgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiUG9zdGluZyBBRERCU1MgaW4gdGhlIFJlQXNzb2NDb250ZXh0IGhhcyBGYWlsZWQgXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gZVNJUl9GQUlMVVJFOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocmV0U3RhdHVzICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtbG1SZWFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisgICAgICAgICAgICAgICAgbWxtUmVhc3NvY0NuZi5wcm90U3RhdHVzQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUzsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIGFzc29jUnNwKTsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUFzc29jUmVzcG9uc2VEYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBhc3NvY1JzcCk7CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1Bc3NvY1Jlc3BvbnNlRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUxJTV9TTUVfV1RfUkVBU1NPQ19MSU5LX0ZBSUxfU1RBVEU6IHsgICAgIC8qKiBDYXNlIHdoZXJlaW4gdGhlIERpc0Fzc29jIC8gRGVhdXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGJlaW5nIHNlbnQgYXMgcmVzcG9uc2UgdG8gUmVBc3NvYyBSZXEqLworICAgICAgICAgICAgLyoqIFNlbmQgdGhlIFJlYXNvbiBjb2RlIGFzIHRoZSBzYW1lIHJlY2VpdmVkIGluIERpc2Fzc29jIC8gRGVhdXRoIEZyYW1lKi8KKyAgICAgICAgICAgIG1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5kaXNhc3NvY1JlYXNvbjsKKyAgICAgICAgICAgIG1sbVJlYXNzb2NDbmYucHJvdFN0YXR1c0NvZGUgPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXI7CisgICAgICAgICAgICAvKiogU2V0IHRoZSBTTUUgU3RhdGUgYmFjayB0byBXVF9SZWFzc29jIFN0YXRlKi8KKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfV1RfUkVBU1NPQ19TVEFURTsKKyAgICAgICAgICAgIGxpbURlbGV0ZURwaEhhc2hFbnRyeShwTWFjLCBwU3RhRHMtPnN0YUFkZHIsIHBTdGFEcy0+YXNzb2NJZCwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpCisgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKworICAgICAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywgTElNX01MTV9SRUFTU09DX0NORiwgKHRBTklfVTMyICopICZtbG1SZWFzc29jQ25mKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRGVsQnNzIGlzIGJlaW5nIGludm9rZWQgaW4gdGhlIHdyb25nIHN5c3RlbSBSb2xlIC91bmhhbmRsZWQgIFNNRSBTdGF0ZVxuIikpOykKKyAgICAgICAgICAgIG1sbVJlYXNzb2NDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX1JFRlVTRUQ7CisgICAgICAgICAgICBtbG1SZWFzc29jQ25mLnByb3RTdGF0dXNDb2RlID0gZVNJUl9TTUVfVU5FWFBFQ1RFRF9SRVFfUkVTVUxUX0NPREU7CisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KK3JldHVybjsKK0Vycm9yOgorICAgIGxpbVBvc3RTbWVNZXNzYWdlKHBNYWMsIExJTV9NTE1fUkVBU1NPQ19DTkYsICh0QU5JX1UzMiAqKSAmbWxtUmVhc3NvY0NuZik7Cit9CisKKyNpZiAwCisgc3RhdGljIHZvaWQKK2xpbVByb2Nlc3NTbWVBc3NvY0NuZk5ldyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBtc2dUeXBlLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0U2lyU21lQXNzb2NDbmYgICAgYXNzb2NDbmY7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgIHBTdGFEczsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgcHNlc3Npb25FbnRyeTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgc2Vzc2lvbklkOworCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJwTXNnQnVmIGlzIE5VTEwgXG4iKSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZiAoKGxpbUFzc29jQ25mU2VyRGVzKHBNYWMsICZhc3NvY0NuZiwgKHRBTklfVTggKikgcE1zZ0J1ZikgPT0gZVNJUl9GQUlMVVJFKSB8fAorICAgICAgICAhX19saW1Jc1NtZUFzc29jQ25mVmFsaWQoJmFzc29jQ25mKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUmVjZWl2ZWQgaW52YWxpZCBTTUVfUkUoQVNTT0MpX0NORiBtZXNzYWdlIFxuIikpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLCBhc3NvY0NuZi5ic3NJZCwgJnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gYnNzSWRcbiIpKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmICggKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkgJiYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgIT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkpIHx8CisgICAgICAgICAoKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX05PUk1BTF9TVEFURSkgJiYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX05PUk1BTF9DSEFOTkVMX1NDQU5fU1RBVEUpKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUmVjZWl2ZWQgdW5leHBlY3RlZCBtZXNzYWdlICVYIGluIHN0YXRlICVYLCBpbiByb2xlICVYXG4iKSwKKyAgICAgICAgICAgICAgIG1zZ1R5cGUsIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICwgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgYXNzb2NDbmYuYWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgaWYgKHBTdGFEcyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICBGTCgiUmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlICVYIGR1ZSB0byBubyBTVEEgY29udGV4dCwgZm9yIGFpZCAlZCwgcGVlciAiKSwKKyAgICAgICAgICAgIG1zZ1R5cGUsIGFzc29jQ25mLmFpZCk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBhc3NvY0NuZi5wZWVyTWFjQWRkciwgTE9HMSk7CisgICAgICAgIC8qCisgICAgICAgICoqIHNlbmQgYSBESVNBU1NPQ19JTkQgbWVzc2FnZSB0byBXU00gdG8gbWFrZSBzdXJlCisgICAgICAgICoqIHRoZSBzdGF0ZSBpbiBXU00gYW5kIExJTSBpcyB0aGUgc2FtZQorICAgICAgICAqKi8KKyAgICAgICBsaW1TZW5kU21lRGlzYXNzb2NOdGYoIHBNYWMsIGFzc29jQ25mLnBlZXJNYWNBZGRyLCBlU0lSX1NNRV9TVEFfTk9UX0FTU09DSUFURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX1BFRVJfRU5USVRZX0RJU0FTU09DLCBhc3NvY0NuZi5haWQscHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQscHNlc3Npb25FbnRyeSk7CisgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmICgocFN0YURzICYmCisgICAgICAgICAoKCAhcGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsKHRBTklfVTggKikgcFN0YURzLT5zdGFBZGRyLAorICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgYXNzb2NDbmYucGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSApIHx8CisgICAgICAgICAgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPSBlTElNX01MTV9XVF9BU1NPQ19DTkZfU1RBVEUpIHx8CisgICAgICAgICAgKChwU3RhRHMtPm1sbVN0YUNvbnRleHQuc3ViVHlwZSA9PSBMSU1fQVNTT0MpICYmCisgICAgICAgICAgIChtc2dUeXBlICE9IGVXTklfU01FX0FTU09DX0NORikpIHx8CisgICAgICAgICAgKChwU3RhRHMtPm1sbVN0YUNvbnRleHQuc3ViVHlwZSA9PSBMSU1fUkVBU1NPQykgJiYKKyAgICAgICAgICAgKG1zZ1R5cGUgIT0gZVdOSV9TTUVfUkVBU1NPQ19DTkYpKSkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgIEZMKCJSZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgJVggZHVlIHRvIHBlZXJNYWNBZGRyIG1pc21hdGNoZWQgb3Igbm90IGluIGVMSU1fTUxNX1dUX0FTU09DX0NORl9TVEFURSBzdGF0ZSwgZm9yIGFpZCAlZCwgcGVlciAiKSwKKyAgICAgICAgICAgbXNnVHlwZSwgYXNzb2NDbmYuYWlkKTsKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIGFzc29jQ25mLnBlZXJNYWNBZGRyLCBMT0cxKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIC8qCisgICAgKiogRGVhY3RpdmF0ZS9kZWxldCBDTkZfV0FJVCB0aW1lciBzaW5jZSBBU1NPQ19DTkYKKyAgICAqKiBoYXMgYmVlbiByZWNlaXZlZAorICAgICoqLworICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiUmVjZWl2ZWQgU01FX0FTU09DX0NORi4gRGVsZXRlIFRpbWVyXG4iKSk7CisgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVBlclN0YUlkVGltZXIocE1hYywgZUxJTV9DTkZfV0FJVF9USU1FUiwgcFN0YURzLT5hc3NvY0lkKTsKKyAgICBpZiAoYXNzb2NDbmYuc3RhdHVzQ29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLyogSW4gQlRBTVAtQVAsIFBFIGFscmVhZHkgZmluaXNoZWQgdGhlIFdEQV9BRERfU1RBIHNlcXVlbmNlCisgICAgICAgICAqIHdoZW4gaXQgaGFkIHJlY2VpdmVkIEFzc29jIFJlcXVlc3QgZnJhbWUuIE5vdywgUEUganVzdCBuZWVkcyB0byBzZW5kCisgICAgICAgICAqIEFzc29jaWF0aW9uIFJlc3BvbnNlIGZyYW1lIHRvIHRoZSByZXF1ZXN0aW5nIEJUQU1QLVNUQS4KKyAgICAgICAgICovCisgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEU7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgic2VuZGluZyBBc3NvYyBSc3AgZnJhbWUgdG8gU1RBIChhc3NvYyBpZD0lZCkgXG4iKSwgcFN0YURzLT5hc3NvY0lkKTsKKyAgICAgICAgbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKCBwTWFjLCBlU0lSX1NVQ0NFU1MsIHBTdGFEcy0+YXNzb2NJZCwgcFN0YURzLT5zdGFBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlLCBwU3RhRHMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9IC8vIChhc3NvY0NuZi5zdGF0dXNDb2RlID09IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU01FX0FTU09DX0NORiBzdGF0dXMgaXMgbm9uLXN1Y2Nlc3MsIHNvIFNUQSBpcyBub3QgYWxsb3dlZCB0byBiZSBhc3NvY2lhdGVkCisgICAgICAgIGxpbVJlamVjdEFzc29jaWF0aW9uKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY0NuZi5zdGF0dXNDb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK2VuZDoKKyAgICBpZiAoIHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGFEcy0+YXNzb2NJZF0gIT0gTlVMTCApCisgICAgeworICAgICAgICBpZiAoICgodHBTaXJBc3NvY1JlcSkocHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSkpLT5hc3NvY1JlcUZyYW1lKSAKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCgodHBTaXJBc3NvY1JlcSkocHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSkpLT5hc3NvY1JlcUZyYW1lKTsKKyAgICAgICAgICAgICgodHBTaXJBc3NvY1JlcSkocHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSkpLT5hc3NvY1JlcUZyYW1lID0gTlVMTDsKKyAgICAgICAgfSAgICAgICAgCisKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcVtwU3RhRHMtPmFzc29jSWRdKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSA9IE5VTEw7CisgICAgfQorfSAvKioqIGVuZCBfX2xpbVByb2Nlc3NTbWVBc3NvY0NuZk5ldygpICoqKi8KKyNlbmRpZgorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordm9pZAorbGltU2VuZEJlYWNvbkluZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KXsKKyAgICB0QmVhY29uR2VuUGFyYW1zICpwQmVhY29uR2VuUGFyYW1zID0gTlVMTDsKKyAgICB0U2lyTXNnUSBsaW1Nc2c7CisgICAgLyoqIEFsbG9jYXRlIHRoZSBNZW1vcnkgZm9yIEJlYWNvbiBQcmUgTWVzc2FnZSBhbmQgZm9yIFN0YXRpb25zIGluIFBvd2VTYXZlKi8KKyAgICBpZihwc2Vzc2lvbkVudHJ5ID09IE5VTEwgKXsKKyAgICAgICBQRUxPR0UoIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMKCAiRXJyb3I6VW5hYmxlIHRvIGdldCB0aGUgUEVTZXNzaW9uRW50cnlcbiIgKSk7KQorICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcEJlYWNvbkdlblBhcmFtcywgKHNpemVvZigqcEJlYWNvbkdlblBhcmFtcykpKSkKKyAgICB7CisgICAgICAgIFBFTE9HRSggbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICAgRkwoICJVbmFibGUgdG8gUEFMIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgc2VuZGluZyBiZWFjb25QcmVNZXNzYWdlXG4iICkpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwQmVhY29uR2VuUGFyYW1zLCBzaXplb2YoKnBCZWFjb25HZW5QYXJhbXMpKTsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwQmVhY29uR2VuUGFyYW1zLT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19BRERSX0xFTkdUSCApOworICAgIGxpbU1zZy5ib2R5cHRyID0gcEJlYWNvbkdlblBhcmFtczsKKyAgICBzY2hQcm9jZXNzUHJlQmVhY29uSW5kKHBNYWMsICZsaW1Nc2cpOworICAgIHJldHVybjsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzUHJvYmVSZXFGcmFtZS5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzUHJvYmVSZXFGcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYjc3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NQcm9iZVJlcUZyYW1lLmMKQEAgLTAsMCArMSw5MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1Qcm9jZXNzUHJvYmVSZXFGcmFtZS5jYyBjb250YWlucyB0aGUgY29kZQorICogZm9yIHByb2Nlc3NpbmcgUHJvYmUgUmVxdWVzdCBGcmFtZS4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzI4LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisjZWxzZQorI2luY2x1ZGUgInduaUNmZ1N0YS5oIgorI2VuZGlmCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VyRGVzVXRpbHMuaCIKKyNpbmNsdWRlICJwYXJzZXJBcGkuaCIKKyNpbmNsdWRlICJsaW1TZXNzaW9uLmgiCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCit2b2lkIGxpbVNlbmRQMlBQcm9iZVJlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBCZCwgCisgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCit2b2lkCisKK2xpbVNlbmRTbWVQcm9iZVJlcUluZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBQcm9iZVJlcUlFLAorICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIFByb2JlUmVxSUVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgCisvKioKKyAqIGxpbUdldFdQU1BCQ1Nlc3Npb25zCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHF1ZXJ5IHRoZSBXUFMgUEJDIG92ZXJsYXAKKyAqCisgKkxPR0lDOgorICogVGhpcyBmdW5jdGlvbiBjaGVjayBXUFMgUEJDIHByb2JlIHJlcXVlc3QgbGluayBsaXN0IGZvciBQQkMgb3ZlcmxhcCAKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBhZGRyICAgQSBwb2ludGVyIHRvIHByb2JlIHJlcXVlc3Qgc291cmNlIE1BQyBhZGRyZXNzcworICogQHBhcmFtICB1dWlkX2UgQSBwb2ludGVyIHRvIFVVSURFIGVsZW1lbnQgb2YgV1BTIElFIGluIFdQUyBQQkMgcHJvYmUgcmVxdWVzdCAgCisgKiBAcGFyYW0gIHBzZXNzaW9uRW50cnkgICBBIHBvaW50ZXIgdG8gc3RhdGlvbiBQRSBzZXNzaW9uCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1HZXRXUFNQQkNTZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICphZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqdXVpZF9lLCBlV1BTUEJDT3ZlcmxhcCAqb3ZlcmxhcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICB0U2lyV1BTUEJDU2Vzc2lvbiAqcGJjOworICAgIHRBTklfVElNRVNUQU1QIGN1clRpbWU7CisKKyAgICBjdXJUaW1lID0gKHRBTklfVElNRVNUQU1QKShwYWxHZXRUaWNrQ291bnQocE1hYy0+aEhkZCkgLyBQQUxfVElDS1NfUEVSX1NFQ09ORCk7CisKKyAgICBwYWxGaWxsTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKWFkZHIsIHNpemVvZih0U2lyTWFjQWRkciksIDApOworICAgIHBhbEZpbGxNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopdXVpZF9lLCBTSVJfV1BTX1VVSURfTEVOLCAwKTsKKworICAgIGZvciAocGJjID0gcHNlc3Npb25FbnRyeS0+cEFQV1BTUEJDU2Vzc2lvbjsgcGJjOyBwYmMgPSBwYmMtPm5leHQpIHsKKworICAgICAgICBpZiAoY3VyVGltZSA+IHBiYy0+dGltZXN0YW1wICsgU0lSX1dQU19QQkNfV0FMS19USU1FKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgaWYoY291bnQgPiAxKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCAqKWFkZHIsICh0QU5JX1U4ICopcGJjLT5hZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXV1aWRfZSwgKHRBTklfVTggKilwYmMtPnV1aWRfZSwgU0lSX1dQU19VVUlEX0xFTik7ICAgICAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICBpZiAoY291bnQgPiAxKQorICAgIHsKKyAgICAgICAgKm92ZXJsYXAgPSBlU0FQX1dQU1BCQ19PVkVSTEFQX0lOMTIwUzsgICAgLy8gT3ZlcmxhcCAgCisgICAgfQorICAgIGVsc2UgaWYoY291bnQgPT0gMCkKKyAgICB7CisgICAgICAgICpvdmVybGFwID0gZVNBUF9XUFNQQkNfTk9fV1BTUEJDX1BST0JFX1JFUV9JTjEyMFM7ICAgIC8vIG5vIFdQUyBwcm9iZSByZXF1ZXN0IGluIDEyMCBzZWNvbmQgICAgCisgICAgfSBlbHNlCisgICAgeworICAgICAgICAgKm92ZXJsYXAgPSBlU0FQX1dQU1BCQ19PTkVfV1BTUEJDX1BST0JFX1JFUV9JTjEyMFM7ICAgLy8gT25lIFdQUyBwcm9iZSByZXF1ZXN0IGluIDEyMCBzZWNvbmQKKyAgICB9CisKKyAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJvdmVybGFwID0gJWRcbiIpLCAqb3ZlcmxhcCk7KQorICAgIFBFTE9HRShzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0dFLCBhZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTspCisgICAgUEVMT0dFKHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPR0UsIHV1aWRfZSwgU0lSX1dQU19VVUlEX0xFTik7KQorCisgICAgcmV0dXJuOworfQorCisvKioKKyAqIGxpbVJlbW92ZVRpbWVvdXRQQkNzZXNzaW9ucworICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZW1vdmUgdGhlIFdQUyBQQkMgcHJvYmUgcmVxdWVzdCBlbnRpcmVzIGZyb20gc3BlY2lmaWMgZW50cnkgdG8gZW5kLgorICoKKyAqTE9HSUM6CisgKgorICogCisgKkFTU1VNUFRJT05TOgorICoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwYmMgICAgVGhlIGJlZ2lubmluZyBlbnRyeSBpbiBXUFMgUEJDIHByb2JlIHJlcXVlc3QgbGluayBsaXN0CisgKgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbVJlbW92ZVRpbWVvdXRQQkNzZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyV1BTUEJDU2Vzc2lvbiAqcGJjKQoreworICAgICB0U2lyV1BTUEJDU2Vzc2lvbiAqcHJldjsKKworICAgICAgICB3aGlsZSAocGJjKSB7CisgICAgICAgICAgICAgICAgcHJldiA9IHBiYzsKKyAgICAgICAgICAgICAgICBwYmMgPSBwYmMtPm5leHQ7CisKKyAgICAgICAgUEVMT0c0KGxpbUxvZyhwTWFjLCBMT0c0LCBGTCgiV1BTIFBCQyBzZXNzaW9ucyByZW1vdmVcbiIpKTspCisgICAgICAgIFBFTE9HNChzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0c0LCBwcmV2LT5hZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTspCisgICAgICAgIFBFTE9HNChzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0c0LCBwcmV2LT51dWlkX2UsIFNJUl9XUFNfVVVJRF9MRU4pOykKKyAgICAgICAgCisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHJldik7CisgICAgICAgfQorfQorCit2b2lkIGxpbVJlbW92ZVBCQ1Nlc3Npb25zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHBSZW1vdmVNYWMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyV1BTUEJDU2Vzc2lvbiAqcGJjLCAqcHJldiA9IE5VTEw7CisgICAgcHJldiA9IHBiYyA9IHBzZXNzaW9uRW50cnktPnBBUFdQU1BCQ1Nlc3Npb247CisKKyAgICB3aGlsZSAocGJjKSB7CisgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXBiYy0+YWRkciwgCisgICAgICAgICAgICAgICh0QU5JX1U4ICopcFJlbW92ZU1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpIHsKKyAgICAgICAgICBwcmV2LT5uZXh0ID0gcGJjLT5uZXh0OworICAgICAgICAgIGlmIChwYmMgPT0gcHNlc3Npb25FbnRyeS0+cEFQV1BTUEJDU2Vzc2lvbikKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBBUFdQU1BCQ1Nlc3Npb24gPSBwYmMtPm5leHQ7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBiYyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcHJldiA9IHBiYzsKKyAgICAgICAgcGJjID0gcGJjLT5uZXh0OworICAgIH0KKworfQorCisvKioKKyAqIGxpbVVwZGF0ZVBCQ1Nlc3Npb25FbnRyeQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHByb2JlIHJlcXVlc3Qgd2l0aCBXUFMgUEJDIElFIGlzIHJlY2VpdmVkCisgKgorICpMT0dJQzoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkIHRoZSBXUFMgUEJDIHByb2JlIHJlcXVlc3QgaW4gdGhlIFdQUyBQQkMgcHJvYmUgcmVxdWVzdCBsaW5rIGxpc3QgCisgKiBUaGUgbGluayBsaXN0IGlzIGluIGRlY3JlYXNlZCB0aW1lIG9yZGVyIG9mIHByb2JlIHJlcXVlc3QgdGhhdCBpcyByZWNlaXZlZC4KKyAqIFRoZSBlbnRyeSB0aGF0IGlzIG1vcmUgdGhhbiAxMjAgc2Vjb25kIGlzIHJlbW92ZWQuCisgKiAKKyAqQVNTVU1QVElPTlM6CisgKgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGFkZHIgICBBIHBvaW50ZXIgdG8gcHJvYmUgcmVxdWVzdCBzb3VyY2UgTUFDIGFkZHJlc3NzCisgKiBAcGFyYW0gIHV1aWRfZSBBIHBvaW50ZXIgdG8gVVVJREUgZWxlbWVudCBvZiBXUFMgSUUgCisgKiBAcGFyYW0gIHBzZXNzaW9uRW50cnkgICBBIHBvaW50ZXIgdG8gc3RhdGlvbiBQRSBzZXNzaW9uCisgKgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQgbGltVXBkYXRlUEJDU2Vzc2lvbkVudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqYWRkciwgdEFOSV9VOCAqdXVpZF9lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJXUFNQQkNTZXNzaW9uICpwYmMsICpwcmV2ID0gTlVMTDsKKworICAgIHRBTklfVElNRVNUQU1QIGN1clRpbWU7CisKKyAgICBjdXJUaW1lID0gKHRBTklfVElNRVNUQU1QKShwYWxHZXRUaWNrQ291bnQocE1hYy0+aEhkZCkgLyBQQUxfVElDS1NfUEVSX1NFQ09ORCk7CisgICAgICAgICAgICAKKyAgICBQRUxPRzQobGltTG9nKHBNYWMsIExPRzQsIEZMKCJSZWNlaXZlIFdQUyBwcm9iZSByZXF1ZXMgY3VyVGltZT0lZFxuIiksIGN1clRpbWUpOykKKyAgICBQRUxPRzQoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HNCwgYWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7KQorICAgIFBFTE9HNChzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0c0LCB1dWlkX2UsIFNJUl9XUFNfVVVJRF9MRU4pOykKKworICAgIHBiYyA9IHBzZXNzaW9uRW50cnktPnBBUFdQU1BCQ1Nlc3Npb247CisKKyAgICB3aGlsZSAocGJjKSB7CisgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXBiYy0+YWRkciwgKHRBTklfVTggKilhZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSAmJgorICAgICAgICAgICAgcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTggKilwYmMtPnV1aWRfZSwgKHRBTklfVTggKil1dWlkX2UsIFNJUl9XUFNfVVVJRF9MRU4pKSB7CisgICAgICAgICAgICBpZiAocHJldikKKyAgICAgICAgICAgICAgICBwcmV2LT5uZXh0ID0gcGJjLT5uZXh0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBBUFdQU1BCQ1Nlc3Npb24gPSBwYmMtPm5leHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwcmV2ID0gcGJjOworICAgICAgICBwYmMgPSBwYmMtPm5leHQ7CisgICAgfQorCisgICAgaWYgKCFwYmMpIHsKKyAgICAgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwKKyAgICAgICAgICAgICh2b2lkICoqKSAmcGJjLCBzaXplb2YodFNpcldQU1BCQ1Nlc3Npb24pKSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgibWVtb3J5IGFsbG9jYXRlIGZhaWxlZCFcbiIpKTspCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXBiYy0+YWRkciwgKHRBTklfVTggKilhZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAKKyAgICAgICAgaWYgKHV1aWRfZSkKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTggKilwYmMtPnV1aWRfZSwgKHRBTklfVTggKil1dWlkX2UsIFNJUl9XUFNfVVVJRF9MRU4pOworICAgIH0KKyAgICAKKyAgICBwYmMtPm5leHQgPSBwc2Vzc2lvbkVudHJ5LT5wQVBXUFNQQkNTZXNzaW9uOworICAgIHBzZXNzaW9uRW50cnktPnBBUFdQU1BCQ1Nlc3Npb24gPSBwYmM7CisgICAgcGJjLT50aW1lc3RhbXAgPSBjdXJUaW1lOworICAgIAorICAgIC8qIHJlbW92ZSBlbnRyaWVzIHRoYXQgaGF2ZSB0aW1lZCBvdXQgKi8KKyAgICBwcmV2ID0gcGJjOworICAgIHBiYyA9IHBiYy0+bmV4dDsKKworICAgIHdoaWxlIChwYmMpIHsKKyAgICAgICAgaWYgKGN1clRpbWUgPiBwYmMtPnRpbWVzdGFtcCArIFNJUl9XUFNfUEJDX1dBTEtfVElNRSkgeworICAgICAgICAgICAgcHJldi0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICBsaW1SZW1vdmVUaW1lb3V0UEJDc2Vzc2lvbnMocE1hYywgcGJjKTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHJldiA9IHBiYzsKKyAgICAgICAgcGJjID0gcGJjLT5uZXh0OworICAgIH0KK30KKyNpZiAwCisvKioKKyAqIGxpbVdQU1BCQ1RpbWVvdXQKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBXUFMgUEJDIGVucnRyaWVzIGNsZWFuIHVwIHRpbWVyIGlzIGV4cGlyZWQKKyAqCisgKkxPR0lDOgorICogVGhpcyBmdW5jdGlvbiByZW1vdmUgYWxsIHRoZSBlbnRyeWllcyB0aGF0IG1vcmUgdGhhbiAxMjAgc2Vjb25kIG9sZAorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBzZXNzaW9uRW50cnkgICBBIHBvaW50ZXIgdG8gc3RhdGlvbiBQRSBzZXNzaW9uCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBsaW1XUFNQQkNUaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9USU1FU1RBTVAgY3VyVGltZTsKKyAgICB0U2lyV1BTUEJDU2Vzc2lvbiAqcGJjLCAqcHJldiA9IE5VTEw7CisKKyAgICBjdXJUaW1lID0gKHRBTklfVElNRVNUQU1QKShwYWxHZXRUaWNrQ291bnQocE1hYy0+aEhkZCkgLyBQQUxfVElDS1NfUEVSX1NFQ09ORCk7CisgICAgCisgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiV1BTIFBCQyBjbGVhbnVwIHRpbWVvdXQgY3VyVGltZT0lZFxuIiksIGN1clRpbWUpOykKKworICAgIHByZXYgPSBwc2Vzc2lvbkVudHJ5LT5wQVBXUFNQQkNTZXNzaW9uOyAKKyAgICBpZihwcmV2KQorICAgICAgICBwYmMgPSBwcmV2LT5uZXh0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgCisgICAgd2hpbGUgKHBiYykgeworICAgICAgICBpZiAoY3VyVGltZSA+IHBiYy0+dGltZXN0YW1wICsgU0lSX1dQU19QQkNfV0FMS19USU1FKSB7CisgICAgICAgICAgICBwcmV2LT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIGxpbVJlbW92ZVRpbWVvdXRQQkNzZXNzaW9ucyhwTWFjLCBwYmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHJldiA9IHBiYzsKKyAgICAgICAgcGJjID0gcGJjLT5uZXh0OworICAgIH0KKworICAgIGlmKHByZXYpCisgICAgeworICAgICAgICAgaWYgKGN1clRpbWUgPiBwcmV2LT50aW1lc3RhbXAgKyBTSVJfV1BTX1BCQ19XQUxLX1RJTUUpIHsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBBUFdQU1BCQ1Nlc3Npb24gPSBOVUxMOyAgCisgICAgICAgICAgICBsaW1SZW1vdmVUaW1lb3V0UEJDc2Vzc2lvbnMocE1hYywgcHJldik7CisgICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYKKy8qKgorICogbGltV1BTUEJDQ2xvc2UKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBCU1MgaXMgY2xvc2VkCisgKgorICpMT0dJQzoKKyAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlIGFsbCB0aGUgV1BTIFBCQyBlbnRyaWVzCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcHNlc3Npb25FbnRyeSAgIEEgcG9pbnRlciB0byBzdGF0aW9uIFBFIHNlc3Npb24KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIGxpbVdQU1BCQ0Nsb3NlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyAgICBsaW1SZW1vdmVUaW1lb3V0UEJDc2Vzc2lvbnMocE1hYywgcHNlc3Npb25FbnRyeS0+cEFQV1BTUEJDU2Vzc2lvbik7CisKK30KKyNlbmRpZgorCisvKioKKyAqIGxpbUNoZWNrMTFiUmF0ZXMKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1Byb2JlUmVxRnJhbWUoKSB1cG9uCisgKiBQcm9iZSBSZXF1ZXN0IGZyYW1lIHJlY2VwdGlvbi4KKyAqCisgKkxPR0lDOgorICogVGhpcyBmdW5jdGlvbiBjaGVjayAxMWIgcmF0ZXMgaW4gc3VwcG9ydGVkUmF0ZXMgYW5kIGV4dGVuZGVkUmF0ZXMgcmF0ZXMKKyAqIAorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcmF0ZSAgIAorICoKKyAqIEByZXR1cm4gQk9PTEVBTgorICovCisKK3RBTklfQk9PTEVBTiBsaW1DaGVjazExYlJhdGVzKHRBTklfVTggcmF0ZSkKK3sKKyAgICBpZiAoICggMHgwMiA9PSAocmF0ZSkpCisgICAgICB8fCAoIDB4MDQgPT0gKHJhdGUpKQorICAgICAgfHwgKCAweDBiID09IChyYXRlKSkKKyAgICAgIHx8ICggMHgxNiA9PSAocmF0ZSkpCisgICAgICAgKQorICAgICAgIHsKKyAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgfSAKKyAgICByZXR1cm4gRkFMU0U7Cit9CisgIAorLyoqCisgKiBsaW1Qcm9jZXNzUHJvYmVSZXFGcmFtZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbgorICogUHJvYmUgUmVxdWVzdCBmcmFtZSByZWNlcHRpb24uCisgKgorICpMT0dJQzoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHJlY2VpdmVkIFByb2JlIFJlcXVlc3QgZnJhbWUgYW5kIHJlc3BvbmRzCisgKiB3aXRoIFByb2JlIFJlc3BvbnNlLgorICogT25seSBBUCBvciBTVEEgaW4gSUJTUyBtb2RlIHRoYXQgc2VudCBsYXN0IEJlYWNvbiB3aWxsIHJlc3BvbmQgdG8KKyAqIFByb2JlIFJlcXVlc3QuCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIDEuIEFQIG9yIFNUQSBpbiBJQlNTIG1vZGUgdGhhdCBzZW50IGxhc3QgQmVhY29uIHdpbGwgYWx3YXlzIHJlc3BvbmQKKyAqICAgIHRvIFByb2JlIFJlcXVlc3QgcmVjZWl2ZWQgd2l0aCBicm9hZGNhc3QgU1NJRC4KKyAqCisgKk5PVEU6CisgKiAxLiBEdW5ubyB3aGF0IHRvIGRvIHdpdGggUmF0ZXMgcmVjZWl2ZWQgaW4gUHJvYmUgUmVxdWVzdCBmcmFtZQorICogMi4gRnJhbWVzIHdpdGggb3V0LW9mLW9yZGVyIGZpZWxkcy9JRXMgYXJlIGRyb3BwZWQuCisgKgorICogQHBhcmFtICBwTWFjICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcFJ4UGFja2V0SW5mbyAgIEEgcG9pbnRlciB0byBCdWZmZXIgZGVzY3JpcHRvciArIGFzc29jaWF0ZWQgUERVcworICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVByb2Nlc3NQcm9iZVJlcUZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBSeFBhY2tldEluZm8sdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICpwQm9keTsKKyAgICB0cFNpck1hY01nbXRIZHIgICAgIHBIZHI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICBmcmFtZUxlbjsKKyAgICB0U2lyUHJvYmVSZXEgICAgICAgIHByb2JlUmVxOworICAgIHRBbmlTU0lEICAgICAgICAgICAgc3NJZDsKKyAgICB0U2lyTXNnUSAgICAgICAgICAgIG1zZ1E7CisgICAgdFNpclNtZVByb2JlUmVxICAgICAqcFNpclNtZVByb2JlUmVxOworICAgIHRBTklfVTMyICAgICAgICAgICAgd3BzQXBFbmFibGU9MCwgdG1wOworCisgICAgZG97CisgICAgICAgIC8vIERvbid0IHNlbmQgcHJvYmUgcmVzcG9uc2VzIGlmIGRpc2FibGVkCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVByb2JlUmVzcERpc2FibGVGbGFnKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworCisgICAgICAgIGlmICggKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKSB8fAorICAgICAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpfHwKKyAgICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSl8fCAKKyAgICAgICAgICAgICAoIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkgJiYKKyAgICAgICAgICAgICAoV0RBX0dFVF9SWF9CRUFDT05fU0VOVChwUnhQYWNrZXRJbmZvKSkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgZnJhbWVMZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pOworCisgICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJSZWNlaXZlZCBQcm9iZSBSZXF1ZXN0ICVkIGJ5dGVzIGZyb20gIiksIGZyYW1lTGVuKTsKKyAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMyk7KQorCisgICAgICAgICAgICAvLyBHZXQgcG9pbnRlciB0byBQcm9iZSBSZXF1ZXN0IGZyYW1lIGJvZHkKKyAgICAgICAgICAgcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKworICAgICAgICAgICAgLy8gUGFyc2UgUHJvYmUgUmVxdWVzdCBmcmFtZQorICAgICAgICAgICAgaWYgKHNpckNvbnZlcnRQcm9iZVJlcUZyYW1lMlN0cnVjdChwTWFjLCBwQm9keSwgZnJhbWVMZW4sICZwcm9iZVJlcSk9PWVTSVJfRkFJTFVSRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJQYXJzZSBlcnJvciBQcm9iZVJlcXVlc3QsIGxlbmd0aD0lZCwgU0EgaXM6IiksIGZyYW1lTGVuKTspCisgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0dXKTsKKyAgICAgICAgICAgICAgICBwTWFjLT5zeXMucHJvYmVFcnJvcisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfR09fTU9ERSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggaSA9IDAsIHJhdGVfMTFiID0gMCwgb3RoZXJfcmF0ZXMgPSAwOworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayAxMWIgcmF0ZXMgaW4gc3VwcG9ydGVkIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IHByb2JlUmVxLnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbUNoZWNrMTFiUmF0ZXMocHJvYmVSZXEuc3VwcG9ydGVkUmF0ZXMucmF0ZVtpXSAmIDB4N2YpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVfMTFiKys7IAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3JhdGVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayAxMWIgcmF0ZXMgaW4gZXh0ZW5kZWQgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgcHJvYmVSZXEuZXh0ZW5kZWRSYXRlcy5udW1SYXRlczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbUNoZWNrMTFiUmF0ZXMocHJvYmVSZXEuZXh0ZW5kZWRSYXRlcy5yYXRlW2ldICYgMHg3ZikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZV8xMWIrKzsgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfcmF0ZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggKHJhdGVfMTFiID4gMCkgJiYgKG90aGVyX3JhdGVzID09IDApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiUmVjZWl2ZWQgYSBwcm9iZSByZXF1ZXN0IGZyYW1lIHdpdGggb25seSAxMWIgcmF0ZXMsIFNBIGlzOiAiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0czKTspCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICggKHBzZXNzaW9uRW50cnktPkFQV1BTSUVzLlNpcldQU1Byb2JlUnNwSUUuRmllbGRQcmVzZW50ICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX1dQU19QUk9CUlNQX1ZFUl9QUkVTRU5UKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9iZVJlcS53c2NJZVByZXNlbnQgPT0gIDEpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2JlUmVxLnByb2JlUmVxV3NjSWVJbmZvLkRldmljZVBhc3N3b3JkSUQuaWQgPT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTQ19QQVNTV0RfSURfUFVTSF9CVVRUT04pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2JlUmVxLnByb2JlUmVxV3NjSWVJbmZvLlVVSURfRS5wcmVzZW50ID09IDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5md2RXUFNQQkNQcm9iZVJlcSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUxPRzQoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HNChzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0c0LCBwQm9keSwgZnJhbWVMZW4pOykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1TZW5kU21lUHJvYmVSZXFJbmQocE1hYywgcEhkci0+c2EsIHBCb2R5LCBmcmFtZUxlbiwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVVwZGF0ZVBCQ1Nlc3Npb25FbnRyeShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGRyLT5zYSwgcHJvYmVSZXEucHJvYmVSZXFXc2NJZUluZm8uVVVJRF9FLnV1aWQsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsICh0QU5JX1UxNikgV05JX0NGR19XUFNfRU5BQkxFLCAmdG1wKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwiRmFpbGVkIHRvIGNmZyBnZXQgaWQgJWRcbiIsIFdOSV9DRkdfV1BTX0VOQUJMRSApOworCisgICAgICAgICAgICAgICAgICAgIHdwc0FwRW5hYmxlID0gdG1wICYgV05JX0NGR19XUFNfRU5BQkxFX0FQOworICAgICAgICAgICAgICAgICAgICBpZiAoKHdwc0FwRW5hYmxlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHByb2JlUmVxLndzY0llUHJlc2VudCA9PSAgMSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwcm9iZVJlcS5wcm9iZVJlcVdzY0llSW5mby5EZXZpY2VQYXNzd29yZElELmlkID09IFdTQ19QQVNTV0RfSURfUFVTSF9CVVRUT04pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSBwcm9iZSByZXEgdG8gV1NNIHdoZW4gaXQgaXMgZnJvbSBhIFBCQyBzdGF0aW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopJnBTaXJTbWVQcm9iZVJlcSwgc2l6ZW9mKHRTaXJTbWVQcm9iZVJlcSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfUFJPQkVfUkVRXG4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbXNnUS50eXBlID0gZVdOSV9TTUVfUFJPQkVfUkVROworICAgICAgICAgICAgICAgICAgICAgICAgbXNnUS5ib2R5dmFsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1EuYm9keXB0ciA9IHBTaXJTbWVQcm9iZVJlcTsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIGRlZmluZWQoQU5JX0xJVFRMRV9CWVRFX0VORElBTikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVQcm9iZVJlcS0+bWVzc2FnZVR5cGUsIGVXTklfU01FX1BST0JFX1JFUSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSZwU2lyU21lUHJvYmVSZXEtPmxlbmd0aCwgc2l6ZW9mKHRTaXJTbWVQcm9iZVJlcSkpOworI2Vsc2UKKworICAgICAgICAgICAgICAgICAgICAgICAgcFNpclNtZVByb2JlUmVxLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1BST0JFX1JFUTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTaXJTbWVQcm9iZVJlcS0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJTbWVQcm9iZVJlcSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTaXJTbWVQcm9iZVJlcS0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFNpclNtZVByb2JlUmVxLT5wZWVyTWFjQWRkciwgcEhkci0+c2EsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgICAgICAgICAgICAgcFNpclNtZVByb2JlUmVxLT5kZXZpY2VQYXNzd2RJZCA9IHByb2JlUmVxLnByb2JlUmVxV3NjSWVJbmZvLkRldmljZVBhc3N3b3JkSUQuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1zZ1EsICBlUFJPVCkgIT0gZVNJUl9TVUNDRVNTKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJjb3VsZG50IHNlbmQgdGhlIHByb2JlIHJlcSB0byB3c20gIikpOykKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3NJZC5sZW5ndGggPSBwc2Vzc2lvbkVudHJ5LT5zc0lkLmxlbmd0aDsKKyAgICAgICAgICAgICAvKiBDb3B5IHRoZSBTU0lEIGZyb20gc2Vzc2lvIGVudHJ5IHRvIGxvY2FsIHZhcmlhYmxlICovCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBzc0lkLnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNzSWQuc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+c3NJZC5sZW5ndGgpOworCisgICAgICAgICAgICAvLyBDb21wYXJlIHJlY2VpdmVkIFNTSUQgd2l0aCBjdXJyZW50IFNTSUQuIElmIHRoZXkKKyAgICAgICAgICAgIC8vIG1hdGNoLCByZXBseSB3aXRoIFByb2JlIFJlc3BvbnNlLgorICAgICAgICAgICAgaWYgKHByb2JlUmVxLnNzSWQubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc3NJZC5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbXVsdGlwbGVTU0lEY2hlY2s7CisKKyAgICAgICAgICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsKHRBTklfVTggKikgJnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmKHByb2JlUmVxLnNzSWQpLCAodEFOSV9VOCkgKHNzSWQubGVuZ3RoICsgMSkpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRQcm9iZVJzcE1nbXRGcmFtZShwTWFjLCBwSGRyLT5zYSwgJnNzSWQsIERQSF9VU0VfTUdNVF9TVEFJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERQSF9OT05fS0VFUEFMSVZFX0ZSQU1FLCBwc2Vzc2lvbkVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVSZXEucDJwSWVQcmVzZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9HT19NT0RFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgIGRpcmVjdF9zc2lkWzddID0gIkRJUkVDVC0iOworICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgZGlyZWN0X3NzaWRfbGVuID0gNzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmZGlyZWN0X3NzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmKHByb2JlUmVxLnNzSWQuc3NJZCksICh0QU5JX1U4KSAoZGlyZWN0X3NzaWRfbGVuKSkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1TZW5kUHJvYmVSc3BNZ210RnJhbWUocE1hYywgcEhkci0+c2EsICZzc0lkLCBEUEhfVVNFX01HTVRfU1RBSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUEhfTk9OX0tFRVBBTElWRV9GUkFNRSwgcHNlc3Npb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlUmVxLnAycEllUHJlc2VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiSWdub3JpbmcgUHJvYmVSZXEgZnJhbWUgd2l0aCB1bm1hdGNoZWQgU1NJRCByZWNlaXZlZCBmcm9tICIpKTsKKyAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0czKTspCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnN5cy5wcm9iZUJhZFNzaWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApICYmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgICAgICAgICAgICAgIHRBTklfVTMyICAgIGNmZzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19TRU5EX1NJTkdMRV9TU0lEX0FMV0FZUywgJmNmZykKKyAgICAgICAgICAgICAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBTRU5EX1NTSURfSU5fUFJcbiIpKTsKKworICAgICAgICAgICAgICAgIGlmICghc3NJZC5sZW5ndGggJiYKKyAgICAgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+bnVtU1NJRCA9PSAxKSAmJgorICAgICAgICAgICAgICAgICAgICBjZmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJTZW5kaW5nIFByb2JlUnNwIHdpdGggc3VwcHJlc3NlZCBTU0lEIHRvIikpOworICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzIpOykKKworICAgICAgICAgICAgICAgICAgICBsaW1TZW5kUHJvYmVSc3BNZ210RnJhbWUoIHBNYWMsIHBIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAodEFuaVNTSUQgKikgcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5zc0lkTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRFBIX1VTRV9NR01UX1NUQUlELCBEUEhfTk9OX0tFRVBBTElWRV9GUkFNRSwgcHNlc3Npb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVSZXEucDJwSWVQcmVzZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBCcm9hZGNhc3QgU1NJRCBpbiB0aGUgUHJvYmUgUmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgLy8gUmVwbHkgd2l0aCBTU0lEIHdlJ3JlIGNvbmZpZ3VyZWQgd2l0aC4KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgICAgIC8vVHVybiBvZmYgdGhlIFNTSUQgbGVuZ3RoIHRvIDAgaWYgaGlkZGVuIFNTSUQgZmVhdHVyZSBpcyBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPnNzaWRIaWRkZW4pCisgICAgICAgICAgICAgICAgICAgICAgLypXZSBhcmUgcmV0dXJuaW5nIGZyb20gaGVyZSBhcyBwcm9iZSByZXF1ZXN0IGNvbnRhaW5zIHRoZSBicm9hZGNhc3QgU1NJRC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNvIG5vIG5lZWQgdG8gc2VuZCB0aGUgcHJvYmUgcmVzcCovCisgICAgICAgICAgICAgICAgICAgICAgICAvL3NzSWQubGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBsaW1TZW5kUHJvYmVSc3BNZ210RnJhbWUocE1hYywgcEhkci0+c2EsICZzc0lkLCBEUEhfVVNFX01HTVRfU1RBSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUEhfTk9OX0tFRVBBTElWRV9GUkFNRSwgcHNlc3Npb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlUmVxLnAycEllUHJlc2VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorbXVsdGlwbGVTU0lEY2hlY2s6CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApICYmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgICAgICAgICAgaWYgKCFwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPnNzSWQubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRBTklfVTggICAgIGk7CisKKyAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSBTU0lEcy9TdXBwcmVzc2VkIFNTSUQgaXMgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5udW1TU0lEOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5zc0lkTGlzdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwcm9iZVJlcS5zc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTgpIHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+c3NJZExpc3RbaV0ubGVuZ3RoICsgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRQcm9iZVJzcE1nbXRGcmFtZSggcE1hYywgcEhkci0+c2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBbmlTU0lEICopICZwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPnNzSWRMaXN0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERQSF9VU0VfTUdNVF9TVEFJRCwgRFBIX05PTl9LRUVQQUxJVkVfRlJBTUUsIHBzZXNzaW9uRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVSZXEucDJwSWVQcmVzZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5udW1TU0lEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9jYWwgU1NJRCBkb2VzIG5vdCBtYXRjaCB3aXRoIHJlY2VpdmVkIG9uZQorICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgcmVjZWl2ZWQgUHJvYmUgUmVxdWVzdCBmcmFtZQorICAgICAgICAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoIklnbm9yaW5nIFByb2JlUmVxIGZyYW1lIHdpdGggdW5tYXRjaGVkIFNTSUQgcmVjZWl2ZWQgZnJvbSAiKSk7CisgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HMyk7KQorICAgICAgICAgICAgICAgICAgICBwTWFjLT5zeXMucHJvYmVCYWRTc2lkKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsCisgICAgICAgICAgICAgICAgICAgRkwoIklnbm9yaW5nIFByb2JlUmVxIGZyYW1lIHdpdGggdW5tYXRjaGVkIFNTSUQgcmVjZWl2ZWQgZnJvbSAiKSk7CisgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0czKTspCisgICAgICAgICAgICAgICAgcE1hYy0+c3lzLnByb2JlQmFkU3NpZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWdub3JlIHJlY2VpdmVkIFByb2JlIFJlcXVlc3QgZnJhbWUKKyAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIklnbm9yaW5nIFByb2JlIFJlcXVlc3QgZnJhbWUgcmVjZWl2ZWQgZnJvbSAiKSk7CisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzMpOykKKyAgICAgICAgICAgIHBNYWMtPnN5cy5wcm9iZUlnbm9yZSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisKKyAgICByZXR1cm47Cit9IC8qKiogZW5kIGxpbVByb2Nlc3NQcm9iZVJlcUZyYW1lKCkgKioqLworCisvKioKKyAqIGxpbUluZGljYXRlUHJvYmVSZXFUb0hERAorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzUHJvYmVSZXFGcmFtZV9tdWx0aXBsZV9CU1MoKSB1cG9uCisgKiBQcm9iZSBSZXF1ZXN0IGZyYW1lIHJlY2VwdGlvbi4KKyAqCisgKkxPR0lDOgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgcmVjZWl2ZWQgUHJvYmUgUmVxdWVzdCBmcmFtZSBhbmQgUGFzcyAKKyAqIFByb2JlIFJlcXVlc3QgRnJhbWUgdG8gSERELgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcEJkICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gQnVmZmVyIGRlc2NyaXB0b3IgKyBhc3NvY2lhdGVkIFBEVXMKKyAqIEBwYXJhbSAgcHNlc3Npb25FbnRyeSAgICAgQSBwb2ludGVyIHRvIFBFIHNlc3Npb24KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQCitzdGF0aWMgdm9pZAorbGltSW5kaWNhdGVQcm9iZVJlcVRvSEREKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBCZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgcEhkcjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIGZyYW1lTGVuOworCisgICAgbGltTG9nKCBwTWFjLCBMT0cxLCAiUmVjZWl2ZWQgYSBwcm9iZSByZXF1ZXN0IGZyYW1lIik7CisKKyAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBCZCk7CisgICAgZnJhbWVMZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBCZCk7CisKKyAgICAvL3NlbmQgdGhlIHByb2JlIHJlcSB0byBTTUUuCisgICAgbGltU2VuZFNtZU1nbXRGcmFtZUluZCggcE1hYywgcEhkci0+ZmMuc3ViVHlwZSwKKyAgICAgICAgICAgICAgICh0QU5JX1U4KilwSGRyLCAoZnJhbWVMZW4gKyBzaXplb2YodFNpck1hY01nbXRIZHIpKSwgCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQsIFdEQV9HRVRfUlhfQ0gocEJkKSApOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfSU5URVJOQUwKKyAgICBsaW1TZW5kUDJQUHJvYmVSZXNwb25zZShwTWFjLCBwQmQsIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCit9IC8qKiogZW5kIGxpbUluZGljYXRlUHJvYmVSZXFUb0hERCgpICoqKi8KKyNlbmRpZgorCisvKioKKyAqIGxpbVByb2Nlc3NQcm9iZVJlcUZyYW1lX211bHRpcGxlX0JTUworICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbgorICogUHJvYmUgUmVxdWVzdCBmcmFtZSByZWNlcHRpb24uCisgKgorICpMT0dJQzoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbCBsaW1JbmRpY2F0ZVByb2JlUmVxVG9IREQgZnVuY3Rpb24gdG8gaW5kaWNhdGUgCisgKiBQcm9iZSBSZXF1ZXN0IGZyYW1lIHRvIEhERC4gSXQgYWxzbyBjYWxsIGxpbVByb2Nlc3NQcm9iZVJlcUZyYW1lIAorICogZnVuY3Rpb24gd2hpY2ggcHJvY2VzcyByZWNlaXZlZCBQcm9iZSBSZXF1ZXN0IGZyYW1lIGFuZCByZXNwb25kcworICogd2l0aCBQcm9iZSBSZXNwb25zZS4KKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBCZCAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIEJ1ZmZlciBkZXNjcmlwdG9yICsgYXNzb2NpYXRlZCBQRFVzCisgKiBAcGFyYW0gIHBzZXNzaW9uRW50cnkgICAgIEEgcG9pbnRlciB0byBQRSBzZXNzaW9uCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUHJvY2Vzc1Byb2JlUmVxRnJhbWVfbXVsdGlwbGVfQlNTKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBCZCwgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VOCBpOworCisgICAgaWYgKHBzZXNzaW9uRW50cnkgIT0gTlVMTCkKKyAgICB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICBpZiAoKGVMSU1fQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfSU5URVJOQUwKKyAgICAgICAgIHx8IChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fUDJQX0RFVklDRV9ST0xFKQorI2VuZGlmCisgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1JbmRpY2F0ZVByb2JlUmVxVG9IREQocE1hYywgcEJkLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGxpbVByb2Nlc3NQcm9iZVJlcUZyYW1lKHBNYWMscEJkLHBzZXNzaW9uRW50cnkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yKGkgPTA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7aSsrKQorICAgIHsKKyAgICAgICAgcHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLGkpOworICAgICAgICBpZiAoIChwc2Vzc2lvbkVudHJ5ICE9IE5VTEwpICkKKyAgICAgICAgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgIGlmICgoZUxJTV9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAorICAgICAgICAgICAgIHx8IChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fUDJQX0RFVklDRV9ST0xFKQorI2VuZGlmCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1JbmRpY2F0ZVByb2JlUmVxVG9IREQocE1hYywgcEJkLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKCAoZUxJTV9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpIHx8CisgICAgICAgICAgICAgICAgKGVMSU1fU1RBX0lOX0lCU1NfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKSB8fAorICAgICAgICAgICAgICAgIChlTElNX0JUX0FNUF9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpIHx8CisgICAgICAgICAgICAgICAgKGVMSU1fQlRfQU1QX1NUQV9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltUHJvY2Vzc1Byb2JlUmVxRnJhbWUocE1hYyxwQmQscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30gLyoqKiBlbmQgbGltUHJvY2Vzc1Byb2JlUmVxRnJhbWVfbXVsdGlwbGVfQlNTKCkgKioqLworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorLyoqCisgKiBsaW1TZW5kU21lUHJvYmVSZXFJbmQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIHNlbmQKKyAqICBlV05JX1NNRV9XUFNfUEJDX1BST0JFX1JFUV9JTkQgbWVzc2FnZSB0byBob3N0CisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNlbmRpbmcgIGVXTklfU01FX1dQU19QQkNfUFJPQkVfUkVRX0lORAorICogdG8gaG9zdC4KKyAqCisgKiBAcGFyYW0gcGVlck1hY0FkZHIgICAgICAgSW5kaWNhdGVzIHRoZSBwZWVyIE1BQyBhZGRyIHRoYXQgdGhlIHByb2JlIHJlcXVlc3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBnZW5lcmF0ZWQuCisgKiBAcGFyYW0gcFByb2JlUmVxSUUgICAgICAgcG9pbnRlciB0byBSQVcgcHJvYmUgcmVxdWVzdCBJRQorICogQHBhcmFtIFByb2JlUmVxSUVMZW4gICAgIFRoZSBsZW5ndGggb2YgcHJvYmUgcmVxdWVzdCBJRS4KKyAqIEBwYXJhbSBwc2Vzc2lvbkVudHJ5ICAgICBBIHBvaW50ZXIgdG8gUEUgc2Vzc2lvbgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1TZW5kU21lUHJvYmVSZXFJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwUHJvYmVSZXFJRSwKKyAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBQcm9iZVJlcUlFTGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJTbWVQcm9iZVJlcUluZCAgICAgKnBTaXJTbWVQcm9iZVJlcUluZDsKKyAgICB0U2lyTXNnUSAgICAgICAgICAgICAgICBtc2dROyAgIAorICAgICAgICAKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTaXJTbWVQcm9iZVJlcUluZCwgc2l6ZW9mKHRTaXJTbWVQcm9iZVJlcUluZCkpKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9QUk9CRV9SRVFcbiIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgbXNnUS50eXBlID0gIGVXTklfU01FX1dQU19QQkNfUFJPQkVfUkVRX0lORDsKKyAgICBtc2dRLmJvZHl2YWwgPSAwOworICAgIG1zZ1EuYm9keXB0ciA9IHBTaXJTbWVQcm9iZVJlcUluZDsKKyAgICAKKyAgICBwU2lyU21lUHJvYmVSZXFJbmQtPm1lc3NhZ2VUeXBlID0gIGVXTklfU01FX1dQU19QQkNfUFJPQkVfUkVRX0lORDsKKyAgICBwU2lyU21lUHJvYmVSZXFJbmQtPmxlbmd0aCA9IHNpemVvZih0U2lyU21lUHJvYmVSZXEpOworICAgIHBTaXJTbWVQcm9iZVJlcUluZC0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFNpclNtZVByb2JlUmVxSW5kLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTaXJTbWVQcm9iZVJlcUluZC0+V1BTUEJDUHJvYmVSZXEucGVlck1hY0FkZHIsIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworICAgIHBTaXJTbWVQcm9iZVJlcUluZC0+V1BTUEJDUHJvYmVSZXEucHJvYmVSZXFJRUxlbiA9ICh0QU5JX1UxNilQcm9iZVJlcUlFTGVuOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTaXJTbWVQcm9iZVJlcUluZC0+V1BTUEJDUHJvYmVSZXEucHJvYmVSZXFJRSwgcFByb2JlUmVxSUUsIFByb2JlUmVxSUVMZW4pOworICAgIAorICAgIGlmIChsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtc2dRLCAgZVBST1QpICE9IGVTSVJfU1VDQ0VTUyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGRudCBzZW5kIHRoZSBwcm9iZSByZXEgdG8gaGRkIikpOykKKyAgICB9IAorICAgICAgICAKK30gLyoqKiBlbmQgbGltU2VuZFNtZVByb2JlUmVxSW5kKCkgKioqLworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAordm9pZCBsaW1TZW5kUDJQUHJvYmVSZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQmQsIAorICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFuaVNTSUQgICAgICAgICAgICBzc0lkID0geyBQMlBfV0lMRENBUkRfU1NJRF9MRU4sIFAyUF9XSUxEQ0FSRF9TU0lEIH07CisgICAgdEFOSV9VOCAgICAgICAgICAgICAqcEJvZHk7CisgICAgdHBTaXJNYWNNZ210SGRyICAgICBwSGRyOworICAgIHRBTklfVTMyICAgICAgICAgICAgZnJhbWVMZW47CisgICAgdFNpclByb2JlUmVxICAgICAgICBwcm9iZVJlcTsKKworICAgIHBIZHIgPSAgV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBCZCk7CisgICAgLy8gR2V0IHBvaW50ZXIgdG8gUHJvYmUgUmVxdWVzdCBmcmFtZSBib2R5CisgICAgcEJvZHkgPSAgV0RBX0dFVF9SWF9NUERVX0RBVEEocEJkKTsgICAKKworICAgIGlmKCAocEJvZHlbMF0gPT0gMCkgJiYgKHBCb2R5WzFdID09IHNzSWQubGVuZ3RoKSAmJgorICAgICAgKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCBzc0lkLnNzSWQsIHBCb2R5ICsgMiwgCisgICAgICAgICAgICAgICAgICAgICAgIHNzSWQubGVuZ3RoKSkpCisgICAgeworICAgICAgICAvLyBQYXJzZSBQcm9iZSBSZXF1ZXN0IGZyYW1lCisgICAgICAgIGZyYW1lTGVuID0gV0RBX0dFVF9SWF9QQVlMT0FEX0xFTihwQmQpOworICAgICAgICBpZiAoZVNJUl9GQUlMVVJFID09IHNpckNvbnZlcnRQcm9iZVJlcUZyYW1lMlN0cnVjdChwTWFjLCBwQm9keSwgZnJhbWVMZW4sICZwcm9iZVJlcSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIlBhcnNlIGVycm9yIFByb2JlUmVxdWVzdCwgbGVuZ3RoPSVkLCBTQSBpczoiKSwgZnJhbWVMZW4pOykKKyAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwSGRyLT5zYSwgTE9HVyk7CisgICAgICAgICAgICBwTWFjLT5zeXMucHJvYmVFcnJvcisrOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpIAorICAgICAgICB7CisgICAgICAgICAgICBzc0lkLmxlbmd0aCA9IHBzZXNzaW9uRW50cnktPnNzSWQubGVuZ3RoOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBzc0lkLnNzSWQsIHBzZXNzaW9uRW50cnktPnNzSWQuc3NJZCxwc2Vzc2lvbkVudHJ5LT5zc0lkLmxlbmd0aCk7CisgICAgICAgICAgICBsaW1TZW5kUHJvYmVSc3BNZ210RnJhbWUocE1hYywgcEhkci0+c2EsICZzc0lkLCBEUEhfVVNFX01HTVRfU1RBSUQsIERQSF9OT05fS0VFUEFMSVZFX0ZSQU1FLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LCBwcm9iZVJlcS5wMnBJZVByZXNlbnQgKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICAgbGltU2VuZFByb2JlUnNwTWdtdEZyYW1lKHBNYWMsIHBIZHItPnNhLCAmc3NJZCwgRFBIX1VTRV9NR01UX1NUQUlELCBEUEhfTk9OX0tFRVBBTElWRV9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LCBwcm9iZVJlcS5wMnBJZVByZXNlbnQgKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvLyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NQcm9iZVJzcEZyYW1lLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NQcm9iZVJzcEZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5NDllYQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc1Byb2JlUnNwRnJhbWUuYwpAQCAtMCwwICsxLDM3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1Qcm9jZXNzUHJvYmVSc3BGcmFtZS5jYyBjb250YWlucyB0aGUgY29kZQorICogZm9yIHByb2Nlc3NpbmcgUHJvYmUgUmVzcG9uc2UgRnJhbWUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMy8wMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlICJ3bmlBcGkuaCIKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNlbHNlCisjaW5jbHVkZSAid25pQ2ZnU3RhLmgiCisjZW5kaWYKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsQ29tbW9uQXBpLmgiCisjZW5kaWYKKyNpbmNsdWRlICJzY2hBcGkuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbUFwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltUHJvcEV4dHNVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisKKyNpbmNsdWRlICJwYXJzZXJBcGkuaCIKKworLyoqCisgKiBsaW1Qcm9jZXNzUHJvYmVSc3BGcmFtZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKCkgdXBvbgorICogUHJvYmUgUmVzcG9uc2UgZnJhbWUgcmVjZXB0aW9uLgorICoKKyAqTE9HSUM6CisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyByZWNlaXZlZCBQcm9iZSBSZXNwb25zZSBmcmFtZS4KKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqIDEuIEZyYW1lcyB3aXRoIG91dC1vZi1vcmRlciBJRXMgYXJlIGRyb3BwZWQuCisgKiAyLiBJbiBjYXNlIG9mIElCU1MsIGpvaW4gJ3N1Y2Nlc3MnIG1ha2VzIE1MTSBzdGF0ZSBtYWNoaW5lCisgKiAgICB0cmFuc2l0aW9uIGludG8gJ0JTUyBzdGFydGVkJyBzdGF0ZS4gVGhpcyBtYXkgaGF2ZSB0byBjaGFuZ2UKKyAqICAgIGRlcGVuZGluZyBvbiBzdXBwb3J0aW5nIHdoYXQga2luZGEgQXV0aGVudGljYXRpb24gaW4gSUJTUy4KKyAqCisgKiBAcGFyYW0gcE1hYyAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBSeFBhY2tldEluZm8gIEEgcG9pbnRlciB0byBCdWZmZXIgZGVzY3JpcHRvciArIGFzc29jaWF0ZWQgUERVcworICogQHJldHVybiBOb25lCisgKi8KKworCit2b2lkCitsaW1Qcm9jZXNzUHJvYmVSc3BGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwUnhQYWNrZXRJbmZvLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgKnBCb2R5OworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIGZyYW1lTGVuID0gMDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICBjdXJyZW50QnNzSWQ7CisgICAgdHBTaXJNYWNNZ210SGRyICAgICAgICAgcEhkcjsKKyAgICB0U2lyUHJvYmVSZXNwQmVhY29uICAgICBwcm9iZVJzcDsKKyAgICB0QU5JX1U4IHFvc0VuYWJsZWQgPSAgICBmYWxzZTsKKyAgICB0QU5JX1U4IHdtZUVuYWJsZWQgPSAgICBmYWxzZTsKKworICAgIHByb2JlUnNwLnNzSWQubGVuZ3RoICAgICAgICAgICAgICA9IDA7CisgICAgcHJvYmVSc3Aud3BhLmxlbmd0aCAgICAgICAgICAgICAgID0gMDsKKyAgICBwcm9iZVJzcC5wcm9wSUVpbmZvLmFwTmFtZS5sZW5ndGggPSAwOworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgIHByb2JlUnNwLnByb3BJRWluZm8uYW5pSW5kaWNhdG9yICA9IDA7CisgICAgcHJvYmVSc3AucHJvcElFaW5mby53ZHNMZW5ndGggICAgID0gMDsKKyNlbmRpZgorCisKKyAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworCisKKyAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwKKyAgICAgICAgICAgICBGTCgiUmVjZWl2ZWQgUHJvYmUgUmVzcG9uc2UgZnJhbWUgd2l0aCBsZW5ndGg9JWQgZnJvbSAiKSwKKyAgICAgICAgICAgICBXREFfR0VUX1JYX01QRFVfTEVOKHBSeFBhY2tldEluZm8pKTsKKyAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcEhkci0+c2EsIExPRzIpOykKKworICAgaWYgKGxpbURlYWN0aXZhdGVNaW5DaGFubmVsVGltZXJEdXJpbmdTY2FuKHBNYWMpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuOworCisKKyAgICAvKioKKyAgICAgKiBFeHBlY3QgUHJvYmUgUmVzcG9uc2Ugb25seSB3aGVuCisgICAgICogMS4gU1RBIGlzIGluIHNjYW4gbW9kZSB3YWl0aW5nIGZvciBCZWFjb24vUHJvYmUgcmVzcG9uc2Ugb3IKKyAgICAgKiAyLiBTVEEgaXMgd2FpdGluZyBmb3IgQmVhY29uL1Byb2JlIFJlc3BvbnNlIHRvIGFubm91bmNlCisgICAgICogICAgam9pbiBzdWNjZXNzIG9yCisgICAgICogMy4gU1RBIGlzIGluIElCU1MgbW9kZSBpbiBCU1Mgc3RhcnRlZCBzdGF0ZSBvcgorICAgICAqIDQuIFNUQS9BUCBpcyBpbiBsZWFybiBtb2RlCisgICAgICogNS4gU1RBIGluIGxpbmsgZXN0YWJsaXNoZWQgc3RhdGUuIEluIHRoaXMgc3RhdGUsIHRoZSBwcm9iZSByZXNwb25zZSBpcworICAgICAqICAgICBleHBlY3RlZCBmb3IgdHdvIHNjZW5hcmlvczoKKyAgICAgKiAgICAgLS0gQXMgcGFydCBvZiBoZWFydCBiZWF0IG1lY2hhbmlzbSwgcHJvYmUgcmVxIGlzIHNlbnQgb3V0CisgICAgICogICAgIC0tIElmIFFvUyBJbmZvIElFIGluIGJlYWNvbiBoYXMgYSBkaWZmZXJlbnQgY291bnQgZm9yIEVEQ0EgUGFyYW1zLAorICAgICAqICAgICAgICAgYW5kIEVEQ0EgSUUgaXMgbm90IHByZXNlbnQgaW4gYmVhY29uLAorICAgICAqICAgICAgICAgdGhlbiBwcm9iZSByZXEgaXMgc2VudCBvdXQgdG8gZ2V0IHRoZSBFRENBIHBhcmFtcy4KKyAgICAgKgorICAgICAqIElnbm9yZSBQcm9iZSBSZXNwb25zZSBmcmFtZSBpbiBhbGwgb3RoZXIgc3RhdGVzCisgICAgICovCisgICAgICAgIC8vIFRPIFNVUFBPUlQgQlQtQU1QCisgICAgaWYgKCgocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9QUk9CRV9SRVNQX1NUQVRFKSB8fCAgIC8vbWxtIHN0YXRlIGNoZWNrIHNob3VsZCBiZSBnbG9iYWwgLSAxOHRoIG9jdAorICAgICAgICAocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9QQVNTSVZFX1NDQU5fU1RBVEUpIHx8ICAgICAvL21sbSBzdGF0ZSBjaGVjayBzaG91bGQgYmUgZ2xvYmFsIC0gMTh0aCBvY3QKKyAgICAgICAgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fTEVBUk5fU1RBVEUpIHx8ICAgICAgICAgICAgLy9tbG0gc3RhdGUgY2hlY2sgc2hvdWxkIGJlIGdsb2JhbCAtIDE4dGggb2N0IAorICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfSk9JTl9CRUFDT05fU1RBVEUpIHx8CisgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKSApfHwKKyAgICAgICAgKChHRVRfTElNX1NZU1RFTV9ST0xFKHBzZXNzaW9uRW50cnkpID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkgJiYKKyAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PSBlTElNX01MTV9CU1NfU1RBUlRFRF9TVEFURSkpKQorICAgIHsKKyAgICAgICAgZnJhbWVMZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pOworCisgICAgICAgIC8vIEdldCBwb2ludGVyIHRvIFByb2JlIFJlc3BvbnNlIGZyYW1lIGJvZHkKKyAgICAgICAgcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKworICAgICAgICBpZiAoc2lyQ29udmVydFByb2JlRnJhbWUyU3RydWN0KHBNYWMsIHBCb2R5LCBmcmFtZUxlbiwgJnByb2JlUnNwKQorICAgICAgICAgICAgICAgICAgICAgICAgICA9PWVTSVJfRkFJTFVSRSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgRkwoIlBBcnNlIGVycm9yIFByb2JlUmVzcG9uc2UsIGxlbmd0aD0lZFxuIiksCisgICAgICAgICAgICAgICBmcmFtZUxlbik7KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UbyBTdXBwb3J0IEJULUFNUCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmICgocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9QUk9CRV9SRVNQX1NUQVRFKSB8fCAgICAvL21sbSBzdGF0ZSBjaGVjayBzaG91bGQgYmUgZ2xvYmFsIC0gMTh0aCBvY3QKKyAgICAgICAgICAgIChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX1BBU1NJVkVfU0NBTl9TVEFURSkpCisgICAgICAgICAgICBsaW1DaGVja0FuZEFkZEJzc0Rlc2NyaXB0aW9uKHBNYWMsICZwcm9iZVJzcCwgcFJ4UGFja2V0SW5mbywgCisgICAgICAgICAgICAgICAoKHBNYWMtPmxpbS5nTGltSGFsU2NhblN0YXRlID09IGVMSU1fSEFMX1NDQU5OSU5HX1NUQVRFKSA/IGVBTklfQk9PTEVBTl9UUlVFIDogZUFOSV9CT09MRUFOX0ZBTFNFKSwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICBlbHNlIGlmIChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX0xFQVJOX1NUQVRFKSAgICAgICAgICAgLy9tbG0gc3RhdGUgY2hlY2sgc2hvdWxkIGJlIGdsb2JhbCAtIDE4dGggb2N0CisgICAgICAgIHsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgICAgICAgICAgLy8gU1RBL0FQIGlzIGluIGxlYXJuIG1vZGUKKyAgICAgICAgICAgIC8qIE5vdCBzdXJlIHdoZXRoZXIgdGhlIGJlbG93IDIgbGluZXMgYXJlIG5lZWRlZCBmb3IgdGhlIHN0YXRpb24uIFRPRE8gSWYgeWVzLCB0aGlzIHNob3VsZCBiZSAKKyAgICAgICAgICAgICAqIHVuY29tbWVudGVkLiBBbHNvIHdoZW4gd2UgdGVzdGVkIGVuYWJsaW5nIHRoaXMsIHRoZXJlIGlzIGEgY3Jhc2ggYXMgc29vbiBhcyB0aGUgc3RhdGlvbgorICAgICAgICAgICAgICogY29tZXMgdXAgd2hpY2ggbmVlZHMgdG8gYmUgZml4ZWQqLworICAgICAgICAgICAgLy9pZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpCisgICAgICAgICAgICAgIC8vICBsaW1DaGVja0FuZEFkZEJzc0Rlc2NyaXB0aW9uKHBNYWMsICZwcm9iZVJzcCwgcFJ4UGFja2V0SW5mbywgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICAgICAgbGltQ29sbGVjdE1lYXN1cmVtZW50RGF0YShwTWFjLCBwUnhQYWNrZXRJbmZvLCAmcHJvYmVSc3ApOworICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsCisgICAgICAgICAgICAgICBGTCgiUGFyc2VkIFdEUyBpbmZvIGluIFByb2JlUnNwIGZyYW1lczogd2RzTGVuZ3RoPSVkXG4iKSwKKyAgICAgICAgICAgICAgIHByb2JlUnNwLnByb3BJRWluZm8ud2RzTGVuZ3RoKTspCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fTUxNX1dUX0pPSU5fQkVBQ09OX1NUQVRFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcHNlc3Npb25FbnRyeS0+YmVhY29uICE9IE5VTEwgKSAvL0VpdGhlciBCZWFjb24vcHJvYmUgcmVzcG9uc2UgaXMgcmVxdWlyZWQuIEhlbmNlIHN0b3JlIGl0IGluIHNhbWUgYnVmZmVyLgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+YmVhY29uKTsKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb24gPSBOVUxMOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iY25MZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pOworICAgICAgICAgICAgIGlmKCAocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKikmcHNlc3Npb25FbnRyeS0+YmVhY29uLCBwc2Vzc2lvbkVudHJ5LT5iY25MZW4pKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgYmVhY29uIikpOykKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1N0b3JlIHRoZSBCZWFjb24vUHJvYmVSc3AuIFRoaXMgaXMgc2VudCB0byBjc3IvaGRkIGluIGpvaW4gY25mIHJlc3BvbnNlLiAKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmJlYWNvbiwgV0RBX0dFVF9SWF9NUERVX0RBVEEocFJ4UGFja2V0SW5mbyksIHBzZXNzaW9uRW50cnktPmJjbkxlbik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgLy8gU1RBIGluIFdUX0pPSU5fQkVBQ09OX1NUQVRFCisgICAgICAgICAgICBsaW1DaGVja0FuZEFubm91bmNlSm9pblN1Y2Nlc3MocE1hYywgJnByb2JlUnNwLCBwSGRyLHBzZXNzaW9uRW50cnkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYocHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkKKyAgICAgICAgeworICAgICAgICAgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGlzIFByb2JlIFJlc3BvbnNlIGlzIGZvcgorICAgICAgICAgICAgKiBvdXIgUHJvYmUgUmVxdWVzdCBzZW50IHVwb24gcmVhY2hpbmcKKyAgICAgICAgICAgICogaGVhcnQgYmVhdCB0aHJlc2hvbGQKKyAgICAgICAgICAgICovCisgICAgICAgICAgICAjaWYgMAorICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNmZykgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgZ2V0IEJTU0lEIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQlNTSURcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZiAvL1RPIFNVUFBPUlQgQlQtQU1QCisgICAgICAgICAgICBzaXJDb3B5TWFjQWRkcihjdXJyZW50QnNzSWQscHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisgICAgICAgICAgICBpZiAoICFwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCxjdXJyZW50QnNzSWQsIHBIZHItPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoIUxJTV9JU19DT05ORUNUSU9OX0FDVElWRShwc2Vzc2lvbkVudHJ5KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgICAgICAgRkwoIlJlY2VpdmVkIFByb2JlIFJlc3AgZnJvbSBBUC4gU28gaXQgaXMgYWxpdmUhIVxuIikpOworCisgICAgICAgICAgICAgICAgaWYgKHByb2JlUnNwLkhUSW5mby5wcmVzZW50KQorICAgICAgICAgICAgICAgICAgICBsaW1SZWNlaXZlZEhCSGFuZGxlcihwTWFjLCAodEFOSV9VOClwcm9iZVJzcC5IVEluZm8ucHJpbWFyeUNoYW5uZWwsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbGltUmVjZWl2ZWRIQkhhbmRsZXIocE1hYywgKHRBTklfVTgpcHJvYmVSc3AuY2hhbm5lbE51bWJlciwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisKKyNpZiBkZWZpbmVkIEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UIHx8IGRlZmluZWQgKEFOSV9BUF9DTElFTlRfU0RLKQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwcm9iZVJzcC5xdWlldElFUHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbVVwZGF0ZVF1aWV0SUVGcm9tQmVhY29uKHBNYWMsICYocHJvYmVSc3AucXVpZXRJRSksIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID09IGVMSU1fUVVJRVRfQkVHSU4pIHx8CisgICAgICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID09IGVMSU1fUVVJRVRfUlVOTklORykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBhIHByb2JlIHJzcCB3aXRob3V0IFF1aWV0IElFXG4iKSk7KQorICAgICAgICAgICAgICAgICAgICBsaW1DYW5jZWxEb3QxMWhRdWlldChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHJvYmVSc3AuY2hhbm5lbFN3aXRjaFByZXNlbnQgfHwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVSc3AucHJvcElFaW5mby5wcm9wQ2hhbm5lbFN3aXRjaFByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1VcGRhdGVDaGFubmVsU3dpdGNoKHBNYWMsICZwcm9iZVJzcCwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZG90MTFoQ2hhblN3U3RhdGUgPT0gZUxJTV8xMUhfQ0hBTlNXX1JVTk5JTkcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1DYW5jZWxEb3QxMWhDaGFubmVsU3dpdGNoKHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAqIE5vdyBQcm9jZXNzIEVEQ0EgUGFyYW1ldGVycywgaWYgRURDQVBhcmFtU2V0IGNvdW50IGlzIGRpZmZlcmVudC4KKyAgICAgICAgICAgICogICAgIC0tIFdoaWxlIHByb2Nlc3NpbmcgYmVhY29ucyBpbiBsaW5rIGVzdGFibGlzaGVkIHN0YXRlIGlmIGl0IGlzIGRldGVybWluZWQgdGhhdAorICAgICAgICAgICAgKiAgICAgICAgIFFvUyBJbmZvIElFIGhhcyBhIGRpZmZlcmVudCBjb3VudCBmb3IgRURDQSBQYXJhbXMsCisgICAgICAgICAgICAqICAgICAgICAgYW5kIEVEQ0EgSUUgaXMgbm90IHByZXNlbnQgaW4gYmVhY29uLAorICAgICAgICAgICAgKiAgICAgICAgIHRoZW4gcHJvYmUgcmVxIGlzIHNlbnQgb3V0IHRvIGdldCB0aGUgRURDQSBwYXJhbXMuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgICAgICAgICAgbGltR2V0UW9zTW9kZShwc2Vzc2lvbkVudHJ5LCAmcW9zRW5hYmxlZCk7CisgICAgICAgICAgICBsaW1HZXRXbWVNb2RlKHBzZXNzaW9uRW50cnksICZ3bWVFbmFibGVkKTsKKyAgICAgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLAorICAgICAgICAgICAgICAgICAgICBGTCgid21lRWRjYVByZXNlbnQ6ICVkIHdtZUVuYWJsZWQ6ICVkLCBlZGNhUHJlc2VudDogJWQsIHFvc0VuYWJsZWQ6ICVkLCAgZWRjYVBhcmFtcy5xb3NJbmZvLmNvdW50OiAlZCBzY2hPYmplY3QuZ0xpbUVkY2FQYXJhbVNldENvdW50OiAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlUnNwLndtZUVkY2FQcmVzZW50LCB3bWVFbmFibGVkLCBwcm9iZVJzcC5lZGNhUHJlc2VudCwgcW9zRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVSc3AuZWRjYVBhcmFtcy5xb3NJbmZvLmNvdW50LCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtU2V0Q291bnQpOykKKyAgICAgICAgICAgIGlmICgoKHByb2JlUnNwLndtZUVkY2FQcmVzZW50ICYmIHdtZUVuYWJsZWQpIHx8CisgICAgICAgICAgICAgICAgKHByb2JlUnNwLmVkY2FQcmVzZW50ICYmIHFvc0VuYWJsZWQpKSAmJgorICAgICAgICAgICAgICAgIChwcm9iZVJzcC5lZGNhUGFyYW1zLnFvc0luZm8uY291bnQgIT0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbVNldENvdW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2NoQmVhY29uRWRjYVByb2Nlc3MocE1hYywgJnByb2JlUnNwLmVkY2FQYXJhbXMsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRURDQSBwYXJhbWV0ZXIgcHJvY2Vzc2luZyBlcnJvclxuIikpOykKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwU3RhRHMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIG5lZWRlZCwgZG93bmdyYWRlIHRoZSBFRENBIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgbGltU2V0QWN0aXZlRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtcywgcHNlc3Npb25FbnRyeSk7IAorCisgICAgICAgICAgICAgICAgICAgIGlmIChwU3RhRHMtPmFuaVBlZXIgPT0gZUFOSV9CT09MRUFOX1RSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1TZW5kRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwgcFN0YURzLT5ic3NJZCwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1TZW5kRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwgcFN0YURzLT5ic3NJZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJTZWxmIEVudHJ5IG1pc3NpbmcgaW4gSGFzaCBUYWJsZVxuIikpOykKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkgJiYKKyAgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFKSkKKyAgICAgICAgICAgICAgICBsaW1IYW5kbGVJQlNTY29hbGVzY2luZyhwTWFjLCAmcHJvYmVSc3AsIHBSeFBhY2tldEluZm8scHNlc3Npb25FbnRyeSk7CisgICAgfSAvLyBpZiAoKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURSkgfHwgLi4uCisKKyAgICAvLyBJZ25vcmUgUHJvYmUgUmVzcG9uc2UgZnJhbWUgaW4gYWxsIG90aGVyIHN0YXRlcworICAgIHJldHVybjsKK30gLyoqKiBlbmQgbGltUHJvY2Vzc1Byb2JlUnNwRnJhbWUoKSAqKiovCisKKwordm9pZAorbGltUHJvY2Vzc1Byb2JlUnNwRnJhbWVOb1Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbykKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAqcEJvZHk7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgZnJhbWVMZW4gPSAwOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgIHBIZHI7CisgICAgdFNpclByb2JlUmVzcEJlYWNvbiAgICAgcHJvYmVSc3A7CisKKyAgICBwcm9iZVJzcC5zc0lkLmxlbmd0aCAgICAgICAgICAgICAgPSAwOworICAgIHByb2JlUnNwLndwYS5sZW5ndGggICAgICAgICAgICAgICA9IDA7CisgICAgcHJvYmVSc3AucHJvcElFaW5mby5hcE5hbWUubGVuZ3RoID0gMDsKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICBwcm9iZVJzcC5wcm9wSUVpbmZvLmFuaUluZGljYXRvciAgPSAwOworICAgIHByb2JlUnNwLnByb3BJRWluZm8ud2RzTGVuZ3RoICAgICA9IDA7CisjZW5kaWYKKworCisgICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKworCisgICAgbGltTG9nKHBNYWMsIExPRzIsCisgICAgICAgICAgICAgRkwoIlJlY2VpdmVkIFByb2JlIFJlc3BvbnNlIGZyYW1lIHdpdGggbGVuZ3RoPSVkIGZyb20gIiksCisgICAgICAgICAgICAgV0RBX0dFVF9SWF9NUERVX0xFTihwUnhQYWNrZXRJbmZvKSk7CisgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBIZHItPnNhLCBMT0cyKTsKKworICAgIGlmIChsaW1EZWFjdGl2YXRlTWluQ2hhbm5lbFRpbWVyRHVyaW5nU2NhbihwTWFjKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHJldHVybjsKKworICAgIC8qICBTaW5jZSB0aGVyZSBpcyBubyBwc2Vzc2lvbkVudHJ5LCBQRSBjYW5ub3QgYmUgaW4gdGhlIGZvbGxvd2luZyBzdGF0ZXM6CisgICAgICogICAtIGVMSU1fTUxNX1dUX0pPSU5fQkVBQ09OX1NUQVRFCisgICAgICogICAtIGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUKKyAgICAgKiAgIC0gZUxJTV9NTE1fQlNTX1NUQVJURURfU1RBVEUKKyAgICAgKiAgSGVuY2UsIGV4cGVjdCBQcm9iZSBSZXNwb25zZSBvbmx5IHdoZW4KKyAgICAgKiAgIDEuIFNUQSBpcyBpbiBzY2FuIG1vZGUgd2FpdGluZyBmb3IgQmVhY29uL1Byb2JlIHJlc3BvbnNlIAorICAgICAqICAKKyAgICAgKiAgSWdub3JlIFByb2JlIFJlc3BvbnNlIGZyYW1lIGluIGFsbCBvdGhlciBzdGF0ZXMKKyAgICAgKi8KKyAgICBpZiggKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURSkgfHwKKyAgICAgICAgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFKSAgfHwgICAgIC8vbWxtIHN0YXRlIGNoZWNrIHNob3VsZCBiZSBnbG9iYWwgLSAxOHRoIG9jdAorICAgICAgICAocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9MRUFSTl9TVEFURSkgKQorICAgIHsKKyAgICAgICAgZnJhbWVMZW4gPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pOworCisgICAgICAgIC8vIEdldCBwb2ludGVyIHRvIFByb2JlIFJlc3BvbnNlIGZyYW1lIGJvZHkKKyAgICAgICAgcEJvZHkgPSBXREFfR0VUX1JYX01QRFVfREFUQShwUnhQYWNrZXRJbmZvKTsKKworICAgICAgICBpZiAoc2lyQ29udmVydFByb2JlRnJhbWUyU3RydWN0KHBNYWMsIHBCb2R5LCBmcmFtZUxlbiwgJnByb2JlUnNwKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiUGFyc2UgZXJyb3IgUHJvYmVSZXNwb25zZSwgbGVuZ3RoPSVkXG4iKSwgZnJhbWVMZW4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYoIChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUpIHx8CisgICAgICAgICAgICAgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fUEFTU0lWRV9TQ0FOX1NUQVRFKSApCisgICAgICAgICAgICBsaW1DaGVja0FuZEFkZEJzc0Rlc2NyaXB0aW9uKHBNYWMsICZwcm9iZVJzcCwgcFJ4UGFja2V0SW5mbywgZUFOSV9CT09MRUFOX1RSVUUsIGVBTklfQk9PTEVBTl9UUlVFKTsKKyAgICAgICAgZWxzZSBpZiAocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9MRUFSTl9TVEFURSkKKyAgICAgICAgeworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgICAgICAgICAvLyBTVEEvQVAgaXMgaW4gbGVhcm4gbW9kZQorICAgICAgICAgICAgLyogTm90IHN1cmUgd2hldGhlciB0aGUgYmVsb3cgMiBsaW5lcyBhcmUgbmVlZGVkIGZvciB0aGUgc3RhdGlvbi4gVE9ETyBJZiB5ZXMsIHRoaXMgc2hvdWxkIGJlIAorICAgICAgICAgICAgICogdW5jb21tZW50ZWQuIEFsc28gd2hlbiB3ZSB0ZXN0ZWQgZW5hYmxpbmcgdGhpcywgdGhlcmUgaXMgYSBjcmFzaCBhcyBzb29uIGFzIHRoZSBzdGF0aW9uCisgICAgICAgICAgICAgKiBjb21lcyB1cCB3aGljaCBuZWVkcyB0byBiZSBmaXhlZCovCisgICAgICAgICAgICAvL2lmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSkKKyAgICAgICAgICAgICAgLy8gIGxpbUNoZWNrQW5kQWRkQnNzRGVzY3JpcHRpb24ocE1hYywgJnByb2JlUnNwLCBwUnhQYWNrZXRJbmZvLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgICAgICAgICBsaW1Db2xsZWN0TWVhc3VyZW1lbnREYXRhKHBNYWMsIHBSeFBhY2tldEluZm8sICZwcm9iZVJzcCk7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HMywKKyAgICAgICAgICAgICAgIEZMKCJQYXJzZWQgV0RTIGluZm8gaW4gUHJvYmVSc3AgZnJhbWVzOiB3ZHNMZW5ndGg9JWRcbiIpLAorICAgICAgICAgICAgICAgcHJvYmVSc3AucHJvcElFaW5mby53ZHNMZW5ndGgpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9IAorICAgIHJldHVybjsKK30gLyoqKiBlbmQgbGltUHJvY2Vzc1Byb2JlUnNwRnJhbWVOZXcoKSAqKiovCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NTbWVSZXFNZXNzYWdlcy5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTIzZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMuYwpAQCAtMCwwICsxLDUyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMuY2MgY29udGFpbnMgdGhlIGNvZGUKKyAqIGZvciBwcm9jZXNzaW5nIFNNRSByZXF1ZXN0IG1lc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJ3bmlBcGkuaCIKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNlbHNlCisjaW5jbHVkZSAid25pQ2ZnU3RhLmgiCisjZW5kaWYKKyNpbmNsdWRlICJjZmdBcGkuaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKyNpbmNsdWRlICJzY2hBcGkuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VjdXJpdHlVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAibGltU21lUmVxVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1JYnNzUGVlck1nbXQuaCIKKyNpbmNsdWRlICJsaW1BZG1pdENvbnRyb2wuaCIKKyNpbmNsdWRlICJkcGhIYXNoVGFibGUuaCIKKyNpbmNsdWRlICJsaW1TZW5kTWVzc2FnZXMuaCIKKyNpbmNsdWRlICJsaW1BcGkuaCIKKyNpbmNsdWRlICJ3bW1BcHNkLmgiCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjaW5jbHVkZSAic2FwQXBpLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybUFwaS5oIgorI2VuZGlmCisjaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fQ0NYCisjaW5jbHVkZSAiY2N4QXBpLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlIDxsaW1GVC5oPgorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisvKiBUaGVzZSBhcmUgdGhlIG1pbi9tYXggdHggcG93ZXIgKG5vbiB2aXJ0dWFsIHJhdGVzKSByYW5nZQorICAgc3VwcG9ydGVkIGJ5IHByaW1hIGhhcmR3YXJlICovCisjZGVmaW5lIE1JTl9UWF9QV1JfQ0FQICAgIDEyCisjZGVmaW5lIE1BWF9UWF9QV1JfQ0FQICAgIDE5CisKKyNlbmRpZgorCisKKy8vIFNNRSBSRVEgcHJvY2Vzc2luZyBmdW5jdGlvbiB0ZW1wbGF0ZXMKK3N0YXRpYyB2b2lkIF9fbGltUHJvY2Vzc1NtZVN0YXJ0UmVxKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3N0YXRpYyB0QU5JX0JPT0xFQU4gX19saW1Qcm9jZXNzU21lU3lzUmVhZHlJbmQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworc3RhdGljIHRBTklfQk9PTEVBTiBfX2xpbVByb2Nlc3NTbWVTdGFydEJzc1JlcSh0cEFuaVNpckdsb2JhbCwgdHBTaXJNc2dRIHBNc2cpOworc3RhdGljIHZvaWQgX19saW1Qcm9jZXNzU21lU2NhblJlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7CitzdGF0aWMgdm9pZCBfX2xpbVByb2Nlc3NTbWVKb2luUmVxKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3N0YXRpYyB2b2lkIF9fbGltUHJvY2Vzc1NtZVJlYXNzb2NSZXEodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworc3RhdGljIHZvaWQgX19saW1Qcm9jZXNzU21lRGlzYXNzb2NSZXEodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworc3RhdGljIHZvaWQgX19saW1Qcm9jZXNzU21lRGlzYXNzb2NDbmYodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworc3RhdGljIHZvaWQgX19saW1Qcm9jZXNzU21lRGVhdXRoUmVxKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiAqKTsKK3N0YXRpYyB2b2lkIF9fbGltUHJvY2Vzc1NtZVNldENvbnRleHRSZXEodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworc3RhdGljIHRBTklfQk9PTEVBTiBfX2xpbVByb2Nlc3NTbWVTdG9wQnNzUmVxKHRwQW5pU2lyR2xvYmFsLCB0cFNpck1zZ1EgcE1zZyk7CisKKyNpZiAwCisgIHN0YXRpYyB2b2lkIF9fbGltUHJvY2Vzc1NtZUF1dGhSZXEodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworICBzdGF0aWMgdm9pZCBfX2xpbVByb2Nlc3NTbWVQcm9taXNjdW91c1JlcSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7CisjZW5kaWYKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKK3N0YXRpYyB2b2lkIF9fbGltUHJvY2Vzc1NtZUFzc29jQ25mKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMiwgdEFOSV9VMzIgKik7CisjZW5kaWYKK3ZvaWQgX19saW1Qcm9jZXNzU21lQXNzb2NDbmZOZXcodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyLCB0QU5JX1UzMiAqKTsKKworI2lmZGVmIFZPU1NfRU5BQkxFRAorZXh0ZXJuIHZvaWQgcGVSZWdpc3RlclRMSGFuZGxlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCitleHRlcm4gaW50IGxpbVByb2Nlc3NSZW1haW5PbkNobmxSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2cpOworI2VuZGlmCisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0NMSUVOVAorI2lmZGVmIEJBQ0tHUk9VTkRfU0NBTl9FTkFCTEVECisKKy8vIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW4gdGltZXJzIGlmIGl0IGhhc24ndCBhbHJlYWR5IHN0YXJ0ZWQKK3N0YXRpYyB2b2lkCitfX2xpbUJhY2tncm91bmRTY2FuSW5pdGlhdGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBpZiAocE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhblN0YXJ0ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vbWFrZSBzdXJlIHRpbWVyIGlzIGNyZWF0ZWQgZmlyc3QKKyAgICBpZiAoVFhfVElNRVJfVkFMSUQocE1hYy0+bGltLmxpbVRpbWVycy5nTGltQmFja2dyb3VuZFNjYW5UaW1lcikpCisgICAgeworICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9CQUNLR1JPVU5EX1NDQU5fVElNRVIpOworICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9CQUNLR1JPVU5EX1NDQU5fVElNRVIpKTsKKyAgICAgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1CYWNrZ3JvdW5kU2NhblRpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgYWN0aXZhdGUgYmFja2dyb3VuZCBzY2FuIHRpbWVyXG4iKSk7CisgICAgICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5TdGFydGVkICAgPSB0cnVlOworICAgICAgICBwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuQ2hhbm5lbElkID0gMDsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyBCQUNLR1JPVU5EX1NDQU5fRU5BQkxFRAorI2VuZGlmCisKKy8vIGRldGVybWluZSBpZiBhIGZyZXNoIHNjYW4gcmVxdWVzdCBtdXN0IGJlIGlzc3VlZCBvciBub3QKKy8qCisqIFBFIHdpbGwgZG8gZnJlc2ggc2NhbiwgaWYgYWxsIG9mIHRoZSBhY3RpdmUgc2Vzc2lvbnMgYXJlIGluIGdvb2Qgc3RhdGUgKExpbmsgRXN0IG9yIEJTUyBTdGFydGVkKQorKiBJZiBvbmUgb2YgdGhlIHNlc3Npb25zIGlzIG5vdCBpbiBvbmUgb2YgdGhlIGFib3ZlIHN0YXRlcywgdGhlbiBQRSBkb2VzIG5vdCBkbyBmcmVzaCBzY2FuCisqIElmIG5vIHNlc3Npb24gZXhpc3RzIChzY2FubmluZyB2ZXJ5IGZpcnN0IHRpbWUpLCB0aGVuIFBFIHdpbGwgYWx3YXlzIGRvIGZyZXNoIHNjYW4gaWYgU01FCisqIGFza3MgaXQgdG8gZG8gdGhhdC4KKyovCitzdGF0aWMgdEFOSV9VOAorX19saW1GcmVzaFNjYW5SZXFkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggcmV0dXJuRnJlc2hSZXN1bHRzKQoreworCisgICAgdEFOSV9VOCB2YWxpZFN0YXRlID0gVFJVRTsKKyAgICBpbnQgaTsKKworICAgIGlmKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgIT0gZUxJTV9TTUVfSURMRV9TVEFURSkKKyAgICB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZm9yKGkgPTA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykKKyAgICB7CisKKyAgICAgICAgaWYocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBpZighKCAoICggIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmJzc1R5cGUgPT0gZVNJUl9JTkZSQVNUUlVDVFVSRV9NT0RFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSkpJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpICl8fAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAoICAgICggKHBNYWMtPmxpbS5ncFNlc3Npb25baV0uYnNzVHlwZSA9PSBlU0lSX0lCU1NfTU9ERSl8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSApJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKSApCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgICAgfHwgICggKCAoIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmJzc1R5cGUgPT0gZVNJUl9JTkZSQV9BUF9NT0RFKSAKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoIHBNYWMtPmxpbS5ncFNlc3Npb25baV0ucGVQZXJzb25hID09IFZPU19QMlBfR09fTU9ERSkgKQorICAgICAgICAgICAgICAgICAgICB8fCAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgKQorICAgICAgICAgICAgICAgICAgJiYgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKSApCisjZW5kaWYKKyAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWxpZFN0YXRlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkZyZXNoU2NhblJlcWQ6ICVkIFxuIiksIHZhbGlkU3RhdGUpOykKKworICAgaWYoICh2YWxpZFN0YXRlKSAmJiAocmV0dXJuRnJlc2hSZXN1bHRzICYgU0lSX0JHX1NDQU5fUkVUVVJOX0ZSRVNIX1JFU1VMVFMpKQorICAgIHJldHVybiBUUlVFOworCisgICAgcmV0dXJuIEZBTFNFOworfQorCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkKK3N0YXRpYyB0QU5JX0JPT0xFQU4gX19saW1Qcm9jZXNzU21lU3dpdGNoQ2hsUmVxKHRwQW5pU2lyR2xvYmFsLCB0cFNpck1zZ1EgcE1zZyk7CisjZW5kaWYKKworCisvKioKKyAqIF9fbGltSXNTbWVBc3NvY0NuZlZhbGlkKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc0xtbU1lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9BU1NPQ19DTkYuCisgKgorICpMT0dJQzoKKyAqIE1lc3NhZ2UgdmFsaWRpdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1lYXNSZXEgIFBvaW50ZXIgdG8gUmVjZWl2ZWQgQVNTT0NfQ05GIG1lc3NhZ2UKKyAqIEByZXR1cm4gdHJ1ZSAgICAgIFdoZW4gcmVjZWl2ZWQgU01FX0FTU09DX0NORiBpcyBmb3JtYXR0ZWQKKyAqICAgICAgICAgICAgICAgICAgIGNvcnJlY3RseQorICogICAgICAgICBmYWxzZSAgICAgb3RoZXJ3aXNlCisgKi8KKworaW5saW5lIHN0YXRpYyB0QU5JX1U4CitfX2xpbUlzU21lQXNzb2NDbmZWYWxpZCh0cFNpclNtZUFzc29jQ25mIHBBc3NvY0NuZikKK3sKKyAgICBpZiAobGltSXNHcm91cEFkZHIocEFzc29jQ25mLT5wZWVyTWFjQWRkcikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB0cnVlOworfSAvKioqIGVuZCBfX2xpbUlzU21lQXNzb2NDbmZWYWxpZCgpICoqKi8KKworCisvKioKKyAqIF9fbGltR2V0U21lSm9pblJlcVNpemVGb3JBbGxvYygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHZhcmlvdXMgcGxhY2VzIHRvIGdldCBJRSBsZW5ndGgKKyAqIGZyb20gdFNpckJzc0Rlc2NyaXB0aW9uIHN0cnVjdHVyZQorICogbnVtYmVyIGJlaW5nIHNjYW5uZWQuCisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgICAgcEJzc0Rlc2NyCisgKiBAcmV0dXJuICAgIFRvdGFsIElFIGxlbmd0aAorICovCisKK3N0YXRpYyB0QU5JX1UxNgorX19saW1HZXRTbWVKb2luUmVxU2l6ZUZvckFsbG9jKHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9VMTYgbGVuID0gMDsKKworICAgIGlmICghcEJ1ZikKKyAgICAgICAgcmV0dXJuIGxlbjsKKworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBsZW4gPSBsaW1HZXRVMTYoIHBCdWYgKTsKKyAgICByZXR1cm4gKGxlbiArIHNpemVvZiggdEFOSV9VMTYgKSk7Cit9IC8qKiogZW5kIF9fbGltR2V0U21lSm9pblJlcVNpemVGb3JBbGxvYygpICoqKi8KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgIF9fbGltSXNEZWZlcmVkTXNnRm9yTGVhcm4KKworXGJyaWVmICBIYXMgcm9sZSBvbmx5IGlmIDExaCBpcyBlbmFibGVkLiBOb3QgdXNlZCBvbiBTVEEgc2lkZS4KKyAgICAgICAgRGVmZXJzIHRoZSBtZXNzYWdlIGlmIFNNRSBpcyBpbiBsZWFybiBzdGF0ZSBhbmQgYnJpbmdzCisgICAgICAgIHRoZSBMSU0gYmFjayB0byBub3JtYWwgbW9kZS4KKworXHBhcmFtICBwTWFjCitccGFyYW0gIHBNc2cgLSBQb2ludGVyIHRvIG1lc3NhZ2UgcG9zdGVkIGZyb20gU01FIHRvIExJTS4KK1xyZXR1cm4gVFJVRSAtIElmIGRlZmVyZWQKKyAgICAgICAgRkFMU0UgLSBPdGhlcndpc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdEFOSV9CT09MRUFOCitfX2xpbUlzRGVmZXJlZE1zZ0ZvckxlYXJuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKQoreworICAgIGlmIChsaW1Jc1N5c3RlbUluU2NhblN0YXRlKHBNYWMpKQorICAgIHsKKyAgICAgICAgaWYgKGxpbURlZmVyTXNnKHBNYWMsIHBNc2cpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkNvdWxkIG5vdCBkZWZlciBNc2cgPSAlZFxuIiksIHBNc2ctPnR5cGUpOykKKyAgICAgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiRGVmZXIgdGhlIG1lc3NhZ2UsIGluIGxlYXJuIG1vZGUgdHlwZSA9ICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1zZy0+dHlwZSk7KQorCisgICAgICAgIC8qKiBTZW5kIGZpbmlzaCBzY2FuIHJlcSB0byBIQUwgb25seSBpZiBMSU0gaXMgbm90IHdhaXRpbmcgZm9yIGFueSByZXNwb25zZQorICAgICAgICAgKiBmcm9tIEhBTCBsaWtlIGluaXQgc2NhbiByc3AsIHN0YXJ0IHNjYW4gcnNwIGV0Yy4KKyAgICAgICAgICovICAgICAgICAKKyAgICAgICAgaWYgKEdFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMpKQorICAgICAgICB7CisgICAgICAgICAgICAvL1NldCB0aGUgcmVzdW1lIGNoYW5uZWwgdG8gQW55IHZhbGlkIGNoYW5uZWwgKGludmFsaWQpLiAKKyAgICAgICAgICAgIC8vVGhpcyB3aWxsIGluc3RydWN0IEhBTCB0byBzZXQgaXQgdG8gYW55IHByZXZpb3VzIHZhbGlkIGNoYW5uZWwuCisgICAgICAgICAgICBwZVNldFJlc3VtZUNoYW5uZWwocE1hYywgMCwgMCk7CisgICAgICAgICAgICBsaW1TZW5kSGFsRmluaXNoU2NhblJlcShwTWFjLCBlTElNX0hBTF9GSU5JU0hfTEVBUk5fV0FJVF9TVEFURSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgfQorICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgX19saW1Jc0RlZmVyZWRNc2dGb3JSYWRhcgorCitcYnJpZWYgIEhhcyByb2xlIG9ubHkgaWYgMTFoIGlzIGVuYWJsZWQuIE5vdCB1c2VkIG9uIFNUQSBzaWRlLgorICAgICAgICBEZWZlcnMgdGhlIG1lc3NhZ2UgaWYgcmFkYXIgaXMgZGV0ZWN0ZWQuCisKK1xwYXJhbSAgcE1hYworXHBhcmFtICBwTXNnIC0gUG9pbnRlciB0byBtZXNzYWdlIHBvc3RlZCBmcm9tIFNNRSB0byBMSU0uCitccmV0dXJuIFRSVUUgLSBJZiBkZWZlcmVkCisgICAgICAgIEZBTFNFIC0gT3RoZXJ3aXNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHRBTklfQk9PTEVBTgorX19saW1Jc0RlZmVyZWRNc2dGb3JSYWRhcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZykKK3sKKyAgICAvKiogZlJhZGFyRGV0Q3VyT3BlckNoYW4gd2lsbCBiZSBzZXQgb25seSBpZiB3ZSBkZXRlY3QgcmFkYXIgaW4gY3VycmVudAorICAgICAqIG9wZXJhdGluZyBjaGFubmVsIGFuZCBTeXN0ZW0gUm9sZSA9PSBBUCBST0xFICovCisgICAgaWYgKExJTV9JU19SQURBUl9ERVRFQ1RFRChwTWFjKSkKKyAgICB7CisgICAgICAgIGlmIChsaW1EZWZlck1zZyhwTWFjLCBwTXNnKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJDb3VsZCBub3QgZGVmZXIgTXNnID0gJWRcbiIpLCBwTXNnLT50eXBlKTspCisgICAgICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkRlZmVyIHRoZSBtZXNzYWdlLCBpbiBsZWFybiBtb2RlIHR5cGUgPSAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2ctPnR5cGUpOykKKyAgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFOworICAgIH0KKyAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworfQorCisKKy8qKgorICogX19saW1Qcm9jZXNzU21lU3RhcnRSZXEoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIFNNRV9TVEFSVF9SRVEgbWVzc2FnZQorICogZnJvbSBIREQgb3IgdXBwZXIgbGF5ZXIgYXBwbGljYXRpb24uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc1NtZVN0YXJ0UmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRTaXJSZXN1bHRDb2RlcyAgcmV0Q29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgdEFOSV9VOCAgICAgICAgICBzbWVzZXNzaW9uSWQ7CisgICAgdEFOSV9VMTYgICAgICAgICBzbWV0cmFuc2FjdGlvbklkOworICAgIAorCisgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBTVEFSVF9SRVFcbiIpKTspCisKKyAgICBsaW1HZXRTZXNzaW9uSW5mbyhwTWFjLCh0QU5JX1U4ICopcE1zZ0J1Ziwmc21lc2Vzc2lvbklkLCZzbWV0cmFuc2FjdGlvbklkKTsKKyAgICAKKyAgICBpZiAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9PRkZMSU5FX1NUQVRFKQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9IGVMSU1fU01FX0lETEVfU1RBVEU7CisgICAgICAgIAorICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKyAgICAgICAgCisgICAgICAgIC8vLyBCeSBkZWZhdWx0IGRvIG5vdCByZXR1cm4gYWZ0ZXIgZmlyc3Qgc2NhbiBtYXRjaAorICAgICAgICBwTWFjLT5saW0uZ0xpbVJldHVybkFmdGVyRmlyc3RNYXRjaCA9IDA7CisKKyAgICAgICAgLy8vIEluaXRpYWxpemUgTUxNIHN0YXRlIG1hY2hpbmUKKyAgICAgICAgbGltSW5pdE1sbShwTWFjKTsKKworICAgICAgICAvLy8gQnkgZGVmYXVsdCByZXR1cm4gdW5pcXVlIHNjYW4gcmVzdWx0cworICAgICAgICBwTWFjLT5saW0uZ0xpbVJldHVyblVuaXF1ZVJlc3VsdHMgPSB0cnVlOworICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVNjYW5SZXN1bHRMZW5ndGggPSAwOworCisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICAgICAgaWYgKCgodFNpclNtZVN0YXJ0UmVxICopIHBNc2dCdWYpLT5zZW5kTmV3QnNzSW5kKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBOZWVkIHRvIGluZGljYXRlIG5ldyBCU1NzIGZvdW5kIGR1cmluZyBiYWNrZ3JvdW5kIHNjYW5uaW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAqIGhvc3QuIFVwZGF0ZSB0aGlzIHBhcmFtZXRlciBhdCBDRkcKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfTkVXX0JTU19GT1VORF9JTkQsICgodFNpclNtZVN0YXJ0UmVxICopIHBNc2dCdWYpLT5zZW5kTmV3QnNzSW5kKQorICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCBzZXQgTkVJR0hCT1JfQlNTX0lORCBhdCBDRkdcbiIpKTsKKyAgICAgICAgICAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfVU5FWFBFQ1RFRF9SRVFfUkVTVUxUX0NPREU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIGVXTklfU01FX1NUQVJUX1JFUSBpbiBzdGF0ZXMKKyAgICAgICAgICogb3RoZXIgdGhhbiBPRkZMSU5FLiBSZXR1cm4gcmVzcG9uc2UgdG8gaG9zdCBhbmQKKyAgICAgICAgICogbG9nIGVycm9yCisgICAgICAgICAqLworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgU01FX1NUQVJUX1JFUSByZWNlaXZlZCBpbiBTTUUgc3RhdGUgJVhcbiIpLHBNYWMtPmxpbS5nTGltU21lU3RhdGUgKTsKKyAgICAgICAgbGltUHJpbnRTbWVTdGF0ZShwTWFjLCBMT0dFLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTsKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFOworICAgIH0KKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NUQVJUX1JTUCwgcmV0Q29kZSxzbWVzZXNzaW9uSWQsc21ldHJhbnNhY3Rpb25JZCk7Cit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZVN0YXJ0UmVxKCkgKioqLworCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gX19saW1Qcm9jZXNzU21lU3lzUmVhZHlJbmQKK1xicmllZiBoYW5kbGVzIHRoZSBub3RpZmljYXRpb24gZnJvbSBIREQuIFBFIGp1c3QgZm9yd2FyZHMgdGhpcyBtZXNzYWdlIHRvIEhBTC4KK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xwYXJhbSAgIHRBTklfVTMyKiBwTXNnQnVmCitccmV0dXJuICBUUlVFLVBvc3RpbmcgdG8gSEFMIGZhaWxlZCwgc28gUEUgd2lsbCBjb25zdW1lIHRoZSBidWZmZXIuIAorXCAgICAgICAgRkFMU0UtUG9zdGluZyB0byBIQUwgc3VjY2Vzc2Z1bCwgc28gSEFMIHdpbGwgY29uc3VtZSB0aGUgYnVmZmVyLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB0QU5JX0JPT0xFQU4KK19fbGltUHJvY2Vzc1NtZVN5c1JlYWR5SW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRTaXJNc2dRIG1zZzsKKyAgICAKKyAgICBtc2cudHlwZSA9IFdEQV9TWVNfUkVBRFlfSU5EOworICAgIG1zZy5yZXNlcnZlZCA9IDA7CisgICAgbXNnLmJvZHlwdHIgPSAgcE1zZ0J1ZjsKKyAgICBtc2cuYm9keXZhbCA9IDA7CisKKyNpZmRlZiBWT1NTX0VOQUJMRUQKKyAgICBpZihwTWFjLT5nRHJpdmVyVHlwZSAhPSBlRFJJVkVSX1RZUEVfTUZHKQorICAgIHsKKyAgICBwZVJlZ2lzdGVyVExIYW5kbGUocE1hYyk7CisgICAgfQorI2VuZGlmCisgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgic2VuZGluZyBXREFfU1lTX1JFQURZX0lORCBtc2cgdG8gSEFMXG4iKSk7KQorICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZy50eXBlKSk7CisKKyAgICBpZihlU0lSX1NVQ0NFU1MgIT0gd2RhUG9zdEN0cmxNc2cocE1hYywgJm1zZykpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIndkYVBvc3RDdHJsTXNnIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgfQorICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7Cit9CisKKworLyoqCisgKiBfX2xpbUhhbmRsZVNtZVN0YXJ0QnNzUmVxdWVzdCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgU01FX1NUQVJUX0JTU19SRVEgbWVzc2FnZQorICogZnJvbSBIREQgb3IgdXBwZXIgbGF5ZXIgYXBwbGljYXRpb24uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK19fbGltSGFuZGxlU21lU3RhcnRCc3NSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHNpemU7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgdmFsID0gMDsKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgICAgICByZXRTdGF0dXM7CisgICAgdFNpck1hY0NoYW5OdW0gICAgICAgICAgY2hhbm5lbE51bWJlcjsKKyAgICB0TGltTWxtU3RhcnRSZXEgICAgICAgICAqcE1sbVN0YXJ0UmVxOworICAgIHRwU2lyU21lU3RhcnRCc3NSZXEgICAgIHBTbWVTdGFydEJzc1JlcTsgICAgICAgICAgICAgICAgLy9Mb2NhbCB2YXJpYWJsZSBmb3IgU3RhcnQgQlNTIFJlcS4uIEFkZGVkIEZvciBCVC1BTVAgU3VwcG9ydCAKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBhdXRvR2VuQnNzSWQgPSBGQUxTRTsgICAgICAgICAgIC8vRmxhZyBVc2VkIGluIGNhc2Ugb2YgSUJTUyB0byBBdXRvIGdlbmVyYXRlIEJTU0lELgorICAgIHRTaXJNYWNIVENoYW5uZWxXaWR0aCAgIHR4V2lkdGhTZXQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgIHBzZXNzaW9uRW50cnkgPSBOVUxMOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNtZXNlc3Npb25JZDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBzbWV0cmFuc2FjdGlvbklkOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIC8vU2luY2UgdGhlIHNlc3Npb24gaXMgbm90IGNyZWF0ZWQgeWV0LCBzZW5kaW5nIE5VTEwuIFRoZSByZXNwb25zZSBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBzdGF0ZS4KKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX1NUQVJUX0JTU19SRVFfRVZFTlQsIE5VTEwsIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgIAorICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIFNUQVJUX0JTU19SRVFcbiIpKTspCisKKyAgICAvKiBHbG9iYWwgU21lIHN0YXRlIGFuZCBtbG0gc3RhdGVzIGFyZSBub3QgZGVmaW5lZCB5ZXQgLCBmb3IgQlQtQU1QIFN1cHBvcHJ0IC4gVE8gQkUgRE9ORSAqLworICAgIGlmICggKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgPT0gZUxJTV9TTUVfT0ZGTElORV9TVEFURSkgfHwKKyAgICAgICAgIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX0lETEVfU1RBVEUpKQorICAgIHsKKyAgICAgICAgc2l6ZSA9IHNpemVvZih0U2lyU21lU3RhcnRCc3NSZXEpICsgU0lSX01BQ19NQVhfSUVfTEVOR1RIOworCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgICAgICBzaXplICsgPSBBTklfV0RTX0lORk9fTUFYX0xFTkdUSDsKKyNlbmRpZgorCisgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNtZVN0YXJ0QnNzUmVxLCBzaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgicGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBwTWFjLT5saW0uZ3BMaW1TdGFydEJzc1JlcVxuIikpOykKKyAgICAgICAgICAgIC8vLyBTZW5kIGZhaWx1cmUgcmVzcG9uc2UgdG8gaG9zdAorICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAodm9pZCkgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKXBTbWVTdGFydEJzc1JlcSwgc2l6ZSk7CisgICAgICAgIAorICAgICAgICBpZiAoKGxpbVN0YXJ0QnNzUmVxU2VyRGVzKHBNYWMsIHBTbWVTdGFydEJzc1JlcSwgKHRBTklfVTggKikgcE1zZ0J1ZikgPT0gZVNJUl9GQUlMVVJFKSB8fAorICAgICAgICAgICAgICAgICghbGltSXNTbWVTdGFydEJzc1JlcVZhbGlkKHBNYWMsIHBTbWVTdGFydEJzc1JlcSkpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJSZWNlaXZlZCBpbnZhbGlkIGVXTklfU01FX1NUQVJUX0JTU19SRVFcbiIpKTspCisgICAgICAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworICAgICAgICAgICAgZ290byBmcmVlOworICAgICAgICB9CisjaWYgMCAgIAorICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywKKyAgICAgICAgICAgRkwoIlBhcnNlZCBTVEFSVF9CU1NfUkVRIGZpZWxkcyBhcmUgYnNzVHlwZT0lZCwgY2hhbm5lbElkPSVkXG4iKSwKKyAgICAgICAgICAgcE1hYy0+bGltLmdwTGltU3RhcnRCc3NSZXEtPmJzc1R5cGUsIHBNYWMtPmxpbS5ncExpbVN0YXJ0QnNzUmVxLT5jaGFubmVsSWQpOykKKyNlbmRpZiAKKworICAgICAgICAvKiBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSBQRSBpcyBnb2luZyB0byBjcmVhdGUgYSBzZXNzaW9uLgorICAgICAgICAgKiBJZiBzZXNzaW9uIGlzIG5vdCBleGlzdGVkICwgdGhlbiBjcmVhdGUgYSBuZXcgc2Vzc2lvbiAqLworICAgICAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMscFNtZVN0YXJ0QnNzUmVxLT5ic3NJZCwmc2Vzc2lvbklkKSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJTZXNzaW9uIEFscmVhZHkgZXhpc3RzIGZvciBnaXZlbiBCU1NJRFxuIikpOworICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX0JTU19BTFJFQURZX1NUQVJURURfT1JfSk9JTkVEOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeSA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGZyZWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlQ3JlYXRlU2Vzc2lvbihwTWFjLHBTbWVTdGFydEJzc1JlcS0+YnNzSWQsJnNlc3Npb25JZCwgcE1hYy0+bGltLm1heFN0YXRpb24pKSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiU2Vzc2lvbiBDYW4gbm90IGJlIGNyZWF0ZWQgXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICBnb3RvIGZyZWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAKKyAgICAgICAgLyogU3RvcmUgdGhlIHNlc3Npb24gcmVsYXRlZCBwYXJhbWV0ZXJzIGluIG5ld2x5IGNyZWF0ZWQgc2Vzc2lvbiAqLworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEgPSBwU21lU3RhcnRCc3NSZXE7CisKKyAgICAgICAgLyogU3RvcmUgUEUgc2Vzc2lvbklkIGluIHNlc3Npb24gVGFibGUgICovCisgICAgICAgIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkID0gc2Vzc2lvbklkOworCisgICAgICAgIC8qIFN0b3JlIFNNRSBzZXNzaW9uIElkIGluIHNlc3Npb25UYWJsZSAqLworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQgPSBwU21lU3RhcnRCc3NSZXEtPnNlc3Npb25JZDsKKworICAgICAgICBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkID0gcFNtZVN0YXJ0QnNzUmVxLT50cmFuc2FjdGlvbklkOworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHNpckNvcHlNYWNBZGRyKHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLHBTbWVTdGFydEJzc1JlcS0+c2VsZk1hY0FkZHIpOworICAgICAgICAKKyAgICAgICAgLyogQ29weSBTU0lEIHRvIHNlc3Npb24gdGFibGUgKi8KKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikmcHNlc3Npb25FbnRyeS0+c3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopJnBTbWVTdGFydEJzc1JlcS0+c3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAocFNtZVN0YXJ0QnNzUmVxLT5zc0lkLmxlbmd0aCArIDEpKTsKKyAgICAgICAgCisgICAgICAgCisgICAgICAgIAorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NUeXBlID0gcFNtZVN0YXJ0QnNzUmVxLT5ic3NUeXBlOworICAgICAgICAKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bndUeXBlID0gcFNtZVN0YXJ0QnNzUmVxLT5ud1R5cGU7CisgICAgICAgIAorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWwgPSBwU21lU3RhcnRCc3NSZXEtPmJlYWNvbkludGVydmFsOworCisgICAgICAgIC8qIFN0b3JlIHRoZSBjaGFubmVsIG51bWJlciBpbiBzZXNzaW9uIFRhYmxlICovCisgICAgICAgIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCA9IHBTbWVTdGFydEJzc1JlcS0+Y2hhbm5lbElkOworCisgICAgICAgIC8qU3RvcmUgUGVyc29uYSAqLworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPSBwU21lU3RhcnRCc3NSZXEtPmJzc1BlcnNvbmE7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1BFLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsRkwoIlBFIFBFUlNPTkE9JWRcbiIpLAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hKTsKKworICAgICAgICAvKlVwZGF0ZSB0aGUgcGh5bW9kZSovCisgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1QaHlNb2RlID0gcFNtZVN0YXJ0QnNzUmVxLT5ud1R5cGU7CisKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciA9IGNmZ0dldFJlZ3VsYXRvcnlNYXhUcmFuc21pdFBvd2VyKCBwTWFjLCAKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCApOworICAgICAgICAvKiBTdG9yZSB0aGUgZG90IDExIG1vZGUgaW4gdG8gdGhlIHNlc3Npb24gVGFibGUqLworCisgICAgICAgIHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSA9IHBTbWVTdGFydEJzc1JlcS0+ZG90MTFtb2RlOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkgPSBJU19ET1QxMV9NT0RFX0hUKHBzZXNzaW9uRW50cnktPmRvdDExbW9kZSk7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopJnBzZXNzaW9uRW50cnktPnJhdGVTZXQsCisgICAgICAgICAgICAodm9pZCopJnBTbWVTdGFydEJzc1JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0LAorICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNSYXRlU2V0KSk7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKSZwc2Vzc2lvbkVudHJ5LT5leHRSYXRlU2V0LAorICAgICAgICAgICAgKHZvaWQqKSZwU21lU3RhcnRCc3NSZXEtPmV4dGVuZGVkUmF0ZVNldCwKKyAgICAgICAgICAgIHNpemVvZih0U2lyTWFjUmF0ZVNldCkpOworCisgICAgICAgIHN3aXRjaChwU21lU3RhcnRCc3NSZXEtPmJzc1R5cGUpCisgICAgICAgIHsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICBjYXNlIGVTSVJfSU5GUkFfQVBfTU9ERToKKyAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9IGVMSU1fQVBfUk9MRTsKKyAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cHJpdmFjeSA9IHBTbWVTdGFydEJzc1JlcS0+cHJpdmFjeTsKKyAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+ZndkV1BTUEJDUHJvYmVSZXEgPSBwU21lU3RhcnRCc3NSZXEtPmZ3ZFdQU1BCQ1Byb2JlUmVxOworICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5hdXRoVHlwZSA9IHBTbWVTdGFydEJzc1JlcS0+YXV0aFR5cGU7CisgICAgICAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBEVElNIHBlcmlvZCAqLworICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5kdGltUGVyaW9kID0gKHRBTklfVTgpcFNtZVN0YXJ0QnNzUmVxLT5kdGltUGVyaW9kOworICAgICAgICAgICAgICAgICAvKkVuYWJsZS9kaXNhYmxlIFVBUFNEKi8KKyAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YXBVYXBzZEVuYWJsZSA9IHBTbWVTdGFydEJzc1JlcS0+YXBVYXBzZEVuYWJsZTsKKyAgICAgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnByb3h5UHJvYmVSc3BFbiA9IDA7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvKiBUbyBkZXRlY3QgUEJDIG92ZXJsYXAgaW4gU0FQIFdQUyBtb2RlLCBIb3N0IGhhbmRsZXMKKyAgICAgICAgICAgICAgICAgICAgICAqIFByb2JlIFJlcXVlc3RzLgorICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBpZihTQVBfV1BTX0RJU0FCTEVEID09IHBTbWVTdGFydEJzc1JlcS0+d3BzX3N0YXRlKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnByb3h5UHJvYmVSc3BFbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cHJveHlQcm9iZVJzcEVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc2lkSGlkZGVuID0gcFNtZVN0YXJ0QnNzUmVxLT5zc2lkSGlkZGVuOworICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT53cHNfc3RhdGUgPSBwU21lU3RhcnRCc3NSZXEtPndwc19zdGF0ZTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgZVNJUl9JQlNTX01PREU6CisgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPSBlTElNX1NUQV9JTl9JQlNTX1JPTEU7CisgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGVTSVJfQlRBTVBfQVBfTU9ERToKKyAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9IGVMSU1fQlRfQU1QX0FQX1JPTEU7CisgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGVTSVJfQlRBTVBfU1RBX01PREU6CisgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPSBlTElNX0JUX0FNUF9TVEFfUk9MRTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgb25lIG1vcmUgbW9kZSBjYWxsZWQgYXV0byBtb2RlLiB3aGljaCBpcyB1c2VkIG5vIHdoZXJlICovCisKKyAgICAgICAgICAgICAgICAgLy9GT1JCVUlMRCAtVEVNUEZJWC4uIEhPVyBUTyB1c2UgQVVUTyBNT0RFPz8/Pz8KKworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vdCB1c2VkIGFueXdoZXJlLi4udXNlZCBpbiBzY2FuIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gQlQtQU1QOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhcnJheSBvZiBwYXJzZWQgKFJlKUFzc29jIHJlcXVlc3Qgc3RydWN0dXJlCisgICAgICAgIGlmICggKHBTbWVTdGFydEJzc1JlcS0+YnNzVHlwZSA9PSBlU0lSX0JUQU1QX0FQX01PREUpCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICB8fCAocFNtZVN0YXJ0QnNzUmVxLT5ic3NUeXBlID09IGVTSVJfSU5GUkFfQVBfTU9ERSkKKyNlbmRpZgorICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUuc2l6ZSAqIHNpemVvZih0cFNpckFzc29jUmVxKSkgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoInBhbEFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICBnb3RvIGZyZWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxLCAocHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZS5zaXplICogc2l6ZW9mKHRwU2lyQXNzb2NSZXEpKSApOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hhbm5lbCBCb25kaW5nIGlzIG5vdCBhZGRyZXNzZCB5ZXQgZm9yIEJULUFNUCBTdXBwb3J0Li4gc3VuaXQgd2lsbCBhZGRyZXNzIGNoYW5uZWwgYm9uZGluZyAgICovCisgICAgICAgIGlmIChwU21lU3RhcnRCc3NSZXEtPmNoYW5uZWxJZCkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhbm5lbE51bWJlciA9IHBTbWVTdGFydEJzc1JlcS0+Y2hhbm5lbElkOworICAgICAgICAgICAgLypVcGRhdGUgY2JNb2RlIHJlY2VpdmVkIGZyb20gc21lIHdpdGggTElNJ3MgdXBkYXRlZCBjYk1vZGUqLworICAgICAgICAgICAgcFNtZVN0YXJ0QnNzUmVxLT5jYk1vZGUgPSAodEFuaUNCU2Vjb25kYXJ5TW9kZSlwTWFjLT5saW0uZ0NiTW9kZTsKKworICAgICAgICAgICAgc2V0dXBDQlN0YXRlKCBwTWFjLCBwU21lU3RhcnRCc3NSZXEtPmNiTW9kZSApOworICAgICAgICAgICAgcE1hYy0+bGltLmdIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSBsaW1HZXRIVENCU3RhdGUocFNtZVN0YXJ0QnNzUmVxLT5jYk1vZGUpOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgIHR4V2lkdGhTZXQgPSAodFNpck1hY0hUQ2hhbm5lbFdpZHRoKWxpbUdldEhUQ2FwYWJpbGl0eShwTWFjLCBlSFRfUkVDT01NRU5ERURfVFhfV0lEVEhfU0VULCBwc2Vzc2lvbkVudHJ5KTsKKyNlbHNlCisgICAgICAgICAgICB0eFdpZHRoU2V0ID0gKHRTaXJNYWNIVENoYW5uZWxXaWR0aClsaW1HZXRIVENhcGFiaWxpdHkocE1hYywgZUhUX1JFQ09NTUVOREVEX1RYX1dJRFRIX1NFVCk7CisjZW5kaWYKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIGEgbWlzbWF0Y2ggaW4gc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCBiZWluZyBwYXNzZWQgaW4gdGhlIFNUQVJUX0JTUyByZXF1ZXN0IGFuZAorICAgICAgICAgICAgICAgICogQ2hhbm5lbEJvbmRpbmcgQ0ZHLCB0aGVuIE1BQyB3aWxsIG92ZXJyaWRlIHRoZSAnQ2hhbm5lbEJvbmRpbmcnIENGRyB3aXRoIHdoYXQgaXMgYmVpbmcgcGFzc2VkCisgICAgICAgICAgICAgICAgKiBpbiBTdGFydEJzcyBSZXF1ZXN0LgorICAgICAgICAgICAgICAgICogSEFMIFJBIGFuZCBQSFkgd2lsbCBnbyBvdXQgb2Ygc3luYywgaWYgYm90aCB0aGVzZSB2YWx1ZXMgYXJlIG5vdCBjb25zaXN0ZW50IGFuZCB3aWxsIHJlc3VsdCBpbiBUWFAgRXJyb3JzCisgICAgICAgICAgICAgICAgKiB3aGVuIEhBTCBSQSB0cmllcyB0byB1c2UgNDBNaHogcmF0ZXMgd2hlbiBDQiBpcyB0dXJuZWQgb2ZmIGluIFBIWS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoKChwTWFjLT5saW0uZ0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9PSBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX05PTkUpICYmCisgICAgICAgICAgICAgICAgICAgICh0eFdpZHRoU2V0ID09IGVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKChwTWFjLT5saW0uZ0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAhPSBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX05PTkUpICYmCisgICAgICAgICAgICAgICAgICAgICh0eFdpZHRoU2V0ID09IGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoInNlY29uZGFyeUNoYW5uZWxPZmZzZXQgYW5kIHR4V2lkdGhTZXQgZG9uJ3QgbWF0Y2gsIHJlc2V0dGluZyB0eFdpZHRoU2V0IENGR1xuIikpOykKKyAgICAgICAgICAgICAgICAgICAgdHhXaWR0aFNldCA9ICh0eFdpZHRoU2V0ID09IGVIVF9DSEFOTkVMX1dJRFRIXzIwTUhaKSA/IGVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaIDogZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFo7CisgICAgICAgICAgICAgICAgICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSwgdHhXaWR0aFNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHNldCAgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSBhdCBDRkdcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldENvZGUgPSBlU0lSX0xPR1BfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmcmVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJSZWNlaXZlZCBpbnZhbGlkIGVXTklfU01FX1NUQVJUX0JTU19SRVFcbiIpKTspCisgICAgICAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworICAgICAgICAgICAgZ290byBmcmVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVsZXRlIHByZS1hdXRoIGxpc3QgaWYgYW55CisgICAgICAgIGxpbURlbGV0ZVByZUF1dGhMaXN0KHBNYWMpOworCisgICAgICAgIC8vIERlbGV0ZSBJQlNTIHBlZXIgQlNTZGVzY3JpcHRpb24gbGlzdCBpZiBhbnkKKyAgICAgICAgLy9saW1JYnNzRGVsZXRlKHBNYWMpOyBzZXAgMjYgcmV2aWV3CisKKworCisjaWZkZWYgRklYTUVfR0VONiAgIC8vZm9sbG93aW5nIGNvZGUgbWF5IG5vdCBiZSByZXF1aXJlZC4gbGltSW5pdE1sbSBpcyBub3cgYmVpbmcgaW52b2tlZCBkdXJpbmcgcGVTdGFydAorICAgICAgICAvLy8gSW5pdGlhbGl6ZSBNTE0gc3RhdGUgbWFjaGluZQorI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICAgICAgICAgIC8qIFRoZSBSb2xlIGlzIG5vdCBzZXQgeWV0LiBDdXJyZW50bHkgYXNzdW1pbmcgdGhlIEFkZEJzcyBpbiBMaW51eCB3aWxsIGJlIGNhbGxlZCBieSBBUCBvbmx5LgorICAgICAgICAgICAgICogVGhpcyBzaG91bGQgYmUgaGFuZGxlZCB3aGVuIElCU1MgZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgTGludXgKKyAgICAgICAgICAgICAqIFRPRE8gKi8KKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPSBlTElNX01MTV9JRExFX1NUQVRFOworICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisjZWxzZQorICAgICAgICBsaW1Jbml0TWxtKHBNYWMpOworI2VuZGlmCisjZW5kaWYKKworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkgPSBJU19ET1QxMV9NT0RFX0hUKHBTbWVTdGFydEJzc1JlcS0+ZG90MTFtb2RlKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgIC8qIGtlZXAgdGhlIFJTTi9XUEEgSUUgaW5mb3JtYXRpb24gaW4gUEUgU2Vzc2lvbiBFbnRyeQorICAgICAgICAgICAgICogbGF0ZXIgd2lsbCBiZSB1c2luZyB0aGlzIHRvIGNoZWNrIHdoZW4gcmVjZWl2ZWQgKFJlKUFzc29jIHJlcQorICAgICAgICAgICAgICogKi8KKyAgICAgICAgbGltU2V0UlNOaWVXUEFpZWZyb21TbWVTdGFydEJTU1JlcU1lc3NhZ2UocE1hYywmcFNtZVN0YXJ0QnNzUmVxLT5yc25JRSxwc2Vzc2lvbkVudHJ5KTsKKworI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIC8vVGFrZW4gY2FyZSBmb3Igb25seSBzb2Z0QVAgY2FzZSByZXN0IG5lZWQgdG8gYmUgZG9uZQorICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpeworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbVByb3RlY3Rpb25Db250cm9sID0gIHBTbWVTdGFydEJzc1JlcS0+cHJvdEVuYWJsZWQ7CisgICAgICAgICAgICAvKmVhY2ggYnl0ZSB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBpbmZvCisgICAgICAgICAgICAgKmJpdDcgICAgICAgYml0NiAgICBiaXQ1ICAgYml0NCBiaXQzICAgYml0MiAgYml0MSBiaXQwCisgICAgICAgICAgICAgKnJlc2VydmVkIHJlc2VydmVkIFJJRlMgTHNpZyBuLUdGIGh0MjAgMTFnIDExYiovCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSAmcHNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnBTbWVTdGFydEJzc1JlcS0+aHRfY2FwYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggdENmZ1Byb3RlY3Rpb24gKSk7CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wQVBXUFNQQkNTZXNzaW9uID0gTlVMTDsgLy8gSW5pdGlhbGl6ZSBXUFMgUEJDIHNlc3Npb24gbGluayBsaXN0CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vIFByZXBhcmUgYW5kIElzc3VlIExJTV9NTE1fU1RBUlRfUkVRIHRvIE1MTQorICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNbG1TdGFydFJlcSwgc2l6ZW9mKHRMaW1NbG1TdGFydFJlcSkpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1TdGFydFJlcVxuIikpOworICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgIGdvdG8gZnJlZTsKKyAgICAgICAgfQorCisgICAgICAgICh2b2lkKXBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikgcE1sbVN0YXJ0UmVxLCBzaXplb2YodExpbU1sbVN0YXJ0UmVxKSk7CisKKyAgICAgICAgLyogQ29weSBTU0lEIHRvIHRoZSBNTE0gc3RhcnQgc3RydWN0dXJlICovCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZwTWxtU3RhcnRSZXEtPnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwU21lU3RhcnRCc3NSZXEtPnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBTbWVTdGFydEJzc1JlcS0+c3NJZC5sZW5ndGggKyAxKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIHBNbG1TdGFydFJlcS0+c3NpZEhpZGRlbiA9IHBTbWVTdGFydEJzc1JlcS0+c3NpZEhpZGRlbjsKKyAgICAgICAgcE1sbVN0YXJ0UmVxLT5vYnNzUHJvdEVuYWJsZWQgPSBwU21lU3RhcnRCc3NSZXEtPm9ic3NQcm90RW5hYmxlZDsKKyNlbmRpZgorCisKKyAgICAgICAgcE1sbVN0YXJ0UmVxLT5ic3NUeXBlID0gcHNlc3Npb25FbnRyeS0+YnNzVHlwZTsKKworICAgICAgICAvKiBGaWxsIFBFIHNlc3Npb24gSWQgZnJvbSB0aGUgc2Vzc2lvbiBUYWJsZSAqLworICAgICAgICBwTWxtU3RhcnRSZXEtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisgICAgICAgIGlmKCAocE1sbVN0YXJ0UmVxLT5ic3NUeXBlID09IGVTSVJfQlRBTVBfU1RBX01PREUpIHx8IChwTWxtU3RhcnRSZXEtPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9BUF9NT0RFICkKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICB8fCAocE1sbVN0YXJ0UmVxLT5ic3NUeXBlID09IGVTSVJfSU5GUkFfQVBfTU9ERSkKKyNlbmRpZgorICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vbGVuID0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgICAgIC8vcmV0U3RhdHVzID0gd2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19TVEFfSUQsICh0QU5JX1U4ICopIHBNbG1TdGFydFJlcS0+YnNzSWQsICZsZW4pOworICAgICAgICAgICAgLy9pZiAocmV0U3RhdHVzICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIC8vbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cml2ZSBCU1NJRCwgcmV0U3RhdHVzPSVkXG4iKSwgcmV0U3RhdHVzKTsKKworICAgICAgICAgICAgLyogQ29weSB0aGUgQlNTSWQgZnJvbSBzZXNzaW9uVGFibGUgdG8gbWxtU3RhcnRSZXEgc3RydWN0ICovCisgICAgICAgICAgICBzaXJDb3B5TWFjQWRkcihwTWxtU3RhcnRSZXEtPmJzc0lkLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKyAgICAgICAgfQorCisgICAgICAgIGVsc2UgLy8gaWJzcyBtb2RlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltSWJzc0NvYWxlc2NpbmdIYXBwZW5lZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZigocmV0U3RhdHVzID0gd2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19JQlNTX0FVVE9fQlNTSUQsICZhdXRvR2VuQnNzSWQpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDb3VsZCBub3QgcmV0cmlldmUgQXV0byBHZW4gQlNTSUQsIHJldFN0YXR1cz0lZFxuIiksIHJldFN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfTE9HUF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgZ290byBmcmVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighYXV0b0dlbkJzc0lkKQorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBhdXRvIGdlbmVyYXRpbmcgQlNTSUQuIEluc3RlYWQsIGdldCBpdCBmcm9tIHNlc3Npb24gZW50cnkKKyAgICAgICAgICAgICAgICBzaXJDb3B5TWFjQWRkcihwTWxtU3RhcnRSZXEtPmJzc0lkLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZihwTWxtU3RhcnRSZXEtPmJzc0lkWzBdICYgMHgwMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUmVxdWVzdCB0byBzdGFydCBJQlNTIHdpdGggZ3JvdXAgQlNTSURcbiBBdXRvZ2VuZXJhdGluZyB0aGUgQlNTSURcbiIpKTspICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICBhdXRvR2VuQnNzSWQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBhdXRvR2VuQnNzSWQgKQorICAgICAgICAgICAgeyAgIC8vaWYgQlNTSUQgaXMgbm90IGFueSB1YyBpZC4gdGhlbiB1c2UgbG9jYWxseSBnZW5lcmF0ZWQgQlNTSUQuCisgICAgICAgICAgICAgICAgLy9BdXRvZ2VuZXJhdGUgdGhlIEJTU0lECisgICAgICAgICAgICAgICAgbGltR2V0UmFuZG9tQnNzaWQoIHBNYWMsIHBNbG1TdGFydFJlcS0+YnNzSWQpOworICAgICAgICAgICAgICAgIHBNbG1TdGFydFJlcS0+YnNzSWRbMF09IDB4MDI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogQ29weSByYW5kb21seSBnZW5lcmF0ZWQgQlNTSUQgdG8gdGhlIHNlc3Npb24gVGFibGUgKi8KKyAgICAgICAgICAgICAgICBzaXJDb3B5TWFjQWRkcihwc2Vzc2lvbkVudHJ5LT5ic3NJZCxwTWxtU3RhcnRSZXEtPmJzc0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBzdG9yZSB0aGUgY2hhbm5lbCBudW0gaW4gbWxtc3RhcnQgcmVxIHN0cnVjdHVyZSAqLworICAgICAgICBwTWxtU3RhcnRSZXEtPmNoYW5uZWxOdW1iZXIgPSBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWw7CisgICAgICAgIHBNbG1TdGFydFJlcS0+Y2JNb2RlID0gcFNtZVN0YXJ0QnNzUmVxLT5jYk1vZGU7ICAgICAgICAKKyAgICAgICAgcE1sbVN0YXJ0UmVxLT5iZWFjb25QZXJpb2QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWw7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICl7CisgICAgICAgICAgICBwTWxtU3RhcnRSZXEtPmR0aW1QZXJpb2QgPSBwc2Vzc2lvbkVudHJ5LT5kdGltUGVyaW9kOworICAgICAgICAgICAgcE1sbVN0YXJ0UmVxLT53cHNfc3RhdGUgPSBwc2Vzc2lvbkVudHJ5LT53cHNfc3RhdGU7CisKKyAgICAgICAgfWVsc2UKKyNlbmRpZiAgICAgICAgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0RUSU1fUEVSSU9ELCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgRFRJTSBQZXJpb2RcbiIpKTsKKyAgICAgICAgICAgIHBNbG1TdGFydFJlcS0+ZHRpbVBlcmlvZCA9ICh0QU5JX1U4KXZhbDsKKyAgICAgICAgfSAgIAorICAgICAgICAgICAgCisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0NGUF9QRVJJT0QsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEJlYWNvbiBpbnRlcnZhbFxuIikpOworICAgICAgICBwTWxtU3RhcnRSZXEtPmNmUGFyYW1TZXQuY2ZwUGVyaW9kID0gKHRBTklfVTgpdmFsOworICAgICAgICAgICAgCisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT04sICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIENGUE1heER1cmF0aW9uXG4iKSk7CisgICAgICAgIHBNbG1TdGFydFJlcS0+Y2ZQYXJhbVNldC5jZnBNYXhEdXJhdGlvbiA9ICh0QU5JX1UxNikgdmFsOworICAgICAgICAKKyAgICAgICAgLy90aGlzIG1heSBub3QgYmUgbmVlZGVkIGFueW1vcmUgbm93LCBhcyByYXRlU2V0IGlzIG5vdyBpbmNsdWRlZCBpbiB0aGUgc2Vzc2lvbiBlbnRyeSBhbmQgTUxNIGhhcyBzZXNzaW9uIGNvbnRleHQuCisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKSZwTWxtU3RhcnRSZXEtPnJhdGVTZXQsICh2b2lkKikmcHNlc3Npb25FbnRyeS0+cmF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNSYXRlU2V0KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gTm93IHBvcHVsYXRlIHRoZSAxMW4gcmVsYXRlZCBwYXJhbWV0ZXJzCisgICAgICAgIHBNbG1TdGFydFJlcS0+bndUeXBlICAgID0gcHNlc3Npb25FbnRyeS0+bndUeXBlOworICAgICAgICBwTWxtU3RhcnRSZXEtPmh0Q2FwYWJsZSA9IHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUVfR0VONCAtIERldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZGVmYXVsdHMuLi4KKyAgICAgICAgLy8KKyAgICAgICAgcE1sbVN0YXJ0UmVxLT5odE9wZXJNb2RlICAgICAgICA9IHBNYWMtPmxpbS5nSFRPcGVyTW9kZTsKKyAgICAgICAgcE1sbVN0YXJ0UmVxLT5kdWFsQ1RTUHJvdGVjdGlvbiA9IHBNYWMtPmxpbS5nSFREdWFsQ1RTUHJvdGVjdGlvbjsgLy8gVW51c2VkCisgICAgICAgIHBNbG1TdGFydFJlcS0+dHhDaGFubmVsV2lkdGhTZXQgPSBwTWFjLT5saW0uZ0hUUmVjb21tZW5kZWRUeFdpZHRoU2V0OworCisgICAgICAgIC8vVXBkYXRlIHRoZSBnbG9iYWwgTElNIHBhcmFtZXRlciwgd2hpY2ggaXMgdXNlZCB0byBwb3B1bGF0ZSBIVCBJbmZvIElFcyBpbiBiZWFjb25zL3Byb2JlIHJlc3BvbnNlcy4KKyAgICAgICAgcE1hYy0+bGltLmdIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSBsaW1HZXRIVENCU3RhdGUocE1sbVN0YXJ0UmVxLT5jYk1vZGUpOworCisgICAgICAgIC8qIHNlcDI2IHJldmlldyAqLworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1SRkJhbmQgPSBsaW1HZXRSRkJhbmQoY2hhbm5lbE51bWJlcik7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSAxMWggRW5hYmxlIEZsYWcKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltMTFoRW5hYmxlID0gMDsKKyAgICAgICAgaWYoKHBNbG1TdGFydFJlcS0+YnNzVHlwZSAhPSBlU0lSX0lCU1NfTU9ERSkgJiYKKyAgICAgICAgICAgIChTSVJfQkFORF81X0dIWiA9PSBwc2Vzc2lvbkVudHJ5LT5saW1SRkJhbmQpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfMTFIX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkZhaWwgdG8gZ2V0IFdOSV9DRkdfMTFIX0VOQUJMRUQgXG4iKSk7CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW0xMWhFbmFibGUgPSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBpZiAoIXBzZXNzaW9uRW50cnktPmxpbTExaEVuYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlQsIDApICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkZhaWwgdG8gZ2V0IFdOSV9DRkdfMTFIX0VOQUJMRUQgXG4iKSk7CisgICAgICAgIH0KKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRG90IDExaCBpcyAlc1xuIiksIHBNYWMtPmxpbS5nTGltMTFoRW5hYmxlPyJFbmFibGVkIjoiRGlzYWJsZWQiKTspCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbTExaEVuYWJsZSkKKyAgICAgICAgeyAKKyAgICAgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiQ2Igc3RhdGUgPSAlZCwgU2VjQ2hhbk9mZnNldCA9ICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0NiU3RhdGUsIHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTspCisgICAgICAgICAgICBsaW1SYWRhckluaXQocE1hYyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBwc2Vzc2lvbkVudHJ5IC0+bGltUHJldlNtZVN0YXRlID0gcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGU7CisgICAgICAgIHBzZXNzaW9uRW50cnkgLT5saW1TbWVTdGF0ZSAgICAgPSAgZUxJTV9TTUVfV1RfU1RBUlRfQlNTX1NUQVRFOworICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKworICAgICAgICBsaW1Qb3N0TWxtTWVzc2FnZShwTWFjLCBMSU1fTUxNX1NUQVJUX1JFUSwgKHRBTklfVTMyICopIHBNbG1TdGFydFJlcSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJSZWNlaXZlZCB1bmV4cGVjdGVkIFNUQVJUX0JTU19SRVEsIGluIHN0YXRlICVYXG4iKSxwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTsKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX0JTU19BTFJFQURZX1NUQVJURURfT1JfSk9JTkVEOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9IC8vIGlmIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX09GRkxJTkVfU1RBVEUpCisKK2ZyZWU6CisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcFNtZVN0YXJ0QnNzUmVxKTsKKyAgICBwU21lU3RhcnRCc3NSZXEgPSBOVUxMOworCitlbmQ6CisKKyAgICAvKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHJldHVybiB0aGUgc21lIHNlc3Npb25JZCBhbmQgU01FIHRyYW5zYWN0aW9uIElkICovCisgICAgbGltR2V0U2Vzc2lvbkluZm8ocE1hYywodEFOSV9VOCopcE1zZ0J1Ziwmc21lc2Vzc2lvbklkLCZzbWV0cmFuc2FjdGlvbklkKTsgCisgICAgCisgICAgaWYoTlVMTCAhPSBwc2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgICAgcGVEZWxldGVTZXNzaW9uKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgIHBzZXNzaW9uRW50cnkgPSBOVUxMOworICAgIH0gICAgIAorICAgIGxpbVNlbmRTbWVTdGFydEJzc1JzcChwTWFjLCBlV05JX1NNRV9TVEFSVF9CU1NfUlNQLCByZXRDb2RlLHBzZXNzaW9uRW50cnksc21lc2Vzc2lvbklkLHNtZXRyYW5zYWN0aW9uSWQpOworfSAvKioqIGVuZCBfX2xpbUhhbmRsZVNtZVN0YXJ0QnNzUmVxdWVzdCgpICoqKi8KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBfX2xpbVByb2Nlc3NTbWVTdGFydEJzc1JlcQorCitcYnJpZWYgIFdyYXBwZXIgZm9yIHRoZSBmdW5jdGlvbiBfX2xpbUhhbmRsZVNtZVN0YXJ0QnNzUmVxdWVzdAorICAgICAgICBUaGlzIG1lc3NhZ2Ugd2lsbCBiZSBkZWZlcmVkIHVudGlsIHNvZnRtYWMgY29tZSBvdXQgb2YKKyAgICAgICAgc2NhbiBtb2RlIG9yIGlmIHdlIGhhdmUgZGV0ZWN0ZWQgcmFkYXIgb24gdGhlIGN1cnJlbnQKKyAgICAgICAgb3BlcmF0aW5nIGNoYW5uZWwuCitccGFyYW0gIHBNYWMKK1xwYXJhbSAgcE1zZworCitccmV0dXJuIFRSVUUgLSBJZiB3ZSBjb25zdW1lZCB0aGUgYnVmZmVyCisgICAgICAgIEZBTFNFIC0gSWYgaGF2ZSBkZWZlcmVkIHRoZSBtZXNzYWdlLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdEFOSV9CT09MRUFOCitfX2xpbVByb2Nlc3NTbWVTdGFydEJzc1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZykKK3sKKyAgICBpZiAoX19saW1Jc0RlZmVyZWRNc2dGb3JMZWFybihwTWFjLCBwTXNnKSB8fAorICAgICAgICAgICAgX19saW1Jc0RlZmVyZWRNc2dGb3JSYWRhcihwTWFjLCBwTXNnKSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJZiBtZXNzYWdlIGRlZmVyZWQsIGJ1ZmZlciBpcyBub3QgY29uc3VtZWQgeWV0LgorICAgICAgICAgKiBTbyByZXR1cm4gZmFsc2UKKyAgICAgICAgICovCisgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorCisgICAgX19saW1IYW5kbGVTbWVTdGFydEJzc1JlcXVlc3QocE1hYywgKHRBTklfVTMyICopIHBNc2ctPmJvZHlwdHIpOworICAgIHJldHVybiBlQU5JX0JPT0xFQU5fVFJVRTsKK30KKworCisvKioKKyAqICBsaW1HZXRSYW5kb21Cc3NpZCgpCisgKgorICogIEZVTkNUSU9OOlRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgZ2VuZXJhdGUgdGhlIHJhbmRvbSBudW1iZXIgZm9yIGJzc2lkCisgKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBTTUVfU0NBTl9SRVEgbWVzc2FnZQorICogIGZyb20gSEREIG9yIHVwcGVyIGxheWVyIGFwcGxpY2F0aW9uLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKiAxLiBnZW5lYXJ0ZXMgdGhlIHVuaXF1ZSByYW5kb20gbnVtYmVyIGZvciBic3NpZCBpbiBpYnNzCisgKgorICogIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gICpkYXRhICAgICAgUG9pbnRlciB0byAgYnNzaWQgIGJ1ZmZlcgorICogIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbUdldFJhbmRvbUJzc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKmRhdGEpCit7CisgICAgIHRBTklfVTMyIHJhbmRvbVsyXSA7CisgICAgIHJhbmRvbVswXSA9IHR4X3RpbWVfZ2V0KCk7CisgICAgIHJhbmRvbVswXSB8PSAocmFuZG9tWzBdIDw8IDE1KSA7CisgICAgIHJhbmRvbVsxXSA9IHJhbmRvbVswXSA+PiAxOworICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIGRhdGEsICh0QU5JX1U4KilyYW5kb20sIHNpemVvZih0U2lyTWFjQWRkcikpOworfQorCisKKy8qKgorICogX19saW1Qcm9jZXNzU21lU2NhblJlcSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgU01FX1NDQU5fUkVRIG1lc3NhZ2UKKyAqIGZyb20gSEREIG9yIHVwcGVyIGxheWVyIGFwcGxpY2F0aW9uLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKiAxLiBQZXJpb2RpYyBzY2FubmluZyBzaG91bGQgYmUgcmVxdWVzdGluZyB0byByZXR1cm4gdW5pcXVlCisgKiAgICBzY2FuIHJlc3VsdHMuCisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NTbWVTY2FuUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRBTklfVTMyICAgICAgICAgICAgbGVuOworICAgIHRMaW1NbG1TY2FuUmVxICAgICAgKnBNbG1TY2FuUmVxOworICAgIHRwU2lyU21lU2NhblJlcSAgICAgcFNjYW5SZXE7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBpID0gMDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX1NDQU5fUkVRX0VWRU5ULCBOVUxMLCAwLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgICAKKyAgICBwU2NhblJlcSA9ICh0cFNpclNtZVNjYW5SZXEpIHBNc2dCdWY7ICAgCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU01FIFNDQU4gUkVRIG51bUNoYW4gJWQgbWluICVkIG1heCAlZCBJRUxlbiAlZCBmaXJzdCAlZCBmcmVzaCAlZCB1bmlxdWUgJWQgdHlwZSAlZCByc3AgJWRcbiIpLAorICAgICAgICAgICBwU2NhblJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMsCisgICAgICAgICAgIHBTY2FuUmVxLT5taW5DaGFubmVsVGltZSwKKyAgICAgICAgICAgcFNjYW5SZXEtPm1heENoYW5uZWxUaW1lLAorICAgICAgICAgICBwU2NhblJlcS0+dUlFRmllbGRMZW4sIAorICAgICAgICAgICBwU2NhblJlcS0+cmV0dXJuQWZ0ZXJGaXJzdE1hdGNoLAorICAgICAgICAgICBwU2NhblJlcS0+cmV0dXJuRnJlc2hSZXN1bHRzLAorICAgICAgICAgICBwU2NhblJlcS0+cmV0dXJuVW5pcXVlUmVzdWx0cywKKyAgICAgICAgICAgcFNjYW5SZXEtPnNjYW5UeXBlLCBwTWFjLT5saW0uZ0xpbVJzcFJlcWQgPyAxIDogMCk7KQorICAgICAgICAKKyAgICAvKmNvcHkgdGhlIFNlbGYgTUFDIGFkZHJlc3MgZnJvbSBTbWVSZXEgdG8gdGhlIGdsb2JhbHBsYWNlICwgdXNlZCBmb3Igc2VuZGluZyBwcm9iZSByZXEuZGlzY3Vzc2VkIG9uIGNvZGUgcmV2aWV3IHNlcDE4Ki8KKyAgICBzaXJDb3B5TWFjQWRkcihwTWFjLT5saW0uZ1NlbGZNYWNBZGRyLCAgcFNjYW5SZXEtPnNlbGZNYWNBZGRyKTsKKworICAgLyogVGhpcyByb3V0aW5lIHNob3VsZCByZXR1cm4gdGhlIHNtZSBzZXNzaW9uSWQgYW5kIFNNRSB0cmFuc2FjdGlvbiBJZCAqLworICAgICAgIAorICAgIGlmICghbGltSXNTbWVTY2FuUmVxVmFsaWQocE1hYywgcFNjYW5SZXEpKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiUmVjZWl2ZWQgU01FX1NDQU5fUkVRIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzXG4iKSk7KQorCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVJzcFJlcWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltUnNwUmVxZCA9IGZhbHNlOworCisgICAgICAgICAgICBsaW1TZW5kU21lU2NhblJzcChwTWFjLCBzaXplb2YodFNpclNtZVNjYW5Sc3ApLCBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlMsIHBTY2FuUmVxLT5zZXNzaW9uSWQsIHBTY2FuUmVxLT50cmFuc2FjdGlvbklkKTsKKworICAgICAgICB9IC8vIGlmIChwTWFjLT5saW0uZ0xpbVJzcFJlcWQpCisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vaWYgc2NhbiBpcyBkaXNhYmxlZCB0aGVuIHJldHVybiBhcyBpbnZhbGlkIHNjYW4gcmVxdWVzdC4KKyAgICAvL2lmIHNjYW4gaW4gcG93ZXIgc2F2ZSBpcyBkaXNhYmxlZCwgYW5kIHN5c3RlbSBpcyBpbiBwb3dlciBzYXZlIG1vZGUsIHRoZW4gaWdub3JlIHNjYW4gcmVxdWVzdC4KKyAgICBpZiggKHBNYWMtPmxpbS5mU2NhbkRpc2FibGVkKSB8fCAoIXBNYWMtPmxpbS5nU2NhbkluUG93ZXJzYXZlICYmICFsaW1Jc1N5c3RlbUluQWN0aXZlU3RhdGUocE1hYykpICApCisgICAgeworICAgICAgICBsaW1TZW5kU21lU2NhblJzcChwTWFjLCA4LCBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlMsIHBTY2FuUmVxLT5zZXNzaW9uSWQsIHBTY2FuUmVxLT50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIElmIHNjYW4gcmVxdWVzdCBpcyByZWNlaXZlZCBpbiBpZGxlLCBqb2luRmFpbGVkCisgICAgICogc3RhdGVzIG9yIGluIGxpbmsgZXN0YWJsaXNoZWQgc3RhdGUgKGluIFNUQSByb2xlKQorICAgICAqIG9yIGluIG5vcm1hbCBzdGF0ZSAoaW4gU1RBLWluLUlCU1MvQVAgcm9sZSkgd2l0aAorICAgICAqICdyZXR1cm4gZnJlc2ggc2NhbiByZXN1bHRzJyByZXF1ZXN0IGZyb20gSEREIG9yCisgICAgICogaXQgaXMgcGVyaW9kaWMgYmFja2dyb3VuZCBzY2FubmluZyByZXF1ZXN0LAorICAgICAqIHRyaWdnZXIgZnJlc2ggc2NhbiByZXF1ZXN0IHRvIE1MTQorICAgICAqLworICBpZiAoX19saW1GcmVzaFNjYW5SZXFkKHBNYWMsIHBTY2FuUmVxLT5yZXR1cm5GcmVzaFJlc3VsdHMpKQorICB7CisgICAgICAgICNpZiAwICAgCisgICAgICAgIC8vIFVwZGF0ZSBnbG9iYWwgU01FIHN0YXRlCisgICAgICAgIHBNYWMtPmxpbS5nTGltUHJldlNtZVN0YXRlID0gcE1hYy0+bGltLmdMaW1TbWVTdGF0ZTsKKyAgICAgICAgaWYgKChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX0lETEVfU1RBVEUpIHx8CisgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEUpKQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9IGVMSU1fU01FX1dUX1NDQU5fU1RBVEU7CisgICAgICAgIGVsc2UgaWYgKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9IGVMSU1fU01FX05PUk1BTF9DSEFOTkVMX1NDQU5fU1RBVEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIAorICAgICAgICAjZW5kaWYgLy9UTyBTVVBQT1JUIEJULUFNUAorCisgICAgICAgIC8qQ2hhbmdlIEdsb2JhbCBTTUUgc3RhdGUgICovCisKKyAgICAgICAgLyogU3RvcmUgdGhlIHByZXZpb3VzIFNNRSBzdGF0ZSAqLworCisgICAgICAgICBwTWFjLT5saW0uZ0xpbVByZXZTbWVTdGF0ZSA9IHBNYWMtPmxpbS5nTGltU21lU3RhdGU7CisgICAgICAgIAorICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID0gZUxJTV9TTUVfV1RfU0NBTl9TVEFURTsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisKKyAgICAgICAgaWYgKHBTY2FuUmVxLT5yZXR1cm5GcmVzaFJlc3VsdHMgJiBTSVJfQkdfU0NBTl9QVVJHRV9SRVNVVExTKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBEaXNjYXJkIHByZXZpb3VzbHkgY2FjaGVkIHNjYW4gcmVzdWx0cworICAgICAgICAgICAgbGltUmVJbml0U2NhblJlc3VsdHMocE1hYyk7CisgICAgICAgIH0KKworICAgICAgICBwTWFjLT5saW0uZ0xpbTI0QmFuZDExZFNjYW5Eb25lICAgICA9IDA7CisgICAgICAgIHBNYWMtPmxpbS5nTGltNTBCYW5kMTFkU2NhbkRvbmUgICAgID0gMDsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1SZXR1cm5BZnRlckZpcnN0TWF0Y2ggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXEtPnJldHVybkFmdGVyRmlyc3RNYXRjaDsKKworICAgICAgICBwTWFjLT5saW0uZ0xpbVJldHVyblVuaXF1ZVJlc3VsdHMgICA9CisgICAgICAgICAgICAgICgocFNjYW5SZXEtPnJldHVyblVuaXF1ZVJlc3VsdHMpID4gMCA/IHRydWUgOiBmYWxzZSk7CisgICAgICAgIC8qIERlLWFjdGl2YXRlIEhlYXJ0YmVhdCB0aW1lcnMgZm9yIGNvbm5lY3RlZCBzZXNzaW9ucyB3aGlsZQorICAgICAgICAgKiBzY2FuIGlzIGluIHByb2dyZXNzIGlmIHRoZSBzeXN0ZW0gaXMgaW4gQWN0aXZlIG1vZGUgKi8KKyAgICAgICAgaWYoKGVQTU1fU1RBVEVfQk1QU19XQUtFVVAgPT0gcE1hYy0+cG1tLmdQbW1TdGF0ZSkgfHwKKyAgICAgICAgICAgKGVQTU1fU1RBVEVfUkVBRFkgPT0gcE1hYy0+cG1tLmdQbW1TdGF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICBmb3IoaT0wO2k8cE1hYy0+bGltLm1heEJzc0lkO2krKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZigocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCA9PSBUUlVFKSAmJgorICAgICAgICAgICAgICAgKGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUgPT0gcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1NbG1TdGF0ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBsaW1IZWFydEJlYXREZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsaSkpOworICAgICAgICAgICAgfSAgIAorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU2NhblJlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICBjZmdfbGVuOworICAgICAgICAgICAgLy8gU2NhbiBhbGwgY2hhbm5lbHMKKyAgICAgICAgICAgIGxlbiA9IHNpemVvZih0TGltTWxtU2NhblJlcSkgKyAKKyAgICAgICAgICAgICAgICAgIChzaXplb2YoIHBTY2FuUmVxLT5jaGFubmVsTGlzdC5jaGFubmVsTnVtYmVyICkgKiAoV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOIC0gMSkpICsKKyAgICAgICAgICAgICAgICAgIHBTY2FuUmVxLT51SUVGaWVsZExlbjsKKyAgICAgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1sbVNjYW5SZXEsIGxlbikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIG1sbVNjYW5SZXEgKCVkKVxuIiksIGxlbik7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhpcyBidWZmZXIKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBNbG1TY2FuUmVxLCBsZW4gKTsKKworICAgICAgICAgICAgY2ZnX2xlbiA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcE1sbVNjYW5SZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjZmdfbGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBWYWxpZCBjaGFubmVsIGxpc3QgZnJvbSBDRkcuCisgICAgICAgICAgICAgICAgICogTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIFZhbGlkIGNoYW5uZWwgbGlzdFxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE1sbVNjYW5SZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzID0gKHRBTklfVTgpIGNmZ19sZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZW4gPSBzaXplb2YoIHRMaW1NbG1TY2FuUmVxICkgLSBzaXplb2YoIHBTY2FuUmVxLT5jaGFubmVsTGlzdC5jaGFubmVsTnVtYmVyICkgKyAKKyAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKCBwU2NhblJlcS0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlciApICogcFNjYW5SZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzICkgKworICAgICAgICAgICAgICAgICAgIHBTY2FuUmVxLT51SUVGaWVsZExlbjsKKworICAgICAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTWxtU2NhblJlcSwgbGVuKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgbWxtU2NhblJlcSglZClcbiIpLCBsZW4pOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoaXMgYnVmZmVyCisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTWxtU2NhblJlcSwgbGVuKTsKKyAgICAgICAgICAgIHBNbG1TY2FuUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzOworCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTWxtU2NhblJlcS0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyk7CisgICAgICAgIH0KKworICAgICAgICBwTWxtU2NhblJlcS0+dUlFRmllbGRMZW4gPSBwU2NhblJlcS0+dUlFRmllbGRMZW47CisgICAgICAgIHBNbG1TY2FuUmVxLT51SUVGaWVsZE9mZnNldCA9IGxlbiAtIHBTY2FuUmVxLT51SUVGaWVsZExlbjsKKyAgICAgICAgCisgICAgICAgIGlmKHBTY2FuUmVxLT51SUVGaWVsZExlbikKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKilwTWxtU2NhblJlcSsgcE1sbVNjYW5SZXEtPnVJRUZpZWxkT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKXBTY2FuUmVxKyhwU2NhblJlcS0+dUlFRmllbGRPZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlcS0+dUlFRmllbGRMZW4pOworICAgICAgICB9CisKKyAgICAgICAgcE1sbVNjYW5SZXEtPmJzc1R5cGUgPSBwU2NhblJlcS0+YnNzVHlwZTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1sbVNjYW5SZXEtPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVxLT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgcE1sbVNjYW5SZXEtPm51bVNzaWQgPSBwU2NhblJlcS0+bnVtU3NpZDsKKworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBwTWxtU2NhblJlcS0+bnVtU3NpZCkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBNbG1TY2FuUmVxLT5zc0lkW2ldLAorICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwU2NhblJlcS0+c3NJZFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlcS0+c3NJZFtpXS5sZW5ndGggKyAxKTsKKworICAgICAgICAgICAgaSsrOworICAgICAgICB9IAorICAgICAgIAorCisgICAgICAgIHBNbG1TY2FuUmVxLT5zY2FuVHlwZSA9IHBTY2FuUmVxLT5zY2FuVHlwZTsKKyAgICAgICAgcE1sbVNjYW5SZXEtPmJhY2tncm91bmRTY2FuTW9kZSA9IHBTY2FuUmVxLT5iYWNrZ3JvdW5kU2Nhbk1vZGU7CisgICAgICAgIHBNbG1TY2FuUmVxLT5taW5DaGFubmVsVGltZSA9IHBTY2FuUmVxLT5taW5DaGFubmVsVGltZTsKKyAgICAgICAgcE1sbVNjYW5SZXEtPm1heENoYW5uZWxUaW1lID0gcFNjYW5SZXEtPm1heENoYW5uZWxUaW1lOworICAgICAgICBwTWxtU2NhblJlcS0+ZG90MTFtb2RlID0gcFNjYW5SZXEtPmRvdDExbW9kZTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIHBNbG1TY2FuUmVxLT5wMnBTZWFyY2ggPSBwU2NhblJlcS0+cDJwU2VhcmNoOworI2VuZGlmCisKKyAgICAgICAgLy9TdG9yZSB0aGUgc21lU2Vzc2lvbklEIGFuZCB0cmFuc2FjdGlvbiBJRCBmb3IgbGF0ZXIgdXNlLgorICAgICAgICBwTWFjLT5saW0uZ1NtZVNlc3Npb25JZCA9IHBTY2FuUmVxLT5zZXNzaW9uSWQ7CisgICAgICAgIHBNYWMtPmxpbS5nVHJhbnNhY3Rpb25JZCA9IHBTY2FuUmVxLT50cmFuc2FjdGlvbklkOworCisgICAgICAgIC8vIElzc3VlIExJTV9NTE1fU0NBTl9SRVEgdG8gTUxNCisgICAgICAgIGxpbVBvc3RNbG1NZXNzYWdlKHBNYWMsIExJTV9NTE1fU0NBTl9SRVEsICh0QU5JX1UzMiAqKSBwTWxtU2NhblJlcSk7CisKKyAgICB9IC8vIGlmICgocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9JRExFX1NUQVRFKSB8fCAuLi4KKyAgICAKKyAgICBlbHNlCisgICAgeworICAgICAgICAvLy8gSW4gYWxsIG90aGVyIGNhc2VzIHJldHVybiAnY2FjaGVkJyBzY2FuIHJlc3VsdHMKKyAgICAgICAgaWYgKChwTWFjLT5saW0uZ0xpbVJzcFJlcWQpIHx8IHBNYWMtPmxpbS5nTGltUmVwb3J0QmFja2dyb3VuZFNjYW5SZXN1bHRzKQorICAgICAgICB7CisgICAgICAgICAgICB0QU5JX1UxNiAgICBzY2FuUnNwTGVuID0gc2l6ZW9mKHRTaXJTbWVTY2FuUnNwKTsKKworICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVNtZVNjYW5SZXN1bHRMZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1TZW5kU21lU2NhblJzcChwTWFjLCBzY2FuUnNwTGVuLCBlU0lSX1NNRV9TVUNDRVNTLCBwU2NhblJlcS0+c2Vzc2lvbklkLCBwU2NhblJlcS0+dHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2NhblJzcExlbiA9IHNpemVvZih0U2lyU21lU2NhblJzcCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVNjYW5SZXN1bHRMZW5ndGggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpckJzc0Rlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICBsaW1TZW5kU21lU2NhblJzcChwTWFjLCBzY2FuUnNwTGVuLCBlU0lSX1NNRV9TVUNDRVNTLCBwU2NhblJlcS0+c2Vzc2lvbklkLCBwU2NhblJlcS0+dHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwU2NhblJlcS0+cmV0dXJuRnJlc2hSZXN1bHRzICYgU0lSX0JHX1NDQU5fUFVSR0VfUkVTVVRMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIHByZXZpb3VzbHkgY2FjaGVkIHNjYW4gcmVzdWx0cworICAgICAgICAgICAgICAgIGxpbVJlSW5pdFNjYW5SZXN1bHRzKHBNYWMpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy8gaWYgKHBNYWMtPmxpbS5nTGltUnNwUmVxZCkKKyAgICB9IC8vIGVsc2UgKChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX0lETEVfU1RBVEUpIHx8IC4uLgorCisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyNpZmRlZiBCQUNLR1JPVU5EX1NDQU5fRU5BQkxFRAorICAgIC8vIHN0YXJ0IGJhY2tncm91bmQgc2NhbnMgaWYgbmVlZGVkCisgICAgLy8gVGhlcmUgaXMgYSBidWcgb3BlbmVkIGFnYWluc3Qgc29mdG1hYy4gTmVlZCB0byBlbmFibGUgd2hlbiB0aGUgYnVnIGlzIGZpeGVkLgorICAgIF9fbGltQmFja2dyb3VuZFNjYW5Jbml0aWF0ZShwTWFjKTsKKyNlbmRpZgorI2VuZGlmCisKK30gLyoqKiBlbmQgX19saW1Qcm9jZXNzU21lU2NhblJlcSgpICoqKi8KKworCisKKworLyoqCisgKiBfX2xpbVByb2Nlc3NTbWVKb2luUmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBTTUVfSk9JTl9SRVEgbWVzc2FnZQorICogZnJvbSBIREQgb3IgdXBwZXIgbGF5ZXIgYXBwbGljYXRpb24uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc1NtZUpvaW5SZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgIC8vICB0QU5JX1U4ICAgICAgICAgICAgICpwQnVmOworICAgIC8vdEFOSV9VMzIgICAgICAgICAgICBsZW47CisvLyAgICB0U2lyTWFjQWRkciAgICAgICAgIGN1cnJlbnRCc3NJZDsKKyAgICB0cFNpclNtZUpvaW5SZXEgICAgIHBTbWVKb2luUmVxID0gTlVMTDsKKyAgICB0TGltTWxtSm9pblJlcSAgICAgICpwTWxtSm9pblJlcTsKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgIHJldENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgIHRBTklfVTMyICAgICAgICAgICAgdmFsID0gMDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIG5TaXplOworICAgIHRBTklfVTggICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgcHNlc3Npb25FbnRyeSA9IE5VTEw7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzbWVzZXNzaW9uSWQ7CisgICAgdEFOSV9VMTYgICAgICAgICAgICBzbWV0cmFuc2FjdGlvbklkOworICAgIHRQb3dlcmRCbSAgICAgICAgICAgbG9jYWxQb3dlckNvbnN0cmFpbnQgPSAwLCByZWdNYXggPSAwOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIC8vTm90IHNlbmRpbmcgYW55IHNlc3Npb24sIHNpbmNlIGl0IGlzIG5vdCBjcmVhdGVkIHlldC4gVGhlIHJlc3BvbnNlIHdob3VsZCBoYXZlIGNvcnJlY3Qgc3RhdGUuCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19KT0lOX1JFUV9FVkVOVCwgTlVMTCwgMCwgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBTTUVfSk9JTl9SRVFcbiIpKTspCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgLyogTmVlZCB0byByZWFkIHRoZSBDRkcgaGVyZSBpdHNlbGYgYXMgdGhpcyBpcyB1c2VkIGluIGxpbUV4dHJhY3RBUENhcGFiaWxpdHkoKSBiZWxvdy4KKyAgICAqIFRoaXMgQ0ZHIGlzIGFjdHVhbGx5IHJlYWQgaW4gcnJtVXBkYXRlQ29uZmlnKCkgd2hpY2ggaXMgY2FsbGVkIGxhdGVyLiBCZWNhdXNlIHRoaXMgaXMgbm90CisgICAgKiByZWFkLCBSUk0gcmVsYXRlZCBwYXRoIGJlZm9yZSBjYWxsaW5nIHJybVVwZGF0ZUNvbmZpZygpIGlzIG5vdCBnZXR0aW5nIGV4ZWN1dGVkIGNhdXNpbmcgaXNzdWVzIAorICAgICogbGlrZSBub3QgaG9ub3JpbmcgcG93ZXIgY29uc3RyYWludCBvbiAxc3QgYXNzb2NpYXRpb24gYWZ0ZXIgZHJpdmVyIGxvYWRpbmcuICovCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUlJNX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IHJybSBlbmFibGVkIGZhaWxlZFxuIikpOworICAgIHBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlID0gKHZhbCkgPyAxIDogMDsKKyAgICB2YWwgPSAwOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRkkgKi8KKworICAgLyoqCisgICAgICogRXhwZWN0IEpvaW4gcmVxdWVzdCBpbiBpZGxlIHN0YXRlLgorICAgICAqIFJlYXNzb2NpYXRlIHJlcXVlc3QgaXMgZXhwZWN0ZWQgaW4gbGluayBlc3RhYmxpc2hlZCBzdGF0ZS4KKyAgICAgKi8KKyAgICAKKyAgICAvKiBHbG9iYWwgU01FIGFuZCBMSU0gc3RhdGVzIGFyZSBub3QgZGVmaW5lZCB5ZXQgZm9yIEJULUFNUCBTdXBwb3J0ICovCisgICAgaWYocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9JRExFX1NUQVRFKQorICAgIHsKKyAgICAgICAgblNpemUgPSBfX2xpbUdldFNtZUpvaW5SZXFTaXplRm9yQWxsb2MoKHRBTklfVTgqKSBwTXNnQnVmKTsKKyAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU21lSm9pblJlcSwgblNpemUpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBwU21lSm9pblJlcVxuIikpOworICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBTbWVKb2luUmVxLCBuU2l6ZSk7CisgCisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICAgICAgaGFuZGxlSFRDYXBhYmlsaXR5YW5kSFRJbmZvKHBNYWMpOworI2VuZGlmCisgICAgICAgIGlmICgobGltSm9pblJlcVNlckRlcyhwTWFjLCBwU21lSm9pblJlcSwgKHRBTklfVTggKilwTXNnQnVmKSA9PSBlU0lSX0ZBSUxVUkUpIHx8CisgICAgICAgICAgICAgICAgKCFsaW1Jc1NtZUpvaW5SZXFWYWxpZChwTWFjLCBwU21lSm9pblJlcSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLy8gUmVjZWl2ZWQgaW52YWxpZCBlV05JX1NNRV9KT0lOX1JFUQorICAgICAgICAgICAgLy8gTG9nIHRoZSBldmVudAorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJyZWNlaXZlZCBTTUVfSk9JTl9SRVEgd2l0aCBpbnZhbGlkIGRhdGFcbiIpKTsKKyAgICAgICAgICAgIHJldENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vcE1hYy0+bGltLmdwTGltSm9pblJlcSA9IHBTbWVKb2luUmVxOyBUTyBTVVBQT1JUIEJULUFNUCAscmV2aWV3IG9zIHNlcCAyMworCisgICAgICAgIC8qIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIHN0YXJ0IEJTUyBzZXNzaW9uICAqLworI2lmZGVmIEZJWE1FX0dFTjYgICAgCisgICAgICAgIGlmKHBTbWVKb2luUmVxLT5ic3N0eXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocGVWYWxpZGF0ZUJ0Sm9pblJlcXVlc3QocE1hYykhPSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiU3RhcnQgQnNzIHNlc3Npb24gbm90IHByZXNlbnQ6OlNNRV9KT0lOX1JFUSBpbiB1bmV4cGVjdGVkIHN0YXRlXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFOworICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnkgPSBOVUxMOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOyAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorI2VuZGlmCisKKworICAgICAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMscFNtZUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmJzc0lkLCZzZXNzaW9uSWQpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNlc3Npb24gQWxyZWFkeSBleGlzdHMgZm9yIGdpdmVuIEJTU0lEXG4iKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX0xJTktfRVNUX1NUQVRFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFJlY2VpdmVkIGVXTklfU01FX0pPSU5fUkVRIGZvciBzYW1lCisgICAgICAgICAgICAgICAgLy8gQlNTIGFzIGN1cnJlbnRseSBhc3NvY2lhdGVkLgorICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgZXZlbnQgYW5kIHNlbmQgc3VjY2VzcworICAgICAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIlJlY2VpdmVkIFNNRV9KT0lOX1JFUSBmb3IgY3VycmVudGx5IGpvaW5lZCBCU1NcbiIpKTspCisgICAgICAgICAgICAgICAgLy8vIFNlbmQgSm9pbiBzdWNjZXNzIHJlc3BvbnNlIHRvIGhvc3QKKyAgICAgICAgICAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfUkVGVVNFRDsKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0gICAgCisgICAgICAgIH0gICAgCisgICAgICAgIGVsc2UgICAgICAgLyogU2Vzc2lvbiBFbnRyeSBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gQlNTSWQgKi8KKyAgICAgICAgeyAgICAgICAKKyAgICAgICAgICAgIC8qIFRyeSB0byBDcmVhdGUgYSBuZXcgc2Vzc2lvbiAqLworICAgICAgICAgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUNyZWF0ZVNlc3Npb24ocE1hYyxwU21lSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uYnNzSWQsJnNlc3Npb25JZCwgcE1hYy0+bGltLm1heFN0YXRpb24pKSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU2Vzc2lvbiBDYW4gbm90IGJlIGNyZWF0ZWQgXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgIAorICAgICAgICAKKyAgICAgICAgLyogU3RvcmUgU2Vzc2lvbiByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgLyogU3RvcmUgUEUgc2Vzc2lvbiBJZCBpbiBzZXNzaW9uIFRhYmxlICovCisgICAgICAgIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkID0gc2Vzc2lvbklkOworCisgICAgICAgIC8qIHN0b3JlIHRoZSBzbWVqb2luIHJlcSBoYW5kbGUgaW4gc2Vzc2lvbiB0YWJsZSAqLworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcSA9IHBTbWVKb2luUmVxOworICAgICAgICAKKyAgICAgICAgLyogU3RvcmUgU01FIHNlc3Npb24gSWQgaW4gc2Vzc2lvblRhYmxlICovCisgICAgICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCA9IHBTbWVKb2luUmVxLT5zZXNzaW9uSWQ7CisKKyAgICAgICAgLyogU3RvcmUgU01FIHRyYW5zYWN0aW9uIElkIGluIHNlc3Npb24gVGFibGUgKi8KKyAgICAgICAgcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCA9IHBTbWVKb2luUmVxLT50cmFuc2FjdGlvbklkOworCisgICAgICAgIC8qIFN0b3JlIGJlYWNvbkludGVydmFsICovCisgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbCA9IHBTbWVKb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5iZWFjb25JbnRlcnZhbDsKKworICAgICAgICAvKiBDb3B5aW5nIG9mIGJzc0lkIGlzIGFscmVhZHkgZG9uZSwgd2hpbGUgY3JlYXRpbmcgc2Vzc2lvbiAqLworICAgICAgICAvL3NpckNvcHlNYWNBZGRyKHBzZXNzaW9uRW50cnktPmJzc0lkLHBTbWVKb2luUmVxLT5ic3NJZCk7CisgICAgICAgIHNpckNvcHlNYWNBZGRyKHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLHBTbWVKb2luUmVxLT5zZWxmTWFjQWRkcik7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc1R5cGUgPSBwU21lSm9pblJlcS0+YnNzdHlwZTsKKworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zdGF0eXBlRm9yQnNzID0gU1RBX0VOVFJZX1BFRVI7CisKKyAgICAgICAgLyogQ29weSB0aGUgZG90IDExIG1vZGUgaW4gdG8gdGhlIHNlc3Npb24gdGFibGUgKi8KKworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUgID0gcFNtZUpvaW5SZXEtPmRvdDExbW9kZTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bndUeXBlID0gcFNtZUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLm53VHlwZTsKKworICAgICAgICAvKlBoeSBtb2RlKi8KKyAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbVBoeU1vZGUgPSBwU21lSm9pblJlcS0+YnNzRGVzY3JpcHRpb24ubndUeXBlOworCisgICAgICAgIC8qIENvcHkgVGhlIGNoYW5uZWwgSWQgdG8gdGhlIHNlc3Npb24gVGFibGUgKi8KKyAgICAgICAgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsID0gcFNtZUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmNoYW5uZWxJZDsKKworCisgICAgICAgIC8qU3RvcmUgUGVyc29uYSAqLworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPSBwU21lSm9pblJlcS0+c3RhUGVyc29uYTsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfUEUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgRkwoIlBFIFBFUlNPTkE9JWQiKSwgcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hKTsKKyAgICAgICAgCisgICAgICAgIC8qIENvcHkgdGhlIFNTSUQgZnJvbSBzbWVqb2lucmVxIHRvIHNlc3Npb24gZW50cnkgICovICAKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+c3NJZC5sZW5ndGggPSBwU21lSm9pblJlcS0+c3NJZC5sZW5ndGg7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQscHNlc3Npb25FbnRyeS0+c3NJZC5zc0lkLHBTbWVKb2luUmVxLT5zc0lkLnNzSWQscHNlc3Npb25FbnRyeS0+c3NJZC5sZW5ndGgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDb3B5IHRoZSBTU0lEIGZyb20gc21lam9pbnJlcSB0byBzZXNzaW9uIGVudHJ5ICAqLyAgCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc0lkLmxlbmd0aCA9IHBTbWVKb2luUmVxLT5zc0lkLmxlbmd0aDsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQscHNlc3Npb25FbnRyeS0+c3NJZC5zc0lkLHBTbWVKb2luUmVxLT5zc0lkLnNzSWQscHNlc3Npb25FbnRyeS0+c3NJZC5sZW5ndGgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBEZXRlcm1pbiAxMXIgb3IgQ0NYIGNvbm5lY3Rpb24gYmFzZWQgb24gaW5wdXQgZnJvbSBTTUUKKyAgICAgICAgICAgIC8vIHdoaWNoIGludHVybiBpcyBkZXBlbmRlbnQgb24gdGhlIHByb2ZpbGUgdGhlIHVzZXIgd2FudHMgdG8gY29ubmVjdAorICAgICAgICAgICAgLy8gdG8sIFNvIGlucHV0IGlzIGNvbWluZyBmcm9tIHN1cHBsaWNhbnQKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aXMxMVJjb25uZWN0aW9uID0gcFNtZUpvaW5SZXEtPmlzMTFSY29ubmVjdGlvbjsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmlzQ0NYY29ubmVjdGlvbiA9IHBTbWVKb2luUmVxLT5pc0NDWGNvbm5lY3Rpb247CisjZW5kaWYKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSIHx8IGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQgPSBwU21lSm9pblJlcS0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQ7CisjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+YnNzVHlwZSA9PSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9IGVMSU1fU1RBX1JPTEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHBzZXNzaW9uRW50cnktPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9BUF9NT0RFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPSBlTElNX0JUX0FNUF9TVEFfUk9MRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAKKyAgICAgICAgICAgICAgICAvKiBUaHJvdyBhbiBlcnJvciBhbmQgcmV0dXJuIGFuZCBtYWtlIHN1cmUgdG8gZGVsZXRlIHRoZSBzZXNzaW9uLiovCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJyZWNlaXZlZCBTTUVfSk9JTl9SRVEgd2l0aCBpbnZhbGlkIGJzcyB0eXBlXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0gICAgCisKKyAgICAgICAgaWYocFNtZUpvaW5SZXEtPmFkZElFU2Nhbi5sZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5hZGRJRVNjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwU21lSm9pblJlcS0+YWRkSUVTY2FuLCBzaXplb2YodFNpckFkZGllKSk7CisgICAgICAgIH0KKworICAgICAgICBpZihwU21lSm9pblJlcS0+YWRkSUVBc3NvYy5sZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5hZGRJRUFzc29jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNtZUpvaW5SZXEtPmFkZElFQXNzb2MsIHNpemVvZih0U2lyQWRkaWUpKTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorCisgICAgICAgIHZhbCA9IHNpemVvZih0TGltTWxtSm9pblJlcSkgKyBzaXplb2YodFNpck1hY1NTaWRJRSkgKworICAgICAgICAgICAgICBzaXplb2YodFNpck1hY1JhdGVTZXRJRSkgKyBzaXplb2YodFNpck1hY0RzUGFyYW1TZXRJRSk7CisjZWxzZQorICAgICAgICB2YWwgPSBzaXplb2YodExpbU1sbUpvaW5SZXEpICsgcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmxlbmd0aCArIDI7CisjZW5kaWYKKyAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTWxtSm9pblJlcSwgdmFsKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgbWxtSm9pblJlcVxuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBNbG1Kb2luUmVxLCB2YWwpOworCisgICAgICAgIC8qIFBFIFNlc3Npb25JZCBpcyBzdG9yZWQgYXMgYSBwYXJ0IG9mIEpvaW5SZXEqLworICAgICAgICBwTWxtSm9pblJlcS0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisgICAgICAgIAorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVCwgKHRBTklfVTMyICopICZwTWxtSm9pblJlcS0+am9pbkZhaWx1cmVUaW1lb3V0KQorICAgICAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgSm9pbkZhaWx1cmVUaW1lciB2YWx1ZVxuIikpOworCisgICAgICAgIC8qIGNvcHkgb3BlcmF0aW9uYWwgcmF0ZSBmcm9tIHBzZXNzaW9uRW50cnkqLworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKikmcHNlc3Npb25FbnRyeS0+cmF0ZVNldCwgKHZvaWQqKSZwU21lSm9pblJlcS0+b3BlcmF0aW9uYWxSYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjUmF0ZVNldCkpOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKikmcHNlc3Npb25FbnRyeS0+ZXh0UmF0ZVNldCwgKHZvaWQqKSZwU21lSm9pblJlcS0+ZXh0ZW5kZWRSYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjUmF0ZVNldCkpOworICAgICAgICAvL3RoaXMgbWF5IG5vdCBiZSBuZWVkZWQgYW55bW9yZSBub3csIGFzIHJhdGVTZXQgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBzZXNzaW9uIGVudHJ5IGFuZCBNTE0gaGFzIHNlc3Npb24gY29udGV4dC4KKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopJnBNbG1Kb2luUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQsICh2b2lkKikmcHNlc3Npb25FbnRyeS0+cmF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjUmF0ZVNldCkpOworCisgICAgICAgIHBzZXNzaW9uRW50cnktPmVuY3J5cHRUeXBlID0gcFNtZUpvaW5SZXEtPlVDRW5jcnlwdGlvblR5cGU7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTWxtSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uYnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbUpvaW5SZXEtPm5laWdoYm9yQnNzTGlzdC5ic3NMaXN0WzBdLmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgCisgICAgICAgIHBNbG1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5jYXBhYmlsaXR5SW5mbyA9IDE7CisgICAgICAgICAgIAorICAgICAgICBwTWxtSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uYW5pSW5kaWNhdG9yID0KKyAgICAgICAgICAgICAgKHRBTklfVTgpIHBNYWMtPmxpbS5ncExpbUpvaW5SZXEtPm5laWdoYm9yQnNzTGlzdC5ic3NMaXN0WzBdLnduaUluZGljYXRvcjsKKyAgICAgICAgICAgICAgCisgICAgICAgIHBNbG1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5ud1R5cGUgPQorICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltSm9pblJlcS0+bmVpZ2hib3JCc3NMaXN0LmJzc0xpc3RbMF0ubndUeXBlOworCisgICAgICAgIHBNbG1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5jaGFubmVsSWQgPQorICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltSm9pblJlcS0+bmVpZ2hib3JCc3NMaXN0LmJzc0xpc3RbMF0uY2hhbm5lbElkOworCisgICAgICAgICAgICBsaW1Db3B5TmVpZ2hib3JJbmZvVG9DZmcocE1hYywKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1Kb2luUmVxLT5uZWlnaGJvckJzc0xpc3QuYnNzTGlzdFswXSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1DdXJyZW50QnNzSWQsCisgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1Kb2luUmVxLT5uZWlnaGJvckJzc0xpc3QuYnNzTGlzdFswXS5ic3NJZCwKKyAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgICAgIHBNYWMtPmxpbS5nTGltQ3VycmVudENoYW5uZWxJZCA9CisgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1Kb2luUmVxLT5uZWlnaGJvckJzc0xpc3QuYnNzTGlzdFswXS5jaGFubmVsSWQ7CisKKyAgICAgICAgcE1hYy0+bGltLmdMaW1DdXJyZW50QnNzQ2FwcyA9CisgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1Kb2luUmVxLT5uZWlnaGJvckJzc0xpc3QuYnNzTGlzdFswXS5jYXBhYmlsaXR5SW5mbzsKKworICAgICAgICBwTWFjLT5saW0uZ0xpbUN1cnJlbnRUaXRhbkh0Q2FwcyA9CisgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltSm9pblJlcS0+bmVpZ2hib3JCc3NMaXN0LmJzc0xpc3RbMF0udGl0YW5IdENhcHM7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICh0QU5JX1U4ICopICZwTWFjLT5saW0uZ0xpbUN1cnJlbnRTU0lELAorICAgICAgICAgKHRBTklfVTggKikgJnBNYWMtPmxpbS5ncExpbUpvaW5SZXEtPm5laWdoYm9yQnNzTGlzdC5ic3NMaXN0WzBdLnNzSWQsCisgICAgICAgIHBNYWMtPmxpbS5ncExpbUpvaW5SZXEtPm5laWdoYm9yQnNzTGlzdC5ic3NMaXN0WzBdLnNzSWQubGVuZ3RoKzEpOworI2Vsc2UKKyAgICAgICAgcE1sbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmxlbmd0aCA9IHBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGg7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgKHRBTklfVTggKikgJnBNbG1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwKKyAgICAgICAgICAgKHRBTklfVTggKikgJnBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwKKyAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLmxlbmd0aCArIDIpOworCisjaWYgMAorCisgICAgICAgIHBNYWMtPmxpbS5nTGltQ3VycmVudENoYW5uZWxJZCA9CisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5jaGFubmVsSWQ7CisjZW5kaWYgLy9vY3QgOXRoIHJldmlldyByZW1vdmUgZ2xvYmFscworCisgICAgICAgIAorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QnNzQ2FwcyA9CisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uY2FwYWJpbGl0eUluZm87CisgICAgICAgIAorCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRUaXRhbkh0Q2Fwcz0KKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+YnNzRGVzY3JpcHRpb24udGl0YW5IdENhcHM7CisKKyAgICAgICAgICAgIHJlZ01heCA9IGNmZ0dldFJlZ3VsYXRvcnlNYXhUcmFuc21pdFBvd2VyKCBwTWFjLCBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwgKTsgCisgICAgICAgICAgICBsb2NhbFBvd2VyQ29uc3RyYWludCA9IHJlZ01heDsKKyAgICAgICAgICAgIGxpbUV4dHJhY3RBcENhcGFiaWxpdHkoIHBNYWMsCisgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uaWVGaWVsZHMsCisgICAgICAgICAgICAgICBsaW1HZXRJRWxlbkZyb21Cc3NEZXNjcmlwdGlvbigmcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uKSwKKyAgICAgICAgICAgICAgICZwc2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QnNzUW9zQ2FwcywKKyAgICAgICAgICAgICAgICZwc2Vzc2lvbkVudHJ5LT5saW1DdXJyZW50QnNzUHJvcENhcCwKKyAgICAgICAgICAgICAgICZwTWFjLT5saW0uZ0xpbUN1cnJlbnRCc3NVYXBzZCAvL1RCRC1SQUpFU0ggIG1ha2UgZ0xpbUN1cnJlbnRCc3NVYXBzZCB0aGlzIHNlc3Npb24gc3BlY2lmaWMKKyAgICAgICAgICAgICAgICwgJmxvY2FsUG93ZXJDb25zdHJhaW50CisgICAgICAgICAgICAgICApOyAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyID0gbGltR2V0TWF4VHhQb3dlcihyZWdNYXgsIGxvY2FsUG93ZXJDb25zdHJhaW50KTsKKyNlbHNlCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyID0gVk9TX01JTiggcmVnTWF4ICwgKGxvY2FsUG93ZXJDb25zdHJhaW50KSApOworI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsICJSZWd1bGF0b3J5IG1heCA9ICVkLCBsb2NhbCBwb3dlciBjb25zdHJhaW50ID0gJWQsIG1heCB0eCA9ICVkIiwgcmVnTWF4LCBsb2NhbFBvd2VyQ29uc3RyYWludCwgcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciApOworI2VuZGlmCisKKyAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltQ3VycmVudEJzc1VhcHNkKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5saW0uZ1VhcHNkUGVyQWNCaXRtYXNrID0gcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPnVhcHNkUGVyQWNCaXRtYXNrOworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0cxLCBGTCgiVUFQU0QgZmxhZyBmb3IgYWxsIEFDIC0gMHglMnhcbiIpLCBwTWFjLT5saW0uZ1VhcHNkUGVyQWNCaXRtYXNrKTsKKworICAgICAgICAgICAgLy8gcmVzZXR0aW5nIHRoZSBkeW5hbWljIHVhcHNkIG1hc2sgCisgICAgICAgICAgICBwTWFjLT5saW0uZ1VhcHNkUGVyQWNEZWxpdmVyeUVuYWJsZU1hc2sgPSAwOworICAgICAgICAgICAgcE1hYy0+bGltLmdVYXBzZFBlckFjVHJpZ2dlckVuYWJsZU1hc2sgPSAwOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1SRkJhbmQgPSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKTsKKworICAgICAgICAvLyBJbml0aWFsaXplIDExaCBFbmFibGUgRmxhZworICAgICAgICBpZihTSVJfQkFORF81X0dIWiA9PSBwc2Vzc2lvbkVudHJ5LT5saW1SRkJhbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHXzExSF9FTkFCTEVELCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsIHRvIGdldCBXTklfQ0ZHXzExSF9FTkFCTEVEIFxuIikpOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltMTFoRW5hYmxlID0gdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbTExaEVuYWJsZSA9IDA7CisgICAgICAgIAorICAgICAgICAvL1RvIGNhcmUgb2YgdGhlIHNjZW5hcmlvIHdoZW4gU1RBIHRyYW5zaXRpb25zIGZyb20gSUJTUyB0byBJbmZyYXN0cnVjdHVyZSBtb2RlLgorICAgICAgICBwTWFjLT5saW0uZ0xpbUlic3NDb2FsZXNjaW5nSGFwcGVuZWQgPSBmYWxzZTsKKworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1QcmV2U21lU3RhdGUgPSBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPSBlTElNX1NNRV9XVF9KT0lOX1NUQVRFOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUUgSm9pblJlcTogU1NJRCAlZC4lYyVjJWMlYyVjJWNcbiIpLAorICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+c3NJZC5sZW5ndGgsCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWRbMF0sCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWRbMV0sCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWRbMl0sCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWRbM10sCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWRbNF0sCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc0lkLnNzSWRbNV0pOworICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkNoYW5uZWwgJWQsIEJTU0lEICV4OiV4OiV4OiV4OiV4OiV4XG4iKSwKKyAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwKKyAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzBdLAorICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YnNzSWRbMV0sCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZFsyXSwKKyAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJzc0lkWzNdLAorICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YnNzSWRbNF0sCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZFs1XSk7KQorCisgICAgICAgIC8qIEluZGljYXRlIHdoZXRoZXIgc3BlY3RydW0gbWFuYWdlbWVudCBpcyBlbmFibGVkKi8KKyAgICAgICAgcHNlc3Npb25FbnRyeS0+c3BlY3RydW1NZ3RFbmFibGVkID0gCisgICAgICAgICAgIHBTbWVKb2luUmVxLT5zcGVjdHJ1bU1ndEluZGljYXRvcjsKKyAgICAgICAgLyogSXNzdWUgTElNX01MTV9KT0lOX1JFUSB0byBNTE0gKi8KKyAgICAgICAgbGltUG9zdE1sbU1lc3NhZ2UocE1hYywgTElNX01MTV9KT0lOX1JFUSwgKHRBTklfVTMyICopIHBNbG1Kb2luUmVxKTsKKyAgICAgICAgcmV0dXJuOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFJlY2VpdmVkIGVXTklfU01FX0pPSU5fUkVRIHVuIGV4cGVjdGVkIHN0YXRlICovCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBTTUVfSk9JTl9SRVEgaW4gc3RhdGUgJVhcbiIpLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTsKKyAgICAgICAgbGltUHJpbnRTbWVTdGF0ZShwTWFjLCBMT0dFLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTsKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFOworICAgICAgICBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgICAgIAorICAgIH0KKworZW5kOgorICAgIGxpbUdldFNlc3Npb25JbmZvKHBNYWMsKHRBTklfVTgqKXBNc2dCdWYsJnNtZXNlc3Npb25JZCwmc21ldHJhbnNhY3Rpb25JZCk7IAorICAgIAorICAgIGlmKHBTbWVKb2luUmVxKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcFNtZUpvaW5SZXEpOworICAgICAgICBwU21lSm9pblJlcSA9IE5VTEw7CisgICAgICAgIGlmIChOVUxMICE9IHBzZXNzaW9uRW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZihyZXRDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgeworICAgICAgICBpZihOVUxMICE9IHBzZXNzaW9uRW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBlRGVsZXRlU2Vzc2lvbihwTWFjLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgbGltU2VuZFNtZUpvaW5SZWFzc29jUnNwKHBNYWMsIGVXTklfU01FX0pPSU5fUlNQLCByZXRDb2RlLCBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMscHNlc3Npb25FbnRyeSxzbWVzZXNzaW9uSWQsc21ldHJhbnNhY3Rpb25JZCk7Cit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZUpvaW5SZXEoKSAqKiovCisKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKK3RBTklfVTggbGltR2V0TWF4VHhQb3dlcih0UG93ZXJkQm0gcmVnTWF4LCB0UG93ZXJkQm0gYXBUeFBvd2VyKQoreworICAgIHRBTklfVTggbWF4VHhQb3dlciA9IDA7CisgICAgdEFOSV9VOCB0eFBvd2VyID0gVk9TX01JTiggcmVnTWF4ICwgKGFwVHhQb3dlcikgKTsKKyAgICBpZigodHhQb3dlciA+PSBNSU5fVFhfUFdSX0NBUCkgJiYgKHR4UG93ZXIgPD0gTUFYX1RYX1BXUl9DQVApKQorICAgICAgICBtYXhUeFBvd2VyID0gIHR4UG93ZXI7CisgICAgZWxzZSBpZiAodHhQb3dlciA8IE1JTl9UWF9QV1JfQ0FQKQorICAgICAgICBtYXhUeFBvd2VyID0gTUlOX1RYX1BXUl9DQVA7CisgICAgZWxzZQorICAgICAgICBtYXhUeFBvd2VyID0gTUFYX1RYX1BXUl9DQVA7CisKKyAgICByZXR1cm4gKG1heFR4UG93ZXIpOworfQorI2VuZGlmCisKKworI2lmIDAKKy8qKgorICogX19saW1Qcm9jZXNzU21lQXV0aFJlcSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgU01FX0FVVEhfUkVRIG1lc3NhZ2UKKyAqIGZyb20gSEREIG9yIHVwcGVyIGxheWVyIGFwcGxpY2F0aW9uLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NTbWVBdXRoUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworCisgICAgdEFuaUF1dGhUeXBlICAgICAgIGF1dGhNb2RlOworICAgIHRMaW1NbG1BdXRoUmVxICAgICAqcE1sbUF1dGhSZXE7CisgICAgdHBTaXJTbWVBdXRoUmVxICAgIHBTaXJTbWVBdXRoUmVxOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICByZXRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgcHNlc3Npb25FbnRyeTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgc2Vzc2lvbklkOworCisgICAgCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMXG4iKSk7CisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwU2lyU21lQXV0aFJlcSA9ICh0cFNpclNtZUF1dGhSZXEpIHBNc2dCdWY7CisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMscFNpclNtZUF1dGhSZXEtPmJzc0lkLCZzZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gQnNzSWRcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbGltSXNTbWVBdXRoUmVxVmFsaWQocFNpclNtZUF1dGhSZXEpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgaW52YWxpZCBTTUVfQVVUSF9SRVEgbWVzc2FnZVxuIikpOworCisgICAgICAgIC8vLyBTZW5kIEFVVEggZmFpbHVyZSByZXNwb25zZSB0byBob3N0CisgICAgICAgIHJldENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgRkwoIlJFQ0VJVkVEIEFVVEhfUkVRXG4iKSk7KQorCisgICAgLyoqCisgICAgICogRXhwZWN0IEF1dGggcmVxdWVzdCBmb3IgU1RBIGluIGxpbmsgZXN0YWJsaXNoZWQgc3RhdGUKKyAgICAgKiBvciBTVEEgaW4gSUJTUyBtb2RlIGluIG5vcm1hbCBzdGF0ZS4KKyAgICAgKi8KKworICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpIHx8CisgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEUpIHx8CisgICAgICAgICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpICYmCisgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKSkpCisgICAgeworICAgICAgICBpZiAocFNpclNtZUF1dGhSZXEtPmF1dGhUeXBlID09IGVTSVJfQVVUT19TV0lUQ0gpCisgICAgICAgICAgICBhdXRoTW9kZSA9IGVTSVJfU0hBUkVEX0tFWTsgLy8gVHJ5IFNoYXJlZCBLZXkgZmlyc3QKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXV0aE1vZGUgPSBwU2lyU21lQXV0aFJlcS0+YXV0aFR5cGU7CisKKyAgICAgICAgLy8gVHJpZ2dlciBNQUMgYmFzZWQgQXV0aGVudGljYXRpb24KKyAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTWxtQXV0aFJlcSwgc2l6ZW9mKHRMaW1NbG1BdXRoUmVxKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1BdXRoUmVxXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBwTWFjLT5saW0uZ0xpbVByZUF1dGhUeXBlID0gcFNpclNtZUF1dGhSZXEtPmF1dGhUeXBlOworCisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAgICAgPSBlTElNX1NNRV9XVF9QUkVfQVVUSF9TVEFURTsKKyAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisKKyAgICAgICAgLy8gU3RvcmUgY2hhbm5lbCBzcGVjaWZpZWQgaW4gYXV0aCByZXF1ZXN0LgorICAgICAgICAvLyBUaGlzIHdpbGwgYmUgcHJvZ3JhbW1lZCBsYXRlciBieSBNTE0uCisgICAgICAgIHBNYWMtPmxpbS5nTGltUHJlQXV0aENoYW5uZWxOdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRTaXJNYWNDaGFuTnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpclNtZUF1dGhSZXEtPmNoYW5uZWxOdW1iZXI7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBNYWMtPmxpbS5nTGltUHJlQXV0aFBlZXJBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwU2lyU21lQXV0aFJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBNbG1BdXRoUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcFNpclNtZUF1dGhSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgICAgIHBNbG1BdXRoUmVxLT5hdXRoVHlwZSA9IGF1dGhNb2RlOworICAgICAgICAKKyAgICAgICAgLyogVXBkYXRlIFBFIHNlc3Npb24gIElkICovCisgICAgICAgIHBNbG1BdXRoUmVxLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQVVUSEVOVElDQVRFX0ZBSUxVUkVfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJnBNbG1BdXRoUmVxLT5hdXRoRmFpbHVyZVRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENvdWxkIG5vdCBnZXQgQXV0aEZhaWx1cmVUaW1lb3V0IHZhbHVlIGZyb20gQ0ZHLgorICAgICAgICAgICAgICogTG9nIGVycm9yLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEF1dGhGYWlsdXJlVGltZW91dCB2YWx1ZVxuIikpOworICAgICAgICB9CisKKyAgICAgICAgbGltUG9zdE1sbU1lc3NhZ2UocE1hYywgTElNX01MTV9BVVRIX1JFUSwgKHRBTklfVTMyICopIHBNbG1BdXRoUmVxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLy8gU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIGVXTklfU01FX0FVVEhfUkVRCisgICAgICAgIC8vIExvZyB0aGUgZXZlbnQKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBTTUVfQVVUSF9SRVEgaW4gc3RhdGUgJVhcbiIpLHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTsKKyAgICAgICAgbGltUHJpbnRTbWVTdGF0ZShwTWFjLCBMT0dFLCBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSk7CisKKyAgICAgICAgLy8vIFNlbmQgQVVUSCBmYWlsdXJlIHJlc3BvbnNlIHRvIGhvc3QKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKK2VuZDoKKyAgICBsaW1TZW5kU21lQXV0aFJzcChwTWFjLCByZXRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgIHBTaXJTbWVBdXRoUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBwU2lyU21lQXV0aFJlcS0+YXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTICk7CisKK30gLyoqKiBlbmQgX19saW1Qcm9jZXNzU21lQXV0aFJlcSgpICoqKi8KKyNlbmRpZgorCisKKy8qKgorICogX19saW1Qcm9jZXNzU21lUmVhc3NvY1JlcSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgU01FX1JFQVNTT0NfUkVRIG1lc3NhZ2UKKyAqIGZyb20gSEREIG9yIHVwcGVyIGxheWVyIGFwcGxpY2F0aW9uLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NTbWVSZWFzc29jUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGNhcHM7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgdmFsOworICAgIHRwU2lyU21lUmVhc3NvY1JlcSBwUmVhc3NvY1JlcSA9IE5VTEw7CisgICAgdExpbU1sbVJlYXNzb2NSZXEgICpwTWxtUmVhc3NvY1JlcTsKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgcmV0Q29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgdHBQRVNlc3Npb24gICAgICAgIHBzZXNzaW9uRW50cnkgPSBOVUxMOworICAgIHRBTklfVTggICAgICAgICAgICBzZXNzaW9uSWQ7IAorICAgIHRBTklfVTggICAgICAgICAgICBzbWVTZXNzaW9uSWQ7IAorICAgIHRBTklfVTE2ICAgICAgICAgICB0cmFuc2FjdGlvbklkOyAKKyAgICB0UG93ZXJkQm0gICAgICAgICAgICBsb2NhbFBvd2VyQ29uc3RyYWludCA9IDAsIHJlZ01heCA9IDA7CisgICAgdEFOSV9VMzIgICAgICAgICAgIHRlbGVCY25FbiA9IDA7CisKKworICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIlJlY2VpdmVkIFJFQVNTT0NfUkVRXG4iKSk7KQorICAgIAorCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwUmVhc3NvY1JlcSwgX19saW1HZXRTbWVKb2luUmVxU2l6ZUZvckFsbG9jKCh0QU5JX1U4ICopIHBNc2dCdWYpKSkKKyAgICB7CisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcFJlYXNzb2NSZXFcbiIpKTsKKworICAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgCisKKyAgICBpZiAoKGxpbUpvaW5SZXFTZXJEZXMocE1hYywgKHRwU2lyU21lSm9pblJlcSkgcFJlYXNzb2NSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBNc2dCdWYpID09IGVTSVJfRkFJTFVSRSkgfHwKKyAgICAgICAgKCFsaW1Jc1NtZUpvaW5SZXFWYWxpZChwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cFNpclNtZUpvaW5SZXEpIHBSZWFzc29jUmVxKSkpCisgICAgeworICAgICAgICAvLy8gUmVjZWl2ZWQgaW52YWxpZCBlV05JX1NNRV9SRUFTU09DX1JFUQorICAgICAgICAvLyBMb2cgdGhlIGV2ZW50CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIFNNRV9SRUFTU09DX1JFUSB3aXRoIGludmFsaWQgZGF0YVxuIikpOworCisgICAgICAgIHJldENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLHBSZWFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwmc2Vzc2lvbklkKSk9PU5VTEwpCisgICAgeworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcFJlYXNzb2NSZXEtPmJzc0Rlc2NyaXB0aW9uLmJzc0lkLCBMT0dFKTsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZFxuIikpOworICAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19SRUFTU09DX1JFUV9FVkVOVCwgcHNlc3Npb25FbnRyeSwgMCwgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgLy9wTWFjLT5saW0uZ3BMaW1SZWFzc29jUmVxID0gcFJlYXNzb2NSZXE7Ly9UTyBTVVBQT1JUIEJULUFNUAorCisgICAgLyogU3RvcmUgdGhlIHJlYXNzb2MgaGFuZGxlIGluIHRoZSBzZXNzaW9uIFRhYmxlLi4gMjNyZCBzZXAgcmV2aWV3ICovCisgICAgcHNlc3Npb25FbnRyeS0+cExpbVJlQXNzb2NSZXEgPSBwUmVhc3NvY1JlcTsKKworICAgIC8qKgorICAgICAqIFJlYXNzb2NpYXRlIHJlcXVlc3QgaXMgZXhwZWN0ZWQKKyAgICAgKiBpbiBsaW5rIGVzdGFibGlzaGVkIHN0YXRlIG9ubHkuCisgICAgICovCisKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpCisgICAgeworI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1heSBiZSBmcm9tIDExciBGVCBwcmUtYXV0aC4gU28gbGV0cyBjaGVjayBpdCBiZWZvcmUgd2UgYmFpbCBvdXQKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU2Vzc2lvbiBpbiByZWFzc29jIHN0YXRlIGlzICVkXG4iKSwgCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXRzIG91ciBwcmVhdXRoIGJzc2lkCisgICAgICAgICAgICBpZiAoIXBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCBwUmVhc3NvY1JlcS0+YnNzRGVzY3JpcHRpb24uYnNzSWQsIAorICAgICAgICAgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnByZUF1dGhic3NJZCwgNikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBSZWFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwgTE9HRSk7CisgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPnByZUF1dGhic3NJZCwgTE9HRSk7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJVbmtub3duIGJzc0lkIGluIHJlYXNzb2Mgc3RhdGVcbiIpKTsKKyAgICAgICAgICAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsaW1Qcm9jZXNzTWxtRlRSZWFzc29jUmVxKHBNYWMsIHBNc2dCdWYsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLy8vIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBlV05JX1NNRV9SRUFTU09DX1JFUQorICAgICAgICAvLyBMb2cgdGhlIGV2ZW50CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgU01FX1JFQVNTT0NfUkVRIGluIHN0YXRlICVYXG4iKSwKKyAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTsKKyAgICAgICAgbGltUHJpbnRTbWVTdGF0ZShwTWFjLCBMT0dFLCBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSk7CisKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIGxpbUNvcHlOZWlnaGJvckluZm9Ub0NmZyhwTWFjLAorICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+bmVpZ2hib3JCc3NMaXN0LmJzc0xpc3RbMF0sCisgICAgICAgIHBzZXNzaW9uRW50cnkpOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVJlYXNzb2NCc3NJZCwKKyAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+bmVpZ2hib3JCc3NMaXN0LmJzc0xpc3RbMF0uYnNzSWQsCisgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICBwTWFjLT5saW0uZ0xpbVJlYXNzb2NDaGFubmVsSWQgPQorICAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbVJlQXNzb2NSZXEtPm5laWdoYm9yQnNzTGlzdC5ic3NMaXN0WzBdLmNoYW5uZWxJZDsKKworICAgIHBNYWMtPmxpbS5nTGltUmVhc3NvY0Jzc0NhcHMgPQorICAgIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5uZWlnaGJvckJzc0xpc3QuYnNzTGlzdFswXS5jYXBhYmlsaXR5SW5mbzsKKworICAgIHBNYWMtPmxpbS5nTGltUmVhc3NvY1RpdGFuSHRDYXBzID0gCisgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5uZWlnaGJvckJzc0xpc3QuYnNzTGlzdFswXS50aXRhbkh0Q2FwczsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgKHRBTklfVTggKikgJnBNYWMtPmxpbS5nTGltUmVhc3NvY1NTSUQsCisgICAgKHRBTklfVTggKikgJnBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5uZWlnaGJvckJzc0xpc3QuYnNzTGlzdFswXS5zc0lkLAorICAgIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5uZWlnaGJvckJzc0xpc3QuYnNzTGlzdFswXS5zc0lkLmxlbmd0aCsxKTsKKyNlbHNlCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWQsCisgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbVJlQXNzb2NSZXEtPmJzc0Rlc2NyaXB0aW9uLmJzc0lkLAorICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0NoYW5uZWxJZCA9CisgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+YnNzRGVzY3JpcHRpb24uY2hhbm5lbElkOworCisgICAgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0Jzc0NhcHMgPQorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbi5jYXBhYmlsaXR5SW5mbzsKKworICAgIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NUaXRhbkh0Q2FwcyA9CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+YnNzRGVzY3JpcHRpb24udGl0YW5IdENhcHM7CisgICAgCisgICAgcmVnTWF4ID0gY2ZnR2V0UmVndWxhdG9yeU1heFRyYW5zbWl0UG93ZXIoIHBNYWMsIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCApOyAKKyAgICBsb2NhbFBvd2VyQ29uc3RyYWludCA9IHJlZ01heDsKKyAgICBsaW1FeHRyYWN0QXBDYXBhYmlsaXR5KCBwTWFjLAorICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+YnNzRGVzY3JpcHRpb24uaWVGaWVsZHMsCisgICAgICAgICAgICAgIGxpbUdldElFbGVuRnJvbUJzc0Rlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgJnBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5ic3NEZXNjcmlwdGlvbiksCisgICAgICAgICAgICAgICZwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUW9zQ2FwcywKKyAgICAgICAgICAgICAgJnBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NQcm9wQ2FwLAorICAgICAgICAgICAgICAmcE1hYy0+bGltLmdMaW1DdXJyZW50QnNzVWFwc2QgLy9UQkQtUkFKRVNIIG1ha2UgZ0xpbVJlYXNzb2NCc3NVYXBzZCBzZXNzaW9uIHNwZWNpZmljCisgICAgICAgICAgICAgICwgJmxvY2FsUG93ZXJDb25zdHJhaW50CisgICAgICAgICAgICAgICk7CisKKyAgICBwc2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyID0gVk9TX01JTiggcmVnTWF4ICwgKGxvY2FsUG93ZXJDb25zdHJhaW50KSApOworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgIlJlZ3VsYXRvcnkgbWF4ID0gJWQsIGxvY2FsIHBvd2VyIGNvbnN0cmFpbnQgPSAlZCwgbWF4IHR4ID0gJWQiLCByZWdNYXgsIGxvY2FsUG93ZXJDb25zdHJhaW50LCBwc2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyICk7CisjZW5kaWYKKyAgICB7CisgICAgI2lmIDAKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19TU0lELCBwTWFjLT5saW0uZ0xpbVJlYXNzb2NTU0lELnNzSWQsCisgICAgICAgICAgICAgICAgICAmY2ZnTGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCBTU0lEIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpdmUgU1NJRFxuIikpOworICAgIH0KKyAgICAjZW5kaWYvL1RPIFNVUFBPUlQgQlQtQU1QCisgICAgCisgICAgLyogQ29weSB0aGUgU1NJRCBmcm9tIHNlc3NpbyBlbnRyeSB0byBsb2NhbCB2YXJpYWJsZSAqLworICAgICNpZiAwCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1SZWFzc29jU1NJRC5zc0lkLAorICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnNzSWQuc3NJZCwKKyAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5zc0lkLmxlbmd0aCk7CisgICAgI2VuZGlmCisgICAgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY1NTSUQubGVuZ3RoID0gcFJlYXNzb2NSZXEtPnNzSWQubGVuZ3RoOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NTU0lELnNzSWQsCisgICAgICAgICAgICAgICAgICAgIHBSZWFzc29jUmVxLT5zc0lkLnNzSWQsIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NTU0lELmxlbmd0aCk7CisKKyAgICB9CisKKyAgICBpZiAocE1hYy0+bGltLmdMaW1DdXJyZW50QnNzVWFwc2QpCisgICAgeworICAgICAgICBwTWFjLT5saW0uZ1VhcHNkUGVyQWNCaXRtYXNrID0gcHNlc3Npb25FbnRyeS0+cExpbVJlQXNzb2NSZXEtPnVhcHNkUGVyQWNCaXRtYXNrOworICAgICAgICBsaW1Mb2coIHBNYWMsIExPRzEsIEZMKCJVQVBTRCBmbGFnIGZvciBhbGwgQUMgLSAweCUyeFxuIiksIHBNYWMtPmxpbS5nVWFwc2RQZXJBY0JpdG1hc2spOworICAgIH0KKworI2VuZGlmCisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNbG1SZWFzc29jUmVxLCBzaXplb2YodExpbU1sbVJlYXNzb2NSZXEpKSkKKyAgICB7CisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgbWxtUmVhc3NvY1JlcVxuIikpOworCisgICAgICAgIHJldENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBNbG1SZWFzc29jUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVJlQXNzb2Nic3NJZCwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJnBNbG1SZWFzc29jUmVxLT5yZWFzc29jRmFpbHVyZVRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ291bGQgbm90IGdldCBSZWFzc29jRmFpbHVyZVRpbWVvdXQgdmFsdWUKKyAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBSZWFzc29jRmFpbHVyZVRpbWVvdXQgdmFsdWVcbiIpKTsKKyAgICB9CisKKyAgICBpZiAoY2ZnR2V0Q2FwYWJpbGl0eUluZm8ocE1hYywgJmNhcHMscHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvdWxkIG5vdCBnZXQgQ2FwYWJpbGl0aWVzIHZhbHVlCisgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAqLworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQ2FwYWJpbGl0aWVzIHZhbHVlXG4iKSk7CisgICAgfQorICAgIHBNbG1SZWFzc29jUmVxLT5jYXBhYmlsaXR5SW5mbyA9IGNhcHM7CisgICAgCisgICAgLyogVXBkYXRlIFBFIHNlc3Npb25JZCovCisgICAgcE1sbVJlYXNzb2NSZXEtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworICAgLyogSWYgdGVsZXNjb3BpYyBiZWFjb25pbmcgaXMgZW5hYmxlZCwgc2V0IGxpc3RlbiBpbnRlcnZhbCB0bworICAgICBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSSAqLworICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOLCAmdGVsZUJjbkVuKSAhPSAKKyAgICAgICBlU0lSX1NVQ0NFU1MpIAorICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ291bGRuJ3QgZ2V0IFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOXG4iKSk7CisgICAKKyAgICB2YWwgPSBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTF9TVEFERUY7CisgICAKKyAgICBpZih0ZWxlQmNuRW4pCisgICAgeworICAgICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJLCAmdmFsKSAhPSAKKyAgICAgICAgICBlU0lSX1NVQ0NFU1MpCisgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAqIENvdWxkIG5vdCBnZXQgTGlzdGVuSW50ZXJ2YWwgdmFsdWUKKyAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAqLworICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIExpc3RlbkludGVydmFsXG4iKSk7CisgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgIHsKKyAgICAgICAgIC8qKgorICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IExpc3RlbkludGVydmFsIHZhbHVlCisgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgKi8KKyAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBMaXN0ZW5JbnRlcnZhbFxuIikpOworICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEZWxldGUgYWxsIEJBIHNlc3Npb25zIGJlZm9yZSBSZS1Bc3NvYy4KKyAgICAgKiAgQkEgZnJhbWVzIGFyZSBjbGFzcyAzIGZyYW1lcyBhbmQgdGhlIHNlc3Npb24gCisgICAgICogIGlzIGxvc3QgdXBvbiBkaXNhc3NvY2lhdGlvbiBhbmQgcmVhc3NvY2lhdGlvbi4KKyAgICAgKi8KKworICAgIGxpbURlbEFsbEJBU2Vzc2lvbnMocE1hYyk7CisKKyAgICBwTWxtUmVhc3NvY1JlcS0+bGlzdGVuSW50ZXJ2YWwgPSAodEFOSV9VMTYpIHZhbDsKKworICAgIC8qIEluZGljYXRlIHdoZXRoZXIgc3BlY3RydW0gbWFuYWdlbWVudCBpcyBlbmFibGVkKi8KKyAgICBwc2Vzc2lvbkVudHJ5LT5zcGVjdHJ1bU1ndEVuYWJsZWQgPSBwUmVhc3NvY1JlcS0+c3BlY3RydW1NZ3RJbmRpY2F0b3I7CisKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1QcmV2U21lU3RhdGUgPSBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAgICA9IGVMSU1fU01FX1dUX1JFQVNTT0NfU1RBVEU7CisKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKworICAgIGxpbVBvc3RNbG1NZXNzYWdlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9SRUFTU09DX1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgcE1sbVJlYXNzb2NSZXEpOworICAgIHJldHVybjsKKworZW5kOgorICAgIGlmIChwUmVhc3NvY1JlcSkKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcFJlYXNzb2NSZXEpOworCisgICAgaWYgKHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgIC8vIGVycm9yIG9jY3VycmVkIGFmdGVyIHdlIGRldGVybWluZWQgdGhlIHNlc3Npb24gc28gZXh0cmFjdAorICAgICAgIC8vIHNlc3Npb24gYW5kIHRyYW5zYWN0aW9uIGluZm8gZnJvbSB0aGVyZQorICAgICAgIHNtZVNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKyAgICAgICB0cmFuc2FjdGlvbklkID0gcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAvLyBlcnJvciBvY2N1cnJlZCBiZWZvcmUgb3IgZHVyaW5nIHRoZSB0aW1lIHdlIGRldGVybWluZWQgdGhlIHNlc3Npb24KKyAgICAgICAvLyBzbyBleHRyYWN0IHRoZSBzZXNzaW9uIGFuZCB0cmFuc2FjdGlvbiBpbmZvIGZyb20gdGhlIG1lc3NhZ2UKKyAgICAgICBsaW1HZXRTZXNzaW9uSW5mbyhwTWFjLCh0QU5JX1U4KilwTXNnQnVmLCAmc21lU2Vzc2lvbklkLCAmdHJhbnNhY3Rpb25JZCk7CisgICAgfQorCisgICAgLy8vIFNlbmQgUmVhc3NvYyBmYWlsdXJlIHJlc3BvbnNlIHRvIGhvc3QKKyAgICAvLy8gKG5vdGUgcHNlc3Npb25FbnRyeSBtYXkgYmUgTlVMTCwgYnV0IHRoYXQncyBPSykKKyAgICBsaW1TZW5kU21lSm9pblJlYXNzb2NSc3AocE1hYywgZVdOSV9TTUVfUkVBU1NPQ19SU1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldENvZGUsIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeSwgc21lU2Vzc2lvbklkLCB0cmFuc2FjdGlvbklkKTsKKworfSAvKioqIGVuZCBfX2xpbVByb2Nlc3NTbWVSZWFzc29jUmVxKCkgKioqLworCisKK3RBTklfQk9PTEVBTiBzZW5kRGlzYXNzb2NGcmFtZSA9IDE7CisvKioKKyAqIF9fbGltUHJvY2Vzc1NtZURpc2Fzc29jUmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBTTUVfRElTQVNTT0NfUkVRIG1lc3NhZ2UKKyAqIGZyb20gSEREIG9yIHVwcGVyIGxheWVyIGFwcGxpY2F0aW9uLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NTbWVEaXNhc3NvY1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBkaXNhc3NvY1RyaWdnZXIsIHJlYXNvbkNvZGU7CisgICAgdExpbU1sbURpc2Fzc29jUmVxICAgICAgKnBNbG1EaXNhc3NvY1JlcTsKKyAgICB0U2lyUmVzdWx0Q29kZXMgICAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICB0U2lyU21lRGlzYXNzb2NSZXEgICAgICBzbWVEaXNhc3NvY1JlcTsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsgCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNtZXNlc3Npb25JZDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBzbWV0cmFuc2FjdGlvbklkOworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLEZMKCJyZWNlaXZlZCBESVNBU1NPQ19SRVEgbWVzc2FnZVxuIikpOykKKyAgICAKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSxGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTExcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxpbUdldFNlc3Npb25JbmZvKHBNYWMsKHRBTklfVTggKilwTXNnQnVmLCZzbWVzZXNzaW9uSWQsJnNtZXRyYW5zYWN0aW9uSWQpOworCisgICAgcmV0Q29kZSA9IGxpbURpc2Fzc29jUmVxU2VyRGVzKHBNYWMsICZzbWVEaXNhc3NvY1JlcSwgKHRBTklfVTggKikgcE1zZ0J1Zik7CisgICAgCisgICAgaWYgKCAocmV0Q29kZSA9PSBlU0lSX0ZBSUxVUkUpIHx8KCFsaW1Jc1NtZURpc2Fzc29jUmVxVmFsaWQocE1hYywgJnNtZURpc2Fzc29jUmVxLCBwc2Vzc2lvbkVudHJ5KSkgKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIGludmFsaWQgU01FX0RJU0FTU09DX1JFUSBtZXNzYWdlXG4iKSk7KQorCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVJzcFJlcWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltUnNwUmVxZCA9IGZhbHNlOworCisgICAgICAgICAgICByZXRDb2RlICAgICAgICAgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICAgICAgICBkaXNhc3NvY1RyaWdnZXIgPSBlTElNX0hPU1RfRElTQVNTT0M7CisgICAgICAgICAgICBnb3RvIHNlbmREaXNhc3NvYzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgICBGTCgicmVjZWl2ZWQgRElTQVNTT0NfUkVRIG1lc3NhZ2UuIFJlYXNvbjogJWQgU21lU3RhdGU6ICVkXG4iKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZURpc2Fzc29jUmVxLnJlYXNvbkNvZGUsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpOykKKworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLHNtZURpc2Fzc29jUmVxLmJzc0lkLCZzZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSxGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gYnNzSWRcbiIpKTsKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUzsKKyAgICAgICAgZGlzYXNzb2NUcmlnZ2VyID0gZUxJTV9IT1NUX0RJU0FTU09DOworICAgICAgICBnb3RvIHNlbmREaXNhc3NvYzsKKyAgICAgICAgCisgICAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19ESVNBU1NPQ19SRVFfRVZFTlQsIHBzZXNzaW9uRW50cnksIDAsIHNtZURpc2Fzc29jUmVxLnJlYXNvbkNvZGUpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgIAorICAgIC8qIFVwZGF0ZSBTTUUgc2Vzc2lvbiBJZCBhbmQgU01FIHRyYW5zYWN0aW9uIElEKi8KKworICAgIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZCA9IHNtZXNlc3Npb25JZDsKKyAgICBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkID0gc21ldHJhbnNhY3Rpb25JZDsKKworICAgIHN3aXRjaCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKKyAgICB7CisgICAgICAgIGNhc2UgZUxJTV9TVEFfUk9MRToKKyAgICAgICAgY2FzZSBlTElNX0JUX0FNUF9TVEFfUk9MRToKKyAgICAgICAgICAgIHN3aXRjaCAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgZUxJTV9TTUVfTElOS19FU1RfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVByZXZTbWVTdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlOworICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZT0gZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBlTElNX1NNRV9XVF9ERUFVVEhfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgIC8qIFBFIHNoYWxsIHN0aWxsIHByb2Nlc3MgdGhlIERJU0FTU09DX1JFUSBhbmQgcHJvY2VlZCB3aXRoIAorICAgICAgICAgICAgICAgICAgICAgKiBsaW5rIHRlYXIgZG93biBldmVuIGlmIGl0IGhhZCBhbHJlYWR5IHNlbnQgYSBERUFVVEhfSU5EIHRvCisgICAgICAgICAgICAgICAgICAgICAqIHRvIFNNRS4gcE1hYy0+bGltLmdMaW1QcmV2U21lU3RhdGUgc2hhbGwgcmVtYWluIHRoZSBzYW1lIGFzCisgICAgICAgICAgICAgICAgICAgICAqIGl0cyBiZWVuIHNldCB3aGVuIFBFIGVudGVyZWQgV1RfREVBVVRIX1NUQVRFLiAKKyAgICAgICAgICAgICAgICAgICAgICovICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlPSBlTElNX1NNRV9XVF9ESVNBU1NPQ19TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiUmN2ZCBTTUVfRElTQVNTT0NfUkVRIHdoaWxlIGluIFNNRV9XVF9ERUFVVEhfU1RBVEUuIFxuIikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgIC8qIFBFIFJlY2lldmVkIGEgRGlzYXNzb2MgZnJhbWUuIE5vcm1hbGx5IGl0IGdldHMgRElTQVNTT0NfQ05GIGJ1dCBpdAorICAgICAgICAgICAgICAgICAgICAgKiByZWNlaXZlZCBESVNBU1NPQ19SRVEuIFdoaWNoIG1lYW5zIGhvc3QgaXMgYWxzbyB0cnlpbmcgdG8gZGlzY29ubmVjdC4KKyAgICAgICAgICAgICAgICAgICAgICogUEUgY2FuIGNvbnRpbnVlIHByb2Nlc3NpbmcgRElTQVNTT0NfUkVRIGFuZCBzZW5kIHRoZSByZXNwb25zZSBpbnN0ZWFkCisgICAgICAgICAgICAgICAgICAgICAqIG9mIGZhaWxpbmcgdGhlIHJlcXVlc3QuIFNNRSB3aWxsIGFueXdheSBpZ25vcmUgREVBVVRIX0lORCB0aGF0IHdhcyBzZW50CisgICAgICAgICAgICAgICAgICAgICAqIGZvciBkaXNhc3NvYyBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICogSXQgd2lsbCBzZW5kIGEgZGlzYXNzb2MsIHdoaWNoIGlzIG9rLiBIb3dldmVyLCB3ZSBjYW4gdXNlIHRoZSBnbG9iYWwgZmxhZworICAgICAgICAgICAgICAgICAgICAgKiBzZW5kRGlzYXNzb2MgdG8gbm90IHNlbmQgZGlzYXNzb2MgZnJhbWUuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJjdmQgU01FX0RJU0FTU09DX1JFUSB3aGlsZSBpbiBTTUVfV1RfRElTQVNTT0NfU1RBVEUuIFxuIikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOiB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBSZXR1cm4gU3VjY2VzcyBhcyB3ZSBhcmUgYWxyZWFkeSBpbiBEaXNjb25uZWN0ZWQgU3RhdGUqLworICAgICAgICAgICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltUnNwUmVxZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7ICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Fzc29jVHJpZ2dlciA9IGVMSU1fSE9TVF9ESVNBU1NPQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2VuZERpc2Fzc29jOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBTVEEgaXMgbm90IGN1cnJlbnRseSBhc3NvY2lhdGVkLgorICAgICAgICAgICAgICAgICAgICAgKiBMb2cgZXJyb3IgYW5kIHNlbmQgcmVzcG9uc2UgdG8gaG9zdAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFNNRV9ESVNBU1NPQ19SRVEgaW4gc3RhdGUgJVhcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGxpbVByaW50U21lU3RhdGUocE1hYywgTE9HRSwgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVJzcFJlcWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxJTV9TTUVfV1RfQVNTT0NfU1RBVEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVJzcFJlcWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFOworICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNzb2NUcmlnZ2VyID0gZUxJTV9IT1NUX0RJU0FTU09DOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzZW5kRGlzYXNzb2M7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUxJTV9BUF9ST0xFOgorICAgIGNhc2UgZUxJTV9CVF9BTVBfQVBfUk9MRToKKyAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlTElNX1NUQV9JTl9JQlNTX1JPTEU6CisgICAgICAgIGRlZmF1bHQ6IC8vIGVMSU1fVU5LTk9XTl9ST0xFCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFNNRV9ESVNBU1NPQ19SRVEgZm9yIHJvbGUgJWRcbiIpLAorICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSk7CisKKyAgICAgICAgICAgIHJldENvZGUgPSBlU0lSX1NNRV9VTkVYUEVDVEVEX1JFUV9SRVNVTFRfQ09ERTsKKyAgICAgICAgICAgIGRpc2Fzc29jVHJpZ2dlciA9IGVMSU1fSE9TVF9ESVNBU1NPQzsKKyAgICAgICAgICAgIGdvdG8gc2VuZERpc2Fzc29jOworICAgIH0gLy8gZW5kIHN3aXRjaCAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlKQorCisgICAgaWYgKHNtZURpc2Fzc29jUmVxLnJlYXNvbkNvZGUgPT0gZUxJTV9MSU5LX01PTklUT1JJTkdfRElTQVNTT0MpCisgICAgeworICAgICAgICAvLy8gRGlzYXNzb2NpYXRpb24gaXMgdHJpZ2dlcmVkIGJ5IExpbmsgTW9uaXRvcmluZworICAgICAgICBkaXNhc3NvY1RyaWdnZXIgPSBlTElNX0xJTktfTU9OSVRPUklOR19ESVNBU1NPQzsKKyAgICAgICAgcmVhc29uQ29kZSAgICAgID0gZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFlfUkVBU09OOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkaXNhc3NvY1RyaWdnZXIgPSBlTElNX0hPU1RfRElTQVNTT0M7CisgICAgICAgIHJlYXNvbkNvZGUgICAgICA9IHNtZURpc2Fzc29jUmVxLnJlYXNvbkNvZGU7CisgICAgfQorCisgICAgaWYgKHNtZURpc2Fzc29jUmVxLmRvTm90U2VuZE92ZXJUaGVBaXIpCisgICAgeworICAgICAgICBzZW5kRGlzYXNzb2NGcmFtZSA9IDA7ICAgICAKKyAgICB9CisgICAgLy8gVHJpZ2dlciBEaXNhc3NvY2lhdGlvbiBmcmFtZSB0byBwZWVyIE1BQyBlbnRpdHkKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNbG1EaXNhc3NvY1JlcSwgc2l6ZW9mKHRMaW1NbG1EaXNhc3NvY1JlcSkpKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1EaXNhc3NvY1JlcVxuIikpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmcE1sbURpc2Fzc29jUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZzbWVEaXNhc3NvY1JlcS5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgcE1sbURpc2Fzc29jUmVxLT5yZWFzb25Db2RlICAgICAgPSByZWFzb25Db2RlOworICAgIHBNbG1EaXNhc3NvY1JlcS0+ZGlzYXNzb2NUcmlnZ2VyID0gZGlzYXNzb2NUcmlnZ2VyOworICAgIAorICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElEKi8KKyAgICBwTWxtRGlzYXNzb2NSZXEtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgcE1sbURpc2Fzc29jUmVxLT5haWQgICAgICAgICAgICAgPSBzbWVEaXNhc3NvY1JlcS5haWQ7CisjZW5kaWYKKworICAgIGxpbVBvc3RNbG1NZXNzYWdlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9ESVNBU1NPQ19SRVEsCisgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyICopIHBNbG1EaXNhc3NvY1JlcSk7CisgICAgcmV0dXJuOworCitzZW5kRGlzYXNzb2M6CisgICAgaWYgKHBzZXNzaW9uRW50cnkpIAorICAgICAgICBsaW1TZW5kU21lRGlzYXNzb2NOdGYocE1hYywgc21lRGlzYXNzb2NSZXEucGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Fzc29jVHJpZ2dlciwKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZURpc2Fzc29jUmVxLmFpZCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAxLHNtZXNlc3Npb25JZCxzbWV0cmFuc2FjdGlvbklkLHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisgICAgZWxzZSAKKyAgICAgICAgbGltU2VuZFNtZURpc2Fzc29jTnRmKHBNYWMsIHNtZURpc2Fzc29jUmVxLnBlZXJNYWNBZGRyLCAKKyAgICAgICAgICAgICAgICByZXRDb2RlLCAKKyAgICAgICAgICAgICAgICBkaXNhc3NvY1RyaWdnZXIsCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgICAgICAgICAgICAgIHNtZURpc2Fzc29jUmVxLmFpZCk7CisjZWxzZQorICAgICAgICAgICAgICAgIDEsIDAsIDAsIE5VTEwpOworI2VuZGlmCisKKworfSAvKioqIGVuZCBfX2xpbVByb2Nlc3NTbWVEaXNhc3NvY1JlcSgpICoqKi8KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIF9fbGltUHJvY2Vzc1NtZURpc2Fzc29jQ25mKCkgLSBQcm9jZXNzIFNNRV9ESVNBU1NPQ19DTkYKKyAgIAorICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIFNNRV9ESVNBU1NPQ19DTkYgbWVzc2FnZQorICBmcm9tIEhERCBvciB1cHBlciBsYXllciBhcHBsaWNhdGlvbi4gCisgICAgCisgIFxwYXJhbSBwTWFjIC0gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAgXHBhcmFtIHBTdGFEcyAtIHN0YXRpb24gZHBoIGhhc2ggbm9kZSAKKyAgXHJldHVybiBub25lIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NTbWVEaXNhc3NvY0NuZih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0U2lyU21lRGlzYXNzb2NDbmYgIHNtZURpc2Fzc29jQ25mOworICAgIHRBTklfVTE2ICBhaWQ7CisgICAgdHBEcGhIYXNoTm9kZSAgcFN0YURzOworICAgIHRTaXJSZXRTdGF0dXMgIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQ7CisKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoInJlY2VpdmVkIERJU0FTU09DX0NORiBtZXNzYWdlXG4iKSk7KQorCisgICAgc3RhdHVzID0gbGltRGlzYXNzb2NDbmZTZXJEZXMocE1hYywgJnNtZURpc2Fzc29jQ25mLCh0QU5JX1U4ICopIHBNc2dCdWYpOworCisgICAgaWYgKHN0YXR1cyA9PSBlU0lSX0ZBSUxVUkUpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJpbnZhbGlkIFNNRV9ESVNBU1NPQ19DTkYgbWVzc2FnZVxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYywgc21lRGlzYXNzb2NDbmYuYnNzSWQsICZzZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIGJzc0lkXG4iKSk7CisgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFsaW1Jc1NtZURpc2Fzc29jQ25mVmFsaWQocE1hYywgJnNtZURpc2Fzc29jQ25mLCBwc2Vzc2lvbkVudHJ5KSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgicmVjZWl2ZWQgaW52YWxpZCBTTUVfRElTQVNTT0NfQ05GIG1lc3NhZ2VcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBpZiAoc21lRGlzYXNzb2NDbmYubWVzc2FnZVR5cGUgPT0gZVdOSV9TTUVfRElTQVNTT0NfQ05GKQorICAgICAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0RJU0FTU09DX0NORl9FVkVOVCwgcHNlc3Npb25FbnRyeSwgKHRBTklfVTE2KXNtZURpc2Fzc29jQ25mLnN0YXR1c0NvZGUsIDApOworICAgIGVsc2UgaWYgKHNtZURpc2Fzc29jQ25mLm1lc3NhZ2VUeXBlID09ICBlV05JX1NNRV9ERUFVVEhfQ05GKQorICAgICAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0RFQVVUSF9DTkZfRVZFTlQsIHBzZXNzaW9uRW50cnksICh0QU5JX1UxNilzbWVEaXNhc3NvY0NuZi5zdGF0dXNDb2RlLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworICAgIHN3aXRjaCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKKyAgICB7CisgICAgICAgIGNhc2UgZUxJTV9TVEFfUk9MRToKKyAgICAgICAgY2FzZSBlTElNX0JUX0FNUF9TVEFfUk9MRTogIC8vVG8gdGVzdCByZWNvbm4KKyAgICAgICAgICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfSURMRV9TVEFURSkgJiYKKyAgICAgICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEUpICYmCisgICAgICAgICAgICAgICAgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIHVuZXhwIFNNRV9ESVNBU1NPQ19DTkYgaW4gc3RhdGUgJVhcbiIpLAorICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworICAgICAgICAgICAgICAgIGxpbVByaW50U21lU3RhdGUocE1hYywgTE9HRSwgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUxJTV9BUF9ST0xFOgorICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgICAgICAgcmV0dXJuOworI2VuZGlmCisKKyAgICAgICAgY2FzZSBlTElNX1NUQV9JTl9JQlNTX1JPTEU6CisgICAgICAgIGRlZmF1bHQ6IC8vIGVMSU1fVU5LTk9XTl9ST0xFCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFNNRV9ESVNBU1NPQ19DTkYgcm9sZSAlZFxuIiksCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgIH0gCisKKworICAgIGlmICggKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX1dUX0RJU0FTU09DX1NUQVRFKSB8fCAKKyAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9XVF9ERUFVVEhfU1RBVEUpCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgIHx8IChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSApICAgCisjZW5kaWYKKyAgICAgKQorICAgIHsgICAgICAgCisgICAgICAgIHBTdGFEcyA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBzbWVEaXNhc3NvY0NuZi5wZWVyTWFjQWRkciwgJmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgICAgICBpZiAocFN0YURzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoInJlY2VpdmVkIERJU0FTU09DX0NORiBmb3IgYSBTVEEgdGhhdCBkb2VzIG5vdCBoYXZlIGNvbnRleHQsIGFkZHI9ICIpKTsKKyAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBzbWVEaXNhc3NvY0NuZi5wZWVyTWFjQWRkciwgTE9HVyk7KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxpbUNsZWFudXBSeFBhdGgocE1hYywgcFN0YURzLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9IAorCisKKy8qKgorICogX19saW1Qcm9jZXNzU21lRGVhdXRoUmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBTTUVfREVBVVRIX1JFUSBtZXNzYWdlCisgKiBmcm9tIEhERCBvciB1cHBlciBsYXllciBhcHBsaWNhdGlvbi4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBNc2dCdWYgIEEgcG9pbnRlciB0byB0aGUgU01FIG1lc3NhZ2UgYnVmZmVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorX19saW1Qcm9jZXNzU21lRGVhdXRoUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIGRlYXV0aFRyaWdnZXIsIHJlYXNvbkNvZGU7CisgICAgdExpbU1sbURlYXV0aFJlcSAgICAgICAgKnBNbG1EZWF1dGhSZXE7CisgICAgdFNpclNtZURlYXV0aFJlcSAgICAgICAgc21lRGVhdXRoUmVxOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICAgICAgIHJldENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgICAgIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5OyAKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ7IC8vUEUgc2Vzc2lvbklkCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc21lc2Vzc2lvbklkOyAgCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgc21ldHJhbnNhY3Rpb25JZDsKKyAgICAKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsRkwoInJlY2VpdmVkIERFQVVUSF9SRVEgbWVzc2FnZVxuIikpOykKKworICAgIHN0YXR1cyA9IGxpbURlYXV0aFJlcVNlckRlcyhwTWFjLCAmc21lRGVhdXRoUmVxLCh0QU5JX1U4ICopIHBNc2dCdWYpOworCisgICAgbGltR2V0U2Vzc2lvbkluZm8ocE1hYywodEFOSV9VOCAqKXBNc2dCdWYsJnNtZXNlc3Npb25JZCwmc21ldHJhbnNhY3Rpb25JZCk7CisKKyAgICAvL1dlIG5lZWQgdG8gZ2V0IGEgc2Vzc2lvbiBmaXJzdCBidXQgd2UgZG9uJ3QgZXZlbiBrbm93IGlmIHRoZSBtZXNzYWdlIGlzIGNvcnJlY3QuCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLCBzbWVEZWF1dGhSZXEuYnNzSWQsICZzZXNzaW9uSWQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICBsaW1Mb2cocE1hYywgTE9HRSxGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gYnNzSWRcbiIpKTsKKyAgICAgICByZXRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOworICAgICAgIGRlYXV0aFRyaWdnZXIgPSBlTElNX0hPU1RfREVBVVRIOworICAgICAgIGdvdG8gc2VuZERlYXV0aDsKKyAgICAgICAKKyAgICB9CisKKyAgICBpZiAoKHN0YXR1cyA9PSBlU0lSX0ZBSUxVUkUpIHx8ICghbGltSXNTbWVEZWF1dGhSZXFWYWxpZChwTWFjLCAmc21lRGVhdXRoUmVxLCBwc2Vzc2lvbkVudHJ5KSkpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR1csRkwoInJlY2VpdmVkIGludmFsaWQgU01FX0RFQVVUSF9SRVEgbWVzc2FnZVxuIikpOykKKyAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltUnNwUmVxZCkKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisKKyAgICAgICAgICAgIHJldENvZGUgICAgICAgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICAgICAgICBkZWF1dGhUcmlnZ2VyID0gZUxJTV9IT1NUX0RFQVVUSDsKKyAgICAgICAgICAgIGdvdG8gc2VuZERlYXV0aDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19ERUFVVEhfUkVRX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAwLCBzbWVEZWF1dGhSZXEucmVhc29uQ29kZSk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisKKyAgICAvKiBVcGRhdGUgU01FIHNlc3Npb24gSUQgYW5kIFRyYW5zYWN0aW9uIElEICovCisgICAgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkID0gc21lc2Vzc2lvbklkOworICAgIHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQgPSBzbWV0cmFuc2FjdGlvbklkOworICAgICAgICAKKworICAgIHN3aXRjaCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKKyAgICB7CisgICAgICAgIGNhc2UgZUxJTV9TVEFfUk9MRToKKyAgICAgICAgY2FzZSBlTElNX0JUX0FNUF9TVEFfUk9MRToKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3dpdGNoIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGVMSU1fU01FX0FTU09DSUFURURfU1RBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURToKKyAgICAgICAgICAgICAgICBjYXNlIGVMSU1fU01FX1dUX0FTU09DX1NUQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgZUxJTV9TTUVfSURMRV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltUHJldlNtZVN0YXRlID0gcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID0gZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFOworICAgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIERlYXV0aGVudGljYXRpb24gcmVxdWVzdCB0byBNTE0gYmVsb3cKKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBTVEEgaXMgbm90IGluIGEgc3RhdGUgdG8gZGVhdXRoZW50aWNhdGUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgKiBwZWVyLiBMb2cgZXJyb3IgYW5kIHNlbmQgcmVzcG9uc2UgdG8gaG9zdC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgdW5leHAgU01FX0RFQVVUSF9SRVEgaW4gc3RhdGUgJVhcbiIpLHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRTbWVTdGF0ZShwTWFjLCBMT0dFLCBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltUnNwUmVxZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Sc3BSZXFkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldENvZGUgICAgICAgPSBlU0lSX1NNRV9TVEFfTk9UX0FVVEhFTlRJQ0FURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWF1dGhUcmlnZ2VyID0gZUxJTV9IT1NUX0RFQVVUSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2VuZERlYXV0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlTElNX1NUQV9JTl9JQlNTX1JPTEU6CisKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjYXNlIGVMSU1fQVBfUk9MRToKKyAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBTTUVfREVBVVRIX1JFUSBmb3Igcm9sZSAlWFxuIikscHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9IC8vIGVuZCBzd2l0Y2ggKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSkKKworICAgIGlmIChzbWVEZWF1dGhSZXEucmVhc29uQ29kZSA9PSBlTElNX0xJTktfTU9OSVRPUklOR19ERUFVVEgpCisgICAgeworICAgICAgICAvLy8gRGVhdXRoZW50aWNhdGlvbiBpcyB0cmlnZ2VyZWQgYnkgTGluayBNb25pdG9yaW5nCisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIioqKiogTG9zdCBsaW5rIHdpdGggQVAgKioqKlxuIikpOykKKyAgICAgICAgZGVhdXRoVHJpZ2dlciA9IGVMSU1fTElOS19NT05JVE9SSU5HX0RFQVVUSDsKKyAgICAgICAgcmVhc29uQ29kZSAgICA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZGVhdXRoVHJpZ2dlciA9IGVMSU1fSE9TVF9ERUFVVEg7CisgICAgICAgIHJlYXNvbkNvZGUgICAgPSBzbWVEZWF1dGhSZXEucmVhc29uQ29kZTsKKyAgICB9CisKKyAgICAvLyBUcmlnZ2VyIERlYXV0aGVudGljYXRpb24gZnJhbWUgdG8gcGVlciBNQUMgZW50aXR5CisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTWxtRGVhdXRoUmVxLCBzaXplb2YodExpbU1sbURlYXV0aFJlcSkpKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1EZWF1dGhSZXFcbiIpKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBNbG1EZWF1dGhSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnNtZURlYXV0aFJlcS5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgcE1sbURlYXV0aFJlcS0+cmVhc29uQ29kZSA9IHJlYXNvbkNvZGU7CisgICAgcE1sbURlYXV0aFJlcS0+ZGVhdXRoVHJpZ2dlciA9IGRlYXV0aFRyaWdnZXI7CisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgIHBNbG1EZWF1dGhSZXEtPmFpZCA9IHNtZURlYXV0aFJlcS5haWQ7CisjZW5kaWYKKworICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkKi8KKyAgICBwTWxtRGVhdXRoUmVxLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKyAgICBsaW1Qb3N0TWxtTWVzc2FnZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgIExJTV9NTE1fREVBVVRIX1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgcE1sbURlYXV0aFJlcSk7CisgICAgcmV0dXJuOworCitzZW5kRGVhdXRoOgorICAgIGxpbVNlbmRTbWVEZWF1dGhOdGYocE1hYywgc21lRGVhdXRoUmVxLnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYXV0aFRyaWdnZXIsCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgICAgICAgICAgICAgICAgICAgICAgc21lRGVhdXRoUmVxLmFpZCwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAxLCAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgc21lc2Vzc2lvbklkLCBzbWV0cmFuc2FjdGlvbklkKTsKK30gLyoqKiBlbmQgX19saW1Qcm9jZXNzU21lRGVhdXRoUmVxKCkgKioqLworCisKKworLyoqCisgKiBfX2xpbVByb2Nlc3NTbWVTZXRDb250ZXh0UmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBTTUVfU0VUQ09OVEVYVF9SRVEgbWVzc2FnZQorICogZnJvbSBIREQgb3IgdXBwZXIgbGF5ZXIgYXBwbGljYXRpb24uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc1NtZVNldENvbnRleHRSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdHBTaXJTbWVTZXRDb250ZXh0UmVxICBwU2V0Q29udGV4dFJlcTsKKyAgICB0TGltTWxtU2V0S2V5c1JlcSAgICAgICpwTWxtU2V0S2V5c1JlcTsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNlc3Npb25JZDsgIC8vUEUgc2Vzc2lvbklECisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc21lc2Vzc2lvbklkOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgIHNtZXRyYW5zYWN0aW9uSWQ7CisgICAgCisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgIEZMKCJyZWNlaXZlZCBTRVRDT05URVhUX1JFUSBtZXNzYWdlXG4iKSk7KTsKKworICAgIAorICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGltR2V0U2Vzc2lvbkluZm8ocE1hYywodEFOSV9VOCAqKXBNc2dCdWYsJnNtZXNlc3Npb25JZCwmc21ldHJhbnNhY3Rpb25JZCk7CisgICAgCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2V0Q29udGV4dFJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YodFNpcktleXMpICogU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZUykpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcFNldENvbnRleHRSZXFcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgobGltU2V0Q29udGV4dFJlcVNlckRlcyhwTWFjLCBwU2V0Q29udGV4dFJlcSwgKHRBTklfVTggKikgcE1zZ0J1ZikgPT0gZVNJUl9GQUlMVVJFKSB8fAorICAgICAgICAoIWxpbUlzU21lU2V0Q29udGV4dFJlcVZhbGlkKHBNYWMsIHBTZXRDb250ZXh0UmVxKSkpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoInJlY2VpdmVkIGludmFsaWQgU01FX1NFVENPTlRFWFRfUkVRIG1lc3NhZ2VcbiIpKTsgCisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmKHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5udW1LZXlzID4gU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZUykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIm51bUtleXM6JWQgaXMgbW9yZSB0aGFuIFNJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVNcbiIpLCBwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwubnVtS2V5cyk7KSAgICAgICAgCisgICAgICAgIGxpbVNlbmRTbWVTZXRDb250ZXh0UnNwKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXRDb250ZXh0UmVxLT5wZWVyTWFjQWRkciwKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXRDb250ZXh0UmVxLT5haWQsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUyxOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVzZXNzaW9uSWQsc21ldHJhbnNhY3Rpb25JZCk7CisKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMsIHBTZXRDb250ZXh0UmVxLT5ic3NJZCwgJnNlc3Npb25JZCkpID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIEJTU0lEXG4iKSk7CisgICAgICAgIGxpbVNlbmRTbWVTZXRDb250ZXh0UnNwKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXRDb250ZXh0UmVxLT5wZWVyTWFjQWRkciwKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXRDb250ZXh0UmVxLT5haWQsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUyxOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVzZXNzaW9uSWQsc21ldHJhbnNhY3Rpb25JZCk7CisKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfU0VUQ09OVEVYVF9SRVFfRVZFTlQsIHBzZXNzaW9uRW50cnksIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisKKyAgICBpZiAoKCgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKSB8fCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9TVEFfUk9MRSkpICYmCisgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpKSB8fAorICAgICAgICAoKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkgfHwKKyAgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkpICYmCisgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKSkpCisgICAgeworICAgICAgICAvLyBUcmlnZ2VyIE1MTV9TRVRLRVlTX1JFUQorICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNbG1TZXRLZXlzUmVxLCBzaXplb2YodExpbU1sbVNldEtleXNSZXEpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1TZXRLZXlzUmVxXG4iKSk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIHBNbG1TZXRLZXlzUmVxLT5lZFR5cGUgID0gcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZTsKKyAgICAgICAgcE1sbVNldEtleXNSZXEtPm51bUtleXMgPSBwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwubnVtS2V5czsKKyAgICAgICAgaWYocE1sbVNldEtleXNSZXEtPm51bUtleXMgPiBTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIk51bSBvZiBrZXlzIGV4Y2VlZGVkIG1heCBudW0gb2YgZGVmYXVsdCBrZXlzIGxpbWl0XG4iKSk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmcE1sbVNldEtleXNSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwU2V0Q29udGV4dFJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgICAgIHBNbG1TZXRLZXlzUmVxLT5haWQgPSBwU2V0Q29udGV4dFJlcS0+YWlkOworI2VuZGlmCisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBNbG1TZXRLZXlzUmVxLT5rZXksCisgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5rZXksCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJLZXlzKSAqIChwTWxtU2V0S2V5c1JlcS0+bnVtS2V5cyA/IHBNbG1TZXRLZXlzUmVxLT5udW1LZXlzIDogMSkpOworCisgICAgICAgIHBNbG1TZXRLZXlzUmVxLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgicmVjZWl2ZWQgU0VUQ09OVEVYVF9SRVEgbWVzc2FnZSBzZXNzaW9uSWQ9JWRcbiIpLCBwTWxtU2V0S2V5c1JlcS0+c2Vzc2lvbklkKTspOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGlmKCgocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSA9PSBlU0lSX0VEX1dFUDQwKSB8fCAocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSA9PSBlU0lSX0VEX1dFUDEwNCkpCisgICAgICAgICYmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5rZXlbMF0ua2V5TGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRBTklfVTgga2V5SWQ7CisgICAgICAgICAgICAgICAga2V5SWQgPSBwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwua2V5WzBdLmtleUlkOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYywgKHRBTklfVTggKikmcHNlc3Npb25FbnRyeS0+V0VQS2V5TWF0ZXJpYWxba2V5SWRdLAorICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwsIHNpemVvZih0U2lyS2V5TWF0ZXJpYWwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRBTklfVTMyIGk7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IFNJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZwTWxtU2V0S2V5c1JlcS0+a2V5W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKilwc2Vzc2lvbkVudHJ5LT5XRVBLZXlNYXRlcmlhbFtpXS5rZXksIHNpemVvZih0U2lyS2V5cykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgbGltUG9zdE1sbU1lc3NhZ2UocE1hYywgTElNX01MTV9TRVRLRVlTX1JFUSwgKHRBTklfVTMyICopIHBNbG1TZXRLZXlzUmVxKTsKKworI2lmZGVmIEFOSV9BUF9TREsKKyAgICAgICAgLyogRm9yIFNESyBhY3RpbmcgYXMgU1RBIHVuZGVyIExpbnV4LCBuZWVkIHRvIGNvbnNpZGVyIHRoZSBBUCBhcyAqCisgICAgICAgICAqIGFzIGF1dGhlbnRpY2F0YXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKSAmJgorICAgICAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRwRHBoSGFzaE5vZGUgcFN0YTsKKyAgICAgICAgICAgIHBTdGEgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgMCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgICAgICAgICAgaWYgKHBTdGEpCisgICAgICAgICAgICAgICAgcFN0YS0+c3RhQXV0aGVudGljYXRlZCA9IDE7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgRkwoInJlY2VpdmVkIHVuZXhwZWN0ZWQgU01FX1NFVENPTlRFWFRfUkVRIGZvciByb2xlICVkLCBzdGF0ZT0lWFxuIiksCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUsCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTsKKyAgICAgICAgbGltUHJpbnRTbWVTdGF0ZShwTWFjLCBMT0dFLCBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSk7CisKKyAgICAgICAgbGltU2VuZFNtZVNldENvbnRleHRSc3AocE1hYywgcFNldENvbnRleHRSZXEtPnBlZXJNYWNBZGRyLAorI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldENvbnRleHRSZXEtPmFpZCwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TTUVfVU5FWFBFQ1RFRF9SRVFfUkVTVUxUX0NPREUscHNlc3Npb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWV0cmFuc2FjdGlvbklkKTsKKyAgICB9CisKK2VuZDoKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwU2V0Q29udGV4dFJlcSk7CisgICAgcmV0dXJuOworfSAvKioqIGVuZCBfX2xpbVByb2Nlc3NTbWVTZXRDb250ZXh0UmVxKCkgKioqLworCisvKioKKyAqIF9fbGltUHJvY2Vzc1NtZVJlbW92ZUtleVJlcSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgU01FX1JFTU9WRUtFWV9SRVEgbWVzc2FnZQorICogZnJvbSBIREQgb3IgdXBwZXIgbGF5ZXIgYXBwbGljYXRpb24uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc1NtZVJlbW92ZUtleVJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0cFNpclNtZVJlbW92ZUtleVJlcSAgICBwUmVtb3ZlS2V5UmVxOworICAgIHRMaW1NbG1SZW1vdmVLZXlSZXEgICAgICpwTWxtUmVtb3ZlS2V5UmVxOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOyAgLy9QRSBzZXNzaW9uSUQKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBzbWVzZXNzaW9uSWQ7ICAKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBzbWV0cmFuc2FjdGlvbklkOworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgicmVjZWl2ZWQgUkVNT1ZFS0VZX1JFUSBtZXNzYWdlXG4iKSk7KQorCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMXG4iKSk7CisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAKKyAgICBsaW1HZXRTZXNzaW9uSW5mbyhwTWFjLCh0QU5JX1U4ICopcE1zZ0J1Ziwmc21lc2Vzc2lvbklkLCZzbWV0cmFuc2FjdGlvbklkKTsKKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFJlbW92ZUtleVJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoKnBSZW1vdmVLZXlSZXEpKSkpCisgICAgeworICAgICAgICAvL0xvZyBlcnJvcgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcFJlbW92ZUtleVJlcVxuIikpOworCisgICAgICAgIHJldHVybjsKKyAgICAgfQorCisgICAgaWYgKChsaW1SZW1vdmVLZXlSZXFTZXJEZXMocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbW92ZUtleVJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcE1zZ0J1ZikgPT0gZVNJUl9GQUlMVVJFKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIGludmFsaWQgU01FX1JFTU9WRUNPTlRFWFRfUkVRIG1lc3NhZ2VcbiIpKTsKKworICAgICAgICAvKiBleHRyYSBsb29rIHVwIGlzIG5lZWRlZCBzaW5jZSwgc2Vzc2lvbiBlbnRyeSB0byBiZSBwYXNzZWQgaWwgbGltc2VuZHJlbW92ZWtleSByZXNwb25zZSAqLworCisgICAgICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYyxwUmVtb3ZlS2V5UmVxLT5ic3NJZCwmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgICAgICB7ICAgICAKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZFxuIikpOworICAgICAgICAgICAgLy9nb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGxpbVNlbmRTbWVSZW1vdmVLZXlSc3AocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbW92ZUtleVJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUyxwc2Vzc2lvbkVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVzZXNzaW9uSWQsc21ldHJhbnNhY3Rpb25JZCk7CisKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLHBSZW1vdmVLZXlSZXEtPmJzc0lkLCAmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIGJzc0lkXG4iKSk7CisgICAgICAgIGxpbVNlbmRTbWVSZW1vdmVLZXlSc3AocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbW92ZUtleVJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVzZXNzaW9uSWQsIHNtZXRyYW5zYWN0aW9uSWQpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKworICAgIGlmICgoKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpKSYmCisgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpKSB8fAorICAgICAgICAoKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkgfHwKKyAgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkpICYmCisgICAgICAgICAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKSkpCisgICAgeworICAgICAgICAvLyBUcmlnZ2VyIE1MTV9SRU1PVkVLRVlTX1JFUQorICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNbG1SZW1vdmVLZXlSZXEsIHNpemVvZih0TGltTWxtUmVtb3ZlS2V5UmVxKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBtbG1SZW1vdmVLZXlzUmVxXG4iKSk7CisKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgcE1sbVJlbW92ZUtleVJlcS0+ZWRUeXBlICA9ICh0QW5pRWRUeXBlKXBSZW1vdmVLZXlSZXEtPmVkVHlwZTsgCisgICAgICAgIHBNbG1SZW1vdmVLZXlSZXEtPmtleUlkID0gcFJlbW92ZUtleVJlcS0+a2V5SWQ7CisgICAgICAgIHBNbG1SZW1vdmVLZXlSZXEtPndlcFR5cGUgPSBwUmVtb3ZlS2V5UmVxLT53ZXBUeXBlOworICAgICAgICBwTWxtUmVtb3ZlS2V5UmVxLT51bmljYXN0ID0gcFJlbW92ZUtleVJlcS0+dW5pY2FzdDsKKyAgICAgICAgCisgICAgICAgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkICovCisgICAgICAgIHBNbG1SZW1vdmVLZXlSZXEtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmcE1sbVJlbW92ZUtleVJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnBSZW1vdmVLZXlSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisKKyAgICAgICAgbGltUG9zdE1sbU1lc3NhZ2UocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX01MTV9SRU1PVkVLRVlfUkVRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgcE1sbVJlbW92ZUtleVJlcSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICBGTCgicmVjZWl2ZWQgdW5leHBlY3RlZCBTTUVfUkVNT1ZFS0VZX1JFUSBmb3Igcm9sZSAlZCwgc3RhdGU9JVhcbiIpLAorICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlLAorICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSk7CisgICAgICAgIGxpbVByaW50U21lU3RhdGUocE1hYywgTE9HRSwgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUpOworCisgICAgICAgIGxpbVNlbmRTbWVSZW1vdmVLZXlSc3AocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbW92ZUtleVJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFLHBzZXNzaW9uRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZXNlc3Npb25JZCxzbWV0cmFuc2FjdGlvbklkKTsKKyAgICB9CisKK2VuZDoKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwUmVtb3ZlS2V5UmVxKTsKK30gLyoqKiBlbmQgX19saW1Qcm9jZXNzU21lUmVtb3ZlS2V5UmVxKCkgKioqLworCisKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisvKioKKyAqIF9fbGltSGFuZGxlU21lU3dpdGNoQ2hsUmVxdWVzdCgpCisgKgorICpGVU5DVElPTjoKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIHRoZSBmb2xsb3dpbmcgU01FIG1lc3NhZ2VzCisgKiAgcmVjZWl2ZWQgZnJvbSBIREQgb3IgV1NNOgorICogICAgICAtIGVXTklfU01FX1NXSVRDSF9DSExfUkVRCisgKiAgICAgIC0gZVdOSV9TTUVfU1dJVENIX0NITF9DQl9QUklNQVJZX1JFUQorICogICAgICAtIGVXTklfU01FX1NXSVRDSF9DSExfQ0JfU0VDT05EQVJZX1JFUQorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICogIGVXTklfU01FX1NXSVRDSF9DSExfUkVRIGlzIGlzc3VlZCBvbmx5IHdoZW4gMTFoIGlzIGVuYWJsZWQsCisgKiAgYW5kIFdTTSB3aXNoZXMgdG8gc3dpdGNoIGl0cyBwcmltYXJ5IGNoYW5uZWwuIEFQIHNoYWxsCisgKiAgcG9wdWxhdGUgdGhlIDgwMi4xMWggY2hhbm5lbCBzd2l0Y2ggSUUgaW4gaXRzIEJlYWNvbnMvUHJvYmUgUnNwLgorICoKKyAqICBlV05JX1NNRV9TV0lUQ0hfQ0hMX0NCX1BSSU1BUllfUkVRIGlzIGlzc3VlZCBvbmx5IHdoZW4gMTFoIGlzIGVuYWJsZWQsCisgKiAgYW5kIFdTTSB3aXNoZXMgdG8gc3dpdGNoIGJvdGggaXRzIHByaW1hcnkgY2hhbm5lbCBhbmQgc2Vjb25kYXJ5IGNoYW5uZWwuCisgKiAgKEluIHRoZSBjYXNlIG9mIGlmIDExaCBpcyBkaXNhYmxlZCwgYW5kIFdTTSB3YW50cyB0byBjaGFuZ2UgYm90aAorICogIHByaW1hcnkgJiBzZWNvbmRhcnkgY2hhbm5lbCwgdGhlbiBXU00gc2hvdWxkIGlzc3VlIGEgcmVzdGFydC1CU1MpLiBBUAorICogIHNoYWxsIHBvcHVsYXRlIHRoZSA4MDIuMTFoIGNoYW5uZWwgc3dpdGNoIElFIGluIGl0cyBCZWFjb25zL1Byb2JlIFJzcC4KKyAqCisgKiAgZVdOSV9TTUVfU1dJVENIX0NITF9DQl9TRUNPTkRBUllfUkVRIGlzIGlzc3VlZCB3aGVuIFdTTSB3aXNoZXMgdG8KKyAqICBzd2l0Y2gvZGlzYWJsZSBvbmx5IGl0cyBzZWNvbmRhcnkgY2hhbm5lbC4gVGhpcyBjYW4gb2NjdXIgd2hlbiAxMWgKKyAqICBpcyBlbmFibGVkIG9yIGRpc2FibGVkLiBBUCBzaGFsbCBwb3B1bGF0ZSB0aGUgYWlyZ28gcHJvcHJpZXRhcnkKKyAqICBjaGFubmVsIHN3aXRjaCBJRSBpbiBpdHMgQmVhY29ucy9Qcm9iZSBSc3AuCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBNc2dCdWYgIEEgcG9pbnRlciB0byB0aGUgU01FIG1lc3NhZ2UgYnVmZmVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorX19saW1IYW5kbGVTbWVTd2l0Y2hDaGxSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRwU2lyU21lU3dpdGNoQ2hhbm5lbFJlcSAgIHBTbWVNc2c7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICAgICAgICAgc3RhdHVzOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfU1dJVENIX0NITF9SRVFfRVZFTlQsIE5VTEwsIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgIAorICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOworICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFIHx8CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgIT0gZUxJTV9BUF9ST0xFIHx8CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LmRvdDExaENoYW5Td1N0YXRlID09IGVMSU1fMTFIX0NIQU5TV19SVU5OSU5HKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCAiUmN2ZCBTd2l0Y2ggQ2hsIFJlcSBpbiB3cm9uZyBzdGF0ZVxuIik7KQorICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NXSVRDSF9DSExfUlNQLCBlU0lSX1NNRV9DSEFOTkVMX1NXSVRDSF9GQUlMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTbWVNc2csIHNpemVvZih0U2lyU21lU3dpdGNoQ2hhbm5lbFJlcSkpOworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCwgc3RhdHVzID0gJWRcbiIpLCBzdGF0dXMpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbGltSXNTbWVTd2l0Y2hDaGFubmVsUmVxVmFsaWQocE1hYywgKHRBTklfVTggKilwTXNnQnVmLCBwU21lTXNnKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoImludmFsaWQgc21lIG1lc3NhZ2UgcmVjZWl2ZWRcbiIpKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcFNtZU1zZyk7CisgICAgICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9TTUVfU1dJVENIX0NITF9SU1AsIGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qIElmIHdlJ3JlIGFscmVhZHkgZG9pbmcgY2hhbm5lbCBzd2l0Y2hpbmcgYW5kIHdlJ3JlIGluIHRoZQorICAgICAqIG1pZGRsZSBvZiBjb3VudGluZyBkb3duLCB0aGVuIHJlamVjdCB0aGlzIGNoYW5uZWwgc3dpdGNoIG1zZy4KKyAgICAgKi8KKyAgICBpZiAocE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN0YXRlICE9IGVMSU1fQ0hBTk5FTF9TV0lUQ0hfSURMRSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoImNoYW5uZWwgc3dpdGNoaW5nIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuXG4iKSk7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBTbWVNc2cpOworICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NXSVRDSF9DSExfUlNQLCBlU0lSX1NNRV9DSEFOTkVMX1NXSVRDSF9ESVNBQkxFRCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJyY3ZkIGVXTklfU01FX1NXSVRDSF9DSExfUkVRLCBtZXNzYWdlIHR5cGUgPSAlZFxuIiksIHBTbWVNc2ctPm1lc3NhZ2VUeXBlKTspCisgICAgc3dpdGNoKHBTbWVNc2ctPm1lc3NhZ2VUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TV0lUQ0hfQ0hMX1JFUToKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSA9IGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9PTkxZOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TV0lUQ0hfQ0hMX0NCX1BSSU1BUllfUkVROgorCisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUgPSBlTElNX0NIQU5ORUxfU1dJVENIX1BSSU1BUllfQU5EX1NFQ09OREFSWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1dJVENIX0NITF9DQl9TRUNPTkRBUllfUkVROgorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN0YXRlID0gZUxJTV9DSEFOTkVMX1NXSVRDSF9TRUNPTkRBUllfT05MWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJ1bmtub3duIG1lc3NhZ2VcbiIpKTspCisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwU21lTXNnKTsKKyAgICAgICAgICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9TTUVfU1dJVENIX0NITF9SU1AsIGVTSVJfU01FX0lOVkFMSURfUEFSQU1FVEVSUyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnByaW1hcnlDaGFubmVsID0gcFNtZU1zZy0+Y2hhbm5lbElkOworICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zZWNvbmRhcnlTdWJCYW5kID0gcFNtZU1zZy0+Y2JNb2RlOworICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hDb3VudCA9IGNvbXB1dGVDaGFubmVsU3dpdGNoQ291bnQocE1hYywgcFNtZU1zZy0+ZHRpbUZhY3Rvcik7CisgICAgaWYgKExJTV9JU19SQURBUl9ERVRFQ1RFRChwTWFjKSkKKyAgICB7CisgICAgICAgIC8qKiBNZWFzdXJlbWVudCB0aW1lcnMgbm90IHJ1bm5pbmcgKi8KKyAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaE1vZGUgPSBlU0lSX0NIQU5TV19NT0RFX1NJTEVOVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoqIFN0b3AgbWVhc3VyZW1lbnQgdGltZXJzIHRpbGwgY2hhbm5lbCBzd2l0Y2ggKi8KKyAgICAgICAgbGltU3RvcE1lYXNUaW1lcnMocE1hYyk7CisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hNb2RlID0gZVNJUl9DSEFOU1dfTU9ERV9OT1JNQUw7CisgICAgfQorCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgic3RhdGUgJWQsIHByaW1hcnkgJWQsIHN1YmJhbmQgJWQsIGNvdW50ICVkIFxuIiksCisgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSwKKyAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnByaW1hcnlDaGFubmVsLAorICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc2Vjb25kYXJ5U3ViQmFuZCwKKyAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaENvdW50KTspCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcFNtZU1zZyk7CisgICAgCisgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID0gZUxJTV9RVUlFVF9FTkQ7CisgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5kb3QxMWhDaGFuU3dTdGF0ZSA9IGVMSU1fMTFIX0NIQU5TV19SVU5OSU5HOworICAgIAorICAgIHJldHVybjsKK30gLyoqKiBlbmQgX19saW1IYW5kbGVTbWVTd2l0Y2hDaGxSZXF1ZXN0KCkgKioqLworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgIF9fbGltUHJvY2Vzc1NtZVN3aXRjaENobFJlcQorCitcYnJpZWYgIFdyYXBwZXIgZm9yIHRoZSBmdW5jdGlvbiBfX2xpbUhhbmRsZVNtZVN3aXRjaENobFJlcXVlc3QKKyAgICAgICAgVGhpcyBtZXNzYWdlIHdpbGwgYmUgZGVmZXJlZCB1bnRpbCBzb2Z0bWFjIGNvbWUgb3V0IG9mCisgICAgICAgIHNjYW4gbW9kZS4KK1xwYXJhbSAgcE1hYworXHBhcmFtICBwTXNnCisKK1xyZXR1cm4gVFJVRSAtIElmIHdlIGNvbnN1bWVkIHRoZSBidWZmZXIKKyAgICAgICAgRkFMU0UgLSBJZiBoYXZlIGRlZmVyZWQgdGhlIG1lc3NhZ2UuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB0QU5JX0JPT0xFQU4KK19fbGltUHJvY2Vzc1NtZVN3aXRjaENobFJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZykKK3sKKyAgICBpZiAoX19saW1Jc0RlZmVyZWRNc2dGb3JMZWFybihwTWFjLCBwTXNnKSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICogSWYgbWVzc2FnZSBkZWZlcmVkLCBidWZmZXIgaXMgbm90IGNvbnN1bWVkIHlldC4KKyAgICAgICAgICAgICAgICAqIFNvIHJldHVybiBmYWxzZQorICAgICAgICAgICAgICAgICovCisgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorICAgIF9fbGltSGFuZGxlU21lU3dpdGNoQ2hsUmVxdWVzdChwTWFjLCAodEFOSV9VMzIgKikgcE1zZy0+Ym9keXB0cik7CisgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFOworfQorI2VuZGlmCisKKwordm9pZCBsaW1Qcm9jZXNzU21lR2V0U2NhbkNoYW5uZWxJbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRTaXJNc2dRICAgICAgICAgbW1oTXNnOworICAgIHRwU21lR2V0U2NhbkNoblJzcCAgcFNpclNtZVJzcDsKKyAgICB0QU5JX1UxNiBsZW4gPSAwOworCisgICAgaWYocE1hYy0+bGltLnNjYW5DaG5JbmZvLm51bUNobkluZm8gPiBTSVJfTUFYX1NVUFBPUlRFRF9DSEFOTkVMX0xJU1QpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIm51bUNobiBpcyBvdXQgb2YgYm91bmRzICVkXG4iKSwKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uc2NhbkNobkluZm8ubnVtQ2huSW5mbyk7CisgICAgICAgIHBNYWMtPmxpbS5zY2FuQ2huSW5mby5udW1DaG5JbmZvID0gU0lSX01BWF9TVVBQT1JURURfQ0hBTk5FTF9MSVNUOworICAgIH0KKworICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwKKyAgICAgICAgICAgRkwoIlNlbmRpbmcgbWVzc2FnZSAlcyB3aXRoIG51bWJlciBvZiBjaGFubmVscyAlZFxuIiksCisgICAgICAgICAgIGxpbU1zZ1N0cihlV05JX1NNRV9HRVRfU0NBTk5FRF9DSEFOTkVMX1JTUCksIHBNYWMtPmxpbS5zY2FuQ2huSW5mby5udW1DaG5JbmZvKTspCisKKyAgICBsZW4gPSBzaXplb2YodFNtZUdldFNjYW5DaG5Sc3ApICsgKHBNYWMtPmxpbS5zY2FuQ2huSW5mby5udW1DaG5JbmZvIC0gMSkgKiBzaXplb2YodExpbVNjYW5DaG4pOworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNpclNtZVJzcCwgbGVuICkpCisgICAgeworICAgICAgICAvLy8gQnVmZmVyIG5vdCBhdmFpbGFibGUuIExvZyBlcnJvcgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgSk9JTi9SRUFTU09DX1JTUFxuIikpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwU2lyU21lUnNwLCBsZW4pOworCisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pCisgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZVJzcC0+bWVzZ1R5cGUsIGVXTklfU01FX0dFVF9TQ0FOTkVEX0NIQU5ORUxfUlNQKTsKKyAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSZwU2lyU21lUnNwLT5tZXNnTGVuLCBsZW4pOworI2Vsc2UKKyAgICBwU2lyU21lUnNwLT5tZXNnVHlwZSA9IGVXTklfU01FX0dFVF9TQ0FOTkVEX0NIQU5ORUxfUlNQOworICAgIHBTaXJTbWVSc3AtPm1lc2dMZW4gPSBsZW47CisjZW5kaWYKKyAgICBwU2lyU21lUnNwLT5zZXNzaW9uSWQgPSAwOworCisgICAgaWYocE1hYy0+bGltLnNjYW5DaG5JbmZvLm51bUNobkluZm8pCisgICAgeworICAgICAgICBwU2lyU21lUnNwLT5udW1DaG4gPSBwTWFjLT5saW0uc2NhbkNobkluZm8ubnVtQ2huSW5mbzsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2lyU21lUnNwLT5zY2FuQ2huLCBwTWFjLT5saW0uc2NhbkNobkluZm8uc2NhbkNobiwgc2l6ZW9mKHRMaW1TY2FuQ2huKSAqIHBTaXJTbWVSc3AtPm51bUNobik7CisgICAgfQorICAgIC8vQ2xlYXIgdGhlIGxpc3QKKyAgICBsaW1SZXNzZXRTY2FuQ2hhbm5lbEluZm8ocE1hYyk7CisKKyAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX0dFVF9TQ0FOTkVEX0NIQU5ORUxfUlNQOworICAgIG1taE1zZy5ib2R5cHRyID0gcFNpclNtZVJzcDsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgIAorICAgIHBNYWMtPmxpbS5nTGltUnNwUmVxZCA9IGZhbHNlOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCAgZVBST1QpOworfQorCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCit2b2lkIGxpbVByb2Nlc3NTbWVHZXRBc3NvY1NUQXNJbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRTaXJTbWVHZXRBc3NvY1NUQXNSZXEgIGdldEFzc29jU1RBc1JlcTsKKyAgICB0cERwaEhhc2hOb2RlICAgICAgICAgICBwU3RhRHMgPSBOVUxMOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgIHBzZXNzaW9uRW50cnkgPSBOVUxMOworICAgIHRTYXBfRXZlbnQgICAgICAgICAgICAgIHNhcEV2ZW50OworICAgIHRwV0xBTl9TQVBFdmVudENCICAgICAgIHBTYXBFdmVudENhbGxiYWNrID0gTlVMTDsKKyAgICB0cFNhcF9Bc3NvY01hY0FkZHIgICAgICBwQXNzb2NTdGFzVGVtcCA9IE5VTEw7Ly8gI2luY2x1ZGUgInNhcEFwaS5oIgorICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgYXNzb2NJZCA9IDA7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc3RhQ291bnQgPSAwOworCisgICAgaWYgKCFsaW1Jc1NtZUdldEFzc29jU1RBc1JlcVZhbGlkKHBNYWMsICZnZXRBc3NvY1NUQXNSZXEsICh0QU5JX1U4ICopIHBNc2dCdWYpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgaW52YWxpZCBlV05JX1NNRV9HRVRfQVNTT0NfU1RBU19SRVEgbWVzc2FnZVxuIikpOworICAgICAgICBnb3RvIGxpbUFzc29jU3RhRW5kOworICAgIH0KKworICAgIHN3aXRjaCAoZ2V0QXNzb2NTVEFzUmVxLm1vZElkKQorICAgIHsKKy8qKiAgICAgICAgCisgICAgICAgIGNhc2UgVk9TX01PRFVMRV9JRF9IQUw6CisgICAgICAgICAgICB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjYXNlIFZPU19NT0RVTEVfSURfVEw6CisgICAgICAgICAgICBQb3N0IG1zZyBUTAorICAgICAgICAgICAgcmV0dXJuOworKi8KKyAgICAgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1BFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gR2V0IEFzc29jdGlhdGVkIHN0YXRpb25zIGZyb20gUEUKKyAgICAvLyBGaW5kIFBFIHNlc3Npb24gRW50cnkKKyAgICBpZiAoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLCBnZXRBc3NvY1NUQXNSZXEuYnNzSWQsICZzZXNzaW9uSWQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgICBGTCgic2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gYnNzSWRcbiIpKTsKKyAgICAgICAgZ290byBsaW1Bc3NvY1N0YUVuZDsKKyAgICB9CisKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX0FQX1JPTEUpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJSZWNlaXZlZCB1bmV4cGVjdGVkIG1lc3NhZ2UgaW4gc3RhdGUgJVgsIGluIHJvbGUgJVhcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgLCBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKTsKKyAgICAgICAgZ290byBsaW1Bc3NvY1N0YUVuZDsKKyAgICB9CisKKyAgICAvLyBSZXRyaWV2ZSB2YWx1ZXMgb2J0YWluZWQgaW4gdGhlIHJlcXVlc3QgbWVzc2FnZQorICAgIHBTYXBFdmVudENhbGxiYWNrICAgPSAodHBXTEFOX1NBUEV2ZW50Q0IpZ2V0QXNzb2NTVEFzUmVxLnBTYXBFdmVudENhbGxiYWNrOworICAgIHBBc3NvY1N0YXNUZW1wICAgICAgPSAodHBTYXBfQXNzb2NNYWNBZGRyKWdldEFzc29jU1RBc1JlcS5wQXNzb2NTdGFzQXJyYXk7CisKKyAgICBmb3IgKGFzc29jSWQgPSAwOyBhc3NvY0lkIDwgcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZS5zaXplOyBhc3NvY0lkKyspLy8gU29mdGFwIGRwaEhhc2hUYWJsZS5zaXplID0gOAorICAgIHsKKyAgICAgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIGFzc29jSWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgICAgICBpZiAoTlVMTCA9PSBwU3RhRHMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAocFN0YURzLT52YWxpZCkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSZwQXNzb2NTdGFzVGVtcC0+c3RhTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopJnBTdGFEcy0+c3RhQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodl9NQUNBRERSX3QpKTsgIC8vIE1hYyBhZGRyZXNzCisgICAgICAgICAgICBwQXNzb2NTdGFzVGVtcC0+YXNzb2NJZCA9ICh2X1U4X3QpcFN0YURzLT5hc3NvY0lkOyAgICAgICAgIC8vIEFzc29jaWF0aW9uIElkCisgICAgICAgICAgICBwQXNzb2NTdGFzVGVtcC0+c3RhSWQgICA9ICh2X1U4X3QpcFN0YURzLT5zdGFJbmRleDsgICAgICAgIC8vIFN0YXRpb24gSWQKKworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJkcGggU3RhdGlvbiBOdW1iZXIgPSAlZCIpLCBzdGFDb3VudCsxKTsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiTUFDID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5zdGFBZGRyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+c3RhQWRkclsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPnN0YUFkZHJbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5zdGFBZGRyWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+c3RhQWRkcls1XSk7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkFzc29jaWF0aW9uIElkID0gJWQiKSxwU3RhRHMtPmFzc29jSWQpOworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJTdGF0aW9uIEluZGV4ID0gJWQiKSxwU3RhRHMtPnN0YUluZGV4KTsKKworICAgICAgICAgICAgcEFzc29jU3Rhc1RlbXArKzsKKyAgICAgICAgICAgIHN0YUNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKK2xpbUFzc29jU3RhRW5kOgorICAgIC8vIENhbGwgaGRkIGNhbGxiYWNrIHdpdGggc2FwIGV2ZW50IHRvIHNlbmQgdGhlIGxpc3Qgb2YgYXNzb2NpYXRlZCBzdGF0aW9ucyBmcm9tIFBFCisgICAgaWYgKHBTYXBFdmVudENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgICBzYXBFdmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX0FTU09DX1NUQV9DQUxMQkFDS19FVkVOVDsKKyAgICAgICAgc2FwRXZlbnQuc2FwZXZ0LnNhcEFzc29jU3RhTGlzdEV2ZW50Lm1vZHVsZSA9IFZPU19NT0RVTEVfSURfUEU7CisgICAgICAgIHNhcEV2ZW50LnNhcGV2dC5zYXBBc3NvY1N0YUxpc3RFdmVudC5ub09mQXNzb2NTdGEgPSBzdGFDb3VudDsKKyAgICAgICAgc2FwRXZlbnQuc2FwZXZ0LnNhcEFzc29jU3RhTGlzdEV2ZW50LnBBc3NvY1N0YXMgPSAodHBTYXBfQXNzb2NNYWNBZGRyKWdldEFzc29jU1RBc1JlcS5wQXNzb2NTdGFzQXJyYXk7CisgICAgICAgIHBTYXBFdmVudENhbGxiYWNrKCZzYXBFdmVudCwgZ2V0QXNzb2NTVEFzUmVxLnBVc3JDb250ZXh0KTsKKyAgICB9Cit9CisKKworLyoqCisgKiBsaW1Qcm9jZXNzU21lR2V0V1BTUEJDU2Vzc2lvbnMKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBxdWVyeSB0aGUgV1BTIFBCQyBvdmVybGFwIG1lc3NhZ2UgaXMgcmVjZWl2ZWQKKyAqCisgKkxPR0lDOgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgZ2V0IFdQUyBQQkMgb3ZlcmxhcCBpbmZvcm1hdGlvbiBtZXNzYWdlIGFuZCBjYWxsIGNhbGxiYWNrIHRvIHBhc3MgIAorICogV1BTIFBCQyBvdmVybGFwIGluZm9ybWF0aW9uIGJhY2sgdG8gaGRkLgorICpBU1NVTVBUSU9OUzoKKyAqCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwTXNnQnVmICBBIHBvaW50ZXIgdG8gV1BTIFBCQyBvdmVybGFwIHF1ZXJ5IG1lc3NhZ2UKKyoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbVByb2Nlc3NTbWVHZXRXUFNQQkNTZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0U2lyU21lR2V0V1BTUEJDU2Vzc2lvbnNSZXEgIEdldFdQU1BCQ1Nlc3Npb25zUmVxOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeSA9IE5VTEw7CisgICAgdFNhcF9FdmVudCAgICAgICAgICAgICAgICAgICBzYXBFdmVudDsKKyAgICB0cFdMQU5fU0FQRXZlbnRDQiAgICAgICAgICAgIHBTYXBFdmVudENhbGxiYWNrID0gTlVMTDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgICAgICB6ZXJvTWFjID0gezAsMCwwLDAsMCwwfTsKKyAgICAgICAgCisgICAgc2FwRXZlbnQuc2FwZXZ0LnNhcEdldFdQU1BCQ1Nlc3Npb25FdmVudC5zdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgCisgICAgaWYgKGxpbUlzU21lR2V0V1BTUEJDU2Vzc2lvbnNSZXFWYWxpZChwTWFjLCAgJkdldFdQU1BCQ1Nlc3Npb25zUmVxLCAodEFOSV9VOCAqKSBwTXNnQnVmKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBpbnZhbGlkIGVXTklfU01FX0dFVF9BU1NPQ19TVEFTX1JFUSBtZXNzYWdlXG4iKSk7CisgICAgICAgIGdvdG8gbGltR2V0V1BTUEJDU2Vzc2lvbnNFbmQ7CisgICAgfQorCisgICAgLy8gR2V0IEFzc29jdGlhdGVkIHN0YXRpb25zIGZyb20gUEUKKyAgICAvLyBGaW5kIFBFIHNlc3Npb24gRW50cnkKKyAgICBpZiAoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLCBHZXRXUFNQQkNTZXNzaW9uc1JlcS5ic3NJZCwgJnNlc3Npb25JZCkpID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZFxuIikpOworICAgICAgICBnb3RvIGxpbUdldFdQU1BCQ1Nlc3Npb25zRW5kOworICAgIH0KKworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICAgRkwoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgbWVzc2FnZSBpbiByb2xlICVYXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpOworICAgICAgICBnb3RvIGxpbUdldFdQU1BCQ1Nlc3Npb25zRW5kOworICAgIH0KKworICAgIC8vIENhbGwgaGRkIGNhbGxiYWNrIHdpdGggc2FwIGV2ZW50IHRvIHNlbmQgdGhlIFdQUyBQQkMgb3ZlcmxhcCBpbmZyb21hdGlvbgorICAgIHNhcEV2ZW50LnNhcEhkZEV2ZW50Q29kZSA9ICBlU0FQX0dFVF9XUFNQQkNfU0VTU0lPTl9FVkVOVDsKKyAgICBzYXBFdmVudC5zYXBldnQuc2FwR2V0V1BTUEJDU2Vzc2lvbkV2ZW50Lm1vZHVsZSA9IFZPU19NT0RVTEVfSURfUEU7CisKKyAgICBpZiAocGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgemVyb01hYywgR2V0V1BTUEJDU2Vzc2lvbnNSZXEucFJlbW92ZU1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpCisgICAgeyAvL1RoaXMgaXMgR2V0V3BzU2Vzc2lvbiBjYWxsCisKKyAgICAgIGxpbUdldFdQU1BCQ1Nlc3Npb25zKHBNYWMsCisgICAgICAgICAgICAgIHNhcEV2ZW50LnNhcGV2dC5zYXBHZXRXUFNQQkNTZXNzaW9uRXZlbnQuYWRkci5ieXRlcywgc2FwRXZlbnQuc2FwZXZ0LnNhcEdldFdQU1BCQ1Nlc3Npb25FdmVudC5VVUlEX0UsIAorICAgICAgICAgICAgICAmc2FwRXZlbnQuc2FwZXZ0LnNhcEdldFdQU1BCQ1Nlc3Npb25FdmVudC53cHNQQkNPdmVybGFwLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGxpbVJlbW92ZVBCQ1Nlc3Npb25zKHBNYWMsIEdldFdQU1BCQ1Nlc3Npb25zUmVxLnBSZW1vdmVNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAvKiBkb24ndCBoYXZlIHRvIGluZm9ybSB0aGUgSEREL0hvc3QgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgUEVMT0c0KGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgid3BzUEJDT3ZlcmxhcCAlZFxuIiksIHNhcEV2ZW50LnNhcGV2dC5zYXBHZXRXUFNQQkNTZXNzaW9uRXZlbnQud3BzUEJDT3ZlcmxhcCk7KQorICAgIFBFTE9HNChsaW1QcmludE1hY0FkZHIocE1hYywgc2FwRXZlbnQuc2FwZXZ0LnNhcEdldFdQU1BCQ1Nlc3Npb25FdmVudC5hZGRyLmJ5dGVzLCBMT0c0KTspCisgICAgCisgICAgc2FwRXZlbnQuc2FwZXZ0LnNhcEdldFdQU1BCQ1Nlc3Npb25FdmVudC5zdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgIAorbGltR2V0V1BTUEJDU2Vzc2lvbnNFbmQ6CisgICAgcFNhcEV2ZW50Q2FsbGJhY2sgICA9ICh0cFdMQU5fU0FQRXZlbnRDQilHZXRXUFNQQkNTZXNzaW9uc1JlcS5wU2FwRXZlbnRDYWxsYmFjazsKKyAgICBwU2FwRXZlbnRDYWxsYmFjaygmc2FwRXZlbnQsIEdldFdQU1BCQ1Nlc3Npb25zUmVxLnBVc3JDb250ZXh0KTsKK30KKworI2VuZGlmCisKKworLyoqCisgKiBfX2xpbUNvdW50ZXJNZWFzdXJlcygpCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byAiaW1wbGVtZW50IiBNSUMgY291bnRlciBtZWFzdXJlCisgKiBhbmQgaXMgKnRlbXBvcmFyeSogb25seQorICoKKyAqIExPR0lDOiBvbiBBUCwgZGlzYXNzb2MgYWxsIFNUQSBhc3NvY2lhdGVkIHRocnUgVEtJUCwKKyAqIHdlIGRvbid0IGRvIHRoZSBwcm9wZXIgU1RBIGRpc2Fzc29jIHNlcXVlbmNlIHNpbmNlIHRoZQorICogQlNTIHdpbGwgYmUgc3RvcGVkIGFueXdheQorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitfX2xpbUNvdW50ZXJNZWFzdXJlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJNYWNBZGRyIG1hYyA9IHsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsKKyAgICBpZiAoIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkKKyAgICAgICAgfHwgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpICkKKyAgICAgICAgIAorICAgICAgICBsaW1TZW5kRGlzYXNzb2NNZ210RnJhbWUocE1hYywgZVNJUl9NQUNfTUlDX0ZBSUxVUkVfUkVBU09OLCBtYWMsIHBzZXNzaW9uRW50cnkpOworCisgICAgdHhfdGhyZWFkX3NsZWVwKDEwKTsKK307CisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3ZvaWQKK2xpbVByb2Nlc3NUa2lwQ291bnRlck1lYXN1cmVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRTaXJTbWVUa2lwQ250ck1lYXNSZXEgIHRraXBDbnRyTWVhc1JlcTsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNlc3Npb25JZDsgICAgICAvL1BFIHNlc3Npb25JZAorCisgICAgaWYgKCBsaW1Ua2lwQ250ck1lYXNSZXFTZXJEZXMoIHBNYWMsICZ0a2lwQ250ck1lYXNSZXEsICh0QU5JX1U4ICopIHBNc2dCdWYgKSAhPSBlU0lSX1NVQ0NFU1MgKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgaW52YWxpZCBlV05JX1NNRV9US0lQX0NOVFJfTUVBU19SRVEgbWVzc2FnZVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBOVUxMID09IChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQoIHBNYWMsIHRraXBDbnRyTWVhc1JlcS5ic3NJZCwgJnNlc3Npb25JZCApKSApCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIEJTU0lEIFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCB0a2lwQ250ck1lYXNSZXEuYkVuYWJsZSApCisgICAgeworICAgICAgICBfX2xpbUNvdW50ZXJNZWFzdXJlcyggcE1hYywgcHNlc3Npb25FbnRyeSApOworICAgIH0KKworICAgIHBzZXNzaW9uRW50cnktPmJUa2lwQ250ck1lYXNBY3RpdmUgPSB0a2lwQ250ck1lYXNSZXEuYkVuYWJsZTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkCitfX2xpbUhhbmRsZVNtZVN0b3BCc3NSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRTaXJTbWVTdG9wQnNzUmVxICBzdG9wQnNzUmVxOworICAgIHRTaXJSZXRTdGF0dXMgICAgICBzdGF0dXM7CisgICAgdExpbVNtZVN0YXRlcyAgICAgIHByZXZTdGF0ZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgc2Vzc2lvbklkOyAgLy9QRSBzZXNzaW9uSWQKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgcHNlc3Npb25FbnRyeTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgc21lc2Vzc2lvbklkOworICAgIHRBTklfVTE2ICAgICAgICAgICBzbWV0cmFuc2FjdGlvbklkOworICAgIAorICAgIGxpbUdldFNlc3Npb25JbmZvKHBNYWMsKHRBTklfVTggKilwTXNnQnVmLCZzbWVzZXNzaW9uSWQsJnNtZXRyYW5zYWN0aW9uSWQpOworICAgICAgICAKKworCisgICAgaWYgKChsaW1TdG9wQnNzUmVxU2VyRGVzKHBNYWMsICZzdG9wQnNzUmVxLCAodEFOSV9VOCAqKSBwTXNnQnVmKSAhPSBlU0lSX1NVQ0NFU1MpIHx8CisgICAgICAgICFsaW1Jc1NtZVN0b3BCc3NSZXFWYWxpZChwTXNnQnVmKSkKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoInJlY2VpdmVkIGludmFsaWQgU01FX1NUT1BfQlNTX1JFUSBtZXNzYWdlXG4iKSk7KQorICAgICAgICAvLy8gU2VuZCBTdG9wIEJTUyByZXNwb25zZSB0byBob3N0CisgICAgICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9TTUVfU1RPUF9CU1NfUlNQLCBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlMsc21lc2Vzc2lvbklkLHNtZXRyYW5zYWN0aW9uSWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLHN0b3BCc3NSZXEuYnNzSWQsJnNlc3Npb25JZCkpID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIEJTU0lEIFxuIikpOworICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NUT1BfQlNTX1JTUCwgZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTLHNtZXNlc3Npb25JZCxzbWV0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX1NUT1BfQlNTX1JFUV9FVkVOVCwgcHNlc3Npb25FbnRyeSwgMCwgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisKKworICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTk9STUFMX1NUQVRFKSB8fCAgICAvKiBBZGRlZCBGb3IgQlQgLUFNUCBTdXBwb3J0ICovCisgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUgKSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgU1RPUF9CU1NfUkVRIGluIHN0YXRlcworICAgICAgICAgKiBvdGhlciB0aGFuICdub3JtYWwnIHN0YXRlIG9yIG9uIFNUQSBpbiBJbmZyYXN0cnVjdHVyZQorICAgICAgICAgKiBtb2RlLiBMb2cgZXJyb3IgYW5kIHJldHVybiByZXNwb25zZSB0byBob3N0LgorICAgICAgICAgKi8KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgIEZMKCJyZWNlaXZlZCB1bmV4cGVjdGVkIFNNRV9TVE9QX0JTU19SRVEgaW4gc3RhdGUgJVgsIGZvciByb2xlICVkXG4iKSwKKyAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUsIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpOworICAgICAgICBsaW1QcmludFNtZVN0YXRlKHBNYWMsIExPR0UsIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTsKKyAgICAgICAgLy8vIFNlbmQgU3RvcCBCU1MgcmVzcG9uc2UgdG8gaG9zdAorICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NUT1BfQlNTX1JTUCwgZVNJUl9TTUVfVU5FWFBFQ1RFRF9SRVFfUkVTVUxUX0NPREUsc21lc2Vzc2lvbklkLHNtZXRyYW5zYWN0aW9uSWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSApCisgICAgeworICAgICAgICBsaW1XUFNQQkNDbG9zZShwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisjZW5kaWYKKyAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJSRUNFSVZFRCBTVE9QX0JTU19SRVEgd2l0aCByZWFzb24gY29kZT0lZFxuIiksIHN0b3BCc3NSZXEucmVhc29uQ29kZSk7KQorCisgICAgcHJldlN0YXRlID0gcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGU7CisKKyAgICBwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSA9IGVMSU1fU01FX0lETEVfU1RBVEU7CisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisKKyAgICAvKiBVcGRhdGUgU01FIHNlc3Npb24gSWQgYW5kIFRyYW5zYWN0aW9uIElkICovCisgICAgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkID0gc21lc2Vzc2lvbklkOworICAgIHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQgPSBzbWV0cmFuc2FjdGlvbklkOworCisgICAgLyogQlRBTVBfU1RBIGFuZCBTVEFfSU5fSUJTUyBzaG91bGQgTk9UIHNlbmQgRGlzYXNzb2MgZnJhbWUgKi8KKyAgICBpZiAoIChlTElNX1NUQV9JTl9JQlNTX1JPTEUgIT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkgJiYgKGVMSU1fQlRfQU1QX1NUQV9ST0xFICE9IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpICkKKyAgICB7CisgICAgICAgIHRTaXJNYWNBZGRyICAgYmNBZGRyID0gezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9OworICAgICAgICBpZiAoKHN0b3BCc3NSZXEucmVhc29uQ29kZSA9PSBlU0lSX1NNRV9NSUNfQ09VTlRFUl9NRUFTVVJFUykpCisgICAgICAgICAgICAvLyBTZW5kIGRpc2Fzc29jIGFsbCBzdGF0aW9ucyBhc3NvY2lhdGVkIHRocnUgVEtJUAorICAgICAgICAgICAgX19saW1Db3VudGVyTWVhc3VyZXMocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGltU2VuZERpc2Fzc29jTWdtdEZyYW1lKHBNYWMsIGVTSVJfTUFDX0RJU0FTU09DX0xFQVZJTkdfQlNTX1JFQVNPTiwgYmNBZGRyLHBzZXNzaW9uRW50cnkpOworICAgIH0KKworICAgIC8vbGltRGVsQnNzIGlzIGFsc28gY2FsbGVkIGFzIHBhcnQgb2YgY29hbGVzY2luZywgd2hlbiB3ZSBzZW5kIERFTCBCU1MgZm9sbG93ZWQgYnkgQWRkIEJzcyBtc2cuCisgICAgcE1hYy0+bGltLmdMaW1JYnNzQ29hbGVzY2luZ0hhcHBlbmVkID0gZmFsc2U7CisgICAgCisgICAgLyogc2VuZCBhIGRlbEJzcyB0byBIQUwgYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UgKi8KKyAgICBzdGF0dXMgPSBsaW1EZWxCc3MocE1hYywgTlVMTCxwc2Vzc2lvbkVudHJ5LT5ic3NJZHgscHNlc3Npb25FbnRyeSk7CisgICAgCisgICAgaWYgKHN0YXR1cyAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJkZWxCc3MgZmFpbGVkIGZvciBic3MgJWRcbiIpLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZHgpOykKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGU9IHByZXZTdGF0ZTsKKworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9TTUVfU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpKTsKKyAgIAorICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NUT1BfQlNTX1JTUCwgZVNJUl9TTUVfU1RPUF9CU1NfRkFJTFVSRSxzbWVzZXNzaW9uSWQsc21ldHJhbnNhY3Rpb25JZCk7CisgICAgfQorfQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgIF9fbGltUHJvY2Vzc1NtZVN0b3BCc3NSZXEKKworXGJyaWVmICBXcmFwcGVyIGZvciB0aGUgZnVuY3Rpb24gX19saW1IYW5kbGVTbWVTdG9wQnNzUmVxdWVzdAorICAgICAgICBUaGlzIG1lc3NhZ2Ugd2lsbCBiZSBkZWZlcmVkIHVudGlsIHNvZnRtYWMgY29tZSBvdXQgb2YKKyAgICAgICAgc2NhbiBtb2RlLiBNZXNzYWdlIHNob3VsZCBiZSBoYW5kbGVkIGV2ZW4gaWYgd2UgaGF2ZQorICAgICAgICBkZXRlY3RlZCByYWRhciBpbiB0aGUgY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbC4KK1xwYXJhbSAgcE1hYworXHBhcmFtICBwTXNnCisKK1xyZXR1cm4gVFJVRSAtIElmIHdlIGNvbnN1bWVkIHRoZSBidWZmZXIKKyAgICAgICAgRkFMU0UgLSBJZiBoYXZlIGRlZmVyZWQgdGhlIG1lc3NhZ2UuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB0QU5JX0JPT0xFQU4KK19fbGltUHJvY2Vzc1NtZVN0b3BCc3NSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisgICAgaWYgKF9fbGltSXNEZWZlcmVkTXNnRm9yTGVhcm4ocE1hYywgcE1zZykpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogSWYgbWVzc2FnZSBkZWZlcmVkLCBidWZmZXIgaXMgbm90IGNvbnN1bWVkIHlldC4KKyAgICAgICAgICogU28gcmV0dXJuIGZhbHNlCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIH0KKyAgICBfX2xpbUhhbmRsZVNtZVN0b3BCc3NSZXF1ZXN0KHBNYWMsICh0QU5JX1UzMiAqKSBwTXNnLT5ib2R5cHRyKTsKKyAgICByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUU7Cit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZVN0b3BCc3NSZXEoKSAqKiovCisKKwordm9pZCBsaW1Qcm9jZXNzU21lRGVsQnNzUnNwKAorICAgIHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgIHRBTklfVTMyICAgICAgICBib2R5LHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyAgICAodm9pZCkgYm9keTsKKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKyAgICAvL1RCRDogZ2V0IHRoZSBzZXNzaW9uRW50cnkKKyAgICBkcGhIYXNoVGFibGVDbGFzc0luaXQocE1hYywgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgIGxpbURlbGV0ZVByZUF1dGhMaXN0KHBNYWMpOworICAgIGxpbUlic3NEZWxldGUocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NUT1BfQlNTX1JTUCwgZVNJUl9TTUVfU1VDQ0VTUyxwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQscHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCk7CisgICAgcmV0dXJuOworfQorCisKKyNpZiAwCisvKioKKyAqIF9fbGltUHJvY2Vzc1NtZVByb21pc2N1b3VzUmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBTTUVfUFJPTUlTQ1VPVVNfUkVRIG1lc3NhZ2UKKyAqIGZyb20gSEREIG9yIHVwcGVyIGxheWVyIGFwcGxpY2F0aW9uLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NTbWVQcm9taXNjdW91c1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIGNmZyA9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgdFNpck1hY0FkZHIgICAgICAgIGN1cnJlbnRCc3NJZDsKKyAgICB0TGltTWxtRGlzYXNzb2NSZXEgKnBNbG1EaXNhc3NvY1JlcTsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgYmNBZGRyID0gezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9OworICAgIAorICAgIAorICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOworICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgicmVjZWl2ZWQgUFJPTUlTQ1VPVVNfUkVRIG1lc3NhZ2VcbiIpKTspCisKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19CU1NJRCwgY3VycmVudEJzc0lkLCAmY2ZnKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCBCU1NJRCBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBCU1NJRFxuIikpOworICAgIH0KKworICAgIGlmICgoKChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSkgfHwKKyAgICAgICAgIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfSU5fSUJTU19ST0xFKSkgJiYKKyAgICAgICAgICgocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFKSB8fAorICAgICAgICAgIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX0xJTktfRVNUX1NUQVRFKSkpIHx8CisgICAgICAgICgocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgJiYKKyAgICAgICAgIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX05PUk1BTF9TVEFURSkpKQorICAgIHsKKyAgICAgICAgLy8gVHJpZ2dlciBEaXNhc3NvY2lhdGlvbiBmcmFtZSB0byBwZWVyIE1BQyBlbnRpdHkKKyAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTWxtRGlzYXNzb2NSZXEsIHNpemVvZih0TGltTWxtRGlzYXNzb2NSZXEpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIG1sbURpc2Fzc29jUmVxXG4iKSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBNbG1EaXNhc3NvY1JlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZiY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTWxtRGlzYXNzb2NSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgICAgIHBNbG1EaXNhc3NvY1JlcS0+cmVhc29uQ29kZSAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9NQUNfRElTQVNTT0NfTEVBVklOR19CU1NfUkVBU09OOworICAgICAgICBwTWxtRGlzYXNzb2NSZXEtPmRpc2Fzc29jVHJpZ2dlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fUFJPTUlTQ1VPVVNfTU9ERV9ESVNBU1NPQzsKKworICAgICAgICBwTWFjLT5saW0uZ0xpbVByZXZTbWVTdGF0ZSA9IHBNYWMtPmxpbS5nTGltU21lU3RhdGU7CisgICAgICAgIHBNYWMtPmxpbS5nTGltU21lU3RhdGUgICAgID0gZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEU7CisgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworCisgICAgICAgIGxpbVBvc3RNbG1NZXNzYWdlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9NTE1fRElTQVNTT0NfUkVRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgcE1sbURpc2Fzc29jUmVxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU2VuZCBQcm9taXNjdW91cyBtb2RlIHJlc3BvbnNlIHRvIGhvc3QKKyAgICAgICAgbGltU2VuZFNtZVByb21pc2N1b3VzTW9kZVJzcChwTWFjKTsKKworICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID0gZUxJTV9TTUVfT0ZGTElORV9TVEFURTsKKyAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfU01FX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKSk7CisgICAgfQorCit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZVByb21pc2N1b3VzUmVxKCkgKioqLworI2VuZGlmCisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgIF9fbGltUHJvY2Vzc1NtZUFzc29jQ25mTmV3CitcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBTTUVfQVNTT0NfQ05GL1NNRV9SRUFTU09DX0NORiAKK1wgICAgICAgaW4gQlRBTVAgQVAuCitcCitccGFyYW0gIHBNYWMKK1xwYXJhbSAgbXNnVHlwZSAtIG1lc3NhZ2UgdHlwZQorXHBhcmFtICBwTXNnQnVmIC0gYSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKK1xyZXR1cm4gTm9uZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICB2b2lkCitfX2xpbVByb2Nlc3NTbWVBc3NvY0NuZk5ldyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBtc2dUeXBlLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0U2lyU21lQXNzb2NDbmYgICAgYXNzb2NDbmY7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgIHBTdGFEcyA9IE5VTEw7CisgICAgdHBQRVNlc3Npb24gICAgICAgIHBzZXNzaW9uRW50cnk9IE5VTEw7CisgICAgdEFOSV9VOCAgICAgICAgICAgIHNlc3Npb25JZDsgCisgICAgICAKKworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgicE1zZ0J1ZiBpcyBOVUxMIFxuIikpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAoKGxpbUFzc29jQ25mU2VyRGVzKHBNYWMsICZhc3NvY0NuZiwgKHRBTklfVTggKikgcE1zZ0J1ZikgPT0gZVNJUl9GQUlMVVJFKSB8fAorICAgICAgICAhX19saW1Jc1NtZUFzc29jQ25mVmFsaWQoJmFzc29jQ25mKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUmVjZWl2ZWQgaW52YWxpZCBTTUVfUkUoQVNTT0MpX0NORiBtZXNzYWdlIFxuIikpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMsIGFzc29jQ25mLmJzc0lkLCAmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsgICAgICAgIAorICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIGJzc0lkXG4iKSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmICggKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkgJiYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgIT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkpIHx8CisgICAgICAgICAoKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX05PUk1BTF9TVEFURSkgJiYgKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX05PUk1BTF9DSEFOTkVMX1NDQU5fU1RBVEUpKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUmVjZWl2ZWQgdW5leHBlY3RlZCBtZXNzYWdlICVYIGluIHN0YXRlICVYLCBpbiByb2xlICVYXG4iKSwKKyAgICAgICAgICAgICAgIG1zZ1R5cGUsIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICwgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBhc3NvY0NuZi5haWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICAKKyAgICBpZiAocFN0YURzID09IE5VTEwpCisgICAgeyAgICAgICAgCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgRkwoIlJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSAlWCBkdWUgdG8gbm8gU1RBIGNvbnRleHQsIGZvciBhaWQgJWQsIHBlZXIgIiksCisgICAgICAgICAgICBtc2dUeXBlLCBhc3NvY0NuZi5haWQpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgYXNzb2NDbmYucGVlck1hY0FkZHIsIExPRzEpOyAgICAgCisKKyAgICAgICAgLyoKKyAgICAgICAgKiogc2VuZCBhIERJU0FTU09DX0lORCBtZXNzYWdlIHRvIFdTTSB0byBtYWtlIHN1cmUKKyAgICAgICAgKiogdGhlIHN0YXRlIGluIFdTTSBhbmQgTElNIGlzIHRoZSBzYW1lCisgICAgICAgICoqLworICAgICAgIGxpbVNlbmRTbWVEaXNhc3NvY050ZiggcE1hYywgYXNzb2NDbmYucGVlck1hY0FkZHIsIGVTSVJfU01FX1NUQV9OT1RfQVNTT0NJQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fUEVFUl9FTlRJVFlfRElTQVNTT0MsIGFzc29jQ25mLmFpZCxwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQscHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZCxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKChwU3RhRHMgJiYKKyAgICAgICAgICgoICFwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwodEFOSV9VOCAqKSBwU3RhRHMtPnN0YUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBhc3NvY0NuZi5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpICkgfHwKKyAgICAgICAgICAocFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlICE9IGVMSU1fTUxNX1dUX0FTU09DX0NORl9TVEFURSkgfHwKKyAgICAgICAgICAoKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlID09IExJTV9BU1NPQykgJiYKKyAgICAgICAgICAgKG1zZ1R5cGUgIT0gZVdOSV9TTUVfQVNTT0NfQ05GKSkgfHwKKyAgICAgICAgICAoKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlID09IExJTV9SRUFTU09DKSAmJgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgKG1zZ1R5cGUgIT0gZVdOSV9TTUVfQVNTT0NfQ05GKSkpKSkgLy8gc2luY2Ugc29mdGFwIGlzIHBhc3NpbmcgdGhpcyBhcyBBU1NPQ19DTkYgYW5kIHN1YnR5cGUgZGlmZmVycworI2Vsc2UKKyAgICAgICAgICAgKG1zZ1R5cGUgIT0gZVdOSV9TTUVfUkVBU1NPQ19DTkYpKSkpKQorI2VuZGlmCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgRkwoIlJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSAlWCBkdWUgdG8gcGVlck1hY0FkZHIgbWlzbWF0Y2hlZCBvciBub3QgaW4gZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFIHN0YXRlLCBmb3IgYWlkICVkLCBwZWVyICIpLAorICAgICAgICAgICBtc2dUeXBlLCBhc3NvY0NuZi5haWQpOworICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgYXNzb2NDbmYucGVlck1hY0FkZHIsIExPRzEpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICAvKgorICAgICoqIERlYWN0aXZhdGUvZGVsZXQgQ05GX1dBSVQgdGltZXIgc2luY2UgQVNTT0NfQ05GCisgICAgKiogaGFzIGJlZW4gcmVjZWl2ZWQKKyAgICAqKi8KKyAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIFNNRV9BU1NPQ19DTkYuIERlbGV0ZSBUaW1lclxuIikpOworICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VQZXJTdGFJZFRpbWVyKHBNYWMsIGVMSU1fQ05GX1dBSVRfVElNRVIsIHBTdGFEcy0+YXNzb2NJZCk7CisKKyAgICBpZiAoYXNzb2NDbmYuc3RhdHVzQ29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKQorICAgIHsgICAgICAgIAorICAgICAgICAvKiBJbiBCVEFNUC1BUCwgUEUgYWxyZWFkeSBmaW5pc2hlZCB0aGUgV0RBX0FERF9TVEEgc2VxdWVuY2UKKyAgICAgICAgICogd2hlbiBpdCBoYWQgcmVjZWl2ZWQgQXNzb2MgUmVxdWVzdCBmcmFtZS4gTm93LCBQRSBqdXN0IG5lZWRzIHRvIHNlbmQgCisgICAgICAgICAqIEFzc29jaWF0aW9uIFJlc3BvbnNlIGZyYW1lIHRvIHRoZSByZXF1ZXN0aW5nIEJUQU1QLVNUQS4KKyAgICAgICAgICovCisgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEU7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgic2VuZGluZyBBc3NvYyBSc3AgZnJhbWUgdG8gU1RBIChhc3NvYyBpZD0lZCkgXG4iKSwgcFN0YURzLT5hc3NvY0lkKTsKKyAgICAgICAgbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKCBwTWFjLCBlU0lSX1NVQ0NFU1MsIHBTdGFEcy0+YXNzb2NJZCwgcFN0YURzLT5zdGFBZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQuc3ViVHlwZSwgcFN0YURzLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgZ290byBlbmQ7ICAgICAgCisgICAgfSAvLyAoYXNzb2NDbmYuc3RhdHVzQ29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFNNRV9BU1NPQ19DTkYgc3RhdHVzIGlzIG5vbi1zdWNjZXNzLCBzbyBTVEEgaXMgbm90IGFsbG93ZWQgdG8gYmUgYXNzb2NpYXRlZAorICAgICAgICAvKlNpbmNlIHRoZSBIQUwgc3RhIGVudHJ5IGlzIGNyZWF0ZWQgZm9yIGRlbmllZCBTVEEgd2UgbmVlZCB0byByZW1vdmUgdGhpcyBIQUwgZW50cnkuU28gdG8gZG8gdGhhdCBzZXQgdXBkYXRlQ29udGV4dCB0byAxKi8KKyAgICAgICAgaWYoIXBTdGFEcy0+bWxtU3RhQ29udGV4dC51cGRhdGVDb250ZXh0KQorICAgICAgICAgICBwU3RhRHMtPm1sbVN0YUNvbnRleHQudXBkYXRlQ29udGV4dCA9IDE7CisgICAgICAgIGxpbVJlamVjdEFzc29jaWF0aW9uKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9TVEFUVVMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICByZXR1cm47CisgICAgfQorCitlbmQ6CisgICAgaWYoKHBzZXNzaW9uRW50cnkgIT0gTlVMTCkgJiYgKHBTdGFEcyAhPSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmICggcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoKHRwU2lyQXNzb2NSZXEpKHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGFEcy0+YXNzb2NJZF0pKS0+YXNzb2NSZXFGcmFtZSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCgodHBTaXJBc3NvY1JlcSkocHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSkpLT5hc3NvY1JlcUZyYW1lKTsKKyAgICAgICAgICAgICAgICAoKHRwU2lyQXNzb2NSZXEpKHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGFEcy0+YXNzb2NJZF0pKS0+YXNzb2NSZXFGcmFtZSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbcFN0YURzLT5hc3NvY0lkXSk7ICAKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGFEcy0+YXNzb2NJZF0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorCit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZUFzc29jQ25mTmV3KCkgKioqLworCisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisvKioKKyAqIF9fbGltUHJvY2Vzc1NtZUFzc29jQ25mKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9BU1NPQ19DTkYvU01FX1JFQVNTT0NfQ05GIGZyb20gV1NNLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZAorX19saW1Qcm9jZXNzU21lQXNzb2NDbmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgbXNnVHlwZSwgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdFNpclNtZUFzc29jQ25mICAgIGFzc29jQ25mOworICAgIHRwRHBoSGFzaE5vZGUgICAgICBwU3RhRHM7CisgICAgdHBQRVNlc3Npb24gICAgICAgIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCAgICAgICAgICAgIHNlc3Npb25JZDsgCisgICAgdEhhbEJpdFZhbCBjYkJpdFZhbDsKKyAgICB0QU5JX1U4IHRzcGVjSWR4ID0gMDsgLy9pbmRleCBpbiB0aGUgbGltIHRzcGVjIHRhYmxlLgorCisgICAgaWYocE1zZ0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsRkwoIkJ1ZmZlciBpcyBQb2ludGluZyB0byBOVUxMXG4iKSk7CisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgIGlmICgobGltQXNzb2NDbmZTZXJEZXMocE1hYywgJmFzc29jQ25mLCAodEFOSV9VOCAqKSBwTXNnQnVmKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfRkFJTFVSRSkgfHwKKyAgICAgICAgIV9fbGltSXNTbWVBc3NvY0NuZlZhbGlkKCZhc3NvY0NuZikpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgRkwoIlJlY2VpdmVkIHJlL2Fzc29jQ25mIG1lc3NhZ2Ugd2l0aCBpbnZhbGlkIHBhcmFtZXRlcnNcbiIpKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLGFzc29jQ25mLT5ic3NJZCwmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgIEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfQVNTT0NfQ05GX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAwLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgICAKKyAgICBpZiAoICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX0FQX1JPTEUpICYmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQlRfQU1QX0FQX1JPTEUpKSB8fAorICAgICAgICAgKChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9OT1JNQUxfU1RBVEUpICYmIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9OT1JNQUxfQ0hBTk5FTF9TQ0FOX1NUQVRFKSkpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgIEZMKCJSZWNlaXZlZCB1bmV4cGVjdGVkIG1lc3NhZ2UgJVggaW4gc3RhdGUgJVgsIGluIHJvbGUgJVhcbiIpLAorICAgICAgICAgbXNnVHlwZSwgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgLCBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIGFzc29jQ25mLmFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisKKyAgICBpZiAocFN0YURzID09IE5VTEwpCisgICAgeworICAgICAgICAKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgiUmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlICVYIGR1ZSB0byBubyBTVEEgY29udGV4dCwgZm9yIGFpZCAlZCwgcGVlciAiKSwKKyAgICAgICAgICAgbXNnVHlwZSwgYXNzb2NDbmYuYWlkKTsKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIGFzc29jQ25mLnBlZXJNYWNBZGRyLCBMT0cxKTspCisgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICoqIHNlbmQgYSBESVNBU1NPQ19JTkQgbWVzc2FnZSB0byBXU00gdG8gbWFrZSBzdXJlCisgICAgICAgICoqIHRoZSBzdGF0ZSBpbiBXU00gYW5kIExJTSBpcyB0aGUgc2FtZQorICAgICAgICAqKi8KKworICAgICAgICBsaW1TZW5kU21lRGlzYXNzb2NOdGYocE1hYywKKyAgICAgICAgICAgIGFzc29jQ25mLnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgZVNJUl9TTUVfU1RBX05PVF9BU1NPQ0lBVEVELAorICAgICAgICAgICAgZUxJTV9QRUVSX0VOVElUWV9ESVNBU1NPQywKKyAgICAgICAgICAgIGFzc29jQ25mLmFpZCxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgocFN0YURzICYmCisgICAgICAgICAoKCAhcGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsKHRBTklfVTggKikgcFN0YURzLT5zdGFBZGRyLAorICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgYXNzb2NDbmYucGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSApIHx8CisgICAgICAgICAgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX01MTV9XVF9BU1NPQ19DTkZfU1RBVEUpIHx8CisgICAgICAgICAgKChwU3RhRHMtPm1sbVN0YUNvbnRleHQuc3ViVHlwZSA9PSBMSU1fQVNTT0MpICYmCisgICAgICAgICAgIChtc2dUeXBlICE9IGVXTklfU01FX0FTU09DX0NORikpIHx8CisgICAgICAgICAgKChwU3RhRHMtPm1sbVN0YUNvbnRleHQuc3ViVHlwZSA9PSBMSU1fUkVBU1NPQykgJiYKKyAgICAgICAgICAgKG1zZ1R5cGUgIT0gZVdOSV9TTUVfUkVBU1NPQ19DTkYpKSkpKQorICAgIHsKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgiUmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlICVYIGR1ZSB0byBwZWVyTWFjQWRkciBtaXNtYXRjaGVkIG9yIG5vdCBpbiBlTElNX01MTV9XVF9BU1NPQ19DTkZfU1RBVEUgc3RhdGUsIGZvciBhaWQgJWQsIHBlZXIgIiksCisgICAgICAgICAgIG1zZ1R5cGUsIGFzc29jQ25mLmFpZCk7CisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBhc3NvY0NuZi5wZWVyTWFjQWRkciwgTE9HMSk7KQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICoqIERlYWN0aXZhdGUvZGVsZXQgQ05GX1dBSVQgdGltZXIgc2luY2UgQVNTT0NfQ05GCisgICAgKiogaGFzIGJlZW4gcmVjZWl2ZWQKKyAgICAqKi8KKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIENuZi4gRGVsZXRlIFRpbWVyXG4iKSk7KQorICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VQZXJTdGFJZFRpbWVyKHBNYWMsIGVMSU1fQ05GX1dBSVRfVElNRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkKTsKKworICAgIGlmIChhc3NvY0NuZi5zdGF0dXNDb2RlID09IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgeworICAgICAgICB0U2lyTWFjU2NoZWR1bGVJRSBzY2hlZHVsZTsKKworICAgICAgICAvLyBJZiBTVEEgaXMgYSBUSVRBTi1jb21wYXRpYmxlIGRldmljZSwgdGhlbiBzZXR1cAorICAgICAgICAvLyB0aGUgVElUQU4gcHJvcHJpZXRhcnkgY2FwYWJpbGl0aWVzIGFwcHJvcHJpYXRlbHkKKyAgICAgICAgLy8gaW4gdGhlIHBlciBTVEEgRFMsIGFzIHBlciB0aGUgbG9jYWwgVElUQU4gUHJvcAorICAgICAgICAvLyBjYXBhYmlsaXRpZXMgb2YgdGhpcyBBUAorCisgICAgICAgIC8vIFNUQSBpcyBhbGxvd2VkIHRvIGJlIGFzc29jaWF0ZWQKKyAgICAgICAgaWYgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC51cGRhdGVDb250ZXh0KQorICAgICAgICB7CisKKyAgICAgICAgICAgICAgdExpbU1sbVN0YXRlcyBtbG1QcmV2U3RhdGUgPSBwU3RhRHMtPm1sbVN0YUNvbnRleHQubWxtU3RhdGU7CisgICAgICAgICAgICAgIC8vd2UgbmVlZCB0byBzZXQgdGhlIG1sbVN0YXRlIGhlcmUgaW4gb3JkZXIgZGlmZmVyZW50aWF0ZSBpbiBsaW1EZWxTdGEuCisgICAgICAgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX0FTU09DX0RFTF9TVEFfUlNQX1NUQVRFOworICAgICAgICAgICAgICBpZihsaW1EZWxTdGEocE1hYywgcFN0YURzLCB0cnVlLHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCBERUwgU1RBIHdpdGggYXNzb2NJZD0lZCBzdGFJZCAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkLCBwU3RhRHMtPnN0YUluZGV4KTsKKworICAgICAgICAgICAgICAgICAgbGltUmVqZWN0QXNzb2NpYXRpb24ocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+c3RhQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgcFN0YURzLT5tbG1TdGFDb250ZXh0LmF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgIC8vUmVzdG9yaW5nIHRoZSBzdGF0ZSBiYWNrLgorICAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0Lm1sbVN0YXRlID0gbWxtUHJldlN0YXRlOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFkZCBTVEEgY29udGV4dCBhdCBIVworICAgICAgICAgICAgaWYgKGxpbUFkZFN0YShwTWFjLCBwU3RhRHMscHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IEFkZCBTVEEgd2l0aCBhc3NvY0lkPSVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkKTsKKworICAgICAgICAgICAgICAvLyBkZWxldGUgdGhlIFRTIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQuCisgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSByZXNwb25zZSB3aXRoIGVycm9yIHN0YXR1cy4KKyAgICAgICAgICAgICAgICBpZihwU3RhRHMtPnFvcy5hZGR0c1ByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbGltQWRtaXRDb250cm9sRGVsZXRlVFMocE1hYywgcFN0YURzLT5hc3NvY0lkLCAmcFN0YURzLT5xb3MuYWRkdHMudHNwZWMudHNpbmZvLCBOVUxMLCAmdHNwZWNJZHgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxpbVJlamVjdEFzc29jaWF0aW9uKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5zdGFBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5zdWJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRHMtPmFzc29jSWQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRTaXJSZXN1bHRDb2RlcykgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnkpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgfSAvLyBpZiAoYXNzb2NDbmYuc3RhdHVzQ29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFNUQSBpcyBub3QgYWxsb3dlZCB0byBiZSBhc3NvY2lhdGVkCisgICAgICAgIGxpbVJlamVjdEFzc29jaWF0aW9uKHBNYWMsIHBTdGFEcy0+c3RhQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5tbG1TdGFDb250ZXh0LnN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5hdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YURzLT5hc3NvY0lkLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY0NuZi5zdGF0dXNDb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9Cit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZUFzc29jQ25mKCkgKioqLworI2VuZGlmCisKKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc1NtZUFkZHRzUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRwRHBoSGFzaE5vZGUgICBwU3RhRHM7CisgICAgdFNpck1hY0FkZHIgICAgIHBlZXJNYWM7CisgICAgdHBTaXJBZGR0c1JlcSAgIHBTaXJBZGR0czsKKyAgICB0QU5JX1UzMiAgICAgICAgdGltZW91dDsKKyAgICB0cFBFU2Vzc2lvbiAgICAgcHNlc3Npb25FbnRyeTsKKyAgICB0QU5JX1U4ICAgICAgICAgc2Vzc2lvbklkOyAgLy9QRSBzZXNzaW9uSWQKKyAgICB0QU5JX1U4ICAgICAgICAgc21lc2Vzc2lvbklkOworICAgIHRBTklfVTE2ICAgICAgICBzbWV0cmFuc2FjdGlvbklkOworCisKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSxGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTExcbiIpKTsKKyAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxpbUdldFNlc3Npb25JbmZvKHBNYWMsKHRBTklfVTggKilwTXNnQnVmLCZzbWVzZXNzaW9uSWQsJnNtZXRyYW5zYWN0aW9uSWQpOworICAgIAorICAgIHBTaXJBZGR0cyA9ICh0cFNpckFkZHRzUmVxKSBwTXNnQnVmOworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLCBwU2lyQWRkdHMtPmJzc0lkLCZzZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgIlNlc3Npb24gRG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIGJzc0lkXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19BRERUU19SRVFfRVZFTlQsIHBzZXNzaW9uRW50cnksIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgIAorCisKKyAgICAvKiBpZiBzdGEKKyAgICAgKiAgLSB2ZXJpZnkgYXNzb2Mgc3RhdGUKKyAgICAgKiAgLSBzZW5kIGFkZHRzIHJlcXVlc3QgdG8gYXAKKyAgICAgKiAgLSB3YWl0IGZvciBhZGR0cyByZXNwb25zZSBmcm9tIGFwCisgICAgICogaWYgYXAsIGp1c3QgaWdub3JlIHdpdGggZXJyb3IgbG9nCisgICAgICovCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgiUmVjZWl2ZWQgU01FX0FERFRTX1JFUSAoVFNpZCAlZCwgVVAgJWQpXG4iKSwKKyAgICAgICAgICAgcFNpckFkZHRzLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZCwKKyAgICAgICAgICAgcFNpckFkZHRzLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW8pOykKKworICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX1NUQV9ST0xFKSYmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgIT0gZUxJTV9CVF9BTVBfU1RBX1JPTEUpKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCAiQWRkVHMgcmVjZWl2ZWQgb24gQVAgLSBpZ25vcmluZ1xuIik7KQorICAgICAgICBsaW1TZW5kU21lQWRkdHNSc3AocE1hYywgcFNpckFkZHRzLT5yc3BSZXFkLCBlU0lSX0ZBSUxVUkUsIHBzZXNzaW9uRW50cnksIHBTaXJBZGR0cy0+cmVxLnRzcGVjLCAKKyAgICAgICAgICAgICAgICBzbWVzZXNzaW9uSWQsc21ldHJhbnNhY3Rpb25JZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL0lnbm9yZSB0aGUgcmVxdWVzdCBpZiBTVEEgaXMgaW4gMTFCIG1vZGUuCisgICAgaWYocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlID09IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUIpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICJBZGRUUyByZWNlaXZlZCB3aGlsZSBEb3QxMU1vZGUgaXMgMTFCIC0gaWdub3JpbmdcbiIpOykKKyAgICAgICAgbGltU2VuZFNtZUFkZHRzUnNwKHBNYWMsIHBTaXJBZGR0cy0+cnNwUmVxZCwgZVNJUl9GQUlMVVJFLCBwc2Vzc2lvbkVudHJ5LCBwU2lyQWRkdHMtPnJlcS50c3BlYywgCisgICAgICAgICAgICAgICAgc21lc2Vzc2lvbklkLHNtZXRyYW5zYWN0aW9uSWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICBwU3RhRHMgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgIGlmKHBTdGFEcyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCAiQ2Fubm90IGZpbmQgQVAgY29udGV4dCBmb3IgYWRkdHMgcmVxXG4iKTspCisgICAgICAgIGxpbVNlbmRTbWVBZGR0c1JzcChwTWFjLCBwU2lyQWRkdHMtPnJzcFJlcWQsIGVTSVJfRkFJTFVSRSwgcHNlc3Npb25FbnRyeSwgcFNpckFkZHRzLT5yZXEudHNwZWMsCisgICAgICAgICAgICBzbWVzZXNzaW9uSWQsc21ldHJhbnNhY3Rpb25JZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKCEgcFN0YURzLT52YWxpZCkgfHwKKyAgICAgICAgKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5tbG1TdGF0ZSAhPSBlTElNX01MTV9MSU5LX0VTVEFCTElTSEVEX1NUQVRFKSkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgIkFkZFRzIHJlY2VpdmVkIGluIGludmFsaWQgTUxNIHN0YXRlXG4iKTspCisgICAgICAgIGxpbVNlbmRTbWVBZGR0c1JzcChwTWFjLCBwU2lyQWRkdHMtPnJzcFJlcWQsIGVTSVJfRkFJTFVSRSwgcHNlc3Npb25FbnRyeSwgcFNpckFkZHRzLT5yZXEudHNwZWMsCisgICAgICAgICAgICBzbWVzZXNzaW9uSWQsc21ldHJhbnNhY3Rpb25JZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwU2lyQWRkdHMtPnJlcS53c21Uc3BlY1ByZXNlbnQgPSAwOworICAgIHBTaXJBZGR0cy0+cmVxLndtZVRzcGVjUHJlc2VudCA9IDA7CisgICAgcFNpckFkZHRzLT5yZXEubGxlVHNwZWNQcmVzZW50ID0gMDsKKyAgICAKKyAgICBpZiAoKHBTdGFEcy0+d3NtRW5hYmxlZCkgJiYKKyAgICAgICAgKHBTaXJBZGR0cy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSAhPSBTSVJfTUFDX0FDQ0VTU1BPTElDWV9FRENBKSkKKyAgICAgICAgcFNpckFkZHRzLT5yZXEud3NtVHNwZWNQcmVzZW50ID0gMTsKKyAgICBlbHNlIGlmIChwU3RhRHMtPndtZUVuYWJsZWQpCisgICAgICAgIHBTaXJBZGR0cy0+cmVxLndtZVRzcGVjUHJlc2VudCA9IDE7CisgICAgZWxzZSBpZiAocFN0YURzLT5sbGVFbmFibGVkKQorICAgICAgICBwU2lyQWRkdHMtPnJlcS5sbGVUc3BlY1ByZXNlbnQgPSAxOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkFERFRTX1JFUSBpZ25vcmUgLSBxb3MgaXMgZGlzYWJsZWRcbiIpKTspCisgICAgICAgIGxpbVNlbmRTbWVBZGR0c1JzcChwTWFjLCBwU2lyQWRkdHMtPnJzcFJlcWQsIGVTSVJfRkFJTFVSRSwgcHNlc3Npb25FbnRyeSwgcFNpckFkZHRzLT5yZXEudHNwZWMsCisgICAgICAgICAgICBzbWVzZXNzaW9uSWQsc21ldHJhbnNhY3Rpb25JZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlICE9IGVMSU1fU01FX0FTU09DSUFURURfU1RBVEUpICYmCisgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9MSU5LX0VTVF9TVEFURSkpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgIkFkZFRzIHJlY2VpdmVkIGluIGludmFsaWQgTElNc21lIHN0YXRlICglZClcbiIsCisgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTsKKyAgICAgICAgbGltU2VuZFNtZUFkZHRzUnNwKHBNYWMsIHBTaXJBZGR0cy0+cnNwUmVxZCwgZVNJUl9GQUlMVVJFLCBwc2Vzc2lvbkVudHJ5LCBwU2lyQWRkdHMtPnJlcS50c3BlYywKKyAgICAgICAgICAgIHNtZXNlc3Npb25JZCxzbWV0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCAiQWRkdHMgKHRva2VuICVkLCB0c2lkICVkLCB1cCAlZCkgaXMgc3RpbGwgcGVuZGluZ1xuIiwKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQWRkdHNSZXEucmVxLmRpYWxvZ1Rva2VuLAorICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1BZGR0c1JlcS5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZCwKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQWRkdHNSZXEucmVxLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvKTsKKyAgICAgICAgbGltU2VuZFNtZUFkZHRzUnNwKHBNYWMsIHBTaXJBZGR0cy0+cnNwUmVxZCwgZVNJUl9GQUlMVVJFLCBwc2Vzc2lvbkVudHJ5LCBwU2lyQWRkdHMtPnJlcS50c3BlYywKKyAgICAgICAgICAgIHNtZXNlc3Npb25JZCxzbWV0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICNpZiAwCisgICAgdmFsID0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19CU1NJRCwgcGVlck1hYywgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLy8vIENvdWxkIG5vdCBnZXQgQlNTSUQgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQlNTSURcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAjZW5kaWYKKyAgICBzaXJDb3B5TWFjQWRkcihwZWVyTWFjLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworICAgIC8vIHNhdmUgdGhlIGFkZHRzIHJlcXVlc3QKKyAgICBwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCA9IHRydWU7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBNYWMtPmxpbS5nTGltQWRkdHNSZXEsICh0QU5JX1U4ICopIHBTaXJBZGR0cywgc2l6ZW9mKHRTaXJBZGR0c1JlcSkpOworCisgICAgLy8gc2hpcCBvdXQgdGhlIG1lc3NhZ2Ugbm93CisgICAgbGltU2VuZEFkZHRzUmVxQWN0aW9uRnJhbWUocE1hYywgcGVlck1hYywgJnBTaXJBZGR0cy0+cmVxLAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeSk7CisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCAiU2VudCBBRERUUyByZXF1ZXN0XG4iKTspCisKKyAgICAvLyBzdGFydCBhIHRpbWVyIHRvIHdhaXQgZm9yIHRoZSByZXNwb25zZQorICAgIGlmIChwU2lyQWRkdHMtPnRpbWVvdXQpIAorICAgICAgICB0aW1lb3V0ID0gcFNpckFkZHRzLT50aW1lb3V0OworICAgIGVsc2UgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQUREVFNfUlNQX1RJTUVPVVQsICZ0aW1lb3V0KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBnZXQgQ2ZnIHBhcmFtICVkIChBZGR0cyBSc3AgVGltZW91dClcbiIpLAorICAgICAgICAgICAgICAgV05JX0NGR19BRERUU19SU1BfVElNRU9VVCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aW1lb3V0ID0gU1lTX01TX1RPX1RJQ0tTKHRpbWVvdXQpOworICAgIGlmICh0eF90aW1lcl9jaGFuZ2UoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFkZHRzUnNwVGltZXIsIHRpbWVvdXQsIDApICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkFkZHRzUnNwIHRpbWVyIGNoYW5nZSBmYWlsZWQhXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcE1hYy0+bGltLmdMaW1BZGR0c1JzcFRpbWVyQ291bnQrKzsKKyAgICBpZiAodHhfdGltZXJfY2hhbmdlX2NvbnRleHQoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFkZHRzUnNwVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQWRkdHNSc3BUaW1lckNvdW50KSAhPSBUWF9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJBZGR0c1JzcCB0aW1lciBjaGFuZ2UgZmFpbGVkIVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX0FERFRTX1JTUF9USU1FUikpOworICAgIAorICAgIC8vYWRkIHRoZSBzZXNzaW9uSWQgdG8gdGhlIHRpbWVyIG9iamVjdAorICAgIHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFkZHRzUnNwVGltZXIuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQWRkdHNSc3BUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQWRkdHNSc3AgdGltZXIgYWN0aXZhdGlvbiBmYWlsZWQhXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NTbWVEZWx0c1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0U2lyTWFjQWRkciAgICAgcGVlck1hY0FkZHI7CisgICAgdEFOSV9VOCAgICAgICAgIGFjOworICAgIHRTaXJNYWNUU0luZm8gICAqcFRzaW5mbzsKKyAgICB0cFNpckRlbHRzUmVxICAgcERlbHRzUmVxID0gKHRwU2lyRGVsdHNSZXEpIHBNc2dCdWY7CisgICAgdHBEcGhIYXNoTm9kZSAgIHBTdGFEcyA9IE5VTEw7CisgICAgdHBQRVNlc3Npb24gICAgIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCAgICAgICAgIHNlc3Npb25JZDsKKyAgICB0QU5JX1UzMiAgICAgICAgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworICAgIHRBTklfVTggICAgICAgICBzbWVzZXNzaW9uSWQ7CisgICAgdEFOSV9VMTYgICAgICAgIHNtZXRyYW5zYWN0aW9uSWQ7ICAgIAorCisgICAgbGltR2V0U2Vzc2lvbkluZm8ocE1hYywodEFOSV9VOCAqKXBNc2dCdWYsJnNtZXNlc3Npb25JZCwmc21ldHJhbnNhY3Rpb25JZCk7CisgICAgCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLCBwRGVsdHNSZXEtPmJzc0lkLCAmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZFxuIik7CisgICAgICAgIHN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0RFTFRTX1JFUV9FVkVOVCwgcHNlc3Npb25FbnRyeSwgMCwgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisKKworICAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gbGltVmFsaWRhdGVEZWx0c1JlcShwTWFjLCBwRGVsdHNSZXEsIHBlZXJNYWNBZGRyLHBzZXNzaW9uRW50cnkpKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgibGltVmFsaWRhdGVEZWx0c1JlcSBmYWlsZWRcbiIpKTspCisgICAgICAgIHN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKyAgICAgICAgbGltU2VuZFNtZURlbHRzUnNwKHBNYWMsIHBEZWx0c1JlcSwgZVNJUl9GQUlMVVJFLHBzZXNzaW9uRW50cnksc21lc2Vzc2lvbklkLHNtZXRyYW5zYWN0aW9uSWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU2VudCBERUxUUyByZXF1ZXN0IHRvIHN0YXRpb24gd2l0aCBhc3NvY0lkID0gJWQgTWFjQWRkciA9ICV4OiV4OiV4OiV4OiV4OiV4XG4iKSwKKyAgICAgICAgICAgICAgcERlbHRzUmVxLT5haWQsIHBlZXJNYWNBZGRyWzBdLCBwZWVyTWFjQWRkclsxXSwgcGVlck1hY0FkZHJbMl0sCisgICAgICAgICAgICAgIHBlZXJNYWNBZGRyWzNdLCBwZWVyTWFjQWRkcls0XSwgcGVlck1hY0FkZHJbNV0pOykKKworICAgIGxpbVNlbmREZWx0c1JlcUFjdGlvbkZyYW1lKHBNYWMsIHBlZXJNYWNBZGRyLCBwRGVsdHNSZXEtPnJlcS53bWVUc3BlY1ByZXNlbnQsICZwRGVsdHNSZXEtPnJlcS50c2luZm8sICZwRGVsdHNSZXEtPnJlcS50c3BlYywKKyAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeSk7CisKKyAgICBwVHNpbmZvID0gcERlbHRzUmVxLT5yZXEud21lVHNwZWNQcmVzZW50ID8gJnBEZWx0c1JlcS0+cmVxLnRzcGVjLnRzaW5mbyA6ICZwRGVsdHNSZXEtPnJlcS50c2luZm87CisKKyAgICAvKiBXZSd2ZSBzdWNjZXNzZnVsbHkgc2VuZCBERUxUUyBmcmFtZSB0byBBUC4gVXBkYXRlIHRoZSAKKyAgICAgKiBkeW5hbWljIFVBUFNEIG1hc2suIFRoZSBBQyBmb3IgdGhpcyBUU1BFQyB0byBiZSBkZWxldGVkCisgICAgICogaXMgbm8gbG9uZ2VyIHRyaWdnZXIgZW5hYmxlZCBvciBkZWxpdmVyeSBlbmFibGVkCisgICAgICovCisgICAgbGltU2V0VHNwZWNVYXBzZE1hc2socE1hYywgcFRzaW5mbywgQ0xFQVJfVUFQU0RfTUFTSyk7CisKKyAgICAvKiBXZSdyZSBkZWxldGluZyB0aGUgVFNQRUMsIHNvIHRoaXMgcGFydGljdWxhciBBQyBpcyBubyBsb25nZXIKKyAgICAgKiBhZG1pdHRlZC4gIFBFIG5lZWRzIHRvIGRvd25ncmFkZSB0aGUgRURDQQorICAgICAqIHBhcmFtZXRlcnMoZm9yIHRoZSBBQyBmb3Igd2hpY2ggVFMgaXMgYmVpbmcgZGVsZXRlZCkgdG8gdGhlCisgICAgICogbmV4dCBiZXN0IEFDIGZvciB3aGljaCBBQ00gaXMgbm90IGVuYWJsZWQsIGFuZCBzZW5kIHRoZQorICAgICAqIHVwZGF0ZWQgdmFsdWVzIHRvIEhBTC4gCisgICAgICovIAorICAgIGFjID0gdXBUb0FjKHBUc2luZm8tPnRyYWZmaWMudXNlclByaW8pOworCisgICAgaWYocFRzaW5mby0+dHJhZmZpYy5kaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LKQorICAgIHsKKyAgICAgIHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LXSAmPSB+KDEgPDwgYWMpOworICAgIH0KKyAgICBlbHNlIGlmKHBUc2luZm8tPnRyYWZmaWMuZGlyZWN0aW9uID09IFNJUl9NQUNfRElSRUNUSU9OX0ROTElOSykKKyAgICB7CisgICAgICBwTWFjLT5saW0uZ0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX0ROTElOS10gJj0gfigxIDw8IGFjKTsKKyAgICB9CisgICAgZWxzZSBpZihwVHNpbmZvLT50cmFmZmljLmRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9CSURJUikKKyAgICB7CisgICAgICBwTWFjLT5saW0uZ0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX1VQTElOS10gJj0gfigxIDw8IGFjKTsKKyAgICAgIHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LXSAmPSB+KDEgPDwgYWMpOworICAgIH0KKworICAgIGxpbVNldEFjdGl2ZUVkY2FQYXJhbXMocE1hYywgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXMsIHBzZXNzaW9uRW50cnkpOworCisgICAgcFN0YURzID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIERQSF9TVEFfSEFTSF9JTkRFWF9QRUVSLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgaWYgKHBTdGFEcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKHBTdGFEcy0+YW5pUGVlciA9PSBlQU5JX0JPT0xFQU5fVFJVRSkgCisgICAgICAgICAgICBsaW1TZW5kRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwgcFN0YURzLT5ic3NJZCwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaW1TZW5kRWRjYVBhcmFtcyhwTWFjLCBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZSwgcFN0YURzLT5ic3NJZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNlbGYgZW50cnkgbWlzc2luZyBpbiBIYXNoIFRhYmxlIFxuIikpOworICAgICBzdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisgICAgfSAgICAgCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLGVMSU1fVFNNX1RJTUVSKTsKKyNlbmRpZgorCisgICAgLy8gc2VuZCBhbiBzbWUgcmVzcG9uc2UgYmFjaworICAgIGVuZDoKKyAgICAgICAgIGxpbVNlbmRTbWVEZWx0c1JzcChwTWFjLCBwRGVsdHNSZXEsIGVTSVJfU1VDQ0VTUyxwc2Vzc2lvbkVudHJ5LHNtZXNlc3Npb25JZCxzbWV0cmFuc2FjdGlvbklkKTsKK30KKworCit2b2lkCitsaW1Qcm9jZXNzU21lQWRkdHNSc3BUaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHBhcmFtKQoreworICAgIC8vZmV0Y2ggdGhlIHNlc3Npb25FbnRyeSBiYXNlZCBvbiB0aGUgc2Vzc2lvbklkCisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1BZGR0c1JzcFRpbWVyLnNlc3Npb25JZCkpPT0gTlVMTCkgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX1NUQV9ST0xFKSAmJiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX0JUX0FNUF9TVEFfUk9MRSkgICApCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgIkFkZHRzUnNwVGltZW91dCBpbiBub24tU3RhIHJvbGUgKCVkKVxuIiwgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSk7CisgICAgICAgIHBNYWMtPmxpbS5nTGltQWRkdHNTZW50ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoISBwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCkKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgIkFkZHRzUnNwVGltZW91dCBidXQgbm8gQWRkdHNTZW50XG4iKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocGFyYW0gIT0gcE1hYy0+bGltLmdMaW1BZGR0c1JzcFRpbWVyQ291bnQpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgQWRkdHNSc3AgVGltZXIgY291bnQgJWQgKGV4cCAlZClcbiIpLAorICAgICAgICAgICAgICAgcGFyYW0sIHBNYWMtPmxpbS5nTGltQWRkdHNSc3BUaW1lckNvdW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHRoaXMgYSByZWFsIHJlc3BvbnNlIHRpbWVvdXQKKyAgICBwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCA9IGZhbHNlOworICAgIHBNYWMtPmxpbS5nTGltQWRkdHNSc3BUaW1lckNvdW50Kys7CisKKyAgICBsaW1TZW5kU21lQWRkdHNSc3AocE1hYywgdHJ1ZSwgZVNJUl9TTUVfQUREVFNfUlNQX1RJTUVPVVQsIHBzZXNzaW9uRW50cnksIHBNYWMtPmxpbS5nTGltQWRkdHNSZXEucmVxLnRzcGVjLAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkLCBwc2Vzc2lvbkVudHJ5LT50cmFuc2FjdGlvbklkKTsKK30KKworCisvKioKKyAqIF9fbGltUHJvY2Vzc1NtZVN0YXRzUmVxdWVzdCgpCisgKgorICpGVU5DVElPTjoKKyAqIAorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NTbWVTdGF0c1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdHBBbmlHZXRTdGF0c1JlcSAgICBwU3RhdHNSZXE7CisgICAgdFNpck1zZ1EgbXNnUTsKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworICAgIHRBTklfVTggICAgIHNlc3Npb25JZDsKKworICAgIAorICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOworICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHBTdGF0c1JlcSA9ICh0cEFuaUdldFN0YXRzUmVxKSBwTXNnQnVmOworICAgIAorICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYyxwU3RhdHNSZXEtPmJzc0lkLCZzZXNzaW9uSWQpKT09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoInNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIGJzc0lkXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAgICAKKyAgICAKKyAgICBzd2l0Y2gocFN0YXRzUmVxLT5tc2dUeXBlKQorICAgIHsKKyAgICAgICAgLy9BZGQgTGltIHN0YXRzIGhlcmUuIGFuZCBzZW5kIHJlcXNwb25zZS4KKworICAgICAgICAvL0hBTCBtYWludGFpbmVkIFN0YXRzLgorICAgICAgICBjYXNlIGVXTklfU01FX1NUQV9TVEFUX1JFUToKKyAgICAgICAgICAgIG1zZ1EudHlwZSA9IFdEQV9TVEFfU1RBVF9SRVE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9BR0dSX1NUQVRfUkVROgorICAgICAgICAgICAgbXNnUS50eXBlID0gV0RBX0FHR1JfU1RBVF9SRVE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9HTE9CQUxfU1RBVF9SRVE6CisgICAgICAgICAgICBtc2dRLnR5cGUgPSBXREFfR0xPQkFMX1NUQVRfUkVROworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1RBVF9TVU1NX1JFUToKKyAgICAgICAgICAgIG1zZ1EudHlwZSA9IFdEQV9TVEFUX1NVTU1fUkVROworICAgICAgICAgICAgYnJlYWs7ICAgCisgICAgICAgIGRlZmF1bHQ6IC8vVW5rbm93biByZXF1ZXN0LgorICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCAiVW5rbm93biBTdGF0aXN0aWNzIHJlcXVlc3RcbiIpOykKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMsIHBNc2dCdWYgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICFwTWFjLT5saW0uZ0xpbVJzcFJlcWQgKSAKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMsIHBNc2dCdWYgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwTWFjLT5saW0uZ0xpbVJzcFJlcWQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwTXNnQnVmOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9ICh3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKSkpeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgIlVuYWJsZSB0byBmb3J3YXJkIHJlcXVlc3RcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisKKy8qKgorICogX19saW1Qcm9jZXNzU21lR2V0U3RhdGlzdGljc1JlcXVlc3QoKQorICoKKyAqRlVOQ1RJT046CisgKiAKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorX19saW1Qcm9jZXNzU21lR2V0U3RhdGlzdGljc1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdHBBbmlHZXRQRVN0YXRzUmVxICAgIHBQRVN0YXRzUmVxOworICAgIHRTaXJNc2dRIG1zZ1E7CisKKyAgICBwUEVTdGF0c1JlcSA9ICh0cEFuaUdldFBFU3RhdHNSZXEpIHBNc2dCdWY7CisgICAgCisgICAgLy9wUEVTdGF0c1JlcS0+bXNnVHlwZSBzaG91bGQgYmUgZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUkVRCisKKyAgICBtc2dRLnR5cGUgPSBXREFfR0VUX1NUQVRJU1RJQ1NfUkVROyAgICAKKworICAgIGlmICggIXBNYWMtPmxpbS5nTGltUnNwUmVxZCApIAorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYywgcE1zZ0J1ZiApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5nTGltUnNwUmVxZCA9IEZBTFNFOworICAgIH0KKworICAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgIG1zZ1EuYm9keXB0ciA9IHBNc2dCdWY7CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gKHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApKSl7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMsIHBNc2dCdWYgKTsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsICJVbmFibGUgdG8gZm9yd2FyZCByZXF1ZXN0XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJldHVybjsKK30KKworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc1NtZVVwZGF0ZUFQV1BTSUVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRwU2lyVXBkYXRlQVBXUFNJRXNSZXEgIHBVcGRhdGVBUFdQU0lFc1JlcTsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNlc3Npb25JZDsgIC8vUEUgc2Vzc2lvbklECisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgIEZMKCJyZWNlaXZlZCBVUERBVEVfQVBXUFNJRXNfUkVRIG1lc3NhZ2VcbiIpKTspOworICAgIAorICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmKCBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBVcGRhdGVBUFdQU0lFc1JlcSwgc2l6ZW9mKHRTaXJVcGRhdGVBUFdQU0lFc1JlcSkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcFVwZGF0ZUFQV1BTSUVzUmVxXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKGxpbVVwZGF0ZUFQV1BTSUVzUmVxU2VyRGVzKHBNYWMsIHBVcGRhdGVBUFdQU0lFc1JlcSwgKHRBTklfVTggKikgcE1zZ0J1ZikgPT0gZVNJUl9GQUlMVVJFKSkgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoInJlY2VpdmVkIGludmFsaWQgU01FX1NFVENPTlRFWFRfUkVRIG1lc3NhZ2VcbiIpKTsgCisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICAKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMsIHBVcGRhdGVBUFdQU0lFc1JlcS0+YnNzSWQsICZzZXNzaW9uSWQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJRFxuIikpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwc2Vzc2lvbkVudHJ5LT5BUFdQU0lFcywgJnBVcGRhdGVBUFdQU0lFc1JlcS0+QVBXUFNJRXMsIHNpemVvZih0U2lyQVBXUFNJRXMpKTsKKyAgICAKKyAgICBzY2hTZXRGaXhlZEJlYWNvbkZpZWxkcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICBsaW1TZW5kQmVhY29uSW5kKHBNYWMsIHBzZXNzaW9uRW50cnkpOyAKKworZW5kOgorICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBVcGRhdGVBUFdQU0lFc1JlcSk7CisgICAgcmV0dXJuOworfSAvKioqIGVuZCBfX2xpbVByb2Nlc3NTbWVVcGRhdGVBUFdQU0lFcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikgKioqLworCitzdGF0aWMgdm9pZAorX19saW1Qcm9jZXNzU21lSGlkZVNTSUQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdHBTaXJVcGRhdGVQYXJhbXMgICAgICAgcFVwZGF0ZVBhcmFtczsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5OworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgicmVjZWl2ZWQgSElERV9TU0lEIG1lc3NhZ2VcbiIpKTspOworICAgIAorICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcFVwZGF0ZVBhcmFtcyA9ICh0cFNpclVwZGF0ZVBhcmFtcylwTXNnQnVmOworICAgIAorICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsIHBVcGRhdGVQYXJhbXMtPnNlc3Npb25JZCkpID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwVXBkYXRlUGFyYW1zLT5zZXNzaW9uSWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBzZXNzaW9uIGVudHJ5ICovCisgICAgcHNlc3Npb25FbnRyeS0+c3NpZEhpZGRlbiA9IHBVcGRhdGVQYXJhbXMtPnNzaWRIaWRkZW47CisgICAKKyAgICAvKiBVcGRhdGUgYmVhY29uICovCisgICAgc2NoU2V0Rml4ZWRCZWFjb25GaWVsZHMocE1hYywgcHNlc3Npb25FbnRyeSk7CisgICAgbGltU2VuZEJlYWNvbkluZChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsgCisKKyAgICByZXR1cm47Cit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZUhpZGVTU0lEKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKSAqKiovCisKK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NTbWVTZXRXUEFSU05JRXModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgdHBTaXJVcGRhdGVBUFdQQVJTTklFc1JlcSAgcFVwZGF0ZUFQV1BBUlNOSUVzUmVxOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOyAgLy9QRSBzZXNzaW9uSUQKKworICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmKCBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBVcGRhdGVBUFdQQVJTTklFc1JlcSwgc2l6ZW9mKHRTaXJVcGRhdGVBUFdQU0lFc1JlcSkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgcFVwZGF0ZUFQV1BBUlNOSUVzUmVxXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKGxpbVVwZGF0ZUFQV1BBUlNOSUVzUmVxU2VyRGVzKHBNYWMsIHBVcGRhdGVBUFdQQVJTTklFc1JlcSwgKHRBTklfVTggKikgcE1zZ0J1ZikgPT0gZVNJUl9GQUlMVVJFKSkgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoInJlY2VpdmVkIGludmFsaWQgU01FX1NFVENPTlRFWFRfUkVRIG1lc3NhZ2VcbiIpKTsgCisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICAKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMsIHBVcGRhdGVBUFdQQVJTTklFc1JlcS0+YnNzSWQsICZzZXNzaW9uSWQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJTZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJRFxuIikpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPnJzbklFLCAmcFVwZGF0ZUFQV1BBUlNOSUVzUmVxLT5BUFdQQVJTTklFcywgc2l6ZW9mKHRTaXJSU05pZSkpOworICAgIAorICAgIGxpbVNldFJTTmllV1BBaWVmcm9tU21lU3RhcnRCU1NSZXFNZXNzYWdlKHBNYWMsICZwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPnJzbklFLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAKKyAgICBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPnByaXZhY3kgPSAxOworICAgIHBzZXNzaW9uRW50cnktPnByaXZhY3kgPSAxOworICAgIAorICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgIGxpbVNlbmRCZWFjb25JbmQocE1hYywgcHNlc3Npb25FbnRyeSk7IAorCitlbmQ6CisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcFVwZGF0ZUFQV1BBUlNOSUVzUmVxKTsKKyAgICByZXR1cm47Cit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZVNldFdQQVJTTklFcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikgKioqLworCisjZW5kaWYKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVByb2Nlc3NTbWVEZWxCYVBlZXJJbmQKK1xicmllZiBoYW5kbGVzIGluZGljYXRpb24gbWVzc2FnZSBmcm9tIEhERCB0byBzZW5kIGRlbGV0ZSBCQSByZXF1ZXN0CitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gICB0QU5JX1UzMiBwTXNnQnVmCitccmV0dXJuIE5vbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltUHJvY2Vzc1NtZURlbEJhUGVlckluZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGFzc29jSWQgPTA7CisgICAgdHBTbWVEZWxCQVBlZXJJbmQgICBwU21lRGVsQkFQZWVySW5kID0gKHRwU21lRGVsQkFQZWVySW5kKXBNc2dCdWY7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgICBwU3RhOworICAgIHRwUEVTZXNzaW9uICAgICAgICAgcHNlc3Npb25FbnRyeTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHNlc3Npb25JZDsKKyAgICAKKworCisgICAgaWYoTlVMTCA9PSBwU21lRGVsQkFQZWVySW5kKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLHBTbWVEZWxCQVBlZXJJbmQtPmJzc0lkLCZzZXNzaW9uSWQpKT09TlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiY2FsbGVkIHdpdGggc3RhSWQgPSAlZCwgdGlkID0gJWQsIGJhRGlyZWN0aW9uID0gJWRcbiIpLCAKKyAgICAgICAgICAgICAgcFNtZURlbEJBUGVlckluZC0+c3RhSWR4LCBwU21lRGVsQkFQZWVySW5kLT5iYVRJRCwgcFNtZURlbEJBUGVlckluZC0+YmFEaXJlY3Rpb24pOworCisgICAgcFN0YSA9IGRwaExvb2t1cEFzc29jSWQocE1hYywgcFNtZURlbEJBUGVlckluZC0+c3RhSWR4LCAmYXNzb2NJZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOyAgICAKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IGxpbVBvc3RNbG1EZWxCQVJlcSggcE1hYywKKyAgICAgICAgICBwU3RhLAorICAgICAgICAgIHBTbWVEZWxCQVBlZXJJbmQtPmJhRGlyZWN0aW9uLAorICAgICAgICAgIHBTbWVEZWxCQVBlZXJJbmQtPmJhVElELAorICAgICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTixwc2Vzc2lvbkVudHJ5KSkKKyAgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgICAgRkwoICJGYWlsZWQgdG8gcG9zdCBMSU1fTUxNX0RFTEJBX1JFUSB0byAiICkpOworICAgICAgaWYgKHBTdGEpCisgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBTdGEtPnN0YUFkZHIsIExPR1cpOyAKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIF9fbGltUHJvY2Vzc1JlcG9ydE1lc3NhZ2UKKyAqCisgKiBGVU5DVElPTjogIFByb2Nlc3NlcyB0aGUgbmV4dCByZWNlaXZlZCBSYWRpbyBSZXNvdXJjZSBNYW5hZ2VtZW50IG1lc3NhZ2UKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIF9fbGltUHJvY2Vzc1JlcG9ydE1lc3NhZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgc3dpdGNoIChwTXNnLT50eXBlKQorICAgeworICAgICAgY2FzZSBlV05JX1NNRV9ORUlHSEJPUl9SRVBPUlRfUkVRX0lORDoKKyAgICAgICAgIHJybVByb2Nlc3NOZWlnaGJvclJlcG9ydFJlcSggcE1hYywgcE1zZy0+Ym9keXB0ciApOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVTUF9YTUlUX0lORDoKKyAgICAgICAgeworI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAgdHBTaXJCZWFjb25SZXBvcnRYbWl0SW5kIHBCY25SZXBvcnQ9TlVMTDsKKyAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk9TlVMTDsKKyAgICAgICAgIHRBTklfVTggc2Vzc2lvbklkOworCisgICAgICAgICBpZihwTXNnLT5ib2R5cHRyID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSxGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTExcbiIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgICAgIHBCY25SZXBvcnQgPSAodHBTaXJCZWFjb25SZXBvcnRYbWl0SW5kIClwTXNnLT5ib2R5cHRyOworICAgICAgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLCBwQmNuUmVwb3J0LT5ic3NJZCwmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZFxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+aXNDQ1hjb25uZWN0aW9uKQorICAgICAgICAgICAgIGNjeFByb2Nlc3NCZWFjb25SZXBvcnRYbWl0KCBwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgIHJybVByb2Nlc3NCZWFjb25SZXBvcnRYbWl0KCBwTWFjLCBwTXNnLT5ib2R5cHRyICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICB9CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0NDWCkgfHwgZGVmaW5lZChXTEFOX0ZFQVRVUkVfVk9XSUZJKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogbGltU2VuZFNldE1heFR4UG93ZXJSZXEKKyAqCisgKiBGVU5DVElPTjogIFNlbmQgU0lSX0hBTF9TRVRfTUFYX1RYX1BPV0VSX1JFUSBtZXNzYWdlIHRvIGNoYW5nZSB0aGUgbWF4IHR4IHBvd2VyLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHR4UG93ZXIgdHhQb3dlciB0byBiZSBzZXQuCisgKiBAcGFyYW0gcFNlc3Npb25FbnRyeSBzZXNzaW9uIGVudHJ5LgorICogQHJldHVybiBOb25lCisgKi8KK3RTaXJSZXRTdGF0dXMKK2xpbVNlbmRTZXRNYXhUeFBvd2VyUmVxICggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFBvd2VyZEJtIHR4UG93ZXIsIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkgKQoreworICAgdHBNYXhUeFBvd2VyUGFyYW1zIHBNYXhUeFBhcmFtcyA9IE5VTEw7CisgICB0U2lyUmV0U3RhdHVzICByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworICAgdFNpck1zZ1EgICAgICAgbXNnUTsKKworICAgaWYoIHBTZXNzaW9uRW50cnkgPT0gTlVMTCApCisgICB7CisgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICIlczolZDogSW5hdmFsaWQgcGFyYW1ldGVyc1xuIiwgX19mdW5jX18sIF9fTElORV9fICk7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKyAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgKHZvaWQgKiopICZwTWF4VHhQYXJhbXMsIHNpemVvZih0TWF4VHhQb3dlclBhcmFtcykgKSApIAorICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCAiJXM6JWQ6VW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcE1heFR4UGFyYW1zIFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisKKyAgIH0KKyNpZiBkZWZpbmVkKFdMQU5fVk9XSUZJX0RFQlVHKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9DQ1gpCisgICBQRUxPRzEobGltTG9nKCBwTWFjLCBMT0cxLCAiJXM6JWQ6IEFsbG9jYXRlZCBtZW1vcnkgZm9yIHBNYXhUeFBhcmFtcy4uLndpbGwgYmUgZnJlZWQgaW4gb3RoZXIgbW9kdWxlXG4iLCBfX2Z1bmNfXywgX19MSU5FX18gKTspCisjZW5kaWYKKyAgIHBNYXhUeFBhcmFtcy0+cG93ZXIgPSB0eFBvd2VyOworICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1heFR4UGFyYW1zLT5ic3NJZCwgcFNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBNYXhUeFBhcmFtcy0+c2VsZlN0YU1hY0FkZHIsIHBTZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpICk7CisKKyAgICBtc2dRLnR5cGUgPSBXREFfU0VUX01BWF9UWF9QT1dFUl9SRVE7CisgICAgbXNnUS5ib2R5cHRyID0gcE1heFR4UGFyYW1zOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiUG9zdGluZyBXREFfU0VUX01BWF9UWF9QT1dFUl9SRVEgdG8gV0RBXG4iKSk7KQorICAgIGlmKGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKHBNYWMsICZtc2dRKSkpCisgICAgeworICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIndkYVBvc3RDdHJsTXNnKCkgZmFpbGVkXG4iKSk7KQorICAgICAgIGlmIChOVUxMICE9IHBNYXhUeFBhcmFtcykKKyAgICAgICB7CisgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCopcE1heFR4UGFyYW1zKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgfQorICAgIHJldHVybiByZXRDb2RlOworfQorI2VuZGlmCisKKy8qKgorICogX19saW1Qcm9jZXNzU21lQWRkU3RhU2VsZlJlcSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgU01FX0FERF9TVEFfU0VMRl9SRVEgbWVzc2FnZQorICogZnJvbSBTTUUuIEl0IHNlbmRzIGEgU0lSX0hBTF9BRERfU1RBX1NFTEZfUkVRIG1lc3NhZ2UgdG8gSEFMLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitfX2xpbVByb2Nlc3NTbWVBZGRTdGFTZWxmUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgdFNpck1zZ1EgbXNnOworICAgdHBBZGRTdGFTZWxmUGFyYW1zIHBBZGRTdGFTZWxmUGFyYW1zOworICAgdHBTaXJTbWVBZGRTdGFTZWxmUmVxIHBTbWVSZXEgPSAodHBTaXJTbWVBZGRTdGFTZWxmUmVxKSBwTXNnQnVmOworCisgICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkKiopICZwQWRkU3RhU2VsZlBhcmFtcywKKyAgICAgICAgICAgIHNpemVvZiggdEFkZFN0YVNlbGZQYXJhbXMpICkgKQorICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdEFkZFNlbGZTdGFQYXJhbXMiKSApOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQWRkU3RhU2VsZlBhcmFtcy0+c2VsZk1hY0FkZHIsIHBTbWVSZXEtPnNlbGZNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpICk7IAorCisgICBtc2cudHlwZSA9IFNJUl9IQUxfQUREX1NUQV9TRUxGX1JFUTsKKyAgIG1zZy5yZXNlcnZlZCA9IDA7CisgICBtc2cuYm9keXB0ciA9ICBwQWRkU3RhU2VsZlBhcmFtczsKKyAgIG1zZy5ib2R5dmFsID0gMDsKKworICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgic2VuZGluZyBTSVJfSEFMX0FERF9TVEFfU0VMRl9SRVEgbXNnIHRvIEhBTFxuIikpOykKKyAgICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZy50eXBlKSk7CisKKyAgIGlmKGVTSVJfU1VDQ0VTUyAhPSB3ZGFQb3N0Q3RybE1zZyhwTWFjLCAmbXNnKSkKKyAgIHsKKyAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgid2RhUG9zdEN0cmxNc2cgZmFpbGVkXG4iKSk7CisgICB9CisgICByZXR1cm47Cit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc0FkZFN0YVNlbGZSZXEoKSAqKiovCisKKworLyoqCisgKiBfX2xpbVByb2Nlc3NTbWVEZWxTdGFTZWxmUmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBTTUVfREVMX1NUQV9TRUxGX1JFUSBtZXNzYWdlCisgKiBmcm9tIFNNRS4gSXQgc2VuZHMgYSBTSVJfSEFMX0RFTF9TVEFfU0VMRl9SRVEgbWVzc2FnZSB0byBIQUwuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc1NtZURlbFN0YVNlbGZSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICB0U2lyTXNnUSBtc2c7CisgICB0cERlbFN0YVNlbGZQYXJhbXMgcERlbFN0YVNlbGZQYXJhbXM7CisgICB0cFNpclNtZURlbFN0YVNlbGZSZXEgcFNtZVJlcSA9ICh0cFNpclNtZURlbFN0YVNlbGZSZXEpIHBNc2dCdWY7CisKKyAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQqKikgJnBEZWxTdGFTZWxmUGFyYW1zLAorICAgICAgICAgICAgc2l6ZW9mKCB0RGVsU3RhU2VsZlBhcmFtcykgKSApCisgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0RGVsU3RhU2VsZlBhcmFtcyIpICk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBEZWxTdGFTZWxmUGFyYW1zLT5zZWxmTWFjQWRkciwgcFNtZVJlcS0+c2VsZk1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikgKTsgCisKKyAgIG1zZy50eXBlID0gU0lSX0hBTF9ERUxfU1RBX1NFTEZfUkVROworICAgbXNnLnJlc2VydmVkID0gMDsKKyAgIG1zZy5ib2R5cHRyID0gIHBEZWxTdGFTZWxmUGFyYW1zOworICAgbXNnLmJvZHl2YWwgPSAwOworCisgICBQRUxPR1cobGltTG9nKHBNYWMsIExPRzEsIEZMKCJzZW5kaW5nIFNJUl9IQUxfQUREX1NUQV9TRUxGX1JFUSBtc2cgdG8gSEFMXG4iKSk7KQorICAgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnLnR5cGUpKTsKKworICAgaWYoZVNJUl9TVUNDRVNTICE9IHdkYVBvc3RDdHJsTXNnKHBNYWMsICZtc2cpKQorICAgeworICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJ3ZGFQb3N0Q3RybE1zZyBmYWlsZWRcbiIpKTsKKyAgIH0KKyAgIHJldHVybjsKK30gLyoqKiBlbmQgX19saW1Qcm9jZXNzU21lRGVsU3RhU2VsZlJlcSgpICoqKi8KKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorLyoqCisgKiBfX2xpbVByb2Nlc3NTbWVSZWdpc3Rlck1nbXRGcmFtZVJlcSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgZVdOSV9TTUVfUkVHSVNURVJfTUdNVF9GUkFNRV9SRVEgbWVzc2FnZQorICogZnJvbSBTTUUuIEl0IFJlZ2lzdGVyIHRoaXMgaW5mb3JtYXRpb24gd2l0aGluIFBFLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBTTUUgbWVzc2FnZSBidWZmZXIKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorX19saW1Qcm9jZXNzU21lUmVnaXN0ZXJNZ210RnJhbWVSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpCit7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICAgdHBTaXJSZWdpc3Rlck1nbXRGcmFtZSBwU21lUmVxID0gKHRwU2lyUmVnaXN0ZXJNZ210RnJhbWUpcE1zZ0J1ZjsKKyAgICB0cExpbU1nbXRGcmFtZVJlZ2lzdHJhdGlvbiBwTGltTWdtdFJlZ2lzdHJhdGlvbiA9IE5VTEwsIHBOZXh0ID0gTlVMTDsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgCisgICAgICAgICAgIEZMKCIlczogcmVnaXN0ZXJGcmFtZSAlZCwgZnJhbWVUeXBlICVkLCBtYXRjaExlbiAlZFxuIiwgCisgICAgICAgICAgIF9fZnVuY19fLCBwU21lUmVxLT5yZWdpc3RlckZyYW1lLCBwU21lUmVxLT5mcmFtZVR5cGUsIAorICAgICAgIHBTbWVSZXEtPm1hdGNoTGVuKSkpOworCisgICAgaWYocFNtZVJlcS0+cmVnaXN0ZXJGcmFtZSkKKyAgICB7CisgICAgICAgIHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMsICh2b2lkKiopJnBMaW1NZ210UmVnaXN0cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRMaW1NZ210RnJhbWVSZWdpc3RyYXRpb24pICsgcFNtZVJlcS0+bWF0Y2hMZW4pOworICAgICAgICBpZihwTGltTWdtdFJlZ2lzdHJhdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMsICh2b2lkKilwTGltTWdtdFJlZ2lzdHJhdGlvbiwgCisgICAgICAgICAgICAgIHNpemVvZih0TGltTWdtdEZyYW1lUmVnaXN0cmF0aW9uKSArIHBTbWVSZXEtPm1hdGNoTGVuICk7CisgICAgICAgICAgICBwTGltTWdtdFJlZ2lzdHJhdGlvbi0+ZnJhbWVUeXBlID0gcFNtZVJlcS0+ZnJhbWVUeXBlOworICAgICAgICAgICAgcExpbU1nbXRSZWdpc3RyYXRpb24tPm1hdGNoTGVuICA9IHBTbWVSZXEtPm1hdGNoTGVuOworICAgICAgICAgICAgcExpbU1nbXRSZWdpc3RyYXRpb24tPnNlc3Npb25JZCA9IHBTbWVSZXEtPnNlc3Npb25JZDsKKyAgICAgICAgICAgIGlmKHBTbWVSZXEtPm1hdGNoTGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYyxwTGltTWdtdFJlZ2lzdHJhdGlvbi0+bWF0Y2hEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTbWVSZXEtPm1hdGNoRGF0YSwgcFNtZVJlcS0+bWF0Y2hMZW4pOworICAgICAgICAgICAgfQorICAgICAKKyAgICAgICAgICAgIHZvc19saXN0X2luc2VydF9mcm9udCgmcE1hYy0+bGltLmdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMaW1NZ210UmVnaXN0cmF0aW9uLT5ub2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0QU5JX0JPT0xFQU4gbWF0Y2ggPSBWT1NfRkFMU0U7CisKKyAgICAgICAgdm9zX2xpc3RfcGVla19mcm9udCgmcE1hYy0+bGltLmdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlLAorICAgICAgICAgICAgICAgICAgICh2b3NfbGlzdF9ub2RlX3QqKikmcExpbU1nbXRSZWdpc3RyYXRpb24pOworCisgICAgICAgIHdoaWxlKHBMaW1NZ210UmVnaXN0cmF0aW9uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTGltTWdtdFJlZ2lzdHJhdGlvbi0+ZnJhbWVUeXBlID09IHBTbWVSZXEtPmZyYW1lVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwU21lUmVxLT5tYXRjaExlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwTGltTWdtdFJlZ2lzdHJhdGlvbi0+bWF0Y2hMZW4gPT0gcFNtZVJlcS0+bWF0Y2hMZW4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeShwTWFjLCBwTGltTWdtdFJlZ2lzdHJhdGlvbi0+bWF0Y2hEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFNtZVJlcS0+bWF0Y2hEYXRhLCBwTGltTWdtdFJlZ2lzdHJhdGlvbi0+bWF0Y2hMZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIG1hdGNoISAqLyAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gVk9TX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZm91bmQgbWF0Y2ghICovICAgCisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gVk9TX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvc1N0YXR1cyA9IHZvc19saXN0X3BlZWtfbmV4dCAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcE1hYy0+bGltLmdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9zX2xpc3Rfbm9kZV90KikgcExpbU1nbXRSZWdpc3RyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9zX2xpc3Rfbm9kZV90KiopICZwTmV4dCApOworCisgICAgICAgICAgICBwTGltTWdtdFJlZ2lzdHJhdGlvbiA9IHBOZXh0OworICAgICAgICAgICAgcE5leHQgPSBOVUxMOyAKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICB2b3NfbGlzdF9yZW1vdmVfbm9kZSgmcE1hYy0+bGltLmdMaW1NZ210RnJhbWVSZWdpc3RyYXRpblF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9zX2xpc3Rfbm9kZV90KilwTGltTWdtdFJlZ2lzdHJhdGlvbik7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMscExpbU1nbXRSZWdpc3RyYXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfSAvKioqIGVuZCBfX2xpbVByb2Nlc3NTbWVSZWdpc3Rlck1nbXRGcmFtZVJlcSgpICoqKi8KKyNlbmRpZgorCisKKy8qKgorICogbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZSgpLiBUaGlzCisgKiBmdW5jdGlvbiBwcm9jZXNzZXMgU01FIHJlcXVlc3QgbWVzc2FnZXMgZnJvbSBIREQgb3IgdXBwZXIgbGF5ZXIKKyAqIGFwcGxpY2F0aW9uLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBtc2dUeXBlICAgSW5kaWNhdGVzIHRoZSBTTUUgbWVzc2FnZSB0eXBlCisgKiBAcGFyYW0gICpwTXNnQnVmICBBIHBvaW50ZXIgdG8gdGhlIFNNRSBtZXNzYWdlIGJ1ZmZlcgorICogQHJldHVybiBCb29sZWFuIC0gVFJVRSAtIGlmIHBNc2dCdWYgaXMgY29uc3VtZWQgYW5kIGNhbiBiZSBmcmVlZC4KKyAqICAgICAgICAgICAgICAgICAgIEZBTFNFIC0gaWYgcE1zZ0J1ZiBpcyBub3QgdG8gYmUgZnJlZWQuCisgKi8KKwordEFOSV9CT09MRUFOCitsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisgICAgdEFOSV9CT09MRUFOIGJ1ZkNvbnN1bWVkID0gVFJVRTsgLy9TZXQgdGhpcyBmbGFnIHRvIGZhbHNlIHdpdGhpbiBjYXNlIGJsb2NrIG9mIGFueSBmb2xsb3dpbmcgbWVzc2FnZSwgdGhhdCBkb2VzbnQgd2FudCBwTXNnQnVmIHRvIGJlIGZyZWVkLgorICAgIHRBTklfVTMyICpwTXNnQnVmID0gcE1zZy0+Ym9keXB0cjsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkxJTSBSZWNlaXZlZCBTTUUgTWVzc2FnZSAlcyglZCkgTGltU21lU3RhdGU6JXMoJWQpIExpbU1sbVN0YXRlOiAlcyglZClcbiIpLAorICAgICAgICAgbGltTXNnU3RyKHBNc2ctPnR5cGUpLCBwTXNnLT50eXBlLAorICAgICAgICAgbGltU21lU3RhdGVTdHIocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSksIHBNYWMtPmxpbS5nTGltU21lU3RhdGUsCisgICAgICAgICBsaW1NbG1TdGF0ZVN0cihwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSApOykKKworICAgIHN3aXRjaCAocE1zZy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1RBUlRfUkVROgorICAgICAgICAgICAgX19saW1Qcm9jZXNzU21lU3RhcnRSZXEocE1hYywgcE1zZ0J1Zik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX1NZU19SRUFEWV9JTkQ6CisgICAgICAgICAgICBidWZDb25zdW1lZCA9IF9fbGltUHJvY2Vzc1NtZVN5c1JlYWR5SW5kKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIGVXTklfU01FX1NUQVJUX0JTU19SRVE6CisgICAgICAgICAgICBidWZDb25zdW1lZCA9IF9fbGltUHJvY2Vzc1NtZVN0YXJ0QnNzUmVxKHBNYWMsIHBNc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TQ0FOX1JFUToKKyAgICAgICAgICAgIF9fbGltUHJvY2Vzc1NtZVNjYW5SZXEocE1hYywgcE1zZ0J1Zik7CisKKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICBjYXNlIGVXTklfU01FX1JFTUFJTl9PTl9DSEFOTkVMX1JFUToKKyAgICAgICAgICAgIGJ1ZkNvbnN1bWVkID0gbGltUHJvY2Vzc1JlbWFpbk9uQ2hubFJlcShwTWFjLCBwTXNnQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9TTUVfVVBEQVRFX05PQToKKyAgICAgICAgICAgIF9fbGltUHJvY2Vzc1NtZU5vQVVwZGF0ZShwTWFjLCBwTXNnQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGNhc2UgZVdOSV9TTUVfSk9JTl9SRVE6CisgICAgICAgICAgICBfX2xpbVByb2Nlc3NTbWVKb2luUmVxKHBNYWMsIHBNc2dCdWYpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX0FVVEhfUkVROgorICAgICAgICAgICAvLyBfX2xpbVByb2Nlc3NTbWVBdXRoUmVxKHBNYWMsIHBNc2dCdWYpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX1JFQVNTT0NfUkVROgorICAgICAgICAgICAgX19saW1Qcm9jZXNzU21lUmVhc3NvY1JlcShwTWFjLCBwTXNnQnVmKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9QUk9NSVNDVU9VU19NT0RFX1JFUToKKyAgICAgICAgICAgIC8vX19saW1Qcm9jZXNzU21lUHJvbWlzY3VvdXNSZXEocE1hYywgcE1zZ0J1Zik7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9TTUVfRElTQVNTT0NfUkVROgorICAgICAgICAgICAgX19saW1Qcm9jZXNzU21lRGlzYXNzb2NSZXEocE1hYywgcE1zZ0J1Zik7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9TTUVfRElTQVNTT0NfQ05GOgorICAgICAgICBjYXNlIGVXTklfU01FX0RFQVVUSF9DTkY6CisgICAgICAgICAgICBfX2xpbVByb2Nlc3NTbWVEaXNhc3NvY0NuZihwTWFjLCBwTXNnQnVmKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ERUFVVEhfUkVROgorICAgICAgICAgICAgX19saW1Qcm9jZXNzU21lRGVhdXRoUmVxKHBNYWMsIHBNc2dCdWYpOworCisgICAgICAgICAgICBicmVhazsKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1dJVENIX0NITF9SRVE6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1dJVENIX0NITF9DQl9QUklNQVJZX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TV0lUQ0hfQ0hMX0NCX1NFQ09OREFSWV9SRVE6CisgICAgICAgICAgICBidWZDb25zdW1lZCA9IF9fbGltUHJvY2Vzc1NtZVN3aXRjaENobFJlcShwTWFjLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKworICAgICAgICBjYXNlIGVXTklfU01FX1NFVENPTlRFWFRfUkVROgorICAgICAgICAgICAgX19saW1Qcm9jZXNzU21lU2V0Q29udGV4dFJlcShwTWFjLCBwTXNnQnVmKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9SRU1PVkVLRVlfUkVROgorICAgICAgICAgICAgX19saW1Qcm9jZXNzU21lUmVtb3ZlS2V5UmVxKHBNYWMsIHBNc2dCdWYpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX1NUT1BfQlNTX1JFUToKKyAgICAgICAgICAgIGJ1ZkNvbnN1bWVkID0gX19saW1Qcm9jZXNzU21lU3RvcEJzc1JlcShwTWFjLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9TTUVfQVNTT0NfQ05GOgorICAgICAgICBjYXNlIGVXTklfU01FX1JFQVNTT0NfQ05GOgorICAgICAgICAgICAgaWYgKHBNc2ctPnR5cGUgPT0gZVdOSV9TTUVfQVNTT0NfQ05GKQorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIEFTU09DX0NORiBtZXNzYWdlXG4iKSk7KQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIFJFQVNTT0NfQ05GIG1lc3NhZ2VcbiIpKTspCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgICAgICAgICAgX19saW1Qcm9jZXNzU21lQXNzb2NDbmYocE1hYywgcE1zZy0+dHlwZSwgcE1zZ0J1Zik7CisjZW5kaWYKKyAgICAgICAgICAgIF9fbGltUHJvY2Vzc1NtZUFzc29jQ25mTmV3KHBNYWMsIHBNc2ctPnR5cGUsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9BRERUU19SRVE6CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBBRERUU19SRVEgbWVzc2FnZVxuIikpOykKKyAgICAgICAgICAgIF9fbGltUHJvY2Vzc1NtZUFkZHRzUmVxKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ERUxUU19SRVE6CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJSZWNlaXZlZCBERUxUU19SRVEgbWVzc2FnZVxuIikpOykKKyAgICAgICAgICAgIF9fbGltUHJvY2Vzc1NtZURlbHRzUmVxKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTElNX0FERFRTX1JTUF9USU1FT1VUOgorICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiUmVjZWl2ZWQgU0lSX0xJTV9BRERUU19SU1BfVElNRU9VVCBtZXNzYWdlIFxuIikpOykKKyAgICAgICAgICAgIGxpbVByb2Nlc3NTbWVBZGR0c1JzcFRpbWVvdXQocE1hYywgcE1zZy0+Ym9keXZhbCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX1NUQV9TVEFUX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9BR0dSX1NUQVRfUkVROgorICAgICAgICBjYXNlIGVXTklfU01FX0dMT0JBTF9TVEFUX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TVEFUX1NVTU1fUkVROgorICAgICAgICAgICAgX19saW1Qcm9jZXNzU21lU3RhdHNSZXF1ZXN0KCBwTWFjLCBwTXNnQnVmKTsKKyAgICAgICAgICAgIC8vSEFMIGNvbnN1bWVzIHBNc2dCdWYuIEl0IHdpbGwgYmUgZnJlZWQgdGhlcmUuIFNldCBidWZDb25zdW1lZCB0byBmYWxzZS4KKyAgICAgICAgICAgIGJ1ZkNvbnN1bWVkID0gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9HRVRfU1RBVElTVElDU19SRVE6CisgICAgICAgICAgICBfX2xpbVByb2Nlc3NTbWVHZXRTdGF0aXN0aWNzUmVxdWVzdCggcE1hYywgcE1zZ0J1Zik7CisgICAgICAgICAgICAvL0hBTCBjb25zdW1lcyBwTXNnQnVmLiBJdCB3aWxsIGJlIGZyZWVkIHRoZXJlLiBTZXQgYnVmQ29uc3VtZWQgdG8gZmFsc2UuCisgICAgICAgICAgICBidWZDb25zdW1lZCA9IEZBTFNFOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ERUxfQkFfUEVFUl9JTkQ6CisgICAgICAgICAgICBsaW1Qcm9jZXNzU21lRGVsQmFQZWVySW5kKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfR0VUX1NDQU5ORURfQ0hBTk5FTF9SRVE6CisgICAgICAgICAgICBsaW1Qcm9jZXNzU21lR2V0U2NhbkNoYW5uZWxJbmZvKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBjYXNlIGVXTklfU01FX0dFVF9BU1NPQ19TVEFTX1JFUToKKyAgICAgICAgICAgIGxpbVByb2Nlc3NTbWVHZXRBc3NvY1NUQXNJbmZvKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfVEtJUF9DTlRSX01FQVNfUkVROgorICAgICAgICAgICAgbGltUHJvY2Vzc1RraXBDb3VudGVyTWVhc3VyZXMocE1hYywgcE1zZ0J1Zik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgIGNhc2UgZVdOSV9TTUVfSElERV9TU0lEX1JFUTogCisgICAgICAgICAgICBfX2xpbVByb2Nlc3NTbWVIaWRlU1NJRChwTWFjLCBwTXNnQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgZVdOSV9TTUVfVVBEQVRFX0FQV1BTSUVfUkVROiAKKyAgICAgICAgICAgIF9fbGltUHJvY2Vzc1NtZVVwZGF0ZUFQV1BTSUVzKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfR0VUX1dQU1BCQ19TRVNTSU9OX1JFUToKKyAgICAgICAgICAgICBsaW1Qcm9jZXNzU21lR2V0V1BTUEJDU2Vzc2lvbnMocE1hYywgcE1zZ0J1Zik7IAorICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgCisgICAgICAgIGNhc2UgZVdOSV9TTUVfU0VUX0FQV1BBUlNOSUVzX1JFUToKKyAgICAgICAgICAgICAgX19saW1Qcm9jZXNzU21lU2V0V1BBUlNOSUVzKHBNYWMsIHBNc2dCdWYpOyAgICAgICAgCisgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmICAgICAgICAgICAgCisgICAgICAgICAgICAKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkgCisgICAgICAgIGNhc2UgZVdOSV9TTUVfTkVJR0hCT1JfUkVQT1JUX1JFUV9JTkQ6CisgICAgICAgIGNhc2UgZVdOSV9TTUVfQkVBQ09OX1JFUE9SVF9SRVNQX1hNSVRfSU5EOgorICAgICAgICAgICAgX19saW1Qcm9jZXNzUmVwb3J0TWVzc2FnZShwTWFjLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgY2FzZSBlV05JX1NNRV9GVF9QUkVfQVVUSF9SRVE6CisgICAgICAgICAgICBidWZDb25zdW1lZCA9ICh0QU5JX0JPT0xFQU4pbGltUHJvY2Vzc0ZUUHJlQXV0aFJlcShwTWFjLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgZVdOSV9TTUVfRlRfVVBEQVRFX0tFWToKKyAgICAgICAgICAgIGxpbVByb2Nlc3NGVFVwZGF0ZUtleShwTWFjLCBwTXNnQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBlV05JX1NNRV9GVF9BR0dSX1FPU19SRVE6CisgICAgICAgICAgICBsaW1Qcm9jZXNzRlRBZ2dyUW9zUmVxKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgIGNhc2UgZVdOSV9TTUVfQ0NYX0FESkFDRU5UX0FQX1JFUE9SVDoKKyAgICAgICAgICAgIGxpbVByb2Nlc3NBZGphY2VudEFQUmVwTXNnICggcE1hYywgcE1zZ0J1ZiApOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICBjYXNlIGVXTklfU01FX0FERF9TVEFfU0VMRl9SRVE6CisgICAgICAgICAgICBfX2xpbVByb2Nlc3NTbWVBZGRTdGFTZWxmUmVxKCBwTWFjLCBwTXNnQnVmICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ERUxfU1RBX1NFTEZfUkVROgorICAgICAgICAgICAgX19saW1Qcm9jZXNzU21lRGVsU3RhU2VsZlJlcSggcE1hYywgcE1zZ0J1ZiApOworICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIGNhc2UgZVdOSV9TTUVfUkVHSVNURVJfTUdNVF9GUkFNRV9SRVE6CisgICAgICAgICAgICBfX2xpbVByb2Nlc3NTbWVSZWdpc3Rlck1nbXRGcmFtZVJlcSggcE1hYywgcE1zZ0J1ZiApOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgICAgICAgIAorICAgICAgICAgICAgCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgcE1zZy0+Ym9keXB0ciA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9IC8vIHN3aXRjaCAobXNnVHlwZSkKKworICAgIHJldHVybiBidWZDb25zdW1lZDsKK30gLyoqKiBlbmQgbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzKCkgKioqLwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9wRXh0c1V0aWxzLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb3BFeHRzVXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmQ4MjRmCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9wRXh0c1V0aWxzLmMKQEAgLTAsMCArMSwxNDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbVByb3BFeHRzVXRpbHMuY2MgY29udGFpbnMgdGhlIHV0aWxpdHkgZnVuY3Rpb25zCisgKiB0byBwb3B1bGF0ZSwgcGFyc2UgcHJvcHJpZXRhcnkgZXh0ZW5zaW9ucyByZXF1aXJlZCB0bworICogc3VwcG9ydCBBTkkgZmVhdHVyZSBzZXQuCisgKgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMTEvMjcvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisjZWxzZQorI2luY2x1ZGUgInduaUNmZ1N0YS5oIgorI2VuZGlmCisjaW5jbHVkZSAic2lyQ29tbW9uLmgiCisjaW5jbHVkZSAic2lyRGVidWcuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImNmZ0FwaS5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxDb21tb25BcGkuaCIKKyNlbmRpZgorI2luY2x1ZGUgImxpbUFwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltUHJvcEV4dHNVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAibGltVHJhY2UuaCIKKyNpbmNsdWRlICJsaW1TZXNzaW9uLmgiCisKKyNkZWZpbmUgTElNX0dFVF9OT0lTRV9NQVhfVFJZIDUKKyNpZiAoZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSB8fCBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKy8qKgorICogbGltR2V0Q3VycmVudExlYXJuQ2hhbm5lbCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHZhcmlvdXMgcGxhY2VzIHRvIGdldCBjdXJyZW50IGNoYW5uZWwKKyAqIG51bWJlciBiZWluZyAnbGVhcm5lZCcuCisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gQ2hhbm5lbCBudW1iZXIKKyAqLwordEFOSV9VOAorbGltR2V0Q3VycmVudExlYXJuQ2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTggKnBDaGFuTnVtID0gcE1hYy0+bGltLmdwTGltTWVhc1JlcS0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlcjsKKworICAgIHJldHVybiAoKihwQ2hhbk51bSArIHBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5uZXh0TGVhcm5DaGFubmVsSWQpKTsKK30gLyoqKiBlbmQgbGltR2V0Q3VycmVudExlYXJuQ2hhbm5lbCgpICoqKi8KKyNlbmRpZiAvLyNpZiAoZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSB8fCBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKworLyoqCisgKiBsaW1FeHRyYWN0QXBDYXBhYmlsaXR5KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZXh0cmFjdCBBUCdzIEhDRi9XTUUvV1NNIGNhcGFiaWxpdHkKKyAqIGZyb20gdGhlIElFcyByZWNlaXZlZCBmcm9tIGl0IGluIEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBmcmFtZXMKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAgcElFICAgICAgIFBvaW50ZXIgdG8gc3RhcnRpbmcgSUUgaW4gQmVhY29uL1Byb2JlIFJlc3BvbnNlCisgKiBAcGFyYW0gICBpZUxlbiAgICAgTGVuZ3RoIG9mIGFsbCBJRXMgY29tYmluZWQKKyAqIEBwYXJhbSAgIHFvc0NhcCAgICBCaXRzIGFyZSBzZXQgYWNjb3JkaW5nIHRvIGNhcGFiaWxpdGllcworICogQHJldHVybiAgMCAtIElmIEFQIGRvZXMgbm90IGFzc2VydCBIQ0YgY2FwYWJpbGl0eSAmIDEgLSBvdGhlcndpc2UKKyAqLworCit2b2lkCitsaW1FeHRyYWN0QXBDYXBhYmlsaXR5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBJRSwgdEFOSV9VMTYgaWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnFvc0NhcCwgdEFOSV9VMTYgKnByb3BDYXAsIHRBTklfVTggKnVhcHNkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgdFBvd2VyZEJtICpsb2NhbENvbnN0cmFpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIHRTaXJQcm9iZVJlc3BCZWFjb24gYmVhY29uU3RydWN0OworI2lmICFkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIGxvY2FsUG93ZXJDb25zdHJhaW50cyA9IDA7CisjZW5kaWYKKworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZiZWFjb25TdHJ1Y3QsIHNpemVvZihiZWFjb25TdHJ1Y3QpKTsKKworICAgICpxb3NDYXAgPSAwOworICAgICpwcm9wQ2FwID0gMDsKKyAgICAqdWFwc2QgPSAwOworCisgICAgUEVMT0czKGxpbUxvZyggcE1hYywgTE9HMywKKyAgICAgICAgRkwoIkluIGxpbUV4dHJhY3RBcENhcGFiaWxpdHk6IFRoZSBJRSdzIGJlaW5nIHJlY2VpdmVkIGFyZTpcbiIpKTsKKyAgICBzaXJEdW1wQnVmKCBwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMywgcElFLCBpZUxlbiApOykKKyAgICBpZiAoc2lyUGFyc2VCZWFjb25JRShwTWFjLCAmYmVhY29uU3RydWN0LCBwSUUsICh0QU5JX1UzMilpZUxlbikgPT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICAgICAgaWYgKGJlYWNvblN0cnVjdC5wcm9wSUVpbmZvLmhjZkVuYWJsZWQpCisgICAgICAgICAgICBMSU1fQlNTX0NBUFNfU0VUKEhDRiwgKnFvc0NhcCk7CisjZW5kaWYKKyAgICAgICAgaWYgKGJlYWNvblN0cnVjdC53bWVJbmZvUHJlc2VudCB8fCBiZWFjb25TdHJ1Y3Qud21lRWRjYVByZXNlbnQpCisgICAgICAgICAgICBMSU1fQlNTX0NBUFNfU0VUKFdNRSwgKnFvc0NhcCk7CisgICAgICAgIGlmIChMSU1fQlNTX0NBUFNfR0VUKFdNRSwgKnFvc0NhcCkgJiYgYmVhY29uU3RydWN0LndzbUNhcGFibGVQcmVzZW50KQorICAgICAgICAgICAgTElNX0JTU19DQVBTX1NFVChXU00sICpxb3NDYXApOworICAgICAgICBpZiAoYmVhY29uU3RydWN0LnByb3BJRWluZm8uYW5pSW5kaWNhdG9yICYmCisgICAgICAgICAgICBiZWFjb25TdHJ1Y3QucHJvcElFaW5mby5jYXBhYmlsaXR5UHJlc2VudCkKKyAgICAgICAgICAgICpwcm9wQ2FwID0gYmVhY29uU3RydWN0LnByb3BJRWluZm8uY2FwYWJpbGl0eTsKKyAgICAgICAgaWYgKGJlYWNvblN0cnVjdC5IVENhcHMucHJlc2VudCkKKyAgICAgICAgICAgIHBNYWMtPmxpbS5odENhcGFiaWxpdHlQcmVzZW50SW5CZWFjb24gPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwTWFjLT5saW0uaHRDYXBhYmlsaXR5UHJlc2VudEluQmVhY29uID0gMDsKKworICAgICAgICAvLyBFeHRyYWN0IHRoZSBVQVBTRCBmbGFnIGZyb20gV01NIFBhcmFtZXRlciBlbGVtZW50CisgICAgICAgIGlmIChiZWFjb25TdHJ1Y3Qud21lRWRjYVByZXNlbnQpCisgICAgICAgICAgICAqdWFwc2QgPSBiZWFjb25TdHJ1Y3QuZWRjYVBhcmFtcy5xb3NJbmZvLnVhcHNkOworCisjaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgIC8qIElmIHRoZXJlIGlzIFBvd2VyIENvbnN0cmFpbnQgRWxlbWVudCBzcGVjaWZpY2FsbHksCisgICAgICAgICAqIGFkYXB0IHRvIGl0LiBIZW5jZSB0aGVyZSBpcyBlbHNlIGNvbmRpdGlvbiBjaGVjaworICAgICAgICAgKiBmb3IgdGhpcyBpZiBzdGF0ZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBpZiAoIGJlYWNvblN0cnVjdC5jY3hUeFB3ci5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICAqbG9jYWxDb25zdHJhaW50ID0gYmVhY29uU3RydWN0LmNjeFR4UHdyLnBvd2VyX2xpbWl0OworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAoYmVhY29uU3RydWN0LnBvd2VyQ29uc3RyYWludFByZXNlbnQgJiYgKCBwTWFjLT5saW0uZ0xpbTExaEVuYWJsZQorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgICAgICAgICAgICAgICB8fCBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnJybUVuYWJsZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICkpCisgICAgICAgIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkgCisgICAgICAgICAgICpsb2NhbENvbnN0cmFpbnQgLT0gYmVhY29uU3RydWN0LmxvY2FsUG93ZXJDb25zdHJhaW50LmxvY2FsUG93ZXJDb25zdHJhaW50czsKKyNlbHNlCisgICAgICAgICAgIGxvY2FsUG93ZXJDb25zdHJhaW50cyA9ICh0QU5JX1UzMiliZWFjb25TdHJ1Y3QubG9jYWxQb3dlckNvbnN0cmFpbnQubG9jYWxQb3dlckNvbnN0cmFpbnRzOworI2VuZGlmCisgICAgICAgIH0KKworI2lmICFkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAgICAgaWYgKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlQsIGxvY2FsUG93ZXJDb25zdHJhaW50cykgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkNvdWxkIG5vdCB1cGRhdGUgbG9jYWwgcG93ZXIgY29uc3RyYWludCB0byBjZmcuXG4iKSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybjsKK30gLyoqKioqKiBlbmQgbGltRXh0cmFjdEFwQ2FwYWJpbGl0eSgpICoqKioqKi8KKworCisKKyNpZiAoZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSB8fCBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKy8qKgorICogbGltUXVpZXRCc3MoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBxdWlldCB0aGUgQlNTCisgKiB3aGlsZSBlbnRlcmluZyBpbnRvIExlYXJuIG1vZGUKKyAqCisgKkxPR0lDOgorICogRGF0YSBmcmFtZSB0byBzZWxmIHdpdGggZHVyYXRpb24gdmFsdWUgcGFzc2VkIGlzCisgKiB0cmFuc21pdHRlZAorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIElmIGFsbCBhc3NvY2lhdGVkIFNUQXMgYXJlIDExaCBjb21wbGlhbnQsIFF1aWV0IElFCisgKiBuZWVkIHRvIGJlIHNlbnQgaW4gQmVhY29uL1Byb2JlIFJlc3BvbnNlIGZyYW1lcy4KKyAqCisgKiBAcGFyYW0gICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAgZHVyYXRpb24gIFNwZWNpZmllcyBxdWlldCBkdXJhdGlvbiBpbiBtaWxsaXNlYworICogQHJldHVybiAgTm9uZQorICovCisKK3ZvaWQKK2xpbVF1aWV0QnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGR1cmF0aW9uKQoreworCisgICAgLy8gVGVtcG9yYXJpbHkgbm90IHF1aWV0aW5nIEJTUworICAgICh2b2lkKSBwTWFjOyAodm9pZCkgZHVyYXRpb247CisgICAgcmV0dXJuOworfSAvKioqKioqIGVuZCBsaW1RdWlldEJzcygpICoqKioqKi8KKworCisKKy8qKgorICogbGltSXNNYXRyaXhOb2RlUHJlc2VudCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRldGVybWluZSBpZiBtZWFzdXJlbWVudHMgYXJlCisgKiBhbHJlYWR5IG1hZGUgb24gdGhlIGN1cnJlbnQgbGVhcm4gY2hhbm5lbAorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gICBwTWFjICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gIHBOb2RlIC0gUG9pbnRlciB0byBNYXRyaXggbm9kZSBpZiBmb3VuZC4gRWxzZSBOVUxMCisgKi8KKworc3RhdGljIHRwTGltTWVhc01hdHJpeE5vZGUKK2xpbUlzTWF0cml4Tm9kZVByZXNlbnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1U4ICAgaSwgY2hhbk51bSA9IGxpbUdldEN1cnJlbnRMZWFybkNoYW5uZWwocE1hYyk7CisgICAgdHBMaW1NZWFzTWF0cml4Tm9kZSBwTm9kZSA9IHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5wTWVhc01hdHJpeEluZm87CisKKyAgICBpZiAoIXBOb2RlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVsczsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBOb2RlLT5tYXRyaXguY2hhbm5lbE51bWJlciA9PSBjaGFuTnVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcE5vZGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE5vZGUtPm5leHQpCisgICAgICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfSAvKioqKioqIGVuZCBsaW1Jc01hdHJpeE5vZGVQcmVzZW50KCkgKioqKioqLworCisKKworLyoqCisgKiBsaW1HZXRNYXRyaXhOb2RlKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IGEgbWV0cmljcyBub2RlIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIGN1cnJlbnQgbWVhc3VyZW1lbnQgY2hhbm5lbC4gSWYgbm8gbm9kZSBpcyBmb3VuZAorICogZm9yIHRoaXMgY2hhbm5lbCwgb25lIGlzIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuICBOb25lCisgKi8KKworc3RhdGljIHRwTGltTWVhc01hdHJpeE5vZGUKK2xpbUdldE1hdHJpeE5vZGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0cExpbU1lYXNNYXRyaXhOb2RlICAgICAgIHBOZXdNYXRyaXg7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICBzdGF0dXM7CisKKyAgICBwTmV3TWF0cml4ID0gbGltSXNNYXRyaXhOb2RlUHJlc2VudChwTWFjKTsKKyAgICBpZiAoIXBOZXdNYXRyaXgpCisgICAgeworICAgICAgICAvLyBNYWtpbmcgZmlyc3QgdGltZSBtZWFzdXJlbWVudHMgb24gdGhpcyBjaGFubmVsLgorICAgICAgICAvLyBBZGQgbWF0cml4IG5vZGUgZm9yIHRoaXMgYXQgdGhlIGZyb250LgorICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBOZXdNYXRyaXgsIHNpemVvZigqcE5ld01hdHJpeCkpOyAgICAgICAgCisgICAgICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgZm9yIG5ldyBtZWFzTWF0cml4IE5vZGUKKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgicGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBuZXcgbWVhc01hdHJpeCBOb2RlXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopcE5ld01hdHJpeCwgc2l6ZW9mKCpwTmV3TWF0cml4KSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgZm9yIG5ldyBtZWFzTWF0cml4IE5vZGUKKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgicGFsWmVyb01lbW9yeSBmYWlsZWQgZm9yIG5ldyBtZWFzTWF0cml4IE5vZGVcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwTmV3TWF0cml4LT5tYXRyaXguY2hhbm5lbE51bWJlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUdldEN1cnJlbnRMZWFybkNoYW5uZWwocE1hYyk7CisgICAgICAgIHBOZXdNYXRyaXgtPmF2Z1Jzc2kgICAgICAgICAgICAgID0gMDsKKworICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIkFkZGluZyBuZXcgTWF0cml4IGluZm86Y2hhbm5lbCM9JWRcbiIpLAorICAgICAgICAgICAgICAgcE5ld01hdHJpeC0+bWF0cml4LmNoYW5uZWxOdW1iZXIpOykKKworICAgICAgICBwTmV3TWF0cml4LT5uZXh0ID0gcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPnBNZWFzTWF0cml4SW5mbzsKKyAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPnBNZWFzTWF0cml4SW5mbyA9IHBOZXdNYXRyaXg7CisgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5udW1NYXRyaXhOb2RlcysrOworICAgIH0KKworICAgIHJldHVybiBwTmV3TWF0cml4OworfSAvKioqKioqIGVuZCBsaW1HZXRNYXRyaXhOb2RlKCkgKioqKioqLworCisKKworLyoqCisgKiBsaW1Db21wdXRlQXZnKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY29tcHV0ZSBleHBvbmVudGlhbCBhdmVyYWdlCisgKiBvZiBSU1NJLCBjaGFubmVsIHV0aWxpemF0aW9uIGV0Yy4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgIG9sZFZhbCAgICBQcmV2aW91cyBhdmVyYWdlZCB2YWx1ZQorICogQHBhcmFtICAgbmV3VmFsICAgIE5ldyBhdmVyYWdlZCB2YWx1ZQorICogQHJldHVybiAgTm9uZQorICovCisKK3RBTklfVTMyCitsaW1Db21wdXRlQXZnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIG9sZFZhbCwgdEFOSV9VMzIgbmV3VmFsKQoreworICAgIHJldHVybiAoaGFsRXhwQXZnKG5ld1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBvbGRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLnJzc2lBbHBoYSkpOworfSAvKioqKioqIGVuZCBsaW1Db21wdXRlQXZnKCkgKioqKioqLworCisKKworLyoqCisgKiBsaW1Db2xsZWN0UlNTSSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNvbGxlY3QgUlNTSSBtZWFzdXJlbWVudHMgb24KKyAqIHRoZSBjdXJyZW50IGxlYXJuIGNoYW5uZWwKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gIE5vbmUKKyAqLworCit2b2lkCitsaW1Db2xsZWN0UlNTSSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRwTGltTWVhc01hdHJpeE5vZGUgIHBOZXdNYXRyaXggPSBsaW1HZXRNYXRyaXhOb2RlKHBNYWMpOworICAgIHRBTklfVTMyIGksIG5vaXNlOworCisgICAgZm9yIChpID0gMDsgaSA8IExJTV9HRVRfTk9JU0VfTUFYX1RSWTsgaSsrKQorICAgICAgICBpZiAoKG5vaXNlID0gaGFsR2V0Tm9pc2UocE1hYykpICE9IEhBTF9OT0lTRV9JTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgICBwTmV3TWF0cml4LT5hdmdSc3NpID0gbGltQ29tcHV0ZUF2ZyhwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5ld01hdHJpeC0+YXZnUnNzaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cit9IC8qKioqKiogZW5kIGxpbUNvbGxlY3RSU1NJKCkgKioqKioqLworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgICAgbGltR2V0TmVpZ2hib3VyQnNzTm9kZQorCitcYnJpZWYgICAgcmV0dXJucyBuZWlnaGJvdXIgYnNzIG5vZGUgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBsaXN0LgorXHBhcmFtIHBNYWMKK1xwYXJhbSBic3NpZCAtIEJzc2lkIG9mIG5ldyBiZWFjb24gb3IgZGF0YSBwYWNrZXQuCitccGFyYW0gcFNzSWQgLSBQb2ludGVyIHRvIFNTSUQgb2YgbmV3IHBhY2tldC4KK1xwYXJhbSBud1R5cGUgLSAxMWIvZy9hCitccGFyYW0gY2hhbklkIC0gQ2hhbm5lbCBpbiB3aGljaCB3ZSByZWNlaXZlZCB0aGUgcGFja2V0LgorCitccmV0dXJuIHRwTGltTmVpZ2hib3JCc3NXZHNOb2RlIG9yIE5VTEwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHRwTGltTmVpZ2hib3JCc3NXZHNOb2RlCitsaW1HZXROZWlnaGJvdXJCc3NOb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKmJzc0lkLCB0QU5JX1U4IGNoYW5JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck53VHlwZSBud1R5cGUsIHRwQW5pU1NJRCBwU3NJZCwgdEFOSV9VOCB0eXBlKQoreworICAgIHRwTGltTmVpZ2hib3JCc3NXZHNOb2RlIHBOb2RlID0gcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPnBOZWlnaGJvcldkc0luZm87CisKKyAgICB3aGlsZSAocE5vZGUpCisgICAgeworICAgICAgICAvL0RvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHNzSWQgYWxzbyA/CisgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uYnNzSWQsCisgICAgICAgICAgICAgICAgICAgIGJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKSAmJgorICAgICAgICAgICAgICAgIChwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uY2hhbm5lbElkID09IGNoYW5JZCkpCisgICAgICAgIHsKKyNpZiAwCisvKiogQ29tbWVudGVkIG91dCBhc3N1bWluZyB0aGF0IGNvbXBhcmluZyBic3NJZCBhbmQgQ2hhbklkIHdvdWxkIGJlIGVub3VnaCB0bwordW5pcXVlbHkgaWRlbnRpZnkgYSBwYXJ0aWN1bGFyIEJTUywgVW5jb21tZW50IGlmIHN0cmljdCBjaGVja2luZyBpcyBuZWVkZWQsCitldmVudGhvdWdoIG5vdCBwb3NzaWJsZSBpZiBwYWNrZXQgdHlwZSBpcyBEQVRBLiAqLworICAgICAgICAgICAgaWYgKHR5cGUgPT0gZVNJUl9NQUNfTUdNVF9GUkFNRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiogQmVhY29uIEZyYW1lICovCisgICAgICAgICAgICAgICAgaWYgKHBhbEVxdWFsTWVtb3J5KHBNYWMtPmhIZGQsICZwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3NJZCwgcFNzSWQtPmxlbmd0aCsxKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ubndUeXBlID09IG53VHlwZSkpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBOb2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgIHJldHVybiBwTm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcE5vZGUtPm5leHQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvKioKKyAqIGxpbUNvbGxlY3RNZWFzdXJlbWVudERhdGEoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIHJlY2VpdmluZyBCZWFjb24vUHJvYmUgUmVzcG9uc2UKKyAqIG9yIERhdGEgZnJhbWVzIHRvIGNvbGxlY3QgbWVhc3VyZW1lbnQgcmVsYXRlZCBkYXRhLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwUnhQYWNrZXRJbmZvICAgICAgLSBQb2ludGVyIHRvIHJlY2VpdmVkIEJEK3BheWxvYWQKKyAqIEBwYXJhbSAgcEJlYWNvbiAgLSBQb2ludGVyIHRvIHBhcnNlZCBCU1MgaW5mbworICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltQ29sbGVjdE1lYXN1cmVtZW50RGF0YSh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcFJ4UGFja2V0SW5mbywgdHBTY2hCZWFjb25TdHJ1Y3QgcEJlYWNvbikKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBhbGxvY0xlbj0wLCBsZW49MCwgcmVhbExlbj0wLCBpZUxlbj0wOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBmb3VuZCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIHRTaXJNYWNGcmFtZUN0bCAgICAgICAgIGZjIDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICAgICBic3NJZFJjdjsKKyAgICB0U2lyTndUeXBlICAgICAgICAgICAgICBud1R5cGU7CisgICAgdEFuaVNTSUQgICAgICAgICAgICAgICAgc3NJZDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBjaGFuSWQgPSAwOworICAgIHRwTGltTmVpZ2hib3JCc3NXZHNOb2RlIHBOb2RlID0gTlVMTDsKKyAgICB0cExpbU1lYXNNYXRyaXhOb2RlICAgICBwTmV3TWF0cml4OworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICBwSGRyOworCisgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJDb2xsZWN0aW5nIG1lYXN1cmVtZW50IGRhdGEgZm9yIFJhZGlvSWQgJWRcbiIpLAorICAgICAgICAgICBwTWFjLT5zeXMuZ1NpclJhZGlvSWQpOykKKworICAgIHRBTklfVTMyIGlnbm9yZSA9IDA7CisgICAgbGltR2V0QnNzaWRGcm9tQkQocE1hYywgKHRwSGFsQnVmRGVzYykgcFJ4UGFja2V0SW5mbywgYnNzSWRSY3YsICZpZ25vcmUpOworICAgIGlmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwgYnNzSWRSY3YsIHBNYWMtPmxpbS5nTGltQnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpKQorICAgIHsKKyAgICAgICAgLy8gUGFja2V0IHJlY2VpdmVkIGZyb20gb3VyIG93biBCU1MsIGRvbnQgdGFrZSBtZWFzdXJlbWVudC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworICAgIGZjID0gcEhkci0+ZmM7CisKKyAgICBpZiAoZmMudHlwZSA9PSBTSVJfTUFDX0RBVEFfRlJBTUUpCisgICAgeworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJSZWNlaXZlZCBEQVRBIHBhY2tldFxuIikpOykKKyAgICAgICAgc3NJZC5sZW5ndGggPSAwOworICAgICAgICBpZUxlbiA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qKiBQcm9iZSByZXNwb25zZSBvciBiZWFjY29uIHBhY2tldCAqLworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopJnNzSWQsICh2b2lkICopICZwQmVhY29uLT5zc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNzSWQpKTsKKyAgICAgICAgY2hhbklkID0gbGltR2V0Q2hhbm5lbEZyb21CZWFjb24ocE1hYywgcEJlYWNvbik7CisgICAgICAgIGllTGVuID0gcEJlYWNvbi0+d3BhLmxlbmd0aCArIHBCZWFjb24tPnByb3BJRWluZm8ud2RzTGVuZ3RoOworICAgIH0KKworICAgIGlmIChjaGFuSWQgPT0gMCkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgY2hhbm5lbCBJZCBpcyBub3QgcmV0cmlldmVkIGZyb20gQmVhY29uLCBleHRyYWN0IHRoZSBjaGFubmVsIGZyb20gQkQgKi8KKyAgICAgIC8qIFVubWFwcGVkIHRoZSBjaGFubmVsLlRoaXMgV2UgaGF2ZSB0byBkbyBzaW5jZSB3ZSBoYXZlIGRvbmUgbWFwcGluZyBpbiB0aGUgaGFsIHRvCisgICAgICAgICBvdmVyY29tZSAgdGhlIGxpbWl0YXRpb24gb2YgUlhCRCBvZiBub3QgYWJsZSB0byBhY2NvbW9kYXRlIHRoZSBiaWdnZXIgY2hhbm5lbCBudW1iZXIuKi8KKyAgICAgIGNoYW5JZCA9IFdEQV9HRVRfUlhfQ0gocFJ4UGFja2V0SW5mbyk7CisgICAgICBpZighKCBjaGFuSWQgPSBsaW1Vbm1hcENoYW5uZWwoY2hhbklkKSkpIAorICAgICAgeworICAgICAgICAgICBjaGFuSWQgPSBwTWFjLT5saW0uZ0xpbUN1cnJlbnRTY2FuQ2hhbm5lbElkOworICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTm93IGFsd2F5cyByZXR1cm5zIG53VHlwZSBhcyAxMUcgZm9yIGRhdGEgcGFja2V0cyAtIEZJWElUCisgICAgICovCisgICAgbndUeXBlID0gbGltR2V0TndUeXBlKHBNYWMsIGNoYW5JZCwgZmMudHlwZSwgcEJlYWNvbik7CisKKyAgICBwTmV3TWF0cml4ID0gbGltR2V0TWF0cml4Tm9kZShwTWFjKTsKKyAgICAvKiogTE9HUCB3b3VsZCByZXN1bHQgaW4gZnJlZWluZyBhbGwgZHluYW1pY2FsbCBhbGxvY2F0ZWQgbWVtb3JpZXMuIFNvCisgICAgICAqICByZXR1cm4gZnJvbSBoZXJlIGlmIGxpbUdldE1hdHJpeE5vZGUgcmV0dXJucyBOVUxMCisgICAgICAqLworICAgIGlmICghcE5ld01hdHJpeCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcE5ld01hdHJpeC0+bWF0cml4LmFnZ3JSc3NpICs9IFdEQV9HRVRfUlhfUlNTSV9EQihwUnhQYWNrZXRJbmZvKTsKKyAgICBwTmV3TWF0cml4LT5tYXRyaXgudG90YWxQYWNrZXRzKys7CisKKyAgICAvLyBGaW5kIGlmIHRoaXMgbmVpZ2hib3IgaXMgYWxyZWFkeSAnbGVhcm5lZCcKKyAgICAvLyBJZiBmb3VuZCwgdXBkYXRlIGl0cyBpbmZvcm1hdGlvbi4KKyAgICBwTm9kZSA9IGxpbUdldE5laWdoYm91ckJzc05vZGUocE1hYywgYnNzSWRSY3YsIGNoYW5JZCwgbndUeXBlLCAmc3NJZCwgZmMudHlwZSk7CisKKyAgICBpZiAoIXBOb2RlKQorICAgIHsKKyAgICAgICAgcmVhbExlbiA9IHNpemVvZih0U2lyTmVpZ2hib3JCc3NXZHNJbmZvKTsKKworICAgICAgICAvKiogTmV3bHkgZGlzY292ZXJlZCBuZWlnaGJvci4gSW5mb3JtIFdTTSBvZiB0aGlzCisgICAgICAgICAgKiBhbmQgYWRkIHRoaXMgQlNTIGluZm8gYXQgdGhlIGJlZ2lubmluZworICAgICAgICAgICogTmVlZCB0byBsaW1pdCB0aGUgbnVtYmVyIG5ld2x5IGRpc2NvdmVyZWQgQlNTIGFkZGVkCisgICAgICAgICAgKiB0byB0aGUgbGlzdC4KKyAgICAgICAgICAqLworICAgICAgICBsZW4gPSBMSU1fTUFYX0JVRl9TSVpFIC0gKHNpemVvZih0U2lyU21lTWVhc3VyZW1lbnRJbmQpICsKKyAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdwTGltTWVhc1JlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1lYXNNYXRyaXhJbmZvKSkpOworICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIkN1cnJlbnQgQlNTIGxlbmd0aCAlZCwgUmVhbCBsZW5ndGggJWRcbiIpLAorICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT50b3RhbEJzc1NpemUsIHJlYWxMZW4pOykKKworICAgICAgICAvKiogQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgYWRkaW5nIGEgbmV3IG5vZGUuCisgICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT50b3RhbEJzc1NpemUgKyByZWFsTGVuIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+bnVtQnNzV2RzKys7CisgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+dG90YWxCc3NTaXplICs9IHJlYWxMZW47CisKKyAgICAgICAgICAgIFBFTE9HMihsaW1QcmludE1hY0FkZHIocE1hYywgYnNzSWRSY3YsIExPRzIpOykKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIkRyb3BwaW5nIHRoZSBtZWFzdXJlbWVudCBwYWNrZXRzOiBObyBtZW1vcnkhXG4iKSk7KQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICAgICAvKiogQWxsb2NhdGUgbWF4IG1lbW9yeSByZXF1aXJlZCBldmVuIGlmIHRoZSBwYWNrZXQgaXMgb2YgdHlwZSBEQVRBLAorICAgICAgICAgICogU28gdGhhdCBuZXh0IHRpbWUgd2UgcmVjZWl2ZSBhIGJlYWNvbiwgd29uJ3QgcnVuIG91dCBvZiBtZW1vcnkgdG8KKyAgICAgICAgICAqIHVwZGF0ZSB0aGUgaW5mb3JtYXRpb24uCisgICAgICAgICAgKi8KKyAgICAgICAgYWxsb2NMZW4gPSBzaXplb2YodExpbU5laWdoYm9yQnNzV2RzTm9kZSkgKyA0ICsgaWVMZW47CisgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcE5vZGUsIGFsbG9jTGVuKTsKKworICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgbmV3IE5laWdoYm9yQnNzV2RzIE5vZGVcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICAgICBzdGF0dXMgPSBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBOb2RlLCBhbGxvY0xlbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIG5ldyBOZWlnaGJvckJzc1dkcyBOb2RlXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcE5vZGUtPm5leHQgPSBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+cE5laWdoYm9yV2RzSW5mbzsKKyAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPnBOZWlnaGJvcldkc0luZm8gPSBwTm9kZTsKKyAgICAgICAgZm91bmQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorCisgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLnJzc2kgPSBXREFfR0VUX1JYX1JTU0lfREIocFJ4UGFja2V0SW5mbyk7CisgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLmFnZ3JSc3NpICs9IHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5yc3NpOworICAgIGlmIChmYy50eXBlID09IFNJUl9NQUNfREFUQV9GUkFNRSkKKyAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLmRhdGFDb3VudCsrOworICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby50b3RhbFBhY2tldHMrKzsKKworICAgIC8qKiBJZiBub2RlIG5vdCBmb3VuZCBvciBwcmV2aW91cyBsZWFybiB3YXMgbm90IGZyb20gYSBiZWFjb24vcHJvYmUgcnNwCisgICAgICAqIHRoZW4gbGVhcm4gYWdhaW4uCisgICAgICAqLworICAgIGlmICghZm91bmQgfHwgKChwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uc3NJZC5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAoZmMudHlwZSA9PSBTSVJfTUFDX01HTVRfRlJBTUUpKSkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLmJzc0lkLCBic3NJZFJjdiwKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uY2hhbm5lbElkID0gY2hhbklkOworICAgIGlmIChmYy50eXBlID09IFNJUl9NQUNfREFUQV9GUkFNRSkKKyAgICB7CisgICAgICAgIC8vIERhdGEgZnJhbWUgcmVjZWl2ZWQgZnJvbSBvdGhlciBCU1MuCisgICAgICAgIC8vIENvbGxlY3QgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZQorICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLnduaUluZGljYXRvciA9ICh0QW5pQm9vbCkgMDsKKworICAgICAgICBpZiAoZmMudG9EUyB8fCBmYy5mcm9tRFMpCisgICAgICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLmJzc1R5cGUgPSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uYnNzVHlwZSA9IGVTSVJfSUJTU19NT0RFOworCisgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ubG9hZC5udW1TdGFzID0gMDsKKyAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5sb2FkLmNoYW5uZWxVdGlsaXphdGlvbiA9IDA7CisgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uc3NJZC5sZW5ndGggPSAwOworICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLmFwTmFtZS5sZW5ndGggPSAwOworICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLnJzbklFLmxlbmd0aCA9IDA7CisgICAgICAgICAgICBwTm9kZS0+aW5mby53ZHNJbmZvLndkc0xlbmd0aCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vRklYTUVfQ0JNT0RFOiBuZWVkIHRvIHNlcGVyYXRlIG91dCBUSVRBTiBhbmQgSFQgY2IgbW9kZXMuCisgICAgICAgIGlmKHBCZWFjb24tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBsaW1HZXRIdENiQWRtaW5TdGF0ZShwTWFjLCBwQmVhY29uLT5IVENhcHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgJnBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby50aXRhbkh0Q2Fwcyk7CisgICAgICAgIAorICAgICAgICAgICAgaWYoIHBCZWFjb24tPkhUSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1HZXRIdENiT3BTdGF0ZShwTWFjLCBwQmVhY29uLT5IVEluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8udGl0YW5IdENhcHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBtdXN0IGJlIGVpdGhlciBCZWFjb24gZnJhbWUgb3IKKyAgICAgICAgLy8gUHJvYmUgUmVzcG9uc2UuIENvcHkgYWxsIHJlbGV2YW50IGluZm9ybWF0aW9uLgorICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLnduaUluZGljYXRvciA9ICh0QW5pQm9vbCkgcEJlYWNvbi0+cHJvcElFaW5mby5hbmlJbmRpY2F0b3I7CisgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uYnNzVHlwZSA9ICh0U2lyQnNzVHlwZSkgcEJlYWNvbi0+Y2FwYWJpbGl0eUluZm8uaWJzczsKKyAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5sb2FkLm51bVN0YXMgPSBwQmVhY29uLT5wcm9wSUVpbmZvLmxvYWQubnVtU3RhczsKKyAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5sb2FkLmNoYW5uZWxVdGlsaXphdGlvbiA9IHBCZWFjb24tPnByb3BJRWluZm8ubG9hZC5jaGFubmVsVXRpbGl6YXRpb247CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJlYWNvbi0+c3NJZCwgcEJlYWNvbi0+c3NJZC5sZW5ndGgrMSk7CisgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uYXBOYW1lLmxlbmd0aCA9IHBCZWFjb24tPnByb3BJRWluZm8uYXBOYW1lLmxlbmd0aDsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5hcE5hbWUubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcEJlYWNvbi0+cHJvcElFaW5mby5hcE5hbWUubmFtZSwgcEJlYWNvbi0+cHJvcElFaW5mby5hcE5hbWUubGVuZ3RoKTsKKworICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLnJzbklFLmxlbmd0aCA9IDA7CisgICAgICAgICAgICAvLyBBZGQgV1BBMiBpbmZvcm1hdGlvbi4gQmVmb3JlIHRoYXQgbWFrZSBzdXJlIHRoYXQgbWVtb3J5IGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgaWYgKHBCZWFjb24tPnJzblByZXNlbnQgJiYgKHBCZWFjb24tPnJzbi5sZW5ndGggPCBTSVJfTUFDX01BWF9JRV9MRU5HVEgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5yc25JRS5sZW5ndGggPSAyICsgcEJlYWNvbi0+cnNuLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ucnNuSUUucnNuSUVkYXRhWzBdID0gU0lSX01BQ19SU05fRUlEOworICAgICAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5yc25JRS5yc25JRWRhdGFbMV0gPSBwQmVhY29uLT5yc24ubGVuZ3RoOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ucnNuSUUucnNuSUVkYXRhWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgcEJlYWNvbi0+cnNuLmluZm8sIHBCZWFjb24tPnJzbi5sZW5ndGgpOworCisgICAgICAgICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJOZWlnaGJvckJzcyBSU04gSUUsIHR5cGU9JXgsIGxlbmd0aD0leFxuIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLnJzbklFLnJzbklFZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5yc25JRS5yc25JRWRhdGFbMV0pOykKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIFdQQSBpbmZvcm1hdGlvbi4gQmVmb3JlIHRoYXQgbWFrZSBzdXJlIHRoYXQgbWVtb3J5IGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgaWYgKHBCZWFjb24tPndwYVByZXNlbnQgJiYgKChwQmVhY29uLT5yc24ubGVuZ3RoICsgcEJlYWNvbi0+d3BhLmxlbmd0aCkgPCAoU0lSX01BQ19NQVhfSUVfTEVOR1RILTIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ucnNuSUUucnNuSUVkYXRhW3BOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5yc25JRS5sZW5ndGhdID0KKyAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19XUEFfRUlEOworICAgICAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5yc25JRS5yc25JRWRhdGFbcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLnJzbklFLmxlbmd0aCArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgcEJlYWNvbi0+d3BhLmxlbmd0aDsKKworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLnJzbklFLnJzbklFZGF0YVtwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ucnNuSUUubGVuZ3RoICsgMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBwQmVhY29uLT53cGEuaW5mbywgcEJlYWNvbi0+d3BhLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIk5laWdoYm9yQnNzIFdQQSBJRSwgdHlwZT0leCwgbGVuZ3RoPSV4XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5yc25JRS5yc25JRWRhdGFbcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLnJzbklFLmxlbmd0aF0sCisgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ucnNuSUUucnNuSUVkYXRhW3BOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5yc25JRS5sZW5ndGggKyAxXSk7KQorICAgICAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5yc25JRS5sZW5ndGggKz0gMiArIHBCZWFjb24tPndwYS5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwTm9kZS0+aW5mby53ZHNJbmZvLndkc0xlbmd0aCA9ICh0QU5JX1UxNikgcEJlYWNvbi0+cHJvcElFaW5mby53ZHNMZW5ndGg7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTm9kZS0+aW5mby53ZHNJbmZvLndkc0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgIHBCZWFjb24tPnByb3BJRWluZm8ud2RzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBwQmVhY29uLT5wcm9wSUVpbmZvLndkc0xlbmd0aCk7CisKKyAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5jYXBhYmlsaXR5SW5mbyA9ICooKHRBTklfVTE2KikmcEJlYWNvbi0+Y2FwYWJpbGl0eUluZm8pOworCisjaWYgMAorICAgICAgICAgICAgaWYgKHBCZWFjb24tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopJnBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5IVENhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSZwQmVhY29uLT5IVENhcHMsIEhUX0NBUEFCSUxJVFlfSUVfU0laRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uSFRDYXBzLnByZXNlbnQgPSAwOworCisgICAgICAgICAgICBpZiAocEJlYWNvbi0+SFRJbmZvLnByZXNlbnQpCisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikmcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLkhUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopJnBCZWFjb24tPkhUSW5mbywgSFRfSU5GT19JRV9TSVpFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5IVEluZm8ucHJlc2VudCA9IDA7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKHBCZWFjb24tPnN1cHBSYXRlc1ByZXNlbnQgJiYgKHBCZWFjb24tPnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzIDw9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfUkFURVNFVF9FSURfTUFYKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ub3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID0gcEJlYWNvbi0+c3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXM7CisKKyAgICAgICAgICAgICAgIFBFTE9HNChsaW1Mb2cocE1hYywgTE9HNCwgRkwoIlN1cHBvcnRlZCBSYXRlcyAoJWQpIDogIiksCisgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ub3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzKTspCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8cEJlYWNvbi0+c3VwcG9ydGVkUmF0ZXMubnVtUmF0ZXM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVtpXSA9IHBCZWFjb24tPnN1cHBvcnRlZFJhdGVzLnJhdGVbaV07CisgICAgICAgICAgICAgICAgICAgIFBFTE9HNChsaW1Mb2cocE1hYywgTE9HNCwgRkwoIiVkICIpLCBwQmVhY29uLT5zdXBwb3J0ZWRSYXRlcy5yYXRlW2ldKTspCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFBFTE9HNChsaW1Mb2cocE1hYywgTE9HNCwgRkwoIlxuIikpOykKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBCZWFjb24tPmV4dGVuZGVkUmF0ZXNQcmVzZW50ICYmIChwQmVhY29uLT5leHRlbmRlZFJhdGVzLm51bVJhdGVzIDw9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX1JBVEVTRVRfRUlEX01BWCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlcyA9IHBCZWFjb24tPmV4dGVuZGVkUmF0ZXMubnVtUmF0ZXM7CisKKyAgICAgICAgICAgICAgIFBFTE9HNChsaW1Mb2cocE1hYywgTE9HNCwgRkwoIkV4dGVuZGVkIFJhdGVzICglZCkgOiAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5leHRlbmRlZFJhdGVTZXQubnVtUmF0ZXMpOykKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxwQmVhY29uLT5leHRlbmRlZFJhdGVzLm51bVJhdGVzOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uZXh0ZW5kZWRSYXRlU2V0LnJhdGVbaV0gPSBwQmVhY29uLT5leHRlbmRlZFJhdGVzLnJhdGVbaV07CisgICAgICAgICAgICAgICAgICAgIFBFTE9HNChsaW1Mb2cocE1hYywgTE9HNCwgRkwoIiVkICIpLCBwQmVhY29uLT5leHRlbmRlZFJhdGVzLnJhdGVbaV0pOykKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ubndUeXBlID0gbndUeXBlOworICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLmhjZkVuYWJsZWQgPSBwQmVhY29uLT5wcm9wSUVpbmZvLmhjZkVuYWJsZWQ7CisgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uYmVhY29uSW50ZXJ2YWwgPSBwQmVhY29uLT5iZWFjb25JbnRlcnZhbDsKKyAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby53bWVJbmZvUHJlc2VudCA9IHBCZWFjb24tPndtZUluZm9QcmVzZW50OworICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLndtZUVkY2FQcmVzZW50ID0gcEJlYWNvbi0+d21lRWRjYVByZXNlbnQ7CisgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8ud3NtQ2FwYWJsZVByZXNlbnQgPSBwQmVhY29uLT53c21DYXBhYmxlUHJlc2VudDsKKyAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5wcm9wSUVDYXBhYmlsaXR5ID0gcEJlYWNvbi0+cHJvcElFaW5mby5jYXBhYmlsaXR5OworICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLmxvY2FsUG93ZXJDb25zdHJhaW50cyA9IHBCZWFjb24tPmxvY2FsUG93ZXJDb25zdHJhaW50LmxvY2FsUG93ZXJDb25zdHJhaW50czsKKyAgICAgICAgICAgIHBOb2RlLT5pbmZvLm5laWdoYm9yQnNzSW5mby5kdGltUGVyaW9kID0gcEJlYWNvbi0+dGltLmR0aW1QZXJpb2Q7CisgICAgICAgICAgICBwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uSFRDYXBzUHJlc2VudCA9IHBCZWFjb24tPkhUQ2Fwcy5wcmVzZW50OworICAgICAgICAgICAgcE5vZGUtPmluZm8ubmVpZ2hib3JCc3NJbmZvLkhUSW5mb1ByZXNlbnQgPSBwQmVhY29uLT5IVEluZm8ucHJlc2VudDsKKyAgICAgICAgfQorICAgIH0KK30gLyoqKioqKiBlbmQgbGltQ29sbGVjdE1lYXN1cmVtZW50RGF0YSgpICoqKioqKi8KKworLyoqCisgKiBsaW1DbGVhbnVwTWF0cml4Tm9kZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHZhcmlvdXMgcGxhY2VzIHdpdGhpbiBMSU0gY29kZQorICogdG8gY2xlYW51cCBjaGFubmVsIGluZm8gbWF0cml4IGNvbGxlY3RlZCBieSBsZWFybiBtb2RlIG1lYXN1cmVtZW50cy4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2xpbUNsZWFudXBNYXRyaXhOb2Rlcyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+cE1lYXNNYXRyaXhJbmZvKQorICAgIHsKKyAgICAgICAgdHBMaW1NZWFzTWF0cml4Tm9kZSBwTm9kZSA9IHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5wTWVhc01hdHJpeEluZm87CisgICAgICAgIHRwTGltTWVhc01hdHJpeE5vZGUgcE5leHQ7CisKKyAgICAgIHdoaWxlIChwTm9kZSkKKyAgICAgIHsKKyAgICAgICAgICAgIHBOZXh0ID0gcE5vZGUtPm5leHQ7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwTm9kZSk7CisKKyAgICAgICAgICAgIGlmIChwTmV4dCkKKyAgICAgICAgICAgICAgICBwTm9kZSA9IHBOZXh0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+bnVtTWF0cml4Tm9kZXMgPSAwOworICAgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLAorICAgICAgICAgICBGTCgiQ2xlYW5lZCB1cCBjaGFubmVsIG1hdHJpeCBub2Rlc1xuIikpOykKKworICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5wTWVhc01hdHJpeEluZm8gPSBOVUxMOworfSAvKioqKioqIGVuZCBsaW1DbGVhbnVwTWF0cml4Tm9kZXMoKSAqKioqKiovCisKKy8qKgorICogbGltQ2xlYW51cE5laWdoYm9yQnNzTm9kZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHZhcmlvdXMgcGxhY2VzIHdpdGhpbiBMSU0gY29kZQorICogdG8gY2xlYW51cCBuZWlnaGJvciBpbmZvIGNvbGxlY3RlZCBieSBsZWFybiBtb2RlIG1lYXN1cmVtZW50cy4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2xpbUNsZWFudXBOZWlnaGJvckJzc05vZGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgaWYgKHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5wTmVpZ2hib3JXZHNJbmZvKQorICAgIHsKKyAgICAgICAgdHBMaW1OZWlnaGJvckJzc1dkc05vZGUgcE5vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+cE5laWdoYm9yV2RzSW5mbzsKKyAgICAgICAgdHBMaW1OZWlnaGJvckJzc1dkc05vZGUgcE5leHQ7CisgICAgICAgIHdoaWxlIChwTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgcE5leHQgPSBwTm9kZS0+bmV4dDsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5udW1Cc3NXZHMtLTsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBOb2RlKTsKKworICAgICAgICAgICAgaWYgKHBOZXh0KQorICAgICAgICAgICAgICAgIHBOb2RlID0gcE5leHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwKKyAgICAgICAgICAgRkwoIkNsZWFuZWQgdXAgbmVpZ2hib3Igbm9kZXNcbiIpKTspCisKKyAgICBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+bnVtQnNzV2RzICAgICAgICA9IDA7CisgICAgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPnRvdGFsQnNzU2l6ZSAgICAgPSAwOworICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5wTmVpZ2hib3JXZHNJbmZvID0gTlVMTDsKK30gLyoqKioqKiBlbmQgbGltQ2xlYW51cE5laWdoYm9yQnNzTm9kZXMoKSAqKioqKiovCisKKworLyoqCisgKiBsaW1TZW5kU21lTWVhc3VyZW1lbnRJbmQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTG1tTWVzc2FnZXMoKSB0bworICogc2VuZCBTTUVfTUVBU1VSRU1FTlRfSU5EIG1lc3NhZ2UgdG8gV1NNLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltU2VuZFNtZU1lYXN1cmVtZW50SW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAqcE1lYXNJbmQ7CisgICAgdEFOSV9VMTYgICAgICAgICBsZW4gPSAwOworICAgIHRTaXJNc2dRICAgIG1taE1zZzsKKworI2lmZGVmIEdFTjZfVE9ETworICAgIC8vZmV0Y2ggdGhlIHNlc3Npb25FbnRyeSBiYXNlZCBvbiB0aGUgc2Vzc2lvbklkCisgICAgLy9wcmlvcml0eSAtIE1FRElVTQorICAgIHRwUEVTZXNzaW9uIHNlc3Npb25FbnRyeTsKKworICAgIGlmKChzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLm1lYXN1cmVtZW50SW5kVGltZXIuc2Vzc2lvbklkKSk9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLEZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSURcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCFwTWFjLT5zeXMuZ1N5c0VuYWJsZUxlYXJuTW9kZSB8fAorICAgICAgICAocE1hYy0+bGltLmdwTGltTWVhc1JlcSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZW4gPSBzaXplb2YodFNpclNtZU1lYXN1cmVtZW50SW5kKSArCisgICAgICAgICAgKHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzICoKKyAgICAgICAgICAgc2l6ZW9mKHRTaXJNZWFzTWF0cml4SW5mbykpICsKKyAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPnRvdGFsQnNzU2l6ZTsKKyAgICBpZiAobGVuID4gTElNX01BWF9CVUZfU0laRSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImxlbiAlZCBudW1DaGFubmVscyAlZCBudW1Cc3NXZHMgJWQgdG90YWxCc3NTaXplICVkXG4iKSwKKyAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPm51bUJzc1dkcywKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT50b3RhbEJzc1NpemUpOworICAgIH0KKworICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIioqKioqICBNZWFzdXJlbWVudCBJTkQgc2l6ZSAlZFxuIiksIGxlbik7KQorCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTWVhc0luZCwgbGVuKSkKKyAgICB7CisgICAgICAgIC8vLyBCdWZmZXIgbm90IGF2YWlsYWJsZS4gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9NRUFTX0lORFxuIikpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywKKyAgICAgICBGTCgiU2VuZGluZyBlV05JX1NNRV9NRUFTX0lORCBvbiBSYWRpbyAlZCwgcmVxdWVzdGVkIGxlbj0lZFxuIiksCisgICAgICAgcE1hYy0+c3lzLmdTaXJSYWRpb0lkLCBsZW4pOykKKworICAgIGxpbU1lYXN1cmVtZW50SW5kU2VyRGVzKHBNYWMsIHBNZWFzSW5kKTsKKworICAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfTUVBU1VSRU1FTlRfSU5EOworICAgIG1taE1zZy5ib2R5cHRyID0gcE1lYXNJbmQ7CisgICAgbW1oTXNnLmJvZHl2YWwgPSAwOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCAgZVBST1QpOworCisgICAgLy8gQ2xlYW51cCBuZWlnaGJvciBpbmZvcm1hdGlvbgorICAgIGxpbUNsZWFudXBOZWlnaGJvckJzc05vZGVzKHBNYWMpOworICAgIGxpbUNsZWFudXBNYXRyaXhOb2RlcyhwTWFjKTsKK30gLyoqKiBlbmQgbGltU2VuZFNtZU1lYXN1cmVtZW50SW5kKCkgKioqLworCisKKworLyoqCisgKiBsaW1DbGVhbnVwTWVhc0RhdGEoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHZhcmlvdXMgcGxhY2VzIHdpdGhpbiBMSU0gY29kZQorICogdG8gY2xlYW51cCBtZWFzdXJlbWVudCByZWxhdGVkIGRhdGEuCisgKgorICpMT0dJQzoKKyAqIEJ1ZmZlcnMgYW5kIGFzc29jaWF0ZWQgdGltZXIgcmVzb3VyY2VzIHdpbGwgYmUgZGVsZXRlZCB3aGVuCisgKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltQ2xlYW51cE1lYXNEYXRhKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgaWYgKHBNYWMtPmxpbS5ncExpbU1lYXNSZXEpCisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEpOworCisgICAgcE1hYy0+bGltLmdwTGltTWVhc1JlcSA9IE5VTEw7CisKKyAgICBpZiAoIXBNYWMtPmxpbS5ncExpbU1lYXNEYXRhKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPnBNZWFzTWF0cml4SW5mbykKKyAgICB7CisgICAgICAgIC8vIFJldGFpbiBjdXJyZW50IGNoYW5uZWwncyBkYXRhIGFuZCBmbHVzaCByZW1haW5pbmcKKyAgICAgICAgdHBMaW1NZWFzTWF0cml4Tm9kZSBwTWF0cml4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+cE1lYXNNYXRyaXhJbmZvKS0+bmV4dDsKKyAgICAgICAgdHBMaW1NZWFzTWF0cml4Tm9kZSBwTmV4dDsKKworICAgICAgICB3aGlsZSAocE1hdHJpeCkKKyAgICAgICAgeworICAgICAgICAgICAgcE5leHQgPSBwTWF0cml4LT5uZXh0OworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hdHJpeCk7CisKKyAgICAgICAgICAgIGlmIChwTmV4dCkKKyAgICAgICAgICAgICAgICBwTWF0cml4ID0gcE5leHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+cE1lYXNNYXRyaXhJbmZvLT5uZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+bnVtTWF0cml4Tm9kZXMgPSAwOworICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLAorICAgICAgICAgICBGTCgiQ2xlYW5lZCB1cCBtZWFzdXJlbWVudCBtZXRyaWNzIG5vZGVzXG4iKSk7KQorCisgICAgLy8gQ2xlYW51cCBuZWlnaGJvciBpbmZvcm1hdGlvbgorICAgIGxpbUNsZWFudXBOZWlnaGJvckJzc05vZGVzKHBNYWMpOworfSAvKioqKioqIGVuZCBsaW1DbGVhbnVwTWVhc0RhdGEoKSAqKioqKiovCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBsaW1TdG9wTWVhc1RpbWVycworXGJyaWVmICBTdG9wcyBhbGwgbWVhc3VyZW1lbnQgcmVsYXRlZCB0aW1lcnMuCisKK1xwYXJhbSAgcE1hYworXHJldHVybiBOb25lCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1TdG9wTWVhc1RpbWVycyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NZWFzUmVxID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5tZWFzQ29udHJvbC5wZXJpb2RpY01lYXNFbmFibGVkKQorICAgIHsKKyAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5tZWFzdXJlbWVudEluZFRpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3Qgc3RvcCBtZWFzdXJlbWVudCBJbmQgdGltZXJcbiIpKTspCisgICAgICAgIH0KKyAgICB9CisgICAgcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLmlzTWVhc0luZFRpbWVyQWN0aXZlID0gMDsKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9ERUFDVElWQVRFLCAwLCBlTElNX0xFQVJOX0lOVEVSVkFMX1RJTUVSKSk7CisgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkludGVydmFsVGltZXIpICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3Qgc3RvcCBsZWFybiBpbnRlcnZhbCB0aW1lclxuIikpOykKKyAgICB9CisKKyAgICBpZiAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5mUXVpZXRFbmFibGVkKQorICAgIHsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfREVBQ1RJVkFURSwgMCwgZUxJTV9MRUFSTl9EVVJBVElPTl9USU1FUikpOworICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLmxlYXJuRHVyYXRpb25UaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IHN0b3AgbGVhcm4gZHVyYXRpb24gdGltZXJcbiIpKTspCisgICAgICAgIH0KKyAgICB9CisKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9ERUFDVElWQVRFLCAwLCBlTElNX0xFQVJOX0RVUkFUSU9OX1RJTUVSKSk7CisgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkR1cmF0aW9uVGltZXIpICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3Qgc3RvcCBsZWFybiBkdXJhdGlvbiB0aW1lclxuIikpOykKKyAgICB9Cit9CisKKy8qKgorICogbGltRGVsZXRlTWVhc1RpbWVycygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NMbW1NZXNzYWdlcygpIHVwb24KKyAqIHJlY2VpdmluZyBTTUVfTUVBU1VSRU1FTlRfUkVRLiBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMKKyAqIHRpbWVycyBhc3NvY2lhdGVkIHdpdGggTWVhc3VyZW1lbnRzLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltRGVsZXRlTWVhc1RpbWVycyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5tZWFzQ29udHJvbC5wZXJpb2RpY01lYXNFbmFibGVkKQorICAgIHR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLm1lYXN1cmVtZW50SW5kVGltZXIpOworICAgIHR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLmxlYXJuSW50ZXJ2YWxUaW1lcik7CisgICAgdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMubGVhcm5EdXJhdGlvblRpbWVyKTsKK30gLyoqKiBlbmQgbGltRGVsZXRlTWVhc1RpbWVycygpICoqKi8KKworCisKKy8qKgorICogbGltQ2xlYW51cE1lYXNSZXNvdXJjZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHZhcmlvdXMgcGxhY2VzIHdpdGhpbiBMSU0gY29kZQorICogdG8gY2xlYW51cCBtZWFzdXJlbWVudCByZWxhdGVkIGRhdGEgYW5kIHJlc291cmNlcy4KKyAqCisgKkxPR0lDOgorICogQnVmZmVycyBhbmQgYXNzb2NpYXRlZCB0aW1lciByZXNvdXJjZXMgd2lsbCBiZSBkZWxldGVkIHdoZW4KKyAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1DbGVhbnVwTWVhc1Jlc291cmNlcyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgUEVMT0cxKCBsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgRkwoIkNsZWFuaW5nIHVwIExlYXJuIG1vZGUgTWVhc3VyZW1lbnQgcmVzb3VyY2VzXG4iKSk7KQorCisgICAgaWYgKHBNYWMtPmxpbS5ncExpbU1lYXNSZXEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbGltRGVsZXRlTWVhc1RpbWVycyhwTWFjKTsKKworICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YSkKKyAgICB7CisgICAgICAgIGxpbUNsZWFudXBNZWFzRGF0YShwTWFjKTsKKyAgICAgICAgaWYgKHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5wTWVhc01hdHJpeEluZm8pCisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+cE1lYXNNYXRyaXhJbmZvKTsKKworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YSk7CisgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhID0gTlVMTDsKKyAgICB9Cit9IC8qKioqKiogZW5kIGxpbUNsZWFudXBNZWFzUmVzb3VyY2VzKCkgKioqKioqLworCisKKy8qKgorICogbGltRGVsZXRlQ3VycmVudEJzc1dkc05vZGUoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIExvc3Mgb2YgbGluaworICogaXMgZGV0ZWN0ZWQgd2l0aCBBUCBhbmQgaXRzIEJzc1dkcyBpbmZvIG5vZGUKKyAqIHRvIGJlIGRlbGV0ZWQKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBsaW1EZWxldGVDdXJyZW50QnNzV2RzTm9kZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICBjZmcgPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIHRTaXJNYWNBZGRyICAgICAgICAgY3VycmVudEJzc0lkOworCisjaWYgMAorICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0JTU0lELCBjdXJyZW50QnNzSWQsICZjZmcpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8vLyBDb3VsZCBub3QgZ2V0IEJTU0lEIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IHJldHJpZXZlIEJTU0lEXG4iKSk7CisgICAgfQorI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICBzaXJDb3B5TWFjQWRkcihjdXJyZW50QnNzSWQsc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyAgICBpZiAoIXBNYWMtPmxpbS5ncExpbU1lYXNEYXRhKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPnBOZWlnaGJvcldkc0luZm8pCisgICAgeworICAgICAgICB0cExpbU5laWdoYm9yQnNzV2RzTm9kZSBwTm9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5wTmVpZ2hib3JXZHNJbmZvOworICAgICAgICB0cExpbU5laWdoYm9yQnNzV2RzTm9kZSBwUHJldiA9IHBOb2RlOworICAgICAgICB3aGlsZSAocE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCxwTm9kZS0+aW5mby5uZWlnaGJvckJzc0luZm8uYnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPm51bUJzc1dkcy0tOworICAgICAgICAgICAgICAgIHBQcmV2LT5uZXh0ID0gcE5vZGUtPm5leHQ7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcE5vZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFByZXYgPSBwTm9kZTsKKworICAgICAgICAgICAgaWYgKHBOb2RlLT5uZXh0KQorICAgICAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm5leHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5udW1Cc3NXZHMpCisgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+cE5laWdoYm9yV2RzSW5mbyA9IE5VTEw7CisgICAgfQorfSAvKioqKioqIGVuZCBsaW1EZWxldGVDdXJyZW50QnNzV2RzTm9kZSgpICoqKioqKi8KKworCisKKy8qKgorICogbGltUmVzdG9yZVByZUxlYXJuU3RhdGUoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIExlYXJuIGR1cmF0aW9uIHRpbWVyIGV4cGlyZXMKKyAqIHRvIHJlc3RvcmUgcHJlLUxlYXJuIG1vZGUgc3RhdGUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUmVzdG9yZVByZUxlYXJuU3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgIFBFTE9HNChsaW1Mb2cocE1hYywgTE9HNCwKKyAgICAgICAgICAgRkwoIlJlc3RvcmluZyBmcm9tIExlYXJuIG1vZGUgb24gUmFkaW9JZCAlZFxuIiksCisgICAgICAgICAgIHBNYWMtPnN5cy5nU2lyUmFkaW9JZCk7KQorCisgICAgcE1hYy0+bGltLmdMaW1TeXN0ZW1JblNjYW5MZWFybk1vZGUgPSAwOworCisgICAgLy8gR28gYmFjayB0byBwcmV2aW91cyBzdGF0ZS4KKyAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID0gcE1hYy0+bGltLmdMaW1QcmV2U21lU3RhdGU7CisgICAgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9IHBNYWMtPmxpbS5nTGltUHJldk1sbVN0YXRlOworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1NNRV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSkpOworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworCisgICBQRUxPRzQobGltTG9nKHBNYWMsIExPRzQsCisgICAgICAgICAgIEZMKCJSZXN0b3JlZCBmcm9tIExlYXJuIG1vZGUgb24gUmFkaW9JZCAlZFxuIiksCisgICAgICAgICAgIHBNYWMtPnN5cy5nU2lyUmFkaW9JZCk7KQorfSAvKioqKioqIGVuZCBsaW1SZXN0b3JlUHJlTGVhcm5TdGF0ZSgpICoqKioqKi8KKworI2VuZGlmIC8vI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApIHx8IChBTklfUFJPRFVDVF9UWVBFX0FQX1NESykpCisKKy8qKgorICogbGltR2V0UGh5Q0JTdGF0ZQorICoKKyAqRlVOQ1RJT046CisgKiBCYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiBMSU0sIHRoaXMgcm91dGluZSBkZXRlcm1pbmVzCisgKiB0aGUgY29ycmVjdCBQSFkgZW51bWVyYXRpb24gImVQaHlDaGFuQm9uZFN0YXRlIiB0byB1c2UKKyAqCisgKkxPR0lDOgorICogSXMgaXQgcG9zc2libGUgdG8gaGF2ZSBhIGNvbW1vbiBlbnVtZXJhdGlvbj8KKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIFBIWSBlbnVtZXJhdGlvbiBlUGh5Q2hhbkJvbmRTdGF0ZQorICovCitlUGh5Q2hhbkJvbmRTdGF0ZSBsaW1HZXRQaHlDQlN0YXRlKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICBlUGh5Q2hhbkJvbmRTdGF0ZSBjYlN0YXRlID0gUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOworCisgICAgaWYoIEdFVF9DQl9PUEVSX1NUQVRFKCBwTWFjLT5saW0uZ0NiU3RhdGUgKSkKKyAgICB7CisgICAgICBpZiggR0VUX0NCX1NFQ19DSEFOTkVMKCBwTWFjLT5saW0uZ0NiU3RhdGUgKSkKKyAgICAgICAgY2JTdGF0ZSA9IFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWTsKKyAgICAgIGVsc2UKKyAgICAgICAgY2JTdGF0ZSA9IFBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlk7CisgICAgfQorICByZXR1cm4gY2JTdGF0ZTsKK30KKworCisvKioKKyAqIGxpbUdldEhUQ0JTdGF0ZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIHJvdXRpbmcgcHJvdmlkZXMgdGhlIHRyYW5zbGF0aW9uIG9mIEFpcmdvIEVudW0gdG8gSFQgZW51bSBmb3IgZGV0ZXJtaW5pbmcgCisgKiBzZWNvbmRhcnkgY2hhbm5lbCBvZmZzZXQuCisgKiBBaXJnbyBFbnVtIGlzIHJlcXVpcmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLgorICoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBIVCBlbnVtZXJhdGlvbgorICovCisKK3RTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgICAgbGltR2V0SFRDQlN0YXRlKHRBbmlDQlNlY29uZGFyeU1vZGUgYW5pQ0JNb2RlKSAKK3sKKyAgICBpZihhbmlDQk1vZGUgPT0gZUFOSV9DQl9TRUNPTkRBUllfRE9XTikKKyAgICAgICAgcmV0dXJuIGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfRE9XTjsKKyAgICBlbHNlIGlmKGFuaUNCTW9kZSA9PSBlQU5JX0NCX1NFQ09OREFSWV9VUCkKKyAgICAgICAgcmV0dXJuIGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfVVA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZUhUX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVF9OT05FOworfQorCisKKy8qKgorICogbGltR2V0QW5pQ0JTdGF0ZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIHJvdXRpbmcgcHJvdmlkZXMgdGhlIHRyYW5zbGF0aW9uIG9mIEhUIEVudW0gdG8gQWlyZ28gZW51bSBmb3IgZGV0ZXJtaW5pbmcgCisgKiBzZWNvbmRhcnkgY2hhbm5lbCBvZmZzZXQuCisgKiBBaXJnbyBFbnVtIGlzIHJlcXVpcmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLgorICoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBBTkkgZW51bWVyYXRpb24KKyAqLworCit0QW5pQ0JTZWNvbmRhcnlNb2RlICAgICBsaW1HZXRBbmlDQlN0YXRlKCB0U2lyTWFjSFRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0IGh0Q0JNb2RlKSAKK3sKKyAgICBpZihlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX0RPV04gPT0gaHRDQk1vZGUpCisgICAgICAgIHJldHVybiBlQU5JX0NCX1NFQ09OREFSWV9ET1dOOworICAgIGVsc2UgaWYoZUhUX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVF9VUCA9PSBodENCTW9kZSkKKyAgICAgICAgcmV0dXJuIGVBTklfQ0JfU0VDT05EQVJZX1VQOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVBTklfQ0JfU0VDT05EQVJZX05PTkU7Cit9CisKKworLyoqCisgKiBsaW1HZXRTdGFQZWVyVHlwZQorICoKKyAqRlVOQ1RJT046CisgKiBCYXNlZCBvbiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgLQorICogMSkgdERwaEhhc2hOb2RlLmFuaVBlZXIKKyAqIDIpIHREcGhIYXNoTm9kZS5wcm9wQ2FwYWJpbGl0eQorICogdGhpcyBBUEkgZGV0ZXJtaW5lcyBpZiBhIGdpdmVuIFNUQSBpcyBhbiBBTkkgcGVlciBvciBub3QKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFN0YURzIC0gUG9pbnRlciB0byB0aGUgdHBEcGhIYXNoTm9kZSBvZiB0aGUgU1RBCisgKiAgICAgICAgIHVuZGVyIGNvbnNpZGVyYXRpb24KKyAqIEByZXR1cm4gdFN0YVJhdGVNb2RlCisgKi8KK3RTdGFSYXRlTW9kZSBsaW1HZXRTdGFQZWVyVHlwZSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlIHBTdGFEcywKKyAgICB0cFBFU2Vzc2lvbiAgIHBzZXNzaW9uRW50cnkpCit7Cit0U3RhUmF0ZU1vZGUgc3RhUGVlclR5cGUgPSBlU1RBXzExYjsKKworICAvLyBEZXRlcm1pbmUgdGhlIHBlZXItU1RBIHR5cGUKKyAgaWYoIHBTdGFEcy0+YW5pUGVlciApCisgIHsKKyAgICBpZihQUk9QX0NBUEFCSUxJVFlfR0VUKCBUQVVSVVMsIHBTdGFEcy0+cHJvcENhcGFiaWxpdHkgKSkKKyAgICAgICAgc3RhUGVlclR5cGUgPSBlU1RBX1RBVVJVUzsKKyAgICBlbHNlIGlmKCBQUk9QX0NBUEFCSUxJVFlfR0VUKCBUSVRBTiwgcFN0YURzLT5wcm9wQ2FwYWJpbGl0eSApKQorICAgICAgICBzdGFQZWVyVHlwZSA9IGVTVEFfVElUQU47CisgICAgZWxzZQorICAgICAgICBzdGFQZWVyVHlwZSA9IGVTVEFfUE9MQVJJUzsKKyAgfQorICBlbHNlIGlmKHBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpCisgICAgICAgIHN0YVBlZXJUeXBlID0gZVNUQV8xMW47CisgIGVsc2UgaWYocFN0YURzLT5lcnBFbmFibGVkKQorICAgICAgICBzdGFQZWVyVHlwZSA9IGVTVEFfMTFiZzsKKyAgZWxzZSBpZihwc2Vzc2lvbkVudHJ5LT5saW1SRkJhbmQgPT0gU0lSX0JBTkRfNV9HSFopCisgICAgICAgIHN0YVBlZXJUeXBlID0gZVNUQV8xMWE7CisKKyAgcmV0dXJuIHN0YVBlZXJUeXBlOworfQorCisvKioKKyAqIHNldHVwQ0JTdGF0ZSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBlV05JX1NNRV9TVEFSVF9CU1NfUkVRLgorICogQmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgQ2hhbm5lbCBCb25kaW5nIG1vZGUsIHRoZQorICogYXBwcm9wcmlhdGUgQ2hhbm5lbCBCb25kaW5nIHN0YXRlIGlzIHNldHVwIGluIHRoZSBnbG9iYWwKKyAqIExJTSBvYmplY3QgLSBnQ2JTdGF0ZS4gVGhpcyB3aWxsIHRoZW4gYmUgc3Vic2VxdWVudGx5IHVzZWQKKyAqIGluIHRoZSBwcm9wcmlldGFyeSBJRSBmaWVsZAorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBjYk1vZGUgVGhlIENCIG1vZGUgYXMgc2V0IGJ5IFNNRSAoV1NNKQorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgc2V0dXBDQlN0YXRlKCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRBbmlDQlNlY29uZGFyeU1vZGUgY2JNb2RlICkKK3sKKworICBzd2l0Y2goIGNiTW9kZSApCisgIHsKKyAgICBjYXNlIGVBTklfQ0JfU0VDT05EQVJZX0RPV046CisgICAgICBTRVRfQ0JfT1BFUl9TVEFURSggcE1hYy0+bGltLmdDYlN0YXRlLCBlSEFMX1NFVCApOworICAgICAgU0VUX0NCX1NFQ19DSEFOTkVMKCBwTWFjLT5saW0uZ0NiU3RhdGUsIGVIQUxfQ0xFQVIgKTsKKyAgICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURSwgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9MT1dFUikgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnU2V0SW50IFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEUgZmFpbGVkIFxuIikpOworICAgICAgLy8gQVUgc3RhdGUgaXMgc2V0IHZpYSBDRkcKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlQU5JX0NCX1NFQ09OREFSWV9VUDoKKyAgICAgIFNFVF9DQl9PUEVSX1NUQVRFKCBwTWFjLT5saW0uZ0NiU3RhdGUsIGVIQUxfU0VUICk7CisgICAgICBTRVRfQ0JfU0VDX0NIQU5ORUwoIHBNYWMtPmxpbS5nQ2JTdGF0ZSwgZUhBTF9TRVQgKTsKKyAgICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURSwgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9ISUdIRVIpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNmZ1NldEludCBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFIGZhaWxlZCBcbiIpKTsKKyAgICAgIC8vIEFVIHN0YXRlIGlzIHNldCB2aWEgQ0ZHCisgICAgICBicmVhazsKKworICAgIGNhc2UgZUFOSV9DQl9TRUNPTkRBUllfTk9ORToKKyAgICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURSwgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURV9OT05FKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmdTZXRJbnQgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURSBmYWlsZWQgXG4iKSk7CisKKyAgICBkZWZhdWx0OgorICAgICAgU0VUX0NCX09QRVJfU1RBVEUoIHBNYWMtPmxpbS5nQ2JTdGF0ZSwgZUhBTF9DTEVBUiApOworICAgICAgYnJlYWs7CisgIH0KKworCisKKyAgbGltTG9nKCBwTWFjLCBMT0cyLAorICAgICAgRkwoIk5ldyBDQiBTdGF0ZTogMHglMXggZm9yIE1vZGUgJWRcbiIpLAorICAgICAgcE1hYy0+bGltLmdDYlN0YXRlLAorICAgICAgY2JNb2RlICk7Cit9CisKKy8qKgorICogbGltR2V0Q3VycmVudENCU2VjQ2hhbm5lbCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgY3VycmVudAorICogInNlY29uZGFyeSIgY2hhbm5lbCB3aGVuIENoYW5uZWwgQm9uZGluZyBpcyBlbmFibGVkCisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gQ2hhbm5lbCBudW1iZXIKKyAqLwordEFOSV9VOCBsaW1HZXRDdXJyZW50Q0JTZWNDaGFubmVsKCB0cEFuaVNpckdsb2JhbCBwTWFjLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7Cit0QU5JX1U4IGNoYW5OdW07CisKKyAgLy8KKyAgLy8gRklYTUUgLSBUaGlzIGlzIGEgSEFDSyEhCisgIC8vIE5lZWQgdG8gaGF2ZSBhIGNsZWFuIHdheSBvZiBkZXRlcm1pbmluZyB0aGUgY3VycmVudAorICAvLyBDQiBzZWNvbmRhcnkgY2hhbm5lbCEhCisgIC8vCisgIGNoYW5OdW0gPSBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWw7CisgIGlmKCBHRVRfQ0JfT1BFUl9TVEFURSggcE1hYy0+bGltLmdDYlN0YXRlICkpCisgIHsKKyAgICBpZiggR0VUX0NCX1NFQ19DSEFOTkVMKCBwTWFjLT5saW0uZ0NiU3RhdGUgKSkKKyAgICAgIGNoYW5OdW0gKz0gNDsKKyAgICBlbHNlCisgICAgICBjaGFuTnVtIC09IDQ7CisgIH0KKworICBsaW1Mb2coIHBNYWMsIExPRzQsCisgICAgICBGTCgiUmV0dXJuaW5nIENCIFNlYyBDaGFubmVsICUxZFxuIiksCisgICAgICBjaGFuTnVtICk7CisKKyAgcmV0dXJuIGNoYW5OdW07Cit9CisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9wRXh0c1V0aWxzLmggYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb3BFeHRzVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2YyZGEyCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9wRXh0c1V0aWxzLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1Qcm9wRXh0c1V0aWxzLmggY29udGFpbnMgdGhlIGRlZmluaXRpb25zCisgKiB1c2VkIGJ5IGFsbCBMSU0gbW9kdWxlcyB0byBzdXBwb3J0IHByb3ByaWV0YXJ5IGZlYXR1cmVzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMTIvMTEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKi8KKworI2lmbmRlZiBfX0xJTV9QUk9QX0VYVFNfVVRJTFNfSAorI2RlZmluZSBfX0xJTV9QUk9QX0VYVFNfVVRJTFNfSAorCisKKy8vIEZ1bmN0aW9uIHRlbXBsYXRlcwordm9pZCBsaW1RdWlldEJzcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIpOwordm9pZCBsaW1DbGVhbnVwTWVhc0RhdGEodHBBbmlTaXJHbG9iYWwpOwordm9pZCBsaW1EZWxldGVNZWFzVGltZXJzKHRwQW5pU2lyR2xvYmFsKTsKK3ZvaWQgbGltU3RvcE1lYXNUaW1lcnModHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGxpbUNsZWFudXBNZWFzUmVzb3VyY2VzKHRwQW5pU2lyR2xvYmFsKTsKK3ZvaWQgbGltUmVzdG9yZVByZUxlYXJuU3RhdGUodHBBbmlTaXJHbG9iYWwpOwordm9pZCBsaW1Db2xsZWN0TWVhc3VyZW1lbnREYXRhKHRwQW5pU2lyR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICosIHRwU2NoQmVhY29uU3RydWN0KTsKK3ZvaWQgbGltQ29sbGVjdFJTU0kodHBBbmlTaXJHbG9iYWwpOwordm9pZCBsaW1EZWxldGVDdXJyZW50QnNzV2RzTm9kZSh0cEFuaVNpckdsb2JhbCk7Cit0QU5JX1UzMiAgbGltQ29tcHV0ZUF2Zyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIsIHRBTklfVTMyKTsKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisvLyBUaW1lciBIYW5kbGVycwordm9pZCBsaW1NZWFzdXJlbWVudFRpbWVySGFuZGxlcihWT0lEKiwgdEFOSV9VMzIpOworI2VuZGlmCisKKy8vLyBGdW5jdGlvbiB0byBleHRyYWN0IEFQJ3MgSENGIGNhcGFiaWxpdHkgZnJvbSBJRSBmaWVsZHMKK3ZvaWQgbGltRXh0cmFjdEFwQ2FwYWJpbGl0eSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqLCB0QU5JX1UxNiwgdEFOSV9VOCAqLCB0QU5JX1UxNiAqLCB0QU5JX1U4ICosIHRQb3dlcmRCbSopOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkKKy8vLyBGdW5jdGlvbiB0byBleHRyYWN0IGN1cnJlbnQgTGVhcm4gY2hhbm5lbAordEFOSV9VOCBsaW1HZXRDdXJyZW50TGVhcm5DaGFubmVsKHRwQW5pU2lyR2xvYmFsKTsKKy8vIERldGVybWluZSBpZiBhIG5ld2x5IGRpc2NvdmVyZWQgQlNTIGlzIFRJVEFOLWNvbXBhdGlibGUKK3ZvaWQgaGFuZGxlTm9uVGl0YW5Cc3MoIHRwQW5pU2lyR2xvYmFsLCB0U2lyTmVpZ2hib3JCc3NXZHNJbmZvICk7CisjZW5kaWYKK2VQaHlDaGFuQm9uZFN0YXRlIGxpbUdldFBoeUNCU3RhdGUoIHRwQW5pU2lyR2xvYmFsICk7Cit0U3RhUmF0ZU1vZGUgbGltR2V0U3RhUGVlclR5cGUoIHRwQW5pU2lyR2xvYmFsLCB0cERwaEhhc2hOb2RlICx0cFBFU2Vzc2lvbik7Cit2b2lkIHNldHVwQ0JTdGF0ZSggdHBBbmlTaXJHbG9iYWwsIHRBbmlDQlNlY29uZGFyeU1vZGUgKTsKKwordEFOSV9VOCBsaW1HZXRDdXJyZW50Q0JTZWNDaGFubmVsKCB0cEFuaVNpckdsb2JhbCx0cFBFU2Vzc2lvbiApOworCisjZW5kaWYgLyogX19MSU1fUFJPUF9FWFRTX1VUSUxTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Sb2FtaW5nQWxnby5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Sb2FtaW5nQWxnby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NzE0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVJvYW1pbmdBbGdvLmMKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltUm9hbWluZ0FsZ28uY2MgY29udGFpbnMgdGhlIGNvZGUgZm9yIExJTQorICogYWxnb3JpdGhtcy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAzLzAxLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisjZWxzZQorI2luY2x1ZGUgInduaUNmZ1N0YS5oIgorI2VuZGlmCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisjaW5jbHVkZSAibGltVHlwZXMuaCIKKyNpbmNsdWRlICJsaW1UaW1lclV0aWxzLmgiCisKKworCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBXTEFOX1NUQSkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBsaW1TZWxlY3RzQmFja2dyb3VuZFNjYW5Nb2RlKCkgCitcYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Jc0JhY2tncm91bmRTY2FuQWxsb3dlZCgpLiAKK1wgICAgICAgIEhlcmUgTElNIGRlY2lkZXMgd2hldGhlciB3ZSBzaGFsbCBlbmZvcmNlIHRoaXMgYmFja2dyb3VuZCAKK1wgICAgICAgIHNjYW4gb3IgbGV0IEhBTCBkZWNpZGUgd2hldGhlciB0byBwcm9jZWVkIHdpdGggdGhlIGJhY2tncm91bmQgCitcICAgICAgICBzY2FuIGFzIEhBTCBzZWVzIGZpdHMuICBMSU0gc2hhbGwgZW5mb3JjZSBiYWNrZ3JvdW5kIHNjYW4gaWY6CitcICAgICAgICAxKSBzdGF0aW9uIGlzIG5vdCBpbiBsaW5rIGVzdGFibGlzaGVkIHN0YXRlCitcICAgICAgICAyKSBzdGF0aW9uIGlzIGluIGxpbmsgZXN0YWJsaXNoZWQgc3RhdGUsIGJ1dCB0aGVyZSBoYXMgYmVlbgorXCAgICAgICAgICAgbWF4IG51bWJlciBvZiBjb25zZWN1dGl2ZSBiYWNrZ3JvdW5kIHNjYW4gZmFpbHVyZS4KK1wgCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCAgcE1hYworXHJldHVybiAgbm9uZQorXCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit0U2lyQmFja2dyb3VuZFNjYW5Nb2RlIGxpbVNlbGVjdHNCYWNrZ3JvdW5kU2Nhbk1vZGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1UzMiAgICBjZmdWYWw7CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkUsICZjZmdWYWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbCB0byBnZXQgV05JX0NGR19NQVhfQ09OU0VDVVRJVkVfQkFDS0dST1VORF9TQ0FOX0ZBSUxVUkUgdmFsdWVcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfTk9STUFMX0JBQ0tHUk9VTkRfU0NBTjsKKyAgICB9CisgIAorICAgIGlmIChjZmdWYWwgPT0gMCkKKyAgICAgICAgcmV0dXJuIGVTSVJfTk9STUFMX0JBQ0tHUk9VTkRfU0NBTjsKKworICAgIC8qIElmIHRoZSAibnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJhY2tncm91bmQgc2NhbiBmYWlsdXJlIgorICAgICAqIGV4Y2VlZHMgdGhlIG1heGltdW0gYWxsb3dlZCwgdGhlbiBMSU0gc2hhbGwgdHJpZ2dlciBhbgorICAgICAqIGFnZ3Jlc3NpdmUgYmFja2dyb3VuZCBzY2FuLgorICAgICAqLworICAgIGlmIChwTWFjLT5saW0uZ0xpbU51bU9mQ29uc2VjdXRpdmVCa2duZFNjYW5GYWlsdXJlID49IGNmZ1ZhbCkKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5nTGltTnVtT2ZGb3JjZWRCa2duZFNjYW4gKz0gMTsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgiSGFkICVkIGNvbnNlYyBzY2FuIGZhaWwod2hlbiBleHBlY3QgPCAlZCkuIFRyaWdnZXIgQUdHUkVTU0lWRSBia2duZCBzY2FuLlxuIiksCisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU51bU9mQ29uc2VjdXRpdmVCa2duZFNjYW5GYWlsdXJlLCBjZmdWYWwpOworICAgICAgICByZXR1cm4gZVNJUl9BR0dSRVNTSVZFX0JBQ0tHUk9VTkRfU0NBTjsKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9OT1JNQUxfQkFDS0dST1VORF9TQ0FOOworfQorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICAgbGltSXNCYWNrZ3JvdW5kU2NhbkFsbG93ZWQKK1xicmllZiAgIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiBiYWNrZ3JvdW5kIHNjYW4gc2hvdWxkIGJlCitcICAgICAgICBhbGxvd2VkLiBJdCBpcyBjYWxsZWQgYnkgbGltVHJpZ2dlckJhY2tncm91bmRTY2FuKCkuIAorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKK1xyZXR1cm4gIG5vbmUKK1wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHRBTklfVTggIGxpbUlzQmFja2dyb3VuZFNjYW5BbGxvd2VkKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgLy8gaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzY2FuIGFscmVhZHksIHNraXAgdGhlIGJhY2tncm91bmQgc2NhbgorICAgIGlmIChsaW1Jc1N5c3RlbUluU2NhblN0YXRlKHBNYWMpIHx8CisgICAgICAgIChwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuRGlzYWJsZSkgfHwKKyAgICAgICAgKHBNYWMtPmxpbS5nTGltRm9yY2VCYWNrZ3JvdW5kU2NhbkRpc2FibGUpIHx8CisgICAgICAgIChwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuVGVybWluYXRlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy9uZWVkIHRvIGRvIGJhY2tncm91bmQgc2NhbiBpbiBJQlNTIG1vZGUuCisgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpCisgICAgeworICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9OT1JNQUxfU1RBVEUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIElmIHN0YXRpb24gaXMgbm90IGluIGxpbmsgZXN0YWJsaXNoZWQgc3RhdGUsIHRoZW4gc2tpcCBiYWNrZ3JvdW5kIHNjYW4KKyAgICBpZiAoIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSkgJiYgKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgIT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpICkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLyogbm93IHRoYXQgd2UgaGF2ZSBjaGVja2VkIGZvciBzY2FuIHN0YXRlLCBjaGVjayBmb3Igb3RoZXIgdHJhbnNpdGlvbmFsCisgICAgICogc3RhdGVzIHdoaWNoIHNob3VsZCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgc2NhbnMKKyAgICAgKi8KKyAgICBpZiAoKCEgKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgPT0gZUxJTV9TTUVfSURMRV9TVEFURSkgKSAmJgorICAgICAgICAoISAocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEUpICkgJiYKKyAgICAgICAgKCEgKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpICkgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBsaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW4oKQorXGJyaWVmICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiBiYWNrZ3JvdW5kIHNjYW4gaW50ZXJ2YWwKK1wgICAgICAgIHdoZW4gdGhlcmUgaXMgYW4gZXhpc2l0aW5nIGxpbmsgd2l0aCBhbiBBUC4KK1wgICAgICAgIFNNRV9TQ0FOX1JFUSBpcyBpc3N1ZWQgdG8gU01FIHN0YXRlIG1hY2hpbmUgd2l0aCBBY3RpdmUKK1wgICAgICAgIHNjYW5uaW5nIGlzIHBlcmZvcm1lZCBvbiBvbmUgY2hhbm5lbCBhdCBhIHRpbWUuCitcIAorXCAgICAgICAgQXNzdW1wdGlvbnM6CitcICAgICAgICBWYWxpZCBjaGFubmVsIGxpc3QgYXQgQ0ZHIGlzIGVpdGhlciBwb3B1bGF0ZWQgYnkgUm9hbWluZyAKK1wgICAgICAgIGFsZ29yaXRobSB1cG9uIGRldGVybWluaW5nL3NlbGVjdGluZyBhIHJlZ3VsYXRvcnkgZG9tYWluIAorXCAgICAgICAgb3IgYnkgZGVmYXVsdCBoYXMgYWxsIDM2IHBvc3NpYmxlIGNoYW5uZWxzLgorXAorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKK1xyZXR1cm4gIG5vbmUKK1wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgbGltVHJpZ2dlckJhY2tncm91bmRTY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VMzIgICAgbGVuICAgPSBXTklfQ0ZHX0JHX1NDQU5fQ0hBTk5FTF9MSVNUX0xFTjsKKyAgICB0QU5JX1UzMiAgICBzc2lkTGVuID0gU0lSX01BQ19NQVhfU1NJRF9MRU5HVEg7CisgICAgdFNpck1hY0NoYW5OdW0gICBiZ1NjYW5DaGFubmVsTGlzdFtXTklfQ0ZHX0JHX1NDQU5fQ0hBTk5FTF9MSVNUX0xFTl07CisgICAgdFNpclNtZVNjYW5SZXEgICBzbWVTY2FuUmVxOworICAgIHRTaXJNYWNBZGRyICAgICAgYmNBZGRyID0gezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9OworICAgIHRTaXJCYWNrZ3JvdW5kU2Nhbk1vZGUgICBiYWNrZ3JvdW5kU2NhbjsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkJhY2tncm91bmQgU2NhbjogJWQgc3VjY2VzcywgJWQgY29uc2VjIGZhaWwgXG4iKSwKKyAgICAgICAgcE1hYy0+bGltLmdMaW1OdW1PZkJhY2tncm91bmRTY2FuU3VjY2VzcywgIHBNYWMtPmxpbS5nTGltTnVtT2ZDb25zZWN1dGl2ZUJrZ25kU2NhbkZhaWx1cmUpOykKKworICAgIGlmICghIGxpbUlzQmFja2dyb3VuZFNjYW5BbGxvd2VkKHBNYWMpKQorICAgIHsKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU2tpcHBpbmcgQmFja2dyb3VuZCBTY2FuIFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEdldCBiYWNrZ3JvdW5kIHNjYW4gY2hhbm5lbCBsaXN0IGZyb20gQ0ZHCisgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsIFdOSV9DRkdfQkdfU0NBTl9DSEFOTkVMX0xJU1QsCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBiZ1NjYW5DaGFubmVsTGlzdCwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmbGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ291bGQgbm90IGdldCBWYWxpZCBjaGFubmVsIGxpc3QgZnJvbSBDRkcuCisgICAgICAgICAqIExvZyBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSB2YWxpZCBjaGFubmVsIGxpc3RcbiIpKTspCisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRpbWUgdG8gcGVyZm9ybSBiYWNrZ3JvdW5kIHNjYW4uIFByZXBhcmUgYW5kIGlzc3VlCisgICAgLy8gU01FX1NDQU5fUkVRIHRvIFNNRSBTdGF0ZSBtYWNoaW5lCisgICAgc21lU2NhblJlcS5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1NDQU5fUkVROworICAgIHNtZVNjYW5SZXEubGVuZ3RoICAgICAgPSBzaXplb2YodFNpclNtZVNjYW5SZXEpOworICAgIHNtZVNjYW5SZXEuYnNzVHlwZSAgICAgPSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREU7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgc21lU2NhblJlcS5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZiY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworIAorICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX1NTSUQsCisgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIChzbWVTY2FuUmVxLnNzSWRbMF0uc3NJZCksCisgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmc3NpZExlbikgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLy8vIENvdWxkIG5vdCBnZXQgU1NJRCBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBTU0lEXG4iKSk7CisgICAgfQorICAgIHNtZVNjYW5SZXEuc3NJZFswXS5sZW5ndGggPSAodEFOSV9VOCkgc3NpZExlbjsKKyAgICBzbWVTY2FuUmVxLm51bVNzaWQgPSAxOworCisgICAgc21lU2NhblJlcS5zY2FuVHlwZSAgICA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgc21lU2NhblJlcS5zZXNzaW9uSWQgPSAwOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQUNUSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FLAorICAgICAgICAgICAgICAgICAgJnNtZVNjYW5SZXEubWluQ2hhbm5lbFRpbWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8vLyBDb3VsZCBub3QgZ2V0IG1pbkNobFRpbWUgdmFsdWUgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIG1pbkNobFRpbWUgdmFsdWVcbiIpKTspCisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0FDVElWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSwKKyAgICAgICAgICAgICAgICAgICZzbWVTY2FuUmVxLm1heENoYW5uZWxUaW1lKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCBtYXhDaGxUaW1lIHZhbHVlIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBtYXhDaGxUaW1lIHZhbHVlXG4iKSk7KQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzbWVTY2FuUmVxLnJldHVybkFmdGVyRmlyc3RNYXRjaCA9IDA7CisgICAgc21lU2NhblJlcS5yZXR1cm5VbmlxdWVSZXN1bHRzICAgPSAxOworCisgICAgLy9BdCB0aGUgZmlyc3QgY2hhbm5lbCBzY2FuLCBjbGVhciB0aGUgY2FjaGVkIHJlc3VsdHMgCisgICAgaWYocE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhbkNoYW5uZWxJZCA9PSAwKQorICAgIHsKKyAgICAgICAgc21lU2NhblJlcS5yZXR1cm5GcmVzaFJlc3VsdHMgICAgPSBTSVJfQkdfU0NBTl9QVVJHRV9SRVNVVExTfFNJUl9CR19TQ0FOX1JFVFVSTl9GUkVTSF9SRVNVTFRTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbWVTY2FuUmVxLnJldHVybkZyZXNoUmVzdWx0cyAgICA9IFNJUl9CR19TQ0FOX1JFVFVSTl9GUkVTSF9SRVNVTFRTOworICAgIH0KKyAgIAorCisgICAgc21lU2NhblJlcS5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9IDE7CisgICAgaWYgKHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5DaGFubmVsSWQgPj0gbGVuKQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhbkNoYW5uZWxJZCA9IDA7CisKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU2tpcHBpbmcgQmFja2dyb3VuZCBTY2FuIHNpbmNlIHRoZSBjaGFubmVsIGxpc3QgaXMgZXhoYXVzdGVkLlxuIikpOykKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU01FIHNob3VsZCBzZW5kIFdOSV9DRkdfQkFDS0dST1VORF9TQ0FOX1BFUklPRCBpbmRpY2F0aW9uIHRvIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW4gYWdhaW4uXG4iKSk7KQorCisgICAgICAgIC8qIFN0b3AgdGhlIEJHIHNjYW4gdGltZXIgaGVyZS4gU01FIHNob3VsZCBzZW5kIFdOSV9DRkdfQkFDS0dST1VORF9TQ0FOX1BFUklPRCAKKyAgICAgICAgICogaW5kaWNhdGlvbiB0byBzdGFydCB0aGUgYmFja2dyb3VuZCBzY2FuIGFnYWluLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKFRYX1RJTUVSX1ZBTElEKHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUJhY2tncm91bmRTY2FuVGltZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQmFja2dyb3VuZFNjYW5UaW1lcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBkZWFjdGl2YXRlIEJhY2tncm91bmRTY2FuVGltZXIgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoInVuYWJsZSB0byBkZWFjdGl2YXRlIEJhY2tncm91bmRTY2FuVGltZXIgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5UZXJtaW5hdGUgPSBUUlVFOworCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNlbmQgZHVtbXkgc2NhbiB3aXRoIHJldHVybkZyZXNoUmVzdWx0cyBhcyAwIHRvIHJlcG9ydCBCRyBzY2FuIHJlc3VsdHMgdG8gU01FLlxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzbWVTY2FuUmVxLmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXJbMF0gPQorICAgICAgICAgICAgICBiZ1NjYW5DaGFubmVsTGlzdFtwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuQ2hhbm5lbElkKytdOworCisgICAgc21lU2NhblJlcS51SUVGaWVsZExlbiA9IDA7CisgICAgc21lU2NhblJlcS51SUVGaWVsZE9mZnNldCA9IHNpemVvZih0U2lyU21lU2NhblJlcSk7CisgICAgCisgICAgYmFja2dyb3VuZFNjYW4gPSBsaW1TZWxlY3RzQmFja2dyb3VuZFNjYW5Nb2RlKHBNYWMpOworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlBlcmZvcm1pbmcgKG1vZGUgJWQpIEJhY2tncm91bmQgU2NhbiBcbiIpLCBiYWNrZ3JvdW5kU2Nhbik7KQorICAgIHNtZVNjYW5SZXEuYmFja2dyb3VuZFNjYW5Nb2RlID0gYmFja2dyb3VuZFNjYW47CisgICAgCisgICAgLy9kZXRlcm1pbmUgd2hldGhlciB0byBzZW5kIHRoZSByZXN1bHRzIG9yIG5vdCwgSWYgc28sIG5vdGlmeSB0aGUgQkcgc2NhbiByZXN1bHRzIHRvIFNNRQorICAgIGlmIChwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuQ2hhbm5lbElkID49IGxlbikKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5nTGltUmVwb3J0QmFja2dyb3VuZFNjYW5SZXN1bHRzID0gVFJVRTsKKyAgICB9CisgICAgCisgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9TQ0FOX1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIgKikgJnNtZVNjYW5SZXEpOworfSAvKioqIGxpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbigpICoqKi8KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICAgbGltQWJvcnRCYWNrZ3JvdW5kU2NhbgorXGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhYm9ydHMgYmFja2dyb3VuZCBzY2FuIGFuZCBzZW5kIHNjYW4gCitcICAgICAgICByZXNwb25zZSB0byBTTUUuIAorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKK1xyZXR1cm4gIG5vbmUKK1wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBsaW1BYm9ydEJhY2tncm91bmRTY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VMTYgIHNjYW5Sc3BMZW4gPSA4OworCisgICAgaWYocE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhblRlcm1pbmF0ZSA9PSBGQUxTRSkgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkFib3J0IEJhY2tncm91bmQgU2NhbiBcbiIpKTsKKyAgICAgICAgaWYgKFRYX1RJTUVSX1ZBTElEKHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUJhY2tncm91bmRTY2FuVGltZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9CQUNLR1JPVU5EX1NDQU5fVElNRVIpOyAKKyAgICAgICAgfQorCisgICAgICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5UZXJtaW5hdGUgPSBUUlVFOworICAgICAgICBwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuU3RhcnRlZCA9IEZBTFNFOworCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVNtZVNjYW5SZXN1bHRMZW5ndGggPT0gMCkKKyAgICAgICAgICAgIGxpbVNlbmRTbWVTY2FuUnNwKHBNYWMsIHNjYW5Sc3BMZW4sIGVTSVJfU01FX1NVQ0NFU1MsIDAsIDApOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjYW5Sc3BMZW4gPSBzaXplb2YodFNpclNtZVNjYW5Sc3ApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVNjYW5SZXN1bHRMZW5ndGggLQorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pOworICAgICAgICAgICAgbGltU2VuZFNtZVNjYW5Sc3AocE1hYywgc2NhblJzcExlbiwgZVNJUl9TTUVfU1VDQ0VTUywgMCwgMCk7CisgICAgICAgIH0gICAgICAgCisgICAgfQorCisgICAgLy8gcmVzZXQgYmFja2dyb3VuZCBzY2FuIHZhcmlhYmxlcworICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5DaGFubmVsSWQgPSAwOyAgIAorICAgIHJldHVybjsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNjYW5SZXN1bHRVdGlscy5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TY2FuUmVzdWx0VXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODY2MTUyCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TY2FuUmVzdWx0VXRpbHMuYwpAQCAtMCwwICsxLDkyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbVNjYW5SZXN1bHRVdGlscy5jYyBjb250YWlucyB0aGUgdXRpbGl0eSBmdW5jdGlvbnMKKyAqIExJTSB1c2VzIGZvciBtYWludGFpbmluZyBhbmQgYWNjZXNzaW5nIHNjYW4gcmVzdWx0cyBvbiBTVEEuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMy8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZXJEZXNVdGlscy5oIgorI2luY2x1ZGUgImxpbUFwaS5oIgorI2luY2x1ZGUgImxpbVNlc3Npb24uaCIKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNpbmNsdWRlICJycm1BcGkuaCIKKyNlbmRpZgorCisKKworLyoqCisgKiBsaW1EZWFjdGl2ZU1pbkNoYW5uZWxUaW1lckR1cmluZ1NjYW4oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgc2NhbiB1cG9uIHJlY2VpdmluZworICogQmVhY29uL1Byb2JlIFJlc3BvbnNlIGZyYW1lIHRvIGRlYWN0aXZhdGUgTUlOIGNoYW5uZWwKKyAqIHRpbWVyIGlmIHJ1bm5pbmcuCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID09IGVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gZVNJUl9TVUNDRVNTIGluIGNhc2Ugb2Ygc3VjY2VzcworICovCisKK3RBTklfVTMyCitsaW1EZWFjdGl2YXRlTWluQ2hhbm5lbFRpbWVyRHVyaW5nU2Nhbih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGlmICgocE1hYy0+bGltLmdMaW1NbG1TdGF0ZSA9PSBlTElNX01MTV9XVF9QUk9CRV9SRVNQX1NUQVRFKSAmJiAocE1hYy0+bGltLmdMaW1IYWxTY2FuU3RhdGUgPT0gZUxJTV9IQUxfU0NBTk5JTkdfU1RBVEUpKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAgICAqIEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBpcyByZWNlaXZlZCBkdXJpbmcgYWN0aXZlIHNjYW5uaW5nLgorICAgICAgICAgICAgKiBEZWFjdGl2YXRlIE1JTiBjaGFubmVsIHRpbWVyIGlmIHJ1bm5pbmcuCisgICAgICAgICAgICAqLworICAgICAgICAKKyAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsZUxJTV9NSU5fQ0hBTk5FTF9USU1FUik7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX01BWF9DSEFOTkVMX1RJTUVSKSk7CisgICAgICAgIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltTWF4Q2hhbm5lbFRpbWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gVFhfVElNRVJfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgYWN0aXZhdGUgbWF4IGNoYW5uZWwgdGltZXIuCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLExPR1AsIEZMKCJjb3VsZCBub3QgYWN0aXZhdGUgbWF4IGNoYW5uZWwgdGltZXJcbiIpKTsKKworICAgICAgICAgICAgbGltQ29tcGxldGVNbG1TY2FuKHBNYWMsIGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRSk7CisgICAgICAgICAgICByZXR1cm4gVFhfVElNRVJfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyoqKiBlbmQgbGltRGVhY3RpdmF0ZU1pbkNoYW5uZWxUaW1lckR1cmluZ1NjYW4oKSAqKiovCisKKworCisvKioKKyAqIGxpbUNvbGxlY3RCc3NEZXNjcmlwdGlvbigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzY2FuIHVwb24gcmVjZWl2aW5nCisgKiBCZWFjb24vUHJvYmUgUmVzcG9uc2UgZnJhbWUgdG8gY2hlY2sgaWYgdGhlIHJlY2VpdmVkCisgKiBmcmFtZSBtYXRjaGVzIHNjYW4gY3JpdGVyaWEsIGNvbGxlY3QgQlNTIGRlc2NyaXB0aW9uCisgKiBhbmQgYWRkIGl0IHRvIGNhY2hlZCBzY2FuIHJlc3VsdHMuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEJQUiAtIFBvaW50ZXIgdG8gcGFyc2VkIEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFJ4UGFja2V0SW5mbyAgLSBQb2ludGVyIHRvIFJlY2VpdmVkIGZyYW1lJ3MgQkQKKyAqIC0tLS0tLS0tLWlmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSS0tLS0tLQorICogQHBhcmFtICBmU2Nhbm5pbmcgLSBmbGFnIHRvIGluZGljYXRlIGlmIGl0IGlzIGR1cmluZyBzY2FuLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQHJldHVybiBOb25lCisgKi8KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKK3ZvaWQKK2xpbUNvbGxlY3RCc3NEZXNjcmlwdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uIHBCUFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgKnBSeFBhY2tldEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgZlNjYW5uaW5nKQorI2Vsc2UKK3ZvaWQKK2xpbUNvbGxlY3RCc3NEZXNjcmlwdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uIHBCUFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbykKKyNlbmRpZgoreworICAgIHRBTklfVTggICAgICAgICAgICAgKnBCb2R5OworICAgIHRBTklfVTMyICAgICAgICAgICAgaWVMZW4gPSAwOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgcEhkcjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGNoYW5uZWxOdW07CisgICAgdEFOSV9VOCAgICAgICAgICAgICByeENoYW5uZWw7CisKKyAgICBwSGRyID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBSeFBhY2tldEluZm8pOworICAgIGllTGVuICAgID0gV0RBX0dFVF9SWF9QQVlMT0FEX0xFTihwUnhQYWNrZXRJbmZvKSAtIFNJUl9NQUNfQl9QUl9TU0lEX09GRlNFVDsKKyAgICByeENoYW5uZWwgPSBXREFfR0VUX1JYX0NIKHBSeFBhY2tldEluZm8pOworICAgIHBCb2R5ID0gV0RBX0dFVF9SWF9NUERVX0RBVEEocFJ4UGFja2V0SW5mbyk7CisKKworICAgIC8qKgorICAgICAqIExlbmd0aCBvZiBCU1MgZGVzcmlwdGlvbiBpcyB3aXRob3V0IGxlbmd0aCBvZgorICAgICAqIGxlbmd0aCBpdHNlbGYgYW5kIGxlbmd0aCBvZiBwb2ludGVyCisgICAgICogdGhhdCBob2xkcyB0aGUgbmV4dCBCU1MgZGVzY3JpcHRpb24KKyAgICAgKi8KKyAgICBwQnNzRGVzY3ItPmxlbmd0aCA9ICh0QU5JX1UxNikoCisgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pIC0gc2l6ZW9mKHRBTklfVTE2KSAtCisgICAgICAgICAgICAgICAgICAgIHNpemVvZih0QU5JX1UzMikgKyBpZUxlbik7CisKKyAgICAvLyBDb3B5IEJTUyBJZAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZwQnNzRGVzY3ItPmJzc0lkLAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcEhkci0+YnNzSWQsCisgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICAgIC8vIENvcHkgVGltZXN0YW1wLCBCZWFjb24gSW50ZXJ2YWwgYW5kIENhcGFiaWxpdHkgSW5mbworICAgIHBCc3NEZXNjci0+c2NhblN5c1RpbWVNc2VjID0gdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOworCisgICAgcEJzc0Rlc2NyLT50aW1lU3RhbXBbMF0gICA9IHBCUFItPnRpbWVTdGFtcFswXTsKKyAgICBwQnNzRGVzY3ItPnRpbWVTdGFtcFsxXSAgID0gcEJQUi0+dGltZVN0YW1wWzFdOworICAgIHBCc3NEZXNjci0+YmVhY29uSW50ZXJ2YWwgPSBwQlBSLT5iZWFjb25JbnRlcnZhbDsKKyAgICBwQnNzRGVzY3ItPmNhcGFiaWxpdHlJbmZvID0gbGltR2V0VTE2KCh0QU5JX1U4ICopICZwQlBSLT5jYXBhYmlsaXR5SW5mbyk7CisKKworICAgIC8qCisgICAgKiBUaGVyZSBpcyBhIG5hcnJvdyB3aW5kb3cgYWZ0ZXIgQ2hhbm5lbCBTd2l0Y2ggbXNnIGlzIHNlbnQgdG8gSEFMIGFuZCBiZWZvcmUgdGhlIEFHQyBpcyBzaHV0CisgICAgKiBkb3duIGFuZCBiZWFjb25zL1Byb2JlIFJzcHMgY2FuIHRyaWNrbGUgaW4gYW5kIHdlIG1heSByZXBvcnQgdGhlIGluY29ycmVjdCBjaGFubmVsIGluIDVHaHoKKyAgICAqIGJhbmQsIHNvIG5vdCByZWx5aW5nIG9uIHRoZSAnbGFzdCBTY2FubmVkIENoYW5uZWwnIHN0b3JlZCBpbiBMSU0uCisgICAgKiBJbnN0ZWFkIHVzZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgUlhQIGluIEJELiBUaGlzIHRoZSB0aGUgc2FtZSB2YWx1ZSB3aGljaCBIQUwgcHJvZ3JhbXMgaW50bworICAgICogUlhQIGJlZm9yZSBldmVyeSBjaGFubmVsIHN3aXRjaC4KKyAgICAqIFJpZ2h0IG5vdyB0aGVyZSBpcyBhIHByb2JsZW0gaW4gNUdoeiwgd2hlcmUgd2UgYXJlIHJlY2VpdmluZyBiZWFjb25zIGZyb20gYSBjaGFubmVsIGRpZmZlcmVudCBmcm9tCisgICAgKiB0aGUgY3VycmVudGx5IHNjYW5uZWQgY2hhbm5lbC4gc28gaW5jb3JyZWN0IGNoYW5uZWwgaXMgcmVwb3J0ZWQgdG8gQ1NSIGFuZCBhc3NvY2lhdGlvbiBkb2VzIG5vdCBoYXBwZW4uCisgICAgKiBTbyBmb3Igbm93IHdlIGtlZXAgb24gbG9va2luZyBmb3IgdGhlIGNoYW5uZWwgaW5mbyBpbiB0aGUgYmVhY29uIChEU1BhcmFtU2V0IElFIE9SIEhUIEluZm8gSUUpLCBhbmQgb25seSBpZiBpdAorICAgICogaXMgbm90IHByZXNlbnQgaW4gdGhlIGJlYWNvbiwgd2UgZ28gZm9yIHRoZSBjaGFubmVsIGluZm8gcHJlc2VudCBpbiBSWFAuCisgICAgKiBUaGlzIGZpeCB3aWxsIHdvcmsgZm9yIDVHaHogMTFuIGRldmljZXMsIGJ1dCBmb3IgMTFhIGRldmljZXMsIHdlIGhhdmUgdG8gcmVseSBvbiBSWFAgcm91dGluZyBmbGFnIHRvIGdldCB0aGUgY29ycmVjdCBjaGFubmVsLgorICAgICogU28gVGhlIHByb2JsZW0gb2YgaW5jb3JyZWN0IGNoYW5uZWwgcmVwb3J0aW5nIGluIDVHaHogd2lsbCBzdGlsbCByZW1haW4gZm9yIDExYSBkZXZpY2VzLgorICAgICovCisgICAgcEJzc0Rlc2NyLT5jaGFubmVsSWQgPSBsaW1HZXRDaGFubmVsRnJvbUJlYWNvbihwTWFjLCBwQlBSKTsKKworICAgIGlmIChwQnNzRGVzY3ItPmNoYW5uZWxJZCA9PSAwKQorICAgeworICAgICAgLyogSWYgdGhlIGNoYW5uZWwgSWQgaXMgbm90IHJldHJpZXZlZCBmcm9tIEJlYWNvbiwgZXh0cmFjdCB0aGUgY2hhbm5lbCBmcm9tIEJEICovCisgICAgICAvKiBVbm1hcHBlZCB0aGUgY2hhbm5lbC5UaGlzIFdlIGhhdmUgdG8gZG8gc2luY2Ugd2UgaGF2ZSBkb25lIG1hcHBpbmcgaW4gdGhlIGhhbCB0bworICAgICAgICAgb3ZlcmNvbWUgIHRoZSBsaW1pdGF0aW9uIG9mIFJYQkQgb2Ygbm90IGFibGUgdG8gYWNjb21vZGF0ZSB0aGUgYmlnZ2VyIGNoYW5uZWwgbnVtYmVyLiovCisgICAgICBpZiAoISggcnhDaGFubmVsID0gbGltVW5tYXBDaGFubmVsKHJ4Q2hhbm5lbCkpKQorICAgICAgeworICAgICAgICAgcnhDaGFubmVsID0gcE1hYy0+bGltLmdMaW1DdXJyZW50U2NhbkNoYW5uZWxJZDsKKyAgICAgIH0KKyAgICAgIHBCc3NEZXNjci0+Y2hhbm5lbElkID0gcnhDaGFubmVsOworICAgfQorCisgICAgcEJzc0Rlc2NyLT5jaGFubmVsSWRTZWxmID0gcnhDaGFubmVsOworICAgIHBCc3NEZXNjci0+dGl0YW5IdENhcHMgPSAwOworCisgICAgLy9GSVhNRV9DQk1PREUgOiBuZWVkIHRvIHNlcGVyYXRlIG91dCBUSVRBTiBhbmQgSFQgQ0IgbW9kZS4KKyAgICAvL0hUIG5laWdoYm9yIHdpdGggY2hhbm5lbCBib25kaW5nCisgICAgaWYoIHBCUFItPkhUQ2Fwcy5wcmVzZW50ICApCisgICAgeworICAgICAgICB0QW5pVGl0YW5IdENhcGFiaWxpdHlJbmZvIHRpdGFuSHRDYXBzID0gMDsKKyAgICAgICAgbGltR2V0SHRDYkFkbWluU3RhdGUocE1hYywgcEJQUi0+SFRDYXBzLCAmdGl0YW5IdENhcHMpOworICAgICAgICBpZiggcEJQUi0+SFRJbmZvLnByZXNlbnQgJiYKKyAgICAgICAgICBwQlBSLT5IVEluZm8uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCApCisgICAgICAgIHsKKworICAgICAgICAgICAgbGltR2V0SHRDYk9wU3RhdGUoIHBNYWMsCisgICAgICAgICAgICAgICAgcEJQUi0+SFRJbmZvLAorICAgICAgICAgICAgICAgICZ0aXRhbkh0Q2FwcyApOworICAgICAgICB9CisgICAgICAgIHBCc3NEZXNjci0+dGl0YW5IdENhcHMgPSAodEFOSV9VMzIpIHRpdGFuSHRDYXBzOworICAgIH0KKworICAgIC8vIElzIHRoaXMgaXMgYSBUSVRBTiBuZWlnaGJvcj8KKyAgICBlbHNlIGlmKCBwQlBSLT5wcm9wSUVpbmZvLmFuaUluZGljYXRvciAmJgorICAgICAgICBwQlBSLT5wcm9wSUVpbmZvLnRpdGFuUHJlc2VudCApCisgICAgeworICAgIHRBbmlUaXRhbkh0Q2FwYWJpbGl0eUluZm8gdGl0YW5IdENhcHMgPSAwOworICAgICAgcEJzc0Rlc2NyLT50aXRhbkh0Q2FwcyA9ICh0QU5JX1UzMikgdGl0YW5IdENhcHM7CisgICAgfQorCisgICAgLy9zZXQgdGhlIG5ldHdvcmsgdHlwZSBpbiBic3MgZGVzY3JpcHRpb24KKyAgICBjaGFubmVsTnVtID0gcEJzc0Rlc2NyLT5jaGFubmVsSWQ7CisgICAgcEJzc0Rlc2NyLT5ud1R5cGUgPSBsaW1HZXROd1R5cGUocE1hYywgY2hhbm5lbE51bSwgU0lSX01BQ19NR01UX0ZSQU1FLCBwQlBSKTsKKworICAgIHBCc3NEZXNjci0+YW5pSW5kaWNhdG9yID0gcEJQUi0+cHJvcElFaW5mby5hbmlJbmRpY2F0b3I7CisKKyAgICAvLyBDb3B5IFJTU0kgJiBTSU5SIGZyb20gQkQKKworICAgIFBFTE9HNChsaW1Mb2cocE1hYywgTE9HNCwgIioqKioqKioqKioqQlNTIERlc2NyaXB0aW9uIGZvciBCU1NJRDoqKioqKioqKioqKiAiKTsKKyAgICBzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0c0LCBwQnNzRGVzY3ItPmJzc0lkLCA2ICk7CisgICAgc2lyRHVtcEJ1ZiggcE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzQsICh0QU5JX1U4KilwUnhQYWNrZXRJbmZvLCAzNiApOykKKworICAgIHBCc3NEZXNjci0+cnNzaSA9ICh0QU5JX1M4KVdEQV9HRVRfUlhfUlNTSV9EQihwUnhQYWNrZXRJbmZvKTsKKyAgICAKKyAgICAvL1NJTlIgbm8gbG9uZ2VyIHJlcG9ydGVkIGJ5IEhXCisgICAgcEJzc0Rlc2NyLT5zaW5yID0gMDsKKworICAgIHBCc3NEZXNjci0+blJlY2VpdmVkVGltZSA9ICh0QU5JX1RJTUVTVEFNUClwYWxHZXRUaWNrQ291bnQocE1hYy0+aEhkZCk7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICBpZiggZlNjYW5uaW5nICkKKyAgICB7CisgICAgICAgcnJtR2V0U3RhcnRUU0YoIHBNYWMsIHBCc3NEZXNjci0+c3RhcnRUU0YgKTsKKyAgICAgICBwQnNzRGVzY3ItPnBhcmVudFRTRiA9IFdEQV9HRVRfUlhfVElNRVNUQU1QKHBSeFBhY2tldEluZm8pOyAKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgLy8gTW9iaWxpdHlEb21haW4KKyAgICBwQnNzRGVzY3ItPm1kaWVbMF0gPSAwOworICAgIHBCc3NEZXNjci0+bWRpZVsxXSA9IDA7CisgICAgcEJzc0Rlc2NyLT5tZGllWzJdID0gMDsKKyAgICBwQnNzRGVzY3ItPm1kaWVQcmVzZW50ID0gRkFMU0U7CisgICAgLy8gSWYgbWRpZSBpcyBwcmVzZW50IGluIHRoZSBwcm9iZSByZXNwIHdlIAorICAgIC8vIGZpbGwgaXQgaW4gdGhlIGJzcyBkZXNjcmlwdGlvbgorICAgIGlmKCBwQlBSLT5tZGllUHJlc2VudCkgCisgICAgeworICAgICAgICBwQnNzRGVzY3ItPm1kaWVQcmVzZW50ID0gVFJVRTsKKyAgICAgICAgcEJzc0Rlc2NyLT5tZGllWzBdID0gcEJQUi0+bWRpZVswXTsKKyAgICAgICAgcEJzc0Rlc2NyLT5tZGllWzFdID0gcEJQUi0+bWRpZVsxXTsKKyAgICAgICAgcEJzc0Rlc2NyLT5tZGllWzJdID0gcEJQUi0+bWRpZVsyXTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICBwQnNzRGVzY3ItPlFCU1NMb2FkX3ByZXNlbnQgPSBGQUxTRTsKKyAgICBwQnNzRGVzY3ItPlFCU1NMb2FkX2F2YWlsID0gMDsgCisgICAgaWYoIHBCUFItPlFCU1NMb2FkLnByZXNlbnQpIAorICAgIHsKKyAgICAgICAgcEJzc0Rlc2NyLT5RQlNTTG9hZF9wcmVzZW50ID0gVFJVRTsKKyAgICAgICAgcEJzc0Rlc2NyLT5RQlNTTG9hZF9hdmFpbCA9IHBCUFItPlFCU1NMb2FkLmF2YWlsOworICAgIH0KKyNlbmRpZgorICAgIC8vIENvcHkgSUUgZmllbGRzCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBCc3NEZXNjci0+aWVGaWVsZHMsCisgICAgICAgICAgICAgICAgICBwQm9keSArIFNJUl9NQUNfQl9QUl9TU0lEX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgIGllTGVuKTsKKworICAgIC8vc2lyRHVtcEJ1ZiggcE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPR1csICh0QU5JX1U4ICopIHBCc3NEZXNjciwgcEJzc0Rlc2NyLT5sZW5ndGggKyAyICk7CisgICAgbGltTG9nKCBwTWFjLCBMT0czLAorICAgICAgICBGTCgiQ29sbGVjdGVkIEJTUyBEZXNjcmlwdGlvbiBmb3IgQ2hhbm5lbCglMWQpLCBsZW5ndGgoJXUpLCBhbmlJbmRpY2F0b3IoJWQpLCBJRSBGaWVsZHMoJXUpXG4iKSwKKyAgICAgICAgcEJzc0Rlc2NyLT5jaGFubmVsSWQsCisgICAgICAgIHBCc3NEZXNjci0+bGVuZ3RoLAorICAgICAgICBwQnNzRGVzY3ItPmFuaUluZGljYXRvciwKKyAgICAgICAgaWVMZW4gKTsKKworICAgIHJldHVybjsKK30gLyoqKiBlbmQgbGltQ29sbGVjdEJzc0Rlc2NyaXB0aW9uKCkgKioqLworCisvKioKKyAqIGxpbUlzU2NhblJlcXVlc3RlZFNTSUQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgc2NhbiB1cG9uIHJlY2VpdmluZworICogQmVhY29uL1Byb2JlIFJlc3BvbnNlIGZyYW1lIHRvIGNoZWNrIGlmIHRoZSByZWNlaXZlZAorICogU1NJRCBpcyBwcmVzZW50IGluIHRoZSBsaXN0IG9mIHJlcXVlc3RlZCBTU0lEcyBpbiBzY2FuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgc3NJZCAtIFNTSUQgUmVjZWl2ZWQgaW4gYmVhY29ucy9Qcm9iZSByZXNwb25zZXMgdGhhdCBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXVzdGVkIFNTSUQgaW4gc2NhbiBsaXN0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBAcmV0dXJuIGJvb2xlYW4gLSBUUlVFIGlmIFNTSUQgaXMgcHJlc2VudCBpbiByZXF1ZXN0ZWQgbGlzdCwgRkFMU0Ugb3RoZXJ3aXNlCisgKi8KKwordEFOSV9CT09MRUFOIGxpbUlzU2NhblJlcXVlc3RlZFNTSUQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY1NTaWQgKnNzSWQpCit7CisgICAgdEFOSV9VOCBpID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5udW1Tc2lkOyBpKyspCisgICAgeworICAgICAgICBpZiAoIGVBTklfQk9PTEVBTl9UUlVFID09IHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCh0QU5JX1U4ICopIHNzSWQsCisgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPnNzSWRbaV0sCisgICAgICAgICAgICAgICAgICAgKHRBTklfVTgpIChwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5zc0lkW2ldLmxlbmd0aCArIDEpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7Cit9CisKKy8qKgorICogbGltQ2hlY2tBbmRBZGRCc3NEZXNjcmlwdGlvbigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzY2FuIHVwb24gcmVjZWl2aW5nCisgKiBCZWFjb24vUHJvYmUgUmVzcG9uc2UgZnJhbWUgdG8gY2hlY2sgaWYgdGhlIHJlY2VpdmVkCisgKiBmcmFtZSBtYXRjaGVzIHNjYW4gY3JpdGVyaWEsIGNvbGxlY3QgQlNTIGRlc2NyaXB0aW9uCisgKiBhbmQgYWRkIGl0IHRvIGNhY2hlZCBzY2FuIHJlc3VsdHMuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEJQUiAtIFBvaW50ZXIgdG8gcGFyc2VkIEJlYWNvbi9Qcm9iZSBSZXNwb25zZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFJ4UGFja2V0SW5mbyAgLSBQb2ludGVyIHRvIFJlY2VpdmVkIGZyYW1lJ3MgQkQKKyAqIEBwYXJhbSAgZlNjYW5uaW5nIC0gYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBCU1MgaXMgZnJvbSBjdXJyZW50IHNjYW4gb3IganVzdCBoYXBwZW4gdG8gcmVjZWl2ZSBhIGJlYWNvbgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbUNoZWNrQW5kQWRkQnNzRGVzY3JpcHRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJQcm9iZVJlc3BCZWFjb24gcEJQUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9CT09MRUFOIGZTY2FubmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBmUHJvYmVSc3ApCit7CisgICAgdExpbVNjYW5SZXN1bHROb2RlICAgKnBCc3NEZXNjcjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgZnJhbWVMZW4sIGllTGVuID0gMDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgcnhDaGFubmVsSW5CZWFjb24gPSAwOworICAgIGVIYWxTdGF0dXMgICAgICAgICAgICBzdGF0dXM7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgdFNpck1hY0FkZHIgYnNzaWQgPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgdEFOSV9CT09MRUFOIGZGb3VuZCA9IEZBTFNFOworICAgIHRwU2lyTWFjRGF0YUhkcjNhIHBIZHI7CisKKyAgICBwSGRyID0gV0RBX0dFVF9SWF9NUERVSEVBREVSM0EoKHRBTklfVTggKilwUnhQYWNrZXRJbmZvKTsKKworICAgIC8vQ2hlY2tpbmcgaWYgc2Nhbm5pbmcgZm9yIGEgcGFydGljdWxhciBCU1NJRAorICAgIGlmICgoZlNjYW5uaW5nKSAmJiAocE1hYy0+bGltLmdwTGltTWxtU2NhblJlcSkpIAorICAgIHsKKyAgICAgICAgZkZvdW5kID0gcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgcEhkci0+YWRkcjMsICZwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5ic3NJZCwgNik7CisgICAgICAgIGlmICghZkZvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPnAycFNlYXJjaCkgJiYKKyAgICAgICAgICAgICAgIChwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCBwQlBSLT5QMlBQcm9iZVJlcy5QMlBEZXZpY2VJbmZvLlAyUERldmljZUFkZHJlc3MsIAorICAgICAgICAgICAgICAgJnBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPmJzc0lkLCA2KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZkZvdW5kID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIENvbXBhcmUgU1NJRCB3aXRoIHRoZSBvbmUgc2VudCBpbgorICAgICAqIFByb2JlIFJlcXVlc3QgZnJhbWUsIGlmIGFueS4KKyAgICAgKiBJZiB0aGV5IGRvbid0IG1hdGNoLCBpZ25vcmUgdGhlCisgICAgICogQmVhY29uIGZyYW1lLgorICAgICAqIHBNYWMtPmxpbS5nTGltTWxtU2NhblJlcS0+c3NJZC5sZW5ndGggPT0gMAorICAgICAqIGluZGljYXRlcyBCcm9hZGNhc3QgU1NJRC4KKyAgICAgKiBXaGVuIGdMaW1SZXR1cm5BZnRlckZpcnN0TWF0Y2ggaXMgc2V0LCBpdCBtZWFucyB0aGUgc2NhbiBoYXMgdG8gbWF0Y2ggCisgICAgICogYSBTU0lEIChpZiBpdCBpcyBhbHNvIHNldCkuIElnbm9yZSB0aGUgb3RoZXIgQlNTIGluIHRoYXQgY2FzZS4KKyAgICAgKi8KKworICAgIGlmICgoKGZTY2FubmluZykgJiYgKCBwTWFjLT5saW0uZ0xpbVJldHVybkFmdGVyRmlyc3RNYXRjaCAmIDB4MDEgKSAKKyAgICAgICAgJiYgKHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPm51bVNzaWQpICYmCisgICAgICAgICAgICAgICAgICAgIWxpbUlzU2NhblJlcXVlc3RlZFNTSUQocE1hYywgJnBCUFItPnNzSWQpKQorICAgICAgICAgICAgICAgICAgIHx8ICAoIWZGb3VuZCAmJiAocE1hYy0+bGltLmdwTGltTWxtU2NhblJlcSAmJiBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5ic3NJZCkgJiYKKyAgICAgICAgICAgICAgICAgICAhcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgYnNzaWQsICZwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5ic3NJZCwgNikpCisgICAgICAgICAgICAgICAgICAgKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY2VpdmVkIFNTSUQgZG9lcyBub3QgbWF0Y2ggd2l0aAorICAgICAgICAgKiB0aGUgb25lIHdlJ3JlIHNjYW5uaW5nIGZvci4KKyAgICAgICAgICogSWdub3JlIHJlY2VpdmVkIEJlYWNvbiBmcmFtZQorICAgICAgICAgKi8KKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogVGhlcmUgaXMgbm8gcG9pbnQgaW4gY2FjaGluZyAmIHJlcG9ydGluZyB0aGUgc2NhbiByZXN1bHRzIGZvciBBUHMKKyAgICAgKiB3aGljaCBhcmUgaW4gdGhlIHByb2Nlc3Mgb2Ygc3dpdGNoaW5nIHRoZSBjaGFubmVsLiBTbywgd2UgYXJlIG5vdAorICAgICAqIGNhY2hpbmcgdGhlIHNjYW4gcmVzdWx0cyBmb3IgQVBzIHdoaWNoIGFyZSBhZHZlcnppbmcgdGhlIGNoYW5uZWwtc3dpdGNoCisgICAgICogZWxlbWVudCBpbiB0aGVpciBiZWFjb25zIGFuZCBwcm9iZSByZXNwb25zZXMuCisgICAgICovCisgICAgaWYocEJQUi0+Y2hhbm5lbFN3aXRjaFByZXNlbnQpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogSWYgYmVhY29uL3Byb2JlIHJlc3AgRFMgcGFyYW0gY2hhbm5lbCBkb2VzIG5vdCBtYXRjaCB3aXRoIAorICAgICAqIFJYIEJEIGNoYW5uZWwgdGhlbiBkb24ndCBzYXZlIHRoZSByZXN1bHRzLiBJdCBtaWdodCBiZSBhIGJlYWNvbgorICAgICAqIGZyb20gYW5vdGhlciBjaGFubmVsIGhlYXJkIGFzIG5vaXNlIG9uIHRoZSBjdXJyZW50IHNjYW5uaW5nIGNoYW5uZWwKKyAgICAgKi8KKworICAgIGlmIChwQlBSLT5kc1BhcmFtc1ByZXNlbnQpCisgICAgeworICAgICAgIC8qIFRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgaW4gMi40R0h6IG1vZGUgb3IgNUdIeiAxMW4gbW9kZSAqLworICAgICAgIHJ4Q2hhbm5lbEluQmVhY29uID0gbGltR2V0Q2hhbm5lbEZyb21CZWFjb24ocE1hYywgcEJQUik7CisgICAgICAgaWYgKHJ4Q2hhbm5lbEluQmVhY29uIDwgMTUpCisgICAgICAgeworICAgICAgICAgIC8qIFRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgaW4gMi40R0h6IG1vZGUgKi8KKyAgICAgICAgICBpZihXREFfR0VUX1JYX0NIKHBSeFBhY2tldEluZm8pICE9IHJ4Q2hhbm5lbEluQmVhY29uKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HMywgRkwoIkJlYWNvbi9Qcm9iZSBSc3AgZHJvcHBlZC4gQ2hhbm5lbCBpbiBCRCAlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbm5lbCBpbiBiZWFjb24iICIgJWRcbiIpLCAKKyAgICAgICAgICAgICAgICAgICAgV0RBX0dFVF9SWF9DSChwUnhQYWNrZXRJbmZvKSxsaW1HZXRDaGFubmVsRnJvbUJlYWNvbihwTWFjLCBwQlBSKSk7CisgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYnVmZmVyIHRvIGhvbGQgQlNTIGRlc2NyaXB0aW9uIGZyb20KKyAgICAgKiByZWNlaXZlZCBCZWFjb24gZnJhbWUuCisgICAgICogSW5jbHVkZSBzaXplIG9mIGZpeGVkIGZpZWxkcyBhbmQgSUVzIGxlbmd0aAorICAgICAqLworCisgICAgaWVMZW4gICAgPSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKHBSeFBhY2tldEluZm8pIC0gU0lSX01BQ19CX1BSX1NTSURfT0ZGU0VUOworICAgIGZyYW1lTGVuID0gc2l6ZW9mKHRMaW1TY2FuUmVzdWx0Tm9kZSkgKyBpZUxlbiAtIHNpemVvZih0QU5JX1UzMik7ICAgLy8gU2l6ZW9mKHRBTklfVTMyKSBpcyBmb3IgaWVGaWVsZHNbMV0KKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcEJzc0Rlc2NyLCBmcmFtZUxlbikpCisgICAgeworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgIEZMKCJjYWxsIGZvciBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIHN0b3JpbmcgQlNTIGRlc2NyaXB0aW9uXG4iKSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluIHNjYW4gc3RhdGUsIHN0b3JlIHNjYW4gcmVzdWx0LgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIGxpbUNvbGxlY3RCc3NEZXNjcmlwdGlvbihwTWFjLCAmcEJzc0Rlc2NyLT5ic3NEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJQUiwgcFJ4UGFja2V0SW5mbywgZlNjYW5uaW5nKTsKKyNlbHNlCisgICAgbGltQ29sbGVjdEJzc0Rlc2NyaXB0aW9uKHBNYWMsICZwQnNzRGVzY3ItPmJzc0Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQlBSLCBwUnhQYWNrZXRJbmZvKTsKKyNlbmRpZgorCisgICAgcEJzc0Rlc2NyLT5ic3NEZXNjcmlwdGlvbi5mUHJvYmVSc3AgPSBmUHJvYmVSc3A7CisKKyAgICBwQnNzRGVzY3ItPm5leHQgPSBOVUxMOworCisgICAgLyoqCisgICAgICogRGVwZW5kaW5nIG9uIHdoZXRoZXIgdG8gc3RvcmUgdW5pcXVlIG9yIGFsbAorICAgICAqIHNjYW4gcmVzdWx0cywgcGFzcyBoYXNoIHVwZGF0ZS9hZGQgcGFyYW1ldGVyCisgICAgICovCisKKyAgICAvL0lmIGl0IGlzIG5vdCBzY2FubmluZywgb25seSBzYXZlIHVuaXF1ZSByZXN1bHRzCisgICAgaWYgKHBNYWMtPmxpbS5nTGltUmV0dXJuVW5pcXVlUmVzdWx0cyB8fCAoIWZTY2FubmluZykpCisgICAgeworICAgICAgICBzdGF0dXMgPSBsaW1Mb29rdXBOYWRkSGFzaEVudHJ5KHBNYWMsIHBCc3NEZXNjciwgTElNX0hBU0hfVVBEQVRFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gbGltTG9va3VwTmFkZEhhc2hFbnRyeShwTWFjLCBwQnNzRGVzY3IsIExJTV9IQVNIX0FERCk7CisgICAgfQorCisgICAgaWYoZlNjYW5uaW5nKQorICAgIHsKKyAgICAgICAgaWYgKChwQnNzRGVzY3ItPmJzc0Rlc2NyaXB0aW9uLmNoYW5uZWxJZCA8PSAxNCkgJiYKKyAgICAgICAgICAgIChwTWFjLT5saW0uZ0xpbVJldHVybkFmdGVyRmlyc3RNYXRjaCAmIDB4NDApICYmCisgICAgICAgICAgICBwQlBSLT5jb3VudHJ5SW5mb1ByZXNlbnQpCisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbTI0QmFuZDExZFNjYW5Eb25lID0gMTsKKworICAgICAgICBpZiAoKHBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24uY2hhbm5lbElkID4gMTQpICYmCisgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1SZXR1cm5BZnRlckZpcnN0TWF0Y2ggJiAweDgwKSAmJgorICAgICAgICAgICAgcEJQUi0+Y291bnRyeUluZm9QcmVzZW50KQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW01MEJhbmQxMWRTY2FuRG9uZSA9IDE7CisKKyAgICAgICAgaWYgKCAoIHBNYWMtPmxpbS5nTGltUmV0dXJuQWZ0ZXJGaXJzdE1hdGNoICYgMHgwMSApIHx8CisgICAgICAgICAgICAgKCBwTWFjLT5saW0uZ0xpbTI0QmFuZDExZFNjYW5Eb25lICYmICggcE1hYy0+bGltLmdMaW1SZXR1cm5BZnRlckZpcnN0TWF0Y2ggJiAweDQwICkgKSB8fAorICAgICAgICAgICAgICggcE1hYy0+bGltLmdMaW01MEJhbmQxMWRTY2FuRG9uZSAmJiAoIHBNYWMtPmxpbS5nTGltUmV0dXJuQWZ0ZXJGaXJzdE1hdGNoICYgMHg4MCApICkgCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgIHx8IGZGb3VuZAorI2VuZGlmCisgICAgICAgICAgICAgKQorLyoKKyAgICAgICAgaWYgKChwTWFjLT5saW0uZ0xpbVJldHVybkFmdGVyRmlyc3RNYXRjaCAmIDB4MDEpIHx8CisgICAgICAgICAgICAocE1hYy0+bGltLmdMaW0yNEJhbmQxMWRTY2FuRG9uZSAmJgorICAgICAgICAgICAgICEocE1hYy0+bGltLmdMaW1SZXR1cm5BZnRlckZpcnN0TWF0Y2ggJiAweEMwKSkgfHwKKyAgICAgICAgICAgIChwTWFjLT5saW0uZ0xpbTUwQmFuZDExZFNjYW5Eb25lICYmCisgICAgICAgICAgICAgIShwTWFjLT5saW0uZ0xpbVJldHVybkFmdGVyRmlyc3RNYXRjaCAmIDB4QzApKSB8fAorICAgICAgICAgICAgKHBNYWMtPmxpbS5nTGltMjRCYW5kMTFkU2NhbkRvbmUgJiYKKyAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbTUwQmFuZDExZFNjYW5Eb25lICYmCisgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1SZXR1cm5BZnRlckZpcnN0TWF0Y2ggJiAweEMwKSkKKyovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogU3RvcCBzY2FubmluZyBhbmQgcmV0dXJuIHRoZSBCU1MgZGVzY3JpcHRpb24ocykKKyAgICAgICAgICAgICAqIGNvbGxlY3RlZCBzbyBmYXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLAorICAgICAgICAgICAgICAgICAgIExPR1csCisgICAgICAgICAgICAgICAgICAgRkwoIkNvbXBsZXRlZCBzY2FuOiAyNEJhbmQxMWRTY2FuID0gJWQsIDUwQmFuZDExZFNjYW4gPSAlZCBCU1MgaWRcbiIpLAorICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltMjRCYW5kMTFkU2NhbkRvbmUsCisgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW01MEJhbmQxMWRTY2FuRG9uZSk7CisKKyAgICAgICAgICAgIC8vTmVlZCB0byBkaXNhYmxlIHRoZSB0aW1lcnMuIElmIHRoZXkgZmlyZSwgdGhleSB3aWxsIHNlbmQgRU5EX1NDQU4KKyAgICAgICAgICAgIC8vd2hpbGUgd2UgYWxyZWFkeSBzZW5kIEZJTklTSF9TQ0FOIGhlcmUuIFRoaXMgbWF5IG1lc3MgdXAgdGhlIGdMaW1IYWxTY2FuU3RhdGUKKyAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01JTl9DSEFOTkVMX1RJTUVSKTsKKyAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX01BWF9DSEFOTkVMX1RJTUVSKTsKKyAgICAgICAgICAgIC8vU2V0IHRoZSByZXN1bWUgY2hhbm5lbCB0byBBbnkgdmFsaWQgY2hhbm5lbCAoaW52YWxpZCkuIAorICAgICAgICAgICAgLy9UaGlzIHdpbGwgaW5zdHJ1Y3QgSEFMIHRvIHNldCBpdCB0byBhbnkgcHJldmlvdXMgdmFsaWQgY2hhbm5lbC4KKyAgICAgICAgICAgIHBlU2V0UmVzdW1lQ2hhbm5lbChwTWFjLCAwLCAwKTsKKyAgICAgICAgICAgIGxpbVNlbmRIYWxGaW5pc2hTY2FuUmVxKCBwTWFjLCBlTElNX0hBTF9GSU5JU0hfU0NBTl9XQUlUX1NUQVRFICk7CisgICAgICAgICAgICAvL2xpbVNlbmRIYWxGaW5pc2hTY2FuUmVxKCBwTWFjLCBlTElNX0hBTF9GSU5JU0hfU0NBTl9XQUlUX1NUQVRFICk7CisgICAgICAgIH0KKyAgICB9Ly8oZUFOSV9CT09MRUFOX1RSVUUgPT0gZlNjYW5uaW5nKQorCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzICkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBCc3NEZXNjciApOworICAgIH0KK30gLyoqKioqKiBlbmQgbGltQ2hlY2tBbmRBZGRCc3NEZXNjcmlwdGlvbigpICoqKioqKi8KKworCisKKy8qKgorICogbGltU2Nhbkhhc2hGdW5jdGlvbigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzY2FuIGhhc2ggZW50cnkgb3BlcmF0aW9ucworICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIGJzc0lkIC0gUmVjZWl2ZWQgQlNTaWQKKyAqCisgKiBAcmV0dXJuIEhhc2ggaW5kZXgKKyAqLworCit0QU5JX1U4CitsaW1TY2FuSGFzaEZ1bmN0aW9uKHRTaXJNYWNBZGRyIGJzc0lkKQoreworICAgIHRBTklfVTE2ICAgIGksIGhhc2ggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZih0U2lyTWFjQWRkcik7IGkrKykKKyAgICAgICAgaGFzaCArPSBic3NJZFtpXTsKKworICAgIHJldHVybiBoYXNoICUgTElNX01BWF9OVU1fT0ZfU0NBTl9SRVNVTFRTOworfSAvKioqKioqIGVuZCBsaW1TY2FuSGFzaEZ1bmN0aW9uKCkgKioqKioqLworCisKKworLyoqCisgKiBsaW1Jbml0SGFzaFRhYmxlKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiByZWNlaXZpbmcgU01FX1NUQVJUX1JFUQorICogdG8gaW5pdGlhbGl6ZSBnbG9iYWwgY2FjaGVkIHNjYW4gaGFzaCB0YWJsZQorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1Jbml0SGFzaFRhYmxlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VMTYgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTElNX01BWF9OVU1fT0ZfU0NBTl9SRVNVTFRTOyBpKyspCisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2FjaGVkU2Nhbkhhc2hUYWJsZVtpXSA9IE5VTEw7Cit9IC8qKioqKiogZW5kIGxpbUluaXRIYXNoVGFibGUoKSAqKioqKiovCisKKworCisvKioKKyAqIGxpbUxvb2t1cE5hZGRIYXNoRW50cnkoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIHJlY2VpdmluZyBhIEJlYWNvbiBvcgorICogUHJvYmUgUmVzcG9uc2UgZnJhbWUgZHVyaW5nIHNjYW4gcGhhc2UgdG8gc3RvcmUKKyAqIHJlY2VpdmVkIEJTUyBkZXNjcmlwdGlvbiBpbnRvIHNjYW4gcmVzdWx0IGhhc2ggdGFibGUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEJzc0Rlc2NyIC0gUG9pbnRlciB0byBCU1MgZGVzY3JpcHRpb24gdG8gYmUKKyAqICAgICAgICAgYWRkZWQgdG8gdGhlIHNjYW4gcmVzdWx0IGhhc2ggdGFibGUuCisgKiBAcGFyYW0gIGFjdGlvbiAtIEluZGljYXRlcyBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkCisgKiAgICAgICAgIHdoZW4gc2FtZSBCU1MgZGVzY3JpcHRpb24gaXMgZm91bmQuIFRoaXMgaXMKKyAqICAgICAgICAgZGVwZW5kZW50IG9uIHdoZXRoZXIgdW5pcXVlIHNjYW4gcmVzdWx0IHRvCisgKiAgICAgICAgIGJlIHN0b3JlZCBvciBub3QuCisgKgorICogQHJldHVybiBOb25lCisgKi8KKworZUhhbFN0YXR1cworbGltTG9va3VwTmFkZEhhc2hFbnRyeSh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICB0TGltU2NhblJlc3VsdE5vZGUgKnBCc3NEZXNjciwgdEFOSV9VOCBhY3Rpb24pCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgIGluZGV4LCBzc2lkTGVuID0gMDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CisgICAgdExpbVNjYW5SZXN1bHROb2RlICpwdGVtcCwgKnBwcmV2OworICAgIHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqcFNpckNhcCwgKnBTaXJDYXBUZW1wOworICAgIGludCBpZHgsIGxlbjsKKyAgICB0QU5JX1U4ICpwYkllOworCisgICAgaW5kZXggPSBsaW1TY2FuSGFzaEZ1bmN0aW9uKHBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24uYnNzSWQpOworICAgIHB0ZW1wID0gcE1hYy0+bGltLmdMaW1DYWNoZWRTY2FuSGFzaFRhYmxlW2luZGV4XTsKKworICAgIC8vaWVGaWVsZHMgc3RhcnQgd2l0aCBUTFYgb2YgU1NJRCBJRQorICAgIHNzaWRMZW4gPSAqICgodEFOSV9VOCAqKSAmcEJzc0Rlc2NyLT5ic3NEZXNjcmlwdGlvbi5pZUZpZWxkcyArIDEpOworICAgIHBTaXJDYXAgPSAodFNpck1hY0NhcGFiaWxpdHlJbmZvICopJnBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24uY2FwYWJpbGl0eUluZm87CisKKyAgICBmb3IgKHBwcmV2ID0gcHRlbXA7IHB0ZW1wOyBwcHJldiA9IHB0ZW1wLCBwdGVtcCA9IHB0ZW1wLT5uZXh0KQorICAgIHsKKyAgICAgICAgLy9Gb3IgaW5mcmFzdHJ1Y3R1cmUsIG9ubHkgY2hlY2sgQlNTSUQuIEZvciBJQlNTLCBjaGVjayBtb3JlCisgICAgICAgIHBTaXJDYXBUZW1wID0gKHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqKSZwdGVtcC0+YnNzRGVzY3JpcHRpb24uY2FwYWJpbGl0eUluZm87CisgICAgICAgIGlmKChwU2lyQ2FwVGVtcC0+ZXNzID09IHBTaXJDYXAtPmVzcykgJiYgLy9tYXRjaGluZyBFU1MgdHlwZSBmaXJzdAorICAgICAgICAgICAgKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCh0QU5JX1U4ICopIHBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24uYnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcHRlbXAtPmJzc0Rlc2NyaXB0aW9uLmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpKSAmJiAgIC8vbWF0Y2hpbmcgQlNTSUQKKyAgICAgICAgICAgICgocFNpckNhcFRlbXAtPmVzcykgfHwgICAgLy93ZSBhcmUgZG9uZSBmb3IgaW5mcmFzdHJ1Y3R1cmUKKyAgICAgICAgICAgIC8vRm9yIElCU1MsIG1hdGNoaW5nIFNTSUQsIG53VHlwZSBhbmQgY2hhbm5lbElkCisgICAgICAgICAgICAoKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCgodEFOSV9VOCAqKSAmcEJzc0Rlc2NyLT5ic3NEZXNjcmlwdGlvbi5pZUZpZWxkcyArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0QU5JX1U4ICopICZwdGVtcC0+YnNzRGVzY3JpcHRpb24uaWVGaWVsZHMgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KSAoc3NpZExlbiArIDEpKSAmJgorICAgICAgICAgICAgKHBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24ubndUeXBlID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZW1wLT5ic3NEZXNjcmlwdGlvbi5ud1R5cGUpICYmCisgICAgICAgICAgICAocEJzc0Rlc2NyLT5ic3NEZXNjcmlwdGlvbi5jaGFubmVsSWQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlbXAtPmJzc0Rlc2NyaXB0aW9uLmNoYW5uZWxJZCkpKSkKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGb3VuZCB0aGUgc2FtZSBCU1MgZGVzY3JpcHRpb24KKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTElNX0hBU0hfVVBEQVRFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24uZlByb2JlUnNwICE9IHB0ZW1wLT5ic3NEZXNjcmlwdGlvbi5mUHJvYmVSc3ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1dlIGdldCBhIGRpZmZlcmVudCwgc2F2ZSB0aGUgb2xkIGZyYW1lIFdTQyBJRSBpZiBpdCBpcyB0aGVyZQorICAgICAgICAgICAgICAgICAgICBpZHggPSAwOworICAgICAgICAgICAgICAgICAgICBsZW4gPSBwdGVtcC0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoIC0gc2l6ZW9mKHRTaXJCc3NEZXNjcmlwdGlvbikgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRBTklfVTE2KSArIHNpemVvZih0QU5JX1UzMikgLSBET1QxMUZfSUVfV1NDUFJPQkVSRVNfTUlOX0xFTiAtIDI7CisgICAgICAgICAgICAgICAgICAgIHBiSWUgPSAodEFOSV9VOCAqKXB0ZW1wLT5ic3NEZXNjcmlwdGlvbi5pZUZpZWxkczsKKyAgICAgICAgICAgICAgICAgICAgLy9TYXZlIFdQUyBJRSBpZiBpdCBleGlzdHMKKyAgICAgICAgICAgICAgICAgICAgcEJzc0Rlc2NyLT5ic3NEZXNjcmlwdGlvbi5Xc2NJZUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKGlkeCA8IGxlbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKERPVDExRl9FSURfV1NDUFJPQkVSRVMgPT0gcGJJZVswXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwID09IHBiSWVbMl0pICYmICgweDUwID09IHBiSWVbM10pICYmICgweGYyID09IHBiSWVbNF0pICYmICgweDA0ID09IHBiSWVbNV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRm91bmQgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoRE9UMTFGX0lFX1dTQ1BST0JFUkVTX01BWF9MRU4gLSAyKSA+PSBwYkllWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwQnNzRGVzY3ItPmJzc0Rlc2NyaXB0aW9uLldzY0llUHJvYmVSc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiSWUsIHBiSWVbMV0gKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0Rlc2NyLT5ic3NEZXNjcmlwdGlvbi5Xc2NJZUxlbiA9IHBiSWVbMV0gKyAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCArPSBwYkllWzFdICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBiSWUgKz0gcGJJZVsxXSArIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgaWYoKHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPm51bVNzaWQpJiYKKyAgICAgICAgICAgICAgICAgICAgICAoIGxpbUlzTnVsbFNzaWQoKHRTaXJNYWNTU2lkICopKCh0QU5JX1U4ICopCisgICAgICAgICAgICAgICAgICAgICAgJnBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24uaWVGaWVsZHMgKyAxKSkpKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0aGlzIGVudHJ5CisgICAgICAgICAgICAgICAgaWYgKHB0ZW1wID09IHBNYWMtPmxpbS5nTGltQ2FjaGVkU2Nhbkhhc2hUYWJsZVtpbmRleF0pCisgICAgICAgICAgICAgICAgICAgIHBwcmV2ID0gcE1hYy0+bGltLmdMaW1DYWNoZWRTY2FuSGFzaFRhYmxlW2luZGV4XSA9IHB0ZW1wLT5uZXh0OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHByZXYtPm5leHQgPSBwdGVtcC0+bmV4dDsKKworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTWxtU2NhblJlc3VsdExlbmd0aCAtPQorICAgICAgICAgICAgICAgICAgICBwdGVtcC0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoICsgc2l6ZW9mKHRBTklfVTE2KTsKKworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHB0ZW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWRkIHRoaXMgQlNTIGRlc2NyaXB0aW9uIGF0IHNhbWUgaW5kZXgKKyAgICBpZiAocHByZXYgPT0gcE1hYy0+bGltLmdMaW1DYWNoZWRTY2FuSGFzaFRhYmxlW2luZGV4XSkKKyAgICB7CisgICAgICAgIHBCc3NEZXNjci0+bmV4dCA9IHBNYWMtPmxpbS5nTGltQ2FjaGVkU2Nhbkhhc2hUYWJsZVtpbmRleF07CisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2FjaGVkU2Nhbkhhc2hUYWJsZVtpbmRleF0gPSBwQnNzRGVzY3I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NEZXNjci0+bmV4dCA9IHBwcmV2LT5uZXh0OworICAgICAgICBwcHJldi0+bmV4dCA9IHBCc3NEZXNjcjsKKyAgICB9CisgICAgcE1hYy0+bGltLmdMaW1NbG1TY2FuUmVzdWx0TGVuZ3RoICs9CisgICAgICAgIHBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoICsgc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIkFkZGVkIG5ldyBCU1MgZGVzY3JpcHRpb24gc2l6ZSAlZCBUT1QgJWQgQlNTIGlkXG4iKSwKKyAgICAgICAgICAgcEJzc0Rlc2NyLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGgsCisgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTWxtU2NhblJlc3VsdExlbmd0aCk7CisgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24uYnNzSWQsIExPRzIpOykKKworICAgIC8vIFNlbmQgbmV3IEJTUyBmb3VuZCBpbmRpY2F0aW9uIHRvIEhERCBpZiBDRkcgb3B0aW9uIGlzIHNldAorICAgIGlmICghZm91bmQpIGxpbVNlbmRTbWVOZWlnaGJvckJzc0luZChwTWFjLCBwQnNzRGVzY3IpOworCisgICAgLy8KKyAgICAvLyBUT0RPOiBJRiBhcHBsaWNhYmxlLCBkbyB3ZSBuZWVkIHRvIHNlbmQ6CisgICAgLy8gTWVzZyAtIGVXTklfU01FX1dNX1NUQVRVU19DSEFOR0VfTlRGCisgICAgLy8gU3RhdHVzIGNoYW5nZSBjb2RlIC0gZVNJUl9TTUVfQ0JfTEVHQUNZX0JTU19GT1VORF9CWV9BUAorICAgIC8vCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworCisvKioKKyAqIGxpbURlbGV0ZUhhc2hFbnRyeSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24gdG8gZGVsZXRlCisgKiBhIEJTUyBkZXNjcmlwdGlvbiBmcm9tIHNjYW4gcmVzdWx0IGhhc2ggdGFibGUuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBZZXQgdG8gZmluZCB0aGUgdXRpbGl0eSBvZiB0aGUgZnVuY3Rpb24KKyAqCisgKiBAcGFyYW0gIHBCc3NEZXNjciAtIFBvaW50ZXIgdG8gQlNTIGRlc2NyaXB0aW9uIHRvIGJlCisgKiAgICAgICAgIGRlbGV0ZWQgZnJvbSB0aGUgc2NhbiByZXN1bHQgaGFzaCB0YWJsZS4KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkICAgIGxpbURlbGV0ZUhhc2hFbnRyeSh0TGltU2NhblJlc3VsdE5vZGUgKnBCc3NEZXNjcikKK3sKK30gLyoqKioqKiBlbmQgbGltRGVsZXRlSGFzaEVudHJ5KCkgKioqKioqLworCisKKworLyoqCisgKiBsaW1Db3B5U2NhblJlc3VsdCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVNZXNzYWdlcygpIHdoaWxlCisgKiBzZW5kaW5nIFNNRV9TQ0FOX1JTUCB3aXRoIHNjYW4gcmVzdWx0IHRvIEhERC4KKyAqCisgKkxPR0lDOgorICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHNjYW4gbGlzdCBzdG9yZWQgaW4gc2NhbiBoYXNoIHRhYmxlCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBEZXN0IC0gRGVzdGluYXRpb24gcG9pbnRlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbUNvcHlTY2FuUmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBEZXN0KQoreworICAgIHRMaW1TY2FuUmVzdWx0Tm9kZSAgICAqcHRlbXA7CisgICAgdEFOSV9VMTYgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTElNX01BWF9OVU1fT0ZfU0NBTl9SRVNVTFRTOyBpKyspCisgICAgeworICAgICAgICBpZiAoKHB0ZW1wID0gcE1hYy0+bGltLmdMaW1DYWNoZWRTY2FuSGFzaFRhYmxlW2ldKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZShwdGVtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLy8gQ29weSBlbnRpcmUgQlNTIGRlc2NyaXB0aW9uIGluY2x1ZGluZyBsZW5ndGgKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwdGVtcC0+YnNzRGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGVtcC0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoICsgMik7CisgICAgICAgICAgICAgICAgcERlc3QgKz0gcHRlbXAtPmJzc0Rlc2NyaXB0aW9uLmxlbmd0aCArIDI7CisgICAgICAgICAgICAgICAgcHRlbXAgPSBwdGVtcC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30gLyoqKioqKiBlbmQgbGltQ29weVNjYW5SZXN1bHQoKSAqKioqKiovCisKKworCisvKioKKyAqIGxpbURlbGV0ZUNhY2hlZFNjYW5SZXN1bHRzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkgdXBvbiByZWNlaXZpbmcKKyAqIFNNRV9TQ0FOX1JFUSB3aXRoIGZyZXNoIHNjYW4gcmVzdWx0IGZsYWcgc2V0LgorICoKKyAqTE9HSUM6CisgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgc2NhbiBsaXN0IHN0b3JlZCBpbiBzY2FuIGhhc2ggdGFibGUKKyAqIGFuZCBkZWxldGVzIHRoZSBlbnRyaWVzIGlmIGFueQorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltRGVsZXRlQ2FjaGVkU2NhblJlc3VsdHModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0TGltU2NhblJlc3VsdE5vZGUgICAgKnBOb2RlLCAqcE5leHROb2RlOworICAgIHRBTklfVTE2IGk7CisgICAgZm9yIChpID0gMDsgaSA8IExJTV9NQVhfTlVNX09GX1NDQU5fUkVTVUxUUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKChwTm9kZSA9IHBNYWMtPmxpbS5nTGltQ2FjaGVkU2Nhbkhhc2hUYWJsZVtpXSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHBOb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBOZXh0Tm9kZSA9IHBOb2RlLT5uZXh0OworCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBjdXJyZW50IG5vZGUKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTm9kZSk7CisKKyAgICAgICAgICAgICAgICBwTm9kZSA9IHBOZXh0Tm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBNYWMtPmxpbS5nTGltU21lU2NhblJlc3VsdExlbmd0aCA9IDA7Cit9IC8qKioqKiogZW5kIGxpbURlbGV0ZUNhY2hlZFNjYW5SZXN1bHRzKCkgKioqKioqLworCisKKworLyoqCisgKiBsaW1SZUluaXRTY2FuUmVzdWx0cygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGRlbGV0ZSBleGlzaXRpbmcgc2NhbiByZXN1bHRzCisgKiBhbmQgaW5pdGlhbGl6ZSB0aGUgc2NhbiBoYXNoIHRhYmxlCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVJlSW5pdFNjYW5SZXN1bHRzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgbGltRGVsZXRlQ2FjaGVkU2NhblJlc3VsdHMocE1hYyk7CisgICAgbGltSW5pdEhhc2hUYWJsZShwTWFjKTsKKworICAgIC8vICEhTEFDIC0gbmVlZCB0byBjbGVhciBvdXQgdGhlIGdsb2JhbCBzY2FuIHJlc3VsdCBsZW5ndGgKKyAgICAvLyBzaW5jZSB0aGUgbGlzdCB3YXMganVzdCBwdXJnZWQgZnJvbSB0aGUgaGFzaCB0YWJsZS4KKyAgICBwTWFjLT5saW0uZ0xpbU1sbVNjYW5SZXN1bHRMZW5ndGggPSAwOworCit9IC8qKioqKiogZW5kIGxpbVJlSW5pdFNjYW5SZXN1bHRzKCkgKioqKioqLwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TY2FuUmVzdWx0VXRpbHMuaCBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2NhblJlc3VsdFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxM2VhNgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2NhblJlc3VsdFV0aWxzLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbVNjYW5SZXN1bHRVdGlscy5oIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGRlZmluaXRpb25zCisgKiBMSU0gdXNlcyBmb3IgbWFpbnRhaW5pbmcgYW5kIGFjY2Vzc2luZyBzY2FuIHJlc3VsdHMgb24gU1RBLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9fTElNX1NDQU5fVVRJTFNfSAorI2RlZmluZSBfX0xJTV9TQ0FOX1VUSUxTX0gKKworI2luY2x1ZGUgInBhcnNlckFwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisKKy8vIFNjYW4gcmVzdWx0IGhhc2ggcmVsYXRlZCBmdW5jdGlvbnMKK3RBTklfVTggbGltU2Nhbkhhc2hGdW5jdGlvbih0U2lyTWFjQWRkcik7Cit2b2lkICAgIGxpbUluaXRIYXNoVGFibGUodHBBbmlTaXJHbG9iYWwpOworZUhhbFN0YXR1cyAgICAKKyAgIGxpbUxvb2t1cE5hZGRIYXNoRW50cnkodHBBbmlTaXJHbG9iYWwsIHRMaW1TY2FuUmVzdWx0Tm9kZSAqLCB0QU5JX1U4KTsKK3ZvaWQgICAgbGltRGVsZXRlSGFzaEVudHJ5KHRMaW1TY2FuUmVzdWx0Tm9kZSAqKTsKK3ZvaWQgICAgbGltRGVsZXRlQ2FjaGVkU2NhblJlc3VsdHModHBBbmlTaXJHbG9iYWwpOwordm9pZCAgICBsaW1SZXN0b3JlUHJlU2NhblN0YXRlKHRwQW5pU2lyR2xvYmFsKTsKK3ZvaWQgICAgbGltQ29weVNjYW5SZXN1bHQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTggKik7Cit2b2lkICAgIGxpbVJlSW5pdFNjYW5SZXN1bHRzKHRwQW5pU2lyR2xvYmFsKTsKK3RBTklfVTMyIGxpbURlYWN0aXZhdGVNaW5DaGFubmVsVGltZXJEdXJpbmdTY2FuKHRwQW5pU2lyR2xvYmFsKTsKK3ZvaWQgICAgbGltQ2hlY2tBbmRBZGRCc3NEZXNjcmlwdGlvbih0cEFuaVNpckdsb2JhbCwgdHBTaXJQcm9iZVJlc3BCZWFjb24sIHRBTklfVTggKiwgdEFOSV9CT09MRUFOLCB0QU5JX1U4KTsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKK3ZvaWQgICAgbGltQ29sbGVjdEJzc0Rlc2NyaXB0aW9uKHRwQW5pU2lyR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpclByb2JlUmVzcEJlYWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTgpOworI2Vsc2UKK3ZvaWQgICAgbGltQ29sbGVjdEJzc0Rlc2NyaXB0aW9uKHRwQW5pU2lyR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpclByb2JlUmVzcEJlYWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKik7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElNX1NDQU5fVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZWN1cml0eVV0aWxzLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlY3VyaXR5VXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWM3NzRmCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZWN1cml0eVV0aWxzLmMKQEAgLTAsMCArMSwxNDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltVXRpbHMuY2MgY29udGFpbnMgdGhlIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBMSU0gdXNlcy4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzEzLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAid25pQXBpLmgiCisKKyNpbmNsdWRlICJzaXJDb21tb24uaCIKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyNpbmNsdWRlICJ3bmlDZmdBcC5oIgorI2Vsc2UKKyNpbmNsdWRlICJ3bmlDZmdTdGEuaCIKKyNlbmRpZgorI2luY2x1ZGUgImNmZ0FwaS5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbERhdGFTdHJ1Y3QuaCIKKyNpbmNsdWRlICJoYWxDb21tb25BcGkuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbVNlY3VyaXR5VXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZXNzaW9uLmgiCisKKworI2RlZmluZSBMSU1fU0VFRF9MRU5HVEggMTYKKworLyoqCisgKiBsaW1Jc0F1dGhBbGdvU3VwcG9ydGVkKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdmFyaW91cyBwbGFjZXMgd2l0aGluIExJTSBjb2RlCisgKiB0byBkZXRlcm1pbmUgd2hldGhlciBwYXNzZWQgYXV0aGVudGljYXRpb24gYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAqIG9yIG5vdAorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gYXV0aFR5cGUgSW5kaWNhdGVzIE1BQyBiYXNlZCBhdXRoZW50aWNhdGlvbiB0eXBlCisgKiAgICAgICAgICAgICAgICAgKGVTSVJfT1BFTl9TWVNURU0gb3IgZVNJUl9TSEFSRURfS0VZKQorICogICAgICAgICAgICAgICAgIElmIFNoYXJlZCBLZXkgYXV0aGVudGljYXRpb24gdG8gYmUgdXNlZCwKKyAqICAgICAgICAgICAgICAgICAnUHJpdmFjeSBPcHRpb24gSW1wbGVtZW50ZWQnIGZsYWcgaXMgYWxzbworICogICAgICAgICAgICAgICAgIGNoZWNrZWQuCisgKgorICogQHJldHVybiB0cnVlIGlmIHBhc3NlZCBhdXRoVHlwZSBpcyBlbmFibGVkIGVsc2UgZmFsc2UKKyAqLworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3RBTklfVTgKK2xpbUlzQXV0aEFsZ29TdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFuaUF1dGhUeXBlIGF1dGhUeXBlLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQorI2Vsc2UKK3RBTklfVTgKK2xpbUlzQXV0aEFsZ29TdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFuaUF1dGhUeXBlIGF1dGhUeXBlKQorI2VuZGlmCit7CisgICAgdEFOSV9VMzIgYWxnb0VuYWJsZSwgcHJpdmFjeU9wdEltcDsKKworICAgIGlmIChhdXRoVHlwZSA9PSBlU0lSX09QRU5fU1lTVEVNKQorICAgIHsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgaWYoKHBzZXNzaW9uRW50cnktPmF1dGhUeXBlID09IGVTSVJfT1BFTl9TWVNURU0pIHx8IChwc2Vzc2lvbkVudHJ5LT5hdXRoVHlwZSA9PSBlU0lSX0FVVE9fU1dJVENIKSkKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfT1BFTl9TWVNURU1fQVVUSF9FTkFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgJmFsZ29FbmFibGUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IEF1dGhBbGdvMSBFbmFibGUgdmFsdWUKKyAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBBdXRoQWxnbzEgRW5hYmxlIHZhbHVlXG4iKSk7CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKCAoYWxnb0VuYWJsZSA+IDAgPyB0cnVlIDogZmFsc2UpICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICB7CisgICAgICAgICAgICBpZigocHNlc3Npb25FbnRyeS0+YXV0aFR5cGUgPT0gZVNJUl9TSEFSRURfS0VZKSB8fCAocHNlc3Npb25FbnRyeS0+YXV0aFR5cGUgPT0gZVNJUl9BVVRPX1NXSVRDSCkpCisgICAgICAgICAgICAgICAgYWxnb0VuYWJsZSA9IHRydWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWxnb0VuYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU0hBUkVEX0tFWV9BVVRIX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAmYWxnb0VuYWJsZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENvdWxkIG5vdCBnZXQgQXV0aEFsZ28yIEVuYWJsZSB2YWx1ZQorICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBBdXRoQWxnbzIgRW5hYmxlIHZhbHVlXG4iKSk7CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmFjeU9wdEltcCA9IHBzZXNzaW9uRW50cnktPnByaXZhY3k7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUFJJVkFDWV9FTkFCTEVELAorICAgICAgICAgICAgICAgICAgICAgICZwcml2YWN5T3B0SW1wKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBQcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQgdmFsdWUKKyAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBQcml2YWN5T3B0SW1wbGVtZW50ZWQgdmFsdWVcbiIpKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGFsZ29FbmFibGUgJiYgcHJpdmFjeU9wdEltcCk7CisgICAgfQorfSAvKioqKioqIGVuZCBsaW1Jc0F1dGhBbGdvU3VwcG9ydGVkKCkgKioqKioqLworCisKKworLyoqCisgKiBsaW1Jbml0UHJlQXV0aExpc3QKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgc3RhcnRpbmcgYSBCU1MgYXQgQVAKKyAqIHRvIGluaXRpYWxpemUgTUFDIGF1dGhlbnRpY2F0ZWQgU1RBIGxpc3QuIFRoaXMgbWF5IGFsc28gYmUgY2FsbGVkCisgKiB3aGlsZSBqb2luaW5nL3N0YXJ0aW5nIGFuIElCU1MgaWYgTUFDIGF1dGhlbnRpY2F0aW9uIGlzIGFsbG93ZWQKKyAqIGluIElCU1MgbW9kZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbUluaXRQcmVBdXRoTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHBNYWMtPmxpbS5wTGltUHJlQXV0aExpc3QgPSBOVUxMOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKQorICAgIHsKKyAgICAgICAgdEFOSV9VMzIgYXV0aENsbnVwVGltZW91dDsKKyAgICAgICAgLy90QU5JX1UzMiBjZmdWYWx1ZTsKKworICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QUkVBVVRIX0NMTlVQX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgJmF1dGhDbG51cFRpbWVvdXQpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IFByZUF1dGhDbG51cFRpbWVvdXQgdmFsdWUKKyAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBQcmVBdXRoQ2xudXBUaW1lb3V0IHZhbHVlXG4iKSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhdXRoQ2xudXBUaW1lb3V0ID0gU1lTX01TX1RPX1RJQ0tTKGF1dGhDbG51cFRpbWVvdXQpOworCisgICAgICAgIC8vLyBDcmVhdGUgYW5kIHN0YXJ0IHBlcmlvZGljIHByZS1hdXRoIGNvbnRleHQgY2xlYW51cCB0aW1lb3V0CisgICAgICAgIGlmICh0eF90aW1lcl9jcmVhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVByZUF1dGhDbG51cFRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVBdXRoQ2xlYW51cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltVGltZXJIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9MSU1fUFJFQVVUSF9DTE5VUF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhDbG51cFRpbWVvdXQsIGF1dGhDbG51cFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfQVVUT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBjcmVhdGUgUHJlQXV0aENsZWFudXAgdGltZXIuCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IGNyZWF0ZSBQcmVBdXRoQ2xlYW51cCB0aW1lclxuIikpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfUlRBSV9MSU5VWCkKKyAgICAgICAgdHhfdGltZXJfc2V0X2V4cGlyeV9saXN0KCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QcmVBdXRoQ2xudXBUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9USU1FUl9FWFBJUllfTElTVCk7CisjZW5kaWYKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgRkwoIkNyZWF0ZWQgcHJlLWF1dGggY2xlYW51cCB0aW1lclxuIikpOykKKworICAgIH0KKyNlbmRpZgorfSAvKioqIGVuZCBsaW1Jbml0UHJlQXV0aExpc3QoKSAqKiovCisKKworCisvKioKKyAqIGxpbURlbGV0ZVByZUF1dGhMaXN0CisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGNsZWFudXAgUHJlLWF1dGggbGlzdCBlaXRoZXIgb24KKyAqIEFQIG9yIG9uIFNUQSB3aGVuIG1vdmluZyBmcm9tIG9uZSBwZXJzb25hIHRvIG90aGVyLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltRGVsZXRlUHJlQXV0aExpc3QodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICAgICpwQ3Vyck5vZGUsICpwVGVtcE5vZGU7CisKKyAgICBwQ3Vyck5vZGUgPSBwVGVtcE5vZGUgPSBwTWFjLT5saW0ucExpbVByZUF1dGhMaXN0OworICAgIHdoaWxlIChwQ3Vyck5vZGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBUZW1wTm9kZSA9IHBDdXJyTm9kZS0+bmV4dDsKKworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT09PT4gbGltRGVsZXRlUHJlQXV0aExpc3QgXG4iKSk7KQorICAgICAgICBsaW1SZWxlYXNlUHJlQXV0aE5vZGUocE1hYywgcEN1cnJOb2RlKTsKKworICAgICAgICBwQ3Vyck5vZGUgPSBwVGVtcE5vZGU7CisgICAgfQorICAgIHBNYWMtPmxpbS5wTGltUHJlQXV0aExpc3QgPSBOVUxMOworfSAvKioqIGVuZCBsaW1EZWxldGVQcmVBdXRoTGlzdCgpICoqKi8KKworCisKKy8qKgorICogbGltU2VhcmNoUHJlQXV0aExpc3QKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBBdXRoZW50aWNhdGlvbiBmcmFtZSBpcyByZWNlaXZlZAorICogYnkgQVAgKG9yIGF0IGEgU1RBIGluIElCU1Mgc3VwcG9ydGluZyBNQUMgYmFzZWQgYXV0aGVudGljYXRpb24pCisgKiB0byBzZWFyY2ggaWYgYSBTVEEgaXMgaW4gdGhlIG1pZGRsZSBvZiBNQUMgQXV0aGVudGljYXRpb24KKyAqIHRyYW5zYWN0aW9uIHNlcXVlbmNlLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBtYWNBZGRyIC0gTUFDIGFkZHJlc3Mgb2YgdGhlIFNUQSB0aGF0IHNlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvbiBmcmFtZS4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gcHJlLWF1dGggbm9kZSBpZiBmb3VuZCwgZWxzZSBOVUxMCisgKi8KKworc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqCitsaW1TZWFyY2hQcmVBdXRoTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBtYWNBZGRyKQoreworICAgIHN0cnVjdCB0TGltUHJlQXV0aE5vZGUgICAgKnBUZW1wTm9kZSA9IHBNYWMtPmxpbS5wTGltUHJlQXV0aExpc3Q7CisKKyAgICB3aGlsZSAocFRlbXBOb2RlICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsKHRBTklfVTggKikgbWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcFRlbXBOb2RlLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBwVGVtcE5vZGUgPSBwVGVtcE5vZGUtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIHBUZW1wTm9kZTsKK30gLyoqKiBlbmQgbGltU2VhcmNoUHJlQXV0aExpc3QoKSAqKiovCisKKworCisvKioKKyAqIGxpbUFkZFByZUF1dGhOb2RlCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IEFQIHdoaWxlIHNlbmRpbmcgQXV0aGVudGljYXRpb24KKyAqIGZyYW1lMi4KKyAqIFRoaXMgbWF5IGFsc28gYmUgY2FsbGVkIG9uIGEgU1RBIGluIElCU1MgaWYgTUFDIGF1dGhlbnRpY2F0aW9uIGlzCisgKiBhbGxvd2VkIGluIElCU1MgbW9kZS4KKyAqCisgKkxPR0lDOgorICogTm9kZSBpcyBhbHdheXMgYWRkZWQgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwQXV0aE5vZGUgLSBQb2ludGVyIHRvIHByZS1hdXRoIG5vZGUgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3QuCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltQWRkUHJlQXV0aE5vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqcEF1dGhOb2RlKQoreworICAgIHBNYWMtPmxpbS5nTGltTnVtUHJlQXV0aENvbnRleHRzKys7CisKKyAgICBwQXV0aE5vZGUtPm5leHQgPSBwTWFjLT5saW0ucExpbVByZUF1dGhMaXN0OworCisgICAgcE1hYy0+bGltLnBMaW1QcmVBdXRoTGlzdCA9IHBBdXRoTm9kZTsKK30gLyoqKiBlbmQgbGltQWRkUHJlQXV0aE5vZGUoKSAqKiovCisKKworLyoqCisgKiBsaW1SZWxlYXNlUHJlQXV0aE5vZGUKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhbGVhc2UgdGhlIGFjY3F1aXJlZAorICogcHJlIGF1dGggbm9kZSBmcm9tIGxpc3QuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBBdXRoTm9kZSAtIFBvaW50ZXIgdG8gUHJlIEF1dGggbm9kZSB0byBiZSByZWxlYXNlZAorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUmVsZWFzZVByZUF1dGhOb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwTGltUHJlQXV0aE5vZGUgcEF1dGhOb2RlKQoreworICAgIHBBdXRoTm9kZS0+ZkZyZWUgPSAxOworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEUsIDAsIGVMSU1fUFJFX0FVVEhfQ0xFQU5VUF9USU1FUikpOworICAgIHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBBdXRoTm9kZS0+dGltZXIpOyAgICAgICAgICAgICAgICAKKyAgICBwTWFjLT5saW0uZ0xpbU51bVByZUF1dGhDb250ZXh0cy0tOworfSAvKioqIGVuZCBsaW1SZWxlYXNlUHJlQXV0aE5vZGUoKSAqKiovCisKKworLyoqCisgKiBsaW1EZWxldGVQcmVBdXRoTm9kZQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBBUCB3aGVuIGEgcHJlLWF1dGhlbnRpY2F0ZWQgU1RBIGlzCisgKiBBc3NvY2lhdGVkL1JlYXNzb2NpYXRlZCBvciB3aGVuIEF1dGhGcmFtZTQgaXMgcmVjZWl2ZWQgYWZ0ZXIKKyAqIEF1dGggUmVzcG9uc2UgdGltZW91dC4KKyAqIFRoaXMgbWF5IGFsc28gYmUgY2FsbGVkIG9uIGEgU1RBIGluIElCU1MgaWYgTUFDIGF1dGhlbnRpY2F0aW9uIGFuZAorICogQXNzb2NpYXRpb24vUmVhc3NvY2lhdGlvbiBpcyBhbGxvd2VkIGluIElCU1MgbW9kZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcGVlck1hY0FkZHIgLSBNQUMgYWRkcmVzcyBvZiB0aGUgU1RBIHRoYXQgbmVlZCB0byBiZSBkZWxldGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwcmUtYXV0aCBub2RlIGxpc3QuCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltRGVsZXRlUHJlQXV0aE5vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgbWFjQWRkcikKK3sKKyAgICBzdHJ1Y3QgdExpbVByZUF1dGhOb2RlICAgICpwUHJldk5vZGUsICpwVGVtcE5vZGU7CisKKyAgICBwVGVtcE5vZGUgPSBwUHJldk5vZGUgPSBwTWFjLT5saW0ucExpbVByZUF1dGhMaXN0OworCisgICAgaWYgKHBUZW1wTm9kZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsKHRBTklfVTggKikgbWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwVGVtcE5vZGUtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkgKQorICAgIHsKKyAgICAgICAgLy8gRmlyc3Qgbm9kZSB0byBiZSBkZWxldGVkCisKKyAgICAgICAgcE1hYy0+bGltLnBMaW1QcmVBdXRoTGlzdCA9IHBUZW1wTm9kZS0+bmV4dDsKKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgICAgICAvLyBEZWxldGUgdGhlIGF1dGggcmVzcG9uc2UgdGltZXIgaWYgcnVubmluZworICAgICAgICBpZiAocFRlbXBOb2RlLT5mVGltZXJTdGFydGVkKQorICAgICAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVBlclN0YUlkVGltZXIocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fQVVUSF9SU1BfVElNRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE5vZGUtPmF1dGhOb2RlSWR4KTsKKworI2VuZGlmCisKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiPT09PT0+IGxpbURlbGV0ZVByZUF1dGhOb2RlIDogZmlyc3Qgbm9kZSB0byBkZWxldGVcbiIpKTspCisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlbGVhc2UgZGF0YSBlbnRyeTogJXggaWQgJWQgcGVlciBcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBOb2RlLCBwVGVtcE5vZGUtPmF1dGhOb2RlSWR4KTsKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIG1hY0FkZHIsIExPRzEpOykKKyAgICAgICAgbGltUmVsZWFzZVByZUF1dGhOb2RlKHBNYWMsIHBUZW1wTm9kZSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBUZW1wTm9kZSA9IHBUZW1wTm9kZS0+bmV4dDsKKworICAgIHdoaWxlIChwVGVtcE5vZGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwodEFOSV9VOCAqKSBtYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwVGVtcE5vZGUtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRm91bmQgbm9kZSB0byBiZSBkZWxldGVkCisKKyAgICAgICAgICAgIHBQcmV2Tm9kZS0+bmV4dCA9IHBUZW1wTm9kZS0+bmV4dDsKKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBhdXRoIHJlc3BvbnNlIHRpbWVyIGlmIHJ1bm5pbmcKKyAgICAgICAgICAgIGlmIChwVGVtcE5vZGUtPmZUaW1lclN0YXJ0ZWQpCisgICAgICAgICAgICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVBlclN0YUlkVGltZXIocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTElNX0FVVEhfUlNQX1RJTUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wTm9kZS0+YXV0aE5vZGVJZHgpOworI2VuZGlmCisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT09PT4gbGltRGVsZXRlUHJlQXV0aE5vZGUgOiBzdWJzZXF1ZW50IG5vZGUgdG8gZGVsZXRlXG4iKSk7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlbGVhc2UgZGF0YSBlbnRyeTogJXggaWQgJWQgcGVlciBcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wTm9kZSwgcFRlbXBOb2RlLT5hdXRoTm9kZUlkeCk7CisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgbWFjQWRkciwgTE9HMSk7KQorICAgICAgICAgICAgbGltUmVsZWFzZVByZUF1dGhOb2RlKHBNYWMsIHBUZW1wTm9kZSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHBQcmV2Tm9kZSA9IHBUZW1wTm9kZTsKKyAgICAgICAgcFRlbXBOb2RlID0gcFRlbXBOb2RlLT5uZXh0OworICAgIH0KKworICAgIC8vIFNob3VsZCBub3QgYmUgaGVyZQorICAgIC8vIExvZyBlcnJvcgorICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgicGVlciBub3QgZm91bmQgaW4gcHJlLWF1dGggbGlzdCwgYWRkcj0gIikpOworICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBtYWNBZGRyLCBMT0dQKTsKKworfSAvKioqIGVuZCBsaW1EZWxldGVQcmVBdXRoTm9kZSgpICoqKi8KKworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisvKioKKyAqIGxpbVByZUF1dGhDbG51cEhhbmRsZXIKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gQVAgdXBvbiBwZXJpZGljIFByZS1hdXRoZW50aWNhdGlvbgorICogY29udGV4dCBjbGVhbnVwLgorICoKKyAqTE9HSUM6CisgKiBBIFByZS1hdXRoIG5vZGUgaXMgbWFya2VkIGFzIHNlZW4gZmlyc3QgdGltZSBpdCBjb21lcyBhY3Jvc3MKKyAqIHRoZSBsaXN0IHRyYXZlcnNhbC4gSXQnbGwgYmUgZGVsZXRlZCBpZiBhbHJlYWR5ICdzZWVuJyAoZHVyaW5nCisgKiBuZXh0IFByZS1hdXRoIGNsZWFudXApLgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVByZUF1dGhDbG51cEhhbmRsZXIodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgYWlkOworICAgIHRBTklfVTggICAgICAgICAgICAgZmlyc3ROb2RlPWZhbHNlOworICAgIHRwRHBoSGFzaE5vZGUgICAgcFN0YURzOworICAgIHN0cnVjdCB0TGltUHJlQXV0aE5vZGUgICpwUHJldk5vZGUsICpwQ3Vyck5vZGU7CisKKyNpZmRlZiBHRU42X1RPRE8KKyAgICAvL2ZldGNoIHRoZSBzZXNzaW9uRW50cnkgYmFzZWQgb24gdGhlIHNlc3Npb25JZAorICAgIC8vcHJpb3JpdHkgLSBNRURJVU0KKyAgICB0cFBFU2Vzc2lvbiBzZXNzaW9uRW50cnk7CisKKyAgICBpZigoc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsIHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVByZUF1dGhDbG51cFRpbWVyLnNlc3Npb25JZCkpPT0gTlVMTCkgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIHBDdXJyTm9kZSA9IHBQcmV2Tm9kZSA9IHBNYWMtPmxpbS5wTGltUHJlQXV0aExpc3Q7CisKKyAgICB3aGlsZSAocEN1cnJOb2RlICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAocEN1cnJOb2RlLT5mU2VlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRm91bmQgbm9kZSB0byBiZSBkZWxldGVkCisKKyAgICAgICAgICAgIGlmIChwQ3Vyck5vZGUgPT0gcE1hYy0+bGltLnBMaW1QcmVBdXRoTGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBub2RlIGJlaW5nIGRlbGV0ZWQKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0ucExpbVByZUF1dGhMaXN0ID0gcFByZXZOb2RlID0gcEN1cnJOb2RlLT5uZXh0OworICAgICAgICAgICAgICAgIGZpcnN0Tm9kZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByZXZOb2RlLT5uZXh0ID0gcEN1cnJOb2RlLT5uZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZWxldGUgdGhlIGF1dGggcmVzcG9uc2UgdGltZXIgaWYgcnVubmluZworICAgICAgICAgICAgaWYgKHBDdXJyTm9kZS0+ZlRpbWVyU3RhcnRlZCkKKyAgICAgICAgICAgICAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlUGVyU3RhSWRUaW1lcihwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMSU1fQVVUSF9SU1BfVElNRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJOb2RlLT5hdXRoTm9kZUlkeCk7CisKKyAgICAgICAgICAgIHBTdGFEcyA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyTm9kZS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFpZCk7CisKKyAgICAgICAgICAgIGlmICghcFN0YURzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFNUQSBkb2VzIG5vdCBoYXZlIGFzc29jaWF0ZWQgY29udGV4dC4KKyAgICAgICAgICAgICAgICAgKiBTZW5kIGFkdmlzb3J5IERlYXV0aGVudGljYXRpb24gZnJhbWUKKyAgICAgICAgICAgICAgICAgKiB0byBTVEEgYmVpbmcgZGVsZXRlZAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbVNlbmREZWF1dGhNZ210RnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19QUkVWX0FVVEhfTk9UX1ZBTElEX1JFQVNPTiwgLy89MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyTm9kZS0+cGVlck1hY0FkZHIsc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGltTG9nKHBNYWMsCisgICAgICAgICAgICAgICAgICAgTE9HMywKKyAgICAgICAgICAgICAgICAgICBGTCgiUmVsZWFzZSBwcmVBdXRoIG5vZGUgZHVyaW5nIHBlcmlvZGljIGNsZWFudXBcbiIpKTsKKyAgICAgICAgICAgIGxpbVJlbGVhc2VQcmVBdXRoTm9kZShwTWFjLCBwQ3Vyck5vZGUpOworCisgICAgICAgICAgICBpZiAoZmlyc3ROb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEZpcnN0IG5vZGUgd2FzIGRlbGV0ZWQKKyAgICAgICAgICAgICAgICBpZiAocE1hYy0+bGltLnBMaW1QcmVBdXRoTGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHBDdXJyTm9kZSA9IHBNYWMtPmxpbS5wTGltUHJlQXV0aExpc3Q7CisgICAgICAgICAgICAgICAgZmlyc3ROb2RlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEN1cnJOb2RlID0gcFByZXZOb2RlLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFyayB0aGlzIG5vZGUgYXMgJ3NlZW4nLiBUbyBiZSBkZWxldGVkIG5leHQgdGltZS4KKyAgICAgICAgICAgIHBDdXJyTm9kZS0+ZlNlZW4gPSAxOworCisgICAgICAgICAgICBwUHJldk5vZGUgPSBwQ3Vyck5vZGU7CisgICAgICAgICAgICBwQ3Vyck5vZGUgPSBwQ3Vyck5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICB9Cit9IC8qKiogZW5kIGxpbVByZUF1dGhDbG51cEhhbmRsZXIoKSAqKiovCisjZW5kaWYKKworCisKKy8qKgorICogbGltUmVzdG9yZUZyb21QcmVBdXRoU3RhdGUKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gU1RBIHdoZW5ldmVyIGFuIEF1dGhlbnRpY2F0aW9uCisgKiBzZXF1ZW5jZSBpcyBjb21wbGV0ZSBhbmQgc3RhdGUgcHJpb3IgdG8gYXV0aCBuZWVkIHRvIGJlCisgKiByZXN0b3JlZC4KKyAqCisgKkxPR0lDOgorICogTUxNX0FVVEhfQ05GIGlzIHByZXBhcmVkIGFuZCBzZW50IHRvIFNNRSBzdGF0ZSBtYWNoaW5lLgorICogSW4gY2FzZSBvZiByZXN0b3JpbmcgZnJvbSBwcmUtYXV0aDoKKyAqICAgICAtIENoYW5uZWwgSWQgaXMgcHJvZ3JhbW1lZCBhdCBMTy9SRiBzeW50aGVzaXplcgorICogICAgIC0gQlNTSUQgaXMgcHJvZ3JhbW1lZCBhdCBSSFAKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHJlc3VsdENvZGUgLSByZXN1bHQgb2YgYXV0aGVudGljYXRpb24gYXR0ZW1wdAorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUmVzdG9yZUZyb21BdXRoU3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUsIHRBTklfVTE2IHByb3RTdGF0dXNDb2RlLHRwUEVTZXNzaW9uIHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyTWFjQWRkciAgICAgY3VycmVudEJzc0lkOworICAgIHRMaW1NbG1BdXRoQ25mICBtbG1BdXRoQ25mOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJm1sbUF1dGhDbmYucGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBtbG1BdXRoQ25mLmF1dGhUeXBlICAgPSBwTWFjLT5saW0uZ3BMaW1NbG1BdXRoUmVxLT5hdXRoVHlwZTsKKyAgICBtbG1BdXRoQ25mLnJlc3VsdENvZGUgPSByZXN1bHRDb2RlOworICAgIG1sbUF1dGhDbmYucHJvdFN0YXR1c0NvZGUgPSBwcm90U3RhdHVzQ29kZTsKKyAgICAKKyAgICAvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJRCovCisgICAgbWxtQXV0aENuZi5zZXNzaW9uSWQgPSBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisgICAgLy8vIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZAorICAgIC8vLyBmb3IgcE1hYy0+bGltLmdMaW1NbG1BdXRoUmVxCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcSk7CisgICAgcE1hYy0+bGltLmdwTGltTWxtQXV0aFJlcSA9IE5VTEw7CisKKyAgICBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gc2Vzc2lvbkVudHJ5LT5saW1QcmV2TWxtU3RhdGU7CisgICAgCisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKworICAgIC8vICdDaGFuZ2UnIHRpbWVyIGZvciBmdXR1cmUgYWN0aXZhdGlvbnMKKyAgICBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgZUxJTV9BVVRIX0ZBSUxfVElNRVIpOworCisgICAgI2lmIDAKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19CU1NJRCwgY3VycmVudEJzc0lkLCAmY2ZnKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IGdldCBCU1NJRCBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBCU1NJRFxuIikpOworICAgIH0KKyAgICAjZW5kaWYgLy9UTyBTVVBQT1JUIEJULUFNUAorICAgIHNpckNvcHlNYWNBZGRyKGN1cnJlbnRCc3NJZCxzZXNzaW9uRW50cnktPmJzc0lkKTsKKworICAgIGlmIChzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlID09IGVMSU1fU01FX1dUX1BSRV9BVVRIX1NUQVRFKQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1QcmVBdXRoQ2hhbm5lbE51bWJlciA9IDA7CisgICAgfQorCisgICAgbGltUG9zdFNtZU1lc3NhZ2UocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICBMSU1fTUxNX0FVVEhfQ05GLAorICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiAqKSAmbWxtQXV0aENuZik7Cit9IC8qKiogZW5kIGxpbVJlc3RvcmVGcm9tQXV0aFN0YXRlKCkgKioqLworCisKKworLyoqCisgKiBsaW1Mb29rVXBLZXlNYXBwaW5ncygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGxpbVByb2Nlc3NBdXRoRnJhbWUoKSBmdW5jdGlvbgorICogdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGV4aXN0cyBhIEtleSBNYXBwaW5nIGtleSBmb3IgYSBnaXZlbgorICogTUFDIGFkZHJlc3MuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBtYWNBZGRyICBNQUMgYWRkcmVzcyBvZiB0aGUgcGVlciBTVEEgZm9yIHdoaWNoIGV4aXN0ZW5jZQorICogICAgICAgICAgICAgICAgIG9mIEtleSBNYXBwaW5nIGtleSBpcyB0byBiZSBkZXRlcm1pbmVkCisgKgorICogQHJldHVybiBwS2V5TWFwRW50cnkgLSBQb2ludGVyIHRvIHRoZSBrZXlNYXBFbnRyeSByZXR1cm5lZCBieSBDRkcKKyAqLworCit0Q2ZnV2VwS2V5RW50cnkgKgorbGltTG9va1VwS2V5TWFwcGluZ3ModFNpck1hY0FkZHIgbWFjQWRkcikKK3sKKyAgICByZXR1cm4gTlVMTDsKK30gLyoqKioqKiBlbmQgbGltTG9va1VwS2V5TWFwcGluZ3MoKSAqKioqKiovCisKKworCisvKioKKyAqIGxpbUVuY3J5cHRBdXRoRnJhbWUoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBsaW1Qcm9jZXNzQXV0aEZyYW1lKCkgZnVuY3Rpb24KKyAqIHRvIGVuY3J5cHQgQXV0aGVudGljYXRpb24gZnJhbWUzIGJvZHkuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBrZXlJZCAgICAgICAgICBrZXkgaWQgdG8gdXNlZAorICogQHBhcmFtICBwS2V5ICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBrZXkgdG8gYmUgdXNlZCBmb3IgZW5jcnlwdGlvbgorICogQHBhcmFtICBwUGxhaW5UZXh0ICAgICBQb2ludGVyIHRvIHRoZSBib2R5IHRvIGJlIGVuY3J5cHRlZAorICogQHBhcmFtICBwRW5jckJvZHkgICAgICBQb2ludGVyIHRvIHRoZSBlbmNyeXB0ZWQgYXV0aCBmcmFtZSBib2R5CisgKiBAcGFyYW0gIGtleUxlbmd0aCAgICAgIDggKFdFUDQwKSBvciAxNiAoV0VQMTA0KQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltRW5jcnlwdEF1dGhGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGtleUlkLCB0QU5JX1U4ICpwS2V5LCB0QU5JX1U4ICpwUGxhaW5UZXh0LAorICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwRW5jckJvZHksIHRBTklfVTMyIGtleUxlbmd0aCkKK3sKKyAgICB0QU5JX1U4ICBzZWVkW0xJTV9TRUVEX0xFTkdUSF0sIGljdltTSVJfTUFDX1dFUF9JQ1ZfTEVOR1RIXTsKKworICAgIGtleUxlbmd0aCArPSAzOworCisgICAgLy8gQnl0ZXMgMC0yIG9mIHNlZWQgaXMgSVYKKyAgICAvLyBSZWFkIFRTRiB0aW1lc3RhbXAgaW50byBzZWVkIHRvIGdldCByYW5kb20gSVYgLSAxc3QgMyBieXRlcworICAgIGhhbEdldFR4VFNGdGltZXIocE1hYywgKHRTaXJNYWNUaW1lU3RhbXAgKikgJnNlZWQpOworCisgICAgLy8gQnl0ZXMgMy03IG9mIHNlZWQgaXMga2V5CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnNlZWRbM10sIHBLZXksIGtleUxlbmd0aCAtIDMpOworCisgICAgLy8gQ29tcHV0ZSBDUkMtMzIgYW5kIHBsYWNlIHRoZW0gaW4gbGFzdCA0IGJ5dGVzIG9mIHBsYWluIHRleHQKKyAgICBsaW1Db21wdXRlQ3JjMzIoaWN2LCBwUGxhaW5UZXh0LCBzaXplb2YodFNpck1hY0F1dGhGcmFtZUJvZHkpKTsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBQbGFpblRleHQgKyBzaXplb2YodFNpck1hY0F1dGhGcmFtZUJvZHkpLAorICAgICAgICAgICAgICAgICAgaWN2LCBTSVJfTUFDX1dFUF9JQ1ZfTEVOR1RIKTsKKworICAgIC8vIFJ1biBSQzQgb24gcGxhaW4gdGV4dCB3aXRoIHRoZSBzZWVkCisgICAgbGltUkM0KHBFbmNyQm9keSArIFNJUl9NQUNfV0VQX0lWX0xFTkdUSCwKKyAgICAgICAgICAgKHRBTklfVTggKikgcFBsYWluVGV4dCwgc2VlZCwga2V5TGVuZ3RoLAorICAgICAgICAgICBMSU1fRU5DUl9BVVRIX0JPRFlfTEVOIC0gU0lSX01BQ19XRVBfSVZfTEVOR1RIKTsKKworICAgIC8vIFByZXBhcmUgSVYKKyAgICBwRW5jckJvZHlbMF0gPSBzZWVkWzBdOworICAgIHBFbmNyQm9keVsxXSA9IHNlZWRbMV07CisgICAgcEVuY3JCb2R5WzJdID0gc2VlZFsyXTsKKyAgICBwRW5jckJvZHlbM10gPSBrZXlJZCA8PCA2OworfSAvKioqKioqIGVuZCBsaW1FbmNyeXB0QXV0aEZyYW1lKCkgKioqKioqLworCisKKworLyoqCisgKiBsaW1Db21wdXRlQ3JjMzIoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjb21wdXRlIENSQy0zMiBvbiBhIGdpdmVuIHNvdXJjZS4KKyAqIFVzZWQgd2hpbGUgZW5jcnlwdGluZy9kZWNyeXB0aW5nIEF1dGhlbnRpY2F0aW9uIGZyYW1lIDMuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcERlc3QgICAgRGVzdGluYXRpb24gbG9jYXRpb24gZm9yIGNvbXB1dGVkIENSQworICogQHBhcmFtICBwU3JjICAgICBTb3VyY2UgbG9jYXRpb24gdG8gYmUgQ1JDIGNvbXB1dGVkCisgKiBAcGFyYW0gIGxlbiAgICAgIExlbmd0aCBvdmVyIHdoaWNoIENSQyB0byBiZSBjb21wdXRlZAorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltQ29tcHV0ZUNyYzMyKHRBTklfVTggKnBEZXN0LCB0QU5JX1U4ICogcFNyYywgdEFOSV9VOCBsZW4pCit7CisgICAgdEFOSV9VMzIgY3JjOworICAgIGludCBpOworCisgICAgY3JjID0gMDsKKyAgICBjcmMgPSB+Y3JjOworCisgICAgd2hpbGUobGVuLS0gPiAwKQorICAgICAgICBjcmMgPSBsaW1DcmNVcGRhdGUoY3JjLCAqcFNyYysrKTsKKworICAgIGNyYyA9IH5jcmM7CisKKyAgICBmb3IgKGk9MDsgaSA8IFNJUl9NQUNfV0VQX0lWX0xFTkdUSDsgaSsrKQorICAgIHsKKyAgICAgICAgcERlc3RbaV0gPSAodEFOSV9VOCljcmM7CisgICAgICAgIGNyYyA+Pj0gODsKKyAgICB9Cit9IC8qKioqKiogZW5kIGxpbUNvbXB1dGVDcmMzMigpICoqKioqKi8KKworCisKKy8qKgorICogbGltUkM0KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcnVuIFJDNCBhbGdvcml0aG0uIENhbGxlZCB3aGlsZQorICogZW5jcnlwdGluZy9kZWNyeXB0aW5nIEF1dGhlbnRpY2F0aW9uIGZyYW1lIDMuCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcERlc3QgICAgICAgICAgRGVzdGluYXRpb24gbG9jYXRpb24gZm9yIGVuY3J5cHRlZCB0ZXh0CisgKiBAcGFyYW0gIHBTcmMgICAgICAgICAgIFNvdXJjZSBsb2NhdGlvbiB0byBiZSBlbmNyeXB0ZWQKKyAqIEBwYXJhbSAgc2VlZCAgICAgICAgICAgQ29udGFpbnMgc2VlZCAoSVYgKyBrZXkpIGZvciBQUk5HCisgKiBAcGFyYW0gIGtleUxlbmd0aCAgICAgIDggKFdFUDQwKSBvciAxNiAoV0VQMTA0KQorICogQHBhcmFtICBmcmFtZUxlbiAgICAgICBMZW5ndGggb2YgdGhlIGZyYW1lCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUkM0KHRBTklfVTggKnBEZXN0LCB0QU5JX1U4ICpwU3JjLCB0QU5JX1U4ICpzZWVkLCB0QU5JX1UzMiBrZXlMZW5ndGgsIHRBTklfVTE2IGZyYW1lTGVuKQoreworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB0QU5JX1U4IGksIGo7CisgICAgICAgIHRBTklfVTggc2JveFsyNTZdOworICAgIH0gdFJDNENvbnRleHQ7CisKKyAgICB0UkM0Q29udGV4dCBjdHg7CisKKyAgICB7CisgICAgICAgIHRBTklfVTE2IGksIGosIGs7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBzYm94IHVzaW5nIHNlZWQKKyAgICAgICAgLy8KKworICAgICAgICBjdHguaSA9IGN0eC5qID0gMDsKKyAgICAgICAgZm9yIChpPTA7IGk8MjU2OyBpKyspCisgICAgICAgICAgICBjdHguc2JveFtpXSA9ICh0QU5JX1U4KWk7CisKKyAgICAgICAgaiA9IDA7CisgICAgICAgIGsgPSAwOworICAgICAgICBmb3IgKGk9MDsgaTwyNTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdEFOSV9VOCB0ZW1wOworCisgICAgICAgICAgICBqID0gKHRBTklfVTgpKGogKyBjdHguc2JveFtpXSArIHNlZWRba10pOworICAgICAgICAgICAgdGVtcCA9IGN0eC5zYm94W2ldOworICAgICAgICAgICAgY3R4LnNib3hbaV0gPSBjdHguc2JveFtqXTsKKyAgICAgICAgICAgIGN0eC5zYm94W2pdID0gdGVtcDsKKworICAgICAgICAgICAgaWYgKCsrayA+PSBrZXlMZW5ndGgpCisgICAgICAgICAgICAgICAgayA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIHRBTklfVTggaSAgID0gY3R4Lmk7CisgICAgICAgIHRBTklfVTggaiAgID0gY3R4Lmo7CisgICAgICAgIHRBTklfVTggbGVuID0gKHRBTklfVTgpIGZyYW1lTGVuOworCisgICAgICAgIHdoaWxlIChsZW4tLSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTggdGVtcDEsIHRlbXAyOworCisgICAgICAgICAgICBpICAgICA9ICh0QU5JX1U4KShpKzEpOworICAgICAgICAgICAgdGVtcDEgPSBjdHguc2JveFtpXTsKKyAgICAgICAgICAgIGogICAgID0gKHRBTklfVTgpKGogKyB0ZW1wMSk7CisKKyAgICAgICAgICAgIGN0eC5zYm94W2ldID0gdGVtcDIgPSBjdHguc2JveFtqXTsKKyAgICAgICAgICAgIGN0eC5zYm94W2pdID0gdGVtcDE7CisKKyAgICAgICAgICAgIHRlbXAxID0gKHRBTklfVTgpKHRlbXAxICsgdGVtcDIpOworICAgICAgICAgICAgdGVtcDEgPSBjdHguc2JveFt0ZW1wMV07CisgICAgICAgICAgICB0ZW1wMiA9ICh0QU5JX1U4KShwU3JjID8gKnBTcmMrKyA6IDApOworCisgICAgICAgICAgICAqcERlc3QrKyA9ICh0QU5JX1U4KSh0ZW1wMSBeIHRlbXAyKTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC5pID0gaTsKKyAgICAgICAgY3R4LmogPSBqOworICAgIH0KK30gLyoqKioqKiBlbmQgbGltUkM0KCkgKioqKioqLworCisKKworLyoqCisgKiBsaW1EZWNyeXB0QXV0aEZyYW1lKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gbGltUHJvY2Vzc0F1dGhGcmFtZSgpIGZ1bmN0aW9uCisgKiB0byBkZWNyeXB0IHJlY2VpdmVkIEF1dGhlbnRpY2F0aW9uIGZyYW1lMyBib2R5LgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcEtleSAgICAgICBQb2ludGVyIHRvIHRoZSBrZXkgdG8gYmUgdXNlZCBmb3IgZGVjcnlwdGlvbgorICogQHBhcmFtIHBFbmNyQm9keSAgUG9pbnRlciB0byB0aGUgYm9keSB0byBiZSBkZWNyeXB0ZWQKKyAqIEBwYXJhbSBwUGxhaW5Cb2R5IFBvaW50ZXIgdG8gdGhlIGRlY3J5cHRlZCBib2R5CisgKiBAcGFyYW0ga2V5TGVuZ3RoICA4IChXRVA0MCkgb3IgMTYgKFdFUDEwNCkKKyAqCisgKiBAcmV0dXJuIERlY3J5cHQgcmVzdWx0IC0gZVNJUl9TVUNDRVNTIGZvciBzdWNjZXNzIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9ERUNSWVBUX0lDVl9GQUlMIGZvciBJQ1YgbWlzbWF0Y2guCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGVjcnlwdGlvbiBpcyBhIHN1Y2Nlc3MsIHBCb2R5IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGRlY3J5cHRlZCBhdXRoIGZyYW1lIGJvZHkuCisgKi8KKwordEFOSV9VOAorbGltRGVjcnlwdEF1dGhGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwS2V5LCB0QU5JX1U4ICpwRW5jckJvZHksCisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBQbGFpbkJvZHksIHRBTklfVTMyIGtleUxlbmd0aCwgdEFOSV9VMTYgZnJhbWVMZW4pCit7CisgICAgdEFOSV9VOCAgc2VlZFtMSU1fU0VFRF9MRU5HVEhdLCBpY3ZbU0lSX01BQ19XRVBfSUNWX0xFTkdUSF07CisgICAgaW50IGk7CisgICAga2V5TGVuZ3RoICs9IDM7CisKKworICAgIC8vIEJ5dGVzIDAtMiBvZiBzZWVkIGlzIHJlY2VpdmVkIElWCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgc2VlZCwgcEVuY3JCb2R5LCBTSVJfTUFDX1dFUF9JVl9MRU5HVEggLSAxKTsKKworICAgIC8vIEJ5dGVzIDMtNyBvZiBzZWVkIGlzIGtleQorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZzZWVkWzNdLCBwS2V5LCBrZXlMZW5ndGggLSAzKTsKKworICAgIC8vIFJ1biBSQzQgb24gZW5jcnlwdGVkIHRleHQgd2l0aCB0aGUgc2VlZAorICAgIGxpbVJDNChwUGxhaW5Cb2R5LAorICAgICAgICAgICBwRW5jckJvZHkgKyBTSVJfTUFDX1dFUF9JVl9MRU5HVEgsCisgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgIGtleUxlbmd0aCwKKyAgICAgICAgICAgZnJhbWVMZW4pOworCisgICAgUEVMT0c0KGxpbUxvZyhwTWFjLCBMT0c0LCBGTCgicGxhaW5ib2R5IGlzIFxuIikpOworICAgIHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzQsIHBQbGFpbkJvZHksIGZyYW1lTGVuKTspCisKKyAgICAvLyBDb21wdXRlIENSQy0zMiBhbmQgcGxhY2UgdGhlbSBpbiBsYXN0IDQgYnl0ZXMgb2YgZW5jcnlwdGVkIGJvZHkKKyAgICBsaW1Db21wdXRlQ3JjMzIoaWN2LAorICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwUGxhaW5Cb2R5LAorICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCkgKGZyYW1lTGVuIC0gU0lSX01BQ19XRVBfSUNWX0xFTkdUSCkpOworCisgICAgLy8gQ29tcGFyZSBSWF9JQ1Ygd2l0aCBjb21wdXRlZCBJQ1YKKyAgICBmb3IgKGkgPSAwOyBpIDwgU0lSX01BQ19XRVBfSUNWX0xFTkdUSDsgaSsrKQorICAgIHsKKyAgICAgICBQRUxPRzQobGltTG9nKHBNYWMsIExPRzQsIEZMKCIgY29tcHV0ZWQgSUNWJWRbJXhdLCByeGVkIElDViVkWyV4XVxuIiksCisgICAgICAgICAgICAgICBpLCBpY3ZbaV0sIGksIHBQbGFpbkJvZHlbZnJhbWVMZW4gLSBTSVJfTUFDX1dFUF9JQ1ZfTEVOR1RIICsgaV0pOykKKyAgICAgICAgaWYgKGljdltpXSAhPSBwUGxhaW5Cb2R5W2ZyYW1lTGVuIC0gU0lSX01BQ19XRVBfSUNWX0xFTkdUSCArIGldKQorICAgICAgICAgICAgcmV0dXJuIExJTV9ERUNSWVBUX0lDVl9GQUlMOworICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qKioqKiogZW5kIGxpbURlY3J5cHRBdXRoRnJhbWUoKSAqKioqKiovCisKKy8qKgorICogbGltUG9zdFNtZVNldEtleXNDbmYKKyAqCisgKiBBIHV0aWxpdHkgQVBJIHRvIHNlbmQgTUxNX1NFVEtFWVNfQ05GIHRvIFNNRQorICovCit2b2lkIGxpbVBvc3RTbWVTZXRLZXlzQ25mKCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRMaW1NbG1TZXRLZXlzUmVxICpwTWxtU2V0S2V5c1JlcSwKKyAgICB0TGltTWxtU2V0S2V5c0NuZiAqbWxtU2V0S2V5c0NuZikKK3sKKyAgLy8gUHJlcGFyZSBhbmQgU2VuZCBMSU1fTUxNX1NFVEtFWVNfQ05GCisgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZtbG1TZXRLZXlzQ25mLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwTWxtU2V0S2V5c1JlcS0+cGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJm1sbVNldEtleXNDbmYtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBNbG1TZXRLZXlzUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICBtbG1TZXRLZXlzQ25mLT5haWQgPSBwTWxtU2V0S2V5c1JlcS0+YWlkOworI2VuZGlmCisKKyAgLy8vIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZCBmb3IgbWxtU2V0S2V5c1JlcQorICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTWxtU2V0S2V5c1JlcSApOworICBwTWFjLT5saW0uZ3BMaW1NbG1TZXRLZXlzUmVxID0gTlVMTDsKKworICBsaW1Qb3N0U21lTWVzc2FnZSggcE1hYywKKyAgICAgIExJTV9NTE1fU0VUS0VZU19DTkYsCisgICAgICAodEFOSV9VMzIgKikgbWxtU2V0S2V5c0NuZiApOworfQorCisvKioKKyAqIGxpbVBvc3RTbWVSZW1vdmVLZXlzQ25mCisgKgorICogQSB1dGlsaXR5IEFQSSB0byBzZW5kIE1MTV9SRU1PVkVLRVlfQ05GIHRvIFNNRQorICovCit2b2lkIGxpbVBvc3RTbWVSZW1vdmVLZXlDbmYoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdExpbU1sbVJlbW92ZUtleVJlcSAqcE1sbVJlbW92ZUtleVJlcSwKKyAgICB0TGltTWxtUmVtb3ZlS2V5Q25mICptbG1SZW1vdmVLZXlDbmYpCit7CisgIC8vIFByZXBhcmUgYW5kIFNlbmQgTElNX01MTV9SRU1PVkVLRVlTX0NORgorICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmbWxtUmVtb3ZlS2V5Q25mLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwTWxtUmVtb3ZlS2V5UmVxLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICAvLy8gRnJlZSB1cCBidWZmZXIgYWxsb2NhdGVkIGZvciBtbG1SZW1vdmVLZXlzUmVxCisgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBNbG1SZW1vdmVLZXlSZXEgKTsKKyAgcE1hYy0+bGltLmdwTGltTWxtUmVtb3ZlS2V5UmVxID0gTlVMTDsKKworICBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlID0gcE1hYy0+bGltLmdMaW1QcmV2TWxtU3RhdGU7IC8vUmVzdG9yZSB0aGUgc3RhdGUuCisgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworCisgIGxpbVBvc3RTbWVNZXNzYWdlKCBwTWFjLAorICAgICAgTElNX01MTV9SRU1PVkVLRVlfQ05GLAorICAgICAgKHRBTklfVTMyICopIG1sbVJlbW92ZUtleUNuZiApOworfQorCisvKioKKyAqIGxpbVNlbmRTZXRCc3NLZXlSZXEoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGxpbVByb2Nlc3NNbG1TZXRLZXlzUmVxKCksCisgKiB3aGVuIFBFIGlzIHRyeWluZyB0byBzZXR1cCB0aGUgR3JvdXAgS2V5cyByZWxhdGVkCisgKiB0byBhIHNwZWNpZmllZCBlbmNyeXB0aW9uIHR5cGUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgICAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTWxtU2V0S2V5c1JlcSBQb2ludGVyIHRvIE1MTV9TRVRLRVlTX1JFUSBidWZmZXIKKyAqIEByZXR1cm4gbm9uZQorICovCit2b2lkIGxpbVNlbmRTZXRCc3NLZXlSZXEoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdExpbU1sbVNldEtleXNSZXEgKnBNbG1TZXRLZXlzUmVxLAorICAgIHRwUEVTZXNzaW9uICAgIHBzZXNzaW9uRW50cnkpCit7Cit0U2lyTXNnUSAgICAgICAgICAgbXNnUTsKK3RwU2V0QnNzS2V5UGFyYW1zICBwU2V0QnNzS2V5UGFyYW1zID0gTlVMTDsKK3RMaW1NbG1TZXRLZXlzQ25mICBtbG1TZXRLZXlzQ25mOwordFNpclJldFN0YXR1cyAgICAgIHJldENvZGU7Cit0QU5JX1UzMiB2YWwgPSAwOworCisgIGlmKHBNbG1TZXRLZXlzUmVxLT5udW1LZXlzID4gU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZUykKKyAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0cxLAorICAgICAgICAgIEZMKCAibnVtS2V5cyA9ICVkIGlzIG1vcmUgdGhhbiBTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTXG4iICksIHBNbG1TZXRLZXlzUmVxLT5udW1LZXlzKTsKKyAgICAgIAorICAgICAgLy8gUmVzcG9uZCB0byBTTUUgd2l0aCBlcnJvciBjb2RlCisgICAgICBtbG1TZXRLZXlzQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICBnb3RvIGVuZDsKKyAgfQorCisgIC8vIFBhY2thZ2UgV0RBX1NFVF9CU1NLRVlfUkVRIG1lc3NhZ2UgcGFyYW1ldGVycworCisgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICh2b2lkICoqKSAmcFNldEJzc0tleVBhcmFtcywKKyAgICAgICAgIHNpemVvZiggdFNldEJzc0tleVBhcmFtcyApKSkgICAgIAorICB7CisgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBTRVRfQlNTS0VZXG4iICkpOworCisgICAgLy8gUmVzcG9uZCB0byBTTUUgd2l0aCBlcnJvciBjb2RlCisgICAgbWxtU2V0S2V5c0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworICAgIGdvdG8gZW5kOworICB9CisgIGVsc2UKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAodm9pZCAqKSBwU2V0QnNzS2V5UGFyYW1zLAorICAgICAgICAgc2l6ZW9mKCB0U2V0QnNzS2V5UGFyYW1zICkpOyAgICAgCisKKyAgLy8gVXBkYXRlIHRoZSBXREFfU0VUX0JTU0tFWV9SRVEgcGFyYW1ldGVycworICBwU2V0QnNzS2V5UGFyYW1zLT5ic3NJZHggPSBwc2Vzc2lvbkVudHJ5LT5ic3NJZHg7CisgIHBTZXRCc3NLZXlQYXJhbXMtPmVuY1R5cGUgPSBwTWxtU2V0S2V5c1JlcS0+ZWRUeXBlOworICBwU2V0QnNzS2V5UGFyYW1zLT5udW1LZXlzID0gcE1sbVNldEtleXNSZXEtPm51bUtleXM7CisKKyAgaWYoZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU0lOR0xFX1RJRF9SQywgJnZhbCkpCisgIHsKKyAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCggIlVuYWJsZSB0byByZWFkIFdOSV9DRkdfU0lOR0xFX1RJRF9SQ1xuIiApKTsKKyAgfQorCisgIHBTZXRCc3NLZXlQYXJhbXMtPnNpbmdsZVRpZFJjID0gKHRBTklfVTgpdmFsOworCisgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkKi8KKyAgcFNldEJzc0tleVBhcmFtcy0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeSAtPnBlU2Vzc2lvbklkOworCisgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAodEFOSV9VOCAqKSAmcFNldEJzc0tleVBhcmFtcy0+a2V5LAorICAgICAgKHRBTklfVTggKikgJnBNbG1TZXRLZXlzUmVxLT5rZXksCisgICAgICBzaXplb2YoIHRTaXJLZXlzICkgKiBwTWxtU2V0S2V5c1JlcS0+bnVtS2V5cyApOworCisgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKyAgbXNnUS50eXBlID0gV0RBX1NFVF9CU1NLRVlfUkVROworICAvLworICAvLyBGSVhNRV9HRU40CisgIC8vIEEgZ2xvYmFsIGNvdW50ZXIgKGRpYWxvZyB0b2tlbikgaXMgcmVxdWlyZWQgdG8ga2VlcCB0cmFjayBvZgorICAvLyBhbGwgUEUgPC0+IEhBTCBjb21tdW5pY2F0aW9uKHMpCisgIC8vCisgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICBtc2dRLmJvZHlwdHIgPSBwU2V0QnNzS2V5UGFyYW1zOworICBtc2dRLmJvZHl2YWwgPSAwOworCisgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgIEZMKCAiU2VuZGluZyBXREFfU0VUX0JTU0tFWV9SRVEuLi5cbiIgKSk7CisgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICkpKQorICB7CisgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICBGTCgiUG9zdGluZyBTRVRfQlNTS0VZIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWFxuIiksCisgICAgICAgIHJldENvZGUgKTsKKworICAgIC8vIFJlc3BvbmQgdG8gU01FIHdpdGggTElNX01MTV9TRVRLRVlTX0NORgorICAgIG1sbVNldEtleXNDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0hBTF9TRU5EX01FU1NBR0VfRkFJTDsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuOyAvLyBDb250aW51ZSBhZnRlciBXREFfU0VUX0JTU0tFWV9SU1AuLi4KKworZW5kOgorICBsaW1Qb3N0U21lU2V0S2V5c0NuZiggcE1hYywKKyAgICAgIHBNbG1TZXRLZXlzUmVxLAorICAgICAgJm1sbVNldEtleXNDbmYgKTsKKworfQorCisvKioKKyAqIEBmdW5jdGlvbiA6IGxpbVNlbmRTZXRTdGFLZXlSZXEoKQorICoKKyAqIEBicmllZiA6ICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGxpbVByb2Nlc3NNbG1TZXRLZXlzUmVxKCksCisgKiB3aGVuIFBFIGlzIHRyeWluZyB0byBzZXR1cCB0aGUgVW5pY2FzdCBLZXlzIHJlbGF0ZWQKKyAqIHRvIGEgc3BlY2lmaWVkIFNUQSB3aXRoIHNwZWNpZmllZCBlbmNyeXB0aW9uIHR5cGUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgICAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTWxtU2V0S2V5c1JlcSBQb2ludGVyIHRvIE1MTV9TRVRLRVlTX1JFUSBidWZmZXIKKyAqIEBwYXJhbSBzdGFJZHggICAgICAgICBTVEEgaW5kZXggZm9yIHdoaWNoIHRoZSBrZXlzIGFyZSBiZWluZyBzZXQKKyAqIEBwYXJhbSBkZWZXRVBJZHggICAgICBUaGUgZGVmYXVsdCBXRVAga2V5IGluZGV4IFswLi4zXQorICogQHJldHVybiBub25lCisgKi8KK3ZvaWQgbGltU2VuZFNldFN0YUtleVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0TGltTWxtU2V0S2V5c1JlcSAqcE1sbVNldEtleXNSZXEsCisgICAgdEFOSV9VMTYgc3RhSWR4LAorICAgIHRBTklfVTggZGVmV0VQSWR4LAorICAgIHRwUEVTZXNzaW9uIHNlc3Npb25FbnRyeSkKK3sKK3RTaXJNc2dRICAgICAgICAgICBtc2dROwordHBTZXRTdGFLZXlQYXJhbXMgIHBTZXRTdGFLZXlQYXJhbXMgPSBOVUxMOwordExpbU1sbVNldEtleXNDbmYgIG1sbVNldEtleXNDbmY7Cit0U2lyUmV0U3RhdHVzICAgICAgcmV0Q29kZTsKK3RBTklfVTMyIHZhbCA9IDA7CisKKyAgLy8gUGFja2FnZSBXREFfU0VUX1NUQUtFWV9SRVEgbWVzc2FnZSBwYXJhbWV0ZXJzCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSAmcFNldFN0YUtleVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRTZXRTdGFLZXlQYXJhbXMgKSkpIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBTRVRfQlNTS0VZXG4iICkpOworICAgICAgICByZXR1cm47CisgICAgfWVsc2UKKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcFNldFN0YUtleVBhcmFtcywgc2l6ZW9mKCB0U2V0U3RhS2V5UGFyYW1zICkpOworCisgIC8vIFVwZGF0ZSB0aGUgV0RBX1NFVF9TVEFLRVlfUkVRIHBhcmFtZXRlcnMKKyAgcFNldFN0YUtleVBhcmFtcy0+c3RhSWR4ID0gc3RhSWR4OworICBwU2V0U3RhS2V5UGFyYW1zLT5lbmNUeXBlID0gcE1sbVNldEtleXNSZXEtPmVkVHlwZTsKKworICAKKyAgaWYoZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU0lOR0xFX1RJRF9SQywgJnZhbCkpCisgIHsKKyAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCggIlVuYWJsZSB0byByZWFkIFdOSV9DRkdfU0lOR0xFX1RJRF9SQ1xuIiApKTsKKyAgfQorCisgIHBTZXRTdGFLZXlQYXJhbXMtPnNpbmdsZVRpZFJjID0gKHRBTklfVTgpdmFsOworCisgIC8qIFVwZGF0ZSAgUEUgc2Vzc2lvbiBJRCovCisgIHBTZXRTdGFLZXlQYXJhbXMtPnNlc3Npb25JZCA9IHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKyAgLyoqCisgICAqIEZvciBXRVAgLSBkZWZXRVBJZHggaW5kaWNhdGVzIHRoZSBkZWZhdWx0IFdFUAorICAgKiBLZXkgdG8gYmUgdXNlZCBmb3IgVFgKKyAgICogRm9yIGFsbCBvdGhlcnMsIHRoZXJlJ3MganVzdCBvbmUga2V5IHRoYXQgY2FuCisgICAqIGJlIHVzZWQgYW5kIGhlbmNlIGl0IGlzIGFzc3VtZWQgdGhhdAorICAgKiBkZWZXRVBJZHggPSAwIChmcm9tIHRoZSBjYWxsZXIpCisgICAqLworCisgIHBTZXRTdGFLZXlQYXJhbXMtPmRlZldFUElkeCA9IGRlZldFUElkeDsKKyAgICAKKyAgLyoqIFN0b3JlIHRoZSBQcmV2aW91cyBNbG1TdGF0ZSovCisgIHNlc3Npb25FbnRyeS0+bGltUHJldk1sbVN0YXRlID0gc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZTsKKyAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgZmFsc2UpOworICAgIAorICBpZihzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfSU5fSUJTU19ST0xFICYmICFwTWxtU2V0S2V5c1JlcS0+a2V5WzBdLnVuaWNhc3QpIHsKKyAgICAgIHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUgPSBlTElNX01MTV9XVF9TRVRfU1RBX0JDQVNUS0VZX1NUQVRFOworICAgICAgbXNnUS50eXBlID0gV0RBX1NFVF9TVEFfQkNBU1RLRVlfUkVROworICB9ZWxzZSB7CisgICAgICBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fV1RfU0VUX1NUQV9LRVlfU1RBVEU7CisgICAgICBtc2dRLnR5cGUgPSBXREFfU0VUX1NUQUtFWV9SRVE7CisgIH0KKyAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKyAgLyoqCisgICAqIEluIHRoZSBDYXNlIG9mIFdFUF9EWU5BTUlDLCBFRF9US0lQIGFuZCBFRF9DQ01QCisgICAqIHRoZSBLZXlbMF0gY29udGFpbnMgdGhlIEtFWSwgc28ganVzdCBjb3B5IHRoYXQgYWxvbmUsCisgICAqIGZvciB0aGUgY2FzZSBvZiBXRVBfU1RBVElDIHRoZSBoYWwgZ2V0cyB0aGUga2V5IGZyb20gY2ZnCisgICAqLworICBzd2l0Y2goIHBNbG1TZXRLZXlzUmVxLT5lZFR5cGUgKSB7CisgIGNhc2UgZVNJUl9FRF9XRVA0MDoKKyAgY2FzZSBlU0lSX0VEX1dFUDEwNDoKKyAgICAgIC8vIEZJWE1FISBJcyB0aGlzIE9LPworICAgICAgaWYoIDAgPT0gcE1sbVNldEtleXNSZXEtPm51bUtleXMgKSB7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgIHRBTklfVTMyIGk7CisKKyAgICAgICAgICBmb3IoaT0wOyBpIDwgU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZUyA7aSsrKQorICAgICAgICAgIHsgCisgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwU2V0U3RhS2V5UGFyYW1zLT5rZXlbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwTWxtU2V0S2V5c1JlcS0+a2V5W2ldLCBzaXplb2YoIHRTaXJLZXlzICkpOworICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIHBTZXRTdGFLZXlQYXJhbXMtPndlcFR5cGUgPSBlU0lSX1dFUF9TVEFUSUM7CisgICAgICAgICAgc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IGVMSU1fTUxNX1dUX1NFVF9TVEFfS0VZX1NUQVRFOworICAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX01MTV9TVEFURSwgMCwgcE1hYy0+bGltLmdMaW1NbG1TdGF0ZSkpOworICAgICAgfWVsc2UgeworICAgICAgICAgIHBTZXRTdGFLZXlQYXJhbXMtPndlcFR5cGUgPSBlU0lSX1dFUF9EWU5BTUlDOworICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnBTZXRTdGFLZXlQYXJhbXMtPmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcE1sbVNldEtleXNSZXEtPmtleVswXSwgc2l6ZW9mKCB0U2lyS2V5cyApKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICBjYXNlIGVTSVJfRURfVEtJUDoKKyAgY2FzZSBlU0lSX0VEX0NDTVA6CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkgCisgIGNhc2UgZVNJUl9FRF9XUEk6IAorI2VuZGlmCisgICAgICB7CisgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBTZXRTdGFLZXlQYXJhbXMtPmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmcE1sbVNldEtleXNSZXEtPmtleVswXSwgc2l6ZW9mKCB0U2lyS2V5cyApKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAKKyAgLy8KKyAgLy8gRklYTUVfR0VONAorICAvLyBBIGdsb2JhbCBjb3VudGVyIChkaWFsb2cgdG9rZW4pIGlzIHJlcXVpcmVkIHRvIGtlZXAgdHJhY2sgb2YKKyAgLy8gYWxsIFBFIDwtPiBIQUwgY29tbXVuaWNhdGlvbihzKQorICAvLworICBtc2dRLnJlc2VydmVkID0gMDsKKyAgbXNnUS5ib2R5cHRyID0gcFNldFN0YUtleVBhcmFtczsKKyAgbXNnUS5ib2R5dmFsID0gMDsKKworICBsaW1Mb2coIHBNYWMsIExPRzEsIEZMKCAiU2VuZGluZyBXREFfU0VUX1NUQUtFWV9SRVEuLi5cbiIgKSk7CisgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICkpKSB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJQb3N0aW5nIFNFVF9TVEFLRVkgdG8gSEFMIGZhaWxlZCwgcmVhc29uPSVYXG4iKSwgcmV0Q29kZSApOworICAgICAgLy8gUmVzcG9uZCB0byBTTUUgd2l0aCBMSU1fTUxNX1NFVEtFWVNfQ05GCisgICAgICBtbG1TZXRLZXlzQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9IQUxfU0VORF9NRVNTQUdFX0ZBSUw7CisgIH1lbHNlCisgICAgICByZXR1cm47IC8vIENvbnRpbnVlIGFmdGVyIFdEQV9TRVRfU1RBS0VZX1JTUC4uLgorCisgIGxpbVBvc3RTbWVTZXRLZXlzQ25mKCBwTWFjLCBwTWxtU2V0S2V5c1JlcSwgJm1sbVNldEtleXNDbmYgKTsKK30KKworLyoqCisgKiBsaW1TZW5kUmVtb3ZlQnNzS2V5UmVxKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBsaW1Qcm9jZXNzTWxtUmVtb3ZlUmVxKCksCisgKiB3aGVuIFBFIGlzIHRyeWluZyB0byBSZW1vdmUgYSBHcm91cCBLZXkgcmVsYXRlZAorICogdG8gYSBzcGVjaWZpZWQgZW5jcnlwdGlvbiB0eXBlCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcE1sbVJlbW92ZUtleVJlcSBQb2ludGVyIHRvIE1MTV9SRU1PVkVLRVlfUkVRIGJ1ZmZlcgorICogQHJldHVybiBub25lCisgKi8KK3ZvaWQgbGltU2VuZFJlbW92ZUJzc0tleVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0TGltTWxtUmVtb3ZlS2V5UmVxICpwTWxtUmVtb3ZlS2V5UmVxLAorICAgIHRwUEVTZXNzaW9uICAgcHNlc3Npb25FbnRyeSkKK3sKK3RTaXJNc2dRICAgICAgICAgICBtc2dROwordHBSZW1vdmVCc3NLZXlQYXJhbXMgIHBSZW1vdmVCc3NLZXlQYXJhbXMgPSBOVUxMOwordExpbU1sbVJlbW92ZUtleUNuZiAgbWxtUmVtb3ZlS2V5c0NuZjsKK3RTaXJSZXRTdGF0dXMgICAgICByZXRDb2RlOworCisgIC8vIFBhY2thZ2UgV0RBX1JFTU9WRV9CU1NLRVlfUkVRIG1lc3NhZ2UgcGFyYW1ldGVycworCisgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICh2b2lkICoqKSAmcFJlbW92ZUJzc0tleVBhcmFtcywKKyAgICAgICAgIHNpemVvZiggdFJlbW92ZUJzc0tleVBhcmFtcyApKSkgICAgIAorICB7CisgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBSRU1PVkVfQlNTS0VZXG4iICkpOworCisgICAgLy8gUmVzcG9uZCB0byBTTUUgd2l0aCBlcnJvciBjb2RlCisgICAgbWxtUmVtb3ZlS2V5c0NuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworICAgIGdvdG8gZW5kOworICB9CisgIGVsc2UKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAodm9pZCAqKSBwUmVtb3ZlQnNzS2V5UGFyYW1zLAorICAgICAgICAgc2l6ZW9mKCB0UmVtb3ZlQnNzS2V5UGFyYW1zICkpOyAgICAgCisKKyAgLy8gVXBkYXRlIHRoZSBXREFfUkVNT1ZFX0JTU0tFWV9SRVEgcGFyYW1ldGVycworICBwUmVtb3ZlQnNzS2V5UGFyYW1zLT5ic3NJZHggPSBwc2Vzc2lvbkVudHJ5LT5ic3NJZHg7CisgIHBSZW1vdmVCc3NLZXlQYXJhbXMtPmVuY1R5cGUgPSBwTWxtUmVtb3ZlS2V5UmVxLT5lZFR5cGU7CisgIHBSZW1vdmVCc3NLZXlQYXJhbXMtPmtleUlkID0gcE1sbVJlbW92ZUtleVJlcS0+a2V5SWQ7CisgIHBSZW1vdmVCc3NLZXlQYXJhbXMtPndlcFR5cGUgPSBwTWxtUmVtb3ZlS2V5UmVxLT53ZXBUeXBlOworCisgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElkKi8KKworICBwUmVtb3ZlQnNzS2V5UGFyYW1zLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworICBtc2dRLnR5cGUgPSBXREFfUkVNT1ZFX0JTU0tFWV9SRVE7CisgIC8vCisgIC8vIEZJWE1FX0dFTjQKKyAgLy8gQSBnbG9iYWwgY291bnRlciAoZGlhbG9nIHRva2VuKSBpcyByZXF1aXJlZCB0byBrZWVwIHRyYWNrIG9mCisgIC8vIGFsbCBQRSA8LT4gSEFMIGNvbW11bmljYXRpb24ocykKKyAgLy8KKyAgbXNnUS5yZXNlcnZlZCA9IDA7CisgIG1zZ1EuYm9keXB0ciA9IHBSZW1vdmVCc3NLZXlQYXJhbXM7CisgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgRkwoICJTZW5kaW5nIFdEQV9SRU1PVkVfQlNTS0VZX1JFUS4uLlxuIiApKTsKKyAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisKKyAgaWYoIGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApKSkKKyAgeworICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgRkwoIlBvc3RpbmcgUkVNT1ZFX0JTU0tFWSB0byBIQUwgZmFpbGVkLCByZWFzb249JVhcbiIpLAorICAgICAgICByZXRDb2RlICk7CisKKyAgICAvLyBSZXNwb25kIHRvIFNNRSB3aXRoIExJTV9NTE1fUkVNT1ZFS0VZU19DTkYKKyAgICBtbG1SZW1vdmVLZXlzQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9IQUxfU0VORF9NRVNTQUdFX0ZBSUw7CisgIH0KKyAgZWxzZQorICAgIHJldHVybjsgCisKK2VuZDoKKyAgbGltUG9zdFNtZVJlbW92ZUtleUNuZiggcE1hYywKKyAgICAgIHBNbG1SZW1vdmVLZXlSZXEsCisgICAgICAmbWxtUmVtb3ZlS2V5c0NuZiApOworCit9CisKKy8qKgorICogbGltU2VuZFJlbW92ZVN0YUtleVJlcSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gbGltUHJvY2Vzc01sbVJlbW92ZUtleXNSZXEoKSwKKyAqIHdoZW4gUEUgaXMgdHJ5aW5nIHRvIHNldHVwIHRoZSBVbmljYXN0IEtleXMgcmVsYXRlZAorICogdG8gYSBzcGVjaWZpZWQgU1RBIHdpdGggc3BlY2lmaWVkIGVuY3J5cHRpb24gdHlwZQorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBNbG1SZW1vdmVLZXlzUmVxIFBvaW50ZXIgdG8gTUxNX1JFTU9WRUtFWVNfUkVRIGJ1ZmZlcgorICogQHBhcmFtIHN0YUlkeCAgICAgICAgIFNUQSBpbmRleCBmb3Igd2hpY2ggdGhlIGtleXMgYXJlIGJlaW5nIHNldAorICogQHJldHVybiBub25lCisgKi8KK3ZvaWQgbGltU2VuZFJlbW92ZVN0YUtleVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0TGltTWxtUmVtb3ZlS2V5UmVxICpwTWxtUmVtb3ZlS2V5UmVxLAorICAgIHRBTklfVTE2IHN0YUlkeCAsCisgICAgdHBQRVNlc3Npb24gc2Vzc2lvbkVudHJ5KQorewordFNpck1zZ1EgICAgICAgICAgIG1zZ1E7Cit0cFJlbW92ZVN0YUtleVBhcmFtcyAgcFJlbW92ZVN0YUtleVBhcmFtcyA9IE5VTEw7Cit0TGltTWxtUmVtb3ZlS2V5Q25mICBtbG1SZW1vdmVLZXlDbmY7Cit0U2lyUmV0U3RhdHVzICAgICAgcmV0Q29kZTsKKworCisKKyAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgKHZvaWQgKiopICZwUmVtb3ZlU3RhS2V5UGFyYW1zLAorICAgICAgICAgIHNpemVvZiggdFJlbW92ZVN0YUtleVBhcmFtcyApKSkKKyAgeworICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgRkwoICJVbmFibGUgdG8gUEFMIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgUkVNT1ZFX1NUQUtFWVxuIiApKTsKKworICAgIC8vIFJlc3BvbmQgdG8gU01FIHdpdGggZXJyb3IgY29kZQorICAgIG1sbVJlbW92ZUtleUNuZi5yZXN1bHRDb2RlID0gZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOworICAgIGdvdG8gZW5kOworICB9CisgIGVsc2UKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAodm9pZCAqKSBwUmVtb3ZlU3RhS2V5UGFyYW1zLAorICAgICAgICBzaXplb2YoIHRSZW1vdmVTdGFLZXlQYXJhbXMgKSk7CisKKyAgaWYoIChwTWxtUmVtb3ZlS2V5UmVxLT5lZFR5cGUgPT0gZVNJUl9FRF9XRVAxMDQgfHwgcE1sbVJlbW92ZUtleVJlcS0+ZWRUeXBlID09IGVTSVJfRURfV0VQNDApICYmCisgICAgICAgIHBNbG1SZW1vdmVLZXlSZXEtPndlcFR5cGUgPT0gZVNJUl9XRVBfU1RBVElDICkKKyAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJSZXF1ZXN0IHRvIHJlbW92ZSBzdGF0aWMgV0VQIGtleXMgdGhyb3VnaCBzdGF0aW9uIGludGVyZmFjZVxuIFNob3VsZCB1c2UgQlNTIGludGVyZmFjZVxuIikpOykKKyAgICAgICAgbWxtUmVtb3ZlS2V5Q25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlM7CisgICAgICAgIGdvdG8gZW5kOworICB9CisgCisgIC8vIFVwZGF0ZSB0aGUgV0RBX1JFTU9WRUtFWV9SRVEgcGFyYW1ldGVycworICBwUmVtb3ZlU3RhS2V5UGFyYW1zLT5zdGFJZHggPSBzdGFJZHg7CisgIHBSZW1vdmVTdGFLZXlQYXJhbXMtPmVuY1R5cGUgPSBwTWxtUmVtb3ZlS2V5UmVxLT5lZFR5cGU7CisgIHBSZW1vdmVTdGFLZXlQYXJhbXMtPmtleUlkID0gcE1sbVJlbW92ZUtleVJlcS0+a2V5SWQ7CisgIHBSZW1vdmVTdGFLZXlQYXJhbXMtPnVuaWNhc3QgPSBwTWxtUmVtb3ZlS2V5UmVxLT51bmljYXN0OworCisgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElEKi8KKyAgcFJlbW92ZVN0YUtleVBhcmFtcy0+c2Vzc2lvbklkID0gc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCBmYWxzZSk7CisgIAorICBtc2dRLnR5cGUgPSBXREFfUkVNT1ZFX1NUQUtFWV9SRVE7CisgIC8vCisgIC8vIEZJWE1FX0dFTjQKKyAgLy8gQSBnbG9iYWwgY291bnRlciAoZGlhbG9nIHRva2VuKSBpcyByZXF1aXJlZCB0byBrZWVwIHRyYWNrIG9mCisgIC8vIGFsbCBQRSA8LT4gSEFMIGNvbW11bmljYXRpb24ocykKKyAgLy8KKyAgbXNnUS5yZXNlcnZlZCA9IDA7CisgIG1zZ1EuYm9keXB0ciA9IHBSZW1vdmVTdGFLZXlQYXJhbXM7CisgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgRkwoICJTZW5kaW5nIFdEQV9SRU1PVkVfU1RBS0VZX1JFUS4uLlxuIiApKTsKKyAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gKHJldENvZGUgPSB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKSkpCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCJQb3N0aW5nIFJFTU9WRV9TVEFLRVkgdG8gSEFMIGZhaWxlZCwgcmVhc29uPSVYXG4iKSwKKyAgICAgICAgcmV0Q29kZSApOworCisgICAgLy8gUmVzcG9uZCB0byBTTUUgd2l0aCBMSU1fTUxNX1JFTU9WRUtFWV9DTkYKKyAgICBtbG1SZW1vdmVLZXlDbmYucmVzdWx0Q29kZSA9IGVTSVJfU01FX0hBTF9TRU5EX01FU1NBR0VfRkFJTDsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuOyAKKworZW5kOgorICBsaW1Qb3N0U21lUmVtb3ZlS2V5Q25mKCBwTWFjLAorICAgICAgcE1sbVJlbW92ZUtleVJlcSwKKyAgICAgICZtbG1SZW1vdmVLZXlDbmYgKTsKKworfQorCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2VjdXJpdHlVdGlscy5oIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZWN1cml0eVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3OWYxNAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2VjdXJpdHlVdGlscy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltU2VjdXJpdHlVdGlscy5oIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGRlZmluaXRpb25zCisgKiByZWxhdGVkIHRvIFdFUCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gZXRjLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9fTElNX1NFQ1VSSVRZX1VUSUxTX0gKKyNkZWZpbmUgX19MSU1fU0VDVVJJVFlfVVRJTFNfSAorI2luY2x1ZGUgInNpck1hY1Byb3REZWYuaCIgLy9mb3IgdFNpck1hY0F1dGhGcmFtZUJvZHkKKworI2RlZmluZSBMSU1fRU5DUl9BVVRIX0JPRFlfTEVOICBzaXplb2YodFNpck1hY0F1dGhGcmFtZUJvZHkpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX1dFUF9JVl9MRU5HVEggKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfV0VQX0lDVl9MRU5HVEgKK3N0cnVjdCB0TGltUHJlQXV0aE5vZGU7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCit0QU5JX1U4ICAgICAgICBsaW1Jc0F1dGhBbGdvU3VwcG9ydGVkKHRwQW5pU2lyR2xvYmFsLCB0QW5pQXV0aFR5cGUsIHRwUEVTZXNzaW9uKTsKKyNlbHNlCit0QU5JX1U4ICAgICAgICBsaW1Jc0F1dGhBbGdvU3VwcG9ydGVkKHRwQW5pU2lyR2xvYmFsLCB0QW5pQXV0aFR5cGUpOworI2VuZGlmCisKKy8vIE1BQyBiYXNlZCBhdXRoZW50aWNhdGlvbiByZWxhdGVkIGZ1bmN0aW9ucwordm9pZCAgICAgICAgICAgICAgIGxpbUluaXRQcmVBdXRoTGlzdCh0cEFuaVNpckdsb2JhbCk7Cit2b2lkICAgICAgICAgICAgICAgbGltRGVsZXRlUHJlQXV0aExpc3QodHBBbmlTaXJHbG9iYWwpOworc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAgICAqbGltU2VhcmNoUHJlQXV0aExpc3QodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNBZGRyKTsKK3ZvaWQgICAgICAgICAgICAgICBsaW1BZGRQcmVBdXRoTm9kZSh0cEFuaVNpckdsb2JhbCwgc3RydWN0IHRMaW1QcmVBdXRoTm9kZSAqKTsKK3ZvaWQgICAgICAgICAgICAgICBsaW1EZWxldGVQcmVBdXRoTm9kZSh0cEFuaVNpckdsb2JhbCwgdFNpck1hY0FkZHIpOwordm9pZCAgICAgICAgICAgICAgIGxpbVJlbGVhc2VQcmVBdXRoTm9kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cExpbVByZUF1dGhOb2RlIHBBdXRoTm9kZSk7Cit2b2lkICAgICAgICAgICAgICAgbGltUmVzdG9yZUZyb21BdXRoU3RhdGUodHBBbmlTaXJHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclJlc3VsdENvZGVzLCB0QU5JX1UxNix0cFBFU2Vzc2lvbik7CisKKy8vIEVuY3J5cHRpb24vRGVjcnlwdGlvbiByZWxhdGVkIGZ1bmN0aW9ucwordENmZ1dlcEtleUVudHJ5ICAgICpsaW1Mb29rVXBLZXlNYXBwaW5ncyh0U2lyTWFjQWRkcik7Cit2b2lkICAgICAgICAgICAgICAgbGltQ29tcHV0ZUNyYzMyKHRBTklfVTggKiwgdEFOSV9VOCAqLCB0QU5JX1U4KTsKK3ZvaWQgICAgICAgICAgICAgICBsaW1SQzQodEFOSV9VOCAqLCB0QU5JX1U4ICosIHRBTklfVTggKiwgdEFOSV9VMzIsIHRBTklfVTE2KTsKK3ZvaWQgICAgICAgICAgICAgICBsaW1FbmNyeXB0QXV0aEZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4LCB0QU5JX1U4ICosIHRBTklfVTggKiwgdEFOSV9VOCAqLCB0QU5JX1UzMik7Cit0QU5JX1U4ICAgICAgICAgICAgICAgICBsaW1EZWNyeXB0QXV0aEZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4ICosIHRBTklfVTggKiwgdEFOSV9VOCAqLCB0QU5JX1UzMiwgdEFOSV9VMTYpOworCit2b2lkIGxpbVNlbmRTZXRCc3NLZXlSZXEoIHRwQW5pU2lyR2xvYmFsLCB0TGltTWxtU2V0S2V5c1JlcSAqLHRwUEVTZXNzaW9uICk7Cit2b2lkIGxpbVNlbmRTZXRTdGFLZXlSZXEoIHRwQW5pU2lyR2xvYmFsLCB0TGltTWxtU2V0S2V5c1JlcSAqLCB0QU5JX1UxNiwgdEFOSV9VOCx0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbVBvc3RTbWVTZXRLZXlzQ25mKCB0cEFuaVNpckdsb2JhbCwgdExpbU1sbVNldEtleXNSZXEgKiwgdExpbU1sbVNldEtleXNDbmYgKiApOworCit2b2lkIGxpbVNlbmRSZW1vdmVCc3NLZXlSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpbU1sbVJlbW92ZUtleVJlcSAqIHBNbG1SZW1vdmVLZXlSZXEsdHBQRVNlc3Npb24pOwordm9pZCBsaW1TZW5kUmVtb3ZlU3RhS2V5UmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaW1NbG1SZW1vdmVLZXlSZXEgKiBwTWxtUmVtb3ZlS2V5UmVxLCB0QU5JX1UxNiBzdGFJZHgsdHBQRVNlc3Npb24pOwordm9pZCBsaW1Qb3N0U21lUmVtb3ZlS2V5Q25mKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaW1NbG1SZW1vdmVLZXlSZXEgKiBwTWxtUmVtb3ZlS2V5UmVxLCB0TGltTWxtUmVtb3ZlS2V5Q25mICogbWxtUmVtb3ZlS2V5Q25mKTsKKworI2RlZmluZSAgUFRBUFMgIDB4ZWRiODgzMjAKKworc3RhdGljIGlubGluZSB0QU5JX1UzMgorbGltQ3JjVXBkYXRlKHRBTklfVTMyIGNyYywgdEFOSV9VOCB4KQoreworCisgICAgLy8gVXBkYXRlIENSQyBjb21wdXRhdGlvbiBmb3IgOCBiaXRzIGNvbnRhaW5lZCBpbiB4CisgICAgLy8KKyAgICB0QU5JX1UzMiB6OworICAgIHRBTklfVTMyIGZiOworICAgIGludCBpOworCisgICAgeiA9IGNyY154OworICAgIGZvciAoaT0wOyBpPDg7IGkrKykgeworICAgICAgICBmYiA9IHogJiAxOworICAgICAgICB6ID4+PSAxOworICAgICAgICBpZiAoZmIpIHogXj0gUFRBUFM7CisgICAgfQorICAgIHJldHVybiB6OworfQorCisjZW5kaWYgLyogX19MSU1fU0VDVVJJVFlfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZW5kTWFuYWdlbWVudEZyYW1lcy5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZW5kTWFuYWdlbWVudEZyYW1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlY2ZmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlbmRNYW5hZ2VtZW50RnJhbWVzLmMKQEAgLTAsMCArMSw1NDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBsaW1TZW5kTWFuYWdlbWVudEZyYW1lcy5jCisgKgorICogXGJyaWVmIENvZGUgZm9yIHByZXBhcmluZyBhbmQgc2VuZGluZyA4MDIuMTEgTWFuYWdlbWVudCBmcmFtZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBBaXJnbyBOZXR3b3JrcywgSW5jb3Jwb3JhdGVkCisgKgorICovCisKKyNpbmNsdWRlICJzaXJBcGkuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJzaXJNYWNQcm90RGVmLmgiCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbERhdGFTdHJ1Y3QuaCIKKyNlbmRpZgorI2luY2x1ZGUgImNmZ0FwaS5oIgorI2luY2x1ZGUgInV0aWxzQXBpLmgiCisjaW5jbHVkZSAibGltVHlwZXMuaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbVNlY3VyaXR5VXRpbHMuaCIKKyNpbmNsdWRlICJkb3QxMWYuaCIKKyNpbmNsdWRlICJsaW1TdGFIYXNoQXBpLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisjaW5jbHVkZSAicnJtQXBpLmgiCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyNpbmNsdWRlIDxsaW1DY3hwYXJzZXJBcGkuaD4KKyNlbmRpZgorI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKyNpbmNsdWRlICJkb3QxMWZkZWZzLmgiCisjZW5kaWYKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8vIEdldCBhbiBpbnRlZ3JhbCBjb25maWd1cmF0aW9uIGl0ZW0gJiBjaGVjayByZXR1cm4gc3RhdHVzOyBpZiBpdAorLy8vIGZhaWxzLCByZXR1cm4uCisjZGVmaW5lIENGR19MSU1fR0VUX0lOVF9OT19TVEFUVVMoblN0YXR1cywgcE1hYywgbkl0ZW0sIGNmZyApICAgICAgXAorICAgIChuU3RhdHVzKSA9IHdsYW5fY2ZnR2V0SW50KCAocE1hYyksIChuSXRlbSksICYgKGNmZykgKTsgICAgICAgICAgICAgXAorICAgIGlmICggZVNJUl9TVUNDRVNTICE9IChuU3RhdHVzKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxpbUxvZyggKHBNYWMpLCBMT0dQLCBGTCgiRmFpbGVkIHRvIHJldHJpZXZlICIgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI25JdGVtICIgZnJvbSBDRkcgKCVkKS5cbiIpLCAgICAgIFwKKyAgICAgICAgICAgICAgICAoblN0YXR1cykgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8vIEdldCBhbiB0ZXh0IGNvbmZpZ3VyYXRpb24gaXRlbSAmIGNoZWNrIHJldHVybiBzdGF0dXM7IGlmIGl0IGZhaWxzLAorLy8vIHJldHVybi4KKyNkZWZpbmUgQ0ZHX0xJTV9HRVRfU1RSX05PX1NUQVRVUyhuU3RhdHVzLCBwTWFjLCBuSXRlbSwgY2ZnLCBuQ2ZnLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTWF4Q2ZnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChuQ2ZnKSA9IChuTWF4Q2ZnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoblN0YXR1cykgPSB3bGFuX2NmZ0dldFN0ciggKHBNYWMpLCAobkl0ZW0pLCAoY2ZnKSwgJiAobkNmZykgKTsgICAgIFwKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSAoblN0YXR1cykgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaW1Mb2coIChwTWFjKSwgTE9HUCwgRkwoIkZhaWxlZCB0byByZXRyaWV2ZSAiICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNuSXRlbSAiIGZyb20gQ0ZHICglZCkuXG4iKSwgICAgICBcCisgICAgICAgICAgICAgICAgKG5TdGF0dXMpICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8qKgorICoKKyAqIFxicmllZiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB2YXJpb3VzIExJTSBtb2R1bGVzIHRvIHByZXBhcmUgdGhlCisgKiA4MDIuMTEgZnJhbWUgTUFDIGhlYWRlcgorICoKKyAqCisgKiBccGFyYW0gIHBNYWMgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIFxwYXJhbSBwQkQgUG9pbnRlciB0byB0aGUgZnJhbWUgYnVmZmVyIHRoYXQgbmVlZHMgdG8gYmUgcG9wdWxhdGUKKyAqCisgKiBccGFyYW0gdHlwZSBUeXBlIG9mIHRoZSBmcmFtZQorICoKKyAqIFxwYXJhbSBzdWJUeXBlIFN1YnR5cGUgb2YgdGhlIGZyYW1lCisgKgorICogXHJldHVybiBlSGFsU3RhdHVzCisgKgorICoKKyAqIFRoZSBwRnJhbWVCdWYgYXJndW1lbnQgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lIGJ1ZmZlciB0bworICogd2hpY2ggLSBhKSBUaGUgODAyLjExIE1BQyBoZWFkZXIgaXMgc2V0IGIpIEZvbGxvd2luZyB0aGlzIE1BQyBoZWFkZXIKKyAqIHdpbGwgYmUgdGhlIE1HTVQgZnJhbWUgcGF5bG9hZCBUaGUgcGF5bG9hZCBpdHNlbGYgaXMgcG9wdWxhdGVkIGJ5IHRoZQorICogY2FsbGVyIEFQSQorICoKKyAqCisgKi8KKwordFNpclJldFN0YXR1cyBsaW1Qb3B1bGF0ZU1hY0hlYWRlciggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCogcEJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggc3ViVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgcGVlckFkZHIgLHRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyKQoreworICAgIHRTaXJSZXRTdGF0dXMgICBzdGF0dXNDb2RlID0gZVNJUl9TVUNDRVNTOworICAgIHRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworICAgIAorICAgIC8vLyBQcmVwYXJlIE1BQyBtYW5hZ2VtZW50IGhlYWRlcgorICAgIHBNYWNIZHIgPSAodHBTaXJNYWNNZ210SGRyKSAocEJEKTsKKworICAgIC8vIFByZXBhcmUgRkMKKyAgICBwTWFjSGRyLT5mYy5wcm90VmVyID0gU0lSX01BQ19QUk9UT0NPTF9WRVJTSU9OOworICAgIHBNYWNIZHItPmZjLnR5cGUgICAgPSB0eXBlOworICAgIHBNYWNIZHItPmZjLnN1YlR5cGUgPSBzdWJUeXBlOworCisgICAgLy8gUHJlcGFyZSBBZGRyZXNzIDEKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBNYWNIZHItPmRhLAorICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBlZXJBZGRyLAorICAgICAgICAgICAgICAgICAgIHNpemVvZiggdFNpck1hY0FkZHIgKSk7CisKKyAgICAvLyBQcmVwYXJlIEFkZHJlc3MgMgorICAgICNpZiAwCisgICAgaWYgKChzdGF0dXNDb2RlID0gd2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19TVEFfSUQsICh0QU5JX1U4ICopIHBNYWNIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2ZnTGVuKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLy8gQ291bGQgbm90IGdldCBTVEFfSUQgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgIEZMKCJGYWlsZWQgdG8gcmV0cml2ZSBTVEFfSURcbiIpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGU7CisgICAgfQorICAgICNlbmRpZi8vIFRPIFNVUFBPUlQgQlQtQU1QCisgICAgc2lyQ29weU1hY0FkZHIocE1hY0hkci0+c2Esc2VsZk1hY0FkZHIpOworCisgICAgLy8gUHJlcGFyZSBBZGRyZXNzIDMKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBNYWNIZHItPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBlZXJBZGRyLAorICAgICAgICAgICAgICAgICAgIHNpemVvZiggdFNpck1hY0FkZHIgKSk7CisgICAgcmV0dXJuIHN0YXR1c0NvZGU7Cit9IC8qKiogZW5kIGxpbVBvcHVsYXRlTWFjSGVhZGVyKCkgKioqLworCisvKioKKyAqIFxicmllZiBsaW1TZW5kUHJvYmVSZXFNZ210RnJhbWUKKyAqCisgKgorICogXHBhcmFtICBwTWFjIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gIHBTc2lkIFNTSUQgdG8gYmUgc2VudCBpbiBQcm9iZSBSZXF1ZXN0IGZyYW1lCisgKgorICogXHBhcmFtICBic3NpZCBCU1NJRCB0byBiZSBzZW50IGluIFByb2JlIFJlcXVlc3QgZnJhbWUKKyAqCisgKiBccGFyYW0gIG5Qcm9iZURlbGF5IHByb2JlIGRlbGF5IHRvIGJlIHVzZWQgYmVmb3JlIHNlbmRpbmcgUHJvYmUgUmVxdWVzdAorICogZnJhbWUKKyAqCisgKiBccGFyYW0gbkNoYW5uZWxOdW0gQ2hhbm5lbCAjIG9uIHdoaWNoIHRoZSBQcm9iZSBSZXF1ZXN0IGlzIGdvaW5nIG91dAorICoKKyAqIFxwYXJhbSBuQWRkaXRpb25hbElFTGVuIGlmIG5vbi16ZXJvLCBpbmNsdWRlIHBBZGRpdGlvbmFsSUUgaW4gdGhlIFByb2JlIFJlcXVlc3QgZnJhbWUKKyAqCisgKiBccGFyYW0gcEFkZGl0aW9uYWxJRSBpZiBuQWRkaXRpb25hbElFTGVuIGlzIG5vbiB6ZXJvLCBpbmNsdWRlIHRoaXMgZmllbGQgaW4gdGhlIFByb2JlIFJlcXVlc3QgZnJhbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB2YXJpb3VzIExJTSBtb2R1bGVzIHRvIHNlbmQgUHJvYmUgUmVxdWVzdCBmcmFtZQorICogZHVyaW5nIGFjdGl2ZSBzY2FuL2xlYXJuIHBoYXNlLgorICogUHJvYmUgcmVxdWVzdCBpcyBzZW50IG91dCBpbiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvczoKKyAqIC0taGVhcnRiZWF0IGZhaWx1cmU6ICBzZXNzaW9uIG5lZWRlZAorICogLS1qb2luIHJlcTogICAgICAgICAgIHNlc3Npb24gbmVlZGVkCisgKiAtLWZvcmVncm91bmQgc2NhbjogICAgbm8gc2Vzc2lvbgorICogLS1iYWNrZ3JvdW5kIHNjYW46ICAgIG5vIHNlc3Npb24KKyAqIC0tc2NoQmVhY29uUHJvY2Vzc2luZzogIHRvIGdldCBFRENBIHBhcmFtZXRlcnM6ICBzZXNzaW9uIG5lZWRlZAorICoKKyAqCisgKi8KK3RTaXJSZXRTdGF0dXMKK2xpbVNlbmRQcm9iZVJlcU1nbXRGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNTU2lkICAgKnBTc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyICAgIGJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICAgICAgIG5DaGFubmVsTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyICAgIFNlbGZNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIGRvdDExbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQWRkaXRpb25hbElFTGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQWRkaXRpb25hbElFKQoreworICAgIHREb3QxMWZQcm9iZVJlcXVlc3QgcHI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICBuU3RhdHVzLCBuQnl0ZXMsIG5QYXlsb2FkOworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgblNpclN0YXR1czsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgKnBGcmFtZTsKKyAgICB2b2lkICAgICAgICAgICAgICAgKnBQYWNrZXQ7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICBoYWxzdGF0dXM7CisgICAgdHBQRVNlc3Npb24gICAgICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRBTklfVTggICAgICAgICAgICAgc2Vzc2lvbklkOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICpwMnBJZSA9IE5VTEw7CisjZW5kaWYKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHR4RmxhZyA9IDA7CisKKyNpZm5kZWYgR0VONF9TQ0FOCisgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoIEFOSV9EVlRfREVCVUcgKQorICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisjZW5kaWYKKworICAgIC8qCisgICAgKiBzZXNzaW9uIGNvbnRleHQgbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudCwgd2hlbiBwcm9iZSByZXF1ZXN0IG5lZWRzIHRvIGJlIHNlbnQgb3V0LgorICAgICogZm9sbG93aW5nIGNhc2VzIGV4aXN0OgorICAgICAgICAqIC0taGVhcnRiZWF0IGZhaWx1cmU6ICBzZXNzaW9uIG5lZWRlZAorICAgICogLS1qb2luIHJlcTogICAgICAgICAgIHNlc3Npb24gbmVlZGVkCisgICAgKiAtLWZvcmVncm91bmQgc2NhbjogICAgbm8gc2Vzc2lvbgorICAgICogLS1iYWNrZ3JvdW5kIHNjYW46ICAgIG5vIHNlc3Npb24KKyAgICAqIC0tc2NoQmVhY29uUHJvY2Vzc2luZzogIHRvIGdldCBFRENBIHBhcmFtZXRlcnM6ICBzZXNzaW9uIG5lZWRlZAorICAgICogSWYgc2Vzc2lvbiBjb250ZXh0IGRvZXMgbm90IGV4aXN0LCBzb21lIElFcyB3aWxsIGJlIHBvcHVsYXRlZCBmcm9tIENGR3MsIAorICAgICogZS5nLiBTdXBwb3J0ZWQgYW5kIEV4dGVuZGVkIHJhdGUgc2V0IElFcworICAgICovCisgICAgcHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMsYnNzaWQsJnNlc3Npb25JZCk7CisKKyAgICAvLyBUaGUgc2NoZW1lIGhlcmUgaXMgdG8gZmlsbCBvdXQgYSAndERvdDExZlByb2JlUmVxdWVzdCcgc3RydWN0dXJlCisgICAgLy8gYW5kIHRoZW4gaGFuZCBpdCBvZmYgdG8gJ2RvdDExZlBhY2tQcm9iZVJlcXVlc3QnIChmb3IKKyAgICAvLyBzZXJpYWxpemF0aW9uKS4gIFdlIHN0YXJ0IGJ5IHplcm8taW5pdGlhbGl6aW5nIHRoZSBzdHJ1Y3R1cmU6CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJnByLCBzaXplb2YoIHByICkgKTsKKworICAgIC8vICYgZGVsZWdhdGluZyB0byBhc3NvcnRlZCBoZWxwZXJzOgorICAgIFBvcHVsYXRlRG90MTFmU1NJRCggcE1hYywgcFNzaWQsICZwci5TU0lEICk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgaWYoIG5BZGRpdGlvbmFsSUVMZW4gJiYgcEFkZGl0aW9uYWxJRSApCisgICAgeworICAgICAgICBwMnBJZSA9IGxpbUdldFAycElFUHRyKHBNYWMsIHBBZGRpdGlvbmFsSUUsIG5BZGRpdGlvbmFsSUVMZW4pOworICAgIH0KKyAgICBpZiggcDJwSWUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIEluIHRoZSBiZWxvdyBBUEkgcGFzcyBjaGFubmVsIG51bWJlciA+IDE0LCBkbyB0aGF0IGl0IGZpbGxzIG9ubHkKKyAgICAgICAgICogMTFhIHJhdGVzIGluIHN1cHBvcnRlZCByYXRlcyAqLworICAgICAgICBQb3B1bGF0ZURvdDExZlN1cHBSYXRlcyggcE1hYywgMTUsICZwci5TdXBwUmF0ZXMscHNlc3Npb25FbnRyeSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjZW5kaWYKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZTdXBwUmF0ZXMoIHBNYWMsIG5DaGFubmVsTnVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByLlN1cHBSYXRlcyxwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICBpZiAoIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUIgIT0gZG90MTFtb2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZFeHRTdXBwUmF0ZXMxKCBwTWFjLCBuQ2hhbm5lbE51bSwgJnByLkV4dFN1cHBSYXRlcyApOworICAgICAgICB9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgLy9UYWJsZSA3LTE0IGluIElFRUUgU3RkLiA4MDIuMTFrLTIwMDggc2F5cworICAgIC8vRFMgcGFyYW1zICJjYW4iIGJlIHByZXNlbnQgaW4gUlJNIGlzIGRpc2FibGVkIGFuZCAiaXMiIHByZXNlbnQgaWYgCisgICAgLy9SUk0gaXMgZW5hYmxlZC4gSXQgc2hvdWxkIGJlIG9rIGV2ZW4gaWYgd2UgYWRkIGl0IGludG8gcHJvYmUgcmVxIHdoZW4gCisgICAgLy9SUk0gaXMgbm90IGVuYWJsZWQuIAorICAgIFBvcHVsYXRlRG90MTFmRFNQYXJhbXMoIHBNYWMsICZwci5EU1BhcmFtcywgbkNoYW5uZWxOdW0sIHBzZXNzaW9uRW50cnkgKTsKKyAgICAvL0NhbGwgUlJNIG1vZHVsZSB0byBnZXQgdGhlIHR4IHBvd2VyIGZvciBtYW5hZ2VtZW50IHVzZWQuCisgICAgeworICAgICAgIHRBTklfVTggdHhQb3dlciA9ICh0QU5JX1U4KSBycm1HZXRNZ210VHhQb3dlciggcE1hYywgcHNlc3Npb25FbnRyeSApOworICAgICAgIFBvcHVsYXRlRG90MTFmV0ZBVFBDKCBwTWFjLCAmcHIuV0ZBVFBDLCB0eFBvd2VyLCAwICk7CisgICAgfQorI2VuZGlmCisgICAgcE1hYy0+bGltLmh0Q2FwYWJpbGl0eSA9IElTX0RPVDExX01PREVfSFQoZG90MTFtb2RlKTsKKworICAgIGlmIChwc2Vzc2lvbkVudHJ5ICE9IE5VTEwgKSB7CisgICAgICAgcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5ID0gSVNfRE9UMTFfTU9ERV9IVChkb3QxMW1vZGUpOworICAgICAgIC8vSW5jbHVkZSBIVCBDYXBhYmlsaXR5IElFCisgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSkKKyAgICAgICB7CisgICAgICAgICAgIFBvcHVsYXRlRG90MTFmSFRDYXBzKCBwTWFjLCAmcHIuSFRDYXBzICk7CisgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICAgIGlmIChwTWFjLT5saW0uaHRDYXBhYmlsaXR5KQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBQb3B1bGF0ZURvdDExZkhUQ2FwcyggcE1hYywgJnByLkhUQ2FwcyApOworICAgICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhhdCdzIGl0LS0gbm93IHdlIHBhY2sgaXQuICBGaXJzdCwgaG93IG11Y2ggc3BhY2UgYXJlIHdlIGdvaW5nIHRvCisgICAgLy8gbmVlZD8KKyAgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkUHJvYmVSZXF1ZXN0U2l6ZSggcE1hYywgJnByLCAmblBheWxvYWQgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhIFByb2JlIFJlcXVlc3QgKDB4JTA4eCkuXG4iKSwgblN0YXR1cyApOworICAgICAgICAvLyBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86CisgICAgICAgIG5QYXlsb2FkID0gc2l6ZW9mKCB0RG90MTFmUHJvYmVSZXF1ZXN0ICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIFByb2JlIFJlcXVlc3QgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICkgKyBuQWRkaXRpb25hbElFTGVuOworICAKKyAgICAvLyBPay0tIHRyeSB0byBhbGxvY2F0ZSBzb21lIG1lbW9yeToKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgUHJvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBSZXF1ZXN0LlxuIiksIG5CeXRlcyApOworICAgICAgICByZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKworICAgIC8vIFBhcmFub2lhOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgICAvLyBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6CisgICAgblNpclN0YXR1cyA9IGxpbVBvcHVsYXRlTWFjSGVhZGVyKCBwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX1BST0JFX1JFUSwgYnNzaWQgLFNlbGZNYWNBZGRyKTsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwb3B1bGF0ZSB0aGUgYnVmZmVyIGRlc2NyaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvciBmb3IgYSBQcm9iZSBSZXF1ZXN0ICglZCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgcmV0dXJuIG5TaXJTdGF0dXM7ICAgICAgLy8gYWxsb2NhdGVkIQorICAgIH0KKworICAgIC8vIFRoYXQgZG9uZSwgcGFjayB0aGUgUHJvYmUgUmVxdWVzdDoKKyAgICBuU3RhdHVzID0gZG90MTFmUGFja1Byb2JlUmVxdWVzdCggcE1hYywgJnByLCBwRnJhbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRTaXJNYWNNZ210SGRyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXlsb2FkLCAmblBheWxvYWQgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFjayBhIFByb2JlIFJlcXVlc3QgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsgICAgLy8gYWxsb2NhdGVkIQorICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIFAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvYmUgUmVxdWVzdCAoMHglMDh4KS5cbiIpICk7CisgICAgfQorCisgICAgLy8gQXBwZW5kIGFueSBBZGRJRSBpZiBwcmVzZW50LgorICAgIGlmKCBuQWRkaXRpb25hbElFTGVuICkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZStzaXplb2YodFNpck1hY01nbXRIZHIpK25QYXlsb2FkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkaXRpb25hbElFLCBuQWRkaXRpb25hbElFTGVuICk7CisgICAgICAgIG5QYXlsb2FkICs9IG5BZGRpdGlvbmFsSUVMZW47CisgICAgfQorCisgICAgLyogSWYgdGhpcyBwcm9iZSByZXF1ZXN0IGlzIHNlbnQgZHVyaW5nIFAyUCBTZWFyY2ggU3RhdGUsIHRoZW4gd2UgbmVlZCAKKyAgICAgKiB0byBzZW5kIGl0IGF0IE9GRE0gcmF0ZS4gCisgICAgICovCisgICAgaWYoICggU0lSX0JBTkRfNV9HSFogPT0gbGltR2V0UkZCYW5kKG5DaGFubmVsTnVtKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICB8fCAoKCBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxICE9IE5VTEwpICYmCisgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+cDJwU2VhcmNoICkKKyNlbmRpZgorICAgICAgKSAKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOyAKKyAgICB9CisKKworICAgIGhhbHN0YXR1cyA9IGhhbFR4RnJhbWUoIHBNYWMsIHBQYWNrZXQsICggdEFOSV9VMTYgKSBzaXplb2YodFNpck1hY01nbXRIZHIpICsgblBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsLy9TTUFDX1NXQkRfVFhfVElEX01HTVRfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UeENvbXBsZXRlLCBwRnJhbWUsIHR4RmxhZyApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3Qgc2VuZCBQcm9iZSBSZXF1ZXN0IGZyYW1lIVxuIiApKTsKKyAgICAgICAgLy9Qa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvLyBFbmQgbGltU2VuZFByb2JlUmVxTWdtdEZyYW1lLgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAordFNpclJldFN0YXR1cyBsaW1HZXRBZGRuSWVGb3JQcm9iZVJlc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTgqIGFkZElFLCB0QU5JX1UxNiAqYWRkbklFTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBwcm9iZVJlcVAycEllKQoreworICAgIC8qIElmIFByb2JlIHJlcXVlc3QgZG9lc24ndCBoYXZlIFAyUCBJRSwgdGhlbiB0YWtlIG91dCBQMlAgSUUKKyAgICAgICBmcm9tIGFkZGl0aW9uYWwgSUUgKi8KKyAgICBpZighcHJvYmVSZXFQMnBJZSkKKyAgICB7CisgICAgICAgIHRBTklfVTgqIHRlbXBidWYgPSBOVUxMOworICAgICAgICB0QU5JX1UxNiB0ZW1wTGVuID0gMDsKKyAgICAgICAgaW50IGxlZnQgPSAqYWRkbklFTGVuOworICAgICAgICB2X1U4X3QgKnB0ciA9IGFkZElFOworICAgICAgICB2X1U4X3QgZWxlbV9pZCwgZWxlbV9sZW47CisKKyAgICAgICAgaWYoTlVMTCA9PSBhZGRJRSkKKyAgICAgICAgeworICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgIEZMKCIgTlVMTCBhZGRJRSBwb2ludGVyIikpOykKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICAgIH0KKworICAgICAgICBpZiggKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKiopJnRlbXBidWYsCisgICAgICAgICAgICAgbGVmdCkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBhZGRuIElFIikpOykKKyAgICAgICAgICAgIHJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZShsZWZ0ID49IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVsZW1faWQgID0gcHRyWzBdOworICAgICAgICAgICAgZWxlbV9sZW4gPSBwdHJbMV07CisgICAgICAgICAgICBsZWZ0IC09IDI7CisgICAgICAgICAgICBpZihlbGVtX2xlbiA+IGxlZnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgIEZMKCIqKioqSW52YWxpZCBJRXMgZWlkID0gJWQgZWxlbV9sZW49JWQgbGVmdD0lZCoqKioqXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1faWQsZWxlbV9sZW4sbGVmdCk7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCB0ZW1wYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCAhKCAoU0lSX01BQ19FSURfVkVORE9SID09IGVsZW1faWQpICYmCisgICAgICAgICAgICAgICAgICAgKG1lbWNtcCgmcHRyWzJdLCBTSVJfTUFDX1AyUF9PVUksIFNJUl9NQUNfUDJQX09VSV9TSVpFKT09MCkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSAoIHBNYWMtPmhIZGQsIHRlbXBidWYgKyB0ZW1wTGVuLCAmcHRyWzBdLCBlbGVtX2xlbiArIDIpOworICAgICAgICAgICAgICAgIHRlbXBMZW4gKz0gKGVsZW1fbGVuICsgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZWZ0IC09IGVsZW1fbGVuOworICAgICAgICAgICAgcHRyICs9IChlbGVtX2xlbiArIDIpOworICAgICAgIH0KKyAgICAgICBwYWxDb3B5TWVtb3J5ICggcE1hYy0+aEhkZCwgYWRkSUUsIHRlbXBidWYsIHRlbXBMZW4pOworICAgICAgICphZGRuSUVMZW4gPSB0ZW1wTGVuOworICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgdGVtcGJ1Zik7CisgICAgfQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisjZW5kaWYKKwordm9pZAorbGltU2VuZFByb2JlUnNwTWdtdEZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgICAgcGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHBBbmlTU0lEICAgICAgcFNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgICAgICAgICAgblN0YUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICAgICAgIG5LZWVwQWxpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICBwcm9iZVJlcVAycEllKQoreworICAgIHREb3QxMWZQcm9iZVJlc3BvbnNlIGZybTsKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgICBuU2lyU3RhdHVzOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGNmZywgblBheWxvYWQsIG5CeXRlcywgblN0YXR1czsKKyAgICB0cFNpck1hY01nbXRIZHIgICAgICBwTWFjSGRyOworICAgIHRBTklfVTggICAgICAgICAgICAgKnBGcmFtZTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICpwUGFja2V0OworICAgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbHN0YXR1czsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICBhZGRuSUVQcmVzZW50OworICAgIHRBTklfVTMyICAgICAgICAgICAgIGFkZG5JRTFMZW49MDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICBhZGRuSUUyTGVuPTA7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgYWRkbklFM0xlbj0wOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIHRvdGFsQWRkbkllTGVuID0gMDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICB3cHNBcEVuYWJsZT0wLCB0bXA7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgdHhGbGFnID0gMDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAqYWRkSUUgPSBOVUxMOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICpwUDJwSWUgPSBOVUxMOworICAgIHRBTklfVTggICAgICAgICAgICAgIG5vYUxlbiA9IDA7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgdG90YWxfbm9hTGVuID0gMDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBub2FTdHJlYW1bU0lSX01BWF9OT0FfQVRUUl9MRU4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTSVJfUDJQX0lFX0hFQURFUl9MRU5dOworICAgIHRBTklfVTggICAgICAgICAgICAgIG5vYUllW1NJUl9NQVhfTk9BX0FUVFJfTEVOICsgU0lSX1AyUF9JRV9IRUFERVJfTEVOXTsKKyNlbmRpZgorICAKKyAgICBpZihwTWFjLT5nRHJpdmVyVHlwZSA9PSBlRFJJVkVSX1RZUEVfTUZHKSAgICAgICAgIC8vIFdlIGRvbid0IGFuc3dlciByZXF1ZXN0cworICAgIHsKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZS4KKyAgICB9CisKKyAgICBpZihOVUxMID09IHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8vIEZpbGwgb3V0ICdmcm0nLCBhZnRlciB3aGljaCB3ZSdsbCBqdXN0IGhhbmQgdGhlIHN0cnVjdCBvZmYgdG8KKyAgICAvLyAnZG90MTFmUGFja1Byb2JlUmVzcG9uc2UnLgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZmcm0sIHNpemVvZiggZnJtICkgKTsKKworICAgIC8vIFRpbWVzdGFtcCB0byBiZSB1cGRhdGVkIGJ5IFRGUCwgYmVsb3cuCisKKyAgICAvLyBCZWFjb24gSW50ZXJ2YWw6CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgIHsKKyAgICAgICAgZnJtLkJlYWNvbkludGVydmFsLmludGVydmFsID0gcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uSW50ZXJ2YWw7ICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNlbmRpZgorICAgIENGR19MSU1fR0VUX0lOVF9OT19TVEFUVVMoIG5TaXJTdGF0dXMsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19CRUFDT05fSU5URVJWQUwsIGNmZyApOworICAgIGZybS5CZWFjb25JbnRlcnZhbC5pbnRlcnZhbCA9ICggdEFOSV9VMTYgKSBjZmc7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIH0KKyNlbmRpZgorCisKKyAgICBQb3B1bGF0ZURvdDExZkNhcGFiaWxpdGllcyggcE1hYywgJmZybS5DYXBhYmlsaXRpZXMsIHBzZXNzaW9uRW50cnkgKTsKKyAgICBQb3B1bGF0ZURvdDExZlNTSUQoIHBNYWMsICggdFNpck1hY1NTaWQqIClwU3NpZCwgJmZybS5TU0lEICk7CisgICAgUG9wdWxhdGVEb3QxMWZTdXBwUmF0ZXMoIHBNYWMsIFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZybS5TdXBwUmF0ZXMscHNlc3Npb25FbnRyeSk7CisKKyAgICBQb3B1bGF0ZURvdDExZkRTUGFyYW1zKCBwTWFjLCAmZnJtLkRTUGFyYW1zLCBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwsIHBzZXNzaW9uRW50cnkpOworICAgIFBvcHVsYXRlRG90MTFmSUJTU1BhcmFtcyggcE1hYywgJmZybS5JQlNTUGFyYW1zLCBwc2Vzc2lvbkVudHJ5ICk7CisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgUG9wdWxhdGVEb3QxMWZDRlBhcmFtcyggcE1hYywgJmZybS5DYXBhYmlsaXRpZXMsICZmcm0uQ0ZQYXJhbXMgKTsKKyNlbmRpZiAvLyBBUCBJbWFnZQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgIHsKKyAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+d3BzX3N0YXRlICE9IFNBUF9XUFNfRElTQUJMRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmUHJvYmVSZXNXUFNJRXMocE1hYywgJmZybS5Xc2NQcm9iZVJlcywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNlbmRpZgorICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCAodEFOSV9VMTYpIFdOSV9DRkdfV1BTX0VOQUJMRSwgJnRtcCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwiRmFpbGVkIHRvIGNmZyBnZXQgaWQgJWRcbiIsIFdOSV9DRkdfV1BTX0VOQUJMRSApOworICAgIAorICAgIHdwc0FwRW5hYmxlID0gdG1wICYgV05JX0NGR19XUFNfRU5BQkxFX0FQOworICAgIAorICAgIGlmICh3cHNBcEVuYWJsZSkKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmV3NjSW5Qcm9iZVJlcyhwTWFjLCAmZnJtLldzY1Byb2JlUmVzKTsKKyAgICB9CisKKyAgICBpZiAocE1hYy0+bGltLndzY0llSW5mby5wcm9iZVJlc3BXc2NFbnJvbGxtZW50U3RhdGUgPT0gZUxJTV9XU0NfRU5ST0xMX0JFR0lOKQorICAgIHsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZXc2NSZWdpc3RyYXJJbmZvSW5Qcm9iZVJlcyhwTWFjLCAmZnJtLldzY1Byb2JlUmVzKTsKKyAgICAgICAgcE1hYy0+bGltLndzY0llSW5mby5wcm9iZVJlc3BXc2NFbnJvbGxtZW50U3RhdGUgPSBlTElNX1dTQ19FTlJPTExfSU5fUFJPR1JFU1M7CisgICAgfQorCisgICAgaWYgKHBNYWMtPmxpbS53c2NJZUluZm8ud3NjRW5yb2xsbWVudFN0YXRlID09IGVMSU1fV1NDX0VOUk9MTF9FTkQpCisgICAgeworICAgICAgICBEZVBvcHVsYXRlRG90MTFmV3NjUmVnaXN0cmFySW5mb0luUHJvYmVSZXMocE1hYywgJmZybS5Xc2NQcm9iZVJlcyk7CisgICAgICAgIHBNYWMtPmxpbS53c2NJZUluZm8ucHJvYmVSZXNwV3NjRW5yb2xsbWVudFN0YXRlID0gZUxJTV9XU0NfRU5ST0xMX05PT1A7CisgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB9CisjZW5kaWYKKworICAgIFBvcHVsYXRlRG90MTFmQ291bnRyeSggcE1hYywgJmZybS5Db3VudHJ5LCBwc2Vzc2lvbkVudHJ5KTsKKyAgICBQb3B1bGF0ZURvdDExZkVEQ0FQYXJhbVNldCggcE1hYywgJmZybS5FRENBUGFyYW1TZXQsIHBzZXNzaW9uRW50cnkpOworCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgIGlmKCBwTWFjLT5saW0uZ0xpbTExaEVuYWJsZSApCisgICAgeworICAgICAgICBQb3B1bGF0ZURvdDExZlBvd2VyQ29uc3RyYWludHMoIHBNYWMsICZmcm0uUG93ZXJDb25zdHJhaW50cyApOworICAgICAgICBQb3B1bGF0ZURvdDExZlRQQ1JlcG9ydCggcE1hYywgJmZybS5UUENSZXBvcnQsIHBzZXNzaW9uRW50cnkpOworCisgICAgICAgIC8vIElmIC4xMWggaXNlbmFibGVkICYgY2hhbm5lbCBzd2l0Y2hpbmcgaXMgbm90IGFscmVhZHkgc3RhcnRlZCBhbmQKKyAgICAgICAgLy8gd2UncmUgaW4gZWl0aGVyIFBSSU1BUllfT05MWSBvciBQUklNQVJZX0FORF9TRUNPTkRBUlkgc3RhdGUsIHRoZW4KKyAgICAgICAgLy8gcG9wdWxhdGUgODAyLjExaCBjaGFubmVsIHN3aXRjaCBJRQorICAgICAgICBpZiAoKCBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQgIT0gMCApICYmCisgICAgICAgICAgICAgKCBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUgPT0KKyAgICAgICAgICAgICAgIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9PTkxZIHx8CisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUgPT0KKyAgICAgICAgICAgICAgIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9BTkRfU0VDT05EQVJZICkgKQorICAgICAgICB7CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZkNoYW5Td2l0Y2hBbm4oIHBNYWMsICZmcm0uQ2hhblN3aXRjaEFubiApOworICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZFeHRDaGFuU3dpdGNoQW5uKHBNYWMsICZmcm0uRXh0Q2hhblN3aXRjaEFubik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5kb3QxMW1vZGUgIT0gV05JX0NGR19ET1QxMV9NT0RFXzExQikKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZFUlBJbmZvKCBwTWFjLCAmZnJtLkVSUEluZm8sIHBzZXNzaW9uRW50cnkpOworCisKKyAgICAvLyBOLkIuIEluIGVhcmxpZXIgaW1wbGVtZW50YXRpb25zLCB0aGUgUlNOIElFIHdvdWxkIGJlIHBsYWNlZCBpbgorICAgIC8vIHRoZSBmcmFtZSBoZXJlLCBiZWZvcmUgdGhlIFdQQSBJRSwgaWYgJ1JTTl9CRUZPUkVfV1BBJyB3YXMgZGVmaW5lZC4KKyAgICBQb3B1bGF0ZURvdDExZkV4dFN1cHBSYXRlcyggcE1hYywgUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJtLkV4dFN1cHBSYXRlcywgcHNlc3Npb25FbnRyeSApOworCisgICAgLy9Qb3B1bGF0ZSBIVCBJRXMsIHdoZW4gb3BlcmF0aW5nIGluIDExbiBvciBUYXVydXMgbW9kZXMuCisgICAgaWYgKCBwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkgKQorICAgIHsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZIVENhcHMoIHBNYWMsICZmcm0uSFRDYXBzICk7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBQb3B1bGF0ZURvdDExZkhUSW5mbyggcE1hYywgJmZybS5IVEluZm8sIHBzZXNzaW9uRW50cnkgKTsKKyNlbHNlCisgICAgICAgIFBvcHVsYXRlRG90MTFmSFRJbmZvKCBwTWFjLCAmZnJtLkhUSW5mbyApOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKCBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEgKSAKKyAgICB7CisgICAgICBQb3B1bGF0ZURvdDExZldQQSggcE1hYywgJiggcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5yc25JRSApLAorICAgICAgICAgICZmcm0uV1BBICk7CisgICAgICBQb3B1bGF0ZURvdDExZlJTTiggcE1hYywgJiggcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT5yc25JRSApLAorICAgICAgICAgICZmcm0uUlNOICk7CisgICAgfQorCisgICAgUG9wdWxhdGVEb3QxMWZXTU0oIHBNYWMsICZmcm0uV01NSW5mb0FwLCAmZnJtLldNTVBhcmFtcywgJmZybS5XTU1DYXBzLCBwc2Vzc2lvbkVudHJ5ICk7CisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorICAgIGlmKCBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEgKSAKKyAgICB7CisgICAgICBQb3B1bGF0ZURvdDExZldBUEkoIHBNYWMsICYoIHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+cnNuSUUgKSwKKyAgICAgICAgICAmZnJtLldBUEkgKTsKKyAgICB9CisKKyNlbmRpZiAvLyBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorCisKKyAgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkUHJvYmVSZXNwb25zZVNpemUoIHBNYWMsICZmcm0sICZuUGF5bG9hZCApOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGEgUHJvYmUgUmVzcG9uc2UgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgIC8vIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzoKKyAgICAgICAgblBheWxvYWQgPSBzaXplb2YoIHREb3QxMWZQcm9iZVJlc3BvbnNlICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIFByb2JlIFJlc3BvbnNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDB4JTA4eCkuXG4iKSwgblN0YXR1cyApOworICAgIH0KKworICAgIG5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApOworCisgICAgYWRkbklFUHJlc2VudCA9IGZhbHNlOworICAgIAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICBpZiggcE1hYy0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxICkKKyAgICB7CisgICAgICAgIG5CeXRlcyArPSAocE1hYy0+bGltLmdwTGltUmVtYWluT25DaGFuUmVxLT5sZW5ndGggLSBzaXplb2YoIHRTaXJSZW1haW5PbkNoblJlcSApICk7CisgICAgfQorICAgIC8vT25seSB1c2UgQ0ZHIGZvciBub24tbGlzdGVuIG1vZGUuIFRoaXMgQ0ZHIGlzIG5vdCB3b3JraW5nIGZvciBjb25jdXJyZW5jeQorICAgIC8vSW4gbGlzdGVuaW5nIG1vZGUsIHByb2JlIHJzcCBJRXMgaXMgcGFzc2VkIGluIHRoZSBtZXNzYWdlIGZyb20gU01FIHRvIFBFCisgICAgZWxzZQorI2VuZGlmCisgICAgeworCisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfRkxBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRuSUVQcmVzZW50KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGdldCBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfRkxBRyIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhZGRuSUVQcmVzZW50KQorICAgIHsKKyAgICAgICAgaWYoIChwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCoqKSZhZGRJRSwgCisgICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExX0xFTiozICkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBhZGRuIElFIikpOykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy9Qcm9iZSByc3AgSUUgYXZhaWxhYmxlCisgICAgICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0U3RyTGVuKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExLCAmYWRkbklFMUxlbikgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBnZXQgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExIGxlbmd0aCIpKTsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgYWRkSUUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhZGRuSUUxTGVuIDw9IFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMV9MRU4gJiYgYWRkbklFMUxlbiAmJgorICAgICAgICAgICAgICAgICAgICAgKG5CeXRlcyArIGFkZG5JRTFMZW4pIDw9IFNJUl9NQVhfUEFDS0VUX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0U3RyKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExLCAmYWRkSUVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZG5JRTFMZW4pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gZ2V0IFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMSBTdHJpbmciKSk7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBhZGRJRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9Qcm9iZSByc3AgSUUgYXZhaWxhYmxlCisgICAgICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0U3RyTGVuKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEyLCAmYWRkbklFMkxlbikgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBnZXQgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEyIGxlbmd0aCIpKTsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgYWRkSUUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhZGRuSUUyTGVuIDw9IFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMl9MRU4gJiYgYWRkbklFMkxlbiAmJgorICAgICAgICAgICAgICAgICAgICAgKG5CeXRlcyArIGFkZG5JRTJMZW4pIDw9IFNJUl9NQVhfUEFDS0VUX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0U3RyKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEyLCAmYWRkSUVbYWRkbklFMUxlbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZG5JRTJMZW4pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gZ2V0IFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMiBTdHJpbmciKSk7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBhZGRJRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9Qcm9iZSByc3AgSUUgYXZhaWxhYmxlCisgICAgICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0U3RyTGVuKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEzLCAmYWRkbklFM0xlbikgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBnZXQgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEzIGxlbmd0aCIpKTsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgYWRkSUUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhZGRuSUUzTGVuIDw9IFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBM19MRU4gJiYgYWRkbklFM0xlbiAmJgorICAgICAgICAgICAgICAgICAgICAgKG5CeXRlcyArIGFkZG5JRTNMZW4pIDw9IFNJUl9NQVhfUEFDS0VUX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0U3RyKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRJRVthZGRuSUUxTGVuICsgYWRkbklFMkxlbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZG5JRTNMZW4pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gZ2V0IFdOSV9DRkdfUFJPQkVfUlNQX0FERE5JRV9EQVRBMyBTdHJpbmciKSk7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBhZGRJRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRvdGFsQWRkbkllTGVuID0gYWRkbklFMUxlbiArIGFkZG5JRTJMZW4gKyBhZGRuSUUzTGVuOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICBpZihlU0lSX1NVQ0NFU1MgIT0gbGltR2V0QWRkbkllRm9yUHJvYmVSZXNwKHBNYWMsIGFkZElFLCAmdG90YWxBZGRuSWVMZW4sIHByb2JlUmVxUDJwSWUpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgRkwoIlVuYWJsZSB0byBnZXQgZmluYWwgQWRkaXRpb25hbCBJRSBmb3IgUHJvYmUgUmVxIikpOworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBhZGRJRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbkJ5dGVzID0gbkJ5dGVzICsgdG90YWxBZGRuSWVMZW47CisKKyAgICAgICAgaWYgKHByb2JlUmVxUDJwSWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQMnBJZSA9IGxpbUdldFAycElFUHRyKHBNYWMsICZhZGRJRVswXSwgdG90YWxBZGRuSWVMZW4pOworICAgICAgICAgICAgaWYgKHBQMnBJZSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vZ2V0IE5vQSBhdHRyaWJ1dGUgc3RyZWFtIFAyUCBJRQorICAgICAgICAgICAgICAgIG5vYUxlbiA9IGxpbUdldE5vYUF0dHJTdHJlYW0ocE1hYywgbm9hU3RyZWFtLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICBpZiAobm9hTGVuICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0b3RhbF9ub2FMZW4gPSBsaW1CdWlsZFAycEllKHBNYWMsICZub2FJZVswXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FTdHJlYW1bMF0sIG5vYUxlbik7IAorICAgICAgICAgICAgICAgICAgICBuQnl0ZXMgPSBuQnl0ZXMgKyB0b3RhbF9ub2FMZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgUHJvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBSZXNwb25zZS5cbiIpLCBuQnl0ZXMgKTsKKyAgICAgICAgaWYgKCBhZGRJRSAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBhZGRJRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFBhcmFub2lhOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgICAvLyBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6CisgICAgblNpclN0YXR1cyA9IGxpbVBvcHVsYXRlTWFjSGVhZGVyKCBwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX1BST0JFX1JTUCwgcGVlck1hY0FkZHIscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworICAgIGlmICggZVNJUl9TVUNDRVNTICE9IG5TaXJTdGF0dXMgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBvcHVsYXRlIHRoZSBidWZmZXIgZGVzY3JpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9yIGZvciBhIFByb2JlIFJlc3BvbnNlICglZCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgaWYgKCBhZGRJRSAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBhZGRJRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBNYWNIZHIgPSAoIHRwU2lyTWFjTWdtdEhkciApIHBGcmFtZTsKKyAgCisgICAgc2lyQ29weU1hY0FkZHIocE1hY0hkci0+YnNzSWQscHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisgICAgLy8gVGhhdCBkb25lLCBwYWNrIHRoZSBQcm9iZSBSZXNwb25zZToKKyAgICBuU3RhdHVzID0gZG90MTFmUGFja1Byb2JlUmVzcG9uc2UoIHBNYWMsICZmcm0sIHBGcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2sgYSBQcm9iZSBSZXNwb25zZSAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICBpZiAoIGFkZElFICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIGFkZElFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQhCisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIGEgUCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm9iZSBSZXNwb25zZSAoMHglMDh4KS5cbiIpICk7CisgICAgfQorCisgICAgUEVMT0czKGxpbUxvZyggcE1hYywgTE9HMywgRkwoIlNlbmRpbmcgUHJvYmUgUmVzcG9uc2UgZnJhbWUgdG8gIikgKTsKKyAgICBsaW1QcmludE1hY0FkZHIoIHBNYWMsIHBlZXJNYWNBZGRyLCBMT0czICk7KQorCisgICAgcE1hYy0+c3lzLnByb2JlUmVzcG9uZCsrOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIGlmKCBwTWFjLT5saW0uZ3BMaW1SZW1haW5PbkNoYW5SZXEgKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSAoIHBNYWMtPmhIZGQsIHBGcmFtZStzaXplb2YodFNpck1hY01nbXRIZHIpK25QYXlsb2FkLAorICAgICAgICAgIHBNYWMtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcS0+cHJvYmVSc3BJZSwgKHBNYWMtPmxpbS5ncExpbVJlbWFpbk9uQ2hhblJlcS0+bGVuZ3RoIC0gc2l6ZW9mKCB0U2lyUmVtYWluT25DaG5SZXEgKSkgKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggYWRkbklFUHJlc2VudCApCisgICAgeworICAgICAgICBpZiAocGFsQ29weU1lbW9yeSAoIHBNYWMtPmhIZGQsIHBGcmFtZStzaXplb2YodFNpck1hY01nbXRIZHIpK25QYXlsb2FkLAorICAgICAgICAgICAgICZhZGRJRVswXSwgdG90YWxBZGRuSWVMZW4pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJBZGRpdGlvbmFsIFByb2JlIFJwIElFIHJlcXVlc3QgZmFpbGVkIHdoaWxlIEFwcGVuZGluZzogJXgiKSxoYWxzdGF0dXMpOworICAgICAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgICAgICBpZiAoIGFkZElFICE9IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgYWRkSUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICBpZiAobm9hTGVuICE9IDApCisgICAgeworICAgICAgICBpZiAocGFsQ29weU1lbW9yeSAoIHBNYWMtPmhIZGQsICZwRnJhbWVbbkJ5dGVzIC0gKHRvdGFsX25vYUxlbildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYUllWzBdLCB0b3RhbF9ub2FMZW4pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICBGTCgiTm90IGFibGUgdG8gaW5zZXJ0IE5vQSBiZWNhdXNlIG9mIGxlbmd0aCBjb25zdHJhaW50IikpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggKCBTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgfHwgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSApIHx8CisgICAgICAgICAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisjZW5kaWYKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgIH0KKworICAgIC8vIFF1ZXVlIFByb2JlIFJlc3BvbnNlIGZyYW1lIGluIGhpZ2ggcHJpb3JpdHkgV1EKKyAgICBoYWxzdGF0dXMgPSBoYWxUeEZyYW1lKCAoIHRIYWxIYW5kbGUgKSBwTWFjLCBwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VMTYgKSBuQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsLy9TTUFDX1NXQkRfVFhfVElEX01HTVRfTE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVR4Q29tcGxldGUsIHBGcmFtZSwgdHhGbGFnICk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkNvdWxkIG5vdCBzZW5kIFByb2JlIFJlc3BvbnNlLlxuIikgKTsKKyAgICAgICAgLy9Qa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sKKyAgICB9CisKKyAgICBpZiAoIGFkZElFICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBhZGRJRSk7CisgICAgfQorCit9IC8vIEVuZCBsaW1TZW5kUHJvYmVSc3BNZ210RnJhbWUuCisKK3ZvaWQKK2xpbVNlbmRBZGR0c1JlcUFjdGlvbkZyYW1lKHRwQW5pU2lyR2xvYmFsICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciAgICAgICBwZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJBZGR0c1JlcUluZm8gKnBBZGRUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uICAgICAgIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICBpOworICAgIHRBTklfVTggICAgICAgICAgICAgICAqcEZyYW1lOworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgICAgblNpclN0YXR1czsKKyAgICB0RG90MTFmQWRkVFNSZXF1ZXN0ICAgIEFkZFRTUmVxOworICAgIHREb3QxMWZXTU1BZGRUU1JlcXVlc3QgV01NQWRkVFNSZXE7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBuUGF5bG9hZCwgbkJ5dGVzLCBuU3RhdHVzOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgcE1hY0hkcjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKnBQYWNrZXQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIHRBTklfVTMyICAgICAgICAgICAgICAgcGh5TW9kZTsKKyNlbmRpZgorICAgIGVIYWxTdGF0dXMgICAgICAgICAgICAgaGFsc3RhdHVzOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgdHhGbGFnID0gMDsKKworICAgIGlmKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkKKyAgICB7CisgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICEgcEFkZFRTLT53bWVUc3BlY1ByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJkFkZFRTUmVxLCBzaXplb2YoIEFkZFRTUmVxICkgKTsKKworICAgICAgICBBZGRUU1JlcS5BY3Rpb24uYWN0aW9uICAgICA9IFNJUl9NQUNfUU9TX0FERF9UU19SRVE7CisgICAgICAgIEFkZFRTUmVxLkRpYWxvZ1Rva2VuLnRva2VuID0gcEFkZFRTLT5kaWFsb2dUb2tlbjsKKyAgICAgICAgQWRkVFNSZXEuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9RT1NfTUdNVDsKKyAgICAgICAgaWYgKCBwQWRkVFMtPmxsZVRzcGVjUHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmVFNQRUMoICZwQWRkVFMtPnRzcGVjLCAmQWRkVFNSZXEuVFNQRUMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmV01NVFNQRUMoICZwQWRkVFMtPnRzcGVjLCAmQWRkVFNSZXEuV01NVFNQRUMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcEFkZFRTLT5sbGVUc3BlY1ByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBBZGRUU1JlcS5udW1fV01NVENMQVMgPSAwOworICAgICAgICAgICAgQWRkVFNSZXEubnVtX1RDTEFTID0gcEFkZFRTLT5udW1UY2xhczsKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcEFkZFRTLT5udW1UY2xhczsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmVENMQVMoIHBNYWMsICZwQWRkVFMtPnRjbGFzSW5mb1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRkVFNSZXEuVENMQVNbaV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkZFRTUmVxLm51bV9UQ0xBUyA9IDA7CisgICAgICAgICAgICBBZGRUU1JlcS5udW1fV01NVENMQVMgPSBwQWRkVFMtPm51bVRjbGFzOworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwQWRkVFMtPm51bVRjbGFzOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1UQ0xBUyggcE1hYywgJnBBZGRUUy0+dGNsYXNJbmZvW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGRUU1JlcS5XTU1UQ0xBU1tpXSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBwQWRkVFMtPnRjbGFzUHJvY1ByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBBZGRUUy0+bGxlVHNwZWNQcmVzZW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGRUU1JlcS5UQ0xBU1NQUk9DLnByb2Nlc3NpbmcgPSBwQWRkVFMtPnRjbGFzUHJvYzsKKyAgICAgICAgICAgICAgICBBZGRUU1JlcS5UQ0xBU1NQUk9DLnByZXNlbnQgICAgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZFRTUmVxLldNTVRDTEFTUFJPQy52ZXJzaW9uICAgID0gMTsKKyAgICAgICAgICAgICAgICBBZGRUU1JlcS5XTU1UQ0xBU1BST0MucHJvY2Vzc2luZyA9IHBBZGRUUy0+dGNsYXNQcm9jOworICAgICAgICAgICAgICAgIEFkZFRTUmVxLldNTVRDTEFTUFJPQy5wcmVzZW50ICAgID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5TdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRBZGRUU1JlcXVlc3RTaXplKCBwTWFjLCAmQWRkVFNSZXEsICZuUGF5bG9hZCApOworICAgICAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhbiBBZGQgVFMgUmVxdWVzdCAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgICAgICAvLyBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86CisgICAgICAgICAgICBuUGF5bG9hZCA9IHNpemVvZiggdERvdDExZkFkZFRTUmVxdWVzdCApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhbiBBZGQgVFMgUmVxdWVzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJldNTUFkZFRTUmVxLCBzaXplb2YoIFdNTUFkZFRTUmVxICkgKTsKKworICAgICAgICBXTU1BZGRUU1JlcS5BY3Rpb24uYWN0aW9uICAgICA9IFNJUl9NQUNfUU9TX0FERF9UU19SRVE7CisgICAgICAgIFdNTUFkZFRTUmVxLkRpYWxvZ1Rva2VuLnRva2VuID0gcEFkZFRTLT5kaWFsb2dUb2tlbjsKKyAgICAgICAgV01NQWRkVFNSZXEuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9XTUU7CisKKyAgICAgICAgLy8gV01NIHNwZWMgMi4yLjEwIC0gc3RhdHVzIGNvZGUgaXMgb25seSBmaWxsZWQgaW4gZm9yIEFERFRTIHJlc3BvbnNlCisgICAgICAgIFdNTUFkZFRTUmVxLlN0YXR1c0NvZGUuc3RhdHVzQ29kZSA9IDA7CisKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1UU1BFQyggJnBBZGRUUy0+dHNwZWMsICZXTU1BZGRUU1JlcS5XTU1UU1BFQyApOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgbGltR2V0UGh5TW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgaWYoIHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcgfHwgcGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExQSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkZFRTLT50c3JzSUUucmF0ZXNbMF0gPSBUU1JTXzExQUdfUkFURV82TUJQUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICBwQWRkVFMtPnRzcnNJRS5yYXRlc1swXSA9IFRTUlNfMTFCX1JBVEVfNV81TUJQUzsKKyAgICAgICAgfQorICAgICAgICBQb3B1bGF0ZURvdDExVFNSU0lFKHBNYWMsJnBBZGRUUy0+dHNyc0lFLCAmV01NQWRkVFNSZXEuQ0NYVHJhZlN0cm1SYXRlU2V0LHNpemVvZih0QU5JX1U4KSk7CisjZW5kaWYKKyAgICAgICAgLy8gZmlsbFdtZVRzcGVjSUUKKworICAgICAgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkV01NQWRkVFNSZXF1ZXN0U2l6ZSggcE1hYywgJldNTUFkZFRTUmVxLCAmblBheWxvYWQgKTsKKyAgICAgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYSBXTU0gQWRkIFRTIFJlcXVlc3QgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICAgICAgLy8gV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOgorICAgICAgICAgICAgblBheWxvYWQgPSBzaXplb2YoIHREb3QxMWZBZGRUU1JlcXVlc3QgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBXTU0gQWRkIFRTIFJlcXUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlc3QgKDB4JTA4eCkuXG4iKSwgblN0YXR1cyApOworICAgICAgICB9CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICk7CisKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGFuIEFkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkIFRTIFJlcXVlc3QuXG4iKSwgbkJ5dGVzICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBQYXJhbm9pYToKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwRnJhbWUsIG5CeXRlcyApOworCisgICAgLy8gTmV4dCwgd2UgZmlsbCBvdXQgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yOgorICAgIG5TaXJTdGF0dXMgPSBsaW1Qb3B1bGF0ZU1hY0hlYWRlciggcE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUdNVF9BQ1RJT04sIHBlZXJNYWNBZGRyLHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKTsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwb3B1bGF0ZSB0aGUgYnVmZmVyIGRlc2NyaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvciBmb3IgYW4gQWRkIFRTIFJlcXVlc3QgKCVkKS5cbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcE1hY0hkciA9ICggdHBTaXJNYWNNZ210SGRyICkgcEZyYW1lOworCisgICAgI2lmIDAKKyAgICBjZmdMZW4gPSBTSVJfTUFDX0FERFJfTEVOR1RIOworICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0U3RyKCBwTWFjLCBXTklfQ0ZHX0JTU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0QU5JX1U4KiApcE1hY0hkci0+YnNzSWQsICZjZmdMZW4gKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gcmV0cmlldmUgV05JX0NGR19CU1NJRCB3aGlsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlIHNlbmRpbmcgYW4gQWRkIFRTIFJlcXVlc3QuXG4iKSApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICAKKyAgICBzaXJDb3B5TWFjQWRkcihwTWFjSGRyLT5ic3NJZCxwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyAgICAvLyBUaGF0IGRvbmUsIHBhY2sgdGhlIHN0cnVjdDoKKyAgICBpZiAoICEgcEFkZFRTLT53bWVUc3BlY1ByZXNlbnQgKQorICAgIHsKKyAgICAgICAgblN0YXR1cyA9IGRvdDExZlBhY2tBZGRUU1JlcXVlc3QoIHBNYWMsICZBZGRUU1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2sgYW4gQWRkIFRTIFJlcXVlc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQhCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuIEFkZCBUUyBSZXF1ZXN0ICgweCUwOHgpLlxuIikgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuU3RhdHVzID0gZG90MTFmUGFja1dNTUFkZFRTUmVxdWVzdCggcE1hYywgJldNTUFkZFRTUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXlsb2FkLCAmblBheWxvYWQgKTsKKyAgICAgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFjayBhIFdNTSBBZGQgVFMgUmVxdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdCAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgLy8gYWxsb2NhdGVkIQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIFdNTSBBZGQgVFMgUmVxdWVzdCAoMHglMDh4KS5cbiIpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQRUxPRzMobGltTG9nKCBwTWFjLCBMT0czLCBGTCgiU2VuZGluZyBhbiBBZGQgVFMgUmVxdWVzdCBmcmFtZSB0byAiKSApOworICAgIGxpbVByaW50TWFjQWRkciggcE1hYywgcGVlck1hY0FkZHIsIExPRzMgKTspCisKKyAgICBpZiggKCBTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgfHwgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSApIHx8CisgICAgICAgICAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisjZW5kaWYKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgIH0KKworICAgIC8vIFF1ZXVlIEFkZHRzIFJlc3BvbnNlIGZyYW1lIGluIGhpZ2ggcHJpb3JpdHkgV1EKKyAgICBoYWxzdGF0dXMgPSBoYWxUeEZyYW1lKCBwTWFjLCBwUGFja2V0LCAoIHRBTklfVTE2ICkgbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTklfVFhESVJfVE9EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LC8vU01BQ19TV0JEX1RYX1RJRF9NR01UX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltVHhDb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcgKTsKKyAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTICggaGFsc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCggIioqKiBDb3VsZCBub3Qgc2VuZCBhbiBBZGQgVFMgUmVxdWVzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoJVgpICoqKlxuIiApLCBoYWxzdGF0dXMgKTsKKyAgICAgICAgLy9Qa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sKKyAgICB9CisKK30gLy8gRW5kIGxpbVNlbmRBZGR0c1JlcUFjdGlvbkZyYW1lLgorCisvKiBBZGRlZCBBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCBmb3IgQlQtQU1QIFN1cHBvcnQgKi8KKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisKK3ZvaWQKK2xpbVNlbmRBc3NvY1JzcE1nbXRGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2ICAgICAgIHN0YXR1c0NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgICAgICAgYWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyICAgIHBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICAgICAgIHN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHBEcGhIYXNoTm9kZSAgcFN0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHREb3QxMWZBc3NvY1Jlc3BvbnNlIGZybTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICpwRnJhbWUsICptYWNBZGRyOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgIHBNYWNIZHI7CisgICAgdFNpclJldFN0YXR1cyAgICAgICAgblNpclN0YXR1czsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBsbGVNb2RlID0gMCwgZkFkZFRTLCBlZGNhSW5jbHVkZSA9IDA7CisgICAgdEhhbEJpdFZhbCAgICAgICAgICAgcW9zTW9kZSwgd21lTW9kZTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICBuUGF5bG9hZCwgbkJ5dGVzLCBuU3RhdHVzLCBjZmdMZW47CisgICAgdm9pZCAgICAgICAgICAgICAgICAqcFBhY2tldDsKKyAgICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxzdGF0dXM7CisgICAgdFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25QYXJhbXM7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgd3BzQXBFbmFibGU9MCwgdG1wOworICAgIHRBTklfVTggICAgICAgICAgICAgIHR4RmxhZyA9IDA7CisKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmZnJtLCBzaXplb2YoIGZybSApICk7CisKKyAgICBsaW1HZXRRb3NNb2RlKHBNYWMsICZxb3NNb2RlKTsKKyAgICBsaW1HZXRXbWVNb2RlKHBNYWMsICZ3bWVNb2RlKTsKKworICAgIC8vIEFuIEFkZCBUUyBJRSBpcyBhZGRlZCBvbmx5IGlmIHRoZSBBUCBzdXBwb3J0cyBpdCBhbmQgdGhlIHJlcXVlc3RpbmcKKyAgICAvLyBTVEEgc2VudCBhIHRyYWZmaWMgc3BlYy4KKyAgICBmQWRkVFMgPSAoIHFvc01vZGUgJiYgcFN0YSAmJiBwU3RhLT5xb3MuYWRkdHNQcmVzZW50ICkgPyAxIDogMDsKKworICAgIFBvcHVsYXRlRG90MTFmQ2FwYWJpbGl0aWVzKCBwTWFjLCAmZnJtLkNhcGFiaWxpdGllcywgcHNlc3Npb25FbnRyeSk7CisKKyAgICBmcm0uU3RhdHVzLnN0YXR1cyA9IHN0YXR1c0NvZGU7CisKKyAgICBmcm0uQUlELmFzc29jaWQgPSBhaWQgfCBMSU1fQUlEX01BU0s7CisKKyAgICBQb3B1bGF0ZURvdDExZlN1cHBSYXRlcyggcE1hYywgUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLCAmZnJtLlN1cHBSYXRlcyApOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsICh0QU5JX1UxNikgV05JX0NGR19XUFNfRU5BQkxFLCAmdG1wKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCJGYWlsZWQgdG8gY2ZnIGdldCBpZCAlZFxuIiwgV05JX0NGR19XUFNfRU5BQkxFICk7CisgICAgCisgICAgd3BzQXBFbmFibGUgPSB0bXAgJiBXTklfQ0ZHX1dQU19FTkFCTEVfQVA7CisKKyAgICBpZiAod3BzQXBFbmFibGUpCisgICAgeworICAgICAgICBQb3B1bGF0ZURvdDExZldzY0luQXNzb2NSZXMocE1hYywgJmZybS5Xc2NBc3NvY1Jlcyk7CisgICAgfQorCisgICAgUG9wdWxhdGVEb3QxMWZFeHRTdXBwUmF0ZXMoIHBNYWMsIFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZybS5FeHRTdXBwUmF0ZXMsIHBzZXNzaW9uRW50cnkgKTsKKworICAgIGlmICggTlVMTCAhPSBwU3RhICkKKyAgICB7CisgICAgICAgIGlmICggZUhBTF9TRVQgPT0gcW9zTW9kZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcFN0YS0+bGxlRW5hYmxlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGxlTW9kZSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKCAoICEgcFN0YS0+YW5pUGVlciApIHx8ICggISBQUk9QX0NBUEFCSUxJVFlfR0VUKCAxMUVRT1MsIHBTdGEtPnByb3BDYXBhYmlsaXR5ICkgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQb3B1bGF0ZURvdDExZkVEQ0FQYXJhbVNldCggcE1hYywgJmZybS5FRENBUGFyYW1TZXQsIHBzZXNzaW9uRW50cnkpOworCisvLyAgICAgICAgICAgICAgICAgICAgIEZyYW1lc1RvRG86Li4uCisvLyAgICAgICAgICAgICAgICAgICAgIGlmICggZkFkZFRTICkKKy8vICAgICAgICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEFmID0gcEJvZHk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAqcEFmKysgPSBTSVJfTUFDX1FPU19BQ1RJT05fRUlEOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgdGxlbjsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNpckFkZHRzUnNwRmlsbChwTWFjLCBwQWYsIHN0YXR1c0NvZGUsICZwU3RhLT5xb3MuYWRkdHMsIE5VTEwsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRsZW4sIGJ1ZkxlbiAtIGZyYW1lTGVuKTsKKy8vICAgICAgICAgICAgICAgICAgICAgfSAvLyBFbmQgaWYgb24gQWRkIFRTLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gRW5kIGlmIG9uIC4xMWUgZW5hYmxlZCBpbiAncFN0YScuCisgICAgICAgIH0gLy8gRW5kIGlmIG9uIFFPUyBNb2RlIG9uLgorCisgICAgICAgIGlmICggKCAhIGxsZU1vZGUgKSAmJiAoIGVIQUxfU0VUID09IHdtZU1vZGUgKSAmJiBwU3RhLT53bWVFbmFibGVkICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoICEgcFN0YS0+YW5pUGVlciApIHx8ICggISBQUk9QX0NBUEFCSUxJVFlfR0VUKCBXTUUsIHBTdGEtPnByb3BDYXBhYmlsaXR5ICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1QYXJhbXMoIHBNYWMsICZmcm0uV01NUGFyYW1zICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIHBTdGEtPndzbUVuYWJsZWQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1DYXBzKCZmcm0uV01NQ2FwcyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggcFN0YS0+YW5pUGVlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKCBsbGVNb2RlICYmIFBST1BfQ0FQQUJJTElUWV9HRVQoIDExRVFPUywgcFN0YS0+cHJvcENhcGFiaWxpdHkgKSApIHx8CisgICAgICAgICAgICAgICAgICggcFN0YS0+d21lRW5hYmxlZCAmJiBQUk9QX0NBUEFCSUxJVFlfR0VUKCBXTUUsIHBTdGEtPnByb3BDYXBhYmlsaXR5ICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZWRjYUluY2x1ZGUgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy8gRW5kIGlmIG9uIEFpcmdvIHBlZXIuCisKKyAgICAgICAgaWYgKCBwU3RhLT5tbG1TdGFDb250ZXh0Lmh0Q2FwYWJpbGl0eSAgJiYgCisgICAgICAgICAgICAgcE1hYy0+bGltLmh0Q2FwYWJpbGl0eSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmSFRDYXBzKCBwTWFjLCAmZnJtLkhUQ2FwcyApOworICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZIVEluZm8oIHBNYWMsICZmcm0uSFRJbmZvICk7CisgICAgICAgIH0KKyAgICB9IC8vIEVuZCBpZiBvbiBub24tTlVMTCAncFN0YScuCisKKworICAgIGlmKHBNYWMtPmxpbS5nTGltUHJvdGVjdGlvbkNvbnRyb2wgIT0gV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFKQorICAgICAgICBsaW1EZWNpZGVBcFByb3RlY3Rpb24ocE1hYywgcGVlck1hY0FkZHIsICZiZWFjb25QYXJhbXMpOworICAgIGxpbVVwZGF0ZVNob3J0UHJlYW1ibGUocE1hYywgcGVlck1hY0FkZHIsICZiZWFjb25QYXJhbXMpOworICAgIGxpbVVwZGF0ZVNob3J0U2xvdFRpbWUocE1hYywgcGVlck1hY0FkZHIsICZiZWFjb25QYXJhbXMpOworCisgICAgLy9TZW5kIG1lc3NhZ2UgdG8gSEFMIGFib3V0IGJlYWNvbiBwYXJhbWV0ZXIgY2hhbmdlLgorICAgIGlmKGJlYWNvblBhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcCkKKyAgICB7CisgICAgICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgIGxpbVNlbmRCZWFjb25QYXJhbXMocE1hYywgJmJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSApOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGlzIGZyYW1lOgorICAgIG5TdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRBc3NvY1Jlc3BvbnNlU2l6ZSggcE1hYywgJmZybSwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYW4gQXNzb2NpYXRpb24gUmVzcG9uc2UgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcGFja2VkIHNpemUgZm9yIGFuIEFzc29jaWF0aW9uIFJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG9uc2UgKDB4JTA4eCkuXG4iKSwgblN0YXR1cyApOworICAgIH0KKworICAgIG5CeXRlcyA9IHNpemVvZiggdFNpck1hY01nbXRIZHIgKSArIG5QYXlsb2FkOworCisgICAgaGFsc3RhdHVzID0gcGFsUGt0QWxsb2MoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0QU5JX1UxNiApbkJ5dGVzLCAoIHZvaWQqKiApICZwRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdm9pZCoqICkgJnBQYWNrZXQgKTsKKyAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTICggaGFsc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDYWxsIHRvIGJ1ZkFsbG9jIGZhaWxlZCBmb3IgUkUvQVNTT0MgUlNQLlxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUGFyYW5vaWE6CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgcEZyYW1lLCBuQnl0ZXMgKTsKKworICAgIC8vIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjoKKyAgICBuU2lyU3RhdHVzID0gbGltUG9wdWxhdGVNYWNIZWFkZXIoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIExJTV9BU1NPQyA9PSBzdWJUeXBlICkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0FTU09DX1JTUCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01HTVRfUkVBU1NPQ19SU1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyTWFjQWRkcik7CisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gblNpclN0YXR1cyApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcG9wdWxhdGUgdGhlIGJ1ZmZlciBkZXNjcmlwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3IgZm9yIGFuIEFzc29jaWF0aW9uIFJlc3BvbnNlICglZCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBNYWNIZHIgPSAoIHRwU2lyTWFjTWdtdEhkciApIHBGcmFtZTsKKworICAgCisgICAgY2ZnTGVuID0gU0lSX01BQ19BRERSX0xFTkdUSDsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSB3bGFuX2NmZ0dldFN0ciggcE1hYywgV05JX0NGR19CU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VOCogKXBNYWNIZHItPmJzc0lkLCAmY2ZnTGVuICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIHJldHJpZXZlIFdOSV9DRkdfQlNTSUQgd2hpbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZSBzZW5kaW5nIGFuIEFzc29jaWF0aW9uIFJlc3BvbnNlLlxuIikgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQhCisgICAgfQorICAKKyAgICBuU3RhdHVzID0gZG90MTFmUGFja0Fzc29jUmVzcG9uc2UoIHBNYWMsICZmcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWUgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2sgYW4gQXNzb2NpYXRpb24gUmVzcG9uc2UgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkIQorICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIFJlc3BvbnNlICgweCUwOHgpLlxuIikgKTsKKyAgICB9CisKKyAgICBtYWNBZGRyID0gcE1hY0hkci0+ZGE7CisKKyAgICBpZiAoc3ViVHlwZSA9PSBMSU1fQVNTT0MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgRkwoIioqKiBTZW5kaW5nIEFzc29jIFJlc3Agc3RhdHVzICVkIGFpZCAlZCB0byAiKSwKKyAgICAgICAgICAgICAgIHN0YXR1c0NvZGUsIGFpZCk7CisgICAgZWxzZQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgIEZMKCIqKiogU2VuZGluZyBSZUFzc29jIFJlc3Agc3RhdHVzICVkIGFpZCAlZCB0byAiKSwKKyAgICAgICAgICAgICAgIHN0YXR1c0NvZGUsIGFpZCk7CisgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBNYWNIZHItPmRhLCBMT0cxKTsKKworICAgIGlmKCAoIFNJUl9CQU5EXzVfR0haID09IGxpbUdldFJGQmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICB8fCAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0NMSUVOVF9NT0RFICkgfHwKKyAgICAgICAgICggcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfR09fTU9ERSkKKyNlbmRpZgorICAgICAgICAgKQorICAgIHsKKyAgICAgICAgdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisgICAgfQorCisgICAgLy8vIFF1ZXVlIEFzc29jaWF0aW9uIFJlc3BvbnNlIGZyYW1lIGluIGhpZ2ggcHJpb3JpdHkgV1EKKyAgICBoYWxzdGF0dXMgPSBoYWxUeEZyYW1lKCBwTWFjLCBwUGFja2V0LCAoIHRBTklfVTE2ICkgbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTklfVFhESVJfVE9EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LC8vU01BQ19TV0JEX1RYX1RJRF9NR01UX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltVHhDb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcgKTsKKyAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTICggaGFsc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgiKioqIENvdWxkIG5vdCBTZW5kIFJlL0Fzc29jUnNwLCByZXRDb2RlPSVYICoqKlxuIiksCisgICAgICAgICAgICAgICBuU2lyU3RhdHVzKTsKKworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAodm9pZCAqKSBwRnJhbWUsICh2b2lkICopIHBQYWNrZXQgKTsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgdGhlIEFOSSBwZWVyIHN0YXRpb24gY291bnQKKyAgICAvL0ZJWE1FX1BST1RFQ1RJT04gOiB0YWtlIGNhcmUgb2YgZGlmZmVyZW50IHR5cGUgb2Ygc3RhdGlvbgorICAgIC8vIGNvdW50ZXIgaW5zaWRlIHRoaXMgZnVuY3Rpb24uCisgICAgbGltVXRpbENvdW50U3RhQWRkKHBNYWMsIHBTdGEsIHBzZXNzaW9uRW50cnkpOworCit9IC8vIEVuZCBsaW1TZW5kQXNzb2NSc3BNZ210RnJhbWUuCisKKworI2VuZGlmICAvLyBBTklfUFJPRFVDVF9UWVBFX0FQCisKKwordm9pZAorbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgICAgICAgc3RhdHVzQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiAgICAgICBhaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgICAgcGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgICAgICAgc3ViVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cERwaEhhc2hOb2RlICBwU3RhLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgc3RhdGljIHREb3QxMWZBc3NvY1Jlc3BvbnNlIGZybTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICpwRnJhbWUsICptYWNBZGRyOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgIHBNYWNIZHI7CisgICAgdFNpclJldFN0YXR1cyAgICAgICAgblNpclN0YXR1czsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBsbGVNb2RlID0gMCwgZkFkZFRTLCBlZGNhSW5jbHVkZSA9IDA7CisgICAgdEhhbEJpdFZhbCAgICAgICAgICAgcW9zTW9kZSwgd21lTW9kZTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICBuUGF5bG9hZCwgbkJ5dGVzLCBuU3RhdHVzOworICAgIHZvaWQgICAgICAgICAgICAgICAgKnBQYWNrZXQ7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsc3RhdHVzOworICAgIHRVcGRhdGVCZWFjb25QYXJhbXMgYmVhY29uUGFyYW1zOworICAgIHRBTklfVTggICAgICAgICAgICAgIHR4RmxhZyA9IDA7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgYWRkbklFUHJlc2VudCA9IGZhbHNlOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGFkZG5JRUxlbj0wOworICAgIHRBTklfVTggICAgICAgICAgICAgIGFkZElFW1dOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9EQVRBX0xFTl07CisgICAgdHBTaXJBc3NvY1JlcSAgICAgICAgcEFzc29jUmVxID0gTlVMTDsgCisKKyAgICBpZihOVUxMID09IHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJmZybSwgc2l6ZW9mKCBmcm0gKSApOworCisgICAgbGltR2V0UW9zTW9kZShwc2Vzc2lvbkVudHJ5LCAmcW9zTW9kZSk7CisgICAgbGltR2V0V21lTW9kZShwc2Vzc2lvbkVudHJ5LCAmd21lTW9kZSk7CisKKyAgICAvLyBBbiBBZGQgVFMgSUUgaXMgYWRkZWQgb25seSBpZiB0aGUgQVAgc3VwcG9ydHMgaXQgYW5kIHRoZSByZXF1ZXN0aW5nCisgICAgLy8gU1RBIHNlbnQgYSB0cmFmZmljIHNwZWMuCisgICAgZkFkZFRTID0gKCBxb3NNb2RlICYmIHBTdGEgJiYgcFN0YS0+cW9zLmFkZHRzUHJlc2VudCApID8gMSA6IDA7CisKKyAgICBQb3B1bGF0ZURvdDExZkNhcGFiaWxpdGllcyggcE1hYywgJmZybS5DYXBhYmlsaXRpZXMsIHBzZXNzaW9uRW50cnkgKTsKKworICAgIGZybS5TdGF0dXMuc3RhdHVzID0gc3RhdHVzQ29kZTsKKworICAgIGZybS5BSUQuYXNzb2NpZCA9IGFpZCB8IExJTV9BSURfTUFTSzsKKworICAgIGlmICggTlVMTCA9PSBwU3RhICkKKyAgICB7CisgICAgICAgUG9wdWxhdGVEb3QxMWZTdXBwUmF0ZXMoIHBNYWMsIFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwgJmZybS5TdXBwUmF0ZXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgUG9wdWxhdGVEb3QxMWZFeHRTdXBwUmF0ZXMoIHBNYWMsIFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwgJmZybS5FeHRTdXBwUmF0ZXMsIHBzZXNzaW9uRW50cnkgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICBQb3B1bGF0ZURvdDExZkFzc29jUnNwUmF0ZXMoIHBNYWMsICZmcm0uU3VwcFJhdGVzLCAmZnJtLkV4dFN1cHBSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBwU3RhLT5zdXBwb3J0ZWRSYXRlcy5sbGJSYXRlcywgcFN0YS0+c3VwcG9ydGVkUmF0ZXMubGxhUmF0ZXMgKTsKKyAgICB9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgeworICAgICAgICBpZiggcFN0YSAhPSBOVUxMICYmIGVTSVJfU1VDQ0VTUyA9PSBzdGF0dXNDb2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgcEFzc29jUmVxID0gCisgICAgICAgICAgICAgICAgKHRwU2lyQXNzb2NSZXEpIHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW3BTdGEtPmFzc29jSWRdOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgIC8qIHBvcHVsYXRlIFAyUCBJRSBpbiBBc3NvY1JzcCB3aGVuIGFzc29jUmVxIGZyb20gdGhlIHBlZXIgaW5jbHVkZXMgUDJQIElFICovCisgICAgICAgICAgICBpZiggcEFzc29jUmVxICE9IE5VTEwgJiYgcEFzc29jUmVxLT5hZGRJRVByZXNlbnQgKSB7CisgICAgICAgICAgICAgICAgUG9wdWxhdGVEb3QxMUFzc29jUmVzUDJQSUUocE1hYywgJmZybS5QMlBBc3NvY1JlcywgcEFzc29jUmVxKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIE5VTEwgIT0gcFN0YSApCisgICAgeworICAgICAgICBpZiAoIGVIQUxfU0VUID09IHFvc01vZGUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBTdGEtPmxsZUVuYWJsZWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxsZU1vZGUgPSAxOworICAgICAgICAgICAgICAgIGlmICggKCAhIHBTdGEtPmFuaVBlZXIgKSB8fCAoICEgUFJPUF9DQVBBQklMSVRZX0dFVCggMTFFUU9TLCBwU3RhLT5wcm9wQ2FwYWJpbGl0eSApICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZFRENBUGFyYW1TZXQoIHBNYWMsICZmcm0uRURDQVBhcmFtU2V0LCBwc2Vzc2lvbkVudHJ5KTsKKworLy8gICAgICAgICAgICAgICAgICAgICBGcmFtZXNUb0RvOi4uLgorLy8gICAgICAgICAgICAgICAgICAgICBpZiAoIGZBZGRUUyApCisvLyAgICAgICAgICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBBZiA9IHBCb2R5OworLy8gICAgICAgICAgICAgICAgICAgICAgICAgKnBBZisrID0gU0lSX01BQ19RT1NfQUNUSU9OX0VJRDsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHRsZW47CisvLyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzaXJBZGR0c1JzcEZpbGwocE1hYywgcEFmLCBzdGF0dXNDb2RlLCAmcFN0YS0+cW9zLmFkZHRzLCBOVUxMLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bGVuLCBidWZMZW4gLSBmcmFtZUxlbik7CisvLyAgICAgICAgICAgICAgICAgICAgIH0gLy8gRW5kIGlmIG9uIEFkZCBUUy4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIEVuZCBpZiBvbiAuMTFlIGVuYWJsZWQgaW4gJ3BTdGEnLgorICAgICAgICB9IC8vIEVuZCBpZiBvbiBRT1MgTW9kZSBvbi4KKworICAgICAgICBpZiAoICggISBsbGVNb2RlICkgJiYgKCBlSEFMX1NFVCA9PSB3bWVNb2RlICkgJiYgcFN0YS0+d21lRW5hYmxlZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKCAhIHBTdGEtPmFuaVBlZXIgKSB8fCAoICEgUFJPUF9DQVBBQklMSVRZX0dFVCggV01FLCBwU3RhLT5wcm9wQ2FwYWJpbGl0eSApICkgKQorICAgICAgICAgICAgeworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmV01NUGFyYW1zKCBwTWFjLCAmZnJtLldNTVBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisjZWxzZQorICAgICAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmV01NUGFyYW1zKCBwTWFjLCAmZnJtLldNTVBhcmFtcyApOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZiAoIHBTdGEtPndzbUVuYWJsZWQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1DYXBzKCZmcm0uV01NQ2FwcyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggcFN0YS0+YW5pUGVlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKCBsbGVNb2RlICYmIFBST1BfQ0FQQUJJTElUWV9HRVQoIDExRVFPUywgcFN0YS0+cHJvcENhcGFiaWxpdHkgKSApIHx8CisgICAgICAgICAgICAgICAgICggcFN0YS0+d21lRW5hYmxlZCAmJiBQUk9QX0NBUEFCSUxJVFlfR0VUKCBXTUUsIHBTdGEtPnByb3BDYXBhYmlsaXR5ICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZWRjYUluY2x1ZGUgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy8gRW5kIGlmIG9uIEFpcmdvIHBlZXIuCisKKyAgICAgICAgaWYgKCBwU3RhLT5tbG1TdGFDb250ZXh0Lmh0Q2FwYWJpbGl0eSAgJiYgCisgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5ICkKKyAgICAgICAgeworICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZIVENhcHMoIHBNYWMsICZmcm0uSFRDYXBzICk7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZIVEluZm8oIHBNYWMsICZmcm0uSFRJbmZvLCBwc2Vzc2lvbkVudHJ5ICk7CisjZWxzZQorICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZIVEluZm8oIHBNYWMsICZmcm0uSFRJbmZvICk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0gLy8gRW5kIGlmIG9uIG5vbi1OVUxMICdwU3RhJy4KKworCisgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmYmVhY29uUGFyYW1zLCBzaXplb2YoIHRVcGRhdGVCZWFjb25QYXJhbXMpICk7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYoIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICl7CisgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmdMaW1Qcm90ZWN0aW9uQ29udHJvbCAhPSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0RJU0FCTEUpCisgICAgICAgIGxpbURlY2lkZUFwUHJvdGVjdGlvbihwTWFjLCBwZWVyTWFjQWRkciwgJmJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisjZW5kaWYKKworICAgIGxpbVVwZGF0ZVNob3J0UHJlYW1ibGUocE1hYywgcGVlck1hY0FkZHIsICZiZWFjb25QYXJhbXMsIHBzZXNzaW9uRW50cnkpOworICAgIGxpbVVwZGF0ZVNob3J0U2xvdFRpbWUocE1hYywgcGVlck1hY0FkZHIsICZiZWFjb25QYXJhbXMsIHBzZXNzaW9uRW50cnkpOworCisgICAgYmVhY29uUGFyYW1zLmJzc0lkeCA9IHBzZXNzaW9uRW50cnktPmJzc0lkeDsKKworICAgIC8vU2VuZCBtZXNzYWdlIHRvIEhBTCBhYm91dCBiZWFjb24gcGFyYW1ldGVyIGNoYW5nZS4KKyAgICBpZihiZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXApCisgICAgeworICAgICAgICBzY2hTZXRGaXhlZEJlYWNvbkZpZWxkcyhwTWFjLHBzZXNzaW9uRW50cnkpOworICAgICAgICBsaW1TZW5kQmVhY29uUGFyYW1zKHBNYWMsICZiZWFjb25QYXJhbXMsIHBzZXNzaW9uRW50cnkgKTsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhpcyBmcmFtZToKKyAgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkQXNzb2NSZXNwb25zZVNpemUoIHBNYWMsICZmcm0sICZuUGF5bG9hZCApOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGFuIEFzc29jaWF0aW9uIFJlc3BvbnNlICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhbiBBc3NvY2lhdGlvbiBSZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BvbnNlICgweCUwOHgpLlxuIiksIG5TdGF0dXMgKTsKKyAgICB9CisKKyAgICBuQnl0ZXMgPSBzaXplb2YoIHRTaXJNYWNNZ210SGRyICkgKyBuUGF5bG9hZDsKKworICAgIGlmICggcEFzc29jUmVxICE9IE5VTEwgKSAKKyAgICB7CisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBRywgCisgICAgICAgICAgICAgICAgICAgICZhZGRuSUVQcmVzZW50KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGdldCBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfRkxBRyIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZGRuSUVQcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICAvL0Fzc29jIHJzcCBJRSBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldFN0ckxlbihwTWFjLCBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZhZGRuSUVMZW4pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBnZXQgV05JX0NGR19BU1NPQ19SU1BfQURETklFX0RBVEEgbGVuZ3RoIikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFkZG5JRUxlbiA8PSBXTklfQ0ZHX0FTU09DX1JTUF9BREROSUVfREFUQV9MRU4gJiYgYWRkbklFTGVuICYmCisgICAgICAgICAgICAgICAgICAgIChuQnl0ZXMgKyBhZGRuSUVMZW4pIDw9IFNJUl9NQVhfUEFDS0VUX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsIFdOSV9DRkdfQVNTT0NfUlNQX0FERE5JRV9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRJRVswXSwgJmFkZG5JRUxlbikgPT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbkJ5dGVzID0gbkJ5dGVzICsgYWRkbklFTGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGhhbHN0YXR1cyA9IHBhbFBrdEFsbG9jKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VMTYgKW5CeXRlcywgKCB2b2lkKiogKSAmcEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHZvaWQqKiApICZwUGFja2V0ICk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ2FsbCB0byBidWZBbGxvYyBmYWlsZWQgZm9yIFJFL0FTU09DIFJTUC5cbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFBhcmFub2lhOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgICAvLyBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6CisgICAgblNpclN0YXR1cyA9IGxpbVBvcHVsYXRlTWFjSGVhZGVyKCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUdNVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBMSU1fQVNTT0MgPT0gc3ViVHlwZSApID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUdNVF9BU1NPQ19SU1AgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX1JFQVNTT0NfUlNQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyTWFjQWRkcixwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gblNpclN0YXR1cyApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcG9wdWxhdGUgdGhlIGJ1ZmZlciBkZXNjcmlwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3IgZm9yIGFuIEFzc29jaWF0aW9uIFJlc3BvbnNlICglZCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBNYWNIZHIgPSAoIHRwU2lyTWFjTWdtdEhkciApIHBGcmFtZTsKKworICAgICNpZiAwCisgICAgY2ZnTGVuID0gU0lSX01BQ19BRERSX0xFTkdUSDsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBjZmdHZXRTdHIoIHBNYWMsIFdOSV9DRkdfQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTgqIClwTWFjSGRyLT5ic3NJZCwgJmNmZ0xlbiApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byByZXRyaWV2ZSBXTklfQ0ZHX0JTU0lEIHdoaWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImUgc2VuZGluZyBhbiBBc3NvY2lhdGlvbiBSZXNwb25zZS5cbiIpICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkIQorICAgIH0KKyAgICAjZW5kaWYgLy9UTyBTVVBQT1JUIEJULUFNUAorICAgIHNpckNvcHlNYWNBZGRyKHBNYWNIZHItPmJzc0lkLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworICAgIG5TdGF0dXMgPSBkb3QxMWZQYWNrQXNzb2NSZXNwb25zZSggcE1hYywgJmZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZSArIHNpemVvZiggdFNpck1hY01nbXRIZHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXlsb2FkLCAmblBheWxvYWQgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFjayBhbiBBc3NvY2lhdGlvbiBSZXNwb25zZSAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQhCisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gUmVzcG9uc2UgKDB4JTA4eCkuXG4iKSApOworICAgIH0KKworICAgIG1hY0FkZHIgPSBwTWFjSGRyLT5kYTsKKworICAgIGlmIChzdWJUeXBlID09IExJTV9BU1NPQykKKyAgICB7CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgIEZMKCIqKiogU2VuZGluZyBBc3NvYyBSZXNwIHN0YXR1cyAlZCBhaWQgJWQgdG8gIiksCisgICAgICAgICAgICAgICBzdGF0dXNDb2RlLCBhaWQpOykKKyAgICB9ICAgIAorICAgIGVsc2V7CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgIEZMKCIqKiogU2VuZGluZyBSZUFzc29jIFJlc3Agc3RhdHVzICVkIGFpZCAlZCB0byAiKSwKKyAgICAgICAgICAgICAgIHN0YXR1c0NvZGUsIGFpZCk7KQorICAgIH0KKyAgICBQRUxPRzEobGltUHJpbnRNYWNBZGRyKHBNYWMsIHBNYWNIZHItPmRhLCBMT0cxKTspCisKKyAgICBpZiAoIGFkZG5JRVByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKHBhbENvcHlNZW1vcnkgKCBwTWFjLT5oSGRkLCBwRnJhbWUrc2l6ZW9mKHRTaXJNYWNNZ210SGRyKStuUGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRJRVswXSwgYWRkbklFTGVuICkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkFkZGl0aW9uYWwgQXNzb2MgSUVzIHJlcXVlc3QgZmFpbGVkIHdoaWxlIEFwcGVuZGluZzogJXhcbiIpLGhhbHN0YXR1cyk7CisgICAgICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggKCBTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgfHwgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSApIHx8CisgICAgICAgICAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisjZW5kaWYKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgIH0KKworICAgIC8vLyBRdWV1ZSBBc3NvY2lhdGlvbiBSZXNwb25zZSBmcmFtZSBpbiBoaWdoIHByaW9yaXR5IFdRCisgICAgaGFsc3RhdHVzID0gaGFsVHhGcmFtZSggcE1hYywgcFBhY2tldCwgKCB0QU5JX1UxNiApIG5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX1RYRElSX1RPRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywvL1NNQUNfU1dCRF9UWF9USURfTUdNVF9ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVR4Q29tcGxldGUsIHBGcmFtZSwgdHhGbGFnICk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoIioqKiBDb3VsZCBub3QgU2VuZCBSZS9Bc3NvY1JzcCwgcmV0Q29kZT0lWCAqKipcbiIpLAorICAgICAgICAgICAgICAgblNpclN0YXR1cyk7CisKKyAgICAgICAgLy9Qa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgdGhlIEFOSSBwZWVyIHN0YXRpb24gY291bnQKKyAgICAvL0ZJWE1FX1BST1RFQ1RJT04gOiB0YWtlIGNhcmUgb2YgZGlmZmVyZW50IHR5cGUgb2Ygc3RhdGlvbgorICAgIC8vIGNvdW50ZXIgaW5zaWRlIHRoaXMgZnVuY3Rpb24uCisgICAgbGltVXRpbENvdW50U3RhQWRkKHBNYWMsIHBTdGEsIHBzZXNzaW9uRW50cnkpOworCit9IC8vIEVuZCBsaW1TZW5kQXNzb2NSc3BNZ210RnJhbWUuCisKKworIAordm9pZAorbGltU2VuZEFkZHRzUnNwQWN0aW9uRnJhbWUodHBBbmlTaXJHbG9iYWwgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciAgICAgICAgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2ICAgICAgICAgICBuU3RhdHVzQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJBZGR0c1JlcUluZm8gICpwQWRkVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjU2NoZWR1bGVJRSAqcFNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gICAgICAgIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAqcEZyYW1lOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgIHBNYWNIZHI7CisgICAgdERvdDExZkFkZFRTUmVzcG9uc2UgICAgQWRkVFNSc3A7CisgICAgdERvdDExZldNTUFkZFRTUmVzcG9uc2UgV01NQWRkVFNSc3A7CisgICAgdFNpclJldFN0YXR1cyAgICAgICAgICAgblNpclN0YXR1czsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICBpLCBuQnl0ZXMsIG5QYXlsb2FkLCBuU3RhdHVzOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKnBQYWNrZXQ7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICAgICAgaGFsc3RhdHVzOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHR4RmxhZyA9IDA7CisKKyAgICBpZihOVUxMID09IHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCAhIHBBZGRUUy0+d21lVHNwZWNQcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZBZGRUU1JzcCwgc2l6ZW9mKCBBZGRUU1JzcCApICk7CisKKyAgICAgICAgQWRkVFNSc3AuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9RT1NfTUdNVDsKKyAgICAgICAgQWRkVFNSc3AuQWN0aW9uLmFjdGlvbiAgICAgPSBTSVJfTUFDX1FPU19BRERfVFNfUlNQOworICAgICAgICBBZGRUU1JzcC5EaWFsb2dUb2tlbi50b2tlbiA9IHBBZGRUUy0+ZGlhbG9nVG9rZW47CisgICAgICAgIEFkZFRTUnNwLlN0YXR1cy5zdGF0dXMgICAgID0gblN0YXR1c0NvZGU7CisKKyAgICAgICAgLy8gVGhlIFRzRGVsYXkgaW5mb3JtYXRpb24gZWxlbWVudCBpcyBvbmx5IGZpbGxlZCBpbiBmb3IgYSBzcGVjaWZpYworICAgICAgICAvLyBzdGF0dXMgY29kZToKKyAgICAgICAgaWYgKCBlU0lSX01BQ19UU19OT1RfQ1JFQVRFRF9TVEFUVVMgPT0gblN0YXR1c0NvZGUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBBZGRUUy0+d3NtVHNwZWNQcmVzZW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGRUU1JzcC5XTU1UU0RlbGF5LnZlcnNpb24gPSAxOworICAgICAgICAgICAgICAgIEFkZFRTUnNwLldNTVRTRGVsYXkuZGVsYXkgICA9IDEwOworICAgICAgICAgICAgICAgIEFkZFRTUnNwLldNTVRTRGVsYXkucHJlc2VudCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkVFNSc3AuVFNEZWxheS5kZWxheSAgID0gMTA7CisgICAgICAgICAgICAgICAgQWRkVFNSc3AuVFNEZWxheS5wcmVzZW50ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggcEFkZFRTLT53c21Uc3BlY1ByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZldNTVRTUEVDKCAmcEFkZFRTLT50c3BlYywgJkFkZFRTUnNwLldNTVRTUEVDICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZlRTUEVDKCAmcEFkZFRTLT50c3BlYywgJkFkZFRTUnNwLlRTUEVDICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBBZGRUUy0+d3NtVHNwZWNQcmVzZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgQWRkVFNSc3AubnVtX1dNTVRDTEFTID0gMDsKKyAgICAgICAgICAgIEFkZFRTUnNwLm51bV9UQ0xBUyA9IHBBZGRUUy0+bnVtVGNsYXM7CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IEFkZFRTUnNwLm51bV9UQ0xBUzsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmVENMQVMoIHBNYWMsICZwQWRkVFMtPnRjbGFzSW5mb1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRkVFNSc3AuVENMQVNbaV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkZFRTUnNwLm51bV9UQ0xBUyA9IDA7CisgICAgICAgICAgICBBZGRUU1JzcC5udW1fV01NVENMQVMgPSBwQWRkVFMtPm51bVRjbGFzOworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBBZGRUU1JzcC5udW1fV01NVENMQVM7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQb3B1bGF0ZURvdDExZldNTVRDTEFTKCBwTWFjLCAmcEFkZFRTLT50Y2xhc0luZm9baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZFRTUnNwLldNTVRDTEFTW2ldICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBBZGRUUy0+dGNsYXNQcm9jUHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcEFkZFRTLT53c21Uc3BlY1ByZXNlbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZFRTUnNwLldNTVRDTEFTUFJPQy52ZXJzaW9uICAgID0gMTsKKyAgICAgICAgICAgICAgICBBZGRUU1JzcC5XTU1UQ0xBU1BST0MucHJvY2Vzc2luZyA9IHBBZGRUUy0+dGNsYXNQcm9jOworICAgICAgICAgICAgICAgIEFkZFRTUnNwLldNTVRDTEFTUFJPQy5wcmVzZW50ICAgID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGRUU1JzcC5UQ0xBU1NQUk9DLnByb2Nlc3NpbmcgPSBwQWRkVFMtPnRjbGFzUHJvYzsKKyAgICAgICAgICAgICAgICBBZGRUU1JzcC5UQ0xBU1NQUk9DLnByZXNlbnQgICAgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc2NoZWR1bGUgZWxlbWVudCBpcyBpbmNsdWRlZCBvbmx5IGlmIHJlcXVlc3RlZCBpbiB0aGUgdHNwZWMgYW5kIHdlIGFyZQorICAgICAgICAvLyB1c2luZyBoY2NhIChvciBib3RoIGVkY2EgYW5kIGhjY2EpCisgICAgICAgIC8vIDExZS1EOC4wIGlzIGluY29uc2lzdGVudCBvbiB3aGV0aGVyIHRoZSBzY2hlZHVsZSBlbGVtZW50IGlzIGluY2x1ZGVkCisgICAgICAgIC8vIGJhc2VkIG9uIHRzcGVjIHNjaGVkdWxlIGJpdCBvciBub3QuIFNlYyA3LjQuMi4yLiBzYXlzIG9uZSB0aGluZyBidXQKKyAgICAgICAgLy8gcGcgNDYsIGxpbmUgMTctMTggc2F5cyBzb21ldGhpbmcgZWxzZS4gU28ganVzdCBpbmNsdWRlIGl0IGFuZCBsZXQgdGhlCisgICAgICAgIC8vIHN0YSBmaWd1cmUgaXQgb3V0CisgICAgICAgIGlmICgocFNjaGVkdWxlICE9IE5VTEwpICYmCisgICAgICAgICAgICAoKHBBZGRUUy0+dHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID09IFNJUl9NQUNfQUNDRVNTUE9MSUNZX0hDQ0EpIHx8CisgICAgICAgICAgICAgKHBBZGRUUy0+dHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID09IFNJUl9NQUNfQUNDRVNTUE9MSUNZX0JPVEgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwQWRkVFMtPndzbVRzcGVjUHJlc2VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1TY2hlZHVsZSggcFNjaGVkdWxlLCAmQWRkVFNSc3AuV01NU2NoZWR1bGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQb3B1bGF0ZURvdDExZlNjaGVkdWxlKCBwU2NoZWR1bGUsICZBZGRUU1JzcC5TY2hlZHVsZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgblN0YXR1cyA9IGRvdDExZkdldFBhY2tlZEFkZFRTUmVzcG9uc2VTaXplKCBwTWFjLCAmQWRkVFNSc3AsICZuUGF5bG9hZCApOworICAgICAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInplIGZvciBhbiBBZGQgVFMgUmVzcG9uc2UgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICAgICAgLy8gV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOgorICAgICAgICAgICAgblBheWxvYWQgPSBzaXplb2YoIHREb3QxMWZBZGRUU1Jlc3BvbnNlICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbmd0aGUgcGFja2VkIHNpemUgZm9yIGFuIEFkZCBUUyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSZXNwb25zZSAoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJldNTUFkZFRTUnNwLCBzaXplb2YoIFdNTUFkZFRTUnNwICkgKTsKKworICAgICAgICBXTU1BZGRUU1JzcC5DYXRlZ29yeS5jYXRlZ29yeSA9IFNJUl9NQUNfQUNUSU9OX1dNRTsKKyAgICAgICAgV01NQWRkVFNSc3AuQWN0aW9uLmFjdGlvbiAgICAgPSBTSVJfTUFDX1FPU19BRERfVFNfUlNQOworICAgICAgICBXTU1BZGRUU1JzcC5EaWFsb2dUb2tlbi50b2tlbiA9IHBBZGRUUy0+ZGlhbG9nVG9rZW47CisgICAgICAgIFdNTUFkZFRTUnNwLlN0YXR1c0NvZGUuc3RhdHVzQ29kZSA9ICh0QU5JX1U4KW5TdGF0dXNDb2RlOworCisgICAgICAgIFBvcHVsYXRlRG90MTFmV01NVFNQRUMoICZwQWRkVFMtPnRzcGVjLCAmV01NQWRkVFNSc3AuV01NVFNQRUMgKTsKKworICAgICAgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkV01NQWRkVFNSZXNwb25zZVNpemUoIHBNYWMsICZXTU1BZGRUU1JzcCwgJm5QYXlsb2FkICk7CisgICAgICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiemUgZm9yIGEgV01NIEFkZCBUUyBSZXNwb25zZSAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgICAgICAvLyBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86CisgICAgICAgICAgICBuUGF5bG9hZCA9IHNpemVvZiggdERvdDExZldNTUFkZFRTUmVzcG9uc2UgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGluZ3RoZSBwYWNrZWQgc2l6ZSBmb3IgYSBXTU0gQWRkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFMgUmVzcG9uc2UgKDB4JTA4eCkuXG4iKSwgblN0YXR1cyApOworICAgICAgICB9CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICk7CisKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGFuIEFkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkIFRTIFJlc3BvbnNlLlxuIiksIG5CeXRlcyApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUGFyYW5vaWE6CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgcEZyYW1lLCBuQnl0ZXMgKTsKKworICAgIC8vIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjoKKyAgICBuU2lyU3RhdHVzID0gbGltUG9wdWxhdGVNYWNIZWFkZXIoIHBNYWMsIHBGcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01HTVRfQUNUSU9OLCBwZWVyLHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKTsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwb3B1bGF0ZSB0aGUgYnVmZmVyIGRlc2NyaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvciBmb3IgYW4gQWRkIFRTIFJlc3BvbnNlICglZCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkIQorICAgIH0KKworICAgIHBNYWNIZHIgPSAoIHRwU2lyTWFjTWdtdEhkciApIHBGcmFtZTsKKworICAgICAKKyAgICAjaWYgMAorICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0U3RyKCBwTWFjLCBXTklfQ0ZHX0JTU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0QU5JX1U4KiApcE1hY0hkci0+YnNzSWQsICZjZmdMZW4gKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gcmV0cmlldmUgV05JX0NGR19CU1NJRCB3aGlsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlIHNlbmRpbmcgYW4gQWRkIFRTIFJlc3BvbnNlLlxuIikgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQhCisgICAgfQorICAgICNlbmRpZiAvL1RPIFNVUFBPUlQgQlQtQU1QCisgICAgc2lyQ29weU1hY0FkZHIocE1hY0hkci0+YnNzSWQscHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisgICAgLy8gVGhhdCBkb25lLCBwYWNrIHRoZSBzdHJ1Y3Q6CisgICAgaWYgKCAhIHBBZGRUUy0+d21lVHNwZWNQcmVzZW50ICkKKyAgICB7CisgICAgICAgIG5TdGF0dXMgPSBkb3QxMWZQYWNrQWRkVFNSZXNwb25zZSggcE1hYywgJkFkZFRTUnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZSArIHNpemVvZiggdFNpck1hY01nbXRIZHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2sgYW4gQWRkIFRTIFJlc3BvbnNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gQWRkIFRTIFJlc3BvbnNlICgweCUwOHgpLlxuIikgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuU3RhdHVzID0gZG90MTFmUGFja1dNTUFkZFRTUmVzcG9uc2UoIHBNYWMsICZXTU1BZGRUU1JzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWUgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBheWxvYWQsICZuUGF5bG9hZCApOworICAgICAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwYWNrIGEgV01NIEFkZCBUUyBSZXNwb25zZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgV01NIEFkZCBUUyBSZXNwb25zZSAoMHglMDh4KS5cbiIpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQRUxPRzEobGltTG9nKCBwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBhbiBBZGQgVFMgUmVzcG9uc2UgKHN0YXR1cyAlZCkgdG8gIiksCisgICAgICAgICAgICBuU3RhdHVzQ29kZSApOworICAgIGxpbVByaW50TWFjQWRkciggcE1hYywgcE1hY0hkci0+ZGEsIExPRzEgKTspCisKKyAgICBpZiggKCBTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgfHwgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSApIHx8CisgICAgICAgICAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisjZW5kaWYKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgIH0KKworICAgIC8vIFF1ZXVlIHRoZSBmcmFtZSBpbiBoaWdoIHByaW9yaXR5IFdROgorICAgIGhhbHN0YXR1cyA9IGhhbFR4RnJhbWUoIHBNYWMsIHBQYWNrZXQsICggdEFOSV9VMTYgKSBuQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsLy9TTUFDX1NXQkRfVFhfVElEX01HTVRfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UeENvbXBsZXRlLCBwRnJhbWUsIHR4RmxhZyApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gc2VuZCBBZGQgVFMgUmVzcG9uc2UgKCVYKSFcbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgLy9Qa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sKKyAgICB9CisKK30gLy8gRW5kIGxpbVNlbmRBZGR0c1JzcEFjdGlvbkZyYW1lLgorCit2b2lkCitsaW1TZW5kRGVsdHNSZXFBY3Rpb25GcmFtZSh0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyICBwZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgd21tVHNwZWNQcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY1RTSW5mbyAgKnBUc2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjVHNwZWNJRSAgKnBUc3BlY0llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgKnBGcmFtZTsKKyAgICB0cFNpck1hY01nbXRIZHIgIHBNYWNIZHI7CisgICAgdERvdDExZkRlbFRTICAgICBEZWxUUzsKKyAgICB0RG90MTFmV01NRGVsVFMgIFdNTURlbFRTOworICAgIHRTaXJSZXRTdGF0dXMgICAgblNpclN0YXR1czsKKyAgICB0QU5JX1UzMiAgICAgICAgIG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXM7CisgICAgdm9pZCAgICAgICAgICAgICpwUGFja2V0OworICAgIGVIYWxTdGF0dXMgICAgICAgaGFsc3RhdHVzOworICAgIHRBTklfVTggICAgICAgICAgdHhGbGFnID0gMDsKKworICAgIGlmKE5VTEwgPT0gcHNlc3Npb25FbnRyeSkKKyAgICB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICEgd21tVHNwZWNQcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZEZWxUUywgc2l6ZW9mKCBEZWxUUyApICk7CisKKyAgICAgICAgRGVsVFMuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9RT1NfTUdNVDsKKyAgICAgICAgRGVsVFMuQWN0aW9uLmFjdGlvbiAgICAgPSBTSVJfTUFDX1FPU19ERUxfVFNfUkVROworICAgICAgICBQb3B1bGF0ZURvdDExZlRTSW5mbyggcFRzaW5mbywgJkRlbFRTLlRTSW5mbyApOworCisgICAgICAgIG5TdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWREZWxUU1NpemUoIHBNYWMsICZEZWxUUywgJm5QYXlsb2FkICk7CisgICAgICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiemUgZm9yIGEgRGVsIFRTICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgICAgIC8vIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzoKKyAgICAgICAgICAgIG5QYXlsb2FkID0gc2l6ZW9mKCB0RG90MTFmRGVsVFMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGluZyB0aGUgcGFja2VkIHNpemUgZm9yIGEgRGVsIFRTIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICgweCUwOHgpLlxuIiksIG5TdGF0dXMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmV01NRGVsVFMsIHNpemVvZiggV01NRGVsVFMgKSApOworCisgICAgICAgIFdNTURlbFRTLkNhdGVnb3J5LmNhdGVnb3J5ID0gU0lSX01BQ19BQ1RJT05fV01FOworICAgICAgICBXTU1EZWxUUy5BY3Rpb24uYWN0aW9uICAgICA9IFNJUl9NQUNfUU9TX0RFTF9UU19SRVE7CisgICAgICAgIFdNTURlbFRTLkRpYWxvZ1Rva2VuLnRva2VuID0gMDsKKyAgICAgICAgV01NRGVsVFMuU3RhdHVzQ29kZS5zdGF0dXNDb2RlID0gMDsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1UU1BFQyggcFRzcGVjSWUsICZXTU1EZWxUUy5XTU1UU1BFQyApOworICAgICAgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkV01NRGVsVFNTaXplKCBwTWFjLCAmV01NRGVsVFMsICZuUGF5bG9hZCApOworICAgICAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInplIGZvciBhIFdNTSBEZWwgVFMgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICAgICAgLy8gV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOgorICAgICAgICAgICAgblBheWxvYWQgPSBzaXplb2YoIHREb3QxMWZEZWxUUyApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW5nIHRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBXTU0gRGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsIFRTICgweCUwOHgpLlxuIiksIG5TdGF0dXMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApOworCisgICAgaGFsc3RhdHVzID0gcGFsUGt0QWxsb2MoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgKCB0QU5JX1UxNiApbkJ5dGVzLCAoIHZvaWQqKiApICZwRnJhbWUsICggdm9pZCoqICkgJnBQYWNrZXQgKTsKKyAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTICggaGFsc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhbiBBZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZCBUUyBSZXNwb25zZS5cbiIpLCBuQnl0ZXMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFBhcmFub2lhOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgICAvLyBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6CisgICAgblNpclN0YXR1cyA9IGxpbVBvcHVsYXRlTWFjSGVhZGVyKCBwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0FDVElPTiwgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworICAgIGlmICggZVNJUl9TVUNDRVNTICE9IG5TaXJTdGF0dXMgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBvcHVsYXRlIHRoZSBidWZmZXIgZGVzY3JpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9yIGZvciBhbiBBZGQgVFMgUmVzcG9uc2UgKCVkKS5cbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQhCisgICAgfQorCisgICAgcE1hY0hkciA9ICggdHBTaXJNYWNNZ210SGRyICkgcEZyYW1lOworCisgICAgI2lmIDAKKworICAgIGNmZ0xlbiA9IFNJUl9NQUNfQUREUl9MRU5HVEg7CisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gd2xhbl9jZmdHZXRTdHIoIHBNYWMsIFdOSV9DRkdfQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTgqIClwTWFjSGRyLT5ic3NJZCwgJmNmZ0xlbiApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byByZXRyaWV2ZSBXTklfQ0ZHX0JTU0lEIHdoaWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImUgc2VuZGluZyBhbiBBZGQgVFMgUmVzcG9uc2UuXG4iKSApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZCEKKyAgICB9CisgICAgI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICBzaXJDb3B5TWFjQWRkcihwTWFjSGRyLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQpOworICAgIAorICAgIC8vIFRoYXQgZG9uZSwgcGFjayB0aGUgc3RydWN0OgorICAgIGlmICggIXdtbVRzcGVjUHJlc2VudCApCisgICAgeworICAgICAgICBuU3RhdHVzID0gZG90MTFmUGFja0RlbFRTKCBwTWFjLCAmRGVsVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZSArIHNpemVvZiggdFNpck1hY01nbXRIZHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBheWxvYWQsICZuUGF5bG9hZCApOworICAgICAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwYWNrIGEgRGVsIFRTIGZyYW1lICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgLy8gYWxsb2NhdGVkIQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIERlbCBUUyBmcmFtZSAoMHglMDh4KS5cbiIpICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgblN0YXR1cyA9IGRvdDExZlBhY2tXTU1EZWxUUyggcE1hYywgJldNTURlbFRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWUgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXlsb2FkLCAmblBheWxvYWQgKTsKKyAgICAgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFjayBhIFdNTSBEZWwgVFMgZnJhbWUgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQhCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgV01NIERlbCBUUyBmcmFtZSAoMHglMDh4KS5cbiIpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTZW5kaW5nIERFTFRTIFJFUSAoc2l6ZSAlZCkgdG8gIiksIG5CeXRlcyk7CisgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBNYWNIZHItPmRhLCBMT0cxKTspCisKKyAgICBpZiggKCBTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgfHwgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSApIHx8CisgICAgICAgICAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisjZW5kaWYKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgIH0KKworICAgIGhhbHN0YXR1cyA9IGhhbFR4RnJhbWUoIHBNYWMsIHBQYWNrZXQsICggdEFOSV9VMTYgKSBuQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsLy9TTUFDX1NXQkRfVFhfVElEX01HTVRfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UeENvbXBsZXRlLCBwRnJhbWUsIHR4RmxhZyApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gc2VuZCBEZWwgVFMgKCVYKSFcbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgLy9Qa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sKKyAgICB9CisKK30gLy8gRW5kIGxpbVNlbmREZWx0c1JlcUFjdGlvbkZyYW1lLgorCit2b2lkCitsaW1TZW5kQXNzb2NSZXFNZ210RnJhbWUodHBBbmlTaXJHbG9iYWwgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRMaW1NbG1Bc3NvY1JlcSAqcE1sbUFzc29jUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdERvdDExZkFzc29jUmVxdWVzdCBmcm07CisgICAgdEFOSV9VMTYgICAgICAgICAgICBjYXBzOworICAgIHRBTklfVTggICAgICAgICAgICAqcEZyYW1lOworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgblNpclN0YXR1czsKKyAgICB0TGltTWxtQXNzb2NDbmYgICAgIG1sbUFzc29jQ25mOworICAgIHRBTklfVTMyICAgICAgICAgICAgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1czsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIGZRb3NFbmFibGVkLCBmV21lRW5hYmxlZCwgZldzbUVuYWJsZWQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICpwUGFja2V0OworICAgIGVIYWxTdGF0dXMgICAgICAgICAgaGFsc3RhdHVzOworICAgIHRBTklfVTE2ICAgICAgICAgICAgbkFkZElFTGVuOyAKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICpwQWRkSUU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAqd3BzSWUgPSBOVUxMOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIHRBTklfVTggICAgICAgICAgICAgUG93ZXJDYXBzUG9wdWxhdGVkID0gRkFMU0U7CisjZW5kaWYKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHR4RmxhZyA9IDA7CisKKyAgICBpZihOVUxMID09IHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgLyogY2hlY2sgdGhpcyBlYXJseSB0byBhdm9pZCB1bm5jZXNzYXJ5IG9wZXJhdGlvbiAqLworICAgIGlmKE5VTEwgPT0gcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5BZGRJRUxlbiA9IHBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5hZGRJRUFzc29jLmxlbmd0aDsgCisgICAgcEFkZElFID0gcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPmFkZElFQXNzb2MuYWRkSUVkYXRhOworCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJmZybSwgc2l6ZW9mKCBmcm0gKSApOworCisgICAgY2FwcyA9IHBNbG1Bc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm87CisgICAgaWYgKCBQUk9QX0NBUEFCSUxJVFlfR0VUKCAxMUVRT1MsIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NQcm9wQ2FwICkgKQorICAgICAgICAoKHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqKSAmY2FwcyktPnFvcyA9IDA7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKyAgICAvKiBDUjogMjYyNDYzIDogCisgICAgICAgQWNjb3JkaW5nIHRvIFdBUEkgc3RhbmRhcmQ6CisgICAgICAgNy4zLjEuNCBDYXBhYmlsaXR5IEluZm9ybWF0aW9uIGZpZWxkCisgICAgICAgSW4gV0FQSSwgbm9uLUFQIFNUQXMgd2l0aGluIGFuIEVTUyBzZXQgdGhlIFByaXZhY3kgc3ViZmllbGQgdG8gMCBpbiB0cmFuc21pdHRlZCAKKyAgICAgICBBc3NvY2lhdGlvbiBvciBSZWFzc29jaWF0aW9uIG1hbmFnZW1lbnQgZnJhbWVzLiBBUHMgaWdub3JlIHRoZSBQcml2YWN5IHN1YmZpZWxkIHdpdGhpbiByZWNlaXZlZCBBc3NvY2lhdGlvbiBhbmQgCisgICAgICAgUmVhc3NvY2lhdGlvbiBtYW5hZ2VtZW50IGZyYW1lcy4gKi8KKyAgICBpZiAoIHBzZXNzaW9uRW50cnktPmVuY3J5cHRUeXBlID09IGVTSVJfRURfV1BJKQorICAgICAgICAoKHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqKSAmY2FwcyktPnByaXZhY3kgPSAwOworI2VuZGlmCisgICAgc3dhcEJpdEZpZWxkMTYoY2FwcywgKCB0QU5JX1UxNiogKSZmcm0uQ2FwYWJpbGl0aWVzICk7CisKKyAgICBmcm0uTGlzdGVuSW50ZXJ2YWwuaW50ZXJ2YWwgPSBwTWxtQXNzb2NSZXEtPmxpc3RlbkludGVydmFsOworICAgIFBvcHVsYXRlRG90MTFmU1NJRDIoIHBNYWMsICZmcm0uU1NJRCApOworICAgIFBvcHVsYXRlRG90MTFmU3VwcFJhdGVzKCBwTWFjLCBQT1BVTEFURV9ET1QxMUZfUkFURVNfT1BFUkFUSU9OQUwsCisgICAgICAgICAgICAmZnJtLlN1cHBSYXRlcyxwc2Vzc2lvbkVudHJ5KTsKKworICAgIGZRb3NFbmFibGVkID0gKCBwc2Vzc2lvbkVudHJ5LT5saW1Rb3NFbmFibGVkKSAmJgorICAgICAgICBTSVJfTUFDX0dFVF9RT1MoIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzICk7CisKKyAgICBmV21lRW5hYmxlZCA9ICggcHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCApICYmCisgICAgICAgIExJTV9CU1NfQ0FQU19HRVQoIFdNRSwgcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc1Fvc0NhcHMgKTsKKworICAgIC8vIFdlIHByZWZlciAuMTFlIGFzb2NpYXRpb25zOgorICAgIGlmICggZlFvc0VuYWJsZWQgKSBmV21lRW5hYmxlZCA9IGZhbHNlOworCisgICAgZldzbUVuYWJsZWQgPSAoIHBzZXNzaW9uRW50cnktPmxpbVdzbUVuYWJsZWQgKSAmJiBmV21lRW5hYmxlZCAmJgorICAgICAgICBMSU1fQlNTX0NBUFNfR0VUKCBXU00sIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NRb3NDYXBzICk7CisKKyAgICBpZiAoIHBzZXNzaW9uRW50cnktPmxpbTExaEVuYWJsZSAgJiYKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5zcGVjdHJ1bU1ndEluZGljYXRvciA9PSBlU0lSX1RSVUUgKSAKKyAgICB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgICAgIFBvd2VyQ2Fwc1BvcHVsYXRlZCA9IFRSVUU7CisKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZQb3dlckNhcHMoIHBNYWMsICZmcm0uUG93ZXJDYXBzLCBMSU1fQVNTT0MscHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZTdXBwQ2hhbm5lbHMoIHBNYWMsICZmcm0uU3VwcENoYW5uZWxzLCBMSU1fQVNTT0MscHNlc3Npb25FbnRyeSk7CisKKyAgICB9CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICBpZiggcE1hYy0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGUgJiYKKyAgICAgICAgICAgIFNJUl9NQUNfR0VUX1JSTSggcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc0NhcHMgKSApCisgICAgeworICAgICAgICBpZiAoUG93ZXJDYXBzUG9wdWxhdGVkID09IEZBTFNFKSAKKyAgICAgICAgeworICAgICAgICAgICAgUG93ZXJDYXBzUG9wdWxhdGVkID0gVFJVRTsKKyAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmUG93ZXJDYXBzKHBNYWMsICZmcm0uUG93ZXJDYXBzLCBMSU1fQVNTT0MsIHBzZXNzaW9uRW50cnkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIGZRb3NFbmFibGVkICYmCisgICAgICAgICAgICAoICEgUFJPUF9DQVBBQklMSVRZX0dFVCgxMUVRT1MsIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NQcm9wQ2FwKSkpCisgICAgICAgIFBvcHVsYXRlRG90MTFmUU9TQ2Fwc1N0YXRpb24oIHBNYWMsICZmcm0uUU9TQ2Fwc1N0YXRpb24gKTsKKworICAgIFBvcHVsYXRlRG90MTFmRXh0U3VwcFJhdGVzKCBwTWFjLCBQT1BVTEFURV9ET1QxMUZfUkFURVNfT1BFUkFUSU9OQUwsCisgICAgICAgICAgICAmZnJtLkV4dFN1cHBSYXRlcywgcHNlc3Npb25FbnRyeSApOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgaWYoIHBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlICYmCisgICAgICAgICAgICBTSVJfTUFDX0dFVF9SUk0oIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzICkgKQorICAgIHsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZSUk1JZSggcE1hYywgJmZybS5SUk1FbmFibGVkQ2FwLCBwc2Vzc2lvbkVudHJ5ICk7ICAgICAgIAorICAgIH0KKyNlbmRpZgorICAgIC8vIFRoZSBqb2luIHJlcXVlc3QgKnNob3VsZCogY29udGFpbiB6ZXJvIG9yIG9uZSBvZiB0aGUgV1BBIGFuZCBSU04KKyAgICAvLyBJRXMuICBUaGUgcGF5bG9hZCBzZW5kIGFsb25nIHdpdGggdGhlIHJlcXVlc3QgaXMgYQorICAgIC8vICd0U2lyU21lSm9pblJlcSc7IHRoZSBJRSBwb3J0aW9uIGlzIGhlbGQgaW5zaWRlIGEgJ3RTaXJSU05pZSc6CisKKyAgICAvLyAgICAgdHlwZWRlZiBzdHJ1Y3Qgc1NpclJTTmllCisgICAgLy8gICAgIHsKKyAgICAvLyAgICAgICAgIHRBTklfVTE2ICAgICAgIGxlbmd0aDsKKyAgICAvLyAgICAgICAgIHRBTklfVTggICAgICAgIHJzbklFZGF0YVtTSVJfTUFDX01BWF9JRV9MRU5HVEgrMl07CisgICAgLy8gICAgIH0gdFNpclJTTmllLCAqdHBTaXJSU05pZTsKKworICAgIC8vIFNvLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgdHdvIGNhbGxzIGhhcm1sZXNzbHksCisgICAgLy8gc2luY2UgdGhleSBkbyBub3RoaW5nIGlmIHRoZXkgZG9uJ3QgZmluZCB0aGUgZ2l2ZW4gSUUgaW4gdGhlCisgICAgLy8gYnl0ZXN0cmVhbSB3aXRoIHdoaWNoIHRoZXkncmUgcHJvdmlkZWQuCisKKyAgICAvLyBUaGUgbmV0IGVmZmVjdCBvZiB0aGlzIHdpbGwgYmUgdG8gZmFpdGhmdWxseSB0cmFuc21pdCB3aGF0ZXZlcgorICAgIC8vIHNlY3VyaXR5IElFIGlzIGluIHRoZSBqb2luIHJlcXVlc3QuCisKKyAgICAvLyAqSG93ZXZlciosIGlmIHdlJ3JlIGFzc29jaWF0aW5nIGZvciB0aGUgcHVycG9zZSBvZiBXUFMKKyAgICAvLyBlbnJvbGxtZW50LCBhbmQgd2UndmUgYmVlbiBjb25maWd1cmVkIHRvIGluZGljYXRlIHRoYXQgYnkKKyAgICAvLyBlbGlkaW5nIHRoZSBXUEEgb3IgUlNOIElFLCB3ZSBqdXN0IHNraXAgdGhpczoKKyAgICBpZiggbkFkZElFTGVuICYmIHBBZGRJRSApCisgICAgeworICAgICAgICB3cHNJZSA9IGxpbUdldFdzY0lFUHRyIChwTWFjLCBwQWRkSUUsIG5BZGRJRUxlbik7CisgICAgfQorICAgIGlmICggTlVMTCA9PSB3cHNJZSApCisgICAgeworICAgICAgICBQb3B1bGF0ZURvdDExZlJTTk9wYXF1ZSggcE1hYywgJiggcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPnJzbklFICksCisgICAgICAgICAgICAgICAgJmZybS5SU05PcGFxdWUgKTsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZXUEFPcGFxdWUoIHBNYWMsICYoIHBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5yc25JRSApLAorICAgICAgICAgICAgICAgICZmcm0uV1BBT3BhcXVlICk7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZXQVBJT3BhcXVlKCBwTWFjLCAmKCBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+cnNuSUUgKSwKKyAgICAgICAgICAgICAgICAmZnJtLldBUElPcGFxdWUgKTsKKyNlbmRpZiAvLyBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorICAgIH0KKworICAgIC8vIGluY2x1ZGUgV01FIEVEQ0EgSUUgYXMgd2VsbAorICAgIGlmICggZldtZUVuYWJsZWQgKQorICAgIHsKKyAgICAgICAgaWYgKCAhIFBST1BfQ0FQQUJJTElUWV9HRVQoIFdNRSwgcHNlc3Npb25FbnRyeS0+bGltQ3VycmVudEJzc1Byb3BDYXAgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmV01NSW5mb1N0YXRpb24oIHBNYWMsICZmcm0uV01NSW5mb1N0YXRpb24gKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggZldzbUVuYWJsZWQgJiYKKyAgICAgICAgICAgICAgICAoICEgUFJPUF9DQVBBQklMSVRZX0dFVChXU00sIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NQcm9wQ2FwICkpKQorICAgICAgICB7CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZldNTUNhcHMoICZmcm0uV01NQ2FwcyApOworICAgICAgICB9CisgICAgfQorCisgICAgLy9Qb3B1bGF0ZSBIVCBJRXMsIHdoZW4gb3BlcmF0aW5nIGluIDExbiBvciBUYXVydXMgbW9kZXMgQU5ECisgICAgLy93aGVuIEFQIGlzIGFsc28gb3BlcmF0aW5nIGluIDExbiBtb2RlLgorICAgIGlmICggcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5ICYmCisgICAgICAgICAgICBwTWFjLT5saW0uaHRDYXBhYmlsaXR5UHJlc2VudEluQmVhY29uKQorICAgIHsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZIVENhcHMoIHBNYWMsICZmcm0uSFRDYXBzICk7CisjaWZkZWYgRElTQUJMRV9HRl9GT1JfSU5URVJPUAorCisgICAgICAgIC8qCisgICAgICAgICAqIFRvIHJlc29sdmUgdGhlIGludGVyb3AgcHJvYmxlbSB3aXRoIEJyb2FkY29tIEFQLCAKKyAgICAgICAgICogd2hlcmUgVFEgU1RBIGNvdWxkIG5vdCBwYXNzIHRyYWZmaWMgd2l0aCBHRiBlbmFibGVkLAorICAgICAgICAgKiBUUSBTVEEgd2lsbCBkbyBHcmVlbmZpZWxkIG9ubHkgd2l0aCBUUSBBUCwgZm9yIAorICAgICAgICAgKiBldmVyeWJvZHkgZWxzZSBpdCB3aWxsIGJlIHR1cm5lZCBvZmYuCisgICAgICAgICAqLworCisgICAgICAgIGlmKCAocHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEgIT0gTlVMTCkgJiYgKCFwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+YnNzRGVzY3JpcHRpb24uYW5pSW5kaWNhdG9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgQXNzb2MgUmVxIHRvIE5vbi1UUSBBUCwgVHVybmluZyBvZmYgR3JlZW5maWVsZCIpKTsKKyAgICAgICAgICAgIGZybS5IVENhcHMuZ3JlZW5GaWVsZCA9IFdOSV9DRkdfR1JFRU5GSUVMRF9DQVBBQklMSVRZX0RJU0FCTEU7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+aXMxMVJjb25uZWN0aW9uKQorICAgIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIm1kaWUgPSAlMDJ4ICUwMnggJTAyeFxuIiksIAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPmJzc0Rlc2NyaXB0aW9uLm1kaWVbMF0sCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+YnNzRGVzY3JpcHRpb24ubWRpZVsxXSwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5tZGllWzJdKTsKKyNlbmRpZgorICAgICAgICBQb3B1bGF0ZU1ESUUoIHBNYWMsICZmcm0uTW9iaWxpdHlEb21haW4sIHBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5ic3NEZXNjcmlwdGlvbi5tZGllKTsgCisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgICAvLyBObyAxMXIgSUVzIGRvbnQgc2VuZCBhbnkgTURJRQorICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJtZGllIG5vdCBwcmVzZW50XG4iKSk7IAorICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIC8vIEZvciBDQ1ggQXNzb2NpYXRpb25zIGZpbGwgdGhlIENDWCBJRXMKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+aXNDQ1hjb25uZWN0aW9uKQorICAgIHsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZDQ1hSYWRNZ210Q2FwKCZmcm0uQ0NYUmFkTWdtdENhcCk7CisgICAgICAgIFBvcHVsYXRlRG90MTFmQ0NYVmVyc2lvbigmZnJtLkNDWFZlcnNpb24pOworICAgIH0KKyNlbmRpZgorCisgICAgblN0YXR1cyA9IGRvdDExZkdldFBhY2tlZEFzc29jUmVxdWVzdFNpemUoIHBNYWMsICZmcm0sICZuUGF5bG9hZCApOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisgICAgICAgICAgICAgICAgICAgICJvciBhbiBBc3NvY2lhdGlvbiBSZXF1ZXN0ICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICAvLyBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86CisgICAgICAgIG5QYXlsb2FkID0gc2l6ZW9mKCB0RG90MTFmQXNzb2NSZXF1ZXN0ICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyIKKyAgICAgICAgICAgICAgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYW4gQXNzb2NpYXRpb24gUmUgIgorICAgICAgICAgICAgICAgICAgICAicXVlc3QoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICkgKyBuQWRkSUVMZW47CisKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgKCB0QU5JX1UxNiApbkJ5dGVzLCAoIHZvaWQqKiApICZwRnJhbWUsCisgICAgICAgICAgICAoIHZvaWQqKiApICZwUGFja2V0ICk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYW4gQXMiCisgICAgICAgICAgICAgICAgICAgICJzb2NpYXRpb24gUmVxdWVzdC5cbiIpLCBuQnl0ZXMgKTsKKworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVByZXZNbG1TdGF0ZTsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisKKworICAgICAgICAvKiBVcGRhdGUgUEUgc2Vzc2lvbiBpZCovCisgICAgICAgIG1sbUFzc29jQ25mLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworCisgICAgICAgIG1sbUFzc29jQ25mLnJlc3VsdENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisKKyAgICAgICAgbGltUG9zdFNtZU1lc3NhZ2UoIHBNYWMsIExJTV9NTE1fQVNTT0NfQ05GLAorICAgICAgICAgICAgICAgICggdEFOSV9VMzIqICkgJm1sbUFzc29jQ25mKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUGFyYW5vaWE6CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgcEZyYW1lLCBuQnl0ZXMgKTsKKworICAgIC8vIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjoKKyAgICBuU2lyU3RhdHVzID0gbGltUG9wdWxhdGVNYWNIZWFkZXIoIHBNYWMsIHBGcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgU0lSX01BQ19NR01UX0FTU09DX1JFUSwgcHNlc3Npb25FbnRyeS0+YnNzSWQscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworICAgIGlmICggZVNJUl9TVUNDRVNTICE9IG5TaXJTdGF0dXMgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBvcHVsYXRlIHRoZSBidWZmZXIgZGVzY3JpcCIKKyAgICAgICAgICAgICAgICAgICAgInRvciBmb3IgYW4gQXNzb2NpYXRpb24gUmVxdWVzdCAoJWQpLlxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8vIFRoYXQgZG9uZSwgcGFjayB0aGUgUHJvYmUgUmVxdWVzdDoKKyAgICBuU3RhdHVzID0gZG90MTFmUGFja0Fzc29jUmVxdWVzdCggcE1hYywgJmZybSwgcEZyYW1lICsKKyAgICAgICAgICAgIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2sgYSBQcm9iZSBSZXNwb25zZSAoMHglMCIKKyAgICAgICAgICAgICAgICAgICAgIjh4KS5cbiIpLAorICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgYSBQIgorICAgICAgICAgICAgICAgICAgICAicm9iZSBSZXNwb25zZSAoMHglMDh4KS5cbiIpICk7CisgICAgfQorCisgICAgUEVMT0cxKGxpbUxvZyggcE1hYywgTE9HMSwgRkwoIioqKiBTZW5kaW5nIEFzc29jaWF0aW9uIFJlcXVlc3QgbGVuZ3RoICVkIgorICAgICAgICAgICAgICAgICAgICAidG8gXG4iKSwKKyAgICAgICAgICAgICAgICBuQnl0ZXMgKTspCisgICAgICAgIC8vICAgbGltUHJpbnRNYWNBZGRyKCBwTWFjLCBic3NpZCwgTE9HMSApOworCisgICAgICAgIGlmKCBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcSAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcSk7CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcSA9IE5VTEw7CisgICAgICAgIH0KKworICAgIGlmKCBuQWRkSUVMZW4gKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEZyYW1lICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArIG5QYXlsb2FkLCAKKyAgICAgICAgICAgICAgICBwQWRkSUUsIAorICAgICAgICAgICAgICAgIG5BZGRJRUxlbiApOworICAgICAgICBuUGF5bG9hZCArPSBuQWRkSUVMZW47CisgICAgfQorCisgICAgaWYoIChwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCoqKSZwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcSwgblBheWxvYWQpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHN0b3JlIGFzc29jIHJlcXVlc3QiKSk7KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL1N0b3JlIHRoZSBBc3NvYyByZXF1ZXN0LiBUaGlzIGlzIHNlbnQgdG8gY3NyL2hkZCBpbiBqb2luIGNuZiByZXNwb25zZS4gCisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+YXNzb2NSZXEsIHBGcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkciksIG5QYXlsb2FkKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+YXNzb2NSZXFMZW4gPSBuUGF5bG9hZDsKKyAgICB9CisKKyAgICBpZiggKCBTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgfHwgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSApIHx8CisgICAgICAgICAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisjZW5kaWYKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgIH0KKworICAgIGhhbHN0YXR1cyA9IGhhbFR4RnJhbWUoIHBNYWMsIHBQYWNrZXQsICggdEFOSV9VMTYgKSAoc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArIG5QYXlsb2FkKSwKKyAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgNywvL1NNQUNfU1dCRF9UWF9USURfTUdNVF9ISUdILAorICAgICAgICAgICAgbGltVHhDb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcgKTsKKyAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTICggaGFsc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHNlbmQgQXNzb2NpYXRpb24gUmVxdWVzdCAoJVgpIVxuIiksCisgICAgICAgICAgICAgICAgaGFsc3RhdHVzICk7CisgICAgICAgIC8vUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIG1sbUFzc29jUmVxCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApIHBNbG1Bc3NvY1JlcSApOworCit9IC8vIEVuZCBsaW1TZW5kQXNzb2NSZXFNZ210RnJhbWUKKworCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSIHx8IGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZW5kIFJlYXNzb2MgUmVxIHdpdGggRlRJRXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkCitsaW1TZW5kUmVhc3NvY1JlcVdpdGhGVElFc01nbXRGcmFtZSh0cEFuaVNpckdsb2JhbCAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMaW1NbG1SZWFzc29jUmVxICpwTWxtUmVhc3NvY1JlcSx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHN0YXRpYyB0RG90MTFmUmVBc3NvY1JlcXVlc3QgZnJtOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICBjYXBzOworICAgIHRBTklfVTggICAgICAgICAgICAgICpwRnJhbWU7CisgICAgdFNpclJldFN0YXR1cyAgICAgICAgIG5TaXJTdGF0dXM7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgIG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXM7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgIGZRb3NFbmFibGVkLCBmV21lRW5hYmxlZCwgZldzbUVuYWJsZWQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgKnBQYWNrZXQ7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICAgIGhhbHN0YXR1czsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgUG93ZXJDYXBzUG9wdWxhdGVkID0gRkFMU0U7CisjZW5kaWYKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgZnRfaWVzX2xlbmd0aCA9IDA7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICpwQm9keTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgbkFkZElFTGVuOyAKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgKnBBZGRJRTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICp3cHNJZSA9IE5VTEw7CisjZW5kaWYKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgdHhGbGFnID0gMDsKKworICAgIGlmIChOVUxMID09IHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5pczExUmNvbm5lY3Rpb24pCisgICAgeworICAgICAgICBpZiAocE1hYy0+ZnQuZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzX2xlbmd0aCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8qIGNoZWNrIHRoaXMgZWFybHkgdG8gYXZvaWQgdW5uY2Vzc2FyeSBvcGVyYXRpb24gKi8KKyAgICBpZihOVUxMID09IHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBuQWRkSUVMZW4gPSBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+YWRkSUVBc3NvYy5sZW5ndGg7IAorICAgIHBBZGRJRSA9IHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5hZGRJRUFzc29jLmFkZElFZGF0YTsKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJsaW1TZW5kUmVhc3NvY1JlcVdpdGhGVElFc01nbXRGcmFtZSByZWNlaXZlZCBpbiAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlICglZCkuXG4iKSwgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUpOworCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJmZybSwgc2l6ZW9mKCBmcm0gKSApOworCisgICAgY2FwcyA9IHBNbG1SZWFzc29jUmVxLT5jYXBhYmlsaXR5SW5mbzsKKyAgICBpZiAoUFJPUF9DQVBBQklMSVRZX0dFVCgxMUVRT1MsIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NQcm9wQ2FwKSkKKyAgICAgICAgKCh0U2lyTWFjQ2FwYWJpbGl0eUluZm8gKikgJmNhcHMpLT5xb3MgPSAwOworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX1dBUEkpCisgICAgLyogQ1I6IDI2MjQ2MyA6IAorICAgICAgIEFjY29yZGluZyB0byBXQVBJIHN0YW5kYXJkOgorICAgICAgIDcuMy4xLjQgQ2FwYWJpbGl0eSBJbmZvcm1hdGlvbiBmaWVsZAorICAgICAgIEluIFdBUEksIG5vbi1BUCBTVEFzIHdpdGhpbiBhbiBFU1Mgc2V0IHRoZSBQcml2YWN5IHN1YmZpZWxkIHRvIDAgaW4gdHJhbnNtaXR0ZWQgCisgICAgICAgQXNzb2NpYXRpb24gb3IgUmVhc3NvY2lhdGlvbiBtYW5hZ2VtZW50IGZyYW1lcy4gQVBzIGlnbm9yZSB0aGUgUHJpdmFjeSBzdWJmaWVsZCB3aXRoaW4gcmVjZWl2ZWQgQXNzb2NpYXRpb24gYW5kIAorICAgICAgIFJlYXNzb2NpYXRpb24gbWFuYWdlbWVudCBmcmFtZXMuICovCisgICAgaWYgKCBwc2Vzc2lvbkVudHJ5LT5lbmNyeXB0VHlwZSA9PSBlU0lSX0VEX1dQSSkKKyAgICAgICAgKCh0U2lyTWFjQ2FwYWJpbGl0eUluZm8gKikgJmNhcHMpLT5wcml2YWN5ID0gMDsKKyNlbmRpZgorICAgIHN3YXBCaXRGaWVsZDE2KGNhcHMsICggdEFOSV9VMTYqICkmZnJtLkNhcGFiaWxpdGllcyApOworCisgICAgZnJtLkxpc3RlbkludGVydmFsLmludGVydmFsID0gcE1sbVJlYXNzb2NSZXEtPmxpc3RlbkludGVydmFsOworCisgICAgLy8gR2V0IHRoZSBvbGQgYnNzaWQgb2YgdGhlIG9sZGVyIEFQLgorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKWZybS5DdXJyZW50QVBBZGRyZXNzLm1hYywKKyAgICAgICAgICAgIHBNYWMtPmZ0LmZ0UEVDb250ZXh0LnBGVFByZUF1dGhSZXEtPmN1cnJic3NJZCwgNik7IAorCisgICAgUG9wdWxhdGVEb3QxMWZTU0lEMiggcE1hYywgJmZybS5TU0lEICk7CisgICAgUG9wdWxhdGVEb3QxMWZTdXBwUmF0ZXMoIHBNYWMsIFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwKKyAgICAgICAgICAgICZmcm0uU3VwcFJhdGVzLHBzZXNzaW9uRW50cnkpOworCisgICAgZlFvc0VuYWJsZWQgPSAoIHBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQpICYmCisgICAgICAgIFNJUl9NQUNfR0VUX1FPUyggcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0Jzc0NhcHMgKTsKKworICAgIGZXbWVFbmFibGVkID0gKCBwc2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkICkgJiYKKyAgICAgICAgTElNX0JTU19DQVBTX0dFVCggV01FLCBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUW9zQ2FwcyApOworCisgICAgZldzbUVuYWJsZWQgPSAoIHBzZXNzaW9uRW50cnktPmxpbVdzbUVuYWJsZWQgKSAmJiBmV21lRW5hYmxlZCAmJgorICAgICAgICBMSU1fQlNTX0NBUFNfR0VUKCBXU00sIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NRb3NDYXBzICk7CisKKyAgICBpZiAoIHBzZXNzaW9uRW50cnktPmxpbTExaEVuYWJsZSAgJiYKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5zcGVjdHJ1bU1ndEluZGljYXRvciA9PSBlU0lSX1RSVUUgKQorICAgIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAgICAgUG93ZXJDYXBzUG9wdWxhdGVkID0gVFJVRTsKKworICAgICAgICBQb3B1bGF0ZURvdDExZlBvd2VyQ2FwcyggcE1hYywgJmZybS5Qb3dlckNhcHMsIExJTV9SRUFTU09DLHBzZXNzaW9uRW50cnkpOworICAgICAgICBQb3B1bGF0ZURvdDExZlN1cHBDaGFubmVscyggcE1hYywgJmZybS5TdXBwQ2hhbm5lbHMsIExJTV9SRUFTU09DLHBzZXNzaW9uRW50cnkpOworI2VuZGlmCisgICAgfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgaWYoIHBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlICYmCisgICAgICAgICAgICBTSVJfTUFDX0dFVF9SUk0oIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzICkgKQorICAgIHsKKyAgICAgICAgaWYgKFBvd2VyQ2Fwc1BvcHVsYXRlZCA9PSBGQUxTRSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvd2VyQ2Fwc1BvcHVsYXRlZCA9IFRSVUU7CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZlBvd2VyQ2FwcyhwTWFjLCAmZnJtLlBvd2VyQ2FwcywgTElNX1JFQVNTT0MsIHBzZXNzaW9uRW50cnkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIGZRb3NFbmFibGVkICYmCisgICAgICAgICAgICAoICEgUFJPUF9DQVBBQklMSVRZX0dFVCgxMUVRT1MsIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NQcm9wQ2FwICkgKSkKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmUU9TQ2Fwc1N0YXRpb24oIHBNYWMsICZmcm0uUU9TQ2Fwc1N0YXRpb24gKTsKKyAgICB9CisKKyAgICBQb3B1bGF0ZURvdDExZkV4dFN1cHBSYXRlcyggcE1hYywgUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLAorICAgICAgICAgICAgJmZybS5FeHRTdXBwUmF0ZXMsIHBzZXNzaW9uRW50cnkgKTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIGlmKCBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnJybUVuYWJsZSAmJgorICAgICAgICAgICAgU0lSX01BQ19HRVRfUlJNKCBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzQ2FwcyApICkKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmUlJNSWUoIHBNYWMsICZmcm0uUlJNRW5hYmxlZENhcCwgcHNlc3Npb25FbnRyeSApOyAgICAgICAKKyAgICB9CisjZW5kaWYKKworICAgIC8vIElkZWFsbHkgdGhpcyBzaG91bGQgYmUgZW5hYmxlZCBmb3IgMTFyIGFsc28uIEJ1dCAxMXIgZG9lcworICAgIC8vIG5vdCBmb2xsb3cgdGhlIHVzdWFsIG5vcm0gb2YgdXNpbmcgdGhlIE9wYXF1ZSBvYmplY3QKKyAgICAvLyBmb3IgcnNuaWUgYW5kIGZ0aWVzLiBJbnN0ZWFkIHdlIGp1c3QgYWRkCisgICAgLy8gdGhlIHJzbmllIGFuZCBmdGllcyBhdCB0aGUgZW5kIG9mIHRoZSBwYWNrIHJvdXRpbmUgZm9yIDExci4KKyAgICAvLyBUaGlzIHNob3VsZCBpZGVhbGx5ISBiZSBmaXhlZC4KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgLy8KKyAgICAvLyBUaGUgam9pbiByZXF1ZXN0ICpzaG91bGQqIGNvbnRhaW4gemVybyBvciBvbmUgb2YgdGhlIFdQQSBhbmQgUlNOCisgICAgLy8gSUVzLiAgVGhlIHBheWxvYWQgc2VuZCBhbG9uZyB3aXRoIHRoZSByZXF1ZXN0IGlzIGEKKyAgICAvLyAndFNpclNtZUpvaW5SZXEnOyB0aGUgSUUgcG9ydGlvbiBpcyBoZWxkIGluc2lkZSBhICd0U2lyUlNOaWUnOgorCisgICAgLy8gICAgIHR5cGVkZWYgc3RydWN0IHNTaXJSU05pZQorICAgIC8vICAgICB7CisgICAgLy8gICAgICAgICB0QU5JX1UxNiAgICAgICBsZW5ndGg7CisgICAgLy8gICAgICAgICB0QU5JX1U4ICAgICAgICByc25JRWRhdGFbU0lSX01BQ19NQVhfSUVfTEVOR1RIKzJdOworICAgIC8vICAgICB9IHRTaXJSU05pZSwgKnRwU2lyUlNOaWU7CisKKyAgICAvLyBTbywgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHR3byBjYWxscyBoYXJtbGVzc2x5LAorICAgIC8vIHNpbmNlIHRoZXkgZG8gbm90aGluZyBpZiB0aGV5IGRvbid0IGZpbmQgdGhlIGdpdmVuIElFIGluIHRoZQorICAgIC8vIGJ5dGVzdHJlYW0gd2l0aCB3aGljaCB0aGV5J3JlIHByb3ZpZGVkLgorCisgICAgLy8gVGhlIG5ldCBlZmZlY3Qgb2YgdGhpcyB3aWxsIGJlIHRvIGZhaXRoZnVsbHkgdHJhbnNtaXQgd2hhdGV2ZXIKKyAgICAvLyBzZWN1cml0eSBJRSBpcyBpbiB0aGUgam9pbiByZXF1ZXN0LgorCisgICAgLy8gKkhvd2V2ZXIqLCBpZiB3ZSdyZSBhc3NvY2lhdGluZyBmb3IgdGhlIHB1cnBvc2Ugb2YgV1BTCisgICAgLy8gZW5yb2xsbWVudCwgYW5kIHdlJ3ZlIGJlZW4gY29uZmlndXJlZCB0byBpbmRpY2F0ZSB0aGF0IGJ5CisgICAgLy8gZWxpZGluZyB0aGUgV1BBIG9yIFJTTiBJRSwgd2UganVzdCBza2lwIHRoaXM6CisgICAgaWYgKCFwc2Vzc2lvbkVudHJ5LT5pczExUmNvbm5lY3Rpb24pCisgICAgeworICAgICAgICBpZiggbkFkZElFTGVuICYmIHBBZGRJRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdwc0llID0gbGltR2V0V3NjSUVQdHIocE1hYywgcEFkZElFLCBuQWRkSUVMZW4pOworICAgICAgICB9CisgICAgICAgIGlmICggTlVMTCA9PSB3cHNJZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmUlNOT3BhcXVlKCBwTWFjLCAmKCBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+cnNuSUUgKSwKKyAgICAgICAgICAgICAgICAgICAgJmZybS5SU05PcGFxdWUgKTsKKyAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmV1BBT3BhcXVlKCBwTWFjLCAmKCBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+cnNuSUUgKSwKKyAgICAgICAgICAgICAgICAgICAgJmZybS5XUEFPcGFxdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5jY2ttSUUubGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZkNDWENja21PcGFxdWUoIHBNYWMsICYoIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5jY2ttSUUgKSwKKyAgICAgICAgICAgICAgICAgICAgJmZybS5DQ1hDY2ttT3BhcXVlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGb3IgQ0NYIEFzc29jaWF0aW9ucyBmaWxsIHRoZSBDQ1ggSUVzCisgICAgaWYgKHBzZXNzaW9uRW50cnktPmlzQ0NYY29ubmVjdGlvbikKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmQ0NYUmFkTWdtdENhcCgmZnJtLkNDWFJhZE1nbXRDYXApOworICAgICAgICBQb3B1bGF0ZURvdDExZkNDWFZlcnNpb24oJmZybS5DQ1hWZXJzaW9uKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIGluY2x1ZGUgV01FIEVEQ0EgSUUgYXMgd2VsbAorICAgIGlmICggZldtZUVuYWJsZWQgKQorICAgIHsKKyAgICAgICAgaWYgKCAhIFBST1BfQ0FQQUJJTElUWV9HRVQoIFdNRSwgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0Jzc1Byb3BDYXAgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmV01NSW5mb1N0YXRpb24oIHBNYWMsICZmcm0uV01NSW5mb1N0YXRpb24gKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggZldzbUVuYWJsZWQgJiYKKyAgICAgICAgICAgICAgICAoICEgUFJPUF9DQVBBQklMSVRZX0dFVChXU00sIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NQcm9wQ2FwICkpKQorICAgICAgICB7CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZldNTUNhcHMoICZmcm0uV01NQ2FwcyApOworICAgICAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+aXNDQ1hjb25uZWN0aW9uKSAKKyAgICAgICAgeworICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZSZUFzc29jVHNwZWMocE1hYywgJmZybSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBUU1JTIElFIGlmIFRTUEVDIGlzIGluY2x1ZGVkIGluIHRoZSByZWFzc29jIHJlcXVlc3QKKyAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+Y2N4VHNwZWNJbmZvLm51bVRzcGVjcykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdEFOSV9VMzIgcGh5TW9kZTsKKyAgICAgICAgICAgICAgICB0U2lyTWFjQ0NYVFNSU0lFICAgIHRzcnNJRTsgCisgICAgICAgICAgICAgICAgbGltR2V0UGh5TW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICB0c3JzSUUudHNpZCA9IDA7CisgICAgICAgICAgICAgICAgaWYoIHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcgfHwgcGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRzcnNJRS5yYXRlc1swXSA9IFRTUlNfMTFBR19SQVRFXzZNQlBTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHNyc0lFLnJhdGVzWzBdID0gVFNSU18xMUJfUkFURV81XzVNQlBTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQb3B1bGF0ZURvdDExVFNSU0lFKHBNYWMsJnRzcnNJRSwgJmZybS5DQ1hUcmFmU3RybVJhdGVTZXQsIHNpemVvZih0QU5JX1U4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAgICAKKyAgICB9CisKKyAgICBpZiAoIHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSAmJgorICAgICAgICAgICAgcE1hYy0+bGltLmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbikKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmSFRDYXBzKCBwTWFjLCAmZnJtLkhUQ2FwcyApOworICAgIH0KKworICAgIG5TdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRSZUFzc29jUmVxdWVzdFNpemUoIHBNYWMsICZmcm0sICZuUGF5bG9hZCApOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisgICAgICAgICAgICAgICAgICAgICJvciBhIFJlLUFzc29jaWF0aW9uIFJlcXVlc3QgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgIC8vIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzoKKyAgICAgICAgblBheWxvYWQgPSBzaXplb2YoIHREb3QxMWZSZUFzc29jUmVxdWVzdCApOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmciCisgICAgICAgICAgICAgICAgICAgICJ0aGUgcGFja2VkIHNpemUgZm9yIGEgUmUtQXNzb2NpYXRpb24gUmUgIgorICAgICAgICAgICAgICAgICAgICAicXVlc3QoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICkgKyBuQWRkSUVMZW47IDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRlQgSUUgUmVhc3NvYyBSZXEgKCVkKS5cbiIpLCAKKyAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llc19sZW5ndGgpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgaWYgKHBzZXNzaW9uRW50cnktPmlzMTFSY29ubmVjdGlvbikKKyAgICB7CisgICAgICAgIGZ0X2llc19sZW5ndGggPSBwTWFjLT5mdC5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXNfbGVuZ3RoOworICAgIH0KKyNlbmRpZgorCisgICAgaGFsc3RhdHVzID0gcGFsUGt0QWxsb2MoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICggdEFOSV9VMTYgKW5CeXRlcytmdF9pZXNfbGVuZ3RoLCAoIHZvaWQqKiApICZwRnJhbWUsCisgICAgICAgICAgICAoIHZvaWQqKiApICZwUGFja2V0ICk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID0gcHNlc3Npb25FbnRyeS0+bGltUHJldk1sbVN0YXRlOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhIFJlLUFzIgorICAgICAgICAgICAgICAgICAgICAic29jaWF0aW9uIFJlcXVlc3QuXG4iKSwgbkJ5dGVzICk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8vIFBhcmFub2lhOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICsgZnRfaWVzX2xlbmd0aCk7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHIHx8IGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwc2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWQsIExPR0UpOworI2VuZGlmCisgICAgLy8gTmV4dCwgd2UgZmlsbCBvdXQgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yOgorICAgIG5TaXJTdGF0dXMgPSBsaW1Qb3B1bGF0ZU1hY0hlYWRlciggcE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisgICAgICAgICAgICBTSVJfTUFDX01HTVRfUkVBU1NPQ19SRVEsCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWQscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworICAgIGlmICggZVNJUl9TVUNDRVNTICE9IG5TaXJTdGF0dXMgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBvcHVsYXRlIHRoZSBidWZmZXIgZGVzY3JpcCIKKyAgICAgICAgICAgICAgICAgICAgInRvciBmb3IgYW4gQXNzb2NpYXRpb24gUmVxdWVzdCAoJWQpLlxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworCisgICAgLy8gVGhhdCBkb25lLCBwYWNrIHRoZSBSZUFzc29jIFJlcXVlc3Q6CisgICAgblN0YXR1cyA9IGRvdDExZlBhY2tSZUFzc29jUmVxdWVzdCggcE1hYywgJmZybSwgcEZyYW1lICsKKyAgICAgICAgICAgIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2sgYSBSZS1Bc3NvY2lhdGlvbiBSZXF1ZSIKKyAgICAgICAgICAgICAgICAgICAgInN0ICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIFIiCisgICAgICAgICAgICAgICAgICAgICJlLUFzc29jaWF0aW9uIFJlcXVlc3QgKDB4JTA4eCkuXG4iKSApOworICAgIH0KKworICAgIFBFTE9HMyhsaW1Mb2coIHBNYWMsIExPRzMsIAorICAgICAgICAgICAgRkwoIioqKiBTZW5kaW5nIFJlLUFzc29jaWF0aW9uIFJlcXVlc3QgbGVuZ3RoICVkICVkIHRvIFxuIiksCisgICAgICAgICAgICBuQnl0ZXMsIG5QYXlsb2FkICk7KQorICAgIGlmKCBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcSAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+YXNzb2NSZXEpOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcSA9IE5VTEw7CisgICAgfQorCisgICAgaWYoIG5BZGRJRUxlbiApCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRnJhbWUgKyBzaXplb2YodFNpck1hY01nbXRIZHIpICsgblBheWxvYWQsIAorICAgICAgICAgICAgICAgICAgICAgICBwQWRkSUUsIAorICAgICAgICAgICAgICAgICAgICAgICBuQWRkSUVMZW4gKTsKKyAgICAgICAgblBheWxvYWQgKz0gbkFkZElFTGVuOworICAgIH0KKworICAgIGlmKCAocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKikmcHNlc3Npb25FbnRyeS0+YXNzb2NSZXEsIG5QYXlsb2FkKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBhc3NvYyByZXF1ZXN0IikpOykKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgLy9TdG9yZSB0aGUgQXNzb2MgcmVxdWVzdC4gVGhpcyBpcyBzZW50IHRvIGNzci9oZGQgaW4gam9pbiBjbmYgcmVzcG9uc2UuIAorICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmFzc29jUmVxLCBwRnJhbWUgKyBzaXplb2YodFNpck1hY01nbXRIZHIpLCBuUGF5bG9hZCk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmFzc29jUmVxTGVuID0gblBheWxvYWQ7CisgICAgIH0KKworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5pczExUmNvbm5lY3Rpb24pCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHBCb2R5ID0gcEZyYW1lICsgbkJ5dGVzOworICAgICAgICAgICAgZm9yIChpPTA7IGk8ZnRfaWVzX2xlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwQm9keSA9IHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llc1tpXTsKKyAgICAgICAgICAgICAgICBwQm9keSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJSZS1hc3NvYyBSZXEgRnJhbWUgaXM6ICIpKTsKKyAgICAgICAgICAgIHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPR0UsCisgICAgICAgICAgICAgICAgKHRBTklfVTggKilwRnJhbWUsCisgICAgICAgICAgICAgICAgKG5CeXRlcyArIGZ0X2llc19sZW5ndGgpKTspCisjZW5kaWYKKworCisgICAgaWYoICggU0lSX0JBTkRfNV9HSFogPT0gbGltR2V0UkZCYW5kKHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCkpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgIHx8ICggcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfQ0xJRU5UX01PREUgKSB8fAorICAgICAgICAgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9HT19NT0RFKQorI2VuZGlmCisgICAgICAgICApCisgICAgeworICAgICAgICB0eEZsYWcgfD0gSEFMX1VTRV9CRF9SQVRFMl9GT1JfTUFOQUdFTUVOVF9GUkFNRTsKKyAgICB9CisgCisgICAgaGFsc3RhdHVzID0gaGFsVHhGcmFtZSggcE1hYywgcFBhY2tldCwgKCB0QU5JX1UxNiApIChuQnl0ZXMgKyBmdF9pZXNfbGVuZ3RoKSwKKyAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgNywvL1NNQUNfU1dCRF9UWF9USURfTUdNVF9ISUdILAorICAgICAgICAgICAgbGltVHhDb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcgKTsKKyAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTICggaGFsc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHNlbmQgUmUtQXNzb2NpYXRpb24gUmVxdWVzdCIKKyAgICAgICAgICAgICAgICAgICAgIiglWCkhXG4iKSwKKyAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIC8vUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrCisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworZW5kOgorICAgIC8vIEZyZWUgdXAgYnVmZmVyIGFsbG9jYXRlZCBmb3IgbWxtQXNzb2NSZXEKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkgcE1sbVJlYXNzb2NSZXEgKTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5wTGltTWxtUmVhc3NvY1JlcSA9IE5VTEw7CisKK30KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCisKK3ZvaWQKK2xpbVNlbmRSZWFzc29jUmVxTWdtdEZyYW1lKHRwQW5pU2lyR2xvYmFsICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdExpbU1sbVJlYXNzb2NSZXEgKnBNbG1SZWFzc29jUmVxLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgc3RhdGljIHREb3QxMWZSZUFzc29jUmVxdWVzdCBmcm07CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgIGNhcHM7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgKnBGcmFtZTsKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgICAgblNpclN0YXR1czsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1czsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgZlFvc0VuYWJsZWQsIGZXbWVFbmFibGVkLCBmV3NtRW5hYmxlZDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAqcFBhY2tldDsKKyAgICBlSGFsU3RhdHVzICAgICAgICAgICAgaGFsc3RhdHVzOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICBuQWRkSUVMZW47IAorICAgIHRBTklfVTggICAgICAgICAgICAgICAqcEFkZElFOworICAgIHRBTklfVTggICAgICAgICAgICAgICAqd3BzSWUgPSBOVUxMOworICAgIHRBTklfVTggICAgICAgICAgICAgICB0eEZsYWcgPSAwOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIHRBTklfVTggICAgICAgICAgICAgICBQb3dlckNhcHNQb3B1bGF0ZWQgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgaWYoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGNoZWNrIHRoaXMgZWFybHkgdG8gYXZvaWQgdW5uY2Vzc2FyeSBvcGVyYXRpb24gKi8KKyAgICBpZihOVUxMID09IHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBuQWRkSUVMZW4gPSBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+YWRkSUVBc3NvYy5sZW5ndGg7IAorICAgIHBBZGRJRSA9IHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5hZGRJRUFzc29jLmFkZElFZGF0YTsKKyAgICAKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmZnJtLCBzaXplb2YoIGZybSApICk7CisKKyAgICBjYXBzID0gcE1sbVJlYXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvOworICAgIGlmIChQUk9QX0NBUEFCSUxJVFlfR0VUKDExRVFPUywgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0Jzc1Byb3BDYXApKQorICAgICAgICAoKHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqKSAmY2FwcyktPnFvcyA9IDA7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKyAgICAvKiBDUjogMjYyNDYzIDogCisgICAgQWNjb3JkaW5nIHRvIFdBUEkgc3RhbmRhcmQ6CisgICAgNy4zLjEuNCBDYXBhYmlsaXR5IEluZm9ybWF0aW9uIGZpZWxkCisgICAgSW4gV0FQSSwgbm9uLUFQIFNUQXMgd2l0aGluIGFuIEVTUyBzZXQgdGhlIFByaXZhY3kgc3ViZmllbGQgdG8gMCBpbiB0cmFuc21pdHRlZCAKKyAgICBBc3NvY2lhdGlvbiBvciBSZWFzc29jaWF0aW9uIG1hbmFnZW1lbnQgZnJhbWVzLiBBUHMgaWdub3JlIHRoZSBQcml2YWN5IHN1YmZpZWxkIHdpdGhpbiByZWNlaXZlZCBBc3NvY2lhdGlvbiBhbmQgCisgICAgUmVhc3NvY2lhdGlvbiBtYW5hZ2VtZW50IGZyYW1lcy4gKi8KKyAgICBpZiAoIHBzZXNzaW9uRW50cnktPmVuY3J5cHRUeXBlID09IGVTSVJfRURfV1BJKQorICAgICAgICAoKHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqKSAmY2FwcyktPnByaXZhY3kgPSAwOworI2VuZGlmCisgICAgc3dhcEJpdEZpZWxkMTYoY2FwcywgKCB0QU5JX1UxNiogKSZmcm0uQ2FwYWJpbGl0aWVzICk7CisKKyAgICBmcm0uTGlzdGVuSW50ZXJ2YWwuaW50ZXJ2YWwgPSBwTWxtUmVhc3NvY1JlcS0+bGlzdGVuSW50ZXJ2YWw7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqIClmcm0uQ3VycmVudEFQQWRkcmVzcy5tYWMsCisgICAgICAgICAgICAgICAgICAgKCB0QU5JX1U4KiApcHNlc3Npb25FbnRyeS0+YnNzSWQsIDYgKTsKKworICAgIFBvcHVsYXRlRG90MTFmU1NJRDIoIHBNYWMsICZmcm0uU1NJRCApOworICAgIFBvcHVsYXRlRG90MTFmU3VwcFJhdGVzKCBwTWFjLCBQT1BVTEFURV9ET1QxMUZfUkFURVNfT1BFUkFUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcm0uU3VwcFJhdGVzLHBzZXNzaW9uRW50cnkpOworCisgICAgZlFvc0VuYWJsZWQgPSAoIHBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQgKSAmJgorICAgICAgICBTSVJfTUFDX0dFVF9RT1MoIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NDYXBzICk7CisKKyAgICBmV21lRW5hYmxlZCA9ICggcHNlc3Npb25FbnRyeS0+bGltV21lRW5hYmxlZCApICYmCisgICAgICAgIExJTV9CU1NfQ0FQU19HRVQoIFdNRSwgcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0Jzc1Fvc0NhcHMgKTsKKworICAgIGZXc21FbmFibGVkID0gKCBwc2Vzc2lvbkVudHJ5LT5saW1Xc21FbmFibGVkICkgJiYgZldtZUVuYWJsZWQgJiYKKyAgICAgICAgTElNX0JTU19DQVBTX0dFVCggV1NNLCBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUW9zQ2FwcyApOworCisKKyAgICBpZiAoIHBzZXNzaW9uRW50cnktPmxpbTExaEVuYWJsZSAgJiYKKyAgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5zcGVjdHJ1bU1ndEluZGljYXRvciA9PSBlU0lSX1RSVUUgKQorICAgIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAgICAgUG93ZXJDYXBzUG9wdWxhdGVkID0gVFJVRTsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZQb3dlckNhcHMoIHBNYWMsICZmcm0uUG93ZXJDYXBzLCBMSU1fUkVBU1NPQyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZTdXBwQ2hhbm5lbHMoIHBNYWMsICZmcm0uU3VwcENoYW5uZWxzLCBMSU1fUkVBU1NPQyxwc2Vzc2lvbkVudHJ5KTsKKyNlbmRpZgorICAgIH0KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIGlmKCBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnJybUVuYWJsZSAmJgorICAgICAgICBTSVJfTUFDX0dFVF9SUk0oIHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzICkgKQorICAgIHsKKyAgICAgICAgaWYgKFBvd2VyQ2Fwc1BvcHVsYXRlZCA9PSBGQUxTRSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvd2VyQ2Fwc1BvcHVsYXRlZCA9IFRSVUU7CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZlBvd2VyQ2FwcyhwTWFjLCAmZnJtLlBvd2VyQ2FwcywgTElNX1JFQVNTT0MsIHBzZXNzaW9uRW50cnkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIGZRb3NFbmFibGVkICYmCisgICAgICAgICAoICEgUFJPUF9DQVBBQklMSVRZX0dFVCgxMUVRT1MsIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NQcm9wQ2FwICkgKSkKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmUU9TQ2Fwc1N0YXRpb24oIHBNYWMsICZmcm0uUU9TQ2Fwc1N0YXRpb24gKTsKKyAgICB9CisKKyAgICBQb3B1bGF0ZURvdDExZkV4dFN1cHBSYXRlcyggcE1hYywgUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJtLkV4dFN1cHBSYXRlcywgcHNlc3Npb25FbnRyeSApOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgaWYoIHBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlICYmCisgICAgICAgIFNJUl9NQUNfR0VUX1JSTSggcHNlc3Npb25FbnRyeS0+bGltUmVhc3NvY0Jzc0NhcHMgKSApCisgICAgeworICAgICAgICBQb3B1bGF0ZURvdDExZlJSTUllKCBwTWFjLCAmZnJtLlJSTUVuYWJsZWRDYXAsIHBzZXNzaW9uRW50cnkgKTsgICAgICAgCisgICAgfQorI2VuZGlmCisgICAgLy8gVGhlIGpvaW4gcmVxdWVzdCAqc2hvdWxkKiBjb250YWluIHplcm8gb3Igb25lIG9mIHRoZSBXUEEgYW5kIFJTTgorICAgIC8vIElFcy4gIFRoZSBwYXlsb2FkIHNlbmQgYWxvbmcgd2l0aCB0aGUgcmVxdWVzdCBpcyBhCisgICAgLy8gJ3RTaXJTbWVKb2luUmVxJzsgdGhlIElFIHBvcnRpb24gaXMgaGVsZCBpbnNpZGUgYSAndFNpclJTTmllJzoKKworICAgIC8vICAgICB0eXBlZGVmIHN0cnVjdCBzU2lyUlNOaWUKKyAgICAvLyAgICAgeworICAgIC8vICAgICAgICAgdEFOSV9VMTYgICAgICAgbGVuZ3RoOworICAgIC8vICAgICAgICAgdEFOSV9VOCAgICAgICAgcnNuSUVkYXRhW1NJUl9NQUNfTUFYX0lFX0xFTkdUSCsyXTsKKyAgICAvLyAgICAgfSB0U2lyUlNOaWUsICp0cFNpclJTTmllOworCisgICAgLy8gU28sIHdlIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgdGhlIGZvbGxvd2luZyB0d28gY2FsbHMgaGFybWxlc3NseSwKKyAgICAvLyBzaW5jZSB0aGV5IGRvIG5vdGhpbmcgaWYgdGhleSBkb24ndCBmaW5kIHRoZSBnaXZlbiBJRSBpbiB0aGUKKyAgICAvLyBieXRlc3RyZWFtIHdpdGggd2hpY2ggdGhleSdyZSBwcm92aWRlZC4KKworICAgIC8vIFRoZSBuZXQgZWZmZWN0IG9mIHRoaXMgd2lsbCBiZSB0byBmYWl0aGZ1bGx5IHRyYW5zbWl0IHdoYXRldmVyCisgICAgLy8gc2VjdXJpdHkgSUUgaXMgaW4gdGhlIGpvaW4gcmVxdWVzdC4KKworICAgIC8vICpIb3dldmVyKiwgaWYgd2UncmUgYXNzb2NpYXRpbmcgZm9yIHRoZSBwdXJwb3NlIG9mIFdQUworICAgIC8vIGVucm9sbG1lbnQsIGFuZCB3ZSd2ZSBiZWVuIGNvbmZpZ3VyZWQgdG8gaW5kaWNhdGUgdGhhdCBieQorICAgIC8vIGVsaWRpbmcgdGhlIFdQQSBvciBSU04gSUUsIHdlIGp1c3Qgc2tpcCB0aGlzOgorICAgIGlmKCBuQWRkSUVMZW4gJiYgcEFkZElFICkKKyAgICB7CisgICAgICAgIHdwc0llID0gbGltR2V0V3NjSUVQdHIocE1hYywgcEFkZElFLCBuQWRkSUVMZW4pOworICAgIH0KKyAgICBpZiAoIE5VTEwgPT0gd3BzSWUgKQorICAgIHsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZSU05PcGFxdWUoIHBNYWMsICYoIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5yc25JRSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZybS5SU05PcGFxdWUgKTsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZXUEFPcGFxdWUoIHBNYWMsICYoIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5yc25JRSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZybS5XUEFPcGFxdWUgKTsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorICAgICAgICBQb3B1bGF0ZURvdDExZldBUElPcGFxdWUoIHBNYWMsICYoIHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5yc25JRSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZybS5XQVBJT3BhcXVlICk7CisjZW5kaWYgLy8gZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKyAgICB9CisKKyAgICAvLyBpbmNsdWRlIFdNRSBFRENBIElFIGFzIHdlbGwKKyAgICBpZiAoIGZXbWVFbmFibGVkICkKKyAgICB7CisgICAgICAgIGlmICggISBQUk9QX0NBUEFCSUxJVFlfR0VUKCBXTUUsIHBzZXNzaW9uRW50cnktPmxpbVJlYXNzb2NCc3NQcm9wQ2FwICkgKQorICAgICAgICB7CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZldNTUluZm9TdGF0aW9uKCBwTWFjLCAmZnJtLldNTUluZm9TdGF0aW9uICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGZXc21FbmFibGVkICYmCisgICAgICAgICAgICAgKCAhIFBST1BfQ0FQQUJJTElUWV9HRVQoV1NNLCBwc2Vzc2lvbkVudHJ5LT5saW1SZWFzc29jQnNzUHJvcENhcCApKSkKKyAgICAgICAgeworICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1DYXBzKCAmZnJtLldNTUNhcHMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5ICYmCisgICAgICAgICAgcE1hYy0+bGltLmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbikKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmSFRDYXBzKCBwTWFjLCAmZnJtLkhUQ2FwcyApOworICAgIH0KKworICAgIG5TdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRSZUFzc29jUmVxdWVzdFNpemUoIHBNYWMsICZmcm0sICZuUGF5bG9hZCApOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGEgUmUtQXNzb2NpYXRpb24gUmVxdWVzdCAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgLy8gV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOgorICAgICAgICBuUGF5bG9hZCA9IHNpemVvZiggdERvdDExZlJlQXNzb2NSZXF1ZXN0ICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIFJlLUFzc29jaWF0aW9uIFJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVlc3QoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICkgKyBuQWRkSUVMZW47CisKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSA9IHBzZXNzaW9uRW50cnktPmxpbVByZXZNbG1TdGF0ZTsKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfTUxNX1NUQVRFLCAwLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlKSk7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBSZS1BcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29jaWF0aW9uIFJlcXVlc3QuXG4iKSwgbkJ5dGVzICk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8vIFBhcmFub2lhOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgICAvLyBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6CisgICAgblNpclN0YXR1cyA9IGxpbVBvcHVsYXRlTWFjSGVhZGVyKCBwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX1JFQVNTT0NfUkVRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1SZUFzc29jYnNzSWQscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpOworICAgIGlmICggZVNJUl9TVUNDRVNTICE9IG5TaXJTdGF0dXMgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBvcHVsYXRlIHRoZSBidWZmZXIgZGVzY3JpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9yIGZvciBhbiBBc3NvY2lhdGlvbiBSZXF1ZXN0ICglZCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisKKyAgICAvLyBUaGF0IGRvbmUsIHBhY2sgdGhlIFByb2JlIFJlcXVlc3Q6CisgICAgblN0YXR1cyA9IGRvdDExZlBhY2tSZUFzc29jUmVxdWVzdCggcE1hYywgJmZybSwgcEZyYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXlsb2FkLCAmblBheWxvYWQgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFjayBhIFJlLUFzc29jaWF0aW9uIFJlcXVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdCAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgYSBSIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlLUFzc29jaWF0aW9uIFJlcXVlc3QgKDB4JTA4eCkuXG4iKSApOworICAgIH0KKworICAgIFBFTE9HMShsaW1Mb2coIHBNYWMsIExPRzEsIEZMKCIqKiogU2VuZGluZyBSZS1Bc3NvY2lhdGlvbiBSZXF1ZXN0IGxlbmd0aCAlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBcbiIpLAorICAgICAgICAgICAgbkJ5dGVzICk7KQorCisgICAgaWYoIHBzZXNzaW9uRW50cnktPmFzc29jUmVxICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcSk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmFzc29jUmVxID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiggbkFkZElFTGVuICkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkcikgKyBuUGF5bG9hZCwgCisgICAgICAgICAgICAgICAgICAgICAgIHBBZGRJRSwgCisgICAgICAgICAgICAgICAgICAgICAgIG5BZGRJRUxlbiApOworICAgICAgICBuUGF5bG9hZCArPSBuQWRkSUVMZW47CisgICAgfQorCisgICAgaWYoIChwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCoqKSZwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcSwgblBheWxvYWQpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHN0b3JlIGFzc29jIHJlcXVlc3QiKSk7KQorICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAvL1N0b3JlIHRoZSBBc3NvYyByZXF1ZXN0LiBUaGlzIGlzIHNlbnQgdG8gY3NyL2hkZCBpbiBqb2luIGNuZiByZXNwb25zZS4gCisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+YXNzb2NSZXEsIHBGcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkciksIG5QYXlsb2FkKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+YXNzb2NSZXFMZW4gPSBuUGF5bG9hZDsKKyAgICAgfQorCisgICAgaWYoICggU0lSX0JBTkRfNV9HSFogPT0gbGltR2V0UkZCYW5kKHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCkpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgIHx8ICggcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfQ0xJRU5UX01PREUgKSB8fAorICAgICAgICAgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9HT19NT0RFKQorI2VuZGlmCisgICAgICAgICApCisgICAgeworICAgICAgICB0eEZsYWcgfD0gSEFMX1VTRV9CRF9SQVRFMl9GT1JfTUFOQUdFTUVOVF9GUkFNRTsKKyAgICB9CisKKyAgICBoYWxzdGF0dXMgPSBoYWxUeEZyYW1lKCBwTWFjLCBwUGFja2V0LCAoIHRBTklfVTE2ICkgKHNpemVvZih0U2lyTWFjTWdtdEhkcikgKyBuUGF5bG9hZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsLy9TTUFDX1NXQkRfVFhfVElEX01HTVRfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UeENvbXBsZXRlLCBwRnJhbWUsIHR4RmxhZyApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gc2VuZCBSZS1Bc3NvY2lhdGlvbiBSZXF1ZXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJVgpIVxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICAvL1BrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjaworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKK2VuZDoKKyAgICAvLyBGcmVlIHVwIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIG1sbUFzc29jUmVxCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApIHBNbG1SZWFzc29jUmVxICk7CisgICAgcHNlc3Npb25FbnRyeS0+cExpbU1sbVJlYXNzb2NSZXEgPSBOVUxMOworCit9IC8vIGxpbVNlbmRSZWFzc29jUmVxTWdtdEZyYW1lCisKKy8qKgorICogXGJyaWVmIFNlbmQgYW4gQXV0aGVudGljYXRpb24gZnJhbWUKKyAqCisgKgorICogXHBhcmFtIHBNYWMgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIFxwYXJhbSBwQXV0aEZyYW1lQm9keSBQb2ludGVyIHRvIEF1dGhlbnRpY2F0aW9uIGZyYW1lIHN0cnVjdHVyZSB0aGF0IG5lZWQKKyAqIHRvIGJlIHNlbnQKKyAqCisgKiBccGFyYW0gcGVlck1hY0FkZHIgTUFDIGFkZHJlc3Mgb2YgdGhlIHBlZXIgZW50aXR5IHRvIHdoaWNoIEF1dGhlbnRpY2F0aW9uCisgKiBmcmFtZSBpcyBkZXN0aW5lZAorICoKKyAqIFxwYXJhbSB3ZXBCaXQgSW5kaWNhdGVzIHdoZXRoZXIgd2VwIGJpdCB0byBiZSBzZXQgaW4gRkMgd2hpbGUgc2VuZGluZworICogQXV0aGVudGljYXRpb24gZnJhbWUzCisgKgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NNbG1NZXNzYWdlcygpLiAgQXV0aGVudGljYXRpb24gZnJhbWUKKyAqIGlzIGZvcm1hdHRlZCBhbmQgc2VudCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqCisgKi8KKwordm9pZAorbGltU2VuZEF1dGhNZ210RnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjQXV0aEZyYW1lQm9keSBwQXV0aEZyYW1lQm9keSwKKyAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyICAgICAgICAgICBwZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICAgICAgICAgICAgICB3ZXBCaXQsCisgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgcHNlc3Npb25FbnRyeSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgdEFOSV9VOCAgICAgICAgICAgICpwRnJhbWUsICpwQm9keTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIGZyYW1lTGVuID0gMCwgYm9keUxlbiA9IDA7CisgICAgdHBTaXJNYWNNZ210SGRyICAgICBwTWFjSGRyOworICAgIHRBTklfVTE2ICAgICAgICAgICAgaTsKKyAgICB2b2lkICAgICAgICAgICAgICAgKnBQYWNrZXQ7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICBoYWxzdGF0dXM7CisgICAgdEFOSV9VOCAgICAgICAgICAgICB0eEZsYWcgPSAwOworCisgICAgaWYoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAgIAorICAgIGlmICh3ZXBCaXQgPT0gTElNX1dFUF9JTl9GQykKKyAgICB7CisgICAgICAgIC8vLyBBdXRoIGZyYW1lMyB0byBiZSBzZW50IHdpdGggZW5jcnlwdGVkIGZyYW1lYm9keQorICAgICAgICAvKioKKyAgICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciBBdXRoZW50aWNhdG9uIGZyYW1lIG9mIHNpemUgZXF1YWwKKyAgICAgICAgICogdG8gbWFuYWdlbWVudCBmcmFtZSBoZWFkZXIgbGVuZ3RoIHBsdXMgMiBieXRlcyBlYWNoIGZvcgorICAgICAgICAgKiBhdXRoIGFsZ29yaXRobSBudW1iZXIsIHRyYW5zYWN0aW9uIG51bWJlciwgc3RhdHVzIGNvZGUsCisgICAgICAgICAqIDEyOCBieXRlcyBmb3IgY2hhbGxlbmdlIHRleHQgYW5kIDQgYnl0ZXMgZWFjaCBmb3IKKyAgICAgICAgICogSVYgJiBJQ1YuCisgICAgICAgICAqLworCisgICAgICAgIGZyYW1lTGVuID0gc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArIExJTV9FTkNSX0FVVEhfQk9EWV9MRU47CisKKyAgICAgICAgYm9keUxlbiA9IExJTV9FTkNSX0FVVEhfQk9EWV9MRU47CisgICAgfSAvLyBpZiAod2VwQml0ID09IExJTV9XRVBfSU5fRkMpCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwQXV0aEZyYW1lQm9keS0+YXV0aFRyYW5zYWN0aW9uU2VxTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfQVVUSF9GUkFNRV8xOgorICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgQXV0aGVudGljYXRvbiBmcmFtZSBvZiBzaXplCisgICAgICAgICAgICAgICAgICogZXF1YWwgdG8gbWFuYWdlbWVudCBmcmFtZSBoZWFkZXIgbGVuZ3RoIHBsdXMgMiBieXRlcworICAgICAgICAgICAgICAgICAqIGVhY2ggZm9yIGF1dGggYWxnb3JpdGhtIG51bWJlciwgdHJhbnNhY3Rpb24gbnVtYmVyCisgICAgICAgICAgICAgICAgICogYW5kIHN0YXR1cyBjb2RlLgorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgZnJhbWVMZW4gPSBzaXplb2YodFNpck1hY01nbXRIZHIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9DSEFMTEVOR0VfT0ZGU0VUOworICAgICAgICAgICAgICAgIGJvZHlMZW4gID0gU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9PRkZTRVQ7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgICAgICAgICAgaWYgKHBBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlciA9PSBlU0lSX0ZUX0FVVEgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+ZnRfaWVzKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4gKz0gcE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+ZnRfaWVzX2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiQXV0aCBmcmFtZSwgRlRJRVMgbGVuZ3RoIGFkZGVkPSVkXG4iKSwgCisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5mdF9pZXNfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzMsIEZMKCJBdXRoIGZyYW1lLCBEb2VzIG5vdCBjb250YWluIEZUSUVTISEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU0lSX01BQ19BVVRIX0ZSQU1FXzI6CisgICAgICAgICAgICAgICAgaWYgKChwQXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIgPT0gZVNJUl9PUEVOX1NZU1RFTSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKChwQXV0aEZyYW1lQm9keS0+YXV0aEFsZ29OdW1iZXIgPT0gZVNJUl9TSEFSRURfS0VZKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHBBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSAhPSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgQXV0aGVudGljYXRvbiBmcmFtZSBvZiBzaXplCisgICAgICAgICAgICAgICAgICAgICAqIGVxdWFsIHRvIG1hbmFnZW1lbnQgZnJhbWUgaGVhZGVyIGxlbmd0aCBwbHVzCisgICAgICAgICAgICAgICAgICAgICAqIDIgYnl0ZXMgZWFjaCBmb3IgYXV0aCBhbGdvcml0aG0gbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgKiB0cmFuc2FjdGlvbiBudW1iZXIgYW5kIHN0YXR1cyBjb2RlLgorICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiA9IHNpemVvZih0U2lyTWFjTWdtdEhkcikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9DSEFMTEVOR0VfT0ZGU0VUOworICAgICAgICAgICAgICAgICAgICBib2R5TGVuID0gU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9PRkZTRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNoYXJlZCBLZXkgYWxnb3JpdGhtIHdpdGggY2hhbGxlbmdlIHRleHQKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gYmUgc2VudAorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciBBdXRoZW50aWNhdG9uIGZyYW1lIG9mIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICogZXF1YWwgdG8gbWFuYWdlbWVudCBmcmFtZSBoZWFkZXIgbGVuZ3RoIHBsdXMKKyAgICAgICAgICAgICAgICAgICAgICogMiBieXRlcyBlYWNoIGZvciBhdXRoIGFsZ29yaXRobSBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAqIHRyYW5zYWN0aW9uIG51bWJlciwgc3RhdHVzIGNvZGUgYW5kIDEyOCBieXRlcworICAgICAgICAgICAgICAgICAgICAgKiBmb3IgY2hhbGxlbmdlIHRleHQuCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuID0gc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBdXRoRnJhbWUpOworICAgICAgICAgICAgICAgICAgICBib2R5TGVuICA9IHNpemVvZih0U2lyTWFjQXV0aEZyYW1lQm9keSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU0lSX01BQ19BVVRIX0ZSQU1FXzM6CisgICAgICAgICAgICAgICAgLy8vIEF1dGggZnJhbWUzIHRvIGJlIHNlbnQgd2l0aG91dCBlbmNyeXB0ZWQgZnJhbWVib2R5CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciBBdXRoZW50aWNhdG9uIGZyYW1lIG9mIHNpemUgZXF1YWwKKyAgICAgICAgICAgICAgICAgKiB0byBtYW5hZ2VtZW50IGZyYW1lIGhlYWRlciBsZW5ndGggcGx1cyAyIGJ5dGVzIGVhY2gKKyAgICAgICAgICAgICAgICAgKiBmb3IgYXV0aCBhbGdvcml0aG0gbnVtYmVyLCB0cmFuc2FjdGlvbiBudW1iZXIgYW5kCisgICAgICAgICAgICAgICAgICogc3RhdHVzIGNvZGUuCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBmcmFtZUxlbiA9IHNpemVvZih0U2lyTWFjTWdtdEhkcikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9PRkZTRVQ7CisgICAgICAgICAgICAgICAgYm9keUxlbiAgPSBTSVJfTUFDX0FVVEhfQ0hBTExFTkdFX09GRlNFVDsKKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfQVVUSF9GUkFNRV80OgorICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgQXV0aGVudGljYXRvbiBmcmFtZSBvZiBzaXplIGVxdWFsCisgICAgICAgICAgICAgICAgICogdG8gbWFuYWdlbWVudCBmcmFtZSBoZWFkZXIgbGVuZ3RoIHBsdXMgMiBieXRlcyBlYWNoCisgICAgICAgICAgICAgICAgICogZm9yIGF1dGggYWxnb3JpdGhtIG51bWJlciwgdHJhbnNhY3Rpb24gbnVtYmVyIGFuZAorICAgICAgICAgICAgICAgICAqIHN0YXR1cyBjb2RlLgorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgZnJhbWVMZW4gPSBzaXplb2YodFNpck1hY01nbXRIZHIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfQVVUSF9DSEFMTEVOR0VfT0ZGU0VUOworICAgICAgICAgICAgICAgIGJvZHlMZW4gID0gU0lSX01BQ19BVVRIX0NIQUxMRU5HRV9PRkZTRVQ7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAvLyBzd2l0Y2ggKHBBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIpCisgICAgfSAvLyBlbmQgaWYgKHdlcEJpdCA9PSBMSU1fV0VQX0lOX0ZDKQorCisKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHRBTklfVTE2IClmcmFtZUxlbiwgKCB2b2lkKiogKSAmcEZyYW1lLCAoIHZvaWQqKiApICZwUGFja2V0ICk7CisKKyAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTICggaGFsc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2FsbCB0byBidWZBbGxvYyBmYWlsZWQgZm9yIEFVVEggZnJhbWVcbiIpKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lTGVuOyBpKyspCisgICAgICAgIHBGcmFtZVtpXSA9IDA7CisKKyAgICAvLyBQcmVwYXJlIEJECisgICAgaWYgKGxpbVBvcHVsYXRlTWFjSGVhZGVyKHBNYWMsIHBGcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUdNVF9BVVRILCBwZWVyTWFjQWRkcixwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcikgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcE1hY0hkciA9ICggdHBTaXJNYWNNZ210SGRyICkgcEZyYW1lOworICAgIHBNYWNIZHItPmZjLndlcCA9IHdlcEJpdDsKKworICAgIC8vIFByZXBhcmUgQlNTSWQKKyAgICBpZiggIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSl8fCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKSApCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCh0QU5JX1U4ICopIHBNYWNIZHItPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0U2lyTWFjQWRkciApKTsKKyAgICB9CisKKyAgICAvLy8gUHJlcGFyZSBBdXRoZW50aWNhdGlvbiBmcmFtZSBib2R5CisgICAgcEJvZHkgICAgPSBwRnJhbWUgKyBzaXplb2YodFNpck1hY01nbXRIZHIpOworCisgICAgaWYgKHdlcEJpdCA9PSBMSU1fV0VQX0lOX0ZDKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJvZHksICh0QU5JX1U4ICopIHBBdXRoRnJhbWVCb2R5LCBib2R5TGVuKTsKKworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgIEZMKCIqKiogU2VuZGluZyBBdXRoIHNlcSMgMyBzdGF0dXMgJWQgKCVkKSB0b1xuIiksCisgICAgICAgICAgIHBBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSwKKyAgICAgICAgICAgKHBBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSA9PSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUykpOworCisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwTWFjSGRyLT5kYSwgTE9HMSk7KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqKCh0QU5JX1UxNiAqKShwQm9keSkpID0gc2lyU3dhcFUxNmlmTmVlZGVkKHBBdXRoRnJhbWVCb2R5LT5hdXRoQWxnb051bWJlcik7CisgICAgICAgIHBCb2R5ICAgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICAgICAgYm9keUxlbiAtPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgICAgICooKHRBTklfVTE2ICopKHBCb2R5KSkgPSBzaXJTd2FwVTE2aWZOZWVkZWQocEF1dGhGcmFtZUJvZHktPmF1dGhUcmFuc2FjdGlvblNlcU51bWJlcik7CisgICAgICAgIHBCb2R5ICAgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICAgICAgYm9keUxlbiAtPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgICAgICooKHRBTklfVTE2ICopKHBCb2R5KSkgPSBzaXJTd2FwVTE2aWZOZWVkZWQocEF1dGhGcmFtZUJvZHktPmF1dGhTdGF0dXNDb2RlKTsKKyAgICAgICAgcEJvZHkgICArPSBzaXplb2YodEFOSV9VMTYpOworICAgICAgICBib2R5TGVuIC09IHNpemVvZih0QU5JX1UxNik7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJvZHksICh0QU5JX1U4ICopICZwQXV0aEZyYW1lQm9keS0+dHlwZSwgYm9keUxlbik7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgIGlmICgocEF1dGhGcmFtZUJvZHktPmF1dGhBbGdvTnVtYmVyID09IGVTSVJfRlRfQVVUSCkgJiYgCisgICAgICAgICAgICAgICAgKHBBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPT0gU0lSX01BQ19BVVRIX0ZSQU1FXzEpKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgICAgICAgICAgICAgIGlmIChwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5mdF9pZXNfbGVuZ3RoKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkF1dGgxIEZyYW1lIEZUSUUgaXM6ICIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKilwQm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1hYy0+ZnQuZnRQRUNvbnRleHQucEZUUHJlQXV0aFJlcS0+ZnRfaWVzX2xlbmd0aCkpOykKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5mdF9pZXNfbGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcEJvZHkgPSBwTWFjLT5mdC5mdFBFQ29udGV4dC5wRlRQcmVBdXRoUmVxLT5mdF9pZXNbaV07CisgICAgICAgICAgICAgICAgICAgIHBCb2R5Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgIEZMKCIqKiogU2VuZGluZyBBdXRoIHNlcSMgJWQgc3RhdHVzICVkICglZCkgdG8gIiksCisgICAgICAgICAgIHBBdXRoRnJhbWVCb2R5LT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIsCisgICAgICAgICAgIHBBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSwKKyAgICAgICAgICAgKHBBdXRoRnJhbWVCb2R5LT5hdXRoU3RhdHVzQ29kZSA9PSBlU0lSX01BQ19TVUNDRVNTX1NUQVRVUykpOworCisgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwTWFjSGRyLT5kYSwgTE9HMSk7KQorICAgIH0KKyAgICBQRUxPRzIoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBmcmFtZUxlbik7KQorCisgICAgaWYoICggU0lSX0JBTkRfNV9HSFogPT0gbGltR2V0UkZCYW5kKHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCkpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgIHx8ICggcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfQ0xJRU5UX01PREUgKSB8fAorICAgICAgICAgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9HT19NT0RFKQorI2VuZGlmCisgICAgICAgICApCisgICAgeworICAgICAgICB0eEZsYWcgfD0gSEFMX1VTRV9CRF9SQVRFMl9GT1JfTUFOQUdFTUVOVF9GUkFNRTsKKyAgICB9CisKKyAgICAvLy8gUXVldWUgQXV0aGVudGljYXRpb24gZnJhbWUgaW4gaGlnaCBwcmlvcml0eSBXUQorICAgIGhhbHN0YXR1cyA9IGhhbFR4RnJhbWUoIHBNYWMsIHBQYWNrZXQsICggdEFOSV9VMTYgKSBmcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX1RYRElSX1RPRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywvL1NNQUNfU1dCRF9UWF9USURfTUdNVF9ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVR4Q29tcGxldGUsIHBGcmFtZSwgdHhGbGFnICk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoIioqKiBDb3VsZCBub3Qgc2VuZCBBdXRoIGZyYW1lLCByZXRDb2RlPSVYICoqKlxuIiksCisgICAgICAgICAgICAgICBoYWxzdGF0dXMpOworCisgICAgICAgIC8vUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrCisgICAgfQorCisgICAgcmV0dXJuOworfSAvKioqIGVuZCBsaW1TZW5kQXV0aE1nbXRGcmFtZSgpICoqKi8KKworLyoqCisgKiBcYnJpZWYgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBEaXNhc3NvY2lhdGUgZnJhbWUuCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gblJlYXNvbiBJbmRpY2F0ZXMgdGhlIHJlYXNvbiB0aGF0IG5lZWQgdG8gYmUgc2VudCBpbgorICogRGlzYXNzb2NpYXRpb24gZnJhbWUKKyAqCisgKiBccGFyYW0gcGVlck1hY0FkZHIgTUFDIGFkZHJlc3Mgb2YgdGhlIFNUQSB0byB3aGljaCBEaXNhc3NvY2lhdGlvbiBmcmFtZSBpcworICogc2VudAorICoKKyAqCisgKi8KKwordm9pZAorbGltU2VuZERpc2Fzc29jTWdtdEZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgICAgICAgblJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciAgICBwZWVyLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdERvdDExZkRpc2Fzc29jaWF0aW9uIGZybTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAqcEZyYW1lOworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgICBuU2lyU3RhdHVzOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgICBwTWFjSGRyOworICAgIHRBTklfVTMyICAgICAgICAgICAgICBuQnl0ZXMsIG5QYXlsb2FkLCBuU3RhdHVzOworICAgIHZvaWQgICAgICAgICAgICAgICAgICpwUGFja2V0OworICAgIGVIYWxTdGF0dXMgICAgICAgICAgICBoYWxzdGF0dXM7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgIHR4RmxhZyA9IDA7CisKKyAgICBpZihOVUxMID09IHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZmcm0sIHNpemVvZiggZnJtICkgKTsKKworICAgIGZybS5SZWFzb24uY29kZSA9IG5SZWFzb247CisKKyAgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkRGlzYXNzb2NpYXRpb25TaXplKCBwTWFjLCAmZnJtLCAmblBheWxvYWQgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhIERpc2Fzc29jaWF0aW9uICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICAvLyBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86CisgICAgICAgIG5QYXlsb2FkID0gc2l6ZW9mKCB0RG90MTFmRGlzYXNzb2NpYXRpb24gKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcGFja2VkIHNpemUgZm9yIGEgRGlzYXNzb2NpYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICk7CisKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgRGlzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc3NvY2lhdGlvbi5cbiIpLCBuQnl0ZXMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFBhcmFub2lhOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgICAvLyBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6CisgICAgblNpclN0YXR1cyA9IGxpbVBvcHVsYXRlTWFjSGVhZGVyKCBwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0RJU0FTU09DLCBwZWVyLHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKTsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwb3B1bGF0ZSB0aGUgYnVmZmVyIGRlc2NyaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvciBmb3IgYSBEaXNhc3NvY2lhdGlvbiAoJWQpLlxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWxsb2NhdGVkLi4uCisgICAgfQorCisgICAgcE1hY0hkciA9ICggdHBTaXJNYWNNZ210SGRyICkgcEZyYW1lOworCisgICAgLy8gUHJlcGFyZSB0aGUgQlNTSUQKKyAgICBzaXJDb3B5TWFjQWRkcihwTWFjSGRyLT5ic3NJZCxwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisgICAgCisgICAgblN0YXR1cyA9IGRvdDExZlBhY2tEaXNhc3NvY2lhdGlvbiggcE1hYywgJmZybSwgcEZyYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXlsb2FkLCAmblBheWxvYWQgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFjayBhIERpc2Fzc29jaWF0aW9uICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZCEKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgYSBEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc2Fzc29jaWF0aW9uICgweCUwOHgpLlxuIikgKTsKKyAgICB9CisKKyAgICBQRUxPRzEobGltTG9nKCBwTWFjLCBMT0cxLCBGTCgiKioqIFNlbmRpbmcgRGlzYXNzb2NpYXRpb24gZnJhbWUgd2l0aCByZWEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic29uICVkIHRvXG4iKSwgblJlYXNvbiApOworICAgIGxpbVByaW50TWFjQWRkciggcE1hYywgcE1hY0hkci0+ZGEsIExPRzEgKTspCisKKyAgICBpZiggKCBTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgfHwgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSApIHx8CisgICAgICAgICAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisjZW5kaWYKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgIH0KKworICAgIC8vIFF1ZXVlIERpc2Fzc29jaWF0aW9uIGZyYW1lIGluIGhpZ2ggcHJpb3JpdHkgV1EKKyAgICBoYWxzdGF0dXMgPSBoYWxUeEZyYW1lKCBwTWFjLCBwUGFja2V0LCAoIHRBTklfVTE2ICkgbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTklfVFhESVJfVE9EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LC8vU01BQ19TV0JEX1RYX1RJRF9NR01UX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltVHhDb21wbGV0ZSwgcEZyYW1lLCB0eEZsYWcgKTsKKyAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTICggaGFsc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHNlbmQgRGlzYXNzb2NpYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJVgpIVxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICAvL1BrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjaworICAgICAgICByZXR1cm47CisgICAgfQorCit9IC8vIEVuZCBsaW1TZW5kRGlzYXNzb2NNZ210RnJhbWUuCisKKy8qKgorICogXGJyaWVmIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgYSBEZWF1dGhlbnRpY2F0ZSBmcmFtZQorICoKKyAqCisgKiBccGFyYW0gcE1hYyBQb2ludGVyIHRvIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogXHBhcmFtIG5SZWFzb24gSW5kaWNhdGVzIHRoZSByZWFzb24gdGhhdCBuZWVkIHRvIGJlIHNlbnQgaW4gdGhlCisgKiBEZWF1dGhlbnRpY2F0ZSBmcmFtZQorICoKKyAqIFxwYXJhbSBwZWVlciBhZGRyZXNzIG9mIHRoZSBTVEEgdG8gd2hpY2ggdGhlIGZyYW1lIGlzIHRvIGJlIHNlbnQKKyAqCisgKgorICovCisKK3ZvaWQKK2xpbVNlbmREZWF1dGhNZ210RnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgICAgICAgblJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgICAgcGVlcix0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHREb3QxMWZEZUF1dGggICAgZnJtOworICAgIHRBTklfVTggICAgICAgICAqcEZyYW1lOworICAgIHRTaXJSZXRTdGF0dXMgICAgblNpclN0YXR1czsKKyAgICB0cFNpck1hY01nbXRIZHIgIHBNYWNIZHI7CisgICAgdEFOSV9VMzIgICAgICAgICBuQnl0ZXMsIG5QYXlsb2FkLCBuU3RhdHVzOworICAgIHZvaWQgICAgICAgICAgICAqcFBhY2tldDsKKyAgICBlSGFsU3RhdHVzICAgICAgIGhhbHN0YXR1czsKKyAgICB0QU5JX1U4ICAgICAgICAgIHR4RmxhZyA9IDA7CisKKyAgICBpZihOVUxMID09IHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSAmZnJtLCBzaXplb2YoIGZybSApICk7CisKKyAgICBmcm0uUmVhc29uLmNvZGUgPSBuUmVhc29uOworCisgICAgblN0YXR1cyA9IGRvdDExZkdldFBhY2tlZERlQXV0aFNpemUoIHBNYWMsICZmcm0sICZuUGF5bG9hZCApOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGEgRGUtQXV0aGVudGljYXRpb24gKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgIC8vIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzoKKyAgICAgICAgblBheWxvYWQgPSBzaXplb2YoIHREb3QxMWZEZUF1dGggKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcGFja2VkIHNpemUgZm9yIGEgRGUtQXV0aGVudGljYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICk7CisKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgRGUtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXRoZW50aWNhdGlvbi5cbiIpLCBuQnl0ZXMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFBhcmFub2lhOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgICAvLyBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6CisgICAgblNpclN0YXR1cyA9IGxpbVBvcHVsYXRlTWFjSGVhZGVyKCBwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0RFQVVUSCwgcGVlcixwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gblNpclN0YXR1cyApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcG9wdWxhdGUgdGhlIGJ1ZmZlciBkZXNjcmlwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3IgZm9yIGEgRGUtQXV0aGVudGljYXRpb24gKCVkKS5cbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvLyBqdXN0IGFsbG9jYXRlZC4uLgorICAgIH0KKworICAgIHBNYWNIZHIgPSAoIHRwU2lyTWFjTWdtdEhkciApIHBGcmFtZTsKKworICAgIC8vIFByZXBhcmUgdGhlIEJTU0lECisgICAgc2lyQ29weU1hY0FkZHIocE1hY0hkci0+YnNzSWQscHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisgICAgblN0YXR1cyA9IGRvdDExZlBhY2tEZUF1dGgoIHBNYWMsICZmcm0sIHBGcmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXlsb2FkLCAmblBheWxvYWQgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFjayBhIERlQXV0aGVudGljYXRpb24gKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIEQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImUtQXV0aGVudGljYXRpb24gKDB4JTA4eCkuXG4iKSApOworICAgIH0KKworICAgIFBFTE9HMShsaW1Mb2coIHBNYWMsIExPRzEsIEZMKCIqKiogU2VuZGluZyBEZS1BdXRoZW50aWNhdGlvbiBmcmFtZSB3aXRoIHJlYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb24gJWQgdG9cbiIpLCBuUmVhc29uICk7CisgICAgbGltUHJpbnRNYWNBZGRyKCBwTWFjLCBwTWFjSGRyLT5kYSwgTE9HMSApOykKKworICAgIGlmKCAoIFNJUl9CQU5EXzVfR0haID09IGxpbUdldFJGQmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICB8fCAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0NMSUVOVF9NT0RFICkgfHwKKyAgICAgICAgICggcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfR09fTU9ERSkKKyNlbmRpZgorICAgICAgICAgKQorICAgIHsKKyAgICAgICAgdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisgICAgfQorCisgICAgLy8gUXVldWUgRGlzYXNzb2NpYXRpb24gZnJhbWUgaW4gaGlnaCBwcmlvcml0eSBXUQorICAgIGhhbHN0YXR1cyA9IGhhbFR4RnJhbWUoIHBNYWMsIHBQYWNrZXQsICggdEFOSV9VMTYgKSBuQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsLy9TTUFDX1NXQkRfVFhfVElEX01HTVRfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UeENvbXBsZXRlLCBwRnJhbWUsIHR4RmxhZyApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gc2VuZCBEZS1BdXRoZW50aWNhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglWCkhXG4iKSwKKyAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIC8vUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrCisgICAgICAgIHJldHVybjsKKyAgICB9CisKK30gLy8gRW5kIGxpbVNlbmREZWF1dGhNZ210RnJhbWUuCisKKworI2lmZGVmIEFOSV9TVVBQT1JUXzExSAorLyoqCisgKiBcYnJpZWYgU2VuZCBhIE1lYXN1cmVtZW50IFJlcG9ydCBBY3Rpb24gZnJhbWUKKyAqCisgKgorICogXHBhcmFtIHBNYWMgUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcE1lYXNSZXFGcmFtZSBBZGRyZXNzIG9mIGEgdFNpck1hY01lYXNSZXFBY3Rpb25GcmFtZQorICoKKyAqIFxyZXR1cm4gZVNJUl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVTSVJfRkFJTFVSRSBlbHNlCisgKgorICoKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1TZW5kTWVhc1JlcG9ydEZyYW1lKHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lIHBNZWFzUmVxRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgICAgIHBlZXIpCit7CisgICAgdERvdDExZk1lYXN1cmVtZW50UmVwb3J0IGZybTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICpwRnJhbWU7CisgICAgdFNpclJldFN0YXR1cyAgICAgICAgICAgIG5TaXJTdGF0dXM7CisgICAgdHBTaXJNYWNNZ210SGRyICAgICAgICAgIHBNYWNIZHI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1cywgbkNmZzsKKyAgICB2b2lkICAgICAgICAgICAgICAgKnBQYWNrZXQ7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICBoYWxzdGF0dXM7CisgICAKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmZnJtLCBzaXplb2YoIGZybSApICk7CisKKyAgICBmcm0uQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9TUEVDVFJVTV9NR01UOworICAgIGZybS5BY3Rpb24uYWN0aW9uICAgICA9IFNJUl9NQUNfQUNUSU9OX01FQVNVUkVfUkVQT1JUX0lEOworICAgIGZybS5EaWFsb2dUb2tlbi50b2tlbiA9IHBNZWFzUmVxRnJhbWUtPmFjdGlvbkhlYWRlci5kaWFsb2dUb2tlbjsKKworICAgIHN3aXRjaCAoIHBNZWFzUmVxRnJhbWUtPm1lYXNSZXFJRS5tZWFzVHlwZSApCisgICAgeworICAgIGNhc2UgU0lSX01BQ19CQVNJQ19NRUFTVVJFTUVOVF9UWVBFOgorICAgICAgICBuU2lyU3RhdHVzID0KKyAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmTWVhc3VyZW1lbnRSZXBvcnQwKCBwTWFjLCBwTWVhc1JlcUZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJtLk1lYXN1cmVtZW50UmVwb3J0ICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0lSX01BQ19DQ0FfTUVBU1VSRU1FTlRfVFlQRToKKyAgICAgICAgblNpclN0YXR1cyA9CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZk1lYXN1cmVtZW50UmVwb3J0MSggcE1hYywgcE1lYXNSZXFGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZybS5NZWFzdXJlbWVudFJlcG9ydCApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNJUl9NQUNfUlBJX01FQVNVUkVNRU5UX1RZUEU6CisgICAgICAgIG5TaXJTdGF0dXMgPQorICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZNZWFzdXJlbWVudFJlcG9ydDIoIHBNYWMsIHBNZWFzUmVxRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcm0uTWVhc3VyZW1lbnRSZXBvcnQgKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiVW5rbm93biBtZWFzdXJlbWVudCB0eXBlICVkIGluIGxpbVNlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZE1lYXNSZXBvcnRGcmFtZS5cbiIpLAorICAgICAgICAgICAgICAgIHBNZWFzUmVxRnJhbWUtPm1lYXNSZXFJRS5tZWFzVHlwZSApOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGlmICggZVNJUl9TVUNDRVNTICE9IG5TaXJTdGF0dXMgKSByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgblN0YXR1cyA9IGRvdDExZkdldFBhY2tlZE1lYXN1cmVtZW50UmVwb3J0U2l6ZSggcE1hYywgJmZybSwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYSBNZWFzdXJlbWVudCBSZXBvcnQgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgIC8vIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzoKKyAgICAgICAgblBheWxvYWQgPSBzaXplb2YoIHREb3QxMWZNZWFzdXJlbWVudFJlcG9ydCApOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBNZWFzdXJlbWVudCBSZXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ydCAoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICk7CisKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgRGUtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXRoZW50aWNhdGlvbi5cbiIpLCBuQnl0ZXMgKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBQYXJhbm9pYToKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwRnJhbWUsIG5CeXRlcyApOworCisgICAgLy8gTmV4dCwgd2UgZmlsbCBvdXQgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yOgorICAgIG5TaXJTdGF0dXMgPSBsaW1Qb3B1bGF0ZU1hY0hlYWRlciggcE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUdNVF9BQ1RJT04sIHBlZXIpOworICAgIGlmICggZVNJUl9TVUNDRVNTICE9IG5TaXJTdGF0dXMgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBvcHVsYXRlIHRoZSBidWZmZXIgZGVzY3JpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9yIGZvciBhIE1lYXN1cmVtZW50IFJlcG9ydCAoJWQpLlxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7ICAgIC8vIGp1c3QgYWxsb2NhdGVkLi4uCisgICAgfQorCisgICAgcE1hY0hkciA9ICggdHBTaXJNYWNNZ210SGRyICkgcEZyYW1lOworCisgICAgbkNmZyA9IDY7CisgICAgblNpclN0YXR1cyA9IHdsYW5fY2ZnR2V0U3RyKCBwTWFjLCBXTklfQ0ZHX0JTU0lELCBwTWFjSGRyLT5ic3NJZCwgJm5DZmcgKTsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byByZXRyaWV2ZSBXTklfQ0ZHX0JTU0lEIGZyb20iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDRkcgKCVkKS5cbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvLyBqdXN0IGFsbG9jYXRlZC4uLgorICAgIH0KKworICAgIG5TdGF0dXMgPSBkb3QxMWZQYWNrTWVhc3VyZW1lbnRSZXBvcnQoIHBNYWMsICZmcm0sIHBGcmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2sgYSBNZWFzdXJlbWVudCBSZXBvcnQgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgKCB2b2lkKiApIHBGcmFtZSwgKCB2b2lkKiApIHBQYWNrZXQgKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsgICAgLy8gYWxsb2NhdGVkIQorICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIE0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVhc3VyZW1lbnQgUmVwb3J0ICgweCUwOHgpLlxuIikgKTsKKyAgICB9CisKKyAgICBoYWxzdGF0dXMgPSBoYWxUeEZyYW1lKCBwTWFjLCBwUGFja2V0LCAoIHRBTklfVTE2ICkgbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTklfVFhESVJfVE9EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LC8vU01BQ19TV0JEX1RYX1RJRF9NR01UX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltVHhDb21wbGV0ZSwgcEZyYW1lLCAwICk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBzZW5kIGEgTWVhc3VyZW1lbnQgUmVwb3J0ICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglWCkhXG4iKSwKKyAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIC8vUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7ICAgIC8vIGp1c3QgYWxsb2NhdGVkLi4uCisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgbGltU2VuZE1lYXNSZXBvcnRGcmFtZS4KKworCisvKioKKyAqIFxicmllZiBTZW5kIGEgVFBDIFJlcXVlc3QgQWN0aW9uIGZyYW1lCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgZGF0YXN0cnVjdHVyZQorICoKKyAqIFxwYXJhbSBwZWVyIE1BQyBhZGRyZXNzIHRvIHdoaWNoIHRoZSBmcmFtZSBzaG91bGQgYmUgc2VudAorICoKKyAqCisgKi8KKwordm9pZAorbGltU2VuZFRwY1JlcXVlc3RGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciAgICBwZWVyKQoreworICAgIHREb3QxMWZUUENSZXF1ZXN0ICBmcm07CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAqcEZyYW1lOworICAgIHRTaXJSZXRTdGF0dXMgICAgICBuU2lyU3RhdHVzOworICAgIHRwU2lyTWFjTWdtdEhkciAgICBwTWFjSGRyOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXMsIG5DZmc7CisgICAgdm9pZCAgICAgICAgICAgICAgICpwUGFja2V0OworICAgIGVIYWxTdGF0dXMgICAgICAgICAgaGFsc3RhdHVzOworICAgCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJmZybSwgc2l6ZW9mKCBmcm0gKSApOworCisgICAgZnJtLkNhdGVnb3J5LmNhdGVnb3J5ICA9IFNJUl9NQUNfQUNUSU9OX1NQRUNUUlVNX01HTVQ7CisgICAgZnJtLkFjdGlvbi5hY3Rpb24gICAgICA9IFNJUl9NQUNfQUNUSU9OX1RQQ19SRVFVRVNUX0lEOworICAgIGZybS5EaWFsb2dUb2tlbi50b2tlbiAgPSAxOworICAgIGZybS5UUENSZXF1ZXN0LnByZXNlbnQgPSAxOworCisgICAgblN0YXR1cyA9IGRvdDExZkdldFBhY2tlZFRQQ1JlcXVlc3RTaXplKCBwTWFjLCAmZnJtLCAmblBheWxvYWQgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhIFRQQyBSZXF1ZXN0ICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICAvLyBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86CisgICAgICAgIG5QYXlsb2FkID0gc2l6ZW9mKCB0RG90MTFmVFBDUmVxdWVzdCApOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBUUEMgUmVxdWVzdCAoMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOHgpLlxuIiksIG5TdGF0dXMgKTsKKyAgICB9CisKKyAgICBuQnl0ZXMgPSBuUGF5bG9hZCArIHNpemVvZiggdFNpck1hY01nbXRIZHIgKTsKKworICAgIGhhbHN0YXR1cyA9IHBhbFBrdEFsbG9jKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdEFOSV9VMTYgKW5CeXRlcywgKCB2b2lkKiogKSAmcEZyYW1lLCAoIHZvaWQqKiApICZwUGFja2V0ICk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBUUEMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSZXF1ZXN0LlxuIiksIG5CeXRlcyApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUGFyYW5vaWE6CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgcEZyYW1lLCBuQnl0ZXMgKTsKKworICAgIC8vIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjoKKyAgICBuU2lyU3RhdHVzID0gbGltUG9wdWxhdGVNYWNIZWFkZXIoIHBNYWMsIHBGcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01HTVRfQUNUSU9OLCBwZWVyKTsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwb3B1bGF0ZSB0aGUgYnVmZmVyIGRlc2NyaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvciBmb3IgYSBUUEMgUmVxdWVzdCAoJWQpLlxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWxsb2NhdGVkLi4uCisgICAgfQorCisgICAgcE1hY0hkciA9ICggdHBTaXJNYWNNZ210SGRyICkgcEZyYW1lOworCisgICAgbkNmZyA9IDY7CisgICAgblNpclN0YXR1cyA9IHdsYW5fY2ZnR2V0U3RyKCBwTWFjLCBXTklfQ0ZHX0JTU0lELCBwTWFjSGRyLT5ic3NJZCwgJm5DZmcgKTsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byByZXRyaWV2ZSBXTklfQ0ZHX0JTU0lEIGZyb20iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDRkcgKCVkKS5cbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvLyBqdXN0IGFsbG9jYXRlZC4uLgorICAgIH0KKworICAgIG5TdGF0dXMgPSBkb3QxMWZQYWNrVFBDUmVxdWVzdCggcE1hYywgJmZybSwgcEZyYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2sgYSBUUEMgUmVxdWVzdCAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQhCisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIGEgVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEMgUmVxdWVzdCAoMHglMDh4KS5cbiIpICk7CisgICAgfQorCisgICAgaGFsc3RhdHVzID0gaGFsVHhGcmFtZSggcE1hYywgcFBhY2tldCwgKCB0QU5JX1UxNiApIG5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX1RYRElSX1RPRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywvL1NNQUNfU1dCRF9UWF9USURfTUdNVF9ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVR4Q29tcGxldGUsIHBGcmFtZSwgMCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gc2VuZCBhIFRQQyBSZXF1ZXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVYKSFcbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgLy9Qa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworfSAvLyBFbmQgbGltU2VuZFRwY1JlcXVlc3RGcmFtZS4KKworCisvKioKKyAqIFxicmllZiBTZW5kIGEgVFBDIFJlcG9ydCBBY3Rpb24gZnJhbWUKKyAqCisgKgorICogXHBhcmFtIHBNYWMgUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBkYXRhc3RydWN0dXJlCisgKgorICogXHBhcmFtIHBUcGNSZXFGcmFtZSBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBUUEMgUmVxdWVzdAorICoKKyAqIFxyZXR1cm4gZVNJUl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVTSVJfRkFJTFVSRSBlbHNlCisgKgorICoKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1TZW5kVHBjUmVwb3J0RnJhbWUodHBBbmlTaXJHbG9iYWwgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjVHBjUmVxQWN0aW9uRnJhbWUgcFRwY1JlcUZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgICAgcGVlcikKK3sKKyAgICB0RG90MTFmVFBDUmVwb3J0IGZybTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAqcEZyYW1lOworICAgIHRTaXJSZXRTdGF0dXMgICAgblNpclN0YXR1czsKKyAgICB0cFNpck1hY01nbXRIZHIgIHBNYWNIZHI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgIG5CeXRlcywgblBheWxvYWQsIG5TdGF0dXMsIG5DZmc7CisgICAgdm9pZCAgICAgICAgICAgICAgICpwUGFja2V0OworICAgIGVIYWxTdGF0dXMgICAgICAgICAgaGFsc3RhdHVzOworICAgCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJmZybSwgc2l6ZW9mKCBmcm0gKSApOworCisgICAgZnJtLkNhdGVnb3J5LmNhdGVnb3J5ICA9IFNJUl9NQUNfQUNUSU9OX1NQRUNUUlVNX01HTVQ7CisgICAgZnJtLkFjdGlvbi5hY3Rpb24gICAgICA9IFNJUl9NQUNfQUNUSU9OX1RQQ19SRVBPUlRfSUQ7CisgICAgZnJtLkRpYWxvZ1Rva2VuLnRva2VuICA9IHBUcGNSZXFGcmFtZS0+YWN0aW9uSGVhZGVyLmRpYWxvZ1Rva2VuOworCisgICAgLy8gRnJhbWVzVG9EbzogT24gdGhlIEdlbjRfVFZNIGJyYW5jaCwgdGhlcmUgd2FzIGEgY29tbWVudDoKKyAgICAvLyAibWlzcGxhY2VkIHRoaXMgZnVuY3Rpb24sIG5lZWQgdG8gcmVwbGFjZToKKyAgICAvLyB0eFBvd2VyID0gaGFsR2V0UmF0ZVRvUHdyVmFsdWUocE1hYywgc3RhaWQsCisgICAgLy8gICAgIHBNYWMtPmxpbS5nTGltQ3VycmVudENoYW5uZWxJZCwgMCk7CisgICAgZnJtLlRQQ1JlcG9ydC50eF9wb3dlciAgICA9IDA7CisgICAgZnJtLlRQQ1JlcG9ydC5saW5rX21hcmdpbiA9IDA7CisgICAgZnJtLlRQQ1JlcG9ydC5wcmVzZW50ICAgICA9IDE7CisKKyAgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkVFBDUmVwb3J0U2l6ZSggcE1hYywgJmZybSwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYSBUUEMgUmVwb3J0ICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICAvLyBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86CisgICAgICAgIG5QYXlsb2FkID0gc2l6ZW9mKCB0RG90MTFmVFBDUmVwb3J0ICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIFRQQyBSZXBvcnQgKDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICk7CisKKyAgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGEgVFBDIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUmVwb3J0LlxuIiksIG5CeXRlcyApOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIC8vIFBhcmFub2lhOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgICAvLyBOZXh0LCB3ZSBmaWxsIG91dCB0aGUgYnVmZmVyIGRlc2NyaXB0b3I6CisgICAgblNpclN0YXR1cyA9IGxpbVBvcHVsYXRlTWFjSGVhZGVyKCBwTWFjLCBwRnJhbWUsIFNJUl9NQUNfTUdNVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0FDVElPTiwgcGVlcik7CisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gblNpclN0YXR1cyApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcG9wdWxhdGUgdGhlIGJ1ZmZlciBkZXNjcmlwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3IgZm9yIGEgVFBDIFJlcG9ydCAoJWQpLlxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7ICAgIC8vIGp1c3QgYWxsb2NhdGVkLi4uCisgICAgfQorCisgICAgcE1hY0hkciA9ICggdHBTaXJNYWNNZ210SGRyICkgcEZyYW1lOworCisgICAgbkNmZyA9IDY7CisgICAgblNpclN0YXR1cyA9IHdsYW5fY2ZnR2V0U3RyKCBwTWFjLCBXTklfQ0ZHX0JTU0lELCBwTWFjSGRyLT5ic3NJZCwgJm5DZmcgKTsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byByZXRyaWV2ZSBXTklfQ0ZHX0JTU0lEIGZyb20iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDRkcgKCVkKS5cbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvLyBqdXN0IGFsbG9jYXRlZC4uLgorICAgIH0KKworICAgIG5TdGF0dXMgPSBkb3QxMWZQYWNrVFBDUmVwb3J0KCBwTWFjLCAmZnJtLCBwRnJhbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY01nbXRIZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2sgYSBUUEMgUmVwb3J0ICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7ICAgIC8vIGFsbG9jYXRlZCEKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgYSBUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQyBSZXBvcnQgKDB4JTA4eCkuXG4iKSApOworICAgIH0KKworCisgICAgaGFsc3RhdHVzID0gaGFsVHhGcmFtZSggcE1hYywgcFBhY2tldCwgKCB0QU5JX1UxNiApIG5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX1RYRElSX1RPRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywvL1NNQUNfU1dCRF9UWF9USURfTUdNVF9ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVR4Q29tcGxldGUsIHBGcmFtZSwgMCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gc2VuZCBhIFRQQyBSZXBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJVgpIVxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICAvL1BrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjaworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvLyBqdXN0IGFsbG9jYXRlZC4uLgorICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIGxpbVNlbmRUcGNSZXBvcnRGcmFtZS4KKyNlbmRpZiAgLy9BTklfU1VQUE9SVF8xMUgKKworCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorLyoqCisgKiBcYnJpZWYgU2VuZCBhIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudAorICoKKyAqCisgKiBccGFyYW0gcE1hYyBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIGRhdGFzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcGVlciBNQUMgYWRkcmVzcyB0byB3aGljaCB0aGlzIGZyYW1lIHdpbGwgYmUgc2VudAorICoKKyAqIFxwYXJhbSBuTW9kZQorICoKKyAqIFxwYXJhbSBuTmV3Q2hhbm5lbAorICoKKyAqIFxwYXJhbSBuQ291bnQKKyAqCisgKiBccmV0dXJuIGVTSVJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlU0lSX0ZBSUxVUkUgZWxzZQorICoKKyAqCisgKi8KKwordFNpclJldFN0YXR1cworbGltU2VuZENoYW5uZWxTd2l0Y2hNZ210RnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyICAgIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgIG5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgICAgICAgICAgICBuTmV3Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICAgICAgICAgICAgbkNvdW50KQoreworICAgIHREb3QxMWZDaGFubmVsU3dpdGNoIGZybTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgKnBGcmFtZTsKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgICBuU2lyU3RhdHVzOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgIHBNYWNIZHI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICBuQnl0ZXMsIG5QYXlsb2FkLCBuU3RhdHVzLCBuQ2ZnOworICAgIHZvaWQgICAgICAgICAgICAgICAqcFBhY2tldDsKKyAgICBlSGFsU3RhdHVzICAgICAgICAgIGhhbHN0YXR1czsKKyAgICAKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmZnJtLCBzaXplb2YoIGZybSApICk7CisKKyAgICBmcm0uQ2F0ZWdvcnkuY2F0ZWdvcnkgICAgID0gU0lSX01BQ19BQ1RJT05fU1BFQ1RSVU1fTUdNVDsKKyAgICBmcm0uQWN0aW9uLmFjdGlvbiAgICAgICAgID0gU0lSX01BQ19BQ1RJT05fQ0hBTk5FTF9TV0lUQ0hfSUQ7CisgICAgZnJtLkNoYW5Td2l0Y2hBbm4uc3dpdGNoTW9kZSAgICA9IG5Nb2RlOworICAgIGZybS5DaGFuU3dpdGNoQW5uLm5ld0NoYW5uZWwgICAgPSBuTmV3Q2hhbm5lbDsKKyAgICBmcm0uQ2hhblN3aXRjaEFubi5zd2l0Y2hDb3VudCAgID0gbkNvdW50OworICAgIGZybS5DaGFuU3dpdGNoQW5uLnByZXNlbnQgPSAxOworCisgICAgblN0YXR1cyA9IGRvdDExZkdldFBhY2tlZENoYW5uZWxTd2l0Y2hTaXplKCBwTWFjLCAmZnJtLCAmblBheWxvYWQgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhIENoYW5uZWwgU3dpdGNoICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICAvLyBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86CisgICAgICAgIG5QYXlsb2FkID0gc2l6ZW9mKCB0RG90MTFmQ2hhbm5lbFN3aXRjaCApOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBDaGFubmVsIFN3aXRjaCAoMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOHgpLlxuIiksIG5TdGF0dXMgKTsKKyAgICB9CisKKyAgICBuQnl0ZXMgPSBuUGF5bG9hZCArIHNpemVvZiggdFNpck1hY01nbXRIZHIgKTsKKworICAgIGhhbHN0YXR1cyA9IHBhbFBrdEFsbG9jKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdEFOSV9VMTYgKW5CeXRlcywgKCB2b2lkKiogKSAmcEZyYW1lLCAoIHZvaWQqKiApICZwUGFja2V0ICk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBUUEMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSZXBvcnQuXG4iKSwgbkJ5dGVzICk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gUGFyYW5vaWE6CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgcEZyYW1lLCBuQnl0ZXMgKTsKKworICAgIC8vIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjoKKyAgICBuU2lyU3RhdHVzID0gbGltUG9wdWxhdGVNYWNIZWFkZXIoIHBNYWMsIHBGcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01HTVRfQUNUSU9OLCBwZWVyKTsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwb3B1bGF0ZSB0aGUgYnVmZmVyIGRlc2NyaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvciBmb3IgYSBDaGFubmVsIFN3aXRjaCAoJWQpLlxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7ICAgIC8vIGp1c3QgYWxsb2NhdGVkLi4uCisgICAgfQorCisgICAgcE1hY0hkciA9ICggdHBTaXJNYWNNZ210SGRyICkgcEZyYW1lOworCisgICAgbkNmZyA9IDY7CisgICAgblNpclN0YXR1cyA9IHdsYW5fY2ZnR2V0U3RyKCBwTWFjLCBXTklfQ0ZHX0JTU0lELCBwTWFjSGRyLT5ic3NJZCwgJm5DZmcgKTsKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byByZXRyaWV2ZSBXTklfQ0ZHX0JTU0lEIGZyb20iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDRkcgKCVkKS5cbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvLyBqdXN0IGFsbG9jYXRlZC4uLgorICAgIH0KKworICAgIG5TdGF0dXMgPSBkb3QxMWZQYWNrQ2hhbm5lbFN3aXRjaCggcE1hYywgJmZybSwgcEZyYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2sgYSBDaGFubmVsIFN3aXRjaCAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvLyBhbGxvY2F0ZWQhCisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIGEgQyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFubmVsIFN3aXRjaCAoMHglMDh4KS5cbiIpICk7CisgICAgfQorCisgICAgaGFsc3RhdHVzID0gaGFsVHhGcmFtZSggcE1hYywgcFBhY2tldCwgKCB0QU5JX1UxNiApIG5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX1RYRElSX1RPRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywvL1NNQUNfU1dCRF9UWF9USURfTUdNVF9ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVR4Q29tcGxldGUsIHBGcmFtZSwgMCApOworICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gc2VuZCBhIENoYW5uZWwgU3dpdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVYKSFcbiIpLAorICAgICAgICAgICAgICAgIG5TaXJTdGF0dXMgKTsKKyAgICAgICAgLy9Qa3Qgd2lsbCBiZSBmcmVlZCB1cCBieSB0aGUgY2FsbGJhY2sKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8vIEVuZCBsaW1TZW5kQ2hhbm5lbFN3aXRjaE1nbXRGcmFtZS4KKworI2VuZGlmIC8vIChBTklfUFJPRFVDVF9UWVBFX0FQKQorCisKKy8qKgorICogXGJyaWVmIFNlbmQgYW4gQUREQkEgUmVxIEFjdGlvbiBGcmFtZSB0byBwZWVyCisgKgorICogXHNhIGxpbVNlbmRBZGRCQVJlcQorICoKKyAqIFxwYXJhbSBwTWFjIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIHBNbG1BZGRCQVJlcSBBIHBvaW50ZXIgdG8gdExpbU1sbUFkZEJBUmVxLiBUaGlzIGNvbnRhaW5zCisgKiB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgcmVxZCBieSBQRSBzZW5kIHRoZSBBRERCQSBSZXEgQWN0aW9uCisgKiBGcmFtZSB0byB0aGUgcGVlcgorICoKKyAqIFxyZXR1cm4gZVNJUl9TVUNDRVNTIGlmIHNldHVwIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgZVNJUl9GQUlMVVJFIGlzIHNvbWUgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZAorICovCit0U2lyUmV0U3RhdHVzIGxpbVNlbmRBZGRCQVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cExpbU1sbUFkZEJBUmVxIHBNbG1BZGRCQVJlcSAsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0RG90MTFmQWRkQkFSZXEgZnJtQWRkQkFSZXE7CisgICAgdEFOSV9VOCAqcEFkZEJBUmVxQnVmZmVyID0gTlVMTDsKKyAgICB0cFNpck1hY01nbXRIZHIgcE1hY0hkcjsKKyAgICB0QU5JX1UzMiBmcmFtZUxlbiA9IDAsIG5TdGF0dXMsIG5QYXlsb2FkOworICAgIHRTaXJSZXRTdGF0dXMgc3RhdHVzQ29kZTsKKyAgICBlSGFsU3RhdHVzIGhhbFN0YXR1czsKKyAgICB2b2lkICpwUGFja2V0OworICAgIHRBTklfVTggdHhGbGFnID0gMDsKKworICAgICBpZihOVUxMID09IHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopICZmcm1BZGRCQVJlcSwgc2l6ZW9mKCBmcm1BZGRCQVJlcSApKTsKKworICAgIC8vIENhdGVnb3J5IC0gMyAoQkEpCisgICAgZnJtQWRkQkFSZXEuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9CTEtBQ0s7CisgICAgCisgICAgLy8gQWN0aW9uIC0gMCAoQUREQkEgUmVxKQorICAgIGZybUFkZEJBUmVxLkFjdGlvbi5hY3Rpb24gPSBTSVJfTUFDX0JMS0FDS19BRERfUkVROworCisgICAgLy8gRklYTUUgLSBEaWFsb2cgVG9rZW4sIGdlbmVyYWxpemUgdGhpcy4uLgorICAgIGZybUFkZEJBUmVxLkRpYWxvZ1Rva2VuLnRva2VuID0gcE1sbUFkZEJBUmVxLT5iYURpYWxvZ1Rva2VuOworCisgICAgLy8gRmlsbCB0aGUgQUREQkEgUGFyYW1ldGVyIFNldAorICAgIGZybUFkZEJBUmVxLkFkZEJBUGFyYW1ldGVyU2V0LnRpZCA9IHBNbG1BZGRCQVJlcS0+YmFUSUQ7CisgICAgZnJtQWRkQkFSZXEuQWRkQkFQYXJhbWV0ZXJTZXQucG9saWN5ID0gcE1sbUFkZEJBUmVxLT5iYVBvbGljeTsKKyAgICBmcm1BZGRCQVJlcS5BZGRCQVBhcmFtZXRlclNldC5idWZmZXJTaXplID0gcE1sbUFkZEJBUmVxLT5iYUJ1ZmZlclNpemU7CisKKyAgICAvLyBCQSB0aW1lb3V0CisgICAgLy8gMCAtIGluZGljYXRlcyBubyBCQSB0aW1lb3V0CisgICAgZnJtQWRkQkFSZXEuQkFUaW1lb3V0LnRpbWVvdXQgPSBwTWxtQWRkQkFSZXEtPmJhVGltZW91dDsKKworICAvLyBCQSBTdGFydGluZyBTZXF1ZW5jZSBOdW1iZXIKKyAgLy8gRnJhZ21lbnQgbnVtYmVyIHdpbGwgYWx3YXlzIGJlIHplcm8KKyAgaWYgKHBNbG1BZGRCQVJlcS0+YmFTU04gPCBMSU1fVFhfRlJBTUVTX1RIUkVTSE9MRF9PTl9DSElQKSB7CisgICAgICBwTWxtQWRkQkFSZXEtPmJhU1NOID0gTElNX1RYX0ZSQU1FU19USFJFU0hPTERfT05fQ0hJUDsKKyAgfQorICAKKyAgZnJtQWRkQkFSZXEuQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbC5zc24gPSAKKyAgICAgICAgICAgICAgICBwTWxtQWRkQkFSZXEtPmJhU1NOIC0gTElNX1RYX0ZSQU1FU19USFJFU0hPTERfT05fQ0hJUDsKKworICAgIG5TdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRBZGRCQVJlcVNpemUoIHBNYWMsICZmcm1BZGRCQVJlcSwgJm5QYXlsb2FkICk7CisKKyAgICBpZiggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICBGTCggIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGZvciAiCisgICAgICAgICAgImFuIEFEREJBIFJlcXVlc3QgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgblN0YXR1cyApOworCisgICAgICAgIC8vIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzoKKyAgICAgICAgblBheWxvYWQgPSBzaXplb2YoIHREb3QxMWZBZGRCQVJlcSApOworICAgIH0KKyAgICBlbHNlIGlmKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgIEZMKCAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyIKKyAgICAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhbiBBRERCQSBSZXEgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgblN0YXR1cyApOworICAgIH0KKworICAgIC8vIEFkZCB0aGUgTUdNVCBoZWFkZXIgdG8gZnJhbWUgbGVuZ3RoCisgICAgZnJhbWVMZW4gPSBuUGF5bG9hZCArIHNpemVvZiggdFNpck1hY01nbXRIZHIgKTsKKworICAgIC8vIE5lZWQgdG8gYWxsb2NhdGUgYSBidWZmZXIgZm9yIEFEREJBIEFGCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0KKyAgICAgIChoYWxTdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMTYpIGZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJnBBZGRCQVJlcUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopICZwUGFja2V0ICkpKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgRkwoInBhbFBrdEFsbG9jIEZBSUxFRCEgTGVuZ3RoIFslZF0sIFN0YXR1cyBbJWRdXG4iKSwKKyAgICAgICAgZnJhbWVMZW4sCisgICAgICAgIGhhbFN0YXR1cyApOworCisgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgICAgIGdvdG8gcmV0dXJuQWZ0ZXJFcnJvcjsKKyAgICB9CisKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwQWRkQkFSZXFCdWZmZXIsIGZyYW1lTGVuICk7CisKKyAgICAvLyBDb3B5IG5lY2Vzc2FyeSBpbmZvIHRvIEJECisgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPQorICAgICAgKHN0YXR1c0NvZGUgPSBsaW1Qb3B1bGF0ZU1hY0hlYWRlciggcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZEJBUmVxQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01HTVRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUdNVF9BQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNbG1BZGRCQVJlcS0+cGVlck1hY0FkZHIscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpKSkKKyAgICBnb3RvIHJldHVybkFmdGVyRXJyb3I7CisKKyAgICAvLyBVcGRhdGUgQTMgd2l0aCB0aGUgQlNTSUQKKyAgICBwTWFjSGRyID0gKCB0cFNpck1hY01nbXRIZHIgKSBwQWRkQkFSZXFCdWZmZXI7CisgICAgCisgICAgI2lmIDAKKyAgICBjZmdMZW4gPSBTSVJfTUFDX0FERFJfTEVOR1RIOworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gY2ZnR2V0U3RyKCBwTWFjLAorICAgICAgICBXTklfQ0ZHX0JTU0lELAorICAgICAgICAodEFOSV9VOCAqKSBwTWFjSGRyLT5ic3NJZCwKKyAgICAgICAgJmNmZ0xlbiApKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICBGTCggIkZhaWxlZCB0byByZXRyaWV2ZSBXTklfQ0ZHX0JTU0lEIHdoaWxlIgorICAgICAgICAgICJzZW5kaW5nIGFuIEFDVElPTiBGcmFtZVxuIiApKTsKKworICAgICAgICAvLyBGSVhNRSAtIE5lZWQgdG8gY29udmVydCB0byB0U2lyUmV0U3RhdHVzCisgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gcmV0dXJuQWZ0ZXJFcnJvcjsKKyAgICB9CisgICAgI2VuZGlmLy9UTyBTVVBQT1JUIEJULUFNUAorICAgIHNpckNvcHlNYWNBZGRyKHBNYWNIZHItPmJzc0lkLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKworICAgIC8vIE5vdywgd2UncmUgcmVhZHkgdG8gInBhY2siIHRoZSBmcmFtZXMKKyAgICBuU3RhdHVzID0gZG90MTFmUGFja0FkZEJBUmVxKCBwTWFjLAorICAgICAgJmZybUFkZEJBUmVxLAorICAgICAgcEFkZEJBUmVxQnVmZmVyICsgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApLAorICAgICAgblBheWxvYWQsCisgICAgICAmblBheWxvYWQgKTsKKworICAgIGlmKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCAiRmFpbGVkIHRvIHBhY2sgYW4gQUREQkEgUmVxICgweCUwOHgpLlxuIiApLAorICAgICAgICBuU3RhdHVzICk7CisKKyAgICAgICAgLy8gRklYTUUgLSBOZWVkIHRvIGNvbnZlcnQgdG8gdFNpclJldFN0YXR1cworICAgICAgICBzdGF0dXNDb2RlID0gZVNJUl9GQUlMVVJFOworICAgICAgICBnb3RvIHJldHVybkFmdGVyRXJyb3I7CisgICAgfQorICAgIGVsc2UgaWYoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgRkwoICJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgYW4gQUREQkEgUmVxICgweCUwOHgpLlxuIiApKTsKKyAgICB9CisKKyAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICBGTCggIlNlbmRpbmcgYW4gQUREQkEgUkVRIHRvIFxuIiApKTsKKyAgICBsaW1QcmludE1hY0FkZHIoIHBNYWMsIHBNbG1BZGRCQVJlcS0+cGVlck1hY0FkZHIsIExPR1cgKTsKKworICAgIGlmKCAoIFNJUl9CQU5EXzVfR0haID09IGxpbUdldFJGQmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICB8fCAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0NMSUVOVF9NT0RFICkgfHwKKyAgICAgICAgICggcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfR09fTU9ERSkKKyNlbmRpZgorICAgICAgICAgKQorICAgIHsKKyAgICAgICAgdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisgICAgfQorCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0KKyAgICAgIChoYWxTdGF0dXMgPSBoYWxUeEZyYW1lKCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTE2KSBmcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5JX1RYRElSX1RPRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywvL1NNQUNfU1dCRF9UWF9USURfTUdNVF9ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVR4Q29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZEJBUmVxQnVmZmVyLCB0eEZsYWcgKSkpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCAiaGFsVHhGcmFtZSBGQUlMRUQhIFN0YXR1cyBbJWRdXG4iKSwKKyAgICAgICAgaGFsU3RhdHVzICk7CisKKyAgICAvLyBGSVhNRSAtIE5lZWQgdG8gY29udmVydCBlSGFsU3RhdHVzIHRvIHRTaXJSZXRTdGF0dXMKKyAgICBzdGF0dXNDb2RlID0gZVNJUl9GQUlMVVJFOworICAgIC8vUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrCisgICAgcmV0dXJuIHN0YXR1c0NvZGU7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK3JldHVybkFmdGVyRXJyb3I6CisKKyAgLy8gUmVsZWFzZSBidWZmZXIsIGlmIGFsbG9jYXRlZAorICBpZiggTlVMTCAhPSBwQWRkQkFSZXFCdWZmZXIgKQorICAgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsCisgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgKHZvaWQgKikgcEFkZEJBUmVxQnVmZmVyLAorICAgICAgICAodm9pZCAqKSBwUGFja2V0ICk7CisKKyAgcmV0dXJuIHN0YXR1c0NvZGU7Cit9CisKKy8qKgorICogXGJyaWVmIFNlbmQgYW4gQUREQkEgUnNwIEFjdGlvbiBGcmFtZSB0byBwZWVyCisgKgorICogXHNhIGxpbVNlbmRBZGRCQVJzcAorICoKKyAqIFxwYXJhbSBwTWFjIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIHBNbG1BZGRCQVJzcCBBIHBvaW50ZXIgdG8gdExpbU1sbUFkZEJBUnNwLiBUaGlzIGNvbnRhaW5zCisgKiB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgcmVxZCBieSBQRSBzZW5kIHRoZSBBRERCQSBSc3AgQWN0aW9uCisgKiBGcmFtZSB0byB0aGUgcGVlcgorICoKKyAqIFxyZXR1cm4gZVNJUl9TVUNDRVNTIGlmIHNldHVwIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgZVNJUl9GQUlMVVJFIGlzIHNvbWUgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZAorICovCit0U2lyUmV0U3RhdHVzIGxpbVNlbmRBZGRCQVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cExpbU1sbUFkZEJBUnNwIHBNbG1BZGRCQVJzcCwKKyAgICB0cFBFU2Vzc2lvbiAgICAgIHBzZXNzaW9uRW50cnkpCit7CisgICAgdERvdDExZkFkZEJBUnNwIGZybUFkZEJBUnNwOworICAgIHRBTklfVTggKnBBZGRCQVJzcEJ1ZmZlciA9IE5VTEw7CisgICAgdHBTaXJNYWNNZ210SGRyIHBNYWNIZHI7CisgICAgdEFOSV9VMzIgZnJhbWVMZW4gPSAwLCBuU3RhdHVzLCBuUGF5bG9hZDsKKyAgICB0U2lyUmV0U3RhdHVzIHN0YXR1c0NvZGU7CisgICAgZUhhbFN0YXR1cyBoYWxTdGF0dXM7CisgICAgdm9pZCAqcFBhY2tldDsKKyAgICB0QU5JX1U4IHR4RmxhZyA9IDA7CisKKyAgICAgaWYoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU2Vzc2lvbiBlbnRyeSBpcyBOVUxMISEhXG4iKSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgJmZybUFkZEJBUnNwLCBzaXplb2YoIGZybUFkZEJBUnNwICkpOworCisgICAgICAvLyBDYXRlZ29yeSAtIDMgKEJBKQorICAgICAgZnJtQWRkQkFSc3AuQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9CTEtBQ0s7CisgICAgICAvLyBBY3Rpb24gLSAxIChBRERCQSBSc3ApCisgICAgICBmcm1BZGRCQVJzcC5BY3Rpb24uYWN0aW9uID0gU0lSX01BQ19CTEtBQ0tfQUREX1JTUDsKKworICAgICAgLy8gU2hvdWxkIGJlIHNhbWUgYXMgdGhlIG9uZSB3ZSByZWNlaXZlZCBpbiB0aGUgQUREQkEgUmVxCisgICAgICBmcm1BZGRCQVJzcC5EaWFsb2dUb2tlbi50b2tlbiA9IHBNbG1BZGRCQVJzcC0+YmFEaWFsb2dUb2tlbjsKKworICAgICAgLy8gQUREQkEgUmVxIHN0YXR1cworICAgICAgZnJtQWRkQkFSc3AuU3RhdHVzLnN0YXR1cyA9IHBNbG1BZGRCQVJzcC0+YWRkQkFSZXN1bHRDb2RlOworCisgICAgICAvLyBGaWxsIHRoZSBBRERCQSBQYXJhbWV0ZXIgU2V0IGFzIHByb3ZpZGVkIGJ5IGNhbGxlcgorICAgICAgZnJtQWRkQkFSc3AuQWRkQkFQYXJhbWV0ZXJTZXQudGlkID0gcE1sbUFkZEJBUnNwLT5iYVRJRDsKKyAgICAgIGZybUFkZEJBUnNwLkFkZEJBUGFyYW1ldGVyU2V0LnBvbGljeSA9IHBNbG1BZGRCQVJzcC0+YmFQb2xpY3k7CisgICAgICBmcm1BZGRCQVJzcC5BZGRCQVBhcmFtZXRlclNldC5idWZmZXJTaXplID0gcE1sbUFkZEJBUnNwLT5iYUJ1ZmZlclNpemU7CisKKyAgICAgIC8vIEJBIHRpbWVvdXQKKyAgICAgIC8vIDAgLSBpbmRpY2F0ZXMgbm8gQkEgdGltZW91dAorICAgICAgZnJtQWRkQkFSc3AuQkFUaW1lb3V0LnRpbWVvdXQgPSBwTWxtQWRkQkFSc3AtPmJhVGltZW91dDsKKworICAgICAgblN0YXR1cyA9IGRvdDExZkdldFBhY2tlZEFkZEJBUnNwU2l6ZSggcE1hYywgJmZybUFkZEJBUnNwLCAmblBheWxvYWQgKTsKKworICAgICAgaWYoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSkKKyAgICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgICAgRkwoICJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmb3IgIgorICAgICAgICAgICAgICAiYW4gQUREQkEgUmVzcG9uc2UgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgIG5TdGF0dXMgKTsKKworICAgICAgICAvLyBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86CisgICAgICAgIG5QYXlsb2FkID0gc2l6ZW9mKCB0RG90MTFmQWRkQkFSc3AgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSkKKyAgICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgICAgRkwoICJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIgorICAgICAgICAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhbiBBRERCQSBSc3AgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgIH0KKworICAgICAgLy8gTmVlZCB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgQUREQkEgQUYKKyAgICAgIGZyYW1lTGVuID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICk7CisKKyAgICAgIC8vIEFsbG9jYXRlIHNoYXJlZCBtZW1vcnkKKyAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAgICAgKGhhbFN0YXR1cyA9IHBhbFBrdEFsbG9jKCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTE2KSBmcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcEFkZEJBUnNwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopICZwUGFja2V0ICkpKQorICAgICAgeworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICAgICAgRkwoInBhbFBrdEFsbG9jIEZBSUxFRCEgTGVuZ3RoIFslZF0sIFN0YXR1cyBbJWRdXG4iKSwKKyAgICAgICAgICAgIGZyYW1lTGVuLAorICAgICAgICAgICAgaGFsU3RhdHVzICk7CisKKyAgICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgICAgZ290byByZXR1cm5BZnRlckVycm9yOworICAgICAgfQorCisgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwQWRkQkFSc3BCdWZmZXIsIGZyYW1lTGVuICk7CisKKyAgICAgIC8vIENvcHkgbmVjZXNzYXJ5IGluZm8gdG8gQkQKKyAgICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0KKyAgICAgICAgICAoc3RhdHVzQ29kZSA9IGxpbVBvcHVsYXRlTWFjSGVhZGVyKCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZEJBUnNwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0FDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNbG1BZGRCQVJzcC0+cGVlck1hY0FkZHIscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIpKSkKKyAgICAgICAgZ290byByZXR1cm5BZnRlckVycm9yOworCisgICAgICAvLyBVcGRhdGUgQTMgd2l0aCB0aGUgQlNTSUQKKyAgICAgIAorICAgICAgcE1hY0hkciA9ICggdHBTaXJNYWNNZ210SGRyICkgcEFkZEJBUnNwQnVmZmVyOworICAgICAgCisgICAgICAjaWYgMAorICAgICAgY2ZnTGVuID0gU0lSX01BQ19BRERSX0xFTkdUSDsKKyAgICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gd2xhbl9jZmdHZXRTdHIoIHBNYWMsCisgICAgICAgICAgICBXTklfQ0ZHX0JTU0lELAorICAgICAgICAgICAgKHRBTklfVTggKikgcE1hY0hkci0+YnNzSWQsCisgICAgICAgICAgICAmY2ZnTGVuICkpCisgICAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgIEZMKCAiRmFpbGVkIHRvIHJldHJpZXZlIFdOSV9DRkdfQlNTSUQgd2hpbGUiCisgICAgICAgICAgICAgICJzZW5kaW5nIGFuIEFDVElPTiBGcmFtZVxuIiApKTsKKworICAgICAgICAvLyBGSVhNRSAtIE5lZWQgdG8gY29udmVydCB0byB0U2lyUmV0U3RhdHVzCisgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gcmV0dXJuQWZ0ZXJFcnJvcjsKKyAgICAgIH0KKyAgICAgICNlbmRpZiAvLyBUTyBTVVBQT1JUIEJULUFNUAorICAgICAgc2lyQ29weU1hY0FkZHIocE1hY0hkci0+YnNzSWQscHNlc3Npb25FbnRyeS0+YnNzSWQpOworCisgICAgICAvLyBOb3csIHdlJ3JlIHJlYWR5IHRvICJwYWNrIiB0aGUgZnJhbWVzCisgICAgICBuU3RhdHVzID0gZG90MTFmUGFja0FkZEJBUnNwKCBwTWFjLAorICAgICAgICAgICZmcm1BZGRCQVJzcCwKKyAgICAgICAgICBwQWRkQkFSc3BCdWZmZXIgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICksCisgICAgICAgICAgblBheWxvYWQsCisgICAgICAgICAgJm5QYXlsb2FkICk7CisKKyAgICAgIGlmKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkpCisgICAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgIEZMKCAiRmFpbGVkIHRvIHBhY2sgYW4gQUREQkEgUnNwICgweCUwOHgpLlxuIiApLAorICAgICAgICAgICAgblN0YXR1cyApOworCisgICAgICAgIC8vIEZJWE1FIC0gTmVlZCB0byBjb252ZXJ0IHRvIHRTaXJSZXRTdGF0dXMKKyAgICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfRkFJTFVSRTsKKyAgICAgICAgZ290byByZXR1cm5BZnRlckVycm9yOworICAgICAgfQorICAgICAgZWxzZSBpZiggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApKQorICAgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgICAgICBGTCggIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhbiBBRERCQSBSc3AgKDB4JTA4eCkuXG4iICkpOworICAgICAgfQorCisgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgICAgRkwoICJTZW5kaW5nIGFuIEFEREJBIFJTUCB0byBcbiIgKSk7CisgICAgICBsaW1QcmludE1hY0FkZHIoIHBNYWMsIHBNbG1BZGRCQVJzcC0+cGVlck1hY0FkZHIsIExPR1cgKTsKKworICAgIGlmKCAoIFNJUl9CQU5EXzVfR0haID09IGxpbUdldFJGQmFuZChwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpKQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICB8fCAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0NMSUVOVF9NT0RFICkgfHwKKyAgICAgICAgICggcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfR09fTU9ERSkKKyNlbmRpZgorICAgICAgICAgKQorICAgIHsKKyAgICAgICAgdHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUU7CisgICAgfQorCisgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAoaGFsU3RhdHVzID0gaGFsVHhGcmFtZSggcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UxNikgZnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsLy9TTUFDX1NXQkRfVFhfVElEX01HTVRfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UeENvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRCQVJzcEJ1ZmZlciwgdHhGbGFnICkpKQorICB7CisgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICBGTCggImhhbFR4RnJhbWUgRkFJTEVEISBTdGF0dXMgWyVkXVxuIiApLAorICAgICAgICBoYWxTdGF0dXMgKTsKKworICAgIC8vIEZJWE1FIC0gSEFMIGVycm9yIGNvZGVzIGFyZSBkaWZmZXJlbnQgZnJvbSBQRSBlcnJvcgorICAgIC8vIGNvZGVzISEgQW5kLCB0aGlzIHJvdXRpbmUgaXMgcmV0dXJuaW5nIHRTaXJSZXRTdGF0dXMKKyAgICBzdGF0dXNDb2RlID0gZVNJUl9GQUlMVVJFOworICAgIC8vUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrCisgICAgcmV0dXJuIHN0YXR1c0NvZGU7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKKyAgICByZXR1cm5BZnRlckVycm9yOgorCisgICAgICAvLyBSZWxlYXNlIGJ1ZmZlciwgaWYgYWxsb2NhdGVkCisgICAgICBpZiggTlVMTCAhPSBwQWRkQkFSc3BCdWZmZXIgKQorICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgKHZvaWQgKikgcEFkZEJBUnNwQnVmZmVyLAorICAgICAgICAgICAgKHZvaWQgKikgcFBhY2tldCApOworCisgICAgICByZXR1cm4gc3RhdHVzQ29kZTsKK30KKworLyoqCisgKiBcYnJpZWYgU2VuZCBhIERFTEJBIEluZGljYXRpb24gQWN0aW9uIEZyYW1lIHRvIHBlZXIKKyAqCisgKiBcc2EgbGltU2VuZERlbEJBSW5kCisgKgorICogXHBhcmFtIHBNYWMgVGhlIGdsb2JhbCB0cEFuaVNpckdsb2JhbCBvYmplY3QKKyAqCisgKiBccGFyYW0gcGVlck1hY0FkZHIgTUFDIEFkZHJlc3Mgb2YgcGVlcgorICoKKyAqIFxwYXJhbSByZWFzb25Db2RlIFJlYXNvbiBmb3IgdGhlIERFTEJBIG5vdGlmaWNhdGlvbgorICoKKyAqIFxwYXJhbSBwQkFQYXJhbWV0ZXJTZXQgVGhlIERFTEJBIFBhcmFtZXRlciBTZXQuCisgKiBUaGlzIGlkZW50aWZpZXMgdGhlIFRJRCBmb3Igd2hpY2ggdGhlIEJBIHNlc3Npb24gaXMKKyAqIGJlaW5nIGRlbGV0ZWQuCisgKgorICogXHJldHVybiBlU0lSX1NVQ0NFU1MgaWYgc2V0dXAgY29tcGxldGVzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICBlU0lSX0ZBSUxVUkUgaXMgc29tZSBwcm9ibGVtIGlzIGVuY291bnRlcmVkCisgKi8KK3RTaXJSZXRTdGF0dXMgbGltU2VuZERlbEJBSW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRwTGltTWxtRGVsQkFSZXEgcE1sbURlbEJBUmVxLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdERvdDExZkRlbEJBSW5kIGZybURlbEJBSW5kOworICAgIHRBTklfVTggKnBEZWxCQUluZEJ1ZmZlciA9IE5VTEw7CisgICAgLy90QU5JX1UzMiB2YWw7CisgICAgdHBTaXJNYWNNZ210SGRyIHBNYWNIZHI7CisgICAgdEFOSV9VMzIgZnJhbWVMZW4gPSAwLCBuU3RhdHVzLCBuUGF5bG9hZDsKKyAgICB0U2lyUmV0U3RhdHVzIHN0YXR1c0NvZGU7CisgICAgZUhhbFN0YXR1cyBoYWxTdGF0dXM7CisgICAgdm9pZCAqcFBhY2tldDsKKyAgICB0QU5JX1U4IHR4RmxhZyA9IDA7CisKKyAgICAgaWYoTlVMTCA9PSBwc2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSAmZnJtRGVsQkFJbmQsIHNpemVvZiggZnJtRGVsQkFJbmQgKSk7CisKKyAgICAgIC8vIENhdGVnb3J5IC0gMyAoQkEpCisgICAgICBmcm1EZWxCQUluZC5DYXRlZ29yeS5jYXRlZ29yeSA9IFNJUl9NQUNfQUNUSU9OX0JMS0FDSzsKKyAgICAgIC8vIEFjdGlvbiAtIDIgKERFTEJBKQorICAgICAgZnJtRGVsQkFJbmQuQWN0aW9uLmFjdGlvbiA9IFNJUl9NQUNfQkxLQUNLX0RFTDsKKworICAgICAgLy8gRmlsbCB0aGUgREVMQkEgUGFyYW1ldGVyIFNldCBhcyBwcm92aWRlZCBieSBjYWxsZXIKKyAgICAgIGZybURlbEJBSW5kLkRlbEJBUGFyYW1ldGVyU2V0LnRpZCA9IHBNbG1EZWxCQVJlcS0+YmFUSUQ7CisgICAgICBmcm1EZWxCQUluZC5EZWxCQVBhcmFtZXRlclNldC5pbml0aWF0b3IgPSBwTWxtRGVsQkFSZXEtPmJhRGlyZWN0aW9uOworCisgICAgICAvLyBCQSBTdGFydGluZyBTZXF1ZW5jZSBOdW1iZXIKKyAgICAgIC8vIEZyYWdtZW50IG51bWJlciB3aWxsIGFsd2F5cyBiZSB6ZXJvCisgICAgICBmcm1EZWxCQUluZC5SZWFzb24uY29kZSA9IHBNbG1EZWxCQVJlcS0+ZGVsQkFSZWFzb25Db2RlOworCisgICAgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkRGVsQkFJbmRTaXplKCBwTWFjLCAmZnJtRGVsQkFJbmQsICZuUGF5bG9hZCApOworCisgICAgICBpZiggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApKQorICAgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgICAgICBGTCggIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGZvciAiCisgICAgICAgICAgICAgICJhbiBERUxCQSBJbmRpY2F0aW9uICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICBuU3RhdHVzICk7CisKKyAgICAgICAgLy8gV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOgorICAgICAgICBuUGF5bG9hZCA9IHNpemVvZiggdERvdDExZkRlbEJBSW5kICk7CisgICAgICB9CisgICAgICBlbHNlIGlmKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkpCisgICAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgIEZMKCAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBjYWxjdWxhdGluZyIKKyAgICAgICAgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYW4gREVMQkEgSW5kICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICB9CisKKyAgICAgIC8vIEFkZCB0aGUgTUdNVCBoZWFkZXIgdG8gZnJhbWUgbGVuZ3RoCisgICAgICBmcmFtZUxlbiA9IG5QYXlsb2FkICsgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApOworCisgICAgICAvLyBBbGxvY2F0ZSBzaGFyZWQgbWVtb3J5CisgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgICAgIChoYWxTdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UxNikgZnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJnBEZWxCQUluZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcFBhY2tldCApKSkKKyAgICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgIEZMKCJwYWxQa3RBbGxvYyBGQUlMRUQhIExlbmd0aCBbJWRdLCBTdGF0dXMgWyVkXVxuIiksCisgICAgICAgICAgICBmcmFtZUxlbiwKKyAgICAgICAgICAgIGhhbFN0YXR1cyApOworCisgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgICAgIGdvdG8gcmV0dXJuQWZ0ZXJFcnJvcjsKKyAgICAgIH0KKworICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcERlbEJBSW5kQnVmZmVyLCBmcmFtZUxlbiApOworCisgICAgICAvLyBDb3B5IG5lY2Vzc2FyeSBpbmZvIHRvIEJECisgICAgICBpZiggZVNJUl9TVUNDRVNTICE9CisgICAgICAgICAgKHN0YXR1c0NvZGUgPSBsaW1Qb3B1bGF0ZU1hY0hlYWRlciggcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxCQUluZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUdNVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUdNVF9BQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWxtRGVsQkFSZXEtPnBlZXJNYWNBZGRyLHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyKSkpCisgICAgICAgIGdvdG8gcmV0dXJuQWZ0ZXJFcnJvcjsKKworICAgICAgLy8gVXBkYXRlIEEzIHdpdGggdGhlIEJTU0lECisgICAgICBwTWFjSGRyID0gKCB0cFNpck1hY01nbXRIZHIgKSBwRGVsQkFJbmRCdWZmZXI7CisgICAgICAKKyAgICAgICNpZiAwCisgICAgICBjZmdMZW4gPSBTSVJfTUFDX0FERFJfTEVOR1RIOworICAgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSBjZmdHZXRTdHIoIHBNYWMsCisgICAgICAgICAgICBXTklfQ0ZHX0JTU0lELAorICAgICAgICAgICAgKHRBTklfVTggKikgcE1hY0hkci0+YnNzSWQsCisgICAgICAgICAgICAmY2ZnTGVuICkpCisgICAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgIEZMKCAiRmFpbGVkIHRvIHJldHJpZXZlIFdOSV9DRkdfQlNTSUQgd2hpbGUiCisgICAgICAgICAgICAgICJzZW5kaW5nIGFuIEFDVElPTiBGcmFtZVxuIiApKTsKKworICAgICAgICAvLyBGSVhNRSAtIE5lZWQgdG8gY29udmVydCB0byB0U2lyUmV0U3RhdHVzCisgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gcmV0dXJuQWZ0ZXJFcnJvcjsKKyAgICAgIH0KKyAgICAgICNlbmRpZiAvL1RPIFNVUFBPUlQgQlQtQU1QCisgICAgICBzaXJDb3B5TWFjQWRkcihwTWFjSGRyLT5ic3NJZCxwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisKKyAgICAgIC8vIE5vdywgd2UncmUgcmVhZHkgdG8gInBhY2siIHRoZSBmcmFtZXMKKyAgICAgIG5TdGF0dXMgPSBkb3QxMWZQYWNrRGVsQkFJbmQoIHBNYWMsCisgICAgICAgICAgJmZybURlbEJBSW5kLAorICAgICAgICAgIHBEZWxCQUluZEJ1ZmZlciArIHNpemVvZiggdFNpck1hY01nbXRIZHIgKSwKKyAgICAgICAgICBuUGF5bG9hZCwKKyAgICAgICAgICAmblBheWxvYWQgKTsKKworICAgICAgaWYoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSkKKyAgICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoICJGYWlsZWQgdG8gcGFjayBhbiBERUxCQSBJbmQgKDB4JTA4eCkuXG4iICksCisgICAgICAgICAgICBuU3RhdHVzICk7CisKKyAgICAgICAgLy8gRklYTUUgLSBOZWVkIHRvIGNvbnZlcnQgdG8gdFNpclJldFN0YXR1cworICAgICAgICBzdGF0dXNDb2RlID0gZVNJUl9GQUlMVVJFOworICAgICAgICBnb3RvIHJldHVybkFmdGVyRXJyb3I7CisgICAgICB9CisgICAgICBlbHNlIGlmKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkpCisgICAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgIEZMKCAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIGFuIERFTEJBIEluZCAoMHglMDh4KS5cbiIgKSk7CisgICAgICB9CisKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICBGTCggIlNlbmRpbmcgYSBERUxCQSBJTkQgdG8gXG4iICkpOworICAgICAgbGltUHJpbnRNYWNBZGRyKCBwTWFjLCBwTWxtRGVsQkFSZXEtPnBlZXJNYWNBZGRyLCBMT0dXICk7CisKKyAgICBpZiggKCBTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgfHwgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSApIHx8CisgICAgICAgICAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisjZW5kaWYKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgIH0KKworICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgKGhhbFN0YXR1cyA9IGhhbFR4RnJhbWUoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMTYpIGZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTklfVFhESVJfVE9EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LC8vU01BQ19TV0JEX1RYX1RJRF9NR01UX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltVHhDb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsQkFJbmRCdWZmZXIsIHR4RmxhZyApKSkKKyAgeworICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiaGFsVHhGcmFtZSBGQUlMRUQhIFN0YXR1cyBbJWRdXG4iICksIGhhbFN0YXR1cyApOykKKyAgICBzdGF0dXNDb2RlID0gZVNJUl9GQUlMVVJFOworICAgIC8vUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrCisgICAgcmV0dXJuIHN0YXR1c0NvZGU7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKKyAgICByZXR1cm5BZnRlckVycm9yOgorCisgICAgICAvLyBSZWxlYXNlIGJ1ZmZlciwgaWYgYWxsb2NhdGVkCisgICAgICBpZiggTlVMTCAhPSBwRGVsQkFJbmRCdWZmZXIgKQorICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgKHZvaWQgKikgcERlbEJBSW5kQnVmZmVyLAorICAgICAgICAgICAgKHZvaWQgKikgcFBhY2tldCApOworCisgICAgICByZXR1cm4gc3RhdHVzQ29kZTsKK30KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorCisvKioKKyAqIFxicmllZiBTZW5kIGEgTmVpZ2hib3IgUmVwb3J0IFJlcXVlc3QgQWN0aW9uIGZyYW1lCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogXHBhcmFtIHBOZWlnaGJvclJlcSBBZGRyZXNzIG9mIGEgdFNpck1hY05laWdoYm9yUmVwb3J0UmVxCisgKgorICogXHBhcmFtIHBlZXIgbWFjIGFkZHJlc3Mgb2YgcGVlciBzdGF0aW9uLgorICoKKyAqIFxwYXJhbSBwc2Vzc2lvbkVudHJ5IGFkZHJlc3Mgb2Ygc2Vzc2lvbiBlbnRyeS4KKyAqCisgKiBccmV0dXJuIGVTSVJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlU0lSX0ZBSUxVUkUgZWxzZQorICoKKyAqCisgKi8KKwordFNpclJldFN0YXR1cworbGltU2VuZE5laWdoYm9yUmVwb3J0UmVxdWVzdEZyYW1lKHRwQW5pU2lyR2xvYmFsICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICB0cFNpck1hY05laWdoYm9yUmVwb3J0UmVxIHBOZWlnaGJvclJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgICAgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeQorICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICB0U2lyUmV0U3RhdHVzIHN0YXR1c0NvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICB0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0IGZybTsKKyAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgKnBGcmFtZTsKKyAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgICBwTWFjSGRyOworICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1czsKKyAgIHZvaWQgICAgICAgICAgICAgICAqcFBhY2tldDsKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgaGFsc3RhdHVzOworICAgdEFOSV9VOCAgICAgICAgICAgICB0eEZsYWcgPSAwOworCisgICBpZiAoIHBzZXNzaW9uRW50cnkgPT0gTlVMTCApCisgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCIocHNlc3Npb24gPT0gTlVMTCkgaW4gUmVxdWVzdCB0byBzZW5kIE5laWdoYm9yIFJlcG9ydCByZXF1ZXN0IGFjdGlvbiBmcmFtZVxuIikgKTsKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICB9CisgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmZnJtLCBzaXplb2YoIGZybSApICk7CisKKyAgIGZybS5DYXRlZ29yeS5jYXRlZ29yeSA9IFNJUl9NQUNfQUNUSU9OX1JSTTsKKyAgIGZybS5BY3Rpb24uYWN0aW9uICAgICA9IFNJUl9NQUNfUlJNX05FSUdIQk9SX1JFUTsKKyAgIGZybS5EaWFsb2dUb2tlbi50b2tlbiA9IHBOZWlnaGJvclJlcS0+ZGlhbG9nVG9rZW47CisKKworICAgaWYoIHBOZWlnaGJvclJlcS0+c3NpZF9wcmVzZW50ICkKKyAgIHsKKyAgICAgIFBvcHVsYXRlRG90MTFmU1NJRCggcE1hYywgJnBOZWlnaGJvclJlcS0+c3NpZCwgJmZybS5TU0lEICk7CisgICB9CisKKyAgIG5TdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWROZWlnaGJvclJlcG9ydFJlcXVlc3RTaXplKCBwTWFjLCAmZnJtLCAmblBheWxvYWQgKTsKKyAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisgICAgICAgICAgICAgICAib3IgYSBOZWlnaGJvciBSZXBvcnQgUmVxdWVzdCgweCUwOHgpLlxuIiksCisgICAgICAgICAgICBuU3RhdHVzICk7CisgICAgICAvLyBXZSdsbCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW86CisgICAgICBuUGF5bG9hZCA9IHNpemVvZiggdERvdDExZk5laWdoYm9yUmVwb3J0UmVxdWVzdCApOworICAgfQorICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIgorICAgICAgICAgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBOZWlnaGJvciBSZXAiCisgICAgICAgICAgICAgICAib3J0IFJlcXVlc3QoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICB9CisKKyAgIG5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApOworCisgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBOZWlnaGJvciAiCisgICAgICAgICAgICAgICAiUmVwb3J0IFJlcXVlc3QuXG4iKSwgbkJ5dGVzICk7CisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorCisgICAvLyBQYXJhbm9pYToKKyAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgIC8vIENvcHkgbmVjZXNzYXJ5IGluZm8gdG8gQkQKKyAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0KKyAgICAgICAgIChzdGF0dXNDb2RlID0gbGltUG9wdWxhdGVNYWNIZWFkZXIoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01HTVRfQUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyLCBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcikpKQorICAgICAgZ290byByZXR1cm5BZnRlckVycm9yOworCisgICAvLyBVcGRhdGUgQTMgd2l0aCB0aGUgQlNTSUQKKyAgIHBNYWNIZHIgPSAoIHRwU2lyTWFjTWdtdEhkciApIHBGcmFtZTsKKworICAgc2lyQ29weU1hY0FkZHIoIHBNYWNIZHItPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCApOworCisgICAvLyBOb3csIHdlJ3JlIHJlYWR5IHRvICJwYWNrIiB0aGUgZnJhbWVzCisgICBuU3RhdHVzID0gZG90MTFmUGFja05laWdoYm9yUmVwb3J0UmVxdWVzdCggcE1hYywKKyAgICAgICAgICZmcm0sCisgICAgICAgICBwRnJhbWUgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICksCisgICAgICAgICBuUGF5bG9hZCwKKyAgICAgICAgICZuUGF5bG9hZCApOworCisgICBpZiggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApKQorICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoICJGYWlsZWQgdG8gcGFjayBhbiBOZWlnaGJvciBSZXBvcnQgUmVxdWVzdCAoMHglMDh4KS5cbiIgKSwKKyAgICAgICAgICAgIG5TdGF0dXMgKTsKKworICAgICAgLy8gRklYTUUgLSBOZWVkIHRvIGNvbnZlcnQgdG8gdFNpclJldFN0YXR1cworICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfRkFJTFVSRTsKKyAgICAgIGdvdG8gcmV0dXJuQWZ0ZXJFcnJvcjsKKyAgIH0KKyAgIGVsc2UgaWYoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgIEZMKCAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIE5laWdoYm9yIFJlcG9ydCBSZXF1ZXN0ICgweCUwOHgpLlxuIiApKTsKKyAgIH0KKworICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgRkwoICJTZW5kaW5nIGEgTmVpZ2hib3IgUmVwb3J0IFJlcXVlc3QgdG8gXG4iICkpOworICAgbGltUHJpbnRNYWNBZGRyKCBwTWFjLCBwZWVyLCBMT0dXICk7CisKKyAgICBpZiggKCBTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgfHwgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSApIHx8CisgICAgICAgICAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisjZW5kaWYKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgIH0KKworICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0KKyAgICAgICAgIChoYWxzdGF0dXMgPSBoYWxUeEZyYW1lKCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTE2KSBuQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsLy9TTUFDX1NXQkRfVFhfVElEX01HTVRfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UeENvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZSwgdHhGbGFnICkpKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJoYWxUeEZyYW1lIEZBSUxFRCEgU3RhdHVzIFslZF1cbiIgKSwgaGFsc3RhdHVzICk7KQorICAgICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfRkFJTFVSRTsKKyAgICAgIC8vUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrCisgICAgICByZXR1cm4gc3RhdHVzQ29kZTsKKyAgIH0KKyAgIGVsc2UKKyAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK3JldHVybkFmdGVyRXJyb3I6CisgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisKKyAgIHJldHVybiBzdGF0dXNDb2RlOworfSAvLyBFbmQgbGltU2VuZE5laWdoYm9yUmVwb3J0UmVxdWVzdEZyYW1lLgorCisvKioKKyAqIFxicmllZiBTZW5kIGEgTGluayBSZXBvcnQgQWN0aW9uIGZyYW1lCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogXHBhcmFtIHBMaW5rUmVwb3J0IEFkZHJlc3Mgb2YgYSB0U2lyTWFjTGlua1JlcG9ydAorICoKKyAqIFxwYXJhbSBwZWVyIG1hYyBhZGRyZXNzIG9mIHBlZXIgc3RhdGlvbi4KKyAqCisgKiBccGFyYW0gcHNlc3Npb25FbnRyeSBhZGRyZXNzIG9mIHNlc3Npb24gZW50cnkuCisgKgorICogXHJldHVybiBlU0lSX1NVQ0NFU1Mgb24gc3VjY2VzcywgZVNJUl9GQUlMVVJFIGVsc2UKKyAqCisgKgorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbVNlbmRMaW5rUmVwb3J0QWN0aW9uRnJhbWUodHBBbmlTaXJHbG9iYWwgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjTGlua1JlcG9ydCBwTGlua1JlcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgICAgICAgICAgICAgICAgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeQorICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICB0U2lyUmV0U3RhdHVzIHN0YXR1c0NvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICB0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0IGZybTsKKyAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgKnBGcmFtZTsKKyAgIHRwU2lyTWFjTWdtdEhkciAgICAgICAgICBwTWFjSGRyOworICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzLCBuUGF5bG9hZCwgblN0YXR1czsKKyAgIHZvaWQgICAgICAgICAgICAgICAqcFBhY2tldDsKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgaGFsc3RhdHVzOworICAgdEFOSV9VOCAgICAgICAgICAgICB0eEZsYWcgPSAwOworCisKKyAgIGlmICggcHNlc3Npb25FbnRyeSA9PSBOVUxMICkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIihwc2Vzc2lvbiA9PSBOVUxMKSBpbiBSZXF1ZXN0IHRvIHNlbmQgTGluayBSZXBvcnQgYWN0aW9uIGZyYW1lXG4iKSApOworICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKworICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJmZybSwgc2l6ZW9mKCBmcm0gKSApOworCisgICBmcm0uQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9SUk07CisgICBmcm0uQWN0aW9uLmFjdGlvbiAgICAgPSBTSVJfTUFDX1JSTV9MSU5LX01FQVNVUkVNRU5UX1JQVDsKKyAgIGZybS5EaWFsb2dUb2tlbi50b2tlbiA9IHBMaW5rUmVwb3J0LT5kaWFsb2dUb2tlbjsKKworCisgICAvL0lFRUUgU3RkLiA4MDIuMTEgNy4zLjIuMTguIGZvciB0aGUgcmVwb3J0IGVsZW1lbnQuCisgICAvL0V2ZW4gdGhvdWdoIFRQQyByZXBvcnQgYW4gSUUsIGl0IGlzIHJlcHJlc2VudGVkIHVzaW5nIGZpeGVkIGZpZWxkcyBzaW5jZSBpdCBpcyBwb3NpdGlvbmVkCisgICAvL2luIHRoZSBtaWRkbGUgb2Ygb3RoZXIgZml4ZWQgZmllbGRzIGluIHRoZSBsaW5rIHJlcG9ydCBmcmFtZShJRUVFIFN0ZC4gODAyLjExayBzZWN0aW9uNy40LjYuNAorICAgLy9hbmQgZnJhbWUgcGFyc2VyIGFsd2F5cyBleHBlY3RzIElFcyB0byBjb21lIGFmdGVyIGFsbCBmaXhlZCBmaWVsZHMuIEl0IGlzIGVhc2llciB0byBoYW5kbGUgCisgICAvL3N1Y2ggY2FzZSB0aGlzIHdheSB0aGFuIGNoYW5naW5nIHRoZSBmcmFtZSBwYXJzZXIuCisgICBmcm0uVFBDRWxlSUQuVFBDSWQgPSBTSVJfTUFDX1RQQ19SUFRfRUlEOyAKKyAgIGZybS5UUENFbGVMZW4uVFBDTGVuID0gMjsKKyAgIGZybS5UeFBvd2VyLnR4UG93ZXIgPSBwTGlua1JlcG9ydC0+dHhQb3dlcjsKKyAgIGZybS5MaW5rTWFyZ2luLmxpbmtNYXJnaW4gPSAwOworCisgICBmcm0uUnhBbnRlbm5hSWQuYW50ZW5uYUlkID0gcExpbmtSZXBvcnQtPnJ4QW50ZW5uYTsKKyAgIGZybS5UeEFudGVubmFJZC5hbnRlbm5hSWQgPSBwTGlua1JlcG9ydC0+dHhBbnRlbm5hOworICAgZnJtLlJDUEkucmNwaSA9IHBMaW5rUmVwb3J0LT5yY3BpOworICAgZnJtLlJTTkkucnNuaSA9IHBMaW5rUmVwb3J0LT5yc25pOworCisgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkTGlua01lYXN1cmVtZW50UmVwb3J0U2l6ZSggcE1hYywgJmZybSwgJm5QYXlsb2FkICk7CisgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWNrZWQgc2l6ZSBmIgorICAgICAgICAgICAgICAgIm9yIGEgTGluayBSZXBvcnQgKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgIC8vIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzoKKyAgICAgIG5QYXlsb2FkID0gc2l6ZW9mKCB0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0ICk7CisgICB9CisgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmciCisgICAgICAgICAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIExpbmsgUmVwIgorICAgICAgICAgICAgICAgIm9ydCAoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICB9CisKKyAgIG5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApOworCisgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBMaW5rICIKKyAgICAgICAgICAgICAgICJSZXBvcnQuXG4iKSwgbkJ5dGVzICk7CisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorCisgICAvLyBQYXJhbm9pYToKKyAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgIC8vIENvcHkgbmVjZXNzYXJ5IGluZm8gdG8gQkQKKyAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0KKyAgICAgICAgIChzdGF0dXNDb2RlID0gbGltUG9wdWxhdGVNYWNIZWFkZXIoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01HTVRfQUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyLCBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcikpKQorICAgICAgZ290byByZXR1cm5BZnRlckVycm9yOworCisgICAvLyBVcGRhdGUgQTMgd2l0aCB0aGUgQlNTSUQKKyAgIHBNYWNIZHIgPSAoIHRwU2lyTWFjTWdtdEhkciApIHBGcmFtZTsKKworICAgc2lyQ29weU1hY0FkZHIoIHBNYWNIZHItPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCApOworCisgICAvLyBOb3csIHdlJ3JlIHJlYWR5IHRvICJwYWNrIiB0aGUgZnJhbWVzCisgICBuU3RhdHVzID0gZG90MTFmUGFja0xpbmtNZWFzdXJlbWVudFJlcG9ydCggcE1hYywKKyAgICAgICAgICZmcm0sCisgICAgICAgICBwRnJhbWUgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICksCisgICAgICAgICBuUGF5bG9hZCwKKyAgICAgICAgICZuUGF5bG9hZCApOworCisgICBpZiggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApKQorICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoICJGYWlsZWQgdG8gcGFjayBhbiBMaW5rIFJlcG9ydCAoMHglMDh4KS5cbiIgKSwKKyAgICAgICAgICAgIG5TdGF0dXMgKTsKKworICAgICAgLy8gRklYTUUgLSBOZWVkIHRvIGNvbnZlcnQgdG8gdFNpclJldFN0YXR1cworICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfRkFJTFVSRTsKKyAgICAgIGdvdG8gcmV0dXJuQWZ0ZXJFcnJvcjsKKyAgIH0KKyAgIGVsc2UgaWYoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgIEZMKCAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIExpbmsgUmVwb3J0ICgweCUwOHgpLlxuIiApKTsKKyAgIH0KKworICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgRkwoICJTZW5kaW5nIGEgTGluayBSZXBvcnQgdG8gXG4iICkpOworICAgbGltUHJpbnRNYWNBZGRyKCBwTWFjLCBwZWVyLCBMT0dXICk7CisKKyAgICBpZiggKCBTSVJfQkFORF81X0dIWiA9PSBsaW1HZXRSRkJhbmQocHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKSkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgfHwgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSApIHx8CisgICAgICAgICAoIHBzZXNzaW9uRW50cnktPnBlUGVyc29uYSA9PSBWT1NfUDJQX0dPX01PREUpCisjZW5kaWYKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgIH0KKworICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0KKyAgICAgICAgIChoYWxzdGF0dXMgPSBoYWxUeEZyYW1lKCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTE2KSBuQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsLy9TTUFDX1NXQkRfVFhfVElEX01HTVRfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UeENvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZSwgdHhGbGFnICkpKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgRkwoICJoYWxUeEZyYW1lIEZBSUxFRCEgU3RhdHVzIFslZF1cbiIgKSwgaGFsc3RhdHVzICk7KQorICAgICAgICAgc3RhdHVzQ29kZSA9IGVTSVJfRkFJTFVSRTsKKyAgICAgIC8vUGt0IHdpbGwgYmUgZnJlZWQgdXAgYnkgdGhlIGNhbGxiYWNrCisgICAgICByZXR1cm4gc3RhdHVzQ29kZTsKKyAgIH0KKyAgIGVsc2UKKyAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK3JldHVybkFmdGVyRXJyb3I6CisgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisKKyAgIHJldHVybiBzdGF0dXNDb2RlOworfSAvLyBFbmQgbGltU2VuZExpbmtSZXBvcnRBY3Rpb25GcmFtZS4KKworLyoqCisgKiBcYnJpZWYgU2VuZCBhIEJlYWNvbiBSZXBvcnQgQWN0aW9uIGZyYW1lCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogXHBhcmFtIGRpYWxvZ190b2tlbiBkaWFsb2cgdG9rZW4gdG8gYmUgdXNlZCBpbiB0aGUgYWN0aW9uIGZyYW1lLgorICoKKyAqIFxwYXJhbSBudW1fcmVwb3J0IG51bWJlciBvZiByZXBvcnRzIGluIHBSUk1SZXBvcnQuCisgKgorICogXHBhcmFtIHBSUk1SZXBvcnQgQWRkcmVzcyBvZiBhIHRTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQuCisgKgorICogXHBhcmFtIHBlZXIgbWFjIGFkZHJlc3Mgb2YgcGVlciBzdGF0aW9uLgorICoKKyAqIFxwYXJhbSBwc2Vzc2lvbkVudHJ5IGFkZHJlc3Mgb2Ygc2Vzc2lvbiBlbnRyeS4KKyAqCisgKiBccmV0dXJuIGVTSVJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlU0lSX0ZBSUxVUkUgZWxzZQorICoKKyAqCisgKi8KKwordFNpclJldFN0YXR1cworbGltU2VuZFJhZGlvTWVhc3VyZVJlcG9ydEFjdGlvbkZyYW1lKHRwQW5pU2lyR2xvYmFsICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICBkaWFsb2dfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICAgICAgICAgICAgIG51bV9yZXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjUmFkaW9NZWFzdXJlUmVwb3J0IHBSUk1SZXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyICAgICAgICAgICAgICAgIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgdFNpclJldFN0YXR1cyBzdGF0dXNDb2RlID0gZVNJUl9TVUNDRVNTOworICAgdERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXBvcnQgZnJtOworICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAqcEZyYW1lOworICAgdHBTaXJNYWNNZ210SGRyICAgICAgICAgIHBNYWNIZHI7CisgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgICBuQnl0ZXMsIG5QYXlsb2FkLCBuU3RhdHVzOworICAgdm9pZCAgICAgICAgICAgICAgICpwUGFja2V0OworICAgZUhhbFN0YXR1cyAgICAgICAgICBoYWxzdGF0dXM7CisgICB0QU5JX1U4ICAgICAgICAgICAgIGk7CisgICB0QU5JX1U4ICAgICAgICAgICAgIHR4RmxhZyA9IDA7CisKKyAgIGlmICggcHNlc3Npb25FbnRyeSA9PSBOVUxMICkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIihwc2Vzc2lvbiA9PSBOVUxMKSBpbiBSZXF1ZXN0IHRvIHNlbmQgQmVhY29uIFJlcG9ydCBhY3Rpb24gZnJhbWVcbiIpICk7CisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJmZybSwgc2l6ZW9mKCBmcm0gKSApOworCisgICBmcm0uQ2F0ZWdvcnkuY2F0ZWdvcnkgPSBTSVJfTUFDX0FDVElPTl9SUk07CisgICBmcm0uQWN0aW9uLmFjdGlvbiAgICAgPSBTSVJfTUFDX1JSTV9SQURJT19NRUFTVVJFX1JQVDsKKyAgIGZybS5EaWFsb2dUb2tlbi50b2tlbiA9IGRpYWxvZ190b2tlbjsKKworICAgZnJtLm51bV9NZWFzdXJlbWVudFJlcG9ydCA9IChudW1fcmVwb3J0ID4gUkFESU9fUkVQT1JUU19NQVhfSU5fQV9GUkFNRSApID8gUkFESU9fUkVQT1JUU19NQVhfSU5fQV9GUkFNRSAgOiBudW1fcmVwb3J0OworCisgICBmb3IoIGkgPSAwIDsgaSA8IGZybS5udW1fTWVhc3VyZW1lbnRSZXBvcnQgOyBpKysgKQorICAgeworICAgICAgZnJtLk1lYXN1cmVtZW50UmVwb3J0W2ldLnR5cGUgPSBwUlJNUmVwb3J0W2ldLnR5cGU7CisgICAgICBmcm0uTWVhc3VyZW1lbnRSZXBvcnRbaV0udG9rZW4gPSBwUlJNUmVwb3J0W2ldLnRva2VuOworICAgICAgZnJtLk1lYXN1cmVtZW50UmVwb3J0W2ldLmxhdGUgPSAwOyAvL0lFRUUgODAyLjExayBzZWN0aW9uIDcuMy4yMi4gKGFsd2F5cyB6ZXJvIGluIHJybSkKKyAgICAgIHN3aXRjaCggcFJSTVJlcG9ydFtpXS50eXBlICkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgU0lSX01BQ19SUk1fQkVBQ09OX1RZUEU6CisgICAgICAgICAgICBQb3B1bGF0ZURvdDExZkJlYWNvblJlcG9ydCggcE1hYywgJmZybS5NZWFzdXJlbWVudFJlcG9ydFtpXSwgJnBSUk1SZXBvcnRbaV0ucmVwb3J0LmJlYWNvblJlcG9ydCApOworICAgICAgICAgICAgZnJtLk1lYXN1cmVtZW50UmVwb3J0W2ldLmluY2FwYWJsZSA9IHBSUk1SZXBvcnRbaV0uaW5jYXBhYmxlOworICAgICAgICAgICAgZnJtLk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlZnVzZWQgPSBwUlJNUmVwb3J0W2ldLnJlZnVzZWQ7CisgICAgICAgICAgICBmcm0uTWVhc3VyZW1lbnRSZXBvcnRbaV0ucHJlc2VudCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcm0uTWVhc3VyZW1lbnRSZXBvcnRbaV0ucHJlc2VudCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgblN0YXR1cyA9IGRvdDExZkdldFBhY2tlZFJhZGlvTWVhc3VyZW1lbnRSZXBvcnRTaXplKCBwTWFjLCAmZnJtLCAmblBheWxvYWQgKTsKKyAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisgICAgICAgICAgICAgICAib3IgYSBSYWRpbyBNZWFzdXJlIFJlcG9ydCAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgLy8gV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOgorICAgICAgblBheWxvYWQgPSBzaXplb2YoIHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQgKTsKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICB9CisgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgY2FsY3VsYXRpbmciCisgICAgICAgICAgICAgICAidGhlIHBhY2tlZCBzaXplIGZvciBhIFJhZGlvIE1lYXN1cmUgUmVwIgorICAgICAgICAgICAgICAgIm9ydCAoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICB9CisKKyAgIG5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApOworCisgICBoYWxzdGF0dXMgPSBwYWxQa3RBbGxvYyggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHRBTklfVTE2ICluQnl0ZXMsICggdm9pZCoqICkgJnBGcmFtZSwgKCB2b2lkKiogKSAmcFBhY2tldCApOworICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyAoIGhhbHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgYSBSYWRpbyBNZWFzdXJlICIKKyAgICAgICAgICAgICAgICJSZXBvcnQuXG4iKSwgbkJ5dGVzICk7CisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorCisgICAvLyBQYXJhbm9pYToKKyAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgIC8vIENvcHkgbmVjZXNzYXJ5IGluZm8gdG8gQkQKKyAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0KKyAgICAgICAgIChzdGF0dXNDb2RlID0gbGltUG9wdWxhdGVNYWNIZWFkZXIoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01HTVRfQUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyLCBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcikpKQorICAgICAgZ290byByZXR1cm5BZnRlckVycm9yOworCisgICAvLyBVcGRhdGUgQTMgd2l0aCB0aGUgQlNTSUQKKyAgIHBNYWNIZHIgPSAoIHRwU2lyTWFjTWdtdEhkciApIHBGcmFtZTsKKworICAgc2lyQ29weU1hY0FkZHIoIHBNYWNIZHItPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCApOworCisgICAvLyBOb3csIHdlJ3JlIHJlYWR5IHRvICJwYWNrIiB0aGUgZnJhbWVzCisgICBuU3RhdHVzID0gZG90MTFmUGFja1JhZGlvTWVhc3VyZW1lbnRSZXBvcnQoIHBNYWMsCisgICAgICAgICAmZnJtLAorICAgICAgICAgcEZyYW1lICsgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApLAorICAgICAgICAgblBheWxvYWQsCisgICAgICAgICAmblBheWxvYWQgKTsKKworICAgaWYoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgIEZMKCAiRmFpbGVkIHRvIHBhY2sgYW4gUmFkaW8gTWVhc3VyZSBSZXBvcnQgKDB4JTA4eCkuXG4iICksCisgICAgICAgICAgICBuU3RhdHVzICk7CisKKyAgICAgIC8vIEZJWE1FIC0gTmVlZCB0byBjb252ZXJ0IHRvIHRTaXJSZXRTdGF0dXMKKyAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX0ZBSUxVUkU7CisgICAgICBnb3RvIHJldHVybkFmdGVyRXJyb3I7CisgICB9CisgICBlbHNlIGlmKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkpCisgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgICAgICBGTCggIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBSYWRpbyBNZWFzdXJlIFJlcG9ydCAoMHglMDh4KS5cbiIgKSk7CisgICB9CisKKyAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgIEZMKCAiU2VuZGluZyBhIFJhZGlvIE1lYXN1cmUgUmVwb3J0IHRvIFxuIiApKTsKKyAgIGxpbVByaW50TWFjQWRkciggcE1hYywgcGVlciwgTE9HVyApOworCisgICAgaWYoICggU0lSX0JBTkRfNV9HSFogPT0gbGltR2V0UkZCYW5kKHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCkpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgIHx8ICggcHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfQ0xJRU5UX01PREUgKSB8fAorICAgICAgICAgKCBwc2Vzc2lvbkVudHJ5LT5wZVBlcnNvbmEgPT0gVk9TX1AyUF9HT19NT0RFKQorI2VuZGlmCisgICAgICAgICApCisgICAgeworICAgICAgICB0eEZsYWcgfD0gSEFMX1VTRV9CRF9SQVRFMl9GT1JfTUFOQUdFTUVOVF9GUkFNRTsKKyAgICB9CisKKyAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAgICAoaGFsc3RhdHVzID0gaGFsVHhGcmFtZSggcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UxNikgbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTklfVFhESVJfVE9EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LC8vU01BQ19TV0JEX1RYX1RJRF9NR01UX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltVHhDb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWUsIHR4RmxhZyApKSkKKyAgIHsKKyAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiaGFsVHhGcmFtZSBGQUlMRUQhIFN0YXR1cyBbJWRdXG4iICksIGhhbHN0YXR1cyApOykKKyAgICAgICAgIHN0YXR1c0NvZGUgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAvL1BrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjaworICAgICAgcmV0dXJuIHN0YXR1c0NvZGU7CisgICB9CisgICBlbHNlCisgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCityZXR1cm5BZnRlckVycm9yOgorICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAoIHZvaWQqICkgcEZyYW1lLCAoIHZvaWQqICkgcFBhY2tldCApOworCisgICByZXR1cm4gc3RhdHVzQ29kZTsKK30gLy8gRW5kIGxpbVNlbmRCZWFjb25SZXBvcnRBY3Rpb25GcmFtZS4KKworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisvKioKKyAqIFxicmllZiBTZW5kIFNBIHF1ZXJ5IHJlc3BvbnNlIGFjdGlvbiBmcmFtZSB0byBwZWVyIAorICoKKyAqIFxzYSBsaW1TZW5kU2FRdWVyeVJlc3BvbnNlRnJhbWUKKyAqIAorICoKKyAqIFxwYXJhbSBwTWFjICAgIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIHBlZXIgICAgVGhlIE1hYyBhZGRyZXNzIG9mIHRoZSBBUCB0byB3aGljaCB0aGlzIGFjdGlvbiBmcmFtZSBpcyAKK2FkZHJlc3NlZAorICoKKyAqIFxwYXJhbSB0cmFuc0lkIFRyYW5zYWN0aW9uIGlkZW50aWZpZXIgcmVjZWl2ZWQgaW4gU0EgcXVlcnkgcmVxdWVzdCBhY3Rpb24gCitmcmFtZSAKKyAqIAorICogXHJldHVybiBlU0lSX1NVQ0NFU1MgaWYgc2V0dXAgY29tcGxldGVzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICBlU0lSX0ZBSUxVUkUgaXMgc29tZSBwcm9ibGVtIGlzIGVuY291bnRlcmVkCisgKi8KKwordFNpclJldFN0YXR1cyBsaW1TZW5kU2FRdWVyeVJlc3BvbnNlRnJhbWUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IHRyYW5zSWQsCit0U2lyTWFjQWRkciBwZWVyLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyAgIHREb3QxMXdTYVF1ZXJ5UnNwICBmcm07IC8vIFNBIHF1ZXJ5IHJlcG9uc2UgYWN0aW9uIGZyYW1lCisgICB0QU5JX1U4ICAgICAgICAgICAgKnBGcmFtZTsKKyAgIHRTaXJSZXRTdGF0dXMgICAgICBuU2lyU3RhdHVzOworICAgdHBTaXJNYWNNZ210SGRyICAgIHBNYWNIZHI7CisgICB0QU5JX1UzMiAgICAgICAgICAgbkJ5dGVzLCBuUGF5bG9hZDsKKyAgIHZvaWQgICAgICAgICAgICAgICAqcFBhY2tldDsKKyAgIGVIYWxTdGF0dXMgICAgICAgICBoYWxzdGF0dXM7CisgICAvLyBMb2NhbCB2YXJpYWJsZXMgdXNlZCB0byBkdW1wIHByZXBhcmVkIFNBIHF1ZXJ5IHJlc3BvbnNlIGZyYW1lCisgICB0QU5JX1U4ICAgICAgICAgICAgKnBEdW1wOyAKKyAgIHRBTklfVTE2ICAgICAgICAgICBkdW1wQ291bnQ7CisgICB0QU5JX1U4ICAgICAgICAgICAgIHR4RmxhZyA9IDA7CisgICAvL3RBTklfVTE2IG5CeXRlcworICAgCisgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmZnJtLCBzaXplb2YoIGZybSApICk7CisgICBmcm0uY2F0ZWdvcnkgID0gU0lSX01BQ19BQ1RJT05fU0FfUVVFUlk7CisgICAvKjExdyBhY3Rpb24gIGZpZWRsIGlzIDoKKyAgICBhY3Rpb246IDAgLS0+IFNBIHF1ZXJ5IHJlcXVlc3QgYWN0aW9uIGZyYW1lCisgICAgYWN0aW9uOiAxIC0tPiBTQSBxdWVyeSByZXNwb25zZSBhY3Rpb24gZnJhbWUgKi8gCisgICBmcm0uYWN0aW9uICAgID0gMTsKKyAgIC8qMTF3IERyYWZ0OS4wIFNBIHF1ZXJ5IHJlc3BvbnNlIHRyYW5zSWQgaXMgc2FtZSBhcworICAgICBTQSBxdWVyeSByZXF1ZXN0IHRyYW5zSWQqLworICAgZnJtLnRyYW5zSWQgICA9IHRyYW5zSWQ7CisKKyAgIG5QYXlsb2FkID0gc2l6ZW9mKHREb3QxMXdTYVF1ZXJ5UnNwKTsKKyAgIG5CeXRlcyA9IG5QYXlsb2FkICsgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApOworICAgaGFsc3RhdHVzID0gcGFsUGt0QWxsb2MoIHBNYWMtPmhIZGQsIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwgIG5CeXRlcywgKCB2b2lkKiogKSAmcEZyYW1lLCAoIHZvaWQqKiApICZwUGFja2V0ICk7CisgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTICggaGFsc3RhdHVzICkgKQorICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhIFNBIHF1ZXJ5IHJlc3BvbnNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWN0aW9uIGZyYW1lXG4iKSwgbkJ5dGVzICk7CisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorCisgICAvLyBQYXJhbm9pYToKKyAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZSwgbkJ5dGVzICk7CisKKyAgIC8vIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjoKKyAgIG5TaXJTdGF0dXMgPSBsaW1Qb3B1bGF0ZU1hY0hlYWRlciggcE1hYywgcEZyYW1lLCBTSVJfTUFDX01HTVRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUdNVF9BQ1RJT04sIHBlZXIscHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIgKTsKKyAgIGlmICggZVNJUl9TVUNDRVNTICE9IG5TaXJTdGF0dXMgKQorICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBvcHVsYXRlIHRoZSBidWZmZXIgZGVzY3JpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3IgZm9yIGEgVFBDIFJlcG9ydCAoJWQpLlxuIiksCisgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsICggdm9pZCogKSBwRnJhbWUsICggdm9pZCogKSBwUGFja2V0ICk7CisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvLyBqdXN0IGFsbG9jYXRlZC4uLgorICAgfQorCisgICBwTWFjSGRyID0gKCB0cFNpck1hY01nbXRIZHIgKSBwRnJhbWU7CisKKyAgIC8vIFBhY2sgMTF3IFNBIHF1ZXJ5IHJlc3BvbnNlIGZyYW1lCisgICBET1QxMUZfTUVNQ1BZKHBNYWMsICh0QU5JX1U4ICopKHBGcmFtZSArIHNpemVvZih0U2lyTWFjTWdtdEhkcikpLCh0QU5JX1U4ICopJmZybSwgblBheWxvYWQpOworICAgcER1bXAgPSAodEFOSV9VOCAqKSBwRnJhbWU7CisKKyAgIGhhbHN0YXR1cyA9IGhhbFR4RnJhbWUoIHBNYWMsIHBQYWNrZXQsICggdEFOSV9VMTYgKSBuQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOSV9UWERJUl9UT0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsLy9TTUFDX1NXQkRfVFhfVElEX01HTVRfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UeENvbXBsZXRlLCBwRnJhbWUsdHhGbGFnKTsKKyAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MgKCBoYWxzdGF0dXMgKSApCisgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gc2VuZCBhIFNBIFF1ZXJ5IHJlc3AgZnJhbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVYKSFcbiIpLGhhbHN0YXR1cyApOworICAgICAgICAvL1BrdCB3aWxsIGJlIGZyZWVkIHVwIGJ5IHRoZSBjYWxsYmFjaworICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsgICAgLy8ganVzdCBhbGxvY2F0ZWQuLi4KKyAgIH0KKworICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZW5kTWVzc2FnZXMuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2VuZE1lc3NhZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5NWYxZAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2VuZE1lc3NhZ2VzLmMKQEAgLTAsMCArMSw3NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBsaW1TZW5kTWVzc2FnZXMuYzogUHJvdmlkZXMgZnVuY3Rpb25zIHRvIHNlbmQgbWVzc2FnZXMgb3IgSW5kaWNhdGlvbnMgdG8gSEFMLgorICogQXV0aG9yOiAgICBTdW5pdCBCaGF0aWEKKyAqIERhdGU6ICAgICAgIDA5LzIxLzIwMDYKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgTW9kaWZpZWQgYnkgICAgICAgICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisjaW5jbHVkZSAibGltVHJhY2UuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyNpbmNsdWRlICJ2b3NfZGlhZ19jb3JlX2xvZy5oIgorI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKworLyogV2hlbiBiZWFjb24gZmlsdGVyaW5nIGlzIGVuYWJsZWQsIGZpcm13YXJlIHdpbGwKKyAqIGFuYWx5emUgdGhlIHNlbGVjdGVkIGJlYWNvbnMgcmVjZWl2ZWQgZHVyaW5nIEJNUFMsCisgKiBhbmQgbW9uaXRvciBhbnkgY2hhbmdlcyBpbiB0aGUgSUVzIGFzIGxpc3RlZCBiZWxvdy4KKyAqIFRoZSBmb3JtYXQgb2YgdGhlIHRhYmxlIGlzOgorICogICAgLSBFSUQKKyAqICAgIC0gQ2hlY2sgZm9yIElFIHByZXNlbmNlCisgKiAgICAtIEJ5dGUgb2Zmc2V0CisgKiAgICAtIEJ5dGUgdmFsdWUKKyAqICAgIC0gQml0IE1hc2sKKyAqICAgIC0gQnl0ZSByZWZyZW5jZQorICovCitzdGF0aWMgdEJlYWNvbkZpbHRlckllIGJlYWNvbkZpbHRlclRhYmxlW10gPSB7CisgICB7U0lSX01BQ19EU19QQVJBTV9TRVRfRUlELCAgICAwLCB7MCwgMCwgRFNfUEFSQU1fQ0hBTk5FTF9NQVNLLCAwfX0sCisgICB7U0lSX01BQ19FUlBfSU5GT19FSUQsICAgICAgICAwLCB7MCwgMCwgRVJQX0ZJTFRFUl9NQVNLLCAgICAgICAwfX0sCisgICB7U0lSX01BQ19FRENBX1BBUkFNX1NFVF9FSUQsICAwLCB7MCwgMCwgRURDQV9GSUxURVJfTUFTSywgICAgICAwfX0sCisgICB7U0lSX01BQ19RT1NfQ0FQQUJJTElUWV9FSUQsICAwLCB7MCwgMCwgUU9TX0ZJTFRFUl9NQVNLLCAgICAgICAwfX0sCisgICB7U0lSX01BQ19DSE5MX1NXSVRDSF9BTk5fRUlELCAxLCB7MCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAwfX0sCisgICB7U0lSX01BQ19RVUlFVF9FSUQsICAgICAgICAgICAxLCB7MCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAwfX0sCisgICB7U0lSX01BQ19IVF9JTkZPX0VJRCwgICAgICAgICAwLCB7MCwgMCwgSFRfQllURTBfRklMVEVSX01BU0ssICAwfX0sICAKKyAgIHtTSVJfTUFDX0hUX0lORk9fRUlELCAgICAgICAgIDAsIHsyLCAwLCBIVF9CWVRFMl9GSUxURVJfTUFTSywgIDB9fSwgCisgICB7U0lSX01BQ19IVF9JTkZPX0VJRCwgICAgICAgICAwLCB7NSwgMCwgSFRfQllURTVfRklMVEVSX01BU0ssICAwfX0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICx7U0lSX01BQ19QV1JfQ09OU1RSQUlOVF9FSUQsICAwLCB7MCwgMCwgMCwgMH19CisjZW5kaWYKK307CisKKworLyoqCisgKiBsaW1TZW5kQ0ZQYXJhbXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIENGUCBQYXJhbWV0ZXJzIHRvIFdEQSwgd2hlbiB0aGV5IGFyZSBjaGFuZ2VkLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgcG9pbnRlciB0byBHbG9iYWwgTWFjIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBic3NJZHggQnNzIEluZGV4IG9mIHRoZSBCU1MgdG8gd2hpY2ggU1RBIGlzIGFzc29jaWF0ZWQuCisgKiBAcGFyYW0gY2ZwQ291bnQgQ0ZQIENvdW50LCBpZiB0aGF0IGlzIGNoYW5nZWQuCisgKiBAcGFyYW0gY2ZwUGVyaW9kIENGUCBQZXJpb2QgaWYgdGhhdCBpcyBjaGFuZ2VkLgorICoKKyAqIEByZXR1cm4gc3VjY2VzcyBpZiBtZXNzYWdlIHNlbmQgaXMgb2ssIGVsc2UgZmFsc2UuCisgKi8KKwordFNpclJldFN0YXR1cyBsaW1TZW5kQ0ZQYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBic3NJZHgsIHRBTklfVTggY2ZwQ291bnQsIHRBTklfVTggY2ZwUGVyaW9kKQoreworICAgIHRwVXBkYXRlQ0ZQYXJhbXMgcENGUGFyYW1zID0gTlVMTDsKKyAgICB0U2lyUmV0U3RhdHVzICAgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0U2lyTXNnUSBtc2dROworCisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAodm9pZCAqKikgJnBDRlBhcmFtcywKKyAgICAgICAgICBzaXplb2YoIHRVcGRhdGVDRlBhcmFtcyApKSkKKyAgICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICAgICAgRkwoICJVbmFibGUgdG8gUEFMIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgVXBkYXRlIENGIFBhcmFtc1xuIiApKTsKKworICAgICAgICByZXRDb2RlID0gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgICAgICBnb3RvIHJldHVybkZhaWx1cmU7CisgICAgICB9CisKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQ0ZQYXJhbXMsIHNpemVvZih0VXBkYXRlQ0ZQYXJhbXMpKTsKKworICAgIHBDRlBhcmFtcy0+Y2ZwQ291bnQgPSBjZnBDb3VudDsKKyAgICBwQ0ZQYXJhbXMtPmNmcFBlcmlvZCA9IGNmcFBlcmlvZDsKKyAgICBwQ0ZQYXJhbXMtPmJzc0lkeCAgICAgPSBic3NJZHg7CisKKworICAgIG1zZ1EudHlwZSA9IFdEQV9VUERBVEVfQ0ZfSU5EOworICAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgIG1zZ1EuYm9keXB0ciA9IHBDRlBhcmFtczsKKyAgICBtc2dRLmJvZHl2YWwgPSAwOworCisgICAgbGltTG9nKCBwTWFjLCBMT0czLAorICAgICAgICAgICAgICAgIEZMKCAiU2VuZGluZyBXREFfVVBEQVRFX0NGX0lORC4uLiIgKSk7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICkpKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQ0ZQYXJhbXMpOworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgIEZMKCJQb3N0aW5nICBXREFfVVBEQVRFX0NGX0lORCB0byBXREEgZmFpbGVkLCByZWFzb249JVhcbiIpLAorICAgICAgICAgICAgICAgICAgICByZXRDb2RlICk7CisgICAgfQorCityZXR1cm5GYWlsdXJlOgorICAgIHJldHVybiByZXRDb2RlOworfQorCisKKworLyoqCisgKiBsaW1TZW5kQmVhY29uUGFyYW1zKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBiZWFjbm9uIGludGVydmFsLCBzaG9ydCBwcmVhbWJsZSBvciBvdGhlcgorICogcGFyYW1ldGVycyB0byBXREEsIHdoaWNoIGFyZSBjaGFuZ2VkIGFuZCBpbmRpY2F0aW9uIGlzIHJlY2VpdmVkIGluIGJlYWNvbi4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgIHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gdHBVcGRhdGVCZWFjb25QYXJhbXMgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLAorICAgICAgICAgICAgICAgIHdoaWNoIGNvbnRhaW5zIHRoZSBiZWFjb24gcGFyYW1ldGVycyB3aGljaCBhcmUgY2hhbmdlZC4KKyAqCisgKiBAcmV0dXJuIHN1Y2Nlc3MgaWYgbWVzc2FnZSBzZW5kIGlzIG9rLCBlbHNlIGZhbHNlLgorICovCisKK3RTaXJSZXRTdGF0dXMgbGltU2VuZEJlYWNvblBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwVXBkYXRlZEJjblBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiAgcHNlc3Npb25FbnRyeSApCit7CisgICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJjblBhcmFtcyA9IE5VTEw7CisgICAgdFNpclJldFN0YXR1cyAgIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICAgdFNpck1zZ1EgbXNnUTsKKworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgKHZvaWQgKiopICZwQmNuUGFyYW1zLCBzaXplb2YoKnBCY25QYXJhbXMpKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgIEZMKCAiVW5hYmxlIHRvIFBBTCBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIFVwZGF0ZSBCZWFjb24gUGFyYW1zXG4iICkpOworCisgICAgICAgIHJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcEJjblBhcmFtcywgIHBVcGRhdGVkQmNuUGFyYW1zLCBzaXplb2YoKnBCY25QYXJhbXMpKTsKKworICAgIG1zZ1EudHlwZSA9IFdEQV9VUERBVEVfQkVBQ09OX0lORDsKKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwQmNuUGFyYW1zOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICBQRUxPRzMobGltTG9nKCBwTWFjLCBMT0czLAorICAgICAgICAgICAgICAgIEZMKCAiU2VuZGluZyBXREFfVVBEQVRFX0JFQUNPTl9JTkQsIHBhcmFtQ2hhbmdlQml0bWFwIGluIGhleCA9ICV4IiApLAorICAgICAgICAgICAgICAgICAgICBwVXBkYXRlZEJjblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXApOykKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICkpKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQmNuUGFyYW1zKTsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICBGTCgiUG9zdGluZyAgV0RBX1VQREFURV9CRUFDT05fSU5EIHRvIFdEQSBmYWlsZWQsIHJlYXNvbj0lWFxuIiksCisgICAgICAgICAgICAgICAgICAgIHJldENvZGUgKTsKKyAgICB9CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGxpbVNlbmRCZWFjb25JbmQocE1hYywgcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKworICAgIHJldHVybiByZXRDb2RlOworfQorCisKKy8qKgorICogbGltU2VuZFN3aXRjaENobmxQYXJhbXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIENoYW5uZWwgU3dpdGNoIEluZGljYXRpb24gdG8gV0RBCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICBwb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlLgorICogQHBhcmFtIGNobmxOdW1iZXIgTmV3IENoYW5uZWwgTnVtYmVyIHRvIGJlIHN3aXRjaGVkIHRvLgorICogQHBhcmFtIHNlY29uZGFyeUNobmxPZmZzZXQgIGFuIGVudW0gZm9yIHNlY29uZGFyeSBjaGFubmVsIG9mZnNldC4KKyAqIEBwYXJhbSBsb2NhbFBvd2VyQ29uc3RyYWludCAxMWggbG9jYWwgcG93ZXIgY29uc3RyYWludCB2YWx1ZQorICoKKyAqIEByZXR1cm4gc3VjY2VzcyBpZiBtZXNzYWdlIHNlbmQgaXMgb2ssIGVsc2UgZmFsc2UuCisgKi8KKworI2lmICFkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkgIAordFNpclJldFN0YXR1cyBsaW1TZW5kU3dpdGNoQ2hubFBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGNobmxOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgc2Vjb25kYXJ5Q2hubE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBsb2NhbFB3ckNvbnN0cmFpbnQsIHRBTklfVTggcGVTZXNzaW9uSWQpCisjZWxzZQordFNpclJldFN0YXR1cyBsaW1TZW5kU3dpdGNoQ2hubFBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGNobmxOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgc2Vjb25kYXJ5Q2hubE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBvd2VyZEJtIG1heFR4UG93ZXIsIHRBTklfVTggcGVTZXNzaW9uSWQpCisKKyNlbmRpZgoreworICAgIHRwU3dpdGNoQ2hhbm5lbFBhcmFtcyBwQ2hubFBhcmFtcyA9IE5VTEw7CisgICAgdFNpclJldFN0YXR1cyAgIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICAgdFNpck1zZ1EgbXNnUTsKKyAgICB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5OworCisgICAgaWYoKHBTZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyAsIHBlU2Vzc2lvbklkKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICAgICAgIEZMKCAiVW5hYmxlIHRvIGdldCBTZXNzaW9uIGZvciBzZXNzaW9uIElkICVkXG4iICksIHBlU2Vzc2lvbklkKTsKKyAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgfQorCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgKHZvaWQgKiopICZwQ2hubFBhcmFtcywKKyAgICAgICAgICBzaXplb2YoIHRTd2l0Y2hDaGFubmVsUGFyYW1zICkpKQorICAgICAgeworICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgIEZMKCAiVW5hYmxlIHRvIFBBTCBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIFN3aXRjaCBDaGFubmVsIFBhcmFtc1xuIiApKTsKKworICAgICAgICByZXRDb2RlID0gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgICAgICBnb3RvIHJldHVybkZhaWx1cmU7CisgICAgICB9CisKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQ2hubFBhcmFtcywgc2l6ZW9mKHRTd2l0Y2hDaGFubmVsUGFyYW1zKSk7CisKKyAgICBwQ2hubFBhcmFtcy0+c2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IHNlY29uZGFyeUNobmxPZmZzZXQ7CisgICAgcENobmxQYXJhbXMtPmNoYW5uZWxOdW1iZXI9IGNobmxOdW1iZXI7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJICAKKyAgICBwQ2hubFBhcmFtcy0+bWF4VHhQb3dlciA9IG1heFR4UG93ZXI7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcENobmxQYXJhbXMtPnNlbGZTdGFNYWNBZGRyLCBwU2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworI2Vsc2UKKyAgICBwQ2hubFBhcmFtcy0+bG9jYWxQb3dlckNvbnN0cmFpbnQgPSBsb2NhbFB3ckNvbnN0cmFpbnQ7CisjZW5kaWYKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBDaG5sUGFyYW1zLT5ic3NJZCwgcFNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyAgICBwQ2hubFBhcmFtcy0+cGVTZXNzaW9uSWQgPSBwZVNlc3Npb25JZDsKKyAgICAKKyAgICAvL3dlIG5lZWQgdG8gZGVmZXIgdGhlIG1lc3NhZ2UgdW50aWwgd2UgZ2V0IHRoZSByZXNwb25zZSBiYWNrIGZyb20gV0RBLgorICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKworICAgIG1zZ1EudHlwZSA9IFdEQV9DSE5MX1NXSVRDSF9SRVE7CisgICAgbXNnUS5yZXNlcnZlZCA9IDA7CisgICAgbXNnUS5ib2R5cHRyID0gcENobmxQYXJhbXM7CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKworI2lmICFkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkgIAorICAgIFBFTE9HMyhsaW1Mb2coIHBNYWMsIExPRzMsCisgICAgICAgIEZMKCAiU2VuZGluZyBXREFfQ0hOTF9TV0lUQ0hfUkVRIHdpdGggU2Vjb25kYXJ5Q2huT2Zmc2V0IC0gJWQsIENoYW5uZWxOdW1iZXIgLSAlZCwgbWF4VHhQb3dlciAtICVkIiksCisgICAgICAgIHBDaG5sUGFyYW1zLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0LCBwQ2hubFBhcmFtcy0+Y2hhbm5lbE51bWJlciwgcENobmxQYXJhbXMtPm1heFR4UG93ZXIpOykKKyNlbHNlCisgICAgUEVMT0czKGxpbUxvZyggcE1hYywgTE9HMywKKyAgICAgICAgRkwoICJTZW5kaW5nIFdEQV9DSE5MX1NXSVRDSF9SRVEgd2l0aCBTZWNvbmRhcnlDaG5PZmZzZXQgLSAlZCwgQ2hhbm5lbE51bWJlciAtICVkLCBMb2NhbFBvd2VyQ29uc3RyYWludCAtICVkIiksCisgICAgICAgIHBDaG5sUGFyYW1zLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0LCBwQ2hubFBhcmFtcy0+Y2hhbm5lbE51bWJlciwgcENobmxQYXJhbXMtPmxvY2FsUG93ZXJDb25zdHJhaW50KTspCisjZW5kaWYKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICkpKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQ2hubFBhcmFtcyk7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgRkwoIlBvc3RpbmcgIFdEQV9DSE5MX1NXSVRDSF9SRVEgdG8gV0RBIGZhaWxlZCwgcmVhc29uPSVYXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgcmV0Q29kZSApOworICAgIH0KKworcmV0dXJuRmFpbHVyZToKKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworCisvKioKKyAqIGxpbVNlbmRFZGNhUGFyYW1zKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBkeW5hbWljYWxseSBjaGFuZ2luZyBFRENBIFBhcmFtZXRlcnMgdG8gV0RBLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgcG9pbnRlciB0byBHbG9iYWwgTWFjIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSB0cFVwZGF0ZWRFZGNhUGFyYW1zIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljYWxseSBjaGFuZ2luZyBFRENBIHBhcmFtZXRlcnMuCisgKiBAcGFyYW0gaGlnaFBlcmZvcm1hbmNlICBJZiB0aGUgcGVlciBpcyBBaXJnbyAodGF1cnVzKSB0aGVuIHN3aXRjaCB0byBoaWdoUGVyZm9ybWFuY2UgaXMgdHJ1ZS4KKyAqCisgKiBAcmV0dXJuIHN1Y2Nlc3MgaWYgbWVzc2FnZSBzZW5kIGlzIG9rLCBlbHNlIGZhbHNlLgorICovCisKK3RTaXJSZXRTdGF0dXMgbGltU2VuZEVkY2FQYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0VkY2FQYXJhbVJlY29yZCAqcFVwZGF0ZWRFZGNhUGFyYW1zLCB0QU5JX1UxNiBic3NJZHgsIHRBTklfQk9PTEVBTiBoaWdoUGVyZm9ybWFuY2UpCit7CisgICAgdEVkY2FQYXJhbXMgKnBFZGNhUGFyYW1zID0gTlVMTDsKKyAgICB0U2lyUmV0U3RhdHVzICAgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0U2lyTXNnUSBtc2dROworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgKHZvaWQgKiopICZwRWRjYVBhcmFtcywKKyAgICAgICAgICBzaXplb2YodEVkY2FQYXJhbXMpKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgIEZMKCAiVW5hYmxlIHRvIFBBTCBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIFVwZGF0ZSBFRENBIFBhcmFtc1xuIiApKTsKKworICAgICAgICByZXRDb2RlID0gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgICAgICByZXR1cm4gcmV0Q29kZTsKKyAgICB9CisKKyAgICBwRWRjYVBhcmFtcy0+YnNzSWR4ID0gYnNzSWR4OworICAgIHBFZGNhUGFyYW1zLT5hY2JlID0gcFVwZGF0ZWRFZGNhUGFyYW1zW0VEQ0FfQUNfQkVdOworICAgIHBFZGNhUGFyYW1zLT5hY2JrID0gcFVwZGF0ZWRFZGNhUGFyYW1zW0VEQ0FfQUNfQktdOworICAgIHBFZGNhUGFyYW1zLT5hY3ZpID0gcFVwZGF0ZWRFZGNhUGFyYW1zW0VEQ0FfQUNfVkldOworICAgIHBFZGNhUGFyYW1zLT5hY3ZvID0gcFVwZGF0ZWRFZGNhUGFyYW1zW0VEQ0FfQUNfVk9dOworICAgIHBFZGNhUGFyYW1zLT5oaWdoUGVyZm9ybWFuY2UgPSBoaWdoUGVyZm9ybWFuY2U7CisKKyAgICBtc2dRLnR5cGUgPSBXREFfVVBEQVRFX0VEQ0FfUFJPRklMRV9JTkQ7CisgICAgbXNnUS5yZXNlcnZlZCA9IDA7CisgICAgbXNnUS5ib2R5cHRyID0gcEVkY2FQYXJhbXM7CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKworICAgIHsKKyAgICAgICAgdEFOSV9VOCBpOworICAgICAgICBQRUxPRzEobGltTG9nKCBwTWFjLCBMT0cxLEZMKCJTZW5kaW5nIFdEQV9VUERBVEVfRURDQV9QUk9GSUxFX0lORCB3aXRoIEVEQ0EgUGFyYW1ldGVyczoiICkpOykKKyAgICAgICAgZm9yKGk9MDsgaTxNQVhfTlVNX0FDOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkFDWyVkXTogIEFJRlNOICVkLCBBQ00gJWQsIENXbWluICVkLCBDV21heCAlZCwgVHhPcCAlZCBcbiIpLCAgCisgICAgICAgICAgICAgICAgICAgaSwgcFVwZGF0ZWRFZGNhUGFyYW1zW2ldLmFjaS5haWZzbiwgcFVwZGF0ZWRFZGNhUGFyYW1zW2ldLmFjaS5hY20sIAorICAgICAgICAgICAgICAgICAgIHBVcGRhdGVkRWRjYVBhcmFtc1tpXS5jdy5taW4sIHBVcGRhdGVkRWRjYVBhcmFtc1tpXS5jdy5tYXgsIHBVcGRhdGVkRWRjYVBhcmFtc1tpXS50eG9wbGltaXQpOykKKyAgICAgICAgfQorICAgIH0KKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICkpKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwRWRjYVBhcmFtcyk7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgRkwoIlBvc3RpbmcgIFdEQV9VUERBVEVfRURDQV9QUk9GSUxFX0lORCB0byBXREEgZmFpbGVkLCByZWFzb249JVhcbiIpLAorICAgICAgICAgICAgICAgICAgICByZXRDb2RlICk7CisgICAgfQorCisgICAgcmV0dXJuIHJldENvZGU7Cit9CisKKworLyoqCisgKiBsaW1TZXRBY3RpdmVFZGNhUGFyYW1zKCkKKyAqCisgKiBGVU5DVElPTjoKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBFRENBIHBhcmFtZXRlcnMKKyAqICBnaXZlbiB0aGUgZGVmYXVsdCBsb2NhbCBFRENBIHBhcmFtZXRlcnMuICBUaGUgcnVsZXMgYXJlIGFzIGZvbGxvd2luZzoKKyAqICAtIElmIEFDTSBiaXQgaXMgc2V0IGZvciBhbGwgQUNzLCB0aGVuIGRvd25ncmFkZSBldmVyeXRoaW5nIHRvIEJlc3QgRWZmb3J0LgorICogIC0gSWYgQUNNIGlzIG5vdCBzZXQgZm9yIGFueSBBQywgdGhlbiBQRSB3aWxsIHVzZSB0aGUgZGVmYXVsdCBFRENBCisgKiAgICBwYXJhbWV0ZXJzIGFzIGFkdmVydGlzZWQgYnkgQVAuCisgKiAgLSBJZiBBQ00gaXMgc2V0IGluIGFueSBvZiB0aGUgQUNzLCBQRSB3aWxsIHVzZSB0aGUgRURDQSBwYXJhbWV0ZXJzCisgKiAgICBmcm9tIHRoZSBuZXh0IGJlc3QgQUMgZm9yIHdoaWNoIEFDTSBpcyBub3QgZW5hYmxlZC4KKyAqCisgKiBAcGFyYW0gcE1hYyAgcG9pbnRlciB0byBHbG9iYWwgTWFjIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBwbG9jYWxFZGNhUGFyYW1zIHBvaW50ZXIgdG8gdGhlIGxvY2FsIEVEQ0EgcGFyYW1ldGVycworICogQCBwYXJhbSBwc2Vzc2lvbkVudHJ5IHBvaW50IHRvIHRoZSBzZXNzaW9uIGVudHJ5CisgKiBAcmV0dXJuIG5vbmUKKyAqLworIHZvaWQgbGltU2V0QWN0aXZlRWRjYVBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjRWRjYVBhcmFtUmVjb3JkICpwbG9jYWxFZGNhUGFyYW1zLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTggICBhYywgbmV3QWMsIGk7CisgICAgdEFOSV9VOCAgIGFjQWRtaXR0ZWQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgdm9zX2xvZ19xb3NfZWRjYV9wa3RfdHlwZSAqbG9nX3B0ciA9IE5VTEw7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorCisgICAgLy8gSW5pdGlhbGl6ZSBnTGltRWRjYVBhcmFtc0FjdGl2ZVtdIHRvIGJlIHNhbWUgYXMgbG9jYWxFZGNhUGFyYW1zCisgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbRURDQV9BQ19CRV0gPSBwbG9jYWxFZGNhUGFyYW1zW0VEQ0FfQUNfQkVdOworICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQWN0aXZlW0VEQ0FfQUNfQktdID0gcGxvY2FsRWRjYVBhcmFtc1tFRENBX0FDX0JLXTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZVtFRENBX0FDX1ZJXSA9IHBsb2NhbEVkY2FQYXJhbXNbRURDQV9BQ19WSV07CisgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbRURDQV9BQ19WT10gPSBwbG9jYWxFZGNhUGFyYW1zW0VEQ0FfQUNfVk9dOworCisgICAgLyogQW4gQUMgcmVxdWlyZXMgZG93bmdyYWRlIGlmIHRoZSBBQ00gYml0IGlzIHNldCwgYW5kIHRoZSBBQyBoYXMgbm90CisgICAgICogeWV0IGJlZW4gYWRtaXR0ZWQgaW4gdXBsaW5rIG9yIGJpLWRpcmVjdGlvbnMuCisgICAgICogSWYgYW4gQUMgcmVxdWlyZXMgZG93bmdyYWRlLCBpdCB3aWxsIGRvd25ncmFkZSB0byB0aGUgbmV4dCBiZXNldCBBQworICAgICAqIGZvciB3aGljaCBBQ00gaXMgbm90IGVuYWJsZWQuCisgICAgICoKKyAgICAgKiAtIFRoZXJlJ3Mgbm8gbmVlZCB0byBkb3duZ3JhZGUgQUNfQkUgc2luY2UgaXQgSVMgdGhlIGxvd2VzdCBBQy4gSGVuY2UKKyAgICAgKiAgIHN0YXJ0IHRoZSBmb3IgbG9vcCB3aXRoIEFDX0JLLgorICAgICAqIC0gSWYgQUNNIGJpdCBpcyBzZXQgZm9yIGFuIEFDLCBpbml0aWFsbHkgZG93bmdyYWRlIGl0IHRvIEFDX0JFLiBUaGVuCisgICAgICogICB0cmF2ZXJzZSB0aHJ1IHRoZSBBQyBsaXN0LiBJZiB3ZSBkbyBmaW5kIHRoZSBuZXh0IGJlc3QgQUMgd2hpY2ggaXMKKyAgICAgKiAgIGJldHRlciB0aGFuIEFDX0JFLCB0aGVuIHVzZSB0aGF0IG9uZS4gRm9yIGV4YW1wbGUsIGlmIEFDTSBiaXRzIGFyZSBzZXQKKyAgICAgKiAgIHN1Y2ggdGhhdDogQkVfQUNNPTEsIEJLX0FDTT0xLCBWSV9BQ009MSwgVk9fQUNNPTAKKyAgICAgKiAgIHRoZW4gYWxsIEFDIHdpbGwgYmUgZG93bmdyYWRlZCB0byBBQ19CRS4KKyAgICAgKi8KKyAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoImFkQWRtaXRNYXNrW1VQTElOS10gPSAweCV4IFxuIiksICBwTWFjLT5saW0uZ0FjQWRtaXRNYXNrW1NJUl9NQUNfRElSRUNUSU9OX1VQTElOS10gKTsKKyAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoImFkQWRtaXRNYXNrW0RPV05MSU5LXSA9IDB4JXggXG4iKSwgIHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LXSApOworICAgIGZvciAoYWMgPSBFRENBX0FDX0JLOyBhYyA8PSBFRENBX0FDX1ZPOyBhYysrKQorICAgIHsKKyAgICAgICAgYWNBZG1pdHRlZCA9ICggKHBNYWMtPmxpbS5nQWNBZG1pdE1hc2tbU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LXSAmICgxIDw8IGFjKSkgPj4gYWMgKTsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJGb3IgQUNbJWRdOiBhY209JWQsICBhY0FkbWl0PSVkIFxuIiksIGFjLCBwbG9jYWxFZGNhUGFyYW1zW2FjXS5hY2kuYWNtLCBhY0FkbWl0dGVkKTsKKworICAgICAgICBpZiAoIChwbG9jYWxFZGNhUGFyYW1zW2FjXS5hY2kuYWNtID09IDEpICYmIChhY0FkbWl0dGVkID09IDApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJXZSBuZWVkIHRvIGRvd25ncmFkZSBBQyAlZCEhICIpLCBhYyk7CisgICAgICAgICAgICBuZXdBYyA9IEVEQ0FfQUNfQkU7CisgICAgICAgICAgICBmb3IgKGk9YWMtMTsgaT4wOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBsb2NhbEVkY2FQYXJhbXNbaV0uYWNpLmFjbSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3QWMgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIkRvd25ncmFkaW5nIEFDICVkIC0tLT4gQUMgJWQgIiksIGFjLCBuZXdBYyk7CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZVthY10gPSBwbG9jYWxFZGNhUGFyYW1zW25ld0FjXTsKKyAgICAgICAgfQorICAgIH0KKy8vbG9nOiBMT0dfV0xBTl9RT1NfRURDQV9DCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgV0xBTl9WT1NfRElBR19MT0dfQUxMT0MobG9nX3B0ciwgdm9zX2xvZ19xb3NfZWRjYV9wa3RfdHlwZSwgTE9HX1dMQU5fUU9TX0VEQ0FfQyk7CisgICAgaWYobG9nX3B0cikKKyAgICB7CisgICAgICAgbG9nX3B0ci0+YWNpX2JlID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbRURDQV9BQ19CRV0uYWNpLmFjaTsKKyAgICAgICBsb2dfcHRyLT5jd19iZSAgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZVtFRENBX0FDX0JFXS5jdy5tYXggPDwgNCB8CisgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbRURDQV9BQ19CRV0uY3cubWluOworICAgICAgIGxvZ19wdHItPnR4b3BsaW1pdF9iZSA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQWN0aXZlW0VEQ0FfQUNfQkVdLnR4b3BsaW1pdDsKKyAgICAgICBsb2dfcHRyLT5hY2lfYmsgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZVtFRENBX0FDX0JLXS5hY2kuYWNpOworICAgICAgIGxvZ19wdHItPmN3X2JrICA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQWN0aXZlW0VEQ0FfQUNfQktdLmN3Lm1heCA8PCA0IHwKKyAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZVtFRENBX0FDX0JLXS5jdy5taW47CisgICAgICAgbG9nX3B0ci0+dHhvcGxpbWl0X2JrID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbRURDQV9BQ19CS10udHhvcGxpbWl0OworICAgICAgIGxvZ19wdHItPmFjaV92aSA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQWN0aXZlW0VEQ0FfQUNfVkldLmFjaS5hY2k7CisgICAgICAgbG9nX3B0ci0+Y3dfdmkgID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbRURDQV9BQ19WSV0uY3cubWF4IDw8IDQgfAorICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQWN0aXZlW0VEQ0FfQUNfVkldLmN3Lm1pbjsKKyAgICAgICBsb2dfcHRyLT50eG9wbGltaXRfdmkgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZVtFRENBX0FDX1ZJXS50eG9wbGltaXQ7CisgICAgICAgbG9nX3B0ci0+YWNpX3ZvID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbRURDQV9BQ19WT10uYWNpLmFjaTsKKyAgICAgICBsb2dfcHRyLT5jd192byAgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0FjdGl2ZVtFRENBX0FDX1ZPXS5jdy5tYXggPDwgNCB8CisgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNBY3RpdmVbRURDQV9BQ19WT10uY3cubWluOworICAgICAgIGxvZ19wdHItPnR4b3BsaW1pdF92byA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQWN0aXZlW0VEQ0FfQUNfVk9dLnR4b3BsaW1pdDsKKyAgICB9CisgICAgV0xBTl9WT1NfRElBR19MT0dfUkVQT1JUKGxvZ19wdHIpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgIAorICAgIHJldHVybjsKKyB9CisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICAgbGltU2V0TGlua1N0YXRlCitcYnJpZWYgICBMSU0gc2VuZHMgYSBtZXNzYWdlIHRvIFdEQSB0byBzZXQgdGhlIGxpbmsgc3RhdGUKK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsICBwTWFjCitccGFyYW0gICB0U2lyTGlua1N0YXRlICAgICAgc3RhdGUKK1xyZXR1cm4gIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIC8vT3JpZ2luYWwgY29kZSB3aXRoIG91dCBhbnUncyBjaGFuZ2UKKyNpZiAwCit0U2lyUmV0U3RhdHVzIGxpbVNldExpbmtTdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTGlua1N0YXRlIHN0YXRlLHRTaXJNYWNBZGRyIGJzc0lkKQoreworICAgIHRTaXJNc2dRIG1zZzsKKyAgICB0U2lyUmV0U3RhdHVzIHJldENvZGU7CisKKyAgICBtc2cudHlwZSA9IFdEQV9TRVRfTElOS19TVEFURTsKKyAgICBtc2cuYm9keXZhbCA9ICh0QU5JX1UzMikgc3RhdGU7CisgICAgbXNnLmJvZHlwdHIgPSBOVUxMOworCisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnLnR5cGUpKTsKKyAgICByZXRDb2RlID0gd2RhUG9zdEN0cmxNc2cocE1hYywgJm1zZyk7CisgICAgaWYgKHJldENvZGUgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlBvc3RpbmcgbGluayBzdGF0ZSAlZCBmYWlsZWQsIHJlYXNvbiA9ICV4IFxuIiksIHJldENvZGUpOworCisgICAgcmV0dXJuIHJldENvZGU7Cit9CisjZW5kaWYgLy8wCisKK3RTaXJSZXRTdGF0dXMgbGltU2V0TGlua1N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJMaW5rU3RhdGUgc3RhdGUsdFNpck1hY0FkZHIgYnNzSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgc2VsZk1hY0FkZHIsIHRwU2V0TGlua1N0YXRlQ2FsbGJhY2sgY2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2FsbGJhY2tBcmcpIAoreworICAgIHRTaXJNc2dRIG1zZ1E7CisgICAgdFNpclJldFN0YXR1cyByZXRDb2RlOworICAgIHRwTGlua1N0YXRlUGFyYW1zIHBMaW5rU3RhdGVQYXJhbXMgPSBOVUxMOworCisgICAgLy8gQWxsb2NhdGUgbWVtb3J5LgorICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICh2b2lkICoqKSAmcExpbmtTdGF0ZVBhcmFtcywKKyAgICAgICAgICBzaXplb2YodExpbmtTdGF0ZVBhcmFtcykpKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IHdoaWxlIHNlbmRpbmcgU2V0IExpbmsgU3RhdGVcbiIgKSk7CisKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfU01FX1JFU09VUkNFU19VTkFWQUlMQUJMRTsKKyAgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgfQorCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcExpbmtTdGF0ZVBhcmFtcywgc2l6ZW9mKHRMaW5rU3RhdGVQYXJhbXMpKTsKKworICAgIHBMaW5rU3RhdGVQYXJhbXMtPnN0YXRlICAgICAgICA9IHN0YXRlOworICAgIHBMaW5rU3RhdGVQYXJhbXMtPmNhbGxiYWNrICAgICA9IGNhbGxiYWNrOworICAgIHBMaW5rU3RhdGVQYXJhbXMtPmNhbGxiYWNrQXJnICA9IGNhbGxiYWNrQXJnOworICAgICAKKworICAgIC8qIENvcHkgTWFjIGFkZHJlc3MgKi8KKyAgICBzaXJDb3B5TWFjQWRkcihwTGlua1N0YXRlUGFyYW1zLT5ic3NpZCxic3NJZCk7CisgICAgc2lyQ29weU1hY0FkZHIocExpbmtTdGF0ZVBhcmFtcy0+c2VsZk1hY0FkZHIsIHNlbGZNYWNBZGRyKTsKKworCisgICAgbXNnUS50eXBlID0gV0RBX1NFVF9MSU5LX1NUQVRFOworICAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgIG1zZ1EuYm9keXB0ciA9IHBMaW5rU3RhdGVQYXJhbXM7CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKyAgICAKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKworICAgIHJldENvZGUgPSAodEFOSV9VMzIpd2RhUG9zdEN0cmxNc2cocE1hYywgJm1zZ1EpOworICAgIGlmIChyZXRDb2RlICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYywgKHZvaWQqKXBMaW5rU3RhdGVQYXJhbXMpOworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlBvc3RpbmcgbGluayBzdGF0ZSAlZCBmYWlsZWQsIHJlYXNvbiA9ICV4IFxuIiksIHJldENvZGUpOworICAgIH0KKworICAgIHJldHVybiByZXRDb2RlOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbVNldExpbmtTdGF0ZUZUKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJMaW5rU3RhdGUgCitzdGF0ZSx0U2lyTWFjQWRkciBic3NJZCwgdFNpck1hY0FkZHIgc2VsZk1hY0FkZHIsIGludCBmdCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyTXNnUSBtc2dROworICAgIHRTaXJSZXRTdGF0dXMgcmV0Q29kZTsKKyAgICB0cExpbmtTdGF0ZVBhcmFtcyBwTGlua1N0YXRlUGFyYW1zID0gTlVMTDsKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAodm9pZCAqKikgJnBMaW5rU3RhdGVQYXJhbXMsCisgICAgICAgICAgc2l6ZW9mKHRMaW5rU3RhdGVQYXJhbXMpKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgRkwoICJVbmFibGUgdG8gUEFMIGFsbG9jYXRlIG1lbW9yeSB3aGlsZSBzZW5kaW5nIFNldCBMaW5rIFN0YXRlXG4iICkpOworCisgICAgICAgIHJldENvZGUgPSBlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEU7CisgICAgICAgIHJldHVybiByZXRDb2RlOworICAgIH0KKworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBMaW5rU3RhdGVQYXJhbXMsIHNpemVvZih0TGlua1N0YXRlUGFyYW1zKSk7CisKKyAgICBwTGlua1N0YXRlUGFyYW1zLT5zdGF0ZSA9IHN0YXRlOworCisgICAgLyogQ29weSBNYWMgYWRkcmVzcyAqLworICAgIHNpckNvcHlNYWNBZGRyKHBMaW5rU3RhdGVQYXJhbXMtPmJzc2lkLGJzc0lkKTsKKyAgICBzaXJDb3B5TWFjQWRkcihwTGlua1N0YXRlUGFyYW1zLT5zZWxmTWFjQWRkciwgc2VsZk1hY0FkZHIpOworICAgIHBMaW5rU3RhdGVQYXJhbXMtPmZ0ID0gMTsKKyAgICBwTGlua1N0YXRlUGFyYW1zLT5zZXNzaW9uID0gcHNlc3Npb25FbnRyeTsKKworCisgICAgbXNnUS50eXBlID0gV0RBX1NFVF9MSU5LX1NUQVRFOworICAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgIG1zZ1EuYm9keXB0ciA9IHBMaW5rU3RhdGVQYXJhbXM7CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKyAgICAKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKworICAgIHJldENvZGUgPSAodEFOSV9VMzIpd2RhUG9zdEN0cmxNc2cocE1hYywgJm1zZ1EpOworICAgIGlmIChyZXRDb2RlICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYywgKHZvaWQqKXBMaW5rU3RhdGVQYXJhbXMpOworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlBvc3RpbmcgbGluayBzdGF0ZSAlZCBmYWlsZWQsIHJlYXNvbiA9ICV4IFxuIiksIHJldENvZGUpOworICAgIH0KKworICAgIHJldHVybiByZXRDb2RlOworfQorI2VuZGlmCisKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBsaW1TZW5kU2V0VHhQb3dlclJlcQorXGJyaWVmICAgTElNIHNlbmRzIGEgV0RBX1NFVF9UWF9QT1dFUl9SRVEgbWVzc2FnZSB0byBXREEgCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMKK1xwYXJhbSAgIHRwU2lyU2V0VHhQb3dlclJlcSAgcmVxdWVzdCBtZXNzYWdlCitccmV0dXJuICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMgbGltU2VuZFNldFR4UG93ZXJSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgIHRwU2lyU2V0VHhQb3dlclJlcSBwVHhQb3dlclJlcSkKK3sKKyAgICB0U2lyUmV0U3RhdHVzICByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworICAgIHRTaXJNc2dRICAgICAgIG1zZ1E7CisKKyAgICBpZiAoTlVMTCA9PSBwVHhQb3dlclJlcSkKKyAgICAgICAgcmV0dXJuIHJldENvZGU7CisKKyAgICBtc2dRLnR5cGUgPSBXREFfU0VUX1RYX1BPV0VSX1JFUTsKKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwVHhQb3dlclJlcTsKKyAgICBtc2dRLmJvZHl2YWwgPSAwOworCisgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCggIlNlbmRpbmcgV0RBX1NFVF9UWF9QT1dFUl9SRVEgdG8gV0RBIikpOykKKworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gKHJldENvZGUgPSB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKSkpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJQb3N0aW5nIFdEQV9TRVRfVFhfUE9XRVJfUkVRIHRvIFdEQSBmYWlsZWQsIHJlYXNvbj0lWCIpLCByZXRDb2RlICk7CisgICAgICAgIGlmIChOVUxMICE9IHBUeFBvd2VyUmVxKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwVHhQb3dlclJlcSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgfQorICAgIHJldHVybiByZXRDb2RlOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBsaW1TZW5kR2V0VHhQb3dlclJlcQorXGJyaWVmICAgTElNIHNlbmRzIGEgV0RBX0dFVF9UWF9QT1dFUl9SRVEgbWVzc2FnZSB0byBXREEKK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYworXHBhcmFtICAgdHBTaXJHZXRUeFBvd2VyUmVxICByZXF1ZXN0IG1lc3NhZ2UKK1xyZXR1cm4gIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFNpclJldFN0YXR1cyBsaW1TZW5kR2V0VHhQb3dlclJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCAgdHBTaXJHZXRUeFBvd2VyUmVxIHBUeFBvd2VyUmVxKQoreworICAgIHRTaXJSZXRTdGF0dXMgIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICAgdFNpck1zZ1EgICAgICAgbXNnUTsKKworICAgIGlmIChOVUxMID09IHBUeFBvd2VyUmVxKQorICAgICAgICByZXR1cm4gcmV0Q29kZTsKKworICAgIG1zZ1EudHlwZSA9IFdEQV9HRVRfVFhfUE9XRVJfUkVROworICAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgIG1zZ1EuYm9keXB0ciA9IHBUeFBvd2VyUmVxOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCAiU2VuZGluZyBXREFfR0VUX1RYX1BPV0VSX1JFUSB0byBXREEiKSk7KQorCisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIlBvc3RpbmcgV0RBX0dFVF9UWF9QT1dFUl9SRVEgdG8gV0RBIGZhaWxlZCwgcmVhc29uPSVYIiksIHJldENvZGUgKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gcFR4UG93ZXJSZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBUeFBvd2VyUmVxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0Q29kZTsKKyAgICB9CisgICAgcmV0dXJuIHJldENvZGU7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgIGxpbVNlbmRCZWFjb25GaWx0ZXJJbmZvCitcYnJpZWYgICBMSU0gc2VuZHMgYmVhY29uIGZpbHRlcmluZyBpbmZvIHRvIFdEQQorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKK1xyZXR1cm4gIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFNpclJldFN0YXR1cyBsaW1TZW5kQmVhY29uRmlsdGVySW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRwQmVhY29uRmlsdGVyTXNnICBwQmVhY29uRmlsdGVyTXNnID0gTlVMTDsKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0U2lyTXNnUSAgICAgICAgICAgbXNnUTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgKnB0cjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgaTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgbXNnU2l6ZTsKKyAgICB0cEJlYWNvbkZpbHRlckllICAgcEllOworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSAmcE1hYy0+bGltLmdwU2Vzc2lvblswXTsgIC8vVEJELVJBSkVTSCBnZXQgdGhlIHNlc3Npb25FbnRyeSBmcm9tIHRoZSBjYWxsZXIKKworCisgICAgbXNnU2l6ZSA9IHNpemVvZih0QmVhY29uRmlsdGVyTXNnKSArIHNpemVvZihiZWFjb25GaWx0ZXJUYWJsZSk7CisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgKHZvaWQgKiopICZwQmVhY29uRmlsdGVyTXNnLCBtc2dTaXplKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYmVhY29uRmlpbHRlck1zZyBcbiIpKTsKKyAgICAgICAgcmV0Q29kZSA9IGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgfQorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBCZWFjb25GaWx0ZXJNc2csIG1zZ1NpemUpOworCisgICAgLy8gRmlsbCBpbiBjYXBhYmlsaXR5IEluZm8gYW5kIG1hc2sKKyAgICAvL1RCRC1SQUpFU0ggZ2V0IHRoZSBCU1MgY2FwYWJpbGl0eSBmcm9tIHNlc3Npb24uCisgICAgLy9Eb24ndCBzZW5kIHRoaXMgbWVzc2FnZSBpZiBubyBhY3RpdmUgSW5mcmEgc2Vzc2lvbiBpcyBmb3VuZC4KKyAgICBwQmVhY29uRmlsdGVyTXNnLT5jYXBhYmlsaXR5SW5mbyA9IHBzZXNzaW9uRW50cnktPmxpbUN1cnJlbnRCc3NDYXBzOworICAgIHBCZWFjb25GaWx0ZXJNc2ctPmNhcGFiaWxpdHlNYXNrID0gQ0FQQUJJTElUWV9GSUxURVJfTUFTSzsKKworICAgIHBCZWFjb25GaWx0ZXJNc2ctPmJlYWNvbkludGVydmFsID0gKHRBTklfVTE2KSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWw7CisKKyAgICAvLyBGaWxsIGluIG51bWJlciBvZiBJRXMgaW4gYmVhY29uRmlsdGVyVGFibGUKKyAgICBwQmVhY29uRmlsdGVyTXNnLT5pZU51bSA9ICh0QU5JX1UxNikgKHNpemVvZihiZWFjb25GaWx0ZXJUYWJsZSkgLyBzaXplb2YodEJlYWNvbkZpbHRlckllKSk7CisKKyAgICAvL0ZpbGwgbWVzc2FnZSB3aXRoIGluZm8gY29udGFpbmVkIGluIHRoZSBiZWFjb25GaWx0ZXJUYWJsZQorICAgIHB0ciA9ICh0QU5JX1U4ICopcEJlYWNvbkZpbHRlck1zZyArIHNpemVvZih0QmVhY29uRmlsdGVyTXNnKTsKKyAgICBmb3IoaT0wOyBpIDwgKHBCZWFjb25GaWx0ZXJNc2ctPmllTnVtKTsgaSsrKQorICAgIHsKKyAgICAgICAgcEllID0gKHRwQmVhY29uRmlsdGVySWUpIHB0cjsKKyAgICAgICAgcEllLT5lbGVtZW50SWQgPSBiZWFjb25GaWx0ZXJUYWJsZVtpXS5lbGVtZW50SWQ7CisgICAgICAgIHBJZS0+Y2hlY2tJZVByZXNlbmNlID0gYmVhY29uRmlsdGVyVGFibGVbaV0uY2hlY2tJZVByZXNlbmNlOworICAgICAgICBwSWUtPmJ5dGUub2Zmc2V0ID0gYmVhY29uRmlsdGVyVGFibGVbaV0uYnl0ZS5vZmZzZXQ7CisgICAgICAgIHBJZS0+Ynl0ZS52YWx1ZSA9ICBiZWFjb25GaWx0ZXJUYWJsZVtpXS5ieXRlLnZhbHVlOworICAgICAgICBwSWUtPmJ5dGUuYml0TWFzayA9ICBiZWFjb25GaWx0ZXJUYWJsZVtpXS5ieXRlLmJpdE1hc2s7CisgICAgICAgIHBJZS0+Ynl0ZS5yZWYgPSAgYmVhY29uRmlsdGVyVGFibGVbaV0uYnl0ZS5yZWY7IAorICAgICAgICBwdHIgKz0gc2l6ZW9mKHRCZWFjb25GaWx0ZXJJZSk7CisgICAgfQorCisgICAgbXNnUS50eXBlID0gV0RBX0JFQUNPTl9GSUxURVJfSU5EOworICAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgIG1zZ1EuYm9keXB0ciA9IHBCZWFjb25GaWx0ZXJNc2c7CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKworICAgIGxpbUxvZyggcE1hYywgTE9HMywgRkwoICJTZW5kaW5nIFdEQV9CRUFDT05fRklMVEVSX0lORC4uLiIgKSk7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApKSkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEJlYWNvbkZpbHRlck1zZyk7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgIEZMKCJQb3N0aW5nICBXREFfQkVBQ09OX0ZJTFRFUl9JTkQgdG8gV0RBIGZhaWxlZCwgcmVhc29uPSVYXG4iKSwKKyAgICAgICAgICAgIHJldENvZGUgKTsKKyAgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgfQorCisgICAgcmV0dXJuIHJldENvZGU7Cit9CisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2VuZE1lc3NhZ2VzLmggYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlbmRNZXNzYWdlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NzE2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlbmRNZXNzYWdlcy5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBsaW1TZW5kTWVzc2FnZXMuaDogUHJvdmlkZXMgZnVuY3Rpb25zIHRvIHNlbmQgbWVzc2FnZXMgb3IgSW5kaWNhdGlvbnMgdG8gSEFMLgorICogQXV0aG9yOiAgICBTdW5pdCBCaGF0aWEKKyAqIERhdGU6ICAgICAgIDA5LzIxLzIwMDYKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgTW9kaWZpZWQgYnkgICAgICAgICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2lmbmRlZiBfX0xJTV9TRU5EX01FU1NBR0VTX0gKKyNkZWZpbmUgX19MSU1fU0VORF9NRVNTQUdFU19ICisKKworCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAibGltVHlwZXMuaCIKKyNpbmNsdWRlICJoYWxNc2dBcGkuaCIKKyNpbmNsdWRlICJzaXJQYXJhbXMuaCIgICAgCisKK3RTaXJSZXRTdGF0dXMgbGltU2VuZENGUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggYnNzSWR4LCB0QU5JX1U4IGNmcENvdW50LCB0QU5JX1U4IGNmcFBlcmlvZCk7Cit0U2lyUmV0U3RhdHVzIGxpbVNlbmRCZWFjb25QYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcFVwZGF0ZWRCY25QYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gIHBzZXNzaW9uRW50cnkgKTsKKworLy90U2lyUmV0U3RhdHVzIGxpbVNlbmRCZWFjb25QYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBVcGRhdGVCZWFjb25QYXJhbXMgcFVwZGF0ZWRCY25QYXJhbXMpOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSSAgCit0U2lyUmV0U3RhdHVzIGxpbVNlbmRTd2l0Y2hDaG5sUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY2hubE51bWJlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgc2Vjb25kYXJ5Q2hubE9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQb3dlcmRCbSBtYXhUeFBvd2VyLHRBTklfVTggcGVTZXNzaW9uSWQpOworI2Vsc2UKK3RTaXJSZXRTdGF0dXMgbGltU2VuZFN3aXRjaENobmxQYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjaG5sTnVtYmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCBzZWNvbmRhcnlDaG5sT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBsb2NhbFB3ckNvbnN0cmFpbnQsdEFOSV9VOCBwZVNlc3Npb25JZCk7CisjZW5kaWYKK3RTaXJSZXRTdGF0dXMgbGltU2VuZEVkY2FQYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0VkY2FQYXJhbVJlY29yZCAqcFVwZGF0ZWRFZGNhUGFyYW1zLCB0QU5JX1UxNiBic3NJZHgsIHRBTklfQk9PTEVBTiBoaWdoUGVyZm9ybWFuY2UpOwordFNpclJldFN0YXR1cyBsaW1TZXRMaW5rU3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckxpbmtTdGF0ZSBzdGF0ZSwgIHRTaXJNYWNBZGRyIGJzc0lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyIHNlbGZNYWMsIHRwU2V0TGlua1N0YXRlQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja0FyZyk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGxpbVNldExpbmtTdGF0ZUZUKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJMaW5rU3RhdGUgCitzdGF0ZSx0U2lyTWFjQWRkciBic3NJZCwgdFNpck1hY0FkZHIgc2VsZk1hY0FkZHIsIGludCBmdCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKK3RTaXJSZXRTdGF0dXMgbGltU2VuZFNldFR4UG93ZXJSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTZXRUeFBvd2VyUmVxIHBUeFBvd2VyUmVxKTsKK3RTaXJSZXRTdGF0dXMgbGltU2VuZEdldFR4UG93ZXJSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJHZXRUeFBvd2VyUmVxIHBUeFBvd2VyUmVxKTsKKwordm9pZCBsaW1TZXRBY3RpdmVFZGNhUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgKnBsb2NhbEVkY2FQYXJhbXMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisjZGVmaW5lIENBUEFCSUxJVFlfRklMVEVSX01BU0sgIDB4NzNDRgorI2RlZmluZSBFUlBfRklMVEVSX01BU0sgICAgICAgICAweEY4CisjZGVmaW5lIEVEQ0FfRklMVEVSX01BU0sgICAgICAgIDB4RjAKKyNkZWZpbmUgUU9TX0ZJTFRFUl9NQVNLICAgICAgICAgMHhGMAorI2RlZmluZSBIVF9CWVRFMF9GSUxURVJfTUFTSyAgICAweDAKKyNkZWZpbmUgSFRfQllURTJfRklMVEVSX01BU0sgICAgMHhFQgorI2RlZmluZSBIVF9CWVRFNV9GSUxURVJfTUFTSyAgICAweEZECisjZGVmaW5lIERTX1BBUkFNX0NIQU5ORUxfTUFTSyAgIDB4MAorCisKK3RTaXJSZXRTdGF0dXMgbGltU2VuZEJlYWNvbkZpbHRlckluZm8odHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlbmRTbWVSc3BNZXNzYWdlcy5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZW5kU21lUnNwTWVzc2FnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdkOGZmCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZW5kU21lUnNwTWVzc2FnZXMuYwpAQCAtMCwwICsxLDI0NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1TZW5kU21lUnNwTWVzc2FnZXMuY2MgY29udGFpbnMgdGhlIGZ1bmN0aW9ucworICogZm9yIHNlbmRpbmcgU01FIHJlc3BvbnNlL25vdGlmaWNhdGlvbiBtZXNzYWdlcyB0byBhcHBsaWNhdGlvbnMKKyAqIGFib3ZlIE1BQyBzb2Z0d2FyZS4KKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDAyLzEzLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAidm9zX3R5cGVzLmgiCisjaW5jbHVkZSAid25pQXBpLmgiCisjaW5jbHVkZSAic2lyQ29tbW9uLmgiCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyNpbmNsdWRlICJ3bmlDZmdBcC5oIgorI2Vsc2UKKyNpbmNsdWRlICJ3bmlDZmdTdGEuaCIKKyNlbmRpZgorI2luY2x1ZGUgInN5c0RlZi5oIgorI2luY2x1ZGUgImNmZ0FwaS5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbERhdGFTdHJ1Y3QuaCIKKyNpbmNsdWRlICJoYWxDb21tb25BcGkuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbVNlY3VyaXR5VXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZXJEZXNVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlbmRTbWVSc3BNZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbUlic3NQZWVyTWdtdC5oIgorI2luY2x1ZGUgImxpbVNlc3Npb25VdGlscy5oIgorCisKKy8qKgorICogbGltU2VuZFNtZVJzcCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVSZXFNZXNzYWdlcygpIHRvIHNlbmQKKyAqIGVXTklfU01FX1NUQVJUX1JTUCwgZVdOSV9TTUVfTUVBU1VSRU1FTlRfUlNQLCBlV05JX1NNRV9TVE9QX0JTU19SU1AKKyAqIG9yIGVXTklfU01FX1NXSVRDSF9DSExfUlNQIG1lc3NhZ2VzIHRvIGFwcGxpY2F0aW9ucyBhYm92ZSBNQUMKKyAqIFNvZnR3YXJlLgorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBtc2dUeXBlICAgICAgSW5kaWNhdGVzIG1lc3NhZ2UgdHlwZQorICogQHBhcmFtIHJlc3VsdENvZGUgICBJbmRpY2F0ZXMgdGhlIHJlc3VsdCBvZiBwcmV2aW91c2x5IGlzc3VlZAorICogICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9tc2dUeXBlX1JFUSBtZXNzYWdlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltU2VuZFNtZVJzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBtc2dUeXBlLAorICAgICAgICAgICAgICB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZSx0QU5JX1U4IHNtZXNlc3Npb25JZCwgdEFOSV9VMTYgc21ldHJhbnNhY3Rpb25JZCkKK3sKKyAgICB0U2lyTXNnUSAgICBtbWhNc2c7CisgICAgdFNpclNtZVJzcCAgKnBTaXJTbWVSc3A7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgIEZMKCJTZW5kaW5nIG1lc3NhZ2UgJXMgd2l0aCByZWFzb25Db2RlICVzXG4iKSwKKyAgICAgICAgICAgbGltTXNnU3RyKG1zZ1R5cGUpLCBsaW1SZXN1bHRDb2RlU3RyKHJlc3VsdENvZGUpKTspCisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTaXJTbWVSc3AsIHNpemVvZih0U2lyU21lUnNwKSkpCisgICAgeworICAgICAgICAvLy8gQnVmZmVyIG5vdCBhdmFpbGFibGUuIExvZyBlcnJvcgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfKl9SU1BcbiIpKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorICAKKyNpZiBkZWZpbmVkIChBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiBkZWZpbmVkIChBTklfTElUVExFX0JZVEVfRU5ESUFOKQorICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVSc3AtPm1lc3NhZ2VUeXBlLCBtc2dUeXBlKTsKKyAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSZwU2lyU21lUnNwLT5sZW5ndGgsIHNpemVvZih0U2lyU21lUnNwKSk7CisjZWxzZQorICAgIHBTaXJTbWVSc3AtPm1lc3NhZ2VUeXBlID0gbXNnVHlwZTsKKyAgICBwU2lyU21lUnNwLT5sZW5ndGggICAgICA9IHNpemVvZih0U2lyU21lUnNwKTsKKyNlbmRpZgorICAgIHBTaXJTbWVSc3AtPnN0YXR1c0NvZGUgID0gcmVzdWx0Q29kZTsKKworICAgIC8qIFVwZGF0ZSBTTUUgc2Vzc2lvbiBJZCBhbmQgVHJhbnNhY3Rpb24gSWQgKi8KKyAgICBwU2lyU21lUnNwLT5zZXNzaW9uSWQgPSBzbWVzZXNzaW9uSWQ7CisgICAgcFNpclNtZVJzcC0+dHJhbnNhY3Rpb25JZCA9IHNtZXRyYW5zYWN0aW9uSWQ7CisKKworICAgIG1taE1zZy50eXBlID0gbXNnVHlwZTsKKyAgICBtbWhNc2cuYm9keXB0ciA9IHBTaXJTbWVSc3A7CisgICAgbW1oTXNnLmJvZHl2YWwgPSAwOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICB7CisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9IHBlR2V0VmFsaWRQb3dlclNhdmVTZXNzaW9uKHBNYWMpOworICAgIHN3aXRjaChtc2dUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FTlRFUl9CTVBTX1JTUDoKKyAgICAgICAgICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfRU5URVJfQk1QU19SU1BfRVZFTlQsIHBzZXNzaW9uRW50cnksICh0QU5JX1UxNilyZXN1bHRDb2RlLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVXTklfUE1DX0VYSVRfQk1QU19SU1A6CisgICAgICAgICAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0VYSVRfQk1QU19SU1BfRVZFTlQsIHBzZXNzaW9uRW50cnksICh0QU5JX1UxNilyZXN1bHRDb2RlLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVXTklfUE1DX0VOVEVSX0lNUFNfUlNQOgorICAgICAgICAgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19FTlRFUl9JTVBTX1JTUF9FVkVOVCwgcHNlc3Npb25FbnRyeSwgKHRBTklfVTE2KXJlc3VsdENvZGUsIDApOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FWElUX0lNUFNfUlNQOgorICAgICAgICAgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19FWElUX0lNUFNfUlNQX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAodEFOSV9VMTYpcmVzdWx0Q29kZSwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FTlRFUl9VQVBTRF9SU1A6CisgICAgICAgICAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0VOVEVSX1VBUFNEX1JTUF9FVkVOVCwgcHNlc3Npb25FbnRyeSwgKHRBTklfVTE2KXJlc3VsdENvZGUsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZVdOSV9QTUNfRVhJVF9VQVBTRF9SU1A6CisgICAgICAgICAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0VYSVRfVUFQU0RfUlNQX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAodEFOSV9VMTYpcmVzdWx0Q29kZSwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TV0lUQ0hfQ0hMX1JTUDoKKyAgICAgICAgICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfU1dJVENIX0NITF9SU1BfRVZFTlQsIE5VTEwsICh0QU5JX1UxNilyZXN1bHRDb2RlLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVXTklfU01FX1NUT1BfQlNTX1JTUDoKKyAgICAgICAgICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfU1RPUF9CU1NfUlNQX0VWRU5ULCBOVUxMLCAodEFOSV9VMTYpcmVzdWx0Q29kZSwgMCk7CisgICAgICAgICAgICBicmVhazsgICAgICAKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FTlRFUl9XT1dMX1JTUDoKKyAgICAgICAgICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfRU5URVJfV09XTF9SU1BfRVZFTlQsIHBzZXNzaW9uRW50cnksICh0QU5JX1UxNilyZXN1bHRDb2RlLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVXTklfUE1DX0VYSVRfV09XTF9SU1A6CisgICAgICAgICAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0VYSVRfV09XTF9SU1BfRVZFTlQsIHBzZXNzaW9uRW50cnksICh0QU5JX1UxNilyZXN1bHRDb2RlLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAKKyAgICB9IAorICAgfSAgCisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgCisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCAgZVBST1QpOworfSAvKioqIGVuZCBsaW1TZW5kU21lUnNwKCkgKioqLworCisKKy8qKgorICogbGltU2VuZFNtZUpvaW5SZWFzc29jUnNwQWZ0ZXJSZXN1bWUoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIEpvaW4vUmVhc3NvYyByc3AKKyAqIG1lc3NhZ2UgdG8gU01FIGFmdGVyIHRoZSByZXN1bWUgbGluay4KKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gc3RhdHVzICAgICAgIFJlc3VtZSBsaW5rIHN0YXR1cyAKKyAqIEBwYXJhbSBjdHggICAgICAgICAgY29udGV4dCBwYXNzZWQgd2hpbGUgY2FsbGluZyByZXNtdW5lIGxpbmsuCisgKiAgICAgICAgICAgICAgICAgICAgIChqb2luIHJlc3BvbnNlIHRvIGJlIHNlbnQpCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGxpbVNlbmRTbWVKb2luUmVhc3NvY1JzcEFmdGVyUmVzdW1lKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVIYWxTdGF0dXMgc3RhdHVzLCB0QU5JX1UzMiAqY3R4KQoreworICAgIHRTaXJNc2dRICAgICAgICAgbW1oTXNnOworICAgIHRwU2lyU21lSm9pblJzcCAgcFNpclNtZUpvaW5Sc3AgPSAodHBTaXJTbWVKb2luUnNwKSBjdHg7CisKKyAgICBtbWhNc2cudHlwZSA9IHBTaXJTbWVKb2luUnNwLT5tZXNzYWdlVHlwZTsKKyAgICBtbWhNc2cuYm9keXB0ciA9IHBTaXJTbWVKb2luUnNwOworICAgIG1taE1zZy5ib2R5dmFsID0gMDsKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtbWhNc2cudHlwZSkpOworICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgIGVQUk9UKTsKK30KKworCisvKioKKyAqIGxpbVNlbmRTbWVKb2luUmVhc3NvY1JzcCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVSZXFNZXNzYWdlcygpIHRvIHNlbmQKKyAqIGVXTklfU01FX0pPSU5fUlNQIG9yIGVXTklfU01FX1JFQVNTT0NfUlNQIG1lc3NhZ2VzIHRvIGFwcGxpY2F0aW9ucworICogYWJvdmUgTUFDIFNvZnR3YXJlLgorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBtc2dUeXBlICAgICAgSW5kaWNhdGVzIG1lc3NhZ2UgdHlwZQorICogQHBhcmFtIHJlc3VsdENvZGUgICBJbmRpY2F0ZXMgdGhlIHJlc3VsdCBvZiBwcmV2aW91c2x5IGlzc3VlZAorICogICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9tc2dUeXBlX1JFUSBtZXNzYWdlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltU2VuZFNtZUpvaW5SZWFzc29jUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IG1zZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUsIHRBTklfVTE2IHByb3RTdGF0dXNDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksdEFOSV9VOCBzbWVzZXNzaW9uSWQsdEFOSV9VMTYgc21ldHJhbnNhY3Rpb25JZCkKK3sKKyAgICB0cFNpclNtZUpvaW5Sc3AgIHBTaXJTbWVKb2luUnNwOworICAgIHRBTklfVTMyIHJzcExlbjsKKyAgICB0cERwaEhhc2hOb2RlIHBTdGFEcyAgICA9IE5VTEw7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgaWYgKG1zZ1R5cGUgPT0gZVdOSV9TTUVfUkVBU1NPQ19SU1ApCisgICAgICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfUkVBU1NPQ19SU1BfRVZFTlQsIHBzZXNzaW9uRW50cnksICh0QU5JX1UxNilyZXN1bHRDb2RlLCAwKTsKKyAgICBlbHNlCisgICAgICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfSk9JTl9SU1BfRVZFTlQsIHBzZXNzaW9uRW50cnksICh0QU5JX1UxNilyZXN1bHRDb2RlLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgRkwoIlNlbmRpbmcgbWVzc2FnZSAlcyB3aXRoIHJlYXNvbkNvZGUgJXNcbiIpLAorICAgICAgICAgICBsaW1Nc2dTdHIobXNnVHlwZSksIGxpbVJlc3VsdENvZGVTdHIocmVzdWx0Q29kZSkpOykKKworICAgIGlmKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkKKyAgICB7CisKKyAgICAgICAgcnNwTGVuID0gc2l6ZW9mKHRTaXJTbWVKb2luUnNwKTsgICAKKworICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTaXJTbWVKb2luUnNwLCByc3BMZW4pKQorICAgICAgICB7CisgICAgICAgICAgICAvLy8gQnVmZmVyIG5vdCBhdmFpbGFibGUuIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgSk9JTi9SRUFTU09DX1JTUFxuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLCAodEFOSV9VOCopcFNpclNtZUpvaW5Sc3AsIHJzcExlbik7CisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICBwU2lyU21lSm9pblJzcC0+YmVhY29uTGVuZ3RoID0gMDsKKyAgICAgICAgcFNpclNtZUpvaW5Sc3AtPmFzc29jUmVxTGVuZ3RoID0gMDsKKyAgICAgICAgcFNpclNtZUpvaW5Sc3AtPmFzc29jUnNwTGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICBlbHNlCisgICAgeworICAgICAgICByc3BMZW4gPSBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcUxlbiArIHBzZXNzaW9uRW50cnktPmFzc29jUnNwTGVuICsgCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iY25MZW4gKyAKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+UklDRGF0YUxlbiArCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYICAgICAgICAgICAgCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT50c3BlY0xlbiArIAorI2VuZGlmICAgICAgICAgICAgCisgICAgICAgICAgICBzaXplb2YodFNpclNtZUpvaW5Sc3ApIC0gc2l6ZW9mKHRBTklfVTgpIDsKKyAgICAKKyAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2lyU21lSm9pblJzcCwgcnNwTGVuKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIEJ1ZmZlciBub3QgYXZhaWxhYmxlLiBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBKT0lOL1JFQVNTT0NfUlNQXG4iKSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYywgKHRBTklfVTgqKXBTaXJTbWVKb2luUnNwLCByc3BMZW4pOworCisjaWYgZGVmaW5lZCAoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgZGVmaW5lZCAoQU5JX0xJVFRMRV9CWVRFX0VORElBTikKKyAgICAgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZUpvaW5Sc3AtPm1lc3NhZ2VUeXBlLCBtc2dUeXBlKTsKKyAgICAgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZUpvaW5Sc3AtPmxlbmd0aCwgcnNwTGVuKTsKKyNlbmRpZiAgICAKKyAgICAgICAgCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gV0xBTl9TVEEpCisgICAgICAgIGlmIChyZXN1bHRDb2RlID09IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgICAgICAgICAgaWYgKHBTdGFEcyA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCBHZXQgU2VsZiBFbnRyeSBmb3IgdGhlIHN0YXRpb25cbiIpKTspCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vUGFzcyB0aGUgcGVlcidzIHN0YUlkCisgICAgICAgICAgICAgICAgcFNpclNtZUpvaW5Sc3AtPnN0YUlkID0gcFN0YURzLT5zdGFJbmRleDsKKyAgICAgICAgICAgIHBTaXJTbWVKb2luUnNwLT51Y2FzdFNpZyAgID0gcFN0YURzLT51Y1VjYXN0U2lnOworICAgICAgICAgICAgcFNpclNtZUpvaW5Sc3AtPmJjYXN0U2lnICAgPSBwU3RhRHMtPnVjQmNhc3RTaWc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgICAgIGlmIChyZXN1bHRDb2RlID09IGVTSVJfU01FX1RSQU5TRkVSX1NUQSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFNpclNtZUpvaW5Sc3AtPmFsdGVybmF0ZUJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQWx0ZXJuYXRlUmFkaW8uYnNzSWQsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgICAgICBwU2lyU21lSm9pblJzcC0+YWx0ZXJuYXRlQ2hhbm5lbElkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUFsdGVybmF0ZVJhZGlvLmNoYW5uZWxJZDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcFNpclNtZUpvaW5Sc3AtPmJlYWNvbkxlbmd0aCA9IDA7CisgICAgICAgIHBTaXJTbWVKb2luUnNwLT5hc3NvY1JlcUxlbmd0aCA9IDA7CisgICAgICAgIHBTaXJTbWVKb2luUnNwLT5hc3NvY1JzcExlbmd0aCA9IDA7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgcFNpclNtZUpvaW5Sc3AtPnBhcnNlZFJpY1JzcExlbiA9IDA7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYICAgICAgICAgICAgCisgICAgICAgIHBTaXJTbWVKb2luUnNwLT50c3BlY0llTGVuID0gMDsKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgaWYocmVzdWx0Q29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmJlYWNvbiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTaXJTbWVKb2luUnNwLT5iZWFjb25MZW5ndGggPSBwc2Vzc2lvbkVudHJ5LT5iY25MZW47CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2lyU21lSm9pblJzcC0+ZnJhbWVzLCBwc2Vzc2lvbkVudHJ5LT5iZWFjb24sIHBTaXJTbWVKb2luUnNwLT5iZWFjb25MZW5ndGgpOworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+YmVhY29uKTsKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb24gPSBOVUxMOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiQmVhY29uPSVkXG4iKSwgcHNlc3Npb25FbnRyeS0+YmNuTGVuKTspCisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTaXJTbWVKb2luUnNwLT5hc3NvY1JlcUxlbmd0aCA9IHBzZXNzaW9uRW50cnktPmFzc29jUmVxTGVuOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNpclNtZUpvaW5Sc3AtPmZyYW1lcyArIHBzZXNzaW9uRW50cnktPmJjbkxlbiwgcHNlc3Npb25FbnRyeS0+YXNzb2NSZXEsIHBTaXJTbWVKb2luUnNwLT5hc3NvY1JlcUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcSk7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YXNzb2NSZXEgPSBOVUxMOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiQXNzb2NSZXE9JWRcbiIpLCBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JlcUxlbik7KQorI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5hc3NvY1JzcCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTaXJTbWVKb2luUnNwLT5hc3NvY1JzcExlbmd0aCA9IHBzZXNzaW9uRW50cnktPmFzc29jUnNwTGVuOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNpclNtZUpvaW5Sc3AtPmZyYW1lcyArIHBzZXNzaW9uRW50cnktPmJjbkxlbiArIHBzZXNzaW9uRW50cnktPmFzc29jUmVxTGVuLCBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JzcCwgcFNpclNtZUpvaW5Sc3AtPmFzc29jUnNwTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmFzc29jUnNwKTsKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JzcCA9IE5VTEw7CisgICAgICAgICAgICB9ICAgICAgICAgICAKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+cmljRGF0YSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTaXJTbWVKb2luUnNwLT5wYXJzZWRSaWNSc3BMZW4gPSBwc2Vzc2lvbkVudHJ5LT5SSUNEYXRhTGVuOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNpclNtZUpvaW5Sc3AtPmZyYW1lcyArIHBzZXNzaW9uRW50cnktPmJjbkxlbiArIHBzZXNzaW9uRW50cnktPmFzc29jUmVxTGVuICsgcHNlc3Npb25FbnRyeS0+YXNzb2NSc3BMZW4sIHBzZXNzaW9uRW50cnktPnJpY0RhdGEsIHBTaXJTbWVKb2luUnNwLT5wYXJzZWRSaWNSc3BMZW4pOworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+cmljRGF0YSk7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cmljRGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiUmljTGVuZ3RoPSVkXG4iKSwgcHNlc3Npb25FbnRyeS0+cGFyc2VkUmljUnNwTGVuKTspCisgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYICAgICAgICAgICAgCisgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT50c3BlY0llcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTaXJTbWVKb2luUnNwLT50c3BlY0llTGVuID0gcHNlc3Npb25FbnRyeS0+dHNwZWNMZW47CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2lyU21lSm9pblJzcC0+ZnJhbWVzICsgcHNlc3Npb25FbnRyeS0+YmNuTGVuICsgcHNlc3Npb25FbnRyeS0+YXNzb2NSZXFMZW4gKyBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JzcExlbiArIHBzZXNzaW9uRW50cnktPlJJQ0RhdGFMZW4sIHBzZXNzaW9uRW50cnktPnRzcGVjSWVzLCBwU2lyU21lSm9pblJzcC0+dHNwZWNJZUxlbik7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT50c3BlY0llcyk7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+dHNwZWNJZXMgPSBOVUxMOworICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkNDWC1Uc3BlY0xlbj0lZFxuIiksIHBzZXNzaW9uRW50cnktPnRzcGVjTGVuKTspCisgICAgICAgICAgICB9CisjZW5kaWYgICAgICAgICAgICAKKyAgICAgICAgICAgIHBTaXJTbWVKb2luUnNwLT5haWQgPSBwc2Vzc2lvbkVudHJ5LT5saW1BSUQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkFzc29jUnNwPSVkXG4iKSwgcHNlc3Npb25FbnRyeS0+YXNzb2NSc3BMZW4pOykKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisKKyAgICBwU2lyU21lSm9pblJzcC0+bWVzc2FnZVR5cGUgPSBtc2dUeXBlOworICAgIHBTaXJTbWVKb2luUnNwLT5sZW5ndGggPSAodEFOSV9VMTYpIHJzcExlbjsKKyAgICBwU2lyU21lSm9pblJzcC0+c3RhdHVzQ29kZSA9IHJlc3VsdENvZGU7CisgICAgcFNpclNtZUpvaW5Sc3AtPnByb3RTdGF0dXNDb2RlID0gcHJvdFN0YXR1c0NvZGU7CisgICAgCisgICAgLyogVXBkYXRlIFNNRSBzZXNzaW9uIElEIGFuZCB0cmFuc2FjdGlvbiBJZCAqLworICAgIHBTaXJTbWVKb2luUnNwLT5zZXNzaW9uSWQgPSBzbWVzZXNzaW9uSWQ7CisgICAgcFNpclNtZUpvaW5Sc3AtPnRyYW5zYWN0aW9uSWQgPSBzbWV0cmFuc2FjdGlvbklkOworICAgIAorICAgIGlmKElTX01DQ19TVVBQT1JURUQgJiYgbGltSXNMaW5rU3VzcGVuZGVkKCBwTWFjICkgKQorICAgIHsKKyAgICAgICAgaWYoIHBzZXNzaW9uRW50cnkgJiYgcHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTElOS19FU1RfU1RBVEUgKQorICAgICAgICB7CisgICAgICAgICAgICBwZVNldFJlc3VtZUNoYW5uZWwoIHBNYWMsIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwZVNldFJlc3VtZUNoYW5uZWwoIHBNYWMsIDAsIDApOworICAgICAgICB9CisgICAgICAgIGxpbVJlc3VtZUxpbmsoIHBNYWMsIGxpbVNlbmRTbWVKb2luUmVhc3NvY1JzcEFmdGVyUmVzdW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIqKSBwU2lyU21lSm9pblJzcCApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW1TZW5kU21lSm9pblJlYXNzb2NSc3BBZnRlclJlc3VtZSggcE1hYywgZUhBTF9TVEFUVVNfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIqKSBwU2lyU21lSm9pblJzcCApOworICAgIH0KK30gLyoqKiBlbmQgbGltU2VuZFNtZUpvaW5SZWFzc29jUnNwKCkgKioqLworCisKKworLyoqCisgKiBsaW1TZW5kU21lU3RhcnRCc3NSc3AoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGVXTklfU01FX1NUQVJUX0JTU19SU1AKKyAqIG1lc3NhZ2UgdG8gYXBwbGljYXRpb25zIGFib3ZlIE1BQyBTb2Z0d2FyZS4KKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gbXNnVHlwZSAgICAgIEluZGljYXRlcyBtZXNzYWdlIHR5cGUKKyAqIEBwYXJhbSByZXN1bHRDb2RlICAgSW5kaWNhdGVzIHRoZSByZXN1bHQgb2YgcHJldmlvdXNseSBpc3N1ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgZVdOSV9TTUVfbXNnVHlwZV9SRVEgbWVzc2FnZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVNlbmRTbWVTdGFydEJzc1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2IG1zZ1R5cGUsIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBzbWVzZXNzaW9uSWQsdEFOSV9VMTYgc21ldHJhbnNhY3Rpb25JZCkKK3sKKworCisgICAgdEFOSV9VMTYgICAgICAgICAgICBzaXplID0gMDsKKyAgICB0U2lyTXNnUSAgICAgICAgICAgIG1taE1zZzsKKyAgICB0U2lyU21lU3RhcnRCc3NSc3AgICpwU2lyU21lUnNwOworICAgIHRBTklfVTE2ICAgICAgICAgICAgaWVMZW47CisgICAgdEFOSV9VMTYgICAgICAgICAgICBpZU9mZnNldCwgY3VyTGVuOworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBtZXNzYWdlICVzIHdpdGggcmVhc29uQ29kZSAlc1xuIiksCisgICAgICAgICAgIGxpbU1zZ1N0cihtc2dUeXBlKSwgbGltUmVzdWx0Q29kZVN0cihyZXN1bHRDb2RlKSk7KQorCisgICAgc2l6ZSA9IHNpemVvZih0U2lyU21lU3RhcnRCc3NSc3ApOworCisgICAgaWYocHNlc3Npb25FbnRyeSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAKKyAgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNpclNtZVJzcCwgc2l6ZSkpCisgICAgICAgICB7CisgICAgICAgICAgICAvLy8gQnVmZmVyIG5vdCBhdmFpbGFibGUuIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9TVEFSVF9CU1NfUlNQXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMsICh0QU5JX1U4KilwU2lyU21lUnNwLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9zdWJ0cmFjdCBzaXplIG9mIGJlYWNvbkxlbmd0aCArIE1hYyBIZHIgKyBGaXhlZCBGaWVsZHMgYmVmb3JlIFNTSUQKKyAgICAgICAgaWVPZmZzZXQgPSBzaXplb2YodEFuaUJlYWNvblN0cnVjdCkgKyBTSVJfTUFDX0JfUFJfU1NJRF9PRkZTRVQ7CisgICAgICAgIGllTGVuID0gcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uT2Zmc2V0QmVnaW4gKyBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25PZmZzZXRFbmQgLSBpZU9mZnNldDsKKyAgICAgICAgLy9jYWxjdWxhdGUgdGhlIG1lbW9yeSBzaXplIHRvIGFsbG9jYXRlCisgICAgICAgIHNpemUgKz0gaWVMZW47CisKKyAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2lyU21lUnNwLCBzaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIEJ1ZmZlciBub3QgYXZhaWxhYmxlLiBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9TVEFSVF9CU1NfUlNQXG4iKSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMsICh0QU5JX1U4KilwU2lyU21lUnNwLCBzaXplKTsKKyAgICAgICAgc2l6ZSA9IHNpemVvZih0U2lyU21lU3RhcnRCc3NSc3ApOworICAgICAgICBpZiAocmVzdWx0Q29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKQorICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBzaXJDb3B5TWFjQWRkcihwU2lyU21lUnNwLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQpOworICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiBSZWFkIGJlYWNvbiBpbnRlcnZhbCBmcm9tIHNlc3Npb24gKi8KKyAgICAgICAgICAgICAgICBwU2lyU21lUnNwLT5ic3NEZXNjcmlwdGlvbi5iZWFjb25JbnRlcnZhbCA9ICh0QU5JX1UxNikgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmJlYWNvbkludGVydmFsOworICAgICAgICAgICAgICAgIHBTaXJTbWVSc3AtPmJzc1R5cGUgICAgICAgICA9IHBzZXNzaW9uRW50cnktPmJzc1R5cGU7CisKKyAgICAgICAgICAgICAgICBpZiAoY2ZnR2V0Q2FwYWJpbGl0eUluZm8oIHBNYWMsICZwU2lyU21lUnNwLT5ic3NEZXNjcmlwdGlvbi5jYXBhYmlsaXR5SW5mbyxwc2Vzc2lvbkVudHJ5KQorICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBDYXBhYmlsaXRpZXMgdmFsdWVcbiIpKTsKKworICAgICAgICAgICAgICAgIGxpbUdldFBoeU1vZGUocE1hYywgKHRBTklfVTMyICopJnBTaXJTbWVSc3AtPmJzc0Rlc2NyaXB0aW9uLm53VHlwZSwgcHNlc3Npb25FbnRyeSk7CisKKyNpZiAwCisgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19DVVJSRU5UX0NIQU5ORUwsICZsZW4pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBDVVJSRU5UX0NIQU5ORUwgZnJvbSBDRkdcbiIpKTsKKyAgICAgICAgICAgCisjZW5kaWYvLyBUTyBTVVBQT1JUIEJULUFNUCAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBTaXJTbWVSc3AtPmJzc0Rlc2NyaXB0aW9uLmNoYW5uZWxJZCA9IHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbDsKKworICAgICAgICAgICAgICAgIHBTaXJTbWVSc3AtPmJzc0Rlc2NyaXB0aW9uLmFuaUluZGljYXRvciA9IDE7CisKKyAgICAgICAgICAgICAgICBjdXJMZW4gPSBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25PZmZzZXRCZWdpbiAtIGllT2Zmc2V0OworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopICZwU2lyU21lUnNwLT5ic3NEZXNjcmlwdGlvbi5pZUZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbkZyYW1lQmVnaW4gKyBpZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyKWN1ckxlbik7CisKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoKHRBTklfVTggKikgJnBTaXJTbWVSc3AtPmJzc0Rlc2NyaXB0aW9uLmllRmllbGRzKSArIGN1ckxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbkZyYW1lRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIpcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uT2Zmc2V0RW5kKTsKKworCisgICAgICAgICAgICAgICAgLy9zdWJ0cmFjdGluZyBzaXplIG9mIGxlbmd0aCBpbmRpY2F0b3IgaXRzZWxmIGFuZCBzaXplIG9mIHBvaW50ZXIgdG8gaWVGaWVsZHMKKyAgICAgICAgICAgICAgICBwU2lyU21lUnNwLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGggPSBzaXplb2YodFNpckJzc0Rlc2NyaXB0aW9uKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodEFOSV9VMTYpIC0gc2l6ZW9mKHRBTklfVTMyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZUxlbjsKKyAgICAgICAgICAgICAgICAvL1RoaXMgaXMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UsIHN1YnRyYWN0aW5nIHRoZSBzaXplIG9mIHRoZSBwb2ludGVyIHRvIGllRmllbGRzCisgICAgICAgICAgICAgICAgc2l6ZSArPSBpZUxlbiAtIHNpemVvZih0QU5JX1UzMik7CisgICAgICAgIH0KKworICAgICAgICAgICAgCisKKyNpZiBkZWZpbmVkIChBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiBkZWZpbmVkIChBTklfTElUVExFX0JZVEVfRU5ESUFOKQorICAgICAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSZwU2lyU21lUnNwLT5tZXNzYWdlVHlwZSwgbXNnVHlwZSk7CisgICAgICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVSc3AtPmxlbmd0aCwgc2l6ZSk7CisgICAgICAgCisjZW5kaWYKKyAgICAgICAgCisgICAgfQorCisgICAgcFNpclNtZVJzcC0+bWVzc2FnZVR5cGUgICAgID0gbXNnVHlwZTsKKyAgICBwU2lyU21lUnNwLT5sZW5ndGggICAgICAgICAgPSBzaXplOworCisgICAgLyogVXBkYXRlIFNNRSBzZXNzaW9uIElkIGFuZCB0cmFuc2FjdGlvbiBJZCAqLworICAgIHBTaXJTbWVSc3AtPnNlc3Npb25JZCAgICAgICA9IHNtZXNlc3Npb25JZDsKKyAgICBwU2lyU21lUnNwLT50cmFuc2FjdGlvbklkICAgPSBzbWV0cmFuc2FjdGlvbklkOworICAgIHBTaXJTbWVSc3AtPnN0YXR1c0NvZGUgICAgICA9IHJlc3VsdENvZGU7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKHBzZXNzaW9uRW50cnkgIT0gTlVMTCApCisgICAgcFNpclNtZVJzcC0+c3RhSWQgICAgICAgICAgID0gcHNlc3Npb25FbnRyeS0+c3RhSWQ7IC8vZWxzZSBpdCB3aWxsIGJlIGFsd2F5cyB6ZXJvIHNtZVJzcCBTdGFJRCA9IDAgCisgICAgICAKKyNlbmRpZgorCisgICAgbW1oTXNnLnR5cGUgPSBtc2dUeXBlOworICAgIG1taE1zZy5ib2R5cHRyID0gcFNpclNtZVJzcDsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX1NUQVJUX0JTU19SU1BfRVZFTlQsIHBzZXNzaW9uRW50cnksICh0QU5JX1UxNilyZXN1bHRDb2RlLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgIGVQUk9UKTsKK30gLyoqKiBlbmQgbGltU2VuZFNtZVN0YXJ0QnNzUnNwKCkgKioqLworCisKKworCisKKyNkZWZpbmUgTElNX01BWF9OVU1fT0ZfU0NBTl9SRVNVTFRTX1JFUE9SVEVEICAyMAorI2RlZmluZSBMSU1fU0laRV9PRl9FQUNIX0JTUyAgNDAwIC8vIHRoaXMgaXMgYSByb3VnaCBlc3RpbWF0ZQorCisKKy8qKgorICogbGltU2VuZFNtZVNjYW5Sc3AoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMoKSB0byBzZW5kCisgKiBlV05JX1NNRV9TQ0FOX1JTUCBtZXNzYWdlIHRvIGFwcGxpY2F0aW9ucyBhYm92ZSBNQUMKKyAqIFNvZnR3YXJlLgorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBsZW5ndGggICAgICAgSW5kaWNhdGVzIGxlbmd0aCBvZiBtZXNzYWdlCisgKiBAcGFyYW0gcmVzdWx0Q29kZSAgIEluZGljYXRlcyB0aGUgcmVzdWx0IG9mIHByZXZpb3VzbHkgaXNzdWVkCisgKiAgICAgICAgICAgICAgICAgICAgIGVXTklfU01FX1NDQU5fUkVRIG1lc3NhZ2UKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1TZW5kU21lU2NhblJzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBsZW5ndGgsCisgICAgICAgICAgICAgICAgICB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZSx0QU5JX1U4ICBzbWVzZXNzaW9uSWQsdEFOSV9VMTYgc21ldHJhbnNjYXRpb25JZCkKK3sKKyAgICB0U2lyTXNnUSAgICAgICAgICAgICAgbW1oTXNnOworICAgIHRwU2lyU21lU2NhblJzcCAgICAgICBwU2lyU21lU2NhblJzcD1OVUxMOworICAgIHRMaW1TY2FuUmVzdWx0Tm9kZSAgICAqcHRlbXAgPSBOVUxMOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICBtc2dMZW4sIGFsbG9jTGVuZ3RoLCBjdXJNc2dMZW4gPSAwOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICBpLCBic3NDb3VudDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgKnBiQnVmOworICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAgICAqcERlc2M7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgRkwoIlNlbmRpbmcgbWVzc2FnZSBTTUVfU0NBTl9SU1Agd2l0aCBsZW5ndGg9JWQgcmVhc29uQ29kZSAlc1xuIiksCisgICAgICAgbGVuZ3RoLCBsaW1SZXN1bHRDb2RlU3RyKHJlc3VsdENvZGUpKTspCisKKyAgICBpZiAocmVzdWx0Q29kZSAhPSBlU0lSX1NNRV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltUG9zdFNtZVNjYW5Sc3BNZXNzYWdlKHBNYWMsIGxlbmd0aCwgcmVzdWx0Q29kZSxzbWVzZXNzaW9uSWQsc21ldHJhbnNjYXRpb25JZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX1NDQU5fUlNQOworICAgIGkgPSAwOworICAgIGJzc0NvdW50ID0gMDsKKyAgICBtc2dMZW4gPSAwOworICAgIGFsbG9jTGVuZ3RoID0gTElNX01BWF9OVU1fT0ZfU0NBTl9SRVNVTFRTX1JFUE9SVEVEICogTElNX1NJWkVfT0ZfRUFDSF9CU1M7CisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2lyU21lU2NhblJzcCwgYWxsb2NMZW5ndGgpKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfU0NBTl9SU1BcbiIpKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBMSU1fTUFYX05VTV9PRl9TQ0FOX1JFU1VMVFM7IGkrKykKKyAgICB7CisgICAgICAgIC8vd2hlbiBwdGVtcCBpcyBub3QgTlVMTCBpdCBpcyBhIGxlZnQgb3ZlcgorICAgICAgICBwdGVtcCA9IHBNYWMtPmxpbS5nTGltQ2FjaGVkU2Nhbkhhc2hUYWJsZVtpXTsKKyAgICAgICAgd2hpbGUocHRlbXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBiQnVmID0gKCh0QU5JX1U4ICopcFNpclNtZVNjYW5Sc3ApICsgbXNnTGVuOworICAgICAgICAgICAgaWYoMCA9PSBic3NDb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtc2dMZW4gPSBzaXplb2YodFNpclNtZVNjYW5Sc3ApIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZW1wLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0ZW1wLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBEZXNjID0gcFNpclNtZVNjYW5Sc3AtPmJzc0Rlc2NyaXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zZ0xlbiArPSBwdGVtcC0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0ZW1wLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBEZXNjID0gKHRTaXJCc3NEZXNjcmlwdGlvbiAqKXBiQnVmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIChhbGxvY0xlbmd0aCA8IG1zZ0xlbikgfHwKKyAgICAgICAgICAgICAgICAgKExJTV9NQVhfTlVNX09GX1NDQU5fUkVTVUxUU19SRVBPUlRFRCA8PSBic3NDb3VudCsrKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNpclNtZVNjYW5Sc3AtPnN0YXR1c0NvZGUgID0KKyAgICAgICAgICAgICAgICAgICAgZVNJUl9TTUVfTU9SRV9TQ0FOX1JFU1VMVFNfRk9MTE9XOworI2lmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIGRlZmluZWQgKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pCisgICAgICAgICAgICAgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZVNjYW5Sc3AtPm1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9TQ0FOX1JTUCk7CisgICAgICAgICAgICAgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZVNjYW5Sc3AtPmxlbmd0aCwgY3VyTXNnTGVuKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgcFNpclNtZVNjYW5Sc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfU0NBTl9SU1A7CisgICAgICAgICAgICAgICAgcFNpclNtZVNjYW5Sc3AtPmxlbmd0aCAgICAgID0gY3VyTXNnTGVuOworI2VuZGlmCisgICAgICAgICAgICAgICAgbW1oTXNnLmJvZHlwdHIgPSBwU2lyU21lU2NhblJzcDsKKyAgICAgICAgICAgICAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyAgICAgICAgICAgICAgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKyAgICAgICAgICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTaXJTbWVTY2FuUnNwLCBhbGxvY0xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX1NDQU5fUlNQXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXNnTGVuID0gc2l6ZW9mKHRTaXJTbWVTY2FuUnNwKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpckJzc0Rlc2NyaXB0aW9uKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGVtcC0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwdGVtcC0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwRGVzYyA9IHBTaXJTbWVTY2FuUnNwLT5ic3NEZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBic3NDb3VudCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJNc2dMZW4gPSBtc2dMZW47CisKKyAgICAgICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIlNjYW5Sc3AgOiBtc2dMZW4gJWQsIGJzc0Rlc2NyIExlbj0lZFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0xlbiwgcHRlbXAtPmJzc0Rlc2NyaXB0aW9uLmxlbmd0aCk7KQorI2lmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIGRlZmluZWQgKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pCisgICAgICAgICAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSZwRGVzYy0+bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZW1wLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGgpOworI2Vsc2UKKyAgICAgICAgICAgIHBEZXNjLT5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgPSBwdGVtcC0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoOworI2VuZGlmCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmcERlc2MtPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJnB0ZW1wLT5ic3NEZXNjcmlwdGlvbi5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZW1wLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGgpOworCisgICAgICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJCc3NJZCAiKSk7CisgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcHRlbXAtPmJzc0Rlc2NyaXB0aW9uLmJzc0lkLCBMT0cyKTspCisKKyAgICAgICAgICAgIHBTaXJTbWVTY2FuUnNwLT5zZXNzaW9uSWQgICA9IHNtZXNlc3Npb25JZDsKKyAgICAgICAgICAgIHBTaXJTbWVTY2FuUnNwLT50cmFuc2NhdGlvbklkID0gc21ldHJhbnNjYXRpb25JZDsKKworICAgICAgICAgICAgcHRlbXAgPSBwdGVtcC0+bmV4dDsKKyAgICAgICAgfSAvL3doaWxlKHB0ZW1wKQorICAgIH0gLy9mb3IgKGkgPSAwOyBpIDwgTElNX01BWF9OVU1fT0ZfU0NBTl9SRVNVTFRTOyBpKyspCisKKyAgICBpZigwID09IGJzc0NvdW50KQorICAgIHsKKyAgICAgICBsaW1Qb3N0U21lU2NhblJzcE1lc3NhZ2UocE1hYywgbGVuZ3RoLCByZXN1bHRDb2RlLCBzbWVzZXNzaW9uSWQsIHNtZXRyYW5zY2F0aW9uSWQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBzZW5kIGxhc3QgbWVzc2FnZQorICAgICAgICBwU2lyU21lU2NhblJzcC0+c3RhdHVzQ29kZSAgPSBlU0lSX1NNRV9TVUNDRVNTOworI2lmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIGRlZmluZWQgKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pCisgICAgICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVTY2FuUnNwLT5tZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVdOSV9TTUVfU0NBTl9SU1ApOworICAgICAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSZwU2lyU21lU2NhblJzcC0+bGVuZ3RoLCBjdXJNc2dMZW4pOworI2Vsc2UKKyAgICAgICAgcFNpclNtZVNjYW5Sc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfU0NBTl9SU1A7CisgICAgICAgIHBTaXJTbWVTY2FuUnNwLT5sZW5ndGggPSBjdXJNc2dMZW47CisjZW5kaWYKKworICAgICAgICAvKiBVcGRhdGUgU01FIHNlc3Npb24gSWQgYW5kIFNNRSB0cmFuc2NhdGlvbiBJZCAqLworICAgICAgICBwU2lyU21lU2NhblJzcC0+c2Vzc2lvbklkICAgPSBzbWVzZXNzaW9uSWQ7CisgICAgICAgIHBTaXJTbWVTY2FuUnNwLT50cmFuc2NhdGlvbklkID0gc21ldHJhbnNjYXRpb25JZDsKKworICAgICAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX1NDQU5fUlNQOworICAgICAgICBtbWhNc2cuYm9keXB0ciA9IHBTaXJTbWVTY2FuUnNwOworICAgICAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICAgICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgZVBST1QpOworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJzdGF0dXNDb2RlIDogZVNJUl9TTUVfU1VDQ0VTU1xuIikpOykKKyAgICB9CisKKyAgICByZXR1cm47CisKK30gLyoqKiBlbmQgbGltU2VuZFNtZVNjYW5Sc3AoKSAqKiovCisKKworLyoqCisgKiBsaW1Qb3N0U21lU2NhblJzcE1lc3NhZ2UoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1TZW5kU21lU2NhblJzcCgpIHRvIHNlbmQKKyAqIGVXTklfU01FX1NDQU5fUlNQIG1lc3NhZ2Ugd2l0aCBmYWlsZWQgcmVzdWx0IGNvZGUKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIGxlbmd0aCAgICAgICBJbmRpY2F0ZXMgbGVuZ3RoIG9mIG1lc3NhZ2UKKyAqIEBwYXJhbSByZXN1bHRDb2RlICAgZmFpbGVkIHJlc3VsdCBjb2RlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltUG9zdFNtZVNjYW5Sc3BNZXNzYWdlKHRwQW5pU2lyR2xvYmFsICAgIHBNYWMsICAgICAKKyAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiAgICAgICAgICAgICAgIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICB0U2lyUmVzdWx0Q29kZXMgICByZXN1bHRDb2RlLHRBTklfVTggc21lc2Vzc2lvbklkLCB0QU5JX1UxNiBzbWV0cmFuc2FjdGlvbklkKQoreworICAgIHRwU2lyU21lU2NhblJzcCAgIHBTaXJTbWVTY2FuUnNwOworICAgIHRTaXJNc2dRICAgICAgICAgIG1taE1zZzsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICBGTCgibGltUG9zdFNtZVNjYW5Sc3BNZXNzYWdlOiBzZW5kIFNNRV9TQ0FOX1JTUCAobGVuICVkLCByZWFzb25Db2RlICVzKS4gXG4iKSwKKyAgICAgICBsZW5ndGgsIGxpbVJlc3VsdENvZGVTdHIocmVzdWx0Q29kZSkpOykKKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNpclNtZVNjYW5Sc3AsIGxlbmd0aCkpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfU0NBTl9SU1BcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKilwU2lyU21lU2NhblJzcCwgbGVuZ3RoKTsKKworI2lmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIGRlZmluZWQgKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pCisgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZVNjYW5Sc3AtPm1lc3NhZ2VUeXBlLCBlV05JX1NNRV9TQ0FOX1JTUCk7CisgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZVNjYW5Sc3AtPmxlbmd0aCwgbGVuZ3RoKTsKKyNlbHNlCisgICAgcFNpclNtZVNjYW5Sc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfU0NBTl9SU1A7CisgICAgcFNpclNtZVNjYW5Sc3AtPmxlbmd0aCAgICAgID0gbGVuZ3RoOworI2VuZGlmCisKKyAgICBpZihzaXplb2YodFNpclNtZVNjYW5Sc3ApIDw9IGxlbmd0aCkKKyAgICB7CisgICAgICAgIHBTaXJTbWVTY2FuUnNwLT5ic3NEZXNjcmlwdGlvbi0+bGVuZ3RoID0gc2l6ZW9mKHRTaXJCc3NEZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcFNpclNtZVNjYW5Sc3AtPnN0YXR1c0NvZGUgID0gcmVzdWx0Q29kZTsKKworICAgIC8qVXBkYXRlIFNNRSBzZXNzaW9uIElkIGFuZCB0cmFuc2FjdGlvbiBJZCAqLworICAgIHBTaXJTbWVTY2FuUnNwLT5zZXNzaW9uSWQgPSBzbWVzZXNzaW9uSWQ7CisgICAgcFNpclNtZVNjYW5Sc3AtPnRyYW5zY2F0aW9uSWQgPSBzbWV0cmFuc2FjdGlvbklkOworICAgIAorICAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfU0NBTl9SU1A7CisgICAgbW1oTXNnLmJvZHlwdHIgPSBwU2lyU21lU2NhblJzcDsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtbWhNc2cudHlwZSkpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX1NDQU5fUlNQX0VWRU5ULCBOVUxMLCAodEFOSV9VMTYpcmVzdWx0Q29kZSwgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisKKyAgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKyAgICByZXR1cm47CisKK30gIC8qKiogbGltUG9zdFNtZVNjYW5Sc3BNZXNzYWdlICoqKi8KKworCisKKy8qKgorICogbGltU2VuZFNtZUF1dGhSc3AoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lTWVzc2FnZXMoKSB0byBzZW5kCisgKiBlV05JX1NNRV9BVVRIX1JTUCBtZXNzYWdlIHRvIGhvc3QKKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gc3RhdHVzQ29kZSAgIEluZGljYXRlcyB0aGUgcmVzdWx0IG9mIHByZXZpb3VzbHkgaXNzdWVkCisgKiAgICAgICAgICAgICAgICAgICAgIGVXTklfU01FX0FVVEhfUkVRIG1lc3NhZ2UKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltU2VuZFNtZUF1dGhSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgIHRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlLAorICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICB0QW5pQXV0aFR5cGUgYXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICB0QU5JX1UxNiAgIHByb3RTdGF0dXNDb2RlLAorICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSx0QU5JX1U4IHNtZXNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgIHRBTklfVTE2IHNtZXRyYW5zYWN0aW9uSWQpCit7CisjaWYgMAorICAgIHRTaXJNc2dRICAgICAgIG1taE1zZzsKKyAgICB0U2lyU21lQXV0aFJzcCAqcFNpclNtZUF1dGhSc3A7CisKKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNpclNtZUF1dGhSc3AsIHNpemVvZih0U2lyU21lQXV0aFJzcCkpKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9BVVRIX1JTUFxuIikpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBkZWZpbmVkIChBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiBkZWZpbmVkIChBTklfTElUVExFX0JZVEVfRU5ESUFOKQorICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVBdXRoUnNwLT5tZXNzYWdlVHlwZSwgZVdOSV9TTUVfQVVUSF9SU1ApOworICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVBdXRoUnNwLT5sZW5ndGgsIHNpemVvZih0U2lyU21lQXV0aFJzcCkpOworIAorI2VuZGlmCisgICAKKworICAgIGlmKHBzZXNzaW9uRW50cnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBTaXJTbWVBdXRoUnNwLT5wZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgcFNpclNtZUF1dGhSc3AtPmF1dGhUeXBlICAgID0gYXV0aFR5cGU7CisgICAgICAgICAgCisgICAgfQorCisgICAgcFNpclNtZUF1dGhSc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfQVVUSF9SU1A7CisgICAgcFNpclNtZUF1dGhSc3AtPmxlbmd0aCAgICAgID0gc2l6ZW9mKHRTaXJTbWVBdXRoUnNwKTsKKyAgICBwU2lyU21lQXV0aFJzcC0+c3RhdHVzQ29kZSAgPSBzdGF0dXNDb2RlOworICAgIHBTaXJTbWVBdXRoUnNwLT5wcm90U3RhdHVzQ29kZSA9IHByb3RTdGF0dXNDb2RlOworICAgIAorICAgIC8qIFVwZGF0ZSBTTUUgc2Vzc2lvbiBhbmQgdHJhbnNhY3Rpb24gSWQqLworICAgIHBTaXJTbWVBdXRoUnNwLT5zZXNzaW9uSWQgPSBzbWVzZXNzaW9uSWQ7CisgICAgcFNpclNtZUF1dGhSc3AtPnRyYW5zYWN0aW9uSWQgPSBzbWV0cmFuc2FjdGlvbklkOyAgCisKKyAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX0FVVEhfUlNQOworICAgIG1taE1zZy5ib2R5cHRyID0gcFNpclNtZUF1dGhSc3A7CisgICAgbW1oTXNnLmJvZHl2YWwgPSAwOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCAgZVBST1QpOworI2VuZGlmCit9IC8qKiogZW5kIGxpbVNlbmRTbWVBdXRoUnNwKCkgKioqLworCisKK3ZvaWQgbGltU2VuZFNtZURpc2Fzc29jRGVhdXRoTnRmUG9zdFJlc3VtZSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUhhbFN0YXR1cyBzdGF0dXMsIHRBTklfVTMyICpwQ3R4ICkKK3sKKyAgICB0U2lyTXNnUSAgICAgICAgICAgICAgICBtbWhNc2c7CisgICAgdFNpck1zZ1EgICAgICAgICAgICAgICAgKnBNc2cgPSAodFNpck1zZ1EqKSBwQ3R4OworCisgICAgbW1oTXNnLnR5cGUgPSBwTXNnLT50eXBlOworICAgIG1taE1zZy5ib2R5cHRyID0gcE1zZzsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtbWhNc2cudHlwZSkpOworCisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7Cit9CisvKioKKyAqIGxpbVNlbmRTbWVEaXNhc3NvY050ZigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVNZXNzYWdlcygpIHRvIHNlbmQKKyAqIGVXTklfU01FX0RJU0FTU09DX1JTUC9JTkQgbWVzc2FnZSB0byBob3N0CisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNlbmRpbmcgZVdOSV9TTUVfRElTQVNTT0NfQ05GLAorICogb3IgZVdOSV9TTUVfRElTQVNTT0NfSU5EIHRvIGhvc3QgZGVwZW5kaW5nIG9uCisgKiBkaXNhc3NvY2lhdGlvbiB0cmlnZ2VyLgorICoKKyAqIEBwYXJhbSBwZWVyTWFjQWRkciAgICAgICBJbmRpY2F0ZXMgdGhlIHBlZXIgTUFDIGFkZHIgdG8gd2hpY2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhc3NvY2lhdGUgd2FzIGluaXRpYXRlZAorICogQHBhcmFtIHJlYXNvbkNvZGUgICAgICAgIEluZGljYXRlcyB0aGUgcmVhc29uIGZvciBEaXNhc3NvY2lhdGlvbgorICogQHBhcmFtIGRpc2Fzc29jVHJpZ2dlciAgIEluZGljYXRlcyB0aGUgdHJpZ2dlciBmb3IgRGlzYXNzb2NpYXRpb24KKyAqIEBwYXJhbSBhaWQgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIFNUQUlELiBUaGlzIHBhcmFtZXRlciBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQgb25seSBvbiBBUC4KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltU2VuZFNtZURpc2Fzc29jTnRmKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgdFNpclJlc3VsdENvZGVzIHJlYXNvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgZGlzYXNzb2NUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2IGFpZCwKKyAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IHNtZXNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiBzbWV0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgKnBCdWY7CisgICAgdFNpclNtZURpc2Fzc29jUnNwICAgICAgKnBTaXJTbWVEaXNhc3NvY1JzcDsKKyAgICB0U2lyU21lRGlzYXNzb2NJbmQgICAgICAqcFNpclNtZURpc2Fzc29jSW5kOworICAgIHRBTklfVTMyICpwTXNnOworICAgIAorICAgIHN3aXRjaCAoZGlzYXNzb2NUcmlnZ2VyKQorICAgIHsKKyAgICAgICAgY2FzZSBlTElNX1BFRVJfRU5USVRZX0RJU0FTU09DOgorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNhc2UgZUxJTV9IT1NUX0RJU0FTU09DOgorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBEaXNhc3NvY2lhdGlvbiByZXNwb25zZSBkdWUgdG8KKyAgICAgICAgICAgICAqIGhvc3QgdHJpZ2dlcmVkIGRpc2Fzc29jaWF0aW9uCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2lyU21lRGlzYXNzb2NSc3AsIHNpemVvZih0U2lyU21lRGlzYXNzb2NSc3ApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX0RJU0FTU09DX1JTUFxuIikpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisjaWYgZGVmaW5lZCAoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgZGVmaW5lZCAoQU5JX0xJVFRMRV9CWVRFX0VORElBTikKKyAgICAgICAgICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVEaXNhc3NvY1JzcC0+bWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZVdOSV9TTUVfRElTQVNTT0NfUlNQKTsKKyAgICAgICAgICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVEaXNhc3NvY1JzcC0+bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyU21lRGlzYXNzb2NSc3ApKTsKKyNlbHNlCisgICAgICAgICAgICBwU2lyU21lRGlzYXNzb2NSc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfRElTQVNTT0NfUlNQOworICAgICAgICAgICAgcFNpclNtZURpc2Fzc29jUnNwLT5sZW5ndGggICAgICA9IHNpemVvZih0U2lyU21lRGlzYXNzb2NSc3ApOworI2VuZGlmCisgICAgICAgICAgICAvL3Nlc3Npb25JZAorICAgICAgICAgICAgcEJ1ZiA9ICh0QU5JX1U4ICopICZwU2lyU21lRGlzYXNzb2NSc3AtPnNlc3Npb25JZDsKKyAgICAgICAgICAgICpwQnVmID0gc21lc2Vzc2lvbklkOworICAgICAgICAgICAgcEJ1ZisrOworCisgICAgICAgICAgICAvL3RyYW5zYWN0aW9uSWQKKyAgICAgICAgICAgIGxpbUNvcHlVMTYocEJ1Ziwgc21ldHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICAgICAgICAgIC8vc3RhdHVzQ29kZSAgICAgICAgICAgIAorICAgICAgICAgICAgbGltQ29weVUzMihwQnVmLCByZWFzb25Db2RlKTsKKyAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJSZXN1bHRDb2Rlcyk7CisKKyAgICAgICAgICAgIC8vcGVlck1hY0FkZHIKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgICAgICAgICAgbGltQ29weVUxNihwQnVmLCBhaWQpOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgICAgICAgICAvLyBwZXJTdGFTdGF0cworICAgICAgICAgICAgbGltU3RhdFNlckRlcyhwTWFjLCAmcE1hYy0+aGFsLmhhbE1hYy5tYWNTdGF0cy5wUGVyU3RhU3RhdHNbYWlkXS5zdGFTdGF0LCBwQnVmKTsKKyNlbHNlCisgICAgICAgICAgICAvLyBDbGVhciBTdGF0aW9uIFN0YXRzCisgICAgICAgICAgICAvL2ZvciBzdGEsIGl0IGlzIGFsd2F5cyAxLCBJQlNTIGlzIGhhbmRsZWQgYXQgaGFsSW5pdFN0YQorCisjZW5kaWYvLyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKworICAgICAgICAgIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICAgICAgICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfRElTQVNTT0NfUlNQX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LCAodEFOSV9VMTYpcmVhc29uQ29kZSwgMCk7CisjZW5kaWYKKyAgICAgICAgICAgIHBNc2cgPSAodEFOSV9VMzIqKSBwU2lyU21lRGlzYXNzb2NSc3A7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBEaXNhc3NvY2lhdGlvbiBpbmRpY2F0aW9uIGR1ZSB0byBEaXNhc3NvY2lhdGlvbgorICAgICAgICAgICAgICogZnJhbWUgcmVjZXB0aW9uIGZyb20gcGVlciBlbnRpdHkgb3IgZHVlIHRvCisgICAgICAgICAgICAgKiBsb3NzIG9mIGxpbmsgd2l0aCBwZWVyIGVudGl0eS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2lyU21lRGlzYXNzb2NJbmQsIHNpemVvZih0U2lyU21lRGlzYXNzb2NJbmQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX0RJU0FTU09DX0lORFxuIikpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisjaWYgZGVmaW5lZCAoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgZGVmaW5lZCAoQU5JX0xJVFRMRV9CWVRFX0VORElBTikKKyAgICAgICAgICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVEaXNhc3NvY0luZC0+bWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZVdOSV9TTUVfRElTQVNTT0NfSU5EKTsKKyAgICAgICAgICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVEaXNhc3NvY0luZC0+bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyU21lRGlzYXNzb2NJbmQpKTsKKyNlbHNlCisgICAgICAgICAgICBwU2lyU21lRGlzYXNzb2NJbmQtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfRElTQVNTT0NfSU5EOworICAgICAgICAgICAgcFNpclNtZURpc2Fzc29jSW5kLT5sZW5ndGggICAgICA9IHNpemVvZih0U2lyU21lRGlzYXNzb2NJbmQpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBVcGRhdGUgU01FIHNlc3Npb24gSWQgYW5kIFRyYW5zYWN0aW9uIElkICovCisgICAgICAgICAgICBwU2lyU21lRGlzYXNzb2NJbmQtPnNlc3Npb25JZCA9IHNtZXNlc3Npb25JZDsKKyAgICAgICAgICAgIHBTaXJTbWVEaXNhc3NvY0luZC0+dHJhbnNhY3Rpb25JZCA9IHNtZXRyYW5zYWN0aW9uSWQ7CisjZW5kaWYKKyAgICAgICAgICAgIHBCdWYgPSAodEFOSV9VOCAqKSAmcFNpclNtZURpc2Fzc29jSW5kLT5zdGF0dXNDb2RlOworCisgICAgICAgICAgICBsaW1Db3B5VTMyKHBCdWYsIHJlYXNvbkNvZGUpOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodFNpclJlc3VsdENvZGVzKTsKKworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgICAgICAgICBsaW1Db3B5VTE2KHBCdWYsIGFpZCk7CisgICAgICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICAgICAgICAgIGxpbVN0YXRTZXJEZXMocE1hYywgJnBNYWMtPmhhbC5oYWxNYWMubWFjU3RhdHMucFBlclN0YVN0YXRzW2FpZF0uc3RhU3RhdCwgcEJ1Zik7CisKKyNlbmRpZi8vI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgICAgICAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0RJU0FTU09DX0lORF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LCAodEFOSV9VMTYpcmVhc29uQ29kZSwgMCk7CisjZW5kaWYKKyAgICAgICAgICAgIHBNc2cgPSAodEFOSV9VMzIqKSBwU2lyU21lRGlzYXNzb2NJbmQ7CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgiKioqIFNlbmRpbmcgRGlzQXNzb2NJbmQgc3RhSWQ9JWQsIHJlYXNvbkNvZGU9JWQgKioqXG4iKSwKKyAgICAgICAgICAgICAgIGFpZCwgcmVhc29uQ29kZSk7KQorI2VuZGlmCisKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIERlbGV0ZSB0aGUgUEUgc2Vzc2lvbiBDcmVhdGVkICovCisgICAgaWYoKHBzZXNzaW9uRW50cnkgIT0gTlVMTCkgJiYgKChwc2Vzc2lvbkVudHJ5IC0+bGltU3lzdGVtUm9sZSA9PSAgZUxJTV9TVEFfUk9MRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHNlc3Npb25FbnRyeSAtPmxpbVN5c3RlbVJvbGUgPT0gIGVMSU1fQlRfQU1QX1NUQV9ST0xFKSkgKQorICAgIHsKKyAgICAgICAgcGVEZWxldGVTZXNzaW9uKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgfQorICAgICAgICAKKyAgICBpZiggSVNfTUNDX1NVUFBPUlRFRCAmJiBsaW1Jc0xpbmtTdXNwZW5kZWQoIHBNYWMgKSApCisgICAgeworICAgICAgICAvL1Jlc3VtZSBvbiB0aGUgZmlyc3QgYWN0aXZlIHNlc3Npb24gY2hhbm5lbC4KKyAgICAgICAgcGVTZXRSZXN1bWVDaGFubmVsKCBwTWFjLCBwZUdldEFjdGl2ZVNlc3Npb25DaGFubmVsKCBwTWFjICksIDApOworCisgICAgICAgIGxpbVJlc3VtZUxpbmsoIHBNYWMsIGxpbVNlbmRTbWVEaXNhc3NvY0RlYXV0aE50ZlBvc3RSZXN1bWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiopIHBNc2cgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltU2VuZFNtZURpc2Fzc29jRGVhdXRoTnRmUG9zdFJlc3VtZSggcE1hYywgZUhBTF9TVEFUVVNfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIqKSBwTXNnICk7CisgICAgfQorfSAvKioqIGVuZCBsaW1TZW5kU21lRGlzYXNzb2NOdGYoKSAqKiovCisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBsaW1TZW5kU21lRGlzYXNzb2NJbmQoKSAtIHNlbmRzIFNNRV9ESVNBU1NPQ19JTkQKKyAgIAorICBBZnRlciByZWNlaXZpbmcgZGlzYXNzb2NpYXRpb24gZnJhbWUgZnJvbSBwZWVyIGVudGl0eSwgdGhpcyAKKyAgZnVuY3Rpb24gc2VuZHMgYSBlV05JX1NNRV9ESVNBU1NPQ19JTkQgdG8gU01FIHdpdGggYSBzcGVjaWZpYworICByZWFzb24gY29kZS4gIAorICAgIAorICBccGFyYW0gcE1hYyAtIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgIFxwYXJhbSBwU3RhRHMgLSBzdGF0aW9uIGRwaCBoYXNoIG5vZGUgCisgIFxyZXR1cm4gbm9uZSAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkCitsaW1TZW5kU21lRGlzYXNzb2NJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhRHMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyTXNnUSAgbW1oTXNnOworICAgIHRTaXJTbWVEaXNhc3NvY0luZCAqcFNpclNtZURpc2Fzc29jSW5kOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2lyU21lRGlzYXNzb2NJbmQsIHNpemVvZih0U2lyU21lRGlzYXNzb2NJbmQpKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgicGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBlV05JX1NNRV9ESVNBU1NPQ19JTkRcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vcHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMscFN0YURzLT5zdGFBZGRyLCZzZXNzaW9uSWQpOyAKKyNpZiBkZWZpbmVkIChBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiBkZWZpbmVkIChBTklfTElUVExFX0JZVEVfRU5ESUFOKQorICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVEaXNhc3NvY0luZC0+bWVzc2FnZVR5cGUsIGVXTklfU01FX0RJU0FTU09DX0lORCk7CisgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZURpc2Fzc29jSW5kLT5sZW5ndGgsIHNpemVvZih0U2lyU21lRGlzYXNzb2NJbmQpKTsKKyNlbHNlCisgICAgcFNpclNtZURpc2Fzc29jSW5kLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0RJU0FTU09DX0lORDsKKyAgICBwU2lyU21lRGlzYXNzb2NJbmQtPmxlbmd0aCA9IHNpemVvZih0U2lyU21lRGlzYXNzb2NJbmQpOworI2VuZGlmCisKKyNpZiAwIC8vQ29tbWVudGluZyBvdXQgYWxsIHRoZSBzZXJpYWxpemF0aW9uICAgICAKKyAgICAvL3N0YXR1c0NvZGUKKyAgICBwQnVmID0gKHRBTklfVTggKikgJnBTaXJTbWVEaXNhc3NvY0luZC0+c3RhdHVzQ29kZTsKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGFEcy0+bWxtU3RhQ29udGV4dC5kaXNhc3NvY1JlYXNvbik7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpclJlc3VsdENvZGVzKTsKKworICAgIC8vcGVlck1hY0FkZHIKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBwU3RhRHMtPnN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAvL2FpZAorICAgIGxpbUNvcHlVMTYocEJ1ZiwgcFN0YURzLT5hc3NvY0lkKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICAvL3BlclN0YVN0YXRzCisgICAgbGltU3RhdFNlckRlcyhwTWFjLCAmcE1hYy0+aGFsLmhhbE1hYy5tYWNTdGF0cy5wUGVyU3RhU3RhdHNbcFN0YURzLT5hc3NvY0lkXS5zdGFTdGF0LCBwQnVmKTsKKyNlbmRpZgorI2VuZGlmCisgICAgcFNpclNtZURpc2Fzc29jSW5kLT5zZXNzaW9uSWQgICAgID0gIHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKyAgICBwU2lyU21lRGlzYXNzb2NJbmQtPnRyYW5zYWN0aW9uSWQgPSAgcHNlc3Npb25FbnRyeS0+dHJhbnNhY3Rpb25JZDsKKyAgICBwU2lyU21lRGlzYXNzb2NJbmQtPnN0YXR1c0NvZGUgICAgPSAgcFN0YURzLT5tbG1TdGFDb250ZXh0LmRpc2Fzc29jUmVhc29uOworICAgIAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTaXJTbWVEaXNhc3NvY0luZC0+YnNzSWQgLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCAsIHNpemVvZih0U2lyTWFjQWRkcikpOworIAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTaXJTbWVEaXNhc3NvY0luZC0+cGVlck1hY0FkZHIgLCBwU3RhRHMtPnN0YUFkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgIHBTaXJTbWVEaXNhc3NvY0luZC0+YWlkID0gIHBTdGFEcy0+YXNzb2NJZDsKKyAgICBsaW1TdGF0U2VyRGVzKHBNYWMsICZwTWFjLT5oYWwuaGFsTWFjLm1hY1N0YXRzLnBQZXJTdGFTdGF0c1twU3RhRHMtPmFzc29jSWRdLnN0YVN0YXQsKHRBTklfVTgqKSZwU2lyU21lRGlzYXNzb2NJbmQtPiBwZXJTdGFTdGF0cyApOyAKKyNlbmRpZiAgIAorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBwU2lyU21lRGlzYXNzb2NJbmQtPnN0YUlkID0gcFN0YURzLT5zdGFJbmRleDsKKyNlbmRpZiAgCisgCisgICAgbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9ESVNBU1NPQ19JTkQ7CisgICAgbW1oTXNnLmJvZHlwdHIgPSBwU2lyU21lRGlzYXNzb2NJbmQ7CisgICAgbW1oTXNnLmJvZHl2YWwgPSAwOworCisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19ESVNBU1NPQ19JTkRfRVZFTlQsIHBzZXNzaW9uRW50cnksIDAsICh0QU5JX1UxNilwU3RhRHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb24pOyAKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgZVBST1QpOworIAorfSAvKioqIGVuZCBsaW1TZW5kU21lRGlzYXNzb2NJbmQoKSAqKiovCisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBsaW1TZW5kU21lRGVhdXRoSW5kKCkgLSBzZW5kcyBTTUVfREVBVVRIX0lORAorICAgCisgIEFmdGVyIHJlY2VpdmluZyBkZWF1dGhlbnRpY2F0aW9uIGZyYW1lIGZyb20gcGVlciBlbnRpdHksIHRoaXMgCisgIGZ1bmN0aW9uIHNlbmRzIGEgZVdOSV9TTUVfREVBVVRIX0lORCB0byBTTUUgd2l0aCBhIHNwZWNpZmljCisgIHJlYXNvbiBjb2RlLiAgCisgICAgCisgIFxwYXJhbSBwTWFjIC0gZ2xvYmFsIG1hYyBzdHJ1Y3R1cmUKKyAgXHBhcmFtIHBTdGFEcyAtIHN0YXRpb24gZHBoIGhhc2ggbm9kZSAKKyAgXHJldHVybiBub25lIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK2xpbVNlbmRTbWVEZWF1dGhJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhRHMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpICAgICAgICAgICAgICAgICAgIAoreworI2lmbmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgdEFOSV9VOCAgKnBCdWY7CisjZW5kaWYKKyAgICB0U2lyTXNnUSAgbW1oTXNnOworICAgIHRTaXJTbWVEZWF1dGhJbmQgICpwU2lyU21lRGVhdXRoSW5kOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2lyU21lRGVhdXRoSW5kLCBzaXplb2YodFNpclNtZURlYXV0aEluZCkpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX0RFQVVUSF9JTkQgXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBkZWZpbmVkIChBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiBkZWZpbmVkIChBTklfTElUVExFX0JZVEVfRU5ESUFOKQorICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVEZWF1dGhJbmQtPm1lc3NhZ2VUeXBlLCBlV05JX1NNRV9ERUFVVEhfSU5EKTsKKyAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSZwU2lyU21lRGVhdXRoSW5kLT5sZW5ndGgsIHNpemVvZih0U2lyU21lRGVhdXRoSW5kKSk7CisjZWxzZQorICAgIHBTaXJTbWVEZWF1dGhJbmQtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfREVBVVRIX0lORDsKKyAgICBwU2lyU21lRGVhdXRoSW5kLT5sZW5ndGggPSBzaXplb2YodFNpclNtZURlYXV0aEluZCk7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBwU2lyU21lRGVhdXRoSW5kLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisgICAgcFNpclNtZURlYXV0aEluZC0+dHJhbnNhY3Rpb25JZCA9IHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQ7CisgICAgaWYoZVNJUl9JTkZSQV9BUF9NT0RFID09IHBzZXNzaW9uRW50cnktPmJzc1R5cGUpCisgICAgeworICAgICAgICBwU2lyU21lRGVhdXRoSW5kLT5zdGF0dXNDb2RlID0gKHRTaXJSZXN1bHRDb2RlcylwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vTmVlZCB0byBpbmRpY2F0ZXQgaGUgcmVhc2NvbiBjb2RlIG92ZXIgdGhlIGFpcgorICAgICAgICBwU2lyU21lRGVhdXRoSW5kLT5zdGF0dXNDb2RlID0gKHRTaXJSZXN1bHRDb2RlcylwU3RhRHMtPm1sbVN0YUNvbnRleHQuZGlzYXNzb2NSZWFzb247CisgICAgfQorICAgIC8vQlNTSUQKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU2lyU21lRGVhdXRoSW5kLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIC8vcGVlck1hY0FkZHIKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU2lyU21lRGVhdXRoSW5kLT5wZWVyTWFjQWRkciwgcFN0YURzLT5zdGFBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyNlbHNlCisKKyAgICAvL3Nlc3Npb25JZAorICAgIHBCdWYgPSAodEFOSV9VOCAqKSAmcFNpclNtZURlYXV0aEluZC0+c2Vzc2lvbklkOworICAgICpwQnVmKysgPSBwc2Vzc2lvbkVudHJ5LT5zbWVTZXNzaW9uSWQ7CisKKyAgICAvL3RyYW5zYWN0aW9uSWQKKyAgICBsaW1Db3B5VTE2KHBCdWYsIDApOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIC8vIHN0YXR1cyBjb2RlCisgICAgbGltQ29weVUzMihwQnVmLCBwU3RhRHMtPm1sbVN0YUNvbnRleHQuY2xlYW51cFRyaWdnZXIpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJSZXN1bHRDb2Rlcyk7CisgICAgCisgICAgLy9ic3NpZAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsIHBzZXNzaW9uRW50cnktPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKyAgICAvL3BlZXJNYWNBZGRyCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcFN0YURzLT5zdGFBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyNlbmRpZiAgCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgbGltQ29weVUxNihwQnVmLCBwU3RhRHMtPnN0YUFkZHIpOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgcFNpclNtZURlYXV0aEluZC0+c3RhSWQgPSBwU3RhRHMtPnN0YUluZGV4OworI2VuZGlmCisKKyAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX0RFQVVUSF9JTkQ7CisgICAgbW1oTXNnLmJvZHlwdHIgPSBwU2lyU21lRGVhdXRoSW5kOworICAgIG1taE1zZy5ib2R5dmFsID0gMDsKKworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfREVBVVRIX0lORF9FVkVOVCwgcHNlc3Npb25FbnRyeSwgMCwgcFN0YURzLT5tbG1TdGFDb250ZXh0LmNsZWFudXBUcmlnZ2VyKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgZVBST1QpOworICAgIHJldHVybjsKK30gLyoqKiBlbmQgbGltU2VuZFNtZURlYXV0aEluZCgpICoqKi8KKworCisvKioKKyAqIGxpbVNlbmRTbWVEZWF1dGhOdGYoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lTWVzc2FnZXMoKSB0byBzZW5kCisgKiBlV05JX1NNRV9ESVNBU1NPQ19SU1AvSU5EIG1lc3NhZ2UgdG8gaG9zdAorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBzZW5kaW5nIGVXTklfU01FX0RFQVVUSF9DTkYgb3IKKyAqIGVXTklfU01FX0RFQVVUSF9JTkQgdG8gaG9zdCBkZXBlbmRpbmcgb24gZGVhdXRoZW50aWNhdGlvbiB0cmlnZ2VyLgorICoKKyAqIEBwYXJhbSBwZWVyTWFjQWRkciAgICAgICBJbmRpY2F0ZXMgdGhlIHBlZXIgTUFDIGFkZHIgdG8gd2hpY2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkZWF1dGhlbnRpY2F0aW9uIHdhcyBpbml0aWF0ZWQKKyAqIEBwYXJhbSByZWFzb25Db2RlICAgICAgICBJbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3IgRGVhdXRoZXRpY2F0aW9uCisgKiBAcGFyYW0gZGVhdXRoVHJpZ2dlciAgICAgSW5kaWNhdGVzIHRoZSB0cmlnZ2VyIGZvciBEZWF1dGhldGljYXRpb24KKyAqIEBwYXJhbSBhaWQgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIFNUQUlELiBUaGlzIHBhcmFtZXRlciBpcyBwcmVzZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBvbiBBUC4KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltU2VuZFNtZURlYXV0aE50Zih0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwgdFNpclJlc3VsdENvZGVzIHJlYXNvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2IGRlYXV0aFRyaWdnZXIsIHRBTklfVTE2IGFpZCx0QU5JX1U4IHNtZXNlc3Npb25JZCwgdEFOSV9VMTYgc21ldHJhbnNhY3Rpb25JZCkKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICpwQnVmOworICAgIHRTaXJTbWVEZWF1dGhSc3AgICAgKnBTaXJTbWVEZWF1dGhSc3A7CisgICAgdFNpclNtZURlYXV0aEluZCAgICAqcFNpclNtZURlYXV0aEluZDsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQ7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAqcE1zZzsKKworICAgIHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLHBlZXJNYWNBZGRyLCZzZXNzaW9uSWQpOyAgCisgICAgc3dpdGNoIChkZWF1dGhUcmlnZ2VyKQorICAgIHsKKyAgICAgICAgY2FzZSBlTElNX1BFRVJfRU5USVRZX0RFQVVUSDoKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIGVMSU1fSE9TVF9ERUFVVEg6CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIERlYXV0aGVudGljYXRpb24gcmVzcG9uc2UgdG8gaG9zdCB0cmlnZ2VyZWQKKyAgICAgICAgICAgICAqIGRlYXV0aGVudGljYXRpb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNpclNtZURlYXV0aFJzcCwgc2l6ZW9mKHRTaXJTbWVEZWF1dGhSc3ApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX0RFQVVUSF9SU1BcbiIpKTsKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworI2lmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIGRlZmluZWQgKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pCisgICAgICAgICAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSAmKHBTaXJTbWVEZWF1dGhSc3AtPm1lc3NhZ2VUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9ERUFVVEhfUlNQKTsKKyAgICAgICAgICAgICAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSAmKHBTaXJTbWVEZWF1dGhSc3AtPmxlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyU21lRGVhdXRoUnNwKSk7CisjZWxzZQorICAgICAgICAgICAgcFNpclNtZURlYXV0aFJzcC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9ERUFVVEhfUlNQOworICAgICAgICAgICAgcFNpclNtZURlYXV0aFJzcC0+bGVuZ3RoICAgICAgPSBzaXplb2YodFNpclNtZURlYXV0aFJzcCk7CisjZW5kaWYKKyAgICAgICAgICAgIHBTaXJTbWVEZWF1dGhSc3AtPnN0YXR1c0NvZGUgPSByZWFzb25Db2RlOworICAgICAgICAgICAgcFNpclNtZURlYXV0aFJzcC0+c2Vzc2lvbklkID0gc21lc2Vzc2lvbklkOworICAgICAgICAgICAgcFNpclNtZURlYXV0aFJzcC0+dHJhbnNhY3Rpb25JZCA9IHNtZXRyYW5zYWN0aW9uSWQ7ICAKKworICAgICAgICAgICAgcEJ1ZiAgPSAodEFOSV9VOCAqKSBwU2lyU21lRGVhdXRoUnNwLT5wZWVyTWFjQWRkcjsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgICAgICAgICAgbGltQ29weVUxNihwQnVmLCBhaWQpOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgICAgICAgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19ERUFVVEhfUlNQX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LCAwLCAodEFOSV9VMTYpcmVhc29uQ29kZSk7CisjZW5kaWYKKyAgICAgICAgICAgIHBNc2cgPSAodEFOSV9VMzIqKXBTaXJTbWVEZWF1dGhSc3A7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIERlYXV0aGVudGljYXRpb24gaW5kaWNhdGlvbiBkdWUgdG8gRGVhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICogZnJhbWUgcmVjZXB0aW9uIGZyb20gcGVlciBlbnRpdHkgb3IgZHVlIHRvCisgICAgICAgICAgICAgKiBsb3NzIG9mIGxpbmsgd2l0aCBwZWVyIGVudGl0eS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2lyU21lRGVhdXRoSW5kLCBzaXplb2YodFNpclNtZURlYXV0aEluZCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfREVBVVRIX0luZFxuIikpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisjaWYgZGVmaW5lZCAoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgZGVmaW5lZCAoQU5JX0xJVFRMRV9CWVRFX0VORElBTikKKyAgICAgICAgICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVEZWF1dGhJbmQtPm1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVXTklfU01FX0RFQVVUSF9JTkQpOworICAgICAgICAgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZURlYXV0aEluZC0+bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyU21lRGVhdXRoSW5kKSk7CisjZWxzZQorICAgICAgICAgICAgcFNpclNtZURlYXV0aEluZC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9ERUFVVEhfSU5EOworICAgICAgICAgICAgcFNpclNtZURlYXV0aEluZC0+bGVuZ3RoICAgICAgPSBzaXplb2YodFNpclNtZURlYXV0aEluZCk7CisjZW5kaWYKKworICAgICAgICAgICAgLy8gc2Vzc2lvbklkCisgICAgICAgICAgICBwQnVmID0gKHRBTklfVTgqKSAmcFNpclNtZURlYXV0aEluZC0+c2Vzc2lvbklkOworICAgICAgICAgICAgKnBCdWYrKyA9IHNtZXNlc3Npb25JZDsKKworICAgICAgICAgICAgLy90cmFuc2FjdGlvbiBJRAorICAgICAgICAgICAgbGltQ29weVUxNihwQnVmLCBzbWV0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgICAgICAgICAgLy8gc3RhdHVzIGNvZGUKKyAgICAgICAgICAgIGxpbUNvcHlVMzIocEJ1ZiwgcmVhc29uQ29kZSk7CisgICAgICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyUmVzdWx0Q29kZXMpOworCisgICAgICAgICAgICAvL2Jzc0lkCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKyAgICAgICAgICAgIC8vcGVlck1hY0FkZHIKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTaXJTbWVEZWF1dGhJbmQtPnBlZXJNYWNBZGRyLCBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgICAgIGxpbUNvcHlVMTYocEJ1ZiwgYWlkKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICAgICAgICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfREVBVVRIX0lORF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LCAwLCAodEFOSV9VMTYpcmVhc29uQ29kZSk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgICAgICAgICBwTXNnID0gKHRBTklfVTMyKilwU2lyU21lRGVhdXRoSW5kOworCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgLypEZWxldGUgdGhlIFBFIHNlc3Npb24gIGNyZWF0ZWQgKi8KKyAgICBpZihwc2Vzc2lvbkVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgICBwZURlbGV0ZVNlc3Npb24ocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKyAgICB9ICAgCisKKyAgICBpZiggSVNfTUNDX1NVUFBPUlRFRCAmJiBsaW1Jc0xpbmtTdXNwZW5kZWQoIHBNYWMgKSApCisgICAgeworICAgICAgICAvL1Jlc3VtZSBvbiB0aGUgZmlyc3QgYWN0aXZlIHNlc3Npb24gY2hhbm5lbC4KKyAgICAgICAgcGVTZXRSZXN1bWVDaGFubmVsKCBwTWFjLCBwZUdldEFjdGl2ZVNlc3Npb25DaGFubmVsKCBwTWFjICksIDApOworCisgICAgICAgIGxpbVJlc3VtZUxpbmsoIHBNYWMsIGxpbVNlbmRTbWVEaXNhc3NvY0RlYXV0aE50ZlBvc3RSZXN1bWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiopIHBNc2cgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltU2VuZFNtZURpc2Fzc29jRGVhdXRoTnRmUG9zdFJlc3VtZSggcE1hYywgZUhBTF9TVEFUVVNfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIqKSBwTXNnICk7CisgICAgfQorfSAvKioqIGVuZCBsaW1TZW5kU21lRGVhdXRoTnRmKCkgKioqLworCisKKy8qKgorICogbGltU2VuZFNtZVdtU3RhdHVzQ2hhbmdlTnRmKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkgdG8gc2VuZAorICogZVdOSV9TTUVfV01fU1RBVFVTX0NIQU5HRV9OVEYgbWVzc2FnZSB0byBob3N0LgorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSBzdGF0dXNDaGFuZ2VDb2RlICAgSW5kaWNhdGVzIHRoZSBjaGFuZ2UgaW4gdGhlIHdpcmVsZXNzIG1lZGl1bS4KKyAqIEBwYXJhbSBzdGF0dXNDaGFuZ2VJbmZvICAgSW5kaWNhdGVzIHRoZSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlIGluIHRoZSB3aXJlbGVzcyBtZWRpdW0uCisgKiBAcGFyYW0gaW5mb0xlbiAgICAgICAgICAgIEluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHN0YXR1cyBjaGFuZ2UgaW5mb3JtYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgc2VudC4KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltU2VuZFNtZVdtU3RhdHVzQ2hhbmdlTnRmKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVTdGF0dXNDaGFuZ2VDb2RlIHN0YXR1c0NoYW5nZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcFN0YXR1c0NoYW5nZUluZm8sIHRBTklfVTE2IGluZm9MZW4sIHRBTklfVTggc2Vzc2lvbklkKQoreworICAgIHRTaXJNc2dRICAgICAgICAgICAgICAgICAgbW1oTXNnOworICAgIHRTaXJTbWVXbVN0YXR1c0NoYW5nZU50ZiAgKnBTaXJTbWVXbVN0YXR1c0NoYW5nZU50ZjsKKyAgICBlSGFsU3RhdHVzICAgICAgICAgICAgICAgIHN0YXR1czsKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICBidWZMZW47CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICBsZW5ndGg9MDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICpwQnVmOworI2VuZGlmCisKKworCisgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2lyU21lV21TdGF0dXNDaGFuZ2VOdGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJTbWVXbVN0YXR1c0NoYW5nZU50ZikpOworICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgZVdOSV9TTUVfV01fU1RBVFVTX0NIQU5HRV9OVEYsIHN0YXR1cyA9ICVkXG4iKSwKKyAgICAgICAgICBzdGF0dXMpOworICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgcEJ1ZiA9ICh0QU5JX1U4ICopcFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmOworI2VuZGlmCisKKyAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX1dNX1NUQVRVU19DSEFOR0VfTlRGOworICAgIG1taE1zZy5ib2R5dmFsID0gMDsKKyAgICBtbWhNc2cuYm9keXB0ciA9IHBTaXJTbWVXbVN0YXR1c0NoYW5nZU50ZjsKKworICAgIHN3aXRjaChzdGF0dXNDaGFuZ2VDb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBlU0lSX1NNRV9SQURBUl9ERVRFQ1RFRDoKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICAgICAgICAgIGJ1ZkxlbiA9IHNpemVvZih0U2lyU21lV21TdGF0dXNDaGFuZ2VOdGYpOworICAgICAgICAgICAgaWYgKChsaW1TbWVXbVN0YXR1c0NoYW5nZUhlYWRlclNlckRlcyhwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDaGFuZ2VDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQpICE9IGVTSVJfU1VDQ0VTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSBwU2lyU21lV21TdGF0dXNDaGFuZ2VOdGYpOworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiSGVhZGVyIFNlckRlcyBmYWlsZWQgXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEJ1ZiArPSBsZW5ndGg7CisgICAgICAgICAgICBidWZMZW4gLT0gbGVuZ3RoOworICAgICAgICAgICAgaWYgKChsaW1SYWRpb0luZm9TZXJEZXMocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHBTaXJSYWRhckluZm8pcFN0YXR1c0NoYW5nZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZkxlbikgIT0gZVNJUl9TVUNDRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBTaXJTbWVXbVN0YXR1c0NoYW5nZU50Zik7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJSYWRpbyBJbmZvIFNlckRlcyBmYWlsZWQgXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQnVmID0gKHRBTklfVTggKikgcFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgICAgICAgICAgbGltQ29weVUxNihwQnVmLCBsZW5ndGgpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTSVJfU01FX0NCX0xFR0FDWV9CU1NfRk9VTkRfQllfQVA6CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorCisgICAgICAgICAgICBpZiggZVNJUl9TVUNDRVNTICE9IG5vblRpdGFuQnNzRm91bmRTZXJEZXMoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cFNpck5laWdoYm9yQnNzV2RzSW5mbykgcFN0YXR1c0NoYW5nZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSBwU2lyU21lV21TdGF0dXNDaGFuZ2VOdGYpOworICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgRkwoIlVuYWJsZSB0byBzZXJpYWxpemUgbm9uVGl0YW5Cc3NGb3VuZFNlckRlcyFcbiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNJUl9TTUVfQkFDS0dST1VORF9TQ0FOX0ZBSUw6CisgICAgICAgICAgICBsaW1QYWNrQmtnbmRTY2FuRmFpbE5vdGlmeShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ2hhbmdlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cFNpckJhY2tncm91bmRTY2FuSW5mbylwU3RhdHVzQ2hhbmdlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXJTbWVXbVN0YXR1c0NoYW5nZU50Ziwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisjaWYgZGVmaW5lZCAoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgZGVmaW5lZCAoQU5JX0xJVFRMRV9CWVRFX0VORElBTikKKyAgICAgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmLT5tZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgZVdOSV9TTUVfV01fU1RBVFVTX0NIQU5HRV9OVEYgKTsKKyAgICAgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmLT5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIChzaXplb2YodFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmKSkpOworICAgICAgICBwU2lyU21lV21TdGF0dXNDaGFuZ2VOdGYtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgc2lyU3RvcmVVMzJOKCh0QU5JX1U4KikmcFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmLT5zdGF0dXNDaGFuZ2VDb2RlLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNDaGFuZ2VDb2RlKTsKKyNlbHNlCisgICAgICAgIHBTaXJTbWVXbVN0YXR1c0NoYW5nZU50Zi0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9XTV9TVEFUVVNfQ0hBTkdFX05URjsKKyAgICAgICAgcFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmLT5zdGF0dXNDaGFuZ2VDb2RlID0gc3RhdHVzQ2hhbmdlQ29kZTsKKyAgICAgICAgcFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmLT5sZW5ndGggPSBzaXplb2YodFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmKTsKKyAgICAgICAgcFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisjZW5kaWYKKyAgICAgICAgaWYoc2l6ZW9mKHBTaXJTbWVXbVN0YXR1c0NoYW5nZU50Zi0+c3RhdHVzQ2hhbmdlSW5mbykgPj0gaW5mb0xlbikKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikmcFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmLT5zdGF0dXNDaGFuZ2VJbmZvLCAodEFOSV9VOCAqKXBTdGF0dXNDaGFuZ2VJbmZvLCBpbmZvTGVuKTsKKyAgICAgICAgfQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIioqKi0tLSoqKiBTdGF0dXNDaGc6IGNvZGUgMHgleCwgbGVuZ3RoICVkICoqKi0tLSoqKlxuIiksCisgICAgICAgICAgICAgICBzdGF0dXNDaGFuZ2VDb2RlLCBpbmZvTGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtbWhNc2cudHlwZSkpOworICAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCkpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBTaXJTbWVXbVN0YXR1c0NoYW5nZU50Zik7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoImxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkgZmFpbGVkXG4iKSk7CisgICAgfQorCit9IC8qKiogZW5kIGxpbVNlbmRTbWVXbVN0YXR1c0NoYW5nZU50ZigpICoqKi8KKworCisvKioKKyAqIGxpbVNlbmRTbWVTZXRDb250ZXh0UnNwKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkgdG8gc2VuZAorICogZVdOSV9TTUVfU0VUQ09OVEVYVF9SU1AgbWVzc2FnZSB0byBob3N0CisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcGVlck1hY0FkZHIgIEluZGljYXRlcyB0aGUgcGVlciBNQUMgYWRkciB0byB3aGljaAorICogICAgICAgICAgICAgICAgICAgICBzZXRDb250ZXh0IHdhcyBwZXJmb3JtZWQKKyAqIEBwYXJhbSBhaWQgICAgICAgICAgSW5kaWNhdGVzIHRoZSBhaWQgY29ycmVzcG9uZGluZyB0byB0aGUgcGVlciBNQUMKKyAqICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcworICogQHBhcmFtIHJlc3VsdENvZGUgICBJbmRpY2F0ZXMgdGhlIHJlc3VsdCBvZiBwcmV2aW91c2x5IGlzc3VlZAorICogICAgICAgICAgICAgICAgICAgICBlV05JX1NNRV9TRVRDT05URVhUX1JTUCBtZXNzYWdlCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVNlbmRTbWVTZXRDb250ZXh0UnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwgdEFOSV9VMTYgYWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LHRBTklfVTggc21lc2Vzc2lvbklkLHRBTklfVTE2IHNtZXRyYW5zYWN0aW9uSWQpCit7CisKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICpwQnVmOworICAgIHRTaXJNc2dRICAgICAgICAgICAgIG1taE1zZzsKKyAgICB0U2lyU21lU2V0Q29udGV4dFJzcCAqcFNpclNtZVNldENvbnRleHRSc3A7CisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTaXJTbWVTZXRDb250ZXh0UnNwLCBzaXplb2YodFNpclNtZVNldENvbnRleHRSc3ApKSkKKyAgICB7CisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgU21lU2V0Q29udGV4dFJzcFxuIikpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBkZWZpbmVkIChBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiBkZWZpbmVkIChBTklfTElUVExFX0JZVEVfRU5ESUFOKQorICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVTZXRDb250ZXh0UnNwLT5tZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgZVdOSV9TTUVfU0VUQ09OVEVYVF9SU1ApOworICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVTZXRDb250ZXh0UnNwLT5sZW5ndGgsCisgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyU21lU2V0Q29udGV4dFJzcCkpOworI2Vsc2UKKyAgICBwU2lyU21lU2V0Q29udGV4dFJzcC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9TRVRDT05URVhUX1JTUDsKKyAgICBwU2lyU21lU2V0Q29udGV4dFJzcC0+bGVuZ3RoICAgICAgPSBzaXplb2YodFNpclNtZVNldENvbnRleHRSc3ApOworI2VuZGlmCisgICAgcFNpclNtZVNldENvbnRleHRSc3AtPnN0YXR1c0NvZGUgID0gcmVzdWx0Q29kZTsKKworICAgIHBCdWYgPSBwU2lyU21lU2V0Q29udGV4dFJzcC0+cGVlck1hY0FkZHI7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgbGltQ29weVUxNihwQnVmLCBhaWQpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyNlbmRpZgorCisgICAgLyogVXBkYXRlIFNNRSBzZXNzaW9uIGFuZCB0cmFuc2FjdGlvbiBJZCovCisgICAgcFNpclNtZVNldENvbnRleHRSc3AtPnNlc3Npb25JZCA9IHNtZXNlc3Npb25JZDsKKyAgICBwU2lyU21lU2V0Q29udGV4dFJzcC0+dHJhbnNhY3Rpb25JZCA9IHNtZXRyYW5zYWN0aW9uSWQ7CisKKyAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX1NFVENPTlRFWFRfUlNQOworICAgIG1taE1zZy5ib2R5cHRyID0gcFNpclNtZVNldENvbnRleHRSc3A7CisgICAgbW1oTXNnLmJvZHl2YWwgPSAwOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19TRVRDT05URVhUX1JTUF9FVkVOVCwgcHNlc3Npb25FbnRyeSwgKHRBTklfVTE2KXJlc3VsdENvZGUsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgIAorICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgZVBST1QpOworfSAvKioqIGVuZCBsaW1TZW5kU21lU2V0Q29udGV4dFJzcCgpICoqKi8KKworLyoqCisgKiBsaW1TZW5kU21lUmVtb3ZlS2V5UnNwKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkgdG8gc2VuZAorICogZVdOSV9TTUVfUkVNT1ZFS0VZX1JTUCBtZXNzYWdlIHRvIGhvc3QKKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwZWVyTWFjQWRkciAgSW5kaWNhdGVzIHRoZSBwZWVyIE1BQyBhZGRyIHRvIHdoaWNoCisgKiAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWtleSB3YXMgcGVyZm9ybWVkCisgKiBAcGFyYW0gYWlkICAgICAgICAgIEluZGljYXRlcyB0aGUgYWlkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBlZXIgTUFDCisgKiAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MKKyAqIEBwYXJhbSByZXN1bHRDb2RlICAgSW5kaWNhdGVzIHRoZSByZXN1bHQgb2YgcHJldmlvdXNseSBpc3N1ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgZVdOSV9TTUVfUkVNT1ZFS0VZX1JTUCBtZXNzYWdlCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbVNlbmRTbWVSZW1vdmVLZXlSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LHRBTklfVTggc21lc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgc21ldHJhbnNhY3Rpb25JZCkKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAqcEJ1ZjsKKyAgICB0U2lyTXNnUSAgICAgICAgICAgICAgICBtbWhNc2c7CisgICAgdFNpclNtZVJlbW92ZUtleVJzcCAgICAgKnBTaXJTbWVSZW1vdmVLZXlSc3A7CisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTaXJTbWVSZW1vdmVLZXlSc3AsIHNpemVvZih0U2lyU21lUmVtb3ZlS2V5UnNwKSkpCisgICAgeworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIFNtZVJlbW92ZUtleVJzcFxuIikpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBkZWZpbmVkIChBTklfUFJPRFVDVF9UWVBFX0FQKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pCisgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNpclNtZVJlbW92ZUtleVJzcC0+bWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgIGVXTklfU01FX1JFTU9WRUtFWV9SU1ApOworICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTaXJTbWVSZW1vdmVLZXlSc3AtPmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJTbWVSZW1vdmVLZXlSc3ApKTsKKyAgCisjZW5kaWYKKyAgICAKKworICAgIGlmKHBzZXNzaW9uRW50cnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBCdWYgPSBwU2lyU21lUmVtb3ZlS2V5UnNwLT5wZWVyTWFjQWRkcjsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgKHRBTklfVTggKikgcGVlck1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgICAgIGxpbUNvcHlVMzIocEJ1ZiwgcmVzdWx0Q29kZSk7CisgICAgfQorICAgIAorICAgIHBTaXJTbWVSZW1vdmVLZXlSc3AtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfUkVNT1ZFS0VZX1JTUDsKKyAgICBwU2lyU21lUmVtb3ZlS2V5UnNwLT5sZW5ndGggICAgICA9IHNpemVvZih0U2lyU21lUmVtb3ZlS2V5UnNwKTsKKyAgICBwU2lyU21lUmVtb3ZlS2V5UnNwLT5zdGF0dXNDb2RlICA9IHJlc3VsdENvZGU7CisgICAgICAgIAorICAgIC8qIFVwZGF0ZSBTTUUgc2Vzc2lvbiBhbmQgdHJhbnNhY3Rpb24gSWQqLworICAgIHBTaXJTbWVSZW1vdmVLZXlSc3AtPnNlc3Npb25JZCA9IHNtZXNlc3Npb25JZDsKKyAgICBwU2lyU21lUmVtb3ZlS2V5UnNwLT50cmFuc2FjdGlvbklkID0gc21ldHJhbnNhY3Rpb25JZDsgICAKKyAgICAKKyAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX1JFTU9WRUtFWV9SU1A7CisgICAgbW1oTXNnLmJvZHlwdHIgPSBwU2lyU21lUmVtb3ZlS2V5UnNwOworICAgIG1taE1zZy5ib2R5dmFsID0gMDsKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtbWhNc2cudHlwZSkpOworICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgZVBST1QpOworfSAvKioqIGVuZCBsaW1TZW5kU21lU2V0Q29udGV4dFJzcCgpICoqKi8KKworCisvKioKKyAqIGxpbVNlbmRTbWVQcm9taXNjdW91c01vZGVSc3AoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lTWVzc2FnZXMoKSB0byBzZW5kCisgKiBlV05JX1BST01JU0NVT1VTX01PREVfUlNQIG1lc3NhZ2UgdG8gaG9zdAorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBzZW5kaW5nIGVXTklfU01FX1BST01JU0NVT1VTX01PREVfUlNQIHRvCisgKiBob3N0IGFzIGEgcmVwbHkgdG8gZVdOSV9TTUVfUFJPTUlTQ1VPVVNfTU9ERV9SRVEgZGlyZWN0aXZlIGZyb20gaXQuCisgKgorICogQHBhcmFtIE5vbmUKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitsaW1TZW5kU21lUHJvbWlzY3VvdXNNb2RlUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisjaWYgMAorICAgIHRTaXJNc2dRICAgbW1oTXNnOworICAgIHRTaXJNYk1zZyAgKnBNYk1zZzsKKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1iTXNnLCBzaXplb2YodFNpck1iTXNnKSkpCisgICAgeworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZFxuIikpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwTWJNc2ctPnR5cGUgICA9IGVXTklfU01FX1BST01JU0NVT1VTX01PREVfUlNQOworICAgIHBNYk1zZy0+bXNnTGVuID0gNDsKKworICAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfUFJPTUlTQ1VPVVNfTU9ERV9SU1A7CisgICAgbW1oTXNnLmJvZHlwdHIgPSBwTWJNc2c7CisgICAgbW1oTXNnLmJvZHl2YWwgPSAwOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisjZW5kaWYKK30gLyoqKiBlbmQgbGltU2VuZFNtZVByb21pc2N1b3VzTW9kZVJzcCgpICoqKi8KKworCisKKy8qKgorICogbGltU2VuZFNtZU5laWdoYm9yQnNzSW5kKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltTG9va3VwTmFkZEhhc2hFbnRyeSgpIHRvIHNlbmQKKyAqIGVXTklfU01FX05FSUdIQk9SX0JTU19JTkQgbWVzc2FnZSB0byBob3N0CisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNlbmRpbmcgZVdOSV9TTUVfTkVJR0hCT1JfQlNTX0lORCB0bworICogaG9zdCB1cG9uIGRldGVjdGluZyBuZXcgQlNTIGR1cmluZyBiYWNrZ3JvdW5kIHNjYW5uaW5nIGlmIENGRworICogb3B0aW9uIGlzIGVuYWJsZWQgZm9yIHNlbmRpbmcgc3VjaCBpbmRpY2F0aW9uCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltU2VuZFNtZU5laWdoYm9yQnNzSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdExpbVNjYW5SZXN1bHROb2RlICpwQnNzRGVzY3IpCit7CisgICAgdFNpck1zZ1EgICAgICAgICAgICAgICAgIG1zZ1E7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICAgdmFsOworICAgIHRTaXJTbWVOZWlnaGJvckJzc0luZCAgICAqcE5ld0Jzc0luZDsKKworICAgIGlmICgocE1hYy0+bGltLmdMaW1TbWVTdGF0ZSAhPSBlTElNX1NNRV9MSU5LX0VTVF9XVF9TQ0FOX1NUQVRFKSB8fAorICAgICAgICAoKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgPT0gZUxJTV9TTUVfTElOS19FU1RfV1RfU0NBTl9TVEFURSkgJiYKKyAgICAgICAgIHBNYWMtPmxpbS5nTGltUnNwUmVxZCkpCisgICAgeworICAgICAgICAvLyBMSU0gaXMgbm90IGluIGJhY2tncm91bmQgc2NhbiBzdGF0ZSBPUgorICAgICAgICAvLyBjdXJyZW50IHNjYW4gaXMgaW5pdGlhdGVkIGJ5IEhERC4KKyAgICAgICAgLy8gTm8gbmVlZCB0byBzZW5kIG5ldyBCU1MgaW5kaWNhdGlvbiB0byBIREQKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX05FV19CU1NfRk9VTkRfSU5ELCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCBnZXQgTkVJR0hCT1JfQlNTX0lORCBmcm9tIENGR1xuIikpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodmFsID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qKgorICAgICAqIE5lZWQgdG8gaW5kaWNhdGUgbmV3IEJTU3MgZm91bmQgZHVyaW5nCisgICAgICogYmFja2dyb3VuZCBzY2FubmluZyB0byBob3N0LgorICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3Igc2VuZGluZyBpbmRpY2F0aW9uLgorICAgICAqIExlbmd0aCBvZiBidWZmZXIgaXMgbGVuZ3RoIG9mIEJTUyBkZXNjcmlwdGlvbgorICAgICAqIGFuZCBsZW5ndGggb2YgaGVhZGVyIGl0c2VsZgorICAgICAqLworICAgIHZhbCA9IHBCc3NEZXNjci0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoICsgc2l6ZW9mKHRBTklfVTE2KSArIHNpemVvZih0QU5JX1UzMikgKyBzaXplb2YodEFOSV9VOCk7CisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTmV3QnNzSW5kLCB2YWwpKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICBGTCgiY2FsbCB0byBwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIGVXTklfU01FX05FSUdIQk9SX0JTU19JTkRcbiIpKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgZGVmaW5lZCAoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgZGVmaW5lZCAoQU5JX0xJVFRMRV9CWVRFX0VORElBTikKKyAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSAmcE5ld0Jzc0luZC0+bWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgIGVXTklfU01FX05FSUdIQk9SX0JTU19JTkQpOworICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBOZXdCc3NJbmQtPmxlbmd0aCwgKHRBTklfVTE2KXZhbCApOworI2Vsc2UKKyAgICBwTmV3QnNzSW5kLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX05FSUdIQk9SX0JTU19JTkQ7CisgICAgcE5ld0Jzc0luZC0+bGVuZ3RoICAgICAgPSAodEFOSV9VMTYpIHZhbDsKKyNlbmRpZgorICAgIHBOZXdCc3NJbmQtPnNlc3Npb25JZCA9IDA7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBXTEFOX1NUQSkKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTmV3QnNzSW5kLT5ic3NEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopICZwQnNzRGVzY3ItPmJzc0Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgcEJzc0Rlc2NyLT5ic3NEZXNjcmlwdGlvbi5sZW5ndGggKyBzaXplb2YodEFOSV9VMTYpKTsKKyNlbmRpZgorCisgICAgbXNnUS50eXBlID0gZVdOSV9TTUVfTkVJR0hCT1JfQlNTX0lORDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwTmV3QnNzSW5kOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbXNnUSwgZVBST1QpOworfSAvKioqIGVuZCBsaW1TZW5kU21lTmVpZ2hib3JCc3NJbmQoKSAqKiovCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgbGltU2VuZFNtZUFkZHRzUnNwKCkgLSBzZW5kcyBTTUUgQUREVFMgUlNQICAgIAorICBcICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGVXTklfU01FX0FERFRTX1JTUCB0byBTTUUuICAgCisgIFwgICAgICBTTUUgb25seSBsb29rcyBhdCByYyBhbmQgdHNwZWMgZmllbGQuIAorICBccGFyYW0gcE1hYyAtIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgIFxwYXJhbSByc3BSZXFkIC0gaXMgU21lQWRkVHNSc3AgcmVxdWlyZWQKKyAgXHBhcmFtIHN0YXR1cyAtIHN0YXR1cyBjb2RlIG9mIFNNRV9BRERfVFNfUlNQCisgIFxyZXR1cm4gdHNwZWMKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkCitsaW1TZW5kU21lQWRkdHNSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCByc3BSZXFkLCB0QU5JX1UzMiBzdGF0dXMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnksIAorICAgICAgICB0U2lyTWFjVHNwZWNJRSB0c3BlYywgdEFOSV9VOCBzbWVzZXNzaW9uSWQsIHRBTklfVTE2IHNtZXRyYW5zYWN0aW9uSWQpICAKK3sKKyAgICB0cFNpckFkZHRzUnNwICAgICByc3A7CisgICAgdFNpck1zZ1EgICAgICAgICAgbW1oTXNnOworCisgICAgaWYgKCEgcnNwUmVxZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZyc3AsIHNpemVvZih0U2lyQWRkdHNSc3ApKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgicGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBBRERUU19SU1AiKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSByc3AsIHNpemVvZigqcnNwKSk7CisgICAgcnNwLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0FERFRTX1JTUDsKKyAgICByc3AtPnJjID0gc3RhdHVzOworICAgIHJzcC0+cnNwLnN0YXR1cyA9IChlbnVtIGVTaXJNYWNTdGF0dXNDb2Rlcykgc3RhdHVzOworICAgIC8vcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnJzcC0+cnNwLnRzcGVjLCAodEFOSV9VOCAqKSAmYWRkdHMtPnRzcGVjLCBzaXplb2YoYWRkdHMtPnRzcGVjKSk7ICAKKyAgICByc3AtPnJzcC50c3BlYyA9IHRzcGVjOworICAgCisgICAgLyogVXBkYXRlIFNNRSBzZXNzaW9uIElkIGFuZCB0cmFuc2NhdGlvbiBJZCAqLworICAgIHJzcC0+c2Vzc2lvbklkID0gc21lc2Vzc2lvbklkOworICAgIHJzcC0+dHJhbnNhY3Rpb25JZCA9IHNtZXRyYW5zYWN0aW9uSWQ7CisgICAgCisgICAgbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9BRERUU19SU1A7CisgICAgbW1oTXNnLmJvZHlwdHIgPSByc3A7CisgICAgbW1oTXNnLmJvZHl2YWwgPSAwOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfQUREVFNfUlNQX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAwLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgICAKKyAgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQKK2xpbVNlbmRTbWVBZGR0c0luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpckFkZHRzUmVxSW5mbyBhZGR0cykKK3sKKyAgICB0cFNpckFkZHRzUnNwIHJzcDsKKyAgICB0U2lyTXNnUSAgICAgIG1taE1zZzsKKworICAgIGxpbUxvZyhwTWFjLCBMT0dXLCAiU2VuZFNtZUFkZHRzSW5kICh0b2tlbiAlZCwgdHNpZCAlZCwgdXAgJWQpXG4iLAorICAgICAgICAgICBhZGR0cy0+ZGlhbG9nVG9rZW4sCisgICAgICAgICAgIGFkZHRzLT50c3BlYy50c2luZm8udHJhZmZpYy50c2lkLAorICAgICAgICAgICBhZGR0cy0+dHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW8pOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZyc3AsIHNpemVvZih0U2lyQWRkdHNSc3ApKSkKKyAgICB7CisgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgQUREVFNfSU5EXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcnNwLCBzaXplb2YoKnJzcCkpOworCisgICAgcnNwLT5tZXNzYWdlVHlwZSAgICAgPSBlV05JX1NNRV9BRERUU19JTkQ7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmcnNwLT5yc3AsICh0QU5JX1U4ICopIGFkZHRzLCBzaXplb2YoKmFkZHRzKSk7CisKKyAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX0FERFRTX0lORDsKKyAgICBtbWhNc2cuYm9keXB0ciA9IHJzcDsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyAgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKK30KKwordm9pZAorbGltU2VuZFNtZURlbHRzUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyRGVsdHNSZXEgZGVsdHMsIHRBTklfVTMyIHN0YXR1cyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LHRBTklfVTggc21lc2Vzc2lvbklkLHRBTklfVTE2IHNtZXRyYW5zYWN0aW9uSWQpCit7CisgICAgdHBTaXJEZWx0c1JzcCByc3A7CisgICAgdFNpck1zZ1EgICAgICBtbWhNc2c7CisKKyAgICBsaW1Mb2cocE1hYywgTE9HVywgIlNlbmRTbWVEZWx0c1JzcCAoYWlkICVkLCB0c2lkICVkLCB1cCAlZCkgc3RhdHVzICVkXG4iLAorICAgICAgICAgICBkZWx0cy0+YWlkLAorICAgICAgICAgICBkZWx0cy0+cmVxLnRzaW5mby50cmFmZmljLnRzaWQsCisgICAgICAgICAgIGRlbHRzLT5yZXEudHNpbmZvLnRyYWZmaWMudXNlclByaW8sCisgICAgICAgICAgIHN0YXR1cyk7CisgICAgaWYgKCEgZGVsdHMtPnJzcFJlcWQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcnNwLCBzaXplb2YodFNpckRlbHRzUnNwKSkpCisgICAgeworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgZm9yIERFTFRTX1JTUFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHJzcCwgc2l6ZW9mKCpyc3ApKTsKKyAgCisgICAgaWYocHNlc3Npb25FbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgCisgICAgICAgIHJzcC0+YWlkICAgICAgICAgICAgID0gZGVsdHMtPmFpZDsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnJzcC0+bWFjQWRkclswXSwgKHRBTklfVTggKikgJmRlbHRzLT5tYWNBZGRyWzBdLCA2KTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnJzcC0+cnNwLCAodEFOSV9VOCAqKSAmZGVsdHMtPnJlcSwgc2l6ZW9mKHRTaXJEZWx0c1JlcUluZm8pKTsKKyAgICB9IAorCisgICAgCisgICAgcnNwLT5tZXNzYWdlVHlwZSAgICAgPSBlV05JX1NNRV9ERUxUU19SU1A7CisgICAgcnNwLT5yYyAgICAgICAgICAgICAgPSBzdGF0dXM7CisKKyAgICAvKiBVcGRhdGUgU01FIHNlc3Npb24gSWQgYW5kIHRyYW5zY2F0aW9uIElkICovCisgICAgcnNwLT5zZXNzaW9uSWQgPSBzbWVzZXNzaW9uSWQ7CisgICAgcnNwLT50cmFuc2FjdGlvbklkID0gc21ldHJhbnNhY3Rpb25JZDsKKworICAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfREVMVFNfUlNQOworICAgIG1taE1zZy5ib2R5cHRyID0gcnNwOworICAgIG1taE1zZy5ib2R5dmFsID0gMDsKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtbWhNc2cudHlwZSkpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0RFTFRTX1JTUF9FVkVOVCwgcHNlc3Npb25FbnRyeSwgKHRBTklfVTE2KXN0YXR1cywgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgCisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7Cit9CisKK3ZvaWQKK2xpbVNlbmRTbWVEZWx0c0luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpckRlbHRzUmVxSW5mbyBkZWx0cywgdEFOSV9VMTYgYWlkLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdHBTaXJEZWx0c1JzcCByc3A7CisgICAgdFNpck1zZ1EgICAgICBtbWhNc2c7CisKKyAgICBsaW1Mb2cocE1hYywgTE9HVywgIlNlbmRTbWVEZWx0c0luZCAoYWlkICVkLCB0c2lkICVkLCB1cCAlZClcbiIsCisgICAgICAgICAgIGFpZCwKKyAgICAgICAgICAgZGVsdHMtPnRzaW5mby50cmFmZmljLnRzaWQsCisgICAgICAgICAgIGRlbHRzLT50c2luZm8udHJhZmZpYy51c2VyUHJpbyk7CisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnJzcCwgc2l6ZW9mKHRTaXJEZWx0c1JzcCkpKQorICAgIHsKKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgicGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBERUxUU19JTkRcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSByc3AsIHNpemVvZigqcnNwKSk7CisKKyAgICByc3AtPm1lc3NhZ2VUeXBlICAgICA9IGVXTklfU01FX0RFTFRTX0lORDsKKyAgICByc3AtPnJjICAgICAgICAgICAgICA9IGVTSVJfU1VDQ0VTUzsKKyAgICByc3AtPmFpZCAgICAgICAgICAgICA9IGFpZDsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmcnNwLT5yc3AsICh0QU5JX1U4ICopIGRlbHRzLCBzaXplb2YoKmRlbHRzKSk7CisKKyAgICAvKiBVcGRhdGUgU01FICBzZXNzaW9uIElkIGFuZCBTTUUgdHJhbnNhY3Rpb24gSWQgKi8KKworICAgIHJzcC0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworICAgIHJzcC0+dHJhbnNhY3Rpb25JZCA9IHBzZXNzaW9uRW50cnktPnRyYW5zYWN0aW9uSWQ7CisKKyAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX0RFTFRTX0lORDsKKyAgICBtbWhNc2cuYm9keXB0ciA9IHJzcDsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19ERUxUU19JTkRfRVZFTlQsIHBzZXNzaW9uRW50cnksIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7Cit9CisKKy8qKgorICogbGltU2VuZFNtZVN0YXRzUnNwKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCA4MDIuMTEgc3RhdGlzdGljcyByZXNwb25zZSB0byBIREQuCisgKiBUaGlzIGZ1bmN0aW9uIHBvc3RzIHRoZSByZXN1bHQgYmFjayB0byBIREQuIFRoaXMgaXMgYSByZXNwb25zZSB0bworICogSEREJ3MgcmVxdWVzdCBmb3Igc3RhdGlzdGljcy4KKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcDgwMjExU3RhdHMgIFN0YXRpc3RpY3Mgc2VudCBpbiByZXNwb25zZSAKKyAqIEBwYXJhbSByZXN1bHRDb2RlICAgVE9ETzoKKyAqIAorICoKKyAqIEByZXR1cm4gbm9uZQorICovCisKK3ZvaWQKK2xpbVNlbmRTbWVTdGF0c1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBtc2dUeXBlLCB2b2lkKiBzdGF0cykKK3sKKyAgICB0U2lyTXNnUSAgICAgICAgICAgICAgbW1oTXNnOworICAgIHRTaXJTbWVSc3AgICAgICAgICAgICpwTXNnSGRyID0gKHRTaXJTbWVSc3AqKSBzdGF0czsKKworICAgIHN3aXRjaChtc2dUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBXREFfU1RBX1NUQVRfUlNQOgorICAgICAgICAgICAgbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9TVEFfU1RBVF9SU1A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXREFfQUdHUl9TVEFUX1JTUDoKKyAgICAgICAgICAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfQUdHUl9TVEFUX1JTUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdEQV9HTE9CQUxfU1RBVF9SU1A6CisgICAgICAgICAgICBtbWhNc2cudHlwZSA9IGVXTklfU01FX0dMT0JBTF9TVEFUX1JTUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdEQV9TVEFUX1NVTU1fUlNQOgorICAgICAgICAgICAgbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9TVEFUX1NVTU1fUlNQOworICAgICAgICAgICAgYnJlYWs7ICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtbWhNc2cudHlwZSA9IG1zZ1R5cGU7IC8vUmVzcG9uc2UgZnJvbSB3aXRoaW4gUEUKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBNc2dIZHItPm1lc3NhZ2VUeXBlID0gbW1oTXNnLnR5cGU7IAorCisgICAgbW1oTXNnLmJvZHlwdHIgPSBzdGF0czsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyAgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgcmV0dXJuOworCit9IC8qKiogZW5kIGxpbVNlbmRTbWVTdGF0c1JzcCgpICoqKi8KKworLyoqCisgKiBsaW1TZW5kU21lUEVTdGF0aXN0aWNzUnNwKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCA4MDIuMTEgc3RhdGlzdGljcyByZXNwb25zZSB0byBIREQuCisgKiBUaGlzIGZ1bmN0aW9uIHBvc3RzIHRoZSByZXN1bHQgYmFjayB0byBIREQuIFRoaXMgaXMgYSByZXNwb25zZSB0bworICogSEREJ3MgcmVxdWVzdCBmb3Igc3RhdGlzdGljcy4KKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gcDgwMjExU3RhdHMgIFN0YXRpc3RpY3Mgc2VudCBpbiByZXNwb25zZSAKKyAqIEBwYXJhbSByZXN1bHRDb2RlICAgVE9ETzoKKyAqIAorICoKKyAqIEByZXR1cm4gbm9uZQorICovCisKK3ZvaWQKK2xpbVNlbmRTbWVQRVN0YXRpc3RpY3NSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgbXNnVHlwZSwgdm9pZCogc3RhdHMpCit7CisgICAgdFNpck1zZ1EgICAgICAgICAgICAgIG1taE1zZzsKKyAgICB0QU5JX1U4IHNlc3Npb25JZDsKKyAgICB0QW5pR2V0UEVTdGF0c1JzcCAqcFBlU3RhdHMgPSAodEFuaUdldFBFU3RhdHNSc3AgKikgc3RhdHM7CisgICAgdHBQRVNlc3Npb24gcFBlU2Vzc2lvbkVudHJ5OworCisgICAgLy9HZXQgdGhlIFNlc3Npb24gSWQgYmFzZWQgb24gU3RhIElkCisgICAgcFBlU2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U3RhSWQocE1hYywgcFBlU3RhdHMtPnN0YUlkLCAmc2Vzc2lvbklkKTsKKworICAgIC8vRmlsbCB0aGUgU2Vzc2lvbiBJZAorICAgIGlmKE5VTEwgIT0gcFBlU2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgIC8vRmlsbCB0aGUgU2Vzc2lvbiBJZAorICAgICAgcFBlU3RhdHMtPnNlc3Npb25JZCA9IHBQZVNlc3Npb25FbnRyeS0+c21lU2Vzc2lvbklkOworICAgIH0KKyAKKyAgICBwUGVTdGF0cy0+bXNnVHlwZSA9IGVXTklfU01FX0dFVF9TVEFUSVNUSUNTX1JTUDsKKyAgICAKKworICAgIC8vbXNnVHlwZSBzaG91bGQgYmUgV0RBX0dFVF9TVEFUSVNUSUNTX1JTUAorICAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUlNQOworCisgICAgbW1oTXNnLmJvZHlwdHIgPSBzdGF0czsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyAgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgcmV0dXJuOworCit9IC8qKiogZW5kIGxpbVNlbmRTbWVQRVN0YXRpc3RpY3NSc3AoKSAqKiovCisKKwordm9pZAorbGltU2VuZFNtZUlCU1NQZWVySW5kKAorICAgIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwKKyAgICB0QU5JX1UxNiAgICBzdGFJbmRleCwgCisgICAgdEFOSV9VOCAgICAgdWNhc3RJZHgsCisgICAgdEFOSV9VOCAgICAgYmNhc3RJZHgsCisgICAgdEFOSV9VOCAgKmJlYWNvbiwgCisgICAgdEFOSV9VMTYgYmVhY29uTGVuLCAKKyAgICB0QU5JX1UxNiBtc2dUeXBlLAorICAgIHRBTklfVTggc2Vzc2lvbklkKQoreworICAgIHRTaXJNc2dRICAgICAgICAgICAgICAgICAgbW1oTXNnOworICAgIHRTbWVJYnNzUGVlckluZCAqcE5ld1BlZXJJbmQ7CisgICAgCisgICAgaWYoZVNJUl9TVUNDRVNTICE9CisgICAgICAgIHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKiAqKSAmcE5ld1BlZXJJbmQsKHNpemVvZih0U21lSWJzc1BlZXJJbmQpICsgYmVhY29uTGVuKSkpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBOZXdQZWVySW5kLCAoc2l6ZW9mKHRTbWVJYnNzUGVlckluZCkgKyBiZWFjb25MZW4pKTsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBOZXdQZWVySW5kLT5wZWVyQWRkciwKKyAgICAgICAgICAgICAgICAgICBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcE5ld1BlZXJJbmQtPnN0YUlkPSBzdGFJbmRleDsKKyAgICBwTmV3UGVlckluZC0+dWNhc3RTaWcgPSB1Y2FzdElkeDsKKyAgICBwTmV3UGVlckluZC0+YmNhc3RTaWcgPSBiY2FzdElkeDsKKyAgICBwTmV3UGVlckluZC0+bWVzZ0xlbiA9IHNpemVvZih0U21lSWJzc1BlZXJJbmQpICsgYmVhY29uTGVuOworICAgIHBOZXdQZWVySW5kLT5tZXNnVHlwZSA9IG1zZ1R5cGU7CisgICAgcE5ld1BlZXJJbmQtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworICAgIGlmICggYmVhY29uICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopICgodEFOSV9VOCopcE5ld1BlZXJJbmQrc2l6ZW9mKHRTbWVJYnNzUGVlckluZCkpLCAodm9pZCopYmVhY29uLCBiZWFjb25MZW4pOworICAgIH0KKworICAgIG1taE1zZy50eXBlICAgID0gbXNnVHlwZTsKKy8vICAgIG1taE1zZy5ib2R5dmFsID0gKHRBTklfVTMyKSBwTmV3UGVlckluZDsKKyAgICBtbWhNc2cuYm9keXB0ciA9IHBOZXdQZWVySW5kOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisgICAgCit9CisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBsaW1TZW5kRXhpdEJtcHNJbmQoKSAtIHNlbmRzIGV4aXQgYm1wcyBpbmRpY2F0aW9uCisgICAKKyAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGVXTklfUE1DX0VYSVRfQk1QU19JTkQgd2l0aCBhIHNwZWNpZmljIHJlYXNvbgorICBjb2RlIHRvIFNNRS4gVGhpcyB3aWxsIHRyaWdnZXIgU01FIHRvIGdldCBvdXQgb2YgQk1QUyBtb2RlLiAKKyAgICAKKyAgXHBhcmFtIHBNYWMgLSBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICBccGFyYW0gcmVhc29uQ29kZSAtIHJlYXNvbiBmb3Igd2hpY2ggUEUgd2lzaCB0byBleGl0IEJNUFMKKyAgXHJldHVybiBub25lIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgbGltU2VuZEV4aXRCbXBzSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRFeGl0Qm1wc1JlYXNvbiByZWFzb25Db2RlKQoreworICAgIHRTaXJNc2dRICBtbWhNc2c7CisgICAgdEFOSV9VMTYgIG1zZ0xlbiA9IDA7CisgICAgdHBTaXJTbWVFeGl0Qm1wc0luZCAgcEV4aXRCbXBzSW5kOworIAorICAgIG1zZ0xlbiA9IHNpemVvZih0U2lyU21lRXhpdEJtcHNJbmQpOworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcEV4aXRCbXBzSW5kLCBtc2dMZW4gKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgicGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBQTUNfRVhJVF9CTVBTX0lORCBcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBFeGl0Qm1wc0luZCwgbXNnTGVuKTsKKworI2lmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIGRlZmluZWQgKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pCisgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcEV4aXRCbXBzSW5kLT5tZXNnVHlwZSwgZVdOSV9QTUNfRVhJVF9CTVBTX0lORCk7CisgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcEV4aXRCbXBzSW5kLT5tZXNnTGVuLCBtc2dMZW4pOworI2Vsc2UKKyAgICBwRXhpdEJtcHNJbmQtPm1lc2dUeXBlID0gZVdOSV9QTUNfRVhJVF9CTVBTX0lORDsKKyAgICBwRXhpdEJtcHNJbmQtPm1lc2dMZW4gPSBtc2dMZW47CisjZW5kaWYKKyAgICBwRXhpdEJtcHNJbmQtPmV4aXRCbXBzUmVhc29uID0gcmVhc29uQ29kZTsKKyAgICBwRXhpdEJtcHNJbmQtPnN0YXR1c0NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCisgICAgbW1oTXNnLnR5cGUgPSBlV05JX1BNQ19FWElUX0JNUFNfSU5EOworICAgIG1taE1zZy5ib2R5cHRyID0gcEV4aXRCbXBzSW5kOworICAgIG1taE1zZy5ib2R5dmFsID0gMDsKKyAgCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU2VuZGluZyBlV05JX1BNQ19FWElUX0JNUFNfSU5EIHRvIFNNRS4gXG4iKSk7KSAgICAgICAgCisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0xJTSAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19FWElUX0JNUFNfSU5EX0VWRU5ULCBwZUdldFZhbGlkUG93ZXJTYXZlU2Vzc2lvbihwTWFjKSwgMCwgKHRBTklfVTE2KXJlYXNvbkNvZGUpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgIAorICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgIGVQUk9UKTsKKyAgICByZXR1cm47CisKK30gLyoqKiBlbmQgbGltU2VuZEV4aXRCbXBzSW5kKCkgKioqLworCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBwZURlbGV0ZVNlc3Npb24oKSAtIEhhbmRsZSB0aGUgRGVsZXRlIEJTUyBSZXNwb25zZSBmcm9tIEhBTC4KKworICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC0gTWVzc2FnZSBwb2ludGVyLgorICAgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGxpbUhhbmRsZURlbGV0ZUJzc1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLHRwU2lyTXNnUSBNc2dRKQoreworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisgICAgdHBEZWxldGVCc3NQYXJhbXMgcERlbEJzcyA9ICh0cERlbGV0ZUJzc1BhcmFtcykoTXNnUS0+Ym9keXB0cik7CisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwRGVsQnNzLT5zZXNzaW9uSWQpKT09TlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLEZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSURcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpCisgICAgeworICAgICAgICBsaW1JYnNzRGVsQnNzUnNwKHBNYWMsIE1zZ1EtPmJvZHlwdHIscHNlc3Npb25FbnRyeSk7CisgICAgfSAgICAKKyAgICBlbHNlIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9VTktOT1dOX1JPTEUpCisgICAgeworICAgICAgICAgbGltUHJvY2Vzc1NtZURlbEJzc1JzcChwTWFjLCBNc2dRLT5ib2R5dmFsLHBzZXNzaW9uRW50cnkpOworICAgIH0KKyAgICAgICAgICAgCisgICAgZWxzZQorICAgICAgICAgbGltUHJvY2Vzc01sbURlbEJzc1JzcChwTWFjLE1zZ1EscHNlc3Npb25FbnRyeSk7CisgICAgCit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBsaW1TZW5kU21lQWdnclFvc1JzcCgpIC0gc2VuZHMgU01FIEZUIEFHR1IgUU9TIFJTUCAgICAKKyAgXCAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBlV05JX1NNRV9GVF9BR0dSX1FPU19SU1AgdG8gU01FLiAgIAorICBcICAgICAgU01FIG9ubHkgbG9va3MgYXQgcmMgYW5kIHRzcGVjIGZpZWxkLiAKKyAgXHBhcmFtIHBNYWMgLSBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICBccGFyYW0gcnNwUmVxZCAtIGlzIFNtZUFkZFRzUnNwIHJlcXVpcmVkCisgIFxwYXJhbSBzdGF0dXMgLSBzdGF0dXMgY29kZSBvZiBlV05JX1NNRV9GVF9BR0dSX1FPU19SU1AKKyAgXHJldHVybiB0c3BlYworICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK2xpbVNlbmRTbWVBZ2dyUW9zUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyQWdnclFvc1JzcCBhZ2dyUW9zUnNwLCAKKyAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggc21lc2Vzc2lvbklkKQoreworICAgIHRTaXJNc2dRICAgICAgICAgbW1oTXNnOworCisgICAgbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9GVF9BR0dSX1FPU19SU1A7CisgICAgbW1oTXNnLmJvZHlwdHIgPSBhZ2dyUW9zUnNwOworICAgIG1taE1zZy5ib2R5dmFsID0gMDsKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtbWhNc2cudHlwZSkpOworICAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgZVBST1QpOworCisgICAgcmV0dXJuOworfQorI2VuZGlmCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgbGltU2VuZFNtZVByZUNoYW5uZWxTd2l0Y2hJbmQoKSAtIHNlbmRzIGFuIGluZGljYXRpb24gdG8gU01FIAorICBiZWZvcmUgc3dpdGNoaW5nIGNoYW5uZWxzIGZvciBzcGVjdHJ1bSBtYW5hbmdlbWVudC4KKyAgIAorICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgZVdOSV9TTUVfUFJFX1NXSVRDSF9DSExfSU5EIHRvIFNNRS4KKyAgICAKKyAgXHBhcmFtIHBNYWMgLSBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICBccmV0dXJuIG5vbmUgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZAorbGltU2VuZFNtZVByZUNoYW5uZWxTd2l0Y2hJbmQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0U2lyTXNnUSAgICAgICAgIG1taE1zZzsKKworICAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfUFJFX1NXSVRDSF9DSExfSU5EOworICAgIG1taE1zZy5ib2R5cHRyID0gTlVMTDsKKyAgICBtbWhNc2cuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyAgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKworICAgIHJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBsaW1TZW5kU21lUG9zdENoYW5uZWxTd2l0Y2hJbmQoKSAtIHNlbmRzIGFuIGluZGljYXRpb24gdG8gU01FIAorICBhZnRlciBjaGFubmVsIHN3aXRjaCBmb3Igc3BlY3RydW0gbWFuYW5nZW1lbnQgaXMgY29tcGxldGUuCisgICAKKyAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGVXTklfU01FX1BPU1RfU1dJVENIX0NITF9JTkQgdG8gU01FLgorICAgIAorICBccGFyYW0gcE1hYyAtIGdsb2JhbCBtYWMgc3RydWN0dXJlCisgIFxyZXR1cm4gbm9uZSAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkCitsaW1TZW5kU21lUG9zdENoYW5uZWxTd2l0Y2hJbmQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0U2lyTXNnUSAgICAgICAgIG1taE1zZzsKKworICAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfUE9TVF9TV0lUQ0hfQ0hMX0lORDsKKyAgICBtbWhNc2cuYm9keXB0ciA9IE5VTEw7CisgICAgbW1oTXNnLmJvZHl2YWwgPSAwOworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICAgbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgbGltU2VuZFNtZU1heEFzc29jRXhjZWVkZWROdGYodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggc21lc2Vzc2lvbklkKQoreworICAgIHRTaXJNc2dRICAgICAgICAgbW1oTXNnOworICAgIHRTbWVNYXhBc3NvY0luZCAqcFNtZU1heEFzc29jSW5kOworCisgICAgaWYoZVNJUl9TVUNDRVNTICE9CisgICAgICAgICAgICBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCh2b2lkICoqKSZwU21lTWF4QXNzb2NJbmQsIHNpemVvZih0U21lTWF4QXNzb2NJbmQpKSkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkiKSk7KQorICAgICAgICByZXR1cm47CisgICAgfSAgICAKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBTbWVNYXhBc3NvY0luZCwgc2l6ZW9mKHRTbWVNYXhBc3NvY0luZCkpOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopcFNtZU1heEFzc29jSW5kLT5wZWVyTWFjLAorICAgICAgICAgICAgKHRBTklfVTggKilwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcFNtZU1heEFzc29jSW5kLT5tZXNnVHlwZSAgPSBlV05JX1NNRV9NQVhfQVNTT0NfRVhDRUVERUQ7CisgICAgcFNtZU1heEFzc29jSW5kLT5tZXNnTGVuICAgID0gc2l6ZW9mKHRTbWVNYXhBc3NvY0luZCk7IAorICAgIHBTbWVNYXhBc3NvY0luZC0+c2Vzc2lvbklkID0gc21lc2Vzc2lvbklkOworICAgIG1taE1zZy50eXBlID0gcFNtZU1heEFzc29jSW5kLT5tZXNnVHlwZTsKKyAgICBtbWhNc2cuYm9keXB0ciA9IHBTbWVNYXhBc3NvY0luZDsKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJtc2dUeXBlICVzIHBlZXJNYWNBZGRyICUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4IgorICAgICAgICAgICAgICAgICJzbWUgc2Vzc2lvbiBpZCAlZFxuIiksImVXTklfU01FX01BWF9BU1NPQ19FWENFRURFRCIsIHBlZXJNYWNBZGRyWzBdLCBwZWVyTWFjQWRkclsxXSwKKyAgICAgICAgICAgICAgICBwZWVyTWFjQWRkclsyXSwgcGVlck1hY0FkZHJbM10sIHBlZXJNYWNBZGRyWzRdLCBwZWVyTWFjQWRkcls1XSwgc21lc2Vzc2lvbklkKTspCisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyAgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2VuZFNtZVJzcE1lc3NhZ2VzLmggYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlbmRTbWVSc3BNZXNzYWdlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZTgwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlbmRTbWVSc3BNZXNzYWdlcy5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1TZW5kU21lUnNwTWVzc2FnZXMuaCBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yCisgKiBzZW5kaW5nIFNNRSByZXNwb25zZS9ub3RpZmljYXRpb24gbWVzc2FnZXMgdG8gYXBwbGljYXRpb25zIGFib3ZlCisgKiBNQUMgc29mdHdhcmUuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqLworI2lmbmRlZiBfX0xJTV9TRU5EX1NNRV9SU1BfSAorI2RlZmluZSBfX0xJTV9TRU5EX1NNRV9SU1BfSAorCisjaW5jbHVkZSAic2lyQ29tbW9uLmgiCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAic2lyTWFjUHJvdERlZi5oIgorCisKKy8vIEZ1bmN0aW9ucyBmb3Igc2VuZGluZyByZXNwb25zZXMgdG8gSG9zdAordm9pZCBsaW1TZW5kU21lUnNwKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdFNpclJlc3VsdENvZGVzLCB0QU5JX1U4ICwgdEFOSV9VMTYpOwordm9pZCBsaW1TZW5kU21lU3RhcnRCc3NSc3AodHBBbmlTaXJHbG9iYWwsIHRBTklfVTE2LCB0U2lyUmVzdWx0Q29kZXMsdHBQRVNlc3Npb24sdEFOSV9VOCx0QU5JX1UxNik7Cit2b2lkIGxpbVNlbmRTbWVTY2FuUnNwKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdFNpclJlc3VsdENvZGVzLHRBTklfVTgsIHRBTklfVTE2KTsKK3ZvaWQgbGltUG9zdFNtZVNjYW5Sc3BNZXNzYWdlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdFNpclJlc3VsdENvZGVzLHRBTklfVTgsdEFOSV9VMTYpOyAKK3ZvaWQgbGltU2VuZFNtZUF1dGhSc3AodHBBbmlTaXJHbG9iYWwsIHRTaXJSZXN1bHRDb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIsIHRBbmlBdXRoVHlwZSwgdEFOSV9VMTYsdHBQRVNlc3Npb24sdEFOSV9VOCx0QU5JX1UxNik7CisKK3ZvaWQgbGltU2VuZFNtZUpvaW5SZWFzc29jUnNwKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdFNpclJlc3VsdENvZGVzLCB0QU5JX1UxNix0cFBFU2Vzc2lvbix0QU5JX1U4LHRBTklfVTE2KTsKK3ZvaWQgbGltU2VuZFNtZURpc2Fzc29jTnRmKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjQWRkciwgdFNpclJlc3VsdENvZGVzLCB0QU5JX1UxNiwgdEFOSV9VMTYsdEFOSV9VOCx0QU5JX1UxNix0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbVNlbmRTbWVEZWF1dGhOdGYodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNBZGRyLCB0U2lyUmVzdWx0Q29kZXMsIHRBTklfVTE2LCB0QU5JX1UxNiwgdEFOSV9VOCwgdEFOSV9VMTYpOwordm9pZCBsaW1TZW5kU21lRGlzYXNzb2NJbmQodHBBbmlTaXJHbG9iYWwsIHRwRHBoSGFzaE5vZGUsdHBQRVNlc3Npb24pOwordm9pZCBsaW1TZW5kU21lRGVhdXRoSW5kKHRwQW5pU2lyR2xvYmFsLCB0cERwaEhhc2hOb2RlLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworCisKK3ZvaWQgbGltU2VuZFNtZVdtU3RhdHVzQ2hhbmdlTnRmKHRwQW5pU2lyR2xvYmFsLCB0U2lyU21lU3RhdHVzQ2hhbmdlQ29kZSwgdEFOSV9VMzIgKiwgdEFOSV9VMTYsIHRBTklfVTgpOwordm9pZCBsaW1TZW5kU21lU2V0Q29udGV4dFJzcCh0cEFuaVNpckdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIsIHRBTklfVTE2LCB0U2lyUmVzdWx0Q29kZXMsdHBQRVNlc3Npb24sdEFOSV9VOCx0QU5JX1UxNik7Cit2b2lkIGxpbVNlbmRTbWVQcm9taXNjdW91c01vZGVSc3AodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGxpbVNlbmRTbWVOZWlnaGJvckJzc0luZCh0cEFuaVNpckdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMaW1TY2FuUmVzdWx0Tm9kZSAqKTsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCit2b2lkIGxpbVNlbmRTbWVNZWFzdXJlbWVudEluZCh0cEFuaVNpckdsb2JhbCk7CisjZW5kaWYKK3ZvaWQgbGltSGFuZGxlRGVsZXRlQnNzUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsdHBTaXJNc2dRIE1zZ1EpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK3ZvaWQKK2xpbVNlbmRTbWVBZ2dyUW9zUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyQWdnclFvc1JzcCBhZ2dyUW9zUnNwLCAKKyAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggc21lc2Vzc2lvbklkKTsKKyNlbmRpZiAvKldMQU5fRkVBVFVSRV9WT1dJRklfMTFSKi8KKworCit2b2lkIGxpbVNlbmRTbWVBZGR0c1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IHJzcFJlcWQsIHRBTklfVTMyIHN0YXR1cywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwgdFNpck1hY1RzcGVjSUUgdHNwZWMsIHRBTklfVTggc21lc2Vzc2lvbklkLCB0QU5JX1UxNiBzbWV0cmFuc2FjdGlvbklkKTsKK3ZvaWQgbGltU2VuZFNtZUFkZHRzSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyQWRkdHNSZXFJbmZvIGFkZHRzKTsKK3ZvaWQgbGltU2VuZFNtZURlbHRzUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyRGVsdHNSZXEgZGVsdHMsIHRBTklfVTMyIHN0YXR1cyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5LHRBTklfVTggc21lc3Npb25JZCx0QU5JX1UxNiBzbWV0cmFuc2FjdGlvbklkKTsKK3ZvaWQgbGltU2VuZFNtZURlbHRzSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyRGVsdHNSZXFJbmZvIGRlbHRzLCB0QU5JX1UxNiBhaWQsdHBQRVNlc3Npb24pOwordm9pZCBsaW1TZW5kU21lU3RhdHNSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgbXNndHlwZSwgdm9pZCAqIHN0YXRzKTsKKwordm9pZCBsaW1TZW5kU21lUEVTdGF0aXN0aWNzUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IG1zZ3R5cGUsIHZvaWQgKiBzdGF0cyk7Cit2b2lkIGxpbVNlbmRTbWVSZW1vdmVLZXlSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlLHRwUEVTZXNzaW9uLHRBTklfVTgsdEFOSV9VMTYpOworCisKK3ZvaWQgbGltU2VuZFNtZUdldFR4UG93ZXJSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgcG93ZXIsIHRBTklfVTMyIHN0YXR1cyk7Cit2b2lkIGxpbVNlbmRTbWVHZXROb2lzZVJzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjTm9pc2Ugbm9pc2UpOwordm9pZCBsaW1TZW5kU21lSUJTU1BlZXJJbmQodHBBbmlTaXJHbG9iYWwgcE1hYyx0U2lyTWFjQWRkciBwZWVyTWFjQWRkcix0QU5JX1UxNiBzdGFJbmRleCx0QU5JX1U4IHVjYXN0SWR4LHRBTklfVTggYmNhc3RJZHgsCisgICAgICAgICAgICAgICB0QU5JX1U4ICpiZWFjb24sdEFOSV9VMTYgYmVhY29uTGVuLCB0QU5JX1UxNiBtc2dUeXBlLCB0QU5JX1U4IHNlc3Npb25JZCk7Cit2b2lkIGxpbVNlbmRFeGl0Qm1wc0luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RXhpdEJtcHNSZWFzb24gcmVhc29uQ29kZSk7CisKKwordm9pZCBsaW1TZW5kU21lUHJlQ2hhbm5lbFN3aXRjaEluZCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltU2VuZFNtZVBvc3RDaGFubmVsU3dpdGNoSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBsaW1TZW5kU21lTWF4QXNzb2NFeGNlZWRlZE50Zih0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwgdEFOSV9VOCBzbWVzZXNzaW9uSWQpOworCisjZW5kaWYgLyogX19MSU1fU0VORF9TTUVfUlNQX0ggKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZXJEZXNVdGlscy5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZXJEZXNVdGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjNiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlckRlc1V0aWxzLmMKQEAgLTAsMCArMSw0Mjc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorICogCisgKiBUaGlzIGZpbGUgbGltU2VyRGVzVXRpbHMuY2MgY29udGFpbnMgdGhlIHNlcmlhbGl6ZXIvZGVzZXJpYWxpemVyCisgKiB1dGlsaXR5IGZ1bmN0aW9ucyBMSU0gdXNlcyB3aGlsZSBjb21tdW5pY2F0aW5nIHdpdGggdXBwZXIgbGF5ZXIKKyAqIHNvZnR3YXJlIGVudGl0aWVzCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAxMC8yMC8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImFuaVN5c3RlbURlZnMuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZXJEZXNVdGlscy5oIgorCisKKworLyoqCisgKiBsaW1DaGVja1JlbWFpbmluZ0xlbmd0aCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoaWxlIGRlLXNlcmlhbGl6aW5nIHJlY2VpdmVkIFNNRV9SRVEKKyAqIG1lc3NhZ2UuCisgKgorICpMT0dJQzoKKyAqIFJlbWFpbmluZyBtZXNzYWdlIGxlbmd0aCBpcyBjaGVja2VkIGZvciA+IDAuCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIGxlbiAgICAgLSBSZW1haW5pbmcgbWVzc2FnZSBsZW5ndGgKKyAqIEByZXR1cm4gcmV0Q29kZSAtIGVTSVJfU1VDQ0VTUyBpZiBsZW4gPiAwLCBlbHNlIGVTSVJfRkFJTFVSRQorICovCisKK3N0YXRpYyBpbmxpbmUgdFNpclJldFN0YXR1cworbGltQ2hlY2tSZW1haW5pbmdMZW5ndGgodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9TMTYgbGVuKQoreworICAgIGlmIChsZW4gPiAwKQorICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICBGTCgiUmVjZWl2ZWQgU01FIG1lc3NhZ2Ugd2l0aCBpbnZhbGlkIHJlbSBsZW5ndGg9JWRcbiIpLAorICAgICAgICAgICBsZW4pOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KK30gLyoqKiBlbmQgbGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgKSAqKiovCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorI2Vsc2UKKy8qKgorICogbGltR2V0QnNzRGVzY3JpcHRpb24oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB2YXJpb3VzIExJTSBmdW5jdGlvbnMgdG8gY29weQorICogQlNTIGRlc2NyaXB0aW9uIGZyb20gYSB0QU5JX1U4KiBidWZmZXIgcG9pbnRlciB0byB0U2lyQnNzRGVzY3JpcHRpb24KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwQnNzRGVzY3JpcHRpb24gIFBvaW50ZXIgdG8gdGhlIEJzc0Rlc2NyaXB0aW9uIHRvIGJlIGNvcGllZAorICogQHBhcmFtICAqcEJ1ZiAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSBidWZmZXIKKyAqIEBwYXJhbSAgckxlbiAgICAgICAgICAgICBSZW1haW5pbmcgbWVzc2FnZSBsZW5ndGggYmVpbmcgZXh0cmFjdGVkCisgKiBAcmV0dXJuIHJldENvZGUgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkZS1zZXJpYWxpemVkIChlU0lSX1NVQ0NFU1MpIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSAoZVNJUl9GQUlMVVJFKS4KKyAqLworCitzdGF0aWMgdFNpclJldFN0YXR1cworbGltR2V0QnNzRGVzY3JpcHRpb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgdEFOSV9TMTYgckxlbiwgdEFOSV9TMTYgKmxlblVzZWQsIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9VMTYgbGVuID0gMDsKKworICAgIHBCc3NEZXNjcmlwdGlvbi0+bGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBsZW4gICA9IHBCc3NEZXNjcmlwdGlvbi0+bGVuZ3RoOworCisgICAgaWYgKHJMZW4gPCAodEFOSV9TMTYpIChsZW4gKyBzaXplb2YodEFOSV9VMTYpKSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgICpsZW5Vc2VkID0gbGVuICsgc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIC8vIEV4dHJhY3QgYnNzSWQKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQnNzRGVzY3JpcHRpb24tPmJzc0lkLAorICAgICAgICAgICAgICAgICAgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHRpbWVyCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgKCZwQnNzRGVzY3JpcHRpb24tPnNjYW5TeXNUaW1lTXNlYyksCisgICAgICAgICAgICAgICAgICBwQnVmLCBzaXplb2Yodl9USU1FX3QpKTsKKyAgICBwQnVmICs9IHNpemVvZih2X1RJTUVfdCk7CisgICAgbGVuICAtPSBzaXplb2Yodl9USU1FX3QpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgdGltZVN0YW1wCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcEJzc0Rlc2NyaXB0aW9uLT50aW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICBwQnVmLCBzaXplb2YodFNpck1hY1RpbWVTdGFtcCkpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNUaW1lU3RhbXApOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJNYWNUaW1lU3RhbXApOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgYmVhY29uSW50ZXJ2YWwKKyAgICBwQnNzRGVzY3JpcHRpb24tPmJlYWNvbkludGVydmFsID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBsZW4gIC09IHNpemVvZih0QU5JX1UxNik7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBjYXBhYmlsaXR5SW5mbworICAgIHBCc3NEZXNjcmlwdGlvbi0+Y2FwYWJpbGl0eUluZm8gPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IG53VHlwZQorICAgIHBCc3NEZXNjcmlwdGlvbi0+bndUeXBlID0gKHRTaXJOd1R5cGUpIGxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTndUeXBlKTsKKyAgICBsZW4gIC09IHNpemVvZih0U2lyTndUeXBlKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IGFuaUluZGljYXRvcgorICAgIHBCc3NEZXNjcmlwdGlvbi0+YW5pSW5kaWNhdG9yID0gKnBCdWYrKzsKKyAgICBsZW4gLS07CisKKyAgICAvLyBFeHRyYWN0IHJzc2kKKyAgICBwQnNzRGVzY3JpcHRpb24tPnJzc2kgPSAodEFOSV9TOCkgKnBCdWYrKzsKKyAgICBsZW4gLS07CisKKyAgICAvLyBFeHRyYWN0IHNpbnIKKyAgICBwQnNzRGVzY3JpcHRpb24tPnNpbnIgPSAodEFOSV9TOCkgKnBCdWYrKzsKKyAgICBsZW4gLS07CisKKyAgICAvLyBFeHRyYWN0IGNoYW5uZWxJZAorICAgIHBCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbElkID0gKnBCdWYrKzsKKyAgICBsZW4gLS07CisKKyAgICAvLyBFeHRyYWN0IGNoYW5uZWxJZFNlbGYKKyAgICBwQnNzRGVzY3JpcHRpb24tPmNoYW5uZWxJZFNlbGYgPSAqcEJ1ZisrOworICAgIGxlbiAtLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgCisgICAgLy8gRXh0cmFjdCByZXNlcnZlZCBic3NEZXNjcmlwdGlvbgorICAgIHBCdWYgKz0gc2l6ZW9mKHBCc3NEZXNjcmlwdGlvbi0+c1NpckJzc0Rlc2NyaXB0aW9uUnN2ZCk7CisgICAgbGVuIC09IHNpemVvZihwQnNzRGVzY3JpcHRpb24tPnNTaXJCc3NEZXNjcmlwdGlvblJzdmQpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgdGhlIFRJVEFOIGNhcGFiaWxpdHkgaW5mbworICAgIC8vIE5PVEUgLSB0aXRhbkh0Q2FwcyBpcyBub3cgRFdPUkQgYWxpZ25lZAorICAgIHBCc3NEZXNjcmlwdGlvbi0+dGl0YW5IdENhcHMgPSBsaW1HZXRVMzIoIHBCdWYgKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMzIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vcGFzcyB0aGUgdGltZXN0YW1wCisgICAgcEJzc0Rlc2NyaXB0aW9uLT5uUmVjZWl2ZWRUaW1lID0gbGltR2V0VTMyKCBwQnVmICk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9USU1FU1RBTVApOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9USU1FU1RBTVApOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgLy9UU0Ygd2hlbiB0aGUgYmVhY29uIHJlY2VpdmVkIChwYXJlbnQgVFNGKQorICAgIHBCc3NEZXNjcmlwdGlvbi0+cGFyZW50VFNGID0gbGltR2V0VTMyKCBwQnVmICk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgLy9zdGFydCBUU0Ygb2Ygc2NhbiBkdXJpbmcgd2hpY2ggdGhpcyBCU1MgZGVzYyB3YXMgdXBkYXRlZC4KKyAgICBwQnNzRGVzY3JpcHRpb24tPnN0YXJ0VFNGWzBdID0gbGltR2V0VTMyKCBwQnVmICk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgLy9zdGFydCBUU0Ygb2Ygc2NhbiBkdXJpbmcgd2hpY2ggdGhpcyBCU1MgZGVzYyB3YXMgdXBkYXRlZC4KKyAgICBwQnNzRGVzY3JpcHRpb24tPnN0YXJ0VFNGWzFdID0gbGltR2V0VTMyKCBwQnVmICk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMzIpOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAvLyBNb2JpbGl0eURvbWFpbgorICAgIHBCc3NEZXNjcmlwdGlvbi0+bWRpZVByZXNlbnQgPSAqcEJ1ZisrOworICAgIGxlbiAtLTsKKyAgICBwQnNzRGVzY3JpcHRpb24tPm1kaWVbMF0gPSAqcEJ1ZisrOworICAgIGxlbiAtLTsKKyAgICBwQnNzRGVzY3JpcHRpb24tPm1kaWVbMV0gPSAqcEJ1ZisrOworICAgIGxlbiAtLTsKKyAgICBwQnNzRGVzY3JpcHRpb24tPm1kaWVbMl0gPSAqcEJ1ZisrOworICAgIGxlbiAtLTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIm1kaWU9JTAyeCAlMDJ4ICUwMnhcbiIpLCAKKyAgICAgICAgcEJzc0Rlc2NyaXB0aW9uLT5tZGllWzBdLAorICAgICAgICBwQnNzRGVzY3JpcHRpb24tPm1kaWVbMV0sCisgICAgICAgIHBCc3NEZXNjcmlwdGlvbi0+bWRpZVsyXSk7KQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICBwQnNzRGVzY3JpcHRpb24tPlFCU1NMb2FkX3ByZXNlbnQgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IFFCU1NMb2FkX2F2YWlsCisgICAgcEJzc0Rlc2NyaXB0aW9uLT5RQlNTTG9hZF9hdmFpbCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMTYpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyNlbmRpZgorICAgIAorICAgIGlmIChwQnNzRGVzY3JpcHRpb24tPldzY0llTGVuKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcEJzc0Rlc2NyaXB0aW9uLT5Xc2NJZVByb2JlUnNwLAorICAgICAgICAgICAgICAgICAgICAgICBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICBwQnNzRGVzY3JpcHRpb24tPldzY0llTGVuKTsKKyAgICB9CisgICAgCisgICAgcEJ1ZiArPSAoc2l6ZW9mKHBCc3NEZXNjcmlwdGlvbi0+V3NjSWVQcm9iZVJzcCkgKyAKKyAgICAgICAgICAgICBzaXplb2YocEJzc0Rlc2NyaXB0aW9uLT5Xc2NJZUxlbikgKyAKKyAgICAgICAgICAgICBzaXplb2YocEJzc0Rlc2NyaXB0aW9uLT5mUHJvYmVSc3ApICsgCisgICAgICAgICAgICAgc2l6ZW9mKHRBTklfVTMyKSk7CisgICAgCisgICAgbGVuIC09IChzaXplb2YocEJzc0Rlc2NyaXB0aW9uLT5Xc2NJZVByb2JlUnNwKSArIAorICAgICAgICAgICAgIHNpemVvZihwQnNzRGVzY3JpcHRpb24tPldzY0llTGVuKSArIAorICAgICAgICAgICAgIHNpemVvZihwQnNzRGVzY3JpcHRpb24tPmZQcm9iZVJzcCkgKyAKKyAgICAgICAgICAgICBzaXplb2YodEFOSV9VMzIpKTsKKworICAgIGlmIChsZW4pCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQnNzRGVzY3JpcHRpb24tPmllRmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qKiogZW5kIGxpbUdldEJzc0Rlc2NyaXB0aW9uKCkgKioqLworI2VuZGlmCisKKworCisvKioKKyAqIGxpbUNvcHlCc3NEZXNjcmlwdGlvbigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHZhcmlvdXMgTElNIGZ1bmN0aW9ucyB0byBjb3B5CisgKiBCU1MgZGVzY3JpcHRpb24gdG8gYSB0QU5JX1U4IGJ1ZmZlcgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gICpwQnVmICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0gIHBCc3NEZXNjcmlwdGlvbiAgUG9pbnRlciB0byB0aGUgQnNzRGVzY3JpcHRpb24gYmVpbmcgY29waWVkCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgTGVuZ3RoIG9mIEJTU2Rlc2NyaXB0aW9uIHdyaXR0ZW4KKyAqLworCit0QU5JX1UxNgorbGltQ29weUJzc0Rlc2NyaXB0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBCdWYsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyaXB0aW9uKQoreworICAgIHRBTklfVTE2IGxlbiA9IDA7CisKKyAgICBsaW1Db3B5VTE2KHBCdWYsIHBCc3NEZXNjcmlwdGlvbi0+bGVuZ3RoKTsKKyAgICBwQnVmICAgICAgICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuICAgICAgICArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBCc3NEZXNjcmlwdGlvbi0+YnNzSWQsCisgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwQnVmICAgICAgICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgbGVuICAgICAgICArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsCisgICAgICAgRkwoIkNvcHlpbmcgQlNTZGVzY3I6Y2hhbm5lbCBpcyAlZCwgYW5pSW5kIGlzICVkLCBic3NJZCBpcyAiKSwKKyAgICAgICBwQnNzRGVzY3JpcHRpb24tPmNoYW5uZWxJZCwgcEJzc0Rlc2NyaXB0aW9uLT5hbmlJbmRpY2F0b3IpOworICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwQnNzRGVzY3JpcHRpb24tPmJzc0lkLCBMT0czKTspCisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLAorICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgKCZwQnNzRGVzY3JpcHRpb24tPnNjYW5TeXNUaW1lTXNlYyksCisgICAgICAgICAgICAgICAgICBzaXplb2Yodl9USU1FX3QpKTsKKyAgICBwQnVmICAgICAgICs9IHNpemVvZih2X1RJTUVfdCk7CisgICAgbGVuICAgICAgICArPSBzaXplb2Yodl9USU1FX3QpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwQnNzRGVzY3JpcHRpb24tPnRpbWVTdGFtcFswXSk7CisgICAgcEJ1ZiAgICAgICArPSBzaXplb2YodEFOSV9VMzIpOworICAgIGxlbiAgICAgICAgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcEJzc0Rlc2NyaXB0aW9uLT50aW1lU3RhbXBbMV0pOworICAgIHBCdWYgICAgICAgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBsZW4gICAgICAgICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTE2KHBCdWYsIHBCc3NEZXNjcmlwdGlvbi0+YmVhY29uSW50ZXJ2YWwpOworICAgIHBCdWYgICAgICAgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBsZW4gICAgICAgICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBsaW1Db3B5VTE2KHBCdWYsIHBCc3NEZXNjcmlwdGlvbi0+Y2FwYWJpbGl0eUluZm8pOworICAgIHBCdWYgICAgICAgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBsZW4gICAgICAgICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBCc3NEZXNjcmlwdGlvbi0+bndUeXBlKTsKKyAgICBwQnVmICAgICAgICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgbGVuICAgICAgICArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgKnBCdWYrKyA9IHBCc3NEZXNjcmlwdGlvbi0+YW5pSW5kaWNhdG9yOworICAgIGxlbisrOworCisgICAgKnBCdWYrKyA9IHBCc3NEZXNjcmlwdGlvbi0+cnNzaTsKKyAgICBsZW4rKzsKKworICAgICpwQnVmKysgPSBwQnNzRGVzY3JpcHRpb24tPnNpbnI7CisgICAgbGVuKys7CisKKyAgICAqcEJ1ZisrID0gcEJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQ7CisgICAgbGVuKys7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSAmKHBCc3NEZXNjcmlwdGlvbi0+aWVGaWVsZHMpLAorICAgICAgICAgICAgICAgICAgbGltR2V0SUVsZW5Gcm9tQnNzRGVzY3JpcHRpb24ocEJzc0Rlc2NyaXB0aW9uKSk7CisKKyAgICByZXR1cm4gKGxlbiArIHNpemVvZih0QU5JX1UxNikpOworfSAvKioqIGVuZCBsaW1Db3B5QnNzRGVzY3JpcHRpb24oKSAqKiovCisKKworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisvKioKKyAqIGxpbUNvcHlMb2FkKCkKKyAqCisgKmZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdmFyaW91cyBMSU0gZnVuY3Rpb25zIHRvIGNvcHkKKyAqIGxvYWQgaW5mb3JtYXRpb24gaW50byBhIHRBTklfVTgqIGJ1ZmZlciBwb2ludGVyCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAqcEJ1ZiAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0gbG9hZCAgICAgIGxvYWQgdG8gYmUgY29waWVkIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3N0YXRpYyB2b2lkCitsaW1Db3B5TG9hZCh0QU5JX1U4ICpwQnVmLCB0U2lyTG9hZCBsb2FkKQoreworICAgIGxpbUNvcHlVMTYocEJ1ZiwgbG9hZC5udW1TdGFzKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBsaW1Db3B5VTE2KHBCdWYsIGxvYWQuY2hhbm5lbFV0aWxpemF0aW9uKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7Cit9IC8qKiogZW5kIGxpbUNvcHlMb2FkKCkgKioqLworCisKKworLyoqCisgKiBsaW1HZXRMb2FkKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdmFyaW91cyBMSU0gZnVuY3Rpb25zIHRvIGNvcHkKKyAqIGxvYWQgaW5mb3JtYXRpb24gaW50byBhIHRBTklfVTgqIGJ1ZmZlciBwb2ludGVyCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAqcExvYWQgICAgUG9pbnRlciB0byBsb2FkIGJlaW5nIGNvcGllZCB0bworICogQHBhcmFtICpwQnVmICAgICBQb2ludGVyIHRvIHRoZSBzb3VyY2UgYnVmZmVyCisgKgorICogQHJldHVybiBOb25lCisgKi8KKworc3RhdGljIHZvaWQKK2xpbUdldExvYWQodFNpckxvYWQgKnBMb2FkLCB0QU5JX1U4ICpwQnVmKQoreworICAgIHBMb2FkLT5udW1TdGFzID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIHBMb2FkLT5jaGFubmVsVXRpbGl6YXRpb24gPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworfSAvKioqIGVuZCBsaW1HZXRMb2FkKCkgKioqLworCisKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisvKioKKyAqIGxpbUNvcHlXZHNJbmZvKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdmFyaW91cyBMSU0gZnVuY3Rpb25zIHRvIGNvcHkKKyAqIFdkc0luZm8gaW5mb3JtYXRpb24gaW50byBhIHRBTklfVTgqIGJ1ZmZlciBwb2ludGVyCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgKnBCdWYgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHBhcmFtICB3ZHNJbmZvICAgV2RzSW5mbyB0byBiZSBjb3BpZWQgdG8gZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogQHJldHVybiBMZW5ndGggb2YgV0RTIGluZm8gY29waWVkCisgKi8KKworc3RhdGljIHRBTklfVTE2CitsaW1Db3B5V2RzSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQnVmLCB0cFNpcldkc0luZm8gcFdkc0luZm8pCit7CisgICAgbGltQ29weVUxNihwQnVmLCBwV2RzSW5mby0+d2RzTGVuZ3RoKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSBwV2RzSW5mby0+d2RzQnl0ZXMsIHBXZHNJbmZvLT53ZHNMZW5ndGgpOworICAgIHBCdWYgKz0gcFdkc0luZm8tPndkc0xlbmd0aDsKKworICAgIHJldHVybiAoKHRBTklfVTE2KSAoc2l6ZW9mKHRBTklfVTE2KSArIHBXZHNJbmZvLT53ZHNMZW5ndGgpKTsKK30gLyoqKiBlbmQgbGltQ29weVdkc0luZm8oKSAqKiovCisKKworCisvKioKKyAqIGxpbUdldFdkc0luZm8oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB2YXJpb3VzIExJTSBmdW5jdGlvbnMgdG8gY29weQorICogV2RzSW5mbyBpbmZvcm1hdGlvbiBmcm9tIGEgdEFOSV9VOCogYnVmZmVyIHBvaW50ZXIgdG8gdFNpcldkc0luZm8KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHdkc0luZm8gICBQb2ludGVyIHRvIHRoZSBXZHNJbmZvIHRvIGJlIGNvcGllZAorICogQHBhcmFtICpwQnVmICAgICBQb2ludGVyIHRvIHRoZSBzb3VyY2UgYnVmZmVyCisgKgorICogQHJldHVybiB0cnVlIHdoZW4gV0RTIGluZm8gZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseSBlbHNlIGZhbHNlCisgKi8KKworc3RhdGljIHRBTklfVTgKK2xpbUdldFdkc0luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJXZHNJbmZvIHBXZHNJbmZvLCB0QU5JX1U4ICpwQnVmKQoreworICAgIHBXZHNJbmZvLT53ZHNMZW5ndGggPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgaWYgKHBXZHNJbmZvLT53ZHNMZW5ndGggPiBBTklfV0RTX0lORk9fTUFYX0xFTkdUSCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFdkc0luZm8tPndkc0J5dGVzLCBwQnVmLCBwV2RzSW5mby0+d2RzTGVuZ3RoKTsKKworICAgIHJldHVybiB0cnVlOworfSAvKioqIGVuZCBsaW1HZXRXZHNJbmZvKCkgKioqLworCisKKworLyoqCisgKiBsaW1HZXRBbHRlcm5hdGVSYWRpb0xpc3QoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB2YXJpb3VzIExJTSBmdW5jdGlvbnMgdG8gY29weQorICogYWx0ZXJuYXRlUmFkaW8gaW5mb3JtYXRpb24gZnJvbSBhIHRBTklfVTgqIGJ1ZmZlciBwb2ludGVyIHRvCisgKiB0U2lyQWx0ZXJuYXRlUmFkaW9MaXN0CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcFJhZGlvTGlzdCAgIFBvaW50ZXIgdG8gdGhlIHJhZGlvTGlzdCB0byBiZSBjb3BpZWQKKyAqIEBwYXJhbSAgKnBCdWYgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIGxlbiAgICAgICAgICBMZW5ndGggb2YgY29waWVkIGFsdGVybmF0ZVJhZGlvTGlzdAorICovCisKK3N0YXRpYyB0QU5JX1UxNgorbGltR2V0QWx0ZXJuYXRlUmFkaW9MaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXVsdGlwbGVBbHRlcm5hdGVSYWRpb0luZm8gcFJhZGlvTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmKQoreworICAgIHRBTklfVTggaTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHNpemVvZih0QU5JX1U4KTsKKyAgICB0cFNpckFsdGVybmF0ZVJhZGlvSW5mbyAgICBwUmFkaW9JbmZvOworCisgICAgcFJhZGlvTGlzdC0+bnVtQnNzID0gKnBCdWYrKzsKKworICAgIGlmIChwUmFkaW9MaXN0LT5udW1Cc3MgPiBTSVJfTUFYX05VTV9BTFRFUk5BVEVfUkFESU9TKQorICAgICAgICBwUmFkaW9MaXN0LT5udW1Cc3MgPSBTSVJfTUFYX05VTV9BTFRFUk5BVEVfUkFESU9TOworCisgICAgcFJhZGlvSW5mbyA9IHBSYWRpb0xpc3QtPmFsdGVybmF0ZVJhZGlvOworICAgIGZvciAoaSA9IDA7IGkgPCBwUmFkaW9MaXN0LT5udW1Cc3M7IGkrKykKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBSYWRpb0luZm8tPmJzc0lkLCBwQnVmLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgICAgICBwUmFkaW9JbmZvLT5jaGFubmVsSWQgPSAqcEJ1ZisrOworICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIkFsdGVybmF0ZSByYWRpb1slZF0gY2hhbm5lbElkPSVkLCBCc3NJZCBpcyBcbiIpLAorICAgICAgICAgICAgICAgaSwgcFJhZGlvSW5mby0+Y2hhbm5lbElkKTsKKyAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBSYWRpb0luZm8tPmJzc0lkLCBMT0czKTspCisKKyAgICAgICAgcFJhZGlvSW5mbysrOworICAgICAgICBsZW4gKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKSArIHNpemVvZih0QU5JX1U4KTsKKyAgICB9CisKKyAgICByZXR1cm4gbGVuOworfSAvKioqIGVuZCBsaW1HZXRBbHRlcm5hdGVSYWRpb0xpc3QoKSAqKiovCisjZW5kaWYKKworCisKKy8qKgorICogbGltQ29weU5laWdoYm9yQnNzSW5mbygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHZhcmlvdXMgTElNIGZ1bmN0aW9ucyB0byBjb3B5CisgKiBOZWlnaGJvciBCU1MgaW5mbyBpbnRvIGEgdEFOSV9VOCogYnVmZmVyIHBvaW50ZXIKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICAqcEJ1ZiAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBwYXJhbSAgcEJzc0luZm8gICAgUG9pbnRlciB0byBuZWlnaGJvciBCU1MgaW5mbyBiZSBjb3BpZWQKKyAqICAgICAgICAgICAgICAgICAgICAgdG8gZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogQHJldHVybiBic3NJbmZvTGVuICBMZW5ndGggb2YgYnNzSW5mbyBjb3BpZWQKKyAqLworCit0QU5JX1UzMgorbGltQ29weU5laWdoYm9yQnNzSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQnVmLCB0cFNpck5laWdoYm9yQnNzSW5mbyBwQnNzSW5mbykKK3sKKyAgICB0QU5JX1UzMiBic3NJbmZvTGVuID0gMDsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwQnNzSW5mby0+YnNzSWQsCisgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwQnVmICAgICAgICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgYnNzSW5mb0xlbiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLAorICAgICAgIEZMKCJDb3B5aW5nIG5ldyBOZWlnaGJvcldkcyBub2RlOmNoYW5uZWwgaXMgJWQsIFRJVEFOIEhUIENhcHMgYXJlICUxZCwgd25pSW5kaWNhdG9yIGlzICVkLCBic3NUeXBlIGlzICVkLCBic3NJZCBpcyAiKSwKKyAgICAgICBwQnNzSW5mby0+Y2hhbm5lbElkLCBwQnNzSW5mby0+dGl0YW5IdENhcHMsIHBCc3NJbmZvLT53bmlJbmRpY2F0b3IsCisgICAgICAgcEJzc0luZm8tPmJzc1R5cGUpOworICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwQnNzSW5mby0+YnNzSWQsIExPRzMpOykKKworICAgICpwQnVmKysgPSBwQnNzSW5mby0+Y2hhbm5lbElkOworICAgIGJzc0luZm9MZW4rKzsKKworICAgICpwQnVmKysgPSBwQnNzSW5mby0+dGl0YW5IdENhcHM7CisgICAgYnNzSW5mb0xlbisrOworCisgICAgbGltQ29weVUzMihwQnVmLCBwQnNzSW5mby0+d25pSW5kaWNhdG9yKTsKKyAgICBwQnVmICAgICAgICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgYnNzSW5mb0xlbiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwQnNzSW5mby0+YnNzVHlwZSk7CisgICAgcEJ1ZiAgICAgICArPSBzaXplb2YodEFOSV9VMzIpOworICAgIGJzc0luZm9MZW4gKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgICpwQnVmKysgPSBwQnNzSW5mby0+c2lucjsKKyAgICBic3NJbmZvTGVuKys7CisgICAgKnBCdWYrKyA9IHBCc3NJbmZvLT5yc3NpOworICAgIGJzc0luZm9MZW4rKzsKKworICAgIGxpbUNvcHlMb2FkKHBCdWYsIHBCc3NJbmZvLT5sb2FkKTsKKyAgICBwQnVmICAgICAgICs9IHNpemVvZih0U2lyTG9hZCk7CisgICAgYnNzSW5mb0xlbiArPSBzaXplb2YodFNpckxvYWQpOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgKHRBTklfVTggKikgJihwQnNzSW5mby0+c3NJZCksCisgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+c3NJZC5sZW5ndGggKyAxKTsKKworICAgIGJzc0luZm9MZW4gKz0gcEJzc0luZm8tPnNzSWQubGVuZ3RoICsgMTsKKyAgICBwQnVmICAgICAgICs9IHBCc3NJbmZvLT5zc0lkLmxlbmd0aCArIDE7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSAmKHBCc3NJbmZvLT5hcE5hbWUpLAorICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmFwTmFtZS5sZW5ndGggKyAxKTsKKworICAgIGJzc0luZm9MZW4gKz0gcEJzc0luZm8tPmFwTmFtZS5sZW5ndGggKyAxOworICAgIHBCdWYgICAgICAgKz0gcEJzc0luZm8tPmFwTmFtZS5sZW5ndGggKyAxOworCisgICAgbGltQ29weVUxNihwQnVmLCBwQnNzSW5mby0+cnNuSUUubGVuZ3RoKTsKKyAgICBwQnVmICAgICAgICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgYnNzSW5mb0xlbiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICh0QU5JX1U4ICopICYocEJzc0luZm8tPnJzbklFLnJzbklFZGF0YSksCisgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+cnNuSUUubGVuZ3RoKTsKKworICAgIGJzc0luZm9MZW4gKz0gcEJzc0luZm8tPnJzbklFLmxlbmd0aDsKKyAgICBwQnVmICAgICAgICs9IHBCc3NJbmZvLT5yc25JRS5sZW5ndGg7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBCc3NJbmZvLT5ud1R5cGUpOworICAgIHBCdWYgICAgICAgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBic3NJbmZvTGVuICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICAvLyBub3Qgc3VyZSB3ZSBuZWVkIHRvIGRvIGEgc2lyU3dhcFUxNmlmTmVlZGVkID8/PworICAgIGxpbUNvcHlVMTYocEJ1ZiwgcEJzc0luZm8tPmNhcGFiaWxpdHlJbmZvKTsKKyAgICBwQnVmICAgICAgICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgYnNzSW5mb0xlbiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgKHRBTklfVTggKikgJihwQnNzSW5mby0+b3BlcmF0aW9uYWxSYXRlU2V0KSwKKyAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMgKyAxKTsKKyAgICBic3NJbmZvTGVuICs9IHBCc3NJbmZvLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMgKyAxOworICAgIHBCdWYgICAgICAgKz0gcEJzc0luZm8tPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlcyArIDE7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSAmKHBCc3NJbmZvLT5leHRlbmRlZFJhdGVTZXQpLAorICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlcyArIDEpOworICAgIGJzc0luZm9MZW4gKz0gcEJzc0luZm8tPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlcyArIDE7CisgICAgcEJ1ZiAgICAgICArPSBwQnNzSW5mby0+ZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzICsgMTsKKworICAgIGxpbUNvcHlVMTYocEJ1ZiwgcEJzc0luZm8tPmJlYWNvbkludGVydmFsKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgYnNzSW5mb0xlbiArPSBzaXplb2YodEFOSV9VMTYpOworICAgCisgICAgKnBCdWYrKyA9IHBCc3NJbmZvLT5kdGltUGVyaW9kOworICAgIGJzc0luZm9MZW4rKzsKKyAgICAqcEJ1ZisrID0gcEJzc0luZm8tPkhUQ2Fwc1ByZXNlbnQ7CisgICAgYnNzSW5mb0xlbisrOworICAgICpwQnVmKysgPSBwQnNzSW5mby0+SFRJbmZvUHJlc2VudDsKKyAgICBic3NJbmZvTGVuKys7CisgICAgKnBCdWYrKyA9IHBCc3NJbmZvLT53bWVJbmZvUHJlc2VudDsKKyAgICBic3NJbmZvTGVuKys7CisgICAgKnBCdWYrKyA9IHBCc3NJbmZvLT53bWVFZGNhUHJlc2VudDsKKyAgICBic3NJbmZvTGVuKys7CisgICAgKnBCdWYrKyA9IHBCc3NJbmZvLT53c21DYXBhYmxlUHJlc2VudDsKKyAgICBic3NJbmZvTGVuKys7CisgICAgKnBCdWYrKyA9IHBCc3NJbmZvLT5oY2ZFbmFibGVkOworICAgIGJzc0luZm9MZW4rKzsKKyAgICAKKyAgICBsaW1Db3B5VTE2KHBCdWYsIHBCc3NJbmZvLT5wcm9wSUVDYXBhYmlsaXR5KTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgYnNzSW5mb0xlbiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIAorICAgIGxpbUNvcHlVMzIocEJ1ZiwgcEJzc0luZm8tPmxvY2FsUG93ZXJDb25zdHJhaW50cyk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9TMzIpOworICAgIGJzc0luZm9MZW4gKz0gc2l6ZW9mKHRBTklfUzMyKTsKKyAgICAKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBCc3NJbmZvLT5hZ2dyUnNzaSk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9TMzIpOworICAgIGJzc0luZm9MZW4gKz0gc2l6ZW9mKHRBTklfUzMyKTsKKyAgICAKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBCc3NJbmZvLT5kYXRhQ291bnQpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBic3NJbmZvTGVuICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgCisgICAgbGltQ29weVUzMihwQnVmLCBwQnNzSW5mby0+dG90YWxQYWNrZXRzKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgYnNzSW5mb0xlbiArPSBzaXplb2YodEFOSV9VMzIpOworICAgIAorICAgIHJldHVybiBic3NJbmZvTGVuOworfSAvKioqIGVuZCBsaW1Db3B5TmVpZ2hib3JCc3NJbmZvKCkgKioqLworCisKKy8qKgorICogbGltQ29weU5laWdoYm9yTGlzdCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHZhcmlvdXMgTElNIGZ1bmN0aW9ucyB0byBjb3B5CisgKiBOZWlnaGJvciBCU1MgbGlzdCBpbnRvIGEgdEFOSV9VOCogYnVmZmVyIHBvaW50ZXIKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICpwQnVmICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBwYXJhbSBuZWlnaGJvckxpc3QgICAgTmVpZ2hib3IgQlNTIGxpc3QgYmUgY29waWVkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHBhcmFtIG51bUJzcyAgICAgICAgICBOdW1iZXIgb2YgTmVpZ2hib3IgQlNTIGxpc3QgYmUgY29waWVkCisgKgorICogQHJldHVybiBsaXN0TGVuICAgICAgICBMZW5ndGggb2YgTmVpZ2hib3IgQlNTIGxpc3QKKyAqLworCitzdGF0aWMgdEFOSV9VMzIKK2xpbUNvcHlOZWlnaGJvckxpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcEJ1ZiwgdHBTaXJOZWlnaGJvckJzc0luZm8gcEJzc0luZm8sIHRBTklfVTMyIG51bUJzcykKK3sKKyAgICB0QU5JX1UzMiAgYnNzSW5mb0xlbiA9IDAsIGxpc3RMZW4gPSAwOworICAgIHRBTklfVTggIGk7CisgICAgdEFOSV9VOCAgKnBUZW1wID0gKHRBTklfVTggKikgcEJzc0luZm87CisKKyAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJHb2luZyB0byBjb3B5IEJzc0luZm9MaXN0OlxuIikpOykKKyAgICBQRUxPRzMoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMywKKyAgICAgICAgICAgICAgIHBUZW1wLCBudW1Cc3Mqc2l6ZW9mKHRTaXJOZWlnaGJvckJzc0luZm8pKTspCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQnNzOyBpKyssIGJzc0luZm9MZW4gPSAwKQorICAgIHsKKyAgICAgICAgYnNzSW5mb0xlbiA9IGxpbUNvcHlOZWlnaGJvckJzc0luZm8ocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRwU2lyTmVpZ2hib3JCc3NJbmZvKSAmcEJzc0luZm9baV0pOworCisgICAgICAgIHBCdWYgICAgICs9IGJzc0luZm9MZW47CisgICAgICAgIGxpc3RMZW4gICs9IGJzc0luZm9MZW47CisgICAgfQorCisgICAgcmV0dXJuIGxpc3RMZW47Cit9IC8qKiogZW5kIGxpbUNvcHlOZWlnaGJvckxpc3QocE1hYywgKSAqKiovCisKKworLyoqCisgKiBsaW1HZXROZWlnaGJvckJzc0luZm8oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB2YXJpb3VzIExJTSBmdW5jdGlvbnMgdG8gZ2V0CisgKiBOZWlnaGJvciBCU1MgaW5mbyBmcm9tIGEgdEFOSV9VOCogYnVmZmVyIHBvaW50ZXIKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwQnNzSW5mbyAgICBQb2ludGVyIHRvIG5laWdoYm9yIEJTUyBpbmZvIGJlaW5nIGNvcGllZAorICogQHBhcmFtICAqcEJ1ZiAgICAgICBQb2ludGVyIHRvIHRoZSBzb3VyY2UgYnVmZmVyCisgKgorICogQHJldHVybiBTaXplIG9mIE5laWdoYm9yQnNzSW5mbyB0aGF0IGlzIGV4dHJhY3RlZAorICovCisKK3RBTklfVTMyCitsaW1HZXROZWlnaGJvckJzc0luZm8odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJOZWlnaGJvckJzc0luZm8gcEJzc0luZm8sIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9VMzIgbGVuID0gMDsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBCc3NJbmZvLT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgIHBCdWYsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBsZW4gICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKyAgICBwQnNzSW5mby0+Y2hhbm5lbElkID0gKnBCdWYrKzsKKyAgICBsZW4rKzsKKworICAgIHBCc3NJbmZvLT53bmlJbmRpY2F0b3IgPSAodEFuaUJvb2wpIGxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QW5pQm9vbCk7CisgICAgbGVuICArPSBzaXplb2YodEFuaUJvb2wpOworCisgICAgcEJzc0luZm8tPmJzc1R5cGUgPSAodFNpckJzc1R5cGUpIGxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyQnNzVHlwZSk7CisgICAgbGVuICArPSBzaXplb2YodFNpckJzc1R5cGUpOworCisgICAgcEJzc0luZm8tPnNpbnIgPSAqcEJ1ZisrOworICAgIGxlbisrOworICAgIHBCc3NJbmZvLT5yc3NpID0gKnBCdWYrKzsKKyAgICBsZW4rKzsKKworICAgIGxpbUdldExvYWQoJnBCc3NJbmZvLT5sb2FkLCBwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTG9hZCk7CisgICAgbGVuICArPSBzaXplb2YodFNpckxvYWQpOworCisgICAgcEJzc0luZm8tPnNzSWQubGVuZ3RoID0gKnBCdWYrKzsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnNzSW5mby0+c3NJZC5zc0lkLCBwQnVmLCBwQnNzSW5mby0+c3NJZC5sZW5ndGgpOworICAgIHBCdWYgKz0gcEJzc0luZm8tPnNzSWQubGVuZ3RoOworICAgIGxlbiAgKz0gcEJzc0luZm8tPnNzSWQubGVuZ3RoICsgMTsKKyAgICAKKyAgICBwQnNzSW5mby0+YXBOYW1lLmxlbmd0aCA9ICpwQnVmKys7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJzc0luZm8tPmFwTmFtZS5uYW1lLCBwQnVmLCBwQnNzSW5mby0+YXBOYW1lLmxlbmd0aCk7CisgICAgcEJ1ZiArPSBwQnNzSW5mby0+YXBOYW1lLmxlbmd0aDsKKyAgICBsZW4gICs9IHBCc3NJbmZvLT5hcE5hbWUubGVuZ3RoICsgMTsKKyAgICAKKyAgICBwQnNzSW5mby0+cnNuSUUubGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnNzSW5mby0+cnNuSUUucnNuSUVkYXRhLCBwQnVmLAorICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPnJzbklFLmxlbmd0aCk7CisgICAgcEJ1ZiArPSBwQnNzSW5mby0+cnNuSUUubGVuZ3RoOworICAgIGxlbiAgKz0gcEJzc0luZm8tPnJzbklFLmxlbmd0aCArIDI7CisKKyAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIkJTUyB0eXBlICVkIGNoYW5uZWwgJWQgd25pSW5kICVkIFJTTiBsZW4gJWRcbiIpLAorICAgICAgICAgICBwQnNzSW5mby0+YnNzVHlwZSwgcEJzc0luZm8tPmNoYW5uZWxJZCwgcEJzc0luZm8tPnduaUluZGljYXRvciwKKyAgICAgICAgICAgcEJzc0luZm8tPnJzbklFLmxlbmd0aCk7CisgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBCc3NJbmZvLT5ic3NJZCwgTE9HMik7KQorCisKKyAgICBwQnNzSW5mby0+bndUeXBlID0gKHRTaXJOd1R5cGUpIGxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTndUeXBlKTsKKyAgICBsZW4gICs9IHNpemVvZih0U2lyTndUeXBlKTsKKyAgICAKKyAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eUluZm8gPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIHBCc3NJbmZvLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMgPSAqcEJ1ZisrOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCc3NJbmZvLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZSwgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMpOworICAgIHBCdWYgKz0gcEJzc0luZm8tPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlczsKKyAgICBsZW4gICs9IHBCc3NJbmZvLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMgKyAxOworCisgICAgcEJzc0luZm8tPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlcyA9ICpwQnVmKys7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJzc0luZm8tPmV4dGVuZGVkUmF0ZVNldC5yYXRlLCBwQnVmLAorICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlcyk7CisgICAgcEJ1ZiArPSBwQnNzSW5mby0+ZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzOworICAgIGxlbiAgKz0gcEJzc0luZm8tPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlcyArIDE7CisKKyAgICBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWwgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIHBCc3NJbmZvLT5kdGltUGVyaW9kID0gKnBCdWYrKzsKKyAgICBwQnNzSW5mby0+SFRDYXBzUHJlc2VudCA9ICpwQnVmKys7CisgICAgcEJzc0luZm8tPkhUSW5mb1ByZXNlbnQgPSAqcEJ1ZisrOworICAgIHBCc3NJbmZvLT53bWVJbmZvUHJlc2VudCA9ICpwQnVmKys7CisgICAgcEJzc0luZm8tPndtZUVkY2FQcmVzZW50ID0gKnBCdWYrKzsKKyAgICBwQnNzSW5mby0+d3NtQ2FwYWJsZVByZXNlbnQgPSAqcEJ1ZisrOworICAgIHBCc3NJbmZvLT5oY2ZFbmFibGVkID0gKnBCdWYrKzsKKyAgICBwQnNzSW5mby0+cHJvcElFQ2FwYWJpbGl0eSA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgcEJzc0luZm8tPmxvY2FsUG93ZXJDb25zdHJhaW50cyA9IGxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgbGVuICs9IDEzOworICAgIAorICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgicnNuSUVMZW4gJWQgb3BlclJhdGVMZW4gJWQgZXh0ZW5kUmF0ZUxlbiAlZCB0b3RhbCAlZFxuIiksCisgICAgICAgIHBCc3NJbmZvLT5yc25JRS5sZW5ndGgsIHBCc3NJbmZvLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMsCisgICAgICAgIHBCc3NJbmZvLT5leHRlbmRlZFJhdGVTZXQubnVtUmF0ZXMsIGxlbik7KQorICAgIAorICAgIAorICAgIHJldHVybiBsZW47Cit9IC8qKiogZW5kIGxpbUdldE5laWdoYm9yQnNzSW5mbygpICoqKi8KKworCisKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisvKioKKyAqIGxpbUdldE5laWdoYm9yQnNzTGlzdCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHZhcmlvdXMgTElNIGZ1bmN0aW9ucyB0byBnZXQKKyAqIE5laWdoYm9yIEJTUyBsaXN0IGZyb20gYSB0QU5JX1U4KiBidWZmZXIgcG9pbnRlcgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gICpwTmVpZ2hib3JMaXN0ICAgUG9pbnRlciB0byBuZWlnaGJvciBCU1MgbGlzdCBiZWluZyBjb3BpZWQgdG8KKyAqIEBwYXJhbSAgKnBCdWYgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBzb3VyY2UgYnVmZmVyCisgKiBAcGFyYW0gIHJMZW4gICAgICAgICAgICAgUmVtYWluaW5nIG1lc3NhZ2UgbGVuZ3RoIGJlaW5nIGV4dHJhY3RlZAorICogQHJldHVybiByZXRDb2RlICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGUtc2VyaWFsaXplZCAoZVNJUl9TVUNDRVNTKSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgKGVTSVJfRkFJTFVSRSkuCisgKi8KKworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2xpbUdldE5laWdoYm9yQnNzTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgIHRTaXJOZWlnaGJvckJzc0xpc3QgKnBOZWlnaGJvckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgdEFOSV9TMTYgckxlbiwgdEFOSV9TMTYgKmxlblVzZWQsIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9VOCAgICAgKnBCc3NJbmZvID0gKHRBTklfVTggKikgcE5laWdoYm9yTGlzdC0+YnNzTGlzdDsKKyAgICB0QU5JX1UzMiAgICBpLCBic3NJbmZvTGVuID0gMCwgbGVuID0gMCwgbnVtQnNzLCBudW1Cc3NMaXN0OworCisgICAgbnVtQnNzTGlzdCA9IG51bUJzcyA9IGxpbUdldFUzMihwQnVmKTsKKworICAgIGlmICghbnVtQnNzKQorICAgIHsKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiTm8gTmVpZ2hib3IgQlNTIHByZXNlbnQgaW4gTmVpZ2hib3IgbGlzdFxuIikpOykKKworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwKKyAgICAgICAgICAgRkwoIk51bSBvZiBOZWlnaGJvciBCU1MgcHJlc2VudCBpbiBOZWlnaGJvciBsaXN0IGlzICVkXG4iKSwKKyAgICAgICAgICAgbnVtQnNzKTspCisKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgbGVuICArPSBzaXplb2YodEFOSV9VMzIpOworICAgIHJMZW4gLT0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgckxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRmlyc3QgbmVpZ2hib3JJbmZvIGlzIHRoZSBvbmUgd2UncmUgYXR0ZW1wdGluZyB0byBqb2luL3JlYXNzb2MKKyAgICBic3NJbmZvTGVuID0gbGltR2V0TmVpZ2hib3JCc3NJbmZvKHBNYWMsICh0U2lyTmVpZ2hib3JCc3NJbmZvICopIHBCc3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1Zik7CisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgiQlNTaW5mbyBsZW4gdG8gYmUgam9pbmVkIGlzICVkIHJlbSAlZCwgbnVtQnNzID0gJWRcbiIpLAorICAgICAgICAgICBic3NJbmZvTGVuLCByTGVuLCBudW1Cc3MgLSAxKTspCisgICAgcEJ1ZiAgKz0gYnNzSW5mb0xlbjsKKyAgICBsZW4gICArPSBic3NJbmZvTGVuOworICAgIHJMZW4gIC09ICh0QU5JX1MxNikgYnNzSW5mb0xlbjsKKyAgICBudW1Cc3MtLTsKKyAgICBudW1Cc3NMaXN0LS07CisKKyAgICBpZiAobnVtQnNzID4gMCkKKyAgICB7CisgICAgICAgIC8vIFN0b3JlIHJlbWFpbmluZyBuZWlnaGJvciBCU1MgaW5mbworICAgICAgICBpZiAobnVtQnNzID4gU0lSX01BWF9OVU1fTkVJR0hCT1JfQlNTKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTdG9yZSBvbmx5IE1BWCBudW1iZXIgb2YgTmVpZ2hib3IgQlNTCisgICAgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLAorICAgICAgICAgICAgICAgICAgRkwoIlBydW5pbmcgbnVtYmVyIG9mIG5laWdoYm9ycyB0byAlZCBmcm9tICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgIFNJUl9NQVhfTlVNX05FSUdIQk9SX0JTUywgbnVtQnNzKTspCisgICAgICAgICAgICBudW1Cc3MgPSBTSVJfTUFYX05VTV9ORUlHSEJPUl9CU1M7CisgICAgICAgIH0KKworICAgICAgICBwQnNzSW5mbyA9ICh0QU5JX1U4ICopIHBNYWMtPmxpbS5nTGltTmVpZ2hib3JCc3NMaXN0LmJzc0xpc3Q7CisgICAgICAgIGZvciAoaSA9IG51bUJzczsgaSA+IDA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgicE1hYyA9ICVwLCBwQnNzSW5mbyA9ICVwLCBwQnVmID0gJXBcbiIpLCBwTWFjLCBwQnNzSW5mbywgcEJ1Zik7KQorICAgICAgICAgICAgYnNzSW5mb0xlbiA9IGxpbUdldE5laWdoYm9yQnNzSW5mbyhwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodFNpck5laWdoYm9yQnNzSW5mbyAqKSBwQnNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1Zik7CisKKyAgICAgICAgICAgIHBCc3NJbmZvICs9IHNpemVvZih0U2lyTmVpZ2hib3JCc3NJbmZvKTsKKyAgICAgICAgICAgIHBCdWYgICAgICs9IGJzc0luZm9MZW47CisgICAgICAgICAgICBsZW4gICAgICArPSBic3NJbmZvTGVuOworICAgICAgICAgICAgckxlbiAgICAgLT0gKHRBTklfUzE2KSBic3NJbmZvTGVuOworICAgICAgICAgICAgbnVtQnNzTGlzdC0tOworCisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJCU1MgaW5mb1slZF0gbGVuICVkIHJlbSAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgaSwgYnNzSW5mb0xlbiwgckxlbik7KQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKG51bUJzc0xpc3QgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB0U2lyTmVpZ2hib3JCc3NJbmZvIHBUZW1wOworICAgICAgICAgICAgYnNzSW5mb0xlbiA9IGxpbUdldE5laWdoYm9yQnNzSW5mbyhwTWFjLCAmcFRlbXAsIHBCdWYpOworICAgICAgICAgICAgcEJ1ZiAgICAgKz0gYnNzSW5mb0xlbjsKKyAgICAgICAgICAgIGxlbiAgICAgICs9IGJzc0luZm9MZW47CisgICAgICAgICAgICByTGVuICAgICAtPSAodEFOSV9TMTYpIGJzc0luZm9MZW47CisgICAgICAgICAgICBudW1Cc3NMaXN0LS07CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJCU1MgaW5mb1slZF0gbGVuICVkIHJlbSAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgbnVtQnNzTGlzdCwgYnNzSW5mb0xlbiwgckxlbik7KQorICAgICAgICB9CisgICAgfQorICAgICpsZW5Vc2VkID0gbGVuOworCisgICAgcE1hYy0+bGltLmdMaW1OZWlnaGJvckJzc0xpc3QubnVtQnNzID0gcE5laWdoYm9yTGlzdC0+bnVtQnNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbnVtQnNzOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyoqKiBlbmQgbGltR2V0TmVpZ2hib3JCc3NMaXN0KHBNYWMsICkgKioqLworCisKKworLyoqCisgKiBsaW1Db3B5TmVpZ2hib3JXZHNJbmZvKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdmFyaW91cyBMSU0gZnVuY3Rpb25zIHRvIGNvcHkKKyAqIGRldGVjdGVkIG5laWdoYm9yQnNzV2RzIGluZm8gdG8gYSB0QU5JX1U4IGJ1ZmZlcgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gKnBCdWYgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHBhcmFtICpwSW5mbyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBOZWlnaGJvcldkc0luZm8gYmVpbmcgY29waWVkCisgKiBAcmV0dXJuIExlbmd0aCBvZiBNYXRyaXggaW5mb3JtYXRpb24gY29waWVkCisgKi8KKworc3RhdGljIHRBTklfVTE2CitsaW1Db3B5TmVpZ2hib3JXZHNJbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBCdWYsIHRwU2lyTmVpZ2hib3JCc3NXZHNJbmZvIHBJbmZvKQoreworICAgIHRBTklfVTE2ICAgIGxlbiA9IDA7CisKKyAgICBsZW4gICA9ICh0QU5JX1UxNikgbGltQ29weU5laWdoYm9yQnNzSW5mbyhwTWFjLCBwQnVmLCAmcEluZm8tPm5laWdoYm9yQnNzSW5mbyk7CisgICAgcEJ1ZiArPSBsZW47CisgICAgbGVuICArPSBsaW1Db3B5V2RzSW5mbyhwTWFjLCBwQnVmLCAmcEluZm8tPndkc0luZm8pOworCisgICAgcmV0dXJuIGxlbjsKK30gLyoqKiBlbmQgbGltQ29weU5laWdoYm9yV2RzSW5mbygpICoqKi8KKworCisKKy8qKgorICogbGltQ29weU1lYXNNYXRyaXhJbmZvKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdmFyaW91cyBMSU0gZnVuY3Rpb25zIHRvIGNvcHkKKyAqIGNvbGxlY3RlZCBNZWFzdXJlbWVudCBtYXRyaXggaW5mbyB0byBhIHRBTklfVTggYnVmZmVyCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAqcEJ1ZiAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0gKnBJbmZvICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1hdHJpeCBpbmZvIGJlaW5nIGNvcGllZAorICogQHJldHVybiBMZW5ndGggb2YgTWF0cml4IGluZm9ybWF0aW9uIGNvcGllZAorICovCisKK3N0YXRpYyB0QU5JX1UxNgorbGltQ29weU1lYXNNYXRyaXhJbmZvKHRBTklfVTggKnBCdWYsIHRwTGltTWVhc01hdHJpeE5vZGUgcEluZm8pCit7CisgICAgdEFOSV9VMTYgbGVuID0gMDsKKyAgICAKKyAgICAqcEJ1ZisrID0gcEluZm8tPm1hdHJpeC5jaGFubmVsTnVtYmVyOworICAgIGxlbisrOworICAgICpwQnVmKysgPSBwSW5mby0+bWF0cml4LmNvbXBvc2l0ZVJzc2k7CisgICAgbGVuKys7CisgICAgbGltQ29weVUzMihwQnVmLCBwSW5mby0+bWF0cml4LmFnZ3JSc3NpKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1MzMik7CisgICAgbGVuICs9IHNpemVvZih0QU5JX1MzMik7CisgICAgbGltQ29weVUzMihwQnVmLCBwSW5mby0+bWF0cml4LnRvdGFsUGFja2V0cyk7CisgICAgbGVuICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICByZXR1cm4gbGVuOworfSAvKioqIGVuZCBsaW1Db3B5TWVhc01hdHJpeEluZm8oKSAqKiovCisKKworCisvKioKKyAqIGxpbUNvcHlNZWFzTWF0cml4TGlzdCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHZhcmlvdXMgTElNIGZ1bmN0aW9ucyB0byBjb3B5CisgKiBjb2xsZWN0ZWQgTWVhc3VyZW1lbnQgbWF0cml4IExpc3QgdG8gYSB0QU5JX1U4IGJ1ZmZlcgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICAqcEJ1ZiAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHJldHVybiBMZW5ndGggb2YgbWF0cml4IGxpc3QgY29waWVkCisgKi8KKworc3RhdGljIHRBTklfVTE2CitsaW1Db3B5TWVhc01hdHJpeExpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICB0QU5JX1UxNiAgICBsZW4gPSAwLCBub2RlTGVuID0gMDsKKyAgICB0QU5JX1U4ICAgICBudW1Ob2RlcyA9IHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5udW1NYXRyaXhOb2RlczsKKworICAgICpwQnVmKysgPSBudW1Ob2RlczsKKyAgICBsZW4rKzsKKworICAgIGlmIChudW1Ob2RlcykKKyAgICB7CisgICAgICAgIHRwTGltTWVhc01hdHJpeE5vZGUgcEluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5wTWVhc01hdHJpeEluZm87CisgICAgICAgIHdoaWxlIChudW1Ob2Rlcy0tICYmIHBJbmZvKSAvL1NhZmV0eSBtZWFzdXJlLCBjaGVja2luZyBib3RoCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vZGVMZW4gPSBsaW1Db3B5TWVhc01hdHJpeEluZm8ocEJ1ZiwgcEluZm8pOworICAgICAgICAgICAgcEJ1ZiAgICs9IG5vZGVMZW47CisgICAgICAgICAgICBsZW4gICAgKz0gbm9kZUxlbjsKKworICAgICAgICAgICAgaWYgKHBJbmZvLT5uZXh0KQorICAgICAgICAgICAgICAgIHBJbmZvID0gcEluZm8tPm5leHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcEJ1ZiA9IDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30gLyoqKiBlbmQgbGltQ29weU1lYXNNYXRyaXhMaXN0KCkgKioqLworCisKKworLyoqCisgKiBsaW1Db3B5TmVpZ2hib3JXZHNMaXN0KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdmFyaW91cyBMSU0gZnVuY3Rpb25zIHRvIGNvcHkKKyAqIGRldGVjdGVkIG5laWdoYm9yQnNzV2RzIExpc3QgdG8gYSB0QU5JX1U4IGJ1ZmZlcgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgKnBCdWYgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcmV0dXJuIExlbmd0aCBvZiBtYXRyaXggbGlzdCBjb3BpZWQKKyAqLworCitzdGF0aWMgdEFOSV9VMTYKK2xpbUNvcHlOZWlnaGJvcldkc0xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICB0QU5JX1UxNiAgICBsZW4gPSAwLCBub2RlTGVuID0gMDsKKworICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+bnVtQnNzV2RzKQorICAgIHsKKyAgICAgICAgbGltQ29weVUzMihwQnVmLCBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+bnVtQnNzV2RzKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgICAgICBsZW4gICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICAgICAgdHBMaW1OZWlnaGJvckJzc1dkc05vZGUgcEluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPnBOZWlnaGJvcldkc0luZm87CisgICAgICAgIHdoaWxlIChwSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgbm9kZUxlbiA9IGxpbUNvcHlOZWlnaGJvcldkc0luZm8ocE1hYywgcEJ1ZiwgJnBJbmZvLT5pbmZvKTsKKyAgICAgICAgICAgIHBCdWYgICArPSBub2RlTGVuOworICAgICAgICAgICAgbGVuICAgICs9IG5vZGVMZW47CisKKyAgICAgICAgICAgIGlmIChwSW5mby0+bmV4dCkKKyAgICAgICAgICAgICAgICBwSW5mbyA9IHBJbmZvLT5uZXh0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGltQ29weVUzMihwQnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIChzaXplb2YodEFOSV9VMzIpKTsKKyAgICB9Cit9IC8qKiogZW5kIGxpbUNvcHlOZWlnaGJvcldkc0xpc3QoKSAqKiovCisjZW5kaWYKKyNlbmRpZgorCisKKy8qKgorICogbGltR2V0S2V5c0luZm8oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB2YXJpb3VzIExJTSBmdW5jdGlvbnMgdG8gY29weQorICoga2V5IGluZm9ybWF0aW9uIGZyb20gYSB0QU5JX1U4KiBidWZmZXIgcG9pbnRlciB0byB0U2lyS2V5cworICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gKnBLZXlJbmZvICAgUG9pbnRlciB0byB0aGUga2V5SW5mbyB0byBiZSBjb3BpZWQKKyAqIEBwYXJhbSAqcEJ1ZiAgICAgICBQb2ludGVyIHRvIHRoZSBzb3VyY2UgYnVmZmVyCisgKgorICogQHJldHVybiBMZW5ndGggb2Yga2V5IGluZm8gZXh0cmFjdGVkCisgKi8KKworc3RhdGljIHRBTklfVTMyCitsaW1HZXRLZXlzSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpcktleXMgcEtleUluZm8sIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9VMzIgbGVuID0gMDsKKworICAgIHBLZXlJbmZvLT5rZXlJZCAgICAgICAgPSAqcEJ1ZisrOworICAgIGxlbisrOworICAgIHBLZXlJbmZvLT51bmljYXN0ICAgICAgPSAqcEJ1ZisrOworICAgIGxlbisrOworICAgIHBLZXlJbmZvLT5rZXlEaXJlY3Rpb24gPSAodEFuaUtleURpcmVjdGlvbikgbGltR2V0VTMyKHBCdWYpOworICAgIGxlbiAgKz0gc2l6ZW9mKHRBbmlLZXlEaXJlY3Rpb24pOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlLZXlEaXJlY3Rpb24pOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEtleUluZm8tPmtleVJzYywgcEJ1ZiwgV0xBTl9NQVhfS0VZX1JTQ19MRU4pOworICAgIHBCdWYgKz0gV0xBTl9NQVhfS0VZX1JTQ19MRU47CisgICAgbGVuICArPSBXTEFOX01BWF9LRVlfUlNDX0xFTjsKKworICAgIHBLZXlJbmZvLT5wYWVSb2xlICAgICAgPSAqcEJ1ZisrOworICAgIGxlbisrOworCisgICAgcEtleUluZm8tPmtleUxlbmd0aCAgICA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuICArPSBzaXplb2YodEFOSV9VMTYpOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBLZXlJbmZvLT5rZXksIHBCdWYsIHBLZXlJbmZvLT5rZXlMZW5ndGgpOworICAgIHBCdWYgKz0gcEtleUluZm8tPmtleUxlbmd0aDsKKyAgICBsZW4gICs9IHBLZXlJbmZvLT5rZXlMZW5ndGg7CisKKyAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywKKyAgICAgICAgICAgRkwoIkV4dHJhY3RlZCBrZXlJZD0lZCwga2V5TGVuZ3RoPSVkLCBLZXkgaXMgOlxuIiksCisgICAgICAgICAgIHBLZXlJbmZvLT5rZXlJZCwgcEtleUluZm8tPmtleUxlbmd0aCk7CisgICAgc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMywKKyAgICAgICAgICAgICAgIHBLZXlJbmZvLT5rZXksIHBLZXlJbmZvLT5rZXlMZW5ndGgpOykKKworICAgIHJldHVybiBsZW47Cit9IC8qKiogZW5kIGxpbUdldEtleXNJbmZvKCkgKioqLworCisKKworLyoqCisgKiBsaW1TdGFydEJzc1JlcVNlckRlcygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVNZXNzYWdlcygpIHVwb24gcmVjZWl2aW5nCisgKiBTTUVfU1RBUlRfQlNTX1JFUSBmcm9tIGhvc3QKKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwU3RhcnRCc3NSZXEgIFBvaW50ZXIgdG8gdFNpclNtZVN0YXJ0QnNzUmVxIGJlaW5nIGV4dHJhY3RlZAorICogQHBhcmFtICBwQnVmICAgICAgICAgIFBvaW50ZXIgdG8gc2VyaWFsaXplZCBidWZmZXIKKyAqIEByZXR1cm4gcmV0Q29kZSAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgICAgICAgICAgICAgIGRlLXNlcmlhbGl6ZWQgKGVTSVJfU1VDQ0VTUykgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICBub3QgKGVTSVJfRkFJTFVSRSkKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1TdGFydEJzc1JlcVNlckRlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZVN0YXJ0QnNzUmVxIHBTdGFydEJzc1JlcSwgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICB0QU5JX1MxNiBsZW4gPSAwOworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgdEFOSV9VOCBpOworI2VuZGlmCisKKyNpZmRlZiBQRV9ERUJVR19MT0cxCisgICAgdEFOSV9VOCAgKnBUZW1wID0gcEJ1ZjsKKyNlbmRpZgorCisgICAgaWYgKCFwU3RhcnRCc3NSZXEgfHwgIXBCdWYpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBwU3RhcnRCc3NSZXEtPm1lc3NhZ2VUeXBlID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGxlbiA9IHBTdGFydEJzc1JlcS0+bGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNNRV9TVEFSVF9CU1NfUkVRIGxlbmd0aCAlZCBieXRlcyBpczpcbiIpLCBsZW4pOykKKyAgICBQRUxPRzEoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMSwgcFRlbXAsIGxlbik7KQorCisgICAgaWYgKGxlbiA8ICh0QU5JX1MxNikgc2l6ZW9mKHRBTklfVTMyKSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMzIpOyAvLyBza2lwIG1lc3NhZ2UgaGVhZGVyCisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBzZXNzaW9uSWQKKyAgICBwU3RhcnRCc3NSZXEtPnNlc3Npb25JZCA9ICpwQnVmKys7CisgICAgbGVuLS07CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCB0cmFuc2FjdGlvbklkCisgICAgcFN0YXJ0QnNzUmVxLT50cmFuc2FjdGlvbklkID0gbGltR2V0VTE2KCBwQnVmICk7CisgICAgcEJ1ZiArPSBzaXplb2YoIHRBTklfVTE2ICk7CisgICAgbGVuIC09IHNpemVvZiggdEFOSV9VMTYgKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IGJzc0lkCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcFN0YXJ0QnNzUmVxLT5ic3NJZCwgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHNlbGZNYWNBZGRyCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcFN0YXJ0QnNzUmVxLT5zZWxmTWFjQWRkciwgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IGJlYWNvbkludGVydmFsCisgICAgcFN0YXJ0QnNzUmVxLT5iZWFjb25JbnRlcnZhbCA9IGxpbUdldFUxNiggcEJ1ZiApOworICAgIHBCdWYgKz0gc2l6ZW9mKCB0QU5JX1UxNiApOworICAgIGxlbiAtPSBzaXplb2YoIHRBTklfVTE2ICk7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBkb3QxMU1vZGUKKyAgICBwU3RhcnRCc3NSZXEtPmRvdDExbW9kZSA9ICpwQnVmKys7CisgICAgbGVuIC0tOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgYnNzVHlwZQorICAgIHBTdGFydEJzc1JlcS0+YnNzVHlwZSA9ICh0U2lyQnNzVHlwZSkgbGltR2V0VTMyKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBsZW4gIC09IHNpemVvZih0QU5JX1UzMik7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBzc0lkCisgICAgaWYgKCpwQnVmID4gU0lSX01BQ19NQVhfU1NJRF9MRU5HVEgpCisgICAgeworICAgICAgICAvLyBTU0lEIGxlbmd0aCBpcyBtb3JlIHRoYW4gbWF4IGFsbG93ZWQgMzIgYnl0ZXMKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiSW52YWxpZCBTU0lEIGxlbmd0aCwgbGVuPSVkXG4iKSwgKnBCdWYpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwU3RhcnRCc3NSZXEtPnNzSWQubGVuZ3RoID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAobGVuIDwgcFN0YXJ0QnNzUmVxLT5zc0lkLmxlbmd0aCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICBGTCgiU1NJRCBsZW5ndGggaXMgbG9uZ2VyIHRoYXQgdGhlIHJlbWFpbmluZyBsZW5ndGguIFNTSUQgbGVuPSVkLCByZW1haW5pbmcgbGVuPSVkXG4iKSwKKyAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5zc0lkLmxlbmd0aCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwU3RhcnRCc3NSZXEtPnNzSWQuc3NJZCwKKyAgICAgICAgICAgICAgICAgIHBCdWYsCisgICAgICAgICAgICAgICAgICBwU3RhcnRCc3NSZXEtPnNzSWQubGVuZ3RoKTsKKyAgICBwQnVmICs9IHBTdGFydEJzc1JlcS0+c3NJZC5sZW5ndGg7CisgICAgbGVuICAtPSBwU3RhcnRCc3NSZXEtPnNzSWQubGVuZ3RoOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgY2hhbm5lbElkCisgICAgcFN0YXJ0QnNzUmVxLT5jaGFubmVsSWQgPSAqcEJ1ZisrOworICAgIGxlbi0tOworCisgICAgLy8gRXh0cmFjdCBDQiBzZWNvbmRhcnkgY2hhbm5lbCBpbmZvCisgICAgcFN0YXJ0QnNzUmVxLT5jYk1vZGUgPSAodEFuaUNCU2Vjb25kYXJ5TW9kZSlsaW1HZXRVMzIoIHBCdWYgKTsKKyAgICBwQnVmICs9IHNpemVvZiggdEFOSV9VMzIgKTsKKyAgICBsZW4gLT0gc2l6ZW9mKCB0QU5JX1UzMiApOworCisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkKKyAgICB0QU5JX1UxNiBwYXJhbUxlbiA9IDA7CisKKyAgICAvLyBFeHRyYWN0IGFsdGVybmF0ZVJhZGlvTGlzdAorICAgIHBTdGFydEJzc1JlcS0+YWx0ZXJuYXRlUmFkaW9MaXN0Lm51bUJzcyA9ICpwQnVmOworICAgIHBhcmFtTGVuID0gbGltR2V0QWx0ZXJuYXRlUmFkaW9MaXN0KHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcE1hYy0+bGltLmdMaW1BbHRlcm5hdGVSYWRpb0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmKTsKKyAgICBwQnVmICs9IHBhcmFtTGVuOworICAgIGxlbiAgLT0gcGFyYW1MZW47CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBwb3dlckxldmVsCisgICAgcFN0YXJ0QnNzUmVxLT5wb3dlckxldmVsID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHdkc0luZm8KKyAgICBpZiAobGltR2V0V2RzSW5mbyhwTWFjLCAmcFN0YXJ0QnNzUmVxLT53ZHNJbmZvLCBwQnVmKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiSW52YWxpZCBXRFMgbGVuZ3RoICVkIGluIFNNRV9TVEFSVF9CU1NfUkVRXG4iKSwKKyAgICAgICAgICAgICAgIHBTdGFydEJzc1JlcS0+d2RzSW5mby53ZHNMZW5ndGgpOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KSArIHBTdGFydEJzc1JlcS0+d2RzSW5mby53ZHNMZW5ndGg7CisgICAgbGVuICAtPSAoc2l6ZW9mKHRBTklfVTE2KSArIHBTdGFydEJzc1JlcS0+d2RzSW5mby53ZHNMZW5ndGgpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIC8vIEV4dHJhY3QgcHJpdmFjeSBzZXR0aW5nCisgICAgcFN0YXJ0QnNzUmVxLT5wcml2YWN5ID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvL0V4dHJhY3QgVWFwc2QgRW5hYmxlIAorICAgIHBTdGFydEJzc1JlcS0+YXBVYXBzZEVuYWJsZSA9ICpwQnVmKys7CisgICAgbGVuLS07CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy9FeHRyYWN0IFNTSUQgaGlkZGVuCisgICAgcFN0YXJ0QnNzUmVxLT5zc2lkSGlkZGVuID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBwU3RhcnRCc3NSZXEtPmZ3ZFdQU1BCQ1Byb2JlUmVxID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgCisgICAgLy9FeHRyYWN0IEhUIFByb3RlY3Rpb24gRW5hYmxlIAorICAgIHBTdGFydEJzc1JlcS0+cHJvdEVuYWJsZWQgPSAqcEJ1ZisrOworICAgIGxlbi0tOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy9FeHRyYWN0IE9CU1MgUHJvdGVjdGlvbiBFbmFibGUgCisgICAgcFN0YXJ0QnNzUmVxLT5vYnNzUHJvdEVuYWJsZWQgPSAqcEJ1ZisrOworICAgIGxlbi0tOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcFN0YXJ0QnNzUmVxLT5odF9jYXBhYiA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMTYpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgQXV0aFR5cGUKKyAgICBwU3RhcnRCc3NSZXEtPmF1dGhUeXBlID0gKHRTaXJCc3NUeXBlKSBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IGR0aW1QZXJpb2QKKyAgICBwU3RhcnRCc3NSZXEtPmR0aW1QZXJpb2QgPSBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHdwcyBzdGF0ZQorICAgIHBTdGFydEJzc1JlcS0+d3BzX3N0YXRlID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyNlbmRpZgorICAgIC8vIEV4dHJhY3QgYnNzUGVyc29uYQorICAgIHBTdGFydEJzc1JlcS0+YnNzUGVyc29uYSA9ICpwQnVmKys7CisgICAgbGVuLS07CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCByc25JZQorICAgIHBTdGFydEJzc1JlcS0+cnNuSUUubGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIC8vIENoZWNrIGZvciBSU04gSUUgbGVuZ3RoICh0aGF0IGluY2x1ZGVzIGxlbmd0aCBvZiB0eXBlICYgbGVuZ3RoCisgICAgaWYgKHBTdGFydEJzc1JlcS0+cnNuSUUubGVuZ3RoID4gU0lSX01BQ19NQVhfSUVfTEVOR1RIICsgMikKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgRkwoIkludmFsaWQgUlNOIElFIGxlbmd0aCAlZCBpbiBTTUVfU1RBUlRfQlNTX1JFUVxuIiksCisgICAgICAgICAgICAgICBwU3RhcnRCc3NSZXEtPnJzbklFLmxlbmd0aCk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFN0YXJ0QnNzUmVxLT5yc25JRS5yc25JRWRhdGEsCisgICAgICAgICAgICAgICAgICBwQnVmLCBwU3RhcnRCc3NSZXEtPnJzbklFLmxlbmd0aCk7CisKKyAgICBsZW4gIC09IChzaXplb2YodEFOSV9VMTYpICsgcFN0YXJ0QnNzUmVxLT5yc25JRS5sZW5ndGgpOworICAgIHBCdWYgKz0gcFN0YXJ0QnNzUmVxLT5yc25JRS5sZW5ndGg7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBud1R5cGUKKyAgICBwU3RhcnRCc3NSZXEtPm53VHlwZSA9ICh0U2lyTndUeXBlKSBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck53VHlwZSk7CisgICAgbGVuICAtPSBzaXplb2YodFNpck53VHlwZSk7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBvcGVyYXRpb25hbFJhdGVTZXQKKyAgICBwU3RhcnRCc3NSZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlcyA9ICpwQnVmKys7CisKKyAgICAvLyBDaGVjayBmb3IgbnVtYmVyIG9mIHJhdGVzCisgICAgaWYgKHBTdGFydEJzc1JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID4KKyAgICAgICAgU0lSX01BQ19NQVhfTlVNQkVSX09GX1JBVEVTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJJbnZhbGlkIG51bVJhdGVzICVkIGluIFNNRV9TVEFSVF9CU1NfUkVRXG4iKSwKKyAgICAgICAgICAgICAgIHBTdGFydEJzc1JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBsZW4tLTsKKyAgICBpZiAobGVuIDwgcFN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwU3RhcnRCc3NSZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlLAorICAgICAgICAgICAgICAgICAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgIHBTdGFydEJzc1JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzKTsKKyAgICBwQnVmICs9IHBTdGFydEJzc1JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzOworICAgIGxlbiAgLT0gcFN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXM7CisKKyAgICAvLyBFeHRyYWN0IGV4dGVuZGVkUmF0ZVNldAorICAgIGlmICgocFN0YXJ0QnNzUmVxLT5ud1R5cGUgPT0gZVNJUl8xMUdfTldfVFlQRSkgfHwKKyAgICAgICAgKHBTdGFydEJzc1JlcS0+bndUeXBlID09IGVTSVJfMTFOX05XX1RZUEUgKSkKKyAgICB7CisgICAgICAgIHBTdGFydEJzc1JlcS0+ZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzID0gKnBCdWYrKzsKKyAgICAgICAgbGVuLS07CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTdGFydEJzc1JlcS0+ZXh0ZW5kZWRSYXRlU2V0LnJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHBCdWYsIHBTdGFydEJzc1JlcS0+ZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzKTsKKyAgICAgICAgcEJ1ZiArPSBwU3RhcnRCc3NSZXEtPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlczsKKyAgICAgICAgbGVuICAtPSBwU3RhcnRCc3NSZXEtPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlczsKKyAgICB9CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgICAgICBsaW1Mb2cocE1hYywKKyAgICAgICAgICAgICAgIExPR1csCisgICAgICAgICAgICAgICBGTCgiR29pbmcgdG8gcGFyc2UgbnVtU1NJRCAgaW4gdGhlIFNUQVJUX0JTU19SRVEsIGxlbj0lZFxuIiksIGxlbik7CisgICAgaWYgKGxlbiA8IDIpCisgICAgeworICAgICAgICAvLyBObyBudW1TU0lEIHBhcmFtZXRlciBpbiB0aGUgU1RBUlRfQlNTX1JFUQorICAgICAgICBsaW1Mb2cocE1hYywKKyAgICAgICAgICAgICAgIExPR1csCisgICAgICAgICAgICAgICBGTCgiTm8gbnVtU1NJRCAgaW4gdGhlIFNUQVJUX0JTU19SRVEsIGxlbj0lZFxuIiksIGxlbik7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gRXh0cmFjdCBudW1TU0lECisgICAgcFN0YXJ0QnNzUmVxLT5udW1TU0lEID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKworICAgIC8vIEV4dHJhY3Qgc3NJZExpc3RbXQorICAgIGZvciAoaSA9IDA7IChpIDwgcFN0YXJ0QnNzUmVxLT5udW1TU0lEKSAmJiBsZW47IGkrKykKKyAgICB7CisgICAgICAgIHBTdGFydEJzc1JlcS0+c3NJZExpc3RbaV0ubGVuZ3RoID0gKnBCdWYrKzsKKyAgICAgICAgbGVuLS07CisgICAgICAgIGlmIChsZW4gPCBwU3RhcnRCc3NSZXEtPnNzSWRMaXN0W2ldLmxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICBGTCgiU1NJRCBsZW5ndGhbJWRdIGlzIG1vcmUgdGhhbiB0aGUgcmVtIGxlbmd0aFslZF1cbiIpLAorICAgICAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5zc0lkTGlzdFtpXS5sZW5ndGgsIGxlbik7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTdGFydEJzc1JlcS0+c3NJZExpc3RbaV0ubGVuZ3RoID4gU0lSX01BQ19NQVhfU1NJRF9MRU5HVEgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNTSUQgbGVuZ3RoIGlzIG1vcmUgdGhhbiBtYXggYWxsb3dlZCAzMiBieXRlcworICAgICAgICAgICAgbGltTG9nKHBNYWMsCisgICAgICAgICAgICAgICAgICAgTE9HVywKKyAgICAgICAgICAgICAgICAgICBGTCgiSW52YWxpZCBTU0lEIGxlbmd0aCBpbiB0aGUgbGlzdCwgbGVuPSVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwU3RhcnRCc3NSZXEtPnNzSWRMaXN0W2ldLmxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcFN0YXJ0QnNzUmVxLT5zc0lkTGlzdFtpXS5zc0lkLAorICAgICAgICAgICAgICAgICAgICAgIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5zc0lkTGlzdFtpXS5sZW5ndGgpOworICAgICAgICBwQnVmICs9IHBTdGFydEJzc1JlcS0+c3NJZExpc3RbaV0ubGVuZ3RoOworICAgICAgICBsZW4gIC09IHBTdGFydEJzc1JlcS0+c3NJZExpc3RbaV0ubGVuZ3RoOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGxlbikKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiRXh0cmEgYnl0ZXMgbGVmdCBpbiBTTUVfU1RBUlRfQlNTX1JFUSwgbGVuPSVkXG4iKSwgbGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqIGVuZCBsaW1TdGFydEJzc1JlcVNlckRlcygpICoqKi8KKworCisKKy8qKgorICogbGltU3RvcEJzc1JlcVNlckRlcygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVNZXNzYWdlcygpIHVwb24gcmVjZWl2aW5nCisgKiBTTUVfU1RPUF9CU1NfUkVRIGZyb20gaG9zdAorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBTdG9wQnNzUmVxICAgUG9pbnRlciB0byB0U2lyU21lU3RvcEJzc1JlcSBiZWluZyBleHRyYWN0ZWQKKyAqIEBwYXJhbSAgcEJ1ZiAgICAgICAgICBQb2ludGVyIHRvIHNlcmlhbGl6ZWQgYnVmZmVyCisgKiBAcmV0dXJuIHJldENvZGUgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICBkZS1zZXJpYWxpemVkIChlU0lSX1NVQ0NFU1MpIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgbm90IChlU0lSX0ZBSUxVUkUpCisgKi8KKwordFNpclJldFN0YXR1cworbGltU3RvcEJzc1JlcVNlckRlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZVN0b3BCc3NSZXEgcFN0b3BCc3NSZXEsIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9TMTYgbGVuID0gMDsKKworI2lmZGVmIFBFX0RFQlVHX0xPRzEKKyAgICB0QU5JX1U4ICAqcFRlbXAgPSBwQnVmOworI2VuZGlmCisKKyAgICBwU3RvcEJzc1JlcS0+bWVzc2FnZVR5cGUgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgbGVuID0gcFN0b3BCc3NSZXEtPmxlbmd0aCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUVfU1RPUF9CU1NfUkVRIGxlbmd0aCAlZCBieXRlcyBpczpcbiIpLCBsZW4pOykKKyAgICBQRUxPRzEoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMSwgcFRlbXAsIGxlbik7KQorCisgICAgaWYgKGxlbiA8ICh0QU5JX1MxNikgc2l6ZW9mKHRBTklfVTMyKSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMzIpOyAvLyBza2lwIG1lc3NhZ2UgaGVhZGVyCisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBzZXNzaW9uSWQKKyAgICBwU3RvcEJzc1JlcS0+c2Vzc2lvbklkID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHRyYW5zYWN0aW9uSWQKKyAgICBwU3RvcEJzc1JlcS0+dHJhbnNhY3Rpb25JZCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuIC09IHNpemVvZih0QU5JX1UxNik7IAorCisgICAgLy8gRXh0cmFjdCByZWFzb25Db2RlCisgICAgcFN0b3BCc3NSZXEtPnJlYXNvbkNvZGUgPSAodFNpclJlc3VsdENvZGVzKSBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpclJlc3VsdENvZGVzKTsKKyAgICBsZW4gLT0gc2l6ZW9mKHRTaXJSZXN1bHRDb2Rlcyk7CisKKyAgICAvLyBFeHRyYWN0IGJzc0lkCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcFN0b3BCc3NSZXEtPmJzc0lkLCBwQnVmLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBsZW4gIC09IHNpemVvZih0U2lyTWFjQWRkcik7CisgIAorICAgIGlmIChsZW4pCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qKiogZW5kIGxpbVN0b3BCc3NSZXFTZXJEZXMoKSAqKiovCisKKworCisvKioKKyAqIGxpbUpvaW5SZXFTZXJEZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lTWVzc2FnZXMoKSB1cG9uIHJlY2VpdmluZworICogU01FX0pPSU5fUkVRIGZyb20gaG9zdAorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBKb2luUmVxICBQb2ludGVyIHRvIHRTaXJTbWVKb2luUmVxIGJlaW5nIGV4dHJhY3RlZAorICogQHBhcmFtICBwQnVmICAgICAgUG9pbnRlciB0byBzZXJpYWxpemVkIGJ1ZmZlcgorICogQHJldHVybiByZXRDb2RlICAgSW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgIGRlLXNlcmlhbGl6ZWQgKGVTSVJfU1VDQ0VTUykgb3IKKyAqICAgICAgICAgICAgICAgICAgIG5vdCAoZVNJUl9GQUlMVVJFKQorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbUpvaW5SZXFTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVKb2luUmVxIHBKb2luUmVxLCB0QU5JX1U4ICpwQnVmKQoreworICAgIHRBTklfUzE2IGxlbiA9IDA7CisgICAgdEFOSV9TMTYgbGVuVXNlZCA9IDA7CisKKyNpZmRlZiBQRV9ERUJVR19MT0cxCisgICAgIHRBTklfVTggICpwVGVtcCA9IHBCdWY7CisjZW5kaWYKKworICAgIGlmICghcEpvaW5SZXEgfHwgIXBCdWYpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJOVUxMIHB0ciByZWNlaXZlZFxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBFeHRyYWN0IG1lc3NhZ2VUeXBlCisgICAgcEpvaW5SZXEtPm1lc3NhZ2VUeXBlID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIC8vIEV4dHJhY3QgbGVuZ3RoCisgICAgbGVuID0gcEpvaW5SZXEtPmxlbmd0aCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBpZiAocEpvaW5SZXEtPm1lc3NhZ2VUeXBlID09IGVXTklfU01FX0pPSU5fUkVRKQorICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzMsIEZMKCJTTUVfSk9JTl9SRVEgbGVuZ3RoICVkIGJ5dGVzIGlzOlxuIiksIGxlbik7KQorICAgIGVsc2UKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiU01FX1JFQVNTT0NfUkVRIGxlbmd0aCAlZCBieXRlcyBpczpcbiIpLCBsZW4pOykKKworICAgIFBFTE9HMShzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0czLCBwVGVtcCwgbGVuKTspCisKKyAgICBpZiAobGVuIDwgKHRBTklfUzE2KSBzaXplb2YodEFOSV9VMzIpKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgibGVuIHRvbyBzaG9ydCAlZFxuIiksIGxlbik7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMzIpOyAvLyBza2lwIG1lc3NhZ2UgaGVhZGVyCisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBzZXNzaW9uSWQKKyAgICBwSm9pblJlcS0+c2Vzc2lvbklkID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHRyYW5zYWN0aW9uSWQKKyAgICBwSm9pblJlcS0+dHJhbnNhY3Rpb25JZCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMTYpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3Qgc3NJZAorICAgIHBKb2luUmVxLT5zc0lkLmxlbmd0aCA9ICpwQnVmKys7CisgICAgbGVuLS07CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcEpvaW5SZXEtPnNzSWQuc3NJZCwgcEJ1ZiwgcEpvaW5SZXEtPnNzSWQubGVuZ3RoKTsKKyAgICBwQnVmICs9IHBKb2luUmVxLT5zc0lkLmxlbmd0aDsKKyAgICBsZW4gLT0gcEpvaW5SZXEtPnNzSWQubGVuZ3RoOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3Qgc2VsZk1hY0FkZHIKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwSm9pblJlcS0+c2VsZk1hY0FkZHIsIHBCdWYsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBsZW4gLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IGJzc3R5cGUKKyAgICBwSm9pblJlcS0+YnNzdHlwZSA9ICh0U2lyQnNzVHlwZSkgbGltR2V0VTMyKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBsZW4gIC09IHNpemVvZih0QU5JX1UzMik7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBkb3QxMW1vZGUKKyAgICBwSm9pblJlcS0+ZG90MTFtb2RlPSAqcEJ1ZisrOworICAgIGxlbi0tOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgYnNzUGVyc29uYQorICAgIHBKb2luUmVxLT5zdGFQZXJzb25hID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHVhcHNkUGVyQWNCaXRtYXNrCisgICAgcEpvaW5SZXEtPnVhcHNkUGVyQWNCaXRtYXNrID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICAvLyBFeHRyYWN0IGFzc29jVHlwZQorICAgIHBKb2luUmVxLT5hc3NvY1R5cGUgPSAodFNpckFzc29jVHlwZSkgbGltR2V0VTMyKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJBc3NvY1R5cGUpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJBc3NvY1R5cGUpOyAKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisjZW5kaWYKKworICAgIC8vIEV4dHJhY3Qgb3BlcmF0aW9uYWxSYXRlU2V0CisgICAgcEpvaW5SZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlcz0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAocEpvaW5SZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlcykKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBKb2luUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZSwgcEJ1ZiwgcEpvaW5SZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlcyk7CisgICAgICAgIHBCdWYgKz0gcEpvaW5SZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlczsKKyAgICAgICAgbGVuIC09IHBKb2luUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXM7CisgICAgICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gRXh0cmFjdCBleHRlbmRlZFJhdGVTZXQKKyAgICBwSm9pblJlcS0+ZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBpZiAocEpvaW5SZXEtPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlcykKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBKb2luUmVxLT5leHRlbmRlZFJhdGVTZXQucmF0ZSwgcEJ1ZiwgcEpvaW5SZXEtPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlcyk7CisgICAgICAgIHBCdWYgKz0gcEpvaW5SZXEtPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlczsKKyAgICAgICAgbGVuICAtPSBwSm9pblJlcS0+ZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzOworICAgICAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgUlNOIElFCisgICAgcEpvaW5SZXEtPnJzbklFLmxlbmd0aCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuIC09IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBpZiAocEpvaW5SZXEtPnJzbklFLmxlbmd0aCkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGZvciBSU04gSUUgbGVuZ3RoICh0aGF0IGluY2x1ZGVzIGxlbmd0aCBvZiB0eXBlICYgbGVuZ3RoKQorICAgICAgICBpZiAoKHBKb2luUmVxLT5yc25JRS5sZW5ndGggPiBTSVJfTUFDX01BWF9JRV9MRU5HVEggKyAyKSB8fAorICAgICAgICAgICAgIChwSm9pblJlcS0+cnNuSUUubGVuZ3RoICE9IDIgKyAqKHBCdWYgKyAxKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgICAgIEZMKCJJbnZhbGlkIFJTTiBJRSBsZW5ndGggJWQgaW4gU01FX0pPSU5fUkVRXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwSm9pblJlcS0+cnNuSUUubGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcEpvaW5SZXEtPnJzbklFLnJzbklFZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBwQnVmLCBwSm9pblJlcS0+cnNuSUUubGVuZ3RoKTsKKyAgICAgICAgcEJ1ZiArPSBwSm9pblJlcS0+cnNuSUUubGVuZ3RoOworICAgICAgICBsZW4gIC09IHBKb2luUmVxLT5yc25JRS5sZW5ndGg7IC8vIHNraXAgUlNOIElFCisgICAgICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIC8vIEV4dHJhY3QgQ0NLTSBJRQorICAgIHBKb2luUmVxLT5jY2ttSUUubGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBsZW4gLT0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBpZiAocEpvaW5SZXEtPmNja21JRS5sZW5ndGgpCisgICAgeworICAgICAgICAvLyBDaGVjayBmb3IgQ0NLTSBJRSBsZW5ndGggKHRoYXQgaW5jbHVkZXMgbGVuZ3RoIG9mIHR5cGUgJiBsZW5ndGgpCisgICAgICAgIGlmICgocEpvaW5SZXEtPmNja21JRS5sZW5ndGggPiBTSVJfTUFDX01BWF9JRV9MRU5HVEgpIHx8CisgICAgICAgICAgICAgKHBKb2luUmVxLT5jY2ttSUUubGVuZ3RoICE9ICgyICsgKihwQnVmICsgMSkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICAgICAgRkwoIkludmFsaWQgQ0NLTSBJRSBsZW5ndGggJWQvJWQgaW4gU01FX0pPSU4vUkVBU1NPQ19SRVFcbiIpLAorICAgICAgICAgICAgICAgICAgIHBKb2luUmVxLT5jY2ttSUUubGVuZ3RoLCAyICsgKihwQnVmICsgMSkpOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwSm9pblJlcS0+Y2NrbUlFLmNja21JRWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgcEpvaW5SZXEtPmNja21JRS5sZW5ndGgpOworICAgICAgICBwQnVmICs9IHBKb2luUmVxLT5jY2ttSUUubGVuZ3RoOworICAgICAgICBsZW4gIC09IHBKb2luUmVxLT5jY2ttSUUubGVuZ3RoOyAvLyBza2lwIENDS00gSUUKKyAgICAgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIEV4dHJhY3QgQWRkIElFIGZvciBzY2FuCisgICAgcEpvaW5SZXEtPmFkZElFU2Nhbi5sZW5ndGggPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgaWYgKHBKb2luUmVxLT5hZGRJRVNjYW4ubGVuZ3RoKQorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIElFIGxlbmd0aCAodGhhdCBpbmNsdWRlcyBsZW5ndGggb2YgdHlwZSAmIGxlbmd0aCkKKyAgICAgICAgaWYgKHBKb2luUmVxLT5hZGRJRVNjYW4ubGVuZ3RoID4gU0lSX01BQ19NQVhfSUVfTEVOR1RIICsgMikKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoIkludmFsaWQgYWRkSUUgU2NhbiBsZW5ndGggJWQgaW4gU01FX0pPSU5fUkVRXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwSm9pblJlcS0+YWRkSUVTY2FuLmxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGZvciBQMlAgSUUgbGVuZ3RoICh0aGF0IGluY2x1ZGVzIGxlbmd0aCBvZiB0eXBlICYgbGVuZ3RoKQorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwSm9pblJlcS0+YWRkSUVTY2FuLmFkZElFZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBwQnVmLCBwSm9pblJlcS0+YWRkSUVTY2FuLmxlbmd0aCk7CisgICAgICAgIHBCdWYgKz0gcEpvaW5SZXEtPmFkZElFU2Nhbi5sZW5ndGg7CisgICAgICAgIGxlbiAgLT0gcEpvaW5SZXEtPmFkZElFU2Nhbi5sZW5ndGg7IC8vIHNraXAgYWRkIElFCisgICAgICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgcEpvaW5SZXEtPmFkZElFQXNzb2MubGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBsZW4gLT0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIC8vIEV4dHJhY3QgQWRkIElFIGZvciBhc3NvYworICAgIGlmIChwSm9pblJlcS0+YWRkSUVBc3NvYy5sZW5ndGgpCisgICAgeworICAgICAgICAvLyBDaGVjayBmb3IgSUUgbGVuZ3RoICh0aGF0IGluY2x1ZGVzIGxlbmd0aCBvZiB0eXBlICYgbGVuZ3RoKQorICAgICAgICBpZiAocEpvaW5SZXEtPmFkZElFQXNzb2MubGVuZ3RoID4gU0lSX01BQ19NQVhfSUVfTEVOR1RIICsgMikKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoIkludmFsaWQgYWRkSUUgQXNzb2MgbGVuZ3RoICVkIGluIFNNRV9KT0lOX1JFUVxuIiksCisgICAgICAgICAgICAgICAgICAgcEpvaW5SZXEtPmFkZElFQXNzb2MubGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgZm9yIFAyUCBJRSBsZW5ndGggKHRoYXQgaW5jbHVkZXMgbGVuZ3RoIG9mIHR5cGUgJiBsZW5ndGgpCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBKb2luUmVxLT5hZGRJRUFzc29jLmFkZElFZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBwQnVmLCBwSm9pblJlcS0+YWRkSUVBc3NvYy5sZW5ndGgpOworICAgICAgICBwQnVmICs9IHBKb2luUmVxLT5hZGRJRUFzc29jLmxlbmd0aDsKKyAgICAgICAgbGVuICAtPSBwSm9pblJlcS0+YWRkSUVBc3NvYy5sZW5ndGg7IC8vIHNraXAgYWRkIElFCisgICAgICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgcEpvaW5SZXEtPk1DRW5jcnlwdGlvblR5cGUgPSBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMzIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsgICAgCisgICAgCisgICAgcEpvaW5SZXEtPlVDRW5jcnlwdGlvblR5cGUgPSBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMzIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsgICAgCisgICAgCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAvL2lzMTFSY29ubmVjdGlvbjsKKyAgICBwSm9pblJlcS0+aXMxMVJjb25uZWN0aW9uID0gKHRBbmlCb29sKWxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QW5pQm9vbCk7CisgICAgbGVuIC09IHNpemVvZih0QW5pQm9vbCk7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIC8vaXNDQ1hjb25uZWN0aW9uOworICAgIHBKb2luUmVxLT5pc0NDWGNvbm5lY3Rpb24gPSAodEFuaUJvb2wpbGltR2V0VTMyKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlCb29sKTsKKyAgICBsZW4gLT0gc2l6ZW9mKHRBbmlCb29sKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7ICAgIAorCisgICAgLy8gVFNQRUMgaW5mb3JtYXRpb24KKyAgICBwSm9pblJlcS0+Y2N4VHNwZWNJbmZvLm51bVRzcGVjcyA9ICpwQnVmKys7CisgICAgbGVuIC09IHNpemVvZih0QU5JX1U4KTsKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKikmcEpvaW5SZXEtPmNjeFRzcGVjSW5mby50c3BlY1swXSwgcEJ1ZiwgKHNpemVvZih0VHNwZWNJbmZvKSogcEpvaW5SZXEtPmNjeFRzcGVjSW5mby5udW1Uc3BlY3MpKTsKKyAgICBwQnVmICs9IHNpemVvZih0VHNwZWNJbmZvKSpTSVJfQ0NYX01BWF9UU1BFQ19JRVM7CisgICAgbGVuICAtPSBzaXplb2YodFRzcGVjSW5mbykqU0lSX0NDWF9NQVhfVFNQRUNfSUVTOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyNlbmRpZgorICAgIAorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgfHwgZGVmaW5lZCBGRUFUVVJFX1dMQU5fQ0NYCisgICAgLy9pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZDsKKyAgICBwSm9pblJlcS0+aXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQgPSAodEFuaUJvb2wpbGltR2V0VTMyKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlCb29sKTsKKyAgICBsZW4gLT0gc2l6ZW9mKHRBbmlCb29sKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7ICAgIAorI2VuZGlmCisKKyAgICAKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIC8vIEV4dHJhY3QgQlAgSW5kaWNhdG9yCisgICAgcEpvaW5SZXEtPmJwSW5kaWNhdG9yID0gKHRBbmlCb29sKSBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFuaUJvb2wpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBbmlCb29sKTsgCisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBCUCBUeXBlCisgICAgcEpvaW5SZXEtPmJwVHlwZSA9ICh0U2lyQnBJbmRpY2F0b3JUeXBlKSBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpckJwSW5kaWNhdG9yVHlwZSk7CisgICAgbGVuICAtPSBzaXplb2YodFNpckJwSW5kaWNhdG9yVHlwZSk7IAorICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgTmVpZ2hib3IgQlNTIExpc3QKKyAgICBpZiAobGltR2V0TmVpZ2hib3JCc3NMaXN0KHBNYWMsICZwSm9pblJlcS0+bmVpZ2hib3JCc3NMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCAmbGVuVXNlZCwgcEJ1ZikgPT0gZVNJUl9GQUlMVVJFKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiZ2V0IG5laWdoYm9yIGJzcyBsaXN0IGZhaWxlZFxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgcEJ1ZiArPSBsZW5Vc2VkOworICAgIGxlbiAtPSBsZW5Vc2VkOworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkFzc29jIFR5cGUgJWQgUlNOIGxlbiAlZCBicCAlZCB0eXBlICVkIGJzcyBSU04gbGVuICVkXG4iKSwKKyAgICAgICAgICAgcEpvaW5SZXEtPmFzc29jVHlwZSwgcEpvaW5SZXEtPnJzbklFLmxlbmd0aCwgcEpvaW5SZXEtPmJwSW5kaWNhdG9yLAorICAgICAgICAgICBwSm9pblJlcS0+YnBUeXBlLCBwSm9pblJlcS0+bmVpZ2hib3JCc3NMaXN0LmJzc0xpc3QtPnJzbklFLmxlbmd0aCk7KQorI2VuZGlmCisKKyAgICAvLyBFeHRyYWN0IFRpdGFuIENCIE5laWdoYm9yIEJTUyBpbmZvCisgICAgcEpvaW5SZXEtPmNiTmVpZ2hib3JzLmNiQnNzRm91bmRQcmkgPSAqcEJ1ZjsKKyAgICBwQnVmKys7CisgICAgcEpvaW5SZXEtPmNiTmVpZ2hib3JzLmNiQnNzRm91bmRTZWNVcCA9ICpwQnVmOworICAgIHBCdWYrKzsKKyAgICBwSm9pblJlcS0+Y2JOZWlnaGJvcnMuY2JCc3NGb3VuZFNlY0Rvd24gPSAqcEJ1ZjsKKyAgICBwQnVmKys7CisgICAgbGVuIC09IDM7CisKKyAgICAvLyBFeHRyYWN0IFNwZWN0cnVtIE1ndCBJbmRpY2F0b3IKKyAgICBwSm9pblJlcS0+c3BlY3RydW1NZ3RJbmRpY2F0b3IgPSAodEFuaUJvb2wpIGxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QW5pQm9vbCk7ICAgICAgIAorICAgIGxlbiAtPSBzaXplb2YodEFuaUJvb2wpOworCisgICAgcEpvaW5SZXEtPnBvd2VyQ2FwLm1pblR4UG93ZXIgPSAqcEJ1ZisrOworICAgIHBKb2luUmVxLT5wb3dlckNhcC5tYXhUeFBvd2VyID0gKnBCdWYrKzsKKyAgICBsZW4gLT0yOworICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUG93ZXIgQ2FwczogTWluIHBvd2VyID0gJWQsIE1heCBwb3dlciA9ICVkXG4iKSwgcEpvaW5SZXEtPnBvd2VyQ2FwLm1pblR4UG93ZXIsIHBKb2luUmVxLT5wb3dlckNhcC5tYXhUeFBvd2VyKTsKKworICAgIHBKb2luUmVxLT5zdXBwb3J0ZWRDaGFubmVscy5udW1DaG5sID0gKnBCdWYrKzsKKyAgICBsZW4tLTsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwSm9pblJlcS0+c3VwcG9ydGVkQ2hhbm5lbHMuY2hhbm5lbExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwgcEpvaW5SZXEtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmwpOworICAgIHBCdWYgKz0gcEpvaW5SZXEtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmw7CisgICAgbGVuLT0gcEpvaW5SZXEtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmw7CisKKyAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsCisgICAgICAgICAgICBGTCgic3BlY3RydW1JbmQgT046IG1pblBvd2VyICVkLCBtYXhQb3dlciAlZCAsIG51bUNobmxzICVkXG4iKSwKKyAgICAgICAgICAgIHBKb2luUmVxLT5wb3dlckNhcC5taW5UeFBvd2VyLAorICAgICAgICAgICAgcEpvaW5SZXEtPnBvd2VyQ2FwLm1heFR4UG93ZXIsCisgICAgICAgICAgICBwSm9pblJlcS0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubCk7KQorCisgICAgLy8gRXh0cmFjdCB1YXBzZFBlckFjQml0bWFzaworICAgIHBKb2luUmVxLT51YXBzZFBlckFjQml0bWFzayA9ICpwQnVmKys7CisgICAgbGVuLS07CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gV0xBTl9TVEEpCisgICAgLy8KKyAgICAvLyBOT1RFIC0gdFNpckJzc0Rlc2NyaXB0aW9uIGlzIG5vdyBtb3ZlZCB0byB0aGUgZW5kCisgICAgLy8gb2YgdFNpclNtZUpvaW5SZXEgc3RydWN0dXJlLiBUaGlzIGlzIHRvIGFjY29tb2RhdGUKKyAgICAvLyB0aGUgdmFyaWFibGUgbGVuZ3RoIGRhdGEgbWVtYmVyIGllRmllbGRzWzFdCisgICAgLy8KKyAgICBpZiAobGltR2V0QnNzRGVzY3JpcHRpb24oIHBNYWMsICZwSm9pblJlcS0+YnNzRGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgJmxlblVzZWQsIHBCdWYpID09IGVTSVJfRkFJTFVSRSkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImdldCBic3MgZGVzY3JpcHRpb24gZmFpbGVkXG4iKSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgICBQRUxPRzMoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMywgKHRBTklfVTggKikgJihwSm9pblJlcS0+YnNzRGVzY3JpcHRpb24pLCBwSm9pblJlcS0+YnNzRGVzY3JpcHRpb24ubGVuZ3RoICsgMik7KQorICAgIHBCdWYgKz0gbGVuVXNlZDsKKyAgICBsZW4gLT0gbGVuVXNlZDsKKyNlbmRpZgorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyoqKiBlbmQgbGltSm9pblJlcVNlckRlcygpICoqKi8KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgbGltQXNzb2NJbmRTZXJEZXMKK1xicmllZiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01sbUFzc29jSW5kKCkgdG8gCitcICAgICAgIHBvcHVsYXRlIHRoZSBTTUVfQVNTT0NfSU5EIG1lc3NhZ2UgYmFzZWQgb24gdGhlIHJlY2VpdmVkCitcICAgICAgIE1MTV9BU1NPQ19JTkQuCitcCitccGFyYW0gcE1hYworXHBhcmFtIHBBc3NvY0luZCAtIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIHRMaW1NbG1Bc3NvY0luZAorXHBhcmFtIHBCdWYgLSBQb2ludGVyIHRvIHNlcmlhbGl6ZWQgYnVmZmVyCitccGFyYW0gcHNlc3Npb25FbnRyeSAtIHBvaW50ZXIgdG8gUEUgc2Vzc2lvbiBlbnRyeQorXAorXHJldHVybiBOb25lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltQXNzb2NJbmRTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBMaW1NbG1Bc3NvY0luZCBwQXNzb2NJbmQsIHRBTklfVTggKnBCdWYsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VOCAgKnBMZW4gID0gcEJ1ZjsKKyAgICB0QU5JX1UxNiBtTGVuID0gMDsKKworI2lmZGVmIFBFX0RFQlVHX0xPRzEKKyAgICB0QU5JX1U4ICAqcFRlbXAgPSBwQnVmOworI2VuZGlmCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICB0QU5JX1UzMiBsZW4gPSAwOworI2VuZGlmCisKKyAgICBtTGVuICAgPSBzaXplb2YodEFOSV9VMzIpOworICAgIG1MZW4gICArPSBzaXplb2YodEFOSV9VOCk7CisgICAgcEJ1ZiAgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICAqcEJ1ZiA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKyAgICBwQnVmICAgKz0gc2l6ZW9mKHRBTklfVTgpOworCisgICAgIC8vIEZpbGwgaW4gcGVlck1hY0FkZHIKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBwQXNzb2NJbmQtPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgbUxlbiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisgICAgLy8gRmlsbCBpbiBhaWQKKyAgICBsaW1Db3B5VTE2KHBCdWYsIHBBc3NvY0luZC0+YWlkKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbUxlbiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAvLyBGaWxsIGluIGJzc0lkCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBtTGVuICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKyAgICAvLyBGaWxsIGluIHN0YUlkCisgICAgbGltQ29weVUxNihwQnVmLCBwc2Vzc2lvbkVudHJ5LT5zdGFJZCk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIC8vIEZpbGwgaW4gYXV0aFR5cGUKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBBc3NvY0luZC0+YXV0aFR5cGUpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICAvLyBGaWxsIGluIHNzSWQKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSAmKHBBc3NvY0luZC0+c3NJZCksIHBBc3NvY0luZC0+c3NJZC5sZW5ndGggKyAxKTsKKyAgICBwQnVmICs9ICgxICsgcEFzc29jSW5kLT5zc0lkLmxlbmd0aCk7CisgICAgbUxlbiArPSAoMSArIHBBc3NvY0luZC0+c3NJZC5sZW5ndGgpOworCisgICAgLy8gRmlsbCBpbiByc25JRQorICAgIGxpbUNvcHlVMTYocEJ1ZiwgcEFzc29jSW5kLT5yc25JRS5sZW5ndGgpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgKHRBTklfVTggKikgJihwQXNzb2NJbmQtPnJzbklFLnJzbklFZGF0YSksCisgICAgICAgICAgICAgICAgICBwQXNzb2NJbmQtPnJzbklFLmxlbmd0aCk7CisgICAgcEJ1ZiArPSBwQXNzb2NJbmQtPnJzbklFLmxlbmd0aDsKKyAgICBtTGVuICs9IHBBc3NvY0luZC0+cnNuSUUubGVuZ3RoOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisKKyAgICBsaW1Db3B5VTE2KHBCdWYsIHBBc3NvY0luZC0+c2VxTnVtKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbUxlbiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwQXNzb2NJbmQtPnduaUluZGljYXRvcik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFuaUJvb2wpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRBbmlCb29sKTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcEFzc29jSW5kLT5icEluZGljYXRvcik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFuaUJvb2wpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRBbmlCb29sKTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcEFzc29jSW5kLT5icFR5cGUpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJCcEluZGljYXRvclR5cGUpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRTaXJCcEluZGljYXRvclR5cGUpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwQXNzb2NJbmQtPmFzc29jVHlwZSk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIGxpbUNvcHlMb2FkKHBCdWYsIHBBc3NvY0luZC0+bG9hZCk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpckxvYWQpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRTaXJMb2FkKTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcEFzc29jSW5kLT5udW1Cc3MpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBpZiAocEFzc29jSW5kLT5udW1Cc3MpCisgICAgeworICAgICAgICBsZW4gICA9IGxpbUNvcHlOZWlnaGJvckxpc3QocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNzb2NJbmQtPm5laWdoYm9yTGlzdCwgcEFzc29jSW5kLT5udW1Cc3MpOworICAgICAgICBwQnVmICs9IGxlbjsKKyAgICAgICAgbUxlbiArPSAodEFOSV9VMTYpIGxlbjsKKyAgICB9CisKKyAgICAvLyBwbGFjZSBob2xkZXIgdG8gY2FwYWJpbGl0eSBhbmQgbndUeXBlCisKKyAgICBsaW1Db3B5VTE2KHBCdWYsICoodEFOSV9VMTYgKikmcEFzc29jSW5kLT5jYXBhYmlsaXR5SW5mbyk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOyAvLyBjYXBhYmlsaXR5SW5mbworICAgIG1MZW4gKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgKih0QU5JX1UzMiAqKSZwQXNzb2NJbmQtPm53VHlwZSk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOyAvLyBud1R5cGUKKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1UzMik7CisKKyNlbmRpZgorCisgICAgLy8gQ29weSB0aGUgbmV3IFRJVEFOIGNhcGFiaWxpdGllcworICAgICpwQnVmID0gcEFzc29jSW5kLT50aXRhbkh0Q2FwczsKKyAgICBwQnVmKys7CisgICAgbUxlbisrOworCisgICAgbGltQ29weVUzMihwQnVmLCBwQXNzb2NJbmQtPnNwZWN0cnVtTWd0SW5kaWNhdG9yKTsKKyAgICBwQnVmICs9IHNpemVvZih0QW5pQm9vbCk7CisgICAgbUxlbiArPSBzaXplb2YodEFuaUJvb2wpOworCisgICAgaWYgKHBBc3NvY0luZC0+c3BlY3RydW1NZ3RJbmRpY2F0b3IgPT0gZVNJUl9UUlVFKQorICAgIHsKKyAgICAgICAgKnBCdWYgPSBwQXNzb2NJbmQtPnBvd2VyQ2FwLm1pblR4UG93ZXI7CisgICAgICAgIHBCdWYrKzsKKyAgICAgICAgKnBCdWYgPSBwQXNzb2NJbmQtPnBvd2VyQ2FwLm1heFR4UG93ZXI7CisgICAgICAgIHBCdWYrKzsKKyAgICAgICAgbUxlbiArPSBzaXplb2YodFNpck1hY1Bvd2VyQ2FwSW5mbyk7CisKKyAgICAgICAgKnBCdWYgPSBwQXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmw7CisgICAgICAgIHBCdWYrKzsKKyAgICAgICAgbUxlbisrOworCisgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgJihwQXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLmNoYW5uZWxMaXN0KSwKKyAgICAgICAgICAgICAgICAgICAgIHBBc3NvY0luZC0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubCk7CisKKworICAgICAgICBwQnVmICs9IHBBc3NvY0luZC0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubDsKKyAgICAgICAgbUxlbiArPSBwQXNzb2NJbmQtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmw7CisgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBBc3NvY0luZC0+V21tU3RhSW5mb1ByZXNlbnQpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1UzMik7CisjZW5kaWYKKyAgICAgLy8gRmlsbCBpbiBsZW5ndGggb2YgU01FX0FTU09DX0lORCBtZXNzYWdlCisgICAgbGltQ29weVUxNihwTGVuLCBtTGVuKTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgU01FX0FTU09DX0lORCBsZW5ndGggJWQgYnl0ZXM6XG4iKSwgbUxlbik7KQorICAgIFBFTE9HMShzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cxLCBwVGVtcCwgbUxlbik7KQorfSAvKioqIGVuZCBsaW1Bc3NvY0luZFNlckRlcygpICoqKi8KKworCisKKy8qKgorICogbGltQXNzb2NDbmZTZXJEZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTG1tTWVzc2FnZXMoKSB3aGVuCisgKiBTTUVfQVNTT0NfQ05GIG9yIFNNRV9SRUFTU09DX0NORiBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20KKyAqIHVwcGVyIGxheWVyIHNvZnR3YXJlLgorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBBc3NvY0NuZiAgUG9pbnRlciB0byB0U2lyU21lQXNzb2NDbmYgYmVpbmcgZXh0cmFjdGVkIGludG8KKyAqIEBwYXJhbSAgcEJ1ZiAgICAgICBQb2ludGVyIHRvIHNlcmlhbGl6ZWQgYnVmZmVyCisgKiBAcmV0dXJuIHJldENvZGUgICAgSW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgICBkZS1zZXJpYWxpemVkIChlU0lSX1NVQ0NFU1MpIG9yCisgKiAgICAgICAgICAgICAgICAgICAgbm90IChlU0lSX0ZBSUxVUkUpCisgKi8KKwordFNpclJldFN0YXR1cworbGltQXNzb2NDbmZTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVBc3NvY0NuZiBwQXNzb2NDbmYsIHRBTklfVTggKnBCdWYpCit7CisjaWZkZWYgUEVfREVCVUdfTE9HMQorICAgIHRBTklfVTggICpwVGVtcCA9IHBCdWY7CisjZW5kaWYKKworICAgIGlmICghcEFzc29jQ25mIHx8ICFwQnVmKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcEFzc29jQ25mLT5tZXNzYWdlVHlwZSA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBwQXNzb2NDbmYtPmxlbmd0aCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBpZiAocEFzc29jQ25mLT5tZXNzYWdlVHlwZSA9PSBlV05JX1NNRV9BU1NPQ19DTkYpCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUVfQVNTT0NfQ05GIGxlbmd0aCAlZCBieXRlcyBpczpcbiIpLCBwQXNzb2NDbmYtPmxlbmd0aCk7KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUVfUkVBU1NPQ19DTkYgbGVuZ3RoICVkIGJ5dGVzIGlzOlxuIiksIHBBc3NvY0NuZi0+bGVuZ3RoKTspCisgICAgfQorICAgIFBFTE9HMShzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cxLCBwVGVtcCwgcEFzc29jQ25mLT5sZW5ndGgpOykKKworICAgIC8vIHN0YXR1cyBjb2RlCisgICAgcEFzc29jQ25mLT5zdGF0dXNDb2RlID0gKHRTaXJSZXN1bHRDb2RlcykgbGltR2V0VTMyKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJSZXN1bHRDb2Rlcyk7CisKKyAgICAvLyBic3NJZAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBBc3NvY0NuZi0+YnNzSWQsIHBCdWYsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKworICAgIC8vIHBlZXJNYWNBZGRyCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEFzc29jQ25mLT5wZWVyTWFjQWRkciwgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisKKyAgICBwQXNzb2NDbmYtPmFpZCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgLy8gYWx0ZXJuYXRlQnNzSWQKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQXNzb2NDbmYtPmFsdGVybmF0ZUJzc0lkLCBwQnVmLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKyAgICAvLyBhbHRlcm5hdGVDaGFubmVsSWQKKyAgICBwQXNzb2NDbmYtPmFsdGVybmF0ZUNoYW5uZWxJZCA9ICpwQnVmOworICAgIHBCdWYrKzsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qKiogZW5kIGxpbUFzc29jQ25mU2VyRGVzKCkgKioqLworCisKKworLyoqCisgKiBsaW1EaXNhc3NvY0NuZlNlckRlcygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVNZXNzYWdlcygpIHdoZW4KKyAqIFNNRV9ESVNBU1NPQ19DTkYgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHVwcGVyIGxheWVyIHNvZnR3YXJlLgorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBEaXNhc3NvY0NuZiAgUG9pbnRlciB0byB0U2lyU21lRGlzYXNzb2NDbmYgYmVpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgaW50bworICogQHBhcmFtICBwQnVmICAgICAgICAgIFBvaW50ZXIgdG8gc2VyaWFsaXplZCBidWZmZXIKKyAqIEByZXR1cm4gcmV0Q29kZSAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgICAgICAgICAgICAgIGRlLXNlcmlhbGl6ZWQgKGVTSVJfU1VDQ0VTUykgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICBub3QgKGVTSVJfRkFJTFVSRSkKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1EaXNhc3NvY0NuZlNlckRlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZURpc2Fzc29jQ25mIHBEaXNhc3NvY0NuZiwgdEFOSV9VOCAqcEJ1ZikKK3sKKyNpZmRlZiAgUEVfREVCVUdfTE9HMQorICAgIHRBTklfVTggICpwVGVtcCA9IHBCdWY7CisjZW5kaWYKKworICAgIGlmICghcERpc2Fzc29jQ25mIHx8ICFwQnVmKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcERpc2Fzc29jQ25mLT5tZXNzYWdlVHlwZSA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBwRGlzYXNzb2NDbmYtPmxlbmd0aCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUVfRElTQVNTT0NfQ05GIGxlbmd0aCAlZCBieXRlcyBpczpcbiIpLCBwRGlzYXNzb2NDbmYtPmxlbmd0aCk7KQorICAgIFBFTE9HMShzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cxLCBwVGVtcCwgcERpc2Fzc29jQ25mLT5sZW5ndGgpOykKKworICAgIHBEaXNhc3NvY0NuZi0+c3RhdHVzQ29kZSA9ICh0U2lyUmVzdWx0Q29kZXMpIGxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyUmVzdWx0Q29kZXMpOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcERpc2Fzc29jQ25mLT5ic3NJZCwgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworIAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBEaXNhc3NvY0NuZi0+cGVlck1hY0FkZHIsIHBCdWYsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBwRGlzYXNzb2NDbmYtPmFpZCA9IGxpbUdldFUxNihwQnVmKTsKKyNlbmRpZgorICAgIAorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qKiogZW5kIGxpbURpc2Fzc29jQ25mU2VyRGVzKCkgKioqLworCisKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisvKioKKyAqIGxpbU1lYXN1cmVtZW50UmVxU2VyRGVzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc0xtbU1lc3NhZ2VzKCkgd2hlbgorICogU01FX01FQVNVUkVNRU5UX1JFUSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gdXBwZXIgbGF5ZXIgc29mdHdhcmUuCisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1lYXNSZXEgIFBvaW50ZXIgdG8gdFNpclNtZU1lYXN1cmVtZW50IGJlaW5nCisgKiAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgaW50bworICogQHBhcmFtICBwQnVmICAgICAgUG9pbnRlciB0byBzZXJpYWxpemVkIGJ1ZmZlcgorICogQHJldHVybiByZXRDb2RlICAgSW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgIGRlLXNlcmlhbGl6ZWQgKGVTSVJfU1VDQ0VTUykgb3IKKyAqICAgICAgICAgICAgICAgICAgIG5vdCAoZVNJUl9GQUlMVVJFKQorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbU1lYXN1cmVtZW50UmVxU2VyRGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyU21lTWVhc3VyZW1lbnRSZXEgcE1lYXNSZXEsIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9TMTYgbGVuID0gMDsKKyAgICBQRUxPRzModEFOSV9VOCAgKnBUZW1wID0gcEJ1ZjspCisKKyAgICBpZiAoIXBNZWFzUmVxIHx8ICFwQnVmKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcE1lYXNSZXEtPm1lc3NhZ2VUeXBlID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGxlbiA9IHBNZWFzUmVxLT5sZW5ndGggPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiU01FX01FQVNVUkVNRU5UX1JFUSBsZW5ndGggJWQgYnl0ZXMgaXM6XG4iKSwgbGVuKTsKKyAgICBzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0czLCBwVGVtcCwgbGVuKTspCisKKyAgICBpZiAobGVuIDwgKHRBTklfUzE2KSBzaXplb2YodEFOSV9VMzIpKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgbGVuIC09IHNpemVvZih0QU5JX1UzMik7IC8vIHNraXAgbWVzc2FnZSBoZWFkZXIKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBwTWVhc1JlcS0+bWVhc0NvbnRyb2wucGVyaW9kaWNNZWFzRW5hYmxlZCA9ICh0QW5pQm9vbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUdldFUzMihwQnVmKTsKKworICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlCb29sKTsKKyAgICBsZW4gIC09IHNpemVvZih0QW5pQm9vbCk7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcE1lYXNSZXEtPm1lYXNDb250cm9sLmludm9sdmVTVEFzID0gKHRBbmlCb29sKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QW5pQm9vbCk7CisgICAgbGVuICAtPSBzaXplb2YodEFuaUJvb2wpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIHBNZWFzUmVxLT5tZWFzQ29udHJvbC5tZXRyaWNzVHlwZSA9ICpwQnVmKys7CisgICAgbGVuLS07CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcE1lYXNSZXEtPm1lYXNDb250cm9sLnNjYW5UeXBlID0gKHRTaXJTY2FuVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpclNjYW5UeXBlKTsKKyAgICBsZW4gIC09IHNpemVvZih0U2lyU2NhblR5cGUpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIHBNZWFzUmVxLT5tZWFzQ29udHJvbC5sb25nQ2hhbm5lbFNjYW5QZXJpb2RpY2l0eSA9ICpwQnVmKys7CisgICAgbGVuLS07CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcE1lYXNSZXEtPm1lYXNDb250cm9sLmNiMTFoRW5hYmxlZCA9ICh0QW5pQm9vbClsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFuaUJvb2wpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBbmlCb29sKTsKKworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIHBNZWFzUmVxLT5tZWFzRHVyYXRpb24uc2hvcnRUZXJtUGVyaW9kID0gbGltR2V0VTMyKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIHBNZWFzUmVxLT5tZWFzRHVyYXRpb24uYXZlcmFnaW5nUGVyaW9kID0gbGltR2V0VTMyKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIHBNZWFzUmVxLT5tZWFzRHVyYXRpb24uc2hvcnRDaGFubmVsU2NhbkR1cmF0aW9uID0gbGltR2V0VTMyKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIHBNZWFzUmVxLT5tZWFzRHVyYXRpb24ubG9uZ0NoYW5uZWxTY2FuRHVyYXRpb24gPSBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgbGVuICAtPSBzaXplb2YodFNpck1lYXNEdXJhdGlvbik7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcE1lYXNSZXEtPm1lYXNJbmRQZXJpb2QgPSBsaW1HZXRVMzIocEJ1Zik7CisKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMzIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIHBNZWFzUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9ICpwQnVmKys7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcE1lYXNSZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXIsCisgICAgICAgICAgICAgICAgICBwQnVmLCBwTWVhc1JlcS0+Y2hhbm5lbExpc3QubnVtQ2hhbm5lbHMpOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyoqKiBlbmQgbGltTWVhc3VyZW1lbnRSZXFTZXJEZXMoKSAqKiovCisKKworLyoqCisgKiBsaW1XZHNSZXFTZXJEZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzTG1tTWVzc2FnZXMoKSB3aGVuCisgKiBTTUVfU0VUX1dEU19JTkZPX1JFUSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gdXBwZXIgbGF5ZXIgc29mdHdhcmUuCisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcFdkc0luZm8gIFBvaW50ZXIgdG8gdFNpcldkc0luZm8gYmVpbmcgZXh0cmFjdGVkIGludG8KKyAqIEBwYXJhbSAgcEJ1ZiAgICAgIFBvaW50ZXIgdG8gc2VyaWFsaXplZCBidWZmZXIKKyAqIEByZXR1cm4gcmV0Q29kZSAgIEluZGljYXRlcyB3aGV0aGVyIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5CisgKiAgICAgICAgICAgICAgICAgICBkZS1zZXJpYWxpemVkIChlU0lSX1NVQ0NFU1MpIG9yCisgKiAgICAgICAgICAgICAgICAgICBub3QgKGVTSVJfRkFJTFVSRSkKKyAqLworCit0U2lyUmV0U3RhdHVzCitsaW1XZHNSZXFTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVTZXRXZHNJbmZvUmVxIHBXZHNJbmZvUmVxLCB0QU5JX1U4ICpwQnVmKQoreworICAgIHRBTklfUzE2IGxlbiA9IDA7CisgICAgUEVMT0cxKHRBTklfVTggICpwVGVtcCA9IHBCdWY7KQorCisgICAgaWYgKCFwV2RzSW5mb1JlcSB8fCAhcEJ1ZikKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgbWVzc2FnZVR5cGUKKyAgICBwV2RzSW5mb1JlcS0+bWVzc2FnZVR5cGUgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgLy8gRXh0cmFjdCBsZW5ndGgKKyAgICBsZW4gPSBwV2RzSW5mb1JlcS0+bGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNNRV9TRVRfV0RTX0lORk9fUkVRIGxlbmd0aCAlZCBieXRlcyBpczpcbiIpLCBsZW4pOykKKyAgICBQRUxPRzEoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMSwgcFRlbXAsIGxlbik7KQorCisgICAgaWYgKGxlbiA8ICh0QU5JX1MxNikgc2l6ZW9mKHRBTklfVTMyKSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMzIpOyAvLyBza2lwIG1lc3NhZ2UgaGVhZGVyCisKKyAgICAvLyBFeHRyYWN0IHRyYW5zYWN0aW9uSWQKKyAgICBwV2RzSW5mb1JlcS0+dHJhbnNhY3Rpb25JZCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuIC09IHNpemVvZih0QU5JX1UxNik7CisKKyAgICAvLyBFeHRyYWN0IHdkc0luZm8KKyAgICBwV2RzSW5mb1JlcS0+d2RzSW5mby53ZHNMZW5ndGggPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgbGVuIC09IHNpemVvZih0QU5JX1UxNik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgaWYgKHBXZHNJbmZvUmVxLT53ZHNJbmZvLndkc0xlbmd0aCA+IEFOSV9XRFNfSU5GT19NQVhfTEVOR1RIKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcFdkc0luZm9SZXEtPndkc0luZm8ud2RzQnl0ZXMsCisgICAgICAgIHBCdWYsCisgICAgICAgIHBXZHNJbmZvUmVxLT53ZHNJbmZvLndkc0xlbmd0aCk7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8qKiogZW5kIGxpbVdkc1JlcVNlckRlcygpICoqKi8KKworCisvKioKKyAqIGxpbU1lYXN1cmVtZW50SW5kU2VyRGVzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltU2VuZE1lYXN1cmVtZW50SW5kKCkgd2hpbGUKKyAqIHNlbmRpbmcgU01FX01FQVNVUkVNRU5UX0lORCBtZXNzYWdlIHRvIFdTTS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBNZWFzSW5kIC0gUG9pbnRlciB0byBwcmVwYXJlZCBNRUFTVVJFTUVOVF9JTkQgbWVzc2FnZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltTWVhc3VyZW1lbnRJbmRTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICpwTGVuOworICAgIHRBTklfVTE2ICAgICAgICAgbGVuID0gMCwgaW5mb0xlbiA9IDA7CisgICAgdFNpckxvYWQgICAgbG9hZDsKKyAgICBQRUxPRzModEFOSV9VOCAgKnBUZW1wID0gcEJ1ZjspCisKKyAgICBsaW1Db3B5VTE2KHBCdWYsIGVXTklfU01FX01FQVNVUkVNRU5UX0lORCk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgcExlbiAgPSBwQnVmOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcE1hYy0+bGltLmdwTGltTWVhc0RhdGEtPmR1cmF0aW9uKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgbGVuICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsb2FkLm51bVN0YXMgICAgICAgICAgICA9IHBNYWMtPmxpbS5nTGltTnVtT2ZDdXJyZW50U1RBczsKKyAgICBsb2FkLmNoYW5uZWxVdGlsaXphdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzRGF0YS0+YXZnQ2hhbm5lbFV0aWxpemF0aW9uOworICAgIGxpbUNvcHlMb2FkKHBCdWYsIGxvYWQpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJMb2FkKTsKKyAgICBsZW4gICs9IHNpemVvZih0U2lyTG9hZCk7CisKKyAgICBpbmZvTGVuID0gbGltQ29weU1lYXNNYXRyaXhMaXN0KHBNYWMsIHBCdWYpOworICAgIHBCdWYgICArPSBpbmZvTGVuOworICAgIGxlbiAgICArPSBpbmZvTGVuOworCisgICAgaW5mb0xlbiA9IGxpbUNvcHlOZWlnaGJvcldkc0xpc3QocE1hYywgcEJ1Zik7CisgICAgcEJ1ZiAgICs9IGluZm9MZW47CisgICAgbGVuICAgICs9IGluZm9MZW47CisKKyAgICBsaW1Db3B5VTE2KHBMZW4sIGxlbis0KTsKKworICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIlNlbmRpbmcgTUVBU19JTkQgbGVuZ3RoICVkIGJ5dGVzOlxuIiksIGxlbik7CisgICAgc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMywgcFRlbXAsIGxlbik7KQorfSAvKioqIGVuZCBsaW1NZWFzdXJlbWVudEluZFNlckRlcygpICoqKi8KKyNlbmRpZgorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBsaW1SZWFzc29jSW5kU2VyRGVzCitcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NNbG1SZWFzc29jSW5kKCkgdG8gCitcICAgICAgIHBvcHVsYXRlIHRoZSBTTUVfUkVBU1NPQ19JTkQgbWVzc2FnZSBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQKK1wgICAgICAgTUxNX1JFQVNTT0NfSU5ELgorXAorXHBhcmFtIHBNYWMKK1xwYXJhbSBwUmVhc3NvY0luZCAtIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIHRMaW1NbG1SZWFzc29jSW5kCitccGFyYW0gcEJ1ZiAtIFBvaW50ZXIgdG8gc2VyaWFsaXplZCBidWZmZXIKK1xwYXJhbSBwc2Vzc2lvbkVudHJ5IC0gcG9pbnRlciB0byBQRSBzZXNzaW9uIGVudHJ5CitcCitccmV0dXJuIE5vbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1SZWFzc29jSW5kU2VyRGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwTGltTWxtUmVhc3NvY0luZCBwUmVhc3NvY0luZCwgdEFOSV9VOCAqcEJ1ZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1U4ICAqcExlbiAgPSBwQnVmOworICAgIHRBTklfVTE2IG1MZW4gPSAwOworCisjaWZkZWYgIFBFX0RFQlVHX0xPRzEKKyAgICB0QU5JX1U4ICAqcFRlbXAgPSBwQnVmOworI2VuZGlmCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICB0QU5JX1UzMiBsZW4gPSAwOworI2VuZGlmCisKKyAgICBtTGVuICAgPSBzaXplb2YodEFOSV9VMzIpOworICAgIHBCdWYgICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgKnBCdWYrKyA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1U4KTsKKworICAgIC8vIEZpbGwgaW4gcGVlck1hY0FkZHIKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBwUmVhc3NvY0luZC0+cGVlck1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBtTGVuICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKyAgICAvLyBGaWxsIGluIG9sZE1hY0FkZHIKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBwUmVhc3NvY0luZC0+Y3VycmVudEFwQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKworICAgIC8vIEZpbGwgaW4gYWlkCisgICAgbGltQ29weVUxNihwQnVmLCBwUmVhc3NvY0luZC0+YWlkKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbUxlbiArPSBzaXplb2YodEFOSV9VMTYpOworIAorICAgIC8vIEZpbGwgaW4gYnNzSWQKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKworICAgIC8vIEZpbGwgaW4gc3RhSWQKKyAgICBsaW1Db3B5VTE2KHBCdWYsIHBzZXNzaW9uRW50cnktPnN0YUlkKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbUxlbiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgLy8gRmlsbCBpbiBhdXRoVHlwZQorICAgIGxpbUNvcHlVMzIocEJ1ZiwgcFJlYXNzb2NJbmQtPmF1dGhUeXBlKTsKKyAgICBwQnVmICs9IHNpemVvZih0QW5pQXV0aFR5cGUpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRBbmlBdXRoVHlwZSk7CisKKyAgICAvLyBGaWxsIGluIHNzSWQKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSAmKHBSZWFzc29jSW5kLT5zc0lkKSwKKyAgICAgICAgICAgICAgICAgIHBSZWFzc29jSW5kLT5zc0lkLmxlbmd0aCArIDEpOworICAgIHBCdWYgKz0gMSArIHBSZWFzc29jSW5kLT5zc0lkLmxlbmd0aDsKKyAgICBtTGVuICs9IHBSZWFzc29jSW5kLT5zc0lkLmxlbmd0aCArIDE7CisKKyAgICAvLyBGaWxsIGluIHJzbklFCisgICAgbGltQ29weVUxNihwQnVmLCBwUmVhc3NvY0luZC0+cnNuSUUubGVuZ3RoKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbUxlbiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICh0QU5JX1U4ICopICYocFJlYXNzb2NJbmQtPnJzbklFLnJzbklFZGF0YSksCisgICAgICAgICAgICAgICAgICBwUmVhc3NvY0luZC0+cnNuSUUubGVuZ3RoKTsKKyAgICBwQnVmICs9IHBSZWFzc29jSW5kLT5yc25JRS5sZW5ndGg7CisgICAgbUxlbiArPSBwUmVhc3NvY0luZC0+cnNuSUUubGVuZ3RoOworCisgICAgLy8gRmlsbCBpbiBhZGRJRQorICAgIGxpbUNvcHlVMTYocEJ1ZiwgcFJlYXNzb2NJbmQtPmFkZElFLmxlbmd0aCk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCopICYocFJlYXNzb2NJbmQtPmFkZElFLmFkZElFZGF0YSksCisgICAgICAgICAgICAgICAgICAgcFJlYXNzb2NJbmQtPmFkZElFLmxlbmd0aCk7CisgICAgcEJ1ZiArPSBwUmVhc3NvY0luZC0+YWRkSUUubGVuZ3RoOworICAgIG1MZW4gKz0gcFJlYXNzb2NJbmQtPmFkZElFLmxlbmd0aDsKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorCisgICAgbGltQ29weVUxNihwQnVmLCBwUmVhc3NvY0luZC0+c2VxTnVtKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbUxlbiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwUmVhc3NvY0luZC0+d25pSW5kaWNhdG9yKTsKKyAgICBwQnVmICs9IHNpemVvZih0QW5pQm9vbCk7CisgICAgbUxlbiArPSBzaXplb2YodEFuaUJvb2wpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwUmVhc3NvY0luZC0+YnBJbmRpY2F0b3IpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlCb29sKTsKKyAgICBtTGVuICs9IHNpemVvZih0QW5pQm9vbCk7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBSZWFzc29jSW5kLT5icFR5cGUpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJCcEluZGljYXRvclR5cGUpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRTaXJCcEluZGljYXRvclR5cGUpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwUmVhc3NvY0luZC0+cmVhc3NvY1R5cGUpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJBc3NvY1R5cGUpOworICAgIG1MZW4gKz0gc2l6ZW9mKHRTaXJBc3NvY1R5cGUpOworCisgICAgbGltQ29weUxvYWQocEJ1ZiwgcFJlYXNzb2NJbmQtPmxvYWQpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJMb2FkKTsKKyAgICBtTGVuICs9IHNpemVvZih0U2lyTG9hZCk7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBSZWFzc29jSW5kLT5udW1Cc3MpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBpZiAocFJlYXNzb2NJbmQtPm51bUJzcykKKyAgICB7CisgICAgICAgIGxlbiAgID0gbGltQ29weU5laWdoYm9yTGlzdChwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICBwUmVhc3NvY0luZC0+bmVpZ2hib3JMaXN0LCBwUmVhc3NvY0luZC0+bnVtQnNzKTsKKyAgICAgICAgcEJ1ZiArPSBsZW47CisgICAgICAgIG1MZW4gKz0gKHRBTklfVTE2KSBsZW47CisgICAgfQorCisgICAgLy8gcGxhY2UgaG9sZGVyIHRvIGNhcGFiaWxpdHkgYW5kIG53VHlwZQorICAgIGxpbUNvcHlVMTYocEJ1ZiwgKih0QU5JX1UxNiAqKSZwUmVhc3NvY0luZC0+Y2FwYWJpbGl0eUluZm8pOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsgLy8gY2FwYWJpbGl0eUluZm8KKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsICoodEFOSV9VMzIgKikmcFJlYXNzb2NJbmQtPm53VHlwZSk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOyAvLyBud1R5cGUKKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1UzMik7CisjZW5kaWYKKworICAgIC8vIENvcHkgdGhlIG5ldyBUSVRBTiBjYXBhYmlsaXRpZXMKKyAgICAqcEJ1ZiA9IHBSZWFzc29jSW5kLT50aXRhbkh0Q2FwczsKKyAgICBwQnVmKys7CisgICAgbUxlbisrOworCisgICAgbGltQ29weVUzMihwQnVmLCBwUmVhc3NvY0luZC0+c3BlY3RydW1NZ3RJbmRpY2F0b3IpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlCb29sKTsKKyAgICBtTGVuICs9IHNpemVvZih0QW5pQm9vbCk7CisKKyAgICBpZiAocFJlYXNzb2NJbmQtPnNwZWN0cnVtTWd0SW5kaWNhdG9yID09IGVTSVJfVFJVRSkKKyAgICB7CisgICAgICAgICpwQnVmID0gcFJlYXNzb2NJbmQtPnBvd2VyQ2FwLm1pblR4UG93ZXI7CisgICAgICAgIHBCdWYrKzsKKyAgICAgICAgKnBCdWYgPSBwUmVhc3NvY0luZC0+cG93ZXJDYXAubWF4VHhQb3dlcjsKKyAgICAgICAgcEJ1ZisrOworICAgICAgICBtTGVuICs9IHNpemVvZih0U2lyTWFjUG93ZXJDYXBJbmZvKTsKKworICAgICAgICAqcEJ1ZiA9IHBSZWFzc29jSW5kLT5zdXBwb3J0ZWRDaGFubmVscy5udW1DaG5sOworICAgICAgICBwQnVmKys7CisgICAgICAgIG1MZW4rKzsKKworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSAmKHBSZWFzc29jSW5kLT5zdXBwb3J0ZWRDaGFubmVscy5jaGFubmVsTGlzdCksCisgICAgICAgICAgICAgICAgICAgICAgIHBSZWFzc29jSW5kLT5zdXBwb3J0ZWRDaGFubmVscy5udW1DaG5sKTsKKworICAgICAgICBwQnVmICs9IHBSZWFzc29jSW5kLT5zdXBwb3J0ZWRDaGFubmVscy5udW1DaG5sOworICAgICAgICBtTGVuICs9IHBSZWFzc29jSW5kLT5zdXBwb3J0ZWRDaGFubmVscy5udW1DaG5sOworICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgbGltQ29weVUzMihwQnVmLCBwUmVhc3NvY0luZC0+V21tU3RhSW5mb1ByZXNlbnQpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1UzMik7CisjZW5kaWYKKworICAgIC8vIEZpbGwgaW4gbGVuZ3RoIG9mIFNNRV9SRUFTU09DX0lORCBtZXNzYWdlCisgICAgbGltQ29weVUxNihwTGVuLCBtTGVuKTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgU01FX1JFQVNTT0NfSU5EIGxlbmd0aCAlZCBieXRlczpcbiIpLCBtTGVuKTspCisgICAgUEVMT0cxKHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzEsIHBUZW1wLCBtTGVuKTspCit9IC8qKiogZW5kIGxpbVJlYXNzb2NJbmRTZXJEZXMoKSAqKiovCisKKworLyoqCisgKiBsaW1BdXRoSW5kU2VyRGVzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc01sbUF1dGhJbmQoKSB3aGlsZSBzZW5kaW5nCisgKiBTTUVfQVVUSF9JTkQgdG8gaG9zdAorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBBdXRoSW5kICAgICAgICAgIFBvaW50ZXIgdG8gdFNpclNtZUF1dGhJbmQgYmVpbmcgc2VudAorICogQHBhcmFtICBwQnVmICAgICAgICAgUG9pbnRlciB0byBzZXJpYWxpemVkIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbUF1dGhJbmRTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBMaW1NbG1BdXRoSW5kIHBBdXRoSW5kLCB0QU5JX1U4ICpwQnVmKQoreworICAgIHRBTklfVTggICpwTGVuICA9IHBCdWY7CisgICAgdEFOSV9VMTYgbUxlbiA9IDA7CisKKyNpZmRlZiAgUEVfREVCVUdfTE9HMQorICAgIHRBTklfVTggICpwVGVtcCA9IHBCdWY7CisjZW5kaWYKKworICAgIG1MZW4gICA9IHNpemVvZih0QU5JX1UzMik7CisgICAgcEJ1ZiAgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICAqcEJ1ZisrID0gcEF1dGhJbmQtPnNlc3Npb25JZDsKKyAgICBtTGVuICs9IHNpemVvZih0QU5JX1U4KTsKKworICAgIC8vIEJUQU1QIFRPRE86ICBGaWxsIGluIGJzc0lkCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwQnVmLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgbUxlbiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcEF1dGhJbmQtPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgbUxlbiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwQXV0aEluZC0+YXV0aFR5cGUpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlBdXRoVHlwZSk7CisgICAgbUxlbiArPSBzaXplb2YodEFuaUF1dGhUeXBlKTsKKyAgCisgICAgbGltQ29weVUxNihwTGVuLCBtTGVuKTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgU01FX0FVVEhfSU5EIGxlbmd0aCAlZCBieXRlczpcbiIpLCBtTGVuKTspCisgICAgUEVMT0cxKHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzEsIHBUZW1wLCBtTGVuKTspCit9IC8qKiogZW5kIGxpbUF1dGhJbmRTZXJEZXMoKSAqKiovCisKKworCisvKioKKyAqIGxpbVNldENvbnRleHRSZXFTZXJEZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lTWVzc2FnZXMoKSB1cG9uIHJlY2VpdmluZworICogU01FX1NFVENPTlRFWFRfUkVRIGZyb20gaG9zdAorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBTZXRDb250ZXh0UmVxICBQb2ludGVyIHRvIHRTaXJTbWVTZXRDb250ZXh0UmVxIGJlaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQKKyAqIEBwYXJhbSAgcEJ1ZiAgICAgICAgICAgIFBvaW50ZXIgdG8gc2VyaWFsaXplZCBidWZmZXIKKyAqCisgKiBAcmV0dXJuIHJldENvZGUgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgZGUtc2VyaWFsaXplZCAoZVNJUl9TVUNDRVNTKSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgbm90IChlU0lSX0ZBSUxVUkUpCisgKi8KKwordFNpclJldFN0YXR1cworbGltU2V0Q29udGV4dFJlcVNlckRlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZVNldENvbnRleHRSZXEgcFNldENvbnRleHRSZXEsIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9TMTYgbGVuID0gMDsKKyAgICB0QU5JX1UxNiB0b3RhbEtleVNpemUgPSBzaXplb2YodEFOSV9VOCk7IC8vIGluaXRpYWxpemVkIHRvIHNpemVvZiBudW1LZXlzCisgICAgdEFOSV9VOCAgbnVtS2V5czsKKyAgICB0QU5JX1U4ICpwS2V5czsKKworI2lmZGVmICBQRV9ERUJVR19MT0cxCisgICAgdEFOSV9VOCAgKnBUZW1wID0gcEJ1ZjsKKyNlbmRpZgorICAgIGlmICghcFNldENvbnRleHRSZXEgfHwgIXBCdWYpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBwU2V0Q29udGV4dFJlcS0+bWVzc2FnZVR5cGUgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgbGVuID0gcFNldENvbnRleHRSZXEtPmxlbmd0aCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUVfU0VUQ09OVEVYVF9SRVEgbGVuZ3RoICVkIGJ5dGVzIGlzOlxuIiksIGxlbik7KQorICAgIFBFTE9HMShzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0czLCBwVGVtcCwgbGVuKTspCisKKyAgICBpZiAobGVuIDwgKHRBTklfUzE2KSBzaXplb2YodEFOSV9VMzIpKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgbGVuIC09IHNpemVvZih0QU5JX1UzMik7IC8vIHNraXAgbWVzc2FnZSBoZWFkZXIKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHNlc3Npb25JZAorICAgIHBTZXRDb250ZXh0UmVxLT5zZXNzaW9uSWQgPSAqcEJ1ZisrOworICAgIGxlbi0tOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgdHJhbnNhY3Rpb25JZAorICAgIHBTZXRDb250ZXh0UmVxLT50cmFuc2FjdGlvbklkID0gc2lyUmVhZFUxNk4ocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcFNldENvbnRleHRSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgIHBCdWYsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBsZW4gIC09IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTZXRDb250ZXh0UmVxLT5ic3NJZCwgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgcFNldENvbnRleHRSZXEtPmFpZCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMTYpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyNlbmRpZgorCisvLyAgICBwU2V0Q29udGV4dFJlcS0+cW9zSW5mb1ByZXNlbnQgPSBsaW1HZXRVMzIocEJ1Zik7CisvLyAgICBwQnVmICs9IHNpemVvZih0QW5pQm9vbCk7CisKKy8vICAgIGlmIChwU2V0Q29udGV4dFJlcS0+cW9zSW5mb1ByZXNlbnQpCisvLyAgICB7CisvLyAgICAgICAgbGVuICAgPSBsaW1HZXRRb3NJbmZvKCZwU2V0Q29udGV4dFJlcS0+cW9zLCBwQnVmKTsKKy8vICAgICAgICBwQnVmICs9IGxlbjsKKy8vICAgIH0KKworICAgIHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5sZW5ndGggPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlID0gKHRBbmlFZFR5cGUpIGxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QW5pRWRUeXBlKTsKKyAgICBsZW4gIC09IHNpemVvZih0QW5pRWRUeXBlKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBudW1LZXlzID0gcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLm51bUtleXMgPSAqcEJ1ZisrOworICAgIGxlbiAgLT0gc2l6ZW9mKG51bUtleXMpOworCisgICAgaWYgKG51bUtleXMgPiBTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLyoqIEluaXRpYWxpemUgdGhlIERlZmF1bHQgS2V5cyBpZiBubyBLZXlzIGFyZSBiZWluZyBzZW50IGZyb20gdGhlIHVwcGVyIGxheWVyKi8KKyAgICBpZiggbGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpIHsKKyAgICAgICAgdHBTaXJLZXlzIHBLZXlpbmZvID0gcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmtleTsKKworICAgICAgICBwS2V5aW5mby0+a2V5SWQgPSAwOworICAgICAgICBwS2V5aW5mby0+a2V5RGlyZWN0aW9uID0gZVNJUl9UWF9SWDsgCisgICAgICAgIHBLZXlpbmZvLT5rZXlMZW5ndGggPSAwOworICAgICAgICAgICAgCisgICAgICAgIGlmICghbGltSXNBZGRyQkMocFNldENvbnRleHRSZXEtPnBlZXJNYWNBZGRyKSkKKyAgICAgICAgICAgIHBLZXlpbmZvLT51bmljYXN0ID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcEtleWluZm8tPnVuaWNhc3QgPSAwOyAgICAgICAgICAgICAKKyAgICB9ZWxzZSB7CisgICAgICAgIHBLZXlzICA9ICh0QU5JX1U4ICopIHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5rZXk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRBTklfVTMyIGtleVNpemUgICA9IGxpbUdldEtleXNJbmZvKHBNYWMsICh0cFNpcktleXMpIHBLZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1Zik7CisgICAgICAgICAgICBwQnVmICAgICAgICAgKz0ga2V5U2l6ZTsKKyAgICAgICAgICAgIHBLZXlzICAgICAgICArPSBzaXplb2YodFNpcktleXMpOworICAgICAgICAgICAgdG90YWxLZXlTaXplICs9ICh0QU5JX1UxNikga2V5U2l6ZTsKKyAgICAgICAgICAgIGlmIChudW1LZXlzID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBudW1LZXlzLS07ICAgICAgICAgICAgCisgICAgICAgIH13aGlsZSAobnVtS2V5cyk7CisgICAgfQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qKiogZW5kIGxpbVNldENvbnRleHRSZXFTZXJEZXMoKSAqKiovCisKKy8qKgorICogbGltUmVtb3ZlS2V5UmVxU2VyRGVzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkgdXBvbiByZWNlaXZpbmcKKyAqIFNNRV9SRU1PVkVLRVlfUkVRIGZyb20gaG9zdAorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBSZW1vdmVLZXlSZXEgIFBvaW50ZXIgdG8gdFNpclNtZVJlbW92ZUtleVJlcSBiZWluZworICogICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkCisgKiBAcGFyYW0gIHBCdWYgICAgICAgICAgICBQb2ludGVyIHRvIHNlcmlhbGl6ZWQgYnVmZmVyCisgKgorICogQHJldHVybiByZXRDb2RlICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlLXNlcmlhbGl6ZWQgKGVTSVJfU1VDQ0VTUykgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCAoZVNJUl9GQUlMVVJFKQorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbVJlbW92ZUtleVJlcVNlckRlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZVJlbW92ZUtleVJlcSBwUmVtb3ZlS2V5UmVxLCB0QU5JX1U4ICpwQnVmKQoreworICAgIHRBTklfUzE2IGxlbiA9IDA7CisKKyNpZmRlZiAgICBQRV9ERUJVR19MT0cxCisgICAgdEFOSV9VOCAgKnBUZW1wID0gcEJ1ZjsKKyNlbmRpZgorICAgIGlmICghcFJlbW92ZUtleVJlcSB8fCAhcEJ1ZikKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIHBSZW1vdmVLZXlSZXEtPm1lc3NhZ2VUeXBlID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGxlbiA9IHBSZW1vdmVLZXlSZXEtPmxlbmd0aCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUVfUkVNT1ZFS0VZX1JFUSBsZW5ndGggJWQgYnl0ZXMgaXM6XG4iKSwgbGVuKTspCisgICAgUEVMT0cxKHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzEsIHBUZW1wLCBsZW4pOykKKworICAgIGlmIChsZW4gPCAodEFOSV9TMTYpIHNpemVvZih0QU5JX1UzMikpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBsZW4gLT0gc2l6ZW9mKHRBTklfVTMyKTsgLy8gc2tpcCBtZXNzYWdlIGhlYWRlcgorICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBSZW1vdmVLZXlSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgcFJlbW92ZUtleVJlcS0+YWlkID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBsZW4gIC09IHNpemVvZih0QU5JX1UxNik7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworI2VuZGlmCisKKyAgICBwUmVtb3ZlS2V5UmVxLT5lZFR5cGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1U4KTsKKyAgICBsZW4gLT0gc2l6ZW9mKHRBTklfVTgpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIHBSZW1vdmVLZXlSZXEtPndlcFR5cGUgPSAqcEJ1ZjsKKworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTgpOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VOCk7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcFJlbW92ZUtleVJlcS0+a2V5SWQgPSAqcEJ1ZjsKKyAgICAKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1U4KTsKKyAgICBsZW4gLT0gc2l6ZW9mKHRBTklfVTgpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIHBSZW1vdmVLZXlSZXEtPnVuaWNhc3QgPSAqcEJ1ZjsKKyAgICBsZW4tLTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IGJzc0lkCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFJlbW92ZUtleVJlcS0+YnNzSWQsIHBCdWYsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBsZW4gLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHNlc3Npb25JZAorICAgIHBSZW1vdmVLZXlSZXEtPnNlc3Npb25JZCA9ICpwQnVmKys7CisgICAgbGVuLS07CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCB0cmFuc2FjdGlvbklkCisgICAgcFJlbW92ZUtleVJlcS0+dHJhbnNhY3Rpb25JZCA9IHNpclJlYWRVMTZOKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBsZW4gIC09IHNpemVvZih0QU5JX1UxNik7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIAorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qKiogZW5kIGxpbVJlbW92ZUtleVJlcVNlckRlcygpICoqKi8KKworCisKKy8qKgorICogbGltRGlzYXNzb2NSZXFTZXJEZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lTWVzc2FnZXMoKSB1cG9uIHJlY2VpdmluZworICogU01FX0RJU0FTU09DX1JFUSBmcm9tIGhvc3QKKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwRGlzYXNzb2NSZXEgIFBvaW50ZXIgdG8gdFNpclNtZURpc2Fzc29jUmVxIGJlaW5nIGV4dHJhY3RlZAorICogQHBhcmFtICBwQnVmICAgICAgICAgIFBvaW50ZXIgdG8gc2VyaWFsaXplZCBidWZmZXIKKyAqCisgKiBAcmV0dXJuIHJldENvZGUgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICBkZS1zZXJpYWxpemVkIChlU0lSX1NVQ0NFU1MpIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgbm90IChlU0lSX0ZBSUxVUkUpCisgKi8KKwordFNpclJldFN0YXR1cworbGltRGlzYXNzb2NSZXFTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclNtZURpc2Fzc29jUmVxICpwRGlzYXNzb2NSZXEsIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9TMTYgbGVuID0gMDsKKyNpZmRlZiBQRV9ERUJVR19MT0cxCisgICAgdEFOSV9VOCAgKnBUZW1wID0gcEJ1ZjsKKyNlbmRpZgorCisgICAgaWYgKCFwRGlzYXNzb2NSZXEgfHwgIXBCdWYpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBwRGlzYXNzb2NSZXEtPm1lc3NhZ2VUeXBlID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGxlbiA9IHBEaXNhc3NvY1JlcS0+bGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNNRV9ESVNBU1NPQ19SRVEgbGVuZ3RoICVkIGJ5dGVzIGlzOlxuIiksIGxlbik7KQorICAgIFBFTE9HMShzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cxLCBwVGVtcCwgbGVuKTspCisKKyAgICBpZiAobGVuIDwgKHRBTklfUzE2KSBzaXplb2YodEFOSV9VMzIpKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgbGVuIC09IHNpemVvZih0QU5JX1UzMik7IC8vIHNraXAgbWVzc2FnZSBoZWFkZXIKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHNlc3Npb25JRAorICAgIHBEaXNhc3NvY1JlcS0+c2Vzc2lvbklkID0gKnBCdWY7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VOCk7CisgICAgbGVuIC09IHNpemVvZih0QU5JX1U4KTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHRyYW5zYWN0aW9uaWQKKyAgICBwRGlzYXNzb2NSZXEtPnRyYW5zYWN0aW9uSWQgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMTYpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgYnNzSWQKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwRGlzYXNzb2NSZXEtPmJzc0lkLCBwQnVmLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgbGVuICAtPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgcGVlck1hY0FkZHIKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRGlzYXNzb2NSZXEtPnBlZXJNYWNBZGRyLCBwQnVmLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgbGVuICAtPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgcmVhc29uQ29kZQorICAgIHBEaXNhc3NvY1JlcS0+cmVhc29uQ29kZSA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMTYpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIHBEaXNhc3NvY1JlcS0+ZG9Ob3RTZW5kT3ZlclRoZUFpciA9ICpwQnVmOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTgpOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VOCk7CisKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgcERpc2Fzc29jUmVxLT5haWQgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICBwRGlzYXNzb2NSZXEtPnNlcU51bSA9IGxpbUdldFUxNihwQnVmKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqIGVuZCBsaW1EaXNhc3NvY1JlcVNlckRlcygpICoqKi8KKworCisKKy8qKgorICogbGltRGVhdXRoUmVxU2VyRGVzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkgdXBvbiByZWNlaXZpbmcKKyAqIFNNRV9ERUFVVEhfUkVRIGZyb20gaG9zdAorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBEZWF1dGhSZXEgICAgICAgICAgIFBvaW50ZXIgdG8gdFNpclNtZURlYXV0aFJlcSBiZWluZyBleHRyYWN0ZWQKKyAqIEBwYXJhbSAgcEJ1ZiAgICAgICAgICBQb2ludGVyIHRvIHNlcmlhbGl6ZWQgYnVmZmVyCisgKgorICogQHJldHVybiByZXRDb2RlICAgICAgIEluZGljYXRlcyB3aGV0aGVyIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgZGUtc2VyaWFsaXplZCAoZVNJUl9TVUNDRVNTKSBvcgorICogICAgICAgICAgICAgICAgICAgICAgIG5vdCAoZVNJUl9GQUlMVVJFKQorICovCit0U2lyUmV0U3RhdHVzCitsaW1EZWF1dGhSZXFTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclNtZURlYXV0aFJlcSAqcERlYXV0aFJlcSwgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICB0QU5JX1MxNiBsZW4gPSAwOworCisjaWZkZWYgIFBFX0RFQlVHX0xPRzEKKyAgICB0QU5JX1U4ICAqcFRlbXAgPSBwQnVmOworI2VuZGlmCisKKyAgICBpZiAoIXBEZWF1dGhSZXEgfHwgIXBCdWYpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBwRGVhdXRoUmVxLT5tZXNzYWdlVHlwZSA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBsZW4gPSBwRGVhdXRoUmVxLT5sZW5ndGggPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU01FX0RFQVVUSF9SRVEgbGVuZ3RoICVkIGJ5dGVzIGlzOlxuIiksIGxlbik7KQorICAgIFBFTE9HMShzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cxLCBwVGVtcCwgbGVuKTspCisKKyAgICBpZiAobGVuIDwgKHRBTklfUzE2KSBzaXplb2YodEFOSV9VMzIpKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgbGVuIC09IHNpemVvZih0QU5JX1UzMik7IC8vIHNraXAgbWVzc2FnZSBoZWFkZXIKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHNlc3Npb25JZAorICAgIHBEZWF1dGhSZXEtPnNlc3Npb25JZCA9ICpwQnVmKys7CisgICAgbGVuLS07CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCB0cmFuc2FjdGlvbklkCisgICAgcERlYXV0aFJlcS0+dHJhbnNhY3Rpb25JZCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMTYpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgYnNzSWQKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRGVhdXRoUmVxLT5ic3NJZCwgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGxlbiAtPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgcGVlck1hY0FkZHIKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRGVhdXRoUmVxLT5wZWVyTWFjQWRkciwgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGxlbiAtPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgcmVhc29uQ29kZQorICAgIHBEZWF1dGhSZXEtPnJlYXNvbkNvZGUgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBTklfVTE2KTsKKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgcERlYXV0aFJlcS0+YWlkID0gbGltR2V0VTE2KHBCdWYpOworI2VuZGlmCisgICAgCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyoqKiBlbmQgbGltRGlzYXNzb2NSZXFTZXJEZXMoKSAqKiovCisKKworCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorLyoqCisgKiBsaW1Db3B5TmVpZ2hib3JJbmZvVG9DZmcoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lTWVzc2FnZXMoKSB1cG9uIHJlY2VpdmluZworICogU01FX0pPSU5fUkVRL1NNRV9SRUFTU09DX1JFUSBmcm9tIFdTTSB0byBjb252ZXJ0IG5laWdoYm9yQnNzSW5mbworICogdGhhdCBpcyBiZWluZyBqb2luZWQgdG8gYnNzRGVzY3JpcHRpb24gdXNlZCBieSBNTE0KKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBuZWlnaGJvckJzc0luZm8gIE5laWdoYm9yIEJTUyBpbmZvIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbUNvcHlOZWlnaGJvckluZm9Ub0NmZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTmVpZ2hib3JCc3NJbmZvIG5laWdoYm9yQnNzSW5mbywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UzMiAgICBsb2NhbFBvd2VyQ29uc3RyYWludHMgPSAwOworICAgIHRBTklfVTE2ICAgIGNhcHM7CisgICAgdEFOSV9VOCAgICAgcW9zQ2FwID0gMDsKKworICAgIGlmKHBzZXNzaW9uRW50cnkpCisgICAgeworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltUGh5TW9kZSA9IG5laWdoYm9yQnNzSW5mby5ud1R5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5nTGltUGh5TW9kZSA9IG5laWdoYm9yQnNzSW5mby5ud1R5cGU7CisgICAgfQorCisgICAgY2ZnU2V0Q2FwYWJpbGl0eUluZm8ocE1hYywgbmVpZ2hib3JCc3NJbmZvLmNhcGFiaWxpdHlJbmZvKTsKKworICAgIGlmIChjZmdTZXRTdHIocE1hYywgV05JX0NGR19TU0lELCAodEFOSV9VOCAqKSAmbmVpZ2hib3JCc3NJbmZvLnNzSWQuc3NJZCwKKyAgICAgICAgICAgICAgICAgIG5laWdoYm9yQnNzSW5mby5zc0lkLmxlbmd0aCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLy8vIENvdWxkIG5vdCB1cGRhdGUgU1NJRCBhdCBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgdXBkYXRlIFNTSUQgYXQgQ0ZHXG4iKSk7CisgICAgfQorCisgICAgI2lmIDAKKyAgICBpZiAoY2ZnU2V0U3RyKAorICAgICAgICAgICBwTWFjLCBXTklfQ0ZHX09QRVJBVElPTkFMX1JBVEVfU0VULAorICAgICAgICAgICAodEFOSV9VOCAqKSAmbmVpZ2hib3JCc3NJbmZvLm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlLAorICAgICAgICAgICBuZWlnaGJvckJzc0luZm8ub3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IHVwZGF0ZSBPcGVyYXRpb25hbCBSYXRlc2V0IGF0IENGRy4gTG9nIGVycm9yLgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgdXBkYXRlIE9wZXJhdGlvbmFsIFJhdGVzZXQgYXQgQ0ZHXG4iKSk7CisgICAgfQorICAgICNlbmRpZiAvLyBUTyBTVVBQT1JUIEJULUFNUAorCisgICAgaWYgKG5laWdoYm9yQnNzSW5mby5ud1R5cGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpCisgICAgeworICAgICAgICBpZiAoY2ZnU2V0U3RyKAorICAgICAgICAgICAgcE1hYywgV05JX0NGR19FWFRFTkRFRF9PUEVSQVRJT05BTF9SQVRFX1NFVCwKKyAgICAgICAgICAgICh0QU5JX1U4ICopICZuZWlnaGJvckJzc0luZm8uZXh0ZW5kZWRSYXRlU2V0LnJhdGUsCisgICAgICAgICAgICBuZWlnaGJvckJzc0luZm8uZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgdXBkYXRlIEV4dGVuZGVkIFJhdGVzZXQgYXQgQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHVwZGF0ZSBFeHRlbmRlZCBSYXRlc2V0IGF0IENGR1xuIikpOworICAgICAgICB9CisgICAgfQorI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorICAgIGlmIChuZWlnaGJvckJzc0luZm8uaGNmRW5hYmxlZCkKKyAgICAgICAgTElNX0JTU19DQVBTX1NFVChIQ0YsIHFvc0NhcCk7CisjZW5kaWYKKyAgICBpZiAobmVpZ2hib3JCc3NJbmZvLndtZUluZm9QcmVzZW50IHx8IG5laWdoYm9yQnNzSW5mby53bWVFZGNhUHJlc2VudCkKKyAgICAgICAgTElNX0JTU19DQVBTX1NFVChXTUUsIHFvc0NhcCk7CisgICAgaWYgKExJTV9CU1NfQ0FQU19HRVQoV01FLCBxb3NDYXApICYmIG5laWdoYm9yQnNzSW5mby53c21DYXBhYmxlUHJlc2VudCkKKyAgICAgICAgTElNX0JTU19DQVBTX1NFVChXU00sIHFvc0NhcCk7CisgICAgCisgICAgcE1hYy0+bGltLmdMaW1DdXJyZW50QnNzUW9zQ2FwcyA9IHFvc0NhcDsKKyAgICAKKyAgICBpZiAobmVpZ2hib3JCc3NJbmZvLnduaUluZGljYXRvcikKKyAgICAgICAgcE1hYy0+bGltLmdMaW1DdXJyZW50QnNzUHJvcENhcCA9IG5laWdoYm9yQnNzSW5mby5wcm9wSUVDYXBhYmlsaXR5OworICAgIGVsc2UKKyAgICAgICAgcE1hYy0+bGltLmdMaW1DdXJyZW50QnNzUHJvcENhcCA9IDA7CisKKyAgICBpZiAobmVpZ2hib3JCc3NJbmZvLkhUQ2Fwc1ByZXNlbnQpCisgICAgICAgIHBNYWMtPmxpbS5odENhcGFiaWxpdHlQcmVzZW50SW5CZWFjb24gPSAxOworICAgIGVsc2UKKyAgICAgICAgcE1hYy0+bGltLmh0Q2FwYWJpbGl0eVByZXNlbnRJbkJlYWNvbiA9IDA7CisgICAgaWYgKG5laWdoYm9yQnNzSW5mby5sb2NhbFBvd2VyQ29uc3RyYWludHMgJiYgcE1hYy0+bGltLmdMaW0xMWhFbmFibGUpCisgICAgeworICAgICAgICBsb2NhbFBvd2VyQ29uc3RyYWludHMgPSBuZWlnaGJvckJzc0luZm8ubG9jYWxQb3dlckNvbnN0cmFpbnRzOworICAgIH0KKyAgICBpZiAoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCwgbG9jYWxQb3dlckNvbnN0cmFpbnRzKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkNvdWxkIG5vdCB1cGRhdGUgbG9jYWwgcG93ZXIgY29uc3RyYWludCB0byBjZmcuXG4iKSk7CisgICAgfQorfSAvKioqIGVuZCBsaW1Db3B5TmVpZ2hib3JJbmZvVG9DZmcoKSAqKiovCisjZW5kaWYKKworCisvKioKKyAqIGxpbVN0YXRTZXJEZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1TZW5kU21lRGlzYXNzb2NOdGYoKSB3aGlsZSBzZW5kaW5nCisgKiBTTUVfRElTQVNTT0NfSU5EL2VXTklfU01FX0RJU0FTU09DX1JTUCB0byBob3N0CisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcEFzc29jSW5kICBQb2ludGVyIHRvIHRwQW5pU3RhU3RhdFN0cnVjdCBiZWluZyBzZW50CisgKiBAcGFyYW0gIHBCdWYgICAgICAgUG9pbnRlciB0byBzZXJpYWxpemVkIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVN0YXRTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBBbmlTdGFTdGF0U3RydWN0IHBTdGF0LCB0QU5JX1U4ICpwQnVmKQoreworI2lmZGVmICBQRV9ERUJVR19MT0cxCisgICAgdEFOSV9VOCAgKnBUZW1wID0gcEJ1ZjsKKyNlbmRpZgorCisgICAgbGltQ29weVUzMihwQnVmLCBwU3RhdC0+c2VudEFlc0Jsa3NVY2FzdEhpKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGF0LT5zZW50QWVzQmxrc1VjYXN0TG8pOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcFN0YXQtPnJlY3ZBZXNCbGtzVWNhc3RIaSk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwU3RhdC0+cmVjdkFlc0Jsa3NVY2FzdExvKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGF0LT5hZXNGb3JtYXRFcnJvclVjYXN0Q250cyk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwU3RhdC0+YWVzUmVwbGF5c1VjYXN0KTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGF0LT5hZXNEZWNyeXB0RXJyVWNhc3QpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcFN0YXQtPnNpbmdsZVJldHJ5UGt0cyk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwU3RhdC0+ZmFpbGVkVHhQa3RzKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGF0LT5hY2tUaW1lb3V0cyk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwU3RhdC0+bXVsdGlSZXRyeVBrdHMpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcFN0YXQtPmZyYWdUeENudHNIaSk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwU3RhdC0+ZnJhZ1R4Q250c0xvKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGF0LT50cmFuc21pdHRlZFBrdHNIaSk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwU3RhdC0+dHJhbnNtaXR0ZWRQa3RzTG8pOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcFN0YXQtPnBoeVN0YXRIaSk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwU3RhdC0+cGh5U3RhdExvKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGF0LT51cGxpbmtSc3NpKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGF0LT51cGxpbmtTaW5yKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGF0LT51cGxpbmtSYXRlKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGF0LT5kb3dubGlua1Jzc2kpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcFN0YXQtPmRvd25saW5rU2lucik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgbGltQ29weVUzMihwQnVmLCBwU3RhdC0+ZG93bmxpbmtSYXRlKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBsaW1Db3B5VTMyKHBCdWYsIHBTdGF0LT5uUmN2Qnl0ZXMpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIGxpbUNvcHlVMzIocEJ1ZiwgcFN0YXQtPm5YbWl0Qnl0ZXMpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlNUQVQ6IGxlbmd0aCAlZCBieXRlcyBpczpcbiIpLCBzaXplb2YodEFuaVN0YVN0YXRTdHJ1Y3QpKTspCisgICAgUEVMT0cxKHNpckR1bXBCdWYocE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPRzEsIHBUZW1wLCAgc2l6ZW9mKHRBbmlTdGFTdGF0U3RydWN0KSk7KQorCit9IC8qKiogZW5kIGxpbVN0YXRTZXJEZXMoKSAqKiovCisKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisvKioKKyAqIGxpbVNtZVdtU3RhdHVzQ2hhbmdlTnRmU2VyRGVzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltU2VuZFNtZVdtU3RhdHVzQ2hhbmdlTnRmKCkKKyAqIHRvIHNlcmlhbGl6ZSB0aGUgaGVhZGVyIGZpZWxkcyBvZiBTTUUgV00gU3RhdHVzIENoYW5nZQorICogTm90aWZpY2F0aW9uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgc3RhdHVzQ2hhbmdlQ29kZSAgICAgU3RhdHVzIENoYW5nZSBjb2RlCisgKiBAcGFyYW0gIHBCdWYgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gc2VyaWFsaXplZCBidWZmZXIKKyAqIEBwYXJhbSAgbGVuICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBsZW5ndGggYWN0dWFsbHkgdXNlZAorICogQHBhcmFtICBidWZsZW4gICAgICAgICAgICAgICBCdWZmZXIgbGVuZ3RoIHJlbWFpbmluZworICogQHJldHVybiByZXRDb2RlICAgICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkIChlU0lSX1NVQ0NFU1MpIG9yIG5vdCAoZVNJUl9GQUlMVVJFKQorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbVNtZVdtU3RhdHVzQ2hhbmdlSGVhZGVyU2VyRGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyU21lU3RhdHVzQ2hhbmdlQ29kZSBzdGF0dXNDaGFuZ2VDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2ICpsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IHNlc3Npb25JZCkKK3sKKyAgICBpZiAoYnVmbGVuIDwgKChzaXplb2YodEFOSV9VMTYpICogMikgKyBzaXplb2YodEFOSV9VMzIpKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoImxpbVNtZVdtU3RhdHVzQ2hhbmdlSGVhZGVyU2VyRGVzOiBubyBlbm91Z2ggc3BhY2UgKGJ1ZiAlZCkgXG4iKSwgYnVmbGVuKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAqbGVuID0gMDsKKworICAgIGxpbUNvcHlVMTYocEJ1ZiwgZVdOSV9TTUVfV01fU1RBVFVTX0NIQU5HRV9OVEYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICAqbGVuICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICAvLyBBY3R1YWwgbGVuZ3RoIHZhbHVlIHNoYWxsIGJlIGZpbGxlZCBsYXRlcgorICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICAqbGVuICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgCisgICAgKnBCdWYrKyA9IHNlc3Npb25JZDsKKyAgICAqbGVuICs9IHNpemVvZih0QU5JX1U4KTsKKworICAgIGxpbUNvcHlVMzIocEJ1Ziwgc3RhdHVzQ2hhbmdlQ29kZSk7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgICpsZW4gKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qKiogZW5kIGxpbVNtZVdtU3RhdHVzQ2hhbmdlSGVhZGVyU2VyRGVzKCkgKioqLworCisKKworLyoqCisgKiBsaW1SYWRpb0luZm9TZXJEZXMoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1TZW5kU21lV21TdGF0dXNDaGFuZ2VOdGYoKQorICogdG8gc2VyaWFsaXplIHRoZSByYWRhckluZm8gbWVzc2FnZQorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBSYWRhckluZm8gICAgUG9pbnRlciB0byB0U2lyUmFkYXJJbmZvCisgKiBAcGFyYW0gIHBCdWYgICAgICAgICAgUG9pbnRlciB0byBzZXJpYWxpemVkIGJ1ZmZlcgorICogQHBhcmFtICBsZW4gICAgICAgICAgIFBvaW50ZXIgdG8gbGVuZ3RoIGFjdHVhbGx5IHVzZWQgYnkgdFNpclJhZGFySW5mbworICogQHBhcmFtICBidWZsZW4gICAgICAgIExlbmd0aCByZW1haW5pbmcKKyAqCisgKiBAcmV0dXJuIHJldENvZGUgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkIChlU0lSX1NVQ0NFU1MpIG9yIG5vdCAoZVNJUl9GQUlMVVJFKQorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbVJhZGlvSW5mb1NlckRlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclJhZGFySW5mbyBwUmFkYXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMTYgKmxlbiwgdEFOSV9VMzIgYnVmbGVuKQoreworCisgICAgaWYgKGJ1ZmxlbiA8IHNpemVvZih0U2lyUmFkYXJJbmZvKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoIm5vIGVub3VnaCBzcGFjZSAoYnVmICVkKSBcbiIpLCBidWZsZW4pOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgICpwQnVmID0gcFJhZGFySW5mby0+Y2hhbm5lbE51bWJlcjsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1U4KTsKKyAgICAqbGVuICs9IHNpemVvZih0QU5JX1U4KTsKKworICAgIGxpbUNvcHlVMTYocEJ1ZiwgcFJhZGFySW5mby0+cmFkYXJQdWxzZVdpZHRoKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgKmxlbiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgbGltQ29weVUxNihwQnVmLCBwUmFkYXJJbmZvLT5udW1SYWRhclB1bHNlKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgKmxlbiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLyoqKiBlbmQgbGltUmFkaW9JbmZvU2VyRGVzKCkgKioqLworI2VuZGlmCisKKworLyoqCisgKiBsaW1QYWNrQmtnbmRTY2FuRmFpbE5vdGlmeSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVNlbmRTbWVXbVN0YXR1c0NoYW5nZU50ZigpCisgKiB0byBwYWNrIHRoZSB0U2lyQmFja2dyb3VuZFNjYW5JbmZvIG1lc3NhZ2UKKyAqCisgKi8KK3ZvaWQKK2xpbVBhY2tCa2duZFNjYW5GYWlsTm90aWZ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyU21lU3RhdHVzQ2hhbmdlQ29kZSBzdGF0dXNDaGFuZ2VDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJCYWNrZ3JvdW5kU2NhbkluZm8gcFNjYW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmICpwU21lTnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBzZXNzaW9uSWQpCit7CisKKyAgICB0QU5JX1UxNiAgICBsZW5ndGggPSAoc2l6ZW9mKHRBTklfVTE2KSAqIDIpICsgc2l6ZW9mKHRBTklfVTgpICsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJTbWVTdGF0dXNDaGFuZ2VDb2RlKSArCisgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyQmFja2dyb3VuZFNjYW5JbmZvKTsKKworI2lmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApICYmIGRlZmluZWQoQU5JX0xJVFRMRV9CWVRFX0VORElBTikKKyAgICAgICAgc2lyU3RvcmVVMTZOKCh0QU5JX1U4KikmcFNtZU50Zi0+bWVzc2FnZVR5cGUsIGVXTklfU01FX1dNX1NUQVRVU19DSEFOR0VfTlRGICk7CisgICAgICAgIHNpclN0b3JlVTE2TigodEFOSV9VOCopJnBTbWVOdGYtPmxlbmd0aCwgbGVuZ3RoKTsKKyAgICAgICAgcFNtZU50Zi0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICBzaXJTdG9yZVUzMk4oKHRBTklfVTgqKSZwU21lTnRmLT5zdGF0dXNDaGFuZ2VDb2RlLCBzdGF0dXNDaGFuZ2VDb2RlKTsKKworICAgICAgICBzaXJTdG9yZVUzMk4oKHRBTklfVTgqKSZwU21lTnRmLT5zdGF0dXNDaGFuZ2VJbmZvLmJrZ25kU2NhbkluZm8ubnVtT2ZTY2FuU3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgIHBTY2FuSW5mby0+bnVtT2ZTY2FuU3VjY2Vzcyk7CisgICAgICAgIHNpclN0b3JlVTMyTigodEFOSV9VOCopJnBTbWVOdGYtPnN0YXR1c0NoYW5nZUluZm8uYmtnbmRTY2FuSW5mby5udW1PZlNjYW5GYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgcFNjYW5JbmZvLT5udW1PZlNjYW5GYWlsdXJlKTsKKyAgICAgICAgc2lyU3RvcmVVMzJOKCh0QU5JX1U4KikmcFNtZU50Zi0+c3RhdHVzQ2hhbmdlSW5mby5ia2duZFNjYW5JbmZvLnJlc2VydmVkLAorICAgICAgICAgICAgICAgICAgICAgcFNjYW5JbmZvLT5yZXNlcnZlZCk7CisjZWxzZQorICAgICAgICBwU21lTnRmLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1dNX1NUQVRVU19DSEFOR0VfTlRGOworICAgICAgICBwU21lTnRmLT5zdGF0dXNDaGFuZ2VDb2RlID0gc3RhdHVzQ2hhbmdlQ29kZTsKKyAgICAgICAgcFNtZU50Zi0+bGVuZ3RoID0gbGVuZ3RoOworICAgICAgICBwU21lTnRmLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgIHBTbWVOdGYtPnN0YXR1c0NoYW5nZUluZm8uYmtnbmRTY2FuSW5mby5udW1PZlNjYW5TdWNjZXNzID0gcFNjYW5JbmZvLT5udW1PZlNjYW5TdWNjZXNzOworICAgICAgICBwU21lTnRmLT5zdGF0dXNDaGFuZ2VJbmZvLmJrZ25kU2NhbkluZm8ubnVtT2ZTY2FuRmFpbHVyZSA9IHBTY2FuSW5mby0+bnVtT2ZTY2FuRmFpbHVyZTsKKyAgICAgICAgcFNtZU50Zi0+c3RhdHVzQ2hhbmdlSW5mby5ia2duZFNjYW5JbmZvLnJlc2VydmVkID0gcFNjYW5JbmZvLT5yZXNlcnZlZDsKKyNlbmRpZgorfQorCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkKKworLyoqCisgKiBub25UaXRhbkJzc0ZvdW5kU2VyRGVzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltU2VuZFNtZVdtU3RhdHVzQ2hhbmdlTnRmKCkKKyAqIHRvIHNlcmlhbGl6ZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2UKKyAqIE1lc2cgPSBlV05JX1NNRV9XTV9TVEFUVVNfQ0hBTkdFX05URgorICogQ2hhbmdlIGNvZGUgPSBlU0lSX1NNRV9DQl9MRUdBQ1lfQlNTX0ZPVU5EX0JZX0FQCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBwTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwTmV3QnNzSW5mbyAgUG9pbnRlciB0byB0cFNpck5laWdoYm9yQnNzV2RzSW5mbworICogQHBhcmFtICBwQnVmICAgICAgICAgU2VuZCBkYXRhIGJ1ZmZlcgorICogQHBhcmFtICBsZW4gICAgICAgICAgTGVuZ3RoIG9mIG1lc3NhZ2UKKyAqIEBwYXJhbSAgYnVmbGVuICAgICAgIExlbmd0aCByZW1haW5pbmcKKyAqCisgKiBAcmV0dXJuIHJldENvZGUgICAgICBJbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCAoZVNJUl9TVUNDRVNTKSBvciBub3QgKGVTSVJfRkFJTFVSRSkKKyAqLworCit0U2lyUmV0U3RhdHVzIG5vblRpdGFuQnNzRm91bmRTZXJEZXMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdHBTaXJOZWlnaGJvckJzc1dkc0luZm8gcE5ld0Jzc0luZm8sCisgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICB0QU5JX1UxNiAqbGVuLAorICAgIHRBTklfVTggc2Vzc2lvbklkICkKK3sKK3RBTklfVTggKnBUZW1wID0gcEJ1ZjsKK3RBTklfVTE2IGxlbmd0aCA9IDA7Cit0QU5JX1UzMiBidWZMZW4gPSBzaXplb2YoIHRTaXJTbWVXbVN0YXR1c0NoYW5nZU50ZiApOworCisgIC8vIFNlcmlhbGl6ZSB0aGUgaGVhZGVyIChsZW5ndGggdG8gYmUgZmlsbGVkIGxhdGVyKQorICBpZiggZVNJUl9TVUNDRVNTICE9IGxpbVNtZVdtU3RhdHVzQ2hhbmdlSGVhZGVyU2VyRGVzKAorICAgICAgICBwTWFjLAorICAgICAgICBlU0lSX1NNRV9DQl9MRUdBQ1lfQlNTX0ZPVU5EX0JZX0FQLAorICAgICAgICBwQnVmLAorICAgICAgICAmbGVuZ3RoLAorICAgICAgICBidWZMZW4sCisgICAgICAgIHNlc3Npb25JZCkpCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCJIZWFkZXIgU2VyRGVzIGZhaWxlZCBcbiIpKTsKKyAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICB9CisgIHBCdWYgKz0gbGVuZ3RoOworICBidWZMZW4gLT0gbGVuZ3RoOworCisgIC8vIFNlcmlhbGl6ZSB0U2lyTmVpZ2hib3JCc3NXZHNJbmZvCisgIGxlbmd0aCA9IGxpbUNvcHlOZWlnaGJvcldkc0luZm8oIHBNYWMsCisgICAgICBwQnVmLAorICAgICAgcE5ld0Jzc0luZm8gKTsKKyAgcEJ1ZiArPSBsZW5ndGg7CisgIGJ1ZkxlbiAtPSBsZW5ndGg7CisKKyAgLy8gVXBkYXRlIHRTaXJTbWVXbVN0YXR1c0NoYW5nZU50Zi5sZW5ndGgKKyAgcEJ1ZiA9IHBUZW1wOworICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgIGxpbUNvcHlVMTYocEJ1ZiwgbGVuZ3RoKTsKKworICAvLyBVcGRhdGUgdGhlIHRvdGFsIGxlbmd0aCB0byBiZSByZXR1cm5lZAorICAqbGVuID0gbGVuZ3RoOworCisgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8qKiogZW5kIG5vblRpdGFuQnNzRm91bmRTZXJEZXMoKSAqKiovCisKKy8qKgorICogbGltSXNTbWVTd2l0Y2hDaGFubmVsUmVxVmFsaWQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX1NXSVRDSF9DSExfUkVRIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKkxPR0lDOgorICogTWVzc2FnZSB2YWxpZGl0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwQnVmICAgIC0gUG9pbnRlciB0byBhIHNlcmlhbGl6ZWQgU01FX1NXSVRDSF9DSExfUkVRIG1lc3NhZ2UKKyAqIEBwYXJhbSAgcFNtZU1zZyAtIFBvaW50ZXIgdG8gYSB0U2lyc21lU3dpdGNoQ2hhbm5lbFJlcSBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gdHJ1ZSBpZiBTTUVfU1dJVENIX0NITF9SRVEgbWVzc2FnZSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5CisgKiAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAqLworCit0QU5JX0JPT0xFQU4KK2xpbUlzU21lU3dpdGNoQ2hhbm5lbFJlcVZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpclNtZVN3aXRjaENoYW5uZWxSZXEgcFNtZU1zZykKK3sKKyAgICBwU21lTXNnLT5tZXNzYWdlVHlwZSA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7ICAKKworICAgIHBTbWVNc2ctPmxlbmd0aCA9IGxpbUdldFUxNihwQnVmKTsgCisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgcFNtZU1zZy0+dHJhbnNhY3Rpb25JZCA9IGxpbUdldFUxNihwQnVmKTsgCisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgcFNtZU1zZy0+Y2hhbm5lbElkID0gKnBCdWY7CisgICAgcEJ1ZisrOworICAKKyAgICBwU21lTXNnLT5jYk1vZGUgPSBsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgcFNtZU1zZy0+ZHRpbUZhY3RvciA9IGxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICBpZiAocFNtZU1zZy0+bGVuZ3RoICE9IFNJUl9TTUVfQ0hBTk5FTF9TV0lUQ0hfU0laRSkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgbGVuZ3RoICVkIFxuIiksIHBTbWVNc2ctPmxlbmd0aCk7KQorICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIH0KKworICAgIC8vIGR0aW1GYWN0b3Igc2hvdWxkIG5vdCBiZSB0b28gbGFyZ2UKKyAgICBpZiAocFNtZU1zZy0+ZHRpbUZhY3RvciA+IFNJUl9NQVhfRFRJTV9GQUNUT1IpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIGR0aW1GYWN0b3IgJWQgXG4iKSwgcFNtZU1zZy0+ZHRpbUZhY3Rvcik7KQorICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBlQU5JX0JPT0xFQU5fVFJVRTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisvKioKKyAqIGxpbUlzU21lR2V0QXNzb2NTVEFzUmVxVmFsaWQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX0dFVF9BU1NPQ19TVEFTX1JFUSBtZXNzYWdlIGZyb20gYXBwbGljYXRpb24uCisgKgorICpMT0dJQzoKKyAqIE1lc3NhZ2UgdmFsaWRpdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcEJ1ZiAgICAtIFBvaW50ZXIgdG8gYSBzZXJpYWxpemVkIFNNRV9HRVRfQVNTT0NfU1RBU19SRVEgbWVzc2FnZQorICogQHBhcmFtICBwU21lTXNnIC0gUG9pbnRlciB0byBhIHRTaXJTbWVHZXRBc3NvY1NUQXNSZXEgc3RydWN0dXJlCisgKiBAcmV0dXJuIHRydWUgaWYgU01FX0dFVF9BU1NPQ19TVEFTX1JFUSBtZXNzYWdlIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkKKyAqICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICovCit0QU5JX0JPT0xFQU4KK2xpbUlzU21lR2V0QXNzb2NTVEFzUmVxVmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVHZXRBc3NvY1NUQXNSZXEgcEdldEFzc29jU1RBc1JlcSwgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICB0QU5JX1MxNiBsZW4gPSAwOworCisgICAgcEdldEFzc29jU1RBc1JlcS0+bWVzc2FnZVR5cGUgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgbGVuID0gcEdldEFzc29jU1RBc1JlcS0+bGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGlmIChsZW4gPCAodEFOSV9TMTYpIHNpemVvZih0QU5JX1UzMikpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBsZW4gLT0gc2l6ZW9mKHRBTklfVTMyKTsgLy8gc2tpcCBtZXNzYWdlIGhlYWRlcgorICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgYnNzSWQKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwR2V0QXNzb2NTVEFzUmVxLT5ic3NJZCwgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IG1vZElkCisgICAgcEdldEFzc29jU1RBc1JlcS0+bW9kSWQgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IHBVc3JDb250ZXh0CisgICAgcEdldEFzc29jU1RBc1JlcS0+cFVzckNvbnRleHQgPSAodm9pZCAqKWxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMzIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgcFNhcEV2ZW50Q2FsbGJhY2sKKyAgICBwR2V0QXNzb2NTVEFzUmVxLT5wU2FwRXZlbnRDYWxsYmFjayA9ICh2b2lkICopbGltR2V0VTMyKHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBsZW4gIC09IHNpemVvZih0QU5JX1UzMik7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBwQXNzb2NTdGFzQXJyYXkKKyAgICBwR2V0QXNzb2NTVEFzUmVxLT5wQXNzb2NTdGFzQXJyYXkgPSAodm9pZCAqKWxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU01FX0dFVF9BU1NPQ19TVEFTX1JFUSBsZW5ndGggY29uc3VtZWQgJWQgYnl0ZXMgXG4iKSwgbGVuKTspCisKKyAgICBpZiAobGVuIDwgMCkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNNRV9HRVRfQVNTT0NfU1RBU19SRVEgaW52YWxpZCBsZW5ndGhcbiIpKTspCisgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFOworfQorCisvKioKKyAqIGxpbVRraXBDbnRyTWVhc1JlcVNlckRlcygpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVNZXNzYWdlcygpIHVwb24gcmVjZWl2aW5nCisgKiBlV05JX1NNRV9US0lQX0NOVFJfTUVBU19SRVEgZnJvbSBob3N0IEhERAorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHRwU2lyU21lVGtpcENudHJNZWFzUmVxICBQb2ludGVyIHRvIHRTaXJTbWVUa2lwQ250ck1lYXNSZXEgYmVpbmcgZXh0cmFjdGVkCisgKiBAcGFyYW0gIHBCdWYgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHNlcmlhbGl6ZWQgYnVmZmVyCisgKiBAcmV0dXJuIHJldENvZGUgICAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGUtc2VyaWFsaXplZCAoZVNJUl9TVUNDRVNTKSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IChlU0lSX0ZBSUxVUkUpCisgKi8KK3RTaXJSZXRTdGF0dXMKK2xpbVRraXBDbnRyTWVhc1JlcVNlckRlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZVRraXBDbnRyTWVhc1JlcSAgcFRraXBDbnRyTWVhc1JlcSwgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICB0QU5JX1MxNiBsZW4gPSAwOworCisjaWZkZWYgUEVfREVCVUdfTE9HMQorICAgIHRBTklfVTggICpwVGVtcCA9IHBCdWY7CisjZW5kaWYKKworICAgIHBUa2lwQ250ck1lYXNSZXEtPm1lc3NhZ2VUeXBlID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGxlbiA9IHBUa2lwQ250ck1lYXNSZXEtPmxlbmd0aCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUVfVEtJUF9DTlRSX01FQVNfUkVRIGxlbmd0aCAlZCBieXRlcyBpczpcbiIpLCBsZW4pOykKKyAgICBQRUxPRzEoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMSwgcFRlbXAsIGxlbik7KQorCisgICAgaWYgKGxlbiA8ICh0QU5JX1MxNikgc2l6ZW9mKHRBTklfVTMyKSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMzIpOyAvLyBza2lwIG1lc3NhZ2UgaGVhZGVyCisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBzZXNzaW9uSWQKKyAgICBwVGtpcENudHJNZWFzUmVxLT5zZXNzaW9uSWQgPSAqcEJ1ZisrOworICAgIGxlbi0tOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgdHJhbnNhY3Rpb25JZAorICAgIHBUa2lwQ250ck1lYXNSZXEtPnRyYW5zYWN0aW9uSWQgPSBsaW1HZXRVMTYocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgIGxlbiAtPSBzaXplb2YodEFOSV9VMTYpOyAKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IGJzc0lkCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcFRraXBDbnRyTWVhc1JlcS0+YnNzSWQsIHBCdWYsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBsZW4gLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IGJFbmFibGUKKyAgICBwVGtpcENudHJNZWFzUmVxLT5iRW5hYmxlID0gKnBCdWYrKzsKKyAgICBsZW4gLS07CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUVfVEtJUF9DTlRSX01FQVNfUkVRIGxlbmd0aCBjb25zdW1lZCAlZCBieXRlcyBcbiIpLCBsZW4pOykKKyAgICAKKyAgICBpZiAobGVuKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU01FX1RLSVBfQ05UUl9NRUFTX1JFUSBpbnZhbGlkIFxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKioKKyAqIGxpbUlzU21lR2V0V1BTUEJDU2Vzc2lvbnNSZXFWYWxpZCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVHZXRXUFNQQkNTZXNzaW9ucygpIHVwb24KKyAqIHJlY2VpdmluZyBxdWVyeSBXUFMgUEJDIG92ZXJsYXAgaW5mb3JtYXRpb24gbWVzc2FnZSBmcm9tIGFwcGxpY2F0aW9uLgorICoKKyAqTE9HSUM6CisgKiBNZXNzYWdlIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBCdWYgICAgLSBQb2ludGVyIHRvIGEgc2VyaWFsaXplZCBTTUVfR0VUX1dQU1BCQ19TRVNTSU9OX1JFUSBtZXNzYWdlCisgKiBAcGFyYW0gIHBHZXRXUFNQQkNTZXNzaW9uc1JlcSAtIFBvaW50ZXIgdG8gYSB0U2lyU21lR2V0V1BTUEJDU2Vzc2lvbnNSZXEgc3RydWN0dXJlCisgKiBAcmV0dXJuIHRydWUgaWYgU01FX0dFVF9XUFNQQkNfU0VTU0lPTl9SRVEgbWVzc2FnZSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5CisgKiAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAqLworIAordFNpclJldFN0YXR1cworbGltSXNTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcVZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcSAqcEdldFdQU1BCQ1Nlc3Npb25zUmVxLCB0QU5JX1U4ICpwQnVmKQoreworICAgIHRBTklfUzE2IGxlbiA9IDA7CisKKyAgICBQRUxPRzEoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMSwgcEJ1Ziwgc2l6ZW9mKHRTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcSkpOykKKyAgICAKKyAgICBwR2V0V1BTUEJDU2Vzc2lvbnNSZXEtPm1lc3NhZ2VUeXBlID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGxlbiA9IHBHZXRXUFNQQkNTZXNzaW9uc1JlcS0+bGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGlmIChsZW4gPCAodEFOSV9TMTYpIHNpemVvZih0QU5JX1UzMikpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBsZW4gLT0gc2l6ZW9mKHRBTklfVTMyKTsgLy8gc2tpcCBtZXNzYWdlIGhlYWRlcgorICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgLy8gRXh0cmFjdCBwVXNyQ29udGV4dAorICAgIHBHZXRXUFNQQkNTZXNzaW9uc1JlcS0+cFVzckNvbnRleHQgPSAodm9pZCAqKWxpbUdldFUzMihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisgICAgbGVuICAtPSBzaXplb2YodEFOSV9VMzIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgcFNhcEV2ZW50Q2FsbGJhY2sKKyAgICBwR2V0V1BTUEJDU2Vzc2lvbnNSZXEtPnBTYXBFdmVudENhbGxiYWNrID0gKHZvaWQgKilsaW1HZXRVMzIocEJ1Zik7CisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBFeHRyYWN0IGJzc0lkCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcEdldFdQU1BCQ1Nlc3Npb25zUmVxLT5ic3NJZCwgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAKKyAgICAvLyBFeHRyYWN0IE1BQyBhZGRyZXNzIG9mIFN0YXRpb24gdG8gYmUgcmVtb3ZlZAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBHZXRXUFNQQkNTZXNzaW9uc1JlcS0+cFJlbW92ZU1hYywgcEJ1Ziwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUVfR0VUX0FTU09DX1NUQVNfUkVRIGxlbmd0aCBjb25zdW1lZCAlZCBieXRlcyBcbiIpLCBsZW4pOykKKworICAgIGlmIChsZW4gPCAwKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU01FX0dFVF9XUFNQQkNfU0VTU0lPTl9SRVEgaW52YWxpZCBsZW5ndGhcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworI2VuZGlmCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBsaW1HZXRTZXNzaW9uSW5mbworXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNlc3Npb25JZCBhbmQgdHJhbnNhY3Rpb25JZAorXCAgICAgICBvZiBhIG1lc3NhZ2UuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBtZXNzYWdlIHN0cnVjdHVyZSAKK1wgICAgICAgaXMgb2YgZm9ybWF0OgorXCAgICAgICAgICB0QU5JX1UxNiAgIG1lc3NhZ2VUeXBlCitcICAgICAgICAgIHRBTklfVTE2ICAgbWVzc2FnZUxlbmd0aAorXCAgICAgICAgICB0QU5JX1U4ICAgIHNlc3Npb25JZAorXCAgICAgICAgICB0QU5JX1UxNiAgIHRyYW5zYWN0aW9uSWQKK1xwYXJhbSAgcE1hYyAgICAgICAgICAtIHBNYWMgZ2xvYmFsIHN0cnVjdHVyZQorXHBhcmFtICAqcEJ1ZiAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgbWVzc2FnZSBidWZmZXIKK1xwYXJhbSAgc2Vzc2lvbklkICAgICAtIHJldHVybmVkIHNlc3Npb24gaWQgdmFsdWUKK1xwYXJhbSAgdHJhbnNhY3Rpb25JZCAtIHJldHVybmVkIHRyYW5zYWN0aW9uIElEIHZhbHVlCitccmV0dXJuIE5vbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1HZXRTZXNzaW9uSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4ICpzZXNzaW9uSWQsIHRBTklfVTE2ICp0cmFuc2FjdGlvbklkKQoreworICAgIGlmICghcEJ1ZikKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiTlVMTCBwdHIgcmVjZWl2ZWQuIFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOyAgIC8vIHNraXAgbWVzc2FnZSB0eXBlIAorICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsgICAvLyBza2lwIG1lc3NhZ2UgbGVuZ3RoCisKKyAgICAqc2Vzc2lvbklkID0gKnBCdWY7ICAgICAgICAgICAgLy8gZ2V0IHNlc3Npb25JZAorICAgIHBCdWYrKzsgICAgCisgICAgKnRyYW5zYWN0aW9uSWQgPSBsaW1HZXRVMTYocEJ1Zik7ICAvLyBnZXQgdHJhbnNhY3Rpb25JZAorCisgICAgcmV0dXJuOworfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorCisvKioKKyAqIGxpbVVwZGF0ZUFQV1BTSUVzUmVxU2VyRGVzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyB0byBkZXNlcmlhbGl6ZSBVcGRhdGVBUFdQU0lFcyBtZXNzYWdlCisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcFVwZGF0ZUFQV1BTSUVzUmVxICBQb2ludGVyIHRvIHRTaXJVcGRhdGVBUFdQU0lFc1JlcSBiZWluZworICogICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkCisgKiBAcGFyYW0gIHBCdWYgICAgICAgICAgICBQb2ludGVyIHRvIHNlcmlhbGl6ZWQgYnVmZmVyCisgKgorICogQHJldHVybiByZXRDb2RlICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlLXNlcmlhbGl6ZWQgKGVTSVJfU1VDQ0VTUykgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCAoZVNJUl9GQUlMVVJFKQorICovCisKK3RTaXJSZXRTdGF0dXMKK2xpbVVwZGF0ZUFQV1BTSUVzUmVxU2VyRGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyVXBkYXRlQVBXUFNJRXNSZXEgcFVwZGF0ZUFQV1BTSUVzUmVxLCB0QU5JX1U4ICpwQnVmKQoreworICAgIHRBTklfUzE2IGxlbiA9IDA7CisKKyAgICBQRUxPRzEoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMSwgcEJ1Ziwgc2l6ZW9mKHRTaXJVcGRhdGVBUFdQU0lFc1JlcSkpOykKKworICAgIGlmICghcFVwZGF0ZUFQV1BTSUVzUmVxIHx8ICFwQnVmKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgcFVwZGF0ZUFQV1BTSUVzUmVxLT5tZXNzYWdlVHlwZSA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBsZW4gPSBwVXBkYXRlQVBXUFNJRXNSZXEtPmxlbmd0aCA9IGxpbUdldFUxNihwQnVmKTsKKyAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICBpZiAobGVuIDwgKHRBTklfUzE2KSBzaXplb2YodEFOSV9VMzIpKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgbGVuIC09IHNpemVvZih0QU5JX1UzMik7IC8vIHNraXAgbWVzc2FnZSBoZWFkZXIKKyAgICBpZiAobGltQ2hlY2tSZW1haW5pbmdMZW5ndGgocE1hYywgbGVuKSA9PSBlU0lSX0ZBSUxVUkUpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICAgIAorICAgIC8vIEV4dHJhY3QgdHJhbnNhY3Rpb25JZAorICAgIHBVcGRhdGVBUFdQU0lFc1JlcS0+dHJhbnNhY3Rpb25JZCA9IGxpbUdldFUxNiggcEJ1ZiApOworICAgIHBCdWYgKz0gc2l6ZW9mKCB0QU5JX1UxNiApOworICAgIGxlbiAtPSBzaXplb2YoIHRBTklfVTE2ICk7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBic3NJZAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBVcGRhdGVBUFdQU0lFc1JlcS0+YnNzSWQsIHBCdWYsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICBsZW4gIC09IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBzZXNzaW9uSWQKKyAgICBwVXBkYXRlQVBXUFNJRXNSZXEtPnNlc3Npb25JZCA9ICpwQnVmKys7CisgICAgbGVuLS07CisgICAgaWYgKGxpbUNoZWNrUmVtYWluaW5nTGVuZ3RoKHBNYWMsIGxlbikgPT0gZVNJUl9GQUlMVVJFKQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICAgLy8gRXh0cmFjdCBBUFdQU0lFcworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0U2lyQVBXUFNJRXMgKikgJnBVcGRhdGVBUFdQU0lFc1JlcS0+QVBXUFNJRXMsIHBCdWYsIHNpemVvZih0U2lyQVBXUFNJRXMpKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyQVBXUFNJRXMpOworICAgIGxlbiAgLT0gc2l6ZW9mKHRTaXJBUFdQU0lFcyk7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJTTUVfVVBEQVRFX0FQV1BTSUVfUkVRIGxlbmd0aCBjb25zdW1lZCAlZCBieXRlcyBcbiIpLCBsZW4pOykKKworICAgIGlmIChsZW4gPCAwKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiU01FX1VQREFURV9BUFdQU0lFX1JFUSBpbnZhbGlkIGxlbmd0aFxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqIGVuZCBsaW1TZXRDb250ZXh0UmVxU2VyRGVzKCkgKioqLworCisvKioKKyAqIGxpbVVwZGF0ZUFQV1BBUlNOSUVzUmVxU2VyRGVzICgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdG8gZGVzZXJpYWxpemUgVXBkYXRlQVBXUFNJRXMgbWVzc2FnZQorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBVcGRhdGVBUFdQQVJTTklFc1JlcSAgUG9pbnRlciB0byB0cFNpclVwZGF0ZUFQV1BBUlNOSUVzUmVxIGJlaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQKKyAqIEBwYXJhbSAgcEJ1ZiAgICAgICAgICAgIFBvaW50ZXIgdG8gc2VyaWFsaXplZCBidWZmZXIKKyAqCisgKiBAcmV0dXJuIHJldENvZGUgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgZGUtc2VyaWFsaXplZCAoZVNJUl9TVUNDRVNTKSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgbm90IChlU0lSX0ZBSUxVUkUpCisgKi8KKwordFNpclJldFN0YXR1cworbGltVXBkYXRlQVBXUEFSU05JRXNSZXFTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJVcGRhdGVBUFdQQVJTTklFc1JlcSBwVXBkYXRlQVBXUEFSU05JRXNSZXEsIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9TMTYgbGVuID0gMDsKKworICAgIFBFTE9HMShzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0cxLCBwQnVmLCBzaXplb2YodFNpclVwZGF0ZUFQV1BBUlNOSUVzUmVxKSk7KQorCisgICAgaWYgKCFwVXBkYXRlQVBXUEFSU05JRXNSZXEgfHwgIXBCdWYpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBwVXBkYXRlQVBXUEFSU05JRXNSZXEtPm1lc3NhZ2VUeXBlID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGxlbiA9IHBVcGRhdGVBUFdQQVJTTklFc1JlcS0+bGVuZ3RoID0gbGltR2V0VTE2KHBCdWYpOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgIGlmIChsZW4gPCAodEFOSV9TMTYpIHNpemVvZih0QU5JX1UzMikpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICBsZW4gLT0gc2l6ZW9mKHRBTklfVTMyKTsgLy8gc2tpcCBtZXNzYWdlIGhlYWRlcgorICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgdHJhbnNhY3Rpb25JZAorICAgIHBVcGRhdGVBUFdQQVJTTklFc1JlcS0+dHJhbnNhY3Rpb25JZCA9IGxpbUdldFUxNiggcEJ1ZiApOworICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICBsZW4gLT0gc2l6ZW9mKCB0QU5JX1UxNiApOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgYnNzSWQKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwVXBkYXRlQVBXUEFSU05JRXNSZXEtPmJzc0lkLCBwQnVmLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgbGVuICAtPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3Qgc2Vzc2lvbklkCisgICAgcFVwZGF0ZUFQV1BBUlNOSUVzUmVxLT5zZXNzaW9uSWQgPSAqcEJ1ZisrOworICAgIGxlbi0tOworICAgIGlmIChsaW1DaGVja1JlbWFpbmluZ0xlbmd0aChwTWFjLCBsZW4pID09IGVTSVJfRkFJTFVSRSkKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIC8vIEV4dHJhY3QgQVBXUEFSU05JRXMKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodFNpclJTTmllICopICZwVXBkYXRlQVBXUEFSU05JRXNSZXEtPkFQV1BBUlNOSUVzLCBwQnVmLCBzaXplb2YodFNpclJTTmllKSk7CisgICAgcEJ1ZiArPSBzaXplb2YodFNpclJTTmllKTsKKyAgICBsZW4gIC09IHNpemVvZih0U2lyUlNOaWUpOworCisgICAgaWYgKGxlbiA8IDApCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJTTUVfR0VUX1dQU1BCQ19TRVNTSU9OX1JFUSBpbnZhbGlkIGxlbmd0aFxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvKioqIGVuZCBsaW1VcGRhdGVBUFdQQVJTTklFc1JlcVNlckRlcygpICoqKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlckRlc1V0aWxzLmggYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlckRlc1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlOTIwYgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2VyRGVzVXRpbHMuaApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1TZXJEZXNVdGlscy5oIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGRlZmluaXRpb25zCisgKiBMSU0gdXNlcyB3aGlsZSBwcm9jZXNzaW5nIG1lc3NhZ2VzIGZyb20gdXBwZXIgbGF5ZXIgc29mdHdhcmUKKyAqIG1vZHVsZXMKKyAqIEF1dGhvcjogICAgICAgIENoYW5kcmEgTW9kdW11ZGkKKyAqIERhdGU6ICAgICAgICAgIDEwLzIwLzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfX0xJTV9TRVJERVNfVVRJTFNfSAorI2RlZmluZSBfX0xJTV9TRVJERVNfVVRJTFNfSAorCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAiYW5pU3lzdGVtRGVmcy5oIgorI2luY2x1ZGUgInNpck1hY1Byb3REZWYuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltUHJvcEV4dHNVdGlscy5oIgorCit0U2lyUmV0U3RhdHVzICAgbGltU3RhcnRCc3NSZXFTZXJEZXModHBBbmlTaXJHbG9iYWwsIHRwU2lyU21lU3RhcnRCc3NSZXEsIHRBTklfVTggKik7Cit0U2lyUmV0U3RhdHVzICAgbGltU3RvcEJzc1JlcVNlckRlcyh0cEFuaVNpckdsb2JhbCwgdHBTaXJTbWVTdG9wQnNzUmVxLCB0QU5JX1U4ICopOwordFNpclJldFN0YXR1cyAgIGxpbUpvaW5SZXFTZXJEZXModHBBbmlTaXJHbG9iYWwsIHRwU2lyU21lSm9pblJlcSwgdEFOSV9VOCAqKTsKK3ZvaWQgICAgICAgICAgICBsaW1Bc3NvY0luZFNlckRlcyh0cEFuaVNpckdsb2JhbCwgdHBMaW1NbG1Bc3NvY0luZCwgdEFOSV9VOCAqLCB0cFBFU2Vzc2lvbik7Cit2b2lkICAgICAgICAgICAgbGltUmVhc3NvY0luZFNlckRlcyh0cEFuaVNpckdsb2JhbCwgdHBMaW1NbG1SZWFzc29jSW5kLCB0QU5JX1U4ICosIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordFNpclJldFN0YXR1cyAgIGxpbUFzc29jQ25mU2VyRGVzKHRwQW5pU2lyR2xvYmFsLCB0cFNpclNtZUFzc29jQ25mLCB0QU5JX1U4ICopOwordFNpclJldFN0YXR1cyAgIGxpbURpc2Fzc29jQ25mU2VyRGVzKHRwQW5pU2lyR2xvYmFsLCB0cFNpclNtZURpc2Fzc29jQ25mLCB0QU5JX1U4ICopOwordFNpclJldFN0YXR1cyAgIGxpbVNldENvbnRleHRSZXFTZXJEZXModHBBbmlTaXJHbG9iYWwsIHRwU2lyU21lU2V0Q29udGV4dFJlcSwgdEFOSV9VOCAqKTsKK3RTaXJSZXRTdGF0dXMgICBsaW1EaXNhc3NvY1JlcVNlckRlcyh0cEFuaVNpckdsb2JhbCwgdFNpclNtZURpc2Fzc29jUmVxICosIHRBTklfVTggKik7Cit0U2lyUmV0U3RhdHVzICAgbGltRGVhdXRoUmVxU2VyRGVzKHRwQW5pU2lyR2xvYmFsLCB0U2lyU21lRGVhdXRoUmVxICosIHRBTklfVTggKik7Cit2b2lkICAgICAgICAgICAgbGltQXV0aEluZFNlckRlcyh0cEFuaVNpckdsb2JhbCwgdHBMaW1NbG1BdXRoSW5kLCB0QU5JX1U4ICopOwordm9pZCAgICAgICAgICAgIGxpbVN0YXRTZXJEZXModHBBbmlTaXJHbG9iYWwsIHRwQW5pU3RhU3RhdFN0cnVjdCwgdEFOSV9VOCAqKTsKK3ZvaWQgICAgICAgICAgICBsaW1HZXRTZXNzaW9uSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICosIHRBTklfVTggKiwgdEFOSV9VMTYgKik7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCit0U2lyUmV0U3RhdHVzICAgbGltTWVhc3VyZW1lbnRSZXFTZXJEZXModHBBbmlTaXJHbG9iYWwsIHRwU2lyU21lTWVhc3VyZW1lbnRSZXEsIHRBTklfVTggKik7Cit2b2lkICAgICAgICAgICAgbGltTWVhc3VyZW1lbnRJbmRTZXJEZXModHBBbmlTaXJHbG9iYWwsIHRBTklfVTggKik7Cit2b2lkICAgICAgICAgICAgbGltQ29weU5laWdoYm9ySW5mb1RvQ2ZnKHRwQW5pU2lyR2xvYmFsLCB0U2lyTmVpZ2hib3JCc3NJbmZvKTsKK3RTaXJSZXRTdGF0dXMgICBsaW1XZHNSZXFTZXJEZXModHBBbmlTaXJHbG9iYWwsIHRwU2lyU21lU2V0V2RzSW5mb1JlcSwgdEFOSV9VOCAqKTsgCit0U2lyUmV0U3RhdHVzICAgbGltUmFkaW9JbmZvU2VyRGVzKHRwQW5pU2lyR2xvYmFsLCB0cFNpclJhZGFySW5mbywgdEFOSV9VOCAqLCB0QU5JX1UxNiAqLCB0QU5JX1UzMik7Cit0U2lyUmV0U3RhdHVzICAgbGltU21lV21TdGF0dXNDaGFuZ2VIZWFkZXJTZXJEZXModHBBbmlTaXJHbG9iYWwsIHRTaXJTbWVTdGF0dXNDaGFuZ2VDb2RlLCB0QU5JX1U4ICosIHRBTklfVTE2ICosIHRBTklfVTMyLCB0QU5JX1U4KTsKK3RTaXJSZXRTdGF0dXMgICBub25UaXRhbkJzc0ZvdW5kU2VyRGVzKCB0cEFuaVNpckdsb2JhbCwgdHBTaXJOZWlnaGJvckJzc1dkc0luZm8sIHRBTklfVTggKiwgdEFOSV9VMTYgKiwgdEFOSV9VOCApOworI2VuZGlmCisKK3ZvaWQgICAgICAgICAgICBsaW1QYWNrQmtnbmRTY2FuRmFpbE5vdGlmeSh0cEFuaVNpckdsb2JhbCwgdFNpclNtZVN0YXR1c0NoYW5nZUNvZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyQmFja2dyb3VuZFNjYW5JbmZvLCB0U2lyU21lV21TdGF0dXNDaGFuZ2VOdGYgKiwgdEFOSV9VOCk7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKK3RBTklfVTMyIGxpbUNvcHlOZWlnaGJvckJzc0luZm8odHBBbmlTaXJHbG9iYWwsIHRBTklfVTggKiwgdHBTaXJOZWlnaGJvckJzc0luZm8pOwordEFOSV9VMzIgbGltR2V0TmVpZ2hib3JCc3NJbmZvKHRwQW5pU2lyR2xvYmFsLCB0cFNpck5laWdoYm9yQnNzSW5mbywgdEFOSV9VOCAqKTsKKyNlbmRpZgorCit0U2lyUmV0U3RhdHVzIGxpbVJlbW92ZUtleVJlcVNlckRlcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZVJlbW92ZUtleVJlcSBwUmVtb3ZlS2V5UmVxLCB0QU5JX1U4ICogcEJ1Zik7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCit0QU5JX0JPT0xFQU4gICAgbGltSXNTbWVHZXRBc3NvY1NUQXNSZXFWYWxpZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZUdldEFzc29jU1RBc1JlcSBwR2V0QXNzb2NTVEFzUmVxLCB0QU5JX1U4ICpwQnVmKTsKK3RTaXJSZXRTdGF0dXMgICBsaW1Ua2lwQ250ck1lYXNSZXFTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVUa2lwQ250ck1lYXNSZXEgIHB0a2lwQ250ck1lYXNSZXEsIHRBTklfVTggKnBCdWYpOworCit0U2lyUmV0U3RhdHVzIGxpbVVwZGF0ZUFQV1BTSUVzUmVxU2VyRGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyVXBkYXRlQVBXUFNJRXNSZXEgcFVwZGF0ZUFQV1BTSUVzUmVxLCB0QU5JX1U4ICpwQnVmKTsKK3RTaXJSZXRTdGF0dXMgbGltVXBkYXRlQVBXUEFSU05JRXNSZXFTZXJEZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJVcGRhdGVBUFdQQVJTTklFc1JlcSBwVXBkYXRlQVBXUEFSU05JRXNSZXEsIHRBTklfVTggKnBCdWYpOworI2VuZGlmCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCit0QU5JX0JPT0xFQU4gbGltSXNTbWVTd2l0Y2hDaGFubmVsUmVxVmFsaWQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTggKiwgdHBTaXJTbWVTd2l0Y2hDaGFubmVsUmVxKTsKKyNlbmRpZgorCisvLyBCeXRlIFN0cmluZyA8LS0+IHRBTklfVTE2L3RBTklfVTMyIGNvcHkgZnVuY3Rpb25zCitzdGF0aWMgaW5saW5lIHZvaWQgbGltQ29weVUxNih0QU5JX1U4ICpwdHIsIHRBTklfVTE2IHUxNlZhbCkKK3sKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApCisgICAgKnB0cisrID0gKHRBTklfVTgpICgodTE2VmFsID4+IDgpICYgMHhmZik7ICAgIAorICAgICpwdHIgICA9ICh0QU5JX1U4KSAodTE2VmFsICYgMHhmZik7CisjZWxpZiAoKGRlZmluZWQoQU5JX09TX1RZUEVfT1NYKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKSB8fCBcCisgICAgICAgKGRlZmluZWQoQU5JX09TX1RZUEVfV0lORE9XUykgJiYgZGVmaW5lZChBTklfTElUVExFX0JZVEVfRU5ESUFOKSkgfHwgXAorICAgICAgIChkZWZpbmVkKEFOSV9PU19UWVBFX0FNU1MpICYmIGRlZmluZWQoQU5JX0xJVFRMRV9CWVRFX0VORElBTikpIHx8IFwKKyAgICAgICAoZGVmaW5lZChBTklfT1NfVFlQRV9BTkRST0lEKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKSkKKyAgICAqcHRyKysgPSAodEFOSV9VOCkgKHUxNlZhbCAmIDB4ZmYpOworICAgICpwdHIgICA9ICh0QU5JX1U4KSAoKHUxNlZhbCA+PiA4KSAmIDB4ZmYpOworI2Vsc2UKKyNlcnJvciAiVW5rbm93biBjb21iaW5hdGlvbiBvZiBPUyBUeXBlIGFuZCBlbmRpYW5lc3MiCisjZW5kaWYKK30KKyAgICAgICAgCitzdGF0aWMgaW5saW5lIHRBTklfVTE2IGxpbUdldFUxNih0QU5JX1U4ICpwdHIpCit7CisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIHJldHVybiAoKCh0QU5JX1UxNikgKCpwdHIgPDwgOCkpIHwKKyAgICAgICAgICAgICgodEFOSV9VMTYpICgqKHB0cisxKSkpKTsKKyNlbGlmICgoZGVmaW5lZChBTklfT1NfVFlQRV9PU1gpICYmIGRlZmluZWQoQU5JX0xJVFRMRV9CWVRFX0VORElBTikpIHx8IFwKKyAgICAgICAoZGVmaW5lZChBTklfT1NfVFlQRV9XSU5ET1dTKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKSB8fCBcCisgICAgICAgKGRlZmluZWQoQU5JX09TX1RZUEVfQU1TUykgJiYgZGVmaW5lZChBTklfTElUVExFX0JZVEVfRU5ESUFOKSkgfHwgXAorICAgICAgIChkZWZpbmVkKEFOSV9PU19UWVBFX0FORFJPSUQpICYmIGRlZmluZWQoQU5JX0xJVFRMRV9CWVRFX0VORElBTikpKQorICAgIHJldHVybiAoKCh0QU5JX1UxNikgKCoocHRyKzEpIDw8IDgpKSB8CisgICAgICAgICAgICAoKHRBTklfVTE2KSAoKnB0cikpKTsKKyNlbHNlCisjZXJyb3IgIlVua25vd24gY29tYmluYXRpb24gb2YgT1MgVHlwZSBhbmQgZW5kaWFuZXNzIgorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaW1Db3B5VTMyKHRBTklfVTggKnB0ciwgdEFOSV9VMzIgdTMyVmFsKQoreworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkKKyAgICAqcHRyKysgPSAodEFOSV9VOCkgKCh1MzJWYWwgPj4gMjQpICYgMHhmZik7CisgICAgKnB0cisrID0gKHRBTklfVTgpICgodTMyVmFsID4+IDE2KSAmIDB4ZmYpOworICAgICpwdHIrKyA9ICh0QU5JX1U4KSAoKHUzMlZhbCA+PiA4KSAmIDB4ZmYpOworICAgICpwdHIgICA9ICh0QU5JX1U4KSAodTMyVmFsICYgMHhmZik7CisjZWxpZiAoKGRlZmluZWQoQU5JX09TX1RZUEVfT1NYKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKSB8fCBcCisgICAgICAgKGRlZmluZWQoQU5JX09TX1RZUEVfV0lORE9XUykgJiYgZGVmaW5lZChBTklfTElUVExFX0JZVEVfRU5ESUFOKSkgfHwgXAorICAgICAgIChkZWZpbmVkKEFOSV9PU19UWVBFX0FNU1MpICYmIGRlZmluZWQoQU5JX0xJVFRMRV9CWVRFX0VORElBTikpIHx8IFwKKyAgICAgICAoZGVmaW5lZChBTklfT1NfVFlQRV9BTkRST0lEKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKSkKKyAgICAqcHRyKysgPSAodEFOSV9VOCkgKHUzMlZhbCAmIDB4ZmYpOworICAgICpwdHIrKyA9ICh0QU5JX1U4KSAoKHUzMlZhbCA+PiA4KSAmIDB4ZmYpOworICAgICpwdHIrKyA9ICh0QU5JX1U4KSAoKHUzMlZhbCA+PiAxNikgJiAweGZmKTsKKyAgICAqcHRyICAgPSAodEFOSV9VOCkgKCh1MzJWYWwgPj4gMjQpICYgMHhmZik7CisjZWxzZQorI2Vycm9yICJVbmtub3duIGNvbWJpbmF0aW9uIG9mIE9TIFR5cGUgYW5kIGVuZGlhbmVzcyIKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHRBTklfVTMyIGxpbUdldFUzMih0QU5JX1U4ICpwdHIpCit7CisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIHJldHVybiAoKCoocHRyKSA8PCAyNCkgfAorICAgICAgICAgICAgKCoocHRyKzEpIDw8IDE2KSB8CisgICAgICAgICAgICAoKihwdHIrMikgPDwgOCkgfAorICAgICAgICAgICAgKCoocHRyKzMpKSk7CisjZWxpZiAoKGRlZmluZWQoQU5JX09TX1RZUEVfT1NYKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKSB8fCBcCisgICAgICAgKGRlZmluZWQoQU5JX09TX1RZUEVfV0lORE9XUykgJiYgZGVmaW5lZChBTklfTElUVExFX0JZVEVfRU5ESUFOKSkgfHwgXAorICAgICAgIChkZWZpbmVkKEFOSV9PU19UWVBFX0FNU1MpICYmIGRlZmluZWQoQU5JX0xJVFRMRV9CWVRFX0VORElBTikpIHx8IFwKKyAgICAgICAoZGVmaW5lZChBTklfT1NfVFlQRV9BTkRST0lEKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKSkKKyAgICByZXR1cm4gKCgqKHB0ciszKSA8PCAyNCkgfAorICAgICAgICAgICAgKCoocHRyKzIpIDw8IDE2KSB8CisgICAgICAgICAgICAoKihwdHIrMSkgPDwgOCkgfAorICAgICAgICAgICAgKCoocHRyKSkpOworI2Vsc2UKKyNlcnJvciAiVW5rbm93biBjb21iaW5hdGlvbiBvZiBPUyBUeXBlIGFuZCBlbmRpYW5lc3MiCisjZW5kaWYKK30KKworI2VuZGlmIC8qIF9fTElNX1NFUkRFU19VVElMU19IICovCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2Vzc2lvbi5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZXNzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkNjY1ZgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2Vzc2lvbi5jCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqICovCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgbGltU2Vzc2lvbi5jCisgIAorICBcYnJpZWYgaW1wbGVtZW50YXRpb24gZm9yIGxpbSBTZXNzaW9uIHJlbGF0ZWQgQVBJcworCisgIFxhdXRob3IgU3VuaXQgQmhhdGlhCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJsaW1EZWJ1Zy5oIgorI2luY2x1ZGUgImxpbVNlc3Npb24uaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyNpbmNsdWRlICJjY3hBcGkuaCIKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgcGVJbml0QmVhY29uUGFyYW1zKCkgLSBJbml0aWFsaXplIHRoZSBiZWFjb25QYXJhbXMgc3RydWN0dXJlCisKKworICBccGFyYW0gdHBQRVNlc3Npb24gICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBzZXNzaW9uIGNvbnRleHQgb3IgTlVMTCBpZiBzZXNzaW9uIGNhbiBub3QgYmUgY3JlYXRlZC4KKyAgXHJldHVybiB2b2lkCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBwZUluaXRCZWFjb25QYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWwgPSAwOworICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZSA9IDA7CisgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3QgPSAwOworICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0ID0gMDsKKyAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxnQ29leGlzdCA9IDA7CisgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmh0MjBDb2V4aXN0ID0gMDsKKyAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0ID0gMDsKKyAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlID0gMDsKKyAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0gMDsKKyAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZ0hUT2Jzc01vZGUgPSAwOworCisgICAgLy8gTnVtYmVyIG9mIGxlZ2FjeSBTVEFzIGFzc29jaWF0ZWQgCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopJnBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMsIHNpemVvZih0TGltUHJvdFN0YVBhcmFtcykpOyAKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKikmcHNlc3Npb25FbnRyeS0+Z0xpbTExYVBhcmFtcywgc2l6ZW9mKHRMaW1Qcm90U3RhUGFyYW1zKSk7IAorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKSZwc2Vzc2lvbkVudHJ5LT5nTGltMTFnUGFyYW1zLCBzaXplb2YodExpbVByb3RTdGFQYXJhbXMpKTsgCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopJnBzZXNzaW9uRW50cnktPmdMaW1Ob25HZlBhcmFtcywgc2l6ZW9mKHRMaW1Qcm90U3RhUGFyYW1zKSk7IAorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKSZwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcywgc2l6ZW9mKHRMaW1Qcm90U3RhUGFyYW1zKSk7IAorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKSZwc2Vzc2lvbkVudHJ5LT5nTGltTHNpZ1R4b3BQYXJhbXMsIHNpemVvZih0TGltUHJvdFN0YVBhcmFtcykpOyAKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkKikmcHNlc3Npb25FbnRyeS0+Z0xpbU9sYmNQYXJhbXMsIHNpemVvZih0TGltUHJvdFN0YVBhcmFtcykpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgcGVDcmVhdGVTZXNzaW9uKCkgLSBjcmVhdGVzIGEgbmV3IFBFIHNlc3Npb24gZ2l2ZW4gdGhlIEJTU0lECisKKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgYW5kIHRoZSBzZXNzaW9uIElEIGlmIHRoZSBzZXNzaW9uIAorICBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXNzZWQgQlNTSUQgaXMgZm91bmQgaW4gdGhlIFBFIHNlc3Npb24gdGFibGUuCisgICAgCisgIFxwYXJhbSBwTWFjICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgIFxwYXJhbSBic3NpZCAgICAgICAgICAgICAgICAgICAtIEJTU0lEIG9mIHRoZSBuZXcgc2Vzc2lvbgorICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC1zZXNzaW9uIElEIGlzIHJldHVybmVkIGhlcmUsIGlmIHNlc3Npb24gaXMgY3JlYXRlZC4KKyAgCisgIFxyZXR1cm4gdHBQRVNlc3Npb24gICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBzZXNzaW9uIGNvbnRleHQgb3IgTlVMTCBpZiBzZXNzaW9uIGNhbiBub3QgYmUgY3JlYXRlZC4KKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHBQRVNlc3Npb24gcGVDcmVhdGVTZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKmJzc2lkICwgdEFOSV9VOCogc2Vzc2lvbklkLCB0QU5JX1UxNiBudW1TdGEpCit7CisgICAgdEFOSV9VOCBpOworICAgIGZvcihpID0wOyBpIDwgcE1hYy0+bGltLm1heEJzc0lkOyBpKyspCisgICAgeworICAgICAgICAvKiBGaW5kIGZpcnN0IGZyZWUgcm9vbSBpbiBzZXNzaW9uIHRhYmxlICovCisgICAgICAgIGlmKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYywgKHZvaWQqKSZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLCBzaXplb2YodFBFU2Vzc2lvbikpOworCisgICAgICAgICAgICAvL0FsbG9jYXRlIHNwYWNlIGZvciBTdGF0aW9uIFRhYmxlIGZvciB0aGlzIHNlc3Npb24uCisgICAgICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopICZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmRwaC5kcGhIYXNoVGFibGUucEhhc2hUYWJsZSwgc2l6ZW9mKHRwRHBoSGFzaE5vZGUpKm51bVN0YSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJtZW1vcnkgYWxsb2NhdGUgZmFpbGVkIVxuIikpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgKHZvaWQgKiopICZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmRwaC5kcGhIYXNoVGFibGUucERwaE5vZGVBcnJheSwgc2l6ZW9mKHREcGhIYXNoTm9kZSkqbnVtU3RhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIm1lbW9yeSBhbGxvY2F0ZSBmYWlsZWQhXG4iKSk7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLHBNYWMtPmxpbS5ncFNlc3Npb25baV0uZHBoLmRwaEhhc2hUYWJsZS5wSGFzaFRhYmxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncFNlc3Npb25baV0uZHBoLmRwaEhhc2hUYWJsZS5zaXplID0gbnVtU3RhOworCisgICAgICAgICAgICBkcGhIYXNoVGFibGVDbGFzc0luaXQocE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgICAgICAgICAgLyogQ29weSB0aGUgQlNTSUQgdG8gdGhlIHNlc3Npb24gdGFibGUgKi8KKyAgICAgICAgICAgIHNpckNvcHlNYWNBZGRyKHBNYWMtPmxpbS5ncFNlc3Npb25baV0uYnNzSWQsIGJzc2lkKTsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgPSBUUlVFOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBJbnRpYWxpemUgdGhlIFNNRSBhbmQgTUxNIHN0YXRlcyB0byBJRExFICovCisgICAgICAgICAgICBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbU1sbVN0YXRlID0gZUxJTV9NTE1fSURMRV9TVEFURTsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltU21lU3RhdGUgPSBlTElNX1NNRV9JRExFX1NUQVRFOworICAgICAgICAgICAgcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1DdXJyZW50QXV0aFR5cGUgPSBlU0lSX09QRU5fU1lTVEVNOworICAgICAgICAgICAgcGVJbml0QmVhY29uUGFyYW1zKHBNYWMsICZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICAgICAgcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5pczExUmNvbm5lY3Rpb24gPSBGQUxTRTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAgICAgcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5pc0NDWGNvbm5lY3Rpb24gPSBGQUxTRTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiB8fCBkZWZpbmVkIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncFNlc3Npb25baV0uaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQgPSBGQUxTRTsKKyNlbmRpZgorICAgICAgICAgICAgKnNlc3Npb25JZCA9IGk7CisKKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncFNlc3Npb25baV0uZ0xpbVBoeU1vZGUgPSBXTklfQ0ZHX1BIWV9NT0RFXzExRzsgLy9UT0RPIDpDaGVjayB3aXRoIHRoZSB0ZWFtIHdoYXQgc2hvdWxkIGJlIGRlZmF1bHQgbW9kZSAKKyAgICAgICAgICAgIHJldHVybigmcE1hYy0+bGltLmdwU2Vzc2lvbltpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJTZXNzaW9uIGNhbiBub3QgYmUgY3JlYXRlZC4uIFJlYWNoZWQgTWF4IHBlcm1pdHRlZCBzZXNzaW9ucyBcbiAiKSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgcGVGaW5kU2Vzc2lvbkJ5QnNzaWQoKSAtIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGdpdmVuIHRoZSBCU1NJRC4KKworICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNlc3Npb24gY29udGV4dCBhbmQgdGhlIHNlc3Npb24gSUQgaWYgdGhlIHNlc3Npb24gCisgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEJTU0lEIGlzIGZvdW5kIGluIHRoZSBQRSBzZXNzaW9uIHRhYmxlLgorICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccGFyYW0gYnNzaWQgICAgICAgICAgICAgICAgICAgLSBCU1NJRCBvZiB0aGUgc2Vzc2lvbgorICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC1zZXNzaW9uIElEIGlzIHJldHVybmVkIGhlcmUsIGlmIHNlc3Npb24gaXMgZm91bmQuIAorICAKKyAgXHJldHVybiB0cFBFU2Vzc2lvbiAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gY29udGV4dCBvciBOVUxMIGlmIHNlc3Npb24gaXMgbm90IGZvdW5kLgorICAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RwUEVTZXNzaW9uIHBlRmluZFNlc3Npb25CeUJzc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsICB0QU5JX1U4KiAgYnNzaWQsICAgIHRBTklfVTgqIHNlc3Npb25JZCkKK3sKKyAgICB0QU5JX1U4IGk7CisKKyAgICBmb3IoaSA9MDsgaSA8IHBNYWMtPmxpbS5tYXhCc3NJZDsgaSsrKQorICAgIHsKKyAgICAgICAgLyogSWYgQlNTSUQgbWF0Y2hlcyByZXR1cm4gY29ycmVzcG9uZGluZyB0YWJsZXMgYWRkcmVzcyovCisgICAgICAgIGlmKCAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCkgJiYgKHNpckNvbXBhcmVNYWNBZGRyKHBNYWMtPmxpbS5ncFNlc3Npb25baV0uYnNzSWQsIGJzc2lkKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpzZXNzaW9uSWQgPSBpOworICAgICAgICAgICAgcmV0dXJuKCZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxpbUxvZyhwTWFjLCBMT0c0LCBGTCgiU2Vzc2lvbiBsb29rdXAgZmFpbHMgZm9yIEJTU0lEOiBcbiAiKSk7CisgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIGJzc2lkLCBMT0c0KTsKKyAgICByZXR1cm4oTlVMTCk7CisKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHBlRmluZFNlc3Npb25CeVNlc3Npb25JZCgpIC0gbG9va3MgdXAgdGhlIFBFIHNlc3Npb24gZ2l2ZW4gdGhlIHNlc3Npb24gSUQuCisKKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgIGlmIHRoZSBzZXNzaW9uIAorICBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBzZXNzaW9uIElEIGlzIGZvdW5kIGluIHRoZSBQRSBzZXNzaW9uIHRhYmxlLgorICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC1zZXNzaW9uIElEIGZvciB3aGljaCBzZXNzaW9uIGNvbnRleHQgbmVlZHMgdG8gYmUgbG9va2VkIHVwLgorICAKKyAgXHJldHVybiB0cFBFU2Vzc2lvbiAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gY29udGV4dCBvciBOVUxMIGlmIHNlc3Npb24gaXMgbm90IGZvdW5kLgorICAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyB0cFBFU2Vzc2lvbiBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQodHBBbmlTaXJHbG9iYWwgcE1hYyAsIHRBTklfVTggc2Vzc2lvbklkKQoreworICAgIGlmKHNlc3Npb25JZCA+PSAgcE1hYy0+bGltLm1heEJzc0lkKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIHNlc3Npb25JZDogJWQgXG4gIiksIHNlc3Npb25JZCk7CisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICB9CisgICAgaWYoKHBNYWMtPmxpbS5ncFNlc3Npb25bc2Vzc2lvbklkXS52YWxpZCA9PSBUUlVFKSkKKyAgICB7CisgICAgICAgIHJldHVybigmcE1hYy0+bGltLmdwU2Vzc2lvbltzZXNzaW9uSWRdKTsKKyAgICB9CisgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJTZXNzaW9uICVkICBub3QgYWN0aXZlXG4gIiksIHNlc3Npb25JZCk7CisgICAgcmV0dXJuKE5VTEwpOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgcGVGaW5kU2Vzc2lvbkJ5U3RhSWQoKSAtIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGdpdmVuIHN0YWlkLgorCisgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2Vzc2lvbiBjb250ZXh0IGFuZCB0aGUgc2Vzc2lvbiBJRCBpZiB0aGUgc2Vzc2lvbiAKKyAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gU3RhSWQgaXMgZm91bmQgaW4gdGhlIFBFIHNlc3Npb24gdGFibGUuCisgICAgCisgIFxwYXJhbSBwTWFjICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgIFxwYXJhbSBzdGFpZCAgICAgICAgICAgICAgICAgICAtIFN0YUlkIG9mIHRoZSBzZXNzaW9uCisgIFxwYXJhbSBzZXNzaW9uSWQgICAgICAgICAgICAgLXNlc3Npb24gSUQgaXMgcmV0dXJuZWQgaGVyZSwgaWYgc2Vzc2lvbiBpcyBmb3VuZC4gCisgIAorICBccmV0dXJuIHRwUEVTZXNzaW9uICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgc2Vzc2lvbiBjb250ZXh0IG9yIE5VTEwgaWYgc2Vzc2lvbiBpcyBub3QgZm91bmQuCisgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHBQRVNlc3Npb24gcGVGaW5kU2Vzc2lvbkJ5U3RhSWQodHBBbmlTaXJHbG9iYWwgcE1hYywgIHRBTklfVTggIHN0YWlkLCAgICB0QU5JX1U4KiBzZXNzaW9uSWQpCit7CisgICAgdEFOSV9VOCBpLCBqOworCisgICAgZm9yKGkgPTA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykKKyAgICB7CisgICAgICAgaWYocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCkKKyAgICAgICB7CisgICAgICAgICAgZm9yKGogPSAwOyBqIDwgcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5kcGguZHBoSGFzaFRhYmxlLnNpemU7IGorKykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgaWYoKHBNYWMtPmxpbS5ncFNlc3Npb25baV0uZHBoLmRwaEhhc2hUYWJsZS5wRHBoTm9kZUFycmF5W2pdLnZhbGlkKSAmJgorICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5kcGguZHBoSGFzaFRhYmxlLnBEcGhOb2RlQXJyYXlbal0uYWRkZWQpICYmCisgICAgICAgICAgICAgICAgKHN0YWlkID09IHBNYWMtPmxpbS5ncFNlc3Npb25baV0uZHBoLmRwaEhhc2hUYWJsZS5wRHBoTm9kZUFycmF5W2pdLnN0YUluZGV4KSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGk7CisgICAgICAgICAgICAgICAgcmV0dXJuKCZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisKKyAgICBsaW1Mb2cocE1hYywgTE9HNCwgRkwoIlNlc3Npb24gbG9va3VwIGZhaWxzIGZvciBTdGFJZDogXG4gIikpOworICAgIHJldHVybihOVUxMKTsKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHBlRGVsZXRlU2Vzc2lvbigpIC0gZGVsZXRlcyB0aGUgUEUgc2Vzc2lvbiBnaXZlbiB0aGUgc2Vzc2lvbiBJRC4KKworICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgIC1zZXNzaW9uIElEIG9mIHRoZSBzZXNzaW9uIHdoaWNoIG5lZWRzIHRvIGJlIGRlbGV0ZWQuCisgICAgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHBlRGVsZXRlU2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTE2IGkgPSAwOworCisgICAgbGltTG9nKHBNYWMsIExPR1csIEZMKCJUcnlpbmcgdG8gZGVsZXRlIGEgc2Vzc2lvbiAlZC5cbiAiKSwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworCisgICAgaWYocHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxICE9IE5VTEwpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEgKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEgKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEgPSBOVUxMOworICAgIH0KKworICAgIGlmKHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxICE9IE5VTEwpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcSApOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcSA9IE5VTEw7CisgICAgfQorCisgICAgaWYocHNlc3Npb25FbnRyeS0+cExpbU1sbUpvaW5SZXEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPnBMaW1NbG1Kb2luUmVxICk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPnBMaW1NbG1Kb2luUmVxID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlLnBIYXNoVGFibGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZS5wSGFzaFRhYmxlKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZS5wSGFzaFRhYmxlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlLnBEcGhOb2RlQXJyYXkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZS5wRHBoTm9kZUFycmF5KTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZS5wRHBoTm9kZUFycmF5ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihwc2Vzc2lvbkVudHJ5LT5iZWFjb24gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmJlYWNvbik7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvbiA9IE5VTEw7CisgICAgfQorCisgICAgaWYocHNlc3Npb25FbnRyeS0+YXNzb2NSZXEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBzZXNzaW9uRW50cnktPmFzc29jUmVxKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+YXNzb2NSZXEgPSBOVUxMOworICAgIH0KKworICAgIGlmKHBzZXNzaW9uRW50cnktPmFzc29jUnNwICE9IE5VTEwpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5hc3NvY1JzcCk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmFzc29jUnNwID0gTlVMTDsKKyAgICB9CisKKworICAgIGlmKHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBDbGVhbnVwIHRoZSBpbmRpdmlkdWFsIGFsbG9jYXRpb24gZmlyc3QKKyAgICAgICAgZm9yIChpPTA7IGkgPCBwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlLnNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcVtpXSAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggKCh0cFNpckFzc29jUmVxKShwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcVtpXSkpLT5hc3NvY1JlcUZyYW1lICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAKKyAgICAgICAgICAgICAgICAgICAgICAoKHRwU2lyQXNzb2NSZXEpKHBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW2ldKSktPmFzc29jUmVxRnJhbWUpOworICAgICAgICAgICAgICAgICAgICgodHBTaXJBc3NvY1JlcSkocHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXFbaV0pKS0+YXNzb2NSZXFGcmFtZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgKCh0cFNpckFzc29jUmVxKShwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcVtpXSkpLT5hc3NvY1JlcUZyYW1lTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKXBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxW2ldKTsKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wYXJzZWRBc3NvY1JlcVtpXSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2xlYW51cCB0aGUgd2hvbGUgYmxvY2sKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKXBzZXNzaW9uRW50cnktPnBhcnNlZEFzc29jUmVxKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+cGFyc2VkQXNzb2NSZXEgPSBOVUxMOworICAgIH0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICBsaW1DbGVhbnVwQ2N4Q3R4dChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsgCisjZW5kaWYKKworICAgIHBzZXNzaW9uRW50cnktPnZhbGlkID0gRkFMU0U7CisgICAgcmV0dXJuOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHBlRmluZFNlc3Npb25CeVBlZXJTdGEoKSAtIGxvb2tzIHVwIHRoZSBQRSBzZXNzaW9uIGdpdmVuIHRoZSBTdGF0aW9uIEFkZHJlc3MuCisKKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzZXNzaW9uIGNvbnRleHQgYW5kIHRoZSBzZXNzaW9uIElEIGlmIHRoZSBzZXNzaW9uIAorICBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBzdGF0aW9uIGFkZHJlc3MgaXMgZm91bmQgaW4gdGhlIFBFIHNlc3Npb24gdGFibGUuCisgICAgCisgIFxwYXJhbSBwTWFjICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgIFxwYXJhbSBzYSAgICAgICAgICAgICAgICAgICAgICAgLSBQZWVyIFNUQSBBZGRyZXNzIG9mIHRoZSBzZXNzaW9uCisgIFxwYXJhbSBzZXNzaW9uSWQgICAgICAgICAgICAgLXNlc3Npb24gSUQgaXMgcmV0dXJuZWQgaGVyZSwgaWYgc2Vzc2lvbiBpcyBmb3VuZC4gCisgIAorICBccmV0dXJuIHRwUEVTZXNzaW9uICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgc2Vzc2lvbiBjb250ZXh0IG9yIE5VTEwgaWYgc2Vzc2lvbiBpcyBub3QgZm91bmQuCisgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK3RwUEVTZXNzaW9uIHBlRmluZFNlc3Npb25CeVBlZXJTdGEodHBBbmlTaXJHbG9iYWwgcE1hYywgIHRBTklfVTgqICBzYSwgICAgdEFOSV9VOCogc2Vzc2lvbklkKQoreworICAgdEFOSV9VOCBpOworICAgdHBEcGhIYXNoTm9kZSBwU3RhOyAgIAorICAgdEFOSV9VMTYgIGFpZDsKKyAgIAorICAgZm9yKGkgPTA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykKKyAgIHsKKyAgICAgIGlmKCAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCkpCisgICAgICB7CisgICAgICAgICBwU3RhID0gZHBoTG9va3VwSGFzaEVudHJ5KHBNYWMsIHNhLCAmYWlkLCAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICAgICAgIGlmIChwU3RhICE9IE5VTEwpIAorICAgICAgICAgeworICAgICAgICAgICAgKnNlc3Npb25JZCA9IGk7CisgICAgICAgICAgICByZXR1cm4gJnBNYWMtPmxpbS5ncFNlc3Npb25baV07CisgICAgICAgICB9CisgICAgICB9CisgICB9ICAgCisgICAKKyAgIHJldHVybiBOVUxMOworfQorCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TZXNzaW9uVXRpbHMuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2Vzc2lvblV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3ZDBjOQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2Vzc2lvblV0aWxzLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgbGltU2Vzc2lvblV0aWxzLmMKKyAgCisgIFxicmllZiBpbXBsZW1lbnRhdGlvbiBmb3IgbGltIFNlc3Npb24gVXRpbGl0eSAgQVBJcworCisgIFxhdXRob3IgU3VuaXQgQmhhdGlhCisgIAorICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAibGltRGVidWcuaCIKKyNpbmNsdWRlICJsaW1TZXNzaW9uLmgiCisjaW5jbHVkZSAibGltU2Vzc2lvblV0aWxzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBwZVZhbGlkYXRlSm9pblJlcSgpIC0gdmFsaWRhdGVzIHRoZSBKb2luIHJlcXVlc3QgLgorCisgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHZhbGlkYXRlIHRoZSBKb2luIFJlcXVlc3QgZm9yIGEgQlQtQU1QIHN0YXRpb24uIElmIHN0YXJ0IEJTUyBzZXNzaW9uIGlzIHByZXNlbnQKKyAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgZWxzZSByZXR1cm5zIEZBTFNFLgorICBQRSB3aWxsIGZvcmNlIFNNRSB0byBmaXJzdCBpc3N1ZSAnJ1NUQVJUX0JTUycgcmVxdWVzdCBmb3IgQlRBTVBfU1RBLCBiZWZvcmUgc2VuZGluZyBhIEpPSU4gcmVxdWVzdC4KKyAgICAKKyAgXHBhcmFtIHBNYWMgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIGdsb2JhbCBhZGFwdGVyIGNvbnRleHQKKyAgXHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHJldHVybiBUUlVFIGlmIHN0YXJ0IEJTUyBzZXNzaW9uIGlzIHByZXNlbnQgZWxzZSByZXR1cm4gRkFMU0UuCisgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0QU5JX1U4IHBlVmFsaWRhdGVCdEpvaW5SZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisKKyAgICB0QU5JX1U4IGk7CisgICAgZm9yKGkgPTA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmKCAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCkgJiYgCisgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5ic3NUeXBlID09IGVTSVJfQlRBTVBfU1RBX01PREUpICYmCisgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5zdGF0eXBlRm9yQnNzID09IFNUQV9FTlRSWV9TRUxGKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKFRSVUUpOyAKKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybihGQUxTRSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgcGVHZXRWYWxpZFBvd2VyU2F2ZVNlc3Npb24oKSAtIEZldGNoZXMgdGhlIHZhbGlkIHNlc3Npb24gZm9yIHBvd2Vyc2F2ZSAuCisKKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgdGhlIHZhbGlkIHNlc3Npb24gZm9yIHBvd2VyIHNhdmUsIGlmIG1vcmUgdGhhbiBvbmUgc2Vzc2lvbiBpcyBhY3RpdmUgLCB0aGlzIGZ1bmN0aW9uIAorICBpdCByZXR1cm5zIE5VTEwuCisgIGlmIHRoZXJlIGlzIG9ubHkgb25lIHZhbGlkICJpbmZyYXN0cnVjdHVyZSIgc2Vzc2lvbiBwcmVzZW50IGluICJsaW5rZXN0YWJsaXNoZWQiIHN0YXRlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBzZXNzaW9uZW50cnkuCisgIEZvciBhbGwgb3RoZXIgY2FzZXMgaXQgcmV0dXJucyBOVUxMLgorICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcmV0dXJuIHNlc3Npb24gaXMgYWRkcmVzcyBpZiB2YWxpZCBzZXNzaW9uIGlzICBwcmVzZW50IGVsc2UgcmV0dXJuIE5VTEwuCisgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK3RwUEVTZXNzaW9uIHBlR2V0VmFsaWRQb3dlclNhdmVTZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCBpOworICAgIHRBTklfVTggc2Vzc2lvbmNvdW50ID0gMDsKKyAgICB0QU5JX1U4IHNlc3Npb25JZCA9IDA7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmKCAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCA9PSBUUlVFKSYmCisgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpJiYKKyAgICAgICAgICAgIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpKSB7CisgICAgICAgICAgICBzZXNzaW9uY291bnQrKzsKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IGk7CisKKyAgICAgICAgICAgIGlmKHNlc3Npb25jb3VudCA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBpZiggKHBNYWMtPmxpbS5ncFNlc3Npb25bc2Vzc2lvbklkXS52YWxpZCA9PSBUUlVFKSYmCisgICAgICAgIChwTWFjLT5saW0uZ3BTZXNzaW9uW3Nlc3Npb25JZF0ubGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKSYmCisgICAgICAgIChwTWFjLT5saW0uZ3BTZXNzaW9uW3Nlc3Npb25JZF0ubGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkpCisKKyAgICB7CisgICAgICAgcmV0dXJuKCZwTWFjLT5saW0uZ3BTZXNzaW9uW3Nlc3Npb25JZF0pOworICAgIH0KKyAgICByZXR1cm4oTlVMTCk7CisgICAgCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBwZUlzQW55U2Vzc2lvbkFjdGl2ZSgpIC0gY2hlY2tzIGZvciB0aGUgYWN0aXZlIHNlc3Npb24gcHJlc2VuY2UgLgorCisgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmIGF0bGVhc3Qgb25lIHZhbGlkIHNlc3Npb24gaXMgcHJlc2VudCBlbHNlIGl0IHJldHVybnMgRkFMU0UKKyAgICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcmV0dXJuIFRSVUUgaWYgYXRsZWFzdCBvbmUgc2Vzc2lvbiBpcyBhY3RpdmUgZWxzZSByZXR1cm4gRkFMU0UuCisgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK3RBTklfVTggcGVJc0FueVNlc3Npb25BY3RpdmUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1U4IGk7CisgICAgZm9yKGkgPTA7IGkgPCBwTWFjLT5saW0ubWF4QnNzSWQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgPT0gVFJVRSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihUUlVFKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybihGQUxTRSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgaXNMaW1TZXNzaW9uT2ZmQ2hhbm5lbCgpIC0gRGV0ZXJtaW5lcyBpZiB0aGUgdGhlcmUgaXMgYW55IG90aGVyIG9mZiBjaGFubmVsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi4KKworICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpZiB0aGUgc2Vzc2lvbiBJZCBwYXNzZWQgbmVlZHMgdG8gYmUgb24gYSBkaWZmZXJlbnQKKyAgY2hhbm5lbCB0aGFuIGF0bGVhc3Qgb25lIHNlc3Npb24gYWxyZWFkeSBhY3RpdmUuCisgICAgCisgIFxwYXJhbSBwTWFjICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgIFxwYXJhbSBzZXNzaW9uSWQgICAgICAgICAgICAgIC0gc2Vzc2lvbiBJRCBvZiB0aGUgc2Vzc2lvbiB0byBiZSB2ZXJpZmllZC4gIAorICAKKyAgXHJldHVybiB0QU5JX1U4ICAgICAgICAgICAgICAgLSBCb29sZWFuIHZhbHVlIGZvciBvZmYtY2hhbm5lbCBvcGVyYXRpb24uCisgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0QU5JX1U4Citpc0xpbVNlc3Npb25PZmZDaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc2Vzc2lvbklkKQoreworICAgIHRBTklfVTggaTsKKworICAgIGlmKHNlc3Npb25JZCA+PSAgcE1hYy0+bGltLm1heEJzc0lkKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIHNlc3Npb25JZDogJWQgXG4gIiksIHNlc3Npb25JZCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBmb3IoaSA9MDsgaSA8IHBNYWMtPmxpbS5tYXhCc3NJZDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoIGkgPT0gc2Vzc2lvbklkICkKKyAgICAgICAgeworICAgICAgICAgIC8vU2tpcCB0aGUgc2Vzc2lvbklkIHRoYXQgaXMgdG8gYmUgam9pbmVkLgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vaWYgc25vdGhlciBlc3Npb24gaXMgdmFsaWQgYW5kIGl0IGlzIG9uIGRpZmZlcmVudCBjaGFubmVsCisgICAgICAgIC8vaXQgaXMgYW4gb2ZmIGNoYW5uZWwgb3BlcmF0aW9uLgorICAgICAgICBpZiggKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQpICYmIAorICAgICAgICAgICAgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0uY3VycmVudE9wZXJDaGFubmVsICE9IAorICAgICAgICAgICAgIHBNYWMtPmxpbS5ncFNlc3Npb25bc2Vzc2lvbklkXS5jdXJyZW50T3BlckNoYW5uZWwpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7CisKK30KKwordEFOSV9VOAorcGVHZXRBY3RpdmVTZXNzaW9uQ2hhbm5lbCAodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1U4IGk7CisKKyAgICBmb3IoaSA9MDsgaSA8IHBNYWMtPmxpbS5tYXhCc3NJZDsgaSsrKQorICAgIHsKKyAgICAgICAgLy9pZiBzbm90aGVyIGVzc2lvbiBpcyB2YWxpZCBhbmQgaXQgaXMgb24gZGlmZmVyZW50IGNoYW5uZWwKKyAgICAgICAgLy9pdCBpcyBhbiBvZmYgY2hhbm5lbCBvcGVyYXRpb24uCisgICAgICAgIGlmKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmN1cnJlbnRPcGVyQ2hhbm5lbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworCit9CisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU2Vzc2lvblV0aWxzLmggYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlc3Npb25VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjc4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNlc3Npb25VdGlscy5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworCisjaWYhZGVmaW5lZCggX19MSU1fU0VTU0lPTl9VVElMU19IICkKKyNkZWZpbmUgX19MSU1fU0VTU0lPTl9VVElMU19ICisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIGxpbVNlc3Npb25VdGlscy5oCisgIAorICBcYnJpZWYgcHJvdG90eXBlIGZvciBsaW0gU2Vzc2lvbiBVdGlsaXR5IHJlbGF0ZWQgQVBJcworCisgIFxhdXRob3IgU3VuaXQgQmhhdGlhCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgcGVWYWxpZGF0ZUpvaW5SZXEoKSAtIHZhbGlkYXRlcyB0aGUgSm9pbiByZXF1ZXN0IC4KKworICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB2YWxpZGF0ZSB0aGUgSm9pbiBSZXF1ZXN0IGZvciBhIEJULUFNUCBzdGF0aW9uLiBJZiBzdGFydCBCU1Mgc2Vzc2lvbiBpcyBwcmVzZW50CisgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGVsc2UgcmV0dXJucyBGQUxTRS4KKyAgICAKKyAgXHBhcmFtIHBNYWMgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIGdsb2JhbCBhZGFwdGVyIGNvbnRleHQKKyAgXHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcmV0dXJuIFRSVUUgaWYgc3RhcnQgQlNTIHNlc3Npb24gaXMgcHJlc2VudCBlbHNlIHJldHVybiBGQUxTRS4KKyAgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0QU5JX1U4IHBlVmFsaWRhdGVCdEpvaW5SZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgcGVHZXRWYWxpZFBvd2VyU2F2ZVNlc3Npb24oKSAtIEZldGNoZXMgdGhlIHZhbGlkIHNlc3Npb24gZm9yIHBvd2Vyc2F2ZSAuCisKKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgdGhlIHZhbGlkIHNlc3Npb24gZm9yIHBvd2VyIHNhdmUsIGlmIG1vcmUgdGhhbiBvbmUgc2Vzc2lvbiBpcyBhY3RpdmUgLCB0aGlzIGZ1bmN0aW9uIAorICBpdCByZXR1cm5zIE5VTEwuCisgIGlmIHRoZXJlIGlzIG9ubHkgb25lIHZhbGlkICJpbmZyYXN0cnVjdHVyZSIgc2Vzc2lvbiBwcmVzZW50IGluICJsaW5rZXN0YWJsaXNoZWQiIHN0YXRlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBzZXNzaW9uZW50cnkuCisgIEZvciBhbGwgb3RoZXIgY2FzZXMgaXQgcmV0dXJucyBOVUxMLgorICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcmV0dXJuIHNlc3Npb24gaXMgYWRkcmVzcyBpZiB2YWxpZCBzZXNzaW9uIGlzICBwcmVzZW50IGVsc2UgcmV0dXJuIE5VTEwuCisgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK3RwUEVTZXNzaW9uIHBlR2V0VmFsaWRQb3dlclNhdmVTZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgcGVJc0FueVNlc3Npb25BY3RpdmUoKSAtIGNoZWNrcyBmb3IgdGhlIGFjdGl2ZSBzZXNzaW9uIHByZXNlbmNlIC4KKworICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpZiBhdGxlYXN0IG9uZSB2YWxpZCBzZXNzaW9uIGlzIHByZXNlbnQgZWxzZSBpdCByZXR1cm5zIEZBTFNFCisgICAgICAKKyAgXHBhcmFtIHBNYWMgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIGdsb2JhbCBhZGFwdGVyIGNvbnRleHQKKyAgXHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHJldHVybiBUUlVFIGlmIGF0bGVhc3Qgb25lIHNlc3Npb24gaXMgYWN0aXZlIGVsc2UgcmV0dXJuIEZBTFNFLgorICAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordEFOSV9VOCBwZUlzQW55U2Vzc2lvbkFjdGl2ZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIGlzTGltU2Vzc2lvbk9mZkNoYW5uZWwoKSAtIERldGVybWluZXMgaWYgdGhlIHNlc3Npb24gaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmIGNoYW5uZWwuCisKKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgdGhlIHNlc3Npb24gSWQgcGFzc2VkIG5lZWRzIHRvIGJlIG9uIGEgZGlmZmVyZW50CisgIGNoYW5uZWwgdGhhbiBhdGxlYXN0IG9uZSBzZXNzaW9uIGFscmVhZHkgYWN0aXZlLgorICAgIAorICBccGFyYW0gcE1hYyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZ2xvYmFsIGFkYXB0ZXIgY29udGV4dAorICBccGFyYW0gc2Vzc2lvbklkICAgICAgICAgICAgICAtIHNlc3Npb24gSUQgb2YgdGhlIHNlc3Npb24gdG8gYmUgdmVyaWZpZWQuICAKKyAgCisgIFxyZXR1cm4gdEFOSV9VOCAgICAgICAgICAgICAgIC0gQm9vbGVhbiB2YWx1ZSBmb3Igb2ZmLWNoYW5uZWwgb3BlcmF0aW9uLgorICAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RBTklfVTgKK2lzTGltU2Vzc2lvbk9mZkNoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBzZXNzaW9uSWQpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0QU5JX1U4CitwZUdldEFjdGl2ZVNlc3Npb25DaGFubmVsKCB0cEFuaVNpckdsb2JhbCBwTWFjICk7CisjZW5kaWYgLy8jaWYgIWRlZmluZWQoIF9fTElNX1NFU1NJT05fVVRJTFNfSCApCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU21lUmVxVXRpbHMuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU21lUmVxVXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGE2ODdlCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TbWVSZXFVdGlscy5jCkBAIC0wLDAgKzEsMTI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1TbWVSZXFVdGlscy5jYyBjb250YWlucyB0aGUgdXRpbGl0eSBmdW5jdGlvbnMKKyAqIGZvciBwcm9jZXNzaW5nIFNNRSByZXF1ZXN0IG1lc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMDUvMjYvMTAgICAgICAganMgICAgICAgICAgICAgV1BBIGhhbmRsaW5nIGluIChSZSlBc3NvYyBmcmFtZXMKKyAqIAorICovCisKKyNpbmNsdWRlICJ3bmlBcGkuaCIKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyNpbmNsdWRlICJ3bmlDZmdBcC5oIgorI2Vsc2UKKyNpbmNsdWRlICJ3bmlDZmdTdGEuaCIKKyNlbmRpZgorI2luY2x1ZGUgImNmZ0FwaS5oIgorI2luY2x1ZGUgInNpckFwaS5oIgorI2luY2x1ZGUgInNjaEFwaS5oIgorI2luY2x1ZGUgInV0aWxzQXBpLmgiCisjaW5jbHVkZSAibGltVHlwZXMuaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbUFzc29jVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1TZWN1cml0eVV0aWxzLmgiCisjaW5jbHVkZSAibGltU2VyRGVzVXRpbHMuaCIKKworCisKKy8qKgorICogbGltSXNSU05pZVZhbGlkSW5TbWVSZXFNZXNzYWdlKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IGlmIHRoZSBSU04gSUUKKyAqIHJlY2VpdmVkIGluIHZhcmlvdXMgU01FX1JFUSBtZXNzYWdlcyBpcyB2YWxpZCBvciBub3QKKyAqCisgKkxPR0lDOgorICogUlNOIElFIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBSU05pZSBQb2ludGVyIHRvIHJlY2VpdmVkIFJTTiBJRQorICogQHJldHVybiB0cnVlIHdoZW4gUlNOIElFIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgdEFOSV9VOAorbGltSXNSU05pZVZhbGlkSW5TbWVSZXFNZXNzYWdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyUlNOaWUgcFJTTmllKQoreworICAgIHRBTklfVTggIHN0YXJ0UG9zID0gMDsKKyAgICB0QU5JX1UzMiBwcml2YWN5LCB2YWw7CisgICAgaW50IGxlbjsKKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICAgICZwcml2YWN5KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gcmV0cmlldmUgUE9JIGZyb20gQ0ZHXG4iKSk7CisgICAgfQorCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUlNOX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gcmV0cmlldmUgUlNOX0VOQUJMRUQgZnJvbSBDRkdcbiIpKTsKKyAgICB9CisKKyAgICBpZiAocFJTTmllLT5sZW5ndGggJiYgKCFwcml2YWN5IHx8ICF2YWwpKQorICAgIHsKKyAgICAgICAgLy8gUHJpdmFjeSAmIFJTTiBub3QgZW5hYmxlZCBpbiBDRkcuCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbiBvcmRlciB0byBhbGxvdyBtaXhlZCBtb2RlIGZvciBHdWVzdCBhY2Nlc3MKKyAgICAgICAgICogYWxsb3cgQlNTIGNyZWF0aW9uL2pvaW4gd2l0aCBubyBQcml2YWN5IGNhcGFiaWxpdHkKKyAgICAgICAgICogeWV0IGFkdmVydGlzaW5nIFdQQSBJRQorICAgICAgICAgKi8KKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiUlNOIGllIGxlbiAlZCBidXQgUFJJVkFDWSAlZCBSU04gJWRcbiIpLCAKKyAgICAgICAgICAgICAgIHBSU05pZS0+bGVuZ3RoLCBwcml2YWN5LCB2YWwpOykKKyAgICB9CisKKyAgICBpZiAocFJTTmllLT5sZW5ndGgpCisgICAgeworICAgICAgICBpZiAoKHBSU05pZS0+cnNuSUVkYXRhWzBdICE9IERPVDExRl9FSURfUlNOKSAmJgorICAgICAgICAgICAgKHBSU05pZS0+cnNuSUVkYXRhWzBdICE9IERPVDExRl9FSURfV1BBKQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgICAgICAmJiAocFJTTmllLT5yc25JRWRhdGFbMF0gIT0gRE9UMTFGX0VJRF9XQVBJKQorI2VuZGlmCisgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUlNOL1dQQS9XQVBJIEVJRCAlZCBub3QgWyVkIHx8ICVkXVxuIiksIAorICAgICAgICAgICAgICAgICAgIHBSU05pZS0+cnNuSUVkYXRhWzBdLCBET1QxMUZfRUlEX1JTTiwgCisgICAgICAgICAgICAgICAgICAgRE9UMTFGX0VJRF9XUEEpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbGVuID0gcFJTTmllLT5sZW5ndGg7CisgICAgICAgIHN0YXJ0UG9zID0gMDsKKyAgICAgICAgd2hpbGUobGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAvLyBDaGVjayB2YWxpZGl0eSBvZiBSU04gSUUKKyAgICAgICAgICAgIGlmIChwUlNOaWUtPnJzbklFZGF0YVtzdGFydFBvc10gPT0gRE9UMTFGX0VJRF9SU04pIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKChwUlNOaWUtPnJzbklFZGF0YVtzdGFydFBvcysxXSA+IERPVDExRl9JRV9SU05fTUFYX0xFTikgfHwKKyAgICAgICAgICAgICAgICAgICAgKHBSU05pZS0+cnNuSUVkYXRhW3N0YXJ0UG9zKzFdIDwgRE9UMTFGX0lFX1JTTl9NSU5fTEVOKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJSU04gSUUgbGVuICVkIG5vdCBbJWQsJWRdXG4iKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUlNOaWUtPnJzbklFZGF0YVtzdGFydFBvcysxXSwgRE9UMTFGX0lFX1JTTl9NSU5fTEVOLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIERPVDExRl9JRV9SU05fTUFYX0xFTik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYocFJTTmllLT5yc25JRWRhdGFbc3RhcnRQb3NdID09IERPVDExRl9FSURfV1BBKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdmFsaWRpdHkgb2YgV1BBIElFCisgICAgICAgICAgICAgICAgdmFsID0gc2lyUmVhZFUzMigodEFOSV9VOCAqKSAmcFJTTmllLT5yc25JRWRhdGFbc3RhcnRQb3MgKyAyXSk7CisgICAgICAgICAgICAgICAgaWYoKHBSU05pZS0+cnNuSUVkYXRhW3N0YXJ0UG9zICsgMV0gPCBET1QxMUZfSUVfV1BBX01JTl9MRU4pIHx8CisgICAgICAgICAgICAgICAgICAgIChwUlNOaWUtPnJzbklFZGF0YVtzdGFydFBvcyArIDFdID4gRE9UMTFGX0lFX1dQQV9NQVhfTEVOKSB8fAorICAgICAgICAgICAgICAgICAgICAoU0lSX01BQ19XUEFfT1VJICE9IHZhbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldQQSBJRSBsZW4gJWQgbm90IFslZCwlZF0gT1IgZGF0YSAweCV4IG5vdCAweCV4XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSU05pZS0+cnNuSUVkYXRhW3N0YXJ0UG9zKzFdLCBET1QxMUZfSUVfV1BBX01JTl9MRU4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9UMTFGX0lFX1dQQV9NQVhfTEVOLCB2YWwsIFNJUl9NQUNfV1BBX09VSSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgICAgICAgICAgZWxzZSBpZihwUlNOaWUtPnJzbklFZGF0YVtzdGFydFBvc10gPT0gRE9UMTFGX0VJRF9XQVBJKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKChwUlNOaWUtPnJzbklFZGF0YVtzdGFydFBvcysxXSA+IERPVDExRl9JRV9XQVBJX01BWF9MRU4pIHx8CisgICAgICAgICAgICAgICAgIChwUlNOaWUtPnJzbklFZGF0YVtzdGFydFBvcysxXSA8IERPVDExRl9JRV9XQVBJX01JTl9MRU4pKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldBUEkgSUUgbGVuICVkIG5vdCBbJWQsJWRdXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSU05pZS0+cnNuSUVkYXRhW3N0YXJ0UG9zKzFdLCBET1QxMUZfSUVfV0FQSV9NSU5fTEVOLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPVDExRl9JRV9XQVBJX01BWF9MRU4pOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLy93ZSB3aWxsIG5ldmVyIGJlIGhlcmUsIHNpbXBseSBmb3IgY29tcGxldGVuZXNzCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0UG9zICs9IDIgKyBwUlNOaWUtPnJzbklFZGF0YVtzdGFydFBvcysxXTsgIC8vRUlEICsgbGVuZ3RoIGZpZWxkICsgbGVuZ3RoCisgICAgICAgICAgICBsZW4gLT0gc3RhcnRQb3M7CisgICAgICAgIH0vL3doaWxlCisKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30gLyoqKiBlbmQgbGltSXNSU05pZVZhbGlkSW5TbWVSZXFNZXNzYWdlKCkgKioqLworCisvKioKKyAqIGxpbUlzQWRkaWVWYWxpZEluU21lUmVxTWVzc2FnZSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHZlcmlmeSBpZiB0aGUgQWRkIElFCisgKiByZWNlaXZlZCBpbiB2YXJpb3VzIFNNRV9SRVEgbWVzc2FnZXMgaXMgdmFsaWQgb3Igbm90CisgKgorICpMT0dJQzoKKyAqIEFkZCBJRSB2YWxpZGl0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBvbiBvbmx5IGxlbmd0aAorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcFdTQ2llIFBvaW50ZXIgdG8gcmVjZWl2ZWQgV1NDIElFCisgKiBAcmV0dXJuIHRydWUgd2hlbiBXU0MgSUUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZQorICovCisKK3N0YXRpYyB0QU5JX1U4CitsaW1Jc0FkZGllVmFsaWRJblNtZVJlcU1lc3NhZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJBZGRpZSBwQWRkaWUpCit7CisgICAgaW50IGxlZnQgPSBwQWRkaWUtPmxlbmd0aDsKKyAgICB0QU5JX1U4ICpwdHIgPSBwQWRkaWUtPmFkZElFZGF0YTsKKyAgICB0QU5JX1U4IGVsZW1faWQsIGVsZW1fbGVuOworCisgICAgaWYgKGxlZnQgPT0gMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB3aGlsZShsZWZ0ID49IDIpCisgICAgeworICAgICAgICBlbGVtX2lkICA9IHB0clswXTsKKyAgICAgICAgZWxlbV9sZW4gPSBwdHJbMV07CisgICAgICAgIGxlZnQgLT0gMjsKKyAgICAgICAgaWYoZWxlbV9sZW4gPiBsZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIAorICAgICAgICAgICAgICAgRkwoIioqKipJbnZhbGlkIEFkZCBJRXMgZWlkID0gJWQgZWxlbV9sZW49JWQgbGVmdD0lZCoqKioqXG4iKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1faWQsZWxlbV9sZW4sbGVmdCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAKKyAgICAgICAgbGVmdCAtPSBlbGVtX2xlbjsKKyAgICAgICAgcHRyICs9IChlbGVtX2xlbiArIDIpOworICAgIH0KKyAgICAvLyB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IGxlZnQgYnl0ZQorIAorICAgIAorICAgIHJldHVybiB0cnVlOworfSAvKioqIGVuZCBsaW1Jc0FkZGllVmFsaWRJblNtZVJlcU1lc3NhZ2UoKSAqKiovCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisvKioKKyAqIGxpbVNldFJTTmllV1BBaWVmcm9tU21lU3RhcnRCU1NSZXFNZXNzYWdlKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IGlmIHRoZSBSU04gSUUKKyAqIHJlY2VpdmVkIGluIHZhcmlvdXMgU01FX1JFUSBtZXNzYWdlcyBpcyB2YWxpZCBvciBub3QKKyAqCisgKkxPR0lDOgorICogUlNOIElFIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBSU05pZSBQb2ludGVyIHRvIHJlY2VpdmVkIFJTTiBJRQorICogQHJldHVybiB0cnVlIHdoZW4gUlNOIElFIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UKKyAqLworCit0QU5JX1U4CitsaW1TZXRSU05pZVdQQWllZnJvbVNtZVN0YXJ0QlNTUmVxTWVzc2FnZSh0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUlNOaWUgcFJTTmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1U4ICB3cGFJbmRleCA9IDA7CisgICAgdEFOSV9VMzIgcHJpdmFjeSwgdmFsOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUFJJVkFDWV9FTkFCTEVELAorICAgICAgICAgICAgICAgICAgJnByaXZhY3kpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoIlVuYWJsZSB0byByZXRyaWV2ZSBQT0kgZnJvbSBDRkdcbiIpKTsKKyAgICB9CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19SU05fRU5BQkxFRCwKKyAgICAgICAgICAgICAgICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoIlVuYWJsZSB0byByZXRyaWV2ZSBSU05fRU5BQkxFRCBmcm9tIENGR1xuIikpOworICAgIH0KKworICAgIGlmIChwUlNOaWUtPmxlbmd0aCAmJiAoIXByaXZhY3kgfHwgIXZhbCkpCisgICAgeworICAgICAgICAvLyBQcml2YWN5ICYgUlNOIG5vdCBlbmFibGVkIGluIENGRy4KKyAgICAgICAgLyoqCisgICAgICAgICAqIEluIG9yZGVyIHRvIGFsbG93IG1peGVkIG1vZGUgZm9yIEd1ZXN0IGFjY2VzcworICAgICAgICAgKiBhbGxvdyBCU1MgY3JlYXRpb24vam9pbiB3aXRoIG5vIFByaXZhY3kgY2FwYWJpbGl0eQorICAgICAgICAgKiB5ZXQgYWR2ZXJ0aXNpbmcgV1BBIElFCisgICAgICAgICAqLworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJSU04gaWUgbGVuICVkIGJ1dCBQUklWQUNZICVkIFJTTiAlZFxuIiksIAorICAgICAgICAgICAgICAgcFJTTmllLT5sZW5ndGgsIHByaXZhY3ksIHZhbCk7KQorICAgIH0KKworICAgIGlmIChwUlNOaWUtPmxlbmd0aCkKKyAgICB7CisgICAgICAgIGlmICgocFJTTmllLT5yc25JRWRhdGFbMF0gIT0gU0lSX01BQ19SU05fRUlEKSAmJgorICAgICAgICAgICAgKHBSU05pZS0+cnNuSUVkYXRhWzBdICE9IFNJUl9NQUNfV1BBX0VJRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiUlNOL1dQQSBFSUQgJWQgbm90IFslZCB8fCAlZF1cbiIpLCAKKyAgICAgICAgICAgICAgICAgICBwUlNOaWUtPnJzbklFZGF0YVswXSwgU0lSX01BQ19SU05fRUlELCAKKyAgICAgICAgICAgICAgICAgICBTSVJfTUFDX1dQQV9FSUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdmFsaWRpdHkgb2YgUlNOIElFCisgICAgICAgIGlmICgocFJTTmllLT5yc25JRWRhdGFbMF0gPT0gU0lSX01BQ19SU05fRUlEKSAmJgorI2lmIDAgLy8gQ29tcGFyaXNvbiBhbHdheXMgZmFsc2UKKyAgICAgICAgICAgIChwUlNOaWUtPnJzbklFZGF0YVsxXSA+IFNJUl9NQUNfUlNOX0lFX01BWF9MRU5HVEgpIHx8CisjZW5kaWYKKyAgICAgICAgICAgICAocFJTTmllLT5yc25JRWRhdGFbMV0gPCBTSVJfTUFDX1JTTl9JRV9NSU5fTEVOR1RIKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJSU04gSUUgbGVuICVkIG5vdCBbJWQsJWRdXG4iKSwgCisgICAgICAgICAgICAgICAgICAgcFJTTmllLT5yc25JRWRhdGFbMV0sIFNJUl9NQUNfUlNOX0lFX01JTl9MRU5HVEgsIAorICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfUlNOX0lFX01BWF9MRU5HVEgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBSU05pZS0+bGVuZ3RoID4gcFJTTmllLT5yc25JRWRhdGFbMV0gKyAyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFJTTmllLT5yc25JRWRhdGFbMF0gIT0gU0lSX01BQ19SU05fRUlEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiRmlyc3QgYnl0ZVslZF0gaW4gcnNuSUVkYXRhIGlzIG5vdCBSU05fRUlEXG4iKSwgCisgICAgICAgICAgICAgICAgICAgICAgIHBSU05pZS0+cnNuSUVkYXRhWzFdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLAorICAgICAgICAgICAgICAgICAgIExPRzEsCisgICAgICAgICAgICAgICAgICAgRkwoIldQQSBJRSBpcyBwcmVzZW50IGFsb25nIHdpdGggV1BBMiBJRVxuIikpOworICAgICAgICAgICAgd3BhSW5kZXggPSAyICsgcFJTTmllLT5yc25JRWRhdGFbMV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHBSU05pZS0+bGVuZ3RoID09IHBSU05pZS0+cnNuSUVkYXRhWzFdICsgMikgJiYKKyAgICAgICAgICAgICAgICAgKHBSU05pZS0+cnNuSUVkYXRhWzBdID09IFNJUl9NQUNfUlNOX0VJRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLAorICAgICAgICAgICAgICAgICAgIExPRzEsCisgICAgICAgICAgICAgICAgICAgRkwoIk9ubHkgUlNOIElFIGlzIHByZXNlbnRcbiIpKTsKKyAgICAgICAgICAgIGRvdDExZlVucGFja0llUlNOKHBNYWMsJnBSU05pZS0+cnNuSUVkYXRhWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTgpcFJTTmllLT5sZW5ndGgsJnBTZXNzaW9uRW50cnktPmdTdGFydEJzc1JTTkllKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgocFJTTmllLT5sZW5ndGggPT0gcFJTTmllLT5yc25JRWRhdGFbMV0gKyAyKSAmJgorICAgICAgICAgICAgICAgICAocFJTTmllLT5yc25JRWRhdGFbMF0gPT0gU0lSX01BQ19XUEFfRUlEKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsCisgICAgICAgICAgICAgICAgICAgTE9HMSwKKyAgICAgICAgICAgICAgICAgICBGTCgiT25seSBXUEEgSUUgaXMgcHJlc2VudFxuIikpOworCisgICAgICAgICAgICBkb3QxMWZVbnBhY2tJZVdQQShwTWFjLCZwUlNOaWUtPnJzbklFZGF0YVs2XSwodEFOSV9VOClwUlNOaWUtPmxlbmd0aC00LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb25FbnRyeS0+Z1N0YXJ0QnNzV1BBSWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdmFsaWRpdHkgb2YgV1BBIElFCisgICAgICAgIHZhbCA9IHNpclJlYWRVMzIoKHRBTklfVTggKikgJnBSU05pZS0+cnNuSUVkYXRhW3dwYUluZGV4ICsgMl0pOworCisgICAgICAgIGlmICgocFJTTmllLT5yc25JRWRhdGFbd3BhSW5kZXhdID09IFNJUl9NQUNfV1BBX0VJRCkgJiYKKyNpZiAwIC8vIENvbXBhcmlzb24gYWx3YXlzIGZhbHNlCisgICAgICAgICAgICAocFJTTmllLT5yc25JRWRhdGFbd3BhSW5kZXggKyAxXSA+IFNJUl9NQUNfV1BBX0lFX01BWF9MRU5HVEgpIHx8CisjZW5kaWYKKyAgICAgICAgICAgICAoKHBSU05pZS0+cnNuSUVkYXRhW3dwYUluZGV4ICsgMV0gPCBTSVJfTUFDX1dQQV9JRV9NSU5fTEVOR1RIKSB8fAorICAgICAgICAgICAgIChTSVJfTUFDX1dQQV9PVUkgIT0gdmFsKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoIldQQSBJRSBsZW4gJWQgbm90IFslZCwlZF0gT1IgZGF0YSAweCV4IG5vdCAweCV4XG4iKSwKKyAgICAgICAgICAgICAgIHBSU05pZS0+cnNuSUVkYXRhWzFdLCBTSVJfTUFDX1JTTl9JRV9NSU5fTEVOR1RILCAKKyAgICAgICAgICAgICAgIFNJUl9NQUNfUlNOX0lFX01BWF9MRU5HVEgsIHZhbCwgU0lSX01BQ19XUEFfT1VJKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogQm90aCBSU04gYW5kIFdQQSBJRXMgYXJlIHByZXNlbnQgKi8KKyAgICAgICAgICAgIGRvdDExZlVucGFja0llUlNOKHBNYWMsJnBSU05pZS0+cnNuSUVkYXRhWzJdLAorICAgICAgICAgICAgICAgICAgKHRBTklfVTgpcFJTTmllLT5sZW5ndGgsJnBTZXNzaW9uRW50cnktPmdTdGFydEJzc1JTTkllKTsKKworICAgICAgICAgICAgZG90MTFmVW5wYWNrSWVXUEEocE1hYywmcFJTTmllLT5yc25JRWRhdGFbd3BhSW5kZXggKyA2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSU05pZS0+cnNuSUVkYXRhW3dwYUluZGV4ICsgMV0tNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZXNzaW9uRW50cnktPmdTdGFydEJzc1dQQUllKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9IC8qKiogZW5kIGxpbVNldFJTTmllV1BBaWVmcm9tU21lU3RhcnRCU1NSZXFNZXNzYWdlKCkgKioqLworI2VuZGlmCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisvKioKKyAqIGxpbUlzQnNzSW5mb1ZhbGlkSW5TbWVSZXFNZXNzYWdlKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IGlmIHRoZSBCU1MgaW5mbworICogcmVjZWl2ZWQgaW4gdmFyaW91cyBTTUVfUkVRIG1lc3NhZ2VzIGlzIHZhbGlkIG9yIG5vdAorICoKKyAqTE9HSUM6CisgKiBCU1MgaW5mbyB2YWxpZGl0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHBCc3NJbmZvIFBvaW50ZXIgdG8gcmVjZWl2ZWQgQnNzIEluZm9ybWF0aW9uCisgKiBAcmV0dXJuIHRydWUgd2hlbiBCU1MgaW5mbyBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIHRBTklfVTgKK2xpbUlzQnNzSW5mb1ZhbGlkSW5TbWVSZXFNZXNzYWdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpck5laWdoYm9yQnNzSW5mbyBwQnNzSW5mbykKK3sKKyAgICB0QU5JX1U4IHZhbGlkID0gdHJ1ZTsKKworICAgIGlmICgocEJzc0luZm8tPmJzc1R5cGUgIT0gZVNJUl9JTkZSQVNUUlVDVFVSRV9NT0RFKSB8fAorICAgICAgICBsaW1Jc0dyb3VwQWRkcihwQnNzSW5mby0+YnNzSWQpIHx8CisgICAgICAgICFwQnNzSW5mby0+Y2hhbm5lbElkIHx8CisgICAgICAgICFwQnNzSW5mby0+c3NJZC5sZW5ndGggfHwKKyAgICAgICAgKHBCc3NJbmZvLT5zc0lkLmxlbmd0aCA+IFNJUl9NQUNfTUFYX1NTSURfTEVOR1RIKSB8fAorICAgICAgICAhbGltSXNSU05pZVZhbGlkSW5TbWVSZXFNZXNzYWdlKHBNYWMsICZwQnNzSW5mby0+cnNuSUUpKQorICAgIHsKKyAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCitlbmQ6CisgICAgcmV0dXJuIHZhbGlkOworfSAvKioqIGVuZCBsaW1Jc0Jzc0luZm9WYWxpZEluU21lUmVxTWVzc2FnZSgpICoqKi8KKyNlbHNlCisKKworCisvKioKKyAqIGxpbUlzQnNzRGVzY3JWYWxpZEluU21lUmVxTWVzc2FnZSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHZlcmlmeSBpZiB0aGUgQlNTIERlc2NyCisgKiByZWNlaXZlZCBpbiB2YXJpb3VzIFNNRV9SRVEgbWVzc2FnZXMgaXMgdmFsaWQgb3Igbm90CisgKgorICpMT0dJQzoKKyAqIEJTUyBEZXNjcml0aXBpb24gdmFsaWRpdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEJzc0Rlc2NyIFBvaW50ZXIgdG8gcmVjZWl2ZWQgQnNzIERlc2NyaXRpcGlvbgorICogQHJldHVybiB0cnVlIHdoZW4gQlNTIGRlc2NyaXB0aW9uIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgdEFOSV9VOAorbGltSXNCc3NEZXNjclZhbGlkSW5TbWVSZXFNZXNzYWdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJCc3NEZXNjcmlwdGlvbiBwQnNzRGVzY3IpCit7CisgICAgdEFOSV9VOCB2YWxpZCA9IHRydWU7CisKKyAgICBpZiAobGltSXNBZGRyQkMocEJzc0Rlc2NyLT5ic3NJZCkgfHwKKyAgICAgICAgIXBCc3NEZXNjci0+Y2hhbm5lbElkKQorICAgIHsKKyAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCitlbmQ6CisgICAgcmV0dXJuIHZhbGlkOworfSAvKioqIGVuZCBsaW1Jc0Jzc0Rlc2NyVmFsaWRJblNtZVJlcU1lc3NhZ2UoKSAqKiovCisjZW5kaWYKKworCisKKy8qKgorICogbGltSXNTbWVTdGFydFJlcVZhbGlkKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9TVEFSVF9SRVEgbWVzc2FnZSBmcm9tIGFwcGxpY2F0aW9uLgorICoKKyAqTE9HSUM6CisgKiBNZXNzYWdlIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNc2cgLSBQb2ludGVyIHRvIHJlY2VpdmVkIFNNRV9TVEFSVF9CU1NfUkVRIG1lc3NhZ2UKKyAqIEByZXR1cm4gdHJ1ZSAgd2hlbiByZWNlaXZlZCBTTUVfU1RBUlRfUkVRIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkKKyAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KKwordEFOSV9VOAorbGltSXNTbWVTdGFydFJlcVZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnKQoreworICAgIHRBTklfVTggdmFsaWQgPSB0cnVlOworCisgICAgaWYgKCgodHBTaXJTbWVTdGFydFJlcSkgcE1zZyktPmxlbmd0aCAhPSBzaXplb2YodFNpclNtZVN0YXJ0UmVxKSkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnZhbGlkIGxlbmd0aCBpbiBTVEFSVF9SRVEgbWVzc2FnZQorICAgICAgICAgKiBMb2cgZXJyb3IuCisgICAgICAgICAqLworICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgIEZMKCJJbnZhbGlkIGxlbmd0aCAlZCBpbiBlV05JX1NNRV9TVEFSVF9SRVFcbiIpLAorICAgICAgICAgICAgICAgKCh0cFNpclNtZVN0YXJ0UmVxKSBwTXNnKS0+bGVuZ3RoKTsKKworICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKK2VuZDoKKyAgICByZXR1cm4gdmFsaWQ7Cit9IC8qKiogZW5kIGxpbUlzU21lU3RhcnRSZXFWYWxpZCgpICoqKi8KKworCisKKy8qKgorICogbGltSXNTbWVTdGFydEJzc1JlcVZhbGlkKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9TVEFSVF9CU1NfUkVRIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKkxPR0lDOgorICogTWVzc2FnZSB2YWxpZGl0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwU3RhcnRCc3NSZXEgUG9pbnRlciB0byByZWNlaXZlZCBTTUVfU1RBUlRfQlNTX1JFUSBtZXNzYWdlCisgKiBAcmV0dXJuIHRydWUgIHdoZW4gcmVjZWl2ZWQgU01FX1NUQVJUX0JTU19SRVEgaXMgZm9ybWF0dGVkIGNvcnJlY3RseQorICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAqLworCit0QU5JX1U4CitsaW1Jc1NtZVN0YXJ0QnNzUmVxVmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpclNtZVN0YXJ0QnNzUmVxIHBTdGFydEJzc1JlcSkKK3sKKyAgICB0QU5JX1U4ICAgaSA9IDA7CisgICAgdEFOSV9VOCB2YWxpZCA9IHRydWU7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgIEZMKCJQYXJzZWQgU1RBUlRfQlNTX1JFUSBmaWVsZHMgYXJlIGJzc1R5cGU9JWQsIGNoYW5uZWxJZD0lZCwgU1NJRCBsZW49JWQsIHJzbklFIGxlbj0lZCwgbndUeXBlPSVkLCByYXRlc2V0IGxlbj0lZFxuIiksCisgICAgICAgICAgIHBTdGFydEJzc1JlcS0+YnNzVHlwZSwKKyAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5jaGFubmVsSWQsCisgICAgICAgICAgIHBTdGFydEJzc1JlcS0+c3NJZC5sZW5ndGgsCisgICAgICAgICAgIHBTdGFydEJzc1JlcS0+cnNuSUUubGVuZ3RoLAorICAgICAgICAgICBwU3RhcnRCc3NSZXEtPm53VHlwZSwKKyAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMpOykKKworICAgIHN3aXRjaCAocFN0YXJ0QnNzUmVxLT5ic3NUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREU6CisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgICAgICAgICAvKiBDaGVjayBmb3IgdGhlIEFQIFJvbGUvU3RhdGlvbiByb2xlIGhlcmUgYW5kIGFjdCBhY2NvcmRpbmdseS4gCisgICAgICAgICAgICAgKiBDdXJyZW50bHkgYXNzdW1pbmcgdGhpcyBhcyBBUCBhbmQgYnJlYWtzIFRPRE8gKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHN0YXJ0IEJTUyByZXEgd2l0aCBic3NUeXBlCisgICAgICAgICAgICAgKiBJbmZyYXN0cnVjdHVyZSBvbiBTVEEuCisgICAgICAgICAgICAgKiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIGJzc1R5cGUgJWQgaW4gZVdOSV9TTUVfU1RBUlRfQlNTX1JFUVxuIikscFN0YXJ0QnNzUmVxLT5ic3NUeXBlKTsKKyAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNJUl9JQlNTX01PREU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBBZGRlZCBmb3IgQlQgQU1QIHN1cHBvcnQgKi8KKyAgICAgICAgY2FzZSBlU0lSX0JUQU1QX1NUQV9NT0RFOiAgICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAvKiBBZGRlZCBmb3IgQlQgQU1QIHN1cHBvcnQgKi8KKyAgICAgICAgY2FzZSBlU0lSX0JUQU1QX0FQX01PREU6CisgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgLyogQWRkZWQgZm9yIFNvZnRBUCBzdXBwb3J0ICovCisgICAgICAgIGNhc2UgZVNJUl9JTkZSQV9BUF9NT0RFOgorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBzdGFydCBCU1MgcmVxIHdpdGggYnNzVHlwZQorICAgICAgICAgICAgICogb3RoZXIgdGhhbiBJbmZyYXN0cnVjdHVyZS9JQlNTLgorICAgICAgICAgICAgICogTG9nIGVycm9yCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgRkwoIkludmFsaWQgYnNzVHlwZSAlZCBpbiBlV05JX1NNRV9TVEFSVF9CU1NfUkVRXG4iKSwKKyAgICAgICAgICAgICAgIHBTdGFydEJzc1JlcS0+YnNzVHlwZSk7CisKKyAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisKKyAgICAvKiBBc3N1bWVkIGFzIEFQIGFnYWluLCBuZWVkIHRvIGNoZWNrIHRoZSByb2xlIGFuZCBjaGFuZ2UgYWNjb3JkaW5nbHkgKi8KKyAgICBpZiAocFN0YXJ0QnNzUmVxLT5ic3NUeXBlID09IGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERSkKKyAgICB7CisgICAgICAgIGlmICgocFN0YXJ0QnNzUmVxLT5udW1TU0lEID09IDEpICYmIHBTdGFydEJzc1JlcS0+c3NJZC5sZW5ndGggJiYKKyAgICAgICAgICAgICgocFN0YXJ0QnNzUmVxLT5zc0lkLmxlbmd0aCAhPSBwU3RhcnRCc3NSZXEtPnNzSWRMaXN0WzBdLmxlbmd0aCkgfHwKKyAgICAgICAgICAgICggIXBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLHBTdGFydEJzc1JlcS0+c3NJZC5zc0lkLAorICAgICAgICAgICAgICAgICAgICBwU3RhcnRCc3NSZXEtPnNzSWRMaXN0WzBdLnNzSWQsCisgICAgICAgICAgICAgICAgICAgIHBTdGFydEJzc1JlcS0+c3NJZC5sZW5ndGgpICkpKQorICAgICAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHNzSUQgbGVuZ3RoCisgICAgICAgICAqIGFuZCBudW1iZXIgb2YgU1NJRHMgcHJlc2VudC4KKyAgICAgICAgICogUmVqZWN0IFNUQVJUX0JTU19SRVEuCisgICAgICAgICAqLworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgIEZMKCJNaXNtYXRjaCBpbiBTU0lEIGxlbmd0aCAmIG51bVNTSUQgaW4gU01FX1NUQVJUX0JTU19SRVFcbiIpKTsKKworICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwU3RhcnRCc3NSZXEtPm51bVNTSUQgfHwKKyAgICAgICAgICAgIChwU3RhcnRCc3NSZXEtPnNzSWQubGVuZ3RoICYmIChwU3RhcnRCc3NSZXEtPm51bVNTSUQgIT0gMSkpKQorICAgICAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHNzSUQgbGVuZ3RoCisgICAgICAgICAqIGFuZCBudW1iZXIgb2YgU1NJRHMgcHJlc2VudC4KKyAgICAgICAgICogUmVqZWN0IFNUQVJUX0JTU19SRVEuCisgICAgICAgICAqLworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICAgRkwoIk1pc21hdGNoIGluIFNTSUQgbGVuZ3RoWyVkXSAmIG51bVNTSURbJWRdIGluIFNNRV9TVEFSVF9CU1NfUkVRXG4iKSwKKyAgICAgICAgICAgICAgICBwU3RhcnRCc3NSZXEtPnNzSWQubGVuZ3RoLCBwU3RhcnRCc3NSZXEtPm51bVNTSUQpOworCisgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgIC8qIFRoaXMgYmVsb3cgY29kZSBpcyBjbGllbnQgc3BlY2lmaWMgY29kZS4gVE9ETyAqLworICAgIGlmIChwU3RhcnRCc3NSZXEtPmJzc1R5cGUgPT0gZVNJUl9JQlNTX01PREUpCisgICAgeworICAgICAgICBpZiAoIXBTdGFydEJzc1JlcS0+c3NJZC5sZW5ndGggfHwKKyAgICAgICAgICAgIChwU3RhcnRCc3NSZXEtPnNzSWQubGVuZ3RoID4gU0lSX01BQ19NQVhfU1NJRF9MRU5HVEgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnZhbGlkIGxlbmd0aCBmb3IgU1NJRC4gIAorICAgICAgICAgICAgLy8gUmVqZWN0IFNUQVJUX0JTU19SRVEKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgIEZMKCJJbnZhbGlkIFNTSUQgbGVuZ3RoIGluIGVXTklfU01FX1NUQVJUX0JTU19SRVFcbiIpKTsKKworICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgLyogQXNzdW1lZCBhcyBBUCBUT0RPICovCisgICAgaWYgKHBTdGFydEJzc1JlcS0+YnNzVHlwZSA9PSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREUpCisgICAgeworICAgICAgICB0cFNpckFsdGVybmF0ZVJhZGlvSW5mbyBwUmFkaW9JbmZvOworCisgICAgICAgIHBSYWRpb0luZm8gPSBwU3RhcnRCc3NSZXEtPmFsdGVybmF0ZVJhZGlvTGlzdC5hbHRlcm5hdGVSYWRpbzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTdGFydEJzc1JlcS0+YWx0ZXJuYXRlUmFkaW9MaXN0Lm51bUJzczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobGltSXNHcm91cEFkZHIocFJhZGlvSW5mby0+YnNzSWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEludmFsaWQgbWF0ZSBCU1NJRC4KKyAgICAgICAgICAgICAgICAvLyBSZWplY3QgU1RBUlRfQlNTX1JFUQorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiSW52YWxpZCBtYXRlIEJTU0lEIGluIGVXTklfU01FX1NUQVJUX0JTU19SRVFcbiIpKTsKKworICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwUmFkaW9JbmZvICs9IHNpemVvZih0U2lyQWx0ZXJuYXRlUmFkaW9JbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAgICAqKiBjaGVjayBXRFMgaW5mbyBsZW5ndGgKKyAgICAgICAgKiovCisgICAgICAgIGlmIChwU3RhcnRCc3NSZXEtPndkc0luZm8ud2RzTGVuZ3RoID4gQU5JX1dEU19JTkZPX01BWF9MRU5HVEgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIklsbGVnYWwgV0RTIGluZm8gbGVuZ3RoXG4iKSk7KQorICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIWxpbUlzUlNOaWVWYWxpZEluU21lUmVxTWVzc2FnZShwTWFjLCAmcFN0YXJ0QnNzUmVxLT5yc25JRSkpCisgICAgeworICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAocFN0YXJ0QnNzUmVxLT5ud1R5cGUgIT0gZVNJUl8xMUFfTldfVFlQRSAmJgorICAgICAgICBwU3RhcnRCc3NSZXEtPm53VHlwZSAhPSBlU0lSXzExQl9OV19UWVBFICYmCisgICAgICAgIHBTdGFydEJzc1JlcS0+bndUeXBlICE9IGVTSVJfMTFHX05XX1RZUEUpCisgICAgeworICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAocFN0YXJ0QnNzUmVxLT5ud1R5cGUgPT0gZVNJUl8xMUFfTldfVFlQRSkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3RhcnRCc3NSZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlczsgaSsrKQorICAgICAgICAgICAgaWYgKCFzaXJJc0FyYXRlKHBTdGFydEJzc1JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbaV0gJiAweDdGKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSW52YWxpZCBPcGVyYXRpb25hbCByYXRlcworICAgICAgICAgICAgLy8gUmVqZWN0IFNUQVJUX0JTU19SRVEKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgRkwoIkludmFsaWQgb3BlcmF0aW9uYWwgcmF0ZXMgaW4gZVdOSV9TTUVfU1RBUlRfQlNTX1JFUVxuIikpOworICAgICAgICAgICAgc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HVywKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMpOworCisgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gY2hlY2sgaWYgYWxsIHRoZSByYXRlcyBpbiB0aGUgb3BlcmF0aW9hbCByYXRlIHNldCBhcmUgbGVnYWwgMTFHIHJhdGVzCisgICAgZWxzZSBpZiAocFN0YXJ0QnNzUmVxLT5ud1R5cGUgPT0gZVNJUl8xMUdfTldfVFlQRSkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3RhcnRCc3NSZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlczsgaSsrKQorICAgICAgICAgICAgaWYgKCFzaXJJc0dyYXRlKHBTdGFydEJzc1JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbaV0gJiAweDdGKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSW52YWxpZCBPcGVyYXRpb25hbCByYXRlcworICAgICAgICAgICAgLy8gUmVqZWN0IFNUQVJUX0JTU19SRVEKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgRkwoIkludmFsaWQgb3BlcmF0aW9uYWwgcmF0ZXMgaW4gZVdOSV9TTUVfU1RBUlRfQlNTX1JFUVxuIikpOworICAgICAgICAgICAgc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HVywKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMpOworCisgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3RhcnRCc3NSZXEtPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlczsgaSsrKQorICAgICAgICAgICAgaWYgKCFzaXJJc0JyYXRlKHBTdGFydEJzc1JlcS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbaV0gJiAweDdGKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSW52YWxpZCBPcGVyYXRpb25hbCByYXRlcworICAgICAgICAgICAgLy8gUmVqZWN0IFNUQVJUX0JTU19SRVEKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgRkwoIkludmFsaWQgb3BlcmF0aW9uYWwgcmF0ZXMgaW4gZVdOSV9TTUVfU1RBUlRfQlNTX1JFUVxuIikpOworICAgICAgICAgICAgc2lyRHVtcEJ1ZihwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HVywKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0YXJ0QnNzUmVxLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMpOworCisgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisKK2VuZDoKKyAgICByZXR1cm4gdmFsaWQ7Cit9IC8qKiogZW5kIGxpbUlzU21lU3RhcnRCc3NSZXFWYWxpZCgpICoqKi8KKworCisKKy8qKgorICogbGltSXNTbWVKb2luUmVxVmFsaWQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX0pPSU5fUkVRIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKkxPR0lDOgorICogTWVzc2FnZSB2YWxpZGl0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcEpvaW5SZXEgICBQb2ludGVyIHRvIHJlY2VpdmVkIFNNRV9KT0lOX1JFUSBtZXNzYWdlCisgKiBAcmV0dXJuIHRydWUgIHdoZW4gcmVjZWl2ZWQgU01FX0pPSU5fUkVRIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkKKyAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KKwordEFOSV9VOAorbGltSXNTbWVKb2luUmVxVmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVKb2luUmVxIHBKb2luUmVxKQoreworICAgIHRBTklfVTggdmFsaWQgPSB0cnVlOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgaWYgKHBKb2luUmVxLT5hc3NvY1R5cGUgPiBlU0lSX1RSQU5TRkVSUkVEKQorICAgIHsKKyAgICAgICAgLy8vIFJlY2VpdmVkIGVXTklfU01FX0pPSU5fUkVRIHdpdGggaW52YWxpZCBhc3NvY1R5cGUKKyAgICAgICAgLy8gTG9nIHRoZSBldmVudAorICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBTTUVfSk9JTl9SRVEgd2l0aCBpbnZhbGlkIGFzc29jVHlwZVxuIikpOworCisgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCFsaW1Jc1JTTmllVmFsaWRJblNtZVJlcU1lc3NhZ2UocE1hYywgJnBKb2luUmVxLT5yc25JRSkpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBTTUVfSk9JTl9SRVEgd2l0aCBpbnZhbGlkIFJTTklFXG4iKSk7CisgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmICghbGltSXNBZGRpZVZhbGlkSW5TbWVSZXFNZXNzYWdlKHBNYWMsICZwSm9pblJlcS0+YWRkSUVTY2FuKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoInJlY2VpdmVkIFNNRV9KT0lOX1JFUSB3aXRoIGludmFsaWQgYWRkaXRpb25hbCBJRSBmb3Igc2NhblxuIikpOworICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAoIWxpbUlzQWRkaWVWYWxpZEluU21lUmVxTWVzc2FnZShwTWFjLCAmcEpvaW5SZXEtPmFkZElFQXNzb2MpKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgicmVjZWl2ZWQgU01FX0pPSU5fUkVRIHdpdGggaW52YWxpZCBhZGRpdGlvbmFsIElFIGZvciBhc3NvY1xuIikpOworICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICBpZiAoIWxpbUlzQnNzSW5mb1ZhbGlkSW5TbWVSZXFNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgIHBKb2luUmVxLT5uZWlnaGJvckJzc0xpc3QuYnNzTGlzdCkpCisjZWxzZQorICAgIGlmICghbGltSXNCc3NEZXNjclZhbGlkSW5TbWVSZXFNZXNzYWdlKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBKb2luUmVxLT5ic3NEZXNjcmlwdGlvbikpCisjZW5kaWYKKyAgICB7CisgICAgICAgIC8vLyBSZWNlaXZlZCBlV05JX1NNRV9KT0lOX1JFUSB3aXRoIGludmFsaWQgQlNTIEluZm8KKyAgICAgICAgLy8gTG9nIHRoZSBldmVudAorICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIEZMKCJyZWNlaXZlZCBTTUVfSk9JTl9SRVEgd2l0aCBpbnZhbGlkIGJzc0luZm9cbiIpKTsKKworICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKK2VuZDoKKyAgICByZXR1cm4gdmFsaWQ7Cit9IC8qKiogZW5kIGxpbUlzU21lSm9pblJlcVZhbGlkKCkgKioqLworCisKKworLyoqCisgKiBsaW1Jc1NtZURpc2Fzc29jUmVxVmFsaWQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX0RJU0FTU09DX1JFUSBtZXNzYWdlIGZyb20gYXBwbGljYXRpb24uCisgKgorICpMT0dJQzoKKyAqIE1lc3NhZ2UgdmFsaWRpdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcERpc2Fzc29jUmVxIFBvaW50ZXIgdG8gcmVjZWl2ZWQgU01FX0RJU0FTU09DX1JFUSBtZXNzYWdlCisgKiBAcmV0dXJuIHRydWUgICAgICAgICBXaGVuIHJlY2VpdmVkIFNNRV9ESVNBU1NPQ19SRVEgaXMgZm9ybWF0dGVkCisgKiAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0bHkKKyAqICAgICAgICAgZmFsc2UgICAgICAgIG90aGVyd2lzZQorICovCisKK3RBTklfVTgKK2xpbUlzU21lRGlzYXNzb2NSZXFWYWxpZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyU21lRGlzYXNzb2NSZXEgcERpc2Fzc29jUmVxLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIGlmIChsaW1Jc0dyb3VwQWRkcihwRGlzYXNzb2NSZXEtPnBlZXJNYWNBZGRyKSAmJgorICAgICAgICAgIWxpbUlzQWRkckJDKHBEaXNhc3NvY1JlcS0+cGVlck1hY0FkZHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICBpZiAoKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgJiYKKyAgICAgICAgICgocERpc2Fzc29jUmVxLT5haWQgPCAyKSB8fCAocERpc2Fzc29jUmVxLT5haWQgPiAyMDA3KSkpIHx8CisgICAgICAgICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKSAmJgorICAgICAgICAgKHBEaXNhc3NvY1JlcS0+YWlkICE9IDEpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisKKyAgICByZXR1cm4gdHJ1ZTsKK30gLyoqKiBlbmQgbGltSXNTbWVEaXNhc3NvY1JlcVZhbGlkKCkgKioqLworCisKKworLyoqCisgKiBsaW1Jc1NtZURpc2Fzc29jQ25mVmFsaWQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX0RJU0FTU09DX0NORiBtZXNzYWdlIGZyb20gYXBwbGljYXRpb24uCisgKgorICpMT0dJQzoKKyAqIE1lc3NhZ2UgdmFsaWRpdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgcERpc2Fzc29jQ25mIFBvaW50ZXIgdG8gcmVjZWl2ZWQgU01FX0RJU0FTU09DX1JFUSBtZXNzYWdlCisgKiBAcmV0dXJuIHRydWUgICAgICAgICBXaGVuIHJlY2VpdmVkIFNNRV9ESVNBU1NPQ19DTkYgaXMgZm9ybWF0dGVkCisgKiAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0bHkKKyAqICAgICAgICAgZmFsc2UgICAgICAgIG90aGVyd2lzZQorICovCisKK3RBTklfVTgKK2xpbUlzU21lRGlzYXNzb2NDbmZWYWxpZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyU21lRGlzYXNzb2NDbmYgcERpc2Fzc29jQ25mLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIGlmIChsaW1Jc0dyb3VwQWRkcihwRGlzYXNzb2NDbmYtPnBlZXJNYWNBZGRyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgaWYgKCgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpICYmCisgICAgICAgICAoKHBEaXNhc3NvY0NuZi0+YWlkIDwgMikgfHwgKHBEaXNhc3NvY0NuZi0+YWlkID4gMjAwNykpKSB8fAorICAgICAgICAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSkgJiYKKyAgICAgICAgIChwRGlzYXNzb2NDbmYtPmFpZCAhPSAxKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfSAvKioqIGVuZCBsaW1Jc1NtZURpc2Fzc29jQ25mVmFsaWQoKSAqKiovCisKKworCisvKioKKyAqIGxpbUlzU21lRGVhdXRoUmVxVmFsaWQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX0RFQVVUSF9SRVEgbWVzc2FnZSBmcm9tIGFwcGxpY2F0aW9uLgorICoKKyAqTE9HSUM6CisgKiBNZXNzYWdlIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwRGVhdXRoUmVxIFBvaW50ZXIgdG8gcmVjZWl2ZWQgU01FX0RFQVVUSF9SRVEgbWVzc2FnZQorICogQHJldHVybiB0cnVlICAgICAgIFdoZW4gcmVjZWl2ZWQgU01FX0RFQVVUSF9SRVEgaXMgZm9ybWF0dGVkIGNvcnJlY3RseQorICogICAgICAgICBmYWxzZSAgICAgIG90aGVyd2lzZQorICovCisKK3RBTklfVTgKK2xpbUlzU21lRGVhdXRoUmVxVmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVEZWF1dGhSZXEgcERlYXV0aFJlcSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICBpZiAobGltSXNHcm91cEFkZHIocERlYXV0aFJlcS0+cGVlck1hY0FkZHIpICYmCisgICAgICAgICAhbGltSXNBZGRyQkMocERlYXV0aFJlcS0+cGVlck1hY0FkZHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICBpZiAoKChwc2Vzc2lvbkVudHJ5cC0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpICYmCisgICAgICAgICAoKHBEZWF1dGhSZXEtPmFpZCA8IDIpIHx8IChwRGVhdXRoUmVxLT5haWQgPiAyMDA3KSkpIHx8CisgICAgICAgICgocHNlc3Npb25FbnRyeXAtPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSkgJiYKKyAgICAgICAgIChwRGVhdXRoUmVxLT5haWQgIT0gMSkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30gLyoqKiBlbmQgbGltSXNTbWVEZWF1dGhSZXFWYWxpZCgpICoqKi8KKworCisKKy8qKgorICogbGltSXNTbWVTY2FuUmVxVmFsaWQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMoKSB1cG9uCisgKiByZWNlaXZpbmcgU01FX1NDQU5fUkVRIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKkxPR0lDOgorICogTWVzc2FnZSB2YWxpZGl0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwU2NhblJlcSBQb2ludGVyIHRvIHJlY2VpdmVkIFNNRV9TQ0FOX1JFUSBtZXNzYWdlCisgKiBAcmV0dXJuIHRydWUgIHdoZW4gcmVjZWl2ZWQgU01FX1NDQU5fUkVRIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkKKyAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KKwordEFOSV9VOAorbGltSXNTbWVTY2FuUmVxVmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVTY2FuUmVxIHBTY2FuUmVxKQoreworICAgIHRBTklfVTggdmFsaWQgPSB0cnVlOworICAgIHRBTklfVTggaSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNjYW5SZXEtPm51bVNzaWQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwU2NhblJlcS0+c3NJZFtpXS5sZW5ndGggPiBTSVJfTUFDX01BWF9TU0lEX0xFTkdUSCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGdvdG8gZW5kOyAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHBTY2FuUmVxLT5ic3NUeXBlID4gZVNJUl9BVVRPX01PREUpIHx8CisgICAgICAgIChsaW1Jc0dyb3VwQWRkcihwU2NhblJlcS0+YnNzSWQpICYmICFsaW1Jc0FkZHJCQyhwU2NhblJlcS0+YnNzSWQpKSB8fAorICAgICAgICAoIShwU2NhblJlcS0+c2NhblR5cGUgPT0gZVNJUl9QQVNTSVZFX1NDQU4gfHwgcFNjYW5SZXEtPnNjYW5UeXBlID09IGVTSVJfQUNUSVZFX1NDQU4pKSB8fCAKKyAgICAgICAgKHBTY2FuUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA+IFNJUl9NQVhfTlVNX0NIQU5ORUxTKSkKKyAgICB7CisgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8qCisgICAgKiogY2hlY2sgbWluL21heCBjaGFubmVsVGltZSByYW5nZQorICAgICoqLworCisgICAgaWYgKChwU2NhblJlcS0+c2NhblR5cGUgPT0gZVNJUl9BQ1RJVkVfU0NBTikgJiYgCisgICAgICAgIChwU2NhblJlcS0+bWF4Q2hhbm5lbFRpbWUgPCBwU2NhblJlcS0+bWluQ2hhbm5lbFRpbWUpKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiTWF4IENoYW5uZWwgVGltZSA8IE1pbiBDaGFubmVsIFRpbWVcbiIpKTspCisgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworZW5kOgorICAgIHJldHVybiB2YWxpZDsKK30gLyoqKiBlbmQgbGltSXNTbWVTY2FuUmVxVmFsaWQoKSAqKiovCisKKworCisvKioKKyAqIGxpbUlzU21lQXV0aFJlcVZhbGlkKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9BVVRIX1JFUSBtZXNzYWdlIGZyb20gYXBwbGljYXRpb24uCisgKgorICpMT0dJQzoKKyAqIE1lc3NhZ2UgdmFsaWRpdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcEF1dGhSZXEgUG9pbnRlciB0byByZWNlaXZlZCBTTUVfQVVUSF9SRVEgbWVzc2FnZQorICogQHJldHVybiB0cnVlICB3aGVuIHJlY2VpdmVkIFNNRV9BVVRIX1JFUSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5CisgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICovCisKK3RBTklfVTgKK2xpbUlzU21lQXV0aFJlcVZhbGlkKHRwU2lyU21lQXV0aFJlcSBwQXV0aFJlcSkKK3sKKyAgICB0QU5JX1U4IHZhbGlkID0gdHJ1ZTsKKworICAgIGlmIChsaW1Jc0dyb3VwQWRkcihwQXV0aFJlcS0+cGVlck1hY0FkZHIpIHx8CisgICAgICAgIChwQXV0aFJlcS0+YXV0aFR5cGUgPiBlU0lSX0FVVE9fU1dJVENIKSB8fAorICAgICAgICAhcEF1dGhSZXEtPmNoYW5uZWxOdW1iZXIpCisgICAgeworICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKK2VuZDoKKyAgICByZXR1cm4gdmFsaWQ7Cit9IC8qKiogZW5kIGxpbUlzU21lQXV0aFJlcVZhbGlkKCkgKioqLworCisKKworLyoqCisgKiBsaW1Jc1NtZVNldENvbnRleHRSZXFWYWxpZCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NTbWVSZXFNZXNzYWdlcygpIHVwb24KKyAqIHJlY2VpdmluZyBTTUVfU0VUX0NPTlRFWFRfUkVRIG1lc3NhZ2UgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKkxPR0lDOgorICogTWVzc2FnZSB2YWxpZGl0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTXNnIC0gUG9pbnRlciB0byByZWNlaXZlZCBTTUVfU0VUX0NPTlRFWFRfUkVRIG1lc3NhZ2UKKyAqIEByZXR1cm4gdHJ1ZSAgd2hlbiByZWNlaXZlZCBTTUVfU0VUX0NPTlRFWFRfUkVRIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkKKyAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KKwordEFOSV9VOAorbGltSXNTbWVTZXRDb250ZXh0UmVxVmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVTZXRDb250ZXh0UmVxICBwU2V0Q29udGV4dFJlcSkKK3sKKyAgICB0QU5JX1U4IGkgPSAwOworICAgIHRBTklfVTggdmFsaWQgPSB0cnVlOworICAgIHRwU2lyS2V5cyBwS2V5ID0gcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmtleTsKKworICAgIGlmICgocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSAhPSBlU0lSX0VEX1dFUDQwKSAmJgorICAgICAgICAocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSAhPSBlU0lSX0VEX1dFUDEwNCkgJiYKKyAgICAgICAgKHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5lZFR5cGUgIT0gZVNJUl9FRF9OT05FKSAmJgorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgIChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlICE9IGVTSVJfRURfV1BJKSAmJiAKKyNlbmRpZgorICAgICAgICAhcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLm51bUtleXMpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogTm8ga2V5cyBwcmVzZW50IGluIGNhc2Ugb2YgVEtJUCBvciBDQ01QCisgICAgICAgICAqIExvZyBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICBGTCgiTm8ga2V5cyBwcmVzZW50IGluIFNNRV9TRVRDT05URVhUX1JFUSBmb3IgZWRUeXBlPSVkXG4iKSwKKyAgICAgICAgICAgcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSk7CisKKyAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5udW1LZXlzICYmCisgICAgICAgIChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlID09IGVTSVJfRURfTk9ORSkpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogS2V5cyBwcmVzZW50IGluIGNhc2Ugb2Ygbm8gRUQgcG9saWN5CisgICAgICAgICAqIExvZyBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICBGTCgiS2V5cyBwcmVzZW50IGluIFNNRV9TRVRDT05URVhUX1JFUSBmb3IgZWRUeXBlPSVkXG4iKSwKKyAgICAgICAgICAgcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSk7CisKKyAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5lZFR5cGUgPj0gZVNJUl9FRF9OT1RfSU1QTEVNRU5URUQpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogSW52YWxpZCBlZFR5cGUgaW4gdGhlIG1lc3NhZ2UKKyAgICAgICAgICogTG9nIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICAgICBGTCgiSW52YWxpZCBlZFR5cGU9JWQgaW4gU01FX1NFVENPTlRFWFRfUkVRXG4iKSwKKyAgICAgICAgICAgICAgIHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5lZFR5cGUpOworCisgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBlbHNlIGlmIChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlID4gZVNJUl9FRF9OT05FKQorICAgIHsKKyAgICAgICAgdEFOSV9VMzIgcG9pOworCisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1BSSVZBQ1lfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAmcG9pKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gcmV0cmlldmUgUE9JIGZyb20gQ0ZHXG4iKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBvaSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBQcml2YWN5IGlzIG5vdCBlbmFibGVkCisgICAgICAgICAgICAgKiBJbiBvcmRlciB0byBhbGxvdyBtaXhlZCBtb2RlIGZvciBHdWVzdCBhY2Nlc3MKKyAgICAgICAgICAgICAqIGFsbG93IEJTUyBjcmVhdGlvbi9qb2luIHdpdGggbm8gUHJpdmFjeSBjYXBhYmlsaXR5CisgICAgICAgICAgICAgKiB5ZXQgYWR2ZXJ0aXNpbmcgV1BBIElFCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgIEZMKCJQcml2YWN5IGlzIG5vdCBlbmFibGVkLCB5ZXQgbm9uLU5vbmUgRUR0eXBlPSVkIGluIFNNRV9TRVRDT05URVhUX1JFUVxuIiksCisgICAgICAgICAgICAgICBwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlKTspCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLm51bUtleXM7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgoKHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5lZFR5cGUgPT0gZVNJUl9FRF9XRVA0MCkgJiYKKyAgICAgICAgICAgICAocEtleS0+a2V5TGVuZ3RoICE9IDUpKSB8fAorICAgICAgICAgICAgKChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlID09IGVTSVJfRURfV0VQMTA0KSAmJgorICAgICAgICAgICAgIChwS2V5LT5rZXlMZW5ndGggIT0gMTMpKSB8fAorICAgICAgICAgICAgKChwU2V0Q29udGV4dFJlcS0+a2V5TWF0ZXJpYWwuZWRUeXBlID09IGVTSVJfRURfVEtJUCkgJiYKKyAgICAgICAgICAgICAocEtleS0+a2V5TGVuZ3RoICE9IDMyKSkgfHwKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSSAKKyAgICAgICAgICAgICgocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSA9PSBlU0lSX0VEX1dQSSkgJiYKKyAgICAgICAgICAgICAocEtleS0+a2V5TGVuZ3RoICE9IDMyKSkgfHwKKyNlbmRpZiAKKyAgICAgICAgICAgICgocFNldENvbnRleHRSZXEtPmtleU1hdGVyaWFsLmVkVHlwZSA9PSBlU0lSX0VEX0NDTVApICYmCisgICAgICAgICAgICAgKHBLZXktPmtleUxlbmd0aCAhPSAxNikpKQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEludmFsaWQga2V5IGxlbmd0aCBmb3IgYSBnaXZlbiBFRCB0eXBlCisgICAgICAgICAgICAgKiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgRkwoIkludmFsaWQga2V5TGVuZ3RoID0lZCBmb3IgZWRUeXBlPSVkIGluIFNNRV9TRVRDT05URVhUX1JFUVxuIiksCisgICAgICAgICAgICAgICBwS2V5LT5rZXlMZW5ndGgsIHBTZXRDb250ZXh0UmVxLT5rZXlNYXRlcmlhbC5lZFR5cGUpOworCisgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgcEtleSsrOworICAgIH0KKworZW5kOgorICAgIHJldHVybiB2YWxpZDsKK30gLyoqKiBlbmQgbGltSXNTbWVTZXRDb250ZXh0UmVxVmFsaWQoKSAqKiovCisKKworCisvKioKKyAqIGxpbUlzU21lU3RvcEJzc1JlcVZhbGlkKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzKCkgdXBvbgorICogcmVjZWl2aW5nIFNNRV9TVE9QX0JTU19SRVEgbWVzc2FnZSBmcm9tIGFwcGxpY2F0aW9uLgorICoKKyAqTE9HSUM6CisgKiBNZXNzYWdlIHZhbGlkaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24KKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNc2cgLSBQb2ludGVyIHRvIHJlY2VpdmVkIFNNRV9TVE9QX0JTU19SRVEgbWVzc2FnZQorICogQHJldHVybiB0cnVlICB3aGVuIHJlY2VpdmVkIFNNRV9TVE9QX0JTU19SRVEgaXMgZm9ybWF0dGVkIGNvcnJlY3RseQorICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAqLworCit0QU5JX1U4CitsaW1Jc1NtZVN0b3BCc3NSZXFWYWxpZCh0QU5JX1UzMiAqcE1zZykKK3sKKyAgICB0QU5JX1U4IHZhbGlkID0gdHJ1ZTsKKworICAgIHJldHVybiB2YWxpZDsKK30gLyoqKiBlbmQgbGltSXNTbWVTdG9wQnNzUmVxVmFsaWQoKSAqKiovCisKKworLyoqCisgKiBsaW1HZXRCc3NJZEZyb21TbWVKb2luUmVxTXNnKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdmFyaW91cyBwbGFjZXMgdG8gZ2V0IEJTU0lECisgKiBmcm9tIEJTUyBkZXNjcmlwdGlvbi9OZWlnaGJvciBCU1MgSW5mbyBpbiB0aGUgU01FX0pPSU5fUkVRLworICogU01FX1JFQVNTT0NfUkVRIG1lc3NhZ2UuCisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgICAgcEJ1ZiAgIC0gUG9pbnRlciB0byByZWNlaXZlZCBTTUVfSk9JTi9TTUVfUkVBU1NPQ19SRVEKKyAqICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZQorICogQHJldHVybiAgICBwQnNzSWQgLSBQb2ludGVyIHRvIEJTU0lECisgKi8KKwordEFOSV9VOCoKK2xpbUdldEJzc0lkRnJvbVNtZUpvaW5SZXFNc2codEFOSV9VOCAqcEJ1ZikKK3sKKyAgICBpZiAoIXBCdWYpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOyAvLyBza2lwIG1lc3NhZ2UgaGVhZGVyCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICBwQnVmICs9IHNpemVvZih0U2lyQXNzb2NUeXBlKTsgLy8gc2tpcCBhc3NvY1R5cGUKKyNlbmRpZgorCisgICAgcEJ1ZiArPSBsaW1HZXRVMTYocEJ1ZikgKyBzaXplb2YodEFOSV9VMTYpOyAvLyBza2lwIFJTTiBJRQorCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgIHBCdWYgICs9IHNpemVvZih0QW5pQm9vbCk7ICAgICAgICAgICAgLy8gc2tpcCBCUCBpbmRpY2F0b3IKKyAgICBwQnVmICArPSBzaXplb2YodFNpckJwSW5kaWNhdG9yVHlwZSk7IC8vIHNraXAgQlAgaW5kaWNhdG9yIHR5cGUKKyAgICBwQnVmICArPSBzaXplb2YodEFOSV9VMzIpOyAgICAgICAgICAgICAgICAgLy8gc2tpcCBudW1iZXIgb2YgbmVpZ2hib3IgQlNTCisjZWxzZQorICAgIHBCdWYgICs9IHNpemVvZih0QU5JX1UxNik7ICAgICAgICAgICAgICAgICAvLyBza2lwIGxlbmd0aCBvZiBCU1MgZGVzY3JpcHRpb24KKyNlbmRpZgorCisgICAgcmV0dXJuIChwQnVmKTsKK30gLyoqKiBlbmQgbGltR2V0QnNzSWRGcm9tU21lSm9pblJlcU1zZygpICoqKi8KKworCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNtZVJlcVV0aWxzLmggYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVNtZVJlcVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlZGY1NAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU21lUmVxVXRpbHMuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbVNtZVJlcVV0aWxzLmggY29udGFpbnMgdGhlIHV0aWxpdHkgZGVmaW5pdGlvbnMKKyAqIExJTSB1c2VzIHdoaWxlIHByb2Nlc3NpbmcgU01FIHJlcXVlc3QgbWVzc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9fTElNX1NNRV9SRVFfVVRJTFNfSAorI2RlZmluZSBfX0xJTV9TTUVfUkVRX1VUSUxTX0gKKworI2luY2x1ZGUgInNpckFwaS5oIgorI2luY2x1ZGUgImxpbVR5cGVzLmgiCisKKworLy8gTElNIFNNRSByZXF1c3QgbWVzc2FnZXMgcmVsYXRlZCB1dGlsaWxpdHkgZnVuY3Rpb25zCit0QU5JX1U4IGxpbUlzU21lU3RhcnRSZXFWYWxpZCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIgKik7Cit0QU5JX1U4IGxpbUlzU21lU3RhcnRCc3NSZXFWYWxpZCh0cEFuaVNpckdsb2JhbCwgdHBTaXJTbWVTdGFydEJzc1JlcSk7Cit0QU5JX1U4IGxpbVNldFJTTmllV1BBaWVmcm9tU21lU3RhcnRCU1NSZXFNZXNzYWdlKHRwQW5pU2lyR2xvYmFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUlNOaWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbik7Cit0QU5JX1U4IGxpbUlzU21lU2NhblJlcVZhbGlkKHRwQW5pU2lyR2xvYmFsLCB0cFNpclNtZVNjYW5SZXEpOwordEFOSV9VOCBsaW1Jc1NtZUpvaW5SZXFWYWxpZCh0cEFuaVNpckdsb2JhbCwgdHBTaXJTbWVKb2luUmVxKTsKK3RBTklfVTggbGltSXNTbWVBdXRoUmVxVmFsaWQodHBTaXJTbWVBdXRoUmVxKTsKK3RBTklfVTggbGltSXNTbWVEaXNhc3NvY1JlcVZhbGlkKHRwQW5pU2lyR2xvYmFsLCB0cFNpclNtZURpc2Fzc29jUmVxLCB0cFBFU2Vzc2lvbik7Cit0QU5JX1U4IGxpbUlzU21lRGVhdXRoUmVxVmFsaWQodHBBbmlTaXJHbG9iYWwsIHRwU2lyU21lRGVhdXRoUmVxLCB0cFBFU2Vzc2lvbik7Cit0QU5JX1U4IGxpbUlzU21lU2V0Q29udGV4dFJlcVZhbGlkKHRwQW5pU2lyR2xvYmFsLCB0cFNpclNtZVNldENvbnRleHRSZXEpOwordEFOSV9VOCBsaW1Jc1NtZVN0b3BCc3NSZXFWYWxpZCh0QU5JX1UzMiAqKTsKK3RBTklfVTgqICBsaW1HZXRCc3NJZEZyb21TbWVKb2luUmVxTXNnKHRBTklfVTggKik7Cit0QU5JX1U4IGxpbUlzU21lRGlzYXNzb2NDbmZWYWxpZCh0cEFuaVNpckdsb2JhbCwgdHBTaXJTbWVEaXNhc3NvY0NuZiwgdHBQRVNlc3Npb24pOworCisjZW5kaWYgLyogX19MSU1fU01FX1JFUV9VVElMU19IICovCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVN0YUhhc2hBcGkuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU3RhSGFzaEFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTQwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVN0YUhhc2hBcGkuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogbGltU3RhSGFzaEFwaS5jOiBQcm92aWRlcyBhY2Nlc3MgZnVuY3Rpb25zIHRvIGdldC9zZXQgdmFsdWVzIG9mIHN0YXRpb24gaGFzaCBlbnRyeSBmaWVsZHMuCisgKiBBdXRob3I6ICAgIFN1bml0IEJoYXRpYQorICogRGF0ZTogICAgICAgMDkvMTkvMjAwNgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICBNb2RpZmllZCBieSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlICJsaW1TdGFIYXNoQXBpLmgiCisKKworLyoqCisgKiBsaW1HZXRTdGFIYXNoQnNzaWR4KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gR2V0IHRoZSBCc3MgSW5kZXggb2YgdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIFN0YXRpb24uCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBwTWFjICBwb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlLgorICogQHBhcmFtIGFzc29jSWQgQXNzb2NJRCBvZiB0aGUgU3RhdGlvbi4KKyAqIEBwYXJhbSBic3NpZHggcG9pbnRlciB0byB0aGUgYnNzIGluZGV4LCB3aGljaCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi4KKyAqCisgKiBAcmV0dXJuIHN1Y2Nlc3MgaWYgR0VUIG9wZXJhdGlvbiBpcyBvaywgZWxzZSBGYWlsdXJlLgorICovCisKK3RTaXJSZXRTdGF0dXMgbGltR2V0U3RhSGFzaEJzc2lkeCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBhc3NvY0lkLCB0QU5JX1U4ICpic3NpZHgsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhID0gZHBoR2V0SGFzaEVudHJ5KHBNYWMsIGFzc29jSWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgIGlmIChwU3RhID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJpbnZhbGlkIFNUQSAlZFxuIiksICBhc3NvY0lkKTspCisgICAgICAgIHJldHVybiBlU0lSX0xJTV9JTlZBTElEX1NUQTsKKyAgICB9CisKKyAgICAqYnNzaWR4ID0gKHRBTklfVTgpcFN0YS0+YnNzSWQ7CisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU3RhSGFzaEFwaS5oIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1TdGFIYXNoQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5YTZiZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltU3RhSGFzaEFwaS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltU3RhSGFzaEFwaS5oIGNvbnRhaW5zIHRoZQorICogZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgYWNjZXNzaW5nIHN0YXRpb24gaGFzaCBlbnRyeSBmaWVsZHMuCisgKgorICogQXV0aG9yOiAgICAgIFN1bml0IEJoYXRpYQorICogRGF0ZTogICAgICAgIDA5LzE5LzIwMDYKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTV9TVEFfSEFTSF9BUElfSF9fCisjZGVmaW5lIF9fTElNX1NUQV9IQVNIX0FQSV9IX18KKworCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAibGltVHlwZXMuaCIKKwordFNpclJldFN0YXR1cyBsaW1HZXRTdGFIYXNoQnNzaWR4KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IGFzc29jSWQsIHRBTklfVTggKmJzc2lkeCx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworI2VuZGlmCisKKworCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltVGltZXJVdGlscy5jIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1UaW1lclV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwYjJhNQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltVGltZXJVdGlscy5jCkBAIC0wLDAgKzEsMjIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbVRpbWVyVXRpbHMuY2MgY29udGFpbnMgdGhlIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBMSU0gdXNlcyBmb3IgaGFuZGxpbmcgdmFyaW91cyB0aW1lcnMuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMy8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJsaW1Bc3NvY1V0aWxzLmgiCisjaW5jbHVkZSAibGltU2VjdXJpdHlVdGlscy5oIgorI2luY2x1ZGUgInBtbUFwaS5oIgorCisKKy8vIGRlZmF1bHQgdmFsdWUgNTAwMCBtcyBmb3IgYmFja2dyb3VuZCBzY2FuIHBlcmlvZCB3aGVuIGl0IGlzIGRpc2FibGVkCisjZGVmaW5lIExJTV9CQUNLR1JPVU5EX1NDQU5fUEVSSU9EX0RFRkFVTFRfTVMgICAgNTAwMAorLy8gY2hhbm5lbCBTd2l0Y2ggVGltZXIgaW4gdGlja3MKKyNkZWZpbmUgTElNX0NIQU5ORUxfU1dJVENIX1RJTUVSX1RJQ0tTICAgICAgICAgICAxCisvLyBMaW0gUXVpdGUgdGltZXIgaW4gdGlja3MKKyNkZWZpbmUgTElNX1FVSUVUX1RJTUVSX1RJQ0tTICAgICAgICAgICAgICAgICAgICAxMDAKKy8vIExpbSBRdWl0ZSBCU1MgdGltZXIgaW50ZXZhbCBpbiB0aWNrcworI2RlZmluZSBMSU1fUVVJRVRfQlNTX1RJTUVSX1RJQ0sgICAgICAgICAgICAgICAgIDEwMAorLy8gTGltIEtlZXBBbGl2ZSB0aW1lciBkZWZhdWx0ICgzMDAwKW1zCisjZGVmaW5lIExJTV9LRUVQQUxJVkVfVElNRVJfTVMgICAgICAgICAgICAgICAgICAgMzAwMAorCisvL2RlZmF1bHQgYmVhY29uIGludGVydmFsIHZhbHVlIHVzZWQgaW4gSEIgdGltZXIgaW50ZXJ2YWwgY2FsY3VsYXRpb24KKyNkZWZpbmUgTElNX0hCX1RJTUVSX0JFQUNPTl9JTlRFUlZBTCAgICAgICAgICAgICAxMDAKKy8qKgorICogbGltQ3JlYXRlVGltZXJzKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiByZWNlaXZpbmcKKyAqIDEuIFNNRV9TVEFSVF9SRVEgZm9yIFNUQSBpbiBFU1Mgcm9sZQorICogMi4gU01FX1NUQVJUX0JTU19SRVEgZm9yIEFQIHJvbGUgJiBTVEEgaW4gSUJTUyByb2xlCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1DcmVhdGVUaW1lcnModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1UzMiBjZmdWYWx1ZSwgaTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIkNyZWF0aW5nIFRpbWVycyB1c2VkIGJ5IExJTSBtb2R1bGUgaW4gUm9sZSAlZFxuIiksIHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSk7KQorCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQUNUSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FLAorICAgICAgICAgICAgICAgICAgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ291bGQgbm90IGdldCBNaW5DaGFubmVsVGltZW91dCB2YWx1ZQorICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgTWluQ2hhbm5lbFRpbWVvdXQgdmFsdWVcbiIpKTsKKyAgICB9CisgICAgY2ZnVmFsdWUgPSBTWVNfTVNfVE9fVElDS1MoY2ZnVmFsdWUpOworCisgICAgLy8gQ3JlYXRlIE1JTi9NQVggY2hhbm5lbCB0aW1lcnMgYW5kIGFjdGl2YXRlIHRoZW0gbGF0ZXIKKyAgICBpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1NaW5DaGFubmVsVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTUlOIENIQU5ORUwgVElNRU9VVCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1UaW1lckhhbmRsZXIsIFNJUl9MSU1fTUlOX0NIQU5ORUxfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNmZ1ZhbHVlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IHN0YXJ0IG1pbiBjaGFubmVsIHRpbWVyLgorICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgY3JlYXRlIE1JTiBjaGFubmVsIHRpbWVyXG4iKSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX1JUQUlfTElOVVgpCisgICAgdHhfdGltZXJfc2V0X2V4cGlyeV9saXN0KAorICAgICAgICAgICAgICZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1NaW5DaGFubmVsVGltZXIsIExJTV9USU1FUl9FWFBJUllfTElTVCk7CisjZW5kaWYKKworICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIkNyZWF0ZWQgTWluQ2hhbm5lbFRpbWVyXG4iKSk7KQorCisgICAgLyogUGVyaW9kaWMgcHJvYmUgcmVxdWVzdCB0aW1lciB2YWx1ZSBpcyBoYWxmIG9mIHRoZSBNaW4gY2hhbm5lbAorICAgICAqIHRpbWVyLiBQcm9iZSByZXF1ZXN0IHNlbmRzIHBlcmlvZGljYWxseSB0aWxsIG1pbi9tYXggY2hhbm5lbAorICAgICAqIHRpbWVyIGV4cGlyZXMKKyAgICAgKi8KKworICAgIGNmZ1ZhbHVlID0gY2ZnVmFsdWUvMiA7CisgICAgaWYoIGNmZ1ZhbHVlID49IDEpCisgICAgeworICAgICAgICAvLyBDcmVhdGUgcGVyaW9kaWMgcHJvYmUgcmVxdWVzdCB0aW1lciBhbmQgYWN0aXZhdGUgdGhlbSBsYXRlcgorICAgICAgICBpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY1Byb2JlUmVxVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVyaW9kaWMgUHJvYmUgUmVxdWVzdCBUaW1lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UaW1lckhhbmRsZXIsIFNJUl9MSU1fUEVSSU9ESUNfUFJPQkVfUkVRX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmdWYWx1ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgIC8vLyBDb3VsZCBub3Qgc3RhcnQgUGVyaW9kaWMgUHJvYmUgUmVxIHRpbWVyLgorICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgY3JlYXRlIHBlcmlvZGljIHByb2JlIHRpbWVyXG4iKSk7CisgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICB9CisKKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0FDVElWRV9NQVhJTVVNX0NIQU5ORUxfVElNRSwKKyAgICAgICAgICAgICAgICAgICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvdWxkIG5vdCBnZXQgTUFYQ2hhbm5lbFRpbWVvdXQgdmFsdWUKKyAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBNQVhDaGFubmVsVGltZW91dCB2YWx1ZVxuIikpOworICAgIH0KKyAgICBjZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisKKyAgICBpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1NYXhDaGFubmVsVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTUFYIENIQU5ORUwgVElNRU9VVCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1UaW1lckhhbmRsZXIsIFNJUl9MSU1fTUFYX0NIQU5ORUxfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNmZ1ZhbHVlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLy8gQ291bGQgbm90IHN0YXJ0IG1heCBjaGFubmVsIHRpbWVyLgorICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgY3JlYXRlIE1BWCBjaGFubmVsIHRpbWVyXG4iKSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfUlRBSV9MSU5VWCkKKyAgICB0eF90aW1lcl9zZXRfZXhwaXJ5X2xpc3QoCisgICAgICAgICAgICAgJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbU1heENoYW5uZWxUaW1lciwgTElNX1RJTUVSX0VYUElSWV9MSVNUKTsKKyNlbmRpZgorCisgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiQ3JlYXRlZCBNYXhDaGFubmVsVGltZXJcbiIpKTspCisKKyAgICBpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkKKyAgICB7CisgICAgICAgIC8vIENyZWF0ZSBDaGFubmVsIFN3aXRjaCBUaW1lcgorICAgICAgICBpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1DaGFubmVsU3dpdGNoVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNIQU5ORUwgU1dJVENIIFRJTUVSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1DaGFubmVsU3dpdGNoVGltZXJIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGlyYXRpb25faW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fQ0hBTk5FTF9TV0lUQ0hfVElNRVJfVElDS1MsICAvLyBpbml0aWFsX3RpY2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzY2hlZHVsZV90aWNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImZhaWxlZCB0byBjcmVhdGUgQ2hhbm5lbCBTd2l0Y2ggdGltZXJcbiIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENyZWF0ZSBRdWlldCBUaW1lcgorICAgICAgICAvLyBUaGlzIGlzIHVzZWQgb24gdGhlIFNUQSB0byBnbyBhbmQgc2h1dC1vZmYKKyAgICAgICAgLy8gVHgvUnggImFmdGVyIiB0aGUgc3BlY2lmaWVkIHF1aXRlSW50ZXJ2YWwKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUVVJRVQgVElNRVIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVF1aWV0VGltZXJIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9MSU1fUVVJRVRfVElNRU9VVCwgICAgIC8vIGV4cGlyYXRpb25faW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fUVVJRVRfVElNRVJfVElDS1MsICAgICAvLyBpbml0aWFsX3RpY2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzY2hlZHVsZV90aWNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImZhaWxlZCB0byBjcmVhdGUgUXVpZXQgQmVnaW4gVGltZXJcbiIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENyZWF0ZSBRdWlldCBCU1MgVGltZXIKKyAgICAgICAgLy8gQWZ0ZXIgdGhlIHNwZWNpZmllZCBxdWl0ZUludGVydmFsLCBkZXRlcm1pbmVkIGJ5CisgICAgICAgIC8vIGdMaW1RdWlldFRpbWVyLCB0aGlzIHRpbWVyLCBnTGltUXVpZXRCc3NUaW1lciwKKyAgICAgICAgLy8gdHJpZ2dlciBhbmQgcHV0IHRoZSBTVEEgdG8gc2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgLy8gZ0xpbVF1aWV0RHVyYXRpb24KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRCc3NUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUVVJRVQgQlNTIFRJTUVSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1RdWlldEJzc1RpbWVySGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTElNX1FVSUVUX0JTU19USU1FT1VULCAvLyBleHBpcmF0aW9uX2lucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX1FVSUVUX0JTU19USU1FUl9USUNLLCAgLy8gaW5pdGlhbF90aWNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2NoZWR1bGVfdGlja3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJmYWlsZWQgdG8gY3JlYXRlIFF1aWV0IEJlZ2luIFRpbWVyXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IEpvaW5GYWlsdXJlVGltZW91dCB2YWx1ZQorICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEpvaW5GYWlsdXJlVGltZW91dCB2YWx1ZVxuIikpOworICAgICAgICB9CisgICAgICAgIGNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKworICAgICAgICAvLyBDcmVhdGUgSm9pbiBmYWlsdXJlIHRpbWVyIGFuZCBhY3RpdmF0ZSBpdCBsYXRlcgorICAgICAgICBpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Kb2luRmFpbHVyZVRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIkpPSU4gRkFJTFVSRSBUSU1FT1VUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVRpbWVySGFuZGxlciwgU0lSX0xJTV9KT0lOX0ZBSUxfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNmZ1ZhbHVlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgY3JlYXRlIEpvaW4gZmFpbHVyZSB0aW1lci4KKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgY3JlYXRlIEpvaW4gZmFpbHVyZSB0aW1lclxuIikpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX1JUQUlfTElOVVgpCisgICAgICAgIHR4X3RpbWVyX3NldF9leHBpcnlfbGlzdCgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltSm9pbkZhaWx1cmVUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9USU1FUl9FWFBJUllfTElTVCk7CisjZW5kaWYKKworICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19BU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBBc3NvY0ZhaWx1cmVUaW1lb3V0IHZhbHVlCisgICAgICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZVxuIikpOworICAgICAgICB9CisgICAgICAgIGNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKworICAgICAgICAvLyBDcmVhdGUgQXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lciBhbmQgYWN0aXZhdGUgaXQgbGF0ZXIKKyAgICAgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQXNzb2NGYWlsdXJlVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQVNTT0MgRkFJTFVSRSBUSU1FT1VUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUFzc29jRmFpbHVyZVRpbWVySGFuZGxlciwgTElNX0FTU09DLAorICAgICAgICAgICAgICAgICAgICAgICAgY2ZnVmFsdWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBjcmVhdGUgQXNzb2MgZmFpbHVyZSB0aW1lci4KKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IGNyZWF0ZSBBc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyXG4iKSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19SRUFTU09DSUFUSU9OX0ZBSUxVUkVfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IFJlYXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZQorICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIFJlYXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZVxuIikpOworICAgICAgICB9CisgICAgICAgIGNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKworICAgICAgICAvLyBDcmVhdGUgQXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lciBhbmQgYWN0aXZhdGUgaXQgbGF0ZXIKKyAgICAgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVhc3NvY0ZhaWx1cmVUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVBU1NPQyBGQUlMVVJFIFRJTUVPVVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUFzc29jRmFpbHVyZVRpbWVySGFuZGxlciwgTElNX1JFQVNTT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnVmFsdWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgY3JlYXRlIFJlYXNzb2MgZmFpbHVyZSB0aW1lci4KKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IGNyZWF0ZSBSZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXJcbiIpKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQUREVFNfUlNQX1RJTUVPVVQsICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsIHRvIGdldCBXTklfQ0ZHX0FERFRTX1JTUF9USU1FT1VUIFxuIikpOworCisgICAgICAgIGNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKworICAgICAgICAvLyBDcmVhdGUgQWRkdHMgcmVzcG9uc2UgdGltZXIgYW5kIGFjdGl2YXRlIGl0IGxhdGVyCisgICAgICAgIGlmICh0eF90aW1lcl9jcmVhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFkZHRzUnNwVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFERFRTIFJTUCBUSU1FT1VUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1BZGR0c1Jlc3BvbnNlVGltZXJIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9MSU1fQUREVFNfUlNQX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnVmFsdWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyBDb3VsZCBub3QgY3JlYXRlIEF1dGggZmFpbHVyZSB0aW1lci4KKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgY3JlYXRlIEFkZHRzIHJlc3BvbnNlIHRpbWVyXG4iKSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0FVVEhFTlRJQ0FURV9GQUlMVVJFX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBBdXRoRmFpbHVyZVRpbWVvdXQgdmFsdWUKKyAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBBdXRoRmFpbHVyZVRpbWVvdXQgdmFsdWVcbiIpKTsKKyAgICAgICAgfQorICAgICAgICBjZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIEF1dGggZmFpbHVyZSB0aW1lciBhbmQgYWN0aXZhdGUgaXQgbGF0ZXIKKyAgICAgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQXV0aEZhaWx1cmVUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVVUSCBGQUlMVVJFIFRJTUVPVVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVRpbWVySGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTElNX0FVVEhfRkFJTF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZ1ZhbHVlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvLy8gQ291bGQgbm90IGNyZWF0ZSBBdXRoIGZhaWx1cmUgdGltZXIuCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IGNyZWF0ZSBBdXRoIGZhaWx1cmUgdGltZXJcbiIpKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9SVEFJX0xJTlVYKQorICAgICAgICB0eF90aW1lcl9zZXRfZXhwaXJ5X2xpc3QoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUF1dGhGYWlsdXJlVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fVElNRVJfRVhQSVJZX0xJU1QpOworI2VuZGlmCisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTCwKKyAgICAgICAgICAgICAgICAgICAgICAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IEJFQUNPTl9JTlRFUlZBTCB2YWx1ZQorICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEJFQUNPTl9JTlRFUlZBTCB2YWx1ZVxuIikpOworICAgICAgICB9CisgICAgICAgIGNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKworICAgICAgICBpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1IZWFydEJlYXRUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhcnRiZWF0IFRJTUVPVVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVRpbWVySGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTElNX0hFQVJUX0JFQVRfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvLy8gQ291bGQgbm90IHN0YXJ0IEhlYXJ0YmVhdCB0aW1lci4KKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY2FsbCB0byBjcmVhdGUgaGVhcnRiZWF0IHRpbWVyIGZhaWxlZFxuIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENvdWxkIG5vdCBnZXQgUFJPQkVfQUZURVJfSEJfRkFJTFVSRQorICAgICAgICAgICAgICogdmFsdWUgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIFBST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVCB2YWx1ZVxuIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hhbmdlIHRpbWVyIHRvIHJlYWN0aXZhdGUgaXQgaW4gZnV0dXJlCisgICAgICAgIGNmZ1ZhbHVlID0gU1lTX01TX1RPX1RJQ0tTKGNmZ1ZhbHVlKTsKKworICAgICAgICBpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Qcm9iZUFmdGVySEJUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvYmUgYWZ0ZXIgSGVhcnRiZWF0IFRJTUVPVVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbVRpbWVySGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTElNX1BST0JFX0hCX0ZBSUxVUkVfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb3VsZCBub3QgY3JlYXQgd3QtcHJvYmUtYWZ0ZXItSGVhcnRCZWF0LWZhaWx1cmUgdGltZXIuCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJ1bmFibGUgdG8gY3JlYXRlIFByb2JlQWZ0ZXJIQlRpbWVyXG4iKSk7CisgICAgICAgIH0KKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfUlRBSV9MSU5VWCkKKyAgICAgICAgdHhfdGltZXJfc2V0X2V4cGlyeV9saXN0KCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Qcm9iZUFmdGVySEJUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9USU1FUl9FWFBJUllfTElTVCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQpIHx8IGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9QRVJJT0QsCisgICAgICAgICAgICAgICAgICAgICAgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBCYWNrZ3JvdW5kIHNjYW4gcGVyaW9kIHZhbHVlCisgICAgICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQmFja2dyb3VuZCBzY2FuIHBlcmlvZCB2YWx1ZVxuIikpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogc2V0dGluZyBwZXJpb2QgdG8gemVybyBtZWFucyBkaXNhYmxpbmcgYmFja2dyb3VuZCBzY2FucyB3aGVuIGFzc29jaWF0ZWQKKyAgICAgICAgICogdGhlIHdheSB3ZSBkbyB0aGlzIGlzIHRvIHNldCBhIGZsYWcgaW5kaWNhdGluZyB0aGlzIGFuZCBrZWVwaW5nCisgICAgICAgICAqIHRoZSB0aW1lciBydW5uaW5nLCBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIFBEVSBsZWFrIHdvcmthcm91bmRzCisgICAgICAgICAqIGFzIHdlbGwgYXMgYmFja2dyb3VuZCBzY2FubmluZyBkdXJpbmcgU01FIGlkbGUgc3RhdGVzCisgICAgICAgICAqLworICAgICAgICBpZiAoY2ZnVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgY2ZnVmFsdWUgPSBMSU1fQkFDS0dST1VORF9TQ0FOX1BFUklPRF9ERUZBVUxUX01TOworICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1CYWNrZ3JvdW5kU2NhbkRpc2FibGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5EaXNhYmxlID0gZmFsc2U7CisKKyAgICAgICAgY2ZnVmFsdWUgPSBTWVNfTVNfVE9fVElDS1MoY2ZnVmFsdWUpOworCisgICAgICAgIGlmICh0eF90aW1lcl9jcmVhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUJhY2tncm91bmRTY2FuVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhY2tncm91bmQgc2NhbiBUSU1FT1VUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UaW1lckhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX0xJTV9DSEFOTkVMX1NDQU5fVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBzdGFydCBiYWNrZ3JvdW5kIHNjYW4gdGltZXIuCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNhbGwgdG8gY3JlYXRlIGJhY2tncm91bmQgc2NhbiB0aW1lciBmYWlsZWRcbiIpKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisKKyAgICBjZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhMSU1fSEFTSF9NSVNTX1RJTUVSX01TKTsKKworICAgIGlmICh0eF90aW1lcl9jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltU2VuZERpc2Fzc29jRnJhbWVUaHJlc2hvbGRUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEaXNhc3NvYyB0aHJvdHRsZSBUSU1FT1VUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmREaXNhc3NvY0ZyYW1lVGhyZXNob2xkSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9MSU1fSEFTSF9NSVNTX1RIUkVTX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICBjZmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNmZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgVFhfQVVUT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8vLyBDb3VsZCBub3Qgc3RhcnQgU2VuZCBEaXNhc3NvY2lhdGUgRnJhbWUgVGhyZXNob2xkIHRpbWVyLgorICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY3JlYXRlIERpc2Fzc29jaWF0ZSB0aHJvdHRsZSB0aW1lciBmYWlsZWRcbiIpKTsKKyAgICB9CisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9SVEFJX0xJTlVYKQorICAgIHR4X3RpbWVyX3NldF9leHBpcnlfbGlzdCgKKyAgICAgICAgICAgICAmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltU2VuZERpc2Fzc29jRnJhbWVUaHJlc2hvbGRUaW1lciwKKyAgICAgICAgICAgICBMSU1fVElNRVJfRVhQSVJZX0xJU1QpOworI2VuZGlmCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgiQ3JlYXRlZCBEaXNhc3NvY2lhdGUgdGhyb3R0bGUgdGltZXIgXG4iKSk7KQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGtlZXBhbGl2ZSB0aW1lciBhbmQgIGFjdGl2YXRlIGl0IHJpZ2h0IGF3YXkgZm9yIEFQIHJvbGUKKyAgICAgKi8KKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0tFRVBBTElWRV9USU1FT1VULAorICAgICAgICAgICAgICAgICAgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ291bGQgbm90IGdldCBrZWVwYWxpdmUgdGltZW91dCB2YWx1ZQorICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIGtlZXBhbGl2ZSB0aW1lb3V0IHZhbHVlXG4iKSk7CisgICAgfQorCisgICAgLy8gQSB2YWx1ZSBvZiB6ZXJvIGltcGxpZXMga2VlcCBhbGl2ZSBzaG91bGQgYmUgZGlzYWJsZWQKKyAgICBpZiAoY2ZnVmFsdWUgPT0gMCkKKyAgICB7CisgICAgICAgIGNmZ1ZhbHVlID0gTElNX0tFRVBBTElWRV9USU1FUl9NUzsKKyAgICAgICAgcE1hYy0+c2NoLmtlZXBBbGl2ZSA9IDA7CisgICAgfSBlbHNlCisgICAgICAgIHBNYWMtPnNjaC5rZWVwQWxpdmUgPSAxOworCisKKyAgICBjZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSArIFNZU19USUNLX0RVUl9NUyAtIDEpOworCisgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltS2VlcGFsaXZlVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAiS0VFUEFMSVZFX1RJTUVPVVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbGltS2VlcGFsaXZlVG1lckhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgY2ZnVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjZmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgVFhfQVVUT19BQ1RJVkFURSA6IFRYX05PX0FDVElWQVRFKQorICAgICAgICAgICAgICAgICAgIT0gVFhfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8vIENhbm5vdCBjcmVhdGUga2VlcGFsaXZlIHRpbWVyLiAgTG9nIGVycm9yLgorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkNhbm5vdCBjcmVhdGUga2VlcGFsaXZlIHRpbWVyLlxuIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbGwgQ05GX1dBSVQgVGltZXJzIHVwZnJvbnQKKyAgICAgKi8KKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1dUX0NORl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ291bGQgbm90IGdldCBDTkZfV0FJVCB0aW1lb3V0IHZhbHVlCisgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAqLworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQ05GIHRpbWVvdXQgdmFsdWVcbiIpKTsKKyAgICB9CisgICAgY2ZnVmFsdWUgPSBTWVNfTVNfVE9fVElDS1MoY2ZnVmFsdWUpOworCisgICAgZm9yIChpPTA7IGk8cE1hYy0+bGltLm1heFN0YXRpb247IGkrKykKKyAgICB7CisgICAgICAgIGlmICh0eF90aW1lcl9jcmVhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNORl9NSVNTX1RJTUVPVVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUNuZldhaXRUbWVySGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMzIpaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX05PX0FDVElWQVRFKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDYW5ub3QgY3JlYXRlIHRpbWVyLiAgTG9nIGVycm9yLgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDYW5ub3QgY3JlYXRlIENORiB3YWl0IHRpbWVyLlxuIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAqKiBBbGxvYyBhbmQgaW5pdCB0YWJsZSBmb3IgdGhlIHByZUF1dGggdGltZXIgbGlzdAorICAgICoqCisgICAgKiovCisKKyAgICAvLyBnZXQgbWF4IG51bWJlciBvZiBQcmVhdXRoZW50aWNhdGlvbgorICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX01BWF9OVU1fUFJFX0FVVEgsCisgICAgICAgICAgICAgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKgorICAgICAgICAqKiBDb3VsZCBub3QgZ2V0IG1heCBwcmVhdXRoIHZhbHVlCisgICAgICAgICoqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICoqLworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgbWFjIHByZWF1dGggdmFsdWVcbiIpKTsKKyAgICB9CisjaWZkZWYgQU5JX0FQX1NES19PUFQKKyAgICBpZihjZmdWYWx1ZSA+IFNJUl9TREtfT1BUX01BWF9OVU1fUFJFX0FVVEgpCisgICAgICAgIGNmZ1ZhbHVlID0gU0lSX1NES19PUFRfTUFYX05VTV9QUkVfQVVUSDsKKyNlbmRpZiAvLyBBTklfQVBfU0RLX09QVAorICAgIHBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUubnVtRW50cnkgPSBjZmdWYWx1ZTsKKyAgICBpZiAocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopICZwTWFjLT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlLnBUYWJsZSwKKyAgICAgICAgICBjZmdWYWx1ZSpzaXplb2YodExpbVByZUF1dGhOb2RlKSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgicGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGltSW5pdFByZUF1dGhUaW1lclRhYmxlKHBNYWMsICZwTWFjLT5saW0uZ0xpbVByZUF1dGhUaW1lclRhYmxlKTsKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJhbGxvYyBhbmQgaW5pdCB0YWJsZSBmb3IgcHJlQXV0aCB0aW1lcnNcbiIpKTspCisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgT0xCQyBjYWNoZSBhZ2luZyB0aW1lcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfT0xCQ19ERVRFQ1RfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IE9MQkMgZGV0ZWN0IHRpbWVvdXQgdmFsdWUKKyAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBPTEJEIGRldGVjdCB0aW1lb3V0IHZhbHVlXG4iKSk7CisgICAgICAgIH0KKworICAgICAgICBjZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisKKyAgICAgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgKKyAgICAgICAgICAgICAgICAmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltVXBkYXRlT2xiY0NhY2hlVGltZXIsCisgICAgICAgICAgICAgICAgIk9MQkMgVVBEQVRFIENBQ0hFIFRJTUVPVVQiLAorICAgICAgICAgICAgICAgIGxpbVVwZGF0ZU9sYmNDYWNoZVRpbWVySGFuZGxlciwKKyAgICAgICAgICAgICAgICBTSVJfTElNX1VQREFURV9PTEJDX0NBQ0hFTF9USU1FT1VULAorICAgICAgICAgICAgICAgIGNmZ1ZhbHVlLAorICAgICAgICAgICAgICAgIGNmZ1ZhbHVlLAorICAgICAgICAgICAgICAgIFRYX0FVVE9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENhbm5vdCBjcmVhdGUgdXBkYXRlIE9MQkMgY2FjaGUgdGltZXIKKyAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDYW5ub3QgY3JlYXRlIHVwZGF0ZSBPTEJDIGNhY2hlIHRpbWVyXG4iKSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIC8vIEluIGZ1dHVyZSB3ZSBuZWVkIHRvIHVzZSB0aGUgYXV0aCB0aW1lciwgY2F1c2UKKyAgICAvLyB0aGUgcHJlIGF1dGggc2Vzc2lvbiB3aWxsIGJlIGludHJvZHVjZWQgYmVmb3JlIHNlbmRpbmcKKyAgICAvLyBBdXRoIGZyYW1lLgorICAgIC8vIFdlIG5lZWQgdG8gZ28gb2ZmIGNoYW5uZWwgYW5kIGNvbWUgYmFjayB0byBob21lIGNoYW5uZWwKKyAgICBjZmdWYWx1ZSA9IDEwMDA7CisgICAgY2ZnVmFsdWUgPSBTWVNfTVNfVE9fVElDS1MoY2ZnVmFsdWUpOworCisgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltRlRQcmVBdXRoUnNwVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRlQgUFJFQVVUSCBSU1AgVElNRU9VVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UaW1lckhhbmRsZXIsIFNJUl9MSU1fRlRfUFJFQVVUSF9SU1BfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZ1ZhbHVlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLyBDb3VsZCBub3QgY3JlYXRlIEpvaW4gZmFpbHVyZSB0aW1lci4KKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IGNyZWF0ZSBKb2luIGZhaWx1cmUgdGltZXJcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIGNmZ1ZhbHVlID0gNTAwMDsKKyAgICBjZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisKKyAgICBpZiAodHhfdGltZXJfY3JlYXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1DY3hUc21UaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQ1ggVFNNIFN0YXRzIFRJTUVPVVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltVGltZXJIYW5kbGVyLCBTSVJfTElNX0NDWF9UU01fVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZ1ZhbHVlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfTk9fQUNUSVZBVEUpICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvLyBDb3VsZCBub3QgY3JlYXRlIEpvaW4gZmFpbHVyZSB0aW1lci4KKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY291bGQgbm90IGNyZWF0ZSBKb2luIGZhaWx1cmUgdGltZXJcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIGNmZ1ZhbHVlID0gMTAwMDsKKyAgICBjZmdWYWx1ZSA9IFNZU19NU19UT19USUNLUyhjZmdWYWx1ZSk7CisgICAgaWYgKHR4X3RpbWVyX2NyZWF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVtYWluT25DaGFubmVsVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRlQgUFJFQVVUSCBSU1AgVElNRU9VVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1UaW1lckhhbmRsZXIsIFNJUl9MSU1fUkVNQUlOX0NITl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnVmFsdWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9OT19BQ1RJVkFURSkgIT0gVFhfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8vIENvdWxkIG5vdCBjcmVhdGUgSm9pbiBmYWlsdXJlIHRpbWVyLgorICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgY3JlYXRlIEpvaW4gZmFpbHVyZSB0aW1lclxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjZW5kaWYKKyAgICBwTWFjLT5saW0uZ0xpbVRpbWVyc0NyZWF0ZWQgPSAxOworfSAvKioqKioqIGVuZCBsaW1DcmVhdGVUaW1lcnMoKSAqKioqKiovCisKKworCisvKioKKyAqIGxpbVRpbWVySGFuZGxlcigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24KKyAqIDEuIE1JTl9DSEFOTkVMLCBNQVhfQ0hBTk5FTCB0aW1lciBleHBpcmF0aW9uIGR1cmluZyBzY2FubmluZworICogMi4gSk9JTl9GQUlMVVJFIHRpbWVyIGV4cGlyYXRpb24gd2hpbGUgam9pbmluZyBhIEJTUworICogMy4gQVVUSF9GQUlMVVJFIHRpbWVyIGV4cGlyYXRpb24gd2hpbGUgYXV0aGVudGljYXRpbmcgd2l0aCBhIHBlZXIKKyAqIDQuIEhlYXJ0YmVhdCB0aW1lciBleHBpcmF0aW9uIG9uIFNUQQorICogNS4gQmFja2dyb3VuZCBzY2FuIHRpbWVyIGV4cGlyYXRpb24gb24gU1RBCisgKiA2LiBBSUQgcmVsZWFzZSwgUHJlLWF1dGggY2xlYW51cCBhbmQgTGluayBtb25pdG9yaW5nIHRpbWVyCisgKiAgICBleHBpcmF0aW9uIG9uIEFQCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcGFyYW0gLSBNZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRpbWVyIHRoYXQgZXhwaXJlZAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVRpbWVySGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB0QU5JX1UzMiBwYXJhbSkKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgIHN0YXR1c0NvZGU7CisgICAgdFNpck1zZ1EgICAgbXNnOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpcE1hY0dsb2JhbDsKKworICAgIC8vIFByZXBhcmUgYW5kIHBvc3QgbWVzc2FnZSB0byBMSU0gTWVzc2FnZSBRdWV1ZQorCisgICAgbXNnLnR5cGUgPSAodEFOSV9VMTYpIHBhcmFtOworICAgIG1zZy5ib2R5cHRyID0gTlVMTDsKKyAgICBtc2cuYm9keXZhbCA9IDA7CisKKyAgICBpZiAoKHN0YXR1c0NvZGUgPSBsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoInBvc3RpbmcgbWVzc2FnZSAlWCB0byBMSU0gZmFpbGVkLCByZWFzb249JWRcbiIpLAorICAgICAgICAgICAgICAgbXNnLnR5cGUsIHN0YXR1c0NvZGUpOworfSAvKioqKioqIGVuZCBsaW1UaW1lckhhbmRsZXIoKSAqKioqKiovCisKKworLyoqCisgKiBsaW1BZGR0c1Jlc3BvbnNlVGltZXJIYW5kbGVyKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiBBZGR0cyByZXNwb25zZSB0aW1lciBleHBpcmF0aW9uIG9uIHN0YQorICoKKyAqTE9HSUM6CisgKiBNZXNzYWdlIFNJUl9MSU1fQUREVFNfUlNQX1RJTUVPVVQgaXMgcG9zdGVkIHRvIGdTaXJMaW1Nc2dRCisgKiB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBhcmFtIC0gcG9pbnRlciB0byBwcmUtYXV0aCBub2RlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltQWRkdHNSZXNwb25zZVRpbWVySGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB0QU5JX1UzMiBwYXJhbSkKK3sKKyAgICB0U2lyTXNnUSAgICBtc2c7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbClwTWFjR2xvYmFsOworCisgICAgLy8gUHJlcGFyZSBhbmQgcG9zdCBtZXNzYWdlIHRvIExJTSBNZXNzYWdlIFF1ZXVlCisKKyAgICBtc2cudHlwZSA9IFNJUl9MSU1fQUREVFNfUlNQX1RJTUVPVVQ7CisgICAgbXNnLmJvZHl2YWwgPSBwYXJhbTsKKyAgICBtc2cuYm9keXB0ciA9IE5VTEw7CisKKyAgICBsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpOworfSAvKioqKioqIGVuZCBsaW1BdXRoUmVzcG9uc2VUaW1lckhhbmRsZXIoKSAqKioqKiovCisKKworLyoqCisgKiBsaW1BdXRoUmVzcG9uc2VUaW1lckhhbmRsZXIoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIEF1dGggcmVzcG9uc2UgdGltZXIgZXhwaXJhdGlvbiBvbiBBUAorICoKKyAqTE9HSUM6CisgKiBNZXNzYWdlIFNJUl9MSU1fQVVUSF9SU1BfVElNRU9VVCBpcyBwb3N0ZWQgdG8gZ1NpckxpbU1zZ1EKKyAqIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZC4KKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcGFyYW0gLSBwb2ludGVyIHRvIHByZS1hdXRoIG5vZGUKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1BdXRoUmVzcG9uc2VUaW1lckhhbmRsZXIodm9pZCAqcE1hY0dsb2JhbCwgdEFOSV9VMzIgcGFyYW0pCit7CisgICAgdFNpck1zZ1EgICAgbXNnOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpcE1hY0dsb2JhbDsKKworICAgIC8vIFByZXBhcmUgYW5kIHBvc3QgbWVzc2FnZSB0byBMSU0gTWVzc2FnZSBRdWV1ZQorCisgICAgbXNnLnR5cGUgPSBTSVJfTElNX0FVVEhfUlNQX1RJTUVPVVQ7CisgICAgbXNnLmJvZHlwdHIgPSBOVUxMOworICAgIG1zZy5ib2R5dmFsID0gKHRBTklfVTMyKXBhcmFtOworCisgICAgbGltUG9zdE1zZ0FwaShwTWFjLCAmbXNnKTsKK30gLyoqKioqKiBlbmQgbGltQXV0aFJlc3BvbnNlVGltZXJIYW5kbGVyKCkgKioqKioqLworCisKKworLyoqCisgKiBsaW1Bc3NvY0ZhaWx1cmVUaW1lckhhbmRsZXIoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIFJlL0Fzc29jIGZhaWx1cmUgdGltZXIgZXhwaXJhdGlvbgorICogb24gU1RBCisgKgorICpMT0dJQzoKKyAqIE1lc3NhZ2UgU0lSX0xJTV9BU1NPQ19GQUlMX1RJTUVPVVQgaXMgcG9zdGVkIHRvIGdTaXJMaW1Nc2dRCisgKiB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBhcmFtIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhc3NvYyBvciByZWFzc29jCisgKiAgICAgICAgICAgICAgICAgZmFpbHVyZSB0aW1lb3V0CisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1Bc3NvY0ZhaWx1cmVUaW1lckhhbmRsZXIodm9pZCAqcE1hY0dsb2JhbCwgdEFOSV9VMzIgcGFyYW0pCit7CisgICAgdFNpck1zZ1EgICAgbXNnOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpcE1hY0dsb2JhbDsKKworICAgIC8vIFByZXBhcmUgYW5kIHBvc3QgbWVzc2FnZSB0byBMSU0gTWVzc2FnZSBRdWV1ZQorCisgICAgbXNnLnR5cGUgPSBTSVJfTElNX0FTU09DX0ZBSUxfVElNRU9VVDsKKyAgICBtc2cuYm9keXZhbCA9ICh0QU5JX1UzMilwYXJhbTsKKyAgICBtc2cuYm9keXB0ciA9IE5VTEw7CisKKyAgICBsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpOworfSAvKioqKioqIGVuZCBsaW1Bc3NvY0ZhaWx1cmVUaW1lckhhbmRsZXIoKSAqKioqKiovCisKKworLyoqCisgKiBsaW1VcGRhdGVPbGJjQ2FjaGVUaW1lckhhbmRsZXIoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIHVwZGF0ZSBvbGJjIGNhY2hlIHRpbWVyIGV4cGlyYXRpb24KKyAqIG9uIFNUQQorICoKKyAqTE9HSUM6CisgKiBNZXNzYWdlIFNJUl9MSU1fVVBEQVRFX09MQkNfQ0FDSEVMX1RJTUVPVVQgaXMgcG9zdGVkIHRvIGdTaXJMaW1Nc2dRCisgKiB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3ZvaWQKK2xpbVVwZGF0ZU9sYmNDYWNoZVRpbWVySGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB0QU5JX1UzMiBwYXJhbSkKK3sKKyAgICB0U2lyTXNnUSAgICBtc2c7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbClwTWFjR2xvYmFsOworCisgICAgLy8gUHJlcGFyZSBhbmQgcG9zdCBtZXNzYWdlIHRvIExJTSBNZXNzYWdlIFF1ZXVlCisKKyAgICBtc2cudHlwZSA9IFNJUl9MSU1fVVBEQVRFX09MQkNfQ0FDSEVMX1RJTUVPVVQ7CisgICAgbXNnLmJvZHl2YWwgPSAwOworICAgIG1zZy5ib2R5cHRyID0gTlVMTDsKKworICAgIGxpbVBvc3RNc2dBcGkocE1hYywgJm1zZyk7Cit9IC8qKioqKiogZW5kIGxpbVVwZGF0ZU9sYmNDYWNoZVRpbWVySGFuZGxlcigpICoqKioqKi8KKyNlbmRpZgorCisvKioKKyAqIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlYWN0aXZhdGUgYW5kIGNoYW5nZSBhIHRpbWVyCisgKiBmb3IgZnV0dXJlIHJlLWFjdGl2YXRpb24KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICB0aW1lcklkIC0gZW51bSBvZiB0aW1lciB0byBiZSBkZWFjdGl2YXRlZCBhbmQgY2hhbmdlZAorICogICAgICAgICAgICAgICAgICAgVGhpcyBlbnVtIGlzIGRlZmluZWQgaW4gbGltVXRpbHMuaCBmaWxlCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHRpbWVySWQpCit7CisgICAgdEFOSV9VMzIgICAgdmFsPTAsIHZhbDE9MDsKKworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEUsIDAsIHRpbWVySWQpKTsKKworICAgIHN3aXRjaCAodGltZXJJZCkKKyAgICB7CisgICAgICAgIGNhc2UgZUxJTV9BRERUU19SU1BfVElNRVI6CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUFkZHRzUnNwVGltZXJDb3VudCsrOworICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFkZHRzUnNwVGltZXIpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGRlYWN0aXZhdGUgQWRkdHNSc3AgVGltZXIKKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoIlVuYWJsZSB0byBkZWFjdGl2YXRlIEFkZHRzUnNwIHRpbWVyXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fTUlOX0NIQU5ORUxfVElNRVI6CisgICAgICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltTWluQ2hhbm5lbFRpbWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBkZWFjdGl2YXRlIG1pbiBjaGFubmVsIHRpbWVyLgorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgbWluIGNoYW5uZWwgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgYSBiYWNrZ3JvdW5kIHdhcyB0cmlnZ2VyZWQgdmlhIFF1aWV0IEJTUywKKyAgICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBhZGp1c3QgdGhlIE1JTiBhbmQgTUFYIGNoYW5uZWwKKyAgICAgICAgICAgIC8vIHRpbWVyJ3MgYWNjb3JkaW5nbHkgdG8gdGhlIFF1aWV0IGR1cmF0aW9uIHRoYXQKKyAgICAgICAgICAgIC8vIHdhcyBzcGVjaWZpZWQKKyAgICAgICAgICAgIGlmKCBlTElNX1FVSUVUX1JVTk5JTkcgPT0gcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlICYmCisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW5EdXJpbmdRdWlldEJzcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZ0xpbVF1aWV0RHVyYXRpb24gaXMgYWxyZWFkeSBjYWNoZWQgaW4gdW5pdHMgb2YKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gdGlja3MuIE5vIGNvbnZlcnNpb24gaXMgcmVxZC4uLgorICAgICAgICAgICAgICAgIHZhbCA9IHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXREdXJhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPm1pbkNoYW5uZWxUaW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCIgZ3BMaW1NbG1TY2FuUmVxIGlzIE5VTEwgIikpOworICAgICAgICAgICAgICAgICAgICAvL05vIG5lZWQgdG8gY2hhbmdlIG1pbiB0aW1lci4gVGhpcyBpcyBub3QgYSBzY2FuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltTWluQ2hhbm5lbFRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIDApICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGNoYW5nZSBtaW4gY2hhbm5lbCB0aW1lci4KKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBjaGFuZ2UgbWluIGNoYW5uZWwgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlTElNX1BFUklPRElDX1BST0JFX1JFUV9USU1FUjoKKyAgICAgICAgICAgIGlmICh0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY1Byb2JlUmVxVGltZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGRlYWN0aXZhdGUgbWluIGNoYW5uZWwgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gZGVhY3RpdmF0ZSBwZXJpb2RpYyB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YWwgPSBTWVNfTVNfVE9fVElDS1MocE1hYy0+bGltLmdwTGltTWxtU2NhblJlcS0+bWluQ2hhbm5lbFRpbWUpLzI7CisgICAgICAgICAgICBpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY1Byb2JlUmVxVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgMCkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgY2hhbmdlIG1pbiBjaGFubmVsIHRpbWVyLgorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGNoYW5nZSBwZXJpb2RpYyB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fTUFYX0NIQU5ORUxfVElNRVI6CisgICAgICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltTWF4Q2hhbm5lbFRpbWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBkZWFjdGl2YXRlIG1heCBjaGFubmVsIHRpbWVyLgorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgbWF4IGNoYW5uZWwgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQpIHx8IGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgICAgICAgICAvLyBJZiBhIGJhY2tncm91bmQgd2FzIHRyaWdnZXJlZCB2aWEgUXVpZXQgQlNTLAorICAgICAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgTUlOIGFuZCBNQVggY2hhbm5lbAorICAgICAgICAgICAgLy8gdGltZXIncyBhY2NvcmRpbmdseSB0byB0aGUgUXVpZXQgZHVyYXRpb24gdGhhdAorICAgICAgICAgICAgLy8gd2FzIHNwZWNpZmllZAorICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSAhPSBlTElNX0FQX1JPTEUpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpZiggZUxJTV9RVUlFVF9SVU5OSU5HID09IHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSAmJgorICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGdMaW1RdWlldER1cmF0aW9uIGlzIGFscmVhZHkgY2FjaGVkIGluIHVuaXRzIG9mCisgICAgICAgICAgICAgICAgICAgIC8vIHN5c3RlbSB0aWNrcy4gTm8gY29udmVyc2lvbiBpcyByZXFkLi4uCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXREdXJhdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYocE1hYy0+bGltLmdwTGltTWxtU2NhblJlcSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHBNYWMtPmxpbS5ncExpbU1sbVNjYW5SZXEtPm1heENoYW5uZWxUaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiIGdwTGltTWxtU2NhblJlcSBpcyBOVUxMICIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gbmVlZCB0byBjaGFuZ2UgbWF4IHRpbWVyLiBUaGlzIGlzIG5vdCBhIHNjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQUNUSVZFX01BWElNVU1fQ0hBTk5FTF9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IG1heCBjaGFubmVsIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBtYXggY2hhbm5lbCB2YWx1ZVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgPSBTWVNfTVNfVE9fVElDS1ModmFsKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1NYXhDaGFubmVsVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgMCkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgY2hhbmdlIG1heCBjaGFubmVsIHRpbWVyLgorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiVW5hYmxlIHRvIGNoYW5nZSBtYXggY2hhbm5lbCB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fSk9JTl9GQUlMX1RJTUVSOgorICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUpvaW5GYWlsdXJlVGltZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGRlYWN0aXZhdGUgSm9pbiBGYWlsdXJlCisgICAgICAgICAgICAgICAgICogdGltZXIuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoIlVuYWJsZSB0byBkZWFjdGl2YXRlIEpvaW4gRmFpbHVyZSB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19KT0lOX0ZBSUxVUkVfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIENvdWxkIG5vdCBnZXQgSm9pbkZhaWx1cmVUaW1lb3V0IHZhbHVlCisgICAgICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEpvaW5GYWlsdXJlVGltZW91dCB2YWx1ZVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHZhbCk7CisKKyAgICAgICAgICAgIGlmICh0eF90aW1lcl9jaGFuZ2UoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUpvaW5GYWlsdXJlVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgMCkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3VsZCBub3QgY2hhbmdlIEpvaW4gRmFpbHVyZQorICAgICAgICAgICAgICAgICAqIHRpbWVyLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gY2hhbmdlIEpvaW4gRmFpbHVyZSB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fQVVUSF9GQUlMX1RJTUVSOgorICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUF1dGhGYWlsdXJlVGltZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgZGVhY3RpdmF0ZSBBdXRoIGZhaWx1cmUgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gZGVhY3RpdmF0ZSBhdXRoIGZhaWx1cmUgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hhbmdlIHRpbWVyIHRvIHJlYWN0aXZhdGUgaXQgaW4gZnV0dXJlCisgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19BVVRIRU5USUNBVEVfRkFJTFVSRV9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBBdXRoRmFpbHVyZVRpbWVvdXQgdmFsdWUKKyAgICAgICAgICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQXV0aEZhaWx1cmVUaW1lb3V0IHZhbHVlXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWwgPSBTWVNfTVNfVE9fVElDS1ModmFsKTsKKworICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQXV0aEZhaWx1cmVUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCAwKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBjaGFuZ2UgQXV0aGVudGljYXRpb24gZmFpbHVyZSB0aW1lci4KKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoInVuYWJsZSB0byBjaGFuZ2UgQXV0aCBmYWlsdXJlIHRpbWVyXG4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUxJTV9BU1NPQ19GQUlMX1RJTUVSOgorICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFzc29jRmFpbHVyZVRpbWVyKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgZGVhY3RpdmF0ZSBBc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyLgorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJ1bmFibGUgdG8gZGVhY3RpdmF0ZSBBc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyXG4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoYW5nZSB0aW1lciB0byByZWFjdGl2YXRlIGl0IGluIGZ1dHVyZQorICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQVNTT0NJQVRJT05fRkFJTFVSRV9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBBc3NvY0ZhaWx1cmVUaW1lb3V0IHZhbHVlCisgICAgICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEFzc29jRmFpbHVyZVRpbWVvdXQgdmFsdWVcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbCA9IFNZU19NU19UT19USUNLUyh2YWwpOworCisgICAgICAgICAgICBpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Bc3NvY0ZhaWx1cmVUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCAwKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBjaGFuZ2UgQXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lci4KKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoInVuYWJsZSB0byBjaGFuZ2UgQXNzb2MgZmFpbHVyZSB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fUkVBU1NPQ19GQUlMX1RJTUVSOgorICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVJlYXNzb2NGYWlsdXJlVGltZXIpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBkZWFjdGl2YXRlIFJlYXNzb2NpYXRpb24gZmFpbHVyZSB0aW1lci4KKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgidW5hYmxlIHRvIGRlYWN0aXZhdGUgUmVhc3NvYyBmYWlsdXJlIHRpbWVyXG4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoYW5nZSB0aW1lciB0byByZWFjdGl2YXRlIGl0IGluIGZ1dHVyZQorICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUkVBU1NPQ0lBVElPTl9GQUlMVVJFX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IFJlYXNzb2NGYWlsdXJlVGltZW91dCB2YWx1ZQorICAgICAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBSZWFzc29jRmFpbHVyZVRpbWVvdXQgdmFsdWVcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbCA9IFNZU19NU19UT19USUNLUyh2YWwpOworCisgICAgICAgICAgICBpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZWFzc29jRmFpbHVyZVRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIDApICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGNoYW5nZSBSZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoInVuYWJsZSB0byBjaGFuZ2UgUmVhc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyXG4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUxJTV9IRUFSVF9CRUFUX1RJTUVSOgorICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUhlYXJ0QmVhdFRpbWVyKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgZGVhY3RpdmF0ZSBIZWFydGJlYXQgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJ1bmFibGUgdG8gZGVhY3RpdmF0ZSBIZWFydGJlYXQgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBCRUFDT05fSU5URVJWQUwgdmFsdWUKKyAgICAgICAgICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEJFQUNPTl9JTlRFUlZBTCB2YWx1ZVxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCwgJnZhbDEpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgaGVhcnRiZWF0IGZhaWx1cmUgdmFsdWVcbiIpKTsKKworICAgICAgICAgICAgLy8gQ2hhbmdlIHRpbWVyIHRvIHJlYWN0aXZhdGUgaXQgaW4gZnV0dXJlCisgICAgICAgICAgICB2YWwgPSBTWVNfTVNfVE9fVElDS1ModmFsICogdmFsMSk7CisKKyAgICAgICAgICAgIGlmICh0eF90aW1lcl9jaGFuZ2UoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUhlYXJ0QmVhdFRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIDApICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGNoYW5nZSBIZWFydEJlYXQgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJ1bmFibGUgdG8gY2hhbmdlIEhlYXJ0QmVhdCB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fUFJPQkVfQUZURVJfSEJfVElNRVI6CisgICAgICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUHJvYmVBZnRlckhCVGltZXIpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBkZWFjdGl2YXRlIEhlYXJ0YmVhdCB0aW1lci4KKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgidW5hYmxlIHRvIGRlYWN0aXZhdGUgcHJvYmVBZnRlckhCVGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUFJPQkVfQUZURVJfSEJfRkFJTF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBQUk9CRV9BRlRFUl9IQl9GQUlMVVJFCisgICAgICAgICAgICAgICAgICogdmFsdWUgZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIFBST0JFX0FGVEVSX0hCX0ZBSUxfVElNRU9VVCB2YWx1ZVxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGFuZ2UgdGltZXIgdG8gcmVhY3RpdmF0ZSBpdCBpbiBmdXR1cmUKKyAgICAgICAgICAgIHZhbCA9IFNZU19NU19UT19USUNLUyh2YWwpOworCisgICAgICAgICAgICBpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Qcm9iZUFmdGVySEJUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCAwKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBjaGFuZ2UgSGVhcnRCZWF0IHRpbWVyLgorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICBGTCgidW5hYmxlIHRvIGNoYW5nZSBQcm9iZUFmdGVySEJUaW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fS0VFUEFMSVZFX1RJTUVSOgorICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUtlZXBhbGl2ZVRpbWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGRlYWN0aXZhdGUgS2VlcGFsaXZlIHRpbWVyLgorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJ1bmFibGUgdG8gZGVhY3RpdmF0ZSBLZWVwYWxpdmVUaW1lciB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGFuZ2UgdGltZXIgdG8gcmVhY3RpdmF0ZSBpdCBpbiBmdXR1cmUKKworICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfS0VFUEFMSVZFX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IGtlZXBhbGl2ZSB0aW1lb3V0IHZhbHVlCisgICAgICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIGtlZXBhbGl2ZSB0aW1lb3V0IHZhbHVlXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsID0gMzAwMDsKKyAgICAgICAgICAgICAgICBwTWFjLT5zY2gua2VlcEFsaXZlID0gMDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHBNYWMtPnNjaC5rZWVwQWxpdmUgPSAxOworCisKKworICAgICAgICAgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHZhbCArIFNZU19USUNLX0RVUl9NUyAtIDEpOworCisgICAgICAgICAgICBpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1LZWVwYWxpdmVUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCB2YWwpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGNoYW5nZSBLZWVwYWxpdmVUaW1lciB0aW1lci4KKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgidW5hYmxlIHRvIGNoYW5nZSBLZWVwYWxpdmVUaW1lciB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQpIHx8IGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgICAgIGNhc2UgZUxJTV9CQUNLR1JPVU5EX1NDQU5fVElNRVI6CisgICAgICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQmFja2dyb3VuZFNjYW5UaW1lcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBkZWFjdGl2YXRlIEJhY2tncm91bmRTY2FuVGltZXIgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoInVuYWJsZSB0byBkZWFjdGl2YXRlIEJhY2tncm91bmRTY2FuVGltZXIgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hhbmdlIHRpbWVyIHRvIHJlYWN0aXZhdGUgaXQgaW4gZnV0dXJlCisgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19CQUNLR1JPVU5EX1NDQU5fUEVSSU9ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBCYWNrZ3JvdW5kIHNjYW4gcGVyaW9kIHZhbHVlCisgICAgICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIEJhY2tncm91bmQgc2NhbiBwZXJpb2QgdmFsdWVcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWwgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwgPSBMSU1fQkFDS0dST1VORF9TQ0FOX1BFUklPRF9ERUZBVUxUX01TOworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQmFja2dyb3VuZFNjYW5EaXNhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuRGlzYWJsZSA9IGZhbHNlOworCisgICAgICAgICAgICB2YWwgPSBTWVNfTVNfVE9fVElDS1ModmFsKTsKKworICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQmFja2dyb3VuZFNjYW5UaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCB2YWwpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGNoYW5nZSBCYWNrZ3JvdW5kU2NhblRpbWVyIHRpbWVyLgorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJ1bmFibGUgdG8gY2hhbmdlIEJhY2tncm91bmRTY2FuVGltZXIgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICAgICAgY2FzZSBlTElNX1BSRV9BVVRIX0NMRUFOVVBfVElNRVI6CisgICAgICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUHJlQXV0aENsbnVwVGltZXIpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBkZWFjdGl2YXRlIFByZS1hdXRoIGNsZWFudXAgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoInVuYWJsZSB0byBkZWFjdGl2YXRlIFByZS1hdXRoIGNsZWFudXAgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hhbmdlIHRpbWVyIHRvIHJlYWN0aXZhdGUgaXQgaW4gZnV0dXJlCisgICAgICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QUkVBVVRIX0NMTlVQX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3VsZCBub3QgZ2V0IHByZS1hdXRoIGNsZWFudXAgdmFsdWUKKyAgICAgICAgICAgICAgICAgKiBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgcHJlLWF1dGggY2xlYW51cCB2YWx1ZVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHZhbCk7CisKKyAgICAgICAgICAgIGlmICh0eF90aW1lcl9jaGFuZ2UoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVByZUF1dGhDbG51cFRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIHZhbCkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgY2hhbmdlIHByZS1hdXRoIGNsZWFudXAgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoInVuYWJsZSB0byBjaGFuZ2UgcHJlLWF1dGggY2xlYW51cCB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fTEVBUk5fSU5URVJWQUxfVElNRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBSZXN0YXJ0IExlYXJuIEludGVydmFsIHRpbWVyCisgICAgICAgICAgICB0QU5JX1UzMiBsZWFybkludGVydmFsID0KKyAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0R1cmF0aW9uLnNob3J0VGVybVBlcmlvZCAvCisgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzOworCisgICAgICAgICAgICAgIGlmICh0eF90aW1lcl9kZWFjdGl2YXRlKAorICAgICAgICAgICAgICAgICAgICAgJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkludGVydmFsVGltZXIpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBkZWFjdGl2YXRlIExlYXJuIEludGVydmFsIHRpbWVyLgorICAgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgTGVhcm4gSW50ZXJ2YWwgdGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh0eF90aW1lcl9jaGFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkludGVydmFsVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTX01TX1RPX1RJQ0tTKGxlYXJuSW50ZXJ2YWwpLCAwKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgY2hhbmdlIExlYXJuIEludGVydmFsIHRpbWVyLgorICAgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBjaGFuZ2UgTGVhcm4gSW50ZXJ2YWwgdGltZXJcbiIpKTsKKworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0czLAorICAgICAgICAgICAgICAgICAgRkwoIlNldHRpbmcgdGhlIExlYXJuIEludGVydmFsIFRJTUVSIHRvICVkIHRpY2tzXG4iKSwKKyAgICAgICAgICAgICAgICAgIFNZU19NU19UT19USUNLUyhsZWFybkludGVydmFsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworI2VuZGlmCisgICAgICAgIGNhc2UgZUxJTV9DSEFOTkVMX1NXSVRDSF9USU1FUjoKKyAgICAgICAgICAgIGlmICh0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1DaGFubmVsU3dpdGNoVGltZXIpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInR4X3RpbWVyX2RlYWN0aXZhdGUgZmFpbGVkIVxuIikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQ2hhbm5lbFN3aXRjaFRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaFRpbWVvdXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJ0eF90aW1lcl9jaGFuZ2UgZmFpbGVkIFxuIikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUxJTV9MRUFSTl9EVVJBVElPTl9USU1FUjoKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLmxlYXJuRHVyYXRpb25UaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkNvdWxkIG5vdCBkZWFjdGl2YXRlIGxlYXJuIGR1cmF0aW9uIHRpbWVyXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0NvbnRyb2wubG9uZ0NoYW5uZWxTY2FuUGVyaW9kaWNpdHkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTWFjLT5saW0uZ0xpbU1lYXNQYXJhbXMuc2hvcnREdXJhdGlvbkNvdW50ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdwTGltTWVhc1JlcS0+bWVhc0NvbnRyb2wubG9uZ0NoYW5uZWxTY2FuUGVyaW9kaWNpdHkpKQorICAgICAgICAgICAgeworI2lmZGVmIEFOSV9BUF9TREsKKyAgICAgICAgICAgICAgICB2YWwgPSBwTWFjLT5saW0uZ0xpbVNjYW5EdXJhdGlvbkNvbnZlcnQubG9uZ0NoYW5uZWxTY2FuRHVyYXRpb25fdGljazsKKyNlbHNlCisgICAgICAgICAgICAgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNEdXJhdGlvbi5sb25nQ2hhbm5lbFNjYW5EdXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFNZU19USUNLX0RVUl9NUyAtIDEpOworICAgICAgICAgICAgICAgIGlmKHZhbCA+IDEpCisgICAgICAgICAgICAgICAgICAgIHZhbC0tOworI2VuZGlmIC8qIEFOSV9BUF9TREsgKi8KKyAgICAgICAgICAgICAgICAvLyBUaW1lIHRvIHBlcmZvcm0gbWVhc3VyZW1lbnRzIGZvciBsb25nZXIgdGVybQorICAgICAgICAgICAgICAgIGlmICh0eF90aW1lcl9jaGFuZ2UoJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkR1cmF0aW9uVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIDApICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgY2hhbmdlIExlYXJuIGR1cmF0aW9uIHRpbWVyLgorICAgICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJVbmFibGUgdG8gY2hhbmdlIExlYXJuIGR1cmF0aW9uIHRpbWVyXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLnNob3J0RHVyYXRpb25Db3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisjaWZkZWYgQU5JX0FQX1NESworICAgICAgICAgICAgICAgIHZhbCA9IHBNYWMtPmxpbS5nTGltU2NhbkR1cmF0aW9uQ29udmVydC5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb25fdGljazsKKyNlbHNlCisgICAgICAgICAgICAgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU1lTX1RJQ0tfRFVSX01TIC0gMSk7CisgICAgICAgICAgICAgICAgaWYodmFsID4gMSkKKyAgICAgICAgICAgICAgICAgICAgdmFsLS07CisjZW5kaWYgLyogQU5JX0FQX1NESyAqLworICAgICAgICAgICAgICAgIGlmICh0eF90aW1lcl9jaGFuZ2UoJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkR1cmF0aW9uVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCAwKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGNoYW5nZSBMZWFybiBkdXJhdGlvbiB0aW1lci4KKyAgICAgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGNoYW5nZSBMZWFybiBkdXJhdGlvbiB0aW1lclxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNEYXRhLT5kdXJhdGlvbiA9IHZhbCAqIFNZU19USUNLX0RVUl9NUzsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlTElNX1FVSUVUX0JTU19USU1FUjoKKyAgICAgICAgICAgIGlmIChUWF9TVUNDRVNTICE9CisgICAgICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICBGTCgiVW5hYmxlIHRvIGRlLWFjdGl2YXRlIGdMaW1RdWlldEJzc1RpbWVyISBXaWxsIGF0dGVtcHQgdG8gYWN0aXZhdGUgYW55d2F5Li4uXG4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdMaW1RdWlldER1cmF0aW9uIGFwcGVhcnMgdG8gYmUgaW4gdW5pdHMgb2YgdGlja3MKKyAgICAgICAgICAgIC8vIFVzZSBpdCBhcyBpcworICAgICAgICAgICAgaWYgKFRYX1NVQ0NFU1MgIT0KKyAgICAgICAgICAgICAgICB0eF90aW1lcl9jaGFuZ2UoICZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyLAorICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgRkwoIlVuYWJsZSB0byBjaGFuZ2UgZ0xpbVF1aWV0QnNzVGltZXIhIFdpbGwgc3RpbGwgYXR0ZW1wdCB0byBhY3RpdmF0ZSBhbnl3YXkuLi5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUxJTV9RVUlFVF9USU1FUjoKKyAgICAgICAgICAgIGlmKCBUWF9TVUNDRVNTICE9IHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0VGltZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgRkwoICJVbmFibGUgdG8gZGVhY3RpdmF0ZSBnTGltUXVpZXRUaW1lciEgV2lsbCBzdGlsbCBhdHRlbXB0IHRvIHJlLWFjdGl2YXRlIGFueXdheS4uLlxuIiApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IHRoZSBORVcgdGltZW91dCB2YWx1ZSwgaW4gdGlja3MKKyAgICAgICAgICAgIGlmKCBUWF9TVUNDRVNTICE9IHR4X3RpbWVyX2NoYW5nZSggJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0VGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNfTVNfVE9fVElDS1MocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFRpbWVvdXRWYWx1ZSksIDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgRkwoICJVbmFibGUgdG8gY2hhbmdlIGdMaW1RdWlldFRpbWVyISBXaWxsIHN0aWxsIGF0dGVtcHQgdG8gcmUtYWN0aXZhdGUgYW55d2F5Li4uXG4iICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNpZiAwCisgICAgICAgIGNhc2UgZUxJTV9XUFNfT1ZFUkxBUF9USU1FUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlc3RhcnQgTGVhcm4gSW50ZXJ2YWwgdGltZXIKKworICAgICAgICAgICAgICB0QU5JX1UzMiBXUFNPdmVybGFwVGltZXIgPSBTWVNfTVNfVE9fVElDS1MoTElNX1dQU19PVkVSTEFQX1RJTUVSX01TKTsKKworICAgICAgICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1XUFNPdmVybGFwVGltZXJPYmouZ0xpbVdQU092ZXJsYXBUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGRlYWN0aXZhdGUgTGVhcm4gSW50ZXJ2YWwgdGltZXIuCisgICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gZGVhY3RpdmF0ZSBXUFMgb3ZlcmxhcCB0aW1lclxuIikpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2NoYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltV1BTT3ZlcmxhcFRpbWVyT2JqLmdMaW1XUFNPdmVybGFwVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV1BTT3ZlcmxhcFRpbWVyLCAwKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgY2hhbmdlIExlYXJuIEludGVydmFsIHRpbWVyLgorICAgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIlVuYWJsZSB0byBjaGFuZ2UgV1BTIG92ZXJsYXAgdGltZXJcbiIpKTsKKworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgRkwoIlNldHRpbmcgV1BTIG92ZXJsYXAgVElNRVIgdG8gJWQgdGlja3NcbiIpLAorICAgICAgICAgICAgICAgICAgV1BTT3ZlcmxhcFRpbWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgIGNhc2UgZUxJTV9GVF9QUkVBVVRIX1JTUF9USU1FUjoKKyAgICAgICAgICAgIGlmICh0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1GVFByZUF1dGhSc3BUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAqKiBDb3VsZCBub3QgZGVhY3RpdmF0ZSBKb2luIEZhaWx1cmUKKyAgICAgICAgICAgICAgICAqKiB0aW1lci4gTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICoqLworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGRlYWN0aXZhdGUgUHJlYXV0aCByZXNwb25zZSBGYWlsdXJlIHRpbWVyXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWwgPSAxMDAwOworICAgICAgICAgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHZhbCk7CisgICAgICAgICAgICBpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1GVFByZUF1dGhSc3BUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgMCkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAqIENvdWxkIG5vdCBjaGFuZ2UgSm9pbiBGYWlsdXJlCisgICAgICAgICAgICAgICAgKiB0aW1lci4gTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJVbmFibGUgdG8gY2hhbmdlIEpvaW4gRmFpbHVyZSB0aW1lclxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICBjYXNlIGVMSU1fVFNNX1RJTUVSOgorICAgICAgICAgICAgIGlmICh0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1DY3hUc21UaW1lcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gZGVhY3RpdmF0ZSBUU00gdGltZXJcbiIpKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIGNhc2UgZUxJTV9SRU1BSU5fQ0hOX1RJTUVSOgorICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVJlbWFpbk9uQ2hhbm5lbFRpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICoqIENvdWxkIG5vdCBkZWFjdGl2YXRlIEpvaW4gRmFpbHVyZQorICAgICAgICAgICAgICAgICoqIHRpbWVyLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgKiovCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJVbmFibGUgdG8gZGVhY3RpdmF0ZSBSZW1haW4gb24gQ2huIHRpbWVyXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWwgPSAxMDAwOworICAgICAgICAgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHZhbCk7CisgICAgICAgICAgICBpZiAodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZW1haW5PbkNoYW5uZWxUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgMCkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAqIENvdWxkIG5vdCBjaGFuZ2UgSm9pbiBGYWlsdXJlCisgICAgICAgICAgICAgICAgKiB0aW1lci4gTG9nIGVycm9yLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJVbmFibGUgdG8gY2hhbmdlIHRpbWVyXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBJbnZhbGlkIHRpbWVySWQuIExvZyBlcnJvcgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfSAvKioqKioqIGVuZCBsaW1EZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIoKSAqKioqKiovCisKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgbGltSGVhcnRCZWF0RGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyCitcYnJpZWYgIFRoaXMgZnVuY3Rpb24gZGVhY3RpdmF0ZXMgYW5kIGNoYW5nZXMgdGhlIGhlYXJ0IGJlYXQKK1wgICAgICAgdGltZXIsIGVMSU1fSEVBUlRfQkVBVF9USU1FUi4KK1wKK1xwYXJhbSBwTWFjCitccGFyYW0gcHNlc3Npb25FbnRyeQorXHJldHVybiBOb25lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltSGVhcnRCZWF0RGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMzIgICAgdmFsLCB2YWwxOworCisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfREVBQ1RJVkFURSwgMCwgZUxJTV9IRUFSVF9CRUFUX1RJTUVSKSk7CisKKyAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltSGVhcnRCZWF0VGltZXIpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbCB0byBkZWFjdGl2YXRlIEhlYXJ0QmVhdFRpbWVyIFxuIikpOworCisgICAgLyogSEIgVGltZXIgc2Vzc2lvbmlzYXRpb246IEluIGNhc2Ugb2YgMiBvciBtb3JlIHNlc3Npb25zLCB0aGUgSEIgaW50ZXJ2YWwga2VlcHMKKyAgICAgICBjaGFuZ2luZy4gdG8gYXZvaWQgdGhpcyBwcm9ibGVtLCBIZWFydEJlYXQgaW50ZXJ2YWwgaXMgbWFkZSBjb25zdGFudCwgYnkKKyAgICAgICBmaXhpbmcgYmVhY29uIGludGVydmFsIHRvIDEwMG1zIGltbWF0ZXJpYWwgb2YgdGhlIGJlYWNvbiBpbnRlcnZhbCBvZiB0aGUgc2Vzc2lvbiAqLworCisgICAgLy92YWwgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWw7CisgICAgdmFsID0gTElNX0hCX1RJTUVSX0JFQUNPTl9JTlRFUlZBTDsKKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xELCAmdmFsMSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkZhaWwgdG8gZ2V0IFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQgXG4iKSk7CisKKyAgICBQRUxPR1cobGltTG9nKHBNYWMsTE9HVywKKyAgICAgICAgICAgICAgICAgRkwoIkhCIFRpbWVyIEludC49MTAwbXMgKiAlZCwgQmVhY29uIEludC49JWRtcyxTZXNzaW9uIElkPSVkIFxuIiksCisgICAgICAgICAgICAgICAgIHZhbDEsIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOykKKworICAgIC8vIENoYW5nZSB0aW1lciB0byByZWFjdGl2YXRlIGl0IGluIGZ1dHVyZQorICAgIHZhbCA9IFNZU19NU19UT19USUNLUyh2YWwgKiB2YWwxKTsKKworICAgIGlmICh0eF90aW1lcl9jaGFuZ2UoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUhlYXJ0QmVhdFRpbWVyLCB2YWwsIDApICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbCB0byBjaGFuZ2UgSGVhcnRCZWF0VGltZXJcbiIpKTsKKworfSAvKioqKioqIGVuZCBsaW1IZWFydEJlYXREZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIoKSAqKioqKiovCisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcgorXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHMgY2FsbGVkIHRvIGRlYWN0aXZhdGUsIGNoYW5nZSBhbmQKK1wgICAgICAgYWN0aXZhdGUgYSB0aW1lci4KK1wKK1xwYXJhbSBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorXHBhcmFtIHBzZXNzaW9uRW50cnkKK1xyZXR1cm4gTm9uZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQKK2xpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIlJ4ZWQgSGVhcnRiZWF0LiBDb3VudD0lZFxuIiksIHBzZXNzaW9uRW50cnktPkxpbVJ4ZWRCZWFjb25DbnREdXJpbmdIQik7KQorCisgICAgbGltSGVhcnRCZWF0RGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX0hFQVJUX0JFQVRfVElNRVIpKTsKKworICAgIC8vb25seSBzdGFydCB0aGUgaGVhcmJlYXQtdGltZXIgaWYgdGhlIHRpbWVvdXQgdmFsdWUgaXMgbm9uLXplcm8KKyAgICBpZihwTWFjLT5saW0ubGltVGltZXJzLmdMaW1IZWFydEJlYXRUaW1lci5pbml0U2NoZWR1bGVUaW1lSW5Nc2VjcyA+IDApIHsKKyAgICAgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1IZWFydEJlYXRUaW1lcikhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiY291bGQgbm90IGFjdGl2YXRlIEhlYXJ0YmVhdCB0aW1lclxuIikpOworICAgICAgICB9CisgICAgICAgIGxpbVJlc2V0SEJQa3RDb3VudChwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisKK30gLyoqKioqKiBlbmQgbGltUmVhY3RpdmF0ZUhlYXJ0QmVhdFRpbWVyKCkgKioqKioqLworCisjaWYgMAorLyoqKioqKgorICogTm90ZTogVXNlIHRoaXMgY29kZSBvbmNlIHlvdSBoYXZlIGNvbnZlcnRlZCBhbGwKKyAqIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcigpIGNhbGxzIHRvCisgKiBsaW1SZWFjdGl2YXRlVGltZXIoKSBjYWxscy4KKyAqCisgKioqKioqLworCitOb3csIGluIGRldi9idGFtcDIsCitoZXJlIGFyZSBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gbGltUmVhY3RpdmF0ZUhlYXJ0QmVhdFRpbWVyKCkuCisKK0Mgc3ltYm9sOiBsaW1SZWFjdGl2YXRlSGVhcnRCZWF0VGltZXIKKworICBGaWxlICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgTGluZQorMCBsaW1UaW1lclV0aWxzLmggICAgICAgICAgIDxnbG9iYWw+ICAgICAgICAgICAgICAgICAgICA1NSB2b2lkIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcih0cEFuaVNpckdsb2JhbCAsIHRwUEVTZXNzaW9uKTsKKzEgbGltSWJzc1BlZXJNZ210LmMgICAgICAgICBsaW1JYnNzSGVhcnRCZWF0SGFuZGxlICAgIDEyODIgbGltUmVhY3RpdmF0ZUhlYXJ0QmVhdFRpbWVyKHBNYWMsIHBzZXNzaW9uRW50cnkpOworMiBsaW1MaW5rTW9uaXRvcmluZ0FsZ28uYyAgIGxpbUhhbmRsZUhlYXJ0QmVhdEZhaWx1cmUgIDM5NSBsaW1SZWFjdGl2YXRlSGVhcnRCZWF0VGltZXIocE1hYywgcHNlc3Npb25FbnRyeSk7CiszIGxpbUxpbmtNb25pdG9yaW5nQWxnby5jICAgbGltSGFuZGxlSGVhcnRCZWF0RmFpbHVyZSAgNDEwIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKzQgbGltUHJvY2Vzc01sbVJzcE1lc3NhZ2VzLiBsaW1Qcm9jZXNzU3RhTWxtQWRkU3RhUnNwIDIxMTEgbGltUmVhY3RpdmF0ZUhlYXJ0QmVhdFRpbWVyKHBNYWMsIHBzZXNzaW9uRW50cnkpOworNSBsaW1Qcm9jZXNzTWxtUnNwTWVzc2FnZXNfIGxpbVByb2Nlc3NTdGFNbG1BZGRTdGFSc3AgMjM1MCBsaW1SZWFjdGl2YXRlSGVhcnRCZWF0VGltZXIocE1hYywgcHNlc3Npb25FbnRyeSk7Cis2IGxpbVByb2Nlc3NNbG1Sc3BNZXNzYWdlc18gbGltUHJvY2Vzc1N0YU1sbUFkZFN0YVJzcCAyMTExIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKzcgbGltVGltZXJVdGlscy5jICAgICAgICAgICBsaW1SZWFjdGl2YXRlSGVhcnRCZWF0VGltIDE0NzMgbGltUmVhY3RpdmF0ZUhlYXJ0QmVhdFRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCis4IGxpbVV0aWxzLmMgICAgICAgICAgICAgICAgbGltSGFuZGxlSGVhcnRCZWF0RmFpbHVyZSA2NzQzIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKzkgbGltVXRpbHMuYyAgICAgICAgICAgICAgICBsaW1IYW5kbGVIZWFydEJlYXRGYWlsdXJlIDY3NTEgbGltUmVhY3RpdmF0ZUhlYXJ0QmVhdFRpbWVyKHBNYWMsIHBzZXNzaW9uRW50cnkpOworCitOb3csIGluIG1haW4vbGF0ZXN0LCBvbiB0aGUgb3RoZXIgaGFuZCwKK2hlcmUgYXJlIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBsaW1SZWFjdGl2YXRlVGltZXIoKS4KKworQyBzeW1ib2w6IGxpbVJlYWN0aXZhdGVUaW1lcgorCisgIEZpbGUgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAgICAgICBMaW5lCiswIGxpbVRpbWVyVXRpbHMuaCAgICAgICAgICAgPGdsb2JhbD4gICAgICAgICAgICAgICAgICAgIDU0IHZvaWQgbGltUmVhY3RpdmF0ZVRpbWVyKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMik7CisxIGxpbUlic3NQZWVyTWdtdC5jICAgICAgICAgbGltSWJzc0hlYXJ0QmVhdEhhbmRsZSAgICAxMTgzIGxpbVJlYWN0aXZhdGVUaW1lcihwTWFjLCBlTElNX0hFQVJUX0JFQVRfVElNRVIpOworMiBsaW1JYnNzUGVlck1nbXQuYyAgICAgICAgIGxpbUlic3NIZWFydEJlYXRIYW5kbGUgICAgMTI0NiBsaW1SZWFjdGl2YXRlVGltZXIocE1hYywgZUxJTV9IRUFSVF9CRUFUX1RJTUVSKTsKKzMgbGltTGlua01vbml0b3JpbmdBbGdvLmMgICBsaW1IYW5kbGVIZWFydEJlYXRGYWlsdXJlICAyODMgbGltUmVhY3RpdmF0ZVRpbWVyKHBNYWMsIGVMSU1fSEVBUlRfQkVBVF9USU1FUik7Cis0IGxpbUxpbmtNb25pdG9yaW5nQWxnby5jICAgbGltSGFuZGxlSGVhcnRCZWF0RmFpbHVyZSAgMzIwIGxpbVJlYWN0aXZhdGVUaW1lcihwTWFjLCBlTElNX0hFQVJUX0JFQVRfVElNRVIpOworNSBsaW1MaW5rTW9uaXRvcmluZ0FsZ28uYyAgIGxpbUhhbmRsZUhlYXJ0QmVhdEZhaWx1cmUgIDMzNSBsaW1SZWFjdGl2YXRlVGltZXIocE1hYywgZUxJTV9IRUFSVF9CRUFUX1RJTUVSKTsKKzYgbGltUHJvY2Vzc01lc3NhZ2VRdWV1ZS5jICBsaW1Qcm9jZXNzTWVzc2FnZXMgICAgICAgIDEyMTAgbGltUmVhY3RpdmF0ZVRpbWVyKHBNYWMsIGVMSU1fSEVBUlRfQkVBVF9USU1FUik7Cis3IGxpbVByb2Nlc3NNZXNzYWdlUXVldWUuYyAgbGltUHJvY2Vzc01lc3NhZ2VzICAgICAgICAxMjE4IGxpbVJlYWN0aXZhdGVUaW1lcihwTWFjLCBlTElNX0hFQVJUX0JFQVRfVElNRVIpOworOCBsaW1Qcm9jZXNzTWxtUnNwTWVzc2FnZXMuIGxpbVByb2Nlc3NTdGFNbG1BZGRTdGFSc3AgMTcyNiBsaW1SZWFjdGl2YXRlVGltZXIocE1hYywgZUxJTV9IRUFSVF9CRUFUX1RJTUVSKTsKKzkgbGltVGltZXJVdGlscy5jICAgICAgICAgICBsaW1SZWFjdGl2YXRlVGltZXIgICAgICAgIDE0NTEgbGltUmVhY3RpdmF0ZVRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHRpbWVySWQpCisKKworLyoqCisgKiBsaW1SZWFjdGl2YXRlVGltZXIoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZWFjdGl2YXRlLCBjaGFuZ2UgYW5kCisgKiBhY3RpdmF0ZSBhIHRpbWVyCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgdGltZXJJZCAtIGVudW0gb2YgdGltZXIgdG8gYmUgZGVhY3RpdmF0ZWQgYW5kIGNoYW5nZWQKKyAqICAgICAgICAgICAgICAgICAgIFRoaXMgZW51bSBpcyBkZWZpbmVkIGluIGxpbVV0aWxzLmggZmlsZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbVJlYWN0aXZhdGVUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiB0aW1lcklkKQoreworICAgIGlmICh0aW1lcklkID09IGVMSU1fSEVBUlRfQkVBVF9USU1FUikKKyAgICB7CisgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiUnhlZCBIZWFydGJlYXQuIENvdW50PSVkXG4iKSwKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltUnhlZEJlYWNvbkNudER1cmluZ0hCKTspCisgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0hFQVJUX0JFQVRfVElNRVIpOworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9IRUFSVF9CRUFUX1RJTUVSKSk7CisgICAgICAgIGlmIChsaW1BY3RpdmF0ZUhlYXJCZWF0VGltZXIocE1hYykgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLy8vIENvdWxkIG5vdCBhY3RpdmF0ZSBIZWFydGJlYXQgdGltZXIuCisgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgIEZMKCJjb3VsZCBub3QgYWN0aXZhdGUgSGVhcnRiZWF0IHRpbWVyXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgbGltUmVzZXRIQlBrdENvdW50KHBNYWMpOworICAgIH0KK30gLyoqKioqKiBlbmQgbGltUmVhY3RpdmF0ZVRpbWVyKCkgKioqKioqLworI2VuZGlmCisKKworLyoqCisgKiBsaW1BY3RpdmF0ZUhlYXJCZWF0VGltZXIoKQorICoKKyAqCisgKiBAYnJpZWY6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFjdGl2YXRlIGhlYXJ0YmVhdCB0aW1lcgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICogQG5vdGUgICBzdGFJZCBmb3IgZUxJTV9BVVRIX1JTUF9USU1FUiBpcyBhdXRoIE5vZGUgSW5kZXguCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gVFhfU1VDQ0VTUyAtIHRpbWVyIGlzIGFjdGl2YXRlZAorICogICAgICAgICBlcnJvcnMgLSBmYWlsIHRvIHN0YXJ0IHRoZSB0aW1lcgorICovCit2X1VJTlRfdCBsaW1BY3RpdmF0ZUhlYXJCZWF0VGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB2X1VJTlRfdCBzdGF0dXMgPSBUWF9USU1FUl9FUlJPUjsKKworICAgIGlmKFRYX0FJUkdPX1RNUl9TSUdOQVRVUkUgPT0gcE1hYy0+bGltLmxpbVRpbWVycy5nTGltSGVhcnRCZWF0VGltZXIudG1yU2lnbmF0dXJlKQorICAgIHsKKyAgICAgICAgLy9jb25zaWRlciAwIGludGVydmFsIGEgb2sgY2FzZQorICAgICAgICBpZiggcE1hYy0+bGltLmxpbVRpbWVycy5nTGltSGVhcnRCZWF0VGltZXIuaW5pdFNjaGVkdWxlVGltZUluTXNlY3MgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSB0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltSGVhcnRCZWF0VGltZXIpOworICAgICAgICAgICAgaWYoIFRYX1NVQ0NFU1MgIT0gc3RhdHVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCBhY3RpdmF0ZSBIZWFydGJlYXQgdGltZXIgc3RhdHVzKCVkKVxuIiksIHN0YXR1cyk7KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gVFhfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisKKy8qKgorICogbGltRGVhY3RpdmF0ZUFuZENoYW5nZVBlclN0YUlkVGltZXIoKQorICoKKyAqCisgKiBAYnJpZWY6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlYWN0aXZhdGUgYW5kIGNoYW5nZSBhIHBlciBTVEEgdGltZXIKKyAqIGZvciBmdXR1cmUgcmUtYWN0aXZhdGlvbgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICogQG5vdGUgICBzdGFJZCBmb3IgZUxJTV9BVVRIX1JTUF9USU1FUiBpcyBhdXRoIE5vZGUgSW5kZXguCisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICB0aW1lcklkIC0gZW51bSBvZiB0aW1lciB0byBiZSBkZWFjdGl2YXRlZCBhbmQgY2hhbmdlZAorICogICAgICAgICAgICAgICAgICAgVGhpcyBlbnVtIGlzIGRlZmluZWQgaW4gbGltVXRpbHMuaCBmaWxlCisgKiBAcGFyYW0gIHN0YUlkICAgLSBzdGFJZAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbURlYWN0aXZhdGVBbmRDaGFuZ2VQZXJTdGFJZFRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHRpbWVySWQsIHRBTklfVTE2IHN0YUlkKQoreworICAgIHRBTklfVTMyICAgIHZhbDsKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9ERUFDVElWQVRFLCAwLCB0aW1lcklkKSk7CisKKyAgICBzd2l0Y2ggKHRpbWVySWQpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fQ05GX1dBSVRfVElNRVI6CisKKyAgICAgICAgICAgIGlmICh0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdwTGltQ25mV2FpdFRpbWVyW3N0YUlkXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwoInVuYWJsZSB0byBkZWFjdGl2YXRlIENORiB3YWl0IHRpbWVyXG4iKSk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hhbmdlIHRpbWVyIHRvIHJlYWN0aXZhdGUgaXQgaW4gZnV0dXJlCisKKyAgICAgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1dUX0NORl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBjbmYgdGltZW91dCB2YWx1ZQorICAgICAgICAgICAgICAgICAqIGZyb20gQ0ZHLiBMb2cgZXJyb3IuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBjbmYgdGltZW91dCB2YWx1ZVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHZhbCk7CisKKyAgICAgICAgICAgIGlmICh0eF90aW1lcl9jaGFuZ2UoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXJbc3RhSWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIHZhbCkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgY2hhbmdlIGNuZiB0aW1lci4KKyAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInVuYWJsZSB0byBjaGFuZ2UgY25mIHdhaXQgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlTElNX0FVVEhfUlNQX1RJTUVSOgorICAgICAgICB7CisgICAgICAgICAgICB0TGltUHJlQXV0aE5vZGUgKnBBdXRoTm9kZTsKKworICAgICAgICAgICAgcEF1dGhOb2RlID0gbGltR2V0UHJlQXV0aE5vZGVGcm9tSW5kZXgocE1hYywgJnBNYWMtPmxpbS5nTGltUHJlQXV0aFRpbWVyVGFibGUsIHN0YUlkKTsKKworICAgICAgICAgICAgaWYgKHBBdXRoTm9kZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiSW52YWxpZCBQcmUgQXV0aCBJbmRleCBwYXNzZWQgOiVkXG4iKSwgc3RhSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcEF1dGhOb2RlLT50aW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgZGVhY3RpdmF0ZSBhdXRoIHJlc3BvbnNlIHRpbWVyLgorICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvcgorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgidW5hYmxlIHRvIGRlYWN0aXZhdGUgYXV0aCByZXNwb25zZSB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGFuZ2UgdGltZXIgdG8gcmVhY3RpdmF0ZSBpdCBpbiBmdXR1cmUKKworICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQVVUSEVOVElDQVRFX1JTUF9USU1FT1VULCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ291bGQgbm90IGdldCBhdXRoIHJzcCB0aW1lb3V0IHZhbHVlCisgICAgICAgICAgICAgICAgICogZnJvbSBDRkcuIExvZyBlcnJvci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHJldHJpZXZlIGF1dGggcmVzcG9uc2UgdGltZW91dCB2YWx1ZVxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YWwgPSBTWVNfTVNfVE9fVElDS1ModmFsKTsKKworICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2NoYW5nZSgmcEF1dGhOb2RlLT50aW1lciwgdmFsLCAwKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBjaGFuZ2UgYXV0aCByc3AgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJ1bmFibGUgdG8gY2hhbmdlIGF1dGggcnNwIHRpbWVyXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisjaWYgKGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgfHxkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKyAgICAgICAgY2FzZSBlTElNX0xFQVJOX0lOVEVSVkFMX1RJTUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gUmVzdGFydCBMZWFybiBJbnRlcnZhbCB0aW1lcgorICAgICAgICAgICAgdEFOSV9VMzIgbGVhcm5JbnRlcnZhbCA9CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydFRlcm1QZXJpb2QgLworICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ3BMaW1NZWFzUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVsczsKKworICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2RlYWN0aXZhdGUoCisgICAgICAgICAgICAgICAgICAgJnBNYWMtPmxpbS5nTGltTWVhc1BhcmFtcy5sZWFybkludGVydmFsVGltZXIpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGRlYWN0aXZhdGUgTGVhcm4gSW50ZXJ2YWwgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gZGVhY3RpdmF0ZSBMZWFybiBJbnRlcnZhbCB0aW1lclxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHhfdGltZXJfY2hhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAmcE1hYy0+bGltLmdMaW1NZWFzUGFyYW1zLmxlYXJuSW50ZXJ2YWxUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgU1lTX01TX1RPX1RJQ0tTKGxlYXJuSW50ZXJ2YWwpLCAwKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBjaGFuZ2UgTGVhcm4gSW50ZXJ2YWwgdGltZXIuCisgICAgICAgICAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJVbmFibGUgdG8gY2hhbmdlIExlYXJuIEludGVydmFsIHRpbWVyXG4iKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HMywKKyAgICAgICAgICAgICAgICBGTCgiU2V0dGluZyB0aGUgTGVhcm4gSW50ZXJ2YWwgVElNRVIgdG8gJWQgdGlja3NcbiIpLAorICAgICAgICAgICAgICAgIFNZU19NU19UT19USUNLUyhsZWFybkludGVydmFsKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8jaWYgKGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgfHxkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gSW52YWxpZCB0aW1lcklkLiBMb2cgZXJyb3IKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorfQorCisKKy8qKgorICogbGltQWN0aXZhdGVDbmZUaW1lcigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFjdGl2YXRlIGEgcGVyIFNUQSB0aW1lcgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIFN0YUlkICAgLSBzdGFJZAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltQWN0aXZhdGVDbmZUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBzdGFJZCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9DTkZfV0FJVF9USU1FUikpOworICAgIHBNYWMtPmxpbS5saW1UaW1lcnMuZ3BMaW1DbmZXYWl0VGltZXJbc3RhSWRdLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5ncExpbUNuZldhaXRUaW1lcltzdGFJZF0pCisgICAgICAgICAgICAgICAgIT0gVFhfU1VDQ0VTUykKKyAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCBhY3RpdmF0ZSBjbmYgd2FpdCB0aW1lclxuIikpOworICAgIH0KK30KKworLyoqCisgKiBsaW1BY3RpdmF0ZUF1dGhSc3BUaW1lcigpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFjdGl2YXRlIGEgcGVyIFNUQSB0aW1lcgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIGlkICAgICAgLSBpZAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgbGltQWN0aXZhdGVBdXRoUnNwVGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpbVByZUF1dGhOb2RlICpwQXV0aE5vZGUpCit7CisgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsIDAsIGVMSU1fQVVUSF9SRVNQX1RJTUVSKSk7CisgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwQXV0aE5vZGUtPnRpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLy8vIENvdWxkIG5vdCBhY3RpdmF0ZSBhdXRoIHJzcCB0aW1lci4KKyAgICAgICAgLy8gTG9nIGVycm9yCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoImNvdWxkIG5vdCBhY3RpdmF0ZSBhdXRoIHJzcCB0aW1lclxuIikpOworICAgIH0KK30KKworCisvKioKKyAqIGxpbVNlbmREaXNhc3NvY0ZyYW1lVGhyZXNob2xkSGFuZGxlcigpCisgKgorICpGVU5DVElPTjoKKyAqICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlbG9hZHMgdGhlIGNyZWRpdCB0byB0aGUgc2VuZCBkaXNhc3NvY2lhdGUgZnJhbWUgYnVja2V0CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltU2VuZERpc2Fzc29jRnJhbWVUaHJlc2hvbGRIYW5kbGVyKHZvaWQgKnBNYWNHbG9iYWwsIHRBTklfVTMyIHBhcmFtKQoreworICAgIHRTaXJNc2dRICAgIG1zZzsKKyAgICB0QU5JX1UzMiAgICAgICAgIHN0YXR1c0NvZGU7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbClwTWFjR2xvYmFsOworCisgICAgbXNnLnR5cGUgPSBTSVJfTElNX0hBU0hfTUlTU19USFJFU19USU1FT1VUOworICAgIG1zZy5ib2R5dmFsID0gMDsKKyAgICBtc2cuYm9keXB0ciA9IE5VTEw7CisKKyAgICBpZiAoKHN0YXR1c0NvZGUgPSBsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgRkwoInBvc3RpbmcgdG8gTElNIGZhaWxlZCwgcmVhc29uPSVkXG4iKSwgc3RhdHVzQ29kZSk7CisKK30KKworLyoqCisgKiBsaW1Bc3NvY0NuZldhaXRUbWVySGFuZGxlcigpCisgKgorICpGVU5DVElPTjoKKyAqICAgICAgICBUaGlzIGZ1bmN0aW9uIHBvc3QgYSBtZXNzYWdlIHRvIHNlbmQgYSBkaXNhc3NvY2lhdGUgZnJhbWUgb3V0LgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbUNuZldhaXRUbWVySGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB0QU5JX1UzMiBwYXJhbSkKK3sKKyAgICB0U2lyTXNnUSAgICBtc2c7CisgICAgdEFOSV9VMzIgICAgICAgICBzdGF0dXNDb2RlOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpcE1hY0dsb2JhbDsKKworICAgIG1zZy50eXBlID0gU0lSX0xJTV9DTkZfV0FJVF9USU1FT1VUOworICAgIG1zZy5ib2R5dmFsID0gKHRBTklfVTMyKXBhcmFtOworICAgIG1zZy5ib2R5cHRyID0gTlVMTDsKKworICAgIGlmICgoc3RhdHVzQ29kZSA9IGxpbVBvc3RNc2dBcGkocE1hYywgJm1zZykpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICBGTCgicG9zdGluZyB0byBMSU0gZmFpbGVkLCByZWFzb249JWRcbiIpLCBzdGF0dXNDb2RlKTsKKworfQorCisvKioKKyAqIGxpbUtlZXBhbGl2ZVRtZXJIYW5kbGVyKCkKKyAqCisgKkZVTkNUSU9OOgorICogICAgICAgIFRoaXMgZnVuY3Rpb24gcG9zdCBhIG1lc3NhZ2UgdG8gc2VuZCBhIE5VTEwgZGF0YSBmcmFtZS4KKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0KKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1LZWVwYWxpdmVUbWVySGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB0QU5JX1UzMiBwYXJhbSkKK3sKKyAgICB0U2lyTXNnUSAgICBtc2c7CisgICAgdEFOSV9VMzIgICAgICAgICBzdGF0dXNDb2RlOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpcE1hY0dsb2JhbDsKKworICAgIG1zZy50eXBlID0gU0lSX0xJTV9LRUVQQUxJVkVfVElNRU9VVDsKKyAgICBtc2cuYm9keXZhbCA9ICh0QU5JX1UzMilwYXJhbTsKKyAgICBtc2cuYm9keXB0ciA9IE5VTEw7CisKKyAgICBpZiAoKHN0YXR1c0NvZGUgPSBsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgRkwoInBvc3RpbmcgdG8gTElNIGZhaWxlZCwgcmVhc29uPSVkXG4iKSwgc3RhdHVzQ29kZSk7CisKK30KKwordm9pZAorbGltQ2hhbm5lbFN3aXRjaFRpbWVySGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB0QU5JX1UzMiBwYXJhbSkKK3sKKyAgICB0U2lyTXNnUSAgICBtc2c7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbClwTWFjR2xvYmFsOworCisgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICBGTCgiQ2hhbm5lbFN3aXRjaCBUaW1lciBleHBpcmVkLiAgUG9zdGluZyBtc2cgdG8gTElNIFxuIikpOykKKworICAgIG1zZy50eXBlID0gU0lSX0xJTV9DSEFOTkVMX1NXSVRDSF9USU1FT1VUOworICAgIG1zZy5ib2R5dmFsID0gKHRBTklfVTMyKXBhcmFtOworICAgIG1zZy5ib2R5cHRyID0gTlVMTDsKKworICAgIGxpbVBvc3RNc2dBcGkocE1hYywgJm1zZyk7Cit9CisKK3ZvaWQKK2xpbVF1aWV0VGltZXJIYW5kbGVyKHZvaWQgKnBNYWNHbG9iYWwsIHRBTklfVTMyIHBhcmFtKQoreworICAgIHRTaXJNc2dRICAgIG1zZzsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKXBNYWNHbG9iYWw7CisKKyAgICBtc2cudHlwZSA9IFNJUl9MSU1fUVVJRVRfVElNRU9VVDsKKyAgICBtc2cuYm9keXZhbCA9ICh0QU5JX1UzMilwYXJhbTsKKyAgICBtc2cuYm9keXB0ciA9IE5VTEw7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgIEZMKCJQb3N0IFNJUl9MSU1fUVVJRVRfVElNRU9VVCBtc2cuIFxuIikpOykKKyAgICBsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpOworfQorCit2b2lkCitsaW1RdWlldEJzc1RpbWVySGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB0QU5JX1UzMiBwYXJhbSkKK3sKKyAgICB0U2lyTXNnUSAgICBtc2c7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbClwTWFjR2xvYmFsOworCisgICAgbXNnLnR5cGUgPSBTSVJfTElNX1FVSUVUX0JTU19USU1FT1VUOworICAgIG1zZy5ib2R5dmFsID0gKHRBTklfVTMyKXBhcmFtOworICAgIG1zZy5ib2R5cHRyID0gTlVMTDsKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgIEZMKCJQb3N0IFNJUl9MSU1fUVVJRVRfQlNTX1RJTUVPVVQgbXNnLiBcbiIpKTspCisgICAgbGltUG9zdE1zZ0FwaShwTWFjLCAmbXNnKTsKK30KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjaWYgMAordm9pZAorbGltV1BTT3ZlcmxhcFRpbWVySGFuZGxlcih2b2lkICpwTWFjR2xvYmFsLCB0QU5JX1UzMiBwYXJhbSkKK3sKKyAgICB0U2lyTXNnUSAgICBtc2c7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbClwTWFjR2xvYmFsOworCisgICAgbXNnLnR5cGUgPSBTSVJfTElNX1dQU19PVkVSTEFQX1RJTUVPVVQ7CisgICAgbXNnLmJvZHl2YWwgPSAodEFOSV9VMzIpcGFyYW07CisgICAgbXNnLmJvZHlwdHIgPSBOVUxMOworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgRkwoIlBvc3QgU0lSX0xJTV9XUFNfT1ZFUkxBUF9USU1FT1VUIG1zZy4gXG4iKSk7KQorICAgIGxpbVBvc3RNc2dBcGkocE1hYywgJm1zZyk7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1UaW1lclV0aWxzLmggYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVRpbWVyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzE5OTc3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1UaW1lclV0aWxzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgbGltVGltZXJVdGlscy5oIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGRlZmluaXRpb25zCisgKiBMSU0gdXNlcyBmb3IgdGltZXIgaGFuZGxpbmcuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMy8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgX19MSU1fVElNRVJfVVRJTFNfSAorI2RlZmluZSBfX0xJTV9USU1FUl9VVElMU19ICisKKyNpbmNsdWRlICJsaW1UeXBlcy5oIgorCisKKy8vIFRpbWVyIHJlbGF0ZWQgZnVuY3Rpb25zCitlbnVtCit7CisgICAgZUxJTV9NSU5fQ0hBTk5FTF9USU1FUiwKKyAgICBlTElNX01BWF9DSEFOTkVMX1RJTUVSLAorICAgIGVMSU1fSk9JTl9GQUlMX1RJTUVSLAorICAgIGVMSU1fQVVUSF9GQUlMX1RJTUVSLAorICAgIGVMSU1fQVVUSF9SRVNQX1RJTUVSLAorICAgIGVMSU1fQVNTT0NfRkFJTF9USU1FUiwKKyAgICBlTElNX1JFQVNTT0NfRkFJTF9USU1FUiwKKyAgICBlTElNX1BSRV9BVVRIX0NMRUFOVVBfVElNRVIsCisgICAgZUxJTV9IRUFSVF9CRUFUX1RJTUVSLCAgICAKKyAgICBlTElNX0JBQ0tHUk9VTkRfU0NBTl9USU1FUiwKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgZUxJTV9MRUFSTl9JTlRFUlZBTF9USU1FUiwKKyNlbmRpZgorICAgIGVMSU1fS0VFUEFMSVZFX1RJTUVSLAorICAgIGVMSU1fQ05GX1dBSVRfVElNRVIsCisgICAgZUxJTV9BVVRIX1JTUF9USU1FUiwKKyAgICBlTElNX1VQREFURV9PTEJDX0NBQ0hFX1RJTUVSLAorICAgIGVMSU1fUFJPQkVfQUZURVJfSEJfVElNRVIsCisgICAgZUxJTV9BRERUU19SU1BfVElNRVIsCisgICAgZUxJTV9DSEFOTkVMX1NXSVRDSF9USU1FUiwKKyAgICBlTElNX0xFQVJOX0RVUkFUSU9OX1RJTUVSLAorICAgIGVMSU1fUVVJRVRfVElNRVIsCisgICAgZUxJTV9RVUlFVF9CU1NfVElNRVIsCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGVMSU1fV1BTX09WRVJMQVBfVElNRVIsIAorI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBlTElNX0ZUX1BSRUFVVEhfUlNQX1RJTUVSLAorI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIGVMSU1fUkVNQUlOX0NITl9USU1FUiwKKyNlbmRpZgorICAgIGVMSU1fUEVSSU9ESUNfUFJPQkVfUkVRX1RJTUVSLAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICBlTElNX1RTTV9USU1FUiwKKyNlbmRpZgorfTsKKworLy8gVGltZXIgSGFuZGxlciBmdW5jdGlvbnMKK3ZvaWQgbGltQ3JlYXRlVGltZXJzKHRwQW5pU2lyR2xvYmFsKTsKK3ZvaWQgbGltVGltZXJIYW5kbGVyKHZvaWQgKiwgdEFOSV9VMzIpOwordm9pZCBsaW1BdXRoUmVzcG9uc2VUaW1lckhhbmRsZXIodm9pZCAqLCB0QU5JX1UzMik7Cit2b2lkIGxpbUFzc29jRmFpbHVyZVRpbWVySGFuZGxlcih2b2lkICosIHRBTklfVTMyKTsKK3ZvaWQgbGltUmVhc3NvY0ZhaWx1cmVUaW1lckhhbmRsZXIodm9pZCAqLCB0QU5JX1UzMik7CisKK3ZvaWQgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMik7Cit2b2lkIGxpbUhlYXJ0QmVhdERlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcih0cEFuaVNpckdsb2JhbCwgdHBQRVNlc3Npb24pOwordm9pZCBsaW1SZWFjdGl2YXRlSGVhcnRCZWF0VGltZXIodHBBbmlTaXJHbG9iYWwsIHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltRHVtbXlQa3RFeHBUaW1lckhhbmRsZXIodm9pZCAqLCB0QU5JX1UzMik7Cit2b2lkIGxpbVNlbmREaXNhc3NvY0ZyYW1lVGhyZXNob2xkSGFuZGxlcih2b2lkICosIHRBTklfVTMyKTsKK3ZvaWQgbGltQ25mV2FpdFRtZXJIYW5kbGVyKHZvaWQgKiwgdEFOSV9VMzIpOwordm9pZCBsaW1LZWVwYWxpdmVUbWVySGFuZGxlcih2b2lkICosIHRBTklfVTMyKTsKK3ZvaWQgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVBlclN0YUlkVGltZXIodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyLCB0QU5JX1UxNik7Cit2b2lkIGxpbUFjdGl2YXRlQ25mVGltZXIodHBBbmlTaXJHbG9iYWwsIHRBTklfVTE2LCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbUFjdGl2YXRlQXV0aFJzcFRpbWVyKHRwQW5pU2lyR2xvYmFsLCB0TGltUHJlQXV0aE5vZGUgKik7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordm9pZCBsaW1VcGRhdGVPbGJjQ2FjaGVUaW1lckhhbmRsZXIodm9pZCAqLCB0QU5JX1UzMik7CisjZW5kaWYKK3ZvaWQgbGltQWRkdHNSZXNwb25zZVRpbWVySGFuZGxlcih2b2lkICosIHRBTklfVTMyKTsKK3ZvaWQgbGltQ2hhbm5lbFN3aXRjaFRpbWVySGFuZGxlcih2b2lkICosIHRBTklfVTMyKTsKK3ZvaWQgbGltUXVpZXRUaW1lckhhbmRsZXIodm9pZCAqLCB0QU5JX1UzMik7Cit2b2lkIGxpbVF1aWV0QnNzVGltZXJIYW5kbGVyKHZvaWQgKiwgdEFOSV9VMzIpOwordm9pZCBsaW1DQlNjYW5JbnRlcnZhbFRpbWVySGFuZGxlcih2b2lkICosIHRBTklfVTMyKTsKK3ZvaWQgbGltQ0JTY2FuRHVyYXRpb25UaW1lckhhbmRsZXIodm9pZCAqLCB0QU5JX1UzMik7CisvKioKKyAqIGxpbUFjdGl2YXRlSGVhckJlYXRUaW1lcigpCisgKgorICoKKyAqIEBicmllZjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWN0aXZhdGUgaGVhcnRiZWF0IHRpbWVyCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKiBAbm90ZSAgIHN0YUlkIGZvciBlTElNX0FVVEhfUlNQX1RJTUVSIGlzIGF1dGggTm9kZSBJbmRleC4KKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKgorICogQHJldHVybiBUWF9TVUNDRVNTIC0gdGltZXIgaXMgYWN0aXZhdGVkCisgKiAgICAgICAgIGVycm9ycyAtIGZhaWwgdG8gc3RhcnQgdGhlIHRpbWVyCisgKi8KK3ZfVUlOVF90IGxpbUFjdGl2YXRlSGVhckJlYXRUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNpZiAwCit2b2lkIGxpbVdQU092ZXJsYXBUaW1lckhhbmRsZXIodm9pZCAqcE1hY0dsb2JhbCwgdEFOSV9VMzIgcGFyYW0pOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZiAvKiBfX0xJTV9USU1FUl9VVElMU19IICovCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVRyYWNlLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVRyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxM2EwMgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltVHJhY2UuYwpAQCAtMCwwICsxLDQxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBcZmlsZSAgbGltVHJhY2UuYworCisgIFxicmllZiBpbXBsZW1lbnRhdGlvbiBmb3IgdHJhY2UgcmVsYXRlZCBBUElzCisKKyAgXGF1dGhvciBTdW5pdCBCaGF0aWEKKworICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIgLy9mb3IgdHBBbmlTaXJHbG9iYWwKKyNlbmRpZgorCisjaW5jbHVkZSAibGltVHJhY2UuaCIKKyNpbmNsdWRlICJsaW1UaW1lclV0aWxzLmgiCisKKworI2lmZGVmIExJTV9UUkFDRV9SRUNPUkQKK3RBTklfVTMyIGdNZ210RnJhbWVTdGF0c1sxNF07CisKKworCitzdGF0aWMgdEFOSV9VOCogX19saW1UcmFjZUdldFRpbWVyU3RyaW5nKCB0QU5JX1UxNiB0aW1lcklkICkKK3sKKyAgICBzd2l0Y2goIHRpbWVySWQgKQorICAgIHsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fTUlOX0NIQU5ORUxfVElNRVIpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9NQVhfQ0hBTk5FTF9USU1FUik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX0pPSU5fRkFJTF9USU1FUik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX0FVVEhfRkFJTF9USU1FUik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX0FVVEhfUkVTUF9USU1FUik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX0FTU09DX0ZBSUxfVElNRVIpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9SRUFTU09DX0ZBSUxfVElNRVIpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9QUkVfQVVUSF9DTEVBTlVQX1RJTUVSKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fSEVBUlRfQkVBVF9USU1FUik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX0JBQ0tHUk9VTkRfU0NBTl9USU1FUik7CisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9MRUFSTl9JTlRFUlZBTF9USU1FUik7CisjZW5kaWYKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fS0VFUEFMSVZFX1RJTUVSKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fQ05GX1dBSVRfVElNRVIpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9BVVRIX1JTUF9USU1FUik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX1VQREFURV9PTEJDX0NBQ0hFX1RJTUVSKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fUFJPQkVfQUZURVJfSEJfVElNRVIpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9BRERUU19SU1BfVElNRVIpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9DSEFOTkVMX1NXSVRDSF9USU1FUik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX0xFQVJOX0RVUkFUSU9OX1RJTUVSKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fUVVJRVRfVElNRVIpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9RVUlFVF9CU1NfVElNRVIpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKCAiVU5LTk9XTiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCitzdGF0aWMgdEFOSV9VOCogX19saW1UcmFjZUdldE1nbXREcm9wUmVhc29uU3RyaW5nKCB0QU5JX1UxNiBkcm9wUmVhc29uICkKK3sKKworICAgIHN3aXRjaCggZHJvcFJlYXNvbiApCisgICAgeworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZU1HTVRfRFJPUF9JTkZSQV9CQ05fSU5fSUJTUyk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlTUdNVF9EUk9QX0lOVkFMSURfU0laRSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlTUdNVF9EUk9QX05PTl9TQ0FOX01PREVfRlJBTUUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZU1HTVRfRFJPUF9OT1RfTEFTVF9JQlNTX0JDTik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlTUdNVF9EUk9QX05PX0RST1ApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZU1HTVRfRFJPUF9TQ0FOX01PREVfRlJBTUUpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oICJVTktOT1dOIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKwordm9pZCBsaW1UcmFjZUluaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBtYWNUcmFjZVJlZ2lzdGVyKHBNYWMsICBWT1NfTU9EVUxFX0lEX1BFLCBsaW1UcmFjZUR1bXApOworfQorCisKKworCit2b2lkIGxpbVRyYWNlRHVtcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFRyYWNlUmVjb3JkIHBSZWNvcmQsIHRBTklfVTE2IHJlY0luZGV4KQoreworCisgICAgc3RhdGljIGNoYXIgKmZyYW1lU3VidHlwZVN0clsxNF0gPQorICAgIHsKKyAgICAgICAgIkFzc29jaWF0aW9uIHJlcXVlc3QiLAorICAgICAgICAiQXNzb2NpYXRpb24gcmVzcG9uc2UiLAorICAgICAgICAiUmVhc3NvY2lhdGlvbiByZXF1ZXN0IiwKKyAgICAgICAgIlJlYXNzb2NpYXRpb24gcmVzcG9uc2UiLAorICAgICAgICAiUHJvYmUgcmVxdWVzdCIsCisgICAgICAgICJQcm9iZSByZXNwb25zZSIsCisgICAgICAgIE5VTEwsCisgICAgICAgIE5VTEwsCisgICAgICAgICJCZWFjb24iLAorICAgICAgICAiQVRJTSIsCisgICAgICAgICJEaXNhc3NvY2F0aW9uIiwKKyAgICAgICAgIkF1dGhlbnRpY2F0aW9uIiwKKyAgICAgICAgIkRlYXV0aGVudGljYXRpb24iLAorICAgICAgICAiQWN0aW9uIgorICAgIH07CisKKyAgICBzd2l0Y2ggKHBSZWNvcmQtPmNvZGUpIHsKKyAgICAgICAgY2FzZSBUUkFDRV9DT0RFX01MTV9TVEFURToKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCAiJTA0ZCAgICAlMDEydSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSBcbiIsIHJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNTE0gU3RhdGU6IiwgbGltVHJhY2VHZXRNbG1TdGF0ZVN0cmluZygodEFOSV9VMTYpcFJlY29yZC0+ZGF0YSksIHBSZWNvcmQtPmRhdGEgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRSQUNFX0NPREVfU01FX1NUQVRFOgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICIlMDRkICAgICUwMTJ1ICBTJWQgICAgJS0xNHMgICUtMzBzKDB4JXgpIFxuIiwgcmVjSW5kZXgsIHBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTTUUgU3RhdGU6IiwgbGltVHJhY2VHZXRTbWVTdGF0ZVN0cmluZygodEFOSV9VMTYpcFJlY29yZC0+ZGF0YSksIHBSZWNvcmQtPmRhdGEgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRSQUNFX0NPREVfVFhfTUdNVDoKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCAiJTA0ZCAgICAlMDEydSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSBcbiIsIHJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFggTWdtdDoiLCBmcmFtZVN1YnR5cGVTdHJbcFJlY29yZC0+ZGF0YV0sIHBSZWNvcmQtPmRhdGEgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVFJBQ0VfQ09ERV9SWF9NR01UOgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICIlMDRkICAgICUwMTJ1ICBTJWQgICAgJS0xNHMgICUtMzBzKCVkKSAgICBTTjogJWQgXG4iLCByZWNJbmRleCwgcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJYIE1nbXQ6IiwgZnJhbWVTdWJ0eXBlU3RyW0xJTV9UUkFDRV9HRVRfU1VCVFlQRShwUmVjb3JkLT5kYXRhKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9UUkFDRV9HRVRfU1VCVFlQRShwUmVjb3JkLT5kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX1RSQUNFX0dFVF9TU04ocFJlY29yZC0+ZGF0YSkgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRSQUNFX0NPREVfUlhfTUdNVF9EUk9QOgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICIlMDRkICAgICUwMTJ1ICBTJWQgICAgJS0xNHMgICUtMzBzKCVkKSAgXG4iLCByZWNJbmRleCwgcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRyb3AgUlggTWdtdDoiLCBfX2xpbVRyYWNlR2V0TWdtdERyb3BSZWFzb25TdHJpbmcoKHRBTklfVTE2KXBSZWNvcmQtPmRhdGEpLCBwUmVjb3JkLT5kYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBUUkFDRV9DT0RFX1JYX01HTVRfVFNGOgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICIlMDRkICAgICUwMTJ1ICBTJWQgICAgJS0xNHMgICUtMzBzMHgleCglZCkgXG4iLCByZWNJbmRleCwgcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJYIE1nbXQgVFNGOiIsICIgIiwgcFJlY29yZC0+ZGF0YSwgcFJlY29yZC0+ZGF0YSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUUkFDRV9DT0RFX1RYX0NPTVBMRVRFOgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICIlMDRkICAgICUwMTJ1ICBTJWQgICAgJS0xNHMgIFxuIiwgcmVjSW5kZXgsIHBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWCBDb21wbGV0ZSIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVFJBQ0VfQ09ERV9UWF9TTUVfTVNHOgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICIlMDRkICAgICUwMTJ1ICBTJWQgICAgJS0xNHMgICUtMzBzKDB4JXgpIFxuIiwgcmVjSW5kZXgsIHBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWCBTTUUgTXNnOiIsIG1hY1RyYWNlR2V0U21lTXNnU3RyaW5nKCh0QU5JX1UxNilwUmVjb3JkLT5kYXRhKSwgcFJlY29yZC0+ZGF0YSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFJBQ0VfQ09ERV9SWF9TTUVfTVNHOgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICIlMDRkICAgICUwMTJ1ICBTJWQgICAgJS0xNHMgICUtMzBzKDB4JXgpIFxuIiwgcmVjSW5kZXgsIHBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9UUkFDRV9HRVRfREVGUkRfT1JfRFJPUFBFRChwUmVjb3JkLT5kYXRhKSA/ICJEZWYvRHJwIExJTSBNc2c6IjogIlJYIFNtZSBNc2c6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjVHJhY2VHZXRTbWVNc2dTdHJpbmcoKHRBTklfVTE2KXBSZWNvcmQtPmRhdGEpLCBwUmVjb3JkLT5kYXRhICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRSQUNFX0NPREVfVFhfSEFMX01TRzoKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCAiJTA0ZCAgICAlMDEydSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSBcbiIsIHJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFggSEFMIE1zZzoiLCBtYWNUcmFjZUdldEhhbE1zZ1N0cmluZygodEFOSV9VMTYpcFJlY29yZC0+ZGF0YSksIHBSZWNvcmQtPmRhdGEgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVFJBQ0VfQ09ERV9SWF9IQUxfTVNHOgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICIlMDRkICAgICUwMTJ1ICBTJWQgICAgJS0xNHMgICUtMzBzKDB4JXgpIFxuIiwgcmVjSW5kZXgsIHBSZWNvcmQtPnRpbWUsIHBSZWNvcmQtPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTV9UUkFDRV9HRVRfREVGUkRfT1JfRFJPUFBFRChwUmVjb3JkLT5kYXRhKSA/ICJEZWYvRHJwIExJTSBNc2c6IjogIlJYIEhBTCBNc2c6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjVHJhY2VHZXRIYWxNc2dTdHJpbmcoKHRBTklfVTE2KXBSZWNvcmQtPmRhdGEpLCBwUmVjb3JkLT5kYXRhICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRSQUNFX0NPREVfVFhfTElNX01TRzoKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCAiJTA0ZCAgICAlMDEydSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSBcbiIsIHJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFggTElNIE1zZzoiLCBtYWNUcmFjZUdldExpbU1zZ1N0cmluZygodEFOSV9VMTYpcFJlY29yZC0+ZGF0YSksIHBSZWNvcmQtPmRhdGEgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRSQUNFX0NPREVfUlhfTElNX01TRzoKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCAiJTA0ZCAgICAlMDEydSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSBcbiIsIHJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1fVFJBQ0VfR0VUX0RFRlJEX09SX0RST1BQRUQocFJlY29yZC0+ZGF0YSkgPyAiRGVmL0RycCBMSU0gTXNnOiI6ICJSWCBMSU0gTXNnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjVHJhY2VHZXRMaW1Nc2dTdHJpbmcoKHRBTklfVTE2KXBSZWNvcmQtPmRhdGEpLCBwUmVjb3JkLT5kYXRhICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUUkFDRV9DT0RFX1RYX0NGR19NU0c6CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgIiUwNGQgICAgJTAxMnUgIFMlZCAgICAlLTE0cyAgJS0zMHMoMHgleCkgXG4iLCByZWNJbmRleCwgcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRYIENGRyBNc2c6IiwgbWFjVHJhY2VHZXRDZmdNc2dTdHJpbmcoKHRBTklfVTE2KXBSZWNvcmQtPmRhdGEpLCBwUmVjb3JkLT5kYXRhICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUUkFDRV9DT0RFX1JYX0NGR19NU0c6CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgIiUwNGQgICAgJTAxMnUgIFMlZCAgICAlLTE0cyAgJS0zMHMoMHgleCkgXG4iLCByZWNJbmRleCwgcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNX1RSQUNFX0dFVF9ERUZSRF9PUl9EUk9QUEVEKHBSZWNvcmQtPmRhdGEpID8gIkRlZi9EcnAgTElNIE1zZzoiOiAiUlggQ0ZHIE1zZzoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNUcmFjZUdldENmZ01zZ1N0cmluZygodEFOSV9VMTYpTUFDX1RSQUNFX0dFVF9NU0dfSUQocFJlY29yZC0+ZGF0YSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjb3JkLT5kYXRhICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEU6CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgIiUwNGQgICAgJTAxMnUgIFMlZCAgICAlLTE0cyAgJS0zMHMoMHgleCkgXG4iLCByZWNJbmRleCwgcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVyIEFjdHZ0ZCIsIF9fbGltVHJhY2VHZXRUaW1lclN0cmluZygodEFOSV9VMTYpcFJlY29yZC0+ZGF0YSksIHBSZWNvcmQtPmRhdGEgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRSQUNFX0NPREVfVElNRVJfREVBQ1RJVkFURToKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCAiJTA0ZCAgICAlMDEydSAgUyVkICAgICUtMTRzICAlLTMwcygweCV4KSBcbiIsIHJlY0luZGV4LCBwUmVjb3JkLT50aW1lLCBwUmVjb3JkLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGltZXIgRGVBY3R2dGQiLCBfX2xpbVRyYWNlR2V0VGltZXJTdHJpbmcoKHRBTklfVTE2KXBSZWNvcmQtPmRhdGEpLCBwUmVjb3JkLT5kYXRhICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCAiJTA0ZCAgICAlMDEydSAgUyVkICAgICUtMTRzKCVkKSAoMHgleCkgXG4iLCByZWNJbmRleCwgcFJlY29yZC0+dGltZSwgcFJlY29yZC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIENvZGUiLCBwUmVjb3JkLT5jb2RlLCBwUmVjb3JkLT5kYXRhICk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKwordm9pZCBtYWNUcmFjZU1zZ1R4KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc2Vzc2lvbiwgdEFOSV9VMzIgZGF0YSkKK3sKKworICAgIHRBTklfVTE2IG1zZ0lkID0gKHRBTklfVTE2KU1BQ19UUkFDRV9HRVRfTVNHX0lEKGRhdGEpOworICAgIHRBTklfVTggbW9kdWxlSWQgPSAodEFOSV9VOClNQUNfVFJBQ0VfR0VUX01PRFVMRV9JRChkYXRhKTsKKworICAgIHN3aXRjaChtb2R1bGVJZCkKKyAgICB7CisgICAgICAgIGNhc2UgU0lSX0xJTV9NT0RVTEVfSUQ6CisgICAgICAgICAgICBpZihtc2dJZCA+PSBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4pCisgICAgICAgICAgICAgICAgbWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9UWF9MSU1fTVNHLCBzZXNzaW9uLCBkYXRhKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RYX1NNRV9NU0csIHNlc3Npb24sIGRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX1dEQV9NT0RVTEVfSUQ6CisgICAgICAgICAgICBtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RYX0hBTF9NU0csIHNlc3Npb24sIGRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX0NGR19NT0RVTEVfSUQ6CisgICAgICAgICAgICBtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RYX0NGR19NU0csIHNlc3Npb24sIGRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3ZvaWQgbWFjVHJhY2VNc2dUeE5ldyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IG1vZHVsZSwgdEFOSV9VOCBzZXNzaW9uLCB0QU5JX1UzMiBkYXRhKQoreworICAgIHRBTklfVTE2IG1zZ0lkID0gKHRBTklfVTE2KU1BQ19UUkFDRV9HRVRfTVNHX0lEKGRhdGEpOworICAgIHRBTklfVTggbW9kdWxlSWQgPSAodEFOSV9VOClNQUNfVFJBQ0VfR0VUX01PRFVMRV9JRChkYXRhKTsKKworICAgIHN3aXRjaChtb2R1bGVJZCkKKyAgICB7CisgICAgICAgIGNhc2UgU0lSX0xJTV9NT0RVTEVfSUQ6CisgICAgICAgICAgICBpZihtc2dJZCA+PSBTSVJfTElNX0lUQ19NU0dfVFlQRVNfQkVHSU4pCisgICAgICAgICAgICAgICAgbWFjVHJhY2VOZXcocE1hYywgbW9kdWxlLCBUUkFDRV9DT0RFX1RYX0xJTV9NU0csIHNlc3Npb24sIGRhdGEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1hY1RyYWNlTmV3KHBNYWMsIG1vZHVsZSwgVFJBQ0VfQ09ERV9UWF9TTUVfTVNHLCBzZXNzaW9uLCBkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJUl9XREFfTU9EVUxFX0lEOgorICAgICAgICAgICAgbWFjVHJhY2VOZXcocE1hYywgbW9kdWxlLCBUUkFDRV9DT0RFX1RYX0hBTF9NU0csIHNlc3Npb24sIGRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX0NGR19NT0RVTEVfSUQ6CisgICAgICAgICAgICBtYWNUcmFjZU5ldyhwTWFjLCBtb2R1bGUsIFRSQUNFX0NPREVfVFhfQ0ZHX01TRywgc2Vzc2lvbiwgZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorfQorCisvKgorKiBiaXQzMTogUnggbWVzc2FnZSBkZWZmZXJyZWQgb3Igbm90CisqIGJpdCAwLTE1OiBtZXNzYWdlIElEOgorKi8KK3ZvaWQgbWFjVHJhY2VNc2dSeCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IHNlc3Npb24sIHRBTklfVTMyIGRhdGEpCit7CisgICAgdEFOSV9VMTYgbXNnSWQgPSAodEFOSV9VMTYpTUFDX1RSQUNFX0dFVF9NU0dfSUQoZGF0YSk7CisgICAgdEFOSV9VOCBtb2R1bGVJZCA9ICh0QU5JX1U4KU1BQ19UUkFDRV9HRVRfTU9EVUxFX0lEKGRhdGEpOworCisKKyAgICBzd2l0Y2gobW9kdWxlSWQpCisgICAgeworICAgICAgICBjYXNlIFNJUl9MSU1fTU9EVUxFX0lEOgorICAgICAgICAgICAgaWYobXNnSWQgPj0gU0lSX0xJTV9JVENfTVNHX1RZUEVTX0JFR0lOKQorICAgICAgICAgICAgICAgIG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfUlhfTElNX01TRywgc2Vzc2lvbiwgZGF0YSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9SWF9TTUVfTVNHLCBzZXNzaW9uLCBkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJUl9XREFfTU9EVUxFX0lEOgorICAgICAgICAgICAgbWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9SWF9IQUxfTVNHLCBzZXNzaW9uLCBkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJUl9DRkdfTU9EVUxFX0lEOgorICAgICAgICAgICAgbWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9SWF9DRkdfTVNHLCBzZXNzaW9uLCBkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cit9CisKKworCisvKgorKiBiaXQzMTogUnggbWVzc2FnZSBkZWZmZXJyZWQgb3Igbm90CisqIGJpdCAwLTE1OiBtZXNzYWdlIElEOgorKi8KK3ZvaWQgbWFjVHJhY2VNc2dSeE5ldyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IG1vZHVsZSwgdEFOSV9VOCBzZXNzaW9uLCB0QU5JX1UzMiBkYXRhKQoreworICAgIHRBTklfVTE2IG1zZ0lkID0gKHRBTklfVTE2KU1BQ19UUkFDRV9HRVRfTVNHX0lEKGRhdGEpOworICAgIHRBTklfVTggbW9kdWxlSWQgPSAodEFOSV9VOClNQUNfVFJBQ0VfR0VUX01PRFVMRV9JRChkYXRhKTsKKworCisgICAgc3dpdGNoKG1vZHVsZUlkKQorICAgIHsKKyAgICAgICAgY2FzZSBTSVJfTElNX01PRFVMRV9JRDoKKyAgICAgICAgICAgIGlmKG1zZ0lkID49IFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTikKKyAgICAgICAgICAgICAgICBtYWNUcmFjZU5ldyhwTWFjLCBtb2R1bGUsIFRSQUNFX0NPREVfUlhfTElNX01TRywgc2Vzc2lvbiwgZGF0YSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWFjVHJhY2VOZXcocE1hYywgbW9kdWxlLCBUUkFDRV9DT0RFX1JYX1NNRV9NU0csIHNlc3Npb24sIGRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX1dEQV9NT0RVTEVfSUQ6CisgICAgICAgICAgICBtYWNUcmFjZU5ldyhwTWFjLCBtb2R1bGUsIFRSQUNFX0NPREVfUlhfSEFMX01TRywgc2Vzc2lvbiwgZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfQ0ZHX01PRFVMRV9JRDoKKyAgICAgICAgICAgIG1hY1RyYWNlTmV3KHBNYWMsIG1vZHVsZSwgVFJBQ0VfQ09ERV9SWF9DRkdfTVNHLCBzZXNzaW9uLCBkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cit9CisKKworCit0QU5JX1U4KiBsaW1UcmFjZUdldE1sbVN0YXRlU3RyaW5nKCB0QU5JX1UzMiBtbG1TdGF0ZSApCit7CisgICAgc3dpdGNoKCBtbG1TdGF0ZSApCisgICAgeworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX09GRkxJTkVfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX0lETEVfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX1dUX1BST0JFX1JFU1BfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX1BBU1NJVkVfU0NBTl9TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fV1RfSk9JTl9CRUFDT05fU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX0pPSU5FRF9TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fQlNTX1NUQVJURURfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUyX1NUQVRFKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlTElNX01MTV9XVF9BVVRIX0ZSQU1FM19TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTRfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX0FVVEhfUlNQX1RJTUVPVVRfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX0FVVEhFTlRJQ0FURURfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fV1RfUkVBU1NPQ19SU1BfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX0FTU09DSUFURURfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX1JFQVNTT0NJQVRFRF9TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fV1RfQVNTT0NfQ05GX1NUQVRFKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlTElNX01MTV9MRUFSTl9TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX1dUX0RFTF9CU1NfUlNQX1NUQVRFKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlTElNX01MTV9XVF9BRERfQlNTX1JTUF9BU1NPQ19TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUFJFQVNTT0NfU1RBVEUpOyAgICAgICAgCisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUkVBU1NPQ19TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fV1RfQUREX1NUQV9SU1BfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX1dUX0RFTF9TVEFfUlNQX1NUQVRFKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlTElNX01MTV9XVF9BU1NPQ19ERUxfU1RBX1JTUF9TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fV1RfU0VUX0JTU19LRVlfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX1dUX1NFVF9TVEFfS0VZX1NUQVRFKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlTElNX01MTV9XVF9TRVRfU1RBX0JDQVNUS0VZX1NUQVRFKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlTElNX01MTV9XVF9BRERCQV9SU1BfU1RBVEUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVMSU1fTUxNX1dUX1JFTU9WRV9CU1NfS0VZX1NUQVRFKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlTElNX01MTV9XVF9SRU1PVkVfU1RBX0tFWV9TVEFURSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyggZUxJTV9NTE1fV1RfU0VUX01JTU9QU19TVEFURSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oICJVTktOT1dOIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3RBTklfVTgqIGxpbVRyYWNlR2V0U21lU3RhdGVTdHJpbmcoIHRBTklfVTMyIHNtZVN0YXRlICkKK3sKKyAgICBzd2l0Y2goIHNtZVN0YXRlICkKKyAgICB7CisKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfT0ZGTElORV9TVEFURSk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX0lETEVfU1RBVEUpOworICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9TVVNQRU5EX1NUQVRFKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfV1RfU0NBTl9TVEFURSk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX0pPSU5fU1RBVEUpOworICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9BVVRIX1NUQVRFKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfV1RfQVNTT0NfU1RBVEUpOworICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfV1RfUkVBU1NPQ19MSU5LX0ZBSUxfU1RBVEUpOworICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEUpOworICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfUkVBU1NPQ0lBVEVEX1NUQVRFKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfTElOS19FU1RfU1RBVEUpOworICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9MSU5LX0VTVF9XVF9TQ0FOX1NUQVRFKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfV1RfUFJFX0FVVEhfU1RBVEUpOworICAgIENBU0VfUkVUVVJOX1NUUklORyhlTElNX1NNRV9XVF9ESVNBU1NPQ19TVEFURSk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX0RFQVVUSF9TVEFURSk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX1NUQVJUX0JTU19TVEFURSk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVMSU1fU01FX1dUX1NUT1BfQlNTX1NUQVRFKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfTk9STUFMX1NUQVRFKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfQ0hBTk5FTF9TQ0FOX1NUQVRFKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZUxJTV9TTUVfTk9STUFMX0NIQU5ORUxfU0NBTl9TVEFURSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKCAiVU5LTk9XTiIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVR5cGVzLmggYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViZmZlZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltVHlwZXMuaApAQCAtMCwwICsxLDEwODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBsaW1UeXBlcy5oIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyB1c2VkIGJ5IGFsbAorICogYWxsIExJTSBtb2R1bGVzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2lmbmRlZiBfX0xJTV9UWVBFU19ICisjZGVmaW5lIF9fTElNX1RZUEVTX0gKKworI2luY2x1ZGUgInduaUFwaS5oIgorI2luY2x1ZGUgInNpckFwaS5oIgorI2luY2x1ZGUgInNpckNvbW1vbi5oIgorI2luY2x1ZGUgInNpck1hY1Byb3REZWYuaCIKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbENvbW1vbkFwaS5oIgorI2VuZGlmIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9kcy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJsaW1BcGkuaCIKKyNpbmNsdWRlICJsaW1EZWJ1Zy5oIgorI2luY2x1ZGUgImxpbVNlbmRTbWVSc3BNZXNzYWdlcy5oIgorI2luY2x1ZGUgInN5c0dsb2JhbC5oIgorI2luY2x1ZGUgImRwaEdsb2JhbC5oIgorI2luY2x1ZGUgInBhcnNlckFwaS5oIgorCisjZGVmaW5lIExJTktfVEVTVF9ERUZFUiAxCisKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ05GX1RJTUVSX0RFQUNUICAgICAgICAweDY2MDAKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQ05GX1RJTUVSX0FDVCAgICAgICAgICAweDY2MDEKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVVUSF9SU1BfVElNRVJfREVBQ1QgICAweDY2MDIKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfQVVUSF9SU1BfVElNRVJfQUNUICAgICAweDY2MDMKKworLy8gTUxNIG1lc3NhZ2UgdHlwZXMKKyNkZWZpbmUgTElNX01MTV9NU0dfU1RBUlQgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTElNX01MTV9TQ0FOX1JFUSAgICAgICAgICAgIExJTV9NTE1fTVNHX1NUQVJUCisjZGVmaW5lIExJTV9NTE1fU0NBTl9DTkYgICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDEKKyNkZWZpbmUgTElNX01MTV9TVEFSVF9SRVEgICAgICAgICAgIExJTV9NTE1fTVNHX1NUQVJUICsgMgorI2RlZmluZSBMSU1fTUxNX1NUQVJUX0NORiAgICAgICAgICAgTElNX01MTV9NU0dfU1RBUlQgKyAzCisjZGVmaW5lIExJTV9NTE1fSk9JTl9SRVEgICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDQKKyNkZWZpbmUgTElNX01MTV9KT0lOX0NORiAgICAgICAgICAgIExJTV9NTE1fTVNHX1NUQVJUICsgNQorI2RlZmluZSBMSU1fTUxNX0FVVEhfUkVRICAgICAgICAgICAgTElNX01MTV9NU0dfU1RBUlQgKyA2CisjZGVmaW5lIExJTV9NTE1fQVVUSF9DTkYgICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDcKKyNkZWZpbmUgTElNX01MTV9BVVRIX0lORCAgICAgICAgICAgIExJTV9NTE1fTVNHX1NUQVJUICsgOAorI2RlZmluZSBMSU1fTUxNX0FTU09DX1JFUSAgICAgICAgICAgTElNX01MTV9NU0dfU1RBUlQgKyA5CisjZGVmaW5lIExJTV9NTE1fQVNTT0NfQ05GICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDEwCisjZGVmaW5lIExJTV9NTE1fQVNTT0NfSU5EICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDExCisjZGVmaW5lIExJTV9NTE1fRElTQVNTT0NfUkVRICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDEyCisjZGVmaW5lIExJTV9NTE1fRElTQVNTT0NfQ05GICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDEzCisjZGVmaW5lIExJTV9NTE1fRElTQVNTT0NfSU5EICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDE0CisjZGVmaW5lIExJTV9NTE1fUkVBU1NPQ19SRVEgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDE1CisjZGVmaW5lIExJTV9NTE1fUkVBU1NPQ19DTkYgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDE2CisjZGVmaW5lIExJTV9NTE1fUkVBU1NPQ19JTkQgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDE3CisjZGVmaW5lIExJTV9NTE1fREVBVVRIX1JFUSAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDE4CisjZGVmaW5lIExJTV9NTE1fREVBVVRIX0NORiAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDE5CisjZGVmaW5lIExJTV9NTE1fREVBVVRIX0lORCAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDIwCisjZGVmaW5lIExJTV9NTE1fVFNQRUNfUkVRICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDIxCisjZGVmaW5lIExJTV9NTE1fVFNQRUNfQ05GICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDIyCisjZGVmaW5lIExJTV9NTE1fVFNQRUNfSU5EICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDIzCisjZGVmaW5lIExJTV9NTE1fU0VUS0VZU19SRVEgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDI0CisjZGVmaW5lIExJTV9NTE1fU0VUS0VZU19DTkYgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDI1CisjZGVmaW5lIExJTV9NTE1fTElOS19URVNUX1NUT1BfUkVRICBMSU1fTUxNX01TR19TVEFSVCArIDMwCisjZGVmaW5lIExJTV9NTE1fUFVSR0VfU1RBX0lORCAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDMxCisjZGVmaW5lIExJTV9NTE1fQUREQkFfUkVRICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDMyCisjZGVmaW5lIExJTV9NTE1fQUREQkFfQ05GICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDMzCisjZGVmaW5lIExJTV9NTE1fQUREQkFfSU5EICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDM0CisjZGVmaW5lIExJTV9NTE1fQUREQkFfUlNQICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDM1CisjZGVmaW5lIExJTV9NTE1fREVMQkFfUkVRICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDM2CisjZGVmaW5lIExJTV9NTE1fREVMQkFfQ05GICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDM3CisjZGVmaW5lIExJTV9NTE1fREVMQkFfSU5EICAgICAgICAgICBMSU1fTUxNX01TR19TVEFSVCArIDM4CisjZGVmaW5lIExJTV9NTE1fUkVNT1ZFS0VZX1JFUSAgTElNX01MTV9NU0dfU1RBUlQgKyAzOQorI2RlZmluZSBMSU1fTUxNX1JFTU9WRUtFWV9DTkYgIExJTV9NTE1fTVNHX1NUQVJUICsgNDAKKworCisjZGVmaW5lIExJTV9IQVNIX0FERCAgICAgICAgICAgIDAKKyNkZWZpbmUgTElNX0hBU0hfVVBEQVRFICAgICAgICAgMQorCisjZGVmaW5lIExJTV9XRVBfSU5fRkMgICAgICAgICAgIDEKKyNkZWZpbmUgTElNX05PX1dFUF9JTl9GQyAgICAgICAgMAorCisjZGVmaW5lIExJTV9ERUNSWVBUX0lDVl9GQUlMICAgIDEKKworLy8vIERlZmluaXRpb25zIHRvIGRpc3RpbnF1aXNoIGJldHdlZW4gQXNzb2NpYXRpb24vUmVhc3NvY2lhdG9uCisjZGVmaW5lIExJTV9BU1NPQyAgICAwCisjZGVmaW5lIExJTV9SRUFTU09DICAxCisKKy8vLyBNaW5pbXVtIE1lbW9yeSBibG9ja3MgcmVxdWlyZSBmb3IgZGlmZmVyZW50IHNjZW5hcmlvCisjZGVmaW5lIExJTV9NSU5fTUVNX0FTU09DICAgICAgIDQKKworLy8vIFZlcmlmaWVzIHdoZXRoZXIgZ2l2ZW4gbWFjIGFkZHIgbWF0Y2hlcyB0aGUgQ1VSUkVOVCBCc3NpZAorI2RlZmluZSBJU19DVVJSRU5UX0JTU0lEKHBNYWMsIGFkZHIscHNlc3Npb25FbnRyeSkgIChwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCBhZGRyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBzZXNzaW9uRW50cnktPmJzc0lkKSkpCisvLy8gVmVyaWZpZXMgd2hldGhlciBnaXZlbiBhZGRyIG1hdGNoZXMgdGhlIFJFQVNTT0MgQnNzaWQKKyNkZWZpbmUgSVNfUkVBU1NPQ19CU1NJRChwTWFjLCBhZGRyLHBzZXNzaW9uRW50cnkpICAocGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgYWRkciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHNlc3Npb25FbnRyeS0+bGltUmVBc3NvY2Jzc0lkKSkpCisKKyNkZWZpbmUgUkVRX1RZUEVfUkVHSVNUUkFSICAgICAgICAgICAgICAgICAgICgweDIpCisjZGVmaW5lIFJFUV9UWVBFX1dMQU5fTUFOQUdFUl9SRUdJU1RSQVIgICAgICAoMHgzKQorCisjZGVmaW5lIFJFU1BfVFlQRV9SRUdJU1RSQVIgICAgICAgICAgICAgICAgICAoMHgyKQorI2RlZmluZSBSRVNQX1RZUEVfRU5ST0xMRUVfSU5GT19PTkxZICAgICAgICAgKDB4MCkKKyNkZWZpbmUgUkVTUF9UWVBFX0VOUk9MTEVFX09QRU5fODAyMVggICAgICAgICgweDEpCisjZGVmaW5lIFJFU1BfVFlQRV9BUCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzKQorI2RlZmluZSBMSU1fVFhfRlJBTUVTX1RIUkVTSE9MRF9PTl9DSElQICAgICAgIDMwMAorCisKKy8vIGVudW1zIHVzZWQgYnkgTElNIGFyZSBhcyBmb2xsb3dzCisKK2VudW0gZUxpbURpc2Fzc29jVHJpZ2dlcgoreworICAgIGVMSU1fSE9TVF9ESVNBU1NPQywKKyAgICBlTElNX1BFRVJfRU5USVRZX0RJU0FTU09DLAorICAgIGVMSU1fTElOS19NT05JVE9SSU5HX0RJU0FTU09DLAorICAgIGVMSU1fUFJPTUlTQ1VPVVNfTU9ERV9ESVNBU1NPQywKKyAgICBlTElNX0hPU1RfREVBVVRILAorICAgIGVMSU1fUEVFUl9FTlRJVFlfREVBVVRILAorICAgIGVMSU1fTElOS19NT05JVE9SSU5HX0RFQVVUSCwKKyAgICBlTElNX0pPSU5fRkFJTFVSRSwKKyAgICBlTElNX1JFQVNTT0NfUkVKRUNUCit9OworCisvKiBSZWFzb24gY29kZSB0byBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgY2hhbmdlIGNvbnRleHQgd2hpbGUgc2VuZGluZyAKKyAqIFdEQV9DSE5MX1NXSVRDSF9SRVEgbWVzc2FnZSB0byBIQUwKKyAqLworZW51bSBlQ2hhbm5lbENoYW5nZVJlYXNvbkNvZGVzCit7CisgICAgTElNX1NXSVRDSF9DSEFOTkVMX1JFQVNTT0MsCisgICAgTElNX1NXSVRDSF9DSEFOTkVMX0pPSU4sCisgICAgTElNX1NXSVRDSF9DSEFOTkVMX09QRVJBVElPTiwgLy8gR2VuZXJpYyBjaGFuZ2UgY2hhbm5lbAorfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbUF1dGhSc3BUaW1lb3V0Cit7CisgICAgdFNpck1hY0FkZHIgICAgcGVlck1hY0FkZHI7Cit9IHRMaW1BdXRoUnNwVGltZW91dDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVN0YXJ0UmVxCit7CisgICAgdFNpck1hY1NTaWQgICAgICAgICAgIHNzSWQ7CisgICAgdFNpckJzc1R5cGUgICAgICAgICAgIGJzc1R5cGU7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgIGJzc0lkOworICAgIHRTaXJNYWNCZWFjb25JbnRlcnZhbCBiZWFjb25QZXJpb2Q7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgIGR0aW1QZXJpb2Q7CisgICAgdFNpck1hY0NmUGFyYW1TZXQgICAgIGNmUGFyYW1TZXQ7CisgICAgdFNpck1hY0NoYW5OdW0gICAgICAgIGNoYW5uZWxOdW1iZXI7CisgICAgdEFuaUNCU2Vjb25kYXJ5TW9kZSAgIGNiTW9kZTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgYXRpbVdpbmRvdzsKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgICAgcmF0ZVNldDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgc2Vzc2lvbklkOyAvL0FkZGVkIEZvciBCVC1BTVAgU3VwcG9ydCAgIAorCisgICAgLy8gUGFyYW1ldGVycyByZXFkIGZvciBuZXcgSEFMIChtZXNzYWdlKSBpbnRlcmZhY2UKKyAgICB0U2lyTndUeXBlICAgICAgICAgICAgbndUeXBlOworICAgIHRBTklfVTggICAgICAgICAgICAgICBodENhcGFibGU7CisgICAgdFNpck1hY0hUT3BlcmF0aW5nTW9kZSAgICAgaHRPcGVyTW9kZTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICBkdWFsQ1RTUHJvdGVjdGlvbjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICB0eENoYW5uZWxXaWR0aFNldDsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgc3NpZEhpZGRlbjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICB3cHNfc3RhdGU7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgb2Jzc1Byb3RFbmFibGVkOworI2VuZGlmCit9IHRMaW1NbG1TdGFydFJlcSwgKnRwTGltTWxtU3RhcnRSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1TdGFydENuZgoreworICAgIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlOworICAgIHRBTklfVTggICAgICAgICBzZXNzaW9uSWQ7Cit9IHRMaW1NbG1TdGFydENuZiwgKnRwTGltTWxtU3RhcnRDbmY7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1TY2FuQ25mCit7CisgICAgdFNpclJlc3VsdENvZGVzICAgICAgICAgcmVzdWx0Q29kZTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICBzY2FuUmVzdWx0TGVuZ3RoOworICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAgICAgIGJzc0Rlc2NyaXB0aW9uWzFdOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIHNlc3Npb25JZDsKK30gdExpbU1sbVNjYW5DbmYsICp0cExpbU1sbVNjYW5DbmY7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1TY2FuUmVzdWx0Cit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgbnVtQnNzRGVzY3JpcHRpb25zOworICAgIHRTaXJCc3NEZXNjcmlwdGlvbiBic3NEZXNjcmlwdGlvblsxXTsKK30gdExpbVNjYW5SZXN1bHQ7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1Kb2luQ25mCit7CisgICAgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGU7CisgICAgdEFOSV9VMTYgcHJvdFN0YXR1c0NvZGU7CisgICAgdEFOSV9VOCAgc2Vzc2lvbklkOworfSB0TGltTWxtSm9pbkNuZiwgKnRwTGltTWxtSm9pbkNuZjsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbUFzc29jUmVxCit7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgIHBlZXJNYWNBZGRyOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgIGFzc29jRmFpbHVyZVRpbWVvdXQ7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eUluZm87CisgICAgdFNpck1hY0xpc3RlbkludGVydmFsIGxpc3RlbkludGVydmFsOworICAgIHRBTklfVTggICAgICAgICAgICAgc2Vzc2lvbklkOworfSB0TGltTWxtQXNzb2NSZXEsICp0cExpbU1sbUFzc29jUmVxOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtQXNzb2NDbmYKK3sKKyAgICB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZTsgLy9JbnRlcm5hbCBzdGF0dXMgY29kZS4KKyAgICB0QU5JX1UxNiBwcm90U3RhdHVzQ29kZTsgLy9Qcm90b2NvbCBTdGF0dXMgY29kZS4KKyAgICB0QU5JX1U4ICBzZXNzaW9uSWQ7Cit9IHRMaW1NbG1Bc3NvY0NuZiwgKnRwTGltTWxtQXNzb2NDbmY7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1Bc3NvY0luZAoreworICAgIHRTaXJNYWNBZGRyICAgICAgICAgIHBlZXJNYWNBZGRyOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgYWlkOworICAgIHRBbmlBdXRoVHlwZSAgICAgICAgIGF1dGhUeXBlOworICAgIHRBbmlTU0lEICAgICAgICAgICAgIHNzSWQ7CisgICAgdFNpclJTTmllICAgICAgICAgICAgcnNuSUU7CisgICAgdFNpckFkZGllICAgICAgICAgICAgYWRkSUU7IC8vIGFkZGl0aW9uYWwgSUUgcmVjZXZpZWQgZnJvbSB0aGUgcGVlciwgd2hpY2ggcG9zc2libHkgaW5jbHVkZXMgV1NDIElFIGFuZC9vciBQMlAgSUUuCisgICAgdFNpck1hY0NhcGFiaWxpdHlJbmZvIGNhcGFiaWxpdHlJbmZvOworICAgIHRBbmlUaXRhbkh0Q2FwYWJpbGl0eUluZm8gdGl0YW5IdENhcHM7CisKKyAgICB0QW5pQm9vbCAgICAgICAgICAgICAgICBzcGVjdHJ1bU1ndEluZGljYXRvcjsKKyAgICB0U2lyTWFjUG93ZXJDYXBJbmZvICAgICBwb3dlckNhcDsKKyAgICB0U2lyU3VwQ2hubCAgICAgICAgICAgICBzdXBwb3J0ZWRDaGFubmVsczsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ7CisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB0QW5pQm9vbCAgICAgICAgICAgICAgIFdtbVN0YUluZm9QcmVzZW50OworI2VuZGlmCisKKyNpZiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkgCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICBzZXFOdW07CisgICAgdEFuaUJvb2wgICAgICAgICAgICAgd25pSW5kaWNhdG9yOworICAgIHRBbmlCb29sICAgICAgICAgICAgIGJwSW5kaWNhdG9yOworICAgIHRTaXJCcEluZGljYXRvclR5cGUgIGJwVHlwZTsKKyAgICB0U2lyTndUeXBlICAgICAgICAgICBud1R5cGU7CisgICAgdFNpckFzc29jVHlwZSAgICAgICAgYXNzb2NUeXBlOyAvLyBJbmRpY2F0ZXMgd2hldGhlciBTVEEgaXMgTEInZWQgb3Igbm90CisgICAgdFNpckxvYWQgICAgICAgICAgICAgbG9hZDsgLy8gQ3VycmVudCBsb2FkIG9uIHRoZSByYWRpbyBmb3IgTEIKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgIG51bUJzczsgLy8gTGlzdCByZWNlaXZlZCBmcm9tIFNUQQorICAgIHRTaXJOZWlnaGJvckJzc0luZm8gIG5laWdoYm9yTGlzdFsxXTsgLy8gTGlzdCByZWNlaXZlZCBmcm9tIFNUQQorI2VuZGlmCisgICAgLy8gUmVxdWlyZWQgZm9yIGluZGljYXRpbmcgdGhlIGZyYW1lcyB0byB1cHBlciBsYXllcgorICAgIHRBTklfVTMyICAgICAgICAgICAgIGJlYWNvbkxlbmd0aDsKKyAgICB0QU5JX1U4KiAgICAgICAgICAgICBiZWFjb25QdHI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgYXNzb2NSZXFMZW5ndGg7CisgICAgdEFOSV9VOCogICAgICAgICAgICAgYXNzb2NSZXFQdHI7ICAgIAorfSB0TGltTWxtQXNzb2NJbmQsICp0cExpbU1sbUFzc29jSW5kOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtUmVhc3NvY1JlcQoreworICAgIHRTaXJNYWNBZGRyICAgICAgICAgICBwZWVyTWFjQWRkcjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICByZWFzc29jRmFpbHVyZVRpbWVvdXQ7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eUluZm87CisgICAgdFNpck1hY0xpc3RlbkludGVydmFsIGxpc3RlbkludGVydmFsOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgc2Vzc2lvbklkOyAKK30gdExpbU1sbVJlYXNzb2NSZXEsICp0cExpbU1sbVJlYXNzb2NSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1SZWFzc29jQ25mCit7CisgICAgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGU7CisgICAgdEFOSV9VMTYgcHJvdFN0YXR1c0NvZGU7IC8vUHJvdG9jb2wgU3RhdHVzIGNvZGUuCisgICAgdEFOSV9VOCAgc2Vzc2lvbklkOworfSB0TGltTWxtUmVhc3NvY0NuZiwgKnRwTGltTWxtUmVhc3NvY0NuZjsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVJlYXNzb2NJbmQKK3sKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICBwZWVyTWFjQWRkcjsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICBjdXJyZW50QXBBZGRyOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIGFpZDsKKyAgICB0QW5pQXV0aFR5cGUgICAgICAgICBhdXRoVHlwZTsKKyAgICB0QW5pU1NJRCAgICAgICAgICAgICBzc0lkOworICAgIHRTaXJSU05pZSAgICAgICAgICAgIHJzbklFOworICAgIHRTaXJBZGRpZSAgICAgICAgICAgIGFkZElFOyAvLyBhZGRpdGlvbmFsIElFIHJlY2V2aWVkIGZyb20gdGhlIHBlZXIsIHdoaWNoIGNhbiBiZSBXU0MgSUUgYW5kL29yIFAyUCBJRS4KKyAgICB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gY2FwYWJpbGl0eUluZm87CisgICAgdEFuaVRpdGFuSHRDYXBhYmlsaXR5SW5mbyB0aXRhbkh0Q2FwczsKKworICAgIHRBbmlCb29sICAgICAgICAgICAgICAgIHNwZWN0cnVtTWd0SW5kaWNhdG9yOworICAgIHRTaXJNYWNQb3dlckNhcEluZm8gICAgIHBvd2VyQ2FwOworICAgIHRTaXJTdXBDaG5sICAgICAgICAgICAgIHN1cHBvcnRlZENoYW5uZWxzOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHRBbmlCb29sICAgICAgICAgICAgICAgV21tU3RhSW5mb1ByZXNlbnQ7CisjZW5kaWYKKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgIHNlcU51bTsKKyAgICB0QW5pQm9vbCAgICAgICAgICAgICB3bmlJbmRpY2F0b3I7CisgICAgdEFuaUJvb2wgICAgICAgICAgICAgYnBJbmRpY2F0b3I7CisgICAgdFNpckJwSW5kaWNhdG9yVHlwZSAgYnBUeXBlOworICAgIHRTaXJOd1R5cGUgICAgICAgICAgIG53VHlwZTsKKyAgICB0U2lyQXNzb2NUeXBlICAgICAgICByZWFzc29jVHlwZTsgLy8gSW5kaWNhdGVzIHdoZXRoZXIgU1RBIGlzIExCJ2VkIG9yIG5vdAorICAgIHRTaXJMb2FkICAgICAgICAgICAgIGxvYWQ7IC8vIEN1cnJlbnQgbG9hZCBvbiB0aGUgcmFkaW8gZm9yIExCCisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICBudW1Cc3M7IC8vIExpc3QgcmVjZWl2ZWQgZnJvbSBTVEEKKyAgICB0U2lyTmVpZ2hib3JCc3NJbmZvICBuZWlnaGJvckxpc3RbMV07IC8vIExpc3QgcmVjZWl2ZWQgZnJvbSBTVEEKKyNlbmRpZgorICAgIC8vIFJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZXMgdG8gdXBwZXIgbGF5ZXIKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICBiZWFjb25MZW5ndGg7CisgICAgdEFOSV9VOCogICAgICAgICAgICAgYmVhY29uUHRyOworICAgIHRBTklfVTMyICAgICAgICAgICAgIGFzc29jUmVxTGVuZ3RoOworICAgIHRBTklfVTgqICAgICAgICAgICAgIGFzc29jUmVxUHRyOyAgICAKK30gdExpbU1sbVJlYXNzb2NJbmQsICp0cExpbU1sbVJlYXNzb2NJbmQ7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1BdXRoQ25mCit7CisgICAgdFNpck1hY0FkZHIgICAgIHBlZXJNYWNBZGRyOworICAgIHRBbmlBdXRoVHlwZSAgICBhdXRoVHlwZTsKKyAgICB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZTsKKyAgICB0QU5JX1UxNiAgICAgICAgcHJvdFN0YXR1c0NvZGU7CisgICAgdEFOSV9VOCAgICAgICAgIHNlc3Npb25JZDsKK30gdExpbU1sbUF1dGhDbmYsICp0cExpbU1sbUF1dGhDbmY7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1BdXRoSW5kCit7CisgICAgdFNpck1hY0FkZHIgICAgcGVlck1hY0FkZHI7CisgICAgdEFuaUF1dGhUeXBlICAgYXV0aFR5cGU7CisgICAgdEFOSV9VOCAgICAgICAgc2Vzc2lvbklkOworfSB0TGltTWxtQXV0aEluZCwgKnRwTGltTWxtQXV0aEluZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbURlYXV0aFJlcQoreworICAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworICAgIHRBTklfVTE2ICAgICAgICAgcmVhc29uQ29kZTsKKyAgICB0QU5JX1UxNiAgICAgICAgIGRlYXV0aFRyaWdnZXI7CisgICAgdEFOSV9VMTYgICAgICAgICBhaWQ7CisgICAgdEFOSV9VOCAgICAgICAgIHNlc3Npb25JZDsgLy9BZGRlZCBmb3IgQlQtQU1QIFNVUFBPUlQKKyAgICAKK30gdExpbU1sbURlYXV0aFJlcSwgKnRwTGltTWxtRGVhdXRoUmVxOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtRGVhdXRoQ25mCit7CisgICAgdFNpck1hY0FkZHIgICAgIHBlZXJNYWNBZGRyOworICAgIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlOworICAgIHRBTklfVTE2ICAgICAgICBkZWF1dGhUcmlnZ2VyOworICAgIHRBTklfVTE2ICAgICAgICBhaWQ7CisgICAgdEFOSV9VOCAgICAgICAgIHNlc3Npb25JZDsKK30gdExpbU1sbURlYXV0aENuZiwgKnRwTGltTUxtRGVhdXRoQ25mOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtRGVhdXRoSW5kCit7CisgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisgICAgdEFOSV9VMTYgICAgICAgICByZWFzb25Db2RlOworICAgIHRBTklfVTE2ICAgICAgICAgZGVhdXRoVHJpZ2dlcjsKKyAgICB0QU5JX1UxNiAgICAgICAgIGFpZDsKK30gdExpbU1sbURlYXV0aEluZCwgKnRwTGltTWxtRGVhdXRoSW5kOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtRGlzYXNzb2NSZXEKK3sKKyAgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKyAgICB0QU5JX1UxNiAgICAgICAgIHJlYXNvbkNvZGU7CisgICAgdEFOSV9VMTYgICAgICAgICBkaXNhc3NvY1RyaWdnZXI7CisgICAgdEFOSV9VMTYgICAgICAgICBhaWQ7CisgICAgdEFOSV9VOCAgICAgICAgIHNlc3Npb25JZDsKK30gdExpbU1sbURpc2Fzc29jUmVxLCAqdHBMaW1NbG1EaXNhc3NvY1JlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbURpc2Fzc29jQ25mCit7CisgICAgdFNpck1hY0FkZHIgICAgIHBlZXJNYWNBZGRyOworICAgIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIGRpc2Fzc29jVHJpZ2dlcjsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBhaWQ7CisgICAgdEFOSV9VOCAgICAgICAgIHNlc3Npb25JZDsKK30gdExpbU1sbURpc2Fzc29jQ25mLCAqdHBMaW1NbG1EaXNhc3NvY0NuZjsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbURpc2Fzc29jSW5kCit7CisgICAgdFNpck1hY0FkZHIgICAgIHBlZXJNYWNBZGRyOworICAgIHRBTklfVTE2ICAgICAgICByZWFzb25Db2RlOworICAgIHRBTklfVTE2ICAgICAgICBkaXNhc3NvY1RyaWdnZXI7CisgICAgdEFOSV9VMTYgICAgICAgIGFpZDsKKyAgICB0QU5JX1U4ICAgICAgICAgc2Vzc2lvbklkOworfSB0TGltTWxtRGlzYXNzb2NJbmQsICp0cExpbU1sbURpc2Fzc29jSW5kOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtUHVyZ2VTdGFSZXEKK3sKKyAgICB0U2lyTWFjQWRkciAgICAgcGVlck1hY0FkZHI7CisgICAgdEFOSV9VMTYgICAgICAgIGFpZDsKKyAgICB0QU5JX1U4ICAgICAgICAgc2Vzc2lvbklkOy8vQWRkZWQgRm9yIEJULUFNUCBTdXBwb3J0Cit9IHRMaW1NbG1QdXJnZVN0YVJlcSwgKnRwTGltTWxtUHVyZ2VTdGFSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1QdXJnZVN0YUluZAoreworICAgIHRTaXJNYWNBZGRyICAgICBwZWVyTWFjQWRkcjsKKyAgICB0QU5JX1UxNiAgICAgICAgcmVhc29uQ29kZTsKKyAgICB0QU5JX1UxNiAgICAgICAgcHVyZ2VUcmlnZ2VyOworICAgIHRBTklfVTE2ICAgICAgICBhaWQ7CisgICAgdEFOSV9VOCAgICAgICAgIHNlc3Npb25JZDsKK30gdExpbU1sbVB1cmdlU3RhSW5kLCAqdHBMaW1NbG1QdXJnZVN0YUluZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVNldEtleXNSZXEKK3sKKyAgICB0U2lyTWFjQWRkciAgICAgcGVlck1hY0FkZHI7CisgICAgdEFOSV9VOCAgICAgICAgIHNlc3Npb25JZDsgICAgICAvL0FkZGVkIEZvciBCVC1BTVAgU3VwcG9ydAorICAgIHRBTklfVTE2ICAgICAgICBhaWQ7CisgICAgdEFuaUVkVHlwZSAgICAgIGVkVHlwZTsgICAgLy8gRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHR5cGUKKyAgICB0QU5JX1U4ICAgICAgICAgbnVtS2V5czsKKyAgICB0U2lyS2V5cyAgICAgICAga2V5W1NJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVNdOworfSB0TGltTWxtU2V0S2V5c1JlcSwgKnRwTGltTWxtU2V0S2V5c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVNldEtleXNDbmYKK3sKKyAgICB0U2lyTWFjQWRkciAgICAgcGVlck1hY0FkZHI7CisgICAgdEFOSV9VMTYgICAgICAgIHJlc3VsdENvZGU7CisgICAgdEFOSV9VMTYgICAgICAgIGFpZDsKKyAgICB0QU5JX1U4ICAgICAgICAgc2Vzc2lvbklkOworfSB0TGltTWxtU2V0S2V5c0NuZiwgKnRwTGltTWxtU2V0S2V5c0NuZjsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVJlbW92ZUtleVJlcQoreworICAgIHRTaXJNYWNBZGRyICAgICBwZWVyTWFjQWRkcjsKKyAgICB0QU5JX1U4ICAgICAgICAgc2Vzc2lvbklkOyAvL0FkZGVkIEZPciBCVC1BTVAgU3VwcG9ydAorICAgIHRBbmlFZFR5cGUgICAgICBlZFR5cGU7ICAgIC8vIEVuY3J5cHRpb24vRGVjcnlwdGlvbiB0eXBlCisgICAgdEFOSV9VOCAgICAgICAgIHdlcFR5cGU7IC8vU1RBVElDIC8gRFlOQU1JQyBzcGVjaWZpZXIKKyAgICB0QU5JX1U4ICAgICAgICAga2V5SWQ7IC8vS2V5IElkIFRvIGJlIHJlbW92ZWQuCisgICAgdEFOSV9CT09MRUFOICAgIHVuaWNhc3Q7Cit9IHRMaW1NbG1SZW1vdmVLZXlSZXEsICp0cExpbU1sbVJlbW92ZUtleVJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVJlbW92ZUtleUNuZgoreworICAgIHRTaXJNYWNBZGRyICAgICBwZWVyTWFjQWRkcjsKKyAgICB0QU5JX1UxNiAgICAgICAgcmVzdWx0Q29kZTsKKyAgICB0QU5JX1U4ICAgICAgICAgc2Vzc2lvbklkOworfSB0TGltTWxtUmVtb3ZlS2V5Q25mLCAqdHBMaW1NbG1SZW1vdmVLZXlDbmY7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVJlc2V0UmVxCit7CisgICAgdFNpck1hY0FkZHIgbWFjQWRkcjsKKyAgICB0QU5JX1U4ICAgICAgICBwZXJmb3JtQ2xlYW51cDsKKyAgICB0QU5JX1U4ICAgICAgIHNlc3Npb25JZDsKK30gdExpbU1sbVJlc2V0UmVxLCAqdHBMaW1NbG1SZXNldFJlcTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbVJlc2V0Q25mCit7CisgICAgdFNpck1hY0FkZHIgbWFjQWRkcjsKKyAgICB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZTsKKyAgICB0QU5JX1U4ICAgICAgICAgc2Vzc2lvbklkOworfSB0TGltTWxtUmVzZXRDbmYsICp0cExpbU1sbVJlc2V0Q25mOworCisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1MaW5rVGVzdFN0b3BSZXEKK3sKKyAgICB0U2lyTWFjQWRkciAgICBwZWVyTWFjQWRkcjsKKyAgICB0QU5JX1U4ICAgICAgIHNlc3Npb25JZDsKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgYWlkOworI2VuZGlmCit9IHRMaW1NbG1MaW5rVGVzdFN0b3BSZXEsICp0cExpbU1sbUxpbmtUZXN0U3RvcFJlcTsKKworCisvLworLy8gQmxvY2sgQUNLIHJlbGF0ZWQgTUxNRSBkYXRhIHN0cnVjdHVyZXMKKy8vCisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1BZGRCQVJlcQoreworCisgIC8vIEFEREJBIHJlY2lwaWVudAorICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKworICAvLyBBRERCQSBBY3Rpb24gRnJhbWUgZGlhbG9nIHRva2VuCisgIHRBTklfVTggYmFEaWFsb2dUb2tlbjsKKworICAvLyBBRERCQSByZXF1ZXN0ZWQgZm9yIFRJRAorICB0QU5JX1U4IGJhVElEOworCisgIC8vIEJBIHBvbGljeQorICAvLyAwIC0gRGVsYXllZCBCQSAoTm90IHN1cHBvcnRlZCkKKyAgLy8gMSAtIEltbWVkaWF0ZSBCQQorICB0QU5JX1U4IGJhUG9saWN5OworCisgIC8vIEJBIGJ1ZmZlciBzaXplIC0gKDAuLjEyNykgbWF4IHNpemUgTVNEVSdzCisgIHRBTklfVTE2IGJhQnVmZmVyU2l6ZTsKKworICAvLyBCQSB0aW1lb3V0IGluIFRVJ3MKKyAgLy8gMCBtZWFucyBubyB0aW1lb3V0IHdpbGwgb2NjdXIKKyAgdEFOSV9VMTYgYmFUaW1lb3V0OworCisgIC8vIEFEREJBIGZhaWx1cmUgdGltZW91dCBpbiBUVSdzCisgIC8vIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxCisgIHRBTklfVTE2IGFkZEJBRmFpbHVyZVRpbWVvdXQ7CisKKyAgLy8gQkEgU3RhcnRpbmcgU2VxdWVuY2UgTnVtYmVyCisgIHRBTklfVTE2IGJhU1NOOworCisgIHRBTklfVTggICAgICAgc2Vzc2lvbklkOworCit9IHRMaW1NbG1BZGRCQVJlcSwgKnRwTGltTWxtQWRkQkFSZXE7CisKK3R5cGVkZWYgc3RydWN0IHNMaW1NbG1BZGRCQUNuZgoreworCisgIC8vIEFEREJBIHJlY2lwaWVudAorICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkcjsKKworICAvLyBBRERCQSBBY3Rpb24gRnJhbWUgZGlhbG9nIHRva2VuCisgIHRBTklfVTggYmFEaWFsb2dUb2tlbjsKKworICAvLyBBRERCQSByZXF1ZXN0ZWQgZm9yIFRJRAorICB0QU5JX1U4IGJhVElEOworCisgIC8vIEJBIHN0YXR1cyBjb2RlCisgIHRTaXJNYWNTdGF0dXNDb2RlcyBhZGRCQVJlc3VsdENvZGU7CisKKyAgLy8gQkEgcG9saWN5CisgIC8vIDAgLSBEZWxheWVkIEJBIChOb3Qgc3VwcG9ydGVkKQorICAvLyAxIC0gSW1tZWRpYXRlIEJBCisgIHRBTklfVTggYmFQb2xpY3k7CisKKyAgLy8gQkEgYnVmZmVyIHNpemUgLSAoMC4uMTI3KSBtYXggc2l6ZSBNU0RVJ3MKKyAgdEFOSV9VMTYgYmFCdWZmZXJTaXplOworCisgIC8vIEJBIHRpbWVvdXQgaW4gVFUncworICAvLyAwIG1lYW5zIG5vIHRpbWVvdXQgd2lsbCBvY2N1cgorICB0QU5JX1UxNiBiYVRpbWVvdXQ7CisKKyAgLy8gQUREQkEgZGlyZWN0aW9uCisgIC8vIDEgLSBPcmlnaW5hdG9yCisgIC8vIDAgLSBSZWNpcGllbnQKKyAgdEFOSV9VOCBiYURpcmVjdGlvbjsKKyAgdEFOSV9VOCBzZXNzaW9uSWQ7CisKKworfSB0TGltTWxtQWRkQkFDbmYsICp0cExpbU1sbUFkZEJBQ25mOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtQWRkQkFJbmQKK3sKKworICAvLyBBRERCQSByZWNpcGllbnQKKyAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisKKyAgLy8gQUREQkEgQWN0aW9uIEZyYW1lIGRpYWxvZyB0b2tlbgorICB0QU5JX1U4IGJhRGlhbG9nVG9rZW47CisKKyAgLy8gQUREQkEgcmVxdWVzdGVkIGZvciBUSUQKKyAgdEFOSV9VOCBiYVRJRDsKKworICAvLyBCQSBwb2xpY3kKKyAgLy8gMCAtIERlbGF5ZWQgQkEgKE5vdCBzdXBwb3J0ZWQpCisgIC8vIDEgLSBJbW1lZGlhdGUgQkEKKyAgdEFOSV9VOCBiYVBvbGljeTsKKworICAvLyBCQSBidWZmZXIgc2l6ZSAtICgwLi4xMjcpIG1heCBzaXplIE1TRFUncworICB0QU5JX1UxNiBiYUJ1ZmZlclNpemU7CisKKyAgLy8gQkEgdGltZW91dCBpbiBUVSdzCisgIC8vIDAgbWVhbnMgbm8gdGltZW91dCB3aWxsIG9jY3VyCisgIHRBTklfVTE2IGJhVGltZW91dDsKKworfSB0TGltTWxtQWRkQkFJbmQsICp0cExpbU1sbUFkZEJBSW5kOworCit0eXBlZGVmIHN0cnVjdCBzTGltTWxtQWRkQkFSc3AKK3sKKworICAvLyBBRERCQSByZWNpcGllbnQKKyAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHI7CisKKyAgLy8gQUREQkEgQWN0aW9uIEZyYW1lIGRpYWxvZyB0b2tlbgorICB0QU5JX1U4IGJhRGlhbG9nVG9rZW47CisKKyAgLy8gQUREQkEgcmVxdWVzdGVkIGZvciBUSUQKKyAgdEFOSV9VOCBiYVRJRDsKKworICAvLyBCQSBzdGF0dXMgY29kZQorICB0U2lyTWFjU3RhdHVzQ29kZXMgYWRkQkFSZXN1bHRDb2RlOworCisgIC8vIEJBIHBvbGljeQorICAvLyAwIC0gRGVsYXllZCBCQSAoTm90IHN1cHBvcnRlZCkKKyAgLy8gMSAtIEltbWVkaWF0ZSBCQQorICB0QU5JX1U4IGJhUG9saWN5OworICAKKyAgLy8gQkEgYnVmZmVyIHNpemUgLSAoMC4uMTI3KSBtYXggc2l6ZSBNU0RVJ3MKKyAgdEFOSV9VMTYgYmFCdWZmZXJTaXplOworCisgIC8vIEJBIHRpbWVvdXQgaW4gVFUncworICAvLyAwIG1lYW5zIG5vIHRpbWVvdXQgd2lsbCBvY2N1cgorICB0QU5JX1UxNiBiYVRpbWVvdXQ7CisKKyAgLy9yZXNlcnZlZCBmb3IgYWxpZ25tZW50CisgIHRBTklfVTggcnN2ZFsyXTsKKworICAvKiBQRSBzZXNzaW9uIGlkKi8gIAorICB0QU5JX1U4ICAgIHNlc3Npb25JZDsKKworIH0gdExpbU1sbUFkZEJBUnNwLCAqdHBMaW1NbG1BZGRCQVJzcDsKKworLy8KKy8vIE5PVEUgLSBPdmVybG9hZGluZyBERUxCQSBJTkQgYW5kIERFTEJBIENORgorLy8gdG8gdXNlIHRoZSBzYW1lIGRhdGEgc3RydWN0dXJlIGFzIERFTEJBIFJFUQorLy8gYXMgdGhlIHBhcmFtZXRlcnMgZG8gbm90IHZhcnkgdG9vIG11Y2guCisvLwordHlwZWRlZiBzdHJ1Y3Qgc0xpbU1sbURlbEJBUmVxCit7CisKKyAgLy8gQUREQkEgcmVjaXBpZW50CisgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCisgIC8vIERFTEJBIGRpcmVjdGlvbgorICAvLyAxIC0gT3JpZ2luYXRvcgorICAvLyAwIC0gUmVjaXBpZW50CisgIHRBTklfVTggYmFEaXJlY3Rpb247CisKKyAgLy8gREVMQkEgcmVxdWVzdGVkIGZvciBUSUQKKyAgdEFOSV9VOCBiYVRJRDsKKworICAvLyBERUxCQSByZWFzb24gY29kZQorICB0U2lyTWFjUmVhc29uQ29kZXMgZGVsQkFSZWFzb25Db2RlOworCisgIHRBTklfVTggICAgICAgc2Vzc2lvbklkOworCit9IHRMaW1NbG1EZWxCQVJlcSwgKnRwTGltTWxtRGVsQkFSZXEsIHRMaW1NbG1EZWxCQUluZCwgKnRwTGltTWxtRGVsQkFJbmQsIHRMaW1NbG1EZWxCQUNuZiwgKnRwTGltTWxtRGVsQkFDbmY7CisKKy8vIEZ1bmN0aW9uIHRlbXBsYXRlcworCit0QU5JX0JPT0xFQU4gbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzKHRwQW5pU2lyR2xvYmFsLCB0cFNpck1zZ1EpOwordm9pZCBsaW1Qcm9jZXNzTWxtUmVxTWVzc2FnZXModHBBbmlTaXJHbG9iYWwsIHRwU2lyTXNnUSk7Cit2b2lkIGxpbVByb2Nlc3NNbG1Sc3BNZXNzYWdlcyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIsIHRBTklfVTMyICopOwordm9pZCBsaW1Qcm9jZXNzTG1tTWVzc2FnZXModHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyLCB0QU5JX1UzMiAqKTsKK3ZvaWQgbGltUHJvY2Vzc1NtZURlbEJzc1JzcCggdHBBbmlTaXJHbG9iYWwgLCB0QU5JX1UzMix0cFBFU2Vzc2lvbik7CisKK3ZvaWQgbGltR2V0UmFuZG9tQnNzaWQodHBBbmlTaXJHbG9iYWwgcE1hYyAsdEFOSV9VOCAqZGF0YSk7CisKKy8vIEZ1bmN0aW9uIHRvIGhhbmRsZSBDQiBDRkcgcGFyYW1ldGVyIHVwZGF0ZXMKK3ZvaWQgaGFuZGxlQ0JDRkdDaGFuZ2UoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGNmZ0lkICk7CisKKy8vIEZ1bmN0aW9uIHRvIGhhbmRsZSBIVCBhbmQgSFQgSUUgQ0ZHIHBhcmFtZXRlciBpbnRpYWxpemF0aW9ucwordm9pZCBoYW5kbGVIVENhcGFiaWxpdHlhbmRIVEluZm8oc3RydWN0IHNBbmlTaXJHbG9iYWwgKnBNYWMpOworCisvLyBGdW5jdGlvbiB0byBoYW5kbGUgQ0ZHIHBhcmFtZXRlciB1cGRhdGVzCit2b2lkIGxpbUhhbmRsZUNGR3BhcmFtVXBkYXRlKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMik7CisKKy8vIEZ1bmN0aW9uIHRvIGFwcGx5IENGRyBwYXJhbWV0ZXJzIGJlZm9yZSBqb2luL3JlYXNzb2Mvc3RhcnQgQlNTCit2b2lkIGxpbUFwcGx5Q29uZmlndXJhdGlvbih0cEFuaVNpckdsb2JhbCx0cFBFU2Vzc2lvbik7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCit2b2lkIGxpbVNldENmZ1Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcGVzZXNzaW9uRW50cnkpOworI2Vsc2UKK3ZvaWQgbGltU2V0Q2ZnUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjKTsKKyNlbmRpZgorCisKKy8vIEZ1bmN0aW9uIHRvIEluaXRpYWxpemUgTUxNIHN0YXRlIG1hY2hpbmUgb24gU1RBCit2b2lkIGxpbUluaXRNbG0odHBBbmlTaXJHbG9iYWwpOworCisvLyBGdW5jdGlvbiB0byBjbGVhbnVwIE1MTSBzdGF0ZSBtYWNoaW5lCit2b2lkIGxpbUNsZWFudXBNbG0odHBBbmlTaXJHbG9iYWwpOworCisvLyBGdW5jdGlvbiB0byBjbGVhbnVwIExNTSBzdGF0ZSBtYWNoaW5lCit2b2lkIGxpbUNsZWFudXBMbW0odHBBbmlTaXJHbG9iYWwpOworCisKKy8vIE1hbmFnZW1lbnQgZnJhbWUgaGFuZGxpbmcgZnVuY3Rpb25zCit2b2lkIGxpbVByb2Nlc3NCZWFjb25GcmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqLHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltUHJvY2Vzc0JlYWNvbkZyYW1lTm9TZXNzaW9uKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4ICopOwordm9pZCBsaW1Qcm9jZXNzUHJvYmVSZXFGcmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqLCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbVByb2Nlc3NQcm9iZVJzcEZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4ICosIHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltUHJvY2Vzc1Byb2JlUnNwRnJhbWVOb1Nlc3Npb24odHBBbmlTaXJHbG9iYWwsIHRBTklfVTggKik7Cit2b2lkIGxpbVByb2Nlc3NQcm9iZVJlcUZyYW1lX211bHRpcGxlX0JTUyh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqLHRwUEVTZXNzaW9uKTsKKworCisvLyBQcm9jZXNzIEF1dGggZnJhbWUgd2hlbiB3ZSBoYXZlIGEgc2Vzc2lvbiBpbiBwcm9ncmVzcy4KK3ZvaWQgbGltUHJvY2Vzc0F1dGhGcmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqLHRwUEVTZXNzaW9uKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgoraW50IGxpbVByb2Nlc3NBdXRoRnJhbWVOb1Nlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqLCB2b2lkICpib2R5KTsKKyNlbmRpZgorCit2b2lkIGxpbVByb2Nlc3NBc3NvY1JlcUZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4ICosIHRBTklfVTgsIHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltU2VuZE1sbUFzc29jSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwRHBoSGFzaE5vZGUgcFN0YURzLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworCit2b2lkIGxpbVByb2Nlc3NBc3NvY1JzcEZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4ICosIHRBTklfVTgsdHBQRVNlc3Npb24pOwordm9pZCBsaW1Qcm9jZXNzRGlzYXNzb2NGcmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqLHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltUHJvY2Vzc0RlYXV0aEZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4ICosdHBQRVNlc3Npb24pOwordm9pZCBsaW1Qcm9jZXNzQWN0aW9uRnJhbWUodHBBbmlTaXJHbG9iYWwsIHRBTklfVTggKix0cFBFU2Vzc2lvbik7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQCit2b2lkIGxpbVByb2Nlc3NBY3Rpb25GcmFtZU5vU2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwUnhNZXRhSW5mbyk7CisjZW5kaWYKKworCit0U2lyUmV0U3RhdHVzIGxpbVBvcHVsYXRlTWFjSGVhZGVyKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4KiwgdEFOSV9VOCwgdEFOSV9VOCwgdFNpck1hY0FkZHIsdFNpck1hY0FkZHIpOwordFNpclJldFN0YXR1cyBsaW1TZW5kUHJvYmVSZXFNZ210RnJhbWUodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNTU2lkICosIHRTaXJNYWNBZGRyLCB0QU5JX1U4LCB0U2lyTWFjQWRkciwgdEFOSV9VMzIsIHRBTklfVTMyLCB0QU5JX1U4ICopOyAKK3ZvaWQgbGltU2VuZFByb2JlUnNwTWdtdEZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjQWRkciwgdHBBbmlTU0lELCBzaG9ydCwgdEFOSV9VOCwgdHBQRVNlc3Npb24sIHRBTklfVTgpOwordm9pZCBsaW1TZW5kQXV0aE1nbXRGcmFtZSh0cEFuaVNpckdsb2JhbCwgdFNpck1hY0F1dGhGcmFtZUJvZHkgKiwgdFNpck1hY0FkZHIsIHRBTklfVTgsdHBQRVNlc3Npb24pOwordm9pZCBsaW1TZW5kQXNzb2NSZXFNZ210RnJhbWUodHBBbmlTaXJHbG9iYWwsIHRMaW1NbG1Bc3NvY1JlcSAqLHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltU2VuZFJlYXNzb2NSZXFNZ210RnJhbWUodHBBbmlTaXJHbG9iYWwsIHRMaW1NbG1SZWFzc29jUmVxICosdHBQRVNlc3Npb24pOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCit2b2lkIGxpbVNlbmRSZWFzc29jUmVxV2l0aEZUSUVzTWdtdEZyYW1lKHRwQW5pU2lyR2xvYmFsICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdExpbU1sbVJlYXNzb2NSZXEgKnBNbG1SZWFzc29jUmVxLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworI2VuZGlmCit2b2lkIGxpbVNlbmREZWx0c1JlcUFjdGlvbkZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyICBwZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgd21tVHNwZWNQcmVzZW50LCB0U2lyTWFjVFNJbmZvICAqcFRzaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNUc3BlY0lFICAqcFRzcGVjSWUsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1TZW5kQWRkdHNSZXFBY3Rpb25GcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckFkZHRzUmVxSW5mbyAqYWRkdHMsdHBQRVNlc3Npb24pOwordm9pZCBsaW1TZW5kQWRkdHNSc3BBY3Rpb25GcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2IHN0YXR1c0NvZGUsIHRTaXJBZGR0c1JlcUluZm8gKmFkZHRzLCB0U2lyTWFjU2NoZWR1bGVJRSAqcFNjaGVkdWxlLHRwUEVTZXNzaW9uKTsKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKK3ZvaWQgbGltU2VuZEFzc29jUnNwTWdtdEZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UxNiwgdEFOSV9VMTYsIHRTaXJNYWNBZGRyLCB0QU5JX1U4LCB0cERwaEhhc2hOb2RlIHBTdGEsdHBQRVNlc3Npb24pOworI2VuZGlmCit2b2lkIGxpbVNlbmRBc3NvY1JzcE1nbXRGcmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRBTklfVTE2LCB0U2lyTWFjQWRkciwgdEFOSV9VOCwgdHBEcGhIYXNoTm9kZSBwU3RhLHRwUEVTZXNzaW9uKTsKKwordm9pZCBsaW1TZW5kTnVsbERhdGFGcmFtZSh0cEFuaVNpckdsb2JhbCwgdHBEcGhIYXNoTm9kZSk7Cit2b2lkIGxpbVNlbmREaXNhc3NvY01nbXRGcmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRTaXJNYWNBZGRyLHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltU2VuZERlYXV0aE1nbXRGcmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRTaXJNYWNBZGRyLHRwUEVTZXNzaW9uKTsKKwordm9pZCBsaW1Db250aW51ZUNoYW5uZWxTY2FuKHRwQW5pU2lyR2xvYmFsKTsKK3RTaXJSZXN1bHRDb2RlcyBsaW1NbG1BZGRCc3ModHBBbmlTaXJHbG9iYWwsIHRMaW1NbG1TdGFydFJlcSAqLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkKK3RTaXJSZXRTdGF0dXMgbGltU2VuZENoYW5uZWxTd2l0Y2hNZ210RnJhbWUodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNBZGRyLCB0QU5JX1U4LCB0QU5JX1U4LCB0QU5JX1U4KTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCit0U2lyUmV0U3RhdHVzIGxpbVNlbmROZWlnaGJvclJlcG9ydFJlcXVlc3RGcmFtZSh0cEFuaVNpckdsb2JhbCwgdHBTaXJNYWNOZWlnaGJvclJlcG9ydFJlcSwgdFNpck1hY0FkZHIsIHRwUEVTZXNzaW9uKTsKK3RTaXJSZXRTdGF0dXMgbGltU2VuZExpbmtSZXBvcnRBY3Rpb25GcmFtZSh0cEFuaVNpckdsb2JhbCwgdHBTaXJNYWNMaW5rUmVwb3J0LCB0U2lyTWFjQWRkciwgdHBQRVNlc3Npb24gKTsgCit0U2lyUmV0U3RhdHVzIGxpbVNlbmRSYWRpb01lYXN1cmVSZXBvcnRBY3Rpb25GcmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCwgdEFOSV9VOCwgdHBTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQsIHRTaXJNYWNBZGRyLCB0cFBFU2Vzc2lvbik7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKK3ZvaWQgbGltUHJvY2Vzc0lhcHBGcmFtZSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCAqLHRwUEVTZXNzaW9uKTsKKyNlbmRpZgorCisvLyBBbGdvcml0aG1zICYgTGluayBNb25pdG9yaW5nIHJlbGF0ZWQgZnVuY3Rpb25zCit0U2lyQmFja2dyb3VuZFNjYW5Nb2RlIGxpbVNlbGVjdHNCYWNrZ3JvdW5kU2Nhbk1vZGUodHBBbmlTaXJHbG9iYWwpOwordm9pZCBsaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW4odHBBbmlTaXJHbG9iYWwpOwordm9pZCBsaW1BYm9ydEJhY2tncm91bmRTY2FuKHRwQW5pU2lyR2xvYmFsKTsKKworLy8vIEZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBoZWFydGJlYXQgZmFpbHVyZQordm9pZCBsaW1IYW5kbGVIZWFydEJlYXRGYWlsdXJlKHRwQW5pU2lyR2xvYmFsLHRwUEVTZXNzaW9uKTsKKworLy8vIEZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgbGluayB0ZWFyIGRvd24gd2l0aCBBUCB1cG9uIEhCIGZhaWx1cmUKK3ZvaWQgbGltVGVhckRvd25MaW5rV2l0aEFwKHRwQW5pU2lyR2xvYmFsLHRBTklfVTgsIHRTaXJNYWNSZWFzb25Db2Rlcyk7CisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisvLy8gRnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBwZXJpb2RpYyByZWxlYXNlIG9mIEFJRHMKK3ZvaWQgbGltUmVsZWFzZUFJREhhbmRsZXIodHBBbmlTaXJHbG9iYWwpOworCisvLy8gRnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBwZXJpb2RpYyBjbGVhbnVwIG9mIFByZS1hdXRoIGNvbnRleHRzCit2b2lkIGxpbVByZUF1dGhDbG51cEhhbmRsZXIodHBBbmlTaXJHbG9iYWwpOworCisvLy8gRnVuY3Rpb24gdGhhdCBwcm9jZXNzZXMgQ0YtcG9sbCByZXNwb25zZSBtZXNzYWdlIGZyb20gU0NICit2b2lkIGxpbUhhbmRsZUNGcG9sbFJzcCh0QU5JX1UzMik7CisKKy8vLyBGdW5jdGlvbiB0aGF0IHByb2Nlc3NlcyBQUy1wb2xsIG1lc3NhZ2UgZnJvbSBQTU0KK3ZvaWQgbGltSGFuZGxlUFNwb2xsKHRBTklfVTMyKTsKKyNlbmRpZgorCisvLy8gRnVuY3Rpb24gdGhhdCBzZW5kcyBrZWVwIGFsaXZlIG1lc3NhZ2UgdG8gcGVlcihzKQordm9pZCBsaW1TZW5kS2VlcEFsaXZlVG9QZWVyKHRwQW5pU2lyR2xvYmFsKTsKKworLy8vIEZ1bmN0aW9uIHRoYXQgcHJvY2Vzc2VzIE1heCByZXRyaWVzIGludGVycnVwdCBmcm9tIFRGUAordm9pZCBsaW1IYW5kbGVNYXhSZXRyaWVzSW50ZXJydXB0KHRBTklfVTMyKTsKKworLy8vIEZ1bmN0aW9uIHRoYXQgcHJvY2Vzc2VzIG1lc3NhZ2VzIGRlZmVycmVkIGR1cmluZyBMZWFybiBtb2RlCit2b2lkIGxpbVByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VRdWV1ZSh0cEFuaVNpckdsb2JhbCk7CisKKy8vLyBGdW5jdGlvbiB0aGF0IGRlZmVycyB0aGUgbWVzc2FnZXMgcmVjZWl2ZWQKK3RBTklfVTMyIGxpbURlZmVyTXNnKHRwQW5pU2lyR2xvYmFsLCB0U2lyTXNnUSAqKTsKKworLy8vIEZ1bmN0aW9uIHRoYXQgc2V0cyBzeXN0ZW0gaW50byBzY2FuIG1vZGUKK3ZvaWQgbGltU2V0U2Nhbk1vZGUodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8vLyBGdW5jdGlvbiB0aGF0IFN3aXRjaGVzIHRoZSBDaGFubmVsIGFuZCBzZXRzIHRoZSBDQiBNb2RlIAordm9pZCBsaW1TZXRDaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHRpdGFuSHRjYXAsIHRBTklfVTggY2hhbm5lbCwgdFBvd2VyZEJtIG1heFR4UG93ZXIsIHRBTklfVTggcGVTZXNzaW9uSWQpOworCisvLy8gRnVuY3Rpb24gdGhhdCBjb21wbGV0ZXMgY2hhbm5lbCBzY2FuCit2b2lkIGxpbUNvbXBsZXRlTWxtU2Nhbih0cEFuaVNpckdsb2JhbCwgdFNpclJlc3VsdENvZGVzKTsKKworCisjaWZkZWYgQU5JX1NVUFBPUlRfMTFICisvLy8gRnVuY3Rpb24gdGhhdCBzZW5kcyBNZWFzdXJlbWVudCBSZXBvcnQgYWN0aW9uIGZyYW1lCit0U2lyUmV0U3RhdHVzIGxpbVNlbmRNZWFzUmVwb3J0RnJhbWUodHBBbmlTaXJHbG9iYWwsIHRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lLCB0U2lyTWFjQWRkcik7CisKKy8vLyBGdW5jdGlvbiB0aGF0IHNlbmRzIFRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lCit0U2lyUmV0U3RhdHVzIGxpbVNlbmRUcGNSZXBvcnRGcmFtZSh0cEFuaVNpckdsb2JhbCwgdHBTaXJNYWNUcGNSZXFBY3Rpb25GcmFtZSwgdFNpck1hY0FkZHIpOworI2VuZGlmCisKKy8vLyBGdW5jdGlvbiB0aGF0IHNlbmRzIFRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZQordm9pZCBsaW1TZW5kVHBjUmVxdWVzdEZyYW1lKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjQWRkcik7CisKKy8vIEZ1bmN0aW9uKHMpIHRvIGhhbmRsZSByZXNwb25zZXMgcmVjZWl2ZWQgZnJvbSBIQUwKK3ZvaWQgbGltUHJvY2Vzc01sbUFkZEJzc1JzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgKTsKK3ZvaWQgbGltUHJvY2Vzc01sbUFkZFN0YVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1F0LHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1Qcm9jZXNzTWxtRGVsU3RhUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSApOwordm9pZCBsaW1Qcm9jZXNzTWxtRGVsQnNzUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSx0cFBFU2Vzc2lvbik7CisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAordm9pZCBsaW1Qcm9jZXNzQXBNbG1BZGRTdGFSc3AoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRICk7Cit2b2lkIGxpbVByb2Nlc3NBcE1sbURlbFN0YVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgKTsKK3ZvaWQgbGltUHJvY2Vzc0FwTWxtRGVsQnNzUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnUSApOworI2VuZGlmCit2b2lkIGxpbVByb2Nlc3NTdGFNbG1BZGRTdGFSc3AoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRICx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltUHJvY2Vzc1N0YU1sbURlbFN0YVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbVByb2Nlc3NTdGFNbG1EZWxCc3NSc3AoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2dRICx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltUHJvY2Vzc01sbVNldFN0YUtleVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgKTsKK3ZvaWQgbGltUHJvY2Vzc01sbVNldEJzc0tleVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgKTsKKworCisKKyNpZmRlZiBHRU40X1NDQU4KKy8vIEZ1bmN0aW9uIHRvIHByb2Nlc3MgV0RBX0lOSVRfU0NBTl9SU1AgbWVzc2FnZQordm9pZCBsaW1Qcm9jZXNzSW5pdFNjYW5Sc3AodHBBbmlTaXJHbG9iYWwsICB2b2lkICogKTsKKworLy8gRnVuY3Rpb24gdG8gcHJvY2VzcyBXREFfU1RBUlRfU0NBTl9SU1AgbWVzc2FnZQordm9pZCBsaW1Qcm9jZXNzU3RhcnRTY2FuUnNwKHRwQW5pU2lyR2xvYmFsLCAgdm9pZCAqICk7CisKKy8vIEZ1bmN0aW9uIHRvIHByb2Nlc3MgV0RBX0VORF9TQ0FOX1JTUCBtZXNzYWdlCit2b2lkIGxpbVByb2Nlc3NFbmRTY2FuUnNwKHRwQW5pU2lyR2xvYmFsLCB2b2lkICogKTsKKworLy8gRnVuY3Rpb24gdG8gcHJvY2VzcyBXREFfRklOSVNIX1NDQU5fUlNQIG1lc3NhZ2UKK3ZvaWQgbGltUHJvY2Vzc0ZpbmlzaFNjYW5Sc3AodHBBbmlTaXJHbG9iYWwsICB2b2lkICogKTsKKworLy8gRnVuY3Rpb24gdG8gcHJvY2VzcyBXREFfU1dJVENIX0NIQU5ORUxfUlNQIG1lc3NhZ2UKK3ZvaWQgbGltUHJvY2Vzc1N3aXRjaENoYW5uZWxSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgIHZvaWQgKiApOworICAKK3ZvaWQgbGltU2VuZEhhbEluaXRTY2FuUmVxKCB0cEFuaVNpckdsb2JhbCwgdExpbUxpbUhhbFNjYW5TdGF0ZSwgdFNpckxpbmtUcmFmZmljQ2hlY2spOwordm9pZCBsaW1TZW5kSGFsU3RhcnRTY2FuUmVxKCB0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCwgdExpbUxpbUhhbFNjYW5TdGF0ZSk7Cit2b2lkIGxpbVNlbmRIYWxFbmRTY2FuUmVxKCB0cEFuaVNpckdsb2JhbCwgdEFOSV9VOCwgdExpbUxpbUhhbFNjYW5TdGF0ZSk7Cit2b2lkIGxpbVNlbmRIYWxGaW5pc2hTY2FuUmVxKCB0cEFuaVNpckdsb2JhbCwgdExpbUxpbUhhbFNjYW5TdGF0ZSk7CisKK3ZvaWQgbGltQ29udGludWVQb3N0Q2hhbm5lbFNjYW4odHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGxpbUNvbnRpbnVlQ2hhbm5lbExlYXJuKCB0cEFuaVNpckdsb2JhbCApOworLy9XTEFOX1NVU1BFTkRfTElOSyBSZWxhdGVkCit0QU5JX1U4IGxpbUlzTGlua1N1c3BlbmRlZCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltU3VzcGVuZExpbmsodHBBbmlTaXJHbG9iYWwsIHRTaXJMaW5rVHJhZmZpY0NoZWNrLCBTVVNQRU5EX1JFU1VNRV9MSU5LX0NBTExCQUNLLCB0QU5JX1UzMiopOwordm9pZCBsaW1SZXN1bWVMaW5rKHRwQW5pU2lyR2xvYmFsLCBTVVNQRU5EX1JFU1VNRV9MSU5LX0NBTExCQUNLLCB0QU5JX1UzMiopOworLy9lbmQgV0xBTl9TVVNQRU5EX0xJTksgUmVsYXRlZAorI2VuZGlmIC8vIEdFTjRfU0NBTgorCit0U2lyUmV0U3RhdHVzIGxpbVNlbmRBZGRCQVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cExpbU1sbUFkZEJBUmVxIHBNbG1BZGRCQVJlcSx0cFBFU2Vzc2lvbik7CisKK3RTaXJSZXRTdGF0dXMgbGltU2VuZEFkZEJBUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRwTGltTWxtQWRkQkFSc3AgcE1sbUFkZEJBUnNwLHRwUEVTZXNzaW9uKTsKKwordFNpclJldFN0YXR1cyBsaW1TZW5kRGVsQkFJbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdHBMaW1NbG1EZWxCQVJlcSBwTWxtRGVsQkFSZXEgLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworI2lmIDAKK3RTaXJSZXRTdGF0dXMgbGltU2VuZFNNUG93ZXJTdGF0ZUZyYW1lKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgIHRTaXJNYWNBZGRyIHBlZXIsIHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSBTdGF0ZSApOworI2VuZGlmCisKK3ZvaWQgbGltUHJvY2Vzc01sbUhhbEFkZEJBUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRwU2lyTXNnUSBsaW1Nc2dRICk7CisKK3ZvaWQgbGltUHJvY2Vzc01sbUhhbEJBRGVsZXRlSW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRwU2lyTXNnUSBsaW1Nc2dRICk7CisKK3ZvaWQgbGltUHJvY2Vzc01sbVJlbW92ZUtleVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgKTsKKwordm9pZCBsaW1Qcm9jZXNzTGVhcm5JbnRlcnZhbFRpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworLy8xMXcgU0EgcXVlcnkgcmVxdWVzdCBhY3Rpb24gZnJhbWUgaGFuZGxlcgordFNpclJldFN0YXR1cyBsaW1TZW5kU2FRdWVyeVJlc3BvbnNlRnJhbWUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgIHRBTklfVTE2IHRyYW5zSWQsIHRTaXJNYWNBZGRyIHBlZXIsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKy8vIElubGluZSBmdW5jdGlvbnMKKworLyoqCisgKiBsaW1Qb3N0U21lTWVzc2FnZSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpbVByb2Nlc3NNbG1NZXNzYWdlcygpLiBJbiB0aGlzCisgKiBmdW5jdGlvbiBNTE0gc3ViLW1vZHVsZSBpbnZva2VzIE1MTSBpbmQvY25mIHByaW1pdGl2ZXMuCisgKgorICpMT0dJQzoKKyAqIEluaXRpYWxseSBNTE0gbWFrZXMgYW4gU01FIGZ1bmN0aW9uIGNhbGwgdG8gaW52b2tlIE1MTSBpbmQvY25mCisgKiBwcmltaXRpdmUuIEluIGZ1dHVyZSB0aGlzIGNhbiBiZSBlbmhhbmNlZCB0byAncG9zdCcgbWVzc2FnZXMgdG8gU01FLgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gbXNnVHlwZSAgIEluZGljYXRlcyB0aGUgTUxNIHByaW1pdGl2ZSBtZXNzYWdlIHR5cGUKKyAqIEBwYXJhbSAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitsaW1Qb3N0U21lTWVzc2FnZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBtc2dUeXBlLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKyAgICAgdFNpck1zZ1EgbXNnOworICAgIAorICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOworICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgICAgCisgICAgbXNnLnR5cGUgPSAodEFOSV9VMTYpbXNnVHlwZTsKKyAgICBtc2cuYm9keXB0ciA9IHBNc2dCdWY7CisgICAgbXNnLmJvZHl2YWwgPSAwOworICAgIGlmIChtc2dUeXBlID4gZVdOSV9TTUVfTVNHX1RZUEVTX0JFR0lOKQorICAgICAgICBsaW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMocE1hYywgJm1zZyk7CisgICAgZWxzZQorICAgICAgICBsaW1Qcm9jZXNzTWxtUnNwTWVzc2FnZXMocE1hYywgbXNnVHlwZSwgcE1zZ0J1Zik7Cit9IC8qKiogZW5kIGxpbVBvc3RTbWVNZXNzYWdlKCkgKioqLworCisvKioKKyAqIGxpbVBvc3RNbG1NZXNzYWdlKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1NtZU1lc3NhZ2VzKCkuIEluIHRoaXMKKyAqIGZ1bmN0aW9uIFNNRSBpbnZva2VzIE1MTUUgcHJpbWl0aXZlcy4KKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICogSW5pdGlhbGx5IFNNRSBtYWtlcyBhbiBNTE0gZnVuY3Rpb24gY2FsbCB0byBpbnZva2UgTUxNIHByaW1pdGl2ZS4KKyAqIEluIGZ1dHVyZSB0aGlzIGNhbiBiZSBlbmhhbmNlZCB0byAncG9zdCcgbWVzc2FnZXMgdG8gTUxNLgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gbXNnVHlwZSAgIEluZGljYXRlcyB0aGUgTUxNIHByaW1pdGl2ZSBtZXNzYWdlIHR5cGUKKyAqIEBwYXJhbSAqcE1zZ0J1ZiAgQSBwb2ludGVyIHRvIHRoZSBNTE0gbWVzc2FnZSBidWZmZXIKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitsaW1Qb3N0TWxtTWVzc2FnZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBtc2dUeXBlLCB0QU5JX1UzMiAqcE1zZ0J1ZikKK3sKKworICAgIHRTaXJNc2dRIG1zZzsKKyAgICBpZihwTXNnQnVmID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSxGTCgiQnVmZmVyIGlzIFBvaW50aW5nIHRvIE5VTExcbiIpKTsKKyAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtc2cudHlwZSA9ICh0QU5JX1UxNikgbXNnVHlwZTsKKyAgICBtc2cuYm9keXB0ciA9IHBNc2dCdWY7CisgICAgbXNnLmJvZHl2YWwgPSAwOworICAgIGxpbVByb2Nlc3NNbG1SZXFNZXNzYWdlcyhwTWFjLCAmbXNnKTsKK30gLyoqKiBlbmQgbGltUG9zdE1sbU1lc3NhZ2UoKSAqKiovCisKKworCisvKioKKyAqIGxpbUdldEN1cnJlbnRTY2FuQ2hhbm5lbCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHZhcmlvdXMgcGxhY2VzIHRvIGdldCBjdXJyZW50IGNoYW5uZWwKKyAqIG51bWJlciBiZWluZyBzY2FubmVkLgorICoKKyAqUEFSQU1TOgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIENoYW5uZWwgbnVtYmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdEFOSV9VOAorbGltR2V0Q3VycmVudFNjYW5DaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCAqcENoYW5OdW0gPSBwTWFjLT5saW0uZ3BMaW1NbG1TY2FuUmVxLT5jaGFubmVsTGlzdC5jaGFubmVsTnVtYmVyOworCisgICAgcmV0dXJuICgqKHBDaGFuTnVtICsgcE1hYy0+bGltLmdMaW1DdXJyZW50U2NhbkNoYW5uZWxJZCkpOworfSAvKioqIGVuZCBsaW1HZXRDdXJyZW50U2NhbkNoYW5uZWwoKSAqKiovCisKKworCisvKioKKyAqIGxpbUdldElFbGVuRnJvbUJzc0Rlc2NyaXB0aW9uKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdmFyaW91cyBwbGFjZXMgdG8gZ2V0IElFIGxlbmd0aAorICogZnJvbSB0U2lyQnNzRGVzY3JpcHRpb24gc3RydWN0dXJlCisgKiBudW1iZXIgYmVpbmcgc2Nhbm5lZC4KKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICAgICBwQnNzRGVzY3IKKyAqIEByZXR1cm4gICAgVG90YWwgSUUgbGVuZ3RoCisgKi8KKworc3RhdGljIGlubGluZSB0QU5JX1UxNgorbGltR2V0SUVsZW5Gcm9tQnNzRGVzY3JpcHRpb24odHBTaXJCc3NEZXNjcmlwdGlvbiBwQnNzRGVzY3IpCit7CisgICAgaWYgKCFwQnNzRGVzY3IpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuICgodEFOSV9VMTYpIChwQnNzRGVzY3ItPmxlbmd0aCArIHNpemVvZih0QU5JX1UxNikgKworICAgICAgICAgICAgICAgICAgIHNpemVvZih0QU5JX1UzMikgLSBzaXplb2YodFNpckJzc0Rlc2NyaXB0aW9uKSkpOworfSAvKioqIGVuZCBsaW1HZXRJRWxlbkZyb21Cc3NEZXNjcmlwdGlvbigpICoqKi8KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKy8qKgorICogbGltU2VuZEJlYWNvbkluZCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICB0byBzZW5kIHRoZSBiZWFjb24gaW5kaWNhdGlvbgorICogbnVtYmVyIGJlaW5nIHNjYW5uZWQuCisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorKi8KKwordm9pZCAKK2xpbVNlbmRCZWFjb25JbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKwordm9pZCBsaW1HZXRXUFNQQkNTZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICphZGRyLCB0QU5JX1U4ICp1dWlkX2UsIGVXUFNQQkNPdmVybGFwICpvdmVybGFwLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltV1BTUEJDVGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltV1BTUEJDQ2xvc2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbVJlbW92ZVBCQ1Nlc3Npb25zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHBSZW1vdmVNYWMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKwordFNpclJldFN0YXR1cworbGltSXNTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcVZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcSAqcEdldFdQU1BCQ1Nlc3Npb25zUmVxLCB0QU5JX1U4ICpwQnVmKTsKKworI2RlZmluZSBMSU1fV1BTX09WRVJMQVBfVElNRVJfTVMgICAgICAgICAgICAgICAgIDEwMDAwCisjZW5kaWYKKwordm9pZAorbGltU3VzcGVuZExpbmsodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckxpbmtUcmFmZmljQ2hlY2sgdHJhZmZpY0NoZWNrLCAgU1VTUEVORF9SRVNVTUVfTElOS19DQUxMQkFDSyBjYWxsYmFjaywgdEFOSV9VMzIgKmRhdGEpOwordm9pZAorbGltUmVzdW1lTGluayh0cEFuaVNpckdsb2JhbCBwTWFjLCBTVVNQRU5EX1JFU1VNRV9MSU5LX0NBTExCQUNLIGNhbGxiYWNrLCB0QU5JX1UzMiAqZGF0YSk7CisKK3ZvaWQKK2xpbUNoYW5nZUNoYW5uZWxXaXRoQ2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBuZXdDaGFubmVsLCAKKyAgIENIQU5HRV9DSEFOTkVMX0NBTExCQUNLIGNhbGxiYWNrLCB0QU5JX1UzMiAqY2JkYXRhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKK3ZvaWQgbGltU2VuZFNtZU1nbXRGcmFtZUluZCgKKyAgICAgICAgICAgICAgICAgICAgdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBmcmFtZVR5cGUsCisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICpmcmFtZSwgdEFOSV9VMzIgZnJhbWVMZW4sIHRBTklfVTE2IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgcnhDaGFuKTsKK3ZvaWQgbGltUHJvY2Vzc1JlbWFpbk9uQ2huVGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltU2VuZFAyUEFjdGlvbkZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKTsKK3ZvaWQgbGltQWJvcnRSZW1haW5PbkNoYW4odHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit0U2lyUmV0U3RhdHVzIF9fbGltUHJvY2Vzc1NtZU5vQVVwZGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAqcE1zZ0J1Zik7CisjZW5kaWYKKyNlbmRpZiAvKiBfX0xJTV9UWVBFU19IICovCisKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltVXRpbHMuYyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltVXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzZlYjNhCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1VdGlscy5jCkBAIC0wLDAgKzEsODAzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbVV0aWxzLmNjIGNvbnRhaW5zIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucworICogTElNIHVzZXMuCisgKiBBdXRob3I6ICAgICAgICBDaGFuZHJhIE1vZHVtdWRpCisgKiBEYXRlOiAgICAgICAgICAwMi8xMy8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgInNjaEFwaS5oIgorI2luY2x1ZGUgImxpbVV0aWxzLmgiCisjaW5jbHVkZSAibGltVHlwZXMuaCIKKyNpbmNsdWRlICJsaW1TZWN1cml0eVV0aWxzLmgiCisjaW5jbHVkZSAibGltUHJvcEV4dHNVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlbmRNZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAibGltQWRtaXRDb250cm9sLmgiCisjaW5jbHVkZSAibGltU3RhSGFzaEFwaS5oIgorI2luY2x1ZGUgImRvdDExZi5oIgorI2luY2x1ZGUgIndtbUFwc2QuaCIKKyNpbmNsdWRlICJsaW1UcmFjZS5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisjaW5jbHVkZSAidm9zX2RpYWdfY29yZV9ldmVudC5oIgorI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorI2luY2x1ZGUgImxpbUlic3NQZWVyTWdtdC5oIgorI2luY2x1ZGUgImxpbVNlc3Npb25VdGlscy5oIgorI2luY2x1ZGUgImxpbVNlc3Npb24uaCIKKyNpbmNsdWRlICJ2b3NfbnZpdGVtLmgiCisKKy8qIFN0YXRpYyBnbG9iYWwgdXNlZCB0byBtYXJrIHNpdHVhdGlvbnMgd2hlcmUgcE1hYy0+bGltLmdMaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW5EdXJpbmdRdWlldEJzcyBpcyBTRVQKKyAqIGFuZCBsaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW5EdXJpbmdRdWlldEJzcygpIHJldHVybmVkIGZhaWx1cmUuICBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgc3RvcCBkYXRhCisgKiB0cmFmZmljIGluc3RlYWQgb2YgZ29pbmcgaW50byBzY2FuLiAgVGhlIHJlY292ZXIgZnVuY3Rpb24gbGltUHJvY2Vzc1F1aWV0QnNzVGltZW91dCgpIG5lZWRzIHRvIGhhdmUKKyAqIHRoaXMgaW5mb3JtYXRpb24uICovCitzdGF0aWMgdEFuaUJvb2wgZ2xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzX1N0YXR1cyA9IGVTSVJfVFJVRTsKKworLyogMTFBIENoYW5uZWwgbGlzdCB0byBkZWNvZGUgUlggQkQgY2hhbm5lbCBpbmZvcm1hdGlvbiAqLworc3RhdGljIGNvbnN0IHRBTklfVTggYWJDaGFubmVsW109IHszNiw0MCw0NCw0OCw1Miw1Niw2MCw2NCwxMDAsMTA0LDEwOCwxMTIsMTE2LAorICAgICAgICAgICAgMTIwLDEyNCwxMjgsMTMyLDEzNiwxNDAsMTQ5LDE1MywxNTcsMTYxLDE2NX07CisKKy8vI2RlZmluZSBMSU1fTUFYX0FDVElWRV9TRVNTSU9OUyAzICAvL2RlZmluZWQgdGVtcG9yYXJpbHkgZm9yIEJULUFNUCBTVVBQT1JUIAorI2RlZmluZSBTVUNDRVNTIDEgICAgICAgICAgICAgICAgICAgLy9kZWZpbmVkIHRlbXBvcmFyaWx5IGZvciBCVC1BTVAKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1Bc3NpZ25EaWFsb2d1ZVRva2VuCitcYnJpZWYgQXNzaWducyBkaWFsb2d1ZSB0b2tlbi4KK1xwYXJhbSAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworXHJldHVybiB0cERpYWxvZ3VlVG9rZW4gLSBkaWFsb2d1ZVRva2VuIGRhdGEgc3RydWN0dXJlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHBEaWFsb2d1ZVRva2VuCitsaW1Bc3NpZ25EaWFsb2d1ZVRva2VuKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgc3RhdGljIHRBTklfVTggdG9rZW4gPSAwOworICAgIHRwRGlhbG9ndWVUb2tlbiBwQ3Vyck5vZGU7CisgICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgICAgIHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSAmcEN1cnJOb2RlLCBzaXplb2YodERpYWxvZ3VlVG9rZW4pKSkKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZFxuIikpOykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSBwQ3Vyck5vZGUsIHNpemVvZih0RGlhbG9ndWVUb2tlbikpOworICAgIC8vZmlyc3Qgbm9kZSBpbiB0aGUgbGlzdCBpcyBiZWluZyBhZGRlZC4KKyAgICBpZihOVUxMID09IHBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlbkhlYWQpCisgICAgeworICAgICAgICBwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5IZWFkID0gcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuVGFpbCA9IHBDdXJyTm9kZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuVGFpbC0+bmV4dCA9IHBDdXJyTm9kZTsKKyAgICAgICAgcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuVGFpbCA9IHBDdXJyTm9kZTsKKyAgICB9CisgICAgLy9hc3NvY0lkIGFuZCB0aWQgb2YgdGhlIG5vZGUgd2lsbCBiZSBmaWxsZWQgaW4gYnkgY2FsbGVyLgorICAgIHBDdXJyTm9kZS0+bmV4dCA9IE5VTEw7CisgICAgcEN1cnJOb2RlLT50b2tlbiA9IHRva2VuKys7CisgICAgUEVMT0c0KGxpbUxvZyhwTWFjLCBMT0c0LCBGTCgidG9rZW4gYXNzaWduZWQgPSAlZFxuIiksIHRva2VuKTspICAgIAorICAgIHJldHVybiBwQ3Vyck5vZGU7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltU2VhcmNoQW5kRGVsZXRlRGlhbG9ndWVUb2tlbgorXGJyaWVmIHNlYXJjaCBkaWFsb2d1ZSB0b2tlbiBpbiB0aGUgbGlzdCBhbmQgZGVsZXRlcyBpdCBpZiBmb3VuZC4gcmV0dXJucyBmYWlsdXJlIGlmIG5vdCBmb3VuZC4KK1xwYXJhbSAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworXHBhcmFtICAgICB0QU5JX1U4IHRva2VuCitccGFyYW0gICAgIHRBTklfVTE2IGFzc29jSWQKK1xwYXJhbSAgICAgdEFOSV9VMTYgdGlkCitccmV0dXJuIGVTaXJSZXRTdGF0dXMgLSBzdGF0dXMgb2YgdGhlIHNlYXJjaAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCit0U2lyUmV0U3RhdHVzCitsaW1TZWFyY2hBbmREZWxldGVEaWFsb2d1ZVRva2VuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggdG9rZW4sIHRBTklfVTE2IGFzc29jSWQsIHRBTklfVTE2IHRpZCkKK3sKKyAgICB0cERpYWxvZ3VlVG9rZW4gcEN1cnJOb2RlID0gcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuSGVhZDsKKyAgICB0cERpYWxvZ3VlVG9rZW4gcFByZXZOb2RlID0gcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuSGVhZDsKKworICAgIC8vaWYgdGhlIGxpc3QgaXMgZW1wdHkKKyAgICBpZihOVUxMID09IHBDdXJyTm9kZSkKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvLyBpZiB0aGUgbWF0Y2hpbmcgbm9kZSBpcyB0aGUgZmlyc3Qgbm9kZS4KKyAgICBpZihwQ3Vyck5vZGUgJiYKKyAgICAgICAgKGFzc29jSWQgPT0gcEN1cnJOb2RlLT5hc3NvY0lkKSAmJgorICAgICAgICAodGlkID09IHBDdXJyTm9kZS0+dGlkKSkKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlbkhlYWQgPSBwQ3Vyck5vZGUtPm5leHQ7ICAgICAgICAKKyAgICAgICAgLy90aGVyZSB3YXMgb25seSBvbmUgbm9kZSBpbiB0aGUgbGlzdC4gU28gdGFpbCBwb2ludGVyIGFsc28gbmVlZHMgdG8gYmUgYWRqdXN0ZWQuCisgICAgICAgIGlmKE5VTEwgPT0gcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuSGVhZCkKKyAgICAgICAgICAgIHBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlblRhaWwgPSBOVUxMOworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBDdXJyTm9kZSk7CisgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgfQorCisgICAgLy9maXJzdCBub2RlIGRpZCBub3QgbWF0Y2guIHNvIG1vdmUgdG8gdGhlIG5leHQgb25lLgorICAgIHBDdXJyTm9kZSA9IHBDdXJyTm9kZS0+bmV4dDsKKyAgICB3aGlsZShOVUxMICE9IHBDdXJyTm9kZSApCisgICAgeworICAgICAgICBpZih0b2tlbiA9PSBwQ3Vyck5vZGUtPnRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBQcmV2Tm9kZSA9IHBDdXJyTm9kZTsKKyAgICAgICAgcEN1cnJOb2RlID0gcEN1cnJOb2RlLT5uZXh0OworICAgIH0KKworICAgIGlmKHBDdXJyTm9kZSAmJgorICAgICAgICAoYXNzb2NJZCA9PSBwQ3Vyck5vZGUtPmFzc29jSWQpICYmCisgICAgICAgICh0aWQgPT0gcEN1cnJOb2RlLT50aWQpKQorICAgIHsKKyAgICAgICAgcFByZXZOb2RlLT5uZXh0ID0gcEN1cnJOb2RlLT5uZXh0OworICAgICAgICAvL2lmIHRoZSBub2RlIGJlaW5nIGRlbGV0ZWQgaXMgdGhlIGxhc3Qgb25lIHRoZW4gd2UgYWxzbyBuZWVkIHRvIG1vdmUgdGhlIHRhaWwgcG9pbnRlciB0byB0aGUgcHJldk5vZGUuCisgICAgICAgIGlmKE5VTEwgPT0gcEN1cnJOb2RlLT5uZXh0KQorICAgICAgICAgICAgICBwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5UYWlsID0gcFByZXZOb2RlOworICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgIH0KKworICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkxJTSBkb2VzIG5vdCBoYXZlIG1hdGNoaW5nIGRpYWxvZ3VlIHRva2VuIG5vZGVcbiIpKTspCisgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworfQorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltRGVsZXRlRGlhbG9ndWVUb2tlbkxpc3QKK1xicmllZiBkZWxldGVzIHRoZSBjb21wbGV0ZSBsaW0gZGlhbG9ndWUgdG9rZW4gbGlua2VkIGxpc3QuCitccGFyYW0gICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xyZXR1cm4gICAgIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1EZWxldGVEaWFsb2d1ZVRva2VuTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRwRGlhbG9ndWVUb2tlbiBwQ3Vyck5vZGUgPSBwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5IZWFkOworCisgICAgd2hpbGUoTlVMTCAhPSBwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5IZWFkKQorICAgIHsKKyAgICAgICAgcEN1cnJOb2RlID0gcE1hYy0+bGltLnBEaWFsb2d1ZVRva2VuSGVhZDsgICAgCisgICAgICAgIHBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlbkhlYWQgPSBwTWFjLT5saW0ucERpYWxvZ3VlVG9rZW5IZWFkLT5uZXh0OworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBDdXJyTm9kZSk7CisgICAgICAgIHBDdXJyTm9kZSA9IE5VTEw7CisgICAgfQorICAgIHBNYWMtPmxpbS5wRGlhbG9ndWVUb2tlblRhaWwgPSBOVUxMOworfQorCit2b2lkCitsaW1HZXRCc3NpZEZyb21CRCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICogcFJ4UGFja2V0SW5mbywgdEFOSV9VOCAqYnNzSWQsIHRBTklfVTMyICpwSWdub3JlKQoreworICAgIHRwU2lyTWFjRGF0YUhkcjNhIHBNaCA9IFdEQV9HRVRfUlhfTVBEVUhFQURFUjNBKHBSeFBhY2tldEluZm8pOworICAgICpwSWdub3JlID0gMDsKKworICAgIGlmIChwTWgtPmZjLnRvRFMgPT0gMSAmJiBwTWgtPmZjLmZyb21EUyA9PSAwKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgYnNzSWQsIHBNaC0+YWRkcjEsIDYpOworICAgICAgICAqcElnbm9yZSA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKHBNaC0+ZmMudG9EUyA9PSAwICYmIHBNaC0+ZmMuZnJvbURTID09IDEpCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBic3NJZCwgcE1oLT5hZGRyMiwgNik7CisgICAgICAgICpwSWdub3JlID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAocE1oLT5mYy50b0RTID09IDAgJiYgcE1oLT5mYy5mcm9tRFMgPT0gMCkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIGJzc0lkLCBwTWgtPmFkZHIzLCA2KTsKKyAgICAgICAgKnBJZ25vcmUgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBic3NJZCwgcE1oLT5hZGRyMSwgNik7CisgICAgICAgICpwSWdub3JlID0gMTsKKyAgICB9Cit9CisKK2NoYXIgKgorbGltTWxtU3RhdGVTdHIodExpbU1sbVN0YXRlcyBzdGF0ZSkKK3sKKworI2lmZGVmIEZJWE1FX0dFTjYKKyAgICBzd2l0Y2ggKHN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBlTElNX01MTV9PRkZMSU5FX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX01MTV9PRkZMSU5FX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fTUxNX0lETEVfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fTUxNX0lETEVfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fV1RfUFJPQkVfUkVTUF9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9QQVNTSVZFX1NDQU5fU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fTUxNX1BBU1NJVkVfU0NBTl9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9KT0lOX0JFQUNPTl9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fV1RfSk9JTl9CRUFDT05fU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fSk9JTkVEX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX01MTV9KT0lORURfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fQlNTX1NUQVJURURfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fTUxNX0JTU19TVEFSVEVEX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fTUxNX1dUX0FVVEhfRlJBTUUyX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX01MTV9XVF9BVVRIX0ZSQU1FMl9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9BVVRIX0ZSQU1FM19TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTNfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fV1RfQVVUSF9GUkFNRTRfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fTUxNX1dUX0FVVEhfRlJBTUU0X1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fTUxNX0FVVEhfUlNQX1RJTUVPVVRfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fTUxNX0FVVEhfUlNQX1RJTUVPVVRfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fQVVUSEVOVElDQVRFRF9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9BU1NPQ19SU1BfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fTUxNX1dUX0FTU09DX1JTUF9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9SRUFTU09DX1JTUF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fV1RfUkVBU1NPQ19SU1BfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fV1RfRlRfUkVBU1NPQ19SU1BfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fTUxNX1dUX0ZUX1JFQVNTT0NfUlNQX1NUQVRFIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9ERUxfU1RBX1JTUF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fV1RfREVMX1NUQV9SU1BfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fV1RfREVMX0JTU19SU1BfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fTUxNX1dUX0RFTF9CU1NfUlNQX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fTUxNX1dUX0FERF9TVEFfUlNQX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX01MTV9XVF9BRERfU1RBX1JTUF9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9BRERfQlNTX1JTUF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fUkVBU1NPQ0lBVEVEX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX01MTV9SRUFTU09DSUFURURfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9BU1NPQ19DTkZfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fTUxNX1dUX0FTU09DX0NORl9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9BRERfQlNTX1JTUF9BU1NPQ19TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfQVNTT0NfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUkVBU1NPQ19TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fV1RfQUREX0JTU19SU1BfUkVBU1NPQ19TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9BRERfQlNTX1JTUF9GVF9SRUFTU09DX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX01MTV9XVF9BRERfQlNTX1JTUF9GVF9SRUFTU09DX1NUQVRFIjsKKyAgICAgICAgY2FzZSBlTElNX01MTV9XVF9BU1NPQ19ERUxfU1RBX1JTUF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9NTE1fV1RfQVNTT0NfREVMX1NUQV9SU1BfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9NTE1fV1RfU0VUX0JTU19LRVlfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fTUxNX1dUX1NFVF9CU1NfS0VZX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fTUxNX1dUX1NFVF9TVEFfS0VZX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX01MTV9XVF9TRVRfU1RBX0tFWV9TVEFURVxuIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiSU5WQUxJRCBNTE0gc3RhdGVcbiI7CisgICAgfQorI2VuZGlmCityZXR1cm4gIiI7Cit9CisKK3ZvaWQKK2xpbVByaW50TWxtU3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgbG9nTGV2ZWwsIHRMaW1NbG1TdGF0ZXMgc3RhdGUpCit7CisgICAgbGltTG9nKHBNYWMsIGxvZ0xldmVsLCBsaW1NbG1TdGF0ZVN0cihzdGF0ZSkpOworfQorCitjaGFyICoKK2xpbVNtZVN0YXRlU3RyKHRMaW1TbWVTdGF0ZXMgc3RhdGUpCit7CisjaWZkZWYgRklYTUVfR0VONgorICAgIHN3aXRjaCAoc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fU01FX09GRkxJTkVfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fU01FX09GRkxJTkVfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9TTUVfSURMRV9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9TTUVfSURMRV9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX1NNRV9TVVNQRU5EX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9TVVNQRU5EX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fU01FX1dUX1NDQU5fU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fU01FX1dUX1NDQU5fU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9TTUVfV1RfSk9JTl9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9TTUVfV1RfSk9JTl9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX1NNRV9XVF9BVVRIX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9XVF9BVVRIX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fU01FX1dUX0FTU09DX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9XVF9BU1NPQ19TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9XVF9SRUFTU09DX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fU01FX1dUX1JFQVNTT0NfTElOS19GQUlMX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9XVF9SRUFTU09DX0xJTktfRkFJTF9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX1NNRV9KT0lOX0ZBSUxVUkVfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fU01FX0pPSU5fRkFJTFVSRV9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9BU1NPQ0lBVEVEX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fU01FX1JFQVNTT0NJQVRFRF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9TTUVfUkVBU1NPQ0lBVEVEX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fU01FX0xJTktfRVNUX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9MSU5LX0VTVF9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX1NNRV9MSU5LX0VTVF9XVF9TQ0FOX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9MSU5LX0VTVF9XVF9TQ0FOX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fU01FX1dUX1BSRV9BVVRIX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9XVF9QUkVfQVVUSF9TVEFURVxuIjsKKyAgICAgICAgY2FzZSBlTElNX1NNRV9XVF9ESVNBU1NPQ19TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9TTUVfV1RfRElTQVNTT0NfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9TTUVfV1RfREVBVVRIX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9XVF9ERUFVVEhfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9TTUVfV1RfU1RBUlRfQlNTX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlTElNX1NNRV9XVF9TVEFSVF9CU1NfU1RBVEVcbiI7CisgICAgICAgIGNhc2UgZUxJTV9TTUVfV1RfU1RPUF9CU1NfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fU01FX1dUX1NUT1BfQlNTX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fU01FX05PUk1BTF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9TTUVfTk9STUFMX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fU01FX0NIQU5ORUxfU0NBTl9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZUxJTV9TTUVfQ0hBTk5FTF9TQ0FOX1NUQVRFXG4iOworICAgICAgICBjYXNlIGVMSU1fU01FX05PUk1BTF9DSEFOTkVMX1NDQU5fU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gImVMSU1fU01FX05PUk1BTF9DSEFOTkVMX1NDQU5fU1RBVEVcbiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIklOVkFMSUQgU01FIHN0YXRlXG4iOworICAgIH0KKyNlbmRpZgorcmV0dXJuICIiOworfQorCisKK2NoYXIqIGxpbURvdDExTW9kZVN0cih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGRvdDExTW9kZSkKK3sKKyNpZmRlZiBGSVhNRV9HRU42CisKKyAgICBzd2l0Y2goZG90MTFNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRE9UMTFfTU9ERV9BTEw6CisgICAgICAgICAgICAgICAgcmV0dXJuICJBTExcbiI7CisgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUE6CisgICAgICAgICAgICAgICAgcmV0dXJuICIxMUFcbiI7CisgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUI6ICAKKyAgICAgICAgICAgICAgICByZXR1cm4gIjExQlxuIjsKKyAgICAgICAgICAgIGNhc2UgV05JX0NGR19ET1QxMV9NT0RFXzExRzogIAorICAgICAgICAgICAgICAgIHJldHVybiAiMTFHXG4iOworICAgICAgICAgICAgY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfMTFOOiAgCisgICAgICAgICAgICAgICAgcmV0dXJuICIxMU5cbiI7CisgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRE9UMTFfTU9ERV9QT0xBUklTOiAgCisgICAgICAgICAgICAgICAgcmV0dXJuICJQb2xhcmlzXG4iOworICAgICAgICAgICAgY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfVElUQU46ICAKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRpdGFuXG4iOworICAgICAgICAgICAgY2FzZSBXTklfQ0ZHX0RPVDExX01PREVfVEFVUlVTOgorICAgICAgICAgICAgICAgIHJldHVybiAiVGF1cnVzXG4iOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgRG90MTEgTW9kZVxuIjsKKyAgICAgICAgfQorI2VuZGlmCityZXR1cm4gIiI7Cit9CisKKworY2hhciogbGltU3RhT3BSYXRlTW9kZVN0cih0U3RhUmF0ZU1vZGUgb3BSYXRlTW9kZSkKK3sKKyNpZmRlZiBGSVhNRV9HRU42CisKKyAgICBzd2l0Y2gob3BSYXRlTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBlU1RBX1RBVVJVUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRhdXJ1c1xuIjsKKyAgICAgICAgICAgIGNhc2UgZVNUQV8xMWE6CisgICAgICAgICAgICAgICAgcmV0dXJuICIxMUFcbiI7CisgICAgICAgICAgICBjYXNlIGVTVEFfMTFiOiAgCisgICAgICAgICAgICAgICAgcmV0dXJuICIxMUJcbiI7CisgICAgICAgICAgICBjYXNlIGVTVEFfMTFiZzogIAorICAgICAgICAgICAgICAgIHJldHVybiAiMTFHXG4iOworICAgICAgICAgICAgY2FzZSBlU1RBXzExbjogIAorICAgICAgICAgICAgICAgIHJldHVybiAiMTFOXG4iOworICAgICAgICAgICAgY2FzZSBlU1RBX1BPTEFSSVM6ICAKKyAgICAgICAgICAgICAgICByZXR1cm4gIlBvbGFyaXNcbiI7CisgICAgICAgICAgICBjYXNlIGVTVEFfVElUQU46CisgICAgICAgICAgICAgICAgcmV0dXJuICJUaXRhblxuIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIERvdDExIE1vZGVcbiI7CisgICAgICAgIH0KKyNlbmRpZgorcmV0dXJuICIiOworfQorCitjaGFyKiBsaW1Cc3NUeXBlU3RyKHRTaXJCc3NUeXBlIGJzc1R5cGUpCit7CisgICAgc3dpdGNoKGJzc1R5cGUpCisgICAgeworICAgICAgICBjYXNlIGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9JTkZSQVNUUlVDVFVSRV9NT0RFIjsKKyAgICAgICAgY2FzZSBlU0lSX0lCU1NfTU9ERToKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9JQlNTX01PREUiOworICAgICAgICBjYXNlIGVTSVJfQlRBTVBfU1RBX01PREU6ICAKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9CVEFNUF9TVEFfTU9ERSI7CisgICAgICAgIGNhc2UgZVNJUl9CVEFNUF9BUF9NT0RFOiAgCisgICAgICAgICAgICByZXR1cm4gImVTSVJfQlRBTVBfQVBfTU9ERSI7CisgICAgICAgIGNhc2UgZVNJUl9BVVRPX01PREU6ICAKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9BVVRPX01PREUiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIEJTUyBUeXBlIjsKKyAgICB9Cit9CisKK3ZvaWQKK2xpbVByaW50U21lU3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgbG9nTGV2ZWwsIHRMaW1TbWVTdGF0ZXMgc3RhdGUpCit7CisgICAgbGltTG9nKHBNYWMsIGxvZ0xldmVsLCBsaW1TbWVTdGF0ZVN0cihzdGF0ZSkpOworfQorCitjaGFyICpsaW1Nc2dTdHIodEFOSV9VMzIgbXNnVHlwZSkKK3sKKyNpZmRlZiBGSVhNRV9HRU42CisgICAgc3dpdGNoIChtc2dUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TVEFSVF9SRVE6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX1NUQVJUX1JFUVxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TVEFSVF9SU1A6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX1NUQVJUX1JTUFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TWVNfUkVBRFlfSU5EOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9TWVNfUkVBRFlfSU5EXG4iOworICAgICAgICBjYXNlIGVXTklfU01FX1NDQU5fUkVROgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9TQ0FOX1JFUVxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TQ0FOX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfU0NBTl9SU1BcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfSk9JTl9SRVE6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX0pPSU5fUkVRXG4iOworICAgICAgICBjYXNlIGVXTklfU01FX0pPSU5fUlNQOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9KT0lOX1JTUFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TRVRDT05URVhUX1JFUToKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfU0VUQ09OVEVYVF9SRVFcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU0VUQ09OVEVYVF9SU1A6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX1NFVENPTlRFWFRfUlNQXG4iOworICAgICAgICBjYXNlIGVXTklfU01FX1JFQVNTT0NfUkVROgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9SRUFTU09DX1JFUVxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9SRUFTU09DX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfUkVBU1NPQ19SU1BcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfQVVUSF9SRVE6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX0FVVEhfUkVRXG4iOworICAgICAgICBjYXNlIGVXTklfU01FX0FVVEhfUlNQOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9BVVRIX1JTUFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ESVNBU1NPQ19SRVE6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX0RJU0FTU09DX1JFUVxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ESVNBU1NPQ19SU1A6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX0RJU0FTU09DX1JTUFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ESVNBU1NPQ19JTkQ6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX0RJU0FTU09DX0lORFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ESVNBU1NPQ19DTkY6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX0RJU0FTU09DX0NORlxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ERUFVVEhfUkVROgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9ERUFVVEhfUkVRXG4iOworICAgICAgICBjYXNlIGVXTklfU01FX0RFQVVUSF9SU1A6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX0RFQVVUSF9SU1BcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfREVBVVRIX0lORDoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfREVBVVRIX0lORFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9XTV9TVEFUVVNfQ0hBTkdFX05URjoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfV01fU1RBVFVTX0NIQU5HRV9OVEZcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1RBUlRfQlNTX1JFUToKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfU1RBUlRfQlNTX1JFUVxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TVEFSVF9CU1NfUlNQOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9TVEFSVF9CU1NfUlNQXG4iOworICAgICAgICBjYXNlIGVXTklfU01FX0FVVEhfSU5EOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9BVVRIX0lORFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9BU1NPQ19JTkQ6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX0FTU09DX0lORFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9BU1NPQ19DTkY6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX0FTU09DX0NORlxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9SRUFTU09DX0lORDoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfUkVBU1NPQ19JTkRcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfUkVBU1NPQ19DTkY6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX1JFQVNTT0NfQ05GXG4iOworICAgICAgICBjYXNlIGVXTklfU01FX1NXSVRDSF9DSExfUkVROgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9TV0lUQ0hfQ0hMX1JFUVxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TV0lUQ0hfQ0hMX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfU1dJVENIX0NITF9SU1BcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1dJVENIX0NITF9DQl9QUklNQVJZX1JFUToKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfU1dJVENIX0NITF9DQl9QUklNQVJZX1JFUVxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TV0lUQ0hfQ0hMX0NCX1NFQ09OREFSWV9SRVE6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX1NXSVRDSF9DSExfQ0JfU0VDT05EQVJZX1JFUVxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TVE9QX0JTU19SRVE6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX1NUT1BfQlNTX1JFUVxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TVE9QX0JTU19SU1A6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX1NUT1BfQlNTX1JTUFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9QUk9NSVNDVU9VU19NT0RFX1JFUToKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfUFJPTUlTQ1VPVVNfTU9ERV9SRVFcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfUFJPTUlTQ1VPVVNfTU9ERV9SU1A6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX1BST01JU0NVT1VTX01PREVfUlNQXG4iOworICAgICAgICBjYXNlIGVXTklfU01FX05FSUdIQk9SX0JTU19JTkQ6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX05FSUdIQk9SX0JTU19JTkRcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfTUVBU1VSRU1FTlRfUkVROgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9NRUFTVVJFTUVOVF9SRVFcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfTUVBU1VSRU1FTlRfUlNQOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9NRUFTVVJFTUVOVF9SU1BcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfTUVBU1VSRU1FTlRfSU5EOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9NRUFTVVJFTUVOVF9JTkRcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfU0VUX1dEU19JTkZPX1JFUToKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfU0VUX1dEU19JTkZPX1JFUVxuIjsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TRVRfV0RTX0lORk9fUlNQOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9TRVRfV0RTX0lORk9fUlNQXG4iOworICAgICAgICBjYXNlIGVXTklfU01FX1dEU19JTkZPX0lORDoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9TTUVfV0RTX0lORk9fSU5EXG4iOworICAgICAgICBjYXNlIGVXTklfU01FX0RFQVVUSF9DTkY6CisgICAgICAgICAgICByZXR1cm4gImVXTklfU01FX0RFQVVUSF9DTkZcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfTUlDX0ZBSUxVUkVfSU5EOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9NSUNfRkFJTFVSRV9JTkRcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfQUREVFNfUkVROgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9BRERUU19SRVFcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfQUREVFNfUlNQOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9BRERUU19SU1BcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfQUREVFNfQ05GOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9BRERUU19DTkZcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfQUREVFNfSU5EOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9BRERUU19JTkRcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfREVMVFNfUkVROgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9ERUxUU19SRVFcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfREVMVFNfUlNQOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9ERUxUU19SU1BcbiI7CisgICAgICAgIGNhc2UgZVdOSV9TTUVfREVMVFNfSU5EOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1NNRV9ERUxUU19JTkRcbiI7CisKKyAgICAgICAgY2FzZSBTSVJfTElNX1JFU1VNRV9BQ1RJVklUWV9OVEY6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9MSU1fUkVTVU1FX0FDVElWSVRZX05URlxuIjsKKyAgICAgICAgY2FzZSBTSVJfTElNX1NVU1BFTkRfQUNUSVZJVFlfUkVROgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX1NVU1BFTkRfQUNUSVZJVFlfUkVRXG4iOworICAgICAgICBjYXNlIFdEQV9TVVNQRU5EX0FDVElWSVRZX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiV0RBX1NVU1BFTkRfQUNUSVZJVFlfUlNQXG4iOworICAgICAgICBjYXNlIFNJUl9MSU1fUkVUUllfSU5URVJSVVBUX01TRzoKKyAgICAgICAgICAgIHJldHVybiAiU0lSX0xJTV9SRVRSWV9JTlRFUlJVUFRfTVNHXG4iOworICAgICAgICBjYXNlIFNJUl9CQl9YUE9SVF9NR01UX01TRzoKKyAgICAgICAgICAgIHJldHVybiAiU0lSX0JCX1hQT1JUX01HTVRfTVNHXG4iOworICAgICAgICBjYXNlIFNJUl9MSU1fSU5WX0tFWV9JTlRFUlJVUFRfTVNHOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX0lOVl9LRVlfSU5URVJSVVBUX01TR1xuIjsKKyAgICAgICAgY2FzZSBTSVJfTElNX0tFWV9JRF9JTlRFUlJVUFRfTVNHOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX0tFWV9JRF9JTlRFUlJVUFRfTVNHXG4iOworICAgICAgICBjYXNlIFNJUl9MSU1fUkVQTEFZX1RIUkVTX0lOVEVSUlVQVF9NU0c6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9MSU1fUkVQTEFZX1RIUkVTX0lOVEVSUlVQVF9NU0dcbiI7CisgICAgICAgIGNhc2UgU0lSX0xJTV9NSU5fQ0hBTk5FTF9USU1FT1VUOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX01JTl9DSEFOTkVMX1RJTUVPVVRcbiI7CisgICAgICAgIGNhc2UgU0lSX0xJTV9NQVhfQ0hBTk5FTF9USU1FT1VUOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX01BWF9DSEFOTkVMX1RJTUVPVVRcbiI7CisgICAgICAgIGNhc2UgU0lSX0xJTV9KT0lOX0ZBSUxfVElNRU9VVDoKKyAgICAgICAgICAgIHJldHVybiAiU0lSX0xJTV9KT0lOX0ZBSUxfVElNRU9VVFxuIjsKKyAgICAgICAgY2FzZSBTSVJfTElNX0FVVEhfRkFJTF9USU1FT1VUOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX0FVVEhfRkFJTF9USU1FT1VUXG4iOworICAgICAgICBjYXNlIFNJUl9MSU1fQVVUSF9SU1BfVElNRU9VVDoKKyAgICAgICAgICAgIHJldHVybiAiU0lSX0xJTV9BVVRIX1JTUF9USU1FT1VUXG4iOworICAgICAgICBjYXNlIFNJUl9MSU1fQVNTT0NfRkFJTF9USU1FT1VUOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX0FTU09DX0ZBSUxfVElNRU9VVFxuIjsKKyAgICAgICAgY2FzZSBTSVJfTElNX1JFQVNTT0NfRkFJTF9USU1FT1VUOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX1JFQVNTT0NfRkFJTF9USU1FT1VUXG4iOworICAgICAgICBjYXNlIFNJUl9MSU1fSEVBUlRfQkVBVF9USU1FT1VUOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX0hFQVJUX0JFQVRfVElNRU9VVFxuIjsKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisgICAgICAgIGNhc2UgU0lSX0xJTV9QUkVBVVRIX0NMTlVQX1RJTUVPVVQ6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9MSU1fUFJFQVVUSF9DTE5VUF9USU1FT1VUXG4iOworI2VuZGlmCisgICAgICAgIGNhc2UgU0lSX0xJTV9BRERUU19SU1BfVElNRU9VVDoKKyAgICAgICAgICAgIHJldHVybiAiU0lSX0xJTV9BRERUU19SU1BfVElNRU9VVFxuIjsKKyAgICAgICAgY2FzZSBTSVJfTElNX0NIQU5ORUxfU0NBTl9USU1FT1VUOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX0NIQU5ORUxfU0NBTl9USU1FT1VUXG4iOworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgJiYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpCisgICAgICAgIGNhc2UgU0lSX0xJTV9NRUFTVVJFTUVOVF9JTkRfVElNRU9VVDoKKyAgICAgICAgICAgIHJldHVybiAiU0lSX0xJTV9NRUFTVVJFTUVOVF9JTkRfVElNRU9VVFxuIjsKKyAgICAgICAgY2FzZSBTSVJfTElNX0xFQVJOX0lOVEVSVkFMX1RJTUVPVVQ6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9MSU1fTEVBUk5fSU5URVJWQUxfVElNRU9VVFxuIjsKKyAgICAgICAgY2FzZSBTSVJfTElNX0xFQVJOX0RVUkFUSU9OX1RJTUVPVVQ6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9MSU1fTEVBUk5fRFVSQVRJT05fVElNRU9VVFxuIjsKKyNlbmRpZgorICAgICAgICBjYXNlIFNJUl9MSU1fTElOS19URVNUX0RVUkFUSU9OX1RJTUVPVVQ6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9MSU1fTElOS19URVNUX0RVUkFUSU9OX1RJTUVPVVRcbiI7CisgICAgICAgIGNhc2UgU0lSX0xJTV9IQVNIX01JU1NfVEhSRVNfVElNRU9VVDoKKyAgICAgICAgICAgIHJldHVybiAiU0lSX0xJTV9IQVNIX01JU1NfVEhSRVNfVElNRU9VVFxuIjsKKyAgICAgICAgY2FzZSBTSVJfTElNX0tFRVBBTElWRV9USU1FT1VUOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX0tFRVBBTElWRV9USU1FT1VUXG4iOworICAgICAgICBjYXNlIFNJUl9MSU1fVVBEQVRFX09MQkNfQ0FDSEVMX1RJTUVPVVQ6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9MSU1fVVBEQVRFX09MQkNfQ0FDSEVMX1RJTUVPVVRcbiI7CisgICAgICAgIGNhc2UgU0lSX0xJTV9DTkZfV0FJVF9USU1FT1VUOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX0NORl9XQUlUX1RJTUVPVVRcbiI7CisgICAgICAgIGNhc2UgU0lSX0xJTV9SQURBUl9ERVRFQ1RfSU5EOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfTElNX1JBREFSX0RFVEVDVF9JTkRcbiI7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgY2FzZSBTSVJfTElNX0ZUX1BSRUFVVEhfUlNQX1RJTUVPVVQ6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9MSU1fRlRfUFJFQVVUSF9SU1BfVElNRU9VVFxuIjsKKyNlbmRpZgorCisgICAgICAgIGNhc2UgU0lSX0hBTF9BUFBfU0VUVVBfTlRGOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfSEFMX0FQUF9TRVRVUF9OVEZcbiI7CisgICAgICAgIGNhc2UgU0lSX0hBTF9JTklUSUFMX0NBTF9GQUlMRURfTlRGOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfSEFMX0lOSVRJQUxfQ0FMX0ZBSUxFRF9OVEZcbiI7CisgICAgICAgIGNhc2UgU0lSX0hBTF9OSUNfT1BFUl9OVEY6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9IQUxfTklDX09QRVJfTlRGXG4iOworICAgICAgICBjYXNlIFNJUl9IQUxfSU5JVF9TVEFSVF9SRVE6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9IQUxfSU5JVF9TVEFSVF9SRVFcbiI7CisgICAgICAgIGNhc2UgU0lSX0hBTF9TSFVURE9XTl9SRVE6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9IQUxfU0hVVERPV05fUkVRXG4iOworICAgICAgICBjYXNlIFNJUl9IQUxfU0hVVERPV05fQ05GOgorICAgICAgICAgICAgcmV0dXJuICJTSVJfSEFMX1NIVVRET1dOX0NORlxuIjsKKyAgICAgICAgY2FzZSBTSVJfSEFMX1JFU0VUX1JFUToKKyAgICAgICAgICAgIHJldHVybiAiU0lSX0hBTF9SRVNFVF9SRVFcbiI7CisgICAgICAgIGNhc2UgU0lSX0hBTF9SRVNFVF9DTkY6CisgICAgICAgICAgICByZXR1cm4gIlNJUl9IQUxfUkVTRVRfQ05GXG4iOworICAgICAgICBjYXNlIFNJUl9XUklURV9UT19URDoKKyAgICAgICAgICAgIHJldHVybiAiU0lSX1dSSVRFX1RPX1REXG4iOworCisgICAgICAgIGNhc2UgV05JX0NGR19QQVJBTV9VUERBVEVfSU5EOgorICAgICAgICAgICAgcmV0dXJuICJXTklfQ0ZHX1BBUkFNX1VQREFURV9JTkRcbiI7CisgICAgICAgIGNhc2UgV05JX0NGR19ETkxEX1JFUToKKyAgICAgICAgICAgIHJldHVybiAiV05JX0NGR19ETkxEX1JFUVxuIjsKKyAgICAgICAgY2FzZSBXTklfQ0ZHX0ROTERfQ05GOgorICAgICAgICAgICAgcmV0dXJuICJXTklfQ0ZHX0ROTERfQ05GXG4iOworICAgICAgICBjYXNlIFdOSV9DRkdfR0VUX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiV05JX0NGR19HRVRfUlNQXG4iOworICAgICAgICBjYXNlIFdOSV9DRkdfU0VUX0NORjoKKyAgICAgICAgICAgIHJldHVybiAiV05JX0NGR19TRVRfQ05GXG4iOworICAgICAgICBjYXNlIFdOSV9DRkdfR0VUX0FUVFJJQl9SU1A6CisgICAgICAgICAgICByZXR1cm4gIldOSV9DRkdfR0VUX0FUVFJJQl9SU1BcbiI7CisgICAgICAgIGNhc2UgV05JX0NGR19BRERfR1JQX0FERFJfQ05GOgorICAgICAgICAgICAgcmV0dXJuICJXTklfQ0ZHX0FERF9HUlBfQUREUl9DTkZcbiI7CisgICAgICAgIGNhc2UgV05JX0NGR19ERUxfR1JQX0FERFJfQ05GOgorICAgICAgICAgICAgcmV0dXJuICJXTklfQ0ZHX0RFTF9HUlBfQUREUl9DTkZcbiI7CisgICAgICAgIGNhc2UgQU5JX0NGR19HRVRfUkFESU9fU1RBVF9SU1A6CisgICAgICAgICAgICByZXR1cm4gIkFOSV9DRkdfR0VUX1JBRElPX1NUQVRfUlNQXG4iOworICAgICAgICBjYXNlIEFOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SU1A6CisgICAgICAgICAgICByZXR1cm4gIkFOSV9DRkdfR0VUX1BFUl9TVEFfU1RBVF9SU1BcbiI7CisgICAgICAgIGNhc2UgQU5JX0NGR19HRVRfQUdHX1NUQV9TVEFUX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiQU5JX0NGR19HRVRfQUdHX1NUQV9TVEFUX1JTUFxuIjsKKyAgICAgICAgY2FzZSBBTklfQ0ZHX0NMRUFSX1NUQVRfUlNQOgorICAgICAgICAgICAgcmV0dXJuICJBTklfQ0ZHX0NMRUFSX1NUQVRfUlNQXG4iOworICAgICAgICBjYXNlIFdOSV9DRkdfRE5MRF9SU1A6CisgICAgICAgICAgICByZXR1cm4gIldOSV9DRkdfRE5MRF9SU1BcbiI7CisgICAgICAgIGNhc2UgV05JX0NGR19HRVRfUkVROgorICAgICAgICAgICAgcmV0dXJuICJXTklfQ0ZHX0dFVF9SRVFcbiI7CisgICAgICAgIGNhc2UgV05JX0NGR19TRVRfUkVROgorICAgICAgICAgICAgcmV0dXJuICJXTklfQ0ZHX1NFVF9SRVFcbiI7CisgICAgICAgIGNhc2UgV05JX0NGR19TRVRfUkVRX05PX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiV05JX0NGR19TRVRfUkVRX05PX1JTUFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FTlRFUl9JTVBTX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9QTUNfRU5URVJfSU1QU19SU1BcbiI7CisgICAgICAgIGNhc2UgZVdOSV9QTUNfRVhJVF9JTVBTX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9QTUNfRVhJVF9JTVBTX1JTUFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FTlRFUl9CTVBTX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9QTUNfRU5URVJfQk1QU19SU1BcbiI7CisgICAgICAgIGNhc2UgZVdOSV9QTUNfRVhJVF9CTVBTX1JTUDoKKyAgICAgICAgICAgIHJldHVybiAiZVdOSV9QTUNfRVhJVF9CTVBTX1JTUFxuIjsKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FWElUX0JNUFNfSU5EOgorICAgICAgICAgICAgcmV0dXJuICJlV05JX1BNQ19FWElUX0JNUFNfSU5EXG4iOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJJTlZBTElEIFNNRSBtZXNzYWdlXG4iOworICAgIH0KKyNlbmRpZgorcmV0dXJuICIiOworfQorCisKKworY2hhciAqbGltUmVzdWx0Q29kZVN0cih0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZSkKK3sKKyNpZmRlZiBGSVhNRV9HRU42CisgICAgc3dpdGNoIChyZXN1bHRDb2RlKQorICAgIHsKKyAgICAgIGNhc2UgZVNJUl9TTUVfU1VDQ0VTUzoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfU1VDQ0VTU1xuIjsKKyAgICAgIGNhc2UgZVNJUl9FT0ZfU09GX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9FT0ZfU09GX0VYQ0VQVElPTlxuIjsKKyAgICAgIGNhc2UgZVNJUl9CTVVfRVhDRVBUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX0JNVV9FWENFUFRJT05cbiI7CisgICAgICBjYXNlIGVTSVJfTE9XX1BEVV9FWENFUFRJT046CisgICAgICAgICAgICByZXR1cm4gImVTSVJfTE9XX1BEVV9FWENFUFRJT05cbiI7CisgICAgICBjYXNlIGVTSVJfVVNFUl9UUklHX1JFU0VUOgorICAgICAgICAgICAgcmV0dXJuImVTSVJfVVNFUl9UUklHX1JFU0VUXG4iOworICAgICAgY2FzZSBlU0lSX0xPR1BfRVhDRVBUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX0xPR1BfRVhDRVBUSU9OXG4iOworICAgICAgY2FzZSBlU0lSX0NQX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9DUF9FWENFUFRJT05cbiI7CisgICAgICBjYXNlIGVTSVJfU1RPUF9CU1M6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU1RPUF9CU1NcbiI7CisgICAgICBjYXNlIGVTSVJfQUhCX0hBTkdfRVhDRVBUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX0FIQl9IQU5HX0VYQ0VQVElPTlxuIjsKKyAgICAgIGNhc2UgZVNJUl9EUFVfRVhDRVBUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX0RQVV9FWENFUFRJT05cbiI7CisgICAgICBjYXNlIGVTSVJfUlhQX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9SWFBfRVhDRVBUSU9OXG4iOworICAgICAgY2FzZSBlU0lSX01DUFVfRVhDRVBUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX01DUFVfRVhDRVBUSU9OXG4iOworICAgICAgY2FzZSBlU0lSX01DVV9FWENFUFRJT046CisgICAgICAgICAgICByZXR1cm4gImVTSVJfTUNVX0VYQ0VQVElPTlxuIjsKKyAgICAgIGNhc2UgZVNJUl9NVFVfRVhDRVBUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX01UVV9FWENFUFRJT05cbiI7CisgICAgICBjYXNlIGVTSVJfTUlGX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9NSUZfRVhDRVBUSU9OXG4iOworICAgICAgY2FzZSBlU0lSX0ZXX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9GV19FWENFUFRJT05cbiI7CisgICAgICBjYXNlIGVTSVJfTUFJTEJPWF9TQU5JVFlfQ0hLX0ZBSUxFRDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9NQUlMQk9YX1NBTklUWV9DSEtfRkFJTEVEXG4iOworICAgICAgY2FzZSBlU0lSX1JBRElPX0hXX1NXSVRDSF9TVEFUVVNfSVNfT0ZGOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1JBRElPX0hXX1NXSVRDSF9TVEFUVVNfSVNfT0ZGXG4iOworICAgICAgY2FzZSBlU0lSX0NGQl9GTEFHX1NUVUNLX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9DRkJfRkxBR19TVFVDS19FWENFUFRJT05cbiI7CisgICAgICBjYXNlIGVTSVJfU01FX0JBU0lDX1JBVEVTX05PVF9TVVBQT1JURURfU1RBVFVTOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9CQVNJQ19SQVRFU19OT1RfU1VQUE9SVEVEX1NUQVRVU1xuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfSU5WQUxJRF9QQVJBTUVURVJTOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9JTlZBTElEX1BBUkFNRVRFUlNcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX1VORVhQRUNURURfUkVRX1JFU1VMVF9DT0RFOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9VTkVYUEVDVEVEX1JFUV9SRVNVTFRfQ09ERVxuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfUkVTT1VSQ0VTX1VOQVZBSUxBQkxFOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9SRVNPVVJDRVNfVU5BVkFJTEFCTEVcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX1NDQU5fRkFJTEVEOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9TQ0FOX0ZBSUxFRFxuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfQlNTX0FMUkVBRFlfU1RBUlRFRF9PUl9KT0lORUQ6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX0JTU19BTFJFQURZX1NUQVJURURfT1JfSk9JTkVEXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9MT1NUX0xJTktfV0lUSF9QRUVSX1JFU1VMVF9DT0RFOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9MT1NUX0xJTktfV0lUSF9QRUVSX1JFU1VMVF9DT0RFXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9SRUZVU0VEOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9SRUZVU0VEXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9KT0lOX1RJTUVPVVRfUkVTVUxUX0NPREU6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX0pPSU5fVElNRU9VVF9SRVNVTFRfQ09ERVxuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfQVVUSF9USU1FT1VUX1JFU1VMVF9DT0RFOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9BVVRIX1RJTUVPVVRfUkVTVUxUX0NPREVcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX0FTU09DX1RJTUVPVVRfUkVTVUxUX0NPREU6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX0FTU09DX1RJTUVPVVRfUkVTVUxUX0NPREVcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX1JFQVNTT0NfVElNRU9VVF9SRVNVTFRfQ09ERToKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfUkVBU1NPQ19USU1FT1VUX1JFU1VMVF9DT0RFXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9NQVhfTlVNX09GX1BSRV9BVVRIX1JFQUNIRUQ6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX01BWF9OVU1fT0ZfUFJFX0FVVEhfUkVBQ0hFRFxuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfQVVUSF9SRUZVU0VEOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9BVVRIX1JFRlVTRURcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX0lOVkFMSURfV0VQX0RFRkFVTFRfS0VZOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9JTlZBTElEX1dFUF9ERUZBVUxUX0tFWVxuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfQVNTT0NfUkVGVVNFRDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfQVNTT0NfUkVGVVNFRFxuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfUkVBU1NPQ19SRUZVU0VEOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9SRUFTU09DX1JFRlVTRURcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX1NUQV9OT1RfQVVUSEVOVElDQVRFRDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfU1RBX05PVF9BVVRIRU5USUNBVEVEXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9TVEFfTk9UX0FTU09DSUFURUQ6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX1NUQV9OT1RfQVNTT0NJQVRFRFxuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfU1RBX0RJU0FTU09DSUFURUQ6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX1NUQV9ESVNBU1NPQ0lBVEVEXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9BTFJFQURZX0pPSU5FRF9BX0JTUzoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfQUxSRUFEWV9KT0lORURfQV9CU1NcbiI7CisgICAgICBjYXNlIGVTSVJfVUxBX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9VTEFfQ09NUExFVEVEXG4iOworICAgICAgY2FzZSBlU0lSX1VMQV9GQUlMVVJFOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1VMQV9GQUlMVVJFXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9MSU5LX0VTVEFCTElTSEVEOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9MSU5LX0VTVEFCTElTSEVEXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9VTkFCTEVfVE9fUEVSRk9STV9NRUFTVVJFTUVOVFM6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX1VOQUJMRV9UT19QRVJGT1JNX01FQVNVUkVNRU5UU1xuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfVU5BQkxFX1RPX1BFUkZPUk1fREZTOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9VTkFCTEVfVE9fUEVSRk9STV9ERlNcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX0RGU19GQUlMRUQ6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX0RGU19GQUlMRURcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX1RSQU5TRkVSX1NUQToKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfVFJBTlNGRVJfU1RBXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9JTlZBTElEX0xJTktfVEVTVF9QQVJBTUVURVJTOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9JTlZBTElEX0xJTktfVEVTVF9QQVJBTUVURVJTXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9MSU5LX1RFU1RfTUFYX0VYQ0VFREVEOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9MSU5LX1RFU1RfTUFYX0VYQ0VFREVEXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9VTlNVUFBPUlRFRF9SQVRFOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9VTlNVUFBPUlRFRF9SQVRFXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9MSU5LX1RFU1RfVElNRU9VVDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfTElOS19URVNUX1RJTUVPVVRcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX0xJTktfVEVTVF9DT01QTEVURToKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfTElOS19URVNUX0NPTVBMRVRFXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9MSU5LX1RFU1RfSU5WQUxJRF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfTElOS19URVNUX0lOVkFMSURfU1RBVEVcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX0xJTktfVEVTVF9JTlZBTElEX0FERFJFU1M6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX0xJTktfVEVTVF9JTlZBTElEX0FERFJFU1NcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX1BPTEFSSVNfUkVTRVQ6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX1BPTEFSSVNfUkVTRVRcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX1NFVENPTlRFWFRfRkFJTEVEOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9TRVRDT05URVhUX0ZBSUxFRFxuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfQlNTX1JFU1RBUlQ6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX0JTU19SRVNUQVJUXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9NT1JFX1NDQU5fUkVTVUxUU19GT0xMT1c6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX01PUkVfU0NBTl9SRVNVTFRTX0ZPTExPV1xuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfSU5WQUxJRF9BU1NPQ19SU1BfUlhFRDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfSU5WQUxJRF9BU1NPQ19SU1BfUlhFRFxuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfTUlDX0NPVU5URVJfTUVBU1VSRVM6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX01JQ19DT1VOVEVSX01FQVNVUkVTXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9BRERUU19SU1BfVElNRU9VVDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfQUREVFNfUlNQX1RJTUVPVVRcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX1JFQ0VJVkVEOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9SRUNFSVZFRFxuIjsKKyAgICAgIGNhc2UgZVNJUl9TTUVfQ0hBTk5FTF9TV0lUQ0hfRkFJTDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfQ0hBTk5FTF9TV0lUQ0hfRkFJTFxuIjsKKyNpZmRlZiBHRU40X1NDQU4KKyAgICAgIGNhc2UgZVNJUl9TTUVfQ0hBTk5FTF9TV0lUQ0hfRElTQUJMRUQ6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX0NIQU5ORUxfU1dJVENIX0RJU0FCTEVEXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9IQUxfU0NBTl9JTklUX0ZBSUxFRDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfSEFMX1NDQU5fSU5JVF9GQUlMRURcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX0hBTF9TQ0FOX1NUQVJUX0ZBSUxFRDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfSEFMX1NDQU5fU1RBUlRfRkFJTEVEXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9IQUxfU0NBTl9FTkRfRkFJTEVEOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9IQUxfU0NBTl9FTkRfRkFJTEVEXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9IQUxfU0NBTl9GSU5JU0hfRkFJTEVEOgorICAgICAgICAgICAgcmV0dXJuICJlU0lSX1NNRV9IQUxfU0NBTl9GSU5JU0hfRkFJTEVEXG4iOworICAgICAgY2FzZSBlU0lSX1NNRV9IQUxfU0VORF9NRVNTQUdFX0ZBSUw6CisgICAgICAgICAgICByZXR1cm4gImVTSVJfU01FX0hBTF9TRU5EX01FU1NBR0VfRkFJTFxuIjsKKyNlbHNlIC8vIEdFTjRfU0NBTgorICAgICAgY2FzZSBlU0lSX1NNRV9DSEFOTkVMX1NXSVRDSF9ESVNBQkxFRDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfQ0hBTk5FTF9TV0lUQ0hfRElTQUJMRURcbiI7CisgICAgICBjYXNlIGVTSVJfU01FX0hBTF9TRU5EX01FU1NBR0VfRkFJTDoKKyAgICAgICAgICAgIHJldHVybiAiZVNJUl9TTUVfSEFMX1NFTkRfTUVTU0FHRV9GQUlMXG4iOworI2VuZGlmIC8vIEdFTjRfU0NBTgorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIklOVkFMSUQgcmVzdWx0Q29kZVxuIjsKKyAgICB9CisjZW5kaWYKK3JldHVybiAiIjsKK30KKwordm9pZAorbGltUHJpbnRNc2dOYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IGxvZ0xldmVsLCB0QU5JX1UzMiBtc2dUeXBlKQoreworICAgIGxpbUxvZyhwTWFjLCBsb2dMZXZlbCwgbGltTXNnU3RyKG1zZ1R5cGUpKTsKK30KKworCisjaWYgZGVmaW5lZChBTklfTUlQUykgfHwgZGVmaW5lZChBTklfQVJNKQorI2RlZmluZSBMSU5LIDAKKyNlbHNlCisjZGVmaW5lIExJTksgMQorI2VuZGlmCisKK3ZvaWQKK2xpbVByaW50TXNnSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBsb2dMZXZlbCwgdFNpck1zZ1EgKm1zZykKK3sKKyAgICAvL3RTaXJNYWNGcmFtZUN0bCAgZmM7IC8vIEZJWE1FX0dFTjQgLSBBU0FQISEKKyNpZiBkZWZpbmVkIChBTklfT1NfVFlQRV9MSU5VWCkgfHwgZGVmaW5lZCAoQU5JX09TX1RZUEVfT1NYKQorICAgIHRBTklfVTMyICAgICAgICAgICAgICAqcFJ4UGFja2V0SW5mbzsKKyNlbmRpZgorICAgIGlmIChsb2dMZXZlbCA8PSBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbU0lSX0xJTV9NT0RVTEVfSUQgLSBMT0dfRklSU1RfTU9EVUxFX0lEXSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNJUl9CQl9YUE9SVF9NR01UX01TRzoKKyNpZiBkZWZpbmVkIChBTklfT1NfVFlQRV9MSU5VWCkgfHwgZGVmaW5lZCAoQU5JX09TX1RZUEVfT1NYKQorI2lmbmRlZiBHRU42X09OV0FSRFMgLy9QQUwgZG9lcyBub3QgcHJvdmlkZSB0aGlzIEFQSSBHRU42IG9ud2FyZHMuCisgICAgICAgICAgICAgICAgcGFsR2V0UGFja2V0RGF0YVB0ciggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAodm9pZCAqKSBtc2ctPmJvZHlwdHIsICh2b2lkICoqKSAmcFJ4UGFja2V0SW5mbyApOworI2VuZGlmIC8vR0VONl9PTldBUkRTCisjZWxzZQorICAgICAgICAgICAgICAgIGxpbVByaW50TXNnTmFtZShwTWFjLCBsb2dMZXZlbCxtc2ctPnR5cGUpOworI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGxpbVByaW50TXNnTmFtZShwTWFjLCBsb2dMZXZlbCxtc2ctPnR5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIGxpbUluaXRNbG0oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaW1Qcm9jZXNzU21lTWVzc2FnZXMoKSB0bworICogaW5pdGlhbGl6ZSBNTE0gc3RhdGUgbWFjaGluZSBvbiBTVEEKKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2xpbUluaXRNbG0odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9NTE1fU1RBVEUsIDAsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUpKTsKKworICAgIC8vLyBJbml0aWFsaXplIHNjYW4gcmVzdWx0IGhhc2ggdGFibGUKKyAgICBsaW1SZUluaXRTY2FuUmVzdWx0cyhwTWFjKTsgLy9zZXAyNnRoIHJldmlldworCisgIAorICAgIC8vLyBJbml0aWFsaXplIG51bWJlciBvZiBwcmUtYXV0aCBjb250ZXh0cworICAgIHBNYWMtPmxpbS5nTGltTnVtUHJlQXV0aENvbnRleHRzID0gMDsKKworICAgIC8vLyBJbml0aWFsaXplIE1BQyBiYXNlZCBBdXRoZW50aWNhdGlvbiBTVEEgbGlzdAorICAgIGxpbUluaXRQcmVBdXRoTGlzdChwTWFjKTsKKworICAgIC8vcE1hYy0+bGltLmdwTGltTWxtSm9pblJlcSA9IE5VTEw7CisKKyAgICBpZiAocE1hYy0+bGltLmdMaW1UaW1lcnNDcmVhdGVkKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDcmVhdGUgdGltZXJzIHVzZWQgYnkgTElNCisgICAgbGltQ3JlYXRlVGltZXJzKHBNYWMpOworCisgICAgcE1hYy0+bGltLmdMaW1UaW1lcnNDcmVhdGVkID0gMTsKK30gLyoqKiBlbmQgbGltSW5pdE1sbSgpICoqKi8KKworCisKKy8qKgorICogbGltQ2xlYW51cE1sbSgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsZWFudXAgYW55IHJlc291cmNlcworICogYWxsb2NhdGVkIGJ5IHRoZSAgTUxNIHN0YXRlIG1hY2hpbmUuCisgKgorICpQQVJBTVM6CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBJdCBpcyBhc3N1bWVkIHRoYXQgQlNTIGlzIGFscmVhZHkgaW5mb3JtZWQgdGhhdCB3ZSdyZSBsZWF2aW5nIGl0CisgKiBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorbGltQ2xlYW51cE1sbSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTMyICAgbjsKKyAgICB0TGltUHJlQXV0aE5vZGUgKnBBdXRoTm9kZTsKKworICAgIGlmIChwTWFjLT5saW0uZ0xpbVRpbWVyc0NyZWF0ZWQgPT0gMSkKKyAgICB7CisgICAgICAgIC8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBNSU4vTUFYIGNoYW5uZWwgdGltZXJzLgorICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1NaW5DaGFubmVsVGltZXIpOworICAgICAgICB0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbU1pbkNoYW5uZWxUaW1lcik7CisgICAgICAgIHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbU1heENoYW5uZWxUaW1lcik7CisgICAgICAgIHR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltTWF4Q2hhbm5lbFRpbWVyKTsKKyAgICAgICAgdHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUGVyaW9kaWNQcm9iZVJlcVRpbWVyKTsKKyAgICAgICAgdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QZXJpb2RpY1Byb2JlUmVxVGltZXIpOworCisKKyAgICAgICAgLy8gRGVhY3RpdmF0ZSBhbmQgZGVsZXRlIGNoYW5uZWwgc3dpdGNoIHRpbWVyLgorICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1DaGFubmVsU3dpdGNoVGltZXIpOworICAgICAgICB0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUNoYW5uZWxTd2l0Y2hUaW1lcik7CisKKworICAgICAgICAvLyBEZWFjdGl2YXRlIGFuZCBkZWxldGUgYWRkdHMgcmVzcG9uc2UgdGltZXIuCisgICAgICAgIHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFkZHRzUnNwVGltZXIpOworICAgICAgICB0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUFkZHRzUnNwVGltZXIpOworCisgICAgICAgIC8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBKb2luIGZhaWx1cmUgdGltZXIuCisgICAgICAgIHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUpvaW5GYWlsdXJlVGltZXIpOworICAgICAgICB0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUpvaW5GYWlsdXJlVGltZXIpOworCisgICAgICAgIC8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBBc3NvY2lhdGlvbiBmYWlsdXJlIHRpbWVyLgorICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Bc3NvY0ZhaWx1cmVUaW1lcik7CisgICAgICAgIHR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQXNzb2NGYWlsdXJlVGltZXIpOworCisgICAgICAgIC8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBSZWFzc29jaWF0aW9uIGZhaWx1cmUgdGltZXIuCisgICAgICAgIHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVJlYXNzb2NGYWlsdXJlVGltZXIpOworICAgICAgICB0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVJlYXNzb2NGYWlsdXJlVGltZXIpOworCisgICAgICAgIC8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBBdXRoZW50aWNhdGlvbiBmYWlsdXJlIHRpbWVyLgorICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1BdXRoRmFpbHVyZVRpbWVyKTsKKyAgICAgICAgdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1BdXRoRmFpbHVyZVRpbWVyKTsKKworICAgICAgICAvLyBEZWFjdGl2YXRlIGFuZCBkZWxldGUgSGVhcnRiZWF0IHRpbWVyLgorICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1IZWFydEJlYXRUaW1lcik7CisgICAgICAgIHR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltSGVhcnRCZWF0VGltZXIpOworCisgICAgICAgIC8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSB3YWl0LWZvci1wcm9iZS1hZnRlci1IZWFydGJlYXQgdGltZXIuCisgICAgICAgIHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVByb2JlQWZ0ZXJIQlRpbWVyKTsKKyAgICAgICAgdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Qcm9iZUFmdGVySEJUaW1lcik7CisKKyAgICAgICAgLy8gRGVhY3RpdmF0ZSBhbmQgZGVsZXRlIFF1aWV0IHRpbWVyLgorICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldFRpbWVyKTsKKyAgICAgICAgdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldFRpbWVyKTsKKworICAgICAgICAvLyBEZWFjdGl2YXRlIGFuZCBkZWxldGUgUXVpZXQgQlNTIHRpbWVyLgorICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyKTsKKyAgICAgICAgdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyKTsKKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQpIHx8IGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgICAgIC8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBMSU0gYmFja2dyb3VuZCBzY2FuIHRpbWVyLgorICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1CYWNrZ3JvdW5kU2NhblRpbWVyKTsKKyAgICAgICAgdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1CYWNrZ3JvdW5kU2NhblRpbWVyKTsKKyNlbmRpZgorCisKKyAgICAgICAgLy8gRGVhY3RpdmF0ZSBhbmQgZGVsZXRlIGNuZiB3YWl0IHRpbWVyCisgICAgICAgIGZvciAobiA9IDA7IG4gPCBwTWFjLT5saW0ubWF4U3RhdGlvbjsgbisrKQorICAgICAgICB7CisgICAgICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdwTGltQ25mV2FpdFRpbWVyW25dKTsKKyAgICAgICAgICAgIHR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5ncExpbUNuZldhaXRUaW1lcltuXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWFjdGl2YXRlIGFuZCBkZWxldGUga2VlcGFsaXZlIHRpbWVyCisgICAgICAgIHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUtlZXBhbGl2ZVRpbWVyKTsKKyAgICAgICAgdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1LZWVwYWxpdmVUaW1lcik7CisKKyAgICAgICAgcEF1dGhOb2RlID0gcE1hYy0+bGltLmdMaW1QcmVBdXRoVGltZXJUYWJsZS5wVGFibGU7CisgICAgICAgIAorICAgICAgICAvL0RlYWN0aXZhdGUgYW55IEF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHRpbWVycworICAgICAgICBsaW1EZWxldGVQcmVBdXRoTGlzdChwTWFjKTsKKworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcE1hYy0+bGltLmdMaW1QcmVBdXRoVGltZXJUYWJsZS5udW1FbnRyeTsgbisrLHBBdXRoTm9kZSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBEZWxldGUgYW55IEF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlCisgICAgICAgICAgICAvLyB0aW1lcnMsIHdoaWNoIG1pZ2h0IGhhdmUgYmVlbiBzdGFydGVkLgorICAgICAgICAgICAgdHhfdGltZXJfZGVsZXRlKCZwQXV0aE5vZGUtPnRpbWVyKTsKKyAgICAgICAgfQorCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBEZWFjdGl2YXRlIGFuZCBjbGVhbnVwIHRoZSBwZXJpb2RpYyBwcmUtYXV0aAorICAgICAgICAgICAgLy8gY2xlYW51cCB0aW1lcgorCisgICAgICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QcmVBdXRoQ2xudXBUaW1lcik7CisgICAgICAgICAgICB0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVByZUF1dGhDbG51cFRpbWVyKTsKKworICAgICAgICAgICAgLy8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBPTEJDIGNhY2hlIHVwZGF0ZSB0aW1lb3V0CisgICAgICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1VcGRhdGVPbGJjQ2FjaGVUaW1lcik7CisgICAgICAgICAgICB0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVVwZGF0ZU9sYmNDYWNoZVRpbWVyKTsKKworICAgICAgICB9CisjZW5kaWYKKworCisgICAgICAgIC8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBIYXNoIE1pc3MgdGhyb3R0bGUgdGltZXIKKyAgICAgICAgdHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltU2VuZERpc2Fzc29jRnJhbWVUaHJlc2hvbGRUaW1lcik7CisgICAgICAgIHR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltU2VuZERpc2Fzc29jRnJhbWVUaHJlc2hvbGRUaW1lcik7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVVwZGF0ZU9sYmNDYWNoZVRpbWVyKTsKKyAgICAgICAgdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1VcGRhdGVPbGJjQ2FjaGVUaW1lcik7CisgICAgICAgIHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVByZUF1dGhDbG51cFRpbWVyKTsKKyAgICAgICAgdHhfdGltZXJfZGVsZXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1QcmVBdXRoQ2xudXBUaW1lcik7CisKKyNpZiAwIC8vIFRoZSBXUFMgUEJDIGNsZWFuIHVwIHRpbWVyIGlzIGRpc2FibGVkCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwTWFjLT5saW0ubGltVGltZXJzLmdMaW1XUFNPdmVybGFwVGltZXJPYmouaXNUaW1lckNyZWF0ZWQgPT0gZUFOSV9CT09MRUFOX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltV1BTT3ZlcmxhcFRpbWVyT2JqLmdMaW1XUFNPdmVybGFwVGltZXIpOworICAgICAgICAgICAgICAgIHR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltV1BTT3ZlcmxhcFRpbWVyT2JqLmdMaW1XUFNPdmVybGFwVGltZXIpOworICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVdQU092ZXJsYXBUaW1lck9iai5pc1RpbWVyQ3JlYXRlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICAvLyBEZWFjdGl2YXRlIGFuZCBkZWxldGUgRlQgUHJlYXV0aCByZXNwb25zZSB0aW1lcgorICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1GVFByZUF1dGhSc3BUaW1lcik7CisgICAgICAgIHR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltRlRQcmVBdXRoUnNwVGltZXIpOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIC8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSByZW1haW4gb24gY2hhbm5lbCB0aW1lcgorICAgICAgICB0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1SZW1haW5PbkNoYW5uZWxUaW1lcik7CisgICAgICAgIHR4X3RpbWVyX2RlbGV0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUmVtYWluT25DaGFubmVsVGltZXIpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgIC8vIERlYWN0aXZhdGUgYW5kIGRlbGV0ZSBUU00KKyAgICAgICAgdHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQ2N4VHNtVGltZXIpOworICAgICAgICB0eF90aW1lcl9kZWxldGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUNjeFRzbVRpbWVyKTsKKyNlbmRpZgorCisgICAgICAgIHBNYWMtPmxpbS5nTGltVGltZXJzQ3JlYXRlZCA9IDA7CisgICAgfQorCisgICAgLy8vIENsZWFudXAgY2FjaGVkIHNjYW4gbGlzdAorICAgIGxpbVJlSW5pdFNjYW5SZXN1bHRzKHBNYWMpOworCit9IC8qKiogZW5kIGxpbUNsZWFudXBNbG0oKSAqKiovCisKKworCisvKioKKyAqIGxpbUNsZWFudXBMbW0oKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbGVhbnVwIGFueSByZXNvdXJjZXMKKyAqIGFsbG9jYXRlZCBieSBMTU0gc3ViLW1vZHVsZS4KKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtICBwTWFjICAgICAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorbGltQ2xlYW51cExtbSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAmJiBkZWZpbmVkIChBTklfUFJPRFVDVF9UWVBFX0FQKQorICAgIGxpbUNsZWFudXBNZWFzUmVzb3VyY2VzKHBNYWMpOworICAgIHBNYWMtPnN5cy5nU3lzRW5hYmxlTGVhcm5Nb2RlID0gZUFOSV9CT09MRUFOX0ZBTFNFOworI2VuZGlmCit9IC8qKiogZW5kIGxpbUNsZWFudXBMbW0oKSAqKiovCisKKworCisvKioKKyAqIGxpbUlzQWRkckJDKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdmFyaW91cyBwbGFjZXMgd2l0aGluIExJTSBjb2RlCisgKiB0byBkZXRlcm1pbmUgd2hldGhlciBwYXNzZWQgTUFDIGFkZHJlc3MgaXMgYSBicm9hZGNhc3Qgb3Igbm90CisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSBtYWNBZGRyICBJbmRpY2F0ZXMgTUFDIGFkZHJlc3MgdGhhdCBuZWVkIHRvIGJlIGRldGVybWluZWQKKyAqICAgICAgICAgICAgICAgICB3aGV0aGVyIGl0IGlzIEJyb2FkY2FzdCBhZGRyZXNzIG9yIG5vdAorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBwYXNzZWQgYWRkcmVzcyBpcyBCcm9hZGNhc3QgYWRkcmVzcyBlbHNlIGZhbHNlCisgKi8KKwordEFOSV9VOAorbGltSXNBZGRyQkModFNpck1hY0FkZHIgbWFjQWRkcikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKChtYWNBZGRyW2ldICYgMHhGRikgIT0gMHhGRikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30gLyoqKioqKiBlbmQgbGltSXNBZGRyQkMoKSAqKioqKiovCisKKworCisvKioKKyAqIGxpbUlzR3JvdXBBZGRyKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdmFyaW91cyBwbGFjZXMgd2l0aGluIExJTSBjb2RlCisgKiB0byBkZXRlcm1pbmUgd2hldGhlciBwYXNzZWQgTUFDIGFkZHJlc3MgaXMgYSBncm91cCBhZGRyZXNzIG9yIG5vdAorICoKKyAqTE9HSUM6CisgKiBJZiBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgZmlyc3Qgb2N0ZXQgb2YgdGhlIE1BQyBhZGRyZXNzIGlzCisgKiBzZXQgdG8gMSwgaXQgaXMgYSBHcm91cCBhZGRyZXNzLgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIG1hY0FkZHIgIEluZGljYXRlcyBNQUMgYWRkcmVzcyB0aGF0IG5lZWQgdG8gYmUgZGV0ZXJtaW5lZAorICogICAgICAgICAgICAgICAgIHdoZXRoZXIgaXQgaXMgR3JvdXAgYWRkcmVzcyBvciBub3QKKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgcGFzc2VkIGFkZHJlc3MgaXMgR3JvdXAgYWRkcmVzcyBlbHNlIGZhbHNlCisgKi8KKwordEFOSV9VOAorbGltSXNHcm91cEFkZHIodFNpck1hY0FkZHIgbWFjQWRkcikKK3sKKyAgICBpZiAoKG1hY0FkZHJbMF0gJiAweDAxKSA9PSAweDAxKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKK30gLyoqKioqKiBlbmQgbGltSXNHcm91cEFkZHIoKSAqKioqKiovCisKKy8qKgorICogbGltUG9zdE1zZ0FwaU5vV2FpdCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gb3RoZXIgdGhyZWFkIHdoaWxlIHBvc3RpbmcgYQorICogbWVzc2FnZSB0byBMSU0gbWVzc2FnZSBRdWV1ZSBnU2lyTGltTXNnUSB3aXRoIE5PX1dBSVQgb3B0aW9uCisgKgorICpMT0dJQzoKKyAqIE5BCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIHBNc2cgLSBQb2ludGVyIHRvIHRoZSBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwTXNnIC0gUG9pbnRlciB0byB0aGUgbWVzc2FnZSBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3RBTklfVTMyCitsaW1Qb3N0TXNnQXBpTm9XYWl0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKQoreworI2lmZGVmIEFOSV9PU19UWVBFX1dJTkRPV1MKKyAgICB0QU5JX1UzMiByZXRDb2RlOworCisgICAgaWYgKChyZXRDb2RlID0gdHhfcXVldWVfc2VuZCgmcE1hYy0+c3lzLmdTaXJMaW1Nc2dRLCBwTXNnLCBUWF9OT19XQUlUKSkKKyAgICAgICAgIT0gVFhfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8vIEZhaWx1cmUgaW4gc2VuZGluZyBERlMgZHVyYXRpb24gdGltZW91dCBpbmRpY2F0aW9uCisgICAgICAgIC8vIHRvIExJTSB0aHJlYWQKKworICAgICAgICAvLyBMb2cgZXJyb3IKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCgiY291bGQgbm90IHBvc3QgYSBtZXNzYWdlICVYIHRvIExJTSBtc2dxLCBzdGF0dXM9JWRcbiIpLAorICAgICAgICAgICAgICAgcE1zZy0+dHlwZSwgcmV0Q29kZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldENvZGU7CisjZWxzZQorICAgIGxpbVByb2Nlc3NNZXNzYWdlcyhwTWFjLCBwTXNnKTsKKyAgICByZXR1cm4gVFhfU1VDQ0VTUzsKKyNlbmRpZgorfSAvKioqIGVuZCBsaW1Qb3N0TXNnQXBpTm9XYWl0KCkgKioqLworCisKKworLyoqCisgKiBsaW1QcmludE1hY0FkZHIoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcmludCBwYXNzZWQgTUFDIGFkZHJlc3MKKyAqIGluIDogZm9ybWF0LgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogQHBhcmFtICBtYWNBZGRyICAtIE1hY0FkZHIgdG8gYmUgcHJpbnRlZAorICogQHBhcmFtICBsb2dMZXZlbCAtIExvZ2xldmVsIHRvIGJlIHVzZWQKKyAqCisgKiBAcmV0dXJuIE5vbmUuCisgKi8KKwordm9pZAorbGltUHJpbnRNYWNBZGRyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIG1hY0FkZHIsIHRBTklfVTggbG9nTGV2ZWwpCit7CisgICAgbGltTG9nKHBNYWMsIGxvZ0xldmVsLAorICAgICAgICAgICBGTCgiJVg6JVg6JVg6JVg6JVg6JVhcbiIpLAorICAgICAgICAgICBtYWNBZGRyWzBdLCBtYWNBZGRyWzFdLCBtYWNBZGRyWzJdLCBtYWNBZGRyWzNdLCBtYWNBZGRyWzRdLAorICAgICAgICAgICBtYWNBZGRyWzVdKTsKK30gLyoqKioqKiBlbmQgbGltUHJpbnRNYWNBZGRyKCkgKioqKioqLworCisKKworCisKKworLyoKKyAqIGxpbVJlc2V0RGVmZXJyZWRNc2dRKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGRlZmVycmVkIG1lc3NhZ2UgcXVldWUgcGFyYW1ldGVycy4KKyAqCisgKlBBUkFNUzoKKyAqIEBwYXJhbSBwTWFjICAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICpSRVRVUk5TOgorICogTm9uZQorICovCisKK3ZvaWQgbGltUmVzZXREZWZlcnJlZE1zZ1EodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5zaXplID0KKyAgICBwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS53cml0ZSA9CisgICAgcE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1EucmVhZCA9IDA7CisKK30KKworCisjZGVmaW5lIExJTV9ERUZFUlJFRF9RX0NIRUNLX1RIUkVTSE9MRCAgKE1BWF9ERUZFUlJFRF9RVUVVRV9MRU4vMikKKyNkZWZpbmUgTElNX01BWF9OVU1fTUdNVF9GUkFNRV9ERUZFUlJFRCAoTUFYX0RFRkVSUkVEX1FVRVVFX0xFTi8yKQorCisvKgorICogbGltV3JpdGVEZWZlcnJlZE1zZ1EoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHF1ZXVlcyB1cCBhIGRlZmVycmVkIG1lc3NhZ2UgZm9yIGxhdGVyIHByb2Nlc3Npbmcgb24gdGhlCisgKiBTVEEgc2lkZS4KKyAqCisgKlBBUkFNUzoKKyAqIEBwYXJhbSBwTWFjICAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBsaW1Nc2cgICAtIGEgTElNIG1lc3NhZ2UKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICpSRVRVUk5TOgorICogTm9uZQorICovCisKK3RBTklfVTggbGltV3JpdGVEZWZlcnJlZE1zZ1EodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZykKK3sKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgIEZMKCIqKiAgUXVldWUgYSBkZWZlcnJlZCBtZXNzYWdlIChzaXplICVkLCB3cml0ZSAlZCkgLSB0eXBlIDB4JXggICoqXG4iKSwKKyAgICAgICAgICAgcE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1Euc2l6ZSwgcE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1Eud3JpdGUsCisgICAgICAgICAgIGxpbU1zZy0+dHlwZSk7KQorCisgICAgICAgIC8qCisgICAgICAgICAqKiBjaGVjayBpZiB0aGUgZGVmZXJyZWQgbWVzc2FnZSBxdWV1ZSBpcyBmdWxsCisgICAgICAgICAqKi8KKyAgICBpZiAocE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1Euc2l6ZSA+PSBNQVhfREVGRVJSRURfUVVFVUVfTEVOKQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRGVmZXJyZWQgTWVzc2FnZSBRdWV1ZSBpcyBmdWxsLiBNc2c6ICVkXG4iKSwgbGltTXNnLT50eXBlKTspCisgICAgICAgIHJldHVybiBUWF9RVUVVRV9GVUxMOworICAgIH0KKworICAgIC8qCisgICAgKiogSW4gdGhlIGFwcGxpY2F0aW9uLCB0aGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAxIG1lc3NhZ2UgZ2V0CisgICAgKiogcXVldWVkIHVwLiBJZiBoYXBwZW5zLCBmbGFncyBhIHdhcm5pbmcuIEluIHRoZSBmdXR1cmUsIHRoaXMgY2FuCisgICAgKiogaGFwcGVuLgorICAgICoqLworICAgIGlmIChwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5zaXplID4gMCkKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIiVkIERlZmVycmVkIG1lc3NhZ2VzICh0eXBlIDB4JXgsIHNjYW4gJWQsIHNtZSAlZCwgbWxtZSAlZCwgYWRkdHMgJWQpXG4iKSwKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemUsIGxpbU1zZy0+dHlwZSwKKyAgICAgICAgICAgICAgIGxpbUlzU3lzdGVtSW5TY2FuU3RhdGUocE1hYyksCisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlLAorICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1BZGR0c1NlbnQpOykKKyAgICB9CisKKyAgICAvKgorICAgICoqIFRvIHByZXZlbnQgdGhlIGRlZmVycmVkIFEgaXMgZnVsbCBvZiBtYW5hZ2VtZW50IGZyYW1lcywgb25seSBnaXZlIHRoZW0gY2VydGFpbiBzcGFjZQorICAgICoqLworICAgIGlmKCBTSVJfQkJfWFBPUlRfTUdNVF9NU0cgPT0gbGltTXNnLT50eXBlICkKKyAgICB7CisgICAgICAgIGlmKCBMSU1fREVGRVJSRURfUV9DSEVDS19USFJFU0hPTEQgPCBwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5zaXplICkKKyAgICAgICAgeworICAgICAgICAgICAgdEFOSV9VMTYgaWR4LCBjb3VudCA9IDA7CisgICAgICAgICAgICBmb3IoaWR4ID0gMDsgaWR4IDwgcE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1Euc2l6ZTsgaWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIFNJUl9CQl9YUE9SVF9NR01UX01TRyA9PSBwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5kZWZlcnJlZFF1ZXVlW2lkeF0udHlwZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBMSU1fTUFYX05VTV9NR01UX0ZSQU1FX0RFRkVSUkVEIDwgY291bnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vV2UgcmVhY2ggdGhlIHF1b3RhIGZvciBtYW5hZ2VtZW50IGZyYW1lcywgZHJvcCB0aGlzIG9uZQorICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBkZWZlcnJlZC4gTXNnOiAlZCBUb28gbWFueSAoY291bnQ9JWQpIGFscmVhZHlcbiIpLCBsaW1Nc2ctPnR5cGUsIGNvdW50KTspCisgICAgICAgICAgICAgICAgLy9SZXR1cm4gZXJyb3IsIGNhbGxlciBrbm93cyB3aGF0IHRvIGRvCisgICAgICAgICAgICAgICAgcmV0dXJuIFRYX1FVRVVFX0ZVTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICArK3BNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnNpemU7CisKKyAgICAvKgorICAgICoqIGlmIHRoZSB3cml0ZSBwb2ludGVyIGhpdHMgdGhlIGVuZCBvZiB0aGUgcXVldWUsIHJld2luZCBpdAorICAgICoqLworICAgIGlmIChwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS53cml0ZSA+PSBNQVhfREVGRVJSRURfUVVFVUVfTEVOKQorICAgICAgICBwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS53cml0ZSA9IDA7CisKKyAgICAvKgorICAgICoqIHNhdmUgdGhlIG1lc3NhZ2UgdG8gdGhlIHF1ZXVlIGFuZCBhZHZhbmNlZCB0aGUgd3JpdGUgcG9pbnRlcgorICAgICoqLworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopJnBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLmRlZmVycmVkUXVldWVbcE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1Eud3JpdGUrK10sCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKWxpbU1zZywKKyAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTXNnUSkpOworICAgIHJldHVybiBUWF9TVUNDRVNTOworCit9CisKKy8qCisgKiBsaW1SZWFkRGVmZXJyZWRNc2dRKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBkZXF1ZXVlcyBhIGRlZmVycmVkIG1lc3NhZ2UgZm9yIHByb2Nlc3Npbmcgb24gdGhlCisgKiBTVEEgc2lkZS4KKyAqCisgKlBBUkFNUzoKKyAqIEBwYXJhbSBwTWFjICAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqCisgKgorICpSRVRVUk5TOgorICogUmV0dXJucyB0aGUgbWVzc2FnZSBhdCB0aGUgaGVhZCBvZiB0aGUgZGVmZXJyZWQgbWVzc2FnZSBxdWV1ZQorICovCisKK3RTaXJNc2dRKiBsaW1SZWFkRGVmZXJyZWRNc2dRKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdFNpck1zZ1EgICAgKm1zZzsKKworICAgIC8qCisgICAgKiogY2hlY2sgYW55IG1lc3NhZ2VzIGxlZnQuIElmIG5vLCByZXR1cm4KKyAgICAqKi8KKyAgICBpZiAocE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1Euc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qCisgICAgKiogZGVjcmVtZW50IHRoZSBxdWV1ZSBzaXplCisgICAgKiovCisgICAgcE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1Euc2l6ZS0tOworCisgICAgLyoKKyAgICAqKiByZXRyaWV2ZSB0aGUgbWVzc2FnZSBmcm9tIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZQorICAgICoqLworICAgIG1zZyA9ICZwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5kZWZlcnJlZFF1ZXVlW3BNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnJlYWRdOworCisgICAgLyoKKyAgICAqKiBhZHZhbmNlIHRoZSByZWFkIHBvaW50ZXIKKyAgICAqKi8KKyAgICBwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5yZWFkKys7CisKKyAgICAvKgorICAgICoqIGlmIHRoZSByZWFkIHBvaW50ZXIgaGl0cyB0aGUgZW5kIG9mIHRoZSBxdWV1ZSwgcmV3aW5kIGl0CisgICAgKiovCisgICAgaWYgKHBNYWMtPmxpbS5nTGltRGVmZXJyZWRNc2dRLnJlYWQgPj0gTUFYX0RFRkVSUkVEX1FVRVVFX0xFTikKKyAgICAgICAgcE1hYy0+bGltLmdMaW1EZWZlcnJlZE1zZ1EucmVhZCA9IDA7CisKKyAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgRkwoIioqICBEZVF1ZXVlIGEgZGVmZXJyZWQgbWVzc2FnZSAoc2l6ZSAlZCByZWFkICVkKSAtIHR5cGUgMHgleCAgKipcbiIpLAorICAgICAgICAgICBwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5zaXplLCBwTWFjLT5saW0uZ0xpbURlZmVycmVkTXNnUS5yZWFkLAorICAgICAgICAgICBtc2ctPnR5cGUpOykKKworICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiRFEgbXNnIC0tIHNjYW4gJWQsIHNtZSAlZCwgbWxtZSAlZCwgYWRkdHMgJWRcbiIpLAorICAgICAgICAgICBsaW1Jc1N5c3RlbUluU2NhblN0YXRlKHBNYWMpLAorICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlLCBwTWFjLT5saW0uZ0xpbU1sbVN0YXRlLAorICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUFkZHRzU2VudCk7KQorCisgICAgcmV0dXJuKG1zZyk7Cit9CisKK3RTaXJSZXRTdGF0dXMKK2xpbVN5c1Byb2Nlc3NNbWhNc2dBcGkodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgdFNpck1zZ1EgKnBNc2csCisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggcVR5cGUpCit7CisvLyBGSVhNRQorI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgICBTeXNQcm9jZXNzTW1oTXNnKHBNYWMsIHBNc2cpOworICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyNlbHNlCisgICByZXR1cm4oaGFsTW1oUG9zdE1zZ0FwaShwTWFjLCBwTXNnLCBxVHlwZSkpOworI2VuZGlmCit9CisKK2NoYXIgKmxpbUZyYW1lU3RyKHRBTklfVTMyIHR5cGUsIHRBTklfVTMyIHN1YlR5cGUpCit7CisjaWZkZWYgRklYTUVfR0VONgorCisgICAgaWYgKHR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChzdWJUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9BU1NPQ19SRVE6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfTUdNVF9BU1NPQ19SRVEiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX01HTVRfQVNTT0NfUlNQOgorICAgICAgICAgICAgICAgIHJldHVybiAiTUFDX01HTVRfQVNTT0NfUlNQIjsKKyAgICAgICAgICAgIGNhc2UgU0lSX01BQ19NR01UX1JFQVNTT0NfUkVROgorICAgICAgICAgICAgICAgIHJldHVybiAiTUFDX01HTVRfUkVBU1NPQ19SRVEiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX01HTVRfUkVBU1NPQ19SU1A6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfTUdNVF9SRUFTU09DX1JTUCI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9QUk9CRV9SRVE6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfTUdNVF9QUk9CRV9SRVEiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX01HTVRfUFJPQkVfUlNQOgorICAgICAgICAgICAgICAgIHJldHVybiAiTUFDX01HTVRfUFJPQkVfUlNQIjsKKyAgICAgICAgICAgIGNhc2UgU0lSX01BQ19NR01UX0JFQUNPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19NR01UX0JFQUNPTiI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9BVElNOgorICAgICAgICAgICAgICAgIHJldHVybiAiTUFDX01HTVRfQVRJTSI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9ESVNBU1NPQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19NR01UX0RJU0FTU09DIjsKKyAgICAgICAgICAgIGNhc2UgU0lSX01BQ19NR01UX0FVVEg6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfTUdNVF9BVVRIIjsKKyAgICAgICAgICAgIGNhc2UgU0lSX01BQ19NR01UX0RFQVVUSDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19NR01UX0RFQVVUSCI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfTUdNVF9BQ1RJT046CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfTUdNVF9BQ1RJT04iOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX01HTVRfUkVTRVJWRUQxNToKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19NR01UX1JFU0VSVkVEMTUiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gTUdNVCBGcmFtZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbHNlIGlmICh0eXBlID09IFNJUl9NQUNfQ1RSTF9GUkFNRSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc3ViVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0NUUkxfUlI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfQ1RSTF9SUiI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfQ1RSTF9CQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfQ1RSTF9CQVIiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0NUUkxfQkE6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfQ1RSTF9CQSI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfQ1RSTF9QU19QT0xMOgorICAgICAgICAgICAgICAgIHJldHVybiAiTUFDX0NUUkxfUFNfUE9MTCI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfQ1RSTF9SVFM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfQ1RSTF9SVFMiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0NUUkxfQ1RTOgorICAgICAgICAgICAgICAgIHJldHVybiAiTUFDX0NUUkxfQ1RTIjsKKyAgICAgICAgICAgIGNhc2UgU0lSX01BQ19DVFJMX0FDSzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19DVFJMX0FDSyI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfQ1RSTF9DRl9FTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfQ1RSTF9DRl9FTkQiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0NUUkxfQ0ZfRU5EX0FDSzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19DVFJMX0NGX0VORF9BQ0siOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gQ1RSTCBGcmFtZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbHNlIGlmICh0eXBlID09IFNJUl9NQUNfREFUQV9GUkFNRSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc3ViVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0RBVEFfREFUQToKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19EQVRBX0RBVEEiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0RBVEFfREFUQV9BQ0s6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfREFUQV9EQVRBX0FDSyI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfREFUQV9EQVRBX1BPTEw6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfREFUQV9EQVRBX1BPTEwiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0RBVEFfREFUQV9BQ0tfUE9MTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19EQVRBX0RBVEFfQUNLX1BPTEwiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0RBVEFfTlVMTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19EQVRBX05VTEwiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0RBVEFfTlVMTF9BQ0s6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfREFUQV9OVUxMX0FDSyI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfREFUQV9OVUxMX1BPTEw6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfREFUQV9OVUxMX1BPTEwiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0RBVEFfTlVMTF9BQ0tfUE9MTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19EQVRBX05VTExfQUNLX1BPTEwiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0RBVEFfUU9TX0RBVEE6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfREFUQV9RT1NfREFUQSI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfREFUQV9RT1NfREFUQV9BQ0s6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfREFUQV9RT1NfREFUQV9BQ0siOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0RBVEFfUU9TX0RBVEFfUE9MTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19EQVRBX1FPU19EQVRBX1BPTEwiOworICAgICAgICAgICAgY2FzZSBTSVJfTUFDX0RBVEFfUU9TX0RBVEFfQUNLX1BPTEw6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNQUNfREFUQV9RT1NfREFUQV9BQ0tfUE9MTCI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfREFUQV9RT1NfTlVMTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19EQVRBX1FPU19OVUxMIjsKKyAgICAgICAgICAgIGNhc2UgU0lSX01BQ19EQVRBX1FPU19OVUxMX0FDSzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19EQVRBX1FPU19OVUxMX0FDSyI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfREFUQV9RT1NfTlVMTF9QT0xMOgorICAgICAgICAgICAgICAgIHJldHVybiAiTUFDX0RBVEFfUU9TX05VTExfUE9MTCI7CisgICAgICAgICAgICBjYXNlIFNJUl9NQUNfREFUQV9RT1NfTlVMTF9BQ0tfUE9MTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1BQ19EQVRBX1FPU19OVUxMX0FDS19QT0xMIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIERhdGEgRnJhbWUiOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICJVbmtub3duIjsKKyNlbmRpZgorcmV0dXJuICIiOworfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordm9pZCBsaW1IYW5kbGVVcGRhdGVPbGJjQ2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgaW50IGVuYWJsZTsKKyAgICB0VXBkYXRlQmVhY29uUGFyYW1zIGJlYWNvblBhcmFtczsKKworICAgIHRwUEVTZXNzaW9uICAgICAgIHBzZXNzaW9uRW50cnkgPSBsaW1Jc0FwU2Vzc2lvbkFjdGl2ZShwTWFjKTsKKworICAgIGlmIChwc2Vzc2lvbkVudHJ5ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBiZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXAgPSAwOworICAgIC8qCisgICAgKiogVGhpcyBpcyBkb2luZyBhIDIgcGFzcyBjaGVjay4gVGhlIGZpcnN0IHBhc3MgaXMgdG8gaW52YWxpZGF0ZQorICAgICoqIGFsbCB0aGUgY2FjaGUgZW50cmllcy4gVGhlIHNlY29uZCBwYXNzIGlzIHRvIGRlY2lkZSB3aGV0aGVyIHRvCisgICAgKiogZGlzYWJsZSBwcm90ZWN0aW9uLgorICAgICoqLworICAgIGlmICghZW5hYmxlKQorICAgIHsKKworICAgICAgICAgICAgUEVMT0cyKGxpbUxvZyhwTWFjLCBMT0cyLCBGTCgiUmVzZXR0aW5nIE9MQkMgY2FjaGVcbiIpKTspCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5udW1TdGEgPSAwOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMubnVtU3RhID0gMDsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwSHQyMFBhcmFtcy5udW1TdGEgPSAwOworICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU5vbkdmUGFyYW1zLm51bVN0YSA9IDA7CisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltTHNpZ1R4b3BQYXJhbXMubnVtU3RhID0gMDsKKworICAgICAgICBmb3IgKGk9MDsgaSA8IExJTV9QUk9UX1NUQV9PVkVSTEFQX0NBQ0hFX1NJWkU7IGkrKykKKyAgICAgICAgICAgIHBNYWMtPmxpbS5wcm90U3RhT3ZlcmxhcENhY2hlW2ldLmFjdGl2ZSA9IGZhbHNlOworCisgICAgICAgIGVuYWJsZSA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisKKyAgICAgICAgaWYgKCFwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5udW1TdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJPdmVybGFwIGNhY2hlIGFsbCBjbGVhciBhbmQgbm8gMTFCIFNUQSBkZXRlY3RlZFxuIikpOykKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlMTFnUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgdHJ1ZSwgJmJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5udW1TdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJPdmVybGFwIGNhY2hlIGFsbCBjbGVhciBhbmQgbm8gMTFHIFNUQSBkZXRlY3RlZFxuIikpOykKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRQcm90ZWN0aW9uRnJvbTExZyhwTWFjLCBmYWxzZSwgdHJ1ZSwgJmJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwSHQyMFBhcmFtcy5udW1TdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIk92ZXJsYXAgY2FjaGUgYWxsIGNsZWFyIGFuZCBubyBIVDIwIFNUQSBkZXRlY3RlZFxuIikpOykKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlMTFnUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgdHJ1ZSwgJmJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbmFibGUgPSAwOworICAgIH0KKworICAgIGlmKGJlYWNvblBhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcCkKKyAgICB7CisgICAgICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMscHNlc3Npb25FbnRyeSk7CisgICAgICAgIGxpbVNlbmRCZWFjb25QYXJhbXMocE1hYywgJmJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisgICAgfQorCisgICAgLy8gU3RhcnQgT0xCQyB0aW1lcgorICAgIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltVXBkYXRlT2xiY0NhY2hlVGltZXIpICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoInR4X3RpbWVyX2FjdGl2YXRlIGZhaWxlZFxuIikpOworICAgIH0KK30KKyNlbmRpZgorCisvKioKKyAqIGxpbUlzTnVsbFNzaWQoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBTc2lkIHN1cHBsaWVkIGlzIE51bGwgU1NJRAorICoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHRTaXJNYWNTU2lkICoKKyAqCisgKgorICogQHJldHVybiB0cnVlIGlmIFNTSUQgaXMgTnVsbCBTU0lEIGVsc2UgZmFsc2UKKyAqLworCit0QU5JX1U4CitsaW1Jc051bGxTc2lkKCB0U2lyTWFjU1NpZCAqcFNzaWQgKQoreworICAgIHRBTklfVTggZk51bGxTc2lkID0gZmFsc2U7CisgICAgdEFOSV9VMzIgU3NpZExlbmd0aDsKKyAgICB0QU5JX1U4ICpwU3NpZFN0cjsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiAoIDAgPT0gcFNzaWQtPmxlbmd0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZOdWxsU3NpZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisjZGVmaW5lIEFTQ0lJX1NQQUNFX0NIQVJBQ1RFUiAweDIwCisgICAgICAgIC8qIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXMgaXMgc3BhY2UsIHRoZW4gY2hlY2sgaWYgYWxsIGNoYXJhY3RlcnMgaW4gCisgICAgICAgICAqIFNTSUQgYXJlIHNwYWNlcyB0byBjb25zaWRlciBpdCBhcyBOVUxMIFNTSUQqLworICAgICAgICBpZiggQVNDSUlfU1BBQ0VfQ0hBUkFDVEVSID09IHBTc2lkLT5zc0lkWzBdKQorICAgICAgICB7CisgICAgICAgICAgICBTc2lkTGVuZ3RoID0gcFNzaWQtPmxlbmd0aDsKKyAgICAgICAgICAgIHBTc2lkU3RyID0gcFNzaWQtPnNzSWQ7CisgICAgICAgICAgICAvKiBjaGVjayBpZiBhbGwgdGhlIGNoYXJhY3RlcyBpbiBTU0lEIGFyZSBzcGFjZXMqLworICAgICAgICAgICAgd2hpbGUgKCBTc2lkTGVuZ3RoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggQVNDSUlfU1BBQ0VfQ0hBUkFDVEVSICE9ICpwU3NpZFN0ciApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAorICAgICAgICAgICAgICAgIHBTc2lkU3RyKys7CisgICAgICAgICAgICAgICAgU3NpZExlbmd0aC0tOworICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgaWYoIDAgPT0gU3NpZExlbmd0aCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZk51bGxTc2lkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIGFsbCB0aGUgY2hhcmFjdGVzIGluIFNTSUQgYXJlIE5VTEwqLworICAgICAgICAgICAgU3NpZExlbmd0aCA9IHBTc2lkLT5sZW5ndGg7CisgICAgICAgICAgICBwU3NpZFN0ciA9IHBTc2lkLT5zc0lkOworCisgICAgICAgICAgICB3aGlsZSAoIFNzaWRMZW5ndGggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAqcFNzaWRTdHIgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHBTc2lkU3RyKys7CisgICAgICAgICAgICAgICAgU3NpZExlbmd0aC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggMCA9PSBTc2lkTGVuZ3RoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmTnVsbFNzaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHdoaWxlKCAwICk7CisKKyAgICByZXR1cm4gZk51bGxTc2lkOworfSAvKioqKioqIGVuZCBsaW1Jc051bGxTc2lkKCkgKioqKioqLworCisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1VcGRhdGVQcm90U3RhUGFyYW1zCitcYnJpZWYgdXBkYXRlcyBwcm90ZWN0aW9uIHJlbGF0ZWQgY291bnRlcnMuCitccGFyYW0gICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gICAgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkcgorXHBhcmFtICAgICAgdExpbVByb3RTdGFDYWNoZVR5cGUgcHJvdFN0YUNhY2hlVHlwZQorXHBhcmFtICAgICAgdEhhbEJpdFZhbCBnZlN1cHBvcnRlZAorXHBhcmFtICAgICAgdEhhbEJpdFZhbCBsc2lnVHhvcFN1cHBvcnRlZAorXHJldHVybiAgICAgIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1VcGRhdGVQcm90U3RhUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsCit0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwgdExpbVByb3RTdGFDYWNoZVR5cGUgcHJvdFN0YUNhY2hlVHlwZSwKK3RIYWxCaXRWYWwgZ2ZTdXBwb3J0ZWQsIHRIYWxCaXRWYWwgbHNpZ1R4b3BTdXBwb3J0ZWQsCit0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICB0QU5JX1UzMiBpOworCisgIFBFTE9HMShsaW1Mb2cocE1hYyxMT0cxLCBGTCgiQSBTVEEgaXMgYXNzb2NpYXRlZDoiKSk7CisgIGxpbUxvZyhwTWFjLExPRzEsIEZMKCJBZGRyIDogIikpOworICBsaW1QcmludE1hY0FkZHIocE1hYywgcGVlck1hY0FkZHIsIExPRzEpOykKKworICBmb3IgKGk9MDsgaTxMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKQorICB7CisgICAgICBpZiAocHNlc3Npb25FbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSkKKyAgICAgIHsKKyAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJBZGRyOiAiKSk7KQorICAgICAgICAgIFBFTE9HMShsaW1QcmludE1hY0FkZHIocE1hYywgcHNlc3Npb25FbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFkZHIsIExPRzEpOykKKworICAgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFkZHIsCisgICAgICAgICAgICAgIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIm1hdGNoaW5nIGNhY2hlIGVudHJ5IGF0ICVkIGFscmVhZHkgYWN0aXZlLlxuIiksIGkpOykKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCisgIGZvciAoaT0wOyBpPExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFOyBpKyspCisgIHsKKyAgICAgIGlmICghcHNlc3Npb25FbnRyeS0+cHJvdFN0YUNhY2hlW2ldLmFjdGl2ZSkKKyAgICAgICAgICBicmVhazsKKyAgfQorCisgIGlmIChpID49IExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFKQorICB7CisgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJObyBzcGFjZSBpbiBQcm90U3RhQ2FjaGVcbiIpKTspCisgICAgICByZXR1cm47CisgIH0KKworICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5wcm90U3RhQ2FjaGVbaV0uYWRkciwKKyAgICAgICAgICAgICAgICBwZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICBwc2Vzc2lvbkVudHJ5LT5wcm90U3RhQ2FjaGVbaV0ucHJvdFN0YUNhY2hlVHlwZSA9IHByb3RTdGFDYWNoZVR5cGU7CisgIHBzZXNzaW9uRW50cnktPnByb3RTdGFDYWNoZVtpXS5hY3RpdmUgPSB0cnVlOworICBpZihlTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfbGxCID09IHByb3RTdGFDYWNoZVR5cGUpCisgIHsKKyAgICAgIHBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMubnVtU3RhKys7CisgICAgICBsaW1Mb2cocE1hYyxMT0cxLCBGTCgiMTFCLCAiKSk7CisgIH0KKyAgZWxzZSBpZihlTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfbGxHID09IHByb3RTdGFDYWNoZVR5cGUpCisgIHsKKyAgICAgIHBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMubnVtU3RhKys7CisgICAgICBsaW1Mb2cocE1hYyxMT0cxLCBGTCgiMTFHLCAiKSk7CisgIH0KKyAgZWxzZSAgIGlmKGVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9IVDIwID09IHByb3RTdGFDYWNoZVR5cGUpCisgIHsKKyAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1IdDIwUGFyYW1zLm51bVN0YSsrOworICAgICAgbGltTG9nKHBNYWMsTE9HMSwgRkwoIkhUMjAsICIpKTsKKyAgfQorCisgIGlmKCFnZlN1cHBvcnRlZCkKKyAgeworICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltTm9uR2ZQYXJhbXMubnVtU3RhKys7CisgICAgICBsaW1Mb2cocE1hYyxMT0cxLCBGTCgiTm9uR2YsICIpKTsKKyAgfQorICBpZighbHNpZ1R4b3BTdXBwb3J0ZWQpCisgIHsKKyAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1Mc2lnVHhvcFBhcmFtcy5udW1TdGErKzsKKyAgICAgIGxpbUxvZyhwTWFjLExPRzEsIEZMKCIhbHNpZ1R4b3BTdXBwb3J0ZWRcbiIpKTsKKyAgfQorfS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbURlY2lkZUFwUHJvdGVjdGlvbgorXGJyaWVmIERlY2lkZXMgYWxsIHRoZSBwcm90ZWN0aW9uIHJlbGF0ZWQgc3RhaXRvbiBjb2V4aXN0ZW5jZSBhbmQgYWxzbyBzZXRzCitcICAgICAgICBzaG9ydCBwcmVhbWJsZSBhbmQgc2hvcnQgc2xvdCBhcHByb3ByaWF0ZWx5LiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCitcICAgICAgICB3aGVuIEFQIGlzIHJlYWR5IHRvIHNlbmQgYXNzb2NSc3AgdHAgdGhlIHN0YXRpb24gam9pbmluZyByaWdodCBub3cuCitccGFyYW0gICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gICAgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkcgorXHJldHVybiAgICAgIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1EZWNpZGVBcFByb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgdG1wQWlkOworICAgIHRwRHBoSGFzaE5vZGUgICAgcFN0YURzOworICAgIHRTaXJSRkJhbmQgIHJmQmFuZCA9IFNJUl9CQU5EX1VOS05PV047CisgICAgdEFOSV9VMzIgcGh5TW9kZTsKKyAgICB0TGltUHJvdFN0YUNhY2hlVHlwZSBwcm90U3RhQ2FjaGVUeXBlID0gZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX0lOVkFMSUQ7CisgICAgdEhhbEJpdFZhbCBnZlN1cHBvcnRlZCA9IGVIQUxfU0VULCBsc2lnVHhvcFN1cHBvcnRlZCA9IGVIQUxfU0VUOworCisgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgPSAwOworICAgIC8vIGNoZWNrIHdoZXRoZXIgdG8gZW5hYmxlIHByb3RlY3Rpb24gb3Igbm90CisgICAgcFN0YURzID0gZHBoTG9va3VwSGFzaEVudHJ5KHBNYWMsIHBlZXJNYWNBZGRyLCAmdG1wQWlkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgaWYoTlVMTCA9PSBwU3RhRHMpCisgICAgeworICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgicFN0YURzIGlzIE5VTExcbiIpKTspCisgICAgICByZXR1cm47CisgICAgfQorICAgIGxpbUdldFJmQmFuZChwTWFjLCAmcmZCYW5kLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAvL2lmIHdlIGFyZSBpbiA1IEdIWiBiYW5kCisgICAgaWYoU0lSX0JBTkRfNV9HSFogPT0gcmZCYW5kKQorICAgIHsKKyAgICAgICAgLy9XZSBhcmUgMTFOLiB3ZSBuZWVkIHRvIHByb3RlY3QgZnJvbSAxMUEgYW5kIEh0MjAuIHdlIGRvbid0IG5lZWQgYW55IG90aGVyIHByb3RlY3Rpb24gaW4gNSBHSFouCisgICAgICAgIC8vSFQyMCBjYXNlIGlzIGNvbW1vbiBiZXR3ZWVuIGJvdGggdGhlIGJhbmRzIGFuZCBoYW5kbGVkIGRvd24gYXMgY29tbW9uIGNvZGUuCisgICAgICAgIGlmKHRydWUgPT0gcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KQorICAgICAgICB7CisgICAgICAgICAgICAvL3dlIGFyZSAxMU4gYW5kIDExQSBzdGF0aW9uIGlzIGpvaW5pbmcuICAgICAgICAKKyAgICAgICAgICAgIC8vcHJvdGVjdGlvbiBmcm9tIDExQSByZXF1aXJlZC4gICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKGZhbHNlID09IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltRW5hYmxlMTFhUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBmYWxzZSwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihTSVJfQkFORF8yXzRfR0haPT0gcmZCYW5kKQorICAgIHsKKyAgICAgICAgbGltR2V0UGh5TW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgLy9XZSBhcmUgMTFHLiBDaGVjayBpZiB3ZSBuZWVkIHByb3RlY3Rpb24gZnJvbSAxMWIgU3RhdGlvbnMuCisgICAgICAgIGlmICgocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykgJiYKKyAgICAgICAgICAgICAgKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSkpCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKHBTdGFEcy0+ZXJwRW5hYmxlZD09IGVIQUxfQ0xFQVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvdFN0YUNhY2hlVHlwZSA9IGVMSU1fUFJPVF9TVEFfQ0FDSEVfVFlQRV9sbEI7CisgICAgICAgICAgICAgICAgLy8gZW5hYmxlIHByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJFbmFibGluZyBwcm90ZWN0aW9uIGZyb20gMTFCXG4iKSk7KQorICAgICAgICAgICAgICAgIGxpbUVuYWJsZTExZ1Byb3RlY3Rpb24ocE1hYywgdHJ1ZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL0hUIHN0YXRpb24uCisgICAgICAgIGlmICh0cnVlID09IHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9jaGVjayBpZiB3ZSBuZWVkIHByb3RlY3Rpb24gZnJvbSAxMWIgc3RhdGlvbgorICAgICAgICAgICAgaWYgKChwU3RhRHMtPmVycEVuYWJsZWQgPT0gZUhBTF9DTEVBUikgJiYKKyAgICAgICAgICAgICAgICAoIXBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3RTdGFDYWNoZVR5cGUgPSBlTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfbGxCOworICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBwcm90ZWN0aW9uCisgICAgICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiRW5hYmxpbmcgcHJvdGVjdGlvbiBmcm9tIDExQlxuIikpOykKKyAgICAgICAgICAgICAgICBsaW1FbmFibGUxMWdQcm90ZWN0aW9uKHBNYWMsIHRydWUsIGZhbHNlLCBwQmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vc3RhdGlvbiBiZWluZyBqb2luZWQgaXMgbm9uLTExYiBhbmQgbm9uLWh0ID09PiAxMWcgZGV2aWNlCisgICAgICAgICAgICBlbHNlIGlmKCFwU3RhRHMtPm1sbVN0YUNvbnRleHQuaHRDYXBhYmlsaXR5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3RTdGFDYWNoZVR5cGUgPSBlTElNX1BST1RfU1RBX0NBQ0hFX1RZUEVfbGxHOworICAgICAgICAgICAgICAgIC8vZW5hYmxlIHByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFByb3RlY3Rpb25Gcm9tMTFnKHBNYWMsIHRydWUsIGZhbHNlLCBwQmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vRVJQIG1vZGUgaXMgZW5hYmxlZCBmb3IgdGhlIGxhdGVzdCBzdGF0aW9uIGpvaW5lZAorICAgICAgICAgICAgLy9sYXRlc3Qgc3RhdGlvbiBqb2luZWQgaXMgSFQgY2FwYWJsZQorICAgICAgICAgICAgLy9UaGlzIGNhc2UgaXMgYmVpbmcgaGFuZGxlZCBpbiBjb21tb24gY29kZSAoY29tbW4gYmV0d2VlbiBib3RoIHRoZSBiYW5kcykgYmVsb3cuCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3dlIGFyZSBIVCBhbmQgSFQgc3RhdGlvbiBpcyBqb2luaW5nLiBUaGlzIGNvZGUgaXMgY29tbW9uIGZvciBib3RoIHRoZSBiYW5kcy4KKyAgICBpZigodHJ1ZSA9PSBwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkpICYmCisgICAgICAgICh0cnVlID09IHBTdGFEcy0+bWxtU3RhQ29udGV4dC5odENhcGFiaWxpdHkpKQorICAgIHsKKyAgICAgICAgaWYoIXBTdGFEcy0+aHRHcmVlbmZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgbGltRW5hYmxlSFROb25HZlByb3RlY3Rpb24ocE1hYywgdHJ1ZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgIGdmU3VwcG9ydGVkID0gZUhBTF9DTEVBUjsKKyAgICAgICAgfQorICAgICAgICAvL1N0YXRpb24gam9pbmluZyBpcyBIVCAyME1oegorICAgICAgICBpZihlSFRfQ0hBTk5FTF9XSURUSF8yME1IWiA9PSBwU3RhRHMtPmh0U3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KQorICAgICAgICB7CisgICAgICAgICAgICBwcm90U3RhQ2FjaGVUeXBlID0gZUxJTV9QUk9UX1NUQV9DQUNIRV9UWVBFX0hUMjA7CisgICAgICAgICAgICBsaW1FbmFibGVIVDIwUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBmYWxzZSwgcEJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIH0KKyAgICAgICAgLy9TdGF0aW9uIGpvaW5pbmcgZG9lcyBub3Qgc3VwcG9ydCBMU0lHIFRYT1AgUHJvdGVjdGlvbgorICAgICAgICBpZighcFN0YURzLT5odExzaWdUWE9QUHJvdGVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgbGltRW5hYmxlSFRMc2lnVHhvcFByb3RlY3Rpb24ocE1hYywgZmFsc2UsIGZhbHNlLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgbHNpZ1R4b3BTdXBwb3J0ZWQgPSBlSEFMX0NMRUFSOworICAgICAgICB9CisgICAgfQorCisgICAgbGltVXBkYXRlUHJvdFN0YVBhcmFtcyhwTWFjLCBwZWVyTWFjQWRkciwgcHJvdFN0YUNhY2hlVHlwZSwKKyAgICAgICAgICAgICAgZ2ZTdXBwb3J0ZWQsIGxzaWdUeG9wU3VwcG9ydGVkLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZgorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltRW5hYmxlT3ZlcmxhcDExZ1Byb3RlY3Rpb24KK1xicmllZiB3cmFwcGVyIGZ1bmN0aW9uIGZvciBzZXR0aW5nIG92ZXJsYXAgMTFnIHByb3RlY3Rpb24uCitccGFyYW0gICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gICAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zCitccGFyYW0gICAgICB0cFNpck1hY01nbXRIZHIgICAgICAgICBwTWgKK1xyZXR1cm4gICAgICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltRW5hYmxlT3ZlcmxhcDExZ1Byb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywKK3RwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsIHRwU2lyTWFjTWdtdEhkciBwTWgsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICBsaW1VcGRhdGVPdmVybGFwU3RhUGFyYW0ocE1hYywgcE1oLT5ic3NJZCwgJihwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcykpOworCisgICAgaWYgKHBzZXNzaW9uRW50cnktPmdMaW1PbGJjUGFyYW1zLm51bVN0YSAmJgorICAgICAgICAhcHNlc3Npb25FbnRyeS0+Z0xpbU9sYmNQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgeworICAgICAgICAvLyBlbmFibGUgcHJvdGVjdGlvbgorICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJPTEJDIGhhcHBlbnMhISFcbiIpKTspCisgICAgICAgIGxpbUVuYWJsZTExZ1Byb3RlY3Rpb24ocE1hYywgdHJ1ZSwgdHJ1ZSwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICB9Cit9CisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1VcGRhdGVTaG9ydFByZWFtYmxlCitcYnJpZWYgVXBkYXRlcyBzaG9ydCBwcmVhbWJsZSBpZiBuZWVkZWQgd2hlbiBhIG5ldyBzdGF0aW9uIGpvaW5zLgorXHBhcmFtICAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworXHBhcmFtICAgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIKK1xwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gICAgICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltVXBkYXRlU2hvcnRQcmVhbWJsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwKKyAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTE2ICAgICAgICAgdG1wQWlkOworICAgIHRwRHBoSGFzaE5vZGUgICAgcFN0YURzOworICAgIHRBTklfVTMyICAgICAgICAgcGh5TW9kZTsKKyAgICB0QU5JX1UxNiAgICAgICAgIGk7CisKKyAgICAvLyBjaGVjayB3aGV0aGVyIHRvIGVuYWJsZSBwcm90ZWN0aW9uIG9yIG5vdAorICAgIHBTdGFEcyA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBwZWVyTWFjQWRkciwgJnRtcEFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisgICAgbGltR2V0UGh5TW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICBpZiAocFN0YURzICE9IE5VTEwgJiYgcGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykKKworICAgIHsgICAgICAgIAorICAgICAgICBpZiAocFN0YURzLT5zaG9ydFByZWFtYmxlRW5hYmxlZCA9PSBlSEFMX0NMRUFSKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsTE9HMSxGTCgiU2hvcnQgUHJlYW1ibGUgaXMgbm90IGVuYWJsZWQgaW4gQXNzb2MgUmVxIGZyb20gIikpOworICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcGVlck1hY0FkZHIsIExPRzEpOykKKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFOyBpKyspCisgICAgICAgICAgICAgICAgeworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKSAgJiYKKyAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLnN0YU5vU2hvcnRDYWNoZVtpXS5hY3RpdmUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLnN0YU5vU2hvcnRDYWNoZVtpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlck1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9ZWxzZSBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltTm9TaG9ydFBhcmFtcy5zdGFOb1Nob3J0Q2FjaGVbaV0uYWN0aXZlKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTm9TaG9ydFBhcmFtcy5zdGFOb1Nob3J0Q2FjaGVbaV0uYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBmb3IgKGk9MDsgaTxMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKQorICAgICAgICAgICAgeworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICkgICYmCisgICAgICAgICAgICAgICAgICAgICAgIXBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLnN0YU5vU2hvcnRDYWNoZVtpXS5hY3RpdmUpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAKKyNlbmRpZiAgICAgICAgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBNYWMtPmxpbS5nTGltTm9TaG9ydFBhcmFtcy5zdGFOb1Nob3J0Q2FjaGVbaV0uYWN0aXZlKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpID49IExJTV9QUk9UX1NUQV9DQUNIRV9TSVpFKQorICAgICAgICAgICAgeworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSl7CisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiTm8gc3BhY2UgaW4gU2hvcnQgY2FjaGUgKCNhY3RpdmUgJWQsICNzdGEgJWQpIGZvciBzdGEgIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcHNlc3Npb25FbnRyeS0+Z0xpbU5vU2hvcnRQYXJhbXMubnVtTm9uU2hvcnRQcmVhbWJsZVN0YSk7CisgICAgICAgICAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwZWVyTWFjQWRkciwgTE9HRSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIk5vIHNwYWNlIGluIFNob3J0IGNhY2hlICgjYWN0aXZlICVkLCAjc3RhICVkKSBmb3Igc3RhICIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHBNYWMtPmxpbS5nTGltTm9TaG9ydFBhcmFtcy5udW1Ob25TaG9ydFByZWFtYmxlU3RhKTsKKyAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBlZXJNYWNBZGRyLCBMT0dFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSl7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+Z0xpbU5vU2hvcnRQYXJhbXMuc3RhTm9TaG9ydENhY2hlW2ldLmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBwZWVyTWFjQWRkciwgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLnN0YU5vU2hvcnRDYWNoZVtpXS5hY3RpdmUgPSB0cnVlOworICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0UGFyYW1zLm51bU5vblNob3J0UHJlYW1ibGVTdGErKzsKKyAgICAgICAgICAgIH1lbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTWFjLT5saW0uZ0xpbU5vU2hvcnRQYXJhbXMuc3RhTm9TaG9ydENhY2hlW2ldLmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlck1hY0FkZHIsICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU5vU2hvcnRQYXJhbXMuc3RhTm9TaG9ydENhY2hlW2ldLmFjdGl2ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1Ob1Nob3J0UGFyYW1zLm51bU5vblNob3J0UHJlYW1ibGVTdGErKzsgICAgICAgIAorICAgICAgICAgICAgfSAKKworCisgICAgICAgICAgICAvLyBlbmFibGUgbG9uZyBwcmVhbWJsZQorICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiRGlzYWJsaW5nIHNob3J0IHByZWFtYmxlXG4iKSk7KQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgaWYgKGxpbUVuYWJsZVNob3J0UHJlYW1ibGUocE1hYywgZmFsc2UsIHBCZWFjb25QYXJhbXMsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgZW5hYmxlIGxvbmcgcHJlYW1ibGVcbiIpKTspCisjZWxzZQorICAgICAgICAgICAgaWYgKGxpbUVuYWJsZVNob3J0UHJlYW1ibGUocE1hYywgZmFsc2UsIHBCZWFjb25QYXJhbXMpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgZW5hYmxlIGxvbmcgcHJlYW1ibGVcbiIpKTspCisKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVVwZGF0ZVNob3J0U2xvdFRpbWUKK1xicmllZiBVcGRhdGVzIHNob3J0IHNsb3QgdGltZSBpZiBuZWVkZWQgd2hlbiBhIG5ldyBzdGF0aW9uIGpvaW5zLgorXHBhcmFtICAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworXHBhcmFtICAgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIKK1xwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gICAgICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkCitsaW1VcGRhdGVTaG9ydFNsb3RUaW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLAorICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMTYgICAgICAgICAgICAgIHRtcEFpZDsKKyAgICB0cERwaEhhc2hOb2RlICAgIHBTdGFEczsKKyAgICB0QU5JX1UzMiBwaHlNb2RlOworICAgIHRBTklfVTMyIHZhbDsKKyAgICB0QU5JX1UzMiBjU2hvcnRTbG90OworICAgIHRBTklfVTE2IGk7CisKKyAgICAvLyBjaGVjayB3aGV0aGVyIHRvIGVuYWJsZSBwcm90ZWN0aW9uIG9yIG5vdAorICAgIHBTdGFEcyA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBwZWVyTWFjQWRkciwgJnRtcEFpZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgIGxpbUdldFBoeU1vZGUocE1hYywgJnBoeU1vZGUsIHBzZXNzaW9uRW50cnkpOworCisgICAgaWYgKHBTdGFEcyAhPSBOVUxMICYmIHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpCisgICAgeworICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19TSE9SVF9TTE9UX1RJTUUsICZjU2hvcnRTbG90KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInVuYWJsZSB0byBnZXQgc2hvcnQgc2xvdCB0aW1lXG4iKSk7CisKKyAgICAgICAgaWYgKHBTdGFEcy0+c2hvcnRTbG90VGltZUVuYWJsZWQgPT0gZUhBTF9DTEVBUikKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU2hvcnQgU2xvdCBUaW1lIGlzIG5vdCBlbmFibGVkIGluIEFzc29jIFJlcSBmcm9tICIpKTsKKyAgICAgICAgICAgIGxpbVByaW50TWFjQWRkcihwTWFjLCBwZWVyTWFjQWRkciwgTE9HMSk7KQorICAgICAgICAgICAgZm9yIChpPTA7IGk8TElNX1BST1RfU1RBX0NBQ0hFX1NJWkU7IGkrKykKKyAgICAgICAgICAgIHsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgaWYgKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSApICYmCisgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltTm9TaG9ydFNsb3RQYXJhbXMuc3RhTm9TaG9ydFNsb3RDYWNoZVtpXS5hY3RpdmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU5vU2hvcnRTbG90UGFyYW1zLnN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX0FQX1JPTEUgKQorI2VuZGlmCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5zdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFjdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltTm9TaG9ydFNsb3RQYXJhbXMuc3RhTm9TaG9ydFNsb3RDYWNoZVtpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGk9MDsgaTxMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRTsgaSsrKQorICAgICAgICAgICAgeworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICFwc2Vzc2lvbkVudHJ5LT5nTGltTm9TaG9ydFNsb3RQYXJhbXMuc3RhTm9TaG9ydFNsb3RDYWNoZVtpXS5hY3RpdmUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKCFwTWFjLT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLnN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWN0aXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaSA+PSBMSU1fUFJPVF9TVEFfQ0FDSEVfU0laRSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpeworICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIk5vIHNwYWNlIGluIFNob3J0U2xvdCBjYWNoZSAoI2FjdGl2ZSAlZCwgI3N0YSAlZCkgZm9yIHN0YSAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBwc2Vzc2lvbkVudHJ5LT5nTGltTm9TaG9ydFNsb3RQYXJhbXMubnVtTm9uU2hvcnRTbG90U3RhKTsKKyAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNYWNBZGRyKHBNYWMsIHBlZXJNYWNBZGRyLCBMT0dFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH1lbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiTm8gc3BhY2UgaW4gU2hvcnRTbG90IGNhY2hlICgjYWN0aXZlICVkLCAjc3RhICVkKSBmb3Igc3RhICIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcE1hYy0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5udW1Ob25TaG9ydFNsb3RTdGEpOworICAgICAgICAgICAgICAgICAgICBsaW1QcmludE1hY0FkZHIocE1hYywgcGVlck1hY0FkZHIsIExPR0UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSl7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+Z0xpbU5vU2hvcnRTbG90UGFyYW1zLnN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU5vU2hvcnRTbG90UGFyYW1zLnN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWN0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltTm9TaG9ydFNsb3RQYXJhbXMubnVtTm9uU2hvcnRTbG90U3RhKys7CisgICAgICAgICAgICB9ZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5zdGFOb1Nob3J0U2xvdENhY2hlW2ldLmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLnN0YU5vU2hvcnRTbG90Q2FjaGVbaV0uYWN0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU5vU2hvcnRTbG90UGFyYW1zLm51bU5vblNob3J0U2xvdFN0YSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRUQsICZ2YWwpOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgaWYgKCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpICYmIAorICAgICAgICAgICAgICAgICAodmFsICYmIHBzZXNzaW9uRW50cnktPmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5udW1Ob25TaG9ydFNsb3RTdGEgJiYgY1Nob3J0U2xvdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZW5hYmxlIGxvbmcgc2xvdCB0aW1lCisgICAgICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+ZlNob3J0U2xvdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9TSE9SVF9TTE9UX1RJTUVfQ0hBTkdFRDsKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJEaXNhYmxlIHNob3J0IHNsb3QgdGltZS4gRW5hYmxlIGxvbmcgc2xvdCB0aW1lLlxuIikpOykKKyAgICAgICAgICAgICAgICBpZiAoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfU0hPUlRfU0xPVF9USU1FLCBmYWxzZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICAgRkwoImNvdWxkIG5vdCB1cGRhdGUgc2hvcnQgc2xvdCB0aW1lIGF0IENGR1xuIikpOykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkKKyNlbmRpZiAgICAgICAgICAgIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWwgJiYgcE1hYy0+bGltLmdMaW1Ob1Nob3J0U2xvdFBhcmFtcy5udW1Ob25TaG9ydFNsb3RTdGEgJiYgY1Nob3J0U2xvdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBsb25nIHNsb3QgdGltZQorICAgICAgICAgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5mU2hvcnRTbG90VGltZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9TSE9SVF9TTE9UX1RJTUVfQ0hBTkdFRDsKKyAgICAgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiRGlzYWJsZSBzaG9ydCBzbG90IHRpbWUuIEVuYWJsZSBsb25nIHNsb3QgdGltZS5cbiIpKTspCisgICAgICAgICAgICAgICAgICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR19TSE9SVF9TTE9UX1RJTUUsIGZhbHNlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICAgRkwoImNvdWxkIG5vdCB1cGRhdGUgc2hvcnQgc2xvdCB0aW1lIGF0IENGR1xuIikpOykKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQpICYmIGRlZmluZWQgKEFOSV9QUk9EVUNUX1RZUEVfQVApCisvKioKKyAqIGxpbURldGVjdFJhZGFyKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHdoZW4gTElNIHJlY2VpdmVzCisgKiBTSVJfTElNX1JBREFSX0RFVEVDVF9JTkQgaW4gbGltIG1lc2FnZSBxdWV1ZS4KKyAqIExJTSB3aWxsIG5vdGlmeSBXU00gb2YgdGhpcyBldmVudCBieSBzZW5kaW5nCisgKiBXU00gdGhlIHdpcmVsZXNzIG1lZGl1bSBzdGF0dXMgY2hhbmdlCisgKiBub3RpZmljYXRpb24gbWVzc2FnZS4KKyAqCisgKgorICpMT0dJQzoKKyAqCisgKkFTU1VNUFRJT05TOgorICogTkEKKyAqCisgKk5PVEU6CisgKiBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIG1lc3NhZ2UgICAgICAgIC0gYSB0U2lyUmFkYXJJbmZvIHN0cnVjdCB0eXBlIG1lc3NhZ2Ugc2VuZCBieSBIQUwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtZXNzYWdlIGlzIG5vdCBzZXJpYWxpemVkLgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK2xpbURldGVjdFJhZGFyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnKQoreworICAgIHRwU2lyUmFkYXJJbmZvICAgICAgcFJhZGFySW5mbzsKKworICAgIGlmICghcE1zZykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiTWVzc2FnZSBpcyBOVUxMXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwUmFkYXJJbmZvID0gKHRwU2lyUmFkYXJJbmZvKXBNc2c7CisKKyAgICBpZiAoKHBNYWMtPmxpbS5nTGltQ3VycmVudENoYW5uZWxJZCA9PSBwUmFkYXJJbmZvLT5jaGFubmVsTnVtYmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlICE9IGVMSU1fVU5LTk9XTl9ST0xFKSkKKyAgICB7CisgICAgICAgIExJTV9TRVRfUkFEQVJfREVURUNURUQocE1hYywgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICBsaW1TdG9wTWVhc1RpbWVycyhwTWFjKTsKKyAgICAgICAgLyogU3RvcCB0aGUgdHJhbnNtaXNzaW9uIG9mIGFsbCBwYWNrZXRzIGV4Y2VwdCBiZWFjb25zLgorICAgICAgICAgKiBUaGlzIGlzIGRvbmUgaGVyZSwgYXNzdW1pbmcgdGhhdCB3ZSB3aWxsIGRlZmluaXRlbHkgZ2V0IGEgY2hhbm5lbCBzd2l0Y2ggCisgICAgICAgICAqIHJlcXVlc3QgZnJvbSBXU00uCisgICAgICAgICAqLworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsICJTdG9wcGluZyB0aGUgdHJhbnNtaXNzaW9uIG9uIEFQXG4iKTspCisgICAgICAgIGxpbUZyYW1lVHJhbnNtaXNzaW9uQ29udHJvbChwTWFjLCBlTElNX1RYX0JTU19CVVRfQkVBQ09OLCBlTElNX1NUT1BfVFgpOworICAgIH0KKworICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICBGTCgibGltRGV0ZWN0UmFkYXIoKTo6IHB1bHNld2lkdGggPSAlZCwgbnVtUHVsc2U9JWQsIGNoYW5uZWxJZD0lZFxuIiksCisgICAgICAgIHBSYWRhckluZm8tPnJhZGFyUHVsc2VXaWR0aCwgcFJhZGFySW5mby0+bnVtUmFkYXJQdWxzZSwKKyAgICAgICAgcFJhZGFySW5mby0+Y2hhbm5lbE51bWJlcik7KQorCisgICAgbGltU2VuZFNtZVdtU3RhdHVzQ2hhbmdlTnRmKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU01FX1JBREFSX0RFVEVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VMTYpc2l6ZW9mKCpwUmFkYXJJbmZvKSwwKTsKKyAgICAKK30KKyNlbmRpZgorCisjIGlmIDAKKy8vVEJEX1JBSkVTSCA6OiBUTyBTT0xWRSBMSU5LSU5HIElTU1VFCit2b2lkCitsaW1VcGRhdGVTaG9ydFNsb3RUaW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLCAvL2R1bW15IHRvIGF2b2lkIGxpbmtpbmcgcHJvYmxlbQorICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMpCit7CisKK30KKworLy9UQkRfUkFKRVNIIDo6IFRPIFNPTFZFIExJTktJTkcgSVNTVUUKK3ZvaWQKK2xpbVVwZGF0ZVNob3J0UHJlYW1ibGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsICAgIC8vZHVtbXkgdG8gYXZvaWQgbGlua2luZyBwcm9ibGVtCisgICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcykKKyAgICAKK3sKK30KKworLy9UQkRfUkFKRVNIIDo6IFRPIFNPTFZFIExJTktJTkcgSVNTVUUKKwordm9pZCAgIC8vZHVtbXkgdG8gYXZvaWQgbGlua2luZyBwcm9ibGVtCitsaW1EZWNpZGVBcFByb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKK30KKworI2VuZGlmCisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1EZWNpZGVTdGFQcm90ZWN0aW9uT25Bc3NvYworXGJyaWVmIERlY2lkZSBwcm90ZWN0aW9uIHJlbGF0ZWQgc2V0dGluZ3Mgb24gU3RhIHdoaWxlIGFzc29jaWF0aW9uLgorXHBhcmFtICAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworXHBhcmFtICAgICAgdHBTY2hCZWFjb25TdHJ1Y3QgcEJlYWNvblN0cnVjdAorXHJldHVybiAgICAgIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsaW1EZWNpZGVTdGFQcm90ZWN0aW9uT25Bc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRwU2NoQmVhY29uU3RydWN0IHBCZWFjb25TdHJ1Y3QsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdFNpclJGQmFuZCByZkJhbmQgPSBTSVJfQkFORF9VTktOT1dOOworICAgIHRBTklfVTMyIHBoeU1vZGUgPSBXTklfQ0ZHX1BIWV9NT0RFX05PTkU7CisKKyAgICBsaW1HZXRSZkJhbmQocE1hYywgJnJmQmFuZCwgcHNlc3Npb25FbnRyeSk7CisgICAgbGltR2V0UGh5TW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICBpZihTSVJfQkFORF81X0dIWiA9PSByZkJhbmQpCisgICAgeworICAgICAgICBpZigoZVNJUl9IVF9PUF9NT0RFX01JWEVEID09IHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5vcE1vZGUpICB8fAorICAgICAgICAgICAgICAgICAgICAoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZID09IHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5vcE1vZGUpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5mcm9tbGxhKQorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGFDb2V4aXN0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQgPT0gcEJlYWNvblN0cnVjdC0+SFRJbmZvLm9wTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24uaHQyMCkKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuaHQyMENvZXhpc3QgPSB0cnVlOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZSBpZihTSVJfQkFORF8yXzRfR0haID09IHJmQmFuZCkKKyAgICB7CisgICAgICAgIC8vc3BlYyA3LjMuMi4xMworICAgICAgICAvL1VzZVByb3RlY3Rpb24gd2lsbCBiZSBzZXQgd2hlbiBub25FUlAgU1RBIGlzIGFzc29jaWF0ZWQuCisgICAgICAgIC8vTm9uRVJQUHJlc2VudCBiaXQgd2lsbCBiZSBzZXQgd2hlbjoKKyAgICAgICAgLy8tLW5vbkVSUCBTdGEgaXMgYXNzb2NpYXRlZCBPUgorICAgICAgICAvLy0tbm9uRVJQIFN0YSBleGlzdHMgaW4gb3ZlcmxhcHBpbmcgQlNTCisgICAgICAgIC8vd2hlbiB1c2VQcm90ZWN0aW9uIGlzIG5vdCBzZXQgdGhlbiBwcm90ZWN0aW9uIGZyb20gbm9uRVJQIHN0YXRpb25zIGlzIG9wdGlvbmFsLgorCisgICAgICAgIC8vQ0ZHIHByb3RlY3Rpb24gZnJvbSAxMWIgaXMgZW5hYmxlZCBhbmQKKyAgICAgICAgLy8xMUIgZGV2aWNlIGluIHRoZSBCU1MKKyAgICAgICAgIC8qIFRPRE8sIFRoaXMgaXMgbm90IHNlc3Npb25pemVkICovCisgICAgICAgIGlmIChwaHlNb2RlICE9IFdOSV9DRkdfUEhZX01PREVfMTFCKSAKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmZyb21sbGIgJiYKKyAgICAgICAgICAgICAgICBwQmVhY29uU3RydWN0LT5lcnBQcmVzZW50ICYmCisgICAgICAgICAgICAgICAgKHBCZWFjb25TdHJ1Y3QtPmVycElFSW5mby51c2VQcm90ZWN0aW9uIHx8CisgICAgICAgICAgICAgICAgcEJlYWNvblN0cnVjdC0+ZXJwSUVJbmZvLm5vbkVycFByZXNlbnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vQVAgaGFzIG5vIDExYiBzdGF0aW9uIGFzc29jaWF0ZWQuCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYkNvZXhpc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL2ZvbGxvd2luZyBjb2RlIGJsb2NrIGlzIG9ubHkgZm9yIEhUIHN0YXRpb24uCisgICAgICAgIGlmKChwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkpICYmCisgICAgICAgICAgICAgIChwQmVhY29uU3RydWN0LT5IVEluZm8ucHJlc2VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHREb3QxMWZJRUhUSW5mbyBodEluZm8gPSBwQmVhY29uU3RydWN0LT5IVEluZm87CisgICAgICAgICAgIAorICAgICAgICAgICAgLy9PYnNzIE5vbiBIVCBTVEEgcHJlc2VudCBtb2RlIAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmdIVE9ic3NNb2RlID0gICh0QU5JX1U4KWh0SW5mby5vYnNzTm9uSFRTdGFQcmVzZW50OworCisgICAgICAgICAgICAKKyAgICAgICAgICAvL0NGRyBwcm90ZWN0aW9uIGZyb20gMTFHIGlzIGVuYWJsZWQgYW5kCisgICAgICAgICAgICAvL291ciBBUCBoYXMgYXQgbGVhc3Qgb25lIDExRyBzdGF0aW9uIGFzc29jaWF0ZWQuICAgICAgIAorICAgICAgICAgICAgaWYocE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24uZnJvbWxsZyAmJgorICAgICAgICAgICAgICAgICAgKChlU0lSX0hUX09QX01PREVfTUlYRUQgPT0gaHRJbmZvLm9wTW9kZSkgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZID09IGh0SW5mby5vcE1vZGUpKSYmCisgICAgICAgICAgICAgICAgICAgICAgKCFwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxiQ29leGlzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYocE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24uZnJvbWxsZykKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsZ0NvZXhpc3QgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0FQIGhhcyBvbmx5IEhUIHN0YXRpb25zIGFzc29jaWF0ZWQgYW5kIGF0IGxlYXN0IG9uZSBzdGF0aW9uIGlzIEhUIDIwCisgICAgICAgICAgICAvL2Rpc2FibGUgcHJvdGVjdGlvbiBmcm9tIGFueSBub24tSFQgZGV2aWNlcy4KKyAgICAgICAgICAgIC8vZGVjaXNpb24gZm9yIGRpc2FibGluZyBwcm90ZWN0aW9uIGZyb20gMTFiIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gYWJvdmUuCisgICAgICAgICAgICBpZihlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUID09IGh0SW5mby5vcE1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9EaXNhYmxlIHByb3RlY3Rpb24gZnJvbSAxMUcgc3RhdGlvbi4KKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxnQ29leGlzdCA9IGZhbHNlOworICAgICAgICAgIC8vQ0ZHIHByb3RlY3Rpb24gZnJvbSBIVCAyMCBpcyBlbmFibGVkLgorICAgICAgICAgIGlmKHBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmh0MjApCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmh0MjBDb2V4aXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vRGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gbm9uLUhUIGFuZCBIVDIwIGRldmljZXMuCisgICAgICAgICAgICAvL2RlY2lzaW9uIGZvciBkaXNhYmxpbmcgcHJvdGVjdGlvbiBmcm9tIDExYiBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGFib3ZlLgorICAgICAgICAgICAgaWYoZVNJUl9IVF9PUF9NT0RFX1BVUkUgPT0gaHRJbmZvLm9wTW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxnQ29leGlzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3Byb3RlY3Rpb24gcmVsYXRlZCBmYWN0b3JzIG90aGVyIHRoYW4gSFQgb3BlcmF0aW5nIG1vZGUuIEFwcGxpZXMgdG8gMi40IEdIWiBhcyB3ZWxsIGFzIDUgR0haLgorICAgIGlmKChwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkpICYmCisgICAgICAgICAgKHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5wcmVzZW50KSkKKyAgICB7CisgICAgICAgIHREb3QxMWZJRUhUSW5mbyBodEluZm8gPSBwQmVhY29uU3RydWN0LT5IVEluZm87CisgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGUgPSAKKyAgICAgICAgICAgICggdEFOSV9VOCApIGh0SW5mby5yaWZzTW9kZTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsbk5vbkdGQ29leGlzdCA9IAorICAgICAgICAgICAgKCB0QU5JX1U4IClodEluZm8ubm9uR0ZEZXZpY2VzUHJlc2VudDsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9IAorICAgICAgICAgICAgKCB0QU5JX1U4IClodEluZm8ubHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisgICAgfQorfQorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltRGVjaWRlU3RhUHJvdGVjdGlvbgorXGJyaWVmIERlY2lkZXMgcHJvdGVjdGlvbiByZWxhdGVkIHNldHRpbmdzIG9uIFN0YSB3aGlsZSBwcm9jZXNzaW5nIGJlYWNvbi4KK1xwYXJhbSAgICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMKK1xwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gICAgICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltRGVjaWRlU3RhUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRwU2NoQmVhY29uU3RydWN0IHBCZWFjb25TdHJ1Y3QsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyAgICB0U2lyUkZCYW5kIHJmQmFuZCA9IFNJUl9CQU5EX1VOS05PV047CisgICAgdEFOSV9VMzIgcGh5TW9kZSA9IFdOSV9DRkdfUEhZX01PREVfTk9ORTsKKworICAgIGxpbUdldFJmQmFuZChwTWFjLCAmcmZCYW5kLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAKKyAgICBpZihTSVJfQkFORF81X0dIWiA9PSByZkJhbmQpCisgICAgeworICAgICAgICAvL3dlIGFyZSBIVCBjYXBhYmxlLgorICAgICAgICBpZigodHJ1ZSA9PSBwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkpICYmCisgICAgICAgICAgICAocEJlYWNvblN0cnVjdC0+SFRJbmZvLnByZXNlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICAvL3dlIGFyZSBIVCBjYXBhYmxlLCBBUCdzIEhUIE9QTW9kZSBpcyBtaXhlZCAvIG92ZXJsYXAgbGVnYWN5ID09PiBuZWVkIHByb3RlY3Rpb24gZnJvbSAxMUEuICAgICAgICAKKyAgICAgICAgICAgIGlmKChlU0lSX0hUX09QX01PREVfTUlYRUQgPT0gcEJlYWNvblN0cnVjdC0+SFRJbmZvLm9wTW9kZSkgfHwKKyAgICAgICAgICAgICAgKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSA9PSBwQmVhY29uU3RydWN0LT5IVEluZm8ub3BNb2RlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1FbmFibGUxMWFQcm90ZWN0aW9uKHBNYWMsIHRydWUsIGZhbHNlLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy93ZSBhcmUgSFQgY2FwYWJsZSwgQVAncyBIVCBPUE1vZGUgaXMgSFQyMCA9PT4gZGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFBIGlmIGVuYWJsZWQuIGVuYWJsZWQgCisgICAgICAgICAgICAvL3Byb3RlY3Rpb24gZnJvbSBIVDIwIGlmIG5lZWRlZC4KKyAgICAgICAgICAgIGVsc2UgaWYoZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVD09IHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5vcE1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltRW5hYmxlMTFhUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbGltRW5hYmxlSFQyMFByb3RlY3Rpb24ocE1hYywgdHJ1ZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGVTSVJfSFRfT1BfTU9ERV9QVVJFID09IHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5vcE1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltRW5hYmxlMTFhUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbGltRW5hYmxlSFQyMFByb3RlY3Rpb24ocE1hYywgZmFsc2UsIGZhbHNlLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoU0lSX0JBTkRfMl80X0dIWiA9PSByZkJhbmQpCisgICAgeworICAgICAgICAvKiBzcGVjIDcuMy4yLjEzCisgICAgICAgICAqIFVzZVByb3RlY3Rpb24gd2lsbCBiZSBzZXQgd2hlbiBub25FUlAgU1RBIGlzIGFzc29jaWF0ZWQuCisgICAgICAgICAqIE5vbkVSUFByZXNlbnQgYml0IHdpbGwgYmUgc2V0IHdoZW46CisgICAgICAgICAqIC0tbm9uRVJQIFN0YSBpcyBhc3NvY2lhdGVkIE9SCisgICAgICAgICAqIC0tbm9uRVJQIFN0YSBleGlzdHMgaW4gb3ZlcmxhcHBpbmcgQlNTCisgICAgICAgICAqIHdoZW4gdXNlUHJvdGVjdGlvbiBpcyBub3Qgc2V0IHRoZW4gcHJvdGVjdGlvbiBmcm9tIG5vbkVSUCBzdGF0aW9ucyBpcyBvcHRpb25hbC4KKyAgICAgICAgICovCisKKyAgICAgICAgaWYgKHBoeU1vZGUgIT0gV05JX0NGR19QSFlfTU9ERV8xMUIpIAorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEJlYWNvblN0cnVjdC0+ZXJwUHJlc2VudCAmJgorICAgICAgICAgICAgICAgICAgKHBCZWFjb25TdHJ1Y3QtPmVycElFSW5mby51c2VQcm90ZWN0aW9uIHx8CisgICAgICAgICAgICAgICAgICBwQmVhY29uU3RydWN0LT5lcnBJRUluZm8ubm9uRXJwUHJlc2VudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltRW5hYmxlMTFnUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBmYWxzZSwgcEJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0FQIGhhcyBubyAxMWIgc3RhdGlvbiBhc3NvY2lhdGVkLgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vZGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFiIHN0YXRpb24KKyAgICAgICAgICAgICAgICBsaW1FbmFibGUxMWdQcm90ZWN0aW9uKHBNYWMsIGZhbHNlLCBmYWxzZSwgcEJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgLy9mb2xsb3dpbmcgY29kZSBibG9jayBpcyBvbmx5IGZvciBIVCBzdGF0aW9uLgorICAgICAgICBpZigocHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KSAmJgorICAgICAgICAgICAgICAocEJlYWNvblN0cnVjdC0+SFRJbmZvLnByZXNlbnQpKQorICAgICAgICB7CisgICAgICAgICAgCisgICAgICAgICAgICB0RG90MTFmSUVIVEluZm8gaHRJbmZvID0gcEJlYWNvblN0cnVjdC0+SFRJbmZvOworICAgICAgICAgICAgLy9BUCBoYXMgYXQgbGVhc3Qgb25lIDExRyBzdGF0aW9uIGFzc29jaWF0ZWQuCisgICAgICAgICAgICBpZigoKGVTSVJfSFRfT1BfTU9ERV9NSVhFRCA9PSBodEluZm8ub3BNb2RlKSAgfHwKKyAgICAgICAgICAgICAgICAgIChlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgPT0gaHRJbmZvLm9wTW9kZSkpJiYKKyAgICAgICAgICAgICAgICAoIXBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFByb3RlY3Rpb25Gcm9tMTFnKHBNYWMsIHRydWUsIGZhbHNlLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9ubyBIVCBvcGVyYXRpbmcgbW9kZSBjaGFuZ2UgID09PiBubyBjaGFuZ2UgaW4gcHJvdGVjdGlvbiBzZXR0aW5ncyBleGNlcHQgZm9yIE1JWEVEX01PREUvTGVnYWN5IE1vZGUuCisgICAgICAgICAgICAvL2luIE1peGVkIG1vZGUvbGVnYWN5IE1vZGUgZXZlbiBpZiB0aGVyZSBpcyBubyBjaGFuZ2UgaW4gSFQgb3BlcmF0aW5nIG1vZGUsIHRoZXJlIG1pZ2h0IGJlIGNoYW5nZSBpbiAxMWJDb2V4aXN0CisgICAgICAgICAgICAvL29yIDExZ0NvZXhpc3QuIHRoYXQgaXMgd2h5IHRoaXMgY2hlY2sgaXMgYmVpbmcgZG9uZSBhZnRlciBtaXhlZC9sZWdhY3kgbW9kZSBjaGVjay4KKyAgICAgICAgICAgIGlmICggcE1hYy0+bGltLmdIVE9wZXJNb2RlICE9ICggdFNpck1hY0hUT3BlcmF0aW5nTW9kZSApaHRJbmZvLm9wTW9kZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdIVE9wZXJNb2RlICAgICAgID0gKCB0U2lyTWFjSFRPcGVyYXRpbmdNb2RlIClodEluZm8ub3BNb2RlOworCisgICAgICAgICAgICAgICAgIC8vQVAgaGFzIG9ubHkgSFQgc3RhdGlvbnMgYXNzb2NpYXRlZCBhbmQgYXQgbGVhc3Qgb25lIHN0YXRpb24gaXMgSFQgMjAKKyAgICAgICAgICAgICAgICAgLy9kaXNhYmxlIHByb3RlY3Rpb24gZnJvbSBhbnkgbm9uLUhUIGRldmljZXMuCisgICAgICAgICAgICAgICAgIC8vZGVjaXNpb24gZm9yIGRpc2FibGluZyBwcm90ZWN0aW9uIGZyb20gMTFiIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gYWJvdmUuCisgICAgICAgICAgICAgICAgaWYoZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVCA9PSBodEluZm8ub3BNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9EaXNhYmxlIHByb3RlY3Rpb24gZnJvbSAxMUcgc3RhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRQcm90ZWN0aW9uRnJvbTExZyhwTWFjLCBmYWxzZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIVDIwUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBmYWxzZSwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9EaXNhYmxlIHByb3RlY3Rpb24gZnJvbSBub24tSFQgYW5kIEhUMjAgZGV2aWNlcy4KKyAgICAgICAgICAgICAgICAvL2RlY2lzaW9uIGZvciBkaXNhYmxpbmcgcHJvdGVjdGlvbiBmcm9tIDExYiBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGFib3ZlLgorICAgICAgICAgICAgICAgIGVsc2UgaWYoZVNJUl9IVF9PUF9NT0RFX1BVUkUgPT0gaHRJbmZvLm9wTW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0UHJvdGVjdGlvbkZyb20xMWcocE1hYywgZmFsc2UsIGZhbHNlLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIVDIwUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgZmFsc2UsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL2ZvbGxvd2luZyBjb2RlIGJsb2NrIGlzIG9ubHkgZm9yIEhUIHN0YXRpb24uICggMi40IEdIWiBhcyB3ZWxsIGFzIDUgR0haKQorICAgIGlmKChwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkpICYmCisgICAgICAgICAgKHBCZWFjb25TdHJ1Y3QtPkhUSW5mby5wcmVzZW50KSkKKyAgICB7CisgICAgICAgIHREb3QxMWZJRUhUSW5mbyBodEluZm8gPSBwQmVhY29uU3RydWN0LT5IVEluZm87ICAgIAorICAgICAgICAvL0NoZWNrIGZvciBjaGFuZ2VzIGluIHByb3RlY3Rpb24gcmVsYXRlZCBmYWN0b3JzIG90aGVyIHRoYW4gSFQgb3BlcmF0aW5nIG1vZGUuCisgICAgICAgIC8vQ2hlY2sgZm9yIGNoYW5nZXMgaW4gUklGUyBtb2RlLCBub25HRkRldmljZXNQcmVzZW50LCBsc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydC4KKyAgICAgICAgaWYgKCBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlICE9IAorICAgICAgICAgICAgICAgICggdEFOSV9VOCApIGh0SW5mby5yaWZzTW9kZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPmZSSUZTTW9kZSA9IAorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGUgID0gCisgICAgICAgICAgICAgICAgKCB0QU5JX1U4ICkgaHRJbmZvLnJpZnNNb2RlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fUklGU19NT0RFX0NIQU5HRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QgIT0gCisgICAgICAgICAgICAgICAgaHRJbmZvLm5vbkdGRGV2aWNlc1ByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgPSAKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0ID0gCisgICAgICAgICAgICAgICAgKCB0QU5JX1U4IClodEluZm8ubm9uR0ZEZXZpY2VzUHJlc2VudDsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IAorICAgICAgICAgICAgICAgIFBBUkFNX05PTl9HRl9ERVZJQ0VTX1BSRVNFTlRfQ0hBTkdFRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCAhPSAKKyAgICAgICAgICAgICAgICAoIHRBTklfVTggKWh0SW5mby5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9ICAKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0gCisgICAgICAgICAgICAgICAgKCB0QU5JX1U4IClodEluZm8ubHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSAKKyAgICAgICAgICAgICAgICBQQVJBTV9MU0lHX1RYT1BfRlVMTF9TVVBQT1JUX0NIQU5HRUQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgLy8gRm9yIFN0YXRpb24ganVzdCB1cGRhdGUgdGhlIGdsb2JhbCBsaW0gdmFyaWFibGUsIG5vIG5lZWQgdG8gc2VuZCBtZXNzYWdlIHRvIEhBTAorICAgIC8vIFN0YXRpb24gYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiBIVCBPUFIgTW9kZT0wMSwgbWVhbmluZyBBUCBpcyBzZWVpbmcgbGVnYWN5CisgICAgLy9zdGF0aW9ucyBpbiBvdmVybGFwcGluZyBCU1MuCisgICAgICAgaWYgKCBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZ0hUT2Jzc01vZGUgIT0gKCB0QU5JX1U4IClodEluZm8ub2Jzc05vbkhUU3RhUHJlc2VudCApCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZ0hUT2Jzc01vZGUgPSAoIHRBTklfVTggKWh0SW5mby5vYnNzTm9uSFRTdGFQcmVzZW50IDsKKyAgICAgICAgICAgIAorICAgIH0KK30KKworCisvKioKKyAqIGxpbVByb2Nlc3NDaGFubmVsU3dpdGNoVGltZW91dCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB3aGVuIENoYW5uZWwgU3dpdGNoIFRpbWVyIGV4cGlyZXMgYXQKKyAqIHRoZSBTVEEuICBOb3csIFNUQSBtdXN0IHN0b3AgdHJhZmZpYywgYW5kIHRoZW4gY2hhbmdlL2Rpc2FibGUKKyAqIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNoYW5uZWwuCisgKgorICoKKyAqTk9URToKKyAqIEBwYXJhbSAgcE1hYyAgICAgICAgICAgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBsaW1Qcm9jZXNzQ2hhbm5lbFN3aXRjaFRpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gTlVMTDsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgIHRBTklfVTggICAgY2hhbm5lbCA9IHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5wcmltYXJ5Q2hhbm5lbDsgICAvLyBUaGlzIGlzIHJlY2VpdmVkIGFuZCBzdG9yZWQgZnJvbSBjaGFubmVsU3dpdGNoIEFjdGlvbiBmcmFtZQorICAgCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQ2hhbm5lbFN3aXRjaFRpbWVyLnNlc3Npb25JZCkpPT0gTlVMTCkgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX1NUQV9ST0xFKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCAiQ2hhbm5lbCBzd2l0Y2ggY2FuIGJlIGRvbmUgb25seSBpbiBTVEEgcm9sZSwgQ3VycmVudCBSb2xlID0gJWRcbiIsIHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKgorICAgICAqICBUaGlzIHBvdGVudGlhbGx5IGNhbiBjcmVhdGUgaXNzdWVzIGlmIHRoZSBmdW5jdGlvbiB0cmllcyB0byBzZXQKKyAgICAgKiBjaGFubmVsIHdoaWxlIGRldmljZSBpcyBpbiBwb3dlci1zYXZlLCBoZW5jZSBwdXR0aW5nIGFuIGV4dHJhIGNoZWNrCisgICAgICogdG8gdmVyaWZ5IGlmIHRoZSBkZXZpY2UgaXMgaW4gcG93ZXItc2F2ZSBvciBub3QKKyAgICAgKi8KKyAgICBpZighbGltSXNTeXN0ZW1JbkFjdGl2ZVN0YXRlKHBNYWMpKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiRGV2aWNlIGlzIG5vdCBpbiBhY3RpdmUgc3RhdGUsIGNhbm5vdCBzd2l0Y2ggY2hhbm5lbFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAgICAgIAorICAgIC8vIFJlc3RvcmUgQ2hhbm5lbCBTd2l0Y2ggcGFyYW1ldGVycyB0byBkZWZhdWx0CisgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaFRpbWVvdXRWYWx1ZSA9IDA7CisKKyAgICAvKiBDaGFubmVsLXN3aXRjaCB0aW1lb3V0IGhhcyBvY2N1cnJlZC4gcmVzZXQgdGhlIHN0YXRlICovCisgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5kb3QxMWhDaGFuU3dTdGF0ZSA9IGVMSU1fMTFIX0NIQU5TV19FTkQ7CisgICAgCisgICAgLyogQ2hlY2sgaWYgdGhlIEFQIGlzIHN3aXRjaGluZyB0byBhIGNoYW5uZWwgdGhhdCB3ZSBzdXBwb3J0LgorICAgICAqIEVsc2UsIGp1c3QgZG9uJ3QgYm90aGVyIHRvIHN3aXRjaC4gSW5kaWNhdGUgSEREIHRvIGxvb2sgZm9yIGEgCisgICAgICogYmV0dGVyIEFQIHRvIGFzc29jaWF0ZQorICAgICAqLworICAgIGlmKCFsaW1Jc0NoYW5uZWxWYWxpZEZvckNoYW5uZWxTd2l0Y2gocE1hYywgY2hhbm5lbCkpCisgICAgeworICAgICAgICAvKiBXZSBuZWVkIHRvIHJlc3RvcmUgcHJlLWNoYW5uZWxTd2l0Y2ggc3RhdGUgb24gdGhlIFNUQSAqLworICAgICAgICBpZihsaW1SZXN0b3JlUHJlQ2hhbm5lbFN3aXRjaFN0YXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDb3VsZCBub3QgcmVzdG9yZSBwcmUtY2hhbm5lbFN3aXRjaCAoMTFoKSBzdGF0ZSwgcmVzZXR0aW5nIHRoZSBzeXN0ZW1cbiIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHRoZSBjaGFubmVsLWxpc3QgdGhhdCBBUCBpcyBhc2tpbmcgdXMgdG8gc3dpdGNoIGlzIGludmFsaWQsCisgICAgICAgICAqIHRoZW4gd2UgY2Fubm90IHN3aXRjaCB0aGUgY2hhbm5lbC4gSnVzdCBkaXNhc3NvY2lhdGUgZnJvbSBBUC4gCisgICAgICAgICAqIFdlIHdpbGwgZmluZCBhIGJldHRlciBBUCAhISEKKyAgICAgICAgICovCisgICAgICAgIGxpbVRlYXJEb3duTGlua1dpdGhBcChwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUNoYW5uZWxTd2l0Y2hUaW1lci5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT04pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN3aXRjaChwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9PTkxZOgorICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9PTkxZIFxuIikpOykKKyAgICAgICAgICAgIGxpbVN3aXRjaFByaW1hcnlDaGFubmVsKHBNYWMsIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5wcmltYXJ5Q2hhbm5lbCxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSA9IGVMSU1fQ0hBTk5FTF9TV0lUQ0hfSURMRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUxJTV9DSEFOTkVMX1NXSVRDSF9TRUNPTkRBUllfT05MWToKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkNIQU5ORUxfU1dJVENIX1NFQ09OREFSWV9PTkxZIFxuIikpOykKKyAgICAgICAgICAgIGxpbVN3aXRjaFByaW1hcnlTZWNvbmRhcnlDaGFubmVsKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc2Vjb25kYXJ5U3ViQmFuZCk7CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUgPSBlTElNX0NIQU5ORUxfU1dJVENIX0lETEU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9BTkRfU0VDT05EQVJZOgorICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9BTkRfU0VDT05EQVJZXG4iKSk7KQorICAgICAgICAgICAgbGltU3dpdGNoUHJpbWFyeVNlY29uZGFyeUNoYW5uZWwocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5wcmltYXJ5Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zZWNvbmRhcnlTdWJCYW5kKTsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSA9IGVMSU1fQ0hBTk5FTF9TV0lUQ0hfSURMRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUxJTV9DSEFOTkVMX1NXSVRDSF9JRExFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiaW5jb3JyZWN0IHN0YXRlIFxuIikpOykKKyAgICAgICAgICAgIGlmKGxpbVJlc3RvcmVQcmVDaGFubmVsU3dpdGNoU3RhdGUocE1hYywgcHNlc3Npb25FbnRyeSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ291bGQgbm90IHJlc3RvcmUgcHJlLWNoYW5uZWxTd2l0Y2ggKDExaCkgc3RhdGUsIHJlc2V0dGluZyB0aGUgc3lzdGVtXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47ICAvKiBQbGVhc2Ugbm90ZSwgdGhpcyBpcyAncmV0dXJuJyBhbmQgbm90ICdicmVhaycgKi8KKyAgICB9CisjZW5kaWYKKyAgICB9CisKKy8qKgorICogbGltVXBkYXRlQ2hhbm5lbFN3aXRjaCgpCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB3aGVuZXZlciBTdGF0aW9uIHJlY2VpdmVzCisgKiBlaXRoZXIgODAyLjExaCBjaGFubmVsIHN3aXRjaCBJRSBvciBhaXJnbyBwcm9wcmlldGFyeQorICogY2hhbm5lbCBzd2l0Y2ggSUUuCisgKgorICpOT1RFOgorICogQHBhcmFtICBwTWFjICAgICAgICAgICAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gIHRwU2lyUHJvYmVSZXNwQmVhY29uIC0gUG9pbnRlciB0byBCZWFjb24vUHJvYmUgUnNwCisgKiBAcGFyYW0gcHNlc3Npb25lbnRyeQorICovCit2b2lkCitsaW1VcGRhdGVDaGFubmVsU3dpdGNoKHN0cnVjdCBzQW5pU2lyR2xvYmFsICpwTWFjLCAgdHBTaXJQcm9iZVJlc3BCZWFjb24gcEJlYWNvbiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvblBlcmlvZDsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICB2YWw7CisgICAgdENoYW5uZWxTd2l0Y2hQcm9wSUVTdHJ1Y3QgICAgICAgKnBQcm9wQ2hubFN3aXRjaDsKKyAgICB0RG90MTFmSUVDaGFuU3dpdGNoQW5uICAgICAgICAgICAqcENobmxTd2l0Y2g7CisKKyAKKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDb3VsZCBub3QgcmV0cmlldmUgQmVhY29uIGludGVydmFsXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYmVhY29uUGVyaW9kID0gKHRBTklfVTE2KSB2YWw7CisKKyAgICAvKiBTVEEgZWl0aGVyIHJlY2VpdmVkIHByb3ByaWV0YXJ5IGNoYW5uZWwgc3dpdGNoIElFIG9yIDgwMi4xMWgKKyAgICAgKiBzdGFuZGFyZCBjaGFubmVsIHN3aXRjaCBJRS4KKyAgICAgKi8KKyAgICBpZiAocEJlYWNvbi0+cHJvcElFaW5mby5wcm9wQ2hhbm5lbFN3aXRjaFByZXNlbnQpCisgICAgeworICAgICAgICBwUHJvcENobmxTd2l0Y2ggPSAmKHBCZWFjb24tPnByb3BJRWluZm8uY2hhbm5lbFN3aXRjaCk7CisKKyAgICAgICAgLyogQWRkIGxvZ2ljIHRvIGRldGVybWluZSB3aGljaCBjaGFuZ2UgdGhpcyBpczogICovCisgICAgICAgIC8qICAgICAgcHJpbWFyeSwgc2Vjb25kYXJ5LCBib3RoLiAgRm9yIG5vdyBhc3N1bWUgYm90aC4gKi8KKyAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN0YXRlID0gZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX0FORF9TRUNPTkRBUlk7CisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5wcmltYXJ5Q2hhbm5lbCA9IHBQcm9wQ2hubFN3aXRjaC0+cHJpbWFyeUNoYW5uZWw7CisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zZWNvbmRhcnlTdWJCYW5kID0gKHRBbmlDQlNlY29uZGFyeU1vZGUpcFByb3BDaG5sU3dpdGNoLT5zdWJCYW5kOworICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQgPSBwUHJvcENobmxTd2l0Y2gtPmNoYW5uZWxTd2l0Y2hDb3VudDsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaFRpbWVvdXRWYWx1ZSA9CisgICAgICAgICAgICAgICAgIFNZU19NU19UT19USUNLUyhiZWFjb25QZXJpb2QpKiAocFByb3BDaG5sU3dpdGNoLT5jaGFubmVsU3dpdGNoQ291bnQpOworICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoTW9kZSA9IHBQcm9wQ2hubFN3aXRjaC0+bW9kZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICBwQ2hubFN3aXRjaCA9ICYocEJlYWNvbi0+Y2hhbm5lbFN3aXRjaElFKTsKKyAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2gucHJpbWFyeUNoYW5uZWwgPSBwQ2hubFN3aXRjaC0+bmV3Q2hhbm5lbDsKKyAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQgPSBwQ2hubFN3aXRjaC0+c3dpdGNoQ291bnQ7CisgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaFRpbWVvdXRWYWx1ZSA9CisgICAgICAgICAgICAgICAgIFNZU19NU19UT19USUNLUyhiZWFjb25QZXJpb2QpKiAocENobmxTd2l0Y2gtPnN3aXRjaENvdW50KTsKKyAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoTW9kZSA9IHBDaG5sU3dpdGNoLT5zd2l0Y2hNb2RlOyAKKworICAgICAgICAvKiBPbmx5IHByaW1hcnkgY2hhbm5lbCBzd2l0Y2ggZWxlbWVudCBpcyBwcmVzZW50ICovCisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSA9IGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9PTkxZOworICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc2Vjb25kYXJ5U3ViQmFuZCA9IGVBTklfQ0JfU0VDT05EQVJZX05PTkU7CisKKyAgICAgICAgLyogRG8gbm90IGJvdGhlciB0byBsb29rIGFuZCBvcGVyYXRlIG9uIGV4dGVuZGVkIGNoYW5uZWwgc3dpdGNoIGVsZW1lbnQKKyAgICAgICAgICogaWYgb3VyIG93biBjaGFubmVsLWJvbmRpbmcgc3RhdGUgaXMgbm90IGVuYWJsZWQKKyAgICAgICAgICovCisgICAgICAgIGlmKEdFVF9DQl9BRE1JTl9TVEFURShwTWFjLT5saW0uZ0NiU3RhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEJlYWNvbi0+ZXh0Q2hhbm5lbFN3aXRjaFByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKHBCZWFjb24tPmV4dENoYW5uZWxTd2l0Y2hJRS5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN0YXRlID0gZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX0FORF9TRUNPTkRBUlk7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc2Vjb25kYXJ5U3ViQmFuZCA9IGVBTklfQ0JfU0VDT05EQVJZX1VQOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3RhdGUgPSBlTElNX0NIQU5ORUxfU1dJVENIX1BSSU1BUllfQU5EX1NFQ09OREFSWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zZWNvbmRhcnlTdWJCYW5kID0gZUFOSV9DQl9TRUNPTkRBUllfRE9XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgZUhUX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVF9OT05FOgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90aGluZyB0byBiZSBkb25lIGhlcmUgYXMgb2Ygbm93ISEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZVNJUl9TVUNDRVNTICE9IGxpbVN0YXJ0Q2hhbm5lbFN3aXRjaChwTWFjLCBwc2Vzc2lvbkVudHJ5KSkKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIkNvdWxkIG5vdCBzdGFydCBDaGFubmVsIFN3aXRjaFxuIikpOykKKyAgICB9CisKKyAgICBsaW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgRkwoInByaW1hcnkgY2hsICVkLCBzdWJiYW5kICVkLCBjb3VudCAgJWQgKCVkIHRpY2tzKSBcbiIpLAorICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2gucHJpbWFyeUNoYW5uZWwsCisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zZWNvbmRhcnlTdWJCYW5kLAorICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQsCisgICAgICAgIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hUaW1lb3V0VmFsdWUpOworICAgIHJldHVybjsKK30KKworLyoqCisgKiBsaW1DYW5jZWxEb3QxMWhDaGFubmVsU3dpdGNoCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gU1RBIGRvZXMgbm90IHNlbmQgdXBkYXRlZCBjaGFubmVsLXN3aXRoIElFCisgKiBhZnRlciBpbmRpY2F0aW5nIGNoYW5uZWwtc3dpdGNoIHN0YXJ0LiBUaGlzIHdpbGwgY2FuY2VsIHRoZSBjaGFubmVsLXN3aXRoCisgKiB0aW1lciB3aGljaCBpcyBhbHJlYWR5IHJ1bm5pbmcuCisgKiAKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbUNhbmNlbERvdDExaENoYW5uZWxTd2l0Y2godHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fU1RBX1JPTEUpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiUmVjZWl2ZWQgYSBiZWFjb24gd2l0aG91dCBjaGFubmVsIHN3aXRjaCBJRVxuIikpOykKKyAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9ERUFDVElWQVRFLCAwLCBlTElNX0NIQU5ORUxfU1dJVENIX1RJTUVSKSk7CisKKyAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltQ2hhbm5lbFN3aXRjaFRpbWVyKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJ0eF90aW1lcl9kZWFjdGl2YXRlIGZhaWxlZCFcbiIpKTspCisgICAgfQorCisgICAgLyogV2UgbmVlZCB0byByZXN0b3JlIHByZS1jaGFubmVsU3dpdGNoIHN0YXRlIG9uIHRoZSBTVEEgKi8KKyAgICBpZiAobGltUmVzdG9yZVByZUNoYW5uZWxTd2l0Y2hTdGF0ZShwTWFjLCBwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJMSU06IENvdWxkIG5vdCByZXN0b3JlIHByZS1jaGFubmVsU3dpdGNoICgxMWgpIHN0YXRlLCByZXNldGluZyB0aGUgc3lzdGVtXG4iKSk7KQorICAgICAgICAgICAgICAgIAorICAgIH0KKyNlbmRpZgorfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgIGxpbUNhbmNlbERvdDExaFF1aWV0CitcYnJpZWYgIENhbmNlbCB0aGUgcXVpZXRpbmcgb24gU3RhdGlvbiBpZiBsYXRlc3QKKyAgICAgICAgYmVhY29uIGRvZXNuJ3QgY29udGFpbiBxdWlldCBJRSBpbiBpdC4KKworXHBhcmFtICBwTWFjCitccmV0dXJuIE5PTkUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltQ2FuY2VsRG90MTFoUXVpZXQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fU1RBX1JPTEUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPT0gZUxJTV9RVUlFVF9CRUdJTikgCisgICAgeworICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfREVBQ1RJVkFURSwgMCwgZUxJTV9RVUlFVF9USU1FUikpOworICAgICAgICBpZiAodHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgidHhfdGltZXJfZGVhY3RpdmF0ZSBmYWlsZWRcbiIpKTspCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID09IGVMSU1fUVVJRVRfUlVOTklORykKKyAgICB7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0RFQUNUSVZBVEUsIDAsIGVMSU1fUVVJRVRfQlNTX1RJTUVSKSk7CisgICAgICAgIGlmICh0eF90aW1lcl9kZWFjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJ0eF90aW1lcl9kZWFjdGl2YXRlIGZhaWxlZFxuIikpOykKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogSWYgdGhlIGNoYW5uZWwgc3dpdGNoIGlzIGFscmVhZHkgcnVubmluZyBpbiBzaWxlbnQgbW9kZSwgZG9udCByZXN1bWUgdGhlCisgICAgICAgICAqIHRyYW5zbWlzc2lvbi4gQ2hhbm5lbCBzd2l0Y2ggdGltZXIgd2hlbiB0aW1lb3V0LCB0cmFuc21pc3Npb24gd2lsbCBiZSByZXN1bWVkLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoISgocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5kb3QxMWhDaGFuU3dTdGF0ZSA9PSBlTElNXzExSF9DSEFOU1dfUlVOTklORykgJiYKKyAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaE1vZGUgPT0gZVNJUl9DSEFOU1dfTU9ERV9TSUxFTlQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGltRnJhbWVUcmFuc21pc3Npb25Db250cm9sKHBNYWMsIGVMSU1fVFhfQUxMLCBlTElNX1JFU1VNRV9UWCk7CisgICAgICAgICAgICBsaW1SZXN0b3JlUHJlUXVpZXRTdGF0ZShwTWFjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPSBlTElNX1FVSUVUX0lOSVQ7CisjZW5kaWYKK30KKworLyoqCisgKiBsaW1Qcm9jZXNzUXVpZXRUaW1lb3V0CisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGFjdGl2ZSBvbmx5IG9uIHRoZSBTVEEuCisgKiBIYW5kbGVzIFNJUl9MSU1fUVVJRVRfVElNRU9VVAorICoKKyAqIExPR0lDOgorICogVGhpcyB0aW1lb3V0IGNhbiBvY2N1ciB1bmRlciBvbmx5IG9uZSBjaXJjdW1zdGFuY2U6CisgKgorICogMSkgV2hlbiBnTGltUXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfQkVHSU4KKyAqIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRpbWVvdXQgImludGVydmFsIiBoYXMKKyAqIGV4cGlyZWQuIFRoaXMgaXMgYSB0cmlnZ2VyIGZvciB0aGUgU1RBIHRvIG5vdworICogc2h1dC1vZmYgVHgvUnggZm9yIHRoZSBzcGVjaWZpZWQgZ0xpbVF1aWV0RHVyYXRpb24KKyAqIC0+IFRoZSBUSU1FUiBvYmplY3QgZ0xpbVF1aWV0QnNzVGltZXIgaXMKKyAqIGFjdGl2YXRlZAorICogLT4gV2l0aCB0aW1lb3V0ID0gZ0xpbVF1aWV0RHVyYXRpb24KKyAqIC0+IGdMaW1RdWlldFN0YXRlIGlzIHNldCB0byBlTElNX1FVSUVUX1JVTk5JTkcKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIFVzaW5nIHR3byBUSU1FUiBvYmplY3RzIC0KKyAqIGdMaW1RdWlldFRpbWVyICYgZ0xpbVF1aWV0QnNzVGltZXIKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBsaW1Qcm9jZXNzUXVpZXRUaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisjaWZkZWYgR0VONl9UT0RPCisgICAgLy9mZXRjaCB0aGUgc2Vzc2lvbkVudHJ5IGJhc2VkIG9uIHRoZSBzZXNzaW9uSWQKKyAgICAvL3ByaW9yaXR5IC0gTUVESVVNCisgICAgdHBQRVNlc3Npb24gc2Vzc2lvbkVudHJ5OworCisgICAgaWYoKHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldFRpbWVyLnNlc3Npb25JZCkpPT0gTlVMTCkgCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJxdWlldFN0YXRlID0gJWRcbiIpLCBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUpOykKKyAgc3dpdGNoKCBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgKQorICB7CisgICAgY2FzZSBlTElNX1FVSUVUX0JFR0lOOgorICAgICAgLy8gVGltZSB0byBTdG9wIGRhdGEgdHJhZmZpYyBmb3IgcXVpZXREdXJhdGlvbgorICAgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fUVVJRVRfQlNTX1RJTUVSKTsKKyAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX1FVSUVUX0JTU19USU1FUikpOworI2lmZGVmIEdFTjZfVE9ETworICAgICAgICAvKiByZXZpc2l0IHRoaXMgcGllY2Ugb2YgY29kZSB0byBhc3NpZ24gdGhlIGFwcHJvcHJpYXRlIHNlc3Npb25JZCBiZWxvdworICAgICAgICAgKiBwcmlvcml0eSAtIEhJR0gKKyAgICAgICAgICovCisgICAgICAgIHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0QnNzVGltZXIuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworI2VuZGlmICAgICAgICAgICAgICAKKyAgICAgIGlmKCBUWF9TVUNDRVNTICE9CisgICAgICAgICAgdHhfdGltZXJfYWN0aXZhdGUoICZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1RdWlldEJzc1RpbWVyICkpCisgICAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gYWN0aXZhdGUgZ0xpbVF1aWV0QnNzVGltZXIhIFRoZSBTVEEgd2lsbCBiZSB1bmFibGUgdG8gaG9ub3IgUXVpZXQgQlNTLi4uXG4iKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIFRyYW5zaXRpb24gdG8gZUxJTV9RVUlFVF9SVU5OSU5HCisgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfUlVOTklORzsKKworICAgICAgICAvKiBJZiB3ZSBoYXZlIHN0YSBiayBzY2FuIHRyaWdnZXJlZCBhbmQgdHJpZ2dlciBiayBzY2FuIGFjdHVhbGx5IHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCAqLworICAgICAgICAvKiBwcmludCBtZXNzYWdlLCBvdGhlcndpc2UsIHN0b3AgZGF0YSB0cmFmZmljIGFuZCBzdGF5IHF1aWV0ICovCisgICAgICAgIGlmKCBwTWFjLT5saW0uZ0xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzICYmCisgICAgICAgICAgKGVTSVJfVFJVRSA9PSAoZ2xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzX1N0YXR1cyA9IGxpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzKCBwTWFjICkpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0cyLAorICAgICAgICAgICAgICAgRkwoIkF0dGVtcHRpbmcgdG8gdHJpZ2dlciBhIGJhY2tncm91bmQgc2Nhbi4uLlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAvLyBTaHV0LW9mZiBUeC9SeCBmb3IgZ0xpbVNwZWNNZ210LnF1aWV0RHVyYXRpb24KKyAgICAgICAgICAgLyogZnJlZXplIHRoZSB0cmFuc21pc3Npb24gKi8KKyAgICAgICAgICAgbGltRnJhbWVUcmFuc21pc3Npb25Db250cm9sKHBNYWMsIGVMSU1fVFhfQUxMLCBlTElNX1NUT1BfVFgpOworCisgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HMiwKKyAgICAgICAgICAgICAgICBGTCgiUXVpZXQgQlNTOiBTVEEgc2h1dHRpbmcgZG93biBmb3IgJWQgdGlja3NcbiIpLAorICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXREdXJhdGlvbiApOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUxJTV9RVUlFVF9SVU5OSU5HOgorICAgIGNhc2UgZUxJTV9RVUlFVF9JTklUOgorICAgIGNhc2UgZUxJTV9RVUlFVF9FTkQ6CisgICAgZGVmYXVsdDoKKyAgICAgIC8vCisgICAgICAvLyBBcyBvZiBub3csIG5vdGhpbmcgdG8gYmUgZG9uZQorICAgICAgLy8KKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qKgorICogbGltUHJvY2Vzc1F1aWV0QnNzVGltZW91dAorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBhY3RpdmUgb24gdGhlIEFQIGFuZCBTVEEuCisgKiBIYW5kbGVzIFNJUl9MSU1fUVVJRVRfQlNTX1RJTUVPVVQKKyAqCisgKiBMT0dJQzoKKyAqIE9uIHRoZSBBUCAtCisgKiBXaGVuIHRoZSBTSVJfTElNX1FVSUVUX0JTU19USU1FT1VUIGlzIHRyaWdnZXJlZCwgaXQgaXMKKyAqIGFuIGluZGljYXRpb24gZm9yIHRoZSBBUCB0byBTVEFSVCBzZW5kaW5nIG91dCB0aGUKKyAqIFF1aWV0IEJTUyBJRS4KKyAqIElmIDgwMi4xMUggaXMgZW5hYmxlZCwgdGhlIFF1aWV0IEJTUyBJRSBpcyBzZW50IGFzIHBlcgorICogdGhlIDExSCBzcGVjCisgKiBJZiA4MDIuMTFIIGlzIG5vdCBlbmFibGVkLCB0aGUgUXVpZXQgQlNTIElFIGlzIHNlbnQgYXMKKyAqIGEgUHJvcHJpZXRhcnkgSUUuIFRoaXMgd2lsbCBiZSB1bmRlcnN0b29kIGJ5IGFsbCB0aGUKKyAqIFRJVEFOIFNUQSdzCisgKiBUcmFuc2l0aW9uaW5nIGdMaW1RdWlldFN0YXRlIHRvIGVMSU1fUVVJRVRfQkVHSU4gd2lsbAorICogaW5pdGlhdGUgdGhlIFNDSCB0byBpbmNsdWRlIHRoZSBRdWlldCBCU1MgSUUgaW4gYWxsCisgKiBpdHMgc3Vic2VxdWVudCBCZWFjb25zL1BSJ3MuCisgKiBUaGUgUXVpZXQgQlNTIElFIHdpbGwgYmUgaW5jbHVkZWQgaW4gYWxsIHRoZSBCZWFjb25zCisgKiAmIFBSJ3MgdW50aWwgdGhlIG5leHQgRFRJTSBwZXJpb2QKKyAqCisgKiBPbiB0aGUgU1RBIC0KKyAqIFdoZW4gZ0xpbVF1aWV0U3RhdGUgPSBlTElNX1FVSUVUX1JVTk5JTkcKKyAqIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIFNUQSB3YXMgc3VjY2Vzc2Z1bGx5IHNodXQtb2ZmCisgKiBmb3IgdGhlIHNwZWNpZmllZCBnTGltUXVpZXREdXJhdGlvbi4gVGhpcyBpcyBhIHRyaWdnZXIKKyAqIGZvciB0aGUgU1RBIHRvIG5vdyByZXN1bWUgZGF0YSB0cmFmZmljLgorICogLT4gZ0xpbVF1aWV0U3RhdGUgaXMgc2V0IHRvIGVMSU1fUVVJRVRfSU5JVAorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbVByb2Nlc3NRdWlldEJzc1RpbWVvdXQoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIHRwUEVTZXNzaW9uIHNlc3Npb25FbnRyeTsKKworICAgIGlmKChzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYywgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRCc3NUaW1lci5zZXNzaW9uSWQpKT09IE5VTEwpIAorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsRkwoIlNlc3Npb24gRG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHNlc3Npb25JRFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoInF1aWV0U3RhdGUgPSAlZFxuIiksIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSk7KQorICBpZiAoZUxJTV9BUF9ST0xFID09IHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKKyAgeworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICBpZiAoIXBNYWMtPnN5cy5nU3lzRW5hYmxlTGVhcm5Nb2RlKQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID0gZUxJTV9RVUlFVF9FTkQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiggZUxJTV9RVUlFVF9JTklUID09IHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSApCisgICAgeworICAgICAgICAvL1F1aWV0Q291bnQgPSAwIGlzIHJlc2VydmVkCisgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRDb3VudCAgPSAyOworICAgICAgICAvLyBJbiBtcy4KKyAgICAgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldER1cmF0aW9uID0gCisgICAgICAgIHBNYWMtPmxpbS5ncExpbU1lYXNSZXEtPm1lYXNEdXJhdGlvbi5zaG9ydENoYW5uZWxTY2FuRHVyYXRpb247CisgICAgICAgIC8vIFRVIGlzIGluIG11bHRpcGxlcyBvZiAxMDI0ICgyXjEwKSB1cy4KKyAgICAgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldER1cmF0aW9uX1RVID0gCisgICAgICAgICAgICBTWVNfTVNfVE9fVFUocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldER1cmF0aW9uKTsgCisgICAgICAgIC8vIFRyYW5zaXRpb24gdG8gZUxJTV9RVUlFVF9CRUdJTgorICAgICAgICBsaW1Mb2coIHBNYWMsIExPRzIsIEZMKCJRdWlldCBCU1Mgc3RhdGUgPSBlTElNX1FVSUVUX0JFR0lOXG4iKSk7CisgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfQkVHSU47CisgICAgfQorI2VuZGlmCisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gZUxJTV9TVEFfUk9MRQorICAgIHN3aXRjaCggcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlICkKKyAgICB7CisgICAgICBjYXNlIGVMSU1fUVVJRVRfUlVOTklORzoKKyAgICAgICAgLy8gVHJhbnNpdGlvbiB0byBlTElNX1FVSUVUX0lOSVQKKyAgICAgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID0gZUxJTV9RVUlFVF9JTklUOworCisgICAgICAgIGlmKCAhcE1hYy0+bGltLmdMaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW5EdXJpbmdRdWlldEJzcyB8fCAoZ2xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzX1N0YXR1cyA9PSBlU0lSX0ZBTFNFKSApCisgICAgICAgIHsKKyAgICAgICAgICAvLyBSZXN1bWUgZGF0YSB0cmFmZmljIG9ubHkgaWYgY2hhbm5lbCBzd2l0Y2ggaXMgbm90IHJ1bm5pbmcgaW4gc2lsZW50IG1vZGUuCisgICAgICAgICAgaWYgKCEoKHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZG90MTFoQ2hhblN3U3RhdGUgPT0gZUxJTV8xMUhfQ0hBTlNXX1JVTk5JTkcpICYmCisgICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaE1vZGUgPT0gZVNJUl9DSEFOU1dfTU9ERV9TSUxFTlQpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGxpbUZyYW1lVHJhbnNtaXNzaW9uQ29udHJvbChwTWFjLCBlTElNX1RYX0FMTCwgZUxJTV9SRVNVTUVfVFgpOworICAgICAgICAgICAgICBsaW1SZXN0b3JlUHJlUXVpZXRTdGF0ZShwTWFjKTsKKyAgICAgICAgICB9CisgICAgICAKKyAgICAgICAgICAvKiBSZXNldCBzdGF0dXMgZmxhZyAqLworICAgICAgICAgIGlmKGdsaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW5EdXJpbmdRdWlldEJzc19TdGF0dXMgPT0gZVNJUl9GQUxTRSkKKyAgICAgICAgICAgICAgZ2xpbVRyaWdnZXJCYWNrZ3JvdW5kU2NhbkR1cmluZ1F1aWV0QnNzX1N0YXR1cyA9IGVTSVJfVFJVRTsKKworICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HMiwKKyAgICAgICAgICAgICAgRkwoIlF1aWV0IEJTUzogUmVzdW1pbmcgdHJhZmZpYy4uLlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vCisgICAgICAgICAgLy8gTm90aGluZyBzcGVjaWZpYyB0byBiZSBkb25lIGluIHRoaXMgY2FzZQorICAgICAgICAgIC8vIEEgYmFja2dyb3VuZCBzY2FuIHRoYXQgd2FzIHRyaWdnZXJlZCBkdXJpbmcKKyAgICAgICAgICAvLyBTSVJfTElNX1FVSUVUX1RJTUVPVVQgd2lsbCBjb21wbGV0ZSBvbiBpdHMgb3duCisgICAgICAgICAgLy8KKyAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPRzIsCisgICAgICAgICAgICAgIEZMKCJCYWNrZ3JvdW5kIHNjYW4gc2hvdWxkIGJlIGNvbXBsZXRlIG5vdy4uLlxuIikpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGVMSU1fUVVJRVRfSU5JVDoKKyAgICAgIGNhc2UgZUxJTV9RVUlFVF9CRUdJTjoKKyAgICAgIGNhc2UgZUxJTV9RVUlFVF9FTkQ6CisgICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIlF1aWV0IHN0YXRlIG5vdCBpbiBSVU5OSU5HXG4iKSk7KQorICAgICAgICAvKiBJZiB0aGUgcXVpZXQgcGVyaW9kIGhhcyBlbmRlZCwgdGhlbiByZXN1bWUgdGhlIGZyYW1lIHRyYW5zbWlzc2lvbiAqLworICAgICAgICBsaW1GcmFtZVRyYW5zbWlzc2lvbkNvbnRyb2wocE1hYywgZUxJTV9UWF9BTEwsIGVMSU1fUkVTVU1FX1RYKTsKKyAgICAgICAgbGltUmVzdG9yZVByZVF1aWV0U3RhdGUocE1hYyk7CisgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfSU5JVDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vCisgICAgICAgIC8vIEFzIG9mIG5vdywgbm90aGluZyB0byBiZSBkb25lCisgICAgICAgIC8vCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKy8qKgorICogbGltUHJvY2Vzc1dQU092ZXJsYXBUaW1lb3V0CisgKgorICogRlVOQ1RJT046IFRoaXMgZnVuY3Rpb24gY2FsbCBsaW1XUFNQQkNUaW1lb3V0KCkgdG8gY2xlYW4gV1BTIFBCQyBwcm9iZSByZXF1ZXN0IGVudHJpZXMKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCisjaWYgMAordm9pZCBsaW1Qcm9jZXNzV1BTT3ZlcmxhcFRpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkOworICAgIAorICAgIGlmICh0eF90aW1lcl9hY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltV1BTT3ZlcmxhcFRpbWVyT2JqLmdMaW1XUFNPdmVybGFwVGltZXIpICE9IFRYX1NVQ0NFU1MpCisgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJ0eF90aW1lcl9hY3RpdmF0ZSBmYWlsZWRcbiIpKTsKKyAgICB9CisKKyAgICBzZXNzaW9uSWQgPSBwTWFjLT5saW0ubGltVGltZXJzLmdMaW1XUFNPdmVybGFwVGltZXJPYmouc2Vzc2lvbklkOworCisgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiV1BTIG92ZXJsYXAgdGltZW91dCwgc2Vzc2lvbklkPSVkXG4iKSwgc2Vzc2lvbklkKTspCisKKyAgICBpZigocHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLCBzZXNzaW9uSWQpKSA9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGxpbVdQU1BCQ1RpbWVvdXQocE1hYywgcHNlc3Npb25FbnRyeSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioKKyAqIGxpbVVwZGF0ZVF1aWV0SUVGcm9tQmVhY29uCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKiAgV2hlbiB0aGUgUXVpZXQgQlNTIElFIGlzIGVuY291bnRlcmVkIHdoZW4gcGFyc2luZyBmb3IKKyAqICBCZWFjb25zL1BSJ3MsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICogIEJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBRdWlldCBJbnRlcnZhbCAtCisgKiAgYSkgQSBUSU1FUiAoZ0xpbVF1aWV0VGltZXIpIGlzIHN0YXJ0ZWQgZm9yIHRoZQorICogIHNwZWNpZmllZCBpbnRlcnZhbAorICogIGIpIFVwb24gZXhwaXJ5IG9mIHRoZSBUSU1FUiBpbnRlcnZhbCwgdGhlIFNUQSB3aWxsCisgKiAgc2h1dC1vZmYgVHgvUngKKyAqICBjKSBUaGUgU1RBIHdpbGwgdGhlbiBzdGFydCBhbm90aGVyIFRJTUVSIChpbiB0aGlzCisgKiAgY2FzZSwgZ0xpbVF1aWV0QnNzVGltZXIgVElNRVIgb2JqZWN0KSwgd2l0aCB0aGUKKyAqICB0aW1lb3V0IGR1cmF0aW9uIHNldCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZQorICogIFF1aWV0IEJTUyBJRQorICoKKyAqIDEpIFRvIHNldHVwIHRoZSBRdWlldCBCU1MgImludGVydmFsIi4gSW4gdGhpcyBjYXNlLAorICogdGhpcyBUSU1FUiBpbmRpY2F0ZXMgdGhhdCB0aGUgU1RBIGhhcyB0byBzaHV0LW9mZiBpdHMKKyAqIFR4L1J4IEFGVEVSIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwKKyAqIFNldCBnTGltUXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfQkVHSU4KKyAqCisgKiAyKSBUbyBzZXR1cCB0aGUgUXVpZXQgQlNTICJkdXJhdGlvbiIuIEFmdGVyIHRoZSBzYWlkCisgKiBzcGVjaWZpZWQgImludGVydmFsIiwgdGhlIFNUQSBoYXMgdG8gc2h1dC1vZmYgVHgvUngKKyAqIGZvciB0aGlzIGR1cmF0aW9uCisgKiBTZXQgZ0xpbVF1aWV0U3RhdGUgPSBlTElNX1FVSUVUX1JVTk5JTkcKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtIHBRdWlldElFIC0gUG9pbnRlciB0byB0RG90MTFmSUVRdWlldAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGxpbVVwZGF0ZVF1aWV0SUVGcm9tQmVhY29uKCBzdHJ1Y3Qgc0FuaVNpckdsb2JhbCAqcE1hYywKKyAgICB0RG90MTFmSUVRdWlldCAqcFF1aWV0SUUsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgKQoreworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQpIHx8IGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgdEFOSV9VMTYgYmVhY29uUGVyaW9kOworICAgIHRBTklfVTMyIHZhbDsKKworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fU1RBX1JPTEUpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlF1aWV0IHN0YXRlID0gJWQsIFF1aWV0IENvdW50ID0gJWRcbiIpLAorICAgICAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUsIHBRdWlldElFLT5jb3VudCk7KQorICAgIGlmICghcE1hYy0+bGltLmdMaW0xMWhFbmFibGUpCisgICAgICAgIHJldHVybjsKKyAgICAvLyBUaGUgKFRpdGFuKSBBUCBpcyByZXF1ZXN0aW5nIHRoaXMgKFRpdGFuKSBTVEEgdG8KKyAgICAvLyBob25vciB0aGlzIFF1aWV0IElFIFJFUSBhbmQgc2h1dC1vZmYgVHgvUnguIElmIHdlJ3JlCisgICAgLy8gcmVjZWl2aW5nIHRoaXMgYSBzZWNvbmQgdGltZSBhcm91bmQgKGJlY2F1c2UgdGhlIEFQCisgICAgLy8gY291bGQgYmUgZG93bi1jb3VudGluZyB0aGUgUXVpZXQgQlNTIENvdW50KSwgdGhlIFNUQQorICAgIC8vIHdpbGwgaGF2ZSB0byByZXNldCB0aGUgdGltZW91dCBpbnRlcnZhbCBhY2NvcmRpbmdseQorICAgIC8vCisKKyAgICBpZiAocFF1aWV0SUUtPmNvdW50ID09IDApCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJJZ25vcmluZyBxdWlldCBjb3VudCA9PSAwLT5yZXNlcnZlZFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9CisgICAgICAgIHdsYW5fY2ZnR2V0SW50KCBwTWFjLCBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTCwgJnZhbCApKQorICAgICAgICBiZWFjb25QZXJpb2QgPSAodEFOSV9VMTYpIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMX0FQREVGOworICAgIGVsc2UKKyAgICAgICAgYmVhY29uUGVyaW9kID0gKHRBTklfVTE2KSB2YWw7CisKKyAgICAgLyogKHFkICogMl4xMCkvMTAwMCAqLworICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXREdXJhdGlvbl9UVSA9IHBRdWlldElFLT5kdXJhdGlvbjsKKyAgICAvLyBUaGUgU1RBIG5lZWRzIHRvIHNodXQtb2ZmIFR4L1J4ICJmb3IiIHRoaXMgaW50ZXJ2YWwgKGluIG1pbGxpU2Vjb25kcykKKyAgICAvKiBOZWVkIHRvIGNvbnZlcnQgZnJvbSBUVSB0byBzeXN0ZW0gVElDS1MgKi8KKyAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0RHVyYXRpb24gPSBTWVNfTVNfVE9fVElDS1MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNfVFVfVE9fTVMocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldER1cmF0aW9uX1RVKSk7CisKKyAgICBpZiAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldER1cmF0aW9uX1RVID09IDApCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJaZXJvIGR1cmF0aW9uIGluIHF1aWV0IElFXG4iKSk7KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8vIFRoZSBTVEEgbmVlZHMgdG8gc2h1dC1vZmYgVHgvUnggImFmdGVyIiB0aGlzIGludGVydmFsCisgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFRpbWVvdXRWYWx1ZSA9CisgICAgICAgICAgICAgIChiZWFjb25QZXJpb2QgKiBwUXVpZXRJRS0+Y291bnQpICsgcFF1aWV0SUUtPm9mZnNldDsKKworICAgIGxpbUxvZyggcE1hYywgTE9HMiwKKyAgICAgICAgRkwoICJTVEEgc2h1dC1vZmYgd2lsbCBiZWdpbiBpbiAlZCBtaWxsaXNlY29uZHMgJiBsYXN0IGZvciAlZCB0aWNrc1xuIiksCisgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRUaW1lb3V0VmFsdWUsCisgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXREdXJhdGlvbiApOworCisgICAgLyogRGlzYWJsZSwgU3RvcCBiYWNrZ3JvdW5kIHNjYW4gaWYgZW5hYmxlZCBhbmQgcnVubmluZyAqLworICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0JBQ0tHUk9VTkRfU0NBTl9USU1FUik7CisKKyAgICAvKiBTdG9wIGhlYXJ0LWJlYXQgdGltZXIgdG8gc3RvcCBoZWFydGJlYXQgZGlzYXNzb2NpYXRpb24gKi8KKyAgICBsaW1IZWFydEJlYXREZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgcHNlc3Npb25FbnRyeSk7CisKKyAgICBpZihwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX0xJTktfRVNUX1dUX1NDQU5fU1RBVEUgfHwKKyAgICAgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9DSEFOTkVMX1NDQU5fU1RBVEUpCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJQb3N0aW5nIGZpbmlzaCBzY2FuIGFzIHdlIGFyZSBpbiBzY2FuIHN0YXRlXG4iKSk7KQorICAgICAgICAvKiBTdG9wIG9uZ29pbmcgc2Nhbm5pbmcgaWYgYW55ICovCisgICAgICAgIGlmIChHRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TZXQgdGhlIHJlc3VtZSBjaGFubmVsIHRvIEFueSB2YWxpZCBjaGFubmVsIChpbnZhbGlkKS4gCisgICAgICAgICAgICAvL1RoaXMgd2lsbCBpbnN0cnVjdCBIQUwgdG8gc2V0IGl0IHRvIGFueSBwcmV2aW91cyB2YWxpZCBjaGFubmVsLgorICAgICAgICAgICAgcGVTZXRSZXN1bWVDaGFubmVsKHBNYWMsIDAsIDApOworICAgICAgICAgICAgbGltU2VuZEhhbEZpbmlzaFNjYW5SZXEocE1hYywgZUxJTV9IQUxfRklOSVNIX1NDQU5fV0FJVF9TVEFURSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsaW1SZXN0b3JlUHJlUXVpZXRTdGF0ZShwTWFjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJOb3QgaW4gc2NhbiBzdGF0ZSwgc3RhcnQgcXVpZXQgdGltZXJcbiIpKTspCisgICAgICAgIC8qKiBXZSBhcmUgc2FmZSB0byBzd2l0Y2ggY2hhbm5lbCBhdCB0aGlzIHBvaW50ICovCisgICAgICAgIGxpbVN0YXJ0UXVpZXRUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCk7CisgICAgfQorICAgIAorICAgIC8vIFRyYW5zaXRpb24gdG8gZUxJTV9RVUlFVF9CRUdJTgorICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfQkVHSU47CisjZW5kaWYKK30KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICAgIGxpbVN0YXJ0UXVpZXRUaW1lcgorXGJyaWVmICAgIFN0YXJ0cyB0aGUgcXVpZXQgdGltZXIuCisKK1xwYXJhbSBwTWFjCitccmV0dXJuIE5PTkUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltU3RhcnRRdWlldFRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc2Vzc2lvbklkKQoreworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisgICAgcHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjICwgc2Vzc2lvbklkKTsKKworICAgIGlmKHBzZXNzaW9uRW50cnkgPT0gTlVMTCkgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorCisgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgIT0gZUxJTV9TVEFfUk9MRSkKKyAgICAgICAgcmV0dXJuOworICAgIC8vIEZpcnN0LCBkZS1hY3RpdmF0ZSBUaW1lciwgaWYgaXRzIGFscmVhZHkgYWN0aXZlCisgICAgbGltQ2FuY2VsRG90MTFoUXVpZXQocE1hYywgcHNlc3Npb25FbnRyeSk7CisgICAgCisgICAgbGltRGVhY3RpdmF0ZUFuZENoYW5nZVRpbWVyKHBNYWMsIGVMSU1fUVVJRVRfVElNRVIpOworICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX1FVSUVUX1RJTUVSKSk7CisgICAgCisgICAgcE1hYy0+bGltLmxpbVRpbWVycy5nTGltUXVpZXRUaW1lci5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgaWYoIFRYX1NVQ0NFU1MgIT0gdHhfdGltZXJfYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVF1aWV0VGltZXIpKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoIlVuYWJsZSB0byBhY3RpdmF0ZSBnTGltUXVpZXRUaW1lciEgU1RBIGNhbm5vdCBob25vciBRdWlldCBCU1MhXG4iKSk7CisgICAgICAgIGxpbVJlc3RvcmVQcmVRdWlldFN0YXRlKHBNYWMpOworCisgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9IGVMSU1fUVVJRVRfSU5JVDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorfQorCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorCisvKioKKyAqIGNvbXB1dGVDaGFubmVsU3dpdGNoQ291bnQKKyAqCisgKiBGVU5DVElPTjoKKyAqICAgICBGdW5jdGlvbiB1c2VkIGJ5IGxpbVByb2Nlc3NTbWVTd2l0Y2hDaGxSZXEoKQorICogICAgIHRvIGNvbXB1dGUgY2hhbm5lbCBzd2l0Y2ggY291bnQuCisgKgorICogTE9HSUM6CisgKiAgICBDaGFubmVsIFN3aXRjaCBDb3VudCBpcyB0aGUgbnVtYmVyIG9mIFRCVFQgdW50aWwgQVAgc3dpdGNoZXMKKyAqICAgIHRvIGEgbmV3IGNoYW5uZWwuICBUaGUgdmFsdWUgb2YgQ2hhbm5lbCBTd2l0Y2ggQ291bnQgaXMgY29tcHV0ZWQKKyAqICAgIGluIGEgd2F5LCBzdWNoIHRoYXQgY2hhbm5lbCBzd2l0Y2ggd2lsbCBhbHdheXMgdGFrZSBwbGFjZSBhZnRlcgorICogICAgYSBEVElNLiAgQnkgZG9pbmcgc28sIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBzdGF0aW9uIGluIHBvd2VyIHNhdmUKKyAqICAgIG1vZGUgY2FuIHJlY2VpdmUgdGhlIG1lc3NhZ2UgYW5kIHN3aXRjaCB0byBuZXcgY2hhbm5lbCBhY2NvcmRpbmdseS4KKyAqICAgIEFQIGNhbiBhbHNvIGFubm91bmNlIHRoZSBjaGFubmVsIHN3aXRjaCBzZXZlcmFsIGR0aW1zIGFoZWFkIG9mIHRpbWUuCisgKiAgICBieSBzZXR0aW5nIHRoZSBkdGltRmFjdG9yIHZhbHVlIGdyZWF0ZXIgdGhhbiAxLgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICAgZHRpbUZhY3RvcgorICogQHJldHVybiAgY2hhbm5lbCBzd2l0Y2ggY291bnQKKyAqLwordEFOSV9VMzIgY29tcHV0ZUNoYW5uZWxTd2l0Y2hDb3VudCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBkdGltRmFjdG9yKQoreworICAgIHRBTklfVTMyIGR0aW1QZXJpb2Q7CisgICAgdEFOSV9VMzIgZHRpbUNvdW50OworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfRFRJTV9QRVJJT0QsICZkdGltUGVyaW9kKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIndsYW5fY2ZnR2V0SW50IGZhaWxlZCBmb3IgV05JX0NGR19EVElNX1BFUklPRCBcbiIpKTspCisKKyAgICBkdGltQ291bnQgPSBwTWFjLT5wbW0uZ1BtbVRpbS5kdGltQ291bnQ7CisKKyAgICBpZiAoZHRpbUZhY3RvciA8PSAxKQorICAgICAgICByZXR1cm4gKGR0aW1Db3VudCArIDEpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgoKGR0aW1GYWN0b3IgLTEpKmR0aW1QZXJpb2QpICsgMSArIGR0aW1Db3VudCk7Cit9CisjZW5kaWYKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqKi8KKy8qKgorICoga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIEFOSSBwZWVycyBhc3NvY2lhdGVkIGluIHRoZSBCU1MKKyAqIEZvciB0aGUgZmlyc3QgYW5kIGxhc3QgQU5JIHBlZXIsIHdlIGhhdmUgdG8gdXBkYXRlIEVEQ0EgcGFyYW1zIGFzIG5lZWRlZAorICoKKyAqIFdoZW4gdGhlIGZpcnN0IEFOSSBwZWVyIGpvaW5zIHRoZSBCU1MsIHdlIG5vdGlmeSBTQ0gKKyAqIFdoZW4gdGhlIGxhc3QgQU5JIHBlZXIgbGVhdmVzIHRoZSBCU1MsIHdlIG5vdGZpeSBTQ0gKKyAqLwordm9pZAorbGltVXRpbENvdW50U3RhQWRkKAorICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdHBEcGhIYXNoTm9kZSAgcFN0YSwKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCisgICAgaWYgKCghIHBTdGEpIHx8ICghIHBTdGEtPnZhbGlkKSB8fCAoISBwU3RhLT5hbmlQZWVyKSB8fCAocFN0YS0+ZkFuaUNvdW50KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcFN0YS0+ZkFuaUNvdW50ID0gMTsKKworICAgIGlmIChwTWFjLT5saW0uZ0xpbU51bU9mQW5pU1RBcysrICE9IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8vIGdldCBoZXJlIG9ubHkgaWYgdGhpcyBpcyB0aGUgZmlyc3QgQU5JIHBlZXIgaW4gdGhlIEJTUworICAgIHNjaEVkY2FQcm9maWxlVXBkYXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpOworfQorCit2b2lkCitsaW1VdGlsQ291bnRTdGFEZWwoCisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlICBwU3RhLAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyAgICBpZiAoKHBTdGEgPT0gTlVMTCkgfHwgKHBTdGEtPmFuaVBlZXIgPT0gZUhBTF9DTEVBUikgfHwgKCEgcFN0YS0+ZkFuaUNvdW50KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogT25seSBpZiBzdGEgaXMgaW52YWxpZCBhbmQgdGhlIHZhbGlkSW5EdW1teVN0YXRlIGJpdCBpcyBzZXQgdG8gMSwKKyAgICAgKiB0aGVuIGdvIGFoZWFkIGFuZCB1cGRhdGUgdGhlIGNvdW50IGFuZCBwcm9maWxlcy4gVGhpcyBlbnN1cmVzCisgICAgICogdGhhdCB0aGUgIm51bWJlciBvZiBhbmkgc3RhdGlvbiIgY291bnQgaXMgcHJvcGVybHkgaW5jcmVtZW50ZWQvZGVjcmVtZW50ZWQuCisgICAgICovCisgICAgaWYgKHBTdGEtPnZhbGlkID09IDEpCisgICAgICAgICByZXR1cm47CisKKyAgICBwU3RhLT5mQW5pQ291bnQgPSAwOworCisgICAgaWYgKHBNYWMtPmxpbS5nTGltTnVtT2ZBbmlTVEFzIDw9IDApCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkNvdW50U3RhRGVsOiBpZ25vcmluZyBEZWxldGUgUmVxIHdoZW4gQW5pUGVlciBjb3VudCBpcyAlZFxuIiksCisgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU51bU9mQW5pU1RBcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwTWFjLT5saW0uZ0xpbU51bU9mQW5pU1RBcy0tOworCisgICAgaWYgKHBNYWMtPmxpbS5nTGltTnVtT2ZBbmlTVEFzICE9IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8vIGdldCBoZXJlIG9ubHkgaWYgdGhpcyBpcyB0aGUgbGFzdCBBTkkgcGVlciBpbiB0aGUgQlNTCisgICAgc2NoRWRjYVByb2ZpbGVVcGRhdGUocE1hYywgcHNlc3Npb25FbnRyeSk7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltR2V0SHRDYkFkbWluU3RhdGUKK1xicmllZiBwcm92aWRlcyBDQiBBZG1pbiBzdGF0ZQorXHBhcmFtICAgICB0cEFuaVNpckdsb2JhbCAgICBwTWFjCitccGFyYW0gICAgIHREb3QxMWZJRUhUQ2FwcyBodENhcHMsCitccGFyYW0gICAgIHRBTklfVTggKnRpdGFuSHRDYXBzIAorXHJldHVybiAgICAgbm9uZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltR2V0SHRDYkFkbWluU3RhdGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgIHREb3QxMWZJRUhUQ2FwcyBodENhcHMsCisgICAgICAgIHRBTklfVTggKnRpdGFuSHRDYXBzICkKK3sKKyAgICAvLyBFeHRyYWN0IHNlY29uZGFyeSBjaGFubmVsIGluZm8gd3J0IENoYW5uZWwgQm9uZGluZworICAgIGlmKGh0Q2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpCisgICAgICAgIFNNRV9TRVRfQ0JfQURNSU5fU1RBVEUoICp0aXRhbkh0Q2FwcywgZUhBTF9TRVQgKTsgICAgCisgICAgZWxzZQorICAgICAgICBTTUVfU0VUX0NCX0FETUlOX1NUQVRFKCAqdGl0YW5IdENhcHMsIGVIQUxfQ0xFQVIpOworICAgIAorCisgIC8vIEFuZCB0aGUgZmluYWwgVElUQU4gSFQgY2FwYWJpbGl0aWVzIGJpdG1hcCBpcy4uLgorICBsaW1Mb2coIHBNYWMsIExPRzIsCisgICAgICBGTCgiVElUQU4gSFQgY2FwYWJpbGl0aWVzIGluIEJTUyBEZXNjcmlwdGlvbiA9ICUxZFxuIiksCisgICAgICAgICp0aXRhbkh0Q2Fwcyk7Cit9CisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbUdldEh0Q2JPcFN0YXRlCitcYnJpZWYgcHJvdmlkZXMgQ0Igb3BlcmF0aW9uYWwgc3RhdGUKK1xwYXJhbSAgICAgdHBBbmlTaXJHbG9iYWwgICAgcE1hYworXHBhcmFtICAgICB0RG90MTFmSUVIVEluZm8gaHRJbmZvLAorXHBhcmFtICAgICB0QU5JX1U4ICp0aXRhbkh0Q2FwcworXHJldHVybiAgICAgbm9uZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltR2V0SHRDYk9wU3RhdGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgIHREb3QxMWZJRUhUSW5mbyBodEluZm8sCisgICAgICAgIHRBTklfVTggKnRpdGFuSHRDYXBzICkKK3sKKyAgICAvLyBFeHRyYWN0IHNlY29uZGFyeSBjaGFubmVsIGluZm8gd3J0IENoYW5uZWwgQm9uZGluZworICAgIGlmKGh0SW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KQorICAgIHsKKyAgICAgIGlmKFBIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWSA9PSBodEluZm8uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCkKKyAgICAgICAgICBTTUVfU0VUX0NCX09QRVJfU1RBVEUoICp0aXRhbkh0Q2FwcywKKyAgICAgICAgICAgIGVBTklfQ0JfU0VDT05EQVJZX1VQICk7CisgICAgICBlbHNlIGlmKFBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlkgPT0gaHRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQpCisgICAgICAgICAgU01FX1NFVF9DQl9PUEVSX1NUQVRFKCAqdGl0YW5IdENhcHMsCisgICAgICAgICAgICBlQU5JX0NCX1NFQ09OREFSWV9ET1dOICk7CisgICAgfQorCisgIC8vIEFuZCB0aGUgZmluYWwgVElUQU4gSFQgY2FwYWJpbGl0aWVzIGJpdG1hcCBpcy4uLgorICBsaW1Mb2coIHBNYWMsIExPRzIsCisgICAgICBGTCgiVElUQU4gSFQgY2FwYWJpbGl0aWVzIGluIEJTUyBEZXNjcmlwdGlvbiA9ICUxZFxuIiksCisgICAgICAgICp0aXRhbkh0Q2Fwcyk7Cit9CisKKy8qKgorICogbGltU3dpdGNoQ2hhbm5lbENiYWNrKCkKKyAqCisgKkZVTkNUSU9OOgorICogIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2hpbGUgcmVxdWVzdGluZyB0byBzd2l0Y2ggY2hhbm5lbAorICogIGFmdGVyIEFQIGluZGljYXRlcyBhIGNoYW5uZWwgc3dpdGNoIGZvciBzcGVjdHJ1bSBtYW5hZ2VtZW50ICgxMWgpLgorICogCisgKk5PVEU6CisgKiBAcGFyYW0gIHBNYWMgICAgICAgICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIHN0YXR1cyAgICAgICAgICAgICBTdGF0dXMgb2YgY2hhbm5lbCBzd2l0Y2ggcmVxdWVzdAorICogQHBhcmFtICBkYXRhICAgICAgICAgICAgICAgVXNlciBkYXRhCisgKiBAcGFyYW0gIHBzZXNzaW9uRW50cnkgICAgICBTZXNzaW9uIGluZm9ybWF0aW9uIAorICogQHJldHVybiBOT05FCisgKi8KK3ZvaWQgbGltU3dpdGNoQ2hhbm5lbENiYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgc3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpkYXRhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgdFNpck1zZ1EgICAgbW1oTXNnID0gezB9OworICAgdFNpclNtZVN3aXRjaENoYW5uZWxJbmQgKnBTaXJTbWVTd2l0Y2hDaEluZDsKKworICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLEZMKCJTZW5kaW5nIG1lc3NhZ2UgJXMgd2l0aCByZWFzb25Db2RlICVzXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgbGltTXNnU3RyKG1zZ1R5cGUpLCBsaW1SZXN1bHRDb2RlU3RyKHJlc3VsdENvZGUpKTspCisKKyAgIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCA9IHBzZXNzaW9uRW50cnktPmN1cnJlbnRSZXFDaGFubmVsOyAKKyAgIAorICAgLyogV2UgbmVlZCB0byByZXN0b3JlIHByZS1jaGFubmVsU3dpdGNoIHN0YXRlIG9uIHRoZSBTVEEgKi8KKyAgIGlmIChsaW1SZXN0b3JlUHJlQ2hhbm5lbFN3aXRjaFN0YXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ291bGQgbm90IHJlc3RvcmUgcHJlLWNoYW5uZWxTd2l0Y2ggKDExaCkgc3RhdGUsIHJlc2V0dGluZyB0aGUgc3lzdGVtXG4iKSk7CisgICAgICByZXR1cm47CisgICB9CisgICAKKyAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfU1dJVENIX0NITF9SRVE7CisgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTaXJTbWVTd2l0Y2hDaEluZCwgc2l6ZW9mKHRTaXJTbWVTd2l0Y2hDaGFubmVsSW5kKSkpCisgICB7CisgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGJ1ZmZlciBkZXNjcmlwdG9yXG4iKSk7CisgICAgICByZXR1cm47CisgICB9CisgIAorICAgcFNpclNtZVN3aXRjaENoSW5kLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX1NXSVRDSF9DSExfUkVROworICAgcFNpclNtZVN3aXRjaENoSW5kLT5sZW5ndGggPSBzaXplb2YodFNpclNtZVN3aXRjaENoYW5uZWxJbmQpOworICAgcFNpclNtZVN3aXRjaENoSW5kLT5uZXdDaGFubmVsSWQgPSBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2gucHJpbWFyeUNoYW5uZWw7CisgICBwU2lyU21lU3dpdGNoQ2hJbmQtPnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnNtZVNlc3Npb25JZDsKKyAgIC8vQlNTIElECisgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU2lyU21lU3dpdGNoQ2hJbmQtPmJzc0lkLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICBtbWhNc2cuYm9keXB0ciA9IHBTaXJTbWVTd2l0Y2hDaEluZDsKKyAgIG1taE1zZy5ib2R5dmFsID0gMDsKKyAgIAorICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyAgIAorI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgICBTeXNQcm9jZXNzTW1oTXNnKHBNYWMsICZtbWhNc2cpOworI2Vsc2UKKyAgIGlmKGhhbE1taFBvc3RNc2dBcGkocE1hYywgJm1taE1zZywgZVBST1QpICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiltc2cySGRkKTsKKyAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiTWVzc2FnZSBwb3N0aW5nIHRvIEhBTCBmYWlsZWRcbiIpKTsKKyAgIH0KKyNlbmRpZgorfQorCisvKioKKyAqIGxpbVN3aXRjaFByaW1hcnlDaGFubmVsKCkKKyAqCisgKkZVTkNUSU9OOgorICogIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbAorICogIGFuZCBzZXRzIHRoZSBuZXcgbmV3IGNoYW5uZWwgSUQgaW4gV05JX0NGR19DVVJSRU5UX0NIQU5ORUwuCisgKgorICpOT1RFOgorICogQHBhcmFtICBwTWFjICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIG5ld0NoYW5uZWwgIG5ldyBjaG5hbm5lbCBJRAorICogQHJldHVybiBOT05FCisgKi8KK3ZvaWQgbGltU3dpdGNoUHJpbWFyeUNoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBuZXdDaGFubmVsLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisjaWYgIWRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSSAgCisgICAgdEFOSV9VMzIgbG9jYWxQd3JDb25zdHJhaW50OworI2VuZGlmCisgICAgCisgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgibGltU3dpdGNoUHJpbWFyeUNoYW5uZWw6IG9sZCBjaG5sICVkIC0tPiBuZXcgY2hubCAlZCBcbiIpLAorICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwsIG5ld0NoYW5uZWwpOykKKyAgICBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50UmVxQ2hhbm5lbCA9IG5ld0NoYW5uZWw7CisgICAgcHNlc3Npb25FbnRyeS0+bGltUkZCYW5kID0gbGltR2V0UkZCYW5kKG5ld0NoYW5uZWwpOworCisgICAgcHNlc3Npb25FbnRyeS0+Y2hhbm5lbENoYW5nZVJlYXNvbkNvZGU9TElNX1NXSVRDSF9DSEFOTkVMX09QRVJBVElPTjsKKworICAgIHBNYWMtPmxpbS5ncGNoYW5nZUNoYW5uZWxDYWxsYmFjayA9IGxpbVN3aXRjaENoYW5uZWxDYmFjazsKKyAgICBwTWFjLT5saW0uZ3BjaGFuZ2VDaGFubmVsRGF0YSA9IE5VTEw7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkgIAorICAgIGxpbVNlbmRTd2l0Y2hDaG5sUGFyYW1zKHBNYWMsIG5ld0NoYW5uZWwsIGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPm1heFR4UG93ZXIsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKyNlbHNlCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5ULCAmbG9jYWxQd3JDb25zdHJhaW50KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCAiVW5hYmxlIHRvIHJlYWQgTG9jYWwgUG93ZXIgQ29uc3RyYWludCBmcm9tIGNmZ1xuIiApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsaW1TZW5kU3dpdGNoQ2hubFBhcmFtcyhwTWFjLCBuZXdDaGFubmVsLCBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodFBvd2VyZEJtKWxvY2FsUHdyQ29uc3RyYWludCwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworI2VuZGlmCisgICAgcmV0dXJuOworfQorCisvKioKKyAqIGxpbVN3aXRjaFByaW1hcnlTZWNvbmRhcnlDaGFubmVsKCkKKyAqCisgKkZVTkNUSU9OOgorICogIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGNoYW5uZWwuCisgKiAgSWYgMTFoIGlzIGVuYWJsZWQgYW5kIHVzZXIgcHJvdmlkZXMgYSAibmV3IGNoYW5uZWwgSUQiCisgKiAgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbCwKKyAqICB0aGVuIHdlIG11c3Qgc2V0IHRoaXMgbmV3IGNoYW5uZWwgaW4gV05JX0NGR19DVVJSRU5UX0NIQU5ORUwsCisgKiAgYXNzaWduIG5vdGlmeSBMSU0gb2Ygc3VjaCBjaGFuZ2UuCisgKgorICpOT1RFOgorICogQHBhcmFtICBwTWFjICAgICAgICBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcGFyYW0gIG5ld0NoYW5uZWwgIE5ldyBjaG5hbm5lbCBJRCAob3IgY3VycmVudCBjaGFubmVsIElEKQorICogQHBhcmFtICBzdWJiYW5kICAgICBDQiBzZWNvbmRhcnkgaW5mbzoKKyAqICAgICAgICAgICAgICAgICAgICAgICAtIGVBTklfQ0JfU0VDT05EQVJZX05PTkUKKyAqICAgICAgICAgICAgICAgICAgICAgICAtIGVBTklfQ0JfU0VDT05EQVJZX1VQCisgKiAgICAgICAgICAgICAgICAgICAgICAgLSBlQU5JX0NCX1NFQ09OREFSWV9ET1dOCisgKiBAcmV0dXJuIE5PTkUKKyAqLwordm9pZCBsaW1Td2l0Y2hQcmltYXJ5U2Vjb25kYXJ5Q2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IG5ld0NoYW5uZWwsIHRBbmlDQlNlY29uZGFyeU1vZGUgc3ViYmFuZCkKK3sKKyNpZiAhZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJICAKKyAgICB0QU5JX1UzMiBsb2NhbFB3ckNvbnN0cmFpbnQ7CisjZW5kaWYKKworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSAgJnBNYWMtPmxpbS5ncFNlc3Npb25bMF07IC8vVEJELVJBSkVTSCBIT1cgVE8gR0VUIHNlc3Npb25FbnRyeT8/Pz8/CisjaWYgIWRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSSAgCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5ULCAmbG9jYWxQd3JDb25zdHJhaW50KSAhPSBlU0lSX1NVQ0NFU1MpIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCggIlVuYWJsZSB0byBnZXQgTG9jYWwgUG93ZXIgQ29uc3RyYWludCBmcm9tIGNmZ1xuIiApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgc3dpdGNoKHN1YmJhbmQpCisgICAgeworICAgICAgICBjYXNlIGVBTklfQ0JfU0VDT05EQVJZX05PTkU6CisgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJEaXNhYmxlIENCIFNFQ09OREFSWVxuIikpOykKKyAgICAgICAgICAgIC8qIElmIENCIHdhcyBvbiwgdHVybiBpdCBvZmYsIG90aGVyd2lzZSwgZG8gbm90aGluZyAqLworICAgICAgICAgICAgaWYoR0VUX0NCX09QRVJfU1RBVEUocE1hYy0+bGltLmdDYlN0YXRlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUdXJuIG9mZiBDQiBpbiBIVyBhbmQgU1cuICBTVyBhbmQgSFcgY2JzdGF0ZSBtdXN0IG1hdGNoISAgT3RoZXJ3aXNlLCB3aWxsIGhpdCBBU1NFUlQgY2FzZSAqLworICAgICAgICAgICAgICAgIFNFVF9DQl9PUEVSX1NUQVRFKHBNYWMtPmxpbS5nQ2JTdGF0ZSwgZUhBTF9DTEVBUik7CisgICAgICAgICAgICAgICAgLyogQ2xlYW4gdXAgc3RhdGlvbiBlbnRyeSBpZiB3ZSdyZSBub3QgU1RBICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEUsIFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEVfTk9ORSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnU2V0SW50IFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEUgZmFpbGVkIFxuIikpOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJICAKKyAgICAgICAgICAgIGxpbVNlbmRTd2l0Y2hDaG5sUGFyYW1zKHBNYWMsIG5ld0NoYW5uZWwsIGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfTk9ORSwgcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworI2Vsc2UKKyAgICAgICAgICAgIC8vU2VuZCBNZXNzYWdlIHRvIEhBTCB0byB1cGRhdGUgdGhlIGNoYW5uZWwKKyAgICAgICAgICAgIGxpbVNlbmRTd2l0Y2hDaG5sUGFyYW1zKHBNYWMsIG5ld0NoYW5uZWwsIGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfTk9ORSwgKHRQb3dlcmRCbSlsb2NhbFB3ckNvbnN0cmFpbnQsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQU5JX0NCX1NFQ09OREFSWV9VUDoKKyAgICAgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIlN3aXRjaCBDQiBTRUNPTkRBUlkgdG8gVVAuXG4iKSk7KQorICAgICAgICAgICAgU0VUX0NCX1NFQ19DSEFOTkVMKHBNYWMtPmxpbS5nQ2JTdGF0ZSwgZUhBTF9TRVQpOworICAgICAgICAgICAgaWYgKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFLCBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFX0hJR0hFUikgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnU2V0SW50IFdOSV9DRkdfQ0JfU0VDT05EQVJZX0NIQU5ORUxfU1RBVEUgZmFpbGVkIFxuIikpOworCisgICAgICAgICAgICAvKiBJZiBDQiB3YXMgb2ZmLCB0dXJuIGl0IG9uLCBvdGhlcndpc2UsIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgIGlmKCFHRVRfQ0JfT1BFUl9TVEFURShwTWFjLT5saW0uZ0NiU3RhdGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFR1cm4gb24gQ0IgaW4gSFcgYW5kIFNXLiAgU1cgYW5kIEhXIGNic3RhdGUgbXVzdCBtYXRjaCEgIE90aGVyd2lzZSwgd2lsbCBoaXQgQVNTRVJUIGNhc2UgKi8KKyAgICAgICAgICAgICAgICBTRVRfQ0JfT1BFUl9TVEFURShwTWFjLT5saW0uZ0NiU3RhdGUsIGVIQUxfU0VUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vU2VuZCBNZXNzYWdlIHRvIEhBTCB0byB1cGRhdGUgdGhlIGNoYW5uZWwKKyAgICAgICAgICAgIC8vZW51bXMgZm9yIHNlY29uZGFyeSBjaGFubmVsIG9mZnNldCBmb3IgVGl0YW4gYW5kIDExbiBhcmUgZGlmZmVyZW50CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJICAKKyAgICAgICAgICAgIGxpbVNlbmRTd2l0Y2hDaG5sUGFyYW1zKHBNYWMsIG5ld0NoYW5uZWwsIGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfVVAsIHBzZXNzaW9uRW50cnktPm1heFR4UG93ZXIsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKyNlbHNlCisgICAgICAgICAgICBsaW1TZW5kU3dpdGNoQ2hubFBhcmFtcyhwTWFjLCBuZXdDaGFubmVsLCBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX1VQLCAodFBvd2VyZEJtKWxvY2FsUHdyQ29uc3RyYWludCwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVBTklfQ0JfU0VDT05EQVJZX0RPV046CisgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJTd2l0Y2ggQ0IgU0VDT05EQVJZIHRvIExPV0VSLlxuIikpOykKKyAgICAgICAgICAgIFNFVF9DQl9TRUNfQ0hBTk5FTChwTWFjLT5saW0uZ0NiU3RhdGUsIGVIQUxfQ0xFQVIpOworICAgICAgICAgICAgaWYgKGNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFLCBXTklfQ0ZHX0NCX1NFQ09OREFSWV9DSEFOTkVMX1NUQVRFX0xPV0VSKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmdTZXRJbnQgV05JX0NGR19DQl9TRUNPTkRBUllfQ0hBTk5FTF9TVEFURSBmYWlsZWQgXG4iKSk7CisgICAgICAgICAgICAvKiBJZiBDQiB3YXMgb2ZmLCB0dXJuIGl0IG9uLCBvdGhlcndpc2UsIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgIGlmKCFHRVRfQ0JfT1BFUl9TVEFURShwTWFjLT5saW0uZ0NiU3RhdGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFR1cm4gb24gQ0IgaW4gSFcgYW5kIFNXLiAgU1cgYW5kIEhXIGNic3RhdGUgbXVzdCBtYXRjaCEgIE90aGVyd2lzZSwgd2lsbCBoaXQgQVNTRVJUIGNhc2UgKi8KKyAgICAgICAgICAgICAgICBTRVRfQ0JfT1BFUl9TVEFURShwTWFjLT5saW0uZ0NiU3RhdGUsIGVIQUxfU0VUKTsKKyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgc3RhdGlvbiBlbnRyeSBpZiB3ZSdyZSBub3QgU1RBICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1NlbmQgTWVzc2FnZSB0byBIQUwgdG8gdXBkYXRlIHRoZSBjaGFubmVsCisgICAgICAgICAgICAvL2VudW1zIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBvZmZzZXQgZm9yIFRpdGFuIGFuZCAxMW4gYXJlIGRpZmZlcmVudAorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSSAgCisgICAgICAgICAgICBsaW1TZW5kU3dpdGNoQ2hubFBhcmFtcyhwTWFjLCBuZXdDaGFubmVsLCBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX05PTkUsIHBzZXNzaW9uRW50cnktPm1heFR4UG93ZXIsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKyNlbHNlCisgICAgICAgICAgICBsaW1TZW5kU3dpdGNoQ2hubFBhcmFtcyhwTWFjLCBuZXdDaGFubmVsLCBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX0RPV04sICh0UG93ZXJkQm0pbG9jYWxQd3JDb25zdHJhaW50LCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUFOSV9ET05PVF9VU0VfU0VDT05EQVJZX01PREU6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIC8vIFdlIHNob3VsZCBvbmx5IGJlIGNoYW5naW5nIHByaW1hcnkgYW5kIHNlY29uZGFyeSBjaGFubmVscyBvbiB0aGUgZmx5CisgICAgLy8gaWYgdGhpcyBpcyAxMWggZW5hYmxlZC4KKyAgICBpZiAoCisjaWYgMAorICAgICAgICBwTWFjLT5saW0uZ0xpbTExaEVuYWJsZSAmJgorI2VuZGlmCisgICAgICAgIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCAhPSBuZXdDaGFubmVsKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICBGTCgic3dpdGNoIG9sZCBjaG5sICVkIC0tPiBuZXcgY2hubCAlZCBcbiIpLAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsLCBuZXdDaGFubmVsKTsKKworICAgICAgICAjaWYgMAorCisgICAgICAgIGlmIChjZmdTZXRJbnQocE1hYywgV05JX0NGR19DVVJSRU5UX0NIQU5ORUwsIG5ld0NoYW5uZWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgic2V0IENVUlJFTlRfQ0hBTk5FTCBhdCBDRkcgZmFpbC5cbiIpKTsKKyAgICAgICAgI2VuZGlmIC8vIFRPIFNVUFBPUlQgQlQtQU1QCisKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsID0gbmV3Q2hhbm5lbDsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqCisgKiBsaW1BY3RpdmVTY2FuQWxsb3dlZCgpCisgKgorICpGVU5DVElPTjoKKyAqIENoZWNrcyBpZiBhY3RpdmUgc2NhbnMgYXJlIHBlcm1pdHRlZCBvbiB0aGUgZ2l2ZW4gY2hhbm5lbAorICoKKyAqTE9HSUM6CisgKiBUaGUgY29uZmlnIHZhcmlhYmxlIFNDQU5fQ09OVFJPTF9MSVNUIGNvbnRhaW5zIHBhaXJzIG9mIChjaGFubmVsTnVtLCBhY3RpdmVTY2FuQWxsb3dlZCkKKyAqIE5lZWQgdG8gY2hlY2sgaWYgdGhlIGNoYW5uZWxOdW0gbWF0Y2hlcywgdGhlbiBkZXBlbmRpbmcgb24gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIHNjYW4gZmxhZywgcmV0dXJuIHRydWUgKGZvciBhY3RpdmVTY2FuQWxsb3dlZD09MSkgb3IgZmFsc2UgKG90aGVyd2lzZSkuCisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtICBwTWFjICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgY2hhbm5lbE51bSBjaGFubmVsIG51bWJlcgorICogQHJldHVybiBOb25lCisgKi8KKwordEFOSV9VOCBsaW1BY3RpdmVTY2FuQWxsb3dlZCgKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRBTklfVTggICAgICAgICAgICAgY2hhbm5lbE51bSkKK3sKKyAgICB0QU5JX1UzMiBpOworICAgIHRBTklfVTggIGNoYW5uZWxQYWlyW1dOSV9DRkdfU0NBTl9DT05UUk9MX0xJU1RfTEVOXTsKKyAgICB0QU5JX1UzMiBsZW4gPSBXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNUX0xFTjsKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVCwgY2hhbm5lbFBhaXIsICZsZW4pCisgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlVuYWJsZSB0byBnZXQgc2NhbiBjb250cm9sIGxpc3RcbiIpKTspCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobGVuID4gV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVF9MRU4pCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgc2NhbiBjb250cm9sIGxpc3QgbGVuZ3RoOiVkXG4iKSwKKyAgICAgICAgICAgICAgIGxlbik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgKGkrMSkgPCBsZW47IGkrPTIpCisgICAgeworICAgICAgICBpZiAoY2hhbm5lbFBhaXJbaV0gPT0gY2hhbm5lbE51bSkKKyAgICAgICAgICAgIHJldHVybiAoKGNoYW5uZWxQYWlyW2krMV0gPT0gZVNJUl9BQ1RJVkVfU0NBTikgPyB0cnVlIDogZmFsc2UpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogbGltVHJpZ2dlckJhY2tncm91bmRTY2FuRHVyaW5nUXVpZXRCc3MoKQorICoKKyAqRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGFwcGxpY2FibGUgdG8gdGhlIFNUQSBvbmx5LgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGltUHJvY2Vzc1F1aWV0VGltZW91dCgpLAorICogd2hlbiBpdCBpcyB0aW1lIHRvIGhvbm9yIHRoZSBRdWlldCBCU1MgSUUgZnJvbSB0aGUgQVAuCisgKgorICpMT0dJQzoKKyAqIElmIDExSCBpcyBlbmFibGVkOgorICogV2UgY2Fubm90IHRyaWdnZXIgYSBiYWNrZ3JvdW5kIHNjYW4uIFRoZSBTVEEgbmVlZHMgdG8KKyAqIHNodXQtb2ZmIFR4L1J4LgorICogSWYgMTEgaXMgbm90IGVuYWJsZWQ6CisgKiBEZXRlcm1pbmUgaWYgdGhlIG5leHQgY2hhbm5lbCB0aGF0IHdlIGFyZSBnb2luZyB0bworICogc2NhbiBpcyBOT1QgdGhlIHNhbWUgY2hhbm5lbCAob3Igbm90KSBvbiB3aGljaCB0aGUKKyAqIFF1aWV0IEJTUyB3YXMgcmVxdWVzdGVkLgorICogSWYgeWVzLCB0aGVuIHdlIGNhbm5vdCB0cmlnZ2VyIGEgYmFja2dyb3VuZCBzY2FuIG9uCisgKiB0aGlzIGNoYW5uZWwuIFJldHVybiB3aXRoIGEgZmFsc2UuCisgKiBJZiBubywgdGhlbiB0cmlnZ2VyIGEgYmFja2dyb3VuZCBzY2FuLiBSZXR1cm4gd2l0aAorICogYSB0cnVlLgorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICpOT1RFOgorICogVGhpcyBBUEkgaXMgcmVkdW5kYW50IGlmIHRoZSBleGlzdGluZyBBUEksCisgKiBsaW1UcmlnZ2VyQmFja2dyb3VuZFNjYW4oKSwgd2VyZSB0byByZXR1cm4gYSB2YWxpZAorICogcmVzcG9uc2UgaW5zdGVhZCBvZiByZXR1cm5pbmcgdm9pZC4KKyAqIElmIHBvc3NpYmxlLCB0cnkgdG8gcmV2aXNpdCB0aGlzIEFQSQorICoKKyAqIEBwYXJhbSAgcE1hYyBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIGVTSVJfVFJVRSwgaWYgYSBiYWNrZ3JvdW5kIHNjYW4gd2FzIGF0dGVtcHRlZAorICogICAgICAgICBlU0lSX0ZBTFNFLCBpZiBub3QKKyAqLwordEFuaUJvb2wgbGltVHJpZ2dlckJhY2tncm91bmRTY2FuRHVyaW5nUXVpZXRCc3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIHRBbmlCb29sIGJTY2FuVHJpZ2dlcmVkID0gZVNJUl9GQUxTRTsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorCisgICAgCisKKyAgICAvL1RCRC1SQUpFU0ggSE9XIFRPIEdFVCBzZXNzaW9uRW50cnk/Pz8/PworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkgPSAmcE1hYy0+bGltLmdwU2Vzc2lvblswXTsKKworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fU1RBX1JPTEUpCisgICAgICAgIHJldHVybiBiU2NhblRyaWdnZXJlZDsKKyAgICAKKyAgICBpZiggIXBNYWMtPmxpbS5nTGltMTFoRW5hYmxlICkKKyAgICB7CisgICAgICAgIHRTaXJNYWNDaGFuTnVtIGJnU2NhbkNoYW5uZWxMaXN0W1dOSV9DRkdfQkdfU0NBTl9DSEFOTkVMX0xJU1RfTEVOXTsKKyAgICAgICAgdEFOSV9VMzIgbGVuID0gV05JX0NGR19CR19TQ0FOX0NIQU5ORUxfTElTVF9MRU47CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IHNjYW4gY2hhbm5lbAorCisgICAgICAgIC8vIEdldCBiYWNrZ3JvdW5kIHNjYW4gY2hhbm5lbCBsaXN0IGZyb20gQ0ZHCisgICAgICAgIGlmKCBlU0lSX1NVQ0NFU1MgPT0gd2xhbl9jZmdHZXRTdHIoIHBNYWMsCisgICAgICAgICAgV05JX0NGR19CR19TQ0FOX0NIQU5ORUxfTElTVCwKKyAgICAgICAgICAodEFOSV9VOCAqKSBiZ1NjYW5DaGFubmVsTGlzdCwKKyAgICAgICAgICAodEFOSV9VMzIgKikgJmxlbiApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBkbyBub3QgZ28gb2ZmIHNjYW5uaW5nIG9uIHRoZSBzYW1lCisgICAgICAgIC8vIGNoYW5uZWwgb24gd2hpY2ggdGhlIFF1aWV0IEJTUyB3YXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiggcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsIT0KKyAgICAgICAgICAgICAgICBiZ1NjYW5DaGFubmVsTGlzdFtwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuQ2hhbm5lbElkXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBGb3Igbm93LCB0cnkgYW5kIGF0dGVtcHQgYSBiYWNrZ3JvdW5kIHNjYW4uIEl0IHdpbGwKKyAgICAgICAgICAgIC8vIGJlIGlkZWFsIGlmIHRoaXMgQVBJIGFjdHVhbGx5IHJldHVybnMgYSBzdWNjZXNzIG9yCisgICAgICAgICAgICAvLyBmYWlsdXJlIGluc3RlYWQgb2YgaGF2aW5nIGEgdm9pZCByZXR1cm4gdHlwZQorICAgICAgICAgICAgbGltVHJpZ2dlckJhY2tncm91bmRTY2FuKCBwTWFjICk7CisKKyAgICAgICAgICAgIGJTY2FuVHJpZ2dlcmVkID0gZVNJUl9UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgIEZMKCJUaGUgbmV4dCBTQ0FOIGNoYW5uZWwgaXMgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwgb24gd2hpY2ggYSBRdWlldCBCU1MgaXMgcmVxdWVzdGVkLiEgQSBiYWNrZ3JvdW5kIHNjYW4gd2lsbCBub3QgYmUgdHJpZ2dlcmVkIGR1cmluZyB0aGlzIFF1aWV0IEJTUyBwZXJpb2QuLi5cbiIpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLAorICAgICAgICAgIEZMKCJVbmFibGUgdG8gcmV0cmlldmUgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QgZnJvbSBDRkchIEEgYmFja2dyb3VuZCBzY2FuIHdpbGwgbm90IGJlIHRyaWdnZXJlZCBkdXJpbmcgdGhpcyBRdWlldCBCU1MgcGVyaW9kLi4uXG4iKSk7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIGJTY2FuVHJpZ2dlcmVkOworfQorCisKKy8qKgorICogbGltR2V0SFRDYXBhYmlsaXR5KCkKKyAqCisgKkZVTkNUSU9OOgorICogQSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgImN1cnJlbnQgSFQgY2FwYWJpbGl0eSBzdGF0ZSIgZm9yIHRoZSBIVAorICogY2FwYWJpbGl0eSBvZiBpbnRlcmVzdCAoYXMgcmVxdWVzdGVkIGluIHRoZSBBUEkpCisgKgorICpMT0dJQzoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHJldHVybiB3aXRoIHRoZSAiY3VycmVudCIgc2V0dGluZyBvZiBhIHJlcXVlc3RlZCBIVAorICogY2FwYWJpbGl0eS4gVGhpcyBzdGF0ZSBpbmZvIGNvdWxkIGJlIHJldHJpZXZlZCBmcm9tIC0KKyAqIGEpIENGRyAoZm9yIHN0YXRpYyBlbnRyaWVzKQorICogYikgUnVuIHRpbWUgaW5mbworICogICAtIER5bmFtaWMgc3RhdGUgbWFpbnRhaW5lZCBieSBMSU0KKyAqICAgLSBDb25maWd1cmVkIGF0IHJhZGlvIGluaXQgdGltZSBieSBTTUUKKyAqCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgcE1hYyAgUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBodENhcCBUaGUgSFQgY2FwYWJpbGl0eSBiZWluZyBxdWVyaWVkCisgKiBAcmV0dXJuIHRBTklfVTggVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlcXVlc3RlZCBIVCBjYXBhYmlsaXR5IGlzIHJldHVybmVkIGluIGEKKyAqICAgICAgICAgICAgdEFOSV9VOCB2YXJpYWJsZQorICovCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFIAordEFOSV9VOCBsaW1HZXRIVENhcGFiaWxpdHkoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgIHRBTklfVTMyIGh0Q2FwLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQorI2Vsc2UKK3RBTklfVTggbGltR2V0SFRDYXBhYmlsaXR5KCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICB0QU5JX1UzMiBodENhcCApCisjZW5kaWYKK3sKK3RBTklfVTggcmV0VmFsID0gMDsKK3RBTklfVTggKnB0cjsKK3RBTklfVTMyICBjZmdWYWx1ZTsKK3RTaXJNYWNIVENhcGFiaWxpdHlJbmZvIG1hY0hUQ2FwYWJpbGl0eUluZm8gPSB7MH07Cit0U2lyTWFjRXh0ZW5kZWRIVENhcGFiaWxpdHlJbmZvIG1hY0V4dEhUQ2FwYWJpbGl0eUluZm8gPSB7MH07Cit0U2lyTWFjVHhCRkNhcGFiaWxpdHlJbmZvIG1hY1R4QkZDYXBhYmlsaXR5SW5mbyA9IHswfTsKK3RTaXJNYWNBU0NhcGFiaWxpdHlJbmZvIG1hY0FTQ2FwYWJpbGl0eUluZm8gPSB7MH07CisKKyAgLy8KKyAgLy8gRGV0ZXJtaW5lIHdoaWNoIENGRyB0byByZWFkIGZyb20uIE5vdCBBTEwgb2YgdGhlIEhUCisgIC8vIHJlbGF0ZWQgQ0ZHJ3MgbmVlZCB0byBiZSByZWFkIGVhY2ggdGltZSB0aGlzIEFQSSBpcworICAvLyBhY2Nlc3NlZAorICAvLworICBpZiggaHRDYXAgPj0gZUhUX0FOVEVOTkFfU0VMRUNUSU9OICYmCisgICAgICBodENhcCA8IGVIVF9TSV9HUkFOVUxBUklUWSApCisgIHsKKyAgICAvLyBHZXQgQW50ZW5uYSBTZWxldGlvbiBIVCBDYXBhYmlsaXRpZXMKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0SW50KCBwTWFjLCBXTklfQ0ZHX0FTX0NBUCwgJmNmZ1ZhbHVlICkpCisgICAgICBjZmdWYWx1ZSA9IDA7CisgICAgcHRyID0gKHRBTklfVTggKikgJm1hY0FTQ2FwYWJpbGl0eUluZm87CisgICAgKigodEFOSV9VOCAqKXB0cikgPSAgKHRBTklfVTgpIChjZmdWYWx1ZSAmIDB4ZmYpOworICB9CisgIGVsc2UKKyAgeworICAgIGlmKCBodENhcCA+PSBlSFRfVFhfQkVBTUZPUk1JTkcgJiYKKyAgICAgICAgaHRDYXAgPCBlSFRfQU5URU5OQV9TRUxFQ1RJT04gKQorICAgIHsKKyAgICAgIC8vIEdldCBUcmFuc21pdCBCZWFtIEZvcm1pbmcgSFQgQ2FwYWJpbGl0aWVzCisgICAgICBpZiggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0SW50KCBwTWFjLCBXTklfQ0ZHX1RYX0JGX0NBUCwgJmNmZ1ZhbHVlICkpCisgICAgICAgIGNmZ1ZhbHVlID0gMDsKKyAgICAgIHB0ciA9ICh0QU5JX1U4ICopICZtYWNUeEJGQ2FwYWJpbGl0eUluZm87CisgICAgICAqKCh0QU5JX1UzMiAqKXB0cikgPSAgKHRBTklfVTMyKSAoY2ZnVmFsdWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYoIGh0Q2FwID49IGVIVF9QQ08gJiYKKyAgICAgICAgICBodENhcCA8IGVIVF9UWF9CRUFNRk9STUlORyApCisgICAgICB7CisgICAgICAgIC8vIEdldCBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMKKyAgICAgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSB3bGFuX2NmZ0dldEludCggcE1hYywgV05JX0NGR19FWFRfSFRfQ0FQX0lORk8sICZjZmdWYWx1ZSApKQorICAgICAgICAgIGNmZ1ZhbHVlID0gMDsKKyAgICAgICAgcHRyID0gKHRBTklfVTggKikgJm1hY0V4dEhUQ2FwYWJpbGl0eUluZm87CisgICAgICAgICooKHRBTklfVTE2ICopcHRyKSA9ICAodEFOSV9VMTYpIChjZmdWYWx1ZSAmIDB4ZmZmZik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmKCBodENhcCA8IGVIVF9NQVhfUlhfQU1QRFVfRkFDVE9SICkKKyAgICAgICAgeworICAgICAgICAgIC8vIEdldCBIVCBDYXBhYmlsaXRpZXMKKyAgICAgICAgICBpZiggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0SW50KCBwTWFjLCBXTklfQ0ZHX0hUX0NBUF9JTkZPLCAmY2ZnVmFsdWUgKSkKKyAgICAgICAgICAgIGNmZ1ZhbHVlID0gMDsKKyAgICAgICAgICBwdHIgPSAodEFOSV9VOCAqKSAmbWFjSFRDYXBhYmlsaXR5SW5mbzsKKyAgICAgICAgICAvLyBDUiAyNjUyODIgTURNIFNvZnRBUCAyLjRQTDogU29mdEFQIGJvb3QgdXAgY3Jhc2ggaW4gMi40IFBMIGJ1aWxkcyB3aGlsZSBzYW1lIFdMQU4gU1UgaXMgd29ya2luZyBvbiAyLjEgUEwKKyAgICAgICAgICAqcHRyKysgPSBjZmdWYWx1ZSAmIDB4ZmY7CisgICAgICAgICAgKnB0ciA9IChjZmdWYWx1ZSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzd2l0Y2goIGh0Q2FwICkKKyAgeworICAgIGNhc2UgZUhUX0xTSUdfVFhPUF9QUk9URUNUSU9OOgorICAgICAgcmV0VmFsID0gcE1hYy0+bGltLmdIVExzaWdUWE9QUHJvdGVjdGlvbjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlSFRfU1RCQ19DT05UUk9MX0ZSQU1FOgorICAgICAgcmV0VmFsID0gKHRBTklfVTgpIG1hY0hUQ2FwYWJpbGl0eUluZm8uc3RiY0NvbnRyb2xGcmFtZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlSFRfUFNNUDoKKyAgICAgIHJldFZhbCA9IHBNYWMtPmxpbS5nSFRQU01QU3VwcG9ydDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlSFRfRFNTU19DQ0tfTU9ERV80ME1IWjoKKyAgICAgIHJldFZhbCA9IHBNYWMtPmxpbS5nSFREc3NzQ2NrUmF0ZTQwTUh6U3VwcG9ydDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlSFRfTUFYX0FNU0RVX0xFTkdUSDoKKyAgICAgIHJldFZhbCA9ICh0QU5JX1U4KSBtYWNIVENhcGFiaWxpdHlJbmZvLm1heGltYWxBTVNEVXNpemU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX0RFTEFZRURfQkE6CisgICAgICByZXRWYWwgPSAodEFOSV9VOCkgbWFjSFRDYXBhYmlsaXR5SW5mby5kZWxheWVkQkE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX1JYX1NUQkM6CisgICAgICByZXRWYWwgPSAodEFOSV9VOCkgbWFjSFRDYXBhYmlsaXR5SW5mby5yeFNUQkM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX1RYX1NUQkM6CisgICAgICByZXRWYWwgPSAodEFOSV9VOCkgbWFjSFRDYXBhYmlsaXR5SW5mby50eFNUQkM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX1NIT1JUX0dJXzQwTUhaOgorICAgICAgcmV0VmFsID0gKHRBTklfVTgpIG1hY0hUQ2FwYWJpbGl0eUluZm8uc2hvcnRHSTQwTUh6OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVIVF9TSE9SVF9HSV8yME1IWjoKKyAgICAgIHJldFZhbCA9ICh0QU5JX1U4KSBtYWNIVENhcGFiaWxpdHlJbmZvLnNob3J0R0kyME1IejsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlSFRfR1JFRU5GSUVMRDoKKyAgICAgIHJldFZhbCA9ICh0QU5JX1U4KSBtYWNIVENhcGFiaWxpdHlJbmZvLmdyZWVuRmllbGQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX01JTU9fUE9XRVJfU0FWRToKKyAgICAgIHJldFZhbCA9ICh0QU5JX1U4KSBwTWFjLT5saW0uZ0hUTUlNT1BTU3RhdGU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVDoKKyAgICAgIHJldFZhbCA9ICh0QU5JX1U4KSBtYWNIVENhcGFiaWxpdHlJbmZvLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlSFRfQURWQU5DRURfQ09ESU5HOgorICAgICAgcmV0VmFsID0gKHRBTklfVTgpIG1hY0hUQ2FwYWJpbGl0eUluZm8uYWR2Q29kaW5nQ2FwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVIVF9NQVhfUlhfQU1QRFVfRkFDVE9SOgorICAgICAgcmV0VmFsID0gcE1hYy0+bGltLmdIVE1heFJ4QU1wZHVGYWN0b3I7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX01QRFVfREVOU0lUWToKKyAgICAgIHJldFZhbCA9IHBNYWMtPmxpbS5nSFRBTXBkdURlbnNpdHk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX1BDTzoKKyAgICAgIHJldFZhbCA9ICh0QU5JX1U4KSBtYWNFeHRIVENhcGFiaWxpdHlJbmZvLnBjbzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlSFRfVFJBTlNJVElPTl9USU1FOgorICAgICAgcmV0VmFsID0gKHRBTklfVTgpIG1hY0V4dEhUQ2FwYWJpbGl0eUluZm8udHJhbnNpdGlvblRpbWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX01DU19GRUVEQkFDSzoKKyAgICAgIHJldFZhbCA9ICh0QU5JX1U4KSBtYWNFeHRIVENhcGFiaWxpdHlJbmZvLm1jc0ZlZWRiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVIVF9UWF9CRUFNRk9STUlORzoKKyAgICAgIHJldFZhbCA9ICh0QU5JX1U4KSBtYWNUeEJGQ2FwYWJpbGl0eUluZm8udHhCRjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlSFRfQU5URU5OQV9TRUxFQ1RJT046CisgICAgICByZXRWYWwgPSAodEFOSV9VOCkgbWFjQVNDYXBhYmlsaXR5SW5mby5hbnRlbm5hU2VsZWN0aW9uOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVIVF9TSV9HUkFOVUxBUklUWToKKyAgICAgIHJldFZhbCA9IHBNYWMtPmxpbS5nSFRTZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlSFRfQ09OVFJPTExFRF9BQ0NFU1M6CisgICAgICByZXRWYWwgPSBwTWFjLT5saW0uZ0hUQ29udHJvbGxlZEFjY2Vzc09ubHk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX1JJRlNfTU9ERToKKyAgICAgIHJldFZhbCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX1JFQ09NTUVOREVEX1RYX1dJRFRIX1NFVDoKKyAgICAgIHJldFZhbCA9IHBNYWMtPmxpbS5nSFRSZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX0VYVEVOU0lPTl9DSEFOTkVMX09GRlNFVDoKKyAgICAgIHJldFZhbCA9IHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVIVF9PUF9NT0RFOgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICkKKyAgICAgICAgICByZXRWYWwgPSBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlOworICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgcmV0VmFsID0gcE1hYy0+bGltLmdIVE9wZXJNb2RlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVIVF9CQVNJQ19TVEJDX01DUzoKKyAgICAgIHJldFZhbCA9IHBNYWMtPmxpbS5nSFRTVEJDQmFzaWNNQ1M7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX0RVQUxfQ1RTX1BST1RFQ1RJT046CisgICAgICByZXRWYWwgPSBwTWFjLT5saW0uZ0hURHVhbENUU1Byb3RlY3Rpb247CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX0xTSUdfVFhPUF9QUk9URUNUSU9OX0ZVTExfU1VQUE9SVDoKKyAgICAgIHJldFZhbCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZUhUX1BDT19BQ1RJVkU6CisgICAgICByZXRWYWwgPSBwTWFjLT5saW0uZ0hUUENPQWN0aXZlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVIVF9QQ09fUEhBU0U6CisgICAgICByZXRWYWwgPSBwTWFjLT5saW0uZ0hUUENPUGhhc2U7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKKyNpZiAwCit2b2lkIGxpbVNldEJzc2lkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKmJzc0lkKQoreworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBNYWMtPmxpbS5nTGltQnNzaWQsIGJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgbGltR2V0QnNzaWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqYnNzSWQpCit7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgYnNzSWQsIHBNYWMtPmxpbS5nTGltQnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHJldHVybjsKK30KKworI2VuZGlmCit2b2lkIGxpbUdldE15TWFjQWRkcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICptYWMpCit7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgbWFjLCBwTWFjLT5saW0uZ0xpbU15TWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcmV0dXJuOworfQorCisKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbUVuYWJsZTExYVByb3RlY3Rpb24KK1xicmllZiBiYXNlZCBvbiBjb25maWcgc2V0dGluZyBlbmFibGVzXGRpc2FibGVzIDExYSBwcm90ZWN0aW9uLgorXHBhcmFtICAgICAgdEFOSV9VOCBlbmFibGUgOiAxPT4gZW5hYmxlIHByb3RlY3Rpb24sIDA9PiBkaXNhYmxlIHByb3RlY3Rpb24uCitccGFyYW0gICAgICB0QU5JX1U4IG92ZXJsYXA6IDE9PiBjYWxsZWQgZnJvbSBvdmVybGFwIGNvbnRleHQsIDAgPT4gY2FsbGVkIGZyb20gYXNzb2MgY29udGV4dC4KK1xwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gICAgICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFNpclJldFN0YXR1cworbGltRW5hYmxlMTFhUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGVuYWJsZSwKKyAgICB0QU5JX1U4IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworICAgICAgICAvL292ZXJsYXBwaW5nIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiBjaGVjay4KKyAgICAgICAgaWYob3ZlcmxhcCkKKyAgICAgICAgeworI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApIHx8IGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUF9TREspKQorICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSAmJiAhcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24ub3ZlcmxhcEZyb21sbGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIm92ZXJsYXAgcHJvdGVjdGlvbiBmcm9tIDExYSBpcyBkaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL25vcm1hbCBwcm90ZWN0aW9uIGNvbmZpZyBjaGVjaworICAgICAgICAgICAgaWYoIXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLmZyb21sbGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJwcm90ZWN0aW9uIGZyb20gMTFhIGlzIGRpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIGlmIChlbmFibGUpCisgICAgeworICAgICAgICAvL0lmIHdlIGFyZSBBUCBhbmQgSFQgY2FwYWJsZSwgd2UgbmVlZCB0byBzZXQgdGhlIEhUIE9QIG1vZGUKKyAgICAgICAgLy9hcHByb3ByaWF0ZWx5LgorICAgICAgICBpZigoKGVMSU1fQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKXx8KGVMSU1fQlRfQU1QX0FQX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkpJiYKKyAgICAgICAgICAgICAgKHRydWUgPT0gcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYob3ZlcmxhcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWFQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmKChlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgIT0gcE1hYy0+bGltLmdIVE9wZXJNb2RlKSAmJgorICAgICAgICAgICAgICAgICAgIChlU0lSX0hUX09QX01PREVfTUlYRUQgIT0gcE1hYy0+bGltLmdIVE9wZXJNb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOyAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRPQlNTUHJvdGVjdGlvbihwTWFjLCAgdHJ1ZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbTExYVBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9IHBNYWMtPmxpbS5nSFRPcGVyTW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9NSVhFRDsKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOyAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL1RoaXMgcGFydCBpcyBjb21tb24gZm9yIHN0YWl0b24gYXMgd2VsbC4KKyAgICAgICAgaWYoZmFsc2UgPT0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIiA9PiBwcm90ZWN0aW9uIGZyb20gMTFBIEVuYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5sbGFDb2V4aXN0ID0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3QgPSB0cnVlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxBQ09FWElTVF9DSEFOR0VEOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHRydWUgPT0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsYUNvZXhpc3QpCisgICAgeworICAgICAgICAvL2ZvciBBUCByb2xlLgorICAgICAgICAvL3dlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIEhUIE9QIG1vZGUgY2hhbmdlIGlmIG5lZWRlZC4KKyAgICAgICAgLy9XZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBPdmVybGFwIGNhc2VzLgorICAgICAgICBpZihlTElNX0FQX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYob3ZlcmxhcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL092ZXJsYXAgTGVnYWN5IHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1PdmVybGFwMTFhUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAvL1dlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIEhUIE9QIG1vZGUgaWZmIHdlIGFyZSBIVCBBUC4KKyAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIC8vIG5vIEhUIG9wIG1vZGUgY2hhbmdlIGlmIGFueSBvZiB0aGUgb3ZlcmxhcCBwcm90ZWN0aW9uIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIGlmKCEocE1hYy0+bGltLmdMaW1PdmVybGFwMTFhUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1PdmVybGFwSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSkKKworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGlmIHRoZXJlIGlzIGEgbmVlZCB0byBjaGFuZ2UgSFQgT1AgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSA9PSBwTWFjLT5saW0uZ0hUT3Blck1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+Z0xpbUh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfUFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0Rpc2FibGUgcHJvdGVjdGlvbiBmcm9tIDExQSBzdGF0aW9ucy4KKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltMTFhUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRPQlNTUHJvdGVjdGlvbihwTWFjLCAgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgICAgICAvL0NoZWNrIGlmIGFueSBvdGhlciBub24tSFQgcHJvdGVjdGlvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgIC8vUmlnaHQgbm93IHdlIGFyZSBpbiBIVCBPUCBNaXhlZCBtb2RlLgorICAgICAgICAgICAgICAgIC8vQ2hhbmdlIEhUIG9wIG1vZGUgYXBwcm9wcmlhdGVseS4KKworICAgICAgICAgICAgICAgIC8vQ2hhbmdlIEhUIE9QIG1vZGUgdG8gMDEgaWYgYW55IG92ZXJsYXAgcHJvdGVjdGlvbiBlbmFibGVkCisgICAgICAgICAgICAgICAgaWYocE1hYy0+bGltLmdMaW1PdmVybGFwMTFhUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1PdmVybGFwSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZOworICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHBzZXNzaW9uRW50cnktPmdMaW1IdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIGZhbHNlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIGZhbHNlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYoIXBNYWMtPmxpbS5nTGltT3ZlcmxhcDExYVBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCAmJgorICAgICAgICAgICAhcHNlc3Npb25FbnRyeS0+Z0xpbTExYVBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IFByb3RlY3Rpb24gZnJvbSAxMUEgRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+bGxhQ29leGlzdCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGFDb2V4aXN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxBQ09FWElTVF9DSEFOR0VEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vZm9yIHN0YXRpb24gcm9sZQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIj09PT4gUHJvdGVjdGlvbiBmcm9tIDExQSBEaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPmxsYUNvZXhpc3QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxhQ29leGlzdCA9IGZhbHNlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxBQ09FWElTVF9DSEFOR0VEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1FbmFibGUxMWdQcm90ZWN0aW9uCitcYnJpZWYgYmFzZWQgb24gY29uZmlnIHNldHRpbmcgZW5hYmxlc1xkaXNhYmxlcyAxMWcgcHJvdGVjdGlvbi4KK1xwYXJhbSAgICAgIHRBTklfVTggZW5hYmxlIDogMT0+IGVuYWJsZSBwcm90ZWN0aW9uLCAwPT4gZGlzYWJsZSBwcm90ZWN0aW9uLgorXHBhcmFtICAgICAgdEFOSV9VOCBvdmVybGFwOiAxPT4gY2FsbGVkIGZyb20gb3ZlcmxhcCBjb250ZXh0LCAwID0+IGNhbGxlZCBmcm9tIGFzc29jIGNvbnRleHQuCitccGFyYW0gICAgICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zCitccmV0dXJuICAgICAgTm9uZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cworbGltRW5hYmxlMTFnUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGVuYWJsZSwKKyAgICB0QU5JX1U4IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworICAgIC8vb3ZlcmxhcHBpbmcgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uIGNoZWNrLgorICAgIGlmKG92ZXJsYXApCisgICAgeworI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApIHx8IGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUF9TREspKQorICAgICAgICBpZigoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKSB8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUgKSkgICYmICFwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5vdmVybGFwRnJvbWxsYikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIm92ZXJsYXAgcHJvdGVjdGlvbiBmcm9tIDExYiBpcyBkaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL25vcm1hbCBwcm90ZWN0aW9uIGNvbmZpZyBjaGVjaworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgaWYoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICkgJiYKKyAgICAgICAgICAgICAgICAhcHNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5mcm9tbGxiKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBwcm90ZWN0aW9uIGRpc2FibGVkLgorICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgicHJvdGVjdGlvbiBmcm9tIDExYiBpcyBkaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgICAgIH1lbHNlIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgIT0gZUxJTV9BUF9ST0xFKQorI2VuZGlmCisgICAgICAgIHsgICAKKyAgICAgICAgICAgIGlmKCFwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5mcm9tbGxiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgicHJvdGVjdGlvbiBmcm9tIDExYiBpcyBkaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVuYWJsZSkKKyAgICB7CisgICAgICAgIC8vSWYgd2UgYXJlIEFQIGFuZCBIVCBjYXBhYmxlLCB3ZSBuZWVkIHRvIHNldCB0aGUgSFQgT1AgbW9kZQorICAgICAgICAvL2FwcHJvcHJpYXRlbHkuCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBpZihlTElNX0FQX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYob3ZlcmxhcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgicHJvdGVjdGlvbiBmcm9tIG9sYmMgaXMgZW5hYmxlZFxuIikpOykKKyAgICAgICAgICAgICAgICBpZih0cnVlID09IHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKChlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgIT0gcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9IHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vQ1ItMjYzMDIxOiBPQlNTIGJpdCBpcyBub3Qgc3dpdGNoaW5nIGJhY2sgdG8gMCBhZnRlciBkaXNhYmxpbmcgdGhlIG92ZXJsYXBwaW5nIGxlZ2FjeSBCU1MKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmaXhlcyBpc3N1ZSBvZiBPQlNTIGJpdCBub3Qgc2V0IGFmdGVyIDExYiwgMTFnIHN0YXRpb24gbGVhdmVzCisgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgdHJ1ZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgLy9Ob3QgcHJvY2Vzc2luZyBPQlNTIGJpdCBmcm9tIG90aGVyIEFQcywgYXMgd2UgYXJlIGFscmVhZHkgdGFraW5nIGNhcmUKKyAgICAgICAgICAgICAgICAgICAgLy9vZiBQcm90ZWN0aW9uIGZyb20gb3ZlcmxhcHBpbmcgQlNTIGJhc2VkIG9uIGVycCBJRSBvciB1c2VQcm90ZWN0aW9uIGJpdAorICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgicHJvdGVjdGlvbiBmcm9tIDExYiBpcyBlbmFibGVkXG4iKSk7KQorICAgICAgICAgICAgICAgIGlmKHRydWUgPT0gcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9IHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfTUlYRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIHRydWUsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOyAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlIGlmICgoZUxJTV9CVF9BTVBfQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKSAmJgorICAgICAgICAgICAgICAgICh0cnVlID09IHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSkpCisjZWxzZQorICAgICAgICAgICAgaWYoKChlTElNX0FQX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSl8fCAoZUxJTV9CVF9BTVBfQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHRydWUgPT0gcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KSkKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKG92ZXJsYXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmKChlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgIT0gcE1hYy0+bGltLmdIVE9wZXJNb2RlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlU0lSX0hUX09QX01PREVfTUlYRUQgIT0gcE1hYy0+bGltLmdIVE9wZXJNb2RlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vQ1ItMjYzMDIxOiBPQlNTIGJpdCBpcyBub3Qgc3dpdGNoaW5nIGJhY2sgdG8gMCBhZnRlciBkaXNhYmxpbmcgdGhlIG92ZXJsYXBwaW5nIGxlZ2FjeSBCU1MKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmaXhlcyBpc3N1ZSBvZiBPQlNTIGJpdCBub3Qgc2V0IGFmdGVyIDExYiwgMTFnIHN0YXRpb24gbGVhdmVzCisgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgdHJ1ZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgLy9Ob3QgcHJvY2Vzc2luZyBPQlNTIGJpdCBmcm9tIG90aGVyIEFQcywgYXMgd2UgYXJlIGFscmVhZHkgdGFraW5nIGNhcmUKKyAgICAgICAgICAgICAgICAgICAgLy9vZiBQcm90ZWN0aW9uIGZyb20gb3ZlcmxhcHBpbmcgQlNTIGJhc2VkIG9uIGVycCBJRSBvciB1c2VQcm90ZWN0aW9uIGJpdAorICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmKGVTSVJfSFRfT1BfTU9ERV9NSVhFRCAhPSBwTWFjLT5saW0uZ0hUT3Blck1vZGUpCisgICAgICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfTUlYRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIHRydWUsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOyAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy9UaGlzIHBhcnQgaXMgY29tbW9uIGZvciBzdGFpdG9uIGFzIHdlbGwuCisgICAgICAgIGlmKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0KQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PiAxMUcgUHJvdGVjdGlvbiBFbmFibGVkXG4iKSk7KQorICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+bGxiQ29leGlzdCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX2xsQkNPRVhJU1RfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0cnVlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0KQorICAgIHsKKyAgICAgICAgLy9mb3IgQVAgcm9sZS4KKyAgICAgICAgLy93ZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBIVCBPUCBtb2RlIGNoYW5nZSBpZiBuZWVkZWQuCisgICAgICAgIC8vV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgT3ZlcmxhcCBjYXNlcy4KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGlmKGVMSU1fQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKQorICAgICAgICB7CisgICAgICAgICAgICBpZihvdmVybGFwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vT3ZlcmxhcCBMZWdhY3kgcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy9XZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBIVCBPUCBtb2RlIGlmIHdlIGFyZSBIVCBBUC4KKyAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBIVCBvcCBtb2RlIGNoYW5nZSBpZiBhbnkgb2YgdGhlIG92ZXJsYXAgcHJvdGVjdGlvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICBpZighKHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9DaGVjayBpZiB0aGVyZSBpcyBhIG5lZWQgdG8gY2hhbmdlIEhUIE9QIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICBpZihlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgPT0gcE1hYy0+bGltLmdIVE9wZXJNb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRPQlNTUHJvdGVjdGlvbihwTWFjLCAgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+Z0xpbUh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NvbW1lbnRpbmcgb3V0IGJlYWN1c2Ugb2YgQ1IgMjU4NTg4IFdGQSBjZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfUFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9EaXNhYmxlIHByb3RlY3Rpb24gZnJvbSAxMUIgc3RhdGlvbnMuCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbTExYlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIj09PT4gMTFCIFByb3RlY3Rpb24gRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgYW55IG90aGVyIG5vbi1IVCBwcm90ZWN0aW9uIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgaWYoIXBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1JpZ2h0IG5vdyB3ZSBhcmUgaW4gSFQgT1AgTWl4ZWQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgLy9DaGFuZ2UgSFQgb3AgbW9kZSBhcHByb3ByaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICAvL0NoYW5nZSBIVCBPUCBtb2RlIHRvIDAxIGlmIGFueSBvdmVybGFwIHByb3RlY3Rpb24gZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXBOb25HZlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIj09PT4gMTFHIFByb3RlY3Rpb24gRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIHRydWUsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9Db21tZW50aW5nIGJlY2F1c2Ugb2YgQ1IgMjU4NTg4IFdGQSBjZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAvL3BzZXNzaW9uRW50cnktPmh0T3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUOworICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9QVVJFOworICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiPT09PiAxMUcgUHJvdGVjdGlvbiBEaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIGZhbHNlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIXBzZXNzaW9uRW50cnktPmdMaW1PbGJjUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkICYmCisgICAgICAgICAgICAgICAgICAgICFwc2Vzc2lvbkVudHJ5LT5nTGltMTFiUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIj09PT4gMTFHIFByb3RlY3Rpb24gRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+bGxiQ29leGlzdCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxCQ09FWElTVF9DSEFOR0VEOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZSBpZihlTElNX0JUX0FNUF9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisjZWxzZQorICAgICAgICAgICAgaWYoKGVMSU1fQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKXx8KChlTElNX0JUX0FNUF9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpKSkKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKG92ZXJsYXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL092ZXJsYXAgTGVnYWN5IHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU9sYmNQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICAvL1dlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIEhUIE9QIG1vZGUgaWZmIHdlIGFyZSBIVCBBUC4KKyAgICAgICAgICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBIVCBvcCBtb2RlIGNoYW5nZSBpZiBhbnkgb2YgdGhlIG92ZXJsYXAgcHJvdGVjdGlvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZWVkIHRvIGNoYW5nZSBIVCBPUCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSA9PSBwTWFjLT5saW0uZ0hUT3Blck1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIGZhbHNlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9QVVJFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0Rpc2FibGUgcHJvdGVjdGlvbiBmcm9tIDExQiBzdGF0aW9ucy4KKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltMTFiUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgYW55IG90aGVyIG5vbi1IVCBwcm90ZWN0aW9uIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgaWYoIXBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUmlnaHQgbm93IHdlIGFyZSBpbiBIVCBPUCBNaXhlZCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy9DaGFuZ2UgSFQgb3AgbW9kZSBhcHByb3ByaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRPQlNTUHJvdGVjdGlvbihwTWFjLCAgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hhbmdlIEhUIE9QIG1vZGUgdG8gMDEgaWYgYW55IG92ZXJsYXAgcHJvdGVjdGlvbiBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmdMaW1PbGJjUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltT3ZlcmxhcDExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgdHJ1ZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCAmJgorICAgICAgICAgICAgICAgICAgIXBzZXNzaW9uRW50cnktPmdMaW0xMWJQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IDExRyBQcm90ZWN0aW9uIERpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPmxsYkNvZXhpc3QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxiQ29leGlzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9sbEJDT0VYSVNUX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAvL2ZvciBzdGF0aW9uIHJvbGUKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IDExRyBQcm90ZWN0aW9uIERpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+bGxiQ29leGlzdCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGJDb2V4aXN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxCQ09FWElTVF9DSEFOR0VEOworICAgICAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorICAgIAorLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1FbmFibGVIdFByb3RlY3Rpb25Gcm9tMTFnCitcYnJpZWYgYmFzZWQgb24gY29maWcgZW5hYmxlc1xkaXNhYmxlcyBwcm90ZWN0aW9uIGZyb20gMTFnLgorXHBhcmFtICAgICAgdEFOSV9VOCBlbmFibGUgOiAxPT4gZW5hYmxlIHByb3RlY3Rpb24sIDA9PiBkaXNhYmxlIHByb3RlY3Rpb24uCitccGFyYW0gICAgICB0QU5JX1U4IG92ZXJsYXA6IDE9PiBjYWxsZWQgZnJvbSBvdmVybGFwIGNvbnRleHQsIDAgPT4gY2FsbGVkIGZyb20gYXNzb2MgY29udGV4dC4KK1xwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gICAgICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFNpclJldFN0YXR1cworbGltRW5hYmxlSHRQcm90ZWN0aW9uRnJvbTExZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGVuYWJsZSwKKyAgICB0QU5JX1U4IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICBpZighcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KQorICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOyAvLyBwcm90ZWN0aW9uIGZyb20gMTFnIGlzIG9ubHkgZm9yIEhUIHN0YXRpb25zLgorCisgICAgLy9vdmVybGFwcGluZyBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gY2hlY2suCisgICAgaWYob3ZlcmxhcCkKKyAgICB7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBpZigocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKSAmJiAoIXBzZXNzaW9uRW50cnktPmNmZ1Byb3RlY3Rpb24ub3ZlcmxhcEZyb21sbGcpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBwcm90ZWN0aW9uIGRpc2FibGVkLgorICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgib3ZlcmxhcCBwcm90ZWN0aW9uIGZyb20gMTFnIGlzIGRpc2FibGVkXG4iKSk7KTsKKyAgICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgICAgIH1lbHNlIGlmICgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKSAmJiAoIXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm92ZXJsYXBGcm9tbGxnKSkKKyNlbHNlCisgICAgICAgIGlmKCgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKSB8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpKSAmJiAoIXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm92ZXJsYXBGcm9tbGxnKSkKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICAvLyBwcm90ZWN0aW9uIGRpc2FibGVkLgorICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgib3ZlcmxhcCBwcm90ZWN0aW9uIGZyb20gMTFnIGlzIGRpc2FibGVkXG4iKSk7KTsKKyAgICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vbm9ybWFsIHByb3RlY3Rpb24gY29uZmlnIGNoZWNrCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgIGlmKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSApICYmIAorICAgICAgICAgICAhcHNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5mcm9tbGxnKXsKKyAgICAgICAgICAgIC8vIHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJwcm90ZWN0aW9uIGZyb20gMTFnIGlzIGRpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgIH1lbHNlIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgIT0gZUxJTV9BUF9ST0xFICkKKyNlbmRpZgorICAgICAgIHsKKyAgICAgICAgICBpZighcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24uZnJvbWxsZykKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgicHJvdGVjdGlvbiBmcm9tIDExZyBpcyBkaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgIH0KKyAgICBpZiAoZW5hYmxlKQorICAgIHsKKyAgICAgICAgLy9JZiB3ZSBhcmUgQVAgYW5kIEhUIGNhcGFibGUsIHdlIG5lZWQgdG8gc2V0IHRoZSBIVCBPUCBtb2RlCisgICAgICAgIC8vYXBwcm9wcmlhdGVseS4KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgaWYoZUxJTV9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG92ZXJsYXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vMTFnIGV4aXN0cyBpbiBvdmVybGFwIEJTUy4KKyAgICAgICAgICAgICAgICAvL25lZWQgbm90IHRvIGNoYW5nZSB0aGUgb3BlcmF0aW5nIG1vZGUgdG8gb3ZlcmxhcF9sZWdhY3kKKyAgICAgICAgICAgICAgICAvL2lmIGhpZ2hlciBvciBzYW1lIHByb3RlY3Rpb24gb3BlcmF0aW5nIG1vZGUgaXMgZW5hYmxlZCByaWdodCBub3cuCisgICAgICAgICAgICAgICAgaWYoKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSAhPSBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlKSAmJgorICAgICAgICAgICAgICAgICAgICAoZVNJUl9IVF9PUF9NT0RFX01JWEVEICE9IHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0T0JTU1Byb3RlY3Rpb24ocE1hYywgIHRydWUgLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLzExZyBpcyBhc3NvY2lhdGVkIHRvIGFuIEFQIG9wZXJhdGluZyBpbiAxMW4gbW9kZS4KKyAgICAgICAgICAgICAgICAvL0NoYW5nZSB0aGUgSFQgb3BlcmF0aW5nIG1vZGUgdG8gJ21peGVkIG1vZGUnLgorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmKGVTSVJfSFRfT1BfTU9ERV9NSVhFRCAhPSBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9NSVhFRDsKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICB0cnVlICwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2UgaWYoZUxJTV9CVF9BTVBfQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKQorI2Vsc2UKKyAgICAgICAgaWYoKGVMSU1fQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKXx8KGVMSU1fQlRfQU1QX0FQX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkpCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgaWYob3ZlcmxhcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vMTFnIGV4aXN0cyBpbiBvdmVybGFwIEJTUy4KKyAgICAgICAgICAgICAgICAvL25lZWQgbm90IHRvIGNoYW5nZSB0aGUgb3BlcmF0aW5nIG1vZGUgdG8gb3ZlcmxhcF9sZWdhY3kKKyAgICAgICAgICAgICAgICAvL2lmIGhpZ2hlciBvciBzYW1lIHByb3RlY3Rpb24gb3BlcmF0aW5nIG1vZGUgaXMgZW5hYmxlZCByaWdodCBub3cuCisgICAgICAgICAgICAgICAgaWYoKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSAhPSBwTWFjLT5saW0uZ0hUT3Blck1vZGUpICYmCisgICAgICAgICAgICAgICAgICAgIChlU0lSX0hUX09QX01PREVfTUlYRUQgIT0gcE1hYy0+bGltLmdIVE9wZXJNb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLzExZyBpcyBhc3NvY2lhdGVkIHRvIGFuIEFQIG9wZXJhdGluZyBpbiAxMW4gbW9kZS4KKyAgICAgICAgICAgICAgICAvL0NoYW5nZSB0aGUgSFQgb3BlcmF0aW5nIG1vZGUgdG8gJ21peGVkIG1vZGUnLgorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmKGVTSVJfSFRfT1BfTU9ERV9NSVhFRCAhPSBwTWFjLT5saW0uZ0hUT3Blck1vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfTUlYRUQ7CisgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgdHJ1ZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRPQlNTUHJvdGVjdGlvbihwTWFjLCAgdHJ1ZSAsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7ICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL1RoaXMgcGFydCBpcyBjb21tb24gZm9yIHN0YWl0b24gYXMgd2VsbC4KKyAgICAgICAgaWYoZmFsc2UgPT0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsZ0NvZXhpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPmxsZ0NvZXhpc3QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxnQ29leGlzdCA9IHRydWU7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9sbEdDT0VYSVNUX0NIQU5HRUQ7CisgICAgICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGVsc2UgaWYgKHRydWUgPT0gcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFzIG9wZXJhdGluZyBtb2RlIGNoYW5nZWQgYWZ0ZXIgRyBzdGF0aW9uIGFzc29jIHNvbWUgd2F5IHRvIHVwZGF0ZSBiZWFjb24KKyAgICAgICAgICAgIC8vIFRoaXMgYWRkcmVzc2VzIHRoZSBpc3N1ZSBvZiBtb2RlIG5vdCBjaGFuZ2luZyB0byAtIDExIGluIGJlYWNvbiB3aGVuIE9CU1Mgb3ZlcmxhcCBpcyBlbmFibGVkCisgICAgICAgICAgICAvL3BNYWMtPnNjaC5zY2hPYmplY3QuZkJlYWNvbkNoYW5nZWQgPSAxOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxHQ09FWElTVF9DSEFOR0VEOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZiAodHJ1ZSA9PSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxnQ29leGlzdCkKKyAgICB7CisgICAgICAgIC8vZm9yIEFQIHJvbGUuCisgICAgICAgIC8vd2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgSFQgT1AgbW9kZSBjaGFuZ2UgaWYgbmVlZGVkLgorICAgICAgICAvL1dlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIE92ZXJsYXAgY2FzZXMuCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGlmKGVMSU1fQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKQorICAgICAgICB7CisgICAgICAgICAgICBpZihvdmVybGFwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vT3ZlcmxhcCBMZWdhY3kgcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+Z0xpbTExZ1BhcmFtcy5udW1TdGEgPT0gMCkKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy8gbm8gSFQgb3AgbW9kZSBjaGFuZ2UgaWYgYW55IG9mIHRoZSBvdmVybGFwIHByb3RlY3Rpb24gZW5hYmxlZC4KKyAgICAgICAgICAgICAgICBpZighKHBzZXNzaW9uRW50cnktPmdMaW1PbGJjUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZWVkIHRvIGNoYW5nZSBIVCBPUCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBpZihlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgPT0gcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0T0JTU1Byb3RlY3Rpb24ocE1hYywgIGZhbHNlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Db21tZW50aW5nIGJlY2F1c2Ugb2YgQ1IgMjU4NTg4IFdGQSBjZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9QVVJFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vRGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFHIHN0YXRpb25zLgorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAvL0NoZWNrIGlmIGFueSBvdGhlciBub24tSFQgcHJvdGVjdGlvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgIGlmKCFwc2Vzc2lvbkVudHJ5LT5nTGltMTFiUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAvL1JpZ2h0IG5vdyB3ZSBhcmUgaW4gSFQgT1AgTWl4ZWQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgLy9DaGFuZ2UgSFQgb3AgbW9kZSBhcHByb3ByaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICAvL0NoYW5nZSBIVCBPUCBtb2RlIHRvIDAxIGlmIGFueSBvdmVybGFwIHByb3RlY3Rpb24gZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXBOb25HZlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZOworICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocHNlc3Npb25FbnRyeS0+Z0xpbUh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQ29tbWVudGluZyBiZWNhdXNlIG9mIENSIDI1ODU4OCBXRkEgY2VydAorICAgICAgICAgICAgICAgICAgICAgICAgLy9wc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfUFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIGZhbHNlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIXBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkICYmCisgICAgICAgICAgICAgICAgICAhcHNlc3Npb25FbnRyeS0+Z0xpbTExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IFByb3RlY3Rpb24gZnJvbSAxMUcgRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+bGxnQ29leGlzdCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxHQ09FWElTVF9DSEFOR0VEOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZSBpZihlTElNX0JUX0FNUF9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpCisjZWxzZQorICAgICAgICBpZigoZUxJTV9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpfHwoZUxJTV9CVF9BTVBfQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKSkKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBpZihvdmVybGFwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vT3ZlcmxhcCBMZWdhY3kgcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vIG5vIEhUIG9wIG1vZGUgY2hhbmdlIGlmIGFueSBvZiB0aGUgb3ZlcmxhcCBwcm90ZWN0aW9uIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgaWYoIShwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXBOb25HZlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGlmIHRoZXJlIGlzIGEgbmVlZCB0byBjaGFuZ2UgSFQgT1AgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgaWYoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZID09IHBNYWMtPmxpbS5nSFRPcGVyTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0T0JTU1Byb3RlY3Rpb24ocE1hYywgIGZhbHNlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9QVVJFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vRGlzYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFHIHN0YXRpb25zLgorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW0xMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAvL0NoZWNrIGlmIGFueSBvdGhlciBub24tSFQgcHJvdGVjdGlvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgIGlmKCFwc2Vzc2lvbkVudHJ5LT5nTGltMTFiUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAvL1JpZ2h0IG5vdyB3ZSBhcmUgaW4gSFQgT1AgTWl4ZWQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgLy9DaGFuZ2UgSFQgb3AgbW9kZSBhcHByb3ByaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICAvL0NoYW5nZSBIVCBPUCBtb2RlIHRvIDAxIGlmIGFueSBvdmVybGFwIHByb3RlY3Rpb24gZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1PdmVybGFwMTFnUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU92ZXJsYXBOb25HZlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1k7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIHRydWUsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfUFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighcE1hYy0+bGltLmdMaW1PdmVybGFwMTFnUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkICYmCisgICAgICAgICAgICAgICAgICAhcHNlc3Npb25FbnRyeS0+Z0xpbTExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IFByb3RlY3Rpb24gZnJvbSAxMUcgRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+bGxnQ29leGlzdCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbGdDb2V4aXN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxHQ09FWElTVF9DSEFOR0VEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vZm9yIHN0YXRpb24gcm9sZQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIj09PT4gUHJvdGVjdGlvbiBmcm9tIDExRyBEaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPmxsZ0NvZXhpc3QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxnQ29leGlzdCA9IGZhbHNlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fbGxHQ09FWElTVF9DSEFOR0VEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisvL0ZJWE1FX1BST1RFQ1RJT04gOiBuZWVkIHRvIGNoZWNrIGZvciBubyBBUFNEIHdoZW5ldmVyIHdlIHdhbnQgdG8gZW5hYmxlIHRoaXMgcHJvdGVjdGlvbi4KKy8vVGhpcyBjaGVjayB3aWxsIGJlIGRvbmUgYXQgdGhlIGNhbGxlci4KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1FbmFibGVIdE9ic3NQcm90ZWN0aW9uCitcYnJpZWYgYmFzZWQgb24gY29maWcgZW5hYmxlc1xkaXNhYmxlcyBvYnNzIHByb3RlY3Rpb24uCitccGFyYW0gICAgICB0QU5JX1U4IGVuYWJsZSA6IDE9PiBlbmFibGUgcHJvdGVjdGlvbiwgMD0+IGRpc2FibGUgcHJvdGVjdGlvbi4KK1xwYXJhbSAgICAgIHRBTklfVTggb3ZlcmxhcDogMT0+IGNhbGxlZCBmcm9tIG92ZXJsYXAgY29udGV4dCwgMCA9PiBjYWxsZWQgZnJvbSBhc3NvYyBjb250ZXh0LgorXHBhcmFtICAgICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcworXHJldHVybiAgICAgIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U2lyUmV0U3RhdHVzCitsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggZW5hYmxlLAorICAgIHRBTklfVTggb3ZlcmxhcCwgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCisKKyAgICBpZighcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KQorICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOyAvLyB0aGlzIHByb3RlY3Rpb24gIGlzIG9ubHkgZm9yIEhUIHN0YXRpb25zLgorCisgICAgLy9vdmVybGFwcGluZyBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gY2hlY2suCisgICAgaWYob3ZlcmxhcCkKKyAgICB7CisgICAgICAgIC8vb3ZlcmxhcHBpbmcgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uIGNoZWNrLgorICAgICNpZiAoZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSB8fCBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKyAgICAgICAgaWYoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKXx8KHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkpICYmICFwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5vdmVybGFwT0JTUykgCisgICAgICAgIHsgLy8gVG9EbyBVcGRhdGUgdGhpcyBmaWVsZAorICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIm92ZXJsYXAgcHJvdGVjdGlvbiBmcm9tIE9ic3MgaXMgZGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICB9CisgICAgI2VuZGlmCisgICAgfSAKKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgLy9ub3JtYWwgcHJvdGVjdGlvbiBjb25maWcgY2hlY2sKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGlmKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgJiYgIXBzZXNzaW9uRW50cnktPmNmZ1Byb3RlY3Rpb24ub2JzcykgCisgICAgICAgIHsgLy9Ub0RvIFVwZGF0ZSB0aGlzIGZpZWxkCisgICAgICAgICAgICAvLyBwcm90ZWN0aW9uIGRpc2FibGVkLgorICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgicHJvdGVjdGlvbiBmcm9tIE9ic3MgaXMgZGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICB9ZWxzZSBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBpZighcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24ub2JzcykgCisgICAgICAgICAgICB7IC8vVG9EbyBVcGRhdGUgdGhpcyBmaWVsZAorICAgICAgICAgICAgICAgIC8vIHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgicHJvdGVjdGlvbiBmcm9tIE9ic3MgaXMgZGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmIChlTElNX0FQX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSl7CisgICAgICAgIGlmICgoZW5hYmxlKSAmJiAoZmFsc2UgPT0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmdIVE9ic3NNb2RlKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIj0+b2JzcyBwcm90ZWN0aW9uIGVuYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZ0hUT2Jzc01vZGUgPSB0cnVlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fT0JTU19NT0RFX0NIQU5HRUQ7IC8vIFVQREFURSBBTiBFTlVNIEZPUiBPQlNTIE1PREUgPHRvZG8+CisgICAgICAgIAorICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiAoIWVuYWJsZSAmJiAodHJ1ZSA9PSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZ0hUT2Jzc01vZGUpKSAKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIj09PT4gb2JzcyBQcm90ZWN0aW9uIGRpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmdIVE9ic3NNb2RlID0gZmFsc2U7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9PQlNTX01PREVfQ0hBTkdFRDsKKworICAgICAgICAgfQorLy9DUi0yNjMwMjE6IE9CU1MgYml0IGlzIG5vdCBzd2l0Y2hpbmcgYmFjayB0byAwIGFmdGVyIGRpc2FibGluZyB0aGUgb3ZlcmxhcHBpbmcgbGVnYWN5IEJTUworICAgICAgICAgaWYgKCFlbmFibGUgJiYgIW92ZXJsYXApCisgICAgICAgICB7CisgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgaWYgKChlbmFibGUpICYmIChmYWxzZSA9PSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZ0hUT2Jzc01vZGUpICkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiPT5vYnNzIHByb3RlY3Rpb24gZW5hYmxlZFxuIikpOykKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5nSFRPYnNzTW9kZSA9IHRydWU7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9PQlNTX01PREVfQ0hBTkdFRDsgLy8gVVBEQVRFIEFOIEVOVU0gRk9SIE9CU1MgTU9ERSA8dG9kbz4KKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFlbmFibGUgJiYgKHRydWUgPT0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmdIVE9ic3NNb2RlKSkgCisgICAgICAgIHsKKworICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiPT09PiBvYnNzIFByb3RlY3Rpb24gZGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZ0hUT2Jzc01vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX09CU1NfTU9ERV9DSEFOR0VEOworCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltRW5hYmxlSFQyMFByb3RlY3Rpb24KK1xicmllZiBiYXNlZCBvbiBjb2ZpZyBlbmFibGVzXGRpc2FibGVzIHByb3RlY3Rpb24gZnJvbSBIdDIwLgorXHBhcmFtICAgICAgdEFOSV9VOCBlbmFibGUgOiAxPT4gZW5hYmxlIHByb3RlY3Rpb24sIDA9PiBkaXNhYmxlIHByb3RlY3Rpb24uCitccGFyYW0gICAgICB0QU5JX1U4IG92ZXJsYXA6IDE9PiBjYWxsZWQgZnJvbSBvdmVybGFwIGNvbnRleHQsIDAgPT4gY2FsbGVkIGZyb20gYXNzb2MgY29udGV4dC4KK1xwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gICAgICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFNpclJldFN0YXR1cworbGltRW5hYmxlSFQyMFByb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBlbmFibGUsCisgICAgdEFOSV9VOCBvdmVybGFwLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgaWYoIXBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSkKKyAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsgLy8gdGhpcyBwcm90ZWN0aW9uICBpcyBvbmx5IGZvciBIVCBzdGF0aW9ucy4KKworICAgICAgICAvL292ZXJsYXBwaW5nIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiBjaGVjay4KKyAgICAgICAgaWYob3ZlcmxhcCkKKyAgICAgICAgeworI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApIHx8IGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUF9TREspKQorICAgICAgICBpZigoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICl8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlUyA9PSBlTElNX0JUX0FNUF9BUF9ST0xFICkpJiYgIXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm92ZXJsYXBIdDIwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCJvdmVybGFwIHByb3RlY3Rpb24gZnJvbSBIVCAyMCBpcyBkaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL25vcm1hbCBwcm90ZWN0aW9uIGNvbmZpZyBjaGVjaworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgIGlmKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSApICYmCisgICAgICAgICAgICAgICAgIXBzZXNzaW9uRW50cnktPmNmZ1Byb3RlY3Rpb24uaHQyMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0aW9uIGRpc2FibGVkLgorICAgICAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoInByb3RlY3Rpb24gZnJvbSBIVDIwIGlzIGRpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgICAgICAgICB9ZWxzZSBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSApCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZighcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24uaHQyMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoInByb3RlY3Rpb24gZnJvbSBIVDIwIGlzIGRpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgaWYgKGVuYWJsZSkKKyAgICB7CisgICAgICAgIC8vSWYgd2UgYXJlIEFQIGFuZCBIVCBjYXBhYmxlLCB3ZSBuZWVkIHRvIHNldCB0aGUgSFQgT1AgbW9kZQorICAgICAgICAvL2FwcHJvcHJpYXRlbHkuCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGlmKGVMSU1fQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKXsKKyAgICAgICAgICAgIGlmKG92ZXJsYXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZigoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZICE9IHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUpICYmCisgICAgICAgICAgICAgICAgICAgIChlU0lSX0hUX09QX01PREVfTUlYRUQgIT0gcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZOworICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIHRydWUsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmKGVTSVJfSFRfT1BfTU9ERV9QVVJFID09IHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0NvbW1lbnRpbmcgYmVjYXVzZSBvZiBDUiAyNTg1ODggV0ZBIGNlcnQKKyAgICAgICAgICAgICAgICAgICAgLy9wc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9QVVJFOworICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHBNYWMsIGZhbHNlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlIGlmKGVMSU1fQlRfQU1QX0FQX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkKKyNlbHNlCisgICAgICAgIGlmKChlTElNX0FQX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSl8fChlTElNX0JUX0FNUF9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKG92ZXJsYXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1PdmVybGFwSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYoKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSAhPSBwTWFjLT5saW0uZ0hUT3Blck1vZGUpICYmCisgICAgICAgICAgICAgICAgICAgIChlU0lSX0hUX09QX01PREVfTUlYRUQgIT0gcE1hYy0+bGltLmdIVE9wZXJNb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWTsKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCB0cnVlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYoZVNJUl9IVF9PUF9NT0RFX1BVUkUgPT0gcE1hYy0+bGltLmdIVE9wZXJNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRPQlNTUHJvdGVjdGlvbihwTWFjLCAgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9UaGlzIHBhcnQgaXMgY29tbW9uIGZvciBzdGFpdG9uIGFzIHdlbGwuCisgICAgICAgIGlmKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiPT4gUHJ0ZWN0aW9uIGZyb20gSFQyMCBFbmFibGVkXG4iKSk7KQorICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+aHQyME1oekNvZXhpc3QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuaHQyMENvZXhpc3QgPSB0cnVlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fSFQyME1IWkNPRVhJU1RfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0cnVlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdCkKKyAgICB7CisgICAgICAgIC8vZm9yIEFQIHJvbGUuCisgICAgICAgIC8vd2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgSFQgT1AgbW9kZSBjaGFuZ2UgaWYgbmVlZGVkLgorICAgICAgICAvL1dlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIE92ZXJsYXAgY2FzZXMuCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBpZihlTElNX0FQX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSl7CisgICAgICAgICAgICBpZihvdmVybGFwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vT3ZlcmxhcCBMZWdhY3kgcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vIG5vIEhUIG9wIG1vZGUgY2hhbmdlIGlmIGFueSBvZiB0aGUgb3ZlcmxhcCBwcm90ZWN0aW9uIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgaWYoIShwc2Vzc2lvbkVudHJ5LT5nTGltT2xiY1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXBOb25HZlBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZWVkIHRvIGNoYW5nZSBIVCBPUCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBpZihlU0lSX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1kgPT0gcHNlc3Npb25FbnRyeS0+aHRPcGVyTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+Z0xpbUh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Db21tZW50ZWQgYmVhY3VzZSBvZiBDUiAyNTg1ODggZm9yIFdGQSBDZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9EaXNhYmxlIHByb3RlY3Rpb24gZnJvbSAxMUcgc3RhdGlvbnMuCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vQ2hhbmdlIEhUIG9wIG1vZGUgYXBwcm9wcmlhdGVseS4KKyAgICAgICAgICAgICAgICBpZihlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUID09IHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5odE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0T0JTU1Byb3RlY3Rpb24ocE1hYywgIGZhbHNlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOyAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiPT09PiBQcm90ZWN0aW9uIGZyb20gSFQgMjAgRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5odDIwTWh6Q29leGlzdCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdCA9IGZhbHNlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fSFQyME1IWkNPRVhJU1RfQ0hBTkdFRDsKKyAgICAgICAgfWVsc2UgaWYoZUxJTV9CVF9BTVBfQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKQorI2Vsc2UKKyAgICAgICAgaWYoKGVMSU1fQVBfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKXx8KGVMSU1fQlRfQU1QX0FQX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkpCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgaWYob3ZlcmxhcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL092ZXJsYXAgTGVnYWN5IHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1PdmVybGFwSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy8gbm8gSFQgb3AgbW9kZSBjaGFuZ2UgaWYgYW55IG9mIHRoZSBvdmVybGFwIHByb3RlY3Rpb24gZW5hYmxlZC4KKyAgICAgICAgICAgICAgICBpZighKHBzZXNzaW9uRW50cnktPmdMaW1PbGJjUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltT3ZlcmxhcDExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltT3ZlcmxhcE5vbkdmUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgLy9DaGVjayBpZiB0aGVyZSBpcyBhIG5lZWQgdG8gY2hhbmdlIEhUIE9QIG1vZGUuCisgICAgICAgICAgICAgICAgICAgIGlmKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSA9PSBwTWFjLT5saW0uZ0hUT3Blck1vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmdMaW1IdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9IGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbihwTWFjLCBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIdE9CU1NQcm90ZWN0aW9uKHBNYWMsICBmYWxzZSwgb3ZlcmxhcCwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0hUT3Blck1vZGUgPSBlU0lSX0hUX09QX01PREVfUFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0Rpc2FibGUgcHJvdGVjdGlvbiBmcm9tIDExRyBzdGF0aW9ucy4KKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy9DaGFuZ2UgSFQgb3AgbW9kZSBhcHByb3ByaWF0ZWx5LgorICAgICAgICAgICAgICAgIGlmKGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQgPT0gcE1hYy0+bGltLmdIVE9wZXJNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdIVE9wZXJNb2RlID0gZVNJUl9IVF9PUF9NT0RFX1BVUkU7CisgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0Umlmc1Byb3RlY3Rpb24ocE1hYywgZmFsc2UsIG92ZXJsYXAsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0T0JTU1Byb3RlY3Rpb24ocE1hYywgIGZhbHNlLCBvdmVybGFwLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOyAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiPT09PiBQcm90ZWN0aW9uIGZyb20gSFQgMjAgRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5odDIwTWh6Q29leGlzdCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5odDIwQ29leGlzdCA9IGZhbHNlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fSFQyME1IWkNPRVhJU1RfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgICAgICAvL2ZvciBzdGF0aW9uIHJvbGUKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IFByb3RlY3Rpb24gZnJvbSBIVDIwIERpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+aHQyME1oekNvZXhpc3QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuaHQyMENvZXhpc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX0hUMjBNSFpDT0VYSVNUX0NIQU5HRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbUVuYWJsZUhUTm9uR2ZQcm90ZWN0aW9uCitcYnJpZWYgYmFzZWQgb24gY29maWcgZW5hYmxlc1xkaXNhYmxlcyBwcm90ZWN0aW9uIGZyb20gTm9uR2YuCitccGFyYW0gICAgICB0QU5JX1U4IGVuYWJsZSA6IDE9PiBlbmFibGUgcHJvdGVjdGlvbiwgMD0+IGRpc2FibGUgcHJvdGVjdGlvbi4KK1xwYXJhbSAgICAgIHRBTklfVTggb3ZlcmxhcDogMT0+IGNhbGxlZCBmcm9tIG92ZXJsYXAgY29udGV4dCwgMCA9PiBjYWxsZWQgZnJvbSBhc3NvYyBjb250ZXh0LgorXHBhcmFtICAgICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcworXHJldHVybiAgICAgIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U2lyUmV0U3RhdHVzCitsaW1FbmFibGVIVE5vbkdmUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGVuYWJsZSwKKyAgICB0QU5JX1U4IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICBpZighcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KQorICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOyAvLyB0aGlzIHByb3RlY3Rpb24gIGlzIG9ubHkgZm9yIEhUIHN0YXRpb25zLgorCisgICAgICAgIC8vb3ZlcmxhcHBpbmcgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uIGNoZWNrLgorICAgICAgICBpZihvdmVybGFwKQorICAgICAgICB7CisjaWYgKGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUCkgfHwgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQX1NESykpCisgICAgICAgIGlmKCgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpfHwocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKSkgJiYgIXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm92ZXJsYXBOb25HZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0aW9uIGRpc2FibGVkLgorICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgib3ZlcmxhcCBwcm90ZWN0aW9uIGZyb20gTm9uR2YgaXMgZGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgIC8vbm9ybWFsIHByb3RlY3Rpb24gY29uZmlnIGNoZWNrCisgICAgICAgICAgICBpZigocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKSAmJgorICAgICAgICAgICAgICAgICFwc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLm5vbkdmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgicHJvdGVjdGlvbiBmcm9tIE5vbkdmIGlzIGRpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgICAgICAgICB9ZWxzZSBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vbm9ybWFsIHByb3RlY3Rpb24gY29uZmlnIGNoZWNrCisgICAgICAgICAgICAgICAgaWYoIXBNYWMtPmxpbS5jZmdQcm90ZWN0aW9uLm5vbkdmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgicHJvdGVjdGlvbiBmcm9tIE5vbkdmIGlzIGRpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpeworICAgICAgICBpZiAoKGVuYWJsZSkgJiYgKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCIgPT4gUHJ0ZWN0aW9uIGZyb20gbm9uIEdGIEVuYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX05PTl9HRl9ERVZJQ0VTX1BSRVNFTlRfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghZW5hYmxlICYmICh0cnVlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IFByb3RlY3Rpb24gZnJvbSBOb24gR0YgRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0ID0gZmFsc2U7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9OT05fR0ZfREVWSUNFU19QUkVTRU5UX0NIQU5HRUQ7CisgICAgICAgIH0KKyAgICB9ZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBpZiAoKGVuYWJsZSkgJiYgKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCIgPT4gUHJ0ZWN0aW9uIGZyb20gbm9uIEdGIEVuYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX05PTl9HRl9ERVZJQ0VTX1BSRVNFTlRfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghZW5hYmxlICYmICh0cnVlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5sbG5Ob25HRkNvZXhpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IFByb3RlY3Rpb24gZnJvbSBOb24gR0YgRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0ID0gZmFsc2U7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9OT05fR0ZfREVWSUNFU19QUkVTRU5UX0NIQU5HRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbUVuYWJsZUhUTHNpZ1R4b3BQcm90ZWN0aW9uCitcYnJpZWYgYmFzZWQgb24gY29maWcgZW5hYmxlc1xkaXNhYmxlcyBMc2lnVHhvcCBwcm90ZWN0aW9uLgorXHBhcmFtICAgICAgdEFOSV9VOCBlbmFibGUgOiAxPT4gZW5hYmxlIHByb3RlY3Rpb24sIDA9PiBkaXNhYmxlIHByb3RlY3Rpb24uCitccGFyYW0gICAgICB0QU5JX1U4IG92ZXJsYXA6IDE9PiBjYWxsZWQgZnJvbSBvdmVybGFwIGNvbnRleHQsIDAgPT4gY2FsbGVkIGZyb20gYXNzb2MgY29udGV4dC4KK1xwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gICAgICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFNpclJldFN0YXR1cworbGltRW5hYmxlSFRMc2lnVHhvcFByb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBlbmFibGUsCisgICAgdEFOSV9VOCBvdmVybGFwLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgaWYoIXBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSkKKyAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsgLy8gdGhpcyBwcm90ZWN0aW9uICBpcyBvbmx5IGZvciBIVCBzdGF0aW9ucy4KKworICAgICAgICAvL292ZXJsYXBwaW5nIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiBjaGVjay4KKyAgICAgICAgaWYob3ZlcmxhcCkKKyAgICAgICAgeworI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApIHx8IGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUF9TREspKQorICAgICAgICBpZigoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKXx8KHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkpICYmICFwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5vdmVybGFwTHNpZ1R4b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCIgb3ZlcmxhcCBwcm90ZWN0aW9uIGZyb20gTHNpZ1R4b3Agbm90IHN1cHBvcnRlZCBpcyBkaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgLy9ub3JtYWwgcHJvdGVjdGlvbiBjb25maWcgY2hlY2sKKyAgICAgICAgICAgIGlmKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSApICYmCisgICAgICAgICAgICAgICAhcHNlc3Npb25FbnRyeS0+Y2ZnUHJvdGVjdGlvbi5sc2lnVHhvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0aW9uIGRpc2FibGVkLgorICAgICAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIiBwcm90ZWN0aW9uIGZyb20gTHNpZ1R4b3Agbm90IHN1cHBvcnRlZCBpcyBkaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICAgICAgfWVsc2UgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX0FQX1JPTEUpCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL25vcm1hbCBwcm90ZWN0aW9uIGNvbmZpZyBjaGVjaworICAgICAgICAgICAgICAgIGlmKCFwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5sc2lnVHhvcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3Rpb24gZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIiBwcm90ZWN0aW9uIGZyb20gTHNpZ1R4b3Agbm90IHN1cHBvcnRlZCBpcyBkaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKXsKKyAgICAgICAgaWYgKChlbmFibGUpICYmIChmYWxzZSA9PSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiID0+IFBydGVjdGlvbiBmcm9tIExzaWdUeG9wIEVuYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX0xTSUdfVFhPUF9GVUxMX1NVUFBPUlRfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghZW5hYmxlICYmICh0cnVlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IFByb3RlY3Rpb24gZnJvbSBMc2lnVHhvcCBEaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydD0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9IGZhbHNlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fTFNJR19UWE9QX0ZVTExfU1VQUE9SVF9DSEFOR0VEOworICAgICAgICB9CisgICAgfWVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgaWYgKChlbmFibGUpICYmIChmYWxzZSA9PSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiID0+IFBydGVjdGlvbiBmcm9tIExzaWdUeG9wIEVuYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX0xTSUdfVFhPUF9GVUxMX1NVUFBPUlRfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghZW5hYmxlICYmICh0cnVlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IFByb3RlY3Rpb24gZnJvbSBMc2lnVHhvcCBEaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydD0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9IGZhbHNlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fTFNJR19UWE9QX0ZVTExfU1VQUE9SVF9DSEFOR0VEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisvL0ZJWE1FX1BST1RFQ1RJT04gOiBuZWVkIHRvIGNoZWNrIGZvciBubyBBUFNEIHdoZW5ldmVyIHdlIHdhbnQgdG8gZW5hYmxlIHRoaXMgcHJvdGVjdGlvbi4KKy8vVGhpcyBjaGVjayB3aWxsIGJlIGRvbmUgYXQgdGhlIGNhbGxlci4KKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbgorXGJyaWVmIGJhc2VkIG9uIGNvZmlnIGVuYWJsZXNcZGlzYWJsZXMgUmlmcyBwcm90ZWN0aW9uLgorXHBhcmFtICAgICAgdEFOSV9VOCBlbmFibGUgOiAxPT4gZW5hYmxlIHByb3RlY3Rpb24sIDA9PiBkaXNhYmxlIHByb3RlY3Rpb24uCitccGFyYW0gICAgICB0QU5JX1U4IG92ZXJsYXA6IDE9PiBjYWxsZWQgZnJvbSBvdmVybGFwIGNvbnRleHQsIDAgPT4gY2FsbGVkIGZyb20gYXNzb2MgY29udGV4dC4KK1xwYXJhbSAgICAgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMKK1xyZXR1cm4gICAgICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFNpclJldFN0YXR1cworbGltRW5hYmxlSHRSaWZzUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGVuYWJsZSwKKyAgICB0QU5JX1U4IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICBpZighcHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KQorICAgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOyAvLyB0aGlzIHByb3RlY3Rpb24gIGlzIG9ubHkgZm9yIEhUIHN0YXRpb25zLgorCisKKyAgICAgICAgLy9vdmVybGFwcGluZyBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gY2hlY2suCisgICAgICAgIGlmKG92ZXJsYXApCisgICAgICAgIHsKKyNpZiAoZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0FQKSB8fCBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLKSkKKyAgICAgICAgaWYoKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgfHwocHNlc3Npb25FbnRyeSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKSkmJiAhcE1hYy0+bGltLmNmZ1Byb3RlY3Rpb24ub3ZlcmxhcFJpZnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIiBvdmVybGFwIHByb3RlY3Rpb24gZnJvbSBSaWZzIGlzIGRpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgLy9ub3JtYWwgcHJvdGVjdGlvbiBjb25maWcgY2hlY2sKKyAgICAgICAgICAgIGlmKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgJiYKKyAgICAgICAgICAgICAgICFwc2Vzc2lvbkVudHJ5LT5jZmdQcm90ZWN0aW9uLnJpZnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICBQRUxPRzMobGltTG9nKHBNYWMsIExPRzMsIEZMKCIgcHJvdGVjdGlvbiBmcm9tIFJpZnMgaXMgZGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgICAgIH1lbHNlIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgIT0gZUxJTV9BUF9ST0xFICkKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9ub3JtYWwgcHJvdGVjdGlvbiBjb25maWcgY2hlY2sKKyAgICAgICAgICAgICAgIGlmKCFwTWFjLT5saW0uY2ZnUHJvdGVjdGlvbi5yaWZzKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIiBwcm90ZWN0aW9uIGZyb20gUmlmcyBpcyBkaXNhYmxlZFxuIikpOykKKyAgICAgICAgICAgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSl7CisgICAgICAgIC8vIERpc2FibGluZyB0aGUgUklGUyBQcm90ZWN0aW9uIG1lYW5zIEVuYWJsZSB0aGUgUklGUyBtb2RlIG9mIG9wZXJhdGlvbiBpbiB0aGUgQlNTCisgICAgICAgIGlmICgoIWVuYWJsZSkgJiYgKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGUpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCIgPT4gUmlmcyBwcm90ZWN0aW9uIERpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+ZlJJRlNNb2RlID0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZSSUZTTW9kZSA9IHRydWU7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9SSUZTX01PREVfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgICAgICAvLyBFbmFibGluZyB0aGUgUklGUyBQcm90ZWN0aW9uIG1lYW5zIERpc2FibGUgdGhlIFJJRlMgbW9kZSBvZiBvcGVyYXRpb24gaW4gdGhlIEJTUworICAgICAgICBlbHNlIGlmIChlbmFibGUgJiYgKHRydWUgPT0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZSSUZTTW9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIj09PT4gUmlmcyBQcm90ZWN0aW9uIEVuYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5mUklGU01vZGUgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlID0gZmFsc2U7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9SSUZTX01PREVfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgIH1lbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIC8vIERpc2FibGluZyB0aGUgUklGUyBQcm90ZWN0aW9uIG1lYW5zIEVuYWJsZSB0aGUgUklGUyBtb2RlIG9mIG9wZXJhdGlvbiBpbiB0aGUgQlNTCisgICAgICAgIGlmICgoIWVuYWJsZSkgJiYgKGZhbHNlID09IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGUpKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCIgPT4gUmlmcyBwcm90ZWN0aW9uIERpc2FibGVkXG4iKSk7KQorICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+ZlJJRlNNb2RlID0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZSSUZTTW9kZSA9IHRydWU7CisgICAgICAgICAgICBwQmVhY29uUGFyYW1zLT5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9SSUZTX01PREVfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgIC8vIEVuYWJsaW5nIHRoZSBSSUZTIFByb3RlY3Rpb24gbWVhbnMgRGlzYWJsZSB0aGUgUklGUyBtb2RlIG9mIG9wZXJhdGlvbiBpbiB0aGUgQlNTCisgICAgICAgIGVsc2UgaWYgKGVuYWJsZSAmJiAodHJ1ZSA9PSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlKSkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiPT09PiBSaWZzIFByb3RlY3Rpb24gRW5hYmxlZFxuIikpOykKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPmZSSUZTTW9kZSA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX1JJRlNfTU9ERV9DSEFOR0VEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBsaW1FbmFibGVTaG9ydFByZWFtYmxlCisgKgorICogRlVOQ1RJT046CisgKiBFbmFibGUvRGlzYWJsZSBzaG9ydCBwcmVhbWJsZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGVuYWJsZSAgICAgICAgRmxhZyB0byBlbmFibGUvZGlzYWJsZSBzaG9ydCBwcmVhbWJsZQorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cworbGltRW5hYmxlU2hvcnRQcmVhbWJsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGVuYWJsZSwgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UzMiB2YWw7CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19TSE9SVF9QUkVBTUJMRSwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLyogQ291bGQgbm90IGdldCBzaG9ydCBwcmVhbWJsZSBlbmFibGVkIGZsYWcgZnJvbSBDRkcuIExvZyBlcnJvci4gKi8KKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgc2hvcnQgcHJlYW1ibGUgZmxhZ1xuIikpOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGlmICghdmFsKSAgCisgICAgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR18xMUdfU0hPUlRfUFJFQU1CTEVfRU5BQkxFRCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgMTFHIHNob3J0IHByZWFtYmxlIHN3aXRjaGluZyAgZW5hYmxlZCBmbGFnXG4iKSk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKCF2YWwpICAgLy8gMTFHIHNob3J0IHByZWFtYmxlIHN3aXRjaGluZyBpcyBkaXNhYmxlZC4KKyAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworICAgIGlmICggcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKQorICAgIHsKKyAgICAgICAgaWYgKGVuYWJsZSAmJiAocHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZTaG9ydFByZWFtYmxlID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCI9PT0+IFNob3J0IFByZWFtYmxlIEVuYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGUgPSB0cnVlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+ZlNob3J0UHJlYW1ibGUgPSAodEFOSV9VOCkgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZTaG9ydFByZWFtYmxlOworICAgICAgICAgICAgcEJlYWNvblBhcmFtcy0+cGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fU0hPUlRfUFJFQU1CTEVfQ0hBTkdFRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghZW5hYmxlICYmIChwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGUgPT0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIj09PT4gU2hvcnQgUHJlYW1ibGUgRGlzYWJsZWRcbiIpKTspCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPmZTaG9ydFByZWFtYmxlID0gKHRBTklfVTgpIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mU2hvcnRQcmVhbWJsZTsKKyAgICAgICAgICAgIHBCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwIHw9IFBBUkFNX1NIT1JUX1BSRUFNQkxFX0NIQU5HRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworICAgICAgICB9CisKKy8qKgorICogbGltVHhDb21wbGV0ZQorICoKKyAqIEZ1bmN0aW9uOgorICogVGhpcyBpcyBMSU0ncyB2ZXJ5IG93biAiVFggTUdNVCBmcmFtZSBjb21wbGV0ZSIgY29tcGxldGlvbiByb3V0aW5lLgorICoKKyAqIExvZ2ljOgorICogTElNIHdhbnRzIHRvIHNlbmQgYSBNR01UIGZyYW1lIChicm9hZGNhc3Qgb3IgdW5pY2FzdCkKKyAqIExJTSBhbGxvY2F0ZXMgbWVtb3J5IHVzaW5nIHBhbFBrdEFsbG9jKCAuLi4sICoqcERhdGEsICoqcFBhY2tldCApCisgKiBMSU0gdHJhbnNtaXRzIHRoZSBNR01UIGZyYW1lIHVzaW5nIHRoZSBBUEk6CisgKiAgaGFsVHhGcmFtZSggLi4uIHBQYWNrZXQsIC4uLiwgKHZvaWQgKikgbGltVHhDb21wbGV0ZSwgcERhdGEgKQorICogSERELCB2aWEgaGFsVHhGcmFtZS9EWEUsICJ0cmFuc2ZlcnMiIHRoZSBwYWNrZXQgb3ZlciB0byBCTVUKKyAqIEhERCwgaWYgaXQgZGV0ZXJtaW5lcyB0aGF0IGEgVFggY29tcGxldGlvbiByb3V0aW5lIChpbiB0aGlzIGNhc2UKKyAqIGxpbVR4Q29tcGxldGUpIGhhcyBiZWVuIHByb3ZpZGVkLCB3aWxsIGludm9rZSB0aGlzIGNhbGxiYWNrCisgKiBMSU0gd2lsbCB0cnkgdG8gZnJlZSB0aGUgVFggTUdNVCBwYWNrZXQgdGhhdCB3YXMgZWFybGllciBhbGxvY2F0ZWQsIGluIG9yZGVyCisgKiB0byBzZW5kIHRoaXMgTUdNVCBmcmFtZSwgdXNpbmcgdGhlIFBBTCBBUEkgcGFsUGt0RnJlZSggLi4uIHBEYXRhLCBwUGFja2V0ICkKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqIFByZXNlbnRseSwgdGhpcyBpcyBPTkxZIGJlaW5nIHVzZWQgZm9yIE1HTVQgZnJhbWVzL3BhY2tldHMKKyAqIFRPRE86CisgKiBXb3VsZCBpdCBkbyBnb29kIGZvciBMSU0gdG8gaGF2ZSBzb21lIHNvcnQgb2YgInNpZ25hdHVyZSIgdmFsaWRhdGlvbiB0bworICogZW5zdXJlIHRoYXQgdGhlIHBEYXRhIGFyZ3VtZW50IHBhc3NlZCBpbiB3YXMgYSBidWZmZXIgdGhhdCB3YXMgYWN0dWFsbHkKKyAqIGFsbG9jYXRlZCBieSBMSU0gYW5kL29yIGlzIG5vdCBjb3JydXB0ZWQ/CisgKgorICogTm90ZTogRklYTUUgYW5kIFRPRE8KKyAqIExvb2tzIGxpa2UgcGFsUGt0RnJlZSgpIGlzIGludGVyZXN0ZWQgaW4gcFBhY2tldC4gQnV0LCB3aGVuIHRoaXMgY29tcGxldGlvbgorICogcm91dGluZSBpcyBjYWxsZWQsIG9ubHkgcERhdGEgaXMgbWFkZSBhdmFpbGFibGUgdG8gTElNISEKKyAqCisgKiBAcGFyYW0gdm9pZCBBIHBvaW50ZXIgdG8gcERhdGEuIFNob3VsZG4ndCBpdCBiZSBwUGFja2V0PyEKKyAqCisgKiBAcmV0dXJuIG5vbmUKKyAqLwordm9pZCBsaW1UeENvbXBsZXRlKCB0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnBEYXRhICkKK3sKKyAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKKyAgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCloSGFsOworCisjaWZkZWYgRklYTUVfUFJJTUEKKyAgLyogdGhlIHRyYWNlIGxvZ2ljIG5lZWRzIHRvIGJlIGZpeGVkIGZvciBQcmltYS4gIFJlZmVyIHRvIENSIDMwNjA3NSAqLworI2lmZGVmIFRSQUNFX1JFQ09SRAorICAgIHsKKyAgICAgICAgdHBTaXJNYWNNZ210SGRyIG1IZHI7CisgICAgICAgIHZfVThfdCAgICAgICAgICpwUnhCZDsKKyAgICAgICAgdm9zX3BrdF90ICAgICAgKnBWb3NQa3Q7CisgICAgICAgIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXM7CisKKworCisgICAgICAgIHBWb3NQa3QgPSAodm9zX3BrdF90ICopcERhdGE7CisgICAgICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCBwVm9zUGt0LCAwLCAodl9QVk9JRF90ICopJnBSeEJkLCBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFKTsKKworICAgICAgICBpZihWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhCZCk7CisgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9UWF9DT01QTEVURSwgMCwgbUhkci0+ZmMuc3ViVHlwZSk7KQorCisgICAgICAgIH0gICAKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisgIHBhbFBrdEZyZWUoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgKHZvaWQgKikgTlVMTCwgICAgICAgICAgIC8vIHRoaXMgaXMgaWdub3JlZCBhbmQgd2lsbCBsaWtlbHkgYmUgcmVtb3ZlZCBmcm9tIHRoaXMgQVBJCisgICAgICAgICAgICAgICh2b2lkICopIHBEYXRhICk7ICAgICAgICAvLyBsaW0gcGFzc2VkIGluIHBQYWNrZXQgaW4gdGhlIHBEYXRhIHBvaW50ZXIgdGhhdCBpcyBnaXZlbiBpbiB0aGlzIGNvbXBsZXRpb24gcm91dGluZQorfQorCisvKioKKyAqIFxicmllZiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgbGltIGdsb2JhbCBzdHJ1Y3R1cmUsIGlmIENCIHBhcmFtZXRlcnMgaW4gdGhlIEJTUworICogIGhhdmUgY2hhbmdlZCwgYW5kIHNlbmRzIGFuIGluZGljYXRpb24gdG8gSEFMIGFsc28gd2l0aCB0aGUKKyAqIHVwZGF0ZWQgSFQgUGFyYW1ldGVycy4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZGV0ZWN0IHRoZSBjaGFuZ2UgaW4gdGhlIHByaW1hcnkgY2hhbm5lbCwgdGhhdCBpcyBkb25lIGFzIHBhcnQKKyAqIG9mIGNoYW5uZWwgU3d0aWNoIElFIHByb2Nlc3NpbmcuCisgKiBJZiBTVEEgaXMgY29uZmlndXJlZCB3aXRoICcyME1oeiBvbmx5JyBtb2RlLCB0aGVuIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZG8gYW55dGhpbmcKKyAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgQ0IgbW9kZSwgb25seSBpZiB0aGUgc2VsZiBjYXBhYmlsaXR5IGlzIHNldCB0byAnMjAgYXMgd2VsbCBhcyA0ME1oeicKKyAqCisgKgorICogXHBhcmFtIHBNYWMgUG9pbnRlciB0byBnbG9iYWwgTUFDIHN0cnVjdHVyZQorICoKKyAqIFxwYXJhbSBwUmN2ZEhUSW5mbyBQb2ludGVyIHRvIEhUIEluZm8gSUUgb2J0YWluZWQgZnJvbSBhICBCZWFjb24gb3IKKyAqIFByb2JlIFJlc3BvbnNlCisgKgorICogXHBhcmFtIGJzc0lkeCBCU1MgSW5kZXggb2YgdGhlIEJzcyB0byB3aGljaCBTdGF0aW9uIGlzIGFzc29jaWF0ZWQuCisgKgorICoKKyAqLworCit2b2lkIGxpbVVwZGF0ZVN0YVJ1blRpbWVIVFN3aXRjaENobmxQYXJhbXMoIHRwQW5pU2lyR2xvYmFsICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVIVEluZm8gKnBIVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgICAgICAgICBic3NJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gICAgICBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgc2Vjb25kYXJ5Q2hubE9mZnNldCA9IGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfTk9ORTsKKyNpZiAhZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJICAKKyAgICB0QU5JX1UzMiBsb2NhbFB3ckNvbnN0cmFpbnQ7CisjZW5kaWYKKyAgICAKKyAgIC8vSWYgc2VsZiBjYXBhYmlsaXR5IGlzIHNldCB0byAnMjBNaHogb25seScsIHRoZW4gZG8gbm90IGNoYW5nZSB0aGUgQ0IgbW9kZS4KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICBpZiggIWxpbUdldEhUQ2FwYWJpbGl0eSggcE1hYywgZUhUX1NVUFBPUlRFRF9DSEFOTkVMX1dJRFRIX1NFVCwgcHNlc3Npb25FbnRyeSApKQorI2Vsc2UKKyAgIGlmKCAhbGltR2V0SFRDYXBhYmlsaXR5KCBwTWFjLCBlSFRfU1VQUE9SVEVEX0NIQU5ORUxfV0lEVEhfU0VUICkpCisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworCisjaWYgIWRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSSAgCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19MT0NBTF9QT1dFUl9DT05TVFJBSU5ULCAmbG9jYWxQd3JDb25zdHJhaW50KSAhPSBlU0lSX1NVQ0NFU1MpIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCggIlVuYWJsZSB0byBnZXQgTG9jYWwgUG93ZXIgQ29uc3RyYWludCBmcm9tIGNmZ1xuIiApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBwTWFjLT5saW0uZ0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAhPSAoIHRBTklfVTggKSBwSFRJbmZvLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0IHx8CisgICAgICAgICBwTWFjLT5saW0uZ0hUUmVjb21tZW5kZWRUeFdpZHRoU2V0ICAhPSAoIHRBTklfVTggKSBwSFRJbmZvLT5yZWNvbW1lbmRlZFR4V2lkdGhTZXQgKQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSAoIHRTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgKSBwSFRJbmZvLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworICAgICAgICBwTWFjLT5saW0uZ0hUUmVjb21tZW5kZWRUeFdpZHRoU2V0ICA9ICggdEFOSV9VOCApIHBIVEluZm8tPnJlY29tbWVuZGVkVHhXaWR0aFNldDsKKyAgICAgICAgLy9BbHNvIHVwZGF0ZSB0aGUgUHJvcHJpZXRhcnkoVGl0YW4pIENCIG1vZGUgc2V0dGluZ3MsIGFzIHRoaXMgc2V0dGluZyBpcyB1c2VkIGR1cmluZyAKKyAgICAgICAgLy9iYWNrZ3JvdW5kIHNjYW5uaW5nIHRvIHNldCB0aGUgb3JpZ2luYWwgY2hhbm5lbCBhbmQgQ0IgbW9kZSBhcyBwYXJ0IG9mIGZpbmlzaCBzY2FuLgorICAgICAgICBzZXR1cENCU3RhdGUoIHBNYWMsICBsaW1HZXRBbmlDQlN0YXRlKHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0KSk7CisKKyAgICAgICAgLy8gSWYgdGhlIENoYW5uZWwgV2lkdGggaXMgMjBNaHosIHNldCB0aGUgY2hhbm5lbCBvZmZzZXQgdG8KKyAgICAgICAgLy8gTk9ORS4gIElmIHRoZSBDaGFubmVsIFdpZHRoIGlzIDQwTWh6LCBzZXQgdGhlIGNoYW5uZWwgb2Zmc2V0CisgICAgICAgIC8vIHRvIHdoYXQgZXZlciBpcyBwcmVzZW50IGluIGJlYWNvbi4KKyAgICAgICAgaWYgKCBlSFRfQ0hBTk5FTF9XSURUSF80ME1IWiA9PSBwTWFjLT5saW0uZ0hUUmVjb21tZW5kZWRUeFdpZHRoU2V0ICkKKyAgICAgICAgICAgIHNlY29uZGFyeUNobmxPZmZzZXQgPSAodFNpck1hY0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldClwSFRJbmZvLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworCisgICAgICAgIC8vIE5vdGlmeSBIQUwKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCAgRkwoICJDaGFubmVsIEluZm9ybWF0aW9uIGluIEhUIElFIGNoYW5nZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkOyBzZW5kaW5nIG5vdGlmaWNhdGlvbiB0byBIQUwuXG4iICkgKTsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCAgRkwoICJQcmltYXJ5IENoYW5uZWw6ICVkLCBTZWNvbmRhcnkgQ2hhbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWwgT2Zmc2V0OiAlZCwgQ2hhbm5lbCBXaWR0aDogJWRcbiIgKSwKKyAgICAgICAgICAgICAgICBwSFRJbmZvLT5wcmltYXJ5Q2hhbm5lbCwgc2Vjb25kYXJ5Q2hubE9mZnNldCwKKyAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0hUUmVjb21tZW5kZWRUeFdpZHRoU2V0ICk7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkgIAorICAgICAgICBsaW1TZW5kU3dpdGNoQ2hubFBhcmFtcyggcE1hYywgKCB0QU5JX1U4ICkgcEhUSW5mby0+cHJpbWFyeUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlDaG5sT2Zmc2V0LCBwc2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyLCBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCk7CisjZWxzZQorICAgICAgICBsaW1TZW5kU3dpdGNoQ2hubFBhcmFtcyggcE1hYywgKCB0QU5JX1U4ICkgcEhUSW5mby0+cHJpbWFyeUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlDaG5sT2Zmc2V0LCAodFBvd2VyZEJtKWxvY2FsUHdyQ29uc3RyYWludCwgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQpOworI2VuZGlmCisKKyAgICAgICAgLy9JbiBjYXNlIG9mIElCU1MsIGlmIFNUQSBzaG91bGQgdXBkYXRlIEhUIEluZm8gSUUgaW4gaXRzIGJlYWNvbnMuCisgICAgICAgaWYgKGVMSU1fU1RBX0lOX0lCU1NfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKQorICAgICAgICB7CisgICAgICAgICAgICBzY2hTZXRGaXhlZEJlYWNvbkZpZWxkcyhwTWFjLHBzZXNzaW9uRW50cnkpOworICAgICAgICB9CisKKyAgICB9Cit9IC8vIEVuZCBsaW1VcGRhdGVTdGFSdW5UaW1lSFRQYXJhbXMuCisKKy8qKgorICogXGJyaWVmIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbGltIGdsb2JhbCBzdHJ1Y3R1cmUsIGlmIGFueSBvZiB0aGUKKyAqIEhUIENhcGFiaWxpdGllcyBoYXZlIGNoYW5nZWQuCisgKgorICoKKyAqIFxwYXJhbSBwTWFjIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcEhUQ2FwYWJpbGl0eSBQb2ludGVyIHRvIEhUIENhcGFiaWxpdHkgSW5mb3JtYXRpb24gRWxlbWVudAorICogb2J0YWluZWQgZnJvbSBhIEJlYWNvbiBvciBQcm9iZSBSZXNwb25zZQorICoKKyAqCisgKgorICovCisKK3ZvaWQgbGltVXBkYXRlU3RhUnVuVGltZUhUQ2FwYWJpbGl0eSggdHBBbmlTaXJHbG9iYWwgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVIVENhcHMgKnBIVENhcHMgKQoreworCisgICAgaWYgKCBwTWFjLT5saW0uZ0hUTHNpZ1RYT1BQcm90ZWN0aW9uICE9ICggdEFOSV9VOCApIHBIVENhcHMtPmxzaWdUWE9QUHJvdGVjdGlvbiApCisgICAgeworICAgICAgICBwTWFjLT5saW0uZ0hUTHNpZ1RYT1BQcm90ZWN0aW9uID0gKCB0QU5JX1U4ICkgcEhUQ2Fwcy0+bHNpZ1RYT1BQcm90ZWN0aW9uOworICAgICAgIC8vIFNlbmQgY2hhbmdlIG5vdGlmaWNhdGlvbiB0byBIQUwKKyAgICB9CisKKyAgICBpZiAoIHBNYWMtPmxpbS5nSFRBTXBkdURlbnNpdHkgIT0gKCB0QU5JX1U4ICkgcEhUQ2Fwcy0+bXBkdURlbnNpdHkgKQorICAgIHsKKyAgICAgICBwTWFjLT5saW0uZ0hUQU1wZHVEZW5zaXR5ID0gKCB0QU5JX1U4ICkgcEhUQ2Fwcy0+bXBkdURlbnNpdHk7CisgICAgICAgLy8gU2VuZCBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRvIEhBTAorICAgIH0KKworICAgIGlmICggcE1hYy0+bGltLmdIVE1heFJ4QU1wZHVGYWN0b3IgIT0gKCB0QU5JX1U4ICkgcEhUQ2Fwcy0+bWF4UnhBTVBEVUZhY3RvciApCisgICAgeworICAgICAgIHBNYWMtPmxpbS5nSFRNYXhSeEFNcGR1RmFjdG9yID0gKCB0QU5JX1U4ICkgcEhUQ2Fwcy0+bWF4UnhBTVBEVUZhY3RvcjsKKyAgICAgICAvLyBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMCisgICAgfQorCisKK30gLy8gRW5kIGxpbVVwZGF0ZVN0YVJ1blRpbWVIVENhcGFiaWxpdHkuCisKKy8qKgorICogXGJyaWVmIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBsaW0gZ2xvYmFsIHN0cnVjdHVyZSwgaWYgYW55IG9mIHRoZSBIVAorICogSW5mbyBQYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZC4KKyAqCisgKgorICogXHBhcmFtIHBNYWMgUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gcEhUSW5mbyBQb2ludGVyIHRvIHRoZSBIVCBJbmZvIElFIG9idGFpbmVkIGZyb20gYSBCZWFjb24gb3IKKyAqIFByb2JlIFJlc3BvbnNlCisgKgorICoKKyAqLworCit2b2lkIGxpbVVwZGF0ZVN0YVJ1blRpbWVIVEluZm8oIHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVIVEluZm8gKnBIVEluZm8gLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIGlmICggcE1hYy0+bGltLmdIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgIT0gKCB0QU5JX1U4KXBIVEluZm8tPnNlY29uZGFyeUNoYW5uZWxPZmZzZXQpCisgICAgeworICAgICAgICBwTWFjLT5saW0uZ0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9ICggdFNpck1hY0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCApcEhUSW5mby0+c2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKyAgICAgICAgLy8gU2VuZCBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRvIEhBTAorICAgIH0KKworICAgIGlmICggcE1hYy0+bGltLmdIVFJlY29tbWVuZGVkVHhXaWR0aFNldCAhPSAoIHRBTklfVTggKXBIVEluZm8tPnJlY29tbWVuZGVkVHhXaWR0aFNldCApCisgICAgeworICAgICAgICBwTWFjLT5saW0uZ0hUUmVjb21tZW5kZWRUeFdpZHRoU2V0ID0gKCB0QU5JX1U4IClwSFRJbmZvLT5yZWNvbW1lbmRlZFR4V2lkdGhTZXQ7CisgICAgICAgIC8vIFNlbmQgY2hhbmdlIG5vdGlmaWNhdGlvbiB0byBIQUwKKyAgICB9CisKKyAgICBpZiAoIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGUgIT0gKCB0QU5JX1U4IClwSFRJbmZvLT5yaWZzTW9kZSApCisgICAgeworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlJJRlNNb2RlID0gKCB0QU5JX1U4IClwSFRJbmZvLT5yaWZzTW9kZTsKKyAgICAgICAgLy8gU2VuZCBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRvIEhBTAorICAgIH0KKworICAgIGlmICggcE1hYy0+bGltLmdIVFNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ICE9ICggdEFOSV9VOCApcEhUSW5mby0+c2VydmljZUludGVydmFsR3JhbnVsYXJpdHkgKQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdIVFNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ID0gKCB0QU5JX1U4IClwSFRJbmZvLT5zZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eTsKKyAgICAgICAgLy8gU2VuZCBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRvIEhBTAorICAgIH0KKworICAgIGlmICggcE1hYy0+bGltLmdIVE9wZXJNb2RlICE9ICggdFNpck1hY0hUT3BlcmF0aW5nTW9kZSApcEhUSW5mby0+b3BNb2RlICkKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5nSFRPcGVyTW9kZSA9ICggdFNpck1hY0hUT3BlcmF0aW5nTW9kZSApcEhUSW5mby0+b3BNb2RlOworICAgICAgICAvLyBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMCisgICAgfQorCisgICAgaWYgKCBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0ICE9IHBIVEluZm8tPm5vbkdGRGV2aWNlc1ByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmxsbk5vbkdGQ29leGlzdCA9ICggdEFOSV9VOCApcEhUSW5mby0+bm9uR0ZEZXZpY2VzUHJlc2VudDsKKyAgICB9CisKKyAgICBpZiAoIHBNYWMtPmxpbS5nSFRTVEJDQmFzaWNNQ1MgIT0gKCB0QU5JX1U4IClwSFRJbmZvLT5iYXNpY1NUQkNNQ1MgKQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdIVFNUQkNCYXNpY01DUyA9ICggdEFOSV9VOCApcEhUSW5mby0+YmFzaWNTVEJDTUNTOworICAgICAgICAvLyBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMCisgICAgfQorCisgICAgaWYgKCBwTWFjLT5saW0uZ0hURHVhbENUU1Byb3RlY3Rpb24gIT0gKCB0QU5JX1U4IClwSFRJbmZvLT5kdWFsQ1RTUHJvdGVjdGlvbiApCisgICAgeworICAgICAgICBwTWFjLT5saW0uZ0hURHVhbENUU1Byb3RlY3Rpb24gPSAoIHRBTklfVTggKXBIVEluZm8tPmR1YWxDVFNQcm90ZWN0aW9uOworICAgICAgICAvLyBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMCisgICAgfQorCisgICAgaWYgKCBwTWFjLT5saW0uZ0hUU2Vjb25kYXJ5QmVhY29uICE9ICggdEFOSV9VOCApcEhUSW5mby0+c2Vjb25kYXJ5QmVhY29uICkKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlCZWFjb24gPSAoIHRBTklfVTggKXBIVEluZm8tPnNlY29uZGFyeUJlYWNvbjsKKyAgICAgICAgLy8gU2VuZCBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRvIEhBTAorICAgIH0KKworICAgIGlmICggcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCAhPSAoIHRBTklfVTggKXBIVEluZm8tPmxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ICkKKyAgICB7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSAoIHRBTklfVTggKXBIVEluZm8tPmxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OworICAgICAgICAvLyBTZW5kIGNoYW5nZSBub3RpZmljYXRpb24gdG8gSEFMCisgICAgfQorCisgICAgaWYgKCBwTWFjLT5saW0uZ0hUUENPQWN0aXZlICE9ICggdEFOSV9VOCApcEhUSW5mby0+cGNvQWN0aXZlICkKKyAgICB7CisgICAgICAgIHBNYWMtPmxpbS5nSFRQQ09BY3RpdmUgPSAoIHRBTklfVTggKXBIVEluZm8tPnBjb0FjdGl2ZTsKKyAgICAgICAgLy8gU2VuZCBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRvIEhBTAorICAgIH0KKworICAgIGlmICggcE1hYy0+bGltLmdIVFBDT1BoYXNlICE9ICggdEFOSV9VOCApcEhUSW5mby0+cGNvUGhhc2UgKQorICAgIHsKKyAgICAgICAgcE1hYy0+bGltLmdIVFBDT1BoYXNlID0gKCB0QU5JX1U4IClwSFRJbmZvLT5wY29QaGFzZTsKKyAgICAgICAgLy8gU2VuZCBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRvIEhBTAorICAgIH0KKworfSAvLyBFbmQgbGltVXBkYXRlU3RhUnVuVGltZUhUSW5mby4KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVByb2Nlc3NIYWxJbmRNZXNzYWdlcworXGJyaWVmIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBIQUwgaW5kaWNhdGlvbgorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworXHBhcmFtICAgIHRBTklfVTMyIG1lc2dJZAorXHBhcmFtICAgIHZvaWQgKm1lc2dQYXJhbQorXHJldHVybiB0U2lyUmV0U3RhdHUgLSBzdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgbGltUHJvY2Vzc0hhbEluZE1lc3NhZ2VzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIG1zZ0lkLCB2b2lkICptc2dQYXJhbSApCit7CisgIC8vaXRzIFBFJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSBtc2dwYXJhbSB3aGVuIGl0cyBkb25lIGV4dHJhY3RpbmcgdGhlIG1lc3NhZ2UgcGFyYW1ldGVycy4KKyAgdFNpck1zZ1EgbXNnOworCisgIHN3aXRjaChtc2dJZCkKKyAgeworICAgIGNhc2UgU0lSX0xJTV9ERUxfVFNfSU5EOgorICAgIGNhc2UgU0lSX0xJTV9BRERfQkFfSU5EOiAgICAKKyAgICBjYXNlIFNJUl9MSU1fREVMX0JBX0FMTF9JTkQ6CisgICAgY2FzZSBTSVJfTElNX0RFTEVURV9TVEFfQ09OVEVYVF9JTkQ6ICAgICAgICAKKyAgICBjYXNlIFNJUl9MSU1fQkVBQ09OX0dFTl9JTkQ6CisgICAgICBtc2cudHlwZSA9ICh0QU5JX1UxNikgbXNnSWQ7CisgICAgICBtc2cuYm9keXB0ciA9IG1zZ1BhcmFtOworICAgICAgbXNnLmJvZHl2YWwgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBtc2dQYXJhbSk7CisgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImludmFsaWQgbWVzc2FnZSBpZCA9ICVkIHJlY2VpdmVkXG4iKSwgbXNnSWQpOworICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgfQorCisgIGlmIChsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpICE9IGVTSVJfU1VDQ0VTUykKKyAgeworICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgbXNnUGFyYW0pOworICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgibGltUG9zdE1zZ0FwaSBmYWlsZWQgZm9yIG1zZ2lkID0gJWQiKSwgbXNnLnR5cGUpOworICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgIH0KKyAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1WYWxpZGF0ZURlbHRzUmVxCitcYnJpZWYgVmFsaWRhdGVzIERlbFRzIHJlcSBvcmlnaW5hdGVkIGJ5IFNNRSBvciBieSBIQUwgYW5kIGFsc28gc2VuZHMgaGFsTXNnX0RlbFRzIHRvIEhBTAorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworXHBhcmFtICAgICB0cFNpckRlbHRzUmVxIHBEZWx0c1JlcQorXHBhcmFtICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIKK1xyZXR1cm4gZVNpclJldFN0YXR1cyAtIHN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cworbGltVmFsaWRhdGVEZWx0c1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpckRlbHRzUmVxIHBEZWx0c1JlcSwgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0cERwaEhhc2hOb2RlIHBTdGE7CisgICAgdEFOSV9VOCAgICAgICAgICAgIHRzU3RhdHVzOworICAgIHRTaXJNYWNUU0luZm8gKnRzaW5mbzsKKyAgICB0QU5JX1UzMiBpOworICAgIHRBTklfVTggdHNwZWNJZHg7CisgICAgLyogaWYgc3RhCisgICAgICogIC0gdmVyaWZ5IGFzc29jIHN0YXRlCisgICAgICogIC0gZGVsIHRzcGVjIGxvY2FsbHkKKyAgICAgKiBpZiBhcCwKKyAgICAgKiAgLSB2ZXJpZnkgc3RhIGlzIGluIGFzc29jIHN0YXRlCisgICAgICogIC0gZGVsIHN0YSB0c3BlYyBsb2NhbGx5CisgICAgICovCisgICAgaWYocERlbHRzUmVxID09IE5VTEwpCisgICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRGVsZXRlIFRTIHJlcXVlc3QgcG9pbnRlciBpcyBOVUxMXG4iKSk7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfUk9MRSl8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSkKKyAgICB7CisgICAgICAgIHRBTklfVTMyIHZhbDsKKworICAgICAgICAvLyBzdGF0aW9uIGFsd2F5cyB0YWxrcyB0byB0aGUgQVAKKyAgICAgICAgcFN0YSA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworCisgICAgICAgIHZhbCA9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgICAgICNpZiAwCisgICAgICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0JTU0lELCBwZWVyTWFjQWRkciwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvLy8gQ291bGQgbm90IGdldCBCU1NJRCBmcm9tIENGRy4gTG9nIGVycm9yLgorICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQlNTSURcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAjZW5kaWYvLyBUTyBTVVBQT1JUIEJULUFNUAorICAgICAgIHNpckNvcHlNYWNBZGRyKHBlZXJNYWNBZGRyLHBzZXNzaW9uRW50cnktPmJzc0lkKTsKKyAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdEFOSV9VMTYgYXNzb2NJZDsKKyAgICAgICAgdEFOSV9VOCAqbWFjYWRkciA9ICh0QU5JX1U4ICopIHBlZXJNYWNBZGRyOworCisgICAgICAgIGFzc29jSWQgPSBwRGVsdHNSZXEtPmFpZDsKKyAgICAgICAgaWYgKGFzc29jSWQgIT0gMCkKKyAgICAgICAgICAgIHBTdGEgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgYXNzb2NJZCwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwU3RhID0gZHBoTG9va3VwSGFzaEVudHJ5KHBNYWMsIHBEZWx0c1JlcS0+bWFjQWRkciwgJmFzc29jSWQsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKworICAgICAgICBpZiAocFN0YSAhPSBOVUxMKQorICAgICAgICAgICAgLy8gVEJEOiBjaGVjayBzdGEgYXNzb2Mgc3RhdGUgYXMgd2VsbAorICAgICAgICAgICAgZm9yIChpID0wOyBpIDwgc2l6ZW9mKHRTaXJNYWNBZGRyKTsgaSsrKQorICAgICAgICAgICAgICAgIG1hY2FkZHJbaV0gPSBwU3RhLT5zdGFBZGRyW2ldOworICAgIH0KKworICAgIGlmIChwU3RhID09IE5VTEwpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICJDYW5ub3QgZmluZCBzdGF0aW9uIGNvbnRleHQgZm9yIGRlbHRzIHJlcVxuIik7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGlmICgoISBwU3RhLT52YWxpZCkgfHwKKyAgICAgICAgKHBTdGEtPm1sbVN0YUNvbnRleHQubWxtU3RhdGUgIT0gZUxJTV9NTE1fTElOS19FU1RBQkxJU0hFRF9TVEFURSkpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICJJbnZhbGlkIFN0YSAob3Igc3RhdGUpIGZvciBEZWxUc1JlcVxuIik7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHBEZWx0c1JlcS0+cmVxLndzbVRzcGVjUHJlc2VudCA9IDA7CisgICAgcERlbHRzUmVxLT5yZXEud21lVHNwZWNQcmVzZW50ID0gMDsKKyAgICBwRGVsdHNSZXEtPnJlcS5sbGVUc3BlY1ByZXNlbnQgPSAwOworCisgICAgaWYgKChwU3RhLT53c21FbmFibGVkKSAmJgorICAgICAgICAocERlbHRzUmVxLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ICE9IFNJUl9NQUNfQUNDRVNTUE9MSUNZX0VEQ0EpKQorICAgICAgICBwRGVsdHNSZXEtPnJlcS53c21Uc3BlY1ByZXNlbnQgPSAxOworICAgIGVsc2UgaWYgKHBTdGEtPndtZUVuYWJsZWQpCisgICAgICAgIHBEZWx0c1JlcS0+cmVxLndtZVRzcGVjUHJlc2VudCA9IDE7CisgICAgZWxzZSBpZiAocFN0YS0+bGxlRW5hYmxlZCkKKyAgICAgICAgcERlbHRzUmVxLT5yZXEubGxlVHNwZWNQcmVzZW50ID0gMTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJERUxUU19SRVEgaWdub3JlIC0gcW9zIGlzIGRpc2FibGVkXG4iKSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHRzaW5mbyA9IHBEZWx0c1JlcS0+cmVxLndtZVRzcGVjUHJlc2VudCA/ICZwRGVsdHNSZXEtPnJlcS50c3BlYy50c2luZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmcERlbHRzUmVxLT5yZXEudHNpbmZvOworICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICBGTCgicmVjZWl2ZWQgREVMVFNfUkVRIG1lc3NhZ2UgKHdtZVRzcGVjUHJlc2VudCA9ICVkLCBsbGVUc3BlY1ByZXNlbnQgPSAlZCwgd3NtVHNwZWNQcmVzZW50ID0gJWQsIHRzaWQgJWQsICB1cCAlZCwgZGlyZWN0aW9uID0gJWQpXG4iKSwKKyAgICAgICAgICAgcERlbHRzUmVxLT5yZXEud21lVHNwZWNQcmVzZW50LCBwRGVsdHNSZXEtPnJlcS5sbGVUc3BlY1ByZXNlbnQsIHBEZWx0c1JlcS0+cmVxLndzbVRzcGVjUHJlc2VudCwKKyAgICAgICAgICAgdHNpbmZvLT50cmFmZmljLnRzaWQsIHRzaW5mby0+dHJhZmZpYy51c2VyUHJpbywgdHNpbmZvLT50cmFmZmljLmRpcmVjdGlvbik7KQorCisgICAgICAgLy8gaWYgbm8gQWNjZXNzIENvbnRyb2wsIGlnbm9yZSB0aGUgcmVxdWVzdAorI2lmIChkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQVApIHx8IGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9BUF9TREspKQorICAgICAgIGlmICgodHNpbmZvLT50cmFmZmljLmFjY2Vzc1BvbGljeSA9PSBTSVJfTUFDX0FDQ0VTU1BPTElDWV9FRENBKSkKKyAgICAgICAgICAgaWYgKCgocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpIHx8IChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX0FQX1JPTEUpKSYmIAorICAgICAgICAgICAgICAgICAgICAgICAoISBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDW3VwVG9BYyh0c2luZm8tPnRyYWZmaWMudXNlclByaW8pXS5hY2kuYWNtKSkKKyAgICAgICAgICAgICAgICAgICB8fCAoKChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICE9IGVMSU1fQVBfUk9MRSkgfHwocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0JUX0FNUF9BUF9ST0xFKSkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICghIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW3VwVG9BYyh0c2luZm8tPnRyYWZmaWMudXNlclByaW8pXS5hY2kuYWNtKSkpCisgICAgICAgeworICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HVywgRkwoIkRlbFRzIHdpdGggYWNlY3NzUG9saWN5ID0gJWQgYW5kIFVQICVkICwgQUMgPSAlZCBoYXMgbm8gQUMgLSBpZ25vcmluZyByZXF1ZXN0XG4iKSwKKyAgICAgICAgICAgICAgICAgIHRzaW5mby0+dHJhZmZpYy5hY2Nlc3NQb2xpY3ksIHRzaW5mby0+dHJhZmZpYy51c2VyUHJpbywgdXBUb0FjKHRzaW5mby0+dHJhZmZpYy51c2VyUHJpbykpOworICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGxpbUFkbWl0Q29udHJvbERlbGV0ZVRTKHBNYWMsIHBTdGEtPmFzc29jSWQsIHRzaW5mbywgJnRzU3RhdHVzLCAmdHNwZWNJZHgpCisgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCAiRVJST1IgREVMVFMgcmVxdWVzdCBmb3Igc3RhIGFzc29jSWQgJWQgKHRzaWQgJWQsIHVwICVkKVxuIiwKKyAgICAgICAgICAgICAgIHBTdGEtPmFzc29jSWQsIHRzaW5mby0+dHJhZmZpYy50c2lkLCB0c2luZm8tPnRyYWZmaWMudXNlclByaW8pOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHRzaW5mby0+dHJhZmZpYy5hY2Nlc3NQb2xpY3kgPT0gU0lSX01BQ19BQ0NFU1NQT0xJQ1lfSENDQSkgfHwKKyAgICAgICAgICAgICAodHNpbmZvLT50cmFmZmljLmFjY2Vzc1BvbGljeSA9PSBTSVJfTUFDX0FDQ0VTU1BPTElDWV9CT1RIKSkKKyAgICB7CisgICAgICAvL2VkY2Egb25seSBub3cuCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZigodHNpbmZvLT50cmFmZmljLmFjY2Vzc1BvbGljeSA9PSBTSVJfTUFDX0FDQ0VTU1BPTElDWV9FRENBKSAmJiAKKyAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbdXBUb0FjKHRzaW5mby0+dHJhZmZpYy51c2VyUHJpbyldLmFjaS5hY20pCisgICAgICB7CisgICAgICAgIC8vc2VuZCBtZXNzYWdlIHRvIEhBTCB0byBkZWxldGUgVFMKKyAgICAgICAgaWYoZVNJUl9TVUNDRVNTICE9IGxpbVNlbmRIYWxNc2dEZWxUcyhwTWFjLCBwU3RhLT5zdGFJbmRleCwgdHNwZWNJZHgsIHBEZWx0c1JlcS0+cmVxKSkKKyAgICAgICAgeworICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiRGVsVHMgd2l0aCBVUCAlZCBmYWlsZWQgaW4gbGltU2VuZEhhbE1zZ0RlbFRzIC0gaWdub3JpbmcgcmVxdWVzdFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2luZm8tPnRyYWZmaWMudXNlclByaW8pOworICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltUmVnaXN0ZXJIYWxJbmRDYWxsQmFjaworXGJyaWVmIHJlZ2lzdGVycyBjYWxsYmFjayBmdW5jdGlvbiB0byBIQUwgZm9yIGFueSBpbmRpY2F0aW9uLgorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgcE1hYworXHJldHVybiBub25lLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQKK2xpbVJlZ2lzdGVySGFsSW5kQ2FsbEJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0U2lyTXNnUSBtc2c7CisgICAgdHBIYWxJbmRDQiBwSGFsQ0I7CisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBIYWxDQiwgc2l6ZW9mKHRIYWxJbmRDQikpKQorICAgIHsKKyAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInBhbEFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkXG4iKSk7CisgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBIYWxDQi0+cEhhbEluZENCID0gbGltUHJvY2Vzc0hhbEluZE1lc3NhZ2VzOworCisgICAgbXNnLnR5cGUgPSBXREFfUkVHSVNURVJfUEVfQ0FMTEJBQ0s7CisgICAgbXNnLmJvZHlwdHIgPSBwSGFsQ0I7CisgICAgbXNnLmJvZHl2YWwgPSAwOworICAgIAorICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZy50eXBlKSk7CisgICAgaWYoZVNJUl9TVUNDRVNTICE9IHdkYVBvc3RDdHJsTXNnKHBNYWMsICZtc2cpKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwSGFsQ0IpOworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIndkYVBvc3RDdHJsTXNnKCkgZmFpbGVkXG4iKSk7CisgICAgfQorICAgIAorICAgIHJldHVybjsKK30KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIGxpbVByb2Nlc3NBZGRCYUluZAorCitcYnJpZWYgaGFuZGxlcyB0aGUgQkEgYWN0aXZpdHkgY2hlY2sgdGltZW91dCBpbmRpY2F0aW9uIGNvbWluZyBmcm9tIEhBTC4KKyAgICAgICAgIFZhbGlkYXRlcyB0aGUgcmVxdWVzdCwgcG9zdHMgcmVxdWVzdCBmb3Igc2VuZGluZyBhZGRCYVJlcSBtZXNzYWdlIGZvciBldmVyeSBjYW5kaWRhdGUgaW4gdGhlIGxpc3QuCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccGFyYW0gIHRTaXJNc2dRIGxpbU1zZworXHJldHVybiBOb25lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQKK2xpbVByb2Nlc3NBZGRCYUluZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKQoreworICAgIHRBTklfVTggICAgICAgICAgICAgaTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHRpZDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGFzc29jSWQ7CisgICAgdHBEcGhIYXNoTm9kZSAgICAgICBwU3RhOworICAgIHRwQWRkQmFDYW5kaWRhdGUgICAgcEJhQ2FuZGlkYXRlOworICAgIHRBTklfVTMyICAgICAgICAgICAgYmFDYW5kaWRhdGVDbnQ7CisgICAgdHBCYUFjdGl2aXR5SW5kICAgICBwQmFBY3Rpdml0eUluZDsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnk7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBzZXNzaW9uSWQ7CisKKyAgICAKKworICAgIGlmKGxpbU1zZy0+Ym9keXB0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgcEJhQWN0aXZpdHlJbmQgPSAodHBCYUFjdGl2aXR5SW5kKWxpbU1zZy0+Ym9keXB0cjsKKyAgICBiYUNhbmRpZGF0ZUNudCA9IHBCYUFjdGl2aXR5SW5kLT5iYUNhbmRpZGF0ZUNudDsKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYyxwQmFBY3Rpdml0eUluZC0+YnNzSWQsJnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCU1NJZFxuIikpOworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIGxpbU1zZy0+Ym9keXB0cik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgICAgCisgICAgLy9pZiB3ZSBhcmUgbm90IEhUIGNhcGFibGUgd2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgQkEgdGltZW91dCBpbmRpY2F0aW9uIGZyb20gSEFMLgorICAgIGlmKCAoYmFDYW5kaWRhdGVDbnQgID4gcE1hYy0+bGltLm1heFN0YXRpb24pIHx8ICFwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkgKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBsaW1Nc2ctPmJvZHlwdHIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAKKyAgICAvL2RlbGV0ZSB0aGUgY29tcGxldGUgZGlhbG9ndWV0b2tlbiBsaW5rZWQgbGlzdAorICAgIGxpbURlbGV0ZURpYWxvZ3VlVG9rZW5MaXN0KHBNYWMpOworICAgIHBCYUNhbmRpZGF0ZSA9ICAodHBBZGRCYUNhbmRpZGF0ZSkgKCgodEFOSV9VOCopcEJhQWN0aXZpdHlJbmQpICsgc2l6ZW9mKHRCYUFjdGl2aXR5SW5kKSk7CisKKyAgICBmb3IoaT0wOyBpPGJhQ2FuZGlkYXRlQ250OyBpKyssIHBCYUNhbmRpZGF0ZSsrKSAKKyAgICB7CisgICAgICAgcFN0YSA9IGRwaExvb2t1cEhhc2hFbnRyeShwTWFjLCBwQmFDYW5kaWRhdGUtPnN0YUFkZHIsICZhc3NvY0lkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgICAgICAgaWYoIChOVUxMID09IHBTdGEpIHx8ICghcFN0YS0+dmFsaWQpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKHRpZD0wOyB0aWQ8U1RBQ0ZHX01BWF9UQzsgdGlkKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAoZUJBX0RJU0FCTEUgPT0gcFN0YS0+dGNDZmdbdGlkXS5mVXNlQkFUeCkgJiYgCisgICAgICAgICAgICAgICAgIChwQmFDYW5kaWRhdGUtPmJhSW5mb1t0aWRdLmZCYUVuYWJsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJCQSBzZXR1cCBmb3Igc3RhSWQgPSAlZCwgVElEOiAlZCwgU1NOOiVkLlxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RhLT5zdGFJbmRleCwgdGlkLCBwQmFDYW5kaWRhdGUtPmJhSW5mb1t0aWRdLnN0YXJ0aW5nU2VxTnVtKTspCisgICAgICAgICAgICAgICAgbGltUG9zdE1sbUFkZEJBUmVxKHBNYWMsIHBTdGEsIHRpZCwgcEJhQ2FuZGlkYXRlLT5iYUluZm9bdGlkXS5zdGFydGluZ1NlcU51bSxwc2Vzc2lvbkVudHJ5KTsgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgbGltTXNnLT5ib2R5cHRyKTsKKyAgICByZXR1cm47Cit9CisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBsaW1EZWxBbGxCQVNlc3Npb25zCitcYnJpZWYgRGVsZXRlcyBhbGwgdGhlIGV4aXNpdG5nIEJBIHNlc3Npb25zLgorXCAgICAgICAgTm90ZSA6IFRoaXMgQVBJIGlzIHByb3ZpZGVkIGZvciBNYWMgT1N4IG9ubHkuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBNYWMgT1N4IG1heSBub3QKK1wgICAgICAgICAgICAgICAgICByZXN0YXJ0IGFmdGVyIENGRyB1cGRhdGUuCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccmV0dXJuIE5vbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIAorbGltRGVsQWxsQkFTZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTMyIGk7CisgICAgdEFOSV9VOCB0aWQ7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhOworCisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9ICAmcE1hYy0+bGltLmdwU2Vzc2lvblswXTsgLy9UQkQtUkFKRVNIIEhPVyBUTyBHRVQgc2Vzc2lvbkVudHJ5Pz8/Pz8KKyAgICBmb3IodGlkID0gMDsgdGlkIDwgU1RBQ0ZHX01BWF9UQzsgdGlkKyspCisgICAgeworICAgICAgICBpZigoZUxJTV9BUF9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpIHx8KHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSl8fAorICAgICAgICAgICAgICAoZUxJTV9TVEFfSU5fSUJTU19ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBwTWFjLT5saW0ubWF4U3RhdGlvbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTdGEgPSBwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlLnBEcGhOb2RlQXJyYXkgKyBpOworICAgICAgICAgICAgICAgIGlmIChwU3RhICYmIHBTdGEtPmFkZGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoZUJBX0VOQUJMRSA9PSBwU3RhLT50Y0NmZ1t0aWRdLmZVc2VCQVR4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1Qb3N0TWxtRGVsQkFSZXEocE1hYywgcFN0YSwgZUJBX0lOSVRJQVRPUiwgdGlkLCBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT04scHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihlQkFfRU5BQkxFID09IHBTdGEtPnRjQ2ZnW3RpZF0uZlVzZUJBUngpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVBvc3RNbG1EZWxCQVJlcShwTWFjLCBwU3RhLCBlQkFfUkVDSVBJRU5ULCB0aWQsIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTixwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChlTElNX1NUQV9ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUpfHwoZUxJTV9CVF9BTVBfU1RBX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdGEgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsICZwc2Vzc2lvbkVudHJ5LT5kcGguZHBoSGFzaFRhYmxlKTsKKyAgICAgICAgICAgIGlmIChwU3RhICYmIHBTdGEtPmFkZGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGVCQV9FTkFCTEUgPT0gcFN0YS0+dGNDZmdbdGlkXS5mVXNlQkFUeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbVBvc3RNbG1EZWxCQVJlcShwTWFjLCBwU3RhLCBlQkFfSU5JVElBVE9SLCB0aWQsIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTixwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoZUJBX0VOQUJMRSA9PSBwU3RhLT50Y0NmZ1t0aWRdLmZVc2VCQVJ4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltUG9zdE1sbURlbEJBUmVxKHBNYWMsIHBTdGEsIGVCQV9SRUNJUElFTlQsIHRpZCwgZVNJUl9NQUNfVU5TUEVDX0ZBSUxVUkVfUkVBU09OLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbGltUHJvY2Vzc0RlbFRzSW5kCitcYnJpZWYgaGFuZGxlcyB0aGUgRGVsZXRlVFMgaW5kaWNhdGlvbiBjb21pbmcgZnJvbSBIQUwgb3IgZ2VuZXJhdGVkIGJ5IFBFIGl0c2VsZiBpbiBzb21lIGVycm9yIGNhc2VzLgorICAgICAgICAgVmFsaWRhdGVzIHRoZSByZXF1ZXN0LCBzZW5kcyB0aGUgRGVsVHMgYWN0aW9uIGZyYW1lIHRvIHRoZSBQZWVyIGFuZCBzZW5kcyBEZWxUcyBpbmRpY2F0b2luIHRvIEhERC4KK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xwYXJhbSAgdFNpck1zZ1EgbGltTXNnCitccmV0dXJuIE5vbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAorbGltUHJvY2Vzc0RlbFRzSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpCit7CisgIHRwRHBoSGFzaE5vZGUgICAgICAgICBwU3RhOworICB0cERlbFRzUGFyYW1zICAgICAgICAgcERlbFRzUGFyYW0gPSAodHBEZWxUc1BhcmFtcykgKGxpbU1zZy0+Ym9keXB0cik7CisgIHRwU2lyRGVsdHNSZXEgICAgICAgICBwRGVsVHNSZXEgPSBOVUxMOworICB0U2lyTWFjQWRkciAgICAgICAgICAgcGVlck1hY0FkZHI7CisgIHRwU2lyRGVsdHNSZXFJbmZvICAgICBwRGVsVHNSZXFJbmZvOworICB0cExpbVRzcGVjSW5mbyAgICAgICAgcFRzcGVjSW5mbzsKKyAgdHBQRVNlc3Npb24gICAgICAgICAgIHBzZXNzaW9uRW50cnk7CisgIHRBTklfVTggICAgICAgICAgICAgICBzZXNzaW9uSWQ7ICAKKworaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLHBEZWxUc1BhcmFtLT5ic3NJZCwmc2Vzc2lvbklkKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBCc3NJZFxuIikpOworICAgICAgICAgcmV0dXJuOworICAgIH0KKworICBwVHNwZWNJbmZvID0gJihwTWFjLT5saW0udHNwZWNJbmZvW3BEZWxUc1BhcmFtLT50c3BlY0lkeF0pOworICBpZihwVHNwZWNJbmZvLT5pbnVzZSA9PSBmYWxzZSkKKyAgeworICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoInRzcGVjIGVudHJ5IHdpdGggaW5kZXggJWQgaXMgbm90IGluIHVzZVxuIiksIHBEZWxUc1BhcmFtLT50c3BlY0lkeCk7KQorICAgIGdvdG8gZXJyb3IxOworICB9CisKKyAgcFN0YSA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBwVHNwZWNJbmZvLT5hc3NvY0lkLCAmcHNlc3Npb25FbnRyeS0+ZHBoLmRwaEhhc2hUYWJsZSk7CisgIGlmKHBTdGEgPT0gTlVMTCkKKyAgeworICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiQ291bGQgbm90IGZpbmQgZW50cnkgaW4gRFBIIHRhYmxlIGZvciBhc3NvY0lkID0gJWRcbiIpLAorICAgICAgICAgICAgICAgIHBUc3BlY0luZm8tPmFzc29jSWQpOworICAgIGdvdG8gZXJyb3IxOworICB9CisKKyAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRGVsVHNSZXEsIHNpemVvZih0U2lyRGVsdHNSZXEpKSkKKyAgeworICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZFxuIikpOykKKyAgICAgZ290byBlcnJvcjE7CisgIH0KKworICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXBEZWxUc1JlcSwgc2l6ZW9mKHRTaXJEZWx0c1JlcSkpOworCisgIGlmKHBTdGEtPndtZUVuYWJsZWQpCisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmKHBEZWxUc1JlcS0+cmVxLnRzcGVjKSwgJihwVHNwZWNJbmZvLT50c3BlYyksIHNpemVvZih0U2lyTWFjVHNwZWNJRSkpOworICBlbHNlCisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmKHBEZWxUc1JlcS0+cmVxLnRzaW5mbyksICYocFRzcGVjSW5mby0+dHNwZWMudHNpbmZvKSwgc2l6ZW9mKHRTaXJNYWNUU0luZm8pKTsKKworCisgIC8vdmFsaWRhdGUgdGhlIHJlcQorICBpZiAoZVNJUl9TVUNDRVNTICE9IGxpbVZhbGlkYXRlRGVsdHNSZXEocE1hYywgcERlbFRzUmVxLCBwZWVyTWFjQWRkcixwc2Vzc2lvbkVudHJ5KSkKKyAgeworICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImxpbVZhbGlkYXRlRGVsdHNSZXEgZmFpbGVkXG4iKSk7KQorICAgIGdvdG8gZXJyb3IyOworICB9CisgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCAiU2VudCBERUxUUyByZXF1ZXN0IHRvIHN0YXRpb24gd2l0aCBhc3NvY0lkID0gJWQgTWFjQWRkciA9ICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorICAgICAgICAgICAgcERlbFRzUmVxLT5haWQsIHBlZXJNYWNBZGRyWzBdLCBwZWVyTWFjQWRkclsxXSwgcGVlck1hY0FkZHJbMl0sCisgICAgICAgICAgICBwZWVyTWFjQWRkclszXSwgcGVlck1hY0FkZHJbNF0sIHBlZXJNYWNBZGRyWzVdKTspCisKKyAgbGltU2VuZERlbHRzUmVxQWN0aW9uRnJhbWUocE1hYywgcGVlck1hY0FkZHIsIHBEZWxUc1JlcS0+cmVxLndtZVRzcGVjUHJlc2VudCwgJnBEZWxUc1JlcS0+cmVxLnRzaW5mbywgJnBEZWxUc1JlcS0+cmVxLnRzcGVjLAorICAgICAgICAgIHBzZXNzaW9uRW50cnkpOworCisgIC8vIHByZXBhcmUgYW5kIHNlbmQgYW4gc21lIGluZGljYXRpb24gdG8gSERECisgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcERlbFRzUmVxSW5mbywgc2l6ZW9mKHRTaXJEZWx0c1JlcUluZm8pKSkKKyAgeworICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZFxuIikpOykKKyAgICAgZ290byBlcnJvcjM7CisgIH0KKyAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKilwRGVsVHNSZXFJbmZvLCBzaXplb2YodFNpckRlbHRzUmVxSW5mbykpOworCisgIGlmKHBTdGEtPndtZUVuYWJsZWQpCisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmKHBEZWxUc1JlcUluZm8tPnRzcGVjKSwgJihwVHNwZWNJbmZvLT50c3BlYyksIHNpemVvZih0U2lyTWFjVHNwZWNJRSkpOworICBlbHNlCisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmKHBEZWxUc1JlcUluZm8tPnRzaW5mbyksICYocFRzcGVjSW5mby0+dHNwZWMudHNpbmZvKSwgc2l6ZW9mKHRTaXJNYWNUU0luZm8pKTsKKworICBsaW1TZW5kU21lRGVsdHNJbmQocE1hYywgcERlbFRzUmVxSW5mbywgcERlbFRzUmVxLT5haWQscHNlc3Npb25FbnRyeSk7CisKK2Vycm9yMzoKKyAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSBwRGVsVHNSZXFJbmZvKTsKK2Vycm9yMjoKKyAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSBwRGVsVHNSZXEpOworZXJyb3IxOgorICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopKGxpbU1zZy0+Ym9keXB0cikpOworICByZXR1cm47Cit9CisKKy8qKgorICogXGJyaWVmIFNldHVwIGFuIEEtTVBEVS9CQSBzZXNzaW9uCisgKgorICogXHNhIGxpbVBvc3RNbG1BZGRCQVJlcQorICoKKyAqIFxwYXJhbSBwTWFjIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIHBTdGFEcyBEUEggSGFzaCBOb2RlIG9iamVjdCBvZiBwZWVyIFNUQQorICoKKyAqIFxwYXJhbSB0aWQgVElEIGZvciB3aGljaCBhIEJBIGlzIGJlaW5nIHNldHVwLgorICogICAgICAgICAgICBJZiB0aGlzIGlzIHNldCB0byAweEZGRkYsIHRoZW4gd2UgcmV0cmlldmUKKyAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgVElEIGZyb20gdGhlIENGRworICoKKyAqIFxyZXR1cm4gZVNJUl9TVUNDRVNTIGlmIHNldHVwIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgZVNJUl9GQUlMVVJFIGlzIHNvbWUgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZAorICovCit0U2lyUmV0U3RhdHVzIGxpbVBvc3RNbG1BZGRCQVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlIHBTdGFEcywKKyAgICB0QU5JX1U4IHRpZCwgdEFOSV9VMTYgc3RhcnRpbmdTZXFOdW0sdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0cExpbU1sbUFkZEJBUmVxIHBNbG1BZGRCQVJlcTsKKyAgICB0cERpYWxvZ3VlVG9rZW4gZGlhbG9ndWVUb2tlbk5vZGU7CisgICAgdEFOSV9VMzIgICAgICAgIHZhbCA9IDA7CisgIAorICAvLyBDaGVjayBpZiB0aGUgcGVlciBpcyBhIDExbiBjYXBhYmxlIFNUQQorICAvLyBGSVhNRSAtIE5lZWQgYSAxMW4gcGVlciBpbmRpY2F0aW9uIGluIERQSC4KKyAgLy8gRm9yIG5vdywgdXNpbmcgdGhlIHRhdXJ1c1BlZXIgYXR0cmlidXRlCisgIC8vaWYoIDAgPT0gcFN0YURzLT50YXVydXNQZWVyID09ICkKKyAgICAvL3JldHVybiBlU0lSX1NVQ0NFU1M7CisKKyAgLy8gQWxsb2NhdGUgZm9yIExJTV9NTE1fQUREQkFfUkVRCisgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJnBNbG1BZGRCQVJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0TGltTWxtQWRkQkFSZXEgKSkpCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWRcbiIpKTsKKyAgICBzdGF0dXMgPSBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgZ290byByZXR1cm5GYWlsdXJlOworICB9CisKKyAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcE1sbUFkZEJBUmVxLCBzaXplb2YoIHRMaW1NbG1BZGRCQVJlcSApKTsKKworICAvLyBDb3B5IHRoZSBwZWVyIE1BQworICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgcE1sbUFkZEJBUmVxLT5wZWVyTWFjQWRkciwKKyAgICAgIHBTdGFEcy0+c3RhQWRkciwKKyAgICAgIHNpemVvZiggdFNpck1hY0FkZHIgKSk7CisKKyAgLy8gVXBkYXRlIHRoZSBUSUQKKyAgcE1sbUFkZEJBUmVxLT5iYVRJRCA9IHRpZDsKKworICAvLyBEZXRlcm1pbmUgdGhlIHN1cHBvcnRlZCBCQSBwb2xpY3kgb2YgbG9jYWwgU1RBCisgIC8vIGZvciB0aGUgVElEIG9mIGludGVyZXN0CisgIHBNbG1BZGRCQVJlcS0+YmFQb2xpY3kgPSAocFN0YURzLT5iYVBvbGljeUZsYWcgPj4gdGlkKSAmIDB4MTsKKworICAvLyBCQSBCdWZmZXIgU2l6ZQorICAvLyBSZXF1ZXN0aW5nIHRoZSBBRERCQSByZWNpcGllbnQgdG8gcG9wdWxhdGUgdGhlIHNpemUuCisgIC8vIElmIEFEREJBIGlzIGFjY2VwdGVkLCBhIG5vbi16ZXJvIGJ1ZmZlciBzaXplIHNob3VsZAorICAvLyBiZSByZXR1cm5lZCBpbiB0aGUgQUREQkEgUnNwCisgIHBNbG1BZGRCQVJlcS0+YmFCdWZmZXJTaXplID0gMDsKKworICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICBGTCggIlJlcXVlc3RpbmcgYW4gQUREQkEgdG8gc2V0dXAgYSAlcyBCQSBzZXNzaW9uIHdpdGggU1RBICVkIGZvciBUSUQgJWRcbiIgKSwKKyAgICAgIChwTWxtQWRkQkFSZXEtPmJhUG9saWN5ID8gIkltbWVkaWF0ZSI6ICJEZWxheWVkIiksCisgICAgICBwU3RhRHMtPnN0YUluZGV4LAorICAgICAgdGlkICk7CisKKyAgLy8gQkEgVGltZW91dAorICAvLyBwTWxtQWRkQkFSZXEtPmJhVGltZW91dCA9IHBNYWMtPmhhbC5oYWxNYWMuYmFUaW1lb3V0OyAvLyBJbiBUVSdzCisgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0JBX1RJTUVPVVQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgCisgIHsKKyAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQkEgVElNRSBPVVQgUGFyYW0gQ0ZHXG4iKSk7CisgICAgIHN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKyAgICAgZ290byByZXR1cm5GYWlsdXJlOworICB9CisgIHBNbG1BZGRCQVJlcS0+YmFUaW1lb3V0ID0gdmFsOyAvLyBJbiBUVSdzCisKKyAgLy8gQUREQkEgRmFpbHVyZSBUaW1lb3V0CisgIC8vIEZJWE1FX0FNUERVIC0gTmVlZCB0byByZXRyaWV2ZSB0aGlzIGZyb20gQ0ZHLiAKKyAgLy9yaWdodCBub3cgd2UgYXJlIG5vdCBjaGVja2luZyBmb3IgcmVzcG9uc2UgdGltZW91dC4gc28gdGhpcyBmaWVsZCBpcyBkdW1teSBqdXN0IHRvIGJlIGNvbXBsaWFudCB3aXRoIHRoZSBzcGVjLgorICBwTWxtQWRkQkFSZXEtPmFkZEJBRmFpbHVyZVRpbWVvdXQgPSAyMDAwOyAvLyBJbiBUVSdzCisKKyAgLy8gQkEgU3RhcnRpbmcgU2VxdWVuY2UgTnVtYmVyCisgIHBNbG1BZGRCQVJlcS0+YmFTU04gPSBzdGFydGluZ1NlcU51bTsKKworICAvKiBVcGRhdGUgUEUgc2Vzc2lvbiBJZCovCisgIHBNbG1BZGRCQVJlcS0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKyAgTElNX1NFVF9TVEFfQkFfU1RBVEUocFN0YURzLCB0aWQsIGVMSU1fQkFfU1RBVEVfV1RfQUREX1JTUCk7CisKKyAgaWYoIE5VTEwgPT0gKGRpYWxvZ3VlVG9rZW5Ob2RlID0gIGxpbUFzc2lnbkRpYWxvZ3VlVG9rZW4ocE1hYykpKQorICAgICAgZ290byByZXR1cm5GYWlsdXJlOworICAKKyAgcE1sbUFkZEJBUmVxLT5iYURpYWxvZ1Rva2VuID0gZGlhbG9ndWVUb2tlbk5vZGUtPnRva2VuOworICAvL3NldCBhc3NvY0lkIGFuZCB0aWQgaW5mb3JtYXRpb24gaW4gdGhlIGxpbSBsaW5rZWQgbGlzdCAKKyAgZGlhbG9ndWVUb2tlbk5vZGUtPmFzc29jSWQgPSBwU3RhRHMtPmFzc29jSWQ7CisgIGRpYWxvZ3VlVG9rZW5Ob2RlLT50aWQgPSB0aWQ7CisgIC8vIFNlbmQgQUREQkEgUmVxIHRvIE1MTUUKKyAgbGltUG9zdE1sbU1lc3NhZ2UoIHBNYWMsCisgICAgICBMSU1fTUxNX0FEREJBX1JFUSwKKyAgICAgICh0QU5JX1UzMiAqKSBwTWxtQWRkQkFSZXEgKTsKKworcmV0dXJuRmFpbHVyZToKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFxicmllZiBQb3N0IExJTV9NTE1fQUREQkFfUlNQIHRvIE1MTUUuIE1MTUUKKyAqIHdpbGwgdGhlbiBzZW5kIGFuIEFEREJBIFJzcCB0byBwZWVyIE1BQyBlbnRpdHkKKyAqIHdpdGggdGhlIGFwcHJvcHJpYXRlIEFEREJBIHN0YXR1cyBjb2RlCisgKgorICogXHNhIGxpbVBvc3RNbG1BZGRCQVJzcAorICoKKyAqIFxwYXJhbSBwTWFjIFRoZSBnbG9iYWwgdHBBbmlTaXJHbG9iYWwgb2JqZWN0CisgKgorICogXHBhcmFtIHBlZXJNYWNBZGRyIE1BQyBhZGRyZXNzIG9mIHBlZXIgZW50aXR5IHRoYXQgd2lsbAorICogYmUgdGhlIHJlY2lwaWVudCBvZiB0aGlzIEFEREJBIFJzcAorICoKKyAqIFxwYXJhbSBiYVN0YXR1c0NvZGUgQUREQkEgUnNwIHN0YXR1cyBjb2RlCisgKgorICogXHBhcmFtIGJhRGlhbG9nVG9rZW4gQUREQkEgUnNwIGRpYWxvZyB0b2tlbgorICoKKyAqIFxwYXJhbSBiYVRJRCBUSUQgb2YgaW50ZXJlc3QKKyAqCisgKiBccGFyYW0gYmFQb2xpY3kgVGhlIEJBIHBvbGljeQorICoKKyAqIFxwYXJhbSBiYUJ1ZmZlclNpemUgVGhlIEJBIGJ1ZmZlciBzaXplCisgKgorICogXHBhcmFtIGJhVGltZW91dCBCQSB0aW1lb3V0IGluIFRVJ3MKKyAqCisgKiBccmV0dXJuIGVTSVJfU1VDQ0VTUyBpZiBzZXR1cCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5CisgKiAgICAgICAgIGVTSVJfRkFJTFVSRSBpcyBzb21lIHByb2JsZW0gaXMgZW5jb3VudGVyZWQKKyAqLwordFNpclJldFN0YXR1cyBsaW1Qb3N0TWxtQWRkQkFSc3AoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsCisgICAgdFNpck1hY1N0YXR1c0NvZGVzIGJhU3RhdHVzQ29kZSwKKyAgICB0QU5JX1U4IGJhRGlhbG9nVG9rZW4sCisgICAgdEFOSV9VOCBiYVRJRCwKKyAgICB0QU5JX1U4IGJhUG9saWN5LAorICAgIHRBTklfVTE2IGJhQnVmZmVyU2l6ZSwKKyAgICB0QU5JX1UxNiBiYVRpbWVvdXQsCisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKK3RTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOwordHBMaW1NbG1BZGRCQVJzcCBwTWxtQWRkQkFSc3A7CisKKyAgLy8gQWxsb2NhdGUgZm9yIExJTV9NTE1fQUREQkFfUlNQCisgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAodm9pZCAqKikgJnBNbG1BZGRCQVJzcCwKKyAgICAgICAgc2l6ZW9mKCB0TGltTWxtQWRkQkFSc3AgKSkpCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iKSwKKyAgICAgICAgc3RhdHVzICk7CisKKyAgICBzdGF0dXMgPSBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgZ290byByZXR1cm5GYWlsdXJlOworICB9CisKKyAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcE1sbUFkZEJBUnNwLCBzaXplb2YoIHRMaW1NbG1BZGRCQVJzcCApKTsKKworICAvLyBDb3B5IHRoZSBwZWVyIE1BQworICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgcE1sbUFkZEJBUnNwLT5wZWVyTWFjQWRkciwKKyAgICAgIHBlZXJNYWNBZGRyLAorICAgICAgc2l6ZW9mKCB0U2lyTWFjQWRkciApKTsKKworICBwTWxtQWRkQkFSc3AtPmJhRGlhbG9nVG9rZW4gPSBiYURpYWxvZ1Rva2VuOworICBwTWxtQWRkQkFSc3AtPmFkZEJBUmVzdWx0Q29kZSA9IGJhU3RhdHVzQ29kZTsKKyAgcE1sbUFkZEJBUnNwLT5iYVRJRCA9IGJhVElEOworICBwTWxtQWRkQkFSc3AtPmJhUG9saWN5ID0gYmFQb2xpY3k7CisgIHBNbG1BZGRCQVJzcC0+YmFCdWZmZXJTaXplID0gYmFCdWZmZXJTaXplOworICBwTWxtQWRkQkFSc3AtPmJhVGltZW91dCA9IGJhVGltZW91dDsKKworICAvKiBVUGRhdGUgUEUgc2Vzc2lvbiBJRCovCisgIHBNbG1BZGRCQVJzcC0+c2Vzc2lvbklkID0gcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQ7CisKKyAgLy8gU2VuZCBBRERCQSBSc3AgdG8gTUxNRQorICBsaW1Qb3N0TWxtTWVzc2FnZSggcE1hYywKKyAgICAgIExJTV9NTE1fQUREQkFfUlNQLAorICAgICAgKHRBTklfVTMyICopIHBNbG1BZGRCQVJzcCApOworCityZXR1cm5GYWlsdXJlOgorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogXGJyaWVmIFBvc3QgTElNX01MTV9ERUxCQV9SRVEgdG8gTUxNRS4gTUxNRQorICogd2lsbCB0aGVuIHNlbmQgYW4gREVMQkEgSW5kIHRvIHBlZXIgTUFDIGVudGl0eQorICogd2l0aCB0aGUgYXBwcm9wcmlhdGUgREVMQkEgc3RhdHVzIGNvZGUKKyAqCisgKiBcc2EgbGltUG9zdE1sbURlbEJBUmVxCisgKgorICogXHBhcmFtIHBNYWMgVGhlIGdsb2JhbCB0cEFuaVNpckdsb2JhbCBvYmplY3QKKyAqCisgKiBccGFyYW0gcFN0YSBEUEggSGFzaCBOb2RlIG9iamVjdCBvZiBwZWVyIE1BQyBlbnRpdHkKKyAqIGZvciB3aGljaCB0aGUgQkEgc2Vzc2lvbiBpcyBiZWluZyBkZWxldGVkCisgKgorICogXHBhcmFtIGJhRGlyZWN0aW9uIERFTEJBIGRpcmVjdGlvbgorICoKKyAqIFxwYXJhbSBiYVRJRCBUSUQgZm9yIHdoaWNoIHRoZSBCQSBzZXNzaW9uIGlzIGJlaW5nIGRlbGV0ZWQKKyAqCisgKiBccGFyYW0gYmFSZWFzb25Db2RlIERFTEJBIFJlcSByZWFzb24gY29kZQorICoKKyAqIFxyZXR1cm4gZVNJUl9TVUNDRVNTIGlmIHNldHVwIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgZVNJUl9GQUlMVVJFIGlzIHNvbWUgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZAorICovCit0U2lyUmV0U3RhdHVzIGxpbVBvc3RNbG1EZWxCQVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlIHBTdGEsCisgICAgdEFOSV9VOCBiYURpcmVjdGlvbiwKKyAgICB0QU5JX1U4IGJhVElELAorICAgIHRTaXJNYWNSZWFzb25Db2RlcyBiYVJlYXNvbkNvZGUsCisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKK3RTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOwordHBMaW1NbG1EZWxCQVJlcSBwTWxtRGVsQkFSZXE7Cit0TGltQkFTdGF0ZSBjdXJCYVN0YXRlOworCitpZihOVUxMID09IHBTdGEpCisgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworTElNX0dFVF9TVEFfQkFfU1RBVEUocFN0YSwgYmFUSUQsICZjdXJCYVN0YXRlKTsKKworICAvLyBOZWVkIHRvIHZhbGlkYXRlIHRoZSBjdXJyZW50IEJBIFN0YXRlLgorICBpZiggZUxJTV9CQV9TVEFURV9JRExFICE9IGN1ckJhU3RhdGUpCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBERUxCQSBSRVEgd2hlbiBTVEEgQkEgc3RhdGUgZm9yIHRpZCA9ICVkIGlzICVkXG4iICksCisgICAgICAgIGJhVElELAorICAgICAgICBjdXJCYVN0YXRlKTsKKworICAgIHN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKyAgICBnb3RvIHJldHVybkZhaWx1cmU7CisgIH0KKworICAvLyBBbGxvY2F0ZSBmb3IgTElNX01MTV9ERUxCQV9SRVEKKyAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICh2b2lkICoqKSAmcE1sbURlbEJBUmVxLAorICAgICAgICBzaXplb2YoIHRMaW1NbG1EZWxCQVJlcSApKSkKKyAgeworICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgRkwoInBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWRcbiIpLAorICAgICAgICBzdGF0dXMgKTsKKworICAgIHN0YXR1cyA9IGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICBnb3RvIHJldHVybkZhaWx1cmU7CisgIH0KKworICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKSBwTWxtRGVsQkFSZXEsIHNpemVvZiggdExpbU1sbURlbEJBUmVxICkpOworCisgIC8vIENvcHkgdGhlIHBlZXIgTUFDCisgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICBwTWxtRGVsQkFSZXEtPnBlZXJNYWNBZGRyLAorICAgICAgcFN0YS0+c3RhQWRkciwKKyAgICAgIHNpemVvZiggdFNpck1hY0FkZHIgKSk7CisKKyAgcE1sbURlbEJBUmVxLT5iYURpcmVjdGlvbiA9IGJhRGlyZWN0aW9uOworICBwTWxtRGVsQkFSZXEtPmJhVElEID0gYmFUSUQ7CisgIHBNbG1EZWxCQVJlcS0+ZGVsQkFSZWFzb25Db2RlID0gYmFSZWFzb25Db2RlOworCisgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElEKi8KKyAgcE1sbURlbEJBUmVxLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworICAvL3dlIGRvbid0IGhhdmUgdmFsaWQgQkEgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGRpcmVjdGlvbi4gCisgIC8vIEhERCB3YW50cyB0byBnZXQgdGhlIEJBIHNlc3Npb24gZGVsZXRlZCBvbiBQRUVSIGluIHRoaXMgY2FzZS4gCisgIC8vIGluIHRoaXMgY2FzZSB3ZSBqdXN0IG5lZWQgdG8gc2VuZCBEZWxCQSB0byB0aGUgcGVlci4KKyAgaWYoKChlQkFfUkVDSVBJRU5UID09IGJhRGlyZWN0aW9uKSAmJiAoZUJBX0RJU0FCTEUgPT0gcFN0YS0+dGNDZmdbYmFUSURdLmZVc2VCQVJ4KSkgfHwKKyAgICAgICgoZUJBX0lOSVRJQVRPUiA9PSBiYURpcmVjdGlvbikgJiYgKGVCQV9ESVNBQkxFID09IHBTdGEtPnRjQ2ZnW2JhVElEXS5mVXNlQkFUeCkpKQorICB7CisgICAgICAgIC8vIFNlbmQgREVMQkEgSW5kIG92ZXIgdGhlIGFpcgorICAgICAgICBpZiggZVNJUl9TVUNDRVNTICE9CisgICAgICAgICAgICAoc3RhdHVzID0gbGltU2VuZERlbEJBSW5kKCBwTWFjLCBwTWxtRGVsQkFSZXEscHNlc3Npb25FbnRyeSkpKQorICAgICAgICAgIHN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKyAgCisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKSBwTWxtRGVsQkFSZXEpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICB9CisKKworICAvLyBVcGRhdGUgdGhlIEJBIHN0YXRlIGluIFNUQQorICBMSU1fU0VUX1NUQV9CQV9TVEFURShwU3RhLCBwTWxtRGVsQkFSZXEtPmJhVElELCBlTElNX0JBX1NUQVRFX1dUX0RFTF9SU1ApOworCisgIC8vIFNlbmQgREVMQkEgUmVxIHRvIE1MTUUKKyAgbGltUG9zdE1sbU1lc3NhZ2UoIHBNYWMsCisgICAgICBMSU1fTUxNX0RFTEJBX1JFUSwKKyAgICAgICh0QU5JX1UzMiAqKSBwTWxtRGVsQkFSZXEgKTsKKworcmV0dXJuRmFpbHVyZToKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFxicmllZiBTZW5kIFdEQV9BRERCQV9SRVEgdG8gSEFMLCBpbiBvcmRlcgorICogdG8gc2V0dXAgYSBuZXcgQkEgc2Vzc2lvbiB3aXRoIGEgcGVlcgorICoKKyAqIFxzYSBsaW1Qb3N0TXNnQWRkQkFSZXEKKyAqCisgKiBccGFyYW0gcE1hYyBUaGUgZ2xvYmFsIHRwQW5pU2lyR2xvYmFsIG9iamVjdAorICoKKyAqIFxwYXJhbSBwU3RhIFJ1bnRpbWUsIFNUQS1yZWxhdGVkIGNvbmZpZ3VyYXRpb24gY2FjaGVkCisgKiBpbiB0aGUgSGFzaE5vZGUgb2JqZWN0CisgKgorICogXHBhcmFtIGJhRGlhbG9nVG9rZW4gVGhlIEFjdGlvbiBGcmFtZSBkaWFsb2cgdG9rZW4KKyAqCisgKiBccGFyYW0gYmFUSUQgVElEIGZvciB3aGljaCB0aGUgQkEgc2Vzc2lvbiBpcyBiZWluZyBzZXR1cAorICoKKyAqIFxwYXJhbSBiYVBvbGljeSBCQSBQb2xpY3kKKyAqCisgKiBccGFyYW0gYmFCdWZmZXJTaXplIFRoZSByZXF1ZXN0ZWQgQkEgYnVmZmVyIHNpemUKKyAqCisgKiBccGFyYW0gYmFUaW1lb3V0IEJBIFRpbWVvdXQuIDAgaW5kaWNhdGVzIG5vIEJBIHRpbWVvdXQgZW5mb3JjZWQKKyAqCisgKiBccGFyYW0gYmFTU04gU3RhcnRpbmcgU2VxdWVuY2UgTnVtYmVyIGZvciB0aGlzIEJBIHNlc3Npb24KKyAqCisgKiBccGFyYW0gYmFEaXJlY3Rpb24gQkEgRGlyZWN0aW9uOiAxIC0gSW5pdGlhdG9yLCAwIC0gUmVjaXBpZW50CisgKgorICogXHJldHVybiBub25lCisgKgorICovCit0U2lyUmV0U3RhdHVzIGxpbVBvc3RNc2dBZGRCQVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlIHBTdGEsCisgICAgdEFOSV9VOCBiYURpYWxvZ1Rva2VuLAorICAgIHRBTklfVTggYmFUSUQsCisgICAgdEFOSV9VOCBiYVBvbGljeSwKKyAgICB0QU5JX1UxNiBiYUJ1ZmZlclNpemUsCisgICAgdEFOSV9VMTYgYmFUaW1lb3V0LAorICAgIHRBTklfVTE2IGJhU1NOLAorICAgIHRBTklfVTggYmFEaXJlY3Rpb24sIAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7Cit0cEFkZEJBUGFyYW1zIHBBZGRCQVBhcmFtcyA9IE5VTEw7Cit0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CitlSGFsU3RhdHVzIHN0YXR1czsKK3RTaXJNc2dRIG1zZ1E7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9WU1RBX0ZFQVRVUkUKKyAgLy8gd2UgY2FuIG9ubHkgZG8gQkEgb24gImhhcmQiIFNUQXMKKyAgaWYgKCEoSVNfSFdTVEFfSURYKHBTdGEtPnN0YUluZGV4KSkpCisgIHsKKyAgICByZXRDb2RlID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICBnb3RvIHJldHVybkZhaWx1cmU7CisgIH0KKyNlbmRpZiAvL1dMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQorCisgIC8vIEFsbG9jYXRlIGZvciBXREFfQUREQkFfUkVRCisgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAoc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcEFkZEJBUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRBZGRCQVBhcmFtcyApKSkpCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iKSwKKyAgICAgICAgc3RhdHVzICk7CisKKyAgICByZXRDb2RlID0gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgIGdvdG8gcmV0dXJuRmFpbHVyZTsKKyAgfQorCisgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBBZGRCQVBhcmFtcywgc2l6ZW9mKCB0QWRkQkFQYXJhbXMgKSk7CisKKyAgLy8gQ29weSB0aGUgcGVlciBNQUMgYWRkcmVzcworICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgKHZvaWQgKikgcEFkZEJBUGFyYW1zLT5wZWVyTWFjQWRkciwKKyAgICAgICh2b2lkICopIHBTdGEtPnN0YUFkZHIsCisgICAgICBzaXplb2YoIHRTaXJNYWNBZGRyICkpOworCisgIC8vIFBvcHVsYXRlIHRoZSBSRVEgcGFyYW1ldGVycworICBwQWRkQkFQYXJhbXMtPnN0YUlkeCA9IHBTdGEtPnN0YUluZGV4OworICBwQWRkQkFQYXJhbXMtPmJhRGlhbG9nVG9rZW4gPSBiYURpYWxvZ1Rva2VuOworICBwQWRkQkFQYXJhbXMtPmJhVElEID0gYmFUSUQ7CisgIHBBZGRCQVBhcmFtcy0+YmFQb2xpY3kgPSBiYVBvbGljeTsKKyAgcEFkZEJBUGFyYW1zLT5iYUJ1ZmZlclNpemUgPSBiYUJ1ZmZlclNpemU7CisgIHBBZGRCQVBhcmFtcy0+YmFUaW1lb3V0ID0gYmFUaW1lb3V0OworICBwQWRkQkFQYXJhbXMtPmJhU1NOID0gYmFTU047CisgIHBBZGRCQVBhcmFtcy0+YmFEaXJlY3Rpb24gPSBiYURpcmVjdGlvbjsKKyAgcEFkZEJBUGFyYW1zLT5yZXNwUmVxZCA9IDE7CisKKyAgLyogVVBkYXRlIFBFIHNlc3Npb24gSUQgKi8KKyAgcEFkZEJBUGFyYW1zLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworICAvLyBQb3N0IFdEQV9BRERCQV9SRVEgdG8gSEFMLgorICBtc2dRLnR5cGUgPSBXREFfQUREQkFfUkVROworICAvLworICAvLyBGSVhNRV9BTVBEVQorICAvLyBBIGdsb2JhbCBjb3VudGVyIChkaWFsb2cgdG9rZW4pIGlzIHJlcXVpcmVkIHRvIGtlZXAgdHJhY2sgb2YKKyAgLy8gYWxsIFBFIDwtPiBIQUwgY29tbXVuaWNhdGlvbihzKQorICAvLworICBtc2dRLnJlc2VydmVkID0gMDsKKyAgbXNnUS5ib2R5cHRyID0gcEFkZEJBUGFyYW1zOworICBtc2dRLmJvZHl2YWwgPSAwOworCisgIGxpbUxvZyggcE1hYywgTE9HVywKKyAgICAgIEZMKCAiU2VuZGluZyBXREFfQUREQkFfUkVRLi4uIiApKTsKKworICAvL2RlZmVyIGFueSBvdGhlciBtZXNzYWdlIHVudGlsIHdlIGdldCByZXNwb25zZSBiYWNrLgorICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCBmYWxzZSk7CisKKyAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9MSU0gLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfSEFMX0FEREJBX1JFUV9FVkVOVCwgcHNlc3Npb25FbnRyeSwgMCwgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgIAorICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gd2RhUG9zdEN0cmxNc2coIHBNYWMsICZtc2dRICkpKQorICAgIGxpbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgRkwoIlBvc3RpbmcgV0RBX0FEREJBX1JFUSB0byBIQUwgZmFpbGVkISBSZWFzb24gPSAlZFxuIiksCisgICAgICAgIHJldENvZGUgKTsKKyAgZWxzZQorICAgIHJldHVybiByZXRDb2RlOworCityZXR1cm5GYWlsdXJlOgorCisgIC8vIENsZWFuLXVwLi4uCisgIGlmKCBOVUxMICE9IHBBZGRCQVBhcmFtcyApCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcEFkZEJBUGFyYW1zICk7CisKKyAgcmV0dXJuIHJldENvZGU7CisKK30KKworLyoqCisgKiBcYnJpZWYgU2VuZCBXREFfREVMQkFfSU5EIHRvIEhBTCwgaW4gb3JkZXIKKyAqIHRvIGRlbGV0ZSBhbiBleGlzdGluZyBCQSBzZXNzaW9uIHdpdGggcGVlcgorICoKKyAqIFxzYSBsaW1Qb3N0TXNnRGVsQkFJbmQKKyAqCisgKiBccGFyYW0gcE1hYyBUaGUgZ2xvYmFsIHRwQW5pU2lyR2xvYmFsIG9iamVjdAorICoKKyAqIFxwYXJhbSBwU3RhIFJ1bnRpbWUsIFNUQS1yZWxhdGVkIGNvbmZpZ3VyYXRpb24gY2FjaGVkCisgKiBpbiB0aGUgSGFzaE5vZGUgb2JqZWN0CisgKgorICogXHBhcmFtIGJhVElEIFRJRCBmb3Igd2hpY2ggdGhlIEJBIHNlc3Npb24gaXMgYmVpbmcgc2V0dXAKKyAqCisgKiBccGFyYW0gYmFEaXJlY3Rpb24gSWRlbnRpZmllcyB3aGV0aGVyIHRoZSBERUxCQSBJbmQgd2FzCisgKiBzZW50IGJ5IHRoZSBCQSBpbml0aWF0b3Igb3IgcmVjaXBpZW50CisgKgorICogXHJldHVybiBub25lCisgKgorICovCit0U2lyUmV0U3RhdHVzIGxpbVBvc3RNc2dEZWxCQUluZCggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlIHBTdGEsCisgICAgdEFOSV9VOCBiYVRJRCwKKyAgICB0QU5JX1U4IGJhRGlyZWN0aW9uLAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7Cit0cERlbEJBUGFyYW1zIHBEZWxCQVBhcmFtcyA9IE5VTEw7Cit0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CitlSGFsU3RhdHVzIHN0YXR1czsKK3RTaXJNc2dRIG1zZ1E7CisKKyAgLy8gQWxsb2NhdGUgZm9yIFNJUl9IQUxfREVMQkFfSU5ECisgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAoc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcERlbEJBUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHREZWxCQVBhcmFtcyApKSkpCisgIHsKKyAgICBsaW1Mb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iKSwKKyAgICAgICAgc3RhdHVzICk7CisKKyAgICByZXRDb2RlID0gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgIGdvdG8gcmV0dXJuRmFpbHVyZTsKKyAgfQorCisgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICopIHBEZWxCQVBhcmFtcywgc2l6ZW9mKCB0RGVsQkFQYXJhbXMgKSk7CisKKyAgLy8gUG9wdWxhdGUgdGhlIFJFUSBwYXJhbWV0ZXJzCisgIHBEZWxCQVBhcmFtcy0+c3RhSWR4ID0gcFN0YS0+c3RhSW5kZXg7CisgIHBEZWxCQVBhcmFtcy0+YmFUSUQgPSBiYVRJRDsKKyAgcERlbEJBUGFyYW1zLT5iYURpcmVjdGlvbiA9IGJhRGlyZWN0aW9uOworCisgIC8qIFVwZGF0ZSBQRSBzZXNzaW9uIElEICovCisgIAorCisgIC8vVEJELVJBSkVTSCBVcGRhdGluZyBvZiB0aGUgc2Vzc2lvbiBJRCBpcyByZXF1aXJkIGZvciBTSVJfSEFMX0RFTEJBX0lORD8/Pz8/CisgIC8vcERlbEJBUGFyYW1zLT5zZXNzaW9uSWQgPSBwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZDsKKworICAvLyBQb3N0IFdEQV9ERUxCQV9JTkQgdG8gSEFMLgorICBtc2dRLnR5cGUgPSBXREFfREVMQkFfSU5EOworICAvLworICAvLyBGSVhNRToKKyAgLy8gQSBnbG9iYWwgY291bnRlciAoZGlhbG9nIHRva2VuKSBpcyByZXF1aXJlZCB0byBrZWVwIHRyYWNrIG9mCisgIC8vIGFsbCBQRSA8LT4gSEFMIGNvbW11bmljYXRpb24ocykKKyAgLy8KKyAgbXNnUS5yZXNlcnZlZCA9IDA7CisgIG1zZ1EuYm9keXB0ciA9IHBEZWxCQVBhcmFtczsKKyAgbXNnUS5ib2R5dmFsID0gMDsKKworICBsaW1Mb2coIHBNYWMsIExPR1csCisgICAgICBGTCggIlNlbmRpbmcgU0lSX0hBTF9ERUxCQV9JTkQuLi4iICkpOworCisgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfTElNIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0hBTF9ERUxCQV9JTkRfRVZFTlQsIHBzZXNzaW9uRW50cnksIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gKHJldENvZGUgPSB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKSkpCisgICAgbGltTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICBGTCgiUG9zdGluZyBXREFfREVMQkFfSU5EIHRvIEhBTCBmYWlsZWQhIFJlYXNvbiA9ICVkXG4iKSwKKyAgICAgICAgcmV0Q29kZSApOworICBlbHNlCisgIHsKKyAgICAvLyBVcGRhdGUgTElNJ3MgaW50ZXJuYWwgY2FjaGUuLi4KKyAgICBpZiggZUJBX0lOSVRJQVRPUiA9PSBiYURpcmVjdGlvbikKKyAgICB7CisgICAgICBwU3RhLT50Y0NmZ1tiYVRJRF0uZlVzZUJBVHggPSAwOworICAgICAgcFN0YS0+dGNDZmdbYmFUSURdLnR4QnVmU2l6ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwU3RhLT50Y0NmZ1tiYVRJRF0uZlVzZUJBUnggPSAwOworICAgICAgcFN0YS0+dGNDZmdbYmFUSURdLnJ4QnVmU2l6ZSA9IDA7CisgICAgfQorICAKKyAgICByZXR1cm4gcmV0Q29kZTsKKyAgfQorCityZXR1cm5GYWlsdXJlOgorCisgIC8vIENsZWFuLXVwLi4uCisgIGlmKCBOVUxMICE9IHBEZWxCQVBhcmFtcyApCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKikgcERlbEJBUGFyYW1zICk7CisKKyAgcmV0dXJuIHJldENvZGU7CisKK30KKworLyoqCisgKiBAZnVuY3Rpb24gOiAgbGltUG9zdFNNU3RhdGVVcGRhdGUoKSAKKyAqCisgKiBAYnJpZWYgIDogIFRoaXMgZnVuY3Rpb24gVXBkYXRlcyB0aGUgSEFMIGFuZCBTb2Z0bWFjIGFib3V0IHRoZSBjaGFuZ2UgaW4gdGhlIFNUQSdzIFNNUFMgc3RhdGUuCisgKgorICogICAgICBMT0dJQzoKKyAqCisgKiAgICAgIEFTU1VNUFRJT05TOgorICogICAgICAgICAgTkEKKyAqCisgKiAgICAgIE5PVEU6CisgKiAgICAgICAgICBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgbGltTXNnIC0gTGltIE1lc3NhZ2Ugc3RydWN0dXJlIG9iamVjdCB3aXRoIHRoZSBNaW1vUFNwYXJhbSBpbiBib2R5CisgKiBAcmV0dXJuIE5vbmUKKyAqLwordFNpclJldFN0YXR1cyAKK2xpbVBvc3RTTVN0YXRlVXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICB0QU5JX1UxNiBzdGFJZHgsIHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSBzdGF0ZSkKK3sKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgICAgICAgIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICAgdFNpck1zZ1EgICAgICAgICAgICAgICAgICAgIG1zZ1E7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIHRwU2V0TUlNT1BTICAgICAgICAgICAgcE1JTU9fUFNQYXJhbXM7CisKKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLnR5cGUgPSBXREFfU0VUX01JTU9QU19SRVE7CisKKyAgICAvLyBBbGxvY2F0ZSBmb3IgV0RBX1NFVF9NSU1PUFNfUkVRCisgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSAmcE1JTU9fUFNQYXJhbXMsIHNpemVvZiggdFNldE1JTU9QUykpOworICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9ICBzdGF0dXMpIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLEZMKCIgcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZFxuIiksIHN0YXR1cyApOworICAgICAgICByZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKworICAgIHBNSU1PX1BTUGFyYW1zLT5odE1JTU9QU1N0YXRlID0gc3RhdGU7CisgICAgcE1JTU9fUFNQYXJhbXMtPnN0YUlkeCA9IHN0YUlkeDsKKyAgICBwTUlNT19QU1BhcmFtcy0+ZnNlbmRSc3AgPSB0cnVlOworICAgIG1zZ1EuYm9keXB0ciA9IHBNSU1PX1BTUGFyYW1zOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICBsaW1Mb2coIHBNYWMsIExPRzIsIEZMKCAiU2VuZGluZyBXREFfU0VUX01JTU9QU19SRVEuLi4iICkpOworCisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisgICAgcmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApOworICAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIlBvc3RpbmcgV0RBX1NFVF9NSU1PUFNfUkVRIHRvIEhBTCBmYWlsZWQhIFJlYXNvbiA9ICVkXG4iKSwgcmV0Q29kZSApOworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBNSU1PX1BTUGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgfQorICAgIAorICAgIHJldHVybiByZXRDb2RlOworfQorCit2b2lkIGxpbVBrdEZyZWUgKAorICAgIHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgIGVGcmFtZVR5cGUgICAgICBmcm1UeXBlLAorICAgIHRBTklfVTggICAgICAgICAqcFJ4UGFja2V0SW5mbywKKyAgICB2b2lkICAgICAgICAgICAgKnBCb2R5KQoreworICAgICh2b2lkKSBwTWFjOyAodm9pZCkgZnJtVHlwZTsgKHZvaWQpIHBSeFBhY2tldEluZm87ICh2b2lkKSBwQm9keTsKKyNpZiBkZWZpbmVkIEFOSV9PU19UWVBFX0xJTlVYIHx8IGRlZmluZWQgQU5JX09TX1RZUEVfT1NYCisgICAgLy8gRnJlZSB1cCBhbGxvY2F0ZWQgU0sgQlVGCisgICAgcGFsUGt0RnJlZSggcE1hYy0+aEhkZCwgZnJtVHlwZSwgcFJ4UGFja2V0SW5mbywgcEJvZHkpIDsKKyNlbmRpZgorfQorCisvKioKKyAqIGxpbUdldEJEZnJvbVJ4UGFja2V0KCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHBvaW50ZXIgdG8gUG9sYXJpcworICogQnVmZmVyIERlc2NyaXB0b3IgY29udGFpbmluZyBNQUMgaGVhZGVyICYgb3RoZXIgY29udHJvbAorICogaW5mbyBmcm9tIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHBvc3RlZCB0byBMSU0uCisgKgorICpMT0dJQzoKKyAqIE5BCisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gIGJvZHkgICAgLSBSZWNlaXZlZCBtZXNzYWdlIGJvZHkKKyAqIEBwYXJhbSAgcFJ4UGFja2V0SW5mbyAgICAgLSBQb2ludGVyIHRvIHJlY2VpdmVkIEJECisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitsaW1HZXRCRGZyb21SeFBhY2tldCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpib2R5LCB0QU5JX1UzMiAqKnBSeFBhY2tldEluZm8pCit7CisjaWYgZGVmaW5lZCAoQU5JX09TX1RZUEVfTElOVVgpIHx8IGRlZmluZWQgKEFOSV9PU19UWVBFX09TWCkKKyNpZm5kZWYgR0VONl9PTldBUkRTCisgICAgcGFsR2V0UGFja2V0RGF0YVB0ciggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCAodm9pZCAqKSBib2R5LCAodm9pZCAqKikgcFJ4UGFja2V0SW5mbyApOworI2VuZGlmIC8vR0VONl9PTldBUkRTCisjZWxzZQorICAgICpwUnhQYWNrZXRJbmZvID0gKHRBTklfVTMyICopIGJvZHk7CisjZW5kaWYKK30gLyoqKiBlbmQgbGltR2V0QkRmcm9tUnhQYWNrZXQoKSAqKiovCisKKworCisKKwordm9pZCBsaW1SZXNzZXRTY2FuQ2hhbm5lbEluZm8odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwTWFjLT5saW0uc2NhbkNobkluZm8sIHNpemVvZih0TGltU2NhbkNobkluZm8pKTsKK30KKworCit2b2lkIGxpbUFkZFNjYW5DaGFubmVsSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGNoYW5uZWxJZCkKK3sKKyAgICB0QU5JX1U4IGk7CisgICAgdEFOSV9CT09MRUFOIGZGb3VuZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKworICAgIGZvcihpID0gMDsgaSA8IHBNYWMtPmxpbS5zY2FuQ2huSW5mby5udW1DaG5JbmZvOyBpKyspCisgICAgeworICAgICAgICBpZihwTWFjLT5saW0uc2NhbkNobkluZm8uc2NhbkNobltpXS5jaGFubmVsSWQgPT0gY2hhbm5lbElkKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5saW0uc2NhbkNobkluZm8uc2NhbkNobltpXS5udW1UaW1lU2NhbisrOworICAgICAgICAgICAgZkZvdW5kID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihlQU5JX0JPT0xFQU5fRkFMU0UgPT0gZkZvdW5kKQorICAgIHsKKyAgICAgICAgaWYocE1hYy0+bGltLnNjYW5DaG5JbmZvLm51bUNobkluZm8gPCBTSVJfTUFYX1NVUFBPUlRFRF9DSEFOTkVMX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5zY2FuQ2huSW5mby5zY2FuQ2huW3BNYWMtPmxpbS5zY2FuQ2huSW5mby5udW1DaG5JbmZvXS5jaGFubmVsSWQgPSBjaGFubmVsSWQ7CisgICAgICAgICAgICBwTWFjLT5saW0uc2NhbkNobkluZm8uc2NhbkNobltwTWFjLT5saW0uc2NhbkNobkluZm8ubnVtQ2huSW5mbysrXS5udW1UaW1lU2NhbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCIgLS0gbnVtYmVyIG9mIGNoYW5uZWxzIGV4Y2VlZCBtYWNcbiIpKTspCisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoqCisgKiBAZnVuY3Rpb24gOiAgbGltSXNDaGFubmVsVmFsaWRGb3JDaGFubmVsU3dpdGNoKCkgCisgKgorICogQGJyaWVmICA6ICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY2hhbm5lbCB0byB3aGljaCBBUAorICogICAgICAgICAgICBpcyBleHBlY3RpbmcgdXMgdG8gc3dpdGNoLCBpcyBhIHZhbGlkIGNoYW5uZWwgZm9yIHVzLgorICogICAgICBMT0dJQzoKKyAqCisgKiAgICAgIEFTU1VNUFRJT05TOgorICogICAgICAgICAgTkEKKyAqCisgKiAgICAgIE5PVEU6CisgKiAgICAgICAgICBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgY2hhbm5lbCAtIE5ldyBjaGFubmVsIHRvIHdoaWNoIHdlIGFyZSBleHBlY3RlZCB0byBtb3ZlCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordEFuaUJvb2wgCitsaW1Jc0NoYW5uZWxWYWxpZEZvckNoYW5uZWxTd2l0Y2godHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjaGFubmVsKQoreworICAgIHRBTklfVTggIGluZGV4OworICAgIHRBTklfVTMyICAgIHZhbGlkQ2hhbm5lbExpc3RMZW4gPSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU47CisgICAgdFNpck1hY0NoYW5OdW0gICB2YWxpZENoYW5uZWxMaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CisKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QsCisgICAgICAgICAgKHRBTklfVTggKil2YWxpZENoYW5uZWxMaXN0LAorICAgICAgICAgICh0QU5JX1UzMiAqKSZ2YWxpZENoYW5uZWxMaXN0TGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgdmFsaWQgY2hhbm5lbCBsaXN0XG4iKSk7KQorICAgICAgICByZXR1cm4gKGVTSVJfRkFMU0UpOworICAgIH0KKworICAgIGZvcihpbmRleCA9IDA7IGluZGV4IDwgdmFsaWRDaGFubmVsTGlzdExlbjsgaW5kZXgrKykKKyAgICB7CisgICAgICAgIGlmKHZhbGlkQ2hhbm5lbExpc3RbaW5kZXhdID09IGNoYW5uZWwpCisgICAgICAgICAgICByZXR1cm4gKGVTSVJfVFJVRSk7CisgICAgfQorCisgICAgLyogY2hhbm5lbCBkb2VzIG5vdCBiZWxvbmcgdG8gbGlzdCBvZiB2YWxpZCBjaGFubmVscyAqLworICAgIHJldHVybiAoZVNJUl9GQUxTRSk7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICBfX2xpbUZpbGxUeENvbnRyb2xQYXJhbXMKK1xicmllZiAgRmlsbCB0aGUgbWVzc2FnZSBmb3Igc3RvcHBpbmcvcmVzdW1pbmcgdHguCisKK1xwYXJhbSAgcE1hYworXHBhcmFtICBwVHhDdHJsTXNnIC0gUG9pbnRlciB0byB0eCBjb250cm9sIG1lc3NhZ2UuCitccGFyYW0gIHR5cGUgLSBXaGljaCB3YXkgd2Ugd2FudCB0byBzdG9wLyByZXN1bWUgdHguCitccGFyYW0gIG1vZGUgLSBUbyBzdG9wL3Jlc3VtZS4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBlSGFsU3RhdHVzCitfX2xpbUZpbGxUeENvbnRyb2xQYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBUeENvbnRyb2xQYXJhbXMgIHBUeEN0cmxNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdExpbVF1aWV0VHhNb2RlIHR5cGUsIHRMaW1Db250cm9sVHggbW9kZSkKK3sKKworICAgIC8vVEJELVJBSkVTSCBIT1cgVE8gR0VUIHNlc3Npb25FbnRyeT8/Pz8/CisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9ICZwTWFjLT5saW0uZ3BTZXNzaW9uWzBdOworICAgIAorICAgIGlmIChtb2RlID09IGVMSU1fU1RPUF9UWCkKKyAgICAgICAgcFR4Q3RybE1zZy0+c3RvcFR4ID0gIGVBTklfQk9PTEVBTl9UUlVFOworICAgIGVsc2UKKyAgICAgICAgcFR4Q3RybE1zZy0+c3RvcFR4ID0gIGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIGVMSU1fVFhfQUxMOgorICAgICAgICAgICAgLyoqIFN0b3BzL3Jlc3VtZXMgdHJhbnNtaXNzaW9uIGNvbXBsZXRlbHkgKi8KKyAgICAgICAgICAgIHBUeEN0cmxNc2ctPmZDdHJsR2xvYmFsID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUxJTV9UWF9CU1NfQlVUX0JFQUNPTjoKKyAgICAgICAgICAgIC8qKiBTdG9wcy9yZXN1bWVzIHRyYW5zbWlzc2lvbiBvbiBhIHBhcnRpY3VsYXIgQlNTLiBTdG9wcGluZyBCU1MsIGRvZXNudAorICAgICAgICAgICAgICAqICBzdG9wIGJlYWNvbiB0cmFuc21pc3Npb24uCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICBwVHhDdHJsTXNnLT5jdHJsQnNzID0gMTsKKyAgICAgICAgICAgIHBUeEN0cmxNc2ctPmJzc0JpdG1hcCAgICB8PSAoMSA8PCBwc2Vzc2lvbkVudHJ5LT5ic3NJZHgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlTElNX1RYX1NUQToKKyAgICAgICAgICAgIC8qKiBNZW1vcnkgZm9yIHN0YXRpb24gYml0bWFwIGlzIGFsbG9jYXRlZCBkeW5hbWljYWxseSBpbiBjYWxsZXIgb2YgdGhpcworICAgICAgICAgICAgICAqICBzbyBkZWNvZGUgcHJvcGVybHkgaGVyZSBhbmQgZmlsbCB0aGUgYml0bWFwLiBOb3cgbm90IGltcGxlbWVudGVkLAorICAgICAgICAgICAgICAqICBmYWxsIHRocm91Z2guCisgICAgICAgICAgICAgICovCisgICAgICAgIGNhc2UgZUxJTV9UWF9CU1M6CisgICAgICAgICAgICAvL0ZhbGwgdGhydS4uLgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiSW52YWxpZCBjYXNlOiBOb3QgSGFuZGxlZFxuIikpOykKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAqIEBmdW5jdGlvbiA6ICBsaW1GcmFtZVRyYW5zbWlzc2lvbkNvbnRyb2woKSAKKyAqCisgKiBAYnJpZWYgIDogIFRoaXMgQVBJIGlzIGNhbGxlZCBieSB0aGUgdXNlciB0byBoYWx0L3Jlc3VtZSBhbnkgZnJhbWUKKyAqICAgICAgIHRyYW5zbWlzc2lvbiBmcm9tIHRoZSBkZXZpY2UuIElmIHN0b3BwZWQsIGFsbCBmcmFtZXMgd2lsbCBiZQorICogICAgICAgICAgICBxdWV1ZWQgc3RhcnRpbmcgZnJvbSBoYXJkd2FyZS4gVGhlbiBiYWNrLXByZXNzdXJlCisgKiAgICAgICAgICAgIGlzIGJ1aWx0IHRpbGwgdGhlIGRyaXZlci4KKyAqICAgICAgTE9HSUM6CisgKgorICogICAgICBBU1NVTVBUSU9OUzoKKyAqICAgICAgICAgIE5BCisgKgorICogICAgICBOT1RFOgorICogICAgICAgICAgTkEKKyAqCisgKiBAcGFyYW0gIHBNYWMgLSBQb2ludGVyIHRvIEdsb2JhbCBNQUMgc3RydWN0dXJlCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBsaW1GcmFtZVRyYW5zbWlzc2lvbkNvbnRyb2wodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpbVF1aWV0VHhNb2RlIHR5cGUsIHRMaW1Db250cm9sVHggbW9kZSkKK3sKKworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0cFR4Q29udHJvbFBhcmFtcyBwVHhDdHJsTXNnOworICAgIHRTaXJNc2dRICAgICAgICAgIG1zZ1E7CisgICAgdEFOSV9VOCAgICAgICAgICAgbkJ5dGVzID0gMDsgIC8vIE5vIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciBzdGF0aW9uIGJpdG1hcC4KKworICAgIC8qKiBBbGxvY2F0ZSBvbmx5IHJlcXVpcmVkIG51bWJlciBvZiBieXRlcyBmb3Igc3RhdGlvbiBiaXRtYXAKKyAgICAgKiBNYWtlIGl0IHRvIGFsaWduIHRvIDQgYnl0ZSBib3VuZGFyeSAgKi8KKyAgICBuQnl0ZXMgPSAodEFOSV9VOClIQUxNU0dfTlVNQllURVNfU1RBVElPTl9CSVRNQVAocE1hYy0+bGltLm1heFN0YXRpb24pOworCisgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopICZwVHhDdHJsTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZigqcFR4Q3RybE1zZykgKyBuQnl0ZXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoInBhbEFsbG9jYXRlTWVtb3J5KCkgZmFpbGVkXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBUeEN0cmxNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKCpwVHhDdHJsTXNnKSArIG5CeXRlcykpOworICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikgcFR4Q3RybE1zZyk7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgicGFsWmVyb01lbW9yeSgpIGZhaWxlZCwgc3RhdHVzID0gJWRcbiIpLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHN0YXR1cyA9IF9fbGltRmlsbFR4Q29udHJvbFBhcmFtcyhwTWFjLCBwVHhDdHJsTXNnLCB0eXBlLCBtb2RlKTsKKyAgICBpZiAoc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopIHBUeEN0cmxNc2cpOworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIl9fbGltRmlsbFR4Q29udHJvbFBhcmFtcyBmYWlsZWQsIHN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBtc2dRLmJvZHlwdHIgPSAodm9pZCAqKSBwVHhDdHJsTXNnOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisgICAgbXNnUS5yZXNlcnZlZCA9IDA7CisgICAgbXNnUS50eXBlID0gV0RBX1RSQU5TTUlTU0lPTl9DT05UUk9MX0lORDsKKworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworICAgIGlmKHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSBwVHhDdHJsTXNnKTsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiUG9zdGluZyBNZXNzYWdlIHRvIEhBTCBmYWlsZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtb2RlID09IGVMSU1fU1RPUF9UWCkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiU3RvcHBpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBhbGwgcGFja2V0cywgaW5kaWNhdGVkIHNvZnRtYWNcbiIpKTspCisgICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlc3VtaW5nIHRoZSB0cmFuc21pc3Npb24gb2YgYWxsIHBhY2tldHMsIGluZGljYXRlZCBzb2Z0bWFjXG4iKSk7KQorICAgICAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKgorICogQGZ1bmN0aW9uIDogIGxpbVJlc3RvcmVQcmVDaGFubmVsU3dpdGNoU3RhdGUoKSAKKyAqCisgKiBAYnJpZWYgIDogIFRoaXMgQVBJIGlzIGNhbGxlZCBieSB0aGUgdXNlciB0byB1bmRvIGFueSAKKyAqICAgICAgICAgICAgc3BlY2lmaWMgY2hhbmdlcyBkb25lIG9uIHRoZSBkZXZpY2UgZHVyaW5nCisgKiAgICAgICAgICAgIGNoYW5uZWwgc3dpdGNoLgorICogICAgICBMT0dJQzoKKyAqCisgKiAgICAgIEFTU1VNUFRJT05TOgorICogICAgICAgICAgTkEKKyAqCisgKiAgICAgIE5PVEU6CisgKiAgICAgICAgICBOQQorICoKKyAqIEBwYXJhbSAgcE1hYyAtIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3RTaXJSZXRTdGF0dXMgCitsaW1SZXN0b3JlUHJlQ2hhbm5lbFN3aXRjaFN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisKKyAgICB0U2lyUmV0U3RhdHVzIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICB0QU5JX1UzMiAgICAgIHZhbCA9IDA7CisKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX1NUQV9ST0xFKQorICAgICAgICByZXR1cm4gcmV0Q29kZTsKKyAgICAKKyAgICAvKiBDaGFubmVsIHN3aXRjaCBzaG91bGQgYmUgcmVhZHkgZm9yIHRoZSBuZXh0IHRpbWUgKi8KKyAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LmRvdDExaENoYW5Td1N0YXRlID0gZUxJTV8xMUhfQ0hBTlNXX0lOSVQ7CisKKyAgICAvKiBSZXN0b3JlIHRoZSBmcmFtZSB0cmFuc21pc3Npb24sIGFsbCB0aGUgdGltZS4gKi8KKyAgICBsaW1GcmFtZVRyYW5zbWlzc2lvbkNvbnRyb2wocE1hYywgZUxJTV9UWF9BTEwsIGVMSU1fUkVTVU1FX1RYKTsKKworICAgIC8qIEZyZWUgdG8gZW50ZXIgQk1QUyAqLworICAgIGxpbVNlbmRTbWVQb3N0Q2hhbm5lbFN3aXRjaEluZChwTWFjKTsKKworICAgIC8vQmFja2dyb3VuZCBzY2FuIGlzIG5vdyBlbmFibGVkIGJ5IFNNRSAgICAKKyAgICBpZihwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuVGVybWluYXRlID09IEZBTFNFKQorICAgIHsgICAgICAgCisgICAgICAgIC8qIEVuYWJsZSBiYWNrZ3JvdW5kIHNjYW4gaWYgYWxyZWFkeSBlbmFibGVkLCBlbHNlIGRvbid0IGJvdGhlciAqLworICAgICAgICBpZiAoKHJldENvZGUgPSB3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9QRVJJT0QsCisgICAgICAgICAgICAgICAgICAgICAgJnZhbCkpICE9IGVTSVJfU1VDQ0VTUykKKworICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBCYWNrZ3JvdW5kIHNjYW4gcGVyaW9kIHZhbHVlXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gKHJldENvZGUpOyAgIAorICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbCA+IDAgJiYgVFhfVElNRVJfVkFMSUQocE1hYy0+bGltLmxpbVRpbWVycy5nTGltQmFja2dyb3VuZFNjYW5UaW1lcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX0JBQ0tHUk9VTkRfU0NBTl9USU1FUikpOworICAgICAgICAgICAgaWYodHhfdGltZXJfYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUJhY2tncm91bmRTY2FuVGltZXIpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJDb3VsZCBub3QgcmVzdGFydCBiYWNrZ3JvdW5kIHNjYW4gdGltZXIsIGRvaW5nIExPR1AiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlU0lSX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFbmFibGUgaGVhcnRiZWF0IHRpbWVyICovCisgICAgaWYgKFRYX1RJTUVSX1ZBTElEKHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUhlYXJ0QmVhdFRpbWVyKSkKKyAgICB7CisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1RJTUVSX0FDVElWQVRFLCAwLCBlTElNX0hFQVJUX0JFQVRfVElNRVIpKTsKKyAgICAgICAgaWYobGltQWN0aXZhdGVIZWFyQmVhdFRpbWVyKHBNYWMpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ291bGQgbm90IHJlc3RhcnQgaGVhcnRiZWF0IHRpbWVyLCBkb2luZyBMT0dQIikpOworICAgICAgICAgICAgcmV0dXJuIChlU0lSX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIChyZXRDb2RlKTsKK30KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICAgIGxpbVJlc3RvcmVQcmVRdWlldFN0YXRlCitcYnJpZWYgICBSZXN0b3JlIHRoZSBwcmUgcXVpZXQgc3RhdGUKKworXHBhcmFtIHBNYWMKK1xyZXR1cm4gTk9ORQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RTaXJSZXRTdGF0dXMgbGltUmVzdG9yZVByZVF1aWV0U3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgIHRTaXJSZXRTdGF0dXMgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKyNpZiBkZWZpbmVkKEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UKSB8fCBkZWZpbmVkKEFOSV9BUF9DTElFTlRfU0RLKQorICAgIHRBTklfVTMyICAgICAgdmFsID0gMDsKKyAKKyAgICBpZiAocE1hYy0+bGltLmdMaW1TeXN0ZW1Sb2xlICE9IGVMSU1fU1RBX1JPTEUpCisgICAgICAgICAgICAgcmV0dXJuIHJldENvZGU7CisgCisgICAgLyogUXVpZXQgc2hvdWxkIGJlIHJlYWR5IGZvciB0aGUgbmV4dCB0aW1lICovCisgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID0gZUxJTV9RVUlFVF9JTklUOworCisgICAgLyogUmVzdG9yZSB0aGUgZnJhbWUgdHJhbnNtaXNzaW9uLCBhbGwgdGhlIHRpbWUuICovCisgICAgaWYgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9PSBlTElNX1FVSUVUX1JVTk5JTkcpCisgICAgICAgIGxpbUZyYW1lVHJhbnNtaXNzaW9uQ29udHJvbChwTWFjLCBlTElNX1RYX0FMTCwgZUxJTV9SRVNVTUVfVFgpOworCisKKyAgICAvL0JhY2tncm91bmQgc2NhbiBpcyBub3cgZW5hYmxlZCBieSBTTUUKKyAgICBpZihwTWFjLT5saW0uZ0xpbUJhY2tncm91bmRTY2FuVGVybWluYXRlID09IEZBTFNFKQorICAgIHsgICAgIAorICAgICAgICAvKiBFbmFibGUgYmFja2dyb3VuZCBzY2FuIGlmIGFscmVhZHkgZW5hYmxlZCwgZWxzZSBkb24ndCBib3RoZXIgKi8KKyAgICAgICAgaWYgKChyZXRDb2RlID0gd2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19CQUNLR1JPVU5EX1NDQU5fUEVSSU9ELAorICAgICAgICAgICAgICAgICAgICAgICZ2YWwpKSAhPSBlU0lSX1NVQ0NFU1MpCisKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjb3VsZCBub3QgcmV0cmlldmUgQmFja2dyb3VuZCBzY2FuIHBlcmlvZCB2YWx1ZVxuIikpOworICAgICAgICAgICAgcmV0dXJuIChyZXRDb2RlKTsgICAKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWwgPiAwICYmIFRYX1RJTUVSX1ZBTElEKHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUJhY2tncm91bmRTY2FuVGltZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9CQUNLR1JPVU5EX1NDQU5fVElNRVIpKTsKKyAgICAgICAgICAgIGlmKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1CYWNrZ3JvdW5kU2NhblRpbWVyKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiQ291bGQgbm90IHJlc3RhcnQgYmFja2dyb3VuZCBzY2FuIHRpbWVyLCBkb2luZyBMT0dQIikpOworICAgICAgICAgICAgICAgIHJldHVybiAoZVNJUl9GQUlMVVJFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgLyogRW5hYmxlIGhlYXJ0YmVhdCB0aW1lciAqLworICAgIGlmIChUWF9USU1FUl9WQUxJRChwTWFjLT5saW0ubGltVGltZXJzLmdMaW1IZWFydEJlYXRUaW1lcikpCisgICAgeworICAgICAgICBNVFJBQ0UobWFjVHJhY2UocE1hYywgVFJBQ0VfQ09ERV9USU1FUl9BQ1RJVkFURSwgMCwgZUxJTV9IRUFSVF9CRUFUX1RJTUVSKSk7CisgICAgICAgIGlmKGxpbUFjdGl2YXRlSGVhckJlYXRUaW1lcihwTWFjKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoIkNvdWxkIG5vdCByZXN0YXJ0IGhlYXJ0YmVhdCB0aW1lciwgZG9pbmcgTE9HUCIpKTsKKyAgICAgICAgICAgIHJldHVybiAoZVNJUl9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAgICAKKyAgICByZXR1cm4gKHJldENvZGUpOworfQorCisKKy8qKgorICogQGZ1bmN0aW9uOiBsaW1QcmVwYXJlRm9yMTFoQ2hhbm5lbFN3aXRjaCgpIAorICoKKyAqIEBicmllZiAgOiAgVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IHRoZSB1c2VyIHRvIHByZXBhcmUgZm9yCisgKiAgICAgICAgICAgIDExaCBjaGFubmVsIHN3aXRjaC4gQXMgb2Ygbm93LCB0aGUgQVBJIGRvZXMgCisgKiAgICAgICAgICAgIHZlcnkgbWluaW1hbCB3b3JrLiBVc2VyIGNhbiBhZGQgbW9yZSBpbnRvIHRoZQorICogICAgICAgICAgICBzYW1lIEFQSSBpZiBuZWVkZWQuCisgKiAgICAgIExPR0lDOgorICoKKyAqICAgICAgQVNTVU1QVElPTlM6CisgKiAgICAgICAgICBOQQorICoKKyAqICAgICAgTk9URToKKyAqICAgICAgICAgIE5BCisgKgorICogQHBhcmFtICBwTWFjIC0gUG9pbnRlciB0byBHbG9iYWwgTUFDIHN0cnVjdHVyZQorICogQHBhcmFtICBwc2Vzc2lvbkVudHJ5CisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCAKK2xpbVByZXBhcmVGb3IxMWhDaGFubmVsU3dpdGNoKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisjaWYgZGVmaW5lZChBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCkgfHwgZGVmaW5lZChBTklfQVBfQ0xJRU5UX1NESykKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSAhPSBlTElNX1NUQV9ST0xFKQorICAgICAgICByZXR1cm47CisgICAgIAorICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgMTFoIGNoYW5uZWwgc3dpdGNoIGluIHByb2dyZXNzICovCisgICAgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5kb3QxMWhDaGFuU3dTdGF0ZSA9IGVMSU1fMTFIX0NIQU5TV19SVU5OSU5HOworCisgICAgLyogRGlzYWJsZSwgU3RvcCBiYWNrZ3JvdW5kIHNjYW4gaWYgZW5hYmxlZCBhbmQgcnVubmluZyAqLworICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX0JBQ0tHUk9VTkRfU0NBTl9USU1FUik7CisKKyAgICAvKiBTdG9wIGhlYXJ0LWJlYXQgdGltZXIgdG8gc3RvcCBoZWFydGJlYXQgZGlzYXNzb2NpYXRpb24gKi8KKyAgICBsaW1IZWFydEJlYXREZWFjdGl2YXRlQW5kQ2hhbmdlVGltZXIocE1hYywgcHNlc3Npb25FbnRyeSk7CisKKyAgICBpZihwTWFjLT5saW0uZ0xpbVNtZVN0YXRlID09IGVMSU1fU01FX0xJTktfRVNUX1dUX1NDQU5fU1RBVEUgfHwKKyAgICAgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSA9PSBlTElNX1NNRV9DSEFOTkVMX1NDQU5fU1RBVEUpCisgICAgeworICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJQb3N0aW5nIGZpbmlzaCBzY2FuIGFzIHdlIGFyZSBpbiBzY2FuIHN0YXRlXG4iKSk7KQorICAgICAgICAvKiBTdG9wIG9uZ29pbmcgc2Nhbm5pbmcgaWYgYW55ICovCisgICAgICAgIGlmIChHRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TZXQgdGhlIHJlc3VtZSBjaGFubmVsIHRvIEFueSB2YWxpZCBjaGFubmVsIChpbnZhbGlkKS4gCisgICAgICAgICAgICAvL1RoaXMgd2lsbCBpbnN0cnVjdCBIQUwgdG8gc2V0IGl0IHRvIGFueSBwcmV2aW91cyB2YWxpZCBjaGFubmVsLgorICAgICAgICAgICAgcGVTZXRSZXN1bWVDaGFubmVsKHBNYWMsIDAsIDApOworICAgICAgICAgICAgbGltU2VuZEhhbEZpbmlzaFNjYW5SZXEocE1hYywgZUxJTV9IQUxfRklOSVNIX1NDQU5fV0FJVF9TVEFURSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsaW1SZXN0b3JlUHJlQ2hhbm5lbFN3aXRjaFN0YXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiTm90IGluIHNjYW4gc3RhdGUsIHN0YXJ0IGNoYW5uZWwgc3dpdGNoIHRpbWVyXG4iKSk7KQorICAgICAgICAvKiogV2UgYXJlIHNhZmUgdG8gc3dpdGNoIGNoYW5uZWwgYXQgdGhpcyBwb2ludCAqLworICAgICAgICBsaW1TdG9wVHhBbmRTd2l0Y2hDaGFubmVsKHBNYWMsIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTsKKyAgICB9CisjZW5kaWYKK30KKworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgICAgbGltR2V0TndUeXBlCisKK1xicmllZiAgICBHZXQgdHlwZSBvZiB0aGUgbmV0d29yayBmcm9tIGRhdGEgcGFja2V0IG9yIGJlYWNvbgorXHBhcmFtIHBNYWMKK1xwYXJhbSBjaGFubmVsTnVtIC0gQ2hhbm5lbCBudW1iZXIKK1xwYXJhbSB0eXBlIC0gVHlwZSBvZiBwYWNrZXQuCitccGFyYW0gcEJlYWNvbiAtIFBvaW50ZXIgdG8gYmVhY29uIG9yIHByb2JlIHJlc3BvbnNlCisKK1xyZXR1cm4gTmV0d29yayB0eXBlIGEvYi9nLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordFNpck53VHlwZSBsaW1HZXROd1R5cGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjaGFubmVsTnVtLCB0QU5JX1UzMiB0eXBlLCB0cFNjaEJlYWNvblN0cnVjdCBwQmVhY29uKQoreworICAgIHRTaXJOd1R5cGUgbndUeXBlID0gZVNJUl8xMUJfTldfVFlQRTsKKworICAgIGlmICh0eXBlID09IFNJUl9NQUNfREFUQV9GUkFNRSkKKyAgICB7CisgICAgICAgIGlmICgoY2hhbm5lbE51bSA+IDApICYmIChjaGFubmVsTnVtIDwgMTUpKQorICAgICAgICB7CisgICAgICAgICAgICBud1R5cGUgPSBlU0lSXzExR19OV19UWVBFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbndUeXBlID0gZVNJUl8xMUFfTldfVFlQRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKGNoYW5uZWxOdW0gPiAwKSAmJiAoY2hhbm5lbE51bSA8IDE1KSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAvLyAxMWIgb3IgMTFnIHBhY2tldAorICAgICAgICAgICAgLy8gMTFnIGlmZiBleHRlbmRlZCBSYXRlIElFIGlzIHByZXNlbnQgb3IKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIEEgcmF0ZSBpbiBzdXBwUmF0ZSBJRQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBCZWFjb24tPnN1cHBvcnRlZFJhdGVzLm51bVJhdGVzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNpcklzQXJhdGUocEJlYWNvbi0+c3VwcG9ydGVkUmF0ZXMucmF0ZVtpXSAmIDB4N2YpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbndUeXBlID0gZVNJUl8xMUdfTldfVFlQRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBCZWFjb24tPmV4dGVuZGVkUmF0ZXNQcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMywgRkwoIkJlYWNvbiwgbnd0eXBlPUdcbiIpKTspCisgICAgICAgICAgICAgICAgbndUeXBlID0gZVNJUl8xMUdfTldfVFlQRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIDExYSBwYWNrZXQKKyAgICAgICAgICAgIFBFTE9HMyhsaW1Mb2cocE1hYywgTE9HMyxGTCgiQmVhY29uLCBud3R5cGU9QVxuIikpOykKKyAgICAgICAgICAgIG53VHlwZSA9IGVTSVJfMTFBX05XX1RZUEU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG53VHlwZTsKK30KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgICAgbGltR2V0Q2hhbm5lbEZyb21CZWFjb24KK1xicmllZiAgICBUbyBleHRyYWN0IGNoYW5uZWwgbnVtYmVyIGZyb20gYmVhY29uCisKK1xwYXJhbSBwTWFjCitccGFyYW0gcEJlYWNvbiAtIFBvaW50ZXIgdG8gYmVhY29uIG9yIHByb2JlIHJzcAorXHJldHVybiBjaGFubmVsIG51bWJlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9VOCBsaW1HZXRDaGFubmVsRnJvbUJlYWNvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNjaEJlYWNvblN0cnVjdCBwQmVhY29uKQoreworICAgIHRBTklfVTggY2hhbm5lbE51bSA9IDA7CisKKyAgICBpZiAocEJlYWNvbi0+ZHNQYXJhbXNQcmVzZW50KQorICAgICAgICBjaGFubmVsTnVtID0gcEJlYWNvbi0+Y2hhbm5lbE51bWJlcjsKKyAgICBlbHNlIGlmKHBCZWFjb24tPkhUSW5mby5wcmVzZW50KQorICAgICAgICBjaGFubmVsTnVtID0gcEJlYWNvbi0+SFRJbmZvLnByaW1hcnlDaGFubmVsOworICAgIGVsc2UKKyAgICAgICAgY2hhbm5lbE51bSA9IHBCZWFjb24tPmNoYW5uZWxOdW1iZXI7CisKKyAgICByZXR1cm4gY2hhbm5lbE51bTsKK30KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBsaW1TZXRUc3BlY1VhcHNkTWFzaworXGJyaWVmICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBQRSBnbG9iYWwgdmFyaWFibGU6CitcICAgICAgICAxKSBnVWFwc2RQZXJBY1RyaWdnZXJFbmFibGVNYXNrIGFuZCAKK1wgICAgICAgIDIpIGdVYXBzZFBlckFjRGVsaXZlcnlFbmFibGVNYXNrCitcICAgICAgICBiYXNlZCBvbiB0aGUgdXNlciBwcmlvcml0eSBmaWVsZCBhbmQgZGlyZWN0aW9uIGZpZWxkCitcICAgICAgICBpbiB0aGUgVFMgSW5mbyBGaWVsZHMuIAorXAorXCAgICAgICAgQW4gQUMgaXMgYSB0cmlnZ2VyLWVuYWJsZWQgQUMgaWYgdGhlIFBTQiBzdWJmaWVsZCAKK1wgICAgICAgIGlzIHNldCB0byAxIGluIHRoZSB1cGxpbmsgZGlyZWN0aW9uLiAKK1wgICAgICAgIEFuIEFDIGlzIGEgZGVsaXZlcnktZW5hYmxlZCBBQyBpZiB0aGUgUFNCIHN1YmZpZWxkIAorXCAgICAgICAgaXMgc2V0IHRvIDEgaW4gdGhlIGRvd24tbGluayBkaXJlY3Rpb24uIAorXAorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKK1xwYXJhbSAgIHRTaXJNYWNUU0luZm8gICBwVHNJbmZvCitccGFyYW0gICB0QU5JX1UzMiAgICAgICAgYWN0aW9uCitccmV0dXJuICBOb25lCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltU2V0VHNwZWNVYXBzZE1hc2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY1RTSW5mbyAqcFRzSW5mbywgdEFOSV9VMzIgYWN0aW9uKQoreworICAgIHRBTklfVTggICB1c2VyUHJpbyA9ICh0QU5JX1U4KXBUc0luZm8tPnRyYWZmaWMudXNlclByaW87CisgICAgdEFOSV9VMTYgIGRpcmVjdGlvbiA9IHBUc0luZm8tPnRyYWZmaWMuZGlyZWN0aW9uOyAgCisgICAgdEFOSV9VOCAgIGFjID0gdXBUb0FjKHVzZXJQcmlvKTsKKworICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIiBTZXQgVUFQU0QgbWFzayBmb3IgQUMgJWQsIGRpcmVjdGlvbiAlZCwgYWN0aW9uPSVkICgxPXNldCwwPWNsZWFyKSBcbiIpLGFjLCBkaXJlY3Rpb24sIGFjdGlvbiApOykKKworICAgIC8qIENvbnZlcnRpbmcgQUMgdG8gYXBwcm9wcmlhdGUgVWFwc2QgQml0IE1hc2sKKyAgICAgKiBBQ19CRSgwKSAtLT4gVUFQU0RfQklUT0ZGU0VUX0FDVk8oMykKKyAgICAgKiBBQ19CSygxKSAtLT4gVUFQU0RfQklUT0ZGU0VUX0FDVk8oMikKKyAgICAgKiBBQ19WSSgyKSAtLT4gVUFQU0RfQklUT0ZGU0VUX0FDVk8oMSkKKyAgICAgKiBBQ19WTygzKSAtLT4gVUFQU0RfQklUT0ZGU0VUX0FDVk8oMCkKKyAgICAgKi8KKyAgICBhYyA9ICgofmFjKSAmIDB4Myk7CisKKyAgICBpZiAoYWN0aW9uID09IENMRUFSX1VBUFNEX01BU0spIAorICAgIHsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9VUExJTkspCisgICAgICAgICAgICBwTWFjLT5saW0uZ1VhcHNkUGVyQWNUcmlnZ2VyRW5hYmxlTWFzayAmPSB+KDEgPDwgYWMpOworICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LKSAgIAorICAgICAgICAgICAgcE1hYy0+bGltLmdVYXBzZFBlckFjRGVsaXZlcnlFbmFibGVNYXNrICY9IH4oMSA8PCBhYyk7CisgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9CSURJUikKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+bGltLmdVYXBzZFBlckFjVHJpZ2dlckVuYWJsZU1hc2sgJj0gfigxIDw8IGFjKTsKKyAgICAgICAgICAgIHBNYWMtPmxpbS5nVWFwc2RQZXJBY0RlbGl2ZXJ5RW5hYmxlTWFzayAmPSB+KDEgPDwgYWMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGFjdGlvbiA9PSBTRVRfVUFQU0RfTUFTSykKKyAgICB7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fVVBMSU5LKQorICAgICAgICAgICAgcE1hYy0+bGltLmdVYXBzZFBlckFjVHJpZ2dlckVuYWJsZU1hc2sgfD0gKDEgPDwgYWMpOworICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gU0lSX01BQ19ESVJFQ1RJT05fRE5MSU5LKSAgIAorICAgICAgICAgICAgcE1hYy0+bGltLmdVYXBzZFBlckFjRGVsaXZlcnlFbmFibGVNYXNrIHw9ICgxIDw8IGFjKTsgICAgCisgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTSVJfTUFDX0RJUkVDVElPTl9CSURJUikKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+bGltLmdVYXBzZFBlckFjVHJpZ2dlckVuYWJsZU1hc2sgfD0gKDEgPDwgYWMpOworICAgICAgICAgICAgcE1hYy0+bGltLmdVYXBzZFBlckFjRGVsaXZlcnlFbmFibGVNYXNrIHw9ICgxIDw8IGFjKTsgICAgICAKKyAgICAgICAgfQorICAgIH0KKworICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiTmV3IHBNYWMtPmxpbS5nVWFwc2RQZXJBY1RyaWdnZXJFbmFibGVNYXNrID0gMHgleCBcbiIpLCBwTWFjLT5saW0uZ1VhcHNkUGVyQWNUcmlnZ2VyRW5hYmxlTWFzayApOworICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiTmV3IHBNYWMtPmxpbS5nVWFwc2RQZXJBY0RlbGl2ZXJ5RW5hYmxlTWFzayA9IDB4JXggXG4iKSwgcE1hYy0+bGltLmdVYXBzZFBlckFjRGVsaXZlcnlFbmFibGVNYXNrICk7CisKKyAgICByZXR1cm47Cit9CisKKworCit2b2lkIGxpbUhhbmRsZUhlYXJ0QmVhdFRpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisKKyAgICB0QU5JX1U4IGk7CisgICAgZm9yKGkgPTA7aSA8IHBNYWMtPmxpbS5tYXhCc3NJZDtpKyspCisgICAgeworICAgICAgICBpZihwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkID09IFRSVUUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmJzc1R5cGUgPT0gZVNJUl9JQlNTX01PREUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGltSWJzc0hlYXJ0QmVhdEhhbmRsZShwTWFjLCZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoKHBNYWMtPmxpbS5ncFNlc3Npb25baV0uYnNzVHlwZSA9PSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREUpICYmCisgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1IYW5kbGVIZWFydEJlYXRGYWlsdXJlKHBNYWMsJnBNYWMtPmxpbS5ncFNlc3Npb25baV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgIH0KKyAgICAgZm9yKGk9MDsgaTwgcE1hYy0+bGltLm1heEJzc0lkOyBpKyspCisgICAgIHsKKyAgICAgICAgaWYocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCA9PSBUUlVFICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoKHBNYWMtPmxpbS5ncFNlc3Npb25baV0uYnNzVHlwZSA9PSBlU0lSX0lORlJBU1RSVUNUVVJFX01PREUpICYmCisgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5ncFNlc3Npb25baV0ubGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLkxpbUhCRmFpbHVyZVN0YXR1cyA9PSBlQU5JX0JPT0xFQU5fVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEFjdGl2YXRlIFByb2JlIEFmdGVyIEhlYXJ0QmVhdCBUaW1lciBpbmNhc2UgSEIgRmFpbHVyZSBkZXRlY3RlZCAqLworICAgICAgICAgICAgICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csRkwoIlNlbmRpbmcgUHJvYmUgZm9yIFNlc3Npb246ICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTspCisgICAgICAgICAgICAgICAgICAgIGxpbURlYWN0aXZhdGVBbmRDaGFuZ2VUaW1lcihwTWFjLCBlTElNX1BST0JFX0FGVEVSX0hCX1RJTUVSKTsKKyAgICAgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfQUNUSVZBVEUsIDAsIGVMSU1fUFJPQkVfQUZURVJfSEJfVElNRVIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR4X3RpbWVyX2FjdGl2YXRlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1Qcm9iZUFmdGVySEJUaW1lcikgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsIHRvIHJlLWFjdGl2YXRlIFByb2JlLWFmdGVyLWhlYXJ0YmVhdCB0aW1lclxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgbGltUmVhY3RpdmF0ZUhlYXJ0QmVhdFRpbWVyKHBNYWMsICZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RBTklfVTggbGltR2V0Q3VycmVudE9wZXJhdGluZ0NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1U4IGk7CisgICAgZm9yKGkgPTA7aSA8IHBNYWMtPmxpbS5tYXhCc3NJZDtpKyspCisgICAgeworICAgICAgICBpZihwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkID09IFRSVUUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZigocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5ic3NUeXBlID09IGVTSVJfSU5GUkFTVFJVQ1RVUkVfTU9ERSkgJiYKKyAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX1JPTEUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmN1cnJlbnRPcGVyQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBsaW1Qcm9jZXNzQWRkU3RhUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsdHBTaXJNc2dRIGxpbU1zZ1EpCit7CisgICAgIAorICAgIHRwUEVTZXNzaW9uICAgICAgICAgcHNlc3Npb25FbnRyeTsKKy8vICAgIHRBTklfVTggICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRwQWRkU3RhUGFyYW1zICAgICAgcEFkZFN0YVBhcmFtczsKKworICAgIHBBZGRTdGFQYXJhbXMgPSAodHBBZGRTdGFQYXJhbXMpbGltTXNnUS0+Ym9keXB0cjsgICAgCisgICAgCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwQWRkU3RhUGFyYW1zLT5zZXNzaW9uSWQpKT09TlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLEZMKCJTZXNzaW9uIERvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBzZXNzaW9uSURcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpCisgICAgICAgICh2b2lkKSBsaW1JYnNzQWRkU3RhUnNwKHBNYWMsIGxpbU1zZ1EtPmJvZHlwdHIscHNlc3Npb25FbnRyeSk7CisgICAgCisgICAgZWxzZQorICAgICAgICBsaW1Qcm9jZXNzTWxtQWRkU3RhUnNwKHBNYWMsIGxpbU1zZ1EscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgCit9CisKKwordm9pZCBsaW1VcGRhdGVCZWFjb24odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1U4IGk7CisgICAKKyAgICBmb3IoaSA9MDtpIDwgcE1hYy0+bGltLm1heEJzc0lkO2krKykKKyAgICB7CisgICAgICAgIGlmKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQgPT0gVFJVRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAoIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKSB8fCAKKyAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkgKQorICAgICAgICAgICAgICAgICYmIChlTElNX1NNRV9OT1JNQUxfU1RBVEUgPT0gcE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TbWVTdGF0ZSkKKyAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzY2hTZXRGaXhlZEJlYWNvbkZpZWxkcyhwTWFjLCZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldKTsKKyAgICAgICAgICAgICAgICBsaW1TZW5kQmVhY29uSW5kKHBNYWMsICZwTWFjLT5saW0uZ3BTZXNzaW9uW2ldKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSl8fAorICAgICAgICAgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZihwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnN0YXR5cGVGb3JCc3MgPT0gU1RBX0VOVFJZX1NFTEYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMsJnBNYWMtPmxpbS5ncFNlc3Npb25baV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgIAorfQorCit2b2lkIGxpbUhhbmRsZUhlYXJ0QmVhdEZhaWx1cmVUaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCBpOworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisgICAgLyogUHJvYmUgcmVzcG9uc2UgaXMgbm90IHJlY2VpdmVkICBhZnRlciBIQiBmYWlsdXJlLiAgVGhpcyBpcyBoYW5kbGVkIGJ5IExNTSBzdWIgbW9kdWxlLiAqLworICAgIGZvcihpID0wOyBpIDwgcE1hYy0+bGltLm1heEJzc0lkOyBpKyspCisgICAgeworICAgICAgICBpZihwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnkgPSAmcE1hYy0+bGltLmdwU2Vzc2lvbltpXTsKKyAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPkxpbUhCRmFpbHVyZVN0YXR1cyA9PSBlQU5JX0JPT0xFQU5fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlByb2JlX2hiX2ZhaWx1cmU6IFNNRSAlZCwgTUxNRSAlZCwgSEItQ291bnQgJWRcbiIpLHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGUsIHBzZXNzaW9uRW50cnktPkxpbVJ4ZWRCZWFjb25DbnREdXJpbmdIQik7CisgICAgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbU1sbVN0YXRlID09IGVMSU1fTUxNX0xJTktfRVNUQUJMSVNIRURfU1RBVEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUxJTV9JU19DT05ORUNUSU9OX0FDVElWRShwc2Vzc2lvbkVudHJ5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJQcm9iZV9oYl9mYWlsdXJlOiBmb3Igc2Vzc2lvbjolZCBcbiIgKSxwc2Vzc2lvbkVudHJ5LT5wZVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBUCBkaWQgbm90IHJlc3BvbmQgdG8gUHJvYmUgUmVxdWVzdC4gVGVhciBkb3duIGxpbmsgd2l0aCBpdC4qLworICAgICAgICAgICAgICAgICAgICAgICAgbGltVGVhckRvd25MaW5rV2l0aEFwKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+cGVTZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9CRUFDT05fTUlTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltUHJvYmVGYWlsdXJlQWZ0ZXJIQmZhaWxlZENudCsrIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vIHJlc3RhcnQgaGVhcnRiZWF0IHRpbWVyCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlVuZXhwZWN0ZWQgd3QtcHJvYmUtdGltZW91dCBpbiBzdGF0ZSBcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgbGltUHJpbnRNbG1TdGF0ZShwTWFjLCBMT0dFLCBwc2Vzc2lvbkVudHJ5LT5saW1NbG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGxpbVJlYWN0aXZhdGVIZWFydEJlYXRUaW1lcihwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBEZWFjdGl2YXRlIFRpbWVyIFByb2JlQWZ0ZXJIQiBUaW1lciAtPiBBcyBpdHMgYSBvbmVzaG90IHRpbWVyLCBuZWVkIG5vdCBkZWFjdGl2YXRlIHRoZSB0aW1lciAqLworICAgIC8vIHR4X3RpbWVyX2RlYWN0aXZhdGUoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbVByb2JlQWZ0ZXJIQlRpbWVyKTsKK30KKworCisvKgorKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlcmUgd2lsbCBub3QgYmUgbW9yZSB0aGFuIG9uZSBJQlNTIHNlc3Npb24gYWN0aXZlIGF0IGFueSB0aW1lLgorKi8KK3RwUEVTZXNzaW9uIGxpbUlzSUJTU1Nlc3Npb25BY3RpdmUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1U4IGk7CisgICAKKyAgICBmb3IoaSA9MDtpIDwgcE1hYy0+bGltLm1heEJzc0lkO2krKykKKyAgICB7CisgICAgICAgIGlmKCAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS52YWxpZCkgJiYKKyAgICAgICAgICAgICAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkpCisgICAgICAgICAgICAgcmV0dXJuICgmcE1hYy0+bGltLmdwU2Vzc2lvbltpXSk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RwUEVTZXNzaW9uIGxpbUlzQXBTZXNzaW9uQWN0aXZlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCBpOworICAgCisgICAgZm9yKGkgPTA7aSA8IHBNYWMtPmxpbS5tYXhCc3NJZDtpKyspCisgICAgeworICAgICAgICBpZiggKHBNYWMtPmxpbS5ncFNlc3Npb25baV0udmFsaWQpICYmCisgICAgICAgICAgICAgKCAocE1hYy0+bGltLmdwU2Vzc2lvbltpXS5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkgfHwKKyAgICAgICAgICAgICAgIChwTWFjLT5saW0uZ3BTZXNzaW9uW2ldLmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9CVF9BTVBfQVBfUk9MRSkpKQorICAgICAgICAgICAgIHJldHVybiAoJnBNYWMtPmxpbS5ncFNlc3Npb25baV0pOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgICAgbGltSGFuZGxlRGVmZXJNc2dFcnJvcgorXGJyaWVmICAgIGhhbmRsZXMgZXJyb3Igc2NlbmFyaW8sIHdoZW4gdGhlIG1zZyBjYW4gbm90IGJlIGRlZmVycmVkLgorXHBhcmFtIHBNYWMKK1xwYXJhbSBwTGltTXNnIExJTSBtc2csIHdoaWNoIGNvdWxkIG5vdCBiZSBkZWZlcnJlZC4KK1xyZXR1cm4gdm9pZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGxpbUhhbmRsZURlZmVyTXNnRXJyb3IodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBMaW1Nc2cpCit7CisgICAgICBpZihTSVJfQkJfWFBPUlRfTUdNVF9NU0cgPT0gcExpbU1zZy0+dHlwZSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCgodm9zX3BrdF90KilwTGltTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZihwTGltTXNnLT5ib2R5cHRyICE9IE5VTEwpCisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTGltTXNnLT5ib2R5cHRyKTsKKworfQorCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICBsaW1EaWFnRXZlbnRSZXBvcnQKK1xicmllZiBUaGlzIGZ1bmN0aW9uIHJlcG9ydHMgRGlhZyBldmVudCAKK1xwYXJhbSBwTWFjCitccGFyYW0gZXZlbnRUeXBlCitccGFyYW0gYnNzaWQKK1xwYXJhbSBzdGF0dXMKK1xwYXJhbSByZWFzb25Db2RlCitccmV0dXJuIHZvaWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbGltRGlhZ0V2ZW50UmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IGV2ZW50VHlwZSwgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSwgdEFOSV9VMTYgc3RhdHVzLCB0QU5JX1UxNiByZWFzb25Db2RlKQoreworICAgIHRTaXJNYWNBZGRyIG51bGxCc3NpZCA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfREVGKHBlRXZlbnQsIHZvc19ldmVudF93bGFuX3BlX3BheWxvYWRfdHlwZSk7CisKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwZUV2ZW50LCBzaXplb2Yodm9zX2V2ZW50X3dsYW5fcGVfcGF5bG9hZF90eXBlKSk7CisKKyAgICBpZiAoTlVMTCA9PSBwU2Vzc2lvbkVudHJ5KQorICAgIHsKKyAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBlRXZlbnQuYnNzaWQsIG51bGxCc3NpZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgcGVFdmVudC5zbWVfc3RhdGUgPSAodEFOSV9VMTYpcE1hYy0+bGltLmdMaW1TbWVTdGF0ZTsKKyAgICAgICBwZUV2ZW50Lm1sbV9zdGF0ZSA9ICh0QU5JX1UxNilwTWFjLT5saW0uZ0xpbU1sbVN0YXRlOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwZUV2ZW50LmJzc2lkLCBwU2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgcGVFdmVudC5zbWVfc3RhdGUgPSAodEFOSV9VMTYpcFNlc3Npb25FbnRyeS0+bGltU21lU3RhdGU7CisgICAgICAgcGVFdmVudC5tbG1fc3RhdGUgPSAodEFOSV9VMTYpcFNlc3Npb25FbnRyeS0+bGltTWxtU3RhdGU7CisgICAgfQorICAgIHBlRXZlbnQuZXZlbnRfdHlwZSA9IGV2ZW50VHlwZTsKKyAgICBwZUV2ZW50LnN0YXR1cyA9IHN0YXR1czsKKyAgICBwZUV2ZW50LnJlYXNvbl9jb2RlID0gcmVhc29uQ29kZTsKKworICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZwZUV2ZW50LCBFVkVOVF9XTEFOX1BFKTsKKyAgICByZXR1cm47Cit9CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisKK3ZvaWQgbGltUHJvY2Vzc0FkZFN0YVNlbGZSc3AodHBBbmlTaXJHbG9iYWwgcE1hYyx0cFNpck1zZ1EgbGltTXNnUSkKK3sKKworICAgdHBBZGRTdGFTZWxmUGFyYW1zICAgICAgcEFkZFN0YVNlbGZQYXJhbXM7CisgICB0U2lyTXNnUSAgICAgICAgICAgICAgICBtbWhNc2c7CisgICB0cFNpclNtZUFkZFN0YVNlbGZSc3AgICBwUnNwOworCisgICAKKyAgIHBBZGRTdGFTZWxmUGFyYW1zID0gKHRwQWRkU3RhU2VsZlBhcmFtcylsaW1Nc2dRLT5ib2R5cHRyOyAgICAKKworICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwUnNwLCBzaXplb2YodFNpclNtZUFkZFN0YVNlbGZSc3ApKSkKKyAgIHsKKyAgICAgIC8vLyBCdWZmZXIgbm90IGF2YWlsYWJsZS4gTG9nIGVycm9yCisgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNhbGwgdG8gcGFsQWxsb2NhdGVNZW1vcnkgZmFpbGVkIGZvciBBZGQgU3RhIHNlbGYgUlNQXG4iKSk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBhbFplcm9NZW1vcnkocE1hYywgKHRBTklfVTgqKXBSc3AsIHNpemVvZih0U2lyU21lQWRkU3RhU2VsZlJzcCkpOworCisgICBwUnNwLT5tZXNnVHlwZSA9IGVXTklfU01FX0FERF9TVEFfU0VMRl9SU1A7CisgICBwUnNwLT5tZXNnTGVuID0gKHRBTklfVTE2KSBzaXplb2YodFNpclNtZUFkZFN0YVNlbGZSc3ApOworICAgcFJzcC0+c3RhdHVzID0gcEFkZFN0YVNlbGZQYXJhbXMtPnN0YXR1czsKKworICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFJzcC0+c2VsZk1hY0FkZHIsIHBBZGRTdGFTZWxmUGFyYW1zLT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworCisgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXBBZGRTdGFTZWxmUGFyYW1zKTsKKworICAgbW1oTXNnLnR5cGUgPSBlV05JX1NNRV9BRERfU1RBX1NFTEZfUlNQOworICAgbW1oTXNnLmJvZHlwdHIgPSBwUnNwOworICAgbW1oTXNnLmJvZHl2YWwgPSAwOworICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbW1oTXNnLnR5cGUpKTsKKyAgIGxpbVN5c1Byb2Nlc3NNbWhNc2dBcGkocE1hYywgJm1taE1zZywgIGVQUk9UKTsKKworfQorCit2b2lkIGxpbVByb2Nlc3NEZWxTdGFTZWxmUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsdHBTaXJNc2dRIGxpbU1zZ1EpCit7CisKKyAgIHRwRGVsU3RhU2VsZlBhcmFtcyAgICAgIHBEZWxTdGFTZWxmUGFyYW1zOworICAgdFNpck1zZ1EgICAgICAgICAgICAgICAgbW1oTXNnOworICAgdHBTaXJTbWVEZWxTdGFTZWxmUnNwICAgcFJzcDsKKworICAgCisgICBwRGVsU3RhU2VsZlBhcmFtcyA9ICh0cERlbFN0YVNlbGZQYXJhbXMpbGltTXNnUS0+Ym9keXB0cjsgICAgCisKKyAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFJzcCwgc2l6ZW9mKHRTaXJTbWVEZWxTdGFTZWxmUnNwKSkpCisgICB7CisgICAgICAvLy8gQnVmZmVyIG5vdCBhdmFpbGFibGUuIExvZyBlcnJvcgorICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjYWxsIHRvIHBhbEFsbG9jYXRlTWVtb3J5IGZhaWxlZCBmb3IgQWRkIFN0YSBzZWxmIFJTUFxuIikpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwYWxaZXJvTWVtb3J5KHBNYWMsICh0QU5JX1U4KilwUnNwLCBzaXplb2YodFNpclNtZURlbFN0YVNlbGZSc3ApKTsKKworICAgcFJzcC0+bWVzZ1R5cGUgPSBlV05JX1NNRV9ERUxfU1RBX1NFTEZfUlNQOworICAgcFJzcC0+bWVzZ0xlbiA9ICh0QU5JX1UxNikgc2l6ZW9mKHRTaXJTbWVEZWxTdGFTZWxmUnNwKTsKKyAgIHBSc3AtPnN0YXR1cyA9IHBEZWxTdGFTZWxmUGFyYW1zLT5zdGF0dXM7CisKKyAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBSc3AtPnNlbGZNYWNBZGRyLCBwRGVsU3RhU2VsZlBhcmFtcy0+c2VsZk1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKworICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKilwRGVsU3RhU2VsZlBhcmFtcyk7CisKKyAgIG1taE1zZy50eXBlID0gZVdOSV9TTUVfREVMX1NUQV9TRUxGX1JTUDsKKyAgIG1taE1zZy5ib2R5cHRyID0gcFJzcDsKKyAgIG1taE1zZy5ib2R5dmFsID0gMDsKKyAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csICBlUFJPVCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB0QU5JX1U4IGxpbVVubWFwQ2hhbm5lbCh0QU5JX1U4IG1hcENoYW5uZWwpCisqIFRvIHVubWFwIHRoZSBjaGFubmVsIHRvIHJldmVyc2UgdGhlIGVmZmVjdCBvZiBtYXBwaW5nIAorKiBhIGJhbmQgY2hhbm5lbCBpbiBoYWwgLk1hcHBpbmcgd2FzIGRvbmUgaGFsIHRvIG92ZXJjb21lIHRoZQorKiBsaW1pdGF0aW9uIG9mIHRoZSByeGJkIHdoaWNoIHVzZSBvbmx5IDQgYml0IGZvciBjaGFubmVsIG51bWJlci4gIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0QU5JX1U4IGxpbVVubWFwQ2hhbm5lbCh0QU5JX1U4IG1hcENoYW5uZWwpCit7CisgICBpZiggbWFwQ2hhbm5lbCA+IDAgJiYgbWFwQ2hhbm5lbCA8IDI1ICkKKyAgICAgcmV0dXJuIGFiQ2hhbm5lbFttYXBDaGFubmVsIC0xXTsKKyAgIGVsc2UKKyAgICAgcmV0dXJuIDA7Cit9CisKKwordl9VOF90KiBsaW1HZXRJRVB0cih0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3QgKnBJZXMsIGludCBsZW5ndGgsIHZfVThfdCBlaWQsZVNpemVPZkxlbkZpZWxkIHNpemVfb2ZfbGVuX2ZpZWxkKQoreworICAgIGludCBsZWZ0ID0gbGVuZ3RoOworICAgIHZfVThfdCAqcHRyID0gcEllczsKKyAgICB2X1U4X3QgZWxlbV9pZDsKKyAgICB2X1UxNl90IGVsZW1fbGVuOworICAgCisgICAgd2hpbGUobGVmdCA+PSAoc2l6ZV9vZl9sZW5fZmllbGQrMSkpCisgICAgeyAgIAorICAgICAgICBlbGVtX2lkICA9ICBwdHJbMF07CisgICAgICAgIGlmIChzaXplX29mX2xlbl9maWVsZCA9PSBUV09fQllURSkKKyAgICAgICAgeworICAgICAgICAgICAgZWxlbV9sZW4gPSAoKHZfVTE2X3QpIHB0clsxXSkgfCAocHRyWzJdPDw4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVsZW1fbGVuID0gIHB0clsxXTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAgICAgCisgICAgICAgIGxlZnQgLT0gKHNpemVfb2ZfbGVuX2ZpZWxkKzEpOworICAgICAgICBpZihlbGVtX2xlbiA+IGxlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAiKioqKkludmFsaWQgSUVzIGVpZCA9ICVkIGVsZW1fbGVuPSVkIGxlZnQ9JWQqKioqKlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWQsZWxlbV9sZW4sbGVmdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbV9pZCA9PSBlaWQpIAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICB9CisgICAKKyAgICAgICAgbGVmdCAtPSBlbGVtX2xlbjsKKyAgICAgICAgcHRyICs9IChlbGVtX2xlbiArIChzaXplX29mX2xlbl9maWVsZCsxKSk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKiByZXR1cm4gTlVMTCBpZiBvdWkgaXMgbm90IGZvdW5kIGluIGllCisgICByZXR1cm4gIU5VTEwgcG9pbnRlciB0byB2ZW5kb3IgSUUgKHN0YXJ0aW5nIGZyb20gMHhERCkgaWYgb3VpIGlzIGZvdW5kIAorICovCit2X1U4X3QqIGxpbUdldFZlbmRvcklFT3VpUHRyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKm91aSwgdEFOSV9VOCBvdWlfc2l6ZSwgdEFOSV9VOCAqaWUsIHRBTklfVTE2IGllX2xlbikKK3sgICAKKyAgICBpbnQgbGVmdCA9IGllX2xlbjsKKyAgICB2X1U4X3QgKnB0ciA9IGllOworICAgIHZfVThfdCBlbGVtX2lkLCBlbGVtX2xlbjsKKworICAgIHdoaWxlKGxlZnQgPj0gMikKKyAgICB7CisgICAgICAgIGVsZW1faWQgID0gcHRyWzBdOworICAgICAgICBlbGVtX2xlbiA9IHB0clsxXTsKKyAgICAgICAgbGVmdCAtPSAyOworICAgICAgICBpZihlbGVtX2xlbiA+IGxlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgCisgICAgICAgICAgICAgICBGTCgiKioqKkludmFsaWQgSUVzIGVpZCA9ICVkIGVsZW1fbGVuPSVkIGxlZnQ9JWQqKioqKlxuIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtX2lkLGVsZW1fbGVuLGxlZnQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFNJUl9NQUNfRUlEX1ZFTkRPUiA9PSBlbGVtX2lkKSAKKyAgICAgICAgeworICAgICAgICAgICAgaWYobWVtY21wKCZwdHJbMl0sIG91aSwgb3VpX3NpemUpPT0wKQorICAgICAgICAgICAgICAgIHJldHVybiBwdHI7CisgICAgICAgIH0KKyAKKyAgICAgICAgbGVmdCAtPSBlbGVtX2xlbjsKKyAgICAgICAgcHRyICs9IChlbGVtX2xlbiArIDIpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKy8vUmV0dXJucyBsZW5ndGggb2YgUDJQIHN0cmVhbSBhbmQgUG9pbnRlciBpZSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBpcyBmaWxsZWQgd2l0aCBub2Egc3RyZWFtCisKK3ZfVThfdCBsaW1CdWlsZFAycEllKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKmllLCB0QU5JX1U4ICpkYXRhLCB0QU5JX1U4IGllX2xlbikKK3sKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICB0QU5JX1U4ICpwdHIgPSBpZTsgCisKKyAgICBwdHJbbGVuZ3RoKytdID0gU0lSX01BQ19FSURfVkVORE9SOworICAgIHB0cltsZW5ndGgrK10gPSBpZV9sZW4gKyBTSVJfTUFDX1AyUF9PVUlfU0laRTsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAmcHRyW2xlbmd0aF0sIFNJUl9NQUNfUDJQX09VSSwgU0lSX01BQ19QMlBfT1VJX1NJWkUpOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICZwdHJbbGVuZ3RoICsgU0lSX01BQ19QMlBfT1VJX1NJWkVdLCBkYXRhLCBpZV9sZW4pOworICAgIHJldHVybiAoaWVfbGVuICsgU0lSX1AyUF9JRV9IRUFERVJfTEVOKTsKK30KKworLy9SZXR1cm5zIGxlbmd0aCBvZiBOb0Egc3RyZWFtIGFuZCBQb2ludGVyIHBOb2FTdHJlYW0gcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gaXMgZmlsbGVkIHdpdGggbm9hIHN0cmVhbQorCit2X1U4X3QgbGltR2V0Tm9hQXR0clN0cmVhbUluTXVsdFAycEllcyh0cEFuaVNpckdsb2JhbCBwTWFjLHZfVThfdCogbm9hU3RyZWFtLHZfVThfdCBub2FMZW4sdl9VOF90IG92ZXJGbG93TGVuKQoreworICAgdl9VOF90IG92ZXJGbG93UDJwU3RyZWFtW1NJUl9NQVhfTk9BX0FUVFJfTEVOXTsKKyAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIG92ZXJGbG93UDJwU3RyZWFtLCBub2FTdHJlYW0gKyBub2FMZW4gLSBvdmVyRmxvd0xlbiwgb3ZlckZsb3dMZW4pOyAKKyAgIG5vYVN0cmVhbVtub2FMZW4gLSBvdmVyRmxvd0xlbl0gPSBTSVJfTUFDX0VJRF9WRU5ET1I7CisgICBub2FTdHJlYW1bbm9hTGVuIC0gb3ZlckZsb3dMZW4rMV0gPSBvdmVyRmxvd0xlbiArIFNJUl9NQUNfUDJQX09VSV9TSVpFOworICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgbm9hU3RyZWFtKyBub2FMZW4gLSBvdmVyRmxvd0xlbisyLFNJUl9NQUNfUDJQX09VSSxTSVJfTUFDX1AyUF9PVUlfU0laRSk7CisgICAKKyAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIG5vYVN0cmVhbSsgbm9hTGVuIC0gb3ZlckZsb3dMZW4rMitTSVJfTUFDX1AyUF9PVUlfU0laRSxvdmVyRmxvd1AycFN0cmVhbSxvdmVyRmxvd0xlbik7CisgICByZXR1cm4gKG5vYUxlbiArIFNJUl9QMlBfSUVfSEVBREVSX0xFTik7CisKK30KKworLy9SZXR1cm5zIGxlbmd0aCBvZiBOb0Egc3RyZWFtIGFuZCBQb2ludGVyIHBOb2FTdHJlYW0gcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gaXMgZmlsbGVkIHdpdGggbm9hIHN0cmVhbQordl9VOF90IGxpbUdldE5vYUF0dHJTdHJlYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90KnBOb2FTdHJlYW0sdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB2X1U4X3QgbGVuPTA7CisKKyAgICB2X1U4X3QgICAqcEJvZHkgPSBwTm9hU3RyZWFtOyAKKyAgICAKKyAgIAorICAgIGlmICAgKCAocHNlc3Npb25FbnRyeSAhPSBOVUxMKSAmJiAocHNlc3Npb25FbnRyeS0+dmFsaWQpICYmIAorICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+cGVQZXJzb25hID09IFZPU19QMlBfR09fTU9ERSkpCisgICAgeyAKKyAgICAgICBpZiAoKCEocHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMUR1cmF0aW9uKSkgJiYgKCEocHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMkR1cmF0aW9uKSkKKyAgICAgICAgICAgICYmICghcHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS5vcHBQc0ZsYWcpCisgICAgICAgICAgKQorICAgICAgICAgcmV0dXJuIDA7IC8vTm8gTm9BIERlc2NyaXB0b3IgdGhlbiByZXR1cm4gMAorCisKKyAgICAgICAgcEJvZHlbMF0gPSBTSVJfUDJQX05PQV9BVFRSOworICAgICAgICAKKyAgICAgICAgcEJvZHlbM10gPSBwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLmluZGV4OworICAgICAgICBwQm9keVs0XSA9IHBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUuY3RXaW4gfCAocHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS5vcHBQc0ZsYWc8PDcpOworICAgICAgICBsZW4gPSA1OworICAgICAgICBwQm9keSArPSBsZW47CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUudU5vYTFEdXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgKnBCb2R5ID0gcHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMUludGVydmFsQ250OyAKKyAgICAgICAgICAgIHBCb2R5ICs9IDE7CisgICAgICAgICAgICBsZW4gKz0xOworICAgICAgICAgICAgIAorICAgICAgICAgICAgKigodEFOSV9VMzIgKikocEJvZHkpKSA9IHNpclN3YXBVMzJpZk5lZWRlZChwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLnVOb2ExRHVyYXRpb24pOworICAgICAgICAgICAgcEJvZHkgICArPSBzaXplb2YodEFOSV9VMzIpOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgbGVuICs9NDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgKigodEFOSV9VMzIgKikocEJvZHkpKSA9IHNpclN3YXBVMzJpZk5lZWRlZChwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLnVOb2ExSW50ZXJ2YWwpOworICAgICAgICAgICAgcEJvZHkgICArPSBzaXplb2YodEFOSV9VMzIpOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgbGVuICs9NDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgKigodEFOSV9VMzIgKikocEJvZHkpKSA9IHNpclN3YXBVMzJpZk5lZWRlZChwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLnVOb2ExU3RhcnRUaW1lKTsKKyAgICAgICAgICAgIHBCb2R5ICAgKz0gc2l6ZW9mKHRBTklfVTMyKTsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGxlbiArPTQ7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPnAycEdvUHNVcGRhdGUudU5vYTJEdXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgKnBCb2R5ID0gcHNlc3Npb25FbnRyeS0+cDJwR29Qc1VwZGF0ZS51Tm9hMkludGVydmFsQ250OyAKKyAgICAgICAgICAgIHBCb2R5ICs9IDE7CisgICAgICAgICAgICBsZW4gKz0xOworICAgICAgICAgICAgIAorICAgICAgICAgICAgKigodEFOSV9VMzIgKikocEJvZHkpKSA9IHNpclN3YXBVMzJpZk5lZWRlZChwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLnVOb2EyRHVyYXRpb24pOworICAgICAgICAgICAgcEJvZHkgICArPSBzaXplb2YodEFOSV9VMzIpOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgbGVuICs9NDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgKigodEFOSV9VMzIgKikocEJvZHkpKSA9IHNpclN3YXBVMzJpZk5lZWRlZChwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLnVOb2EySW50ZXJ2YWwpOworICAgICAgICAgICAgcEJvZHkgICArPSBzaXplb2YodEFOSV9VMzIpOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgbGVuICs9NDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgKigodEFOSV9VMzIgKikocEJvZHkpKSA9IHNpclN3YXBVMzJpZk5lZWRlZChwc2Vzc2lvbkVudHJ5LT5wMnBHb1BzVXBkYXRlLnVOb2EyU3RhcnRUaW1lKTsKKyAgICAgICAgICAgIHBCb2R5ICAgKz0gc2l6ZW9mKHRBTklfVTMyKTsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGxlbiArPTQ7CisKKyAgICAgICAgfQorICAgIAorCisgICAgICAgIHBCb2R5ID0gcE5vYVN0cmVhbSArIDE7ICAgICAgICAgICAgCisgICAgICAgICooKHRBTklfVTE2ICopKHBCb2R5KSkgPSBzaXJTd2FwVTE2aWZOZWVkZWQobGVuLTMpOy8qb25lIGJ5dGUgZm9yIEF0dHIgYW5kIDIgYnl0ZXMgZm9yIGxlbmd0aCovCisKKyAgICAgICAgcmV0dXJuIChsZW4pOworCisgICAgfSAgICAKKyAgICByZXR1cm4gMDsKKyAgICAgICAgCit9Cit2b2lkIHBlU2V0UmVzdW1lQ2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBjaGFubmVsLCB0QU5JX1U4IGNiU3RhdGUpCit7CisKKyAgIHBNYWMtPmxpbS5nUmVzdW1lQ2hhbm5lbCA9IGNoYW5uZWw7CisgICAvL1RPRE8gOiBTYXZlIENiIFN0YXRlIGFsc28uCisKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBwZUdldFJlc3VtZUNoYW5uZWwoKSAtIFJldHVybnMgdGhlICBjaGFubmVsIG51bWJlciBmb3Igc2Nhbm5pbmcsIGZyb20gYSB2YWxpZCBzZXNzaW9uLgorCisgIFRoaXMgZnVuY3Rpb24gaXRyYXRlcyB0aGUgc2Vzc2lvbiBUYWJsZSBhbmQgcmV0dXJucyB0aGUgY2hhbm5lbCBudW1iZXIgZnJvbSBmaXJzdCB2YWxpZCBzZXNzaW9uCisgICBpZiBubyBzZXNzaW9ucyBhcmUgdmFsaWQvcHJlc2VudCAgaXQgcmV0dXJucyB6ZXJvCisgICAgCisgIFxwYXJhbSBwTWFjICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAtIGNoYW5uZWwgdG8gc2NhbiBmcm9tIHZhbGlkIHNlc3Npb24gZWxzZSB6ZXJvLgorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RBTklfVTggcGVHZXRSZXN1bWVDaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMpCisKK3sKKworICAgIC8vUmF0aW9uYWxlIC0gdGhpcyBjb3VsZCBiZSB0aGUgc3VzcGVuZC9yZXN1bWUgZm9yIGFzc29jIGFuZCBpdCBpcyBlc3NlbnRpYWwgdGhhdAorICAgIC8vdGhlIG5ldyBCU1MgaXMgYWN0aXZlIGZvciBzb21lIHRpbWUuIE90aGVyIEJTUyB3YXMgYW55d2F5IHN1c3BlbmRlZC4KKyAgICAvL1RPRE86IENvbWV1cCB3aXRoIGEgYmV0dGVyIGFsdGVybmF0aXZlLiBTZW5kaW5nIE5VTEwgd2l0aCBQTT0wIG9uIG90aGVyIEJTUyBtZWFucworICAgIC8vdGhlcmUgd2lsbCBiZSB0cm91YmxlLiBCdXQgc2luY2UgaXQgaXMgc2VudCBvbiBjdXJyZW50IGNoYW5uZWwsIGl0IHdpbGwgYmUgbWlzc2VkIGJ5IHBlZXIKKyAgICAvL2FuZCBoZW5jZSBzaHB1bGQgYmUgb2suIE5lZWQgdG8gZGlzY3VzcyB0aGlzIGZ1cnRoZXIKKyAgICBpZiggIUlTX01DQ19TVVBQT1JURUQgKSAgICAKKyAgICB7CisgICAgICAgIC8vR2V0IGN1cnJlbnQgYWN0aXZlIHNlc3Npb24gY2hhbm5lbAorICAgICAgICByZXR1cm4gcGVHZXRBY3RpdmVTZXNzaW9uQ2hhbm5lbChwTWFjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBNYWMtPmxpbS5nUmVzdW1lQ2hhbm5lbDsKKyAgICB9CisKK30KKworI2VuZGlmCisKK3RBTklfQk9PTEVBTiBsaW1Jc2Nvbm5lY3RlZE9uREZTQ2hhbm5lbCh0QU5JX1U4IGN1cnJlbnRDaGFubmVsKQoreworICAgIGlmKE5WX0NIQU5ORUxfREZTID09IHZvc19udl9nZXRDaGFubmVsRW5hYmxlZFN0YXRlKGN1cnJlbnRDaGFubmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVV0aWxzLmggYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4MzcwYQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltVXRpbHMuaApAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIGxpbVV0aWxzLmggY29udGFpbnMgdGhlIHV0aWxpdHkgZGVmaW5pdGlvbnMKKyAqIExJTSB1c2VzLgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTMvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9fTElNX1VUSUxTX0gKKyNkZWZpbmUgX19MSU1fVVRJTFNfSAorCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAic2lyRGVidWcuaCIKKyNpbmNsdWRlICJjZmdBcGkuaCIKKworI2luY2x1ZGUgImxpbVR5cGVzLmgiCisjaW5jbHVkZSAibGltU2NhblJlc3VsdFV0aWxzLmgiCisjaW5jbHVkZSAibGltVGltZXJVdGlscy5oIgorI2luY2x1ZGUgImxpbVRyYWNlLmgiCit0eXBlZGVmIGVudW0KK3sKKyAgICBPTkVfQllURSAgID0gMSwKKyAgICBUV09fQllURSAgID0gMgorfSBlU2l6ZU9mTGVuRmllbGQ7CisKKyNkZWZpbmUgTElNX1NUQV9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEZGCisjZGVmaW5lIExJTV9BSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBMSU1fU1BFQ1RSVU1fTUFOQUdFTUVOVF9CSVRfTUFTSyAgICAgICAgICAweDAxMDAKKworLy8gY2xhc3NpZmllciBJRCBpcyBjb2RlZCBhcyAwLTM6IHRzaWQsIDQtNTpkaXJlY3Rpb24KKyNkZWZpbmUgTElNX01BS0VfQ0xTSUQodHNpZCwgZGlyKSAoKCh0c2lkKSAmIDB4MEYpIHwgKCgoZGlyKSAmIDB4MDMpIDw8IDQpKQorCisjZGVmaW5lIExJTV9TRVRfU1RBX0JBX1NUQVRFKHBTdGEsIHRpZCwgbmV3VmFsKSBcCit7XAorICAgIHBTdGEtPmJhU3RhdGUgPSAoKHBTdGEtPmJhU3RhdGUgfCAoMHgzIDw8IHRpZCoyKSkgJiAoKG5ld1ZhbCA8PCB0aWQqMikgfCB+KDB4MyA8PCB0aWQqMikpKTtcCit9CisKKyNkZWZpbmUgTElNX0dFVF9TVEFfQkFfU1RBVEUocFN0YSwgdGlkLCBwQ3VyVmFsKVwKK3tcCisgICAgKnBDdXJWYWwgPSAodExpbUJBU3RhdGUpKCgocFN0YS0+YmFTdGF0ZSA+PiB0aWQqMikgJiAweDMpKTtcCit9CisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQordHlwZWRlZiBzdHJ1Y3Qgc0FkZEJhSW5mbworeworICAgIHRBTklfVTE2IGZCYUVuYWJsZSA6IDE7CisgICAgdEFOSV9VMTYgc3RhcnRpbmdTZXFOdW06IDEyOworICAgIHRBTklfVTE2IHJlc2VydmVkIDogMzsKK310QWRkQmFJbmZvLCAqdHBBZGRCYUluZm87CisKK3R5cGVkZWYgc3RydWN0IHNBZGRCYUNhbmRpZGF0ZQoreworICAgIHRTaXJNYWNBZGRyIHN0YUFkZHI7CisgICAgdEFkZEJhSW5mbyBiYUluZm9bU1RBQ0ZHX01BWF9UQ107Cit9dEFkZEJhQ2FuZGlkYXRlLCAqdHBBZGRCYUNhbmRpZGF0ZTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworLy8gTElNIHV0aWxpbGl0eSBmdW5jdGlvbnMKK3ZvaWQgbGltR2V0QnNzaWRGcm9tUGt0KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4ICosIHRBTklfVTggKiwgdEFOSV9VMzIgKik7CitjaGFyICogbGltTWxtU3RhdGVTdHIodExpbU1sbVN0YXRlcyBzdGF0ZSk7CitjaGFyICogbGltU21lU3RhdGVTdHIodExpbVNtZVN0YXRlcyBzdGF0ZSk7CitjaGFyICogbGltTXNnU3RyKHRBTklfVTMyIG1zZ1R5cGUpOworY2hhciAqIGxpbVJlc3VsdENvZGVTdHIodFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUpOworY2hhciogbGltRG90MTFNb2RlU3RyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggZG90MTFNb2RlKTsKK2NoYXIqIGxpbVN0YU9wUmF0ZU1vZGVTdHIodFN0YVJhdGVNb2RlIG9wUmF0ZU1vZGUpOwordm9pZCBsaW1QcmludE1sbVN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IGxvZ0xldmVsLCB0TGltTWxtU3RhdGVzIHN0YXRlKTsKK3ZvaWQgbGltUHJpbnRTbWVTdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBsb2dMZXZlbCwgdExpbVNtZVN0YXRlcyBzdGF0ZSk7Cit2b2lkIGxpbVByaW50TXNnTmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBsb2dMZXZlbCwgdEFOSV9VMzIgbXNnVHlwZSk7Cit2b2lkIGxpbVByaW50TXNnSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBsb2dMZXZlbCwgdFNpck1zZ1EgKm1zZyk7CitjaGFyKiBsaW1Cc3NUeXBlU3RyKHRTaXJCc3NUeXBlIGJzc1R5cGUpOworCisjaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fQ0NYIHx8IGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbGltU2VuZFNldE1heFR4UG93ZXJSZXEgKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UG93ZXJkQm0gdHhQb3dlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSApOworZXh0ZXJuIHRBTklfVTggbGltR2V0TWF4VHhQb3dlcih0UG93ZXJkQm0gcmVnTWF4LCB0UG93ZXJkQm0gYXBUeFBvd2VyKTsKKyNlbmRpZgorCit0QU5JX1UzMiAgICAgICAgICAgIGxpbVBvc3RNc2dBcGlOb1dhaXQodHBBbmlTaXJHbG9iYWwsIHRTaXJNc2dRICopOwordEFOSV9VOCAgICAgICAgICAgbGltSXNBZGRyQkModFNpck1hY0FkZHIpOwordEFOSV9VOCAgICAgICAgICAgbGltSXNHcm91cEFkZHIodFNpck1hY0FkZHIpOworCisvLyBjaGVjayBmb3IgdHlwZSBvZiBzY2FuIGFsbG93ZWQKK3RBTklfVTggbGltQWN0aXZlU2NhbkFsbG93ZWQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgpOworCisvLyBBSUQgcG9vbCBtYW5hZ2VtZW50IGZ1bmN0aW9ucwordm9pZCAgICBsaW1Jbml0QUlEcG9vbCh0cEFuaVNpckdsb2JhbCx0cFBFU2Vzc2lvbik7Cit0QU5JX1UxNiAgICAgbGltQXNzaWduQUlEKHRwQW5pU2lyR2xvYmFsKTsKKwordm9pZCBsaW1FbmFibGVPdmVybGFwMTFnUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLCB0cFNpck1hY01nbXRIZHIgcE1oLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1VcGRhdGVPdmVybGFwU3RhUGFyYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgYnNzSWQsIHRwTGltUHJvdFN0YVBhcmFtcyBwU3RhUGFyYW1zKTsKK3ZvaWQgbGltVXBkYXRlU2hvcnRQcmVhbWJsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbVVwZGF0ZVNob3J0U2xvdFRpbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCisvKgorICogVGhlIGJlbG93ICdwcm9kdWN0JyBjaGVjayB0b2JlIHJlbW92ZWQgaWYgJ0Fzc29jaWF0aW9uJyBpcworICogYWxsb3dlZCBpbiBJQlNTLgorICovCit2b2lkICAgIGxpbVJlbGVhc2VBSUQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTE2KTsKKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorLy8gTElNIGluZm9ybXMgV1NNIHRoYXQgcmFkYXIgaXMgZGV0ZWN0ZWQKK3ZvaWQgbGltRGV0ZWN0UmFkYXIodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICopOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCit2b2lkIGxpbURlY2lkZUFwUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwgIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24pOwordm9pZAorbGltRGVjaWRlQXBQcm90ZWN0aW9uT25EZWxldGUodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cERwaEhhc2hOb2RlIHBTdGFEcywgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisjZWxzZQordm9pZCBsaW1EZWNpZGVBcFByb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgcGVlck1hY0FkZHIsICB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zKTsKKyNlbmRpZgorCitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1FbmFibGUxMWFQcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggZW5hYmxlLCB0QU5JX1U4IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24pOworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbGltRW5hYmxlMTFnUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGVuYWJsZSwgdEFOSV9VOCBvdmVybGFwLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbGltRW5hYmxlSHRQcm90ZWN0aW9uRnJvbTExZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGVuYWJsZSwgdEFOSV9VOCBvdmVybGFwLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbGltRW5hYmxlSFQyMFByb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBlbmFibGUsIHRBTklfVTggb3ZlcmxhcCwgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcyx0cFBFU2Vzc2lvbiBzZXNzaW9uRW50cnkpOworZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbGltRW5hYmxlSFROb25HZlByb3RlY3Rpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBlbmFibGUsIHRBTklfVTggb3ZlcmxhcCwgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcyx0cFBFU2Vzc2lvbik7CitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1FbmFibGVIdFJpZnNQcm90ZWN0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggZW5hYmxlLCB0QU5JX1U4IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1FbmFibGVIVExzaWdUeG9wUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGVuYWJsZSwgdEFOSV9VOCBvdmVybGFwLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLHRwUEVTZXNzaW9uKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1FbmFibGVTaG9ydFByZWFtYmxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggZW5hYmxlLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKyNlbHNlCitleHRlcm4gdFNpclJldFN0YXR1cyBsaW1FbmFibGVTaG9ydFByZWFtYmxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggZW5hYmxlLCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zKTsKKyNlbmRpZgorZXh0ZXJuIHRTaXJSZXRTdGF0dXMgbGltRW5hYmxlSHRPQlNTUHJvdGVjdGlvbiAodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBlbmFibGUsICB0QU5JX1U4IG92ZXJsYXAsIHRwVXBkYXRlQmVhY29uUGFyYW1zIHBCZWFjb25QYXJhbXMsIHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltRGVjaWRlU3RhUHJvdGVjdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNjaEJlYWNvblN0cnVjdCBwQmVhY29uU3RydWN0LCB0cFVwZGF0ZUJlYWNvblBhcmFtcyBwQmVhY29uUGFyYW1zLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltRGVjaWRlU3RhUHJvdGVjdGlvbk9uQXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTY2hCZWFjb25TdHJ1Y3QgcEJlYWNvblN0cnVjdCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit2b2lkIGxpbVVwZGF0ZVN0YVJ1blRpbWVIVFN3aXRjaENobmxQYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdERvdDExZklFSFRJbmZvICogcEhUSW5mbywgdEFOSV9VOCBic3NJZHgsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworLy8gUHJpbnQgTUFDIGFkZHJlc3MgdXRpbGl0eSBmdW5jdGlvbgordm9pZCAgICBsaW1QcmludE1hY0FkZHIodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNBZGRyLCB0QU5JX1U4KTsKKworCisKKy8vIERlZmVycmVkIE1lc3NhZ2UgUXVldWUgcmVhZC93cml0ZQordEFOSV9VOCBsaW1Xcml0ZURlZmVycmVkTXNnUSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKTsKK3RTaXJNc2dRKiBsaW1SZWFkRGVmZXJyZWRNc2dRKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBsaW1IYW5kbGVEZWZlck1zZ0Vycm9yKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTGltTXNnKTsKKworLy8gRGVmZXJyZWQgTWVzc2FnZSBRdWV1ZSBSZXNldAordm9pZCBsaW1SZXNldERlZmVycmVkTXNnUSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKwordFNpclJldFN0YXR1cyBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHRwQW5pU2lyR2xvYmFsLCB0U2lyTXNnUSosIHRBTklfVTgpOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordm9pZCBsaW1IYW5kbGVVcGRhdGVPbGJjQ2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisjZW5kaWYKKwordEFOSV9VOCBsaW1Jc051bGxTc2lkKCB0U2lyTWFjU1NpZCAqcFNzaWQgKTsKKwordm9pZCBsaW1Qcm9jZXNzQWRkdHNSc3BUaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHBhcmFtKTsKKworLy8gMTFoIFN1cHBvcnQKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCit0QU5JX1UzMiBjb21wdXRlQ2hhbm5lbFN3aXRjaENvdW50KHRwQW5pU2lyR2xvYmFsLCB0QU5JX1UzMik7CisjZW5kaWYKK3ZvaWQgbGltU3RvcFR4QW5kU3dpdGNoQ2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IHNlc3Npb25JZCk7Cit2b2lkIGxpbVByb2Nlc3NDaGFubmVsU3dpdGNoVGltZW91dCh0cEFuaVNpckdsb2JhbCk7Cit0U2lyUmV0U3RhdHVzIGxpbVN0YXJ0Q2hhbm5lbFN3aXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltVXBkYXRlQ2hhbm5lbFN3aXRjaCh0cEFuaVNpckdsb2JhbCwgdHBTaXJQcm9iZVJlc3BCZWFjb24sIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1Qcm9jZXNzUXVpZXRUaW1lb3V0KHRwQW5pU2lyR2xvYmFsKTsKK3ZvaWQgbGltUHJvY2Vzc1F1aWV0QnNzVGltZW91dCh0cEFuaVNpckdsb2JhbCk7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjaWYgMAordm9pZCBsaW1Qcm9jZXNzV1BTT3ZlcmxhcFRpbWVvdXQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisjZW5kaWYKKyNlbmRpZgorCit2b2lkIGxpbVN0YXJ0UXVpZXRUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IHNlc3Npb25JZCk7Cit2b2lkIGxpbVVwZGF0ZVF1aWV0SUVGcm9tQmVhY29uKHRwQW5pU2lyR2xvYmFsLCB0RG90MTFmSUVRdWlldCAqLCB0cFBFU2Vzc2lvbik7Cit2b2lkIGxpbUdldEh0Q2JBZG1pblN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRUhUQ2FwcyBodENhcHMsIHRBTklfVTggKiB0aXRhbkh0Q2Fwcyk7Cit2b2lkIGxpbUdldEh0Q2JPcFN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRUhUSW5mbyBodEluZm8sIHRBTklfVTggKiB0aXRhbkh0Q2Fwcyk7Cit2b2lkIGxpbVN3aXRjaFByaW1hcnlDaGFubmVsKHRwQW5pU2lyR2xvYmFsLCB0QU5JX1U4LHRwUEVTZXNzaW9uKTsKK3ZvaWQgbGltU3dpdGNoUHJpbWFyeVNlY29uZGFyeUNoYW5uZWwodHBBbmlTaXJHbG9iYWwsIHRBTklfVTgsIHRBbmlDQlNlY29uZGFyeU1vZGUpOwordEFuaUJvb2wgbGltVHJpZ2dlckJhY2tncm91bmRTY2FuRHVyaW5nUXVpZXRCc3ModHBBbmlTaXJHbG9iYWwpOwordm9pZCBsaW1VcGRhdGVTdGFSdW5UaW1lSFRTd3RpY2hDaG5sUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRUhUSW5mbyAqcFJjdmRIVEluZm8sIHRBTklfVTggYnNzSWR4KTsKK3ZvaWQgbGltVXBkYXRlU3RhUnVuVGltZUhUQ2FwYWJpbGl0eSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVIVENhcHMgKnBIVENhcHMpOwordm9pZCBsaW1VcGRhdGVTdGFSdW5UaW1lSFRJbmZvKHN0cnVjdCBzQW5pU2lyR2xvYmFsICpwTWFjLCB0RG90MTFmSUVIVEluZm8gKnBSY3ZkSFRJbmZvLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltQ2FuY2VsRG90MTFoQ2hhbm5lbFN3aXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltQ2FuY2VsRG90MTFoUXVpZXQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit0QW5pQm9vbCBsaW1Jc0NoYW5uZWxWYWxpZEZvckNoYW5uZWxTd2l0Y2godHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjaGFubmVsKTsKK3ZvaWQgbGltRnJhbWVUcmFuc21pc3Npb25Db250cm9sKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaW1RdWlldFR4TW9kZSB0eXBlLCB0TGltQ29udHJvbFR4IG1vZGUpOwordFNpclJldFN0YXR1cyBsaW1SZXN0b3JlUHJlQ2hhbm5lbFN3aXRjaFN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordFNpclJldFN0YXR1cyBsaW1SZXN0b3JlUHJlUXVpZXRTdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKwordm9pZCBsaW1QcmVwYXJlRm9yMTFoQ2hhbm5lbFN3aXRjaCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3ZvaWQgbGltU3dpdGNoQ2hhbm5lbENiYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgc3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpkYXRhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworc3RhdGljIGlubGluZSB0U2lyUkZCYW5kIGxpbUdldFJGQmFuZCh0QU5JX1U4IGNoYW5uZWwpCit7CisgICAgaWYgKChjaGFubmVsID49IFNJUl8xMUFfQ0hBTk5FTF9CRUdJTikgJiYKKyAgICAgICAgKGNoYW5uZWwgPD0gU0lSXzExQV9DSEFOTkVMX0VORCkpCisgICAgICAgIHJldHVybiBTSVJfQkFORF81X0dIWjsKKworICAgIGlmICgoY2hhbm5lbCA+PSBTSVJfMTFCX0NIQU5ORUxfQkVHSU4pICYmCisgICAgICAgIChjaGFubmVsIDw9IFNJUl8xMUJfQ0hBTk5FTF9FTkQpKQorICAgICAgICByZXR1cm4gU0lSX0JBTkRfMl80X0dIWjsKKworICAgIHJldHVybiBTSVJfQkFORF9VTktOT1dOOworfQorCisKK3N0YXRpYyBpbmxpbmUgdFNpclJldFN0YXR1cworbGltR2V0TWdtdFN0YWlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2ICpzdGFpZCwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgICpzdGFpZCA9IDE7CisgICAgZWxzZSBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKQorICAgICAgICAqc3RhaWQgPSAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdEFOSV9VOAorbGltSXNTeXN0ZW1JblNldE1pbW9wc1N0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgaWYgKHBNYWMtPmxpbS5nTGltTWxtU3RhdGUgPT0gZUxJTV9NTE1fV1RfU0VUX01JTU9QU19TVEFURSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorICAgICAgICAKK3N0YXRpYyBpbmxpbmUgdEFOSV9VOAorIGlzRW50ZXJpbmdNaW1vUFModFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIGN1clN0YXRlLCB0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUgbmV3U3RhdGUpCisgeworICAgIGlmIChjdXJTdGF0ZSA9PSBlU0lSX0hUX01JTU9fUFNfTk9fTElNSVQgJiYKKyAgICAgICAgKG5ld1N0YXRlID09IGVTSVJfSFRfTUlNT19QU19EWU5BTUlDIHx8bmV3U3RhdGUgPT0gZVNJUl9IVF9NSU1PX1BTX1NUQVRJQykpCisgICAgICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKK30KKworLy8vIEFOSSBwZWVyIHN0YXRpb24gY291bnQgbWFuYWdlbWVudCBhbmQgYXNzb2NpYXRlZCBhY3Rpb25zCit2b2lkIGxpbVV0aWxDb3VudFN0YUFkZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cERwaEhhc2hOb2RlIHBTdGEsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1VdGlsQ291bnRTdGFEZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBEcGhIYXNoTm9kZSBwU3RhLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3RBTklfVTggbGltR2V0SFRDYXBhYmlsaXR5KCB0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIsIHRwUEVTZXNzaW9uKTsKKyNlbHNlCit0QU5JX1U4IGxpbUdldEhUQ2FwYWJpbGl0eSggdHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyICk7CisjZW5kaWYKK3ZvaWQgbGltVHhDb21wbGV0ZSggdEhhbEhhbmRsZSBoSGFsLCB2b2lkICpwRGF0YSApOworCisvKioqKioqKioqKkFkbWl0IENvbnRyb2wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vY2FsbGJhY2sgZnVuY3Rpb24gZm9yIEhBTCB0byBpc3N1ZSBEZWxUUyByZXF1ZXN0IHRvIFBFLgorLy9UaGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmVnaXN0ZXJlZCB3aXRoIEhBTCBmb3IgY2FsbGJhY2sgd2hlbiBUU1BFQyBpbmFjdGl2aXR5IHRpbWVyIGZpcmVzLgorCit2b2lkIGxpbVByb2Nlc3NEZWxUc0luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKTsKK3RTaXJSZXRTdGF0dXMgbGltUHJvY2Vzc0hhbEluZE1lc3NhZ2VzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIG1lc2dJZCwgdm9pZCAqbWVzZ1BhcmFtICk7Cit0U2lyUmV0U3RhdHVzIGxpbVZhbGlkYXRlRGVsdHNSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJEZWx0c1JlcSBwRGVsdHNSZXEsIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vY2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0cmF0aW9uIHRvIEhBTCBmb3IgYW55IGluZGljYXRpb24uCit2b2lkIGxpbVJlZ2lzdGVySGFsSW5kQ2FsbEJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGxpbVBrdEZyZWUgKAorICAgIHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgIGVGcmFtZVR5cGUgICAgICBmcm1UeXBlLAorICAgIHRBTklfVTggICAgICAgICAqcEJELAorICAgIHZvaWQgICAgICAgICAgICAqYm9keSk7CisKKworCit2b2lkIGxpbUdldEJEZnJvbVJ4UGFja2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKmJvZHksIHRBTklfVTMyICoqcEJEKTsKKworLyoqCisgKiBcYnJpZWYgR2l2ZW4gYSBiYXNlKFgpIGFuZCBwb3dlcihZKSwgdGhpcyBBUEkgd2lsbCByZXR1cm4KKyAqIHRoZSByZXN1bHQgb2YgYmFzZSByYWlzZWQgdG8gcG93ZXIgLSAoWCBeIFkpCisgKgorICogXHNhIHV0aWxzUG93ZXJYWQorICoKKyAqIFxwYXJhbSBiYXNlIEJhc2UgdmFsdWUKKyAqCisgKiBccGFyYW0gcG93ZXIgQmFzZSByYWlzZWQgdG8gdGhpcyBQb3dlciB2YWx1ZQorICoKKyAqIFxyZXR1cm4gUmVzdWx0IG9mIFheWQorICoKKyAqLworc3RhdGljIGlubGluZSB0QU5JX1UzMiB1dGlsc1Bvd2VyWFkoIHRBTklfVTE2IGJhc2UsIHRBTklfVTE2IHBvd2VyICkKK3sKK3RBTklfVTMyIHJlc3VsdCA9IDEsIGk7CisKKyAgZm9yKCBpID0gMDsgaSA8IHBvd2VyOyBpKysgKQorICAgIHJlc3VsdCAqPSBiYXNlOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworCit0U2lyUmV0U3RhdHVzIGxpbVBvc3RNbG1BZGRCQVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlIHBTdGFEcywKKyAgICB0QU5JX1U4IHRpZCwgdEFOSV9VMTYgc3RhcnRpbmdTZXFOdW0sdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit0U2lyUmV0U3RhdHVzIGxpbVBvc3RNbG1BZGRCQVJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwKKyAgICB0U2lyTWFjU3RhdHVzQ29kZXMgYmFTdGF0dXNDb2RlLAorICAgIHRBTklfVTggYmFEaWFsb2dUb2tlbiwKKyAgICB0QU5JX1U4IGJhVElELAorICAgIHRBTklfVTggYmFQb2xpY3ksCisgICAgdEFOSV9VMTYgYmFCdWZmZXJTaXplLAorICAgIHRBTklfVTE2IGJhVGltZW91dCwKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3RTaXJSZXRTdGF0dXMgbGltUG9zdE1sbURlbEJBUmVxKCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHRwRHBoSGFzaE5vZGUgcFN0YSwKKyAgICB0QU5JX1U4IGJhRGlyZWN0aW9uLAorICAgIHRBTklfVTggYmFUSUQsCisgICAgdFNpck1hY1JlYXNvbkNvZGVzIGJhUmVhc29uQ29kZSAsCisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit0U2lyUmV0U3RhdHVzIGxpbVBvc3RNc2dBZGRCQVJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlIHBTdGEsCisgICAgdEFOSV9VOCBiYURpYWxvZ1Rva2VuLAorICAgIHRBTklfVTggYmFUSUQsCisgICAgdEFOSV9VOCBiYVBvbGljeSwKKyAgICB0QU5JX1UxNiBiYUJ1ZmZlclNpemUsCisgICAgdEFOSV9VMTYgYmFUaW1lb3V0LAorICAgIHRBTklfVTE2IGJhU1NOLAorICAgIHRBTklfVTggYmFEaXJlY3Rpb24sCisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7Cit0U2lyUmV0U3RhdHVzIGxpbVBvc3RNc2dEZWxCQUluZCggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0cERwaEhhc2hOb2RlIHBTdGEsCisgICAgdEFOSV9VOCBiYVRJRCwKKyAgICB0QU5JX1U4IGJhRGlyZWN0aW9uLAorICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit0U2lyUmV0U3RhdHVzIGxpbVBvc3RTTVN0YXRlVXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgdEFOSV9VMTYgU3RhSWR4LCAKKyAgICB0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUgTUlNT1BTU3RhdGUpOworCit2b2lkIGxpbURlbGV0ZVN0YUNvbnRleHQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZyk7Cit2b2lkIGxpbVByb2Nlc3NBZGRCYUluZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKTsKK3ZvaWQgbGltRGVsQWxsQkFTZXNzaW9ucyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgbGltRGVsZXRlRGlhbG9ndWVUb2tlbkxpc3QodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit0U2lyUmV0U3RhdHVzIGxpbVNlYXJjaEFuZERlbGV0ZURpYWxvZ3VlVG9rZW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCB0b2tlbiwgdEFOSV9VMTYgYXNzb2NJZCwgdEFOSV9VMTYgdGlkKTsKK3ZvaWQgbGltUmVzc2V0U2NhbkNoYW5uZWxJbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBsaW1BZGRTY2FuQ2hhbm5lbEluZm8odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjaGFubmVsSWQpOworCit0QU5JX1U4IGxpbUdldENoYW5uZWxGcm9tQmVhY29uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2NoQmVhY29uU3RydWN0IHBCZWFjb24pOwordFNpck53VHlwZSBsaW1HZXROd1R5cGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjaGFubmVsTnVtLCB0QU5JX1UzMiB0eXBlLCB0cFNjaEJlYWNvblN0cnVjdCBwQmVhY29uKTsKK3ZvaWQgbGltU2V0VHNwZWNVYXBzZE1hc2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY1RTSW5mbyAqcFRzSW5mbywgdEFOSV9VMzIgYWN0aW9uKTsKK3ZvaWQgbGltSGFuZGxlSGVhcnRCZWF0VGltZW91dCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKy8vdm9pZCBsaW1Qcm9jZXNzQnRhbXBBZGRCc3NSc3AodHBBbmlTaXJHbG9iYWwgcE1hYyx0cFNpck1zZ1EgcE1zZ1EsdHBQRVNlc3Npb24gcGVTZXNzaW9uKTsKK3ZvaWQgbGltUHJvY2Vzc0FkZFN0YVJzcCh0cEFuaVNpckdsb2JhbCBwTWFjLHRwU2lyTXNnUSBwTXNnUSk7CisKK3ZvaWQgbGltVXBkYXRlQmVhY29uKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCit2b2lkIGxpbVByb2Nlc3NCdEFtcEFwTWxtQWRkU3RhUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsdHBTaXJNc2dRIGxpbU1zZ1EsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOwordm9pZCBsaW1Qcm9jZXNzQnRBbXBBcE1sbURlbEJzc1JzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKK3ZvaWQgbGltUHJvY2Vzc0J0QW1wQXBNbG1EZWxTdGFSc3AodHBBbmlTaXJHbG9iYWwgcE1hYyx0cFNpck1zZ1EgbGltTXNnUSx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KTsKK3RwUEVTZXNzaW9uICBsaW1Jc0lCU1NTZXNzaW9uQWN0aXZlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordHBQRVNlc3Npb24gbGltSXNBcFNlc3Npb25BY3RpdmUodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGxpbUhhbmRsZUhlYXJ0QmVhdEZhaWx1cmVUaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCit2b2lkIGxpbVByb2Nlc3NEZWxTdGFTZWxmUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsdHBTaXJNc2dRIGxpbU1zZ1EpOwordm9pZCBsaW1Qcm9jZXNzQWRkU3RhU2VsZlJzcCh0cEFuaVNpckdsb2JhbCBwTWFjLHRwU2lyTXNnUSBsaW1Nc2dRKTsKK3ZfVThfdCogbGltR2V0SUVQdHIodHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90ICpwSWVzLCBpbnQgbGVuZ3RoLCB2X1U4X3QgZWlkLGVTaXplT2ZMZW5GaWVsZCBzaXplX29mX2xlbl9maWVsZCk7CisKK3RBTklfVTggbGltVW5tYXBDaGFubmVsKHRBTklfVTggbWFwQ2hhbm5lbCk7CisKKyNkZWZpbmUgbGltR2V0V3NjSUVQdHIocE1hYywgaWUsIGllX2xlbikgXAorICAgIGxpbUdldFZlbmRvcklFT3VpUHRyKHBNYWMsIFNJUl9NQUNfV1NDX09VSSwgU0lSX01BQ19XU0NfT1VJX1NJWkUsIGllLCBpZV9sZW4pCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisjZGVmaW5lIGxpbUdldFAycElFUHRyKHBNYWMsIGllLCBpZV9sZW4pIFwKKyAgICBsaW1HZXRWZW5kb3JJRU91aVB0cihwTWFjLCBTSVJfTUFDX1AyUF9PVUksIFNJUl9NQUNfUDJQX09VSV9TSVpFLCBpZSwgaWVfbGVuKQorCit2X1U4X3QgbGltR2V0Tm9hQXR0clN0cmVhbUluTXVsdFAycEllcyh0cEFuaVNpckdsb2JhbCBwTWFjLHZfVThfdCogbm9hU3RyZWFtLHZfVThfdCBub2FMZW4sdl9VOF90IG92ZXJGbG93TGVuKTsKK3ZfVThfdCBsaW1HZXROb2FBdHRyU3RyZWFtKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCpwTm9hU3RyZWFtLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpOworCit2X1U4X3QgbGltQnVpbGRQMnBJZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICppZSwgdEFOSV9VOCAqZGF0YSwgdEFOSV9VOCBpZV9sZW4pOworI2VuZGlmCit2X1U4X3QqIGxpbUdldFZlbmRvcklFT3VpUHRyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKm91aSwgdEFOSV9VOCBvdWlfc2l6ZSwgdEFOSV9VOCAqaWUsIHRBTklfVTE2IGllX2xlbik7Cit0QU5JX0JPT0xFQU4gbGltSXNjb25uZWN0ZWRPbkRGU0NoYW5uZWwodEFOSV9VOCBjdXJyZW50Q2hhbm5lbCk7Cit0QU5JX1U4IGxpbUdldEN1cnJlbnRPcGVyYXRpbmdDaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCit0eXBlZGVmIGVudW0KK3sKKyAgICBXTEFOX1BFX0RJQUdfU0NBTl9SRVFfRVZFTlQgPSAwLAorICAgIFdMQU5fUEVfRElBR19TQ0FOX0FCT1JUX0lORF9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfU0NBTl9SU1BfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX0pPSU5fUkVRX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19KT0lOX1JTUF9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfU0VUQ09OVEVYVF9SRVFfRVZFTlQsICAKKyAgICBXTEFOX1BFX0RJQUdfU0VUQ09OVEVYVF9SU1BfRVZFTlQsIAorICAgIFdMQU5fUEVfRElBR19SRUFTU09DX1JFUV9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfUkVBU1NPQ19SU1BfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX0FVVEhfUkVRX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19BVVRIX1JTUF9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfRElTQVNTT0NfUkVRX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19ESVNBU1NPQ19SU1BfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX0RJU0FTU09DX0lORF9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfRElTQVNTT0NfQ05GX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19ERUFVVEhfUkVRX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19ERUFVVEhfUlNQX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19ERUFVVEhfSU5EX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19TVEFSVF9CU1NfUkVRX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19TVEFSVF9CU1NfUlNQX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19BVVRIX0lORF9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfQVNTT0NfSU5EX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19BU1NPQ19DTkZfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX1JFQVNTT0NfSU5EX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19TV0lUQ0hfQ0hMX1JFUV9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfU1dJVENIX0NITF9SU1BfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX1NUT1BfQlNTX1JFUV9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfU1RPUF9CU1NfUlNQX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19ERUFVVEhfQ05GX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19BRERUU19SRVFfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX0FERFRTX1JTUF9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfREVMVFNfUkVRX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19ERUxUU19SU1BfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX0RFTFRTX0lORF9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfRU5URVJfQk1QU19SRVFfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX0VOVEVSX0JNUFNfUlNQX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19FWElUX0JNUFNfUkVRX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19FWElUX0JNUFNfUlNQX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19FWElUX0JNUFNfSU5EX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19FTlRFUl9JTVBTX1JFUV9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfRU5URVJfSU1QU19SU1BfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX0VYSVRfSU1QU19SRVFfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX0VYSVRfSU1QU19SU1BfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX0VOVEVSX1VBUFNEX1JFUV9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfRU5URVJfVUFQU0RfUlNQX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19FWElUX1VBUFNEX1JFUV9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfRVhJVF9VQVBTRF9SU1BfRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX1dPV0xfQUREX0JDQVNUX1BUUk5fRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX1dPV0xfREVMX0JDQVNUX1BUUk5fRVZFTlQsCisgICAgV0xBTl9QRV9ESUFHX0VOVEVSX1dPV0xfUkVRX0VWRU5ULAorICAgIFdMQU5fUEVfRElBR19FTlRFUl9XT1dMX1JTUF9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfRVhJVF9XT1dMX1JFUV9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfRVhJVF9XT1dMX1JTUF9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfSEFMX0FEREJBX1JFUV9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfSEFMX0FEREJBX1JTUF9FVkVOVCwKKyAgICBXTEFOX1BFX0RJQUdfSEFMX0RFTEJBX0lORF9FVkVOVCwKK31XTEFOX1BFX0RJQUdfRVZFTlRfVFlQRTsKKwordm9pZCBsaW1EaWFnRXZlbnRSZXBvcnQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgZXZlbnRUeXBlLCB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5LCB0QU5JX1UxNiBzdGF0dXMsIHRBTklfVTE2IHJlYXNvbkNvZGUpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKwordm9pZCBwZVNldFJlc3VtZUNoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgY2hhbm5lbCwgdEFOSV9VOCBjYlN0YXRlKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBwZUdldFJlc3VtZUNoYW5uZWwoKSAtIFJldHVybnMgdGhlICBjaGFubmVsIG51bWJlciBmb3Igc2Nhbm5pbmcsIGZyb20gYSB2YWxpZCBzZXNzaW9uLgorCisgIFRoaXMgZnVuY3Rpb24gaXRyYXRlcyB0aGUgc2Vzc2lvbiBUYWJsZSBhbmQgcmV0dXJucyB0aGUgY2hhbm5lbCBudW1iZXIgZnJvbSBmaXJzdCB2YWxpZCBzZXNzaW9uCisgICBpZiBubyBzZXNzaW9ucyBhcmUgdmFsaWQgaXQgcmV0dXJucyAwCisgICAgCisgIFxwYXJhbSBwTWFjICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBnbG9iYWwgYWRhcHRlciBjb250ZXh0CisgIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjaGFubmVsIHRvIHNjYW4gZnJvbSB2YWxpZCBzZXNzaW9uIGVsc2UgemVyby4KKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9VOCBwZUdldFJlc3VtZUNoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKworI2VuZGlmIC8qIF9fTElNX1VUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9wbW0vcG1tQVAuYyBiL0NPUkUvTUFDL3NyYy9wZS9wbW0vcG1tQVAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTE3ZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL3BtbS9wbW1BUC5jCkBAIC0wLDAgKzEsNjc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHBtbUFQLmNjIGNvbnRhaW5zIEFQIFBNIGZ1bmN0aW9ucworICoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAic2lyQ29tbW9uLmgiCisKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKworI2luY2x1ZGUgInNjaEFwaS5oIgorI2luY2x1ZGUgImxpbUFwaS5oIgorI2luY2x1ZGUgImNmZ0FwaS5oIgorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisKKyNpbmNsdWRlICJwbW1BcGkuaCIKKyNpbmNsdWRlICJwbW1EZWJ1Zy5oIgorCisjZGVmaW5lIFBNTV9USU1fQklUU19MSU1JVCAgICAgICAgMTAKKyNkZWZpbmUgUE1NX0NGX1BPTExBQkxFX1NDSF9MSU1JVCAxMDAKKworLy8gc2V0cyBob3cgbWFueSBiZWFjb25zIGFyZSBza2lwcGVkIGFmdGVyIGEgcHMtcG9sbCBiZWZvcmUgcnhhY3Rpdml0eXNldAorLy8gcHJvY2Vzc2luZyBmb3IgdGhhdCBzdGEgc3RhcnRzIGFnYWluCisjZGVmaW5lIFBNTV9QU1BPTExfUEVSU0lTVEVOQ0UgICAgMgorCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1Q9PUFQKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogIEBmdW5jdGlvbjogX19pc1RpbUNoYW5nZWQKKyAqCisgKiAgQGJyaWVmIDogQ29tcGFyZXMgYW5kIHJldHVybnMgVFJVRSBpZiB0aGUgVElNIEJpdE1hcCBuZWVkcyBjaGFuZ2UKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjICAgICAgQW5pU2lyR2xvYmFsIAorICogQHBhcmFtIG5ld1RpbSAgICBOZXdseSBjcmVhdGVkIFRpbSBEYXRhJ3MKKyAqIEBwYXJhbSBwcmV2VGltICAgIEN1cnJlbnQgVGltIERhdGEncworICogQHJldHVybiBlQU5JX0JPT0xFQU4gICAgIGVBTklfQk9PTEVBTl9UUlVFIC0gSWYgdGhlcmUgaXMgY2hhbmdlIGluIFRpbSBEYXRhJ3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UgLSBJZiB0aGVyZSBpcyBubyBuZWVkIHRvIGNoYW5nZSBpbiBUaW0KKyAqLworCitzdGF0aWMgdEFOSV9CT09MRUFOIAorX19pc1RpbUNoYW5nZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQbW1UaW0gcE5ld1RpbSwgdHBQbW1UaW0gcFByZXZUaW0pCit7CisgICAgaWYgKCBwTmV3VGltLT5kdGltQ291bnQgIT0gcFByZXZUaW0tPmR0aW1Db3VudCB8fAorICAgICAgICAgcE5ld1RpbS0+bWF4QXNzb2NJZCAhPSBwUHJldlRpbS0+bWF4QXNzb2NJZCB8fAorICAgICAgICAgcE5ld1RpbS0+bWluQXNzb2NJZCAhPSBwUHJldlRpbS0+bWluQXNzb2NJZCB8fAorICAgICAgICAgcE5ld1RpbS0+bnVtU3RhV2l0aERhdGEgIT0gcFByZXZUaW0tPm51bVN0YVdpdGhEYXRhKSAgICAgICAgIAorICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgCisgICAgaWYgKCFwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCBwTmV3VGltLT5wVGltLCBwUHJldlRpbS0+cFRpbSwgc2l6ZW9mKCpwUHJldlRpbS0+cFRpbSkgKiBwTWFjLT5saW0ubWF4U3RhdGlvbikpCisgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fVFJVRTsKKyAKKyAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworfQorCisvKioKKyAqICBAZnVuY3Rpb246IF9fdXBkYXRlUG1tR2xvYmFsCisgKgorICogIEBicmllZiA6IFVwZGF0ZXMgdGhlIFBNTSBHbG9iYWwgU3RydWN0dXJlCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyAgICAgIEFuaVNpckdsb2JhbCAKKyAqIEBwYXJhbSBuZXdIZHIgICAgSGVhZGVyIERldGFpbHMgdG8gYmUgdXBkYXRlZCBpbiBQbW0gZ2xvYmFsSGVhZGVyCisgKiBAcGFyYW0gZ2xvYmFsSGRyICBnbG9iYWwgSGVhZGVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLworc3RhdGljIC8qaW5saW5lICovCit2b2lkICAgIF9fdXBkYXRlUG1tR2xvYmFsKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFBtbVRpbSBwTmV3VGltKQoreworICAgIHRwUG1tVGltICAgIHBHbG9iYWxUaW0gPSAmcE1hYy0+cG1tLmdQbW1UaW07CisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwR2xvYmFsVGltLT5wVGltLCAgcE5ld1RpbS0+cFRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwTmV3VGltLT5wVGltKSAqIHBNYWMtPmxpbS5tYXhTdGF0aW9uKTsKKworICAgIHBHbG9iYWxUaW0tPmR0aW1Db3VudCA9IHBOZXdUaW0tPmR0aW1Db3VudDsKKyAgICBwR2xvYmFsVGltLT5tYXhBc3NvY0lkID0gcE5ld1RpbS0+bWF4QXNzb2NJZDsKKyAgICBwR2xvYmFsVGltLT5taW5Bc3NvY0lkID0gcE5ld1RpbS0+bWluQXNzb2NJZDsKKyAgICBwR2xvYmFsVGltLT5udW1TdGFXaXRoRGF0YSA9IHBOZXdUaW0tPm51bVN0YVdpdGhEYXRhOyAgICAKK30KKworCit2b2lkIHBtbVVwZGF0ZVBTUG9sbFN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VMTYgcHNGbGFnID0gMDsKKyAgICB0QU5JX1UzMiBzdGE7CisKKyAgICAvLyBpZiB0aGVyZSBhcmUgbm8gc3RhdGlvbnMgd2hpY2ggcGVyZm9ybWVkIGEgcHMtcG9sbCB1cGRhdGUsIHdlIGFyZSBkb25lCisgICAgaWYgKHBNYWMtPnBtbS5nUG1tUHNQb2xsVXBkYXRlID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qCisgICAgICogZm9yIGFsbCBzdGF0aW9ucyB3aGljaCBoYWQgYSBzdGF0ZSB1ZHBhdGUgZHVlIHRvIGEgcHMtcG9sbCwgd2UgY2hlY2sKKyAgICAgKiBpZiBpdCBpcyB0aW1lIHRvIHVwZGF0ZSB0aGVpciBzdGF0ZSBmcm9tIGhhcmR3YXJlLiBUaGlzIGlzIHRyYWNrZWQgd2l0aAorICAgICAqIHBlciBzdGEgcHNQb2xsVXBkYXRlIGNvdW50ZXIgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgZHVyaW5nIHBzLXBvbGwKKyAgICAgKiBwcm9jZXNzaW5nLgorICAgICAqIGlmIG5vIHN0YXRpb25zIG5lZWQgYW55IGZ1cnRoZXIgcHMtcG9sbCBwcm9jZXNzaW5nLCBjbGVhciB0aGUgZ2xvYmFsIGZsYWcKKyAgICAgKiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8ga2VlcCBnb2luZyB0aHJ1IHRoZSBzdGF0aW9ucyBhdCBldmVyeSBiZWFjb24KKyAgICAgKi8KKyAgICBmb3IgKHN0YSA9IDE7IHN0YSA8IHBNYWMtPmxpbS5tYXhTdGF0aW9uOyBzdGErKykKKyAgICB7CisgICAgICAgIHRBTklfVTggcHMgPSAwOworCisgICAgICAgIGlmIChwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtzdGFdLnBzUG9sbFVwZGF0ZSA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlW3N0YV0ucHNQb2xsVXBkYXRlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBtbVVwZGF0ZVBNTW9kZShwTWFjLCBzdGEsIHBzKTsKKyAgICAgICAgfQorICAgICAgICBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtzdGFdLnBzUG9sbFVwZGF0ZS0tOworICAgICAgICBwc0ZsYWcrKzsKKyAgICAgICAgUEVMT0c0KHBtbUxvZyhwTWFjLCBMT0c0LCBGTCgiVXBkYXRlUFNQb2xsU3RhdGU6IHN0YSAlZCwgc3RhdGUgJWQgKGNvdW50ICVkKVxuIiksIHN0YSwgcHMsIHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlW3N0YV0ucHNQb2xsVXBkYXRlKTspOworICAgIH0KKworICAgIGlmIChwc0ZsYWcgPT0gMCkKKyAgICAgICAgcE1hYy0+cG1tLmdQbW1Qc1BvbGxVcGRhdGUgPSAwOworICAgIFBFTE9HMyhwbW1Mb2cocE1hYywgTE9HMywgRkwoIlVwZGF0ZVBTUG9sbFN0YXRlOiAlZCBwcy1wb2xsIGZsYWdnZWQgc3RhJ3NcbiIpLCBwc0ZsYWcpOykKK30KKworLyoqCisgKiBAZnVuY3Rpb24gOiBwbW1IYW5kbGVUaW1CYXNlZERpc2Fzc29jaWF0aW9uCisgKiAKKyAqIEBicmllZiA6ICBIYW5kbGUgVElNIGJhc2VkIERpc2Fzc29jIGZvciBTVEEncyBpbiBQUworICoKKyAqIExPR0lDOgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIEFQIGhhcyBzZW50IFRJTSBlbm91Z2gKKyAqIG51bWJlciBvZiB0aW1lcyBmb3IgdGhlIHN0YXRpb24gYW5kIGlmIFNUQSBpbiBQUyBkaWRuJ3QgY29sbGVjdCB0aGUgYnVmZmVyZWQgcGNrdHMsCisgKiBkaXNjb25uZWN0IHRoZSBzdGF0aW9uCisgKgorICogTk9URToKKyAqIEBwYXJhbSA6IHBNYWMgLSB0cEFuaVNpckdsb2JhbAorICogQHJldHVybiA6IG5vbmUKKyAqKi8KKyAKK3ZvaWQgcG1tSGFuZGxlVGltQmFzZWREaXNhc3NvY2lhdGlvbiAodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0cFBtbVN0YUluZm8gcG1tU3RhSW5mbyA9IHBNYWMtPnBtbS5nUG1tVGltLnBTdGFJbmZvOworICAgIHRBTklfVTMyICAgIHN0YUNudDsKKyAgICB0QU5JX1UzMiAgICBzdGFXaXRoRGF0YSA9IHBNYWMtPnBtbS5nUG1tVGltLm51bVN0YVdpdGhEYXRhOworICAgIAorCisgICAgLyoqIFRyYXZlcnNlIHRocm91Z2ggYWxsIHRoZSBhc3NvY0lkJ3MgaW4gUFMgKi8KKyAgICBmb3IgKHN0YUNudCA9IDA7IHN0YUNudCA8IHBNYWMtPnBtbS5nUG1tTnVtU3RhOyBzdGFDbnQrKykgeworICAgICAgICB0cERwaEhhc2hOb2RlIHBTdGEgPSBkcGhHZXRIYXNoRW50cnkocE1hYywgcG1tU3RhSW5mb1tzdGFDbnRdLmFzc29jSWQpOworCisgICAgICAgIGlmICgocFN0YSA9PSBOVUxMKSB8fCghcFN0YS0+dmFsaWQgKSkgeworICAgICAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIEFTU09DSUQgLyBhc3NvY2lkIHBvaW50cyB0byBub3R2YWxpZCBTVEEgYXNzb2NJZCBbJWRdIE51bVN0YSBbJWRdXG4iKSxwbW1TdGFJbmZvW3N0YUNudF0uYXNzb2NJZCwgCisgICAgICAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1OdW1TdGEgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3RhQ250ID49IHN0YVdpdGhEYXRhKSAvKiogSWYgdGhlIEFQIGRvZXNuJ3QgaGF2ZSBhbnkgZGF0YSBidWZmZXJlZCBmb3IgdGhpcyBTVEEqLworICAgICAgICAgICAgcFN0YS0+dGltV2FpdENvdW50ID0gR0VUX1RJTV9XQUlUX0NPVU5UKHBTdGEtPm1sbVN0YUNvbnRleHQubGlzdGVuSW50ZXJ2YWwpOyAgIC8qKiBSZXNldCB0aGUgdGltV2FpdENvdW50Ki8KKyAgICAgICAgZWxzZSB7ICAvKiogQVAgaGFzIGdvdCBzb21lIGRhdGEgYnVmZmVyZWQgZm9yIHRoaXMgU1RBKi8KKyAgICAgICAgICAgIGlmIChwU3RhLT5jdXJUeE1wZHVDbnQgPT0gcG1tU3RhSW5mb1tzdGFDbnRdLnN0YVR4QWNrQ250KSB7CisgICAgICAgICAgICAgICAgLyoqIElmIHdlIGhhdmUgc2VudCBlbm91Z2ggbnVtYmVyIG9mIFRJTSdzIHRvIHRoZSBTVEEgdHJpZ2dlciBEaXNBc3NvYyovCisgICAgICAgICAgICAgICAgaWYgKCAhKC0tcFN0YS0+dGltV2FpdENvdW50KSkgeyAKKyAgICAgICAgICAgICAgICAgICAgUEVMT0dFKHBtbUxvZyhwTWFjLCBMT0dFLCBGTCgiIFNUQSB3aXRoIEFJRCAlZCBkaWQgbm90IHJlc3BvbmQgdG8gVElNLCBkZWxldGluZy4uLiIpLHBtbVN0YUluZm9bc3RhQ250XS5hc3NvY0lkKTspCisgICAgICAgICAgICAgICAgICAgIGxpbVRyaWdnZXJTVEFkZWxldGlvbihwTWFjLCBwU3RhLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgLyoqIGlmIHRoZSBTVEEgaW4gUFMgY2FtZSB1cCBhbmQgZ290IHNvbWUgZGF0YSovCisgICAgICAgICAgICAgICAgcFN0YS0+dGltV2FpdENvdW50ID0gR0VUX1RJTV9XQUlUX0NPVU5UKHBTdGEtPm1sbVN0YUNvbnRleHQubGlzdGVuSW50ZXJ2YWwpOyAgLyoqIFJlc2V0IHRoZSB0aW1XYWl0Q291bnQqLworICAgICAgICB9CisgICAgICAgIHBTdGEtPmN1clR4TXBkdUNudCA9IHBtbVN0YUluZm9bc3RhQ250XS5zdGFUeEFja0NudDsKKyAgICB9CisKKyAgICByZXR1cm47CisgfQorCisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKy8qKgorICogcG1tR2VuZXJhdGVUSU0KKyAqCisgKiBGVU5DVElPTjoKKyAqIEdlbmVyYXRlIFRJTQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgcG9pbnRlciB0byBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICogQHBhcmFtICoqcFB0ciBwb2ludGVyIHRvIHRoZSBidWZmZXIsIHdoZXJlIHRoZSBUSU0gYml0IGlzIHRvIGJlIHdyaXR0ZW4uCisgKiBAcGFyYW0gKnRpbUxlbmd0aCBwb2ludGVyIHRvIGxpbUxlbmd0aCwgd2hpY2ggbmVlZHMgdG8gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBwbW1HZW5lcmF0ZVRJTSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICoqcFB0ciwgdEFOSV9VMTYgKnRpbUxlbmd0aCwgdEFOSV9VOCBkdGltUGVyaW9kKQoreworICAgIHRBTklfVTggKnB0ciA9ICpwUHRyOworICAgIHRBTklfVTMyIHZhbCA9IDA7CisgICAgdEFOSV9VMzIgbWluQWlkID0gMTsgLy8gQWx3YXlzIHN0YXJ0IHdpdGggQUlEIDEgYXMgbWluaW11bQorICAgIHRBTklfVTMyIG1heEFpZCA9IEhBTF9OVU1fU1RBOworCisKKyAgICAvLyBHZW5lcmF0ZSBwYXJ0aWFsIHZpcnR1YWwgYml0bWFwCisgICAgdEFOSV9VOCBOMSA9IG1pbkFpZCAvIDg7CisgICAgdEFOSV9VOCBOMiA9IG1heEFpZCAvIDg7CisgICAgaWYgKE4xICYgMSkgTjEtLTsKKworICAgICp0aW1MZW5ndGggPSBOMiAtIE4xICsgNDsKKyAgICB2YWwgPSBkdGltUGVyaW9kOworCisgICAgLyogCisgICAgICogMDkvMjMvMjAxMSAtIEFTVyB0ZWFtIGRlY2lzaW9uOyAKKyAgICAgKiBXcml0ZSAweEZGIHRvIGZpcm13YXJlJ3MgZmllbGQgdG8gZGV0ZWN0IGZpcm13YXJlJ3MgbWFsLWZ1bmN0aW9uIGVhcmx5LgorICAgICAqIERUSU0gY291bnQgYW5kIGJpdG1hcCBjb250cm9sIHVzdWFsbHkgY2Fubm90IGJlIDB4RkYsIHNvIGl0IGlzIGVhc3kgdG8ga25vdyB0aGF0IAorICAgICAqIGZpcm13YXJlIG5ldmVyIHVwZGF0ZWQgRFRJTSBjb3VudC9iaXRtYXAgY29udHJvbCBmaWVsZCBhZnRlciBob3N0IGRyaXZlciBkb3dubG9hZGVkCisgICAgICogYmVhY29uIHRlbXBsYXRlIGlmIGVuZC11c2VyIGNvbXBsYWludHMgdGhhdCBEVElNIGNvdW50IGFuZCBiaXRtYXBDb250cm9sIGlzIDB4RkYuCisgICAgICovCisgICAgKnB0cisrID0gU0lSX01BQ19USU1fRUlEOworICAgICpwdHIrKyA9ICh0QU5JX1U4KSgqdGltTGVuZ3RoKTsKKyAgICAqcHRyKysgPSAweEZGOyAvLyBsb2NhdGlvbiBmb3IgZHRpbUNvdW50LiB3aWxsIGJlIGZpbGxlZCBpbiBieSBGVy4KKyAgICAqcHRyKysgPSAodEFOSV9VOCl2YWw7CisKKyAgICAqcHRyKysgPSAweEZGOyAvLyBsb2NhdGlvbiBmb3IgYml0bWFwIGNvbnRvcmwuIHdpbGwgYmUgZmlsbGVkIGluIGJ5IEZXLgorICAgIHB0ciArPSAoTjIgLSBOMSArIDEpOworCisgICAgUEVMT0cyKHNpckR1bXBCdWYocE1hYywgU0lSX1BNTV9NT0RVTEVfSUQsIExPRzIsICpwUHRyLCAoKnRpbUxlbmd0aCkrMik7KQorICAgICpwUHRyID0gcHRyOworfQorCisjZW5kaWYKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisvKioKKyAqIHBtbVVwZGF0ZVRJTQorICoKKyAqIEZVTkNUSU9OOiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgVElNIGluZm9ybWF0aW9uIGFuZCBzYXZlcyBpdCB1bmRlciBQTU0gY29udGV4dC4KKyAqIFRoaXMgVElNIGJpdCBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGdlbmVyYXRlZCBiZWFjb25zIGxhdGVyIG9uLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgcG9pbnRlciB0byBnbG9iYWwgbWFjIHN0cnVjdHVyZQorICogQHBhcmFtIHBCZWFjb25HZW5QYXJhbXMgcG9pbnRlciB0byBzdHJ1Y3R1cmUgd2hpY2ggaGFzIHBvd2VyIHNhdmUgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgSEFMLgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBwbW1VcGRhdGVUSU0odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBCZWFjb25HZW5QYXJhbXMgcEJlYWNvbkdlblBhcmFtcykKK3sKKyAgICB0QU5JX1UxNiBpOworICAgIHRBTklfVTE2IGFzc29jSWQ7CisgICAgdFBtbVRpbSBjdXJUaW07CisgICAgdFBtbVRpbSAqcFBtbVRpbSA9ICZwTWFjLT5wbW0uZ1BtbVRpbTsKKyAgICB0QU5JX1UxNiB0b3RhbFN0YTsKKyAgICB0cEJlYWNvbkdlblN0YUluZm8gcFN0YUluZm87CisKKyAgICB0b3RhbFN0YSA9IHBCZWFjb25HZW5QYXJhbXMtPm51bU9mU3RhICsgcEJlYWNvbkdlblBhcmFtcy0+bnVtT2ZTdGFXaXRob3V0RGF0YTsKKworICAgIGlmKHRvdGFsU3RhID4gcE1hYy0+bGltLm1heFN0YXRpb24pCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsIEZMKCJFcnJvciBpbiBUSU0gVXBkYXRlOiBUb3RhbCBTVEEgY291bnQgJWQgZXhjZWVkcyB0aGUgTUFYIEFsbG93ZWQgJWQgXG4iKSwgdG90YWxTdGEsIHBNYWMtPmxpbS5tYXhTdGF0aW9uKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmY3VyVGltLCAgc2l6ZW9mKGN1clRpbSkpOworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+cG1tLmdwUG1tUFNTdGF0ZSwgCisgICAgICAgIHNpemVvZigqcE1hYy0+cG1tLmdwUG1tUFNTdGF0ZSkgKiBwTWFjLT5saW0ubWF4U3RhdGlvbik7CisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmY3VyVGltLnBUaW0sIHNpemVvZih0QU5JX1U4KSpwTWFjLT5saW0ubWF4U3RhdGlvbikpCisgICAgeworICAgICAgICBwbW1Mb2coIHBNYWMsIExPR0UsIEZMKCAiVW5hYmxlIHRvIFBBTCBhbGxvY2F0ZSBtZW1vcnlcbiIgKSk7CisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIGN1clRpbS5wVGltLCBzaXplb2YodEFOSV9VOCkgKiBwTWFjLT5saW0ubWF4U3RhdGlvbik7CisgICAgcFBtbVRpbS0+bnVtU3RhV2l0aERhdGEgPSBjdXJUaW0ubnVtU3RhV2l0aERhdGEgPSBwQmVhY29uR2VuUGFyYW1zLT5udW1PZlN0YTsKKyAgICBwTWFjLT5wbW0uZ1BtbU51bVN0YSA9IHRvdGFsU3RhOworICAgIGN1clRpbS5taW5Bc3NvY0lkPSBwTWFjLT5saW0ubWF4U3RhdGlvbiAtIDE7CisgICAgY3VyVGltLm1heEFzc29jSWQ9IDA7CisgICAgY3VyVGltLmR0aW1Db3VudCA9IHBCZWFjb25HZW5QYXJhbXMtPmR0aW1Db3VudDsKKyAgICBwU3RhSW5mbyA9ICh0cEJlYWNvbkdlblN0YUluZm8pKCh0QU5JX1U4ICopcEJlYWNvbkdlblBhcmFtcyArIHNpemVvZigqcEJlYWNvbkdlblBhcmFtcykpOworCisgICAgaWYgKHRvdGFsU3RhID4gMCkgCisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFBtbVRpbS0+cFN0YUluZm8sIHBTdGFJbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnBQbW1UaW0tPnBTdGFJbmZvKSAqIHRvdGFsU3RhKTsKKyAgICAKKyAgICBmb3IoaT0wOyBpPHRvdGFsU3RhOyBpKyspCisgICAgeworICAgICAgICBhc3NvY0lkID0gcFN0YUluZm9baV0uYXNzb2NJZDsgICAgICAKKyAgICAgICAgaWYoYXNzb2NJZCA8IHBNYWMtPmxpbS5tYXhTdGF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvL1VwZGF0ZSBUSU0gZm9yIHBvd2VyIHNhdmUgc3RhdGlvbnMgd2hpY2ggaGF2ZSBkYXRhIHBlbmRpbmcuCisgICAgICAgICAgICBpZihpPHBCZWFjb25HZW5QYXJhbXMtPm51bU9mU3RhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBFTE9HMihwbW1Mb2cocE1hYywgTE9HMiwgRkwoIlNldHRpbmcgVElNIGZvciBhc3NvY0lkOiAlZFxuIiksIGFzc29jSWQpOykKKyAgICAgICAgICAgICAgICBjdXJUaW0ucFRpbVthc3NvY0lkXSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGFzc29jSWQgPCBjdXJUaW0ubWluQXNzb2NJZCkKKyAgICAgICAgICAgICAgICAgICAgY3VyVGltLm1pbkFzc29jSWQ9IGFzc29jSWQ7CisgICAgICAgICAgICAgICAgaWYgKGFzc29jSWQgPiBjdXJUaW0ubWF4QXNzb2NJZCkKKyAgICAgICAgICAgICAgICAgICAgY3VyVGltLm1heEFzc29jSWQ9IGFzc29jSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwTWFjLT5wbW0uZ3BQbW1QU1N0YXRlW2Fzc29jSWRdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gICAgCisgICAgfQorCisgICAgaWYgKCFjdXJUaW0ubWF4QXNzb2NJZCkKKyAgICAgICAgY3VyVGltLm1pbkFzc29jSWQgPSAwOworCisgICAgaWYocEJlYWNvbkdlblBhcmFtcy0+ZkJyb2FkY2FzdFRyYWZmaWNQZW5kaW5nKQorICAgICAgICBjdXJUaW0ucFRpbVswXSA9IDE7CisKKyAgICAvL05vdyBjaGVjayBpZiBUSU0gY29udGVudHMgaGF2ZSBjaGFuZ2VkIGZyb20gdGhlIGxhc3QgYmVhY29uLgorICAgIGlmICghX19pc1RpbUNoYW5nZWQocE1hYywgJmN1clRpbSwgcFBtbVRpbSkpIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBjdXJUaW0ucFRpbSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL1RpbWUgdG8gdXBkYXRlIHRoZSBiZWFjb24KKyAgICBfX3VwZGF0ZVBtbUdsb2JhbChwTWFjLCAmY3VyVGltKTsKKyAgICAKKyAgICBwTWFjLT5zY2guc2NoT2JqZWN0LmZCZWFjb25DaGFuZ2VkID0gMTsKKyAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIGN1clRpbS5wVGltKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbVByb2Nlc3NQU1BvbGwKKyAqCisgKiBGVU5DVElPTjoKKyAqIFByb2Nlc3MgdGhlIFBTIHBvbGwgbWVzc2FnZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBCRCBwb2ludGVyIHRvIHRoZSBidWZmZXIgZGVzY3JpcHRvciBmb3IgUFMgcG9sbCBtZXNzYWdlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHBtbVByb2Nlc3NQU1BvbGwodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBIYWxCdWZEZXNjIHBCZCkKK3sKKworICAgIHRwU2lyTWFjTWdtdEhkciBtaCA9IFNJUl9NQUNfQkRfVE9fTVBEVUhFQURFUihwQmQpOworCisKKyAgICAvLyBFeHRyYWN0IHRoZSBBSUQgb2YgdGhlIHN0YXRpb24KKyAgICB0QU5JX1UxNiBhaWQgPSBtaC0+ZHVyYXRpb25MbyArICgobWgtPmR1cmF0aW9uSGkgJiAweDNmKSA8PCA4KTsKKworICAgIFBFTE9HMShwbW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIFBTIFBvbGwgQUlEIDB4JXhcbiIpLCBhaWQpOykKKyAgICBpZiAoYWlkID09IDAgfHwgYWlkID49IHBNYWMtPmxpbS5tYXhTdGF0aW9uKQorICAgIHsKKyAgICAgICBQRUxPRzEocG1tTG9nKHBNYWMsIExPRzEsIEZMKCJTVEEgaWQgJWQgaW4gdXBkYXRlIFBNLCBzaG91bGQgYmUgWzEsJWRdXG4iKSwKKyAgICAgICAgICAgICAgIGFpZCwgcE1hYy0+bGltLm1heFN0YXRpb24pOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRwRHBoSGFzaE5vZGUgcFN0YSA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBhaWQpOworICAgIGlmIChwU3RhICYmIHBTdGEtPnZhbGlkKQorICAgICAgICBwU3RhLT5udW1UaW1TZW50ID0gMDsKKworICAgIC8qCisgICAgICogc2luY2UgUFMgcG9sbCBhcnJpdmVzIGFzeW5jaG9ybm91c2x5IHdydCB0aGUgcnggYWN0aXZpdHkgc2V0LCBjaGVjaworICAgICAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBCTVUgUFMgc3RhdGUgZm9yIHRoaXMgc3RhIChvbmx5IGZvciBub24tQW5pKQorICAgICAqCisgICAgICogU2luY2UgYW4gYXN5bmNocm9ub3VzIFBTIHBvbGwgaXMgYmVpbmcgcHJvY2Vzc2VkLCB3ZSBjYW4ndCB0cnVzdCB0aGUKKyAgICAgKiByeCBhY3Rpdml0eSBzZXQgZm9yIFBTUE9MTF9QRVJTSVNURU5DRSBiZWFjb25zLiBTbyBzZXQgdGhlCisgICAgICogVXBkYXRlIGNvdW50ZXIgLSB0aGlzIHdpbGwgYmUgY2hlY2tlZCBkdXJpbmcgYmVhY29uIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVthaWRdLnBzUG9sbFVwZGF0ZSA9IFBNTV9QU1BPTExfUEVSU0lTVEVOQ0U7CisgICAgcE1hYy0+cG1tLmdQbW1Qc1BvbGxVcGRhdGUgPSAxOworICAgIGlmIChtaC0+ZmMucG93ZXJNZ210ICE9IHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlW2FpZF0ucG93ZXJTYXZlKQorICAgIHsKKyAgICAgICAgdEFOSV9VOCBwcyA9IDA7CisgICAgICAgIGlmIChwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVthaWRdLnBvd2VyU2F2ZSAhPSBwcykKKyAgICAgICAgeworICAgICAgICAgICBQRUxPRzEocG1tTG9nKHBNYWMsIExPRzEsIEZMKCJTdGEgJWQ6IFBTIFBvbGwgcHJvY2Vzc2luZyBQUy1zdGF0ZSAlZCAtPiAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgYWlkLCBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVthaWRdLnBvd2VyU2F2ZSwgcHMpOykKKyAgICAgICAgICAgIHBtbVVwZGF0ZVBNTW9kZShwTWFjLCBhaWQsIHBzKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIFBNTV9BUFNECisgICAgLyoKKyAgICAgKiBTZWUgaWYgYWxsIEFDcyBhcmUgdHJpZ2dlciBlbmFibGVkLgorICAgICAqIFNlY3Rpb24gMy42LjEuNiBvZiBXTU0tQVBTRCBzcGVjLgorICAgICAqCisgICAgICogSW4gY2FzZSBhbGwgQUNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgV01NIFNUQSBhcmUgZGVsaXZlcnktZW5hYmxlZCBBQ3MsCisgICAgICogdGhlbiBubyBBQ3MgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBsZWdhY3kgcG93ZXItc2F2ZSwgYW5kIHRoZSBBUCBzaGFsbAorICAgICAqIGltbWVkaWF0ZWx5IHNlbmQgZWl0aGVyIGFuIEFDSyBmcmFtZSwgYSBOdWxsIGZ1bmN0aW9uIERhdGEgZnJhbWUgd2l0aAorICAgICAqIHRoZSBNb3JlIERhdGEgYml0IHNldCB0byB6ZXJvLCBvciBhIE51bGwgZnVuY3Rpb24gUW9TIERhdGEgZnJhbWUgd2l0aAorICAgICAqIHRoZSBNb3JlIERhdGEgYml0IGFuZCB0aGUgRU9TUCBiaXQgc2V0IHRvIHplcm8gaW4gcmVzcG9uc2UgdG8gdGhlCisgICAgICogcmVjZWlwdCBvZiBhIFBTLVBvbGwgZnJhbWUuCisgICAgICovCisKKyAgICB7CisgICAgICAgIHRBTklfVTggdWFwc2RGbGFnID0gKCooKHRBTklfVTgqKSAmcFN0YS0+cW9zLmNhcGFiaWxpdHkucW9zSW5mbykpICYgMHhGOworCisgICAgICAgIGlmICgodWFwc2RGbGFnICYgMHhmKSA9PSAweGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBbGwgQUNzIGFyZSB0cmlnZ2VyL2RlbGl2ZXJ5IGVuYWJsZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFwc2RTZW5kUW9zTnVsbChwTWFjLCBwU3RhLT5hc3NvY0lkLCAwLCBwU3RhLT5zdGFBZGRyKTsKKyAgICAgICAgfQorICAgIH0KKworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgUFNfRU4xIGJpdCBpbiBCTVUgdG8gZW5hYmxlIHRyYW5zbWlzc2lvbgorICAgICAqIG9mIG9uZSBwYWNrZXQgZnJvbSB0aGF0IHF1ZXVlCisgICAgICogVGhpcyBpcyBiZWluZyBkb25lIGJ5IHRoZSBSSFAgbm93CisgICAgICovCisKKyAgICAvLyBUQkQgLSBpZiBIQ0YgbW9kZSwgc2NoZWR1bGUgYSB0cmFuc21pc3Npb24KK30KKwordm9pZCBwbW1Qcm9jZXNzUnhBY3Rpdml0eSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBzdGFJZCwgdEFOSV9VOCBwbU1vZGUpCit7CisgICAgaWYgKHN0YUlkID09IDAgfHwgc3RhSWQgPj0gcE1hYy0+bGltLm1heFN0YXRpb24pCisgICAgeworICAgICAgIFBFTE9HMShwbW1Mb2cocE1hYywgTE9HMSwgRkwoIlNUQSBpZCAlZCBpbiBSeEFjdFByb2MsIHNob3VsZCBiZSBbMSwlZF1cbiIpLAorICAgICAgICAgICAgICAgc3RhSWQsIHBNYWMtPmxpbS5tYXhTdGF0aW9uKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQRUxPRzEocG1tTG9nKHBNYWMsIExPRzEsIEZMKCJTVEEgaWQgJWQ7KSBwbU1vZGUgJWRcbiIpLCBzdGFJZCwgcG1Nb2RlKTspCisKKyAgICAvLyBpZ25vcmUgcnhBY3Rpdml0eSBpZiB0aGUgc3RhdGUgaGFzIGJlZW4gdXBkYXRlZCBhc3luY2hyb25vdXNseQorICAgIGlmIChwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtzdGFJZF0ucHNQb2xsVXBkYXRlID09IDApCisgICAgeworICAgICAgICBwbW1VcGRhdGVQTU1vZGUocE1hYywgc3RhSWQsIHBtTW9kZSk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBwbW1VcGRhdGVQTU1vZGUKKyAqCisgKiBGVU5DVElPTjoKKyAqIFVwZGF0ZSB0aGUgcG93ZXIgbW9kZSBiaXQKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFJZCBTVEEgaWQgb2YgdGhlIHN0YXRpb24KKyAqIEBwYXJhbSBwbU1vZGUgUE0gYml0IHJlY2VpdmVkIGZyb20gdGhlIFNUQQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBwbW1VcGRhdGVQTU1vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgc3RhSWQsIHRBTklfVTggcG1Nb2RlKQoreworICAgIGlmICgoc3RhSWQgPT0gMCkgfHwKKyAgICAgICAgKHN0YUlkID09IDEpIHx8CisgICAgICAgIChzdGFJZCA+PSBwTWFjLT5saW0ubWF4U3RhdGlvbikpCisgICAgeworICAgICAgICBwbW1Mb2cocE1hYywgTE9HRSwgRkwoIlNUQSBpZCAlZCBpbiB1cGRhdGUgUE0sIHNob3VsZCBiZSBbMiwlZF1cbiIpLAorICAgICAgICAgICAgICAgc3RhSWQsIHBNYWMtPmxpbS5tYXhTdGF0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIHRoZSBTVEEgaGFzIGJlZW4gZGVsZXRlZCwgaWdub3JlIHRoaXMgY2FsbAorICAgIHRwRHBoSGFzaE5vZGUgcFN0YSA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBzdGFJZCk7CisgICAgaWYgKHBTdGEgPT0gTlVMTCB8fCBwU3RhLT52YWxpZCA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocE1hYy0+cG1tLmdwUG1tU3RhU3RhdGVbc3RhSWRdLnBvd2VyU2F2ZSAhPSBwbU1vZGUpCisgICAgeworICAgICAgIFBFTE9HMShwbW1Mb2cocE1hYywgTE9HMSwgRkwoIlNUQSBpZCAlZCwgUE0gbW9kZSAlZFxuIiksCisgICAgICAgICAgICAgICBzdGFJZCwgcG1Nb2RlKTspCisjaWZkZWYgV01NX0FQU0QKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsIEZMKCJwbSBtb2RlIGNoYW5nZTogU1RBIGlkICVkLCBQTSBtb2RlICVkXG4iKSwKKyAgICAgICAgICAgICAgIHN0YUlkLCBwbU1vZGUpOworI2VuZGlmCisKKyAgICAgICAgLy8gVXBkYXRlIFBNIG1vZGUgZm9yIHN0YSBpZAorICAgICAgICBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtzdGFJZF0ucG93ZXJTYXZlID0gcG1Nb2RlOworCisgICAgICAgIC8vIEZpbmQgdGhlIG51bWVyaWNhbGx5IHByZWNlZGluZyBTVEEgaW4gcG93ZXIgc2F2ZSBzdGF0ZQorICAgICAgICB0QU5JX1UxNiBpID0gKHN0YUlkID09IDIpID8gcE1hYy0+bGltLm1heFN0YXRpb24tMSA6IHN0YUlkLTE7CisgICAgICAgIHdoaWxlIChpICE9IHN0YUlkICYmCisgICAgICAgICAgICAgICAhKHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlW2ldLnBvd2VyU2F2ZSA9PSAxICYmCisgICAgICAgICAgICAgICAgIHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlW2ldLmNmUG9sbGFibGUgPT0gcE1hYy0+cG1tLmdwUG1tU3RhU3RhdGVbc3RhSWRdLmNmUG9sbGFibGUpCisgICAgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IChpID09IDIpID8gcE1hYy0+bGltLm1heFN0YXRpb24tMSA6IGktMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkanVzdCB0aGUgbGlua2VkIGxpc3QgYXBwcm9wcmlhdGVseQorICAgICAgICBpZiAocE1hYy0+cG1tLmdwUG1tU3RhU3RhdGVbc3RhSWRdLmNmUG9sbGFibGUpCisgICAgICAgICAgICBwbW1VcGRhdGVQb2xsYWJsZVBNTW9kZShwTWFjLCBzdGFJZCwgcG1Nb2RlLCBpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcG1tVXBkYXRlTm9uUG9sbGFibGVQTU1vZGUocE1hYywgc3RhSWQsIHBtTW9kZSwgaSk7CisKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBjb3VudCBvZiBudW1iZXIgb2YgU1RBcyBpbiBQUworICAgICAgICBpZiAocG1Nb2RlKQorICAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1OdW1TdGErKzsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5wbW0uZ1BtbU51bVN0YS0tOworCisgICAgICAgICAgICAvLyByZXNldCB0aGUgbnVtIFRJTXMgc2VudCBzaW5jZSBTVEEgaXMgb3V0IG9mIHBvd2VyIHNhdmUKKyAgICAgICAgICAgIHBTdGEtPm51bVRpbVNlbnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIG11bHRpY2FzdCBQTSBtb2RlIGJpdCBhcHByb3ByaWF0ZWx5CisgICAgICAgIHRBTklfVTggbXVsdGljYXN0UFMgPSBwTWFjLT5wbW0uZ1BtbU51bVN0YSA/IDEgOiAwOworICAgICAgICBpZiAocE1hYy0+cG1tLmdwUG1tU3RhU3RhdGVbMF0ucG93ZXJTYXZlICE9IG11bHRpY2FzdFBTKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVswXS5wb3dlclNhdmUgPSBtdWx0aWNhc3RQUzsKKyAgICAgICAgICAgIC8vIFRCRCAtIHdyaXRlIHRvIEJNVSBQUyBiaXQgZm9yIFNUQSAwCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbVVwZGF0ZU5vblBvbGxhYmxlUE1Nb2RlCisgKgorICogRlVOQ1RJT046CisgKiBVcGRhdGUgdGhlIHBvd2VyIG1vZGUgYml0CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gc3RhSWQgU1RBIGlkIG9mIHRoZSBzdGF0aW9uCisgKiBAcGFyYW0gcG1Nb2RlIFBNIGJpdCByZWNlaXZlZCBmcm9tIHRoZSBTVEEKKyAqIEBwYXJhbSBpIGluZGV4IG9mIHRoZSBwcmV2aW91cyBTVEEgaW4gdGhlIGxpbmtlZCBsaXN0CisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHBtbVVwZGF0ZU5vblBvbGxhYmxlUE1Nb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IHN0YUlkLCB0QU5JX1U4IHBtTW9kZSwgdEFOSV9VMTYgaSkKK3sKKyAgICBpZiAoaSA9PSBzdGFJZCkKKyAgICB7CisgICAgICAgIC8vIFRoZXJlIGlzIG5vIG90aGVyIG5vbiBwb2xsYWJsZSBTVEEgaW4gUFMKKyAgICAgICAgcE1hYy0+cG1tLmdwUG1tU3RhU3RhdGVbc3RhSWRdLm5leHRQUyA9ICh0QU5JX1U4KXN0YUlkOworICAgICAgICBpZiAocG1Nb2RlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDdXJyZW50IFNUQSBpcyB0aGUgb25seSBub24gcG9sbGFibGUgU1RBIGluIFBTCisgICAgICAgICAgICBwTWFjLT5wbW0uZ1BtbU5leHRTdGEgPSBzdGFJZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFic29sdXRlbHkgbm8gbm9uIHBvbGxhYmxlIFNUQSBpbiBQUworICAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1OZXh0U3RhID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBUaGVyZSBpcyhhcmUpIG90aGVyIG5vbiBwb2xsYWJsZSBTVEEocykgaW4gUFMgbW9kZQorICAgICAgICBpZiAocG1Nb2RlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBMaW5rIGluIHRoZSBjdXJyZW50IFNUQSB0byB0aGUgbGlzdCBvZiBub24gcG9sbGFibGUgUFMgU1RBcworICAgICAgICAgICAgcE1hYy0+cG1tLmdwUG1tU3RhU3RhdGVbc3RhSWRdLm5leHRQUyA9IHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlW2ldLm5leHRQUzsKKyAgICAgICAgICAgIHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlW2ldLm5leHRQUyA9ICh0QU5JX1U4KXN0YUlkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50IFNUQSBmcm9tIHRoZSBsaXN0IG9mIG5vbiBwb2xsYWJsZSBQUyBTVEFzCisgICAgICAgICAgICBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtpXS5uZXh0UFMgPSBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtzdGFJZF0ubmV4dFBTOworCisgICAgICAgICAgICAvLyBJZiB0aGUgU1RBIGJlaW5nIHJlbW92ZWQgaXMgdGhlIG5leHRTVEEsIHVwZGF0ZSBuZXh0U1RBCisgICAgICAgICAgICBpZiAoc3RhSWQgPT0gcE1hYy0+cG1tLmdQbW1OZXh0U3RhKQorICAgICAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tTmV4dFN0YSA9IHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlW3N0YUlkXS5uZXh0UFM7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbVVwZGF0ZVBvbGxhYmxlUE1Nb2RlCisgKgorICogRlVOQ1RJT046CisgKiBVcGRhdGUgdGhlIHBvd2VyIG1vZGUgYml0CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gc3RhSWQgU1RBIGlkIG9mIHRoZSBzdGF0aW9uCisgKiBAcGFyYW0gcG1Nb2RlIFBNIGJpdCByZWNlaXZlZCBmcm9tIHRoZSBTVEEKKyAqIEBwYXJhbSBpIGluZGV4IG9mIHRoZSBwcmV2aW91cyBTVEEgaW4gdGhlIGxpbmtlZCBsaXN0CisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHBtbVVwZGF0ZVBvbGxhYmxlUE1Nb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IHN0YUlkLCB0QU5JX1U4IHBtTW9kZSwgdEFOSV9VMTYgaSkKK3sKKyAgICBpZiAoaSA9PSBzdGFJZCkKKyAgICB7CisgICAgICAgIC8vIFRoZXJlIGlzIG5vIG90aGVyIHBvbGxhYmxlIFNUQSBpbiBQUworICAgICAgICBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtzdGFJZF0ubmV4dFBTID0gKHRBTklfVTgpc3RhSWQ7CisgICAgICAgIGlmIChwbU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEN1cnJlbnQgU1RBIGlzIHRoZSBvbmx5IHBvbGxhYmxlIFNUQSBpbiBQUworICAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1OZXh0Q0ZQU3RhID0gc3RhSWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHBvbGxhYmxlIFNUQSBpbiBQUworICAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1OZXh0Q0ZQU3RhID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBUaGVyZSBpcyhhcmUpIG90aGVyIHBvbGxhYmxlIFNUQShzKSBpbiBQUyBtb2RlCisgICAgICAgIGlmIChwbU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIExpbmsgaW4gdGhlIGN1cnJlbnQgU1RBIHRvIHRoZSBsaXN0IG9mIHBvbGxhYmxlIFBTIFNUQXMKKyAgICAgICAgICAgIHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlW3N0YUlkXS5uZXh0UFMgPSBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtpXS5uZXh0UFM7CisgICAgICAgICAgICBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtpXS5uZXh0UFMgPSAodEFOSV9VOClzdGFJZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgY3VycmVudCBTVEEgZnJvbSB0aGUgbGlzdCBvZiBwb2xsYWJsZSBQUyBTVEFzCisgICAgICAgICAgICBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtpXS5uZXh0UFMgPSBwTWFjLT5wbW0uZ3BQbW1TdGFTdGF0ZVtzdGFJZF0ubmV4dFBTOworCisgICAgICAgICAgICAvLyBJZiB0aGUgU1RBIGJlaW5nIHJlbW92ZWQgaXMgdGhlIG5leHRTVEEsIHVwZGF0ZSBuZXh0U1RBCisgICAgICAgICAgICBpZiAoc3RhSWQgPT0gcE1hYy0+cG1tLmdQbW1OZXh0Q0ZQU3RhKQorICAgICAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tTmV4dENGUFN0YSA9IHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlW3N0YUlkXS5uZXh0UFM7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCisjZW5kaWYgLy8gKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1Q9PUFQKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvcG1tL3BtbUFwaS5jIGIvQ09SRS9NQUMvc3JjL3BlL3BtbS9wbW1BcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGNjODZhCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL3BtbS9wbW1BcGkuYwpAQCAtMCwwICsxLDI4MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBwbW1BcGkuY2MgY29udGFpbnMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhlIEFQSSBleHBvc2VkCisgKiBieSBwb3dlciBtYW5hZ2VtZW50IG1vZHVsZQorICoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJ3bmlDZmdTdGEuaCIKKworI2luY2x1ZGUgInNpckNvbW1vbi5oIgorI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAibGltQXBpLmgiCisjaW5jbHVkZSAibGltU2VuZE1lc3NhZ2VzLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisjaW5jbHVkZSAibGltU2Vzc2lvblV0aWxzLmgiCisjaW5jbHVkZSAibGltRlQuaCIKKworCisjaW5jbHVkZSAicG1tQXBpLmgiCisjaW5jbHVkZSAicG1tRGVidWcuaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKyNpbmNsdWRlICJ3bW1BcHNkLmgiCisKKyNpbmNsdWRlICJsaW1TZW5kU21lUnNwTWVzc2FnZXMuaCIKKyNpbmNsdWRlICJsaW1UaW1lclV0aWxzLmgiCisjaW5jbHVkZSAibGltVHJhY2UuaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgIlZvc3NXcmFwcGVyLmgiCisjaWZkZWYgSU5URUdSQVRJT05fUkVBRFkKKyNpbmNsdWRlICJ2b3Nfc3RhdHVzLmgiIC8vVk9TX1NUQVRVUworI2luY2x1ZGUgInZvc19tcS5oIiAgICAgLy92b3NfbXFfcG9zdF9tZXNzYWdlKCkKKyNlbmRpZgorCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbUluaXRpYWxpemUKKyAqCisgKiBGVU5DVElPTjoKKyAqIEluaXRpYWxpemUgUE1NIG1vZHVsZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIG1vZGUKKyAqIEBwYXJhbSByYXRlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzCitwbW1Jbml0aWFsaXplKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICBwTWFjLT5wbW0uZ1BtbU5leHRTdGEgPSAwOworICAgIHBNYWMtPnBtbS5nUG1tTnVtU3RhID0gMDsKKyNlbmRpZgorCisgICAgcG1tUmVzZXRTdGF0cyhwTWFjKTsKKworICAgIHBNYWMtPnBtbS5nUG1tQmVhY29uSW50ZXJ2YWwgPSBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTF9TVEFERUY7CisgICAgcE1hYy0+cG1tLmdQbW1TdGF0ZSA9IGVQTU1fU1RBVEVfUkVBRFk7CisKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1UaW0ucFRpbSwgc2l6ZW9mKHRBTklfVTgpKnBNYWMtPmxpbS5tYXhTdGF0aW9uKTsKKworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tVGltLnBTdGFJbmZvLCBzaXplb2YoKnBNYWMtPnBtbS5nUG1tVGltLnBTdGFJbmZvKSpwTWFjLT5saW0ubWF4U3RhdGlvbik7CisKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnBtbS5ncFBtbVN0YVN0YXRlLCBzaXplb2YodFBtbVN0YVN0YXRlKSpwTWFjLT5saW0ubWF4U3RhdGlvbik7CisKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnBtbS5ncFBtbVBTU3RhdGUsIHNpemVvZih0QU5JX1U4KSpwTWFjLT5saW0ubWF4U3RhdGlvbik7CisjZW5kaWYKKworICAgIHBNYWMtPnBtbS5pbk1pc3NlZEJlYWNvblNjZW5hcmlvID0gRkFMU0U7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBwbW1SZXNldFN0YXRzCisgKgorICogRlVOQ1RJT046CisgKiBSZXNldHMgdGhlIHN0YXRpc3RpY3MKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorcG1tUmVzZXRTdGF0cyh2b2lkICpwdk1hYykKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKXB2TWFjOworCisgICAgcE1hYy0+cG1tLkJtcHNtYXhTbGVlcFRpbWUgPSAwOworICAgIHBNYWMtPnBtbS5CbXBzYXZnU2xlZXBUaW1lID0gMDsKKyAgICBwTWFjLT5wbW0uQm1wc21pblNsZWVwVGltZSA9IDA7CisgICAgcE1hYy0+cG1tLkJtcHNjbnRTbGVlcCA9IDA7CisKKyAgICBwTWFjLT5wbW0uQm1wc21heFRpbWVBd2FrZSA9IDA7CisgICAgcE1hYy0+cG1tLkJtcHNhdmdUaW1lQXdha2UgPSAwOworICAgIHBNYWMtPnBtbS5CbXBzbWluVGltZUF3YWtlID0gMDsKKyAgICBwTWFjLT5wbW0uQm1wc2NudEF3YWtlID0gMDsKKworICAgIHBNYWMtPnBtbS5CbXBzV2FrZXVwVGltZVN0YW1wID0gMDsKKyAgICBwTWFjLT5wbW0uQm1wc1NsZWVwVGltZVN0YW1wID0gMDsKKworICAgIHBNYWMtPnBtbS5CbXBzSGFsUmVxRmFpbENudCA9IDA7CisgICAgcE1hYy0+cG1tLkJtcHNJbml0RmFpbENudCA9IDA7CisgICAgcE1hYy0+cG1tLkJtcHNJbml0RmFpbENudD0gMDsKKyAgICBwTWFjLT5wbW0uQm1wc0ludlN0YXRlQ250PSAwOworICAgIHBNYWMtPnBtbS5CbXBzUGt0RHJwSW5TbGVlcE1vZGU9IDA7CisgICAgcE1hYy0+cG1tLkJtcHNSZXFJbkludmFsaWRSb2xlQ250PSAwOworICAgIHBNYWMtPnBtbS5CbXBzU2xlZVJlcUZhaWxDbnQ9IDA7CisgICAgcE1hYy0+cG1tLkJtcHNXYWtldXBJbmRDbnQ9IDA7CisKKyAgICBwTWFjLT5wbW0uSW1wc1dha2V1cFRpbWVTdGFtcCA9IDA7CisgICAgcE1hYy0+cG1tLkltcHNTbGVlcFRpbWVTdGFtcCA9IDA7CisgICAgcE1hYy0+cG1tLkltcHNNYXhUaW1lQXdha2UgPSAwOworICAgIHBNYWMtPnBtbS5JbXBzTWluVGltZUF3YWtlID0gMDsKKyAgICBwTWFjLT5wbW0uSW1wc0F2Z1RpbWVBd2FrZSA9IDA7CisgICAgcE1hYy0+cG1tLkltcHNDbnRBd2FrZSA9IDA7CisKKyAgICBwTWFjLT5wbW0uSW1wc0NudFNsZWVwID0gMDsKKyAgICBwTWFjLT5wbW0uSW1wc01heFNsZWVwVGltZSA9IDA7CisgICAgcE1hYy0+cG1tLkltcHNNaW5TbGVlcFRpbWUgPSAwOworICAgIHBNYWMtPnBtbS5JbXBzQXZnU2xlZXBUaW1lID0gMDsKKworICAgIHBNYWMtPnBtbS5JbXBzU2xlZXBFcnJDbnQgPSAwOworICAgIHBNYWMtPnBtbS5JbXBzV2FrZXVwRXJyQ250ID0gMDsKKyAgICBwTWFjLT5wbW0uSW1wc0xhc3RFcnIgPSAwOworICAgIHBNYWMtPnBtbS5JbXBzSW52YWxpZFN0YXRlQ250ID0gMDsKKworICAgIHJldHVybjsKK30KKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbUluaXRCbXBzUmVzcG9uc2VIYW5kbGVyCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgU0lSX0hBTF9FTlRFUl9CTVBTX1JTUCBmcm9tIEhBTC4KKyAqIElmIHRoZSByZXNwb25zZSBpcyBzdWNjZXNzZnVsLCBpdCBwdXRzIFBNTSBpbiBlUE1NX1NUQVRFX0JNUF9TTEVFUCBzdGF0ZQorICogYW5kIHNlbmRzIGJhY2sgc3VjY2VzcyByZXNwb25zZSB0byBQTUMuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0KKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgcG1tSW5pdEJtcHNSZXNwb25zZUhhbmRsZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgZUhhbFN0YXR1cyByc3BTdGF0dXMpCit7CisKKworICAgIHRQbW1TdGF0ZSBuZXh0U3RhdGUgPSBwTWFjLT5wbW0uZ1BtbVN0YXRlOworICAgIHRTaXJSZXN1bHRDb2RlcyByZXRTdGF0dXMgPSBlU0lSX1NNRV9TVUNDRVNTOworCisgICAgLyogd2UgbmVlZCB0byBwcm9jZXNzIGFsbCB0aGUgZGVmZXJyZWQgbWVzc2FnZXMgZW5xdWV1ZWQgc2luY2UKKyAgICAgKiB0aGUgaW5pdGlhdGluZyB0aGUgU0lSX0hBTF9FTlRFUl9CTVBTX1JFUS4KKyAgICAqLworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCisgICAgaWYocE1hYy0+cG1tLmdQbW1TdGF0ZSAhPSBlUE1NX1NUQVRFX0JNUFNfV1RfSU5JVF9SU1ApCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCgicG1tQm1wczogUmVjZWl2ZWQgJ0luaXRQd3JTYXZlUnNwJyB3aGlsZSBpbiBpbmNvcnJlY3Qgc3RhdGU6ICVkXG4iKSwKKyAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUpOykKKworICAgICAgICByZXRTdGF0dXMgPSBlU0lSX1NNRV9JTlZBTElEX1BNTV9TVEFURTsKKyAgICAgICAgcG1tQm1wc1VwZGF0ZUludmFsaWRTdGF0ZUNudChwTWFjKTsKKyAgICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKworICAgIC8vaWYgcmVzcG9uc2UgaXMgc3VjY2VzcywgdGhlbiBzZXQgUE1NIHRvIEJNUFNfU0xFRVAgc3RhdGUgYW5kIHNlbmQgcmVzcG9uc2UgYmFjayB0byBQTUMuCisgICAgLy9JZiByZXNwb25zZSBpcyBmYWlsdXJlLCB0aGVuIHNlbmQgdGhlIHJlc3BvbnNlIGJhY2sgdG8gUE1DIGFuZCByZXNldCBpdHMgc3RhdGUuCisgICAgaWYocnNwU3RhdHVzID09IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR1cocG1tTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICBGTCgicG1tQm1wczogUmVjZWl2ZWQgc3VjY2Vzc2Z1bCByZXNwb25zZSBmcm9tIEhBTCB0byBlbnRlciBCTVBTX1BPV0VSX1NBVkUgXG4iKSk7KQorCisgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPSBlUE1NX1NUQVRFX0JNUFNfU0xFRVA7CisKKyAgICAgICAgLy8gVXBkYXRlIHNsZWVwIHN0YXRpc3RpY3MKKyAgICAgICAgcG1tVXBkYXRlUHdyU2F2ZVN0YXRzKHBNYWMpOworCisgICAgICAgIC8vIERpc2FibGUgYmFja2dyb3VuZCBzY2FuIG1vZGUKKyAgICAgICAgcE1hYy0+c3lzLmdTeXNFbmFibGVTY2FuTW9kZSA9IGZhbHNlOworCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVRpbWVyc0NyZWF0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgaGVhcnRiZWF0IHRpbWVyIGFzIHdlbGwgKi8KKyAgICAgICAgICAgIGlmKHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUhlYXJ0QmVhdFRpbWVyLnBNYWMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfVElNRVJfREVBQ1RJVkFURSwgMCwgZUxJTV9IRUFSVF9CRUFUX1RJTUVSKSk7CisgICAgICAgICAgICAgICAgdHhfdGltZXJfZGVhY3RpdmF0ZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltSGVhcnRCZWF0VGltZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9QTUNfRU5URVJfQk1QU19SU1AsICByZXRTdGF0dXMsIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL2lmIGluaXQgcmVxIGZhaWxlZCwgdGhlbiBnbyBiYWNrIHRvIFdBS0VVUCBzdGF0ZS4KKyAgICAgICAgUEVMT0dFKHBtbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoInBtbUJtcHM6IEJNUFNfSU5JVF9QV1JfU0FWRV9SRVEgZmFpbGVkLCBpbmZvcm1pbmcgU01FXG4iKSk7KQorCisgICAgICAgIHBtbUJtcHNVcGRhdGVJbml0RmFpbHVyZUNudChwTWFjKTsKKyAgICAgICAgbmV4dFN0YXRlID0gZVBNTV9TVEFURV9CTVBTX1dBS0VVUDsKKyAgICAgICAgcmV0U3RhdHVzID0gZVNJUl9TTUVfQk1QU19SRVFfRkFJTEVEOworICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIHJldHVybjsKKworZmFpbHVyZToKKworICAgIC8vR2VuZXJhdGUgYW4gZXJyb3IgcmVzcG9uc2UgYmFjayB0byBQTUMKKyAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlID0gbmV4dFN0YXRlOworICAgIHBtbUJtcHNVcGRhdGVTbGVlcFJlcUZhaWx1cmVDbnQocE1hYyk7CisgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1BNQ19FTlRFUl9CTVBTX1JTUCwgcmV0U3RhdHVzLCAwLCAwKTsKKyAgICByZXR1cm47CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcG1tRXhpdEJtcHNSZXF1ZXN0SGFuZGxlcgorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHNlbmQgdGhlIHdha2V1cCBtZXNzYWdlIHRvIEhBTAorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgIHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBzdHJ1Y3R1cmUuCisKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgcG1tRXhpdEJtcHNSZXF1ZXN0SGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cEV4aXRCbXBzSW5mbyBwRXhpdEJtcHNJbmZvKQoreworICAgIHRTaXJSZXN1bHRDb2RlcyByZXNwU3RhdHVzID0gZVNJUl9TTUVfU1VDQ0VTUzsKKworICAgIHRQbW1TdGF0ZSBvcmlnU3RhdGUgPSBwTWFjLT5wbW0uZ1BtbVN0YXRlOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0VYSVRfQk1QU19SRVFfRVZFTlQsIHBlR2V0VmFsaWRQb3dlclNhdmVTZXNzaW9uKHBNYWMpLCAwLCAodEFOSV9VMTYpcEV4aXRCbXBzSW5mby0+ZXhpdEJtcHNSZWFzb24pOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisgICAgaWYgKE5VTEwgPT0gcEV4aXRCbXBzSW5mbykKKyAgICB7CisgICAgICAgIHJlc3BTdGF0dXMgPSBlU0lSX1NNRV9CTVBTX1JFUV9GQUlMRUQ7CisgICAgICAgIFBFTE9HVyhwbW1Mb2cocE1hYywgTE9HVywgRkwoInBtbUJtcHM6IFJjdmQgRVhJVF9CTVBTIHdpdGggTlVMTCBib2R5XG4iKSk7KQorICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorCisgICAgLyogUE1DIGlzIG5vdCBhd2FyZSBvZiBCYWNrZ3JvdW5kIHNjYW4sIHdoaWNoIGlzIGRvbmUgaW4KKyAgICAgKiBCTVBTIG1vZGUgd2hpbGUgTnRoIEJlYWNvbiBpcyBkZWxpdmVyZWQuIEVzc2VudGlhbGx5LCBQTUMKKyAgICAgKiBjYW4gcmVxdWVzdCB0aGUgZGV2aWNlIHRvIGdldCBvdXQgb2YgcG93ZXItc2F2ZSB3aGlsZQorICAgICAqIGJhY2tncm91bmQgc2Nhbm5pbmcgaXMgaGFwcGVuaW5nLiBzaW5jZSwgdGhlIGRldmljZSBpcyBhbHJlYWR5CisgICAgICogb3V0IG9mIHBvd2Vyc2F2ZSwganVzdCBpbmZvcm0gdGhhdCBkZXZpY2UgaXMgb3V0IG9mIHBvd2Vyc2F2ZQorICAgICAqLworICAgIGlmKGxpbUlzU3lzdGVtSW5TY2FuU3RhdGUocE1hYykpCisgICAgeworICAgICAgICBQRUxPR1cocG1tTG9nKHBNYWMsIExPR1csIAorICAgICAgICAgICAgRkwoInBtbUJtcHM6IERldmljZSBpcyBhbHJlYWR5IGF3YWtlIGFuZCBzY2FubmluZywgcmV0dXJuaW5nIHN1Y2Nlc3MgdG8gUE1DIFxuIikpOykKKyAgICAgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1BNQ19FWElUX0JNUFNfUlNQLCByZXNwU3RhdHVzLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHNlbmQgd2FrZXVwIHJlcXVlc3QsIG9ubHkgd2hlbiBpbiBzbGVlcCBzdGF0ZSAqLworICAgIFBFTE9HVyhwbW1Mb2cocE1hYywgTE9HVywgRkwoInBtbUJtcHM6IFNlbmRpbmcgZVdOSV9QTUNfRVhJVF9CTVBTX1JFUSB0byBIQUxcbiIpKTspCisgICAgaWYgKHBNYWMtPnBtbS5nUG1tU3RhdGUgPT0gZVBNTV9TVEFURV9CTVBTX1NMRUVQKQorICAgIHsKKyAgICAgICAgLyogU3RvcmUgdGhlIHJlYXNvbiBjb2RlIGZvciBleGl0aW5nIEJNUFMuIFRoaXMgdmFsdWUgd2lsbCBiZQorICAgICAgICAgKiBjaGVja2VkIHdoZW4gUE1NIHJlY2VpdmVzIFNJUl9IQUxfRVhJVF9CTVBTX1JTUCBmcm9tIEhBTAorICAgICAgICAgKi8KKyAgICAgICAgcE1hYy0+cG1tLmdQbW1FeGl0Qm1wc1JlYXNvbkNvZGUgPSBwRXhpdEJtcHNJbmZvLT5leGl0Qm1wc1JlYXNvbjsKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcEV4aXRCbXBzSW5mbyk7CisKKyAgICAgICAgUEVMT0dXKHBtbUxvZyhwTWFjLCBMT0dXLCAKKyAgICAgICAgICAgIEZMKCJwbW1CbXBzOiBSY3ZkIEVYSVRfQk1QUyB3aXRoIHJlYXNvbiBjb2RlJWQgXG4iKSwgcE1hYy0+cG1tLmdQbW1FeGl0Qm1wc1JlYXNvbkNvZGUpOykKKworCisgICAgICAgIC8vIFNldCBQTU0gdG8gQk1QU19XVF9XQUtFVVBfUlNQIHN0YXRlCisgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPSBlUE1NX1NUQVRFX0JNUFNfV1RfV0FLRVVQX1JTUDsKKyAgICAgICAgaWYocG1tU2VuZENoYW5nZVBvd2VyU2F2ZU1zZyhwTWFjKSAhPSAgZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXYWtldXAgcmVxdWVzdCBmYWlsZWQgKi8KKyAgICAgICAgICAgIHJlc3BTdGF0dXMgPSBlU0lSX1NNRV9CTVBTX1JFUV9GQUlMRUQ7CisgICAgICAgICAgICBwbW1CbXBzVXBkYXRlSGFsUmVxRmFpbHVyZUNudChwTWFjKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShwbW1Mb2cocE1hYywgTE9HMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoInBtbUJtcHM6IGVXTklfUE1DX0VYSVRfQk1QU19SRVEgd2FzIHN1Y2Nlc3NmdWxseSBzZW50IHRvIEhBTFxuIikpOykKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsIAorICAgICAgICAgICAgICAgICAgICAgIEZMKCJwbW1CbXBzOiBlV05JX1BNQ19FWElUX0JNUFNfUkVRIHJlY2VpdmVkIGluIGludmFsaWQgc3RhdGU6ICVkXG4iKSwKKyAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgKTspCisKKyAgICAgICAgcmVzcFN0YXR1cyA9IGVTSVJfU01FX0lOVkFMSURfUE1NX1NUQVRFOworICAgICAgICBwbW1CbXBzVXBkYXRlSW52YWxpZFN0YXRlQ250KHBNYWMpOworICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIHJldHVybjsKKworZmFpbHVyZToKKyAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlID0gb3JpZ1N0YXRlOworICAgIHBtbUJtcHNVcGRhdGVXYWtldXBSZXFGYWlsdXJlQ250KHBNYWMpOworICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9QTUNfRVhJVF9CTVBTX1JTUCwgcmVzcFN0YXR1cywgMCwgMCk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcG1tSW5pdEJtcHNQd3JTYXZlCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIGVXTklfUE1DX0VOVEVSX1BNQ19SRVEgZnJvbSBQTUMuCisgKiBJdCBjaGVja3MgZm9yIGNlcnRhaW4gY29uZGl0aW9ucyBiZWZvcmUgaXQgcHV0cyBQTU0gaW50bworICogQk1QUyBwb3dlciBzYXZlIHN0YXRlOiBlUE1NX1NUQVRFX0JNUFNfV1RfSU5JVF9SU1AKKyAqIEl0IGFsc28gaW52b2tlcyBwbW1TZW5kSW5pdFBvd2VyU2F2ZU1zZygpIHRvIHNlbmQgRU5URVJfQk1QU19SRVEKKyAqIHRvIEhBTC4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBtb2RlIGNhbiBiZSBlaXRoZXIgMChzbGVlcCBtb2RlKSBvciAxIChhY3RpdmUgbW9kZSkKKyAqIEBwYXJhbSBwTWFjICBwb2ludGVyIHRvIEdsb2JhbCBNYWMgc3RydWN0dXJlLgorCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCisKK3ZvaWQgcG1tSW5pdEJtcHNQd3JTYXZlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdFNpclJldFN0YXR1cyAgIHJldFN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0U2lyUmVzdWx0Q29kZXMgcmVzcFN0YXR1cyA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgdHBQRVNlc3Npb24gICAgIHBzZXNzaW9uRW50cnk7CisKKyAgICB0UG1tU3RhdGUgb3JpZ1N0YXRlID0gcE1hYy0+cG1tLmdQbW1TdGF0ZTsKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVHZXRWYWxpZFBvd2VyU2F2ZVNlc3Npb24ocE1hYykpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJlc3BTdGF0dXMgPSBlU0lSX1NNRV9CTVBTX1JFUV9GQUlMRUQ7CisgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0VOVEVSX0JNUFNfUkVRX0VWRU5ULCBwc2Vzc2lvbkVudHJ5LCAwLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworICAgIGlmICggKChwTWFjLT5wbW0uZ1BtbVN0YXRlICE9IGVQTU1fU1RBVEVfUkVBRFkpICYmCisgICAgICAgICAocE1hYy0+cG1tLmdQbW1TdGF0ZSAhPSBlUE1NX1NUQVRFX0JNUFNfV0FLRVVQKSkgfHwKKyAgICAgICAgIGxpbUlzU3lzdGVtSW5TY2FuU3RhdGUocE1hYykgfHwKKyAgICAgICAgIChwTWFjLT5saW0uZ0xpbVNwZWNNZ210LmRvdDExaENoYW5Td1N0YXRlID09IGVMSU1fMTFIX0NIQU5TV19SVU5OSU5HKSB8fAorICAgICAgICAgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSA9PSBlTElNX1FVSUVUX1JVTk5JTkcpKQorICAgIHsKKyAgICAgICAgUEVMT0dFKHBtbUxvZyhwTWFjLCBMT0dFLCAKKyAgICAgICAgICAgIEZMKCJwbW1CbXBzOiBCTVBTIFJlcXVlc3QgcmVjZWl2ZWQgaW4gaW52YWxpZCBzdGF0ZSBQTU09JWQsIFNNRT0lZCwgcmVqZWN0aW5nIHRoZSBpbml0cHdyc2F2ZSByZXF1ZXN0XG4iKSwgCisgICAgICAgICAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlLCBwTWFjLT5saW0uZ0xpbVNtZVN0YXRlKTspCisKKyAgICAgICAgcmVzcFN0YXR1cyA9IGVTSVJfU01FX0lOVkFMSURfUE1NX1NUQVRFOworICAgICAgICBwbW1CbXBzVXBkYXRlSW52YWxpZFN0YXRlQ250KHBNYWMpOworICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorCisKKyAgICAvKiBBdCB0aGlzIHBvaW50LCBkZXZpY2UgaXMgYXNzb2NpYXRlZCBhbmQgUE1NIGlzIG5vdCBpbiBCTVBTX1NMRUVQIHN0YXRlLiAKKyAgICAgKiBIZWFydGJlYXQgdGltZXIgbm90IHJ1bm5pbmcgaXMgYW4gaW5kaWNhdGlvbiB0aGF0IFBFIGhhdmUgZGV0ZWN0ZWQgYQorICAgICAqIGxvc3Mgb2YgbGluay4gSW4gdGhpcyBjYXNlLCByZWplY3QgQk1QUyByZXF1ZXN0LiAKKyAgICAgKi8KKyAgICAgLyogVE9ETyA6IFdlIG5lZWQgdG8gaGF2ZSBhIGJldHRlciBjaGVjay4gVGhpcyBjaGVjayBpcyBub3QgdmFsaWQgKi8KKyNpZiAwICAgICAKKyAgICBpZiAoIChwTWFjLT5zeXMuZ1N5c0VuYWJsZUxpbmtNb25pdG9yTW9kZSkgJiYgKHBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUhlYXJ0QmVhdFRpbWVyLnBNYWMpICkKKyAgICB7CisgICAgICAgIGlmKFZPU19UUlVFICE9IHR4X3RpbWVyX3J1bm5pbmcoJnBNYWMtPmxpbS5saW1UaW1lcnMuZ0xpbUhlYXJ0QmVhdFRpbWVyKSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HRShwbW1Mb2cocE1hYywgTE9HRSwgCisgICAgICAgICAgICAgICAgRkwoIlJlamVjdCBCTVBTX1JFUSBiZWNhdXNlIEhlYXJ0QmVhdFRpbWVyIGlzIG5vdCBydW5uaW5nLiBcbiIpKTspCisgICAgICAgICAgICByZXNwU3RhdHVzID0gZVNJUl9TTUVfQk1QU19SRVFfRkFJTEVEOworICAgICAgICAgICAgZ290byBmYWlsdXJlOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvL0lmIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gcmV0dXJucyBTVUNDRVNTLCB0aGVuIFBNTSB3aWxsIHdhaXQgZm9yIGFuIGV4cGxpY2l0CisgICAgLy9yZXNwb25zZSBtZXNzYWdlIGZyb20gc29mdG1hYy4KKworICAgIC8vY2hhbmdpbmcgUE1NIHN0YXRlIGJlZm9yZSBwb3N0aW5nIG1lc3NhZ2UgdG8gSEFMLCBhcyB0aGlzIGlzIGEgc3luY2hyb25vdXMgY2FsbCB0byBIQUwKKyAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlID0gZVBNTV9TVEFURV9CTVBTX1dUX0lOSVRfUlNQOworICAgIGlmKChyZXRTdGF0dXMgPSBwbW1TZW5kSW5pdFBvd2VyU2F2ZU1zZyhwTWFjLHBzZXNzaW9uRW50cnkpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsIAorICAgICAgICAgICAgRkwoInBtbUJtcHM6IEluaXQgUG93ZXIgU2F2ZSBSZXF1ZXN0IEZhaWxlZDogU2VuZGluZyBSZXNwb25zZTogJWRcbiIpLCAKKyAgICAgICAgICAgIHJldFN0YXR1cyk7KQorCisgICAgICAgIHJlc3BTdGF0dXMgPSBlU0lSX1NNRV9CTVBTX1JFUV9GQUlMRUQ7CisgICAgICAgIHBtbUJtcHNVcGRhdGVIYWxSZXFGYWlsdXJlQ250KHBNYWMpOworICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIC8vVXBkYXRlIHRoZSBwb3dlclNhdmUgc2Vzc2lvbklkCisgICAgcE1hYy0+cG1tLnNlc3Npb25JZCA9IHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkOworICAgIHJldHVybjsKKworZmFpbHVyZToKKworICAgIC8vIENoYW5nZSB0aGUgc3RhdGUgYmFjayB0byBvcmlnaW5hbCBzdGF0ZQorICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPW9yaWdTdGF0ZTsKKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfUE1DX0VOVEVSX0JNUFNfUlNQLCByZXNwU3RhdHVzLCAwLCAwKTsKKyAgICByZXR1cm47Cit9CisKKworLyoqCisgKiBwbW1TZW5kQ2hhbmdlUG93ZXJTYXZlTXNnKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBTSVJfSEFMX0VYSVRfQk1QU19SRVEgdG8gSEFMLgorICogVGhpcyBtZXNzYWdlIHdpbGwgdHJpZ2dlciBIQUwgdG8gcHJvZ3JhbSBIVyB0byB3YWtlIHVwLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgcG9pbnRlciB0byBHbG9iYWwgTWFjIHN0cnVjdHVyZS4KKyAqIEByZXR1cm4gc3VjY2VzcyBpZiBtZXNzYWdlIHNlbmQgaXMgb2ssIGVsc2UgZmFsc2UuCisgKi8KK3RTaXJSZXRTdGF0dXMgcG1tU2VuZENoYW5nZVBvd2VyU2F2ZU1zZyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRTaXJSZXRTdGF0dXMgIHJldFN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0cEV4aXRCbXBzUGFyYW1zICBwRXhpdEJtcHNQYXJhbXM7CisgICAgdFNpck1zZ1EgbXNnUTsKKyAgICB0QU5JX1U4ICBjdXJyZW50T3BlcmF0aW5nQ2hhbm5lbCA9IGxpbUdldEN1cnJlbnRPcGVyYXRpbmdDaGFubmVsKHBNYWMpOworCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRXhpdEJtcHNQYXJhbXMsIHNpemVvZigqcEV4aXRCbXBzUGFyYW1zKSkgKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR1csIEZMKCJwYWxBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZFxuIikpOworICAgICAgICByZXRTdGF0dXMgPSBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgICAgIHJldHVybiByZXRTdGF0dXM7CisgICAgfQorCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKilwRXhpdEJtcHNQYXJhbXMsIHNpemVvZigqcEV4aXRCbXBzUGFyYW1zKSk7CisgICAgbXNnUS50eXBlID0gV0RBX0VYSVRfQk1QU19SRVE7CisgICAgbXNnUS5yZXNlcnZlZCA9IDA7CisgICAgbXNnUS5ib2R5cHRyID0gcEV4aXRCbXBzUGFyYW1zOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICAvKiBJZiByZWFzb24gZm9yIGZ1bGwgcG93ZXIgaXMgZGlzY29ubmVjdGluZyAoaWUuIGxpbmsgaXMKKyAgICAgKiBkaXNjb25uZWN0ZWQpIG9yIGJlY2FzdWUgb2YgY2hhbm5lbCBzd2l0Y2ggb3IgZnVsbCBwb3dlciByZXF1ZXN0ZWQgCisgICAgICogYmVjYXVzZSBvZiBiZWFjb24gbWlzcyBhbmQgY29ubmVjdGVkIG9uIERGUyBjaGFubmVsIAorICAgICAqIHRoZW4gd2Ugc2hvdWxkIG5vdCBzZW5kIGRhdGEgbnVsbC4KKyAgICAgKiBGb3IgYWxsIG90aGVyIHJlYXNvbiBjb2RlLCBzZW5kIGRhdGEgbnVsbC4KKyAgICAgKi8KKyAgICBpZiAoICEoU0lSX0lTX0ZVTExfUE9XRVJfUkVBU09OX0RJU0NPTk5FQ1RFRChwTWFjLT5wbW0uZ1BtbUV4aXRCbXBzUmVhc29uQ29kZSkgfHwKKyAgICAgICAgICAoIChlU01FX01JU1NFRF9CRUFDT05fSU5EX1JDVkQgPT0gcE1hYy0+cG1tLmdQbW1FeGl0Qm1wc1JlYXNvbkNvZGUpICYmIAorICAgICAgICAgICAgIGxpbUlzY29ubmVjdGVkT25ERlNDaGFubmVsKGN1cnJlbnRPcGVyYXRpbmdDaGFubmVsKSkpKQorICAgICAgICBwRXhpdEJtcHNQYXJhbXMtPnNlbmREYXRhTnVsbCA9IDE7CisKKyAgICAvKiB3ZSBuZWVkIHRvIGRlZmVyIGFueSBpbmNvbWluZyBtZXNzYWdlcyB1bnRpbCB3ZQorICAgICAqIGdldCBhIFdEQV9FWElUX0JNUFNfUlNQIGZyb20gSEFMLgorICAgICAqLworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKyAgICBNVFJBQ0UobWFjVHJhY2VNc2dUeChwTWFjLCAwLCBtc2dRLnR5cGUpKTsKKyAgICByZXRTdGF0dXMgPSB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EpOworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gcmV0U3RhdHVzICkKKyAgICB7CisgICAgICAgIFBFTE9HRShwbW1Mb2coIHBNYWMsIExPR0UsIEZMKCJTZW5kaW5nIFdEQV9FWElUX0JNUFNfUkVRIGZhaWxlZCwgcmVhc29uPSVYIFxuIiksIHJldFN0YXR1cyApOykKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCopcEV4aXRCbXBzUGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIHJldFN0YXR1czsKKyAgICB9CisKKyAgICBQRUxPRzEocG1tTG9nKHBNYWMsIExPRzEsIEZMKCJXREFfRVhJVF9CTVBTX1JFUSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byBIQUxcbiIpKTspCisgICAgcmV0dXJuIHJldFN0YXR1czsKK30KKworCisvKioKKyAqIHBtbVNlbmRJbml0UG93ZXJTYXZlTXNnKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBFTlRFUl9CTVBTX1JFUSBtZXNzYWdlIHRvIEhBTC4KKyAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IHRvIGludGlhbGl6ZSB0aGUgcHJvY2VzcyBvZiBicmluZ2luZyB0aGUKKyAqIHN0YXRpb24gaW50byBwb3dlciBzYXZlIHN0YXRlLgorICoKKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgcG9pbnRlciB0byBHbG9iYWwgTWFjIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBtb2RlIFRoZSBQb3dlciBTYXZlIG9yIEFjdGl2ZSBTdGF0ZQorICoKKyAqIEByZXR1cm4gc3VjY2VzcyBpZiBtZXNzYWdlIHNlbmQgaXMgb2ssIGVsc2UgZmFsc2UuCisgKi8KKwordFNpclJldFN0YXR1cyAgcG1tU2VuZEluaXRQb3dlclNhdmVNc2codHBBbmlTaXJHbG9iYWwgcE1hYyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJSZXRTdGF0dXMgICByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworICAgIHRTaXJNc2dRIG1zZ1E7CisgICAgdHBFbnRlckJtcHNQYXJhbXMgcEJtcHNQYXJhbXMgPSBOVUxMOworICAgIGludCAgICAgICAgIGk9MDsKKworICAgIHRBTklfVTMyICAgIHJzc2lGaWx0ZXJQZXJpb2QgPSA1OworICAgIHRBTklfVTMyICAgIG51bUJlYWNvblBlclJzc2lBdmVyYWdlID0gNTsKKyAgICB0QU5JX1UzMiAgICBiUnNzaUZpbHRlckVuYWJsZSA9IEZBTFNFOworCisgICAgaWYocHNlc3Npb25FbnRyeS0+Y3VycmVudEJzc0JlYWNvbkNudCA9PSAwKQorICAgIHsKKyAgICAgICAgUEVMT0dFKHBtbUxvZyggcE1hYywgTE9HRSwgIEZMKCJCZWFjb24gY291bnQgaXMgemVybywgY2FuIG5vdCByZXRyaWV2ZSB0aGUgVFNGLCBmYWlsaW5nIHRoZSBFbnRlciBCbXBzIFJlcXVlc3RcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQm1wc1BhcmFtcywgc2l6ZW9mKHRFbnRlckJtcHNQYXJhbXMpKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR1AsICJQTU06IE5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgRW50ZXIgQm1wc1xuIik7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgcE1hYy0+cG1tLmluTWlzc2VkQmVhY29uU2NlbmFyaW8gPSBGQUxTRTsKKyAgICBwQm1wc1BhcmFtcy0+cmVzcFJlcWQgPSBUUlVFOworCisgICAgcEJtcHNQYXJhbXMtPnRidHQgPSBwc2Vzc2lvbkVudHJ5LT5sYXN0QmVhY29uVGltZVN0YW1wOworICAgIHBCbXBzUGFyYW1zLT5kdGltQ291bnQgPSBwc2Vzc2lvbkVudHJ5LT5sYXN0QmVhY29uRHRpbUNvdW50OworICAgIHBCbXBzUGFyYW1zLT5kdGltUGVyaW9kID0gcHNlc3Npb25FbnRyeS0+bGFzdEJlYWNvbkR0aW1QZXJpb2Q7CisgICAgcEJtcHNQYXJhbXMtPmJzc0lkeCA9IHBzZXNzaW9uRW50cnktPmJzc0lkeDsKKworICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUlNTSV9GSUxURVJfUEVSSU9ELCAmcnNzaUZpbHRlclBlcmlvZCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBwbW1Mb2cocE1hYywgTE9HUCwgRkwoInBtbUNmZzogY2ZnR2V0IGZhaWxlZCBmb3IgUnNzaSBmaWx0ZXIgcGVyaW9kIikpOworCisgICAgLy8gVGhpcyBmbGFnIGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gMTFyL0NDWEVuYWJsZWQ9MSBhbmQgRmFzdFRyYW5zaXRpb249MQorICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUiwgJmJSc3NpRmlsdGVyRW5hYmxlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHBtbUxvZyhwTWFjLCBMT0dQLCBGTCgicG1tQ2ZnOiBjZmdHZXQgZmFpbGVkIGZvciBSc3NpIG1vbml0b3IgZW5hYmxlIGZsYWciKSk7CisgICAgcEJtcHNQYXJhbXMtPmJSc3NpRmlsdGVyRW5hYmxlID0gYlJzc2lGaWx0ZXJFbmFibGU7CisKKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICAvLyBJZiB0aGVyZSBpcyBhIENDWCBhc3NvYyBvciAxMXIgYXNzb2Mgd2UgbmVlZCB0byBwaWNrIHVwIHRoZSByc3NpRmlsdGVyUGVyaW9kIGZyb20gdGhlCisgICAgLy8gRlQgY29uZmlnIHZhbHVlLgorICAgIGZvcihpID0wOyBpIDwgcE1hYy0+bGltLm1heEJzc0lkOyBpKyspCisgICAgeworICAgICAgICBpZiAobGltaXNGYXN0VHJhbnNpdGlvblJlcXVpcmVkKHBNYWMsIGkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0ZUX1JTU0lfRklMVEVSX1BFUklPRCwgJnJzc2lGaWx0ZXJQZXJpb2QpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBwbW1Mb2cocE1hYywgTE9HUCwgRkwoInBtbUNmZzogY2ZnR2V0IGZhaWxlZCBmb3IgUnNzaSBmaWx0ZXIgcGVyaW9kIikpOworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBvdmVycmlkZSB0aGUgaW5pIHZhbHVlIHRvIGVuYWJsZSAKKyAgICAgICAgICAgIC8vIEZXIFJTU0kgTW9uaXRvcmluZy4gQmFzaWNhbGx5IGlmIENDWCBhbmQgRlQgYXJlIGVuYWJsZWQKKyAgICAgICAgICAgIC8vIHRoZW4gZW5hYmxlIEZXIFJTU0kgTW9uaXRvcmluZworCisgICAgICAgICAgICBwQm1wc1BhcmFtcy0+YlJzc2lGaWx0ZXJFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHBCbXBzUGFyYW1zLT5yc3NpRmlsdGVyUGVyaW9kID0gKHRBTklfVTgpcnNzaUZpbHRlclBlcmlvZDsKKworICAgIC8qIFRoZSBudW1CZWFjb25QZXJSc3NpQXZlcmFnZSBzaG91bGQgYmUgPD0gcnNzaUZpbHRlciBQZXJpb2QsCisgICAgICogYW5kIGxlc3MgdGhhbiB0aGUgbWF4IGFsbG93ZWQgKGRlZmF1bHQgc2V0IHRvIDIwIGluIENGRykKKyAgICAgKi8KKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRSwgJm51bUJlYWNvblBlclJzc2lBdmVyYWdlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHBtbUxvZyhwTWFjLCBMT0dQLCBGTCgicG1tQ2ZnOiBjZmdHZXQgZmFpbGVkIGZvciBudW0gYmVhY29uIHBlciByc3NpIikpOworCisgICAgcEJtcHNQYXJhbXMtPm51bUJlYWNvblBlclJzc2lBdmVyYWdlID0gKHRBTklfVTgpIG51bUJlYWNvblBlclJzc2lBdmVyYWdlOworICAgIGlmIChudW1CZWFjb25QZXJSc3NpQXZlcmFnZSA+IHJzc2lGaWx0ZXJQZXJpb2QpCisgICAgICAgIHBCbXBzUGFyYW1zLT5udW1CZWFjb25QZXJSc3NpQXZlcmFnZSA9IAorICAgICAgICAgICAgKHRBTklfVTgpR0VUX01JTl9WQUxVRShyc3NpRmlsdGVyUGVyaW9kLCBXTklfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRV9TVEFNQVgpOworCisgICAgcG1tTG9nIChwTWFjLCBMT0cxLAorICAgICAgICAiJXM6IFtJTkZPTE9HXVJzc2lGaWx0ZXJJbmZvLi4lZCAleCAleFxuIiwgX19mdW5jX18sIChpbnQpcEJtcHNQYXJhbXMtPmJSc3NpRmlsdGVyRW5hYmxlLAorICAgICAgICAodW5zaWduZWQgaW50KXBCbXBzUGFyYW1zLT5yc3NpRmlsdGVyUGVyaW9kLCAodW5zaWduZWQgaW50KXBCbXBzUGFyYW1zLT5udW1CZWFjb25QZXJSc3NpQXZlcmFnZSk7CisKKyAgICBtc2dRLnR5cGUgPSBXREFfRU5URVJfQk1QU19SRVE7CisgICAgbXNnUS5yZXNlcnZlZCA9IDA7CisgICAgbXNnUS5ib2R5cHRyID0gcEJtcHNQYXJhbXM7CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKworICAgIFBFTE9HVyhwbW1Mb2coIHBNYWMsIExPR1csCisgICAgICAgIEZMKCAicG1tQm1wczogU2VuZGluZyBXREFfRU5URVJfQk1QU19SRVEiICkpOykKKworICAgIC8qIHdlIG5lZWQgdG8gZGVmZXIgYW55IGluY29taW5nIG1lc3NhZ2VzIHVudGlsIHdlIGdldCBhCisgICAgICogV0RBX0VOVEVSX0JNUFNfUlNQIGZyb20gSEFMLgorICAgICAqLworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKworICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gKHJldENvZGUgPSB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKSkpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBCbXBzUGFyYW1zKTsKKyAgICAgICAgUEVMT0dFKHBtbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgIEZMKCJQb3N0aW5nIFdEQV9FTlRFUl9CTVBTX1JFUSB0byBIQUwgZmFpbGVkLCByZWFzb249JVhcbiIpLAorICAgICAgICAgICAgcmV0Q29kZSApOykKKyAgICB9CisKKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworLyoqCisgKiBwbW1TZW5kUG93ZXJTYXZlQ2ZnKCkKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBwb3dlciBzYXZlIGNvbmZpZ3VydGlvbi4KKyAqCisgKk5PVEU6CisgKgorICogQHBhcmFtIHBNYWMgIHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gbW9kZSBUaGUgUG93ZXIgU2F2ZSBvciBBY3RpdmUgU3RhdGUKKyAqCisgKiBAcmV0dXJuIHN1Y2Nlc3MgaWYgbWVzc2FnZSBzZW5kIGlzIG9rLCBlbHNlIGZhbHNlLgorICovCit0U2lyUmV0U3RhdHVzIHBtbVNlbmRQb3dlclNhdmVDZmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJQb3dlclNhdmVDZmcgcFVwZGF0ZWRQd3JTYXZlQ2ZnKQoreworICAgIHRTaXJSZXRTdGF0dXMgICByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworICAgIHRTaXJNc2dRICAgIG1zZ1E7CisgICAgdEFOSV9VMzIgICAgbGlzdGVuSW50ZXJ2YWw7CisgICAgdEFOSV9VMzIgICAgSGVhcnRCZWF0Q291bnQgPSAxOworICAgIHRBTklfVTMyICAgIG1heFBzUG9sbDsKKyAgICB0QU5JX1UzMiAgICBudW1CZWFjb25QZXJSc3NpQXZlcmFnZTsKKyAgICB0QU5JX1UzMiAgICBtaW5Sc3NpVGhyZXNob2xkOworICAgIHRBTklfVTMyICAgIG50aEJlYWNvbkZpbHRlcjsKKyAgICB0QU5JX1UzMiAgICBicm9hZGNhc3RGcmFtZUZpbHRlcjsKKyAgICB0QU5JX1UzMiAgICByc3NpRmlsdGVyUGVyaW9kOworICAgIHRBTklfVTMyICAgIGlnbm9yZUR0aW07CisKKyAgICBpZiAoTlVMTCA9PSBwVXBkYXRlZFB3clNhdmVDZmcpCisgICAgICAgIGdvdG8gcmV0dXJuRmFpbHVyZTsKKworICAgIGlmKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgIT0gZUxJTV9TTUVfSURMRV9TVEFURSAgKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCgicG1tQ2ZnOiBQb3dlciBTYXZlIENvbmZpZ3VyYXRpb24gcmVjZWl2ZWQgaW4gaW52YWxpZCBzdGF0ZSAlZCIpLAorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1TbWVTdGF0ZSk7CisgICAgICAgIHJldENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1NUQVRFOworICAgICAgICBnb3RvIHJldHVybkZhaWx1cmU7CisgICAgfQorCisgICAgLy8gR2V0IHBvd2VyIHNhdmUgY29uZmlndXJhdGlvbiBDRkcgdmFsdWVzCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19MSVNURU5fSU5URVJWQUwsICZsaXN0ZW5JbnRlcnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBwbW1Mb2cocE1hYywgTE9HUCwgRkwoInBtbUNmZzogY2ZnR2V0IGZhaWxlZCBmb3IgbGlzdGVuIGludGVydmFsIikpOworICAgIHBVcGRhdGVkUHdyU2F2ZUNmZy0+bGlzdGVuSW50ZXJ2YWwgPSAodEFOSV9VMTYpbGlzdGVuSW50ZXJ2YWw7CisKKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xELCAmSGVhcnRCZWF0Q291bnQpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR1AsIEZMKCJwbW1DZmc6IGNmZ0dldCBmYWlsZWQgZm9yIGhlYXJ0IGJlYXQgdGhyZXNoIikpOworCisgICAgcE1hYy0+bGltLmdMaW1IZWFydEJlYXRDb3VudCA9IEhlYXJ0QmVhdENvdW50OworICAgIHBVcGRhdGVkUHdyU2F2ZUNmZy0+SGVhcnRCZWF0Q291bnQgPSBIZWFydEJlYXRDb3VudDsKKworICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfTlRIX0JFQUNPTl9GSUxURVIsICZudGhCZWFjb25GaWx0ZXIpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR1AsIEZMKCJwbW1DZmc6IGNmZ0dldCBmYWlsZWQgZm9yIE50aCBiZWFjb24gZmlsdGVyIikpOworICAgIHBVcGRhdGVkUHdyU2F2ZUNmZy0+bnRoQmVhY29uRmlsdGVyID0gbnRoQmVhY29uRmlsdGVyOworCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19NQVhfUFNfUE9MTCwgJm1heFBzUG9sbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBwbW1Mb2cocE1hYywgTE9HUCwgRkwoInBtbUNmZzogY2ZnR2V0IGZhaWxlZCBmb3IgbWF4IHBvbGwiKSk7CisgICAgcFVwZGF0ZWRQd3JTYXZlQ2ZnLT5tYXhQc1BvbGwgPSBtYXhQc1BvbGw7CisKKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX01JTl9SU1NJX1RIUkVTSE9MRCwgJm1pblJzc2lUaHJlc2hvbGQpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR1AsIEZMKCJwbW1DZmc6IGNmZ0dldCBmYWlsZWQgZm9yIG1pbiBSU1NJIFRocmVzaG9sZCIpKTsKKyAgICBwVXBkYXRlZFB3clNhdmVDZmctPm1pblJzc2lUaHJlc2hvbGQgPSBtaW5Sc3NpVGhyZXNob2xkOworCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0UsICZudW1CZWFjb25QZXJSc3NpQXZlcmFnZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBwbW1Mb2cocE1hYywgTE9HUCwgRkwoInBtbUNmZzogY2ZnR2V0IGZhaWxlZCBmb3IgbnVtIGJlYWNvbiBwZXIgcnNzaSIpKTsKKyAgICBwVXBkYXRlZFB3clNhdmVDZmctPm51bUJlYWNvblBlclJzc2lBdmVyYWdlID0gKHRBTklfVTgpIG51bUJlYWNvblBlclJzc2lBdmVyYWdlOworCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19SU1NJX0ZJTFRFUl9QRVJJT0QsICZyc3NpRmlsdGVyUGVyaW9kKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHBtbUxvZyhwTWFjLCBMT0dQLCBGTCgicG1tQ2ZnOiBjZmdHZXQgZmFpbGVkIGZvciBSc3NpIGZpbHRlciBwZXJpb2QiKSk7CisgICAgcFVwZGF0ZWRQd3JTYXZlQ2ZnLT5yc3NpRmlsdGVyUGVyaW9kID0gKHRBTklfVTgpIHJzc2lGaWx0ZXJQZXJpb2Q7CisKKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0JST0FEQ0FTVF9GUkFNRV9GSUxURVJfRU5BQkxFLCAmYnJvYWRjYXN0RnJhbWVGaWx0ZXIpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR1AsIEZMKCJwbW1DZmc6IGNmZ0dldCBmYWlsZWQgZm9yIE50aCBiZWFjb24gZmlsdGVyIikpOworICAgIHBVcGRhdGVkUHdyU2F2ZUNmZy0+YnJvYWRjYXN0RnJhbWVGaWx0ZXIgPSAodEFOSV9VOCkgYnJvYWRjYXN0RnJhbWVGaWx0ZXI7CisKKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0lHTk9SRV9EVElNLCAmaWdub3JlRHRpbSkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBwbW1Mb2cocE1hYywgTE9HUCwgRkwoInBtbUNmZzogY2ZnR2V0IGZhaWxlZCBmb3IgaWdub3JlRHRpbSIpKTsKKyAgICBwVXBkYXRlZFB3clNhdmVDZmctPmlnbm9yZUR0aW0gPSAodEFOSV9VOCkgaWdub3JlRHRpbTsKKworICAgIC8qIFRoZSBudW1CZWFjb25QZXJSc3NpQXZlcmFnZSBzaG91bGQgYmUgPD0gcnNzaUZpbHRlciBQZXJpb2QsCisgICAgICogYW5kIGxlc3MgdGhhbiB0aGUgbWF4IGFsbG93ZWQgKGRlZmF1bHQgc2V0IHRvIDIwIGluIENGRykKKyAgICAgKi8KKyAgICBpZiAobnVtQmVhY29uUGVyUnNzaUF2ZXJhZ2UgPiByc3NpRmlsdGVyUGVyaW9kKQorICAgICAgICBwVXBkYXRlZFB3clNhdmVDZmctPm51bUJlYWNvblBlclJzc2lBdmVyYWdlID0gKHRBTklfVTgpR0VUX01JTl9WQUxVRShyc3NpRmlsdGVyUGVyaW9kLCBXTklfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRV9TVEFNQVgpOworCisgICAgLy9TYXZlIGEgY29weSBvZiB0aGUgQ0ZHIGluIGdsb2JhbCBwbW0gY29udGV4dC4KKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSAmcE1hYy0+cG1tLmdQbW1DZmcsICBwVXBkYXRlZFB3clNhdmVDZmcsIHNpemVvZih0U2lyUG93ZXJTYXZlQ2ZnKSk7CisKKworICAgIG1zZ1EudHlwZSA9IFdEQV9QV1JfU0FWRV9DRkc7CisgICAgbXNnUS5yZXNlcnZlZCA9IDA7CisgICAgbXNnUS5ib2R5cHRyID0gcFVwZGF0ZWRQd3JTYXZlQ2ZnOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICBQRUxPRzEocG1tTG9nKCBwTWFjLCBMT0cxLCBGTCggInBtbUJtcHM6IFNlbmRpbmcgV0RBX1BXUl9TQVZFX0NGRyB0byBIQUwiKSk7KQorICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gKHJldENvZGUgPSB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKSkpCisgICAgeworICAgICAgICBwbW1Mb2coIHBNYWMsIExPR1AsCisgICAgICAgICAgICBGTCgiUG9zdGluZyBXREFfUFdSX1NBVkVfQ0ZHIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWCIpLAorICAgICAgICAgICAgcmV0Q29kZSApOworICAgICAgICBnb3RvIHJldHVybkZhaWx1cmU7CisgICAgfQorICAgIHJldHVybiByZXRDb2RlOworCityZXR1cm5GYWlsdXJlOgorCisgICAgLyogSW4gY2FzZSBvZiBmYWlsdXJlLCB3ZSBuZWVkIHRvIGZyZWUgdGhlIG1lbW9yeSAqLworICAgIGlmIChOVUxMICE9IHBVcGRhdGVkUHdyU2F2ZUNmZykKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopIHBVcGRhdGVkUHdyU2F2ZUNmZyk7CisgICAgfQorICAgIHJldHVybiByZXRDb2RlOworfQorCisvKioKKyAqIHBtbUV4aXRCbXBzUmVzcG9uc2VIYW5kbGVyCisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBXYWtldXAgUnNwIGZyb20gSEFMIGFuZCBpZiBzdWNjZXNzZnVsbCwKKyAqIHNlbmRzIGEgcmVzcG5vc2UgYmFjayB0byBQTUMgbGF5ZXIuCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOQQorICoKKyAqTk9URToKKyAqIE5BCisgKgorICogQHBhcmFtIHBNYWMgIHBvaW50ZXIgdG8gR2xvYmFsIE1hYyBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gcnNwU3RhdHVzIFN0YXR1cyBvZiB0aGUgcmVzcG9uc2UsIFN1Y2Nlc3Mgb3IgYW4gZXJyb3IgY29kZS4KKyAqCisgKiBAcmV0dXJuIG5vbmUuCisgKi8KK3ZvaWQgcG1tRXhpdEJtcHNSZXNwb25zZUhhbmRsZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgIHRwU2lyTXNnUSBsaW1Nc2cpCit7CisgICAgdHBFeGl0Qm1wc1BhcmFtcyAgcEV4aXRCbXBzUnNwOworICAgIGVIYWxTdGF0dXMgIHJzcFN0YXR1czsKKyAgICB0QU5JX1U4IFBvd2Vyc2F2ZXNlc3Npb25JZDsKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworICAgIHRTaXJSZXN1bHRDb2RlcyByZXRTdGF0dXMgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgIAorICAgIC8qIENvcHkgdGhlIHBvd2VyIHNhdmUgc2Vzc2lvbklkIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSAqLworICAgIFBvd2Vyc2F2ZXNlc3Npb25JZCA9IHBNYWMtPnBtbS5zZXNzaW9uSWQ7CisKKyAgICAvKiB3ZSBuZWVkIHRvIHByb2Nlc3MgYWxsIHRoZSBkZWZlcnJlZCBtZXNzYWdlcyBlbnF1ZXVlZCBzaW5jZQorICAgICAqIHRoZSBpbml0aWF0aW5nIHRoZSBTSVJfSEFMX0VYSVRfQk1QU19SRVEuCisgICAgICovCisKKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5U2Vzc2lvbklkKHBNYWMsUG93ZXJzYXZlc2Vzc2lvbklkKSk9PU5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAKKworICAgIC8qIFVwZGF0ZSB3YWtldXAgc3RhdGlzdGljcyAqLworICAgIHBtbVVwZGF0ZVdha2V1cFN0YXRzKHBNYWMpOworCisgICAgaWYgKE5VTEwgPT0gbGltTXNnLT5ib2R5cHRyKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsIEZMKCJSZWNlaXZlZCBTSVJfSEFMX0VYSVRfQk1QU19SU1Agd2l0aCBOVUxMICIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwRXhpdEJtcHNSc3AgPSAodHBFeGl0Qm1wc1BhcmFtcykobGltTXNnLT5ib2R5cHRyKTsKKyAgICByc3BTdGF0dXMgPSBwRXhpdEJtcHNSc3AtPnN0YXR1czsKKworICAgIGlmKHBNYWMtPnBtbS5nUG1tU3RhdGUgIT0gZVBNTV9TVEFURV9CTVBTX1dUX1dBS0VVUF9SU1ApCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCgiUmVjZWl2ZWQgU0lSX0hBTF9FWElUX0JNUFNfUlNQIHdoaWxlIGluIGluY29ycmVjdCBzdGF0ZTogJWRcbiIpLAorICAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1TdGF0ZSk7KQorCisgICAgICAgIHJldFN0YXR1cyA9IGVTSVJfU01FX0lOVkFMSURfUE1NX1NUQVRFOworICAgICAgICBwbW1CbXBzVXBkYXRlSW52YWxpZFN0YXRlQ250KHBNYWMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPR1cocG1tTG9nKHBNYWMsIExPR1csIEZMKCJSZWNlaXZlZCBTSVJfSEFMX0VYSVRfQk1QU19SU1AgaW4gY29ycmVjdCBzdGF0ZS4gXG4iKSk7KQorICAgIH0KKworICAgIC8qIFBFIGlzIGdvaW5nIHRvIHdha2V1cCBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlcgorICAgICAqIFNJUl9IQUxfRVhJVF9CTVBTX1JFUSB3YXMgc3VjY2Vzc2Z1bCBvciBub3QKKyAgICAgKi8KKyAgICBzd2l0Y2ggKHJzcFN0YXR1cykKKyAgICB7CisgICAgICAgIGNhc2UgZUhBTF9TVEFUVVNfU1VDQ0VTUzoKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFBFIGlzIGdvaW5nIHRvIGJlIGF3YWtlIGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyIEVYSVRfQk1QU19SRVEKKyAgICAgICAgICAgICAgICAgKiBmYWlsZWQgb3Igbm90LiBUaGlzIGlzIG1haW5seSB0byBlbGltaW5hdGUgdGhlIGRlYWQtbG9jayBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgKiBCdXQsIFBNQyB3aWxsIGJlIGluZm9ybWVkIGFib3V0IHRoZSBlcnJvci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXRTdGF0dXMgPSBlU0lSX1NNRV9CTVBTX1JFUV9GQUlMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPSBlUE1NX1NUQVRFX0JNUFNfV0FLRVVQOworICAgIHBtbVVwZGF0ZVdha2V1cFN0YXRzKHBNYWMpOworCisgICAgLy8gdHVybiBvbiBiYWNrZ3JvdW5kIHNjYW4KKyAgICBwTWFjLT5zeXMuZ1N5c0VuYWJsZVNjYW5Nb2RlID0gdHJ1ZTsKKworICAgIC8vIHNlbmQgcmVzcG9uc2UgdG8gUE1DCisgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1BNQ19FWElUX0JNUFNfUlNQLCByZXRTdGF0dXMsIDAsIDApOworCisgICAgaWYgKCBwTWFjLT5wbW0uZ1BtbUV4aXRCbXBzUmVhc29uQ29kZSA9PSBlU01FX01JU1NFRF9CRUFDT05fSU5EX1JDVkQpCisgICAgeworICAgICAgICBQRUxPR1cocG1tTG9nKHBNYWMsIExPR1csIEZMKCJSY3ZkIFNJUl9IQUxfRVhJVF9CTVBTX1JTUCB3aXRoIE1JU1NFRF9CRUFDT05cbiIpKTspCisgICAgICAgIHBtbU1pc3NlZEJlYWNvbkhhbmRsZXIocE1hYyk7CisgICAgfQorICAgIGVsc2UgaWYocE1hYy0+cG1tLmluTWlzc2VkQmVhY29uU2NlbmFyaW8pCisgICAgeworICAgICAgICBQRUxPR1cocG1tTG9nKHBNYWMsIExPR1csIEZMKCJSY3ZkIFNJUl9IQUxfRVhJVF9CTVBTX1JTUCBpbiBtaXNzZWQgYmVhY29uIHNjZW5hcmlvIGJ1dCByZWFzb24gY29kZSBub3QgY29ycmVjdCIpKTspCisgICAgICAgIHBtbU1pc3NlZEJlYWNvbkhhbmRsZXIocE1hYyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIEVuYWJsZSBoZWFydGJlYXQgdGltZXIKKyAgICAgICAgbGltUmVhY3RpdmF0ZUhlYXJ0QmVhdFRpbWVyKHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyoqCisgKiBwbW1NaXNzZWRCZWFjb25IYW5kbGVyKCkKKyAqCisgKkZVTkNUSU9OOgorICogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gUE1NIHJlY2VpdmVzIGFuIGVXTklfUE1DX0VYSVRfQk1QU19SRVEKKyAqICB3aXRoIHJlYXNvbiBjb2RlIGJlaW5nIGVTTUVfTUlTU0VEX0JFQUNPTl9JTkRfUkNWRC4KKyAqCisgKk5PVEU6CisgKiBAcGFyYW0gcE1hYyAgcG9pbnRlciB0byBHbG9iYWwgTWFjIHN0cnVjdHVyZS4KKyAqIEByZXR1cm4gbm9uZQorICovCit2b2lkIHBtbU1pc3NlZEJlYWNvbkhhbmRsZXIodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1U4IHB3clNhdmVTZXNzaW9uSWQ7CisgICAgdEFOSV9VMzIgYmVhY29uSW50ZXJ2YWwgPSAwOworICAgIHRBTklfVTMyIGhlYXJ0QmVhdEludGVydmFsID0gcE1hYy0+bGltLmdMaW1IZWFydEJlYXRDb3VudDsKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5OworICAgIAorICAgIC8qIENvcHkgdGhlIHBvd2VyIHNhdmUgc2Vzc2lvbklkIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSAqLworICAgIHB3clNhdmVTZXNzaW9uSWQgPSBwTWFjLT5wbW0uc2Vzc2lvbklkOworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlTZXNzaW9uSWQocE1hYyxwd3JTYXZlU2Vzc2lvbklkKSk9PU5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSxGTCgiU2Vzc2lvbiBEb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gc2Vzc2lvbklEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIFBFTE9HRShwbW1Mb2cocE1hYywgTE9HMSwgRkwoIlRoZSBkZXZpY2Ugd29rZSB1cCBkdWUgdG8gTUlTU0VEIEJFQUNPTiBcbiIpKTspCisKKyAgICAvKiBQcm9jZWVkIG9ubHkgaWYgSGVhcnRCZWF0IHRpbWVyIGlzIGNyZWF0ZWQgKi8KKyAgICBpZigocE1hYy0+bGltLmxpbVRpbWVycy5nTGltSGVhcnRCZWF0VGltZXIucE1hYykgJiYKKyAgICAgICAocE1hYy0+bGltLmdMaW1UaW1lcnNDcmVhdGVkKSkKKyAgICB7CisgICAgICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTCwgJmJlYWNvbkludGVydmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICBQRUxPRzEocG1tTG9nKHBNYWMsIExPRzEsIEZMKCJGYWlsIHRvIGdldCBCRUFDT05fSU5URVJWQUwgdmFsdWVcbiIpKTspCisKKyAgICAgICAgLyogQ2hhbmdlIHRpbWVyIHRvIHJlYWN0aXZhdGUgaXQgaW4gZnV0dXJlICovCisgICAgICAgIGhlYXJ0QmVhdEludGVydmFsPSBTWVNfTVNfVE9fVElDS1MoYmVhY29uSW50ZXJ2YWwgKiBoZWFydEJlYXRJbnRlcnZhbCk7CisKKyAgICAgICAgaWYoIHR4X3RpbWVyX2NoYW5nZSgmcE1hYy0+bGltLmxpbVRpbWVycy5nTGltSGVhcnRCZWF0VGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTMyKWhlYXJ0QmVhdEludGVydmFsLCAwKSAhPSBUWF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBQRUxPRzEocG1tTG9nKHBNYWMsIExPRzEsIEZMKCJGYWlsIHRvIGNoYW5nZSBIZWFydEJlYXQgdGltZXJcbiIpKTspCisgICAgICAgIH0KKworICAgICAgICAvKiB1cGRhdGUgc29tZSBzdGF0aXN0aWNzICovCisgICAgICAgIGlmKExJTV9JU19DT05ORUNUSU9OX0FDVElWRShwc2Vzc2lvbkVudHJ5KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+TGltUnhlZEJlYWNvbkNudER1cmluZ0hCIDwgTUFYX05PX0JFQUNPTlNfUEVSX0hFQVJUX0JFQVRfSU5URVJWQUwpCisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1IZWFydEJlYXRCZWFjb25TdGF0c1twc2Vzc2lvbkVudHJ5LT5MaW1SeGVkQmVhY29uQ250RHVyaW5nSEJdKys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1IZWFydEJlYXRCZWFjb25TdGF0c1swXSsrOworICAgICAgICB9CisKKyAgICAgICAgLyogVG8gaGFuZGxlIHRoZSBtaXNzZWQgYmVhY29uIGZhaWx1cmUsIG1lc3NhZ2UgaXMgYmVpbmcgcG9zdGVkIHRvIHNlbGYgYXMgaWYgdGhlCisgICAgICAgICAqIGFjdHVhbCB0aW1lciBoYXMgZXhwaXJlZC4gVGhpcyBpcyBkb25lIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGV4aXN0cyBvbmUKKyAgICAgICAgICogY29tbW9uIGVudHJ5IGFuZCBleGl0IHBvaW50cworICAgICAgICAgKi8KKyAgICAgICAgLy9saW1SZXNldEhCUGt0Q291bnQocE1hYyk7IC8vIDA5MDgwNTogV2hlcmUgZGlkIHRoaXMgY29tZSBmcm9tPworICAgICAgICBsaW1SZXNldEhCUGt0Q291bnQocHNlc3Npb25FbnRyeSk7IC8vIDA5MDgwNTogVGhpcyBpcyB3aGF0IGl0IFNIT1VMRCBiZS4gIElmIHdlIGV2ZW4gbmVlZCBpdC4KKyAgICAgICAgcG1tU2VuZE1lc3NhZ2VUb0xpbShwTWFjLCBTSVJfTElNX0hFQVJUX0JFQVRfVElNRU9VVCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBFTE9HRShwbW1Mb2cocE1hYywgTE9HRSwgRkwoIkhlYXJ0QmVhdCBUaW1lciBpcyBub3QgY3JlYXRlZCwgY2Fubm90IHJlLWFjdGl2YXRlXG4iKSk7KQorICAgIH0KKworICAgIHJldHVybjsKK30KKworCisvKioKKyAqIHBtbUV4aXRCbXBzSW5kaWNhdGlvbkhhbmRsZXIKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIFBvd2VyIFNhdmUgSW5kaWNhdGlvbi4gYmFjayB0byBQTUMgbGF5ZXIuCisgKiBUaGlzIGluZGljYXRpb24gaXMgb3JpZ2luYXRlZCBmcm9tIHNvZnRtYWMgYW5kIHdpbGwgb2NjdXIgaW4gdGhlIGZvbGxvd2luZyB0d28KKyAqIHNjZW5hcmlvczoKKyAqIDEpIFdoZW4gc29mdG1hYyBpcyBpbiBzbGVlcCBzdGF0ZSBhbmQgd2FrZXMgdXAgdG8gcGFyc2UgVElNIGFuZCBmaW5kcyB0aGF0CisgKiAgICAgQVAgaGFzIHRoZSBkYXRhIHBlbmRpbmcgZm9yIHRoaXMgU1RBLCB0aGVuIGl0IHNlbmRzIHRoaXMgaW5kaWNhdGlvbiB0byBsZXQgUE1DIGtub3cKKyAqICAgIHRoYXQgaXQgaXMgZ29pbmcgdG8gYmUgYXdha2UgYW5kIHBhc3MgdGhlIGNvbnRyb2wgb3ZlciB0byBQTUMKKyAqIDIpIFdoZW4gc29mdG1hYyBpcyBpbiBzbGVlcCBzdGF0ZSBhbmQgd2FrZXMgdXAgdG8gcGFyc2UgVElNIGFuZCBkZXRlcm1pbmVzIHRoYXQKKyAqICAgICBjdXJyZW50IFRJTSBpcyBEVElNIGFuZCBBUCBoYXMgYnVmZmVyZWQgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZXMuCisgKiAgICBJbiB0aGlzIHNjZW5hcmlvLCBzb2Z0bWFjIG5lZWRzIHRvIHJlbWFpbiBhd2FrZSBmb3IgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZXMgYW5kIGl0CisgKiAgICBzZW5kcyBhbiBpbmRpY2F0aW9uIHRvIFBNQyB0aGF0IGl0IGlzIGF3YWtlIGFuZCBwYXNzZXMgdGhlIGNvbnRyb2wgb3ZlciB0byBQTUMuCisgKiAzKSBJZiBzdGF0aW9uIGlzIGF3YWtlIGFuZCAnZkVuYWJsZVB3clNhdmVJbW1lZGlhdGVseScgZmxhZyBpcyBzZXQsIHRoZW4gc29mdG1hYyB3aWxsIHRyYW5zbWl0IGFsbAorICogICAgIGZyYW1lcyBpbiBpdHMgcXVldWVzIGFuZCBnbyB0byBzbGVlcC4gQmVmb3JlIGdvaW5nIHRvIHNsZWVwIGl0IHNlbmRzIHRoZSBub3RpZmljYXRpb24gdG8gUE1DIHRoYXQKKyAqICAgICBpdCBpcyBnb2luZyB0byBzbGVlcC4KKyAqTE9HSUM6CisgKgorICpBU1NVTVBUSU9OUzoKKyAqIE5BCisgKgorICpOT1RFOgorICogTkEKKyAqCisgKiBAcGFyYW0gcE1hYyAgcG9pbnRlciB0byBHbG9iYWwgTWFjIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSByc3BTdGF0dXMgU3RhdHVzIG9mIHRoZSByZXNwb25zZSwgU3VjY2VzcyBvciBhbiBlcnJvciBjb2RlLgorICoKKyAqIEByZXR1cm4gbm9uZS4KKyAqLworCit2b2lkIHBtbUV4aXRCbXBzSW5kaWNhdGlvbkhhbmRsZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBtb2RlLCBlSGFsU3RhdHVzIHJzcFN0YXR1cykKK3sKKworICAgIHRBTklfVTMyIGJlYWNvbkludGVydmFsID0gMDsKKyAgICB0QU5JX1UzMiBoZWFydEJlYXRJbnRlcnZhbCA9IHBNYWMtPmxpbS5nTGltSGVhcnRCZWF0Q291bnQ7CisgICAgdEFOSV9VOCAgcG93ZXJzYXZlc2Vzc2lvbklkOworICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnk7CisKKyAgICAvKiBDb3B5IHRoZSBwb3dlciBzYXZlIHNlc3Npb25JZCB0byB0aGUgbG9jYWwgdmFyaWFibGUgKi8KKyAgICBwb3dlcnNhdmVzZXNzaW9uSWQgPSBwTWFjLT5wbW0uc2Vzc2lvbklkOworCisgICAgcHNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeVNlc3Npb25JZChwTWFjLHBvd2Vyc2F2ZXNlc3Npb25JZCk7CisKKyAgICBpZihwc2Vzc2lvbkVudHJ5ID09IE5VTEwpCisgICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJTZXNzaW9uIGRvZXMgTm90IGV4aXN0IHdpdGggZ2l2ZW4gc2Vzc2lvbklkIDolZCBcbiIpLHBvd2Vyc2F2ZXNlc3Npb25JZCk7KQorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFNpbmNlLCB0aGUgaGFyZHdhcmUgaXMgYWxyZWFkeSB3b2tlbnVwLCBQRSBhbHNvIHdha2VzdXAgYW5kIGluZm9ybXMKKyAgICAgKiB0aGUgdXBwZXIgbGF5ZXJzIHRoYXQgdGhlIHN5c3RlbSBpcyB3YWtpbmcgdXAuIEhlbmNlIGFsd2F5cyBTdWNjZXNzIGlzCisgICAgICogc2VudCBpbiB0aGUgcmVhc29uIGNvZGUgZm9yIHRoZSBtZXNzYWdlIHNlbnQgdG8gUE1DCisgICAgICovCisKKyAgICBQRUxPR1cocG1tTG9nKHBNYWMsIExPR1csIAorICAgICAgICAgICBGTCgicG1tQm1wczogUmVjZWl2ZWQgU0lSX0hBTF9FWElUX0JNUFNfSU5EIGZyb20gSEFMLCBFeGl0aW5nIEJNUFMgc2xlZXAgbW9kZVxuIikpOyApCisKKworICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPSBlUE1NX1NUQVRFX0JNUFNfV0FLRVVQOworICAgIHBtbVVwZGF0ZVdha2V1cFN0YXRzKHBNYWMpOworCisgICAgLyogdHVybiBvbiBiYWNrZ3JvdW5kIHNjYW4gKi8KKyAgICBwTWFjLT5zeXMuZ1N5c0VuYWJsZVNjYW5Nb2RlID0gdHJ1ZTsKKworICAgIHBtbUJtcHNVcGRhdGVXYWtldXBJbmRDbnQocE1hYyk7CisKKyAgICAvKiBJbmZvcm0gU01FIGFib3V0IHRoZSBzeXN0ZW0gYXdha2Ugc3RhdGUgKi8KKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsCisgICAgICAgICAgICAgICAgICBlV05JX1BNQ19FWElUX0JNUFNfSU5ELAorICAgICAgICAgICAgICAgICAgZVNJUl9TTUVfU1VDQ0VTUywgMCwgMCk7CisKKyAgICBzd2l0Y2gocnNwU3RhdHVzKQorICAgIHsKKworICAgICAgICAvKiBUaGUgU29mdE1BQyBzZW5kcyB3YWtldXAgaW5kaWNhdGlvbiBldmVuIHdoZW4gSGVhcnQtQmVhdCB0aW1lciBleHBpcmVkCisgICAgICAgICAqIFRoZSBQRSBzaG91bGQgc3RhcnQgdGFraW5nIGFjdGlvbiBhZ2FpbnN0IHRoaXMgYXMgc29vbiBhcyBpdCBpZGVudGlmaWVzCisgICAgICAgICAqIHRoYXQgdGhlIFNvZnRNQUMgaGFzIGlkZW50aWZpZWQgaGVhcnQtYmVhdCBtaXNzCisgICAgICAgICAqLworICAgICAgICBjYXNlIGVIQUxfU1RBVFVTX0hFQVJUQkVBVF9UTU9VVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPRzEocG1tTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgicG1tQm1wczogVGhlIGRldmljZSB3b2tlIHVwIGR1ZSB0byBIZWFydEJlYXQgVGltZW91dFxuIikpOykKKworICAgICAgICAgICAgICAgIC8qIFByb2NlZWQgb25seSBpZiBIZWFydEJlYXQgdGltZXIgaXMgY3JlYXRlZCAqLworICAgICAgICAgICAgICAgIGlmKChwTWFjLT5saW0ubGltVGltZXJzLmdMaW1IZWFydEJlYXRUaW1lci5wTWFjKSAmJgorICAgICAgICAgICAgICAgICAgIChwTWFjLT5saW0uZ0xpbVRpbWVyc0NyZWF0ZWQpKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBiZWFjb24gaW50ZXJ2YWwgZnJvbSBzZXNzaW9uVGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgYmVhY29uSW50ZXJ2YWwgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWw7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQ2hhbmdlIHRpbWVyIHRvIHJlYWN0aXZhdGUgaXQgaW4gZnV0dXJlICovCisgICAgICAgICAgICAgICAgICAgIGhlYXJ0QmVhdEludGVydmFsPSBTWVNfTVNfVE9fVElDS1MoYmVhY29uSW50ZXJ2YWwgKiBoZWFydEJlYXRJbnRlcnZhbCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYodHhfdGltZXJfY2hhbmdlKCZwTWFjLT5saW0ubGltVGltZXJzLmdMaW1IZWFydEJlYXRUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1UzMiloZWFydEJlYXRJbnRlcnZhbCwgMCkgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUEVMT0cxKHBtbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJwbW1CbXBzOiBVbmFibGUgdG8gY2hhbmdlIEhlYXJ0QmVhdCB0aW1lclxuIikpOykKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBzb21lIHN0YXRpc3RpY3MgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoTElNX0lTX0NPTk5FQ1RJT05fQUNUSVZFKHBzZXNzaW9uRW50cnkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5MaW1SeGVkQmVhY29uQ250RHVyaW5nSEIgPCBNQVhfTk9fQkVBQ09OU19QRVJfSEVBUlRfQkVBVF9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhlYXJ0QmVhdEJlYWNvblN0YXRzW3BzZXNzaW9uRW50cnktPkxpbVJ4ZWRCZWFjb25DbnREdXJpbmdIQl0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUhlYXJ0QmVhdEJlYWNvblN0YXRzWzBdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBUbyBoYW5kbGUgdGhlIGhlYXJ0YmVhdCBmYWlsdXJlLCBtZXNzYWdlIGlzIGJlaW5nIHBvc3RlZCB0byBzZWxmIGFzIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiBhY3R1YWwgdGltZXIgaGFzIGV4cGlyZWQuIFRoaXMgaXMgZG9uZSB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBleGlzdHMgb25lCisgICAgICAgICAgICAgICAgICAgICAqIGNvbW1vbiBlbnRyeSBhbmQgZXhpdCBwb2ludHMKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHBtbVNlbmRNZXNzYWdlVG9MaW0ocE1hYywgU0lSX0xJTV9IRUFSVF9CRUFUX1RJTUVPVVQpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgUEVMT0dFKHBtbUxvZyhwTWFjLCBMT0dFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJwbW1CbXBzOiBIZWFydEJlYXQgVGltZXIgaXMgbm90IGNyZWF0ZWQsIGNhbm5vdCByZS1hY3RpdmF0ZVxuIikpOykKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVIQUxfU1RBVFVTX05USF9CRUFDT05fREVMSVZFUlk6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisKKyAgICByZXR1cm47CisKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBwbW1Qcm9jZXNzTWVzc2FnZVF1ZXVlCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gTm9uZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBwbW1Qcm9jZXNzTWVzc2FnZVF1ZXVlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisjaWYgMAorICAgIHRTaXJNc2dRIG1zZzsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgaWYgKHR4X3F1ZXVlX3JlY2VpdmUoJnBNYWMtPnN5cy5nU2lyUG1tTXNnUSwgKHZvaWQgKikgJm1zZywgVFhfV0FJVF9GT1JFVkVSKQorICAgICAgICAgICAgIT0gVFhfU1VDQ0VTUykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHBtbVByb2Nlc3NNZXNzYWdlKHBNYWMsICZtc2cpOworICAgIH0KKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBwbW1Qcm9jZXNzTWVzc2FnZQorICoKKyAqIEZVTkNUSU9OOiAgUHJvY2Vzc2VzIHRoZSBuZXh0IHJlY2VpdmVkIFBvd2VyIE1hbmFnZW1lbnQgbWVzc2FnZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIE5vbmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgcG1tUHJvY2Vzc01lc3NhZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisgICAgc3dpdGNoIChwTXNnLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBlV05JX1BNQ19QV1JfU0FWRV9DRkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHRwU2lyUG93ZXJTYXZlQ2ZnIHBQU0NmZzsKKyAgICAgICAgICAgIHRTaXJNYk1zZyAqcE1iTXNnID0gKHRTaXJNYk1zZyAqKXBNc2ctPmJvZHlwdHI7CisKKyAgICAgICAgICAgIGlmIChwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFBTQ2ZnLCBzaXplb2YodFNpclBvd2VyU2F2ZUNmZykpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1tTG9nKHBNYWMsIExPR1AsICJQTU06IE5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgUE1DIENvbmZpZ1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCkgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwUFNDZmcsIHBNYk1zZy0+ZGF0YSwgc2l6ZW9mKHRTaXJQb3dlclNhdmVDZmcpKTsKKyAgICAgICAgICAgICh2b2lkKSBwbW1TZW5kUG93ZXJTYXZlQ2ZnKHBNYWMsIHBQU0NmZyk7CisKKyAgICAgICAgICAgIC8vIHNlbmRpbmcgYmVhY29uIGZpbHRlcmluZyBpbmZvcm1hdGlvbiBkb3duIHRvIEhBTAorICAgICAgICAgICAgaWYgKGxpbVNlbmRCZWFjb25GaWx0ZXJJbmZvKHBNYWMpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBwbW1Mb2cocE1hYywgTE9HRSwgRkwoIkZhaWwgdG8gc2VuZCBCZWFjb24gRmlsdGVyIEluZm8gXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfQk1QU19SRVE6CisgICAgICAgICAgICBwbW1Jbml0Qm1wc1B3clNhdmUocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdEQV9FTlRFUl9CTVBTX1JTUDoKKyAgICAgICAgICAgIHBtbUluaXRCbXBzUmVzcG9uc2VIYW5kbGVyKHBNYWMsIChlSGFsU3RhdHVzKXBNc2ctPmJvZHl2YWwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FWElUX0JNUFNfUkVROgorICAgICAgICB7CisgICAgICAgICAgICB0cEV4aXRCbXBzSW5mbyAgcEV4aXRCbXBzSW5mbzsKKyAgICAgICAgICAgIHRTaXJNYk1zZyAgICAgICpwTWJNc2cgPSAodFNpck1iTXNnICopcE1zZy0+Ym9keXB0cjsKKworICAgICAgICAgICAgaWYgKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRXhpdEJtcHNJbmZvLCBzaXplb2YodEV4aXRCbXBzSW5mbykpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1tTG9nKHBNYWMsIExPR1AsICJQTU06IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEV4aXQgQk1QUyBJbmZvIFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCkgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwRXhpdEJtcHNJbmZvLCBwTWJNc2ctPmRhdGEsIHNpemVvZih0RXhpdEJtcHNJbmZvKSk7CisgICAgICAgICAgICAodm9pZCkgcG1tRXhpdEJtcHNSZXF1ZXN0SGFuZGxlcihwTWFjLCBwRXhpdEJtcHNJbmZvKTsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfRVhJVF9CTVBTX1JTUDoKKyAgICAgICAgICAgIHBtbUV4aXRCbXBzUmVzcG9uc2VIYW5kbGVyKHBNYWMsIHBNc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfRVhJVF9CTVBTX0lORDoKKyAgICAgICAgICAgIHBtbUV4aXRCbXBzSW5kaWNhdGlvbkhhbmRsZXIocE1hYywgU0lSX1BNX0FDVElWRV9NT0RFLCAoZUhhbFN0YXR1cylwTXNnLT5ib2R5dmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfSU1QU19SRVE6CisgICAgICAgICAgICBwbW1FbnRlckltcHNSZXF1ZXN0SGFuZGxlcihwTWFjKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0RBX0VOVEVSX0lNUFNfUlNQOgorICAgICAgICAgICAgcG1tRW50ZXJJbXBzUmVzcG9uc2VIYW5kbGVyKHBNYWMsIChlSGFsU3RhdHVzKXBNc2ctPmJvZHl2YWwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1BNQ19FWElUX0lNUFNfUkVROgorICAgICAgICAgICAgcG1tRXhpdEltcHNSZXF1ZXN0SGFuZGxlcihwTWFjKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0RBX0VYSVRfSU1QU19SU1A6CisgICAgICAgICAgICBwbW1FeGl0SW1wc1Jlc3BvbnNlSGFuZGxlcihwTWFjLCAoZUhhbFN0YXR1cylwTXNnLT5ib2R5dmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfVUFQU0RfUkVROgorICAgICAgICAgICAgcG1tRW50ZXJVYXBzZFJlcXVlc3RIYW5kbGVyKHBNYWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXREFfRU5URVJfVUFQU0RfUlNQOgorICAgICAgICAgICAgcG1tRW50ZXJVYXBzZFJlc3BvbnNlSGFuZGxlcihwTWFjLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9QTUNfRVhJVF9VQVBTRF9SRVE6CisgICAgICAgICAgICBwbW1FeGl0VWFwc2RSZXF1ZXN0SGFuZGxlcihwTWFjKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0RBX0VYSVRfVUFQU0RfUlNQOgorICAgICAgICAgICAgcG1tRXhpdFVhcHNkUmVzcG9uc2VIYW5kbGVyKHBNYWMsIChlSGFsU3RhdHVzKXBNc2ctPmJvZHl2YWwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1BNQ19XT1dMX0FERF9CQ0FTVF9QVFJOOgorICAgICAgICAgICAgcG1tU2VuZFdvd2xBZGRCY2FzdFB0cm4ocE1hYywgcE1zZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfUE1DX1dPV0xfREVMX0JDQVNUX1BUUk46CisgICAgICAgICAgICBwbW1TZW5kV293bERlbEJjYXN0UHRybihwTWFjLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfV09XTF9SRVE6CisgICAgICAgICAgICBwbW1FbnRlcldvd2xSZXF1ZXN0SGFuZGxlcihwTWFjLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0RBX1dPV0xfRU5URVJfUlNQOgorICAgICAgICAgICAgcG1tRW50ZXJXb3dsYW5SZXNwb25zZUhhbmRsZXIocE1hYywgcE1zZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfUE1DX0VYSVRfV09XTF9SRVE6CisgICAgICAgICAgICBwbW1FeGl0V293bGFuUmVxdWVzdEhhbmRsZXIocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdEQV9XT1dMX0VYSVRfUlNQOgorICAgICAgICAgICAgcG1tRXhpdFdvd2xhblJlc3BvbnNlSGFuZGxlcihwTWFjLCAoZUhhbFN0YXR1cylwTXNnLT5ib2R5dmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisgICAgICAgIGNhc2UgV0RBX1BBQ0tFVF9DT0FMRVNDSU5HX0ZJTFRFUl9NQVRDSF9DT1VOVF9SU1A6CisgICAgICAgICAgICBwbW1GaWx0ZXJNYXRjaENvdW50UmVzcG9uc2VIYW5kbGVyKHBNYWMsIHBNc2cpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisgICAgICAgIGNhc2UgV0RBX0dUS19PRkZMT0FEX0dFVElORk9fUlNQOgorICAgICAgICAgICAgcG1tR1RLT2ZmbG9hZEdldEluZm9SZXNwb25zZUhhbmRsZXIocE1hYywgcE1zZyk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUEVMT0dXKHBtbUxvZyhwTWFjLCBMT0dXLCAKKyAgICAgICAgICAgICAgICBGTCgiUE1NOiBVbmtub3duIG1lc3NhZ2UgaW4gcG1tTXNnUSB0eXBlICVkLCBwb3RlbnRpYWwgbWVtb3J5IGxlYWshIVxuIiksCisgICAgICAgICAgICAgICAgcE1zZy0+dHlwZSk7KQorICAgIH0KKworICAgIGlmIChOVUxMICE9IHBNc2ctPmJvZHlwdHIpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh0QU5JX1U4ICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgIHBNc2ctPmJvZHlwdHIgPSBOVUxMOworICAgIH0KK30KKworCisKKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbVBvc3RNZXNzYWdlCisgKgorICogRlVOQ1RJT046CisgKiBQb3N0IGEgbWVzc2FnZSB0byB0aGUgcG1tIG1lc3NhZ2UgcXVldWUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTXNnIHBvaW50ZXIgdG8gbWVzc2FnZQorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cworcG1tUG9zdE1lc3NhZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisjaWYgZGVmaW5lZChWT1NTX0VOQUJMRUQpCisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICAgdm9zU3RhdHVzID0gdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfUEUsICh2b3NfbXNnX3QgKikgcE1zZyk7CisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR1AsIEZMKCJ2b3NfbXFfcG9zdF9tZXNzYWdlIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICVkXG4iKSwgdm9zU3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKEFOSV9PU19UWVBFX1dJTkRPV1MpCisgICAgcG1tUHJvY2Vzc01lc3NhZ2UocE1hYywgcE1zZyk7CisjZWxzZQorICAgIGlmICh0eF9xdWV1ZV9zZW5kKCZwTWFjLT5zeXMuZ1NpclBtbU1zZ1EsIHBNc2csIFRYX05PX1dBSVQpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyNlbmRpZiAvLyBWT1NTX0VOQUJMRUQKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKworCisKKworLyoqCisgKiBwbW1VcGRhdGVQd3JTYXZlU3RhdHMKKyAqCisgKiBGVU5DVElPTjogIHVwZGF0ZWQgQk1QUyBzdGF0cywgd2hlbiBTdGF0aW9uIGlzIGdvaW5nIGludG8gcG93ZXIgc2F2ZSBzdGF0ZS4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTWFjIHBvaW50ZXIgdG8gR2xvYmFsIE1BQyBTdHJ1Y3R1cmUuCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHBtbVVwZGF0ZVB3clNhdmVTdGF0cyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworLyoKKyAgICB0QU5JX1U2NCBUaW1lQXdha2UgPSAwOworCisgICAgcE1hYy0+cG1tLkJtcHNTbGVlcFRpbWVTdGFtcCA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisKKyAgICBpZiAocE1hYy0+cG1tLkJtcHNXYWtldXBUaW1lU3RhbXApCisgICAgICAgIFRpbWVBd2FrZSA9IChwTWFjLT5wbW0uQm1wc1NsZWVwVGltZVN0YW1wIC0gcE1hYy0+cG1tLkJtcHNXYWtldXBUaW1lU3RhbXApIC8xMDsKKyAgICBlbHNlCisgICAgICAgIFRpbWVBd2FrZSA9IDA7IC8vIHZlcnkgZmlyc3QgdGltZQorCisgICAgaWYgKFRpbWVBd2FrZSA+IHBNYWMtPnBtbS5CbXBzbWF4VGltZUF3YWtlKQorICAgIHsKKyAgICAgICAgcE1hYy0+cG1tLkJtcHNtYXhUaW1lQXdha2UgPSBUaW1lQXdha2U7CisgICAgfQorCisgICAgaWYgKCghcE1hYy0+cG1tLkJtcHNtaW5UaW1lQXdha2UpIHx8IChUaW1lQXdha2UgPCBwTWFjLT5wbW0uQm1wc21pblRpbWVBd2FrZSkpCisgICAgeworICAgICAgICBwTWFjLT5wbW0uQm1wc21pblRpbWVBd2FrZSA9IFRpbWVBd2FrZTsKKyAgICB9CisKKyAgICBwTWFjLT5wbW0uQm1wc2F2Z1RpbWVBd2FrZSA9ICggKCAocE1hYy0+cG1tLkJtcHNhdmdUaW1lQXdha2UgKiBwTWFjLT5wbW0uQm1wc2NudFNsZWVwKSArIFRpbWVBd2FrZSApIC8gKHBNYWMtPnBtbS5CbXBzY250U2xlZXAgKyAxKSApOworCisgICAgcE1hYy0+cG1tLkJtcHNjbnRTbGVlcCsrOworICAgIHJldHVybjsKKyovCit9CisKKworCisKKy8qKgorICogcG1tVXBkYXRlUHdyU2F2ZVN0YXRzCisgKgorICogRlVOQ1RJT046ICB1cGRhdGVkIEJNUFMgc3RhdHMsIHdoZW4gU3RhdGlvbiBpcyB3YWtpbmcgdXAuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyBwb2ludGVyIHRvIEdsb2JhbCBNQUMgU3RydWN0dXJlLgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBwbW1VcGRhdGVXYWtldXBTdGF0cyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworLyoKKworICAgICAgICB0QU5JX1U2NCBTbGVlcFRpbWUgPSAwOworCisgICAgICAgIHBNYWMtPnBtbS5CbXBzV2FrZXVwVGltZVN0YW1wID0gdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKTsKKyAgICAgICAgU2xlZXBUaW1lID0gKHBNYWMtPnBtbS5CbXBzV2FrZXVwVGltZVN0YW1wIC0gcE1hYy0+cG1tLkJtcHNTbGVlcFRpbWVTdGFtcCkgLyAxMDsKKworICAgICAgICBpZiAoU2xlZXBUaW1lID4gcE1hYy0+cG1tLkJtcHNtYXhTbGVlcFRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnBtbS5CbXBzbWF4U2xlZXBUaW1lID0gU2xlZXBUaW1lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCghcE1hYy0+cG1tLkJtcHNtaW5TbGVlcFRpbWUpIHx8IChTbGVlcFRpbWUgPCBwTWFjLT5wbW0uQm1wc21pblNsZWVwVGltZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnBtbS5CbXBzbWluU2xlZXBUaW1lID0gU2xlZXBUaW1lOworICAgICAgICB9CisKKyAgICAgICAgcE1hYy0+cG1tLkJtcHNhdmdTbGVlcFRpbWUgPSAoICggKHBNYWMtPnBtbS5CbXBzYXZnU2xlZXBUaW1lICogcE1hYy0+cG1tLkJtcHNjbnRBd2FrZSkgKyBTbGVlcFRpbWUgKSAvIChwTWFjLT5wbW0uQm1wc2NudEF3YWtlICsgMSkgKTsKKworICAgICAgICBwTWFjLT5wbW0uQm1wc2NudEF3YWtlKys7CisgICAgICAgIHJldHVybjsKKyovCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbUVudGVySW1wc1JlcXVlc3RIYW5kbGVyCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBpZGxlIG1vZGUgcG93ZXIgc2F2ZSByZXF1ZXN0IGZyb20gaG9zdCBkZXZpY2UKKyAqIGRyaXZlIHRvIEhBTC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBwbW1Qcm9jZXNzTXNnKCkKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgIEdsb2JhbCBoYW5kbGUgdG8gTUFDCisgKiBAcmV0dXJuICBOb25lCisgKi8KK3ZvaWQgcG1tRW50ZXJJbXBzUmVxdWVzdEhhbmRsZXIgKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisKKyAgICB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgdFNpclJldFN0YXR1cyAgIHJldFN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0UG1tU3RhdGUgICAgICAgb3JpZ1N0YXRlID0gcE1hYy0+cG1tLmdQbW1TdGF0ZTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19FTlRFUl9JTVBTX1JFUV9FVkVOVCwgcGVHZXRWYWxpZFBvd2VyU2F2ZVNlc3Npb24ocE1hYyksIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisgICAgLypSZXR1cm5zIFRydWUgZXZlbiBzaW5nbGUgYWN0aXZlIHNlc3Npb24gcHJlc2VudCAqLworICAgIGlmKHBlSXNBbnlTZXNzaW9uQWN0aXZlKHBNYWMpKQorICAgIHsKKyAgICAgICAgcmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfU1RBVEU7CisgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CisKKyAgICBpZiAoICgocE1hYy0+cG1tLmdQbW1TdGF0ZSAhPSBlUE1NX1NUQVRFX1JFQURZKSAmJgorICAgICAgICAgIChwTWFjLT5wbW0uZ1BtbVN0YXRlICE9IGVQTU1fU1RBVEVfSU1QU19XQUtFVVApKSB8fAorICAgICAgICAgKChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlICE9IGVMSU1fU01FX0lETEVfU1RBVEUpICYmCisgICAgICAgICAgKHBNYWMtPmxpbS5nTGltU21lU3RhdGUgIT0gZUxJTV9TTUVfSk9JTl9GQUlMVVJFX1NUQVRFKSkgfHwKKyAgICAgICAgIChwTWFjLT5saW0uZ0xpbU1sbVN0YXRlICE9IGVMSU1fTUxNX0lETEVfU1RBVEUpIHx8CisgICAgICAgICAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5kb3QxMWhDaGFuU3dTdGF0ZSA9PSBlTElNXzExSF9DSEFOU1dfUlVOTklORykgfHwKKyAgICAgICAgIChwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPT0gZUxJTV9RVUlFVF9SVU5OSU5HKSkKKyAgICB7CisgICAgICAgIFBFTE9HRShwbW1Mb2cocE1hYywgTE9HRSwgCisgICAgICAgICAgICAgIEZMKCJwbW1JbXBzOiBQTU0gU3RhdGUgPSAlZCwgTUxNIFN0YXRlID0gJWQsIFNNRSBTdGF0ZSA9ICVkLCByZWplY3RpbmcgdGhlIHNsZWVwIG1vZGUgcmVxdWVzdFxuIiksCisgICAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpOykKKworICAgICAgICByZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QTU1fU1RBVEU7CisgICAgICAgIHBtbUltcHNVcGRhdGVFcnJTdGF0ZVN0YXRzKHBNYWMpOworICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorCisgICAgLy8gY2hhbmdlIFBFIHN0YXRlIGFuZCBzZW5kIHRoZSByZXF1ZXN0IHRvIEhBTAorICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPSBlUE1NX1NUQVRFX0lNUFNfV1RfU0xFRVBfUlNQOworICAgIGlmKCAocmV0U3RhdHVzID0gcG1tSW1wc1NlbmRDaGFuZ2VQd3JTYXZlTXNnKHBNYWMsIFNJUl9QTV9TTEVFUF9NT0RFKSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dFKHBtbUxvZyhwTWFjLCBMT0dFLCAKKyAgICAgICAgICAgICAgIEZMKCJwbW1JbXBzOiBJTVBTIFNsZWVwIFJlcXVlc3QgZmFpbGVkOiBzZW5kaW5nIHJlc3BvbnNlOiAleFxuIiksIHJldFN0YXR1cyk7KQorCisgICAgICAgIHJlc3VsdENvZGUgPSBlU0lSX1NNRV9JTVBTX1JFUV9GQUlMRUQ7CisgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUEVMT0cxKHBtbUxvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgRkwoInBtbUltcHM6IFdhaXRpbmcgZm9yIFNvZnRNYWMgcmVzcG9uc2UgZm9yIElNUFMgcmVxdWVzdFxuIikpOykKKyAgICB9CisgICAgcmV0dXJuOworCitmYWlsdXJlOgorICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPSBvcmlnU3RhdGU7CisgICAgcG1tSW1wc1VwZGF0ZVNsZWVwRXJyU3RhdHMocE1hYywgcmV0U3RhdHVzKTsKKworICAgIGxpbVNlbmRTbWVSc3AocE1hYywKKyAgICAgICAgICAgICAgICAgIGVXTklfUE1DX0VOVEVSX0lNUFNfUlNQLAorICAgICAgICAgICAgICAgICAgcmVzdWx0Q29kZSwgMCwgMCk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcG1tRW50ZXJJbXBzUmVzcG9uc2VIYW5kbGVyCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSByZXNwb25zZSBmcm9tIEhBTCBsYXllciBmb3IgdGhlIGlkbGUgbW9kZQorICogcG93ZXIgc2F2ZSByZXF1ZXN0IHNlbnQuIFRoZSBmdW5jdGlvbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZworICogdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBzeXN0ZW0gc3RhdGUgYmVmb3JlIGNvbmZpZ3VyaW5nIHRoZSBuZXcgc3RhdGUKKyAqIG9uIHN1Y2Nlc3MuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHBtbVByb2Nlc3NNc2coKQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZQorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICAgR2xvYmFsIGhhbmRsZSB0byBNQUMsIFN0YXR1cyBjb2RlCisgKiBAcmV0dXJuICBOb25lCisgKi8KK3ZvaWQgcG1tRW50ZXJJbXBzUmVzcG9uc2VIYW5kbGVyICh0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHJzcFN0YXR1cykKK3sKKyAgICB0UG1tU3RhdGUgbmV4dFN0YXRlID0gcE1hYy0+cG1tLmdQbW1TdGF0ZTsKKyAgICB0U2lyUmVzdWx0Q29kZXMgcmVzdWx0Q29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisKKyAgICAvKiB3ZSBuZWVkIHRvIHByb2Nlc3MgYWxsIHRoZSBkZWZlcnJlZCBtZXNzYWdlcyBlbnF1ZXVlZCBzaW5jZQorICAgICAqIHRoZSBpbml0aWF0aW5nIHRoZSBXREFfRU5URVJfSU1QU19SRVEuCisgICAgICovCisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisKKyAgICBpZihwTWFjLT5wbW0uZ1BtbVN0YXRlICE9IGVQTU1fU1RBVEVfSU1QU19XVF9TTEVFUF9SU1ApCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsIAorICAgICAgICAgICAgICAgRkwoInBtbUltcHM6IFJlY2VpdmVzIElNUFMgc2xlZXAgcnNwIGluIGludmFsaWQgc3RhdGU6ICVkXG4iKSwKKyAgICAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUpOykKKworICAgICAgICByZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QTU1fU1RBVEU7CisgICAgICAgIHBtbUltcHNVcGRhdGVFcnJTdGF0ZVN0YXRzKHBNYWMpOworCisgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CisKKyAgICBpZihlSEFMX1NUQVRVU19TVUNDRVNTID09IHJzcFN0YXR1cykKKyAgICB7CisgICAgICAgIC8vaWYgc3VjY2VzcywgY2hhbmdlIHRoZSBzdGF0ZSB0byBJTVBTIHNsZWVwIG1vZGUKKyAgICAgICAgcE1hYy0+cG1tLmdQbW1TdGF0ZSA9IGVQTU1fU1RBVEVfSU1QU19TTEVFUDsKKworICAgICAgICBQRUxPR1cocG1tTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICBGTCgicG1tSW1wczogUmVjZWl2ZWQgc3VjY2Vzc2Z1bCBXREFfRU5URVJfSU1QU19SU1AgZnJvbSBIQUxcbiIpKTspCisKKyAgICAgICAgLy91cGRhdGUgcG93ZXIgc2F2ZSBzdGF0aXN0aWNzCisgICAgICAgIHBtbUltcHNVcGRhdGVQd3JTYXZlU3RhdHMocE1hYyk7CisKKyAgICAgICAgbGltU2VuZFNtZVJzcChwTWFjLAorICAgICAgICAgICAgICAgICAgICAgIGVXTklfUE1DX0VOVEVSX0lNUFNfUlNQLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvZGUsIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBnbyBiYWNrIHRvIHByZXZpb3VzIHN0YXRlIGlmIHJlcXVlc3QgZmFpbGVkCisgICAgICAgIG5leHRTdGF0ZSA9IGVQTU1fU1RBVEVfSU1QU19XQUtFVVA7CisgICAgICAgIHJlc3VsdENvZGUgPSBlU0lSX1NNRV9DQU5OT1RfRU5URVJfSU1QUzsKKyAgICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKyAgICByZXR1cm47CisKK2ZhaWx1cmU6CisgICAgUEVMT0dFKHBtbUxvZyhwTWFjLCBMT0dFLCAKKyAgICAgICAgICAgRkwoInBtbUltcHNTbGVlcFJzcCBmYWlsZWQsIFJldCBDb2RlOiAlZCwgbmV4dCBzdGF0ZSB3aWxsIGJlOiAlZFxuIiksCisgICAgICAgICAgIHJzcFN0YXR1cywKKyAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1TdGF0ZSk7KQorCisgICAgcE1hYy0+cG1tLmdQbW1TdGF0ZSA9IG5leHRTdGF0ZTsKKworICAgIGxpbVNlbmRTbWVSc3AocE1hYywKKyAgICAgICAgICAgICAgICAgIGVXTklfUE1DX0VOVEVSX0lNUFNfUlNQLAorICAgICAgICAgICAgICAgICAgcmVzdWx0Q29kZSwgMCwgMCk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcG1tRXhpdEltcHNSZXF1ZXN0SGFuZGxlcgorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgcG1tUHJvY2Vzc01zZygpLiBUaGUgZnVuY3Rpb24gc2VuZHMgYSByZXF1ZXN0CisgKiB0byBIQUwgdG8gd2FrZXVwIHRoZSBkZXZpY2UgZnJvbSBpZGxlIG1vZGUgcG93ZXIgc2F2ZSBtb2RlLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZQorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICAgR2xvYmFsIGhhbmRsZSB0byBNQUMKKyAqIEByZXR1cm4gIE5vbmUKKyAqLwordm9pZCBwbW1FeGl0SW1wc1JlcXVlc3RIYW5kbGVyICh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRTaXJSZXRTdGF0dXMgcmV0U3RhdHVzID0gZVNJUl9TVUNDRVNTOworICAgIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKworICAgIHRQbW1TdGF0ZSBvcmlnU3RhdGUgPSBwTWFjLT5wbW0uZ1BtbVN0YXRlOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX0VYSVRfSU1QU19SRVFfRVZFTlQsIHBlR2V0VmFsaWRQb3dlclNhdmVTZXNzaW9uKHBNYWMpLCAwLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworICAgIGlmIChlUE1NX1NUQVRFX0lNUFNfU0xFRVAgPT0gcE1hYy0+cG1tLmdQbW1TdGF0ZSkKKyAgICB7CisgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPSBlUE1NX1NUQVRFX0lNUFNfV1RfV0FLRVVQX1JTUDsKKyAgICAgICAgaWYoIChyZXRTdGF0dXMgPSBwbW1JbXBzU2VuZENoYW5nZVB3clNhdmVNc2cocE1hYywgU0lSX1BNX0FDVElWRV9NT0RFKSkgIT0KKyAgICAgICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKHBtbUxvZyhwTWFjLCBMT0dFLCAKKyAgICAgICAgICAgICAgICAgICBGTCgicG1tSW1wczogV2FrZXVwIHJlcXVlc3QgbWVzc2FnZSBzZW50IHRvIFNvZnRNYWMgZmFpbGVkXG4iKSk7KQorICAgICAgICAgICAgcmVzdWx0Q29kZSA9IGVTSVJfU01FX0lNUFNfUkVRX0ZBSUxFRDsKKyAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBQRSBpbiBpbnZhbGlkIHN0YXRlIAorICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsIAorICAgICAgICAgICAgICAgICAgICAgIEZMKCJwbW1JbXBzOiBXYWtldXAgUmVxIHJlY2VpdmVkIGluIGludmFsaWQgc3RhdGU6ICV4XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlKTspCisKKyAgICAgICAgcmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUE1NX1NUQVRFOworICAgICAgICBwbW1JbXBzVXBkYXRlRXJyU3RhdGVTdGF0cyhwTWFjKTsKKworICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIHJldHVybjsKKworZmFpbHVyZToKKyAgICBQRUxPR0UocG1tTG9nIChwTWFjLCBMT0dFLCAKKyAgICAgICAgICAgICAgICAgICBGTCgicG1tSW1wczogQ2hhbmdpbmcgdG8gSU1QUyB3YWtldXAgbW9kZSBmYWlsZWQsIFJldCBDb2RlOiAlZCwgTmV4dCBTdGF0ZTogJWRcbiIpLAorICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cywgcE1hYy0+cG1tLmdQbW1TdGF0ZSk7KQorCisgICAgcE1hYy0+cG1tLmdQbW1TdGF0ZSA9IG9yaWdTdGF0ZTsKKyAgICBwbW1JbXBzVXBkYXRlV2FrZXVwRXJyU3RhdHMocE1hYywgcmV0U3RhdHVzKTsKKworICAgIGxpbVNlbmRTbWVSc3AocE1hYywKKyAgICAgICAgICAgICAgICAgIGVXTklfUE1DX0VYSVRfSU1QU19SU1AsCisgICAgICAgICAgICAgICAgICByZXN1bHRDb2RlLCAwLCAwKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBwbW1FeGl0SW1wc1Jlc3BvbnNlSGFuZGxlcgorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyB0aGUgcmVzcG9uc2UgZnJvbSBIQUwgbGF5ZXIgZm9yIHRoZSBpZGxlIG1vZGUKKyAqIHBvd2VyIHNhdmUgcmVxdWVzdCBzZW50LiBUaGUgZnVuY3Rpb24gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcKKyAqIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgc3lzdGVtIHN0YXRlIGJlZm9yZSBjb25maWd1cmluZyB0aGUgbmV3IHN0YXRlCisgKiBvbiBzdWNjZXNzLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBwbW1Qcm9jZXNzTXNnKCkKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgR2xvYmFsIGhhbmRsZSB0byBNQUMKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIHBtbUV4aXRJbXBzUmVzcG9uc2VIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgcnNwU3RhdHVzKQoreworICAgIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKworICAgIC8qIHdlIG5lZWQgdG8gcHJvY2VzcyBhbGwgdGhlIGRlZmVycmVkIG1lc3NhZ2VzIGVucXVldWVkIHNpbmNlCisgICAgICogdGhlIGluaXRpYXRpbmcgdGhlIFdEQV9FWElUX0lNUFNfUkVRLgorICAgICAqLworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCisgICAgaWYgKHBNYWMtPnBtbS5nUG1tU3RhdGUgIT0gZVBNTV9TVEFURV9JTVBTX1dUX1dBS0VVUF9SU1ApCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsIAorICAgICAgICAgICAgICAgICAgICAgIEZMKCJwbW1JbXBzOiBSZWNlaXZlZCAnV2FrZXVwJyByZXNwb25zZSBpbiBpbnZhbGlkIHN0YXRlOiAlZFxuIiksIAorICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUpOykKKworICAgICAgICByZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QTU1fU1RBVEU7CisgICAgICAgIHBtbUltcHNVcGRhdGVFcnJTdGF0ZVN0YXRzKHBNYWMpOworICAgIH0KKworICAgIHN3aXRjaChyc3BTdGF0dXMpCisgICAgeworICAgIGNhc2UgZUhBTF9TVEFUVVNfU1VDQ0VTUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0Q29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgICAgICAgICBQRUxPR1cocG1tTG9nKHBNYWMsIExPR1csIAorICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgicG1tSW1wczogUmVjZWl2ZWQgV0RBX0VYSVRfSU1QU19SU1Agd2l0aCBTdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gSEFMXG4iKSk7KQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0Q29kZSA9IGVTSVJfU01FX0lNUFNfUkVRX0ZBSUxFRDsKKyAgICAgICAgICAgICAgICBQRUxPR1cocG1tTG9nKHBNYWMsIExPR1csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoInBtbUltcHM6IFJlY2VpdmVkIFdEQV9FWElUX0lNUFNfUlNQIHdpdGggRmFpbHVyZSBTdGF0dXMgZnJvbSBIQUxcbiIpKTspCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPSBlUE1NX1NUQVRFX0lNUFNfV0FLRVVQOworCisgICAgLy91cGRhdGUgcG93ZXIgc2F2ZSBzdGF0aXN0aWNzCisgICAgcG1tSW1wc1VwZGF0ZVdha2V1cFN0YXRzKHBNYWMpOworCisgICAgbGltU2VuZFNtZVJzcChwTWFjLAorICAgICAgICAgICAgICAgICAgZVdOSV9QTUNfRVhJVF9JTVBTX1JTUCwKKyAgICAgICAgICAgICAgICAgIHJlc3VsdENvZGUsIDAsIDApOworICAgIHJldHVybjsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBwbW1FbnRlclVhcHNkUmVxdWVzdEhhbmRsZXIKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgZVdOSV9QTUNfRU5URVJfVUFQU0RfUkVRIGZyb20gUE1DLAorICogY2hlY2tzIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgc3lzdGVtIHN0YXRlIGJlZm9yZSBjb25maWd1cmluZworICogUE1NIHRvIHRoZSBuZXcgZVBNTV9TVEFURV9VQVBTRF9XVF9TTEVFUF9SU1Agc3RhdGUsIGFuZCBpbnZva2VzCisgKiBpbnZva2VzIHBtbVVhcHNkU2VuZENoYW5nZVB3clNhdmVNc2coKSB0byBzZW5kCisgKiBXREFfRU5URVJfVUFQU0RfUkVRIHRvIEhBTC4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgICAgICBHbG9iYWwgaGFuZGxlIHRvIE1BQworICogQHJldHVybiAgICAgIE5vbmUKKyAqLwordm9pZCBwbW1FbnRlclVhcHNkUmVxdWVzdEhhbmRsZXIgKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgIHRTaXJSZXRTdGF0dXMgICByZXRTdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisKKyAgICB0UG1tU3RhdGUgb3JpZ1N0YXRlID0gcE1hYy0+cG1tLmdQbW1TdGF0ZTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19FTlRFUl9VQVBTRF9SRVFfRVZFTlQsIHBlR2V0VmFsaWRQb3dlclNhdmVTZXNzaW9uKHBNYWMpLCAwLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworICAgIGlmICggKHBNYWMtPnBtbS5nUG1tU3RhdGUgIT0gZVBNTV9TVEFURV9CTVBTX1NMRUVQKSB8fAorICAgICAgICAgbGltSXNTeXN0ZW1JblNjYW5TdGF0ZShwTWFjKSApCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCgicG1tVWFwc2Q6IFBNTSBTdGF0ZSA9ICVkLCBNTE0gU3RhdGUgPSAlZCwgU01FIFN0YXRlID0gJWQsIHJlamVjdGluZyB0aGUgc2xlZXAgbW9kZSByZXF1ZXN0XG4iKSwKKyAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUsIHBNYWMtPmxpbS5nTGltTWxtU3RhdGUsIHBNYWMtPmxpbS5nTGltU21lU3RhdGUpOykKKworICAgICAgICByZXN1bHRDb2RlID0gZVNJUl9TTUVfSU5WQUxJRF9QTU1fU1RBVEU7CisgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CisKKyAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlID0gZVBNTV9TVEFURV9VQVBTRF9XVF9TTEVFUF9SU1A7CisKKyAgICBpZiggKHJldFN0YXR1cyA9IHBtbVVhcHNkU2VuZENoYW5nZVB3clNhdmVNc2cocE1hYywgU0lSX1BNX1NMRUVQX01PREUpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCgicG1tVWFwc2Q6IEhBTF9FTlRFUl9VQVBTRF9SRVEgZmFpbGVkIHdpdGggcmVzcG9uc2U6ICV4XG4iKSwgcmV0U3RhdHVzKTspCisgICAgICAgIHJlc3VsdENvZGUgPSBlU0lSX1NNRV9VQVBTRF9SRVFfRkFJTEVEOworICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorCisgICAgUEVMT0cxKHBtbUxvZyhwTWFjLCBMT0cxLCBGTCgicG1tVWFwc2Q6IFdhaXRpbmcgZm9yIFdEQV9FTlRFUl9VQVBTRF9SU1AgXG4iKSk7KQorICAgIHJldHVybjsKKworZmFpbHVyZToKKyAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlID0gb3JpZ1N0YXRlOworICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9QTUNfRU5URVJfVUFQU0RfUlNQLCByZXN1bHRDb2RlLCAwLCAwKTsKKyAgICByZXR1cm47Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcG1tRW50ZXJVYXBzZFJlc3BvbnNlSGFuZGxlcgorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIFNJUl9IQUxfRU5URVJfVUFQU0RfUlNQIGZyb20gSEFMLgorICogSWYgdGhlIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWwsIGl0IHB1dHMgUE1NIGludG8gZVBNTV9TVEFURV9VQVBTRF9TTEVFUAorICogc3RhdGUgYW5kIHNlbmRzIGJhY2sgc3VjY2VzcyByZXNwb25zZSB0byBQTUMuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIGxpbU1zZworICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgcG1tRW50ZXJVYXBzZFJlc3BvbnNlSGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKQoreworICAgIHRwVWFwc2RQYXJhbXMgICAgcFVhcHNkUnNwTXNnOworICAgIHRTaXJSZXN1bHRDb2RlcyAgcmV0U3RhdHVzID0gZVNJUl9TTUVfU1VDQ0VTUzsKKworICAgIC8qIHdlIG5lZWQgdG8gcHJvY2VzcyBhbGwgdGhlIGRlZmVycmVkIG1lc3NhZ2VzIGVucXVldWVkIHNpbmNlCisgICAgICogdGhlIGluaXRpYXRpbmcgdGhlIFNJUl9IQUxfRU5URVJfVUFQU0RfUkVRLgorICAgICAqLworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCisKKyAgICBpZiAoTlVMTCA9PSBsaW1Nc2ctPmJvZHlwdHIpCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsIEZMKCJwbW1VYXBzZDogUmVjZWl2ZWQgU0lSX0hBTF9FTlRFUl9VQVBTRF9SU1Agd2l0aCBOVUxMICIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwVWFwc2RSc3BNc2cgPSAodHBVYXBzZFBhcmFtcykobGltTXNnLT5ib2R5cHRyKTsKKworICAgIGlmKHBNYWMtPnBtbS5nUG1tU3RhdGUgIT0gZVBNTV9TVEFURV9VQVBTRF9XVF9TTEVFUF9SU1ApCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCgicG1tVWFwc2Q6IFJlY2VpdmVkIFNJUl9IQUxfRU5URVJfVUFQU0RfUlNQIHdoaWxlIGluIGluY29ycmVjdCBzdGF0ZTogJWRcbiIpLAorICAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1TdGF0ZSk7KQorICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfUE1DX0VOVEVSX1VBUFNEX1JTUCwgZVNJUl9TTUVfSU5WQUxJRF9QTU1fU1RBVEUsIDAsIDApOyAgICAgICAgCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihwVWFwc2RSc3BNc2ctPnN0YXR1cyA9PSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR1cocG1tTG9nKHBNYWMsIExPR1csCisgICAgICAgICAgICBGTCgicG1tVWFwc2Q6IFJlY2VpdmVkIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBIQUwgdG8gZW50ZXIgVUFQU0QgbW9kZSBcbiIpKTspCisgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPSBlUE1NX1NUQVRFX1VBUFNEX1NMRUVQOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCgicG1tVWFwc2Q6IFNJUl9IQUxfRU5URVJfVUFQU0RfUlNQIGZhaWxlZCwgaW5mb3JtaW5nIFNNRVxuIikpOykKKyAgICAgICAgcE1hYy0+cG1tLmdQbW1TdGF0ZSA9IGVQTU1fU1RBVEVfQk1QU19TTEVFUDsKKyAgICAgICAgcmV0U3RhdHVzID0gZVNJUl9TTUVfVUFQU0RfUkVRX0ZBSUxFRDsKKyAgICB9CisKKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfUE1DX0VOVEVSX1VBUFNEX1JTUCwgcmV0U3RhdHVzLCAwLCAwKTsgICAgCisgICAgcmV0dXJuOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbUV4aXRVYXBzZFJlcXVlc3RIYW5kbGVyCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIGVXTklfUE1DX0VYSVRfVUFQU0RfUkVRIGZyb20gUE1DLAorICogY2hlY2tzIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgc3lzdGVtIHN0YXRlIGJlZm9yZSBjb25maWd1cmluZworICogUE1NIHRvIHRoZSBuZXcgZVBNTV9TVEFURV9VQVBTRF9XVF9XQUtFVVBfUlNQIHN0YXRlLCBhbmQKKyAqIGludm9rZXMgcG1tVWFwc2RTZW5kQ2hhbmdlUHdyU2F2ZU1zZygpIHRvIHNlbmQKKyAqIFNJUl9IQUxfRVhJVF9VQVBTRF9SRVEgdG8gSEFMLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICAgICAgIEdsb2JhbCBoYW5kbGUgdG8gTUFDCisgKiBAcmV0dXJuICAgICAgTm9uZQorICovCit2b2lkIHBtbUV4aXRVYXBzZFJlcXVlc3RIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdFNpclJldFN0YXR1cyByZXRTdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisgICAgdFNpclJlc3VsdENvZGVzIHJlc3VsdENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCisgICAgdFBtbVN0YXRlIG9yaWdTdGF0ZSA9IHBNYWMtPnBtbS5nUG1tU3RhdGU7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfRVhJVF9VQVBTRF9SRVFfRVZFTlQsIHBlR2V0VmFsaWRQb3dlclNhdmVTZXNzaW9uKHBNYWMpLCAwLCAwKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworICAgIGlmIChlUE1NX1NUQVRFX1VBUFNEX1NMRUVQID09IHBNYWMtPnBtbS5nUG1tU3RhdGUpCisgICAgeworICAgICAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlID0gZVBNTV9TVEFURV9VQVBTRF9XVF9XQUtFVVBfUlNQOworICAgICAgICBpZiggKHJldFN0YXR1cyA9IHBtbVVhcHNkU2VuZENoYW5nZVB3clNhdmVNc2cocE1hYywgU0lSX1BNX0FDVElWRV9NT0RFKSkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKHBtbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgIEZMKCJwbW1VYXBzZDogc2VuZGluZyBFWElUX1VBUFNEIHRvIEhBTCBmYWlsZWQgXG4iKSk7KQorICAgICAgICAgICAgcmVzdWx0Q29kZSA9IGVTSVJfU01FX1VBUFNEX1JFUV9GQUlMRUQ7CisgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUEVMT0dFKHBtbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoInBtbVVhcHNkOiBSY3YgRVhJVF9VQVBTRCBmcm9tIFBNQyBpbiBpbnZhbGlkIHN0YXRlOiAleFxuIiksCisgICAgICAgICAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlKTspCisKKyAgICAgICAgcmVzdWx0Q29kZSA9IGVTSVJfU01FX0lOVkFMSURfUE1NX1NUQVRFOworICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIHJldHVybjsKKworZmFpbHVyZToKKyAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlID0gb3JpZ1N0YXRlOworICAgIFBFTE9HRShwbW1Mb2cocE1hYywgTE9HRSwKKyAgICAgICAgRkwoInBtbVVhcHNkOiBXYWtpbmcgdXAgZnJvbSBVQVBTRCBtb2RlIGZhaWxlZCwgUmV0IENvZGU6ICVkLCBOZXh0IFN0YXRlOiAlZFxuIiksCisgICAgICAgIHJldFN0YXR1cywgcE1hYy0+cG1tLmdQbW1TdGF0ZSk7KQorICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9QTUNfRVhJVF9JTVBTX1JTUCwgcmVzdWx0Q29kZSwgMCwgMCk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcG1tRXhpdFVhcHNkUmVzcG9uc2VIYW5kbGVyCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBTSVJfSEFMX0VYSVRfVUFQU0RfUlNQIGZyb20gSEFMIGFuZCBpcworICogcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgc3lzdGVtIHN0YXRlCisgKiBiZWZvcmUgY29uZmlndXJpbmcgUE1NIHRvIHRoZSBuZXcgZVBNTV9TVEFURV9CTVBTX1NMRUVQIHN0YXRlCisgKiBhbmQgc2VuZCBlV05JX1BNQ19FWElUX1VBUFNEX1JTUCB0byBQTUMuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gICAgICAgR2xvYmFsIGhhbmRsZSB0byBNQUMKKyAqIEByZXR1cm4gICAgICBOb25lCisgKi8KK3ZvaWQgcG1tRXhpdFVhcHNkUmVzcG9uc2VIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVIYWxTdGF0dXMgcnNwU3RhdHVzKQoreworICAgIHRTaXJSZXN1bHRDb2RlcyByZXN1bHRDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKworICAgIC8qIHdlIG5lZWQgdG8gcHJvY2VzcyBhbGwgdGhlIGRlZmVycmVkIG1lc3NhZ2VzIGVucXVldWVkIHNpbmNlCisgICAgICogdGhlIGluaXRpYXRpbmcgdGhlIFNJUl9IQUxfRVhJVF9VQVBTRF9SRVEuCisgICAgICovCisgICAgU0VUX0xJTV9QUk9DRVNTX0RFRkRfTUVTR1MocE1hYywgdHJ1ZSk7CisKKyAgICBpZiAocE1hYy0+cG1tLmdQbW1TdGF0ZSAhPSBlUE1NX1NUQVRFX1VBUFNEX1dUX1dBS0VVUF9SU1ApCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCgiUmVjZWl2ZWQgSEFMX0VYSVRfVUFQU0RfUlNQIGluIGludmFsaWQgc3RhdGU6ICVkXG4iKSwKKyAgICAgICAgICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUpOykKKyAgICAgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1BNQ19FWElUX1VBUFNEX1JTUCwgZVNJUl9TTUVfSU5WQUxJRF9QTU1fU1RBVEUsIDAsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoKHJzcFN0YXR1cykKKyAgICB7CisgICAgICAgIGNhc2UgZUhBTF9TVEFUVVNfU1VDQ0VTUzoKKyAgICAgICAgICAgIHJlc3VsdENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgICAgICAgICAgUEVMT0dXKHBtbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgIEZMKCJSZWNlaXZlZCBTSVJfSEFMX0VYSVRfVUFQU0RfUlNQIHdpdGggU3VjY2Vzc2Z1bCByZXNwb25zZSBcbiIpKTspCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJlc3VsdENvZGUgPSBlU0lSX1NNRV9VQVBTRF9SRVFfRkFJTEVEOworICAgICAgICAgICAgUEVMT0dFKHBtbUxvZyhwTWFjLCBMT0dXLAorICAgICAgICAgICAgICAgIEZMKCJSZWNlaXZlZCBTSVJfSEFMX0VYSVRfVUFQU0RfUlNQIHdpdGggRmFpbHVyZSBTdGF0dXNcbiIpKTspCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlID0gZVBNTV9TVEFURV9CTVBTX1NMRUVQOworICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9QTUNfRVhJVF9VQVBTRF9SU1AsIHJlc3VsdENvZGUsIDAsIDApOworICAgIHJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICAgcG1tU2VuZFdvd2xBZGRCY2FzdFB0cm4KK1xicmllZiAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBTSVJfSEFMX1dPV0xfQUREX0JDQVNUX1BUUk4KK1wgICAgICAgIG1lc3NhZ2UgdG8gSEFMLgorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKK1xwYXJhbSAgIHRwU2lyTXNnUSAgICAgICBwTXNnCitccmV0dXJuICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgcG1tU2VuZFdvd2xBZGRCY2FzdFB0cm4odHBBbmlTaXJHbG9iYWwgcE1hYywgIHRwU2lyTXNnUSBwTXNnKQoreworICAgIHRwU2lyV293bEFkZEJjYXN0UHRybiAgcEJjYXN0UHRybjsKKyAgICB0U2lyTWJNc2cgICAgICAgICAgICAgICpwTWJNc2cgPSAodFNpck1iTXNnICopcE1zZy0+Ym9keXB0cjsKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgICAgIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICAgdFNpck1zZ1EgICAgICAgICAgICAgICBtc2dROworCisgICAgaWYgKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQmNhc3RQdHJuLCBzaXplb2YoKnBCY2FzdFB0cm4pKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgV29XTEFOIEFkZCBCY2FzdCBQYXR0ZXJuIFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgICh2b2lkKSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBCY2FzdFB0cm4sIHBNYk1zZy0+ZGF0YSwgc2l6ZW9mKCpwQmNhc3RQdHJuKSk7CisKKyAgICBpZiAoTlVMTCA9PSBwQmNhc3RQdHJuKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsIEZMKCJBZGQgYnJvYWRjYXN0IHBhdHRlcm4gbWVzc2FnZSBpcyBOVUxMIFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbXNnUS50eXBlID0gV0RBX1dPV0xfQUREX0JDQVNUX1BUUk47CisgICAgbXNnUS5yZXNlcnZlZCA9IDA7CisgICAgbXNnUS5ib2R5cHRyID0gcEJjYXN0UHRybjsKKyAgICBtc2dRLmJvZHl2YWwgPSAwOworCisgICAgcG1tTG9nKHBNYWMsIExPRzEsIEZMKCAiU2VuZGluZyBXREFfV09XTF9BRERfQkNBU1RfUFRSTiB0byBIQUwiKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX1dPV0xfQUREX0JDQVNUX1BUUk5fRVZFTlQsIE5VTEwsIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApKSkKKyAgICB7CisgICAgICAgIGlmIChwQmNhc3RQdHJuICE9IE5VTEwpCisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwQmNhc3RQdHJuKTsKKyAgICAgICAgcG1tTG9nKCBwTWFjLCBMT0dQLCBGTCgiUG9zdGluZyBXREFfV09XTF9BRERfQkNBU1RfUFRSTiBmYWlsZWQsIHJlYXNvbj0lWCIpLCByZXRDb2RlICk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICAgcG1tU2VuZFdvd2xEZWxCY2FzdFB0cm4KK1xicmllZiAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBTSVJfSEFMX1dPV0xfREVMX0JDQVNUX1BUUk4KK1wgICAgICAgIG1lc3NhZ2UgdG8gSEFMLgorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKK1xwYXJhbSAgIHRwU2lyTXNnUSAgICAgICBwTXNnCitccmV0dXJuICBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgcG1tU2VuZFdvd2xEZWxCY2FzdFB0cm4odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2cpCit7CisgICAgdHBTaXJXb3dsRGVsQmNhc3RQdHJuICAgcERlbGV0ZVB0cm47CisgICAgdFNpck1iTXNnICAgICAgICAgICAgICAgKnBNYk1zZyA9ICh0U2lyTWJNc2cgKilwTXNnLT5ib2R5cHRyOworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgICAgIHJldENvZGUgPSBlU0lSX1NVQ0NFU1M7CisgICAgdFNpck1zZ1EgICAgICAgICAgICAgICAgbXNnUTsKKworICAgIGlmIChwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcERlbGV0ZVB0cm4sIHNpemVvZigqcERlbGV0ZVB0cm4pKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR1AsIEZMKCJGYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgV29XTEFOIERlbGV0ZSBCY2FzdCBQYXR0ZXJuIFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgICh2b2lkKSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBEZWxldGVQdHJuLCBwTWJNc2ctPmRhdGEsIHNpemVvZigqcERlbGV0ZVB0cm4pKTsKKworICAgIGlmIChOVUxMID09IHBEZWxldGVQdHJuKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsIEZMKCJEZWxldGUgYnJvYWRjYXN0IHBhdHRlcm4gbWVzc2FnZSBpcyBOVUxMIFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbXNnUS50eXBlID0gV0RBX1dPV0xfREVMX0JDQVNUX1BUUk47CisgICAgbXNnUS5yZXNlcnZlZCA9IDA7CisgICAgbXNnUS5ib2R5cHRyID0gcERlbGV0ZVB0cm47CisgICAgbXNnUS5ib2R5dmFsID0gMDsKKworICAgIHBtbUxvZyhwTWFjLCBMT0cxLCBGTCggIlNlbmRpbmcgV0RBX1dPV0xfREVMX0JDQVNUX1BUUk4iKSk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKyAgICBsaW1EaWFnRXZlbnRSZXBvcnQocE1hYywgV0xBTl9QRV9ESUFHX1dPV0xfREVMX0JDQVNUX1BUUk5fRVZFTlQsIE5VTEwsIDAsIDApOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApKSkKKyAgICB7CisgICAgICAgIGlmIChOVUxMICE9IHBEZWxldGVQdHJuKQorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikgcERlbGV0ZVB0cm4pOworICAgICAgICBwbW1Mb2coIHBNYWMsIExPR1AsIEZMKCJQb3N0aW5nIFdEQV9XT1dMX0RFTF9CQ0FTVF9QVFJOIGZhaWxlZCwgcmVhc29uPSVYIiksIHJldENvZGUgKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBwbW1FbnRlcldvd2xSZXF1ZXN0SGFuZGxlcgorXGJyaWVmICAgTElNIHByb2Nlc3MgdGhlIGVXTklfUE1DX0VOVEVSX1dPV0xfUkVRIG1lc3NhZ2UsIGFuZAorXCAgICAgICAgaW52b2tlcyBwbW1TZW5kV293bEVudGVyUmVxdWVzdCgpIHRvIHNlbmQKK1wgICAgICAgIFdEQV9XT1dMX0VOVEVSX1JFUSBtZXNzYWdlIHRvIEhBTC4KK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsICBwTWFjCitccGFyYW0gICB0cFNpck1zZ1EgICAgICAgcE1zZworXHJldHVybiAgTm9uZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHBtbUVudGVyV293bFJlcXVlc3RIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBwTXNnKQoreworICAgIHRwU2lyU21lV293bEVudGVyUGFyYW1zICBwU21lV293bFBhcmFtcyA9IE5VTEw7CisgICAgdHBTaXJIYWxXb3dsRW50ZXJQYXJhbXMgIHBIYWxXb3dsUGFyYW1zID0gTlVMTDsKKyAgICB0U2lyUmV0U3RhdHVzICByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworICAgIHRBTklfVTMyICBjZmdWYWx1ZSA9IDA7CisgICAgdFNpck1iTXNnICpwTWJNc2cgPSAodFNpck1iTXNnICopcE1zZy0+Ym9keXB0cjsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisgICAgbGltRGlhZ0V2ZW50UmVwb3J0KHBNYWMsIFdMQU5fUEVfRElBR19FTlRFUl9XT1dMX1JFUV9FVkVOVCwgTlVMTCwgMCwgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisKKyAgICBwU21lV293bFBhcmFtcyA9ICh0cFNpclNtZVdvd2xFbnRlclBhcmFtcykocE1iTXNnLT5kYXRhKTsKKworICAgIGlmIChOVUxMID09IHBTbWVXb3dsUGFyYW1zKQorICAgICAgICByZXR1cm47CisvLyBOZWVkIHRvIGZpeCBpdCBBU0FQIC0gVEJICisjaWYgMAorICAgIGlmIChwTWFjLT5saW0uZ0xpbVNtZVN0YXRlICE9IGVMSU1fU01FX0xJTktfRVNUX1NUQVRFKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsIEZMKCJSY3ZkIFBNQ19FTlRFUl9XT1dMX1JFUSB3aGVuIHN0YXRpb24gaXMgbm90IGFzc29jaWF0ZWQgXG4iKSk7CisgICAgICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9QTUNfRU5URVJfV09XTF9SU1AsIGVTSVJfU01FX1NUQV9OT1RfQVNTT0NJQVRFRCwgMCwgMCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyNlbmRpZgorCisKKyAgICBpZiAoKHBNYWMtPnBtbS5nUG1tU3RhdGUgIT0gZVBNTV9TVEFURV9CTVBTX1NMRUVQKSAmJiAocE1hYy0+cG1tLmdQbW1TdGF0ZSAhPSBlUE1NX1NUQVRFX1dPV0xBTikpCisgICAgeworICAgICAgICBwbW1Mb2cocE1hYywgTE9HRSwgRkwoIlJjdmQgUE1DX0VOVEVSX1dPV0xfUkVRIGluIGludmFsaWQgUG93ZXIgU2F2ZSBzdGF0ZSBcbiIpKTsKKyAgICAgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1BNQ19FTlRFUl9XT1dMX1JTUCwgZVNJUl9TTUVfSU5WQUxJRF9QTU1fU1RBVEUsIDAsIDApOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBIYWxXb3dsUGFyYW1zLCBzaXplb2YoKnBIYWxXb3dsUGFyYW1zKSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHBtbUxvZyhwTWFjLCBMT0dQLCBGTCgiRmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEVudGVyIFdvd2wgUmVxdWVzdCBcbiIpKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgICh2b2lkKSBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh0QU5JX1U4ICopcEhhbFdvd2xQYXJhbXMsIHNpemVvZigqcEhhbFdvd2xQYXJhbXMpICk7CisKKyAgICAvLyBmaWxsIGluIHRoZSBtZXNzYWdlIGZpZWxkCisgICAgcEhhbFdvd2xQYXJhbXMtPnVjTWFnaWNQa3RFbmFibGUgPSBwU21lV293bFBhcmFtcy0+dWNNYWdpY1BrdEVuYWJsZTsKKyAgICBwSGFsV293bFBhcmFtcy0+dWNQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlID0gcFNtZVdvd2xQYXJhbXMtPnVjUGF0dGVybkZpbHRlcmluZ0VuYWJsZTsKKyAgICAodm9pZClwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXBIYWxXb3dsUGFyYW1zLT5tYWdpY1B0cm4sICh0QU5JX1U4ICopcFNtZVdvd2xQYXJhbXMtPm1hZ2ljUHRybiwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisgICAgcEhhbFdvd2xQYXJhbXMtPnVjV29XRUFQSURSZXF1ZXN0RW5hYmxlID0gcFNtZVdvd2xQYXJhbXMtPnVjV29XRUFQSURSZXF1ZXN0RW5hYmxlOworICAgIHBIYWxXb3dsUGFyYW1zLT51Y1dvV0VBUE9MNFdheUVuYWJsZSA9IHBTbWVXb3dsUGFyYW1zLT51Y1dvV0VBUE9MNFdheUVuYWJsZTsKKyAgICBwSGFsV293bFBhcmFtcy0+dWNXb3dOZXRTY2FuT2ZmbG9hZE1hdGNoID0gcFNtZVdvd2xQYXJhbXMtPnVjV293TmV0U2Nhbk9mZmxvYWRNYXRjaDsKKyAgICBwSGFsV293bFBhcmFtcy0+dWNXb3dHVEtSZWtleUVycm9yID0gcFNtZVdvd2xQYXJhbXMtPnVjV293R1RLUmVrZXlFcnJvcjsKKyAgICBwSGFsV293bFBhcmFtcy0+dWNXb1dCU1NDb25uTG9zcyA9IHBTbWVXb3dsUGFyYW1zLT51Y1dvV0JTU0Nvbm5Mb3NzOworI2VuZGlmIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19XT1dMQU5fVUNBU1RfUEFUVEVSTl9GSUxURVJfRU5BQkxFLCAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnR2V0IGZhaWxlZCBmb3IgV05JX0NGR19XT1dMQU5fVUNBU1RfUEFUVEVSTl9GSUxURVJfRU5BQkxFIikpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgcEhhbFdvd2xQYXJhbXMtPnVjVWNhc3RQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlID0gKHRBTklfVTgpY2ZnVmFsdWU7CisKKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1dPV0xBTl9DSEFOTkVMX1NXSVRDSF9FTkFCTEUsICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmdHZXQgZmFpbGVkIGZvciBXTklfQ0ZHX1dPV0xBTl9DSEFOTkVMX1NXSVRDSF9FTkFCTEUiKSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBwSGFsV293bFBhcmFtcy0+dWNXb3dDaG5sU3dpdGNoUmN2ID0gKHRBTklfVTgpY2ZnVmFsdWU7CisKKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1dPV0xBTl9ERUFVVEhfRU5BQkxFLCAmY2ZnVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmdHZXQgZmFpbGVkIGZvciBXTklfQ0ZHX1dPV0xBTl9ERUFVVEhfRU5BQkxFIFxuIikpOworICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBwSGFsV293bFBhcmFtcy0+dWNXb3dEZWF1dGhSY3YgPSAodEFOSV9VOCljZmdWYWx1ZTsKKworICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfV09XTEFOX0RJU0FTU09DX0VOQUJMRSwgJmNmZ1ZhbHVlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNmZ0dldCBmYWlsZWQgZm9yIFdOSV9DRkdfV09XTEFOX0RFQVVUSF9FTkFCTEUgXG4iKSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBwSGFsV293bFBhcmFtcy0+dWNXb3dEaXNhc3NvY1JjdiA9ICh0QU5JX1U4KWNmZ1ZhbHVlOworCisgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19XT1dMQU5fTUFYX01JU1NFRF9CRUFDT04sICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmdHZXQgZmFpbGVkIGZvciBXTklfQ0ZHX1dPV0xBTl9NQVhfTUlTU0VEX0JFQUNPTiBcbiIpKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIHBIYWxXb3dsUGFyYW1zLT51Y1dvd01heE1pc3NlZEJlYWNvbnMgPSAodEFOSV9VOCljZmdWYWx1ZTsKKworICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfV09XTEFOX01BWF9TTEVFUF9QRVJJT0QsICZjZmdWYWx1ZSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmdHZXQgZmFpbGVkIGZvciBXTklfQ0ZHX1dPV0xBTl9NQVhfU0xFRVBfUEVSSU9EIFxuIikpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgcEhhbFdvd2xQYXJhbXMtPnVjV293TWF4U2xlZXBVc2VjID0gKHRBTklfVTgpY2ZnVmFsdWU7CisKKyAgICAvL1NlbmQgbWVzc2FnZSB0byBIQUwKKyAgICBpZiggZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gcG1tU2VuZFdvd2xFbnRlclJlcXVlc3QoIHBNYWMsIHBIYWxXb3dsUGFyYW1zKSkpCisgICAgeworICAgICAgICBwbW1Mb2cocE1hYywgTE9HRSwgRkwoIlNlbmQgRU5URVJfV09XTF9SRVEgdG8gSEFMIGZhaWxlZCwgcmVhc29uQ29kZSAlZCBcbiIpLCByZXRDb2RlKTsKKyAgICAgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1BNQ19FTlRFUl9XT1dMX1JTUCwgZVNJUl9TTUVfV09XTF9FTlRFUl9SRVFfRkFJTEVELCAwLCAwKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIHJldHVybjsKKworZW5kOgorICAgIGlmIChwSGFsV293bFBhcmFtcyAhPSBOVUxMKQorICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwSGFsV293bFBhcmFtcyk7CisgICAgcmV0dXJuOworfQorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiAgICAgIHBtbVNlbmRXb3dsRW50ZXJSZXF1ZXN0CitcYnJpZWYgICBMSU0gc2VuZHMgYSBXREFfV09XTF9FTlRFUl9SRVEgbWVzc2FnZSB0byBIQUwgd2l0aAorXCAgICAgICAgdGhlIG1lc3NhZ2Ugc3RydWN0dXJlIHBIYWxXb3dsUGFyYW1zLiAgSEFMIHNoYWxsIGxhdGVyCitcICAgICAgICBzZW5kIGEgV0RBX1dPV0xfRU5URVJfUlNQIHdpdGggdGhlIHNhbWUgcG9pbnRlcgorXCAgICAgICAgdG8gdGhlIG1lc3NhZ2Ugc3RydWN0dXJlIGJhY2sgdG8gUE1NLgorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgICAgICAgICAgIHBNYWMKK1xwYXJhbSAgIHRwU2lySGFsV293bEVudGVyUGFyYW1zICBwSGFsV293bFBhcmFtcworXHJldHVybiAgdFNpclJldFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U2lyUmV0U3RhdHVzIHBtbVNlbmRXb3dsRW50ZXJSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lySGFsV293bEVudGVyUGFyYW1zIHBIYWxXb3dsUGFyYW1zKQoreworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgICAgICAgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0U2lyTXNnUSAgICAgICAgICAgICAgICAgIG1zZ1E7CisKKyAgICBpZiAoTlVMTCA9PSBwSGFsV293bFBhcmFtcykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKworICAgIG1zZ1EudHlwZSA9IFdEQV9XT1dMX0VOVEVSX1JFUTsKKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBwSGFsV293bFBhcmFtczsKKyAgICBtc2dRLmJvZHl2YWwgPSAwOworCisgICAgLyogRGVmZXIgYW55IGluY29taW5nIG1lc3NhZ2UgdW50aWwgd2UgZ2V0CisgICAgICogYSBXREFfV09XTF9FTlRFUl9SU1AgZnJvbSBIQUwKKyAgICAgKi8KKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCBmYWxzZSk7CisKKyAgICByZXRDb2RlID0gd2RhUG9zdEN0cmxNc2cocE1hYywgJm1zZ1EpOworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gcmV0Q29kZSApCisgICAgeworICAgICAgICBwbW1Mb2coIHBNYWMsIExPR0UsIEZMKCJQb3N0aW5nIFdEQV9XT1dMX0VOVEVSX1JFUSBmYWlsZWQsIHJlYXNvbj0lWCIpLCByZXRDb2RlICk7CisgICAgICAgIHJldHVybiByZXRDb2RlOworICAgIH0KKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICAgcG1tRW50ZXJXb3dsYW5SZXNwb25zZUhhbmRsZXIKK1xicmllZiAgIExJTSBwcm9jZXNzIHRoZSBXREFfV09XTF9FTlRFUl9SU1AgbWVzc2FnZS4KK1wgICAgICAgIGFuZCBzZW5kcyBlV05JX1BNQ19FTlRFUl9XT1dMX1JTUCB0byBTTUUuCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCAgcE1hYworXHBhcmFtICAgdHBTaXJNc2dRICAgICAgIGxpbU1zZworXHJldHVybiAgTm9uZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHBtbUVudGVyV293bGFuUmVzcG9uc2VIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyTXNnUSBsaW1Nc2cpCit7CisgICAgdHBTaXJIYWxXb3dsRW50ZXJQYXJhbXMgIHBIYWxXb3dsTXNnOworICAgIGVIYWxTdGF0dXMgICAgICAgICAgICByc3BTdGF0dXM7CisgICAgdFNpclJlc3VsdENvZGVzICAgICAgICAgIHNtZVJzcENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCisgICAgLyogd2UgbmVlZCB0byBwcm9jZXNzIGFsbCB0aGUgZGVmZXJyZWQgbWVzc2FnZXMgZW5xdWV1ZWQKKyAgICAgKiBzaW5jZSB0aGUgaW5pdGlhdGluZyB0aGUgV0RBX1dPV0xfRU5URVJfUkVRLgorICAgICAqLworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCisgICAgcEhhbFdvd2xNc2cgPSAodHBTaXJIYWxXb3dsRW50ZXJQYXJhbXMpKGxpbU1zZy0+Ym9keXB0cik7CisgICAgaWYgKE5VTEwgPT0gcEhhbFdvd2xNc2cpCisgICAgeworICAgICAgICBwbW1Mb2cocE1hYywgTE9HRSwgRkwoIlJlY3ZkIFdEQV9XT1dMX0VOVEVSX1JTUCB3aXRoIE5VTEwgbXNnICIpKTsKKyAgICAgICAgc21lUnNwQ29kZSA9IGVTSVJfU01FX1dPV0xfRU5URVJfUkVRX0ZBSUxFRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcnNwU3RhdHVzID0gcEhhbFdvd2xNc2ctPnN0YXR1czsKKyAgICAgICAgaWYocnNwU3RhdHVzID09IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBtbUxvZyhwTWFjLCBMT0dXLCBGTCgiUmN2IHN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBIQUwgdG8gZW50ZXIgV09XTEFOIFxuIikpOworICAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1TdGF0ZSA9IGVQTU1fU1RBVEVfV09XTEFOOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsIEZMKCJIQUwgZW50ZXIgV09XTEFOIGZhaWxlZCwgaW5mb3JtaW5nIFNNRVxuIikpOworICAgICAgICAgICAgc21lUnNwQ29kZSA9IGVTSVJfU01FX1dPV0xfRU5URVJfUkVRX0ZBSUxFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9QTUNfRU5URVJfV09XTF9SU1AsIHNtZVJzcENvZGUsIDAsIDApOworICAgIHJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICAgcG1tRXhpdFdvd2xhblJlcXVlc3RIYW5kbGVyCitcYnJpZWYgICBQRSBwcm9jZXNzIHRoZSBlV05JX1BNQ19FWElUX1dPV0xfUkVRIG1lc3NhZ2UuCitcICAgICAgICBhbmQgc2VuZHMgV0RBX1dPV0xfRVhJVF9SRVEgdG8gSEFMLgorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKK1xyZXR1cm4gIE5vbmUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBwbW1FeGl0V293bGFuUmVxdWVzdEhhbmRsZXIodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0U2lyUmV0U3RhdHVzIHJldFN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0U2lyUmVzdWx0Q29kZXMgc21lUnNwQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIGxpbURpYWdFdmVudFJlcG9ydChwTWFjLCBXTEFOX1BFX0RJQUdfRVhJVF9XT1dMX1JFUV9FVkVOVCwgTlVMTCwgMCwgMCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisKKyAgICBpZiAoIHBNYWMtPnBtbS5nUG1tU3RhdGUgIT0gZVBNTV9TVEFURV9XT1dMQU4gKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICBGTCgiRXhpdCBXT1dMQU4gUmVxdWVzdCByZWNlaXZlZCBpbiBpbnZhbGlkIHN0YXRlIFBNTT0lZCBcbiIpLAorICAgICAgICAgICAgcE1hYy0+cG1tLmdQbW1TdGF0ZSk7CisgICAgICAgIHNtZVJzcENvZGUgPSBlU0lSX1NNRV9JTlZBTElEX1BNTV9TVEFURTsKKyAgICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKworICAgIGlmKChyZXRTdGF0dXMgPSBwbW1TZW5kRXhpdFdvd2xSZXEocE1hYykpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHBtbUxvZyhwTWFjLCBMT0dFLAorICAgICAgICAgICAgRkwoIkZhaWwgdG8gc2VuZCBXREFfV09XTF9FWElUX1JFUSwgcmVhc29uIGNvZGUgJWRcbiIpLAorICAgICAgICAgICAgcmV0U3RhdHVzKTsKKyAgICAgICAgc21lUnNwQ29kZSA9IGVTSVJfU01FX1dPV0xfRVhJVF9SRVFfRkFJTEVEOworICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIHJldHVybjsKKworZmFpbHVyZToKKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfUE1DX0VYSVRfV09XTF9SU1AsIHNtZVJzcENvZGUsIDAsIDApOworICAgIHJldHVybjsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuICAgICAgcG1tU2VuZEV4aXRXb3dsUmVxCitcYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBXREFfV09XTF9FWElUX1JFUQorXCAgICAgICAgbWVzc2FnZSB0byBIQUwuCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCAgcE1hYworXHJldHVybiAgTm9uZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0U2lyUmV0U3RhdHVzICBwbW1TZW5kRXhpdFdvd2xSZXEodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0U2lyUmV0U3RhdHVzICByZXRDb2RlID0gZVNJUl9TVUNDRVNTOworICAgIHRTaXJNc2dRICAgICAgIG1zZ1E7CisKKyAgICBtc2dRLnR5cGUgPSBXREFfV09XTF9FWElUX1JFUTsKKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSAwOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICBwbW1Mb2cocE1hYywgTE9HVywgRkwoIlNlbmRpbmcgV0RBX1dPV0xfRVhJVF9SRVEiKSk7CisKKyAgICAvKiB3ZSBuZWVkIHRvIGRlZmVyIGFueSBpbmNvbWluZyBtZXNzYWdlcyB1bnRpbAorICAgICAqIHdlIGdldCBhIFdEQV9XT1dMX0VYSVRfUlNQIGZyb20gSEFMLgorICAgICAqLworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKworICAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gKHJldENvZGUgPSB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKSkpCisgICAgICAgIHBtbUxvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgIEZMKCJQb3N0aW5nIFdEQV9XT1dMX0VYSVRfUkVRIGZhaWxlZCwgcmVhc29uPSVYXG4iKSwKKyAgICAgICAgICAgIHJldENvZGUgKTsKKworICAgIHJldHVybiByZXRDb2RlOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBwbW1FeGl0V293bGFuUmVzcG9uc2VIYW5kbGVyCitcYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIFdEQV9XT1dMX0VYSVRfUlNQIG1lc3NhZ2UuCitcICAgICAgICBhbmQgc2VuZHMgYmFjayBlV05JX1BNQ19FWElUX1dPV0xfUlNQIHRvIFNNRS4KK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsICBwTWFjCitccmV0dXJuICBOb25lCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgcG1tRXhpdFdvd2xhblJlc3BvbnNlSGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjLCBlSGFsU3RhdHVzIHJzcFN0YXR1cykKK3sKKyAgICAvKiB3ZSBuZWVkIHRvIHByb2Nlc3MgYWxsIHRoZSBkZWZlcnJlZCBtZXNzYWdlcyBlbnF1ZXVlZAorICAgICAqIHNpbmNlIHRoZSBpbml0aWF0aW5nIHRoZSBXREFfV09XTF9FWElUX1JFUS4KKyAgICAgKi8KKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKworICAgIC8vIHJlc3RvcmUgUE1NIHN0YXRlIHRvIEJNUFMgbW9kZQorICAgIHBNYWMtPnBtbS5nUG1tU3RhdGUgPSBlUE1NX1NUQVRFX0JNUFNfU0xFRVA7CisKKyAgICBpZihyc3BTdGF0dXMgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHBtbUxvZyhwTWFjLCBMT0dXLCBGTCgiUmN2ZCBzdWNjZXNzZnVsIHJzcCBmcm9tIEhBTCB0byBleGl0IFdPV0xBTiBcbiIpKTsKKyAgICAgICAgbGltU2VuZFNtZVJzcChwTWFjLCBlV05JX1BNQ19FWElUX1dPV0xfUlNQLCBlU0lSX1NNRV9TVUNDRVNTLCAwLCAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsIEZMKCJSY3ZkIGZhaWx1cmUgcnNwIGZyb20gSEFMIHRvIGV4aXQgV09XTEFOIFxuIikpOworICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfUE1DX0VYSVRfV09XTF9SU1AsIGVTSVJfU01FX1dPV0xfRVhJVF9SRVFfRkFJTEVELCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbUltcHNTZW5kQ2hhbmdlUHdyU2F2ZU1zZworICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdG9nZ2xlIHRoZSBJZGxlIG1vZGUgcG93ZXIgc2F2ZSBtb2RlCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gICBHbG9iYWwgaGFuZGxlIHRvIE1BQworICogQHBhcmFtICAgbW9kZSB0byBiZSBjb25maWd1cmVkCisgKiBAcmV0dXJuICBOb25lCisgKi8KKwordFNpclJldFN0YXR1cyBwbW1JbXBzU2VuZENoYW5nZVB3clNhdmVNc2codHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBtb2RlKQoreworICAgIHRTaXJSZXRTdGF0dXMgcmV0U3RhdHVzID0gZVNJUl9TVUNDRVNTOworICAgIHRTaXJNc2dRIG1zZ1E7CisKKyAgICBpZiAoU0lSX1BNX1NMRUVQX01PREUgPT0gbW9kZSkKKyAgICB7CisgICAgICAgIG1zZ1EudHlwZSA9IFdEQV9FTlRFUl9JTVBTX1JFUTsKKyAgICAgICAgUEVMT0dXKHBtbUxvZyAocE1hYywgTE9HVywgRkwoIlNlbmRpbmcgV0RBX0VOVEVSX0lNUFNfUkVRIHRvIEhBTFxuIikpOykKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbXNnUS50eXBlID0gV0RBX0VYSVRfSU1QU19SRVE7CisgICAgICAgIFBFTE9HVyhwbW1Mb2cgKHBNYWMsIExPR1csIEZMKCJTZW5kaW5nIFdEQV9FWElUX0lNUFNfUkVRIHRvIEhBTFxuIikpOykKKyAgICB9CisKKyAgICBtc2dRLnJlc2VydmVkID0gMDsKKyAgICBtc2dRLmJvZHlwdHIgPSBOVUxMOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisKKyAgICAvKiB3ZSBuZWVkIHRvIGRlZmVyIGFueSBpbmNvbWluZyBtZXNzYWdlcyB1bnRpbCB3ZSBnZXQgYQorICAgICAqIFdEQV9FTlRFUl9JTVBTX1JFUSBvciBXREFfRVhJVF9JTVBTX1JTUCBmcm9tIEhBTC4KKyAgICAgKi8KKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCBmYWxzZSk7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisgICAgcmV0U3RhdHVzID0gd2RhUG9zdEN0cmxNc2cocE1hYywgJm1zZ1EpOworICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHJldFN0YXR1cyApCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsIAorICAgICAgICAgICAgRkwoIldEQV9FTlRFUi9FWElUX0lNUFNfUkVRIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWFxuIiksIHJldFN0YXR1cyk7KQorICAgIH0KKworICAgIHJldHVybiByZXRTdGF0dXM7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbVVhcHNkU2VuZENoYW5nZVB3clNhdmVNc2cKKyAqCisgKiBGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgZWl0aGVyIFdEQV9FTlRFUl9VQVBTRF9SRVEKKyAqIG9yIFdEQV9FWElUX1VBUFNEX1JFUSB0byBIQUwuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gICBwTWFjICAgICBHbG9iYWwgaGFuZGxlIHRvIE1BQworICogQHBhcmFtICAgbW9kZSAgICAgbW9kZSB0byBiZSBjb25maWd1cmVkCisgKiBAcmV0dXJuICB0U2lyUmV0U3RhdHVzCisgKi8KK3RTaXJSZXRTdGF0dXMgcG1tVWFwc2RTZW5kQ2hhbmdlUHdyU2F2ZU1zZyAodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBtb2RlKQoreworICAgIHRTaXJSZXRTdGF0dXMgcmV0U3RhdHVzID0gZVNJUl9TVUNDRVNTOworICAgIHRwVWFwc2RQYXJhbXMgcFVhcHNkUGFyYW1zID0gTlVMTDsKKyAgICB0QU5JX1U4ICB1YXBzZERlbGl2ZXJ5TWFzayA9IDA7CisgICAgdEFOSV9VOCAgdWFwc2RUcmlnZ2VyTWFzayA9IDA7CisgICAgdFNpck1zZ1EgbXNnUTsKKworICAgIGlmIChTSVJfUE1fU0xFRVBfTU9ERSA9PSBtb2RlKQorICAgIHsKKyAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwVWFwc2RQYXJhbXMsIHNpemVvZih0VWFwc2RQYXJhbXMpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HVyhwbW1Mb2cocE1hYywgTE9HVywgRkwoInBtbVVhcHNkIDpwYWxBbGxvY2F0ZU1lbW9yeSgpIGZhaWxlZFxuIikpOykKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgICAgICAgIHJldHVybiByZXRTdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKilwVWFwc2RQYXJhbXMsIHNpemVvZih0VWFwc2RQYXJhbXMpKTsKKyAgICAgICAgbXNnUS50eXBlID0gV0RBX0VOVEVSX1VBUFNEX1JFUTsKKyAgICAgICAgbXNnUS5ib2R5cHRyID0gcFVhcHNkUGFyYW1zOworCisgICAgICAgIHVhcHNkRGVsaXZlcnlNYXNrID0gKHBNYWMtPmxpbS5nVWFwc2RQZXJBY0JpdG1hc2sgfCBwTWFjLT5saW0uZ1VhcHNkUGVyQWNEZWxpdmVyeUVuYWJsZU1hc2spOworICAgICAgICB1YXBzZFRyaWdnZXJNYXNrID0gKHBNYWMtPmxpbS5nVWFwc2RQZXJBY0JpdG1hc2sgfCBwTWFjLT5saW0uZ1VhcHNkUGVyQWNUcmlnZ2VyRW5hYmxlTWFzayk7CisKKyAgICAgICAgcFVhcHNkUGFyYW1zLT5ia0RlbGl2ZXJ5RW5hYmxlZCA9IExJTV9VQVBTRF9HRVQoQUNCSywgdWFwc2REZWxpdmVyeU1hc2spOworICAgICAgICBwVWFwc2RQYXJhbXMtPmJlRGVsaXZlcnlFbmFibGVkID0gTElNX1VBUFNEX0dFVChBQ0JFLCB1YXBzZERlbGl2ZXJ5TWFzayk7CisgICAgICAgIHBVYXBzZFBhcmFtcy0+dmlEZWxpdmVyeUVuYWJsZWQgPSBMSU1fVUFQU0RfR0VUKEFDVkksIHVhcHNkRGVsaXZlcnlNYXNrKTsKKyAgICAgICAgcFVhcHNkUGFyYW1zLT52b0RlbGl2ZXJ5RW5hYmxlZCA9IExJTV9VQVBTRF9HRVQoQUNWTywgdWFwc2REZWxpdmVyeU1hc2spOworICAgICAgICBwVWFwc2RQYXJhbXMtPmJrVHJpZ2dlckVuYWJsZWQgPSBMSU1fVUFQU0RfR0VUKEFDQkssIHVhcHNkVHJpZ2dlck1hc2spOworICAgICAgICBwVWFwc2RQYXJhbXMtPmJlVHJpZ2dlckVuYWJsZWQgPSBMSU1fVUFQU0RfR0VUKEFDQkUsIHVhcHNkVHJpZ2dlck1hc2spOworICAgICAgICBwVWFwc2RQYXJhbXMtPnZpVHJpZ2dlckVuYWJsZWQgPSBMSU1fVUFQU0RfR0VUKEFDVkksIHVhcHNkVHJpZ2dlck1hc2spOworICAgICAgICBwVWFwc2RQYXJhbXMtPnZvVHJpZ2dlckVuYWJsZWQgPSBMSU1fVUFQU0RfR0VUKEFDVk8sIHVhcHNkVHJpZ2dlck1hc2spOworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsIAorICAgICAgICAgICAgICAgICAgICAgIEZMKCJVQVBTRCBNYXNrOiAgc3RhdGljID0gMHgleCwgRGVsaXZlcnlFbmFibGVkID0gMHgleCwgVHJpZ2dlckVuYWJsZWQgPSAweCV4IFxuIiksCisgICAgICAgICAgICBwTWFjLT5saW0uZ1VhcHNkUGVyQWNCaXRtYXNrLAorICAgICAgICAgICAgcE1hYy0+bGltLmdVYXBzZFBlckFjRGVsaXZlcnlFbmFibGVNYXNrLAorICAgICAgICAgICAgcE1hYy0+bGltLmdVYXBzZFBlckFjVHJpZ2dlckVuYWJsZU1hc2spOykKKworICAgICAgICBQRUxPRzEocG1tTG9nKHBNYWMsIExPRzEsIEZMKCJEZWxpdmVyeSBFbmFibGVkOiBCSz0lZCwgQkU9JWQsIFZpPSVkLCBWbz0lZCBcbiIpLCAKKyAgICAgICAgICAgIHBVYXBzZFBhcmFtcy0+YmtEZWxpdmVyeUVuYWJsZWQsIAorICAgICAgICAgICAgcFVhcHNkUGFyYW1zLT5iZURlbGl2ZXJ5RW5hYmxlZCwgCisgICAgICAgICAgICBwVWFwc2RQYXJhbXMtPnZpRGVsaXZlcnlFbmFibGVkLCAKKyAgICAgICAgICAgIHBVYXBzZFBhcmFtcy0+dm9EZWxpdmVyeUVuYWJsZWQpOykKKworICAgICAgICBQRUxPRzEocG1tTG9nKHBNYWMsIExPRzEsIEZMKCJUcmlnZ2VyIEVuYWJsZWQ6IEJLPSVkLCBCRT0lZCwgVmk9JWQsIFZvPSVkIFxuIiksIAorICAgICAgICAgICAgcFVhcHNkUGFyYW1zLT5ia1RyaWdnZXJFbmFibGVkLCAKKyAgICAgICAgICAgIHBVYXBzZFBhcmFtcy0+YmVUcmlnZ2VyRW5hYmxlZCwgCisgICAgICAgICAgICBwVWFwc2RQYXJhbXMtPnZpVHJpZ2dlckVuYWJsZWQsIAorICAgICAgICAgICAgcFVhcHNkUGFyYW1zLT52b1RyaWdnZXJFbmFibGVkKTspCisKKyAgICAgICAgUEVMT0dXKHBtbUxvZyAocE1hYywgTE9HVywgRkwoInBtbVVhcHNkOiBTZW5kaW5nIFdEQV9FTlRFUl9VQVBTRF9SRVEgdG8gSEFMXG4iKSk7KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtc2dRLnR5cGUgPSBXREFfRVhJVF9VQVBTRF9SRVE7CisgICAgICAgIG1zZ1EuYm9keXB0ciA9IE5VTEw7CisgICAgICAgIFBFTE9HVyhwbW1Mb2cgKHBNYWMsIExPR1csIEZMKCJwbW1VYXBzZDogU2VuZGluZyBXREFfRVhJVF9VQVBTRF9SRVEgdG8gSEFMXG4iKSk7KQorICAgIH0KKworICAgIC8qIHdlIG5lZWQgdG8gZGVmZXIgYW55IGluY29taW5nIG1lc3NhZ2VzIHVudGlsIHdlIGdldCBhCisgICAgICogV0RBX0VOVEVSL0VYSVRfVUFQU0RfUlNQIGZyb20gSEFMLgorICAgICAqLworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIGZhbHNlKTsKKworICAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgIG1zZ1EuYm9keXZhbCA9IDA7CisgICAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisgICAgcmV0U3RhdHVzID0gd2RhUG9zdEN0cmxNc2cocE1hYywgJm1zZ1EpOworICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHJldFN0YXR1cyApCisgICAgeworICAgICAgICBQRUxPR0UocG1tTG9nKHBNYWMsIExPR0UsIAorICAgICAgICAgICAgRkwoInBtbVVhcHNkOiBXREFfRU5URVIvRVhJVF9VQVBTRF9SRVEgdG8gSEFMIGZhaWxlZCwgcmVhc29uPSVYXG4iKSwKKyAgICAgICAgICAgIHJldFN0YXR1cyk7KQorICAgICAgICBpZiAoU0lSX1BNX1NMRUVQX01PREUgPT0gbW9kZSkKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTgqKXBVYXBzZFBhcmFtcyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldFN0YXR1czsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBwbW1VcGRhdGVJbXBzUHdyU2F2ZVN0YXRzCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB1cGRhdGUgdGhlIHBvd2VyIHNhdmUgc3RhdGlzdGljcyBpbiBNQUMKKyAqIGZvciBJZGxlIG1vZGUgcG93ZXIgc2F2ZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZQorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtICAgR2xvYmFsIGhhbmRsZSB0byBNQUMKKyAqIEByZXR1cm4gIE5vbmUKKyAqLworCit2b2lkIHBtbUltcHNVcGRhdGVQd3JTYXZlU3RhdHModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKy8qCisgICAgdEFOSV9VNjQgVGltZUF3YWtlID0gMDsKKworICAgIHBNYWMtPnBtbS5JbXBzU2xlZXBUaW1lU3RhbXAgPSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpOworCisgICAgaWYgKHBNYWMtPnBtbS5JbXBzV2FrZXVwVGltZVN0YW1wKQorICAgIHsKKyAgICAgICAgVGltZUF3YWtlID0gKHBNYWMtPnBtbS5JbXBzU2xlZXBUaW1lU3RhbXAgLSBwTWFjLT5wbW0uSW1wc1dha2V1cFRpbWVTdGFtcCkgLyAxMCA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFRpbWVBd2FrZSA9IDA7CisgICAgfQorCisgICAgaWYgKFRpbWVBd2FrZSA+IHBNYWMtPnBtbS5JbXBzTWF4VGltZUF3YWtlKQorICAgIHsKKyAgICAgICAgcE1hYy0+cG1tLkltcHNNYXhUaW1lQXdha2UgPSBUaW1lQXdha2U7CisgICAgfQorCisgICAgaWYgKCghcE1hYy0+cG1tLkltcHNNaW5UaW1lQXdha2UpIHx8IChUaW1lQXdha2UgPCBwTWFjLT5wbW0uSW1wc01pblRpbWVBd2FrZSkpCisgICAgeworICAgICAgICBwTWFjLT5wbW0uSW1wc01pblRpbWVBd2FrZSA9IFRpbWVBd2FrZTsKKyAgICB9CisKKyAgICBwTWFjLT5wbW0uSW1wc0F2Z1RpbWVBd2FrZSA9ICgocE1hYy0+cG1tLkltcHNBdmdUaW1lQXdha2UgKiBwTWFjLT5wbW0uSW1wc0NudFNsZWVwKSArIFRpbWVBd2FrZSkgLyAocE1hYy0+cG1tLkltcHNDbnRTbGVlcCArIDEpOworCisgICAgKHBNYWMtPnBtbS5JbXBzQ250U2xlZXApKys7CisKKyAgICByZXR1cm47CisqLworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBtbUltcHNVcGRhdGVXYWtldXBTdGF0cworICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSBXYWtlIHVwIHN0YXRpc3RpY3MgaW4gTUFDCisgKiBmb3IgSWRsZSBtb2RlIHBvd2VyIHNhdmUKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgIEdsb2JhbCBoYW5kbGUgdG8gTUFDCisgKiBAcmV0dXJuICBOb25lCisgKi8KKwordm9pZCBwbW1JbXBzVXBkYXRlV2FrZXVwU3RhdHMgKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisvKgorICAgIHRBTklfVTY0IFNsZWVwVGltZSA9IDA7CisKKyAgICBwTWFjLT5wbW0uSW1wc1dha2V1cFRpbWVTdGFtcCA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CisKKyAgICBTbGVlcFRpbWUgPSAocE1hYy0+cG1tLkltcHNXYWtldXBUaW1lU3RhbXAgLSBwTWFjLT5wbW0uSW1wc1NsZWVwVGltZVN0YW1wKSAvIDEwOworCisgICAgaWYgKFNsZWVwVGltZSA+IHBNYWMtPnBtbS5JbXBzTWF4U2xlZXBUaW1lKQorICAgIHsKKyAgICAgICAgcE1hYy0+cG1tLkltcHNNYXhTbGVlcFRpbWUgPSBTbGVlcFRpbWU7CisgICAgfQorCisgICAgaWYgKCghcE1hYy0+cG1tLkltcHNNaW5TbGVlcFRpbWUpIHx8IChTbGVlcFRpbWUgPCBwTWFjLT5wbW0uSW1wc01pblNsZWVwVGltZSkpCisgICAgeworICAgICAgICBwTWFjLT5wbW0uSW1wc01pblNsZWVwVGltZSA9IFNsZWVwVGltZTsKKyAgICB9CisKKyAgICBwTWFjLT5wbW0uSW1wc0F2Z1NsZWVwVGltZSA9ICggKCAocE1hYy0+cG1tLkltcHNBdmdTbGVlcFRpbWUgKiBwTWFjLT5wbW0uSW1wc0NudEF3YWtlKSArIFNsZWVwVGltZSkgLyAocE1hYy0+cG1tLkltcHNDbnRBd2FrZSArIDEpKTsKKworICAgIChwTWFjLT5wbW0uSW1wc0NudEF3YWtlKSsrOworCisgICAgcmV0dXJuOworKi8KK30KKworLy8gQ29sbGVjdHMgbnVtYmVyIG9mIHRpbWVzIGVycm9yIG9jY3VycmVkIHdoaWxlIGdvaW5nIHRvIHNsZWVwIG1vZGUKK3ZvaWQgcG1tSW1wc1VwZGF0ZVNsZWVwRXJyU3RhdHModHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclJldFN0YXR1cyByZXRTdGF0dXMpCit7CisgICAgcE1hYy0+cG1tLkltcHNTbGVlcEVyckNudCsrOworICAgIHBNYWMtPnBtbS5JbXBzTGFzdEVyciA9IHJldFN0YXR1czsKKyAgICByZXR1cm47Cit9CisKKy8vIENvbGxlY3RzIG51bWJlciBvZiB0aW1lcyBlcnJvciBvY2N1cnJlZCB3aGlsZSB3YWtpbmcgdXAgZnJvbSBzbGVlcCBtb2RlCit2b2lkIHBtbUltcHNVcGRhdGVXYWtldXBFcnJTdGF0cyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclJldFN0YXR1cyByZXRTdGF0dXMpCit7CisgICAgcE1hYy0+cG1tLkltcHNXYWtldXBFcnJDbnQrKzsKKyAgICBwTWFjLT5wbW0uSW1wc0xhc3RFcnIgPSByZXRTdGF0dXM7CisgICAgcmV0dXJuOworfQorCisKKy8vIENvbGxlY3RzIG51bWJlciBvZiB0aW1lcyB0aGUgc3lzdGVtIGhhcyByZWNlaXZlZCByZXF1ZXN0IG9yCisvLyByZXNwb25zZSBpbiBhbiBpbnZhbGlkIHN0YXRlCit2b2lkIHBtbUltcHNVcGRhdGVFcnJTdGF0ZVN0YXRzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgcE1hYy0+cG1tLkltcHNJbnZhbGlkU3RhdGVDbnQrKzsKKyAgICByZXR1cm47Cit9CisKKy8vIENvbGxlY3RzIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgd2hpbGUgaW4gSU1QUyBtb2RlCit2b2lkIHBtbUltcHNVcGRhdGVQa3REcm9wU3RhdHModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgIHBNYWMtPnBtbS5JbXBzUGt0RHJwSW5TbGVlcE1vZGUrKzsKKyAgICByZXR1cm47Cit9CisKKy8vIENvbGxlY3RzIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgd2hpbGUgaW4gQk1QUyBtb2RlCit2b2lkIHBtbUJtcHNVcGRhdGVQa3REcm9wU3RhdHModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgIHBNYWMtPnBtbS5CbXBzUGt0RHJwSW5TbGVlcE1vZGUrKzsKKyAgICByZXR1cm47Cit9CisKKy8vIENvbGxlY3RzIHN0YXRpc3RpY3MgZm9yIG51bWJlciBvZiB0aW1lcyBCTVBTIGluaXQgZmFpbGVkCit2b2lkIHBtbUJtcHNVcGRhdGVJbml0RmFpbHVyZUNudCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworCisgICAgcE1hYy0+cG1tLkJtcHNJbml0RmFpbENudCsrOworICAgIHJldHVybjsKK30KKworLy8gQ29sbGVjdHMgc3RhdGlzdGljcyBmb3IgbnVtYmVyIG9mIHRpbWVzIHNsZWVwIHJlcXVlc3QgZmFpbGVkCit2b2lkIHBtbUJtcHNVcGRhdGVTbGVlcFJlcUZhaWx1cmVDbnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgIHBNYWMtPnBtbS5CbXBzU2xlZVJlcUZhaWxDbnQrKzsKKyAgICByZXR1cm47Cit9CisKKy8vIENvbGxlY3RzIHN0YXRpc3RpY3MgZm9yIG51bWJlciBvZiB0aW1lcyBXYWtldXAgcmVxdWVzdCBmYWlsZWQKK3ZvaWQgcG1tQm1wc1VwZGF0ZVdha2V1cFJlcUZhaWx1cmVDbnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgIHBNYWMtPnBtbS5CbXBzV2FrZXVwUmVxRmFpbENudCsrOworICAgIHJldHVybjsKK30KKworLy8gQ29sbGVjdHMgc3RhdGlzdGljcyBmb3IgbnVtYmVyIG9mIHRpbWVzIHJlcXVlc3QgLyByZXNwb25zZSByZWNlaXZlZCBpbiBpbnZhbGlkIHN0YXRlCit2b2lkIHBtbUJtcHNVcGRhdGVJbnZhbGlkU3RhdGVDbnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgIHBNYWMtPnBtbS5CbXBzSW52U3RhdGVDbnQrKzsKKyAgICByZXR1cm47Cit9CisKKy8vIENvbGxlY3RzIHN0YXRpc3RpY3MgZm9yIG51bWJlciBvZiB0aW1lcyB3YWtldXAgaW5kaWNhdGlvbnMgcmVjZWl2ZWQKK3ZvaWQgcG1tQm1wc1VwZGF0ZVdha2V1cEluZENudCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHBNYWMtPnBtbS5CbXBzV2FrZXVwSW5kQ250Kys7CisgICAgcmV0dXJuOworfQorCisvLyBDb2xsZWN0cyBzdGF0aXN0aWNzIGZvciBudW1iZXIgb2YgdGltZXMgd2FrZXVwIGluZGljYXRpb25zIHJlY2VpdmVkCit2b2lkIHBtbUJtcHNVcGRhdGVIYWxSZXFGYWlsdXJlQ250KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgcE1hYy0+cG1tLkJtcHNIYWxSZXFGYWlsQ250Kys7CisgICAgcmV0dXJuOworfQorCisvLyBDb2xsZWN0cyBzdGF0aXN0aWNzIGZvciBudW1iZXIgb2YgdGltZXMgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBIREQgaW4KKy8vIGludmFsaWQgZGV2aWNlIHJvbGUKK3ZvaWQgcG1tQm1wc1VwZGF0ZVJlcUluSW52YWxpZFJvbGVDbnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBwTWFjLT5wbW0uQm1wc1JlcUluSW52YWxpZFJvbGVDbnQrKzsKKyAgICByZXR1cm47Cit9CisKKyNpZiAwCisvLyBVcGRhdGUgdGhlIHNsZWVwIHN0YXRpc3RpY3MKK3ZvaWQgcG1tVXBkYXRlRHJvcHBlZFBrdFN0YXRzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgc3dpdGNoIChwTWFjLT5wbW0uZ1BtbVN0YXRlKQorICAgIHsKKyAgICBjYXNlIGVQTU1fU1RBVEVfQk1QU19TTEVFUDoKKyAgICAgICAgcG1tQm1wc1VwZGF0ZVBrdERyb3BTdGF0cyhwTWFjKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVQTU1fU1RBVEVfSU1QU19TTEVFUDoKKyAgICAgICAgcG1tSW1wc1VwZGF0ZVBrdERyb3BTdGF0cyhwTWFjKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuOworCit9CisjZW5kaWYKKworLy8gUmVzZXRzIFBNTSBzdGF0ZSBlUE1NX1NUQVRFX1JFQURZCit2b2lkIHBtbVJlc2V0UG1tU3RhdGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBwTWFjLT5wbW0uZ1BtbVN0YXRlID0gZVBNTV9TVEFURV9SRUFEWTsKKyAgICAKKyAgICBwTWFjLT5wbW0uaW5NaXNzZWRCZWFjb25TY2VuYXJpbyA9IEZBTFNFOworICAgIHJldHVybjsKK30KKworLyogU2VuZHMgQmFja2dyb3VuZCBzY2FuIG1lc3NhZ2UgYmFjayB0byBMaW0gKi8KK3ZvaWQgcG1tU2VuZE1lc3NhZ2VUb0xpbSh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG1zZ0lkKQoreworICAgIHRTaXJNc2dRIGxpbU1zZzsKKyAgICB0QU5JX1UzMiBzdGF0dXNDb2RlOworCisgICAgbGltTXNnLnR5cGUgPSAodEFOSV9VMTYpIG1zZ0lkOworICAgIGxpbU1zZy5ib2R5cHRyID0gTlVMTDsKKyAgICBsaW1Nc2cuYm9keXZhbCA9IDA7CisKKyAgICBpZiAoKHN0YXR1c0NvZGUgPSBsaW1Qb3N0TXNnQXBpKHBNYWMsICZsaW1Nc2cpKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAgIFBFTE9HVyhwbW1Mb2cocE1hYywgTE9HVywKKyAgICAgICAgICAgIEZMKCJwb3N0aW5nIG1lc3NhZ2UgJVggdG8gTElNIGZhaWxlZCwgcmVhc29uPSVkXG4iKSwKKyAgICAgICAgICAgIGxpbU1zZy50eXBlLCBzdGF0dXNDb2RlKTspCisgICAgfQorfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKK3ZvaWQgcG1tRmlsdGVyTWF0Y2hDb3VudFJlc3BvbnNlSGFuZGxlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKQoreworICAgIHRwU2lyUmN2Rmx0UGt0TWF0Y2hSc3AgIHBSY3ZGbHRQa3RNYXRjaENudFJzcDsKKyAgICBlSGFsU3RhdHVzICAgICAgICAgICAgICByc3BTdGF0dXM7CisgICAgdFNpclJlc3VsdENvZGVzICAgICAgICAgc21lUnNwQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisKKyAgICAvKiB3ZSBuZWVkIHRvIHByb2Nlc3MgYWxsIHRoZSBkZWZlcnJlZCBtZXNzYWdlcyBlbnF1ZXVlZAorICAgICAqIHNpbmNlIHRoZSBpbml0aWF0aW5nIHRoZSBXREFfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JFUS4KKyAgICAgKi8KKyAgICBTRVRfTElNX1BST0NFU1NfREVGRF9NRVNHUyhwTWFjLCB0cnVlKTsKKworICAgIHBSY3ZGbHRQa3RNYXRjaENudFJzcCA9ICh0cFNpclJjdkZsdFBrdE1hdGNoUnNwKShsaW1Nc2ctPmJvZHlwdHIpOworICAgIGlmIChOVUxMID09IHBSY3ZGbHRQa3RNYXRjaENudFJzcCkKKyAgICB7CisgICAgICAgIHBtbUxvZyhwTWFjLCBMT0dFLCBGTCgiUmVjZWl2ZWQgIgorICAgICAgICAgICAgIldEQV9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUlNQIHdpdGggTlVMTCBtc2cgIikpOworICAgICAgICBzbWVSc3BDb2RlID0gZVNJUl9TTUVfUENfRklMVEVSX01BVENIX0NPVU5UX1JFUV9GQUlMRUQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJzcFN0YXR1cyA9IHBSY3ZGbHRQa3RNYXRjaENudFJzcC0+c3RhdHVzOworICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSByc3BTdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBtbUxvZyhwTWFjLCBMT0dFLCBGTCgiUmN2IHN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBIQUwgdG8gZ2V0ICIKKyAgICAgICAgICAgICAgICAiUGFja2V0IENvYWxlc2NpbmcgRmlsdGVyIE1hdGNoIENvdW50XG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwbW1Mb2cocE1hYywgTE9HRSwgRkwoIkhBTCBmYWlsZWQgdG8gZ2V0IFBhY2tldCBDb2FsZXNjaW5nICIKKyAgICAgICAgICAgICAgICAiRmlsdGVyIE1hdGNoIENvdW50LCBpbmZvcm1pbmcgU01FXG4iKSk7CisgICAgICAgICAgICBzbWVSc3BDb2RlID0gZVNJUl9TTUVfUENfRklMVEVSX01BVENIX0NPVU5UX1JFUV9GQUlMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfUE1DX1BBQ0tFVF9DT0FMRVNDSU5HX0ZJTFRFUl9NQVRDSF9DT1VOVF9SU1AsIAorICAgICAgICAgICAgICAgICAgc21lUnNwQ29kZSwgMCwgMCk7CisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKK3ZvaWQgcG1tR1RLT2ZmbG9hZEdldEluZm9SZXNwb25zZUhhbmRsZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZykKK3sKKyAgICB0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zICBwR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXM7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgcnNwU3RhdHVzOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICAgICAgICAgICAgICAgIHNtZVJzcENvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworCisgICAgLyogd2UgbmVlZCB0byBwcm9jZXNzIGFsbCB0aGUgZGVmZXJyZWQgbWVzc2FnZXMgZW5xdWV1ZWQKKyAgICAgKiBzaW5jZSB0aGUgaW5pdGlhdGluZyB0aGUgV0RBX0dUS19PRkZMT0FEX0dFVElORk9fUkVRLgorICAgICAqLworICAgIFNFVF9MSU1fUFJPQ0VTU19ERUZEX01FU0dTKHBNYWMsIHRydWUpOworCisgICAgcEd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zID0gKHRwU2lyR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXMpKGxpbU1zZy0+Ym9keXB0cik7CisgICAgaWYgKE5VTEwgPT0gcEd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zKQorICAgIHsKKyAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsIEZMKCJSZWNlaXZlZCBXREFfR1RLX09GRkxPQURfR0VUSU5GT19SU1Agd2l0aCBOVUxMIG1zZyAiKSk7CisgICAgICAgIHNtZVJzcENvZGUgPSBlU0lSX1NNRV9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JFUV9GQUlMRUQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJzcFN0YXR1cyA9IHBHdGtPZmZsb2FkR2V0SW5mb1JzcFBhcmFtcy0+dWxTdGF0dXM7CisgICAgICAgIGlmKHJzcFN0YXR1cyA9PSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBwbW1Mb2cocE1hYywgTE9HVywgRkwoIlJjdiBzdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gSEFMIHRvIGdldCBHVEsgT2ZmbG9hZCBJbmZvcm1hdGlvblxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcG1tTG9nKHBNYWMsIExPR0UsIEZMKCJIQUwgZmFpbGVkIHRvIGdldCBHVEsgT2ZmbG9hZCBJbmZvcm1hdGlvbiwgaW5mb3JtaW5nIFNNRVxuIikpOworICAgICAgICAgICAgc21lUnNwQ29kZSA9IGVTSVJfU01FX0dUS19PRkZMT0FEX0dFVElORk9fUkVRX0ZBSUxFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxpbVNlbmRTbWVSc3AocE1hYywgZVdOSV9QTUNfR1RLX09GRkxPQURfR0VUSU5GT19SU1AsIHNtZVJzcENvZGUsIDAsIDApOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9wbW0vcG1tRGVidWcuYyBiL0NPUkUvTUFDL3NyYy9wZS9wbW0vcG1tRGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY5ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL3BtbS9wbW1EZWJ1Zy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgcG1tRGVidWcuYworICAKKyAgXGJyaWVmIGltcGxlbWVudGF0aW9uIGZvciBsb2cgRGVidWcgcmVsYXRlZCBBUElzCisKKyAgXGF1dGhvciBTdW5pdCBCaGF0aWEKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAicG1tRGVidWcuaCIKKwordm9pZCBwbW1Mb2codHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHJpbmcsLi4uKSAKK3sKKyNpZmRlZiBXTEFOX0RFQlVHCisgICAgLy8gVmVyaWZ5IGFnYWluc3QgY3VycmVudCBsb2cgbGV2ZWwKKyAgICBpZiAoIGxvZ2xldmVsID4gcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW0xPR19JTkRFWF9GT1JfTU9EVUxFKCBTSVJfUE1NX01PRFVMRV9JRCApXSApCisgICAgICAgIHJldHVybjsKKyAgICBlbHNlCisgICAgeworICAgICAgICB2YV9saXN0IG1hcmtlcjsKKworICAgICAgICB2YV9zdGFydCggbWFya2VyLCBwU3RyaW5nICk7ICAgICAvKiBJbml0aWFsaXplIHZhcmlhYmxlIGFyZ3VtZW50cy4gKi8KKworICAgICAgICBsb2dEZWJ1ZyhwTWFjLCBTSVJfUE1NX01PRFVMRV9JRCwgbG9nbGV2ZWwsIHBTdHJpbmcsIG1hcmtlcik7CisgICAgICAgIAorICAgICAgICB2YV9lbmQoIG1hcmtlciApOyAgICAgICAgICAgICAgLyogUmVzZXQgdmFyaWFibGUgYXJndW1lbnRzLiAgICAgICovCisgICAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvcG1tL3BtbURlYnVnLmggYi9DT1JFL01BQy9zcmMvcGUvcG1tL3BtbURlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5YmU2YQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9wbW0vcG1tRGVidWcuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqLworCisjaWZuZGVmIF9fUE1NX0RFQlVHX0hfXworI2RlZmluZSBfX1BNTV9ERUJVR19IX18KKworI2luY2x1ZGUgInV0aWxzQXBpLmgiCisjaW5jbHVkZSAic2lyRGVidWcuaCIKKworI2RlZmluZSBVTF9ISSggZmllbGQgKSAoICooICggKFVMT05HICopKCYoZmllbGQpKSApICsgMSApICkKKyNkZWZpbmUgVUxfTE8oIGZpZWxkICkgKCAqKCAoIChVTE9ORyAqKSgmKGZpZWxkKSkgKSArIDAgKSApCisKKwordm9pZCBwbW1Mb2codHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHJpbmcsLi4uKSA7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvcnJtL3JybUFwaS5jIGIvQ09SRS9NQUMvc3JjL3BlL3JybS9ycm1BcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzYzZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL3JybS9ycm1BcGkuYwpAQCAtMCwwICsxLDEyNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgcnJtQXBpLmMKKyAgCisgIFxicmllZiBpbXBsZW1lbnRhdGlvbiBmb3IgUEUgUlJNIEFQSXMKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInBhbFR5cGVzLmgiCisjaW5jbHVkZSAid25pQXBpLmgiCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbERhdGFTdHJ1Y3QuaCIKKyNlbmRpZgorI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorI2luY2x1ZGUgInduaUNmZ0FwLmgiCisjZWxzZQorI2luY2x1ZGUgInduaUNmZ1N0YS5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltVHlwZXMuaCIKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbVNlbmRTbWVSc3BNZXNzYWdlcy5oIgorI2luY2x1ZGUgInBhcnNlckFwaS5oIgorI2luY2x1ZGUgImxpbVNlbmRNZXNzYWdlcy5oIgorI2luY2x1ZGUgInJybUdsb2JhbC5oIgorI2luY2x1ZGUgInJybUFwaS5oIgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHJybUNhY2hlTWdtdFR4UG93ZXIKKyAqKgorICogRlVOQ1RJT046ICBTdG9yZSBUeCBwb3dlciBmb3IgbWFuYWdlbWVudCBmcmFtZXMuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcFNlc3Npb25FbnRyeSBzZXNzaW9uIGVudHJ5LgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK3JybUNhY2hlTWdtdFR4UG93ZXIgKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0UG93ZXJkQm0gdHhQb3dlciwgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSApCit7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIkNhY2hlIE1nbXQgVHggUG93ZXIgPSAlZFxuIiwgdHhQb3dlciApOykgCisjZW5kaWYKKyAgIGlmKCBwU2Vzc2lvbkVudHJ5ID09IE5VTEwgKQorICAgICAgIHBNYWMtPnJybS5ycm1QRUNvbnRleHQudHhNZ210UG93ZXIgPSB0eFBvd2VyOworICAgZWxzZQorICAgICAgIHBTZXNzaW9uRW50cnktPnR4TWdtdFBvd2VyID0gdHhQb3dlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcnJtR2V0TWdtdFR4UG93ZXIKKyAqCisgKiBGVU5DVElPTjogIEdldCB0aGUgVHggcG93ZXIgZm9yIG1hbmFnZW1lbnQgZnJhbWVzLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBTZXNzaW9uRW50cnkgc2Vzc2lvbiBlbnRyeS4KKyAqIEByZXR1cm4gdHhQb3dlcgorICovCit0UG93ZXJkQm0KK3JybUdldE1nbXRUeFBvd2VyICggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSApCit7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIlJybUdldE1nbXRUeFBvd2VyIGNhbGxlZFxuIiApOykgCisjZW5kaWYKKyAgIGlmKCBwU2Vzc2lvbkVudHJ5ID09IE5VTEwgKQorICAgICAgcmV0dXJuIHBNYWMtPnJybS5ycm1QRUNvbnRleHQudHhNZ210UG93ZXI7CisgICAKKyAgIHJldHVybiBwU2Vzc2lvbkVudHJ5LT50eE1nbXRQb3dlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcnJtU2VuZFNldE1heFR4UG93ZXJSZXEKKyAqCisgKiBGVU5DVElPTjogIFNlbmQgV0RBX1NFVF9NQVhfVFhfUE9XRVJfUkVRIG1lc3NhZ2UgdG8gY2hhbmdlIHRoZSBtYXggdHggcG93ZXIuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gdHhQb3dlciB0eFBvd2VyIHRvIGJlIHNldC4KKyAqIEBwYXJhbSBwU2Vzc2lvbkVudHJ5IHNlc3Npb24gZW50cnkuCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordFNpclJldFN0YXR1cworcnJtU2VuZFNldE1heFR4UG93ZXJSZXEgKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0UG93ZXJkQm0gdHhQb3dlciwgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSApCit7CisgICB0cE1heFR4UG93ZXJQYXJhbXMgcE1heFR4UGFyYW1zOworICAgdFNpclJldFN0YXR1cyAgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKyAgIHRTaXJNc2dRICAgICAgIG1zZ1E7CisKKyAgIGlmKCBwU2Vzc2lvbkVudHJ5ID09IE5VTEwgKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiIEluYXZhbGlkIHBhcmFtZXRlcnNcbiIpKTspCisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAodm9pZCAqKikgJnBNYXhUeFBhcmFtcywgc2l6ZW9mKHRNYXhUeFBvd2VyUGFyYW1zKSApICkgCisgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsIEZMKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwTWF4VHhQYXJhbXMgXG4iKSApOworICAgICAgcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKworICAgfQorI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCIgQWxsb2NhdGVkIG1lbW9yeSBmb3IgcE1heFR4UGFyYW1zLi4ud2lsbCBiZSBmcmVlZCBpbiBvdGhlciBtb2R1bGVcbiIpICk7KQorI2VuZGlmCisgICBwTWF4VHhQYXJhbXMtPnBvd2VyID0gdHhQb3dlcjsKKyAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBNYXhUeFBhcmFtcy0+YnNzSWQsIHBTZXNzaW9uRW50cnktPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpICk7CisgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTWF4VHhQYXJhbXMtPnNlbGZTdGFNYWNBZGRyLCBwU2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworCisKKyAgIG1zZ1EudHlwZSA9IFdEQV9TRVRfTUFYX1RYX1BPV0VSX1JFUTsKKyAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgbXNnUS5ib2R5cHRyID0gcE1heFR4UGFyYW1zOworICAgbXNnUS5ib2R5dmFsID0gMDsKKworICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCggIlNlbmRpbmcgV0RBX1NFVF9NQVhfVFhfUE9XRVJfUkVRIHRvIEhBTCIpKTspCisKKyAgICAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1zZ1EudHlwZSkpOworICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApKSkKKyAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwgRkwoIlBvc3RpbmcgV0RBX1NFVF9NQVhfVFhfUE9XRVJfUkVRIHRvIEhBTCBmYWlsZWQsIHJlYXNvbj0lWCIpLCByZXRDb2RlICk7CisgICAgICBpZiAoTlVMTCAhPSBwTWF4VHhQYXJhbXMpCisgICAgICB7CisgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSBwTWF4VHhQYXJhbXMgKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXRDb2RlOworICAgfQorICAgcmV0dXJuIHJldENvZGU7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcnJtU2V0TWF4VHhQb3dlclJzcAorICoKKyAqIEZVTkNUSU9OOiAgUHJvY2VzcyBXREFfU0VUX01BWF9UWF9QT1dFUl9SU1AgbWVzc2FnZS4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSB0eFBvd2VyIHR4UG93ZXIgdG8gYmUgc2V0LgorICogQHBhcmFtIHBTZXNzaW9uRW50cnkgc2Vzc2lvbiBlbnRyeS4KKyAqIEByZXR1cm4gTm9uZQorICovCit0U2lyUmV0U3RhdHVzCitycm1TZXRNYXhUeFBvd2VyUnNwICggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIGxpbU1zZ1EgKQoreworICAgdFNpclJldFN0YXR1cyAgcmV0Q29kZSA9IGVTSVJfU1VDQ0VTUzsKKyAgIHRwTWF4VHhQb3dlclBhcmFtcyBwTWF4VHhQYXJhbXMgPSAodHBNYXhUeFBvd2VyUGFyYW1zKSBsaW1Nc2dRLT5ib2R5cHRyOworICAgdHBQRVNlc3Npb24gICAgIHBTZXNzaW9uRW50cnk7CisgICB0QU5JX1U4IHNlc3Npb25JZDsKKworICAgaWYoKHBTZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLCBwTWF4VHhQYXJhbXMtPmJzc0lkLCAmc2Vzc2lvbklkKSk9PU5VTEwpCisgICB7CisgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsIEZMKCJVbmFibGUgdG8gZmluZCBzZXNzaW9uOlxuIikgKTspCisgICAgICByZXRDb2RlID0gZVNJUl9GQUlMVVJFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcnJtQ2FjaGVNZ210VHhQb3dlciAoIHBNYWMsIHBNYXhUeFBhcmFtcy0+cG93ZXIsIHBTZXNzaW9uRW50cnkgKTsKKyAgIH0KKworICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopbGltTXNnUS0+Ym9keXB0cik7CisgICBsaW1Nc2dRLT5ib2R5cHRyID0gTlVMTDsKKyAgIHJldHVybiByZXRDb2RlOworfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcnJtUHJvY2Vzc0xpbmtNZWFzdXJlbWVudFJlcXVlc3QKKyAqCisgKiBGVU5DVElPTjogIFByb2Nlc3NlcyB0aGUgTGluayBtZWFzdXJlbWVudCByZXF1ZXN0IGFuZCBzZW5kIHRoZSByZXBvcnQuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcEJkIHBvaW50ZXIgdG8gQkQgdG8gZXh0cmFjdCBSU1NJIGFuZCBTTlIKKyAqIEBwYXJhbSBwTGlua1JlcSBwb2ludGVyIHRvIHRoZSBMaW5rIHJlcXVlc3QgZnJhbWUgc3RydWN0dXJlLgorICogQHBhcmFtIHBTZXNzaW9uRW50cnkgc2Vzc2lvbiBlbnRyeS4KKyAqIEByZXR1cm4gTm9uZQorICovCit0U2lyUmV0U3RhdHVzCitycm1Qcm9jZXNzTGlua01lYXN1cmVtZW50UmVxdWVzdCggdHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFJ4UGFja2V0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCAqcExpbmtSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSApCit7CisgICB0U2lyTWFjTGlua1JlcG9ydCBMaW5rUmVwb3J0OworICAgdHBTaXJNYWNNZ210SGRyICAgcEhkcjsKKyAgIHZfUzdfdCAgICAgICAgICAgIGN1cnJlbnRSU1NJID0gMDsKKworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICJSZWNlaXZlZCBMaW5rIG1lYXN1cmVtZW50IHJlcXVlc3RcbiIpOykKKyNlbmRpZgorICAgaWYoIHBSeFBhY2tldEluZm8gPT0gTlVMTCB8fCBwTGlua1JlcSA9PSBOVUxMIHx8IHBTZXNzaW9uRW50cnkgPT0gTlVMTCApCisgICB7CisgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiJXM6JWQ6IEludmFsaWQgcGFyYW1ldGVycyAtIElnbm9yaW5nIHRoZSByZXF1ZXN0XG4iKTspCisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorICAgcEhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUiggcFJ4UGFja2V0SW5mbyApOworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIGlmKCBwU2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyICE9ICh0UG93ZXJkQm0pIHBMaW5rUmVxLT5NYXhUeFBvd2VyLm1heFR4UG93ZXIgKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIiBtYXhUeCBwb3dlciBpbiBsaW5rIHJlcXVlc3QgaXMgbm90IHNhbWUgYXMgbG9jYWwuLi5Mb2NhbCA9ICVkIExpbmtSZXEgPSAlZFxuIiksIAorICAgICAgICAgICBwU2Vzc2lvbkVudHJ5LT5tYXhUeFBvd2VyLCBwTGlua1JlcS0+TWF4VHhQb3dlci5tYXhUeFBvd2VyICk7KQorICAgfQorI2VuZGlmCisKKyAgIExpbmtSZXBvcnQuZGlhbG9nVG9rZW4gPSBwTGlua1JlcS0+RGlhbG9nVG9rZW4udG9rZW47CisgICBMaW5rUmVwb3J0LnR4UG93ZXIgPSBwU2Vzc2lvbkVudHJ5LT50eE1nbXRQb3dlcjsKKyAgIExpbmtSZXBvcnQucnhBbnRlbm5hID0gMDsKKyAgIExpbmtSZXBvcnQudHhBbnRlbm5hID0gMDsKKyAgIGN1cnJlbnRSU1NJID0gV0RBX0dFVF9SWF9SU1NJX0RCKHBSeFBhY2tldEluZm8pOworCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIlJlY2VpdmVkIExpbmsgcmVwb3J0IGZyYW1lIHdpdGggJWRcbiIsIGN1cnJlbnRSU1NJKTspCisjZW5kaWYKKworICAgLy8gMjAwOCAxMWsgc3BlYyByZWZlcmVuY2U6IDE4LjQuOC41IFJDUEkgTWVhc3VyZW1lbnQKKyAgIGlmICgoY3VycmVudFJTU0kpIDw9IFJDUElfTE9XX1JTU0lfVkFMVUUpCisgICAgICAgTGlua1JlcG9ydC5yY3BpID0gMDsgCisgICBlbHNlIGlmICgoY3VycmVudFJTU0kgPiBSQ1BJX0xPV19SU1NJX1ZBTFVFKSAmJiAoY3VycmVudFJTU0kgPD0gMCkpCisgICAgICAgTGlua1JlcG9ydC5yY3BpID0gQ0FMQ1VMQVRFX1JDUEkoY3VycmVudFJTU0kpOworICAgZWxzZSAKKyAgICAgICBMaW5rUmVwb3J0LnJjcGkgPSBSQ1BJX01BWF9WQUxVRTsgCisKKyAgIExpbmtSZXBvcnQucnNuaSA9IFdEQV9HRVRfUlhfU05SKHBSeFBhY2tldEluZm8pOyAKKyAgIAorI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICJTZW5kaW5nIExpbmsgcmVwb3J0IGZyYW1lXG4iKTspCisjZW5kaWYKKyAgIHJldHVybiBsaW1TZW5kTGlua1JlcG9ydEFjdGlvbkZyYW1lKCBwTWFjLCAmTGlua1JlcG9ydCwgcEhkci0+c2EsIHBTZXNzaW9uRW50cnkgKTsgCisKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBycm1Qcm9jZXNzTmVpZ2hib3JSZXBvcnRSZXNwb25zZQorICoKKyAqIEZVTkNUSU9OOiAgUHJvY2Vzc2VzIHRoZSBOZWlnaGJvciBSZXBvcnQgcmVzcG9uc2UgZnJvbSB0aGUgcGVlciBBUC4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwTmVpZ2hib3JSZXAgcG9pbnRlciB0byB0aGUgTmVpZ2hib3IgcmVwb3J0IGZyYW1lIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBwU2Vzc2lvbkVudHJ5IHNlc3Npb24gZW50cnkuCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordFNpclJldFN0YXR1cworcnJtUHJvY2Vzc05laWdoYm9yUmVwb3J0UmVzcG9uc2UoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2UgKnBOZWlnaGJvclJlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5ICkKK3sKKyAgIHRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9GQUlMVVJFOworICAgdHBTaXJOZWlnaGJvclJlcG9ydEluZCBwU21lTmVpZ2hib3JScHQgPSBOVUxMOworICAgdEFOSV9VMTYgbGVuZ3RoOworICAgdEFOSV9VOCBpOworICAgdFNpck1zZ1EgICAgICAgICAgICAgICAgICBtbWhNc2c7CisKKyAgIGlmKCBwTmVpZ2hib3JSZXAgPT0gTlVMTCB8fCBwU2Vzc2lvbkVudHJ5ID09IE5VTEwgKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIiBJbnZhbGlkIHBhcmFtZXRlcnNcbiIpICk7KQorICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJOZWlnaGJvciByZXBvcnQgcmVzcG9uc2UgcmVjZWl2ZWQgXG4iKSApOykKKyNlbmRpZgorCisgICAvLyBEaWFsb2cgdG9rZW4KKyAgIGlmKCBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LkRpYWxvZ1Rva2VuICE9IHBOZWlnaGJvclJlcC0+RGlhbG9nVG9rZW4udG9rZW4gKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIkRpYWxvZyB0b2tlbiBtaXNtYXRjaCBpbiB0aGUgcmVjZWl2ZWQgTmVpZ2hib3IgcmVwb3J0XG4iKTspCisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorICAgaWYoIHBOZWlnaGJvclJlcC0+bnVtX05laWdoYm9yUmVwb3J0ID09IDAgKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIk5vIG5laWdoYm9yIHJlcG9ydCBpbiB0aGUgZnJhbWUuLi5Ecm9wcGluZyBpdFxuIik7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKyAgIGxlbmd0aCA9IChzaXplb2YoIHRTaXJOZWlnaGJvclJlcG9ydEluZCApKSArCisgICAgICAgICAgICAoc2l6ZW9mKCB0U2lyTmVpZ2hib3JCc3NEZXNjcmlwdGlvbiApICogKHBOZWlnaGJvclJlcC0+bnVtX05laWdoYm9yUmVwb3J0IC0gMSkgKSA7IAorICAgICAgICAgICAgCisgICAvL1ByZXBhcmUgdGhlIHJlcXVlc3QgdG8gc2VuZCB0byBTTUUuCisgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICh2b2lkICoqKSAmcFNtZU5laWdoYm9yUnB0LCBsZW5ndGggKSApCisgICB7CisgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikgKTspCisgICAgICByZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworCisgICB9CisgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwU21lTmVpZ2hib3JScHQsIGxlbmd0aCApOyAKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiIEFsbG9jYXRlZCBtZW1vcnkgZm9yIHBTbWVOZWlnaGJvclJwdC4uLndpbGwgYmUgZnJlZWQgYnkgb3RoZXIgbW9kdWxlXG4iKSApOykKKyNlbmRpZgorCisgICBmb3IoIGkgPSAwIDsgaSA8IHBOZWlnaGJvclJlcC0+bnVtX05laWdoYm9yUmVwb3J0IDsgaSsrICkKKyAgIHsKKyAgICAgIHBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0ubGVuZ3RoID0gc2l6ZW9mKCB0U2lyTmVpZ2hib3JCc3NEZXNjcmlwdGlvbiApOyAvKisgYW55IG9wdGlvbmFsIGllcyAqLworICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFNtZU5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NJZCwKKyAgICAgICAgICAgIHBOZWlnaGJvclJlcC0+TmVpZ2hib3JSZXBvcnRbaV0uYnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyAgICAgIHBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0uYnNzaWRJbmZvLnJybUluZm8uZkFwUHJlYXV0aFJlYWNoYWJsZSA9IHBOZWlnaGJvclJlcC0+TmVpZ2hib3JSZXBvcnRbaV0uQVBSZWFjaGFiaWxpdHk7CisgICAgICBwU21lTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc2lkSW5mby5ycm1JbmZvLmZTYW1lU2VjdXJpdHlNb2RlID0gcE5laWdoYm9yUmVwLT5OZWlnaGJvclJlcG9ydFtpXS5TZWN1cml0eTsKKyAgICAgIHBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0uYnNzaWRJbmZvLnJybUluZm8uZlNhbWVBdXRoZW50aWNhdG9yID0gcE5laWdoYm9yUmVwLT5OZWlnaGJvclJlcG9ydFtpXS5LZXlTY29wZTsKKyAgICAgIHBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0uYnNzaWRJbmZvLnJybUluZm8uZkNhcFNwZWN0cnVtTWVhc3VyZW1lbnQgPSBwTmVpZ2hib3JSZXAtPk5laWdoYm9yUmVwb3J0W2ldLlNwZWNNZ210Q2FwOworICAgICAgcFNtZU5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NpZEluZm8ucnJtSW5mby5mQ2FwUW9zID0gcE5laWdoYm9yUmVwLT5OZWlnaGJvclJlcG9ydFtpXS5Rb3NDYXA7CisgICAgICBwU21lTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc2lkSW5mby5ycm1JbmZvLmZDYXBBcHNkID0gcE5laWdoYm9yUmVwLT5OZWlnaGJvclJlcG9ydFtpXS5hcHNkOworICAgICAgcFNtZU5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NpZEluZm8ucnJtSW5mby5mQ2FwUmFkaW9NZWFzdXJlbWVudCA9IHBOZWlnaGJvclJlcC0+TmVpZ2hib3JSZXBvcnRbaV0ucnJtOworICAgICAgcFNtZU5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NpZEluZm8ucnJtSW5mby5mQ2FwRGVsYXllZEJsb2NrQWNrID0gcE5laWdoYm9yUmVwLT5OZWlnaGJvclJlcG9ydFtpXS5EZWxheWVkQkE7CisgICAgICBwU21lTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc2lkSW5mby5ycm1JbmZvLmZDYXBJbW1lZGlhdGVCbG9ja0FjayA9IHBOZWlnaGJvclJlcC0+TmVpZ2hib3JSZXBvcnRbaV0uSW1tQkE7CisgICAgICBwU21lTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc2lkSW5mby5ycm1JbmZvLmZNb2JpbGl0eURvbWFpbiA9IHBOZWlnaGJvclJlcC0+TmVpZ2hib3JSZXBvcnRbaV0uTW9iaWxpdHlEb21haW47CisKKyAgICAgIHBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0ucmVnQ2xhc3MgPSBwTmVpZ2hib3JSZXAtPk5laWdoYm9yUmVwb3J0W2ldLnJlZ3VsYXRvcnlDbGFzczsKKyAgICAgIHBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0uY2hhbm5lbCA9IHBOZWlnaGJvclJlcC0+TmVpZ2hib3JSZXBvcnRbaV0uY2hhbm5lbDsKKyAgICAgIHBTbWVOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0ucGh5VHlwZSA9IHBOZWlnaGJvclJlcC0+TmVpZ2hib3JSZXBvcnRbaV0uUGh5VHlwZTsKKyAgIH0KKworICAgcFNtZU5laWdoYm9yUnB0LT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX05FSUdIQk9SX1JFUE9SVF9JTkQ7CisgICBwU21lTmVpZ2hib3JScHQtPmxlbmd0aCA9IGxlbmd0aDsKKyAgIHBTbWVOZWlnaGJvclJwdC0+bnVtTmVpZ2hib3JSZXBvcnRzID0gcE5laWdoYm9yUmVwLT5udW1fTmVpZ2hib3JSZXBvcnQ7CisgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU21lTmVpZ2hib3JScHQtPmJzc0lkLCBwU2Vzc2lvbkVudHJ5LT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworCisgICAvL1NlbmQgcmVxdWVzdCB0byBTTUUuCisgICBtbWhNc2cudHlwZSAgICA9IHBTbWVOZWlnaGJvclJwdC0+bWVzc2FnZVR5cGU7CisgICBtbWhNc2cuYm9keXB0ciA9IHBTbWVOZWlnaGJvclJwdDsKKyAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICBzdGF0dXMgPSBsaW1TeXNQcm9jZXNzTW1oTXNnQXBpKHBNYWMsICZtbWhNc2csIGVQUk9UKTsKKworICAgcmV0dXJuIHN0YXR1czsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBycm1Qcm9jZXNzTmVpZ2hib3JSZXBvcnRSZXEKKyAqCisgKiBGVU5DVElPTjogIAorICoKKyAqIExPR0lDOiBDcmVhdGUgYSBOZWlnaGJvciByZXBvcnQgcmVxdWVzdCBhbmQgc2VuZCBpdCB0byBwZWVyLgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBOZWlnaGJvclJlcSBOZWlnaGJvciByZXBvcnQgcmVxdWVzdCBwYXJhbXMgLgorICogQHJldHVybiBOb25lCisgKi8KK3RTaXJSZXRTdGF0dXMKK3JybVByb2Nlc3NOZWlnaGJvclJlcG9ydFJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpck5laWdoYm9yUmVwb3J0UmVxSW5kIHBOZWlnaGJvclJlcSApCit7CisgICB0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgIHRTaXJNYWNOZWlnaGJvclJlcG9ydFJlcSBOZWlnaGJvclJlcG9ydFJlcTsKKyAgIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkgOworICAgdEFOSV9VOCBzZXNzaW9uSWQ7CisKKyAgIGlmKCBwTmVpZ2hib3JSZXEgPT0gTlVMTCApCisgICB7CisgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiTmVpZ2hib3JSZXEgaXMgTlVMTFxuIiApOykKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICB9CisgICBpZiAoKHBTZXNzaW9uRW50cnkgPSBwZUZpbmRTZXNzaW9uQnlCc3NpZChwTWFjLHBOZWlnaGJvclJlcS0+YnNzSWQsJnNlc3Npb25JZCkpPT1OVUxMKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZFxuIikpOykKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICB9CisKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiTmVpZ2hib3IgUmVxdWVzdCByZWNlaXZlZCBcbiIpICk7KQorICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIlNTSUQgcHJlc2VudCA9ICVkIFxuIiwgcE5laWdoYm9yUmVxLT5ub1NTSUQgKTspCisjZW5kaWYKKworICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgJk5laWdoYm9yUmVwb3J0UmVxLCBzaXplb2YoIHRTaXJNYWNOZWlnaGJvclJlcG9ydFJlcSApICk7CisKKyAgIE5laWdoYm9yUmVwb3J0UmVxLmRpYWxvZ1Rva2VuID0gKytwTWFjLT5ycm0ucnJtUEVDb250ZXh0LkRpYWxvZ1Rva2VuOyAKKyAgIE5laWdoYm9yUmVwb3J0UmVxLnNzaWRfcHJlc2VudCA9ICFwTmVpZ2hib3JSZXEtPm5vU1NJRDsgCisgICBpZiggTmVpZ2hib3JSZXBvcnRSZXEuc3NpZF9wcmVzZW50ICkKKyAgIHsKKyAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICZOZWlnaGJvclJlcG9ydFJlcS5zc2lkLCAmcE5laWdoYm9yUmVxLT51Y1NTSUQsIHNpemVvZih0U2lyTWFjU1NpZCkgKTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICBQRUxPR0Uoc2lyRHVtcEJ1ZiggcE1hYywgU0lSX0xJTV9NT0RVTEVfSUQsIExPR0UsICh0QU5JX1U4KikgTmVpZ2hib3JSZXBvcnRSZXEuc3NpZC5zc0lkLCBOZWlnaGJvclJlcG9ydFJlcS5zc2lkLmxlbmd0aCApOykKKyNlbmRpZgorICAgfQorCisgICBzdGF0dXMgPSBsaW1TZW5kTmVpZ2hib3JSZXBvcnRSZXF1ZXN0RnJhbWUoIHBNYWMsICZOZWlnaGJvclJlcG9ydFJlcSwgcE5laWdoYm9yUmVxLT5ic3NJZCwgcFNlc3Npb25FbnRyeSApOworCisgICByZXR1cm4gc3RhdHVzOworfQorCisjZGVmaW5lIEFCUyh4KSAgICAgICgoeCA8IDApID8gLXggOiB4KQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcnJtUHJvY2Vzc0JlYWNvblJlcG9ydFJlcQorICoKKyAqIEZVTkNUSU9OOiAgUHJvY2Vzc2VzIHRoZSBCZWFjb24gcmVwb3J0IHJlcXVlc3QgZnJvbSB0aGUgcGVlciBBUC4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwQ3VycmVudFJlcSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IFJlcSBjb210ZXh0LgorICogQHBhcmFtIHBCZWFjb25SZXEgcG9pbnRlciB0byB0aGUgYmVhY29uIHJlcG9ydCByZXF1ZXN0IElFIGZyb20gdGhlIHBlZXIuCisgKiBAcGFyYW0gcFNlc3Npb25FbnRyeSBzZXNzaW9uIGVudHJ5LgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB0UnJtUmV0U3RhdHVzCitycm1Qcm9jZXNzQmVhY29uUmVwb3J0UmVxKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUlJNUmVxIHBDdXJyZW50UmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0ICpwQmVhY29uUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSApCit7CisgICB0U2lyTXNnUSAgICAgICAgICAgICAgICAgIG1taE1zZzsKKyAgIHRwU2lyQmVhY29uUmVwb3J0UmVxSW5kIHBTbWVCY25SZXBvcnRSZXE7CisgICB0QU5JX1U4IG51bV9jaGFubmVscyA9IDAsIG51bV9BUENoYW5SZXBvcnQ7CisgICB0QU5JX1UxNiBtZWFzRHVyYXRpb24sIG1heE1lYXNkdXJhdGlvbjsKKyAgIHRBTklfUzggIG1heER1cmF0aW9uOworICAgdEFOSV9VOCAgc2lnbjsKKworICAgaWYoIHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLkJlYWNvblJlcG9ydGluZy5wcmVzZW50ICYmIAorICAgICAgIChwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5CZWFjb25SZXBvcnRpbmcucmVwb3J0aW5nQ29uZGl0aW9uICE9IDApICkKKyAgIHsKKyAgICAgIC8vUmVwZWF0ZWQgbWVhc3VyZW1lbnQgaXMgbm90IHN1cHBvcnRlZC4gVGhpcyBtZWFucyBudW1iZXIgb2YgcmVwZXRpdGlvbnMgc2hvdWxkIGJlIHplcm8uKEFscmVhZHkgY2hlY2tlZCkKKyAgICAgIC8vQWxsIHRlc3QgY2FzZSBpbiBWb1dpZmkoYXMgb2YgdmVyc2lvbiAwLjM2KSAgdXNlIHplcm8gZm9yIG51bWJlciBvZiByZXBldGl0aW9ucy4KKyAgICAgIC8vQmVhY29uIHJlcG9ydGluZyBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHJlcXVlc3QgaWYgbnVtYmVyIG9mIHJlcGV0aXRvbnMgaXMgemVyby4KKyAgICAgIC8vIElFRUUgU3RkIDgwMi4xMWstMjAwOCBUYWJsZSA3LTI5ZyBhbmQgc2VjdGlvbiAxMS4xMC44LjEKKworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIkRyb3BpbmcgdGhlIHJlcXVlc3Q6IFJlcG9ydGluZyBjb25kaXRpb24gaW5jbHVkZWQgaW4gYmVhY29uIHJlcG9ydCByZXF1ZXN0IGFuZCBpdCBpcyBub3QgemVyb1xuIik7KQorICAgICAgcmV0dXJuIGVSUk1fSU5DQVBBQkxFOworICAgfQorCisgICAvKiBUaGUgbG9naWMgaGVyZSBpcyB0byBjaGVjayB0aGUgbWVhc3VyZW1lbnQgZHVyYXRpb24gcGFzc2VkIGluIHRoZSBiZWFjb24gcmVxdWVzdC4gRm9sbG93aW5nIGFyZSB0aGUgY2FzZXMgaGFuZGxlZC4KKyAgICAgIENhc2UgMTogSWYgbWVhc3VyZW1lbnQgZHVyYXRpb24gcmVjZWl2ZWQgaW4gdGhlIGJlYWNvbiByZXF1ZXN0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IG1lYXN1cmVtZW50IGR1cmF0aW9uIGFkdmVydGlzZWQgCisgICAgICAgICAgICAgICAgaW4gdGhlIFJSTSBjYXBhYmlsaXRpZXMoQXNzb2MgUmVxKSwgYW5kIER1cmF0aW9uIE1hbmRhdG9yeSBiaXQgaXMgc2V0IHRvIDEsIFJFRlVTRSB0aGUgYmVhY29uIHJlcXVlc3QKKyAgICAgIENhc2UgMjogSWYgbWVhc3VyZW1lbnQgZHVyYXRpb24gcmVjZWl2ZWQgaW4gdGhlIGJlYWNvbiByZXF1ZXN0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IG1lYXN1cmVtZW50IGR1cmF0aW9uIGFkdmVydGlzZWQgCisgICAgICAgICAgICAgICAgaW4gdGhlIFJSTSBjYXBhYmlsaXRpZXMoQXNzb2MgUmVxKSwgYW5kIER1cmF0aW9uIE1hbmRhdG9yeSBiaXQgaXMgc2V0IHRvIDAsIHBlcmZvcm0gbWVhc3VyZW1lbnQgZm9yIAorICAgICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBhZHZlcnRpc2VkIGluIHRoZSBSUk0gY2FwYWJpbGl0aWVzCisgICAgICAKKyAgICAgIG1heE1lYXN1cmVtZW50RHVyYXRpb24gPSAyXihub25PcGVyYXRpbmdDaGFuTWF4IC0gNCkgKiBCZWFjb25JbnRlcnZhbAorICAgICovCisgICBtYXhEdXJhdGlvbiA9IHBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlZENhcHMubm9uT3BlcmF0aW5nQ2hhbk1heCAtIDQ7CisgICBzaWduID0gKG1heER1cmF0aW9uIDwgMCkgPyAxIDogMDsKKyAgIG1heER1cmF0aW9uID0gKDFMIDw8IEFCUyhtYXhEdXJhdGlvbikpOworICAgaWYgKCFzaWduKQorICAgICAgbWF4TWVhc2R1cmF0aW9uID0gbWF4RHVyYXRpb24gKiBwU2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWw7CisgICBlbHNlCisgICAgICBtYXhNZWFzZHVyYXRpb24gPSBwU2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWwgLyBtYXhEdXJhdGlvbjsKKworICAgbWVhc0R1cmF0aW9uID0gcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubWVhc19kdXJhdGlvbjsgCisKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICBsaW1Mb2coIHBNYWMsIExPR0UsICJtYXhEdXJhdGlvbiA9ICVkIHNpZ24gPSAlZCBtYXhNZWFzZHVyYXRpb24gPSAlZCBtZWFzRHVyYXRpb24gPSAlZFxuIiwKKyAgICAgICAgbWF4RHVyYXRpb24sIHNpZ24sIG1heE1lYXNkdXJhdGlvbiwgbWVhc0R1cmF0aW9uICk7IAorI2VuZGlmCisKKyAgIGlmKCBtYXhNZWFzZHVyYXRpb24gPCBtZWFzRHVyYXRpb24gKQorICAgeworICAgICAgaWYoIHBCZWFjb25SZXEtPmR1cmF0aW9uTWFuZGF0b3J5ICkKKyAgICAgIHsKKyAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgIkRyb3BpbmcgdGhlIHJlcXVlc3Q6IGR1cmF0aW9uIG1hbmRhdG9yeSBhbmQgbWF4ZHVyYXRpb24gPiBtZWFzZHVyYXRpb25cbiIpOworICAgICAgICAgcmV0dXJuIGVSUk1fUkVGVVNFRDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgIG1lYXNEdXJhdGlvbiA9IG1heE1lYXNkdXJhdGlvbjsKKyAgIH0KKworICAgLy9DYWNoZSB0aGUgZGF0YSByZXF1aXJlZCBmb3Igc2VuZGluZyByZXBvcnQuCisgICBwQ3VycmVudFJlcS0+cmVxdWVzdC5CZWFjb24ucmVwb3J0aW5nRGV0YWlsID0gcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQmNuUmVwb3J0aW5nRGV0YWlsLnByZXNlbnQgPworICAgICAgcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQmNuUmVwb3J0aW5nRGV0YWlsLnJlcG9ydGluZ0RldGFpbCA6CisgICAgICBCRUFDT05fUkVQT1JUSU5HX0RFVEFJTF9BTExfRkZfSUUgOworCisgICBpZiggcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uUmVxdWVzdGVkSW5mby5wcmVzZW50ICkKKyAgIHsKKyAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCoqKSAmcEN1cnJlbnRSZXEtPnJlcXVlc3QuQmVhY29uLnJlcUllcy5wRWxlbWVudElkcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBzaXplb2YoIHRBTklfVTgpICogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uUmVxdWVzdGVkSW5mby5udW1fcmVxdWVzdGVkX2VpZHMgKSApICkKKyAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgIEZMKCAiVW5hYmxlIHRvIFBBTCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcXVlc3QgSUVzIGJ1ZmZlclxuIiApKTsKKyAgICAgICAgICAgIHJldHVybiBlUlJNX0ZBSUxVUkU7CisgICAgICB9CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIiBBbGxvY2F0ZWQgbWVtb3J5IGZvciBwRWxlbWVudElkc1xuIikgKTspCisjZW5kaWYKKyAgICAgIHBDdXJyZW50UmVxLT5yZXF1ZXN0LkJlYWNvbi5yZXFJZXMubnVtID0gcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uUmVxdWVzdGVkSW5mby5udW1fcmVxdWVzdGVkX2VpZHM7CisgICAgICBwYWxDb3B5TWVtb3J5ICggcE1hYy0+aEhkZCwgcEN1cnJlbnRSZXEtPnJlcXVlc3QuQmVhY29uLnJlcUllcy5wRWxlbWVudElkcywgCisgICAgICAgICAgICBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5SZXF1ZXN0ZWRJbmZvLnJlcXVlc3RlZF9laWRzLCAKKyAgICAgICAgICAgIHBDdXJyZW50UmVxLT5yZXF1ZXN0LkJlYWNvbi5yZXFJZXMubnVtICk7ICAgICAgCisgICB9CisKKyAgIGlmKCBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5udW1fQVBDaGFubmVsUmVwb3J0ICkKKyAgIHsKKyAgICAgIGZvciggbnVtX0FQQ2hhblJlcG9ydCA9IDAgOyBudW1fQVBDaGFuUmVwb3J0IDwgcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubnVtX0FQQ2hhbm5lbFJlcG9ydCA7IG51bV9BUENoYW5SZXBvcnQrKyApCisgICAgICAgICBudW1fY2hhbm5lbHMgKz0gcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQVBDaGFubmVsUmVwb3J0W251bV9BUENoYW5SZXBvcnRdLm51bV9jaGFubmVsTGlzdDsKKyAgIH0KKworICAgLy9QcmVwYXJlIHRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gU01FLgorICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAodm9pZCAqKikgJnBTbWVCY25SZXBvcnRSZXEsCisgICAgICAgICAgICAoc2l6ZW9mKCB0U2lyQmVhY29uUmVwb3J0UmVxSW5kICkgKyBudW1fY2hhbm5lbHMpICkgKQorICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICAgICAgRkwoICJVbmFibGUgdG8gUEFMIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgQmVhY29uIFJlcG9ydCBSZXEgSW5kIHRvIFNNRVxuIiApKTsKKworICAgICAgcmV0dXJuIGVSUk1fRkFJTFVSRTsKKworICAgfQorCisgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwU21lQmNuUmVwb3J0UmVxLCBzaXplb2YoIHRTaXJCZWFjb25SZXBvcnRSZXFJbmQgKSArIG51bV9jaGFubmVscyApOworCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIiBBbGxvY2F0ZWQgbWVtb3J5IGZvciBwU21lQmNuUmVwb3J0UmVxLi4uLndpbGwgYmUgZnJlZWQgYnkgb3RoZXIgbW9kdWxlXG4iKSApOykKKyNlbmRpZgorICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFNtZUJjblJlcG9ydFJlcS0+YnNzSWQsIHBTZXNzaW9uRW50cnktPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpICk7CisgICBwU21lQmNuUmVwb3J0UmVxLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVRX0lORDsKKyAgIHBTbWVCY25SZXBvcnRSZXEtPmxlbmd0aCA9IHNpemVvZiggdFNpckJlYWNvblJlcG9ydFJlcUluZCApICsgbnVtX2NoYW5uZWxzOworICAgcFNtZUJjblJlcG9ydFJlcS0+dURpYWxvZ1Rva2VuID0gcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfdG9rZW47CisgICAvL3BTbWVCY25SZXBvcnRSZXEtPm1lYXN1cmVtZW50RHVyYXRpb24gPSBTWVNfVFVfVE9fTVMocEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubWVhc19kdXJhdGlvbik7CisgICBwU21lQmNuUmVwb3J0UmVxLT5tZWFzdXJlbWVudER1cmF0aW9uID0gU1lTX1RVX1RPX01TKG1lYXNEdXJhdGlvbiAvKnBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLm1lYXNfZHVyYXRpb24qLyk7CisgICBwU21lQmNuUmVwb3J0UmVxLT5yYW5kb21pemF0aW9uSW50ZXJ2YWwgPSBTWVNfVFVfVE9fTVMgKHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLnJhbmRvbWl6YXRpb24pOworICAgcFNtZUJjblJlcG9ydFJlcS0+Zk1lYXN1cmVtZW50dHlwZSA9IHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLm1lYXNfbW9kZTsKKyAgIHBTbWVCY25SZXBvcnRSZXEtPmNoYW5uZWxJbmZvLnJlZ3VsYXRvcnlDbGFzcyA9IHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLnJlZ0NsYXNzOworICAgcFNtZUJjblJlcG9ydFJlcS0+Y2hhbm5lbEluZm8uY2hhbm5lbE51bSA9IHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLmNoYW5uZWw7CisgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU21lQmNuUmVwb3J0UmVxLT5tYWNhZGRyQnNzaWQsIHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLkJTU0lELCBzaXplb2YodFNpck1hY0FkZHIpICk7CisKKyAgIGlmKCBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5TU0lELnByZXNlbnQgKQorICAgeworICAgICAgcFNtZUJjblJlcG9ydFJlcS0+c3NJZC5sZW5ndGggPSBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5TU0lELm51bV9zc2lkOworICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFNtZUJjblJlcG9ydFJlcS0+c3NJZC5zc0lkLCAgcEJlYWNvblJlcS0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uU1NJRC5zc2lkLCAKKyAgICAgICAgICAgIHBTbWVCY25SZXBvcnRSZXEtPnNzSWQubGVuZ3RoICk7CisgICB9CisKKyAgIHBDdXJyZW50UmVxLT50b2tlbiA9IHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3Rva2VuOworCisgICBwU21lQmNuUmVwb3J0UmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9IG51bV9jaGFubmVsczsKKyAgIGlmKCBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5udW1fQVBDaGFubmVsUmVwb3J0ICkKKyAgIHsKKyAgICAgIHRBTklfVTggKnBDaGFuTGlzdCA9IHBTbWVCY25SZXBvcnRSZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXI7CisgICAgICBmb3IoIG51bV9BUENoYW5SZXBvcnQgPSAwIDsgbnVtX0FQQ2hhblJlcG9ydCA8IHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLm51bV9BUENoYW5uZWxSZXBvcnQgOyBudW1fQVBDaGFuUmVwb3J0KysgKQorICAgICAgeworICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcENoYW5MaXN0LCAKKyAgICAgICAgICAgICAgIHBCZWFjb25SZXEtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLkFQQ2hhbm5lbFJlcG9ydFtudW1fQVBDaGFuUmVwb3J0XS5jaGFubmVsTGlzdCwgCisgICAgICAgICAgICAgICBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5BUENoYW5uZWxSZXBvcnRbbnVtX0FQQ2hhblJlcG9ydF0ubnVtX2NoYW5uZWxMaXN0ICk7CisKKyAgICAgICAgIHBDaGFuTGlzdCArPSBwQmVhY29uUmVxLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5BUENoYW5uZWxSZXBvcnRbbnVtX0FQQ2hhblJlcG9ydF0ubnVtX2NoYW5uZWxMaXN0OworICAgICAgfQorICAgfQorCisgICAvL1NlbmQgcmVxdWVzdCB0byBTTUUuCisgICBtbWhNc2cudHlwZSAgICA9IGVXTklfU01FX0JFQUNPTl9SRVBPUlRfUkVRX0lORDsKKyAgIG1taE1zZy5ib2R5cHRyID0gcFNtZUJjblJlcG9ydFJlcTsKKyAgIE1UUkFDRShtYWNUcmFjZU1zZ1R4KHBNYWMsIDAsIG1taE1zZy50eXBlKSk7CisgICByZXR1cm4gbGltU3lzUHJvY2Vzc01taE1zZ0FwaShwTWFjLCAmbW1oTXNnLCBlUFJPVCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHJybUZpbGxCZWFjb25JZXMKKyAqCisgKiBGVU5DVElPTjogIAorICoKKyAqIExPR0lDOiBGaWxscyBGaXhlZCBmaWVsZHMgYW5kIEllcyBpbiBic3MgZGVzY3JpcHRpb24gdG8gYW4gYXJyYXkgb2YgdEFOSV9VOC4KKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBwSWVzIC0gcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIGJlIHBvcHVsYXRlZCB3aXRoIGllcy4KKyAqIEBwYXJhbSBwTnVtSWVzIC0gcmV0dXJucyB0aGUgbnVtIG9mIGllcyBmaWxsZWQgaW4gdGhpcyBwYXJhbS4KKyAqIEBwYXJhbSBwSWVzTWF4U2l6ZSAtIE1heCBzaXplIG9mIHRoZSBidWZmZXIgcEllcy4KKyAqIEBwYXJhbSBlaWRzIC0gcG9pbnRlciB0byBhcnJheSBvZiBlaWRzLiBJZiBOVUxMLCBhbGwgaWVzIHdpbGwgYmUgcG9wdWxhdGVkLgorICogQHBhcmFtIG51bUVpZHMgLSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYXJyYXkgZWlkcy4KKyAqIEBwYXJhbSBwQnNzRGVzYyAtIHBvaW50ZXIgdG8gQnNzIERlc2NyaXB0aW9uLgorICogQHJldHVybiBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitycm1GaWxsQmVhY29uSWVzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBJZXMsIHRBTklfVTggKnBOdW1JZXMsIHRBTklfVTggcEllc01heFNpemUsIAorICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqZWlkcywgdEFOSV9VOCBudW1FaWRzLAorICAgICAgICAgICAgICAgICAgdHBTaXJCc3NEZXNjcmlwdGlvbiBwQnNzRGVzYyApCit7CisgICB0QU5JX1U4IGxlbiwgKnBCY25JZXMsIEJjbk51bUllcywgY291bnQgPSAwLCBpOworCisgICBpZiggKHBJZXMgPT0gTlVMTCkgfHwgKHBOdW1JZXMgPT0gTlVMTCkgfHwgKHBCc3NEZXNjID09IE5VTEwpICkKKyAgIHsKKyAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCIgSW52YWxpZCBwYXJhbWV0ZXJzXG4iKSApOykKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLy9NYWtlIHN1cmUgdGhhdCBpZiBlaWQgaXMgbnVsbCwgbnVtRWlkcyBpcyBzZXQgdG8gemVyby4KKyAgIG51bUVpZHMgPSAoZWlkcyA9PSBOVUxMKSA/IDAgOiBudW1FaWRzOworCisgICBwQmNuSWVzID0gKHRBTklfVTgqKSAmcEJzc0Rlc2MtPmllRmllbGRzWzBdOworICAgQmNuTnVtSWVzID0gKHRBTklfVTgpR0VUX0lFX0xFTl9JTl9CU1MoIHBCc3NEZXNjLT5sZW5ndGggKTsKKworICAgKnBOdW1JZXMgPSAwOworCisgICAqKCh0QU5JX1UzMiopcEllcykgPSBwQnNzRGVzYy0+dGltZVN0YW1wWzBdOworICAgKnBOdW1JZXMrPXNpemVvZih0QU5JX1UzMik7IHBJZXMrPXNpemVvZih0QU5JX1UzMik7CisgICAqKCh0QU5JX1UzMiopcEllcykgPSBwQnNzRGVzYy0+dGltZVN0YW1wWzFdOworICAgKnBOdW1JZXMrPXNpemVvZih0QU5JX1UzMik7IHBJZXMrPXNpemVvZih0QU5JX1UzMik7CisgICAqKCh0QU5JX1UxNiopcEllcykgPSAgcEJzc0Rlc2MtPmJlYWNvbkludGVydmFsOworICAgKnBOdW1JZXMrPXNpemVvZih0QU5JX1UxNik7IHBJZXMrPXNpemVvZih0QU5JX1UxNik7CisgICAqKCh0QU5JX1UxNiopcEllcykgPSBwQnNzRGVzYy0+Y2FwYWJpbGl0eUluZm87CisgICAqcE51bUllcys9c2l6ZW9mKHRBTklfVTE2KTsgcEllcys9c2l6ZW9mKHRBTklfVTE2KTsKKworICAgd2hpbGUgKCBCY25OdW1JZXMgPiAwICkgCisgICB7CisgICAgICBsZW4gPSAqKHBCY25JZXMgKyAxKSArIDI7IC8vZWxlbWVudCBpZCArIGxlbmd0aC4KKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiRUlEID0gJWQsIGxlbiA9ICVkIHRvdGFsID0gJWRcbiIsICpwQmNuSWVzLCAqKHBCY25JZXMrMSksIGxlbiApOykKKyNlbmRpZgorCisgICAgICBpID0gMDsKKyAgICAgIGRvCisgICAgICB7ICAKKyAgICAgICAgIGlmKCAoIChlaWRzID09IE5VTEwpIHx8ICggKnBCY25JZXMgPT0gZWlkc1tpXSApICkgICYmCisgICAgICAgICAgICAgKCAoKnBOdW1JZXMpICsgbGVuKSA8IHBJZXNNYXhTaXplICkKKyAgICAgICAgIHsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiQWRkaW5nIEVpZCAlZCwgbGVuPSVkXG4iLCAqcEJjbkllcywgbGVuICk7KQorI2VuZGlmCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwSWVzLCBwQmNuSWVzLCBsZW4gKTsgCisgICAgICAgICAgICBwSWVzICs9IGxlbjsKKyAgICAgICAgICAgICpwTnVtSWVzICs9IGxlbjsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGkrKzsKKyAgICAgIH13aGlsZSggaSA8IG51bUVpZHMgKTsKKworICAgICAgcEJjbkllcyArPSBsZW47CisgICAgICBCY25OdW1JZXMgLT0gbGVuOworICAgfQorI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICJUb3RhbCBsZW5ndGggb2YgSWVzIGFkZGVkID0gJWRcbiIsICpwTnVtSWVzICk7KQorI2VuZGlmCit9CisgICAgICAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHJybVByb2Nlc3NCZWFjb25SZXBvcnRYbWl0CisgKgorICogRlVOQ1RJT046ICAKKyAqCisgKiBMT0dJQzogQ3JlYXRlIGEgUmFkaW8gbWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgc2VuZCBpdCB0byBwZWVyLgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBCY25SZXBvcnQgRGF0YSBmb3IgYmVhY29uIHJlcG9ydCBJRSBmcm9tIFNNRS4KKyAqIEByZXR1cm4gTm9uZQorICovCit0U2lyUmV0U3RhdHVzCitycm1Qcm9jZXNzQmVhY29uUmVwb3J0WG1pdCggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpckJlYWNvblJlcG9ydFhtaXRJbmQgcEJjblJlcG9ydCkKK3sKKyAgIHRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworICAgdFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCByZXBvcnQsICpwUmVwb3J0OworICAgdHBSUk1SZXEgcEN1cnJlbnRSZXEgPSBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnBDdXJyZW50UmVxOyAKKyAgIHRwUEVTZXNzaW9uIHBTZXNzaW9uRW50cnkgOworICAgdEFOSV9VOCBzZXNzaW9uSWQ7CisKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCAiUmVjZWl2ZWQgYmVhY29uIHJlcG9ydCB4bWl0IGluZGljYXRpb25cbiIpOykgIAorI2VuZGlmCisgICBpZihOVUxMID09IHBCY25SZXBvcnQpCisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgICBpZiAoIHBDdXJyZW50UmVxID09IE5VTEwgKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIlJlY2VpdmVkIHJlcG9ydCB4bWl0IHdoaWxlIHRoZXJlIGlzIG5vIHJlcXVlc3QgcGVuZGluZyBpbiBQRVxuIik7KQorICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKyAgIGlmICgocFNlc3Npb25FbnRyeSA9IHBlRmluZFNlc3Npb25CeUJzc2lkKHBNYWMscEJjblJlcG9ydC0+YnNzSWQsJnNlc3Npb25JZCkpPT1OVUxMKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJzZXNzaW9uIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiBic3NJZFxuIikpOykKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICB9CisKKyAgIHBSZXBvcnQgPSAmcmVwb3J0OworICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgcFJlcG9ydCwgc2l6ZW9mKHRTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQpICk7CisgICAvL1ByZXBhcmUgdGhlIGJlYWNvbiByZXBvcnQgYW5kIHNlbmQgaXQgdG8gdGhlIHBlZXIuCisgICBwUmVwb3J0LT50b2tlbiA9IHBCY25SZXBvcnQtPnVEaWFsb2dUb2tlbjsKKyAgIHBSZXBvcnQtPnJlZnVzZWQgPSAwOworICAgcFJlcG9ydC0+aW5jYXBhYmxlID0gMDsKKyAgIHBSZXBvcnQtPnR5cGUgPSBTSVJfTUFDX1JSTV9CRUFDT05fVFlQRTsKKworICAgLy9WYWxpZCByZXNwb25zZSBpcyBpbmNsdWRlZCBpZiB0aGUgc2l6ZSBvZiBiZWFjb24geG1pdCBpcyA9PSBzaXplIG9mIGJlYWNvbiB4bWl0IGluZCArIGllcyAKKyAgIGlmICggcEJjblJlcG9ydC0+bGVuZ3RoID4gc2l6ZW9mKCB0U2lyQmVhY29uUmVwb3J0WG1pdEluZCApICkKKyAgIHsKKyAgICAgIHBSZXBvcnQtPnJlcG9ydC5iZWFjb25SZXBvcnQucmVnQ2xhc3MgPSAgcEJjblJlcG9ydC0+cmVnQ2xhc3M7ICAKKyAgICAgIHBSZXBvcnQtPnJlcG9ydC5iZWFjb25SZXBvcnQuY2hhbm5lbCA9IHBCY25SZXBvcnQtPnBCc3NEZXNjcmlwdGlvblswXS0+Y2hhbm5lbElkOworICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFJlcG9ydC0+cmVwb3J0LmJlYWNvblJlcG9ydC5tZWFzU3RhcnRUaW1lLCBwQmNuUmVwb3J0LT5wQnNzRGVzY3JpcHRpb25bMF0tPnN0YXJ0VFNGLCBzaXplb2YoIHBCY25SZXBvcnQtPnBCc3NEZXNjcmlwdGlvblswXS0+c3RhcnRUU0YpICk7CisgICAgICBwUmVwb3J0LT5yZXBvcnQuYmVhY29uUmVwb3J0Lm1lYXNEdXJhdGlvbiA9IFNZU19NU19UT19UVShwQmNuUmVwb3J0LT5kdXJhdGlvbik7CisgICAgICBwUmVwb3J0LT5yZXBvcnQuYmVhY29uUmVwb3J0LnBoeVR5cGUgPSBwQmNuUmVwb3J0LT5wQnNzRGVzY3JpcHRpb25bMF0tPm53VHlwZTsgLy9UT0RPOiBjaGVjayB0aGlzLgorICAgICAgcFJlcG9ydC0+cmVwb3J0LmJlYWNvblJlcG9ydC5iY25Qcm9iZVJzcCA9IDE7CisgICAgICBwUmVwb3J0LT5yZXBvcnQuYmVhY29uUmVwb3J0LnJzbmkgPSBwQmNuUmVwb3J0LT5wQnNzRGVzY3JpcHRpb25bMF0tPnNpbnI7CisgICAgICBwUmVwb3J0LT5yZXBvcnQuYmVhY29uUmVwb3J0LnJjcGkgPSBwQmNuUmVwb3J0LT5wQnNzRGVzY3JpcHRpb25bMF0tPnJzc2k7CisKKyAgICAgIHBSZXBvcnQtPnJlcG9ydC5iZWFjb25SZXBvcnQuYW50ZW5uYUlkID0gMDsKKyAgICAgIHBSZXBvcnQtPnJlcG9ydC5iZWFjb25SZXBvcnQucGFyZW50VFNGID0gcEJjblJlcG9ydC0+cEJzc0Rlc2NyaXB0aW9uWzBdLT5wYXJlbnRUU0Y7IAorICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwUmVwb3J0LT5yZXBvcnQuYmVhY29uUmVwb3J0LmJzc2lkLCBwQmNuUmVwb3J0LT5wQnNzRGVzY3JpcHRpb25bMF0tPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICAgICAgc3dpdGNoICggcEN1cnJlbnRSZXEtPnJlcXVlc3QuQmVhY29uLnJlcG9ydGluZ0RldGFpbCApCisgICAgICB7CisgICAgICAgICBjYXNlIEJFQUNPTl9SRVBPUlRJTkdfREVUQUlMX05PX0ZGX0lFOiAvLzAgTm8gbmVlZCB0byBpbmNsdWRlIGFueSBlbGVtZW50cy4KKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICAgICAgICBQRUxPR0UobGltTG9nKHBNYWMsIExPR0UsICJObyByZXBvcnRpbmcgZGV0YWlsIHJlcXVlc3RlZFxuIik7KQorI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgQkVBQ09OX1JFUE9SVElOR19ERVRBSUxfQUxMX0ZGX1JFUV9JRTogLy8xOiBJbmNsdWRlIGFsbCBGRnMgYW5kIFJlcXVlc3RlZCBJZXMuCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCAiT25seSByZXF1ZXN0ZWQgSUVzIGluIHJlcG9ydGluZyBkZXRhaWwgcmVxdWVzdGVkXG4iKTspCisjZW5kaWYKKworICAgICAgICAgICAgcnJtRmlsbEJlYWNvbkllcyggcE1hYywgKHRBTklfVTgqKSAmcFJlcG9ydC0+cmVwb3J0LmJlYWNvblJlcG9ydC5JZXNbMF0sIAorICAgICAgICAgICAgICAgICAgKHRBTklfVTgqKSAmcFJlcG9ydC0+cmVwb3J0LmJlYWNvblJlcG9ydC5udW1JZXMsIEJFQUNPTl9SRVBPUlRfTUFYX0lFUywKKyAgICAgICAgICAgICAgICAgIHBDdXJyZW50UmVxLT5yZXF1ZXN0LkJlYWNvbi5yZXFJZXMucEVsZW1lbnRJZHMsIHBDdXJyZW50UmVxLT5yZXF1ZXN0LkJlYWNvbi5yZXFJZXMubnVtLAorICAgICAgICAgICAgICAgICAgcEJjblJlcG9ydC0+cEJzc0Rlc2NyaXB0aW9uWzBdICk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBCRUFDT05fUkVQT1JUSU5HX0RFVEFJTF9BTExfRkZfSUU6IC8vMiAvIGRlZmF1bHQgLSBJbmNsdWRlIGFsbCBGRnMgYW5kIGFsbCBJZXMuCisgICAgICAgICBkZWZhdWx0OgorI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgIkRlZmF1bHQgYWxsIElFcyBhbmQgRkZzXG4iKTspCisjZW5kaWYKKyAgICAgICAgICAgIHJybUZpbGxCZWFjb25JZXMoIHBNYWMsICh0QU5JX1U4KikgJnBSZXBvcnQtPnJlcG9ydC5iZWFjb25SZXBvcnQuSWVzWzBdLCAKKyAgICAgICAgICAgICAgICAgICh0QU5JX1U4KikgJnBSZXBvcnQtPnJlcG9ydC5iZWFjb25SZXBvcnQubnVtSWVzLCBCRUFDT05fUkVQT1JUX01BWF9JRVMsCisgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgcEJjblJlcG9ydC0+cEJzc0Rlc2NyaXB0aW9uWzBdICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICJTZW5kaW5nIEFjdGlvbiBmcmFtZSBcbiIpOykKKyNlbmRpZgorICAgICAgbGltU2VuZFJhZGlvTWVhc3VyZVJlcG9ydEFjdGlvbkZyYW1lKCBwTWFjLCBwQ3VycmVudFJlcS0+ZGlhbG9nX3Rva2VuLCAxLCAKKyAgICAgICAgICAgIHBSZXBvcnQsIHBCY25SZXBvcnQtPmJzc0lkLCBwU2Vzc2lvbkVudHJ5ICk7CisgICB9CisKKyAgIGlmKCBwQmNuUmVwb3J0LT5mTWVhc3VyZURvbmUgKQorICAgeworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIk1lYXN1cmVtZW50IGRvbmUuLi4uY2xlYW51cCB0aGUgY29udGV4dFxuIik7KQorCisgICAgICBycm1DbGVhbnVwKHBNYWMpOworICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBycm1Qcm9jZXNzQmVhY29uUmVxdWVzdEZhaWx1cmUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciBwZWVyLCB0UnJtUmV0U3RhdHVzIHN0YXR1cykKK3sKKyAgICB0cFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCBwUmVwb3J0ID0gTlVMTDsKKyAgICB0cFJSTVJlcSBwQ3VycmVudFJlcSA9IHBNYWMtPnJybS5ycm1QRUNvbnRleHQucEN1cnJlbnRSZXE7IAorCisgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAodm9pZCAqKikgJnBSZXBvcnQsCisgICAgICAgICAgICAgICBzaXplb2YoIHRTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQgKSApICkKKyAgICB7CisgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBSUk0gUmVxIHByb2Nlc3NpbmdcbiIgKSk7CisgICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBSZXBvcnQsIHNpemVvZih0U2lyTWFjUmFkaW9NZWFzdXJlUmVwb3J0KSApOworICAgIHBSZXBvcnQtPnRva2VuID0gcEN1cnJlbnRSZXEtPnRva2VuOworICAgIHBSZXBvcnQtPnR5cGUgPSBTSVJfTUFDX1JSTV9CRUFDT05fVFlQRTsKKworICAgIHN3aXRjaCAoc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBlUlJNX1JFRlVTRUQ6CisgICAgICAgICAgICBwUmVwb3J0LT5yZWZ1c2VkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIGVSUk1fSU5DQVBBQkxFOgorICAgICAgICAgICAgcFJlcG9ydC0+aW5jYXBhYmxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIiBCZWFjb24gcmVxdWVzdCBwcm9jZXNzaW5nIGZhaWxlZCBubyByZXBvcnQgc2VudCB3aXRoIHN0YXR1cyAlZCBcbiIpLCBzdGF0dXMpOyk7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwUmVwb3J0ICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGltU2VuZFJhZGlvTWVhc3VyZVJlcG9ydEFjdGlvbkZyYW1lKCBwTWFjLCBwQ3VycmVudFJlcS0+ZGlhbG9nX3Rva2VuLCAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlcG9ydCwgcGVlciwgcFNlc3Npb25FbnRyeSApOworCisgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcFJlcG9ydCApOworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiIEZyZWUgbWVtb3J5IGZvciBwUmVwb3J0XG4iKSApOykKKyNlbmRpZgorICAgIHJldHVybjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcnJtUHJvY2Vzc1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0CisgKgorICogRlVOQ1RJT046ICBQcm9jZXNzZXMgdGhlIFJhZGlvIFJlc291cmNlIE1lYXN1cmVtZW50IHJlcXVlc3QuCisgKgorICogTE9HSUM6CisgCisKKyoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBlZXIgTWFjYWRkcmVzcyBvZiB0aGUgcGVlciByZXF1ZXN0aW5nIHRoZSByYWRpbyBtZWFzdXJlbWVudC4KKyAqIEBwYXJhbSBwUlJNUmVxIEFycmF5IG9mIE1lYXN1cmVtZW50IHJlcXVlc3QgSUVzCisgKiBAcGFyYW0gcFNlc3Npb25FbnRyeSBzZXNzaW9uIGVudHJ5LgorICogQHJldHVybiBOb25lCisgKi8KK3RTaXJSZXRTdGF0dXMKK3JybVByb2Nlc3NSYWRpb01lYXN1cmVtZW50UmVxdWVzdCggdHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QgKnBSUk1SZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSApCit7CisgICB0QU5JX1U4IGk7CisgICB0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgIHRwU2lyTWFjUmFkaW9NZWFzdXJlUmVwb3J0IHBSZXBvcnQgPSBOVUxMOworICAgdEFOSV9VOCBudW1fcmVwb3J0ID0gMDsKKyAgIHRwUlJNUmVxIHBDdXJyZW50UmVxID0gcE1hYy0+cnJtLnJybVBFQ29udGV4dC5wQ3VycmVudFJlcTsgCisgICB0UnJtUmV0U3RhdHVzICAgIHJybVN0YXR1cyA9IGVSUk1fU1VDQ0VTUzsKKworICAgaWYoICFwUlJNUmVxLT5udW1fTWVhc3VyZW1lbnRSZXF1ZXN0ICkKKyAgIHsKKyAgICAgIC8vTm8gbWVhc3VyZW1lbnQgcmVxdWVzdHMuLi4uCisgICAgICAvLworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgIk5vIHJlcXVlc3RJZXMgaW4gdGhlIG1lYXN1cmVtZW50IHJlcXVlc3RcbiIgKTspCisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorCisgICAvLyBQRiBGaXgKKyAgIGlmKCBwUlJNUmVxLT5OdW1PZlJlcGV0aXRpb25zLnJlcGV0aXRpb25zID4gMCApCisgICB7CisgICAgICAvL1NlbmQgYSByZXBvcnQgd2l0aCBpbmNhcGFibGUgYml0IHNldC4gTm90IHN1cHBvcnRpbmcgcmVwZXRpdGlvbnMuCisgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICh2b2lkICoqKSAmcFJlcG9ydCwKKyAgICAgICAgICAgICAgIHNpemVvZiggdFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCApICkgKQorICAgICAgeworICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgRkwoICJVbmFibGUgdG8gUEFMIGFsbG9jYXRlIG1lbW9yeSBkdXJpbmcgUlJNIFJlcSBwcm9jZXNzaW5nXG4iICkpOworICAgICAgICAgcmV0dXJuIGVTSVJfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgIH0KKyAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBSZXBvcnQsIHNpemVvZih0U2lyTWFjUmFkaW9NZWFzdXJlUmVwb3J0KSApOworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCIgQWxsb2NhdGVkIG1lbW9yeSBmb3IgcFJlcG9ydFxuIikgKTspCisjZW5kaWYKKyAgICAgIHBSZXBvcnQtPmluY2FwYWJsZSA9IDE7CisgICAgICBwUmVwb3J0LT50eXBlID0gcFJSTVJlcS0+TWVhc3VyZW1lbnRSZXF1ZXN0WzBdLm1lYXN1cmVtZW50X3R5cGU7CisgICAgICBudW1fcmVwb3J0ID0gMTsKKyAgICAgIGdvdG8gZW5kOworCisgICB9CisKKyAgIGZvciggaT0gMDsgaSA8IHBSUk1SZXEtPm51bV9NZWFzdXJlbWVudFJlcXVlc3Q7IGkrKyApCisgICB7CisgICAgICBzd2l0Y2goIHBSUk1SZXEtPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF90eXBlICkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgU0lSX01BQ19SUk1fQkVBQ09OX1RZUEU6CisgICAgICAgICAgICAvL1Byb2Nlc3MgYmVhY29uIHJlcXVlc3QuCisgICAgICAgICAgICBpZiggcEN1cnJlbnRSZXEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCBwUmVwb3J0ID09IE5VTEwgKSAvL0FsbG9jYXRlIG1lbW9yeSB0byBzZW5kIHJlcG9ydHMgZm9yIGFueSBzdWJzZXF1ZW50IHJlcXVlc3RzLgorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJnBSZXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQgKSAqIChwUlJNUmVxLT5udW1fTWVhc3VyZW1lbnRSZXF1ZXN0IC0gaSkgKSApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBSUk0gUmVxIHByb2Nlc3NpbmdcbiIgKSk7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgcFJlcG9ydCwgc2l6ZW9mKCB0U2lyTWFjUmFkaW9NZWFzdXJlUmVwb3J0ICkgKiAocFJSTVJlcS0+bnVtX01lYXN1cmVtZW50UmVxdWVzdCAtIGkpICk7IAorI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIiBBbGxvY2F0ZWQgbWVtb3J5IGZvciBwUmVwb3J0XG4iKSApOworI2VuZGlmCisKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHBSZXBvcnRbbnVtX3JlcG9ydF0ucmVmdXNlZCA9IDE7CisgICAgICAgICAgICAgICBwUmVwb3J0W251bV9yZXBvcnRdLnR5cGUgPSBTSVJfTUFDX1JSTV9CRUFDT05fVFlQRTsKKyAgICAgICAgICAgICAgIHBSZXBvcnRbbnVtX3JlcG9ydF0udG9rZW4gPSBwUlJNUmVxLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfdG9rZW47CisgICAgICAgICAgICAgICBudW1fcmVwb3J0Kys7CisgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopICZwQ3VycmVudFJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggKnBDdXJyZW50UmVxICkgKSApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR1AsCisgICAgICAgICAgICAgICAgICAgICAgICBGTCggIlVuYWJsZSB0byBQQUwgYWxsb2NhdGUgbWVtb3J5IGR1cmluZyBSUk0gUmVxIHByb2Nlc3NpbmdcbiIgKSk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9NRU1fQUxMT0NfRkFJTEVEOworICAgICAgICAgICAgICAgfQorI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCIgQWxsb2NhdGVkIG1lbW9yeSBmb3IgcEN1cnJlbnRSZXFcbiIpICk7KQorI2VuZGlmCisgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwQ3VycmVudFJlcSwgc2l6ZW9mKCAqcEN1cnJlbnRSZXEgKSApOworICAgICAgICAgICAgICAgcEN1cnJlbnRSZXEtPmRpYWxvZ190b2tlbiA9IHBSUk1SZXEtPkRpYWxvZ1Rva2VuLnRva2VuOworICAgICAgICAgICAgICAgcEN1cnJlbnRSZXEtPnRva2VuID0gcFJSTVJlcS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3Rva2VuOworICAgICAgICAgICAgICAgcE1hYy0+cnJtLnJybVBFQ29udGV4dC5wQ3VycmVudFJlcSA9IHBDdXJyZW50UmVxOworICAgICAgICAgICAgICAgcnJtU3RhdHVzID0gcnJtUHJvY2Vzc0JlYWNvblJlcG9ydFJlcSggcE1hYywgcEN1cnJlbnRSZXEsICZwUlJNUmVxLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0sIHBTZXNzaW9uRW50cnkgKTsKKyAgICAgICAgICAgICAgIGlmIChlUlJNX1NVQ0NFU1MgIT0gcnJtU3RhdHVzKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHJybVByb2Nlc3NCZWFjb25SZXF1ZXN0RmFpbHVyZShwTWFjLCBwU2Vzc2lvbkVudHJ5LCBwZWVyLCBycm1TdGF0dXMpOworICAgICAgICAgICAgICAgICAgIHJybUNsZWFudXAocE1hYyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvL1NlbmQgYSByZXBvcnQgd2l0aCBpbmNhcGFiYWxlIGJpdCBzZXQuCisgICAgICAgICAgICBpZiAoIHBSZXBvcnQgPT0gTlVMTCApIC8vQWxsb2NhdGUgbWVtb3J5IHRvIHNlbmQgcmVwb3J0cyBmb3IgYW55IHN1YnNlcXVlbnQgcmVxdWVzdHMuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcFJlcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggdFNpck1hY1JhZGlvTWVhc3VyZVJlcG9ydCApICogKHBSUk1SZXEtPm51bV9NZWFzdXJlbWVudFJlcXVlc3QgLSBpKSApICkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMKCAiVW5hYmxlIHRvIFBBTCBhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIFJSTSBSZXEgcHJvY2Vzc2luZ1xuIiApKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBlU0lSX01FTV9BTExPQ19GQUlMRUQ7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwUmVwb3J0LCBzaXplb2YoIHRTaXJNYWNSYWRpb01lYXN1cmVSZXBvcnQgKSAqIChwUlJNUmVxLT5udW1fTWVhc3VyZW1lbnRSZXF1ZXN0IC0gaSkgKTsgCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIiBBbGxvY2F0ZWQgbWVtb3J5IGZvciBwUmVwb3J0XG4iKSApOykKKyNlbmRpZgorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwUmVwb3J0W251bV9yZXBvcnRdLmluY2FwYWJsZSA9IDE7CisgICAgICAgICAgICBwUmVwb3J0W251bV9yZXBvcnRdLnR5cGUgPSBwUlJNUmVxLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfdHlwZTsKKyAgICAgICAgICAgIHBSZXBvcnRbbnVtX3JlcG9ydF0udG9rZW4gPSBwUlJNUmVxLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfdG9rZW47CisgICAgICAgICAgICBudW1fcmVwb3J0Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworZW5kOgorICAgaWYoIHBSZXBvcnQgKQorICAgeworICAgICAgbGltU2VuZFJhZGlvTWVhc3VyZVJlcG9ydEFjdGlvbkZyYW1lKCBwTWFjLCBwUlJNUmVxLT5EaWFsb2dUb2tlbi50b2tlbiwgbnVtX3JlcG9ydCwgCisgICAgICAgICAgICBwUmVwb3J0LCBwZWVyLCBwU2Vzc2lvbkVudHJ5ICk7CisKKyAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBSZXBvcnQgKTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICBQRUxPR0UobGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiIEZyZWUgbWVtb3J5IGZvciBwUmVwb3J0XG4iKSApOykKKyNlbmRpZgorICAgfQorICAgcmV0dXJuIHN0YXR1czsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBycm1VcGRhdGVTdGFydFRTRgorICoqCisgKiBGVU5DVElPTjogIFN0b3JlIHN0YXJ0IFRTRiBvZiBtZWFzdXJlbWVudC4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFydFRTRiAtIFRTRiB2YWx1ZSBhdCB0aGUgc3RhcnQgb2YgbWVhc3VyZW1lbnQuCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZAorcnJtVXBkYXRlU3RhcnRUU0YgKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzdGFydFRTRlsyXSApCit7CisjaWYgMCAvL2RlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIGxpbUxvZyggcE1hYywgTE9HRSwgIlVwZGF0ZSBTdGFydCBUU0YgPSAlZCAlZFxuIiwgc3RhcnRUU0ZbMF0sIHN0YXJ0VFNGWzFdICk7IAorI2VuZGlmCisgICBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnN0YXJ0VFNGWzBdID0gc3RhcnRUU0ZbMF07CisgICBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnN0YXJ0VFNGWzFdID0gc3RhcnRUU0ZbMV07Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHJybUdldFN0YXJ0VFNGCisgKgorICogRlVOQ1RJT046ICBHZXQgdGhlIFN0YXJ0IFRTRi4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBzdGFydFRTRiAtIHN0b3JlIHN0YXIgVFNGIGluIHRoaXMgYnVmZmVyLgorICogQHJldHVybiB0eFBvd2VyCisgKi8KK3ZvaWQKK3JybUdldFN0YXJ0VFNGICggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBTdGFydFRTRiApCit7CisjaWYgMCAvL2RlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIGxpbUxvZyggcE1hYywgTE9HRSwgIkdldCB0aGUgc3RhcnQgVFNGLCBUU0YgPSAlZCAlZCBcbiIsIHBNYWMtPnJybS5ycm1QRUNvbnRleHQuc3RhcnRUU0ZbMF0sIHBNYWMtPnJybS5ycm1QRUNvbnRleHQuc3RhcnRUU0ZbMV0gKTsgCisjZW5kaWYKKyAgIHBTdGFydFRTRlswXSA9IHBNYWMtPnJybS5ycm1QRUNvbnRleHQuc3RhcnRUU0ZbMF07CisgICBwU3RhcnRUU0ZbMV0gPSBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnN0YXJ0VFNGWzFdOworICAgCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBycm1HZXRDYXBhYmlsaXRpZXMKKyAqCisgKiBGVU5DVElPTjoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRwUlJNQ2FwcyB3aXRoIGFsbCB0aGUgY2FwcyBlbmFibGVkIGluIFJSTQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBTZXNzaW9uRW50cnkKKyAqIEByZXR1cm4gcG9pbnRlciB0byB0UlJNQ2FwcworICovCit0cFJSTUNhcHMgcnJtR2V0Q2FwYWJpbGl0aWVzICggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwU2Vzc2lvbkVudHJ5ICkKK3sKKyAgIHJldHVybiAmcE1hYy0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGVkQ2FwczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcnJtVXBkYXRlQ29uZmlnCisgKgorICogRlVOQ1RJT046CisgKiBVcGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24uIFRoaXMgaXMgY2FsbGVkIGZyb20gbGltVXBkYXRlQ29uZmlnLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBTZXNzaW9uRW50cnkKKyAqIEByZXR1cm4gcG9pbnRlciB0byB0UlJNQ2FwcworICovCit2b2lkIHJybVVwZGF0ZUNvbmZpZyAoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcFNlc3Npb25FbnRyeSApCit7ICAgICAgCisgICB0QU5JX1UzMiB2YWw7CisgICB0cFJSTUNhcHMgcFJSTUNhcHMgPSAmcE1hYy0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGVkQ2FwczsKKworICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUlJNX0VOQUJMRUQsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgcnJtIGVuYWJsZWQgZmFpbGVkXG4iKSk7CisgICAgICAgcmV0dXJuOworICAgfQorICAgcE1hYy0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGUgPSAodmFsKSA/IDEgOiAwOyAgICAKKworICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUlJNX09QRVJBVElOR19DSEFOX01BWCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBycm0gb3BlcmF0aW5nIGNoYW5uZWwgbWF4IG1lYXN1cmVtZW50IGR1cmF0aW9uIGZhaWxlZFxuIikpOworICAgICAgIHJldHVybjsKKyAgIH0KKyAgIHBSUk1DYXBzLT5vcGVyYXRpbmdDaGFuTWF4ID0gKHRBTklfVTgpdmFsOworCisgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19SUk1fTk9OX09QRVJBVElOR19DSEFOX01BWCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBycm0gbm9uLW9wZXJhdGluZyBjaGFubmVsIG1heCBtZWFzdXJlbWVudCBkdXJhdGlvbiBmYWlsZWRcbiIpKTsKKyAgICAgICByZXR1cm47CisgICB9CisgICBwUlJNQ2Fwcy0+bm9uT3BlcmF0aW5nQ2hhbk1heCA9KHRBTklfVTgpIHZhbDsKKworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIFBFTE9HRShsaW1Mb2coIHBNYWMsIExPR0UsICJSUk0gZW5hYmxlZCA9ICVkICBPcGVyYXRpbmdDaGFuTWF4ID0gJWQgIE5vbk9wZXJhdGluZ01heCA9ICVkXG4iLCBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnJybUVuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIHBSUk1DYXBzLT5vcGVyYXRpbmdDaGFuTWF4LCBwUlJNQ2Fwcy0+bm9uT3BlcmF0aW5nQ2hhbk1heCApOykKKyNlbmRpZgorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcnJtSW5pdGlhbGl6ZQorICoKKyAqIEZVTkNUSU9OOgorICogSW5pdGlhbGl6ZSBSUk0gbW9kdWxlCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzCitycm1Jbml0aWFsaXplKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICB0cFJSTUNhcHMgcFJSTUNhcHMgPSAmcE1hYy0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGVkQ2FwczsKKworICAgcE1hYy0+cnJtLnJybVBFQ29udGV4dC5wQ3VycmVudFJlcSA9IE5VTEw7IAorICAgcE1hYy0+cnJtLnJybVBFQ29udGV4dC50eE1nbXRQb3dlciA9IDA7CisgICBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LkRpYWxvZ1Rva2VuID0gMDsKKworICAgcE1hYy0+cnJtLnJybVBFQ29udGV4dC5ycm1FbmFibGUgPSAwOworCisgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCBwUlJNQ2Fwcywgc2l6ZW9mKHRSUk1DYXBzKSApOworICAgcFJSTUNhcHMtPkxpbmtNZWFzdXJlbWVudCA9IDE7CisgICBwUlJNQ2Fwcy0+TmVpZ2hib3JScHQgPSAxOworICAgcFJSTUNhcHMtPkJlYWNvblBhc3NpdmUgPSAxOworICAgcFJSTUNhcHMtPkJlYWNvbkFjdGl2ZSA9IDE7CisgICBwUlJNQ2Fwcy0+QmVhY29uVGFibGUgPSAxOworICAgcFJSTUNhcHMtPkFQQ2hhblJlcG9ydCA9IDE7CisKKyAgIC8vcFJSTUNhcHMtPlRDTUNhcGFiaWxpdHkgPSAxOworICAgLy9wUlJNQ2Fwcy0+dHJpZ2dlcmVkVENNID0gMTsKKyAgIHBSUk1DYXBzLT5vcGVyYXRpbmdDaGFuTWF4ID0gMzsKKyAgIHBSUk1DYXBzLT5ub25PcGVyYXRpbmdDaGFuTWF4ID0gMzsKKworICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogcnJtQ2xlYW51cAorICoKKyAqIEZVTkNUSU9OOgorICogY2xlYW51cCBSUk0gbW9kdWxlCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gbW9kZQorICogQHBhcmFtIHJhdGUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3RTaXJSZXRTdGF0dXMKK3JybUNsZWFudXAodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgIGlmKCBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnBDdXJyZW50UmVxICkKKyAgIHsKKyAgICAgIGlmKCBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnBDdXJyZW50UmVxLT5yZXF1ZXN0LkJlYWNvbi5yZXFJZXMucEVsZW1lbnRJZHMgKQorICAgICAgeworICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+cnJtLnJybVBFQ29udGV4dC5wQ3VycmVudFJlcS0+cmVxdWVzdC5CZWFjb24ucmVxSWVzLnBFbGVtZW50SWRzICk7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIiBGcmVlIG1lbW9yeSBmb3IgcEVsZW1lbnRJZHNcbiIpICk7KQorI2VuZGlmCisgICAgICB9CisKKyAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBNYWMtPnJybS5ycm1QRUNvbnRleHQucEN1cnJlbnRSZXEgKTsgCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgUEVMT0dFKGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIiBGcmVlIG1lbW9yeSBmb3IgcEN1cnJlbnRSZXFcbiIpICk7KQorI2VuZGlmCisgICB9CisKKyAgIHBNYWMtPnJybS5ycm1QRUNvbnRleHQucEN1cnJlbnRSZXEgPSBOVUxMOyAKKyAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHJybVByb2Nlc3NNZXNzYWdlCisgKgorICogRlVOQ1RJT046ICBQcm9jZXNzZXMgdGhlIG5leHQgcmVjZWl2ZWQgUmFkaW8gUmVzb3VyY2UgTWFuYWdlbWVudCBtZXNzYWdlCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gTm9uZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBycm1Qcm9jZXNzTWVzc2FnZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZykKK3sKKyAgIHN3aXRjaCAocE1zZy0+dHlwZSkKKyAgIHsKKyAgICAgIGNhc2UgZVdOSV9TTUVfTkVJR0hCT1JfUkVQT1JUX1JFUV9JTkQ6CisgICAgICAgICBycm1Qcm9jZXNzTmVpZ2hib3JSZXBvcnRSZXEoIHBNYWMsIHBNc2ctPmJvZHlwdHIgKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlV05JX1NNRV9CRUFDT05fUkVQT1JUX1JFU1BfWE1JVF9JTkQ6CisgICAgICAgICBycm1Qcm9jZXNzQmVhY29uUmVwb3J0WG1pdCggcE1hYywgcE1zZy0+Ym9keXB0ciApOworICAgICAgICAgYnJlYWs7CisgICB9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvc2NoL3NjaEFwaS5jIGIvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hBcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDkwZTVlCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hBcGkuYwpAQCAtMCwwICsxLDUyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBzY2hBcGkuY2MgY29udGFpbnMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhlIEFQSSBleHBvc2VkCisgKiBieSBzY2hlZHVsZXIgbW9kdWxlCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJzaXJXcmFwcGVyLmgiCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKworI2luY2x1ZGUgInNpck1hY1Byb3REZWYuaCIKKyNpbmNsdWRlICJzaXJNYWNQcm9wRXh0cy5oIgorI2luY2x1ZGUgInNpckNvbW1vbi5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbERhdGFTdHJ1Y3QuaCIKKyNpbmNsdWRlICJoYWxDb21tb25BcGkuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisjaW5jbHVkZSAicG1tQXBpLmgiCisKKyNpbmNsdWRlICJsaW1BcGkuaCIKKworI2luY2x1ZGUgInNjaEFwaS5oIgorI2luY2x1ZGUgInNjaERlYnVnLmgiCisKKyNpbmNsdWRlICJzY2hTeXNQYXJhbXMuaCIKKyNpbmNsdWRlICJsaW1UcmFjZS5oIgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNpbmNsdWRlICJsaW1UeXBlcy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGEuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWMgVmFyaWFibGVzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEFOSV9VOCBnU2NoUHJvYmVSc3BUZW1wbGF0ZVtTQ0hfTUFYX1BST0JFX1JFU1BfU0laRV07CitzdGF0aWMgdEFOSV9VOCBnU2NoQmVhY29uRnJhbWVCZWdpbltTQ0hfTUFYX0JFQUNPTl9TSVpFXTsKK3N0YXRpYyB0QU5JX1U4IGdTY2hCZWFjb25GcmFtZUVuZFtTQ0hfTUFYX0JFQUNPTl9TSVpFXTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2NoR2V0Q0ZQQ291bnQKKyAqCisgKiBGVU5DVElPTjoKKyAqIEZ1bmN0aW9uIHVzZWQgYnkgb3RoZXIgU2lyaXVzIG1vZHVsZXMgdG8gcmVhZCBDRlBjb3VudAorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIE5vbmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3RBTklfVTgKK3NjaEdldENGUENvdW50KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgcmV0dXJuIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaENGUENvdW50OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzY2hHZXRDRlBEdXJSZW1haW5pbmcKKyAqCisgKiBGVU5DVElPTjoKKyAqIEZ1bmN0aW9uIHVzZWQgYnkgb3RoZXIgU2lyaXVzIG1vZHVsZXMgdG8gcmVhZCBDRlBEdXJhdGlvbiByZW1haW5pbmcKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0QU5JX1UxNgorc2NoR2V0Q0ZQRHVyUmVtYWluaW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgcmV0dXJuIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaENGUER1clJlbWFpbmluZzsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzY2hJbml0aWFsaXplCisgKgorICogRlVOQ1RJT046CisgKiBJbml0aWFsaXplCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gTm9uZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorc2NoSW5pdGlhbGl6ZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHBtbUluaXRpYWxpemUocE1hYyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHNjaEluaXRHbG9iYWxzCisgKgorICogRlVOQ1RJT046CisgKiBJbml0aWFsaXplIGdsb2JhbHMKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitzY2hJbml0R2xvYmFscyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHBNYWMtPnNjaC5nU2NoSGNmRW5hYmxlZCA9IGZhbHNlOworCisgICAgcE1hYy0+c2NoLmdTY2hTY2FuUmVxdWVzdGVkID0gZmFsc2U7CisgICAgcE1hYy0+c2NoLmdTY2hTY2FuUmVxUmN2ZCA9IGZhbHNlOworCisgICAgcE1hYy0+c2NoLmdTY2hHZW5CZWFjb24gPSAxOworICAgIHBNYWMtPnNjaC5nU2NoQmVhY29uc1NlbnQgPSAwOworICAgIHBNYWMtPnNjaC5nU2NoQmVhY29uc1dyaXR0ZW4gPSAwOworICAgIHBNYWMtPnNjaC5nU2NoQmNuUGFyc2VFcnJvckNudCA9IDA7CisgICAgcE1hYy0+c2NoLmdTY2hCY25JZ25vcmVkID0gMDsKKyAgICBwTWFjLT5zY2guZ1NjaEJCWHBvcnRSY3ZDbnQgPSAwOworICAgIHBNYWMtPnNjaC5nU2NoVW5rbm93blJjdkNudCA9IDA7CisgICAgcE1hYy0+c2NoLmdTY2hCY25SY3ZDbnQgPSAwOworICAgIHBNYWMtPnNjaC5nU2NoUlJSY3ZDbnQgPSAwOworICAgIHBNYWMtPnNjaC5xb3NOdWxsQ250ID0gMDsKKyAgICBwTWFjLT5zY2gubnVtRGF0YSA9IDA7CisgICAgcE1hYy0+c2NoLm51bVBvbGwgPSAwOworICAgIHBNYWMtPnNjaC5udW1Db3JydXB0ID0gMDsKKyAgICBwTWFjLT5zY2gubnVtQm9ndXNJbnQgPSAwOworICAgIHBNYWMtPnNjaC5udW1UeEFjdDAgPSAwOworICAgIHBNYWMtPnNjaC5yclRpbWVvdXQgPSBTQ0hfUlJfVElNRU9VVDsKKyAgICBwTWFjLT5zY2gucG9sbFBlcmlvZCA9IFNDSF9QT0xMX1BFUklPRDsKKyAgICBwTWFjLT5zY2gua2VlcEFsaXZlID0gMDsKKyAgICBwTWFjLT5zY2gubXVsdGlwbGVTY2hlZCA9IDE7CisgICAgcE1hYy0+c2NoLm1heFBvbGxUaW1lb3V0cyA9IDIwOworICAgIHBNYWMtPnNjaC5jaGVja0NmYkZsYWdTdHVjayA9IDA7CisKKyAgICBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hQcm9iZVJzcFRlbXBsYXRlID0gZ1NjaFByb2JlUnNwVGVtcGxhdGU7CisgICAgcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uRnJhbWVCZWdpbiA9IGdTY2hCZWFjb25GcmFtZUJlZ2luOworICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbkZyYW1lRW5kICAgPSBnU2NoQmVhY29uRnJhbWVFbmQ7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2NoUG9zdE1lc3NhZ2UKKyAqCisgKiBGVU5DVElPTjoKKyAqIFBvc3QgdGhlIGJlYWNvbiBtZXNzYWdlIHRvIHRoZSBzY2hlZHVsZXIgbWVzc2FnZSBxdWV1ZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBNc2cgcG9pbnRlciB0byBtZXNzYWdlCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit0U2lyUmV0U3RhdHVzCitzY2hQb3N0TWVzc2FnZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgcE1zZykKK3sKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX0xJTlVYKSB8fCBkZWZpbmVkKEFOSV9PU19UWVBFX09TWCkKKyAgIFBFTE9HMyhzY2hMb2cocE1hYywgTE9HMywgRkwoIkdvaW5nIHRvIHBvc3QgbWVzc2FnZSAoJXgpIHRvIFNDSCBtZXNzYWdlIHF1ZXVlXG4iKSwKKyAgICAgICAgICAgcE1zZy0+dHlwZSk7KQorICAgIGlmICh0eF9xdWV1ZV9zZW5kKCZwTWFjLT5zeXMuZ1NpclNjaE1zZ1EsIHBNc2csIFRYX05PX1dBSVQpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisjZWxzZQorICAgIHNjaFByb2Nlc3NNZXNzYWdlKHBNYWMsIHBNc2cpOworI2VuZGlmIAorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworCisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2NoU2VuZFN0YXJ0U2NhblJzcAorICoKKyAqIEZVTkNUSU9OOgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIE5vbmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK3NjaFNlbmRTdGFydFNjYW5Sc3AodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0U2lyTXNnUSAgICAgICAgbXNnUTsKKyAgICB0QU5JX1UzMiAgICAgICAgcmV0Q29kZTsKKworICAgIFBFTE9HMShzY2hMb2cocE1hYywgTE9HMSwgRkwoIlNlbmRpbmcgTElNIG1lc3NhZ2UgdG8gZ28gaW50byBzY2FuXG4iKSk7KQorICAgIG1zZ1EudHlwZSA9IFNJUl9TQ0hfU1RBUlRfU0NBTl9SU1A7CisgICAgaWYgKChyZXRDb2RlID0gbGltUG9zdE1zZ0FwaShwTWFjLCAmbXNnUSkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgc2NoTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICBGTCgiUG9zdGluZyBTVEFSVF9TQ0FOX1JTUCB0byBMSU0gZmFpbGVkLCByZWFzb249JVhcbiIpLCByZXRDb2RlKTsKK30KKworLyoqCisgKiBzY2hTZW5kQmVhY29uUmVxCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKiAxKSBTQ0ggcmVjZWl2ZWQgU0lSX1NDSF9CRUFDT05fR0VOX0lORAorICogMikgU0NIIHVwZGF0ZXMgVElNIElFIGFuZCBvdGhlciBiZWFjb24gcmVsYXRlZCBJRSdzCisgKiAzKSBTQ0ggc2VuZHMgV0RBX1NFTkRfQkVBQ09OX1JFUSB0byBIQUwuIEhBTCB0aGVuIGNvcGllcyB0aGUgYmVhY29uCisgKiAgICB0ZW1wbGF0ZSB0byBtZW1vcnkKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE1lbW9yeSBhbGxvY2F0aW9uIGlzIHJlcWQgdG8gc2VuZCB0aGlzIG1lc3NhZ2UgYW5kIFNDSCBhbGxvY2F0ZXMgbWVtb3J5LgorICogVGhlIGFzc3VtcHRpb24gaXMgdGhhdCBIQUwgd2lsbCAiZnJlZSIgdGhpcyBtZW1vcnkuCisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcE1hYyBnbG9iYWwKKyAqCisgKiBAcGFyYW0gYmVhY29uUGF5bG9hZAorICoKKyAqIEBwYXJhbSBzaXplIC0gTGVuZ3RoIG9mIHRoZSBiZWFjb24KKyAqCisgKiBAcmV0dXJuIGVIYWxTdGF0dXMKKyAqLwordFNpclJldFN0YXR1cyBzY2hTZW5kQmVhY29uUmVxKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpiZWFjb25QYXlsb2FkLCB0QU5JX1UxNiBzaXplLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRTaXJNc2dRIG1zZ1E7CisgICAgdHBTZW5kYmVhY29uUGFyYW1zIGJlYWNvblBhcmFtcyA9IE5VTEw7CisgICAgdFNpclJldFN0YXR1cyByZXRDb2RlOworCisgIHNjaExvZyggcE1hYywgTE9HMiwKKyAgICAgIEZMKCAiSW5kaWNhdGluZyBIQUwgdG8gY29weSB0aGUgYmVhY29uIHRlbXBsYXRlIFslZCBieXRlc10gdG8gbWVtb3J5XG4iICksCisgICAgICBzaXplICk7CisKKyAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgKHZvaWQgKiopICZiZWFjb25QYXJhbXMsCisgICAgICAgICAgc2l6ZW9mKCB0U2VuZGJlYWNvblBhcmFtcyApKSkKKyAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworCisgIG1zZ1EudHlwZSA9IFdEQV9TRU5EX0JFQUNPTl9SRVE7CisKKyAgLy8gTm8gRGlhbG9nIFRva2VuIHJlcWQsIGFzIGEgcmVzcG9uc2UgaXMgbm90IHNvbGljaXRlZAorICBtc2dRLnJlc2VydmVkID0gMDsKKworICAvLyBGaWxsIGluIHRTZW5kYmVhY29uUGFyYW1zIG1lbWJlcnMKKyAgLyogS25vY2sgb2ZmIGFsbCBwTWFjIGdsb2JhbCBhZGRyZXNzZXMgKi8KKyAgLy8gbGltR2V0QnNzaWQoIHBNYWMsIGJlYWNvblBhcmFtcy0+YnNzSWQpOworICBwYWxDb3B5TWVtb3J5KHBNYWMsIGJlYWNvblBhcmFtcy0+YnNzSWQsIHBzZXNzaW9uRW50cnktPmJzc0lkLCBzaXplb2YocHNlc3Npb25FbnRyeS0+YnNzSWQpKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgYmVhY29uUGFyYW1zLT50aW1JZU9mZnNldCA9IHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbk9mZnNldEJlZ2luOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgYmVhY29uUGFyYW1zLT5wMnBJZU9mZnNldCA9IHBNYWMtPnNjaC5zY2hPYmplY3QucDJwSWVPZmZzZXQ7CisjZW5kaWYKKyNpZmRlZiBXTEFOX1NPRlRBUF9GV19CRUFDT05fVFhfUFJOVF9MT0cKKyAgc2NoTG9nKHBNYWMsIExPR0UsRkwoIlRpbUllT2Zmc2V0OlslZF1cbiIpLGJlYWNvblBhcmFtcy0+VGltSWVPZmZzZXQgKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgYmVhY29uUGFyYW1zLT5iZWFjb24gPSBiZWFjb25QYXlsb2FkOworICBiZWFjb25QYXJhbXMtPmJlYWNvbkxlbmd0aCA9ICh0QU5JX1UzMikgc2l6ZTsKKyAgbXNnUS5ib2R5cHRyID0gYmVhY29uUGFyYW1zOworICBtc2dRLmJvZHl2YWwgPSAwOworCisgIC8vIEtlZXAgYSBjb3B5IG9mIHJlY2VudCBiZWFjb24gZnJhbWUgc2VudAorCisgIC8vIGZyZWUgcHJldmlvdXMgY29weSBvZiB0aGUgYmVhY29uCisgIGlmIChwc2Vzc2lvbkVudHJ5LT5iZWFjb24gKQorICB7CisgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwc2Vzc2lvbkVudHJ5LT5iZWFjb24pOworICB9CisKKyAgcHNlc3Npb25FbnRyeS0+YmNuTGVuID0gMDsKKyAgcHNlc3Npb25FbnRyeS0+YmVhY29uID0gTlVMTDsKKworICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsKHZvaWQgKiopICZwc2Vzc2lvbkVudHJ5LT5iZWFjb24sIHNpemUpKSAKKyAgeworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcHNlc3Npb25FbnRyeS0+YmVhY29uLCBiZWFjb25QYXlsb2FkLCBzaXplKTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5iY25MZW4gPSBzaXplOworICB9CisKKyAgTVRSQUNFKG1hY1RyYWNlTXNnVHgocE1hYywgMCwgbXNnUS50eXBlKSk7CisgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gKHJldENvZGUgPSB3ZGFQb3N0Q3RybE1zZyggcE1hYywgJm1zZ1EgKSkpCisgIHsKKyAgICBzY2hMb2coIHBNYWMsIExPR0UsCisgICAgICAgIEZMKCJQb3N0aW5nIFNFTkRfQkVBQ09OX1JFUSB0byBIQUwgZmFpbGVkLCByZWFzb249JVhcbiIpLAorICAgICAgICByZXRDb2RlICk7CisgIH0gZWxzZQorICB7CisgICAgc2NoTG9nKCBwTWFjLCBMT0cyLAorICAgICAgICBGTCgiU3VjY2Vzc2Z1bGx5IHBvc3RlZCBXREFfU0VORF9CRUFDT05fUkVRIHRvIEhBTFxuIikpOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKSAKKyAgICAgICAgJiYgKHBzZXNzaW9uRW50cnktPnByb3h5UHJvYmVSc3BFbikKKyAgICAgICAgJiYgKHBNYWMtPnNjaC5zY2hPYmplY3QuZkJlYWNvbkNoYW5nZWQpKQorICAgIHsKKyAgICAgICAgaWYoZVNJUl9TVUNDRVNTICE9IChyZXRDb2RlID0gbGltU2VuZFByb2JlUnNwVGVtcGxhdGVUb0hhbChwTWFjLHBzZXNzaW9uRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNlc3Npb25FbnRyeS0+RGVmUHJvYmVSc3BJZUJpdG1hcFswXSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gZnJlZSBhbnkgbWVtb3J5ICovCisgICAgICAgICAgICBzY2hMb2cocE1hYywgTE9HRSwgRkwoIkZBSUxFRCB0byBzZW5kIHByb2JlIHJlc3BvbnNlIHRlbXBsYXRlIHdpdGggcmV0Q29kZSAlZFxuIiksIHJldENvZGUpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgIH0KKworICByZXR1cm4gcmV0Q29kZTsKK30KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3RBTklfVTMyIGxpbVNlbmRQcm9iZVJzcFRlbXBsYXRlVG9IYWwodHBBbmlTaXJHbG9iYWwgcE1hYyx0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsdEFOSV9VMzIqIEllQml0bWFwKQoreworICAgIHRTaXJNc2dRICBtc2dROworICAgIHRBTklfVTggKnBGcmFtZTJIYWwgPSBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hQcm9iZVJzcFRlbXBsYXRlOworICAgIHRwU2VuZFByb2JlUmVzcFBhcmFtcyBwcHJvYmVSZXNwUGFyYW1zPU5VTEw7CisgICAgdEFOSV9VMzIgIHJldENvZGUgPSBlU0lSX0ZBSUxVUkU7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgblBheWxvYWQsbkJ5dGVzLG5TdGF0dXM7CisgICAgdHBTaXJNYWNNZ210SGRyICAgICAgcE1hY0hkcjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICBhZGRuSUVQcmVzZW50OworICAgIHRBTklfVTMyICAgICAgICAgICAgIGFkZG5JRUxlbj0wOworICAgIHRTaXJSZXRTdGF0dXMgICAgICAgIG5TaXJTdGF0dXM7CisKKyAgICBuU3RhdHVzID0gZG90MTFmR2V0UGFja2VkUHJvYmVSZXNwb25zZVNpemUoIHBNYWMsICZwc2Vzc2lvbkVudHJ5LT5wcm9iZVJlc3BGcmFtZSwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgc2NoTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFja2VkIHNpemUgZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYSBQcm9iZSBSZXNwb25zZSAoMHglMDh4KS5cbiIpLAorICAgICAgICAgICAgICAgIG5TdGF0dXMgKTsKKyAgICAgICAgLy8gV2UnbGwgZmFsbCBiYWNrIG9uIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvOgorICAgICAgICBuUGF5bG9hZCA9IHNpemVvZiggdERvdDExZlByb2JlUmVzcG9uc2UgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBzY2hMb2coIHBNYWMsIExPR0UsIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcGFja2VkIHNpemUgZm9yIGEgUHJvYmUgUmVzcG9uc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMHglMDh4KS5cbiIpLCBuU3RhdHVzICk7CisgICAgfQorCisgICAgbkJ5dGVzID0gblBheWxvYWQgKyBzaXplb2YoIHRTaXJNYWNNZ210SGRyICk7CisgICAgCisgICAgLy9DaGVjayBpZiBwcm9iZSByZXNwb25zZSBJRSBpcyBzZXQgZmlyc3QgYmVmb3JlIGNoZWNraW5nIGJlYWNvbi9wcm9iZSByc3AgSUUKKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1BST0JFX1JTUF9BREROSUVfRkxBRywgJmFkZG5JRVByZXNlbnQpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNjaExvZyhwTWFjLCBMT0dFLCBGTCgiVW5hYmxlIHRvIGdldCBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0ZMQUdcbiIpKTsKKyAgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgfQorCisgICAgaWYoIWFkZG5JRVByZXNlbnQpCisgICAgeworICAgICAgICAvL1RPRE86IElmIGFkZGl0aW9uYWwgSUUgbmVlZHMgdG8gYmUgYWRkZWQuIEFkZCB0aGVuIGFsbG9jIHJlcXVpcmVkIGJ1ZmZlci4KKyAgICAgICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHLCAmYWRkbklFUHJlc2VudCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBzY2hMb2cocE1hYywgTE9HRSwgRkwoIlVuYWJsZSB0byBnZXQgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9GTEFHXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gcmV0Q29kZTsKKyAgICAgICAgfQorICAgIAorICAgICAgICBpZihhZGRuSUVQcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZih3bGFuX2NmZ0dldFN0ckxlbihwTWFjLCBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEEsICZhZGRuSUVMZW4pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzY2hMb2cocE1hYywgTE9HRSwgRkwoIlVuYWJsZSB0byBnZXQgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBIGxlbmd0aCIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0Q29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL1Byb2JlIHJzcCBJRSBhdmFpbGFibGUKKyAgICAgICAgaWYod2xhbl9jZmdHZXRTdHJMZW4ocE1hYywgV05JX0NGR19QUk9CRV9SU1BfQURETklFX0RBVEExLCAmYWRkbklFTGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiVW5hYmxlIHRvIGdldCBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEEgbGVuZ3RoIikpOworICAgICAgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihhZGRuSUVQcmVzZW50KQorICAgIHsKKyAgICAgICAgaWYoKG5CeXRlcyArIGFkZG5JRUxlbikgPD0gU0lSX01BWF9QQUNLRVRfU0laRSApIAorICAgICAgICAgICAgbkJ5dGVzICs9IGFkZG5JRUxlbjsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIGFkZG5JRVByZXNlbnQgPSBmYWxzZTsgLy9Eb250IGluY2x1ZGUgdGhlIElFLiAgICAgCisgICAgfQorICAgICAgIAorICAgIC8vIFBhcmFub2lhOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBGcmFtZTJIYWwsIG5CeXRlcyApOworCisgICAgLy8gTmV4dCwgd2UgZmlsbCBvdXQgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yOgorICAgIG5TaXJTdGF0dXMgPSBsaW1Qb3B1bGF0ZU1hY0hlYWRlciggcE1hYywgcEZyYW1lMkhhbCwgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01HTVRfUFJPQkVfUlNQLCBwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcixwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcik7CisKKyAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBuU2lyU3RhdHVzICkKKyAgICB7CisgICAgICAgIHNjaExvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwb3B1bGF0ZSB0aGUgYnVmZmVyIGRlc2NyaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvciBmb3IgYSBQcm9iZSBSZXNwb25zZSAoJWQpLlxuIiksCisgICAgICAgICAgICAgICAgblNpclN0YXR1cyApOworICAgICAgICByZXR1cm4gcmV0Q29kZTsKKyAgICB9CisKKyAgICBwTWFjSGRyID0gKCB0cFNpck1hY01nbXRIZHIgKSBwRnJhbWUySGFsOworICAKKyAgICBzaXJDb3B5TWFjQWRkcihwTWFjSGRyLT5ic3NJZCxwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisgICAgCisgICAgLy8gVGhhdCBkb25lLCBwYWNrIHRoZSBQcm9iZSBSZXNwb25zZToKKyAgICBuU3RhdHVzID0gZG90MTFmUGFja1Byb2JlUmVzcG9uc2UoIHBNYWMsICZwc2Vzc2lvbkVudHJ5LT5wcm9iZVJlc3BGcmFtZSwgcEZyYW1lMkhhbCArIHNpemVvZih0U2lyTWFjTWdtdEhkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBzY2hMb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFjayBhIFByb2JlIFJlc3BvbnNlICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgblN0YXR1cyApOworICAgICAgICByZXR1cm4gcmV0Q29kZTsgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZCEKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBzY2hMb2coIHBNYWMsIExPR0UsIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgYSBQIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb2JlIFJlc3BvbnNlICgweCUwOHgpLlxuIikgKTsKKyAgICB9CisKKyAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcHByb2JlUmVzcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggdFNlbmRQcm9iZVJlc3BQYXJhbXMgKSkpCisgICAgeworICAgICAgICBzY2hMb2coIHBNYWMsIExPR0UsIEZMKCJsaW1TZW5kUHJvYmVSc3BUZW1wbGF0ZVRvSGFsOiBIQUwgcHJvYmUgcmVzcG9uc2UgcGFyYW1zIG1hbGxvYyBmYWlsZWQgZm9yIGJ5dGVzICVkXG4iKSwgbkJ5dGVzICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgIFBFTE9HRShzaXJEdW1wQnVmKHBNYWMsIFNJUl9MSU1fTU9EVUxFX0lELCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZTJIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzKTspCisgICAgICAgICovCisKKyAgICAgICAgc2lyQ29weU1hY0FkZHIoIHBwcm9iZVJlc3BQYXJhbXMtPmJzc0lkICAsICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCk7CisgICAgICAgIHBwcm9iZVJlc3BQYXJhbXMtPnBQcm9iZVJlc3BUZW1wbGF0ZSAgID0gcEZyYW1lMkhhbDsKKyAgICAgICAgcHByb2JlUmVzcFBhcmFtcy0+cHJvYmVSZXNwVGVtcGxhdGVMZW4gPSBuQnl0ZXM7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYyxwcHJvYmVSZXNwUGFyYW1zLT51Y1Byb3h5UHJvYmVSZXFWYWxpZElFQm1hcCxJZUJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHRBTklfVTMyKSAqIDgpKTsKKyAgICAgICAgbXNnUS50eXBlICAgICA9IFdEQV9VUERBVEVfUFJPQkVfUlNQX1RFTVBMQVRFX0lORDsgCisgICAgICAgIG1zZ1EucmVzZXJ2ZWQgPSAwOworICAgICAgICBtc2dRLmJvZHlwdHIgID0gcHByb2JlUmVzcFBhcmFtczsKKyAgICAgICAgbXNnUS5ib2R5dmFsICA9IDA7CisKKyAgICAgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSAocmV0Q29kZSA9IHdkYVBvc3RDdHJsTXNnKCBwTWFjLCAmbXNnUSApKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZnJlZSB0aGUgYWxsb2NhdGVkIE1lbW9yeSAqLworICAgICAgICAgICAgc2NoTG9nKCBwTWFjLExPR0UsIEZMKCJsaW1TZW5kUHJvYmVSc3BUZW1wbGF0ZVRvSGFsOiBGQUlMIGJ5dGVzICVkIHJldGNvZGVbJVhdXG4iKSwgbkJ5dGVzICwgcmV0Q29kZSApOworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLHBwcm9iZVJlc3BQYXJhbXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc2NoTG9nKCBwTWFjLExPR0UsIEZMKCJsaW1TZW5kUHJvYmVSc3BUZW1wbGF0ZVRvSGFsOiBQcm9iZSByZXNwb25zZSB0ZW1wbGF0ZSBtc2cgcG9zdGVkIHRvIEhBTCBvZiBieXRlcyAlZCBcbiIpLG5CeXRlcyApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldENvZGU7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hCZWFjb25HZW4uYyBiL0NPUkUvTUFDL3NyYy9wZS9zY2gvc2NoQmVhY29uR2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiODVjMwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9zY2gvc2NoQmVhY29uR2VuLmMKQEAgLTAsMCArMSwxMDAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgc2NoQmVhY29uR2VuLmNjIGNvbnRhaW5zIGJlYWNvbiBnZW5lcmF0aW9uIHJlbGF0ZWQKKyAqIGZ1bmN0aW9ucworICoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworIAorI2luY2x1ZGUgInBhbFR5cGVzLmgiCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJzaXJNYWNQcm90RGVmLmgiCisKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbUFwaS5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbENvbW1vbkFwaS5oIgorI2luY2x1ZGUgImhhbERhdGFTdHJ1Y3QuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiaGFsTXNnQXBpLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisjaW5jbHVkZSAicG1tQXBpLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiCisKKyNpbmNsdWRlICJwYXJzZXJBcGkuaCIKKworI2luY2x1ZGUgInNjaERlYnVnLmgiCisKKy8vCisvLyBNYXJjaCAxNSwgMjAwNgorLy8gVGVtcG9yYXJpbHkgKG1heWJlIGZvciBhbGwgb2YgQWxwaGEtMSksIGFzc3VtaW5nIFRJTSA9IDAKKy8vCisKK2NvbnN0IHRBTklfVTggUDJwT3VpW10gPSB7MHg1MCwgMHg2RiwgMHg5QSwgMHg5fTsKKworI2lmZGVmIEFOSV9QUk9EVUNUX1RZUEVfQVAKKworc3RhdGljIHZvaWQKK3NwZWNpYWxCZWFjb25Qcm9jZXNzaW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGJlYWNvblNpemUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdMQU5fU09GVEFQX0ZFQVRVUkUpICYmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1AyUCkKK3RTaXJSZXRTdGF0dXMgc2NoR2V0UDJwSWVPZmZzZXQodEFOSV9VOCAqcEV4dHJhSWUsIHRBTklfVTMyIGV4dHJhSWVMZW4sIHRBTklfVTE2ICpwUDJwSWVPZmZzZXQpCit7CisgICAgdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX0ZBSUxVUkU7ICAgCisgICAgKnBQMnBJZU9mZnNldCA9IDA7CisKKyAgICAvLyBFeHRyYSBJRSBpcyBub3QgcHJlc2VudAorICAgIGlmKDAgPT0gZXh0cmFJZUxlbikKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBQMlAgSUUgT2Zmc2V0CisgICAgZG8KKyAgICB7CisgICAgICAgIGlmKCpwRXh0cmFJZSA9PSAweEREKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwYWxFcXVhbE1lbW9yeShOVUxMLCAodm9pZCAqKShwRXh0cmFJZSsyKSwgJlAycE91aSwgc2l6ZW9mKFAycE91aSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcFAycEllT2Zmc2V0KSsrOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICgqcFAycEllT2Zmc2V0KSsrOworICAgICAgICBwRXh0cmFJZSsrOworICAgICB9d2hpbGUoLS1leHRyYUllTGVuID4gMCk7IAorCisgICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKwordFNpclJldFN0YXR1cyBzY2hBcHBlbmRBZGRuSUUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwRnJhbWUsIHRBTklfVTMyIG1heEJlYWNvblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKm5CeXRlcykKK3sKKyAgICB0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKyAgICB0QU5JX1UzMiBwcmVzZW50LCBsZW47CisgICAgdEFOSV9VOCBhZGRJRVtXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEFfTEVOXTsKKyAgICAKKyAgICAgaWYoKHN0YXR1cyA9IHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVzZW50KSkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJVbmFibGUgdG8gZ2V0IFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfRkxBRyIpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZihwcmVzZW50KQorICAgIHsKKyAgICAgICAgaWYoKHN0YXR1cyA9IHdsYW5fY2ZnR2V0U3RyTGVuKHBNYWMsIFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgIEZMKCJVbmFibGUgdG8gZ2V0IFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfREFUQSBsZW5ndGgiKSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgaWYobGVuIDw9IFdOSV9DRkdfUFJPQkVfUlNQX0JDTl9BREROSUVfREFUQV9MRU4gJiYgbGVuICYmIAorICAgICAgICAgICgobGVuICsgKm5CeXRlcykgPD0gbWF4QmVhY29uU2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChzdGF0dXMgPSB3bGFuX2NmZ0dldFN0cihwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19QUk9CRV9SU1BfQkNOX0FERE5JRV9EQVRBLCAmYWRkSUVbMF0sICZsZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgICAgIHRBTklfVTgqIHBQMnBJZSA9IGxpbUdldFAycElFUHRyKHBNYWMsICZhZGRJRVswXSwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZihwUDJwSWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggbm9hTGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBub2FTdHJlYW1bU0lSX01BWF9OT0FfQVRUUl9MRU4gKyBTSVJfUDJQX0lFX0hFQURFUl9MRU5dOworICAgICAgICAgICAgICAgICAgICAvL2dldCBOb0EgYXR0cmlidXRlIHN0cmVhbSBQMlAgSUUKKyAgICAgICAgICAgICAgICAgICAgbm9hTGVuID0gbGltR2V0Tm9hQXR0clN0cmVhbShwTWFjLCBub2FTdHJlYW0sIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICBpZihub2FMZW4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5vYUxlbiArIGxlbiA8PSBXTklfQ0ZHX1BST0JFX1JTUF9CQ05fQURETklFX0RBVEFfTEVOKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19tZW1fY29weSgmYWRkSUVbbGVuXSwgbm9hU3RyZWFtLCBub2FMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSBub2FMZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIElFIExlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQMnBJZVsxXSArPSBub2FMZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIk5vdCBhYmxlIHRvIGluc2VydCBOb0EgYmVjYXVzZSBvZiBsZW5ndGggY29uc3RyYWludCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHZvc19tZW1fY29weShwRnJhbWUsICZhZGRJRVswXSwgbGVuKTsKKyAgICAgICAgICAgICAgICAqbkJ5dGVzID0gKm5CeXRlcyArIGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHNjaFNldEZpeGVkQmVhY29uRmllbGRzCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gTm9uZQorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cyBzY2hTZXRGaXhlZEJlYWNvbkZpZWxkcyh0cEFuaVNpckdsb2JhbCBwTWFjLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdHBBbmlCZWFjb25TdHJ1Y3QgcEJlYWNvbiA9ICh0cEFuaUJlYWNvblN0cnVjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uRnJhbWVCZWdpbjsKKyAgICB0cFNpck1hY01nbXRIZHIgbWFjOworICAgIHRBTklfVTE2ICAgICAgICBvZmZzZXQ7CisgICAgdEFOSV9VOCAgICAgICAgKnB0cjsKKyAgICB0RG90MTFmQmVhY29uMSAgYmNuMTsKKyAgICB0RG90MTFmQmVhY29uMiAgYmNuMjsKKyAgICB0QU5JX1UzMiAgICAgICAgaSwgblN0YXR1cywgbkJ5dGVzOworICAgIHRBTklfVTMyICAgICAgICB3cHNBcEVuYWJsZT0wLCB0bXA7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHREb3QxMWZJRVdzY1Byb2JlUmVzICAgICAgV3NjUHJvYmVSZXM7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIHRBTklfVTggICpwRXh0cmFJZSA9IE5VTEw7CisgICAgdEFOSV9VMzIgZXh0cmFJZUxlbiA9MDsKKyAgICB0QU5JX1UxNiBleHRyYUllT2Zmc2V0ID0gMDsKKyAgICB0QU5JX1UxNiBwMnBJZU9mZnNldCA9IDA7CisgICAgdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisjZW5kaWYKKyNlbmRpZgorCisgICAgUEVMT0cxKHNjaExvZyhwTWFjLCBMT0cxLCBGTCgiU2V0dGluZyBmaXhlZCBiZWFjb24gZmllbGRzXG4iKSk7KQorCisgICAgLyoKKyAgICAgKiBGaXJzdCBzZXQgdGhlIGZpeGVkIGZpZWxkcworICAgICAqLworCisgICAgLy8gc2V0IHRoZSBURlAgaGVhZGVycworCisgICAgLy8gc2V0IHRoZSBtYWMgaGVhZGVyCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KikgJnBCZWFjb24tPm1hY0hkciwgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApICk7CisgICAgbWFjID0gKHRwU2lyTWFjTWdtdEhkcikgJnBCZWFjb24tPm1hY0hkcjsKKyAgICBtYWMtPmZjLnR5cGUgPSBTSVJfTUFDX01HTVRfRlJBTUU7CisgICAgbWFjLT5mYy5zdWJUeXBlID0gU0lSX01BQ19NR01UX0JFQUNPTjsKKworICAgIGZvciAoaT0wOyBpPDY7IGkrKykKKyAgICAgICAgbWFjLT5kYVtpXSA9IDB4ZmY7CisgICAgCisgICAgLyogS25vY2tpbmcgb3V0IEdsb2JhbCBwTWFjIHVwZGF0ZSAqLworICAgIC8qIGxpbUdldE15TWFjQWRkcihwTWFjLCBtYWMtPnNhKTsgKi8KKyAgICAvKiBsaW1HZXRCc3NpZChwTWFjLCBtYWMtPmJzc0lkKTsgKi8KKworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgbWFjLT5zYSwgcHNlc3Npb25FbnRyeS0+c2VsZk1hY0FkZHIsIHNpemVvZihwc2Vzc2lvbkVudHJ5LT5zZWxmTWFjQWRkcikpOworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgbWFjLT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+YnNzSWQsIHNpemVvZiAocHNlc3Npb25FbnRyeS0+YnNzSWQpKTsKKworICAgIG1hYy0+ZmMuZnJvbURTID0gMDsKKyAgICBtYWMtPmZjLnRvRFMgPSAwOworCisgICAgLyoKKyAgICAgKiBOb3cgc2V0IHRoZSBiZWFjb24gYm9keQorICAgICAqLworCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KikgJmJjbjEsIHNpemVvZiggYmNuMSApICk7CisKKyAgICAvLyBTa2lwIG92ZXIgdGhlIHRpbWVzdGFtcCAoaXQnbGwgYmUgdXBkYXRlZCBsYXRlcikuCisKKyAgICBiY24xLkJlYWNvbkludGVydmFsLmludGVydmFsID0gcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uSW50ZXJ2YWw7CisgICAgUG9wdWxhdGVEb3QxMWZDYXBhYmlsaXRpZXMoIHBNYWMsICZiY24xLkNhcGFiaWxpdGllcywgcHNlc3Npb25FbnRyeSApOworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5zc2lkSGlkZGVuKQorICAgIHsKKyAgICAgICBiY24xLlNTSUQucHJlc2VudCA9IDE7IC8vcmVzdCBvZiB0aGUgZmlsZWRzIGFyZSAwIGZvciBoaWRkZW4gc3NpZAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIFBvcHVsYXRlRG90MTFmU1NJRCggcE1hYywgJnBzZXNzaW9uRW50cnktPnNzSWQsICZiY24xLlNTSUQgKTsKKyAgICB9CisKKyAgICBQb3B1bGF0ZURvdDExZlN1cHBSYXRlcyggcE1hYywgUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMLCAmYmNuMS5TdXBwUmF0ZXMscHNlc3Npb25FbnRyeSk7CisgICAgUG9wdWxhdGVEb3QxMWZEU1BhcmFtcyggcE1hYywgJmJjbjEuRFNQYXJhbXMsIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCwgcHNlc3Npb25FbnRyeSk7CisgICAgUG9wdWxhdGVEb3QxMWZJQlNTUGFyYW1zKCBwTWFjLCAmYmNuMS5JQlNTUGFyYW1zLHBzZXNzaW9uRW50cnkpOworCisgICAgb2Zmc2V0ID0gc2l6ZW9mKCB0QW5pQmVhY29uU3RydWN0ICk7CisgICAgcHRyICAgID0gcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uRnJhbWVCZWdpbiArIG9mZnNldDsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBpZigocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpIAorICAgICAgICAmJiAocHNlc3Npb25FbnRyeS0+cHJveHlQcm9iZVJzcEVuKSkKKyAgICB7CisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgSUUgYml0bWFwIHRvIHplcm8gKi8KKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJihwc2Vzc2lvbkVudHJ5LT5EZWZQcm9iZVJzcEllQml0bWFwKSwgKHNpemVvZiggdEFOSV9VMzIgKSAqIDgpKTsKKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IElFIGJpdG1hcCB0byB6ZXJvICovCisgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSYocHNlc3Npb25FbnRyeS0+cHJvYmVSZXNwRnJhbWUpLCBzaXplb2YocHNlc3Npb25FbnRyeS0+cHJvYmVSZXNwRnJhbWUpKTsKKworICAgICAgICAvKiBDYW4gYmUgZWZmaWNpZW50bHkgdXBkYXRlZCB3aGVuZXZlciBuZXcgSUUgYWRkZWQgIGluIFByb2JlIHJlc3BvbnNlIGluIGZ1dHVyZSAqLworICAgICAgICBsaW1VcGRhdGVQcm9iZVJzcFRlbXBsYXRlSWVCaXRtYXBCZWFjb24xKHBNYWMsJmJjbjEsJnBzZXNzaW9uRW50cnktPkRlZlByb2JlUnNwSWVCaXRtYXBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNlc3Npb25FbnRyeS0+cHJvYmVSZXNwRnJhbWUpOworICAgIH0KKyNlbmRpZgorCisgICAgblN0YXR1cyA9IGRvdDExZlBhY2tCZWFjb24xKCBwTWFjLCAmYmNuMSwgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIX01BWF9CRUFDT05fU0laRSAtIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuQnl0ZXMgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgc2NoTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhY2tlZCBhIHREb3QxMWZCZWFjb24xICgweCUwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOHguKS5cbiIpLCBuU3RhdHVzICk7CisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICBzY2hMb2coIHBNYWMsIExPR0UsIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHBhY2tpbmcgYSB0RG8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0MTFmQmVhY29uMSAoMHglMDh4LikuXG4iKSwgblN0YXR1cyApOworICAgIH0KKyAgICAvKmNoYW5nZWQgIHRvIGNvcnJlY3QgYmVhY29uIGNvcnJ1cHRpb24gKi8KKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqKSAmYmNuMiwgc2l6ZW9mKCBiY24yICkgKTsKKyAgICBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25PZmZzZXRCZWdpbiA9IG9mZnNldCArICggdEFOSV9VMTYgKW5CeXRlczsKKyAgICBzY2hMb2coIHBNYWMsIExPRzEsIEZMKCJJbml0aWFsaXplZCBiZWFjb24gYmVnaW4sIG9mZnNldCAlZFxuIiksIG9mZnNldCApOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIHRoZSAnbmV3JyBmaWVsZHMgYXQgdGhlIGVuZCBvZiB0aGUgYmVhY29uCisgICAgICovCisKKyAgICAKKyAgICBQb3B1bGF0ZURvdDExZkNvdW50cnkoIHBNYWMsICZiY24yLkNvdW50cnksIHBzZXNzaW9uRW50cnkpOworICAgIGlmKGJjbjEuQ2FwYWJpbGl0aWVzLnFvcykKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmRURDQVBhcmFtU2V0KCBwTWFjLCAmYmNuMi5FRENBUGFyYW1TZXQsIHBzZXNzaW9uRW50cnkpOworICAgIH0KKworICAgIGlmKHBNYWMtPmxpbS5nTGltMTFoRW5hYmxlKQorICAgIHsKKyAgICAgIFBvcHVsYXRlRG90MTFmUG93ZXJDb25zdHJhaW50cyggcE1hYywgJmJjbjIuUG93ZXJDb25zdHJhaW50cyApOworICAgICAgUG9wdWxhdGVEb3QxMWZUUENSZXBvcnQoIHBNYWMsICZiY24yLlRQQ1JlcG9ydCwgcHNlc3Npb25FbnRyeSk7CisgICAgfQorCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgIGlmKCBwTWFjLT5saW0uZ0xpbTExaEVuYWJsZSAmJiAoZUxJTV9RVUlFVF9SVU5OSU5HID09IHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRTdGF0ZSkpCisgICAgeworICAgICAgUG9wdWxhdGVEb3QxMWZRdWlldCggcE1hYywgJmJjbjIuUXVpZXQgKTsKKyAgICB9CisKKyAgICAvKiBJZiAxMWggaXMgZW5hYmxlZCwgYW5kIEFQIGlzIGluIHRoZSBzdGF0ZSBvZiBjaGFuZ2luZyBlaXRoZXIgdGhlCisgICAgICogcHJpbWFyeSBjaGFubmVsLCBvciBib3RoIHByaW1hcnkgJiBzZWNvbmRhcnkgY2hhbm5lbCwgYW5kIHRoZQorICAgICAqIGNoYW5uZWwgc3dpdGNoIGNvdW50IGlzIHN0aWxsIGJlaW5nIGRlY3JlbWVudGVkLCB0aGVuIEFQIHNoYWxsCisgICAgICogcG9wdWxhdGUgdGhlIDgwMi4xMWggY2hhbm5lbCBzd2l0Y2ggSUUgaW4gaXRzIEJlYWNvbnMgYW5kIFByb2JlCisgICAgICogUmVzcG9uc2VzLgorICAgICAqLworICAgIGlmICggKHBNYWMtPmxpbS5nTGltMTFoRW5hYmxlKSAmJgorICAgICAgICAgKHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hDb3VudCAhPSAwKSAmJgorICAgICAgICAgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZG90MTFoQ2hhblN3U3RhdGUgPT0gZUxJTV8xMUhfQ0hBTlNXX1JVTk5JTkcpKQorCisgICAgeworICAgICAgUG9wdWxhdGVEb3QxMWZDaGFuU3dpdGNoQW5uKCBwTWFjLCAmYmNuMi5DaGFuU3dpdGNoQW5uICk7CisgICAgICBQb3B1bGF0ZURvdDExZkV4dENoYW5Td2l0Y2hBbm4ocE1hYywgJmJjbjIuRXh0Q2hhblN3aXRjaEFubik7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlICE9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUIpCisgICAgICAgIFBvcHVsYXRlRG90MTFmRVJQSW5mbyggcE1hYywgJmJjbjIuRVJQSW5mbywgcHNlc3Npb25FbnRyeSApOworCisgICAgaWYocHNlc3Npb25FbnRyeS0+aHRDYXBhYmFsaXR5KQorICAgIHsKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZIVENhcHMoIHBNYWMsICZiY24yLkhUQ2FwcyApOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZIVEluZm8oIHBNYWMsICZiY24yLkhUSW5mbywgcHNlc3Npb25FbnRyeSApOworI2Vsc2UKKyAgICAgICAgUG9wdWxhdGVEb3QxMWZIVEluZm8oIHBNYWMsICZiY24yLkhUSW5mbyApOworI2VuZGlmCisgICAgfQorCisgICAgUG9wdWxhdGVEb3QxMWZFeHRTdXBwUmF0ZXMoIHBNYWMsIFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJjbjIuRXh0U3VwcFJhdGVzLCBwc2Vzc2lvbkVudHJ5ICk7CisgCisgICAgaWYoIHBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcSAhPSBOVUxMICkKKyAgICB7CisgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXUEEoIHBNYWMsICZwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPnJzbklFLAorICAgICAgICAgICAgICAgICAgICAgICAmYmNuMi5XUEEgKTsKKyAgICAgICAgICBQb3B1bGF0ZURvdDExZlJTTiggcE1hYywgJnBzZXNzaW9uRW50cnktPnBMaW1TdGFydEJzc1JlcS0+cnNuSUUsCisgICAgICAgICAgICAgICAgICAgICAgICZiY24yLlJTTiApOworICAgIH0KKworICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVdtZUVuYWJsZWQpCisgICAgeworICAgICAgICBQb3B1bGF0ZURvdDExZldNTSggcE1hYywgJmJjbjIuV01NSW5mb0FwLCAmYmNuMi5XTU1QYXJhbXMsICZiY24yLldNTUNhcHMsIHBzZXNzaW9uRW50cnkpOworICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgeworICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT53cHNfc3RhdGUgIT0gU0FQX1dQU19ESVNBQkxFRCkKKyAgICAgICAgeworICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZCZWFjb25XUFNJRXMoIHBNYWMsICZiY24yLldzY0JlYWNvbiwgcHNlc3Npb25FbnRyeSk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNlbmRpZgorICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCAodEFOSV9VMTYpIFdOSV9DRkdfV1BTX0VOQUJMRSwgJnRtcCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwiRmFpbGVkIHRvIGNmZyBnZXQgaWQgJWRcbiIsIFdOSV9DRkdfV1BTX0VOQUJMRSApOworICAgIAorICAgIHdwc0FwRW5hYmxlID0gdG1wICYgV05JX0NGR19XUFNfRU5BQkxFX0FQOworICAgIAorICAgIGlmICh3cHNBcEVuYWJsZSkKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmV3NjKHBNYWMsICZiY24yLldzY0JlYWNvbik7CisgICAgfQorCisgICAgaWYgKHBNYWMtPmxpbS53c2NJZUluZm8ud3NjRW5yb2xsbWVudFN0YXRlID09IGVMSU1fV1NDX0VOUk9MTF9CRUdJTikKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmV3NjUmVnaXN0cmFySW5mbyhwTWFjLCAmYmNuMi5Xc2NCZWFjb24pOworICAgICAgICBwTWFjLT5saW0ud3NjSWVJbmZvLndzY0Vucm9sbG1lbnRTdGF0ZSA9IGVMSU1fV1NDX0VOUk9MTF9JTl9QUk9HUkVTUzsKKyAgICB9CisKKyAgICBpZiAocE1hYy0+bGltLndzY0llSW5mby53c2NFbnJvbGxtZW50U3RhdGUgPT0gZUxJTV9XU0NfRU5ST0xMX0VORCkKKyAgICB7CisgICAgICAgIERlUG9wdWxhdGVEb3QxMWZXc2NSZWdpc3RyYXJJbmZvKHBNYWMsICZiY24yLldzY0JlYWNvbik7CisgICAgICAgIHBNYWMtPmxpbS53c2NJZUluZm8ud3NjRW5yb2xsbWVudFN0YXRlID0gZUxJTV9XU0NfRU5ST0xMX05PT1A7CisgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgICAgCisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYoKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKSAKKyAgICAgICAgJiYgKHBzZXNzaW9uRW50cnktPnByb3h5UHJvYmVSc3BFbikpCisgICAgeworICAgICAgICAvKiBDYW4gYmUgZWZmaWNpZW50bHkgdXBkYXRlZCB3aGVuZXZlciBuZXcgSUUgYWRkZWQgIGluIFByb2JlIHJlc3BvbnNlIGluIGZ1dHVyZSAqLworICAgICAgICBsaW1VcGRhdGVQcm9iZVJzcFRlbXBsYXRlSWVCaXRtYXBCZWFjb24yKHBNYWMsJmJjbjIsJnBzZXNzaW9uRW50cnktPkRlZlByb2JlUnNwSWVCaXRtYXBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNlc3Npb25FbnRyeS0+cHJvYmVSZXNwRnJhbWUpOworCisgICAgICAgIC8qIHVwZGF0ZSBwcm9iZSByZXNwb25zZSBXUFMgSUUgaW5zdGVhZCBvZiBiZWFjb24gV1BTIElFCisgICAgICAgICogKi8KKyAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+d3BzX3N0YXRlICE9IFNBUF9XUFNfRElTQUJMRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPkFQV1BTSUVzLlNpcldQU1Byb2JlUnNwSUUuRmllbGRQcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBvcHVsYXRlRG90MTFmUHJvYmVSZXNXUFNJRXMocE1hYywgJldzY1Byb2JlUmVzLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXc2NQcm9iZVJlcy5wcmVzZW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKFdzY1Byb2JlUmVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0UHJvYmVSc3BJZUJpdG1hcCgmcHNlc3Npb25FbnRyeS0+RGVmUHJvYmVSc3BJZUJpdG1hcFswXSxTSVJfTUFDX1dQQV9FSUQpOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwc2Vzc2lvbkVudHJ5LT5wcm9iZVJlc3BGcmFtZS5Xc2NQcm9iZVJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZXc2NQcm9iZVJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV3NjUHJvYmVSZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmCisKKyAgICBuU3RhdHVzID0gZG90MTFmUGFja0JlYWNvbjIoIHBNYWMsICZiY24yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uRnJhbWVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hfTUFYX0JFQUNPTl9TSVpFLCAmbkJ5dGVzICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgIHNjaExvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwYWNrZWQgYSB0RG90MTFmQmVhY29uMiAoMHglMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjh4LikuXG4iKSwgblN0YXR1cyApOworICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgc2NoTG9nKCBwTWFjLCBMT0dFLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBwYWNraW5nIGEgdERvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidDExZkJlYWNvbjIgKDB4JTA4eC4pLlxuIiksIG5TdGF0dXMgKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFdMQU5fU09GVEFQX0ZFQVRVUkUpICYmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1AyUCkKKyAgICBwRXh0cmFJZSA9IHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbkZyYW1lRW5kICsgbkJ5dGVzOworICAgIGV4dHJhSWVPZmZzZXQgPSBuQnl0ZXM7CisjZW5kaWYKKworICAgIC8vVE9ETzogQXBwZW5kIGFkZGl0aW9uYWwgSUUgaGVyZS4KKyAgICBzY2hBcHBlbmRBZGRuSUUocE1hYywgcHNlc3Npb25FbnRyeSwgCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbkZyYW1lRW5kICsgbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICBTQ0hfTUFYX0JFQUNPTl9TSVpFLCAmbkJ5dGVzKTsKKworICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbk9mZnNldEVuZCA9ICggdEFOSV9VMTYgKW5CeXRlczsKKworI2lmIGRlZmluZWQoV0xBTl9TT0ZUQVBfRkVBVFVSRSkgJiYgZGVmaW5lZChXTEFOX0ZFQVRVUkVfUDJQKQorICAgIGV4dHJhSWVMZW4gPSBuQnl0ZXMgLSBleHRyYUllT2Zmc2V0OworCisgICAgLy9HZXQgdGhlIHAycCBJZSBPZmZzZXQKKyAgICBzdGF0dXMgPSBzY2hHZXRQMnBJZU9mZnNldChwRXh0cmFJZSwgZXh0cmFJZUxlbiwgJnAycEllT2Zmc2V0KTsKKworICAgIGlmKGVTSVJfU1VDQ0VTUyA9PSBzdGF0dXMpCisgICAgeworICAgICAgIC8vVXBkYXRlIHRoZSBQMlAgSWUgT2Zmc2V0CisgICAgICAgcE1hYy0+c2NoLnNjaE9iamVjdC5wMnBJZU9mZnNldCA9IAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25PZmZzZXRCZWdpbiArIFRJTV9JRV9TSVpFICsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFJZU9mZnNldCArIHAycEllT2Zmc2V0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHBNYWMtPnNjaC5zY2hPYmplY3QucDJwSWVPZmZzZXQgPSAwOworICAgIH0KKyNlbmRpZgorCisgICAgc2NoTG9nKCBwTWFjLCBMT0cxLCBGTCgiSW5pdGlhbGl6ZWQgYmVhY29uIGVuZCwgb2Zmc2V0ICVkXG4iKSwKKyAgICAgICAgICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbk9mZnNldEVuZCApOworCisgICAgcE1hYy0+c2NoLnNjaE9iamVjdC5mQmVhY29uQ2hhbmdlZCA9IDE7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordm9pZCBsaW1VcGRhdGVQcm9iZVJzcFRlbXBsYXRlSWVCaXRtYXBCZWFjb24xKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbjEqIGJlYWNvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIqIERlZlByb2JlUnNwSWVCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlByb2JlUmVzcG9uc2UqIHByYl9yc3ApCit7CisgICAgcHJiX3JzcC0+QmVhY29uSW50ZXJ2YWwgPSBiZWFjb24xLT5CZWFjb25JbnRlcnZhbDsKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKikmcHJiX3JzcC0+Q2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmJlYWNvbjEtPkNhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmVhY29uMS0+Q2FwYWJpbGl0aWVzKSk7CisKKyAgICAvKiBTU0lEICovCisgICAgaWYoYmVhY29uMS0+U1NJRC5wcmVzZW50KQorICAgIHsKKyAgICAgICAgU2V0UHJvYmVSc3BJZUJpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLFNJUl9NQUNfU1NJRF9FSUQpOworICAgICAgICAvKiBwb3B1bGF0aW5nIGl0ICwgYmVjYXVzZSBwcm9iZSByZXNwb25zZSBoYXMgdG8gZ28gd2l0aCBTU0lEIGV2ZW4gaW4gaGlkZGVuIGNhc2UgKi8KKyAgICAgICAgUG9wdWxhdGVEb3QxMWZTU0lEMiggcE1hYywgJnByYl9yc3AtPlNTSUQgKTsKKyAgICB9CisgICAgLyogc3VwcG9ydGVkIHJhdGVzICovCisgICAgaWYoYmVhY29uMS0+U3VwcFJhdGVzLnByZXNlbnQpCisgICAgeworICAgICAgICBTZXRQcm9iZVJzcEllQml0bWFwKERlZlByb2JlUnNwSWVCaXRtYXAsU0lSX01BQ19SQVRFU0VUX0VJRCk7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwodm9pZCAqKSZwcmJfcnNwLT5TdXBwUmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmYmVhY29uMS0+U3VwcFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihiZWFjb24xLT5TdXBwUmF0ZXMpKTsKKworICAgIH0KKyAgICAvKiBEUyBQYXJhbWV0ZXIgc2V0ICovCisgICAgaWYoYmVhY29uMS0+RFNQYXJhbXMucHJlc2VudCkKKyAgICB7CisgICAgICAgIFNldFByb2JlUnNwSWVCaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCxTSVJfTUFDX0RTX1BBUkFNX1NFVF9FSUQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKikmcHJiX3JzcC0+RFNQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmYmVhY29uMS0+RFNQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJlYWNvbjEtPkRTUGFyYW1zKSk7CisKKyAgICB9CisKKyAgICAvKiBJQlNTIHBhcmFtcyB3aWxsIG5vdCBiZSBwcmVzZW50IGluIHRoZSBCZWFjb25zIHRyYW5zbWl0dGVkIGJ5IEFQICovCit9CisKK3ZvaWQgbGltVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZUllQml0bWFwQmVhY29uMih0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb24yKiBiZWFjb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyKiBEZWZQcm9iZVJzcEllQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZQcm9iZVJlc3BvbnNlKiBwcmJfcnNwKQoreworICAgIC8qIElCU1MgcGFyYW1ldGVyIHNldCAtIHdpbGwgbm90IGJlIHByZXNlbnQgaW4gcHJvYmUgcmVzcG9uc2UgdHggYnkgQVAgKi8KKyAgICAvKiBjb3VudHJ5ICovCisgICAgaWYoYmVhY29uMi0+Q291bnRyeS5wcmVzZW50KQorICAgIHsKKyAgICAgICAgU2V0UHJvYmVSc3BJZUJpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLFNJUl9NQUNfQ09VTlRSWV9FSUQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKikmcHJiX3JzcC0+Q291bnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZiZWFjb24yLT5Db3VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihiZWFjb24yLT5Db3VudHJ5KSk7CisKKyAgICB9CisgICAgLyogUG93ZXIgY29uc3RyYWludCAqLworICAgIGlmKGJlYWNvbjItPlBvd2VyQ29uc3RyYWludHMucHJlc2VudCkKKyAgICB7CisgICAgICAgIFNldFByb2JlUnNwSWVCaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCxTSVJfTUFDX1BXUl9DT05TVFJBSU5UX0VJRCk7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwodm9pZCAqKSZwcmJfcnNwLT5Qb3dlckNvbnN0cmFpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmJlYWNvbjItPlBvd2VyQ29uc3RyYWludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJlYWNvbjItPlBvd2VyQ29uc3RyYWludHMpKTsKKworICAgIH0KKyAgICAvKiBDaGFubmVsIFN3aXRjaCBBbm5vb3VuY2VtZW50IFNJUl9NQUNfQ0hOTF9TV0lUQ0hfQU5OX0VJRCAqLworICAgIGlmKGJlYWNvbjItPkNoYW5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICB7CisgICAgICAgIFNldFByb2JlUnNwSWVCaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCxTSVJfTUFDX0NITkxfU1dJVENIX0FOTl9FSUQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKikmcHJiX3JzcC0+Q2hhblN3aXRjaEFubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZiZWFjb24yLT5DaGFuU3dpdGNoQW5uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihiZWFjb24yLT5DaGFuU3dpdGNoQW5uKSk7CisKKyAgICB9CisgICAgLyogRVJQIGluZm9ybWF0aW9uICovCisgICAgaWYoYmVhY29uMi0+RVJQSW5mby5wcmVzZW50KQorICAgIHsKKyAgICAgICAgU2V0UHJvYmVSc3BJZUJpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLFNJUl9NQUNfRVJQX0lORk9fRUlEKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCh2b2lkICopJnByYl9yc3AtPkVSUEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmYmVhY29uMi0+RVJQSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmVhY29uMi0+RVJQSW5mbykpOworCisgICAgfQorICAgIC8qIEV4dGVuZGVkIHN1cHBvcnRlZCByYXRlcyAqLworICAgIGlmKGJlYWNvbjItPkV4dFN1cHBSYXRlcy5wcmVzZW50KQorICAgIHsKKyAgICAgICAgU2V0UHJvYmVSc3BJZUJpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLFNJUl9NQUNfRVhURU5ERURfUkFURV9FSUQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKikmcHJiX3JzcC0+RXh0U3VwcFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmJlYWNvbjItPkV4dFN1cHBSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmVhY29uMi0+RXh0U3VwcFJhdGVzKSk7CisKKyAgICB9CisKKyAgICAvKiBXUEEgKi8KKyAgICBpZihiZWFjb24yLT5XUEEucHJlc2VudCkKKyAgICB7CisgICAgICAgIFNldFByb2JlUnNwSWVCaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCxTSVJfTUFDX1dQQV9FSUQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKikmcHJiX3JzcC0+V1BBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmJlYWNvbjItPldQQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmVhY29uMi0+V1BBKSk7CisKKyAgICB9CisKKyAgICAvKiBSU04gKi8KKyAgICBpZihiZWFjb24yLT5SU04ucHJlc2VudCkKKyAgICB7CisgICAgICAgIFNldFByb2JlUnNwSWVCaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCxTSVJfTUFDX1JTTl9FSUQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKikmcHJiX3JzcC0+UlNOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmJlYWNvbjItPlJTTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmVhY29uMi0+UlNOKSk7CisKKyAgICB9CisvKgorICAgIC8vIEJTUyBsb2FkCisgICAgaWYoYmVhY29uMi0+UUJTU0xvYWQucHJlc2VudCkKKyAgICB7CisgICAgICAgIFNldFByb2JlUnNwSWVCaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCxTSVJfTUFDX1FCU1NfTE9BRF9FSUQpOworICAgIH0KKyovCisgICAgLyogRURDQSBQYXJhbWV0ZXIgc2V0ICovCisgICAgaWYoYmVhY29uMi0+RURDQVBhcmFtU2V0LnByZXNlbnQpCisgICAgeworICAgICAgICBTZXRQcm9iZVJzcEllQml0bWFwKERlZlByb2JlUnNwSWVCaXRtYXAsU0lSX01BQ19FRENBX1BBUkFNX1NFVF9FSUQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKikmcHJiX3JzcC0+RURDQVBhcmFtU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmJlYWNvbjItPkVEQ0FQYXJhbVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmVhY29uMi0+RURDQVBhcmFtU2V0KSk7CisKKyAgICB9CisgICAgLyogVmVuZG9yIHNwZWNpZmljIC0gY3VycmVudGx5IG5vIHZlbmRvciBzcGVjaWZpYyBJRXMgYWRkZWQgKi8KKyAgICAvKiBSZXF1ZXN0ZWQgSUVzIC0gY3VycmVudGx5IHdlIGFyZSBub3QgcHJvY2Vzc2luZyB0aGlzIHdpbGwgYmUgYWRkZWQgbGF0ZXIgKi8KKyAgICAvL0hUIGNhcGFiaWxpdHkgSUUKKyAgICBpZihiZWFjb24yLT5IVENhcHMucHJlc2VudCkKKyAgICB7CisgICAgICAgIFNldFByb2JlUnNwSWVCaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCxTSVJfTUFDX0hUX0NBUEFCSUxJVElFU19FSUQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsKHZvaWQgKikmcHJiX3JzcC0+SFRDYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmJlYWNvbjItPkhUQ2FwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmVhY29uMi0+SFRDYXBzKSk7CisgICAgfQorICAgIC8vIEhUIEluZm8gSUUKKyAgICBpZihiZWFjb24yLT5IVEluZm8ucHJlc2VudCkKKyAgICB7CisgICAgICAgIFNldFByb2JlUnNwSWVCaXRtYXAoRGVmUHJvYmVSc3BJZUJpdG1hcCxTSVJfTUFDX0hUX0lORk9fRUlEKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCh2b2lkICopJnByYl9yc3AtPkhUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZiZWFjb24yLT5IVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJlYWNvbjItPkhUSW5mbykpOworICAgIH0KKworICAgIC8vV01NIElFCisgICAgaWYoYmVhY29uMi0+V01NUGFyYW1zLnByZXNlbnQpCisgICAgeworICAgICAgICBTZXRQcm9iZVJzcEllQml0bWFwKERlZlByb2JlUnNwSWVCaXRtYXAsU0lSX01BQ19XUEFfRUlEKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCh2b2lkICopJnByYl9yc3AtPldNTVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZiZWFjb24yLT5XTU1QYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJlYWNvbjItPldNTVBhcmFtcykpOworICAgIH0KKyAgICAvL1dNTSBjYXBhYmlsaXR5IC0gbW9zdCBvZiB0aGUgY2FzZSB3b24ndCBiZSBwcmVzZW50CisgICAgaWYoYmVhY29uMi0+V01NQ2Fwcy5wcmVzZW50KQorICAgIHsKKyAgICAgICAgU2V0UHJvYmVSc3BJZUJpdG1hcChEZWZQcm9iZVJzcEllQml0bWFwLFNJUl9NQUNfV1BBX0VJRCk7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwodm9pZCAqKSZwcmJfcnNwLT5XTU1DYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmJlYWNvbjItPldNTUNhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJlYWNvbjItPldNTUNhcHMpKTsKKyAgICB9CisKK30KKwordm9pZCBTZXRQcm9iZVJzcEllQml0bWFwKHRBTklfVTMyKiBJZUJpdG1hcCx0QU5JX1UzMiBwb3MpCit7CisgICAgdEFOSV9VMzIgaW5kZXgsdGVtcDsKKworICAgIGluZGV4ID0gcG9zID4+IDU7CisgICAgaWYoaW5kZXggPj0gOCApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHRlbXAgPSBJZUJpdG1hcFtpbmRleF07CisKKyAgICB0ZW1wIHw9IDEgPDwgKHBvcyAmIDB4MUYpOworCisgICAgSWVCaXRtYXBbaW5kZXhdID0gdGVtcDsKK30KKworI2VuZGlmCisKKyNpZmRlZiBBTklfUFJPRFVDVF9UWVBFX0FQCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgICogICAgIEBmdW5jdGlvbiA6IHNjaFVwZGF0ZUNmcFBhcmFtCisgICogICAgIEBicmllZiAgICAgIDogR2VuZXJhdGUgdGhlIENGUCBQYXJhbWV0ZXIgU2V0CisgICogICAgIAorICAqICAgICBAcGFyYW0gICAgOiAgcE1hYyAtIHRwQW5pU2lyR2xvYmFsCisgICogICAgICAgICAgICAgICAgICAgICAgIHB0ciAgICAtIFBvaW50ZXIgdG8gdGhlIEJlYWNvbkZyYW1lCisgICogICAgICAgICAgICAgICAgICAgICAgIHBiZWFjb25TaXplIC0gVGhlIGJlYWNvblNpemUKKyAgKgorICAqICAgICBAcmV0dXJuICAgIDogIFJldHVybiB0aGUgVXBkYXRlZCBQdHJsb2NhdGlvbgorICAqLworc3RhdGljIHRBTklfVTggKgorX19zY2hVcGRhdGVDZnBQYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwdHIsIHRBTklfVTMyICpwYmVhY29uU2l6ZSkKK3sgIAorICAgIHRBTklfVTMyIHZhbDsKKworICAgICpwdHIrKyA9IFNJUl9NQUNfQ0ZfUEFSQU1fU0VUX0VJRDsKKyAgICAqcHRyKysgPSBTSVJfTUFDX0NGX1BBUkFNX1NFVF9FSURfTUlOOworCisgICAgd2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19DRlBfUEVSSU9ELCAmdmFsKTsKKyAgICBpZiAoKytwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hDRlBDb3VudCA9PSB2YWwpCisgICAgICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaENGUENvdW50ID0gMDsKKworICAgICpwdHIrKyA9IHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaENGUENvdW50OworICAgICpwdHIrKyA9ICh0QU5JX1U4KXZhbDsKKworICAgIHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQ0ZQX01BWF9EVVJBVElPTiwgJnZhbCk7CisgICAgcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQ0ZQTWF4RHVyYXRpb24gPSAodEFOSV9VOCl2YWw7CisKKyAgICBzaXJTdG9yZVUxNihwdHIsICh0QU5JX1UxNil2YWwpOworICAgIHB0ciArPSAyOworCisgICAgaWYgKHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaENGUENvdW50ID09IDApCisgICAgICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaENGUER1clJlbWFpbmluZyA9IHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaENGUE1heER1cmF0aW9uOworICAgIGVsc2UgaWYgKHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaENGUER1clJlbWFpbmluZyA+IHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbkludGVydmFsKQorICAgICAgICBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hDRlBEdXJSZW1haW5pbmcgLT0gcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uSW50ZXJ2YWw7CisgICAgZWxzZQorICAgICAgICBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hDRlBEdXJSZW1haW5pbmcgPSAwOworCisgICAgc2lyU3RvcmVVMTYocHRyLCBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hDRlBEdXJSZW1haW5pbmcpOworICAgIHB0ciArPSAyOworCisgICAgKCpwYmVhY29uU2l6ZSkgKz0gMiArIFNJUl9NQUNfQ0ZfUEFSQU1fU0VUX0VJRF9NSU47CisKKyAgICByZXR1cm4gcHRyOworfQorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogd3JpdGVCZWFjb25Ub01lbW9yeQorICoKKyAqIEZVTkNUSU9OOgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIE5vbmUKKyAqIEBwYXJhbSBzaXplICAgIFNpemUgb2YgdGhlIGJlYWNvbiB0byB3cml0ZSB0byBtZW1vcnkKKyAqIEBwYXJhbSBsZW5ndGggTGVuZ3RoIGZpZWxkIG9mIHRoZSBiZWFjb24gdG8gd3JpdGUgdG8gbWVtb3J5CisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkIHdyaXRlQmVhY29uVG9NZW1vcnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgc2l6ZSwgdEFOSV9VMTYgbGVuZ3RoLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTE2ICAgICAgICAgIGk7CisgICAgdHBBbmlCZWFjb25TdHJ1Y3QgcEJlYWNvbjsKKworICAgIC8vIGNvcHkgZW5kIG9mIGJlYWNvbiBvbmx5IGlmIGxlbmd0aCA+IDAKKyAgICBpZiAobGVuZ3RoID4gMCkKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpIDwgcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uT2Zmc2V0RW5kOyBpKyspCisgICAgICAgICAgICBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25GcmFtZUJlZ2luW3NpemUrK10gPSBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25GcmFtZUVuZFtpXTsKKyAgICB9CisgICAgCisgICAgLy8gVXBkYXRlIHRoZSBiZWFjb24gbGVuZ3RoCisgICAgcEJlYWNvbiA9ICh0cEFuaUJlYWNvblN0cnVjdCkgcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uRnJhbWVCZWdpbjsKKyAgICAvLyBEbyBub3QgaW5jbHVkZSB0aGUgYmVhY29uTGVuZ3RoIGluZGljYXRvciBpdHNlbGYKKyAgICBpZiAobGVuZ3RoID09IDApCisgICAgeworICAgICAgICBwQmVhY29uLT5iZWFjb25MZW5ndGggPSAwOworICAgICAgICAvLyBEb250IGNvcHkgZW50aXJlIGJlYWNvbiwgQ29weSBsZW5ndGggZmllbGQgYWxvbmUKKyAgICAgICAgc2l6ZSA9IDQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcEJlYWNvbi0+YmVhY29uTGVuZ3RoID0gKHRBTklfVTMyKSBzaXplIC0gc2l6ZW9mKCB0QU5JX1UzMiApOworCisgICAgLy8gd3JpdGUgc2l6ZSBieXRlcyBmcm9tIGdTY2hCZWFjb25GcmFtZUJlZ2luCisgICAgUEVMT0cyKHNjaExvZyhwTWFjLCBMT0cyLCBGTCgiQmVhY29uIHNpemUgLSAlZCBieXRlc1xuIiksIHNpemUpOykKKyAgICBQRUxPRzIoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfU0NIX01PRFVMRV9JRCwgTE9HMiwgcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uRnJhbWVCZWdpbiwgc2l6ZSk7KQorCisgICAgaWYgKCEgcE1hYy0+c2NoLnNjaE9iamVjdC5mQmVhY29uQ2hhbmdlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcE1hYy0+c2NoLmdTY2hHZW5CZWFjb24gPSAxOworICAgIGlmIChwTWFjLT5zY2guZ1NjaEdlbkJlYWNvbikKKyAgICB7CisgICAgICAgIHBNYWMtPnNjaC5nU2NoQmVhY29uc1NlbnQrKzsKKworICAgICAgICAvLworICAgICAgICAvLyBDb3B5IGJlYWNvbiBkYXRhIHRvIFNvZnRNQUMgc2hhcmVkIG1lbW9yeS4uLgorICAgICAgICAvLyBEbyB0aGlzIGJ5IHNlbmRpbmcgYSBtZXNzYWdlIHRvIEhBTAorICAgICAgICAvLworCisgICAgICAgIHNpemUgPSAoc2l6ZSArIDMpICYgKH4zKTsKKyAgICAgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSBzY2hTZW5kQmVhY29uUmVxKCBwTWFjLCBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25GcmFtZUJlZ2luLCBzaXplICwgcHNlc3Npb25FbnRyeSkpCisgICAgICAgICAgICBQRUxPR0Uoc2NoTG9nKHBNYWMsIExPR0UsIEZMKCJzY2hTZW5kQmVhY29uUmVxKCkgcmV0dXJuZWQgYW4gZXJyb3IgKHpzaXplICVkKVxuIiksIHNpemUpOykKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5zY2guZ1NjaEJlYWNvbnNXcml0dGVuKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcE1hYy0+c2NoLnNjaE9iamVjdC5mQmVhY29uQ2hhbmdlZCA9IDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIEBmdW5jdGlvbjogU2NoUHJvY2Vzc1ByZUJlYWNvbkluZAorICoKKyAqIEBicmllZiA6IFByb2Nlc3MgdGhlIFByZUJlYWNvbiBJbmRpY2F0aW9uIGZyb20gdGhlIExpbQorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIDogcE1hYyAtIHRwQW5pU2lyR2xvYmFsCisgKgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorc2NoUHJvY2Vzc1ByZUJlYWNvbkluZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpck1zZ1EgbGltTXNnKQoreworICAgIHRwQmVhY29uR2VuUGFyYW1zICBwTXNnID0gKHRwQmVhY29uR2VuUGFyYW1zKWxpbU1zZy0+Ym9keXB0cjsKKyAgICB0QU5JX1UzMiBiZWFjb25TaXplID0gcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQmVhY29uT2Zmc2V0QmVnaW47CisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeTsKKyAgICB0QU5JX1U4IHNlc3Npb25JZDsKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYyxwTXNnLT5ic3NJZCwgJnNlc3Npb25JZCkpPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBFTE9HRShzY2hMb2cocE1hYywgTE9HRSwgRkwoInNlc3Npb24gbG9va3VwIGZhaWxzXG4iKSk7KQorICAgICAgICBnb3RvIGVuZDsKKyAgICB9IAorICAgICAgICAgICAKKworCisgICAgLy8gSWYgU01FIGlzIG5vdCBpbiBub3JtYWwgbW9kZSwgbm8gbmVlZCB0byBnZW5lcmF0ZSBiZWFjb24KKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU21lU3RhdGUgICE9IGVMSU1fU01FX05PUk1BTF9TVEFURSkKKyAgICB7CisgICAgICAgIFBFTE9HRShzY2hMb2cocE1hYywgTE9HMSwgRkwoIlByZUJlYWNvbkluZCByZWNlaXZlZCBpbiBpbnZhbGlkIHN0YXRlOiAlZFxuIiksIHBzZXNzaW9uRW50cnktPmxpbVNtZVN0YXRlKTspCisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHN3aXRjaChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKXsKKworICAgIGNhc2UgZUxJTV9TVEFfSU5fSUJTU19ST0xFOgorICAgIGNhc2UgZUxJTV9CVF9BTVBfQVBfUk9MRToKKyAgICBjYXNlIGVMSU1fQlRfQU1QX1NUQV9ST0xFOgorICAgICAgICAvLyBnZW5lcmF0ZSBJQlNTIHBhcmFtZXRlciBzZXQKKyAgICAgICAgaWYocHNlc3Npb25FbnRyeS0+c3RhdHlwZUZvckJzcyA9PSBTVEFfRU5UUllfU0VMRikKKyAgICAgICAgICAgIHdyaXRlQmVhY29uVG9NZW1vcnkocE1hYywgKHRBTklfVTE2KSBiZWFjb25TaXplLCAodEFOSV9VMTYpYmVhY29uU2l6ZSwgcHNlc3Npb25FbnRyeSk7CisgICAgZWxzZQorICAgICAgICBQRUxPR0Uoc2NoTG9nKHBNYWMsIExPR0UsIEZMKCJjYW4gbm90IHNlbmQgYmVhY29uIGZvciBQRUVSIHNlc3Npb24gZW50cnlcbiIpKTspCisgICAgICAgIGJyZWFrOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGNhc2UgZUxJTV9BUF9ST0xFOnsKKyAgICAgICAgIHRBTklfVTggKnB0ciA9ICZwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25GcmFtZUJlZ2luW3BNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbk9mZnNldEJlZ2luXTsKKyAgICAgICAgIHRBTklfVTE2IHRpbUxlbmd0aCA9IDA7CisgICAgICAgICBpZihwc2Vzc2lvbkVudHJ5LT5zdGF0eXBlRm9yQnNzID09IFNUQV9FTlRSWV9TRUxGKXsKKyAgICAgICAgICAgICBwbW1HZW5lcmF0ZVRJTShwTWFjLCAmcHRyLCAmdGltTGVuZ3RoLCBwc2Vzc2lvbkVudHJ5LT5kdGltUGVyaW9kKTsKKyAgICAgICAgIGJlYWNvblNpemUgKz0gMiArIHRpbUxlbmd0aDsKKyAgICAgICAgIHdyaXRlQmVhY29uVG9NZW1vcnkocE1hYywgKHRBTklfVTE2KSBiZWFjb25TaXplLCAodEFOSV9VMTYpYmVhY29uU2l6ZSwgcHNlc3Npb25FbnRyeSk7CisgICAgIH0KKyAgICAgZWxzZQorICAgICAgICAgUEVMT0dFKHNjaExvZyhwTWFjLCBMT0dFLCBGTCgiY2FuIG5vdCBzZW5kIGJlYWNvbiBmb3IgUEVFUiBzZXNzaW9uIGVudHJ5XG4iKSk7KQorICAgICAgICAgfQorICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgIGNhc2UgZUxJTV9BUF9ST0xFOiAKKyAgICB7CisgICAgICAgIHRBTklfVTggKnB0ciA9ICZwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25GcmFtZUJlZ2luW3BNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbk9mZnNldEJlZ2luXTsKKyAgICAgICAgdEFOSV9VMTYgdGltTGVuZ3RoID0gMDsKKworICAgICAgICBpZiAocE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQ0ZQRW5hYmxlZCkKKyAgICAgICAgICBwdHIgPSBfX3NjaFVwZGF0ZUNmcFBhcmFtKCBwTWFjLCBwdHIsICZiZWFjb25TaXplKTsKKworICAgICAgICAvLyBnZW5lcmF0ZSBUSU0KKyAgICAgICAgcG1tR2VuZXJhdGVUSU0ocE1hYywgJnB0ciwgJnRpbUxlbmd0aCk7CisgICAgICAgIGJlYWNvblNpemUgKz0gMiArIHRpbUxlbmd0aDsKKworICAgICAgICAvKioKKyAgICAgICAgKiBTYWZlIHRvIGNhbGwgdGhpcyBlYWNoIHRpbWUuCisgICAgICAgICogQmFzZWQgb24gdGhlIHJlcXVpcmVtZW50IGZvciB1cGRhdGluZyB0aGUKKyAgICAgICAgKiBmaXhlZCBiZWFjb24gZmllbGRzLCB0aGlzIHJvdXRpbmUgd2lsbAorICAgICAgICAqIGFwcHJvcHJpYXRlbHkgdXBkYXRlIHRoZSBmaXhlZCBmaWVsZHMKKyAgICAgICAgKi8KKyAgICAgICAgc3BlY2lhbEJlYWNvblByb2Nlc3NpbmcocE1hYywgYmVhY29uU2l6ZSk7CisgICAgICAgIHdyaXRlQmVhY29uVG9NZW1vcnkocE1hYywgYmVhY29uU2l6ZSwgYmVhY29uU2l6ZSwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIHBtbUhhbmRsZVRpbUJhc2VkRGlzYXNzb2NpYXRpb24oIHBNYWMsIHBzZXNzaW9uRW50cnkgKTsKKyAgICB9CisgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICAgIFBFTE9HRShzY2hMb2cocE1hYywgTE9HRSwgRkwoIkVycm9yLVBFIGhhcyBSZWNlaXZlIFByZUJlY29uR2VuSW5kaWNhdGlvbiB3aGVuIFN5c3RlbSBpcyBpbiAlZCByb2xlIiksCisgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlKTspCisgICAgfQorCitlbmQ6CisgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCopcE1zZyk7CisKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFxmbiAgICAgICBzcGVjaWFsQmVhY29uUHJvY2Vzc2luZworIFxicmllZiAgIFRvIGFkZC91cGRhdGUgY2hhbm5lbCBzd2l0Y2ggSUUvIFF1aWV0IElFIGluIGJlYWNvbnMuCisgICAgICAgICAgQW5kIGFsc28gdG8gcmVzdW1lIHRyYW5zbWlzc2lvbiBhbmQgbWVhc3VyZW1lbnQgYWZ0ZXIKKyAgICAgICAgICBzd2l0Y2hpbmcgdGhlIGNoYW5uZWwuCisgICAgICAKKyBccGFyYW0gICBwTWFjCisgXHBhcmFtICAgYmVhY29uU2l6ZSAgU2l6ZSBvZiB0aGUgYmVhY29uCisgXHJldHVybiAgIE5PTkUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQU5JX1BST0RVQ1RfVFlQRV9BUAorCitzdGF0aWMgdm9pZAorc3BlY2lhbEJlYWNvblByb2Nlc3NpbmcoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGJlYWNvblNpemUpCit7CisKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gJnBNYWMtPmxpbS5ncFNlc3Npb25bMF07IC8vVEJELVJBSkVTSCBIT1cgVE8gR0VUIHNlc3Npb25FbnRyeT8/Pz8/CisgICAgdEFOSV9CT09MRUFOIGZCZWFjb25DaGFuZ2VkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworCisgICAgZkJlYWNvbkNoYW5nZWQgPSBsaW1VcGRhdGVRdWlldElFSW5CZWFjb25zKCBwTWFjICk7CisKKyAgICBpZigocE1hYy0+bGltLndzY0llSW5mby53c2NFbnJvbGxtZW50U3RhdGUgPT0gZUxJTV9XU0NfRU5ST0xMX0JFR0lOKSB8fAorICAgICAgIChwTWFjLT5saW0ud3NjSWVJbmZvLndzY0Vucm9sbG1lbnRTdGF0ZSA9PSBlTElNX1dTQ19FTlJPTExfRU5EKSkKKyAgICB7CisgICAgICAgIGZCZWFjb25DaGFuZ2VkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgfQorCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIFByb2Nlc3NpbmcgQ2hhbm5lbCBTd2l0Y2ggSUUKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5kb3QxMWhDaGFuU3dTdGF0ZSA9PSBlTElNXzExSF9DSEFOU1dfUlVOTklORykKKyAgICB7CisgICAgICAgIGZCZWFjb25DaGFuZ2VkID0gZUFOSV9CT09MRUFOX1RSVUU7CisKKyNpZiAwCisgICAgICAgIC8vIElmIHRoZSBzdGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCAxMWggb3IgaGF2ZSBsaW5rIG1vbml0b3JpbmcgZW5hYmxlZCwKKyAgICAgICAgLy8gQVAgaGFzIHRvIHNlbmQgZGlzYXNzb2MgZnJhbWUgdG8gaW5kaWNhdGUgc3RhdGlvbiBiZWZvcmUgZ29pbmcKKyAgICAgICAgLy8gdG8gbmV3IGNoYW5uZWwuIE90aGVyd2lzZSBzdGF0aW9uIHdvbnQgY29ubmVjdCB0byBBUCBpbiBuZXcgY2hhbm5lbC4KKyAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zd2l0Y2hDb3VudCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBpZigocE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN0YXRlCisgICAgICAgICAgICAgICAgPT0gZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX09OTFkpIHx8CisgICAgICAgICAgICAgICAgKHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZQorICAgICAgICAgICAgICAgID09IGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9BTkRfU0VDT05EQVJZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciAgIGJjQWRkciA9IHsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsKKworICAgICAgICAgICAgICAgIGxpbVNlbmREaXNhc3NvY01nbXRGcmFtZShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19ESVNBU1NPQ19MRUFWSU5HX0JTU19SRUFTT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjQWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAocE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaENvdW50ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogbGVuZ3RoIGlzIHNldCB0byAwLCBzbyB0aGF0IG5vIGJlYWNvbiBpcyB0cmFuc21pdHRlZCB3aXRob3V0IGNoYW5uZWwgc3dpdGNoIElFCisgICAgICAgICAgICAgICAgICAgICAgICogYmVmb3JlIHN3aXRjaGluZyAgdG8gbmV3IGNoYW5uZWwgKi8KKyAgICAgICAgICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZkJlYWNvbkNoYW5nZWQgPSAxOworICAgICAgICAgICAgd3JpdGVCZWFjb25Ub01lbW9yeShwTWFjLCBiZWFjb25TaXplLCAwLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIHNjaFNldEZpeGVkQmVhY29uRmllbGRzKHBNYWMscHNlc3Npb25FbnRyeSk7CisKKyAgICAgICAgICAgUEVMT0czKGxpbUxvZyhwTWFjLCBMT0czLCBGTCgiQ2hhbm5lbCBzd2l0Y2ggc3RhdGUgPSAlZFxuIiksIHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSk7KQorICAgICAgICAgICAgc3dpdGNoKHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfUFJJTUFSWV9PTkxZOgorICAgICAgICAgICAgICAgICAgICBsaW1Td2l0Y2hQcmltYXJ5Q2hhbm5lbChwTWFjLCBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2gucHJpbWFyeUNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVMSU1fQ0hBTk5FTF9TV0lUQ0hfU0VDT05EQVJZX09OTFk6CisgICAgICAgICAgICAgICAgICAgIGxpbVN3aXRjaFByaW1hcnlTZWNvbmRhcnlDaGFubmVsKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc2Vjb25kYXJ5U3ViQmFuZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZUxJTV9DSEFOTkVMX1NXSVRDSF9QUklNQVJZX0FORF9TRUNPTkRBUlk6CisgICAgICAgICAgICAgICAgICAgIGxpbVN3aXRjaFByaW1hcnlTZWNvbmRhcnlDaGFubmVsKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2gucHJpbWFyeUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc2Vjb25kYXJ5U3ViQmFuZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZUxJTV9DSEFOTkVMX1NXSVRDSF9JRExFOgorICAgICAgICAgICAgICAgICAgICBQRUxPR0Uoc2NoTG9nKHBNYWMsIExPR0UsIEZMKCJpbmNvcnJlY3Qgc3RhdGUgLSBDSEFOTkVMX1NXSVRDSF9JRExFXG4iKSk7KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN0YXRlID0gZUxJTV9DSEFOTkVMX1NXSVRDSF9JRExFOworCisgICAgICAgICAgICBsaW1TZW5kU21lUnNwKHBNYWMsIGVXTklfU01FX1NXSVRDSF9DSExfUlNQLCBlU0lSX1NNRV9TVUNDRVNTKTsKKworICAgICAgICAgICAgbGltRnJhbWVUcmFuc21pc3Npb25Db250cm9sKHBNYWMsIGVMSU1fVFhfQlNTX0JVVF9CRUFDT04sIGVMSU1fUkVTVU1FX1RYKTsKKyAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgMTFoIGNoYW5uZWwgc3dpdGNoIGlzIGRvbmUuICovCisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LmRvdDExaENoYW5Td1N0YXRlID0gZUxJTV8xMUhfQ0hBTlNXX0lOSVQ7CisgICAgICAgICAgICBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPSBlTElNX1FVSUVUX0lOSVQ7CisgICAgICAgICAgICBMSU1fU0VUX1JBREFSX0RFVEVDVEVEKHBNYWMsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ3BMaW1NZWFzUmVxKQorICAgICAgICAgICAgICAgIGxpbVJlRW5hYmxlTGVhcm5Nb2RlKHBNYWMpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZkJlYWNvbkNoYW5nZWQpCisgICAgeworICAgICAgICBzY2hTZXRGaXhlZEJlYWNvbkZpZWxkcyhwTWFjLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoQ291bnQgPiAwKQorICAgICAgICAgICAgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaENvdW50LS07CisgICAgfQorfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hCZWFjb25Qcm9jZXNzLmMgYi9DT1JFL01BQy9zcmMvcGUvc2NoL3NjaEJlYWNvblByb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDg1YzEyCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hCZWFjb25Qcm9jZXNzLmMKQEAgLTAsMCArMSw3NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBzY2hCZWFjb25Qcm9jZXNzLmNjIGNvbnRhaW5zIGJlYWNvbiBwcm9jZXNzaW5nIHJlbGF0ZWQKKyAqIGZ1bmN0aW9ucworICoKKyAqIEF1dGhvcjogICAgICBTYW5kZXNoIEdvZWwKKyAqIERhdGU6ICAgICAgICAwMi8yNS8wMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJ3bmlDZmdBcC5oIgorCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisjaW5jbHVkZSAicG1tQXBpLmgiCisjaW5jbHVkZSAibGltQXBpLmgiCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJzY2hEZWJ1Zy5oIgorI2luY2x1ZGUgInNjaEFwaS5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbENvbW1vbkFwaS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJsaW1VdGlscy5oIgorI2luY2x1ZGUgImxpbVNlbmRNZXNzYWdlcy5oIgorI2luY2x1ZGUgImxpbVN0YUhhc2hBcGkuaCIKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybUFwaS5oIgorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisjaW5jbHVkZSAidm9zX2RpYWdfY29yZV9sb2cuaCIKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisKKy8qKgorICogTnVtYmVyIG9mIGJ5dGVzIG9mIHZhcmlhdGlvbiBpbiBiZWFjb24gbGVuZ3RoIGZyb20gdGhlIGxhc3QgYmVhY29uCisgKiB0byB0cmlnZ2VyIHJlcHJvZ3JhbW1pbmcgb2YgcnggZGVsYXkgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBTQ0hfQkVBQ09OX0xFTl9ERUxUQSAgICAgICAzCisKKy8vIGNhbGN1bGF0ZSAyXmN3IC0gMQorI2RlZmluZSBDV19HRVQoY3cpICgoKGN3KSA9PSAwKSA/IDEgOiAoKDEgPDwgKGN3KSkgLSAxKSkKKworc3RhdGljIHZvaWQKK2FwX2JlYWNvbl9wcm9jZXNzKAorICAgIHRwQW5pU2lyR2xvYmFsICAgIHBNYWMsCisgICAgdEFOSV9VOCogICAgICBwUnhQYWNrZXRJbmZvLAorICAgIHRwU2NoQmVhY29uU3RydWN0IHBCY25TdHJ1Y3QsCisgICAgdHBVcGRhdGVCZWFjb25QYXJhbXMgcEJlYWNvblBhcmFtcywKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnkpCit7CisgICAgdHBTaXJNYWNNZ210SGRyICAgIHBNaCA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhQYWNrZXRJbmZvKTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgcGh5TW9kZTsKKyAgICB0U2lyUkZCYW5kICAgICAgICAgIHJmQmFuZCA9IFNJUl9CQU5EX1VOS05PV047CisgICAgLy9HZXQgUkYgYmFuZCBmcm9tIHBzZXNzaW9uRW50cnkKKyAgICByZkJhbmQgPSBwc2Vzc2lvbkVudHJ5LT5saW1SRkJhbmQ7CisKKyAgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgIGlmKFNJUl9CQU5EXzVfR0haID09IHJmQmFuZCkKKyAgICB7CisgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwQmNuU3RydWN0LT5jaGFubmVsTnVtYmVyID09IHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8xMWEgKG5vbiBIVCkgQVAgIG92ZXJsYXBzIG9yCisgICAgICAgICAgICAgIC8vSFQgQVAgd2l0aCBIVCBvcCBtb2RlIGFzIG1peGVkIG92ZXJsYXBzLiAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8vSFQgQVAgd2l0aCBIVCBvcCBtb2RlIGFzIG92ZXJsYXAgbGVnYWN5IG92ZXJsYXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKCghcEJjblN0cnVjdC0+SFRJbmZvLnByZXNlbnQpIHx8CisgICAgICAgICAgICAgICAgICAoZVNJUl9IVF9PUF9NT0RFX01JWEVEID09IHBCY25TdHJ1Y3QtPkhUSW5mby5vcE1vZGUpIHx8CisgICAgICAgICAgICAgICAgICAoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZID09IHBCY25TdHJ1Y3QtPkhUSW5mby5vcE1vZGUpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgbGltVXBkYXRlT3ZlcmxhcFN0YVBhcmFtKHBNYWMsIHBNaC0+YnNzSWQsICYocE1hYy0+bGltLmdMaW1PdmVybGFwMTFhUGFyYW1zKSk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWFQYXJhbXMubnVtU3RhICYmCisgICAgICAgICAgICAgICAgICAgICAgIXBNYWMtPmxpbS5nTGltT3ZlcmxhcDExYVBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGUxMWFQcm90ZWN0aW9uKHBNYWMsIHRydWUsIHRydWUsIHBCZWFjb25QYXJhbXMscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLy9IVCBBUCB3aXRoIEhUMjAgb3AgbW9kZSBvdmVybGFwcy4KKyAgICAgICAgICAgICAgZWxzZSBpZihlU0lSX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hUID09IHBCY25TdHJ1Y3QtPkhUSW5mby5vcE1vZGUpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGxpbVVwZGF0ZU92ZXJsYXBTdGFQYXJhbShwTWFjLCBwTWgtPmJzc0lkLCAmKHBNYWMtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMpKTsKKworICAgICAgICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMubnVtU3RhICYmCisgICAgICAgICAgICAgICAgICAgICAgIXBNYWMtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSFQyMFByb3RlY3Rpb24ocE1hYywgdHJ1ZSwgdHJ1ZSwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAgIAorICAgIH0KKyAgICBlbHNlIGlmKFNJUl9CQU5EXzJfNF9HSFogPT0gcmZCYW5kKQorICAgIHsKKyAgICAgICAgLy9XZSBhcmUgMTFHIEFQLgorICAgICAgICBpZiAoKHBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUcpICYmCisgICAgICAgICAgICAgIChmYWxzZSA9PSBwc2Vzc2lvbkVudHJ5LT5odENhcGFiYWxpdHkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEJjblN0cnVjdC0+Y2hhbm5lbE51bWJlciA9PSBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwpICAgICAgICAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKCghKHBCY25TdHJ1Y3QtPmVycFByZXNlbnQpKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAhKHBCY25TdHJ1Y3QtPkhUSW5mby5wcmVzZW50KSl8fCAKKyAgICAgICAgICAgICAgICAgICAgLy9pZiBlcnAgbm90IHByZXNlbnQgdGhlbiAgMTFCIEFQIG92ZXJsYXBwaW5nCisgICAgICAgICAgICAgICAgICAgIChwQmNuU3RydWN0LT5lcnBQcmVzZW50ICYmCisgICAgICAgICAgICAgICAgICAgIChwQmNuU3RydWN0LT5lcnBJRUluZm8udXNlUHJvdGVjdGlvbiB8fAorICAgICAgICAgICAgICAgICAgICBwQmNuU3RydWN0LT5lcnBJRUluZm8ubm9uRXJwUHJlc2VudCkpKQorICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgICAgICAgICAgIGlmKCBwc2Vzc2lvbkVudHJ5LT5pc0NDWGNvbm5lY3Rpb24gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UgKFZPU19NT0RVTEVfSURfUEUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFtJTkZPTE9HXUNDWCAxMWcgZXJwUHJlc2VudD0lZCB1c2VQcm90ZWN0aW9uPSVkIG5vbkVycFByZXNlbnQ9JWRcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCY25TdHJ1Y3QtPmVycFByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJjblN0cnVjdC0+ZXJwSUVJbmZvLnVzZVByb3RlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJjblN0cnVjdC0+ZXJwSUVJbmZvLm5vbkVycFByZXNlbnQpOworICAgICAgICAgICAgICAgICAgICB9IAorI2VuZGlmIAorICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVPdmVybGFwMTFnUHJvdGVjdGlvbihwTWFjLCBwQmVhY29uUGFyYW1zLCBwTWgscHNlc3Npb25FbnRyeSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAvLyBoYW5kbGluZyB0aGUgY2FzZSB3aGVuIEhUIEFQIGhhcyBvdmVybGFwcGluZyBsZWdhY3kgQlNTLgorICAgICAgICBlbHNlIGlmKHBzZXNzaW9uRW50cnktPmh0Q2FwYWJhbGl0eSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBCY25TdHJ1Y3QtPmNoYW5uZWxOdW1iZXIgPT0gcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAocEJjblN0cnVjdC0+ZXJwUHJlc2VudCAmJgorICAgICAgICAgICAgICAgICAgICAocEJjblN0cnVjdC0+ZXJwSUVJbmZvLnVzZVByb3RlY3Rpb24gfHwKKyAgICAgICAgICAgICAgICAgICAgcEJjblN0cnVjdC0+ZXJwSUVJbmZvLm5vbkVycFByZXNlbnQpKQorICAgICAgICAgICAgICB7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAgICAgICAgICAgaWYoIHBzZXNzaW9uRW50cnktPmlzQ0NYY29ubmVjdGlvbiApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFIChWT1NfTU9EVUxFX0lEX1BFLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogW0lORk9MT0ddQ0NYIDExZyBlcnBQcmVzZW50PSVkIHVzZVByb3RlY3Rpb249JWQgbm9uRXJwUHJlc2VudD0lZFxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBCY25TdHJ1Y3QtPmVycFByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBCY25TdHJ1Y3QtPmVycElFSW5mby51c2VQcm90ZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQmNuU3RydWN0LT5lcnBJRUluZm8ubm9uRXJwUHJlc2VudCk7CisgICAgICAgICAgICAgICAgICB9ICAKKyNlbmRpZiAKKyAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZU92ZXJsYXAxMWdQcm90ZWN0aW9uKHBNYWMsIHBCZWFjb25QYXJhbXMsIHBNaCxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8vMTFnIGRldmljZSBvdmVybGFwcworICAgICAgICAgICAgICBpZiAocEJjblN0cnVjdC0+ZXJwUHJlc2VudCAmJgorICAgICAgICAgICAgICAgICAgIShwQmNuU3RydWN0LT5lcnBJRUluZm8udXNlUHJvdGVjdGlvbiB8fCAKKyAgICAgICAgICAgICAgICAgICAgcEJjblN0cnVjdC0+ZXJwSUVJbmZvLm5vbkVycFByZXNlbnQpICYmICEocEJjblN0cnVjdC0+SFRJbmZvLnByZXNlbnQpKQorICAgICAgICAgICAgICB7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgICAgICAgICBsaW1VcGRhdGVPdmVybGFwU3RhUGFyYW0ocE1hYywgcE1oLT5ic3NJZCwgJihwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcDExZ1BhcmFtcykpOworCisgICAgICAgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMubnVtU3RhICYmIAorICAgICAgICAgICAgICAgICAgICAgICFwc2Vzc2lvbkVudHJ5LT5nTGltT3ZlcmxhcDExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgbGltVXBkYXRlT3ZlcmxhcFN0YVBhcmFtKHBNYWMsIHBNaC0+YnNzSWQsICYocE1hYy0+bGltLmdMaW1PdmVybGFwMTFnUGFyYW1zKSk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWdQYXJhbXMubnVtU3RhICYmCisgICAgICAgICAgICAgICAgICAgICAgIXBNYWMtPmxpbS5nTGltT3ZlcmxhcDExZ1BhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGxpbUVuYWJsZUh0UHJvdGVjdGlvbkZyb20xMWcocE1hYywgdHJ1ZSwgdHJ1ZSwgcEJlYWNvblBhcmFtcyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8vaHQgZGV2aWNlIG92ZXJsYXBzLgorICAgICAgICAgICAgICAvL2hlcmUgd2Ugd2lsbCBjaGVjayBmb3IgSFQgcmVsYXRlZCBkZXZpY2VzIG9ubHkgd2hpY2ggbWlnaHQgbmVlZCBwcm90ZWN0aW9uLgorICAgICAgICAgICAgICAvL2NoZWNrIGZvciAxMWIgYW5kIDExZyBpcyBhbHJlYWR5IGRvbmUgaW4gdGhlIHByZXZpb3VzIGJsb2Nrcy4KKyAgICAgICAgICAgICAgLy9zbyB3ZSB3aWxsIG5vdCBjaGVjayBmb3IgSFQgb3BlcmF0aW5nIG1vZGUgYXMgTUlYRUQuCisgICAgICAgICAgICAgIGlmIChwQmNuU3RydWN0LT5IVEluZm8ucHJlc2VudCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy9pZiB3ZSBhcmUgbm90IGFscmVhZHkgaW4gbWl4ZWQgbW9kZSBvciBsZWdhY3kgbW9kZSBhcyBIVCBvcGVyYXRpbmcgbW9kZQorICAgICAgICAgICAgICAgICAgLy9hbmQgcmVjZWl2ZWQgYmVhY29uIGhhcyBIVCBvcGVyYXRpbmcgbW9kZSBhcyBsZWdhY3kKKyAgICAgICAgICAgICAgICAgIC8vdGhlbiB3ZSBuZWVkIHRvIGVuYWJsZSBwcm90ZWN0aW9uIGZyb20gMTFnIHN0YXRpb24uIAorICAgICAgICAgICAgICAgICAgLy93ZSBkb24ndCBuZWVkIHByb3RlY3Rpb24gZnJvbSAxMWIgYmVjYXVzZSBpZiB0aGF0J3MgbmVlZGVkIHRoZW4gb3VyIG9wZXJhdGluZworICAgICAgICAgICAgICAgICAgLy9tb2RlIHdvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNldCB0byBsZWdhY3kgaW4gdGhlIHByZXZpb3VzIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICAgIGlmKGVTSVJfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWSA9PSBwQmNuU3RydWN0LT5IVEluZm8ub3BNb2RlKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmKChlU0lSX0hUX09QX01PREVfTUlYRUQgIT0gcE1hYy0+bGltLmdIVE9wZXJNb2RlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAoZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZICE9IHBNYWMtPmxpbS5nSFRPcGVyTW9kZSkpCisgICAgICAgICAgICAgICAgICAgICAgeworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGltVXBkYXRlT3ZlcmxhcFN0YVBhcmFtKHBNYWMsIHBNaC0+YnNzSWQsICYocHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXAxMWdQYXJhbXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zLm51bVN0YSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwMTFnUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGltVXBkYXRlT3ZlcmxhcFN0YVBhcmFtKHBNYWMsIHBNaC0+YnNzSWQsICYocE1hYy0+bGltLmdMaW1PdmVybGFwMTFnUGFyYW1zKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltT3ZlcmxhcDExZ1BhcmFtcy5udW1TdGEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwTWFjLT5saW0uZ0xpbU92ZXJsYXAxMWdQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltRW5hYmxlSHRQcm90ZWN0aW9uRnJvbTExZyhwTWFjLCB0cnVlLCB0cnVlLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBlbHNlIGlmKGVTSVJfSFRfT1BfTU9ERV9OT19MRUdBQ1lfMjBNSFpfSFQgPT0gcEJjblN0cnVjdC0+SFRJbmZvLm9wTW9kZSkKKyAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgICAgICAgbGltVXBkYXRlT3ZlcmxhcFN0YVBhcmFtKHBNYWMsIHBNaC0+YnNzSWQsICYocHNlc3Npb25FbnRyeS0+Z0xpbU92ZXJsYXBIdDIwUGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwSHQyMFBhcmFtcy5udW1TdGEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIXBzZXNzaW9uRW50cnktPmdMaW1PdmVybGFwSHQyMFBhcmFtcy5wcm90ZWN0aW9uRW5hYmxlZCkKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgbGltVXBkYXRlT3ZlcmxhcFN0YVBhcmFtKHBNYWMsIHBNaC0+YnNzSWQsICYocE1hYy0+bGltLmdMaW1PdmVybGFwSHQyMFBhcmFtcykpOworCisgICAgICAgICAgICAgICAgICAgICAgaWYgKHBNYWMtPmxpbS5nTGltT3ZlcmxhcEh0MjBQYXJhbXMubnVtU3RhICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICFwTWFjLT5saW0uZ0xpbU92ZXJsYXBIdDIwUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1FbmFibGVIVDIwUHJvdGVjdGlvbihwTWFjLCB0cnVlLCB0cnVlLCBwQmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgCisgICAgfQorICAgIHBNYWMtPnNjaC5nU2NoQmNuSWdub3JlZCsrOworfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKworLyoqCisgKiBfX3NjaEJlYWNvblByb2Nlc3NOb1Nlc3Npb24KKyAqCisgKiBGVU5DVElPTjoKKyAqIFByb2Nlc3MgdGhlIHJlY2VpdmVkIGJlYWNvbiBmcmFtZSB3aGVuIAorICogIC0tIFN0YXRpb24gaXMgbm90IHNjYW5uaW5nIAorICogIC0tIE5vIGNvcnJlc3BvbmRpbmcgc2Vzc2lvbiBpcyBmb3VuZAorICoKKyAqIExPR0lDOgorICogICAgICAgIEZvbGxvd2luZyBzY2VuYXJpb3MgZXhpc3Qgd2hlbiBTZXNzaW9uIERvZXMgbm90IGV4aXN0OgorICogICAgICAgICAgICAgKiBJQlNTIEJlYWNvbnMsIHdoZW4gSUJTUyBzZXNzaW9uIGFscmVhZHkgZXhpc3RzIHdpdGggc2FtZSBTU0lELCAKKyAqICAgICAgICAgICAgICAgIGJ1dCBmcm9tIFNUQSB3aGljaCBoYXMgbm90IHlldCBqb2luZWQgYW5kIGhhcyBhIGRpZmZlcmVudCBCU1NJRC4KKyAqICAgICAgICAgICAgICAgIC0gaW52b2tlIGxpbUhhbmRsZUlCU1Njb2FsZXNjaW5nIHdpdGggdGhlIHNlc3Npb24gY29udGV4dCBvZiBleGlzdGluZyBJQlNTIHNlc3Npb24uCisgKgorICogICAgICAgICAgICAgKiBJQlNTIEJlYWNvbnMgd2hlbiBJQlNTIHNlc3Npb24gZG9lcyBub3QgZXhpc3QsIG9ubHkgSW5mcmEgb3IgQlQtQU1QIHNlc3Npb24gZXhpc3RzLAorICogICAgICAgICAgICAgICAgdGhlbiBzYXZlIHRoZSBiZWFjb24gaW4gdGhlIHNjYW4gcmVzdWx0cyBhbmQgdGhyb3cgaXQgYXdheS4KKyAqICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgKiBJbmZyYSBCZWFjb25zCisgKiAgICAgICAgICAgICAgICAtIGJlYWNvbnMgcmVjZWl2ZWQgd2hlbiBubyBzZXNzaW9uIGFjdGl2ZSAKKyAqICAgICAgICAgICAgICAgICAgICBzaG91bGQgbm90IGNvbWUgaGVyZSwgaXQgc2hvdWxkIGJlIGhhbmRsZWQgYXMgcGFydCBvZiBzY2FubmluZywgCisgKiAgICAgICAgICAgICAgICAgICAgZWxzZSB0aGV5IHNob3VsZCBub3QgYmUgZ2V0dGluZyByZWNlaXZlZCwgc2hvdWxkIHVwZGF0ZSBzY2FuIHJlc3VsdHMgYW5kIGRyb3AgaXQgaWYgdGhhdCBoYXBwZW5zLgorICogICAgICAgICAgICAgICAgLSBiZWFjb25zIHJlY2VpdmVkIHdoZW4gSUJTUyBzZXNzaW9uIGFjdGl2ZToKKyAqICAgICAgICAgICAgICAgICAgICB1cGRhdGUgc2NhbiByZXN1bHRzIGFuZCBkcm9wIGl0LgorICogICAgICAgICAgICAgICAgLSBiZWFjb25zIHJlY2VpdmVkIHdoZW4gSW5mcmEgc2Vzc2lvbihTVEEpIGlzIGFjdGl2ZToKKyAqICAgICAgICAgICAgICAgICAgICB1cGRhdGUgc2NhbiByZXN1bHRzIGFuZCBkcm9wIGl0CisgKiAgICAgICAgICAgICAgICAtIGJlYWNvbnMgcmVjZWl2ZWQgd2hlbiBCVC1TVEEgc2Vzc2lvbiBpcyBhY3RpdmU6CisgKiAgICAgICAgICAgICAgICAgICAgdXBkYXRlIHNjYW4gcmVzdWx0cyBhbmQgZHJvcCBpdC4KKyAqICAgICAgICAgICAgICAgIC0gYmVhY29ucyByZWNlaXZlZCB3aGVuIEluZnJhL0JULVNUQSAgb3IgSW5mcmEvSUJTUyBpcyBhY3RpdmUuCisgKiAgICAgICAgICAgICAgICAgICAgdXBkYXRlIHNjYW4gcmVzdWx0cyBhbmQgZHJvcCBpdC4KKyAqIAorCisgKi8KK3N0YXRpYyB2b2lkIF9fc2NoQmVhY29uUHJvY2Vzc05vU2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNjaEJlYWNvblN0cnVjdCBwQmVhY29uLHRBTklfVTgqIHBSeFBhY2tldEluZm8pCit7CisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9IE5VTEw7CisgCisgICAgaWYoICAocHNlc3Npb25FbnRyeSA9IGxpbUlzSUJTU1Nlc3Npb25BY3RpdmUocE1hYykpICE9IE5VTEwpCisgICAgeworICAgICAgICBsaW1IYW5kbGVJQlNTY29hbGVzY2luZyhwTWFjLCBwQmVhY29uLCBwUnhQYWNrZXRJbmZvLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisKKyAgICAvL0lmIHN0YXRpb24oU1RBL0JULVNUQS9CVC1BUC9JQlNTKSBtb2RlLCBBbHdheXMgc2F2ZSB0aGUgYmVhY29uIGluIHRoZSBzY2FuIHJlc3VsdHMsIGlmIGF0bGVhc3Qgb25lIHNlc3Npb24gaXMgYWN0aXZlCisgICAgLy9zY2hCZWFjb25Qcm9jZXNzTm9TZXNzaW9uIHdpbGwgYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhdGxlYXN0IG9uZSBzZXNzaW9uIGFjdGl2ZSwgc28gbm90IGNoZWNraW5nIAorICAgIC8vaXQgYWdhaW4gaGVyZS4KKyAgICBsaW1DaGVja0FuZEFkZEJzc0Rlc2NyaXB0aW9uKHBNYWMsIHBCZWFjb24sIHBSeFBhY2tldEluZm8sIGVBTklfQk9PTEVBTl9GQUxTRSwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICByZXR1cm47ICAKK30KKworCisKKy8qCisgKiBfX3NjaEJlYWNvblByb2Nlc3NGb3JTZXNzaW9uCisgKgorICogRlVOQ1RJT046CisgKiBQcm9jZXNzIHRoZSByZWNlaXZlZCBiZWFjb24gZnJhbWUgd2hlbiAKKyAqICAtLSBTdGF0aW9uIGlzIG5vdCBzY2FubmluZyAKKyAqICAtLSBDb3JyZXNwb25kaW5nIHNlc3Npb24gaXMgZm91bmQKKyAqCisgKiBMT0dJQzoKKyAqICAgICAgICBGb2xsb3dpbmcgc2NlbmFyaW9zIGV4aXN0IHdoZW4gU2Vzc2lvbiBleGlzdHMKKyAqICAgICAgICAgICAgICogSUJTUyBTVEEgcmVjZXZpbmcgYmVhY29ucyBmcm9tIElCU1MgUGVlcnMsIHdobyBhcmUgcGFydCBvZiBJQlNTLgorICogICAgICAgICAgICAgICAgIC0gY2FsbCBsaW1IYW5kbGVJQlNTY29hbGVzY2luZyB3aXRoIHRoYXQgc2Vzc2lvbiBjb250ZXh0LgorICogICAgICAgICAgICAgKiBJbmZyYSBTVEEgcmVjZXZpbmcgYmVhY29ucyBmcm9tIEFQIHRvIHdoaWNoIGl0IGlzIGNvbm5lY3RlZAorICogICAgICAgICAgICAgICAgIC0gY2FsbCBzY2hCZWFjb25Qcm9jZXNzRnJvbUFQIHdpdGggdGhhdCBzZXNzaW9uJ3MgY29udGV4dC4KKyAqICAgICAgICAgICAgICogQlRBTVAgU1RBIHJlY2V2aW5nIGJlYWNvbnMgZnJvbSBCVEFNUCBBUAorICogICAgICAgICAgICAgICAgIC0gY2FsbCBzY2hCZWFjb25Qcm9jZXNzRnJvbUFQIHdpdGggdGhhdCBzZXNzaW9uJ3MgY29udGV4dC4KKyAqICAgICAgICAgICAgICogQlRBTVAgQVAgcmVjZWl2aW5nIGJlYWNvbnMgZnJvbSBCVEFNUCBTVEEgCisgKiAgICAgICAgICAgICAgIChoZXJlIG5lZWQgdG8gbWFrZSBzdXJlIEJUQVAgY3JlYXRlcyBzZXNzaW9uIGVudHJ5IGZvciBCVCBTVEEpCisgKiAgICAgICAgICAgICAgICAtIGp1c3QgdXBkYXRlIHRoZSBiZWFjb24gY291bnQgZm9yIGhlYXJ0IGJlYXQgcHVycG9zZXMgZm9yIG5vdywgCisgKiAgICAgICAgICAgICAgICAgIGZvciBub3csIGRvbid0IHByb2Nlc3MgdGhlIGJlYWNvbi4KKyAqICAgICAgICAgICAgICogSW5mcmEvSUJTUyBib3RoIGFjdGl2ZSBhbmQgcmVjZWl2ZXMgSUJTUyBiZWFjb246CisgKiAgICAgICAgICAgICAgICAgIC0gY2FsbCBsaW1IYW5kbGVJQlNTY29hbGVzY2luZyB3aXRoIHRoYXQgc2Vzc2lvbiBjb250ZXh0LgorICogICAgICAgICAgICAgKiBJbmZyYS9JQlNTIGJvdGggYWN0aXZlIGFuZCByZWNlaXZlcyBJbmZyYSBiZWFjb246CisgKiAgICAgICAgICAgICAgICAgIC0gY2FsbCBzY2hCZWFjb25Qcm9jZXNzRnJvbUFQIHdpdGggdGhhdCBzZXNzaW9uJ3MgY29udGV4dC4KKyAqICAgICAgICAgICAgICAgICAgICAgYW55IHVwZGF0ZXMgdG8gRURDQSBwYXJhbWV0ZXJzIHdpbGwgYmUgZWZmZWN0aXZlIGZvciBJQlNTIGFzIHdlbGwsIAorICogICAgICAgICAgICAgICAgICAgICBldmVuIHRob3VnaCBubyBXTU0gZm9yIElCU1MgPz8gTmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBoYW5kbGUgdGhpcyBzY2VuYXJpby4KKyAqICAgICAgICAgICAgICogSW5mcmEvQlRTVEEgYm90aCBhY3RpdmUgYW5kIHJlY2VpdmUgSW5mcmEgYmVhY29uLgorICogICAgICAgICAgICAgICAgICAtIGNoYW5nZSBpbiBFRENBIHBhcmFtZXRlcnMgb24gSW5mcmEgYWZmZWN0IHRoZSBCVFNUQSBsaW5rLgorICogICAgICAgICAgICAgICAgICAgICBVcGRhdGUgdGhlIHNhbWUgcGFyYW1ldGVycyBvbiBCVCBsaW5rCisgKiAgICAgICAgICAgICAgKiBJbmZyYS9CVFNUQSBib3RoIGFjdGl2ZSBhbmQgcmVjZWl2ZSBCVC1BUCBiZWFjb24uCisgKiAgICAgICAgICAgICAgICAgLXVwZGF0ZSBiZWFjb24gY250IGZvciBoZWFydGJlYXQKKyAqICAgICAgICAgICAgICogSW5mcmEvQlRBUCBib3RoIGFjdGl2ZSBhbmQgcmVjZWl2ZSBJbmZyYSBiZWFjb24uCisgKiAgICAgICAgICAgICAgICAgLSBCVC1BUCBzdGFydHMgYWR2ZXJ0aXNpbmcgQkUgcGFyYW1ldGVycyBmcm9tIEluZnJhIEFQLCBpZiB0aGV5IGdldCBjaGFuZ2VkLgorICoKKyAqICAgICAgICAgICAgICogSW5mcmEvQlRBUCBib3RoIGFjdGl2ZSBhbmQgcmVjZWl2ZSBCVFNUQSBiZWFjb24uCisgKiAgICAgICAgICAgICAgICAtIHVwZGF0ZSBiZWFjb24gY250IGZvciBoZWFydGJlYXQKKyAqLworCitzdGF0aWMgdm9pZCBfX3NjaEJlYWNvblByb2Nlc3NGb3JTZXNzaW9uKCB0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNjaEJlYWNvblN0cnVjdCAgIHBCZWFjb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4KiBwUnhQYWNrZXRJbmZvLCAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICBiaTsKKyAgICB0QU5JX1U4IGJzc0lkeCA9IDA7CisgICAgLy90cFNpck1hY01nbXRIZHIgICAgICAgICBwTWggPSBTSVJfTUFDX0JEX1RPX01QRFVIRUFERVIocFJ4UGFja2V0SW5mbyk7CisgICAgLy90QU5JX1U4IGJzc2lkW3NpemVvZih0U2lyTWFjQWRkcildOworICAgIHRVcGRhdGVCZWFjb25QYXJhbXMgYmVhY29uUGFyYW1zOworICAgIHRBTklfVTggc2VuZFByb2JlUmVxID0gRkFMU0U7CisgICAgdHBEcGhIYXNoTm9kZSBwU3RhRHMgPSBOVUxMOworCisKKyAgICBiZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXAgPSAwOworCisgICAgaWYoZUxJTV9TVEFfSU5fSUJTU19ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgKQorICAgIHsKKyAgICAgICAgbGltSGFuZGxlSUJTU2NvYWxlc2NpbmcocE1hYywgcEJlYWNvbiwgIHBSeFBhY2tldEluZm8sIHBzZXNzaW9uRW50cnkpOworICAgIH0KKyAgICBlbHNlIGlmKCAgKGVMSU1fU1RBX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkgfHwgCisgICAgICAgICAgICAgICAgICAoZUxJTV9CVF9BTVBfU1RBX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAqICBUaGlzIGhhbmRsZXMgdHdvIGNhc2VzOgorICAgICAgICAqICAtLSBJbmZyYSBTVEEgcmVjZXZpbmcgYmVhY29ucyBmcm9tIEFQICAKKyAgICAgICAgKiAgLS0gQlRBTVBfU1RBIHJlY2V2aW5nIGJlYWNvbnMgZnJvbSBCVEFNUF9BUAorICAgICAgICAqLworICAgICAgICAKKyAgICAKKyAgICAgICAgLy9BbHdheXMgc2F2ZSB0aGUgYmVhY29uIGludG8gTElNJ3MgY2FjaGVkIHNjYW4gcmVzdWx0cworICAgICAgICBsaW1DaGVja0FuZEFkZEJzc0Rlc2NyaXB0aW9uKHBNYWMsIHBCZWFjb24sIHBSeFBhY2tldEluZm8sIGVBTklfQk9PTEVBTl9GQUxTRSwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBCZWFjb24gcmVjZWl2ZWQgZnJvbSB0aGUgQVAgIHdlJ3JlIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGguIENoZWNrCisgICAgICAgICAgICAgICAqIGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyBpbiBBUCdzIGNhcGFiaWxpdGllcyAKKyAgICAgICAgICAgICAgICovCisgICAgICAgIGlmKCh0QU5JX1U4KSBwQmVhY29uLT5jaGFubmVsTnVtYmVyICE9IHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCkKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiQ2hhbm5lbCBDaGFuZ2UgZnJvbSAlZCAtLT4gJWQgIC0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgYmVhY29uIVxuIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50T3BlckNoYW5uZWwsIHBCZWFjb24tPmNoYW5uZWxOdW1iZXIpOykKKyAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGxpbURldGVjdENoYW5nZUluQXBDYXBhYmlsaXRpZXMocE1hYywgcEJlYWNvbiwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIGlmKGxpbUdldFN0YUhhc2hCc3NpZHgocE1hYywgRFBIX1NUQV9IQVNIX0lOREVYX1BFRVIsICZic3NJZHgsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgYmVhY29uUGFyYW1zLmJzc0lkeCA9IGJzc0lkeDsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJnBzZXNzaW9uRW50cnktPmxhc3RCZWFjb25UaW1lU3RhbXAsICggdEFOSV9VOCogKXBCZWFjb24tPnRpbWVTdGFtcCwgc2l6ZW9mKHRBTklfVTY0KSApOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5sYXN0QmVhY29uRHRpbUNvdW50ID0gcEJlYWNvbi0+dGltLmR0aW1Db3VudDsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+bGFzdEJlYWNvbkR0aW1QZXJpb2Q9IHBCZWFjb24tPnRpbS5kdGltUGVyaW9kOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5jdXJyZW50QnNzQmVhY29uQ250Kys7CisKKworCisgICAgICAgIE1UUkFDRShtYWNUcmFjZShwTWFjLCBUUkFDRV9DT0RFX1JYX01HTVRfVFNGLCAwLCBwQmVhY29uLT50aW1lU3RhbXBbMF0pOykKKyAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsIFRSQUNFX0NPREVfUlhfTUdNVF9UU0YsIDAsIHBCZWFjb24tPnRpbWVTdGFtcFsxXSk7KQorCisgICAgICAgIC8qIFJlYWQgYmVhY29uIGludGVydmFsIHNlc3Npb24gRW50cnkgKi8KKyAgICAgICAgYmkgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWw7CisgICAgICAgIGlmIChiaSAhPSBwQmVhY29uLT5iZWFjb25JbnRlcnZhbCkKKyAgICAgICAgeworICAgICAgICAgICBQRUxPRzEoc2NoTG9nKHBNYWMsIExPRzEsIEZMKCJCZWFjb24gaW50ZXJ2YWwgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwQmVhY29uLT5iZWFjb25JbnRlcnZhbCwgYmkpOykKKworICAgICAgICAgICAgYmkgPSBwQmVhY29uLT5iZWFjb25JbnRlcnZhbDsKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbCA9ICh0QU5JX1UxNikgYmk7CisgICAgICAgICAgICBiZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXAgfD0gUEFSQU1fQkNOX0lOVEVSVkFMX0NIQU5HRUQ7CisgICAgICAgICAgICBiZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWwgPSAodEFOSV9VMTYpYmk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocEJlYWNvbi0+Y2ZQcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBjZmdTZXRJbnQocE1hYywgV05JX0NGR19DRlBfUEVSSU9ELCBwQmVhY29uLT5jZlBhcmFtU2V0LmNmcFBlcmlvZCk7CisgICAgICAgICAgICBsaW1TZW5kQ0ZQYXJhbXMocE1hYywgYnNzSWR4LCBwQmVhY29uLT5jZlBhcmFtU2V0LmNmcENvdW50LCBwQmVhY29uLT5jZlBhcmFtU2V0LmNmcFBlcmlvZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocEJlYWNvbi0+dGltUHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfRFRJTV9QRVJJT0QsIHBCZWFjb24tPnRpbS5kdGltUGVyaW9kKTsKKyAgICAgICAgICAgIC8vTm8gbmVlZCB0byBzZW5kIERUSU0gUGVyaW9kIGFuZCBDb3VudCB0byBIQUwvU01BQworICAgICAgICAgICAgLy9TTUFDIGFscmVhZHkgcGFyc2VzIFRJTSBiaXQuCisgICAgICAgIH0KKworICAgICAgICAKKyAgICAgICAgaWYocE1hYy0+bGltLmdMaW1Qcm90ZWN0aW9uQ29udHJvbCAhPSBXTklfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OX0RJU0FCTEUpCisKKyAgICAgICAgbGltRGVjaWRlU3RhUHJvdGVjdGlvbihwTWFjLCBwQmVhY29uLCAmYmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgaWYgKHBCZWFjb24tPmVycFByZXNlbnQpCisgICAgICAgIHsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICBpZiAocEJlYWNvbi0+ZXJwSUVJbmZvLmJhcmtlclByZWFtYmxlTW9kZSkKKyAgICAgICAgICAgICAgICBsaW1FbmFibGVTaG9ydFByZWFtYmxlKHBNYWMsIGZhbHNlLCAmYmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsaW1FbmFibGVTaG9ydFByZWFtYmxlKHBNYWMsIHRydWUsICZiZWFjb25QYXJhbXMsIHBzZXNzaW9uRW50cnkpOworI2Vsc2UKKyAgICAgICAgICAgIGlmIChwQmVhY29uLT5lcnBJRUluZm8uYmFya2VyUHJlYW1ibGVNb2RlKQorICAgICAgICAgICAgICAgIGxpbUVuYWJsZVNob3J0UHJlYW1ibGUocE1hYywgZmFsc2UsICZiZWFjb25QYXJhbXMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxpbUVuYWJsZVNob3J0UHJlYW1ibGUocE1hYywgdHJ1ZSwgJmJlYWNvblBhcmFtcyk7CisjZW5kaWYKKyAgICAgICAgICB9CisgICAgICAgIGxpbVVwZGF0ZVNob3J0U2xvdChwTWFjLCBwQmVhY29uLCAmYmVhY29uUGFyYW1zLHBzZXNzaW9uRW50cnkpOworCisgICAgICAgIHBTdGFEcyA9IGRwaEdldEhhc2hFbnRyeShwTWFjLCBEUEhfU1RBX0hBU0hfSU5ERVhfUEVFUiwgJnBzZXNzaW9uRW50cnktPmRwaC5kcGhIYXNoVGFibGUpOworICAgICAgICBpZiAoKHBCZWFjb24tPndtZUVkY2FQcmVzZW50ICYmIChwc2Vzc2lvbkVudHJ5LT5saW1XbWVFbmFibGVkKSkgfHwKKyAgICAgICAgICAgICAocEJlYWNvbi0+ZWRjYVByZXNlbnQgICAgJiYgKHBzZXNzaW9uRW50cnktPmxpbVFvc0VuYWJsZWQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEJlYWNvbi0+ZWRjYVBhcmFtcy5xb3NJbmZvLmNvdW50ICE9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1TZXRDb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2NoQmVhY29uRWRjYVByb2Nlc3MocE1hYywgJnBCZWFjb24tPmVkY2FQYXJhbXMsIHBzZXNzaW9uRW50cnkpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgUEVMT0dFKHNjaExvZyhwTWFjLCBMT0dFLCBGTCgiRURDQSBwYXJhbWV0ZXIgcHJvY2Vzc2luZyBlcnJvclxuIikpOykKKyAgICAgICAgICAgICAgICBlbHNlIGlmKHBTdGFEcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgbmVlZGVkLCBkb3duZ3JhZGUgdGhlIEVEQ0EgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBsaW1TZXRBY3RpdmVFZGNhUGFyYW1zKHBNYWMsIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsgCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTdGFEcy0+YW5pUGVlciA9PSBlQU5JX0JPT0xFQU5fVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRFZGNhUGFyYW1zKHBNYWMsIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQWN0aXZlLCBwU3RhRHMtPmJzc0lkLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbVNlbmRFZGNhUGFyYW1zKHBNYWMsIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQWN0aXZlLCBwU3RhRHMtPmJzc0lkLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNlbGYgRW50cnkgbWlzc2luZyBpbiBIYXNoIFRhYmxlXG4iKSk7KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIChwQmVhY29uLT5xb3NDYXBhYmlsaXR5UHJlc2VudCAmJiBwc2Vzc2lvbkVudHJ5LT5saW1Rb3NFbmFibGVkKSAmJgorICAgICAgICAgICAgKHBCZWFjb24tPnFvc0NhcGFiaWxpdHkucW9zSW5mby5jb3VudCAhPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtU2V0Q291bnQpKQorICAgICAgICAgICAgc2VuZFByb2JlUmVxID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoIHBNYWMtPmxpbS5odENhcGFiaWxpdHkgJiYgcEJlYWNvbi0+SFRJbmZvLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgbGltVXBkYXRlU3RhUnVuVGltZUhUU3dpdGNoQ2hubFBhcmFtcyggcE1hYywgJnBCZWFjb24tPkhUSW5mbywgYnNzSWR4LHBzZXNzaW9uRW50cnkpOworICAgIH0KKworI2lmIGRlZmluZWQoQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQpIHx8IGRlZmluZWQoQU5JX0FQX0NMSUVOVF9TREspCisgICAgaWYgKCAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9ST0xFKSB8fChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQlRfQU1QX1NUQV9ST0xFKSB8fAorICAgICAgICAgIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fU1RBX0lOX0lCU1NfUk9MRSkgKQorICAgIHsKKyAgICAgICAgaWYocEJlYWNvbi0+cXVpZXRJRVByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbVVwZGF0ZVF1aWV0SUVGcm9tQmVhY29uKHBNYWMsICYocEJlYWNvbi0+cXVpZXRJRSksIHBzZXNzaW9uRW50cnkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0U3RhdGUgPT0gZUxJTV9RVUlFVF9CRUdJTikgfHwKKyAgICAgICAgICAgICAocE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlID09IGVMSU1fUVVJRVRfUlVOTklORykpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIGEgYmVhY29uIHdpdGhvdXQgUXVpZXQgSUVcbiIpKTspCisgICAgICAgICAgICBsaW1DYW5jZWxEb3QxMWhRdWlldChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoYW5uZWwgU3dpdGNoIGluZm9ybWF0aW9uIGVsZW1lbnQgdXBkYXRlZCAqLworICAgICAgICBpZihwQmVhY29uLT5jaGFubmVsU3dpdGNoUHJlc2VudCB8fCAKKyAgICAgICAgICAgIHBCZWFjb24tPnByb3BJRWluZm8ucHJvcENoYW5uZWxTd2l0Y2hQcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBsaW1VcGRhdGVDaGFubmVsU3dpdGNoKHBNYWMsIHBCZWFjb24sIHBzZXNzaW9uRW50cnkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBNYWMtPmxpbS5nTGltU3BlY01nbXQuZG90MTFoQ2hhblN3U3RhdGUgPT0gZUxJTV8xMUhfQ0hBTlNXX1JVTk5JTkcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUNhbmNlbERvdDExaENoYW5uZWxTd2l0Y2gocE1hYywgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIH0gICAKKyAgICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICBpZiggcHNlc3Npb25FbnRyeS0+aXNDQ1hjb25uZWN0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICB0UG93ZXJkQm0gIGxvY2FsQ29uc3RyYWludCA9IDAsIHJlZ01heCA9IDAsIG1heFR4UG93ZXIgPSAwOworICAgICAgICAgICBpZiAocEJlYWNvbi0+Y2N4VHhQd3IucHJlc2VudCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBsb2NhbENvbnN0cmFpbnQgPSBwQmVhY29uLT5jY3hUeFB3ci5wb3dlcl9saW1pdDsKKyAgICAgICAgICAgICAgcmVnTWF4ID0gY2ZnR2V0UmVndWxhdG9yeU1heFRyYW5zbWl0UG93ZXIoIHBNYWMsIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCApOyAKKyAgICAgICAgICAgICAgbWF4VHhQb3dlciA9IGxpbUdldE1heFR4UG93ZXIocmVnTWF4LCBsb2NhbENvbnN0cmFpbnQpOworCisgICAgICAgICAgICAgIC8vSWYgbWF4VHhQb3dlciBpcyBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkCisgICAgICAgICAgICAgaWYoIG1heFR4UG93ZXIgIT0gcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciApCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HMSwgIlJlZ01heCA9ICVkLCBscGMgPSAlZCwgTWF4VHggPSAlZCIsIHJlZ01heCwgbG9jYWxDb25zdHJhaW50LCBtYXhUeFBvd2VyICk7CisgICAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0cxLCAiTG9jYWwgcG93ZXIgY29uc3RyYWludCBjaGFuZ2UuLnVwZGF0aW5nIG5ldyBtYXhUeCBwb3dlciB0byBIQUwiKTsKKyAgICAgICAgICAgICAgICBpZiggbGltU2VuZFNldE1heFR4UG93ZXJSZXEgKCBwTWFjLCBtYXhUeFBvd2VyLCBwc2Vzc2lvbkVudHJ5ICkgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICAgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+bWF4VHhQb3dlciA9IG1heFR4UG93ZXI7CisgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAgICAgaWYoIHBNYWMtPnJybS5ycm1QRUNvbnRleHQucnJtRW5hYmxlICkKKyAgICAgICAgeworICAgICAgICAgICB0UG93ZXJkQm0gIGxvY2FsQ29uc3RyYWludCA9IDAsIHJlZ01heCA9IDAsIG1heFR4UG93ZXIgPSAwOworICAgICAgICAgICBpZiAocEJlYWNvbi0+cG93ZXJDb25zdHJhaW50UHJlc2VudCAmJiBwTWFjLT5ycm0ucnJtUEVDb250ZXh0LnJybUVuYWJsZSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBsb2NhbENvbnN0cmFpbnQgPSBwQmVhY29uLT5sb2NhbFBvd2VyQ29uc3RyYWludC5sb2NhbFBvd2VyQ29uc3RyYWludHM7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIGxvY2FsQ29uc3RyYWludCA9IDA7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgcmVnTWF4ID0gY2ZnR2V0UmVndWxhdG9yeU1heFRyYW5zbWl0UG93ZXIoIHBNYWMsIHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbCApOyAKKyAgICAgICAgICAgbWF4VHhQb3dlciA9IFZPU19NSU4oIHJlZ01heCAsIChyZWdNYXggLSBsb2NhbENvbnN0cmFpbnQpICk7CisgICAgICAgICAgIC8vSWYgbWF4VHhQb3dlciBpcyBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkCisgICAgICAgICAgIGlmKCBtYXhUeFBvd2VyICE9IHBzZXNzaW9uRW50cnktPm1heFR4UG93ZXIgKQorICAgICAgICAgICB7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsICJSZWd1bGF0b3J5IG1heCA9ICVkLCBsb2NhbCBwb3dlciBjb25zdHJhaW50ID0gJWQsIG1heCB0eCA9ICVkIiwgcmVnTWF4LCBsb2NhbENvbnN0cmFpbnQsIG1heFR4UG93ZXIgKTsKKyAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCAiTG9jYWwgcG93ZXIgY29uc3RyYWludCBjaGFuZ2UuLnVwZGF0aW5nIG1ldyBtYXhUeCBwb3dlciB0byBIQUwiKTsKKyNlbmRpZgorICAgICAgICAgICAgICBpZiggcnJtU2VuZFNldE1heFR4UG93ZXJSZXEgKCBwTWFjLCBtYXhUeFBvd2VyLCBwc2Vzc2lvbkVudHJ5ICkgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPm1heFR4UG93ZXIgPSBtYXhUeFBvd2VyOworCisgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAvLyBJbmRpY2F0ZSB0byBMSU0gdGhhdCBCZWFjb24gaXMgcmVjZWl2ZWQKKworICAgIGlmIChwQmVhY29uLT5IVEluZm8ucHJlc2VudCkKKyAgICAgICAgbGltUmVjZWl2ZWRIQkhhbmRsZXIocE1hYywgKHRBTklfVTgpcEJlYWNvbi0+SFRJbmZvLnByaW1hcnlDaGFubmVsLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICBlbHNlCisgICAgICAgIGxpbVJlY2VpdmVkSEJIYW5kbGVyKHBNYWMsICh0QU5JX1U4KXBCZWFjb24tPmNoYW5uZWxOdW1iZXIsIHBzZXNzaW9uRW50cnkpOworCisgICAgLy8gSSBkb24ndCBrbm93IGlmIGFueSBhZGRpdGlvbmFsIElFIGlzIHJlcXVpcmVkIGhlcmUuIEN1cnJlbnRseSwgbm90IGluY2x1ZGUgYWRkSUUuCisgICAgaWYoc2VuZFByb2JlUmVxKQorICAgICAgICBsaW1TZW5kUHJvYmVSZXFNZ210RnJhbWUocE1hYywgJnBzZXNzaW9uRW50cnktPnNzSWQsCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5ic3NJZCwgcHNlc3Npb25FbnRyeS0+Y3VycmVudE9wZXJDaGFubmVsLHBzZXNzaW9uRW50cnktPnNlbGZNYWNBZGRyLAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+ZG90MTFtb2RlLCAwLCBOVUxMKTsKKworICAgUEVMT0cyKHNjaExvZyhwTWFjLCBMT0cyLCAiUmVjZWl2ZWQgQmVhY29uJ3MgU2VxTnVtPSVkXG4iLAorICAgICAgICAgICAocE1oLT5zZXFDb250cm9sLnNlcU51bUhpIDw8IDQpIHwgKHBNaC0+c2VxQ29udHJvbC5zZXFOdW1MbykpOykKKworICAgIGlmKGJlYWNvblBhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcCkKKyAgICB7CisgICAgICAgIFBFTE9HVyhzY2hMb2cocE1hYywgTE9HVywgRkwoIkJlYWNvbiBmb3Igc2Vzc2lvblslZF0gZ290IGNoYW5nZWQuIFxuIiksIHBzZXNzaW9uRW50cnktPnBlU2Vzc2lvbklkKTspCisgICAgICAgIFBFTE9HVyhzY2hMb2cocE1hYywgTE9HVywgRkwoInNlbmRpbmcgYmVhY29uIHBhcmFtIGNoYW5nZSBiaXRtYXA6IDB4JXggXG4iKSwgYmVhY29uUGFyYW1zLnBhcmFtQ2hhbmdlQml0bWFwKTspCisgICAgICAgIGxpbVNlbmRCZWFjb25QYXJhbXMocE1hYywgJmJlYWNvblBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisgICAgfQorCitmYWlsOgorICAgIHJldHVybjsKKworfQorCisKKworLyoqCisgKiBzY2hCZWFjb25Qcm9jZXNzCisgKgorICogRlVOQ1RJT046CisgKiBQcm9jZXNzIHRoZSByZWNlaXZlZCBiZWFjb24gZnJhbWUKKyAqCisgKiBMT0dJQzoKKyAgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcFJ4UGFja2V0SW5mbyBwb2ludGVyIHRvIGJ1ZmZlciBkZXNjcmlwdG9yCisgKiBAcmV0dXJuIE5vbmUKKyAqLworIAordm9pZCBzY2hCZWFjb25Qcm9jZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTgqIHBSeFBhY2tldEluZm8sIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgc3RhdGljIHRTY2hCZWFjb25TdHJ1Y3QgYmVhY29uU3RydWN0OworICAgIHRVcGRhdGVCZWFjb25QYXJhbXMgYmVhY29uUGFyYW1zOworICAgIHRwUEVTZXNzaW9uIHBBUFNlc3Npb24gPSBOVUxMOworICAgIGJlYWNvblBhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcCA9IDA7CisKKyAgICBwTWFjLT5zY2guZ1NjaEJjblJjdkNudCsrOworCisgICAgLy8gQ29udmVydCB0aGUgYmVhY29uIGZyYW1lIGludG8gYSBzdHJ1Y3R1cmUKKyAgICBpZiAoc2lyQ29udmVydEJlYWNvbkZyYW1lMlN0cnVjdChwTWFjLCAodEFOSV9VOCAqKSBwUnhQYWNrZXRJbmZvLCAmYmVhY29uU3RydWN0KSE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIFBFTE9HRShzY2hMb2cocE1hYywgTE9HRSwgRkwoImJlYWNvbiBwYXJzaW5nIGZhaWxlZFxuIikpOykKKyAgICAgICAgcE1hYy0+c2NoLmdTY2hCY25QYXJzZUVycm9yQ250Kys7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYmVhY29uU3RydWN0LnNzaWRQcmVzZW50KQorICAgIHsKKyAgICAgICAgYmVhY29uU3RydWN0LnNzSWQuc3NJZFtiZWFjb25TdHJ1Y3Quc3NJZC5sZW5ndGhdID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICogRmlyc3QgcHJvY2VzcyB0aGUgYmVhY29uIGluIHRoZSBjb250ZXh0IG9mIGFueSBleGlzdGluZyBBUCBvciBCVEFQIHNlc3Npb24uCisgICAgKiBUaGlzIHRha2VzIGNhcmVzIG9mIGZvbGxvd2luZyB0d28gc2NlbmFyaW9zOgorICAgICogIC0gcHNlc3Npb25FbnRyeSA9IE5VTEw6ICAKKyAgICAqICAgICAgZS5nLiBiZWFjb24gcmVjZWl2ZWQgZnJvbSBhIG5laWdoYm9yaW5nIEJTUywgeW91IHdhbnQgdG8gYXBwbHkgdGhlIHByb3RlY3Rpb24gc2V0dGluZ3MgdG8gQlRBUC9JbmZyYUFQIGJlYWNvbnMKKyAgICAqICAtIHBzZXNzaW9uRW50cnkgaXMgbm9uIE5VTEw6IAorICAgICogICAgICBlLmcuIGJlYWNvbiByZWNlaXZlZCBpcyBmcm9tIHRoZSBJTkZSQSBBUCB0byB3aGljaCB5b3UgYXJlIGNvbm5lY3RlZCBvbiBhbm90aGVyIGNvbmN1cnJlbnQgbGluay4KKyAgICAqICAgICAgSW4gdGhpcyBjYXNlIGFsc28sIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHByb3RlY3Rpb24gc2V0dGluZ3MoYXMgYWR2ZXJ0aXNlZCBieSBJbmZyYSBBUCkgdG8gQlRBUCBiZWFjb25zCisgICAgKiAKKyAgICAqIAorICAgICovCisgICAgCisgICAgaWYoKHBBUFNlc3Npb24gPSBsaW1Jc0FwU2Vzc2lvbkFjdGl2ZShwTWFjKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJlYWNvblBhcmFtcy5ic3NJZHggPSBwQVBTZXNzaW9uLT5ic3NJZHg7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBpZiAocEFQU2Vzc2lvbi0+Z0xpbVByb3RlY3Rpb25Db250cm9sICE9IFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fRElTQUJMRSkKKyNlbHNlCisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbVByb3RlY3Rpb25Db250cm9sICE9IFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT05fRElTQUJMRSkKKyNlbmRpZgorICAgICAgICAgICAgYXBfYmVhY29uX3Byb2Nlc3MocE1hYywgIHBSeFBhY2tldEluZm8sICZiZWFjb25TdHJ1Y3QsICZiZWFjb25QYXJhbXMsIHBBUFNlc3Npb24pOworCisgICAgICAgIGlmIChiZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVXBkYXRlIHRoZSBiZWFjb25zIGFuZCBhcHBseSB0aGUgbmV3IHNldHRpbmdzIHRvIEhBTAorICAgICAgICAgICAgc2NoU2V0Rml4ZWRCZWFjb25GaWVsZHMocE1hYywgcEFQU2Vzc2lvbik7CisgICAgICAgICAgICBQRUxPRzEoc2NoTG9nKHBNYWMsIExPRzEsIEZMKCJCZWFjb24gZm9yIFBFIHNlc3Npb25bJWRdIGdvdCBjaGFuZ2VkLiAgXG4iKSwgcEFQU2Vzc2lvbi0+cGVTZXNzaW9uSWQpOykKKyAgICAgICAgICAgIFBFTE9HMShzY2hMb2cocE1hYywgTE9HMSwgRkwoInNlbmRpbmcgYmVhY29uIHBhcmFtIGNoYW5nZSBiaXRtYXA6IDB4JXggXG4iKSwgYmVhY29uUGFyYW1zLnBhcmFtQ2hhbmdlQml0bWFwKTspCisgICAgICAgICAgICBsaW1TZW5kQmVhY29uUGFyYW1zKHBNYWMsICZiZWFjb25QYXJhbXMsIHBBUFNlc3Npb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAqIE5vdyBwcm9jZXNzIHRoZSBiZWFjb24gaW4gdGhlIGNvbnRleHQgb2YgdGhlIEJTUyB3aGljaCBpcyB0cmFuc21pdHRpbmcgdGhlIGJlYWNvbnMsIGlmIG9uZSBpcyBmb3VuZAorICAgICovCisgICAgaWYocHNlc3Npb25FbnRyeSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgX19zY2hCZWFjb25Qcm9jZXNzTm9TZXNzaW9uKHBNYWMsICAgJmJlYWNvblN0cnVjdCwgcFJ4UGFja2V0SW5mbyApOyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX3NjaEJlYWNvblByb2Nlc3NGb3JTZXNzaW9uKHBNYWMsICAgJmJlYWNvblN0cnVjdCwgcFJ4UGFja2V0SW5mbywgcHNlc3Npb25FbnRyeSApOyAgIAorICAgIH0KKworfQorCisKKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHNjaEJlYWNvbkVkY2FQcm9jZXNzCisgKgorICogRlVOQ1RJT046CisgKiBQcm9jZXNzIHRoZSBFRENBIHBhcmFtZXRlciBzZXQgaW4gdGhlIHJlY2VpdmVkIGJlYWNvbiBmcmFtZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGVkY2EgcmVmZXJlbmNlIHRvIGVkY2EgcGFyYW1ldGVycyBpbiBiZWFjb24gc3RydWN0CisgKiBAcmV0dXJuIHN1Y2Nlc3MKKyAqLworCit0U2lyUmV0U3RhdHVzIHNjaEJlYWNvbkVkY2FQcm9jZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNFZGNhUGFyYW1TZXRJRSAqZWRjYSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1U4IGk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgIHZvc19sb2dfcW9zX2VkY2FfcGt0X3R5cGUgKmxvZ19wdHIgPSBOVUxMOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKworICAgIFBFTE9HMShzY2hMb2cocE1hYywgTE9HMSwgRkwoIlVwZGF0aW5nIHBhcmFtZXRlciBzZXQgY291bnQ6IE9sZCAlZCAtLS0+IG5ldyAlZFxuIiksCisgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1TZXRDb3VudCwgZWRjYS0+cW9zSW5mby5jb3VudCk7KQorCisgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbVNldENvdW50ID0gZWRjYS0+cW9zSW5mby5jb3VudDsKKyAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX0JFXSA9IGVkY2EtPmFjYmU7CisgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19CS10gPSBlZGNhLT5hY2JrOworICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfVkldID0gZWRjYS0+YWN2aTsKKyAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX1ZPXSA9IGVkY2EtPmFjdm87CisvL2xvZzogTE9HX1dMQU5fUU9TX0VEQ0FfQworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgICBXTEFOX1ZPU19ESUFHX0xPR19BTExPQyhsb2dfcHRyLCB2b3NfbG9nX3Fvc19lZGNhX3BrdF90eXBlLCBMT0dfV0xBTl9RT1NfRURDQV9DKTsKKyAgICBpZihsb2dfcHRyKQorICAgIHsKKyAgICAgICBsb2dfcHRyLT5hY2lfYmUgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX0JFXS5hY2kuYWNpOworICAgICAgIGxvZ19wdHItPmN3X2JlICA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfQkVdLmN3Lm1heCA8PCA0IHwKKyAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX0JFXS5jdy5taW47CisgICAgICAgbG9nX3B0ci0+dHhvcGxpbWl0X2JlID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19CRV0udHhvcGxpbWl0OworICAgICAgIGxvZ19wdHItPmFjaV9iayA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfQktdLmFjaS5hY2k7CisgICAgICAgbG9nX3B0ci0+Y3dfYmsgID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19CS10uY3cubWF4IDw8IDQgfAorICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfQktdLmN3Lm1pbjsKKyAgICAgICBsb2dfcHRyLT50eG9wbGltaXRfYmsgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX0JLXS50eG9wbGltaXQ7CisgICAgICAgbG9nX3B0ci0+YWNpX3ZpID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19WSV0uYWNpLmFjaTsKKyAgICAgICBsb2dfcHRyLT5jd192aSAgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX1ZJXS5jdy5tYXggPDwgNCB8CisgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19WSV0uY3cubWluOworICAgICAgIGxvZ19wdHItPnR4b3BsaW1pdF92aSA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfVkldLnR4b3BsaW1pdDsKKyAgICAgICBsb2dfcHRyLT5hY2lfdm8gPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX1ZPXS5hY2kuYWNpOworICAgICAgIGxvZ19wdHItPmN3X3ZvICA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW0VEQ0FfQUNfVk9dLmN3Lm1heCA8PCA0IHwKKyAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tFRENBX0FDX1ZPXS5jdy5taW47CisgICAgICAgbG9nX3B0ci0+dHhvcGxpbWl0X3ZvID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbRURDQV9BQ19WT10udHhvcGxpbWl0OworICAgIH0KKyAgICBXTEFOX1ZPU19ESUFHX0xPR19SRVBPUlQobG9nX3B0cik7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgUEVMT0cxKHNjaExvZyhwTWFjLCBMT0dFLCBGTCgiVXBkYXRpbmcgTG9jYWwgRURDQSBQYXJhbXMoZ0xpbUVkY2FQYXJhbXMpIHRvOiAiKSk7KQorICAgIGZvcihpPTA7IGk8TUFYX05VTV9BQzsgaSsrKQorICAgIHsKKyAgICAgICAgUEVMT0cxKHNjaExvZyhwTWFjLCBMT0cxLCBGTCgiQUNbJWRdOiAgQUlGU046ICVkLCBBQ00gJWQsIENXbWluICVkLCBDV21heCAlZCwgVHhPcCAlZFxuIiksCisgICAgICAgICAgICBpLAorICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0uYWNpLmFpZnNuLCAKKyAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW2ldLmFjaS5hY20sCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS5jdy5taW4sCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS5jdy5tYXgsCisgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS50eG9wbGltaXQpOykKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hEZWJ1Zy5jIGIvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hEZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjM0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL01BQy9zcmMvcGUvc2NoL3NjaERlYnVnLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgc2NoRGVidWcuY2MgY29udGFpbnMgc29tZSBkZWJ1ZyBmdW5jdGlvbnMuCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqLworCisKKyNpbmNsdWRlICJzY2hEZWJ1Zy5oIgorCit2b2lkIHNjaExvZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBsb2dsZXZlbCwgY29uc3QgY2hhciAqcFN0cmluZywuLi4pIAoreworI2lmZGVmIFdMQU5fREVCVUcKKyAgICAvLyBWZXJpZnkgYWdhaW5zdCBjdXJyZW50IGxvZyBsZXZlbAorICAgIGlmICggbG9nbGV2ZWwgPiBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbTE9HX0lOREVYX0ZPUl9NT0RVTEUoIFNJUl9TQ0hfTU9EVUxFX0lEICldICkKKyAgICAgICAgcmV0dXJuOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZhX2xpc3QgbWFya2VyOworCisgICAgICAgIHZhX3N0YXJ0KCBtYXJrZXIsIHBTdHJpbmcgKTsgICAgIC8qIEluaXRpYWxpemUgdmFyaWFibGUgYXJndW1lbnRzLiAqLworCisgICAgICAgIGxvZ0RlYnVnKHBNYWMsIFNJUl9TQ0hfTU9EVUxFX0lELCBsb2dsZXZlbCwgcFN0cmluZywgbWFya2VyKTsKKyAgICAgICAgCisgICAgICAgIHZhX2VuZCggbWFya2VyICk7ICAgICAgICAgICAgICAvKiBSZXNldCB2YXJpYWJsZSBhcmd1bWVudHMuICAgICAgKi8KKyAgICB9CisjZW5kaWYKK30KKworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUPT1BUCkKKyNpZmRlZiBXTU1fU0EKKworI2luY2x1ZGUgInNjaENsYXNzLmgiCisjaW5jbHVkZSAic2NoRGVidWcuaCIKKworCit2b2lkIGR1bXBTY2hlZHVsZSh0QU5JX1U4IGluZGV4KQoreworICB0cFNjaFNjaGVkdWxlIHMgPSAmc2NoZWR1bGVbaW5kZXhdOworCisgIFBFTE9HMihzY2hMb2cocE1hYywgTE9HMiwgRkwoIj09PT09PT09PT09PT09IFNDSEVEVUxFICVkID09PT09PT09PT09PT09PVxuIiksIGluZGV4KTspCisgIGR1bXBTY2hlZHVsZShzKTsKK30KKwordm9pZCBzY2hDbGFzczo6ZHVtcFNjaGVkdWxlKHRwU2NoU2NoZWR1bGUgcykKK3sKKyBQRUxPRzIoc2NoTG9nKHBNYWMsIExPRzIsIEZMKCJcdHRvdFR4b3AgJWQgdG90SW5zdCAlZCBjdXJJbnN0ICVkXG4iKSwgCisgICAgICAgICBzLT50b3RUeG9wTG8rMHgxMDAqcy0+dG90VHhvcEhpLCBzLT50b3RJbnN0LCBzLT5jdXJJbnN0KTspCisgIGZvcih0QU5JX1UzMiBpPTA7IGk8cy0+dG90SW5zdDsgaSsrKQorICAgIHsKKyAgICAgIFBFTE9HMihzY2hMb2cocE1hYywgTE9HMiwgRkwoIlx0WyVkXSAiKSwgaSk7KQorICAgICAgZHVtcEluc3RydWN0aW9uKCZzLT5pbnN0W2ldKTsKKyAgICB9CisgIFBFTE9HMihzY2hMb2cocE1hYywgTE9HMiwgRkwoIlx0KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrK1xuIikpOykKK30KKwordm9pZCBkdW1wSW5zdHJ1Y3Rpb24odHBTY2hJbnN0cnVjdGlvbiB0KQoreworICBpZiAodC0+dHlwZSA9PSBTQ0hfSU5TVF9EQVRBKQorICAgUEVMT0cyKHNjaExvZyhwTWFjLCBMT0cyLCAiREFUQSAoJWQsJWQpIHR4b3AgJWQgZmVlZGJhY2sgJWRcbiIsIAorICAgICAgICAgICAgICAgICB0LT5zdGFpZExvKzB4MTAqdC0+c3RhaWRIaSwgdC0+cHJpLCAKKyAgICAgICAgICAgICAgICAgdC0+dHhvcExvKzB4MTAwKnQtPnR4b3BIaSwgdC0+ZmVlZGJhY2spOykKKyAgZWxzZQorICAgUEVMT0cyKHNjaExvZyhwTWFjLCBMT0cyLCAiUE9MTCAoJWQsJWQpIHR4b3AgJWQgZmVlZGJhY2sgJWRcbiIsIAorICAgICAgICAgICAgICAgICB0LT5zdGFpZExvKzB4MTAqdC0+c3RhaWRIaSwgdC0+cHJpLCAKKyAgICAgICAgICAgICAgICAgdC0+dHhvcExvKzB4MTAwKnQtPnR4b3BIaSwgdC0+ZmVlZGJhY2spOykKK30KKwordm9pZCBkdW1wUXVldWVTaXplcygpCit7CisgIFBFTE9HMyhzY2hMb2cocE1hYywgTE9HMywgRkwoIi0tLS0tLS0gUVVFVUUgU0laRVMgW3N0YV1bcHJpXVtETCgwKS9VTCgxKV0gLS0tLS0tLVxuIikpOykKKyAgZm9yKGludCBpPTA7IGk8MjU2OyBpKyspCisgICAgZm9yKGludCBqPTA7IGo8ODsgaisrKQorICAgICAgZm9yKGludCBrPTA7IGs8MjsgaysrKQorICAgICAgeworICAgICAgICAgaWYgKHF1ZXVlW2ldW2pdW2tdLnBhY2tldHMgPiAwKQorICAgICAgICAgICAgUEVMT0czKHNjaExvZyhwTWFjLCBMT0czLCBGTCgiXHRRdWV1ZUxlbmd0aFslZF1bJWRdWyVkXSA9ICVkIHBhY2tldHMgJWQgdHhvcCAoc2VydmljZWQgJWQpXG4iKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIGssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlW2ldW2pdW2tdLnBhY2tldHMsIHF1ZXVlW2ldW2pdW2tdLnR4b3AsIHF1ZXVlW2ldW2pdW2tdLnNlcnZpY2VkKTspCisgICAgICB9Cit9CisKK3ZvaWQgcHJpbnRRb3NDbGFzcyh0QU5JX1U4IGNsYXNzSWQpCit7CisgIHNjaFFvU0NsYXNzICpxID0gJnFvc0NsYXNzW2NsYXNzSWRdOworCisgIGlmIChxLT5hY3RpdmVOZXh0ID09IE5VTEwpCisgICAgUEVMT0czKHNjaExvZyhwTWFjLCBMT0czLCBGTCgicHJpbnRRb3NDbGFzc1slZF0gOiBBY3RpdmUgbGlzdCBlbXB0eVxuIiksIGNsYXNzSWQpOykKKyAgZWxzZQorICAgIHsKKyAgICAgIHRwU2NoUXVldWVTdGF0ZSBwdHIgPSBxLT5hY3RpdmVOZXh0LT5uZXh0OworICAgICAgdEFOSV9VMTYgaTsKKyAgICAgIGZvcihpPTE7IHB0ciAhPSBxLT5hY3RpdmVOZXh0OyBwdHIgPSBwdHItPm5leHQsIGkrKyk7CisgICAgIFBFTE9HMyhzY2hMb2cocE1hYywgTE9HMywgRkwoInByaW50UW9zQ2xhc3NbJWRdIDogQWN0aXZlIFFzICVkIG5leHRQdHIgJXggcHJldlB0ciAleCBjcmVkaXRzUmVtICVkXG4iKSwgCisgICAgICAgICAgICAgICAgICAgY2xhc3NJZCwgaSwgKHRBTklfVTMyKSBxLT5hY3RpdmVOZXh0LCAodEFOSV9VMzIpIHEtPmFjdGl2ZVByZXYsIHEtPmNyZWRpdHNSZW1haW5pbmcpOykKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBXTU1fU0EgKi8KKyNlbmRpZiAvLyAoV05JX1BPTEFSSVNfRldfUFJPRFVDVD09QVApCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvc2NoL3NjaERlYnVnLmggYi9DT1JFL01BQy9zcmMvcGUvc2NoL3NjaERlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkNTIzZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvTUFDL3NyYy9wZS9zY2gvc2NoRGVidWcuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHNjaERlYnVnLmggY29udGFpbnMgc29tZSBkZWJ1ZyBtYWNyb3MuCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpZm5kZWYgX19TQ0hfREVCVUdfSF9fCisjZGVmaW5lIF9fU0NIX0RFQlVHX0hfXworCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsQ29tbW9uQXBpLmgiCisjZW5kaWYKKyNpbmNsdWRlICJzaXJEZWJ1Zy5oIgorCisKKwordm9pZCBzY2hMb2codHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHJpbmcsLi4uKSA7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICoKKyAqLworCisjaWZkZWYgU0NIX0RFQlVHX1NUQVRTCitpbmxpbmUgdm9pZCBzY2hDbGFzczo6c2NoVHJhY2UodFNjaFRyYWNlIGV2ZW50LCB0QU5JX1UzMiBhcmcpCit7CisgICAgaWYgKGdTY2hGcmVlemVEdW1wKSByZXR1cm47CisgICAgaWYgKCh0QU5JX1UzMilldmVudCA+PSB0cmFjZUxldmVsKSByZXR1cm47CisKKyAgICB0cmFjZUJ1ZltjdXJUcmFjZV0uZXZlbnQgPSBldmVudDsKKyAgICB0cmFjZUJ1ZltjdXJUcmFjZV0uYXJnID0gYXJnOworICAgIHRyYWNlQnVmW2N1clRyYWNlXS50aW1lc3RhbXAgPSBoYWxHZXRUc2ZMb3cocE1hYyk7CisgICAgY3VyVHJhY2UgPSAoY3VyVHJhY2UrMSklU0NIX1RSQUNFX0JVRl9TSVpFOworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hNZXNzYWdlLmMgYi9DT1JFL01BQy9zcmMvcGUvc2NoL3NjaE1lc3NhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGJiMWIwCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hNZXNzYWdlLmMKQEAgLTAsMCArMSw2ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBzY2hNZXNzYWdlLmNjIGNvbnRhaW5zIHRoZSBtZXNzYWdlIGhhbmRsZXIKKyAqCisgKiBBdXRob3I6ICAgICAgU2FuZGVzaCBHb2VsCisgKiBEYXRlOiAgICAgICAgMDIvMjUvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNpbmNsdWRlICJwYWxUeXBlcy5oIgorI2luY2x1ZGUgInNpckNvbW1vbi5oIgorCisjaW5jbHVkZSAid25pQ2ZnQXAuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsQ29tbW9uQXBpLmgiCisjZW5kaWYKKyNpbmNsdWRlICJjZmdBcGkuaCIKKyNpbmNsdWRlICJsaW1BcGkuaCIKKyNpbmNsdWRlICJwbW1BcGkuaCIKKyNpbmNsdWRlICJsaW1TZW5kTWVzc2FnZXMuaCIKKworCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAic2NoRGVidWcuaCIKKworLy8vIE1pbmltdW0gYmVhY29uIGludGVydmFsIGFsbG93ZWQgKGluIEt1cykKKyNkZWZpbmUgU0NIX0JFQUNPTl9JTlRFUlZBTF9NSU4gIDEwCisKKy8vLyBNYXhpbXVtIGJlYWNvbiBpbnRlcnZhbCBhbGxvd2VkIChpbiBLdXMpCisjZGVmaW5lIFNDSF9CRUFDT05fSU5URVJWQUxfTUFYICAxMDAwMAorCisvLy8gY29udmVydCB0aGUgQ1cgdmFsdWVzIGludG8gYSB0QU5JX1UxNgorI2RlZmluZSBHRVRfQ1cocEN3KSAoKHRBTklfVTE2KSAoKCoocEN3KSA8PCA4KSArICooKHBDdykgKyAxKSkpCisKKy8vIGxvY2FsIGZ1bmN0aW9ucworc3RhdGljIHRTaXJSZXRTdGF0dXMgZ2V0V21tTG9jYWxQYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgcGFyYW1zW11bV05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMX0xFTl0pOworc3RhdGljIHZvaWQgc2V0U2NoRWRjYVBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBwYXJhbXNbXVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOXSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHNjaFNldEJlYWNvbkludGVydmFsCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gTm9uZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBzY2hTZXRCZWFjb25JbnRlcnZhbCh0cEFuaVNpckdsb2JhbCBwTWFjLHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMzIgYmk7CisKKyAgICBiaSA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbDsKKworICAgIGlmIChiaSA8IFNDSF9CRUFDT05fSU5URVJWQUxfTUlOIHx8IGJpID4gU0NIX0JFQUNPTl9JTlRFUlZBTF9NQVgpCisgICAgeworICAgICAgICBzY2hMb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgYmVhY29uIGludGVydmFsICVkIChzaG91bGQgYmUgWyVkLCVkXVxuIiksCisgICAgICAgICAgICAgICBiaSwgU0NIX0JFQUNPTl9JTlRFUlZBTF9NSU4sIFNDSF9CRUFDT05fSU5URVJWQUxfTUFYKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbkludGVydmFsID0gKHRBTklfVTE2KWJpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHNjaFNldEluaXRQYXJhbXMKKyAqCisgKiBGVU5DVElPTjoKKyAqIEluaXRpYWxpemUgcGFyYW1ldGVycyBmcm9tIENGRyB3aGljaCBkbyBub3QgZGVwZW5kIG9uIGFueSBvdGhlciBjb25maWcKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBOb25lCisgKiBAcmV0dXJuIE5vbmUKKyAqLworCisjaWYgMCAvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGFueXdoZXJlICovCit2b2lkCitzY2hTZXRJbml0UGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoRFRJTUNvdW50ID0gMDsKKyAgICBwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hDRlBDb3VudCA9IDA7CisKKyAgICBzY2hRb3NVcGRhdGVMb2NhbChwTWFjKTsKKworICAgIFBFTE9HMShzY2hMb2cocE1hYywgTE9HMSwgRkwoIkZpbmlzaGVkIGluaXQgb2YgU0NIIHBhcmFtc1xuIikpOykKK30KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzY2hQcm9jZXNzTWVzc2FnZQorICoKKyAqIEZVTkNUSU9OOgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIE5vbmUKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQgc2NoUHJvY2Vzc01lc3NhZ2UodHBBbmlTaXJHbG9iYWwgcE1hYyx0cFNpck1zZ1EgcFNjaE1zZykKK3sKKyNpZmRlZiBGSVhNRV9HRU42CisgICAgdEFOSV9VMzIgICAgICAgICAgICAqcEJEOworICAgIHRwU2lyTWFjTWdtdEhkciAgICAgbWg7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqcFBhY2tldDsKKyNlbmRpZgorICAgIHRBTklfVTMyICAgICAgICAgICAgdmFsOworCisgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSA9ICZwTWFjLT5saW0uZ3BTZXNzaW9uWzBdOyAgLy9UQkQtUkFKRVNIIEhPVyBUTyBHRVQgc2Vzc2lvbkVudHJ5Pz8/Pz8KKyAgICBQRUxPRzMoc2NoTG9nKHBNYWMsIExPRzMsIEZMKCJSZWNlaXZlZCBtZXNzYWdlICgleCkgXG4iKSwgcFNjaE1zZy0+dHlwZSk7KQorCisgICAgc3dpdGNoIChwU2NoTXNnLT50eXBlKQorICAgIHsKKyNpZmRlZiBGSVhNRV9HRU42CisgICAgICAgIGNhc2UgU0lSX0JCX1hQT1JUX01HTVRfTVNHOgorICAgICAgICAgICAgcE1hYy0+c2NoLmdTY2hCQlhwb3J0UmN2Q250Kys7CisKKworI2lmIGRlZmluZWQgKEFOSV9PU19UWVBFX0xJTlVYKSB8fCBkZWZpbmVkIChBTklfT1NfVFlQRV9PU1gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsR2V0UGFja2V0RGF0YVB0ciggcE1hYy0+aEhkZCwgSEFMX1RYUlhfRlJNXzgwMl8xMV9NR01ULCBwU2NoTXNnLT5ib2R5cHRyLCAodm9pZCAqKikgJihwQkQpICk7CisgICAgICAgICAgICB9CisjZWxzZSAKKyAgICAgICAgICAgIHBCRCA9ICh0QU5JX1UzMiAqKSBwU2NoTXNnLT5ib2R5cHRyOworI2VuZGlmCisKKworICAgICAgICAgICAgbWggPSBTSVJfTUFDX0JEX1RPX01QRFVIRUFERVIoIHBCRCApOworCisgICAgICAgICAgICBpZiAobWgtPmZjLnR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FICYmCisgICAgICAgICAgICAgICAgbWgtPmZjLnN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0JFQUNPTikKKyAgICAgICAgICAgICAgICBzY2hCZWFjb25Qcm9jZXNzKHBNYWMsIHBCRCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2NoTG9nKHBNYWMsIExPR0UsIEZMKCJVbmV4cGVjdGVkIG1lc3NhZ2UgKCVkLCVkKSByY3ZkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWgtPmZjLnR5cGUsIG1oLT5mYy5zdWJUeXBlKTsKKyAgICAgICAgICAgICAgICBwTWFjLT5zY2guZ1NjaFVua25vd25SY3ZDbnQrKzsKKyAgICAgICAgICAgIH0KKyNpZiBkZWZpbmVkIChBTklfT1NfVFlQRV9MSU5VWCkgfHwgZGVmaW5lZCAoQU5JX09TX1RZUEVfT1NYKQorICAgICAgICAvLyBGcmVlIHVwIGFsbG9jYXRlZCBTSyBCVUYKKyAgICAgICAgLy9mb3IgV2luZG93cywgdGhpcyBpcyBmcmVlZCB1cCBieSBwYWxIYW5kbGVSeEZyYW1lcworICAgICAgICBwYWxQa3RGcmVlKCBwTWFjLT5oSGRkLCBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsIHBCRCwgKHZvaWQgKikgcFNjaE1zZy0+Ym9keXB0cikgOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICAgIGNhc2UgU0lSX1NDSF9DSEFOTkVMX1NXSVRDSF9SRVFVRVNUOgorICAgICAgICAgICAgc2NoTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgRkwoIkNoYW5uZWwgc3dpdGNoIHJlcXVlc3Qgbm90IGhhbmRsZWRcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lSX1NDSF9TVEFSVF9TQ0FOX1JFUToKKyAgICAgICAgICAgIFNJUl9TQ0hFRF9MT0NLKCk7CisgICAgICAgICAgICBwTWFjLT5zY2guZ1NjaFNjYW5SZXFSY3ZkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChwTWFjLT5zY2guZ1NjaEhjZkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSW4gSENGIG1vZGUsIHdhaXQgZm9yIFRGUCB0byBzdG9wIGJlZm9yZSBzZW5kaW5nIGEgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICBpZiAocE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQ0ZCSW5pdGlhdGVkIHx8CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaENGUEluaXRpYXRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgUEVMT0cxKHNjaExvZyhwTWFjLCBMT0cxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldhaXRpbmcgZm9yIFRGUCB0byBoYWx0IGJlZm9yZSBzZW5kaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFydCBzY2FuIHJlc3BvbnNlXG4iKSk7KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNjaFNlbmRTdGFydFNjYW5Sc3AocE1hYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSW4gZURDRiBtb2RlLCBzZW5kIHRoZSByZXNwb25zZSByaWdodCBhd2F5CisgICAgICAgICAgICAgICAgc2NoU2VuZFN0YXJ0U2NhblJzcChwTWFjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNJUl9TQ0hFRF9VTkxPQ0soKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lSX1NDSF9FTkRfU0NBTl9OVEY6CisgICAgICAgICAgIFBFTE9HMyhzY2hMb2cocE1hYywgTE9HMywKKyAgICAgICAgICAgICAgICAgICBGTCgiUmVjZWl2ZWQgU1RPUF9TQ0FOX05URiBmcm9tIExJTVxuIikpOykKKyAgICAgICAgICAgIHBNYWMtPnNjaC5nU2NoU2NhblJlcVJjdmQgPSBmYWxzZTsKKyNpZmRlZiBXTU1fU0EKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICAgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSAmJiBwTWFjLT5zY2guZ1NjaEhjZkVuYWJsZWQpCisgICAgICAgICAgICAgICAgc3RhcnRDRkIoKTsKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9DRkdfUEFSQU1fVVBEQVRFX0lORDoKKworICAgICAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsICh0QU5JX1UxNikgcFNjaE1zZy0+Ym9keXZhbCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHNjaExvZyhwTWFjLCBMT0dQLCBGTCgiZmFpbGVkIHRvIGNmZyBnZXQgaWQgJWRcbiIpLCBwU2NoTXNnLT5ib2R5dmFsKTsKKworICAgICAgICAgICAgc3dpdGNoIChwU2NoTXNnLT5ib2R5dmFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19CRUFDT05fSU5URVJWQUw6CisgICAgICAgICAgICAgICAgICAgIC8vIFdoYXQgdG8gZG8gZm9yIElCU1MgPz8gLSBUQkQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICAgICAgICAgICAgICAgICAgc2NoU2V0QmVhY29uSW50ZXJ2YWwocE1hYyxwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19EVElNX1BFUklPRDoKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoRFRJTUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFdOSV9DRkdfQ0ZQX1BFUklPRDoKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2NoLnNjaE9iamVjdC5nU2NoQ0ZQQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX1BST0ZJTEU6CisgICAgICAgICAgICAgICAgICAgIHNjaEVkY2FQcm9maWxlVXBkYXRlKHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMOgorICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMOgorICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX0FOSV9BQ1ZJX0xPQ0FMOgorICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX0FOSV9BQ1ZPX0xPQ0FMOgorICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX1dNRV9BQ0JLX0xPQ0FMOgorICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX1dNRV9BQ0JFX0xPQ0FMOgorICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX1dNRV9BQ1ZJX0xPQ0FMOgorICAgICAgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX1dNRV9BQ1ZPX0xPQ0FMOgorICAgICAgICAgICAgICAgICAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBzY2hRb3NVcGRhdGVMb2NhbChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRURDQV9BTklfQUNCSzoKKyAgICAgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRURDQV9BTklfQUNCRToKKyAgICAgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRURDQV9BTklfQUNWSToKKyAgICAgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRURDQV9BTklfQUNWTzoKKyAgICAgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRURDQV9XTUVfQUNCSzoKKyAgICAgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRURDQV9XTUVfQUNCRToKKyAgICAgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRURDQV9XTUVfQUNWSToKKyAgICAgICAgICAgICAgICBjYXNlIFdOSV9DRkdfRURDQV9XTUVfQUNWTzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtU2V0Q291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaFFvc1VwZGF0ZUJyb2FkY2FzdChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHNjaExvZyhwTWFjLCBMT0dFLCBGTCgiQ2ZnIHBhcmFtICVkIGluZGljYXRpb24gbm90IGhhbmRsZWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjaE1zZy0+Ym9keXZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2NoTG9nKHBNYWMsIExPR0UsIEZMKCJVbmtub3duIG1lc3NhZ2UgaW4gc2NoTXNnUSB0eXBlICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwU2NoTXNnLT50eXBlKTsKKyAgICB9CisKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzY2hQcm9jZXNzTWVzc2FnZVF1ZXVlCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gTm9uZQorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZCBzY2hQcm9jZXNzTWVzc2FnZVF1ZXVlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdFNpck1zZ1Egc2NoTXNnOworCisjaWYgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApCisgICAgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgICAgIHBNYWMtPnNjaC5nU2NoUlJSZWNkID0gZmFsc2U7CisjZW5kaWYKKyAgICBtZW1zZXQoJnNjaE1zZywgMCwgc2l6ZW9mKHRTaXJNc2dRKSk7CisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBpZiAodHhfcXVldWVfcmVjZWl2ZSgmcE1hYy0+c3lzLmdTaXJTY2hNc2dRLCAodm9pZCAqKSAmc2NoTXNnLCBUWF9XQUlUX0ZPUkVWRVIpCisgICAgICAgICAgICAhPSBUWF9TVUNDRVNTKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgc2NoUHJvY2Vzc01lc3NhZ2UocE1hYywgJnNjaE1zZyk7CisgICAgfQorI2lmZGVmIFdNTV9TQQorI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKQorICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICYmIHBNYWMtPnNjaC5nU2NoUlJSZWNkKQorICAgICAgICBzdGFydENGQigpOworI2VuZGlmCisjZW5kaWYKK30KKworI2lmIDAgLyogVGhpcyBmdW5jdGlvbiBpcyBub3QgdXNlZCBhbnl3aGVyZSAqLworLy8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHBhcmFtcyBvZiBpbnRlcmVzdAordm9pZAorc2NoVXBkYXRlUW9zSW5mbyggdHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICAvLyBuZWVkIHRvIHBvcHVsYXRlIGxvY2FsIGluZm8gb25seSBvbiBBUCBvciBJQlNTLCBiZWFjb24gcHJvY2Vzc2luZworICAgIC8vIHRha2VzIGNhcmUgb2Ygb3RoZXJzCisgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbVNldENvdW50ID0gMHhGRjsKKworICAgIGlmIChwTWFjLT5saW0uZ0xpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfSU5fSUJTU19ST0xFKQorICAgIHsKKyAgICAgICAgc2NoUW9zVXBkYXRlTG9jYWwocE1hYyk7CisgICAgfQorICAgIGVsc2UgaWYgKHBNYWMtPmxpbS5nTGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUpCisgICAgeworICAgICAgICAvLyBmaWxsIGxvY2FsIEFQIHZhbHVlcworICAgICAgICBzY2hRb3NVcGRhdGVMb2NhbChwTWFjKTsKKworICAgICAgICAvLyBmaWxsIGJyb2FkY2FzdCB2YWx1ZXMKKyAgICAgICAgc2NoUW9zVXBkYXRlQnJvYWRjYXN0KHBNYWMsIHBzZXNzaW9uRW50cnkpOworICAgIH0KK30KKworI2VuZGlmCisKKy8vIGdldCB0aGUgbG9jYWwgb3IgYnJvYWRjYXN0IHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIHByb2ZpbGUgc2VwY2lmaWVkIGluIHRoZSBjb25maWcKKy8vIHBhcmFtcyBhcmUgZGVsaXZlcmVkIGluIHRoaXMgb3JkZXI6IEJLLCBCRSwgVkksIFZPCit0U2lyUmV0U3RhdHVzCitzY2hHZXRQYXJhbXMoCisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIHBhcmFtc1tdW1dOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU5dLAorICAgIHRBTklfVTggICAgICAgICAgIGxvY2FsKQoreworICAgIHRBTklfVTMyIHZhbDsKKyAgICB0QU5JX1UzMiBpLGlkeDsKKyAgICB0QU5JX1UzMiAqcHJmOworCisgICAgdEFOSV9VMzIgYW5pX2xbXSA9IHsgV05JX0NGR19FRENBX0FOSV9BQ0JFX0xPQ0FMLFdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTCwKKyAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0VEQ0FfQU5JX0FDVklfTE9DQUwsIFdOSV9DRkdfRURDQV9BTklfQUNWT19MT0NBTCB9OworICAgIHRBTklfVTMyIHdtZV9sW10gPSB7V05JX0NGR19FRENBX1dNRV9BQ0JFX0xPQ0FMLCBXTklfQ0ZHX0VEQ0FfV01FX0FDQktfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgV05JX0NGR19FRENBX1dNRV9BQ1ZJX0xPQ0FMLCBXTklfQ0ZHX0VEQ0FfV01FX0FDVk9fTE9DQUx9OworICAgIHRBTklfVTMyIGRlbW9fbFtdID0ge1dOSV9DRkdfRURDQV9USVRfREVNT19BQ0JFX0xPQ0FMLCBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNCS19MT0NBTCwKKyAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNWSV9MT0NBTCwgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDVk9fTE9DQUx9OworICAgIHRBTklfVTMyIGFuaV9iW10gPSB7V05JX0NGR19FRENBX0FOSV9BQ0JFLCBXTklfQ0ZHX0VEQ0FfQU5JX0FDQkssCisgICAgICAgICAgICAgICAgICAgV05JX0NGR19FRENBX0FOSV9BQ1ZJLCBXTklfQ0ZHX0VEQ0FfQU5JX0FDVk99OworICAgIHRBTklfVTMyIHdtZV9iW10gPSB7V05JX0NGR19FRENBX1dNRV9BQ0JFLCBXTklfQ0ZHX0VEQ0FfV01FX0FDQkssCisgICAgICAgICAgICAgICAgICAgV05JX0NGR19FRENBX1dNRV9BQ1ZJLCBXTklfQ0ZHX0VEQ0FfV01FX0FDVk99OworICAgIHRBTklfVTMyIGRlbW9fYltdID0ge1dOSV9DRkdfRURDQV9USVRfREVNT19BQ0JFLCBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNCSywKKyAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0VEQ0FfVElUX0RFTU9fQUNWSSwgV05JX0NGR19FRENBX1RJVF9ERU1PX0FDVk99OworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfRURDQV9QUk9GSUxFLCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBzY2hMb2cocE1hYywgTE9HUCwgRkwoImZhaWxlZCB0byBjZmcgZ2V0IEVEQ0FfUFJPRklMRSBpZCAlZFxuIiksCisgICAgICAgICAgICAgICBXTklfQ0ZHX0VEQ0FfUFJPRklMRSk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKHZhbCA+PSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9NQVgpCisgICAgeworICAgICAgICBzY2hMb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgRURDQV9QUk9GSUxFICVkLCB1c2luZyAlZCBpbnN0ZWFkXG4iKSwKKyAgICAgICAgICAgICAgIHZhbCwgV05JX0NGR19FRENBX1BST0ZJTEVfQU5JKTsKKyAgICAgICAgdmFsID0gV05JX0NGR19FRENBX1BST0ZJTEVfQU5JOworICAgIH0KKworICAgIHNjaExvZyhwTWFjLCBMT0dXLCBGTCgiRWRjYVByb2ZpbGU6IFVzaW5nICVkICglcylcbiIpLCAgdmFsLAorICAgICAgICAgICAoKHZhbCA9PSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9XTU0pID8gIldNTSIKKyAgICAgICAgICAgOiAoICh2YWwgPT0gV05JX0NGR19FRENBX1BST0ZJTEVfVElUX0RFTU8pID8gIlRpdGFuIiA6ICJIaVBlcmYiKSkpOworCisgICAgaWYgKGxvY2FsKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgY2FzZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9XTU06CisgICAgICAgICAgICAgIHByZiA9ICZ3bWVfbFswXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX1BST0ZJTEVfVElUX0RFTU86CisgICAgICAgICAgICAgIHByZiA9ICZkZW1vX2xbMF07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlIFdOSV9DRkdfRURDQV9QUk9GSUxFX0FOSToKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcHJmID0gJmFuaV9sWzBdOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzd2l0Y2ggKHZhbCkKKyAgICAgICAgeworICAgICAgICAgICBjYXNlIFdOSV9DRkdfRURDQV9QUk9GSUxFX1dNTToKKyAgICAgICAgICAgICAgcHJmID0gJndtZV9iWzBdOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9USVRfREVNTzoKKyAgICAgICAgICAgICAgcHJmID0gJmRlbW9fYlswXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2UgV05JX0NGR19FRENBX1BST0ZJTEVfQU5JOgorICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBwcmYgPSAmYW5pX2JbMF07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICB0QU5JX1U4ICBkYXRhW1dOSV9DRkdfRURDQV9BTklfQUNCS19MRU5dOworICAgICAgICB0QU5JX1UzMiBsZW4gPSBXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOOworICAgICAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywgKHRBTklfVTE2KSBwcmZbaV0sICh0QU5JX1U4ICopICZkYXRhWzBdLCAmbGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjaExvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnR2V0IGZhaWxlZCBmb3IgJWRcbiIpLCBwcmZbaV0pOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuID4gV05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMX0xFTikKKyAgICAgICAgeworICAgICAgICAgICAgc2NoTG9nKHBNYWMsIExPR0UsIEZMKCJjZmdHZXQgZm9yICVkOiBsZW5ndGggaXMgJWQgaW5zdGVhZCBvZiAlZFxuIiksCisgICAgICAgICAgICAgICAgICAgcHJmW2ldLCBsZW4sIFdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU4pOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGlkeD0wOyBpZHggPCBsZW47IGlkeCsrKQorICAgICAgICAgICAgcGFyYW1zW2ldW2lkeF0gPSAodEFOSV9VMzIpIGRhdGFbaWR4XTsKKyAgICB9CisgICAgUEVMT0cxKHNjaExvZyhwTWFjLCBMT0cxLCBGTCgiR2V0UGFyYW1zOiBsb2NhbD0lZCwgcHJvZmlsZSA9ICVkIERvbmVcbiIpLCBsb2NhbCwgdmFsKTspCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordm9pZAorc2NoUW9zVXBkYXRlQnJvYWRjYXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMzIgICAgICAgIHBhcmFtc1s0XVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOXTsKKyAgICB0QU5JX1UzMiAgICAgICAgY3dtaW5pZHgsIGN3bWF4aWR4LCB0eG9waWR4OworICAgIHRBTklfVTMyICAgICAgICBwaHlNb2RlOworICAgIHRBTklfVTggICAgICAgICBpOworCisgICAgaWYgKHNjaEdldFBhcmFtcyhwTWFjLCBwYXJhbXMsIGZhbHNlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0Uoc2NoTG9nKHBNYWMsIExPR0UsIEZMKCJRb3NVcGRhdGVCcm9hZGNhc3Q6IGZhaWxlZFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsaW1HZXRQaHlNb2RlKHBNYWMsICZwaHlNb2RlLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgIFBFTE9HMShzY2hMb2cocE1hYywgTE9HMSwgIlFvc1VwZEJjYXN0OiBtb2RlICVkXG4iLCBwaHlNb2RlKTspCisKKyAgICBpZiAocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykKKyAgICB7CisgICAgICAgIGN3bWluaWR4ID0gV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNSU5HX0lEWDsKKyAgICAgICAgY3dtYXhpZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01BWEdfSURYOworICAgICAgICB0eG9waWR4ICA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX1RYT1BHX0lEWDsKKyAgICB9CisgICAgZWxzZSBpZiAocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExQikKKyAgICB7CisgICAgICAgIGN3bWluaWR4ID0gV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNSU5CX0lEWDsKKyAgICAgICAgY3dtYXhpZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01BWEJfSURYOworICAgICAgICB0eG9waWR4ICA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX1RYT1BCX0lEWDsKKyAgICB9CisgICAgZWxzZSAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgbW9kZSBpcyBub3Qgc2V0IHlldCwgYXNzdW1lIDExYSBtb2RlCisgICAgeworICAgICAgICBjd21pbmlkeCA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUlOQV9JRFg7CisgICAgICAgIGN3bWF4aWR4ID0gV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNQVhBX0lEWDsKKyAgICAgICAgdHhvcGlkeCAgPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9UWE9QQV9JRFg7CisgICAgfQorCisKKyAgICBmb3IoaT0wOyBpPE1BWF9OVU1fQUM7IGkrKykKKyAgICB7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uYWNpLmFjbSA9ICh0QU5JX1U4KSBwYXJhbXNbaV1bV05JX0NGR19FRENBX1BST0ZJTEVfQUNNX0lEWF07CisgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uYWNpLmFpZnNuID0gKHRBTklfVTgpIHBhcmFtc1tpXVtXTklfQ0ZHX0VEQ0FfUFJPRklMRV9BSUZTTl9JRFhdOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDW2ldLmN3Lm1pbiA9ICBjb252ZXJ0Q1coR0VUX0NXKCZwYXJhbXNbaV1bY3dtaW5pZHhdKSk7CisgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uY3cubWF4ID0gIGNvbnZlcnRDVyhHRVRfQ1coJnBhcmFtc1tpXVtjd21heGlkeF0pKTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1tpXS50eG9wbGltaXQ9ICAodEFOSV9VMTYpIHBhcmFtc1tpXVt0eG9waWR4XTsKKworICAgICAgIFBFTE9HMShzY2hMb2cocE1hYywgTE9HMSwgIlFvU1VwZGF0ZUJDYXN0OiBBQyA6JWQ6IEFJRlNOOiAlZCwgQUNNICVkLCBDV21pbiAlZCwgQ1dtYXggJWQsIFR4T3AgJWRcbiIsIGksCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1tpXS5hY2kuYWlmc24sCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1tpXS5hY2kuYWNtLAorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uY3cubWluLAorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0uY3cubWF4LAorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbaV0udHhvcGxpbWl0KTspCisKKyAgICB9CisKKyAgICBpZiAoc2NoU2V0Rml4ZWRCZWFjb25GaWVsZHMocE1hYyxwc2Vzc2lvbkVudHJ5KSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIFBFTE9HRShzY2hMb2cocE1hYywgTE9HRSwgIlVuYWJsZSB0byBzZXQgYmVhY29uIGZpZWxkcyFcbiIpOykKK30KKwordm9pZAorc2NoUW9zVXBkYXRlTG9jYWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKworICAgIHRBTklfVTMyIHBhcmFtc1s0XVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOXTsKKyAgICB0QU5JX0JPT0xFQU4gaGlnaFBlcmZvcm1hbmNlPWVBTklfQk9PTEVBTl9UUlVFOworCisgICAgaWYgKHNjaEdldFBhcmFtcyhwTWFjLCBwYXJhbXMsIHRydWUgLypsb2NhbCovKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBQRUxPR0Uoc2NoTG9nKHBNYWMsIExPR0UsIEZMKCJzY2hHZXRQYXJhbXMobG9jYWwpIGZhaWxlZFxuIikpOykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNldFNjaEVkY2FQYXJhbXMocE1hYywgcGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSkKKyAgICB7CisgICAgICAgIGlmIChwTWFjLT5saW0uZ0xpbU51bU9mQW5pU1RBcykKKyAgICAgICAgICAgIGhpZ2hQZXJmb3JtYW5jZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoaWdoUGVyZm9ybWFuY2UgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorICAgIGVsc2UgaWYgKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9TVEFfSU5fSUJTU19ST0xFKQorICAgIHsKKyAgICAgICAgaGlnaFBlcmZvcm1hbmNlID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgfQorCisgICAgLy9Gb3IgQVAsIHRoZSBic3NJRCBpcyBzdG9yZWQgaW4gTElNIEdsb2JhbCBjb250ZXh0LgorICAgIGxpbVNlbmRFZGNhUGFyYW1zKHBNYWMsIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zLCBwc2Vzc2lvbkVudHJ5LT5ic3NJZHgsIGhpZ2hQZXJmb3JtYW5jZSk7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBzY2hTZXREZWZhdWx0RWRjYVBhcmFtcworXGJyaWVmICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBnTGltRWRjYVBhcmFtcyB0byB0aGUgZGVmYXVsdAorXCAgICAgICAgbG9jYWwgd21tIHByb2ZpbGUuCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCAgcE1hYworXHJldHVybiAgbm9uZQorXCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK3NjaFNldERlZmF1bHRFZGNhUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMzIgcGFyYW1zWzRdW1dOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU5dOworCisgICAgaWYgKGdldFdtbUxvY2FsUGFyYW1zKHBNYWMsIHBhcmFtcykgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgUEVMT0dFKHNjaExvZyhwTWFjLCBMT0dFLCBGTCgiZ2V0V21tTG9jYWxQYXJhbXMoKSBmYWlsZWRcbiIpKTspCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXRTY2hFZGNhUGFyYW1zKHBNYWMsIHBhcmFtcywgcHNlc3Npb25FbnRyeSk7CisgICAgcmV0dXJuOworfQorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBzZXRTY2hFZGNhUGFyYW1zCitcYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIHRoZSBnTGltRWRjYVBhcmFtcyBzdHJ1Y3R1cmUKK1wgICAgICAgIHdpdGggdGhlIGdpdmVuIGVkY2EgcGFyYW1zLgorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKK1xyZXR1cm4gIG5vbmUKK1wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZAorc2V0U2NoRWRjYVBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBwYXJhbXNbXVtXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOXSwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UzMiBpOworICAgIHRBTklfVTMyIGN3bWluaWR4LCBjd21heGlkeCwgdHhvcGlkeDsKKyAgICB0QU5JX1UzMiBwaHlNb2RlOworCisgICAgbGltR2V0UGh5TW9kZShwTWFjLCAmcGh5TW9kZSwgcHNlc3Npb25FbnRyeSk7CisKKyAgICBQRUxPRzEoc2NoTG9nKHBNYWMsIExPRzEsIEZMKCJsaW1HZXRQaHlNb2RlKCkgPSAlZFxuIiksIHBoeU1vZGUpOykKKworICAgIC8vaWYgKHBNYWMtPmxpbS5nTGltUGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykKKyAgICBpZiAocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExRykKKyAgICB7CisgICAgICAgIGN3bWluaWR4ID0gV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNSU5HX0lEWDsKKyAgICAgICAgY3dtYXhpZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01BWEdfSURYOworICAgICAgICB0eG9waWR4ICA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX1RYT1BHX0lEWDsKKyAgICB9CisgICAgLy9lbHNlIGlmIChwTWFjLT5saW0uZ0xpbVBoeU1vZGUgPT0gV05JX0NGR19QSFlfTU9ERV8xMUIpCisgICAgZWxzZSBpZiAocGh5TW9kZSA9PSBXTklfQ0ZHX1BIWV9NT0RFXzExQikKKyAgICB7CisgICAgICAgIGN3bWluaWR4ID0gV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNSU5CX0lEWDsKKyAgICAgICAgY3dtYXhpZHggPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9DV01BWEJfSURYOworICAgICAgICB0eG9waWR4ICA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX1RYT1BCX0lEWDsKKyAgICB9CisgICAgZWxzZSAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgbW9kZSBpcyBub3Qgc2V0IHlldCwgYXNzdW1lIDExYSBtb2RlCisgICAgeworICAgICAgICBjd21pbmlkeCA9IFdOSV9DRkdfRURDQV9QUk9GSUxFX0NXTUlOQV9JRFg7CisgICAgICAgIGN3bWF4aWR4ID0gV05JX0NGR19FRENBX1BST0ZJTEVfQ1dNQVhBX0lEWDsKKyAgICAgICAgdHhvcGlkeCAgPSBXTklfQ0ZHX0VEQ0FfUFJPRklMRV9UWE9QQV9JRFg7CisgICAgfQorCisgICAgZm9yKGk9MDsgaTxNQVhfTlVNX0FDOyBpKyspCisgICAgeworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS5hY2kuYWNtID0gKHRBTklfVTgpIHBhcmFtc1tpXVtXTklfQ0ZHX0VEQ0FfUFJPRklMRV9BQ01fSURYXTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0uYWNpLmFpZnNuID0gKHRBTklfVTgpIHBhcmFtc1tpXVtXTklfQ0ZHX0VEQ0FfUFJPRklMRV9BSUZTTl9JRFhdOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS5jdy5taW4gPSAgY29udmVydENXKEdFVF9DVygmcGFyYW1zW2ldW2N3bWluaWR4XSkpOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS5jdy5tYXggPSAgY29udmVydENXKEdFVF9DVygmcGFyYW1zW2ldW2N3bWF4aWR4XSkpOworICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS50eG9wbGltaXQ9ICAodEFOSV9VMTYpIHBhcmFtc1tpXVt0eG9waWR4XTsKKworICAgICAgIFBFTE9HMShzY2hMb2cocE1hYywgTE9HMSwgRkwoIkFDIDolZDogQUlGU046ICVkLCBBQ00gJWQsIENXbWluICVkLCBDV21heCAlZCwgVHhPcCAlZFxuIiksIGksCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0uYWNpLmFpZnNuLAorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW2ldLmFjaS5hY20sCisgICAgICAgICAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNbaV0uY3cubWluLAorICAgICAgICAgICAgICAgIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zW2ldLmN3Lm1heCwKKyAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc1tpXS50eG9wbGltaXQpOykKKworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBnZXRXbW1Mb2NhbFBhcmFtcworXGJyaWVmICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBXTU0gbG9jYWwgZWRjYSBwYXJhbWV0ZXJzLgorXHBhcmFtICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMKK1xwYXJhbSAgIHRBTklfVTMyIHBhcmFtc1tdW1dOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU5dCitccmV0dXJuICBub25lCitcIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHRTaXJSZXRTdGF0dXMKK2dldFdtbUxvY2FsUGFyYW1zKHRwQW5pU2lyR2xvYmFsICBwTWFjLCAgdEFOSV9VMzIgcGFyYW1zW11bV05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMX0xFTl0pCit7CisgICAgdEFOSV9VMzIgaSxpZHg7CisgICAgdEFOSV9VMzIgKnByZjsKKyAgICB0QU5JX1UzMiB3bWVfbFtdID0ge1dOSV9DRkdfRURDQV9XTUVfQUNCRV9MT0NBTCwgV05JX0NGR19FRENBX1dNRV9BQ0JLX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfRURDQV9XTUVfQUNWSV9MT0NBTCwgV05JX0NGR19FRENBX1dNRV9BQ1ZPX0xPQ0FMfTsKKworICAgIHByZiA9ICZ3bWVfbFswXTsKKyAgICBmb3IgKGk9MDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIHRBTklfVTggIGRhdGFbV05JX0NGR19FRENBX0FOSV9BQ0JLX0xFTl07CisgICAgICAgIHRBTklfVTMyIGxlbiA9IFdOSV9DRkdfRURDQV9BTklfQUNCS19MT0NBTF9MRU47CisgICAgICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCAodEFOSV9VMTYpIHByZltpXSwgKHRBTklfVTggKikgJmRhdGFbMF0sICZsZW4pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgc2NoTG9nKHBNYWMsIExPR1AsIEZMKCJjZmdHZXQgZmFpbGVkIGZvciAlZFxuIiksIHByZltpXSk7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPiBXTklfQ0ZHX0VEQ0FfQU5JX0FDQktfTE9DQUxfTEVOKQorICAgICAgICB7CisgICAgICAgICAgICBzY2hMb2cocE1hYywgTE9HRSwgRkwoImNmZ0dldCBmb3IgJWQ6IGxlbmd0aCBpcyAlZCBpbnN0ZWFkIG9mICVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICBwcmZbaV0sIGxlbiwgV05JX0NGR19FRENBX0FOSV9BQ0JLX0xPQ0FMX0xFTik7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGZvciAoaWR4PTA7IGlkeCA8IGxlbjsgaWR4KyspCisgICAgICAgICAgICBwYXJhbXNbaV1baWR4XSA9ICh0QU5JX1UzMikgZGF0YVtpZHhdOworICAgIH0KKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gICAgICBzY2hFZGNhUHJvZmlsZVVwZGF0ZQorXGJyaWVmICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBsb2NhbCBhbmQgYnJvYWRjYXN0CitcICAgICAgICBFRENBIHBhcmFtcyBpbiB0aGUgZ0xpbUVkY2FQYXJhbXMgc3RydWN0dXJlLiBJdCBhbHNvCitcICAgICAgICB1cGRhdGVzIHRoZSBlZGNhUGFyYW1TZXRDb3VudC4KK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsICBwTWFjCitccmV0dXJuICBub25lCitcIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZAorc2NoRWRjYVByb2ZpbGVVcGRhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgfHwgcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX1NUQV9JTl9JQlNTX1JPTEUpCisgICAgeworICAgICAgICBzY2hRb3NVcGRhdGVMb2NhbChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICAgICAgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbVNldENvdW50Kys7CisgICAgICAgIHNjaFFvc1VwZGF0ZUJyb2FkY2FzdChwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9DT1JFL01BQy9zcmMvcGUvc2NoL3NjaFN5c1BhcmFtcy5oIGIvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hTeXNQYXJhbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGRhNDg1Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9NQUMvc3JjL3BlL3NjaC9zY2hTeXNQYXJhbXMuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBzY2hTeXNQYXJhbXMuaCBjb250YWlucyBzY2hlZHVsZXIgcGFyYW1ldGVyIGRlZmluaXRpb25zCisgKgorICogQXV0aG9yOiAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgIDAyLzI1LzAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgICAgICBNb2RpZmllZCBieSAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqLworIAorI2lmbmRlZiBfX1NDSF9TWVNfUEFSQU1TX0hfXworI2RlZmluZSBfX1NDSF9TWVNfUEFSQU1TX0hfXworCisvLy8gVW5zb2xpY2l0ZWQgcG9sbCBwZXJpb2QgKG1zKSAoMCB0byBkaXNhYmxlKQorI2RlZmluZSBTQ0hfUE9MTF9QRVJJT0QgICAgICAgICAgICAgICAgMTAwMAorCisvLy8gUlIgdGltZW91dCB2YWx1ZSAobXMpICgwIHRvIGRpc2FibGUpCisjZGVmaW5lIFNDSF9SUl9USU1FT1VUX01TICAgICAgICAgICAgICAgIDQwCisKKy8vLyBEZWZhdWx0IENQOkNGUCByYXRpbworI2RlZmluZSBTQ0hfREVGQVVMVF9DUF9UT19DRlBfUkFUSU8gICAgICAgMAorCisvLy8gRGVmYXVsdCBtYXhpbXVtIENGUCBkdXJhdGlvbiAodXMpCisjZGVmaW5lIFNDSF9ERUZBVUxUX01BWF9DRlBfVElNRSAgICAgICA2MDAwMAorCisvLy8gRGVmYXVsdCBtaW5pbXVtIENQIGR1cmF0aW9uICh1cykKKyNkZWZpbmUgU0NIX0RFRkFVTFRfTUlOX0NQX1RJTUUgICAgICAgICAxMDAKKworLy8vIEFtb3VudCBvZiBkZWxheSBwcmlvciB0byBzdGFydGluZyBDRlAgKHVzKQorI2RlZmluZSBTQ0hfQ0ZQX1NUQVJUX0RFTEFZICAgICAgICAgICAgIDEwMAorCisvLy8gVW5pdCBvZiBUeG9wIGluIG1pY3JvIHNlY29uZHMKKyNkZWZpbmUgVFhPUF9VTklUX0lOX1VTRUMgICAgICAgICAgICAgICAgMzIKKworLy8vIE1pbmltdW0gYW1vdW50IG9mIHRpbWUgZ3JhbnRlZCBwZXIgaW5zdHJ1Y3Rpb24gb24gYXZlcmFnZSAodW5pdHMgb2YgdHhvcCkKKyNkZWZpbmUgTUlOX1RYT1BfUEVSX0lOU1RSVUNUSU9OICAgICAgICAgNTAKKworLy8vIE1heGltdW0gYW1vdW50IG9mIHRpbWUgZ3JhbnRlZCBwZXIgaW5zdHJ1Y3Rpb24gKHVuaXRzIG9mIHR4b3ApCisjZGVmaW5lIE1BWF9UWE9QX1BFUl9JTlNUUlVDVElPTiAgICAgICAgMzAwIC8vIEhBQ0sgLSAxMDAKKworLy8vIE1heGltdW0gYW1vdW50IG9mIHRpbWUgZ3JhbnRlZCB0byBvbmUgZW50aXJlIHNjaGVkdWxlICh1bml0cyBvZiB0eG9wKQorI2RlZmluZSBNQVhfVFhPUF9QRVJfU0NIRURVTEUgICAgICAgICAgIDQwMAorCisvLy8gU2NoZWR1bGluZyBxdWFudHVtICh1bml0cyBvZiBUWE9QKQorI2RlZmluZSBTQ0hfUVVBTlRVTV9RVUVVRSAgICAgICAgICAgICAgICAgNCAKKworLy8vIE1heGltdW0gdW51c2VkIHF1YW50dW0gYWxsb3dlZCB0byBiZSBhY2N1bXVsYXRlZCBieSBhIHF1ZXVlCisjZGVmaW5lIE1BWF9BQ0NVTVVMQVRFRF9RVUFOVFVNICAgICAgICAgNTAwCisKKy8vLyBNaW5pbXVtIGFsbG9jYXRlZCBxdWFudHVtIGZvciBhbiB1cGxpbmsgZmxvdyBiZWZvcmUgYSBwb2xsIGluc3RydWN0aW9uIGlzIHdyaXR0ZW4KKyNkZWZpbmUgU0NIX01JTl9VTF9BTExPQyAgICAgICAgICAgICAgICAgMTIKKworLy8gLS0tLSBTY2hlZHVsaW5nIFBvbGljeSAtLS0tCisKKy8vLyBOdW1iZXIgb2YgUU9TIGNsYXNzZXMKKyNkZWZpbmUgU0NIX05VTV9RT1NfQ0xBU1NFUyAgICAyCisKKyNkZWZpbmUgU0NIX1BPTElDWV9TVFJJQ1RfUFJJICAwCisjZGVmaW5lIFNDSF9QT0xJQ1lfRFJSICAgICAgICAgMQorCisvLy8gU2NoZWR1bGluZyBxdWFudHVtIGZvciBlYWNoIGNsYXNzIGlmIHVzaW5nIERSUgorI2RlZmluZSBTQ0hfUVVBTlRVTV9DTEFTUyAgICAgIDEwMAorCisvLy8gVGhlIGRlZmF1bHQgc2NoZWR1bGluZyBwb2xpY3kgYmV0d2VlbiBjbGFzc2VzCisjZGVmaW5lIFNDSF9QT0xJQ1lfREVGQVVMVCAgICAgU0NIX1BPTElDWV9TVFJJQ1RfUFJJCisKKy8vIFNjaGVkdWxpbmcgd2VpZ2h0cyBmb3IgZWFjaCBwcmlvcml0eQorCisjZGVmaW5lIFNDSF9RVUFOVFVNXzAgICAgNDAKKyNkZWZpbmUgU0NIX1FVQU5UVU1fMSAgICAzNgorI2RlZmluZSBTQ0hfUVVBTlRVTV8yICAgIDMyCisjZGVmaW5lIFNDSF9RVUFOVFVNXzMgICAgMjgKKyNkZWZpbmUgU0NIX1FVQU5UVU1fNCAgICAyNAorI2RlZmluZSBTQ0hfUVVBTlRVTV81ICAgIDIwCisjZGVmaW5lIFNDSF9RVUFOVFVNXzYgICAgMTYKKyNkZWZpbmUgU0NIX1FVQU5UVU1fNyAgICAxMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvU0FQL2luYy9zYXBBcGkuaCBiL0NPUkUvU0FQL2luYy9zYXBBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk5NTNlCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TQVAvaW5jL3NhcEFwaS5oCkBAIC0wLDAgKzEsMTUwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgV0xBTl9RQ1RfV0xBTlNBUF9ICisjZGVmaW5lIFdMQU5fUUNUX1dMQU5TQVBfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICBXIEwgQSBOICAgUyBPIEYgVCBBIFAgIFAgQSBMICAgTCBBIFkgRSBSIAorICAgICAgICAgICAgICAgICAgICAgICBFIFggVCBFIFIgTiBBIEwgIEEgUCBJCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgCitERVNDUklQVElPTgorICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSSBleHBvc2VkIGJ5IHRoZSB3bGFuIFNBUCBQQUwgbGF5ZXIgCisgIG1vZHVsZS4KKyAgCisgICAgICAKKyAgQ29weXJpZ2h0IChjKSAyMDEwIFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6IC9jeWdkcml2ZS9kL0J1aWxkcy9NNzIwMUpTRENBQVBBRDUyMjQwQi9XTS9wbGF0Zm9ybS9tc203MjAwL1NyYy9Ecml2ZXJzL1NEL0NsaWVudERyaXZlcnMvV0xBTi9RQ1RfQlRBTVBfUlNOL0NPUkUvU0FQL2luYy9zYXBBcGkuaCx2IDEuMjEgMjAwOS8wMy8wOSAwODo1ODoyNiBqem11ZGEgRXhwIGp6bXVkYSAkICREYXRlVGltZTogJCAkQXV0aG9yOiBqem11ZGEgJAorCisKK3doZW4gICAgICAgICAgIHdobyAgICAgICAgICAgICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgICAtLS0gICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA3LzAxLzA4ICAgICBTQVAgdGVhbSAgICAgICBDcmVhdGVkIG1vZHVsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUyBGT1IgTU9EVUxFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAidm9zX2FwaS5oIiAKKyNpbmNsdWRlICJ2b3NfcGFja2V0LmgiIAorI2luY2x1ZGUgInZvc190eXBlcy5oIgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorI2luY2x1ZGUgInAycF9BcGkuaCIKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyAjZW5kaWYgCisgCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRGVmaW5lcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGRlZmluZXMgYW5kIGVudW0KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgCisjZGVmaW5lICAgICAgIE1BWF9TU0lEX0xFTiAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgICAgICAgTUFYX01BQ19BRERSRVNTX0FDQ0VQVEVEICAgICAxNgorI2RlZmluZSAgICAgICBNQVhfTUFDX0FERFJFU1NfREVOSUVEICAgICAgIE1BWF9NQUNfQUREUkVTU19BQ0NFUFRFRAorI2RlZmluZSAgICAgICBBVVRPX0NIQU5ORUxfU0VMRUNUICAgICAgICAgIDAKKyNkZWZpbmUgICAgICAgTUFYX0FTU09DX0lORF9JRV9MRU4gICAgICAgICAyNTUKKworLyogZGVmaW5lcyBmb3IgV1BTIGNvbmZpZyBzdGF0ZXMgKi8KKyNkZWZpbmUgICAgICAgU0FQX1dQU19ESVNBQkxFRCAgICAgICAgICAgICAwCisjZGVmaW5lICAgICAgIFNBUF9XUFNfRU5BQkxFRF9VTkNPTkZJR1VSRUQgMQorI2RlZmluZSAgICAgICBTQVBfV1BTX0VOQUJMRURfQ09ORklHVVJFRCAgIDIKKworI2RlZmluZSAgICAgICBNQVhfTkFNRV9TSVpFICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lICAgICAgIE1BWF9URVhUX1NJWkUgICAgICAgICAgICAgICAgMzIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHJlYXNvbkNvZGUgdGFrZSBmb3JtIDgwMi4xMSBzdGFuZGFyZCBUYWJsZSA3LTIyIHRvIGJlIHBhc3NlZCB0byBXTEFOU0FQX0Rpc2Fzc29jU3RhIGFwaS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVteyAgCisgICAgZVNBUF9SQ19SRVNFUlZFRDAsICAgICAgICAgICAgICAgLyowKi8gIAorICAgIGVTQVBfUkNfVU5TUEVDSUZJRUQsICAgICAgICAgICAgIC8qMSovICAKKyAgICBlU0FQX1JDX1BSRVZfQVVUSF9JTlZBTElELCAgICAgICAvKjIqLyAgCisgICAgZVNBUF9SQ19TVEFfTEVGVF9ERUFVVEgsICAgICAgICAgLyozKi8gIAorICAgIGVTQVBfUkNfSU5BQ1RJVklUWV9ESVNBU1NPQywgICAgIC8qNCovIAorICAgIGVTQVBfUkNfQVBfQ0FQQUNJVFlfRlVMTCwgICAgICAgIC8qNSovCisgICAgZVNBUF9SQ19DTFMyX0ZST01fTk9OX0FVVEhfU1RBLCAgLyo2Ki8KKyAgICBlU0FQX1JDX0NMUzNfRlJPTV9OT05fQVVUSF9TVEEsICAvKjcqLworICAgIGVTQVBfUkNfU1RBX0xFRlRfRElTQVNTT0MsICAgICAgIC8qOCovCisgICAgZVNBUF9SQ19TVEFfTk9UX0FVVEgsICAgICAgICAgICAgLyo5Ki8KKyAgICBlU0FQX1JDX1BDX1VOQUNDRVBUQUJMRSwgICAgICAgICAvKjEwKi8KKyAgICBlU0FQX1JDX1NDX1VOQUNDRVBUQUJMRSwgICAgICAgICAvKjExKi8KKyAgICBlU0FQX1JDX1JFU0VSVkVEMSwgICAgICAgICAgICAgICAvKjEyKi8KKyAgICBlU0FQX1JDX0lOVkFMSURfSUUsICAgICAgICAgICAgICAvKjEzKi8KKyAgICBlU0FQX1JDX01JQ19GQUlMLCAgICAgICAgICAgICAgICAvKjE0Ki8KKyAgICBlU0FQX1JDXzRfV0FZX0hBTkRTSEFLRV9UTywgICAgICAvKjE1Ki8KKyAgICBlU0FQX1JDX0dPX0tFWV9IQU5EU0hBS0VfVE8sICAgICAvKjE2Ki8KKyAgICBlU0FQX1JDX0lFX01JU01BVENILCAgICAgICAgICAgICAvKjE3Ki8KKyAgICBlU0FQX1JDX0lOVkFMSURfR1JQX0NISVBIRVIsICAgICAvKjE4Ki8KKyAgICBlU0FQX1JDX0lOVkFMSURfUEFJUl9DSElQSEVSLCAgICAvKjE5Ki8KKyAgICBlU0FQX1JDX0lOVkFMSURfQUtNUCwgICAgICAgICAgICAvKjIwKi8KKyAgICBlU0FQX1JDX1VOU1VQUE9SVEVEX1JTTiwgICAgICAgICAvKjIxKi8KKyAgICBlU0FQX1JDX0lOVkFMSURfUlNOLCAgICAgICAgICAgICAvKjIyKi8KKyAgICBlU0FQX1JDXzFYX0FVVEhfRkFJTEVELCAgICAgICAgICAvKjIzKi8KKyAgICBlU0FQX1JDX0NISVBFUl9TVUlURV9SRUpFQ1RFRCwgICAvKjI0Ki8KK31lU2FwUmVhc29uQ29kZTsgICAgCisKK3R5cGVkZWYgZW51bSB7CisgICAgZVNBUF9ET1QxMV9NT0RFX2FiZyA9IDB4MDAwMSwKKyAgICBlU0FQX0RPVDExX01PREVfMTFhID0gMHgwMDAyLAorICAgIGVTQVBfRE9UMTFfTU9ERV8xMWIgPSAweDAwMDQsICAgICAKKyAgICBlU0FQX0RPVDExX01PREVfMTFnID0gMHgwMDA4LCAgICAgCisgICAgZVNBUF9ET1QxMV9NT0RFXzExbiA9IDB4MDAxMCwgICAgIAorICAgIGVTQVBfRE9UMTFfTU9ERV8xMWdfT05MWSA9IDB4MDA4MCwKKyAgICBlU0FQX0RPVDExX01PREVfMTFuX09OTFkgPSAweDAxMDAsCisgICAgZVNBUF9ET1QxMV9NT0RFXzExYl9PTkxZID0gMHgwNDAwLAorCit9IGVTYXBQaHlNb2RlOworCit0eXBlZGVmIGVudW0geworICAgIGVTQVBfQUNDRVBUX1VOTEVTU19ERU5JRUQgPSAwLAorICAgIGVTQVBfREVOWV9VTkxFU1NfQUNDRVBURUQgPSAxLAorICAgIGVTQVBfU1VQUE9SVF9BQ0NFUFRfQU5EX0RFTlkgPSAyLCAvKiB0aGlzIHR5cGUgaXMgYWRkZWQgdG8gc3VwcG9ydCBib3RoIGFjY2VwdCBhbmQgZGVueSBsaXN0cyBhdCB0aGUgc2FtZSB0aW1lICovCisgICAgZVNBUF9BTExPV19BTEwgPSAzLCAvKkluIHRoaXMgbW9kZSBhbGwgTUFDIGFkZHJlc3NlcyBhcmUgYWxsb3dlZCB0byBjb25uZWN0Ki8KK30gZVNhcE1hY0FkZHJBQ0w7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZVNBUF9CTEFDS19MSVNUID0gMCwgLyogTGlzdCBvZiBtYWMgYWRkcmVzc2VzIE5PVCBhbGxvd2VkIHRvIGFzc29jICovCisgICAgZVNBUF9XSElURV9MSVNUID0gMSwgLyogTGlzdCBvZiBtYWMgYWRkcmVzc2VzIGFsbG93ZWQgdG8gYXNzb2MgKi8KK30gZVNhcEFDTFR5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQUREX1NUQV9UT19BQ0wgICAgICA9IDAsIC8qIGNtZCB0byBhZGQgU1RBIHRvIGFjY2VzcyBjb250cm9sIGxpc3QgKi8KKyAgICBERUxFVEVfU1RBX0ZST01fQUNMID0gMSwgLyogY21kIHRvIGRlbGV0ZSBTVEEgZnJvbSBhY2Nlc3MgY29udHJvbCBsaXN0ICovCit9IGVTYXBBQ0xDbWRUeXBlOworCit0eXBlZGVmIGVudW0geworICAgIGVTQVBfU1RBUlRfQlNTX0VWRU5UID0gMCwgLypFdmVudCBzZW50IHdoZW4gQlNTIGlzIHN0YXJ0ZWQqLworICAgIGVTQVBfU1RPUF9CU1NfRVZFTlQsICAgICAgLypFdmVudCBzZW50IHdoZW4gQlNTIGlzIHN0b3BwZWQqLworICAgIGVTQVBfU1RBX0FTU09DX0lORCwgICAgICAgLyogSW5kaWNhdGUgdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgdG8gdXBwZXIgbGF5ZXJzICovICAgIAorICAgIGVTQVBfU1RBX0FTU09DX0VWRU5ULCAgICAgLypFdmVudCBzZW50IHdoZW4gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgYXNzb2NpYXRlZCBhIHN0YXRpb24gYW5kIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciBsYXllciBuZWVlZHMgdG8gYWxsb2NhdGUgYSBjb250ZXh0Ki8KKyAgICBlU0FQX1NUQV9SRUFTU09DX0VWRU5ULCAgIC8qRXZlbnQgc2VudCB3aGVuIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHJlYXNzb2NpYXRlZCBhIHN0YXRpb24gYW5kIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciBsYXllciBuZWVlZHMgdG8gYWxsb2NhdGUgYSBjb250ZXh0Ki8KKyAgICBlU0FQX1NUQV9ESVNBU1NPQ19FVkVOVCwgIC8qRXZlbnQgc2VudCB3aGVuIGFzc29jaWF0ZWQgYSBzdGF0aW9uIGhhcyBkaXNhc3NvY2lhdGVkIGFzIGEgcmVzdWx0IG9mIHZhcmlvdXMgY29uZGl0aW9ucyAqLworICAgIGVTQVBfU1RBX1NFVF9LRVlfRVZFTlQsICAgLypFdmVudCBzZW50IHdoZW4gdXNlciBjYWxsZWQgV0xBTlNBUF9TZXRLZXlTdGEgKi8KKyAgICBlU0FQX1NUQV9ERUxfS0VZX0VWRU5ULCAgIC8qRXZlbnQgc2VudCB3aGVuIHVzZXIgY2FsbGVkIFdMQU5TQVBfRGVsS2V5U3RhICovCisgICAgZVNBUF9TVEFfTUlDX0ZBSUxVUkVfRVZFTlQsIC8qRXZlbnQgc2VudCB3aGVuZXZlciB0aGVyZSBpcyBNSUMgZmFpbHVyZSBkZXRlY3RlZCAqLworICAgIGVTQVBfQVNTT0NfU1RBX0NBTExCQUNLX0VWRU5ULCAgLypFdmVudCBzZW50IHdoZW4gdXNlciBjYWxsZWQgV0xBTlNBUF9HZXRBc3NvY1N0YXRpb25zICovCisgICAgZVNBUF9HRVRfV1BTUEJDX1NFU1NJT05fRVZFTlQsICAvKiBFdmVudCBzZW5kIHdoZW4gdXNlciBjYWxsICBXTEFOU0FQX2dldFdwc1Nlc3Npb25PdmVybGFwICovICAKKyAgICBlU0FQX1dQU19QQkNfUFJPQkVfUkVRX0VWRU5ULCAvKiBFdmVudCBzZW5kIG9uIFdQUyBQQkMgcHJvYmUgcmVxdWVzdCBpcyByZWNlaXZlZCAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICBlU0FQX0lORElDQVRFX01HTVRfRlJBTUUsCisgICAgZVNBUF9SRU1BSU5fQ0hBTl9SRUFEWSwKKyAgICBlU0FQX1NFTkRfQUNUSU9OX0NORiwKKyNlbmRpZgorICAgIGVTQVBfVU5LTk9XTl9TVEFfSk9JTiwgLyogRXZlbnQgc2VuZCB3aGVuIGEgU1RBIGluIG5laXRoZXIgd2hpdGUgbGlzdCBvciBibGFjayBsaXN0IHRyaWVzIHRvIGFzc29jaWF0ZSBpbiBzb2Z0YXAgbW9kZSAqLworICAgIGVTQVBfTUFYX0FTU09DX0VYQ0VFREVELCAvKiBFdmVudCBzZW5kIHdoZW4gYSBuZXcgU1RBIGlzIHJlamVjdGVkIGFzc29jaWF0aW9uIHNpbmNlIHNvZnRBUCBtYXggYXNzb2MgbGltaXQgaGFzIHJlYWNoZWQgKi8KK30gZVNhcEhkZEV2ZW50OworCit0eXBlZGVmIGVudW0geworICAgIGVTQVBfT1BFTl9TWVNURU0sCisgICAgZVNBUF9TSEFSRURfS0VZLAorICAgIGVTQVBfQVVUT19TV0lUQ0gKKyB9IGVTYXBBdXRoVHlwZTsgCisKK3R5cGVkZWYgZW51bSB7CisgICAgZVNBUF9NQUNfSU5JVEFURURfRElTQVNTT0MgPSAweDEwMDAwLCAvKkRpc2Fzc29jaWF0aW9uIHdhcyBpbnRlcm5hbGx5IGluaXRhdGVkIGZyb20gQ09SRSBzdGFjayovCisgICAgZVNBUF9VU1JfSU5JVEFURURfRElTQVNTT0MgLypEaXNhc3NvY2lhdGlvbiB3YXMgaW50ZXJuYWxseSBpbml0YXRlZCBmcm9tIGhvc3QgYnkgaW52b2tpbmcgV0xBTlNBUF9EaXNhc3NvY1N0YSBjYWxsKi8KKyB9IGVTYXBEaXNhc3NvY1JlYXNvbjsgCisKKy8qSGFuZGxlIGJvb2xlYW4gb3ZlciBoZXJlKi8KK3R5cGVkZWYgZW51bSB7CisgICAgZVNBUF9GQUxTRSwKKyAgICBlU0FQX1RSVUUsCit9ZVNhcEJvb2w7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTQVAgUEFMICJzdGF0dXMiIGFuZCAicmVhc29uIiBlcnJvciBjb2RlIGRlZmluZXMgCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgCit0eXBlZGVmIGVudW0gIHsKKyAgICBlU0FQX1NUQVRVU19TVUNDRVNTLCAgICAgICAgICAgICAgICAgLyogU3VjY2Vzcy4gICovCisgICAgZVNBUF9TVEFUVVNfRkFJTFVSRSwgICAgICAgICAgICAgICAgIC8qIEdlbmVyYWwgRmFpbHVyZS4gICovCisgICAgZVNBUF9TVEFSVF9CU1NfQ0hBTk5FTF9OT1RfU0VMRUNURUQsIC8qIENoYW5uZWwgbm90IHNlbGVjdGVkIGR1cmluZyBpbnRpYWwgc2Nhbi4gICovCisgICAgZVNBUF9FUlJPUl9NQUNfU1RBUlRfRkFJTCwgICAgICAgICAgIC8qIEZhaWxlZCB0byBzdGFydCBJbmZyYSBCU1MgKi8KK31lU2FwU3RhdHVzOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU0FQIFBBTCAic3RhdHVzIiBhbmQgInJlYXNvbiIgZXJyb3IgY29kZSBkZWZpbmVzIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgIAordHlwZWRlZiBlbnVtICB7CisgICAgZVNBUF9XUFNQQkNfT1ZFUkxBUF9JTjEyMFMsICAgICAgICAgICAgICAgICAvKiBPdmVybGFwICovCisgICAgZVNBUF9XUFNQQkNfTk9fV1BTUEJDX1BST0JFX1JFUV9JTjEyMFMsICAgICAvKiBubyBXUFMgcHJvYmUgcmVxdWVzdCBpbiAxMjAgc2Vjb25kICovCisgICAgZVNBUF9XUFNQQkNfT05FX1dQU1BCQ19QUk9CRV9SRVFfSU4xMjBTLCAgICAvKiBPbmUgV1BTIHByb2JlIHJlcXVlc3QgaW4gMTIwIHNlY29uZCAgKi8KK31lV1BTUEJDT3ZlcmxhcDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVHlwZWRlZnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1N0YXJ0QnNzQ29tcGxldGVFdmVudF9zIHsKKyAgICB2X1U4X3QgIHN0YXR1czsKKyAgICB2X1U4X3QgIG9wZXJhdGluZ0NoYW5uZWw7CisgICAgdl9VMTZfdCBzdGFJZDsgLy9zZWxmIFN0YUlECit9IHRTYXBfU3RhcnRCc3NDb21wbGV0ZUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBzYXBfU3RvcEJzc0NvbXBsZXRlRXZlbnRfcyB7CisgICAgdl9VOF90IHN0YXR1czsKK30gdFNhcF9TdG9wQnNzQ29tcGxldGVFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1N0YXRpb25Bc3NvY0luZGljYXRpb25fcyB7CisgICAgdl9NQUNBRERSX3QgIHN0YU1hYzsKKyAgICB2X1U4X3QgICAgICAgYXNzb0lkOworICAgIHZfVThfdCAgICAgICBzdGFJZDsKKyAgICB2X1U4X3QgICAgICAgc3RhdHVzOworICAgIC8vIFJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZXMgdG8gdXBwZXIgbGF5ZXIKKyAgICB0QU5JX1UzMiAgICAgYmVhY29uTGVuZ3RoOworICAgIHRBTklfVTgqICAgICBiZWFjb25QdHI7CisgICAgdEFOSV9VMzIgICAgIGFzc29jUmVxTGVuZ3RoOworICAgIHRBTklfVTgqICAgICBhc3NvY1JlcVB0cjsKKyAgICB0QU5JX0JPT0xFQU4gZldtbUVuYWJsZWQ7CisjaWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGVDc3JBdXRoVHlwZSBuZWdvdGlhdGVkQXV0aFR5cGU7CisgICAgZUNzckVuY3J5cHRpb25UeXBlIG5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlOworICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBuZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZTsKKyAgICB0QU5JX0JPT0xFQU4gZkF1dGhSZXF1aXJlZDsKKyNlbmRpZgorfSB0U2FwX1N0YXRpb25Bc3NvY0luZGljYXRpb247CisKK3R5cGVkZWYgc3RydWN0IHNhcF9TdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudF9zIHsKKyAgICB2X01BQ0FERFJfdCAgc3RhTWFjOworICAgIHZfVThfdCAgICAgICBzdGFJZDsKKyAgICB2X1U4X3QgICAgICAgc3RhdHVzOworICAgIHZfVThfdCAgICAgICBpZXNbTUFYX0FTU09DX0lORF9JRV9MRU5dOworICAgIHZfVTE2X3QgICAgICBpZXNMZW47CisgICAgdl9VMzJfdCAgICAgIHN0YXR1c0NvZGU7IAorICAgIGVTYXBBdXRoVHlwZSBTYXBBdXRoVHlwZTsKKyAgICB2X0JPT0xfdCAgICAgd21tRW5hYmxlZDsKKyAgICAvLyBSZXF1aXJlZCBmb3IgaW5kaWNhdGluZyB0aGUgZnJhbWVzIHRvIHVwcGVyIGxheWVyCisgICAgdEFOSV9VMzIgICAgIGJlYWNvbkxlbmd0aDsKKyAgICB0QU5JX1U4KiAgICAgYmVhY29uUHRyOworICAgIHRBTklfVTMyICAgICBhc3NvY1JlcUxlbmd0aDsKKyAgICB0QU5JX1U4KiAgICAgYXNzb2NSZXFQdHI7CisgICAgdEFOSV9VMzIgICAgIGFzc29jUmVzcExlbmd0aDsKKyAgICB0QU5JX1U4KiAgICAgYXNzb2NSZXNwUHRyOyAgICAKK30gdFNhcF9TdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1N0YXRpb25EaXNhc3NvY0NvbXBsZXRlRXZlbnRfcyB7CisgICAgdl9NQUNBRERSX3QgICAgICAgIHN0YU1hYzsKKyAgICB2X1U4X3QgICAgICAgICAgICAgc3RhSWQ7ICAgIC8vU1RBSUQgc2hvdWxkIG5vdCBiZSB1c2VkCisgICAgdl9VOF90ICAgICAgICAgICAgIHN0YXR1czsKKyAgICB2X1UzMl90ICAgICAgICAgICAgc3RhdHVzQ29kZTsKKyAgICBlU2FwRGlzYXNzb2NSZWFzb24gcmVhc29uOworfSB0U2FwX1N0YXRpb25EaXNhc3NvY0NvbXBsZXRlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNhcF9TdGF0aW9uU2V0S2V5Q29tcGxldGVFdmVudF9zIHsKKyAgICB2X1U4X3QgICAgICAgIHN0YXR1czsKKyAgICB2X01BQ0FERFJfdCAgIHBlZXJNYWNBZGRyOworfSB0U2FwX1N0YXRpb25TZXRLZXlDb21wbGV0ZUV2ZW50OworCisvKnN0cnVjdCBjb3JyZXNwb25kaW5nIHRvIFNBUF9TVEFfREVMX0tFWV9FVkVOVCAqLwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1N0YXRpb25EZWxldGVLZXlDb21wbGV0ZUV2ZW50X3MgeworICAgIHZfVThfdCBzdGF0dXM7CisgICAgdl9VOF90ICBrZXlJZDsgLyogS2V5IGluZGV4ICovCit9IHRTYXBfU3RhdGlvbkRlbGV0ZUtleUNvbXBsZXRlRXZlbnQ7CisKKy8qc3RydWN0IGNvcnJlc3BvbmRpbmcgdG8gU0FQX1NUQV9NSUNfRkFJTFVSRV9FVkVOVCAqLwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1N0YXRpb25NSUNGYWlsdXJlRXZlbnRfcyB7CisgICAgdl9NQUNBRERSX3QgICBzcmNNYWNBZGRyOyAvL2FkZHJlc3MgdXNlZCB0byBjb21wdXRlIE1JQyAKKyAgICB2X01BQ0FERFJfdCAgIHN0YU1hYzsgLy90YU1hY0FkZHIgdHJhbnNtaXR0ZXIgYWRkcmVzcworICAgIHZfTUFDQUREUl90ICAgZHN0TWFjQWRkcjsKKyAgICBlU2FwQm9vbCAgIG11bHRpY2FzdDsKKyAgICB2X1U4X3QgICAgIElWMTsgICAgICAgICAgICAvLyBmaXJzdCBieXRlIG9mIElWCisgICAgdl9VOF90ICAgICBrZXlJZDsgICAgICAgICAgLy8gc2Vjb25kIGJ5dGUgb2YgSVYKKyAgICB2X1U4X3QgICAgIFRTQ1tTSVJfQ0lQSEVSX1NFUV9DVFJfU0laRV07IC8vIHNlcXVlbmNlIG51bWJlcgorCit9IHRTYXBfU3RhdGlvbk1JQ0ZhaWx1cmVFdmVudDsKKy8qU3RydWN0dXJlIHRvIHJldHVybiBNQUMgYWRkcmVzcyBvZiBhc3NvY2lhdGVkIHN0YXRpb25zICovCit0eXBlZGVmIHN0cnVjdCBzYXBfQXNzb2NNYWNBZGRyX3MgeworICAgIHZfTUFDQUREUl90IHN0YU1hYzsgICAgIC8qTUFDIGFkZHJlc3Mgb2YgU3RhdGlvbiB0aGF0IGlzIGFzc29jaWF0ZWQqLworICAgIHZfVThfdCAgICAgIGFzc29jSWQ7ICAgICAgICAvKkFzc29jaWF0aW9uIElEIGZvciB0aGUgc3RhdGlvbiB0aGF0IGlzIGFzc29jaWF0ZWQqLworICAgIHZfVThfdCAgICAgIHN0YUlkOyAgICAgICAgICAgIC8qU3RhdGlvbiBJZCB0aGF0IGlzIGFsbG9jYXRlZCB0byB0aGUgc3RhdGlvbiovCit9IHRTYXBfQXNzb2NNYWNBZGRyLCAqdHBTYXBfQXNzb2NNYWNBZGRyOworCisvKnN0cnVjdCBjb3JyZXNwb25kaW5nIHRvIFNBUF9BU1NPQ19TVEFfQ0FMTEJBQ0tfRVZFTlQgKi8KK3R5cGVkZWYgc3RydWN0IHNhcF9Bc3NvY1N0YUxpc3RFdmVudF9zIHsKKyAgICBWT1NfTU9EVUxFX0lEICAgICAgbW9kdWxlOyAvKiBtb2R1bGUgaWQgdGhhdCB3YXMgcGFzc2VkIGluIFdMQU5TQVBfR2V0QXNzb2NTdGF0aW9ucyBBUEkqLworICAgIHZfVThfdCAgICAgICAgICAgICBub09mQXNzb2NTdGE7ICAvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBzdGF0aW9ucyovCisgICAgdHBTYXBfQXNzb2NNYWNBZGRyIHBBc3NvY1N0YXM7IC8qUG9pbnRlciB0byBwcmUgYWxsb2NhdGVkIG1lbW9yeSB0byBvYnRhaW4gbGlzdCBvZiBhc3NvY2lhdGVkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlvbnMgcGFzc2VkIGluIFdMQU5TQVBfR2V0QXNzb2NTdGF0aW9ucyBBUEkqLworfSB0U2FwX0Fzc29jU3RhTGlzdEV2ZW50OworIAordHlwZWRlZiBzdHJ1Y3Qgc2FwX0dldFdQU1BCQ1Nlc3Npb25FdmVudF9zIHsKKyAgICB2X1U4X3QgICAgICAgICBzdGF0dXM7CisgICAgVk9TX01PRFVMRV9JRCAgbW9kdWxlOyAvKiBtb2R1bGUgaWQgdGhhdCB3YXMgcGFzc2VkIGluIFdMQU5TQVBfR2V0QXNzb2NTdGF0aW9ucyBBUEkqLyAgICAgICAKKyAgICB2X1U4X3QgICAgICAgICBVVUlEX0VbMTZdOyAgICAgICAgIC8vIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBBUC4KKyAgICB2X01BQ0FERFJfdCAgICBhZGRyOyAgCisgICAgZVdQU1BCQ092ZXJsYXAgd3BzUEJDT3ZlcmxhcDsKK30gdFNhcF9HZXRXUFNQQkNTZXNzaW9uRXZlbnQ7IAorCit0eXBlZGVmIHN0cnVjdCBzYXBfV1BTUEJDUHJvYmVSZXFFdmVudF9zIHsKKyAgICB2X1U4X3QgICAgICAgICAgICAgc3RhdHVzOworICAgIFZPU19NT0RVTEVfSUQgICAgICBtb2R1bGU7IC8qIG1vZHVsZSBpZCB0aGF0IHdhcyBwYXNzZWQgaW4gV0xBTlNBUF9HZXRBc3NvY1N0YXRpb25zIEFQSSovICAgCisgICAgdFNpcldQU1BCQ1Byb2JlUmVxIFdQU1BCQ1Byb2JlUmVxOworfSB0U2FwX1dQU1BCQ1Byb2JlUmVxRXZlbnQ7IAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAordHlwZWRlZiBzdHJ1Y3Qgc2FwX01hbmFnZW1lbnRGcmFtZUluZm9fcyB7CisgICAgdEFOSV9VMzIgbkZyYW1lTGVuZ3RoOworICAgIHRBTklfVTggIGZyYW1lVHlwZTsKKyAgICB0QU5JX1UzMiByeENoYW47ICAgICAgICAgICAgLy9DaGFubmVsIG9mIHdoZXJlIHBhY2tldCBpcyByZWNldmllZCAKKyAgICB0QU5JX1U4ICpwYkZyYW1lczsgICAgICAgICAvL1BvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW4gdGhlIGJlYWNvbiwgYXNzb2MgcmVxLCBhc3NvYyByc3AgZnJhbWUsIGluIHRoYXQgb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2VyIG5lZWRzIHRvIHVzZSBuQmVhY29uTGVuZ3RoLCBuQXNzb2NSZXFMZW5ndGgsIG5Bc3NvY1JzcExlbmd0aCB0byBkZXNpY2Ugd2hlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VhY2ggZnJhbWUgc3RhcnRzIGFuZCBlbmRzLgorfSB0U2FwX01hbmFnZW1lbnRGcmFtZUluZm87CisKK3R5cGVkZWYgc3RydWN0IHNhcF9TZW5kQWN0aW9uQ25mX3MgeworICAgIGVTYXBTdGF0dXMgYWN0aW9uU2VuZFN1Y2Nlc3M7IAorfSB0U2FwX1NlbmRBY3Rpb25DbmY7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1Vua25vd25TVEFKb2luRXZlbnRfcyB7CisgICAgdl9NQUNBRERSX3QgICAgbWFjYWRkcjsgIAorfSB0U2FwX1Vua25vd25TVEFKb2luRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNhcF9NYXhBc3NvY0V4Y2VlZGVkRXZlbnRfcyB7CisgICAgdl9NQUNBRERSX3QgICAgbWFjYWRkcjsgIAorfSB0U2FwX01heEFzc29jRXhjZWVkZWRFdmVudDsKKworCisvKiAKKyAgIFRoaXMgc3RydWN0IHdpbGwgYmUgZmlsbGVkIGluIGFuZCBwYXNzZWQgdG8gdHBXTEFOX1NBUEV2ZW50Q0IgdGhhdCBpcyBwcm92aWRlZCBkdXJpbmcgV0xBTlNBUF9TdGFydEJzcyBjYWxsICAgCisgICBUaGUgZXZlbnQgaWQgY29ycmVzcG9uZGluZyB0byBzdHJ1Y3R1cmUgIGluIHRoZSB1bmlvbiBpcyBkZWZpbmVkIGluIGNvbW1lbnQgbmV4dCB0byB0aGUgc3RydWN0dXJlCisqLworCit0eXBlZGVmIHN0cnVjdCBzYXBfRXZlbnRfcyB7CisgICAgZVNhcEhkZEV2ZW50IHNhcEhkZEV2ZW50Q29kZTsKKyAgICB1bmlvbiB7CisgICAgICAgIHRTYXBfU3RhcnRCc3NDb21wbGV0ZUV2ZW50ICAgICAgICAgICAgICAgIHNhcFN0YXJ0QnNzQ29tcGxldGVFdmVudDsgLypTQVBfU1RBUlRfQlNTX0VWRU5UKi8KKyAgICAgICAgdFNhcF9TdG9wQnNzQ29tcGxldGVFdmVudCAgICAgICAgICAgICAgICAgc2FwU3RvcEJzc0NvbXBsZXRlRXZlbnQ7ICAvKlNBUF9TVE9QX0JTU19FVkVOVCovCisgICAgICAgIHRTYXBfU3RhdGlvbkFzc29jSW5kaWNhdGlvbiAgICAgICAgICAgICAgIHNhcEFzc29jSW5kaWNhdGlvbjsgICAgICAgLypTQVBfQVNTT0NfSU5ESUNBVElPTiAqLyAgICAgICAgIAorICAgICAgICB0U2FwX1N0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50ICAgICBzYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudDsgLypTQVBfU1RBX0FTU09DX0VWRU5ULCBTQVBfU1RBX1JFQVNTT0NfRVZFTlQqLworICAgICAgICB0U2FwX1N0YXRpb25EaXNhc3NvY0NvbXBsZXRlRXZlbnQgICAgICAgICBzYXBTdGF0aW9uRGlzYXNzb2NDb21wbGV0ZUV2ZW50Oy8qU0FQX1NUQV9ESVNBU1NPQ19FVkVOVCovCisgICAgICAgIHRTYXBfU3RhdGlvblNldEtleUNvbXBsZXRlRXZlbnQgICAgICAgICAgIHNhcFN0YXRpb25TZXRLZXlDb21wbGV0ZUV2ZW50Oy8qU0FQX1NUQV9TRVRfS0VZX0VWRU5UKi8KKyAgICAgICAgdFNhcF9TdGF0aW9uRGVsZXRlS2V5Q29tcGxldGVFdmVudCAgICAgICAgc2FwU3RhdGlvbkRlbGV0ZUtleUNvbXBsZXRlRXZlbnQ7LypTQVBfU1RBX0RFTF9LRVlfRVZFTlQqLworICAgICAgICB0U2FwX1N0YXRpb25NSUNGYWlsdXJlRXZlbnQgICAgICAgICAgICAgICBzYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50OyAvKlNBUF9TVEFfTUlDX0ZBSUxVUkVfRVZFTlQgKi8KKyAgICAgICAgdFNhcF9Bc3NvY1N0YUxpc3RFdmVudCAgICAgICAgICAgICAgICAgICAgc2FwQXNzb2NTdGFMaXN0RXZlbnQ7IC8qU0FQX0FTU09DX1NUQV9DQUxMQkFDS19FVkVOVCAqLworICAgICAgICB0U2FwX0dldFdQU1BCQ1Nlc3Npb25FdmVudCAgICAgICAgICAgICAgICBzYXBHZXRXUFNQQkNTZXNzaW9uRXZlbnQ7IC8qU0FQX0dFVF9XUFNQQkNfU0VTU0lPTl9FVkVOVCAqLworICAgICAgICB0U2FwX1dQU1BCQ1Byb2JlUmVxRXZlbnQgICAgICAgICAgICAgICAgICBzYXBQQkNQcm9iZVJlcUV2ZW50OyAvKmVTQVBfV1BTX1BCQ19QUk9CRV9SRVFfRVZFTlQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIHRTYXBfTWFuYWdlbWVudEZyYW1lSW5mbyAgICAgICAgICAgICAgICAgIHNhcE1hbmFnZW1lbnRGcmFtZUluZm87IC8qZVNBUF9JTkRJQ0FURV9NR01UX0ZSQU1FKi8KKyAgICAgICAgdFNhcF9TZW5kQWN0aW9uQ25mICAgICAgICAgICAgICAgICAgICAgICAgc2FwQWN0aW9uQ25mOyAgLyogZVNBUF9TRU5EX0FDVElPTl9DTkYgKi8gCisjZW5kaWYKKyAgICAgICAgdFNhcF9Vbmtub3duU1RBSm9pbkV2ZW50ICAgICAgICAgICAgICAgICAgc2FwVW5rbm93blNUQUpvaW47IC8qIGVTQVBfVU5LTk9XTl9TVEFfSk9JTiAqLworICAgICAgICB0U2FwX01heEFzc29jRXhjZWVkZWRFdmVudCAgICAgICAgICAgICAgICBzYXBNYXhBc3NvY0V4Y2VlZGVkOyAvKiBlU0FQX01BWF9BU1NPQ19FWENFRURFRCAqLworICAgIH0gc2FwZXZ0OworfSB0U2FwX0V2ZW50LCAqdHBTYXBfRXZlbnQ7CisKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNhcF9TU0lEIHsKKyAgICB2X1U4X3QgICAgICAgbGVuZ3RoOworICAgIHZfVThfdCAgICAgICBzc0lkW01BWF9TU0lEX0xFTl07Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRTYXBfU1NJRF90OworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc2FwX1NTSURJbmZvIHsKKyAgICB0U2FwX1NTSURfdCAgc3NpZDsgICAgICAgLypTU0lEIG9mIHRoZSBBUCovCisgICAgdl9VOF90ICAgICAgIHNzaWRIaWRkZW47IC8qU1NJRCBzaG91bGRuJ3Qvc2hvdWxkIGJlIGJyb2FkY2FzdCBpbiBwcm9iZSBSU1AgYW5kIGJlYWNvbiovCit9IF9fYW5pX2F0dHJfcGFja2VkIHRTYXBfU1NJREluZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX0NvbmZpZyB7CisgICAgdFNhcF9TU0lESW5mb190IFNTSURpbmZvOworICAgIGVTYXBQaHlNb2RlICAgICBTYXBId19tb2RlOyAvKiBXaXJlbGVzcyBNb2RlICovCisgICAgZVNhcE1hY0FkZHJBQ0wgIFNhcE1hY2FkZHJfYWNsOworICAgIHZfTUFDQUREUl90ICAgICBhY2NlcHRfbWFjW01BWF9NQUNfQUREUkVTU19BQ0NFUFRFRF07IC8qIE1BQyBmaWx0ZXJpbmcgKi8KKyAgICB2X0JPT0xfdCAgICAgICAgaWVlZTgwMjExZDsgICAgICAvKlNwZWNpZnkgaWYgMTFEIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQqLworICAgIHZfQk9PTF90ICAgICAgICBwcm90RW5hYmxlZDsgICAgIC8qU3BlY2lmeSBpZiBwcm90ZWN0aW9uIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQqLworICAgIHZfQk9PTF90ICAgICAgICBvYnNzUHJvdEVuYWJsZWQ7IC8qU3BlY2lmeSBpZiBPQlNTIHByb3RlY3Rpb24gaXMgZW5hYmxlZCBvciBkaXNhYmxlZCovCisgICAgdl9NQUNBRERSX3QgICAgIGRlbnlfbWFjW01BWF9NQUNfQUREUkVTU19ERU5JRURdOyAvKiBNQUMgZmlsdGVyaW5nICovCisgICAgdl9NQUNBRERSX3QgICAgIHNlbGZfbWFjYWRkcjsgLy9zZWxmIG1hY2FkZHJlc3Mgb3IgQlNTSUQKKyAgIAorICAgIHZfVThfdCAgICAgICAgICBjaGFubmVsOyAgICAgICAgIC8qIE9wZXJhdGlvbiBjaGFubmVsICovCisgICAgdl9VOF90ICAgICAgICAgIG1heF9udW1fc3RhOyAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgU1RBcyBpbiBzdGF0aW9uIHRhYmxlICovCisgICAgdl9VOF90ICAgICAgICAgIGR0aW1fcGVyaW9kOyAgICAgLyogZHRpbSBpbnRlcnZhbCAqLworICAgIHZfVThfdCAgICAgICAgICBudW1fYWNjZXB0X21hYzsKKyAgICB2X1U4X3QgICAgICAgICAgbnVtX2RlbnlfbWFjOworICAgIHZfVThfdCAgICAgICAgICAqcFJTTldQQVJlcUlFOyAgIC8vSWYgbm90IG51bGwsIGl0IGhhcyB0aGUgSUUgYnl0ZSBzdHJlYW0gZm9yIFJTTiAvV1BBCisKKyAgICB2X1U4X3QgICAgICAgICAgY291bnRyeUNvZGVbV05JX0NGR19DT1VOVFJZX0NPREVfTEVOXTsgIC8vaXQgaXMgaWdub3JlZCBpZiBbMF0gaXMgMC4KKyAgICB2X1U4X3QgICAgICAgICAgUlNOQXV0aFR5cGU7CisgICAgdl9VOF90ICAgICAgICAgIFJTTkVuY3J5cHRUeXBlOworICAgIHZfVThfdCAgICAgICAgICBtY1JTTkVuY3J5cHRUeXBlOworICAgIGVTYXBBdXRoVHlwZSAgICBhdXRoVHlwZTsKKyAgICB2X0JPT0xfdCAgICAgICAgcHJpdmFjeTsKKyAgICB2X0JPT0xfdCAgICAgICAgVWFwc2RFbmFibGU7CisgICAgdl9CT09MX3QgICAgICAgIGZ3ZFdQU1BCQ1Byb2JlUmVxOworICAgIHZfVThfdCAgICAgICAgICB3cHNfc3RhdGU7IC8vIDAgLSBkaXNhYmxlZCwgMSAtIG5vdCBjb25maWd1cmVkICwgMiAtIGNvbmZpZ3VyZWQKKworICAgIHZfVTE2X3QgICAgICAgICBodF9jYXBhYjsKKyAgICB2X1UxNl90ICAgICAgICAgUlNOV1BBUmVxSUVMZW5ndGg7ICAgLy9UaGUgYnl0ZSBjb3VudCBpbiB0aGUgcFdQQVJlcUlFCisKKyAgICB2X1UzMl90ICAgICAgICAgYmVhY29uX2ludDsgICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworICAgIHZfVTMyX3QgICAgICAgICBhcF90YWJsZV9tYXhfc2l6ZTsKKyAgICB2X1UzMl90ICAgICAgICAgYXBfdGFibGVfZXhwaXJhdGlvbl90aW1lOworICAgIHZfVTMyX3QgICAgICAgICBodF9vcF9tb2RlX2ZpeGVkOworICAgIHRWT1NfQ09OX01PREUgICBwZXJzb25hOyAvKlRlbGxzIHVzIHdoaWNoIHBlcnNvbmEgaXQgaXMgR08gb3IgQVAgZm9yIG5vdyovCisKK30gdHNhcF9Db25maWdfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlU0FQX1dQU19QUk9CRV9SU1BfSUUsCisgICAgZVNBUF9XUFNfQkVBQ09OX0lFLAorICAgIGVTQVBfV1BTX0FTU09DX1JTUF9JRQorfSBlU2FwV1BTSUVfQ09ERTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NhcE5hbWUgeworICAgIHZfVThfdCBudW1fbmFtZTsKKyAgICB2X1U4X3QgbmFtZVtNQVhfTkFNRV9TSVpFXTsKK30gdFNhcE5hbWU7CisKK3R5cGVkZWYgc3RydWN0IHNTYXBUZXh0IHsKKyAgICB2X1U4X3QgbnVtX3RleHQ7CisgICAgdl9VOF90IHRleHRbTUFYX1RFWFRfU0laRV07Cit9IHRTYXBUZXh0OworCisjZGVmaW5lIFdQU19QUk9CUlNQX1ZFUl9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFdQU19QUk9CUlNQX1NUQVRFX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFdQU19QUk9CUlNQX0FQU0VUVVBMT0NLX1BSRVNFTlQgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFdQU19QUk9CUlNQX1NFTEVDVEVEUkVHSVNUUkFfUFJFU0VOVCAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFdQU19QUk9CUlNQX0RFVklDRVBBU1NXT1JESURfUFJFU0VOVCAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFdQU19QUk9CUlNQX1NFTEVDVEVEUkVHSVNUUkFDRkdNRVRIT0RfUFJFU0VOVCAgICAweDAwMDAwMDIwCisjZGVmaW5lIFdQU19QUk9CUlNQX1JFU1BPTlNFVFlQRV9QUkVTRU5UICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFdQU19QUk9CUlNQX1VVSURFX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFdQU19QUk9CUlNQX01BTlVGQUNUVVJFX1BSRVNFTlQgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFdQU19QUk9CUlNQX01PREVMTkFNRV9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFdQU19QUk9CUlNQX01PREVMTlVNQkVSX1BSRVNFTlQgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFdQU19QUk9CUlNQX1NFUklBTE5VTUJFUl9QUkVTRU5UICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFdQU19QUk9CUlNQX1BSSU1BUllERVZJQ0VUWVBFX1BSRVNFTlQgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFdQU19QUk9CUlNQX0RFVklDRU5BTUVfUFJFU0VOVCAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFdQU19QUk9CUlNQX0NPTkZJR01FVEhPRFNfUFJFU0VOVCAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFdQU19QUk9CUlNQX1JGX0JBTkRTX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisKK3R5cGVkZWYgc3RydWN0IHNhcF9XUFNQcm9iZVJzcElFX3MgeworICAgIHZfVTMyX3QgICAgIEZpZWxkUHJlc2VudDsKKyAgICB2X1UzMl90ICAgICBWZXJzaW9uOyAgICAgICAgICAgLy8gVmVyc2lvbi4gMHgxMCA9IHZlcnNpb24gMS4wLCAweDExID0gZXRjLgorICAgIHZfVTMyX3QgICAgIHdwc1N0YXRlOyAgICAgICAgICAvLyAxID0gdW5jb25maWd1cmVkLCAyID0gY29uZmlndXJlZC4gICAgCisgICAgdl9CT09MX3QgICAgQVBTZXR1cExvY2tlZDsgICAgIC8vIE11c3QgYmUgaW5jbHVkZWQgaWYgdmFsdWUgaXMgVFJVRQorICAgIHZfQk9PTF90ICAgIFNlbGVjdGVkUmVnaXN0cmE7ICAvL0JPT0w6ICBpbmRpY2F0ZXMgaWYgdGhlIHVzZXIgaGFzIHJlY2VudGx5IGFjdGl2YXRlZCBhIFJlZ2lzdHJhciB0byBhZGQgYW4gRW5yb2xsZWUuCisgICAgdl9VMTZfdCAgICAgRGV2aWNlUGFzc3dvcmRJRDsgIC8vIERldmljZSBQYXNzd29yZCBJRAorICAgIHZfVTE2X3QgICAgIFNlbGVjdGVkUmVnaXN0cmFDZmdNZXRob2Q7IC8vIFNlbGVjdGVkIFJlZ2lzdHJhciBjb25maWcgbWV0aG9kCisgICAgdl9VOF90ICAgICAgUmVzcG9uc2VUeXBlOyAgICAgIC8vIFJlc3BvbnNlIHR5cGUKKyAgICB2X1U4X3QgICAgICBVVUlEX0VbMTZdOyAgICAgICAgIC8vIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBBUC4KKyAgICB0U2FwTmFtZSAgICBNYW51ZmFjdHVyZTsKKyAgICB0U2FwVGV4dCAgICBNb2RlbE5hbWU7CisgICAgdFNhcFRleHQgICAgTW9kZWxOdW1iZXI7CisgICAgdFNhcFRleHQgICAgU2VyaWFsTnVtYmVyOworICAgIHZfVTMyX3QgICAgIFByaW1hcnlEZXZpY2VDYXRlZ29yeSA7IC8vIERldmljZSBDYXRlZ29yeSBJRDogMUNvbXB1dGVyLCAySW5wdXQgRGV2aWNlLCAuLi4KKyAgICB2X1U4X3QgICAgICBQcmltYXJ5RGV2aWNlT1VJWzRdIDsgLy8gVmVuZG9yIHNwZWNpZmljIE9VSSBmb3IgRGV2aWNlIFN1YiBDYXRlZ29yeQorICAgIHZfVTMyX3QgICAgIERldmljZVN1YkNhdGVnb3J5IDsgLy8gRGV2aWNlIFN1YiBDYXRlZ29yeSBJRDogMS1QQywgMi1TZXJ2ZXIgaWYgRGV2aWNlIENhdGVnb3J5IElEIGlzIGNvbXB1dGVyCisgICAgdFNhcFRleHQgICAgRGV2aWNlTmFtZTsKKyAgICB2X1UxNl90ICAgIENvbmZpZ01ldGhvZDsgICAgIC8vIENvbmZpZ3VhcmF0aW9uIG1ldGhvZAorICAgIHZfVThfdCAgICBSRkJhbmQ7ICAgICAgICAgICAvLyBSRiBiYW5kcyBhdmFpbGFibGUgb24gdGhlIEFQCit9IHRTYXBfV1BTUHJvYmVSc3BJRTsKKworI2RlZmluZSBXUFNfQkVBQ09OX1ZFUl9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgV1BTX0JFQUNPTl9TVEFURV9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFdQU19CRUFDT05fQVBTRVRVUExPQ0tfUFJFU0VOVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBXUFNfQkVBQ09OX1NFTEVDVEVEUkVHSVNUUkFfUFJFU0VOVCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgV1BTX0JFQUNPTl9ERVZJQ0VQQVNTV09SRElEX1BSRVNFTlQgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFdQU19CRUFDT05fU0VMRUNURURSRUdJU1RSQUNGR01FVEhPRF9QUkVTRU5UICAgMHgwMDAwMDAyMAorI2RlZmluZSBXUFNfQkVBQ09OX1VVSURFX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgV1BTX0JFQUNPTl9SRl9CQU5EU19QUkVTRU5UICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisKK3R5cGVkZWYgc3RydWN0IHNhcF9XUFNCZWFjb25JRV9zIHsKKyAgICB2X1UzMl90ICBGaWVsZFByZXNlbnQ7CisgICAgdl9VMzJfdCAgVmVyc2lvbjsgICAgICAgICAgIC8vIFZlcnNpb24uIDB4MTAgPSB2ZXJzaW9uIDEuMCwgMHgxMSA9IGV0Yy4KKyAgICB2X1UzMl90ICB3cHNTdGF0ZTsgICAgICAgICAgLy8gMSA9IHVuY29uZmlndXJlZCwgMiA9IGNvbmZpZ3VyZWQuICAgIAorICAgIHZfQk9PTF90IEFQU2V0dXBMb2NrZWQ7ICAgICAvLyBNdXN0IGJlIGluY2x1ZGVkIGlmIHZhbHVlIGlzIFRSVUUKKyAgICB2X0JPT0xfdCBTZWxlY3RlZFJlZ2lzdHJhOyAgLy9CT09MOiAgaW5kaWNhdGVzIGlmIHRoZSB1c2VyIGhhcyByZWNlbnRseSBhY3RpdmF0ZWQgYSBSZWdpc3RyYXIgdG8gYWRkIGFuIEVucm9sbGVlLgorICAgIHZfVTE2X3QgIERldmljZVBhc3N3b3JkSUQ7ICAvLyBEZXZpY2UgUGFzc3dvcmQgSUQKKyAgICB2X1UxNl90ICBTZWxlY3RlZFJlZ2lzdHJhQ2ZnTWV0aG9kOyAvLyBTZWxlY3RlZCBSZWdpc3RyYXIgY29uZmlnIG1ldGhvZAorICAgIHZfVThfdCAgIFVVSURfRVsxNl07ICAgICAgICAvLyBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQVAuCisgICAgdl9VOF90ICAgUkZCYW5kOyAgICAgICAgICAgLy8gUkYgYmFuZHMgYXZhaWxhYmxlIG9uIHRoZSBBUAorfSB0U2FwX1dQU0JlYWNvbklFOworCisjZGVmaW5lIFdQU19BU1NPQ1JTUF9WRVJfUFJFU0VOVCAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFdQU19BU1NPQ1JTUF9SRVNQT05TRVRZUEVfUFJFU0VOVCAgICAweDAwMDAwMDAyCisKK3R5cGVkZWYgc3RydWN0IHNhcF9XUFNBc3NvY1JzcElFX3MgeworICAgdl9VMzJfdCBGaWVsZFByZXNlbnQ7CisgICB2X1UzMl90IFZlcnNpb247CisgICB2X1U4X3QgUmVzcG9zZVR5cGU7Cit9IHRTYXBfV1BTQXNzb2NSc3BJRTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2FwX1dQU0lFX3MgeworICAgIGVTYXBXUFNJRV9DT0RFIHNhcFdQU0lFQ29kZTsKKyAgICB1bmlvbiB7CisgICAgICAgICAgICAgICB0U2FwX1dQU1Byb2JlUnNwSUUgIHNhcFdQU1Byb2JlUnNwSUU7ICAgIC8qV1BTIFNldCBQcm9iZSBSZXNwb3NlIElFKi8KKyAgICAgICAgICAgICAgIHRTYXBfV1BTQmVhY29uSUUgICAgc2FwV1BTQmVhY29uSUU7ICAgICAgLypXUFMgU2V0IEJlYWNvbiBJRSovCisgICAgICAgICAgICAgICB0U2FwX1dQU0Fzc29jUnNwSUUgIHNhcFdQU0Fzc29jUnNwSUU7ICAgIC8qV1BTIFNldCBBc3NvYyBSZXNwb25zZSBJRSovCisgICAgfSBzYXB3cHNpZTsKK30gdFNhcF9XUFNJRSwgKnRwU2FwX1dQU0lFOworCit0eXBlZGVmIHN0cnVjdCBzYXBfU29mdGFwU3RhdHNfcyB7CisgICB2X1UzMl90IHR4VUNGY250OworICAgdl9VMzJfdCB0eE1DRmNudDsKKyAgIHZfVTMyX3QgdHhCQ0ZjbnQ7CisgICB2X1UzMl90IHR4VUNCY250OworICAgdl9VMzJfdCB0eE1DQmNudDsKKyAgIHZfVTMyX3QgdHhCQ0JjbnQ7CisgICB2X1UzMl90IHJ4VUNGY250OworICAgdl9VMzJfdCByeE1DRmNudDsKKyAgIHZfVTMyX3QgcnhCQ0ZjbnQ7CisgICB2X1UzMl90IHJ4VUNCY250OworICAgdl9VMzJfdCByeE1DQmNudDsKKyAgIHZfVTMyX3QgcnhCQ0JjbnQ7CisgICB2X1UzMl90IHJ4QmNudDsKKyAgIHZfVTMyX3QgcnhCY250Q1JDb2s7CisgICB2X1UzMl90IHJ4UmF0ZTsKK30gdFNhcF9Tb2Z0YXBTdGF0cywgKnRwU2FwX1NvZnRhcFN0YXRzOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TZXRfV3BzSWUKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBzZXQgV1BTIElFLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgcHZvc0dDdHg6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICBwV1BTSUU6ICB0U2FwX1dQU0lFIHN0cnVjdHVyZSBmb3IgdGhlIHN0YXRpb24KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5TQVBfU2V0X1dwc0llCisoCisgICAgdl9QVk9JRF90IHB2b3NHQ3R4LCB0U2FwX1dQU0lFICpwV1BTSWUKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICBXTEFOU0FQX1VwZGF0ZV9XcHNJZQorCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIHRvIHN0YXJ0IFdQUyBzZXNzaW9uLgorCisgIERFUEVOREVOQ0lFUworICAgIE5BLiAKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorcHZvc0dDdHg6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlNBUF9VcGRhdGVfV3BzSWUKKygKKyAgICB2X1BWT0lEX3QgcHZvc0dDdHgKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TdG9wX1dwcworCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIHRvIHN0b3AgV1BTIHNlc3Npb24uCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorcHZvc0dDdHg6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlNBUF9TdG9wX1dwcworKAorICAgIHZfUFZPSURfdCBwdm9zR0N0eAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX0dldF9XUFNfU3RhdGUKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBnZXQgV1BTIHN0YXRlLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KK3B2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKworICAgIE9VVAorcGJXUFNTdGF0ZTogUG9pbnRlciB0byB2YXJpYWJsZSB0byBpbmRpY2F0ZSBpZiBpdCBpcyBpbiBXUFMgUmVnaXN0cmF0aW9uIHN0YXRlCisgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlNBUF9HZXRfV1BTX1N0YXRlCisoCisgICAgdl9QVk9JRF90IHB2b3NHQ3R4LCB2X0JPT0xfdCAqIHBiV1BTU3RhdGUKKyk7IAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPcGFxdWUgU0FQIGhhbmRsZSBUeXBlIERlY2xhcmF0aW9uIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgdl9QVk9JRF90IHRTYXBIYW5kbGUsICpwdFNhcEhhbmRsZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfT3BlbgorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBhdCBkcml2ZXIgaW5pdGlhbGl6YXRpb24gKHZvc19vcGVuKS4gU0FQIHdpbGwgaW5pdGlhbGl6ZSAKKyAgICBhbGwgaXRzIGludGVybmFsIHJlc291cmNlcyBhbmQgd2lsbCB3YWl0IGZvciB0aGUgY2FsbCB0byBzdGFydCB0byAKKyAgICByZWdpc3RlciB3aXRoIHRoZSBvdGhlciBtb2R1bGVzLiAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgCisgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFNBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTlNBUF9PcGVuCisoIAorICAgIHZfUFZPSURfdCAgcHZvc0dDdHggCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfU3RhcnQKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYXMgcGFydCBvZiB0aGUgb3ZlcmFsbCBzdGFydCBwcm9jZWR1cmUgKHZvc19zdGFydCkuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFNBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgICAgT3RoZXIgY29kZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgQkFMIGZhaWx1cmU7CisgICAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTlNBUF9TdGFydAorKCAKKyAgICB2X1BWT0lEX3QgIHB2b3NHQ3R4IAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX1N0b3AKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgdm9zX3N0b3AgdG8gc3RvcCBvcGVyYXRpb24gaW4gU0FQLCBiZWZvcmUgY2xvc2UuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFNBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTlNBUF9TdG9wCisoIAorICAgIHZfUFZPSURfdCAgcHZvc0dDdHggCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfQ2xvc2UKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgdm9zX2Nsb3NlIGR1cmluZyBnZW5lcmFsIGRyaXZlciBjbG9zZSBwcm9jZWR1cmUuIFNBUCB3aWxsIGNsZWFuIHVwIAorICAgIGFsbCB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLiAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBTQVAncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBTQVAgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5TQVBfQ2xvc2UKKyggCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eCAKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgKCp0cFdMQU5fU0FQRXZlbnRDQikKKworICBERVNDUklQVElPTiAKKyAgICBJbXBsZW1lbnRzIHRoZSBjYWxsYmFjayBmb3IgQUxMIGFzeW5jaHJvbm91cyBldmVudHMuIAorICAgIEluY2x1ZGluZyBFdmVudHMgcmVzdWx0aW5nIGZyb206CisgICAgICogU3RhcnQgQlNTIAorICAgICAqIFN0b3AgQlNTLC4uLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcFNhcEV2ZW50OiAgcG9pbnRlciB0byB0aGUgdW5pb24gb2YgIlNhcCBFdmVudCIgc3RydWN0dXJlcy4gVGhpcyBub3cgZW5jb2RlcyBBTEwgZXZlbnQgdHlwZXMuCisgICAgICAgIEluY2x1ZGluZyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cworICAgIHBVc3JDb250ZXh0ICAgOiBwVXNyQ29udGV4dCBwYXJhbWV0ZXIgdGhhdCB3YXMgcGFzc2VkIHRvIHNhcFN0YXJ0QnNzCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gcFNhcEV2ZW50IGlzIE5VTEwKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordHlwZWRlZiBWT1NfU1RBVFVTICgqdHBXTEFOX1NBUEV2ZW50Q0IpKCB0cFNhcF9FdmVudCBwU2FwRXZlbnQsIHZfUFZPSURfdCAgcFVzckNvbnRleHQpOworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX2dldFN0YXRlCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgcmV0dXJucyB0aGUgY3VycmVudCBTQVAgc3RhdGUgdG8gdGhlIGNhbGxlci4KKworICBERVBFTkRFTkNJRVMgCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcENvbnRleHQgICAgICAgICAgICA6IFBvaW50ZXIgdG8gU2FwIENvbnRleHQgc3RydWN0dXJlCisKKyAgUkVUVVJOIFZBTFVFCisgICAgUmV0dXJucyB0aGUgU0FQIEZTTSBzdGF0ZS4gIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZfVThfdCBXTEFOU0FQX2dldFN0YXRlICggdl9QVk9JRF90ICBwdm9zR0N0eCk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TdGFydEJzcworCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIFNBUCBGU00gZXZlbnQgZVdMQU5fU0FQX0hERF9QSFlTSUNBTF9MSU5LX0NSRUFURSBmb3IKK3N0YXJ0aW5nIEFQIEJTUyAKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorcHZvc0dDdHg6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorcENvbmZpZzogUG9pbnRlciB0byBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBwYXNzZWQgZG93biBmcm9tIEhERChIb3N0QXBkIGZvciBBbmRyb2lkKQoraGRkX1NhcEV2ZW50Q2FsbGJhY2s6IENhbGxiYWNrIGZ1bmN0aW9uIGluIEhERCBjYWxsZWQgYnkgU0FQIHRvIGluZm9ybSBIREQgYWJvdXQgU0FQIHJlc3VsdHMKK3VzckRhdGFGb3JDYWxsYmFjazogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSBwYXNzZWQgYmFjayBpbiBhbGwgdGhlIFNBUCBjYWxsYmFjayBldmVudHMuCisKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOU0FQX1N0YXJ0QnNzCisoCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eCwgCisgICAgdHBXTEFOX1NBUEV2ZW50Q0IgcFNhcEV2ZW50Q2FsbGJhY2ssIAorICAgIHRzYXBfQ29uZmlnX3QgKnBDb25maWcsIHZfUFZPSURfdCAgcFVzckNvbnRleHQKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TdG9wCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgU0FQIEZTTSBldmVudCBlV0xBTl9TQVBfSEREX1BIWVNJQ0FMX0xJTktfRElTQ09OTkVDVCBmb3IKK3N0b3BwaW5nIEJTUyAKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgVworCisgICAgSU4KKyAgICBwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTlNBUF9TdG9wQnNzCisoCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX0Rpc2Fzc29jU3RhCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIEFwIEFwcC9IREQgaW5pdGlhdGVkIGRpc2Fzc29jaWF0aW9uIG9mIHN0YXRpb24KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHggICAgICAgICAgICA6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgIHBQZWVyU3RhTWFjICAgICAgICAgOiBNYWMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbiB0byBkaXNhc3NvY2lhdGUKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOU0FQX0Rpc2Fzc29jU3RhCisoCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eCwgdl9VOF90ICpwUGVlclN0YU1hYworKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX0RlYXV0aFN0YQorCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIGluaXRpYXRlZCBkZWF1dGhlbnRpY2F0aW9uIG9mIHN0YXRpb24KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHggICAgICAgICAgICA6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgIHBQZWVyU3RhTWFjICAgICAgICAgOiBNYWMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbiB0byBkZWF1dGhlbnRpY2F0ZQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5TQVBfRGVhdXRoU3RhCisoCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eCwgdl9VOF90ICpwUGVlclN0YU1hYworKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX1NldENoYW5uZWxSYW5nZQorCisgIERFU0NSSVBUSU9OIAorICAgICAgVGhpcyBhcGkgZnVuY3Rpb24gc2V0cyB0aGUgcmFuZ2Ugb2YgY2hhbm5lbHMgZm9yIFNvZnRBUC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgc3RhcnRDaGFubmVsICAgICAgICAgOiBzdGFydCBjaGFubmVsCisgICAgZW5kQ2hhbm5lbCAgICAgICAgICAgOiBFbmQgY2hhbm5lbAorICAgIG9wZXJhdGluZ0JhbmQgICAgICAgIDogT3BlcmF0aW5nIGJhbmQgKDIuNEdIei81R0h6KQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlNBUF9TZXRDaGFubmVsUmFuZ2UodEhhbEhhbmRsZSBoSGFsLHZfVThfdCBzdGFydENoYW5uZWwsIHZfVThfdCBlbmRDaGFubmVsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBvcGVyYXRpbmdCYW5kKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX1NldEtleVN0YQorCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIHRvIGRlbGV0ZSBrZXkgZm9yIGEgc3RhdGlvbi4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCitwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCitwU2V0S2V5SW5mbzogdENzclJvYW1TZXRLZXkgc3RydWN0dXJlIGZvciB0aGUgc3RhdGlvbgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlNBUF9TZXRLZXlTdGEKKygKKyAgICB2X1BWT0lEX3QgcHZvc0dDdHgsIHRDc3JSb2FtU2V0S2V5ICpwU2V0S2V5SW5mbworKTsgCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9EZWxLZXlTdGEKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBkZWxldGUga2V5IGZvciBhIHN0YXRpb24uCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorcHZvc0dDdHg6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorcFNldEtleUluZm86IHRDc3JSb2FtU2V0S2V5IHN0cnVjdHVyZSBmb3IgdGhlIHN0YXRpb24KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5TQVBfRGVsS2V5U3RhCisoCisgICAgdl9QVk9JRF90IHB2b3NHQ3R4LCB0Q3NyUm9hbVJlbW92ZUtleSAqcERlbEtleUluZm8KKyk7IAorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX0dldEFzc29jU3RhdGlvbnMKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBpcyB1c2VkIHRvIHByb2JlIHRoZSBsaXN0IG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgZnJvbSB2YXJpb3VzIG1vZHVsZXMgb2YgQ09SRSBzdGFjaworCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KK3B2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKK21vZDogTW9kdWxlIGZyb20gd2hvbSBsaXN0IG9mIGFzc29jaXRhdGVkIHN0YXRpb25zICBpcyBzdXBwb3NlZCB0byBiZSBwcm9iZWQuIElmIGFuIGludmFsaWQgbW9kdWxlIGlzIHBhc3NlZAordGhlbiBieSBkZWZhdWx0IFZPU19NT0RVTEVfSURfUEUgd2lsbCBiZSBwcm9iZWQKKyAgICBJTi9PVVQKK3BOb09mQXNzb2NTdGFzOi0gTnVtYmVyIG9mICBhc3NvY2lhdGVkIHN0YXRpb25zIHRoYXQgYXJlIGtub3duIHRvIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIG1vZCBwYXJhbWV0ZXIKK3BBc3NvY1N0YXM6IFBvaW50ZXIgdG8gbGlzdCBvZiBhc3NvY2lhdGVkIHN0YXRpb25zIHRoYXQgYXJlIGtub3duIHRvIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIG1vZCBwYXJhbWV0ZXIgCitOT1RFOi0gVGhlIG1lbW9yeSBmb3IgdGhpcyBsaXN0IHdpbGwgYmUgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIgb2YgdGhpcyBBUEkKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5TQVBfR2V0QXNzb2NTdGF0aW9ucworKAorICAgIHZfUFZPSURfdCBwdm9zR0N0eCwgVk9TX01PRFVMRV9JRCBtb2R1bGUsIAorICAgIHRwU2FwX0Fzc29jTWFjQWRkciBwQXNzb2NTdGFzCispOyAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9SZW1vdmVXcHNTZXNzaW9uT3ZlcmxhcAorCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIHRvIHJlbW92ZSBhbiBlbnRyeSBmcm9tIHNlc3Npb24gc2Vzc2lvbiBvdmVybGFwIGluZm8uCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgICBwUmVtb3ZlTWFjOiBwb2ludGVyIHRvIHZfTUFDQUREUl90IGZvciBzZXNzaW9uIE1BQyBhZGRyZXNzIHRoYXQgbmVlZHMgdG8gYmUgcmVtb3ZlZCBmcm9tIHdwcyBzZXNzaW9uCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTZXNzaW9uIGlzIG5vdCBkZWN0ZWN0ZWQuIFRoZSBwYXJhbWV0ZXIgaXMgZnVuY3Rpb24gbm90IHZhbGlkLgorICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5TQVBfUmVtb3ZlV3BzU2Vzc2lvbk92ZXJsYXAKKworKAorICAgIHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgICB2X01BQ0FERFJfdCBwUmVtb3ZlTWFjCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfZ2V0V3BzU2Vzc2lvbk92ZXJsYXAKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBnZXQgV1BTIHNlc3Npb24gb3ZlcmxhcCBpbmZvLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KK3B2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKK3BTZXNzaW9uTWFjOiBwb2ludGVyIHRvIHZfTUFDQUREUl90IGZvciBzZXNzaW9uIE1BQyBhZGRyZXNzCit1dWlkZTogUG9pbnRlciB0byAxNiBieXRlcyBhcnJheSBmb3Igc2Vzc2lvbiBVVUlEX0UKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIE92ZXJsYXAgaXMgZGVjdGVjdGVkLiBUaGUgcGFyYW1ldGVyIGlzIGZ1bmN0aW9uIG5vdCB2YWxpZC4KKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOU0FQX2dldFdwc1Nlc3Npb25PdmVybGFwCisoCisgICAgdl9QVk9JRF90IHB2b3NHQ3R4CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfU2V0Q291bnRlck1lYXN1cmUKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBpcyB1c2VkIHRvIGRpc2Fzc29jaWF0ZSBhbGwgdGhlIHN0YXRpb25zIGFuZCBwcmV2ZW50IAorICAgIGFzc29jaWF0aW9uIGZvciBhbnkgb3RoZXIgc3RhdGlvbi5XaGVuZXZlciBBdXRoZW50aWNhdG9yIHJlY2VpdmVzIDIgbWljIGZhaWx1cmVzIAorICAgIHdpdGhpbiA2MCBzZWNvbmRzLCBBdXRoZW50aWNhdG9yIHdpbGwgZW5hYmxlIGNvdW50ZXIgbWVhc3VyZSBhdCBTQVAgTGF5ZXIuIAorICAgIEF1dGhlbnRpY2F0b3Igd2lsbCBzdGFydCB0aGUgNjAgc2Vjb25kcyB0aW1lci4gQ29yZSBzdGFjayB3aWxsIG5vdCBhbGxvdyBhbnkgCisgICAgU1RBIHRvIGFzc29jaWF0ZSB0aWxsIEhERCBkaXNhYmxlcyBjb3VudGVyIG1lYXNzdXJlLiBDb3JlIHN0YWNrIHNoYWxsIGtpY2sgb3V0IGFsbCB0aGUgCisgICAgU1RBIHdoaWNoIGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBhbmQgRElBU1NPQyBFdmVudCB3aWxsIGJlIHByb3BvZ2F0ZWQgdG8gSEREIGZvciAKKyAgICBlYWNoIFNUQSB0byBjbGVhbiB1cCB0aGUgSEREIFNUQSB0YWJsZS5PbmNlIHRoZSA2MCBzZWNvbmRzIHRpbWVyIGV4cGlyZXMsIEF1dGhlbnRpY2F0b3IgCisgICAgd2lsbCBkaXNhYmxlIHRoZSBjb3VudGVyIG1lYXNzdXJlIGF0IGNvcmUgc3RhY2suIE5vdyBjb3JlIHN0YWNrIGNhbiBhbGxvdyBTVEFzIHRvIGFzc29jaWF0ZS4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCitwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCitiRW5hYmxlOiBJZiBUUlVFIHRoYW4gYWxsIHN0YXRpb25zIHdpbGwgYmUgZGlzYXNzb2NpYXRlZCBhbmQgbm8gbW9yZSB3aWxsIGJlIGFsbG93ZWQgdG8gYXNzb2NpYXRlLiBJZiBGQUxTRSB0aGFuIENPUkUKK3dpbGwgY29tZSBvdXQgb2YgdGhpcyBzdGF0ZS4KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5TQVBfU2V0Q291bnRlck1lYXN1cmUKKygKKyAgICB2X1BWT0lEX3QgcHZvc0dDdHgsIHZfQk9PTF90IGJFbmFibGUKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNhcF9nZXRzdGF0aW9uSUVfaW5mb3JtYXRpb24KKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byByZXRyaXZlIHRoZSBXUEEgYW5kIFJTTklFIG9mIGEgc3RhdGlvbi4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgICAgIHB2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgICAgICAgcExlbiA6IGxlbmd0aCBvZiBXUEFSU04gZWxtZW50IElFIHdoZXJlIGl0IHdvdWxkIGJlIGNvcGllZAorICAgICAgICBwQnVmIDogYnVmIHRvIGNvcHkgdGhlIFdQQVJTTkllIAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlNhcF9nZXRzdGF0aW9uSUVfaW5mb3JtYXRpb24odl9QVk9JRF90IHB2b3NHQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgICAqcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAgICAqcEJ1Zik7CisKKworVk9TX1NUQVRVUworV0xBTlNBUF9nZXRXcHNTZXNzaW9uT3ZlcmxhcAorKAorICAgIHZfUFZPSURfdCBwdm9zR0N0eAorKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9DbGVhckFDTAorCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHJlbW92ZXMgYWxsIHRoZSBlbnRyaWVzIGluIGJvdGggYWNjZXB0IGFuZCBkZW55IGxpc3RzLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICAgICAgcHZvc0dDdHg6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5TQVBfQ2xlYXJBQ0wKKyggCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX1NldE1vZGUKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBpcyB1c2VkIHRvIHNldCBtb2RlIGZvciBBQ0wKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgICAgIHB2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOU0FQX1NldE1vZGUKKyggCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eCwKKyAgICB2X1UzMl90IG1vZGUKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9Nb2RpZnlBQ0wKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBhZGQvcmVtb3ZlIG1hYyBhZGRyZXNzZXMgZnJvbSBibGFjay93aGl0ZSBsaXN0cyAoQUNMcykuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgICAgICBwdm9zR0N0eCAgICAgICAgOiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgICAgICAgcFBlZXJTdGFNYWMgICAgIDogTUFDIGFkZHJlc3MgdG8gYmUgYWRkZWQgb3IgcmVtb3ZlZCAKKyAgICAgICAgbGlzdFR5cGUgICAgICAgIDogYWRkL3JlbW92ZSB0byBiZSBkb25lIG9uIGJsYWNrIG9yIHdoaXRlIGxpc3QKKyAgICAgICAgY21kICAgICAgICAgICAgIDogQXJlIHdlIGRvaW5nIHRvIGFkZCBvciBkZWxldGUgYSBtYWMgYWRkciBmcm9tIGFuIEFDTC4KKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTlNBUF9Nb2RpZnlBQ0wKKygKKyAgICB2X1BWT0lEX3QgIHB2b3NHQ3R4LAorICAgIHZfVThfdCAqcFBlZXJTdGFNYWMsCisgICAgZVNhcEFDTFR5cGUgbGlzdFR5cGUsCisgICAgZVNhcEFDTENtZFR5cGUgY21kCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfU2V0X1dQQVJTTkllcworCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIHRvIHNldCBBUCBXUEEgYW5kIFJTTiBJRSBpbiBpdHMgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZS4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgICAgIHB2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgICAgICAgcFdQQVJTTklFczogYnVmZmVyIHRvIHRoZSBXUEEvUlNOIElFcyAKKyAgICAgICAgV1BBUlNOSUVzTGVuOiBsZW5ndGggb2YgV1BBL1JTTiBJRXMKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlNBUF9TZXRfV1BBUlNOSWVzKHZfUFZPSURfdCBwdm9zR0N0eCwgdl9VOF90ICpwV1BBUlNOSUVzLCB2X1UzMl90IFdQQVJTTklFc0xlbik7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9HZXRTdGF0aXN0aWNzCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIEFwIEFwcC9IREQgdG8gZ2V0IFRMIHN0YXRpc3RpY3MgZm9yIGFsbCBzdGF0aW9ucyBvZiBTb2Z0IEFQLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICAgICAgcHZvc0dDdHg6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgICAgICBiUmVzZXQ6IElmIHNldCBUTCBzdGF0aXN0aWNzIHdpbGwgYmUgY2xlYXJlZCBhZnRlciByZWFkaW5nCisgICAgT1VUCisgICAgICAgIHN0YXRCdWY6IEJ1ZmZlciB0byBnZXQgdGhlIHN0YXRpc3RpY3MKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5TQVBfR2V0U3RhdGlzdGljcyh2X1BWT0lEX3QgcHZvc0dDdHgsIHRTYXBfU29mdGFwU3RhdHMgKnN0YXRCdWYsIHZfQk9PTF90IGJSZXNldCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TZW5kQWN0aW9uCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgdG8gc2VuZCBhY3Rpb24gZnJhbWUgc2VudCBieSB1cHBlciBsYXllci4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICBJTgorICAgIHB2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgICBwQnVmOiBQb2ludGVyIG9mIHRoZSBhY3Rpb24gZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQKKyAgICBsZW46IExlbmd0aCBvZiB0aGUgYWN0aW9uIGZyYW1lCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5TQVBfU2VuZEFjdGlvbiggdl9QVk9JRF90IHB2b3NHQ3R4LCBjb25zdCB0QU5JX1U4ICpwQnVmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBsZW4gKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5TQVBfUmVtYWluT25DaGFubmVsCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgdG8gc2V0IFJlbWFpbiBPbiBjaGFubmVsIG9uIHNwZWNpZmllZCBjaGFubmVsCisgICAgZm9yIHNwZWNpZmllZCBkdXJhdGlvbi4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICBJTgorICAgIHB2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgICBjaGFubmVsOiBDaGFubmVsIG9uIHdoaWNoIGRyaXZlciBoYXMgdG8gbGlzdGVuIAorICAgIGR1cmF0aW9uOiBEdXJhdGlvbiBmb3Igd2hpY2ggZHJpdmVyIGhhcyB0byBsaXN0ZW4gb24gc3BlY2lmaWVkIGNoYW5uZWwKKyAgICBjYWxsYmFjazogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uY2UgTGlzdGVuIGlzIGRvbmUuCisgICAgcENvbnRleHQ6IENvbnRleHQgbmVlZHMgdG8gYmUgY2FsbGVkIGluIGNhbGxiYWNrIGZ1bmN0aW9uLiAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlNBUF9SZW1haW5PbkNoYW5uZWwoIHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY2hhbm5lbCwgdEFOSV9VMzIgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5PbkNoYW5DYWxsYmFjayBjYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ29udGV4dCApOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9DYW5jZWxSZW1haW5PbkNoYW5uZWwKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBjYW5jZWwgcHJldmlvdXMgcmVtYWluIG9uIGNoYW5uZWwgcmVxdWVzdC4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICBJTgorICAgIHB2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlNBUF9DYW5jZWxSZW1haW5PbkNoYW5uZWwoIHZfUFZPSURfdCBwdm9zR0N0eCApOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOU0FQX1JlZ2lzdGVyTWdtdEZyYW1lCisKKyAgREVTQ1JJUFRJT04gCisgICAgSEREIHVzZSB0aGlzIEFQSSB0byByZWdpc3RlciBzcGVjaWZpZWQgdHlwZSBvZiBmcmFtZSB3aXRoIENPUkUgc3RhY2suCisgICAgT24gcmVjZWl2aW5nIHN1Y2gga2luZCBvZiBmcmFtZSBDT1JFIHN0YWNrIHNob3VsZCBwYXNzIHRoaXMgZnJhbWUgdG8gSERECisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTCisKKyAgSU4KKyAgICBwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisgICAgZnJhbWVUeXBlOiBmcmFtZVR5cGUgdGhhdCBuZWVkcyB0byBiZSByZWdpc3RlcmVkIHdpdGggUEUuCisgICAgbWF0Y2hEYXRhOiBEYXRhIHBvaW50ZXIgd2hpY2ggc2hvdWxkIGJlIG1hdGNoZWQgYWZ0ZXIgZnJhbWUgdHlwZSBpcyBtYXRjaGVkLgorICAgIG1hdGNoTGVuOiBMZW5ndGggb2YgdGhlIG1hdGNoRGF0YQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOU0FQX1JlZ2lzdGVyTWdtdEZyYW1lKCB2X1BWT0lEX3QgcHZvc0dDdHgsIHRBTklfVTE2IGZyYW1lVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTgqIG1hdGNoRGF0YSwgdEFOSV9VMTYgbWF0Y2hMZW4gKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5TQVBfRGVSZWdpc3Rlck1nbXRGcmFtZQorCisgIERFU0NSSVBUSU9OIAorICAgVGhpcyBBUEkgaXMgdXNlZCB0byBkZXJlZ2lzdGVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBmcmFtZS4gCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTCisKKyAgSU4KKyAgICBwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisgICAgZnJhbWVUeXBlOiBmcmFtZVR5cGUgdGhhdCBuZWVkcyB0byBiZSBEZS1yZWdpc3RlcmVkIHdpdGggUEUuCisgICAgbWF0Y2hEYXRhOiBEYXRhIHBvaW50ZXIgd2hpY2ggc2hvdWxkIGJlIG1hdGNoZWQgYWZ0ZXIgZnJhbWUgdHlwZSBpcyBtYXRjaGVkLgorICAgIG1hdGNoTGVuOiBMZW5ndGggb2YgdGhlIG1hdGNoRGF0YQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOU0FQX0RlUmVnaXN0ZXJNZ210RnJhbWUoIHZfUFZPSURfdCBwdm9zR0N0eCwgdEFOSV9VMTYgZnJhbWVUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCogbWF0Y2hEYXRhLCB0QU5JX1UxNiBtYXRjaExlbiApOworI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QMlAKKworCisjaWZkZWYgX19jcGx1c3BsdXMKKyB9CisjZW5kaWYgCisKKworI2VuZGlmIC8qICNpZm5kZWYgV0xBTl9RQ1RfV0xBTlNBUF9IICovCisKZGlmZiAtLWdpdCBhL0NPUkUvU0FQL3NyYy9zYXBBcGlMaW5rQ250bC5jIGIvQ09SRS9TQVAvc3JjL3NhcEFwaUxpbmtDbnRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3ZDQ5MwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU0FQL3NyYy9zYXBBcGlMaW5rQ250bC5jCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIHMgYSBwIEEgcCBpIEwgaSBuIGsgQyBuIHQgbCAuIEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIE9WRVJWSUVXOgorICAKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBTQVAgbW9kdWxlcworICBMaW5rIENvbnRyb2wgZnVuY3Rpb25zLgorICAKKyAgVGhlIGZ1bmN0aW9ucyBleHRlcm5hbGl6ZWQgYnkgdGhpcyBtb2R1bGUgYXJlIHRvIGJlIGNhbGxlZCBPTkxZIGJ5IG90aGVyIAorICBXTEFOIG1vZHVsZXMgKEhERCkgCisKKyAgREVQRU5ERU5DSUVTOiAKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4gCisgIAorICAKKyAgQ29weXJpZ2h0IChjKSAyMDEwIFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAgJEhlYWRlcjogL2N5Z2RyaXZlL2MvRHJvcGJveC9NNzIwMUpTRENBQVBBRDUyMjQwQi9XTS9wbGF0Zm9ybS9tc203MjAwL1NyYy9Ecml2ZXJzL1NEL0NsaWVudERyaXZlcnMvV0xBTi9RQ1RfU0FQX1BBTC9DT1JFL1NBUC9zcmMvc2FwQXBpTGlua0NudGwuYyx2IDEuNyAyMDA4LzEyLzE4IDE5OjQ0OjExIGp6bXVkYSBFeHAganptdWRhICQkRGF0ZVRpbWUkJEF1dGhvcjoganptdWRhICQKKworCisgIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwMTAtMDMtMTUgICAgICAgICAgICAgIENyZWF0ZWQgbW9kdWxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisvLyBQaWNrIHVwIHRoZSBDU1IgY2FsbGJhY2sgZGVmaW5pdGlvbgorI2luY2x1ZGUgImNzckFwaS5oIgorI2luY2x1ZGUgInNtZV9BcGkuaCIKKy8vIFNBUCBJbnRlcm5hbCBBUEkgaGVhZGVyIGZpbGUKKyNpbmNsdWRlICJzYXBJbnRlcm5hbC5oIiAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNBUF9ERUJVRworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHbG9iYWwgRGF0YSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIFZhcmlhYmxlIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRXh0ZXJuYWxpemVkIEZ1bmN0aW9uIERlZmluaXRpb25zCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRG9jdW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TY2FuQ2FsbGJhY2soKQorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxiYWNrIGZvciBTY2FuIChzY2FuIHJlc3VsdHMpIEV2ZW50cyAgCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB0SGFsSGFuZGxlICA6IHRIYWxIYW5kbGUgcGFzc2VkIGluIHdpdGggdGhlIHNjYW4gcmVxdWVzdAorICAgICpwQ29udGV4dCAgIDogVGhlIHNlY29uZCBjb250ZXh0IHBhc3MgaW4gZm9yIHRoZSBjYWxsZXIgKHNhcENvbnRleHQpCisgICAgc2NhbklEICAgICAgOiBzY2FuSUQgZ290IGFmdGVyIHRoZSBzY2FuCisgICAgc3RhdHVzICAgICAgOiBTdGF0dXMgb2Ygc2NhbiAtc3VjY2VzcywgZmFpbHVyZSBvciBhYm9ydAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBlSGFsU3RhdHVzIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBlSEFMX1NUQVRVU19TVUNDRVNTOiBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2VIYWxTdGF0dXMKK1dMQU5TQVBfU2NhbkNhbGxiYWNrCisoCisgIHRIYWxIYW5kbGUgaGFsSGFuZGxlLCAKKyAgdm9pZCAqcENvbnRleHQsICAgICAgICAgICAvKiBPcGFxdWUgU0FQIGhhbmRsZSAqLworICB2X1UzMl90IHNjYW5JRCwgCisgIGVDc3JTY2FuU3RhdHVzIHNjYW5TdGF0dXMKKykKK3sKKyAgICB0U2NhblJlc3VsdEhhbmRsZSBwUmVzdWx0ID0gTlVMTDsKKyAgICBlSGFsU3RhdHVzIHNjYW5HZXRSZXN1bHRTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHB0U2FwQ29udGV4dCBwc2FwQ29udGV4dCA9IChwdFNhcENvbnRleHQpcENvbnRleHQ7CisgICAgdFdMQU5fU0FQRXZlbnQgc2FwRXZlbnQ7IC8qIFN0YXRlIG1hY2hpbmUgZXZlbnQgKi8KKyAgICB2X1U4X3Qgb3BlckNoYW5uZWwgPSAwOworICAgIFZPU19TVEFUVVMgc2Fwc3RhdHVzOworI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCisgICAgdl9VMzJfdCBvcGVyYXRpbmdCYW5kOworI2VuZGlmCisKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgYmVmb3JlIHN3aXRjaCBvbiBzY2FuU3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHNjYW5TdGF0dXMpOworCisgICAgc3dpdGNoIChzY2FuU3RhdHVzKSAKKyAgICB7CisgICAgICAgIGNhc2UgZUNTUl9TQ0FOX1NVQ0NFU1M6CisgICAgICAgICAgICAvLyBzYXBTY2FuQ29tcGxldGVDYWxsYmFjayB3aXRoIGVDU1JfU0NBTl9TVUNDRVNTCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiBzY2FuU3RhdHVzID0gJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgImVDU1JfU0NBTl9TVUNDRVNTIiwgc2NhblN0YXR1cyk7CisKKyAgICAgICAgICAgIC8vIEdldCBzY2FuIHJlc3VsdHMsIFJ1biBjaGFubmVsIHNlbGVjdGlvbiBhbGdvcml0aG0sIHNlbGVjdCBjaGFubmVsIGFuZCBrZWVwIGluIHBTYXBDb250ZXh0LT5DaGFubmVsCisgICAgICAgICAgICBzY2FuR2V0UmVzdWx0U3RhdHVzID0gc21lX1NjYW5HZXRSZXN1bHQoaGFsSGFuZGxlLCAwLCBOVUxMLCAmcFJlc3VsdCk7CisKKyAgICAgICAgICAgIGlmICgoTlVMTCA9PSBwUmVzdWx0KSB8fCAoc2NhbkdldFJlc3VsdFN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBObyBzY2FuIHJlc3VsdHMKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJJbiAlcywgc21lX1NjYW5HZXRSZXN1bHQgPSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3BlckNoYW5uZWwgPSBzYXBTZWxlY3RDaGFubmVsKGhhbEhhbmRsZSwgcFJlc3VsdCk7CisgICAgICAgICAgICBzbWVfU2NhblJlc3VsdFB1cmdlKGhhbEhhbmRsZSwgcFJlc3VsdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igc2NhblN0YXR1cyA9ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sICJlQ1NSX1NDQU5fQUJPUlQvRkFJTFVSRSIsIHNjYW5TdGF0dXMpOworICAgIH0KKyAgICAKKyAgICBpZiAob3BlckNoYW5uZWwgPT0gU0FQX0NIQU5ORUxfTk9UX1NFTEVDVEVEKQorI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCisgICAgeworICAgICAgIGlmKHBzYXBDb250ZXh0LT5jaGFubmVsTGlzdCAhPSBOVUxMKQorICAgICAgIHsKKyAgICAgICAgICBwc2FwQ29udGV4dC0+Y2hhbm5lbCA9IHBzYXBDb250ZXh0LT5jaGFubmVsTGlzdFswXTsKKyAgICAgICB9CisgICAgICAgZWxzZSAKKyAgICAgICB7CisgICAgICAgICAvKiBpZiB0aGUgY2hhbm5lbCBsaXN0IGlzIGVtcHR5IHRoZW4gdGhlcmUgaXMgbm8gdmFsaWQgY2hhbm5lbCBpbiAKKyAgICAgICAgICAgICAgICB0aGUgc2VsZWN0ZWQgc3ViLWJhbmQgc28gc2VsZWN0IGRlZmF1bHQgY2hhbm5lbCBpbiB0aGUgCisgICAgICAgICAgICAgICAgQkFORCgyLjRHSHovNUdIWikgKi8KKyAgICAgICAgICBjY21DZmdHZXRJbnQoIGhhbEhhbmRsZSwgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkQsICZvcGVyYXRpbmdCYW5kKTsKKyAgICAgICAgICBpZihSRl9TVUJCQU5EXzJfNF9HSFogPT0gb3BlcmF0aW5nQmFuZCApCisgICAgICAgICAgICAgIHBzYXBDb250ZXh0LT5jaGFubmVsID0gU0FQX0RFRkFVTFRfQ0hBTk5FTDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHBzYXBDb250ZXh0LT5jaGFubmVsID0gU0FQX0RFRkFVTFRfNUdIWl9DSEFOTkVMOworICAgICAgICAgCisgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgICAgcHNhcENvbnRleHQtPmNoYW5uZWwgPSBTQVBfREVGQVVMVF9DSEFOTkVMOworI2VuZGlmCisgICAgZWxzZQorICAgIHsKKyAgICAgIHBzYXBDb250ZXh0LT5jaGFubmVsID0gb3BlckNoYW5uZWw7CisgICAgfQorICAgIAorI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCisgICAgaWYocHNhcENvbnRleHQtPmNoYW5uZWxMaXN0ICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBBbHdheXMgZnJlZSB1cCB0aGUgbWVtb3J5IGZvciBjaGFubmVsIHNlbGVjdGlvbiB3aGF0ZXZlciAKKyAgICAgICAgICogdGhlIHJlc3VsdCAqLworICAgICAgICB2b3NfbWVtX2ZyZWUocHNhcENvbnRleHQtPmNoYW5uZWxMaXN0KTsKKyAgICAgICAgcHNhcENvbnRleHQtPmNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICB9CisjZW5kaWYgICAgCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENoYW5uZWwgc2VsZWN0ZWQgPSAlZCIsIF9fRlVOQ1RJT05fXywgcHNhcENvbnRleHQtPmNoYW5uZWwpOworCisgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisgICAgc2FwRXZlbnQuZXZlbnQgPSBlU0FQX01BQ19TQ0FOX0NPTVBMRVRFOworICAgIHNhcEV2ZW50LnBhcmFtcyA9IDA7ICAgICAgICAvLyBwQ3NyUm9hbUluZm87CisgICAgc2FwRXZlbnQudTEgPSBzY2FuU3RhdHVzOyAgIC8vIHJvYW1zdGF0dXMKKyAgICBzYXBFdmVudC51MiA9IDA7ICAgICAgICAgICAgLy8gcm9hbVJlc3VsdAorCisgICAgLyogSGFuZGxlIGV2ZW50ICovIAorICAgIHNhcHN0YXR1cyA9IHNhcEZzbShwc2FwQ29udGV4dCwgJnNhcEV2ZW50KTsKKworICAgIHJldHVybiBzYXBzdGF0dXM7Cit9Ly8gV0xBTlNBUF9TY2FuQ2FsbGJhY2sKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX1JvYW1DYWxsYmFjaygpCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGJhY2sgZm9yIFJvYW0gKGNvbm5lY3Rpb24gc3RhdHVzKSBFdmVudHMgIAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgICBwQ29udGV4dCAgICAgIDogcENvbnRleHQgcGFzc2VkIGluIHdpdGggdGhlIHJvYW0gcmVxdWVzdAorICAgICAgcENzclJvYW1JbmZvICA6IFBvaW50ZXIgdG8gYSB0Q3NyUm9hbUluZm8sIHNlZSBkZWZpbml0aW9uIG9mIGVSb2FtQ21kU3RhdHVzIGFuZAorICAgICAgZVJvYW1DbWRSZXN1bHQ6IEZvciBkZXRhaWwgdmFsaWQgbWVtYmVycy4gSXQgbWF5IGJlIE5VTEwKKyAgICAgIHJvYW1JZCAgICAgICAgOiBUbyBpZGVudGlmeSB0aGUgY2FsbGJhY2sgcmVsYXRlZCByb2FtIHJlcXVlc3QuIDAgbWVhbnMgdW5zb2xpY2l0ZWQKKyAgICAgIHJvYW1TdGF0dXMgICAgOiBGbGFnIGluZGljYXRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgY2FsbGJhY2sKKyAgICAgIHJvYW1SZXN1bHQgICAgOiBSZXN1bHQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgZUhhbFN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUzogU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitlSGFsU3RhdHVzCitXTEFOU0FQX1JvYW1DYWxsYmFjaworKAorICAgIHZvaWQgKnBDb250ZXh0LCAgICAgICAgICAgLyogT3BhcXVlIFNBUCBoYW5kbGUgKi8gCisgICAgdENzclJvYW1JbmZvICpwQ3NyUm9hbUluZm8sCisgICAgdl9VMzJfdCByb2FtSWQsIAorICAgIGVSb2FtQ21kU3RhdHVzIHJvYW1TdGF0dXMsIAorICAgIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQKKykKK3sKKyAgICAvKiBzYXBDb250ZXh0IHZhbHVlICovICAgIAorICAgIHB0U2FwQ29udGV4dCBzYXBDb250ZXh0ID0gKHB0U2FwQ29udGV4dCkgcENvbnRleHQ7IAorICAgIHRXTEFOX1NBUEV2ZW50IHNhcEV2ZW50OyAvKiBTdGF0ZSBtYWNoaW5lIGV2ZW50ICovCisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgYmVmb3JlIHN3aXRjaCBvbiByb2FtU3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcm9hbVN0YXR1cyk7CisgICAgc3dpdGNoKHJvYW1TdGF0dXMpCisgICAgeworICAgICAgICBjYXNlIGVDU1JfUk9BTV9TRVNTSU9OX09QRU5FRDoKKyAgICAgICAgeworICAgICAgICAgICAgLyogdEhhbEhhbmRsZSAqLworICAgICAgICAgICAgdEhhbEhhbmRsZSBoSGFsID0gVk9TX0dFVF9IQUxfQ0Ioc2FwQ29udGV4dC0+cHZvc0dDdHgpOworCisgICAgICAgICAgICBpZiAoTlVMTCA9PSBoSGFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSW4gJXMgaW52YWxpZCBoSGFsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiAlcyBjYWxsaW5nIHNtZV9Sb2FtQ29ubmVjdCB3aXRoIGVDU1JfQlNTX1RZUEVfSU5GUkFfQVAiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgc2FwQ29udGV4dC0+aXNTYXBTZXNzaW9uT3BlbiA9IGVTQVBfVFJVRTsKKyAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9Sb2FtQ29ubmVjdChoSGFsLCBzYXBDb250ZXh0LT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhcENvbnRleHQtPmNzclJvYW1Qcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYXBDb250ZXh0LT5jc3JSb2FtSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9JTkZSQV9JTkQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtU3RhdHVzID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fSU5GUkFfSU5EIiwgcm9hbVN0YXR1cyk7CisgICAgICAgICAgICBpZihyb2FtUmVzdWx0ID09IGVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfU1RBUlRfRkFJTEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLyAKKyAgICAgICAgICAgICAgICBzYXBFdmVudC5ldmVudCA9IGVTQVBfTUFDX1NUQVJUX0ZBSUxTOyAKKyAgICAgICAgICAgICAgICBzYXBFdmVudC5wYXJhbXMgPSBwQ3NyUm9hbUluZm87CisgICAgICAgICAgICAgICAgc2FwRXZlbnQudTEgPSByb2FtU3RhdHVzOworICAgICAgICAgICAgICAgIHNhcEV2ZW50LnUyID0gcm9hbVJlc3VsdDsgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogSGFuZGxlIGV2ZW50ICovIAorICAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IHNhcEZzbShzYXBDb250ZXh0LCAmc2FwRXZlbnQpOworICAgICAgICAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fTE9TVExJTks6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtU3RhdHVzID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX0xPU1RMSU5LIiwgcm9hbVN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9NSUNfRVJST1JfSU5EOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVN0YXR1cyA9ICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX01JQ19FUlJPUl9JTkQiLCByb2FtU3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1NFVF9LRVlfQ09NUExFVEU6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtU3RhdHVzID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fU0VUX0tFWV9DT01QTEVURSIsIHJvYW1TdGF0dXMpOworICAgICAgICAgICAgaWYgKHJvYW1SZXN1bHQgPT0gZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBGb3JtYXQgdGhlIFNFVCBLRVkgY29tcGxldGUgaW5mb3JtYXRpb24gcGFzcyB0byBIREQuLi4gKi8KKyAgICAgICAgICAgICAgICBzYXBTaWduYWxIRERldmVudChzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIGVTQVBfU1RBX1NFVF9LRVlfRVZFTlQsKHZfUFZPSURfdCkgZVNBUF9TVEFUVVNfRkFJTFVSRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRU1PVkVfS0VZX0NPTVBMRVRFOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVN0YXR1cyA9ICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVNT1ZFX0tFWV9DT01QTEVURSIsIHJvYW1TdGF0dXMpOworICAgICAgICAgICAgaWYgKHJvYW1SZXN1bHQgPT0gZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBGb3JtYXQgdGhlIFNFVCBLRVkgY29tcGxldGUgaW5mb3JtYXRpb24gcGFzcyB0byBIREQuLi4gKi8KKyAgICAgICAgICAgICAgICBzYXBTaWduYWxIRERldmVudChzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIGVTQVBfU1RBX0RFTF9LRVlfRVZFTlQsICh2X1BWT0lEX3QpZVNBUF9TVEFUVVNfRkFJTFVSRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVN0YXR1cyA9ICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OIiwgcm9hbVN0YXR1cyk7CisgICAgICAgICAgICBpZiAocm9hbVJlc3VsdCA9PSBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEZvcm1hdCB0aGUgU0VUIEtFWSBjb21wbGV0ZSBpbmZvcm1hdGlvbiBwYXNzIHRvIEhERC4uLiAqLworICAgICAgICAgICAgICAgIHNhcFNpZ25hbEhERGV2ZW50KHNhcENvbnRleHQsIHBDc3JSb2FtSW5mbywgZVNBUF9TVEFfUkVBU1NPQ19FVkVOVCwgKHZfUFZPSURfdCllU0FQX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX0RJU0FTU09DSUFURUQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtU3RhdHVzID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX0RJU0FTU09DSUFURUQiLCByb2FtU3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChyb2FtUmVzdWx0ID09IGVDU1JfUk9BTV9SRVNVTFRfTUlDX0ZBSUxVUkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRm9ybWF0IHRoZSBNSUMgZmFpbHVyZSBldmVudCB0byByZXR1cm4uLi4gKi8KKyAgICAgICAgICAgICAgICBzYXBTaWduYWxIRERldmVudChzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIGVTQVBfU1RBX01JQ19GQUlMVVJFX0VWRU5ULCh2X1BWT0lEX3QpIGVTQVBfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fV1BTX1BCQ19QUk9CRV9SRVFfSU5EOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVN0YXR1cyA9ICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9XUFNfUEJDX1BST0JFX1JFUV9JTkQiLCByb2FtU3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX0lORElDQVRFX01HTVRfRlJBTUU6CisgICAgICAgICAgICBzYXBTaWduYWxIRERldmVudChzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNBUF9JTkRJQ0FURV9NR01UX0ZSQU1FLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpIGVTQVBfU1RBVFVTX1NVQ0NFU1MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFTUFJTl9DSEFOX1JFQURZOgorICAgICAgICAgICAgc2FwU2lnbmFsSEREZXZlbnQoc2FwQ29udGV4dCwgcENzclJvYW1JbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTQVBfUkVNQUlOX0NIQU5fUkVBRFksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fU0VORF9BQ1RJT05fQ05GOgorICAgICAgICAgICAgc2FwU2lnbmFsSEREZXZlbnQoc2FwQ29udGV4dCwgcENzclJvYW1JbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0FQX1NFTkRfQUNUSU9OX0NORiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkoKCByb2FtUmVzdWx0ID09IGVDU1JfUk9BTV9SRVNVTFRfTk9ORSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTQVBfU1RBVFVTX1NVQ0NFU1MgOiBlU0FQX1NUQVRVU19GQUlMVVJFKSk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJJbiAlcywgQ1NSIHJvYW1TdGF0dXMgbm90IGhhbmRsZWQgcm9hbVN0YXR1cyA9ICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZ2V0X2VSb2FtQ21kU3RhdHVzX3N0cihyb2FtU3RhdHVzKSwgcm9hbVN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgYmVmb3JlIHN3aXRjaCBvbiByb2FtUmVzdWx0ID0gJWRcbiIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJvYW1SZXN1bHQpOworCisgICAgc3dpdGNoIChyb2FtUmVzdWx0KQorICAgIHsKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0FTU09DSUFUSU9OX0lORDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1SZXN1bHQgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0FTU09DSUFUSU9OX0lORCIsIHJvYW1SZXN1bHQpOworICAgICAgICAgICAgc2FwQ29udGV4dC0+blN0YVdQQVJTblJlcUllTGVuZ3RoID0gcENzclJvYW1JbmZvLT5yc25JRUxlbjsKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKHNhcENvbnRleHQtPm5TdGFXUEFSU25SZXFJZUxlbmd0aCkKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoIHNhcENvbnRleHQtPnBTdGFXcGFSc25SZXFJRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDc3JSb2FtSW5mby0+cHJzbklFLCBzYXBDb250ZXh0LT5uU3RhV1BBUlNuUmVxSWVMZW5ndGgpOworCisgICAgICAgICAgICBzYXBDb250ZXh0LT5uU3RhQWRkSWVMZW5ndGggPSBwQ3NyUm9hbUluZm8tPmFkZElFTGVuOworICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoc2FwQ29udGV4dC0+blN0YUFkZEllTGVuZ3RoKQorICAgICAgICAgICAgICAgIHZvc19tZW1fY29weSggc2FwQ29udGV4dC0+cFN0YUFkZElFLAorICAgICAgICAgICAgICAgICAgICAgICAgcENzclJvYW1JbmZvLT5wYWRkSUUsIHNhcENvbnRleHQtPm5TdGFBZGRJZUxlbmd0aCk7CisKKyAgICAgICAgICAgIHNhcENvbnRleHQtPlNhcFFvc0NmZy5XbW1Jc0VuYWJsZWQgPSBwQ3NyUm9hbUluZm8tPndtbUVuYWJsZWRTdGE7CisgICAgICAgICAgICAvLyBNQUMgZmlsdGVyaW5nCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzYXBJc1BlZXJNYWNBbGxvd2VkKHNhcENvbnRleHQsICh2X1U4X3QgKilwQ3NyUm9hbUluZm8tPnBlZXJNYWMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IHNhcFNpZ25hbEhERGV2ZW50KCBzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIGVTQVBfU1RBX0FTU09DX0lORCwgKHZfUFZPSURfdCllU0FQX1NUQVRVU19TVUNDRVNTKTsKKyAgICAgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICglZCkgTUFDIgorICAgICAgICAgICAgICAgICAgICAgICIoJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgpIGZhaWwiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcm9hbVJlc3VsdCwgcENzclJvYW1JbmZvLT5wZWVyTWFjWzBdLAorICAgICAgICAgICAgICAgICAgICAgIHBDc3JSb2FtSW5mby0+cGVlck1hY1sxXSwgcENzclJvYW1JbmZvLT5wZWVyTWFjWzJdLAorICAgICAgICAgICAgICAgICAgICAgIHBDc3JSb2FtSW5mby0+cGVlck1hY1szXSwgcENzclJvYW1JbmZvLT5wZWVyTWFjWzRdLAorICAgICAgICAgICAgICAgICAgICAgIHBDc3JSb2FtSW5mby0+cGVlck1hY1s1XSk7CisgICAgICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9XQVJOLCAKKyAgICAgICAgICAgICAgICAgICAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gKCVkKSBNQUMiCisgICAgICAgICAgICAgICAgICAgIiglMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWCkgbm90IGFsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcm9hbVJlc3VsdCwgcENzclJvYW1JbmZvLT5wZWVyTWFjWzBdLAorICAgICAgICAgICAgICAgICAgIHBDc3JSb2FtSW5mby0+cGVlck1hY1sxXSwgcENzclJvYW1JbmZvLT5wZWVyTWFjWzJdLAorICAgICAgICAgICAgICAgICAgIHBDc3JSb2FtSW5mby0+cGVlck1hY1szXSwgcENzclJvYW1JbmZvLT5wZWVyTWFjWzRdLCBwQ3NyUm9hbUluZm8tPnBlZXJNYWNbNV0pOworICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9IAorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfQVNTT0NJQVRJT05fQ05GOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDU1Igcm9hbVJlc3VsdCA9ICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0FTU09DSUFUSU9OX0NORiIsIHJvYW1SZXN1bHQpOworCisgICAgICAgICAgICBzYXBDb250ZXh0LT5uU3RhV1BBUlNuUmVxSWVMZW5ndGggPSBwQ3NyUm9hbUluZm8tPnJzbklFTGVuOworICAgICAgICAgICAgaWYgKHNhcENvbnRleHQtPm5TdGFXUEFSU25SZXFJZUxlbmd0aCkKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoIHNhcENvbnRleHQtPnBTdGFXcGFSc25SZXFJRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDc3JSb2FtSW5mby0+cHJzbklFLCBzYXBDb250ZXh0LT5uU3RhV1BBUlNuUmVxSWVMZW5ndGgpOworCisgICAgICAgICAgICBzYXBDb250ZXh0LT5uU3RhQWRkSWVMZW5ndGggPSBwQ3NyUm9hbUluZm8tPmFkZElFTGVuOworICAgICAgICAgICAgaWYoc2FwQ29udGV4dC0+blN0YUFkZEllTGVuZ3RoKQorICAgICAgICAgICAgICAgIHZvc19tZW1fY29weSggc2FwQ29udGV4dC0+cFN0YUFkZElFLAorICAgICAgICAgICAgICAgICAgICBwQ3NyUm9hbUluZm8tPnBhZGRJRSwgc2FwQ29udGV4dC0+blN0YUFkZEllTGVuZ3RoKTsKKworICAgICAgICAgICAgc2FwQ29udGV4dC0+U2FwUW9zQ2ZnLldtbUlzRW5hYmxlZCA9IHBDc3JSb2FtSW5mby0+d21tRW5hYmxlZFN0YTsKKyAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLworICAgICAgICAgICAgdm9zU3RhdHVzID0gc2FwU2lnbmFsSEREZXZlbnQoIHNhcENvbnRleHQsIHBDc3JSb2FtSW5mbywgZVNBUF9TVEFfQVNTT0NfRVZFTlQsICh2X1BWT0lEX3QpZVNBUF9TVEFUVVNfU1VDQ0VTUyk7CisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9ESVNBU1NPQ19JTkQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9SRVNVTFRfRElTQVNTT0NfSU5EIiwgcm9hbVJlc3VsdCk7CisgICAgICAgICAgICAvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIHZvc1N0YXR1cyA9IHNhcFNpZ25hbEhERGV2ZW50KCBzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIGVTQVBfU1RBX0RJU0FTU09DX0VWRU5ULCAodl9QVk9JRF90KWVTQVBfU1RBVFVTX1NVQ0NFU1MpOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfREVBVVRIX0lORDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1SZXN1bHQgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0RFQVVUSF9JTkQiLCByb2FtUmVzdWx0KTsKKyAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLworICAgICAgICAgICAgLy9UT0RPOiB3ZSB3aWxsIHVzZSB0aGUgc2FtZSBldmVudCBpbm9yZGVyIHRvIGluZm9ybSBIREQgdG8gZGlzYXNzb2NpYXRlIHRoZSBzdGF0aW9uCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzYXBTaWduYWxIRERldmVudCggc2FwQ29udGV4dCwgcENzclJvYW1JbmZvLCBlU0FQX1NUQV9ESVNBU1NPQ19FVkVOVCwgKHZfUFZPSURfdCllU0FQX1NUQVRVU19TVUNDRVNTKTsKKyAgICAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9HUk9VUDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1SZXN1bHQgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfR1JPVVAiLCByb2FtUmVzdWx0KTsKKyAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLworICAgICAgICAgICAgLy9UT0RPOiBzdXBwb3J0IGZvciBncm91cCBrZXkgTUlDIGZhaWx1cmUgZXZlbnQgdG8gYmUgaGFuZGxlZAorICAgICAgICAgICAgdm9zU3RhdHVzID0gc2FwU2lnbmFsSEREZXZlbnQoIHNhcENvbnRleHQsIHBDc3JSb2FtSW5mbywgZVNBUF9TVEFfTUlDX0ZBSUxVUkVfRVZFTlQsKHZfUFZPSURfdCkgTlVMTCk7CisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfVU5JQ0FTVDogCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfVU5JQ0FTVCIsIHJvYW1SZXN1bHQpOworICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisgICAgICAgICAgICAvL1RPRE86IHN1cHBvcnQgZm9yIHVuaWNhc3Qga2V5IE1JQyBmYWlsdXJlIGV2ZW50IHRvIGJlIGhhbmRsZWQKKyAgICAgICAgICAgIHZvc1N0YXR1cyA9IHNhcFNpZ25hbEhERGV2ZW50KCBzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIGVTQVBfU1RBX01JQ19GQUlMVVJFX0VWRU5ULCh2X1BWT0lEX3QpIE5VTEwpOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfQVVUSEVOVElDQVRFRDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1SZXN1bHQgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0FVVEhFTlRJQ0FURUQiLCByb2FtUmVzdWx0KTsKKyAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLworICAgICAgICAgICAgc2FwU2lnbmFsSEREZXZlbnQoIHNhcENvbnRleHQsIHBDc3JSb2FtSW5mbyxlU0FQX1NUQV9TRVRfS0VZX0VWRU5ULCAodl9QVk9JRF90KWVTQVBfU1RBVFVTX1NVQ0NFU1MpOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfUk9BTV9SRVNVTFRfQVNTT0NJQVRFRDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1SZXN1bHQgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQiLCByb2FtUmVzdWx0KTsKKyAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLworICAgICAgICAgICAgc2FwU2lnbmFsSEREZXZlbnQoIHNhcENvbnRleHQsIHBDc3JSb2FtSW5mbyxlU0FQX1NUQV9SRUFTU09DX0VWRU5ULCAodl9QVk9JRF90KWVTQVBfU1RBVFVTX1NVQ0NFU1MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX1NUQVJURUQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9TVEFSVEVEIiwgcm9hbVJlc3VsdCk7CisgICAgICAgICAgICAvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8gCisgICAgICAgICAgICBzYXBFdmVudC5ldmVudCA9IGVTQVBfTUFDX1NUQVJUX0JTU19TVUNDRVNTOworICAgICAgICAgICAgc2FwRXZlbnQucGFyYW1zID0gcENzclJvYW1JbmZvOworICAgICAgICAgICAgc2FwRXZlbnQudTEgPSByb2FtU3RhdHVzOworICAgICAgICAgICAgc2FwRXZlbnQudTIgPSByb2FtUmVzdWx0OworCisgICAgICAgICAgICAvKiBIYW5kbGUgZXZlbnQgKi8gCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzYXBGc20oc2FwQ29udGV4dCwgJnNhcEV2ZW50KTsKKyAgICAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX1NUT1BQRUQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9TVE9QUEVEIiwgcm9hbVJlc3VsdCk7CisgICAgICAgICAgICAvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8gCisgICAgICAgICAgICBzYXBFdmVudC5ldmVudCA9IGVTQVBfTUFDX1JFQURZX0ZPUl9DT05ORUNUSU9OUzsKKyAgICAgICAgICAgIHNhcEV2ZW50LnBhcmFtcyA9IHBDc3JSb2FtSW5mbzsKKyAgICAgICAgICAgIHNhcEV2ZW50LnUxID0gcm9hbVN0YXR1czsKKyAgICAgICAgICAgIHNhcEV2ZW50LnUyID0gcm9hbVJlc3VsdDsKKworICAgICAgICAgICAgLyogSGFuZGxlIGV2ZW50ICovIAorICAgICAgICAgICAgdm9zU3RhdHVzID0gc2FwRnNtKHNhcENvbnRleHQsICZzYXBFdmVudCk7CisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9XUFNfUEJDX1BST0JFX1JFUV9JTkQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVDU1JfUk9BTV9SRVNVTFRfV1BTX1BCQ19QUk9CRV9SRVFfSU5EIiwgcm9hbVJlc3VsdCk7CisgICAgICAgICAgICAvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIC8vVE9ETzogc3VwcG9ydCBmb3IgZ3JvdXAga2V5IE1JQyBmYWlsdXJlIGV2ZW50IHRvIGJlIGhhbmRsZWQKKyAgICAgICAgICAgIHZvc1N0YXR1cyA9IHNhcFNpZ25hbEhERGV2ZW50KCBzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIGVTQVBfV1BTX1BCQ19QUk9CRV9SRVFfRVZFTlQsKHZfUFZPSURfdCkgTlVMTCk7CisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQiLCByb2FtUmVzdWx0KTsKKyAgICAgICAgICAgIC8vVGhpcyBldmVudCBjYW4gYmUgdXNlZCB0byBpbmZvcm0gaGRkIGFib3V0IHVzZXIgdHJpZ2dlcmVkIGRpc2Fzc29jIGV2ZW50CisgICAgICAgICAgICAvKiBGaWxsIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIHNhcFNpZ25hbEhERGV2ZW50KCBzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIGVTQVBfU1RBX0RJU0FTU09DX0VWRU5ULCAodl9QVk9JRF90KWVTQVBfU1RBVFVTX1NVQ0NFU1MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX05PTkU6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZUNTUl9ST0FNX1JFU1VMVF9OT05FIiwgcm9hbVJlc3VsdCk7CisgICAgICAgICAgICAvL1RoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGhkZCBhYm91dCB1c2VyIHRyaWdnZXJlZCBkaXNhc3NvYyBldmVudAorICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisgICAgICAgICAgICBpZiAoIHJvYW1TdGF0dXMgPT0gZUNTUl9ST0FNX1NFVF9LRVlfQ09NUExFVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2FwU2lnbmFsSEREZXZlbnQoIHNhcENvbnRleHQsIHBDc3JSb2FtSW5mbyxlU0FQX1NUQV9TRVRfS0VZX0VWRU5ULCh2X1BWT0lEX3QpIGVTQVBfU1RBVFVTX1NVQ0NFU1MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocm9hbVN0YXR1cyA9PSBlQ1NSX1JPQU1fUkVNT1ZFX0tFWV9DT01QTEVURSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2FwU2lnbmFsSEREZXZlbnQoIHNhcENvbnRleHQsIHBDc3JSb2FtSW5mbyxlU0FQX1NUQV9ERUxfS0VZX0VWRU5ULCh2X1BWT0lEX3QpIGVTQVBfU1RBVFVTX1NVQ0NFU1MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1fUkVTVUxUX01BWF9BU1NPQ19FWENFRURFRDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ1NSIHJvYW1SZXN1bHQgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlQ1NSX1JPQU1fUkVTVUxUX01BWF9BU1NPQ19FWENFRURFRCIsIHJvYW1SZXN1bHQpOworICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzYXBTaWduYWxIRERldmVudChzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIGVTQVBfTUFYX0FTU09DX0VYQ0VFREVELCAodl9QVk9JRF90KU5VTEwpOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiSW4gJXMsIENTUiByb2FtUmVzdWx0ID0gJXMgKCVkKSBub3QgaGFuZGxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLGdldF9lQ3NyUm9hbVJlc3VsdF9zdHIocm9hbVJlc3VsdCkscm9hbVJlc3VsdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gaGFsU3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9TQVAvc3JjL3NhcENoU2VsZWN0LmMgYi9DT1JFL1NBUC9zcmMvc2FwQ2hTZWxlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2MxMDlkCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TQVAvc3JjL3NhcENoU2VsZWN0LmMKQEAgLTAsMCArMSw0NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgcyBhIHAgQyBoIFMgZSBsIGUgYyB0IC4gQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgT1ZFUlZJRVc6CisgIAorICBUaGlzIHNvZnR3YXJlIHVuaXQgaG9sZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXTEFOIFNBUCBtb2R1bGVzCisgIGZ1bmN0aW9ucyBmb3IgY2hhbm5lbCBzZWxlY3Rpb24uICAKKworICBERVBFTkRFTkNJRVM6IAorCisgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LiAKKyAgCisgIAorICBDb3B5cmlnaHQgKGMpIDIwMTAgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisKKyAgd2hlbiAgICAgICAgd2hvICAgICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tLS0gICAgLS0tICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyMDEwLTAzLTE1ICBTT0ZUQVAgICAgICBDcmVhdGVkIG1vZHVsZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKyNpbmNsdWRlICJjc3JBcGkuaCIKKyNpbmNsdWRlICJzbWVfQXBpLmgiCisjaW5jbHVkZSAic2FwQ2hTZWxlY3QuaCIKKyNpbmNsdWRlICJzYXBJbnRlcm5hbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEZ1bmN0aW9uIGRlZmluaXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTQVBfREVCVUcKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBzYXBDaGFuU2VsSW5pdAorCisgIERFU0NSSVBUSU9OIAorICAgIEZ1bmN0aW9uIHNhcENoYW5TZWxJbml0IGFsbG9jYXRlcyB0aGUgbWVtb3J5LCBpbnRpYWxpemVzIHRoZQorICAgICAgICAgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBjaGFubmVsIHNlbGVjdGlvbiBhbGdvcml0aG0KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgICpwU3BlY3RJbmZvUGFyYW1zICA6IFBvaW50ZXIgdG8gdFNhcENoU2VsU3BlY3RJbmZvIHN0cnVjdHVyZQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIHZfQk9PTF90OiAgU3VjY2VzcyBvciBGQUlMCisgIAorICBTSURFIEVGRkVDVFMgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfQk9PTF90IHNhcENoYW5TZWxJbml0KHRIYWxIYW5kbGUgaGFsSGFuZGxlLCB0U2FwQ2hTZWxTcGVjdEluZm8gKnBTcGVjdEluZm9QYXJhbXMpCit7CisgICAgdFNhcFNwZWN0Q2hJbmZvICpwU3BlY3RDaCA9IE5VTEw7CisgICAgdl9VOF90ICpwQ2hhbnMgPSBOVUxMOworICAgIHZfVTE2X3QgY2hhbm5lbG51bSA9IDA7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhhbEhhbmRsZSk7CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAvLyBDaGFubmVscyBmb3IgdGhhdCAyLjRHSHogYmFuZAorICAgIC8vQ29uc2lkZXJlZCBvbmx5IGZvciAyLjRHSHogbmVlZCB0byBjaGFuZ2UgaW4gZnV0dXJlIHRvIHN1cHBvcnQgNUdIeiBzdXBwb3J0CisgICAgcFNwZWN0SW5mb1BhcmFtcy0+bnVtU3BlY3RDaGFucyA9IHBNYWMtPnNjYW4uYmFzZTIwTUh6Q2hhbm5lbHMubnVtQ2hhbm5lbHM7CisgICAgICAgCisgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciB3ZWlnaHQgY29tcHV0YXRpb24gb2YgMi40R0h6CisgICAgcFNwZWN0Q2ggPSAodFNhcFNwZWN0Q2hJbmZvICopdm9zX21lbV9tYWxsb2MoKHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnMpICogc2l6ZW9mKCpwU3BlY3RDaCkpOworCisgICAgaWYocFNwZWN0Q2ggPT0gTlVMTCkgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkluICVzLCBWT1NfTUFMTE9DX0VSUiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlU0FQX0ZBTFNFOworICAgIH0KKworICAgIHZvc19tZW1femVybyhwU3BlY3RDaCwgKHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnMpICogc2l6ZW9mKCpwU3BlY3RDaCkpOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgaW4gdGhlIERmc1BhcmFtcyB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeQorICAgIHBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoID0gcFNwZWN0Q2g7CisKKyAgICBwQ2hhbnMgPSBwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLmNoYW5uZWxMaXN0OworCisgICAgLy8gRmlsbCB0aGUgY2hhbm5lbCBudW1iZXIgaW4gdGhlIHNwZWN0cnVtIGluIHRoZSBvcGVyYXRpbmcgZnJlcSBiYW5kCisgICAgZm9yIChjaGFubmVsbnVtID0gMDsgY2hhbm5lbG51bSA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7IGNoYW5uZWxudW0rKykgeworCisgICAgICAgIGlmKCpwQ2hhbnMgPT0gMTQgKSAvL09GRE0gcmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gY2hhbm5lbCAxNAorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHBTcGVjdENoLT5jaE51bSA9ICpwQ2hhbnM7CisgICAgICAgIHBTcGVjdENoLT52YWxpZCA9IGVTQVBfVFJVRTsKKyAgICAgICAgcFNwZWN0Q2gtPnJzc2lBZ3IgPSBTT0ZUQVBfTUlOX1JTU0k7Ly8gSW5pdGlhbGlzZSBmb3IgYWxsIGNoYW5uZWxzCisgICAgICAgIHBTcGVjdENoKys7CisgICAgICAgIHBDaGFucysrOworICAgIH0KKyAgICByZXR1cm4gZVNBUF9UUlVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIHNhcHdlaWdodFJzc2lDb3VudAorCisgIERFU0NSSVBUSU9OIAorICAgIEZ1bmN0aW9uIHdlaWdodFJzc2lDb3VudCBjYWxjdWxhdGVzIHRoZSBjaGFubmVsIHdlaWdodCBkdWUgdG8gcnNzaQorICAgICAgICAgYW5kIGRhdGEgY291bnQoaGVyZSBudW1iZXIgb2YgQlNTIG9ic2VydmVkKQorICAgICAgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcnNzaSAgICAgICAgOiBNYXggc2lnbmFsIHN0cmVuZ3RoIHJlY2VpZXZlZCBmcm9tIGEgQlNTIGZvciB0aGUgY2hhbm5lbAorICAgIGNvdW50ICAgICAgIDogTnVtYmVyIG9mIEJTUyBvYnNlcnZlZCBpbiB0aGUgY2hhbm5lbAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIHZfVTMyX3QgICAgIDogQ2FsY3VsYXRlZCBjaGFubmVsIHdlaWdodCBiYXNlZCBvbiBhYm92ZSB0d28KKyAgCisgIFNJREUgRUZGRUNUUyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9VMzJfdCBzYXB3ZWlnaHRSc3NpQ291bnQodl9TN190IHJzc2ksIHZfVTE2X3QgY291bnQpCit7CisgICAgdl9TMzFfdCAgICAgcnNzaVdlaWdodD0wOworICAgIHZfUzMxX3QgICAgIGNvdW50V2VpZ2h0PTA7CisgICAgdl9VMzJfdCAgICAgcnNzaWNvdW50V2VpZ2h0PTA7CisgICAgCisgICAgLy8gV2VpZ2h0IGZyb20gUlNTSQorICAgIHJzc2lXZWlnaHQgPSBTT0ZUQVBfUlNTSV9XRUlHSFQgKiAocnNzaSAtIFNPRlRBUF9NSU5fUlNTSSkKKyAgICAgICAgICAgICAgICAgLyhTT0ZUQVBfTUFYX1JTU0kgLSBTT0ZUQVBfTUlOX1JTU0kpOworICAgICAgICAgICAgICAgICAKKyAgICBpZihyc3NpV2VpZ2h0ID4gU09GVEFQX1JTU0lfV0VJR0hUKQorICAgICAgICByc3NpV2VpZ2h0ID0gU09GVEFQX1JTU0lfV0VJR0hUOworICAgIGVsc2UgaWYgKHJzc2lXZWlnaHQgPCAwKQorICAgICAgICByc3NpV2VpZ2h0ID0gMDsKKworICAgIC8vIFdlaWdodCBmcm9tIGRhdGEgY291bnQKKyAgICBjb3VudFdlaWdodCA9IFNPRlRBUF9DT1VOVF9XRUlHSFQgKiAoY291bnQgLSBTT0ZUQVBfTUlOX0NPVU5UKQorICAgICAgICAgICAgICAgICAgLyhTT0ZUQVBfTUFYX0NPVU5UIC0gU09GVEFQX01JTl9DT1VOVCk7CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYoY291bnRXZWlnaHQgPiBTT0ZUQVBfQ09VTlRfV0VJR0hUKQorICAgICAgICBjb3VudFdlaWdodCA9IFNPRlRBUF9DT1VOVF9XRUlHSFQ7CisgICAgZWxzZSBpZiAoY291bnRXZWlnaHQgPCAwKQorICAgICAgICBjb3VudFdlaWdodCA9IDA7CisgICAgICAgIAorICAgIHJzc2ljb3VudFdlaWdodCA9ICByc3NpV2VpZ2h0ICsgY291bnRXZWlnaHQ7ICAgICAgCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIHJzc2lXZWlnaHQ9JWQsIGNvdW50V2VpZ2h0PSVkLCByc3NpY291bnRXZWlnaHQ9JWQiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJzc2lXZWlnaHQsIGNvdW50V2VpZ2h0LCByc3NpY291bnRXZWlnaHQpOworICAgIAorICAgIHJldHVybihyc3NpY291bnRXZWlnaHQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIHNhcENvbXB1dGVTcGVjdFdlaWdodAorCisgIERFU0NSSVBUSU9OIAorICAgIE1haW4gZnVuY3Rpb24gZm9yIGNvbXB1dGluZyB0aGUgd2VpZ2h0IG9mIGVhY2ggY2hhbm5lbCBpbiB0aGUKKyAgICBzcGVjdHJ1bSBiYXNlZCBvbiB0aGUgUlNTSSB2YWx1ZSBvZiB0aGUgQlNTZXMgb24gdGhlIGNoYW5uZWwKKyAgICBhbmQgbnVtYmVyIG9mIEJTUworICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBTcGVjdEluZm9QYXJhbXMgICAgICAgOiBQb2ludGVyIHRvIHRoZSB0U3BlY3RJbmZvUGFyYW1zIHN0cnVjdHVyZQorICAgIGhhbEhhbmRsZSAgICAgICAgICAgICAgOiBQb2ludGVyIHRvIEhBTCBoYW5kbGUKKyAgICBwUmVzdWx0ICAgICAgICAgICAgICAgIDogUG9pbnRlciB0byB0U2NhblJlc3VsdEhhbmRsZQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIHZvaWQgICAgIDogTlVMTAorICAKKyAgU0lERSBFRkZFQ1RTIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIHNhcENvbXB1dGVTcGVjdFdlaWdodCggdFNhcENoU2VsU3BlY3RJbmZvKiBwU3BlY3RJbmZvUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIYWxIYW5kbGUgaGFsSGFuZGxlLCB0U2NhblJlc3VsdEhhbmRsZSBwUmVzdWx0KQoreworICAgIHZfUzdfdCByc3NpID0gMDsKKyAgICB2X1U4X3QgY2huX251bSA9IDA7CisgICAgdl9VOF90IGNoYW5uZWxfaWQgPSAwOworCisgICAgdENzclNjYW5SZXN1bHRJbmZvICpwU2NhblJlc3VsdDsKKyAgICB0U2FwU3BlY3RDaEluZm8gKnBTcGVjdENoICAgPSBwU3BlY3RJbmZvUGFyYW1zLT5wU3BlY3RDaDsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgQ29tcHV0aW5nIHNwZWN0cmFsIHdlaWdodCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAvKioKKyAgICAqIFNvZnQgQVAgc3BlY2lmaWMgY2hhbm5lbCB3ZWlnaHQgY2FsY3VsYXRpb24gdXNpbmcgREZTIGZvcm11bGEKKyAgICAqLworCisgICAgcFNjYW5SZXN1bHQgPSBzbWVfU2NhblJlc3VsdEdldEZpcnN0KGhhbEhhbmRsZSwgcFJlc3VsdCk7ICAgIAorCisgICAgd2hpbGUgKHBTY2FuUmVzdWx0KSB7CisgICAgICAgIHBTcGVjdENoID0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2g7CisgICAgICAgIC8vIFByb2Nlc3NpbmcgZm9yIGVhY2ggdENzclNjYW5SZXN1bHRJbmZvIGluIHRoZSB0Q3NyU2NhblJlc3VsdCBETGluayBsaXN0CisgICAgICAgIGZvciAoY2huX251bSA9IDA7IGNobl9udW0gPCBwU3BlY3RJbmZvUGFyYW1zLT5udW1TcGVjdENoYW5zOyBjaG5fbnVtKyspIHsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICBpZiB0aGUgQmVhY29uIGhhcyBjaGFubmVsIElELCB1c2UgaXQgb3RoZXIgd2lzZSB3ZSB3aWxsIAorICAgICAgICAgICAgICogIHJlbHkgb24gdGhlIGNoYW5uZWxJZFNlbGYKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYocFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkID09IDApCisgICAgICAgICAgICAgICAgY2hhbm5lbF9pZCA9IHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZFNlbGY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2hhbm5lbF9pZCA9IHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZDsKKworICAgICAgICAgICAgaWYgKGNoYW5uZWxfaWQgPT0gcFNwZWN0Q2gtPmNoTnVtKSB7ICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocFNwZWN0Q2gtPnJzc2lBZ3IgPCBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5yc3NpKQorICAgICAgICAgICAgICAgICAgICBwU3BlY3RDaC0+cnNzaUFnciA9IHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLnJzc2k7CisKKyAgICAgICAgICAgICAgICArK3BTcGVjdENoLT5ic3NDb3VudDsgLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvZiBCU1MKKworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiSW4gJXMsIGJzc2Rlcy5jaF9zZWxmPSVkLCBic3NkZXMuY2hfSUQ9JWQsIGJzc2Rlcy5yc3NpPSVkLCBTcGVjdENoLmJzc0NvdW50PSVkLCBwU2NhblJlc3VsdD0weCV4IiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkU2VsZiwgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkLCAKKyAgICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLnJzc2ksIHBTcGVjdENoLT5ic3NDb3VudCwgcFNjYW5SZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICBwU3BlY3RDaCsrOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBwU3BlY3RDaCsrOworICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwU2NhblJlc3VsdCA9IHNtZV9TY2FuUmVzdWx0R2V0TmV4dChoYWxIYW5kbGUsIHBSZXN1bHQpOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aGUgd2VpZ2h0cyBmb3IgYWxsIGNoYW5uZWxzIGluIHRoZSBzcGVjdHJ1bSBwU3BlY3RDaAorICAgIHBTcGVjdENoID0gcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2g7CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgU3BlY3RydW0gQ2hhbm5lbHMgV2VpZ2h0IiwgX19GVU5DVElPTl9fKTsKKworICAgIGZvciAoY2huX251bSA9IDA7IGNobl9udW0gPCAocFNwZWN0SW5mb1BhcmFtcy0+bnVtU3BlY3RDaGFucyk7IGNobl9udW0rKykgeworICAgIAorICAgICAgICAvKgorICAgICAgICAgIHJzc2kgOiBNYXhpbXVtIHJlY2VpdmVkIHNpZ25hbCBzdHJlbmd0aCBhbW9uZyBhbGwgQlNTIG9uIHRoYXQgY2hhbm5lbAorICAgICAgICAgIGJzc0NvdW50IDogTnVtYmVyIG9mIEJTUyBvbiB0aGF0IGNoYW5uZWwKKyAgICAgICAgKi8KKworICAgICAgICByc3NpID0gKHZfUzdfdClwU3BlY3RDaC0+cnNzaUFncjsKKworICAgICAgICBwU3BlY3RDaC0+d2VpZ2h0ID0gU0FQREZTX05PUk1BTElTRV8xMDAwICogc2Fwd2VpZ2h0UnNzaUNvdW50KHJzc2ksIHBTcGVjdENoLT5ic3NDb3VudCk7CisKKyAgICAgICAgLy8tLS0tLS0gRGVidWcgSW5mbyAtLS0tLS0gCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBDaGFuPSVkIFdlaWdodD0gJWQgcnNzaUFncj0lZCBic3NDb3VudD0lZCIsIF9fRlVOQ1RJT05fXywgcFNwZWN0Q2gtPmNoTnVtLAorICAgICAgICAgICAgcFNwZWN0Q2gtPndlaWdodCwgcFNwZWN0Q2gtPnJzc2lBZ3IsIHBTcGVjdENoLT5ic3NDb3VudCk7CisgICAgICAgIC8vLS0tLS0tIERlYnVnIEluZm8gLS0tLS0tIAorICAgICAgICBwU3BlY3RDaCsrOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBzYXBDaGFuU2VsRXhpdAorCisgIERFU0NSSVBUSU9OIAorICAgIEV4aXQgZnVuY3Rpb24gZm9yIGZyZWUgb3V0IHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCB0byBiZSBjYWxsZWQgCisgICAgYXQgdGhlIGVuZCBvZiB0aGUgZGZzU2VsZWN0Q2hhbm5lbCBmdW5jdGlvbgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBTcGVjdEluZm9QYXJhbXMgICAgICAgOiBQb2ludGVyIHRvIHRoZSB0U2FwQ2hTZWxTcGVjdEluZm8gc3RydWN0dXJlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgdm9pZCAgICAgOiBOVUxMCisgIAorICBTSURFIEVGRkVDVFMgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgc2FwQ2hhblNlbEV4aXQoIHRTYXBDaFNlbFNwZWN0SW5mbyAqcFNwZWN0SW5mb1BhcmFtcyApCit7CisgICAgLy8gRnJlZSBhbGwgdGhlIGFsbG9jYXRlZCBtZW1vcnkKKyAgICB2b3NfbWVtX2ZyZWUocFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2gpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIHNhcFNvcnRDaGxXZWlnaHQKKworICBERVNDUklQVElPTiAKKyAgICBGdW50aW9uIHRvIHNvcnQgdGhlIGNoYW5uZWxzIHdpdGggdGhlIGxlYXN0IHdlaWdodCBmaXJzdAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBTcGVjdEluZm9QYXJhbXMgICAgICAgOiBQb2ludGVyIHRvIHRoZSB0U2FwQ2hTZWxTcGVjdEluZm8gc3RydWN0dXJlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgdm9pZCAgICAgOiBOVUxMCisgIAorICBTSURFIEVGRkVDVFMgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgc2FwU29ydENobFdlaWdodCh0U2FwQ2hTZWxTcGVjdEluZm8gKnBTcGVjdEluZm9QYXJhbXMpCit7CisgICAgdFNhcFNwZWN0Q2hJbmZvIHRlbXA7CisKKyAgICB0U2FwU3BlY3RDaEluZm8gKnBTcGVjdENoID0gTlVMTDsKKyAgICB2X1UzMl90IGkgPSAwLCBqID0gMCwgbWluV2VpZ2h0SW5kZXggPSAwOworCisgICAgcFNwZWN0Q2ggPSBwU3BlY3RJbmZvUGFyYW1zLT5wU3BlY3RDaDsKKyNpZmRlZiBTT0ZUQVBfQ0hBTk5FTF9SQU5HRQorICAgIC8vIFNvcnRpbmcgdGhlIGNoYW5uZWxzIGFzIHBlciB3ZWlnaHRzCisgICAgZm9yIChpID0gMDsgaSA8IHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnM7IGkrKykgeworICAgICAgICBtaW5XZWlnaHRJbmRleCA9IGk7CisgICAgICAgIGZvciggaiA9IGkgKyAxOyBqIDwgcFNwZWN0SW5mb1BhcmFtcy0+bnVtU3BlY3RDaGFuczsgaisrKSB7CisgICAgICAgICAgICBpZihwU3BlY3RDaFtqXS53ZWlnaHQgPCBwU3BlY3RDaFttaW5XZWlnaHRJbmRleF0ud2VpZ2h0KSB7CisgICAgICAgICAgICAgICAgbWluV2VpZ2h0SW5kZXggPSBqOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihtaW5XZWlnaHRJbmRleCAhPSBpKSB7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnRlbXAsICZwU3BlY3RDaFttaW5XZWlnaHRJbmRleF0sIHNpemVvZigqcFNwZWN0Q2gpKTsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSgmcFNwZWN0Q2hbbWluV2VpZ2h0SW5kZXhdLCAmcFNwZWN0Q2hbaV0sIHNpemVvZigqcFNwZWN0Q2gpKTsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSgmcFNwZWN0Q2hbaV0sICZ0ZW1wLCBzaXplb2YoKnBTcGVjdENoKSk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIC8vIFNvcnRpbmcgdGhlIGNoYW5uZWxzIGFzIHBlciB3ZWlnaHRzCisgICAgZm9yIChpID0gMDsgaSA8IFNQRUNUXzI0R0haX0NIX0NPVU5UOyBpKyspIHsKKyAgICAgICAgbWluV2VpZ2h0SW5kZXggPSBpOworICAgICAgICBmb3IoIGogPSBpICsgMTsgaiA8IFNQRUNUXzI0R0haX0NIX0NPVU5UOyBqKyspIHsKKyAgICAgICAgICAgIGlmKHBTcGVjdENoW2pdLndlaWdodCA8IHBTcGVjdENoW21pbldlaWdodEluZGV4XS53ZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtaW5XZWlnaHRJbmRleCA9IGo7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKG1pbldlaWdodEluZGV4ICE9IGkpIHsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSgmdGVtcCwgJnBTcGVjdENoW21pbldlaWdodEluZGV4XSwgc2l6ZW9mKCpwU3BlY3RDaCkpOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCZwU3BlY3RDaFttaW5XZWlnaHRJbmRleF0sICZwU3BlY3RDaFtpXSwgc2l6ZW9mKCpwU3BlY3RDaCkpOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCZwU3BlY3RDaFtpXSwgJnRlbXAsIHNpemVvZigqcFNwZWN0Q2gpKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogRm9yIHRlc3RpbmcgKi8KKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgU29ydGVkIFNwZWN0cnVtIENoYW5uZWxzIFdlaWdodCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcFNwZWN0Q2ggPSBwU3BlY3RJbmZvUGFyYW1zLT5wU3BlY3RDaDsKKyAgICBmb3IgKGogPSAwOyBqIDwgKHBTcGVjdEluZm9QYXJhbXMtPm51bVNwZWN0Q2hhbnMpOyBqKyspIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIENoYW5uZWw9JWQgV2VpZ2h0PSAlZCByc3NpPSVkIGJzc0NvdW50PSVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwU3BlY3RDaC0+Y2hOdW0sIHBTcGVjdENoLT53ZWlnaHQsIHBTcGVjdENoLT5yc3NpQWdyLCBwU3BlY3RDaC0+YnNzQ291bnQpOworICAgICAgICBwU3BlY3RDaCsrOworICAgIH0KKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIHNhcFNlbGVjdENoYW5uZWwKKworICBERVNDUklQVElPTiAKKyAgICBSdW5zIGEgYWxnb3JpdGhtIHRvIHNlbGVjdCB0aGUgYmVzdCBjaGFubmVsIHRvIG9wZXJhdGUgaW4gYmFzZWQgb24gQlNTIAorICAgIHJzc2kgYW5kIGJzcyBjb3VudCBvbiBlYWNoIGNoYW5uZWwKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBoYWxIYW5kbGUgICAgICAgOiBQb2ludGVyIHRvIEhBTCBoYW5kbGUKKyAgICBwUmVzdWx0ICAgICAgICAgOiBQb2ludGVyIHRvIHRTY2FuUmVzdWx0SGFuZGxlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgdl9VOF90ICAgICAgICAgIDogU3VjY2VzcyAtIGNoYW5uZWwgbnVtYmVyLCBGYWlsIC0gemVybworICAKKyAgU0lERSBFRkZFQ1RTIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1U4X3Qgc2FwU2VsZWN0Q2hhbm5lbCh0SGFsSGFuZGxlIGhhbEhhbmRsZSwgdFNjYW5SZXN1bHRIYW5kbGUgcFNjYW5SZXN1bHQpCit7CisgICAgLy8gREZTIHBhcmFtIG9iamVjdCBob2xkaW5nIGFsbCB0aGUgZGF0YSByZXEgYnkgdGhlIGFsZ28KKyAgICB0U2FwQ2hTZWxTcGVjdEluZm8gb1NwZWN0SW5mb1BhcmFtcyA9IHtOVUxMLDB9OyAKKyAgICB0U2FwQ2hTZWxTcGVjdEluZm8gKnBTcGVjdEluZm9QYXJhbXMgPSAmb1NwZWN0SW5mb1BhcmFtczsgLy8gTWVtb3J5PyBOQiAgICAKKworICAgIHZfVThfdCBiZXN0Q2hOdW0gPSAwOworI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCisgICAgdl9VMzJfdCBzdGFydENoYW5uZWxOdW07CisgICAgdl9VMzJfdCBlbmRDaGFubmVsTnVtOworICAgIHZfVTMyX3Qgb3BlcmF0aW5nQmFuZDsKKyAgICB2X1U4X3QgIGNvdW50ID0gMDsKKyNlbmRpZiAgICAKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgUnVubmluZyBTQVAgQ2ggU2VsZWN0IiwgX19GVU5DVElPTl9fKTsKKworICAgIC8vIFNldCB0byB6ZXJvIHRTYXBDaFNlbFBhcmFtcworICAgIC8vdm9zX21lbV96ZXJvKCZzYXBDaFNlbFBhcmFtcywgc2l6ZW9mKHNhcENoU2VsUGFyYW1zKSk7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgcG9pbnRlZCBieSBwU3BlY3RJbmZvUGFyYW1zCisgICAgaWYoc2FwQ2hhblNlbEluaXQoIGhhbEhhbmRsZSwgcFNwZWN0SW5mb1BhcmFtcykgIT0gZVNBUF9UUlVFICkgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkluICVzLCBDaCBTZWxlY3QgaW5pdGlhbGl6YXRpb24gZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNBUF9DSEFOTkVMX05PVF9TRUxFQ1RFRDsKKyAgICB9CisKKyAgICAvLyBDb21wdXRlIHRoZSB3ZWlnaHQgb2YgdGhlIGVudGlyZSBzcGVjdHJ1bSBpbiB0aGUgb3BlcmF0aW5nIGJhbmQKKyAgICBzYXBDb21wdXRlU3BlY3RXZWlnaHQoIHBTcGVjdEluZm9QYXJhbXMsIGhhbEhhbmRsZSwgcFNjYW5SZXN1bHQpOworCisgICAgLy8gU29ydCB0aGUgMjBNIGNoYW5uZWwgbGlzdCBhcyBwZXIgdGhlIGNvbXB1dGVkIHdlaWdodHMsIGxlc3NlciB3ZWlnaHQgZmlyc3QuCisgICAgc2FwU29ydENobFdlaWdodChwU3BlY3RJbmZvUGFyYW1zKTsKKworI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCisgICAgY2NtQ2ZnR2V0SW50KCBoYWxIYW5kbGUsIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX1NUQVJUX0NIQU5ORUwsICZzdGFydENoYW5uZWxOdW0pOworICAgIGNjbUNmZ0dldEludCggaGFsSGFuZGxlLCBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTCwgJmVuZENoYW5uZWxOdW0pOworICAgIGNjbUNmZ0dldEludCggaGFsSGFuZGxlLCBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9PUEVSQVRJTkdfQkFORCwgJm9wZXJhdGluZ0JhbmQpOworCisgICAgLypMb29wIHRpbGwgZ2V0IHRoZSBiZXN0IGNoYW5uZWwgaW4gdGhlIGdpdmVuIHJhbmdlICovCisgICAgZm9yKGNvdW50PTA7IGNvdW50IDwgcFNwZWN0SW5mb1BhcmFtcy0+bnVtU3BlY3RDaGFucyA7IGNvdW50KyspCisgICAgeworICAgICAgICBpZigoc3RhcnRDaGFubmVsTnVtIDw9IHBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoW2NvdW50XS5jaE51bSkmJgorICAgICAgICAgICggZW5kQ2hhbm5lbE51bSA+PSBwU3BlY3RJbmZvUGFyYW1zLT5wU3BlY3RDaFtjb3VudF0uY2hOdW0pKQorICAgICAgICB7CisgICAgICAgICAgICBiZXN0Q2hOdW0gPSAodl9VOF90KXBTcGVjdEluZm9QYXJhbXMtPnBTcGVjdENoW2NvdW50XS5jaE51bTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisjZWxzZQorICAgIC8vIEdldCB0aGUgZmlyc3QgY2hhbm5lbCBpbiBzb3J0ZWQgYXJyYXkgYXMgYmVzdCAyME0gQ2hhbm5lbAorICAgIGJlc3RDaE51bSA9ICh2X1U4X3QpcFNwZWN0SW5mb1BhcmFtcy0+cFNwZWN0Q2hbMF0uY2hOdW07CisKKyNlbmRpZgorCisgICAgLy8gRnJlZSBhbGwgdGhlIGFsbG9jYXRlZCBtZW1vcnkKKyAgICBzYXBDaGFuU2VsRXhpdChwU3BlY3RJbmZvUGFyYW1zKTsKKworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBSdW5uaW5nIFNBUCBDaCBzZWxlY3QgQ29tcGxldGVkLCBDaD0lZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiZXN0Q2hOdW0pOworCisgICAgaWYgKGJlc3RDaE51bSA+IDAgJiYgYmVzdENoTnVtIDw9IDI1MikKKyAgICAgICAgcmV0dXJuIGJlc3RDaE51bTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBTQVBfQ0hBTk5FTF9OT1RfU0VMRUNURUQ7Cit9CisKZGlmZiAtLWdpdCBhL0NPUkUvU0FQL3NyYy9zYXBDaFNlbGVjdC5oIGIvQ09SRS9TQVAvc3JjL3NhcENoU2VsZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwYWQ3NQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU0FQL3NyYy9zYXBDaFNlbGVjdC5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1NBUF9DSF9TRUxFQ1RfSCApCisjZGVmaW5lIF9fU0FQX0NIX1NFTEVDVF9ICisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgcyBhIHAgQyBoIFMgZSBsIGUgYyB0IC4gaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgT1ZFUlZJRVc6CisgIAorICBUaGlzIHNvZnR3YXJlIHVuaXQgaG9sZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXTEFOIFNBUCBtb2R1bGVzCisgIGZ1bmN0aW9ucyBmb3IgY2hhbm5lbCBzZWxlY3Rpb24uCisKKyAgREVQRU5ERU5DSUVTOiAgIAorICAKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4gCisgIAorICAKKyAgQ29weXJpZ2h0IChjKSAyMDEwIFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworCisgIHdoZW4gICAgICAgICAgICAgd2hvICAgICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tLS0gICAgICAgLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwMTAtMDMtMTUgICAgICAgIFNvZnRBUCAgICBDcmVhdGVkIG1vZHVsZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZGVmaW5lcyBhbmQgZW51bQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFNQRUNUXzI0R0haX0NIX0NPVU5UICAgICgxMSkgLy8gVVNBIHJlZ3VsYXRvcnkgZG9tYWluCisjZGVmaW5lIFNBUERGU19OT1JNQUxJU0VfMTAwMCAgICAgICgxMDAwLzkpIC8vIENhc2Ugb2Ygc3BlYzIwIHdpdGggY2hhbm5lbCBkaWZmID0gMAorLyogR2VuIDUgdmFsdWVzCisjZGVmaW5lIFNPRlRBUF9NSU5fUlNTSSAgICAgICAgICgtODUpCisjZGVmaW5lIFNPRlRBUF9NQVhfUlNTSSAgICAgICAgICgtNDUpCisqLworI2RlZmluZSBTT0ZUQVBfTUlOX1JTU0kgICAgICAgICAoLTEwMCkKKyNkZWZpbmUgU09GVEFQX01BWF9SU1NJICAgICAgICAgKDApCisjZGVmaW5lIFNPRlRBUF9NSU5fQ09VTlQgICAgICAgICgwKQorI2RlZmluZSBTT0ZUQVBfTUFYX0NPVU5UICAgICAgICAoNjApCisjZGVmaW5lIFNPRlRBUF9SU1NJX1dFSUdIVCAgICAgICgyMCkKKyNkZWZpbmUgU09GVEFQX0NPVU5UX1dFSUdIVCAgICAgKDIwKQorCisjZGVmaW5lIFNBUF9ERUZBVUxUX0NIQU5ORUwgICAgICg2KQorI2RlZmluZSBTQVBfREVGQVVMVF81R0haX0NIQU5ORUwgICAgICAoNDApCisjZGVmaW5lIFNBUF9DSEFOTkVMX05PVF9TRUxFQ1RFRCAoMCkKKy8qKgorKiBTdHJ1Y3R1cmUgaG9sZGluZyBpbmZvcm1hdGlvbiBvZiBlYWNoIGNoYW5uZWwgaW4gdGhlIHNwZWN0cnVtLCAKKyogaXQgY29udGFpbnMgdGhlIGNoYW5uZWwgbnVtYmVyLCB0aGUgY29tcHV0ZWQgd2VpZ2h0CisqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZfVTE2X3QgY2hOdW07ICAgICAgLy8gQ2hhbm5lbCBOdW1iZXIKKyAgICB2X1UxNl90IGJzc0NvdW50OyAgIC8vIGJzcyBmb3VuZCBpbiBzY2FucmVzdWx0IGZvciB0aGlzIGNoYW5uZWwKKyAgICB2X1MzMV90IHJzc2lBZ3I7ICAgIC8vIE1heCB2YWx1ZSBvZiByc3NpIGFtb25nIGFsbCBCU1MoZXMpIGZyb20gc2NhbnJlc3VsdCBmb3IgdGhpcyBjaGFubmVsCisgICAgdl9VMzJfdCB3ZWlnaHQ7ICAgICAvLyBXZWlnaHRhZ2Ugb2YgdGhpcyBjaGFubmVsCisgICAgdl9CT09MX3QgdmFsaWQ7ICAgICAvLyBJcyB0aGlzIGEgdmFsaWQgY2VudGVyIGZyZXF1ZW5jeSBmb3IgcmVndWxhdG9yeSBkb21haW4KK30gdFNhcFNwZWN0Q2hJbmZvOy8vdERmc1NwZWN0Q2hJbmZvOworCisvKioKKyogU3RydWN0dXJlIGhvbGRpbmcgYWxsIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBtYWtlIGEgCisqIGRlY2lzaW9uIGZvciB0aGUgYmVzdCBvcGVyYXRpbmcgY2hhbm5lbCBiYXNlZCBvbiBkZnMgZm9ybXVsYQorKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB0U2FwU3BlY3RDaEluZm8gKnBTcGVjdENoOy8vdERmc1NwZWN0Q2hJbmZvICpwU3BlY3RDaDsgIC8vIFB0ciB0byB0aGUgY2hhbm5lbHMgaW4gdGhlIGVudGlyZSBzcGVjdHJ1bSBiYW5kCisgICAgdl9VOF90IG51bVNwZWN0Q2hhbnM7ICAgICAgLy8gVG90YWwgbnVtIG9mIGNoYW5uZWxzIGluIHRoZSBzcGVjdHJ1bQorfSB0U2FwQ2hTZWxTcGVjdEluZm87Ly90RGZzQ2hTZWxQYXJhbXM7CisKKy8qKgorICogU3RydWN0dXJlIGZvciBjaGFubmVsIHdlaWdodCBjYWxjdWxhdGlvbiBwYXJhbWV0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IHNTYXBDaFNlbFBhcmFtcyB7CisgICAgdm9pZCAqcFNwZWN0SW5mb1BhcmFtczsvLypwRGZzUGFyYW1zOyAgIC8vIEZpbGxlZCB3aXRoIHRTYXBDaFNlbFNwZWN0SW5mbworICAgIHZfVTE2X3QgbnVtQ2hhbm5lbHM7Cit9IHRTYXBDaFNlbFBhcmFtczsKKworI2VuZGlmIC8vIGlmICFkZWZpbmVkIF9fU0FQX0NIX1NFTEVDVF9ICisKZGlmZiAtLWdpdCBhL0NPUkUvU0FQL3NyYy9zYXBGc20uYyBiL0NPUkUvU0FQL3NyYy9zYXBGc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2FmY2NiCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TQVAvc3JjL3NhcEZzbS5jCkBAIC0wLDAgKzEsMTM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBzIGEgcCBGIHMgbSAuIEMKKworICBPVkVSVklFVzoKKworICBUaGlzIHNvZnR3YXJlIHVuaXQgaG9sZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXTEFOIFNBUCBGaW5pdGUKKyAgU3RhdGUgTWFjaGluZSBtb2R1bGVzICAKKworICBERVBFTkRFTkNJRVM6IAorCisgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LiAKKworICAKKyAgQ29weXJpZ2h0IChjKSAyMDEwIFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworCisgIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwMTAtMDMtMTUgICAgICAgICBDcmVhdGVkIG1vZHVsZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic2FwSW50ZXJuYWwuaCIKKy8vIFBpY2sgdXAgdGhlIFNNRSBBUEkgZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJzbWVfQXBpLmgiCisvLyBQaWNrIHVwIHRoZSBQTUMgQVBJIGRlZmluaXRpb25zCisjaW5jbHVkZSAicG1jQXBpLmgiCisjaW5jbHVkZSAid2xhbl9udi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBFeHRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIGdsb2JhbCBjb250ZXh0IAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIFZhcmlhYmxlIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKK3N0YXRpYyBWT1NfU1RBVFVTIHNhcEdldENoYW5uZWxMaXN0KHB0U2FwQ29udGV4dCBzYXBDb250ZXh0LCB2X1U4X3QgKipjaGFubmVsTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgICpudW1iZXJPZkNoYW5uZWxzKTsKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbGl6ZWQgRnVuY3Rpb24gRGVmaW5pdGlvbnMKKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEb2N1bWVudGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBzYXBFdmVudEluaXQKKworICBERVNDUklQVElPTiAKKyAgICBGdW5jdGlvbiBmb3IgaW5pdGlhbGl6aW5nIHNXTEFOX1NBUEV2ZW50IHN0cnVjdHVyZQorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgc2FwRXZlbnQgICAgOiBTdGF0ZSBtYWNoaW5lIGV2ZW50CisgICAKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBOb25lCisgIAorICBTSURFIEVGRkVDVFMgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXBFdmVudEluaXQocHRXTEFOX1NBUEV2ZW50IHNhcEV2ZW50KQoreworICAgc2FwRXZlbnQtPmV2ZW50ID0gZVNBUF9NQUNfU0NBTl9DT01QTEVURTsKKyAgIHNhcEV2ZW50LT5wYXJhbXMgPSAwOworICAgc2FwRXZlbnQtPnUxID0gMDsKKyAgIHNhcEV2ZW50LT51MiA9IDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgc2FwR290b0NoYW5uZWxTZWwKKworICBERVNDUklQVElPTiAKKyAgICBGdW5jdGlvbiBmb3IgaW5pdGlhdGluZyBzY2FuIHJlcXVlc3QgZm9yIFNNRSAKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHNhcENvbnRleHQgIDogU2FwIENvbnRleHQgdmFsdWUKKyAgICBzYXBFdmVudCAgICA6IFN0YXRlIG1hY2hpbmUgZXZlbnQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitzYXBHb3RvQ2hhbm5lbFNlbAorKAorICAgIHB0U2FwQ29udGV4dCBzYXBDb250ZXh0LAorICAgIHB0V0xBTl9TQVBFdmVudCBzYXBFdmVudAorKQoreworICAgIC8qIEluaXRpYXRlIGEgU0NBTiByZXF1ZXN0ICovCisgICAgZVNhcFN0YXR1cyBzYXBTdGF0dXMgPSBlU0FQX1NUQVRVU19TVUNDRVNTOworICAgIHRDc3JTY2FuUmVxdWVzdCBzY2FuUmVxdWVzdDsvKiBUbyBiZSBpbml0aWFsaXNlZCBpZiBzY2FuIGlzIHJlcXVpcmVkICovCisgICAgdl9VMzJfdCAgICBzY2FuUmVxdWVzdElEID0gMDsKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCisgICAgdl9VOF90ICAgICAqY2hhbm5lbExpc3QgPSBOVUxMOworICAgIHZfVThfdCAgICAgbnVtT2ZDaGFubmVscyA9IDAgOworI2VuZGlmCisgICAgdEhhbEhhbmRsZSBoSGFsOworICAgIHRBTklfVTggICBjaGFubmVsOworCisgICAgaEhhbCA9ICh0SGFsSGFuZGxlKXZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9TTUUsIHNhcENvbnRleHQtPnB2b3NHQ3R4KTsKKyAgICBpZiAoTlVMTCA9PSBoSGFsKQorICAgIHsKKyAgICAgICAgLyogd2UgaGF2ZSBhIHNlcmlvdXMgcHJvYmxlbSAqLworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgIkluICVzLCBpbnZhbGlkIGhIYWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qSWYgU1RBLUFQIGNvbmN1cnJlbmN5IGlzIGVuYWJsZWQgdGFrZSB0aGUgY29uY3VycmVudCBjb25uZWN0ZWQgY2hhbm5lbCBmaXJzdC4gSW4gb3RoZXIgY2FzZXMgd3BhX3N1cHBsaWNhbnQgc2hvdWxkIHRha2UgY2FyZSAqLworICAgIGlmICh2b3NfZ2V0X2NvbmN1cnJlbmN5X21vZGUoKSA9PSBWT1NfU1RBX1NBUCkKKyAgICB7CisgICAgICAgIGNoYW5uZWwgPSBzbWVfR2V0Q29uY3VycmVudE9wZXJhdGlvbkNoYW5uZWwoaEhhbCk7CisKKyAgICAgICAgaWYgKGNoYW5uZWwpCisgICAgICAgIHsgLyppZiBhIHZhbGlkIGNoYW5uZWwgaXMgcmV0dXJuZWQgdGhlbiB1c2UgY29uY3VycmVudCBjaGFubmVsLiAKKyAgICAgICAgICAgICAgICAgIEVsc2UgdGFrZSB3aGF0ZXZlciBjb21lcyBmcm9tIGNvbmZpZ3VhcnRpb24qLworICAgICAgICAgICAgc2FwQ29udGV4dC0+Y2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKHNhcENvbnRleHQtPmNoYW5uZWwgPT0gQVVUT19DSEFOTkVMX1NFTEVDVCkgCisgICAgeworICAgICAgICB2b3NfbWVtX3plcm8oJnNjYW5SZXF1ZXN0LCBzaXplb2Yoc2NhblJlcXVlc3QpKTsKKworICAgICAgICAvKiBTZXQgc2NhblR5cGUgdG8gUGFzc2l2ZSBzY2FuICovCisgICAgICAgIHNjYW5SZXF1ZXN0LnNjYW5UeXBlID0gZVNJUl9QQVNTSVZFX1NDQU47CisKKyAgICAgICAgLyogU2V0IG1pbiBhbmQgbWF4IGNoYW5uZWwgdGltZSB0byB6ZXJvICovCisgICAgICAgIHNjYW5SZXF1ZXN0Lm1pbkNoblRpbWUgPSAwOworICAgICAgICBzY2FuUmVxdWVzdC5tYXhDaG5UaW1lID0gMDsKKworICAgICAgICAvKiBTZXQgQlNTVHlwZSB0byBkZWZhdWx0IHR5cGUgKi8KKyAgICAgICAgc2NhblJlcXVlc3QuQlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworICAgICAgICAKKyNpZm5kZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UgICAgICAgIAorICAgICAgICAvKlNjYW4gYWxsIHRoZSBjaGFubmVscyAqLworICAgICAgICBzY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKworICAgICAgICBzY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisKKyAgICAgICAgc2NhblJlcXVlc3QucmVxdWVzdFR5cGUgPSBlQ1NSX1NDQU5fUkVRVUVTVF9GVUxMX1NDQU47Ly9lQ1NSX1NDQU5fUkVRVUVTVF8xMURfU0NBTjsKKworI2Vsc2UKKworICAgICAgICBzYXBHZXRDaGFubmVsTGlzdChzYXBDb250ZXh0LCAmY2hhbm5lbExpc3QsICZudW1PZkNoYW5uZWxzKTsKKworICAgICAgICAvKlNjYW4gdGhlIGNoYW5uZWxzIGluIHRoZSBsaXN0Ki8KKyAgICAgICAgc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IG51bU9mQ2hhbm5lbHM7CisgICAgICAgIAorICAgICAgICBzY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IGNoYW5uZWxMaXN0OworCisgICAgICAgIHNjYW5SZXF1ZXN0LnJlcXVlc3RUeXBlID0gZUNTUl9TQ0FOX1NPRlRBUF9DSEFOTkVMX1JBTkdFOworCisgICAgICAgIHNhcENvbnRleHQtPmNoYW5uZWxMaXN0ID0gY2hhbm5lbExpc3Q7CisgICAgICAgIAorI2VuZGlmCisgICAgICAgIC8qIFNldCByZXF1ZXN0VHlwZSB0byBGdWxsIHNjYW4gKi8KKworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGNhbGxpbmcgc21lX1NjYW5SZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICBzYXBTdGF0dXMgPSBzbWVfU2NhblJlcXVlc3QoaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLC8vTm90IHVzZWQgaW4gY3NyU2NhblJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhblJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYW5SZXF1ZXN0SUQsLy8sIHdoZW4gSUQgPT0gMCAxMUQgc2Nhbi9hY3RpdmUgc2NhbiB3aXRoIGNhbGxiYWNrLCBtaW4tbWF4Q2hudGltZSBzZXQgaW4gY3NyU2NhblJlcXVlc3QoKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV0xBTlNBUF9TY2FuQ2FsbGJhY2ssLy9jc3JTY2FuQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXBDb250ZXh0KTsvL3ZvaWQgKiBwQ29udGV4dCBzY2FuUmVxdWVzdElEIGZpbGxlZCB1cAorICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzYXBTdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOnNtZV9TY2FuUmVxdWVzdCAgZmFpbCAlZCEhISIsIF9fRlVOQ1RJT05fXywgc2FwU3RhdHVzKTsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJTb2Z0QVAgQ29uZmlndXJpbmcgZm9yIGRlZmF1bHQgY2hhbm5lbCwgQ2g9ICVkIiwgc2FwQ29udGV4dC0+Y2hhbm5lbCk7CisgICAgICAgICAgICAvKiBJbiBjYXNlIG9mIGVycm9yLCBzd2l0Y2ggdG8gZGVmYXVsdCBjaGFubmVsICovCisgICAgICAgICAgICBzYXBDb250ZXh0LT5jaGFubmVsID0gU0FQX0RFRkFVTFRfQ0hBTk5FTDsKKworI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCisgICAgICAgICAgICBpZihzYXBDb250ZXh0LT5jaGFubmVsTGlzdCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNhcENvbnRleHQtPmNoYW5uZWwgPSBzYXBDb250ZXh0LT5jaGFubmVsTGlzdFswXTsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUoc2FwQ29udGV4dC0+Y2hhbm5lbExpc3QpOworICAgICAgICAgICAgICAgIHNhcENvbnRleHQtPmNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlICovCisgICAgICAgICAgICBzYXBFdmVudEluaXQoc2FwRXZlbnQpOworICAgICAgICAgICAgLyogSGFuZGxlIGV2ZW50ICovCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzYXBGc20oc2FwQ29udGV4dCwgc2FwRXZlbnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCByZXR1cm4gZnJvbSBzbWVfU2NhblJlcXVlc3QsIHNjYW5SZXF1ZXN0SUQ9JWQsIENoPSAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzY2FuUmVxdWVzdElELCBzYXBDb250ZXh0LT5jaGFubmVsKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZvciBjb25maWd1cmVkIGNoYW5uZWwsIENoPSAlZCIsIF9fRlVOQ1RJT05fXywgc2FwQ29udGV4dC0+Y2hhbm5lbCk7CisgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSAqLworICAgICAgICAvLyBFdmVudGhvdWdoIHNjYW4gd2FzIG5vdCBkb25lLCBtZWFucyBhIHVzZXIgc2V0IGNoYW5uZWwgd2FzIGNob3NlbgorICAgICAgICBzYXBFdmVudEluaXQoc2FwRXZlbnQpOworICAgICAgICAvKiBIYW5kbGUgZXZlbnQgKi8KKyAgICAgICAgdm9zU3RhdHVzID0gc2FwRnNtKHNhcENvbnRleHQsIHNhcEV2ZW50KTsKKyAgICB9CisKKyAgICAvKiBJZiBzY2FuIGZhaWxlZCwgZ2V0IGRlZmF1bHQgY2hhbm5lbCBhbmQgYWR2YW5jZSBzdGF0ZSBtYWNoaW5lIGFzIHN1Y2Nlc3Mgd2l0aCBkZWZhdWx0IGNoYW5uZWwgKi8KKyAgICAvKiBIYXZlIHRvIHdhaXQgZm9yIHRoZSBjYWxsIGJhY2sgdG8gYmUgY2FsbGVkIHRvIGdldCB0aGUgY2hhbm5lbCBjYW5ub3QgYWR2YW5jZSBzdGF0ZSBtYWNoaW5lIGhlcmUgYXMgc2FpZCBhYm92ZSAqLworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgYmVmb3JlIGV4aXRpbmcgc2FwR290b0NoYW5uZWxTZWwgY2hhbm5lbD0lZCIsIF9fRlVOQ1RJT05fXywgc2FwQ29udGV4dC0+Y2hhbm5lbCk7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8vIHNhcEdvdG9DaGFubmVsU2VsCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgc2FwR290b1N0YXJ0aW5nCisKKyAgREVTQ1JJUFRJT04gCisgICAgRnVuY3Rpb24gZm9yIGluaXRpYXRpbmcgc3RhcnQgYnNzIHJlcXVlc3QgZm9yIFNNRQorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgc2FwQ29udGV4dCAgOiBTYXAgQ29udGV4dCB2YWx1ZQorICAgIHNhcEV2ZW50ICAgIDogU3RhdGUgbWFjaGluZSBldmVudAorICAgIGJzc1R5cGUgICAgIDogVHlwZSBvZiBic3MgdG8gc3RhcnQsIElOUkEgQVAKKyAgICBzdGF0dXMgICAgICA6IFJldHVybiB0aGUgU0FQIHN0YXR1cyBoZXJlCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworc2FwR290b1N0YXJ0aW5nCisoIAorICAgIHB0U2FwQ29udGV4dCBzYXBDb250ZXh0LAorICAgIHB0V0xBTl9TQVBFdmVudCBzYXBFdmVudCwKKyAgICBlQ3NyUm9hbUJzc1R5cGUgYnNzVHlwZQorKQoreworICAgIC8qIHRIYWxIYW5kbGUgKi8gICAgCisgICAgdEhhbEhhbmRsZSBoSGFsID0gVk9TX0dFVF9IQUxfQ0Ioc2FwQ29udGV4dC0+cHZvc0dDdHgpOworICAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzOworICAgIAorICAgIC8qLSAtIC0gLSAtIC0gLSAtIFRPRE86b25jZSBjb25maWdzIGZyb20gaGRkIGF2YWlsYWJsZSAtIC0gLSAtIC0gLSAtIC0gLSovCisgICAgY2hhciBrZXlfbWF0ZXJpYWxbMzJdPXsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSx9OyAKKyAgICBzYXBDb250ZXh0LT5rZXlfdHlwZSA9IDB4MDU7CisgICAgc2FwQ29udGV4dC0+a2V5X2xlbmd0aCA9IDMyOworICAgIHZvc19tZW1fY29weShzYXBDb250ZXh0LT5rZXlfbWF0ZXJpYWwsIGtleV9tYXRlcmlhbCwgc2l6ZW9mKGtleV9tYXRlcmlhbCkpOyAgLyogTmVlZCBhIGtleSBzaXplIGRlZmluZSAqLworICAgIAorICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgaWYgKE5VTEwgPT0gaEhhbCkKKyAgICB7CisgICAgICAgIC8qIHdlIGhhdmUgYSBzZXJpb3VzIHByb2JsZW0gKi8KKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICJJbiAlcywgaW52YWxpZCBoSGFsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvL1RPRE86IFdoYXQgc2hhbGwgd2UgZG8gaWYgZmFpbHVyZT8/Pz8KKyAgICBoYWxTdGF0dXMgPSBwbWNSZXF1ZXN0RnVsbFBvd2VyKCBoSGFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOU0FQX3BtY0Z1bGxQd3JSZXFDQiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU01FX1JFQVNPTl9PVEhFUik7CisKKyAgICAvKiBPcGVuIFNNRSBTZXNzaW9uIGZvciBTb2Z0YXAgKi8KKyAgICBoYWxTdGF0dXMgPSBzbWVfT3BlblNlc3Npb24oaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZXTEFOU0FQX1JvYW1DYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICBzYXBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2FwQ29udGV4dC0+c2VsZl9tYWNfYWRkciwgIAorICAgICAgICAgICAgICAgICAgICAgICAgJnNhcENvbnRleHQtPnNlc3Npb25JZCk7CisKKyAgICBpZihlSEFMX1NUQVRVU19TVUNDRVNTICE9IGhhbFN0YXR1cyApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogSW4gJXMgY2FsbGluZyBzbWVfUm9hbUNvbm5lY3Qgc3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIGhhbFN0YXR1cyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8vIHNhcEdvdG9TdGFydGluZworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIHNhcEdvdG9EaXNjb25uZWN0aW5nCisKKyAgREVTQ1JJUFRJT04gCisgICAgUHJvY2Vzc2luZyBvZiBTQVAgRlNNIERpc2Nvbm5lY3Rpbmcgc3RhdGUKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHNhcENvbnRleHQgIDogU2FwIENvbnRleHQgdmFsdWUKKyAgICBzdGF0dXMgICAgICA6IFJldHVybiB0aGUgU0FQIHN0YXR1cyBoZXJlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworc2FwR290b0Rpc2Nvbm5lY3RpbmcKKygKKyAgICBwdFNhcENvbnRleHQgc2FwQ29udGV4dAorKQoreworICAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzOworICAgIHRIYWxIYW5kbGUgaEhhbDsKKworICAgIGhIYWwgPSBWT1NfR0VUX0hBTF9DQihzYXBDb250ZXh0LT5wdm9zR0N0eCk7CisgICAgaWYgKE5VTEwgPT0gaEhhbCkKKyAgICB7CisgICAgICAgIC8qIHdlIGhhdmUgYSBzZXJpb3VzIHByb2JsZW0gKi8KKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbiAlcywgaW52YWxpZCBoSGFsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICBzYXBGcmVlUm9hbVByb2ZpbGUoJnNhcENvbnRleHQtPmNzclJvYW1Qcm9maWxlKTsKKyAgICBoYWxTdGF0dXMgPSBzbWVfUm9hbVN0b3BCc3MoaEhhbCwgc2FwQ29udGV4dC0+c2Vzc2lvbklkKTsKKyAgICBpZihlSEFMX1NUQVRVU19TVUNDRVNTICE9IGhhbFN0YXR1cyApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogSW4gJXMgY2FsbGluZyBzbWVfUm9hbVN0b3BCc3Mgc3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIGhhbFN0YXR1cyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgZUhhbFN0YXR1cyBzYXBSb2FtU2Vzc2lvbkNsb3NlQ2FsbGJhY2sodm9pZCAqcENvbnRleHQpCit7CisgICAgcHRTYXBDb250ZXh0IHNhcENvbnRleHQgPSAocHRTYXBDb250ZXh0KXBDb250ZXh0OworICAgIHJldHVybiBzYXBTaWduYWxIRERldmVudChzYXBDb250ZXh0LCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgZVNBUF9TVE9QX0JTU19FVkVOVCwgKHZfUFZPSURfdCkgZVNBUF9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgc2FwR290b0Rpc2Nvbm5lY3RlZAorCisgIERFU0NSSVBUSU9OIAorICAgIEZ1bmN0aW9uIGZvciBzZXR0aW5nIHRoZSBTQVAgRlNNIHRvIERpc2Nvbm5lY3Rpb24gc3RhdGUKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHNhcENvbnRleHQgIDogU2FwIENvbnRleHQgdmFsdWUKKyAgICBzYXBFdmVudCAgICA6IFN0YXRlIG1hY2hpbmUgZXZlbnQKKyAgICBzdGF0dXMgICAgICA6IFJldHVybiB0aGUgU0FQIHN0YXR1cyBoZXJlCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworc2FwR290b0Rpc2Nvbm5lY3RlZAorKAorICAgIHB0U2FwQ29udGV4dCBzYXBDb250ZXh0CispCit7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB0V0xBTl9TQVBFdmVudCBzYXBFdmVudDsKKyAgICAvLyBQcm9jZXNzaW5nIGhhcyB0byBiZSBjb2RlZAorICAgIC8vIENsZWFuIHVwIHN0YXRpb25zIGZyb20gVEwgZXRjIGFzIEFQIEJTUyBpcyBzaHV0IGRvd24gdGhlbiBzZXQgZXZlbnQKKyAgICBzYXBFdmVudC5ldmVudCA9IGVTQVBfTUFDX1JFQURZX0ZPUl9DT05ORUNUSU9OUzsvLyBoYXJkY29kZWQKKyAgICBzYXBFdmVudC5wYXJhbXMgPSAwOworICAgIHNhcEV2ZW50LnUxID0gMDsKKyAgICBzYXBFdmVudC51MiA9IDA7CisgICAgLyogSGFuZGxlIGV2ZW50ICovCisgICAgdm9zU3RhdHVzID0gc2FwRnNtKHNhcENvbnRleHQsICZzYXBFdmVudCk7CisgICAgICAgICAgICAKKyAgICByZXR1cm4gdm9zU3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIHNhcFNpZ25hbEhERGV2ZW50CisKKyAgREVTQ1JJUFRJT04gCisgICAgRnVuY3Rpb24gZm9yIEhERCB0byBzZW5kIHRoZSBldmVudCBub3RpZmljYXRpb24gdXNpbmcgY2FsbGJhY2sKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHNhcENvbnRleHQgIDogU2FwIENvbnRleHQgdmFsdWUKKyAgICBwQ3NyUm9hbUluZm8gOiBQb2ludGVyIHRvIENTUiByb2FtIGluZm9ybWF0aW9uCisgICAgc2FwSGRkZXZlbnQgICAgICA6IFNBUCBIREQgZXZlbnQKKyAgICBjb250ZXh0ICAgICAgICAgIDogdG8gcGFzcyB0aGUgZWxlbWVudCBmb3IgZnV0dXJlIHN1cHBvcnQgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworc2FwU2lnbmFsSEREZXZlbnQgCisoIAorICAgIHB0U2FwQ29udGV4dCBzYXBDb250ZXh0LCAvKiBzYXBDb250ZXh0IHZhbHVlICovCisgICAgdENzclJvYW1JbmZvICpwQ3NyUm9hbUluZm8sCisgICAgZVNhcEhkZEV2ZW50IHNhcEhkZGV2ZW50LAorICAgIHZvaWQgICAgICAgICAqY29udGV4dAorKQoreworICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0U2FwX0V2ZW50IHNhcEFwQXBwRXZlbnQ7IC8qIFRoaXMgbm93IGVuY29kZXMgQUxMIGV2ZW50IHR5cGVzICovCisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICAvKiBGb3JtYXQgdGhlIFN0YXJ0IEJTUyBDb21wbGV0ZSBldmVudCB0byByZXR1cm4uLi4gKi8KKyAgICBWT1NfQVNTRVJUKHNhcENvbnRleHQtPnBmblNhcEV2ZW50Q2FsbGJhY2spOworCisgICAgc3dpdGNoIChzYXBIZGRldmVudCkKKyAgICB7CisgICAgICAgIGNhc2UgZVNBUF9TVEFfQVNTT0NfSU5EOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiVE9ETzogSW5kaWNhdGUgdGhlIGFzc29jIHJlcXVlc3QgaW5kaWNhdGlvbiB0byBPU1xuIik7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfU1RBX0FTU09DX0lORDsKKworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCAmc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwQXNzb2NJbmRpY2F0aW9uLnN0YU1hYywgcENzclJvYW1JbmZvLT5wZWVyTWFjLHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwQXNzb2NJbmRpY2F0aW9uLnN0YUlkID0gcENzclJvYW1JbmZvLT5zdGFJZDsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcEFzc29jSW5kaWNhdGlvbi5zdGF0dXMgPSAwOworICAgICAgICAgICAgLy8gUmVxdWlyZWQgZm9yIGluZGljYXRpbmcgdGhlIGZyYW1lcyB0byB1cHBlciBsYXllcgorICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwQXNzb2NJbmRpY2F0aW9uLmJlYWNvbkxlbmd0aCA9IHBDc3JSb2FtSW5mby0+YmVhY29uTGVuZ3RoOworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwQXNzb2NJbmRpY2F0aW9uLmJlYWNvblB0ciA9IHBDc3JSb2FtSW5mby0+YmVhY29uUHRyOworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwQXNzb2NJbmRpY2F0aW9uLmFzc29jUmVxTGVuZ3RoID0gcENzclJvYW1JbmZvLT5hc3NvY1JlcUxlbmd0aDsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcEFzc29jSW5kaWNhdGlvbi5hc3NvY1JlcVB0ciA9IHBDc3JSb2FtSW5mby0+YXNzb2NSZXFQdHI7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBBc3NvY0luZGljYXRpb24uZldtbUVuYWJsZWQgPSBwQ3NyUm9hbUluZm8tPndtbUVuYWJsZWRTdGE7CisgICAgICAgICAgICBpZiAoIHBDc3JSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZSAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcEFzc29jSW5kaWNhdGlvbi5uZWdvdGlhdGVkQXV0aFR5cGUgPSBwQ3NyUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPkF1dGhUeXBlOworICAgICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwQXNzb2NJbmRpY2F0aW9uLm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlID0gcENzclJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5FbmNyeXB0aW9uVHlwZTsKKyAgICAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcEFzc29jSW5kaWNhdGlvbi5uZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZSA9IHBDc3JSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZTsKKyAgICAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcEFzc29jSW5kaWNhdGlvbi5mQXV0aFJlcXVpcmVkID0gcENzclJvYW1JbmZvLT5mQXV0aFJlcXVpcmVkOworICAgICAgICAgICAgfSAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIGVTQVBfU1RBUlRfQlNTX0VWRU5UOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBTQVAgZXZlbnQgY2FsbGJhY2sgZXZlbnQgPSAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9TVEFSVF9CU1NfRVZFTlQiKTsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9TVEFSVF9CU1NfRVZFTlQ7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBTdGFydEJzc0NvbXBsZXRlRXZlbnQuc3RhdHVzID0gKGVTYXBTdGF0dXMgKWNvbnRleHQ7CisgICAgICAgICAgICBpZihwQ3NyUm9hbUluZm8gIT0gTlVMTCApeworICAgICAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcFN0YXJ0QnNzQ29tcGxldGVFdmVudC5zdGFJZCA9IHBDc3JSb2FtSW5mby0+c3RhSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhcnRCc3NDb21wbGV0ZUV2ZW50LnN0YUlkID0gMDsgICAgICAgICAgICAgIAorICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhcnRCc3NDb21wbGV0ZUV2ZW50Lm9wZXJhdGluZ0NoYW5uZWwgPSAodl9VOF90KXNhcENvbnRleHQtPmNoYW5uZWw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTQVBfU1RPUF9CU1NfRVZFTlQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIFNBUCBldmVudCBjYWxsYmFjayBldmVudCA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9TVE9QX0JTU19FVkVOVCIpOworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX1NUT1BfQlNTX0VWRU5UOworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RvcEJzc0NvbXBsZXRlRXZlbnQuc3RhdHVzID0gKGVTYXBTdGF0dXMgKWNvbnRleHQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTQVBfU1RBX0FTU09DX0VWRU5UOgorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIFNBUCBldmVudCBjYWxsYmFjayBldmVudCA9ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX1NUQV9BU1NPQ19FVkVOVCIpOworICAgICAgICAgICAgaWYgKHBDc3JSb2FtSW5mby0+ZlJlYXNzb2NSZXEpCisgICAgICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX1NUQV9SRUFTU09DX0VWRU5UOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9TVEFfQVNTT0NfRVZFTlQ7CisKKyAgICAgICAgICAgIC8vVE9ETzogTmVlZCB0byBmaWxsIHRoZSBTRVQgS0VZIGluZm9ybWF0aW9uIGFuZCBwYXNzIHRvIEhERAorICAgICAgICAgICAgdm9zX21lbV9jb3B5KCAmc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbkFzc29jUmVhc3NvY0NvbXBsZXRlRXZlbnQuc3RhTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBDc3JSb2FtSW5mby0+cGVlck1hYyxzaXplb2YodFNpck1hY0FkZHIpKTsgIAorICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbkFzc29jUmVhc3NvY0NvbXBsZXRlRXZlbnQuc3RhSWQgPSBwQ3NyUm9hbUluZm8tPnN0YUlkIDsgCisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudC5zdGF0dXNDb2RlID0gcENzclJvYW1JbmZvLT5zdGF0dXNDb2RlOworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbkFzc29jUmVhc3NvY0NvbXBsZXRlRXZlbnQuaWVzTGVuID0gcENzclJvYW1JbmZvLT5yc25JRUxlbjsKKyAgICAgICAgICAgIHZvc19tZW1fY29weShzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudC5pZXMsIHBDc3JSb2FtSW5mby0+cHJzbklFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDc3JSb2FtSW5mby0+cnNuSUVMZW4pOworICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKHBDc3JSb2FtSW5mby0+YWRkSUVMZW4pIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZfVThfdCAgbGVuID0gc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbkFzc29jUmVhc3NvY0NvbXBsZXRlRXZlbnQuaWVzTGVuOworICAgICAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50Lmllc0xlbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gcENzclJvYW1JbmZvLT5hZGRJRUxlbjsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50Lmllc1tsZW5dLCBwQ3NyUm9hbUluZm8tPnBhZGRJRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENzclJvYW1JbmZvLT5hZGRJRUxlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LndtbUVuYWJsZWQgPSBwQ3NyUm9hbUluZm8tPndtbUVuYWJsZWRTdGE7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBTdGF0aW9uQXNzb2NSZWFzc29jQ29tcGxldGVFdmVudC5zdGF0dXMgPSAoZVNhcFN0YXR1cyApY29udGV4dDsKKyAgICAgICAgICAgIC8vVE9ETzogTmVlZCB0byBmaWxsIHNhcEF1dGhUeXBlCisgICAgICAgICAgICAvL3NhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcFN0YXRpb25Bc3NvY1JlYXNzb2NDb21wbGV0ZUV2ZW50LlNhcEF1dGhUeXBlID0gcENzclJvYW1JbmZvLT5wUHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlOyAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBlU0FQX1NUQV9ESVNBU1NPQ19FVkVOVDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgU0FQIGV2ZW50IGNhbGxiYWNrIGV2ZW50ID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX1NUQV9ESVNBU1NPQ19FVkVOVCIpOworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX1NUQV9ESVNBU1NPQ19FVkVOVDsKKyAgICAgICAgCisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoICZzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBTdGF0aW9uRGlzYXNzb2NDb21wbGV0ZUV2ZW50LnN0YU1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcENzclJvYW1JbmZvLT5wZWVyTWFjLCBzaXplb2YodFNpck1hY0FkZHIpKTsgIAorICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbkRpc2Fzc29jQ29tcGxldGVFdmVudC5zdGFJZCA9IHBDc3JSb2FtSW5mby0+c3RhSWQ7CisgICAgICAgICAgICBpZiAocENzclJvYW1JbmZvLT5yZWFzb25Db2RlID09IGVDU1JfUk9BTV9SRVNVTFRfRk9SQ0VEKQorICAgICAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcFN0YXRpb25EaXNhc3NvY0NvbXBsZXRlRXZlbnQucmVhc29uID0gZVNBUF9VU1JfSU5JVEFURURfRElTQVNTT0M7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbkRpc2Fzc29jQ29tcGxldGVFdmVudC5yZWFzb24gPSBlU0FQX01BQ19JTklUQVRFRF9ESVNBU1NPQzsKKworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbkRpc2Fzc29jQ29tcGxldGVFdmVudC5zdGF0dXNDb2RlID0gcENzclJvYW1JbmZvLT5zdGF0dXNDb2RlOworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbkRpc2Fzc29jQ29tcGxldGVFdmVudC5zdGF0dXMgPSAoZVNhcFN0YXR1cyApY29udGV4dDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNBUF9TVEFfU0VUX0tFWV9FVkVOVDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgU0FQIGV2ZW50IGNhbGxiYWNrIGV2ZW50ID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX1NUQV9TRVRfS0VZX0VWRU5UIik7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfU1RBX1NFVF9LRVlfRVZFTlQ7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBTdGF0aW9uU2V0S2V5Q29tcGxldGVFdmVudC5zdGF0dXMgPSAoZVNhcFN0YXR1cyApY29udGV4dDsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSgmc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvblNldEtleUNvbXBsZXRlRXZlbnQucGVlck1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcENzclJvYW1JbmZvLT5wZWVyTWFjLHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlU0FQX1NUQV9ERUxfS0VZX0VWRU5UIDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgU0FQIGV2ZW50IGNhbGxiYWNrIGV2ZW50ID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX1NUQV9ERUxfS0VZX0VWRU5UIik7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfU1RBX0RFTF9LRVlfRVZFTlQ7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBTdGF0aW9uRGVsZXRlS2V5Q29tcGxldGVFdmVudC5zdGF0dXMgPSAoZVNhcFN0YXR1cyApY29udGV4dDsKKyAgICAgICAgICAgIC8vVE9ETzogU2hvdWxkIHdlIG5lZWQgdG8gc2VuZCB0aGUga2V5IGluZm9ybWF0aW9uCisgICAgICAgICAgICAvL3NhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcFN0YXRpb25EZWxldGVLZXlDb21wbGV0ZUV2ZW50LmtleUlkID0gOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlU0FQX1NUQV9NSUNfRkFJTFVSRV9FVkVOVCA6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIFNBUCBldmVudCBjYWxsYmFjayBldmVudCA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVTQVBfU1RBX01JQ19GQUlMVVJFX0VWRU5UIik7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfU1RBX01JQ19GQUlMVVJFX0VWRU5UOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCAmc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbk1JQ0ZhaWx1cmVFdmVudC5zcmNNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3NyUm9hbUluZm8tPnUucE1JQ0ZhaWx1cmVJbmZvLT5zcmNNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSggJnNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcFN0YXRpb25NSUNGYWlsdXJlRXZlbnQuc3RhTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3NyUm9hbUluZm8tPnUucE1JQ0ZhaWx1cmVJbmZvLT50YU1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCAmc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbk1JQ0ZhaWx1cmVFdmVudC5kc3RNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3NyUm9hbUluZm8tPnUucE1JQ0ZhaWx1cmVJbmZvLT5kc3RNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcFN0YXRpb25NSUNGYWlsdXJlRXZlbnQubXVsdGljYXN0ID0gcENzclJvYW1JbmZvLT51LnBNSUNGYWlsdXJlSW5mby0+bXVsdGljYXN0OworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwU3RhdGlvbk1JQ0ZhaWx1cmVFdmVudC5JVjEgPSBwQ3NyUm9hbUluZm8tPnUucE1JQ0ZhaWx1cmVJbmZvLT5JVjE7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBTdGF0aW9uTUlDRmFpbHVyZUV2ZW50LmtleUlkID0gcENzclJvYW1JbmZvLT51LnBNSUNGYWlsdXJlSW5mby0+a2V5SWQ7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcFN0YXRpb25NSUNGYWlsdXJlRXZlbnQuVFNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3NyUm9hbUluZm8tPnUucE1JQ0ZhaWx1cmVJbmZvLT5UU0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9DSVBIRVJfU0VRX0NUUl9TSVpFKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorCisgICAgICAgIGNhc2UgZVNBUF9BU1NPQ19TVEFfQ0FMTEJBQ0tfRVZFTlQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIFNBUCBldmVudCBjYWxsYmFjayBldmVudCA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9BU1NPQ19TVEFfQ0FMTEJBQ0tfRVZFTlQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgZVNBUF9XUFNfUEJDX1BST0JFX1JFUV9FVkVOVDoKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9XUFNfUEJDX1BST0JFX1JFUV9FVkVOVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdm9zX21lbV9jb3B5KCAmc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwUEJDUHJvYmVSZXFFdmVudC5XUFNQQkNQcm9iZVJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcENzclJvYW1JbmZvLT51LnBXUFNQQkNQcm9iZVJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJXUFNQQkNQcm9iZVJlcSkpOyAgCisgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICBjYXNlIGVTQVBfSU5ESUNBVEVfTUdNVF9GUkFNRToKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW4gJXMsIFNBUCBldmVudCBjYWxsYmFjayBldmVudCA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9JTkRJQ0FURV9NR01UX0ZSQU1FIik7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfSU5ESUNBVEVfTUdNVF9GUkFNRTsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcE1hbmFnZW1lbnRGcmFtZUluZm8ubkZyYW1lTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwQ3NyUm9hbUluZm8tPm5GcmFtZUxlbmd0aDsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcE1hbmFnZW1lbnRGcmFtZUluZm8ucGJGcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBDc3JSb2FtSW5mby0+cGJGcmFtZXM7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBNYW5hZ2VtZW50RnJhbWVJbmZvLmZyYW1lVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcENzclJvYW1JbmZvLT5mcmFtZVR5cGU7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBNYW5hZ2VtZW50RnJhbWVJbmZvLnJ4Q2hhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcENzclJvYW1JbmZvLT5yeENoYW47CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgZVNBUF9SRU1BSU5fQ0hBTl9SRUFEWToKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW4gJXMsIFNBUCBldmVudCBjYWxsYmFjayBldmVudCA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9SRU1BSU5fQ0hBTl9SRUFEWSIpOworICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfUkVNQUlOX0NIQU5fUkVBRFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIGVTQVBfU0VORF9BQ1RJT05fQ05GOgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiAlcywgU0FQIGV2ZW50IGNhbGxiYWNrIGV2ZW50ID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX1NFTkRfQUNUSU9OX0NORiIpOworICAgICAgICAgICAgc2FwQXBBcHBFdmVudC5zYXBIZGRFdmVudENvZGUgPSBlU0FQX1NFTkRfQUNUSU9OX0NORjsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcEFjdGlvbkNuZi5hY3Rpb25TZW5kU3VjY2VzcyA9IChlU2FwU3RhdHVzKWNvbnRleHQ7IAorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICBjYXNlIGVTQVBfVU5LTk9XTl9TVEFfSk9JTjoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICJJbiAlcywgU0FQIGV2ZW50IGNhbGxiYWNrIGV2ZW50ID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX1VOS05PV05fU1RBX0pPSU4iKTsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9VTktOT1dOX1NUQV9KT0lOOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCh2X1BWT0lEX3Qpc2FwQXBBcHBFdmVudC5zYXBldnQuc2FwVW5rbm93blNUQUpvaW4ubWFjYWRkci5ieXRlcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCljb250ZXh0LCBzaXplb2Yodl9NQUNBRERSX3QpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNBUF9NQVhfQVNTT0NfRVhDRUVERUQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICAiSW4gJXMsIFNBUCBldmVudCBjYWxsYmFjayBldmVudCA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9NQVhfQVNTT0NfRVhDRUVERUQiKTsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9NQVhfQVNTT0NfRVhDRUVERUQ7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoKHZfUFZPSURfdClzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBNYXhBc3NvY0V4Y2VlZGVkLm1hY2FkZHIuYnl0ZXMsIAorICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBDc3JSb2FtSW5mby0+cGVlck1hYywgc2l6ZW9mKHZfTUFDQUREUl90KSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiSW4gJXMsIFNBUCBVbmtub3duIGNhbGxiYWNrIGV2ZW50ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sc2FwSGRkZXZlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHZvc1N0YXR1cyA9ICgqc2FwQ29udGV4dC0+cGZuU2FwRXZlbnRDYWxsYmFjaykKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICZzYXBBcEFwcEV2ZW50LAorICAgICAgICAgICAgICAgICBzYXBDb250ZXh0LT5wVXNyQ29udGV4dC8vdXNlcmRhdGFmb3JjYWxsYmFjayAtIGhkZCBvcGFxdWUgaGFuZGxlCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgIAorICAgIHJldHVybiB2b3NTdGF0dXM7CisKK30gLyogc2FwU2lnbmFsQXBBcHBTdGFydEJzc0V2ZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgc2FwRnNtCisKKyAgREVTQ1JJUFRJT04gCisgICAgU0FQIFN0YXRlIG1hY2hpbmUgZW50cnkgZnVuY3Rpb24KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHNhcENvbnRleHQgIDogU2FwIENvbnRleHQgdmFsdWUKKyAgICBzYXBFdmVudCAgICA6IFN0YXRlIG1hY2hpbmUgZXZlbnQKKyAgICBzdGF0dXMgICAgICA6IFJldHVybiB0aGUgU0FQIHN0YXR1cyBoZXJlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworc2FwRnNtCisoCisgICAgcHRTYXBDb250ZXh0IHNhcENvbnRleHQsICAgIC8qIHNhcENvbnRleHQgdmFsdWUgKi8gICAgCisgICAgcHRXTEFOX1NBUEV2ZW50IHNhcEV2ZW50ICAgLyogU3RhdGUgbWFjaGluZSBldmVudCAqLworKQoreworICAgLyogUmV0cmlldmUgdGhlIHBoeSBsaW5rIHN0YXRlIG1hY2hpbmUgc3RydWN0dXJlIAorICAgICAqIGZyb20gdGhlIHNhcENvbnRleHQgdmFsdWUKKyAgICAgKi8KKyAgICBlU2FwRnNtU3RhdGVzX3Qgc3RhdGVWYXIgPSBzYXBDb250ZXh0LT5zYXBzTWFjaGluZTsgLypzdGF0ZSB2YXIgdGhhdCBrZWVwcyB0cmFjayBvZiBzdGF0ZSBtYWNoaW5lKi8KKyAgICB0Q3NyUm9hbUluZm8gICAgKnJvYW1JbmZvID0gKHRDc3JSb2FtSW5mbyAqKShzYXBFdmVudC0+cGFyYW1zKTsKKyAgICB2X1UzMl90IG1zZyA9IHNhcEV2ZW50LT5ldmVudDsgIC8qIFN0YXRlIG1hY2hpbmUgaW5wdXQgZXZlbnQgbWVzc2FnZSAqLworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisKKyAgICBzd2l0Y2ggKHN0YXRlVmFyKQorICAgIHsKKyAgICAgICAgY2FzZSBlU0FQX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIGlmICgobXNnID09IGVTQVBfSEREX1NUQVJUX0lORlJBX0JTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiBmcm9tIGVTQVBfRElTQ09OTkVDVEVEIHRvIGVTQVBfQ0hfU0VMRUNUIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSAqLworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgbmV3IGZyb20gc3RhdGUgJXMgPT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVTQVBfRElTQ09OTkVDVEVEIiwgImVTQVBfQ0hfU0VMRUNUIik7CisKKyAgICAgICAgICAgICAgICAvKiBUaGVyZSBjYW4gYmUgb25lIFNBUCBTZXNzaW9uIGZvciBzb2Z0YXAgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2FwQ29udGV4dC0+aXNTYXBTZXNzaW9uT3BlbiA9PSBlU0FQX1RSVUUpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6U01FIFNlc3Npb24gaXMgYWxyZWFkeSBvcGVuZWRcbiIsX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzYXBDb250ZXh0LT5zZXNzaW9uSWQgPSAweGZmOworCisgICAgICAgICAgICAgICAgLyogU2V0IFNBUCBkZXZpY2Ugcm9sZSAqLworICAgICAgICAgICAgICAgIHNhcENvbnRleHQtPnNhcHNNYWNoaW5lID0gZVNBUF9DSF9TRUxFQ1Q7CisKKyAgICAgICAgICAgICAgICAvKiBQZXJmb3JtIHNtZV9TY2FuUmVxdWVzdCAqLworICAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IHNhcEdvdG9DaGFubmVsU2VsKHNhcENvbnRleHQsIHNhcEV2ZW50KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIGZyb20gZVNBUF9ESVNDT05ORUNURUQgdG8gZVNBUF9DSF9TRUxFQ1QgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpICovCisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVTQVBfRElTQ09OTkVDVEVEIiwgImVTQVBfQ0hfU0VMRUNUIik7CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiSW4gJXMsIGluIHN0YXRlICVzLCBldmVudCBtc2cgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX0RJU0NPTk5FQ1RFRCIsIG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTQVBfQ0hfU0VMRUNUOgorICAgICAgICAgICAgaWYgKG1zZyA9PSBlU0FQX01BQ19TQ0FOX0NPTVBMRVRFKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiBmcm9tIGVTQVBfQ0hfU0VMRUNUIHRvIGVTQVBfU1RBUlRJTkcgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpICovCisgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9DSF9TRUxFQ1QiLCAiZVNBUF9TVEFSVElORyIpOworICAgICAgICAgICAgICAgICAvLyBDaGFubmVsIHNlbGVjdGVkLiBOb3cgY2FuIHNhcEdvdG9TdGFydGluZworICAgICAgICAgICAgICAgICBzYXBDb250ZXh0LT5zYXBzTWFjaGluZSA9IGVTQVBfU1RBUlRJTkc7CisgICAgICAgICAgICAgICAgIC8vIFNwZWNpZnkgdGhlIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgc2FwQ29udGV4dC0+Y3NyUm9hbVByb2ZpbGUuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgIHNhcENvbnRleHQtPmNzclJvYW1Qcm9maWxlLkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gJnNhcENvbnRleHQtPmNzclJvYW1Qcm9maWxlLm9wZXJhdGlvbkNoYW5uZWw7CisgICAgICAgICAgICAgICAgIHNhcENvbnRleHQtPmNzclJvYW1Qcm9maWxlLm9wZXJhdGlvbkNoYW5uZWwgPSAodEFOSV9VOClzYXBDb250ZXh0LT5jaGFubmVsOworICAgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBzYXBHb3RvU3RhcnRpbmcoIHNhcENvbnRleHQsIHNhcEV2ZW50LCBlQ1NSX0JTU19UWVBFX0lORlJBX0FQKTsKKyAgICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiBmcm9tIGVTQVBfQ0hfU0VMRUNUIHRvIGVTQVBfU1RBUlRJTkcgKGJvdGggd2l0aG91dCBzdWJzdGF0ZXMpICovCisgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVTQVBfQ0hfU0VMRUNUIiwgImVTQVBfU1RBUlRJTkciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJJbiAlcywgaW4gc3RhdGUgJXMsIGludmFsaWQgZXZlbnQgbXNnICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX0NIX1NFTEVDVCIsIG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTQVBfU1RBUlRJTkc6CisgICAgICAgICAgICBpZiAobXNnID09IGVTQVBfTUFDX1NUQVJUX0JTU19TVUNDRVNTICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiBmcm9tIGVTQVBfU1RBUlRJTkcgdG8gZVNBUF9TVEFSVEVEIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSAqLworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSBjaGFubmVsID0gJWQgJXMgPT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyxzYXBDb250ZXh0LT5jaGFubmVsLCAiZVNBUF9TVEFSVElORyIsICJlU0FQX1NUQVJURUQiKTsKKworICAgICAgICAgICAgICAgICBzYXBDb250ZXh0LT5zYXBzTWFjaGluZSA9IGVTQVBfU1RBUlRFRDsKKyAgICAgICAgICAgICAgICAgLypBY3Rpb24gY29kZSBmb3IgdHJhbnNpdGlvbiAqLworICAgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBzYXBTaWduYWxIRERldmVudCggc2FwQ29udGV4dCwgcm9hbUluZm8sIGVTQVBfU1RBUlRfQlNTX0VWRU5ULCAodl9QVk9JRF90KWVTQVBfU1RBVFVTX1NVQ0NFU1MpOworCisgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSBlU0FQX1NUQVJUSU5HIHRvIGVTQVBfU1RBUlRFRCAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykgKi8KKyAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBmcm9tIHN0YXRlICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX1NUQVJUSU5HIiwgImVTQVBfU1RBUlRFRCIpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIGlmIChtc2cgPT0gZVNBUF9NQUNfU1RBUlRfRkFJTFMpIAorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgLypUcmFuc2l0aW9uIGZyb20gU1RBUlRJTkcgdG8gRElTQ09OTkVDVEVEIChib3RoIHdpdGhvdXQgc3Vic3RhdGVzKSovICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVTQVBfU1RBUlRJTkciLCAiZVNBUF9ESVNDT05ORUNURUQiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgLypBY3Rpb24gY29kZSBmb3IgdHJhbnNpdGlvbiAqLworICAgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBzYXBTaWduYWxIRERldmVudCggc2FwQ29udGV4dCwgTlVMTCwgZVNBUF9TVEFSVF9CU1NfRVZFTlQsKHZfUFZPSURfdCkgZVNBUF9TVEFUVVNfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9ICBzYXBHb3RvRGlzY29ubmVjdGVkKHNhcENvbnRleHQpOworCisgICAgICAgICAgICAgICAgIC8qQWR2YW5jZSBvdXRlciBzdGF0ZXZhciAqLworICAgICAgICAgICAgICAgICBzYXBDb250ZXh0LT5zYXBzTWFjaGluZSA9IGVTQVBfRElTQ09OTkVDVEVEOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIGlmIChtc2cgPT0gZVNBUF9IRERfU1RPUF9JTkZSQV9CU1MpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAvKlRyYW5zaXRpb24gZnJvbSBlU0FQX1NUQVJUSU5HIHRvIGVTQVBfRElTQ09OTkVDVElORyAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykqLyAgICAgICAgCisgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICJJbiAlcywgZnJvbSBzdGF0ZSAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVTQVBfU1RBUlRJTkciLCAiZVNBUF9ESVNDT05ORUNUSU5HIik7CisKKyAgICAgICAgICAgICAgICAgLypBZHZhbmNlIG91dGVyIHN0YXRldmFyICovCisgICAgICAgICAgICAgICAgIHNhcENvbnRleHQtPnNhcHNNYWNoaW5lID0gZVNBUF9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IHNhcFNpZ25hbEhERGV2ZW50KCBzYXBDb250ZXh0LCBOVUxMLCBlU0FQX1NUQVJUX0JTU19FVkVOVCwgKHZfUFZPSURfdCllU0FQX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gc2FwR290b0Rpc2Nvbm5lY3RlZChzYXBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgLyogQ2xvc2UgdGhlIFNNRSBzZXNzaW9uKi8KKworICAgICAgICAgICAgICAgICBpZiAoZVNBUF9UUlVFID09IHNhcENvbnRleHQtPmlzU2FwU2Vzc2lvbk9wZW4pIAorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRIYWxIYW5kbGUgaEhhbCA9IFZPU19HRVRfSEFMX0NCKHNhcENvbnRleHQtPnB2b3NHQ3R4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gaEhhbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluICVzLCBOVUxMIGhIYWwgaW4gc3RhdGUgJXMsIG1zZyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9TVEFSVElORyIsIG1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfQ2xvc2VTZXNzaW9uKGhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcENvbnRleHQtPnNlc3Npb25JZCwgTlVMTCwgTlVMTCkpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgc2FwQ29udGV4dC0+aXNTYXBTZXNzaW9uT3BlbiA9IGVTQVBfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluICVzLCBpbiBzdGF0ZSAlcywgaW52YWxpZCBldmVudCBtc2cgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX1NUQVJUSU5HIiwgbXNnKTsKKyAgICAgICAgICAgICAgICAgLyogSW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rICovCisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNBUF9TVEFSVEVEOgorICAgICAgICAgICAgaWYgKG1zZyA9PSBlU0FQX0hERF9TVE9QX0lORlJBX0JTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIGZyb20gZVNBUF9TVEFSVEVEIHRvIGVTQVBfRElTQ09OTkVDVElORyAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykgKi8KKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9TVEFSVEVEIiwgImVTQVBfRElTQ09OTkVDVElORyIpOworICAgICAgICAgICAgICAgIHNhcENvbnRleHQtPnNhcHNNYWNoaW5lID0gZVNBUF9ESVNDT05ORUNUSU5HOworICAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IHNhcEdvdG9EaXNjb25uZWN0aW5nKHNhcENvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkluICVzLCBpbiBzdGF0ZSAlcywgaW52YWxpZCBldmVudCBtc2cgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9TVEFSVEVEIiwgbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNBUF9ESVNDT05ORUNUSU5HOgorICAgICAgICAgICAgaWYgKG1zZyA9PSBlU0FQX01BQ19SRUFEWV9GT1JfQ09OTkVDVElPTlMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiBmcm9tIGVTQVBfRElTQ09OTkVDVElORyB0byBlU0FQX0RJU0NPTk5FQ1RFRCAoYm90aCB3aXRob3V0IHN1YnN0YXRlcykgKi8KKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIGZyb20gc3RhdGUgJXMgPT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICJlU0FQX0RJU0NPTk5FQ1RJTkciLCAiZVNBUF9ESVNDT05ORUNURUQiKTsKKworICAgICAgICAgICAgICAgIHNhcENvbnRleHQtPnNhcHNNYWNoaW5lID0gZVNBUF9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICAgICAgLyogQ2xvc2UgdGhlIFNNRSBzZXNzaW9uKi8KKyAgICAgICAgICAgICAgICBpZiAoZVNBUF9UUlVFID09IHNhcENvbnRleHQtPmlzU2FwU2Vzc2lvbk9wZW4pIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdEhhbEhhbmRsZSBoSGFsID0gVk9TX0dFVF9IQUxfQ0Ioc2FwQ29udGV4dC0+cHZvc0dDdHgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMID09IGhIYWwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluICVzLCBOVUxMIGhIYWwgaW4gc3RhdGUgJXMsIG1zZyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgImVTQVBfRElTQ09OTkVDVElORyIsIG1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXBDb250ZXh0LT5pc1NhcFNlc3Npb25PcGVuID0gZVNBUF9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9DbG9zZVNlc3Npb24oaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXBDb250ZXh0LT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwUm9hbVNlc3Npb25DbG9zZUNhbGxiYWNrLCBzYXBDb250ZXh0KSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gc2FwU2lnbmFsSEREZXZlbnQoc2FwQ29udGV4dCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0FQX1NUT1BfQlNTX0VWRU5ULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSBlU0FQX1NUQVRVU19TVUNDRVNTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiAlcywgaW4gc3RhdGUgJXMsIGludmFsaWQgZXZlbnQgbXNnICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAiZVNBUF9ESVNDT05ORUNUSU5HIiwgbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIHZvc1N0YXR1czsKK30vLyBzYXBGc20KKworCitlU2FwU3RhdHVzCitzYXBjb252ZXJ0VG9Dc3JQcm9maWxlKHRzYXBfQ29uZmlnX3QgKnBjb25maWdfcGFyYW1zLCBlQ3NyUm9hbUJzc1R5cGUgYnNzVHlwZSwgdENzclJvYW1Qcm9maWxlICpwcm9maWxlKQoreworICAgIC8vQ3JlYXRlIFJvYW0gcHJvZmlsZSBmb3IgU29mdEFQIHRvIGNvbm5lY3QKKyAgICBwcm9maWxlLT5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9JTkZSQV9BUDsKKyAgICBwcm9maWxlLT5TU0lEcy5udW1PZlNTSURzID0gMTsKKyAgICBwcm9maWxlLT5jc3JQZXJzb25hID0gcGNvbmZpZ19wYXJhbXMtPnBlcnNvbmE7CisKKyAgICB2b3NfbWVtX3plcm8ocHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uU1NJRC5zc0lkLCAKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzBdLlNTSUQuc3NJZCkpOworCisgICAgLy9GbGFnIHRvIG5vdCBicm9hZGNhc3QgdGhlIFNTSUQgaW5mb3JtYXRpb24KKyAgICBwcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5zc2lkSGlkZGVuID0gIHBjb25maWdfcGFyYW1zLT5TU0lEaW5mby5zc2lkSGlkZGVuOworCisgICAgcHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uU1NJRC5sZW5ndGggPSBwY29uZmlnX3BhcmFtcy0+U1NJRGluZm8uc3NpZC5sZW5ndGg7CisgICAgdm9zX21lbV9jb3B5KCZwcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5TU0lELnNzSWQsIHBjb25maWdfcGFyYW1zLT5TU0lEaW5mby5zc2lkLnNzSWQsCisgICAgICAgICAgICAgICAgICBzaXplb2YocGNvbmZpZ19wYXJhbXMtPlNTSURpbmZvLnNzaWQuc3NJZCkpOworCisgICAgcHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07CisKKyAgICBpZiAocGNvbmZpZ19wYXJhbXMtPmF1dGhUeXBlID09IGVTQVBfT1BFTl9TWVNURU0pCisgICAgeworICAgICAgICBwcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKyAgICB9CisgICAgZWxzZSBpZiAocGNvbmZpZ19wYXJhbXMtPmF1dGhUeXBlID09IGVTQVBfU0hBUkVEX0tFWSkKKyAgICB7CisgICAgICAgIHByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX0FVVE9TV0lUQ0g7CisgICAgfQorCisgICAgcHJvZmlsZS0+QXV0aFR5cGUubnVtRW50cmllcyA9IDE7CisgICAgcHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKworICAgIC8vQWx3YXlzIHNldCB0aGUgRW5jcnlwdGlvbiBUeXBlCisgICAgcHJvZmlsZS0+RW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgcHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBwY29uZmlnX3BhcmFtcy0+UlNORW5jcnlwdFR5cGU7CisKKyAgICBwcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworICAgIHByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBwY29uZmlnX3BhcmFtcy0+bWNSU05FbmNyeXB0VHlwZTsKKworICAgIGlmIChwY29uZmlnX3BhcmFtcy0+cHJpdmFjeSAmIGVTQVBfU0hBUkVEX0tFWSkKKyAgICB7CisgICAgICAgIHByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gZUNTUl9BVVRIX1RZUEVfU0hBUkVEX0tFWTsKKyAgICB9CisKKyAgICBwcm9maWxlLT5wcml2YWN5ID0gcGNvbmZpZ19wYXJhbXMtPnByaXZhY3k7CisgICAgcHJvZmlsZS0+ZndkV1BTUEJDUHJvYmVSZXEgPSBwY29uZmlnX3BhcmFtcy0+ZndkV1BTUEJDUHJvYmVSZXE7CisKKyAgICBpZiAocGNvbmZpZ19wYXJhbXMtPmF1dGhUeXBlID09IGVTQVBfU0hBUkVEX0tFWSkKKyAgICB7CisgICAgICAgIHByb2ZpbGUtPmNzcjgwMjExQXV0aFR5cGUgPSBlU0lSX1NIQVJFRF9LRVk7CisgICAgfQorICAgIGVsc2UgaWYgKHBjb25maWdfcGFyYW1zLT5hdXRoVHlwZSA9PSBlU0FQX09QRU5fU1lTVEVNKQorICAgIHsKKyAgICAgICAgcHJvZmlsZS0+Y3NyODAyMTFBdXRoVHlwZSA9IGVTSVJfT1BFTl9TWVNURU07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByb2ZpbGUtPmNzcjgwMjExQXV0aFR5cGUgPSBlU0lSX0FVVE9fU1dJVENIOyAKKyAgICB9CisKKyAgICAvL0luaXRpYWxpemUgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgaXQgCisgICAgcHJvZmlsZS0+cFdQQVJlcUlFID0gTlVMTDsKKyAgICBwcm9maWxlLT5uV1BBUmVxSUVMZW5ndGggPSAwOworCisgICAgLy9zZXQgdGhlIFJTTi9XUEEgSUUKKyAgICBwcm9maWxlLT5wUlNOUmVxSUUgPSBOVUxMOworICAgIHByb2ZpbGUtPm5SU05SZXFJRUxlbmd0aCA9IHBjb25maWdfcGFyYW1zLT5SU05XUEFSZXFJRUxlbmd0aDsgCisgICAgaWYgKHBjb25maWdfcGFyYW1zLT5SU05XUEFSZXFJRUxlbmd0aCkKKyAgICB7CisgICAgICAgIHByb2ZpbGUtPnBSU05SZXFJRSA9IHZvc19tZW1fbWFsbG9jKHBjb25maWdfcGFyYW1zLT5SU05XUEFSZXFJRUxlbmd0aCk7CisgICAgICAgIGlmKCBOVUxMID09IHByb2ZpbGUtPnBSU05SZXFJRSApCisgICAgICAgIHsKKyAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIgJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICByZXR1cm4gZVNBUF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICB2b3NfbWVtX2NvcHkocHJvZmlsZS0+cFJTTlJlcUlFLCBwY29uZmlnX3BhcmFtcy0+cFJTTldQQVJlcUlFLCBwY29uZmlnX3BhcmFtcy0+UlNOV1BBUmVxSUVMZW5ndGgpOworICAgICAgICBwcm9maWxlLT5uUlNOUmVxSUVMZW5ndGggPSBwY29uZmlnX3BhcmFtcy0+UlNOV1BBUmVxSUVMZW5ndGg7IAorICAgIH0KKworICAgIC8vIFR1cm4gb2ZmIENCIG1vZGUKKyAgICBwcm9maWxlLT5DQk1vZGUgPSBlQ1NSX0NCX09GRjsKKworICAgIC8vc2V0IHRoZSBwaHlNb2RlIHRvIGFjY2VwdCBhbnl0aGluZworICAgIC8vQmVzdCBtZWFucyBldmVyeXRoaW5nIGJlY2F1c2UgaXQgY292ZXJzIGFsbCB0aGUgdGhpbmdzIHdlIHN1cHBvcnQKKyAgICBwcm9maWxlLT5waHlNb2RlID0gcGNvbmZpZ19wYXJhbXMtPlNhcEh3X21vZGU7IC8qZUNTUl9ET1QxMV9NT0RFX0JFU1QqLworCisgICAgLy9Db25maWd1cmUgYmVhY29uSW50ZXJ2YWwKKyAgICBwcm9maWxlLT5iZWFjb25JbnRlcnZhbCA9ICh0QU5JX1UxNilwY29uZmlnX3BhcmFtcy0+YmVhY29uX2ludDsKKworICAgIC8vIHNldCBEVElNIHBlcmlvZAorICAgIHByb2ZpbGUtPmR0aW1QZXJpb2QgPSBwY29uZmlnX3BhcmFtcy0+ZHRpbV9wZXJpb2Q7CisKKyAgICAvL3NldCBVYXBzZCBlbmFibGUgYml0CisgICAgcHJvZmlsZS0+QXBVYXBzZEVuYWJsZSA9IHBjb25maWdfcGFyYW1zLT5VYXBzZEVuYWJsZTsKKworICAgIC8vRW5hYmxlIHByb3RlY3Rpb24gcGFyYW1ldGVycworICAgIHByb2ZpbGUtPnByb3RFbmFibGVkICAgICAgID0gcGNvbmZpZ19wYXJhbXMtPnByb3RFbmFibGVkOworICAgIHByb2ZpbGUtPm9ic3NQcm90RW5hYmxlZCAgID0gcGNvbmZpZ19wYXJhbXMtPm9ic3NQcm90RW5hYmxlZDsKKyAgICBwcm9maWxlLT5jZmdfcHJvdGVjdGlvbiAgICA9IHBjb25maWdfcGFyYW1zLT5odF9jYXBhYjsKKworICAgIC8vY291bnRyeSBjb2RlCisgICAgaWYgKHBjb25maWdfcGFyYW1zLT5jb3VudHJ5Q29kZVswXSkKKyAgICAgICAgdm9zX21lbV9jb3B5KHByb2ZpbGUtPmNvdW50cnlDb2RlLCBwY29uZmlnX3BhcmFtcy0+Y291bnRyeUNvZGUsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTik7IAorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBwcm9maWxlLT5pZWVlODAyMTFkID0gcGNvbmZpZ19wYXJhbXMtPmllZWU4MDIxMWQ7CisjZW5kaWYKKyAgICAvL3dwcyBjb25maWcgaW5mbworICAgIHByb2ZpbGUtPndwc19zdGF0ZSA9IHBjb25maWdfcGFyYW1zLT53cHNfc3RhdGU7CisKKyAgICByZXR1cm4gZVNBUF9TVEFUVVNfU1VDQ0VTUzsgLyogU3VjY2Vzcy4gICovCit9CisKKwordm9pZCBzYXBGcmVlUm9hbVByb2ZpbGUodENzclJvYW1Qcm9maWxlICpwcm9maWxlKQoreworICAgaWYocHJvZmlsZS0+cFJTTlJlcUlFKQorICAgeworICAgICAgdm9zX21lbV9mcmVlKHByb2ZpbGUtPnBSU05SZXFJRSk7CisgICAgICBwcm9maWxlLT5wUlNOUmVxSUUgPSBOVUxMOworICAgfQorfQorCisKK3ZvaWQKK3NhcFNvcnRNYWNMaXN0KHZfTUFDQUREUl90ICptYWNMaXN0LCB2X1U4X3Qgc2l6ZSkKK3sKKyAgICB2X1U4X3Qgb3V0ZXIsIGlubmVyOworICAgIHZfTUFDQUREUl90IHRlbXA7CisgICAgdl9TSU5UX3QgblJlcyA9IC0xOworCisgICAgZm9yKG91dGVyID0gMDsgb3V0ZXIgPCBzaXplOyBvdXRlcisrKQorICAgIHsKKyAgICAgICAgZm9yKGlubmVyID0gMDsgaW5uZXIgPCBzaXplIC0gMTsgaW5uZXIrKykKKyAgICAgICAgeworICAgICAgICAgICAgblJlcyA9IHZvc19tZW1fY29tcGFyZTIoKG1hY0xpc3QgKyBpbm5lciktPmJ5dGVzLCAobWFjTGlzdCArIGlubmVyICsgMSktPmJ5dGVzLCBzaXplb2Yodl9NQUNBRERSX3QpKTsKKyAgICAgICAgICAgIGlmIChuUmVzID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkodGVtcC5ieXRlcywgKG1hY0xpc3QgKyBpbm5lciArIDEpLT5ieXRlcywgc2l6ZW9mKHZfTUFDQUREUl90KSk7CisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KChtYWNMaXN0ICsgaW5uZXIgKyAxKS0+Ynl0ZXMsIChtYWNMaXN0ICsgaW5uZXIpLT5ieXRlcywgc2l6ZW9mKHZfTUFDQUREUl90KSk7CisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KChtYWNMaXN0ICsgaW5uZXIpLT5ieXRlcywgdGVtcC5ieXRlcywgc2l6ZW9mKHZfTUFDQUREUl90KSk7CisgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitlU2FwQm9vbAorc2FwU2VhcmNoTWFjTGlzdCh2X01BQ0FERFJfdCAqbWFjTGlzdCwgdl9VOF90IG51bV9tYWMsIHZfVThfdCAqcGVlck1hYywgdl9VOF90ICppbmRleCkKK3sKKyAgICB2X1NJTlRfdCBuUmVzID0gLTE7CisgICAgdl9TN190IG5TdGFydCA9IDAsIG5FbmQsIG5NaWRkbGU7CisgICAgbkVuZCA9IG51bV9tYWMgLSAxOworCisgICAgd2hpbGUgKG5TdGFydCA8PSBuRW5kKQorICAgIHsKKyAgICAgICAgbk1pZGRsZSA9IChuU3RhcnQgKyBuRW5kKSAvIDI7CisgICAgICAgIG5SZXMgPSB2b3NfbWVtX2NvbXBhcmUyKCZtYWNMaXN0W25NaWRkbGVdLCBwZWVyTWFjLCBzaXplb2Yodl9NQUNBRERSX3QpKTsKKworICAgICAgICBpZiAoMCA9PSBuUmVzKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICAic2VhcmNoIFNVQ0MiKTsKKyAgICAgICAgICAgIC8vICJpbmRleCBlcXVhbHMgTlVMTCIgbWVhbnMgdGhlIGNhbGxlciBkb2VzIG5vdCBuZWVkIHRoZQorICAgICAgICAgICAgLy8gaW5kZXggdmFsdWUgb2YgdGhlIHBlZXJNYWMgYmVpbmcgc2VhcmNoZWQKKyAgICAgICAgICAgIGlmIChpbmRleCAhPSBOVUxMKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqaW5kZXggPSAodl9VOF90KSBuTWlkZGxlOworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXggJWQiLCAqaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVTQVBfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoblJlcyA8IDApCisgICAgICAgICAgICBuU3RhcnQgPSBuTWlkZGxlICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbkVuZCA9IG5NaWRkbGUgLSAxOworICAgIH0KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAic2VhcmNoIG5vdCBzdWNjIik7CisgICAgcmV0dXJuIGVTQVBfRkFMU0U7Cit9CisKK3ZvaWQKK3NhcEFkZE1hY1RvQUNMKHZfTUFDQUREUl90ICptYWNMaXN0LCB2X1U4X3QgKnNpemUsIHZfVThfdCAqcGVlck1hYykKK3sKKyAgICB2X1NJTlRfdCBuUmVzID0gLTE7CisgICAgaW50IGk7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwiYWRkIGFjbCBlbnRlcmVkIik7CisgICAgZm9yIChpPSgoKnNpemUpLTEpOyBpPj0wOyBpLS0pCisgICAgeworICAgICAgICBuUmVzID0gdm9zX21lbV9jb21wYXJlMigmbWFjTGlzdFtpXSwgcGVlck1hYywgc2l6ZW9mKHZfTUFDQUREUl90KSk7CisgICAgICAgIGlmIChuUmVzID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTW92ZSBhbHBoYWJldGljYWxseSBncmVhdGVyIG1hYyBhZGRyZXNzZXMgb25lIGluZGV4IGRvd24gdG8gYWxsb3cgZm9yIGluc2VydGlvbgorICAgICAgICAgICAgICAgb2YgbmV3IG1hYyBpbiBzb3J0ZWQgb3JkZXIgKi8KKyAgICAgICAgICAgIHZvc19tZW1fY29weSgobWFjTGlzdCtpKzEpLT5ieXRlcywobWFjTGlzdCtpKS0+Ynl0ZXMsIHNpemVvZih2X01BQ0FERFJfdCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgLy9UaGlzIHNob3VsZCBhbHNvIHRha2UgY2FyZSBvZiBpZiB0aGUgZWxlbWVudCBpcyB0aGUgZmlyc3QgdG8gYmUgYWRkZWQgaW4gdGhlIGxpc3QKKyAgICB2b3NfbWVtX2NvcHkoKG1hY0xpc3QraSsxKS0+Ynl0ZXMsIHBlZXJNYWMsIHNpemVvZih2X01BQ0FERFJfdCkpOworICAgIC8vIGluY3JlbWVudCB0aGUgbGlzdCBzaXplCisgICAgKCpzaXplKSsrOworfQorCit2b2lkCitzYXBSZW1vdmVNYWNGcm9tQUNMKHZfTUFDQUREUl90ICptYWNMaXN0LCB2X1U4X3QgKnNpemUsIHZfVThfdCBpbmRleCkgICAgCit7CisgICAgaW50IGk7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwicmVtb3ZlIGFjbCBlbnRlcmVkIik7CisgICAgLyogcmV0dXJuIGlmIHRoZSBsaXN0IHBhc3NlZCBpcyBlbXB0eS4gSWRlYWxseSB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2UgdGhpcyBmdW5jbiBpcyBhbHdheXMKKyAgICAgICBjYWxsZWQgYWZ0ZXIgc2FwU2VhcmNoTWFjTGlzdCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBtYWMgYWRkciB0byBiZSByZW1vdmVkIGFuZCB0aGlzIHdpbGwKKyAgICAgICBvbmx5IGdldCBjYWxsZWQgaWYgdGhlIHNlYXJjaCBpcyBzdWNjZXNzZnVsLiBTdGlsbCBubyBoYXJtIGluIGhhdmluZyB0aGUgY2hlY2sgKi8KKyAgICBpZiAobWFjTGlzdD09TlVMTCkgcmV0dXJuOworICAgIGZvciAoaT1pbmRleDsgaTwoKCpzaXplKS0xKTsgaSsrKQorICAgIHsKKyAgICAgICAgLyogTW92ZSBtYWMgYWRkcmVzc2VzIHN0YXJ0aW5nIGZyb20gImluZGV4IiBwYXNzZWQgb25lIGluZGV4IHVwIHRvIGRlbGV0ZSB0aGUgdm9pZAorICAgICAgICAgICBjcmVhdGVkIGJ5IGRlbGV0aW9uIG9mIGEgbWFjIGFkZHJlc3MgaW4gQUNMICovCisgICAgICAgIHZvc19tZW1fY29weSgobWFjTGlzdCtpKS0+Ynl0ZXMsKG1hY0xpc3QraSsxKS0+Ynl0ZXMsIHNpemVvZih2X01BQ0FERFJfdCkpOworICAgIH0KKyAgICAvLyBUaGUgbGFzdCBzcGFjZSBzaG91bGQgYmUgbWFkZSBlbXB0eSBzaW5jZSBhbGwgbWFjIGFkZGVzc2VzIG1vdmVkIG9uZSBzdGVwIHVwCisgICAgdm9zX21lbV96ZXJvKChtYWNMaXN0Kygqc2l6ZSktMSktPmJ5dGVzLCBzaXplb2Yodl9NQUNBRERSX3QpKTsKKyAgICAvL3JlZHVjZSB0aGUgbGlzdCBzaXplIGJ5IDEKKyAgICAoKnNpemUpLS07Cit9CisKK3ZvaWQgc2FwUHJpbnRBQ0wodl9NQUNBRERSX3QgKm1hY0xpc3QsIHZfVThfdCBzaXplKQoreworICAgIGludCBpOworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsInByaW50IGFjbCBlbnRlcmVkIik7ICAgIAorICAgIGlmIChzaXplPT0wKSByZXR1cm47CisgICAgZm9yIChpPTA7IGk8c2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAiKiogQUNMIGVudHJ5ICVpIC0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLCBpLCAKKyAgICAgICAgICAgICAgICAobWFjTGlzdCtpKS0+Ynl0ZXNbMF0sIChtYWNMaXN0K2kpLT5ieXRlc1sxXSwgKG1hY0xpc3QraSktPmJ5dGVzWzJdLAorICAgICAgICAgICAgICAgIChtYWNMaXN0K2kpLT5ieXRlc1szXSwgKG1hY0xpc3QraSktPmJ5dGVzWzRdLCAobWFjTGlzdCtpKS0+Ynl0ZXNbNV0pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK1ZPU19TVEFUVVMKK3NhcElzUGVlck1hY0FsbG93ZWQocHRTYXBDb250ZXh0IHNhcENvbnRleHQsIHZfVThfdCAqcGVlck1hYykKK3sKKyAgICBpZiAoZVNBUF9BTExPV19BTEwgPT0gc2FwQ29udGV4dC0+ZVNhcE1hY0FkZHJBY2xNb2RlKQorICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICAgaWYgKHNhcFNlYXJjaE1hY0xpc3Qoc2FwQ29udGV4dC0+YWNjZXB0TWFjTGlzdCwgc2FwQ29udGV4dC0+bkFjY2VwdE1hYywgcGVlck1hYywgTlVMTCkpCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBpZiAoc2FwU2VhcmNoTWFjTGlzdChzYXBDb250ZXh0LT5kZW55TWFjTGlzdCwgc2FwQ29udGV4dC0+bkRlbnlNYWMsIHBlZXJNYWMsIE5VTEwpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBQZWVyICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IGluIGRlbnkgbGlzdCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqcGVlck1hYywgKihwZWVyTWFjICsgMSksICoocGVlck1hYyArIDIpLCAqKHBlZXJNYWMgKyAzKSwgKihwZWVyTWFjICsgNCksICoocGVlck1hYyArIDUpKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIC8vIEEgbmV3IHN0YXRpb24gQ0FOIGFzc29jaWF0ZSwgdW5sZXNzIGluIGRlbnkgbGlzdC4gTGVzcyBzdHJpbmdlbnQgbW9kZQorICAgIGlmIChlU0FQX0FDQ0VQVF9VTkxFU1NfREVOSUVEID09IHNhcENvbnRleHQtPmVTYXBNYWNBZGRyQWNsTW9kZSkKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgIC8vIEEgbmV3IHN0YXRpb24gQ0FOTk9UIGFzc29jaWF0ZSwgdW5sZXNzIGluIGFjY2VwdCBsaXN0LiBNb3JlIHN0cmluZ2VudCBtb2RlCisgICAgaWYgKGVTQVBfREVOWV9VTkxFU1NfQUNDRVBURUQgPT0gc2FwQ29udGV4dC0+ZVNhcE1hY0FkZHJBY2xNb2RlKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBQZWVyICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IGRlbmllZCwgTWFjIGZpbHRlciBtb2RlIGlzIGVTQVBfREVOWV9VTkxFU1NfQUNDRVBURUQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgICpwZWVyTWFjLCAqKHBlZXJNYWMgKyAxKSwgKihwZWVyTWFjICsgMiksICoocGVlck1hYyArIDMpLCAqKHBlZXJNYWMgKyA0KSwgKihwZWVyTWFjICsgNSkpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogVGhlIG5ldyBTVEEgaXMgbmVpdGhlciBpbiBhY2NlcHQgbGlzdCBub3IgaW4gZGVueSBsaXN0LiBJbiB0aGlzIGNhc2UsIGRlbnkgdGhlIGFzc29jaWF0aW9uCisgICAgICogYnV0IHNlbmQgYSB3aWZpIGV2ZW50IG5vdGlmaWNhdGlvbiBpbmRpY2F0aW5nIHRoZSBtYWMgYWRkcmVzcyBiZWluZyBkZW5pZWQKKyAgICAgKi8KKyAgICBpZiAoZVNBUF9TVVBQT1JUX0FDQ0VQVF9BTkRfREVOWSA9PSBzYXBDb250ZXh0LT5lU2FwTWFjQWRkckFjbE1vZGUpCisgICAgeworICAgICAgICBzYXBTaWduYWxIRERldmVudChzYXBDb250ZXh0LCBOVUxMLCBlU0FQX1VOS05PV05fU1RBX0pPSU4sICh2X1BWT0lEX3QpcGVlck1hYyk7ICAgIAorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiSW4gJXMsIFBlZXIgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggZGVuaWVkLCBNYWMgZmlsdGVyIG1vZGUgaXMgZVNBUF9TVVBQT1JUX0FDQ0VQVF9BTkRfREVOWSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAgKnBlZXJNYWMsICoocGVlck1hYyArIDEpLCAqKHBlZXJNYWMgKyAyKSwgKihwZWVyTWFjICsgMyksICoocGVlck1hYyArIDQpLCAqKHBlZXJNYWMgKyA1KSk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmZGVmIFNPRlRBUF9DSEFOTkVMX1JBTkdFCitzdGF0aWMgVk9TX1NUQVRVUyBzYXBHZXRDaGFubmVsTGlzdChwdFNhcENvbnRleHQgc2FwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqKmNoYW5uZWxMaXN0LCB2X1U4X3QgKm51bWJlck9mQ2hhbm5lbHMpCit7CisgICAgdl9VMzJfdCBzdGFydENoYW5uZWxOdW07CisgICAgdl9VMzJfdCBlbmRDaGFubmVsTnVtOworICAgIHZfVTMyX3Qgb3BlcmF0aW5nQmFuZDsKKyAgICB2X1U4X3QgIGxvb3BDb3VudDsKKyAgICB2X1U4X3QgKmxpc3Q7CisgICAgdl9VOF90IGNoYW5uZWxDb3VudDsKKyAgICB2X1U4X3QgYmFuZFN0YXJ0Q2hhbm5lbDsKKyAgICB2X1U4X3QgYmFuZEVuZENoYW5uZWwgOworICAgIHZfVTMyX3QgZW5hYmxlTFRFQ29leDsKKyAgICB0SGFsSGFuZGxlIGhIYWwgPSBWT1NfR0VUX0hBTF9DQihzYXBDb250ZXh0LT5wdm9zR0N0eCk7CisKKyAgICBpZiAoTlVMTCA9PSBoSGFsKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICJJbnZhbGlkIEhBTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gc2FwR2V0Q2hhbm5lbExpc3QiKTsKKyAgICAgICAgKm51bWJlck9mQ2hhbm5lbHMgPSAwOworICAgICAgICAqY2hhbm5lbExpc3QgPSBOVUxMOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKyAgICAKKyAgICBjY21DZmdHZXRJbnQoaEhhbCwgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTCwgJnN0YXJ0Q2hhbm5lbE51bSk7CisgICAgY2NtQ2ZnR2V0SW50KGhIYWwsIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX0VORF9DSEFOTkVMLCAmZW5kQ2hhbm5lbE51bSk7CisgICAgY2NtQ2ZnR2V0SW50KGhIYWwsIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5ELCAmb3BlcmF0aW5nQmFuZCk7CisgICAgY2NtQ2ZnR2V0SW50KGhIYWwsIFdOSV9DRkdfRU5BQkxFX0xURV9DT0VYLCAmZW5hYmxlTFRFQ29leCk7CisgICAgCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzOnNhcEdldENoYW5uZWxMaXN0OiBzdGFydENoYW5uZWwgJWQsRW5kQ2hhbm5lbCAlZCxPcGVyYXRpbmdiYW5kOiVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sc3RhcnRDaGFubmVsTnVtLGVuZENoYW5uZWxOdW0sb3BlcmF0aW5nQmFuZCk7CisgICAgCisgICAgc3dpdGNoKG9wZXJhdGluZ0JhbmQpCisgICAgeworICAgICAgICBjYXNlIFJGX1NVQkJBTkRfMl80X0dIWjoKKyAgICAgICAgICAgYmFuZFN0YXJ0Q2hhbm5lbCA9IFJGX0NIQU5fMTsKKyAgICAgICAgICAgYmFuZEVuZENoYW5uZWwgPSBSRl9DSEFOXzE0OworICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgCisgICAgICAgIGNhc2UgUkZfU1VCQkFORF81X0xPV19HSFo6CisgICAgICAgICAgIGJhbmRTdGFydENoYW5uZWwgPSBSRl9DSEFOXzM2OworICAgICAgICAgICBiYW5kRW5kQ2hhbm5lbCA9IFJGX0NIQU5fNjQ7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAKKyAgICAgICAgY2FzZSBSRl9TVUJCQU5EXzVfTUlEX0dIWjoKKyAgICAgICAgICAgYmFuZFN0YXJ0Q2hhbm5lbCA9IFJGX0NIQU5fMTAwOworICAgICAgICAgICBiYW5kRW5kQ2hhbm5lbCA9IFJGX0NIQU5fMTQwOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgCisgICAgICAgIGNhc2UgUkZfU1VCQkFORF81X0hJR0hfR0haOgorICAgICAgICAgICBiYW5kU3RhcnRDaGFubmVsID0gUkZfQ0hBTl8xNDk7CisgICAgICAgICAgIGJhbmRFbmRDaGFubmVsID0gUkZfQ0hBTl8xNjU7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAKKyAgICAgICAgY2FzZSBSRl9TVUJCQU5EXzRfOV9HSFo6CisgICAgICAgICAgIGJhbmRTdGFydENoYW5uZWwgPSBSRl9DSEFOXzI0MDsKKyAgICAgICAgICAgYmFuZEVuZENoYW5uZWwgPSBSRl9DSEFOXzIxNjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAic2FwR2V0Q2hhbm5lbExpc3Q6T3BlcmF0aW5nQmFuZCBub3QgdmFsaWQgIik7CisgICAgICAgICAgIC8qIGFzc3VtZSAyLjQgR0h6ICovCisgICAgICAgICAgIGJhbmRTdGFydENoYW5uZWwgPSBSRl9DSEFOXzE7CisgICAgICAgICAgIGJhbmRFbmRDaGFubmVsID0gUkZfQ0hBTl8xNDsKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qQ2hlY2sgaWYgTFRFIGNvZXggaXMgZW5hYmxlZCBhbmQgMi40R0h6IGlzIHNlbGVjdGVkKi8KKyAgICBpZiAoZW5hYmxlTFRFQ29leCAmJiAoYmFuZFN0YXJ0Q2hhbm5lbCA9PSBSRl9DSEFOXzEpIAorICAgICAgICYmIChiYW5kRW5kQ2hhbm5lbCA9PSBSRl9DSEFOXzE0KSkKKyAgICB7CisgICAgICAgIC8qU2V0IDIuNEdIeiB1cHBlciBsaW1pdCB0byBjaGFubmVsIDkgZm9yIExURSBDT0VYKi8KKyAgICAgICAgYmFuZEVuZENoYW5uZWwgPSBSRl9DSEFOXzk7CisgICAgfSAgICAgIAorICAgIC8qIEFsbG9jYXRlIHRoZSBtYXggbnVtYmVyIG9mIGNoYW5uZWwgc3VwcG9ydGVkICovCisgICAgbGlzdCA9ICh2X1U4X3QgKil2b3NfbWVtX21hbGxvYyhOVU1fNUdIWl9DSEFOTkVMUyk7CisgICAgaWYgKE5VTEwgPT0gbGlzdCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBjaGFubmVsIGxpc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAqbnVtYmVyT2ZDaGFubmVscyA9IDA7CisgICAgICAgICpjaGFubmVsTGlzdCA9IE5VTEw7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTOworICAgIH0KKworICAgIC8qU2VhcmNoIGZvciB0aGUgQWN0aXZlIGNoYW5uZWxzIGluIHRoZSBnaXZlbiByYW5nZSAqLworICAgIGNoYW5uZWxDb3VudCA9IDA7CisgICAgZm9yKCBsb29wQ291bnQgPSBiYW5kU3RhcnRDaGFubmVsOyBsb29wQ291bnQgPD0gYmFuZEVuZENoYW5uZWw7IGxvb3BDb3VudCsrICkKKyAgICB7CisgICAgICAgIGlmKChzdGFydENoYW5uZWxOdW0gPD0gcmZDaGFubmVsc1tsb29wQ291bnRdLmNoYW5uZWxOdW0pJiYKKyAgICAgICAgICAgIChlbmRDaGFubmVsTnVtID49IHJmQ2hhbm5lbHNbbG9vcENvdW50XS5jaGFubmVsTnVtICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCByZWdDaGFubmVsc1tsb29wQ291bnRdLmVuYWJsZWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RbY2hhbm5lbENvdW50XSA9IHJmQ2hhbm5lbHNbbG9vcENvdW50XS5jaGFubmVsTnVtOyAKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoMCA9PSBjaGFubmVsQ291bnQpCisgICAgeyAKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAic2FwR2V0Q2hhbm5lbExpc3Q6Tm8gYWN0aXZlIGNoYW5uZWxzIHByZXNlbnQgaW4gdGhlIGdpdmVuIHJhbmdlIGZvciB0aGUgY3VycmVudCByZWdpb24iKTsKKyAgICAgICAgLypMVEUgQ09FWDogY2hhbm5lbCByYW5nZSBvdXRzaWRlIHRoZSByZXN0cmljdGVkIDIuNEdIeiBiYW5kIGxpbWl0cyovCisgICAgICAgIGlmIChlbmFibGVMVEVDb2V4ICYmIChzdGFydENoYW5uZWxOdW0gPiBiYW5kRW5kQ2hhbm5lbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICJzYXBHZXRDaGFubmVsTGlzdDpTQVAgY2Fubm90IGJlIHN0YXJ0ZWQgYXMgTFRFIENPRVggcmVzdHJpY3RlZCAyLjRHSHogbGltaXRzIik7CisgICAgICAgIH0KKyAgICB9CisgICAKKyAgICAvKiByZXR1cm4gdGhlIGNoYW5uZWwgbGlzdCBhbmQgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4qLworICAgICpudW1iZXJPZkNoYW5uZWxzID0gY2hhbm5lbENvdW50OworICAgIGlmKGNoYW5uZWxDb3VudCAhPSAwKQorICAgIHsgICAgICAgICAKKyAgICAgICAqY2hhbm5lbExpc3QgPSBsaXN0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICpjaGFubmVsTGlzdCA9IE5VTEw7CisgICAgICAgIHZvc19tZW1fZnJlZShsaXN0KTsKKyAgICB9CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9TQVAvc3JjL3NhcEZzbV9leHQuaCBiL0NPUkUvU0FQL3NyYy9zYXBGc21fZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwYjlmMwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU0FQL3NyYy9zYXBGc21fZXh0LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeSAKKyAqLworCisvKiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gYnRhbXBGc20uY2RkIC0gZG8gbm90IGVkaXQgbWFudWFsbHkqLworLyogR2VuZXJhdGVkIG9uOiBUaHUgT2N0IDE2IDE1OjQwOjM5IFBEVCAyMDA4ICovCisKKworI2lmbmRlZiBfX1NBUEZTTV9FWFRfSF9fCisjZGVmaW5lIF9fU0FQRlNNX0VYVF9IX18KKworLyogRXZlbnRzIHRoYXQgY2FuIGJlIHNlbnQgdG8gdGhlIFNBUCBzdGF0ZS1tYWNoaW5lICovCit0eXBlZGVmIGVudW0KK3sKKyAgZVNBUF9USU1FUl9DT05ORUNUX0FDQ0VQVF9USU1FT1VUPTBVLAorICBlU0FQX01BQ19DT05ORUNUX0NPTVBMRVRFRCwKKyAgZVNBUF9DSEFOTkVMX1NFTEVDVElPTl9GQUlMRUQsCisgIGVTQVBfTUFDX0NPTk5FQ1RfSU5ESUNBVElPTiwKKyAgZVNBUF9NQUNfS0VZX1NFVF9TVUNDRVNTLAorICBlU0FQX1JTTl9GQUlMVVJFLAorICBlU0FQX01BQ19TQ0FOX0NPTVBMRVRFLAorICBlU0FQX0hERF9TVEFSVF9JTkZSQV9CU1MsCisgIGVTQVBfTUFDX1JFQURZX0ZPUl9DT05ORUNUSU9OUywKKyAgZVNBUF9NQUNfU1RBUlRfQlNTX1NVQ0NFU1MsCisgIGVTQVBfTUFDX1NUQVJUX0JTU19GQUlMVVJFLAorICBlU0FQX1JTTl9TVUNDRVNTLAorICBlU0FQX01BQ19TVEFSVF9GQUlMUywKKyAgZVNBUF9IRERfU1RPUF9JTkZSQV9CU1MsCisgIGVTQVBfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQywKKworICBlU0FQX05PX01TRworfWVTYXBNc2dfdDsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvU0FQL3NyYy9zYXBJbnRlcm5hbC5oIGIvQ09SRS9TQVAvc3JjL3NhcEludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0ODY1NgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU0FQL3NyYy9zYXBJbnRlcm5hbC5oCkBAIC0wLDAgKzEsNzM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBXTEFOX1FDVF9XTEFOU0FQX0lOVEVSTkFMX0gKKyNkZWZpbmUgV0xBTl9RQ1RfV0xBTlNBUF9JTlRFUk5BTF9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgIFcgTCBBIE4gICBTIEEgUCAgUCBBIEwgICBMIEEgWSBFIFIgCisgICAgICAgICAgICAgICAgICAgICAgIEkgTiBUIEUgUiBOIEEgTCAgQSBQIEkKKworCitERVNDUklQVElPTgorICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludGVybmFsIEFQSSBleHBvc2VkIGJ5IHRoZSB3bGFuIFNBUCBQQUwgbGF5ZXIgCisgIG1vZHVsZS4KKworCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAkSGVhZGVyOiAvY3lnZHJpdmUvZC9CdWlsZHMvTTcyMDFKU0RDQUFQQUQ1MjI0MEIvV00vcGxhdGZvcm0vbXNtNzIwMC9TcmMvRHJpdmVycy9TRC9DbGllbnREcml2ZXJzL1dMQU4vUUNUX0JUQU1QX1JTTi9DT1JFL0JBUC9zcmMvYmFwSW50ZXJuYWwuaCx2IDEuNyAyMDA5LzAzLzA5IDA4OjUwOjQzIHJnaWR2YW5pIEV4cCByZ2lkdmFuaSAkICREYXRlVGltZTogJCAkQXV0aG9yOiBqem11ZGEgJAorCisKK3doZW4gICAgICAgICAgIHdobyAgICAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0gICAgIC0tLSAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA5LzE1LzA4ICAgIFNPRlRBUCAgICAgQ3JlYXRlZCBtb2R1bGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMgRk9SIE1PRFVMRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInZvc19hcGkuaCIgCisjaW5jbHVkZSAidm9zX3BhY2tldC5oIiAKKworLy8gUGljayB1cCB0aGUgQ1NSIEFQSSBkZWZpbml0aW9ucworI2luY2x1ZGUgImNzckFwaS5oIgorI2luY2x1ZGUgInNhcEFwaS5oIgorI2luY2x1ZGUgInNhcEZzbV9leHQuaCIKKyNpbmNsdWRlICJzYXBDaFNlbGVjdC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyAjZW5kaWYgCisgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIERlZmluZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTQVBfREVCVUcKKy8vIFVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgc2VjdXJpdHkgb24gdGhlIEJULUFNUCBsaW5rIAorI2RlZmluZSBXTEFOU0FQX1NFQ1VSSVRZX0VOQUJMRURfU1RBVEUgVk9TX1RSVUUKKy8vIEhvdyBkbyBJIGdldCBTQVAgY29udGV4dCBmcm9tIHZvc3MgY29udGV4dD8gCisjZGVmaW5lIFZPU19HRVRfU0FQX0NCKGN0eCkgdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX1NBUCwgY3R4KSAKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQykKKy8vIEhvdyBkbyBJIGdldCBoYWxIYW5kbGUgZnJvbSB2b3NzIGNvbnRleHQ/IAorI2RlZmluZSBWT1NfR0VUX0hBTF9DQihjdHgpIHZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9IQUwsIGN0eCkgCisjZWxzZQorI2RlZmluZSBWT1NfR0VUX0hBTF9DQihjdHgpIHZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9QRSwgY3R4KSAKKyNlbmRpZgorLy9NQUMgQWRkcmVzcyBsZW5ndGgKKyNkZWZpbmUgQU5JX0VBUE9MX0tFWV9SU05fTk9OQ0VfU0laRSAgICAgIDMyCisKK2V4dGVybiBzUmVndWxhdG9yeUNoYW5uZWwgKnJlZ0NoYW5uZWxzOworZXh0ZXJuIGNvbnN0IHRSZkNoYW5uZWxQcm9wcyByZkNoYW5uZWxzW05VTV9SRl9DSEFOTkVMU107CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFR5cGVkZWZzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNTYXBDb250ZXh0IHRTYXBDb250ZXh0OworLy8gdFNhcENvbnRleHQsICpwdFNhcENvbnRleHQ7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUeXBlIERlY2xhcmF0aW9ucyAtIEZvciBpbnRlcm5hbCBTQVAgY29udGV4dCBpbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPcGFxdWUgU0FQIGNvbnRleHQgVHlwZSBEZWNsYXJhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBXZSB3ZXJlIG9ubHkgdXNpbmcgdGhpcyBzeW50YXgsIHdoZW4gdGhpcyB3YXMgdHJ1bHkgb3BhcXVlLiAKKy8vIChJLkUuLCBpdCB3YXMgZGVmaW5lZCBpbiBhIGRpZmZlcmVudCBmaWxlLikKKworCisvKiBTQVAgRlNNIHN0YXRlcyBmb3IgQWNjZXNzIFBvaW50IHJvbGUgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgZVNBUF9ESVNDT05ORUNURUQsCisgICAgZVNBUF9DSF9TRUxFQ1QsCisgICAgZVNBUF9TVEFSVElORywKKyAgICBlU0FQX1NUQVJURUQsCisgICAgZVNBUF9ESVNDT05ORUNUSU5HCit9IGVTYXBGc21TdGF0ZXNfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgU0FQIGNvbnRleHQgRGF0YSBUeXBlIERlY2xhcmF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUeXBlIERlY2xhcmF0aW9ucyAtIFFPUyByZWxhdGVkCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFNBUCBRT1MgY29uZmlnICovCit0eXBlZGVmIHN0cnVjdCBzU2FwUW9zQ2ZnIHsKKyAgICB2X1U4X3QgICAgICAgICAgICAgIFdtbUlzRW5hYmxlZDsKK30gdFNhcFFvc0NmZzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NhcENvbnRleHQgeworCisgICAgdm9zX2xvY2tfdCAgICAgICAgICBTYXBHbG9iYWxMb2NrOworCisgICAgLy8gSW5jbHVkZSB0aGUgY3VycmVudCBjaGFubmVsIG9mIEFQCisgICAgdl9VMzJfdCAgICAgICAgICAgICBjaGFubmVsOworCisgICAgLy8gSW5jbHVkZSB0aGUgU01FKENTUikgc2Vzc2lvbklkIGhlcmUKKyAgICB2X1U4X3QgICAgICAgICAgICAgIHNlc3Npb25JZDsKKworICAgIC8vIEluY2x1ZGUgdGhlIGtleSBtYXRlcmlhbCBmb3IgdGhpcyBwaHlzaWNhbCBsaW5rCisgICAgdl9VOF90ICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB2X1U4X3QgICAgICAgICAgICAgIGtleV9sZW5ndGg7CisgICAgdl9VOF90ICAgICAgICAgICAgICBrZXlfbWF0ZXJpYWxbMzJdOworCisgICAgLy8gSW5jbHVkZSB0aGUgYXNzb2NpYXRpb25zIE1BQyBhZGRyZXNzZXMKKyAgICB2X1U4X3QgICAgICAgICAgICAgIHNlbGZfbWFjX2FkZHJbVk9TX01BQ19BRERSRVNTX0xFTl07CisKKyAgICAvLyBPd24gU1NJRCAgCisgICAgdl9VOF90ICAgICAgICAgICAgICBvd25Tc2lkW01BWF9TU0lEX0xFTl07CisgICAgdl9VMzJfdCAgICAgICAgICAgICBvd25Tc2lkTGVuOworCisgICAgLy8gRmxhZyBmb3Igc2lnbmFsaW5nIGlmIHNlY3VyaXR5IGlzIGVuYWJsZWQKKyAgICB2X1U4X3QgICAgICAgICAgICAgIHVjU2VjRW5hYmxlZDsKKworICAgIC8vIEluY2x1ZGUgdGhlIFNNRShDU1IpIGNvbnRleHQgaGVyZQorICAgIHRDc3JSb2FtUHJvZmlsZSAgICAgY3NyUm9hbVByb2ZpbGU7IAorICAgIHZfVTMyX3QgICAgICAgICAgICAgY3NyUm9hbUlkOworCisgICAgLy9TYXAgc2Vzc2lvbgorICAgIHRBTklfQk9PTEVBTiAgICAgICAgaXNTYXBTZXNzaW9uT3BlbjsKKworICAgIC8vIFNBUCBldmVudCBDYWxsYmFjayB0byBoZGQKKyAgICB0cFdMQU5fU0FQRXZlbnRDQiAgIHBmblNhcEV2ZW50Q2FsbGJhY2s7CisKKyAgICAvLyBJbmNsdWRlIHRoZSBlbmNsb3NpbmcgVk9TUyBjb250ZXh0IGhlcmUKKyAgICB2X1BWT0lEX3QgICAgICAgICAgIHB2b3NHQ3R4OyAKKworICAgIC8vIEluY2x1ZGUgdGhlIHN0YXRlIG1hY2hpbmUgc3RydWN0dXJlIGhlcmUsIHN0YXRlIHZhciB0aGF0IGtlZXBzIHRyYWNrIG9mIHN0YXRlIG1hY2hpbmUKKyAgICBlU2FwRnNtU3RhdGVzX3QgICAgIHNhcHNNYWNoaW5lOworCisgICAgLy8gQWN0dWFsIHN0b3JhZ2UgZm9yIEFQIGFuZCBzZWxmIChTVEEpIFNTSUQgCisgICAgdENzclNTSURJbmZvICAgICAgICBTU0lETGlzdFsyXTsKKworICAgIC8vIEFjdHVhbCBzdG9yYWdlIGZvciBBUCBic3NpZCAKKyAgICB0Q3NyQnNzaWQgICAgICAgICAgIGJzc2lkOworCisgICAgLy8gTWFjIGZpbHRlcmluZyBzZXR0aW5ncworICAgIGVTYXBNYWNBZGRyQUNMICAgICAgZVNhcE1hY0FkZHJBY2xNb2RlOworICAgIHZfTUFDQUREUl90ICAgICAgICAgYWNjZXB0TWFjTGlzdFtNQVhfTUFDX0FERFJFU1NfQUNDRVBURURdOworICAgIHZfVThfdCAgICAgICAgICAgICAgbkFjY2VwdE1hYzsKKyAgICB2X01BQ0FERFJfdCAgICAgICAgIGRlbnlNYWNMaXN0W01BWF9NQUNfQUREUkVTU19ERU5JRURdOworICAgIHZfVThfdCAgICAgICAgICAgICAgbkRlbnlNYWM7CisKKyAgICAvLyBRT1MgY29uZmlnCisgICAgdFNhcFFvc0NmZyAgICAgICAgU2FwUW9zQ2ZnOworCisgICAgdl9QVk9JRF90ICAgICAgICAgcFVzckNvbnRleHQ7CisKKyAgICB2X1UzMl90ICAgICAgICAgICBuU3RhV1BBUlNuUmVxSWVMZW5ndGg7CisgICAgdl9VOF90ICAgICAgICAgICAgcFN0YVdwYVJzblJlcUlFW01BWF9BU1NPQ19JTkRfSUVfTEVOXTsgCisgICAgdFNpckFQV1BTSUVzICAgICAgQVBXUFNJRXM7CisgICAgdFNpclJTTmllICAgICAgICAgQVBXUEFSU05JRXM7CisKKyAgICB2X1UzMl90ICAgICAgICAgICBuU3RhQWRkSWVMZW5ndGg7CisgICAgdl9VOF90ICAgICAgICAgICAgcFN0YUFkZElFW01BWF9BU1NPQ19JTkRfSUVfTEVOXTsgCisgICAgdl9VOF90ICAgICAgICAgICAgKmNoYW5uZWxMaXN0OworfSAqcHRTYXBDb250ZXh0OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEV4dGVybmFsIGRlY2xhcmF0aW9ucyBmb3IgZ2xvYmFsIGNvbnRleHQgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vICBUaGUgbWFpbiBwZXItUGh5c2ljYWwgTGluayAocGVyIFdMQU4gYXNzb2NpYXRpb24pIGNvbnRleHQuCitleHRlcm4gcHRTYXBDb250ZXh0ICBncFNhcEN0eDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgU0FQIHN0YXRlIG1hY2hpbmUgZXZlbnQgZGVmaW5pdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBUaGUgZXZlbnQgc3RydWN0dXJlICovIAordHlwZWRlZiBzdHJ1Y3Qgc1dMQU5fU0FQRXZlbnQgeworICAgIHZfUFZPSURfdCBwYXJhbXM7ICAgLyogQSBWT0lEIHBvaW50ZXIgdHlwZSBmb3IgYWxsIHBvc3NpYmxlIGlucHV0cyAqLworICAgIHZfVTMyX3QgICBldmVudDsgICAgLyogU3RhdGUgbWFjaGluZSBpbnB1dCBldmVudCBtZXNzYWdlICovCisgICAgdl9VMzJfdCAgIHUxOyAgICAgICAvKiBpbnRyb2R1Y2VkIHRvIGhhbmRsZSBjc3JSb2FtQ29tcGxldGVDYWxsYmFjayByb2FtU3RhdHVzICovCisgICAgdl9VMzJfdCAgIHUyOyAgICAgICAvKiBpbnRyb2R1Y2VkIHRvIGhhbmRsZSBjc3JSb2FtQ29tcGxldGVDYWxsYmFjayByb2FtUmVzdWx0ICovCit9IHRXTEFOX1NBUEV2ZW50LCAqcHRXTEFOX1NBUEV2ZW50OyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TY2FuQ2FsbGJhY2soKQorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxiYWNrIGZvciBTY2FuIChzY2FuIHJlc3VsdHMpIEV2ZW50cyAgCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB0SGFsSGFuZGxlOiAgdGhlIHRIYWxIYW5kbGUgcGFzc2VkIGluIHdpdGggdGhlIHNjYW4gcmVxdWVzdAorICAgICpwMjogdGhlIHNlY29uZCBjb250ZXh0IHBhc3MgaW4gZm9yIHRoZSBjYWxsZXIsIG9wYXF1ZSBzYXAgSGFuZGxlIGhlcmUKKyAgICBzY2FuSUQ6CisgICAgc3RhdHVzOiBTdGF0dXMgb2Ygc2NhbiAtc3VjY2VzcywgZmFpbHVyZSBvciBhYm9ydCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgZUhhbFN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitlSGFsU3RhdHVzCitXTEFOU0FQX1NjYW5DYWxsYmFjaworKAorICB0SGFsSGFuZGxlIGhhbEhhbmRsZSwgCisgIHZvaWQgKnBDb250ZXh0LAorICB2X1UzMl90IHNjYW5JRCwgCisgIGVDc3JTY2FuU3RhdHVzIHNjYW5TdGF0dXMKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOU0FQX1JvYW1DYWxsYmFjaygpCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGJhY2sgZm9yIFJvYW0gKGNvbm5lY3Rpb24gc3RhdHVzKSBFdmVudHMgIAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgICBwQ29udGV4dDogIGlzIHRoZSBwQ29udGV4dCBwYXNzZWQgaW4gd2l0aCB0aGUgcm9hbSByZXF1ZXN0CisgICAgICBwQ3NyUm9hbUluZm86IGlzIGEgcG9pbnRlciB0byBhIHRDc3JSb2FtSW5mbywgc2VlIGRlZmluaXRpb24gb2YgZVJvYW1DbWRTdGF0dXMgYW5kCisgICAgICBlUm9hbUNtZFJlc3VsdDogZm9yIGRldGFpbCB2YWxpZCBtZW1iZXJzLiBJdCBtYXkgYmUgTlVMTAorICAgICAgcm9hbUlkOiBpcyB0byBpZGVudGlmeSB0aGUgY2FsbGJhY2sgcmVsYXRlZCByb2FtIHJlcXVlc3QuIDAgbWVhbnMgdW5zb2xpY2l0ZWQKKyAgICAgIHJvYW1TdGF0dXM6IGlzIGEgZmxhZyBpbmRpY2F0aW5nIHRoZSBzdGF0dXMgb2YgdGhlIGNhbGxiYWNrCisgICAgICByb2FtUmVzdWx0OiBpcyB0aGUgcmVzdWx0CisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIGVIYWxTdGF0dXMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitlSGFsU3RhdHVzCitXTEFOU0FQX1JvYW1DYWxsYmFjaworKAorICB2b2lkICpwQ29udGV4dCwgCisgIHRDc3JSb2FtSW5mbyAqcENzclJvYW1JbmZvLAorICB2X1UzMl90IHJvYW1JZCwgCisgIGVSb2FtQ21kU3RhdHVzIHJvYW1TdGF0dXMsIAorICBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9DbGVhbkNCCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2xlYXIgb3V0IGFsbCBmaWVsZHMgaW4gdGhlIFNBUCBjb250ZXh0LgorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBTYXBDdHg6ICBwb2ludGVyIHRvIHRoZSBTQVAgY29udHJvbCBibG9jaworICAgIGZyZWVGbGFnOiAgIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGZyZWUgYW55IGFsbG9jYXRpb25zLgorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gU0FQIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOU0FQX0NsZWFuQ0IKKyggCisgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCwKKyAgdl9VMzJfdCBmcmVlRmxhZyAvKiBJZiAwIGRvIG5vdCBlbXB0eSAqLworKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOU2FwRnNtCisKKyAgREVTQ1JJUFRJT04gCisgICAgU0FQIGZvcndhcmQgc3RhdGUgbWFjaGluZSB0byBoYW5kbGUgdGhlIHN0YXRlcyBvZiB0aGUgU0FQIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHNhcENvbnRleHQ6ICBwb2ludGVyIHRvIHRoZSBTQVAgY29udHJvbCBibG9jaworICAgIHNhcEV2ZW50ICAgOiBTQVAgZXZlbnQKKyAgICBzdGF0dXMgOiBzdGF0dXMgb2YgU0FQIHN0YXRlIG1hY2hpbmUKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBTdGF0dXMgb2YgdGhlIFNBUCBmb3J3YXJkIG1hY2hpbmUKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gU0FQIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworVk9TX1NUQVRVUworU2FwRnNtCisoCisgICAgcHRTYXBDb250ZXh0IHNhcENvbnRleHQsIC8qIHNhcENvbnRleHQgdmFsdWUgKi8gICAgCisgICAgcHRXTEFOX1NBUEV2ZW50IHNhcEV2ZW50LCAvKiBTdGF0ZSBtYWNoaW5lIGV2ZW50ICovCisgICAgdl9VOF90ICpzdGF0dXMgICAgLyogcmV0dXJuIHRoZSBTQVAgc3RhdHVzIGhlcmUgKi8KKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOU0FQX3BtY0Z1bGxQd3JSZXFDQgorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxiYWNrIHByb3ZpZGUgdG8gUE1DIGluIHRoZSBwbWNSZXF1ZXN0RnVsbFBvd2VyIEFQSS4gICAgIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIGNhbGxiYWNrQ29udGV4dDogIFRoZSB1c2VyIHBhc3NlZCBpbiBhIGNvbnRleHQgdG8gaWRlbnRpZnkgCisgICAgc3RhdHVzOiAgICAgICAgICAgVGhlIGhhbFN0YXR1cyAgICAgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgTm9uZQorCisgIFNJREUgRUZGRUNUUyAKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIAorV0xBTlNBUF9wbWNGdWxsUHdyUmVxQ0IKKyggCisgIHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgCisgIGVIYWxTdGF0dXMgc3RhdHVzCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgc2FwU2VsZWN0Q2hhbm5lbAorCisgIERFU0NSSVBUSU9OIAorICAgIFJ1bnMgYSBhbGdvcml0aG0gdG8gc2VsZWN0IHRoZSBiZXN0IGNoYW5uZWwgdG8gb3BlcmF0ZSBpbiBmb3IgU29mdCBBUCBpbiAyLjRHSHogYmFuZAorCisgIERFUEVOREVOQ0lFUyAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICAgICBoYWxIYW5kbGUgOiBQb2ludGVyIHRvIEhBTCBoYW5kbGUKKyAgICAgICBwUmVzdWx0IDogUG9pbnRlciB0byB0U2NhblJlc3VsdEhhbmRsZQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIElmIFNVQ0NFU1MgY2hhbm5lbCBudW1iZXIgb3IgemVybyBmb3IgRkFJTFVSRS4KKworICBTSURFIEVGRkVDVFMgCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9VOF90IHNhcFNlbGVjdENoYW5uZWwodEhhbEhhbmRsZSBoYWxIYW5kbGUsIHRTY2FuUmVzdWx0SGFuZGxlIHBTY2FuUmVzdWx0KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIHNhcFNpZ25hbEhERGV2ZW50CisKKyAgREVTQ1JJUFRJT04gCisgICAgU0FQIEhERCBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorCisgIERFUEVOREVOQ0lFUyAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICAgICBzYXBDb250ZXh0IDogUG9pbnRlciB0byBTQVAgaGFuZGxlCisgICAgICAgcENzclJvYW1JbmZvIDogY3NyUm9hbXByb2ZpbGUgCisgICAgICAgc2FwSGRkZXZlbnQgICAgOiBTQVAgSEREIGNhbGxiYWNrIGV2ZW50CisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgSWYgU1VDQ0VTUyBvciBGQUlMVVJFLgorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworVk9TX1NUQVRVUworc2FwU2lnbmFsSEREZXZlbnQoIHB0U2FwQ29udGV4dCBzYXBDb250ZXh0LCB0Q3NyUm9hbUluZm8gKiBwQ3NyUm9hbUluZm8sIGVTYXBIZGRFdmVudCBzYXBIZGRldmVudCwgdm9pZCAqKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIHNhcEZzbQorCisgIERFU0NSSVBUSU9OIAorICAgIFNBUCBGb3J3YXJkIHN0YXRlIG1hY2hpbmUKKworICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgICAgIHNhcENvbnRleHQgOiBQb2ludGVyIHRvIFNBUCBoYW5kbGUKKyAgICAgICBzYXBFdmVudCA6IHN0YXRlIG1hY2hpbmUgZXZlbnQKKworIFJFVFVSTiBWQUxVRQorICAgIElmIFNVQ0NFU1Mgb3IgRkFJTFVSRS4KKworICBTSURFIEVGRkVDVFMgCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworc2FwRnNtCisoCisgICAgcHRTYXBDb250ZXh0IHNhcENvbnRleHQsICAgIC8qIHNhcENvbnRleHQgdmFsdWUgKi8KKyAgICBwdFdMQU5fU0FQRXZlbnQgc2FwRXZlbnQgICAvKiBTdGF0ZSBtYWNoaW5lIGV2ZW50ICovCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgc2FwQ29udmVydFRvQ3NyUHJvZmlsZQorCisgIERFU0NSSVBUSU9OIAorICAgIHNhcENvbnZlcnRUb0NzclByb2ZpbGUKKworICBERVBFTkRFTkNJRVMgCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgICAgcGNvbmZpZ19wYXJhbXMgOiBQb2ludGVyIHRvIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICAgICAgYnNzVHlwZSA6IFNvZnRBUCB0eXBlCisgICAgICAgcHJvZmlsZSA6IHBvaW50ZXIgdG8gYSBjc3JQcm9maWxlIHRoYXQgbmVlZHMgdG8gYmUgcGFzc2VkCisKKyBSRVRVUk4gVkFMVUUKKyAgICBJZiBTVUNDRVNTIG9yIEZBSUxVUkUuCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworZVNhcFN0YXR1cworc2FwY29udmVydFRvQ3NyUHJvZmlsZSh0c2FwX0NvbmZpZ190ICpwY29uZmlnX3BhcmFtcywgZUNzclJvYW1Cc3NUeXBlIGJzc1R5cGUsIHRDc3JSb2FtUHJvZmlsZSAqcHJvZmlsZSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBzYXBGcmVlUm9hbVByb2ZpbGUKKworICBERVNDUklQVElPTiAKKyAgICBzYXBDb252ZXJ0VG9Dc3JQcm9maWxlCisKKyAgREVQRU5ERU5DSUVTIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgICAgIHByb2ZpbGUgOiBwb2ludGVyIHRvIGEgY3NyUHJvZmlsZSB0aGF0IG5lZWRzIHRvIGJlIGZyZWVkCisKKyBSRVRVUk4gVkFMVUUKKyAgICBJZiBTVUNDRVNTIG9yIEZBSUxVUkUuCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBzYXBGcmVlUm9hbVByb2ZpbGUodENzclJvYW1Qcm9maWxlICpwcm9maWxlKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIHNhcElzUGVlck1hY0FsbG93ZWQKKworICBERVNDUklQVElPTiAKKyAgICBGdW5jdGlvbiB0byBpbXBsZW1lbnQgTUFDIGZpbHRlcmluZyBmb3Igc3RhdGlvbiBhc3NvY2lhdGlvbiBpbiBTb2Z0QVAKKworICBERVBFTkRFTkNJRVMgCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgICAgc2FwQ29udGV4dCA6IFBvaW50ZXIgdG8gU0FQIGhhbmRsZQorICAgICAgIHBlZXJNYWMgICAgOiBNYWMgYWRkcmVzcyBvZiB0aGUgcGVlcgorCisgUkVUVVJOIFZBTFVFCisgICAgSWYgU1VDQ0VTUyBvciBGQUlMVVJFLgorCisgIFNJREUgRUZGRUNUUyAKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitzYXBJc1BlZXJNYWNBbGxvd2VkKHB0U2FwQ29udGV4dCBzYXBDb250ZXh0LCB2X1U4X3QgKnBlZXJNYWMpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgc2FwU29ydE1hY0xpc3QKKworICBERVNDUklQVElPTiAKKyAgICBGdW5jdGlvbiB0byBpbXBsZW1lbnQgc29ydGluZyBvZiBNQUMgYWRkcmVzc2VzCisKKyAgREVQRU5ERU5DSUVTIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgICAgIG1hY0xpc3QgOiBQb2ludGVyIHRvIG1hYyBhZGRyZXNzIGFycmF5CisgICAgICAgc2l6ZSAgICA6IE51bWJlciBvZiBlbnRyaWVzIGluIG1hYyBhZGRyZXNzIGFycmF5CisKKyBSRVRVUk4gVkFMVUUKKyAgICBOb25lCisKKyAgU0lERSBFRkZFQ1RTIAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQKK3NhcFNvcnRNYWNMaXN0KHZfTUFDQUREUl90ICptYWNMaXN0LCB2X1U4X3Qgc2l6ZSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBzYXBBZGRNYWNUb0FDTAorCisgIERFU0NSSVBUSU9OIAorICAgIEZ1bmN0aW9uIHRvIEFERCBhIG1hYyBhZGRyZXNzIGluIGFuIEFDTC4KKyAgICBUaGUgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IHRoZSBBQ0wgbGlzdCByZW1haW5zIHNvcnRlZCBhZnRlciB0aGUgYWRkaXRpb24uCisgICAgVGhpcyBBUEkgZG9lcyBub3QgdGFrZSBjYXJlIG9mIGJ1ZmZlciBvdmVyZmxvdyBpLmUuIGlmIHRoZSBsaXN0IGlzIGFscmVhZHkgbWF4ZWQgb3V0IHdoaWxlIGFkZGluZyBhIG1hYyBhZGRyZXNzLAorICAgIGl0IHdpbGwgc3RpbGwgdHJ5IHRvIGFkZC4gCisgICAgVGhlIGNhbGxlciBtdXN0IHRha2UgY2FyZSB0aGF0IHRoZSBBQ0wgc2l6ZSBpcyBsZXNzIHRoYW4gTUFYX01BQ19BRERSRVNTX0FDQ0VQVEVEIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisKKyAgREVQRU5ERU5DSUVTIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgICAgIG1hY0xpc3QgICAgICAgICAgOiBBQ0wgbGlzdCBvZiBtYWMgYWRkcmVzc2VzIChibGFjay93aGl0ZSBsaXN0KQorICAgICAgIHNpemUgKEkvTykgICAgICAgOiBzaXplIG9mIHRoZSBBQ0wuIEl0IGlzIGFuIEkvTyBhcmcuIFRoZSBBUEkgdGFrZXMgY2FyZSBvZiBpbmNyZW1lbnRpbmcgdGhlIHNpemUgYnkgMS4KKyAgICAgICBwZWVyTWFjICAgICAgICAgIDogTWFjIGFkZHJlc3Mgb2YgdGhlIHBlZXIgdG8gYmUgYWRkZWQKKworIFJFVFVSTiBWQUxVRQorICAgIE5vbmUuCisKKyAgU0lERSBFRkZFQ1RTIAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQKK3NhcEFkZE1hY1RvQUNMKHZfTUFDQUREUl90ICptYWNMaXN0LCB2X1U4X3QgKnNpemUsIHZfVThfdCAqcGVlck1hYyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBzYXBSZW1vdmVNYWNGcm9tQUNMCisKKyAgREVTQ1JJUFRJT04gCisgICAgRnVuY3Rpb24gdG8gUkVNT1ZFIGEgbWFjIGFkZHJlc3MgZnJvbSBhbiBBQ0wuCisgICAgVGhlIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCB0aGUgQUNMIGxpc3QgcmVtYWlucyBzb3J0ZWQgYWZ0ZXIgdGhlIERFTEVUSU9OLgorCisgIERFUEVOREVOQ0lFUyAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICAgICBtYWNMaXN0ICAgICAgICAgIDogQUNMIGxpc3Qgb2YgbWFjIGFkZHJlc3NlcyAoYmxhY2svd2hpdGUgbGlzdCkKKyAgICAgICBzaXplIChJL08pICAgICAgIDogc2l6ZSBvZiB0aGUgQUNMLiBJdCBpcyBhbiBJL08gYXJnLiBUaGUgQVBJIHRha2VzIGNhcmUgb2YgZGVjcmVtZW50aW5nIHRoZSBzaXplIGJ5IDEuCisgICAgICAgaW5kZXggICAgICAgICAgICA6IGluZGV4IGluIHRoZSBBQ0wgbGlzdCB3aGVyZSB0aGUgcGVlck1hYyBpcyBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaW5kZXggY2FuIGJlIGZvdW5kIGJ5IHVzaW5nIHRoZSAic2FwU2VhcmNoTWFjTGlzdCIgQVBJIHdoaWNoIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBNQUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwgaWYgZm91bmQgaW4gYW4gQUNMLCBpbiBvbmUgb2YgdGhlIGFyZ3VtZW50cyBwYXNzZWQgYnkgdGhlIGNhbGxlci4KKworIFJFVFVSTiBWQUxVRQorICAgIE5vbmUuCisKKyAgU0lERSBFRkZFQ1RTIAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQKK3NhcFJlbW92ZU1hY0Zyb21BQ0wodl9NQUNBRERSX3QgKm1hY0xpc3QsIHZfVThfdCAqc2l6ZSwgdl9VOF90IGluZGV4KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIHNhcFByaW50QUNMCisKKyAgREVTQ1JJUFRJT04gCisgICAgRnVuY3Rpb24gdG8gcHJpbnQgYWxsIHRoZSBtYWMgYWRkcmVzcyBvZiBhbiBBQ0wuCisgICAgVXNlZnVsIGZvciBkZWJ1Zy4KKyAgICAKKyAgREVQRU5ERU5DSUVTIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgICAgIG1hY0xpc3QgICAgICAgICAgOiBBQ0wgbGlzdCBvZiBtYWMgYWRkcmVzc2VzIChibGFjay93aGl0ZSBsaXN0KQorICAgICAgIHNpemUgICAgICAgICAgICAgOiBzaXplIG9mIHRoZSBBQ0wKKworIFJFVFVSTiBWQUxVRQorICAgIE5vbmUuCisKKyAgU0lERSBFRkZFQ1RTIAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgCitzYXBQcmludEFDTCh2X01BQ0FERFJfdCAqbWFjTGlzdCwgdl9VOF90IHNpemUpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgc2FwU2VhcmNoTWFjTGlzdAorCisgIERFU0NSSVBUSU9OIAorICAgIEZ1bmN0aW9uIHRvIHNlYXJjaCBmb3IgYSBtYWMgYWRkcmVzcyBpbiBhbiBBQ0wKKworICBERVBFTkRFTkNJRVMgCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgICAgbWFjTGlzdCAgICAgICAgICA6IGxpc3Qgb2YgbWFjIGFkZHJlc3NlcyAoYmxhY2svd2hpdGUgbGlzdCkKKyAgICAgICBudW1fbWFjICAgICAgICAgIDogc2l6ZSBvZiB0aGUgQUNMCisgICAgICAgcGVlck1hYyAgICAgICAgICA6IE1hYyBhZGRyZXNzIG9mIHRoZSBwZWVyCisgICAgT1AgICAgICAgCisgICAgICAgaW5kZXggICAgICAgICAgICA6IHRoZSBpbmRleCBhdCB3aGljaCB0aGUgcGVlciBtYWMgaXMgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUgZ2V0cyBmaWxsZWQgaW4gdGhpcyBmdW5jdGlvbi4gSWYgdGhlIGNhbGxlciBpcyBub3QgaW50ZXJlc3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGluZGV4IG9mIHRoZSBwZWVyTWFjIHRvIGJlIHNlYXJjaGVkLCBpdCBjYW4gcGFzcyBOVUxMIGhlcmUuCisKKyBSRVRVUk4gVkFMVUUKKyAgICBTVUNDRVNTICAgICAgICAgIDogaWYgdGhlIG1hYyBhZGRyIGJlaW5nIHNlYXJjaGVkIGZvciBpcyBmb3VuZAorICAgIEZBSUxVUkUgICAgICAgICAgOiBpZiB0aGUgbWFjIGFkZHIgYmVpbmcgc2VhcmNoZWQgZm9yIGlzIE5PVCBmb3VuZAorCisgIFNJREUgRUZGRUNUUyAKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitlU2FwQm9vbAorc2FwU2VhcmNoTWFjTGlzdCh2X01BQ0FERFJfdCAqbWFjTGlzdCwgdl9VOF90IG51bV9tYWMsIHZfVThfdCAqcGVlck1hYywgdl9VOF90ICppbmRleCk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIHNhcF9BY3F1aXJlR2xvYmFsTG9jaworCisgIERFU0NSSVBUSU9OIAorICAgIEZ1bmN0aW9uIHRvIGltcGxlbWVudCBhY3F1aXJlIFNBUCBnbG9iYWwgbG9jaworCisgIERFUEVOREVOQ0lFUyAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICAgICBzYXBDb250ZXh0IDogUG9pbnRlciB0byBTQVAgaGFuZGxlCisgICAgICAgcGVlck1hYyAgICA6IE1hYyBhZGRyZXNzIG9mIHRoZSBwZWVyCisKKyBSRVRVUk4gVkFMVUUKKyAgICBJZiBTVUNDRVNTIG9yIEZBSUxVUkUuCisKKyAgU0lERSBFRkZFQ1RTIAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK3NhcF9BY3F1aXJlR2xvYmFsTG9jayggcHRTYXBDb250ZXh0ICBwU2FwQ3R4ICk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBzYXBJc1BlZXJNYWNBbGxvd2VkCisKKyAgREVTQ1JJUFRJT04gCisgICAgRnVuY3Rpb24gdG8gaW1wbGVtZW50IHJlbGVhc2UgU0FQIGdsb2JhbCBsb2NrCisKKyAgREVQRU5ERU5DSUVTIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgICAgIHNhcENvbnRleHQgOiBQb2ludGVyIHRvIFNBUCBoYW5kbGUKKyAgICAgICBwZWVyTWFjICAgIDogTWFjIGFkZHJlc3Mgb2YgdGhlIHBlZXIKKworIFJFVFVSTiBWQUxVRQorICAgIElmIFNVQ0NFU1Mgb3IgRkFJTFVSRS4KKworICBTSURFIEVGRkVDVFMgCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworc2FwX1JlbGVhc2VHbG9iYWxMb2NrKCBwdFNhcENvbnRleHQgIHBTYXBDdHggKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgCisjZW5kaWYgLyogI2lmbmRlZiBXTEFOX1FDVF9XTEFOU0FQX0lOVEVSTkFMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9TQVAvc3JjL3NhcE1vZHVsZS5jIGIvQ09SRS9TQVAvc3JjL3NhcE1vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTc1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NBUC9zcmMvc2FwTW9kdWxlLmMKQEAgLTAsMCArMSwyMzAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIHMgYSBwIE0gbyBkIHUgbCBlIC4gQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgT1ZFUlZJRVc6CisgIAorICBUaGlzIHNvZnR3YXJlIHVuaXQgaG9sZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXTEFOIFNBUCBtb2R1bGVzCisgIGZ1bmN0aW9ucyBwcm92aWRpbmcgRVhURVJOQUwgQVBJcy4gSXQgaXMgYWxzbyB3aGVyZSB0aGUgZ2xvYmFsIFNBUCBtb2R1bGUKKyAgY29udGV4dCBnZXRzIGluaXRpYWxpc2VkCisgIAorICBERVBFTkRFTkNJRVM6IAorCisgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorICAKKyAgQ29weXJpZ2h0IChjKSAyMDEwIFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworCisgIHdoZW4gICAgICAgICAgICAgICB3aG8gICAgICAgICAgICAgICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tLS0gICAgICAgLS0tICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMy8xNS8xMCAgICAgU09GVEFQIHRlYW0gICAgICAgICAgICBDcmVhdGVkIG1vZHVsZQorMDYvMDMvMTAgICAgIGpzICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCB0byBob3N0YXBkIGRyaXZlbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYXV0aC9kaXNhc3NvYy9taWMgZmFpbHVyZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIndsYW5fcWN0X3RsLmgiCisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisKKy8vIFBpY2sgdXAgdGhlIHNtZSBjYWxsYmFjayByZWdpc3RyYXRpb24gQVBJCisjaW5jbHVkZSAic21lX0FwaS5oIgorCisvLyBTQVAgQVBJIGhlYWRlciBmaWxlCisKKyNpbmNsdWRlICJzYXBJbnRlcm5hbC5oIgorI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQykKKyNpbmNsdWRlICJoYWxJbnRlcm5hbC5oIgorI2VuZGlmCisjaW5jbHVkZSAic21lSW5zaWRlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTQVBfREVCVUcKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHbG9iYWwgRGF0YSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEV4dGVybmFsIGRlY2xhcmF0aW9ucyBmb3IgZ2xvYmFsIGNvbnRleHQgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vICBObyEgIEdldCB0aGlzIGZyb20gVk9TLgorLy8gIFRoZSBtYWluIHBlci1QaHlzaWNhbCBMaW5rIChwZXIgV0xBTiBhc3NvY2lhdGlvbikgY29udGV4dC4KK3B0U2FwQ29udGV4dCAgZ3BTYXBDdHggPSBOVUxMOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsaXplZCBGdW5jdGlvbiBEZWZpbml0aW9ucworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfT3BlbgorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBhdCBkcml2ZXIgaW5pdGlhbGl6YXRpb24gKHZvc19vcGVuKS4gU0FQIHdpbGwgaW5pdGlhbGl6ZSAKKyAgICBhbGwgaXRzIGludGVybmFsIHJlc291cmNlcyBhbmQgd2lsbCB3YWl0IGZvciB0aGUgY2FsbCB0byBzdGFydCB0byAKKyAgICByZWdpc3RlciB3aXRoIHRoZSBvdGhlciBtb2R1bGVzLiAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eCAgICA6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgCisgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6IFBvaW50ZXIgdG8gU0FQIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKworICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5TQVBfT3BlbgorKAorICAgIHZfUFZPSURfdCBwdm9zR0N0eAorKQoreworCisgICAgcHRTYXBDb250ZXh0ICBwU2FwQ3R4ID0gTlVMTDsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKyAgICBWT1NfQVNTRVJUKHB2b3NHQ3R4KTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFsbG9jYXRlIChhbmQgc2FuaXR5IGNoZWNrPyEpIFNBUCBjb250cm9sIGJsb2NrIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgdm9zX2FsbG9jX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfU0FQLCAodl9WT0lEX3QgKiopJnBTYXBDdHgsIHNpemVvZih0U2FwQ29udGV4dCkpOworCisgICAgaWYgKE5VTEwgPT0gcFNhcEN0eCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgdm9zX21lbV96ZXJvKHBTYXBDdHgsIHNpemVvZih0U2FwQ29udGV4dCkpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgQ2xlYW4gdXAgU0FQIGNvbnRyb2wgYmxvY2ssIGluaXRpYWxpemUgYWxsIHZhbHVlcworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5TQVBfT3BlbiIpOworCisgICAgV0xBTlNBUF9DbGVhbkNCKHBTYXBDdHgsIDAgLypkbyBub3QgZW1wdHkqLyk7CisKKyAgICAvLyBTZXR1cCB0aGUgImxpbmsgYmFjayIgdG8gdGhlIFZPU1MgY29udGV4dAorICAgIHBTYXBDdHgtPnB2b3NHQ3R4ID0gcHZvc0dDdHg7CisKKyAgICAvLyBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIFNBUCBjb250ZXh0IHByb3ZpZGVkIGJ5IFZPU1MKKyAgICBncFNhcEN0eCA9IHBTYXBDdHg7CisgICAKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBBbGxvY2F0ZSBpbnRlcm5hbCByZXNvdXJjZXMKKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vLyBXTEFOU0FQX09wZW4KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX1N0YXJ0CisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgc3RhcnQgcHJvY2VkdXJlICh2b3Nfc3RhcnQpLiBTQVAgd2lsbCAKKyAgICB1c2UgdGhpcyBjYWxsIHRvIHJlZ2lzdGVyIHdpdGggVEwgYXMgdGhlIFNBUCBlbnRpdHkgZm9yIAorICAgIFNBUCBSU04gZnJhbWVzLiAKKworICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4ICAgIDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBTQVAncyAKKyAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogUG9pbnRlciB0byBTQVAgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogU3VjY2VzcworCisgIFNJREUgRUZGRUNUUworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK1ZPU19TVEFUVVMgCitXTEFOU0FQX1N0YXJ0CisoIAorICAgIHZfUFZPSURfdCAgcHZvc0dDdHggCispCit7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICJXTEFOU0FQX1N0YXJ0IGludm9rZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTYW5pdHkgY2hlY2sKKyAgICAgICAgRXh0cmFjdCBTQVAgY29udHJvbCBibG9jayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQihwdm9zR0N0eCk7CisgICAgaWYgKCBOVUxMID09IHBTYXBDdHggKSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRm9yIG5vdywgcHJlc3VtZSBzZWN1cml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcFNhcEN0eC0+dWNTZWNFbmFibGVkID0gV0xBTlNBUF9TRUNVUklUWV9FTkFCTEVEX1NUQVRFOworCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBOb3cgY29uZmlndXJlIHRoZSByb2FtaW5nIHByb2ZpbGUgbGlua3MuIFRvIFNTSUQgYW5kIGJzc2lkLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLy8gV2UgaGF2ZSByb29tIGZvciB0d28gU1NJRHMuICAKKyAgICBwU2FwQ3R4LT5jc3JSb2FtUHJvZmlsZS5TU0lEcy5udW1PZlNTSURzID0gMTsgLy8gVGhpcyBpcyB0cnVlIGZvciBub3cuICAKKyAgICBwU2FwQ3R4LT5jc3JSb2FtUHJvZmlsZS5TU0lEcy5TU0lETGlzdCA9IHBTYXBDdHgtPlNTSURMaXN0OyAgLy9BcnJheSBvZiB0d28gIAorICAgIHBTYXBDdHgtPmNzclJvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0WzBdLlNTSUQubGVuZ3RoID0gMDsKKyAgICBwU2FwQ3R4LT5jc3JSb2FtUHJvZmlsZS5TU0lEcy5TU0lETGlzdFswXS5oYW5kb2ZmUGVybWl0dGVkID0gVk9TX0ZBTFNFOworICAgIHBTYXBDdHgtPmNzclJvYW1Qcm9maWxlLlNTSURzLlNTSURMaXN0WzBdLnNzaWRIaWRkZW4gPSBwU2FwQ3R4LT5TU0lETGlzdFswXS5zc2lkSGlkZGVuOworCisgICAgcFNhcEN0eC0+Y3NyUm9hbVByb2ZpbGUuQlNTSURzLm51bU9mQlNTSURzID0gMTsgLy8gVGhpcyBpcyB0cnVlIGZvciBub3cuICAKKyAgICBwU2FwQ3R4LT5jc3JSb2FtUHJvZmlsZS5CU1NJRHMuYnNzaWQgPSAmcFNhcEN0eC0+YnNzaWQ7ICAKKworICAgIC8vIE5vdyBjb25maWd1cmUgdGhlIGF1dGggdHlwZSBpbiB0aGUgcm9hbWluZyBwcm9maWxlLiBUbyBvcGVuLgorICAgIHBTYXBDdHgtPmNzclJvYW1Qcm9maWxlLm5lZ290aWF0ZWRBdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOyAvLyBvcGVuIGlzIHRoZSBkZWZhdWx0CisgICAgCisgICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc19sb2NrX2luaXQoICZwU2FwQ3R4LT5TYXBHbG9iYWxMb2NrKSkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJXTEFOU0FQX1N0YXJ0IGZhaWxlZCBpbml0IGxvY2tcbiIpOyAgICAgICAgCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisKKyNlbmRpZiAKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlNBUF9TdGFydCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TdG9wCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGJ5IHZvc19zdG9wIHRvIHN0b3Agb3BlcmF0aW9uIGluIFNBUCwgYmVmb3JlIGNsb3NlLiBTQVAgd2lsbCBzdXNwZW5kIGFsbCAKKyAgICBCVC1BTVAgUHJvdG9jb2wgQWRhcHRpb24gTGF5ZXIgb3BlcmF0aW9uIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjbG9zZSAKKyAgICByZXF1ZXN0IHRvIGNsZWFuIHVwIGl0cyByZXNvdXJjZXMuIAorCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHggICAgOiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIAorICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBQb2ludGVyIHRvIFNBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiBTdWNjZXNzCisKKyAgU0lERSBFRkZFQ1RTCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOU0FQX1N0b3AKKyggCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eCAKKykKK3sKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBwdFNhcENvbnRleHQgIHBTYXBDdHggPSBOVUxMOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU2FuaXR5IGNoZWNrCisgICAgICAgIEV4dHJhY3QgU0FQIGNvbnRyb2wgYmxvY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICJXTEFOU0FQX1N0b3AgaW52b2tlZCBzdWNjZXNzZnVsbHkgIik7CisKKyAgICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworICAgIGlmIChOVUxMID09IHBTYXBDdHgpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIHNhcEZyZWVSb2FtUHJvZmlsZSgmcFNhcEN0eC0+Y3NyUm9hbVByb2ZpbGUpOworICAgIAorICAgIGlmKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NfbG9ja19kZXN0cm95KCAmcFNhcEN0eC0+U2FwR2xvYmFsTG9jayApICkgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiV0xBTlNBUF9TdG9wIGZhaWxlZCBkZXN0cm95IGxvY2tcbiIpOyAgICAgICAgCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFN0b3AgU0FQIChkZS1yZWdpc3RlciBSU04gaGFuZGxlciE/KSAgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZgorCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOU0FQX1N0b3AgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX0Nsb3NlCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGJ5IHZvc19jbG9zZSBkdXJpbmcgZ2VuZXJhbCBkcml2ZXIgY2xvc2UgcHJvY2VkdXJlLiBTQVAgd2lsbCBjbGVhbiB1cCAKKyAgICBhbGwgdGhlIGludGVybmFsIHJlc291cmNlcy4gCisKKyAgREVQRU5ERU5DSUVTIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4ICAgIDogUG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBTQVAncyAKKyAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogUG9pbnRlciB0byBTQVAgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogU3VjY2VzcworCisgIFNJREUgRUZGRUNUUworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTlNBUF9DbG9zZQorKCAKKyAgICB2X1BWT0lEX3QgIHB2b3NHQ3R4IAorKQoreworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBwdFNhcENvbnRleHQgIHBTYXBDdHggPSBOVUxMOworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU2FuaXR5IGNoZWNrCisgICAgICAgIEV4dHJhY3QgU0FQIGNvbnRyb2wgYmxvY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAiV0xBTlNBUF9DbG9zZSBpbnZva2VkIik7CisKKyAgICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworICAgIGlmIChOVUxMID09IHBTYXBDdHgpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIENsZWFudXAgU0FQIGNvbnRyb2wgYmxvY2suIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldMQU5TQVBfQ2xvc2UiKTsKKyAgICBXTEFOU0FQX0NsZWFuQ0IocFNhcEN0eCwgVk9TX1RSVUUgLyogZW1wdHkgcXVldWVzL2xpc3RzL3BrdHMgaWYgYW55Ki8pOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRnJlZSBTQVAgY29udGV4dCBmcm9tIFZPU1MgZ2xvYmFsIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgdm9zX2ZyZWVfY29udGV4dChwdm9zR0N0eCwgVk9TX01PRFVMRV9JRF9TQVAsIHBTYXBDdHgpOworCisjZW5kaWYKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5TQVBfQ2xvc2UgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBVdGlsaXR5IEZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9DbGVhbkNCCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2xlYXIgb3V0IGFsbCBmaWVsZHMgaW4gdGhlIFNBUCBjb250ZXh0LgorCisgIERFUEVOREVOQ0lFUyAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eCAgICA6IFBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gU0FQJ3MgCisgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6IFBvaW50ZXIgdG8gU0FQIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6IFN1Y2Nlc3MKKworICBTSURFIEVGRkVDVFMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5TQVBfQ2xlYW5DQgorKCAKKyAgICBwdFNhcENvbnRleHQgIHBTYXBDdHgsCisgICAgdl9VMzJfdCBmcmVlRmxhZyAvLyAwIC8qZG8gbm90IGVtcHR5Ki8pOworKQoreworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTYW5pdHkgY2hlY2sgU0FQIGNvbnRyb2wgYmxvY2sgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmIChOVUxMID09IHBTYXBDdHgpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBDbGVhbiB1cCBTQVAgY29udHJvbCBibG9jaywgaW5pdGlhbGl6ZSBhbGwgdmFsdWVzCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiV0xBTlNBUF9DbGVhbkNCIik7CisKKyAgICB2b3NfbWVtX3plcm8oIHBTYXBDdHgsIHNpemVvZih0U2FwQ29udGV4dCkpOworCisgICAgcFNhcEN0eC0+cHZvc0dDdHggPSBOVUxMOworCisgICAgcFNhcEN0eC0+c2Fwc01hY2hpbmU9IGVTQVBfRElTQ09OTkVDVEVEOworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIiVzOiBJbml0aWFsaXppbmcgU3RhdGU6ICVkLCBzYXBDb250ZXh0IHZhbHVlID0gJXgiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwU2FwQ3R4LT5zYXBzTWFjaGluZSwgcFNhcEN0eCk7ICAgCisgICAgcFNhcEN0eC0+c2Vzc2lvbklkID0gMDsKKyAgICBwU2FwQ3R4LT5jaGFubmVsID0gMDsgIAorCisjZW5kaWYKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8vIFdMQU5TQVBfQ2xlYW5DQgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfcG1jRnVsbFB3clJlcUNCCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGJhY2sgcHJvdmlkZSB0byBQTUMgaW4gdGhlIHBtY1JlcXVlc3RGdWxsUG93ZXIgQVBJLiAKKworICBERVBFTkRFTkNJRVMgCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgY2FsbGJhY2tDb250ZXh0OiAgVGhlIHVzZXIgcGFzc2VkIGluIGEgY29udGV4dCB0byBpZGVudGlmeSAKKyAgICBzdGF0dXM6ICAgICAgICAgICBUaGUgaGFsU3RhdHVzIAorCisgIFJFVFVSTiBWQUxVRQorICAgIE5vbmUKKworICBTSURFIEVGRkVDVFMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZAorV0xBTlNBUF9wbWNGdWxsUHdyUmVxQ0IKKygKKyAgICB2b2lkICpjYWxsYmFja0NvbnRleHQsCisgICAgZUhhbFN0YXR1cyBzdGF0dXMKKykKK3sKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgICAvL0lmIHN1Y2Nlc3Mgd2hhdCBlbHNlIHRvIGJlIGhhbmRsZWQ/Pz8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgIldMQU5TQVBfcG1jRnVsbFB3clJlcUNCOiBQTUMgZmFpbGVkIHRvIHB1dCB0aGUgY2hpcCBpbiBGdWxsIHBvd2VyXG4iKTsKKworICAgICAgICAvL0FTU0VSVAorICAgICAgICBWT1NfQVNTRVJUKDApOworICAgIH0KKworfS8vIFdMQU5TQVBfcG1jRnVsbFB3clJlcUNCCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfZ2V0U3RhdGUKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSByZXR1cm5zIHRoZSBjdXJyZW50IFNBUCBzdGF0ZSB0byB0aGUgY2FsbGVyLgorCisgIERFUEVOREVOQ0lFUyAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwQ29udGV4dCAgICAgICAgICAgIDogUG9pbnRlciB0byBTYXAgQ29udGV4dCBzdHJ1Y3R1cmUKKworICBSRVRVUk4gVkFMVUUKKyAgICBSZXR1cm5zIHRoZSBTQVAgRlNNIHN0YXRlLiAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordl9VOF90IFdMQU5TQVBfZ2V0U3RhdGUgCisoCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eAorKQoreworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisKKyAgICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworCisgICAgaWYgKCBOVUxMID09IHBTYXBDdHggKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgIHJldHVybiBwU2FwQ3R4LT5zYXBzTWFjaGluZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX1N0YXJ0QnNzCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgU0FQIEZTTSBldmVudCBlV0xBTl9TQVBfUEhZU0lDQUxfTElOS19DUkVBVEUgZm9yCisgICAgc3RhcnRpbmcgQVAgQlNTCisKKyAgREVQRU5ERU5DSUVTIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBDb250ZXh0ICAgICAgICAgICAgOiBQb2ludGVyIHRvIFNhcCBDb250ZXh0IHN0cnVjdHVyZQorICAgIHBRY3RDb21taXRDb25maWcgICAgOiBQb2ludGVyIHRvIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHBhc3NlZCBkb3duIGZyb20gSEREKEhvc3RBcGQgZm9yIEFuZHJvaWQpCisgICAgaGRkX1NhcEV2ZW50Q2FsbGJhY2s6IENhbGxiYWNrIGZ1bmN0aW9uIGluIEhERCBjYWxsZWQgYnkgU0FQIHRvIGluZm9ybSBIREQgYWJvdXQgU0FQIHJlc3VsdHMKKyAgICBwVXNyQ29udGV4dCAgICAgICAgIDogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSBwYXNzZWQgYmFjayBpbiBhbGwgdGhlIFNBUCBjYWxsYmFjayBldmVudHMuCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBQb2ludGVyIHRvIFNBUCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiBTdWNjZXNzCisKKyAgU0lERSBFRkZFQ1RTCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOU0FQX1N0YXJ0QnNzCisoCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eCwvL3B3ZXh0Q3R4CisgICAgdHBXTEFOX1NBUEV2ZW50Q0IgcFNhcEV2ZW50Q2FsbGJhY2ssCisgICAgdHNhcF9Db25maWdfdCAqcENvbmZpZywKKyAgICB2X1BWT0lEX3QgIHBVc3JDb250ZXh0CispCit7CisgICAgdFdMQU5fU0FQRXZlbnQgc2FwRXZlbnQ7ICAgIC8qIFN0YXRlIG1hY2hpbmUgZXZlbnQqLworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisgICAgdEFOSV9CT09MRUFOIHJlc3RhcnROZWVkZWQ7CisgICAgdEhhbEhhbmRsZSBoSGFsOyAKKyAgICAKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNhbml0eSBjaGVjaworICAgICAgICBFeHRyYWN0IFNBUCBjb250cm9sIGJsb2NrIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgIldMQU5TQVBfU3RhcnRCc3MiKTsKKworICAgIGlmIChWT1NfU1RBX1NBUF9NT0RFID09IHZvc19nZXRfY29ucGFyYW0gKCkpCisgICAgeworICAgICAgICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworICAgICAgICBpZiAoIE5VTEwgPT0gcFNhcEN0eCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKyAgICAgICAgcFNhcEN0eC0+c2Fwc01hY2hpbmUgPSBlU0FQX0RJU0NPTk5FQ1RFRDsKKworICAgICAgICAvKiBDaGFubmVsIHNlbGVjdGlvbiBpcyBhdXRvIG9yIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgcFNhcEN0eC0+Y2hhbm5lbCA9IHBDb25maWctPmNoYW5uZWw7CisgICAgICAgIHBTYXBDdHgtPnBVc3JDb250ZXh0ID0gcFVzckNvbnRleHQ7CisKKyAgICAgICAgLy9TZXQgdGhlIEJTU0lEIHRvIHlvdXIgInNlbGYgTUFDIEFkZHIiIHJlYWQgdGhlIG1hYyBhZGRyZXNzIGZyb20gQ29uZmlndWF0aW9uIElURU0gcmVjZWl2ZWQgZnJvbSBIREQKKyAgICAgICAgcFNhcEN0eC0+Y3NyUm9hbVByb2ZpbGUuQlNTSURzLm51bU9mQlNTSURzID0gMTsKKyAgICAgICAgdm9zX21lbV9jb3B5KHBTYXBDdHgtPmNzclJvYW1Qcm9maWxlLkJTU0lEcy5ic3NpZCwgCisgICAgICAgICAgICAgICAgICAgICBwU2FwQ3R4LT5zZWxmX21hY19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0Q3NyQnNzaWQgKSApOyAKKworICAgICAgICAvL1NhdmUgYSBjb3B5IHRvIFNBUCBjb250ZXh0CisgICAgICAgIHZvc19tZW1fY29weShwU2FwQ3R4LT5jc3JSb2FtUHJvZmlsZS5CU1NJRHMuYnNzaWQsIAorICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5zZWxmX21hY2FkZHIuYnl0ZXMsIHNpemVvZih2X01BQ0FERFJfdCkpOworICAgICAgICB2b3NfbWVtX2NvcHkocFNhcEN0eC0+c2VsZl9tYWNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+c2VsZl9tYWNhZGRyLmJ5dGVzLCBzaXplb2Yodl9NQUNBRERSX3QpKTsKKworICAgICAgICAvL2NvcHkgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbXMgdG8gY3NyUHJvZmlsZQorICAgICAgICBzYXBjb252ZXJ0VG9Dc3JQcm9maWxlKCBwQ29uZmlnLCBlQ1NSX0JTU19UWVBFX0lORlJBX0FQLCAmcFNhcEN0eC0+Y3NyUm9hbVByb2ZpbGUpOworICAgICAgICBoSGFsID0gKHRIYWxIYW5kbGUpVk9TX0dFVF9IQUxfQ0IocHZvc0dDdHgpOyAKKyAgICAgICAgaWYgKE5VTEwgPT0gaEhhbCkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIE1BQyBjb250ZXh0IGZyb20gcHZvc0dDdHgiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9JZiBjb25jdXJyZW50IHNlc3Npb24gaXMgcnVubmluZyB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZAorICAgICAgICAgICAgLy90aGVuIHdlIGp1c3QgZm9sbG93IHRoYXQgc2Vzc2lvbnMgY291bnRyeSBpbmZvICh3aGV0aGVyCisgICAgICAgICAgICAvL3ByZXNlbnQgb3Igbm90IGRvZXNuJ3QgbWFhdGVyIGFzIHdlIGhhdmUgdG8gZm9sbG93IHdoYXRldmVyCisgICAgICAgICAgICAvL1NUQSBzZXNzaW9uIGRvZXMpCisgICAgICAgICAgICBpZiAoMCA9PSBzbWVfR2V0Q29uY3VycmVudE9wZXJhdGlvbkNoYW5uZWwoaEhhbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2V0dGluZyB0aGUgcmVnaW9uL2NvdW50cnkgIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgc21lX3NldFJlZ0luZm8oaEhhbCwgcENvbmZpZy0+Y291bnRyeUNvZGUpOworICAgICAgICAgICAgICAgIHNtZV9SZXNldENvdW50cnlDb2RlSW5mb3JtYXRpb24oaEhhbCwgJnJlc3RhcnROZWVkZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBNQUMgZmlsdGVyaW5nIHNldHRpbmdzIHRvIHNhcCBjb250ZXh0CisgICAgICAgIHBTYXBDdHgtPmVTYXBNYWNBZGRyQWNsTW9kZSA9IHBDb25maWctPlNhcE1hY2FkZHJfYWNsOworICAgICAgICB2b3NfbWVtX2NvcHkocFNhcEN0eC0+YWNjZXB0TWFjTGlzdCwgcENvbmZpZy0+YWNjZXB0X21hYywgc2l6ZW9mKHBDb25maWctPmFjY2VwdF9tYWMpKTsKKyAgICAgICAgcFNhcEN0eC0+bkFjY2VwdE1hYyA9IHBDb25maWctPm51bV9hY2NlcHRfbWFjOworICAgICAgICBzYXBTb3J0TWFjTGlzdChwU2FwQ3R4LT5hY2NlcHRNYWNMaXN0LCBwU2FwQ3R4LT5uQWNjZXB0TWFjKTsKKyAgICAgICAgdm9zX21lbV9jb3B5KHBTYXBDdHgtPmRlbnlNYWNMaXN0LCBwQ29uZmlnLT5kZW55X21hYywgc2l6ZW9mKHBDb25maWctPmRlbnlfbWFjKSk7CisgICAgICAgIHBTYXBDdHgtPm5EZW55TWFjID0gcENvbmZpZy0+bnVtX2RlbnlfbWFjOworICAgICAgICBzYXBTb3J0TWFjTGlzdChwU2FwQ3R4LT5kZW55TWFjTGlzdCwgcFNhcEN0eC0+bkRlbnlNYWMpOworCisgICAgICAgIC8qIEZpbGwgaW4gdGhlIGV2ZW50IHN0cnVjdHVyZSBmb3IgRlNNICovCisgICAgICAgIHNhcEV2ZW50LmV2ZW50ID0gZVNBUF9IRERfU1RBUlRfSU5GUkFfQlNTOworICAgICAgICBzYXBFdmVudC5wYXJhbXMgPSAwOy8vcFNhcFBoeXNMaW5rQ3JlYXRlCisKKyAgICAgICAgLyogU3RvcmUgdGhlIEhERCBjYWxsYmFjayBpbiBTQVAgY29udGV4dCAqLworICAgICAgICBwU2FwQ3R4LT5wZm5TYXBFdmVudENhbGxiYWNrID0gcFNhcEV2ZW50Q2FsbGJhY2s7CisKKyAgICAgICAgLyogSGFuZGxlIGV2ZW50Ki8KKyAgICAgICAgdm9zU3RhdHVzID0gc2FwRnNtKHBTYXBDdHgsICZzYXBFdmVudCk7CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiU29mdEFwIHJvbGUgaGFzIG5vdCBiZWVuIGVuYWJsZWQiKTsKKyAgICAgfQorCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30vLyBXTEFOU0FQX1N0YXJ0QnNzCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TdG9wQnNzCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgU0FQIEZTTSBldmVudCBlU0FQX0hERF9TVE9QX0lORlJBX0JTUyBmb3IKKyAgICBzdG9wcGluZyBBUCBCU1MKKworICBERVBFTkRFTkNJRVMgCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHggICAgOiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFNBUCdzIAorICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleGUKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6IFBvaW50ZXIgdG8gVk9TUyBHQyBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiBTdWNjZXNzCisKKyAgU0lERSBFRkZFQ1RTCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOU0FQX1N0b3BCc3MKKygKKyB2X1BWT0lEX3QgIHB2b3NHQ3R4CispCit7CisgICAgdFdMQU5fU0FQRXZlbnQgc2FwRXZlbnQ7ICAgIC8qIFN0YXRlIG1hY2hpbmUgZXZlbnQqLworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTYW5pdHkgY2hlY2sKKyAgICAgICAgRXh0cmFjdCBTQVAgY29udHJvbCBibG9jayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICJXTEFOU0FQX1N0b3BCc3MiKTsKKworICAgIGlmICggTlVMTCA9PSBwdm9zR0N0eCApIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBHbG9iYWwgVk9TUyBoYW5kbGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQihwdm9zR0N0eCk7CisKKyAgICBpZiAoTlVMTCA9PSBwU2FwQ3R4ICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgLyogRmlsbCBpbiB0aGUgZXZlbnQgc3RydWN0dXJlIGZvciBGU00gKi8KKyAgICBzYXBFdmVudC5ldmVudCA9IGVTQVBfSEREX1NUT1BfSU5GUkFfQlNTOworICAgIHNhcEV2ZW50LnBhcmFtcyA9IDA7CisKKyAgICAvKiBIYW5kbGUgZXZlbnQqLworICAgIHZvc1N0YXR1cyA9IHNhcEZzbShwU2FwQ3R4LCAmc2FwRXZlbnQpOworCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX0dldEFzc29jU3RhdGlvbnMKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBpcyB1c2VkIHRvIHByb2JlIHRoZSBsaXN0IG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgZnJvbSB2YXJpb3VzIG1vZHVsZXMgb2YgQ09SRSBzdGFjaworCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eCAgICAgICAgOiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgICBtb2RJZCAgICAgICAgICAgOiBNb2R1bGUgZnJvbSB3aG9tIGxpc3Qgb2YgYXNzb2NpdGF0ZWQgc3RhdGlvbnMgIGlzIHN1cHBvc2VkIHRvIGJlIHByb2JlZC4gSWYgYW4gaW52YWxpZCBtb2R1bGUgaXMgcGFzc2VkCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGJ5IGRlZmF1bHQgVk9TX01PRFVMRV9JRF9QRSB3aWxsIGJlIHByb2JlZAorICAgIElOL09VVAorICAgIHBBc3NvY1N0YXMgICAgICA6IFBvaW50ZXIgdG8gbGlzdCBvZiBhc3NvY2lhdGVkIHN0YXRpb25zIHRoYXQgYXJlIGtub3duIHRvIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIG1vZCBwYXJhbWV0ZXIKKworICBOT1RFOiBUaGUgbWVtb3J5IGZvciB0aGlzIGxpc3Qgd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciBvZiB0aGlzIEFQSQorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworCisgIFNJREUgRUZGRUNUUworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOU0FQX0dldEFzc29jU3RhdGlvbnMKKygKKyAgICB2X1BWT0lEX3QgcHZvc0dDdHgsCisgICAgVk9TX01PRFVMRV9JRCBtb2RJZCwKKyAgICB0cFNhcF9Bc3NvY01hY0FkZHIgcEFzc29jU3RhcworKQoreworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IFZPU19HRVRfU0FQX0NCKHB2b3NHQ3R4KTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBTYW5pdHkgY2hlY2sKKyAgICAgIEV4dHJhY3QgU0FQIGNvbnRyb2wgYmxvY2sgCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChOVUxMID09IHBTYXBDdHgpCisgICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIHNtZV9Sb2FtR2V0QXNzb2NpYXRlZFN0YXMoIFZPU19HRVRfSEFMX0NCKHBTYXBDdHgtPnB2b3NHQ3R4KSwgcFNhcEN0eC0+c2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhcEN0eC0+cFVzckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QgKilwU2FwQ3R4LT5wZm5TYXBFdmVudENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90ICopcEFzc29jU3RhcyApOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfUmVtb3ZlV3BzU2Vzc2lvbk92ZXJsYXAKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byByZW1vdmUgYW4gZW50cnkgZnJvbSBzZXNzaW9uIHNlc3Npb24gb3ZlcmxhcCBpbmZvLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisgICAgcFJlbW92ZU1hYzogcG9pbnRlciB0byB2X01BQ0FERFJfdCBmb3Igc2Vzc2lvbiBNQUMgYWRkcmVzcworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU2Vzc2lvbiBpcyBub3QgZGVjdGVjdGVkLiBUaGUgcGFyYW1ldGVyIGlzIGZ1bmN0aW9uIG5vdCB2YWxpZC4KKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOU0FQX1JlbW92ZVdwc1Nlc3Npb25PdmVybGFwCisKKygKKyAgICB2X1BWT0lEX3QgcHZvc0dDdHgsCisgICAgdl9NQUNBRERSX3QgcFJlbW92ZU1hYworKQoreworICBwdFNhcENvbnRleHQgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQihwdm9zR0N0eCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgICBFeHRyYWN0IFNBUCBjb250cm9sIGJsb2NrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoTlVMTCA9PSBwU2FwQ3R4KQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBzbWVfUm9hbUdldFdwc1Nlc3Npb25PdmVybGFwKCBWT1NfR0VUX0hBTF9DQihwU2FwQ3R4LT5wdm9zR0N0eCksIHBTYXBDdHgtPnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhcEN0eC0+cFVzckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QgKilwU2FwQ3R4LT5wZm5TYXBFdmVudENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtb3ZlTWFjKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfZ2V0V3BzU2Vzc2lvbk92ZXJsYXAKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBnZXQgV1BTIHNlc3Npb24gb3ZlcmxhcCBpbmZvLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOU0FQX2dldFdwc1Nlc3Npb25PdmVybGFwCisoCisgdl9QVk9JRF90IHB2b3NHQ3R4ICAKKykKK3sKKyAgICB2X01BQ0FERFJfdCBwUmVtb3ZlTWFjID0gVk9TX01BQ19BRERSX1pFUk9fSU5JVElBTElaRVI7IAorCisgICAgcHRTYXBDb250ZXh0ICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFNhbml0eSBjaGVjaworICAgICAgRXh0cmFjdCBTQVAgY29udHJvbCBibG9jayAKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKE5VTEwgPT0gcFNhcEN0eCkKKyAgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgIAorICAgIHNtZV9Sb2FtR2V0V3BzU2Vzc2lvbk92ZXJsYXAoIFZPU19HRVRfSEFMX0NCKHBTYXBDdHgtPnB2b3NHQ3R4KSwgcFNhcEN0eC0+c2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwQ3R4LT5wVXNyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCAqKXBTYXBDdHgtPnBmblNhcEV2ZW50Q2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1vdmVNYWMpOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKiBUaGlzIHJvdXRpbmUgd2lsbCBzZXQgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uIGZvciBBQ0wgZHluYW1pY2FsbHkqLworVk9TX1NUQVRVUworV0xBTlNBUF9TZXRNb2RlICggdl9QVk9JRF90ICBwdm9zR0N0eCwgdl9VMzJfdCBtb2RlKQoreworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IFZPU19HRVRfU0FQX0NCKHB2b3NHQ3R4KTsKKworICAgIGlmIChOVUxMID09IHBTYXBDdHgpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIHBTYXBDdHgtPmVTYXBNYWNBZGRyQWNsTW9kZSA9IChlU2FwTWFjQWRkckFDTCltb2RlOworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIFRoaXMgcm91dGluZSB3aWxsIGNsZWFyIGFsbCB0aGUgZW50cmllcyBpbiBhY2NlcHQgbGlzdCBhcyB3ZWxsIGFzIGRlbnkgbGlzdCAgKi8KKworVk9TX1NUQVRVUyAKK1dMQU5TQVBfQ2xlYXJBQ0woIHZfUFZPSURfdCAgcHZvc0dDdHgpCit7CisgICAgcHRTYXBDb250ZXh0ICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworICAgIHZfVThfdCBpOworCisgICAgaWYgKE5VTEwgPT0gcFNhcEN0eCkKKyAgICB7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTOworICAgIH0KKworICAgIGlmIChwU2FwQ3R4LT5kZW55TWFjTGlzdCAhPSBOVUxMKSAKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocFNhcEN0eC0+bkRlbnlNYWMtMSk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV96ZXJvKChwU2FwQ3R4LT5kZW55TWFjTGlzdCtpKS0+Ynl0ZXMsIHNpemVvZih2X01BQ0FERFJfdCkpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2FwUHJpbnRBQ0wocFNhcEN0eC0+ZGVueU1hY0xpc3QsIHBTYXBDdHgtPm5EZW55TWFjKTsKKyAgICBwU2FwQ3R4LT5uRGVueU1hYyAgPSAwOworCisgICAgaWYgKHBTYXBDdHgtPmFjY2VwdE1hY0xpc3QhPU5VTEwpIAorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChwU2FwQ3R4LT5uQWNjZXB0TWFjLTEpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19tZW1femVybygocFNhcEN0eC0+YWNjZXB0TWFjTGlzdCtpKS0+Ynl0ZXMsIHNpemVvZih2X01BQ0FERFJfdCkpOworCisgICAgICAgIH0KKyAgICB9CisgICAgc2FwUHJpbnRBQ0wocFNhcEN0eC0+YWNjZXB0TWFjTGlzdCwgcFNhcEN0eC0+bkFjY2VwdE1hYyk7CisgICAgcFNhcEN0eC0+bkFjY2VwdE1hYyA9IDA7CisgICAgCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworVk9TX1NUQVRVUyAKK1dMQU5TQVBfTW9kaWZ5QUNMCisoCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eCwKKyAgICB2X1U4X3QgKnBQZWVyU3RhTWFjLAorICAgIGVTYXBBQ0xUeXBlIGxpc3RUeXBlLAorICAgIGVTYXBBQ0xDbWRUeXBlIGNtZAorKQoreyAgIAorICAgIGVTYXBCb29sIHN0YUluV2hpdGVMaXN0PWVTQVBfRkFMU0UsIHN0YUluQmxhY2tMaXN0PWVTQVBfRkFMU0U7CisgICAgdl9VOF90IHN0YVdMSW5kZXgsIHN0YUJMSW5kZXg7CisgICAgcHRTYXBDb250ZXh0ICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworCisgICAgaWYgKE5VTEwgPT0gcFNhcEN0eCkKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNBUCBDb250ZXh0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywiTW9kaWZ5IEFDTCBlbnRlcmVkXG4iCisgICAgICAgICAgICAiQmVmb3JlIG1vZGlmaWNhdGlvbiBvZiBBQ0xcbiIKKyAgICAgICAgICAgICJzaXplIG9mIGFjY2VwdCBhbmQgZGVueSBsaXN0cyAlZCAlZCIsCisgICAgICAgICAgICBwU2FwQ3R4LT5uQWNjZXB0TWFjLCBwU2FwQ3R4LT5uRGVueU1hYyk7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwiKioqIFdISVRFIExJU1QgKioqIik7CisgICAgc2FwUHJpbnRBQ0wocFNhcEN0eC0+YWNjZXB0TWFjTGlzdCwgcFNhcEN0eC0+bkFjY2VwdE1hYyk7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwiKioqIEJMQUNLIExJU1QgKioqIik7CisgICAgc2FwUHJpbnRBQ0wocFNhcEN0eC0+ZGVueU1hY0xpc3QsIHBTYXBDdHgtPm5EZW55TWFjKTsKKworICAgIC8qIHRoZSBleHBlY3RhdGlvbiBpcyBhIG1hYyBhZGRyIHdpbGwgbm90IGJlIGluIGJvdGggdGhlIGxpc3RzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICAgSXQgaXMgdGhlIHJlc3BvbnNpYmxpdHkgb2YgdXNlcnNwYWNlIHRvIGVuc3VyZSB0aGlzICovCisgICAgc3RhSW5XaGl0ZUxpc3QgPSBzYXBTZWFyY2hNYWNMaXN0KHBTYXBDdHgtPmFjY2VwdE1hY0xpc3QsIHBTYXBDdHgtPm5BY2NlcHRNYWMsIHBQZWVyU3RhTWFjLCAmc3RhV0xJbmRleCk7CisgICAgc3RhSW5CbGFja0xpc3QgPSBzYXBTZWFyY2hNYWNMaXN0KHBTYXBDdHgtPmRlbnlNYWNMaXN0LCBwU2FwQ3R4LT5uRGVueU1hYywgcFBlZXJTdGFNYWMsICZzdGFCTEluZGV4KTsKKworICAgIGlmIChzdGFJbldoaXRlTGlzdCAmJiBzdGFJbkJsYWNrTGlzdCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiUGVlciBtYWMgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggZm91bmQgaW4gd2hpdGUgYW5kIGJsYWNrIGxpc3RzLiIKKyAgICAgICAgICAgICAgICAiSW5pdGlhbCBsaXN0cyBwYXNzZWQgaW5jb3JyZWN0LiBDYW5ub3QgZXhlY3V0ZSB0aGlzIGNvbW1hbmQuIiwgCisgICAgICAgICAgICAgICAgcFBlZXJTdGFNYWNbMF0sIHBQZWVyU3RhTWFjWzFdLCBwUGVlclN0YU1hY1syXSwgcFBlZXJTdGFNYWNbM10sCisgICAgICAgICAgICAgICAgcFBlZXJTdGFNYWNbNF0sIHBQZWVyU3RhTWFjWzVdKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworCisgICAgfQorCisgICAgc3dpdGNoKGxpc3RUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBlU0FQX1dISVRFX0xJU1Q6ICAgICAgICAgICAKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywgImNtZCAlZCIsIGNtZCk7CisgICAgICAgICAgICBpZiAoY21kID09IEFERF9TVEFfVE9fQUNMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vZXJyb3IgY2hlY2sKKyAgICAgICAgICAgICAgICAvLyBpZiBsaXN0IGlzIGFscmVhZHkgYXQgbWF4LCByZXR1cm4gZmFpbHVyZQorICAgICAgICAgICAgICAgIGlmIChwU2FwQ3R4LT5uQWNjZXB0TWFjID09IE1BWF9NQUNfQUREUkVTU19BQ0NFUFRFRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2hpdGUgbGlzdCBpcyBhbHJlYWR5IG1heGVkIG91dC4gQ2Fubm90IGFjY2VwdCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZWVyU3RhTWFjWzBdLCBwUGVlclN0YU1hY1sxXSwgcFBlZXJTdGFNYWNbMl0sIHBQZWVyU3RhTWFjWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZWVyU3RhTWFjWzRdLCBwUGVlclN0YU1hY1s1XSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YUluV2hpdGVMaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9EbyBub3RoaW5nIGlmIGFscmVhZHkgcHJlc2VudCBpbiB3aGl0ZSBsaXN0LiBKdXN0IHByaW50IGEgd2FybmluZworICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUFDIGFkZHJlc3MgYWxyZWFkeSBwcmVzZW50IGluIHdoaXRlIGxpc3QgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZWVyU3RhTWFjWzBdLCBwUGVlclN0YU1hY1sxXSwgcFBlZXJTdGFNYWNbMl0sIHBQZWVyU3RhTWFjWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZWVyU3RhTWFjWzRdLCBwUGVlclN0YU1hY1s1XSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YUluQmxhY2tMaXN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3JlbW92ZSBpdCBmcm9tIGJsYWNrIGxpc3QgYmVmb3JlIGFkZGluZyB0byB0aGUgd2hpdGUgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVEEgcHJlc2VudCBpbiBibGFjayBsaXN0IHNvIGZpcnN0IHJlbW92ZSBmcm9tIGl0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXBSZW1vdmVNYWNGcm9tQUNMKHBTYXBDdHgtPmRlbnlNYWNMaXN0LCAmcFNhcEN0eC0+bkRlbnlNYWMsIHN0YUJMSW5kZXgpOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4uIE5vdyBhZGQgdG8gdGhlIHdoaXRlIGxpc3QiKTsgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNhcEFkZE1hY1RvQUNMKHBTYXBDdHgtPmFjY2VwdE1hY0xpc3QsICZwU2FwQ3R4LT5uQWNjZXB0TWFjLCBwUGVlclN0YU1hYyk7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywgInNpemUgb2YgYWNjZXB0IGFuZCBkZW55IGxpc3RzICVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwQ3R4LT5uQWNjZXB0TWFjLCBwU2FwQ3R4LT5uRGVueU1hYyk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY21kID09IERFTEVURV9TVEFfRlJPTV9BQ0wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0YUluV2hpdGVMaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJEZWxldGUgZnJvbSB3aGl0ZSBsaXN0Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc2FwUmVtb3ZlTWFjRnJvbUFDTChwU2FwQ3R4LT5hY2NlcHRNYWNMaXN0LCAmcFNhcEN0eC0+bkFjY2VwdE1hYywgc3RhV0xJbmRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAic2l6ZSBvZiBhY2NlcHQgYW5kIGRlbnkgbGlzdHMgJWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYXBDdHgtPm5BY2NlcHRNYWMsIHBTYXBDdHgtPm5EZW55TWFjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1BQyBhZGRyZXNzIHRvIGJlIGRlbGV0ZWQgaXMgbm90IHByZXNlbnQgaW4gdGhlIHdoaXRlIGxpc3QgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZWVyU3RhTWFjWzBdLCBwUGVlclN0YU1hY1sxXSwgcFBlZXJTdGFNYWNbMl0sIHBQZWVyU3RhTWFjWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZWVyU3RhTWFjWzRdLCBwUGVlclN0YU1hY1s1XSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiSW52YWxpZCBjbWQgdHlwZSBwYXNzZWQiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNBUF9CTEFDS19MSVNUOiAgICAgICAgICAgCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgICAgICJjbWQgJWQiLCBjbWQpOworICAgICAgICAgICAgaWYgKGNtZCA9PSBBRERfU1RBX1RPX0FDTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2Vycm9yIGNoZWNrCisgICAgICAgICAgICAgICAgLy8gaWYgbGlzdCBpcyBhbHJlYWR5IGF0IG1heCwgcmV0dXJuIGZhaWx1cmUKKyAgICAgICAgICAgICAgICBpZiAocFNhcEN0eC0+bkRlbnlNYWMgPT0gTUFYX01BQ19BRERSRVNTX0FDQ0VQVEVEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCbGFjayBsaXN0IGlzIGFscmVhZHkgbWF4ZWQgb3V0LiBDYW5ub3QgYWNjZXB0ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGVlclN0YU1hY1swXSwgcFBlZXJTdGFNYWNbMV0sIHBQZWVyU3RhTWFjWzJdLCBwUGVlclN0YU1hY1szXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGVlclN0YU1hY1s0XSwgcFBlZXJTdGFNYWNbNV0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGFJbkJsYWNrTGlzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vRG8gbm90aGluZyBpZiBhbHJlYWR5IHByZXNlbnQgaW4gd2hpdGUgbGlzdAorICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUFDIGFkZHJlc3MgYWxyZWFkeSBwcmVzZW50IGluIGJsYWNrIGxpc3QgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZWVyU3RhTWFjWzBdLCBwUGVlclN0YU1hY1sxXSwgcFBlZXJTdGFNYWNbMl0sIHBQZWVyU3RhTWFjWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZWVyU3RhTWFjWzRdLCBwUGVlclN0YU1hY1s1XSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YUluV2hpdGVMaXN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3JlbW92ZSBpdCBmcm9tIHdoaXRlIGxpc3QgYmVmb3JlIGFkZGluZyB0byB0aGUgd2hpdGUgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVzZW50IGluIHdoaXRlIGxpc3Qgc28gZmlyc3QgcmVtb3ZlIGZyb20gaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhcFJlbW92ZU1hY0Zyb21BQ0wocFNhcEN0eC0+YWNjZXB0TWFjTGlzdCwgJnBTYXBDdHgtPm5BY2NlcHRNYWMsIHN0YVdMSW5kZXgpOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4uIE5vdyBhZGQgdG8gYmxhY2sgbGlzdCIpOyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc2FwQWRkTWFjVG9BQ0wocFNhcEN0eC0+ZGVueU1hY0xpc3QsICZwU2FwQ3R4LT5uRGVueU1hYywgcFBlZXJTdGFNYWMpOworICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csInNpemUgb2YgYWNjZXB0IGFuZCBkZW55IGxpc3RzICVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwQ3R4LT5uQWNjZXB0TWFjLCBwU2FwQ3R4LT5uRGVueU1hYyk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNtZCA9PSBERUxFVEVfU1RBX0ZST01fQUNMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdGFJbkJsYWNrTGlzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiRGVsZXRlIGZyb20gYmxhY2sgbGlzdCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNhcFJlbW92ZU1hY0Zyb21BQ0wocFNhcEN0eC0+ZGVueU1hY0xpc3QsICZwU2FwQ3R4LT5uRGVueU1hYywgc3RhQkxJbmRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCJubyBhY2NlcHQgYW5kIGRlbnkgbWFjICVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FwQ3R4LT5uQWNjZXB0TWFjLCBwU2FwQ3R4LT5uRGVueU1hYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNQUMgYWRkcmVzcyB0byBiZSBkZWxldGVkIGlzIG5vdCBwcmVzZW50IGluIHRoZSBibGFjayBsaXN0ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGVlclN0YU1hY1swXSwgcFBlZXJTdGFNYWNbMV0sIHBQZWVyU3RhTWFjWzJdLCBwUGVlclN0YU1hY1szXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGVlclN0YU1hY1s0XSwgcFBlZXJTdGFNYWNbNV0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkludmFsaWQgY21kIHR5cGUgcGFzc2VkIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGxpc3QgdHlwZSBwYXNzZWQgJWQiLGxpc3RUeXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgfQorICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywiQWZ0ZXIgbW9kaWZpY2F0aW9uIG9mIEFDTCIpOworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIioqKiBXSElURSBMSVNUICoqKiIpOworICAgIHNhcFByaW50QUNMKHBTYXBDdHgtPmFjY2VwdE1hY0xpc3QsIHBTYXBDdHgtPm5BY2NlcHRNYWMpOworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIioqKiBCTEFDSyBMSVNUICoqKiIpOworICAgIHNhcFByaW50QUNMKHBTYXBDdHgtPmRlbnlNYWNMaXN0LCBwU2FwQ3R4LT5uRGVueU1hYyk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX0Rpc2Fzc29jU3RhCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIEFwIEFwcC9IREQgaW5pdGlhdGVkIGRpc2Fzc29jaWF0aW9uIG9mIHN0YXRpb24KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHggICAgICAgICAgICA6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgIHBQZWVyU3RhTWFjICAgICAgICAgOiBNYWMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbiB0byBkaXNhc3NvY2lhdGUKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOU0FQX0Rpc2Fzc29jU3RhCisoCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eCwKKyAgICB2X1U4X3QgKnBQZWVyU3RhTWFjCispCit7CisgICAgcHRTYXBDb250ZXh0ICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFNhbml0eSBjaGVjaworICAgICAgRXh0cmFjdCBTQVAgY29udHJvbCBibG9jayAKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgIAorICAgIGlmIChOVUxMID09IHBTYXBDdHgpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIHNtZV9Sb2FtRGlzY29ubmVjdFN0YShWT1NfR0VUX0hBTF9DQihwU2FwQ3R4LT5wdm9zR0N0eCksIHBTYXBDdHgtPnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGVlclN0YU1hYyk7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX0RlYXV0aFN0YQorCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIGluaXRpYXRlZCBkZWF1dGhlbnRpY2F0aW9uIG9mIHN0YXRpb24KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHggICAgICAgICAgICA6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgIHBQZWVyU3RhTWFjICAgICAgICAgOiBNYWMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbiB0byBkZWF1dGhlbnRpY2F0ZQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5TQVBfRGVhdXRoU3RhCisoCisgICAgdl9QVk9JRF90ICBwdm9zR0N0eCwKKyAgICB2X1U4X3QgKnBQZWVyU3RhTWFjCispCit7CisgICAgcHRTYXBDb250ZXh0ICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFNhbml0eSBjaGVjaworICAgICAgRXh0cmFjdCBTQVAgY29udHJvbCBibG9jayAKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgIAorICAgIGlmIChOVUxMID09IHBTYXBDdHgpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIHNtZV9Sb2FtRGVhdXRoU3RhKFZPU19HRVRfSEFMX0NCKHBTYXBDdHgtPnB2b3NHQ3R4KSwgcFNhcEN0eC0+c2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZWVyU3RhTWFjKTsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfU2V0Q2hhbm5lbFJhbmdlCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gc2V0cyB0aGUgcmFuZ2Ugb2YgY2hhbm5lbHMgZm9yIEFQLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBzdGFydENoYW5uZWwgICAgICAgICA6IHN0YXJ0IGNoYW5uZWwKKyAgICBlbmRDaGFubmVsICAgICAgICAgICA6IEVuZCBjaGFubmVsCisgICAgb3BlcmF0aW5nQmFuZCAgICAgICAgOiBPcGVyYXRpbmcgYmFuZCAoMi40R0h6LzVHSHopCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOU0FQX1NldENoYW5uZWxSYW5nZSh0SGFsSGFuZGxlIGhIYWwsdl9VOF90IHN0YXJ0Q2hhbm5lbCwgdl9VOF90IGVuZENoYW5uZWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IG9wZXJhdGluZ0JhbmQpCit7CisKKyAgICB2X1U4X3QgICAgdmFsaWRDaGFubmVsRmxhZyA9MDsKKyAgICB2X1U4X3QgICAgbG9vcFN0YXJ0Q291bnQgPTA7CisgICAgdl9VOF90ICAgIGxvb3BFbmRDb3VudCA9MDsKKyAgICB2X1U4X3QgICAgYmFuZFN0YXJ0Q2hhbm5lbCA9MDsKKyAgICB2X1U4X3QgICAgYmFuZEVuZENoYW5uZWwgPTA7ICAgCisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICJXTEFOU0FQX1NldENoYW5uZWxSYW5nZTpzdGFydENoYW5uZWwgJWQsRW5kQ2hhbm5lbCAlZCxPcGVyYXRpbmdiYW5kOiVkIiwKKyAgICAgICAgIHN0YXJ0Q2hhbm5lbCxlbmRDaGFubmVsLG9wZXJhdGluZ0JhbmQpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFNhbml0eSBjaGVjaworICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgCisgICAgaWYgKCggV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkRfQVBNSU4gPiBvcGVyYXRpbmdCYW5kKXx8CisgICAgICAgICAgKFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5EX0FQTUFYIDwgb3BlcmF0aW5nQmFuZCkpCisgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3BlcmF0aW5nQmFuZCBvbiBXTEFOU0FQX1NldENoYW5uZWxSYW5nZSIpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKyAgICBpZiAoKCBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9TVEFSVF9DSEFOTkVMX0FQTUlOID4gc3RhcnRDaGFubmVsKXx8CisgICAgICAgICAoV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTF9BUE1BWCA8IHN0YXJ0Q2hhbm5lbCkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHN0YXJ0Q2hhbm5lbCB2YWx1ZSBvbiBXTEFOU0FQX1NldENoYW5uZWxSYW5nZSIpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKyAgICBpZiAoKCBXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTF9BUE1JTiA+IGVuZENoYW5uZWwpfHwKKyAgICAgICAgIChXTklfQ0ZHX1NBUF9DSEFOTkVMX1NFTEVDVF9FTkRfQ0hBTk5FTF9BUE1BWCA8IGVuZENoYW5uZWwpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGVuZENoYW5uZWwgdmFsdWUgb24gV0xBTlNBUF9TZXRDaGFubmVsUmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisgICAgc3dpdGNoKG9wZXJhdGluZ0JhbmQpCisgICAgeworICAgICAgIGNhc2UgUkZfU1VCQkFORF8yXzRfR0haOgorICAgICAgICAgIGJhbmRTdGFydENoYW5uZWwgPSBSRl9DSEFOXzE7CisgICAgICAgICAgYmFuZEVuZENoYW5uZWwgPSBSRl9DSEFOXzE0OworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgIGNhc2UgUkZfU1VCQkFORF81X0xPV19HSFo6CisgICAgICAgICAgYmFuZFN0YXJ0Q2hhbm5lbCA9IFJGX0NIQU5fMzY7CisgICAgICAgICAgYmFuZEVuZENoYW5uZWwgPSBSRl9DSEFOXzY0OworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgIGNhc2UgUkZfU1VCQkFORF81X01JRF9HSFo6CisgICAgICAgICAgYmFuZFN0YXJ0Q2hhbm5lbCA9IFJGX0NIQU5fMTAwOworICAgICAgICAgIGJhbmRFbmRDaGFubmVsID0gUkZfQ0hBTl8xNDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgY2FzZSBSRl9TVUJCQU5EXzVfSElHSF9HSFo6CisgICAgICAgICAgYmFuZFN0YXJ0Q2hhbm5lbCA9IFJGX0NIQU5fMTQ5OworICAgICAgICAgIGJhbmRFbmRDaGFubmVsID0gUkZfQ0hBTl8xNjU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgY2FzZSBSRl9TVUJCQU5EXzRfOV9HSFo6CisgICAgICAgICAgYmFuZFN0YXJ0Q2hhbm5lbCA9IFJGX0NIQU5fMjQwOworICAgICAgICAgIGJhbmRFbmRDaGFubmVsID0gUkZfQ0hBTl8yMTY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3BlcmF0aW5nQmFuZCB2YWx1ZSBvbiBXTEFOU0FQX1NldENoYW5uZWxSYW5nZSIpOworICAgICAgICAgIGJyZWFrOworICAgIH0gICAgICAKKyAKKyAgICAvKiBWYWxpZGF0aW5nIHRoZSBzdGFydCBjaGFubmVsIGlzIGluIHJhbmdlIG9yIG5vdCovCisgICAgZm9yKGxvb3BTdGFydENvdW50ID0gYmFuZFN0YXJ0Q2hhbm5lbCA7IGxvb3BTdGFydENvdW50IDw9IGJhbmRFbmRDaGFubmVsIDsgCisgICAgbG9vcFN0YXJ0Q291bnQrKykKKyAgICB7IAorICAgICAgIGlmKHJmQ2hhbm5lbHNbbG9vcFN0YXJ0Q291bnRdLmNoYW5uZWxOdW0gPT0gc3RhcnRDaGFubmVsICkKKyAgICAgICB7CisgICAgICAgICAgLyogc3RhcnQgY2hhbm5lbCBpcyBpbiB0aGUgcmFuZ2UgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgfQorICAgIC8qIFZhbGlkYXRpbmcgdGhlIEVuZCBjaGFubmVsIGlzIGluIHJhbmdlIG9yIG5vdCovCisgICAgZm9yKGxvb3BFbmRDb3VudCA9IGJhbmRTdGFydENoYW5uZWwgOyBsb29wRW5kQ291bnQgPD0gYmFuZEVuZENoYW5uZWwgOyAKKyAgICBsb29wRW5kQ291bnQrKykKKyAgICB7IAorICAgICAgICBpZihyZkNoYW5uZWxzW2xvb3BFbmRDb3VudF0uY2hhbm5lbE51bSA9PSBlbmRDaGFubmVsICkKKyAgICAgICAgeworICAgICAgICAgIC8qIEVuZCBjaGFubmVsIGlzIGluIHRoZSByYW5nZSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoKGxvb3BTdGFydENvdW50ID4gYmFuZEVuZENoYW5uZWwpfHwobG9vcEVuZENvdW50ID4gYmFuZEVuZENoYW5uZWwpKQorICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgc3RhcnRDaGFubmVsLSVkIG9yIEVuZENoYW5uZWwtJWQgZm9yIGJhbmQgLSVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sc3RhcnRDaGFubmVsLGVuZENoYW5uZWwsb3BlcmF0aW5nQmFuZCk7CisgICAgICAgLyogU3VwcGxpZWQgY2hhbm5lbHMgYXJlIG50IGluIHRoZSBvcGVyYXRpbmcgYmFuZCBzbyBzZXQgdGhlIGRlZmF1bHQgCisgICAgICAgICAgICBjaGFubmVscyBmb3IgdGhlIGdpdmVuIG9wZXJhdGluZyBiYW5kICovCisgICAgICAgc3RhcnRDaGFubmVsID0gcmZDaGFubmVsc1tiYW5kU3RhcnRDaGFubmVsXS5jaGFubmVsTnVtOworICAgICAgIGVuZENoYW5uZWwgPSByZkNoYW5uZWxzW2JhbmRFbmRDaGFubmVsXS5jaGFubmVsTnVtOzsKKyAgICB9CisgICAgCisgICAgLypTZWFyY2ggZm9yIHRoZSBBY3RpdmUgY2hhbm5lbHMgaW4gdGhlIGdpdmVuIHJhbmdlICovCisgICAgZm9yKCBsb29wU3RhcnRDb3VudCA9IGJhbmRTdGFydENoYW5uZWw7IGxvb3BTdGFydENvdW50IDw9IGJhbmRFbmRDaGFubmVsOyBsb29wU3RhcnRDb3VudCsrICkKKyAgICB7CisgICAgICAgaWYoKHN0YXJ0Q2hhbm5lbCA8PSByZkNoYW5uZWxzW2xvb3BTdGFydENvdW50XS5jaGFubmVsTnVtKSYmCisgICAgICAgICAgICAgKGVuZENoYW5uZWwgPj0gcmZDaGFubmVsc1tsb29wU3RhcnRDb3VudF0uY2hhbm5lbE51bSApKQorICAgICAgIHsKKyAgICAgICAgICBpZiggcmVnQ2hhbm5lbHNbbG9vcFN0YXJ0Q291bnRdLmVuYWJsZWQgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICB2YWxpZENoYW5uZWxGbGFnID0gMTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKyAgICBpZigwID09IHZhbGlkQ2hhbm5lbEZsYWcpCisgICAgeyAKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXMtTm8gYWN0aXZlIGNoYW5uZWxzIHByZXNlbnQgaW4gdGhlIGdpdmVuIHJhbmdlIGZvciB0aGUgY3VycmVudCByZWdpb24iLAorICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAvKiBUaGVyZSBpcyBubyBhY3RpdmUgY2hhbm5lbCBpbiB0aGUgc3VwcGxpZWQgcmFuZ2UuVXBkYXRpbmcgdGhlIGNvbmZpZyAKKyAgICAgICB3aXRoIHRoZSBkZWZhdWx0IGNoYW5uZWxzIGluIHRoZSBnaXZlbiBiYW5kIHNvIHRoYXQgd2UgY2FuIHNlbGVjdCB0aGUgYmVzdCBjaGFubmVsIGluIHRoZSBzdWItYmFuZCovCisgICAgICAgc3RhcnRDaGFubmVsID0gcmZDaGFubmVsc1tiYW5kU3RhcnRDaGFubmVsXS5jaGFubmVsTnVtOworICAgICAgIGVuZENoYW5uZWwgPSByZkNoYW5uZWxzW2JhbmRFbmRDaGFubmVsXS5jaGFubmVsTnVtOzsKKyAgICB9CisgICAKKyAgICBpZiAoY2NtQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX09QRVJBVElOR19CQU5ELCAKKyAgICAgICBvcGVyYXRpbmdCYW5kLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpPT1lSEFMX1NUQVRVU19GQUlMVVJFKQorICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfT1BFUkFUSU5HX0JBTkQgdG8gQ0NuIik7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKyAgICBpZiAoY2NtQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfU0FQX0NIQU5ORUxfU0VMRUNUX1NUQVJUX0NIQU5ORUwsIAorICAgICAgICBzdGFydENoYW5uZWwsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgeworIAorICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTCB0byBDQ00iKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgIAorICAgIH0gICAgIAorICAgIGlmIChjY21DZmdTZXRJbnQoaEhhbCwgV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfRU5EX0NIQU5ORUwsIAorICAgICAgIGVuZENoYW5uZWwsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk9PWVIQUxfU1RBVFVTX0ZBSUxVUkUpCisgICAgeworIAorICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiQ291bGQgbm90IHBhc3Mgb24gV05JX0NGR19TQVBfQ0hBTk5FTF9TRUxFQ1RfU1RBUlRfQ0hBTk5FTCB0byBDQ00iKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TZXRDb3VudGVyTWVhc3VyZQorCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGlzYXNzb2NpYXRlIGFsbCB0aGUgc3RhdGlvbnMgYW5kIHByZXZlbnQgCisgICAgYXNzb2NpYXRpb24gZm9yIGFueSBvdGhlciBzdGF0aW9uLldoZW5ldmVyIEF1dGhlbnRpY2F0b3IgcmVjZWl2ZXMgMiBtaWMgZmFpbHVyZXMgCisgICAgd2l0aGluIDYwIHNlY29uZHMsIEF1dGhlbnRpY2F0b3Igd2lsbCBlbmFibGUgY291bnRlciBtZWFzdXJlIGF0IFNBUCBMYXllci4gCisgICAgQXV0aGVudGljYXRvciB3aWxsIHN0YXJ0IHRoZSA2MCBzZWNvbmRzIHRpbWVyLiBDb3JlIHN0YWNrIHdpbGwgbm90IGFsbG93IGFueSAKKyAgICBTVEEgdG8gYXNzb2NpYXRlIHRpbGwgSEREIGRpc2FibGVzIGNvdW50ZXIgbWVhc3N1cmUuIENvcmUgc3RhY2sgc2hhbGwga2ljayBvdXQgYWxsIHRoZSAKKyAgICBTVEEgd2hpY2ggYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGFuZCBESUFTU09DIEV2ZW50IHdpbGwgYmUgcHJvcG9nYXRlZCB0byBIREQgZm9yIAorICAgIGVhY2ggU1RBIHRvIGNsZWFuIHVwIHRoZSBIREQgU1RBIHRhYmxlLk9uY2UgdGhlIDYwIHNlY29uZHMgdGltZXIgZXhwaXJlcywgQXV0aGVudGljYXRvciAKKyAgICB3aWxsIGRpc2FibGUgdGhlIGNvdW50ZXIgbWVhc3N1cmUgYXQgY29yZSBzdGFjay4gTm93IGNvcmUgc3RhY2sgY2FuIGFsbG93IFNUQXMgdG8gYXNzb2NpYXRlLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KK3B2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKK2JFbmFibGU6IElmIFRSVUUgdGhhbiBhbGwgc3RhdGlvbnMgd2lsbCBiZSBkaXNhc3NvY2lhdGVkIGFuZCBubyBtb3JlIHdpbGwgYmUgYWxsb3dlZCB0byBhc3NvY2lhdGUuIElmIEZBTFNFIHRoYW4gQ09SRQord2lsbCBjb21lIG91dCBvZiB0aGlzIHN0YXRlLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlNBUF9TZXRDb3VudGVyTWVhc3VyZQorKAorICAgIHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgICB2X0JPT0xfdCBiRW5hYmxlCispCit7CisgICAgcHRTYXBDb250ZXh0ICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFNhbml0eSBjaGVjaworICAgICAgRXh0cmFjdCBTQVAgY29udHJvbCBibG9jayAKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKE5VTEwgPT0gcFNhcEN0eCkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgc21lX1JvYW1US0lQQ291bnRlck1lYXN1cmVzKFZPU19HRVRfSEFMX0NCKHBTYXBDdHgtPnB2b3NHQ3R4KSwgcFNhcEN0eC0+c2Vzc2lvbklkLCBiRW5hYmxlKTsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOU0FQX1NldEtleXNTdGEKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBzZXQga2V5IGZvciBhIHN0YXRpb24uCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorcHZvc0dDdHg6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorcFNldEtleUluZm86IHRDc3JSb2FtU2V0S2V5IHN0cnVjdHVyZSBmb3IgdGhlIHN0YXRpb24KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5TQVBfU2V0S2V5U3RhCisoCisgICAgdl9QVk9JRF90IHB2b3NHQ3R4LCB0Q3NyUm9hbVNldEtleSAqcFNldEtleUluZm8KKykKK3sKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBwdFNhcENvbnRleHQgIHBTYXBDdHggPSBOVUxMOworICAgIHZfUFZPSURfdCBoSGFsID0gTlVMTDsKKyAgICAgICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB2X1UzMl90IHJvYW1JZD0weEZGOworCisgICAgaWYgKFZPU19TVEFfU0FQX01PREUgPT0gdm9zX2dldF9jb25wYXJhbSAoICkpCisgICAgeworICAgICAgICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworICAgICAgICBpZiAoTlVMTCA9PSBwU2FwQ3R4KQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKyAgICAgICAgaEhhbCA9IFZPU19HRVRfSEFMX0NCKHBTYXBDdHgtPnB2b3NHQ3R4KTsKKyAgICAgICAgaWYgKE5VTEwgPT0gaEhhbCkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9Sb2FtU2V0S2V5KGhIYWwsIHBTYXBDdHgtPnNlc3Npb25JZCwgcFNldEtleUluZm8sICZyb2FtSWQpOworCisgICAgICAgIGlmIChoYWxTdGF0dXMgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBVUxUOworCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOU0FQX0RlbEtleVN0YQorCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIHRvIGRlbGV0ZSBrZXkgZm9yIGEgc3RhdGlvbi4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCitwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCitwU2V0S2V5SW5mbzogdENzclJvYW1SZW1vdmVLZXkgc3RydWN0dXJlIGZvciB0aGUgc3RhdGlvbgorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlNBUF9EZWxLZXlTdGEKKygKKyAgICAgdl9QVk9JRF90IHB2b3NHQ3R4LCAKKyAgICB0Q3NyUm9hbVJlbW92ZUtleSAqcFJlbW92ZUtleUluZm8KKykKK3sKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBwdFNhcENvbnRleHQgIHBTYXBDdHggPSBOVUxMOworICAgIHZfUFZPSURfdCBoSGFsID0gTlVMTDsKKyAgICBlSGFsU3RhdHVzIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdl9VMzJfdCByb2FtSWQ9MHhGRjsKKyAgICB0Q3NyUm9hbVJlbW92ZUtleSBSZW1vdmVLZXlJbmZvOworCisgICAgaWYgKFZPU19TVEFfU0FQX01PREUgPT0gdm9zX2dldF9jb25wYXJhbSAoICkpCisgICAgeworICAgICAgICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworICAgICAgICBpZiAoTlVMTCA9PSBwU2FwQ3R4KQorICAgICAgICB7IAorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisKKyAgICAgICAgaEhhbCA9IFZPU19HRVRfSEFMX0NCKHBTYXBDdHgtPnB2b3NHQ3R4KTsKKyAgICAgICAgaWYgKE5VTEwgPT0gaEhhbCkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisKKyAgICAgICAgdm9zX21lbV96ZXJvKCZSZW1vdmVLZXlJbmZvLCBzaXplb2YoUmVtb3ZlS2V5SW5mbykpOworICAgICAgICBSZW1vdmVLZXlJbmZvLmVuY1R5cGUgPSBwUmVtb3ZlS2V5SW5mby0+ZW5jVHlwZTsKKyAgICAgICAgdm9zX21lbV9jb3B5KFJlbW92ZUtleUluZm8ucGVlck1hYywgcFJlbW92ZUtleUluZm8tPnBlZXJNYWMsIFdOSV9DRkdfQlNTSURfTEVOKTsgCisgICAgICAgIFJlbW92ZUtleUluZm8ua2V5SWQgPSBwUmVtb3ZlS2V5SW5mby0+a2V5SWQ7CisKKyAgICAgICAgaGFsU3RhdHVzID0gc21lX1JvYW1SZW1vdmVLZXkoaEhhbCwgcFNhcEN0eC0+c2Vzc2lvbklkLCAmUmVtb3ZlS2V5SW5mbywgJnJvYW1JZCk7CisKKyAgICAgICAgaWYgKEhBTF9TVEFUVVNfU1VDQ0VTUyhoYWxTdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFVTFQ7CisKKyAgICByZXR1cm4gdm9zU3RhdHVzOworfQorCitWT1NfU1RBVFVTCitXTEFOU2FwX2dldHN0YXRpb25JRV9pbmZvcm1hdGlvbih2X1BWT0lEX3QgcHZvc0dDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCAgICpwTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICAgICpwQnVmKQoreworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgcHRTYXBDb250ZXh0ICBwU2FwQ3R4ID0gTlVMTDsKKyAgICB2X1UzMl90IGxlbiA9IDA7CisKKyAgICBpZiAoVk9TX1NUQV9TQVBfTU9ERSA9PSB2b3NfZ2V0X2NvbnBhcmFtICggKSl7CisgICAgICAgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQihwdm9zR0N0eCk7CisgICAgICAgIGlmIChOVUxMID09IHBTYXBDdHgpCisgICAgICAgIHsgCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBMZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbiA9ICpwTGVuOworICAgICAgICAgICAgKnBMZW4gPSBwU2FwQ3R4LT5uU3RhV1BBUlNuUmVxSWVMZW5ndGg7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBXUEFJRSBsZW4gOiAleCIsIF9fRlVOQ1RJT05fXywgKnBMZW4pOworICAgICAgICAgICAgaWYocEJ1ZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihsZW4gPj0gcFNhcEN0eC0+blN0YVdQQVJTblJlcUllTGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KCBwQnVmLCBwU2FwQ3R4LT5wU3RhV3BhUnNuUmVxSUUsIHBTYXBDdHgtPm5TdGFXUEFSU25SZXFJZUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogV1BBSUU6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmWzNdLCBwQnVmWzRdLCBwQnVmWzVdKTsKKyAgICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgIAorICAgIGlmKCBWT1NfU1RBVFVTX0VfRkFJTFVSRSA9PSB2b3NTdGF0dXMpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICIlczogRXJyb3IgdW5hYmxlIHRvIHBvcHVsYXRlIHRoZSBSU05XUEFJRSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOyAKKyAgICB9CisKKyAgICByZXR1cm4gdm9zU3RhdHVzOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TZXRfV3BzSWUKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyBmb3IgQXAgQXBwL0hERCB0byBzZXQgV1BTIElFLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KK3B2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKK3BXUFNJRTogIHRTYXBfV1BTSUUgc3RydWN0dXJlIHRoYXQgaW5jbHVkZSBXUFMgSUVzCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOU0FQX1NldF9XcHNJZQorKAorIHZfUFZPSURfdCBwdm9zR0N0eCwgdFNhcF9XUFNJRSAqcFNhcF9XUFNJZQorKQoreworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisgICAgdl9QVk9JRF90IGhIYWwgPSBOVUxMOworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiJXMsICVkIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7ICAgIAorICAgICAgICAgICAgCisgICAgaWYoVk9TX1NUQV9TQVBfTU9ERSA9PSB2b3NfZ2V0X2NvbnBhcmFtICggKSkgeworICAgICAgICBwU2FwQ3R4ID0gVk9TX0dFVF9TQVBfQ0IocHZvc0dDdHgpOworICAgICAgICBpZiAoIE5VTEwgPT0gcFNhcEN0eCApCisgICAgICAgIHsgCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGhIYWwgPSBWT1NfR0VUX0hBTF9DQihwU2FwQ3R4LT5wdm9zR0N0eCk7CisgICAgICAgIGlmICggTlVMTCA9PSBoSGFsICl7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBIQUwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICggc2FwX0FjcXVpcmVHbG9iYWxMb2NrKCBwU2FwQ3R4ICkgPT0gVk9TX1NUQVRVU19TVUNDRVNTICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBTYXBfV1BTSWUtPnNhcFdQU0lFQ29kZSA9PSBlU0FQX1dQU19CRUFDT05fSUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KCZwU2FwQ3R4LT5BUFdQU0lFcy5TaXJXUFNCZWFjb25JRSwgJnBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU0JlYWNvbklFLCBzaXplb2YodFNhcF9XUFNCZWFjb25JRSkpOyAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBTYXBfV1BTSWUtPnNhcFdQU0lFQ29kZSA9PSBlU0FQX1dQU19QUk9CRV9SU1BfSUUpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZvc19tZW1fY29weSgmcFNhcEN0eC0+QVBXUFNJRXMuU2lyV1BTUHJvYmVSc3BJRSwgJnBTYXBfV1BTSWUtPnNhcHdwc2llLnNhcFdQU1Byb2JlUnNwSUUsIHNpemVvZih0U2FwX1dQU1Byb2JlUnNwSUUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYXBfUmVsZWFzZUdsb2JhbExvY2soIHBTYXBDdHggKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2FwX1JlbGVhc2VHbG9iYWxMb2NrKCBwU2FwQ3R4ICk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgIFdMQU5TQVBfVXBkYXRlX1dwc0llCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIEFwIEFwcC9IREQgdG8gdXBkYXRlIFdQUyBJRXMuCisKKyAgREVQRU5ERU5DSUVTCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCitwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOU0FQX1VwZGF0ZV9XcHNJZQorKAorIHZfUFZPSURfdCBwdm9zR0N0eAorKQoreworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisgICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHZfUFZPSURfdCBoSGFsID0gTlVMTDsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICIlcywgJWQiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgICAgCisgICAgCisgICAgaWYoVk9TX1NUQV9TQVBfTU9ERSA9PSB2b3NfZ2V0X2NvbnBhcmFtICggKSl7CisgICAgICAgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQihwdm9zR0N0eCk7CisgICAgICAgIGlmICggTlVMTCA9PSBwU2FwQ3R4ICkKKyAgICAgICAgeyAKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgICAgfQorCisgICAgICAgIGhIYWwgPSBWT1NfR0VUX0hBTF9DQihwU2FwQ3R4LT5wdm9zR0N0eCk7CisgICAgICAgIGlmICggTlVMTCA9PSBoSGFsICl7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBIQUwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKworICAgICAgICBoYWxTdGF0dXMgPSBzbWVfUm9hbVVwZGF0ZUFQV1BTSUUoIGhIYWwsIHBTYXBDdHgtPnNlc3Npb25JZCwgJnBTYXBDdHgtPkFQV1BTSUVzKTsKKworICAgICAgICBpZihoYWxTdGF0dXMgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gdm9zU3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfR2V0X1dQU19TdGF0ZQorCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIHRvIGNoZWNrIGlmIFdQUyBzZXNzaW9uIGluIHByb2Nlc3MuCisKKyAgREVQRU5ERU5DSUVTCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCitwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisKKyAgICBPVVQKK3BiV1BTU3RhdGU6IFBvaW50ZXIgdG8gdmFyaWFibGUgdG8gaW5kaWNhdGUgaWYgaXQgaXMgaW4gV1BTIFJlZ2lzdHJhdGlvbiBzdGF0ZQorIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5TQVBfR2V0X1dQU19TdGF0ZQorKAorIHZfUFZPSURfdCBwdm9zR0N0eCwgdl9CT09MX3QgKmJXUFNTdGF0ZQorKQoreworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisgICAgdl9QVk9JRF90IGhIYWwgPSBOVUxMOworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICIlcywgJWQiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgICAgCisgICAgICAgICAgCisgICAgaWYoVk9TX1NUQV9TQVBfTU9ERSA9PSB2b3NfZ2V0X2NvbnBhcmFtICggKSl7CisgICAgCisgICAgICAgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQihwdm9zR0N0eCk7CisgICAgICAgIGlmICggTlVMTCA9PSBwU2FwQ3R4ICkKKyAgICAgICAgeyAKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFNBUCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKworICAgICAgICBoSGFsID0gVk9TX0dFVF9IQUxfQ0IocFNhcEN0eC0+cHZvc0dDdHgpOworICAgICAgICBpZiAoIE5VTEwgPT0gaEhhbCApeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisgICAgCisgICAgICAgIGlmICggc2FwX0FjcXVpcmVHbG9iYWxMb2NrKHBTYXBDdHggKSA9PSBWT1NfU1RBVFVTX1NVQ0NFU1MgKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwU2FwQ3R4LT5BUFdQU0lFcy5TaXJXUFNQcm9iZVJzcElFLkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9TRUxFQ1RFRFJFR0lTVFJBX1BSRVNFTlQpCisgICAgICAgICAgICAgICAgKmJXUFNTdGF0ZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpiV1BTU3RhdGUgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNhcF9SZWxlYXNlR2xvYmFsTG9jayggcFNhcEN0eCAgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworCit9CisKK1ZPU19TVEFUVVMKK3NhcF9BY3F1aXJlR2xvYmFsTG9jaworKAorICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCAKKykKK3sKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQVVMVDsKKworICAgIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc19sb2NrX2FjcXVpcmUoICZwU2FwQ3R4LT5TYXBHbG9iYWxMb2NrKSApICkKKyAgICB7CisgICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0dXJuICh2b3NTdGF0dXMpOworfQorCitWT1NfU1RBVFVTCitzYXBfUmVsZWFzZUdsb2JhbExvY2sKKygKKyAgICBwdFNhcENvbnRleHQgIHBTYXBDdHggCispCit7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFVTFQ7CisKKyAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NfbG9ja19yZWxlYXNlKCAmcFNhcEN0eC0+U2FwR2xvYmFsTG9jaykgKSApCisgICAgeworICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0dXJuICh2b3NTdGF0dXMpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5TQVBfU2V0X1dQQVJTTkllcworCisgIERFU0NSSVBUSU9OIAorICAgIFRoaXMgYXBpIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBBcCBBcHAvSEREIHRvIHNldCBBUCBXUEEgYW5kIFJTTiBJRSBpbiBpdHMgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZS4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgICAgIHB2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgICAgICAgcFdQQVJTTklFczogYnVmZmVyIHRvIHRoZSBXUEEvUlNOIElFcyAKKyAgICAgICAgV1BBUlNOSUVzTGVuOiBsZW5ndGggb2YgV1BBL1JTTiBJRXMKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlNBUF9TZXRfV1BBUlNOSWVzKHZfUFZPSURfdCBwdm9zR0N0eCwgdl9VOF90ICpwV1BBUlNOSUVzLCB2X1UzMl90IFdQQVJTTklFc0xlbikKK3sKKyAKKyAgICBwdFNhcENvbnRleHQgIHBTYXBDdHggPSBOVUxMOworICAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB2X1BWT0lEX3QgaEhhbCA9IE5VTEw7CisKKyAgICBpZihWT1NfU1RBX1NBUF9NT0RFID09IHZvc19nZXRfY29ucGFyYW0gKCApKXsKKyAgICAgICAgcFNhcEN0eCA9IFZPU19HRVRfU0FQX0NCKHB2b3NHQ3R4KTsKKyAgICAgICAgaWYgKCBOVUxMID09IHBTYXBDdHggKQorICAgICAgICB7IAorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisKKyAgICAgICAgaEhhbCA9IFZPU19HRVRfSEFMX0NCKHBTYXBDdHgtPnB2b3NHQ3R4KTsKKyAgICAgICAgaWYgKCBOVUxMID09IGhIYWwgKXsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIEhBTCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcFNhcEN0eC0+QVBXUEFSU05JRXMubGVuZ3RoID0gKHRBTklfVTE2KVdQQVJTTklFc0xlbjsKKyAgICAgICAgdm9zX21lbV9jb3B5KHBTYXBDdHgtPkFQV1BBUlNOSUVzLnJzbklFZGF0YSwgcFdQQVJTTklFcywgV1BBUlNOSUVzTGVuKTsKKyAgICAKKyAgICAgICAgaGFsU3RhdHVzID0gc21lX1JvYW1VcGRhdGVBUFdQQVJTTklFcyggaEhhbCwgcFNhcEN0eC0+c2Vzc2lvbklkLCAmcFNhcEN0eC0+QVBXUEFSU05JRXMpOworCisgICAgICAgIGlmKGhhbFN0YXR1cyA9PSBlSEFMX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7ICAgIAorfQorCitWT1NfU1RBVFVTIFdMQU5TQVBfR2V0U3RhdGlzdGljcyh2X1BWT0lEX3QgcHZvc0dDdHgsIHRTYXBfU29mdGFwU3RhdHMgKnN0YXRCdWYsIHZfQk9PTF90IGJSZXNldCkKK3sKKyAgICBpZiAoTlVMTCA9PSBwdm9zR0N0eCkKKyAgICB7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorCisgICAgcmV0dXJuIChXTEFOVExfR2V0U29mdEFQU3RhdGlzdGljcyhwdm9zR0N0eCwgc3RhdEJ1ZiwgYlJlc2V0KSk7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9TZW5kQWN0aW9uCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgZnVuY3Rpb24gcHJvdmlkZXMgdG8gc2VuZCBhY3Rpb24gZnJhbWUgc2VudCBieSB1cHBlciBsYXllci4KKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICBJTgorICAgIHB2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgICBwQnVmOiBQb2ludGVyIG9mIHRoZSBhY3Rpb24gZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQKKyAgICBsZW46IExlbmd0aCBvZiB0aGUgYWN0aW9uIGZyYW1lCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5TQVBfU2VuZEFjdGlvbiggdl9QVk9JRF90IHB2b3NHQ3R4LCBjb25zdCB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIGxlbiApCit7CisgICAgcHRTYXBDb250ZXh0ICBwU2FwQ3R4ID0gTlVMTDsKKyAgICB2X1BWT0lEX3QgaEhhbCA9IE5VTEw7CisgICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworCisgICAgaWYoIFZPU19TVEFfU0FQX01PREUgPT0gdm9zX2dldF9jb25wYXJhbSAoICkgKQorICAgIHsKKyAgICAgICAgcFNhcEN0eCA9IFZPU19HRVRfU0FQX0NCKCBwdm9zR0N0eCApOworICAgICAgICBpZiAoTlVMTCA9PSBwU2FwQ3R4KQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBTQVAgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKyAgICAgICAgaEhhbCA9IFZPU19HRVRfSEFMX0NCKHBTYXBDdHgtPnB2b3NHQ3R4KTsKKyAgICAgICAgaWYoICggTlVMTCA9PSBoSGFsICkgfHwgKCBlU0FQX1RSVUUgIT0gcFNhcEN0eC0+aXNTYXBTZXNzaW9uT3BlbiApICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEhBTCBwb2ludGVyICglcCkgTlVMTCBPUiBTTUUgc2Vzc2lvbiBpcyBub3Qgb3BlbiAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoSGFsLCBwU2FwQ3R4LT5pc1NhcFNlc3Npb25PcGVuICk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisKKyAgICAgICAgaGFsU3RhdHVzID0gc21lX3NlbmRBY3Rpb24oIGhIYWwsIHBTYXBDdHgtPnNlc3Npb25JZCwgcEJ1ZiwgbGVuICk7CisKKyAgICAgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IGhhbFN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIFNlbmQgQWN0aW9uIEZyYW1lIik7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9SZW1haW5PbkNoYW5uZWwKKworICBERVNDUklQVElPTiAKKyAgICBUaGlzIGFwaSBmdW5jdGlvbiBwcm92aWRlcyB0byBzZXQgUmVtYWluIE9uIGNoYW5uZWwgb24gc3BlY2lmaWVkIGNoYW5uZWwKKyAgICBmb3Igc3BlY2lmaWVkIGR1cmF0aW9uLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgIElOCisgICAgcHZvc0dDdHg6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgIGNoYW5uZWw6IENoYW5uZWwgb24gd2hpY2ggZHJpdmVyIGhhcyB0byBsaXN0ZW4gCisgICAgZHVyYXRpb246IER1cmF0aW9uIGZvciB3aGljaCBkcml2ZXIgaGFzIHRvIGxpc3RlbiBvbiBzcGVjaWZpZWQgY2hhbm5lbAorICAgIGNhbGxiYWNrOiBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb25jZSBMaXN0ZW4gaXMgZG9uZS4KKyAgICBwQ29udGV4dDogQ29udGV4dCBuZWVkcyB0byBiZSBjYWxsZWQgaW4gY2FsbGJhY2sgZnVuY3Rpb24uIAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSBWT1NfU1RBVFVTIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBTdWNjZXNzCisgIAorICBTSURFIEVGRkVDVFMgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOU0FQX1JlbWFpbk9uQ2hhbm5lbCggdl9QVk9JRF90IHB2b3NHQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjaGFubmVsLCB0QU5JX1UzMiBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbk9uQ2hhbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENvbnRleHQgKQoreworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisgICAgdl9QVk9JRF90IGhIYWwgPSBOVUxMOworICAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgIGlmKCBWT1NfU1RBX1NBUF9NT0RFID09IHZvc19nZXRfY29ucGFyYW0gKCApICkKKyAgICB7CisgICAgICAgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQiggcHZvc0dDdHggKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcFNhcEN0eCkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisgICAgICAgIGhIYWwgPSBWT1NfR0VUX0hBTF9DQihwU2FwQ3R4LT5wdm9zR0N0eCk7CisgICAgICAgIGlmKCAoIE5VTEwgPT0gaEhhbCApIHx8ICggZVNBUF9UUlVFICE9IHBTYXBDdHgtPmlzU2FwU2Vzc2lvbk9wZW4gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBIQUwgcG9pbnRlciAoJXApIE5VTEwgT1IgU01FIHNlc3Npb24gaXMgbm90IG9wZW4gKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaEhhbCwgcFNhcEN0eC0+aXNTYXBTZXNzaW9uT3BlbiApOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgICAgfQorCisgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9SZW1haW5PbkNoYW5uZWwoIGhIYWwsIHBTYXBDdHgtPnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwgZHVyYXRpb24sIGNhbGxiYWNrLCBwQ29udGV4dCApOworCisgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IGhhbFN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIFNldCBSZW1haW4gb24gQ2hhbm5lbCIpOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5TQVBfQ2FuY2VsUmVtYWluT25DaGFubmVsCisKKyAgREVTQ1JJUFRJT04gCisgICAgVGhpcyBhcGkgY2FuY2VsIHByZXZpb3VzIHJlbWFpbiBvbiBjaGFubmVsIHJlcXVlc3QuCisKKyAgREVQRU5ERU5DSUVTIAorICAgIE5BLiAKKworICBQQVJBTUVURVJTCisKKyAgSU4KKyAgICBwdm9zR0N0eDogUG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQgc3RydWN0dXJlCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5TQVBfQ2FuY2VsUmVtYWluT25DaGFubmVsKCB2X1BWT0lEX3QgcHZvc0dDdHggKQoreworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisgICAgdl9QVk9JRF90IGhIYWwgPSBOVUxMOworICAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgIGlmKCBWT1NfU1RBX1NBUF9NT0RFID09IHZvc19nZXRfY29ucGFyYW0gKCApICkKKyAgICB7CisgICAgICAgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQiggcHZvc0dDdHggKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcFNhcEN0eCkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisgICAgICAgIGhIYWwgPSBWT1NfR0VUX0hBTF9DQihwU2FwQ3R4LT5wdm9zR0N0eCk7CisgICAgICAgIGlmKCAoIE5VTEwgPT0gaEhhbCApIHx8ICggZVNBUF9UUlVFICE9IHBTYXBDdHgtPmlzU2FwU2Vzc2lvbk9wZW4gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBIQUwgcG9pbnRlciAoJXApIE5VTEwgT1IgU01FIHNlc3Npb24gaXMgbm90IG9wZW4gKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaEhhbCwgcFNhcEN0eC0+aXNTYXBTZXNzaW9uT3BlbiApOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgICAgfQorCisgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9DYW5jZWxSZW1haW5PbkNoYW5uZWwoIGhIYWwsIHBTYXBDdHgtPnNlc3Npb25JZCApOworCisgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IGhhbFN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gQ2FuY2VsIFJlbWFpbiBvbiBDaGFubmVsIik7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9SZWdpc3Rlck1nbXRGcmFtZQorCisgIERFU0NSSVBUSU9OIAorICAgIEhERCB1c2UgdGhpcyBBUEkgdG8gcmVnaXN0ZXIgc3BlY2lmaWVkIHR5cGUgb2YgZnJhbWUgd2l0aCBDT1JFIHN0YWNrLgorICAgIE9uIHJlY2VpdmluZyBzdWNoIGtpbmQgb2YgZnJhbWUgQ09SRSBzdGFjayBzaG91bGQgcGFzcyB0aGlzIGZyYW1lIHRvIEhERAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBOQS4gCisKKyAgUEFSQU1FVEVSUworCisgIElOCisgICAgcHZvc0dDdHg6IFBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0IHN0cnVjdHVyZQorICAgIGZyYW1lVHlwZTogZnJhbWVUeXBlIHRoYXQgbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIFBFLgorICAgIG1hdGNoRGF0YTogRGF0YSBwb2ludGVyIHdoaWNoIHNob3VsZCBiZSBtYXRjaGVkIGFmdGVyIGZyYW1lIHR5cGUgaXMgbWF0Y2hlZC4KKyAgICBtYXRjaExlbjogTGVuZ3RoIG9mIHRoZSBtYXRjaERhdGEKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgVk9TX1NUQVRVUyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgU3VjY2VzcworICAKKyAgU0lERSBFRkZFQ1RTICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlNBUF9SZWdpc3Rlck1nbXRGcmFtZSggdl9QVk9JRF90IHB2b3NHQ3R4LCB0QU5JX1UxNiBmcmFtZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTgqIG1hdGNoRGF0YSwgdEFOSV9VMTYgbWF0Y2hMZW4gKQoreworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisgICAgdl9QVk9JRF90IGhIYWwgPSBOVUxMOworICAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgIGlmKCBWT1NfU1RBX1NBUF9NT0RFID09IHZvc19nZXRfY29ucGFyYW0gKCApICkKKyAgICB7CisgICAgICAgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQiggcHZvc0dDdHggKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcFNhcEN0eCkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisgICAgICAgIGhIYWwgPSBWT1NfR0VUX0hBTF9DQihwU2FwQ3R4LT5wdm9zR0N0eCk7CisgICAgICAgIGlmKCAoIE5VTEwgPT0gaEhhbCApIHx8ICggZVNBUF9UUlVFICE9IHBTYXBDdHgtPmlzU2FwU2Vzc2lvbk9wZW4gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBIQUwgcG9pbnRlciAoJXApIE5VTEwgT1IgU01FIHNlc3Npb24gaXMgbm90IG9wZW4gKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaEhhbCwgcFNhcEN0eC0+aXNTYXBTZXNzaW9uT3BlbiApOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgICAgfQorCisgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9SZWdpc3Rlck1nbXRGcmFtZShoSGFsLCBwU2FwQ3R4LT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lVHlwZSwgbWF0Y2hEYXRhLCBtYXRjaExlbik7CisKKyAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gaGFsU3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBSZWdpc3RlciBNR01UIGZyYW1lIik7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlNBUF9EZVJlZ2lzdGVyTWdtdEZyYW1lCisKKyAgREVTQ1JJUFRJT04gCisgICBUaGlzIEFQSSBpcyB1c2VkIHRvIGRlcmVnaXN0ZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIGZyYW1lLiAKKworICBERVBFTkRFTkNJRVMgCisgICAgTkEuIAorCisgIFBBUkFNRVRFUlMKKworICBJTgorICAgIHB2b3NHQ3R4OiBQb2ludGVyIHRvIHZvcyBnbG9iYWwgY29udGV4dCBzdHJ1Y3R1cmUKKyAgICBmcmFtZVR5cGU6IGZyYW1lVHlwZSB0aGF0IG5lZWRzIHRvIGJlIERlLXJlZ2lzdGVyZWQgd2l0aCBQRS4KKyAgICBtYXRjaERhdGE6IERhdGEgcG9pbnRlciB3aGljaCBzaG91bGQgYmUgbWF0Y2hlZCBhZnRlciBmcmFtZSB0eXBlIGlzIG1hdGNoZWQuCisgICAgbWF0Y2hMZW46IExlbmd0aCBvZiB0aGUgbWF0Y2hEYXRhCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIFZPU19TVEFUVVMgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIFN1Y2Nlc3MKKyAgCisgIFNJREUgRUZGRUNUUyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5TQVBfRGVSZWdpc3Rlck1nbXRGcmFtZSggdl9QVk9JRF90IHB2b3NHQ3R4LCB0QU5JX1UxNiBmcmFtZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTgqIG1hdGNoRGF0YSwgdEFOSV9VMTYgbWF0Y2hMZW4gKQoreworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisgICAgdl9QVk9JRF90IGhIYWwgPSBOVUxMOworICAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgIGlmKCBWT1NfU1RBX1NBUF9NT0RFID09IHZvc19nZXRfY29ucGFyYW0gKCApICkKKyAgICB7CisgICAgICAgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQiggcHZvc0dDdHggKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcFNhcEN0eCkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICB9CisgICAgICAgIGhIYWwgPSBWT1NfR0VUX0hBTF9DQihwU2FwQ3R4LT5wdm9zR0N0eCk7CisgICAgICAgIGlmKCAoIE5VTEwgPT0gaEhhbCApIHx8ICggZVNBUF9UUlVFICE9IHBTYXBDdHgtPmlzU2FwU2Vzc2lvbk9wZW4gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBIQUwgcG9pbnRlciAoJXApIE5VTEwgT1IgU01FIHNlc3Npb24gaXMgbm90IG9wZW4gKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaEhhbCwgcFNhcEN0eC0+aXNTYXBTZXNzaW9uT3BlbiApOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgICAgfQorCisgICAgICAgIGhhbFN0YXR1cyA9IHNtZV9EZXJlZ2lzdGVyTWdtdEZyYW1lKCBoSGFsLCBwU2FwQ3R4LT5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lVHlwZSwgbWF0Y2hEYXRhLCBtYXRjaExlbiApOworCisgICAgICAgIGlmKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IGhhbFN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gRGVyZWdpc3RlciBNR01UIGZyYW1lIik7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworfQorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QMlAKZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9idGNBcGkuaCBiL0NPUkUvU01FL2luYy9idGNBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2QyNDY2Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvaW5jL2J0Y0FwaS5oCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgYnRjQXBpLmgKKyoKKyogRGVzY3JpcHRpb246IEJUQyBFdmVudHMgTGF5ZXIgQVBJIGRlZmluaXRpb25zLgorKgorKiBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19CVENfQVBJX0hfXworI2RlZmluZSBfX0JUQ19BUElfSF9fCisKKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJ2b3NfdGltZXIuaCIKKworI2RlZmluZSBCVF9JTlZBTElEX0NPTk5fSEFORExFICgweEZGRkYpICAvKio8IEludmFsaWQgY29ubmVjdGlvbiBoYW5kbGUgKi8KKworLyogQUNMIGFuZCBTeW5jIGNvbm5lY3Rpb24gYXR0ZW1wdCByZXN1bHRzICovCisjZGVmaW5lIEJUX0NPTk5fU1RBVFVTX0ZBSUwgICAgICAoMCkgICAgICAgICAvKio8IENvbm5lY3Rpb24gZmFpbGVkICovCisjZGVmaW5lIEJUX0NPTk5fU1RBVFVTX1NVQ0NFU1MgICAoMSkgICAgICAgICAvKio8IENvbm5lY3Rpb24gc3VjY2Vzc2Z1bCAqLworI2RlZmluZSBCVF9DT05OX1NUQVRVU19NQVggICAgICAgKDIpICAgICAgICAgLyoqPCBUaGlzIGFuZCBiZXlvbmQgYXJlIGludmFsaWQgdmFsdWVzICovCisKKy8qKiBBQ0wgYW5kIFN5bmMgbGluayB0eXBlcworICBUaGVzZSBtdXN0IG1hdGNoIHRoZSBCbHVldG9vdGggU3BlYyEKKyovCisjZGVmaW5lIEJUX1NDTyAgICAgICAgICAgICAgICAgICgwKSAgIC8qKjwgU0NPIExpbmsgKi8KKyNkZWZpbmUgQlRfQUNMICAgICAgICAgICAgICAgICAgKDEpICAgLyoqPCBBQ0wgTGluayAqLworI2RlZmluZSBCVF9lU0NPICAgICAgICAgICAgICAgICAoMikgICAvKio8IGVTQ08gTGluayAqLworI2RlZmluZSBCVF9MSU5LX1RZUEVfTUFYICAgICAgICAoMykgICAvKio8IFRoaXMgdmFsdWUgYW5kIGhpZ2hlciBhcmUgaW52YWxpZCAqLworCisvKiogQUNMIGxpbmsgbW9kZXMKKyAgICBUaGVzZSBtdXN0IG1hdGNoIHRoZSBCbHVldG9vdGggU3BlYyEKKyovCisjZGVmaW5lIEJUX0FDTF9BQ1RJVkUgICAgICAgICAgICgwKSAgIC8qKjwgQWN0aXZlIG1vZGUgKi8KKyNkZWZpbmUgQlRfQUNMX0hPTEQgICAgICAgICAgICAgKDEpICAgLyoqPCBIb2xkIG1vZGUgKi8KKyNkZWZpbmUgQlRfQUNMX1NOSUZGICAgICAgICAgICAgKDIpICAgLyoqPCBTbmlmZiBtb2RlICovCisjZGVmaW5lIEJUX0FDTF9QQVJLICAgICAgICAgICAgICgzKSAgIC8qKjwgUGFyayBtb2RlICovCisjZGVmaW5lIEJUX0FDTF9NT0RFX01BWCAgICAgICAgICg0KSAgIC8qKjwgVGhpcyB2YWx1ZSBhbmQgaGlnaGVyIGFyZSBpbnZhbGlkICovCisKKy8qKgorICogQTJEUCBCVEMgbWF4IG5vIG9mIEJUIHN1YiBpbnRlcnZhbHMKKyAqCisgKiAqKi8KKyNkZWZpbmUgQlRDX01BWF9OVU1fQUNMX0JUX1NVQl9JTlRTICg3KQorCisvKiogQlRDIEV4ZWN1dGlvbnMgTW9kZXMgYWxsb3dlZCB0byBiZSBzZXQgYnkgdXNlcgorKi8KKyNkZWZpbmUgQlRDX1NNQVJUX0NPRVhJU1RFTkNFICAgKDApIC8qKiBCVEMgTWFwcGluZyBMYXllciBkZWNpZGVzIHdoYXRzIGJlc3QgKi8KKyNkZWZpbmUgQlRDX1dMQU5fT05MWSAgICAgICAgICAgKDEpIC8qKiBXTEFOIHRha2VzIGFsbCBtb2RlICovCisjZGVmaW5lIEJUQ19QVEFfT05MWSAgICAgICAgICAgICgyKSAvKiogQWxsb3cgb25seSAzIHdpcmUgcHJvdG9jb2wgaW4gSC9XICovCisjZGVmaW5lIEJUQ19TTUFSVF9NQVhfV0xBTiAgICAgICgzKSAvKiogQlRDIE1hcHBpbmcgTGF5ZXIgZGVjaWRlcyB3aGF0cyBiZXN0LCBXTEFOIHdlaWdodGVkICovCisjZGVmaW5lIEJUQ19TTUFSVF9NQVhfQlQgICAgICAgICg0KSAvKiogQlRDIE1hcHBpbmcgTGF5ZXIgZGVjaWRlcyB3aGF0cyBiZXN0LCBCVCB3ZWlnaHRlZCAqLworI2RlZmluZSBCVENfU01BUlRfQlRfQTJEUCAgICAgICAoNSkgLyoqIEJUQyBNYXBwaW5nIExheWVyIGRlY2lkZXMgd2hhdHMgYmVzdCwgYmFsYW5jZWQgKyBCVCBBMkRQIHdlaWdodCAqLworI2RlZmluZSBCVF9FWEVDX01PREVfTUFYICAgICAgICAoNikgLyoqIFRoaXMgYW5kIGJleW9uZCBhcmUgaW52YWxpZCB2YWx1ZXMgKi8KKworLyoqIEVudW1lcmF0aW9uIG9mIGRpZmZlcmVudCBraW5kcyBhY3Rpb25zIHRoYXQgQlRDIE1hcHBpbmcgTGF5ZXIKKyAgICBjYW4gZG8gaWYgUE0gaW5kaWNhdGlvbiAodG8gQVApIGZhaWxzLgorKi8KKyNkZWZpbmUgQlRDX1JFU1RBUlRfQ1VSUkVOVCAgICAgKDApIC8qKiBSZXN0YXJ0IHRoZSBpbnRlcnZhbCB3ZSBqdXN0IGZhaWxlZCB0byBsZWF2ZSAqLworI2RlZmluZSBCVENfU1RBUlRfTkVYVCAgICAgICAgICAoMSkgLyoqIFN0YXJ0IHRoZSBuZXh0IGludGVydmFsIGV2ZW4gdGhvdWdoIHRoZSBQTSB0cmFuc2l0aW9uIGF0IHRoZSBBUCB3YXMgdW5zdWNjZXNzZnVsICovCisjZGVmaW5lIEJUQ19BQ1RJT05fVFlQRV9NQVggICAgICgyKSAvKiogVGhpcyBhbmQgYmV5b25kIGFyZSBpbnZhbGlkIHZhbHVlcyAqLworCisjZGVmaW5lIEJUQ19CVF9JTlRFUlZBTF9NT0RFMV9ERUZBVUxUICAgICAgICgxMjApIC8qKiBCVCBJbnRlcnZhbCBpbiBNb2RlIDEgKi8KKyNkZWZpbmUgQlRDX1dMQU5fSU5URVJWQUxfTU9ERTFfREVGQVVMVCAgICAgKDMwKSAgLyoqIFdMQU4gSW50ZXJ2YWwgaW4gTW9kZSAxICovCisKKy8qKiBCaXRtYXBzIHVzZWQgZm9yIG1haW50YWluaW5nIHZhcmlvdXMgQlQgZXZlbnRzIHRoYXQgcmVxdWlyZXMKKyAgICBlbm91Z2ggdGltZSB0byBjb21wbGV0ZSBzdWNoIHRoYXQgaXQgbWlnaHQgcmVxdWlyZSBkaXNibGluZyBvZgorICAgIGhlYXJ0YmVhdCBtb25pdG9yaW5nIHRvIGF2b2lkIFdMQU4gbGluayBsb3NzIHdpdGggdGhlIEFQCisqLworI2RlZmluZSBCVF9JTlFVSVJZX1NUQVJURUQgICAgICAgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgQlRfUEFHRV9TVEFSVEVEICAgICAgICAgICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIEJUX0NSRUFURV9BQ0xfQ09OTkVDVElPTl9TVEFSVEVEICAgICgxPDwyKQorI2RlZmluZSBCVF9DUkVBVEVfU1lOQ19DT05ORUNUSU9OX1NUQVJURUQgICAoMTw8MykKKworLyoqIE1heGltdW0gdGltZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBhIHNwZWNpZmljIEJUIHN0YXJ0IGV2ZW50IGFuZCBpdHMKKyAgICByZXNwZWN0aXZlIHN0b3AgZXZlbnQsIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgdGltZWQgb3V0IG9uIHJlY2VpdmluZyB0aGUgc3RvcCBldmVudC4KKyovCisjZGVmaW5lIEJUX01BWF9FVkVOVF9ET05FX1RJTUVPVVQgICA0NTAwMAorCisKKy8qCisgICAgVG8gc3VwcHVydCBtdWx0aXBsZSBTQ08gY29ubmVjdGlvbnMgZm9yIEJUK1VBUFNEIHdvcmsKKyovCisjZGVmaW5lIEJUX01BWF9TQ09fU1VQUE9SVCAgMworI2RlZmluZSBCVF9NQVhfQUNMX1NVUFBPUlQgIDMKKyNkZWZpbmUgQlRfTUFYX0RJU0NPTk5fU1VQUE9SVCAoQlRfTUFYX1NDT19TVVBQT1JUK0JUX01BWF9BQ0xfU1VQUE9SVCkKKyNkZWZpbmUgQlRfTUFYX05VTV9FVkVOVF9BQ0xfREVGRVJSRUQgIDQgIC8vV2UgbWF5IG5lZWQgdG8gZGVmZXIgdGhlc2UgbWFueSBCVCBldmVudHMgZm9yIEFDTAorI2RlZmluZSBCVF9NQVhfTlVNX0VWRU5UX1NDT19ERUZFUlJFRCAgNCAgLy9XZSBtYXkgbmVlZCB0byBkZWZlciB0aGVzZSBtYW55IEJUIGV2ZW50cyBmb3IgU1lOQworCisKKy8qKiBFbnVtZXJhdGlvbiBvZiBhbGwgdGhlIGRpZmZlcmVudCBraW5kcyBvZiBCVCBldmVudHMKKyovCit0eXBlZGVmIGVudW0gZVNtZUJ0RXZlbnRUeXBlCit7CisgIEJUX0VWRU5UX0RFVklDRV9TV0lUQ0hFRF9PTiwKKyAgQlRfRVZFTlRfREVWSUNFX1NXSVRDSEVEX09GRiwKKyAgQlRfRVZFTlRfSU5RVUlSWV9TVEFSVEVELAorICBCVF9FVkVOVF9JTlFVSVJZX1NUT1BQRUQsCisgIEJUX0VWRU5UX0lOUVVJUllfU0NBTl9TVEFSVEVELAorICBCVF9FVkVOVF9JTlFVSVJZX1NDQU5fU1RPUFBFRCwKKyAgQlRfRVZFTlRfUEFHRV9TVEFSVEVELAorICBCVF9FVkVOVF9QQUdFX1NUT1BQRUQsCisgIEJUX0VWRU5UX1BBR0VfU0NBTl9TVEFSVEVELAorICBCVF9FVkVOVF9QQUdFX1NDQU5fU1RPUFBFRCwKKyAgQlRfRVZFTlRfQ1JFQVRFX0FDTF9DT05ORUNUSU9OLAorICBCVF9FVkVOVF9BQ0xfQ09OTkVDVElPTl9DT01QTEVURSwKKyAgQlRfRVZFTlRfQ1JFQVRFX1NZTkNfQ09OTkVDVElPTiwKKyAgQlRfRVZFTlRfU1lOQ19DT05ORUNUSU9OX0NPTVBMRVRFLAorICBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fVVBEQVRFRCwKKyAgQlRfRVZFTlRfRElTQ09OTkVDVElPTl9DT01QTEVURSwKKyAgQlRfRVZFTlRfTU9ERV9DSEFOR0VELAorICBCVF9FVkVOVF9BMkRQX1NUUkVBTV9TVEFSVCwKKyAgQlRfRVZFTlRfQTJEUF9TVFJFQU1fU1RPUCwKKyAgQlRfRVZFTlRfVFlQRV9NQVgsICAgIC8vVGhpcyBhbmQgYmV5b25kIGFyZSBpbnZhbGlkIHZhbHVlcworfSB0U21lQnRFdmVudFR5cGU7CisKKy8qKiBCVC1BTVAgZXZlbnRzIHR5cGUKKyovCit0eXBlZGVmIGVudW0gZVNtZUJ0QW1wRXZlbnRUeXBlCit7CisgIEJUQU1QX0VWRU5UX0NPTk5FQ1RJT05fU1RBUlQsCisgIEJUQU1QX0VWRU5UX0NPTk5FQ1RJT05fU1RPUCwKKyAgQlRBTVBfRVZFTlRfQ09OTkVDVElPTl9URVJNSU5BVEVELAorICBCVEFNUF9FVkVOVF9UWVBFX01BWCwgLy9UaGlzIGFuZCBiZXlvbmQgYXJlIGludmFsaWQgdmFsdWVzCit9IHRTbWVCdEFtcEV2ZW50VHlwZTsKKworCisvKipEYXRhIHN0cnVjdHVyZSB0aGF0IHNwZWNpZmllcyB0aGUgbmVlZGVkIGV2ZW50IHBhcmFtZXRlcnMgZm9yCisgICAgQlRfRVZFTlRfQ1JFQVRFX0FDTF9DT05ORUNUSU9OIGFuZCBCVF9FVkVOVF9BQ0xfQ09OTkVDVElPTl9DT01QTEVURQorKi8KK3R5cGVkZWYgc3RydWN0IHNTbWVCdEFjbENvbm5lY3Rpb25QYXJhbQoreworICAgdl9VOF90ICAgICAgIGJkQWRkcls2XTsKKyAgIHZfVTE2X3QgICAgICBjb25uZWN0aW9uSGFuZGxlOworICAgdl9VOF90ICAgICAgIHN0YXR1czsKK30gdFNtZUJ0QWNsQ29ubmVjdGlvblBhcmFtLCAqdHBTbWVCdEFjbENvbm5lY3Rpb25QYXJhbTsKKworLyoqIERhdGEgc3RydWN0dXJlIHRoYXQgc3BlY2lmaWVzIHRoZSBuZWVkZWQgZXZlbnQgcGFyYW1ldGVycyBmb3IKKyAgICBCVF9FVkVOVF9DUkVBVEVfU1lOQ19DT05ORUNUSU9OLCBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fQ09NUExFVEUKKyAgICBhbmQgQlRfRVZFTlRfU1lOQ19DT05ORUNUSU9OX1VQREFURUQKKyovCit0eXBlZGVmIHN0cnVjdCBzU21lQnRTeW5jQ29ubmVjdGlvblBhcmFtCit7CisgICB2X1U4X3QgICAgICAgYmRBZGRyWzZdOworICAgdl9VMTZfdCAgICAgIGNvbm5lY3Rpb25IYW5kbGU7CisgICB2X1U4X3QgICAgICAgc3RhdHVzOworICAgdl9VOF90ICAgICAgIGxpbmtUeXBlOworICAgdl9VOF90ICAgICAgIHNjb0ludGVydmFsOyAvL3VuaXRzIGluIG51bWJlciBvZiA2MjV1cyBzbG90cworICAgdl9VOF90ICAgICAgIHNjb1dpbmRvdzsgICAvL3VuaXRzIGluIG51bWJlciBvZiA2MjV1cyBzbG90cworICAgdl9VOF90ICAgICAgIHJldHJhbnNtaXNpc29uV2luZG93OyAvL3VuaXRzIGluIG51bWJlciBvZiA2MjV1cyBzbG90cworfSB0U21lQnRTeW5jQ29ubmVjdGlvblBhcmFtLCAqdHBTbWVCdFN5bmNDb25uZWN0aW9uUGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHNTbWVCdFN5bmNVcGRhdGVIaXN0Cit7CisgICAgdFNtZUJ0U3luY0Nvbm5lY3Rpb25QYXJhbSBidFN5bmNDb25uZWN0aW9uOworICAgIHZfQk9PTF90IGZWYWxpZDsKK30gdFNtZUJ0U3luY1VwZGF0ZUhpc3QsICp0cFNtZUJ0U3luY1VwZGF0ZUhpc3Q7CisKKy8qKkRhdGEgc3RydWN0dXJlIHRoYXQgc3BlY2lmaWVzIHRoZSBuZWVkZWQgZXZlbnQgcGFyYW1ldGVycyBmb3IKKyAgICBCVF9FVkVOVF9NT0RFX0NIQU5HRUQKKyovCit0eXBlZGVmIHN0cnVjdCBzU21lQnRBY2xNb2RlQ2hhbmdlUGFyYW0KK3sKKyAgICB2X1UxNl90ICAgICBjb25uZWN0aW9uSGFuZGxlOworICAgIHZfVThfdCAgICAgIG1vZGU7Cit9IHRTbWVCdEFjbE1vZGVDaGFuZ2VQYXJhbSwgKnRwU21lQnRBY2xNb2RlQ2hhbmdlUGFyYW07CisKKy8qRGF0YSBzdHJ1Y3R1cmUgdGhhdCBzcGVjaWZpZXMgdGhlIG5lZWRlZCBldmVudCBwYXJhbWV0ZXJzIGZvcgorICAgIEJUX0VWRU5UX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUKKyovCit0eXBlZGVmIHN0cnVjdCBzU21lQnREaXNjb25uZWN0UGFyYW0KK3sKKyAgIHZfVTE2X3QgY29ubmVjdGlvbkhhbmRsZTsKK30gdFNtZUJ0RGlzY29ubmVjdFBhcmFtLCAqdHBTbWVCdERpc2Nvbm5lY3RQYXJhbTsKKworLypEYXRhIHN0cnVjdHVyZSB0aGF0IHNwZWNpZmllcyB0aGUgbmVlZGVkIGV2ZW50IHBhcmFtZXRlcnMgZm9yCisgICAgQlRfRVZFTlRfQTJEUF9TVFJFQU1fU1RBUlQKKyAgICBCVF9FVkVOVF9BMkRQX1NUUkVBTV9TVE9QCisqLwordHlwZWRlZiBzdHJ1Y3Qgc1NtZUJ0QTJEUFBhcmFtCit7CisgICB2X1U4X3QgICAgICAgYmRBZGRyWzZdOworfSB0U21lQnRBMkRQUGFyYW0sICp0cFNtZUJ0QTJEUFBhcmFtOworCisKKy8qKiBHZW5lcmljIEJsdWV0b290aCBFdmVudCBzdHJ1Y3R1cmUgZm9yIEJUQworKi8KK3R5cGVkZWYgc3RydWN0IHNTbWVCdGNCdEV2ZW50Cit7CisgICB0U21lQnRFdmVudFR5cGUgYnRFdmVudFR5cGU7CisgICB1bmlvbgorICAgeworICAgICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICBiZEFkZHJbNl07ICAgIC8qKjwgRm9yIGV2ZW50cyB3aXRoIG9ubHkgYSBCVCBBZGRyIGluIGV2ZW50X2RhdGEgKi8KKyAgICAgIHRTbWVCdEFjbENvbm5lY3Rpb25QYXJhbSAgYnRBY2xDb25uZWN0aW9uOworICAgICAgdFNtZUJ0U3luY0Nvbm5lY3Rpb25QYXJhbSBidFN5bmNDb25uZWN0aW9uOworICAgICAgdFNtZUJ0RGlzY29ubmVjdFBhcmFtICAgICBidERpc2Nvbm5lY3Q7CisgICAgICB0U21lQnRBY2xNb2RlQ2hhbmdlUGFyYW0gIGJ0QWNsTW9kZUNoYW5nZTsKKyAgIH11RXZlbnRQYXJhbTsKK30gdFNtZUJ0RXZlbnQsICp0cFNtZUJ0RXZlbnQ7CisKKworLyoqCisgICAgQlQtQU1QIEV2ZW50IFN0cnVjdHVyZQorKi8KK3R5cGVkZWYgc3RydWN0IHNTbWVCdEFtcEV2ZW50Cit7CisgIHRTbWVCdEFtcEV2ZW50VHlwZSBidEFtcEV2ZW50VHlwZTsKKworfSB0U21lQnRBbXBFdmVudCwgKnRwU21lQnRBbXBFdmVudDsKKworCisvKiogRGF0YSBzdHJ1Y3R1cmUgdGhhdCBzcGVjaWZpZXMgdGhlIEJUQyBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyovCit0eXBlZGVmIHN0cnVjdCBzU21lQnRjQ29uZmlnCit7CisgICB2X1U4X3QgICAgICAgYnRjRXhlY3V0aW9uTW9kZTsKKyAgIHZfVThfdCAgICAgICBidGNDb25zQnRTbG90c1RvQmxvY2tEdXJpbmdEaGNwOworICAgdl9VOF90ICAgICAgIGJ0Y0EyRFBCdFN1YkludGVydmFsc0R1cmluZ0RoY3A7CisgICB2X1U4X3QgICAgICAgYnRjQWN0aW9uT25QbUZhaWw7CisgICB2X1U4X3QgICAgICAgYnRjQnRJbnRlcnZhbE1vZGUxOworICAgdl9VOF90ICAgICAgIGJ0Y1dsYW5JbnRlcnZhbE1vZGUxOworCit9IHRTbWVCdGNDb25maWcsICp0cFNtZUJ0Y0NvbmZpZzsKKworCit0eXBlZGVmIHN0cnVjdCBzU21lQnRBY2xNb2RlQ2hhbmdlRXZlbnRIaXN0Cit7CisgICAgdFNtZUJ0QWNsTW9kZUNoYW5nZVBhcmFtICBidEFjbE1vZGVDaGFuZ2U7CisgICAgdl9CT09MX3QgZlZhbGlkOworfSB0U21lQnRBY2xNb2RlQ2hhbmdlRXZlbnRIaXN0LCAqdHBTbWVCdEFjbE1vZGVDaGFuZ2VFdmVudEhpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHNTbWVCdEFjbEV2ZW50SGlzdAoreworICAgIC8vQXQgbW9zdCwgY2FjaGVkIGV2ZW50cyBhcmUgQ09NUExFVElPTiwgRElTQ09OTkVDVCwgQ1JFQVRJT04sIENPTVBMRVRJT04KKyAgICB0U21lQnRFdmVudFR5cGUgYnRFdmVudFR5cGVbQlRfTUFYX05VTV9FVkVOVF9BQ0xfREVGRVJSRURdOworICAgIHRTbWVCdEFjbENvbm5lY3Rpb25QYXJhbSAgYnRBY2xDb25uZWN0aW9uW0JUX01BWF9OVU1fRVZFTlRfQUNMX0RFRkVSUkVEXTsKKyAgICAvL2JOZXh0RXZlbnRJZHggPT0gMCBtZWFuaW5nIG5vIGV2ZW50IGNhY2hlZCBoZXJlCisgICAgdEFOSV9VOCBiTmV4dEV2ZW50SWR4OworfSB0U21lQnRBY2xFdmVudEhpc3QsICp0cFNtZUJ0QWNsRXZlbnRIaXN0OworCit0eXBlZGVmIHN0cnVjdCBzU21lQnRTeW5jRXZlbnRIaXN0Cit7CisgICAgLy9BdCBtb3N0LCBjYWNoZWQgZXZlbnRzIGFyZSBDT01QTEVUSU9OLCBESVNDT05ORUNULCBDUkVBVElPTiwgQ09NUExFVElPTgorICAgIHRTbWVCdEV2ZW50VHlwZSBidEV2ZW50VHlwZVtCVF9NQVhfTlVNX0VWRU5UX1NDT19ERUZFUlJFRF07CisgICAgdFNtZUJ0U3luY0Nvbm5lY3Rpb25QYXJhbSAgYnRTeW5jQ29ubmVjdGlvbltCVF9NQVhfTlVNX0VWRU5UX1NDT19ERUZFUlJFRF07CisgICAgLy9iTmV4dEV2ZW50SWR4ID09IDAgbWVhbmluZyBubyBldmVudCBjYWNoZWQgaGVyZQorICAgIHRBTklfVTggYk5leHRFdmVudElkeDsKK30gdFNtZUJ0U3luY0V2ZW50SGlzdCwgKnRwU21lQnRTeW5jRXZlbnRIaXN0OworCit0eXBlZGVmIHN0cnVjdCBzU21lQnREaXNjb25uZWN0RXZlbnRIaXN0Cit7CisgICAgdFNtZUJ0RGlzY29ubmVjdFBhcmFtIGJ0RGlzY29ubmVjdDsKKyAgICB2X0JPT0xfdCBmVmFsaWQ7Cit9IHRTbWVCdERpc2Nvbm5lY3RFdmVudEhpc3QsICp0cFNtZUJ0RGlzY29ubmVjdEV2ZW50SGlzdDsKKworCisvKgorICBEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIGhpc3Rvcnkgb2YgQlQgZXZlbnRzCisqLwordHlwZWRlZiBzdHJ1Y3Qgc1NtZUJ0Y0V2ZW50SGlzdAoreworICAgdFNtZUJ0U3luY0V2ZW50SGlzdCBidFN5bmNDb25uZWN0aW9uRXZlbnRbQlRfTUFYX1NDT19TVVBQT1JUXTsKKyAgIHRTbWVCdEFjbEV2ZW50SGlzdCBidEFjbENvbm5lY3Rpb25FdmVudFtCVF9NQVhfQUNMX1NVUFBPUlRdOworICAgdFNtZUJ0QWNsTW9kZUNoYW5nZUV2ZW50SGlzdCBidEFjbE1vZGVDaGFuZ2VFdmVudFtCVF9NQVhfQUNMX1NVUFBPUlRdOworICAgdFNtZUJ0RGlzY29ubmVjdEV2ZW50SGlzdCBidERpc2Nvbm5lY3RFdmVudFtCVF9NQVhfRElTQ09OTl9TVVBQT1JUXTsKKyAgIHRTbWVCdFN5bmNVcGRhdGVIaXN0IGJ0U3luY1VwZGF0ZUV2ZW50W0JUX01BWF9TQ09fU1VQUE9SVF07CisgICBpbnQgbklucXVpcnlFdmVudDsgICAgLy8+MCBmb3IgIyBvZiBvdXRzdGFuZGluZyBpbnF1aXJpeSBzdGFydHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLzwwIGZvciAjIG9mIG91dHN0YW5kaW5nIGlucXVpcnkgc3RvcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLzAgPT0gbm8gaW5xdWlyeSBldmVudAorICAgaW50IG5QYWdlRXZlbnQ7ICAvLz4wIGZvciAjIG9mIG91dHN0YW5kaW5nIHBhZ2Ugc3RhcnRzCisgICAgICAgICAgICAgICAgICAgIC8vPDAgZm9yICMgb2Ygb3V0c3RhbmRpbmcgcGFnZSBzdG9wcworICAgICAgICAgICAgICAgICAgICAvLzAgPT0gbm8gcGFnZSBldmVudAorICAgdl9CT09MX3QgZkEyRFBTdGFydGVkOworICAgdl9CT09MX3QgZkEyRFBTdG9wcGVkOworfSB0U21lQnRjRXZlbnRIaXN0LCAqdHBTbWVCdGNFdmVudEhpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHNTbWVCdGNFdmVudFJlcGxheQoreworICAgdFNtZUJ0Y0V2ZW50SGlzdCBidGNFdmVudEhpc3Q7CisgICB2X0JPT0xfdCBmQlRTd2l0Y2hPbjsKKyAgIHZfQk9PTF90IGZCVFN3aXRjaE9mZjsKKyAgIC8vVGhpcyBpcyBub3QgZGlyZWN0bHkgdGllZCB0byBCVCBldmVudCBzbyBsZWF2ZSBpdCBhbG9uZSB3aGVuIHByb2Nlc3NpbmcgQlQgZXZlbnRzCisgICB2X0JPT0xfdCBmUmVzdG9yZUhCTW9uaXRvcjsKK30gdFNtZUJ0Y0V2ZW50UmVwbGF5LCAqdHBTbWVCdGNFdmVudFJlcGxheTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NtZUJ0Y0luZm8KK3sKKyAgIHRTbWVCdGNDb25maWcgYnRjQ29uZmlnOworICAgdl9CT09MX3QgICAgICBidGNSZWFkeTsKKyAgIHZfVThfdCAgICAgICAgYnRjRXZlbnRTdGF0ZTsKKyAgIHZfVThfdCAgICAgICAgYnRjSEJBY3RpdmU7ICAgIC8qIElzIEhCIGN1cnJlbnRseSBhY3RpdmUgKi8KKyAgIHZfVThfdCAgICAgICAgYnRjSEJDb3VudDsgICAgIC8qIGRlZmF1bHQgSEIgY291bnQgKi8KKyAgIHZvc190aW1lcl90ICAgcmVzdG9yZUhCVGltZXI7IC8qIFRpbWVyIHRvIHJlc3RvcmUgaGVhcnQgYmVhdCAqLworICAgdFNtZUJ0Y0V2ZW50UmVwbGF5IGJ0Y0V2ZW50UmVwbGF5OworICAgdl9CT09MX3QgICAgICBmUmVwbGF5QlRFdmVudHM7CisgICB2X0JPT0xfdCAgICAgIGJ0Y1VhcHNkT2s7ICAvKiBJbmRpY2F0ZSB3aGV0aGVyIEJUQyBpcyBvayB3aXRoIFVBUFNEICovCisgICB2X0JPT0xfdCAgICAgIGZBMkRQVHJhZlN0b3A7LypmbGFnIHRvIGNoZWNrIEEyRFBfU1RPUCBldmVudCBoYXMgY29tZSBiZWZvcmUgTU9ERV9DSEFOR0VEKi8KKyAgIHZfVTE2X3QgICAgICAgYnRjU2NvSGFuZGxlc1tCVF9NQVhfU0NPX1NVUFBPUlRdOyAgLyogSGFuZGxlcyBmb3IgU0NPLCBpZiBhbnkqLworICAgdl9CT09MX3QgICAgICBmQTJEUFVwOyAgICAgICAgLypyZW1lbWJlciB3aGV0aGVyIEEyRFAgaXMgaW4gc2Vzc2lvbiovCit9IHRTbWVCdGNJbmZvLCAqdHBTbWVCdGNJbmZvOworCisKKy8qKiBSb3V0aW5lIGRlZmluaXRpb25zCisqLworCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorVk9TX1NUQVRVUyBidGNPcGVuICh0SGFsSGFuZGxlIGhIYWwpOworVk9TX1NUQVRVUyBidGNDbG9zZSAodEhhbEhhbmRsZSBoSGFsKTsKK1ZPU19TVEFUVVMgYnRjUmVhZHkgKHRIYWxIYW5kbGUgaEhhbCk7CitWT1NfU1RBVFVTIGJ0Y1NlbmRDZmdNc2codEhhbEhhbmRsZSBoSGFsLCB0cFNtZUJ0Y0NvbmZpZyBwU21lQnRjQ29uZmlnKTsKK1ZPU19TVEFUVVMgYnRjU2lnbmFsQlRFdmVudCAodEhhbEhhbmRsZSBoSGFsLCB0cFNtZUJ0RXZlbnQgcEJ0RXZlbnQpOworVk9TX1NUQVRVUyBidGNTZXRDb25maWcgKHRIYWxIYW5kbGUgaEhhbCwgdHBTbWVCdGNDb25maWcgcFNtZUJ0Y0NvbmZpZyk7CitWT1NfU1RBVFVTIGJ0Y0dldENvbmZpZyAodEhhbEhhbmRsZSBoSGFsLCB0cFNtZUJ0Y0NvbmZpZyBwU21lQnRjQ29uZmlnKTsKKy8qCisgICBDYWxsZXIgY2FuIGNoZWNrIHdoZXRoZXIgQlRDJ3MgY3VycmVudCBldmVudCBhbGxvd3MgVUFQU0QuIFRoaXMgZG9lc24ndCBhZmZlY3QKKyAgIEJNUFMuCisgICByZXR1cm46ICBWT1NfVFJVRSAtLSBCVEMgaXMgcmVhZHkgZm9yIFVBUFNECisgICAgICAgICAgICBWT1NfRkFMU0UgLS0gY2VydGFpbiBCVCBldmVudCBpcyBhY3RpdmUsIGNhbm5vdCBlbnRlciBVQVBTRAorKi8KK3ZfQk9PTF90IGJ0Y0lzUmVhZHlGb3JVYXBzZCggdEhhbEhhbmRsZSBoSGFsICk7CitlSGFsU3RhdHVzIGJ0Y0hhbmRsZUNvZXhJbmQodEhhbEhhbmRsZSBoSGFsLCB2b2lkKiBwTXNnKTsKKyNlbmRpZiAvKiBFbmQgb2YgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvaW5jL2NjbUFwaS5oIGIvQ09SRS9TTUUvaW5jL2NjbUFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTU0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9pbmMvY2NtQXBpLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAgCisgICAgXGZpbGUgY2NtQXBpLmgKKyAgCisgICAgXGJyaWVmIEV4cG9ydHMgYW5kIHR5cGVzIGZvciB0aGUgQ29tbW9uIENvbmZpZyBNb2R1bGUgKENDTSkKKyAgCisgICAgJElkJCAKKyAgCisgIAorICAgIENvcHlyaWdodCAoQykgMjAwNiBBaXJnbyBOZXR3b3JrcywgSW5jb3Jwb3JhdGVkCisKKyAgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBpbnRlcmZhY2VzIGZvciB0aGdlIFBsYXRmb3JtIEFic3RyYXRpb24gTGF5ZXIKKyAgICBmdW5jdGlvbnMuICBJdCBpcyBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBpbiBhbGwgbW9kdWxlcyB0aGF0IGFyZSB1c2luZyAKKyAgICB0aGUgUEFMIGludGVyZmFjZXMuCisgIAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgQ0NNQVBJX0hfXworI2RlZmluZSBDQ01BUElfSF9fCisKKy8vI2luY2x1ZGUgInduaUNmZ0FwLmgiIC8qIENGR19QQVJBTV9NQVhfTlVNICovCisjaW5jbHVkZSAid25pQ2ZnU3RhLmgiCisjaW5jbHVkZSAiaGFsVHlwZXMuaCIKKworI2RlZmluZSBDQ01fMTFCX0NIQU5ORUxfRU5EICAgICAgICAgICAgIDE0CisKKyNkZWZpbmUgQ0NNX0lTX1JFU1VMVF9TVUNDRVNTKHJlc3VsdCkgICAoV05JX0NGR19TVUNDRVNTID09IChyZXN1bHQpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX05FRURfUkVTVEFSVCA9PSAocmVzdWx0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfTkVFRF9SRUxPQUQgPT0gKHJlc3VsdCkpCisKKyNkZWZpbmUgQ0NNX0lOVEVHRVJfVFlQRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENDTV9TVFJJTkdfVFlQRSAgICAgICAgICAgICAgICAgMQorCit0eXBlZGVmIHZvaWQgKCp0Q2NtQ2ZnU2V0Q2FsbGJhY2spKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9TMzIgcmVzdWx0KSA7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZUNDTV9TVE9QUEVELAorICAgIGVDQ01fU1RBUlRFRCwKKyAgICBlQ0NNX1JFUV9TRU5ULAorICAgIGVDQ01fUkVRX1FVRVVFRCwKKyAgICBlQ0NNX1JFUV9ET05FLAorfSBlQ2NtU3RhdGUgOworCisvKiBXZSBkbyBub3QgdXNlIExpbnV4J3MgbGlzdCBmYWNpbGl0eSAqLwordHlwZWRlZiBzdHJ1Y3QgY2ZncmVxIHsKKyAgICBzdHJ1Y3QgY2ZncmVxICAgICAgICpuZXh0IDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGNmZ0lkIDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHR5cGUgOworICAgIHRBTklfVTggICAgICAgICAgICAgc3RhdGUgOiA3IDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHRvQmVTYXZlZCA6IDEgOworICAgIHRBTklfUzMyICAgICAgICAgICAgbGVuZ3RoIDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICpjY21QdHI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICBjY21WYWx1ZTsKKyAgICB0Q2NtQ2ZnU2V0Q2FsbGJhY2sgIGNhbGxiYWNrOworICAgIHZvaWQgICAgICAgICAgICAgICAgKmRvbmUgOworfSB0Q2ZnUmVxIDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHRBTklfVTE2ICAgICAgICAgICAgc3RhcnRlZCA6IDEgOworICAgIHRBTklfVTE2ICAgICAgICAgICAgaW5fcHJvZ3Jlc3MgOiAxIDsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIHJlc2VydmVkIDogMTQgOworICAgIHRBTklfUzE2ICAgICAgICAgICAgbnJfcGFyYW0gOworICAgIHRBTklfVTMyICAgICAgICAgICAgcmVzdWx0IDsKKyAgICB0Q2NtQ2ZnU2V0Q2FsbGJhY2sgIGNhbGxiYWNrIDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICpkb25lIDsKK30gdENmZ1JlcGxheSA7CisKK3N0cnVjdCBjY21saW5rIHsKKyAgICB0Q2ZnUmVxICpoZWFkOworICAgIHRDZmdSZXEgKnRhaWw7Cit9IDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHN0cnVjdCBjY21saW5rICAgICAgcmVxUSA7CisgICAgZUNjbVN0YXRlICAgICAgICAgICBzdGF0ZSA7CisgICAgdENmZ1JlcSAqICAgICAgICAgICBjb21wW0NGR19QQVJBTV9NQVhfTlVNXSA7CisgICAgdENmZ1JlcGxheSAgICAgICAgICByZXBsYXkgOworICAgIHZvaWQgICAgICAgICAgICAgICAgKmxvY2s7Cit9IHRDY20gOworCit2b2lkIGNjbUNmZ0NuZk1zZ0hhbmRsZXIodEhhbEhhbmRsZSBoSGFsLCB2b2lkICptc2cpIDsKK2VIYWxTdGF0dXMgY2NtT3Blbih0SGFsSGFuZGxlIGhIYWwpIDsKK2VIYWxTdGF0dXMgY2NtQ2xvc2UodEhhbEhhbmRsZSBoSGFsKSA7Cit2b2lkIGNjbVN0YXJ0KHRIYWxIYW5kbGUgaEhhbCkgOwordm9pZCBjY21TdG9wKHRIYWxIYW5kbGUgaEhhbCkgOworLy9JZiBjYWxsYmFjayBpcyBOVUxMLCB0aGUgQVBJIGlzIG5vdCBzZXJpYWxpemVkIGZvciB0aGUgQ0ZHcworZUhhbFN0YXR1cyBjY21DZmdTZXRJbnQodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1UzMiBjZmdJZCwgdEFOSV9VMzIgY2NtVmFsdWUsIHRDY21DZmdTZXRDYWxsYmFjayBjYWxsYmFjaywgZUFuaUJvb2xlYW4gdG9CZVNhdmVkKSA7CisvL0lmIGNhbGxiYWNrIGlzIE5VTEwsIHRoZSBBUEkgaXMgbm90IHNlcmlhbGl6ZWQgZm9yIHRoZSBDRkdzCitlSGFsU3RhdHVzIGNjbUNmZ1NldFN0cih0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIGNmZ0lkLCB0QU5JX1U4ICpwU3RyLCB0QU5JX1UzMiBsZW5ndGgsIHRDY21DZmdTZXRDYWxsYmFjayBjYWxsYmFjaywgZUFuaUJvb2xlYW4gdG9CZVNhdmVkKSA7CitlSGFsU3RhdHVzIGNjbUNmZ1VwZGF0ZSh0SGFsSGFuZGxlIGhIYWwsIHRDY21DZmdTZXRDYWxsYmFjayBjYWxsYmFjaykgOworZUhhbFN0YXR1cyBjY21DZmdHZXRJbnQodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1UzMiBjZmdJZCwgdEFOSV9VMzIgKnBWYWx1ZSkgOworZUhhbFN0YXR1cyBjY21DZmdHZXRTdHIodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1UzMiBjZmdJZCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgKnBMZW5ndGgpIDsKKwordm9pZCBjY21EdW1wSW5pdCh0SGFsSGFuZGxlIGhIYWwpOworCisjZW5kaWYgLypDQ01BUElfSF9fKi8KZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9jc3JBcGkuaCBiL0NPUkUvU01FL2luYy9jc3JBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ5ZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvaW5jL2NzckFwaS5oCkBAIC0wLDAgKzEsMTM4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqICAKKyAgICBcZmlsZSBjc3JBcGkuaAorICAKKyAgICBFeHBvcnRzIGFuZCB0eXBlcyBmb3IgdGhlIENvbW1vbiBTY2FuIGFuZCBSb2FtaW5nIE1vZHVsZSBpbnRlcmZhY2VzLgorICAKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZCAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjaWZuZGVmIENTUkFQSV9IX18KKyNkZWZpbmUgQ1NSQVBJX0hfXworCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAic2lyTWFjUHJvdERlZi5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxSZlR5cGVzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJjc3JMaW5rTGlzdC5oIgorCit0eXBlZGVmIGVudW0gCit7CisgICAgZUNTUl9BVVRIX1RZUEVfTk9ORSwgICAgLy9uZXZlciB1c2VkCisgICAgLy8gTUFDIGxheWVyIGF1dGhlbnRpY2F0aW9uIHR5cGVzCisgICAgZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU0sCisgICAgZUNTUl9BVVRIX1RZUEVfU0hBUkVEX0tFWSwKKyAgICBlQ1NSX0FVVEhfVFlQRV9BVVRPU1dJVENILAorCisgICAgLy8gVXBwZXIgbGF5ZXIgYXV0aGVudGljYXRpb24gdHlwZXMKKyAgICBlQ1NSX0FVVEhfVFlQRV9XUEEsCisgICAgZUNTUl9BVVRIX1RZUEVfV1BBX1BTSywKKyAgICBlQ1NSX0FVVEhfVFlQRV9XUEFfTk9ORSwKKworICAgIGVDU1JfQVVUSF9UWVBFX1JTTiwKKyAgICBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLLAorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBlQ1NSX0FVVEhfVFlQRV9GVF9SU04sCisgICAgZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSywKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfQ0VSVElGSUNBVEUsCisgICAgZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfUFNLLAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIGVDU1JfQVVUSF9UWVBFX0NDS01fV1BBLAorICAgIGVDU1JfQVVUSF9UWVBFX0NDS01fUlNOLAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KKyAgICBlQ1NSX05VTV9PRl9TVVBQT1JUX0FVVEhfVFlQRSwKKyAgICBlQ1NSX0FVVEhfVFlQRV9GQUlMRUQgPSAweGZmLAorICAgIGVDU1JfQVVUSF9UWVBFX1VOS05PV04gPSBlQ1NSX0FVVEhfVFlQRV9GQUlMRUQsCisKK31lQ3NyQXV0aFR5cGU7CisKKwordHlwZWRlZiBlbnVtIAoreworICAgIGVDU1JfRU5DUllQVF9UWVBFX05PTkUsCisgICAgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZLAorICAgIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVksCisKKyAgICBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MCwKKyAgICBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQsCisgICAgZUNTUl9FTkNSWVBUX1RZUEVfVEtJUCwKKyAgICBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVMsCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEksIC8vV0FQSQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIGVDU1JfRU5DUllQVF9UWVBFX0tSSywKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0NYICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworICAgIC8vMTF3IEJJUAorICAgIGVDU1JfRU5DUllQVF9UWVBFX0FFU19DTUFDLAorI2VuZGlmCisgICAgZUNTUl9FTkNSWVBUX1RZUEVfQU5ZLAorICAgIGVDU1JfTlVNX09GX0VOQ1JZUFRfVFlQRSA9IGVDU1JfRU5DUllQVF9UWVBFX0FOWSwKKworICAgIGVDU1JfRU5DUllQVF9UWVBFX0ZBSUxFRCA9IDB4ZmYsCisgICAgZUNTUl9FTkNSWVBUX1RZUEVfVU5LTk9XTiA9IGVDU1JfRU5DUllQVF9UWVBFX0ZBSUxFRCwKKworfWVDc3JFbmNyeXB0aW9uVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIFNlY3VyaXR5IHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICAgZUNTUl9TRUNVUklUWV9UWVBFX1dQQSwKKyAgICBlQ1NSX1NFQ1VSSVRZX1RZUEVfUlNOLAorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgZUNTUl9TRUNVUklUWV9UWVBFX1dBUEksCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyAgICBlQ1NSX1NFQ1VSSVRZX1RZUEVfVU5LTk9XTiwKKworfWVDc3JTZWN1cml0eVR5cGU7CisKK3R5cGVkZWYgZW51bQoreworICAgIGVDU1JfRE9UMTFfTU9ERV9UQVVSVVMgPSAwLCAvL1RoaXMgbWVhbiBldmVyeXRoaW5nIGJlY2F1c2UgaXQgY292ZXJzIGFsbCB0aGluZyB3ZSBzdXBwb3J0CisgICAgZUNTUl9ET1QxMV9NT0RFX2FiZyA9IDB4MDAwMSwgICAgLy8xMWEvYi9nIG9ubHksIG5vIEhULCBubyBwcm9wcmlldGFyeQorICAgIGVDU1JfRE9UMTFfTU9ERV8xMWEgPSAweDAwMDIsCisgICAgZUNTUl9ET1QxMV9NT0RFXzExYiA9IDB4MDAwNCwKKyAgICBlQ1NSX0RPVDExX01PREVfMTFnID0gMHgwMDA4LAorICAgIGVDU1JfRE9UMTFfTU9ERV8xMW4gPSAweDAwMTAsCisgICAgZUNTUl9ET1QxMV9NT0RFX1BPTEFSSVMgPSAweDAwMjAsCisgICAgZUNTUl9ET1QxMV9NT0RFX1RJVEFOID0gMHgwMDQwLAorICAgIGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWSA9IDB4MDA4MCwKKyAgICBlQ1NSX0RPVDExX01PREVfMTFuX09OTFkgPSAweDAxMDAsCisgICAgZUNTUl9ET1QxMV9NT0RFX1RBVVJVU19PTkxZID0gMHgwMjAwLAorICAgIGVDU1JfRE9UMTFfTU9ERV8xMWJfT05MWSA9IDB4MDQwMCwKKyAgICBlQ1NSX0RPVDExX01PREVfMTFhX09OTFkgPSAweDA4MDAsCisgICAgLy9UaGlzIGlzIGZvciBXSUZJIHRlc3QuIEl0IGlzIHNhbWUgYXMgZVdOSUFQSV9NQUNfUFJPVE9DT0xfQUxMIGV4Y2VwdCB3aGVuIGl0IHN0YXJ0cyBJQlNTIGluIDExQiBvZiAyLjRHSHoKKyAgICAvL0l0IGlzIGZvciBDU1IgaW50ZXJuYWwgdXNlCisgICAgZUNTUl9ET1QxMV9NT0RFX0FVVE8gPSAweDEwMDAsCisKKyAgICBlQ1NSX05VTV9QSFlfTU9ERSA9IDE2LCAgICAgLy9zcGVjaWZ5IHRoZSBudW1iZXIgb2YgbWF4aW11bSBiaXRzIGZvciBwaHlNb2RlCit9ZUNzclBoeU1vZGU7CisKKwordHlwZWRlZiB0QU5JX1U4IHRDc3JCc3NpZFtXTklfQ0ZHX0JTU0lEX0xFTl07CisKK3R5cGVkZWYgZW51bQoreworICAgIGVDU1JfQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUsCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGVDU1JfQlNTX1RZUEVfSU5GUkFfQVAsICAgICAgIC8vIFNvZnRBUCBBUAorI2VuZGlmCisgICAgZUNTUl9CU1NfVFlQRV9JQlNTLCAgICAgICAgICAgLy8gYW4gSUJTUyBuZXR3b3JrIHdlIHdpbGwgTk9UIHN0YXJ0CisgICAgZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTLCAgICAgLy8gYW4gSUJTUyBuZXR3b3JrIHdlIHdpbGwgc3RhcnQgaWYgbm8gcGFydG5lcnMgZGV0ZWN0ZWQuCisgICAgZUNTUl9CU1NfVFlQRV9XRFNfQVAsICAgICAgICAgLy8gQlQtQU1QIEFQCisgICAgZUNTUl9CU1NfVFlQRV9XRFNfU1RBLCAgICAgICAgLy8gQlQtQU1QIHN0YXRpb24KKyAgICBlQ1NSX0JTU19UWVBFX0FOWSwgICAgICAgICAgICAvLyBhbnkgQlNTIHR5cGUgKElCU1Mgb3IgSW5mcmFzdHJ1Y3R1cmUpLgorfWVDc3JSb2FtQnNzVHlwZTsKKworCisKK3R5cGVkZWYgZW51bSB7CisgICAgZUNTUl9TQ0FOX1JFUVVFU1RfMTFEX1NDQU4gPSAxLAorICAgIGVDU1JfU0NBTl9SRVFVRVNUX0ZVTExfU0NBTiwKKyAgICBlQ1NSX1NDQU5fSURMRV9NT0RFX1NDQU4sCisgICAgZUNTUl9TQ0FOX0hPX0JHX1NDQU4sIC8vIGJnIHNjYW4gcmVxdWVzdCBpbiBOUlQgJiBSVCBIYW5kb2ZmIHN1Yi1zdGF0ZXMKKyAgICBlQ1NSX1NDQU5fSE9fUFJPQkVfU0NBTiwgLy8gZGlyZWN0ZWQgcHJvYmUgb24gYW4gZW50cnkgZnJvbSB0aGUgY2FuZGlkYXRlIGxpc3QKKyAgICBlQ1NSX1NDQU5fSE9fTlRfQkdfU0NBTiwgLy8gYmcgc2NhbiByZXF1ZXN0IGluIE5UICBzdWItc3RhdGUKKyAgICBlQ1NSX1NDQU5fUDJQX0RJU0NPVkVSWSwKKworICAgIGVDU1JfU0NBTl9TT0ZUQVBfQ0hBTk5FTF9SQU5HRSwKKyAgICBlQ1NSX1NDQU5fUDJQX0ZJTkRfUEVFUiwKK31lQ3NyUmVxdWVzdFR5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZUNTUl9TQ0FOX1JFU1VMVF9HRVQgPSAwLAorICAgIGVDU1JfU0NBTl9SRVNVTFRfRkxVU0ggPSAxLCAgICAgLy90byBkZWxldGUgYWxsIGNhY2hlZCBzY2FuIHJlc3VsdHMKK31lQ3NyU2NhblJlc3VsdENtZDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgZUNTUl9TQ0FOX1NVQ0NFU1MsCisgICAgZUNTUl9TQ0FOX0ZBSUxVUkUsCisgICAgZUNTUl9TQ0FOX0FCT1JULAorICAgZUNTUl9TQ0FOX0ZPVU5EX1BFRVIsICAgIAorfWVDc3JTY2FuU3RhdHVzOworCisjZGVmaW5lIENTUl9TQ0FOX1RJTUVfREVGQVVMVCAgICAgICAwCisjZGVmaW5lIENTUl9WQUxVRV9JR05PUkVEICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIENTUl9SU05fUE1LSURfU0laRSAgICAgICAgICAxNgorI2RlZmluZSBDU1JfTUFYX1BNS0lEX0FMTE9XRUQgICAgICAgMTYKKyNkZWZpbmUgQ1NSX1dFUDQwX0tFWV9MRU4gICAgICAgNQorI2RlZmluZSBDU1JfV0VQMTA0X0tFWV9MRU4gICAgICAxMworI2RlZmluZSBDU1JfVEtJUF9LRVlfTEVOICAgICAgICAzMgorI2RlZmluZSBDU1JfQUVTX0tFWV9MRU4gICAgICAgICAxNgorI2RlZmluZSBDU1JfTUFYX1RYX1BPV0VSICAgICAgICAoIFdOSV9DRkdfQ1VSUkVOVF9UWF9QT1dFUl9MRVZFTF9TVEFNQVggKQorI2RlZmluZSBDU1JfTUFYX1JTQ19MRU4gICAgICAgICAgMTYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorI2RlZmluZSBDU1JfV0FQSV9CS0lEX1NJWkUgICAgICAgICAgMTYKKyNkZWZpbmUgQ1NSX01BWF9CS0lEX0FMTE9XRUQgICAgICAgIDE2CisjZGVmaW5lIENTUl9XQVBJX0tFWV9MRU4gICAgICAgIDMyCisjZGVmaW5lIENTUl9NQVhfS0VZX0xFTiAgICAgICAgICggQ1NSX1dBUElfS0VZX0xFTiApICAvL2xvbmdlc3Qgb25lIGlzIGZvciBXQVBJCisjZWxzZQorI2RlZmluZSBDU1JfTUFYX0tFWV9MRU4gICAgICAgICAoIENTUl9US0lQX0tFWV9MRU4gKSAgLy9sb25nZXN0IG9uZSBpcyBmb3IgVEtJUAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorI2RlZmluZSBDU1JfS1JLX0tFWV9MRU4gMTYKKyNlbmRpZgorCisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ2hhbm5lbEluZm8KK3sKKyAgICB0QU5JX1U4IG51bU9mQ2hhbm5lbHM7CisgICAgdEFOSV9VOCAqQ2hhbm5lbExpc3Q7ICAgLy9pdCB3aWxsIGJlIGFuIGFycmF5IG9mIGNoYW5uZWxzCit9dENzckNoYW5uZWxJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JTU0lESW5mbworeworICAgdFNpck1hY1NTaWQgICAgIFNTSUQ7ICAgCisgICB0QU5JX0JPT0xFQU4gICAgaGFuZG9mZlBlcm1pdHRlZDsKKyAgIHRBTklfQk9PTEVBTiAgICBzc2lkSGlkZGVuOworfXRDc3JTU0lESW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU1NJRHMKK3sKKyAgICB0QU5JX1UzMiBudW1PZlNTSURzOworICAgIHRDc3JTU0lESW5mbyAqU1NJRExpc3Q7ICAgLy9UbyBiZSBhbGxvY2F0ZWQgZm9yIGFycmF5IG9mIFNTSURzCit9dENzclNTSURzOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JCU1NJRHMKK3sKKyAgICB0QU5JX1UzMiBudW1PZkJTU0lEczsKKyAgICB0Q3NyQnNzaWQgKmJzc2lkOworfXRDc3JCU1NJRHM7CisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU2NhblJlcXVlc3QgCit7CisgICAgdFNpclNjYW5UeXBlIHNjYW5UeXBlOworICAgIHRDc3JCc3NpZCBic3NpZDsKKyAgICBlQ3NyUm9hbUJzc1R5cGUgQlNTVHlwZTsKKyAgICB0Q3NyU1NJRHMgU1NJRHM7ICAgCisgICAgdENzckNoYW5uZWxJbmZvIENoYW5uZWxJbmZvOworICAgIHRBTklfVTMyIG1pbkNoblRpbWU7ICAgIC8vaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzCisgICAgdEFOSV9VMzIgbWF4Q2huVGltZTsgICAgLy9pbiB1bml0cyBvZiBtaWxsaXNlY29uZHMKKyAgICB0QU5JX1UzMiByZXN0VGltZTsgICAgICAvL2luIHVuaXRzIG9mIG1pbGxpc2Vjb25kcyAgLy9pZ25vcmVkIHdoZW4gbm90IGNvbm5lY3RlZAorICAgIHRBTklfVTMyIHVJRUZpZWxkTGVuOworICAgIHRBTklfVTggKnBJRUZpZWxkOworICAgIGVDc3JSZXF1ZXN0VHlwZSByZXF1ZXN0VHlwZTsgICAgLy8xMWQgc2NhbiBvciBmdWxsIHNjYW4KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgdEFOSV9CT09MRUFOIHAycFNlYXJjaDsKKyNlbmRpZgorfXRDc3JTY2FuUmVxdWVzdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQkdTY2FuUmVxdWVzdAoreworICAgIHRTaXJTY2FuVHlwZSBzY2FuVHlwZTsKKyAgICB0U2lyTWFjU1NpZCBTU0lEOworICAgIHRDc3JDaGFubmVsSW5mbyBDaGFubmVsSW5mbzsKKyAgICB0QU5JX1UzMiBzY2FuSW50ZXJ2YWw7ICAvL2luIHVuaXRzIG9mIG1pbGxpc2Vjb25kcworICAgIHRBTklfVTMyIG1pbkNoblRpbWU7ICAgIC8vaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzCisgICAgdEFOSV9VMzIgbWF4Q2huVGltZTsgICAgLy9pbiB1bml0cyBvZiBtaWxsaXNlY29uZHMKKyAgICB0QU5JX1UzMiByZXN0VGltZTsgICAgICAvL2luIHVuaXRzIG9mIG1pbGxpc2Vjb25kcyAgLy9pZ25vcmVkIHdoZW4gbm90IGNvbm5lY3RlZAorICAgIHRBTklfVTMyIHRocm91Z2hwdXRJbXBhY3Q7ICAgICAgLy9zcGVjaWZ5IHdoZXRoZXIgQkcgc2NhbiBjYXJlcyBhYm91dCBpbXBhY3RpbmcgdGhyb3VnaHB1dCAgLy9pZ25vcmVkIHdoZW4gbm90IGNvbm5lY3RlZAorICAgIHRDc3JCc3NpZCBic3NpZDsgICAgLy9ob3cgdG8gdXNlIGl0Pz8gQXBwbGUKK310Q3NyQkdTY2FuUmVxdWVzdDsKKworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JTY2FuUmVzdWx0SW5mbworeworICAgIC8vQ2FycnkgdGhlIElFcyBmb3IgdGhlIGN1cnJlbnQgQlNTRGVzY3JpcHRpb24uIEEgcG9pbnRlciB0byB0RG90MTFmQmVhY29uSUVzLiBNYXliZSBOVUxMIGZvciBzdGFydCBCU1MuCisgICAgdm9pZCAqcHZJZXM7CisgICAgdEFuaVNTSUQgc3NJZDsKKyAgICB2X1RJTUVfdCB0aW1lcjsgLy8gdGltZXIgaXMgdmFyaWFibGUgd2hpY2ggaXMgdXNlZCBmb3IgaGlkZGVuIFNTSUQncyB0aW1lciB2YWx1ZQorICAgIC8vVGhpcyBtZW1iZXIgbXVzdCBiZSB0aGUgbGFzdCBpbiB0aGUgc3RydWN0dXJlIGJlY2F1c2UgdGhlIGVuZCBvZiB0U2lyQnNzRGVzY3JpcHRpb24gaXMgYW4KKyAgICAvLyAgICBhcnJheSB3aXRoIG5vbmtub3duIHNpemUgYXQgdGhpcyB0aW1lCisgICAgdFNpckJzc0Rlc2NyaXB0aW9uIEJzc0Rlc2NyaXB0b3I7Cit9dENzclNjYW5SZXN1bHRJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JFbmNyeXB0aW9uTGlzdAoreworCisgICAgdEFOSV9VMzIgbnVtRW50cmllczsKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgZW5jcnlwdGlvblR5cGVbZUNTUl9OVU1fT0ZfRU5DUllQVF9UWVBFXTsKKworfXRDc3JFbmNyeXB0aW9uTGlzdCwgKnRwQ3NyRW5jcnlwdGlvbkxpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzckF1dGhMaXN0Cit7CisgICAgdEFOSV9VMzIgbnVtRW50cmllczsKKyAgICBlQ3NyQXV0aFR5cGUgYXV0aFR5cGVbZUNTUl9OVU1fT0ZfU1VQUE9SVF9BVVRIX1RZUEVdOworfXRDc3JBdXRoTGlzdCwgKnRwQ3NyQXV0aExpc3Q7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyTW9iaWxpdHlEb21haW5JbmZvCit7CisgICAgdEFOSV9VOCBtZGllUHJlc2VudDsKKyAgICB0QU5JX1UxNiBtb2JpbGl0eURvbWFpbjsKK30gdENzck1vYmlsaXR5RG9tYWluSW5mbzsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ2N4Q2NrbUluZm8KK3sKKyAgICB0QU5JX1UzMiAgICAgICByZWFzc29jX3JlcV9udW07CisgICAgdEFOSV9CT09MRUFOICAga3JrX3BsdW1iZWQ7CisgICAgdEFOSV9VOCAgICAgICAga3JrW0NTUl9LUktfS0VZX0xFTl07Cit9IHRDc3JDY3hDY2ttSW5mbzsKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzclNjYW5SZXN1bHRGaWx0ZXIKK3sKKyAgICB0Q3NyQlNTSURzIEJTU0lEczsgICAgLy9lYWNoIGJzc2lkIGhhcyBhIGxlbmd0aCBvZiBXTklfQ0ZHX0JTU0lEX0xFTiAoNikKKyAgICB0Q3NyU1NJRHMgU1NJRHM7ICAgCisgICAgdENzckNoYW5uZWxJbmZvIENoYW5uZWxJbmZvOworICAgIHRDc3JBdXRoTGlzdCBhdXRoVHlwZTsKKyAgICB0Q3NyRW5jcnlwdGlvbkxpc3QgRW5jcnlwdGlvblR5cGU7CisgICAgLy9lQ1NSX0VOQ1JZUFRfVFlQRV9BTlkgY2Fubm90IGJlIHNldCBpbiBtdWx0aWNhc3QgZW5jcnlwdGlvbiB0eXBlLiBJZiBjYWxsZXIgZG9lc24ndCBjYXNlLCAKKyAgICAvL3B1dCBhbGwgc3VwcG9ydGVkIGVuY3J5cHRpb24gdHlwZXMgaW4gaGVyZQorICAgIHRDc3JFbmNyeXB0aW9uTGlzdCBtY0VuY3J5cHRpb25UeXBlOworICAgIGVDc3JSb2FtQnNzVHlwZSBCU1NUeXBlOyAgIAorICAgIC8vdGhpcyBpcyBhIGJpdCBtYXNrIG9mIGFsbCB0aGUgbmVlZGVkIHBoeSBtb2RlIGRlZmluZWQgaW4gZUNzclBoeU1vZGUKKyAgICB0QU5JX1UzMiBwaHlNb2RlOyAgIAorICAgIC8vSWYgY291bnRyeUNvZGVbMF0gaXMgbm90IDAsIGNvdW50cnlDb2RlIGlzIGNoZWNrZWQgaW5kZXBlbmRlbnQgb2YgZkNoZWNrVW5rbm93bkNvdW50cnlDb2RlCisgICAgdEFOSV9VOCBjb3VudHJ5Q29kZVtXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU5dOyAKKyAgICB0QU5JX1U4IHVhcHNkX21hc2s7IAorICAgIC8qRm9yIFdQUyBmaWx0ZXJpbmcgaWYgdHJ1ZSA9PiBhdXRoIGFuZCBlY3J5cHRpb24gc2hvdWxkIGJlIGlnbm9yZWQqLworICAgIHRBTklfQk9PTEVBTiBiV1BTQXNzb2NpYXRpb247CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgLypGb3IgbWVhc3VyZW1lbnQgcmVwb3J0cyAtLT4gaWYgc2V0LCBvbmx5IFNTSUQsIEJTU0lEIGFuZCBjaGFubmVsIGlzIGNvbnNpZGVyZWQgZm9yIGZpbHRlcmluZy4qLworICAgIHRBTklfQk9PTEVBTiBmTWVhc3VyZW1lbnQ7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIHRDc3JNb2JpbGl0eURvbWFpbkluZm8gTURJRDsKKyNlbmRpZgorICAgIHRBTklfQk9PTEVBTiBwMnBSZXN1bHQ7Cit9dENzclNjYW5SZXN1bHRGaWx0ZXI7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0NzckNoblBvd2VyXworeworICB0QU5JX1U4IGZpcnN0Q2hhbm5lbDsKKyAgdEFOSV9VOCBudW1DaGFubmVsczsKKyAgdEFOSV9VOCBtYXh0eFBvd2VyOworfXNDc3JDaG5Qb3dlcjsKKworCit0eXBlZGVmIHN0cnVjdCBzQ3NyQ2hhbm5lbF8KK3sKKyAgICB0QU5JX1U4IG51bUNoYW5uZWxzOworICAgIHRBTklfVTggY2hhbm5lbExpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKK31zQ3NyQ2hhbm5lbDsKKworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3IxMWRpbmZvCit7CisgIHNDc3JDaGFubmVsICAgICBDaGFubmVsczsKKyAgdEFOSV9VOCAgICAgICAgIGNvdW50cnlDb2RlW1dOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTisxXTsKKyAgLy9tYXggcG93ZXIgY2hhbm5lbCBsaXN0CisgIHNDc3JDaG5Qb3dlciAgICBDaG5Qb3dlcltXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworfXRDc3IxMWRpbmZvOworCisKK3R5cGVkZWYgZW51bQoreworICAgIGVDU1JfUk9BTV9DQU5DRUxMRUQgPSAxLAorICAgIC8vdGhpcyBtZWFuIGVycm9yIGhhcHBlbnMgYmVmb3JlIGFzc29jaWF0aW9uX3N0YXJ0IG9yIHJvYW1pbmdfc3RhcnQgaXMgY2FsbGVkLgorICAgIGVDU1JfUk9BTV9GQUlMRUQsICAgCisgICAgLy9hIENTUiB0cmlnZ2VyIHJvYW1pbmcgb3BlcmF0aW9uIHN0YXJ0cywgY2FsbGJhY2sgbWF5IGdldCBhIHBvaW50ZXIgdG8gdENzckNvbm5lY3RlZFByb2ZpbGUKKyAgICBlQ1NSX1JPQU1fUk9BTUlOR19TVEFSVCwgICAgCisgICAgLy9hIENTUiB0cmlnZ2VyIHJvYW1pbmcgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZAorICAgIGVDU1JfUk9BTV9ST0FNSU5HX0NPTVBMRVRJT04sICAgCisgICAgLy9Db25uZWN0aW9uIGNvbXBsZXRlZCBzdGF0dXMuCisgICAgZUNTUl9ST0FNX0NPTk5FQ1RfQ09NUExFVElPTiwgCisgICAgLy9hbiBhc3NvY2lhdGlvbiBvciBzdGFydF9JQlNTIG9wZXJhdGlvbiBzdGFydHMsIAorICAgIC8vY2FsbGJhY2sgbWF5IGdldCBhIHBvaW50ZXIgdG8gdENzclJvYW1Qcm9maWxlIGFuZCBhIHBvaW50ZXIgdG8gdFNpckJzc0Rlc2NyaXB0aW9uIAorICAgIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9TVEFSVCwgICAgCisgICAgLy9hIHJvYW1pbmcgb3BlcmF0aW9uIGlzIGZpbmlzaCwgc2VlIGVDc3JSb2FtUmVzdWx0IGZvciAKKyAgICAvL3Bvc3NpYmxlIGRhdGEgcGFzc2VkIGJhY2sKKyAgICBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fQ09NUExFVElPTiwgICAKKyAgICBlQ1NSX1JPQU1fRElTQVNTT0NJQVRFRCwKKyAgICBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fRkFJTFVSRSwKKyAgICAvL3doZW4gY2FsbGJhY2sgd2l0aCB0aGlzIGZsYWcuIGNhbGxiYWNrIGdldHMgYSBwb2ludGVyIHRvIHRoZSBCU1MgZGVzYy4KKyAgICBlQ1NSX1JPQU1fU0hPVUxEX1JPQU0sICAKKyAgICAvL0EgbmV3IGNhbmRpZGF0ZSBmb3IgUE1LSUQgaXMgZm91bmQKKyAgICBlQ1NSX1JPQU1fU0NBTl9GT1VORF9ORVdfQlNTLAorICAgIC8vQ1NSIGlzIGRvbmUgbG9zdGxpbmsgcm9hbWluZyBhbmQgc3RpbGwgY2Fubm90IHJlY29ubmVjdAorICAgIGVDU1JfUk9BTV9MT1NUTElOSywKKyAgICAvL2EgbGluayBsb3N0IGlzIGRldGVjdGVkLiBDU1Igc3RhcnRzIHJvYW1pbmcuCisgICAgZUNTUl9ST0FNX0xPU1RMSU5LX0RFVEVDVEVELCAgIAorICAgIC8vVEtJUCBNSUMgZXJyb3IgZGV0ZWN0ZWQsIGNhbGxiYWNrIGdldHMgYSBwb2ludGVyIHRvIHRwU2lyU21lTWljRmFpbHVyZUluZAorICAgIGVDU1JfUk9BTV9NSUNfRVJST1JfSU5ELAorICAgIGVDU1JfUk9BTV9JQlNTX0lORCwgLy9JQlNTIGluZGljYXRpb25zLgorICAgIC8vVXBkYXRlIHRoZSBjb25uZWN0aW9uIHN0YXR1cywgdXNlZnVsIGZvciBJQlNTOiBuZXcgcGVlciBhZGRlZCwgbmV0d29yayBpcyBhY3RpdmUgZXRjLiAKKyAgICBlQ1NSX1JPQU1fQ09OTkVDVF9TVEFUVVNfVVBEQVRFLCAgCisgICAgZUNTUl9ST0FNX0dFTl9JTkZPLAorICAgIGVDU1JfUk9BTV9TRVRfS0VZX0NPTVBMRVRFLAorICAgIGVDU1JfUk9BTV9SRU1PVkVfS0VZX0NPTVBMRVRFLAorICAgIGVDU1JfUk9BTV9JQlNTX0xFQVZFLCAvL0lCU1MgaW5kaWNhdGlvbnMuCisgICAgLy9CU1MgaW4gV0RTIG1vZGUgc3RhdHVzIGluZGljYXRpb24KKyAgICBlQ1NSX1JPQU1fV0RTX0lORCwKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgLy9CU1MgaW4gU29mdEFQIG1vZGUgc3RhdHVzIGluZGljYXRpb24KKyAgICBlQ1NSX1JPQU1fSU5GUkFfSU5ELAorICAgIGVDU1JfUk9BTV9XUFNfUEJDX1BST0JFX1JFUV9JTkQsCisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGVDU1JfUk9BTV9GVF9SRVNQT05TRSwKKyNlbmRpZgorICAgIGVDU1JfUk9BTV9GVF9TVEFSVCwKKyAgICBlQ1NSX1JPQU1fSU5ESUNBVEVfTUdNVF9GUkFNRSwKKyAgICBlQ1NSX1JPQU1fUkVNQUlOX0NIQU5fUkVBRFksCisgICAgZUNTUl9ST0FNX1NFTkRfQUNUSU9OX0NORiwKKyAgICAvL3RoaXMgbWVhbiBlcnJvciBoYXBwZW5zIGJlZm9yZSBhc3NvY2lhdGlvbl9zdGFydCBvciByb2FtaW5nX3N0YXJ0IGlzIGNhbGxlZC4KKyAgICBlQ1NSX1JPQU1fU0VTU0lPTl9PUEVORUQsCisgICAgZUNTUl9ST0FNX0ZUX1JFQVNTT0NfRkFJTEVELAorfWVSb2FtQ21kU3RhdHVzOworCisKKy8vY29tbWVudCBpbnNpZGUgaW5kaWNhdGVzIHdoYXQgcm9hbWluZyBjYWxsYmFjayBnZXRzCit0eXBlZGVmIGVudW0KK3sKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX05PTkUsCisgICAgLy90aGlzIG1lYW5zIG5vIG1vcmUgYWN0aW9uIGluIENTUgorICAgIC8vSWYgcm9hbVN0YXR1cyBpcyBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fQ09NUExFVElPTiwgdENzclJvYW1JbmZvJ3MgcEJzc0Rlc2MgbWF5IHBhc3MgYmFjaworICAgIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSwgICAKKyAgICAvL1Bhc3MgYmFjayBwb2ludGVyIHRvIHRDc3JSb2FtSW5mbworICAgIGVDU1JfUk9BTV9SRVNVTFRfQVNTT0NJQVRFRCwgICAgCisgICAgZUNTUl9ST0FNX1JFU1VMVF9OT1RfQVNTT0NJQVRFRCwKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX01JQ19GQUlMVVJFLAorICAgIGVDU1JfUk9BTV9SRVNVTFRfRk9SQ0VELAorICAgIGVDU1JfUk9BTV9SRVNVTFRfRElTQVNTT0NfSU5ELAorICAgIGVDU1JfUk9BTV9SRVNVTFRfREVBVVRIX0lORCwKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX0NBUF9DSEFOR0VELAorICAgIC8vVGhpcyBtZWFucyB3ZSBzdGFydHMgYW4gSUJTUworICAgIC8vdENzclJvYW1JbmZvJ3MgcEJzc0Rlc2MgbWF5IHBhc3MgYmFjaworICAgIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19TVEFSVEVELCAgCisgICAgLy9TVEFSVF9CU1MgZmFpbGVkCisgICAgLy90Q3NyUm9hbUluZm8ncyBwQnNzRGVzYyBtYXkgcGFzcyBiYWNrCisgICAgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1NUQVJUX0ZBSUxFRCwgCisgICAgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX0pPSU5fU1VDQ0VTUywKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfSk9JTl9GQUlMRUQsIAorICAgIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19DT05ORUNULAorICAgIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19JTkFDVElWRSwKKyAgICAvL0lmIHJvYW1TdGF0dXMgaXMgZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04KKyAgICAvL3RDc3JSb2FtSW5mbydzIHBCc3NEZXNjIG1heSBwYXNzIGJhY2suIGFuZCB0aGUgcGVlcidzIE1BQyBhZGRyZXNzIGluIHBlZXJNYWNPckJzc2lkIAorICAgIC8vSWYgcm9hbVN0YXR1cyBpcyBlQ1NSX1JPQU1fSUJTU19JTkQsICAKKyAgICAvL3RoZSBwZWVyJ3MgTUFDIGFkZHJlc3MgaW4gcGVlck1hY09yQnNzaWQgYW5kIGEgYmVhY29uIGZyYW1lIG9mIHRoZSBJQlNTIGluIHBiRnJhbWVzCisgICAgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX05FV19QRUVSLCAKKyAgICAvL1BlZXIgZGVwYXJ0ZWQgZnJvbSBJQlNTLCBDYWxsYmFjayBtYXkgZ2V0IGEgcG9pbnRlciB0U21lSWJzc1BlZXJJbmQgaW4gcElic3NQZWVySW5kCisgICAgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1BFRVJfREVQQVJURUQsIAorICAgIC8vQ29hbGVzY2luZyBpbiB0aGUgSUJTUyBuZXR3b3JrIChqb2luZWQgYW4gSUJTUyBuZXR3b3JrKQorICAgIC8vQ2FsbGJhY2sgcGFzcyBhIEJTU0lEIGluIHBlZXJNYWNPckJzc2lkCisgICAgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX0NPQUxFU0NFRCwgICAgCisgICAgLy9JZiByb2FtU3RhdHVzIGlzIGVDU1JfUk9BTV9ST0FNSU5HX1NUQVJULCBjYWxsYmFjayBtYXkgZ2V0IGEgcG9pbnRlciB0byB0Q3NyQ29ubmVjdGVkUHJvZmlsZSB1c2VkIHRvIGNvbm5lY3QuCisgICAgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1NUT1AsICAKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX0xPU1RMSU5LLCAKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX01JQ19FUlJPUl9VTklDQVNULAorICAgIGVDU1JfUk9BTV9SRVNVTFRfTUlDX0VSUk9SX0dST1VQLAorICAgIGVDU1JfUk9BTV9SRVNVTFRfQVVUSEVOVElDQVRFRCwKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX05FV19SU05fQlNTLAorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgZUNTUl9ST0FNX1JFU1VMVF9ORVdfV0FQSV9CU1MsCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyAgICAvLyBXRFMgc3RhcnRlZCBzdWNjZXNzZnVsbHkKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX1dEU19TVEFSVEVELAorICAgIC8vIFdEUyBzdGFydCBmYWlsZWQKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX1dEU19TVEFSVF9GQUlMRUQsCisgICAgLy8gV0RTIHN0b3BwZWQKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX1dEU19TVE9QUEVELAorICAgIC8vIFdEUyBqb2luZWQgc3VjY2Vzc2Z1bGx5IGluIFNUQSBtb2RlCisgICAgZUNTUl9ST0FNX1JFU1VMVF9XRFNfQVNTT0NJQVRFRCwKKyAgICAvLyBBIHN0YXRpb24gam9pbmVkIFdEUyBBUCAKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX1dEU19BU1NPQ0lBVElPTl9JTkQsCisgICAgLy8gV0RTIGpvaW4gZmFpbGVkIGluIFNUQSBtb2RlCisgICAgZUNTUl9ST0FNX1JFU1VMVF9XRFNfTk9UX0FTU09DSUFURUQsCisgICAgLy8gV0RTIGRpc2Fzc29jaWF0ZWQKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX1dEU19ESVNBU1NPQ0lBVEVELAorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAvLyBJTkZSQSBzdGFydGVkIHN1Y2Nlc3NmdWxseQorICAgIGVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfU1RBUlRFRCwKKyAgICAvLyBJTkZSQSBzdGFydCBmYWlsZWQKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX1NUQVJUX0ZBSUxFRCwKKyAgICAvLyBJTkZSQSBzdG9wcGVkCisgICAgZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9TVE9QUEVELAorICAgIC8vIEEgc3RhdGlvbiBqb2luaW5nIElORlJBIEFQCisgICAgZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9BU1NPQ0lBVElPTl9JTkQsCisgICAgLy8gQSBzdGF0aW9uIGpvaW5lZCBJTkZSQSBBUAorICAgIGVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfQVNTT0NJQVRJT05fQ05GLAorICAgIC8vIElORlJBIGRpc2Fzc29jaWF0ZWQKKyAgICBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0RJU0FTU09DSUFURUQsCisgICAgZUNTUl9ST0FNX1JFU1VMVF9XUFNfUEJDX1BST0JFX1JFUV9JTkQsCisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgZUNTUl9ST0FNX1JFU1VMVF9TRU5EX0FDVElPTl9GQUlMLAorI2VuZGlmCisgICAgLy8gcGVlciByZWplY3RlZCBhc3NvYyBiZWNhdXNlIG1heCBhc3NvYyBsaW1pdCByZWFjaGVkLiBjYWxsYmFjayBnZXRzIHBvaW50ZXIgdG8gcGVlcgorICAgIGVDU1JfUk9BTV9SRVNVTFRfTUFYX0FTU09DX0VYQ0VFREVELAorfWVDc3JSb2FtUmVzdWx0OworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIExpc3Qgb2YgbGluayBxdWFsaXR5IGluZGljYXRpb25zIEhERCBjYW4gcmVjZWl2ZSBmcm9tIFNNRQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgZUNTUl9ST0FNX0xJTktfUVVBTF9NSU5fSU5EICAgICA9IC0xLAorCisgZUNTUl9ST0FNX0xJTktfUVVBTF9QT09SX0lORCAgICAgICAgICAgID0gIDAsICAgLyogYmFkIGxpbmsgICAgICAgICAgICAgICAgKi8KKyBlQ1NSX1JPQU1fTElOS19RVUFMX0dPT0RfSU5EICAgICAgICAgICAgPSAgMSwgICAvKiBhY2NlcHRhYmxlIGZvciB2b2ljZSAgICAqLworIGVDU1JfUk9BTV9MSU5LX1FVQUxfVkVSWV9HT09EX0lORCAgICAgICA9ICAyLCAgIC8qIHN1aXRhYmxlIGZvciB2b2ljZSAgICAgICovCisgZUNTUl9ST0FNX0xJTktfUVVBTF9FWENFTExFTlRfSU5EICAgICAgID0gIDMsICAgLyogc3VpdGFibGUgZm9yIHZvaWNlICAgICAgKi8KKworIGVDU1JfUk9BTV9MSU5LX1FVQUxfTUFYX0lORCAgLyogaW52YWxpZCB2YWx1ZSAqLworCit9IGVDc3JSb2FtTGlua1F1YWxpdHlJbmQ7CisKK3R5cGVkZWYgZW51bQoreworICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQgPSAwLAorICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fTUlDX0VSUk9SLAorICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fRElTQVNTT0MsCisgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9ERUFVVEgsCisgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9IQU5ET0ZGLAorICAgIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fSUJTU19KT0lOX0ZBSUxVUkUsCisgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9JQlNTX0xFQVZFLAorfWVDc3JSb2FtRGlzY29ubmVjdFJlYXNvbjsKKwordHlwZWRlZiBlbnVtIAoreworICAgIC8vIE5vdCBhc3NvY2lhdGVkIGluIEluZnJhIG9yIHBhcnRpY2lwYXRpbmcgaW4gYW4gSUJTUyAvIEFkLWhvYyBuZXR3b3JrLgorICAgIGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9OT1RfQ09OTkVDVEVELAorICAgIC8vIEFzc29jaWF0ZWQgaW4gYW4gSW5mcmFzdHJ1Y3R1cmUgbmV0d29yay4KKyAgICBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfSU5GUkFfQVNTT0NJQVRFRCwKKyAgICAvLyBQYXJ0aWNpcGF0aW5nIGluIGFuIElCU1MgbmV0d29yayB0aG91Z2ggZGlzY29ubmVjdGVkIChubyBwYXJ0bmVyIHN0YXRpb25zCisgICAgLy8gaW4gdGhlIElCU1MpLgorICAgIGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JQlNTX0RJU0NPTk5FQ1RFRCwKKyAgICAvLyBQYXJ0aWNpcGF0aW5nIGluIGFuIElCU1MgbmV0d29yayB3aXRoIHBhcnRuZXIgc3RhdGlvbnMgYWxzbyBwcmVzZW50CisgICAgZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lCU1NfQ09OTkVDVEVELAorICAgIC8vIFBhcnRpY2lwYXRpbmcgaW4gYSBXRFMgbmV0d29yayBpbiBBUCBvciBTVEEgbW9kZSBidXQgbm90IGNvbm5lY3RlZCB5ZXQKKyAgICBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfV0RTX0RJU0NPTk5FQ1RFRCwKKyAgICAvLyBQYXJ0aWNpcGF0aW5nIGluIGEgV0RTIG5ldHdvcmsgYW5kIGNvbm5lY3RlZCBwZWVyIHRvIHBlZXIKKyAgICBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfV0RTX0NPTk5FQ1RFRCwKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgLy8gUGFydGljaXBhdGluZyBpbiBhIEluZnJhIG5ldHdvcmsgaW4gQVAgbm90IHlldCBpbiBjb25uZWN0ZWQgc3RhdGUKKyAgICBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfSU5GUkFfRElTQ09OTkVDVEVELAorICAgIC8vIFBhcnRpY2lwYXRpbmcgaW4gYSBJbmZyYSBuZXR3b3JrIGFuZCBjb25uZWN0ZWQgdG8gYSBwZWVyCisgICAgZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lORlJBX0NPTk5FQ1RFRCwKKyNlbmRpZgorCit9ZUNzckNvbm5lY3RTdGF0ZTsKKworCisvLyBUaGlzIHBhcmFtZXRlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIHRoZSBQcm9maWxlLiAgTmVlZCB0byBzZXQgdGhpcyBpbiB0aGUgZ2xvYmFsIHByb3BlcnRpZXMKKy8vIGZvciB0aGUgYWRhcHRlci4KK3R5cGVkZWYgZW51bSBlQ1NSX01FRElVTV9BQ0NFU1MgCit7CisgICAgZUNTUl9NRURJVU1fQUNDRVNTX0FVVE8gPSAwLAorICAgIGVDU1JfTUVESVVNX0FDQ0VTU19EQ0YsCisgICAgZUNTUl9NRURJVU1fQUNDRVNTX2VEQ0YsCisgICAgZUNTUl9NRURJVU1fQUNDRVNTX0hDRiwKKworICAgIGVDU1JfTUVESVVNX0FDQ0VTU19XTU1fZURDRl84MDJkb3QxcCwKKyAgICBlQ1NSX01FRElVTV9BQ0NFU1NfV01NX2VEQ0ZfRFNDUCwKKyAgICBlQ1NSX01FRElVTV9BQ0NFU1NfV01NX2VEQ0ZfTm9DbGFzc2lmeSwKKyAgICBlQ1NSX01FRElVTV9BQ0NFU1NfMTFlX2VEQ0YgPSBlQ1NSX01FRElVTV9BQ0NFU1NfZURDRiwKKyAgICBlQ1NSX01FRElVTV9BQ0NFU1NfMTFlX0hDRiAgPSBlQ1NSX01FRElVTV9BQ0NFU1NfSENGLAorfWVDc3JNZWRpYUFjY2Vzc1R5cGU7CisKK3R5cGVkZWYgZW51bSAKK3sKKyAgICBlQ1NSX1RYX1JBVEVfQVVUTyA9IDAsICAgLy8gdXNlIHJhdGUgYWRhcHRpb24gdG8gZGV0ZXJtaW5lIFR4IHJhdGUuCisKKyAgICBlQ1NSX1RYX1JBVEVfMU1icHMgICA9IDB4MDAwMDAwMDEsCisgICAgZUNTUl9UWF9SQVRFXzJNYnBzICAgPSAweDAwMDAwMDAyLAorICAgIGVDU1JfVFhfUkFURV81XzVNYnBzID0gMHgwMDAwMDAwNCwKKyAgICBlQ1NSX1RYX1JBVEVfNk1icHMgICA9IDB4MDAwMDAwMDgsCisgICAgZUNTUl9UWF9SQVRFXzlNYnBzICAgPSAweDAwMDAwMDEwLAorICAgIGVDU1JfVFhfUkFURV8xMU1icHMgID0gMHgwMDAwMDAyMCwKKyAgICBlQ1NSX1RYX1JBVEVfMTJNYnBzICA9IDB4MDAwMDAwNDAsCisgICAgZUNTUl9UWF9SQVRFXzE4TWJwcyAgPSAweDAwMDAwMDgwLAorICAgIGVDU1JfVFhfUkFURV8yNE1icHMgID0gMHgwMDAwMDEwMCwKKyAgICBlQ1NSX1RYX1JBVEVfMzZNYnBzICA9IDB4MDAwMDAyMDAsCisgICAgZUNTUl9UWF9SQVRFXzQyTWJwcyAgPSAweDAwMDAwNDAwLAorICAgIGVDU1JfVFhfUkFURV80OE1icHMgID0gMHgwMDAwMDgwMCwKKyAgICBlQ1NSX1RYX1JBVEVfNTRNYnBzICA9IDB4MDAwMDEwMDAsCisgICAgZUNTUl9UWF9SQVRFXzcyTWJwcyAgPSAweDAwMDAyMDAwLAorICAgIGVDU1JfVFhfUkFURV84NE1icHMgID0gMHgwMDAwNDAwMCwKKyAgICBlQ1NSX1RYX1JBVEVfOTZNYnBzICA9IDB4MDAwMDgwMDAsCisgICAgZUNTUl9UWF9SQVRFXzEwOE1icHMgPSAweDAwMDEwMDAwLAorICAgIGVDU1JfVFhfUkFURV8xMjZNYnBzID0gMHgwMDAyMDAwMCwKKyAgICBlQ1NSX1RYX1JBVEVfMTQ0TWJwcyA9IDB4MDAwNDAwMDAsCisgICAgZUNTUl9UWF9SQVRFXzE2OE1icHMgPSAweDAwMDgwMDAwLAorICAgIGVDU1JfVFhfUkFURV8xOTJNYnBzID0gMHgwMDEwMDAwMCwKKyAgICBlQ1NSX1RYX1JBVEVfMjE2TWJwcyA9IDB4MDAyMDAwMDAsCisgICAgZUNTUl9UWF9SQVRFXzI0ME1icHMgPSAweDAwNDAwMDAwLAorCit9ZUNzckV4cG9zZWRUeFJhdGU7CisKK3R5cGVkZWYgZW51bSAKK3sKKyAgICBlQ1NSX09QRVJBVElOR19DSEFOTkVMX0FMTCAgPSAwLAorICAgIGVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQVVUTyA9IGVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQUxMLAorICAgIGVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQU5ZICA9IGVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQUxMLAorfWVPcGVyYXRpb25DaGFubmVsOworCit0eXBlZGVmIGVudW0gCit7CisgICAgZUNTUl9ET1QxMV9GUkFHX1RIUkVTSF9BVVRPICAgICAgICAgICAgPSAtMSwKKyAgICBlQ1NSX0RPVDExX0ZSQUdfVEhSRVNIX01JTiAgICAgICAgICAgICA9IDI1NiwKKyAgICBlQ1NSX0RPVDExX0ZSQUdfVEhSRVNIX01BWCAgICAgICAgICAgICA9IDIzNDYsCisgICAgZUNTUl9ET1QxMV9GUkFHX1RIUkVTSF9ERUZBVUxUICAgICAgICAgPSAyMDAwCit9ZUNzckRvdDExRnJhZ1RocmVzaDsKKworCisvL2ZvciBjaGFubmVsIGJvbmRpbmcgZm9yIGlic3MKK3R5cGVkZWYgZW51bSAKK3sKKyAgICBlQ1NSX0NCX09GRiA9IDAsCisgICAgZUNTUl9DQl9BVVRPID0gMSwKKyAgICBlQ1NSX0NCX0RPV04gPSAyLAorICAgIGVDU1JfQ0JfVVAgPSAzLAorfWVDc3JDQkNob2ljZTsKKworLy9Gb3IgY2hhbm5lbCBib25kaW5nLCB0aGUgY2hhbm5lbCBudW1iZXIgZ2FwIGlzIDQsIGVpdGhlciB1cCBvciBkb3duLiBGb3IgYm90aCAxMWEgYW5kIDExZyBtb2RlLgorI2RlZmluZSBDU1JfQ0JfQ0hBTk5FTF9HQVAgNAorI2RlZmluZSBDU1JfQ0JfQ0VOVEVSX0NIQU5ORUxfT0ZGU0VUICAgIDIKKyNkZWZpbmUgQ1NSX01BWF8yNEdIel9DSEFOTkVMX05VTUJFUiAoIFNJUl8xMUJfQ0hBTk5FTF9FTkQgKQorCisvLyBXRVAga2V5c2l6ZSAoaW4gYml0cykuLi4KK3R5cGVkZWYgZW51bSAgCit7CisgICAgZUNTUl9TRUNVUklUWV9XRVBfS0VZU0laRV80MCAgPSAgNDAsICAgLy8gNDAgYml0IGtleSArIDI0Yml0IElWID0gNjRiaXQgV0VQCisgICAgZUNTUl9TRUNVUklUWV9XRVBfS0VZU0laRV8xMDQgPSAxMDQsICAgLy8gMTA0Yml0IGtleSArIDI0Yml0IElWID0gMTI4Yml0IFdFUAorCisgICAgZUNTUl9TRUNVUklUWV9XRVBfS0VZU0laRV9NSU4gPSBlQ1NSX1NFQ1VSSVRZX1dFUF9LRVlTSVpFXzQwLAorICAgIGVDU1JfU0VDVVJJVFlfV0VQX0tFWVNJWkVfTUFYID0gZUNTUl9TRUNVUklUWV9XRVBfS0VZU0laRV8xMDQsCisgICAgZUNTUl9TRUNVUklUWV9XRVBfS0VZU0laRV9NQVhfQllURVMgPSAoIGVDU1JfU0VDVVJJVFlfV0VQX0tFWVNJWkVfTUFYIC8gOCApLAorfWVDc3JXRVBLZXlTaXplOworCisKKy8vIFBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIFdFUCBzdGF0aWMga2V5IElELi4uCit0eXBlZGVmIGVudW0KK3sKKworICAgIGVDU1JfU0VDVVJJVFlfV0VQX1NUQVRJQ19LRVlfSURfTUlOICAgICAgID0gIDAsCisgICAgZUNTUl9TRUNVUklUWV9XRVBfU1RBVElDX0tFWV9JRF9NQVggICAgICAgPSAgMywKKyAgICBlQ1NSX1NFQ1VSSVRZX1dFUF9TVEFUSUNfS0VZX0lEX0RFRkFVTFQgICA9ICAwLAorCisgICAgZUNTUl9TRUNVUklUWV9XRVBfU1RBVElDX0tFWV9JRF9JTlZBTElEICAgPSAtMSwKKworfWVDc3JXRVBTdGF0aWNLZXlJRDsKKworI2RlZmluZSBDU1JfTUFYX05VTV9LRVkgICAgIChlQ1NSX1NFQ1VSSVRZX1dFUF9TVEFUSUNfS0VZX0lEX01BWCArIDEpCisKK3R5cGVkZWYgZW51bSAKK3sKKyAgICBlQ1NSX1NFQ1VSSVRZX1NFVF9LRVlfQUNUSU9OX05PX0NIQU5HRSwKKyAgICBlQ1NSX1NFQ1VSSVRZX1NFVF9LRVlfQUNUSU9OX1NFVF9LRVksCisgICAgZUNTUl9TRUNVUklUWV9TRVRfS0VZX0FDVElPTl9ERUxFVEVfS0VZLAorfWVDc3JTZXRLZXlBY3Rpb247CisKK3R5cGVkZWYgZW51bQoreworICAgIGVDU1JfQkFORF9BTEwsCisgICAgZUNTUl9CQU5EXzI0LAorICAgIGVDU1JfQkFORF81RywKKyAgICBlQ1NSX0JBTkRfTUFYLAorfWVDc3JCYW5kOworCisKK3R5cGVkZWYgZW51bSAKK3sKKyAgIC8vIFJvYW1pbmcgYmVjYXVzZSBIREQgcmVxdWVzdGVkIGZvciByZWFzc29jIGJ5IGNoYW5naW5nIG9uZSBvZiB0aGUgZmllbGRzIGluIAorICAgLy8gdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzLiBPUgorICAgLy8gUm9hbWluZyBiZWNhdXNlIFNNRSByZXF1ZXN0ZWQgZm9yIHJlYXNzb2MgYnkgY2hhbmdpbmcgb25lIG9mIHRoZSBmaWVsZHMgaW4gCisgICAvLyB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMuCisgICBlQ3NyUm9hbVJlYXNvblN0YUNhcGFiaWxpdHlDaGFuZ2VkLAorICAgLy8gUm9hbWluZyBiZWNhdXNlIFNNRSByZXF1ZXN0ZWQgZm9yIHJlYXNzb2MgdG8gYSBkaWZmZXJlbnQgQVAsIGFzIHBhcnQgb2YgCisgICAvLyBpbnRlciBBUCBoYW5kb2ZmLgorICAgZUNzclJvYW1SZWFzb25CZXR0ZXJBUCwKKyAgIC8vIFJvYW1pbmcgYmVjYXVzZSBTTUUgcmVxdWVzdGVkIGl0IGFzIHRoZSBsaW5rIGlzIGxvc3QgLSBwbGFjZWhvbGRlciwgd2lsbCAKKyAgIC8vIGNsZWFuIGl0IHVwIG9uY2UgaGFuZG9mZiBjb2RlIGdldHMgaW4KKyAgIGVDc3JSb2FtUmVhc29uU21lSXNzdWVkRm9yTG9zdExpbmssCisKK31lQ3NyUm9hbVJlYXNvbkNvZGVzOworCit0eXBlZGVmIGVudW0KK3sKKyAgIGVDc3JSb2FtV21tQXV0byA9IDAsCisgICBlQ3NyUm9hbVdtbVFic3NPbmx5ID0gMSwKKyAgIGVDc3JSb2FtV21tTm9Rb3MgPSAyLAorCit9IGVDc3JSb2FtV21tVXNlck1vZGVUeXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgIGVDU1JfUkVRVUVTVEVSX01JTiA9IDAsCisgICBlQ1NSX0RJQUcsCisgICBlQ1NSX1VNQV9HQU4sCisgICBlQ1NSX0hERAorfSBlQ3NyU3RhdHNSZXF1ZXN0ZXJUeXBlOworCit0eXBlZGVmIHN0cnVjdCB0YWdQbWtpZENhbmRpZGF0ZUluZm8KK3sKKyAgICB0Q3NyQnNzaWQgQlNTSUQ7CisgICAgdEFOSV9CT09MRUFOIHByZUF1dGhTdXBwb3J0ZWQ7Cit9dFBta2lkQ2FuZGlkYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUG1raWRDYWNoZUluZm8KK3sKKyAgICB0Q3NyQnNzaWQgQlNTSUQ7CisgICAgdEFOSV9VOCBQTUtJRFtDU1JfUlNOX1BNS0lEX1NJWkVdOworfXRQbWtpZENhY2hlSW5mbzsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCit0eXBlZGVmIHN0cnVjdCB0YWdCa2lkQ2FuZGlkYXRlSW5mbworeworICAgIHRDc3JCc3NpZCBCU1NJRDsKKyAgICB0QU5JX0JPT0xFQU4gcHJlQXV0aFN1cHBvcnRlZDsKK310QmtpZENhbmRpZGF0ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IHRhZ0JraWRDYWNoZUluZm8KK3sKKyAgICB0Q3NyQnNzaWQgQlNTSUQ7CisgICAgdEFOSV9VOCBCS0lEW0NTUl9XQVBJX0JLSURfU0laRV07Cit9dEJraWRDYWNoZUluZm87CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyS2V5cworeworICAgIHRBTklfVTggS2V5TGVuZ3RoWyBDU1JfTUFYX05VTV9LRVkgXTsgICAvL0Fsc28gdXNlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGtleSBpbmRleCBpcyBzZXQKKyAgICB0QU5JX1U4IEtleU1hdGVyaWFsWyBDU1JfTUFYX05VTV9LRVkgXVsgQ1NSX01BWF9LRVlfTEVOIF07CisgICAgdEFOSV9VOCBkZWZhdWx0SW5kZXg7Cit9dENzcktleXM7CisKKy8qIEZvbGxvd2luZyBhcmUgZmllbGRzIHdoaWNoIGFyZSBwYXJ0IG9mIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSBtaWdodCBuZWVkIAorICAgbW9kaWZpY2F0aW9uIGR5bmFtaWNhbGx5IG9uY2UgU1RBIGlzIHVwICYgcnVubmluZyBhbmQgdGhpcyBjb3VsZCB0cmlnZ2VyCisgICByZWFzc29jICovCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcworeworICAgLy8gZHVyaW5nIGNvbm5lY3QgdGhpcyBzcGVjaWZpZXMgQUNzIFUtQVBTRCBpcyB0byBiZSBzZXR1cCAKKyAgIC8vICAgZm9yIChCaXQwOlZPOyBCaXQxOlZJOyBCaXQyOkJLOyBCaXQzOkJFIGFsbCBvdGhlciBiaXRzIGFyZSBpZ25vcmVkKS4KKyAgIC8vICBEdXJpbmcgYXNzb2MgcmVzcG9uc2UgdGhpcyBDT1VMRCBjYXJyeSBjb25maXJtYXRpb24gb2Ygd2hhdCBBQ3MgVS1BUFNEIAorICAgLy8gZ290IHNldHVwIGZvci4gTGF0ZXIgaWYgYW4gQVBQIGxvb2tpbmcgZm9yIEFQU0QsIFNNRS1Rb1MgbWlnaHQgbmVlZCB0bworICAgLy8gbW9kaWZ5IHRoaXMgZmllbGQKKyAgIHRBTklfVTggICAgIHVhcHNkX21hc2s7CisgICAvLyBIREQgbWlnaHQgYXNrIHRvIG1vZGlmeSB0aGlzIGZpZWxkCisgICB0QU5JX1UxNiAgICBsaXN0ZW5faW50ZXJ2YWw7Cit9dENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JSb2FtUHJvZmlsZQoreworICAgIC8vRm9yIGVDU1JfQlNTX1RZUEVfV0RTX0FQLiBUaGVyZSBtdXN0IGJlIG9uZSBTU0lEIGluIFNTSURzLgorICAgIC8vRm9yIGVDU1JfQlNTX1RZUEVfV0RTX1NUQS4gVGhlcmUgbXVzdCBiZSB0d28gU1NJRHMuIEluZGV4IDAgaXMgdGhlIFNTSUQgb2YgdGhlIFdEUy1BUAorICAgIC8vdGhhdCB3ZSBuZWVkIHRvIGpvaW4uIEluZGV4IDEgaXMgdGhlIFNTSUQgZm9yIHNlbGYgQlNTLgorICAgIHRDc3JTU0lEcyBTU0lEczsKKyAgICB0Q3NyQlNTSURzIEJTU0lEczsKKyAgICB0QU5JX1UzMiBwaHlNb2RlOyAgIC8vdGhpcyBpcyBhIGJpdCBtYXNrIG9mIGFsbCB0aGUgbmVlZGVkIHBoeSBtb2RlIGRlZmluZWQgaW4gZUNzclBoeU1vZGUKKyAgICBlQ3NyUm9hbUJzc1R5cGUgQlNTVHlwZTsKKworICAgIHRDc3JBdXRoTGlzdCBBdXRoVHlwZTsKKyAgICBlQ3NyQXV0aFR5cGUgbmVnb3RpYXRlZEF1dGhUeXBlOworCisgICAgdENzckVuY3J5cHRpb25MaXN0IEVuY3J5cHRpb25UeXBlOworICAgIC8vVGhpcyBmaWVsZCBpcyBmb3Igb3V0cHV0IG9ubHksIG5vdCBmb3IgaW5wdXQKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgbmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGU7CisKKyAgICAvL2VDU1JfRU5DUllQVF9UWVBFX0FOWSBjYW5ub3QgYmUgc2V0IGluIG11bHRpY2FzdCBlbmNyeXB0aW9uIHR5cGUuIElmIGNhbGxlciBkb2Vzbid0IGNhc2UsIAorICAgIC8vcHV0IGFsbCBzdXBwb3J0ZWQgZW5jcnlwdGlvbiB0eXBlcyBpbiBoZXJlCisgICAgdENzckVuY3J5cHRpb25MaXN0IG1jRW5jcnlwdGlvblR5cGU7CisgICAgLy9UaGlzIGZpZWxkIGlzIGZvciBvdXRwdXQgb25seSwgbm90IGZvciBpbnB1dAorICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBuZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZTsgIAorCisgICAgdENzcktleXMgS2V5czsKKyAgICBlQ3NyQ0JDaG9pY2UgQ0JNb2RlOyAvL3VwLCBkb3duIG9yIGF1dG8KKyAgICB0Q3NyQ2hhbm5lbEluZm8gQ2hhbm5lbEluZm87CisgICAgdEFOSV9VOCBvcGVyYXRpb25DaGFubmVsOyAgIAorICAgIHRBTklfVTE2IGJlYWNvbkludGVydmFsOyAgICAvL0lmIHRoaXMgaXMgMCwgU01FIHdpbGwgZmlsbCBpbiBmb3IgY2FsbGVyLgorICAgIC8vIGR1cmluZyBjb25uZWN0IHRoaXMgc3BlY2lmaWVzIEFDcyBVLUFQU0QgaXMgdG8gYmUgc2V0dXAgCisgICAgLy8gICBmb3IgKEJpdDA6Vk87IEJpdDE6Vkk7IEJpdDI6Qks7IEJpdDM6QkUgYWxsIG90aGVyIGJpdHMgYXJlIGlnbm9yZWQpLgorICAgIC8vICBEdXJpbmcgYXNzb2MgcmVzcG9uc2UgdGhpcyBDT1VMRCBjYXJyeSBjb25maXJtYXRpb24gb2Ygd2hhdCBBQ3MgVS1BUFNEIGdvdCBzZXR1cCBmb3IKKyAgICB0QU5JX1U4IHVhcHNkX21hc2s7IAorICAgIHRBTklfVTMyIG5XUEFSZXFJRUxlbmd0aDsgICAvL1RoZSBieXRlIGNvdW50IGluIHRoZSBwV1BBUmVxSUUKKyAgICB0QU5JX1U4ICpwV1BBUmVxSUU7ICAgLy9JZiBub3QgbnVsbCwgaXQgaGFzIHRoZSBJRSBieXRlIHN0cmVhbSBmb3IgV1BBCisgICAgdEFOSV9VMzIgblJTTlJlcUlFTGVuZ3RoOyAgLy9UaGUgYnl0ZSBjb3VudCBpbiB0aGUgcFJTTlJlcUlFCisgICAgdEFOSV9VOCAqcFJTTlJlcUlFOyAgICAgLy9JZiBub3QgbnVsbCwgaXQgaGFzIHRoZSBJRSBieXRlIHN0cmVhbSBmb3IgUlNOCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICB0QU5JX1UzMiBuV0FQSVJlcUlFTGVuZ3RoOyAgIC8vVGhlIGJ5dGUgY291bnQgaW4gdGhlIHBXQVBJUmVxSUUKKyAgICB0QU5JX1U4ICpwV0FQSVJlcUlFOyAgIC8vSWYgbm90IG51bGwsIGl0IGhhcyB0aGUgSUUgYnl0ZSBzdHJlYW0gZm9yIFdBUEkKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisgICAgdEFOSV9VMzIgbkFkZElFU2Nhbkxlbmd0aDsgICAvL1RoZSBieXRlIGNvdW50IGluIHRoZSBwQWRkSUUgZm9yIHNjYW4gKGF0IHRoZSB0aW1lIG9mIGpvaW4pCisgICAgdEFOSV9VOCAqcEFkZElFU2NhbjsgICAgICAgLy9JZiBub3QgbnVsbCwgaXQgaGFzIHRoZSBJRSBieXRlIHN0cmVhbSBmb3IgYWRkaXRpb25hbCBJRSwgd2hpY2ggY2FuIGJlIFdTQyBJRSBhbmQvb3IgUDJQIElFCisgICAgdEFOSV9VMzIgbkFkZElFQXNzb2NMZW5ndGg7ICAgLy9UaGUgYnl0ZSBjb3VudCBpbiB0aGUgcEFkZElFIGZvciBhc3NvYyAKKyAgICB0QU5JX1U4ICpwQWRkSUVBc3NvYzsgICAgICAgLy9JZiBub3QgbnVsbCwgaXQgaGFzIHRoZSBJRSBieXRlIHN0cmVhbSBmb3IgYWRkaXRpb25hbCBJRSwgd2hpY2ggY2FuIGJlIFdTQyBJRSBhbmQvb3IgUDJQIElFCisKKyAgICB0QU5JX1U4IGNvdW50cnlDb2RlW1dOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTl07ICAvL2l0IGlzIGlnbm9yZWQgaWYgWzBdIGlzIDAuCisgICAgLypXUFMgQXNzb2NpYXRpb24gaWYgdHJ1ZSA9PiBhdXRoIGFuZCBlY3J5cHRpb24gc2hvdWxkIGJlIGlnbm9yZWQqLworICAgIHRBTklfQk9PTEVBTiBiV1BTQXNzb2NpYXRpb247CisgICAgdEFOSV9VMzIgbldTQ1JlcUlFTGVuZ3RoOyAgIC8vVGhlIGJ5dGUgY291bnQgaW4gdGhlIHBXU0NSZXFJRQorICAgIHRBTklfVTggKnBXU0NSZXFJRTsgICAvL0lmIG5vdCBudWxsLCBpdCBoYXMgdGhlIElFIGJ5dGUgc3RyZWFtIGZvciBXU0MKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB0QU5JX1U4IGllZWU4MDIxMWQ7CisgICAgdEFOSV9VOCBwcml2YWN5OworICAgIHRBTklfQk9PTEVBTiBmd2RXUFNQQkNQcm9iZVJlcTsKKyAgICB0QW5pQXV0aFR5cGUgY3NyODAyMTFBdXRoVHlwZTsKKyAgICB0QU5JX1UzMiBkdGltUGVyaW9kOworICAgIHRBTklfQk9PTEVBTiBBcFVhcHNkRW5hYmxlOworICAgIHRBTklfQk9PTEVBTiBwcm90RW5hYmxlZDsKKyAgICB0QU5JX0JPT0xFQU4gb2Jzc1Byb3RFbmFibGVkOworICAgIHRBTklfVTE2IGNmZ19wcm90ZWN0aW9uOworICAgIHRBTklfVTggd3BzX3N0YXRlOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIHRDc3JNb2JpbGl0eURvbWFpbkluZm8gTURJRDsKKyNlbmRpZgorICAgIHRWT1NfQ09OX01PREUgY3NyUGVyc29uYTsKKworfXRDc3JSb2FtUHJvZmlsZTsKKworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZQoreworICAgIHRTaXJNYWNTU2lkIFNTSUQ7CisgICAgdEFOSV9CT09MRUFOICAgIGhhbmRvZmZQZXJtaXR0ZWQ7CisgICAgdEFOSV9CT09MRUFOICAgIHNzaWRIaWRkZW47CisgICAgdENzckJzc2lkIGJzc2lkOworICAgIGVDc3JSb2FtQnNzVHlwZSBCU1NUeXBlOworICAgIGVDc3JBdXRoVHlwZSBBdXRoVHlwZTsKKyAgICB0Q3NyQXV0aExpc3QgQXV0aEluZm87CisgICAgZUNzckVuY3J5cHRpb25UeXBlIEVuY3J5cHRpb25UeXBlOworICAgIHRDc3JFbmNyeXB0aW9uTGlzdCBFbmNyeXB0aW9uSW5mbzsKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgbWNFbmNyeXB0aW9uVHlwZTsKKyAgICB0Q3NyRW5jcnlwdGlvbkxpc3QgbWNFbmNyeXB0aW9uSW5mbzsKKyAgICBlQ3NyQ0JDaG9pY2UgQ0JNb2RlOyAvL3VwLCBkb3duIG9yIGF1dG8KKyAgICB0QU5JX1U4IG9wZXJhdGlvbkNoYW5uZWw7CisgICAgdENzcktleXMgS2V5czsKKyAgICAvLyBtZWFuaW5nbGVzcyBvbiBjb25uZWN0LiBJdCdzIGFuIE9VVCBwYXJhbSBmcm9tIENTUidzIHBvaW50IG9mIHZpZXcKKyAgICAvLyBEdXJpbmcgYXNzb2MgcmVzcG9uc2UgY2FycmllcyB0aGUgQUNNIGJpdC1tYXNrIGkuZS4gd2hhdAorICAgIC8vIEFDcyBoYXZlIEFDTT0xIChpZiBhbnkpLCAKKyAgICAvLyAoQml0MDpWTzsgQml0MTpWSTsgQml0MjpCSzsgQml0MzpCRSBhbGwgb3RoZXIgYml0cyBhcmUgaWdub3JlZCkKKyAgICB0QU5JX1U4ICBhY21fbWFzazsKKyAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgbW9kaWZ5UHJvZmlsZUZpZWxkczsKKyAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjOyAgIAorICAgIHRBTklfQk9PTEVBTiAgIHFhcDsgLy9BUCBzdXBwb3J0cyBRb1MKKyAgICB0QU5JX0JPT0xFQU4gICBxb3NDb25uZWN0aW9uOyAvL0EgY29ubmVjdGlvbiBpcyBRb1MgZW5hYmxlZAorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgdENzck1vYmlsaXR5RG9tYWluSW5mbyBNRElEOworI2VuZGlmCisgICAgCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIHRDc3JDY3hDY2ttSW5mbyBjY3hDY2ttSW5mbzsKKyAgICB0QU5JX0JPT0xFQU4gICAgaXNDQ1hBc3NvYzsgCisjZW5kaWYKK310Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGU7CisKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCit0eXBlZGVmIHN0cnVjdCB0YWdDc3IxMXJDb25maWdQYXJhbXMKK3sKKyAgICB0QU5JX0JPT0xFQU4gICBJc0ZUUmVzb3VyY2VSZXFTdXBwb3J0ZWQ7Cit9IHRDc3IxMXJDb25maWdQYXJhbXM7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JOZWlnaGJvclJvYW1Db25maWdQYXJhbXMKK3sKKworICAgIHRBTklfVTMyICAgICAgIG5OZWlnaGJvclNjYW5UaW1lclBlcmlvZDsKKyAgICB0QU5JX1U4ICAgICAgICBuTmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkOworICAgIHRBTklfVTggICAgICAgIG5OZWlnaGJvclJlYXNzb2NSc3NpVGhyZXNob2xkOworICAgIHRBTklfVTE2ICAgICAgIG5OZWlnaGJvclNjYW5NaW5DaGFuVGltZTsKKyAgICB0QU5JX1UxNiAgICAgICBuTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWU7CisgICAgc0NzckNoYW5uZWwgICAgbmVpZ2hib3JTY2FuQ2hhbkxpc3Q7CisgICAgdEFOSV9VOCAgICAgICAgbk1heE5laWdoYm9yUmV0cmllczsKKyAgICB0QU5JX1UxNiAgICAgICBuTmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZDsKK310Q3NyTmVpZ2hib3JSb2FtQ29uZmlnUGFyYW1zOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzckNvbmZpZ1BhcmFtCit7CisgICAgdEFOSV9VMzIgRnJhZ21lbnRhdGlvblRocmVzaG9sZDsKKyAgICB0QU5JX1UzMiBjaGFubmVsQm9uZGluZ01vZGUyNEdIejsKKyAgICB0QU5JX1UzMiBjaGFubmVsQm9uZGluZ01vZGU1R0h6OworICAgIGVDc3JQaHlNb2RlIHBoeU1vZGU7CisgICAgZUNzckJhbmQgZUJhbmQ7CisgICAgdEFOSV9VMzIgUlRTVGhyZXNob2xkOworICAgIHRBTklfVTMyIEhlYXJ0YmVhdFRocmVzaDUwOworICAgIHRBTklfVTMyIEhlYXJ0YmVhdFRocmVzaDI0OworICAgIGVDc3JDQkNob2ljZSBjYkNob2ljZTsKKyAgICBlQ3NyQmFuZCBiYW5kQ2FwYWJpbGl0eTsgICAgIC8vaW5kaWNhdGUgaHcgY2FwYWJpbGl0eQorICAgIHRBTklfVTMyIGJnU2NhbkludGVydmFsOworICAgIHRBTklfVTE2IFR4UmF0ZTsKKyAgICBlQ3NyUm9hbVdtbVVzZXJNb2RlVHlwZSBXTU1TdXBwb3J0TW9kZTsKKyAgICB0QU5JX0JPT0xFQU4gSXMxMWVTdXBwb3J0RW5hYmxlZDsKKyAgICB0QU5JX0JPT0xFQU4gSXMxMWRTdXBwb3J0RW5hYmxlZDsKKyAgICB0QU5JX0JPT0xFQU4gSXMxMWRTdXBwb3J0RW5hYmxlZE9yaWdpbmFsOworICAgIHRBTklfQk9PTEVBTiBJczExaFN1cHBvcnRFbmFibGVkOworICAgIHRBTklfQk9PTEVBTiBzaG9ydFNsb3RUaW1lOworICAgIHRBTklfQk9PTEVBTiBQcm9wcmlldGFyeVJhdGVzRW5hYmxlZDsKKyAgICB0QU5JX1U4IEFkSG9jQ2hhbm5lbDI0OworICAgIHRBTklfVTggQWRIb2NDaGFubmVsNUc7CisgICAgdEFOSV9VMzIgaW1wc1NsZWVwVGltZTsgICAgIC8vaW4gdW5pdHMgb2Ygc2Vjb25kcworICAgIHRBTklfVTMyIG5TY2FuUmVzdWx0QWdlQ291bnQ7ICAgLy90aGlzIG51bWJlciBtaW51cyBvbmUgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBhIHNjYW4gZG9lc24ndCBmaW5kIGl0IGJlZm9yZSBpdCBpcyByZW1vdmVkCisgICAgdEFOSV9VMzIgc2NhbkFnZVRpbWVOQ05QUzsgIC8vc2NhbiByZXN1bHQgYWdpbmcgdGltZSB0aHJlc2hvbGQgd2hlbiBOb3QtQ29ubmVjdC1Oby1Qb3dlci1TYXZlLCBpbiBzZWNvbmRzCisgICAgdEFOSV9VMzIgc2NhbkFnZVRpbWVOQ1BTOyAgIC8vc2NhbiByZXN1bHQgYWdpbmcgdGltZSB0aHJlc2hvbGQgd2hlbiBOb3QtQ29ubmVjdC1Qb3dlci1TYXZlLCBpbiBzZWNvbmRzCisgICAgdEFOSV9VMzIgc2NhbkFnZVRpbWVDTlBTOyAgIC8vc2NhbiByZXN1bHQgYWdpbmcgdGltZSB0aHJlc2hvbGQgd2hlbiBDb25uZWN0LU5vLVBvd2VyLVNhdmUsIGluIHNlY29uZHMsCisgICAgdEFOSV9VMzIgc2NhbkFnZVRpbWVDUFM7ICAgLy9zY2FuIHJlc3VsdCBhZ2luZyB0aW1lIHRocmVzaG9sZCB3aGVuIENvbm5lY3QtUG93ZXItU2F2ZWluIHNlY29uZHMKKyAgICB0QU5JX1UzMiBuUm9hbWluZ1RpbWU7ICAvL0luIHNlY29uZHMsIENTUiB3aWxsIHRyeSB0aGlzIGxvbmcgYmVmb3JlIGdpdmVzIHVwLiAwIG1lYW5zIG5vIHJvYW1pbmcKKyAgICB0QU5JX1U4IGJDYXRSc3NpT2Zmc2V0OyAgICAgLy90byBzZXQgdGhlIFJTU0kgZGlmZmVyZW5jZSBmb3IgZWFjaCBjYXRlZ29yeQorICAgIHRBTklfVTggZkVuYWJsZU1DQ01vZGU7IC8vdG8gc2V0IE1DQyBFbmFibGUvRGlzYWJsZSBtb2RlCisKKyAgICB0Q3NyMTFkaW5mbyAgQ3NyMTFkaW5mbzsKKyAgICAvL1doZXRoZXIgdG8gbGltaXQgdGhlIGNoYW5uZWxzIHRvIHRoZSBvbmVzIHNldCBpbiBDc3IxMWRJbmZvLiBJZiB0cnVlLCB0aGUgb3BlcnRhaW9uYWwKKyAgICAvL2NoYW5uZWxzIGFyZSBsaW1pdGVkIHRvIHRoZSBkZWZhdWx0IGNoYW5uZWwgbGlzdC4gSXQgaXMgYW4gIkFORCIgb3BlcmF0aW9uIGJldHdlZW4gdGhlIAorICAgIC8vZGVmYXVsdCBjaGFubmVscyBhbmQgdGhlIGNoYW5uZWxzIGluIHRoZSA4MDIuMTFkIElFLgorICAgIHRBTklfQk9PTEVBTiBmRW5mb3JjZTExZENoYW5uZWxzOyAgCisgICAgLy9Db3VudHJ5IENvZGUgUHJpb3JpdHkKKyAgICAvLzAgPSA4MDIuMTFEID4gQ291bnRyeSBJT0NUTCA+IE5WIAorICAgIC8vMSA9IENvdW50cnkgSU9DVEwgPiA4MDIuMTFEID4gTlYKKyAgICB0QU5JX0JPT0xFQU4gZlN1cHBsaWNhbnRDb3VudHJ5Q29kZUhhc1ByaW9yaXR5OworICAgIC8vV2hlbiB0cnVlLCBBUCB3aXRoIHVua25vd24gY291bnRyeSBjb2RlIHdvbid0IGJlIHNlZS4gCisgICAgLy8iVW5rbm93biBjb3VudHJ5IGNvZGUiIG1lYW5zIGVpdGhlciBBcCBkb2Vzbid0IGhhdmUgMTFkIElFIG9yIHdlIGNhbm5vdCAKKyAgICAvL2ZpbmQgYSBkb21haW4gZm9yIHRoZSBjb3VudHJ5IGNvZGUgaW4gaXRzIDExZCBJRS4gCisgICAgdEFOSV9CT09MRUFOIGZFbmZvcmNlQ291bnRyeUNvZGVNYXRjaDsgIAorICAgIC8vV2hlbiB0cnVlLCBvbmx5IEFQcyBpbiB0aGUgZGVmYXVsdCBkb21haW4gY2FuIGJlIHNlZW4uIElmIHRoZSBBcCBoYXMgInVua25vd24gY291bnRyeQorICAgIC8vY29kZSIsIG9yIHRoZSBkb21haW4gb2YgdGhlIGNvdW50cnkgY29kZSBkb2Vzbid0IG1hdGNoIHRoZSBkZWZhdWx0IGRvbWFpbiwgdGhlIEFwIGlzCisgICAgLy9ub3QgYWNjZXB0YWJsZS4KKyAgICB0QU5JX0JPT0xFQU4gZkVuZm9yY2VEZWZhdWx0RG9tYWluOyAgICAgCisKKyAgICB0QU5JX1UxNiB2Y2NSc3NpVGhyZXNob2xkOworICAgIHRBTklfVTMyIHZjY1VsTWFjTG9zc1RocmVzaG9sZDsKKworICAgIHRBTklfVTMyICBuUGFzc2l2ZU1pbkNoblRpbWU7ICAgIC8vaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzCisgICAgdEFOSV9VMzIgIG5QYXNzaXZlTWF4Q2huVGltZTsgICAgLy9pbiB1bml0cyBvZiBtaWxsaXNlY29uZHMKKyAgICB0QU5JX1UzMiAgbkFjdGl2ZU1pbkNoblRpbWU7ICAgICAvL2luIHVuaXRzIG9mIG1pbGxpc2Vjb25kcworICAgIHRBTklfVTMyICBuQWN0aXZlTWF4Q2huVGltZTsgICAgIC8vaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzCisKKyAgICB0QU5JX0JPT0xFQU4gSXNJZGxlU2NhbkVuYWJsZWQ7CisgICAgLy9pbiBkQm0sIHRoZSBtYXhpbXVtIFRYIHBvd2VyCisgICAgLy9UaGUgYWN0dWFsIFRYIHBvd2VyIGlzIHRoZSBsZXNzZXIgb2YgdGhpcyB2YWx1ZSBhbmQgMTFkLiAKKyAgICAvL0lmIDExZCBpcyBkaXNhYmxlLCB0aGUgbGVzc2VyIG9mIHRoaXMgYW5kIGRlZmF1bHQgc2V0dGluZy4KKyAgICB0QU5JX1U4IG5UeFBvd2VyQ2FwOyAgICAgCisgICAgdEFOSV9VMzIgIHN0YXRzUmVxUGVyaW9kaWNpdHk7ICAvL3N0YXRzIHJlcXVlc3QgZnJlcXVlbmN5IGZyb20gUEUgd2hpbGUgaW4gZnVsbCBwb3dlcgorICAgIHRBTklfVTMyICBzdGF0c1JlcVBlcmlvZGljaXR5SW5QUzsvL3N0YXRzIHJlcXVlc3QgZnJlcXVlbmN5IGZyb20gUEUgd2hpbGUgaW4gcG93ZXIgc2F2ZQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgdENzcjExckNvbmZpZ1BhcmFtcyAgY3NyMTFyQ29uZmlnOworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIHRBTklfVTggICBpc0NjeEluaUZlYXR1cmVFbmFibGVkOworI2VuZGlmCisKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9DQ1gpCisgICAgdEFOSV9VOCAgIGlzRmFzdFRyYW5zaXRpb25FbmFibGVkOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworICAgIHRDc3JOZWlnaGJvclJvYW1Db25maWdQYXJhbXMgICAgbmVpZ2hib3JSb2FtQ29uZmlnOworI2VuZGlmCisKKyAgICAvKiBJbnN0ZWFkIG9mIFJlYXNzb2MsIHNlbmQgQUREVFMvREVMVFMgZXZlbiB3aGVuIEFDTSBpcyBvZmYgZm9yIHRoYXQgQUMgCisgICAgICogVGhpcyBpcyBtYW5kYXRlZCBieSBXTU0tQUMgY2VydGlmaWNhdGlvbiAqLworICAgIHRBTklfQk9PTEVBTiBhZGRUU1doZW5BQ01Jc09mZjsKKworICAgIAorICAgIC8qY2hhbm5lbFBvd2VySW5mb0xpc3QyNCBoYXMgYmVlbiBzZWVuIGNvcnJ1cHRlZC4gU2V0IHRoaXMgZmxhZyB0byB0cnVlIHRyeWluZyB0byAKKyAgICAqIGRldGVjdCB3aGVuIGl0IGhhcHBlbnMuIEFkZGluZyB0aGlzIGludG8gY29kZSBiZWNhdXNlIHdlIGNhbid0IHJlcHJvZHVjZSBpdCBlYXNpbHkuCisgICAgKiBXZSBkb24ndCBrbm93IHdoZW4gaXQgaGFwcGVucy4gKi8KKyAgICB0QU5JX0JPT0xFQU4gZlZhbGlkYXRlTGlzdDsKKworICAgIC8qQ3VzdG9tZXIgd2FudHMgdG8gc3RhcnQgd2l0aCBhbiBhY3RpdmUgc2NhbiBiYXNlZCBvbiB0aGUgZGVmYXVsdCBjb3VudHJ5IGNvZGUuCisgICAgKiBUaGlzIG9wdGltaXphdGlvbiB3aWxsIG1pbmltaXplIHRoZSBkcml2ZXIgbG9hZCB0byBhc3NvY2lhdGlvbiB0aW1lLgorICAgICogQmFzZWQgb24gdGhpcyBmbGFnIHdlIHdpbGwgYnlwYXNzIHRoZSBpbml0aWFsIHBhc3NpdmUgc2NhbiBuZWVkZWQgZm9yIDExZAorICAgICogdG8gZGV0ZXJtaW5lIHRoZSBjb3VudHJ5IGNvZGUgJiBkb21haW4gKi8KKyAgICB0QU5JX0JPT0xFQU4gZkVuYWJsZUJ5cGFzczExZDsKKworICAgIC8qQ3VzdG9tZXIgd2FudHMgdG8gb3B0aW1pemUgdGhlIHNjYW4gdGltZS4gQXZvaWRpbmcgc2NhbnMocGFzc2l2ZSkgb24gREZTIAorICAgICogY2hhbm5lbHMgd2hpbGUgc3dpcHBpbmcgdGhyb3VnaCBib3RoIGJhbmRzIGNhbiBzYXZlIHNvbWUgdGltZSAKKyAgICAqIChhcHByeCAxLjMgc2VjKSAqLworICAgIHRBTklfQk9PTEVBTiBmRW5hYmxlREZTQ2hubFNjYW47CisKKyAgICAvL1RvIGVuYWJsZS9kaXNhYmxlIHNjYW5uaW5nIDIuNEdoeiBjaGFubmVscyB0d2ljZSBvbiBhIHNpbmdsZSBzY2FuIHJlcXVlc3QgZnJvbSBIREQKKyAgICB0QU5JX0JPT0xFQU4gZlNjYW5Ud2ljZTsKKworfXRDc3JDb25maWdQYXJhbTsgICAKKworLy9UdXNoCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JVcGRhdGVDb25maWdQYXJhbQoreworICAgdENzcjExZGluZm8gIENzcjExZGluZm87Cit9dENzclVwZGF0ZUNvbmZpZ1BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JSb2FtSW5mbworeworICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGU7ICAvL21heSBiZSBOVUxMCisgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYzsgIC8vTWF5IGJlIE5VTEwKKyAgICB0QU5JX1UzMiBuQmVhY29uTGVuZ3RoOyAvL3RoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgYmVhY29uIGZyYW1lLCBjYW4gYmUgMAorICAgIHRBTklfVTMyIG5Bc3NvY1JlcUxlbmd0aDsgICAvL3RoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgYXNzb2MgcmVxIGZyYW1lLCBjYW4gYmUgMAorICAgIHRBTklfVTMyIG5Bc3NvY1JzcExlbmd0aDsgICAvL1RoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgYXNzb2MgcnNwIGZyYW1lLCBjYW4gYmUgMAorICAgIHRBTklfVTMyIG5GcmFtZUxlbmd0aDsKKyAgICB0QU5JX1U4ICBmcmFtZVR5cGU7CisgICAgdEFOSV9VOCAqcGJGcmFtZXM7ICAvL1BvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW4gdGhlIGJlYWNvbiwgYXNzb2MgcmVxLCBhc3NvYyByc3AgZnJhbWUsIGluIHRoYXQgb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNlciBuZWVkcyB0byB1c2UgbkJlYWNvbkxlbmd0aCwgbkFzc29jUmVxTGVuZ3RoLCBuQXNzb2NSc3BMZW5ndGggdG8gZGVzaWNlIHdoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAvL2VhY2ggZnJhbWUgc3RhcnRzIGFuZCBlbmRzLgorICAgIHRBTklfQk9PTEVBTiBmUmVhc3NvY1JlcTsgICAvL3NldCB0byB0cnVlIGlmIGZvciByZS1hc3NvY2lhdGlvbgorICAgIHRBTklfQk9PTEVBTiBmUmVhc3NvY1JzcDsgICAvL3NldCB0byB0cnVlIGlmIGZvciByZS1hc3NvY2lhdGlvbgorICAgIHRDc3JCc3NpZCBic3NpZDsKKyAgICAvL09ubHkgdmFsaWQgaW4gSUJTUyAKKyAgICAvL3RoaXMgaXMgdGhlIHBlZXJzIE1BQyBhZGRyZXNzIGZvciBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfTkVXX1BFRVIgb3IgUEVFUl9ERVBBUlRFRAorICAgIHRDc3JCc3NpZCBwZWVyTWFjOyAgCisgICAgdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisgICAgdEFOSV9VMzIgcmVhc29uQ29kZTsgICAgLy90aGlzIGNvdWxkIGJlIG91ciBvd24gZGVmaW5lZCBvciBzZW50IGZyb20gdGhlIG90aGVyIEJTUyhwZXIgODAyLjExIHNwZWMpCisgICAgdEFOSV9VOCAgc3RhSWQ7ICAgICAgICAgLy8gUGVlciBzdGF0aW9uSWQgd2hlbiBjb25uZWN0ZWQKKyAgICAvKlRoZSBEUFUgc2lnbmF0dXJlcyB3aWxsIGJlIHNlbnQgZXZlbnR1YWxseSB0byBUTCB0byBoZWxwIGl0IGRldGVybWluZSB0aGUgCisgICAgICBhc3NvY2lhdGlvbiB0byB3aGljaCBhIHBhY2tldCBiZWxvbmdzIHRvKi8KKyAgICAvKlVuaWNhc3QgRFBVIHNpZ25hdHVyZSovCisgICAgdEFOSV9VOCAgICAgICAgICAgIHVjYXN0U2lnOworCisgICAgLypCcm9hZGNhc3QgRFBVIHNpZ25hdHVyZSovCisgICAgdEFOSV9VOCAgICAgICAgICAgIGJjYXN0U2lnOworCisgICAgdEFOSV9CT09MRUFOIGZBdXRoUmVxdWlyZWQ7ICAgLy9GQUxTRSBtZWFucyBhdXRoIG5lZWRlZCBmcm9tIHN1cHBsaWNhbnQuIFRSVUUgbWVhbnMgYXV0aGVudGljYXRlZChzdGF0aWMgV0VQLCBvcGVuKQorICAgIHRBTklfVTggc2Vzc2lvbklkOworICAgIHRBTklfVTggcnNuSUVMZW47CisgICAgdEFOSV9VOCAqcHJzbklFOworCisgICAgdEFOSV9VOCBhZGRJRUxlbjsKKyAgICB0QU5JX1U4ICpwYWRkSUU7CisgICAgCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHRTaXJNaWNGYWlsdXJlSW5mbyAqcE1JQ0ZhaWx1cmVJbmZvOworICAgICAgICB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBDb25uZWN0ZWRQcm9maWxlOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgdFNpcldQU1BCQ1Byb2JlUmVxICpwV1BTUEJDUHJvYmVSZXE7CisjZW5kaWYKKyAgICB9IHU7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgdEFOSV9CT09MRUFOIHdtbUVuYWJsZWRTdGE7ICAgLy9zZXQgdG8gdHJ1ZSBpZiBXTU0gZW5hYmxlZCBTVEEKKyAgICB0QU5JX1UzMiBkdGltUGVyaW9kOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgdEFOSV9CT09MRUFOIGlzQ0NYQXNzb2M7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgdm9pZCogcFJlbWFpbkN0eDsgCisgICAgdEFOSV9VMzIgcnhDaGFuOworI2VuZGlmCisKKyAgICAvLyBSZXF1aXJlZCBmb3IgaW5kaWNhdGluZyB0aGUgZnJhbWVzIHRvIHVwcGVyIGxheWVyCisgICAgdEFOSV9VMzIgYmVhY29uTGVuZ3RoOworICAgIHRBTklfVTgqIGJlYWNvblB0cjsKKyAgICB0QU5JX1UzMiBhc3NvY1JlcUxlbmd0aDsKKyAgICB0QU5JX1U4KiBhc3NvY1JlcVB0cjsgICAgCit9dENzclJvYW1JbmZvOworCisKKworCisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzckZyZXFTY2FuSW5mbworeworICAgIHRBTklfVTMyIG5TdGFydEZyZXE7ICAgIC8vaW4gdW5pdCBvZiBNSHoKKyAgICB0QU5JX1UzMiBuRW5kRnJlcTsgICAgICAvL2luIHVuaXQgb2YgTUh6CisgICAgdFNpclNjYW5UeXBlIHNjYW5UeXBlOworfXRDc3JGcmVxU2NhbkluZm87CisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3R5cGVkZWYgc3RydWN0IHNTaXJTbWVBc3NvY0luZFRvVXBwZXJMYXllckNuZgoreworICAgIHRBTklfVTE2ICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOyAvLyBlV05JX1NNRV9BU1NPQ19DTkYKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICBsZW5ndGg7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHRTaXJSZXN1bHRDb2RlcyAgICAgIHN0YXR1c0NvZGU7CisgICAgdFNpck1hY0FkZHIgICAgICAgICAgYnNzSWQ7ICAgICAgLy8gU2VsZiBCU1NJRAorICAgIHRTaXJNYWNBZGRyICAgICAgICAgIHBlZXJNYWNBZGRyOworICAgIHRBTklfVTE2ICAgICAgICAgICAgIGFpZDsKKyAgICB0U2lyTWFjQWRkciAgICAgICAgICBhbHRlcm5hdGVCc3NJZDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICBhbHRlcm5hdGVDaGFubmVsSWQ7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgd21tRW5hYmxlZFN0YTsgICAvL3NldCB0byB0cnVlIGlmIFdNTSBlbmFibGVkIFNUQQorICAgIHRTaXJSU05pZSAgICAgICAgICAgIHJzbklFOyAgICAgICAgICAgLy8gUlNOIElFIHJlY2VpdmVkIGZyb20gcGVlcgorICAgIHRTaXJBZGRpZSAgICAgICAgICAgIGFkZElFOyAgICAgICAgICAgLy8gQWRkaXRpb25hbCBJRSByZWNlaXZlZCBmcm9tIHBlZXIsIHdoaWNoIGNhbiBiZSBXU0MgYW5kL29yIFAyUCBJRQorICAgIHRBTklfVTggICAgICAgICAgICAgIHJlYXNzb2NSZXE7ICAgICAgLy9zZXQgdG8gdHJ1ZSBpZiByZWFzc29jCit9IHRTaXJTbWVBc3NvY0luZFRvVXBwZXJMYXllckNuZiwgKnRwU2lyU21lQXNzb2NJbmRUb1VwcGVyTGF5ZXJDbmY7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU3VtbWFyeVN0YXRzSW5mbworeworICAgdEFOSV9VMzIgcmV0cnlfY250WzRdOworICAgdEFOSV9VMzIgbXVsdGlwbGVfcmV0cnlfY250WzRdOworICAgdEFOSV9VMzIgdHhfZnJtX2NudFs0XTsKKyAgIC8vdEFOSV9VMzIgbnVtX3J4X2ZybV9jcmNfZXJyOyBzYW1lIGFzIHJ4X2Vycm9yX2NudAorICAgLy90QU5JX1UzMiBudW1fcnhfZnJtX2NyY19vazsgc2FtZSBhcyByeF9mcm1fY250CisgICB0QU5JX1UzMiByeF9mcm1fY250OworICAgdEFOSV9VMzIgZnJtX2R1cF9jbnQ7CisgICB0QU5JX1UzMiBmYWlsX2NudFs0XTsKKyAgIHRBTklfVTMyIHJ0c19mYWlsX2NudDsKKyAgIHRBTklfVTMyIGFja19mYWlsX2NudDsKKyAgIHRBTklfVTMyIHJ0c19zdWNjX2NudDsKKyAgIHRBTklfVTMyIHJ4X2Rpc2NhcmRfY250OworICAgdEFOSV9VMzIgcnhfZXJyb3JfY250OworICAgdEFOSV9VMzIgdHhfYnl0ZV9jbnQ7CisKK310Q3NyU3VtbWFyeVN0YXRzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyR2xvYmFsQ2xhc3NBU3RhdHNJbmZvCit7CisgICB0QU5JX1UzMiByeF9mcmFnX2NudDsKKyAgIHRBTklfVTMyIHByb21pc2N1b3VzX3J4X2ZyYWdfY250OworICAgLy90QU5JX1UzMiByeF9mY3NfZXJyOworICAgdEFOSV9VMzIgcnhfaW5wdXRfc2Vuc2l0aXZpdHk7CisgICB0QU5JX1UzMiBtYXhfcHdyOworICAgLy90QU5JX1UzMiBkZWZhdWx0X3B3cjsKKyAgIHRBTklfVTMyIHN5bmNfZmFpbF9jbnQ7CisgICB0QU5JX1UzMiB0eF9yYXRlOworICAgLy9tY3MgaW5kZXggZm9yIEhUMjAgYW5kIEhUNDAgcmF0ZXMKKyAgIHRBTklfVTMyICBtY3NfaW5kZXg7CisgICAvL3RvIGRlZmZlcmVudGlhdGUgYmV0d2VlbiBIVDIwIGFuZCBIVDQwIHJhdGVzO3Nob3J0IGFuZCBsb25nIGd1YXJkIGludGVydmFsCisgICB0QU5JX1UzMiAgdHhfcmF0ZV9mbGFnczsKKworfXRDc3JHbG9iYWxDbGFzc0FTdGF0c0luZm87CisKK3R5cGVkZWYgc3RydWN0IHRhZ0Nzckdsb2JhbENsYXNzQlN0YXRzSW5mbworeworICAgdEFOSV9VMzIgdWNfcnhfd2VwX3VuZW5jcnlwdGVkX2ZybV9jbnQ7CisgICB0QU5JX1UzMiB1Y19yeF9taWNfZmFpbF9jbnQ7CisgICB0QU5JX1UzMiB1Y190a2lwX2ljdl9lcnI7CisgICB0QU5JX1UzMiB1Y19hZXNfY2NtcF9mb3JtYXRfZXJyOworICAgdEFOSV9VMzIgdWNfYWVzX2NjbXBfcmVwbGF5X2NudDsKKyAgIHRBTklfVTMyIHVjX2Flc19jY21wX2RlY3JwdF9lcnI7CisgICB0QU5JX1UzMiB1Y193ZXBfdW5kZWNyeXB0YWJsZV9jbnQ7CisgICB0QU5JX1UzMiB1Y193ZXBfaWN2X2VycjsKKyAgIHRBTklfVTMyIHVjX3J4X2RlY3J5cHRfc3VjY19jbnQ7CisgICB0QU5JX1UzMiB1Y19yeF9kZWNyeXB0X2ZhaWxfY250OworICAgdEFOSV9VMzIgbWNiY19yeF93ZXBfdW5lbmNyeXB0ZWRfZnJtX2NudDsKKyAgIHRBTklfVTMyIG1jYmNfcnhfbWljX2ZhaWxfY250OworICAgdEFOSV9VMzIgbWNiY190a2lwX2ljdl9lcnI7CisgICB0QU5JX1UzMiBtY2JjX2Flc19jY21wX2Zvcm1hdF9lcnI7CisgICB0QU5JX1UzMiBtY2JjX2Flc19jY21wX3JlcGxheV9jbnQ7CisgICB0QU5JX1UzMiBtY2JjX2Flc19jY21wX2RlY3JwdF9lcnI7CisgICB0QU5JX1UzMiBtY2JjX3dlcF91bmRlY3J5cHRhYmxlX2NudDsKKyAgIHRBTklfVTMyIG1jYmNfd2VwX2ljdl9lcnI7CisgICB0QU5JX1UzMiBtY2JjX3J4X2RlY3J5cHRfc3VjY19jbnQ7CisgICB0QU5JX1UzMiBtY2JjX3J4X2RlY3J5cHRfZmFpbF9jbnQ7CisKK310Q3NyR2xvYmFsQ2xhc3NCU3RhdHNJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JHbG9iYWxDbGFzc0NTdGF0c0luZm8KK3sKKyAgIHRBTklfVTMyIHJ4X2Ftc2R1X2NudDsKKyAgIHRBTklfVTMyIHJ4X2FtcGR1X2NudDsKKyAgIHRBTklfVTMyIHR4XzIwX2ZybV9jbnQ7CisgICB0QU5JX1UzMiByeF8yMF9mcm1fY250OworICAgdEFOSV9VMzIgcnhfbXBkdV9pbl9hbXBkdV9jbnQ7CisgICB0QU5JX1UzMiBhbXBkdV9kZWxpbWl0ZXJfY3JjX2VycjsKKworfXRDc3JHbG9iYWxDbGFzc0NTdGF0c0luZm87CisKK3R5cGVkZWYgc3RydWN0IHRhZ0Nzckdsb2JhbENsYXNzRFN0YXRzSW5mbworeworICAgdEFOSV9VMzIgdHhfdWNfZnJtX2NudDsKKyAgIHRBTklfVTMyIHR4X21jX2ZybV9jbnQ7CisgICB0QU5JX1UzMiB0eF9iY19mcm1fY250OworICAgdEFOSV9VMzIgcnhfdWNfZnJtX2NudDsKKyAgIHRBTklfVTMyIHJ4X21jX2ZybV9jbnQ7CisgICB0QU5JX1UzMiByeF9iY19mcm1fY250OworICAgdEFOSV9VMzIgdHhfdWNfYnl0ZV9jbnRbNF07CisgICB0QU5JX1UzMiB0eF9tY19ieXRlX2NudDsKKyAgIHRBTklfVTMyIHR4X2JjX2J5dGVfY250OworICAgdEFOSV9VMzIgcnhfdWNfYnl0ZV9jbnRbNF07CisgICB0QU5JX1UzMiByeF9tY19ieXRlX2NudDsKKyAgIHRBTklfVTMyIHJ4X2JjX2J5dGVfY250OworICAgdEFOSV9VMzIgcnhfYnl0ZV9jbnQ7CisgICB0QU5JX1UzMiBudW1fcnhfYnl0ZXNfY3JjX29rOworICAgdEFOSV9VMzIgcnhfcmF0ZTsKKworfXRDc3JHbG9iYWxDbGFzc0RTdGF0c0luZm87CisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzclBlclN0YVN0YXRzSW5mbworeworICAgdEFOSV9VMzIgdHhfZnJhZ19jbnRbNF07CisgICB0QU5JX1UzMiB0eF9hbXBkdV9jbnQ7CisgICB0QU5JX1UzMiB0eF9tcGR1X2luX2FtcGR1X2NudDsKK30gdENzclBlclN0YVN0YXRzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUm9hbVNldEtleQoreworICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBlbmNUeXBlOworICAgIHRBbmlLZXlEaXJlY3Rpb24ga2V5RGlyZWN0aW9uOyAgICAvL1R4LCBSeCBvciBUeC1hbmQtUngKKyAgICB0Q3NyQnNzaWQgcGVlck1hYzsgICAvL1BlZXJzIE1BQyBhZGRyZXNzLiBBTEwgMSdzIGZvciBncm91cCBrZXkKKyAgICB0QU5JX1U4IHBhZVJvbGU7ICAgICAgLy8wIGZvciBzdXBwbGljYW50CisgICAgdEFOSV9VOCBrZXlJZDsgIC8vIEt5ZSBpbmRleAorICAgIHRBTklfVTE2IGtleUxlbmd0aDsgIC8vTnVtYmVyIG9mIGJ5dGVzIGNvbnRhaW5pbmcgdGhlIGtleSBpbiBwS2V5CisgICAgdEFOSV9VOCBLZXlbQ1NSX01BWF9LRVlfTEVOXTsKKyAgICB0QU5JX1U4IGtleVJzY1tDU1JfTUFYX1JTQ19MRU5dOworfSB0Q3NyUm9hbVNldEtleTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUm9hbVJlbW92ZUtleQoreworICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBlbmNUeXBlOworICAgIHRDc3JCc3NpZCBwZWVyTWFjOyAgIC8vUGVlcnMgTUFDIGFkZHJlc3MuIEFMTCAxJ3MgZm9yIGdyb3VwIGtleQorICAgIHRBTklfVTgga2V5SWQ7ICAvL2tleSBpbmRleAorfSB0Q3NyUm9hbVJlbW92ZUtleTsKKworCit0eXBlZGVmIHZvaWQgKiB0U2NhblJlc3VsdEhhbmRsZTsKKworI2RlZmluZSBDU1JfSU5WQUxJRF9TQ0FOUkVTVUxUX0hBTkRMRSAgICAgICAoTlVMTCkKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vQ29tbW9uIFNDQU4gc3RhcnRzCisKKy8vdm9pZCAqcDIgLS0gdGhlIHNlY29uZCBjb250ZXh0IHBhc3MgaW4gZm9yIHRoZSBjYWxsZXIKKy8vKioqd2hhdCBpZiBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIHJlcXVlc3RlciBnZXRzIHRoZSBzY2FuSWQ/PwordHlwZWRlZiBlSGFsU3RhdHVzICgqY3NyU2NhbkNvbXBsZXRlQ2FsbGJhY2spKHRIYWxIYW5kbGUsIHZvaWQgKnAyLCB0QU5JX1UzMiBzY2FuSUQsIGVDc3JTY2FuU3RhdHVzIHN0YXR1cyk7ICAgCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vQ29tbW9uIFJvYW0gc3RhcnRzCisKKy8vcENvbnRleHQgaXMgdGhlIHBDb250ZXh0IHBhc3NlZCBpbiB3aXRoIHRoZSByb2FtIHJlcXVlc3QKKy8vcFBhcmFtIGlzIGEgcG9pbnRlciB0byBhIHRDc3JSb2FtSW5mbywgc2VlIGRlZmluaXRpb24gb2YgZVJvYW1DbWRTdGF0dXMgYW5kCisvLyAgIGVSb2FtQ21kUmVzdWx0IGZvciBkZXRhaWwgdmFsaWQgbWVtYmVycy4gSXQgbWF5IGJlIE5VTEwKKy8vcm9hbUlkIGlzIHRvIGlkZW50aWZ5IHRoZSBjYWxsYmFjayByZWxhdGVkIHJvYW0gcmVxdWVzdC4gMCBtZWFucyB1bnNvbGljaXQKKy8vcm9hbVN0YXR1cyBpcyBhIGZsYWcgaW5kaWNhdGluZyB0aGUgc3RhdHVzIG9mIHRoZSBjYWxsYmFjaworLy9yb2FtUmVzdWx0IGlzIHRoZSByZXN1bHQKK3R5cGVkZWYgZUhhbFN0YXR1cyAoKmNzclJvYW1Db21wbGV0ZUNhbGxiYWNrKSh2b2lkICpwQ29udGV4dCwgdENzclJvYW1JbmZvICpwUGFyYW0sIHRBTklfVTMyIHJvYW1JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJvYW1DbWRTdGF0dXMgcm9hbVN0YXR1cywgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCk7CisKK3R5cGVkZWYgZUhhbFN0YXR1cyAoKmNzclJvYW1TZXNzaW9uQ2xvc2VDYWxsYmFjaykodm9pZCAqcENvbnRleHQpOyAgIAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyUm9hbUdldE51bVBNS0lEQ2FjaGUKKyAgICBcYnJpZWYgcmV0dXJuIG51bWJlciBvZiBQTUtJRCBjYWNoZSBlbnRyaWVzCisgICAgXHJldHVybiB0QU5JX1UzMiAtIHRoZSBudW1iZXIgb2YgUE1LSUQgY2FjaGUgZW50cmllcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vdEFOSV9VMzIgY3NyUm9hbUdldE51bVBNS0lEQ2FjaGUodEhhbEhhbmRsZSBoSGFsKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzclJvYW1HZXRQTUtJRENhY2hlCisgICAgXGJyaWVmIHJldHVybiBQTUtJRCBjYWNoZSBmcm9tIENTUgorICAgIFxwYXJhbSBwTnVtIC0gY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBoYXMgdGhlIHNwYWNlIG9mIHRoZSBudW1iZXIgb2YgcEJ1ZiB0UG1raWRDYWNoZUluZm8gYXMgaW5wdXQuIFVwb24gcmV0dXJuZWQsICpwTnVtIGhhcyB0aGUgCisgICAgbmVlZGVkIG9yIGFjdHVhbGx5IG51bWJlciBpbiB0UG1raWRDYWNoZUluZm8uCisgICAgXHBhcmFtIHBQbWtpZENhY2hlIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBjb250YWlucyBQTUtJRCBjYWNoZSwgaWYgYW55LCB1cG9uIHJldHVybgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QgYmlnIGVub3VnaAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vZUhhbFN0YXR1cyBjc3JSb2FtR2V0UE1LSURDYWNoZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyICpwTnVtLCB0UG1raWRDYWNoZUluZm8gKnBQbWtpZENhY2hlKTsKKworLy9wUHJvZmlsZSAtIHBvaW50ZXIgdG8gdENzclJvYW1Qcm9maWxlCisjZGVmaW5lIENTUl9JU19TVEFSVF9JQlNTKHBQcm9maWxlKSAoZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTID09IChwUHJvZmlsZSktPkJTU1R5cGUpCisjZGVmaW5lIENTUl9JU19KT0lOX1RPX0lCU1MocFByb2ZpbGUpIChlQ1NSX0JTU19UWVBFX0lCU1MgPT0gKHBQcm9maWxlKS0+QlNTVHlwZSkKKyNkZWZpbmUgQ1NSX0lTX0lCU1MocFByb2ZpbGUpICggQ1NSX0lTX1NUQVJUX0lCU1MocFByb2ZpbGUpIHx8IENTUl9JU19KT0lOX1RPX0lCU1MocFByb2ZpbGUpICkKKyNkZWZpbmUgQ1NSX0lTX0lORlJBU1RSVUNUVVJFKHBQcm9maWxlKSAoZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSA9PSAocFByb2ZpbGUpLT5CU1NUeXBlKQorI2RlZmluZSBDU1JfSVNfQU5ZX0JTU19UWVBFKHBQcm9maWxlKSAoZUNTUl9CU1NfVFlQRV9BTlkgPT0gKHBQcm9maWxlKS0+QlNTVHlwZSkKKyNkZWZpbmUgQ1NSX0lTX1dEU19BUCggcFByb2ZpbGUgKSAgKCBlQ1NSX0JTU19UWVBFX1dEU19BUCA9PSAocFByb2ZpbGUpLT5CU1NUeXBlICkKKyNkZWZpbmUgQ1NSX0lTX1dEU19TVEEoIHBQcm9maWxlICkgKCBlQ1NSX0JTU19UWVBFX1dEU19TVEEgPT0gKHBQcm9maWxlKS0+QlNTVHlwZSApCisjZGVmaW5lIENTUl9JU19XRFMoIHBQcm9maWxlICkgICggQ1NSX0lTX1dEU19BUCggcFByb2ZpbGUgKSB8fCBDU1JfSVNfV0RTX1NUQSggcFByb2ZpbGUgKSApCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorI2RlZmluZSBDU1JfSVNfSU5GUkFfQVAoIHBQcm9maWxlICkgICggZUNTUl9CU1NfVFlQRV9JTkZSQV9BUCA9PSAocFByb2ZpbGUpLT5CU1NUeXBlICkKKyNlbmRpZgorCisvL3BQcm9maWxlIC0gcG9pbnRlciB0byB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjZGVmaW5lIENTUl9JU19DT05OX0lORlJBX0FQKCBwUHJvZmlsZSApICAoIGVDU1JfQlNTX1RZUEVfSU5GUkFfQVAgPT0gKHBQcm9maWxlKS0+QlNTVHlwZSApCisjZW5kaWYKKyNkZWZpbmUgQ1NSX0lTX0NPTk5fV0RTX0FQKCBwUHJvZmlsZSApICAoIGVDU1JfQlNTX1RZUEVfV0RTX0FQID09IChwUHJvZmlsZSktPkJTU1R5cGUgKQorI2RlZmluZSBDU1JfSVNfQ09OTl9XRFNfU1RBKCBwUHJvZmlsZSApICggZUNTUl9CU1NfVFlQRV9XRFNfU1RBID09IChwUHJvZmlsZSktPkJTU1R5cGUgKQorI2RlZmluZSBDU1JfSVNfQ09OTl9XRFMoIHBQcm9maWxlICkgICggQ1NSX0lTX1dEU19BUCggcFByb2ZpbGUgKSB8fCBDU1JfSVNfV0RTX1NUQSggcFByb2ZpbGUgKSApCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vQ29tbW9uIFJvYW0gZW5kcworCisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JTZXRDaGFubmVscworICAgIFxicmllZiBIREQgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBjaGFuZ2Ugc29tZSBnbG9iYWwgc2V0dGluZ3MuIAorICAgIGNhbGxlciBtdXN0IHNldCB0aGUgYWxsIGZpZWxkcyBvciBjYWxsIGNzckdldENvbmZpZ1BhcmFtIHRvIHByZWZpbGwgdGhlIGZpZWxkcy4KKyAgICBccGFyYW0gcFBhcmFtIC0gY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZUhhbFN0YXR1cyBjc3JTZXRDaGFubmVscyh0SGFsSGFuZGxlIGhIYWwsICB0Q3NyQ29uZmlnUGFyYW0gKnBQYXJhbSAgKTsKKworZUhhbFN0YXR1cyBjc3JTZXRSZWdJbmZvKHRIYWxIYW5kbGUgaEhhbCwgIHRBTklfVTggKmFwQ250cnlDb2RlKTsKKyNlbmRpZgorCisKKy8vZW51bSB0byBzdHJpbmcgY29udmVyc2lvbiBmb3IgZGVidWcgb3V0cHV0Citjb25zdCBjaGFyICogZ2V0X2VSb2FtQ21kU3RhdHVzX3N0cihlUm9hbUNtZFN0YXR1cyB2YWwpOworY29uc3QgY2hhciAqIGdldF9lQ3NyUm9hbVJlc3VsdF9zdHIoZUNzclJvYW1SZXN1bHQgdmFsKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JTZXRQaHlNb2RlCisgICAgXGJyaWVmIEhERCBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgcGh5TW9kZS4KKyAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIENGRyBpcyBkb3dubG9hZGVkIGFuZCBhbGwgdGhlIGJhbmQvbW9kZSBzZXR0aW5nIGFscmVhZHkgcGFzc2VkIGludG8KKyAgICBDU1IuCisgICAgXHBhcmFtIHBoeU1vZGUgLSBpbmRpY2F0ZSB0aGUgcGh5TW9kZSBuZWVkcyB0byBzZXQgdG8uIFRoZSB2YWx1ZSBoYXMgdG8gYmUgZWl0aGVyIDAsIG9yIHNvbWUgYml0cyBzZXQuIAorICAgIFNlZSBlQ3NyUGh5TW9kZSBmb3IgZGVmaW5pdGlvbgorICAgIFxwYXJhbSBlQmFuZCAtIHNwZWNpZnkgdGhlIG9wZXJhdGlvbmFsIGJhbmQgKDIuNCwgNSBvciBib3RoKQorICAgIFxwYXJhbSBwZlJlc3RhcnROZWVkZWQgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBzcGFjZS4gVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgaXQgaW5kaWNhdGVzIHdoZXRoZXIgCisgICAgYSByZXN0YXJ0IGlzIG5lZWRlZCB0byBhcHBseSB0aGUgY2hhbmdlCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclNldFBoeU1vZGUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1UzMiBwaHlNb2RlLCBlQ3NyQmFuZCBlQmFuZCwgdEFOSV9CT09MRUFOICpwZlJlc3RhcnROZWVkZWQpOworCit2b2lkIGNzckR1bXBJbml0KHRIYWxIYW5kbGUgaEhhbCk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVGhpcyBpcyB0aGUgdHlwZSBmb3IgYSBsaW5rIHF1YWxpdHkgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIFNNRQorICBmb3IgaW5kaWNhdGlvbnMKKyAgT25jZSB0aGUgbGluayBxdWFsaXR5IGhhcyBiZWVuIGluZGljYXRlZCwgc3Vic2VxdWVudGx5LCBsaW5rIGluZGljYXRpb25zIGFyZSAKKyAgcG9zdGVkIGVhY2ggdGltZSB0aGVyZSBpcyBhIENIQU5HRSBpbiBsaW5rIHF1YWxpdHkuCisgICoqKiBJZiB0aGVyZSBpcyBubyBjaGFuZ2UgaW4gbGluaywgdGhlcmUgd2lsbCBiZSBubyBpbmRpY2F0aW9uICoqKgorCisgIFRoZSBpbmRpY2F0aW9ucyBtYXkgYmUgYmFzZWQgb24gb25lIG9yIG1vcmUgY3JpdGVyaWEgaW50ZXJuYWwgdG8gU01FCisgIHN1Y2ggYXMgUlNTSSBhbmQgUEVSLgorCisgIFxwYXJhbSBpbmQgLSBJbmRpY2F0aW9uIGJlaW5nIHBvc3RlZAorICBccGFyYW0gcENvbnRleHQgLSBhbnkgdXNlciBkYXRhIGdpdmVuIGF0IGNhbGxiYWNrIHJlZ2lzdHJhdGlvbi4gIAorICBccmV0dXJuIE5vbmUKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICgqIGNzclJvYW1MaW5rUXVhbGl0eUluZENhbGxiYWNrKQorICAgICAgICAgICAgIChlQ3NyUm9hbUxpbmtRdWFsaXR5SW5kICBpbmQsIHZvaWQgKnBDb250ZXh0KTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUaGlzIGlzIHRoZSB0eXBlIGZvciBhIHN0YXRpc3RpY3MgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIFNNRQorICBmb3Igc3RhdHMgcmVwb3J0aW5nCisKKyAgU2luY2UgdGhlIGNsaWVudCByZXF1ZXN0aW5nIGZvciB0aGUgc3RhdHMgYWxyZWFkeSBrbm93IHdoaWNoIGNsYXNzL3R5cGUgb2YgCisgIHN0YXRzIGl0IGFza2VkIGZvciwgdGhlIGNhbGxiYWNrIHdpbGwgY2FycnkgdGhlbSBpbiB0aGUgcnNwIGJ1ZmZlciAKKyAgKHZvaWQgKiBzdGF0cykgd2hvc2Ugc2l6ZSB3aWxsIGJlIHNhbWUgYXMgdGhlIHNpemUgb2YgcmVxdWVzdGVkIHN0YXRzICYgCisgIHdpbGwgYmUgZXhhY3RseSBpbiB0aGUgc2FtZSBvcmRlciByZXF1ZXN0ZWQgaW4gdGhlIHN0YXRzIG1hc2sgZnJvbSBMU0IgdG8gTVNCCisKKyAgXHBhcmFtIHN0YXRzIC0gc3RhdHMgcnNwIGJ1ZmZlciBzZW50IGJhY2sgd2l0aCB0aGUgcmVwb3J0CisgIFxwYXJhbSBwQ29udGV4dCAtIGFueSB1c2VyIGRhdGEgZ2l2ZW4gYXQgY2FsbGJhY2sgcmVnaXN0cmF0aW9uLiAgCisgIFxyZXR1cm4gTm9uZQorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgKCAqdENzclN0YXRzQ2FsbGJhY2spICh2b2lkICogc3RhdHMsIHZvaWQgKnBDb250ZXh0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVGhpcyBpcyB0aGUgdHlwZSBmb3IgYSByc3NpIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBTTUUKKyAgZm9yIGdldHRpbmcgcnNzaQorCisgIFxwYXJhbSByc3NpIC0gcnNzaQorICBccGFyYW0gcENvbnRleHQgLSBhbnkgdXNlciBkYXRhIGdpdmVuIGF0IGNhbGxiYWNrIHJlZ2lzdHJhdGlvbi4gIAorICBccmV0dXJuIE5vbmUKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHZvaWQgKCAqdENzclJzc2lDYWxsYmFjaykgKHZfUzdfdCByc3NpLCB0QU5JX1UzMiBzdGFJZCwgdm9pZCAqcENvbnRleHQpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlRlRQcmVhdXRoUmVxKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgc2Vzc2lvbklkLCB0cFNpckJzc0Rlc2NyaXB0aW9uIHBCc3NEZXNjcmlwdGlvbik7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVGhpcyBpcyB0aGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBCYW5kIGNvbmZpZ3VyYWl0b24gKEFMTC8yLjQgR0haLzUgR0haKSAKKworICBccGFyYW0gaEhhbCAtIGhhbmRsZSB0byBIYWwgY29udGV4dCAKKyAgXHBhcmFtIGVCYW5kIC0gYmFuZCB2YWx1ZQorICBccmV0dXJuICBlSGFsU3RhdHVzCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyU2V0QmFuZCh0SGFsSGFuZGxlIGhIYWwsIGVDc3JCYW5kIGVCYW5kKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVGhpcyBpcyB0aGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IG9wZXJhdGluZyBiYW5kIHZhbHVlCisgIFxwYXJhbSBoSGFsIC0gaGFuZGwgdG8gSGFsIGNvbnRleHQKKyAgXHJldHVybiBlQ3NyYmFuZCAtIGJhbmQgdmFsdWUKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUNzckJhbmQgY3NyR2V0Q3VycmVudEJhbmQgKHRIYWxIYW5kbGUgaEhhbCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9pbmMvY3NySW50ZXJuYWwuaCBiL0NPUkUvU01FL2luYy9jc3JJbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzQyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9pbmMvY3NySW50ZXJuYWwuaApAQCAtMCwwICsxLDExNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAgCisKKyAgCisgICAgXGZpbGUgY3NySW50ZXJuYWwuaAorICAKKyAgICBEZWZpbmUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgZm9yIE1BQy4KKyAgCisgICAgQ29weXJpZ2h0IChDKSAyMDA2IEFpcmdvIE5ldHdvcmtzLCBJbmNvcnBvcmF0ZWQgCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBDU1JJTlRFUk5BTF9IX18KKyNkZWZpbmUgQ1NSSU5URVJOQUxfSF9fCisKKyNpZiBkZWZpbmVkKFZPU1NfRU5BQkxFRCkKKyNpbmNsdWRlICJ2b3Nfc3RhdHVzLmgiCisjaW5jbHVkZSAidm9zX2xvY2suaCIKKyNlbmRpZiAvLyNpZiBkZWZpbmVkKFZPU1NfRU5BQkxFRCkKKworI2luY2x1ZGUgInBhbFRpbWVyLmgiCisjaW5jbHVkZSAiY3NyU3VwcG9ydC5oIgorI2luY2x1ZGUgInZvc19udml0ZW0uaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyNpbmNsdWRlICJjc3JOZWlnaGJvclJvYW0uaCIKKyNlbmRpZgorCisjZGVmaW5lIENTUl9NQVhfU1RBIChIQUxfTlVNX1NUQSkKKworI2RlZmluZSBDU1JfU01FX1NDQU5fRkxBR1NfREVMRVRFX0NBQ0hFICAgICAweDgwCisKKyNkZWZpbmUgQ1NSX1RJVEFOX01BWF9SQVRFX01JTU9fQ0IgMjQwCisjZGVmaW5lIENTUl9USVRBTl9NQVhfUkFURV9NSU1PICAgIDEyNgorCisvL2RlZmluZSBzY2FuIHJldHVybiBjcml0ZXJpYS4gTElNIHNob3VsZCB1c2UgdGhlc2UgZGVmaW5lIGFzIHdlbGwKKyNkZWZpbmUgQ1NSX1NDQU5fUkVUVVJOX0FGVEVSX0FMTF9DSEFOTkVMUyAgICAgICAgICAoICAgIDAgKQorI2RlZmluZSBDU1JfU0NBTl9SRVRVUk5fQUZURVJfRklSU1RfTUFUQ0ggICAgICAgICAgICggMHgwMSApCisjZGVmaW5lIENTUl9TQ0FOX1JFVFVSTl9BRlRFUl81X0JBTkRfMTFkX0ZPVU5EICAgICAgKCAweDgwICkKKyNkZWZpbmUgQ1NSX1NDQU5fUkVUVVJOX0FGVEVSXzI0X0JBTkRfMTFkX0ZPVU5EICAgICAoIDB4NDAgKQorI2RlZmluZSBDU1JfU0NBTl9SRVRVUk5fQUZURVJfRUlUSEVSX0JBTkRfMTFkX0ZPVU5EICggQ1NSX1NDQU5fUkVUVVJOX0FGVEVSXzVfQkFORF8xMWRfRk9VTkQgfCBDU1JfU0NBTl9SRVRVUk5fQUZURVJfMjRfQkFORF8xMWRfRk9VTkQgKQorI2RlZmluZSBDU1JfTlVNX1JTU0lfQ0FUICAgICAgICA1CisjZGVmaW5lIENTUl9NQVhfU1RBVElTVElDU19SRVEgICAgICAgIDEwCisKKy8vU3VwcG9ydCBmb3IgbXVsdGlwbGUgc2Vzc2lvbgorI2RlZmluZSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEICAgIDB4RkYgICAvLyBzZXNzaW9uIElEIGludmFsaWQKKyNkZWZpbmUgQ1NSX1JPQU1fU0VTU0lPTl9NQVggICAgICA1ICAgLy8gTm8gb2Ygc2Vzc2lvbnMgdG8gYmUgc3VwcG9ydGVkLCBhbmQgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uIGlzIGZvciBJbmZyYSwgSUJTUyBvciBCVC1BTVAKKworI2RlZmluZSBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKCAoIChzZXNzaW9uSWQpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVggKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICggKHBNYWMpLT5yb2FtLnJvYW1TZXNzaW9uWyhzZXNzaW9uSWQpXS5zZXNzaW9uQWN0aXZlICkgKQorI2RlZmluZSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApIFwKKyggXAorICAgIChzZXNzaW9uSWQgPCBDU1JfUk9BTV9TRVNTSU9OX01BWCkgPyBcCisgICAgICgmKHBNYWMpLT5yb2FtLnJvYW1TZXNzaW9uWyhzZXNzaW9uSWQpXSkgOlwKKyAgICAgTlVMTCBcCispCisKKworCit0eXBlZGVmIGVudW0KK3sKKyAgICAvL2VDU1JfQ0ZHX0RPVDExX01PREVfQkVTVCA9IDAsCisgICAgZUNTUl9DRkdfRE9UMTFfTU9ERV9UQVVSVVMgPSAwLAorICAgIGVDU1JfQ0ZHX0RPVDExX01PREVfQUJHLCAgICAKKyAgICBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQSwgICAgCisgICAgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUIsICAgIAorICAgIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFHLCAgICAKKyAgICBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTiwgICAKKyAgICBlQ1NSX0NGR19ET1QxMV9NT0RFX1BPTEFSSVMsICAgIAorICAgIGVDU1JfQ0ZHX0RPVDExX01PREVfVElUQU4sICAgIAorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBlQ1NSX0NGR19ET1QxMV9NT0RFXzExR19PTkxZLCAgICAKKyAgICBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTl9PTkxZLCAgIAorI2VuZGlmIAorICAgIC8vVGhpcyB2YWx1ZSBjYW4gbmV2ZXIgc2V0IHRvIENGRy4gSXQgaXMgZm9yIENTUidzIGludGVybmFsIHVzZQorICAgIGVDU1JfQ0ZHX0RPVDExX01PREVfQVVUTywKK31lQ3NyQ2ZnRG90MTFNb2RlOyAgLy9Vc2VkIHRvIGRldGVybWluZSB3aGF0IHRvIHNldCB0byB0aGUgV05JX0NGR19ET1QxMV9NT0RFCisKK3R5cGVkZWYgZW51bSBldENzclJvYW1Db21tYW5kcyAKK3sKKyAgICBlQ3NyUm9hbU5vQ29tbWFuZCwgICAgICAgICAgICAgICAgIAorICAgIGVDc3JSb2FtQ29tbWFuZFNjYW4sCisgICAgZUNzclJvYW1Db21tYW5kUm9hbSwgCisgICAgZUNzclJvYW1Db21tYW5kV21TdGF0dXNDaGFuZ2UsIAorICAgIGVDc3JSb2FtQ29tbWFuZFNldEtleSwKKyAgICBlQ3NyUm9hbUNvbW1hbmRSZW1vdmVLZXksCisKK30gZUNzclJvYW1Db21tYW5kczsKKwordHlwZWRlZiBlbnVtICAKK3sKKyAgICBlQ3NyU2Nhbk90aGVyID0gMSwKKyAgICBlQ3NyU2Nhbkxvc3RMaW5rMSwKKyAgICBlQ3NyU2Nhbkxvc3RMaW5rMiwKKyAgICBlQ3NyU2Nhbkxvc3RMaW5rMywKKyAgICBlQ3NyU2Nhbkxvc3RMaW5rNCwKKyAgICBlQ3NyU2NhbjExZDEsICAvL0ZpcnN0IDExZCBzY2FuCisgICAgZUNzclNjYW4xMWQyLCAgLy9GaXJzdCAxMWQgc2NhbiBoYXMgZmFpbGVkCisgICAgZUNzclNjYW4xMWREb25lLCAgLy8xMWQgc2NhbiBzdWNjZWVkZWQsIHRyeSB0aGUgcmVzdCBvZiB0aGUgY2hhbm5lbAorICAgIGVDc3JTY2FuVXNlclJlcXVlc3QsCisgICAgZUNzclNjYW5HZXRSZXN1bHQsCisgICAgZUNzclNjYW5TZXRCR1NjYW5QYXJhbSwgLy91c2VkIGZvciBITyB0b28gLSBiZyBzY2FuIHJlcXVlc3QgaW4gTlQgSGFuZG9mZiBzdWItc3RhdGUKKyAgICBlQ3NyU2NhbkZvclNzaWQsCisgICAgZUNzclNjYW5Gb3JDYXBzQ2hhbmdlLAorICAgIGVDc3JTY2FuQkdTY2FuQWJvcnQsCisgICAgZUNzclNjYW5CR1NjYW5FbmFibGUsCisgICAgZUNzclNjYW5JZGxlU2NhbiwKKyAgICBlQ3NyU2NhbkdldFNjYW5DaG5JbmZvLCAgICAgLy9UbyBnZXQgdGhlIGxpc3Qgb2YgY2hhbm5lbHMgc2Nhbm5lZAorCisgICAgZUNzclNjYW5CZ1NjYW4sIC8vIGJnIHNjYW4gcmVxdWVzdCBpbiBOUlQgJiBSVCBIYW5kb2ZmIHN1Yi1zdGF0ZXMKKyAgICBlQ3NyU2NhblByb2JlQnNzLCAvLyBkaXJlY3RlZCBwcm9iZSBvbiBhbiBlbnRyeSBmcm9tIHRoZSBjYW5kaWRhdGUgbGlzdCAtIEhPCisgICAgZUNzclNjYW5BYm9ydEJnU2NhbiwgICAgLy9hYm9ydGluZyBhIEJHIHNjYW4gKG1lYW5pbmcgdGhlIHNjYW4gaXMgdHJpZ2dlcmVkIGJ5IExJTSB0aW1lcikKKyAgICBlQ3NyU2NhbkFib3J0Tm9ybWFsU2NhbiwgLy9hYm9ydGluZyBhIG5vcm1hbCBzY2FuICh0aGUgc2NhbiBpcyB0cmlnZ2VyIGJ5IGVXTklfU01FX1NDQU5fUkVRKQorICAgIGVDc3JTY2FuUDJQRmluZFBlZXIgICAgCit9ZUNzclNjYW5SZWFzb247CisKK3R5cGVkZWYgZW51bSAKK3sKKyAgICBlQ3NyTm9Db25uZWN0aW9uLCAgICAgICAgICAvLyBSb2FtaW5nIGJlY2F1c2Ugd2UgaGF2ZSBub3QgZXN0YWJsaXNoZWQgdGhlIGluaXRpYWwgY29ubmVjdGlvbi4KKyAgICBlQ3NyQ2Fwc0NoYW5nZSwgICAgICAgICAgICAvLyByb2FtaW5nIGJlY2F1c2UgTElNIHJlcG9ydGVkIGEgQ2FwYWJpbGl0eSBjaGFuZ2UgaW4gdGhlIGFzc29jaWF0ZWQgQVAuCisgICAgZUNzckZvcmNlZERpc2Fzc29jLCAgICAgICAgLy8gcm9hbWluZyBiZWN1YXNlIHNvbWVvbmUgYXNrZWQgdXMgdG8gRGlzYXNzb2MgYW5kIHN0YXkgZGlzYXNzb2NpYXRlZC4KKyAgICBlQ3NySGRkSXNzdWVkLCAgICAgICAgICAgICAvLyByb2FtaW5nIGJlY2F1c2UgYW4gODAyLjExIHJlcXVlc3Qgd2FzIGlzc3VlZCB0byB0aGUgZHJpdmVyLgorICAgIGVDc3JMb3N0TGluazEsICAgICAgICAgICAgIC8vIHJvYW1pbmcgYmVjYXVzZSB3ZSBsb3N0IGxpbmsgdG8gYW4gYXNzb2NpYXRlZCBBUAorICAgIGVDc3JMb3N0TGluazIsIAorICAgIGVDc3JMb3N0TGluazMsCisgICAgZUNzckZvcmNlZERpc2Fzc29jTUlDRmFpbHVyZSwgLy8gcm9hbWluZyBiZWNhdXNlIHdlIG5lZWQgdG8gZm9yY2UgYSBEaXNhc3NvYyBkdWUgdG8gTUlDIGZhaWx1cmUKKyAgICBlQ3NySGRkSXNzdWVkUmVhc3NvY1RvU2FtZUFQLAorICAgIGVDc3JTbWVJc3N1ZWRSZWFzc29jVG9TYW1lQVAsCisgICAgZUNzclNtZUlzc3VlZFJlYXNzb2NUb0RpZmZBUCwKKyAgICBlQ3NyRm9yY2VkRGVhdXRoLCAgICAgICAgLy8gcm9hbWluZyBiZWN1YXNlIHNvbWVvbmUgYXNrZWQgdXMgdG8gZGVhdXRoIGFuZCBzdGF5IGRpc2Fzc29jaWF0ZWQuCisgICAgZUNzclNtZUlzc3VlZERpc2Fzc29jRm9ySGFuZG9mZiwgLy8gd2lsbCBiZSBpc3N1ZWQgYnkgSGFuZG9mZiBsb2dpYyB0byBkaXNjb25lY3QgZnJvbSBjdXJyZW50IEFQCisgICAgZUNzclNtZUlzc3VlZEFzc29jVG9TaW1pbGFyQVAsIC8vIHdpbGwgYmUgaXNzdWVkIGJ5IEhhbmRvZmYgbG9naWMgdG8gam9pbiBhIG5ldyBBUCB3aXRoIHNhbWUgcHJvZmlsZQorICAgIGVDc3JTbWVJc3N1ZWRJYnNzSm9pbkZhaWx1cmUsIC8vIGlic3Mgam9pbiB0aW1lciBmaXJlZCBiZWZvcmUgYW55IHBlcnIgc2hvd2VkIHVwLCBzbyBzaHV0IGRvd24gdGhlIG5ldHdvcmsKKyAgICBlQ3NyRm9yY2VkSWJzc0xlYXZlLAorICAgIGVDc3JTdG9wQnNzLAorICAgIGVDc3JTbWVJc3N1ZWRGVFJlYXNzb2MsCisgICAgZUNzckZvcmNlZERpc2Fzc29jU3RhLAorICAgIGVDc3JGb3JjZWREZWF1dGhTdGEsCisgICAgCit9ZUNzclJvYW1SZWFzb247CisKK3R5cGVkZWYgZW51bQoreworICAgIGVDU1JfUk9BTV9TVUJTVEFURV9OT05FID0gMCwgICAgICAgICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9TVEFSVF9CU1NfUkVRLCAgICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9KT0lOX1JFUSwgICAgICAgICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9SRUFTU09DX1JFUSwgICAgICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRVEsICAgICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9TVE9QX0JTU19SRVEsICAgICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNDT05ORUNUX0NPTlRJTlVFX1JPQU1JTkcsICAgLy9Db250aW51ZSB0aGUgY3VycmVudCByb2FtIGNvbW1hbmQgYWZ0ZXIgZGlzY29ubmVjdCAgICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9BVVRIX1JFUSwgICAgICAgICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9DT05GSUcsICAgICAgICAgICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9ERUFVVEhfUkVRLCAgICAgICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19OT1RISU5HX1RPX0pPSU4sIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRUFTU09DX0ZBSUxVUkUsIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19GT1JDRUQsICAgICAgICAgIAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9XQUlUX0ZPUl9LRVksCisgICAgZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hBTkRPRkYsCisgICAgZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5FRF9OT19UUkFGRklDLAorICAgIGVDU1JfUk9BTV9TVUJTVEFURV9KT0lORURfTk9OX1JFQUxUSU1FX1RSQUZGSUMsCisgICAgZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5FRF9SRUFMVElNRV9UUkFGRklDLAorLy8gIG1heCBpcyAxNSB1bmxlc3MgdGhlIGJpdGZpZWxkIGlzIGV4cGFuZGVkLi4uCit9IGVDc3JSb2FtU3ViU3RhdGU7CisKKwordHlwZWRlZiBlbnVtIAoreworICBlQ1NSX1JPQU1JTkdfU1RBVEVfU1RPUCA9IDAsCisgIGVDU1JfUk9BTUlOR19TVEFURV9JRExFLAorICBlQ1NSX1JPQU1JTkdfU1RBVEVfU0NBTk5JTkcsCisgIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HLAorICBlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTkVELAorfWVDc3JSb2FtU3RhdGU7CisKKwordHlwZWRlZiBlbnVtIAoreworICAgIGVDc3JDb250aW51ZVJvYW1pbmcsCisgICAgZUNzclN0b3BSb2FtaW5nLAorICAgIGVDc3JTdGFydElic3MsCisgICAgZUNzclN0YXJ0SWJzc1NhbWVJYnNzLAorICAgIGVDc3JSZWFzc29jVG9TZWxmTm9DYXBDaGFuZ2UsCisgICAgCit9ZUNzckpvaW5TdGF0ZTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgZUNzck5vdFJvYW1pbmcsCisgICAgZUNzckxvc3RsaW5rUm9hbWluZ0Rpc2Fzc29jLAorICAgIGVDc3JMb3N0bGlua1JvYW1pbmdEZWF1dGgsCisgICAgZUNzckR5bmFtaWNSb2FtaW5nLAorICAgZUNzclJlYXNzb2NSb2FtaW5nLAorfWVDc3JSb2FtaW5nUmVhc29uOworCit0eXBlZGVmIGVudW0gCit7CisgICAgZUNzckRpc2Fzc29jaWF0ZWQsCisgICAgZUNzckRlYXV0aGVudGljYXRlZAorCit9ZUNzclJvYW1XbVN0YXR1c0NoYW5nZVR5cGVzOworCit0eXBlZGVmIGVudW0KK3sKKyAgIGVDc3JTdW1tYXJ5U3RhdHMgPSAwLAorICAgZUNzckdsb2JhbENsYXNzQVN0YXRzLAorICAgZUNzckdsb2JhbENsYXNzQlN0YXRzLAorICAgZUNzckdsb2JhbENsYXNzQ1N0YXRzLAorICAgZUNzckdsb2JhbENsYXNzRFN0YXRzLAorICAgZUNzclBlclN0YVN0YXRzLAorICAgZUNzck1heFN0YXRzCit9ZUNzclJvYW1TdGF0c0NsYXNzVHlwZXM7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCit0eXBlZGVmIGVudW0KK3sKKyAgIGVDU1JfV0xBTl9TVEFUVVNfQ09OTkVDVCA9MCwKKyAgIGVDU1JfV0xBTl9TVEFUVVNfRElTQ09OTkVDVAorCit9ZUNzckRpYWdXbGFuU3RhdHVzRXZlbnRTdWJ0eXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgIGVDU1JfUkVBU09OX1VOU1BFQ0lGSUVEID0gMCwKKyAgIGVDU1JfUkVBU09OX1VTRVJfUkVRVUVTVEVELAorICAgZUNTUl9SRUFTT05fTUlDX0VSUk9SLAorICAgZUNTUl9SRUFTT05fRElTQVNTT0MsCisgICBlQ1NSX1JFQVNPTl9ERUFVVEgsCisgICBlQ1NSX1JFQVNPTl9IQU5ET0ZGLAorCit9ZUNzckRpYWdXbGFuU3RhdHVzRXZlbnRSZWFzb247CisKK3R5cGVkZWYgZW51bQoreworICAgZUNTUl9XTEFOX0hBTkRPRkZfRVZFTlQgPTAsCisKK31lQ3NyRGlhZ1dsYW5IYW5kb2ZmRXZlbnRTdWJ0eXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgIGVDU1JfV0xBTl9WQ0NfRVZFTlQgPTAsCisKK31lQ3NyRGlhZ1dsYW5WY2NFdmVudFN1YnR5cGU7CisKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ2hhbm5lbAoreworICAgIHRBTklfVTggbnVtQ2hhbm5lbHM7CisgICAgdEFOSV9VOCBjaGFubmVsTGlzdFtXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworfXRDc3JDaGFubmVsOworCit0eXBlZGVmIHN0cnVjdCB0YWdTY2FuUHJvZmlsZQoreworICAgIHRBTklfVTMyIG1pbkNoblRpbWU7CisgICAgdEFOSV9VMzIgbWF4Q2huVGltZTsKKyAgICB0QU5JX1UzMiByZXN0VGltZTsgIC8vVGhpcyBpcyBpZ25vcmVkIGlmIG5vdCBhc3NvY2lhdGVkCisgICAgdEFOSV9VMzIgbnVtT2ZDaGFubmVsczsKKyAgICB0QU5JX1U4ICpwQ2hhbm5lbExpc3Q7CisgICAgdFNpclNjYW5UeXBlIHNjYW5UeXBlOyAgLy9hY3RpdmUgb3IgcGFzc2l2ZQorICAgIGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlOyAgICAvL0JTUyBvciBJQlNTCisgICAgdEFOSV9VOCBzc2lkW1dOSV9DRkdfU1NJRF9MRU5dOworICAgIHRBTklfVTggYlJldHVybkFmdGVyMXN0TWF0Y2g7CisgICAgdEFOSV9VOCBmVW5pcXVlUmVzdWx0OworICAgIHRBTklfVTggZnJlc2hTY2FuOworICAgIHRDc3JCc3NpZCBic3NpZDsKK310U2NhblByb2ZpbGU7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0Jzc0NvbmZpZ1BhcmFtCit7CisgICAgZUNzck1lZGlhQWNjZXNzVHlwZSBxb3NUeXBlOworICAgIHRTaXJNYWNTU2lkIFNTSUQ7CisgICAgdEFOSV9VMzIgdVJUU1RocmVzaDsKKyAgICB0QU5JX1UzMiB1RGVmZXJUaHJlc2g7ICAvLworICAgIGVDc3JDZmdEb3QxMU1vZGUgdUNmZ0RvdDExTW9kZTsKKyAgICBlQ3NyQmFuZCBlQmFuZDsKKyAgICB0QU5JX1U4IHN0YW5kYXJkUmF0ZVtDU1JfRE9UMTFfU1VQUE9SVEVEX1JBVEVTX01BWF07CisgICAgdEFOSV9VOCBleHRlbmRlZFJhdGVbQ1NSX0RPVDExX0VYVEVOREVEX1NVUFBPUlRFRF9SQVRFU19NQVhdOworICAgIGVDc3JFeHBvc2VkVHhSYXRlIHR4UmF0ZTsKKyAgICB0QW5pQXV0aFR5cGUgYXV0aFR5cGU7CisgICAgZUNzckVuY3J5cHRpb25UeXBlIGVuY1R5cGU7CisgICAgdEFOSV9VMzIgdVNob3J0U2xvdFRpbWU7CisgICAgdEFOSV9VMzIgdUhUU3VwcG9ydDsgICAgLy9IaWdoIHRocm91Z2hwdXQKKyAgICB0QU5JX1UzMiB1UG93ZXJMaW1pdDsKKyAgICB0QU5JX1UzMiB1SGVhcnRCZWF0VGhyZXNoOworICAgIHRBTklfVTMyIHVKb2luVGltZU91dDsKKyAgICB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gQnNzQ2FwOworICAgIHRBTklfQk9PTEVBTiBmMTFoU3VwcG9ydDsKKyAgICB0QW5pQ0JTZWNvbmRhcnlNb2RlIGNiTW9kZTsKK310QnNzQ29uZmlnUGFyYW07CisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUm9hbVN0YXJ0QnNzUGFyYW1zCit7CisgICAgdFNpck1hY1NTaWQgICAgICAgICBzc0lkOworICAgIHRDc3JCc3NpZCAgICAgICAgICAgYnNzaWQ7ICAgIC8vdGhpcyBpcyB0aGUgQlNTSUQgZm9yIHRoZSBwYXJ0eSB3ZSB3YW50IHRvIGpvaW4gKG9ubHkgdXNlIGZvciBJQlNTIG9yIFdEUykKKyAgICB0U2lyTndUeXBlICAgICAgICAgIHNpck53VHlwZTsKKyAgICB0QW5pQ0JTZWNvbmRhcnlNb2RlIGNiTW9kZTsKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgIG9wZXJhdGlvbmFsUmF0ZVNldDsKKyAgICB0U2lyTWFjUmF0ZVNldCAgICAgIGV4dGVuZGVkUmF0ZVNldDsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIG9wZXJhdGlvbkNobjsKKyAgICBlQ3NyQ2ZnRG90MTFNb2RlICAgIHVDZmdEb3QxMU1vZGU7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHRBTklfVTggICAgICAgICAgICAgcHJpdmFjeTsKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgIGZ3ZFdQU1BCQ1Byb2JlUmVxOworICAgIHRBTklfQk9PTEVBTiAgICAgICAgcHJvdEVuYWJsZWQ7CisgICAgdEFOSV9CT09MRUFOICAgICAgICBvYnNzUHJvdEVuYWJsZWQ7CisgICAgdEFuaUF1dGhUeXBlICAgICAgICBhdXRoVHlwZTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGJlYWNvbkludGVydmFsOyAgICAvL0lmIHRoaXMgaXMgMCwgU01FIHdpbGwgZmlsbCBpbiBmb3IgY2FsbGVyLgorICAgIHRBTklfVTE2ICAgICAgICAgICAgaHRfcHJvdGVjdGlvbjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIGR0aW1QZXJpb2Q7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBBcFVhcHNkRW5hYmxlOworICAgIHRBTklfVTggICAgICAgICAgICAgc3NpZEhpZGRlbjsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgIHdwc19zdGF0ZTsKKyNlbmRpZgorICAgIHRWT1NfQ09OX01PREUgICAgICAgYnNzUGVyc29uYTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIG5SU05JRUxlbmd0aDsgIC8vVGhlIGJ5dGUgY291bnQgaW4gdGhlIHBSU05JRSwgaWYgMCwgcFJTTklFIGlzIGlnbm9yZWQuCisgICAgdEFOSV9VOCAgICAgICAgICAgICAqcFJTTklFOyAgICAgLy9JZiBub3QgbnVsbCwgaXQgaGFzIHRoZSBJRSBieXRlIHN0cmVhbSBmb3IgUlNOCit9dENzclJvYW1TdGFydEJzc1BhcmFtczsKKworCit0eXBlZGVmIHN0cnVjdCB0YWdTY2FuQ21kCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgc2NhbklEOworICAgIGNzclNjYW5Db21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwQ29udGV4dDsKKyAgICBlQ3NyU2NhblJlYXNvbiAgICAgICAgICByZWFzb247CisgICAgZUNzclJvYW1TdGF0ZSAgICAgICAgICAgbGFzdFJvYW1TdGF0ZVtDU1JfUk9BTV9TRVNTSU9OX01BWF07CisgICAgdENzclJvYW1Qcm9maWxlICAgICAgICAgKnBUb1JvYW1Qcm9maWxlOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIHJvYW1JZDsgICAgLy90aGlzIGlzIHRoZSBJRCByZWxhdGVkIHRvIHRoZSBwVG9Sb2FtUHJvZmlsZQorICAgIHVuaW9uCisgICAgeworICAgICAgICB0Q3NyU2NhblJlcXVlc3QgICBzY2FuUmVxdWVzdDsKKyAgICAgICAgdENzckJHU2NhblJlcXVlc3QgYmdTY2FuUmVxdWVzdDsKKyAgICB9dTsKK310U2NhbkNtZDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUm9hbUNtZCAKK3sKKyAgICB0QU5JX1UzMiByb2FtSWQ7CisgICAgZUNzclJvYW1SZWFzb24gcm9hbVJlYXNvbjsKKyAgICB0Q3NyUm9hbVByb2ZpbGUgcm9hbVByb2ZpbGU7CisgICAgdFNjYW5SZXN1bHRIYW5kbGUgaEJTU0xpc3Q7ICAgICAvL0JTUyBsaXN0IGZpdHMgdGhlIHByb2ZpbGUKKyAgICB0TGlzdEVsZW0gKnBSb2FtQnNzRW50cnk7ICAvL3BvaW50IHRvIHRoZSBjdXJyZW50IEJTUyBpbiB0aGUgbGlzdCB0aGF0IGlzIHJvYW1pbmcuIEl0IHN0YXJ0cyBmcm9tIGhlYWQgdG8gdGFpbCAgICAgICAgCisgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwTGFzdFJvYW1Cc3M7ICAgLy90aGUgbGFzdCBCU1Mgd2UgdHJ5IGFuZCBmYWlsZWQKKyAgICB0QU5JX0JPT0xFQU4gZlJlbGVhc2VCc3NMaXN0OyAgLy93aGV0aGVyIHRvIGZyZWUgaEJTU0xpc3QgCisgICAgdEFOSV9CT09MRUFOIGZSZWxlYXNlUHJvZmlsZTsgIC8vd2hldGhlciB0byBmcmVlIHJvYW1Qcm9maWxlCisgICAgdEFOSV9CT09MRUFOIGZSZWFzc29jOyAgLy93aGV0aGVyIHRoaXMgY29tbWFuZCBpcyBmb3IgcmVhc3NvY2lhdGlvbgorICAgIHRBTklfQk9PTEVBTiBmVXBkYXRlQ3VyUm9hbVByb2ZpbGU7ICAgICAvL3doZXRoZXIgcE1hYy0+cm9hbS5wQ3VyUm9hbVByb2ZpbGUgbmVlZHMgdG8gYmUgdXBkYXRlZAorICAgIC8vdGhpcyBpcyBmb3IgQ1NSIGludGVybmFsIHVzZWQgb25seS4gQW5kIGl0IHNob3VsZCBub3QgYmUgYXNzaWduZWQgd2hlbiBjcmVhdGluZyB0aGUgY29tbWFuZAorICAgIC8vVGhpcyBjYXVzZXMgdGhlIHJvYW0gY29tbWFuZCBub3QgdG8gZG8gYW55dGhpbmcuCisgICAgdEFOSV9CT09MRUFOIGZSZWFzc29jVG9TZWxmTm9DYXBDaGFuZ2U7ICAgIAorCisgICAgdEFOSV9CT09MRUFOIGZTdG9wV2RzOworICAgIHRTaXJNYWNBZGRyIHBlZXJNYWM7CisgICAgdFNpck1hY1JlYXNvbkNvZGVzIHJlYXNvbjsKK310Um9hbUNtZDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnU2V0S2V5Q21kCit7CisgICAgdEFOSV9VMzIgcm9hbUlkOworICAgIGVDc3JFbmNyeXB0aW9uVHlwZSBlbmNUeXBlOworICAgIGVDc3JBdXRoVHlwZSBhdXRoVHlwZTsKKyAgICB0QW5pS2V5RGlyZWN0aW9uIGtleURpcmVjdGlvbjsgICAgLy9UeCwgUnggb3IgVHgtYW5kLVJ4CisgICAgdFNpck1hY0FkZHIgcGVlck1hYzsgICAvL1BlZXIncyBNQUMgYWRkcmVzcy4gQUxMIDEncyBmb3IgZ3JvdXAga2V5CisgICAgdEFOSV9VOCBwYWVSb2xlOyAgICAgIC8vMCBmb3Igc3VwcGxpY2FudAorICAgIHRBTklfVTgga2V5SWQ7ICAvLyBLeWUgaW5kZXgKKyAgICB0QU5JX1U4IGtleUxlbmd0aDsgIC8vTnVtYmVyIG9mIGJ5dGVzIGNvbnRhaW5pbmcgdGhlIGtleSBpbiBwS2V5CisgICAgdEFOSV9VOCBLZXlbQ1NSX01BWF9LRVlfTEVOXTsKKyAgICB0QU5JX1U4IGtleVJzY1tDU1JfTUFYX1JTQ19MRU5dOworfSB0U2V0S2V5Q21kOworCit0eXBlZGVmIHN0cnVjdCB0YWhSZW1vdmVLZXlDbWQKK3sKKyAgICB0QU5JX1UzMiByb2FtSWQ7CisgICAgZUNzckVuY3J5cHRpb25UeXBlIGVuY1R5cGU7CisgICAgZUNzckF1dGhUeXBlIGF1dGhUeXBlOworICAgIHRTaXJNYWNBZGRyIHBlZXJNYWM7ICAgLy9QZWVyJ3MgTUFDIGFkZHJlc3MuIEFMTCAxJ3MgZm9yIGdyb3VwIGtleQorICAgIHRBTklfVTgga2V5SWQ7ICAvL2tleSBpbmRleAorfSB0UmVtb3ZlS2V5Q21kOworCit0eXBlZGVmIHN0cnVjdCB0YWdXbVN0YXR1c0NoYW5nZUNtZCAKK3sKKyAgICBlQ3NyUm9hbVdtU3RhdHVzQ2hhbmdlVHlwZXMgVHlwZTsKKyAgICB1bmlvbiAKKyAgICB7ICAgIAorICAgICAgICB0U2lyU21lRGVhdXRoSW5kICAgRGVhdXRoSW5kTXNnOworICAgICAgICB0U2lyU21lRGlzYXNzb2NJbmQgRGlzYXNzb2NJbmRNc2c7CisgICAgfXU7ICAgIAorCit9dFdtU3RhdHVzQ2hhbmdlQ21kOworCit0eXBlZGVmIHN0cnVjdCB0YWdBZGRTdGFGb3JTZXNzaW9uQ21kCit7CisgICAvL1Nlc3Npb24gc2VsZiBtYWMgYWRkcgorICAgdFNpck1hY0FkZHIgc2VsZk1hY0FkZHI7Cit9dEFkZFN0YUZvclNlc3Npb25DbWQ7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0RlbFN0YUZvclNlc3Npb25DbWQKK3sKKyAgIC8vU2Vzc2lvbiBzZWxmIG1hYyBhZGRyCisgICB0U2lyTWFjQWRkciBzZWxmTWFjQWRkcjsKKyAgIGNzclJvYW1TZXNzaW9uQ2xvc2VDYWxsYmFjayBjYWxsYmFjazsKKyAgIHZvaWQgKnBDb250ZXh0OworfXREZWxTdGFGb3JTZXNzaW9uQ21kOworCisvL1RoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgb25lIHNjYW4gcmVxdWVzdAordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ21kCit7CisgICAgdExpc3RFbGVtIExpbms7CisgICAgZUNzclJvYW1Db21tYW5kcyBjb21tYW5kOworICAgIHRBTklfVTggc2Vzc2lvbklkOyAgICAgICAgICAgICAgLy8gU2Vzc2lvbiBJRCBmb3IgdGhpcyBjb21tYW5kCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHRTY2FuQ21kIHNjYW5DbWQ7CisgICAgICAgIHRSb2FtQ21kIHJvYW1DbWQ7CisgICAgICAgIHRXbVN0YXR1c0NoYW5nZUNtZCB3bVN0YXR1c0NoYW5nZUNtZDsKKyAgICAgICAgdFNldEtleUNtZCBzZXRLZXlDbWQ7CisgICAgICAgIHRSZW1vdmVLZXlDbWQgcmVtb3ZlS2V5Q21kOworICAgICAgICB0QWRkU3RhRm9yU2Vzc2lvbkNtZCBhZGRTdGFTZXNzaW9uQ21kOworICAgICAgICB0RGVsU3RhRm9yU2Vzc2lvbkNtZCBkZWxTdGFTZXNzaW9uQ21kOworICAgIH11OworfXRDc3JDbWQ7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyMTFyQ29uZmlnCit7CisgICAgdEFOSV9CT09MRUFOICAgSXNGVFJlc291cmNlUmVxU3VwcG9ydGVkOworfSB0Q3NyMTFyQ29uZmlnOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyTmVpZ2hib3JSb2FtQ29uZmlnCit7CisgICAgdEFOSV9VMzIgICAgICAgbk5laWdoYm9yU2NhblRpbWVyUGVyaW9kOworICAgIHRBTklfVTggICAgICAgIG5OZWlnaGJvckxvb2t1cFJzc2lUaHJlc2hvbGQ7CisgICAgdEFOSV9VOCAgICAgICAgbk5laWdoYm9yUmVhc3NvY1Jzc2lUaHJlc2hvbGQ7CisgICAgdEFOSV9VMTYgICAgICAgbk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lOworICAgIHRBTklfVTE2ICAgICAgIG5OZWlnaGJvclNjYW5NYXhDaGFuVGltZTsKKyAgICBzQ3NyQ2hhbm5lbCAgICBuZWlnaGJvclNjYW5DaGFuTGlzdDsKKyAgICB0QU5JX1U4ICAgICAgICBuTWF4TmVpZ2hib3JSZXRyaWVzOworICAgIHRBTklfVTE2ICAgICAgIG5OZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kOworfXRDc3JOZWlnaGJvclJvYW1Db25maWc7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ29uZmlnCit7CisgICAgdEFOSV9VMzIgYWdpbmdDb3VudDsKKyAgICB0QU5JX1UzMiBGcmFnbWVudGF0aW9uVGhyZXNob2xkOworICAgIHRBTklfVTMyIGNoYW5uZWxCb25kaW5nTW9kZTI0R0h6OworICAgIHRBTklfVTMyIGNoYW5uZWxCb25kaW5nTW9kZTVHSHo7CisgICAgdEFOSV9VMzIgUlRTVGhyZXNob2xkOworICAgIGVDc3JQaHlNb2RlIHBoeU1vZGU7CisgICAgZUNzckNmZ0RvdDExTW9kZSB1Q2ZnRG90MTFNb2RlOworICAgIGVDc3JCYW5kIGVCYW5kOworICAgIHRBTklfVTMyIEhlYXJ0YmVhdFRocmVzaDUwOworICAgIHRBTklfVTMyIEhlYXJ0YmVhdFRocmVzaDI0OworICAgIHRBTklfVTMyIGJnU2NhbkludGVydmFsOworICAgIGVDc3JDQkNob2ljZSBjYkNob2ljZTsKKyAgICBlQ3NyQmFuZCBiYW5kQ2FwYWJpbGl0eTsgICAgIC8vaW5kaWNhdGUgaHcgY2FwYWJpbGl0eQorICAgIGVDc3JSb2FtV21tVXNlck1vZGVUeXBlIFdNTVN1cHBvcnRNb2RlOworICAgIHRBTklfQk9PTEVBTiBJczExZVN1cHBvcnRFbmFibGVkOworICAgIHRBTklfQk9PTEVBTiBJczExZFN1cHBvcnRFbmFibGVkOworICAgIHRBTklfQk9PTEVBTiBJczExZFN1cHBvcnRFbmFibGVkT3JpZ2luYWw7CisgICAgdEFOSV9CT09MRUFOIElzMTFoU3VwcG9ydEVuYWJsZWQ7CisgICAgdEFOSV9CT09MRUFOIHNob3J0U2xvdFRpbWU7CisgICAgdEFOSV9CT09MRUFOIFByb3ByaWV0YXJ5UmF0ZXNFbmFibGVkOworICAgIHRBTklfQk9PTEVBTiAgZmVuYWJsZU1DQ01vZGU7CisgICAgdEFOSV9VMTYgVHhSYXRlOworICAgIHRBTklfVTggQWRIb2NDaGFubmVsMjQ7CisgICAgdEFOSV9VOCBBZEhvY0NoYW5uZWw1RzsKKyAgICB0QU5JX1UzMiBpbXBzU2xlZXBUaW1lOyAgICAgLy9pbiB1bml0cyBvZiBtaWNyb3NlY29uZHMKKyAgICB0QU5JX1UzMiBzY2FuQWdlVGltZU5DTlBTOyAgLy9zY2FuIHJlc3VsdCBhZ2luZyB0aW1lIHRocmVzaG9sZCB3aGVuIE5vdC1Db25uZWN0LU5vLVBvd2VyLVNhdmUsIGluIHNlY29uZHMKKyAgICB0QU5JX1UzMiBzY2FuQWdlVGltZU5DUFM7ICAgLy9zY2FuIHJlc3VsdCBhZ2luZyB0aW1lIHRocmVzaG9sZCB3aGVuIE5vdC1Db25uZWN0LVBvd2VyLVNhdmUsIGluIHNlY29uZHMKKyAgICB0QU5JX1UzMiBzY2FuQWdlVGltZUNOUFM7ICAgLy9zY2FuIHJlc3VsdCBhZ2luZyB0aW1lIHRocmVzaG9sZCB3aGVuIENvbm5lY3QtTm8tUG93ZXItU2F2ZSwgaW4gc2Vjb25kcywKKyAgICB0QU5JX1UzMiBzY2FuQWdlVGltZUNQUzsgICAvL3NjYW4gcmVzdWx0IGFnaW5nIHRpbWUgdGhyZXNob2xkIHdoZW4gQ29ubmVjdC1Qb3dlci1TYXZlaW4gc2Vjb25kcworICAgIHRBTklfVTMyIEJzc1ByZWZlclZhbHVlW0NTUl9OVU1fUlNTSV9DQVRdOyAgLy9lYWNoIFJTU0kgY2F0ZWdvcnkgaGFzIG9uZSB2YWx1ZQorICAgIGludCBSU1NJQ2F0W0NTUl9OVU1fUlNTSV9DQVRdOworICAgIHRBTklfVTggYkNhdFJzc2lPZmZzZXQ7ICAgICAvL3RvIHNldCB0aGUgUlNTSSBkaWZmZXJlbmNlIGZvciBlYWNoIGNhdGVnb3J5CisgICAgdEFOSV9VMzIgblJvYW1pbmdUaW1lOyAgLy9JbiBzZWNvbmRzLCBDU1Igd2lsbCB0cnkgdGhpcyBsb25nIGJlZm9yZSBnaXZlcyB1cCwgMCBtZWFucyBubyByb2FtaW5nCisgICAgLy9XaGV0aGVyIHRvIGxpbWl0IHRoZSBjaGFubmVscyB0byB0aGUgb25lcyBzZXQgaW4gQ3NyMTFkSW5mby4gSWYgdHJ1ZSwgdGhlIG9wZXJ0YWlvbmFsCisgICAgLy9jaGFubmVscyBhcmUgbGltaXRlZCB0byB0aGUgZGVmYXVsdCBjaGFubmVsIGxpc3QuIEl0IGlzIGFuICJBTkQiIG9wZXJhdGlvbiBiZXR3ZWVuIHRoZSAKKyAgICAvL2RlZmF1bHQgY2hhbm5lbHMgYW5kIHRoZSBjaGFubmVscyBpbiB0aGUgODAyLjExZCBJRS4KKyAgICB0QU5JX0JPT0xFQU4gZkVuZm9yY2UxMWRDaGFubmVsczsgICAKKyAgICAvL0NvdW50cnkgQ29kZSBQcmlvcml0eQorICAgIC8vMCA9IDgwMi4xMUQgPiBDb25maWd1cmVkIENvdW50cnkgPiBOViAKKyAgICAvLzEgPSBDb25maWd1cmVkIENvdW50cnkgPiA4MDIuMTFEID4gTlYKKyAgICB0QU5JX0JPT0xFQU4gZlN1cHBsaWNhbnRDb3VudHJ5Q29kZUhhc1ByaW9yaXR5OworICAgIC8vV2hlbiB0cnVlLCBBUCB3aXRoIHVua25vd24gY291bnRyeSBjb2RlIHdvbid0IGJlIHNlZS4gCisgICAgLy8iVW5rbm93biBjb3VudHJ5IGNvZGUiIG1lYW5zIGVpdGhlciBBcCBkb2Vzbid0IGhhdmUgMTFkIElFIG9yIHdlIGNhbm5vdCAKKyAgICAvL2ZpbmQgYSBkb21haW4gZm9yIHRoZSBjb3VudHJ5IGNvZGUgaW4gaXRzIDExZCBJRS4KKyAgICB0QU5JX0JPT0xFQU4gZkVuZm9yY2VDb3VudHJ5Q29kZU1hdGNoOyAgCisgICAgLy9XaGVuIHRydWUsIG9ubHkgQVBzIGluIHRoZSBkZWZhdWx0IGRvbWFpbiBjYW4gYmUgc2Vlbi4gSWYgdGhlIEFwIGhhcyAidW5rbm93biBjb3VudHJ5CisgICAgLy9jb2RlIiwgb3IgdGhlIGRvYW1pbiBvZiB0aGUgY291bnRyeSBjb2RlIGRvZXNuJ3QgbWF0Y2ggdGhlIGRlZmF1bHQgZG9tYWluLCB0aGUgQXAgaXMKKyAgICAvL25vdCBhY2NlcHRhYmxlLgorICAgIHRBTklfQk9PTEVBTiBmRW5mb3JjZURlZmF1bHREb21haW47ICAgICAKKworICAgIHRBTklfVTE2IHZjY1Jzc2lUaHJlc2hvbGQ7CisgICAgdEFOSV9VMzIgdmNjVWxNYWNMb3NzVGhyZXNob2xkOworCisgICAgdEFOSV9VMzIgIG5QYXNzaXZlTWluQ2huVGltZTsgICAgLy9pbiB1bml0cyBvZiBtaWxsaXNlY29uZHMKKyAgICB0QU5JX1UzMiAgblBhc3NpdmVNYXhDaG5UaW1lOyAgICAvL2luIHVuaXRzIG9mIG1pbGxpc2Vjb25kcworICAgIHRBTklfVTMyICBuQWN0aXZlTWluQ2huVGltZTsgICAgIC8vaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzCisgICAgdEFOSV9VMzIgIG5BY3RpdmVNYXhDaG5UaW1lOyAgICAgLy9pbiB1bml0cyBvZiBtaWxsaXNlY29uZHMKKworICAgIHRBTklfQk9PTEVBTiBJc0lkbGVTY2FuRW5hYmxlZDsKKyAgICAvL2luIGRCbSwgdGhlIG1heGltdW0gVFggcG93ZXIKKyAgICAvL1RoZSBhY3R1YWwgVFggcG93ZXIgaXMgdGhlIGxlc3NlciBvZiB0aGlzIHZhbHVlIGFuZCAxMWQuIAorICAgIC8vSWYgMTFkIGlzIGRpc2FibGUsIHRoZSBsZXNzZXIgb2YgdGhpcyBhbmQgZGVmYXVsdCBzZXR0aW5nLgorICAgIHRBTklfVTggblR4UG93ZXJDYXA7CisgICAgdEFOSV9VMzIgIHN0YXRzUmVxUGVyaW9kaWNpdHk7ICAvL3N0YXRzIHJlcXVlc3QgZnJlcXVlbmN5IGZyb20gUEUgd2hpbGUgaW4gZnVsbCBwb3dlcgorICAgIHRBTklfVTMyICBzdGF0c1JlcVBlcmlvZGljaXR5SW5QUzsvL3N0YXRzIHJlcXVlc3QgZnJlcXVlbmN5IGZyb20gUEUgd2hpbGUgaW4gcG93ZXIgc2F2ZQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB0QU5JX1UzMiBkdGltUGVyaW9kOworICAgIHRBTklfQk9PTEVBTiAgICBzc2lkSGlkZGVuOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIHRDc3IxMXJDb25maWcgY3NyMTFyQ29uZmlnOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgdEFOSV9VOCAgIGlzQ2N4SW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICB0QU5JX1U4ICAgaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQ7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisgICAgdENzck5laWdoYm9yUm9hbUNvbmZpZyBuZWlnaGJvclJvYW1Db25maWc7CisjZW5kaWYKKworICAgIC8qIEluc3RlYWQgb2YgUmVhc3NvYywgc2VuZCBBRERUUy9ERUxUUyBldmVuIHdoZW4gQUNNIGlzIG9mZiBmb3IgdGhhdCBBQyAKKyAgICAgKiBUaGlzIGlzIG1hbmRhdGVkIGJ5IFdNTS1BQyBjZXJ0aWZpY2F0aW9uICovCisgICAgdEFOSV9CT09MRUFOIGFkZFRTV2hlbkFDTUlzT2ZmOworCisgICAgdEFOSV9CT09MRUFOIGZWYWxpZGF0ZUxpc3Q7CisgICAgdEFOSV9CT09MRUFOIGNvbmN1cnJlbmN5RW5hYmxlZDsKKworICAgIC8vVG8gZW5hYmxlL2Rpc2FibGUgc2Nhbm5pbmcgMi40R2h6IGNoYW5uZWxzIHR3aWNlIG9uIGEgc2luZ2xlIHNjYW4gcmVxdWVzdCBmcm9tIEhERAorICAgIHRBTklfQk9PTEVBTiBmU2NhblR3aWNlOworCit9dENzckNvbmZpZzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ2hhbm5lbFBvd2VySW5mbyAKK3sKKyAgICB0TGlzdEVsZW0gbGluazsKKyAgICB0QU5JX1U4IGZpcnN0Q2hhbm5lbDsKKyAgICB0QU5JX1U4IG51bUNoYW5uZWxzOworICAgIHRBTklfVTggdHhQb3dlcjsKKyAgICB0QU5JX1U4IGludGVyQ2hhbm5lbE9mZnNldDsKK310Q3NyQ2hhbm5lbFBvd2VySW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUm9hbUpvaW5TdGF0dXMKK3sKKyAgICB0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZTsKKyAgICAvL3RoaXMgaXMgc2V0IHRvIHVuc3BlY2lmaWVkIGlmIHN0YXR1c0NvZGUgaW5kaWNhdGVzIHRpbWVvdXQuIE9yIGl0IGlzIHRoZSBmYWlsZWQgcmVhc29uIGZyb20gdGhlIG90aGVyIEJTUyhwZXIgODAyLjExIHNwZWMpCisgICAgdEFOSV9VMzIgcmVhc29uQ29kZTsgICAgCit9dENzclJvYW1Kb2luU3RhdHVzOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JPc0NoYW5uZWxNYXNrCit7CisgICAgdEFOSV9VOCBudW1DaGFubmVsczsKKyAgICB0QU5JX0JPT0xFQU4gc2NhbkVuYWJsZWRbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKKyAgICB0QU5JX1U4IGNoYW5uZWxMaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07Cit9dENzck9zQ2hhbm5lbE1hc2s7CisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU2NhblN0cnVjdAoreworICAgIHRTY2FuUHJvZmlsZSBzY2FuUHJvZmlsZTsKKyAgICB0QU5JX1UzMiBuZXh0U2NhbklEOworICAgIHREYmxMaW5rTGlzdCBzY2FuUmVzdWx0TGlzdDsKKyAgICB0RGJsTGlua0xpc3QgdGVtcFNjYW5SZXN1bHRzOworICAgIHRBTklfQk9PTEVBTiBmU2NhbkVuYWJsZTsKKyAgICB0QU5JX0JPT0xFQU4gZkZ1bGxTY2FuSXNzdWVkOworICAgIHRQYWxUaW1lckhhbmRsZSBoVGltZXJHZXRSZXN1bHQ7CisjaWZkZWYgV0xBTl9BUF9TVEFfQ09OQ1VSUkVOQ1kKKyAgICB0UGFsVGltZXJIYW5kbGUgaFRpbWVyU3RhQXBDb25jVGltZXI7CisjZW5kaWYKKyAgICB0UGFsVGltZXJIYW5kbGUgaFRpbWVySWRsZVNjYW47CisgICAgdFBhbFRpbWVySGFuZGxlIGhUaW1lclJlc3VsdEFnaW5nOworICAgIHRQYWxUaW1lckhhbmRsZSBoVGltZXJCZ1NjYW47CisgICAgLy9jaGFuZ2VzIG9uIGV2ZXJ5IHNjYW4sIGl0IGlzIHVzZWQgYXMgYSBmbGFnIGZvciB3aGV0aGVyIDExZCBpbmZvIGlzIGZvdW5kIG9uIGV2ZXJ5IHNjYW4KKyAgICB0QU5JX1U4IGNoYW5uZWxPZjExZEluZm87ICAgCisgICAgLy9jaGFuZ2VzIG9uIGV2ZXJ5IHNjYW4sIGEgZmxhZyB0byB0ZWxsIHdoZXRoZXIgY29uZmxpY3QgMTFkIGluZm8gZm91bmQgb24gZWFjaCBCU1MKKyAgICB0QU5JX0JPT0xFQU4gZkFtYmlndW91czExZEluZm9Gb3VuZDsgICAgCisgICAgLy9UdXNoOiBjaGFuZ2VzIG9uIGV2ZXJ5IHNjYW4sIGEgZmxhZyB0byB0ZWxsIHdoZXRoZXIgdGhlIGFwcGxpZWQgMTFkIGluZm8gcHJlc2VudCBpbiBvbmUgb2YgdGhlIHNjYW4gcmVzdWx0cworICAgIHRBTklfQk9PTEVBTiBmQ3VycmVudDExZEluZm9NYXRjaDsgICAgCisgICAgdEFOSV9CT09MRUFOIGYxMWRJbmZvUmVzZXQ7ICAgICAvL3RvIGluZGljYXRlIHdoZXRoZXIgdGhlIDExZCBpbmZvIGluIENGRyBpcyByZXNldCB0byBkZWZhdWx0CisgICAgdFNpclNjYW5UeXBlIGN1clNjYW5UeXBlOworICAgIHRDc3JDaGFubmVsIGJhc2VDaGFubmVsczsgICAvL1RoaXMgYXJlIGFsbCB0aGUgc3VwcG9ydGVkIGNoYW5uZWxzIEFORCgmKSB0byB0aGUgY3VycmVudCBlQmFuZAorICAgIHRDc3JDaGFubmVsIGNoYW5uZWxzMTFkOworICAgIHRDaGFubmVsTGlzdFdpdGhQb3dlciBkZWZhdWx0UG93ZXJUYWJsZVtXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOyAvL0Zyb20gTlYKKyAgICB0Q2hhbm5lbExpc3RXaXRoUG93ZXIgZGVmYXVsdFBvd2VyVGFibGU0ME1IeltXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOyAvL0Zyb20gTlYKKyAgICB0QU5JX1UzMiBudW1DaGFubmVsc0RlZmF1bHQ7IC8vdG90YWwgY2hhbm5lbHMgb2YgTlYKKyAgICB0Q3NyQ2hhbm5lbCBiYXNlMjBNSHpDaGFubmVsczsgICAvL1RoZSBjaGFubmVsIGJhc2UgdG8gd29yayBvbgorICAgIHRDc3JDaGFubmVsIGJhc2U0ME1IekNoYW5uZWxzOyAgIC8vY2VudGVyIGNoYW5uZWxzIGZvciA0ME1IeiBjaGFubmVscworICAgIHREYmxMaW5rTGlzdCBjaGFubmVsUG93ZXJJbmZvTGlzdDI0OworICAgIHREYmxMaW5rTGlzdCBjaGFubmVsUG93ZXJJbmZvTGlzdDVHOworICAgIHRBTklfVTMyIG5MYXN0QWdlVGltZU91dDsKKyAgICB0QU5JX1UzMiBuQWdpbmdDb3VudERvd247CisgICAgdEFOSV9VOCBjb3VudHJ5Q29kZURlZmF1bHRbV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKzFdOyAgICAgLy9UaGUgY291bnRyeSBjb2RlIGZyb20gTlYKKyAgICB0QU5JX1U4IGNvdW50cnlDb2RlQ3VycmVudFtXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4rMV07CisgICAgdEFOSV9VOCBjb3VudHJ5Q29kZTExZFtXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4rMV07CisgICAgdl9SRUdET01BSU5fdCBkb21haW5JZERlZmF1bHQ7ICAvL2RlZmF1bHQgcmVndWxhdG9yeSBkb21haW4KKyAgICB2X1JFR0RPTUFJTl90IGRvbWFpbklkQ3VycmVudDsgIC8vY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbgorICAgIHRBTklfQk9PTEVBTiBmMTFkSW5mb0FwcGxpZWQ7CisgICAgdEFOSV9CT09MRUFOIGZDYW5jZWxJZGxlU2NhbjsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorLy8gICAgdEFOSV9VMTYgTnVtQmtpZENhbmRpZGF0ZTsKKy8vICAgIHRCa2lkQ2FuZGlkYXRlSW5mbyBCa2lkQ2FuZGlkYXRlSW5mb1tDU1JfTUFYX0JLSURfQUxMT1dFRF07IC8qIE1vdmUgdGhpcyBhcyBwYXJ0IG9mIFNlc3Npb25FbnRyeSAqLworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisgICAgdEFOSV9VOCBudW1CR1NjYW5DaGFubmVsOyAgIC8vbnVtYmVyIG9mIHZhbGlkIGNoYW5uZWxzIGluIHRoZSBiZ1NjYW5DaGFubmVsTGlzdAorICAgIHRBTklfVTggYmdTY2FuQ2hhbm5lbExpc3RbV05JX0NGR19CR19TQ0FOX0NIQU5ORUxfTElTVF9MRU5dOworICAgIC8vdGhlIENoYW5uZWxJbmZvIG1lbWJlciBpcyBub3QgdXNlZCBpbiB0aGlzIHN0cnVjdHVyZS4KKyAgICAvL251bUJHU2NhbkNoYW5uZWwgYW5kIGJnU2NhbkNoYW5uZWxMaXN0IGFyZSB1c2VkIGZvciB0aGUgQkcgc2NhbiBjaGFubmVsIGluZm8KKyAgICB0Q3NyQkdTY2FuUmVxdWVzdCBiZ1NjYW5QYXJhbXM7ICAKKyAgICB0QU5JX0JPT0xFQU4gZlJlc3RhcnRJZGxlU2NhbjsKKyAgICB0QU5JX1UzMiBuSWRsZVNjYW5UaW1lR2FwOyAgLy90aGUgdGltZSBzaW5jZSBsYXN0IHRyeWluZyB0byB0cmlnZ2VyIGlkbGUgc2NhbgorICAgIHRDc3JPc0NoYW5uZWxNYXNrIG9zU2NhbkNoYW5uZWxNYXNrOy8va2VlcCBhIHRyYWNrIG9mIGNoYW5uZWxzIHRvIGJlIHNjbm5lZCB3aGlsZSBpbiB0cmFmZmljIGNvbmRpdGlvbgorICAgIHRBTklfVTE2IG5Cc3NMaW1pdDsgLy90aGUgbWF4aW11bSBudW1iZXIgb2YgQlNTIGluIHNjYW4gY2FjaGUKKyAgICAvKmNoYW5uZWxQb3dlckluZm9MaXN0MjQgaGFzIGJlZW4gc2VlbiBjb3JydXB0ZWQuIFNldCB0aGlzIGZsYWcgdG8gdHJ1ZSB0cnlpbmcgdG8gCisgICAgKiBkZXRlY3Qgd2hlbiBpdCBoYXBwZW5zLiBBZGRpbmcgdGhpcyBpbnRvIGNvZGUgYmVjYXVzZSB3ZSBjYW4ndCByZXByb2R1Y2UgaXQgZWFzaWx5LgorICAgICogV2UgZG9uJ3Qga25vdyB3aGVuIGl0IGhhcHBlbnMuICovCisgICAgdEFOSV9CT09MRUFOIGZWYWxpZGF0ZUxpc3Q7CisgICAgLypDdXN0b21lciB3YW50cyB0byBzdGFydCB3aXRoIGFuIGFjdGl2ZSBzY2FuIGJhc2VkIG9uIHRoZSBkZWZhdWx0IGNvdW50cnkgY29kZS4KKyAgICAqIFRoaXMgb3B0aW1pemF0aW9uIHdpbGwgbWluaW1pemUgdGhlIGRyaXZlciBsb2FkIHRvIGFzc29jaWF0aW9uIHRpbWUuCisgICAgKiBCYXNlZCBvbiB0aGlzIGZsYWcgd2Ugd2lsbCBieXBhc3MgdGhlIGluaXRpYWwgcGFzc2l2ZSBzY2FuIG5lZWRlZCBmb3IgMTFkCisgICAgKiB0byBkZXRlcm1pbmUgdGhlIGNvdW50cnkgY29kZSAmIGRvbWFpbiAqLworICAgIHRBTklfQk9PTEVBTiBmRW5hYmxlQnlwYXNzMTFkOworCisgICAgLypDdXN0b21lciB3YW50cyB0byBvcHRpbWl6ZSB0aGUgc2NhbiB0aW1lLiBBdm9pZGluZyBzY2FucyhwYXNzaXZlKSBvbiBERlMgCisgICAgKiBjaGFubmVscyB3aGlsZSBzd2lwcGluZyB0aHJvdWdoIGJvdGggYmFuZHMgY2FuIHNhdmUgc29tZSB0aW1lIAorICAgICogKGFwcHJ4IDEuMyBzZWMpICovCisgICAgdEFOSV9CT09MRUFOIGZFbmFibGVERlNDaG5sU2NhbjsKKworICAgIHRBTklfQk9PTEVBTiBmRHJvcFNjYW5DbWQ7IC8vdHJ1ZSBtZWFucyB3ZSBkb24ndCBhY2NlcHQgc2NhbiBjb21tYW5kcworCisjaWZkZWYgV0xBTl9BUF9TVEFfQ09OQ1VSUkVOQ1kKKyAgICB0RGJsTGlua0xpc3Qgc2NhbkNtZFBlbmRpbmdMaXN0OworI2VuZGlmICAgIAorfXRDc3JTY2FuU3RydWN0OworCisKKy8vU2F2ZSB0aGUgY29ubmVjdGVkIGluZm9ybWF0aW9uLiBUaGlzIHN0cnVjdHVyZSArIGNvbm5lY3RlZFByb2ZpbGUKKy8vc2hvdWxkIGNvbnRhaW4gYWxsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25uZWN0aW9uCit0eXBlZGVmIHN0cnVjdCB0YWdSb2FtQ3NyQ29ubmVjdGVkSW5mbworeworICAgIHRBTklfVTMyIG5CZWFjb25MZW5ndGg7IC8vdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBiZWFjb24gZnJhbWUsIGNhbiBiZSAwCisgICAgdEFOSV9VMzIgbkFzc29jUmVxTGVuZ3RoOyAgIC8vdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBhc3NvYyByZXEgZnJhbWUsIGNhbiBiZSAwCisgICAgdEFOSV9VMzIgbkFzc29jUnNwTGVuZ3RoOyAgIC8vVGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBhc3NvYyByc3AgZnJhbWUsIGNhbiBiZSAwCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICB0QU5JX1UzMiBuUklDUnNwTGVuZ3RoOyAvL0xlbmd0aCBvZiB0aGUgcGFyc2VkIFJJQyByZXNwb25zZSBJRXMgcmVjZWl2ZWQgaW4gcmVhc3NvYyByZXNwb25zZQorI2VuZGlmICAgIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICB0QU5JX1UzMiBuVHNwZWNJZUxlbmd0aDsKKyNlbmRpZiAgICAKKyAgICB0QU5JX1U4ICpwYkZyYW1lczsgIC8vUG9pbnQgdG8gYSBidWZmZXIgY29udGFpbiB0aGUgYmVhY29uLCBhc3NvYyByZXEsIGFzc29jIHJzcCBmcmFtZSwgaW4gdGhhdCBvcmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy91c2VyIG5lZWRzIHRvIHVzZSBuQmVhY29uTGVuZ3RoLCBuQXNzb2NSZXFMZW5ndGgsIG5Bc3NvY1JzcExlbmd0aCB0byBkZXNpY2Ugd2hlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZWFjaCBmcmFtZSBzdGFydHMgYW5kIGVuZHMuCisgICAgdEFOSV9VOCBzdGFJZDsKK310Q3NyUm9hbUNvbm5lY3RlZEluZm87CisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyTGlua1F1YWxpdHlJbmRJbmZvCit7ICAgCisgICBjc3JSb2FtTGlua1F1YWxpdHlJbmRDYWxsYmFjayAgY2FsbGJhY2s7CisgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dDsKK310Q3NyTGlua1F1YWxpdHlJbmRJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JQZVN0YXRzUmVxSW5mbworeworICAgdExpc3RFbGVtICAgICAgICAgICAgICBsaW5rOyAgLyogbGlzdCBsaW5rcyAqLworICAgdEFOSV9VMzIgICAgICAgICAgICAgICBzdGF0c01hc2s7CisgICB0QU5JX1UzMiAgICAgICAgICAgICAgIHBlcmlvZGljaXR5OworICAgdEFOSV9CT09MRUFOICAgICAgICAgICByc3BQZW5kaW5nOworICAgdm9zX3RpbWVyX3QgICAgICAgICAgICBoUGVTdGF0c1RpbWVyOworICAgdEFOSV9CT09MRUFOICAgICAgICAgICB0aW1lclJ1bm5pbmc7CisgICB0QU5JX1U4ICAgICAgICAgICAgICAgIHN0YUlkOworICAgdEFOSV9VOCAgICAgICAgICAgICAgICBudW1DbGllbnQ7CisgICB0cEFuaVNpckdsb2JhbCAgICAgICAgIHBNYWM7CisgICAvKiBUbyByZW1lbWJlciBpZiB0aGUgcGVTdGF0cyB0aW1lciBpcyBzdG9wcGVkIHN1Y2Nlc3NmdWxseSBvciBub3QgKi8gICAKKyAgIHRBTklfQk9PTEVBTiAgICAgICAgICAgdGltZXJTdG9wRmFpbGVkOworCit9dENzclBlU3RhdHNSZXFJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JTdGF0c0NsaWVudFJlcUluZm8KK3sKKyAgIHRMaXN0RWxlbSAgICAgICAgICAgICAgbGluazsgIC8qIGxpc3QgbGlua3MgKi8KKyAgIGVDc3JTdGF0c1JlcXVlc3RlclR5cGUgcmVxdWVzdGVySWQ7CisgICB0Q3NyU3RhdHNDYWxsYmFjayAgICAgIGNhbGxiYWNrOworICAgdEFOSV9VMzIgICAgICAgICAgICAgICBwZXJpb2RpY2l0eTsKKyAgIHZvaWQgICAgICAgICAgICAgICAgICAqcENvbnRleHQ7CisgICB0QU5JX1UzMiAgICAgICAgICAgICAgIHN0YXRzTWFzazsKKyAgIHRDc3JQZVN0YXRzUmVxSW5mbyAgICAqcFBlU3RhRW50cnk7CisgICB0QU5JX1U4ICAgICAgICAgICAgICAgIHN0YUlkOworICAgdm9zX3RpbWVyX3QgICAgICAgICAgICB0aW1lcjsKKyAgIHRBTklfQk9PTEVBTiAgICAgICAgICAgdGltZXJFeHBpcmVkOworICAgdHBBbmlTaXJHbG9iYWwgICAgICAgICBwTWFjOyAvLyBUT0RPOiBDb25maXJtIHRoaXMgY2hhbmdlIEJUQU1QCit9dENzclN0YXRzQ2xpZW50UmVxSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyVGxTdGF0c1JlcUluZm8KK3sKKyAgIHRBTklfVTMyICAgICAgICAgICAgICAgcGVyaW9kaWNpdHk7CisgICB0QU5JX0JPT0xFQU4gICAgICAgICAgIHRpbWVyUnVubmluZzsKKyAgIHRQYWxUaW1lckhhbmRsZSAgICAgICAgaFRsU3RhdHNUaW1lcjsKKyAgIHRBTklfVTggICAgICAgICAgICAgICAgbnVtQ2xpZW50OworfXRDc3JUbFN0YXRzUmVxSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyUm9hbVNlc3Npb24KK3sKKyAgICB0QU5JX1U4IHNlc3Npb25JZDsgICAgICAgICAgICAgLy8gU2Vzc2lvbiBJRAorICAgIHRBTklfQk9PTEVBTiBzZXNzaW9uQWN0aXZlOyAgICAgIC8vIFRSVUUgaWYgaXQgaXMgdXNlZAorICAgIHRDc3JCc3NpZCBzZWxmTWFjQWRkcjsgICAgICAgICAgIC8vIEZvciBCVC1BTVAgc3RhdGlvbiwgdGhpcyBzZXJ2ZSBhcyBCU1NJRCBmb3Igc2VsZi1CU1MuCisgICAgY3NyUm9hbUNvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2s7CisgICAgdm9pZCAqcENvbnRleHQ7CisgICAgZUNzckNvbm5lY3RTdGF0ZSBjb25uZWN0U3RhdGU7CisgICAgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlIGNvbm5lY3RlZFByb2ZpbGU7CisgICAgdENzclJvYW1Db25uZWN0ZWRJbmZvIGNvbm5lY3RlZEluZm87CisgICAgdENzclJvYW1Qcm9maWxlICpwQ3VyUm9hbVByb2ZpbGU7ICAgCisgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQ29ubmVjdEJzc0Rlc2M7CisgICAgdEFOSV9VMTYgTnVtUG1raWRDYWNoZTsKKyAgICB0UG1raWRDYWNoZUluZm8gUG1raWRDYWNoZUluZm9bQ1NSX01BWF9QTUtJRF9BTExPV0VEXTsKKyAgICB0QU5JX1U4IGNKb2luQXR0ZW1wczsKKyAgICAvL1RoaXMgbWF5IG9yIG1heSBub3QgaGF2ZSB0aGUgdXAtdG8tZGF0ZSB2YWxpZCBjaGFubmVsIGxpc3QKKyAgICAvL0l0IGlzIHVzZWQgdG8gZ2V0IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUIGFuZCBub3QgYWxsb2NhdGUgbWVtb3J5IGFsbCB0aGUgdGltZQorICAgIHRTaXJNYWNDaGFuTnVtIHZhbGlkQ2hhbm5lbExpc3RbV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKKyAgICB0QU5JX1MzMiBzUGVuZGluZ0NvbW1hbmRzOyAgICAvLzAgbWVhbnMgQ1NSIGlzIG9rIHRvIGxvdyBwb3dlcgorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgdEFOSV9VMTYgTnVtQmtpZENhY2hlOworICAgIHRCa2lkQ2FjaGVJbmZvIEJraWRDYWNoZUluZm9bQ1NSX01BWF9CS0lEX0FMTE9XRURdOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisgICAgdEFOSV9CT09MRUFOIGZSb2FtaW5nOyAgLy9pbmRpY2F0ZSB3aGV0aGVyIENTUiBpcyByb2FtaW5nIChlaXRoZXIgdmlhIGxvc3RsaW5rIG9yIGR5bmFtaWMgcm9hbWluZykKKyAgICAvL3RvIHJlbWVtYmVyIHNvbWUgcGFyYW1ldGVycyBuZWVkZWQgZm9yIFNUQVJUX0JTUy4KKyAgICAvL0FsbCBtZW1iZXIgbXVzdCBiZSBzZXQgZXZlcnkgdGltZSB3ZSB0cnkgdG8gam9pbiBvciBzdGFydCBhbiBJQlNTIG9yIEJULUFNUAorICAgIHRDc3JSb2FtU3RhcnRCc3NQYXJhbXMgYnNzUGFyYW1zOyAgIAorICAgIHRBTklfVTMyIG5XcGFSc25SZXFJZUxlbmd0aDsgICAvL3RoZSBieXRlIGNvdW50IG9mIHBXcGFSc25JRTsKKyAgICB0QU5JX1U4ICpwV3BhUnNuUmVxSUU7IC8vdGhpcyBjb250YWluIHRoZSBXUEEvUlNOIElFIGluIGFzc29jIHJlcXVlc3Qgb3IgdGhlIG9uZSBzZW50IGluIGJlYWNvbiAoSUJTUykKKyAgICB0QU5JX1UzMiBuV3BhUnNuUnNwSWVMZW5ndGg7ICAgIC8vdGhlIGJ5dGUgY291bnQgZm9yIHBXcGFSc25Sc3BJRQorICAgIHRBTklfVTggKnBXcGFSc25Sc3BJRTsgIC8vdGhpcyBjb250YWluIHRoZSBXUEEvUlNOIElFIGluIGJlYWNvbi9wcm9iZSByc3AKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgIHRBTklfVTMyIG5XYXBpUmVxSWVMZW5ndGg7ICAgLy90aGUgYnl0ZSBjb3VudCBvZiBwV2FwaVJlcUlFOworICAgIHRBTklfVTggKnBXYXBpUmVxSUU7IC8vdGhpcyBjb250YWluIHRoZSBXQVBJIElFIGluIGFzc29jIHJlcXVlc3Qgb3IgdGhlIG9uZSBzZW50IGluIGJlYWNvbiAoSUJTUykKKyAgICB0QU5JX1UzMiBuV2FwaVJzcEllTGVuZ3RoOyAgICAvL3RoZSBieXRlIGNvdW50IGZvciBwV2FwaVJzcElFCisgICAgdEFOSV9VOCAqcFdhcGlSc3BJRTsgIC8vdGhpcyBjb250YWluIHRoZSBXQVBJIElFIGluIGJlYWNvbi9wcm9iZSByc3AKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworICAgIHRBTklfVTMyIG5BZGRJRVNjYW5MZW5ndGg7ICAvL3RoZSBieXRlIGNvdW50IG9mIHBBZGRJZVNjYW5JRTsKKyAgICB0QU5JX1U4ICpwQWRkSUVTY2FuOyAvL3RoaXMgY29udGFpbnMgdGhlIGFkZGl0aW9uYWwgSUUgaW4gKHVuaWNhc3QpIHByb2JlIHJlcXVlc3QgYXQgdGhlIHRpbWUgb2Ygam9pbgorICAgIHRBTklfVTMyIG5BZGRJRUFzc29jTGVuZ3RoOyAgICAgIC8vdGhlIGJ5dGUgY291bnQgZm9yIHBBZGRJZUFzc29jSUUKKyAgICB0QU5JX1U4ICpwQWRkSUVBc3NvYzsgLy90aGlzIGNvbnRhaW5zIHRoZSBhZGRpdGlvbmFsIElFIGluIChyZSkgYXNzb2MgcmVxdWVzdAorCisgICAgdEFOSV9USU1FU1RBTVAgcm9hbWluZ1N0YXJ0VGltZTsgICAgLy9pbiB1bml0cyBvZiAxMG1zCisgICAgdENzclRpbWVySW5mbyByb2FtaW5nVGltZXJJbmZvOworICAgIGVDc3JSb2FtaW5nUmVhc29uIHJvYW1pbmdSZWFzb247CisgICAgdEFOSV9CT09MRUFOIGZDYW5jZWxSb2FtaW5nOworICAgIHRQYWxUaW1lckhhbmRsZSBoVGltZXJSb2FtaW5nOworICAgIHRQYWxUaW1lckhhbmRsZSBoVGltZXJJYnNzSm9pbmluZzsKKyAgICB0Q3NyVGltZXJJbmZvIGlic3NKb2luVGltZXJJbmZvOworICAgIHRBTklfQk9PTEVBTiBpYnNzX2pvaW5fcGVuZGluZzsKKyAgICBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0OyAgLy90aGUgcm9hbVJlc3VsdCB0aGF0IGlzIHVzZWQgd2hlbiB0aGUgcm9hbWluZyB0aW1lciBmaXJlcworICAgIHRDc3JSb2FtSm9pblN0YXR1cyBqb2luRmFpbFN0YXR1c0NvZGU7ICAgIC8vVGhpcyBpcyB0aGUgcmVhc29uIGNvZGUgZm9yIGpvaW4oYXNzb2MpIGZhaWx1cmUKKyAgICAvL1RoZSBzdGF0dXMgY29kZSByZXR1cm5lZCBmcm9tIFBFIGZvciBkZWF1dGggb3IgZGlzYXNzb2MgKGluIGNhc2Ugb2YgbG9zdGxpbmspLCBvciBvdXIgb3duIGR5bmFtaWMgcm9hbWluZworICAgIHRBTklfVTMyIHJvYW1pbmdTdGF0dXNDb2RlOyAgICAgCisgICAgdEFOSV9VMTYgTnVtUG1raWRDYW5kaWRhdGU7CisgICAgdFBta2lkQ2FuZGlkYXRlSW5mbyBQbWtpZENhbmRpZGF0ZUluZm9bQ1NSX01BWF9QTUtJRF9BTExPV0VEXTsKKyAjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICB0QU5JX1UxNiBOdW1Ca2lkQ2FuZGlkYXRlOworICAgIHRCa2lkQ2FuZGlkYXRlSW5mbyBCa2lkQ2FuZGlkYXRlSW5mb1tDU1JfTUFYX0JLSURfQUxMT1dFRF07IAorI2VuZGlmCisgICAgdEFOSV9CT09MRUFOIGZXTU1Db25uZWN0aW9uOworI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorICAgIC8vVG8gcmV0cnkgYSBqb2luIGxhdGVyIHdoZW4gaXQgZmFpbHMgaWYgc28gZGVzaXJlZAorICAgIHRQYWxUaW1lckhhbmRsZSBoVGltZXJKb2luUmV0cnk7CisgICAgdENzclRpbWVySW5mbyBqb2luUmV0cnlUaW1lckluZm87CisgICAgdEFOSV9VMzIgbWF4UmV0cnlDb3VudDsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICB0Q3NyQ2N4Q2NrbUluZm8gY2N4Q2NrbUluZm87CisgICAgdEFOSV9CT09MRUFOIGlzUHJldkFwSW5mb1ZhbGlkOworICAgIHRTaXJNYWNTU2lkIHByZXZBcFNTSUQ7CisgICAgdENzckJzc2lkIHByZXZBcEJzc2lkOworICAgIHRBTklfVTggcHJldk9wQ2hhbm5lbDsKKyAgICB0QU5JX1UxNiBjbGllbnREaXNzU2VjczsKKyAgICB0QU5JX1UzMiByb2FtVFMxOworI2VuZGlmCisgICAgdEFOSV9VOCBiUmVmQXNzb2NTdGFydENudDsgICAvL1RyYWNraW5nIGFzc29jIHN0YXJ0IGluZGljYXRpb24KK30gdENzclJvYW1TZXNzaW9uOworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JSb2FtU3RydWN0Cit7CisgICAgdEFOSV9VMzIgbmV4dFJvYW1JZDsKKyAgICB0RGJsTGlua0xpc3Qgcm9hbUNtZFBlbmRpbmdMaXN0OworICAgIHREYmxMaW5rTGlzdCBjaGFubmVsTGlzdDVHOworICAgIHREYmxMaW5rTGlzdCBjaGFubmVsTGlzdDI0OworICAgIHRDc3JDb25maWcgY29uZmlnUGFyYW07CisgICAgdEFOSV9VMzIgbnVtQ2hhbm5lbHNFZXByb207IC8vdG90YWwgY2hhbm5lbHMgb2YgZWVwcm9tCisgICAgdENzckNoYW5uZWwgYmFzZTIwTUh6Q2hhbm5lbHM7ICAgLy9UaGUgY2hhbm5lbCBiYXNlIHRvIHdvcmsgb24gICAgICAgICAgICAgIAorICAgIHRDc3JDaGFubmVsIGJhc2U0ME1IekNoYW5uZWxzOyAgIC8vY2VudGVyIGNoYW5uZWxzIGZvciA0ME1IeiBjaGFubmVscyAgICAgIAorICAgIGVDc3JSb2FtU3RhdGUgY3VyU3RhdGVbQ1NSX1JPQU1fU0VTU0lPTl9NQVhdOyAgCisgICAgZUNzclJvYW1TdWJTdGF0ZSBjdXJTdWJTdGF0ZVtDU1JfUk9BTV9TRVNTSU9OX01BWF07CisgICAgLy9UaGlzIG1heSBvciBtYXkgbm90IGhhdmUgdGhlIHVwLXRvLWRhdGUgdmFsaWQgY2hhbm5lbCBsaXN0CisgICAgLy9JdCBpcyB1c2VkIHRvIGdldCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCBhbmQgbm90IGFsbG9jYXRlIG1lbW9yeSBhbGwgdGhlIHRpbWUKKyAgICB0U2lyTWFjQ2hhbk51bSB2YWxpZENoYW5uZWxMaXN0W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CisgICAgdEFOSV9VMzIgbnVtVmFsaWRDaGFubmVsczsgLy90b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gQ0ZHCisgICAgCisgICAgdEFOSV9TMzIgc1BlbmRpbmdDb21tYW5kczsKKyAgICB0Q2hhbm5lbExpc3RXaXRoUG93ZXIgICAqcG93ZXJUYWJsZUZyb21FZXByb207CisgICAgdENoYW5uZWxMaXN0V2l0aFBvd2VyICAgKnBvd2VyVGFibGVGcm9tRWVwcm9tNDBNSHo7CisgICAgdFBhbFRpbWVySGFuZGxlIGhUaW1lcldhaXRGb3JLZXk7ICAvL1RvIHN1cHBvcnQgdGltZW91dCBmb3IgV2FpdEZvcktleSBzdGF0ZQorICAgIHRDc3JTdW1tYXJ5U3RhdHNJbmZvICAgICAgIHN1bW1hcnlTdGF0c0luZm87CisgICAgdENzckdsb2JhbENsYXNzQVN0YXRzSW5mbyAgY2xhc3NBU3RhdHNJbmZvOworICAgIHRDc3JHbG9iYWxDbGFzc0JTdGF0c0luZm8gIGNsYXNzQlN0YXRzSW5mbzsKKyAgICB0Q3NyR2xvYmFsQ2xhc3NDU3RhdHNJbmZvICBjbGFzc0NTdGF0c0luZm87CisgICAgdENzckdsb2JhbENsYXNzRFN0YXRzSW5mbyAgY2xhc3NEU3RhdHNJbmZvOworICAgIHRDc3JQZXJTdGFTdGF0c0luZm8gICAgICAgIHBlclN0YVN0YXRzSW5mb1tDU1JfTUFYX1NUQV07CisgICAgdERibExpbmtMaXN0ICBzdGF0c0NsaWVudFJlcUxpc3Q7CisgICAgdERibExpbmtMaXN0ICBwZVN0YXRzUmVxTGlzdDsKKyAgICB0Q3NyVGxTdGF0c1JlcUluZm8gIHRsU3RhdHNSZXFJbmZvOworICAgIGVDc3JSb2FtTGlua1F1YWxpdHlJbmQgdmNjTGlua1F1YWxpdHk7CisgICAgdENzckxpbmtRdWFsaXR5SW5kSW5mbyBsaW5rUXVhbGl0eUluZEluZm87CisgICAgdl9DT05URVhUX3QgZ1Zvc0NvbnRleHQ7IC8vdXNlZCBmb3IgaW50ZXJhY3Rpb24gd2l0aCBUTAorICAgIC8vVG8gc3BlY2lmeSB3aGV0aGVyIGFuIGFzc29jaWF0aW9uIG9yIGEgSUJTUyBpcyBXTU0gZW5hYmxlZAorICAgIC8vVGhpcyBwYXJhbWV0ZXIgaXMgb25seSB2YWxpZCBkdXJpbmcgYSBqb2luIG9yIHN0YXJ0IEJTUyBjb21tYW5kIGlzIGJlaW5nIGV4ZWN1dGVkCisgICAgLy90QU5JX0JPT0xFQU4gZldNTUNvbm5lY3Rpb247ICAgICAgLyogTW92aW5nIGl0IHRvIGJlIHBhcnQgb2Ygcm9hbXNlc3Npb24gKi8KKyAgICB2X1U4X3QgdWNBQ1dlaWdodHNbV0xBTlRMX01BWF9BQ107CisgICAgLyogVE9ETyA6IFVwdG8gaGVyZSAqLworICAgIHRDc3JUaW1lckluZm8gV2FpdEZvcktleVRpbWVySW5mbzsKKyAgICB0Q3NyUm9hbVNlc3Npb24gICAqcm9hbVNlc3Npb247CisgICAgdEFOSV9VMzIgdHJhbnNhY3Rpb25JZDsgICAgICAgIC8vIEN1cnJlbnQgdHJhbnNhY3Rpb24gSUQgZm9yIGludGVybmFsIHVzZS4gCisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcgICAgCisgICAgdENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvIG5laWdoYm9yUm9hbUluZm87CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgdEFOSV9VOCAgIGlzQ2N4SW5pRmVhdHVyZUVuYWJsZWQ7CisjZW5kaWYKK310Q3NyUm9hbVN0cnVjdDsKKworCisjZGVmaW5lIEdFVF9ORVhUX1JPQU1fSUQocFJvYW1TdHJ1Y3QpICAoKChwUm9hbVN0cnVjdCktPm5leHRSb2FtSWQgKyAxID09IDApID8gMSA6IChwUm9hbVN0cnVjdCktPm5leHRSb2FtSWQpCisjZGVmaW5lIENTUl9JU19ST0FNX1NUQVRFKHBNYWMsIHN0YXRlLCBzZXNzaW9uSWQpICAoIChzdGF0ZSkgPT0gKHBNYWMpLT5yb2FtLmN1clN0YXRlW3Nlc3Npb25JZF0gKQorCisjZGVmaW5lIENTUl9JU19ST0FNX1NUT1AocE1hYywgc2Vzc2lvbklkKSBDU1JfSVNfUk9BTV9TVEFURSggKHBNYWMpLCBlQ1NSX1JPQU1JTkdfU1RBVEVfU1RPUCwgc2Vzc2lvbklkICkgCisjZGVmaW5lIENTUl9JU19ST0FNX0lOSVQocE1hYywgc2Vzc2lvbklkKSAgQ1NSX0lTX1JPQU1fU1RBVEUoIChwTWFjKSwgZUNTUl9ST0FNSU5HX1NUQVRFX0lOSVQsIHNlc3Npb25JZCApIAorI2RlZmluZSBDU1JfSVNfUk9BTV9TQ0FOTklORyhwTWFjLCBzZXNzaW9uSWQpICBDU1JfSVNfUk9BTV9TVEFURSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX1NDQU5OSU5HLCBzZXNzaW9uSWQgKQorI2RlZmluZSBDU1JfSVNfUk9BTV9KT0lOSU5HKHBNYWMsIHNlc3Npb25JZCkgICBDU1JfSVNfUk9BTV9TVEFURSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5JTkcsIHNlc3Npb25JZCApCisjZGVmaW5lIENTUl9JU19ST0FNX0lETEUocE1hYywgc2Vzc2lvbklkKSBDU1JfSVNfUk9BTV9TVEFURSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0lETEUsIHNlc3Npb25JZCApIAorI2RlZmluZSBDU1JfSVNfUk9BTV9KT0lORUQocE1hYywgc2Vzc2lvbklkKSAgICBDU1JfSVNfUk9BTV9TVEFURSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5FRCwgc2Vzc2lvbklkICkKKworI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURShwTWFjLCBzdWJTdGF0ZSwgc2Vzc2lvbklkKSAgICgoc3ViU3RhdGUpID09IChwTWFjKS0+cm9hbS5jdXJTdWJTdGF0ZVtzZXNzaW9uSWRdKQorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9KT0lOX1JFUShwTWFjLCBzZXNzaW9uSWQpICAgIENTUl9JU19ST0FNX1NVQlNUQVRFKChwTWFjKSwgZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5fUkVRLCBzZXNzaW9uSWQpIAorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9BVVRIX1JFUShwTWFjLCBzZXNzaW9uSWQpICAgIENTUl9JU19ST0FNX1NVQlNUQVRFKChwTWFjKSwgZUNTUl9ST0FNX1NVQlNUQVRFX0FVVEhfUkVRLCBzZXNzaW9uSWQpIAorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9SRUFTU09DX1JFUShwTWFjLCBzZXNzaW9uSWQpICAgIENTUl9JU19ST0FNX1NVQlNUQVRFKChwTWFjKSwgZUNTUl9ST0FNX1NVQlNUQVRFX1JFQVNTT0NfUkVRLCBzZXNzaW9uSWQpIAorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRVEocE1hYywgc2Vzc2lvbklkKSAgICBDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRVEsIHNlc3Npb25JZCkgCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX05PX0pPSU4ocE1hYywgc2Vzc2lvbklkKSAgICBDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19OT1RISU5HX1RPX0pPSU4sIHNlc3Npb25JZCkgCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX1JFQVNTT0NfRkFJTChwTWFjLCBzZXNzaW9uSWQpICAgIENTUl9JU19ST0FNX1NVQlNUQVRFKChwTWFjKSwgZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX1JFQVNTT0NfRkFJTFVSRSwgc2Vzc2lvbklkKSAKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfRk9SQ0VEKHBNYWMsIHNlc3Npb25JZCkgICAgQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfRk9SQ0VELCBzZXNzaW9uSWQpIAorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9ERUFVVEhfUkVRKHBNYWMsIHNlc3Npb25JZCkgICAgQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBlQ1NSX1JPQU1fU1VCU1RBVEVfREVBVVRIX1JFUSwgc2Vzc2lvbklkKSAKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfU1RBUlRfQlNTX1JFUShwTWFjLCBzZXNzaW9uSWQpICAgIENTUl9JU19ST0FNX1NVQlNUQVRFKChwTWFjKSwgZUNTUl9ST0FNX1NVQlNUQVRFX1NUQVJUX0JTU19SRVEsIHNlc3Npb25JZCkgCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUShwTWFjLCBzZXNzaW9uSWQpICAgIENTUl9JU19ST0FNX1NVQlNUQVRFKChwTWFjKSwgZUNTUl9ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUSwgc2Vzc2lvbklkKSAKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQ09OTkVDVF9DT05USU5VRShwTWFjLCBzZXNzaW9uSWQpICAgIENTUl9JU19ST0FNX1NVQlNUQVRFKChwTWFjKSwgZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0NPTk5FQ1RfQ09OVElOVUVfUk9BTUlORywgc2Vzc2lvbklkKSAKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfQ09ORklHKHBNYWMsIHNlc3Npb25JZCkgICAgQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBlQ1NSX1JPQU1fU1VCU1RBVEVfQ09ORklHLCBzZXNzaW9uSWQpCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX1dBSVRGT1JLRVkocE1hYywgc2Vzc2lvbklkKSAgICBDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIGVDU1JfUk9BTV9TVUJTVEFURV9XQUlUX0ZPUl9LRVksIHNlc3Npb25JZCkKKyNkZWZpbmUgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfSE8ocE1hYywgc2Vzc2lvbklkKSAgICBDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19IQU5ET0ZGLCBzZXNzaW9uSWQpIAorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9IT19OVChwTWFjLCBzZXNzaW9uSWQpICAgIENTUl9JU19ST0FNX1NVQlNUQVRFKChwTWFjKSwgZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5FRF9OT19UUkFGRklDLCBzZXNzaW9uSWQpIAorI2RlZmluZSBDU1JfSVNfUk9BTV9TVUJTVEFURV9IT19OUlQocE1hYywgc2Vzc2lvbklkKSAgICBDU1JfSVNfUk9BTV9TVUJTVEFURSgocE1hYyksIGVDU1JfUk9BTV9TVUJTVEFURV9KT0lORURfTk9OX1JFQUxUSU1FX1RSQUZGSUMsIHNlc3Npb25JZCkgCisjZGVmaW5lIENTUl9JU19ST0FNX1NVQlNUQVRFX0hPX1JUKHBNYWMsIHNlc3Npb25JZCkgICAgQ1NSX0lTX1JPQU1fU1VCU1RBVEUoKHBNYWMpLCBlQ1NSX1JPQU1fU1VCU1RBVEVfSk9JTkVEX1JFQUxUSU1FX1RSQUZGSUMsIHNlc3Npb25JZCkgCisKKyNkZWZpbmUgQ1NSX0lTX1BIWV9NT0RFX0JfT05MWShwTWFjKSBcCisgICAgICAgICgoZUNTUl9ET1QxMV9NT0RFXzExYiA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSkgfHxcCisgICAgICAgIChlQ1NSX0RPVDExX01PREVfMTFiX09OTFkgPT0gKHBNYWMpLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUpKQorICAgICAgICAKKyNkZWZpbmUgQ1NSX0lTX1BIWV9NT0RFX0dfT05MWShwTWFjKSBcCisgICAgICAgIChlQ1NSX0RPVDExX01PREVfMTFnID09IChwTWFjKS0+cm9hbS5jb25maWdQYXJhbS5waHlNb2RlIHx8IGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWSA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSkgICAgICAgIAorICAgICAgICAKKyNkZWZpbmUgQ1NSX0lTX1BIWV9NT0RFX0FfT05MWShwTWFjKSBcCisgICAgICAgICgoZUNTUl9ET1QxMV9NT0RFXzExYSA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSkgfHxcCisgICAgICAgIChlQ1NSX0RPVDExX01PREVfMTFhX09OTFkgPT0gKHBNYWMpLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUpKQorICAgICAgICAKKyNkZWZpbmUgQ1NSX0lTX1BIWV9NT0RFX0RVQUxfQkFORChwaHlNb2RlKSBcCisgICAgICAgICgoZUNTUl9ET1QxMV9NT0RFX2FiZyAmIChwaHlNb2RlKSkgfHwgKGVDU1JfRE9UMTFfTU9ERV8xMW4gJiAocGh5TW9kZSkpIHx8IFwKKyAgICAgICAgKGVDU1JfRE9UMTFfTU9ERV9UQVVSVVMgJiAocGh5TW9kZSkpIHx8IFwKKyAgICAgICAgKGVDU1JfRE9UMTFfTU9ERV9BVVRPICYgKHBoeU1vZGUpKSkKKworLy8gdGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgdGhlIE5JQyBpcyBvcGVyYXRpbmcgZXhjbHVzaXZlbHkgaW4gdGhlIDIuNCBHSHogYmFuZCwgbWVhbmluZworLy8gaXQgaXMgTk9UIG9wZXJhdGluZyBpbiB0aGUgNS4wIEdIeiBiYW5kLgorI2RlZmluZSBDU1JfSVNfMjRfQkFORF9PTkxZKHBNYWMpIFwKKyAgICAgICAgKGVDU1JfQkFORF8yNCA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0uZUJhbmQpCisKKyNkZWZpbmUgQ1NSX0lTXzVHX0JBTkRfT05MWShwTWFjKSBcCisgICAgICAgIChlQ1NSX0JBTkRfNUcgPT0gKHBNYWMpLT5yb2FtLmNvbmZpZ1BhcmFtLmVCYW5kKQorCisjZGVmaW5lIENTUl9JU19SQURJT19EVUFMX0JBTkQocE1hYykgXAorICAgICAgICAoZUNTUl9CQU5EX0FMTCA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0uYmFuZENhcGFiaWxpdHkpCisKKyNkZWZpbmUgQ1NSX0lTX1JBRElPX0JHX09OTFkocE1hYykgXAorICAgICAgICAoZUNTUl9CQU5EXzI0ID09IChwTWFjKS0+cm9hbS5jb25maWdQYXJhbS5iYW5kQ2FwYWJpbGl0eSkKKworLy8gdGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgdGhlIE5JQyBpcyBvcGVyYXRpbmcgZXhjbHVzaXZlbHkgaW4gdGhlIDUuMCBHSHogYmFuZCwgbWVhbmluZworLy8gaXQgaXMgTk9UIG9wZXJhdGluZyBpbiB0aGUgMi40IEdIeiBiYW5kCisjZGVmaW5lIENTUl9JU19SQURJT19BX09OTFkocE1hYykgXAorICAgICAgICAoZUNTUl9CQU5EXzVHID09IChwTWFjKS0+cm9hbS5jb25maWdQYXJhbS5iYW5kQ2FwYWJpbGl0eSkKKworLy8gdGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgdGhlIE5JQyBpcyBvcGVyYXRpbmcgaW4gYm90aCBiYW5kcy4KKyNkZWZpbmUgQ1NSX0lTX09QRUFSVElOR19EVUFMX0JBTkQocE1hYykgXAorICAgICAgICAoKGVDU1JfQkFORF9BTEwgPT0gKHBNYWMpLT5yb2FtLmNvbmZpZ1BhcmFtLmJhbmRDYXBhYmlsaXR5KSAmJiAoZUNTUl9CQU5EX0FMTCA9PSAocE1hYyktPnJvYW0uY29uZmlnUGFyYW0uZUJhbmQpKQorCisvLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpZiB0aGUgTklDIGNhbiBvcGVyYXRlIGluIHRoZSA1LjAgR0h6IGJhbmQgKGNvdWxkIG9wZXJhdGUgaW4gdGhlCisvLyAyLjQgR0h6IGJhbmQgYWxzbykuCisjZGVmaW5lIENTUl9JU19PUEVSQVRJTkdfQV9CQU5EKHBNYWMpIFwKKyAgICAgICAgKENTUl9JU19PUEVBUlRJTkdfRFVBTF9CQU5EKChwTWFjKSkgfHwgQ1NSX0lTX1JBRElPX0FfT05MWSgocE1hYykpIHx8IENTUl9JU181R19CQU5EX09OTFkoKHBNYWMpKSkKKworLy8gdGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgdGhlIE5JQyBjYW4gb3BlcmF0ZSBpbiB0aGUgMi40IEdIeiBiYW5kIChjb3VsZCBvcGVyYXRlIGluIHRoZQorLy8gNS4wIEdIeiBiYW5kIGFsc28pLgorI2RlZmluZSBDU1JfSVNfT1BFUkFUSU5HX0JHX0JBTkQocE1hYykgXAorICAgICAgICAoQ1NSX0lTX09QRUFSVElOR19EVUFMX0JBTkQoKHBNYWMpKSB8fCBDU1JfSVNfUkFESU9fQkdfT05MWSgocE1hYykpIHx8IENTUl9JU18yNF9CQU5EX09OTFkoKHBNYWMpKSkKKworI2RlZmluZSBDU1JfSVNfQ0hBTk5FTF81R0haKGNobk51bSkgXAorICAgICAgICAoKGNobk51bSkgPiBDU1JfTUFYXzI0R0h6X0NIQU5ORUxfTlVNQkVSKQorCisjZGVmaW5lIENTUl9JU19DSEFOTkVMXzI0R0haKGNobk51bSkgXAorICAgICAgICAoKChjaG5OdW0pID4gMCkgJiYgKChjaG5OdW0pIDw9IENTUl9NQVhfMjRHSHpfQ0hBTk5FTF9OVU1CRVIpKQorICAgICAgICAKKyNkZWZpbmUgQ1NSX0lTX1NBTUVfQkFORF9DSEFOTkVMUyhjaDEsIGNoMikgKENTUl9JU19DSEFOTkVMXzVHSFooY2gxKSA9PSBDU1JfSVNfQ0hBTk5FTF81R0haKGNoMikpCisKKworI2RlZmluZSBDU1JfSVNfMTFEX0lORk9fRk9VTkQocE1hYykgXAorICAgICAgICAoMCAhPSAocE1hYyktPnNjYW4uY2hhbm5lbE9mMTFkSW5mbykKKy8vIERFQVVUSElORAorI2RlZmluZSBDU1JfSVNfUk9BTUlORyhwU2Vzc2lvbikgKChDU1JfSVNfTE9TVExJTktfUk9BTUlORygocFNlc3Npb24pLT5yb2FtaW5nUmVhc29uKSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVDc3JEeW5hbWljUm9hbWluZyA9PSAocFNlc3Npb24pLT5yb2FtaW5nUmVhc29uKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVDc3JSZWFzc29jUm9hbWluZyA9PSAocFNlc3Npb24pLT5yb2FtaW5nUmVhc29uKSkgICAKKworCisjZGVmaW5lIENTUl9JU19TRVRfS0VZX0NPTU1BTkQoIHBDb21tYW5kICkgICAgKCBlU21lQ29tbWFuZFNldEtleSA9PSAocENvbW1hbmQpLT5jb21tYW5kICkKKworI2RlZmluZSBDU1JfSVNfQUREVFNfV0hFTl9BQ01PRkZfU1VQUE9SVEVEKHBNYWMpIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmFkZFRTV2hlbkFDTUlzT2ZmKQorLy8gREVBVVRISU5ECisjZGVmaW5lIENTUl9JU19MT1NUTElOS19ST0FNSU5HKHJlYXNvbikgICgoZUNzckxvc3RsaW5rUm9hbWluZ0Rpc2Fzc29jID09IChyZWFzb24pKSB8fCAoZUNzckxvc3RsaW5rUm9hbWluZ0RlYXV0aCA9PSAocmVhc29uKSkpCisKKy8vU3RvcCBDU1IgZnJvbSBhc2tpbmcgZm9yIElNUFMsIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBkaXNhYmxlIElNUFMgZnJvbSBDU1IKK3ZvaWQgY3NyU2NhblN1c3BlbmRJTVBTKCB0cEFuaVNpckdsb2JhbCBwTWFjICk7CisvL1N0YXJ0IENTUiBmcm9tIGFza2luZyBmb3IgSU1QUy4gVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHRyaWdnZXIgQ1NSIHRvIHJlcXVlc3QgZW50ZXJpbmcgSU1QUworLy9iZWNhdXNlIElNUFMgbWF5YmUgZGlzYWJsZWQuCit2b2lkIGNzclNjYW5SZXN1bWVJTVBTKCB0cEFuaVNpckdsb2JhbCBwTWFjICk7CisKK2VIYWxTdGF0dXMgY3NySW5pdEdldENoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCitlSGFsU3RhdHVzIGNzclNldE1vZGlmeVByb2ZpbGVGaWVsZHModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqcE1vZGlmeVByb2ZpbGVGaWVsZHMpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzckdldE1vZGlmeVByb2ZpbGVGaWVsZHMKKyAgICBcYnJpZWYgSEREIG9yIFNNRSAtIFFPUyBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgCisgICAgY29ubmVjdGVkIHByb2ZpbGUgZmllbGRzIGNoYW5naW5nIHdoaWNoIGNhbiBjYXVzZSByZWFzc29jLgorICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQ0ZHIGlzIGRvd25sb2FkZWQgYW5kIFNUQSBpcyBpbiBjb25uZWN0ZWQKKyAgICBzdGF0ZS4KKyAgICBccGFyYW0gcE1vZGlmeVByb2ZpbGVGaWVsZHMgLSBwb2ludGVyIHRvIHRoZSBjb25uZWN0ZWQgcHJvZmlsZSBmaWVsZHMgCisgICAgY2hhbmdpbmcgd2hpY2ggY2FuIGNhdXNlIHJlYXNzb2MKKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JHZXRNb2RpZnlQcm9maWxlRmllbGRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgKiBwTW9kaWZ5UHJvZmlsZUZpZWxkcyk7Cit2b2lkIGNzclNldEdsb2JhbENmZ3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKTsKK3ZvaWQgY3NyU2V0RGVmYXVsdERvdDExTW9kZSggdHBBbmlTaXJHbG9iYWwgcE1hYyApOwordm9pZCBjc3JTY2FuU2V0Q2hhbm5lbE1hc2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckNoYW5uZWxJbmZvICpwQ2hhbm5lbEluZm8pOwordEFOSV9CT09MRUFOIGNzcklzQ29ublN0YXRlRGlzY29ubmVjdGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCk7Cit0QU5JX0JPT0xFQU4gY3NySXNDb25uU3RhdGVDb25uZWN0ZWRJYnNzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQgKTsKK3RBTklfQk9PTEVBTiBjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZElic3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApOwordEFOSV9CT09MRUFOIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSW5mcmEoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApOwordEFOSV9CT09MRUFOIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQgKTsKK3RBTklfQk9PTEVBTiBjc3JJc0Nvbm5TdGF0ZUluZnJhKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQgKTsKK3RBTklfQk9PTEVBTiBjc3JJc0Nvbm5TdGF0ZUlic3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApOwordEFOSV9CT09MRUFOIGNzcklzQ29ublN0YXRlV2RzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQgKTsKK3RBTklfQk9PTEVBTiBjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZFdkcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICk7Cit0QU5JX0JPT0xFQU4gY3NySXNDb25uU3RhdGVEaXNjb25uZWN0ZWRXZHMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApOwordEFOSV9CT09MRUFOIGNzcklzQW55U2Vzc2lvbkluQ29ubmVjdFN0YXRlKCB0cEFuaVNpckdsb2JhbCBwTWFjICk7Cit0QU5JX0JPT0xFQU4gY3NySXNBbGxTZXNzaW9uRGlzY29ubmVjdGVkKCB0cEFuaVNpckdsb2JhbCBwTWFjICk7Cit0QU5JX0JPT0xFQU4gY3NySXNJbmZyYUNvbm5lY3RlZCggdHBBbmlTaXJHbG9iYWwgcE1hYyApOwordEFOSV9CT09MRUFOIGNzcklzQ29uY3VycmVudEluZnJhQ29ubmVjdGVkKCB0cEFuaVNpckdsb2JhbCBwTWFjICk7Cit0QU5JX0JPT0xFQU4gY3NySXNJQlNTU3RhcnRlZCggdHBBbmlTaXJHbG9iYWwgcE1hYyApOwordEFOSV9CT09MRUFOIGNzcklzQlRBTVBTdGFydGVkKCB0cEFuaVNpckdsb2JhbCBwTWFjICk7Cit0QU5JX0JPT0xFQU4gY3NySXNCVEFNUCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICk7CitlSGFsU3RhdHVzIGNzcklzQlRBTVBBbGxvd2VkKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBjaG5JZCApOwordEFOSV9CT09MRUFOIGNzcklzVmFsaWRNY0NvbmN1cnJlbnRTZXNzaW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCk7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordEFOSV9CT09MRUFOIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSW5mcmFBcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICk7CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcZm4gY3NyUm9hbVJlZ2lzdGVyTGlua1F1YWxpdHlJbmRDYWxsYmFjaworCisgIFxicmllZgorICBhIENTUiBmdW5jdGlvbiB0byBhbGxvdyBIREQgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayBoYW5kbGVyIHdpdGggQ1NSIGZvciAKKyAgbGluayBxdWFsaXR5IGluZGljYXRpb25zLiAKKworICBPbmx5IG9uZSBjYWxsYmFjayBtYXkgYmUgcmVnaXN0ZXJlZCBhdCBhbnkgdGltZS4KKyAgSW4gb3JkZXIgdG8gZGVyZWdpc3RlciB0aGUgY2FsbGJhY2ssIGEgTlVMTCBjYmFjayBtYXkgYmUgcHJvdmlkZWQuCisKKyAgUmVnaXN0cmF0aW9uIGhhcHBlbnMgaW4gdGhlIHRhc2sgY29udGV4dCBvZiB0aGUgY2FsbGVyLgorCisgIFxwYXJhbSBjYWxsYmFjayAtIENhbGwgYmFjayBiZWluZyByZWdpc3RlcmVkCisgIFxwYXJhbSBwQ29udGV4dCAtIHVzZXIgZGF0YQorICAKKyAgREVQRU5ERU5DSUVTOiBBZnRlciBDU1Igb3BlbgorCisgIFxyZXR1cm4gZUhhbFN0YXR1cyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclJvYW1SZWdpc3RlckxpbmtRdWFsaXR5SW5kQ2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtTGlua1F1YWxpdHlJbmRDYWxsYmFjayAgIGNhbGxiYWNrLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQ29udGV4dCk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyR2V0U3RhdGlzdGljcworICAgIFxicmllZiBjc3IgZnVuY3Rpb24gdGhhdCBjbGllbnQgY2FsbHMgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBnZXQgCisgICAgZGlmZmVyZW50IFBIWSBsZXZlbCBzdGF0aXN0aWNzIGZyb20gQ1NSLiAKKyAgICAKKyAgICBccGFyYW0gcmVxdWVzdGVySWQgLSBkaWZmZXJlbnQgY2xpZW50IHJlcXVlc3RpbmcgZm9yIHN0YXRpc3RpY3MsIEhERCwgVU1BL0dBTiBldGMKKyAgICBccGFyYW0gc3RhdHNNYXNrIC0gVGhlIGRpZmZlcmVudCBjYXRlZ29yeS9jYXRlZ29yaWVzIG9mIHN0YXRzIHJlcXVlc3RlciBpcyBsb29raW5nIGZvcgorICAgIFxwYXJhbSBjYWxsYmFjayAtIFNNRSBzZW5kcyBiYWNrIHRoZSByZXF1ZXN0ZWQgc3RhdHMgdXNpbmcgdGhlIGNhbGxiYWNrCisgICAgXHBhcmFtIHBlcmlvZGljaXR5IC0gSWYgcmVxdWVzdGVyIG5lZWRzIHBlcmlvZGljIHVwZGF0ZSwgMCBtZWFucyBpdCdzIGFuIG9uZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIHJlcXVlc3QKKyAgICBccGFyYW0gY2FjaGUgLSBJZiByZXF1ZXN0ZXIgaXMgaGFwcHkgd2l0aCBjYWNoZWQgc3RhdHMKKyAgICBccGFyYW0gc3RhSWQgLSBUaGUgc3RhdGlvbiBJRCBmb3Igd2hpY2ggdGhlIHN0YXRzIGlzIHJlcXVlc3RlZCBmb3IKKyAgICBccGFyYW0gcENvbnRleHQgLSB1c2VyIGNvbnRleHQgdG8gYmUgcGFzc2VkIGJhY2sgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2sKKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzckdldFN0YXRpc3RpY3ModHBBbmlTaXJHbG9iYWwgcE1hYywgZUNzclN0YXRzUmVxdWVzdGVyVHlwZSByZXF1ZXN0ZXJJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgc3RhdHNNYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyU3RhdHNDYWxsYmFjayBjYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgcGVyaW9kaWNpdHksIHRBTklfQk9PTEVBTiBjYWNoZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBzdGFJZCwgdm9pZCAqcENvbnRleHQpOworCisKK2VIYWxTdGF0dXMgY3NyR2V0UnNzaSh0cEFuaVNpckdsb2JhbCBwTWFjLHRDc3JSc3NpQ2FsbGJhY2sgY2FsbGJhY2ssdEFOSV9VOCBzdGFJZCx0Q3NyQnNzaWQgYnNzSWQsdm9pZCAqIHBDb250ZXh0LHZvaWQgKiBwVm9zQ29udGV4dCk7CitlSGFsU3RhdHVzIGNzclJvYW1SZWdpc3RlckNhbGxiYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGNzclJvYW1Db21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwQ29udGV4dCk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyR2V0Q29uZmlnUGFyYW0KKyAgICBcYnJpZWYgSEREIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IHRoZSBnbG9iYWwgc2V0dGluZ3MgY3VycmVudGx5IG1haW50YWluZWQgYnkgQ1NSLiAKKyAgICBccGFyYW0gcFBhcmFtIC0gY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyR2V0Q29uZmlnUGFyYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckNvbmZpZ1BhcmFtICpwUGFyYW0pOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyTXNnUHJvY2Vzc29yCisgICAgXGJyaWVmIEhERCBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIGNoYW5nZSBzb21lIGdsb2JhbCBzZXR0aW5ncy4gCisgICAgY2FsbGVyIG11c3Qgc2V0IHRoZSBhbGwgZmllbGRzIG9yIGNhbGwgY3NyR2V0Q29uZmlnUGFyYW0gdG8gcHJlZmlsbCB0aGUgZmllbGRzLgorICAgIFxwYXJhbSBwUGFyYW0gLSBjYWxsZXIgYWxsb2NhdGVkIG1lbW9yeQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JDaGFuZ2VEZWZhdWx0Q29uZmlnUGFyYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckNvbmZpZ1BhcmFtICpwUGFyYW0pOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JNc2dQcm9jZXNzb3IKKyAgICBcYnJpZWYgSEREIGNhbGxzIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBoYW5kbGVkIGJ5IENTUi4KKyAgICBccGFyYW0gcE1zZ0J1ZiAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IG1hcHMgdG8gdmFyaW91cyBzdHJ1Y3R1cmVzIGJhc2Ugb24gdGhlIG1lc3NhZ2UgdHlwZS4KKyAgICBUaGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgY2FuIGFsd2F5cyBtYXAgdG8gdFNpclNtZVJzcC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyTXNnUHJvY2Vzc29yKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAgdm9pZCAqcE1zZ0J1ZiApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyT3BlbgorICAgIFxicmllZiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgQVBJIGNhbGwgdG8gQ1NSLiAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyT3Blbih0cEFuaVNpckdsb2JhbCBwTWFjKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JDbG9zZQorICAgIFxicmllZiBUbyBjbG9zZSBkb3duIENTUiBtb2R1bGUuIFRoZXJlIHNob3VsZCBub3QgYmUgYW55IEFQSSBjYWxsIGludG8gQ1NSIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyQ2xvc2UodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyU3RhcnQKKyAgICBcYnJpZWYgVG8gc3RhcnQgQ1NSLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JTdGFydCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JTdG9wCisgICAgXGJyaWVmIFRvIHN0b3AgQ1NSLiBDU1Igc3RpbGwga2VlcHMgaXRzIGN1cnJlbnQgc2V0dGluZy4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyU3RvcCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSZWFkeQorICAgIFxicmllZiBUbyBsZXQgQ1NSIGlzIHJlYWR5IHRvIG9wZXJhdGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyUmVhZHkodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorZUhhbFN0YXR1cyBjc3JSb2FtR2V0QktJRENhY2hlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9VMzIgKnBOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCa2lkQ2FjaGVJbmZvICpwQmtpZENhY2hlKTsKKworCitlSGFsU3RhdHVzIGNzclNjYW5HZXRCS0lEQ2FuZGlkYXRlTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJraWRDYW5kaWRhdGVJbmZvICpwQmtpZExpc3QsIHRBTklfVTMyICpwTnVtSXRlbXMgKTsKK3RBTklfVTMyIGNzclJvYW1HZXROdW1CS0lEQ2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKTsKK2VIYWxTdGF0dXMgY3NyUm9hbVNldEJLSURDYWNoZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0QmtpZENhY2hlSW5mbyAqcEJLSURDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG51bUl0ZW1zICk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyUm9hbUdldFdhcGlSZXFJRQorICAgIFxicmllZiByZXR1cm4gdGhlIFdBUEkgSUUgQ1NSIHBhc3NlcyB0byBQRSB0byBKT0lOIHJlcXVlc3Qgb3IgU1RBUlRfQlNTIHJlcXVlc3QKKyAgICBccGFyYW0gcExlbiAtIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaGFzIHRoZSBsZW5ndGggb2YgcEJ1ZiBhcyBpbnB1dC4gVXBvbiByZXR1cm5lZCwgKnBMZW4gaGFzIHRoZSAKKyAgICBuZWVkZWQgb3IgSUUgbGVuZ3RoIGluIHBCdWYuCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGNvbnRhaW4gdGhlIElFIGZpZWxkLCBpZiBhbnksIHVwb24gcmV0dXJuCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdCBiaWcgZW5vdWdoCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JSb2FtR2V0V2FwaVJlcUlFKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9VMzIgKnBMZW4sIHRBTklfVTggKnBCdWYpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyUm9hbUdldFdhcGlSc3BJRQorICAgIFxicmllZiByZXR1cm4gdGhlIFdBUEkgSUUgZnJvbSB0aGUgYmVhY29uIG9yIHByb2JlIHJzcCBpZiBjb25uZWN0ZWQKKyAgICBccGFyYW0gcExlbiAtIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaGFzIHRoZSBsZW5ndGggb2YgcEJ1ZiBhcyBpbnB1dC4gVXBvbiByZXR1cm5lZCwgKnBMZW4gaGFzIHRoZSAKKyAgICBuZWVkZWQgb3IgSUUgbGVuZ3RoIGluIHBCdWYuCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGNvbnRhaW4gdGhlIElFIGZpZWxkLCBpZiBhbnksIHVwb24gcmV0dXJuCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdCBiaWcgZW5vdWdoCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JSb2FtR2V0V2FwaVJzcElFKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9VMzIgKnBMZW4sIHRBTklfVTggKnBCdWYpOwordEFOSV9VOCBjc3JDb25zdHJ1Y3RXYXBpSWUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcEllcywgdENzcldhcGlJZSAqcFdhcGlJZSApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCitlSGFsU3RhdHVzIGNzclJvYW1VcGRhdGVBUFdQU0lFKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRTaXJBUFdQU0lFcyAqcEFQV1BTSUVTICk7CitlSGFsU3RhdHVzIGNzclJvYW1VcGRhdGVXUEFSU05JRXMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdFNpclJTTmllICogcEFQU2lyUlNOaWUpOworI2VuZGlmCit2b2lkIGNzclNldENmZ1ByaXZhY3koIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIHRBTklfQk9PTEVBTiBmUHJpdmFjeSApOwordEFOSV9TOCBjc3JHZXRJbmZyYVNlc3Npb25JZCggdHBBbmlTaXJHbG9iYWwgcE1hYyApOwordEFOSV9VOCBjc3JHZXRJbmZyYU9wZXJhdGlvbkNoYW5uZWwoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc2Vzc2lvbklkKTsKK3RBTklfVTggY3NyR2V0Q29uY3VycmVudE9wZXJhdGlvbkNoYW5uZWwoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKTsKKworZUhhbFN0YXR1cyBjc3JSb2FtQ29weUNvbm5lY3RQcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSk7Cit0QU5JX0JPT0xFQU4gY3NySXNTZXRLZXlBbGxvd2VkKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCk7CisKK3ZvaWQgY3NyU2V0T3Bwb3NpdGVCYW5kQ2hhbm5lbEluZm8oIHRwQW5pU2lyR2xvYmFsIHBNYWMgKTsKK3ZvaWQgY3NyQ29uc3RydWN0Q3VycmVudFZhbGlkQ2hhbm5lbExpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREYmxMaW5rTGlzdCAqcENoYW5uZWxTZXRMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcENoYW5uZWxMaXN0LCB0QU5JX1U4IGJTaXplLCB0QU5JX1U4ICpwTnVtQ2hhbm5lbHMgKTsKKworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLy9SZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgYXNzb2NpYXRpb24gaXMgYSAxMXIgYXNzb2Mgb3Igbm90Cit0QU5JX0JPT0xFQU4gY3NyUm9hbUlzMTFyQXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYyk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKy8vUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIGlzIGEgQ0NYIGFzc29jIG9yIG5vdAordEFOSV9CT09MRUFOIGNzclJvYW1Jc0NDWEFzc29jKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworI2VuZGlmCisKK3ZvaWQgY3NyRGlzY29ubmVjdEFsbEFjdGl2ZVNlc3Npb25zKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvaW5jL2NzckxpbmtMaXN0LmggYi9DT1JFL1NNRS9pbmMvY3NyTGlua0xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjljYTE0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvaW5jL2NzckxpbmtMaXN0LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAgCisgICAgXGZpbGUgY3NyTGlua0xpc3QuaAorICAKKyAgICBFeHBvcnRzIGFuZCB0eXBlcyBmb3IgdGhlIENvbW1vbiBsaW5rIGxpc3QgaW50ZXJmYWNlcy4KKyAgCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZAorIAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgQ1NSX0xJTktfTElTVF9IX18KKyNkZWZpbmUgQ1NSX0xJTktfTElTVF9IX18KKworI2luY2x1ZGUgInZvc19sb2NrLmgiCisKKworI2RlZmluZSBMTF9BQ0NFU1NfTE9DSyAgICAgICAgICBlQU5JX0JPT0xFQU5fVFJVRQorI2RlZmluZSBMTF9BQ0NFU1NfTk9MT0NLICAgICAgICBlQU5JX0JPT0xFQU5fRkFMU0UKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTGlzdEVsZW0KK3sKKyAgICBzdHJ1Y3QgdGFnTGlzdEVsZW0gKmxhc3Q7CisgICAgc3RydWN0IHRhZ0xpc3RFbGVtICpuZXh0OworfXRMaXN0RWxlbTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgTElTVF9GTEFHX0NMT1NFID0gMCwKKyAgICBMSVNUX0ZMQUdfT1BFTiA9IDB4YTFiMmM0ZDcsCit9dExpc3RGbGFnOworCisvL1RoaXMgaXMgYSBjaXJjdWxhciBkb3VibGUgbGluayBsaXN0Cit0eXBlZGVmIHN0cnVjdCB0YWdEYmxMaW5rTGlzdAoreworICB0TGlzdEVsZW0gTGlzdEhlYWQ7CisgIHZvc19sb2NrX3QgTG9jazsKKyAgdEFOSV9VMzIgIENvdW50OworICB0SGRkSGFuZGxlIGhIZGQ7CisgIHRMaXN0RmxhZyBGbGFnOworfXREYmxMaW5rTGlzdDsKKworLy9UbyBnZXQgdGhlIGFkZHJlc3Mgb2YgYW4gb2JqZWN0IG9mICh0eXBlKSBiYXNlIG9uIHRoZSAoYWRkcmVzcykgb2Ygb25lIG9mIGl0cyAoZmllbGQpCisjZGVmaW5lIEdFVF9CQVNFX0FERFIoYWRkcmVzcywgdHlwZSwgZmllbGQpICgodHlwZSAqKSggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKShhZGRyZXNzKSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikoJigodHlwZSAqKTApLT5maWVsZCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLy9UbyBnZXQgdGhlIG9mZnNldCBvZiAoZmllbGQpIGluc2lkZSBzdHJ1Y3R1cmUgKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgR0VUX0ZJRUxEX09GRlNFVCh0eXBlLCBmaWVsZCkgICgodEFOSV9VMzJfT1JfUFRSKSgmKCgodHlwZSAqKTApLT5maWVsZCkpKQorCisjZGVmaW5lIEdFVF9ST1VORF9VUCggX0ZpZWxkLCBfQm91bmRhcnkgKSAoKChfRmllbGQpICsgKChfQm91bmRhcnkpIC0gMSkpICAmIH4oKF9Cb3VuZGFyeSkgLSAxKSkKKyNkZWZpbmUgQklUU19PTiggIF9GaWVsZCwgX0JpdG1hc2sgKSAoIChfRmllbGQpIHw9ICAoX0JpdG1hc2spICkKKyNkZWZpbmUgQklUU19PRkYoIF9GaWVsZCwgX0JpdG1hc2sgKSAoIChfRmllbGQpICY9IH4oX0JpdG1hc2spICkKKworI2RlZmluZSBDU1JfTUFYKGEsIGIpICAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBDU1JfTUlOKGEsIGIpICAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBjc3JJc0xpc3RFbXB0eShwSGVhZCkgKChwSGVhZCktPm5leHQgPT0gKHBIZWFkKSkKKwordEFOSV9VMzIgY3NyTExDb3VudCggdERibExpbmtMaXN0ICpwTGlzdCApOworCitlSGFsU3RhdHVzIGNzckxMT3BlbiggdEhkZEhhbmRsZSBoSGRkLCB0RGJsTGlua0xpc3QgICpwTGlzdCApOwordm9pZCBjc3JMTENsb3NlKCB0RGJsTGlua0xpc3QgKnBMaXN0ICk7CisKK3ZvaWQgY3NyTExMb2NrKCB0RGJsTGlua0xpc3QgKnBMaXN0ICk7Cit2b2lkIGNzckxMVW5sb2NrKCB0RGJsTGlua0xpc3QgKnBMaXN0ICk7CisKK3RBTklfQk9PTEVBTiBjc3JMTElzTGlzdEVtcHR5KCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0QU5JX0JPT0xFQU4gZkludGVybG9ja2VkICk7CisKK3ZvaWQgY3NyTExJbnNlcnRIZWFkKCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0TGlzdEVsZW0gKnBFbnRyeSwgdEFOSV9CT09MRUFOIGZJbnRlcmxvY2tlZCApOwordm9pZCBjc3JMTEluc2VydFRhaWwoIHREYmxMaW5rTGlzdCAqcExpc3QsIHRMaXN0RWxlbSAqcEVudHJ5LCB0QU5JX0JPT0xFQU4gZkludGVybG9ja2VkICk7CisvL1RoaXMgZnVuY3Rpb24gcHV0IHBOZXdFbnRyeSBiZWZvcmUgcEVudHJ5LiBDYWxsZXIgc2hvdWxkIGhhdmUgZm91bmQgcEVudHJ5Cit2b2lkIGNzckxMSW5zZXJ0RW50cnkoIHREYmxMaW5rTGlzdCAqcExpc3QsIHRMaXN0RWxlbSAqcEVudHJ5LCB0TGlzdEVsZW0gKnBOZXdFbnRyeSwgdEFOSV9CT09MRUFOIGZJbnRlcmxvY2tlZCApOworCit0TGlzdEVsZW0gKmNzckxMUGVla0hlYWQoIHREYmxMaW5rTGlzdCAqcExpc3QsIHRBTklfQk9PTEVBTiBmSW50ZXJsb2NrZWQgKTsKK3RMaXN0RWxlbSAqY3NyTExQZWVrVGFpbCggdERibExpbmtMaXN0ICpwTGlzdCwgdEFOSV9CT09MRUFOIGZJbnRlcmxvY2tlZCApOworCit0TGlzdEVsZW0gKmNzckxMUmVtb3ZlSGVhZCggdERibExpbmtMaXN0ICpwTGlzdCwgdEFOSV9CT09MRUFOIGZJbnRlcmxvY2tlZCApOwordExpc3RFbGVtICpjc3JMTFJlbW92ZVRhaWwoIHREYmxMaW5rTGlzdCAqcExpc3QsIHRBTklfQk9PTEVBTiBmSW50ZXJsb2NrZWQgKTsKK3RBTklfQk9PTEVBTiAgY3NyTExSZW1vdmVFbnRyeSggdERibExpbmtMaXN0ICpwTGlzdCwgdExpc3RFbGVtICpwRW50cnlUb1JlbW92ZSwgdEFOSV9CT09MRUFOIGZJbnRlcmxvY2tlZCApOwordm9pZCBjc3JMTFB1cmdlKCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0QU5JX0JPT0xFQU4gZkludGVybG9ja2VkICk7CisKKy8vY3NyTExOZXh0IHJldHVybiBOVUxMIGlmIHJlYWNoaW5nIHRoZSBlbmQgb3IgbGlzdCBpcyBlbXB0eQordExpc3RFbGVtICpjc3JMTE5leHQoIHREYmxMaW5rTGlzdCAqcExpc3QsIHRMaXN0RWxlbSAqcEVudHJ5LCB0QU5JX0JPT0xFQU4gZkludGVybG9ja2VkICk7CisKK3RMaXN0RWxlbSAqY3NyTExQcmV2aW91cyggdERibExpbmtMaXN0ICpwTGlzdCwgdExpc3RFbGVtICpwRW50cnksIHRBTklfQk9PTEVBTiBmSW50ZXJsb2NrZWQgKTsKKwordEFOSV9CT09MRUFOIGNzckxMRmluZEVudHJ5KCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0TGlzdEVsZW0gKnBFbnRyeVRvRmluZCApOworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9pbmMvY3NyTmVpZ2hib3JSb2FtLmggYi9DT1JFL1NNRS9pbmMvY3NyTmVpZ2hib3JSb2FtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmNTM1YgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL2luYy9jc3JOZWlnaGJvclJvYW0uaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqICAKKworICAKKyAgICBcZmlsZSBjc3JOZWlnaGJvclJvYW0uaAorICAKKyAgICBFeHBvcnRzIGFuZCB0eXBlcyBmb3IgdGhlIG5laWdoYm9yIHJvYW1pbmcgYWxnb3JpdGhtIHdoaWNoIGlzIHNlcGNpZmljYWxseSAKKyAgICBkZXNpZ25lZCBmb3IgQW5kcm9pZC4KKyAgCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZAorICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBDU1JfTkVJR0hCT1JfUk9BTV9ICisjZGVmaW5lIENTUl9ORUlHSEJPUl9ST0FNX0gKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisKKy8qIEVudW1lcmF0aW9uIG9mIHZhcmlvdXMgc3RhdGVzIGluIG5laWdoYm9yIHJvYW0gYWxnb3JpdGhtICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ0xPU0VELAorICAgIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9JTklULAorICAgIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DT05ORUNURUQsCisgICAgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NGR19DSEFOX0xJU1RfU0NBTiwKKyAgICBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVBU1NPQ0lBVElORywKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRVBPUlRfUVVFUlksCisgICAgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1JFUE9SVF9TQ0FOLAorICAgIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9QUkVBVVRIRU5USUNBVElORywKKyAgICBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUFJFQVVUSF9ET05FLAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovICAgIAorICAgIGVORUlHSEJPUl9TVEFURV9NQVgKK30gZUNzck5laWdoYm9yUm9hbVN0YXRlOworCisvKiBQYXJhbWV0ZXJzIHRoYXQgYXJlIG9idGFpbmVkIGZyb20gQ0ZHICovCit0eXBlZGVmIHN0cnVjdCBzQ3NyTmVpZ2hib3JSb2FtQ2ZnUGFyYW1zCit7CisgICAgdEFOSV9VOCAgICAgICAgIG1heE5laWdoYm9yUmV0cmllczsKKyAgICB0QU5JX1UzMiAgICAgICAgbmVpZ2hib3JTY2FuUGVyaW9kOworICAgIHRDc3JDaGFubmVsSW5mbyBjaGFubmVsSW5mbzsKKyAgICB0QU5JX1U4ICAgICAgICAgbmVpZ2hib3JMb29rdXBUaHJlc2hvbGQ7CisgICAgdEFOSV9VOCAgICAgICAgIG5laWdoYm9yUmVhc3NvY1RocmVzaG9sZDsKKyAgICB0QU5JX1UzMiAgICAgICAgbWluQ2hhbm5lbFNjYW5UaW1lOworICAgIHRBTklfVTMyICAgICAgICBtYXhDaGFubmVsU2NhblRpbWU7CisgICAgdEFOSV9VMTYgICAgICAgIG5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2Q7Cit9IHRDc3JOZWlnaGJvclJvYW1DZmdQYXJhbXMsICp0cENzck5laWdoYm9yUm9hbUNmZ1BhcmFtczsKKworI2RlZmluZSBDU1JfTkVJR0hCT1JfUk9BTV9JTlZBTElEX0NIQU5ORUxfSU5ERVggICAgMjU1Cit0eXBlZGVmIHN0cnVjdCBzQ3NyTmVpZ2hib3JSb2FtQ2hhbm5lbEluZm8KK3sKKyAgICB0QU5JX0JPT0xFQU4gICAgSUFQUE5laWdoYm9yTGlzdFJlY2VpdmVkOyAvLyBGbGFnIHRvIG1hcmsgcmVjZXB0aW9uIG9mIElBUFAgTmVpZ2hib3IgbGlzdAorICAgIHRBTklfQk9PTEVBTiAgICBjaGFuTGlzdFNjYW5JblByb2dyZXNzOworICAgIHRBTklfVTggICAgICAgICBjdXJyZW50Q2hhbkluZGV4OyAgICAgICAvL0N1cnJlbnQgY2hhbm5lbCBpbmRleCB0aGF0IGlzIGJlaW5nIHNjYW5uZWQKKyAgICB0Q3NyQ2hhbm5lbEluZm8gY3VycmVudENoYW5uZWxMaXN0SW5mbzsgLy9NYXggbnVtYmVyIG9mIGNoYW5uZWxzIGluIGNoYW5uZWwgbGlzdCBhbmQgdGhlIGxpc3Qgb2YgY2hhbm5lbHMKK30gdENzck5laWdoYm9yUm9hbUNoYW5uZWxJbmZvLCAqdHBDc3JOZWlnaGJvclJvYW1DaGFubmVsSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc0Nzck5laWdoYm9yUm9hbUJTU0luZm8KK3sKKyAgICB0TGlzdEVsZW0gICAgICAgICAgIExpc3Q7CisgICAgdEFOSV9VOCAgICAgICAgICAgICBhcFByZWZlcmVuY2VWYWw7CisvLyAgICB0Q3NyU2NhblJlc3VsdEluZm8gICpzY2FuUmVzdWx0SW5mbzsKKyAgICB0cFNpckJzc0Rlc2NyaXB0aW9uIHBCc3NEZXNjcmlwdGlvbjsKK30gdENzck5laWdoYm9yUm9hbUJTU0luZm8sICp0cENzck5laWdoYm9yUm9hbUJTU0luZm87CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorI2RlZmluZSBDU1JfTkVJR0hCT1JfUk9BTV9SRVBPUlRfUVVFUllfVElNRU9VVCAgMTAwMCAgICAvL2luIG1pbGxpc2Vjb25kcworI2RlZmluZSBDU1JfTkVJR0hCT1JfUk9BTV9QUkVBVVRIX1JTUF9XQUlUX01VTFRJUExJRVIgICA1ICAgICAvL2luIG1pbGxpc2Vjb25kcworI2RlZmluZSBNQVhfTlVNX1BSRUFVVEhfRkFJTF9MSVNUX0FERFJFU1MgICAgICAgMTAgLy9NYXggbnVtYmVyIG9mIE1BQyBhZGRyZXNzZXMgd2l0aCB3aGljaCB0aGUgcHJlLWF1dGggd2FzIGZhaWxlZAorI2RlZmluZSBNQVhfQlNTX0lOX05FSUdIQk9SX1JQVCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDU1JfTkVJR0hCT1JfUk9BTV9NQVhfTlVNX1BSRUFVVEhfUkVUUklFUyAzCisKKy8qIEJsYWNrIGxpc3RlZCBBUHMuIExpc3Qgb2YgTUFDIEFkZHJlc3NlcyB3aXRoIHdoaWNoIHRoZSBQcmVhdXRoZW50aWNhdGlvbiB3YXMgZmFpbGVkLiAqLwordHlwZWRlZiBzdHJ1Y3Qgc0NzclByZWF1dGhGYWlsTGlzdEluZm8KK3sKKyAgICB0QU5JX1U4ICAgICBudW1NQUNBZGRyZXNzOworICAgIHRTaXJNYWNBZGRyIG1hY0FkZHJlc3NbTUFYX05VTV9QUkVBVVRIX0ZBSUxfTElTVF9BRERSRVNTXTsKK30gdENzclByZWF1dGhGYWlsTGlzdEluZm8sICp0cENzclByZWF1dGhGYWlsTGlzdEluZm87CisKK3R5cGVkZWYgc3RydWN0IHNDc3JOZWlnaGJvclJlcG9ydEJzc0luZm8KK3sKKyAgICB0QU5JX1U4IGNoYW5uZWxOdW07CisgICAgdEFOSV9VOCBuZWlnaGJvclNjb3JlOworICAgIHRTaXJNYWNBZGRyIG5laWdoYm9yQnNzSWQ7Cit9IHRDc3JOZWlnaGJvclJlcG9ydEJzc0luZm8sICp0cENzck5laWdoYm9yUmVwb3J0QnNzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc0NzcjExckFzc29jTmVpZ2hib3JJbmZvCit7CisgICAgdEFOSV9CT09MRUFOICAgICAgICAgICAgICAgIHByZWF1dGhSc3BQZW5kaW5nOworICAgIHRBTklfQk9PTEVBTiAgICAgICAgICAgICAgICBuZWlnaGJvclJwdFBlbmRpbmc7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROZWlnaGJvclJwdFJldHJ5TnVtOworICAgIHRQYWxUaW1lckhhbmRsZSAgICAgICAgICAgICBwcmVBdXRoUnNwV2FpdFRpbWVyOyAvL1RoaXMgdGltZXIgaXMgdXNlZCBmb3IgcHJlYXV0aCByZXNwb25zZQorICAgIHRDc3JUaW1lckluZm8gICAgICAgICAgICAgICBwcmVBdXRoUnNwV2FpdFRpbWVySW5mbzsKKyAgICB0Q3NyUHJlYXV0aEZhaWxMaXN0SW5mbyAgICAgcHJlQXV0aEZhaWxMaXN0OworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICBuZWlnaGJvclJlcG9ydFRpbWVvdXQ7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgIFBFUHJlYXV0aFJlc3BUaW1lb3V0OworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICBudW1QcmVBdXRoUmV0cmllczsKKyAgICB0RGJsTGlua0xpc3QgICAgICAgICAgICAgICAgcHJlQXV0aERvbmVMaXN0OyAgICAvKiBMaW5rZWQgbGlzdCB3aGljaCBjb25zaXN0cyBvciBwcmVhdXRoZW50aWNhdGVkIG5vZGVzICovCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgIG51bUJzc0Zyb21OZWlnaGJvclJlcG9ydDsKKyAgICB0Q3NyTmVpZ2hib3JSZXBvcnRCc3NJbmZvICAgbmVpZ2hib1JlcG9ydEJzc0luZm9bTUFYX0JTU19JTl9ORUlHSEJPUl9SUFRdOyAgLy9Db250YWlucyBpbmZvIG5lZWRlZCBkdXJpbmcgUkVQT1JUX1NDQU4gU3RhdGUKK30gdENzcjExckFzc29jTmVpZ2hib3JJbmZvLCAqdHBDc3IxMXJBc3NvY05laWdoYm9ySW5mbzsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCisvKiBCZWxvdyBtYWNyb3MgYXJlIHVzZWQgdG8gaW5jcmVhc2UgdGhlIHJlZ2lzdGVyZWQgbmVpZ2hib3IgTG9va3VwIHRocmVzaG9sZCB3aXRoIFRMIHdoZW4gCisgKiB3ZSBkb250IHNlZSBhbnkgQVAgZHVyaW5nIGJhY2sgZ3JvdW5kIHNjYW5uaW5nLiBUaGUgdmFsdWVzIGFyZSBpbmNyZW1lbnRlZCBmcm9tIG5laWdoYm9yTG9va3VwVGhyZXNob2xkIAorICogZnJvbSBDRkcsIGluY3JlbWVudGVkIGJ5IDUsMTAsMTUuLi41MChMT09LVVBfVEhSRVNIT0xEX0lOQ1JFTUVOVF9NVUxUSVBMSUVSX01BWCAqIAorICogTkVJR0hCT1JfTE9PS1VQX1RIUkVTSE9MRF9JTkNSRU1FTlRfQ09OU1RBTlQpICovCisjZGVmaW5lIE5FSUdIQk9SX0xPT0tVUF9USFJFU0hPTERfSU5DUkVNRU5UX0NPTlNUQU5UICAgIDUKKyNkZWZpbmUgTE9PS1VQX1RIUkVTSE9MRF9JTkNSRU1FTlRfTVVMVElQTElFUl9NQVggICAgICAgNAorCisvKiBDb21wbGV0ZSBjb250cm9sIGluZm9ybWF0aW9uIGZvciBuZWlnaGJvciByb2FtIGFsZ29yaXRobSAqLwordHlwZWRlZiBzdHJ1Y3Qgc0Nzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvCit7CisgICAgZUNzck5laWdoYm9yUm9hbVN0YXRlICAgICAgIG5laWdoYm9yUm9hbVN0YXRlOworICAgIGVDc3JOZWlnaGJvclJvYW1TdGF0ZSAgICAgICBwcmV2TmVpZ2hib3JSb2FtU3RhdGU7CisgICAgdENzck5laWdoYm9yUm9hbUNmZ1BhcmFtcyAgIGNmZ1BhcmFtczsKKyAgICB0Q3NyQnNzaWQgICAgICAgICAgICAgICAgICAgY3VyckFQYnNzaWQ7IC8vIGN1cnJlbnQgYXNzb2MgQVAKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgY3VyckFQb3BlcmF0aW9uQ2hhbm5lbDsgLy8gY3VycmVudCBhc3NvYyBBUAorICAgIHRQYWxUaW1lckhhbmRsZSAgICAgICAgICAgICBuZWlnaGJvclNjYW5UaW1lcjsKKyAgICB0UGFsVGltZXJIYW5kbGUgICAgICAgICAgICAgbmVpZ2hib3JSZXN1bHRzUmVmcmVzaFRpbWVyOworICAgIHRDc3JUaW1lckluZm8gICAgICAgICAgICAgICBuZWlnaGJvclNjYW5UaW1lckluZm87CisgICAgdENzck5laWdoYm9yUm9hbUNoYW5uZWxJbmZvIHJvYW1DaGFubmVsSW5mbzsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5laWdoYm9yTG9va3VwVGhyZXNob2xkOworICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9va3VwSW5jcmVtZW50TXVsdGlwbGllcjsKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgICAgICAgICAgc2NhblJzcFBlbmRpbmc7CisgICAgdEFOSV9USU1FU1RBTVAgICAgICAgICAgICAgIHNjYW5SZXF1ZXN0VGltZVN0YW1wOworICAgIHREYmxMaW5rTGlzdCAgICAgICAgICAgICAgICByb2FtYWJsZUFQTGlzdDsgICAgLy8gTGlzdCBvZiBjdXJyZW50IEZUIGNhbmRpZGF0ZXMKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgY3NyU2Vzc2lvbklkOworICAgIHRDc3JSb2FtUHJvZmlsZSAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1Qcm9maWxlOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICAgIAorICAgIHRBTklfQk9PTEVBTiAgICAgICAgICAgICAgICBpczExckFzc29jOworICAgIHRDc3IxMXJBc3NvY05laWdoYm9ySW5mbyAgICBGVFJvYW1JbmZvOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWCAgICAKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgICAgICAgICAgaXNDQ1hBc3NvYzsKKyAgICB0QU5JX0JPT0xFQU4gICAgICAgICAgICAgICAgaXNWT0FkbWl0dGVkOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICBNaW5RQnNzTG9hZFJlcXVpcmVkOworI2VuZGlmCit9IHRDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbywgKnRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm87CisKKworLyogQWxsIHRoZSBuZWNlc3NhcnkgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFyZSBoZXJlICovCitlSGFsU3RhdHVzIGNzck5laWdoYm9yUm9hbUluZGljYXRlQ29ubmVjdCh0cEFuaVNpckdsb2JhbCBwTWFjLHRBTklfVTggc2Vzc2lvbklkLCBWT1NfU1RBVFVTIHN0YXR1cyk7CitlSGFsU3RhdHVzIGNzck5laWdoYm9yUm9hbUluZGljYXRlRGlzY29ubmVjdCh0cEFuaVNpckdsb2JhbCBwTWFjLHRBTklfVTggc2Vzc2lvbklkKTsKK3RBTklfQk9PTEVBTiBjc3JOZWlnaGJvclJvYW1Jc0hhbmRvZmZJblByb2dyZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBjc3JOZWlnaGJvclJvYW1SZXF1ZXN0SGFuZG9mZih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2VIYWxTdGF0dXMgY3NyTmVpZ2hib3JSb2FtSW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyTmVpZ2hib3JSb2FtQ2xvc2UodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGNzck5laWdoYm9yUm9hbVB1cmdlUHJlYXV0aEZhaWxlZExpc3QodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitWT1NfU1RBVFVTIGNzck5laWdoYm9yUm9hbVRyYW5zaXRUb0NGR0NoYW5TY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworVk9TX1NUQVRVUyBjc3JOZWlnaGJvclJvYW1UcmFuc2l0aW9uVG9QcmVhdXRoRG9uZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2VIYWxTdGF0dXMgY3NyTmVpZ2hib3JSb2FtUHJlcGFyZVNjYW5Qcm9maWxlRmlsdGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwU2NhbkZpbHRlcik7Cit2b2lkIGNzck5laWdoYm9yUm9hbUdldEhhbmRvZmZBUEluZm8odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIHBIYW5kb2ZmTm9kZSk7Cit2b2lkIGNzck5laWdoYm9yUm9hbVByZWF1dGhSc3BIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIFZPU19TVEFUVVMgdm9zU3RhdHVzKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgordEFOSV9CT09MRUFOIGNzck5laWdoYm9yUm9hbUlzMTFyQXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYyk7CisjZW5kaWYKK1ZPU19TVEFUVVMgY3NyTmVpZ2hib3JSb2FtQ3JlYXRlQ2hhbkxpc3RGcm9tTmVpZ2hib3JSZXBvcnQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGNzck5laWdoYm9yUm9hbVRyYW5pc3Rpb25QcmVhdXRoRG9uZVRvRGlzY29ubmVjdGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordEFOSV9CT09MRUFOIGNzck5laWdoYm9yUm9hbVN0YXRlUHJlYXV0aERvbmUodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKworCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcgKi8KKworI2VuZGlmIC8qIENTUl9ORUlHSEJPUl9ST0FNX0ggKi8KZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9jc3JTdXBwb3J0LmggYi9DT1JFL1NNRS9pbmMvY3NyU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MjU3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9pbmMvY3NyU3VwcG9ydC5oCkBAIC0wLDAgKzEsODEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICogIAorCisgIAorICAgIFxmaWxlIGNzclN1cHBvcnQuaAorICAKKyAgICBFeHBvcnRzIGFuZCB0eXBlcyBmb3IgdGhlIENvbW1vbiBTY2FuIGFuZCBSb2FtaW5nIHN1cHBvcnRpbmcgaW50ZXJmYWNlcy4KKyAgCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZAorIAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgQ1NSX1NVUFBPUlRfSF9fCisjZGVmaW5lIENTUl9TVVBQT1JUX0hfXworCisjaW5jbHVkZSAiY3NyTGlua0xpc3QuaCIKKyNpbmNsdWRlICJjc3JBcGkuaCIKKyNpbmNsdWRlICJ2b3NfbnZpdGVtLmgiCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorI2RlZmluZSBDU1JfV0FQSV9PVUlfU0laRSAgICAgICAgICAgICAgKCA0ICkKKyNkZWZpbmUgQ1NSX1dBUElfVkVSU0lPTl9TVVBQT1JURUQgICAgICggMSApCisjZGVmaW5lIENTUl9XQVBJX01BWF9BVVRIX1NVSVRFUyAgICAgICAoIDIgKQorI2RlZmluZSBDU1JfV0FQSV9NQVhfQ1lQSEVSUyAgICAgICAgICAgKCA1ICkKKyNkZWZpbmUgQ1NSX1dBUElfTUFYX1VOSUNBU1RfQ1lQSEVSUyAgICggNSApCisjZGVmaW5lIENTUl9XQVBJX01BWF9NVUxUSUNBU1RfQ1lQSEVSUyAoIDEgKQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyNkZWZpbmUgQ1NSX1JTTl9PVUlfU0laRSAgICAgICAgICAgICAgKCA0ICkKKyNkZWZpbmUgQ1NSX1JTTl9WRVJTSU9OX1NVUFBPUlRFRCAgICAgKCAxICkKKyNkZWZpbmUgQ1NSX1JTTl9NQVhfQVVUSF9TVUlURVMgICAgICAgKCAyICkKKyNkZWZpbmUgQ1NSX1JTTl9NQVhfQ1lQSEVSUyAgICAgICAgICAgKCA1ICkKKyNkZWZpbmUgQ1NSX1JTTl9NQVhfVU5JQ0FTVF9DWVBIRVJTICAgKCA1ICkKKyNkZWZpbmUgQ1NSX1JTTl9NQVhfTVVMVElDQVNUX0NZUEhFUlMgKCAxICkKKworI2RlZmluZSBDU1JfV1BBX09VSV9TSVpFICAgICAgICAgICAgICAoIDQgKQorI2RlZmluZSBDU1JfV1BBX1ZFUlNJT05fU1VQUE9SVEVEICAgICAoIDEgKQorI2RlZmluZSBDU1JfV01FX09VSV9TSVpFICggNCApCisjZGVmaW5lIENTUl9XUEFfTUFYX0FVVEhfU1VJVEVTICAgICAgICggMiApCisjZGVmaW5lIENTUl9XUEFfTUFYX0NZUEhFUlMgICAgICAgICAgICggNSApCisjZGVmaW5lIENTUl9XUEFfTUFYX1VOSUNBU1RfQ1lQSEVSUyAgICggNSApCisjZGVmaW5lIENTUl9XUEFfTUFYX01VTFRJQ0FTVF9DWVBIRVJTICggMSApCisjZGVmaW5lIENTUl9XUEFfSUVfTUlOX1NJWkUgICAgICAgICAgICggNiApICAgLy8gbWluaW11bSBzaXplIG9mIHRoZSBJRS0+bGVuZ3RoIGlzIHRoZSBzaXplIG9mIHRoZSBPdWkgKyBWZXJzaW9uLgorI2RlZmluZSBDU1JfV1BBX0lFX01JTl9TSVpFX1dfTVVMVElDQVNUICggSEREX1dQQV9JRV9NSU5fU0laRSArIEhERF9XUEFfT1VJX1NJWkUgKQorI2RlZmluZSBDU1JfV1BBX0lFX01JTl9TSVpFX1dfVU5JQ0FTVCAgICggSEREX1dQQV9JRV9NSU5fU0laRSArIEhERF9XUEFfT1VJX1NJWkUgKyBzaXplb2YoIHBXcGFJZS0+Y1VuaWNhc3RDeXBoZXJzICkgKQorCisjZGVmaW5lIENTUl9ET1QxMV9TVVBQT1JURURfUkFURVNfTUFYICggMTIgKQorI2RlZmluZSBDU1JfRE9UMTFfRVhURU5ERURfU1VQUE9SVEVEX1JBVEVTX01BWCAoIDggKQorCisjZGVmaW5lIENTUl9ET1QxMV9NQVhfTlVNX1NVUFBPUlRFRF8xMUJfUkFURVMgKCA0ICkKKyNkZWZpbmUgQ1NSX0RPVDExX01BWF9OVU1fU1VQUE9SVEVEXzExQV9SQVRFUyAoIDggKQorI2RlZmluZSBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLICggMHg4MCApCisKKyNkZWZpbmUgQ1NSX1dNRV9JTkZPX0lFX1ZFUlNJT05fU1VQUE9SVEVEICggMSApCisjZGVmaW5lIENTUl9XTUVfUEFSTV9JRV9WRVJTSU9OX1NVUFBPUlRFRCAoIDEgKQorCisjZGVmaW5lIENTUl9QQVNTSVZFX1NDQU5fU1RBUlRJTkdfQ0hBTk5FTCAoIDUyKQorI2RlZmluZSBDU1JfUEFTU0lWRV9TQ0FOX0VORElOR19DSEFOTkVMICggMTQwKQorCisjZGVmaW5lIENTUl9ET1QxMV9NQVhfMTFBX1JBVEUgKCA1NCAqIDIgKQorI2RlZmluZSBDU1JfRE9UMTFfTUlOXzExQV9SQVRFICggIDYgKiAyICkKKyNkZWZpbmUgQ1NSX0RPVDExX01BWF8xMUJfUkFURSAoIDExICogMiApCisjZGVmaW5lIENTUl9ET1QxMV9NSU5fMTFCX1JBVEUgKCAgMSAqIDIgKQorI2RlZmluZSBDU1JfRE9UMTFfTUFYXzExR19SQVRFICggNTQgKiAyICkKKyNkZWZpbmUgQ1NSX0RPVDExX01JTl8xMUdfUkFURSAoICA2ICogMiApCisKKy8vRGVmaW5lIHRoZSBmcmVxdWVuY3kgcmFuZ2VzIHRoYXQgbmVlZCB0byBiZSBwYXNzaXZlIHNjYW4sIE1IegorI2RlZmluZSBDU1JfUEFTU0lWRV9TQ0FOX0NBVDFfTE9XICAgICAgIDUyNTAgCisjZGVmaW5lIENTUl9QQVNTSVZFX1NDQU5fQ0FUMV9ISUdIICAgICAgNTM1MAorI2RlZmluZSBDU1JfUEFTU0lWRV9TQ0FOX0NBVDJfTE9XICAgICAgIDU0NzAgCisjZGVmaW5lIENTUl9QQVNTSVZFX1NDQU5fQ0FUMl9ISUdIICAgICAgNTcyNQorI2RlZmluZSBDU1JfUEFTU0lWRV9TQ0FOX0NBVDNfTE9XICAgICAgIDU1MDAgCisjZGVmaW5lIENTUl9QQVNTSVZFX1NDQU5fQ0FUM19ISUdIICAgICAgNTU2MAorCisjZGVmaW5lIENTUl9PVUlfVVNFX0dST1VQX0NJUEhFUl9JTkRFWCAweDAwCisjZGVmaW5lIENTUl9PVUlfV0VQNDBfT1JfMVhfSU5ERVggICAgICAweDAxCisjZGVmaW5lIENTUl9PVUlfVEtJUF9PUl9QU0tfSU5ERVggICAgICAweDAyCisjZGVmaW5lIENTUl9PVUlfUkVTRVJWRURfSU5ERVggICAgICAgICAweDAzCisjZGVmaW5lIENTUl9PVUlfQUVTX0lOREVYICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIENTUl9PVUlfV0VQMTA0X0lOREVYICAgICAgICAgICAweDA1CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorI2RlZmluZSBDU1JfT1VJX1dBUElfUkVTRVJWRURfSU5ERVggICAgMHgwMAorI2RlZmluZSBDU1JfT1VJX1dBUElfV0FJX0NFUlRfT1JfU01TNF9JTkRFWCAgICAweDAxCisjZGVmaW5lIENTUl9PVUlfV0FQSV9XQUlfUFNLX0lOREVYICAgICAweDAyCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKworCit0eXBlZGVmIGVudW0gCit7CisgICAgLy8gMTFiIHJhdGVzCisgICAgZUNzclN1cHBSYXRlXzFNYnBzICAgPSAgIDEgKiAyLAorICAgIGVDc3JTdXBwUmF0ZV8yTWJwcyAgID0gICAyICogMiwKKyAgICBlQ3NyU3VwcFJhdGVfNV81TWJwcyA9ICAxMSwgICAgICAvLyA1LjUgKiAyCisgICAgZUNzclN1cHBSYXRlXzExTWJwcyAgPSAgMTEgKiAyLAorCisgICAgLy8gMTFhIC8gMTFnIHJhdGVzCisgICAgZUNzclN1cHBSYXRlXzZNYnBzICAgPSAgIDYgKiAyLAorICAgIGVDc3JTdXBwUmF0ZV85TWJwcyAgID0gICA5ICogMiwKKyAgICBlQ3NyU3VwcFJhdGVfMTJNYnBzICA9ICAxMiAqIDIsCisgICAgZUNzclN1cHBSYXRlXzE4TWJwcyAgPSAgMTggKiAyLAorICAgIGVDc3JTdXBwUmF0ZV8yNE1icHMgID0gIDI0ICogMiwKKyAgICBlQ3NyU3VwcFJhdGVfMzZNYnBzICA9ICAzNiAqIDIsCisgICAgZUNzclN1cHBSYXRlXzQ4TWJwcyAgPSAgNDggKiAyLAorICAgIGVDc3JTdXBwUmF0ZV81NE1icHMgID0gIDU0ICogMiwKKworICAgIC8vIGFpcmdvIHByb3ByaWV0YXJ5IHJhdGVzCisgICAgZUNzclN1cHBSYXRlXzEwTWJwcyAgPSAgMTAgKiAyLAorICAgIGVDc3JTdXBwUmF0ZV8xMF81TWJwcz0gIDIxLCAgICAgLy8gMTAuNSAqIDIKKyAgICBlQ3NyU3VwcFJhdGVfMjBNYnBzICA9ICAyMCAqIDIsCisgICAgZUNzclN1cHBSYXRlXzIxTWJwcyAgPSAgMjEgKiAyLAorICAgIGVDc3JTdXBwUmF0ZV80ME1icHMgID0gIDQwICogMiwKKyAgICBlQ3NyU3VwcFJhdGVfNDJNYnBzICA9ICA0MiAqIDIsCisgICAgZUNzclN1cHBSYXRlXzYwTWJwcyAgPSAgNjAgKiAyLAorICAgIGVDc3JTdXBwUmF0ZV82M01icHMgID0gIDYzICogMiwKKyAgICBlQ3NyU3VwcFJhdGVfNzJNYnBzICA9ICA3MiAqIDIsCisgICAgZUNzclN1cHBSYXRlXzgwTWJwcyAgPSAgODAgKiAyLAorICAgIGVDc3JTdXBwUmF0ZV84NE1icHMgID0gIDg0ICogMiwKKyAgICBlQ3NyU3VwcFJhdGVfOTZNYnBzICA9ICA5NiAqIDIsCisgICAgZUNzclN1cHBSYXRlXzEwOE1icHMgPSAxMDggKiAyLAorICAgIGVDc3JTdXBwUmF0ZV8xMjBNYnBzID0gMTIwICogMiwKKyAgICBlQ3NyU3VwcFJhdGVfMTI2TWJwcyA9IDEyNiAqIDIsCisgICAgZUNzclN1cHBSYXRlXzE0NE1icHMgPSAxNDQgKiAyLAorICAgIGVDc3JTdXBwUmF0ZV8xNjBNYnBzID0gMTYwICogMiwKKyAgICBlQ3NyU3VwcFJhdGVfMTY4TWJwcyA9IDE2OCAqIDIsCisgICAgZUNzclN1cHBSYXRlXzE5Mk1icHMgPSAxOTIgKiAyLAorICAgIGVDc3JTdXBwUmF0ZV8yMTZNYnBzID0gMjE2ICogMiwKKyAgICBlQ3NyU3VwcFJhdGVfMjQwTWJwcyA9IDI0MCAqIDIKK31lQ3NyU3VwcG9ydGVkUmF0ZXM7CisKK3R5cGVkZWYgZW51bQoreworICAgIGVDc3JQYXNzaXZlU2Nhbk5vdCwgICAgIC8vY2FuIGJlIHNjYW5uZWQgYWN0aXZlbHkgb24gdGhlIHdob2xlIDVHSHogYmFuZAorICAgIGVDc3JQYXNzaXZlU2NhbkNhdDEsICAgIC8vYWx3YXlzIHBhc3NpdmUgc2NhbiBmcm9tIDUyNTAgdG8gNTM1ME1IegorICAgIGVDc3JQYXNzaXZlU2NhbkNhdDIsICAgIC8vYWx3YXlzIHBhc3NpdmUgc2NhbiBmcm9tIDUyNTAgdG8gNTM1ME1IeiwgYW5kIGZyb20gNTQ3MCB0byA1NzI1TUh6CisgICAgZUNzclBhc3NpdmVTY2FuQ2F0MywgICAgLy9hbHdheXMgcGFzc2l2ZSBzY2FuIGZyb20gNTI1MCB0byA1MzUwTUh6LCBmcm9tIDU0NzAgdG8gNTcyNU1IeiwgYW5kIGZyb20gNTUwMCB0byA1NTYwTUh6Cit9ZUNzclBhc3NpdmVTY2FuQ2F0OworCisKKy8vUGxlYXNlIGRvbm90IGluc2VydCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBlbnVtIGhlcmUgYmVjYXVzZSB0aGV5IHRpZSB0byB0aGUgaW5kaWV4Cit0eXBlZGVmIGVudW0KK3sKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVVMgPSAwLCAgLy9BbHdheXMgc2V0IFVTIGFzIGluZGV4IDAKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQU5ET1JSQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVUFFLCAgICAgLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9BRkdIQU5JU1RBTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQU5USUdVQV9BTkRfQkFSQlVEQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQU5HVUlMTEEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0FMQkFOSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0FSTUVOSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX05FVEhFUkxBTkRTX0FOVElMTEVTLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9BTkdPTEEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0FOVEFSQ1RJQ0EsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0FSR0VOVElOQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQU1FUklDQU5fU0FNT0EsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0FVU1RSSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0FVU1RSQUxJQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQVJVQkEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0FMQU5EX0lTTEFORFMsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0FaRVJCQUlKQU4sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0JPU05JQV9BTkRfSEVSWkVHT1ZJTkEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0JBUkJBRE9TLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9CQU5HTEFERVNILAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9CRUxHSVVNLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9CVVJLSU5BX0ZBU08sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0JVTEdBUklBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9CQUhSQUlOLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9CVVJVTkRJLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9CRU5JTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU0FJTlRfQkFSVEhFTEVNWSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQkVSTVVEQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQlJVTkVJX0RBUlVTU0FMQU0sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0JPTFZJQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQlJBWklMLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9CQUhBTUFTLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9CSFVUQU4sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0JPVVZFVF9JU0xBTkQsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0JPVFNXQU5BLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9CRUxBUlVTLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9CRUxJWkUsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NBTkFEQSwgICAgICAKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQ09DT1NfS0VFTElOR19JU0xBTkRTLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9DT05HT19SRVAsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NFTlRSQUxfQUZSSUNBTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQ09OR08sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NXSVRaRVJMQU5ELAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9DT1RFX0RJVk9JUkUsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NPT0tfSVNMQU5EUywKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQ0hJTEUsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NBTUVST09OLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9DSElOQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQ09MVU1CSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NPU1RBX1JJQ0EsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NVQkEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NBUEVfVkVSREUsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NIUklTVE1BU19JU0xBTkQsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NZUFJVUywKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQ1pFQ0gsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0dFUk1BTlksCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0RKSUJPVVRJLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9ERU5NQVJLLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9ET01JTklDQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfRE9NSU5JQ0FOX1JFUCwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQUxHRVJJQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfRUNVQURPUiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfRVNUT05JQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfRUdZUFQsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1dFU1RFUk5fU0FIQVJBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9FUklUUkVBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9TUEFJTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfRVRISU9QSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0ZJTkxBTkQsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0ZJSkksCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0ZBTEtMQU5EX0lTTEFORFMsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01JQ1JPTkVTSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0ZBUk9FX0lTTEFORFMsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0ZSQU5DRSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfR0FCT04sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1VOSVRFRF9LSU5HRE9NLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9HUkVOQURBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9HRU9SR0lBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9GUkVOQ0hfR1VJQU5BLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9HVUVSTlNFWSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfR0hBTkEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0dJQlJBTFRBUiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfR1JFRU5MQU5ELAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9HQU1CSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0dVSU5FQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfR1VBREVMT1VQRSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfRVFVQVRPUklBTF9HVUlORUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0dSRUVDRSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU09VVEhfR0VPUkdJQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfR1VBVEVNQUxBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9HVUFNLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9HVUlORUFfQklTU0FVLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9HVVlBTkEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0hPTkdLT05HLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9IRUFSRF9JU0xBTkQsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0hPTkRVUkFTLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9DUk9BVElBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9IQUlUSSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfSFVOR0FSWSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfSU5ET05FU0lBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9JUkVMQU5ELAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9JU1JBRUwsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0lTTEVfT0ZfTUFOLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9JTkRJQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfQlJJVElTSF9JTkRJQU4sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0lSQVEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0lSQU4sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0lDRUxBTkQsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0lUQUxZLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9KRVJTRVksCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0pBTUFJQ0EsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0pPUkRBTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfSkFQQU4sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0tFTllBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9LWVJHWVpTVEFOLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9DQU1CT0RJQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfS0lSSUJBVEksCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NPTU9ST1MsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NBSU5UX0tJVFRTX0FORF9ORVZJUywKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfS09SRUFfTk9SVEgsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0tPUkVBX1NPVVRILAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9LVVdBSVQsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0NBWU1BTl9JU0xBTkRTLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9LQVpBS0hTVEFOLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9MQU8sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0xFQkFOT04sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NBSU5UX0xVQ0lBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9MSUVDSFRFTlNURUlOLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9TUklfTEFOS0EsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0xJQkVSSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0xFU09USE8sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX0xJVEhVQU5JQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfTFVYRU1CT1VSRywKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfTEFUVklBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9MSUJZQU5fQVJBQl9KQU1BSElSSVlBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9NT1JPQ0NPLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9NT05BQ08sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01PTERPVkEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01PTlRFTkVHUk8sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01BREFHQVNDQVIsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01BUlNIQUxMX0lTTEFORFMsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01BQ0VET05JQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfTUFMSSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfTVlBTk1BUiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfTU9OR09MSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01BQ0FPLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9OT1JUSEVSTl9NQVJJQU5BX0lTTEFORFMsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01BUlRJTklRVUUsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01BVVJJVEFOSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01PTlRTRVJSQVQsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01BTFRBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9NQVVSSVRJVVMsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01BTERJVkVTLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9NQUxBV0ksCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01FWElDTywKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfTUFMQVlTSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX01PWkFNQklRVUUsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX05BTUlCSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX05FV19DQUxFTkRPTklBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9OSUdFUiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfTk9SRk9MS19JU0xBTkQsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX05JR0VSSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX05JQ0FSQUdVQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfTkVUSEVSTEFORFMsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX05PUldBWSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfTkVQQUwsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX05BVVJVLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9OSVVFLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9ORVdfWkVBTEFORCwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfT01BTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfUEFOQU1BLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9QRVJVLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9GUkVOQ0hfUE9MWU5FU0lBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9QQVBVQV9ORVdfSFVJTkVBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9QSElMSVBQSU5FUywKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfUEFLSVNUQU4sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1BPTEFORCwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU0FJTlRfUElFUlJFX0FORF9NSVFVRUxPTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfUElUQ0FJUk4sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1BVRVJUT19SSUNPLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9QQUxFU1RJTklBTl9URVJSSVRPVFlfT0NDVVBJRUQsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1BPUlRVR0FMLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9QQUxBVSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfUEFSQUdVQVksCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1FBVEFSLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9SRVVOSU9OLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9ST01BTklBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9TRVJCSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1JVU1NJQU4sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1JXQU5EQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU0FVRElfQVJBQklBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9TT0xPTU9OX0lTTEFORFMsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NFWUNIRUxMRVMsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NVREFOLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9TV0VERU4sCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NJTkdBUE9SRSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU0FJTlRfSEVMRU5BLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9TTE9WRU5JQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU1ZBTEJBUkRfQU5EX0pBTl9NQVlFTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU0xPVkFLSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NJRVJSQV9MRU9ORSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU0FOX01BUklOTywKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU0VORUdBTCwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU09NT0xJQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU1VSSU5BTUUsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NBT19UT01FX0FORF9QUklOQ0lQRSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfRUxfU0FMVkFET1IsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NZUklBTl9SRVAsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NXQVpJTEFORCwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVFVSS1NfQU5EX0NBSUNPU19JU0xBTkRTLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9DSEFELAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9GUkVOQ0hfU09VVEhFUk5fVEVSUlJUT1JZLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9UT0dPLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9USEFJTEFORCwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVEFKSUtTVEFOLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9UT0tFTEFVLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9USU1PUl9MRVNURSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVFVSS01FTklTVEFOLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9UVU5JU0lBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9UT05HQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVFVSS0VZLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9UUklOSURBRF9BTkRfVE9CQUdPLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9UVVZBTFUsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1RBSVdBTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVEFOWkFOSUEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1VLUkFJTkUsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1VHQU5EQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVVNfTUlOT1JfT1VUTFlJTkdfSVNMQU5EUywKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVVJVR1VBWSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVVpCRUtJU1RBTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfSE9MWV9TRUUsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NBSU5UX1ZJTkNFTlRfQU5EX1RIRV9HUkVOQURJTkVTLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9WRU5FU1VFTEEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1ZJUkdJTl9JU0xBTkRTX0JSSVRJU0gsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1ZJUkdJTl9JU0xBTkRTX1VTLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9WSUVUX05BTSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfVkFOVUFUVSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfV0FMTElTX0FORF9GVVRVTkEsCisgICAgZUNTUl9DT1VOVFJZX0lOREVYX1NBTU9BLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9ZRU1FTiwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfTUFZT1RURSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfU09USEVSX0FGUklDQSwKKyAgICBlQ1NSX0NPVU5UUllfSU5ERVhfWkFNQklBLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9aSU1CQUJXRSwKKworICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9LT1JFQV8xLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9LT1JFQV8yLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9LT1JFQV8zLAorICAgIGVDU1JfQ09VTlRSWV9JTkRFWF9LT1JFQV80LAorCisgICAgZUNTUl9OVU1fQ09VTlRSWV9JTkRFWCwgICAgIAorfWVDc3JDb3VudHJ5SW5kZXg7CisvL1BsZWFzZSBkb25vdCBpbnNlcnQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZW51bSBhYm92ZSBiZWNhdXNlIHRoZXkgdGllIHRvIHRoZSBpbmRpZXgKKworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JTaXJNQk1zZ0hkciAKK3sKKyAgICB0QU5JX1UxNiB0eXBlOworICAgIHRBTklfVTE2IG1zZ0xlbjsKKworfXRDc3JTaXJNQk1zZ0hkcjsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ2ZnTXNnVGx2SGRyIAoreworICAgIHRBTklfVTMyIHR5cGU7CisgICAgdEFOSV9VMzIgbGVuZ3RoOyAgICAKKworfXRDc3JDZmdNc2dUbHZIZHI7CisKKworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JDZmdNc2dUbHYKK3sKKyAgICB0Q3NyQ2ZnTXNnVGx2SGRyIEhkcjsKKyAgICB0QU5JX1UzMiB2YXJpYWJsZVsgMSBdOyAgICAvLyBwbGFjZWhvbGRlciBmb3IgdGhlIGRhdGEKKyAgICAKK310Q3NyQ2ZnTXNnVGx2OworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JDZmdHZXRSc3AgCit7CisgIHRDc3JTaXJNQk1zZ0hkciBoZHI7CisgIHRBTklfVTMyICAgIHJlc3BTdGF0dXM7CisgIHRBTklfVTMyICAgIHBhcmFtSWQ7CisgIHRBTklfVTMyICAgIGF0dHJpYkxlbjsKKyAgdEFOSV9VMzIgICAgYXR0cmliVmFsWzFdOworfXRDc3JDZmdHZXRSc3A7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0NzckNmZ1NldFJzcCAKK3sKKyAgCisgIHRDc3JTaXJNQk1zZ0hkciBoZHI7CisgIHRBTklfVTMyICAgIHJlc3BTdGF0dXM7CisgIHRBTklfVTMyICAgIHBhcmFtSWQ7Cit9dENzckNmZ1NldFJzcDsKKworCit0eXBlZGVmIHN0cnVjdCB0YWdDc3JEb21haW5DaG5TY2FuSW5mbworeworICAgIHRBTklfVTggY2huSWQ7CisgICAgdFNpclNjYW5UeXBlIHNjYW5UeXBlOyAgLy93aGV0aGVyIHRoaXMgY2hhbm5lbCBtdXN0IGJlIHNjYW4gcGFzc2l2ZWx5Cit9dENzckRvbWFpbkNoblNjYW5JbmZvOworCisKKyNpZiBkZWZpbmVkKF9fQU5JX0NPTVBJTEVSX1BSQUdNQV9QQUNLX1NUQUNLKQorI3ByYWdtYSBwYWNrKCBwdXNoICkKKyNwcmFnbWEgcGFjayggMSApCisjZWxpZiBkZWZpbmVkKF9fQU5JX0NPTVBJTEVSX1BSQUdNQV9QQUNLKQorI3ByYWdtYSBwYWNrKCAxICkKKyNlbmRpZgorCisvLyBHZW5lcmljIEluZm9ybWF0aW9uIEVsZW1lbnQgU3RydWN0dXJlCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc0RvdDExSUVIZWFkZXIgCit7CisgICAgdEFOSV9VOCBFbGVtZW50SUQ7CisgICAgdEFOSV9VOCBMZW5ndGg7Cit9X19hbmlfYXR0cl9wYWNrZWQgdERvdDExSUVIZWFkZXI7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB0YWdDc3JXbWVJbmZvSWUKK3sKKyAgICB0RG90MTFJRUhlYWRlciBJZUhlYWRlcjsKKyAgICB0QU5JX1U4ICAgIE91aVsgQ1NSX1dNRV9PVUlfU0laRSBdOyAgLy8gaW5jbHVkZXMgdGhlIDMgYnl0ZSBPVUkgKyAxIGJ5dGUgVHlwZQorICAgIHRBTklfVTggICAgU3VidHlwZTsKKyAgICB0QU5JX1U4ICAgIFZlcnNpb247CisgICAgdEFOSV9VOCAgICBRb1NJbmZvOworICAgIAorfSBfX2FuaV9hdHRyX3BhY2tlZCB0Q3NyV21lSW5mb0llOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3QgdGFnQ3NyV21lQWNQYXJtcworeworICAgIHRBTklfVTggIEFjaUFpZnNuOworICAgIHRBTklfVTggIEVjd01pbkVjd01heDsKKyAgICB0QU5JX1UxNiBUeE9wTGltaXQ7CisgICAgCit9IF9fYW5pX2F0dHJfcGFja2VkIHRDc3JXbWVBY1Bhcm1zOworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3QgdGFnQ3NyV21lUGFybUllCit7CisgICAgdERvdDExSUVIZWFkZXIgSWVIZWFkZXI7CisgICAgdEFOSV9VOCAgICBPdWlbIENTUl9XTUVfT1VJX1NJWkUgXTsgIC8vIGluY2x1ZGVzIHRoZSAzIGJ5dGUgT1VJICsgMSBieXRlIFR5cGUKKyAgICB0QU5JX1U4ICAgIFN1YnR5cGU7CisgICAgdEFOSV9VOCAgICBWZXJzaW9uOworICAgIHRBTklfVTggICAgUW9TSW5mbzsKKyAgICB0QU5JX1U4ICAgIFJlc2VydmVkOworICAgIHRDc3JXbWVBY1Bhcm1zICAgQmVzdEVmZm9ydDsKKyAgICB0Q3NyV21lQWNQYXJtcyAgIEJhY2tncm91bmQ7CisgICAgdENzcldtZUFjUGFybXMgICBWaWRlbzsKKyAgICB0Q3NyV21lQWNQYXJtcyAgIFZvaWNlOworICAgICAgICAKK30gX19hbmlfYXR0cl9wYWNrZWQgdENzcldtZVBhcm1JZTsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHRhZ0NzcldwYUllIAoreworICAgIHREb3QxMUlFSGVhZGVyIEllSGVhZGVyOworICAgIHRBTklfVTggICAgT3VpWyBDU1JfV1BBX09VSV9TSVpFIF07CisgICAgdEFOSV9VMTYgICBWZXJzaW9uOworICAgIHRBTklfVTggICAgTXVsdGljYXN0T3VpWyBDU1JfV1BBX09VSV9TSVpFIF07CisgICAgdEFOSV9VMTYgICBjVW5pY2FzdEN5cGhlcnM7CisgICAgCisgICAgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB7CisgICAgCisgICAgICAgIHRBTklfVTggT3VpWyBDU1JfV1BBX09VSV9TSVpFIF07CisgICAgICAgIAorICAgIH0gX19hbmlfYXR0cl9wYWNrZWQgVW5pY2FzdE91aVsgMSBdOworICAgIAorfSBfX2FuaV9hdHRyX3BhY2tlZCB0Q3NyV3BhSWU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB0YWdDc3JXcGFBdXRoSWUgCit7CisKKyAgICB0QU5JX1UxNiBjQXV0aGVudGljYXRpb25TdWl0ZXM7CisgICAgCisgICAgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB7CisgICAgCisgICAgICAgIHRBTklfVTggT3VpWyBDU1JfV1BBX09VSV9TSVpFIF07CisgICAgCisgICAgfSBfX2FuaV9hdHRyX3BhY2tlZCBBdXRoT3VpWyAxIF07CisKK30gX19hbmlfYXR0cl9wYWNrZWQgdENzcldwYUF1dGhJZTsKKworCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3QgdGFnQ3NyUlNOSWUgCit7CisgICAgdERvdDExSUVIZWFkZXIgSWVIZWFkZXI7CisgICAgdEFOSV9VMTYgICBWZXJzaW9uOworICAgIHRBTklfVTggICAgTXVsdGljYXN0T3VpWyBDU1JfUlNOX09VSV9TSVpFIF07CisgICAgdEFOSV9VMTYgICBjVW5pY2FzdEN5cGhlcnM7CisgICAgCisgICAgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB7CisgICAgCisgICAgICAgIHRBTklfVTggT3VpWyBDU1JfUlNOX09VSV9TSVpFIF07CisgICAgICAgIAorICAgIH0gX19hbmlfYXR0cl9wYWNrZWQgVW5pY2FzdE91aVsgMSBdOworICAgIAorfSBfX2FuaV9hdHRyX3BhY2tlZCB0Q3NyUlNOSWU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB0YWdDc3JSU05BdXRoSWUgCit7CisgICAgdEFOSV9VMTYgY0F1dGhlbnRpY2F0aW9uU3VpdGVzOworICAgIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3QgeworICAgIAorICAgICAgICB0QU5JX1U4IE91aVsgQ1NSX1JTTl9PVUlfU0laRSBdOworICAgIAorICAgIH0gX19hbmlfYXR0cl9wYWNrZWQgQXV0aE91aVsgMSBdOworCit9IF9fYW5pX2F0dHJfcGFja2VkIHRDc3JSU05BdXRoSWU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB0YWdDc3JSU05DYXBhYmlsaXRpZXMgCit7CisgICAgdEFOSV9VMTYgUHJlQXV0aFN1cHBvcnRlZDoxOworICAgIHRBTklfVTE2IE5vUGFpcndpc2U6MTsKKyAgICB0QU5JX1UxNiBQVEtTQVJlcGxheUNvdW50ZXI6MjsKKyAgICB0QU5JX1UxNiBHVEtTQVJlcGxheUNvdW50ZXI6MjsKKyAgICB0QU5JX1UxNiBSZXNlcnZlZDoxMDsKK30gX19hbmlfYXR0cl9wYWNrZWQgdENzclJTTkNhcGFiaWxpdGllczsKKwordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHRhZ0NzclJTTlBNS0llIAoreworICAgIHRBTklfVTE2IGNQTUtJRHM7CisgICAgCisgICAgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB7CisgICAgCisgICAgICAgIHRBTklfVTggUE1LSURbIENTUl9SU05fUE1LSURfU0laRSBdOworICAgIAorICAgIH0gX19hbmlfYXR0cl9wYWNrZWQgUE1LSURMaXN0WyAxIF07CisKKworfSBfX2FuaV9hdHRyX3BhY2tlZCB0Q3NyUlNOUE1LSWU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB0Q3NySUVMZW5JbmZvCit7CisgICAgdEFOSV9VOCBtaW47CisgICAgdEFOSV9VOCBtYXg7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRDc3JJRUxlbkluZm87CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHRhZ0NzcldhcGlJZSAKK3sKKyAgICB0RG90MTFJRUhlYWRlciBJZUhlYWRlcjsKKyAgICB0QU5JX1UxNiAgIFZlcnNpb247CisKKyAgICB0QU5JX1UxNiBjQXV0aGVudGljYXRpb25TdWl0ZXM7CisgICAgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB7CisKKyAgICAgICAgdEFOSV9VOCBPdWlbIENTUl9XQVBJX09VSV9TSVpFIF07CisKKyAgICB9IF9fYW5pX2F0dHJfcGFja2VkIEF1dGhPdWlbIDEgXTsKKworICAgIHRBTklfVTE2ICAgY1VuaWNhc3RDeXBoZXJzOworICAgIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3QgeworCisgICAgICAgIHRBTklfVTggT3VpWyBDU1JfV0FQSV9PVUlfU0laRSBdOworCisgICAgfSBfX2FuaV9hdHRyX3BhY2tlZCBVbmljYXN0T3VpWyAxIF07CisKKyAgICB0QU5JX1U4ICAgIE11bHRpY2FzdE91aVsgQ1NSX1dBUElfT1VJX1NJWkUgXTsgICAgCisKKyAgICBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHsKKyAgICAgICB0QU5JX1UxNiBQcmVBdXRoU3VwcG9ydGVkOjE7CisgICAgICAgdEFOSV9VMTYgUmVzZXJ2ZWQ6MTU7CisgICAgfSBfX2FuaV9hdHRyX3BhY2tlZCB0Q3NyV2FwaUNhcGFiaWxpdGllczsKKworCit9IF9fYW5pX2F0dHJfcGFja2VkIHRDc3JXYXBpSWU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB0YWdDc3JXQVBJQktJZSAKK3sKKyAgICB0QU5JX1UxNiBjQktJRHM7CisgICAgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCB7CisKKyAgICAgICAgdEFOSV9VOCBCS0lEWyBDU1JfV0FQSV9CS0lEX1NJWkUgXTsKKworICAgIH0gX19hbmlfYXR0cl9wYWNrZWQgQktJRExpc3RbIDEgXTsKKworCit9IF9fYW5pX2F0dHJfcGFja2VkIHRDc3JXQVBJQktJZTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisjaWYgZGVmaW5lZChfX0FOSV9DT01QSUxFUl9QUkFHTUFfUEFDS19TVEFDSykKKyNwcmFnbWEgcGFjayggcG9wICkKKyNlbmRpZgorCisvLyBTdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGdyb3VwIG9mIGNvbnRpbnVvdXMgY2hhbm5lbHMgYW5kIGhvb2sgaXQgaW50byB0aGUgCisvLyBjb3JyZXNwb25kaW5nIGNoYW5uZWwgbGlzdAordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyQ2hhbm5lbFNldCAKK3sKKyAgdExpc3RFbGVtICAgICAgY2hhbm5lbExpc3RMaW5rOworICB0QU5JX1U4ICAgZmlyc3RDaGFubmVsOworICB0QU5JX1U4ICAgaW50ZXJDaGFubmVsT2Zmc2V0OworICB0QU5JX1U4ICAgbnVtQ2hhbm5lbHM7CisgIHRBTklfVTggICB0eFBvd2VyOworfXRDc3JDaGFubmVsU2V0OworCisKK3R5cGVkZWYgc3RydWN0IHNEb3QxMUluZm9JQlNTUGFybVNldCAKK3sKKyAgICB0RG90MTFJRUhlYWRlciBkb3QxMUlFSGVhZGVyOworICAgIHRBTklfVTggQVRJTVdpbmRvdzsKK310RG90MTFJbmZvSUJTU1Bhcm1TZXQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExSUVDb3VudHJ5IAoreworICAgIHREb3QxMUlFSGVhZGVyIGRvdDExSUVIZWFkZXI7CisgICAgdEFOSV9VOCBjb3VudHJ5U3RyaW5nWzNdOworICAgIHRTaXJNYWNDaGFuSW5mbyBjaGFuSW5mb1sxXTsKK310RG90MTFJRUNvdW50cnk7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0RvdDExSUVFeHRlbmVkU3VwcG9ydGVkUmF0ZXMgCit7CisgICAgdERvdDExSUVIZWFkZXIgZG90MTFJRUhlYWRlcjsKKyAgICB0QU5JX1U4IEV4dGVuZGVkU3VwcG9ydGVkUmF0ZXNbIENTUl9ET1QxMV9FWFRFTkRFRF9TVVBQT1JURURfUkFURVNfTUFYIF07Cit9dERvdDExSUVFeHRlbmVkU3VwcG9ydGVkUmF0ZXM7CisKKyNkZWZpbmUgQ1NSX0RPVDExX0FQX05BTUVfTUFYX0xFTkdUSCAoIDMyICkKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRG90MTFJRUFQTmFtZQoreworICAgIHREb3QxMUlFSGVhZGVyIGRvdDExSUVIZWFkZXI7CisgICAgdEFOSV9VOCBBcE5hbWVbIENTUl9ET1QxMV9BUF9OQU1FX01BWF9MRU5HVEggXTsKK310RG90MTFJRUFQTmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRG90MTFJRTExSExvY2FsUG93ZXJDb25zdHJhaW50Cit7CisgICAgdERvdDExSUVIZWFkZXIgZG90MTFJRUhlYWRlcjsKKyAgICB0QU5JX1U4IGxvY2FsUG93ZXJDb25zdHJhaW50OworCit9dERvdDExSUUxMUhMb2NhbFBvd2VyQ29uc3RyYWludDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUm9hbWluZ1RpbWVySW5mbworeworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWM7CisgICAgdEFOSV9VOCBzZXNzaW9uSWQ7Cit9IHRDc3JUaW1lckluZm87CisKKworI2RlZmluZSBDU1JfSVNfMTFBX0JTUyhwQnNzRGVzYykgICAgKCBlU0lSXzExQV9OV19UWVBFID09IChwQnNzRGVzYyktPm53VHlwZSApCisjZGVmaW5lIENTUl9JU19CQVNJQ19SQVRFKHJhdGUpICAgICAoKHJhdGUpICYgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSykKKyNkZWZpbmUgQ1NSX0lTX1FPU19CU1MocEllcykgICggKHBJZXMpLT5XTU1QYXJhbXMucHJlc2VudCB8fCAocEllcyktPldNTUluZm9BcC5wcmVzZW50ICkKKworI2RlZmluZSBDU1JfSVNfVUFQU0RfQlNTKHBJZXMpIFwKKyAgICAoICgocEllcyktPldNTVBhcmFtcy5wcmVzZW50ICYmICgocEllcyktPldNTVBhcmFtcy5xb3NJbmZvICYgU01FX1FPU19BUF9TVVBQT1JUU19BUFNEKSkgfHwgXAorICAgICAgICAgICAgICAgKChwSWVzKS0+V01NSW5mb0FwLnByZXNlbnQgJiYgKHBJZXMpLT5XTU1JbmZvQXAudWFwc2QpICkKKworLy9UaGlzIG1hY3JvIHJldHVybnMgdGhlIHRvdGFsIGxlbmd0aCBuZWVkZWQgb2YgVGx2IHdpdGggd2l0aCBsZW4gYnl0ZXMgb2YgZGF0YQorI2RlZmluZSBHRVRfVExWX01TR19MRU4obGVuKSAgICBHRVRfUk9VTkRfVVAoKHNpemVvZih0Q3NyQ2ZnTXNnVGx2SGRyKSArIChsZW4pKSwgc2l6ZW9mKHRBTklfVTMyKSkKKwordEFOSV9CT09MRUFOIGNzckdldEJzc0lkQnNzRGVzYyggdEhhbEhhbmRsZSBoSGFsLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCB0Q3NyQnNzaWQgKnBCc3NJZCApOyAKK3RBTklfQk9PTEVBTiBjc3JJc0Jzc0lkRXF1YWwoIHRIYWxIYW5kbGUgaEhhbCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzEsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MyICk7CisKK2VDc3JNZWRpYUFjY2Vzc1R5cGUgY3NyR2V0UW9TRnJvbUJzc0Rlc2MoIHRIYWxIYW5kbGUgaEhhbCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpOwordEFOSV9CT09MRUFOIGNzcklzTlVMTFNTSUQoIHRBTklfVTggKnBCc3NTc2lkLCB0QU5JX1U4IGxlbiApOwordEFOSV9CT09MRUFOIGNzcklzSW5mcmFCc3NEZXNjKCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjICk7IAordEFOSV9CT09MRUFOIGNzcklzSWJzc0Jzc0Rlc2MoIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MgKTsgCit0QU5JX0JPT0xFQU4gY3NySXNQcml2YWN5KCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjICk7Cit0U2lyUmVzdWx0Q29kZXMgY3NyR2V0RGlzYXNzb2NSc3BTdGF0dXNDb2RlKCB0U2lyU21lRGlzYXNzb2NSc3AgKnBTbWVEaXNhc3NvY1JzcCApOwordFNpclJlc3VsdENvZGVzIGNzckdldERlQXV0aFJzcFN0YXR1c0NvZGUoIHRTaXJTbWVEZWF1dGhSc3AgKnBTbWVSc3AgKTsKK3RBTklfVTMyIGNzckdldEZyYWdUaHJlc2goIHRIYWxIYW5kbGUgaEhhbCApOwordEFOSV9VMzIgY3NyR2V0UlRTVGhyZXNoKCB0SGFsSGFuZGxlIGhIYWwgKTsKK2VDc3JQaHlNb2RlIGNzckdldFBoeU1vZGVGcm9tQnNzRGVzYyggdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYyApOwordEFOSV9VMzIgY3NyR2V0MTFoUG93ZXJDb25zdHJhaW50KCB0SGFsSGFuZGxlIGhIYWwsIHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMgKnBQb3dlckNvbnN0cmFpbnQgKTsKK3RBTklfVTggY3NyQ29uc3RydWN0UlNOSWUoIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0Q3NyUlNOSWUgKnBSU05JZSApOwordEFOSV9VOCBjc3JDb25zdHJ1Y3RXcGFJZSggdEhhbEhhbmRsZSBoSGFsLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JXcGFJZSAqcFdwYUllICk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKwordEFOSV9CT09MRUFOIGNzcklzUHJvZmlsZVdhcGkoIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUgKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworLy9JZiBhIFdQQUlFIGV4aXN0cyBpbiB0aGUgcHJvZmlsZSwganVzdCB1c2UgaXQuIE9yIGVsc2UgY29uc3RydWN0IG9uZSBmcm9tIHRoZSBCU1MKKy8vQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBXcGFJZSBhbmQgZ3VhcnJhbnRlZSBpdCBjYW4gY29udGFpbiBhIG1heCBsZW5ndGggV1BBIElFCit0QU5JX1U4IGNzclJldHJpZXZlV3BhSWUoIHRIYWxIYW5kbGUgaEhhbCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JXcGFJZSAqcFdwYUllICk7Cit0QU5JX0JPT0xFQU4gY3NySXNTc2lkRXF1YWwoIHRIYWxIYW5kbGUgaEhhbCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMiwgdERvdDExZkJlYWNvbklFcyAqcEllczIgKTsKKy8vTnVsbCBzc2lkIG1lYW5zIG1hdGNoCit0QU5JX0JPT0xFQU4gY3NySXNTc2lkSW5MaXN0KCB0SGFsSGFuZGxlIGhIYWwsIHRTaXJNYWNTU2lkICpwU3NpZCwgdENzclNTSURzICpwU3NpZExpc3QgKTsKK3RBTklfQk9PTEVBTiBjc3JJc1Byb2ZpbGVXcGEoIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUgKTsKK3RBTklfQk9PTEVBTiBjc3JJc1Byb2ZpbGVSU04oIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUgKTsKKy8vVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByYXcgYnl0ZSBhcnJheSBvZiBXUEEgYW5kL29yIFJTTiBJRQordEFOSV9CT09MRUFOIGNzckdldFdwYVJzbkllKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggKnBJZXMsIHRBTklfVTMyIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFdwYUllLCB0QU5JX1U4ICpwY2JXcGFJZSwgdEFOSV9VOCAqcFJTTkllLCB0QU5JX1U4ICpwY2JSU05JZSk7CisvL0lmIGEgUlNOSUUgZXhpc3RzIGluIHRoZSBwcm9maWxlLCBqdXN0IHVzZSBpdC4gT3IgZWxzZSBjb25zdHJ1Y3Qgb25lIGZyb20gdGhlIEJTUworLy9DYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBmb3IgcFdwYUllIGFuZCBndWFycmFudGVlIGl0IGNhbiBjb250YWluIGEgbWF4IGxlbmd0aCBXUEEgSUUKK3RBTklfVTggY3NyUmV0cmlldmVSc25JZSggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0Q3NyUlNOSWUgKnBSc25JZSApOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisvL0lmIGEgV0FQSSBJRSBleGlzdHMgaW4gdGhlIHByb2ZpbGUsIGp1c3QgdXNlIGl0LiBPciBlbHNlIGNvbnN0cnVjdCBvbmUgZnJvbSB0aGUgQlNTCisvL0NhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IGZvciBwV2FwaUllIGFuZCBndWFycmFudGVlIGl0IGNhbiBjb250YWluIGEgbWF4IGxlbmd0aCBXQVBJIElFCit0QU5JX1U4IGNzclJldHJpZXZlV2FwaUllKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JXYXBpSWUgKnBXYXBpSWUgKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwordEFOSV9CT09MRUFOIGNzclNlYXJjaENoYW5uZWxMaXN0Rm9yVHhQb3dlcih0SGFsSGFuZGxlIGhIYWwsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyaXB0aW9uLCB0Q3NyQ2hhbm5lbFNldCAqcmV0dXJuQ2hhbm5lbEdyb3VwKTsKK3RBTklfQk9PTEVBTiBjc3JSYXRlc0lzRG90MTFSYXRlMTFiU3VwcG9ydGVkUmF0ZSggdEFOSV9VOCBkb3QxMVJhdGUgKTsKK3RBTklfQk9PTEVBTiBjc3JSYXRlc0lzRG90MTFSYXRlMTFhU3VwcG9ydGVkUmF0ZSggdEFOSV9VOCBkb3QxMVJhdGUgKTsKK3RBbmlFZFR5cGUgY3NyVHJhbnNsYXRlRW5jcnlwdFR5cGVUb0VkVHlwZSggZUNzckVuY3J5cHRpb25UeXBlIEVuY3J5cHRUeXBlICk7IAorLy9wSWVzIHNoYWxsIGNvbnRhaW4gSUVzIGZyb20gcFNpckJzc0Rlc2MuIEl0IHNoYWxsIGJlIHJldHVybmVkIGZyb20gZnVuY3Rpb24gY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMgCit0QU5JX0JPT0xFQU4gY3NySXNTZWN1cml0eU1hdGNoKCB0SGFsSGFuZGxlIGhIYWwsIHRDc3JBdXRoTGlzdCAqYXV0aFR5cGUsIHRDc3JFbmNyeXB0aW9uTGlzdCAqcFVDRW5jcnlwdGlvblR5cGUsIHRDc3JFbmNyeXB0aW9uTGlzdCAqcE1DRW5jcnlwdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JBdXRoVHlwZSAqbmVnb3RpYXRlZEF1dGh0eXBlLCBlQ3NyRW5jcnlwdGlvblR5cGUgKm5lZ290aWF0ZWRVQ0NpcGhlciwgZUNzckVuY3J5cHRpb25UeXBlICpuZWdvdGlhdGVkTUNDaXBoZXIgKTsKK3RBTklfQk9PTEVBTiBjc3JJc0JTU1R5cGVNYXRjaChlQ3NyUm9hbUJzc1R5cGUgYnNzVHlwZTEsIGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlMik7Cit0QU5JX0JPT0xFQU4gY3NySXNCc3NUeXBlSUJTUyhlQ3NyUm9hbUJzc1R5cGUgYnNzVHlwZSk7Cit0QU5JX0JPT0xFQU4gY3NySXNCc3NUeXBlV0RTKGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlKTsKKy8vcHBJZXMgY2FuIGJlIE5VTEwuIElmIGNhbGxlciB3YW50IHRvIGdldCB0aGUgKnBwSWVzIGFsbG9jYXRlZCBieSB0aGlzIGZ1bmN0aW9uLCBwYXNzIGluICpwcEllcyA9IE5VTEwKKy8vQ2FsbGVyIG5lZWRzIHRvIGZyZWUgdGhlIG1lbW9yeSBpbiB0aGlzIGNhc2UKK3RBTklfQk9PTEVBTiBjc3JNYXRjaEJTUyggdEhhbEhhbmRsZSBoSGFsLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcEZpbHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JBdXRoVHlwZSAqcE5lZ0F1dGgsIGVDc3JFbmNyeXB0aW9uVHlwZSAqcE5lZ1VjLCBlQ3NyRW5jcnlwdGlvblR5cGUgKnBOZWdNYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqKnBwSWVzKTsKKwordEFOSV9CT09MRUFOIGNzcklzQnNzaWRNYXRjaCggdEhhbEhhbmRsZSBoSGFsLCB0Q3NyQnNzaWQgKnBQcm9mQnNzaWQsIHRDc3JCc3NpZCAqQnNzQnNzaWQgKTsKK3RBTklfQk9PTEVBTiBjc3JNYXRjaEJTU1RvQ29ubmVjdFByb2ZpbGUoIHRIYWxIYW5kbGUgaEhhbCwgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMgKTsKK3RBTklfQk9PTEVBTiBjc3JSYXRlc0lzRG90MTFSYXRlU3VwcG9ydGVkKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggcmF0ZSApOwordEFOSV9VMTYgY3NyUmF0ZXNGaW5kQmVzdFJhdGUoIHRTaXJNYWNSYXRlU2V0ICpwU3VwcFJhdGVzLCB0U2lyTWFjUmF0ZVNldCAqcEV4dFJhdGVzLCB0U2lyTWFjUHJvcFJhdGVTZXQgKnBQcm9wUmF0ZXMgKTsKK3RTaXJCc3NUeXBlIGNzclRyYW5zbGF0ZUJzc3R5cGVUb01hY1R5cGUoZUNzclJvYW1Cc3NUeXBlIGNzcnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLy9DYWxsZXIgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcElFU3RydWN0CitlSGFsU3RhdHVzIGNzclBhcnNlQnNzRGVzY3JpcHRpb25JRXModEhhbEhhbmRsZSBoSGFsLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSUVTdHJ1Y3QpOworLy9UaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGFyc2VkIElFcyB0byB0aGUgY2FsbGVyLiBDYWxsZXIgbXVzdCBmcmVlIHRoZSBtZW1vcnkKKy8vYWZ0ZXIgaXQgaXMgZG9uZSB3aXRoIHRoZSBkYXRhIG9ubHkgaWYgdGhpcyBmdW5jdGlvbiBzdWNjZWVkcworZUhhbFN0YXR1cyBjc3JHZXRQYXJzZWRCc3NEZXNjcmlwdGlvbklFcyh0SGFsSGFuZGxlIGhIYWwsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsIHREb3QxMWZCZWFjb25JRXMgKipwcElFU3RydWN0KTsKKwordEFOSV9CT09MRUFOIGNzclZhbGlkYXRlQ291bnRyeVN0cmluZyggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4ICpwQ291bnRyeVN0cmluZyApOwordFNpclNjYW5UeXBlIGNzckdldFNjYW5UeXBlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY2huSWQpOworCit0QU5JX1U4IGNzclRvVXBwZXIoIHRBTklfVTggY2ggKTsKK2VIYWxTdGF0dXMgY3NyR2V0UGh5TW9kZUZyb21Cc3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwQlNTRGVzY3JpcHRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyUGh5TW9kZSAqcFBoeU1vZGUsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpOworCisvL2ZGb3JjZSAtLSBmb3JjZSByZWFzc29jIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVyZSBpcyBhbnkgY2hhbmdlCisvL1RoZSByZWFzb24gaXMgdGhhdCBmb3IgVUFQU0QtYnlwYXNzLCB0aGUgY29kZSB1bmRlcm5lYXRoIHRoaXMgY2FsbCBkZXRlcm1pbmUgd2hldGhlcgorLy90byBhbGxvdyBVQVBTRC4gVGhlIGluZm9ybWF0aW9uIGluIHBNb2RQcm9maWxlRmllbGRzIHJlZmxlY3RzIHdoYXQgdGhlIHVzZXIgd2FudHMuCisvL1RoZXJlIG1heSBiZSBkaXNjcmVwZW5jeSBpbiBpdC4gVUFQU0QtYnlwYXNzIGxvZ2ljIHNob3VsZCBkZWNpZGUgaWYgaXQgbmVlZHMgdG8gcmVhc3NvYworZUhhbFN0YXR1cyBjc3JSZWFzc29jKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgKnBNb2RQcm9maWxlRmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwUm9hbUlkLCB2X0JPT0xfdCBmRm9yY2UpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKK3RBTklfQk9PTEVBTiBjc3JJc1Byb2ZpbGUxMXIoIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUgKTsKK3RBTklfQk9PTEVBTiBjc3JJc0F1dGhUeXBlMTFyKCBlQ3NyQXV0aFR5cGUgQXV0aFR5cGUgKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAordEFOSV9CT09MRUFOIGNzcklzQXV0aFR5cGVDQ1goIGVDc3JBdXRoVHlwZSBBdXRoVHlwZSApOwordEFOSV9CT09MRUFOIGNzcklzUHJvZmlsZUNDWCggdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSApOworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9pbmMvbWVhc0FwaS5oIGIvQ09SRS9TTUUvaW5jL21lYXNBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTliMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvaW5jL21lYXNBcGkuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvaW5jL21lYXNJbnRlcm5hbC5oIGIvQ09SRS9TTUUvaW5jL21lYXNJbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOWIwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9pbmMvbWVhc0ludGVybmFsLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9wMnBfQXBpLmggYi9DT1JFL1NNRS9pbmMvcDJwX0FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMjc2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9pbmMvcDJwX0FwaS5oCkBAIC0wLDAgKzEsNTI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcDJwX0FwaS5oCisqCisqIERlc2NyaXB0aW9uOiBQMlAgRlNNIGRlZmluZXMuCisqCisqIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyogUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1AyUF9BUElfSF9fCisjZGVmaW5lIF9fUDJQX0FQSV9IX18KKworI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgImhhbFR5cGVzLmgiCisjaW5jbHVkZSAicGFsVGltZXIuaCIKKyNpbmNsdWRlICJ2b3NfbG9jay5oIgorCit0eXBlZGVmIHN0cnVjdCBzUDJwUHNDb25maWd7CisgIHRBTklfVTggICBvcHBfcHM7CisgIHRBTklfVTMyICBjdFdpbmRvdzsKKyAgdEFOSV9VOCAgIGNvdW50OyAKKyAgdEFOSV9VMzIgIGR1cmF0aW9uOworICB0QU5JX1UzMiAgaW50ZXJ2YWw7CisgIHRBTklfVTMyICBzaW5nbGVfbm9hX2R1cmF0aW9uOworICB0QU5JX1U4ICAgcHNTZWxlY3Rpb247CisgIHRBTklfVTggICBzZXNzaW9uaWQ7ICAgCit9dFAycFBzQ29uZmlnLCp0cFAycFBzQ29uZmlnOworCit0eXBlZGVmIGVIYWxTdGF0dXMgKCpyZW1haW5PbkNoYW5DYWxsYmFjaykoIHRIYWxIYW5kbGUsIHZvaWQqIGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlSGFsU3RhdHVzIHN0YXR1cyApOworCit0eXBlZGVmIHN0cnVjdCBzUmVtYWluT25DaG57CisgICAgdEFOSV9VOCBjaG47CisgICAgdEFOSV9VMzIgZHVyYXRpb247CisgICAgcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2s7CisgIHZvaWQgKnBDQkNvbnRleHQ7Cit9dFJlbWFpbk9uQ2huLCB0cFJlbWFpbk9uQ2huOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAorCisjZGVmaW5lIE1BWF9TT0NJQUxfQ0hBTk5FTFMgMworI2RlZmluZSBQMlBfT1BFUkFUSU5HX0NIQU5ORUwgNgorI2RlZmluZSBQMlBfTUFYX0dST1VQX0xJTUlUIDUKKyNkZWZpbmUgUDJQX01BQ19BRERSRVNTX0xFTiA2CisjZGVmaW5lIE1BWF9MSVNURU5fU0VBUkNIX0NZQ0xFIDMKKyNkZWZpbmUgUDJQX0xJU1RFTl9USU1FT1VUX0FVVE8gICAgNTAwIC8vMC41IHNlYworI2RlZmluZSBQMlBfTElTVEVOX1RJTUVPVVRfSElHSCAgICAyMDAgLy8wLjQgc2VjCisjZGVmaW5lIFAyUF9MSVNURU5fVElNRU9VVCAgICAgICAgIDEwMDAgIC8vMSBzZWMKKyNkZWZpbmUgUDJQX1JFTUFJTl9PTl9DSEFOX1RJTUVPVVQgMzAwCisjZGVmaW5lIFAyUF9SRU1BSU5fT05fQ0hBTl9USU1FT1VUX0hJR0ggMTAwMAorI2RlZmluZSBQMlBfUkVNQUlOX09OX0NIQU5fVElNRU9VVF9MT1cgMTAwCisjZGVmaW5lIEFDVElPTl9GUkFNRV9SRVRSWV9USU1FT1VUIDUwCisjZGVmaW5lIFAyUF9DT1VOVFJZX0NPREVfTEVOIDMKKworI2RlZmluZSBQMlBfQ0xFQVJfUE9XRVJTQVZFIDAKKyNkZWZpbmUgUDJQX09QUE9SVFVOSVNUSUNfUFMgMQorI2RlZmluZSBQMlBfUEVSSU9ESUNfTk9BIDIKKyNkZWZpbmUgUDJQX1NJTkdMRV9OT0EgNAorCisKKy8qIFdpLUZpIERpcmVjdCBEZXZpY2UgRGlzY292ZXJ5IFR5cGUgKi8KK3R5cGVkZWYgZW51bSBlcDJwRGlzY292ZXJUeXBlIHsKKyAgIC8qKiBEcml2ZXIgbXVzdCBwZXJmb3JtIGRldmljZSBkaXNjb3Zlcnkgb25seSB1c2luZyB0aGUgc2NhbiBwaGFzZSovCisgICBXRkRfRElTQ09WRVJfVFlQRV9TQ0FOX09OTFkgPSAxLAorICAgLyoqIERyaXZlciBtdXN0IHBlcmZvcm0gZGV2aWNlIGRpc2NvdmVyeSBvbmx5IHVzaW5nIHRoZSBmaW5kIHBoYXNlKi8KKyAgIFdGRF9ESVNDT1ZFUl9UWVBFX0ZJTkRfT05MWSA9IDIsCisgICAvKiogRHJpdmVyIGNhbiB1c2UgZWl0aGVyIHVzZSBzY2FuIHBoYXNlIG9yIGZpbmQgcGhhc2UgdG8gZGlzY292ZXJ5IAorICAgUDJQIGRldmljZXMuIEluIG91ciBjYXNlIERyaXZlciB1c2VzIHNjYW4gcGhhc2UgKi8KKyAgIFdGRF9ESVNDT1ZFUl9UWVBFX0FVVE8gPSAzLAorICAgLypTY2FuIG9ubHkgc29jaWFsIGNoYW5uZWwqLworICAgV0ZEX0RJU0NPVkVSX1NDQU5fT05MWV9TT0NJQUxfQ0hOLAorICAgLyoqIElmIGl0IGlzIHNldCwgZHJpdmVyIG11c3QgcGVyZm9ybSBhIGNvbXBsZXRlIGRpc2NvdmVyeSwgCisgICBJZiBpdCBpcyBmYWxzZSwgaXQgY2FuIGRvIHBhcnRpYWwgZGlzY292ZXJ5LiovCisgICBXRkRfRElTQ09WRVJfVFlQRV9GT1JDRUQgPSAweDgwMDAwMDAwCit9IGVwMnBEaXNjb3ZlclR5cGUsICplUHAycERpc2NvdmVyVHlwZTsKKworLy9iaXQgbWFzayBmb3Igd2hhdCB0byBkaXNjb3ZlcgorI2RlZmluZSBRQ1dMQU5fUDJQX0RJU0NPVkVSX0RFVklDRSAgICAgMHgxCisjZGVmaW5lIFFDV0xBTl9QMlBfRElTQ09WRVJfR08gICAgICAgICAweDIKKyNkZWZpbmUgUUNXTEFOX1AyUF9ESVNDT1ZFUl9BTlkgICAgICAgIDB4OAorCisjZGVmaW5lIFAyUF9ESVNDT1ZFUl9TQ0FOX09OTFkodCkgKCAoV0ZEX0RJU0NPVkVSX1RZUEVfU0NBTl9PTkxZID09ICh0KSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFdGRF9ESVNDT1ZFUl9TQ0FOX09OTFlfU09DSUFMX0NITiA9PSAodCkpICkKKworLyogU2NhbiBUeXBlICovCit0eXBlZGVmIGVudW0gZXAycFNjYW5UeXBlIHsKKyAgIFAyUF9TQ0FOX1RZUEVfQUNUSVZFID0gMSwgIC8qKiAgZGV2aWNlIHNob3VsZCBwZXJmb3JtIGFjdGl2ZSBzY2FucyBmb3IgdGhlIHNjYW4gcGhhc2Ugb2YgZGV2aWNlIGRpc2NvdmVyeSAqLworICAgUDJQX1NDQU5fVFlQRV9QQVNTSVZFID0gMiwgLyoqIGRldmljZSBzaG91bGQgcGVyZm9ybSBwYXNzaXZlIHNjYW5uaW5nIGZvciB0aGUgc2NhbiBwaGFzZSBvZiBkZXZpY2UgZGlzY292ZXJ5ICAqLworICAgUDJQX1NDQU5fVFlQRV9BVVRPID0gMyAgICAgLyoqIFRoZSBzZWxlY3Rpb24gb2YgdGhlIHNjYW4gdHlwZSBpcyB1cHRvIHRoZSBkcml2ZXIgKi8KK30gZXAycFNjYW5UeXBlLCAqIGVQcDJwU2NhblR5cGU7CisKKy8qKiBMaXN0ZW4gU3RhdGUgRGlzY292ZXJhYmlsaXR5ICovCit0eXBlZGVmIGVudW0gZXAycExpc3RlblN0YXRlRGlzY292ZXJhYmlsaXR5IHsKKyAgIFAyUF9ERVZJQ0VfTk9UX0RJU0NPVkVSQUJMRSwgLyoqICBXaS1GaSBEaXJlY3QgRGV2aWNlIFBvcnQgbXVzdCBub3QgbWFrZSBpdHNlbGYgZGlzY292ZXJhYmxlICovCisgICBQMlBfREVWSUNFX0FVVE9fQVZBSUxBQklMSVRZLCAvKiogV2ktRmkgRGlyZWN0IERldmljZSBQb3J0IG11c3QgcGVyaW9kaWNhbGx5IHB1dCBpdHNlbGYgaW4gdGhlIGxpc3RlbiBzdGF0ZSB0byBiZWNvbWUgZGlzY292ZXJhYmxlKi8KKyAgIFAyUF9ERVZJQ0VfSElHSF9BVkFJTEFCSUxJVFkgIC8qKiBXaS1GaSBEaXJlY3QgRGV2aWNlIFBvcnQgbXVzdCBiZSBmcmVxdWVudGx5IHB1dCBpdHNlbGYgaW4gdGhlIGxpc3RlbiBzdGF0ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluY3JlYXNlIHRoZSBzcGVlZCBhbmQgcmVsaWFiaWxpdHkgb2YgcmVtb3RlIGRldmljZXMgZGlzY292ZXJpbmcgaXQgKi8KK30gZXAycExpc3RlblN0YXRlRGlzY292ZXJhYmlsaXR5LCAqIGVQcDJwTGlzdGVuU3RhdGVEaXNjb3ZlcmFiaWxpdHk7CisKK3R5cGVkZWYgZW51bSBlcDJwT3BlcmF0aW5nTW9kZSB7CisgICBPUEVSQVRJT05fTU9ERV9JTlZBTElELAorICAgT1BFUkFUSU9OX01PREVfUDJQX0RFVklDRSwKKyAgIE9QRVJBVElPTl9NT0RFX1AyUF9HUk9VUF9PV05FUiwKKyAgIE9QRVJBVElPTl9NT0RFX1AyUF9DTElFTlQKK31lcDJwT3BlcmF0aW5nTW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgX3RwMnBEaXNjb3ZlckRldmljZUZpbHRlcnsgCisgICB0U2lyTWFjQWRkciBEZXZpY2VJRDsgCisgICB2X1VDSEFSX3QgdWNCaXRtYXNrOyAKKyAgIHRTaXJNYWNTU2lkIEdyb3VwU1NJRDsgCit9IHRwMnBEaXNjb3ZlckRldmljZUZpbHRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX3RwMnBEaXNjb3ZlclJlcXVlc3QgeworICAgZXAycERpc2NvdmVyVHlwZSBkaXNjb3ZlclR5cGU7CisgICBlcDJwU2NhblR5cGUgc2NhblR5cGU7CisgICB0QU5JX1UzMiB1RGlzY292ZXJUaW1lb3V0OworICAgdEFOSV9VMzIgdU51bURldmljZUZpbHRlcnM7CisgICB0cDJwRGlzY292ZXJEZXZpY2VGaWx0ZXIgKnBEZXZpY2VGaWx0ZXJzOworICAgdEFOSV9CT09MRUFOIGJGb3JjZVNjYW5MZWdhY3lOZXR3b3JrczsKKyAgIHRBTklfVTMyIHVOdW1PZkxlZ2FjeVNTSURzOworICAgdEFOSV9VOCAgKnBMZWdhY3lTU0lEczsKKyAgIHRBTklfVTMyIHVJRUxlbjsKKyAgIHRBTklfVTggKnBJRUZpZWxkOworfSB0UDJQRGlzY292ZXJSZXF1ZXN0OworCit0eXBlZGVmIGVudW0gX2VQMlBEaXNjb3ZlclN0YXR1cyB7CisgICBlUDJQX0RJU0NPVkVSX1NVQ0NFU1MsCisgICBlUDJQX0RJU0NPVkVSX0ZBSUxVUkUsCisgICBlUDJQX0RJU0NPVkVSX0FCT1JULAorICAgZVAyUF9ESVJFQ1RFRF9ESVNDT1ZFUgorfSBlUDJQRGlzY292ZXJTdGF0dXM7CisKK3R5cGVkZWYgZUhhbFN0YXR1cyAoKnAycERpc2NvdmVyQ29tcGxldGVDYWxsYmFjaykodEhhbEhhbmRsZSBoSGFsLCB2b2lkICpwQ29udGV4dCwgZVAyUERpc2NvdmVyU3RhdHVzIGRpc2NvdmVyU3RhdHVzKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1AyUEdyb3VwSWQgeworICAgIHRBTklfVTggcHJlc2VudDsKKyAgICB0QU5JX1U4IGRldmljZUFkZHJlc3NbNl07CisgICAgdEFOSV9VOCBudW1fc3NpZDsKKyAgICB0QU5JX1U4IHNzaWRbMzJdOworfSB0UDJQR3JvdXBJZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc1AyUEdyb3VwQnNzaWQgeworICAgIHRBTklfVTggcHJlc2VudDsKKyAgICB0QU5JX1U4IFAyUEdyb3VwQnNzaWRbNl07Cit9IHRQMlBHcm91cEJzc2lkOworCit0eXBlZGVmIHN0cnVjdCBzUDJQQ2hhbm5lbCB7CisgICB0QU5JX1U4IHByZXNlbnQ7CisgICB0QU5JX1U4IGNvdW50cnlTdHJpbmdbUDJQX0NPVU5UUllfQ09ERV9MRU5dOworICAgdEFOSV9VOCByZWd1bGF0b3J5Q2xhc3M7CisgICB0QU5JX1U4IGNoYW5uZWw7Cit9IHRQMlBfT3BlcmF0aW5nQ2hhbm5lbCwgdFAyUF9MaXN0ZW5DaGFubmVsOworCisvKiogU3RydWN0dXJlIGNvbnRhaW5zIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIFdpLUZpIERpcmVjdCBEZXZpY2UgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIGRldmljZSBkaXNjb3ZlcnksIEdyb3VwIE93bmVyIE5lZ290aWF0aW9uICovCit0eXBlZGVmIGVudW0gUDJQRnJhbWVUeXBlIHsKKyAgIGVQMlBfSU5WQUxJRF9GUk0sCisgICBlUDJQX1BST0JFX1JFUSwKKyAgIGVQMlBfUFJPQkVfUlNQLAorICAgZVAyUF9HT05FR09fUkVRLAorICAgZVAyUF9HT05FR09fUkVTLAorICAgZVAyUF9HT05FR09fQ05GLAorICAgZVAyUF9QUk9WSVNJT05fRElTQ09WRVJZX1JFUVVFU1QsCisgICBlUDJQX1BST1ZJU0lPTl9ESVNDT1ZFUllfUkVTUE9OU0UsCisgICBlUDJQX0JFQUNPTiwKKyAgIGVQMlBfR1JPVVBfSUQsCisgICBlUDJQX0FTU09DX1JFUSwKKyAgIGVQMlBfSU5WSVRBVElPTl9SRVEsCisgICBlUDJQX0lOVklUQVRJT05fUlNQLAorICAgZVAyUF9ERVZJQ0VfRElTQ09WRVJZX1JFUSwKKyAgIGVQMlBfREVWSUNFX0RJU0NPVkVSWV9SU1AsCit9IGVQMlBGcmFtZVR5cGU7CisKK3R5cGVkZWYgZW51bSBQMlBSZXF1ZXN0IHsKKyAgIGVXRkRfRElTQ09WRVJfUkVRVUVTVCwKKyAgIGVXRkRfREVWSUNFX0lELAorICAgZVdGRF9ERVZJQ0VfQ0FQQUJJTElUWSwKKyAgIGVXRkRfR1JPVVBfT1dORVJfQ0FQQUJJTElUWSwKKyAgIGVXRkRfREVWSUNFX0lORk8sCisgICBlV0ZEX1NFQ09OREFSWV9ERVZJQ0VfVFlQRV9MSVNULAorICAgZVdGRF9BRERJVElPTkFMX0lFLAorICAgZVdGRF9HUk9VUF9JRCwKKyAgIGVXRkRfU0VORF9HT19ORUdPVElBVElPTl9SRVFVRVNULAorICAgZVdGRF9TRU5EX0dPX05FR09USUFUSU9OX1JFU1BPTlNFLAorICAgZVdGRF9TRU5EX0dPX05FR09USUFUSU9OX0NPTkZJUk1BVElPTiwKKyAgIGVXRkRfU0VORF9QUk9WSVNJT05fRElTQ09WRVJZX1JFUVVFU1QsCisgICBlV0ZEX1NFTkRfUFJPVklTSU9OX0RJU0NPVkVSWV9SRVNQT05TRSwKKyAgIGVXRkRfU0VORF9JTlZJVEFUSU9OX1JFUVVFU1QsCisgICBlV0ZEX1NFTkRfSU5WSVRBVElPTl9SRVNQT05TRSwKKyAgIGVXRkRfT1BFUkFUSU5HX0NIQU5ORUwsCisgICBlV0ZEX0xJU1RFTl9DSEFOTkVMCit9IGVQMlBSZXF1ZXN0OworCit0eXBlZGVmIHN0cnVjdCBfcDJwX2RldmljZV9jYXBhYmlsaXR5X2NvbmZpZyB7CisgICB0QU5JX0JPT0xFQU4gYlNlcnZpY2VEaXNjb3ZlcnlFbmFibGVkOworICAgdEFOSV9CT09MRUFOIGJDbGllbnREaXNjb3ZlcmFiaWxpdHlFbmFibGVkOworICAgdEFOSV9CT09MRUFOIGJDb25jdXJyZW50T3BlcmF0aW9uU3VwcG9ydGVkOworICAgdEFOSV9CT09MRUFOIGJJbmZyYXN0cnVjdHVyZU1hbmFnZW1lbnRFbmFibGVkOworICAgdEFOSV9CT09MRUFOIGJEZXZpY2VMaW1pdFJlYWNoZWQ7CisgICB0QU5JX0JPT0xFQU4gYkludml0YXRpb25Qcm9jZWR1cmVFbmFibGVkOworICAgdEFOSV9VMzIgV1BTVmVyc2lvbnNFbmFibGVkOworfSB0cDJwX2RldmljZV9jYXBhYmlsaXR5X2NvbmZpZzsKKwordHlwZWRlZiBzdHJ1Y3QgX3AycF9ncm91cF9vd25lcl9jYXBhYmlsaXR5X2NvbmZpZyB7CisgICB0QU5JX0JPT0xFQU4gYlBlcnNpc3RlbnRHcm91cEVuYWJsZWQ7CisgICB0QU5JX0JPT0xFQU4gYkludHJhQlNTRGlzdHJpYnV0aW9uU3VwcG9ydGVkOworICAgdEFOSV9CT09MRUFOIGJDcm9zc0Nvbm5lY3Rpb25TdXBwb3J0ZWQ7CisgICB0QU5JX0JPT0xFQU4gYlBlcnNpc3RlbnRSZWNvbm5lY3RTdXBwb3J0ZWQ7CisgICB0QU5JX0JPT0xFQU4gYkdyb3VwRm9ybWF0aW9uRW5hYmxlZDsKKyAgIHRBTklfVTMyIHVNYXhpbXVtR3JvdXBMaW1pdDsKK30gdHAycF9ncm91cF9vd25lcl9jYXBhYmlsaXR5X2NvbmZpZzsKKwordHlwZWRlZiBzdHJ1Y3QgX3RQMlBfUHJvdkRpc2NvdmVyeVJlcSB7CisgICB0QU5JX1U4ICAgICBkaWFsb2dUb2tlbjsKKyAgIHRBTklfVTggIFBlZXJEZXZpY2VBZGRyZXNzW1AyUF9NQUNfQUREUkVTU19MRU5dOworICAgdEFOSV9VMzIgdVNlbmRUaW1lb3V0OworICAgdEFOSV9VOCAgR3JvdXBDYXBhYmlsaXR5OworICAgdFAyUEdyb3VwSWQgR3JvdXBJZDsKKyAgIHRBTklfQk9PTEVBTiBiVXNlR3JvdXBJRDsKKyAgIHRBTklfVTMyIHVJRUxlbmd0aDsKKyAgIHRBTklfVTggKklFZGF0YTsKK30gdFAyUF9Qcm92RGlzY292ZXJ5UmVxOworCit0eXBlZGVmIHN0cnVjdCBfdFAyUF9Qcm92RGlzY292ZXJ5UmVzIHsKKyAgIHRBTklfVTggIGRpYWxvZ1Rva2VuOworICAgdEFOSV9VOCAgUmVjZWl2ZXJEZXZpY2VBZGRyZXNzW1AyUF9NQUNfQUREUkVTU19MRU5dOworICAgdEFOSV9VMzIgdVNlbmRUaW1lb3V0OworICAgdEFOSV9VMzIgdUlFTGVuZ3RoOworICAgdEFOSV9VOCAqSUVkYXRhOworfSB0UDJQX1Byb3ZEaXNjb3ZlcnlSZXM7CisKK3R5cGVkZWYgc3RydWN0IHAycF9nb19yZXF1ZXN0IHsKKyAgIHRBTklfVTggICAgIGRpYWxvZ1Rva2VuOworICAgdEFOSV9VOCAgICBwZWVyRGV2aWNlQWRkcmVzc1tQMlBfTUFDX0FERFJFU1NfTEVOXTsKKyAgIHRBTklfVTMyIHVTZW5kVGltZW91dDsKKyAgIHRBTklfVTggR29JbnRlbnQ7CisgICB0QU5JX1UzMiBHb1RpbWVvdXQ7CisgICB0QU5JX1UzMiBDbGllbnRUaW1lb3V0OworICAgdEFOSV9VOCAgICBJbnRlbmRlZEludGVyZmFjZUFkZHJlc3NbUDJQX01BQ19BRERSRVNTX0xFTl07CisgICB0QU5JX1U4IEdyb3VwQ2FwYWJpbGl0eTsKKyAgIHRBTklfVTMyIHVJRUxlbmd0aDsKKyAgIHRBTklfVTggKklFZGF0YTsKK30gdFAyUF9nb19yZXF1ZXN0OworCit0eXBlZGVmIHN0cnVjdCBwMnBfZ29fY29uZmlybSB7CisgICB0QU5JX1U4ICAgIHBlZXJEZXZpY2VBZGRyZXNzW1AyUF9NQUNfQUREUkVTU19MRU5dOworICAgdEFOSV9VOCAgICBkaWFsb2dfdG9rZW47CisgICB0QU5JX1UzMiB1U2VuZFRpbWVvdXQ7CisgICB0QU5JX1U4ICAgIHN0YXR1czsKKyAgIHRBTklfVTggR3JvdXBDYXBhYmlsaXR5OworICAgdFAyUEdyb3VwSWQgR3JvdXBJZDsKKyAgIHRBTklfQk9PTEVBTiBiVXNlZEdyb3VwSWQ7CisgICB0QU5JX1UzMiB1SUVMZW5ndGg7CisgICB0QU5JX1U4ICpJRWRhdGE7Cit9IHRQMlBfZ29fY29uZmlybTsKKwordHlwZWRlZiBzdHJ1Y3QgcDJwX2dvX3Jlc3BvbnNlIHsKKyAgIHRBTklfVTggICAgcGVlckRldmljZUFkZHJlc3NbUDJQX01BQ19BRERSRVNTX0xFTl07CisgICB0QU5JX1U4ICAgIGRpYWxvZ190b2tlbjsKKyAgIHRBTklfVTMyIHVTZW5kVGltZW91dDsKKyAgIHRBTklfVTggICAgc3RhdHVzOworICAgdEFOSV9VOCBHb0ludGVudDsKKyAgIHRBTklfVTMyIEdvVGltZW91dDsKKyAgIHRBTklfVTMyIENsaWVudFRpbWVvdXQ7CisgICB0QU5JX1U4ICAgIEludGVuZGVkSW50ZXJmYWNlQWRkcmVzc1tQMlBfTUFDX0FERFJFU1NfTEVOXTsKKyAgIHRBTklfVTggR3JvdXBDYXBhYmlsaXR5OworICAgdFAyUEdyb3VwSWQgR3JvdXBJZDsKKyAgIHRBTklfQk9PTEVBTiBiVXNlZEdyb3VwSWQ7CisgICB0QU5JX1UzMiB1SUVMZW5ndGg7CisgICB0QU5JX1U4ICpJRWRhdGE7Cit9IHRQMlBfZ29fcmVzcG9uc2U7CisKKy8vSW52aXRhdGlvbiBSZXEgcGFyYW1ldGVycwordHlwZWRlZiBzdHJ1Y3QgcDJwX2ludml0YXRpb25fcmVxdWVzdCB7CisgICAgdEFOSV9VOCBEaWFsb2dUb2tlbjsKKyAgICB0QU5JX1U4IFBlZXJEZXZpY2VBZGRyZXNzW1AyUF9NQUNfQUREUkVTU19MRU5dOworICAgIHRBTklfVTMyIHVTZW5kVGltZW91dDsKKyAgICB0QU5JX1UzMiBHb1RpbWVvdXQ7CisgICAgdEFOSV9VMzIgQ2xpZW50VGltZW91dDsgCisgICAgdEFOSV9VOCBJbnZpdGF0aW9uRmxhZ3M7CisgICAgdFAyUEdyb3VwQnNzaWQgR3JvdXBCU1NJRDsKKyAgICB0UDJQX09wZXJhdGluZ0NoYW5uZWwgT3BlcmF0aW5nQ2hhbm5lbDsKKyAgICB0UDJQR3JvdXBJZCBHcm91cElEOworICAgIHRBTklfVTMyIHVJRUxlbmd0aDsKKyAgICB0QU5JX1U4ICpJRWRhdGE7Cit9IHRQMlBfaW52aXRhdGlvbl9yZXF1ZXN0OworCisKKy8vSW52aXRhdGlvbiBSZXNwb25zZSBwYXJhbWV0ZXJzCit0eXBlZGVmIHN0cnVjdCBwMnBfaW52aXRhdGlvbl9yZXNwb25zZSB7CisgICAgdEFOSV9VOCBSZWNlaXZlckRldmljZUFkZHJlc3NbUDJQX01BQ19BRERSRVNTX0xFTl07CisgICAgdEFOSV9VOCBEaWFsb2dUb2tlbjsKKyAgICB2b2lkKiBSZXF1ZXN0Q29udGV4dDsKKyAgICB0QU5JX1UzMiB1U2VuZFRpbWVvdXQ7CisgICAgdEFOSV9VOCAgICAgc3RhdHVzOworICAgIHRBTklfVTMyIEdvVGltZW91dDsKKyAgICB0QU5JX1UzMiBDbGllbnRUaW1lb3V0OyAKKyAgICB0UDJQR3JvdXBCc3NpZCBHcm91cEJTU0lEOworICAgIHRQMlBfT3BlcmF0aW5nQ2hhbm5lbCBPcGVyYXRpbmdDaGFubmVsOworICAgIHRBTklfVTMyIHVJRUxlbmd0aDsKKyAgICB0QU5JX1U4ICpJRWRhdGE7Cit9IHRQMlBfaW52aXRhdGlvbl9yZXNwb25zZTsKKwordHlwZWRlZiBlbnVtIGVPVUlTdWJUeXBlIHsKKyAgIGVPVUlfUDJQX0dPTkVHT19SRVEsCisgICBlT1VJX1AyUF9HT05FR09fUkVTLAorICAgZU9VSV9QMlBfR09ORUdPX0NORiwKKyAgIGVPVUlfUDJQX0lOVklUQVRJT05fUkVRLAorICAgZU9VSV9QMlBfSU5WSVRBVElPTl9SRVMsCisgICBlT1VJX1AyUF9ERVZJQ0VfRElTQ09WRVJBQklMSVRZX1JFUSwKKyAgIGVPVUlfUDJQX0RFVklDRV9ESVNDT1ZFUkFCSUxJVFlfUkVTLAorICAgZU9VSV9QMlBfUFJPVklTSU9OX0RJU0NPVkVSWV9SRVEsCisgICBlT1VJX1AyUF9QUk9WSVNJT05fRElTQ09WRVJZX1JFUywKKyAgIGVPVUlfUDJQX0lOVkFMSUQKK31lT1VJU3ViVHlwZTsKKwordHlwZWRlZiBlbnVtIF9lUDJQUG9ydCB7CisgICBlUDJQUG9ydERldmljZSwKKyAgIGVQMlBQb3J0R3JvdXBPd25lciwKKyAgIGVQMlBQb3J0Q2xpZW50Cit9IGVQMlBQb3J0OworCit0eXBlZGVmIGVudW0gZUxpc3RlbkRpc2NvdmVyYWJsZVN0YXRlIHsKKyAgIGVTdGF0ZURpc2FibGVkLAorICAgZVN0YXRlRW5hYmxlZCwKKworfWVMaXN0ZW5EaXNjb3ZlcmFibGVTdGF0ZTsKKwordHlwZWRlZiBlbnVtIFAyUFJlbWFpbk9uQ2huUmVhc29uCit7CisgICBlUDJQUmVtYWluT25DaG5SZWFzb25Vbmtub3duLAorICAgZVAyUFJlbWFpbk9uQ2huUmVhc29uRGlzY292ZXJ5LCAvL1BhcnQgb2YgdGhlIGRpc2NvdmVyeSAoc2VhcmNoIGFuZCBsaXN0ZW4pCisgICBlUDJQUmVtYWluT25DaG5SZWFzb25TZW5kRnJhbWUsIC8vRm91bmQgcGVlciBhbmQgYmVmb3JlIHNlbmRpbmcgcmVxdWVzdCBmcmFtZQorICAgZVAyUFJlbWFpbk9uQ2huUmVhc29uTGlzdGVuLCAgICAvL0luIGxpc3Rlbi1vbmx5IG1vZGUKK31lUDJQUmVtYWluT25DaG5SZWFzb247CisKK3R5cGVkZWYgc3RydWN0IHNHcm91cEZvcm1hdGlvblJlcSB7CisgICB0Q3NyQnNzaWQgZGV2aWNlQWRkcmVzczsKKyAgIHRBTklfVTggdGFyZ2V0TGlzdGVuQ2hhbm5lbDsKKyAgIHRBTklfVTggcGVyc2lzdGVudF9ncm91cDsKKyAgIHRBTklfVTggZ3JvdXBfbGltaXQ7IC8qIG1heSBiZSBpbnRlcm5hbCAqLworICAgdEFOSV9VOCBHT19jb25maWdfdGltZW91dDsKKyAgIHRBTklfVTggQ0xfY29uZmlnX3RpbWVvdXQ7CisgICB0QU5JX1U4IEdPX2ludGVudDsKKyAgIHRBTklfVTE2IGRldmljZVBhc3N3ZElkOworICAgdFNpck1hY0FkZHIgZ3JvdXBCc3NpZDsKKyAgIHRTaXJNYWNTU2lkIGdyb3VwU3NpZDsKK310R3JvdXBGb3JtYXRpb25SZXE7CisKK3R5cGVkZWYgc3RydWN0IHRQMlBDb25maWdQYXJhbQoreworICAgdl9VMzJfdCBQMlBPcGVyYXRpbmdDaGFubmVsOworICAgdl9VMzJfdCBQMlBMaXN0ZW5DaGFubmVsOworICAgdl9VMzJfdCBQMlBQU1NlbGVjdGlvbjsKKyAgIHZfVTMyX3QgUDJQT3BQU0NUV2luZG93OworICAgdl9VMzJfdCBQMlBOb0FEdXJhdGlvbjsKKyAgIHZfVTMyX3QgUDJQTm9BQ291bnQ7CisgICB2X1UzMl90IFAyUE5vQUludGVydmFsOworfXRQMlBDb25maWdQYXJhbTsKKworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHNwMnBDb250ZXh0Cit7CisgICB2X0NPTlRFWFRfdCB2b3NDb250ZXh0OworICAgdEhhbEhhbmRsZSBoSGFsOworICAgdEFOSV9VOCBzZXNzaW9uSWQ7IC8vU2Vzc2lvbiBpZCBjb3JyZXNwb25kaW5nIHRvIFAyUC4gT24gd2luZG93cyBpdCBpcyBzYW1lIGFzIEhERCBzZXNzaW9uaWQgbm90IHNtZSBzZXNzaW9uaWQuCisgICB0QU5JX1U4IFNNRXNlc3Npb25JZDsKKyAgIHRBTklfVTggcHJvYmVSZXFGb3J3YXJkaW5nOworICAgdEFOSV9VOCAqcHJvYmVSc3BJZTsKKyAgIHRBTklfVTMyIHByb2JlUnNwSWVMZW5ndGg7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAorICAgdEFOSV9VOCBudW1DbGllbnRzOworICAgdEFOSV9VMzIgbWF4R3JvdXBMaW1pdDsKKyAgIGVwMnBPcGVyYXRpbmdNb2RlIG9wZXJhdGluZ21vZGU7CisgICB0QU5JX1U4IHN0YXRlOworICAgdEFOSV9VOCBzb2NpYWxDaGFubmVsW01BWF9TT0NJQUxfQ0hBTk5FTFNdOworICAgdEFOSV9VOCBjdXJyZW50U2VhcmNoSW5kZXg7CisgICB0QU5JX1U4IGxpc3RlbkluZGV4OworICAgdEFOSV9VOCBkaWFsb2dUb2tlbjsKKyAgIHRBTklfVTggcmVjZWl2ZWREaWFsb2dUb2tlbjsKKyAgIGVPVUlTdWJUeXBlIGFjdGlvbkZyYW1lT1VJOworICAgZVAyUEZyYW1lVHlwZSBhY3Rpb25GcmFtZVR5cGU7CisgICB0QU5JX0JPT0xFQU4gYWN0aW9uRnJhbWVUaW1lb3V0OworICAgdEFOSV9VOCAqcFNlbnRBY3Rpb25GcmFtZTsKKyAgIHRBTklfVTMyIEFjdGlvbkZyYW1lTGVuOworICAgdEFOSV9VMzIgQWN0aW9uRnJhbWVTZW5kVGltZW91dDsKKyAgIGVMaXN0ZW5EaXNjb3ZlcmFibGVTdGF0ZSBsaXN0ZW5EaXNjb3ZlcmFibGVTdGF0ZTsKKyAgIHRQYWxUaW1lckhhbmRsZSBsaXN0ZW5UaW1lckhhbmRsZXI7CisgICB0UGFsVGltZXJIYW5kbGUgV1BTUmVnaXN0cmFyQ2hlY2tUaW1lckhhbmRsZXI7CisgICB0QU5JX1UzMiBXUFNSZWdpc3RyYXJTZXQ7CisgICB0QU5JX1U4IGJXYWl0Rm9yV1BTUmVhZHk7CisgICB0QU5JX1U4IGJJbkdyb3VwRm9ybWF0aW9uOworICAgdFBhbFRpbWVySGFuZGxlIGRpc2NvdmVyVGltZXI7CisgICB0UGFsVGltZXJIYW5kbGUgcmV0cnlBY3Rpb25GcmFtZVRpbWVyOworICAgdFBhbFRpbWVySGFuZGxlIGFjdGlvbkZyYW1lVGltZXI7CisgICB0UGFsVGltZXJIYW5kbGUgbmV4dEFjdGlvbkZyYW1lVGltZXI7CisgICB0QU5JX1U4IHBlZXJNYWNBZGRyZXNzW1AyUF9NQUNfQUREUkVTU19MRU5dOworICAgdEFOSV9VOCBzZWxmTWFjQWRkcmVzc1tQMlBfTUFDX0FERFJFU1NfTEVOXTsKKyAgIHRBTklfVTggUmVjZWl2ZXJEZXZpY2VBZGRyZXNzW1AyUF9NQUNfQUREUkVTU19MRU5dOworICAgdEFOSV9VOCBsaXN0ZW5fc2VhcmNoX2N5Y2xlOworICAgZXAycERpc2NvdmVyVHlwZSBkaXNjb3ZlclR5cGU7CisgICBlcDJwU2NhblR5cGUgc2NhblR5cGU7CisgICB0QU5JX1UzMiB1RGlzY292ZXJUaW1lb3V0OworICAgdHAycERpc2NvdmVyRGV2aWNlRmlsdGVyICpkaXJlY3RlZERpc2NvdmVyeUZpbHRlcjsKKyAgIHRBTklfVTMyIHVOdW1EZXZpY2VGaWx0ZXJzOworICAgLy9OdW1iZXIgb2YgZGV2aWNlRmlsdGVyIGRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyIGhvbGRzCisgICB0QU5JX1UzMiB1TnVtRGV2aWNlRmlsdGVyQWxsb2NhdGVkOyAKKyAgIHRHcm91cEZvcm1hdGlvblJlcSBmb3JtYXRpb25SZXE7CisgICB0QU5JX1U4IEdyb3VwRm9ybWF0aW9uUGVuZGluZzsKKyAgIHRBTklfQk9PTEVBTiBQZWVyRm91bmQ7CisgICB0QU5JX0JPT0xFQU4gZGlyZWN0ZWREaXNjb3Zlcnk7CisgICB0QU5JX1UzMiBsaXN0ZW5EdXJhdGlvbjsKKyAgIHRBTklfVTMyIGV4cGlyZV90aW1lOworICAgcDJwRGlzY292ZXJDb21wbGV0ZUNhbGxiYWNrIHAycERpc2NvdmVyQ0JGdW5jOworICAgdm9pZCAqcENvbnRleHQ7CisgICB0QU5JX0JPT0xFQU4gYkZvcmNlU2NhbkxlZ2FjeU5ldHdvcmtzOworICAgdEFOSV9VOCAqRGlzY292ZXJSZXFJZUZpZWxkOworICAgdEFOSV9VMzIgRGlzY292ZXJSZXFJZUxlbmd0aDsKKyAgIHRBTklfVTggKkdvTmVnb1JlcUllRmllbGQ7CisgICB0QU5JX1UzMiBHb05lZ29SZXFJZUxlbmd0aDsKKyAgIHRBTklfVTggKkdvTmVnb1Jlc0llRmllbGQ7CisgICB0QU5JX1UzMiBHb05lZ29SZXNJZUxlbmd0aDsKKyAgIHRBTklfVTggKkdvTmVnb0NuZkllRmllbGQ7CisgICB0QU5JX1UzMiBHb05lZ29DbmZJZUxlbmd0aDsKKyAgIHRBTklfVTggKlByb3ZEaXNjUmVxSWVGaWVsZDsKKyAgIHRBTklfVTMyIFByb3ZEaXNjUmVxSWVMZW5ndGg7CisgICB0QU5JX1U4ICpQcm92RGlzY1Jlc0llRmllbGQ7CisgICB0QU5JX1UzMiBQcm92RGlzY1Jlc0llTGVuZ3RoOworICAgdEFOSV9VOCAqSW52aXRhdGlvblJlcUllRmllbGQ7CisgICB0QU5JX1UzMiBJbnZpdGF0aW9uUmVxSWVMZW5ndGg7CisgICB0QU5JX1U4ICpJbnZpdGF0aW9uUmVzSWVGaWVsZDsKKyAgIHRBTklfVTMyIEludml0YXRpb25SZXNJZUxlbmd0aDsKKyAgIHRBTklfVTMyIERpc2NvdmVyYWJsZUNmZzsKKyAgIHZvc19zcGluX2xvY2tfdCBsU3RhdGU7CisgICB0QU5JX1U4ICpwTmV4dEFjdGlvbkZybTsKKyAgIHRBTklfVTMyIG5OZXh0RnJtTGVuOworICAgdEFOSV9VMzIgbk5leHRGcmFtZVRpbWVPdXQ7CisgICBlUDJQRnJhbWVUeXBlIE5leHRBY3Rpb25GcmFtZVR5cGU7CisgICB0QU5JX1U4IHNzaWRbMzJdOworICAgdl9VMzJfdCBQMlBMaXN0ZW5DaGFubmVsOworICAgdl9VMzJfdCBQMlBPcGVyYXRpbmdDaGFubmVsOworICAgdFAycFBzQ29uZmlnIHBOb0E7CisgICB0QU5JX1U4IE9yaWdpbmFsR3JvdXBDYXBhYmlsaXR5OworI2VuZGlmCit9IHRwMnBDb250ZXh0LCAqdFBwMnBDb250ZXh0OworCisKK2VIYWxTdGF0dXMgc21lX1JlbWFpbk9uQ2hhbm5lbCggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjaGFubmVsLCB0QU5JX1UzMiBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ29udGV4dCApOworZUhhbFN0YXR1cyBzbWVfUmVwb3J0UHJvYmVSZXEoIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBmbGFnICk7CitlSGFsU3RhdHVzIHNtZV91cGRhdGVQMnBJZSggdEhhbEhhbmRsZSBoSGFsLCB2b2lkICpwMnBJZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgcDJwSWVMZW5ndGggKTsKK2VIYWxTdGF0dXMgc21lX3NlbmRBY3Rpb24oIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBsZW4gKTsKK2VIYWxTdGF0dXMgc21lX0NhbmNlbFJlbWFpbk9uQ2hhbm5lbCggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCApOworZUhhbFN0YXR1cyBzbWVfcDJwT3BlbiggdEhhbEhhbmRsZSBoSGFsICk7CitlSGFsU3RhdHVzIHAycFN0b3AoIHRIYWxIYW5kbGUgaEhhbCApOworZUhhbFN0YXR1cyBzbWVfcDJwQ2xvc2UoIHRIYWxIYW5kbGUgaEhhbCApOworZUhhbFN0YXR1cyBzbWVfcDJwU2V0UHMoIHRIYWxIYW5kbGUgaEhhbCwgdFAycFBzQ29uZmlnICogZGF0YSApOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfSU5URVJOQUwKK2VIYWxTdGF0dXMgcDJwUmVtYWluT25DaGFubmVsKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY2hhbm5lbCwgdEFOSV9VMzIgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVQMlBSZW1haW5PbkNoblJlYXNvbiByZWFzb24pOworI2Vsc2UKK2VIYWxTdGF0dXMgcDJwUmVtYWluT25DaGFubmVsKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY2hhbm5lbCwgdEFOSV9VMzIgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKnBDb250ZXh0KTsKKyNlbmRpZgorZUhhbFN0YXR1cyBwMnBTZW5kQWN0aW9uKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBsZW4gKTsKK2VIYWxTdGF0dXMgcDJwQ2FuY2VsUmVtYWluT25DaGFubmVsKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkICk7CitlSGFsU3RhdHVzIHAycFNldFBzKCB0SGFsSGFuZGxlIGhIYWwsIHRQMnBQc0NvbmZpZyAqcE5vQSApOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfSU5URVJOQUwKK2VIYWxTdGF0dXMgcDJwUmVtYWluT25DaGFubmVsQ2FsbGJhY2sodEhhbEhhbmRsZSBoYWxIYW5kbGUsIHZvaWQgKnBDb250ZXh0LCBlSGFsU3RhdHVzIHNjYW5fc3RhdHVzKTsKK2VIYWxTdGF0dXMgUDJQX0Rpc2NvdmVyUmVxdWVzdCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggU2Vzc2lvbklELCB0UDJQRGlzY292ZXJSZXF1ZXN0ICpwRGlzY292ZXJSZXF1ZXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMnBEaXNjb3ZlckNvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKnBDb250ZXh0KTsKK3RBTklfVTggcDJwR2V0RGlhbG9nVG9rZW4odEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IFNlc3Npb25JRCwgZVAyUEZyYW1lVHlwZSBhY3Rpb25GcmFtZVR5cGUpOworZUhhbFN0YXR1cyBQMlBfTGlzdGVuU3RhdGVEaXNjb3ZlcmFibGUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwgZXAycExpc3RlblN0YXRlRGlzY292ZXJhYmlsaXR5IGxpc3RlblN0YXRlKTsKK2VIYWxTdGF0dXMgcDJwQ3JlYXRlU2VuZEFjdGlvbkZyYW1lKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBTZXNzaW9uSUQsIAorICAgICAgdm9pZCAqcDJwYWN0aW9uZnJhbWUsIGVQMlBGcmFtZVR5cGUgYWN0aW9uRnJhbWVUeXBlLCB0QU5JX1UzMiB0aW1lb3V0KTsKK2VIYWxTdGF0dXMgcDJwU2NhblJlcXVlc3QodHAycENvbnRleHQgKnAycENvbnRleHQsIHAycERpc2NvdmVyQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqcENvbnRleHQpOwordm9pZCBwMnBBY3Rpb25GcmFtZVRpbWVySGFuZGxlcih2b2lkICpwQ29udGV4dCk7Cit2b2lkIHAycExpc3RlbkRpc2NvdmVyVGltZXJIYW5kbGVyKHZvaWQgKnBDb250ZXh0KTsKK3ZvaWQgcDJwRGlzY292ZXJUaW1lckhhbmRsZXIodm9pZCAqcENvbnRleHQpOwordm9pZCBwMnBSZXRyeUFjdGlvbkZyYW1lVGltZXJIYW5kbGVyKHZvaWQgKnBDb250ZXh0KTsKK2VIYWxTdGF0dXMgcDJwR3JwRm9ybWF0aW9uUmVtYWluT25DaGFuUnNwQ2FsbGJhY2sodEhhbEhhbmRsZSBoYWxIYW5kbGUsIHZvaWQgKnBDb250ZXh0LCB0QU5JX1UzMiBzY2FuSWQsIGVDc3JTY2FuU3RhdHVzIHNjYW5fc3RhdHVzKTsKK2VIYWxTdGF0dXMgcDJwQ2hhbmdlRGVmYXVsdENvbmZpZ1BhcmFtKHRIYWxIYW5kbGUgaEhhbCwgdFAyUENvbmZpZ1BhcmFtICpwUGFyYW0pOworZUhhbFN0YXR1cyBwMnBHZXRDb25maWdQYXJhbSh0SGFsSGFuZGxlIGhIYWwsIHRQMlBDb25maWdQYXJhbSAqcFBhcmFtKTsKK2VIYWxTdGF0dXMgcDJwUFModEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCk7CitlSGFsU3RhdHVzIHAycENsb3NlU2Vzc2lvbih0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggU2Vzc2lvbklEKTsKK2VIYWxTdGF0dXMgcDJwU2V0U2Vzc2lvbklkKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBTZXNzaW9uSUQsIHRBTklfVTggU21lU2Vzc2lvbklkKTsKK3RBTklfQk9PTEVBTiBwMnBJc09wZXJhdGluZ0NoYW5uRXF1YWxMaXN0ZW5DaGFubih0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggU2Vzc2lvbklEKTsKK2VIYWxTdGF0dXMgcDJwR2V0TGlzdGVuQ2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggU2Vzc2lvbklELCB0QU5JX1U4ICpjaGFubmVsKTsKK2VIYWxTdGF0dXMgcDJwU2V0TGlzdGVuQ2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggU2Vzc2lvbklELCB0QU5JX1U4IGNoYW5uZWwpOworZUhhbFN0YXR1cyBwMnBTdG9wRGlzY292ZXJ5KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBTZXNzaW9uSUQpOwordEFOSV9VOCBnZXRQMlBTZXNzaW9uSWRGcm9tU01FU2Vzc2lvbklkKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBTZXNzaW9uSUQpOwordm9pZCBwMnBDYWxsRGlzY292ZXJDYWxsYmFjayh0cDJwQ29udGV4dCAqcDJwQ29udGV4dCwgZVAyUERpc2NvdmVyU3RhdHVzIHN0YXR1c0NvZGUpOworZUhhbFN0YXR1cyBwMnBHZXRSZXN1bHRGaWx0ZXIodHAycENvbnRleHQgKnBQMnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBGaWx0ZXIpOworI2VuZGlmLy9JTlRFUk5BTAorI2VuZGlmIC8vX19QMlBfQVBJX0hfXwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvaW5jL3BtYy5oIGIvQ09SRS9TTUUvaW5jL3BtYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZTNjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9pbmMvcG1jLmgKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWMuaAorKgorKiBEZXNjcmlwdGlvbjogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sIChQTUMpIGludGVybmFsIGRlZmluaXRpb25zLgorKgorKiBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIAorICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUE1DX0hfXworI2RlZmluZSBfX1BNQ19IX18KKworCisjaW5jbHVkZSAicGFsVGltZXIuaCIKKyNpbmNsdWRlICJjc3JMaW5rTGlzdC5oIgorI2luY2x1ZGUgInBtY0FwaS5oIgorI2luY2x1ZGUgInNtZUludGVybmFsLmgiCisKKworLy9DaGFuZ2UgUE1DX0FCT1JUIHRvIG5vLW9wIGZvciBub3cuIFdlIG5lZWQgdG8gZGVmaW5lIGl0IGFzIFZPU19BU1NFUlQoMCkgb25jZSB3ZSAKKy8vY2xlYW51cCB0aGUgdXNhZ2UuCisjZGVmaW5lIFBNQ19BQk9SVCAgCisKKy8qIEhvc3QgcG93ZXIgc291cmNlcy4gKi8KK3R5cGVkZWYgZW51bSBlUG93ZXJTb3VyY2UKK3sKKyAgICBBQ19QT1dFUiwgIC8qIGhvc3QgaXMgb3BlcmF0aW5nIGZyb20gQUMgcG93ZXIgKi8KKyAgICBCQVRURVJZX1BPV0VSICAvKiBob3N0IGlzIG9wZXJhdGluZyBmcm9tIGJhdHRlcnkgcG93ZXIgKi8KK30gdFBvd2VyU291cmNlOworCisKKy8qIFBvd2VyIHNhdmUgY2hlY2sgcm91dGluZSBsaXN0IGVudHJ5LiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1Bvd2VyU2F2ZUNoZWNrRW50cnkKK3sKKyAgICB0TGlzdEVsZW0gbGluazsgIC8qIGxpc3QgbGlua3MgKi8KKyAgICB0QU5JX0JPT0xFQU4gKCpjaGVja1JvdXRpbmUpICh2b2lkICpjaGVja0NvbnRleHQpOyAgLyogcG93ZXIgc2F2ZSBjaGVjayByb3V0aW5lICovCisgICAgdm9pZCAqY2hlY2tDb250ZXh0OyAgLyogdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byByb3V0aW5lIHNwZWNpZmllZCBhYm92ZSAqLworfSB0UG93ZXJTYXZlQ2hlY2tFbnRyeSwgKnRwUG93ZXJTYXZlQ2hlY2tFbnRyeTsKKworCisvKiBEZXZpY2UgUG93ZXIgU3RhdGUgdXBkYXRlIGluZGljYXRpb24gbGlzdCBlbnRyeS4gKi8KK3R5cGVkZWYgc3RydWN0IHNEZXZpY2VTdGF0ZVVwZGF0ZUluZEVudHJ5Cit7CisgICAgdExpc3RFbGVtIGxpbms7ICAvKiBsaXN0IGxpbmtzICovCisgICAgdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgdFBtY1N0YXRlIHBtY1N0YXRlKTsgLyogQ2FsbGJhY2sgcm91dGluZSB0byBiZSBpbnZva2VkIHdoZW4gcG1jIGNoYW5nZXMgZGV2aWNlIHN0YXRlICovCisgICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0OyAgLyogdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byByb3V0aW5lIHNwZWNpZmllZCBhYm92ZSAqLworfSB0RGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeSwgKnRwRGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeTsKKworLyogUmVxdWVzdCBmdWxsIHBvd2VyIGNhbGxiYWNrIHJvdXRpbmUgbGlzdCBlbnRyeS4gKi8KK3R5cGVkZWYgc3RydWN0IHNSZXF1ZXN0RnVsbFBvd2VyRW50cnkKK3sKKyAgICB0TGlzdEVsZW0gbGluazsgIC8qIGxpc3QgbGlua3MgKi8KKyAgICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyk7ICAvKiByb3V0aW5lIHRvIGNhbGwgd2hlbiBmdWxsIHBvd2VyIGlzIHJlc3RvcmVkICovCisgICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0OyAgLyogdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byByb3V0aW5lIHNwZWNpZmllZCBhYm92ZSAqLworfSB0UmVxdWVzdEZ1bGxQb3dlckVudHJ5LCAqdHBSZXF1ZXN0RnVsbFBvd2VyRW50cnk7CisKKworLyogUmVxdWVzdCBCTVBTIGNhbGxiYWNrIHJvdXRpbmUgbGlzdCBlbnRyeS4gKi8KK3R5cGVkZWYgc3RydWN0IHNSZXF1ZXN0Qm1wc0VudHJ5Cit7CisgICB0TGlzdEVsZW0gbGluazsgIC8qIGxpc3QgbGlua3MgKi8KKworICAgLyogcm91dGluZSB0byBjYWxsIHdoZW4gQk1QUyByZXF1ZXN0IHN1Y2NlZWRlZC9mYWlsZWQgKi8KKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKTsKKworICAgLyogdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byByb3V0aW5lIHNwZWNpZmllZCBhYm92ZSAqLworICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0OyAgCisKK30gdFJlcXVlc3RCbXBzRW50cnksICp0cFJlcXVlc3RCbXBzRW50cnk7CisKKworLyogU3RhcnQgVS1BUFNEIGNhbGxiYWNrIHJvdXRpbmUgbGlzdCBlbnRyeS4gKi8KK3R5cGVkZWYgc3RydWN0IHNTdGFydFVhcHNkRW50cnkKK3sKKyAgIHRMaXN0RWxlbSBsaW5rOyAgLyogbGlzdCBsaW5rcyAqLworCisgICAvKiByb3V0aW5lIHRvIGNhbGwgd2hlbiBVYXBzZCBTdGFydCBzdWNjZWVkZWQvZmFpbGVkKi8KKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKTsKKworICAgLyogdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byByb3V0aW5lIHNwZWNpZmllZCBhYm92ZSAqLworICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0OyAgCisKK30gdFN0YXJ0VWFwc2RFbnRyeSwgKnRwU3RhcnRVYXBzZEVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBzUG1jRGVmZXJyZWRNc2cKK3sKKyAgICB0TGlzdEVsZW0gbGluazsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjOworICAgIHRBTklfVTE2IG1lc3NhZ2VUeXBlOworICAgIHRBTklfVTE2IHNpemU7ICAvL251bWJlciBvZiBieXRlcyBpbiB1LmRhdGEKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgdFNpclBvd2VyU2F2ZUNmZyBwb3dlclNhdmVDb25maWc7CisgICAgICAgIHRTaXJXb3dsQWRkQmNhc3RQdHJuIHdvd2xBZGRQYXR0ZXJuOworICAgICAgICB0U2lyV293bERlbEJjYXN0UHRybiB3b3dsRGVsUGF0dGVybjsKKyAgICAgICAgdEFOSV9VOCBkYXRhWzFdOyAgICAvL2EgcGxhY2UgaG9sZGVyCisgICAgfXU7Cit9IHRQbWNEZWZlcnJlZE1zZzsKKworCisKKy8qIEN1cnJlbnQgUE1DIGluZm9ybWF0aW9uIGZvciBhIHBhcnRpY3VsYXIgZGV2aWNlLiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1BtY0luZm8KK3sKKyAgICB0UG93ZXJTb3VyY2UgcG93ZXJTb3VyY2U7ICAvKiBob3N0IHBvd2VyIHNvdXJjZSAqLworICAgIHRQbWNTd2l0Y2hTdGF0ZSBod1dsYW5Td2l0Y2hTdGF0ZTsgIC8qIEhhcmR3YXJlIFdMQU4gU3dpdGNoIHN0YXRlICovCisgICAgdFBtY1N3aXRjaFN0YXRlIHN3V2xhblN3aXRjaFN0YXRlOyAgLyogU29mdHdhcmUgV0xBTiBTd2l0Y2ggc3RhdGUgKi8KKyAgICB0UG1jU3RhdGUgcG1jU3RhdGU7ICAvKiBQTUMgc3RhdGUgKi8KKyAgICB0QU5JX0JPT0xFQU4gcmVxdWVzdEZ1bGxQb3dlclBlbmRpbmc7ICAvKiBUUlVFIGlmIGEgcmVxdWVzdCBmb3IgZnVsbCBwb3dlciBpcyBwZW5kaW5nICovCisgICAgdFJlcXVlc3RGdWxsUG93ZXJSZWFzb24gcmVxdWVzdEZ1bGxQb3dlclJlYXNvbjsgLyogcmVhc29uIGZvciByZXF1ZXN0aW5nIGZ1bGwgcG93ZXIgKi8KKyAgICB0UG1jSW1wc0NvbmZpZ1BhcmFtcyBpbXBzQ29uZmlnOyAgLyogSU1QUyBjb25maWd1cmF0aW9uICovCisgICAgdFBtY0JtcHNDb25maWdQYXJhbXMgYm1wc0NvbmZpZzsgIC8qIEJNUFMgY29uZmlndXJhdGlvbiAqLworICAgIHRQbWNTbXBzQ29uZmlnUGFyYW1zIHNtcHNDb25maWc7ICAvKiBTTVBTIGNvbmZpZ3VyYXRpb24gKi8KKyAgICB0QU5JX0JPT0xFQU4gaW1wc0VuYWJsZWQ7ICAvKiBUUlVFIGlmIElNUFMgaXMgZW5hYmxlZCAqLworICAgIHRBTklfQk9PTEVBTiBibXBzRW5hYmxlZDsgIC8qIFRSVUUgaWYgQk1QUyBpcyBlbmFibGVkICovCisgICAgdEFOSV9CT09MRUFOIGF1dG9CbXBzRW50cnlFbmFibGVkOyAgLyogVFJVRSBpZiBhdXRvIEJNUFMgZW50cnkgaXMgZW5hYmxlZC4gSWYgc2V0IHRvIFRSVUUsIFBNQyB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCB0byBwdXQgdGhlIGRldmljZSBpbnRvIEJNUFMgb24gZW50cnkgaW50byBmdWxsIFBvd2VyICovCisgICAgdEFOSV9CT09MRUFOIGJtcHNSZXF1ZXN0ZWRCeUhkZDsgLypUUlVFIGlmIEJNUFMgbW9kZSBoYXMgYmVlbiByZXF1ZXN0ZWQgYnkgSEREICovCisgICAgdEFOSV9CT09MRUFOIGJtcHNSZXF1ZXN0UXVldWVkOyAvKklmIGEgZW50ZXIgQk1QUyByZXF1ZXN0IGlzIHF1ZXVlZCovCisgICAgdEFOSV9CT09MRUFOIHNtcHNFbmFibGVkOyAgLyogVFJVRSBpZiBTTVBTIGlzIGVuYWJsZWQgKi8KKyAgICB0QU5JX0JPT0xFQU4gcmVtYWluSW5Qb3dlckFjdGl2ZVRpbGxESENQOyAgLyogUmVtYWluIGluIFBvd2VyIGFjdGl2ZSB0aWxsIERIQ1AgY29tcGxldGVzICovCisgICAgdEFOSV9VMzIgcmVtYWluSW5Qb3dlckFjdGl2ZVRocmVzaG9sZDsgIC8qUmVtYWluIGluIFBvd2VyIGFjdGl2ZSB0aWxsIERIQ1AgdGhyZXNob2xkKi8KKyAgICB0QU5JX1UzMiBpbXBzUGVyaW9kOyAgLyogYW1vdW50IG9mIHRpbWUgdG8gcmVtYWluIGluIElNUFMgKi8KKyAgICB2b2lkICgqaW1wc0NhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpOyAgLyogcm91dGluZSB0byBjYWxsIHdoZW4gSU1QUyBwZXJpb2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGZpbmlzaGVkICovIAorICAgIHZvaWQgKmltcHNDYWxsYmFja0NvbnRleHQ7ICAvKiB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHJvdXRpbmUgc3BlY2lmaWVkIGFib3ZlICovCisgICAgdFBhbFRpbWVySGFuZGxlIGhJbXBzVGltZXI7ICAvKiB0aW1lciB0byB1c2Ugd2l0aCBJTVBTICovCisgICAgdm9zX3RpbWVyX3QgaFRyYWZmaWNUaW1lcjsgIC8qIHRpbWVyIHRvIG1lYXN1cmUgdHJhZmZpYyBmb3IgQk1QUyAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICAgdFBhbFRpbWVySGFuZGxlIGhEaWFnRXZ0VGltZXI7ICAvKiB0aW1lciB0byByZXBvcnQgUE1DIHN0YXRlIHRocm91Z2ggRElBRyBldmVudCAqLworI2VuZGlmCisgICAgdFBhbFRpbWVySGFuZGxlIGhFeGl0UG93ZXJTYXZlVGltZXI7ICAvKiB0aW1lciBmb3IgZGVmZXJyZWQgZXhpdGluZyBvZiBwb3dlciBzYXZlIG1vZGUgKi8KKyAgICB0RGJsTGlua0xpc3QgcG93ZXJTYXZlQ2hlY2tMaXN0OyAvKiBwb3dlciBzYXZlIGNoZWNrIHJvdXRpbmUgbGlzdCAqLworICAgIHREYmxMaW5rTGlzdCByZXF1ZXN0RnVsbFBvd2VyTGlzdDsgLyogcmVxdWVzdCBmdWxsIHBvd2VyIGNhbGxiYWNrIHJvdXRpbmUgbGlzdCAqLworICAgIHRBTklfVTMyIGNMYXN0VHhVbmljYXN0RnJhbWVzOyAgLyogdHJhbnNtaXQgdW5pY2FzdCBmcmFtZSBjb3VudCBhdCBsYXN0IEJNUFMgdHJhZmZpYyB0aW1lciBleHBpcmF0aW9uICovCisgICAgdEFOSV9VMzIgY0xhc3RSeFVuaWNhc3RGcmFtZXM7ICAvKiByZWNlaXZlIHVuaWNhc3QgZnJhbWUgY291bnQgYXQgbGFzdCBCTVBTIHRyYWZmaWMgdGltZXIgZXhwaXJhdGlvbiAqLworCisKKyAgICB0QU5JX0JPT0xFQU4gdWFwc2RFbmFibGVkOyAgLyogVFJVRSBpZiBVQVBTRCBpcyBlbmFibGVkICovCisgICAgdEFOSV9CT09MRUFOIHVhcHNkU2Vzc2lvblJlcXVpcmVkOyAvKiBUUlVFIGlmIGRldmljZSBzaG91bGQgZ28gdG8gVUFQU0Qgb24gZW50ZXJpbmcgQk1QUyovCisgICAgdERibExpbmtMaXN0IHJlcXVlc3RCbXBzTGlzdDsgLyogcmVxdWVzdCBCbXBzIGNhbGxiYWNrIHJvdXRpbmUgbGlzdCAqLworICAgIHREYmxMaW5rTGlzdCByZXF1ZXN0U3RhcnRVYXBzZExpc3Q7IC8qIHJlcXVlc3Qgc3RhcnQgVWFwc2QgY2FsbGJhY2sgcm91dGluZSBsaXN0ICovCisgICAgdEFOSV9CT09MRUFOIHN0YW5kYnlFbmFibGVkOyAgLyogVFJVRSBpZiBTdGFuZGJ5IGlzIGVuYWJsZWQgKi8KKyAgICB2b2lkICgqc3RhbmRieUNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpOyAvKiByb3V0aW5lIHRvIGNhbGwgZm9yIHN0YW5kYnkgcmVxdWVzdCAqLyAKKyAgICB2b2lkICpzdGFuZGJ5Q2FsbGJhY2tDb250ZXh0Oy8qIHZhbHVlIHRvIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8gcm91dGluZSBzcGVjaWZpZWQgYWJvdmUgKi8KKyAgICB0RGJsTGlua0xpc3QgZGV2aWNlU3RhdGVVcGRhdGVJbmRMaXN0OyAvKnVwZGF0ZSBkZXZpY2Ugc3RhdGUgaW5kaWNhdGlvbiBsaXN0ICovCisgICAgdEFOSV9CT09MRUFOIHBtY1JlYWR5OyAvKndoZXRoZXIgZVdOSV9TTUVfU1lTX1JFQURZX0lORCBoYXMgYmVlbiBzZW50IHRvIFBFIG9yIG5vdCAqLworICAgIHRBTklfQk9PTEVBTiB3b3dsRW5hYmxlZDsgIC8qIFRSVUUgaWYgV29XTCBpcyBlbmFibGVkICovCisgICAgdEFOSV9CT09MRUFOIHdvd2xNb2RlUmVxdWlyZWQ7IC8qIFRSVUUgaWYgZGV2aWNlIHNob3VsZCBnbyB0byBXT1dMIG9uIGVudGVyaW5nIEJNUFMgKi8KKyAgICB2b2lkICgqZW50ZXJXb3dsQ2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyk7IC8qIHJvdXRpbmUgdG8gY2FsbCBmb3Igd293bCByZXF1ZXN0ICovIAorICAgIHZvaWQgKmVudGVyV293bENhbGxiYWNrQ29udGV4dDsvKiB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHJvdXRpbmUgc3BlY2lmaWVkIGFib3ZlICovCisgICAgdFNpclNtZVdvd2xFbnRlclBhcmFtcyB3b3dsRW50ZXJQYXJhbXM7IC8qIFdPV0wgbW9kZSBjb25maWd1cmF0aW9uICovCisgICAgdERibExpbmtMaXN0IGRlZmVycmVkTXNnTGlzdDsgICAvL1RoZSBtZXNzYWdlIGluIGhlcmUgYXJlIGRlZmVycmVkIGFuZCBET05PVCBleHBlY3QgcmVzcG9uc2UgZnJvbSBQRQorICAgIHRBTklfQk9PTEVBTiByZlN1cHBsaWVzVm90ZWRPZmY7ICAvL1doZXRoZXIgUkYgc3VwcGxpZXMgYXJlIHZvdGVkIG9mZiBvciBub3QuCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisgICAgcHJlZmVycmVkTmV0d29ya0ZvdW5kSW5kQ2FsbGJhY2sgIHByZWZOZXR3Rm91bmRDQjsgLyogcm91dGluZSB0byBjYWxsIGZvciBQcmVmZXJyZWQgTmV0d29yayBGb3VuZCBJbmRpY2F0aW9uICovIAorICAgIHZvaWQgKnByZWZlcnJlZE5ldHdvcmtGb3VuZEluZENhbGxiYWNrQ29udGV4dDsvKiB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHJvdXRpbmUgc3BlY2lmaWVkIGFib3ZlICovCisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKyAgICBGaWx0ZXJNYXRjaENvdW50Q2FsbGJhY2sgIEZpbHRlck1hdGNoQ291bnRDQjsgLyogcm91dGluZSB0byBjYWxsIGZvciBQYWNrZXQgQ29hbGVzY2luZyBGaWx0ZXIgTWF0Y2ggQ291bnQgKi8gCisgICAgdm9pZCAqRmlsdGVyTWF0Y2hDb3VudENCQ29udGV4dDsvKiB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHJvdXRpbmUgc3BlY2lmaWVkIGFib3ZlICovCisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKyAgICBHVEtPZmZsb2FkR2V0SW5mb0NhbGxiYWNrICBHdGtPZmZsb2FkR2V0SW5mb0NCOyAvKiByb3V0aW5lIHRvIGNhbGwgZm9yIEdUSyBPZmZsb2FkIEluZm9ybWF0aW9uICovIAorICAgIHZvaWQgKkd0a09mZmxvYWRHZXRJbmZvQ0JDb250ZXh0OyAgICAgICAgLyogdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byByb3V0aW5lIHNwZWNpZmllZCBhYm92ZSAqLworI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisgICAgdm9pZCAoKndha2VSZWFzb25JbmRDQikgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgdHBTaXJXYWtlUmVhc29uSW5kIHBXYWtlUmVhc29uSW5kKTsgIC8qIHJvdXRpbmUgdG8gY2FsbCBmb3IgV2FrZSBSZWFzb24gSW5kaWNhdGlvbiAqLyAKKyAgICB2b2lkICp3YWtlUmVhc29uSW5kQ0JDb250ZXh0OyAgLyogdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byByb3V0aW5lIHNwZWNpZmllZCBhYm92ZSAqLworI2VuZGlmIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworfSB0UG1jSW5mbywgKnRwUG1jSW5mbzsKKworCisvL01BQ1JPCisjZGVmaW5lIFBNQ19JU19SRUFEWShwTWFjKSAgKCAoKHBNYWMpLT5wbWMucG1jUmVhZHkpICYmIChTVE9QUEVEICE9IChwTWFjKS0+cG1jLnBtY1N0YXRlKSApCisKKworLyogUm91dGluZSBkZWZpbml0aW9ucy4gKi8KK2V4dGVybiBlSGFsU3RhdHVzIHBtY0VudGVyTG93UG93ZXJTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKTsKK2V4dGVybiBlSGFsU3RhdHVzIHBtY0V4aXRMb3dQb3dlclN0YXRlICh0SGFsSGFuZGxlIGhIYWwpOworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jRW50ZXJGdWxsUG93ZXJTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKTsKK2V4dGVybiBlSGFsU3RhdHVzIHBtY0VudGVyUmVxdWVzdEZ1bGxQb3dlclN0YXRlICh0SGFsSGFuZGxlIGhIYWwsIHRSZXF1ZXN0RnVsbFBvd2VyUmVhc29uIGZ1bGxQb3dlclJlYXNvbik7CitleHRlcm4gZUhhbFN0YXR1cyBwbWNFbnRlclJlcXVlc3RJbXBzU3RhdGUgKHRIYWxIYW5kbGUgaEhhbCk7CitleHRlcm4gZUhhbFN0YXR1cyBwbWNFbnRlckltcHNTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKTsKK2V4dGVybiBlSGFsU3RhdHVzIHBtY0VudGVyUmVxdWVzdEJtcHNTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKTsKK2V4dGVybiBlSGFsU3RhdHVzIHBtY0VudGVyQm1wc1N0YXRlICh0SGFsSGFuZGxlIGhIYWwpOworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jRW50ZXJSZXF1ZXN0U3RhcnRVYXBzZFN0YXRlICh0SGFsSGFuZGxlIGhIYWwpOworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jRW50ZXJVYXBzZFN0YXRlICh0SGFsSGFuZGxlIGhIYWwpOworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jRW50ZXJSZXF1ZXN0U3RvcFVhcHNkU3RhdGUgKHRIYWxIYW5kbGUgaEhhbCk7CitleHRlcm4gZUhhbFN0YXR1cyBwbWNFbnRlclJlcXVlc3RTdGFuZGJ5U3RhdGUgKHRIYWxIYW5kbGUgaEhhbCk7CitleHRlcm4gZUhhbFN0YXR1cyBwbWNFbnRlclN0YW5kYnlTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKTsKK2V4dGVybiB0QU5JX0JPT0xFQU4gcG1jUG93ZXJTYXZlQ2hlY2sgKHRIYWxIYW5kbGUgaEhhbCk7CitleHRlcm4gZUhhbFN0YXR1cyBwbWNTZW5kUG93ZXJTYXZlQ29uZmlnTWVzc2FnZSAodEhhbEhhbmRsZSBoSGFsKTsKK2V4dGVybiBlSGFsU3RhdHVzIHBtY1NlbmRNZXNzYWdlICh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBtZXNzYWdlVHlwZSwgdm9pZCAqcE1lc3NhZ2VEYXRhLCB0QU5JX1UzMiBtZXNzYWdlU2l6ZSk7CitleHRlcm4gdm9pZCBwbWNEb0NhbGxiYWNrcyAodEhhbEhhbmRsZSBoSGFsLCBlSGFsU3RhdHVzIGNhbGxiYWNrU3RhdHVzKTsKK2V4dGVybiB2b2lkIHBtY0RvQm1wc0NhbGxiYWNrcyAodEhhbEhhbmRsZSBoSGFsLCBlSGFsU3RhdHVzIGNhbGxiYWNrU3RhdHVzKTsKK2V4dGVybiB2b2lkIHBtY0RvU3RhcnRVYXBzZENhbGxiYWNrcyAodEhhbEhhbmRsZSBoSGFsLCBlSGFsU3RhdHVzIGNhbGxiYWNrU3RhdHVzKTsKK2V4dGVybiB2b2lkIHBtY0RvU3RhbmRieUNhbGxiYWNrcyAodEhhbEhhbmRsZSBoSGFsLCBlSGFsU3RhdHVzIGNhbGxiYWNrU3RhdHVzKTsKK2V4dGVybiBlSGFsU3RhdHVzIHBtY1N0YXJ0VHJhZmZpY1RpbWVyICh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIGV4cGlyYXRpb25UaW1lKTsKK2V4dGVybiB2b2lkIHBtY1N0b3BUcmFmZmljVGltZXIgKHRIYWxIYW5kbGUgaEhhbCk7CitleHRlcm4gdm9pZCBwbWNJbXBzVGltZXJFeHBpcmVkICh0SGFsSGFuZGxlIGhIYWwpOworZXh0ZXJuIHZvaWQgcG1jVHJhZmZpY1RpbWVyRXhwaXJlZCAodEhhbEhhbmRsZSBoSGFsKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCitleHRlcm4gZUhhbFN0YXR1cyBwbWNTdGFydERpYWdFdnRUaW1lciAodEhhbEhhbmRsZSBoSGFsKTsKK2V4dGVybiB2b2lkIHBtY1N0b3BEaWFnRXZ0VGltZXIgKHRIYWxIYW5kbGUgaEhhbCk7CitleHRlcm4gdm9pZCBwbWNEaWFnRXZ0VGltZXJFeHBpcmVkICh0SGFsSGFuZGxlIGhIYWwpOworI2VuZGlmCisKK2V4dGVybiB2b2lkIHBtY0V4aXRQb3dlclNhdmVUaW1lckV4cGlyZWQgKHRIYWxIYW5kbGUgaEhhbCk7CitleHRlcm4gdFBtY1N0YXRlIHBtY0dldFBtY1N0YXRlICh0SGFsSGFuZGxlIGhIYWwpOworZXh0ZXJuIGNvbnN0IGNoYXIqIHBtY0dldFBtY1N0YXRlU3RyKHRQbWNTdGF0ZSBzdGF0ZSk7CitleHRlcm4gdm9pZCBwbWNEb0RldmljZVN0YXRlVXBkYXRlQ2FsbGJhY2tzICh0SGFsSGFuZGxlIGhIYWwsIHRQbWNTdGF0ZSBzdGF0ZSk7CitleHRlcm4gZUhhbFN0YXR1cyBwbWNSZXF1ZXN0RW50ZXJXb3dsU3RhdGUodEhhbEhhbmRsZSBoSGFsLCB0cFNpclNtZVdvd2xFbnRlclBhcmFtcyB3b3dsRW50ZXJQYXJhbXMpOworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jRW50ZXJXb3dsU3RhdGUgKHRIYWxIYW5kbGUgaEhhbCk7CitleHRlcm4gZUhhbFN0YXR1cyBwbWNSZXF1ZXN0RXhpdFdvd2xTdGF0ZSh0SGFsSGFuZGxlIGhIYWwpOworZXh0ZXJuIHZvaWQgcG1jRG9FbnRlcldvd2xDYWxsYmFja3MgKHRIYWxIYW5kbGUgaEhhbCwgZUhhbFN0YXR1cyBjYWxsYmFja1N0YXR1cyk7CisvL1RoZSBmdW5jdGlvbiB3aWxsIHJlcXVlc3QgZm9yIGZ1bGwgcG93ZXIgYXMgd2VsbCBpbiBhZGRpdGlvbiB0byBkZWZlciB0aGUgbWVzc2FnZQorZXh0ZXJuIGVIYWxTdGF0dXMgcG1jRGVmZXJNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IG1lc3NhZ2VUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcERhdGEsIHRBTklfVTMyIHNpemUpOworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jSXNzdWVDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCBlU21lQ29tbWFuZFR5cGUgY21kVHlwZSwgdm9pZCAqcHZQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHNpemUsIHRBTklfQk9PTEVBTiBmUHV0VG9MaXN0SGVhZCApOworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jRW50ZXJJbXBzQ2hlY2soIHRwQW5pU2lyR2xvYmFsIHBNYWMgKTsKK2V4dGVybiBlSGFsU3RhdHVzIHBtY0VudGVyQm1wc0NoZWNrKCB0cEFuaVNpckdsb2JhbCBwTWFjICk7CitleHRlcm4gdEFOSV9CT09MRUFOIHBtY1Nob3VsZEJtcHNUaW1lclJ1biggdHBBbmlTaXJHbG9iYWwgcE1hYyApOworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9pbmMvcG1jQXBpLmggYi9DT1JFL1NNRS9pbmMvcG1jQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhN2ZmZgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL2luYy9wbWNBcGkuaApAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKgorCisqIE5hbWU6ICBwbWNBcGkuaAorCisqCisKKyogRGVzY3JpcHRpb246IFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbCAoUE1DKSBBUEkgZGVmaW5pdGlvbnMuCisKKyogQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICAKKworKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisqIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisKKyoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19QTUNfQVBJX0hfXworCisjZGVmaW5lIF9fUE1DX0FQSV9IX18KKworLy9UaGlzIHRpbWVyIHZhbHVlIGRldGVybWluZXMgdGhlIGRlZmF1bHQgcGVyaW9kaWNpdHkgYXQgd2hpY2ggQk1QUyByZXRyaWVzIHdpbGwgaGFwcGVuCisvL1RoaXMgZGVmYXVsdCB2YWx1ZSBpcyBvdmVyd3JpdHRlbiB0eXBpY2FseSBieSBPUyBzcGVjaWZpYyByZWdpc3RyeS9JTkkgdmFsdWVzLiAKKyNkZWZpbmUgQk1QU19UUkFGRklDX1RJTUVSX0RFRkFVTFQgNTAwMCAgLy91bml0ID0gbXMKKyNkZWZpbmUgREhDUF9SRU1BSU5fUE9XRVJfQUNUSVZFX1RIUkVTSE9MRCAxMiAvLyAoMTIgKiA1KSBzZWMgPSA2MCBzZWNvbmRzID0gMSBtaW4KKworLy9UaGlzIHRpbWVyIHZhbHVlIGlzIHVzZWQgd2hlbiBzdGFydGluZyB0aGUgdGltZXIgcmlnaHQgYWZ0ZXIgYXNzb2NpYXRpb24uIFRoaXMgdmFsdWUKKy8vc2hvdWxkIGJlIGxhcmdlIGVub3VnaCB0byBhbGxvdyB0aGUgYXV0aCwgREhDUCBoYW5kc2hha2UgdG8gY29tcGxldGUKKyNkZWZpbmUgQk1QU19UUkFGRklDX1RJTUVSX0FMTE9XX1NFQ1VSSVRZX0RIQ1AgODAwMCAgLy91bml0ID0gbXMKKworI2RlZmluZSBQTUNfSVNfQ0hJUF9BQ0NFU1NJQkxFKHBtY1N0YXRlKSAoIChJTVBTICE9IChwbWNTdGF0ZSkpICYmIChSRVFVRVNUX0lNUFMgIT0gKHBtY1N0YXRlKSkgJiYgXAorICAgICAgIChTVEFOREJZICE9IChwbWNTdGF0ZSkpICYmIChSRVFVRVNUX1NUQU5EQlkgIT0gKHBtY1N0YXRlKSkgKQorCisKKworLyogUG93ZXIgZXZlbnRzIHRoYXQgYXJlIHNpZ25hbGVkIHRvIFBNQy4gKi8KKwordHlwZWRlZiBlbnVtIGVQbWNQb3dlckV2ZW50CisKK3sKKworICAgIGVQTUNfU1lTVEVNX0hJQkVSTkFURSwgIC8qIGhvc3QgaXMgZW50ZXJpbmcgaGliZXJuYXRpb24gKi8KKworICAgIGVQTUNfU1lTVEVNX1JFU1VNRSwgIC8qIGhvc3QgaXMgcmVzdW1pbmcgYWZ0ZXIgaGliZXJuYXRpb24gKi8KKworICAgIGVQTUNfSFdfV0xBTl9TV0lUQ0hfT0ZGLCAgLyogSGFyZHdhcmUgV0xBTiBTd2l0Y2ggaGFzIGJlZW4gdHVybmVkIG9mZiAqLworCisgICAgZVBNQ19IV19XTEFOX1NXSVRDSF9PTiwgIC8qIEhhcmR3YXJlIFdMQU4gU3dpdGNoIGhhcyBiZWVuIHR1cm5lZCBvbiAqLworCisgICAgZVBNQ19TV19XTEFOX1NXSVRDSF9PRkYsICAvKiBTb2Z0d2FyZSBXTEFOIFN3aXRjaCBoYXMgYmVlbiB0dXJuZWQgb2ZmICovCisKKyAgICBlUE1DX1NXX1dMQU5fU1dJVENIX09OLCAgLyogU29mdHdhcmUgV0xBTiBTd2l0Y2ggaGFzIGJlZW4gdHVybmVkIG9uICovCisKKyAgICBlUE1DX0JBVFRFUllfT1BFUkFUSU9OLCAgLyogaG9zdCBpcyBub3cgb3BlcmF0aW5nIG9uIGJhdHRlcnkgcG93ZXIgKi8KKworICAgIGVQTUNfQUNfT1BFUkFUSU9OICAvKiBob3N0IGlzIG5vdyBvcGVyYXRpbmcgb24gQUMgcG93ZXIgKi8KKworfSB0UG1jUG93ZXJFdmVudDsKKworCisKKworLyogUG93ZXIgc2F2aW5nIG1vZGVzLiAqLworCit0eXBlZGVmIGVudW0gZVBtY1Bvd2VyU2F2aW5nTW9kZQorCit7CisKKyAgICBlUE1DX0lETEVfTU9ERV9QT1dFUl9TQVZFLCAgLyogSWRsZSBNb2RlIFBvd2VyIFNhdmUgKElNUFMpICovCisKKyAgICBlUE1DX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkUsICAvKiBCZWFjb24gTW9kZSBQb3dlciBTYXZlIChCTVBTKSAqLworCisgICAgZVBNQ19TUEFUSUFMX01VTFRJUExFWF9QT1dFUl9TQVZFLCAgLyogU3BhdGlhbCBNdWx0aXBsZXhpbmcgUG93ZXIgU2F2ZSAoU01QUykgKi8KKworICAgIGVQTUNfVUFQU0RfTU9ERV9QT1dFUl9TQVZFLCAgLyogVW5zY2hlZHVsZWQgQXV0b21hdGljIFBvd2VyIFNhdmUgRGVsaXZlcnkgTW9kZSAqLworCisgICAgZVBNQ19TVEFOREJZX01PREVfUE9XRVJfU0FWRSwgIC8qIFN0YW5kYnkgUG93ZXIgU2F2ZSBNb2RlICovCisKKyAgICBlUE1DX1dPV0xfTU9ERV9QT1dFUl9TQVZFICAvKiBXYWtlLW9uLVdpcmVsZXNzIExBTiBQb3dlciBTYXZlIE1vZGUgKi8KKworfSB0UG1jUG93ZXJTYXZpbmdNb2RlOworCisKKworCisvKiBTd2l0Y2ggc3RhdGVzLiAqLworCit0eXBlZGVmIGVudW0gZVBtY1N3aXRjaFN0YXRlCisKK3sKKworICAgIGVQTUNfU1dJVENIX09GRiwgIC8qIHN3aXRjaCBvZmYgKi8KKworICAgIGVQTUNfU1dJVENIX09OICAvKiBzd2l0Y2ggb24gKi8KKworfSB0UG1jU3dpdGNoU3RhdGU7CisKKworCisKKy8qIERldmljZSBwb3dlciBzdGF0ZXMuICovCisKK3R5cGVkZWYgZW51bSBlUG1jUG93ZXJTdGF0ZQorCit7CisKKyAgICBlUE1DX0ZVTExfUE9XRVIsICAvKiBmdWxsIHBvd2VyICovCisKKyAgICBlUE1DX0xPV19QT1dFUiwgIC8qIGxvdyBwb3dlciAqLworCit9IHRQbWNQb3dlclN0YXRlOworCisgCisKKy8qIFBNQyBzdGF0ZXMuICovCisKK3R5cGVkZWYgZW51bSBlUG1jU3RhdGUKKworeworCisgICAgU1RPUFBFRCwgLyogUE1DIGlzIHN0b3BwZWQgKi8KKworICAgIEZVTExfUE9XRVIsIC8qIGZ1bGwgcG93ZXIgKi8KKworICAgIExPV19QT1dFUiwgLyogbG93IHBvd2VyICovCisKKyAgICBSRVFVRVNUX0lNUFMsICAvKiByZXF1ZXN0aW5nIElNUFMgKi8KKworICAgIElNUFMsICAvKiBpbiBJTVBTICovCisKKyAgICBSRVFVRVNUX0JNUFMsICAvKiByZXF1ZXN0aW5nIEJNUFMgKi8KKworICAgIEJNUFMsICAvKiBpbiBCTVBTICovCisKKyAgICBSRVFVRVNUX0ZVTExfUE9XRVIsICAvKiByZXF1ZXN0aW5nIGZ1bGwgcG93ZXIgKi8KKworICAgIFJFUVVFU1RfU1RBUlRfVUFQU0QsICAvKiByZXF1ZXN0aW5nIFN0YXJ0IFVBUFNEICovCisKKyAgICBSRVFVRVNUX1NUT1BfVUFQU0QsICAvKiByZXF1ZXN0aW5nIFN0b3AgVUFQU0QgKi8KKworICAgIFVBUFNELCAgICAgICAgICAgLyogaW4gVUFQU0QgKi8KKworICAgIFJFUVVFU1RfU1RBTkRCWSwgIC8qIHJlcXVlc3Rpbmcgc3RhbmRieSBtb2RlICovCisKKyAgICBTVEFOREJZLCAgLyogaW4gc3RhbmRieSBtb2RlICovCisKKyAgICBSRVFVRVNUX0VOVEVSX1dPV0wsIC8qIHJlcXVlc3RpbmcgZW50ZXIgV09XTCAqLworCisgICAgUkVRVUVTVF9FWElUX1dPV0wsICAvKiByZXF1ZXN0aW5nIGV4aXQgV09XTCAqLworCisgICAgV09XTCAgICAgICAgICAgICAgICAvKiBDaGlwIGluIFdPV0wgbW9kZSAqLworCit9IHRQbWNTdGF0ZTsKKworCisvKiBXaGljaCBiZWFjb25zIHNob3VsZCBiZSBmb3J3YXJkZWQgdG8gdGhlIGhvc3QuICovCisKK3R5cGVkZWYgZW51bSBlUG1jQmVhY29uc1RvRm9yd2FyZAorCit7CisKKyAgICBlUE1DX05PX0JFQUNPTlMsICAvKiBub25lICovCisKKyAgICBlUE1DX0JFQUNPTlNfV0lUSF9USU1fU0VULCAgLyogd2l0aCBUSU0gc2V0ICovCisKKyAgICBlUE1DX0JFQUNPTlNfV0lUSF9EVElNX1NFVCwgIC8qIHdpdGggRFRJTSBzZXQgKi8KKworICAgIGVQTUNfTlRIX0JFQUNPTiwgIC8qIGV2ZXJ5IE50aCBiZWFjb24gKi8KKworICAgIGVQTUNfQUxMX0JFQUNPTlMgIC8qIGFsbCBiZWFjb25zICovCisKK30gdFBtY0JlYWNvbnNUb0ZvcndhcmQ7CisKKworCisKKy8qIFRoZSBTcGF0aWFsIE11bGl0cGxleGluZyBQb3dlciBTYXZlIG1vZGVzLiAqLworCit0eXBlZGVmIGVudW0gZVBtY1NtcHNNb2RlCisKK3sKKworICAgIGVQTUNfRFlOQU1JQ19TTVBTLCAgLyogZHluYW1pYyBTTVBTICovCisKKyAgICBlUE1DX1NUQVRJQ19TTVBTICAvKiBzdGF0aWMgU01QUyAqLworCit9IHRQbWNTbXBzTW9kZTsKKworCisKKworLyogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciBJZGxlIE1vZGUgUG93ZXIgU2F2ZSAoSU1QUykuICovCisKK3R5cGVkZWYgc3RydWN0IHNQbWNJbXBzQ29uZmlnUGFyYW1zCisKK3sKKworICAgIHRBTklfQk9PTEVBTiBlbnRlck9uQWM7ICAvKiBGQUxTRSBpZiBkZXZpY2Ugc2hvdWxkIGVudGVyIElNUFMgb25seSB3aGVuIGhvc3Qgb3BlcmF0aW5nCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gYmF0dGVyeSBwb3dlciwgVFJVRSBpZiBkZXZpY2Ugc2hvdWxkIGVudGVyIGFsd2F5cyAqLworCit9IHRQbWNJbXBzQ29uZmlnUGFyYW1zLCAqdHBQbWNJbXBzQ29uZmlnUGFyYW1zOworCisKKworCisvKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEJlYWNvbiBNb2RlIFBvd2VyIFNhdmUgKEJNUFMpLiAqLworCit0eXBlZGVmIHN0cnVjdCBzUG1jQm1wc0NvbmZpZ1BhcmFtcworCit7CisKKyAgICB0QU5JX0JPT0xFQU4gZW50ZXJPbkFjOyAgLyogRkFMU0UgaWYgZGV2aWNlIHNob3VsZCBlbnRlciBCTVBTIG9ubHkgd2hlbiBob3N0IG9wZXJhdGluZyBvbgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdHRlcnkgcG93ZXIsIFRSVUUgaWYgZGV2aWNlIHNob3VsZCBlbnRlciBhbHdheXMgKi8KKworICAgIHRBTklfVTMyIHR4VGhyZXNob2xkOyAgLyogdHJhbnNtaXQgcmF0ZSB1bmRlciB3aGljaCBCTVBTIHNob3VsZCBiZSBlbnRlcmVkIChmcmFtZXMgLyB0cmFmZmljIG1lYXN1cmVtZW50IHBlcmlvZCkgKi8KKworICAgIHRBTklfVTMyIHJ4VGhyZXNob2xkOyAgLyogcmVjZWl2ZSByYXRlIHVuZGVyIHdoaWNoIEJNUFMgc2hvdWxkIGJlIGVudGVyZWQgKGZyYW1lcyAvIHRyYWZmaWMgbWVhc3VyZW1lbnQgcGVyaW9kKSAqLworCisgICAgdEFOSV9VMzIgdHJhZmZpY01lYXN1cmVQZXJpb2Q7IC8qIHBlcmlvZCBmb3IgQk1QUyB0cmFmZmljIG1lYXN1cmVtZW50IChtaWxsaXNlY29uZHMpICovCisKKyAgICB0QU5JX1UzMiBibXBzUGVyaW9kOyAgLyogYW1vdW50IG9mIHRpbWUgaW4gbG93IHBvd2VyIChiZWFjb24gaW50ZXJ2YWxzKSAqLworCisgICAgdFBtY0JlYWNvbnNUb0ZvcndhcmQgZm9yd2FyZEJlYWNvbnM7ICAvKiB3aGljaCBiZWFjb25zIHNob3VsZCBiZSBmb3J3YXJkZWQgdG8gdGhlIGhvc3QgKi8KKworICAgIHRBTklfVTMyIHZhbHVlT2ZOOyAgLyogdGhlIHZhbHVlIG9mIE4gd2hlbiBmb3J3YXJkQmVhY29ucyBpcyBzZXQgdG8gZVBNQ19OVEhfQkVBQ09OICovCisKKyAgICB0QU5JX0JPT0xFQU4gdXNlUHNQb2xsOyAgLyogVFJVRSBpZiBQUy1QT0xMIHNob3VsZCBiZSB1c2VkIHRvIHJldHJpZXZlIGZyYW1lcyBmcm9tIEFQLCBGQUxTRSBpZiBhCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCBkYXRhIGZyYW1lIHdpdGggdGhlIFBNIGJpdCByZXNldCBzaG91bGQgYmUgdXNlZCAqLworCisgICAgdEFOSV9CT09MRUFOIHNldFBtT25MYXN0RnJhbWU7IC8qIFRSVUUgdG8ga2VlcCBkZXZpY2UgaW4gQk1QUyBhcyBtdWNoIGFzIHBvc3NpYmxlLCBGQUxTRSBvdGhlcndpc2UsIFRSVUUgbWVhbnM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkgUE0gYml0IHNob3VsZCBiZSBzZXQgb24gbGFzdCBwZW5kaW5nIHRyYW5zbWl0IGRhdGEgZnJhbWUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSBudWxsIGZyYW1lIHdpdGggUE0gYml0IHNldCBzaG91bGQgYmUgdHJhbnNtaXR0ZWQgYWZ0ZXIgbGFzdCBwZW5kaW5nIHJlY2VpdmUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KKworICAgIHRBTklfQk9PTEVBTiBlbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uOyAvKiBpZiBUUlVFLCBCRVQgZmVhdHVyZSBpbiBSSVZBIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVuYWJsZWQsIEZBTFNFIG90aGVyd2lzZSwgVFJVRSBtZWFuczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlhQIHdpbGwgcmVhZCB0aGUgYmVhY29uIGhlYWRlciBmb3IgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU0gYml0ICYgZGlzY2FyZCB0aGUgcmVzdCBpZiBzZXQgdG8gMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIGluIEJNUFMgICAgICAgICAgICAgICovCisgICAgdEFOSV9VOCAgICAgIGJjbkVhcmx5VGVybVdha2VJbnRlcnZhbDsgLyogVGhpcyBzcGVjaWZpZXMgaG93IG9mdGVuIGluIHRlcm1zIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBMSSB3ZSB3aWxsIGRpc2FibGUgQkVUIGluIG9yZGVyIHRvIHN5bmMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwIFRTRiovCisKK30gdFBtY0JtcHNDb25maWdQYXJhbXMsICp0cFBtY0JtcHNDb25maWdQYXJhbXM7CisKKworCisKKy8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgU3BhdGlhbCBNdWxpdHBsZXhpbmcgUG93ZXIgU2F2ZSAoU01QUykuICovCisKK3R5cGVkZWYgc3RydWN0IHNQbWNTbXBzQ29uZmlnUGFyYW1zCisKK3sKKworICAgIHRQbWNTbXBzTW9kZSBtb2RlOyAgLyogbW9kZSB0byB1c2UgKi8KKworICAgIHRBTklfQk9PTEVBTiBlbnRlck9uQWM7ICAvKiBGQUxTRSBpZiBkZXZpY2Ugc2hvdWxkIGVudGVyIFNNUFMgb25seSB3aGVuIGhvc3Qgb3BlcmF0aW5nIG9uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0dGVyeSBwb3dlciwgVFJVRSBpZiBkZXZpY2Ugc2hvdWxkIGVudGVyIGFsd2F5cyAqLworCit9IHRQbWNTbXBzQ29uZmlnUGFyYW1zLCAqdHBQbWNTbXBzQ29uZmlnUGFyYW1zOworCisKKy8qIFJvdXRpbmUgZGVmaW5pdGlvbnMuICovCisKK2V4dGVybiBlSGFsU3RhdHVzIHBtY09wZW4gKHRIYWxIYW5kbGUgaEhhbCk7CisKK2V4dGVybiBlSGFsU3RhdHVzIHBtY1N0YXJ0ICh0SGFsSGFuZGxlIGhIYWwpOworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNTdG9wICh0SGFsSGFuZGxlIGhIYWwpOworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNDbG9zZSAodEhhbEhhbmRsZSBoSGFsICk7CisKK2V4dGVybiBlSGFsU3RhdHVzIHBtY1NpZ25hbFBvd2VyRXZlbnQgKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyRXZlbnQgZXZlbnQpOworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNTZXRDb25maWdQb3dlclNhdmUgKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUsIHZvaWQgKnBDb25maWdQYXJhbXMpOworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNHZXRDb25maWdQb3dlclNhdmUgKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUsIHZvaWQgKnBDb25maWdQYXJhbXMpOworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNFbmFibGVQb3dlclNhdmUgKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUpOworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNTdGFydEF1dG9CbXBzVGltZXIgKHRIYWxIYW5kbGUgaEhhbCk7CisKK2V4dGVybiBlSGFsU3RhdHVzIHBtY1N0b3BBdXRvQm1wc1RpbWVyICh0SGFsSGFuZGxlIGhIYWwpOworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNEaXNhYmxlUG93ZXJTYXZlICh0SGFsSGFuZGxlIGhIYWwsIHRQbWNQb3dlclNhdmluZ01vZGUgcHNNb2RlKTsKKworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jUXVlcnlQb3dlclN0YXRlICh0SGFsSGFuZGxlIGhIYWwsIHRQbWNQb3dlclN0YXRlICpwUG93ZXJTdGF0ZSwgdFBtY1N3aXRjaFN0YXRlICpwSHdXbGFuU3dpdGNoU3RhdGUsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBtY1N3aXRjaFN0YXRlICpwU3dXbGFuU3dpdGNoU3RhdGUpOworCitleHRlcm4gdEFOSV9CT09MRUFOIHBtY0lzUG93ZXJTYXZlRW5hYmxlZCAodEhhbEhhbmRsZSBoSGFsLCB0UG1jUG93ZXJTYXZpbmdNb2RlIHBzTW9kZSk7CisKK2V4dGVybiBlSGFsU3RhdHVzIHBtY1JlcXVlc3RGdWxsUG93ZXIgKHRIYWxIYW5kbGUgaEhhbCwgdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja0NvbnRleHQsIHRSZXF1ZXN0RnVsbFBvd2VyUmVhc29uIGZ1bGxQb3dlclJlYXNvbik7CisKK2V4dGVybiBlSGFsU3RhdHVzIHBtY1JlcXVlc3RJbXBzICh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIGltcHNQZXJpb2QsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja0NvbnRleHQpOworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNSZWdpc3RlclBvd2VyU2F2ZUNoZWNrICh0SGFsSGFuZGxlIGhIYWwsIHRBTklfQk9PTEVBTiAoKmNoZWNrUm91dGluZSkgKHZvaWQgKmNoZWNrQ29udGV4dCksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNoZWNrQ29udGV4dCk7CisKK2V4dGVybiBlSGFsU3RhdHVzIHBtY0RlcmVnaXN0ZXJQb3dlclNhdmVDaGVjayAodEhhbEhhbmRsZSBoSGFsLCB0QU5JX0JPT0xFQU4gKCpjaGVja1JvdXRpbmUpICh2b2lkICpjaGVja0NvbnRleHQpKTsKKworZXh0ZXJuIHZvaWQgcG1jTWVzc2FnZVByb2Nlc3NvciAodEhhbEhhbmRsZSBoSGFsLCB0U2lyU21lUnNwICpwTXNnKTsKKworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNSZXF1ZXN0Qm1wcyAoCisKKyAgIHRIYWxIYW5kbGUgaEhhbCwKKworICAgdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpLAorCisgICB2b2lkICpjYWxsYmFja0NvbnRleHQpOworCisKK2V4dGVybiBlSGFsU3RhdHVzIHBtY1N0YXJ0VWFwc2QgKAorCisgICB0SGFsSGFuZGxlIGhIYWwsCisKKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKSwKKworICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0KTsKKworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNTdG9wVWFwc2QgKHRIYWxIYW5kbGUgaEhhbCk7CisKKworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jUmVxdWVzdFN0YW5kYnkgKAorCisgICB0SGFsSGFuZGxlIGhIYWwsCisKKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKSwKKworICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0KTsKKworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNSZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kICh0SGFsSGFuZGxlIGhIYWwsIAorCisgICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCB0UG1jU3RhdGUgcG1jU3RhdGUpLAorCisgICB2b2lkICpjYWxsYmFja0NvbnRleHQpOworCisKK2V4dGVybiBlSGFsU3RhdHVzIHBtY0RlcmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCAodEhhbEhhbmRsZSBoSGFsLCAKKworICAgdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgdFBtY1N0YXRlIHBtY1N0YXRlKSk7CisKKworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jUmVhZHkodEhhbEhhbmRsZSBoSGFsKTsKKworCit2b2lkIHBtY0R1bXBJbml0KHRIYWxIYW5kbGUgaEhhbCk7CisKKworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jV293bEFkZEJjYXN0UGF0dGVybiAoCisKKyAgIHRIYWxIYW5kbGUgaEhhbCwgCisKKyAgIHRwU2lyV293bEFkZEJjYXN0UHRybiBwYXR0ZXJuKTsKKworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNXb3dsRGVsQmNhc3RQYXR0ZXJuICgKKworICAgdEhhbEhhbmRsZSBoSGFsLCAKKworICAgdHBTaXJXb3dsRGVsQmNhc3RQdHJuIHBhdHRlcm4pOworCisKK2V4dGVybiBlSGFsU3RhdHVzIHBtY0VudGVyV293bCAoIAorCisgICAgdEhhbEhhbmRsZSBoSGFsLCAKKworICAgIHZvaWQgKCplbnRlcldvd2xDYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKSwKKworICAgIHZvaWQgKmVudGVyV293bENhbGxiYWNrQ29udGV4dCwKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgICB2b2lkICgqd2FrZVJlYXNvbkluZENCKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCB0cFNpcldha2VSZWFzb25JbmQgcFdha2VSZWFzb25JbmQpLAorCisgICAgdm9pZCAqd2FrZVJlYXNvbkluZENCQ29udGV4dCwKKyNlbmRpZiAvLyBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgICB0cFNpclNtZVdvd2xFbnRlclBhcmFtcyB3b3dsRW50ZXJQYXJhbXMpOworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNFeGl0V293bCAodEhhbEhhbmRsZSBoSGFsKTsKKworCitleHRlcm4gZUhhbFN0YXR1cyBwbWNTZXRIb3N0T2ZmbG9hZCAodEhhbEhhbmRsZSBoSGFsLCB0cFNpckhvc3RPZmZsb2FkUmVxIHBSZXF1ZXN0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHBtY1NldEtlZXBBbGl2ZQorICAgIFxicmllZiAgU2V0IHRoZSBLZWVwIEFsaXZlIGZlYXR1cmUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJlcXVlc3QgLSBQb2ludGVyIHRvIHRoZSBLZWVwIEFsaXZlLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAgICAgICAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAgQ2Fubm90IHNldCB0aGUga2VlcGFsaXZlLgorICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAgUmVxdWVzdCBhY2NlcHRlZC4gCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gZUhhbFN0YXR1cyBwbWNTZXRLZWVwQWxpdmUgKHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJLZWVwQWxpdmVSZXEgcFJlcXVlc3QpOworCitleHRlcm4gdEFOSV9CT09MRUFOIHBtY1ZhbGlkYXRlQ29ubmVjdFN0YXRlKCB0SGFsSGFuZGxlIGhIYWwgKTsKKworZXh0ZXJuIHRBTklfQk9PTEVBTiBwbWNBbGxvd0ltcHMoIHRIYWxIYW5kbGUgaEhhbCApOworCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKy8qUHJlZiBuZXR3IGZvdW5kIENiIGRlY2xhcmF0aW9uKi8KK3R5cGVkZWYgdm9pZCgqcHJlZmVycmVkTmV0d29ya0ZvdW5kSW5kQ2FsbGJhY2spKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgdHBTaXJQcmVmTmV0d29ya0ZvdW5kSW5kIHBQcmVmTmV0d29ya0ZvdW5kSW5kKTsKKworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jU2V0UHJlZmVycmVkTmV0d29ya0xpc3QodEhhbEhhbmRsZSBoSGFsLCB0cFNpclBOT1NjYW5SZXEgcFJlcXVlc3QsIHRBTklfVTggc2Vzc2lvbklkLCBwcmVmZXJyZWROZXR3b3JrRm91bmRJbmRDYWxsYmFjayBjYWxsYmFja1JvdXRpbmUsIHZvaWQgKmNhbGxiYWNrQ29udGV4dCk7CitleHRlcm4gZUhhbFN0YXR1cyBwbWNTZXRSc3NpRmlsdGVyKHRIYWxIYW5kbGUgaEhhbCwgdl9VOF90IHJzc2lUaHJlc2hvbGQpOworI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKy8vIFBhY2tldCBDb2FsZXNjaW5nIEZpbHRlciBNYXRjaCBDb3VudCBDYWxsYmFjayBkZWNsYXJhdGlvbgordHlwZWRlZiB2b2lkKCpGaWx0ZXJNYXRjaENvdW50Q2FsbGJhY2spKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpclJjdkZsdFBrdE1hdGNoUnNwIHBSY3ZGbHRQa3RNYXRjaFJzcCk7CitleHRlcm4gZUhhbFN0YXR1cyBwbWNHZXRGaWx0ZXJNYXRjaENvdW50KHRIYWxIYW5kbGUgaEhhbCwgRmlsdGVyTWF0Y2hDb3VudENhbGxiYWNrIGNhbGxiYWNrUm91dGluZSwgdm9pZCAqY2FsbGJhY2tDb250ZXh0KTsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisvLyBHVEsgT2ZmbG9hZCBJbmZvcm1hdGlvbiBDYWxsYmFjayBkZWNsYXJhdGlvbgordHlwZWRlZiB2b2lkKCpHVEtPZmZsb2FkR2V0SW5mb0NhbGxiYWNrKSh2b2lkICpjYWxsYmFja0NvbnRleHQsIHRwU2lyR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXMgcEd0a09mZmxvYWRHZXRJbmZvUnNwKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHBtY1NldEdUS09mZmxvYWQKKyAgICBcYnJpZWYgIFNldCBHVEsgb2ZmbG9hZCBmZWF0dXJlLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBHdGtPZmZsb2FkIC0gUG9pbnRlciB0byB0aGUgR1RLIG9mZmxvYWQgcmVxdWVzdC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgIENhbm5vdCBzZXQgdGhlIG9mZmxvYWQuCisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTICBSZXF1ZXN0IGFjY2VwdGVkLiAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBlSGFsU3RhdHVzIHBtY1NldEdUS09mZmxvYWQgKHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJHdGtPZmZsb2FkUGFyYW1zIHBHdGtPZmZsb2FkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHBtY0dldEdUS09mZmxvYWQKKyAgICBcYnJpZWYgIEdldCBHVEsgb2ZmbG9hZCBpbmZvcm1hdGlvbi4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBjYWxsYmFja1JvdXRpbmUgLSBQb2ludGVyIHRvIHRoZSBHVEsgT2ZmbG9hZCBHZXQgSW5mbyByZXNwb25zZSBjYWxsYmFjayByb3V0aW5lLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAgICAgICAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAgQ2Fubm90IHNldCB0aGUgb2ZmbG9hZC4KKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIFJlcXVlc3QgYWNjZXB0ZWQuIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jR2V0R1RLT2ZmbG9hZCAodEhhbEhhbmRsZSBoSGFsLCBHVEtPZmZsb2FkR2V0SW5mb0NhbGxiYWNrIGNhbGxiYWNrUm91dGluZSwgdm9pZCAqY2FsbGJhY2tDb250ZXh0KTsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9zbWVJbnNpZGUuaCBiL0NPUkUvU01FL2luYy9zbWVJbnNpZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDJhYzdkCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvaW5jL3NtZUluc2lkZS5oCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1NNRUlOU0lERV9IICkKKyNkZWZpbmUgX19TTUVJTlNJREVfSAorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBzbWVJbnNpZGUuaAorICAKKyAgXGJyaWVmIHByb3RvdHlwZSBmb3IgU01FIHN0cnVjdHVyZXMgYW5kIEFQSXMgdXNlZCBpbnNzaWRlIFNNRQorICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInZvc19zdGF0dXMuaCIKKyNpbmNsdWRlICJ2b3NfbG9jay5oIgorI2luY2x1ZGUgInZvc190cmFjZS5oIgorI2luY2x1ZGUgInZvc19tZW1vcnkuaCIKKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKyNpbmNsdWRlICJjc3JJbnRlcm5hbC5oIgorI2luY2x1ZGUgInNtZV9Rb3NBcGkuaCIKKyNpbmNsdWRlICJzbWVRb3NJbnRlcm5hbC5oIgorCisKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInNtZV9Scm1BcGkuaCIKKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgU01FX1RPVEFMX0NPTU1BTkQgIDIwCisKKwordHlwZWRlZiBzdHJ1Y3Qgc0dlbmVyaWNQbWNDbWQKK3sKKyAgICB0QU5JX1UzMiBzaXplOyAgLy9zaXplb2YgdGhlIGRhdGEgaW4gdGhlIHVuaW9uLCBpZiBhbnkKKyAgICB0UmVxdWVzdEZ1bGxQb3dlclJlYXNvbiBmdWxsUG93ZXJSZWFzb247CisgICAgdEFOSV9CT09MRUFOIGZSZWxlYXNlV2hlbkRvbmU7IC8vaWYgVFJVRSwgdGhlIGNvbW1hbmQgc2hhbGwgbm90IHB1dCBiYWNrIHRvIHRoZSBxdWV1ZSwgZnJlZSB0ZSBtZW1vcnkgaW5zdGVhZC4KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgdEV4aXRCbXBzSW5mbyBleGl0Qm1wc0luZm87CisgICAgICAgIHRTaXJTbWVXb3dsRW50ZXJQYXJhbXMgZW50ZXJXb3dsSW5mbzsKKyAgICB9dTsKK30gdEdlbmVyaWNQbWNDbWQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc0dlbmVyaWNRb3NDbWQKK3sKKyAgICBzbWVfUW9zV21tVHNwZWNJbmZvIHRzcGVjSW5mbzsKKyAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKyAgICB2X1U4X3QgdHNwZWNfbWFzazsKK30gdEdlbmVyaWNRb3NDbWQ7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCit0eXBlZGVmIHN0cnVjdCBzUmVtYWluQ2hsQ21kCit7CisgICAgdEFOSV9VOCBjaG47CisgICAgdEFOSV9VOCBwaHlNb2RlOworICAgIHRBTklfVTMyIGR1cmF0aW9uOworICAgIHZvaWQqIGNhbGxiYWNrOworICAgIHZvaWQqIGNhbGxiYWNrQ3R4OworfXRSZW1haW5DaGxDbWQ7CisKK3R5cGVkZWYgc3RydWN0IHNOb0FDbWQKK3sKKyAgICB0UDJwUHNDb25maWcgTm9BOworfSB0Tm9BQ21kOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHRhZ1NtZUNtZAoreworICAgIHRMaXN0RWxlbSBMaW5rOworICAgIGVTbWVDb21tYW5kVHlwZSBjb21tYW5kOworICAgIHRBTklfVTMyIHNlc3Npb25JZDsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgdFNjYW5DbWQgc2NhbkNtZDsKKyAgICAgICAgdFJvYW1DbWQgcm9hbUNtZDsKKyAgICAgICAgdFdtU3RhdHVzQ2hhbmdlQ21kIHdtU3RhdHVzQ2hhbmdlQ21kOworICAgICAgICB0U2V0S2V5Q21kIHNldEtleUNtZDsKKyAgICAgICAgdFJlbW92ZUtleUNtZCByZW1vdmVLZXlDbWQ7CisgICAgICAgIHRHZW5lcmljUG1jQ21kIHBtY0NtZDsKKyAgICAgICAgdEdlbmVyaWNRb3NDbWQgcW9zQ21kOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgdFJlbWFpbkNobENtZCByZW1haW5DaGxDbWQ7CisgICAgICAgIHROb0FDbWQgTm9BQ21kOworI2VuZGlmCisgICAgICAgIHRBZGRTdGFGb3JTZXNzaW9uQ21kIGFkZFN0YVNlc3Npb25DbWQ7CisgICAgICAgIHREZWxTdGFGb3JTZXNzaW9uQ21kIGRlbFN0YVNlc3Npb25DbWQ7CisgICAgfXU7Cit9dFNtZUNtZDsKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWwgdG8gU01FCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vVG8gZ2V0IGEgY29tbWFuZCBidWZmZXIKKy8vUmV0dXJuOiBOVUxMIGlmIHRoZXJlIG5vIG1vcmUgY29tbWFuZCBidWZmZXIgbGVmdAordFNtZUNtZCAqc21lR2V0Q29tbWFuZEJ1ZmZlciggdHBBbmlTaXJHbG9iYWwgcE1hYyApOwordm9pZCBzbWVQdXNoQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENtZCwgdEFOSV9CT09MRUFOIGZIaWdoUHJpb3JpdHkgKTsKK3ZvaWQgc21lUHJvY2Vzc1BlbmRpbmdRdWV1ZSggdHBBbmlTaXJHbG9iYWwgcE1hYyApOwordm9pZCBzbWVSZWxlYXNlQ29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ21kKTsKK3ZvaWQgcHVyZ2VTbWVTZXNzaW9uQ21kTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpOwordEFOSV9CT09MRUFOIHNtZUNvbW1hbmRQZW5kaW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordEFOSV9CT09MRUFOIHBtY1Byb2Nlc3NDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCApOworLy90aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWJvcnQgYSBjb21tYW5kIHdoZXJlIHRoZSBub3JtYWwgcHJvY2Vzc2luZyBvZiB0aGUgY29tbWFuZAorLy9pcyB0ZXJtaW5hdGVkIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgbm9ybWFsIHBhdGguIGl0IGlzIGhlcmUgdG8gdGFrZSBjYXJlIG9mIGNhbGxiYWNrcyBmb3IKKy8vdGhlIGNvbW1hbmQsIGlmIGFwcGxpY2FibGUuCit2b2lkIHBtY0Fib3J0Q29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIHRBTklfQk9PTEVBTiBmU3RvcHBpbmcgKTsKK3RBTklfQk9PTEVBTiBxb3NQcm9jZXNzQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQgKTsKKworZUhhbFN0YXR1cyBjc3JQcm9jZXNzU2NhbkNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICk7CitlSGFsU3RhdHVzIGNzclJvYW1Qcm9jZXNzQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQgKTsKK3ZvaWQgY3NyUm9hbVByb2Nlc3NXbVN0YXR1c0NoYW5nZUNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICk7Cit2b2lkIGNzclJlaW5pdFJvYW1DbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOyAKK3ZvaWQgY3NyUmVpbml0V21TdGF0dXNDaGFuZ2VDbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOwordm9pZCBjc3JSZWluaXRTZXRLZXlDbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOwordm9pZCBjc3JSZWluaXRSZW1vdmVLZXlDbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOworZUhhbFN0YXR1cyBjc3JSb2FtUHJvY2Vzc1NldEtleUNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICk7CitlSGFsU3RhdHVzIGNzclJvYW1Qcm9jZXNzUmVtb3ZlS2V5Q29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQgKTsKK3ZvaWQgY3NyUmVsZWFzZUNvbW1hbmRTZXRLZXkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOwordm9pZCBjc3JSZWxlYXNlQ29tbWFuZFJlbW92ZUtleSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCk7CisvL2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlU2V0S2V5Q29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVNldEtleSAqcFNldEtleSwgdEFOSV9VMzIgcm9hbUlkICk7CitlSGFsU3RhdHVzIGNzclJvYW1Jc3N1ZVJlbW92ZUtleUNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1SZW1vdmVLZXkgKnBSZW1vdmVLZXksIHRBTklfVTMyIHJvYW1JZCApOworZUhhbFN0YXR1cyBjc3JJc0Z1bGxQb3dlck5lZWRlZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIHRSZXF1ZXN0RnVsbFBvd2VyUmVhc29uICpwUmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9CT09MRUFOICpwZk5lZWRQb3dlcik7Cit2b2lkIGNzckFib3J0Q29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIHRBTklfQk9PTEVBTiBmU3RvcHBpbmcgKTsKKworZUhhbFN0YXR1cyBzbWVfQWNxdWlyZUdsb2JhbExvY2soIHRTbWVTdHJ1Y3QgKnBzU21lKTsKK2VIYWxTdGF0dXMgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCB0U21lU3RydWN0ICpwc1NtZSk7CisKKworZUhhbFN0YXR1cyBjc3JQcm9jZXNzQWRkU3RhU2Vzc2lvbkNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICk7CitlSGFsU3RhdHVzIGNzclByb2Nlc3NBZGRTdGFTZXNzaW9uUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwTXNnKTsKK2VIYWxTdGF0dXMgY3NyUHJvY2Vzc0RlbFN0YVNlc3Npb25Db21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCApOworZUhhbFN0YXR1cyBjc3JQcm9jZXNzRGVsU3RhU2Vzc2lvblJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcE1zZyk7CisKKyNpZmRlZiBXTEFOX05TX09GRkxPQUQKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBwbWNTZXROU09mZmxvYWQKKyAgICBcYnJpZWYgIFNldCB0aGUgaG9zdCBvZmZsb2FkIGZlYXR1cmUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJlcXVlc3QgLSBQb2ludGVyIHRvIHRoZSBvZmZsb2FkIHJlcXVlc3QuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFICBDYW5ub3Qgc2V0IHRoZSBvZmZsb2FkLgorICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAgUmVxdWVzdCBhY2NlcHRlZC4gCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBtY1NldE5TT2ZmbG9hZCAodEhhbEhhbmRsZSBoSGFsLCB0cFNpckhvc3RPZmZsb2FkUmVxIHBSZXF1ZXN0KTsKKyNlbmRpZiAvL1dMQU5fTlNfT0ZGTE9BRAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCitlSGFsU3RhdHVzIHBtY1NldFByZWZlcnJlZE5ldHdvcmtMaXN0KHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJQTk9TY2FuUmVxIHBSZXF1ZXN0LCB0QU5JX1U4IHNlc3Npb25JZCwgcHJlZmVycmVkTmV0d29ya0ZvdW5kSW5kQ2FsbGJhY2sgY2FsbGJhY2tSb3V0aW5lLCAgdm9pZCAqY2FsbGJhY2tDb250ZXh0KTsKK2VIYWxTdGF0dXMgcG1jVXBkYXRlU2NhblBhcmFtcyh0SGFsSGFuZGxlIGhIYWwsIHRDc3JDb25maWcgKnBSZXF1ZXN0LCB0Q3NyQ2hhbm5lbCAqcENoYW5uZWxMaXN0LCB0QU5JX1U4IGIxMWRSZXNvbHZlZCk7CitlSGFsU3RhdHVzIHBtY1NldFJzc2lGaWx0ZXIodEhhbEhhbmRsZSBoSGFsLCAgIHZfVThfdCAgICAgICAgcnNzaVRocmVzaG9sZCk7CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX1NDQU5fUE5PCitlSGFsU3RhdHVzIHBtY1NldFBvd2VyUGFyYW1zKHRIYWxIYW5kbGUgaEhhbCwgICB0U2lyU2V0UG93ZXJQYXJhbXNSZXEqICBwd1BhcmFtcyk7CisKK3RBTklfQk9PTEVBTiBjc3JSb2FtR2V0Q29uY3VycmVuY3lDb25uZWN0U3RhdHVzRm9yQm1wcyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKyNlbmRpZiAvLyNpZiAhZGVmaW5lZCggX19TTUVJTlNJREVfSCApCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9pbmMvc21lSW50ZXJuYWwuaCBiL0NPUkUvU01FL2luYy9zbWVJbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjdkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9pbmMvc21lSW50ZXJuYWwuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19TTUVJTlRFUk5BTF9IICkKKyNkZWZpbmUgX19TTUVJTlRFUk5BTF9ICisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHNtZUludGVybmFsLmgKKyAgCisgIFxicmllZiBwcm90b3R5cGUgZm9yIFNNRSBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGFuZCBBUElzIHVzZWQgZm9yIFNNRSBhbmQgTUFDCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAidm9zX3N0YXR1cy5oIgorI2luY2x1ZGUgInZvc19sb2NrLmgiCisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisjaW5jbHVkZSAidm9zX21lbW9yeS5oIgorI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgImNzckxpbmtMaXN0LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vIE1hc2sgY2FuIGJlIG9ubHkgaGF2ZSBvbmUgYml0IHNldAordHlwZWRlZiBlbnVtIGVTbWVDb21tYW5kVHlwZSAKK3sKKyAgICBlU21lTm9Db21tYW5kID0gMCwgCisgICAgZVNtZURyb3BDb21tYW5kLAorICAgIC8vQ1NSCisgICAgZVNtZUNzckNvbW1hbmRNYXNrID0gMHgxMDAwMCwgICAvL3RoaXMgaXMgbm90IGEgY29tbWFuZCwgaXQgaXMgdG8gaWRlbnRpZnkgdGhpcyBpcyBhIENTUiBjb21tYW5kCisgICAgZVNtZUNvbW1hbmRTY2FuLAorICAgIGVTbWVDb21tYW5kUm9hbSwgCisgICAgZVNtZUNvbW1hbmRXbVN0YXR1c0NoYW5nZSwgCisgICAgZVNtZUNvbW1hbmRTZXRLZXksCisgICAgZVNtZUNvbW1hbmRSZW1vdmVLZXksCisgICAgZVNtZUNvbW1hbmRBZGRTdGFTZXNzaW9uLAorICAgIGVTbWVDb21tYW5kRGVsU3RhU2Vzc2lvbiwKKyAgICAvL1BNQworICAgIGVTbWVQbWNDb21tYW5kTWFzayA9IDB4MjAwMDAsIC8vVG8gaWRlbnRpZnkgUE1DIGNvbW1hbmRzCisgICAgZVNtZUNvbW1hbmRFbnRlckltcHMsCisgICAgZVNtZUNvbW1hbmRFeGl0SW1wcywKKyAgICBlU21lQ29tbWFuZEVudGVyQm1wcywKKyAgICBlU21lQ29tbWFuZEV4aXRCbXBzLAorICAgIGVTbWVDb21tYW5kRW50ZXJVYXBzZCwKKyAgICBlU21lQ29tbWFuZEV4aXRVYXBzZCwKKyAgICBlU21lQ29tbWFuZEVudGVyV293bCwKKyAgICBlU21lQ29tbWFuZEV4aXRXb3dsLAorICAgIGVTbWVDb21tYW5kRW50ZXJTdGFuZGJ5LAorICAgIC8vUU9TCisgICAgZVNtZVFvc0NvbW1hbmRNYXNrID0gMHg0MDAwMCwgIC8vVG8gaWRlbnRpZnkgUW9zIGNvbW1hbmRzCisgICAgZVNtZUNvbW1hbmRBZGRUcywKKyAgICBlU21lQ29tbWFuZERlbFRzLAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICBlU21lQ29tbWFuZFJlbWFpbk9uQ2hhbm5lbCwKKyAgICBlU21lQ29tbWFuZE5vQVVwZGF0ZSwKKyNlbmRpZgorfSBlU21lQ29tbWFuZFR5cGU7CisKKwordHlwZWRlZiBlbnVtIGVTbWVTdGF0ZQoreworICAgIFNNRV9TVEFURV9TVE9QLAorICAgIFNNRV9TVEFURV9TVEFSVCwKKyAgICBTTUVfU1RBVEVfUkVBRFksCit9IGVTbWVTdGF0ZTsKKworCisjZGVmaW5lIFNNRV9JU19TVEFSVChwTWFjKSAgKFNNRV9TVEFURV9TVE9QICE9IChwTWFjKS0+c21lLnN0YXRlKQorI2RlZmluZSBTTUVfSVNfUkVBRFkocE1hYykgIChTTUVfU1RBVEVfUkVBRFkgPT0gKHBNYWMpLT5zbWUuc3RhdGUpCisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnU21lU3RydWN0Cit7CisgICAgZVNtZVN0YXRlIHN0YXRlOworICAgIHZvc19sb2NrX3QgbGtTbWVHbG9iYWxMb2NrOworICAgIHRBTklfVTMyIHRvdGFsU21lQ21kOworICAgIHZvaWQgKnBTbWVDbWRCdWZBZGRyOworICAgIHREYmxMaW5rTGlzdCBzbWVDbWRBY3RpdmVMaXN0OworICAgIHREYmxMaW5rTGlzdCBzbWVDbWRQZW5kaW5nTGlzdDsKKyAgICB0RGJsTGlua0xpc3Qgc21lQ21kRnJlZUxpc3Q7ICAgLy9wcmVhbGxvY2F0ZWQgcm9hbSBjbWQgbGlzdAorICAgIHZvaWQgKCpwVHhQZXJIaXRDYWxsYmFjaykgKHZvaWQgKnBDYWxsYmFja0NvbnRleHQpOyAvKiBjYWxsYmFjayBmb3IgVHggUEVSIGhpdCB0byBIREQgKi8gCisgICAgdm9pZCAqcFR4UGVySGl0Q2JDb250ZXh0OworfSB0U21lU3RydWN0LCAqdHBTbWVTdHJ1Y3Q7CisKKworI2VuZGlmIC8vI2lmICFkZWZpbmVkKCBfX1NNRUlOVEVSTkFMX0ggKQpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvaW5jL3NtZVFvc0ludGVybmFsLmggYi9DT1JFL1NNRS9pbmMvc21lUW9zSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE4YWYxCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvaW5jL3NtZVFvc0ludGVybmFsLmgKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisKKyNpZiAhZGVmaW5lZCggX19TTUVRT1NJTlRFUk5BTF9IICkKKyNkZWZpbmUgX19TTUVRT1NJTlRFUk5BTF9ICisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHNtZVFvc0ludGVybmFsLmgKKyAgCisgIFxicmllZiBwcm90b3R5cGUgZm9yIFNNRSBRb1MgQVBJcworICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInZvc19sb2NrLmgiCisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisjaW5jbHVkZSAidm9zX21lbW9yeS5oIgorI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgInNpckFwaS5oIgorI2luY2x1ZGUgInNtZV9Rb3NBcGkuaCIKKyNpbmNsdWRlICJzbWVJbnRlcm5hbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTTUVfUU9TX0FQX1NVUFBPUlRTX0FQU0QgICAgICAgICAweDgwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBFbnVtZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBFRENBIEFjY2VzcyBDYXRlZ29yaWVzOgorICAgQmFzZWQgb24gQUMgdG8gQUNJIG1hcHBpbmcgaW4gODAyLjExZSBzcGVjIChpZGVudGljYWwgdG8gV01NKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAgU01FX1FPU19FRENBX0FDX0JFID0gMCwgIC8qIEJlc3QgZWZmb3J0IGFjY2VzcyBjYXRlZ29yeSAgICAgICAgICAgICAqLworICAgU01FX1FPU19FRENBX0FDX0JLID0gMSwgIC8qIEJhY2tncm91bmQgYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAqLworICAgU01FX1FPU19FRENBX0FDX1ZJID0gMiwgIC8qIFZpZGVvIGFjY2VzcyBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAqLworICAgU01FX1FPU19FRENBX0FDX1ZPID0gMywgIC8qIFZvaWNlIGFjY2VzcyBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAqLworICAKKyAgIFNNRV9RT1NfRURDQV9BQ19NQVgKK30gc21lX1Fvc0VkY2FBY1R5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIENTUiBldmVudCBpbmRpY2F0aW9uIHR5cGVzIHRoYXQgd291bGQgYmUgcmVwb3J0ZWQgCisgICBieSBDU1IKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgIFNNRV9RT1NfQ1NSX0pPSU5fUkVRID0gMCwKKyAgIFNNRV9RT1NfQ1NSX0FTU09DX0NPTVBMRVRFLAorICAgU01FX1FPU19DU1JfUkVBU1NPQ19SRVEsCisgICBTTUVfUU9TX0NTUl9SRUFTU09DX0NPTVBMRVRFLAorICAgU01FX1FPU19DU1JfUkVBU1NPQ19GQUlMVVJFLAorICAgU01FX1FPU19DU1JfRElTQ09OTkVDVF9SRVEsCisgICBTTUVfUU9TX0NTUl9ESVNDT05ORUNUX0lORCwKKyAgIFNNRV9RT1NfQ1NSX0hBTkRPRkZfQVNTT0NfUkVRLAorICAgU01FX1FPU19DU1JfSEFORE9GRl9DT01QTEVURSwKKyAgIFNNRV9RT1NfQ1NSX0hBTkRPRkZfRkFJTFVSRSwKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgU01FX1FPU19DU1JfUFJFQVVUSF9TVUNDRVNTX0lORCwKKyAgIFNNRV9RT1NfQ1NSX1NFVF9LRVlfU1VDQ0VTU19JTkQsCisjZW5kaWYKK31zbWVfUW9zQ3NyRXZlbnRJbmRUeXBlOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAordHlwZWRlZiBlbnVtCit7CisgICBTTUVfUU9TX0RJQUdfQUREVFNfUkVRID0gMCwKKyAgIFNNRV9RT1NfRElBR19BRERUU19SU1AsCisgICBTTUVfUU9TX0RJQUdfREVMVFMKKworfXNtZV9Rb3NEaWFnUW9zRXZlbnRTdWJ0eXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgIFNNRV9RT1NfRElBR19BRERUU19BRE1JU1NJT05fQUNDRVBURUQgPSAwLAorICAgU01FX1FPU19ESUFHX0FERFRTX0lOVkFMSURfUEFSQU1TLAorICAgU01FX1FPU19ESUFHX0FERFRTX1JFU0VSVkVELAorICAgU01FX1FPU19ESUFHX0FERFRTX1JFRlVTRUQsCisgICBTTUVfUU9TX0RJQUdfVVNFUl9SRVFVRVNURUQsCisgICBTTUVfUU9TX0RJQUdfREVMVFNfSU5EX0ZST01fQVAsCisKK31zbWVfUW9zRGlhZ1Fvc0V2ZW50UmVhc29uQ29kZTsKKworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUaGUgYXNzb2NpYXRpb24gaW5mb3JtYXRpb24gc3RydWN0dXJlIHRvIGJlIHBhc3NlZCBieSBDU1IgYWZ0ZXIgYXNzb2Mgb3IgCisgICAgcmVhc3NvYyBpcyBkb25lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sgCisgICB0U2lyQnNzRGVzY3JpcHRpb24gICAgICAgICAgICAqcEJzc0Rlc2M7CisgICB0Q3NyUm9hbVByb2ZpbGUgICAgICAgICAgICAgICAqcFByb2ZpbGU7Cit9IHNtZV9Rb3NBc3NvY0luZm87CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgQVBJcyBmb3IgQ1NSIC0gSW50ZXJuYWwgdG8gU01FCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGJyaWVmIHNtZV9Rb3NPcGVuKCkgLSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgQVBJIGNhbGwgdG8gCisgICAgU01FIFFvUyBtb2R1bGUuCisKKyAgICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NPcGVuKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxicmllZiBzbWVfUW9zQ2xvc2UoKSAtIFRvIGNsb3NlIGRvd24gU01FIFFvUyBtb2R1bGUuIFRoZXJlIHNob3VsZCBub3QgYmUgCisgICAgYW55IEFQSSBjYWxsIGludG8gdGhpcyBtb2R1bGUgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHVudGlsIGFub3RoZXIKKyAgICBjYWxsIG9mIHNtZV9Rb3NPcGVuLgorCisgICAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgICAgCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zQ2xvc2UodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NTZXRQYXJhbXMoKSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBIREQgdG8gcHJvdmlkZSB0aGUgCisgICBkZWZhdWx0IFRTUEVDIHBhcmFtcyB0byBTTUUuCisgIAorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHBhcmFtIHBRb1NJbmZvIC0gUG9pbnRlciB0byBzbWVfUW9zV21tVHNwZWNJbmZvIHdoaWNoIGNvbnRhaW5zIHRoZSBXTU0gVFNQRUMKKyAgICAgICAgICAgICAgICAgICAgcmVsYXRlZCBpbmZvIHBlciBBQyBhcyBkZWZpbmVkIGFib3ZlLCBwcm92aWRlZCBieSBIREQKKyAgCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFNldHBhcmFtIGlzIHN1Y2Nlc3NmdWwuCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1NldFBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCBzbWVfUW9zV21tVHNwZWNJbmZvICogcFFvU0luZm8pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zTXNnUHJvY2Vzc29yKCkgLSBzbWVfUHJvY2Vzc01zZygpIGNhbGxzIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSAKKyAgbWVzc2FnZXMgdGhhdCBhcmUgaGFuZGxlZCBieSBTTUUgUW9TIG1vZHVsZS4KKyAgCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICBccGFyYW0gbXNnX3R5cGUgLSB0aGUgdHlwZSBvZiBtc2cgcGFzc2VkIGJ5IFBFIGFzIGRlZmluZWQgaW4gd25pQXBpLmgKKyAgXHBhcmFtIHBNc2dCdWYgLSBhIHBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCBtYXBzIHRvIHZhcmlvdXMgc3RydWN0dXJlcyBiYXNlIAorICAgICAgICAgICAgICAgICAgIG9uIHRoZSBtZXNzYWdlIHR5cGUuCisgICAgICAgICAgICAgICAgICAgVGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGNhbiBhbHdheXMgbWFwIHRvIHRTaXJTbWVSc3AuCisgIAorICBccmV0dXJuIGVIYWxTdGF0dXMuCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc01zZ1Byb2Nlc3NvciggdHBBbmlTaXJHbG9iYWwgcE1hYywgIHZfVTE2X3QgbXNnX3R5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwTXNnQnVmKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbCBBUElzIGZvciBDU1IKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1ZhbGlkYXRlUGFyYW1zKCkgLSBUaGUgU01FIFFvUyBBUEkgZXhwb3NlZCB0byBDU1IgdG8gdmFsaWRhdGUgQVAgCisgIGNhcGFiaWxpdGllcyByZWdhcmRpbmcgUW9TIHN1cHBvcnQgJiBhbnkgb3RoZXIgUW9TIHBhcmFtZXRlciB2YWxpZGF0aW9uLgorICAKKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgIFxwYXJhbSBwQnNzRGVzYyAtIFBvaW50ZXIgdG8gdGhlIEJTUyBEZXNjcmlwdG9yIGluZm9ybWF0aW9uIHBhc3NlZCBkb3duIGJ5IAorICAgICAgICAgICAgICAgICAgICBDU1IgdG8gUEUgd2hpbGUgaXNzdWluZyB0aGUgSm9pbiByZXF1ZXN0CisgIAorICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBWYWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwKKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zVmFsaWRhdGVQYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc0NzckV2ZW50SW5kKCkgLSBUaGUgUW9TIHN1Yi1tb2R1bGUgaW4gU01FIGV4cGVjdHMgbm90aWZpY2F0aW9ucyAKKyAgZnJvbSBDU1Igd2hlbiBjZXJ0YWluIGV2ZW50cyBvY2N1ciBhcyBtZW50aW9uZWQgaW4gc21lX1Fvc0NzckV2ZW50SW5kVHlwZS4KKworICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHBhcmFtIGluZCAtIFRoZSBldmVudCBvY2N1cnJlZCBvZiB0eXBlIHNtZV9Rb3NDc3JFdmVudEluZFR5cGUuCisgIFxwYXJhbSBwRXZlbnRfaW5mbyAtIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGV2ZW50CisgIAorICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zQ3NyRXZlbnRJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zQ3NyRXZlbnRJbmRUeXBlIGluZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwRXZlbnRfaW5mbyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NHZXRBQ01NYXNrKCkgLSBUaGUgUW9TIHN1Yi1tb2R1bGUgQVBJIHRvIGZpbmQgb3V0IG9uIHdoaWNoIEFDcworICBBUCBtYW5kYXRlcyBBZG1pc3Npb24gQ29udHJvbCAoQUNNID0gMSkKKworICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHBhcmFtIHBTaXJCc3NEZXNjIC0gVGhlIGV2ZW50IG9jY3VycmVkIG9mIHR5cGUgc21lX1Fvc0NzckV2ZW50SW5kVHlwZS4KKyAgXHBhcmFtIHBJZXMgLSB0aGUgcGFyc2VkIElFIGZvciBwU2lyQnNzRGVzYy4gVGhpcyBjYW4gYmUgTlVMTC4KKworICAKKyAgXHJldHVybiBhIGJpdCBtYXNrIGluZGljYXRpbmcgZm9yIHdoaWNoIEFDcyBBUCBoYXMgQUNNIHNldCB0byAxCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVThfdCBzbWVfUW9zR2V0QUNNTWFzayh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzKTsKKworLyoKKyAgc21lX1Fvc1RyaWdnZXJVYXBzZENoYW5nZQorICAgICAgICBJdCB0cmlnZ2VyIGEgY2hhbmdlIG9uIFVBUFNEIChlaXRoZXIgZGlzYWJsZS9lbmFibGUgVUFQU0QpIG9uIGN1cnJlbnQgUW9TIGZsb3dzCisqLworc21lX1Fvc1N0YXR1c1R5cGUgc21lX1Fvc1RyaWdnZXJVYXBzZENoYW5nZSggdHBBbmlTaXJHbG9iYWwgcE1hYyApOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAordl9VOF90IHNtZV9Rb3NDQ3hSZXRyaWV2ZVRzcGVjSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLCB0VHNwZWNJbmZvICpwVHNwZWNJbmZvKTsKKworI2VuZGlmCisKKyNlbmRpZiAvLyNpZiAhZGVmaW5lZCggX19TTUVRT1NJTlRFUk5BTF9IICkKZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9zbWVScm1JbnRlcm5hbC5oIGIvQ09SRS9TTUUvaW5jL3NtZVJybUludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyYTVlMAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL2luYy9zbWVScm1JbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqICovCisjaWYgIWRlZmluZWQoIF9fU01FUlJNSU5URVJOQUxfSCApCisjZGVmaW5lIF9fU01FUlJNSU5URVJOQUxfSAorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBzbWVScm1JbnRlcm5hbC5oCisgIAorICBcYnJpZWYgcHJvdG90eXBlIGZvciBTTUUgUlJNIEFQSXMKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ2b3NfbG9jay5oIgorI2luY2x1ZGUgInZvc190cmFjZS5oIgorI2luY2x1ZGUgInZvc19tZW1vcnkuaCIKKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJwYWxUaW1lci5oIgorI2luY2x1ZGUgInJybUdsb2JhbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc1JybUNvbmZpZ1BhcmFtCit7CisgICB0QU5JX1U4IHJybUVuYWJsZWQ7CisgICB0QU5JX1U4IG1heFJhbmRuSW50ZXJ2YWw7Cit9dFJybUNvbmZpZ1BhcmFtLCAqdHBScm1Db25maWdQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1JybU5laWdoYm9yUmVwb3J0RGVzYworeworICAgdExpc3RFbGVtICAgIExpc3Q7CisgICB0U2lyTmVpZ2hib3JCc3NEZXNjcmlwdGlvbiAgICpwTmVpZ2hib3JCc3NEZXNjcmlwdGlvbjsKKyAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICAgcm9hbVNjb3JlOworfSB0UnJtTmVpZ2hib3JSZXBvcnREZXNjLCAqdHBScm1OZWlnaGJvclJlcG9ydERlc2M7CisKKwordHlwZWRlZiB2b2lkICgqTmVpZ2hib3JSZXBvcnRSc3BDYWxsYmFjaykgKHZvaWQgKmNvbnRleHQsIFZPU19TVEFUVVMgdm9zU3RhdHVzKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc1JybU5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICB0aW1lb3V0OyAgLy9pbiBtcy4uIG1pbiB2YWx1ZSBpcyAxMCAoMTBtcykKKyAgICBOZWlnaGJvclJlcG9ydFJzcENhbGxiYWNrIG5laWdoYm9yUnNwQ2FsbGJhY2s7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqbmVpZ2hib3JSc3BDYWxsYmFja0NvbnRleHQ7Cit9IHRScm1OZWlnaGJvclJzcENhbGxiYWNrSW5mbywgKnRwUnJtTmVpZ2hib3JSc3BDYWxsYmFja0luZm87CisKK3R5cGVkZWYgc3RydWN0IHNScm1OZWlnaGJvclJlcXVlc3RDb250cm9sSW5mbworeworICAgIHRBTklfQk9PTEVBTiAgICBpc05laWdoYm9yUnNwUGVuZGluZzsgICAvL1RvIGNoZWNrIHdoZXRoZXIgYSBuZWlnaGJvciByZXEgaXMgYWxyZWFkeSBzZW50IGFuZCByZXNwb25zZSBwZW5kaW5nCisgICAgdm9zX3RpbWVyX3QgICAgIG5laWdoYm9yUnNwV2FpdFRpbWVyOworICAgIHRScm1OZWlnaGJvclJzcENhbGxiYWNrSW5mbyBuZWlnaGJvclJzcENhbGxiYWNrSW5mbzsKK30gdFJybU5laWdoYm9yUmVxdWVzdENvbnRyb2xJbmZvLCAqdHBScm1OZWlnaGJvclJlcXVlc3RDb250cm9sSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc1JybVNNRUNvbnRleHQKK3sKKyAgIHRBTklfVTE2IHRva2VuOworICAgdENzckJzc2lkIHNlc3Npb25Cc3NJZDsKKyAgIHRBTklfVTggcmVnQ2xhc3M7CisgICB0Q3NyQ2hhbm5lbEluZm8gY2hhbm5lbExpc3Q7IC8vbGlzdCBvZiBhbGwgY2hhbm5lbHMgdG8gYmUgbWVhc3VyZWQuCisgICB0QU5JX1U4IGN1cnJlbnRJbmRleDsKKyAgIHRBbmlTU0lEIHNzSWQ7ICAvL1NTSUQgdXNlZCBpbiB0aGUgbWVhc3VyaW5nIGJlYWNvbiByZXBvcnQuCisgICB0U2lyTWFjQWRkciBic3NJZDsgLy9ic3NpZCB1c2VkIGZvciBiZWFjb24gcmVwb3J0IG1lYXN1cmVtZW50LgorICAgdEFOSV9VMTYgcmFuZG5JbnR2bDsgLy9SYW5kb21pemF0aW9uIGludGVydmFsIHRvIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBtZWFzdXJlbWVudHMuCisgICB0QU5JX1UxNiBkdXJhdGlvbjsKKyAgIHRBTklfVTE2IG1lYXNNb2RlOworICAgdFJybUNvbmZpZ1BhcmFtIHJybUNvbmZpZzsKKyAgIHZvc190aW1lcl90IEl0ZXJNZWFzVGltZXI7CisgICB0RGJsTGlua0xpc3QgbmVpZ2hib3JSZXBvcnRDYWNoZTsKKyAgIHRScm1OZWlnaGJvclJlcXVlc3RDb250cm9sSW5mbyBuZWlnaGJvclJlcUNvbnRyb2xJbmZvOworfXRScm1TTUVDb250ZXh0LCAqdHBScm1TTUVDb250ZXh0OyAKKwordHlwZWRlZiBzdHJ1Y3Qgc1JybU5laWdoYm9yUmVxCit7CisgICB0QU5JX1U4IG5vX3NzaWQ7CisgICB0U2lyTWFjU1NpZCBzc2lkOworfXRScm1OZWlnaGJvclJlcSwgKnRwUnJtTmVpZ2hib3JSZXE7CisKKyNlbmRpZiAvLyNpZiAhZGVmaW5lZCggX19TTUVSUk1JTlRFUk5BTF9IICkKZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9zbWVfQXBpLmggYi9DT1JFL1NNRS9pbmMvc21lX0FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNGQzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9pbmMvc21lX0FwaS5oCkBAIC0wLDAgKzEsMjA4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19TTUVfQVBJX0ggKQorI2RlZmluZSBfX1NNRV9BUElfSAorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBzbWVBcGkuaAorICAKKyAgXGJyaWVmIHByb3RvdHlwZSBmb3IgU01FIEFQSXMKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJjY21BcGkuaCIKKyNpbmNsdWRlICJjc3JBcGkuaCIKKyNpbmNsdWRlICJwbWNBcGkuaCIKKyNpbmNsdWRlICJ2b3NfbXEuaCIKKyNpbmNsdWRlICJ2b3NfbG9jay5oIgorI2luY2x1ZGUgImhhbFR5cGVzLmgiCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAiYnRjQXBpLmgiCisjaW5jbHVkZSAidm9zX252aXRlbS5oIgorI2luY2x1ZGUgInAycF9BcGkuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsRncuaCIKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyNpbmNsdWRlICJzbWVScm1JbnRlcm5hbC5oIgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgU01FX1NVTU1BUllfU1RBVFMgICAgICAgICAxCisjZGVmaW5lIFNNRV9HTE9CQUxfQ0xBU1NBX1NUQVRTICAgMgorI2RlZmluZSBTTUVfR0xPQkFMX0NMQVNTQl9TVEFUUyAgIDQKKyNkZWZpbmUgU01FX0dMT0JBTF9DTEFTU0NfU1RBVFMgICA4CisjZGVmaW5lIFNNRV9HTE9CQUxfQ0xBU1NEX1NUQVRTICAxNgorI2RlZmluZSBTTUVfUEVSX1NUQV9TVEFUUyAgICAgICAgMzIKKworI2RlZmluZSBTTUVfSU5WQUxJRF9DT1VOVFJZX0NPREUgIlhYIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgX3NtZUNvbmZpZ1BhcmFtcworeworICAgdENzckNvbmZpZ1BhcmFtICBjc3JDb25maWc7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICB0UnJtQ29uZmlnUGFyYW0gIHJybUNvbmZpZzsKKyNlbmRpZgorI2lmIGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgIHRBTklfVTggICBpc0NjeEluaUZlYXR1cmVFbmFibGVkOworI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisgICB0UDJQQ29uZmlnUGFyYW0gIHAycENvbmZpZzsKKyNlbmRpZgorI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICB0QU5JX1U4ICAgaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQ7CisjZW5kaWYKK30gdFNtZUNvbmZpZ1BhcmFtcywgKnRwU21lQ29uZmlnUGFyYW1zOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHNtZV9PcGVuKCkgLSBJbml0aWFsemUgYWxsIFNNRSBtb2R1bGVzIGFuZCBwdXQgdGhlbSBhdCBpZGxlIHN0YXRlCisgIAorICBUaGUgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgZWFjaCBtb2R1bGUgaW5zaWRlIFNNRSwgUE1DLCBDQ00sIENTUiwgZXRjLiAuIFVwb24gCisgIHN1Y2Nlc3NmdWxseSByZXR1cm4sIGFsbCBtb2R1bGVzIGFyZSBhdCBpZGxlIHN0YXRlIHJlYWR5IHRvIHN0YXJ0LgorCisgIHNtZU9wZW4gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBTTUUgQVBJcyBjYW4gYmUgaW52b2x2ZWQuIAorICBzbWVPcGVuIG11c3QgYmUgY2FsbGVkIGFmdGVyIG1hY09wZW4uCisgIAorICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFNNRSBpcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQuCisgIAorICAgICAgICAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIGJlIGluaXRpYWxpemVkICAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9PcGVuKHRIYWxIYW5kbGUgaEhhbCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBzbWVfQ2xvc2UoKSAtIFJlbGVhc2UgYWxsIFNNRSBtb2R1bGVzIGFuZCB0aGVpciByZXNvdXJjZXMuCisgIAorICBUaGUgZnVuY3Rpb24gcmVsZWFzZSBlYWNoIG1vZHVsZSBpbiBTTUUsIFBNQywgQ0NNLCBDU1IsIGV0Yy4gLiBVcG9uIAorICByZXR1cm4sIGFsbCBtb2R1bGVzIGFyZSBhdCBjbG9zZWQgc3RhdGUuCisKKyAgTm8gU01FIEFQSXMgY2FuIGJlIGludm9sdmVkIGFmdGVyIHNtZV9DbG9zZSBleGNlcHQgc21lX09wZW4uIAorICBzbWVfQ2xvc2UgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIG1hY0Nsb3NlLgorICAKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIAorICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgaXMgc3VjY2Vzc2Z1bGx5IGNsb3NlLgorICAKKyAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byBiZSBjbG9zZWQgYnV0IGNhbGxlciBzdGlsbCBjYW5ub3QKKyAgICAgICAgICBjYWxsIGFueSBvdGhlciBTTUUgZnVuY3Rpb25zIGV4Y2VwdCBzbWVPcGVuLgorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0Nsb3NlKHRIYWxIYW5kbGUgaEhhbCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBzbWVfU3RhcnQoKSAtIFB1dCBhbGwgU01FIG1vZHVsZXMgYXQgcmVhZHkgc3RhdGUuCisgIAorICBUaGUgZnVuY3Rpb24gc3RhcnRzIGVhY2ggbW9kdWxlIGluIFNNRSwgUE1DLCBDQ00sIENTUiwgZXRjLiAuIFVwb24gCisgIHN1Y2Nlc3NmdWxseSByZXR1cm4sIGFsbCBtb2R1bGVzIGFyZSByZWFkeSB0byBydW4uCisKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIAorICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgaXMgcmVhZHkuCisgIAorICAgICAgICAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIHN0YXJ0LiAgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU3RhcnQodEhhbEhhbmRsZSBoSGFsKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHNtZV9TdG9wKCkgLSBTdG9wIGFsbCBTTUUgbW9kdWxlcyBhbmQgcHV0IHRoZW0gYXQgaWRsZSBzdGF0ZQorICAKKyAgVGhlIGZ1bmN0aW9uIHN0b3BzIGVhY2ggbW9kdWxlIGluIFNNRSwgUE1DLCBDQ00sIENTUiwgZXRjLiAuIFVwb24gCisgIHJldHVybiwgYWxsIG1vZHVsZXMgYXJlIGF0IGlkbGUgc3RhdGUgcmVhZHkgdG8gc3RhcnQuCisKKyAgCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgIFxwYXJhbSBwbWNGbGFnIC0gVGhlIGZsYWcgdGVsbHMgU01FIGlmIHdlIHdhbnQgdG8gc3RvcCBQTUMgb3Igbm90CisgIAorICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgaXMgc3RvcHBlZC4KKyAgCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gc3RvcCBidXQgY2FsbGVyIHNob3VsZCBzdGlsbCBjb25zaWRlciAKKyAgICAgICAgICBTTUUgaXMgc3RvcHBlZC4KKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TdG9wKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9CT09MRUFOIHBtY0ZsYWcpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBzbWVfT3BlblNlc3Npb24oKSAtIE9wZW4gYSBzZXNzaW9uIGZvciBzY2FuL3JvYW0gb3BlcmF0aW9uLiAKKyAgCisgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBBUEkuCisKKyAgCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICBccGFyYW0gY2FsbGJhY2sgLSBBIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIGNhbGxlciBzcGVjaWZpZXMgZm9yIHJvYW0vY29ubmVjdCBzdGF0dXMgaW5kaWNhdGlvbgorICBccGFyYW0gcENvbnRleHQgLSBUaGUgY29udGV4dCBwYXNzZWQgd2l0aCBjYWxsYmFjaworICBccGFyYW0gcFNlbGZNYWNBZGRyIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZmlsbGVkIHdpdGggc2VsZiBNQUMgYWRkcmVzcyAoNiBieXRlcykKKyAgXHBhcmFtIHBiU2Vzc2lvbklkIC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIGZvciByZXR1cm5lZCBzZXNzaW9uIElECisgIAorICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBzZXNzaW9uIGlzIG9wZW5lZC4gc2Vzc2lvbklkIHJldHVybmVkLgorICAKKyAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byBvcGVuIHRoZSBzZXNzaW9uLiAgCisgICAgICAgICAgZUhBTF9TVEFUVVNfUkVTT1VSQ0VTIC0gbm8gbW9yZSBzZXNzaW9uIGF2YWlsYWJsZS4KKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9PcGVuU2Vzc2lvbih0SGFsSGFuZGxlIGhIYWwsIGNzclJvYW1Db21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwU2VsZk1hY0FkZHIsIHRBTklfVTggKnBiU2Vzc2lvbklkKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgc21lX0Nsb3NlU2Vzc2lvbigpIC0gT3BlbiBhIHNlc3Npb24gZm9yIHNjYW4vcm9hbSBvcGVyYXRpb24uIAorICAKKyAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKworICAKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgXHBhcmFtIHNlc3Npb25JZCAtIEEgcHJldmlvdXMgb3BlbmVkIHNlc3Npb24ncyBJRC4KKyAgCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIHNlc3Npb24gaXMgY2xvc2VkLiAKKyAgCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gb3BlbiB0aGUgc2Vzc2lvbi4gIAorICAgICAgICAgIGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSIC0gc2Vzc2lvbiBpcyBub3Qgb3BlbmVkLiAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9DbG9zZVNlc3Npb24odEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtU2Vzc2lvbkNsb3NlQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKnBDb250ZXh0KTsKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBzbWVfVXBkYXRlQ29uZmlnKCkgLSBDaGFuZ2UgY29uZmlndXJhdGlvbnMgZm9yIGFsbCBTTUUgbW9kdWVscworICAKKyAgVGhlIGZ1bmN0aW9uIHVwZGF0ZXMgc29tZSBjb25maWd1cmF0aW9uIGZvciBtb2R1bGVzIGluIFNNRSwgQ0NNLCBDU1IsIGV0YworICBkdXJpbmcgU01FcyBjbG9zZSAtPiBvcGVuIHNlcXVlbmNlLgorICAgCisgIE1vZHVsZXMgaW5zaWRlIFNNRSBhcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gYXQgdGhlIG5leHQgdHJhbnNhY3Rpb24uCisKKyAgCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICBcUGFyYW0gcFNtZUNvbmZpZ1BhcmFtcyAtIGEgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIAorICB0eXBlZGVmIHN0cnVjdCBfc21lQ29uZmlnUGFyYW1zLgorICAKKyAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSB0aGUgY29uZmlnIHBhcmFtZXRlcnMgc3VjY2Vzc2Z1bGx5LgorICAKKyAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgdGhlIGNvbmZpZyBwYXJhbWV0ZXJzLgorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1VwZGF0ZUNvbmZpZyh0SGFsSGFuZGxlIGhIYWwsIHRwU21lQ29uZmlnUGFyYW1zIHBTbWVDb25maWdQYXJhbXMpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHNtZV9VcGRhdGVDaGFubmVsQ29uZmlnKCkgLSBVcGRhdGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIGluIFJJVkEuCisgCisgIEl0IGlzIHVzZWQgYXQgZHJpdmVyIHN0YXJ0IHVwIHRvIGluZm9ybSBSSVZBIG9mIHRoZSBkZWZhdWx0IGNoYW5uZWwgCisgIGNvbmZpZ3VyYXRpb24uIAorCisgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbAorCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAKKyAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSB0aGUgY2hhbm5lbCBjb25maWcgc3VjY2Vzc2Z1bGx5LgorCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gdXBkYXRlIHRoZSBjaGFubmVsIGNvbmZpZy4KKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfVXBkYXRlQ2hhbm5lbENvbmZpZyh0SGFsSGFuZGxlIGhIYWwpOworCisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX1NDQU5fUE5MTworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBzbWVfc2V0MTFkaW5mbygpIC0gU2V0IHRoZSAxMWQgaW5mb3JtYXRpb24gYWJvdXQgdmFsaWQgY2hhbm5lbHMKKyAgIGFuZCB0aGVyZSBwb3dlciB1c2luZyBpbmZvcm1hdGlvbiBmcm9tIG52UkFNIAorICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBmb3IgQVAuCisKKyAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIFxQYXJhbSBwU21lQ29uZmlnUGFyYW1zIC0gYSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YKKyAgdHlwZWRlZiBzdHJ1Y3QgX3NtZUNvbmZpZ1BhcmFtcy4KKworICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIHRoZSBjb25maWcgcGFyYW1ldGVycyBzdWNjZXNzZnVsbHkuCisKKyAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgdGhlIGNvbmZpZyBwYXJhbWV0ZXJzLgorICBcc2EKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZUhhbFN0YXR1cyBzbWVfc2V0MTFkaW5mbyh0SGFsSGFuZGxlIGhIYWwsICB0cFNtZUNvbmZpZ1BhcmFtcyBwU21lQ29uZmlnUGFyYW1zKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzbWVfZ2V0U29mdEFwRG9tYWluKCkgLSBHZXQgdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4gb2Ygc29mdEFwLgorCisgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbAorCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBIb3N0YXBkQWRhcHRlci4KKyAgXFBhcmFtIHZfUkVHRE9NQUlOX3QgLSBUaGUgY3VycmVudCBSZWd1bGF0b3J5IERvbWFpbiByZXF1ZXN0ZWQgZm9yIFNvZnRBcC4KKworICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGUgcmVxdWVzdC4KKworICAgICAgICAgIE90aGVyIHN0YXR1cyBtZWFucywgZmFpbGVkIHRvIGdldCB0aGUgY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbi4KKyAgXHNhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2VIYWxTdGF0dXMgc21lX2dldFNvZnRBcERvbWFpbih0SGFsSGFuZGxlIGhIYWwsICB2X1JFR0RPTUFJTl90ICpkb21haW5JZFNvZnRBcCk7CisKK2VIYWxTdGF0dXMgc21lX3NldFJlZ0luZm8odEhhbEhhbmRsZSBoSGFsLCAgdEFOSV9VOCAqYXBDbnRyeUNvZGUpOworCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9DaGFuZ2VDb25maWdQYXJhbXMKKyAgICBcYnJpZWYgVGhlIFNNRSBBUEkgZXhwb3NlZCBmb3IgSEREIHRvIHByb3ZpZGUgY29uZmlnIHBhcmFtcyB0byBTTUUgZHVyaW5nIAorICAgIFNNRXMgc3RvcCAtPiBzdGFydCBzZXF1ZW5jZS4gCisgICAgCisgICAgSWYgSEREIGNoYW5nZWQgdGhlIGRvbWFpbiB0aGF0IHdpbGwgY2F1c2UgYSByZXNldC4gVGhpcyBmdW5jdGlvbiB3aWxsIAorICAgIHByb3ZpZGUgdGhlIG5ldyBzZXQgb2YgMTFkIGluZm9ybWF0aW9uIGZvciB0aGUgbmV3IGRvbWFpbi4gQ3VycnJlbnRseSB0aGlzCisgICAgQVBJIHByb3ZpZGVzIGluZm8gcmVnYXJkaW5nIDExZCBvbmx5IGF0IHJlc2V0IGJ1dCB3ZSBjYW4gZXh0ZW5kIHRoaXMgZm9yCisgICAgb3RoZXIgcGFyYW1zIChQTUMsIFFvUykgd2hpY2ggbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYWdhaW4gYXQgcmVzZXQuCisKKyAgICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwKKyAgICAKKyAgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICAgIFxQYXJhbQorICAgIHBVcGRhdGVDb25maWdQYXJhbSAtIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSAodENzclVwZGF0ZUNvbmZpZ1BhcmFtKSB0aGF0IAorICAgICAgICAgICAgICAgIGN1cnJlbnRseSBwcm92aWRlcyAxMWQgcmVsYXRlZCBpbmZvcm1hdGlvbiBsaWtlIENvdW50cnkgY29kZSwgCisgICAgICAgICAgICAgICAgUmVndWxhdG9yeSBkb21haW4sIHZhbGlkIGNoYW5uZWwgbGlzdCwgVHggcG93ZXIgcGVyIGNoYW5uZWwsIGEgCisgICAgICAgICAgICAgICAgbGlzdCB3aXRoIGFjdGl2ZS9wYXNzaXZlIHNjYW4gYWxsb3dlZCBwZXIgdmFsaWQgY2hhbm5lbC4gCisKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfQ2hhbmdlQ29uZmlnUGFyYW1zKHRIYWxIYW5kbGUgaEhhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyVXBkYXRlQ29uZmlnUGFyYW0gKnBVcGRhdGVDb25maWdQYXJhbSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBzbWVfSEREUmVhZHlJbmQoKSAtIFNNRSBzZW5kcyBlV05JX1NNRV9TWVNfUkVBRFlfSU5EIHRvIFBFIHRvIGluZm9ybSB0aGF0IHRoZSBOSUMKKyAgaXMgcmVhZHkgdGlvIHJ1bi4KKyAgCisgIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgSEREIGF0IHRoZSBlbmQgb2YgaW5pdGlhbGl6YXRpb24gc3RhZ2Ugc28gUEUvSEFMIGNhbiBlbmFibGUgdGhlIE5JQyAKKyAgdG8gcnVubmluZyBzdGF0ZS4gCisgIAorICAKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIAorICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBlV05JX1NNRV9TWVNfUkVBRFlfSU5EIGlzIHNlbnQgdG8gUEUgc3VjY2Vzc2Z1bGx5LgorICAKKyAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGZhaWxlZCB0byBzZW5kIHRoZSBtZXNzYWdlIHRvIFBFLgorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0hERFJlYWR5SW5kKHRIYWxIYW5kbGUgaEhhbCk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHNtZV9Qcm9jZXNzTXNnKCkgLSBUaGUgbWFpbiBtZXNzYWdlIHByb2Nlc3NvciBmb3IgU01FLgorICAKKyAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhIG1lc3NhZ2UgZGlzcGF0Y2hlciB3aGVuIHRvIHByb2Nlc3MgYSBtZXNzYWdlIAorICB0YXJnZXRlZCBmb3IgU01FLiAKKyAgCisgIAorICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgXHBhcmFtIHBNc2cgLSBBIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0U2lyTXNnUS4KKyAgCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFNNRSBzdWNjZXNzZnVsbHkgcHJvY2VzcyB0aGUgbWVzc2FnZS4KKyAgCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBmYWlsZWQgdG8gcHJvY2VzcyB0aGUgbWVzc2FnZS4KKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Qcm9jZXNzTXNnKHRIYWxIYW5kbGUgaEhhbCwgdm9zX21zZ190KiBwTXNnKTsKKwordl9WT0lEX3Qgc21lX0ZyZWVNc2coIHRIYWxIYW5kbGUgaEhhbCwgdm9zX21zZ190KiBwTXNnICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2NhblJlcXVlc3QKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIFJlcXVlc3QgYSAxMWQgb3IgZnVsbCBzY2FuIGZyb20gQ1NSLgorICAgIFxwYXJhbSBwU2NhblJlcXVlc3RJRCAtIHBvaW50ZXIgdG8gYW4gb2JqZWN0IHRvIGdldCBiYWNrIHRoZSByZXF1ZXN0IElECisgICAgXHBhcmFtIGNhbGxiYWNrIC0gYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHNjYW4gY2FsbHMgdXBvbiBmaW5pc2gsIHdpbGwgbm90IAorICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCBpZiBjc3JTY2FuUmVxdWVzdCByZXR1cm5zIGVycm9yCisgICAgXHBhcmFtIHBDb250ZXh0IC0gYSBwb2ludGVyIHBhc3NlZCBpbiBmb3IgdGhlIGNhbGxiYWNrCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1NjYW5SZXF1ZXN0KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRDc3JTY2FuUmVxdWVzdCAqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwU2NhblJlcXVlc3RJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JTY2FuQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqcENvbnRleHQpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2NhblNldEJHU2NhbnBhcmFtcworICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gc2V0IEJHIHNjYW4gcGFyYW1zIGluIFBFCisgICAgXHBhcmFtIHBTY2FuUmVxIC0gQkcgc2NhbiByZXF1ZXN0IHN0cnVjdHVyZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TY2FuU2V0QkdTY2FucGFyYW1zKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRDc3JCR1NjYW5SZXF1ZXN0ICpwU2NhblJlcSk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TY2FuR2V0UmVzdWx0CisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IHNjYW4gcmVzdWx0cyBmcm9tIENTUi4KKyAgICBccGFyYW0gcEZpbHRlciAtIElmIHBGaWx0ZXIgaXMgTlVMTCwgYWxsIGNhY2hlZCByZXN1bHRzIGFyZSByZXR1cm5lZAorICAgIFxwYXJhbSBwaFJlc3VsdCAtIGFuIG9iamVjdCBmb3IgdGhlIHJlc3VsdC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2NhbkdldFJlc3VsdCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcEZpbHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNjYW5SZXN1bHRIYW5kbGUgKnBoUmVzdWx0KTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NjYW5GbHVzaFJlc3VsdAorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gY2xlYXIgc2NhbiByZXN1bHRzLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TY2FuRmx1c2hSZXN1bHQodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TY2FuUmVzdWx0R2V0Rmlyc3QKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgCisgICAgICAgICAgIHNjYW4gcmVzdWx0LgorICAgIFxwYXJhbSBoU2NhblJlc3VsdCAtIHJldHVybmVkIGZyb20gY3NyU2NhbkdldFJlc3VsdAorICAgIFxyZXR1cm4gdENzclNjYW5SZXN1bHRJbmZvICogLSBOVUxMIGlmIG5vIHJlc3VsdCAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0Q3NyU2NhblJlc3VsdEluZm8gKnNtZV9TY2FuUmVzdWx0R2V0Rmlyc3QodEhhbEhhbmRsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2NhblJlc3VsdEhhbmRsZSBoU2NhblJlc3VsdCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2NhblJlc3VsdEdldE5leHQKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIHJldHVybnMgdGhlIG5leHQgZWxlbWVudCBvZiAKKyAgICAgICAgICAgc2NhbiByZXN1bHQuIEl0IGNhbiBiZSBjYWxsZWQgd2l0aG91dCBjYWxsaW5nIGNzclNjYW5SZXN1bHRHZXRGaXJzdCAKKyAgICAgICAgICAgZmlyc3QKKyAgICBccGFyYW0gaFNjYW5SZXN1bHQgLSByZXR1cm5lZCBmcm9tIGNzclNjYW5HZXRSZXN1bHQKKyAgICBccmV0dXJuIE51bGwgaWYgbm8gcmVzdWx0IG9yIHJlYWNoIHRoZSBlbmQgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordENzclNjYW5SZXN1bHRJbmZvICpzbWVfU2NhblJlc3VsdEdldE5leHQodEhhbEhhbmRsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2NhblJlc3VsdEhhbmRsZSBoU2NhblJlc3VsdCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2NhblJlc3VsdFB1cmdlCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byByZW1vdmUgYWxsIGl0ZW1zKHRDc3JTY2FuUmVzdWx0KSAKKyAgICAgICAgICAgaW4gdGhlIGxpc3QgYW5kIGZyZWUgbWVtb3J5IGZvciBlYWNoIGl0ZW0KKyAgICBccGFyYW0gaFNjYW5SZXN1bHQgLSByZXR1cm5lZCBmcm9tIGNzclNjYW5HZXRSZXN1bHQuIGhTY2FuUmVzdWx0IGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNpZGVyZWQgZ29uZSBieSAKKyAgICBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYW5kIGV2ZW4gYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV1dHJucy4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2NhblJlc3VsdFB1cmdlKHRIYWxIYW5kbGUgaEhhbCwgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5SZXN1bHQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NjYW5HZXRQTUtJRENhbmRpZGF0ZUxpc3QKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgUE1LSUQgY2FuZGlkYXRlIGxpc3QKKyAgICBccGFyYW0gcFBta2lkTGlzdCAtIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHBvaW50IHRvIGFuIGFycmF5IG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgdFBta2lkQ2FuZGlkYXRlSW5mbworICAgIFxwYXJhbSBwTnVtSXRlbXMgLSBwb2ludGVyIHRvIGEgdmFyaWFibGUgdGhhdCBoYXMgdGhlIG51bWJlciBvZiAKKyAgICAgICAgICAgICAgICAgICAgICAgdFBta2lkQ2FuZGlkYXRlSW5mbyBhbGxvY2F0ZWQgd2hlbiByZXRydW5pbmcsIHRoaXMgaXMgCisgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciB0aGUgbnVtYmVyIG5lZWRlZCBvciBudW1iZXIgb2YgaXRlbXMgcHV0IGludG8gCisgICAgICAgICAgICAgICAgICAgICAgIHBQbWtpZExpc3QKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90IAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpZyBlbm91Z2ggYW5kIHBOdW1JdGVtcworICAgIGhhcyB0aGUgbnVtYmVyIG9mIHRQbWtpZENhbmRpZGF0ZUluZm8uCisgICAgXE5vdGU6IHBOdW1JdGVtcyBpcyBhIG51bWJlciBvZiB0UG1raWRDYW5kaWRhdGVJbmZvLCAKKyAgICAgICAgICAgbm90IHNpemVvZih0UG1raWRDYW5kaWRhdGVJbmZvKSAqIHNvbWV0aGluZworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2NhbkdldFBNS0lEQ2FuZGlkYXRlTGlzdCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQbWtpZENhbmRpZGF0ZUluZm8gKnBQbWtpZExpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwTnVtSXRlbXMgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGZuIHNtZV9Sb2FtUmVnaXN0ZXJMaW5rUXVhbGl0eUluZENhbGxiYWNrCisKKyAgXGJyaWVmCisgIGEgd3JhcHBlciBmdW5jdGlvbiB0byBhbGxvdyBIREQgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayBoYW5kbGVyIHdpdGggQ1NSIGZvciAKKyAgbGluayBxdWFsaXR5IGluZGljYXRpb25zLiAKKworICBPbmx5IG9uZSBjYWxsYmFjayBtYXkgYmUgcmVnaXN0ZXJlZCBhdCBhbnkgdGltZS4KKyAgSW4gb3JkZXIgdG8gZGVyZWdpc3RlciB0aGUgY2FsbGJhY2ssIGEgTlVMTCBjYmFjayBtYXkgYmUgcHJvdmlkZWQuCisKKyAgUmVnaXN0cmF0aW9uIGhhcHBlbnMgaW4gdGhlIHRhc2sgY29udGV4dCBvZiB0aGUgY2FsbGVyLgorCisgIFxwYXJhbSBjYWxsYmFjayAtIENhbGwgYmFjayBiZWluZyByZWdpc3RlcmVkCisgIFxwYXJhbSBwQ29udGV4dCAtIHVzZXIgZGF0YQorICAKKyAgREVQRU5ERU5DSUVTOiBBZnRlciBDU1Igb3BlbgorCisgIFxyZXR1cm4gZUhhbFN0YXR1cyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtUmVnaXN0ZXJMaW5rUXVhbGl0eUluZENhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1MaW5rUXVhbGl0eUluZENhbGxiYWNrICAgY2FsbGJhY2ssICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQ29udGV4dCk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Sb2FtQ29ubmVjdAorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gaW5pdGl0aWF0ZSBhbiBhc3NvY2lhdGlvbgorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSB0aGUgc2Vzc2lvbklkIHJldHVybmVkIGJ5IHNtZV9PcGVuU2Vzc2lvbi4KKyAgICBccGFyYW0gcFByb2ZpbGUgLSBjYW4gYmUgTlVMTCB0byBqb2luIHRvIGFueSBvcGVuIG9uZXMKKyAgICBccGFyYW0gcFJvYW1JZCAtIHRvIGdldCBiYWNrIHRoZSByZXF1ZXN0IElECisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1Db25uZWN0KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBSb2FtSWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1SZWFzc29jCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byBpbml0aXRpYXRlIGEgcmUtYXNzb2NpYXRpb24KKyAgICBccGFyYW0gcFByb2ZpbGUgLSBjYW4gYmUgTlVMTCB0byBqb2luIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIEFQLiBJbiB0aGF0IAorICAgIGNhc2UgbW9kUHJvZmlsZUZpZWxkcyBzaG91bGQgY2FycnkgdGhlIG1vZGlmaWVkIGZpZWxkKHMpIHdoaWNoIGNvdWxkIHRyaWdnZXIKKyAgICByZWFzc29jICAKKyAgICBccGFyYW0gbW9kUHJvZmlsZUZpZWxkcyAtIGZpZWxkcyB3aGljaCBhcmUgcGFydCBvZiB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgCisgICAgdGhhdCBtaWdodCBuZWVkIG1vZGlmaWNhdGlvbiBkeW5hbWljYWxseSBvbmNlIFNUQSBpcyB1cCAmIHJ1bm5pbmcgYW5kIHRoaXMgCisgICAgY291bGQgdHJpZ2dlciBhIHJlYXNzb2MKKyAgICBccGFyYW0gcFJvYW1JZCAtIHRvIGdldCBiYWNrIHRoZSByZXF1ZXN0IElECisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtUmVhc3NvYyh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgbW9kUHJvZmlsZUZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBSb2FtSWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1Db25uZWN0VG9MYXN0UHJvZmlsZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gZGlzY29ubmVjdCBhbmQgcmVjb25uZWN0IHdpdGggCisgICAgICAgICAgIHRoZSBzYW1lIHByb2ZpbGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMuIEl0IHJldHVybnMgZmFpbCBpZiBjdXJyZW50bHkgY29ubmVjdGVkICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1Db25uZWN0VG9MYXN0UHJvZmlsZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Sb2FtRGlzY29ubmVjdAorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gZGlzY29ubmVjdCBmcm9tIGEgbmV0d29yaworICAgIFxwYXJhbSByZWFzb24gLS0gVG8gaW5kaWNhdGUgdGhlIHJlYXNvbiBmb3IgZGlzY29ubmVjdGluZy4gQ3VycmVudGx5LCBvbmx5IAorICAgICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9NSUNfRVJST1IgaXMgbWVhbmZ1bC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbURpc2Nvbm5lY3QodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwgZUNzclJvYW1EaXNjb25uZWN0UmVhc29uIHJlYXNvbik7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1TdG9wQnNzCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byBzdG9wIGJzcworICAgIFxwYXJhbSBzZXNzaW9uSWQgICAgLSBzZXNzaW9uSWQgb2YgU29mdEFQCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1TdG9wQnNzKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1HZXRBc3NvY2lhdGVkU3RhcworICAgIFxicmllZiBUbyBwcm9iZSB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIHN0YXRpb25zIGZyb20gdmFyaW91cyBtb2R1bGVzIG9mIENPUkUgc3RhY2suCisgICAgXFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKyAgICBccGFyYW0gc2Vzc2lvbklkICAgIC0gc2Vzc2lvbklkIG9mIFNvZnRBUAorICAgIFxwYXJhbSBtb2RJZCAgICAgICAgLSBNb2R1bGUgZnJvbSB3aG9tIGxpc3Qgb2YgYXNzb2NpdGF0ZWQgc3RhdGlvbnMgaXMgdG8gYmUgcHJvYmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBhbiBpbnZhbGlkIG1vZHVsZSBpcyBwYXNzZWQgdGhlbiBieSBkZWZhdWx0IFZPU19NT0RVTEVfSURfUEUgd2lsbCBiZSBwcm9iZWQKKyAgICBccGFyYW0gcFVzckNvbnRleHQgIC0gT3BhcXVlIEhERCBjb250ZXh0CisgICAgXHBhcmFtIHBmblNhcEV2ZW50Q2FsbGJhY2sgIC0gU2FwIGV2ZW50IGNhbGxiYWNrIGluIEhERAorICAgIFxwYXJhbSBwQXNzb2NCdWYgICAgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0byBiZSBmaWxsZWQgd2l0aCBhc3NvY2lhdGQgc3RhdGlvbnMgaW5mbworICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1HZXRBc3NvY2lhdGVkU3Rhcyh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NT0RVTEVfSUQgbW9kSWQsIHZvaWQgKnBVc3JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssIHRBTklfVTggKnBBc3NvY1N0YXNCdWYpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1EaXNjb25uZWN0U3RhCisgICAgXGJyaWVmIFRvIGRpc2Fzc29jaWF0ZSBhIHN0YXRpb24uIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKyAgICBccGFyYW0gcFBlZXJNYWNBZGRyIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZmlsbGVkIHdpdGggcGVlciBNQUMgYWRkcmVzcyAoNiBieXRlcykKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgIFNVQ0NFU1MgIFJvYW0gY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgdG8gaW5kaWNhdGUgYWN0dWFsIHJlc3VsdHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtRGlzY29ubmVjdFN0YSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCB0QU5JX1U4ICpwUGVlck1hY0FkZHIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1EZWF1dGhTdGEKKyAgICBcYnJpZWYgVG8gZGlzYXNzb2NpYXRlIGEgc3RhdGlvbi4gVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorICAgIFxwYXJhbSBoSGFsIC0gR2xvYmFsIHN0cnVjdHVyZQorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uSWQgb2YgU29mdEFQCisgICAgXHBhcmFtIHBQZWVyTWFjQWRkciAtIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IGZpbGxlZCB3aXRoIHBlZXIgTUFDIGFkZHJlc3MgKDYgYnl0ZXMpCisgICAgXHJldHVybiBlSGFsU3RhdHVzICBTVUNDRVNTICBSb2FtIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHRvIGluZGljYXRlIGFjdHVhbCByZXN1bHRzICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1EZWF1dGhTdGEodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFBlZXJNYWNBZGRyKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Sb2FtVEtJUENvdW50ZXJNZWFzdXJlcworICAgIFxicmllZiBUbyBzdGFydCBvciBzdG9wIFRLSVAgY291bnRlciBtZWFzdXJlcy4gVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uSWQgb2YgU29mdEFQCisgICAgXHBhcmFtIGJFbmFibGUgLSBGbGFnIHRvIHN0YXJ0L3N0b3AgVEtJUCBjb3VudGVybWVhc3VyZXMKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgIFNVQ0NFU1MgIFJvYW0gY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgdG8gaW5kaWNhdGUgYWN0dWFsIHJlc3VsdHMgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVRLSVBDb3VudGVyTWVhc3VyZXModEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwgdEFOSV9CT09MRUFOIGJFbmFibGUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1HZXRXcHNTZXNzaW9uT3ZlcmxhcAorICAgIFxicmllZiBUbyBnZXQgdGhlIFdQUyBQQkMgc2Vzc2lvbiBvdmVybGFwIGluZm9ybWF0aW9uLgorICAgIFxUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBBUEkuCisgICAgXHBhcmFtIHNlc3Npb25JZCAgICAtIHNlc3Npb25JZCBvZiBTb2Z0QVAKKyAgICBccGFyYW0gcFVzckNvbnRleHQgIC0gT3BhcXVlIEhERCBjb250ZXh0CisgICAgXHBhcmFtIHBmblNhcEV2ZW50Q2FsbGJhY2sgIC0gU2FwIGV2ZW50IGNhbGxiYWNrIGluIEhERAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1HZXRXcHNTZXNzaW9uT3ZlcmxhcCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBVc3JDb250ZXh0LCB2b2lkICpwZm5TYXBFdmVudENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfTUFDQUREUl90IHBSZW1vdmVNYWMpOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbUdldENvbm5lY3RTdGF0ZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGNvbm5lY3Qgc3RhdGUgCisgICAgICAgICAgIG9mIFJvYW1pbmcKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbUdldENvbm5lY3RTdGF0ZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCBlQ3NyQ29ubmVjdFN0YXRlICpwU3RhdGUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1HZXRDb25uZWN0UHJvZmlsZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGNvbm5lY3QgCisgICAgICAgICAgIHByb2ZpbGUuIENhbGxlciBtdXN0IGNhbGwgY3NyUm9hbUZyZWVDb25uZWN0UHJvZmlsZSBhZnRlciBpdCBpcyBkb25lIAorICAgICAgICAgICBhbmQgYmVmb3JlIHJldXNlIGZvciBhbm90aGVyIGNzclJvYW1HZXRDb25uZWN0UHJvZmlsZSBjYWxsLgorICAgIFxwYXJhbSBwUHJvZmlsZSAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHN0cnVjdHVyZSAKKyAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMuIEZhaWx1cmUgaWYgbm90IGNvbm5lY3RlZCAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtR2V0Q29ubmVjdFByb2ZpbGUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBQcm9maWxlKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Sb2FtRnJlZUNvbm5lY3RQcm9maWxlCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byBmcmVlIGFuZCByZWluaXRpYWxpemUgdGhlIAorICAgICAgICAgICBwcm9maWxlIHJldHVybmVkIHByZXZpb3VzbHkgYnkgY3NyUm9hbUdldENvbm5lY3RQcm9maWxlLgorICAgIFxwYXJhbSBwUHJvZmlsZSAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHN0cnVjdHVyZSAKKyAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMuICAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtRnJlZUNvbm5lY3RQcm9maWxlKHRIYWxIYW5kbGUgaEhhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcFByb2ZpbGUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1TZXRQTUtJRENhY2hlCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byByZXR1cm4gdGhlIFBNS0lEIGNhbmRpZGF0ZSBsaXN0CisgICAgXHBhcmFtIHBQTUtJRENhY2hlIC0gY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgcG9pbnQgdG8gYW4gYXJyYXkgb2YgCisgICAgICAgICAgICAgICAgICAgICAgICAgdFBta2lkQ2FjaGVJbmZvCisgICAgXHBhcmFtIG51bUl0ZW1zIC0gYSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgbnVtYmVyIG9mIHRQbWtpZENhY2hlSW5mbyAKKyAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgd2hlbiByZXRydW5pbmcsIHRoaXMgaXMgZWl0aGVyIHRoZSBudW1iZXIgbmVlZGVkIAorICAgICAgICAgICAgICAgICAgICAgIG9yIG51bWJlciBvZiBpdGVtcyBwdXQgaW50byBwUE1LSURDYWNoZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgYmlnIGVub3VnaCBhbmQgcE51bUl0ZW1zIGhhcyB0aGUgbnVtYmVyIG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgIHRQbWtpZENhY2hlSW5mby4KKyAgICBcTm90ZTogcE51bUl0ZW1zIGlzIGEgbnVtYmVyIG9mIHRQbWtpZENhY2hlSW5mbywgCisgICAgICAgICAgIG5vdCBzaXplb2YodFBta2lkQ2FjaGVJbmZvKSAqIHNvbWV0aGluZworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVNldFBNS0lEQ2FjaGUoIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRQbWtpZENhY2hlSW5mbyAqcFBNS0lEQ2FjaGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG51bUl0ZW1zICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbUdldFNlY3VyaXR5UmVxSUUKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIHJldHVybiB0aGUgV1BBIG9yIFJTTiBvciBXQVBJIElFIENTUgorICAgICAgICAgICBwYXNzZXMgdG8gUEUgdG8gSk9JTiByZXF1ZXN0IG9yIFNUQVJUX0JTUyByZXF1ZXN0CisgICAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsLgorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSByZXR1cm5lZCBieSBzbWVfT3BlblNlc3Npb24uCisgICAgXHBhcmFtIHBMZW4gLSBjYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGhhcyB0aGUgbGVuZ3RoIG9mIHBCdWYgYXMgaW5wdXQuIAorICAgICAgICAgICAgICAgICAgVXBvbiByZXR1cm5lZCwgKnBMZW4gaGFzIHRoZSBuZWVkZWQgb3IgSUUgbGVuZ3RoIGluIHBCdWYuCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGNvbnRhaW4gdGhlIElFIGZpZWxkLCBpZiBhbnksIAorICAgICAgICAgICAgICAgICAgdXBvbiByZXR1cm4KKyAgICBccGFyYW0gc2VjVHlwZSAtIFNwZWNpZmllcyB3aGV0aGVyIGxvb2tpbmcgZm9yIFdQQS9XUEEyL1dBUEkgSUUgICAgICAgICAgICAgICAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90IAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpZyBlbm91Z2gKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1HZXRTZWN1cml0eVJlcUlFKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRBTklfVTMyICpwTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsIGVDc3JTZWN1cml0eVR5cGUgc2VjVHlwZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbUdldFNlY3VyaXR5UnNwSUUKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIHJldHVybiB0aGUgV1BBIG9yIFJTTiBvciBXQVBJIElFIGZyb20gCisgICAgICAgICAgIHRoZSBiZWFjb24gb3IgcHJvYmUgcnNwIGlmIGNvbm5lY3RlZAorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSByZXR1cm5lZCBieSBzbWVfT3BlblNlc3Npb24uCisgICAgXHBhcmFtIHBMZW4gLSBjYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGhhcyB0aGUgbGVuZ3RoIG9mIHBCdWYgYXMgaW5wdXQuIAorICAgICAgICAgICAgICAgICAgVXBvbiByZXR1cm5lZCwgKnBMZW4gaGFzIHRoZSBuZWVkZWQgb3IgSUUgbGVuZ3RoIGluIHBCdWYuCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGNvbnRhaW4gdGhlIElFIGZpZWxkLCBpZiBhbnksIAorICAgICAgICAgICAgICAgICAgdXBvbiByZXR1cm4KKyAgICBccGFyYW0gc2VjVHlwZSAtIFNwZWNpZmllcyB3aGV0aGVyIGxvb2tpbmcgZm9yIFdQQS9XUEEyL1dBUEkgSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90IAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpZyBlbm91Z2gKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1HZXRTZWN1cml0eVJzcElFKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRBTklfVTMyICpwTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsIGVDc3JTZWN1cml0eVR5cGUgc2VjVHlwZSk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Sb2FtR2V0TnVtUE1LSURDYWNoZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIG51bWJlciBvZiBQTUtJRCBjYWNoZSAKKyAgICAgICAgICAgZW50cmllcworICAgIFxyZXR1cm4gdEFOSV9VMzIgLSB0aGUgbnVtYmVyIG9mIFBNS0lEIGNhY2hlIGVudHJpZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RBTklfVTMyIHNtZV9Sb2FtR2V0TnVtUE1LSURDYWNoZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Sb2FtR2V0UE1LSURDYWNoZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIFBNS0lEIGNhY2hlIGZyb20gQ1NSCisgICAgXHBhcmFtIHBOdW0gLSBjYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGhhcyB0aGUgc3BhY2Ugb2YgdGhlIG51bWJlciBvZiAKKyAgICAgICAgICAgICAgICAgIHBCdWYgdFBta2lkQ2FjaGVJbmZvIGFzIGlucHV0LiBVcG9uIHJldHVybmVkLCAqcE51bSBoYXMgdGhlIAorICAgICAgICAgICAgICAgICAgbmVlZGVkIG9yIGFjdHVhbGx5IG51bWJlciBpbiB0UG1raWRDYWNoZUluZm8uCisgICAgXHBhcmFtIHBQbWtpZENhY2hlIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBjb250YWlucyBQTUtJRCBjYWNoZSwgaWYgCisgICAgICAgICAgICAgICAgICAgICAgICAgYW55LCB1cG9uIHJldHVybgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgYmlnIGVub3VnaAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbUdldFBNS0lEQ2FjaGUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwgdEFOSV9VMzIgKnBOdW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBta2lkQ2FjaGVJbmZvICpwUG1raWRDYWNoZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfR2V0Q29uZmlnUGFyYW0KKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgSEREIGNhbGxzIHRvIGdldCB0aGUgZ2xvYmFsIHNldHRpbmdzIAorICAgICAgICAgICBjdXJyZW50bHkgbWFpbnRhaW5lZCBieSBDU1IuIAorICAgIFxwYXJhbSBwUGFyYW0gLSBjYWxsZXIgYWxsb2NhdGVkIG1lbW9yeQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9HZXRDb25maWdQYXJhbSh0SGFsSGFuZGxlIGhIYWwsIHRTbWVDb25maWdQYXJhbXMgKnBQYXJhbSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfR2V0U3RhdGlzdGljcworICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBjbGllbnQgY2FsbHMgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBnZXQgCisgICAgZGlmZmVyZW50IFBIWSBsZXZlbCBzdGF0aXN0aWNzIGZyb20gQ1NSLiAKKyAgICAKKyAgICBccGFyYW0gcmVxdWVzdGVySWQgLSBkaWZmZXJlbnQgY2xpZW50IHJlcXVlc3RpbmcgZm9yIHN0YXRpc3RpY3MsIEhERCwgVU1BL0dBTiBldGMKKyAgICBccGFyYW0gc3RhdHNNYXNrIC0gVGhlIGRpZmZlcmVudCBjYXRlZ29yeS9jYXRlZ29yaWVzIG9mIHN0YXRzIHJlcXVlc3RlciBpcyBsb29raW5nIGZvcgorICAgIFRoZSBvcmRlciBpbiB3aGljaCB5b3Ugc2V0IHRoZSBiaXRzIGluIHRoZSBzdGF0c01hc2sgZm9yIHJlcXVlc3RpbmcgCisgICAgZGlmZmVyZW50IHR5cGUgb2Ygc3RhdHMgaXM6CisKKyAgICAgIGVDc3JTdW1tYXJ5U3RhdHMgPSBiaXQgMAorICAgICAgZUNzckdsb2JhbENsYXNzQVN0YXRzID0gYml0IDEKKyAgICAgIGVDc3JHbG9iYWxDbGFzc0JTdGF0cyA9IGJpdCAyCisgICAgICBlQ3NyR2xvYmFsQ2xhc3NDU3RhdHMgPSBiaXQgMworICAgICAgZUNzckdsb2JhbENsYXNzRFN0YXRzID0gYml0IDQKKyAgICAgIGVDc3JQZXJTdGFTdGF0cyA9IGJpdCA1CisKKyAgICBccGFyYW0gY2FsbGJhY2sgLSBTTUUgc2VuZHMgYmFjayB0aGUgcmVxdWVzdGVkIHN0YXRzIHVzaW5nIHRoZSBjYWxsYmFjaworICAgIFxwYXJhbSBwZXJpb2RpY2l0eSAtIElmIHJlcXVlc3RlciBuZWVkcyBwZXJpb2RpYyB1cGRhdGUsIDAgbWVhbnMgaXQncyBhbiBvbmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSByZXF1ZXN0CisgICAgXHBhcmFtIGNhY2hlIC0gSWYgcmVxdWVzdGVyIGlzIGhhcHB5IHdpdGggY2FjaGVkIHN0YXRzCisgICAgXHBhcmFtIHN0YUlkIC0gVGhlIHN0YXRpb24gSUQgZm9yIHdoaWNoIHRoZSBzdGF0cyBpcyByZXF1ZXN0ZWQgZm9yCisgICAgXHBhcmFtIHBDb250ZXh0IC0gdXNlciBjb250ZXh0IHRvIGJlIHBhc3NlZCBiYWNrIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0dldFN0YXRpc3RpY3ModEhhbEhhbmRsZSBoSGFsLCBlQ3NyU3RhdHNSZXF1ZXN0ZXJUeXBlIHJlcXVlc3RlcklkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgc3RhdHNNYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclN0YXRzQ2FsbGJhY2sgY2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBwZXJpb2RpY2l0eSwgdEFOSV9CT09MRUFOIGNhY2hlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBzdGFJZCwgdm9pZCAqcENvbnRleHQpOworCitlSGFsU3RhdHVzIHNtZV9HZXRSc3NpKHRIYWxIYW5kbGUgaEhhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSc3NpQ2FsbGJhY2sgY2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IHN0YUlkLCB0Q3NyQnNzaWQgYnNzSWQsIHZvaWQgKnBDb250ZXh0LCB2b2lkKiBwVm9zQ29udGV4dCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfQ2ZnU2V0SW50CisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBzZXQgcGFyYW1ldGVycyBpbiBDRkcuIAorICAgIFxwYXJhbSBjZmdJZCAtIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIElEICh0eXBlKSBmb3IgU1RBLiAKKyAgICBccGFyYW0gY2NtVmFsdWUgLSBUaGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBDb25maWd1cmF0aW9uIFBhcmFtZXRlciBJRAorICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIG5lZWRzIHRvIGJlIHNhdmVkIGluIENGRworICAgIFxwYXJhbSBjYWxsYmFjayAtIFRvIGJlIHJlZ2lzdGVyZWQgYnkgQ1NSIHdpdGggQ0NNLiBPbmNlIHRoZSBDRkcgZG9uZSB3aXRoIAorICAgICAgICAgICAgICAgICAgICAgIHNhdmluZyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGFiYXNlLCBpdCBub3RpZmllcyBDQ00gJiAKKyAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgdG8gbm90aWZ5LiAKKyAgICBccGFyYW0gdG9CZVNhdmVkIC0gVG8gc2F2ZSB0aGUgcmVxdWVzdCBmb3IgZnV0dXJlIHJlZmVyZW5jZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9DZmdTZXRJbnQodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1UzMiBjZmdJZCwgdEFOSV9VMzIgY2NtVmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHRDY21DZmdTZXRDYWxsYmFjayBjYWxsYmFjaywgZUFuaUJvb2xlYW4gdG9CZVNhdmVkKSA7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfQ2ZnU2V0U3RyCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBzZXQgcGFyYW1ldGVycyBpbiBDRkcuIAorICAgIFxwYXJhbSBjZmdJZCAtIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIElEICh0eXBlKSBmb3IgU1RBLiAKKyAgICBccGFyYW0gcFN0ciAtIFBvaW50ZXIgdG8gdGhlIGJ5dGUgYXJyYXkgd2hpY2ggY2FycmllcyB0aGUgaW5mb3JtYXRpb24gbmVlZHMgCisgICAgICAgICAgICAgICAgICB0byBiZSBzYXZlZCBpbiBDRkcKKyAgICBccGFyYW0gbGVuZ3RoIC0gTGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHNhdmVkICAgICAgICAgICAgICAgICAgCisgICAgXHBhcmFtIGNhbGxiYWNrIC0gVG8gYmUgcmVnaXN0ZXJlZCBieSBDU1Igd2l0aCBDQ00uIE9uY2UgdGhlIENGRyBkb25lIHdpdGggCisgICAgICAgICAgICAgICAgICAgICAgc2F2aW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZGF0YWJhc2UsIGl0IG5vdGlmaWVzIENDTSAmIAorICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCB0byBub3RpZnkuIAorICAgIFxwYXJhbSB0b0JlU2F2ZWQgLSBUbyBzYXZlIHRoZSByZXF1ZXN0IGZvciBmdXR1cmUgcmVmZXJlbmNlCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0NmZ1NldFN0cih0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIGNmZ0lkLCB0QU5JX1U4ICpwU3RyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBsZW5ndGgsIHRDY21DZmdTZXRDYWxsYmFjayBjYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgZUFuaUJvb2xlYW4gdG9CZVNhdmVkKSA7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9HZXRNb2RpZnlQcm9maWxlRmllbGRzCisgICAgXGJyaWVmIEhERCBvciBTTUUgLSBRT1MgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIAorICAgIGNvbm5lY3RlZCBwcm9maWxlIGZpZWxkcywgY2hhbmdpbmcgd2hpY2ggY2FuIGNhdXNlIHJlYXNzb2MuCisgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBDRkcgaXMgZG93bmxvYWRlZCBhbmQgU1RBIGlzIGluIGNvbm5lY3RlZAorICAgIHN0YXRlLiBBbHNvLCBtYWtlIHN1cmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCBwcm9maWxlCisgICAgZmllbGRzIGJlZm9yZSBjYWxsaW5nIHRoZSByZWFzc29jLiBTbyB0aGF0IHBNb2RpZnlQcm9maWxlRmllbGRzIHdpbGwgaGF2ZQorICAgIGFsbCB0aGUgbGF0ZXN0IHZhbHVlcyBwbHVzIHRoZSBvbmUocykgaGFzIGJlZW4gdXBkYXRlZCBhcyBwYXJ0IG9mIHJlYXNzb2MKKyAgICByZXF1ZXN0LgorICAgIFxwYXJhbSBwTW9kaWZ5UHJvZmlsZUZpZWxkcyAtIHBvaW50ZXIgdG8gdGhlIGNvbm5lY3RlZCBwcm9maWxlIGZpZWxkcyAKKyAgICBjaGFuZ2luZyB3aGljaCBjYW4gY2F1c2UgcmVhc3NvYworCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9HZXRNb2RpZnlQcm9maWxlRmllbGRzKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqIHBNb2RpZnlQcm9maWxlRmllbGRzKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TZXRDb25maWdQb3dlclNhdmUKKyAgICBcYnJpZWYgIFdyYXBwZXIgZm4gdG8gY2hhbmdlIHBvd2VyIHNhdmUgY29uZmlndXJhdGlvbiBpbiBTTUUgKFBNQykgbW9kdWxlLgorICAgICAgICAgICAgRm9yIEJNUFMgcmVsYXRlZCBjb25maWd1cmF0aW9uLCB0aGlzIGZ1bmN0aW9uIGFsc28gdXBkYXRlcyB0aGUgQ0ZHCisgICAgICAgICAgICBhbmQgc2VuZHMgYSBtZXNzYWdlIHRvIEZXIHRvIHBpY2sgdXAgdGhlIG5ldyB2YWx1ZXMuIE5vdGU6IENhbGxpbmcKKyAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gb25seSB1cGRhdGVzIHRoZSBjb25maWd1cmF0aW9uIGFuZCBkb2VzIG5vdCBlbmFibGUgCisgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHBvd2VyIHNhdmUgbW9kZS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwc01vZGUgLSBQb3dlciBTYXZpbmcgbW9kZSBiZWluZyBtb2RpZmllZAorICAgIFxwYXJhbSAgcENvbmZpZ1BhcmFtcyAtIGEgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHR5cGUKKyAgICAgICAgICAgIHRQbWNTbXBzQ29uZmlnUGFyYW1zIG9yIHRQbWNCbXBzQ29uZmlnUGFyYW1zIG9yIHRQbWNJbXBzQ29uZmlnUGFyYW1zIAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRDb25maWdQb3dlclNhdmUodEhhbEhhbmRsZSBoSGFsLCB0UG1jUG93ZXJTYXZpbmdNb2RlIHBzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ29uZmlnUGFyYW1zKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfR2V0Q29uZmlnUG93ZXJTYXZlCisgICAgXGJyaWVmICBXcmFwcGVyIGZuIHRvIHJldGlyZXZlIHBvd2VyIHNhdmUgY29uZmlndXJhdGlvbiBpbiBTTUUgKFBNQykgbW9kdWxlCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcHNNb2RlIC0gUG93ZXIgU2F2aW5nIG1vZGUKKyAgICBccGFyYW0gIHBDb25maWdQYXJhbXMgLSBhIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0eXBlCisgICAgICAgICAgICB0UG1jU21wc0NvbmZpZ1BhcmFtcyBvciB0UG1jQm1wc0NvbmZpZ1BhcmFtcyBvciB0UG1jSW1wc0NvbmZpZ1BhcmFtcyAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0Q29uZmlnUG93ZXJTYXZlKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENvbmZpZ1BhcmFtcyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2lnbmFsUG93ZXJFdmVudAorICAgIFxicmllZiAgU2lnbmFscyB0byBQTUMgdGhhdCBhIHBvd2VyIGV2ZW50IGhhcyBvY2N1cnJlZC4gVXNlZCBmb3IgcHV0dGluZworICAgICAgICAgICAgdGhlIGNoaXAgaW50byBkZWVwIHNsZWVwIG1vZGUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgZXZlbnQgLSB0aGUgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX1NpZ25hbFBvd2VyRXZlbnQgKAorICAgdEhhbEhhbmRsZSBoSGFsLAorICAgdFBtY1Bvd2VyRXZlbnQgZXZlbnQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0VuYWJsZVBvd2VyU2F2ZQorICAgIFxicmllZiAgRW5hYmxlcyBvbmUgb2YgdGhlIHBvd2VyIHNhdmluZyBtb2Rlcy4gVGhpcyBBUEkgZG9lcyBub3QgY2F1c2UgYQorICAgICAgICAgICAgZGV2aWNlIHN0YXRlIGNoYW5nZS4gVGhpcyBpcyBwdXJlbHkgYSBjb25maWd1cmF0aW9uIEFQSS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwc01vZGUgLSBUaGUgcG93ZXIgc2F2aW5nIG1vZGUgdG8gZW5hYmxlLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gZUhhbFN0YXR1cyBzbWVfRW5hYmxlUG93ZXJTYXZlICgKKyAgIHRIYWxIYW5kbGUgaEhhbCwKKyAgIHRQbWNQb3dlclNhdmluZ01vZGUgcHNNb2RlKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9EaXNhYmxlUG93ZXJTYXZlCisgICAgXGJyaWVmICAgRGlzYWJsZXMgb25lIG9mIHRoZSBwb3dlciBzYXZpbmcgbW9kZXMuRGlzYWJsaW5nIGRvZXMgbm90IGltcGx5CisgICAgICAgICAgICAgdGhhdCBkZXZpY2Ugd2lsbCBiZSBicm91Z2h0IG91dCBvZiB0aGUgY3VycmVudCBQUyBtb2RlLiBUaGlzIGlzIAorICAgICAgICAgICAgIHB1cmVseSBhIGNvbmZpZ3VyYXRpb24gQVBJLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBzTW9kZSAtIFRoZSBwb3dlciBzYXZpbmcgbW9kZSB0byBkaXNhYmxlLiAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX0Rpc2FibGVQb3dlclNhdmUgKAorICAgdEhhbEhhbmRsZSBoSGFsLAorICAgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1N0YXJ0QXV0b0JtcHNUaW1lcgorICAgIFxicmllZiAgU3RhcnRzIGEgdGltZXIgdGhhdCBwZXJpb2RpY2FsbHkgcG9sbHMgYWxsIHRoZSByZWdpc3RlcmVkCisgICAgICAgICAgICBtb2R1bGUgZm9yIGVudHJ5IGludG8gQm1wcyBtb2RlLiBUaGlzIHRpbWVyIGlzIHN0YXJ0ZWQgb25seSBpZiBCTVBTIGlzCisgICAgICAgICAgICBlbmFibGVkIGFuZCB3aGVuZXZlciB0aGUgZGV2aWNlIGlzIGluIGZ1bGwgcG93ZXIuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gZUhhbFN0YXR1cyBzbWVfU3RhcnRBdXRvQm1wc1RpbWVyICggdEhhbEhhbmRsZSBoSGFsKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TdG9wQXV0b0JtcHNUaW1lcgorICAgIFxicmllZiAgU3RvcHMgdGhlIEF1dG8gQk1QUyBUaW1lciB0aGF0IHdhcyBzdGFydGVkIHVzaW5nIHNtZV9zdGFydEF1dG9CbXBzVGltZXIKKyAgICAgICAgICAgIFN0b3BwaW5nIHRoZSB0aW1lciBkb2VzIG5vdCBjYXVzZSBhIGRldmljZSBzdGF0ZSBjaGFuZ2UuIE9ubHkgdGhlIHRpbWVyCisgICAgICAgICAgICBpcyBzdG9wcGVkLiBJZiAiRnVsbCBQb3dlciIgaXMgZGVzaXJlZCwgdXNlIHRoZSBzbWVfUmVxdWVzdEZ1bGxQb3dlciBBUEkKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBlSGFsU3RhdHVzIHNtZV9TdG9wQXV0b0JtcHNUaW1lciAoIHRIYWxIYW5kbGUgaEhhbCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUXVlcnlQb3dlclN0YXRlCisgICAgXGJyaWVmICBSZXR1cm5zIHRoZSBjdXJyZW50IHBvd2VyIHN0YXRlIG9mIHRoZSBkZXZpY2UuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSBwUG93ZXJTdGF0ZSAtIHBvaW50ZXIgdG8gbG9jYXRpb24gdG8gcmV0dXJuIHBvd2VyIHN0YXRlCisgICAgXHBhcmFtIHBTd1dsYW5Td2l0Y2hTdGF0ZSAtIHB0ciB0byBsb2NhdGlvbiB0byByZXR1cm4gU1cgV0xBTiBTd2l0Y2ggc3RhdGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX1F1ZXJ5UG93ZXJTdGF0ZSAoCisgICB0SGFsSGFuZGxlIGhIYWwsCisgICB0UG1jUG93ZXJTdGF0ZSAqcFBvd2VyU3RhdGUsCisgICB0UG1jU3dpdGNoU3RhdGUgKnBTd1dsYW5Td2l0Y2hTdGF0ZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfSXNQb3dlclNhdmVFbmFibGVkCisgICAgXGJyaWVmICBDaGVja3MgaWYgdGhlIGRldmljZSBpcyBhYmxlIHRvIGVudGVyIGEgcGFydGljdWxhciBwb3dlciBzYXZlIG1vZGUKKyAgICAgICAgICAgIFRoaXMgZG9lcyBub3QgaW1wbHkgdGhhdCB0aGUgZGV2aWNlIGlzIGluIGEgcGFydGljdWxhciBQUyBtb2RlCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSBwc01vZGUgLSB0aGUgcG93ZXIgc2F2aW5nIG1vZGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIHRBTklfQk9PTEVBTiBzbWVfSXNQb3dlclNhdmVFbmFibGVkKAorICAgdEhhbEhhbmRsZSBoSGFsLAorICAgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JlcXVlc3RGdWxsUG93ZXIKKyAgICBcYnJpZWYgIFJlcXVlc3QgdGhhdCB0aGUgZGV2aWNlIGJlIGJyb3VnaHQgdG8gZnVsbCBwb3dlciBzdGF0ZS4KKyAgICAgICAgICAgIE5vdGUgMTogSWYgImZ1bGxQb3dlclJlYXNvbiIgc3BlY2lmaWNpZWQgaW4gdGhpcyBBUEkgaXMgc2V0IHRvCisgICAgICAgICAgICBlU01FX0ZVTExfUFdSX05FRURFRF9CWV9IREQsIFBNQyB3aWxsIGNsZWFyIGFueSAiYnVmZmVyZWQgd293bCIgcmVxdWVzdHMKKyAgICAgICAgICAgIGFuZCBhbHNvIGNsZWFyIGFueSAiYnVmZmVyZWQgQk1QUyByZXF1ZXN0cyBieSBIREQiLiBBc3N1bXB0aW9uIGlzIHRoYXQgc2luY2UKKyAgICAgICAgICAgIEhERCBpcyByZXF1ZXN0aW5nIGZ1bGwgcG93ZXIsIHdlIG5lZWQgdG8gdW5kbyBhbnkgcHJldmlvdXMgSEREIHJlcXVlc3RzIGZvciAKKyAgICAgICAgICAgIEJNUFMgKHVzaW5nIHNtZV9SZXF1ZXN0Qm1wcykgb3IgV29XTCAodXNpbmcgc21lX0VudGVyV29XTCkuIElmIHRoZSByZWFzb24gaXMKKyAgICAgICAgICAgIHNwZWNpZmllZCBhbnl0aGluZyBvdGhlciB0aGFuIGFib3ZlLCB0aGUgYnVmZmVyZWQgcmVxdWVzdHMgZm9yIEJNUFMgYW5kIFdvV0wKKyAgICAgICAgICAgIHdpbGwgbm90IGJlIGNsZWFyZWQuCisgICAgICAgICAgICBOb3RlIDI6IFJlcXVlc3RpbmcgZnVsbCBwb3dlciAobm8gbWF0dGVyIHdoYXQgdGhlIGZ1bGxQb3dlclJlYXNvbiBpcykgZG9lc24ndAorICAgICAgICAgICAgZGlzYWJsZSB0aGUgImF1dG8gYm1wcyB0aW1lciIgKGlmIGl0IGlzIGVuYWJsZWQpIG9yIGNsZWFyIGFueSAiYnVmZmVyZWQgdWFwc2QKKyAgICAgICAgICAgIHJlcXVlc3QiLgorICAgICAgICAgICAgTm90ZSAzOiBXaGVuIHRoZSBkZXZpY2UgZmluYWxseSBlbnRlcnMgRnVsbCBQb3dlciBQTUMgd2lsbCBzdGFydCBhIHRpbWVyIAorICAgICAgICAgICAgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgaG9sZHMgdHJ1ZToKKyAgICAgICAgICAgIC0gQXV0byBCTVBTIG1vZGUgaXMgZW5hYmxlZAorICAgICAgICAgICAgLSBVYXBzZCByZXF1ZXN0IGlzIHBlbmRpbmcKKyAgICAgICAgICAgIC0gSEREJ3MgcmVxdWVzdCBmb3IgQk1QUyBpcyBwZW5kaW5nCisgICAgICAgICAgICAtIEhERCdzIHJlcXVlc3QgZm9yIFdvV0wgaXMgcGVuZGluZworICAgICAgICAgICAgT24gdGltZXIgZXhwaXJ5IFBNQyB3aWxsIGF0dGVtcHQgdG8gcHV0IHRoZSBkZXZpY2UgaW4gQk1QUyBtb2RlIGlmIGZvbGxvd2luZyAKKyAgICAgICAgICAgIChpbiBhZGRpdGlvbiB0byB0aG9zZSBsaXN0ZWQgYWJvdmUpIGhvbGRzIHRydWU6CisgICAgICAgICAgICAtIFBvbGxpbmcgb2YgYWxsIG1vZHVsZXMgdGhyb3VnaCB0aGUgUG93ZXIgU2F2ZSBDaGVjayByb3V0aW5lIHBhc3NlcworICAgICAgICAgICAgLSBTVEEgaXMgYXNzb2NpYXRlZCB0byBhbiBhY2Nlc3MgcG9pbnQKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICAtIGNhbGxiYWNrUm91dGluZSBDYWxsYmFjayByb3V0aW5lIGludm9rZWQgaW4gY2FzZSBvZiBzdWNjZXNzL2ZhaWx1cmUKKyAgICBccGFyYW0gIC0gY2FsbGJhY2tDb250ZXh0IC0gIENvb2tpZSB0byBiZSBwYXNzZWQgYmFjayBkdXJpbmcgY2FsbGJhY2sKKyAgICBccGFyYW0gIC0gZnVsbFBvd2VyUmVhc29uIC0gUmVhc29uIHdoeSB0aGlzIEFQSSBpcyBiZWluZyBpbnZva2VkLiBTTUUgbmVlZHMgdG8KKyAgICAgICAgICAgICAgZGlzdGluZ3Vpc2ggYmV0d2VlbiBCQVAgYW5kIEhERCByZXF1ZXN0cworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAtIHN0YXR1cyAKKyAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIGRldmljZSBicm91Z2h0IHRvIGZ1bGwgcG93ZXIgc3RhdGUKKyAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIGRldmljZSBjYW5ub3QgYmUgYnJvdWdodCB0byBmdWxsIHBvd2VyIHN0YXRlCisgICAgIGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HIC0gZGV2aWNlIGlzIGJlaW5nIGJyb3VnaHQgdG8gZnVsbCBwb3dlciBzdGF0ZSwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBlSGFsU3RhdHVzIHNtZV9SZXF1ZXN0RnVsbFBvd2VyICgKKyAgIHRIYWxIYW5kbGUgaEhhbCwKKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKSwKKyAgIHZvaWQgKmNhbGxiYWNrQ29udGV4dCwKKyAgIHRSZXF1ZXN0RnVsbFBvd2VyUmVhc29uIGZ1bGxQb3dlclJlYXNvbik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUmVxdWVzdEJtcHMKKyAgICBcYnJpZWYgIFJlcXVlc3QgdGhhdCB0aGUgZGV2aWNlIGJlIHB1dCBpbiBCTVBTIHN0YXRlLiBSZXF1ZXN0IHdpbGwgYmUgCisgICAgICAgICAgICBhY2NlcHRlZCBvbmx5IGlmIEJNUFMgbW9kZSBpcyBlbmFibGVkIGFuZCBwb3dlciBzYXZlIGNoZWNrIHJvdXRpbmUKKyAgICAgICAgICAgIHBhc3Nlcy4gT25seSBIREQgc2hvdWxkIGludm9rZSB0aGlzIEFQSS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICAtIGNhbGxiYWNrUm91dGluZSBDYWxsYmFjayByb3V0aW5lIGludm9rZWQgaW4gY2FzZSBvZiBzdWNjZXNzL2ZhaWx1cmUKKyAgICBccGFyYW0gIC0gY2FsbGJhY2tDb250ZXh0IC0gIENvb2tpZSB0byBiZSBwYXNzZWQgYmFjayBkdXJpbmcgY2FsbGJhY2sKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBkZXZpY2UgaXMgaW4gQk1QUyBzdGF0ZQorICAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIGRldmljZSBjYW5ub3QgYmUgYnJvdWdodCB0byBCTVBTIHN0YXRlCisgICAgICBlSEFMX1NUQVRVU19QTUNfUEVORElORyAtIGRldmljZSBpcyBiZWluZyBicm91Z2h0IHRvIEJNUFMgc3RhdGUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBlSGFsU3RhdHVzIHNtZV9SZXF1ZXN0Qm1wcyAoCisgICB0SGFsSGFuZGxlIGhIYWwsCisgICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyksCisgICB2b2lkICpjYWxsYmFja0NvbnRleHQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gIHNtZV9TZXRESENQVGlsbFBvd2VyQWN0aXZlRmxhZworICAgIFxicmllZiAgU2V0cy9DbGVhcnMgREhDUCByZWxhdGVkIGZsYWcgaW4gUE1DIHRvIGRpc2FibGUvZW5hYmxlIGF1dG8gQk1QUyAKKyAgICAgICAgICAgIGVudHJ5IGJ5IFBNQworICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgIHNtZV9TZXRESENQVGlsbFBvd2VyQWN0aXZlRmxhZyh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggZmxhZyk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TdGFydFVhcHNkCisgICAgXGJyaWVmICBSZXF1ZXN0IHRoYXQgdGhlIGRldmljZSBiZSBwdXQgaW4gVUFQU0Qgc3RhdGUuIElmIHRoZSBkZXZpY2UgaXMgaW4KKyAgICAgICAgICAgIEZ1bGwgUG93ZXIgaXQgd2lsbCBiZSBwdXQgaW4gQk1QUyBtb2RlIGZpcnN0IGFuZCB0aGVuIGludG8gVUFQU0QKKyAgICAgICAgICAgIG1vZGUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgLSBjYWxsYmFja1JvdXRpbmUgQ2FsbGJhY2sgcm91dGluZSBpbnZva2VkIGluIGNhc2Ugb2Ygc3VjY2Vzcy9mYWlsdXJlCisgICAgXHBhcmFtICAtIGNhbGxiYWNrQ29udGV4dCAtICBDb29raWUgdG8gYmUgcGFzc2VkIGJhY2sgZHVyaW5nIGNhbGxiYWNrCisgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gZGV2aWNlIGlzIGluIFVBUFNEIHN0YXRlCisgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gZGV2aWNlIGNhbm5vdCBiZSBicm91Z2h0IHRvIFVBUFNEIHN0YXRlCisgICAgICBlSEFMX1NUQVRVU19QTUNfUEVORElORyAtIGRldmljZSBpcyBiZWluZyBicm91Z2h0IHRvIFVBUFNEIHN0YXRlCisgICAgICBlSEFMX1NUQVRVU19QTUNfRElTQUJMRUQgLSBVQVBTRCBpcyBkaXNhYmxlZCBvciBCTVBTIG1vZGUgaXMgZGlzYWJsZWQKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX1N0YXJ0VWFwc2QgKAorICAgdEhhbEhhbmRsZSBoSGFsLAorICAgdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpLAorICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TdG9wVWFwc2QKKyAgICBcYnJpZWYgIFJlcXVlc3QgdGhhdCB0aGUgZGV2aWNlIGJlIHB1dCBvdXQgb2YgVUFQU0Qgc3RhdGUuIERldmljZSB3aWxsIGJlCisgICAgICAgICAgICBwdXQgaW4gaW4gQk1QUyBzdGF0ZSBhZnRlciBzdG9wIFVBUFNEIGNvbXBsZXRlcy4gQnVmZmVyZWQgcmVxdWVzdHMgZm9yCisgICAgICAgICAgICBVQVBTRCB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgdGhpcy4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAKKyAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBkZXZpY2UgaXMgcHV0IG91dCBvZiBVQVBTRCBhbmQgYmFjayBpbiBCTVBTIHN0YXRlCisgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gZGV2aWNlIGNhbm5vdCBiZSBicm91Z2h0IG91dCBvZiBVQVBTRCBzdGF0ZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX1N0b3BVYXBzZCAodEhhbEhhbmRsZSBoSGFsKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9SZXF1ZXN0U3RhbmRieQorICAgIFxicmllZiAgUmVxdWVzdCB0aGF0IHRoZSBkZXZpY2UgYmUgcHV0IGluIHN0YW5kYnkuIEl0IGlzIEhERCdzIHJlc3BvbnNpYmlsaXR5CisgICAgICAgICAgICB0byBicmluZyB0aGUgY2hpcCB0byBmdWxsIHBvd2VyIGFuZCBkbyBhIGRpc2Njb25uZWN0IGJlZm9yZSBjYWxsaW5nCisgICAgICAgICAgICB0aGlzIEFQSS4gUmVxdWVzdCBmb3Igc3RhbmRieSB3aWxsIGJlIHJlamVjdGVkIGlmIFNUQSBpcyBhc3NvY2lhdGVkCisgICAgICAgICAgICB0byBhbiBBUC4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICAtIGNhbGxiYWNrUm91dGluZSBDYWxsYmFjayByb3V0aW5lIGludm9rZWQgaW4gY2FzZSBvZiBzdWNjZXNzL2ZhaWx1cmUKKyAgICBccGFyYW0gIC0gY2FsbGJhY2tDb250ZXh0IC0gIENvb2tpZSB0byBiZSBwYXNzZWQgYmFjayBkdXJpbmcgY2FsbGJhY2sKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgIAorICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIGRldmljZSBpcyBpbiBTdGFuZGJ5IG1vZGUKKyAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBkZXZpY2UgY2Fubm90IGJlIHB1dCBpbiBzdGFuZGJ5IG1vZGUKKyAgICAgIGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HIC0gZGV2aWNlIGlzIGJlaW5nIHB1dCBpbiBzdGFuZGJ5IG1vZGUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBlSGFsU3RhdHVzIHNtZV9SZXF1ZXN0U3RhbmRieSAoCisgICB0SGFsSGFuZGxlIGhIYWwsCisgICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyksCisgICB2b2lkICpjYWxsYmFja0NvbnRleHQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JlZ2lzdGVyUG93ZXJTYXZlQ2hlY2sKKyAgICBcYnJpZWYgIFJlZ2lzdGVyIGEgcG93ZXIgc2F2ZSBjaGVjayByb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyCisgICAgICAgICAgICB0aGUgZGV2aWNlIGlzIGFib3V0IHRvIGVudGVyIG9uZSBvZiB0aGUgcG93ZXIgc2F2ZSBtb2Rlcy4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBjaGVja1JvdXRpbmUgLSAgUG93ZXIgc2F2ZSBjaGVjayByb3V0aW5lIHRvIGJlIHJlZ2lzdGVyZWQKKyAgICBccGFyYW0gIGNhbGxiYWNrQ29udGV4dCAtICBDb29raWUgdG8gYmUgcGFzc2VkIGJhY2sgZHVyaW5nIGNhbGxiYWNrCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBub3Qgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX1JlZ2lzdGVyUG93ZXJTYXZlQ2hlY2sgKAorICAgdEhhbEhhbmRsZSBoSGFsLCAKKyAgIHRBTklfQk9PTEVBTiAoKmNoZWNrUm91dGluZSkgKHZvaWQgKmNoZWNrQ29udGV4dCksIHZvaWQgKmNoZWNrQ29udGV4dCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfRGVyZWdpc3RlclBvd2VyU2F2ZUNoZWNrCisgICAgXGJyaWVmICBEZXJlZ2lzdGVyIGEgcG93ZXIgc2F2ZSBjaGVjayByb3V0aW5lCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgY2hlY2tSb3V0aW5lIC0gIFBvd2VyIHNhdmUgY2hlY2sgcm91dGluZSB0byBiZSBkZXJlZ2lzdGVyZWQKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzZnVsbHkgZGVyZWdpc3RlcmVkCisgICAgICAgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gbm90IHN1Y2Nlc3NmdWxseSBkZXJlZ2lzdGVyZWQgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX0RlcmVnaXN0ZXJQb3dlclNhdmVDaGVjayAoCisgICB0SGFsSGFuZGxlIGhIYWwsIAorICAgdEFOSV9CT09MRUFOICgqY2hlY2tSb3V0aW5lKSAodm9pZCAqY2hlY2tDb250ZXh0KSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZAorICAgIFxicmllZiAgUmVnaXN0ZXIgYSBjYWxsYmFjayByb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyCisgICAgICAgICAgICB0aGUgZGV2aWNlIGVudGVycyBhIG5ldyBkZXZpY2Ugc3RhdGUgKEZ1bGwgUG93ZXIsIEJNUFMsIFVBUFNEKQorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGNhbGxiYWNrUm91dGluZSAtICBDYWxsYmFjayByb3V0aW5lIHRvIGJlIHJlZ2lzdGVyZWQKKyAgICBccGFyYW0gIGNhbGxiYWNrQ29udGV4dCAtICBDb29raWUgdG8gYmUgcGFzc2VkIGJhY2sgZHVyaW5nIGNhbGxiYWNrCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBub3Qgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX1JlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQgKAorICAgdEhhbEhhbmRsZSBoSGFsLCAKKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIHRQbWNTdGF0ZSBwbWNTdGF0ZSksCisgICB2b2lkICpjYWxsYmFja0NvbnRleHQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0RlcmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZAorICAgIFxicmllZiAgRGVyZWdpc3RlciBhIHJvdXRpbmUgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgZGV2aWNlIHN0YXRlIGNoYW5nZXMKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBjYWxsYmFja1JvdXRpbmUgLSAgQ2FsbGJhY2sgcm91dGluZSB0byBiZSBkZXJlZ2lzdGVyZWQKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzZnVsbHkgZGVyZWdpc3RlcmVkCisgICAgICAgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gbm90IHN1Y2Nlc3NmdWxseSBkZXJlZ2lzdGVyZWQgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX0RlcmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCAoCisgICB0SGFsSGFuZGxlIGhIYWwsIAorICAgdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgdFBtY1N0YXRlIHBtY1N0YXRlKSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfV293bEFkZEJjYXN0UGF0dGVybgorICAgIFxicmllZiAgQWRkIGEgcGF0dGVybiBmb3IgUGF0dGVybiBCeXRlIE1hdGNoaW5nIGluIFdvd2wgbW9kZS4gRmlybXdhcmUgd2lsbAorICAgICAgICAgICAgZG8gYSBwYXR0ZXJuIG1hdGNoIG9uIHRoZXNlIHBhdHRlcm5zIHdoZW4gV293bCBpcyBlbmFibGVkIGR1cmluZyBCTVBTCisgICAgICAgICAgICBtb2RlLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBhdHRlcm4gLSAgUGF0dGVybiB0byBiZSBhZGRlZAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAgICAgICAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAgQ2Fubm90IGFkZCBwYXR0ZXJuCisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTICBSZXF1ZXN0IGFjY2VwdGVkLiAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBlSGFsU3RhdHVzIHNtZV9Xb3dsQWRkQmNhc3RQYXR0ZXJuICgKKyAgIHRIYWxIYW5kbGUgaEhhbCwgCisgICB0cFNpcldvd2xBZGRCY2FzdFB0cm4gcGF0dGVybik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfV293bERlbEJjYXN0UGF0dGVybgorICAgIFxicmllZiAgRGVsZXRlIGEgcGF0dGVybiB0aGF0IHdhcyBhZGRlZCBmb3IgUGF0dGVybiBCeXRlIE1hdGNoaW5nLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBhdHRlcm4gLSAgUGF0dGVybiB0byBiZSBkZWxldGVkCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFICBDYW5ub3QgZGVsZXRlIHBhdHRlcm4KKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIFJlcXVlc3QgYWNjZXB0ZWQuIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX1dvd2xEZWxCY2FzdFBhdHRlcm4gKAorICAgdEhhbEhhbmRsZSBoSGFsLCAKKyAgIHRwU2lyV293bERlbEJjYXN0UHRybiBwYXR0ZXJuKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9FbnRlcldvd2wKKyAgICBcYnJpZWYgIFRoaXMgaXMgdGhlIEFQSSB0byByZXF1ZXN0IGVudHJ5IGludG8gV09XTCBtb2RlLiAKKyAgICAgICAgICAgIFdvV0xBTiB3b3JrcyBvbiB0b3Agb2YgQk1QUyBtb2RlLiBJZiB0aGUgZGV2aWNlIGlzIG5vdCBpbiBCTVBTIG1vZGUsIAorICAgICAgICAgICAgU01FIHdpbGwgd2lsbCBjYWNoZSB0aGUgaW5mb3JtYXRpb24gdGhhdCBXT1dMIGhhcyBiZWVuIHJlcXVlc3RlZCBhbmQKKyAgICAgICAgICAgIGF0dGVtcHQgdG8gcHV0IHRoZSBkZXZpY2UgaW4gQk1QUyBmaXJzdC4gT24gZW50cnkgaW50byBCTVBTLCBTTUUgd2lsbAorICAgICAgICAgICAgZW50ZXIgdGhlIFdPV0wgbW9kZS4KKyAgICAgICAgICAgIE5vdGUgMTogQWZ0ZXIgV29XTCByZXF1ZXN0IGlzIGFjY2VwdGVkLCBJZiBtb2R1bGUgb3RoZXIgdGhhbiBIREQgcmVxdWVzdHMKKyAgICAgICAgICAgIGZ1bGwgcG93ZXIgQkVGT1JFIFdvV0wgcmVxdWVzdCBpcyBjb21wbGV0ZWQsIFBNQyB3aWxsIGJ1ZmZlciB0aGUgV29XTCByZXF1ZXN0CisgICAgICAgICAgICBhbmQgYXR0ZW1wdCB0byBwdXQgdGhlIGNoaXAgaW50byBCTVBTK1dPV0wgYmFzZWQgb24gYSB0aW1lci4KKyAgICAgICAgICAgIE5vdGUgMjogQnVmZmVyZWQgcmVxdWVzdCBmb3IgV29XTCB3aWxsIGJlIGNsZWFyZWQgaW1tZWRpc2F0ZWx5IEFGVEVSICJlbnRlciBXb3dsIgorICAgICAgICAgICAgY29tcGxldGVzIG9yIGlmIEhERCByZXF1ZXN0cyBmdWxsIHBvd2VyIG9yIGlmIHNtZV9FeGl0V29XTCBBUEkgaXMgaW52b2tlZC4KKyAgICAgICAgICAgIE5vdGUgMzogQm90aCBVQVBTRCBhbmQgV09XTCB3b3JrIG9uIHRvcCBvZiBCTVBTLiBPbiBlbnRyeSBpbnRvIEJNUFMsIFNNRQorICAgICAgICAgICAgd2lsbCBnaXZlIHByaW9yaXR5IHRvIFVBUFNEIGFuZCBlbmFibGUgb25seSBVQVBTRCBpZiBib3RoIFVBUFNEIGFuZCBXT1dMCisgICAgICAgICAgICBhcmUgcmVxdWlyZWQuIEN1cnJlbnRseSB0aGVyZSBpcyBubyByZXF1aXJlbWVudCBvciB1c2UgY2FzZSB0byBzdXBwb3J0IFVBUFNECisgICAgICAgICAgICBhbmQgV09XTCBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAgICAgICAgTm90ZSA0LiBSZXF1ZXN0IGZvciBXb1dMIGlzIHJlamVjdGVkIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBVQVBTRCByZXF1ZXN0LgorICAgICAgICAgICAgTm90ZSA1LiBSZXF1ZXN0IGZvciBXb1dMIGlzIHJlamVjdGVkIGlmIEJNUFMgaXMgZGlzYWJsZWQuCisgICAgICAgICAgICAKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBlbnRlcldvd2xDYWxsYmFja1JvdXRpbmUgLSAgQ2FsbGJhY2sgcm91dGluZSBwcm92aWRlZCBieSBIREQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCBmb3Igc3VjY2Vzcy9mYWlsdXJlIG5vdGlmaWNhdGlvbiBieSBTTUUKKyAgICBccGFyYW0gIGVudGVyV293bENhbGxiYWNrQ29udGV4dCAtIEEgY29va2llIHBhc3NlZCBieSBIREQsIHRoYXQgaXMgcGFzc2VkIGJhY2sgdG8gSERECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgdGltZSBvZiBjYWxsYmFjay4KKyAgICBccGFyYW0gIHdha2VSZWFzb25JbmRDQiAtICBDYWxsYmFjayByb3V0aW5lIHByb3ZpZGVkIGJ5IEhERC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIGZvciBXYWtlIFJlYXNvbiBJbmRpY2F0aW9uIGJ5IFNNRQorICAgIFxwYXJhbSAgd2FrZVJlYXNvbkluZENCQ29udGV4dCAtIEEgY29va2llIHBhc3NlZCBieSBIREQsIHRoYXQgaXMgcGFzc2VkIGJhY2sgdG8gSERECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgdGltZSBvZiBjYWxsYmFjay4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIERldmljZSBpcyBhbHJlYWR5IGluIFdvV0xBTiBtb2RlCisgICAgICAgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFICBEZXZpY2UgY2Fubm90IGVudGVyIFdvV0xBTiBtb2RlLgorICAgICAgICAgICAgZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgIFJlcXVlc3QgYWNjZXB0ZWQuIFNNRSB3aWxsIGVuYWJsZSBXT1dMIHdoZW4gQk1QUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIGlzIGVudGVyZWQuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gZUhhbFN0YXR1cyBzbWVfRW50ZXJXb3dsICgKKyAgICB0SGFsSGFuZGxlIGhIYWwsCisgICAgdm9pZCAoKmVudGVyV293bENhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpLAorICAgIHZvaWQgKmVudGVyV293bENhbGxiYWNrQ29udGV4dCwKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgICB2b2lkICgqd2FrZVJlYXNvbkluZENCKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCB0cFNpcldha2VSZWFzb25JbmQgcFdha2VSZWFzb25JbmQpLAorICAgIHZvaWQgKndha2VSZWFzb25JbmRDQkNvbnRleHQsCisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisgICAgdHBTaXJTbWVXb3dsRW50ZXJQYXJhbXMgd293bEVudGVyUGFyYW1zKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9FeGl0V293bAorICAgIFxicmllZiAgVGhpcyBpcyB0aGUgU01FIEFQSSBleHBvc2VkIHRvIEhERCB0byByZXF1ZXN0IGV4aXQgZnJvbSBXb1dMQU4gbW9kZS4gCisgICAgICAgICAgICBTTUUgd2lsbCBpbml0aWF0ZSBleGl0IGZyb20gV29XTEFOIG1vZGUgYW5kIGRldmljZSB3aWxsIGJlIHB1dCBpbiBCTVBTIAorICAgICAgICAgICAgbW9kZS4gQW55IEJ1ZmZlcmVkIHJlcXVlc3QgZm9yIFdvV0wgd2lsbCBiZSBjbGVhcmVkIGFmdGVyIHRoaXMgQVBJLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgIERldmljZSBjYW5ub3QgZXhpdCBXb1dMQU4gbW9kZS4gVGhpcyBjYW4gaGFwcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBpZiB0aGUgcHJldmlvdXMgIkVudGVyIFdPV0wiIHRyYW5zYWN0aW9uIGhhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBldmVuIGNvbXBsZXRlZC4KKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIFJlcXVlc3QgYWNjZXB0ZWQgdG8gZXhpdCBXb1dMQU4gbW9kZS4gCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gZUhhbFN0YXR1cyBzbWVfRXhpdFdvd2wgKHRIYWxIYW5kbGUgaEhhbCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9Sb2FtU2V0S2V5CisKKyAgICBcYnJpZWYgVG8gc2V0IGVuY3J5cHRpb24ga2V5LiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIGNvbm5lY3RlZAorICAgIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBwU2V0S2V5SW5mbyAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0Q3NyU2V0Q29udGV4dEluZm8KKworICAgIFxwYXJhbSBwUm9hbUlkICBVcG9uIHN1Y2Nlc3MgcmV0dXJuLCB0aGlzIGlzIHRoZSBpZCBjYWxsZXIgY2FuIHVzZSB0byBpZGVudGlmeSB0aGUgcmVxdWVzdCBpbiByb2FtY2FsbGJhY2sKKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgU1VDQ0VTUyAgUm9hbSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBpbmRpY2F0ZSBhY3R1YWxseSByZXN1bHRzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFIG9yIFJFU09VUkNFUyAgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVNldEtleSh0SGFsSGFuZGxlLCB0QU5JX1U4IHNlc3Npb25JZCwgdENzclJvYW1TZXRLZXkgKnBTZXRLZXksIHRBTklfVTMyICpwUm9hbUlkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX1JvYW1SZW1vdmVLZXkKKworICAgIFxicmllZiBUbyBzZXQgZW5jcnlwdGlvbiBrZXkuIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBwUmVtb3ZlS2V5IC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHRDc3JSb2FtUmVtb3ZlS2V5CisKKyAgICBccGFyYW0gcFJvYW1JZCAgVXBvbiBzdWNjZXNzIHJldHVybiwgdGhpcyBpcyB0aGUgaWQgY2FsbGVyIGNhbiB1c2UgdG8gaWRlbnRpZnkgdGhlIHJlcXVlc3QgaW4gcm9hbWNhbGxiYWNrCisKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgIFNVQ0NFU1MgIFJvYW0gY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgaW5kaWNhdGUgYWN0dWFsbHkgcmVzdWx0cworCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSBvciBSRVNPVVJDRVMgIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1SZW1vdmVLZXkodEhhbEhhbmRsZSwgdEFOSV9VOCBzZXNzaW9uSWQsIHRDc3JSb2FtUmVtb3ZlS2V5ICpwUmVtb3ZlS2V5LCB0QU5JX1UzMiAqcFJvYW1JZCk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX0dldENvdW50cnlDb2RlCisKKyAgICBcYnJpZWYgVG8gcmV0dXJuIHRoZSBjdXJyZW50IGNvdW50cnkgY29kZS4gSWYgbm8gY291bnRyeSBjb2RlIGlzIGFwcGxpZWQsIGRlZmF1bHQgY291bnRyeSBjb2RlIGlzIAorICAgIHVzZWQgdG8gZmlsbCB0aGUgYnVmZmVyLgorICAgIElmIDExZCBzdXBwb3J0ZWQgaXMgdHVybmVkIG9mZiwgYW4gZXJyb3IgaXMgcmV0dXJuIGFuZCB0aGUgbGFzdCBhcHBsaWVkL2RlZmF1bHQgY291bnRyeSBjb2RlIGlzIHVzZWQuCisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBwQnVmIC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIGZvciByZXR1cm5lZCBjb3VudHJ5IGNvZGUuCisKKyAgICBccGFyYW0gcGJMZW4gIEZvciBpbnB1dCwgdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGhvdyBiaWcgaXMgdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICBVcG9uIHJldHVybiwgdGhpcyBwYXJhbWV0ZXIgaGFzIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIGNvdW50cnkuIElmIHBCdWYKKyAgICAgICAgICAgICAgICAgICBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgICAgICAgICAgICAgICAgICBmYWlsIHN0YXR1cyBhbmQgdGhpcyBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIG51bWJlciB0aGF0IGlzIG5lZWRlZC4KKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgU1VDQ0VTUy4KKworICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUgb3IgUkVTT1VSQ0VTICBUaGUgQVBJIGZpbmlzaGVkIGFuZCBmYWlsZWQuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9HZXRDb3VudHJ5Q29kZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggKnBCdWYsIHRBTklfVTggKnBiTGVuKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX1NldENvdW50cnlDb2RlCisKKyAgICBcYnJpZWYgVG8gY2hhbmdlIHRoZSBjdXJyZW50L2RlZmF1bHQgY291bnRyeSBjb2RlLiAKKyAgICBJZiAxMWQgc3VwcG9ydGVkIGlzIHR1cm5lZCBvZmYsIGFuIGVycm9yIGlzIHJldHVybi4KKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIHBDb3VudHJ5IC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIGZvciB0aGUgY291bnRyeSBjb2RlLgorCisgICAgXHBhcmFtIHBmUmVzdGFydE5lZWRlZCAgQSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5LCB1cG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBpdCBpbmRpY2F0ZXMKKyAgICB3aGV0aGVyIGEgcmVzZXQgaXMgcmVxdWlyZWQuCisKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgIFNVQ0NFU1MuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFIG9yIFJFU09VUkNFUyAgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2V0Q291bnRyeUNvZGUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4ICpwQ291bnRyeSwgdEFOSV9CT09MRUFOICpwZlJlc3RhcnROZWVkZWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1Jlc2V0Q291bnRyeUNvZGVJbmZvcm1hdGlvbgorICAgIFxicmllZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHJlc2V0IHRoZSBjb3VudHJ5IGNvZGUgY3VycmVudCBiZWluZyB1c2VkIGJhY2sgdG8gRUVQUk9NIGRlZmF1bHQKKyAgICB0aGlzIGluY2x1ZGVzIGNoYW5uZWwgbGlzdCBhbmQgcG93ZXIgc2V0dGluZy4gVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKyAgICBccGFyYW0gcGZSZXN0YXJ0TmVlZGVkIC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgc3BhY2UuIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIGl0IGluZGljYXRlcyB3aGV0aGVyIAorICAgIGEgcmVzdGFydCBpcyBuZWVkZWQgdG8gYXBwbHkgdGhlIGNoYW5nZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUmVzZXRDb3VudHJ5Q29kZUluZm9ybWF0aW9uKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9CT09MRUFOICpwZlJlc3RhcnROZWVkZWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0dldFN1cHBvcnRlZENvdW50cnlDb2RlCisgICAgXGJyaWVmIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgY291bnRyeSBjb2RlIGN1cnJlbnQgYmVpbmcgc3VwcG9ydGVkCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IDMgYnl0ZXMsIHVwb24gc3VjY2VzcyByZXR1cm4sIAorICAgIHRoaXMgaGFzIHRoZSBjb3VudHJ5IGNvZGUgbGlzdC4gMyBieXRlcyBmb3IgZWFjaCBjb3VudHJ5IGNvZGUuIFRoaXMgbWF5IGJlIE5VTEwgaWYKKyAgICBjYWxsZXIgd2FudHMgdG8ga25vdyB0aGUgbmVlZGVkIGJ5dGUgY291bnQuCisgICAgXHBhcmFtIHBiTGVuIC0gQ2FsbGVyIGFsbG9jYXRlZCwgYXMgaW5wdXQsIGl0IGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHBCdWYuIFVwb24gc3VjY2VzcyByZXR1cm4sCisgICAgdGhpcyBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHBCdWYuIElmIHBidWYgaXMgTlVMTCwgYXMgaW5wdXQsICpwYkxlbiBzaG91bGQgYmUgMC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0dldFN1cHBvcnRlZENvdW50cnlDb2RlKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgKnBiTGVuKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9HZXRDdXJyZW50UmVndWxhdG9yeURvbWFpbgorICAgIFxicmllZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGdldCB0aGUgY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbi4gVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKyAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIENGRyBpcyBkb3dubG9hZGVkIGFuZCBhbGwgdGhlIGJhbmQvbW9kZSBzZXR0aW5nIGFscmVhZHkgcGFzc2VkIGludG8KKyAgICBTTUUuIFRoZSBmdW5jdGlvbiBmYWlscyBpZiAxMWQgc3VwcG9ydCBpcyB0dXJuZWQgb2ZmLgorICAgIFxwYXJhbSBwRG9tYWluIC0gQ2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGRvbWFpbi4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgIFNVQ0NFU1MuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFIG9yIFJFU09VUkNFUyAgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLiAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0Q3VycmVudFJlZ3VsYXRvcnlEb21haW4odEhhbEhhbmRsZSBoSGFsLCB2X1JFR0RPTUFJTl90ICpwRG9tYWluKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TZXRSZWd1bGF0b3J5RG9tYWluCisgICAgXGJyaWVmIHRoaXMgZnVuY3Rpb24gaXMgdG8gc2V0IHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQ0ZHIGlzIGRvd25sb2FkZWQgYW5kIGFsbCB0aGUgYmFuZC9tb2RlIHNldHRpbmcgYWxyZWFkeSBwYXNzZWQgaW50bworICAgIFNNRS4gVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKyAgICBccGFyYW0gZG9tYWluSWQgLSBpbmRpY2F0ZSB0aGUgZG9tYWluIChkZWZpbmVkIGluIHRoZSBkcml2ZXIpIG5lZWRzIHRvIHNldCB0by4gIAorICAgIFNlZSB2X1JFR0RPTUFJTl90IGZvciBkZWZpbml0aW9uCisgICAgXHBhcmFtIHBmUmVzdGFydE5lZWRlZCAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHNwYWNlLiBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBpdCBpbmRpY2F0ZXMgd2hldGhlciAKKyAgICBhIHJlc3RhcnQgaXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBjaGFuZ2UKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1NldFJlZ3VsYXRvcnlEb21haW4odEhhbEhhbmRsZSBoSGFsLCB2X1JFR0RPTUFJTl90IGRvbWFpbklkLCB0QU5JX0JPT0xFQU4gKnBmUmVzdGFydE5lZWRlZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9HZXRSZWd1bGF0b3J5RG9tYWluRm9yQ291bnRyeQorCisgICAgXGJyaWVmIFRvIHJldHVybiBhIHJlZ3VsYXRvcnkgZG9tYWluIGJhc2Ugb24gYSBjb3VudHJ5IGNvZGUuIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBBUEkuCisKKyAgICBccGFyYW0gcENvdW50cnkgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgZm9yIGlucHV0IGNvdW50cnkgY29kZS4KKworICAgIFxwYXJhbSBwRG9tYWluSWQgIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIGl0IGlzIHRoZSBkb21haW4gdGhhdCBjb3VudHJ5IGJlbG9uZ3MgdG8uCisgICAgSWYgaXQgaXMgTlVMTCwgcmV0dXJuaW5nIHN1Y2Nlc3MgbWVhbnMgdGhhdCB0aGUgY291bnRyeSBjb2RlIGlzIGtub3duLgorCisgICAgXHJldHVybiBlSGFsU3RhdHVzICBTVUNDRVNTLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSBvciBSRVNPVVJDRVMgIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0dldFJlZ3VsYXRvcnlEb21haW5Gb3JDb3VudHJ5KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCAqcENvdW50cnksIHZfUkVHRE9NQUlOX3QgKnBEb21haW5JZCk7CisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfR2V0U3VwcG9ydGVkUmVndWxhdG9yeURvbWFpbnMKKworICAgIFxicmllZiBUbyByZXR1cm4gYSBsaXN0IG9mIHN1cHBvcnRlZCByZWd1bGF0b3J5IGRvbWFpbnMuIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBBUEkuCisKKyAgICBccGFyYW0gcERvbWFpbnMgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgZm9yIHJldHVybmVkIHJlZ3VsYXRvcnkgZG9tYWlucy4KKworICAgIFxwYXJhbSBwTnVtRG9tYWlucyAgRm9yIGlucHV0LCB0aGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgaG93bSBtYW55IGRvbWFpbnMgcERvbWFpbnMgY2FuIGhvbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgVXBvbiByZXR1cm4sIHRoaXMgcGFyYW1ldGVyIGhhcyB0aGUgbnVtYmVyIGZvciBzdXBwb3J0ZWQgZG9tYWlucy4gSWYgcERvbWFpbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlIGZvciBhbGwgdGhlIHN1cHBvcnRlZCBkb21haW5zLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsIHN0YXR1cyBhbmQgdGhpcyBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIG51bWJlciB0aGF0IGlzIG5lZWRlZC4KKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgU1VDQ0VTUy4KKworICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUgb3IgUkVTT1VSQ0VTICBUaGUgQVBJIGZpbmlzaGVkIGFuZCBmYWlsZWQuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9HZXRTdXBwb3J0ZWRSZWd1bGF0b3J5RG9tYWlucyh0SGFsSGFuZGxlIGhIYWwsIHZfUkVHRE9NQUlOX3QgKnBEb21haW5zLCB0QU5JX1UzMiAqcE51bURvbWFpbnMpOworCisvL3NvbWUgc3VwcG9ydCBmdW5jdGlvbnMKK3RBTklfQk9PTEVBTiBzbWVfSXMxMWRTdXBwb3J0ZWQodEhhbEhhbmRsZSBoSGFsKTsKK3RBTklfQk9PTEVBTiBzbWVfSXMxMWhTdXBwb3J0ZWQodEhhbEhhbmRsZSBoSGFsKTsKK3RBTklfQk9PTEVBTiBzbWVfSXNXbW1TdXBwb3J0ZWQodEhhbEhhbmRsZSBoSGFsKTsgCisvL1VwcGVyIGxheWVyIHRvIGdldCB0aGUgbGlzdCBvZiB0aGUgYmFzZSBjaGFubmVscyB0byBzY2FuIGZvciBwYXNzaXZlbHkgMTFkIGluZm8gZnJvbSBjc3IKK2VIYWxTdGF0dXMgc21lX1NjYW5HZXRCYXNlQ2hhbm5lbHMoIHRIYWxIYW5kbGUgaEhhbCwgdENzckNoYW5uZWxJbmZvICogcENoYW5uZWxJbmZvICk7CisKK3R5cGVkZWYgdm9pZCAoICp0U21lQ2hhbmdlQ291bnRyeUNhbGxiYWNrKSh2b2lkICpwQ29udGV4dCk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfQ2hhbmdlQ291bnRyeUNvZGUKKworICAgIFxicmllZiBDaGFuZ2UgQ291bnRyeSBjb2RlIGZyb20gdXBwZXJsYXllciBkdXJpbmcgV0xBTiBkcml2ZXIgb3BlcmF0aW9uLgorICAgICAgICAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgICBccGFyYW0gcENvdW50cnkgTmV3IENvdW50cnkgQ29kZSBTdHJpbmcKKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgU1VDQ0VTUy4KKworICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUgb3IgUkVTT1VSQ0VTICBUaGUgQVBJIGZpbmlzaGVkIGFuZCBmYWlsZWQuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9DaGFuZ2VDb3VudHJ5Q29kZSggdEhhbEhhbmRsZSBoSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTbWVDaGFuZ2VDb3VudHJ5Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcENvdW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFZvc0NvbnRleHQgKTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0J0Y1NpZ25hbEJ0RXZlbnQKKyAgICBcYnJpZWYgIEFQSSB0byBzaWduYWwgQmx1ZXRvb3RoIChCVCkgZXZlbnQgdG8gdGhlIFdMQU4gZHJpdmVyLiBCYXNlZCBvbiB0aGUKKyAgICAgICAgICAgIEJUIGV2ZW50IHR5cGUgYW5kIHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIG9mIExpYnJhIChmdWxsIHBvd2VyLAorICAgICAgICAgICAgQk1QUywgVUFQU0QgZXRjKSwgYXBwcm9wcmlhdGUgQmx1ZXRvb3RoIENvZXhpc3RlbmNlIChCVEMpIHN0cmF0ZWd5CisgICAgICAgICAgICB3b3VsZCBiZSBlbXBsb3llZC4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwQnRjQnRFdmVudCAtICBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdHlwZSB0U21lQnRFdmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGVyIG93bnMgdGhlIG1lbW9yeSBhbmQgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgaXQuCisgICAgXHJldHVybiBWT1NfU1RBVFVTCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAgQlQgRXZlbnQgbm90IHBhc3NlZCB0byBIQUwuIFRoaXMgY2FuIGhhcHBlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkcml2ZXIgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZCBvciBpZiBCVEMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50cyBMYXllciBoYXMgYmVlbiBkaXNhYmxlZC4KKyAgICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgICBCVCBFdmVudCBwYXNzZWQgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBzbWVfQnRjU2lnbmFsQnRFdmVudCAodEhhbEhhbmRsZSBoSGFsLCB0cFNtZUJ0RXZlbnQgcEJ0Y0J0RXZlbnQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0J0Y1NldENvbmZpZworICAgIFxicmllZiAgQVBJIHRvIGNoYW5nZSB0aGUgY3VycmVudCBCbHVldG9vdGggQ29leGlzdGVuY2UgKEJUQykgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW52b2tlZCBvbmx5IGFmdGVyIENGRyBkb3dubG9hZCBoYXMgY29tcGxldGVkLgorICAgICAgICAgICAgQ2FsbGluZyBpdCBhZnRlciBzbWVfSEREUmVhZHlJbmQgaXMgcmVjb21tZW5kZWQuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFNtZUJ0Y0NvbmZpZyAtIFBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNtZUJ0Y0NvbmZpZy4gQ2FsbGVyIG93bnMgdGhlIG1lbW9yeSBhbmQgaXMgcmVzcG9uc2libGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZnJlZWluZyBpdC4KKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFICBDb25maWcgbm90IHBhc3NlZCB0byBIQUwuIAorICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICBDb25maWcgcGFzc2VkIHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgc21lX0J0Y1NldENvbmZpZyAodEhhbEhhbmRsZSBoSGFsLCB0cFNtZUJ0Y0NvbmZpZyBwU21lQnRjQ29uZmlnKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9CdGNHZXRDb25maWcKKyAgICBcYnJpZWYgIEFQSSB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBCbHVldG9vdGggQ29leGlzdGVuY2UgKEJUQykgY29uZmlndXJhdGlvbgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBTbWVCdGNDb25maWcgLSBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdHlwZSB0U21lQnRjQ29uZmlnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxlciBvd25zIHRoZSBtZW1vcnkgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LgorICAgIFxyZXR1cm4gVk9TX1NUQVRVUworICAgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBmYWlsdXJlCisgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgIHN1Y2Nlc3MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgc21lX0J0Y0dldENvbmZpZyAodEhhbEhhbmRsZSBoSGFsLCB0cFNtZUJ0Y0NvbmZpZyBwU21lQnRjQ29uZmlnKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TZXRDZmdQcml2YWN5CisgICAgXGJyaWVmICBBUEkgdG8gc2V0IGNvbmZpZ3VyZSBwcml2YWN5IHBhcmFtZXRlcnMKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwUHJvZmlsZSAtIFBvaW50ZXIgQ1NSIFJvYW0gcHJvZmlsZS4KKyAgICBccGFyYW0gIGZQcml2YWN5IC0gVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHN0YXR1cyBvZiBwcml2YWN5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIFxyZXR1cm4gdm9pZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfU2V0Q2ZnUHJpdmFjeSh0SGFsSGFuZGxlIGhIYWwsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIHRBTklfQk9PTEVBTiBmUHJpdmFjeSk7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfTmVpZ2hib3JSZXBvcnRSZXF1ZXN0CisgICAgXGJyaWVmICBBUEkgdG8gcmVxdWVzdCBuZWlnaGJvciByZXBvcnQuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJybU5laWdoYm9yUmVxIC0gUG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UnJtTmVpZ2hib3JSZXEuIENhbGxlciBvd25zIHRoZSBtZW1vcnkgYW5kIGlzIHJlc3BvbnNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZyZWVpbmcgaXQuCisgICAgXHJldHVybiBWT1NfU1RBVFVTCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIGZhaWx1cmUKKyAgICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgc3VjY2VzcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBzbWVfTmVpZ2hib3JSZXBvcnRSZXF1ZXN0ICh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICB0cFJybU5laWdoYm9yUmVxIHBScm1OZWlnaGJvclJlcSwgdHBScm1OZWlnaGJvclJzcENhbGxiYWNrSW5mbyBjYWxsYmFja0luZm8pOworI2VuZGlmCisKKy8vVGhlIGZvbGxvd2luZyBhcmUgZGVidWcgQVBJcyB0byBzdXBwb3J0IGRpcmVjdCByZWFkL3dyaXRlIHJlZ2lzdGVyL21lbW9yeQorLy9UaGV5IGFyZSBwbGFjZWQgaW4gU01FIGJlY2F1c2UgSFcgY2Fubm90IGJlIGFjY2VzcyB3aGVuIGluIExPV19QT1dFUiBzdGF0ZQorLy9BTkQgbm90IGNvbm5lY3RlZC4gVGhlIGtub3dsZWRnZSBhbmQgc3luY2hyb25pemF0aW9uIGlzIGRvbmUgaW4gU01FCisKKy8vc21lX0RiZ1JlYWRSZWdpc3RlcgorLy9DYWxsZXIgbmVlZHMgdG8gdmFsaWRhdGUgdGhlIGlucHV0IHZhbHVlcworVk9TX1NUQVRVUyBzbWVfRGJnUmVhZFJlZ2lzdGVyKHRIYWxIYW5kbGUgaEhhbCwgdl9VMzJfdCByZWdBZGRyLCB2X1UzMl90ICpwUmVnVmFsdWUpOworCisvL3NtZV9EYmdXcml0ZVJlZ2lzdGVyCisvL0NhbGxlciBuZWVkcyB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgdmFsdWVzCitWT1NfU1RBVFVTIHNtZV9EYmdXcml0ZVJlZ2lzdGVyKHRIYWxIYW5kbGUgaEhhbCwgdl9VMzJfdCByZWdBZGRyLCB2X1UzMl90IHJlZ1ZhbHVlKTsKKworLy9zbWVfRGJnUmVhZE1lbW9yeQorLy9DYWxsZXIgbmVlZHMgdG8gdmFsaWRhdGUgdGhlIGlucHV0IHZhbHVlcworLy9wQnVmIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIGhhcyB0aGUgbGVuZ3RoIG9mIG5MZW4KK1ZPU19TVEFUVVMgc21lX0RiZ1JlYWRNZW1vcnkodEhhbEhhbmRsZSBoSGFsLCB2X1UzMl90IG1lbUFkZHIsIHZfVThfdCAqcEJ1Ziwgdl9VMzJfdCBuTGVuKTsKKworLy9zbWVfRGJnV3JpdGVNZW1vcnkKKy8vQ2FsbGVyIG5lZWRzIHRvIHZhbGlkYXRlIHRoZSBpbnB1dCB2YWx1ZXMKK1ZPU19TVEFUVVMgc21lX0RiZ1dyaXRlTWVtb3J5KHRIYWxIYW5kbGUgaEhhbCwgdl9VMzJfdCBtZW1BZGRyLCB2X1U4X3QgKnBCdWYsIHZfVTMyX3Qgbkxlbik7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisvL3NtZV9HZXRGd1ZlcnNpb24KK1ZPU19TVEFUVVMgc21lX0dldEZ3VmVyc2lvbiAodEhhbEhhbmRsZSBoSGFsLEZ3VmVyc2lvbkluZm8gKnBWZXJzaW9uKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworVk9TX1NUQVRVUyBzbWVfR2V0V2Nuc3NXbGFuQ29tcGlsZWRWZXJzaW9uKHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyVmVyc2lvblR5cGUgKnBWZXJzaW9uKTsKK1ZPU19TVEFUVVMgc21lX0dldFdjbnNzV2xhblJlcG9ydGVkVmVyc2lvbih0SGFsSGFuZGxlIGhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclZlcnNpb25UeXBlICpwVmVyc2lvbik7CitWT1NfU1RBVFVTIHNtZV9HZXRXY25zc1NvZnR3YXJlVmVyc2lvbih0SGFsSGFuZGxlIGhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHZlcnNpb25CdWZmZXJTaXplKTsKK1ZPU19TVEFUVVMgc21lX0dldFdjbnNzSGFyZHdhcmVWZXJzaW9uKHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgdmVyc2lvbkJ1ZmZlclNpemUpOworI2VuZGlmCitlSGFsU3RhdHVzIHNtZV9Sb2FtUmVnaXN0ZXJDYWxsYmFjayh0SGFsSGFuZGxlIGhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDb250ZXh0KTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1TZXRCS0lEQ2FjaGUKKyAgICBcYnJpZWYgVGhlIFNNRSBBUEkgZXhwb3NlZCB0byBIREQgdG8gYWxsb3cgSEREIHRvIHByb3ZkZSBTTUUgdGhlIEJLSUQgCisgICAgY2FuZGlkYXRlIGxpc3QuCisgICAgXHBhcmFtIGhIYWwgLSBIYW5kbGUgdG8gdGhlIEhBTC4gVGhlIEhBTCBoYW5kbGUgaXMgcmV0dXJuZWQgYnkgdGhlIEhBTCBhZnRlciAKKyAgICBpdCBpcyBvcGVuZWQgKGJ5IGNhbGxpbmcgaGFsT3BlbikuCisgICAgXHBhcmFtIHBCS0lEQ2FjaGUgLSBjYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciBwb2ludCB0byBhbiBhcnJheSBvZiB0QmtpZENhY2hlSW5mbworICAgIFxwYXJhbSBudW1JdGVtcyAtIGEgdmFyaWFibGUgdGhhdCBoYXMgdGhlIG51bWJlciBvZiB0QmtpZENhY2hlSW5mbyBhbGxvY2F0ZWQgCisgICAgd2hlbiByZXRydW5pbmcsIHRoaXMgaXMgdGhlIG51bWJlciBvZiBpdGVtcyBwdXQgaW50byBwQktJRENhY2hlCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdCAKKyAgICBiaWcgZW5vdWdoIGFuZCBwTnVtSXRlbXMgaGFzIHRoZSBudW1iZXIgb2YgdEJraWRDYWNoZUluZm8uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtU2V0QktJRENhY2hlKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIHNlc3Npb25JZCwgdEJraWRDYWNoZUluZm8gKnBCS0lEQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBudW1JdGVtcyApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1HZXRCS0lEQ2FjaGUKKyAgICBcYnJpZWYgVGhlIFNNRSBBUEkgZXhwb3NlZCB0byBIREQgdG8gYWxsb3cgSEREIHRvIHJlcXVlc3QgU01FIHRvIHJldHVybiBpdHMgCisgICAgQktJRCBjYWNoZS4KKyAgICBccGFyYW0gaEhhbCAtIEhhbmRsZSB0byB0aGUgSEFMLiBUaGUgSEFMIGhhbmRsZSBpcyByZXR1cm5lZCBieSB0aGUgSEFMIGFmdGVyIAorICAgIGl0IGlzIG9wZW5lZCAoYnkgY2FsbGluZyBoYWxPcGVuKS4KKyAgICBccGFyYW0gcE51bSAtIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaGFzIHRoZSBzcGFjZSBvZiB0aGUgbnVtYmVyIG9mIAorICAgIHRCa2lkQ2FjaGVJbmZvIGFzIGlucHV0LiBVcG9uIHJldHVybmVkLCAqcE51bSBoYXMgdGhlIG5lZWRlZCBudW1iZXIgb2YgZW50cmllcyAKKyAgICBpbiBTTUUgY2FjaGUuCisgICAgXHBhcmFtIHBCa2lkQ2FjaGUgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGNvbnRhaW5zIEJLSUQgY2FjaGUsIGlmIGFueSwgCisgICAgdXBvbiByZXR1cm4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90IAorICAgIGJpZyBlbm91Z2guCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtR2V0QktJRENhY2hlKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgKnBOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCa2lkQ2FjaGVJbmZvICpwQmtpZENhY2hlKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Sb2FtR2V0TnVtQktJRENhY2hlCisgICAgXGJyaWVmIFRoZSBTTUUgQVBJIGV4cG9zZWQgdG8gSEREIHRvIGFsbG93IEhERCB0byByZXF1ZXN0IFNNRSB0byByZXR1cm4gdGhlIAorICAgIG51bWJlciBvZiBCS0lEIGNhY2hlIGVudHJpZXMuCisgICAgXHBhcmFtIGhIYWwgLSBIYW5kbGUgdG8gdGhlIEhBTC4gVGhlIEhBTCBoYW5kbGUgaXMgcmV0dXJuZWQgYnkgdGhlIEhBTCBhZnRlciAKKyAgICBpdCBpcyBvcGVuZWQgKGJ5IGNhbGxpbmcgaGFsT3BlbikuCisgICAgXHJldHVybiB0QU5JX1UzMiAtIHRoZSBudW1iZXIgb2YgQktJRCBjYWNoZSBlbnRyaWVzLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9VMzIgc21lX1JvYW1HZXROdW1CS0lEQ2FjaGUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1UzMiBzZXNzaW9uSWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NjYW5HZXRCS0lEQ2FuZGlkYXRlTGlzdAorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBCS0lEIGNhbmRpZGF0ZSBsaXN0CisgICAgXHBhcmFtIHBCa2lkTGlzdCAtIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHBvaW50IHRvIGFuIGFycmF5IG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgdEJraWRDYW5kaWRhdGVJbmZvCisgICAgXHBhcmFtIHBOdW1JdGVtcyAtIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgbnVtYmVyIG9mIAorICAgICAgICAgICAgICAgICAgICAgICB0QmtpZENhbmRpZGF0ZUluZm8gYWxsb2NhdGVkIHdoZW4gcmV0cnVuaW5nLCB0aGlzIGlzIAorICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIG51bWJlciBuZWVkZWQgb3IgbnVtYmVyIG9mIGl0ZW1zIHB1dCBpbnRvIAorICAgICAgICAgICAgICAgICAgICAgICBwUG1raWRMaXN0CisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaWcgZW5vdWdoIGFuZCBwTnVtSXRlbXMKKyAgICBoYXMgdGhlIG51bWJlciBvZiB0QmtpZENhbmRpZGF0ZUluZm8uCisgICAgXE5vdGU6IHBOdW1JdGVtcyBpcyBhIG51bWJlciBvZiB0QmtpZENhbmRpZGF0ZUluZm8sIAorICAgICAgICAgICBub3Qgc2l6ZW9mKHRCa2lkQ2FuZGlkYXRlSW5mbykgKiBzb21ldGhpbmcKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1NjYW5HZXRCS0lEQ2FuZGlkYXRlTGlzdCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QmtpZENhbmRpZGF0ZUluZm8gKnBCa2lkTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBOdW1JdGVtcyApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfUm9hbVVwZGF0ZUFQV1BTSUUKKworICAgIFxicmllZiBUbyB1cGRhdGUgQVAncyBXUFMgSUUuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBTTUUgQVAgc2Vzc2lvbiBpcyBjcmVhdGVkCisgICAgVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIHBBUFdQU0lFUyAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0Q3NyUm9hbUFQV1BTSUVTCisKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgwpYgU1VDQ0VTUyDCliBSb2FtIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGluZGljYXRlIGFjdHVhbGx5IHJlc3VsdHMKKworICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUgb3IgUkVTT1VSQ0VTIMKWIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZUhhbFN0YXR1cyBzbWVfUm9hbVVwZGF0ZUFQV1BTSUUodEhhbEhhbmRsZSwgdEFOSV9VOCBzZXNzaW9uSWQsIHRTaXJBUFdQU0lFcyAqcEFQV1BTSUVTKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9Sb2FtVXBkYXRlQVBXUEFSU05JRXMKKworICAgIFxicmllZiBUbyB1cGRhdGUgQVAncyBXUEEvUlNOIElFcy4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFNNRSBBUCBzZXNzaW9uIGlzIGNyZWF0ZWQKKyAgICBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBBUEkuCisKKyAgICBccGFyYW0gcEFQU2lyUlNOaWUgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdFNpclJTTmllIHdpdGggV1BTL1JTTiBJRXMKKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyDCliBTVUNDRVNTIMKWIAorCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSBvciBSRVNPVVJDRVMgwpYgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVVwZGF0ZUFQV1BBUlNOSUVzKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRTaXJSU05pZSAqIHBBUFNpclJTTmllKTsKKworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcZm4gc21lX3NlbmRCVEFtcEV2ZW50CisgIFxicmllZiBBUEkgdG8gc2VuZCB0aGUgYnRBTVBzdGF0ZSB0byBGVworICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIFxwYXJhbSAgYnRBbXBFdmVudCAtLSBidEFNUCBldmVudAorICBccmV0dXJuIGVIYWxTdGF0dXMgwpYgU1VDQ0VTUyDClgorCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSBvciBSRVNPVVJDRVMgwpYgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZUhhbFN0YXR1cyBzbWVfc2VuZEJUQW1wRXZlbnQodEhhbEhhbmRsZSBoSGFsLCB0U21lQnRBbXBFdmVudCBidEFtcEV2ZW50KTsKKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2V0SG9zdE9mZmxvYWQKKyAgICBcYnJpZWYgIEFQSSB0byBzZXQgdGhlIGhvc3Qgb2ZmbG9hZCBmZWF0dXJlLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBSZXF1ZXN0IC0gIFBvaW50ZXIgdG8gdGhlIG9mZmxvYWQgcmVxdWVzdC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRIb3N0T2ZmbG9hZCAodEhhbEhhbmRsZSBoSGFsLCB0cFNpckhvc3RPZmZsb2FkUmVxIHBSZXF1ZXN0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TZXRLZWVwQWxpdmUKKyAgICBcYnJpZWYgIEFQSSB0byBzZXQgdGhlIEtlZXAgQWxpdmUgZmVhdHVyZS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwUmVxdWVzdCAtICBQb2ludGVyIHRvIHRoZSBLZWVwIEFsaXZlIHJlcXVlc3QuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRLZWVwQWxpdmUgKHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJLZWVwQWxpdmVSZXEgcFJlcXVlc3QpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfQWJvcnRNYWNTY2FuCisgICAgXGJyaWVmICBBUEkgdG8gY2FuY2VsIE1BQyBzY2FuLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gZmFpbHVyZQorICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICBzdWNjZXNzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9BYm9ydE1hY1NjYW4odEhhbEhhbmRsZSBoSGFsKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgXGZuIHNtZV9HZXRPcGVyYXRpb25DaGFubmVsCisgICBcYnJpZWYgQVBJIHRvIGdldCBjdXJyZW50IGNoYW5uZWwgb24gd2hpY2ggU1RBIGlzIHBhcmtlZAorICAgdGhpcyBmdW5jdGlvbiBnaXZlcyBjaGFubmVsIGluZm9ybWF0aW9uIG9ubHkgb2YgaW5mcmEgc3RhdGlvbiBvciBJQlNTIHN0YXRpb24uCisgICBccGFyYW0gaEhhbCBhbmQgcG9pdGVyIHRvIG1lbW9yeSBsb2NhdGlvbiAKKyAgIFxyZXR1cm5zIGVIQUxfU1RBVFVTX1NVQ0NFU1MKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0T3BlcmF0aW9uQ2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyICpwQ2hhbm5lbCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfUmVnaXN0ZXJNZ3RGcmFtZQorCisgICAgXGJyaWVmIFRvIHJlZ2lzdGVyIG1hbmFnbWVudCBmcmFtZSBvZiBzcGVjaWZpZWQgdHlwZSBhbmQgc3VidHlwZS4gCisgICAgXHBhcmFtIGZyYW1lVHlwZSAtIHR5cGUgb2YgdGhlIGZyYW1lIHRoYXQgbmVlZHMgdG8gYmUgcGFzc2VkIHRvIEhERC4KKyAgICBccGFyYW0gbWF0Y2hEYXRhIC0gZGF0YSB3aGljaCBuZWVkcyB0byBiZSBtYXRjaGVkIGJlZm9yZSBwYXNzaW5nIGZyYW1lIAorICAgICAgICAgICAgICAgICAgICAgICB0byBIREQuIAorICAgIFxwYXJhbSBtYXRjaERhdGFMZW4gLSBMZW5ndGggb2YgbWF0Y2hlZCBkYXRhLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9SZWdpc3Rlck1nbXRGcmFtZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2IGZyYW1lVHlwZSwgdEFOSV9VOCogbWF0Y2hEYXRhLCB0QU5JX1UxNiBtYXRjaExlbik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9EZXJlZ2lzdGVyTWd0RnJhbWUKKworICAgIFxicmllZiBUbyBEZS1yZWdpc3RlciBtYW5hZ21lbnQgZnJhbWUgb2Ygc3BlY2lmaWVkIHR5cGUgYW5kIHN1YnR5cGUuIAorICAgIFxwYXJhbSBmcmFtZVR5cGUgLSB0eXBlIG9mIHRoZSBmcmFtZSB0aGF0IG5lZWRzIHRvIGJlIHBhc3NlZCB0byBIREQuCisgICAgXHBhcmFtIG1hdGNoRGF0YSAtIGRhdGEgd2hpY2ggbmVlZHMgdG8gYmUgbWF0Y2hlZCBiZWZvcmUgcGFzc2luZyBmcmFtZSAKKyAgICAgICAgICAgICAgICAgICAgICAgdG8gSERELiAKKyAgICBccGFyYW0gbWF0Y2hEYXRhTGVuIC0gTGVuZ3RoIG9mIG1hdGNoZWQgZGF0YS4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfRGVyZWdpc3Rlck1nbXRGcmFtZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2IGZyYW1lVHlwZSwgdEFOSV9VOCogbWF0Y2hEYXRhLCB0QU5JX1UxNiBtYXRjaExlbik7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGZuICAgIHNtZV9Db25maWd1cmVSeHBGaWx0ZXIKKworICBcYnJpZWYgCisgICAgU01FIHdpbGwgcGFzcyB0aGlzIHJlcXVlc3QgdG8gbG93ZXIgbWFjIHRvIHNldC9yZXNldCB0aGUgZmlsdGVyIG9uIFJYUCBmb3IKKyAgICBtdWx0aWNhc3QgJiBicm9hZGNhc3QgdHJhZmZpYy4KKworICBccGFyYW0gCisKKyAgICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLiAKKyAKKyAgICBmaWx0ZXJNYXNrLSBDdXJyZW50bHkgdGhlIEFQSSB0YWtlcyBhIDEgb3IgMCAoc2V0IG9yIHJlc2V0KSBhcyBmaWx0ZXIuCisgICAgQmFzaWNhbGx5IHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBmaWx0ZXIgKHRvIGZpbHRlciAiYWxsIiBtY2JjIHRyYWZmaWMpIGJhc2VkCisgICAgb24gdGhpcyBwYXJhbS4gSW4gZnV0dXJlIHdlIGNhbiB1c2UgdGhpcyBhcyBhIG1hc2sgdG8gc2V0IHZhcmlvdXMgdHlwZXMgb2YKKyAgICBmaWx0ZXJzIGFzIHN1Z2dlc3RlZCBiZWxvdzoKKyAgICBGSUxURVJfQUxMX01VTFRJQ0FTVDoKKyAgICBGSUxURVJfQUxMX0JST0FEQ0FTVDoKKyAgICBGSUxURVJfQUxMX01VTFRJQ0FTVF9CUk9BRENBU1Q6CisKKyAgIAorICBccmV0dXJuIGVIYWxTdGF0dXMgICAgCisgIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZUhhbFN0YXR1cyBzbWVfQ29uZmlndXJlUnhwRmlsdGVyKCB0SGFsSGFuZGxlIGhIYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJXbGFuU2V0UnhwRmlsdGVycyAgd2xhblJ4cEZpbHRlclBhcmFtKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGZuICAgIHNtZV9Db25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGUKKworICBcYnJpZWYgCisgICAgU01FIHdpbGwgcGFzcyB0aGlzIHJlcXVlc3QgdG8gbG93ZXIgbWFjIHRvIGR5bmFtaWNhbGx5IGFkanVzdHMgdGhlIGxpc3RlbgorICAgIGludGVydmFsIGJhc2VkIG9uIHRoZSBXTEFOL01TTSBhY3Rpdml0eS4gVGhpcyBmZWF0dXJlIGlzIG5hbWVkIGFzCisgICAgVGVsZXNjb3BpYyBCZWFjb24gd2FrZXVwIGZlYXR1cmUuCisKKyAgXHBhcmFtIAorCisgICAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4gCisgCisgICAgaXNBcHBzQXdha2UtIERlcGljdHMgdGhlIHN0YXRlIG9mIHRoZSBBcHBzIENQVQorCisgICAKKyAgXHJldHVybiBlSGFsU3RhdHVzICAgIAorICAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2VIYWxTdGF0dXMgc21lX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZSggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX0JPT0xFQU4gIGlzQXBwc0F3YWtlKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGZuICAgIHNtZV9Db25maWd1cmVTdXNwZW5kSW5kCisKKyAgXGJyaWVmIAorICAgIFNNRSB3aWxsIHBhc3MgdGhpcyByZXF1ZXN0IHRvIGxvd2VyIG1hYyB0byBJbmRpY2F0ZSB0aGF0IHRoZSB3bGFuIG5lZWRzIHRvIAorICAgIGJlIHN1c3BlbmRlZAorCisgIFxwYXJhbSAKKworICAgIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uIAorIAorICAgIHdsYW5TdXNwZW5kUGFyYW0tIERlcGljdHMgdGhlIHdsYW4gc3VzcGVuZCBwYXJhbXMKKworICAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAKKyAgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitlSGFsU3RhdHVzIHNtZV9Db25maWd1cmVTdXNwZW5kSW5kKCB0SGFsSGFuZGxlIGhIYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpcldsYW5TdXNwZW5kUGFyYW0gIHdsYW5TdXNwZW5kUGFyYW0pOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcZm4gICAgc21lX0NvbmZpZ3VyZVJlc3VtZVJlcQorCisgIFxicmllZiAKKyAgICBTTUUgd2lsbCBwYXNzIHRoaXMgcmVxdWVzdCB0byBsb3dlciBtYWMgdG8gSW5kaWNhdGUgdGhhdCB0aGUgd2xhbiBuZWVkcyB0byAKKyAgICBiZSBSZXN1bWVkCisKKyAgXHBhcmFtIAorCisgICAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4gCisgCisgICAgd2xhblJlc3VtZVBhcmFtLSBEZXBpY3RzIHRoZSB3bGFuIHJlc3VtZSBwYXJhbXMKKworICAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAKKyAgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitlSGFsU3RhdHVzIHNtZV9Db25maWd1cmVSZXN1bWVSZXEoIHRIYWxIYW5kbGUgaEhhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyV2xhblJlc3VtZVBhcmFtICB3bGFuUmVzdW1lUGFyYW0pOworCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX0dldEluZnJhU2Vzc2lvbklkCisKKyAgICBcYnJpZWYgVG8gZ2V0IHRoZSBzZXNzaW9uIElEIGZvciBpbmZyYSBzZXNzaW9uLCBpZiBjb25uZWN0ZWQKKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgICBccmV0dXJuIHNlc3Npb25pZCwgLTEgaWYgaW5mcmEgc2Vzc2lvbiBpcyBub3QgY29ubmVjdGVkCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0QU5JX1M4IHNtZV9HZXRJbmZyYVNlc3Npb25JZCh0SGFsSGFuZGxlIGhIYWwpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfR2V0SW5mcmFPcGVyYXRpb25DaGFubmVsCisKKyAgICBcYnJpZWYgVG8gZ2V0IHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBmb3IgaW5mcmEgc2Vzc2lvbiwgaWYgY29ubmVjdGVkCisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSB0aGUgc2Vzc2lvbklkIHJldHVybmVkIGJ5IHNtZV9PcGVuU2Vzc2lvbi4KKworICAgIFxyZXR1cm4gb3BlcmF0aW5nIGNoYW5uZWwsIDAgaWYgaW5mcmEgc2Vzc2lvbiBpcyBub3QgY29ubmVjdGVkCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0QU5JX1U4IHNtZV9HZXRJbmZyYU9wZXJhdGlvbkNoYW5uZWwoIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX0dldENvbmN1cnJlbnRPcGVyYXRpb25DaGFubmVsCisKKyAgICBcYnJpZWYgVG8gZ2V0IHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBmb3Igb3RoZXIgY29uY3VycmVudCBzZXNzaW9ucywgaWYgY29ubmVjdGVkCisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSBjdXJyZW50UGVyc29uYSAtIHBlcnNvbmEgdGhhdCBpcyB0cnlpbmcgdG8gY29tZSB1cC4KKworICAgIFxyZXR1cm4gb3BlcmF0aW5nIGNoYW5uZWwsIDAgaWYgaW5mcmEgc2Vzc2lvbiBpcyBub3QgY29ubmVjdGVkCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0QU5JX1U4IHNtZV9HZXRDb25jdXJyZW50T3BlcmF0aW9uQ2hhbm5lbCggdEhhbEhhbmRsZSBoSGFsICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfQWJvcnRNYWNTY2FuCisgICAgXGJyaWVmICBBUEkgdG8gY2FuY2VsIE1BQyBzY2FuLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gZmFpbHVyZQorICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICBzdWNjZXNzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9BYm9ydE1hY1NjYW4odEhhbEhhbmRsZSBoSGFsKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9HZXRDZmdWYWxpZENoYW5uZWxzCisgICAgXGJyaWVmICBBUEkgdG8gZ2V0IHZhbGlkIGNoYW5uZWwgbGlzdAorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGFWYWxpZENoYW5uZWxzIC0gIFBvaW50ZXIgdG8gdGhlIHZhbGlkIGNoYW5uZWwgbGlzdAorICAgIFxwYXJhbSAgbGVuIC0gIHZhbGlkIGNoYW5uZWwgbGlzdCBsZW5ndGgKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0dldENmZ1ZhbGlkQ2hhbm5lbHModEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4ICphVmFsaWRDaGFubmVscywgdEFOSV9VMzIgKmxlbik7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TZXRQcmVmZXJyZWROZXR3b3JrTGlzdAorICAgIFxicmllZiAgQVBJIHRvIHNldCB0aGUgUHJlZmVycmVkIE5ldHdvcmsgTGlzdCBPZmZsb2FkIGZlYXR1cmUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJlcXVlc3QgLSAgUG9pbnRlciB0byB0aGUgb2ZmbG9hZCByZXF1ZXN0LgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2V0UHJlZmVycmVkTmV0d29ya0xpc3QgKHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJQTk9TY2FuUmVxIHBSZXF1ZXN0LCB0QU5JX1U4IHNlc3Npb25JZCwgcHJlZmVycmVkTmV0d29ya0ZvdW5kSW5kQ2FsbGJhY2sgY2FsbGJhY2tSb3V0aW5lLCB2b2lkICpjYWxsYmFja0NvbnRleHQgKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TZXRSU1NJRmlsdGVyCisgICAgXGJyaWVmICBBUEkgdG8gc2V0IFJTU0kgRmlsdGVyIGZlYXR1cmUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJlcXVlc3QgLSAgUG9pbnRlciB0byB0aGUgb2ZmbG9hZCByZXF1ZXN0LgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2V0UlNTSUZpbHRlcih0SGFsSGFuZGxlIGhIYWwsIHZfVThfdCByc3NpVGhyZXNob2xkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiBzbWVfUHJlZmVycmVkTmV0d29ya0ZvdW5kSW5kCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBJbnZva2UgUHJlZmVycmVkIE5ldHdvcmsgRm91bmQgSW5kaWNhdGlvbiAKKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKiAgICBwTXNnIC0gZm91bmQgbmV0d29yayBkZXNjcmlwdGlvbgorKiAKKyogUmV0dXJuczogZUhhbFN0YXR1cworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBzbWVfUHJlZmVycmVkTmV0d29ya0ZvdW5kSW5kICh0SGFsSGFuZGxlIGhIYWwsIHZvaWQqIHBNc2cpOworI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NldFBvd2VyUGFyYW1zCisgICAgXGJyaWVmICBBUEkgdG8gc2V0IFBvd2VyIFBhcmFtZXRlcnMgCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcHdQYXJhbXMgLSAgUG9pbnRlciB0byB0aGUgcG93ZXIgcGFyYW1ldGVycyByZXF1ZXN0ZWQuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRQb3dlclBhcmFtcyh0SGFsSGFuZGxlIGhIYWwsIHRTaXJTZXRQb3dlclBhcmFtc1JlcSogcHdQYXJhbXMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NldFR4UGVyVHJhY2tpbmcKKyAgICBcYnJpZWYgIFNldCBUeCBQRVIgdHJhY2tpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFR4UGVyVHJhY2tpbmdQYXJhbSAtIFR4IFBFUiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2V0VHhQZXJUcmFja2luZyAoCisgICB0SGFsSGFuZGxlIGhIYWwsCisgICB2b2lkICgqcENhbGxiYWNrZm4pICh2b2lkICpwQ2FsbGJhY2tDb250ZXh0KSwKKyAgIHZvaWQgKnBDYWxsYmFja0NvbnRleHQsCisgICB0cFNpclR4UGVyVHJhY2tpbmdQYXJhbSBwVHhQZXJUcmFja2luZ1BhcmFtKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JlY2VpdmVGaWx0ZXJTZXRGaWx0ZXIKKyAgICBcYnJpZWYgIEFQSSB0byBzZXQgODAyMyBNdWx0aWNhc3QgQWRkcmVzcyBMaXN0CisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcE11bHRpY2FzdEFkZHJzIC0gUG9pbnRlciB0byB0aGUgTXVsdGljYXN0IEFkZHJlc3MgTGlzdAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfODAyM011bHRpY2FzdExpc3QodEhhbEhhbmRsZSBoSGFsLCB0cFNpclJjdkZsdE1jQWRkckxpc3QgcE11bHRpY2FzdEFkZHJzKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9SZWNlaXZlRmlsdGVyU2V0RmlsdGVyCisgICAgXGJyaWVmICBBUEkgdG8gc2V0IFJlY2VpdmUgUGFja2V0IEZpbHRlcgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBSY3ZQa3RGaWx0ZXJDZmcgLSBSZWNlaXZlIFBhY2tldCBGaWx0ZXIgcGFyYW1ldGVyCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9SZWNlaXZlRmlsdGVyU2V0RmlsdGVyKHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJSY3ZQa3RGaWx0ZXJDZmdUeXBlIHBSY3ZQa3RGaWx0ZXJDZmcpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0dldEZpbHRlck1hdGNoQ291bnQKKyAgICBcYnJpZWYgIEFQSSB0byBnZXQgRDAgUEMgRmlsdGVyIE1hdGNoIENvdW50CisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuIAorICAgIFxwYXJhbSAgY2FsbGJhY2tSb3V0aW5lIC0gQ2FsbGJhY2sgcm91dGluZSBpbnZva2VkIHRvIHJlY2VpdmUgUGFja2V0IENvYWxlc2NpbmcgRmlsdGVyIE1hdGNoIENvdW50CisgICAgXHBhcmFtICBjYWxsYmFja0NvbnRleHQgLSBDb29raWUgdG8gYmUgcGFzc2VkIGJhY2sgZHVyaW5nIGNhbGxiYWNrIAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0RmlsdGVyTWF0Y2hDb3VudCh0SGFsSGFuZGxlIGhIYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJNYXRjaENvdW50Q2FsbGJhY2sgY2FsbGJhY2tSb3V0aW5lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0ICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyCisgICAgXGJyaWVmICBBUEkgdG8gY2xlYXIgUmVjZWl2ZSBQYWNrZXQgRmlsdGVyCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJjdkZsdFBrdENsZWFyUGFyYW0gLSBSZWNlaXZlIFBhY2tldCBGaWx0ZXIgQ2xlYXIgcGFyYW1ldGVyCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9SZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXIodEhhbEhhbmRsZSBoSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUmN2Rmx0UGt0Q2xlYXJQYXJhbSBwUmN2Rmx0UGt0Q2xlYXJQYXJhbSk7CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9Jc0NoYW5uZWxWYWxpZAorICAgIFxicmllZiBUbyBjaGVjayBpZiB0aGUgY2hhbm5lbCBpcyB2YWxpZCBmb3IgY3VycmVudGx5IGVzdGFibGlzaGVkIGRvbWFpbgorICAgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBBUEkuCisKKyAgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gY2hhbm5lbCAtIGNoYW5uZWwgdG8gdmVyaWZ5CisKKyAgICBccmV0dXJuIFRSVUUvRkFMU0UsIFRSVUUgaWYgY2hhbm5lbCBpcyB2YWxpZAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9CT09MRUFOIHNtZV9Jc0NoYW5uZWxWYWxpZCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggY2hhbm5lbCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2V0RnJlcUJhbmQKKyAgICBcYnJpZWYgIFVzZWQgdG8gc2V0IGZyZXF1ZW5jeSBiYW5kLgorICAgIFxwYXJhbSAgaEhhbAorICAgIFxlQmFuZCAgYmFuZCB2YWx1ZSB0byBiZSBjb25maWd1cmVkCisgICAgXC0gcmV0dXJuIGVIYWxTdGF0dXMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1NldEZyZXFCYW5kKHRIYWxIYW5kbGUgaEhhbCwgZUNzckJhbmQgZUJhbmQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0dldEZyZXFCYW5kCisgICAgXGJyaWVmICBVc2VkIHRvIGdldCB0aGUgY3VycmVudCBiYW5kIHNldHRpbmdzLgorICAgIFxwYXJhbSAgaEhhbAorICAgIFxwQmFuZCAgcG9pbnRlciB0byBob2xkIHRoZSBjdXJyZW50IGJhbmQgdmFsdWUKKyAgICBcLSByZXR1cm4gZUhhbFN0YXR1cworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0RnJlcUJhbmQodEhhbEhhbmRsZSBoSGFsLCBlQ3NyQmFuZCAqcEJhbmQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfU2V0VHhQZXJUcmFja2luZworICAgIFxicmllZiAgU2V0IFR4IFBFUiB0cmFja2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwVHhQZXJUcmFja2luZ1BhcmFtIC0gVHggUEVSIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRUeFBlclRyYWNraW5nICgKKyAgIHRIYWxIYW5kbGUgaEhhbCwKKyAgIHZvaWQgKCpwQ2FsbGJhY2tmbikgKHZvaWQgKnBDYWxsYmFja0NvbnRleHQpLAorICAgdm9pZCAqcENhbGxiYWNrQ29udGV4dCwKKyAgIHRwU2lyVHhQZXJUcmFja2luZ1BhcmFtIHBUeFBlclRyYWNraW5nUGFyYW0pOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NldEdUS09mZmxvYWQKKyAgICBcYnJpZWYgIEFQSSB0byBzZXQgR1RLIG9mZmxvYWQgZmVhdHVyZS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwUmVxdWVzdCAtICBQb2ludGVyIHRvIHRoZSBHVEsgb2ZmbG9hZCByZXF1ZXN0LgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2V0R1RLT2ZmbG9hZCAodEhhbEhhbmRsZSBoSGFsLCB0cFNpckd0a09mZmxvYWRQYXJhbXMgcFJlcXVlc3QpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0dldEdUS09mZmxvYWQKKyAgICBcYnJpZWYgIEFQSSB0byBnZXQgR1RLIG9mZmxvYWQgaW5mb3JtYXRpb24uCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJlcXVlc3QgLSAgUG9pbnRlciB0byB0aGUgR1RLIG9mZmxvYWQgcmVzcG9uc2UuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9HZXRHVEtPZmZsb2FkICh0SGFsSGFuZGxlIGhIYWwsIEdUS09mZmxvYWRHZXRJbmZvQ2FsbGJhY2sgY2FsbGJhY2tSb3V0aW5lLCB2b2lkICpjYWxsYmFja0NvbnRleHQgKTsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKworI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUworZUhhbFN0YXR1cyBzbWVfV2FrZVJlYXNvbkluZENhbGxiYWNrICh0SGFsSGFuZGxlIGhIYWwsIHZvaWQqIHBNc2cpOworI2VuZGlmIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NldFR4UGVyVHJhY2tpbmcKKyAgICBcYnJpZWYgIFNldCBUeCBQRVIgdHJhY2tpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFR4UGVyVHJhY2tpbmdQYXJhbSAtIFR4IFBFUiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2V0VHhQZXJUcmFja2luZyAoCisgICB0SGFsSGFuZGxlIGhIYWwsCisgICB2b2lkICgqcENhbGxiYWNrZm4pICh2b2lkICpwQ2FsbGJhY2tDb250ZXh0KSwKKyAgIHZvaWQgKnBDYWxsYmFja0NvbnRleHQsCisgICB0cFNpclR4UGVyVHJhY2tpbmdQYXJhbSBwVHhQZXJUcmFja2luZ1BhcmFtKTsKKworCisvL3JldHVybiBmcmVxdWVuY3kgZm9yIGEgcGFydGljdWxhciBjaGFubmVsCit0QU5JX1UxNiBzbWVfQ2huVG9GcmVxKHRBTklfVTggY2hhbk51bSk7CisKK3RBTklfQk9PTEVBTiBzbWVfSXNDaGFubmVsVmFsaWQodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IGNoYW5uZWwpOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisKK2VIYWxTdGF0dXMgc21lX3AycFJlc2V0U2Vzc2lvbih0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggSEREU2Vzc2lvbklkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9wMnBGbHVzaERldmljZUxpc3QKKyAgICBcYnJpZWYgIFJlbW92ZSBjYWNoZWQgUDJQIHJlc3VsdCBmcm9tIHNjYW4gcmVzdWx0cworICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIEhERFNlc3Npb25JZCAtIEhERCdzIHNlc3Npb25JZC4gQ3VycmVudGx5IHVudXNlZC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfcDJwRmx1c2hEZXZpY2VMaXN0KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBIRERTZXNzaW9uSWQpOworCitlSGFsU3RhdHVzIHNtZV9wMnBHZXRSZXN1bHRGaWx0ZXIodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IEhERFNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwRmlsdGVyKTsKKworI2VuZGlmIC8vI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAorICAgCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NldE1heFR4UG93ZXIKKyAgICBcYnJpZWYgIFVzZWQgdG8gc2V0IHRoZSBNYXhpbXVtIFRyYW5zbWl0IFBvd2VyIGR5bmFtaWNhbGx5LiBOb3RlOiB0aGlzCisgICAgc2V0dGluZyB3aWxsIG5vdCBwZXJzaXN0IG92ZXIgcmVib290cworICAgIFxwYXJhbSAgaEhhbAorICAgIFxwYXJhbSBwQnNzaWQgIEJTU0lEIHRvIHNldCB0aGUgcG93ZXIgY2FwIGZvcgorICAgIFxwYXJhbSBwQnNzaWQgIHBTZWxmTWFjQWRkcmVzcyBzZWxmIE1BQyBBZGRyZXNzCisgICAgXHBhcmFtIHBCc3NpZCAgcG93ZXIgdG8gc2V0IGluIGRCCisgICAgXC0gcmV0dXJuIGVIYWxTdGF0dXMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1NldE1heFR4UG93ZXIodEhhbEhhbmRsZSBoSGFsLCB0U2lyTWFjQWRkciBwQnNzaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciBwU2VsZk1hY0FkZHJlc3MsIHZfUzdfdCBkQik7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfSGlkZVNTSUQKKworICAgIFxicmllZiBFbmFibGUvRGlzYWJsZXMgaGlkZGVuIFNTSUQgZHluYW1pY2FsbHkuIE5vdGU6IHRoaXMgc2V0dGluZyB3aWxsCisgICAgbm90IHBlcnNpc3Qgb3ZlciByZWJvb3RzLgorCisgICAgXHBhcmFtIGhIYWwKKyAgICBccGFyYW0gc2Vzc2lvbklkIAorICAgIFxwYXJhbSBzc2lkSGlkZGVuIDAgLSBCcm9hZGNhc3QgU1NJRCwgMSAtIERpc2FibGUgYnJvYWRjYXN0IFNTSUQKKyAgICBcLSByZXR1cm4gZUhhbFN0YXR1cworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfSGlkZVNTSUQodEhhbEhhbmRsZSBoSGFsLCB2X1U4X3Qgc2Vzc2lvbklkLCB2X1U4X3Qgc3NpZEhpZGRlbik7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX1NldFRtTGV2ZWwKKyAgICBcYnJpZWYgIFNldCBUaGVybWFsIE1pdGlnYXRpb24gTGV2ZWwgdG8gUklWQQorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIG5ld1RNTGV2ZWwgLSBuZXcgVGhlcm1hbCBNaXRpZ2F0aW9uIExldmVsCisgICAgXHBhcmFtICB0bU1vZGUgLSBUaGVybWFsIE1pdGlnYXRpb24gaGFuZGxlIG1vZGUsIGRlZmF1bHQgMAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRUbUxldmVsKHRIYWxIYW5kbGUgaEhhbCwgdl9VMTZfdCBuZXdUTUxldmVsLCB2X1UxNl90IHRtTW9kZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHNtZV9mZWF0dXJlQ2Fwc0V4Y2hhbmdlKCkgLSBTTUUgaW50ZXJmYWNlIHRvIGV4Y2hhbmdlIGNhcGFiaWxpdGllcyBiZXR3ZWVuCisgIEhvc3QgYW5kIEZXLgorCisgIFxwYXJhbSAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorCisgIFxyZXR1cm4gTk9ORQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfZmVhdHVyZUNhcHNFeGNoYW5nZSh0SGFsSGFuZGxlIGhIYWwpOworCisjZW5kaWYgLy8jaWYgIWRlZmluZWQoIF9fU01FX0FQSV9IICkKZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9zbWVfRlRBcGkuaCBiL0NPUkUvU01FL2luYy9zbWVfRlRBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQ2NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvaW5jL3NtZV9GVEFwaS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fU01FX0ZUQVBJX0ggKQorI2RlZmluZSBfX1NNRV9GVEFQSV9ICisKKyNpbmNsdWRlIDxsaW1GVERlZnMuaD4KKyNpbmNsdWRlIDxwYWxUaW1lci5oPgorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcYnJpZWYgbWFjcm9zIGFuZCBwcm90b3R5cGUgZm9yIFNNRSBBUElzCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3R5cGVkZWYgZW51bSBlRlRJRVN0YXRlCit7CisgICAgZUZUX1NUQVJUX1JFQURZLCAgICAgICAgICAgICAgICAvLyBTdGFydCBiZWZvcmUgYW5kIGFmdGVyIDExciBhc3NvYworICAgIGVGVF9BVVRIX1JFUV9SRUFEWSwgICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIHJlY3ZkIHRoZSAxc3Qgb3IgbnRoIGF1dGggcmVxCisgICAgZUZUX1dBSVRfQVVUSDIsICAgICAgICAgICAgICAgICAvLyBTZW50IGF1dGgxIGFuZCB3YWl0aW5nIGF1dGgyCisgICAgZUZUX0FVVEhfQ09NUExFVEUsICAgICAgICAgICAgICAvLyBXZSBhcmUgbm93IHJlYWR5IGZvciBGVCBwaGFzZSwgc2VuZCBhdXRoMSwgcmVjZCBhdXRoMgorICAgIGVGVF9SRUFTU09DX1JFUV9XQUlULCAgICAgICAgICAgLy8gTm93IHdlIGhhdmUgc2VudCBBdXRoIFJzcCB0byB0aGUgc3VwcGxpY2FudCBhbmQgd2FpdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhc3NvYyBSZXEgZnJvbSB0aGUgc3VwcGxpY2FudC4KKyAgICBlRlRfU0VUX0tFWV9XQUlULCAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgcmVjZWl2ZWQgdGhlIFJlYXNzb2MgcmVxdWVzdCBmcm9tIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcGxpY2FudC4gV2FpdGluZyBmb3IgdGhlIGtleXMuCit9IHRGVElFU3RhdGVzOworCisKK3R5cGVkZWYgc3RydWN0IHNGVFNNRUNvbnRleHQKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgICAqYXV0aF9mdF9pZXM7CisgICAgdEFOSV9VMzIgICAgICAgICAgYXV0aF9mdF9pZXNfbGVuZ3RoOworCisgICAgdEFOSV9VOCAgICAgICAgICAgKnJlYXNzb2NfZnRfaWVzOworICAgIHRBTklfVTE2ICAgICAgICAgIHJlYXNzb2NfZnRfaWVzX2xlbmd0aDsKKworICAgIC8vIFByZS1BdXRoIGluZm8KKyAgICB0RlRJRVN0YXRlcyAgICAgICBGVFN0YXRlOyAgICAgICAgICAgICAgIC8vIFRoZSBzdGF0ZSBvZiBGVCBpbiB0aGUgY3VycmVudCAxMXJBc3NvYworICAgIHRTaXJNYWNBZGRyICAgICAgIHByZUF1dGhic3NJZDsgICAgICAgICAgLy8gQlNTSUQgdG8gcHJlYXV0aCB0bworICAgIHRBTklfVTMyICAgICAgICAgIHNtZVNlc3Npb25JZDsKKworICAgIC8vIFNhdmVkIHBGVFByZUF1dGhSc3AKKyAgICB0cFNpckZUUHJlQXV0aFJzcCBwc2F2ZWRGVFByZUF1dGhSc3A7CisKKyAgICAvLyBUaW1lIHRvIHRyaWdnZXIgcmVhc3NvYyBvbmNlIHByZS1hdXRoIGlzIHN1Y2Nlc3NmdWwKKyAgICB0UGFsVGltZXJIYW5kbGUgICBwcmVBdXRoUmVhc3NvY0ludHZsVGltZXI7CisKK30gdGZ0U01FQ29udGV4dCwgKnRwZnRTTUVDb250ZXh0OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFByb3RvdHlwZSBmdW5jdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX0ZUT3Blbih0SGFsSGFuZGxlIGhIYWwpOwordm9pZCBzbWVfRlRDbG9zZSh0SGFsSGFuZGxlIGhIYWwpOwordm9pZCBzbWVfU2V0RlRJRXMoIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRBTklfVTggKmZ0X2llcywgdEFOSV9VMTYgZnRfaWVzX2xlbmd0aCApOworZUhhbFN0YXR1cyBzbWVfRlRVcGRhdGVLZXkoIHRIYWxIYW5kbGUgaEhhbCwgdENzclJvYW1TZXRLZXkgKiBwRlRLZXlJbmZvICk7Cit2b2lkIGNzckZUUHJlQXV0aFJzcFByb2Nlc3NvciggdEhhbEhhbmRsZSBoSGFsLCB0cFNpckZUUHJlQXV0aFJzcCBwRlRQcmVBdXRoUnNwICk7Cit2b2lkIHNtZV9HZXRGVFByZUF1dGhSZXNwb25zZSggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4ICpmdF9pZXMsIHRBTklfVTMyIGZ0X2llc19pcF9sZW4sIHRBTklfVTE2ICpmdF9pZXNfbGVuZ3RoICk7Cit2b2lkIHNtZV9HZXRSSUNJRXMoIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCAqcmljX2llcywgdEFOSV9VMzIgcmljX2llc19pcF9sZW4sIHRBTklfVTMyICpyaWNfaWVzX2xlbmd0aCApOwordm9pZCBzbWVfUHJlYXV0aFJlYXNzb2NJbnR2bFRpbWVyQ2FsbGJhY2sodm9pZCAqY29udGV4dCk7CisKKworI2VuZGlmIC8vI2lmICFkZWZpbmVkKCBfX1NNRV9GVEFQSV9IICkKZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9zbWVfUW9zQXBpLmggYi9DT1JFL1NNRS9pbmMvc21lX1Fvc0FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjE0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9pbmMvc21lX1Fvc0FwaS5oCkBAIC0wLDAgKzEsMzU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworCisjaWYgIWRlZmluZWQoIF9fU01FX1FPU0FQSV9IICkKKyNkZWZpbmUgX19TTUVfUU9TQVBJX0gKKworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgc21lX1Fvc0FwaS5oCisgIAorICBcYnJpZWYgcHJvdG90eXBlIGZvciBTTUUgUW9TIEFQSXMKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ2b3NfbG9jay5oIgorI2luY2x1ZGUgInZvc190cmFjZS5oIgorI2luY2x1ZGUgInZvc19tZW1vcnkuaCIKKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIFFvUyBzdGF0dXMgdHlwZXMgdGhhdCB3b3VsZCBiZSByZXBvcnRlZCB0byBIREQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgIC8vYXN5bmM6IG9uY2UgUEUgbm90aWZpZXMgc3VjY2Vzc2Z1bCBUU1BFQyBuZWdvdGlhdGlvbiwgb3IgQ1NSIG5vdGlmaWVzIGZvcgorICAgLy9zdWNjZXNzZnVsIHJlYXNzb2MsIG5vdGlmaWVzIEhERCB3aXRoIGN1cnJlbnQgUW9TIFBhcmFtcworICAgU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkQgPSAwLCAKKyAgIC8vc3luYzogb25seSB3aGVuIEFwcCBhc2tlZCBmb3IgQVBTRCAmIGl0J3MgYWxyZWFkeSBzZXQgd2l0aCBBQ00gPSAwCisgICBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFksCisgICAvL2JvdGg6IHN5bmMgb3IgYXN5bmM6IGluIGNhc2Ugb2YgYXN5bmMgbm90aWZpZXMgSEREIHdpdGggY3VycmVudCBRb1MgUGFyYW1zCisgICBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUCwgCisgICAvL3N5bmMKKyAgIFNNRV9RT1NfU1RBVFVTX1NFVFVQX0lOVkFMSURfUEFSQU1TX1JTUCwgCisgICAvL3N5bmM6IEFQIGRvZXNuJ3Qgc3VwcG9ydCBRb1MgKFdNTSkKKyAgIFNNRV9RT1NfU1RBVFVTX1NFVFVQX05PVF9RT1NfQVBfUlNQLCAKKyAgIC8vc3luYzogZWl0aGVyIHJlcSBoYXMgYmVlbiBzZW50IGRvd24gdG8gUEUgb3IganVzdCBidWZmZXJlZCBpbiBTTUUKKyAgIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUCwgCisgICAvL2FzeW5jOiBpbiBjYXNlIG9mIGZsb3cgYWdncmVnYXRpb24sIGlmIHRoZSBuZXcgVFNQRUMgbmVnb3RpYXRpb24gaXMgCisgICAvL3N1Y2Nlc3NmdWwsIE9SLCAKKyAgIC8vbm90aWZ5IGV4aXN0aW5nIGZsb3dzIHRoYXQgVFNQRUMgaXMgbW9kaWZpZWQgd2l0aCBjdXJyZW50IFFvUyBQYXJhbXMKKyAgIFNNRV9RT1NfU1RBVFVTX1NFVFVQX01PRElGSUVEX0lORCwKKyAgIC8vc3luYzogbm8gQVBTRCBhc2tlZCBmb3IgJiBBQ00gPSAwCisgICBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUCwgCisgICAvL2FzeW5jOiBJbiBjYXNlIG9mIFVBUFNELCBvbmNlIFBFIG5vdGlmaWVzIHN1Y2Nlc3NmdWwgVFNQRUMgbmVnb3RpYXRpb24sIG9yIAorICAgLy9DU1Igbm90aWZpZXMgZm9yIHN1Y2Nlc3NmdWwgcmVhc3NvYyB0byBTTUUtUW9TLCBub3RpZnkgSEREIGlmIFBNQyBjYW4ndAorICAgLy9wdXQgdGhlIG1vZHVsZSBpbiBVQVBTRCBtb2RlIHJpZ2h0IGF3YXkgKGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HKQorICAgU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9QRU5ESU5HLCAKKyAgIC8vYXN5bmM6IEluIGNhc2Ugb2YgVUFQU0QsIG9uY2UgUEUgbm90aWZpZXMgc3VjY2Vzc2Z1bCBUU1BFQyBuZWdvdGlhdGlvbiwgb3IgCisgICAvL0NTUiBub3RpZmllcyBmb3Igc3VjY2Vzc2Z1bCByZWFzc29jIHRvIFNNRS1Rb1MsIG5vdGlmeSBIREQgaWYgUE1DIGNhbid0CisgICAvL3B1dCB0aGUgbW9kdWxlIGluIFVBUFNEIG1vZGUgYXQgYWxsIChlSEFMX1NUQVRVU19GQUlMVVJFKQorICAgU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9TRVRfRkFJTEVELCAKKworICAgLy9zeW5jOiByZXEgaGFzIGJlZW4gc2VudCBkb3duIHRvIFBFIGluIGNhc2Ugb2YgZGVsdHMgb3IgYWRkdHMgZm9yIHJlbWFpbiAKKyAgIC8vIGZsb3dzLCBPUiBpZiB0aGUgQUMgZG9lc24ndCBoYXZlIEFQU0Qgb3IgQUNNCisgICAvL2FzeW5jOiBvbmNlIHRoZSBkb3duZ3JhZGUgcmVxIGZvciBRb1MgcGFyYW1zIGlzIHN1Y2Nlc3NmdWwKKyAgIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfU1VDQ0VTU19SU1AgPSAxMDAsCisgICAvL2JvdGg6IHN5bmMgb3IgYXN5bmM6IGluIGNhc2Ugb2YgYXN5bmMgbm90aWZpZXMgSEREIHdpdGggY3VycmVudCBRb1MgUGFyYW1zCisgICBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQLAorICAgLy9hc3luYzogQVAgc2VudCBERUxUUyBpbmRpY2F0aW9uCisgICBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX1FPU19MT1NUX0lORCwKKyAgIC8vc3luYzogYW4gYWRkdHMgcmVxIGhhcyBiZWVuIHNlbnQgZG93biB0byBQRSB0byBkb3duZ3JhZGUgdGhlIFFvUyBwYXJhbXMgb3IgCisgICAvLyBqdXN0IGJ1ZmZlcmVkIGluIFNNRQorICAgU01FX1FPU19TVEFUVVNfUkVMRUFTRV9SRVFfUEVORElOR19SU1AsIAorICAgLy9zeW5jCisgICBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0lOVkFMSURfUEFSQU1TX1JTUCwgCisKKyAgIC8vYXN5bmM6IGZvciBRb1MgbW9kaWZ5IHJlcXVlc3QgaWYgbW9kaWZpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwsIG5vdGlmaWVzIEhERCAKKyAgIC8vIHdpdGggY3VycmVudCBRb1MgUGFyYW1zCisgICBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19JTkQgPSAyMDAsCisgICAvL3N5bmM6IG9ubHkgd2hlbiBBcHAgYXNrZWQgZm9yIEFQU0QgJiBpdCdzIGFscmVhZHkgc2V0IHdpdGggQUNNID0gMAorICAgU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSwKKyAgIC8vYm90aDogc3luYyBvciBhc3luYzogaW4gY2FzZSBvZiBhc3luYyBub3RpZmllcyBIREQgd2l0aCBjdXJyZW50IFFvUyBQYXJhbXMKKyAgIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUCwKKyAgIC8vc3luYzogZWl0aGVyIHJlcSBoYXMgYmVlbiBzZW50IGRvd24gdG8gUEUgb3IganVzdCBidWZmZXJlZCBpbiBTTUUKKyAgIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9QRU5ESU5HX1JTUCwKKyAgIC8vc3luYzogbm8gQVBTRCBhc2tlZCBmb3IgJiBBQ00gPSAwCisgICBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1AsIAorICAgLy9zeW5jCisgICBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfSU5WQUxJRF9QQVJBTVNfUlNQLCAKKyAgIC8vYXN5bmM6IEluIGNhc2Ugb2YgVUFQU0QsIG9uY2UgUEUgbm90aWZpZXMgc3VjY2Vzc2Z1bCBUU1BFQyBuZWdvdGlhdGlvbiwgb3IgCisgICAvL0NTUiBub3RpZmllcyBmb3Igc3VjY2Vzc2Z1bCByZWFzc29jIHRvIFNNRS1Rb1MsIG5vdGlmeSBIREQgaWYgUE1DIGNhbid0CisgICAvL3B1dCB0aGUgbW9kdWxlIGluIFVBUFNEIG1vZGUgcmlnaHQgYXdheSAoZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcpCisgICBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9QRU5ESU5HLCAKKyAgIC8vYXN5bmM6IEluIGNhc2Ugb2YgVUFQU0QsIG9uY2UgUEUgbm90aWZpZXMgc3VjY2Vzc2Z1bCBUU1BFQyBuZWdvdGlhdGlvbiwgb3IgCisgICAvL0NTUiBub3RpZmllcyBmb3Igc3VjY2Vzc2Z1bCByZWFzc29jIHRvIFNNRS1Rb1MsIG5vdGlmeSBIREQgaWYgUE1DIGNhbid0CisgICAvL3B1dCB0aGUgbW9kdWxlIGluIFVBUFNEIG1vZGUgYXQgYWxsIChlSEFMX1NUQVRVU19GQUlMVVJFKQorICAgU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfSU5EX0FQU0RfU0VUX0ZBSUxFRCwKKyAgIC8vc3luYzogU1RBIGlzIGhhbmRpbmcgb2ZmIHRvIGEgbmV3IEFQCisgICBTTUVfUU9TX1NUQVRVU19IQU5ESU5HX09GRiA9IDMwMCwKKyAgIC8vYXN5bmM6cG93ZXJzYXZlIG1vZGUgY2hhbmdlZCBieSBQTUMgZnJvbSBVQVBTRCB0byBGdWxsIHBvd2VyCisgICBTTUVfUU9TX1NUQVRVU19PVVRfT0ZfQVBTRF9QT1dFUl9NT0RFX0lORCA9IDQwMCwKKyAgIC8vYXN5bmM6cG93ZXJzYXZlIG1vZGUgY2hhbmdlZCBieSBQTUMgZnJvbSBGdWxsIHBvd2VyIHRvIFVBUFNECisgICBTTUVfUU9TX1NUQVRVU19JTlRPX0FQU0RfUE9XRVJfTU9ERV9JTkQsCisgICAKK31zbWVfUW9zU3RhdHVzVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIFVzZXIgcHJpb3JpdHkgKFVQKSB0eXBlcworICAgCisgICBGcm9tIDgwMi4xRC84MDIuMTFlL1dNTSBzcGVjaWZpY2F0aW9ucyAoYWxsIHJlZmVyIHRvIHNhbWUgdGFibGUpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICBTTUVfUU9TX1dNTV9VUF9CRSAgICAgID0gMCwKKyAgIFNNRV9RT1NfV01NX1VQX0JLICAgICAgPSAxLAorICAgU01FX1FPU19XTU1fVVBfUkVTViAgICA9IDIsICAgIC8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgIFNNRV9RT1NfV01NX1VQX0VFICAgICAgPSAzLAorICAgU01FX1FPU19XTU1fVVBfQ0wgICAgICA9IDQsCisgICBTTUVfUU9TX1dNTV9VUF9WSSAgICAgID0gNSwKKyAgIFNNRV9RT1NfV01NX1VQX1ZPICAgICAgPSA2LAorICAgU01FX1FPU19XTU1fVVBfTkMgICAgICA9IDcsCisKKyAgIFNNRV9RT1NfV01NX1VQX01BWAorCit9c21lX1Fvc1dtbVVwVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIFRTUEVDIGRpcmVjdGlvbnMKKyAgIAorICAgRnJvbSA4MDIuMTFlL1dNTSBzcGVjaWZpY2F0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtCit7CisgICBTTUVfUU9TX1dNTV9UU19ESVJfVVBMSU5LICAgPSAwLAorICAgU01FX1FPU19XTU1fVFNfRElSX0RPV05MSU5LID0gMSwKKyAgIFNNRV9RT1NfV01NX1RTX0RJUl9SRVNWICAgICA9IDIsICAgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICBTTUVfUU9TX1dNTV9UU19ESVJfQk9USCAgICAgPSAzLAorCit9c21lX1Fvc1dtbURpclR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBFbnVtZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBUU1BFQyBhY2sgcG9saWNpZXMuCisgICAKKyAgIEZyb20gODAyLjExIFdNTSBzcGVjaWZpY2F0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0KK3sKKyAgIFNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfTk9STUFMX0FDSyAgID0gMCwKKyAgIFNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfUkVTVjEgPSAxLAorICAgU01FX1FPU19XTU1fVFNfQUNLX1BPTElDWV9SRVNWMiAgICAgPSAyLCAgIC8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgU01FX1FPU19XTU1fVFNfQUNLX1BPTElDWV9IVF9JTU1FRElBVEVfQkxPQ0tfQUNLICAgICA9IDMsCisKK31zbWVfUW9zV21tQWNrUG9saWN5VHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRTIEluZm8gZmllbGQgaW4gdGhlIFdNTSBUU1BFQworICAgCisgICBTZWUgc3VnZ2VzdGl2ZSB2YWx1ZXMgYWJvdmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgdl9VOF90ICAgICAgICAgICAgICBidXJzdF9zaXplX2RlZm47CisgICBzbWVfUW9zV21tQWNrUG9saWN5VHlwZSAgICBhY2tfcG9saWN5OworICAgc21lX1Fvc1dtbVVwVHlwZSAgICB1cDsgICAgICAgIC8qIFVzZXIgcHJpb3JpdHkgICAgICAgICAgICAgICAgICAgICovCisgICB2X1U4X3QgICAgICAgICAgICAgIHBzYjsgICAgICAgLyogcG93ZXItc2F2ZSBiaXQgICAgICAgICAgICAgICAgICAgKi8KKyAgIHNtZV9Rb3NXbW1EaXJUeXBlICAgZGlyZWN0aW9uOyAvKiBEaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAqLworICAgdl9VOF90ICAgICAgICAgICAgICB0aWQ7ICAgICAgIC8qIFRJRCA6IFRvIGJlIGZpbGxlZCB1cCBieSBTTUUtUW9TICovCit9IHNtZV9Rb3NXbW1Uc0luZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRoZSBXTU0gVFNQRUMgRWxlbWVudCAoZnJvbSB0aGUgV01NIHNwZWMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sgCisgIHNtZV9Rb3NXbW1Uc0luZm9UeXBlICAgICAgICAgICAgdHNfaW5mbzsKKyAgdl9VMTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBub21pbmFsX21zZHVfc2l6ZTsKKyAgdl9VMTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtX21zZHVfc2l6ZTsKKyAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2VydmljZV9pbnRlcnZhbDsKKyAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfc2VydmljZV9pbnRlcnZhbDsKKyAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBpbmFjdGl2aXR5X2ludGVydmFsOworICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25faW50ZXJ2YWw7CisgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgc3ZjX3N0YXJ0X3RpbWU7CisgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2RhdGFfcmF0ZTsKKyAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuX2RhdGFfcmF0ZTsKKyAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBwZWFrX2RhdGFfcmF0ZTsKKyAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYnVyc3Rfc2l6ZTsKKyAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9ib3VuZDsKKyAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcGh5X3JhdGU7CisgIHZfVTE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgc3VycGx1c19id19hbGxvd2FuY2U7CisgIHZfVTE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaXVtX3RpbWU7Cit9IHNtZV9Rb3NXbW1Uc3BlY0luZm87CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBBUElzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NDYWxsYmFjaygpIC0gVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIHJlZ2lzdGVyZWQgCisgICBwZXIgZmxvdyB3aGlsZSBIREQgaXMgcmVxdWVzdGluZyBmb3IgUW9TLiBVc2VkIGZvciBhbnkgbm90aWZpY2F0aW9uIGZvciB0aGUgCisgICBmbG93IChpLmUuIHNldHVwIHN1Y2Nlc3MvZmFpbHVyZS9yZWxlYXNlKSB3aGljaCBuZWVkcyB0byBiZSBzZW50IHRvIEhERC4gSERECisgICB3aWxsIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gaW4gdHVybiwgaWYgbmVlZGVkLgorICAKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIFxwYXJhbSBIRERjb250ZXh0IC0gQSBjb29raWUgcGFzc2VkIGJ5IEhERCBkdXJpbmcgUW9TIHNldHVwLCB0byBiZSB1c2VkIGJ5IFNNRSAKKyAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYW55IFFvUyBub3RpZmljYXRpb24gKHRocm91Z2ggdGhlIGNhbGxhYmNrKSB0byBIREQgCisgIFxwYXJhbSBwQ3VycmVudFFvU0luZm8gLSBQb2ludGVyIHRvIHNtZV9Rb3NXbW1Uc3BlY0luZm8gd2hpY2ggY29udGFpbnMgdGhlIFdNTSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTUEVDIHJlbGF0ZWQgaW5mbyBhcyBkZWZpbmVkIGFib3ZlLCBmZWQgYmFjayB0byBIREQKKyAgXHBhcmFtIHN0YXR1cyAtIFRoZSBzdGF0dXMgb2YgdGhlIGZsb3cgcnVubmluZyBvbiBhbiBBQy4gSXQgY291bGQgYmUgb2YgCisgICAgICAgICAgICAgICAgICBzbWVfUW9zU3RhdHVzVHlwZQorICAKKyAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIC0gQ2FsbGJhY2sgaW52b2tlIHN1Y2Nlc3NmdWwuCisgIAorCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlSGFsU3RhdHVzICgqc21lX1Fvc0NhbGxiYWNrKSh0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKiBIRERjb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqIHBDdXJyZW50UW9TSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NTdGF0dXNUeXBlIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBRb3NGbG93SUQpOyAgIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zU2V0dXBSZXEoKSAtIFRoZSBTTUUgUW9TIEFQSSBleHBvc2VkIHRvIEhERCB0byByZXF1ZXN0IGZvciBRb1MgCisgIG9uIGEgcGFydGljdWxhciBBQy4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgbGluayBoYXMgYmVlbiAKKyAgZXN0YWJsaXNoZWQsIGkuZS4gU1RBIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBBUCBldGMuIElmIHRoZSByZXF1ZXN0IGludm9sdmVzIAorICBhZG1pc3Npb24gY29udHJvbCBvbiB0aGUgcmVxdWVzdGVkIEFDLCBIREQgbmVlZHMgdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IAorICBUcmFmZmljIFNwZWNpZmljYXRpb24gKFRTUEVDKSBwYXJhbWV0ZXJzIG90aGVyd2lzZSBTTUUgaXMgZ29pbmcgdG8gdXNlIHRoZQorICBkZWZhdWx0IHBhcmFtcy4KKyAgCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICBccGFyYW0gc2Vzc2lvbklkIC0gc2Vzc2lvbklkIHJldHVybmVkIGJ5IHNtZV9PcGVuU2Vzc2lvbi4gQ3VycmVudCBRT1MgY29kZSBkb2Vzbid0IAorICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBtdWx0aXBsZSBzZXNzaW9uLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZmFpbHVyZSB3aGVuIGRpZmZlcmVudAorICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkIGlzIHBhc3NlZCBpbiBiZWZvcmUgY2FsbGluZyBzbWVfUW9zUmVsZWFzZVJlcS4KKyAgXHBhcmFtIHBRb1NJbmZvIC0gUG9pbnRlciB0byBzbWVfUW9zV21tVHNwZWNJbmZvIHdoaWNoIGNvbnRhaW5zIHRoZSBXTU0gVFNQRUMKKyAgICAgICAgICAgICAgICAgICAgcmVsYXRlZCBpbmZvIGFzIGRlZmluZWQgYWJvdmUsIHByb3ZpZGVkIGJ5IEhERAorICBccGFyYW0gUW9TQ2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgd2hpY2ggaXMgcmVnaXN0ZXJlZCBwZXIgZmxvdyB3aGlsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGluZyBmb3IgUW9TLiBVc2VkIGZvciBhbnkgbm90aWZpY2F0aW9uIGZvciB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgIGZsb3cgKGkuZS4gc2V0dXAgc3VjY2Vzcy9mYWlsdXJlL3JlbGVhc2UpIHdoaWNoIG5lZWRzIHRvIAorICAgICAgICAgICAgICAgICAgICAgICBiZSBzZW50IHRvIEhERAorICBccGFyYW0gSEREY29udGV4dCAtIEEgY29va2llIHBhc3NlZCBieSBIREQgdG8gYmUgdXNlZCBieSBTTUUgZHVyaW5nIGFueSBRb1MgCisgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uICh0aHJvdWdoIHRoZSBjYWxsYWJjaykgdG8gSEREIAorICBccGFyYW0gVVBUeXBlIC0gVXNlZnVsIG9ubHkgaWYgSEREIG9yIGFueSBvdGhlciB1cHBlciBsYXllciBtb2R1bGUgKEJBUCBldGMuKQorICAgICAgICAgICAgICAgICAgbG9va2luZyBmb3IgaW1wbGljaXQgUW9TIHNldHVwLCBpbiB0aGF0IAorICAgICAgICAgICAgICAgICAgY2FzZSwgdGhlIHBRb1NJbmZvIHdpbGwgYmUgTlVMTCAmIFNNRSB3aWxsIGtub3cgYWJvdXQgdGhlIEFDCisgICAgICAgICAgICAgICAgICAoZnJvbSB0aGUgVVAgcHJvdmlkZWQgaW4gdGhpcyBwYXJhbSkgUW9TIGlzIHJlcXVlc3RlZCBvbgorICBccGFyYW0gcFFvc0Zsb3dJRCAtIElkZW50aWZpY2F0aW9uIHBlciBmbG93IHJ1bm5pbmcgb24gZWFjaCBBQyBnZW5lcmF0ZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgU01FLiAKKyAgICAgICAgICAgICAgICAgICAgIEl0IGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgUW9TIHNldHVwIGZvciB0aGUgZmxvdyBpcyAKKyAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgICAgICAgIAorICBccmV0dXJuIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1MgLSBTZXR1cCByZXF1ZXN0IHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkuCisgIAorICAgICAgICAgIE90aGVyIHN0YXR1cyBtZWFucyBTZXR1cCByZXF1ZXN0IGZhaWxlZCAgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc21lX1Fvc1N0YXR1c1R5cGUgc21lX1Fvc1NldHVwUmVxKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwUW9TSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zQ2FsbGJhY2sgUW9TQ2FsbGJhY2ssIHZvaWQgKiBIRERjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NXbW1VcFR5cGUgVVBUeXBlLCB2X1UzMl90ICogcFFvc0Zsb3dJRCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NNb2RpZnlSZXEoKSAtIFRoZSBTTUUgUW9TIEFQSSBleHBvc2VkIHRvIEhERCB0byByZXF1ZXN0IGZvciAKKyAgbW9kaWZpY2F0aW9uIG9mIGNlcnRhaW4gUW9TIHBhcmFtcyBvbiBhIGZsb3cgcnVubmluZyBvbiBhIHBhcnRpY3VsYXIgQUMuIAorICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYSBsaW5rIGhhcyBiZWVuIGVzdGFibGlzaGVkLCBpLmUuIFNUQSBpcyAKKyAgYXNzb2NpYXRlZCB3aXRoIGFuIEFQIGV0Yy4gJiBhIFFvUyBzZXR1cCBoYXMgYmVlbiBzdWNjZXNmdWwgZm9yIHRoYXQgZmxvdy4gCisgIElmIHRoZSByZXF1ZXN0IGludm9sdmVzIGFkbWlzc2lvbiBjb250cm9sIG9uIHRoZSByZXF1ZXN0ZWQgQUMsIEhERCBuZWVkcyB0byAKKyAgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IFRyYWZmaWMgU3BlY2lmaWNhdGlvbiAoVFNQRUMpIHBhcmFtZXRlcnMgJiBTTUUgbWlnaHQKKyAgc3RhcnQgdGhlIHJlbmVnb3RpYXRpb24gcHJvY2VzcyB0aHJvdWdoIEFERFRTLgorICAKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIFxwYXJhbSBwUW9TSW5mbyAtIFBvaW50ZXIgdG8gc21lX1Fvc1dtbVRzcGVjSW5mbyB3aGljaCBjb250YWlucyB0aGUgV01NIFRTUEVDCisgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgaW5mbyBhcyBkZWZpbmVkIGFib3ZlLCBwcm92aWRlZCBieSBIREQKKyAgXHBhcmFtIFFvc0Zsb3dJRCAtIElkZW50aWZpY2F0aW9uIHBlciBmbG93IHJ1bm5pbmcgb24gZWFjaCBBQyBnZW5lcmF0ZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgU01FLiAKKyAgICAgICAgICAgICAgICAgICAgIEl0IGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgUW9TIHNldHVwIGZvciB0aGUgZmxvdyBoYXMgCisgICAgICAgICAgICAgICAgICAgICBiZWVuIHN1Y2Nlc3NmdWwgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgCisgIFxyZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTUyAtIE1vZGlmaWNhdGlvbiByZXF1ZXN0IHByb2Nlc3NlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5LgorICAKKyAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgcmVxdWVzdCBmYWlsZWQgICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3NtZV9Rb3NTdGF0dXNUeXBlIHNtZV9Rb3NNb2RpZnlSZXEodEhhbEhhbmRsZSBoSGFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqIHBRb1NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IFFvc0Zsb3dJRCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NSZWxlYXNlUmVxKCkgLSBUaGUgU01FIFFvUyBBUEkgZXhwb3NlZCB0byBIREQgdG8gcmVxdWVzdCBmb3IgCisgIHJlbGVhc2luZyBhIFFvUyBmbG93IHJ1bm5pbmcgb24gYSBwYXJ0aWN1bGFyIEFDLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSAKKyAgY2FsbGVkIG9ubHkgaWYgYSBRb1MgaXMgc2V0IHVwIHdpdGggYSB2YWxpZCBGbG93SUQuIEhERCBzb3VsZCBpbnZva2UgdGhpcyAKKyAgQVBJIG9ubHkgaWYgYW4gZXhwbGljaXQgcmVxdWVzdCBmb3IgUW9TIHJlbGVhc2UgaGFzIGNvbWUgZnJvbSBBcHBsaWNhdGlvbiAKKyAgCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICBccGFyYW0gUW9zRmxvd0lEIC0gSWRlbnRpZmljYXRpb24gcGVyIGZsb3cgcnVubmluZyBvbiBlYWNoIEFDIGdlbmVyYXRlZCBieSBTTUUgCisgICAgICAgICAgICAgICAgICAgICBJdCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIFFvUyBzZXR1cCBmb3IgdGhlIGZsb3cgaXMgCisgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsCisgIAorICBccmV0dXJuIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfU1VDQ0VTUyAtIFJlbGVhc2UgcmVxdWVzdCBwcm9jZXNzZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5LgorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfUW9zUmVsZWFzZVJlcSh0SGFsSGFuZGxlIGhIYWwsIHZfVTMyX3QgUW9zRmxvd0lEKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc0lzVFNJbmZvQWNrUG9saWN5VmFsaWQoKSAtIFRoZSBTTUUgUW9TIEFQSSBleHBvc2VkIHRvIEhERCB0byAKKyAgY2hlY2sgaWYgVFMgaW5mbyBhY2sgcG9saWN5IGZpZWxkIGNhbiBiZSBzZXQgdG8gIkhULWltbWVkaWF0ZSBibG9jayBhY2tub3dsZWRnZW1lbnQiIAorICAKKyAgXHBhcmFtIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIFxwYXJhbSBwUW9TSW5mbyAtIFBvaW50ZXIgdG8gc21lX1Fvc1dtbVRzcGVjSW5mbyB3aGljaCBjb250YWlucyB0aGUgV01NIFRTUEVDCisgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgaW5mbywgcHJvdmlkZWQgYnkgSERECisgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uSWQgcmV0dXJuZWQgYnkgc21lX09wZW5TZXNzaW9uLgorICAKKyAgXHJldHVybiBWT1NfVFJVRSAtIEN1cnJlbnQgQXNzb2NpYXRpb24gaXMgSFQgYXNzb2NpYXRpb24gYW5kIHNvIFRTIGluZm8gYWNrIHBvbGljeQorICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHNldCB0byAiSFQtaW1tZWRpYXRlIGJsb2NrIGFja25vd2xlZGdlbWVudCIKKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9CT09MX3Qgc21lX1Fvc0lzVFNJbmZvQWNrUG9saWN5VmFsaWQodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICBzbWVfUW9zV21tVHNwZWNJbmZvICogcFFvU0luZm8sCisgICAgdl9VOF90IHNlc3Npb25JZCk7CisKKyNlbmRpZiAvLyNpZiAhZGVmaW5lZCggX19TTUVfUU9TQVBJX0ggKQpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvaW5jL3NtZV9Scm1BcGkuaCBiL0NPUkUvU01FL2luYy9zbWVfUnJtQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxMDViMgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL2luYy9zbWVfUnJtQXBpLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKworI2lmICFkZWZpbmVkKCBfX1NNRVJSTUFQSV9IICkKKyNkZWZpbmUgX19TTUVSUk1BUElfSAorCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBzbWVfUnJtQXBpLmgKKyAgCisgIFxicmllZiBwcm90b3R5cGUgZm9yIFNNRSBSUk0gQVBJcworICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInZvc19sb2NrLmgiCisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisjaW5jbHVkZSAidm9zX21lbW9yeS5oIgorI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgInNpckFwaS5oIgorI2luY2x1ZGUgInNtZUludGVybmFsLmgiCisjaW5jbHVkZSAic21lUnJtSW50ZXJuYWwuaCIKKworCisvL0FQSXMKK2VIYWxTdGF0dXMgc21lX1JybU1zZ1Byb2Nlc3NvciggdHBBbmlTaXJHbG9iYWwgcE1hYywgIHZfVTE2X3QgbXNnX3R5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwTXNnQnVmKTsKKworVk9TX1NUQVRVUyBycm1DbG9zZSAodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitWT1NfU1RBVFVTIHJybVJlYWR5ICh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK1ZPU19TVEFUVVMgcnJtT3BlbiAodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitWT1NfU1RBVFVTIHJybUNoYW5nZURlZmF1bHRDb25maWdQYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFJybUNvbmZpZ1BhcmFtIHBScm1Db25maWcpOworVk9TX1NUQVRVUyBzbWVfUnJtTmVpZ2hib3JSZXBvcnRSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc2Vzc2lvbklkLCB0cFJybU5laWdoYm9yUmVxIHBOZWlnaGJvclJlcSwgdHBScm1OZWlnaGJvclJzcENhbGxiYWNrSW5mbyBjYWxsYmFja0luZm8pOworCit0UnJtTmVpZ2hib3JSZXBvcnREZXNjKiBzbWVScm1HZXRGaXJzdEJzc0VudHJ5RnJvbU5laWdoYm9yQ2FjaGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordFJybU5laWdoYm9yUmVwb3J0RGVzYyogc21lUnJtR2V0TmV4dEJzc0VudHJ5RnJvbU5laWdoYm9yQ2FjaGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwUnJtTmVpZ2hib3JSZXBvcnREZXNjIHBCc3NFbnRyeSk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9pbmMvc21zRGVidWcuaCBiL0NPUkUvU01FL2luYy9zbXNEZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTE0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9pbmMvc21zRGVidWcuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICogIAorCisgIAorICAgIFxmaWxlIGNzc0RlYnVnLmgKKyAgCisgICAgRGVmaW5lIGRlYnVnIGxvZyBpbnRlcmZhY2UgZm9yIFNNUy4KKyAgCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZAorIAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAgIAorI2lmbmRlZiBTTVNfREVCVUdfSF9fCisjZGVmaW5lIFNNU19ERUJVR19IX18KKworLy8jaW5jbHVkZSA8c3RkaW8uaD4KKy8vI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJzaXJEZWJ1Zy5oIgorCit2b2lkIHNtc0xvZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBsb2dsZXZlbCwgY29uc3QgY2hhciAqcFN0cmluZywuLi4pOyAKKworI2VuZGlmIC8vIF9fSEFMX0RFQlVHX0hfXwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvaW5jL3dsYW5fcHNfd293X2RpYWcuaCBiL0NPUkUvU01FL2luYy93bGFuX3BzX3dvd19kaWFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5MTkyMwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL2luYy93bGFuX3BzX3dvd19kaWFnLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9XTEFOX1BTX1dPV19ESUFHX0hfCisjZGVmaW5lIF9XTEFOX1BTX1dPV19ESUFHX0hfCisKKworI2luY2x1ZGUgInZvc19kaWFnX2NvcmVfZXZlbnQuaCIKKyNpbmNsdWRlICJ2b3NfZGlhZ19jb3JlX2xvZy5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAKKwordHlwZWRlZiBlbnVtCit7CisgICBXTEFOX0JNUFNfRU5URVJfUkVRID0wLAorICAgV0xBTl9VQVBTRF9TVEFSVF9SRVEgPTEsCisgICBXTEFOX1VBUFNEX1NUT1BfUkVRID0yLAorICAgV0xBTl9FTlRFUl9TVEFOREJZX1JFUSA9MywKKyAgIFdMQU5fRU5URVJfREVFUF9TTEVFUF9SRVEgPTQsCisgICBXTEFOX1NUQVJUX0JNUFNfQVVUT19USU1FUl9SRVEgPTUsCisgICBXTEFOX1NUT1BfQk1QU19BVVRPX1RJTUVSX1JFUSA9NiwKKyAgIFdMQU5fSU1QU19FTlRFUl9SRVEgPTcsCisgICBXTEFOX0VOVEVSX0ZVTExfUE9XRVJfUkVRID04LAorICAgV0xBTl9QTUNfQ1VSUkVOVF9TVEFURSA9OSwKKyAgIFdMQU5fUFNfTU9ERV9FTkFCTEVfUkVRID0xMCwKKyAgIFdMQU5fUFNfTU9ERV9ESVNBQkxFX1JFUSA9MTEsCisgICBXTEFOX1dJTk1PQl9EX1BPV0VSX1NUQVRFID0xMiwKKyAgIFdMQU5fQk1QU19EVElNX1BFUklPRCA9MTMsCisgICBXTEFOX0JNUFNfRklOQUxfTEkgPTE0LAorICAgV0xBTl9CTVBTX1NFVF9DT05GSUcgPTE1LAorCit9IHdsYW5fcHNfZXZ0X3N1YnR5cGVfdDsKKworLy8gbWFwcyBkaXJlY3RseSB0byBlUmVxdWVzdEZ1bGxQb3dlclJlYXNvbgordHlwZWRlZiBlbnVtCit7CisgICBXTEFOX01JU1NFRF9CRUFDT05fSU5EX1JDVkQsICAgIC8qIFBFIHJlY2VpdmVkIGEgTUFYX01JU1NFRF9CRUFDT05fSU5EICovCisgICBXTEFOX0JNUFNfU1RBVFVTX0lORF9SQ1ZELCAgICAgIC8qIFBFIHJlY2VpdmVkIGEgU0lSX0hBTF9CTVBTX1NUQVRVU19JTkQgKi8KKyAgIFdMQU5fQk1QU19NT0RFX0RJU0FCTEVELCAgICAgICAgLyogQk1QUyBtb2RlIHdhcyBkaXNhYmxlZCBieSBIREQgaW4gU01FICovCisgICBXTEFOX0xJTktfRElTQ09OTkVDVEVEX0JZX0hERCwgIC8qIExpbmsgaGFzIGJlZW4gZGlzY29ubmVjdGVkIHJlcXVlc3RlZCBieSBIREQgKi8KKyAgIFdMQU5fTElOS19ESVNDT05ORUNURURfQllfT1RIRVIsLyogRGlzY29ubmVjdCBkdWUgdG8gbGlua2xvc3Qgb3IgcmVxdWVzdGVkIGJ5IHBlZXIgKi8KKyAgIFdMQU5fRlVMTF9QV1JfTkVFREVEX0JZX0hERCwgICAgLyogSEREIHJlcXVlc3QgZnVsbCBwb3dlciBmb3Igc29tZSByZWFzb24gKi8KKyAgIFdMQU5fRlVMTF9QV1JfTkVFREVEX0JZX0JBUCwgICAgLyogQkFQIHJlcXVlc3QgZnVsbCBwb3dlciBmb3IgQlRfQU1QICovCisgICBXTEFOX0ZVTExfUFdSX05FRURFRF9CWV9DU1IsICAgIC8qIENTUiByZXF1ZXN0cyBmdWxsIHBvd2VyICovCisgICBXTEFOX0ZVTExfUFdSX05FRURFRF9CWV9RT1MsICAgIC8qIFFPUyByZXF1ZXN0cyBmdWxsIHBvd2VyICovCisgICBXTEFOX1JFQVNPTl9PVEhFUiAgICAgICAgICAgICAgIC8qIE5vIHNwZWNpZmljIHJlYXNvbi4gR2VuZXJhbCByZWFzb24gY29kZSAqLyAKKworfSB3bGFuX3BzX2Z1bGxfcG93ZXJfcmVxdWVzdF9yZWFzb25fdDsKKworLy8gbWFwcyBkaXJlY3RseSB0byBlUG1jU3RhdGUKK3R5cGVkZWYgZW51bSAKK3sKKyAgIFdMQU5fUE1DX1NUT1BQRUQsIC8qIFBNQyBpcyBzdG9wcGVkICovCisgICBXTEFOX1BNQ19GVUxMX1BPV0VSLCAvKiBmdWxsIHBvd2VyICovCisgICBXTEFOX1BNQ19MT1dfUE9XRVIsIC8qIGxvdyBwb3dlciAqLworICAgV0xBTl9QTUNfUkVRVUVTVF9JTVBTLCAgLyogcmVxdWVzdGluZyBJTVBTICovCisgICBXTEFOX1BNQ19JTVBTLCAgLyogaW4gSU1QUyAqLworICAgV0xBTl9QTUNfUkVRVUVTVF9CTVBTLCAgLyogcmVxdWVzdGluZyBCTVBTICovCisgICBXTEFOX1BNQ19CTVBTLCAgLyogaW4gQk1QUyAqLworICAgV0xBTl9QTUNfUkVRVUVTVF9GVUxMX1BPV0VSLCAgLyogcmVxdWVzdGluZyBmdWxsIHBvd2VyICovCisgICBXTEFOX1BNQ19SRVFVRVNUX1NUQVJUX1VBUFNELCAgLyogcmVxdWVzdGluZyBTdGFydCBVQVBTRCAqLworICAgV0xBTl9QTUNfUkVRVUVTVF9TVE9QX1VBUFNELCAgLyogcmVxdWVzdGluZyBTdG9wIFVBUFNEICovCisgICBXTEFOX1BNQ19VQVBTRCwgICAgICAgICAgIC8qIGluIFVBUFNEICovCisgICBXTEFOX1BNQ19SRVFVRVNUX1NUQU5EQlksICAvKiByZXF1ZXN0aW5nIHN0YW5kYnkgbW9kZSAqLworICAgV0xBTl9QTUNfU1RBTkRCWSwgIC8qIGluIHN0YW5kYnkgbW9kZSAqLworICAgV0xBTl9QTUNfUkVRVUVTVF9FTlRFUl9XT1dMLCAvKiByZXF1ZXN0aW5nIGVudGVyIFdPV0wgKi8KKyAgIFdMQU5fUE1DX1JFUVVFU1RfRVhJVF9XT1dMLCAgLyogcmVxdWVzdGluZyBleGl0IFdPV0wgKi8KKyAgIFdMQU5fUE1DX1dPV0wgICAgICAgICAgICAgICAgLyogQ2hpcCBpbiBXT1dMIG1vZGUgKi8KKworfSB3bGFuX3BzX3BtY19jdXJyZW50X3N0YXRlX3Q7CisKKy8vIG1hcHMgZGlyZWN0bHkgdG8gZVBtY1Bvd2VyU2F2aW5nTW9kZQordHlwZWRlZiBlbnVtCit7CisgICBXTEFOX0lETEVfTU9ERV9QT1dFUl9TQVZFLCAgLyogSWRsZSBNb2RlIFBvd2VyIFNhdmUgKElNUFMpICovCisgICBXTEFOX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkUsICAvKiBCZWFjb24gTW9kZSBQb3dlciBTYXZlIChCTVBTKSAqLworICAgV0xBTl9TUEFUSUFMX01VTFRJUExFWF9QT1dFUl9TQVZFLCAgLyogU3BhdGlhbCBNdWx0aXBsZXhpbmcgUG93ZXIgU2F2ZSAoU01QUykgKi8KKyAgIFdMQU5fVUFQU0RfTU9ERV9QT1dFUl9TQVZFLCAgLyogVW5zY2hlZHVsZWQgQXV0b21hdGljIFBvd2VyIFNhdmUgRGVsaXZlcnkgTW9kZSAqLworICAgV0xBTl9TVEFOREJZX01PREVfUE9XRVJfU0FWRSwgIC8qIFN0YW5kYnkgUG93ZXIgU2F2ZSBNb2RlICovCisgICBXTEFOX1dPV0xfTU9ERV9QT1dFUl9TQVZFICAvKiBXYWtlLW9uLVdpcmVsZXNzIExBTiBQb3dlciBTYXZlIE1vZGUgKi8KKworfSB3bGFuX3BzX2VuYWJsZV9kaXNhYmxlX3BzX21vZGVfdDsKKwordHlwZWRlZiBlbnVtCit7CisgICBXTEFOX0QwLAorICAgV0xBTl9EMSwKKyAgIFdMQU5fRDIsCisgICBXTEFOX0QzLAorICAgV0xBTl9ENAorCit9IHdsYW5fcHNfd2lubW9iX2RfcG93ZXJfc3RhdGVfdDsKKwordHlwZWRlZiBlbnVtCit7CisgICBXTEFOX1dPV19FTlRFUl9SRVEgPTAsCisgICBXTEFOX1dPV19FWElUX1JFUSA9MSwKKyAgIFdMQU5fV09XX0RFTF9QVFJOX1JFUSA9MiwKKyAgIFdMQU5fV09XX1dBS0VVUCA9IDMKKworfSB3bGFuX3BzX3dvd19ldnRfc3VidHlwZV90OworCit0eXBlZGVmIGVudW0KK3sKKyAgIFdMQU5fV09XX1RZUEVfTk9ORSwKKyAgIFdMQU5fV09XX1RZUEVfTUFHSUNfUEtUX09OTFksCisgICBXTEFOX1dPV19UWVBFX1BUUk5fQllURV9NQVRDSF9PTkxZLAorICAgV0xBTl9XT1dfVFlQRV9NQUdJQ19QS1RfUFRSTl9CWVRFX01BVENILAorCit9IHdsYW5fcHNfd293X3R5cGVfdDsKKwordHlwZWRlZiBlbnVtCit7CisgICBXTEFOX1dPV19NQUdJQ19QS1RfTUFUQ0gsCisgICBXTEFOX1dPV19QVFJOX0JZVEVfTUFUQ0gKKworfSB3bGFuX3BzX3dvc193YWtldXBfY2F1c2VfdDsKKworI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKworI2VuZGlmIC8vIF9XTEFOX1BTX1dPV19ESUFHX0hfCisKZGlmZiAtLWdpdCBhL0NPUkUvU01FL3NyYy9Rb1Mvc21lX1Fvcy5jIGIvQ09SRS9TTUUvc3JjL1FvUy9zbWVfUW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyOTU5NAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL3NyYy9Rb1Mvc21lX1Fvcy5jCkBAIC0wLDAgKzEsNzg5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBzbWVfUW9zLmMKKyAgCisgIFxicmllZiBpbXBsZW1lbnRhdGlvbiBmb3IgU01FIFFvUyBBUElzCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICRIZWFkZXIkICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxJbnRlcm5hbC5oIiAvL0NoZWNrIGlmIHRoZSBiZWxvdyBpbmNsdWRlIG9mIGFuaUdvYmFsLmggaXMgc3VmZmljaWVudCBmb3IgVm9sYW5zIHRvby4KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNtZUluc2lkZS5oIgorI2luY2x1ZGUgInZvc19kaWFnX2NvcmVfZXZlbnQuaCIKKyNpbmNsdWRlICJ2b3NfZGlhZ19jb3JlX2xvZy5oIgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNpbmNsdWRlICJzbXNEZWJ1Zy5oIgorI2luY2x1ZGUgInV0aWxzUGFyc2VyLmgiCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisjaW5jbHVkZSA8Y3NyQ2N4Lmg+CisjZW5kaWYKKworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKy8qIFRPRE8gOiA2TWJwcyBhcyBDaXNjbyBBUHMgc2VlbSB0byBsaWtlIG9ubHkgdGhpcyB2YWx1ZTsgYW5hbHlzaXMgcmVxLiAgICovCisjZGVmaW5lIFNNRV9RT1NfTUlOX1BIWV9SQVRFICAgICAgICAgMHg1QjhEODAgICAgCisjZGVmaW5lIFNNRV9RT1NfU1VSUExVU19CV19BTExPV0FOQ0UgIDB4MjAwMCAgICAgLyogUmF0aW8gb2YgMS4wICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTWF4IHZhbHVlcyB0byBib3VuZCB0c3BlYyBwYXJhbXMgYWdhaW5zdCBhbmQgYXZvaWQgcm9sbG92ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNNRV9RT1NfMzJCSVRfTUFYICAweEZGRkZGRkZGCisjZGVmaW5lIFNNRV9RT1NfMTZCSVRfTUFYICAweEZGRkYKKyNkZWZpbmUgU01FX1FPU18xNkJJVF9NU0IgIDB4ODAwMAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQWRkcyB5IHRvIHgsIGJ1dCBzYXR1cmF0ZXMgYXQgMzItYml0IG1heCB0byBhdm9pZCByb2xsb3ZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU01FX1FPU19CT1VOREVEX1UzMl9BRERfWV9UT19YKCBfeCwgX3kgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX3gpID0gKCAoU01FX1FPU18zMkJJVF9NQVgtKF94KSk8KF95KSApID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKFNNRV9RT1NfMzJCSVRfTUFYKSA6IChfeCkrKF95KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBBcyBwZXIgV01NIHNwZWMgdGhlcmUgY291bGQgYmUgbWF4IDIgVFNQRUMgcnVubmluZyBvbiB0aGUgc2FtZSBBQyB3aXRoIAorICBkaWZmZXJlbnQgZGlyZWN0aW9uLiBXZSB3aWxsIHJlZmVyIGVhY2ggVFNQRUMgd2l0aCBhbiBpbmRleAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU01FX1FPU19UU1BFQ19JTkRFWF8wICAgICAgICAgICAgMAorI2RlZmluZSBTTUVfUU9TX1RTUEVDX0lOREVYXzEgICAgICAgICAgICAxCisjZGVmaW5lIFNNRV9RT1NfVFNQRUNfSU5ERVhfTUFYICAgICAgICAgIDIKKyNkZWZpbmUgU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xX1NFVCAgICAgMQorI2RlZmluZSBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzJfU0VUICAgICAyCisjZGVmaW5lIFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV8yX1NFVCAgIDMKKyNkZWZpbmUgU01FX1FPU19UU1BFQ19NQVNLX0NMRUFSICAgICAgICAgMAorCisvL3doaWNoIGtleSB0byBzZWFyY2ggb24sIGluIHRoZSBmbG93bGlzdCAoMSA9IGZsb3dJRCwgMiA9IEFDLCA0ID0gcmVhc29uKQorI2RlZmluZSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfMSAgICAgICAxCisjZGVmaW5lIFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8yICAgICAgIDIKKyNkZWZpbmUgU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzMgICAgICAgNAorI2RlZmluZSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfNCAgICAgICA4ICAvLyBhYyArIGRpcmVjdGlvbgorI2RlZmluZSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfNSAgICAgICAweDEwICAvLyBhYyArIHRzcGVjX21hc2sKKy8vc3BlY2lhbCB2YWx1ZSBmb3Igc2VhcmNoaW5nIGFueSBTZXNzaW9uIElkCisjZGVmaW5lIFNNRV9RT1NfU0VBUkNIX1NFU1NJT05fSURfQU5ZICAgIENTUl9ST0FNX1NFU1NJT05fTUFYCisjZGVmaW5lIFNNRV9RT1NfQUNDRVNTX1BPTElDWV9FRENBICAgICAgIDEKKyNkZWZpbmUgU01FX1FPU19NQVhfVElEICAgICAgICAgICAgICAgICAgMjU1CisjZGVmaW5lIFNNRV9RT1NfVFNQRUNfSUVfTEVOR1RIICAgICAgICAgIDYxCisjZGVmaW5lIFNNRV9RT1NfVFNQRUNfSUVfVFlQRSAgICAgICAgICAgIDIKKyNkZWZpbmUgU01FX1FPU19NSU5fRkxPV19JRCAgICAgICAgICAgICAgMQorI2RlZmluZSBTTUVfUU9TX01BWF9GTE9XX0lEICAgICAgICAgICAgICAweEZGRkZGRkZFCisjZGVmaW5lIFNNRV9RT1NfSU5WQUxJRF9GTE9XX0lEICAgICAgICAgIDB4RkZGRkZGRkYKKy8vIHBlciB0aGUgV01NIFNwZWNpZmljYXRpb24gdjEuMiBTZWN0aW9uIDIuMi4xMAorLy8gVGhlIERpYWxvZyBUb2tlbiBmaWVsZCBzaGFsbCBiZSBzZXQgWy4uLl0gdG8gYSBub24temVybyB2YWx1ZQorI2RlZmluZSBTTUVfUU9TX01JTl9ESUFMT0dfVE9LRU4gICAgICAgICAxCisjZGVmaW5lIFNNRV9RT1NfTUFYX0RJQUxPR19UT0tFTiAgICAgICAgIDB4RkYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgc3RhdGVzIGluIHRoZSBRb1Mgc3RhdGUgbS9jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICBTTUVfUU9TX0NMT1NFRCA9IDAsCisgICBTTUVfUU9TX0lOSVQsCisgICBTTUVfUU9TX0xJTktfVVAsCisgICBTTUVfUU9TX1JFUVVFU1RFRCwKKyAgIFNNRV9RT1NfUU9TX09OLAorICAgU01FX1FPU19IQU5ET0ZGLAorICAgCit9c21lX1Fvc1N0YXRlczsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBFbnVtZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBRb1MgY21kcyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgIFNNRV9RT1NfU0VUVVBfUkVRID0gMCwKKyAgIFNNRV9RT1NfUkVMRUFTRV9SRVEsCisgICBTTUVfUU9TX01PRElGWV9SRVEsCisgICBTTUVfUU9TX1JFU0VORF9SRVEsCisgICBTTUVfUU9TX0NNRF9NQVgKK31zbWVfUW9zQ21kVHlwZTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBFbnVtZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBRb1MgcmVhc29uIGNvZGVzIHRvIGJlIHVzZWQgaW4gdGhlIEZsb3cgbGlzdCAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgIFNNRV9RT1NfUkVBU09OX1NFVFVQID0gMCwKKyAgIFNNRV9RT1NfUkVBU09OX1JFTEVBU0UsCisgICBTTUVfUU9TX1JFQVNPTl9NT0RJRlksCisgICBTTUVfUU9TX1JFQVNPTl9NT0RJRllfUEVORElORywKKyAgIFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTLAorICAgU01FX1FPU19SRUFTT05fTUFYCit9c21lX1Fvc1JlYXNvblR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRhYmxlIHRvIG1hcCB1c2VyIHByaW9yaXR5IHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCB0byBhcHByb3ByaWF0ZSBBY2Nlc3MgCisgIENhdGVnb3J5IGFzIHNwZWNpZmllZCBpbiA4MDIuMTFlL1dNTQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3NtZV9Rb3NFZGNhQWNUeXBlIHNtZV9Rb3NVUHRvQUNNYXBbU01FX1FPU19XTU1fVVBfTUFYXSA9IAoreworICAgU01FX1FPU19FRENBX0FDX0JFLCAvKiBVc2VyIFByaW9yaXR5IDAgKi8KKyAgIFNNRV9RT1NfRURDQV9BQ19CSywgLyogVXNlciBQcmlvcml0eSAxICovCisgICBTTUVfUU9TX0VEQ0FfQUNfQkssIC8qIFVzZXIgUHJpb3JpdHkgMiAqLworICAgU01FX1FPU19FRENBX0FDX0JFLCAvKiBVc2VyIFByaW9yaXR5IDMgKi8KKyAgIFNNRV9RT1NfRURDQV9BQ19WSSwgLyogVXNlciBQcmlvcml0eSA0ICovCisgICBTTUVfUU9TX0VEQ0FfQUNfVkksIC8qIFVzZXIgUHJpb3JpdHkgNSAqLworICAgU01FX1FPU19FRENBX0FDX1ZPLCAvKiBVc2VyIFByaW9yaXR5IDYgKi8KKyAgIFNNRV9RT1NfRURDQV9BQ19WTyAgLyogVXNlciBQcmlvcml0eSA3ICovCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUYWJsZSB0byBtYXAgYWNjZXNzIGNhdGVnb3J5IChBQykgdG8gYXBwcm9wcmlhdGUgdXNlciBwcmlvcml0eSBhcyBzcGVjaWZpZWQKKyAgaW4gODAyLjExZS9XTU0KKyAgTm90ZTogdGhlcmUgaXMgYSBxdWFudGl6YXRpb24gbG9zcyBoZXJlIGJlY2F1c2UgNCBBQ3MgYXJlIG1hcHBlZCB0byA4IFVQcworICBNYXBwaW5nIGlzIGRvbmUgZm9yIGNvbnNpc3RlbmN5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc21lX1Fvc1dtbVVwVHlwZSBzbWVfUW9zQUN0b1VQTWFwW1NNRV9RT1NfRURDQV9BQ19NQVhdID0gCit7CisgICBTTUVfUU9TX1dNTV9VUF9CRSwgICAvKiBBQyBCRSAqLworICAgU01FX1FPU19XTU1fVVBfQkssICAgLyogQUMgQksgKi8KKyAgIFNNRV9RT1NfV01NX1VQX1ZJLCAgIC8qIEFDIFZJICovCisgICBTTUVfUU9TX1dNTV9VUF9WTyAgICAvKiBBQyBWTyAqLworfTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitERVNDUklQVElPTgorICBTTUUgUW9TIG1vZHVsZSdzIEZMT1cgTGluayBMaXN0IHN0cnVjdHVyZS4gVGhpcyBsaXN0IGNhbiBob2xkIGluZm9ybWF0aW9uIHBlciAKKyAgZmxvdy9yZXF1ZXN0LCBsaWtlIFRTUEVDIHBhcmFtcyByZXF1ZXN0ZWQsIHdoaWNoIEFDIGl0IGlzIHJ1bm5pbmcgb24gCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc21lX1Fvc0Zsb3dJbmZvRW50cnlfcworeworICAgIHRMaXN0RWxlbSAgICAgICAgICAgICBsaW5rOyAgLyogbGlzdCBsaW5rcyAqLworICAgIHZfVThfdCAgICAgICAgICAgICAgICBzZXNzaW9uSWQ7CisgICAgdl9VOF90ICAgICAgICAgICAgICAgIHRzcGVjX21hc2s7CisgICAgc21lX1Fvc1JlYXNvblR5cGUgICAgIHJlYXNvbjsKKyAgICB2X1UzMl90ICAgICAgICAgICAgICAgUW9zRmxvd0lEOworICAgIHNtZV9Rb3NFZGNhQWNUeXBlICAgICBhY190eXBlOworICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gICBRb1NJbmZvOworICAgIHZvaWQgICAgICAgICAgICAgICAgKiBIRERjb250ZXh0OworICAgIHNtZV9Rb3NDYWxsYmFjayAgICAgICBRb1NDYWxsYmFjazsKKyAgICB2X0JPT0xfdCAgICAgICAgICAgICAgaG9SZW5ld2FsOy8vc2V0IHRvIFRSVUUgd2hpbGUgcmUtbmVnb3RpYXRpbmcgZmxvd3MgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hhbmRvZmYsIHdpbGwgc2V0IHRvIEZBTFNFIG9uY2UgZG9uZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGUgcHJvY2Vzcy4gSGVscHMgU01FIHRvIGRlY2lkZSBpZiBhdCBhbGwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90byBub3RpZnkgSEREL0xJUyBmb3IgZmxvdyByZW5ld2FsIGFmdGVyIEhPCit9IHNtZV9Rb3NGbG93SW5mb0VudHJ5OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RFU0NSSVBUSU9OCisgIFNNRSBRb1MgbW9kdWxlJ3Mgc2V0dXAgcmVxdWVzdCBjbWQgcmVsYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNtZV9Rb3NTZXR1cENtZEluZm9fcworeworICAgIHZfVTMyX3QgICAgICAgICAgICAgICBRb3NGbG93SUQ7CisgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAgIFFvU0luZm87CisgICAgdm9pZCAgICAgICAgICAgICAgICAgKkhERGNvbnRleHQ7CisgICAgc21lX1Fvc0NhbGxiYWNrICAgICAgIFFvU0NhbGxiYWNrOworICAgIHNtZV9Rb3NXbW1VcFR5cGUgICAgICBVUFR5cGU7CisgICAgdl9CT09MX3QgICAgICAgICAgICAgIGhvUmVuZXdhbDsvL3NldCB0byBUUlVFIHdoaWxlIHJlLW5lZ290aWF0aW5nIGZsb3dzIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9oYW5kb2ZmLCB3aWxsIHNldCB0byBGQUxTRSBvbmNlIGRvbmUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlIHByb2Nlc3MuIEhlbHBzIFNNRSB0byBkZWNpZGUgaWYgYXQgYWxsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gbm90aWZ5IEhERC9MSVMgZm9yIGZsb3cgcmVuZXdhbCBhZnRlciBITworfSBzbWVfUW9zU2V0dXBDbWRJbmZvOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RFU0NSSVBUSU9OCisgIFNNRSBRb1MgbW9kdWxlJ3MgbW9kaWZ5IGNtZCByZWxhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc21lX1Fvc01vZGlmeUNtZEluZm9fcworeworICAgIHZfVTMyX3QgICAgICAgICAgICAgICBRb3NGbG93SUQ7CisgICAgc21lX1Fvc0VkY2FBY1R5cGUgICAgIGFjOworICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gICBRb1NJbmZvOworfSBzbWVfUW9zTW9kaWZ5Q21kSW5mbzsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitERVNDUklQVElPTgorICBTTUUgUW9TIG1vZHVsZSdzIHJlc2VuZCBjbWQgcmVsYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNtZV9Rb3NSZXNlbmRDbWRJbmZvX3MKK3sKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgdHNwZWNNYXNrOworICAgIHNtZV9Rb3NFZGNhQWNUeXBlICAgICBhYzsKKyAgICBzbWVfUW9zV21tVHNwZWNJbmZvICAgUW9TSW5mbzsKK30gc21lX1Fvc1Jlc2VuZENtZEluZm87CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorREVTQ1JJUFRJT04KKyAgU01FIFFvUyBtb2R1bGUncyByZWxlYXNlIGNtZCByZWxhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc21lX1Fvc1JlbGVhc2VDbWRJbmZvX3MKK3sKKyAgICB2X1UzMl90ICAgICAgICAgICAgICAgUW9zRmxvd0lEOworfSBzbWVfUW9zUmVsZWFzZUNtZEluZm87CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorREVTQ1JJUFRJT04KKyAgU01FIFFvUyBtb2R1bGUncyBidWZmZXJlZCBjbWQgcmVsYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNtZV9Rb3NDbWRJbmZvX3MKK3sKKyAgICBzbWVfUW9zQ21kVHlwZSAgICAgICAgY29tbWFuZDsKKyAgICB0cEFuaVNpckdsb2JhbCAgICAgICAgcE1hYzsKKyAgICB2X1U4X3QgICAgICAgICAgICAgICAgc2Vzc2lvbklkOworICAgIHVuaW9uCisgICAgeworICAgICAgIHNtZV9Rb3NTZXR1cENtZEluZm8gICAgc2V0dXBDbWRJbmZvOworICAgICAgIHNtZV9Rb3NNb2RpZnlDbWRJbmZvICAgbW9kaWZ5Q21kSW5mbzsKKyAgICAgICBzbWVfUW9zUmVzZW5kQ21kSW5mbyAgIHJlc2VuZENtZEluZm87CisgICAgICAgc21lX1Fvc1JlbGVhc2VDbWRJbmZvICByZWxlYXNlQ21kSW5mbzsKKyAgICB9dTsKK30gc21lX1Fvc0NtZEluZm87CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorREVTQ1JJUFRJT04KKyAgU01FIFFvUyBtb2R1bGUncyBidWZmZXJlZCBjbWQgTGlzdCBzdHJ1Y3R1cmUuIFRoaXMgbGlzdCBjYW4gaG9sZCBpbmZvcm1hdGlvbiAKKyAgcmVsYXRlZCB0byBhbnkgcGVuZGluZyBjbWQgZnJvbSBIREQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCBzbWVfUW9zQ21kSW5mb0VudHJ5X3MKK3sKKyAgICB0TGlzdEVsZW0gICAgICAgICAgICAgbGluazsgIC8qIGxpc3QgbGlua3MgKi8KKyAgICBzbWVfUW9zQ21kSW5mbyAgICAgICAgY21kSW5mbzsKK30gc21lX1Fvc0NtZEluZm9FbnRyeTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitERVNDUklQVElPTgorICBTTUUgUW9TIG1vZHVsZSdzIFBlciBBQyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFRoaXMgY2FuIGhvbGQgaW5mb3JtYXRpb24gb24KKyAgaG93IG1hbnkgZmxvd3MgcnVubmluZyBvbiB0aGUgQUMsIHRoZSBjdXJyZW50LCBwcmV2aW91cyBzdGF0ZXMgdGhlIEFDIGlzIGluIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHNtZV9Rb3NBQ0luZm9fcworeworICAgdl9VOF90ICAgICAgICAgICAgICAgICBudW1fZmxvd3NbU01FX1FPU19UU1BFQ19JTkRFWF9NQVhdOworICAgc21lX1Fvc1N0YXRlcyAgICAgICAgICBjdXJyX3N0YXRlOworICAgc21lX1Fvc1N0YXRlcyAgICAgICAgICBwcmV2X3N0YXRlOworICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAgICBjdXJyX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF9NQVhdOworICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAgICByZXF1ZXN0ZWRfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYX01BWF07CisgICB2X0JPT0xfdCAgICAgICAgICAgICAgIHJlYXNzb2NfcGVuZGluZzsvL3JlYXNzb2MgcmVxdWVzdGVkIGZvciBBUFNECisgICAvL0FzIHBlciBXTU0gc3BlYyB0aGVyZSBjb3VsZCBiZSBtYXggMiBUU1BFQyBydW5uaW5nIG9uIHRoZSBzYW1lIEFDIHdpdGggCisgICAvL2RpZmZlcmVudCBkaXJlY3Rpb24uIFdlIHdpbGwgcmVmZXIgZWFjaCBUU1BFQyB3aXRoIGFuIGluZGV4CisgICB2X1U4X3QgICAgICAgICAgICAgICAgIHRzcGVjX21hc2tfc3RhdHVzOyAvL3N0YXR1cyBzaG93aW5nIGlmIGJvdGggdGhlIGluZGljZXMgYXJlIGluIHVzZQorICAgdl9VOF90ICAgICAgICAgICAgICAgICB0c3BlY19wZW5kaW5nOy8vdHNwZWMgbmVnb3RpYXRpb24gZ29pbmcgb24gZm9yIHdoaWNoIGluZGV4CisgICB2X0JPT0xfdCAgICAgICAgICAgICAgIGhvUmVuZXdhbDsvL3NldCB0byBUUlVFIHdoaWxlIHJlLW5lZ290aWF0aW5nIGZsb3dzIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hhbmRvZmYsIHdpbGwgc2V0IHRvIEZBTFNFIG9uY2UgZG9uZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoZSBwcm9jZXNzLiBIZWxwcyBTTUUgdG8gZGVjaWRlIGlmIGF0IGFsbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gbm90aWZ5IEhERC9MSVMgZm9yIGZsb3cgcmVuZXdhbCBhZnRlciBITworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICB2X1U4X3QgICAgICAgICAgICAgICAgIHJpY0lkZW50aWZpZXJbU01FX1FPU19UU1BFQ19JTkRFWF9NQVhdOworICAgLyogc3RvcmVzIHRoZSBBREQgVFMgcmVzcG9uc2UgZm9yIGVhY2ggQUMuIFRoZSBBREQgVFMgcmVzcG9uc2UgaXMgZm9ybWVkIGJ5CisgICBwYXJzaW5nIHRoZSBSSUMgcmVjZWl2ZWQgaW4gdGhlIHRoZSByZWFzc29jIHJlc3BvbnNlICovCisgICB0U2lyQWRkdHNSc3AgICAgICAgICAgIGFkZFRzUnNwW1NNRV9RT1NfVFNQRUNfSU5ERVhfTUFYXTsKKyNlbmRpZgorCit9IHNtZV9Rb3NBQ0luZm87CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorREVTQ1JJUFRJT04KKyAgU01FIFFvUyBtb2R1bGUncyBQZXIgc2Vzc2lvbiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFRoaXMgY2FuIGhvbGQgaW5mb3JtYXRpb24KKyAgb24gdGhlIHN0YXRlIG9mIHRoZSBzZXNzaW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc21lX1Fvc1Nlc3Npb25JbmZvX3MKK3sKKyAgIC8vIHdoYXQgaXMgdGhpcyBlbnRyeSdzIHNlc3Npb24gaWQKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOworICAgLy8gaXMgdGhlIHNlc3Npb24gY3VycmVudGx5IGFjdGl2ZQorICAgdl9CT09MX3QgICAgICAgICAgICAgICBzZXNzaW9uQWN0aXZlOworICAgLy8gQWxsIEFDIGluZm8gZm9yIHRoaXMgc2Vzc2lvbgorICAgc21lX1Fvc0FDSW5mbyAgICAgICAgICBhY19pbmZvW1NNRV9RT1NfRURDQV9BQ19NQVhdOworICAgLy8gQml0bWFzayBvZiB0aGUgQUNzIHdpdGggQVBTRCBvbiAKKyAgIC8vIEJpdDA6Vk87IEJpdDE6Vkk7IEJpdDI6Qks7IEJpdDM6QkUgYWxsIG90aGVyIGJpdHMgYXJlIGlnbm9yZWQKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgYXBzZE1hc2s7CisgICAvLyBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzZXNzaW9uCisgICBzbWVfUW9zQXNzb2NJbmZvICAgICAgIGFzc29jSW5mbzsKKyAgIC8vIElEIGFzc2lnbmVkIHRvIG91ciByZWFzc29jIHJlcXVlc3QKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgcm9hbUlEOworICAgLy8gbWFpbnRhaW5pbmcgYSBwb3dlcnNhdmUgc3RhdHVzIGluIFFvUyBtb2R1bGUsIHRvIGJlIGZlZCBiYWNrIHRvIFBNQyBhdCAKKyAgIC8vIHRpbWVzIHRocm91Z2ggdGhlIHNtZV9Rb3NQbWNDaGVja1JvdXRpbmUKKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgcmVhZHlGb3JQb3dlclNhdmU7CisgICAvLyBhcmUgd2UgaW4gdGhlIHByb2Nlc3Mgb2YgaGFuZGluZyBvZmYgdG8gYSBkaWZmZXJlbnQgQVAKKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgaGFuZG9mZlJlcXVlc3RlZDsKKyAgIC8vIGZvbGxvd2luZyByZWFzc29jIG9yIEFkZFRTIGhhcyBVQVBTRCBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkIGZyb20gUE1DCisgICB2X0JPT0xfdCAgICAgICAgICAgICAgIHVhcHNkQWxyZWFkeVJlcXVlc3RlZDsKKyAgIC8vIGNvbW1hbmRzIHRoYXQgYXJlIGJlaW5nIGJ1ZmZlcmVkIGZvciB0aGlzIHNlc3Npb24KKyAgIHREYmxMaW5rTGlzdCAgICAgICAgICAgYnVmZmVyZWRDb21tYW5kTGlzdDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICB2X0JPT0xfdCAgICAgICAgICAgICAgIGZ0SGFuZG9mZkluUHJvZ3Jlc3M7CisjZW5kaWYKKworfSBzbWVfUW9zU2Vzc2lvbkluZm87CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorREVTQ1JJUFRJT04KKyAgU2VhcmNoIGtleSB1bmlvbi4gV2UgY2FuIHVzZSB0aGUgZmxvd0lELCBhYyB0eXBlLCBvciByZWFzb24gdG8gZmluZCBhbiBlbnRyeSAKKyAgaW4gdGhlIGZsb3cgbGlzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdW5pb24gc21lX1Fvc1NlYXJjaEtleV9zCit7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgUW9zRmxvd0lEOworICAgc21lX1Fvc0VkY2FBY1R5cGUgICAgIGFjX3R5cGU7CisgICBzbWVfUW9zUmVhc29uVHlwZSAgICAgcmVhc29uOworfXNtZV9Rb3NTZWFyY2hLZXk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorREVTQ1JJUFRJT04KKyAgV2UgY2FuIGVpdGhlciB1c2UgdGhlIGZsb3dJRCBvciB0aGUgYWMgdHlwZSB0byBmaW5kIGFuIGVudHJ5IGluIHRoZSBmbG93IGxpc3QuCisgIFRoZSBpbmRleCBpcyBhIGJpdG1hcCB0ZWxsaW5nIHVzIHdoaWNoIGtleSB0byB1c2UuIFN0YXJ0aW5nIGZyb20gTFNCLAorICBiaXQgMCAtIEZsb3cgSUQKKyAgYml0IDEgLSBBQyB0eXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3Qgc21lX1Fvc1NlYXJjaEluZm9fcworeworICAgdl9VOF90ICAgICAgICAgICBzZXNzaW9uSWQ7CisgICB2X1U4X3QgICAgICAgICAgIGluZGV4OworICAgc21lX1Fvc1NlYXJjaEtleSBrZXk7CisgICBzbWVfUW9zV21tRGlyVHlwZSAgIGRpcmVjdGlvbjsKKyAgIHZfVThfdCAgICAgICAgICAgICAgdHNwZWNfbWFzazsKK31zbWVfUW9zU2VhcmNoSW5mbzsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitERVNDUklQVElPTgorICBTTUUgUW9TIG1vZHVsZSdzIGludGVybmFsIGNvbnRyb2wgYmxvY2suCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IHNtZV9Rb3NDYl9zCit7CisgICAvL2dsb2JhbCBNYWMgcG9pbnRlcgorICAgdHBBbmlTaXJHbG9iYWwgICBwTWFjOworICAgLy9BbGwgU2Vzc2lvbiBJbmZvCisgICBzbWVfUW9zU2Vzc2lvbkluZm8gICAgIHNlc3Npb25JbmZvW0NTUl9ST0FNX1NFU1NJT05fTUFYXTsKKyAgIC8vQWxsIEZMT1cgaW5mbworICAgdERibExpbmtMaXN0ICAgICAgICAgICBmbG93X2xpc3Q7CisgICAvL2RlZmF1bHQgVFNQRUMgcGFyYW1zCisgICBzbWVfUW9zV21tVHNwZWNJbmZvICAgIGRlZl9Rb1NJbmZvW1NNRV9RT1NfRURDQV9BQ19NQVhdOworICAgLy9jb3VudGVyIGZvciBhc3NpZ25pbmcgRmxvdyBJRHMKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgbmV4dEZsb3dJZDsKKyAgIC8vY291bnRlciBmb3IgYXNzaWduaW5nIERpYWxvZyBUb2tlbnMKKyAgIHZfVThfdCAgICAgICAgICAgICAgICBuZXh0RGlhbG9nVG9rZW47Cit9c21lX1Fvc0NiOwordHlwZWRlZiBlSGFsU3RhdHVzICgqc21lX1Fvc1Byb2Nlc3NTZWFyY2hFbnRyeSkodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3NtZV9Rb3NTdGF0dXNUeXBlIHNtZV9Rb3NJbnRlcm5hbFNldHVwUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwUW9TSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NDYWxsYmFjayBRb1NDYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogSEREY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NXbW1VcFR5cGUgVVBUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgUW9zRmxvd0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgYnVmZmVyZWRfY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgaG9SZW5ld2FsKTsKK3NtZV9Rb3NTdGF0dXNUeXBlIHNtZV9Rb3NJbnRlcm5hbE1vZGlmeVJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zV21tVHNwZWNJbmZvICogcFFvU0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBRb3NGbG93SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgYnVmZmVyZWRfY21kKTsKK3NtZV9Rb3NTdGF0dXNUeXBlIHNtZV9Rb3NJbnRlcm5hbFJlbGVhc2VSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgUW9zRmxvd0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCBidWZmZXJlZF9jbWQpOworc21lX1Fvc1N0YXR1c1R5cGUgc21lX1Fvc1NldHVwKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zV21tVHNwZWNJbmZvICpwVHNwZWNfSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc0VkY2FBY1R5cGUgYWMpOworZUhhbFN0YXR1cyBzbWVfUW9zQWRkVHNSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zV21tVHNwZWNJbmZvICogcFRzcGVjX0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYyk7CitlSGFsU3RhdHVzIHNtZV9Rb3NEZWxUc1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHRzcGVjX21hc2spOworZUhhbFN0YXR1cyBzbWVfUW9zUHJvY2Vzc0FkZFRzUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpOworZUhhbFN0YXR1cyBzbWVfUW9zUHJvY2Vzc0RlbFRzSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpOworZUhhbFN0YXR1cyBzbWVfUW9zUHJvY2Vzc0RlbFRzUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpOworZUhhbFN0YXR1cyBzbWVfUW9zUHJvY2Vzc0Fzc29jQ29tcGxldGVFdih0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLCB2b2lkICogcEV2ZW50X2luZm8pOworZUhhbFN0YXR1cyBzbWVfUW9zUHJvY2Vzc1JlYXNzb2NSZXFFdih0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLCB2b2lkICogcEV2ZW50X2luZm8pOworZUhhbFN0YXR1cyBzbWVfUW9zUHJvY2Vzc1JlYXNzb2NTdWNjZXNzRXYodHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCwgdm9pZCAqIHBFdmVudF9pbmZvKTsKK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NSZWFzc29jRmFpbHVyZUV2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHZvaWQgKiBwRXZlbnRfaW5mbyk7CitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzRGlzY29ubmVjdEV2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHZvaWQgKiBwRXZlbnRfaW5mbyk7CitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzSm9pblJlcUV2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHZvaWQgKiBwRXZlbnRfaW5mbyk7CitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzSGFuZG9mZkFzc29jUmVxRXYodHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCwgdm9pZCAqIHBFdmVudF9pbmZvKTsKK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NIYW5kb2ZmU3VjY2Vzc0V2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHZvaWQgKiBwRXZlbnRfaW5mbyk7CitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzSGFuZG9mZkZhaWx1cmVFdih0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLCB2b2lkICogcEV2ZW50X2luZm8pOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzUHJlYXV0aFN1Y2Nlc3NJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCwgdm9pZCAqIHBFdmVudF9pbmZvKTsKK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NTZXRLZXlTdWNjZXNzSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHZvaWQgKiBwRXZlbnRfaW5mbyk7CitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzQWdnclFvc1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKTsKK2VIYWxTdGF0dXMgc21lX1Fvc0ZUQWdnclFvc1JlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCApOworI2VuZGlmCitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzQWRkVHNTdWNjZXNzUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQWRkdHNSc3BJbmZvICogcFJzcCk7CitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzQWRkVHNGYWlsdXJlUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQWRkdHNSc3BJbmZvICogcFJzcCk7CitlSGFsU3RhdHVzIHNtZV9Rb3NBZ2dyZWdhdGVQYXJhbXMoCisgICBzbWVfUW9zV21tVHNwZWNJbmZvICogcElucHV0X1RzcGVjX0luZm8sCisgICBzbWVfUW9zV21tVHNwZWNJbmZvICogcEN1cnJlbnRfVHNwZWNfSW5mbywKKyAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwVXBkYXRlZF9Uc3BlY19JbmZvKTsKK3N0YXRpYyBlSGFsU3RhdHVzIHNtZV9Rb3NVcGRhdGVQYXJhbXModl9VOF90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc0VkY2FBY1R5cGUgYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCB0c3BlY19tYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqIHBUc3BlY19JbmZvKTsKK3NtZV9Rb3NXbW1VcFR5cGUgc21lX1Fvc0FjVG9VcChzbWVfUW9zRWRjYUFjVHlwZSBhYyk7CitzbWVfUW9zRWRjYUFjVHlwZSBzbWVfUW9zVXBUb0FjKHNtZV9Rb3NXbW1VcFR5cGUgdXApOwordl9CT09MX3Qgc21lX1Fvc0lzQUNNKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsIAorICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzKTsKK3RMaXN0RWxlbSAqc21lX1Fvc0ZpbmRJbkZsb3dMaXN0KHNtZV9Rb3NTZWFyY2hJbmZvIHNlYXJjaF9rZXkpOworZUhhbFN0YXR1cyBzbWVfUW9zRmluZEFsbEluRmxvd0xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NTZWFyY2hJbmZvIHNlYXJjaF9rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1Byb2Nlc3NTZWFyY2hFbnRyeSBmbnApOworc3RhdGljIHZvaWQgc21lX1Fvc1N0YXRlVHJhbnNpdGlvbih2X1U4X3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1N0YXRlcyBuZXdfc3RhdGUpOworZUhhbFN0YXR1cyBzbWVfUW9zQnVmZmVyQ21kKHNtZV9Rb3NDbWRJbmZvICpwY21kLCB2X0JPT0xfdCBpbnNlcnRfaGVhZCk7CitzdGF0aWMgZUhhbFN0YXR1cyBzbWVfUW9zUHJvY2Vzc0J1ZmZlcmVkQ21kKHZfVThfdCBzZXNzaW9uSWQpOworZUhhbFN0YXR1cyBzbWVfUW9zU2F2ZUFzc29jSW5mbyhzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uLCBzbWVfUW9zQXNzb2NJbmZvICpwQXNzb2NfaW5mbyk7CitlSGFsU3RhdHVzIHNtZV9Rb3NTZXR1cEZucCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0TGlzdEVsZW0gKnBFbnRyeSk7CitlSGFsU3RhdHVzIHNtZV9Rb3NNb2RpZmljYXRpb25Ob3RpZnlGbnAodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpOworZUhhbFN0YXR1cyBzbWVfUW9zTW9kaWZ5Rm5wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KTsKK2VIYWxTdGF0dXMgc21lX1Fvc0RlbFRzSW5kRm5wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KTsKK2VIYWxTdGF0dXMgc21lX1Fvc1JlYXNzb2NTdWNjZXNzRXZGbnAodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpOworZUhhbFN0YXR1cyBzbWVfUW9zQWRkVHNGYWlsdXJlRm5wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KTsKK2VIYWxTdGF0dXMgc21lX1Fvc0FkZFRzU3VjY2Vzc0ZucCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0TGlzdEVsZW0gKnBFbnRyeSk7CitzdGF0aWMgdl9CT09MX3Qgc21lX1Fvc0lzUnNwUGVuZGluZyh2X1U4X3Qgc2Vzc2lvbklkLCBzbWVfUW9zRWRjYUFjVHlwZSBhYyk7CitzdGF0aWMgdl9CT09MX3Qgc21lX1Fvc0lzVWFwc2RBY3RpdmUodm9pZCk7Cit2b2lkIHNtZV9Rb3NQbWNGdWxsUG93ZXJDYWxsYmFjayh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKTsKK3ZvaWQgc21lX1Fvc1BtY1N0YXJ0VWFwc2RDYWxsYmFjayh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKTsKK3ZfQk9PTF90IHNtZV9Rb3NQbWNDaGVja1JvdXRpbmUodm9pZCAqY2FsbGJhY2tDb250ZXh0KTsKK3ZvaWQgc21lX1Fvc1BtY0RldmljZVN0YXRlVXBkYXRlSW5kKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgdFBtY1N0YXRlIHBtY1N0YXRlKTsKK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NPdXRPZlVhcHNkTW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NJbnRvVWFwc2RNb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworc3RhdGljIGVIYWxTdGF0dXMgc21lX1Fvc0J1ZmZlckV4aXN0aW5nRmxvd3ModHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzZXNzaW9uSWQpOworc3RhdGljIGVIYWxTdGF0dXMgc21lX1Fvc0RlbGV0ZUV4aXN0aW5nRmxvd3ModHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzZXNzaW9uSWQpOworc3RhdGljIHZvaWQgc21lX1Fvc0NsZWFudXBDdHJsQmxrRm9ySGFuZG9mZih0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc2Vzc2lvbklkKTsKK3N0YXRpYyBlSGFsU3RhdHVzIHNtZV9Rb3NEZWxldGVCdWZmZXJlZFJlcXVlc3RzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc2Vzc2lvbklkKTsKK3ZfQk9PTF90IHNtZV9Rb3NWYWxpZGF0ZVJlcXVlc3RlZFBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwUW9TSW5mbywKKyAgICB2X1U4X3Qgc2Vzc2lvbklkKTsKKworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX0FjcXVpcmVHbG9iYWxMb2NrKCB0U21lU3RydWN0ICpwc1NtZSk7CitleHRlcm4gZUhhbFN0YXR1cyBzbWVfUmVsZWFzZUdsb2JhbExvY2soIHRTbWVTdHJ1Y3QgKnBzU21lKTsKK3N0YXRpYyBlSGFsU3RhdHVzIHFvc0lzc3VlQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNtZUNvbW1hbmRUeXBlIGNtZFR5cGUsIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwUW9TSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc0VkY2FBY1R5cGUgYWMsIHZfVThfdCB0c3BlY19tYXNrICk7CisvKgorICAgIHNtZV9Rb3NSZVJlcXVlc3RBZGRUUyB0byByZS1zZW5kIEFkZFRTIGZvciB0aGUgY29tYmluZWQgUW9TIHJlcXVlc3QKKyovCitzdGF0aWMgc21lX1Fvc1N0YXR1c1R5cGUgc21lX1Fvc1JlUmVxdWVzdEFkZFRTKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwUW9TSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc0VkY2FBY1R5cGUgYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCB0c3BlY01hc2spOworc3RhdGljIHZvaWQgc21lX1Fvc0luaXRBQ3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCk7CitzdGF0aWMgZUhhbFN0YXR1cyBzbWVfUW9zUmVxdWVzdFJlYXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzICpwTW9kRmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IGZGb3JjZSApOworc3RhdGljIHZfVTMyX3Qgc21lX1Fvc0Fzc2lnbkZsb3dJZCh2b2lkKTsKK3N0YXRpYyB2X1U4X3Qgc21lX1Fvc0Fzc2lnbkRpYWxvZ1Rva2VuKHZvaWQpOworc3RhdGljIGVIYWxTdGF0dXMgc21lX1Fvc1VwZGF0ZVRzcGVjTWFzayh2X1U4X3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgbmV3X3RzcGVjX21hc2spOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBBUElzIGRlZmluaXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxicmllZiBzbWVfUW9zT3BlbigpIC0gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IEFQSSBjYWxsIHRvIAorICAgIFNNRSBRb1MgbW9kdWxlLgorICAgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICAgIAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc09wZW4odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICB2X1U4X3Qgc2Vzc2lvbklkOworICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGluaXRpYWxpemluZyBTTUUtUW9TIG1vZHVsZSIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAvL2luaXQgdGhlIGNvbnRyb2wgYmxvY2sKKyAgIC8vKG5vdGUgdGhhdCB0aGlzIHdpbGwgbWFrZSBhbGwgc2Vzc2lvbnMgaW52YWxpZCkKKyAgIHZvc19tZW1femVybygmc21lX1Fvc0NiLCBzaXplb2Yoc21lX1Fvc0NiKSk7CisgICBzbWVfUW9zQ2IucE1hYyA9IHBNYWM7CisgICBzbWVfUW9zQ2IubmV4dEZsb3dJZCA9IFNNRV9RT1NfTUlOX0ZMT1dfSUQ7CisgICBzbWVfUW9zQ2IubmV4dERpYWxvZ1Rva2VuID0gU01FX1FPU19NSU5fRElBTE9HX1RPS0VOOworICAgLy9pbml0IGZsb3cgbGlzdAorICAgc3RhdHVzID0gY3NyTExPcGVuKHBNYWMtPmhIZGQsICZzbWVfUW9zQ2IuZmxvd19saXN0KTsKKyAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBjYW5ub3QgaW5pdGlhbGl6ZSBGbG93IExpc3QiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICAKKyAgIGZvciAoc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7ICsrc2Vzc2lvbklkKQorICAgeworICAgICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICAgICBwU2Vzc2lvbi0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc2Vzc2lvbidzIHBlci1BQyBpbmZvcm1hdGlvbgorICAgICAgc21lX1Fvc0luaXRBQ3MocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlIHNlc3Npb24ncyBidWZmZXJlZCBjb21tYW5kIGxpc3QKKyAgICAgIHN0YXR1cyA9IGNzckxMT3BlbihwTWFjLT5oSGRkLCAmcFNlc3Npb24tPmJ1ZmZlcmVkQ29tbWFuZExpc3QpOworICAgICAgaWYgKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IGNhbm5vdCBpbml0aWFsaXplIGNtZCBsaXN0IGZvciBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgIH0KKyAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgfQorICAgLy90aGUgcm91dGluZSByZWdpc3RlcmVkIGhlcmUgZ2V0cyBjYWxsZWQgYnkgUE1DIHdoZW5ldmVyIHRoZSBkZXZpY2UgaXMgYWJvdXQgCisgICAvL3RvIGVudGVyIG9uZSBvZiB0aGUgcG93ZXIgc2F2ZSBtb2Rlcy4gUE1DIHJ1bnMgYSBwb2xsIHdpdGggYWxsIHRoZSAKKyAgIC8vcmVnaXN0ZXJlZCBtb2R1bGVzIGlmIGRldmljZSBjYW4gZW50ZXIgcG93ZXJzYXZlIG1vZGUgb3IgcmVtYWluIGZ1bGwgcG93ZXIKKyAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoCisgICAgICBwbWNSZWdpc3RlclBvd2VyU2F2ZUNoZWNrKHBNYWMsIHNtZV9Rb3NQbWNDaGVja1JvdXRpbmUsIHBNYWMpKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICIlczogJWQ6IGNhbm5vdCByZWdpc3RlciB3aXRoIHBtY1JlZ2lzdGVyUG93ZXJTYXZlQ2hlY2soKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIC8vdGhlIHJvdXRpbmUgcmVnaXN0ZXJlZCBoZXJlIGdldHMgY2FsbGVkIGJ5IFBNQyB3aGVuZXZlciB0aGVyZSBpcyBhIGRldmljZSAKKyAgIC8vIHN0YXRlIGNoYW5nZS4gUE1DIG1pZ2h0IGdvIHRvIGZ1bGwgcG93ZXIgYmVjYXVzZSBvZiBtYW55IHJlYXNvbnMgYW5kIHRoaXMgCisgICAvLyBpcyB0aGUgd2F5IGZvciBQTUMgdG8gaW5mb3JtIGFsbCB0aGUgb3RoZXIgcmVnaXN0ZXJlZCBtb2R1bGVzIHNvIHRoYXQgCisgICAvLyBldmVyeW9uZSBpcyBpbiBzeW5jLgorICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUygKKyAgICAgIHBtY1JlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQocE1hYywgc21lX1Fvc1BtY0RldmljZVN0YXRlVXBkYXRlSW5kLCBwTWFjKSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBjYW5ub3QgcmVnaXN0ZXIgd2l0aCBwbWNSZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kKCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGRvbmUgaW5pdGlhbGl6aW5nIFNNRS1Rb1MgbW9kdWxlIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcYnJpZWYgc21lX1Fvc0Nsb3NlKCkgLSBUbyBjbG9zZSBkb3duIFNNRSBRb1MgbW9kdWxlLiBUaGVyZSBzaG91bGQgbm90IGJlIAorICAgIGFueSBBUEkgY2FsbCBpbnRvIHRoaXMgbW9kdWxlIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB1bnRpbCBhbm90aGVyCisgICAgY2FsbCBvZiBzbWVfUW9zT3Blbi4KKyAgICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NDbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjOworICAgdl9VOF90IHNlc3Npb25JZDsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogY2xvc2luZyBkb3duIFNNRS1Rb1MiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgLy8gZGVyZWdpc3RlciB3aXRoIFBNQworICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUygKKyAgICAgIHBtY0RlcmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZChwTWFjLCBzbWVfUW9zUG1jRGV2aWNlU3RhdGVVcGRhdGVJbmQpKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICIlczogJWQ6IGNhbm5vdCBkZXJlZ2lzdGVyIHdpdGggcG1jRGVyZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kKCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgfQorICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUygKKyAgICAgIHBtY0RlcmVnaXN0ZXJQb3dlclNhdmVDaGVjayhwTWFjLCBzbWVfUW9zUG1jQ2hlY2tSb3V0aW5lKSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBjYW5ub3QgZGVyZWdpc3RlciB3aXRoIHBtY0RlcmVnaXN0ZXJQb3dlclNhdmVDaGVjaygpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgIH0KKyAgIC8vY2xlYW51cCBjb250cm9sIGJsb2NrCisgICAvL2Nsb3NlIHRoZSBmbG93IGxpc3QKKyAgIGNzckxMQ2xvc2UoJnNtZV9Rb3NDYi5mbG93X2xpc3QpOworICAgLy8gc2h1dCBkb3duIGFsbCBvZiB0aGUgc2Vzc2lvbnMKKyAgIGZvcihzZXNzaW9uSWQgPSAwOyBzZXNzaW9uSWQgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgKytzZXNzaW9uSWQpCisgICB7CisgICAgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKyAgICAgIGlmIChwU2Vzc2lvbiA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICBzbWVfUW9zSW5pdEFDcyhwTWFjLCBzZXNzaW9uSWQpOworICAgICAgIC8vIHRoaXMgc2Vzc2lvbiBkb2Vzbid0IHJlcXVpcmUgVUFQU0QKKyAgICAgICBwU2Vzc2lvbi0+YXBzZE1hc2sgPSAwOworCisgICAgICAgcFNlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCA9IFZPU19GQUxTRTsKKyAgICAgICBwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCA9IFZPU19GQUxTRTsKKyAgICAgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfVFJVRTsKKyAgICAgICBwU2Vzc2lvbi0+cm9hbUlEID0gMDsKKyAgICAgICAvL25lZWQgdG8gY2xlYW4gdXAgYnVmZmVyZWQgcmVxCisgICAgICAgc21lX1Fvc0RlbGV0ZUJ1ZmZlcmVkUmVxdWVzdHMocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgICAvL25lZWQgdG8gY2xlYW4gdXAgZmxvd3MKKyAgICAgICBzbWVfUW9zRGVsZXRlRXhpc3RpbmdGbG93cyhwTWFjLCBzZXNzaW9uSWQpOworCisgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGFzc29jIGluZm8gaWYgYWxyZWFkeSBhbGxvY2F0ZWQKKyAgICAgICBpZiAocFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYykgeworICAgICAgICAgIHZvc19tZW1fZnJlZShwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjKTsKKyAgICAgICAgICBwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjID0gTlVMTDsKKyAgICAgICB9CisKKyAgICAgIC8vIGNsb3NlIHRoZSBzZXNzaW9uJ3MgYnVmZmVyZWQgY29tbWFuZCBsaXN0CisgICAgICBjc3JMTENsb3NlKCZwU2Vzc2lvbi0+YnVmZmVyZWRDb21tYW5kTGlzdCk7CisgICAgICBmb3IoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykgCisgICAgICB7CisgICAgICAgICBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfQ0xPU0VEKTsKKyAgICAgIH0KKyAgICAgIHBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlID0gVk9TX0ZBTFNFOworICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICB9CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGNsb3NlZCBkb3duIFFvUyIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NTZXR1cFJlcSgpIC0gVGhlIFNNRSBRb1MgQVBJIGV4cG9zZWQgdG8gSEREIHRvIHJlcXVlc3QgZm9yIFFvUyAKKyAgb24gYSBwYXJ0aWN1bGFyIEFDLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYSBsaW5rIGhhcyBiZWVuIAorICBlc3RhYmxpc2hlZCwgaS5lLiBTVEEgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIEFQIGV0Yy4gSWYgdGhlIHJlcXVlc3QgaW52b2x2ZXMgCisgIGFkbWlzc2lvbiBjb250cm9sIG9uIHRoZSByZXF1ZXN0ZWQgQUMsIEhERCBuZWVkcyB0byBwcm92aWRlIHRoZSBuZWNlc3NhcnkgCisgIFRyYWZmaWMgU3BlY2lmaWNhdGlvbiAoVFNQRUMpIHBhcmFtZXRlcnMgb3RoZXJ3aXNlIFNNRSBpcyBnb2luZyB0byB1c2UgdGhlCisgIGRlZmF1bHQgcGFyYW1zLgorICAKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uSWQgcmV0dXJuZWQgYnkgc21lX09wZW5TZXNzaW9uLgorICBccGFyYW0gcFFvU0luZm8gLSBQb2ludGVyIHRvIHNtZV9Rb3NXbW1Uc3BlY0luZm8gd2hpY2ggY29udGFpbnMgdGhlIFdNTSBUU1BFQworICAgICAgICAgICAgICAgICAgICByZWxhdGVkIGluZm8gYXMgZGVmaW5lZCBhYm92ZSwgcHJvdmlkZWQgYnkgSERECisgIFxwYXJhbSBRb1NDYWxsYmFjayAtIFRoZSBjYWxsYmFjayB3aGljaCBpcyByZWdpc3RlcmVkIHBlciBmbG93IHdoaWxlIAorICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0aW5nIGZvciBRb1MuIFVzZWQgZm9yIGFueSBub3RpZmljYXRpb24gZm9yIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvdyAoaS5lLiBzZXR1cCBzdWNjZXNzL2ZhaWx1cmUvcmVsZWFzZSkgd2hpY2ggbmVlZHMgdG8gCisgICAgICAgICAgICAgICAgICAgICAgIGJlIHNlbnQgdG8gSERECisgIFxwYXJhbSBIRERjb250ZXh0IC0gQSBjb29raWUgcGFzc2VkIGJ5IEhERCB0byBiZSB1c2VkIGJ5IFNNRSBkdXJpbmcgYW55IFFvUyAKKyAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24gKHRocm91Z2ggdGhlIGNhbGxhYmNrKSB0byBIREQgCisgIFxwYXJhbSBVUFR5cGUgLSBVc2VmdWwgb25seSBpZiBIREQgb3IgYW55IG90aGVyIHVwcGVyIGxheWVyIG1vZHVsZSAoQkFQIGV0Yy4pCisgICAgICAgICAgICAgICAgICBsb29raW5nIGZvciBpbXBsaWNpdCBRb1Mgc2V0dXAsIGluIHRoYXQgCisgICAgICAgICAgICAgICAgICBjYXNlLCB0aGUgcFFvU0luZm8gd2lsbCBiZSBOVUxMICYgU01FIHdpbGwga25vdyBhYm91dCB0aGUgQUMKKyAgICAgICAgICAgICAgICAgIChmcm9tIHRoZSBVUCBwcm92aWRlZCBpbiB0aGlzIHBhcmFtKSBRb1MgaXMgcmVxdWVzdGVkIG9uCisgIFxwYXJhbSBwUW9zRmxvd0lEIC0gSWRlbnRpZmljYXRpb24gcGVyIGZsb3cgcnVubmluZyBvbiBlYWNoIEFDIGdlbmVyYXRlZCBieSAKKyAgICAgICAgICAgICAgICAgICAgICBTTUUuIAorICAgICAgICAgICAgICAgICAgICAgSXQgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBRb1Mgc2V0dXAgZm9yIHRoZSBmbG93IGlzIAorICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgICAgICAgCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFNldHVwIGlzIHN1Y2Nlc3NmdWwuCisgIAorICAgICAgICAgIE90aGVyIHN0YXR1cyBtZWFucyBTZXR1cCByZXF1ZXN0IGZhaWxlZCAgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc21lX1Fvc1N0YXR1c1R5cGUgc21lX1Fvc1NldHVwUmVxKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwUW9TSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zQ2FsbGJhY2sgUW9TQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIEhERGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1dtbVVwVHlwZSBVUFR5cGUsIHZfVTMyX3QgKiBwUW9zRmxvd0lEKQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIGVIYWxTdGF0dXMgbG9ja19zdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICBzbWVfUW9zU3RhdHVzVHlwZSBzdGF0dXM7CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IFFvUyBTZXR1cCByZXF1ZXN0ZWQgYnkgY2xpZW50IG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgIGxvY2tfc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIGxvY2tfc3RhdHVzICkgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IFVuYWJsZSB0byBvYnRhaW4gbG9jayIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisgICB9CisgICAvL01ha2Ugc3VyZSB0aGUgc2Vzc2lvbiBpcyB2YWxpZAorICAgaWYgKCFDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogU3VwcGxpZWQgU2Vzc2lvbiBJRCAlZCBpcyBpbnZhbGlkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICBzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8vTWFrZSBzdXJlIHRoZSBzZXNzaW9uIGlzIGFjdGl2ZQorICAgICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICAgICBpZiAoIXBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlKQorICAgICAgeyAKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBTdXBwbGllZCBTZXNzaW9uIElEICVkIGlzIGluYWN0aXZlIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICBzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8vQXNzaWduIGEgRmxvdyBJRAorICAgICAgICAgKnBRb3NGbG93SUQgPSBzbWVfUW9zQXNzaWduRmxvd0lkKCk7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IFFvUyByZXF1ZXN0IG9uIHNlc3Npb24gJWQgYXNzaWduZWQgRmxvdyBJRCAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsICpwUW9zRmxvd0lEKTsKKyAgICAgICAgIC8vQ2FsbCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gZm9yIFFvUyBzZXR1cCwKKyAgICAgICAgIC8vIGFkZGluZyBhIGxheWVyIG9mIGFic3RyYWN0aW9uCisgICAgICAgICBzdGF0dXMgPSBzbWVfUW9zSW50ZXJuYWxTZXR1cFJlcShwTWFjLCAodl9VOF90KXNlc3Npb25JZCwgcFFvU0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRb1NDYWxsYmFjaywgSEREY29udGV4dCwgVVBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBRb3NGbG93SUQsIFZPU19GQUxTRSwgVk9TX0ZBTFNFKTsKKyAgICAgIH0KKyAgIH0KKyAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBRb1Mgc2V0dXAgcmV0dXJuIHN0YXR1cyBvbiBzZXNzaW9uICVkIGlzICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgIHNlc3Npb25JZCwgc3RhdHVzKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NNb2RpZnlSZXEoKSAtIFRoZSBTTUUgUW9TIEFQSSBleHBvc2VkIHRvIEhERCB0byByZXF1ZXN0IGZvciAKKyAgbW9kaWZpY2F0aW9uIG9mIGNlcnRhaW4gUW9TIHBhcmFtcyBvbiBhIGZsb3cgcnVubmluZyBvbiBhIHBhcnRpY3VsYXIgQUMuIAorICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYSBsaW5rIGhhcyBiZWVuIGVzdGFibGlzaGVkLCBpLmUuIFNUQSBpcyAKKyAgYXNzb2NpYXRlZCB3aXRoIGFuIEFQIGV0Yy4gJiBhIFFvUyBzZXR1cCBoYXMgYmVlbiBzdWNjZXNmdWwgZm9yIHRoYXQgZmxvdy4gCisgIElmIHRoZSByZXF1ZXN0IGludm9sdmVzIGFkbWlzc2lvbiBjb250cm9sIG9uIHRoZSByZXF1ZXN0ZWQgQUMsIEhERCBuZWVkcyB0byAKKyAgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IFRyYWZmaWMgU3BlY2lmaWNhdGlvbiAoVFNQRUMpIHBhcmFtZXRlcnMgJiBTTUUgbWlnaHQKKyAgc3RhcnQgdGhlIHJlbmVnb3RpYXRpb24gcHJvY2VzcyB0aHJvdWdoIEFERFRTLgorICAKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIFxwYXJhbSBwUW9TSW5mbyAtIFBvaW50ZXIgdG8gc21lX1Fvc1dtbVRzcGVjSW5mbyB3aGljaCBjb250YWlucyB0aGUgV01NIFRTUEVDCisgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgaW5mbyBhcyBkZWZpbmVkIGFib3ZlLCBwcm92aWRlZCBieSBIREQKKyAgXHBhcmFtIFFvc0Zsb3dJRCAtIElkZW50aWZpY2F0aW9uIHBlciBmbG93IHJ1bm5pbmcgb24gZWFjaCBBQyBnZW5lcmF0ZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgU01FLiAKKyAgICAgICAgICAgICAgICAgICAgIEl0IGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgUW9TIHNldHVwIGZvciB0aGUgZmxvdyBoYXMgCisgICAgICAgICAgICAgICAgICAgICBiZWVuIHN1Y2Nlc3NmdWwgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgCisgIFxyZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19SU1AgLSBNb2RpZmljYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKyAgCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIHJlcXVlc3QgZmFpbGVkICAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfUW9zTW9kaWZ5UmVxKHRIYWxIYW5kbGUgaEhhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwUW9TSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCBRb3NGbG93SUQpCit7CisgICBlSGFsU3RhdHVzIGxvY2tfc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgc21lX1Fvc1N0YXR1c1R5cGUgc3RhdHVzOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBRb1MgTW9kaWZ5IHJlcXVlc3RlZCBieSBjbGllbnQgZm9yIEZsb3cgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgUW9zRmxvd0lEKTsKKyAgIGxvY2tfc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIGxvY2tfc3RhdHVzICkgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IFVuYWJsZSB0byBvYnRhaW4gbG9jayIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQOworICAgfQorICAgLy9DYWxsIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBmb3IgUW9TIG1vZGlmeSwgYWRkaW5nIGEgbGF5ZXIgb2YgYWJzdHJhY3Rpb24KKyAgIHN0YXR1cyA9IHNtZV9Rb3NJbnRlcm5hbE1vZGlmeVJlcShwTWFjLCBwUW9TSW5mbywgUW9zRmxvd0lELCBWT1NfRkFMU0UpOworICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IFFvUyBNb2RpZnkgcmV0dXJuIHN0YXR1cyBvbiBGbG93ICVkIGlzICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgIFFvc0Zsb3dJRCwgc3RhdHVzKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zUmVsZWFzZVJlcSgpIC0gVGhlIFNNRSBRb1MgQVBJIGV4cG9zZWQgdG8gSEREIHRvIHJlcXVlc3QgZm9yIAorICByZWxlYXNpbmcgYSBRb1MgZmxvdyBydW5uaW5nIG9uIGEgcGFydGljdWxhciBBQy4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgCisgIGNhbGxlZCBvbmx5IGlmIGEgUW9TIGlzIHNldCB1cCB3aXRoIGEgdmFsaWQgRmxvd0lELiBIREQgc291bGQgaW52b2tlIHRoaXMgCisgIEFQSSBvbmx5IGlmIGFuIGV4cGxpY2l0IHJlcXVlc3QgZm9yIFFvUyByZWxlYXNlIGhhcyBjb21lIGZyb20gQXBwbGljYXRpb24gCisgIAorICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgXHBhcmFtIFFvc0Zsb3dJRCAtIElkZW50aWZpY2F0aW9uIHBlciBmbG93IHJ1bm5pbmcgb24gZWFjaCBBQyBnZW5lcmF0ZWQgYnkgU01FCisgICAgICAgICAgICAgICAgICAgICBJdCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIFFvUyBzZXR1cCBmb3IgdGhlIGZsb3cgaXMgCisgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsCisgIAorICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBSZWxlYXNlIGlzIHN1Y2Nlc3NmdWwuCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3NtZV9Rb3NTdGF0dXNUeXBlIHNtZV9Rb3NSZWxlYXNlUmVxKHRIYWxIYW5kbGUgaEhhbCwgdl9VMzJfdCBRb3NGbG93SUQpCit7CisgICBlSGFsU3RhdHVzIGxvY2tfc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgc21lX1Fvc1N0YXR1c1R5cGUgc3RhdHVzOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBRb1MgUmVsZWFzZSByZXF1ZXN0ZWQgYnkgY2xpZW50IGZvciBGbG93ICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgIFFvc0Zsb3dJRCk7CisgICBsb2NrX3N0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBsb2NrX3N0YXR1cyApICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBVbmFibGUgdG8gb2J0YWluIGxvY2siLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfRkFJTFVSRV9SU1A7CisgICB9CisgICAvL0NhbGwgdGhlIGludGVybmFsIGZ1bmN0aW9uIGZvciBRb1MgcmVsZWFzZSwgYWRkaW5nIGEgbGF5ZXIgb2YgYWJzdHJhY3Rpb24KKyAgIHN0YXR1cyA9IHNtZV9Rb3NJbnRlcm5hbFJlbGVhc2VSZXEocE1hYywgUW9zRmxvd0lELCBWT1NfRkFMU0UpOworICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IFFvUyBSZWxlYXNlIHJldHVybiBzdGF0dXMgb24gRmxvdyAlZCBpcyAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICBRb3NGbG93SUQsIHN0YXR1cyk7CisgICByZXR1cm4gc3RhdHVzOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1NldFBhcmFtcygpIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IEhERCB0byBwcm92aWRlIHRoZSAKKyAgIGRlZmF1bHQgVFNQRUMgcGFyYW1zIHRvIFNNRS4KKyAgCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICBccGFyYW0gcFFvU0luZm8gLSBQb2ludGVyIHRvIHNtZV9Rb3NXbW1Uc3BlY0luZm8gd2hpY2ggY29udGFpbnMgdGhlIFdNTSBUU1BFQworICAgICAgICAgICAgICAgICAgICByZWxhdGVkIGluZm8gcGVyIEFDIGFzIGRlZmluZWQgYWJvdmUsIHByb3ZpZGVkIGJ5IEhERAorICAKKyAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIC0gU2V0cGFyYW0gaXMgc3VjY2Vzc2Z1bC4KKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zU2V0UGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwUW9TSW5mbykKK3sKKyAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjOworICAgLy8gZmluZCB0aGUgQUMKKyAgIGFjID0gc21lX1Fvc1VwVG9BYyhwUW9TSW5mby0+dHNfaW5mby51cCk7CisgICBpZihTTUVfUU9TX0VEQ0FfQUNfTUFYID09IGFjKQorICAgeworICAgICAgLy9lcnIgbXNnCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogSW52YWxpZCBBQyAlZCAodmlhIFVQICVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBhYywgcFFvU0luZm8tPnRzX2luZm8udXAgKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgLy9jb3B5IG92ZXIgdGhlIGRlZmF1bHQgcGFyYW1zIGZvciB0aGlzIEFDCisgICBzbWVfUW9zQ2IuZGVmX1FvU0luZm9bYWNdID0gKnBRb1NJbmZvOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBRb1MgZGVmYXVsdCBwYXJhbXMgc2V0IGZvciBBQyAlZCAodmlhIFVQICVkKSIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICBhYywgcFFvU0luZm8tPnRzX2luZm8udXAgKTsKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCit2b2lkIHFvc1JlbGVhc2VDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCApCit7CisgICB2b3NfbWVtX3plcm8oICZwQ29tbWFuZC0+dS5xb3NDbWQsIHNpemVvZiggdEdlbmVyaWNRb3NDbWQgKSApOworICAgc21lUmVsZWFzZUNvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NNc2dQcm9jZXNzb3IoKSAtIHNtZV9Qcm9jZXNzTXNnKCkgY2FsbHMgdGhpcyBmdW5jdGlvbiBmb3IgdGhlIAorICBtZXNzYWdlcyB0aGF0IGFyZSBoYW5kbGVkIGJ5IFNNRSBRb1MgbW9kdWxlLgorICAKKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgIFxwYXJhbSBtc2dfdHlwZSAtIHRoZSB0eXBlIG9mIG1zZyBwYXNzZWQgYnkgUEUgYXMgZGVmaW5lZCBpbiB3bmlBcGkuaAorICBccGFyYW0gcE1zZ0J1ZiAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IG1hcHMgdG8gdmFyaW91cyBzdHJ1Y3R1cmVzIGJhc2UgCisgICAgICAgICAgICAgICAgICAgb24gdGhlIG1lc3NhZ2UgdHlwZS4KKyAgICAgICAgICAgICAgICAgICBUaGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgY2FuIGFsd2F5cyBtYXAgdG8gdFNpclNtZVJzcC4KKyAgCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFZhbGlkYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zTXNnUHJvY2Vzc29yKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAgdl9VMTZfdCBtc2dfdHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBNc2dCdWYpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgIHRTbWVDbWQgKnBDb21tYW5kOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBtc2cgPSAlZCBmb3IgUW9TIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBtc2dfdHlwZSk7CisgICAvL3N3aXRjaCBvbiB0aGUgbXNnIHR5cGUgJiBtYWtlIHRoZSBzdGF0ZSB0cmFuc2l0aW9uIGFjY29yZGluZ2x5CisgICBzd2l0Y2gobXNnX3R5cGUpCisgICB7CisgICAgICBjYXNlIGVXTklfU01FX0FERFRTX1JTUDoKKyAgICAgICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisgICAgICAgICBpZiggcEVudHJ5ICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKyAgICAgICAgICAgICBpZiggZVNtZUNvbW1hbmRBZGRUcyA9PSBwQ29tbWFuZC0+Y29tbWFuZCApCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9Rb3NQcm9jZXNzQWRkVHNSc3AocE1hYywgcE1zZ0J1Zik7CisgICAgICAgICAgICAgICAgaWYoIGNzckxMUmVtb3ZlRW50cnkoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTE9DSyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcW9zUmVsZWFzZUNvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNtZVByb2Nlc3NQZW5kaW5nUXVldWUoIHBNYWMgKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVdOSV9TTUVfREVMVFNfUlNQOgorICAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKyAgICAgICAgIGlmKCBwRW50cnkgKQorICAgICAgICAgeworICAgICAgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworICAgICAgICAgICAgIGlmKCBlU21lQ29tbWFuZERlbFRzID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX1Fvc1Byb2Nlc3NEZWxUc1JzcChwTWFjLCBwTXNnQnVmKTsKKyAgICAgICAgICAgICAgICBpZiggY3NyTExSZW1vdmVFbnRyeSggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBwRW50cnksIExMX0FDQ0VTU19MT0NLICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBxb3NSZWxlYXNlQ29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc21lUHJvY2Vzc1BlbmRpbmdRdWV1ZSggcE1hYyApOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlV05JX1NNRV9ERUxUU19JTkQ6CisgICAgICAgICBzdGF0dXMgPSBzbWVfUW9zUHJvY2Vzc0RlbFRzSW5kKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgIGNhc2UgZVdOSV9TTUVfRlRfQUdHUl9RT1NfUlNQOgorICAgICAgICAgc3RhdHVzID0gc21lX1Fvc1Byb2Nlc3NBZ2dyUW9zUnNwKHBNYWMsIHBNc2dCdWYpOworICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIC8vZXJyIG1zZworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IHVua25vd24gbXNnIHR5cGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgbXNnX3R5cGUpOworICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gc3RhdHVzOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1ZhbGlkYXRlUGFyYW1zKCkgLSBUaGUgU01FIFFvUyBBUEkgZXhwb3NlZCB0byBDU1IgdG8gdmFsaWRhdGUgQVAKKyAgY2FwYWJpbGl0aWVzIHJlZ2FyZGluZyBRb1Mgc3VwcG9ydCAmIGFueSBvdGhlciBRb1MgcGFyYW1ldGVyIHZhbGlkYXRpb24uCisgIAorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHBhcmFtIHBCc3NEZXNjIC0gUG9pbnRlciB0byB0aGUgQlNTIERlc2NyaXB0b3IgaW5mb3JtYXRpb24gcGFzc2VkIGRvd24gYnkgCisgICAgICAgICAgICAgICAgICAgIENTUiB0byBQRSB3aGlsZSBpc3N1aW5nIHRoZSBKb2luIHJlcXVlc3QKKyAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NWYWxpZGF0ZVBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MpCit7CisgICB0RG90MTFmQmVhY29uSUVzICpwSWVzID0gTlVMTDsKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiJXM6ICVkOiB2YWxpZGF0aW9uIGZvciBRQVAgJiBBUFNEIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgIGRvCisgICB7CisgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsIHBCc3NEZXNjLCAmcEllcykpKQorICAgICAgeworICAgICAgICAgLy9lcnIgbXNnCisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMoKSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvL2NoZWNrIGlmIHRoZSBBUCBpcyBRQVAgJiBpdCBzdXBwb3J0cyBBUFNECisgICAgICBpZiggIUNTUl9JU19RT1NfQlNTKHBJZXMpICkKKyAgICAgIHsKKyAgICAgICAgIC8vZXJyIG1zZworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IEFQIGRvZXNuJ3Qgc3VwcG9ydCBRb1MiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmKCEocEllcy0+V01NUGFyYW1zLnFvc0luZm8gJiBTTUVfUU9TX0FQX1NVUFBPUlRTX0FQU0QpICYmCisgICAgICAgICAhKHBJZXMtPldNTUluZm9BcC51YXBzZCkpCisgICAgICB7CisgICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBBUCBkb2Vzbid0IHN1cHBvcnQgQVBTRCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB9d2hpbGUoMCk7CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IHZhbGlkYXRlZCB3aXRoIHN0YXR1cyA9ICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzdGF0dXMpOworICAgaWYocEllcykKKyAgIHsKKyAgICAgIHZvc19tZW1fZnJlZShwSWVzKTsKKyAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zQ3NyRXZlbnRJbmQoKSAtIFRoZSBRb1Mgc3ViLW1vZHVsZSBpbiBTTUUgZXhwZWN0cyBub3RpZmljYXRpb25zIAorICBmcm9tIENTUiB3aGVuIGNlcnRhaW4gZXZlbnRzIG9jY3VyIGFzIG1lbnRpb25lZCBpbiBzbWVfUW9zQ3NyRXZlbnRJbmRUeXBlLgorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHBhcmFtIGluZCAtIFRoZSBldmVudCBvY2N1cnJlZCBvZiB0eXBlIHNtZV9Rb3NDc3JFdmVudEluZFR5cGUuCisgIFxwYXJhbSBwRXZlbnRfaW5mbyAtIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGV2ZW50CisgIAorICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zQ3NyRXZlbnRJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zQ3NyRXZlbnRJbmRUeXBlIGluZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwRXZlbnRfaW5mbykKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogT24gU2Vzc2lvbiAlZCBFdmVudCAlZCByZWNlaXZlZCBmcm9tIENTUiIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICBzZXNzaW9uSWQsIGluZCApOworICAgc3dpdGNoKGluZCkKKyAgIHsKKyAgICAgIGNhc2UgU01FX1FPU19DU1JfQVNTT0NfQ09NUExFVEU6CisgICAgICAgICAvL2V4cGVjdGluZyBhc3NvYyBpbmZvIGluIHBFdmVudF9pbmZvCisgICAgICAgICBzdGF0dXMgPSBzbWVfUW9zUHJvY2Vzc0Fzc29jQ29tcGxldGVFdihwTWFjLCBzZXNzaW9uSWQsIHBFdmVudF9pbmZvKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTUVfUU9TX0NTUl9SRUFTU09DX1JFUToKKyAgICAgICAgIC8vbm90aGluZyBleHBlY3RlZCBpbiBwRXZlbnRfaW5mbworICAgICAgICAgc3RhdHVzID0gc21lX1Fvc1Byb2Nlc3NSZWFzc29jUmVxRXYocE1hYywgc2Vzc2lvbklkLCBwRXZlbnRfaW5mbyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU01FX1FPU19DU1JfUkVBU1NPQ19DT01QTEVURToKKyAgICAgICAgIC8vZXhwZWN0aW5nIGFzc29jIGluZm8gaW4gcEV2ZW50X2luZm8KKyAgICAgICAgIHN0YXR1cyA9IHNtZV9Rb3NQcm9jZXNzUmVhc3NvY1N1Y2Nlc3NFdihwTWFjLCBzZXNzaW9uSWQsIHBFdmVudF9pbmZvKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTUVfUU9TX0NTUl9SRUFTU09DX0ZBSUxVUkU6CisgICAgICAgICAvL25vdGhpbmcgZXhwZWN0ZWQgaW4gcEV2ZW50X2luZm8KKyAgICAgICAgIHN0YXR1cyA9IHNtZV9Rb3NQcm9jZXNzUmVhc3NvY0ZhaWx1cmVFdihwTWFjLCBzZXNzaW9uSWQsIHBFdmVudF9pbmZvKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTUVfUU9TX0NTUl9ESVNDT05ORUNUX1JFUToKKyAgICAgIGNhc2UgU01FX1FPU19DU1JfRElTQ09OTkVDVF9JTkQ6CisgICAgICAgICAvL25vdGhpbmcgZXhwZWN0ZWQgaW4gcEV2ZW50X2luZm8KKyAgICAgICAgIHN0YXR1cyA9IHNtZV9Rb3NQcm9jZXNzRGlzY29ubmVjdEV2KHBNYWMsIHNlc3Npb25JZCwgcEV2ZW50X2luZm8pOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNNRV9RT1NfQ1NSX0pPSU5fUkVROgorICAgICAgICAgLy9ub3RoaW5nIGV4cGVjdGVkIGluIHBFdmVudF9pbmZvCisgICAgICAgICBzdGF0dXMgPSBzbWVfUW9zUHJvY2Vzc0pvaW5SZXFFdihwTWFjLCBzZXNzaW9uSWQsIHBFdmVudF9pbmZvKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTUVfUU9TX0NTUl9IQU5ET0ZGX0FTU09DX1JFUToKKyAgICAgICAgIC8vbm90aGluZyBleHBlY3RlZCBpbiBwRXZlbnRfaW5mbworICAgICAgICAgc3RhdHVzID0gc21lX1Fvc1Byb2Nlc3NIYW5kb2ZmQXNzb2NSZXFFdihwTWFjLCBzZXNzaW9uSWQsIHBFdmVudF9pbmZvKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTUVfUU9TX0NTUl9IQU5ET0ZGX0NPTVBMRVRFOgorICAgICAgICAgLy9ub3RoaW5nIGV4cGVjdGVkIGluIHBFdmVudF9pbmZvCisgICAgICAgICBzdGF0dXMgPSBzbWVfUW9zUHJvY2Vzc0hhbmRvZmZTdWNjZXNzRXYocE1hYywgc2Vzc2lvbklkLCBwRXZlbnRfaW5mbyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU01FX1FPU19DU1JfSEFORE9GRl9GQUlMVVJFOgorICAgICAgICAgLy9ub3RoaW5nIGV4cGVjdGVkIGluIHBFdmVudF9pbmZvCisgICAgICAgICBzdGF0dXMgPSBzbWVfUW9zUHJvY2Vzc0hhbmRvZmZGYWlsdXJlRXYocE1hYywgc2Vzc2lvbklkLCBwRXZlbnRfaW5mbyk7CisgICAgICAgICBicmVhazsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgY2FzZSBTTUVfUU9TX0NTUl9QUkVBVVRIX1NVQ0NFU1NfSU5EOgorICAgICAgICAgc3RhdHVzID0gc21lX1Fvc1Byb2Nlc3NQcmVhdXRoU3VjY2Vzc0luZChwTWFjLCBzZXNzaW9uSWQsIHBFdmVudF9pbmZvKTsKKyAgICAgICAgIGJyZWFrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgIGNhc2UgU01FX1FPU19DU1JfU0VUX0tFWV9TVUNDRVNTX0lORDoKKyAgICAgICAgIHN0YXR1cyA9IHNtZV9Rb3NQcm9jZXNzU2V0S2V5U3VjY2Vzc0luZChwTWFjLCBzZXNzaW9uSWQsIHBFdmVudF9pbmZvKTsKKyAgICAgICAgIGJyZWFrOworI2VuZGlmCisjZW5kaWYKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAvL0VyciBtc2cKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBTZXNzaW9uICVkIFVua25vd24gRXZlbnQgJWQgcmVjZWl2ZWQgZnJvbSBDU1IiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBpbmQgKTsKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBPbiBTZXNzaW9uICVkIHByb2Nlc3NlZCBFdmVudCAlZCB3aXRoIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICBzZXNzaW9uSWQsIGluZCwgc3RhdHVzICk7CisgICByZXR1cm4gc3RhdHVzOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc0dldEFDTU1hc2soKSAtIFRoZSBRb1Mgc3ViLW1vZHVsZSBBUEkgdG8gZmluZCBvdXQgb24gd2hpY2ggQUNzCisgIEFQIG1hbmRhdGVzIEFkbWlzc2lvbiBDb250cm9sIChBQ00gPSAxKQorICAoQml0MDpWTzsgQml0MTpWSTsgQml0MjpCSzsgQml0MzpCRSBhbGwgb3RoZXIgYml0cyBhcmUgaWdub3JlZCkKKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgIFxwYXJhbSBwU2lyQnNzRGVzYyAtIFRoZSBldmVudCBvY2N1cnJlZCBvZiB0eXBlIHNtZV9Rb3NDc3JFdmVudEluZFR5cGUuCisKKyAgXHJldHVybiBhIGJpdCBtYXNrIGluZGljYXRpbmcgZm9yIHdoaWNoIEFDcyBBUCBoYXMgQUNNIHNldCB0byAxCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVThfdCBzbWVfUW9zR2V0QUNNTWFzayh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworICAgc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisgICB2X1U4X3QgYWNtX21hc2sgPSAwOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBpbnZva2VkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgIGZvcihhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKQorICAgeworICAgICAgaWYoc21lX1Fvc0lzQUNNKHBNYWMsIHBTaXJCc3NEZXNjLCBhYywgcEllcykpCisgICAgICB7CisgICAgICAgICBhY21fbWFzayA9IGFjbV9tYXNrIHwgKDEgPDwgKFNNRV9RT1NfRURDQV9BQ19WTyAtIGFjKSk7CisgICAgICB9CisgICAgICAKKyAgIH0KKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogbWFzayBpcyAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgYWNtX21hc2spOworICAgcmV0dXJuIGFjbV9tYXNrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbCBmdW5jdGlvbiBkZWZpbml0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc0ludGVybmFsU2V0dXBSZXEoKSAtIFRoZSBTTUUgUW9TIGludGVybmFsIHNldHVwIHJlcXVlc3QgaGFuZGxpbmcKKyAgZnVuY3Rpb24uCisgIElmIHRoZSByZXF1ZXN0IGludm9sdmVzIGFkbWlzc2lvbiBjb250cm9sIG9uIHRoZSByZXF1ZXN0ZWQgQUMsIEhERCBuZWVkcyB0byAKKyAgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IFRyYWZmaWMgU3BlY2lmaWNhdGlvbiAoVFNQRUMpIHBhcmFtZXRlcnMgb3RoZXJ3aXNlIFNNRSAKKyAgaXMgZ29pbmcgdG8gdXNlIHRoZSBkZWZhdWx0IHBhcmFtcy4KKyAgCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICBccGFyYW0gcFFvU0luZm8gLSBQb2ludGVyIHRvIHNtZV9Rb3NXbW1Uc3BlY0luZm8gd2hpY2ggY29udGFpbnMgdGhlIFdNTSBUU1BFQworICAgICAgICAgICAgICAgICAgICByZWxhdGVkIGluZm8gYXMgZGVmaW5lZCBhYm92ZSwgcHJvdmlkZWQgYnkgSERECisgIFxwYXJhbSBRb1NDYWxsYmFjayAtIFRoZSBjYWxsYmFjayB3aGljaCBpcyByZWdpc3RlcmVkIHBlciBmbG93IHdoaWxlIAorICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0aW5nIGZvciBRb1MuIFVzZWQgZm9yIGFueSBub3RpZmljYXRpb24gZm9yIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvdyAoaS5lLiBzZXR1cCBzdWNjZXNzL2ZhaWx1cmUvcmVsZWFzZSkgd2hpY2ggbmVlZHMgdG8gCisgICAgICAgICAgICAgICAgICAgICAgIGJlIHNlbnQgdG8gSERECisgIFxwYXJhbSBIRERjb250ZXh0IC0gQSBjb29raWUgcGFzc2VkIGJ5IEhERCB0byBiZSB1c2VkIGJ5IFNNRSBkdXJpbmcgYW55IFFvUyAKKyAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24gKHRocm91Z2ggdGhlIGNhbGxhYmNrKSB0byBIREQgCisgIFxwYXJhbSBVUFR5cGUgLSBVc2VmdWwgb25seSBpZiBIREQgb3IgYW55IG90aGVyIHVwcGVyIGxheWVyIG1vZHVsZSAoQkFQIGV0Yy4pCisgICAgICAgICAgICAgICAgICBsb29raW5nIGZvciBpbXBsaWNpdCBRb1Mgc2V0dXAsIGluIHRoYXQgCisgICAgICAgICAgICAgICAgICBjYXNlLCB0aGUgcFFvU0luZm8gd2lsbCBiZSBOVUxMICYgU01FIHdpbGwga25vdyBhYm91dCB0aGUgQUMKKyAgICAgICAgICAgICAgICAgIChmcm9tIHRoZSBVUCBwcm92aWRlZCBpbiB0aGlzIHBhcmFtKSBRb1MgaXMgcmVxdWVzdGVkIG9uCisgIFxwYXJhbSBRb3NGbG93SUQgLSBJZGVudGlmaWNhdGlvbiBwZXIgZmxvdyBydW5uaW5nIG9uIGVhY2ggQUMgZ2VuZXJhdGVkIGJ5IAorICAgICAgICAgICAgICAgICAgICAgIFNNRS4gCisgICAgICAgICAgICAgICAgICAgICBJdCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIFFvUyBzZXR1cCBmb3IgdGhlIGZsb3cgaXMgCisgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsCisgIFxwYXJhbSBidWZmZXJlZF9jbWQgLSB0ZWxscyB1cyBpZiB0aGUgY21kIHdhcyBhIGJ1ZmZlcmVkIG9uZSBvciBmcmVzaCBmcm9tIAorICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50CisgICAgICAgICAgICAgICAgICAKKyAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIC0gU2V0dXAgaXMgc3VjY2Vzc2Z1bC4KKyAgCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNldHVwIHJlcXVlc3QgZmFpbGVkICAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfUW9zSW50ZXJuYWxTZXR1cFJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zV21tVHNwZWNJbmZvICogcFFvU0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zQ2FsbGJhY2sgUW9TQ2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIEhERGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zV21tVXBUeXBlIFVQVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IFFvc0Zsb3dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IGJ1ZmZlcmVkX2NtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IGhvUmVuZXdhbCkKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisgICBzbWVfUW9zV21tVHNwZWNJbmZvIFRzcGVjX0luZm87CisgICBzbWVfUW9zU3RhdGVzIG5ld19zdGF0ZSA9IFNNRV9RT1NfQ0xPU0VEOworICAgc21lX1Fvc0Zsb3dJbmZvRW50cnkgKnBlbnRyeSA9IE5VTEw7CisgICBzbWVfUW9zQ21kSW5mbyAgY21kOworICAgc21lX1Fvc1N0YXR1c1R5cGUgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisgICB2X1U4X3QgdG1hc2sgPSAwOworICAgdl9VOF90IG5ld190bWFzayA9IDA7CisgICBzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5OworICAgdl9CT09MX3QgYnVmZmVyQ29tbWFuZDsKKyAgIGVIYWxTdGF0dXMgaHN0YXR1czsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIGZvciBmbG93ICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgIHNlc3Npb25JZCwgUW9zRmxvd0lEKTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgLy8gaWYgY2FsbGVyIHNlbnQgYW4gZW1wdHkgVFNQRUMsIGZpbGwgdXAgd2l0aCB0aGUgZGVmYXVsdCBvbmUKKyAgIGlmKCFwUW9TSW5mbykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sIAorICAgICAgICAgICAgICAgICIlczogJWQ6IGNhbGxlciBzZW50IGFuIGVtcHR5IFFvUyBwYXJhbSBsaXN0LCB1c2luZyBkZWZhdWx0cyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAvLyBmaW5kIHRoZSBBQyB3aXRoIFVQVHlwZSBwYXNzZWQgaW4KKyAgICAgIGFjID0gc21lX1Fvc1VwVG9BYyhVUFR5cGUpOworICAgICAgaWYoU01FX1FPU19FRENBX0FDX01BWCA9PSBhYykKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBpbnZhbGlkIEFDICVkIGZyb20gVVAgJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgYWMsIFVQVHlwZSk7CisgICAgICAgICAKKyAgICAgICAgIHJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9JTlZBTElEX1BBUkFNU19SU1A7CisgICAgICB9CisgICAgICBUc3BlY19JbmZvID0gc21lX1Fvc0NiLmRlZl9Rb1NJbmZvW2FjXTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8vIGZpbmQgdGhlIEFDCisgICAgICBhYyA9IHNtZV9Rb3NVcFRvQWMocFFvU0luZm8tPnRzX2luZm8udXApOworICAgICAgaWYoU01FX1FPU19FRENBX0FDX01BWCA9PSBhYykKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBpbnZhbGlkIEFDICVkIGZyb20gVVAgJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgYWMsIHBRb1NJbmZvLT50c19pbmZvLnVwKTsKKyAgICAgICAgIAorICAgICAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX1NFVFVQX0lOVkFMSURfUEFSQU1TX1JTUDsKKyAgICAgIH0KKyAgICAgIC8vdmFsaWRhdGUgUW9TIHBhcmFtcworICAgICAgaWYoIXNtZV9Rb3NWYWxpZGF0ZVJlcXVlc3RlZFBhcmFtcyhwTWFjLCBwUW9TSW5mbywgc2Vzc2lvbklkKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBpbnZhbGlkIHBhcmFtcyIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICByZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfSU5WQUxJRF9QQVJBTVNfUlNQOworICAgICAgfQorICAgICAgVHNwZWNfSW5mbyA9ICpwUW9TSW5mbzsKKyAgIH0KKyAgIHBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworICAgLy8gbmVlZCB0byB2b3RlIG9mZiBwb3dlcnNhdmUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIHJlcXVlc3QKKyAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19GQUxTRTsKKyAgIC8vIGFzc3VtZSB3ZSB3b24ndCBoYXZlIHRvIChyZSlidWZmZXIgdGhlIGNvbW1hbmQKKyAgIGJ1ZmZlckNvbW1hbmQgPSBWT1NfRkFMU0U7CisgICAvL2NoZWNrIHRvIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZmxvd2luZyBzY2VuYXJpbworICAgLy9BZGR0cyByZXF1ZXN0IGlzIHBlbmRpbmcgb24gb25lIEFDLCB3aGlsZSBBUFNEIHJlcXVlc3RlZCBvbiBhbm90aGVyIHdoaWNoIAorICAgLy9uZWVkcyBhIHJlYXNzb2MuIFdpbGwgYnVmZmVyIGEgcmVxdWVzdCBpZiBBZGR0cyBpcyBwZW5kaW5nIG9uIGFueSBBQywgCisgICAvL3doaWNoIHdpbGwgc2FmZWdhdXJkIHRoZSBhYm92ZSBzY2VuYXJpbywgJiBhbHNvIHdvbid0IGNvbmZ1c2UgUEUgd2l0aCBiYWNrIAorICAgLy90byBiYWNrIEFkZHRzIG9yIEFkZHRzIGZvbGxvd2VkIGJ5IFJlYXNzb2MKKyAgIGlmKHNtZV9Rb3NJc1JzcFBlbmRpbmcoc2Vzc2lvbklkLCBhYykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogYnVmZmVyaW5nIHRoZSBzZXR1cCByZXF1ZXN0IGZvciBmbG93ICVkIGluIHN0YXRlICVkICIKKyAgICAgICAgICAgICAgICAic2luY2UgYW5vdGhlciByZXF1ZXN0IGlzIHBlbmRpbmciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIAorICAgICAgICAgICAgICAgIFFvc0Zsb3dJRCwgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgYnVmZmVyQ29tbWFuZCA9IFZPU19UUlVFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy8gbWFrZSBzdXJlIHdlIGFyZSBpbiBmdWxsIHBvd2VyIHNvIHRoYXQgd2UgY2FuIGlzc3VlCisgICAgICAvLyBhbiBBZGRUUyBvciByZWFzc29jIGlmIG5lY2Vzc2FyeQorICAgICAgaHN0YXR1cyA9IHBtY1JlcXVlc3RGdWxsUG93ZXIocE1hYywgc21lX1Fvc1BtY0Z1bGxQb3dlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24sIGVTTUVfUkVBU09OX09USEVSKTsKKyAgICAgIGlmKCBlSEFMX1NUQVRVU19QTUNfUEVORElORyA9PSBoc3RhdHVzICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBidWZmZXJpbmcgdGhlIHNldHVwIHJlcXVlc3QgZm9yIGZsb3cgJWQgaW4gc3RhdGUgJWQsICIKKyAgICAgICAgICAgICAgICAgICAid2FpdGluZyBmb3IgZnVsbCBwb3dlciIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgCisgICAgICAgICAgICAgICAgICAgUW9zRmxvd0lELCBwQUNJbmZvLT5jdXJyX3N0YXRlICk7CisgICAgICAgICBidWZmZXJDb21tYW5kID0gVk9TX1RSVUU7CisgICAgICB9CisgICB9CisgICBpZiAoYnVmZmVyQ29tbWFuZCkKKyAgIHsKKyAgICAgIC8vIHdlIG5lZWQgdG8gYnVmZmVyIHRoZSBjb21tYW5kCisgICAgICBjbWQuY29tbWFuZCA9IFNNRV9RT1NfU0VUVVBfUkVROworICAgICAgY21kLnBNYWMgPSBwTWFjOworICAgICAgY21kLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgIGNtZC51LnNldHVwQ21kSW5mby5IRERjb250ZXh0ID0gSEREY29udGV4dDsKKyAgICAgIGNtZC51LnNldHVwQ21kSW5mby5Rb1NJbmZvID0gVHNwZWNfSW5mbzsKKyAgICAgIGNtZC51LnNldHVwQ21kSW5mby5Rb1NDYWxsYmFjayA9IFFvU0NhbGxiYWNrOworICAgICAgY21kLnUuc2V0dXBDbWRJbmZvLlVQVHlwZSA9IFVQVHlwZTsKKyAgICAgIGNtZC51LnNldHVwQ21kSW5mby5ob1JlbmV3YWwgPSBob1JlbmV3YWw7CisgICAgICBjbWQudS5zZXR1cENtZEluZm8uUW9zRmxvd0lEID0gUW9zRmxvd0lEOworICAgICAgaHN0YXR1cyA9IHNtZV9Rb3NCdWZmZXJDbWQoJmNtZCwgYnVmZmVyZWRfY21kKTsKKyAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoaHN0YXR1cykpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogY291bGRuJ3QgYnVmZmVyIHRoZSBzZXR1cCByZXF1ZXN0IGluIHN0YXRlID0gJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgICAgLy8gdW5hYmxlIHRvIGJ1ZmZlciB0aGUgcmVxdWVzdAorICAgICAgICAgLy8gbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOworICAgICAgfQorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBCdWZmZXJlZCBzZXR1cCByZXF1ZXN0IGZvciBmbG93ID0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgUW9zRmxvd0lEKTsKKyAgICAgIHJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1A7CisgICB9CisKKyAgIC8vZ2V0IGludG8gdGhlIHN0YXRlIG0vYyB0byBzZWUgaWYgdGhlIHJlcXVlc3QgY2FuIGJlIGdyYW50ZWQKKyAgIHN3aXRjaChwQUNJbmZvLT5jdXJyX3N0YXRlKQorICAgeworICAgY2FzZSBTTUVfUU9TX0xJTktfVVA6CisgICAgICAvL2NhbGwgdGhlIGludGVybmFsIHFvcyBzZXR1cCBsb2dpYyB0byBkZWNpZGUgb24gaWYgdGhlCisgICAgICAvLyByZXF1ZXN0IGlzIE5PUCwgb3IgbmVlZCByZWFzc29jIGZvciBBUFNEIGFuZC9vciBuZWVkIHRvIHNlbmQgb3V0IEFERFRTCisgICAgICBzdGF0dXMgPSBzbWVfUW9zU2V0dXAocE1hYywgc2Vzc2lvbklkLCAmVHNwZWNfSW5mbywgYWMpOworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHdpdGggQUMgJWQgaW4gc3RhdGUgU01FX1FPU19MSU5LX1VQICIKKyAgICAgICAgICAgICAgICAic21lX1Fvc1NldHVwIHJldHVybmVkIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMsIHN0YXR1cyk7CisgICAgICBpZihTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1AgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgLy8gd2UgYXJlbid0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVAKKyAgICAgICAgIC8vIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgfQorICAgICAgaWYoKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUCA9PSBzdGF0dXMpfHwKKyAgICAgICAgIChTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUCA9PSBzdGF0dXMpIHx8CisgICAgICAgICAoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZID09IHN0YXR1cykpCisgICAgICB7CisgICAgICAgICAvLyB3ZSByZWNlaXZlZCBhbiBleHBlY3RlZCAiZ29vZCIgc3RhdHVzCisgICAgICAgICAvL2NyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgZmxvdyBsaXN0CisgICAgICAgICBwZW50cnkgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YoKnBlbnRyeSkpOworICAgICAgICAgaWYgKCFwZW50cnkpCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICJlbnRyeSBpbiB0aGUgRmxvdyBMaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgIHJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDsKKyAgICAgICAgIH0KKyAgICAgICAgIHBlbnRyeS0+YWNfdHlwZSA9IGFjOworICAgICAgICAgcGVudHJ5LT5IRERjb250ZXh0ID0gSEREY29udGV4dDsKKyAgICAgICAgIHBlbnRyeS0+UW9TQ2FsbGJhY2sgPSBRb1NDYWxsYmFjazsKKyAgICAgICAgIHBlbnRyeS0+aG9SZW5ld2FsID0gaG9SZW5ld2FsOworICAgICAgICAgcGVudHJ5LT5Rb3NGbG93SUQgPSBRb3NGbG93SUQ7CisgICAgICAgICBwZW50cnktPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSBpbiBzdGF0ZSBTTUVfUU9TX0xJTktfVVAgdGhpcyBtdXN0IGJlIHRoZQorICAgICAgICAgLy8gZmlyc3QgVFNQRUMgb24gdGhpcyBBQywgc28gdXNlIGluZGV4IDAgKG1hc2sgYml0IDEpCisgICAgICAgICBwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdID0gVHNwZWNfSW5mbzsKKyAgICAgICAgIGlmKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUCA9PSBzdGF0dXMpCisgICAgICAgICB7CisgICAgICAgICAgICBpZihwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyAmJgorICAgICAgICAgICAgICAgIXBBQ0luZm8tPnJlYXNzb2NfcGVuZGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHdpdGggQUMgJWQgaW4gc3RhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTTUVfUU9TX0xJTktfVVAgdHNwZWNfbWFza19zdGF0dXMgaXMgJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgc2hvdWxkIG5vdCBiZSBzZXQgeWV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMsIHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzKTsKKyAgICAgICAgICAgICAgIC8vQVNTRVJUCisgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBlbnRyeSk7CisgICAgICAgICAgICAgICByZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyA9IFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV9TRVQ7CisgICAgICAgICAgICBpZighcEFDSW5mby0+cmVhc3NvY19wZW5kaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy8gd2UgZGlkbid0IHJlcXVlc3QgZm9yIHJlYXNzb2MsIGl0IG11c3QgYmUgYSB0c3BlYyBuZWdvdGlhdGlvbgorICAgICAgICAgICAgICAgcEFDSW5mby0+dHNwZWNfcGVuZGluZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgCisgICAgICAgICAgICBwZW50cnktPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1NFVFVQOworICAgICAgICAgICAgbmV3X3N0YXRlID0gU01FX1FPU19SRVFVRVNURUQ7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUCBvcgorICAgICAgICAgICAgLy8gU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZCisgICAgICAgICAgICBwZW50cnktPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTOworICAgICAgICAgICAgbmV3X3N0YXRlID0gU01FX1FPU19RT1NfT047CisgICAgICAgICAgICBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyA9IFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV9TRVQ7CisgICAgICAgICAgICBwQUNJbmZvLT5jdXJyX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXSA9IFRzcGVjX0luZm87CisgICAgICAgICAgICBpZihidWZmZXJlZF9jbWQgJiYgIXBlbnRyeS0+aG9SZW5ld2FsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgUW9TQ2FsbGJhY2socE1hYywgSEREY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW50cnktPlFvc0Zsb3dJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW50cnktPmhvUmVuZXdhbCA9IFZPU19GQUxTRTsKKyAgICAgICAgIH0KKyAgICAgICAgIHBBQ0luZm8tPm51bV9mbG93c1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdKys7CisKKyAgICAgICAgIC8vaW5kaWNhdGUgb24gd2hpY2ggaW5kZXggdGhlIGZsb3cgZW50cnkgYmVsb25ncyB0byAmIGFkZCBpdCB0byB0aGUgCisgICAgICAgICAvL0Zsb3cgTGlzdCBhdCB0aGUgZW5kCisgICAgICAgICBwZW50cnktPnRzcGVjX21hc2sgPSBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1czsKKyAgICAgICAgIHBlbnRyeS0+UW9TSW5mbyA9IFRzcGVjX0luZm87CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IENyZWF0aW5nIGVudHJ5IG9uIHNlc3Npb24gJWQgYXQgJXAgd2l0aCBmbG93SUQgJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBwZW50cnksIFFvc0Zsb3dJRCk7CisgICAgICAgICBjc3JMTEluc2VydFRhaWwoJnNtZV9Rb3NDYi5mbG93X2xpc3QsICZwZW50cnktPmxpbmssIFZPU19UUlVFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8vIHVuZXhwZWN0ZWQgc3RhdHVzIHJldHVybmVkIGJ5IHNtZV9Rb3NTZXR1cCgpCisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCB1bmV4cGVjdGVkIHN0YXR1cyAlZCAiCisgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGJ5IHNtZV9Rb3NTZXR1cCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHN0YXR1cyk7CisgICAgICAgICBuZXdfc3RhdGUgPSBwQUNJbmZvLT5jdXJyX3N0YXRlOworICAgICAgICAgaWYoYnVmZmVyZWRfY21kICYmIGhvUmVuZXdhbCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFFvU0NhbGxiYWNrKHBNYWMsIEhERGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgU01FX1FPU19TVEFUVVNfUkVMRUFTRV9RT1NfTE9TVF9JTkQsCisgICAgICAgICAgICAgICAgICAgICAgICBRb3NGbG93SUQpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIFNNRV9RT1NfSEFORE9GRjoKKyAgIGNhc2UgU01FX1FPU19SRVFVRVNURUQ6CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogQnVmZmVyaW5nIHNldHVwIHJlcXVlc3QgZm9yIGZsb3cgJWQgaW4gc3RhdGUgPSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBRb3NGbG93SUQsIHBBQ0luZm8tPmN1cnJfc3RhdGUgKTsKKyAgICAgIC8vYnVmZmVyIGNtZAorICAgICAgY21kLmNvbW1hbmQgPSBTTUVfUU9TX1NFVFVQX1JFUTsKKyAgICAgIGNtZC5wTWFjID0gcE1hYzsKKyAgICAgIGNtZC5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICBjbWQudS5zZXR1cENtZEluZm8uSEREY29udGV4dCA9IEhERGNvbnRleHQ7CisgICAgICBjbWQudS5zZXR1cENtZEluZm8uUW9TSW5mbyA9IFRzcGVjX0luZm87CisgICAgICBjbWQudS5zZXR1cENtZEluZm8uUW9TQ2FsbGJhY2sgPSBRb1NDYWxsYmFjazsKKyAgICAgIGNtZC51LnNldHVwQ21kSW5mby5VUFR5cGUgPSBVUFR5cGU7CisgICAgICBjbWQudS5zZXR1cENtZEluZm8uaG9SZW5ld2FsID0gaG9SZW5ld2FsOworICAgICAgY21kLnUuc2V0dXBDbWRJbmZvLlFvc0Zsb3dJRCA9IFFvc0Zsb3dJRDsKKyAgICAgIGhzdGF0dXMgPSBzbWVfUW9zQnVmZmVyQ21kKCZjbWQsIGJ1ZmZlcmVkX2NtZCk7CisgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgY291bGRuJ3QgYnVmZmVyIHRoZSBzZXR1cCAiCisgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgZm9yIGZsb3cgJWQgaW4gc3RhdGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIFFvc0Zsb3dJRCwgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgICAgLy8gdW5hYmxlIHRvIGJ1ZmZlciB0aGUgcmVxdWVzdAorICAgICAgICAgLy8gbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOworICAgICAgfQorICAgICAgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQOworICAgICAgbmV3X3N0YXRlID0gcEFDSW5mby0+Y3Vycl9zdGF0ZTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTTUVfUU9TX1FPU19PTjoKKyAgICAgIAorICAgICAgLy9jaGVjayBpZiBtdWx0aXBsZSBmbG93cyBydW5uaW5nIG9uIHRoZSBhYworICAgICAgaWYoKHBBQ0luZm8tPm51bV9mbG93c1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdID4gMCl8fAorICAgICAgICAgKHBBQ0luZm8tPm51bV9mbG93c1tTTUVfUU9TX1RTUEVDX0lOREVYXzFdID4gMCkpCisgICAgICB7CisgICAgICAgICAvL2RvIHdlIG5lZWQgdG8gY2FyZSBhYm91dCB0aGUgY2FzZSB3aGVyZSBBUFNEIG5lZWRlZCBvbiBBQ00gPSAwIGJlbG93PworICAgICAgICAgaWYoQ1NSX0lTX0FERFRTX1dIRU5fQUNNT0ZGX1NVUFBPUlRFRChwTWFjKSB8fAorICAgICAgICAgICAgc21lX1Fvc0lzQUNNKHBNYWMsIHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MsIGFjLCBOVUxMKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiB0c3BlY19tYXNrX3N0YXR1cyA9ICVkIGZvciBBQyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgIHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzLCBhYyk7CisgICAgICAgICAgICBpZighcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogdHNwZWNfbWFza19zdGF0dXMgY2FuJ3QgYmUgMCBmb3IgYWMgPSAlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgYWMsIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworICAgICAgICAgICAgICAgLy9BU1NFUlQKKyAgICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAvLyB1bmFibGUgdG8gc2VydmljZSB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgLy8gbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgICAgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEZsb3cgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgIGlmKFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV8yX1NFVCAhPSBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRWl0aGVyIG9mIHVwc3RyZWFtLCBkb3duc3RyZWFtIG9yIGJpZGlyZWN0aW9uYWwgZmxvd3MgYXJlIHByZXNlbnQgKi8KKyAgICAgICAgICAgICAgLyogSWYgZWl0aGVyIG9mIG5ldyBzdHJlYW0gb3IgY3VycmVudCBzdHJlYW0gaXMgZm9yIGJpZGlyZWNpb25hbCwgYWdncmVnYXRlIAorICAgICAgICAgICAgICAgKiB0aGUgbmV3IHN0cmVhbSB3aXRoIHRoZSBjdXJyZW50IHN0cmVhbXMgcHJlc2VudCBhbmQgc2VuZCBvdXQgYWdncmVnYXRlZCBUc3BlYy4qLworICAgICAgICAgICAgICBpZigoVHNwZWNfSW5mby50c19pbmZvLmRpcmVjdGlvbiA9PSBTTUVfUU9TX1dNTV9UU19ESVJfQk9USCkgfHwKKyAgICAgICAgICAgICAgICAgKHBBQ0luZm8tPmN1cnJfUW9TSW5mb1twQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyAtIDFdLgorICAgICAgICAgICAgICAgICAgICAgIHRzX2luZm8uZGlyZWN0aW9uID09IFNNRV9RT1NfV01NX1RTX0RJUl9CT1RIKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSB0aGUgbmV3IHN0cmVhbSB3aXRoIHRoZSBjdXJyZW50IHN0cmVhbShzKS4KKyAgICAgICAgICAgICAgICB0bWFzayA9IHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qIE5vbmUgb2YgbmV3IHN0cmVhbSBvciBjdXJyZW50IChhZ2dyZWdhdGVkKSBzdHJlYW1zIGFyZSBmb3IgYmlkaXJlY3Rpb25hbC4KKyAgICAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlIG5ldyBzdHJlYW0gZGlyZWN0aW9uIG1hdGNoZXMgdGhlIGN1cnJlbnQgc3RyZWFtIGRpcmVjdGlvbi4gKi8KKyAgICAgICAgICAgICAgZWxzZSBpZihwQUNJbmZvLT5jdXJyX1FvU0luZm9bcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMgLSAxXS4KKyAgICAgICAgICAgICAgICAgIHRzX2luZm8uZGlyZWN0aW9uID09IFRzcGVjX0luZm8udHNfaW5mby5kaXJlY3Rpb24pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBZ2dyZWdhdGUgdGhlIG5ldyBzdHJlYW0gd2l0aCB0aGUgY3VycmVudCBzdHJlYW0ocykuCisgICAgICAgICAgICAgICAgdG1hc2sgPSBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1czsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBOZXcgc3RyZWFtIGlzIGluIGRpZmZlcmVudCBkaXJlY3Rpb24uICovCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5vIEFnZ3JlZ2F0aW9uLiBNYXJrIHRoZSAybmQgdHBzZWMgaW5kZXggYWxzbyBhcyBhY3RpdmUuCisgICAgICAgICAgICAgICAgdG1hc2sgPSBTTUVfUU9TX1RTUEVDX01BU0tfQ0xFQVI7CisgICAgICAgICAgICAgICAgbmV3X3RtYXNrID0gU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUICYgfnBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzOworICAgICAgICAgICAgICAgIHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzID0gU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEJvdGggdXBsaW5rIGFuZCBkb3dubGluayBzdHJlYW1zIGFyZSBwcmVzZW50LiAqLworICAgICAgICAgICAgICAvKiBJZiBuZXcgc3RyZWFtIGlzIGJpZGlyZWN0aW9uYWwsIGFnZ3JlZ2F0ZSBuZXcgc3RyZWFtIHdpdGggYWxsIGV4aXN0aW5nCisgICAgICAgICAgICAgICAqIHVwc3RyZWFtcyBhbmQgZG93bnN0cmVhbXMuIFNlbmQgb3V0IG5ldyBhZ2dyZWdhdGVkIHRwc2VjLiAqLworICAgICAgICAgICAgICBpZihUc3BlY19JbmZvLnRzX2luZm8uZGlyZWN0aW9uID09IFNNRV9RT1NfV01NX1RTX0RJUl9CT1RIKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gT25seSBvbmUgdHNwZWMgaW5kZXggKDApIHdpbGwgYmUgaW4gdXNlIGFmdGVyIHRoaXMgYWdncmVnYXRpb24uCisgICAgICAgICAgICAgICAgdG1hc2sgPSBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQ7CisgICAgICAgICAgICAgICAgcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMgPSBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfU0VUOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qIE5ldyBzdHJlYW0gaXMgYWxzbyB1bmktZGlyZWN0aW9uYWwKKyAgICAgICAgICAgICAgICogRmluZCBvdXQgdGhlIHRzZXBjIGluZGV4IHdpdGggd2hpY2ggaXQgbmVlZHMgdG8gYmUgYWdncmVnYXRlZCAqLworICAgICAgICAgICAgICBlbHNlIGlmKHBBQ0luZm8tPmN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLnRzX2luZm8uZGlyZWN0aW9uICE9IAorICAgICAgICAgICAgICAgICAgIFRzcGVjX0luZm8udHNfaW5mby5kaXJlY3Rpb24pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBZ2dyZWdhdGUgd2l0aCAybmQgdHNwZWMgaW5kZXgKKyAgICAgICAgICAgICAgICB0bWFzayA9IFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMl9TRVQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQWdncmVnYXRlIHdpdGggMXN0IHRzcGVjIGluZGV4CisgICAgICAgICAgICAgICAgdG1hc2sgPSBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfU0VUOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAvL0FDTSA9IDAKKyAgICAgICAgICAgIC8vIFdlIHdvbid0IGJlIHNlbmRpbmcgYSBUU1BFQyB0byB0aGUgQVAgYnV0IHdlIHN0aWxsIG5lZWQKKyAgICAgICAgICAgIC8vIHRvIGFnZ3JlZ2F0ZSB0byBjYWxjdWxhdGUgdHJpZ2dlciBmcmFtZSBwYXJhbWV0ZXJzCisgICAgICAgICAgICB0bWFzayA9IFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV9TRVQ7CisgICAgICAgICB9CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiB0bWFzayA9ICVkLCBuZXdfdG1hc2sgPSAlZCBpbiBzdGF0ZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIHRtYXNrLCBuZXdfdG1hc2ssIHBBQ0luZm8tPmN1cnJfc3RhdGUgKTsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IHRzcGVjX21hc2tfc3RhdHVzID0gJWQgZm9yIEFDID0gJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMsIGFjKTsKKyAgICAgICAgIGlmKHRtYXNrKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBhZ2dyZWdhdGUgVFNQRUMKKyAgICAgICAgICAgIGlmKHRtYXNrICE9IFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV8yX1NFVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaHN0YXR1cyA9IHNtZV9Rb3NBZ2dyZWdhdGVQYXJhbXMoJlRzcGVjX0luZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RtYXNrIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1t0bWFzayAtIDFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQWdncmVnYXRlIHRoZSBuZXcgYmlkaXJlY3Rpb25hbCBzdHJlYW0gd2l0aCB0aGUgZXhpc3RpbmcgdXBzdHJlYW1zIGFuZCAKKyAgICAgICAgICAgICAgICogZG93bnN0cmVhbXMgaW4gdHNwZWMgaW5kaWNlcyAwIGFuZCAxLiAqLworICAgICAgICAgICAgICB0bWFzayA9IFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV9TRVQ7CisKKyAgICAgICAgICAgICAgaWYoKGhzdGF0dXMgPSBzbWVfUW9zQWdncmVnYXRlUGFyYW1zKCZUc3BlY19JbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQUNJbmZvLT5jdXJyX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1t0bWFzayAtIDFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhzdGF0dXMgPSBzbWVfUW9zQWdncmVnYXRlUGFyYW1zKCZwQUNJbmZvLT5jdXJyX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8xXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RtYXNrIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vZXJyIG1zZworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IGZhaWxlZCB0byBhZ2dyZWdhdGUgcGFyYW1zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgIC8vIHVuYWJsZSB0byBzZXJ2aWNlIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAvLyBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICAgICAgICAgICByZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICB0bWFzayA9IG5ld190bWFzazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBubyBmbG93cyBydW5uaW5nIGZvciBhYyA9ICVkIHdoaWxlIGluIHN0YXRlID0gJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgYWMsIHBBQ0luZm8tPmN1cnJfc3RhdGUgKTsKKyAgICAgICAgIC8vQVNTRVJUCisgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgLy8gdW5hYmxlIHRvIHNlcnZpY2UgdGhlIHJlcXVlc3QKKyAgICAgICAgIC8vIG5vdGhpbmcgaXMgcGVuZGluZyBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uCisgICAgICAgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfVFJVRTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisgICAgICAvL2FsdGhvdWdoIGFnZ3JlZ2F0aW5nLCBtYWtlIHN1cmUgdG8gcmVxdWVzdCBvbiB0aGUgY29ycmVjdCBVUAorICAgICAgcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bdG1hc2sgLSAxXS50c19pbmZvLnVwID0gVHNwZWNfSW5mby50c19pbmZvLnVwOworICAgICAgc3RhdHVzID0gc21lX1Fvc1NldHVwKHBNYWMsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bdG1hc2sgLSAxXSwgYWMpOworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHdpdGggQUMgJWQgaW4gc3RhdGUgU01FX1FPU19RT1NfT04gIgorICAgICAgICAgICAgICAgICJzbWVfUW9zU2V0dXAgcmV0dXJuZWQgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBhYywgc3RhdHVzKTsKKyAgICAgIGlmKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUCAhPSBzdGF0dXMpCisgICAgICB7CisgICAgICAgICAvLyB3ZSBhcmVuJ3Qgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBBUAorICAgICAgICAgLy8gc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICB9CisgICAgICBpZigoU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQID09IHN0YXR1cyl8fAorICAgICAgICAgKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQID09IHN0YXR1cykgfHwKKyAgICAgICAgIChTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFkgPT0gc3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIC8vIHdlIHJlY2VpdmVkIGFuIGV4cGVjdGVkICJnb29kIiBzdGF0dXMKKyAgICAgICAgIC8vY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBmbG93IGxpc3QKKyAgICAgICAgIHBlbnRyeSA9IChzbWVfUW9zRmxvd0luZm9FbnRyeSAqKSB2b3NfbWVtX21hbGxvYyhzaXplb2YoKnBlbnRyeSkpOworICAgICAgICAgaWYgKCFwZW50cnkpCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICJlbnRyeSBpbiB0aGUgRmxvdyBMaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgIHJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDsKKyAgICAgICAgIH0KKyAgICAgICAgIHBlbnRyeS0+YWNfdHlwZSA9IGFjOworICAgICAgICAgcGVudHJ5LT5IRERjb250ZXh0ID0gSEREY29udGV4dDsKKyAgICAgICAgIHBlbnRyeS0+UW9TQ2FsbGJhY2sgPSBRb1NDYWxsYmFjazsKKyAgICAgICAgIHBlbnRyeS0+aG9SZW5ld2FsID0gaG9SZW5ld2FsOworICAgICAgICAgcGVudHJ5LT5Rb3NGbG93SUQgPSBRb3NGbG93SUQ7CisgICAgICAgICBwZW50cnktPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogQ3JlYXRpbmcgZmxvdyAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBRb3NGbG93SUQpOworICAgICAgICAgaWYoKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQID09IHN0YXR1cyl8fAorICAgICAgICAgICAgKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PSBzdGF0dXMpKQorICAgICAgICAgeworICAgICAgICAgICAgbmV3X3N0YXRlID0gcEFDSW5mby0+Y3Vycl9zdGF0ZTsKKyAgICAgICAgICAgIHBlbnRyeS0+cmVhc29uID0gU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1M7CisgICAgICAgICAgICBwQUNJbmZvLT5jdXJyX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXSA9IAorICAgICAgICAgICAgICAgcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXTsKKyAgICAgICAgICAgIGlmKGJ1ZmZlcmVkX2NtZCAmJiAhcGVudHJ5LT5ob1JlbmV3YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBRb1NDYWxsYmFjayhwTWFjLCBIRERjb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQUNJbmZvLT5jdXJyX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbnRyeS0+UW9zRmxvd0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PSBzdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IGluIGhhbmRvZmYsIHRoZW4gbm90aWZ5IGFsbCBmbG93cyBvbgorICAgICAgICAgICAgICAgLy8gdGhpcyBBQyB0aGF0IHRoZSBhZ2dyZWdhdGUgVFNQRUMgbWF5IGhhdmUgY2hhbmdlZAorICAgICAgICAgICAgICAgaWYoIXBlbnRyeS0+aG9SZW5ld2FsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZzZWFyY2hfa2V5LCBzaXplb2Yoc21lX1Fvc1NlYXJjaEluZm8pKTsKKyAgICAgICAgICAgICAgICAgIHNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKyAgICAgICAgICAgICAgICAgIHNlYXJjaF9rZXkuaW5kZXggPSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfMjsKKyAgICAgICAgICAgICAgICAgIHNlYXJjaF9rZXkuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICAgICAgICAgICAgaHN0YXR1cyA9IHNtZV9Rb3NGaW5kQWxsSW5GbG93TGlzdChwTWFjLCBzZWFyY2hfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zU2V0dXBGbnApOworICAgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBjb3VsZG4ndCBub3RpZnkgb3RoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnRyaWVzIG9uIHRoaXMgQUMgPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBhYyk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW50cnktPmhvUmVuZXdhbCA9IFZPU19GQUxTRTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUAorICAgICAgICAgICAgbmV3X3N0YXRlID0gU01FX1FPU19SRVFVRVNURUQ7CisgICAgICAgICAgICBwZW50cnktPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1NFVFVQOworICAgICAgICAgICAgLy9OZWVkIHRoaXMgaW5mbyB3aGVuIGFkZHRzIGNvbWVzIGJhY2sgZnJvbSBQRSB0byBrbm93IG9uCisgICAgICAgICAgICAvL3doaWNoIGluZGV4IG9mIHRoZSBBQyB0aGUgcmVxdWVzdCB3YXMgZnJvbQorICAgICAgICAgICAgcEFDSW5mby0+dHNwZWNfcGVuZGluZyA9IHRtYXNrOworICAgICAgICAgfQorICAgICAgICAgcEFDSW5mby0+bnVtX2Zsb3dzW3RtYXNrIC0gMV0rKzsKKyAgICAgICAgIC8vaW5kaWNhdGUgb24gd2hpY2ggaW5kZXggdGhlIGZsb3cgZW50cnkgYmVsb25ncyB0byAmIGFkZCBpdCB0byB0aGUgCisgICAgICAgICAvL0Zsb3cgTGlzdCBhdCB0aGUgZW5kCisgICAgICAgICBwZW50cnktPnRzcGVjX21hc2sgPSB0bWFzazsKKyAgICAgICAgIHBlbnRyeS0+UW9TSW5mbyA9IFRzcGVjX0luZm87CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgY3JlYXRpbmcgZW50cnkgYXQgJXAgd2l0aCBmbG93SUQgJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBwZW50cnksIFFvc0Zsb3dJRCk7CisgICAgICAgICBjc3JMTEluc2VydFRhaWwoJnNtZV9Rb3NDYi5mbG93X2xpc3QsICZwZW50cnktPmxpbmssIFZPU19UUlVFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8vIHVuZXhwZWN0ZWQgc3RhdHVzIHJldHVybmVkIGJ5IHNtZV9Rb3NTZXR1cCgpCisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCB1bmV4cGVjdGVkIHN0YXR1cyAlZCAiCisgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGJ5IHNtZV9Rb3NTZXR1cCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHN0YXR1cyk7CisgICAgICAgICBuZXdfc3RhdGUgPSBwQUNJbmZvLT5jdXJyX3N0YXRlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIFNNRV9RT1NfQ0xPU0VEOgorICAgY2FzZSBTTUVfUU9TX0lOSVQ6CisgICBkZWZhdWx0OgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IHNldHVwIHJlcXVlc3RlZCBpbiB1bmV4cGVjdGVkIHN0YXRlID0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisgICAgICAvLyB1bmFibGUgdG8gc2VydmljZSB0aGUgcmVxdWVzdAorICAgICAgLy8gbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIG5ld19zdGF0ZSA9IHBBQ0luZm8tPmN1cnJfc3RhdGU7CisgICB9CisgICAvKiBpZiBjdXJyZW50IHN0YXRlIGlzIHNhbWUgYXMgcHJldmlvdXMgbm8gbmVlZCBmb3IgdHJhbnNpc3Rpb24sCisgICAgICBpZiB3ZSBhcmUgZG9pbmcgcmVhc3NvYyAmIHdlIGFyZSBhbHJlYWR5IGluIGhhbmRvZmYgc3RhdGUsIG5vIG5lZWQgdG8gbW92ZQorICAgICAgdG8gcmVxdWVzdGVkIHN0YXRlLiBCdXQgbWFrZSBzdXJlIHRvIHNldCB0aGUgcHJldmlvdXMgc3RhdGUgYXMgcmVxdWVzdGVkCisgICAgICBzdGF0ZQorICAgKi8KKyAgIGlmKChuZXdfc3RhdGUgIT0gcEFDSW5mby0+Y3Vycl9zdGF0ZSkmJgorICAgICAgKCEocEFDSW5mby0+cmVhc3NvY19wZW5kaW5nICYmIAorICAgICAgICAgKFNNRV9RT1NfSEFORE9GRiA9PSBwQUNJbmZvLT5jdXJyX3N0YXRlKSkpKQorICAgeworICAgICAgc21lX1Fvc1N0YXRlVHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLCBuZXdfc3RhdGUpOworICAgfQorICAgCisgICBpZihwQUNJbmZvLT5yZWFzc29jX3BlbmRpbmcgJiYgCisgICAgICAoU01FX1FPU19IQU5ET0ZGID09IHBBQ0luZm8tPmN1cnJfc3RhdGUpKQorICAgeworICAgICAgcEFDSW5mby0+cHJldl9zdGF0ZSA9IFNNRV9RT1NfUkVRVUVTVEVEOworICAgfQorICAgaWYoKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQID09IHN0YXR1cykgfHwKKyAgICAgIChTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0FQU0RfU0VUX0FMUkVBRFkgPT0gc3RhdHVzKSkgCisgICB7CisgICAgICAodm9pZClzbWVfUW9zUHJvY2Vzc0J1ZmZlcmVkQ21kKHNlc3Npb25JZCk7CisgICB9CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zSW50ZXJuYWxNb2RpZnlSZXEoKSAtIFRoZSBTTUUgUW9TIGludGVybmFsIGZ1bmN0aW9uIHRvIHJlcXVlc3QgCisgIGZvciBtb2RpZmljYXRpb24gb2YgY2VydGFpbiBRb1MgcGFyYW1zIG9uIGEgZmxvdyBydW5uaW5nIG9uIGEgcGFydGljdWxhciBBQy4gCisgIElmIHRoZSByZXF1ZXN0IGludm9sdmVzIGFkbWlzc2lvbiBjb250cm9sIG9uIHRoZSByZXF1ZXN0ZWQgQUMsIEhERCBuZWVkcyB0byAKKyAgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IFRyYWZmaWMgU3BlY2lmaWNhdGlvbiAoVFNQRUMpIHBhcmFtZXRlcnMgJiBTTUUgbWlnaHQKKyAgc3RhcnQgdGhlIHJlbmVnb3RpYXRpb24gcHJvY2VzcyB0aHJvdWdoIEFERFRTLgorICAKKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgIFxwYXJhbSBwUW9TSW5mbyAtIFBvaW50ZXIgdG8gc21lX1Fvc1dtbVRzcGVjSW5mbyB3aGljaCBjb250YWlucyB0aGUgV01NIFRTUEVDCisgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgaW5mbyBhcyBkZWZpbmVkIGFib3ZlLCBwcm92aWRlZCBieSBIREQKKyAgXHBhcmFtIFFvc0Zsb3dJRCAtIElkZW50aWZpY2F0aW9uIHBlciBmbG93IHJ1bm5pbmcgb24gZWFjaCBBQyBnZW5lcmF0ZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgU01FLiAKKyAgICAgICAgICAgICAgICAgICAgIEl0IGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgUW9TIHNldHVwIGZvciB0aGUgZmxvdyBoYXMgCisgICAgICAgICAgICAgICAgICAgICBiZWVuIHN1Y2Nlc3NmdWwgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgCisgIFxyZXR1cm4gU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19SU1AgLSBNb2RpZmljYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKyAgCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIHJlcXVlc3QgZmFpbGVkICAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfUW9zSW50ZXJuYWxNb2RpZnlSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqIHBRb1NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVTMyX3QgUW9zRmxvd0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IGJ1ZmZlcmVkX2NtZCkKK3sKKyAgIHRMaXN0RWxlbSAqcEVudHJ5PSBOVUxMOworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisgICBzbWVfUW9zRmxvd0luZm9FbnRyeSAqcE5ld0VudHJ5PSBOVUxMOworICAgc21lX1Fvc0Zsb3dJbmZvRW50cnkgKmZsb3dfaW5mbyA9IE5VTEw7CisgICBzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKyAgIHNtZV9Rb3NTdGF0ZXMgbmV3X3N0YXRlID0gU01FX1FPU19DTE9TRUQ7CisgICBzbWVfUW9zU3RhdHVzVHlwZSBzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfRkFJTFVSRV9SU1A7CisgICBzbWVfUW9zV21tVHNwZWNJbmZvIEFnZ3JfVHNwZWNfSW5mbzsKKyAgIHNtZV9Rb3NTZWFyY2hJbmZvIHNlYXJjaF9rZXk7CisgICBzbWVfUW9zQ21kSW5mbyAgY21kOworICAgdl9VOF90IHNlc3Npb25JZDsKKyAgIHZfQk9PTF90IGJ1ZmZlckNvbW1hbmQ7CisgICBlSGFsU3RhdHVzIGhzdGF0dXM7CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQgZm9yIGZsb3cgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgUW9zRmxvd0lEKTsKKworICAgdm9zX21lbV96ZXJvKCZzZWFyY2hfa2V5LCBzaXplb2Yoc21lX1Fvc1NlYXJjaEluZm8pKTsKKyAgIC8vc2V0IHRoZSBrZXkgdHlwZSAmIHRoZSBrZXkgdG8gYmUgc2VhcmNoZWQgaW4gdGhlIEZsb3cgTGlzdAorICAgc2VhcmNoX2tleS5rZXkuUW9zRmxvd0lEID0gUW9zRmxvd0lEOworICAgc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8xOworICAgc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBTTUVfUU9TX1NFQVJDSF9TRVNTSU9OX0lEX0FOWTsKKyAgIC8vZ28gdGhyb3VnaCB0aGUgbGluayBsaXN0IHRvIGZpbmQgb3V0IHRoZSBkZXRhaWxzIG9uIHRoZSBmbG93CisgICBwRW50cnkgPSBzbWVfUW9zRmluZEluRmxvd0xpc3Qoc2VhcmNoX2tleSk7CisgICBpZighcEVudHJ5KQorICAgeworICAgICAgLy9FcnIgbXNnCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogbm8gbWF0Y2ggZm91bmQgZm9yIGZsb3dJRCA9ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIFFvc0Zsb3dJRCk7CisgICAgICByZXR1cm4gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0lOVkFMSURfUEFSQU1TX1JTUDsKKyAgIH0KKyAgIC8vIGZpbmQgdGhlIEFDCisgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rICk7CisgICBhYyA9IGZsb3dfaW5mby0+YWNfdHlwZTsKKworICAgc2Vzc2lvbklkID0gZmxvd19pbmZvLT5zZXNzaW9uSWQ7CisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKyAgIHBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworCisgICAvL3ZhbGlkYXRlIFFvUyBwYXJhbXMKKyAgIGlmKCFzbWVfUW9zVmFsaWRhdGVSZXF1ZXN0ZWRQYXJhbXMocE1hYywgcFFvU0luZm8sIHNlc3Npb25JZCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogaW52YWxpZCBwYXJhbXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9JTlZBTElEX1BBUkFNU19SU1A7CisgICB9CisgICAvLyBGb3IgbW9kaWZ5LCBtYWtlIHN1cmUgdGhhdCBkaXJlY3Rpb24sIFRJRCBhbmQgVVAgYXJlIG5vdCBiZWluZyBhbHRlcmVkCisgICBpZigocFFvU0luZm8tPnRzX2luZm8uZGlyZWN0aW9uICE9IGZsb3dfaW5mby0+UW9TSW5mby50c19pbmZvLmRpcmVjdGlvbikgfHwKKyAgICAgIChwUW9TSW5mby0+dHNfaW5mby51cCAhPSBmbG93X2luZm8tPlFvU0luZm8udHNfaW5mby51cCkgfHwKKyAgICAgIChwUW9TSW5mby0+dHNfaW5mby50aWQgIT0gZmxvd19pbmZvLT5Rb1NJbmZvLnRzX2luZm8udGlkKSkKKyAgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgIiVzOiAlZDogTW9kaWZpY2F0aW9uIG9mIGRpcmVjdGlvbi90aWQvdXAgaXMgbm90IGFsbG93ZWQiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisKKyAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9JTlZBTElEX1BBUkFNU19SU1A7CisgICB9CisgICAvLyBuZWVkIHRvIHZvdGUgb2ZmIHBvd2Vyc2F2ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgcmVxdWVzdAorICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX0ZBTFNFOworICAgLy8gYXNzdW1lIHdlIHdvbid0IGhhdmUgdG8gKHJlKWJ1ZmZlciB0aGUgY29tbWFuZAorICAgYnVmZmVyQ29tbWFuZCA9IFZPU19GQUxTRTsKKyAgIC8vY2hlY2sgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyBmbG93aW5nIHNjZW5hcmlvCisgICAvL0FkZHRzIHJlcXVlc3QgaXMgcGVuZGluZyBvbiBvbmUgQUMsIHdoaWxlIEFQU0QgcmVxdWVzdGVkIG9uIGFub3RoZXIgd2hpY2ggCisgICAvL25lZWRzIGEgcmVhc3NvYy4gV2lsbCBidWZmZXIgYSByZXF1ZXN0IGlmIEFkZHRzIGlzIHBlbmRpbmcgb24gYW55IEFDLCAKKyAgIC8vd2hpY2ggd2lsbCBzYWZlZ2F1cmQgdGhlIGFib3ZlIHNjZW5hcmlvLCAmIGFsc28gd29uJ3QgY29uZnVzZSBQRSB3aXRoIGJhY2sgCisgICAvL3RvIGJhY2sgQWRkdHMgb3IgQWRkdHMgZm9sbG93ZWQgYnkgUmVhc3NvYworICAgaWYoc21lX1Fvc0lzUnNwUGVuZGluZyhzZXNzaW9uSWQsIGFjKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBidWZmZXJpbmcgdGhlIG1vZGlmeSByZXF1ZXN0IGZvciBmbG93ICVkIGluIHN0YXRlICVkICIKKyAgICAgICAgICAgICAgICAic2luY2UgYW5vdGhlciByZXF1ZXN0IGlzIHBlbmRpbmciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIAorICAgICAgICAgICAgICAgIFFvc0Zsb3dJRCwgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgYnVmZmVyQ29tbWFuZCA9IFZPU19UUlVFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy8gbWFrZSBzdXJlIHdlIGFyZSBpbiBmdWxsIHBvd2VyIHNvIHRoYXQgd2UgY2FuIGlzc3VlCisgICAgICAvLyBhbiBBZGRUUyBvciByZWFzc29jIGlmIG5lY2Vzc2FyeQorICAgICAgaHN0YXR1cyA9IHBtY1JlcXVlc3RGdWxsUG93ZXIocE1hYywgc21lX1Fvc1BtY0Z1bGxQb3dlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24sIGVTTUVfUkVBU09OX09USEVSKTsKKyAgICAgIGlmKCBlSEFMX1NUQVRVU19QTUNfUEVORElORyA9PSBoc3RhdHVzICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBidWZmZXJpbmcgdGhlIG1vZGlmeSByZXF1ZXN0IGZvciBmbG93ICVkIGluIHN0YXRlICVkLCAiCisgICAgICAgICAgICAgICAgICAgIndhaXRpbmcgZm9yIGZ1bGwgcG93ZXIiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIAorICAgICAgICAgICAgICAgICAgIFFvc0Zsb3dJRCwgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgICAgYnVmZmVyQ29tbWFuZCA9IFZPU19UUlVFOworICAgICAgfQorICAgfQorICAgaWYgKGJ1ZmZlckNvbW1hbmQpCisgICB7CisgICAgICAvLyB3ZSBuZWVkIHRvIGJ1ZmZlciB0aGUgY29tbWFuZAorICAgICAgY21kLmNvbW1hbmQgPSBTTUVfUU9TX01PRElGWV9SRVE7CisgICAgICBjbWQucE1hYyA9IHBNYWM7CisgICAgICBjbWQuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgY21kLnUubW9kaWZ5Q21kSW5mby5Rb3NGbG93SUQgPSBRb3NGbG93SUQ7CisgICAgICBjbWQudS5tb2RpZnlDbWRJbmZvLlFvU0luZm8gPSAqcFFvU0luZm87CisgICAgICBoc3RhdHVzID0gc21lX1Fvc0J1ZmZlckNtZCgmY21kLCBidWZmZXJlZF9jbWQpOworICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBjb3VsZG4ndCBidWZmZXIgdGhlIG1vZGlmeSByZXF1ZXN0IGluIHN0YXRlID0gJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgICAgLy8gdW5hYmxlIHRvIGJ1ZmZlciB0aGUgcmVxdWVzdAorICAgICAgICAgLy8gbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDsKKyAgICAgIH0KKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogQnVmZmVyZWQgbW9kaWZ5IHJlcXVlc3QgZm9yIGZsb3cgPSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBRb3NGbG93SUQpOworICAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9QRU5ESU5HX1JTUDsKKyAgIH0KKyAgIC8vZ2V0IGludG8gdGhlIHN0YXQgbS9jIHRvIHNlZSBpZiB0aGUgcmVxdWVzdCBjYW4gYmUgZ3JhbnRlZAorICAgc3dpdGNoKHBBQ0luZm8tPmN1cnJfc3RhdGUpCisgICB7CisgICBjYXNlIFNNRV9RT1NfUU9TX09OOgorICAgICAgLy9zYXZlIHRoZSBuZXcgcGFyYW1zIGFkZGluZyBhIG5ldyAoZHVwbGljYXRlKSBlbnRyeSBpbiB0aGUgRmxvdyBMaXN0CisgICAgICAvL09uY2Ugd2UgaGF2ZSBkZWNpZGVkIG9uIE9UQSBleGNoYW5nZSBuZWVkZWQgb3Igbm90IHdlIGNhbiBkZWxldGUgdGhlCisgICAgICAvL29yaWdpbmFsIG9uZSBmcm9tIHRoZSBMaXN0CisgICAgICBwTmV3RW50cnkgPSAoc21lX1Fvc0Zsb3dJbmZvRW50cnkgKikgdm9zX21lbV9tYWxsb2Moc2l6ZW9mKCpwTmV3RW50cnkpKTsKKyAgICAgIGlmICghcE5ld0VudHJ5KQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAiZW50cnkgaW4gdGhlIEZsb3cgTGlzdCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAvLyB1bmFibGUgdG8gc2VydmljZSB0aGUgcmVxdWVzdAorICAgICAgICAgLy8gbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDsKKyAgICAgIH0KKyAgICAgIHBOZXdFbnRyeS0+YWNfdHlwZSA9IGFjOworICAgICAgcE5ld0VudHJ5LT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICBwTmV3RW50cnktPkhERGNvbnRleHQgPSBmbG93X2luZm8tPkhERGNvbnRleHQ7CisgICAgICBwTmV3RW50cnktPlFvU0NhbGxiYWNrID0gZmxvd19pbmZvLT5Rb1NDYWxsYmFjazsKKyAgICAgIHBOZXdFbnRyeS0+UW9zRmxvd0lEID0gZmxvd19pbmZvLT5Rb3NGbG93SUQ7CisgICAgICBwTmV3RW50cnktPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX01PRElGWV9QRU5ESU5HOworICAgICAgLy9zaW5jZSBpdCBpcyBhIG1vZGlmeSByZXF1ZXN0LCB1c2UgdGhlIHNhbWUgaW5kZXggb24gd2hpY2ggdGhlIGZsb3cKKyAgICAgIC8vZW50cnkgb3JpZ2luYWxseSB3YXMgcnVubmluZyAmIGFkZCBpdCB0byB0aGUgRmxvdyBMaXN0IGF0IHRoZSBlbmQKKyAgICAgIHBOZXdFbnRyeS0+dHNwZWNfbWFzayA9IGZsb3dfaW5mby0+dHNwZWNfbWFzazsKKyAgICAgIHBOZXdFbnRyeS0+UW9TSW5mbyA9ICpwUW9TSW5mbzsKKyAgICAgIC8vdXBkYXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdCB3aGljaCBuZWVkZWQgdG8gYmUgbW9kaWZpZWQKKyAgICAgIGZsb3dfaW5mby0+cmVhc29uID0gU01FX1FPU19SRUFTT05fTU9ESUZZOworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIGNyZWF0aW5nIG1vZGlmaWVkICIKKyAgICAgICAgICAgICAgICAiZW50cnkgYXQgJXAgd2l0aCBmbG93SUQgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBwTmV3RW50cnksIHBOZXdFbnRyeS0+UW9zRmxvd0lEKTsKKyAgICAgIC8vYWRkIHRoZSBuZXcgZW50cnkgdW5kZXIgY29uc3RydWN0aW9uIHRvIHRoZSBGbG93IExpc3QKKyAgICAgIGNzckxMSW5zZXJ0VGFpbCgmc21lX1Fvc0NiLmZsb3dfbGlzdCwgJnBOZXdFbnRyeS0+bGluaywgVk9TX1RSVUUpOworICAgICAgLy91cGRhdGUgVFNQRUMgd2l0aCB0aGUgbmV3IHBhcmFtIHNldAorICAgICAgaHN0YXR1cyA9IHNtZV9Rb3NVcGRhdGVQYXJhbXMoc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWMsIHBOZXdFbnRyeS0+dHNwZWNfbWFzaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWdncl9Uc3BlY19JbmZvKTsKKyAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIHBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3BOZXdFbnRyeS0+dHNwZWNfbWFzayAtMV0gPSBBZ2dyX1RzcGVjX0luZm87CisgICAgICAgICAvL2lmIEFDTSwgc2VuZCBvdXQgYSBuZXcgQUREVFMKKyAgICAgICAgIHN0YXR1cyA9IHNtZV9Rb3NTZXR1cChwTWFjLCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3BOZXdFbnRyeS0+dHNwZWNfbWFzayAtMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWMpOworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHdpdGggQUMgJWQgaW4gc3RhdGUgU01FX1FPU19RT1NfT04gIgorICAgICAgICAgICAgICAgICAgICJzbWVfUW9zU2V0dXAgcmV0dXJuZWQgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBhYywgc3RhdHVzKTsKKyAgICAgICAgIGlmKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUCAhPSBzdGF0dXMpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZSBhcmVuJ3Qgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBBUAorICAgICAgICAgICAgLy8gc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICAgICB9CisgICAgICAgICBpZihTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1AgPT0gc3RhdHVzKSAKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG5ld19zdGF0ZSA9IFNNRV9RT1NfUkVRVUVTVEVEOworICAgICAgICAgICAgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1BFTkRJTkdfUlNQOworICAgICAgICAgICAgcEFDSW5mby0+dHNwZWNfcGVuZGluZyA9IHBOZXdFbnRyeS0+dHNwZWNfbWFzazsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYoKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQID09IHN0YXR1cykgfHwKKyAgICAgICAgICAgICAgICAgKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PSBzdGF0dXMpKQorICAgICAgICAgeworICAgICAgICAgICAgbmV3X3N0YXRlID0gU01FX1FPU19RT1NfT047CisKKyAgICAgICAgICAgIHZvc19tZW1femVybygmc2VhcmNoX2tleSwgc2l6ZW9mKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisgICAgICAgICAgICAvL2RlbGV0ZSB0aGUgb3JpZ2luYWwgZW50cnkgaW4gRkxPVyBsaXN0IHdoaWNoIGdvdCBtb2RpZmllZAorICAgICAgICAgICAgc2VhcmNoX2tleS5rZXkuYWNfdHlwZSA9IGFjOworICAgICAgICAgICAgc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8yOworICAgICAgICAgICAgc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgICAgICBoc3RhdHVzID0gc21lX1Fvc0ZpbmRBbGxJbkZsb3dMaXN0KHBNYWMsIHNlYXJjaF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NNb2RpZnlGbnApOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUCAhPSBzdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwQUNJbmZvLT5jdXJyX1FvU0luZm9bcE5ld0VudHJ5LT50c3BlY19tYXNrIC0xXSA9IAorICAgICAgICAgICAgICAgICAgcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bcE5ld0VudHJ5LT50c3BlY19tYXNrIC0xXTsKKyAgICAgICAgICAgICAgIGlmKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PSBzdGF0dXMpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZOworICAgICAgICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZzZWFyY2hfa2V5LCBzaXplb2Yoc21lX1Fvc1NlYXJjaEluZm8pKTsKKyAgICAgICAgICAgICAgICAgIHNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKyAgICAgICAgICAgICAgICAgIHNlYXJjaF9rZXkuaW5kZXggPSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfMjsKKyAgICAgICAgICAgICAgICAgIHNlYXJjaF9rZXkuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICAgICAgICAgICAgaHN0YXR1cyA9IHNtZV9Rb3NGaW5kQWxsSW5GbG93TGlzdChwTWFjLCBzZWFyY2hfa2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc01vZGlmaWNhdGlvbk5vdGlmeUZucCk7CisgICAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IGNvdWxkbid0IG5vdGlmeSBvdGhlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudHJpZXMgb24gdGhpcyBBQyA9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGFjKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgaWYoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1AgPT0gc3RhdHVzKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoYnVmZmVyZWRfY21kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLCBmbG93X2luZm8tPkhERGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3BOZXdFbnRyeS0+dHNwZWNfbWFzayAtMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAvLyB1bmV4cGVjdGVkIHN0YXR1cyByZXR1cm5lZCBieSBzbWVfUW9zU2V0dXAoKQorICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgdW5leHBlY3RlZCBzdGF0dXMgJWQgIgorICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCBieSBzbWVfUW9zU2V0dXAiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBzdGF0dXMpOworICAgICAgICAgICAgbmV3X3N0YXRlID0gU01FX1FPU19RT1NfT047CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBzbWVfUW9zVXBkYXRlUGFyYW1zKCkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgIC8vIHVuYWJsZSB0byBzZXJ2aWNlIHRoZSByZXF1ZXN0CisgICAgICAgICAvLyBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICAgICBuZXdfc3RhdGUgPSBTTUVfUU9TX0xJTktfVVA7CisgICAgICB9CisgICAgICAvKiBpZiB3ZSBhcmUgZG9pbmcgcmVhc3NvYyAmIHdlIGFyZSBhbHJlYWR5IGluIGhhbmRvZmYgc3RhdGUsIG5vIG5lZWQKKyAgICAgICAgIHRvIG1vdmUgdG8gcmVxdWVzdGVkIHN0YXRlLiBCdXQgbWFrZSBzdXJlIHRvIHNldCB0aGUgcHJldmlvdXMgc3RhdGUKKyAgICAgICAgIGFzIHJlcXVlc3RlZCBzdGF0ZQorICAgICAgKi8KKyAgICAgIGlmKCEocEFDSW5mby0+cmVhc3NvY19wZW5kaW5nICYmIAorICAgICAgICAgICAoU01FX1FPU19IQU5ET0ZGID09IHBBQ0luZm8tPmN1cnJfc3RhdGUpKSkKKyAgICAgIHsKKyAgICAgICAgIHNtZV9Rb3NTdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbklkLCBhYywgbmV3X3N0YXRlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBBQ0luZm8tPnByZXZfc3RhdGUgPSBTTUVfUU9TX1JFUVVFU1RFRDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBTTUVfUU9TX0hBTkRPRkY6CisgICBjYXNlIFNNRV9RT1NfUkVRVUVTVEVEOgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IEJ1ZmZlcmluZyBtb2RpZnkgcmVxdWVzdCBmb3IgZmxvdyAlZCBpbiBzdGF0ZSA9ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIFFvc0Zsb3dJRCwgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgLy9idWZmZXIgY21kCisgICAgICBjbWQuY29tbWFuZCA9IFNNRV9RT1NfTU9ESUZZX1JFUTsKKyAgICAgIGNtZC5wTWFjID0gcE1hYzsKKyAgICAgIGNtZC5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICBjbWQudS5tb2RpZnlDbWRJbmZvLlFvc0Zsb3dJRCA9IFFvc0Zsb3dJRDsKKyAgICAgIGNtZC51Lm1vZGlmeUNtZEluZm8uUW9TSW5mbyA9ICpwUW9TSW5mbzsKKyAgICAgIGhzdGF0dXMgPSBzbWVfUW9zQnVmZmVyQ21kKCZjbWQsIGJ1ZmZlcmVkX2NtZCk7CisgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IGNvdWxkbid0IGJ1ZmZlciB0aGUgbW9kaWZ5IHJlcXVlc3QgaW4gc3RhdGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBwQUNJbmZvLT5jdXJyX3N0YXRlICk7CisgICAgICAgICAvLyB1bmFibGUgdG8gYnVmZmVyIHRoZSByZXF1ZXN0CisgICAgICAgICAvLyBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICAgICByZXR1cm4gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQOworICAgICAgfQorICAgICAgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1BFTkRJTkdfUlNQOworICAgICAgYnJlYWs7CisgICBjYXNlIFNNRV9RT1NfQ0xPU0VEOgorICAgY2FzZSBTTUVfUU9TX0lOSVQ6CisgICBjYXNlIFNNRV9RT1NfTElOS19VUDoKKyAgIGRlZmF1bHQ6CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogbW9kaWZ5IHJlcXVlc3RlZCBpbiB1bmV4cGVjdGVkIHN0YXRlID0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisgICAgICAvLyB1bmFibGUgdG8gc2VydmljZSB0aGUgcmVxdWVzdAorICAgICAgLy8gbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgYnJlYWs7CisgICB9CisgICBpZigoU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQID09IHN0YXR1cykgfHwKKyAgICAgIChTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZID09IHN0YXR1cykpIAorICAgeworICAgICAgKHZvaWQpc21lX1Fvc1Byb2Nlc3NCdWZmZXJlZENtZChzZXNzaW9uSWQpOworICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NJbnRlcm5hbFJlbGVhc2VSZXEoKSAtIFRoZSBTTUUgUW9TIGludGVybmFsIGZ1bmN0aW9uIHRvIHJlcXVlc3QgCisgIGZvciByZWxlYXNpbmcgYSBRb1MgZmxvdyBydW5uaW5nIG9uIGEgcGFydGljdWxhciBBQy4gCisgIAorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHBhcmFtIFFvc0Zsb3dJRCAtIElkZW50aWZpY2F0aW9uIHBlciBmbG93IHJ1bm5pbmcgb24gZWFjaCBBQyBnZW5lcmF0ZWQgYnkgU01FIAorICAgICAgICAgICAgICAgICAgICAgSXQgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBRb1Mgc2V0dXAgZm9yIHRoZSBmbG93IGlzIAorICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bAorICAKKyAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIC0gUmVsZWFzZSBpcyBzdWNjZXNzZnVsLgorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfUW9zSW50ZXJuYWxSZWxlYXNlUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1UzMl90IFFvc0Zsb3dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgYnVmZmVyZWRfY21kKQoreworICAgdExpc3RFbGVtICpwRW50cnk9IE5VTEw7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIHNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworICAgc21lX1Fvc0Zsb3dJbmZvRW50cnkgKnBEZWxldGVkRmxvdyA9IE5VTEw7CisgICBzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKyAgIHNtZV9Rb3NTdGF0ZXMgbmV3X3N0YXRlID0gU01FX1FPU19DTE9TRUQ7CisgICBzbWVfUW9zU3RhdHVzVHlwZSBzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQOworICAgc21lX1Fvc1dtbVRzcGVjSW5mbyBBZ2dyX1RzcGVjX0luZm87CisgICBzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5OworICAgc21lX1Fvc0NtZEluZm8gIGNtZDsKKyAgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyBtb2RpZnlQcm9maWxlRmllbGRzOworICAgdl9CT09MX3QgIGRlbHRzSXNzdWVkID0gVk9TX0ZBTFNFOworICAgdl9VOF90IHNlc3Npb25JZDsKKyAgIHZfQk9PTF90IGJ1ZmZlckNvbW1hbmQ7CisgICBlSGFsU3RhdHVzIGhzdGF0dXM7CisgICB2X0JPT0xfdCBiaURpcmVjdGlvbmFsRmxvd3NQcmVzZW50ID0gVk9TX0ZBTFNFOworICAgdl9CT09MX3QgdXBsaW5rRmxvd3NQcmVzZW50ID0gVk9TX0ZBTFNFOworICAgdl9CT09MX3QgZG93bmxpbmtGbG93c1ByZXNlbnQgPSBWT1NfRkFMU0U7CisgICB0TGlzdEVsZW0gKnBSZXN1bHQ9IE5VTEw7CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQgZm9yIGZsb3cgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgUW9zRmxvd0lEKTsKKworICAgdm9zX21lbV96ZXJvKCZzZWFyY2hfa2V5LCBzaXplb2Yoc21lX1Fvc1NlYXJjaEluZm8pKTsKKyAgIC8vc2V0IHRoZSBrZXkgdHlwZSAmIHRoZSBrZXkgdG8gYmUgc2VhcmNoZWQgaW4gdGhlIEZsb3cgTGlzdAorICAgc2VhcmNoX2tleS5rZXkuUW9zRmxvd0lEID0gUW9zRmxvd0lEOworICAgc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8xOworICAgc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBTTUVfUU9TX1NFQVJDSF9TRVNTSU9OX0lEX0FOWTsKKyAgIC8vZ28gdGhyb3VnaCB0aGUgbGluayBsaXN0IHRvIGZpbmQgb3V0IHRoZSBkZXRhaWxzIG9uIHRoZSBmbG93CisgICBwRW50cnkgPSBzbWVfUW9zRmluZEluRmxvd0xpc3Qoc2VhcmNoX2tleSk7CisgICAKKyAgIGlmKCFwRW50cnkpCisgICB7CisgICAgICAvL0VyciBtc2cKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBubyBtYXRjaCBmb3VuZCBmb3IgZmxvd0lEID0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgUW9zRmxvd0lEKTsKKyAgICAgIHJldHVybiBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0lOVkFMSURfUEFSQU1TX1JTUDsKKyAgIH0KKyAgIC8vIGZpbmQgdGhlIEFDCisgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rICk7CisgICBhYyA9IGZsb3dfaW5mby0+YWNfdHlwZTsKKyAgIHNlc3Npb25JZCA9IGZsb3dfaW5mby0+c2Vzc2lvbklkOworICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKyAgIC8vIG5lZWQgdG8gdm90ZSBvZmYgcG93ZXJzYXZlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyByZXF1ZXN0CisgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfRkFMU0U7CisgICAvLyBhc3N1bWUgd2Ugd29uJ3QgaGF2ZSB0byAocmUpYnVmZmVyIHRoZSBjb21tYW5kCisgICBidWZmZXJDb21tYW5kID0gVk9TX0ZBTFNFOworICAgLy9jaGVjayB0byBjb25zaWRlciB0aGUgZm9sbG93aW5nIGZsb3dpbmcgc2NlbmFyaW8KKyAgIC8vQWRkdHMgcmVxdWVzdCBpcyBwZW5kaW5nIG9uIG9uZSBBQywgd2hpbGUgQVBTRCByZXF1ZXN0ZWQgb24gYW5vdGhlciB3aGljaCAKKyAgIC8vbmVlZHMgYSByZWFzc29jLiBXaWxsIGJ1ZmZlciBhIHJlcXVlc3QgaWYgQWRkdHMgaXMgcGVuZGluZyBvbiBhbnkgQUMsIAorICAgLy93aGljaCB3aWxsIHNhZmVnYXVyZCB0aGUgYWJvdmUgc2NlbmFyaW8sICYgYWxzbyB3b24ndCBjb25mdXNlIFBFIHdpdGggYmFjayAKKyAgIC8vdG8gYmFjayBBZGR0cyBvciBBZGR0cyBmb2xsb3dlZCBieSBSZWFzc29jCisgICBpZihzbWVfUW9zSXNSc3BQZW5kaW5nKHNlc3Npb25JZCwgYWMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IGJ1ZmZlcmluZyB0aGUgcmVsZWFzZSByZXF1ZXN0IGZvciBmbG93ICVkIGluIHN0YXRlICVkICIKKyAgICAgICAgICAgICAgICAic2luY2UgYW5vdGhlciByZXF1ZXN0IGlzIHBlbmRpbmciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIAorICAgICAgICAgICAgICAgIFFvc0Zsb3dJRCwgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgYnVmZmVyQ29tbWFuZCA9IFZPU19UUlVFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy8gbWFrZSBzdXJlIHdlIGFyZSBpbiBmdWxsIHBvd2VyIHNvIHRoYXQgd2UgY2FuIGlzc3VlCisgICAgICAvLyBhIERlbFRTIG9yIHJlYXNzb2MgaWYgbmVjZXNzYXJ5CisgICAgICBoc3RhdHVzID0gcG1jUmVxdWVzdEZ1bGxQb3dlcihwTWFjLCBzbWVfUW9zUG1jRnVsbFBvd2VyQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbiwgZVNNRV9SRUFTT05fT1RIRVIpOworICAgICAgaWYoIGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HID09IGhzdGF0dXMgKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IGJ1ZmZlcmluZyB0aGUgcmVsZWFzZSByZXF1ZXN0IGZvciBmbG93ICVkIGluIHN0YXRlICVkLCAiCisgICAgICAgICAgICAgICAgICAgIndhaXRpbmcgZm9yIGZ1bGwgcG93ZXIiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIAorICAgICAgICAgICAgICAgICAgIFFvc0Zsb3dJRCwgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgICAgYnVmZmVyQ29tbWFuZCA9IFZPU19UUlVFOworICAgICAgfQorICAgfQorICAgaWYgKGJ1ZmZlckNvbW1hbmQpCisgICB7CisgICAgICAvLyB3ZSBuZWVkIHRvIGJ1ZmZlciB0aGUgY29tbWFuZAorICAgICAgY21kLmNvbW1hbmQgPSBTTUVfUU9TX1JFTEVBU0VfUkVROworICAgICAgY21kLnBNYWMgPSBwTWFjOworICAgICAgY21kLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgIGNtZC51LnJlbGVhc2VDbWRJbmZvLlFvc0Zsb3dJRCA9IFFvc0Zsb3dJRDsKKyAgICAgIGhzdGF0dXMgPSBzbWVfUW9zQnVmZmVyQ21kKCZjbWQsIGJ1ZmZlcmVkX2NtZCk7CisgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IGNvdWxkbid0IGJ1ZmZlciB0aGUgcmVsZWFzZSByZXF1ZXN0IGluIHN0YXRlID0gJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgICAgLy8gdW5hYmxlIHRvIGJ1ZmZlciB0aGUgcmVxdWVzdAorICAgICAgICAgLy8gbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfRkFJTFVSRV9SU1A7CisgICAgICB9CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IEJ1ZmZlcmVkIHJlbGVhc2UgcmVxdWVzdCBmb3IgZmxvdyA9ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIFFvc0Zsb3dJRCk7CisgICAgICByZXR1cm4gU01FX1FPU19TVEFUVVNfUkVMRUFTRV9SRVFfUEVORElOR19SU1A7CisgICB9CisgICAvL2dldCBpbnRvIHRoZSBzdGF0IG0vYyB0byBzZWUgaWYgdGhlIHJlcXVlc3QgY2FuIGJlIGdyYW50ZWQKKyAgIHN3aXRjaChwQUNJbmZvLT5jdXJyX3N0YXRlKQorICAgeworICAgY2FzZSBTTUVfUU9TX1FPU19PTjoKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiB0c3BlY19tYXNrX3N0YXR1cyA9ICVkIGZvciBBQyA9ICVkIHdpdGggIgorICAgICAgICAgICAgICAgICJlbnRyeSB0c3BlY19tYXNrID0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIAorICAgICAgICAgICAgICAgIHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzLCBhYywgZmxvd19pbmZvLT50c3BlY19tYXNrKTsKKworICAgICAgLy9jaGVjayBpZiBtdWx0aXBsZSBmbG93cyBydW5uaW5nIG9uIHRoZSBhYworICAgICAgaWYocEFDSW5mby0+bnVtX2Zsb3dzW2Zsb3dfaW5mby0+dHNwZWNfbWFzayAtIDFdID4gMSkKKyAgICAgIHsKKyAgICAgICAgIC8vZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSBmbG93IGluIHRoZSBuZXcgVFNQRUMgb24gd2hpY2ggcmVsZWFzZSAKKyAgICAgICAgIC8vaXMgcmVxdWVzdGVkCisgICAgICAgICBmbG93X2luZm8tPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1JFTEVBU0U7CisKKyAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBmbG93IGJlaW5nIHJlbGVhc2VkIGlzIGZvciBiaS1kaXJldGlvbmFsLgorICAgICAgICAgICogRm9sbG93aW5nIGZsb3dzIG1heSBwcmVzZW50IGluIHRoZSBzeXN0ZW0uIAorICAgICAgICAgICogYSkgYmktZGlyZWN0aW9uYWwgZmxvd3MKKyAgICAgICAgICAqIGIpIHVwbGluayBmbG93cworICAgICAgICAgICogYykgZG93bmxpbmsgZmxvd3MuIAorICAgICAgICAgICogSWYgdGhlIGZsb3cgYmVpbmcgcmVsZWFzZWQgaXMgZm9yIGJpZGlyZWN0aW9uYWwsIHNwbGl0dGluZyBvZiBleGlzdGluZyAKKyAgICAgICAgICAqIHN0cmVhbXMgaW50byB0d28gdHNwZWMgaW5kaWNlcyBpcyByZXF1aXJlZCBpbiBjYXNlIGZmIChiKSwgKGMpIGFyZSBwcmVzZW50IAorICAgICAgICAgICogYW5kIG5vdCAoYSkuCisgICAgICAgICAgKiBJbiBjYXNlIGlmIHNwbGl0IG9jY3VycywgYWxsIHVwc3RyZWFtcyBhcmUgYWdncmVnYXRlZCBpbnRvIHRzcGVjIGluZGV4IDAsIAorICAgICAgICAgICogZG93bnN0cmVhbXMgYXJlIGFnZ3JlZ2FlZCBpbnRvIHRzcGVjIGluZGV4IDEgYW5kIHR3byB0c3BlYyByZXF1ZXN0cyBmb3IgCisgICAgICAgICAgKiAoYWdncmVnYXRlZCkgdXBzdHJlYW0ocykgZm9sbG93ZWQgYnkgKGFnZ3JlZ2F0ZWQpIGRvd25zdHJlYW0ocykgaXMgc2VudAorICAgICAgICAgICogdG8gQVAuICovCisgICAgICAgICBpZihmbG93X2luZm8tPlFvU0luZm8udHNfaW5mby5kaXJlY3Rpb24gPT0gU01FX1FPU19XTU1fVFNfRElSX0JPVEgpCisgICAgICAgICB7CisgICAgICAgICAgIHZvc19tZW1femVybygmc2VhcmNoX2tleSwgc2l6ZW9mKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisgICAgICAgICAgIC8vc2V0IHRoZSBrZXkgdHlwZSAmIHRoZSBrZXkgdG8gYmUgc2VhcmNoZWQgaW4gdGhlIEZsb3cgTGlzdAorICAgICAgICAgICBzZWFyY2hfa2V5LmtleS5hY190eXBlID0gYWM7CisgICAgICAgICAgIHNlYXJjaF9rZXkuaW5kZXggPSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfNDsKKyAgICAgICAgICAgc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgICAgIHNlYXJjaF9rZXkuZGlyZWN0aW9uID0gU01FX1FPU19XTU1fVFNfRElSX0JPVEg7CisgICAgICAgICAgIHBSZXN1bHQgPSBzbWVfUW9zRmluZEluRmxvd0xpc3Qoc2VhcmNoX2tleSk7CisgICAgICAgICAgIGlmKHBSZXN1bHQpCisgICAgICAgICAgICAgYmlEaXJlY3Rpb25hbEZsb3dzUHJlc2VudCA9IFZPU19UUlVFOworCisgICAgICAgICAgIGlmKCFiaURpcmVjdGlvbmFsRmxvd3NQcmVzZW50KQorICAgICAgICAgICB7CisgICAgICAgICAgICAgLy8gVGhlIG9ubHkgZXhpc3RpbmcgYmlkaXJlY3Rpb25hbCBmbG93IGlzIGJlaW5nIHJlbGVhc2VkCisKKyAgICAgICAgICAgICAvLyBDaGVjayBpZiB1cGxpbmsgZmxvd3MgZXhpc3QKKyAgICAgICAgICAgICBzZWFyY2hfa2V5LmRpcmVjdGlvbiA9IFNNRV9RT1NfV01NX1RTX0RJUl9VUExJTks7CisgICAgICAgICAgICAgcFJlc3VsdCA9IHNtZV9Rb3NGaW5kSW5GbG93TGlzdChzZWFyY2hfa2V5KTsKKyAgICAgICAgICAgICBpZihwUmVzdWx0KQorICAgICAgICAgICAgICAgdXBsaW5rRmxvd3NQcmVzZW50ID0gVk9TX1RSVUU7CisKKyAgICAgICAgICAgICAvLyBDaGVjayBpZiBkb3dubGluayBmbG93cyBleGlzdAorICAgICAgICAgICAgIHNlYXJjaF9rZXkuZGlyZWN0aW9uID0gU01FX1FPU19XTU1fVFNfRElSX0RPV05MSU5LOworICAgICAgICAgICAgIHBSZXN1bHQgPSBzbWVfUW9zRmluZEluRmxvd0xpc3Qoc2VhcmNoX2tleSk7CisgICAgICAgICAgICAgaWYocFJlc3VsdCkKKyAgICAgICAgICAgICAgIGRvd25saW5rRmxvd3NQcmVzZW50ID0gVk9TX1RSVUU7CisKKyAgICAgICAgICAgICBpZih1cGxpbmtGbG93c1ByZXNlbnQgJiYgZG93bmxpbmtGbG93c1ByZXNlbnQpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy8gTmVlZCB0byBzcGxpdCB0aGUgdW5pLWRpcmVjdGlvbmFsIGZsb3dzIGludG8gU01FX1FPU19UU1BFQ19JTkRFWF8wIGFuZCBTTUVfUU9TX1RTUEVDX0lOREVYXzEKKworICAgICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZzZWFyY2hfa2V5LCBzaXplb2Yoc21lX1Fvc1NlYXJjaEluZm8pKTsKKyAgICAgICAgICAgICAgIC8vIE1hcmsgYWxsIGRvd25zdHJlYW0gZmxvd3MgYXMgdXNpbmcgdHNwZWMgaW5kZXggMQorICAgICAgICAgICAgICAgc2VhcmNoX2tleS5rZXkuYWNfdHlwZSA9IGFjOworICAgICAgICAgICAgICAgc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF80OworICAgICAgICAgICAgICAgc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgICAgICAgICBzZWFyY2hfa2V5LmRpcmVjdGlvbiA9IFNNRV9RT1NfV01NX1RTX0RJUl9ET1dOTElOSzsKKyAgICAgICAgICAgICAgIHNtZV9Rb3NVcGRhdGVUc3BlY01hc2soc2Vzc2lvbklkLCBzZWFyY2hfa2V5LCBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzJfU0VUKTsKKworICAgICAgICAgICAgICAgLy8gQWdncmVnYXRlIGFsbCBkb3duc3RyZWFtIGZsb3dzCisgICAgICAgICAgICAgICBoc3RhdHVzID0gc21lX1Fvc1VwZGF0ZVBhcmFtcyhzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYywgU01FX1FPU19UU1BFQ19NQVNLX0JJVF8yX1NFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZ2dyX1RzcGVjX0luZm8pOworCisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIGJ1ZmZlcmluZyB0aGUgQWRkVFMgcmVxdWVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBBQyAlZCBpbiBzdGF0ZSAlZCBhcyBBZGR0cyBpcyBwZW5kaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAib24gb3RoZXIgVHNwZWMgaW5kZXggb2YgdGhpcyBBQyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGFjLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKworICAgICAgICAgICAgICAgLy8gQnVmZmVyIHRoZSAoYWdncmVnYXRlZCkgdHNwZWMgcmVxdWVzdCBmb3IgZG93bnN0cmVhbSBmbG93cy4KKyAgICAgICAgICAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIChhZ2dyZWdhdGVkKSB0c3BlYyBmb3IgdXBzdHJlYW0gZmxvd3MgaXMgc2VudCAKKyAgICAgICAgICAgICAgIC8vIG91dCBieSB0aGUgc3VzZXF1ZW50IGxvZ2ljLgorICAgICAgICAgICAgICAgY21kLmNvbW1hbmQgPSBTTUVfUU9TX1JFU0VORF9SRVE7CisgICAgICAgICAgICAgICBjbWQucE1hYyA9IHBNYWM7CisgICAgICAgICAgICAgICBjbWQuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICAgICAgICAgY21kLnUucmVzZW5kQ21kSW5mby5hYyA9IGFjOworICAgICAgICAgICAgICAgY21kLnUucmVzZW5kQ21kSW5mby50c3BlY01hc2sgPSBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzJfU0VUOworICAgICAgICAgICAgICAgY21kLnUucmVzZW5kQ21kSW5mby5Rb1NJbmZvID0gQWdncl9Uc3BlY19JbmZvOworICAgICAgICAgICAgICAgcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19NQVNLX0JJVF8yX1NFVCAtIDFdID0gQWdncl9Uc3BlY19JbmZvOworICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzbWVfUW9zQnVmZmVyQ21kKCZjbWQsIFZPU19GQUxTRSkpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCB1bmFibGUgdG8gYnVmZmVyIHRoZSBBZGRUUyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgZm9yIEFDICVkIFRTUEVDICVkIGluIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMl9TRVQsIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworCisgICAgICAgICAgICAgICAgICAvLyB1bmFibGUgdG8gYnVmZmVyIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisKKyAgICAgICAgICAgICAgICAgIHJldHVybiBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfRkFJTFVSRV9SU1A7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyA9IFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV8yX1NFVDsKKworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICAvKiBJbiBjYXNlIG9mIHNwbGl0dGluZyBvZiBleGlzdGluZyBzdHJlYW1zLAorICAgICAgICAgICogdHNwZWNfbWFzayB3aWxsIGJlIHBvaW50aW5nIHRvIHRzcGVjIGluZGV4IDAgYW5kIAorICAgICAgICAgICogYWdncmVnYXRlZCB0c3BlYyBmb3IgdXBzdHJlYW0ocykgaXMgc2VudCBvdXQgaGVyZS4gKi8KKyAgICAgICAgIGhzdGF0dXMgPSBzbWVfUW9zVXBkYXRlUGFyYW1zKHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjLCBmbG93X2luZm8tPnRzcGVjX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWdncl9Uc3BlY19JbmZvKTsKKyAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW2Zsb3dfaW5mby0+dHNwZWNfbWFzayAtIDFdID0gQWdncl9Uc3BlY19JbmZvOworICAgICAgICAgICAgLy9pZiBBQ00sIHNlbmQgb3V0IGEgbmV3IEFERFRTCisgICAgICAgICAgICBzdGF0dXMgPSBzbWVfUW9zU2V0dXAocE1hYywgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1tmbG93X2luZm8tPnRzcGVjX21hc2sgLSAxXSwgYWMpOworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHdpdGggQUMgJWQgaW4gc3RhdGUgU01FX1FPU19RT1NfT04gIgorICAgICAgICAgICAgICAgICAgICAgICJzbWVfUW9zU2V0dXAgcmV0dXJuZWQgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBhYywgc3RhdHVzKTsKKyAgICAgICAgICAgIGlmKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUCAhPSBzdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvLyB3ZSBhcmVuJ3Qgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBBUAorICAgICAgICAgICAgICAgLy8gc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1AgPT0gc3RhdHVzKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIG5ld19zdGF0ZSA9IFNNRV9RT1NfUkVRVUVTVEVEOworICAgICAgICAgICAgICAgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfUkVMRUFTRV9SRVFfUEVORElOR19SU1A7CisgICAgICAgICAgICAgICBwQUNJbmZvLT50c3BlY19wZW5kaW5nID0gZmxvd19pbmZvLT50c3BlY19tYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19OT19BQ01fTk9fQVBTRF9SU1AgPT0gc3RhdHVzKSB8fAorICAgICAgICAgICAgICAgICAgICAoU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19BUFNEX1NFVF9BTFJFQURZID09IHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBuZXdfc3RhdGUgPSBTTUVfUU9TX1FPU19PTjsKKyAgICAgICAgICAgICAgIHBBQ0luZm8tPm51bV9mbG93c1tmbG93X2luZm8tPnRzcGVjX21hc2sgLSAxXS0tOworICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW2Zsb3dfaW5mby0+dHNwZWNfbWFzayAtIDFdID0KKyAgICAgICAgICAgICAgICAgIHBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW2Zsb3dfaW5mby0+dHNwZWNfbWFzayAtIDFdOworICAgICAgICAgICAgICAgLy9kZWxldGUgdGhlIGVudHJ5IGZyb20gRmxvdyBMaXN0CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IERlbGV0aW5nIGVudHJ5IGF0ICVwIHdpdGggZmxvd0lEICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5mbywgUW9zRmxvd0lEKTsKKyAgICAgICAgICAgICAgIGNzckxMUmVtb3ZlRW50cnkoJnNtZV9Rb3NDYi5mbG93X2xpc3QsIHBFbnRyeSwgVk9TX1RSVUUgKTsKKyAgICAgICAgICAgICAgIHBEZWxldGVkRmxvdyA9IGZsb3dfaW5mbzsKKyAgICAgICAgICAgICAgIGlmKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PSBzdGF0dXMpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8oJnNlYXJjaF9rZXksIHNpemVvZihzbWVfUW9zU2VhcmNoSW5mbykpOworICAgICAgICAgICAgICAgICAgc2VhcmNoX2tleS5rZXkuYWNfdHlwZSA9IGFjOworICAgICAgICAgICAgICAgICAgc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8yOworICAgICAgICAgICAgICAgICAgc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgICBoc3RhdHVzID0gc21lX1Fvc0ZpbmRBbGxJbkZsb3dMaXN0KHBNYWMsIHNlYXJjaF9rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zU2V0dXBGbnApOworICAgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBjb3VsZG4ndCBub3RpZnkgb3RoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnRyaWVzIG9uIHRoaXMgQUMgPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBhYyk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX1NVQ0NFU1NfUlNQOworICAgICAgICAgICAgICAgaWYoYnVmZmVyZWRfY21kKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLCBmbG93X2luZm8tPkhERGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW2Zsb3dfaW5mby0+dHNwZWNfbWFzayAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgc3RhdHVzIHJldHVybmVkIGJ5IHNtZV9Rb3NTZXR1cCgpCisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCB1bmV4cGVjdGVkIHN0YXR1cyAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGJ5IHNtZV9Rb3NTZXR1cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHN0YXR1cyk7CisgICAgICAgICAgICAgICBuZXdfc3RhdGUgPSBTTUVfUU9TX0xJTktfVVA7CisgICAgICAgICAgICAgICBwQUNJbmZvLT5udW1fZmxvd3NbZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0tLTsKKyAgICAgICAgICAgICAgIHBBQ0luZm8tPmN1cnJfUW9TSW5mb1tmbG93X2luZm8tPnRzcGVjX21hc2sgLSAxXSA9CisgICAgICAgICAgICAgICAgICBwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1tmbG93X2luZm8tPnRzcGVjX21hc2sgLSAxXTsKKyAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdAorICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIGRlbGV0aW5nIGVudHJ5IGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXAgd2l0aCBmbG93SUQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBmbG93X2luZm8sIFFvc0Zsb3dJRCk7CisgICAgICAgICAgICAgICBjc3JMTFJlbW92ZUVudHJ5KCZzbWVfUW9zQ2IuZmxvd19saXN0LCBwRW50cnksIFZPU19UUlVFICk7CisgICAgICAgICAgICAgICBwRGVsZXRlZEZsb3cgPSBmbG93X2luZm87CisgICAgICAgICAgICAgICBpZihidWZmZXJlZF9jbWQpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmbG93X2luZm8tPlFvU0NhbGxiYWNrKHBNYWMsIGZsb3dfaW5mby0+SEREY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQUNJbmZvLT5jdXJyX1FvU0luZm9bZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLy9lcnIgbXNnCisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogc21lX1Fvc1VwZGF0ZVBhcmFtcygpIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAvLyB1bmFibGUgdG8gc2VydmljZSB0aGUgcmVxdWVzdAorICAgICAgICAgICAgLy8gbm90aGluZyBpcyBwZW5kaW5nIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgICAgICAgbmV3X3N0YXRlID0gU01FX1FPU19MSU5LX1VQOworICAgICAgICAgICAgaWYoYnVmZmVyZWRfY21kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLCBmbG93X2luZm8tPkhERGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW2Zsb3dfaW5mby0+dHNwZWNfbWFzayAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8vIHRoaXMgaXMgdGhlIG9ubHkgZmxvdyBhZ2dyZWdhdGVkIGluIHRoaXMgVFNQRUMKKyAgICAgICAgIHN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfU1VDQ0VTU19SU1A7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAgaWYgKGFjID09IFNNRV9RT1NfRURDQV9BQ19WTykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEluZGljYXRlIHRvIG5laWdoYm9yIHJvYW0gbG9naWMgb2YgdGhlIG5ldyByZXF1aXJlZCBWTworICAgICAgICAgICAgLy8gYWMgYmFuZHdpZHRoIHJlcXVpcmVtZW50LgorICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtSW5kaWNhdGVWb2ljZUJXKCBwTWFjLCBwQUNJbmZvLT5jdXJyX1FvU0luZm9bMF0ucGVha19kYXRhX3JhdGUsIEZBTFNFICk7CisgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgIC8vY2hlY2sgaWYgZGVsdHMgbmVlZHMgdG8gYmUgc2VudAorICAgICAgICAgaWYoQ1NSX0lTX0FERFRTX1dIRU5fQUNNT0ZGX1NVUFBPUlRFRChwTWFjKSB8fAorICAgICAgICAgICAgc21lX1Fvc0lzQUNNKHBNYWMsIHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MsIGFjLCBOVUxMKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vY2hlY2sgaWYgb3RoZXIgVFNQRUMgZm9yIHRoaXMgQUMgaXMgYWxzbyBpbiB1c2UKKyAgICAgICAgICAgIGlmKFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV8yX1NFVCAhPSBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIG9ubHkgVFNQRUMgYWN0aXZlIG9uIHRoaXMgQUMKKyAgICAgICAgICAgICAgIC8vIHNvIGluZGljYXRlIHRoYXQgd2Ugbm8gbG9uZ2VyIHJlcXVpcmUgQVBTRAorICAgICAgICAgICAgICAgcFNlc3Npb24tPmFwc2RNYXNrICY9IH4oMSA8PCAoU01FX1FPU19FRENBX0FDX1ZPIC0gYWMpKTsKKyAgICAgICAgICAgICAgIC8vQWxzbyB1cGRhdGUgbW9kaWZ5UHJvZmlsZUZpZWxkcy51YXBzZF9tYXNrIGluIENTUiBmb3IgY29uc2lzdGVuY3kKKyAgICAgICAgICAgICAgIGNzckdldE1vZGlmeVByb2ZpbGVGaWVsZHMocE1hYywgZmxvd19pbmZvLT5zZXNzaW9uSWQsICZtb2RpZnlQcm9maWxlRmllbGRzKTsKKyAgICAgICAgICAgICAgIG1vZGlmeVByb2ZpbGVGaWVsZHMudWFwc2RfbWFzayA9IHBTZXNzaW9uLT5hcHNkTWFzazsgCisgICAgICAgICAgICAgICBjc3JTZXRNb2RpZnlQcm9maWxlRmllbGRzKHBNYWMsIGZsb3dfaW5mby0+c2Vzc2lvbklkLCAmbW9kaWZ5UHJvZmlsZUZpZWxkcyk7CisgICAgICAgICAgICAgICBpZighcFNlc3Npb24tPmFwc2RNYXNrKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzZXNzaW9uIG5vIGxvbmdlciBuZWVkcyBVQVBTRAorICAgICAgICAgICAgICAgICAgLy8gZG8gYW55IHNlc3Npb25zIHN0aWxsIHJlcXVpcmUgVUFQU0Q/CisgICAgICAgICAgICAgICAgICBpZiAoIXNtZV9Rb3NJc1VhcHNkQWN0aXZlKCkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvLyBObyBzZXNzaW9ucyByZXF1aXJlIFVBUFNEIHNvIHR1cm4gaXQgb2ZmCisgICAgICAgICAgICAgICAgICAgICAvLyAocmVhbGx5IGRvbid0IGNhcmUgd2hlbiBQTUMgc3RvcHMgaXQpCisgICAgICAgICAgICAgICAgICAgICAodm9pZClwbWNTdG9wVWFwc2QocE1hYyk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3NlbmQgZGVsdHMKKyAgICAgICAgICAgIGhzdGF0dXMgPSBxb3NJc3N1ZUNvbW1hbmQocE1hYywgc2Vzc2lvbklkLCBlU21lQ29tbWFuZERlbFRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBhYywgZmxvd19pbmZvLT50c3BlY19tYXNrKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoaHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBzbWVfUW9zRGVsVHNSZXEoKSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfUkVMRUFTRV9GQUlMVVJFX1JTUDsKKyAgICAgICAgICAgICAgIC8vIHdlIHdvbid0IGJlIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVAKKyAgICAgICAgICAgICAgIC8vIHNvIHZvdGUgcG93ZXJzYXZlIGJhY2sgb24KKyAgICAgICAgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMgJj0gU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUICYgCisgICAgICAgICAgICAgICAgICAofmZsb3dfaW5mby0+dHNwZWNfbWFzayk7CisgICAgICAgICAgICAgICBkZWx0c0lzc3VlZCA9IFZPU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZihwU2Vzc2lvbi0+YXBzZE1hc2sgJiAoMSA8PCAoU01FX1FPU19FRENBX0FDX1ZPIC0gYWMpKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vcmVhc3NvYyBsb2dpYworICAgICAgICAgICAgY3NyR2V0TW9kaWZ5UHJvZmlsZUZpZWxkcyhwTWFjLCBzZXNzaW9uSWQsICZtb2RpZnlQcm9maWxlRmllbGRzKTsKKyAgICAgICAgICAgIG1vZGlmeVByb2ZpbGVGaWVsZHMudWFwc2RfbWFzayB8PSBwU2Vzc2lvbi0+YXBzZE1hc2s7CisgICAgICAgICAgICBtb2RpZnlQcm9maWxlRmllbGRzLnVhcHNkX21hc2sgJj0gfigxIDw8IChTTUVfUU9TX0VEQ0FfQUNfVk8gLSBhYykpOworICAgICAgICAgICAgcFNlc3Npb24tPmFwc2RNYXNrICY9IH4oMSA8PCAoU01FX1FPU19FRENBX0FDX1ZPIC0gYWMpKTsKKyAgICAgICAgICAgIGlmKCFwU2Vzc2lvbi0+YXBzZE1hc2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvLyB0aGlzIHNlc3Npb24gbm8gbG9uZ2VyIG5lZWRzIFVBUFNECisgICAgICAgICAgICAgICAvLyBkbyBhbnkgc2Vzc2lvbnMgc3RpbGwgcmVxdWlyZSBVQVBTRD8KKyAgICAgICAgICAgICAgIGlmICghc21lX1Fvc0lzVWFwc2RBY3RpdmUoKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vIE5vIHNlc3Npb25zIHJlcXVpcmUgVUFQU0Qgc28gdHVybiBpdCBvZmYKKyAgICAgICAgICAgICAgICAgIC8vIChyZWFsbHkgZG9uJ3QgY2FyZSB3aGVuIFBNQyBzdG9wcyBpdCkKKyAgICAgICAgICAgICAgICAgICh2b2lkKXBtY1N0b3BVYXBzZChwTWFjKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhzdGF0dXMgPSBzbWVfUW9zUmVxdWVzdFJlYXNzb2MocE1hYywgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZ5UHJvZmlsZUZpZWxkcywgVk9TX0ZBTFNFKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoaHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBSZWFzc29jIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQOworICAgICAgICAgICAgICAgLy8gd2Ugd29uJ3QgYmUgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBBUAorICAgICAgICAgICAgICAgLy8gc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwQUNJbmZvLT5yZWFzc29jX3BlbmRpbmcgPSBWT1NfRkFMU0U7Ly9ubyBuZWVkIHRvIHdhaXQKKyAgICAgICAgICAgICAgIHBBQ0luZm8tPnByZXZfc3RhdGUgPSBTTUVfUU9TX0xJTktfVVA7CisgICAgICAgICAgICAgICBwQUNJbmZvLT50c3BlY19wZW5kaW5nID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogbm90aGluZyB0byBkbyBmb3IgQUMgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgYWMpOworICAgICAgICAgICAgLy8gd2Ugd29uJ3QgYmUgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBBUAorICAgICAgICAgICAgLy8gc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICAgICB9CisgICAgICAgICBpZihidWZmZXJlZF9jbWQpCisgICAgICAgICB7CisgICAgICAgICAgICBmbG93X2luZm8tPlFvU0NhbGxiYWNrKHBNYWMsIGZsb3dfaW5mby0+SEREY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgICAgfQorICAgICAgICAgaWYoU01FX1FPU19TVEFUVVNfUkVMRUFTRV9GQUlMVVJFX1JTUCA9PSBzdGF0dXMpCisgICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYoKChTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgJiB+Zmxvd19pbmZvLT50c3BlY19tYXNrKSA+IDApICYmCisgICAgICAgICAgICAoKFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV8yX1NFVCAmIH5mbG93X2luZm8tPnRzcGVjX21hc2spIDw9IAorICAgICAgICAgICAgICAgIFNNRV9RT1NfVFNQRUNfSU5ERVhfTUFYKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBBQ0luZm8tPm51bV9mbG93c1soU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUICYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+Zmxvd19pbmZvLT50c3BlY19tYXNrKSAtIDFdID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIG5ld19zdGF0ZSA9IFNNRV9RT1NfUU9TX09OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgbmV3X3N0YXRlID0gU01FX1FPU19MSU5LX1VQOworICAgICAgICAgICAgfSAgICAgICAgIAorICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBFeGNlZWRlZCB0aGUgYXJyYXkgYm91bmRzIG9mIHBBQ0luZm8tPm51bV9mbG93cyIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBWT1NfQVNTRVJUICgwKTsKKyAgICAgICAgICAgIHJldHVybiBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0lOVkFMSURfUEFSQU1TX1JTUDsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYoVk9TX0ZBTFNFID09IGRlbHRzSXNzdWVkKQorICAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZwQUNJbmZvLT5jdXJyX1FvU0luZm9bZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0sIAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisgICAgICAgICB9CisgICAgICAgICB2b3NfbWVtX3plcm8oJnBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW2Zsb3dfaW5mby0+dHNwZWNfbWFzayAtIDFdLCAKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworICAgICAgICAgcEFDSW5mby0+bnVtX2Zsb3dzW2Zsb3dfaW5mby0+dHNwZWNfbWFzayAtIDFdLS07CisgICAgICAgICAvL2RlbGV0ZSB0aGUgZW50cnkgZnJvbSBGbG93IExpc3QKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBkZWxldGluZyBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGZsb3dfaW5mbywgUW9zRmxvd0lEKTsKKyAgICAgICAgIGNzckxMUmVtb3ZlRW50cnkoJnNtZV9Rb3NDYi5mbG93X2xpc3QsIHBFbnRyeSwgVk9TX1RSVUUgKTsKKyAgICAgICAgIHBEZWxldGVkRmxvdyA9IGZsb3dfaW5mbzsKKyAgICAgIH0KKyAgICAgIC8qIGlmIHdlIGFyZSBkb2luZyByZWFzc29jICYgd2UgYXJlIGFscmVhZHkgaW4gaGFuZG9mZiBzdGF0ZSwgbm8gbmVlZAorICAgICAgICAgdG8gbW92ZSB0byByZXF1ZXN0ZWQgc3RhdGUuIEJ1dCBtYWtlIHN1cmUgdG8gc2V0IHRoZSBwcmV2aW91cyBzdGF0ZQorICAgICAgICAgYXMgcmVxdWVzdGVkIHN0YXRlCisgICAgICAqLworICAgICAgaWYoU01FX1FPU19IQU5ET0ZGICE9IHBBQ0luZm8tPmN1cnJfc3RhdGUpCisgICAgICB7CisgICAgICAgICBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIG5ld19zdGF0ZSk7CisgICAgICB9CisgICAgICBpZihwQUNJbmZvLT5yZWFzc29jX3BlbmRpbmcpCisgICAgICB7CisgICAgICAgICBwQUNJbmZvLT5wcmV2X3N0YXRlID0gU01FX1FPU19SRVFVRVNURUQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgU01FX1FPU19IQU5ET0ZGOgorICAgY2FzZSBTTUVfUU9TX1JFUVVFU1RFRDoKKyAgICAgIC8vYnVmZmVyIGNtZAorICAgICAgY21kLmNvbW1hbmQgPSBTTUVfUU9TX1JFTEVBU0VfUkVROworICAgICAgY21kLnBNYWMgPSBwTWFjOworICAgICAgY21kLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgIGNtZC51LnJlbGVhc2VDbWRJbmZvLlFvc0Zsb3dJRCA9IFFvc0Zsb3dJRDsKKyAgICAgIGhzdGF0dXMgPSBzbWVfUW9zQnVmZmVyQ21kKCZjbWQsIGJ1ZmZlcmVkX2NtZCk7CisgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IGNvdWxkbid0IGJ1ZmZlciB0aGUgcmVsZWFzZSByZXF1ZXN0IGluIHN0YXRlID0gJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgICAgLy8gdW5hYmxlIHRvIHNlcnZpY2UgdGhlIHJlcXVlc3QKKyAgICAgICAgIC8vIG5vdGhpbmcgaXMgcGVuZGluZyBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uCisgICAgICAgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfVFJVRTsKKyAgICAgICAgIHJldHVybiBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQOworICAgICAgfQorICAgICAgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfUkVMRUFTRV9SRVFfUEVORElOR19SU1A7CisgICAgICBicmVhazsKKyAgIGNhc2UgU01FX1FPU19DTE9TRUQ6CisgICBjYXNlIFNNRV9RT1NfSU5JVDoKKyAgIGNhc2UgU01FX1FPU19MSU5LX1VQOgorICAgZGVmYXVsdDoKKyAgICAgIC8vcHJpbnQgZXJyb3IgbXNnCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogcmVsZWFzZSByZXF1ZXN0IGluIHVuZXhwZWN0ZWQgc3RhdGUgPSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBwQUNJbmZvLT5jdXJyX3N0YXRlICk7CisgICAgICAvL0FTU0VSVAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIC8vIHVuYWJsZSB0byBzZXJ2aWNlIHRoZSByZXF1ZXN0CisgICAgICAvLyBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICBicmVhazsKKyAgIH0KKyAgIC8vIGlmIHdlIGRlbGV0ZWQgYSBmbG93LCByZWNsYWltIHRoZSBtZW1vcnkKKyAgIGlmIChwRGVsZXRlZEZsb3cpCisgICB7CisgICAgICB2b3NfbWVtX2ZyZWUocERlbGV0ZWRGbG93KTsKKyAgIH0KKyAgIGlmKChTTUVfUU9TX1NUQVRVU19SRUxFQVNFX1NVQ0NFU1NfUlNQID09IHN0YXR1cykpIAorICAgeworICAgICAgKHZvaWQpc21lX1Fvc1Byb2Nlc3NCdWZmZXJlZENtZChzZXNzaW9uSWQpOworICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1NldHVwKCkgLSBUaGUgaW50ZXJuYWwgcW9zIHNldHVwIGZ1bmN0aW9uIHdoaWNoIGhhcyB0aGUgCisgIGludGVsbGlnZW5jZSBpZiB0aGUgcmVxdWVzdCBpcyBOT1AsIG9yIGZvciBBUFNEIGFuZC9vciBuZWVkIHRvIHNlbmQgb3V0IEFERFRTLgorICBJdCBhbHNvIGRvZXMgdGhlIHNhbml0eSBjaGVjayBmb3IgUUFQLCBBUCBzdXBwb3J0cyBBUFNEIGV0Yy4KKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuICAgCisgIFxwYXJhbSBzZXNzaW9uSWQgLSBTZXNzaW9uIHVwb24gd2hpY2ggc2V0dXAgaXMgYmVpbmcgcGVyZm9ybWVkCisgIFxwYXJhbSBwVHNwZWNfSW5mbyAtIFBvaW50ZXIgdG8gc21lX1Fvc1dtbVRzcGVjSW5mbyB3aGljaCBjb250YWlucyB0aGUgV01NIAorICAgICAgICAgICAgICAgICAgICAgICBUU1BFQyByZWxhdGVkIGluZm8gYXMgZGVmaW5lZCBhYm92ZQorICBccGFyYW0gYWMgLSBFbnVtZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBFRENBIEFjY2VzcyBDYXRlZ29yaWVzLgorICAKKyAgXHJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX1JTUCBpZiB0aGUgc2V0dXAgaXMgc3VjY2Vzc2Z1bAorICBUaGUgbG9naWMgdXNlZCBpbiB0aGUgY29kZSBtaWdodCBiZSBjb25mdXNpbmcuIFRyeWluZyB0byBjb3ZlciBhbGwgdGhlIGNhc2VzIAorICBoZXJlLgorICBBUCBzdXBwb3J0cyAgQXBwIHdhbnRzICAgQUNNID0gMSAgQWxyZWFkeSBzZXQgQVBTRCAgIFJlc3VsdAorICB8ICAgIDAgICAgIHwgICAgMCAgICAgfCAgICAgMCAgIHwgICAgICAgMCAgICAgICAgICB8ICBOTyBBQ00gTk8gQVBTRAorICB8ICAgIDAgICAgIHwgICAgMCAgICAgfCAgICAgMCAgIHwgICAgICAgMSAgICAgICAgICB8ICBOTyBBQ00gTk8gQVBTRC9JTlZBTElECisgIHwgICAgMCAgICAgfCAgICAwICAgICB8ICAgICAxICAgfCAgICAgICAwICAgICAgICAgIHwgIEFERFRTCisgIHwgICAgMCAgICAgfCAgICAwICAgICB8ICAgICAxICAgfCAgICAgICAxICAgICAgICAgIHwgIEFERFRTCisgIHwgICAgMCAgICAgfCAgICAxICAgICB8ICAgICAwICAgfCAgICAgICAwICAgICAgICAgIHwgIEZBSUxVUkUKKyAgfCAgICAwICAgICB8ICAgIDEgICAgIHwgICAgIDAgICB8ICAgICAgIDEgICAgICAgICAgfCAgSU5WQUxJRAorICB8ICAgIDAgICAgIHwgICAgMSAgICAgfCAgICAgMSAgIHwgICAgICAgMCAgICAgICAgICB8ICBBRERUUworICB8ICAgIDAgICAgIHwgICAgMSAgICAgfCAgICAgMSAgIHwgICAgICAgMSAgICAgICAgICB8ICBBRERUUworICB8ICAgIDEgICAgIHwgICAgMCAgICAgfCAgICAgMCAgIHwgICAgICAgMCAgICAgICAgICB8ICBOTyBBQ00gTk8gQVBTRAorICB8ICAgIDEgICAgIHwgICAgMCAgICAgfCAgICAgMCAgIHwgICAgICAgMSAgICAgICAgICB8ICBOTyBBQ00gTk8gQVBTRAorICB8ICAgIDEgICAgIHwgICAgMCAgICAgfCAgICAgMSAgIHwgICAgICAgMCAgICAgICAgICB8ICBBRERUUworICB8ICAgIDEgICAgIHwgICAgMCAgICAgfCAgICAgMSAgIHwgICAgICAgMSAgICAgICAgICB8ICBBRERUUworICB8ICAgIDEgICAgIHwgICAgMSAgICAgfCAgICAgMCAgIHwgICAgICAgMCAgICAgICAgICB8ICBSRUFTU09DCisgIHwgICAgMSAgICAgfCAgICAxICAgICB8ICAgICAwICAgfCAgICAgICAxICAgICAgICAgIHwgIE5PUDogQVBTRCBTRVQgQUxSRUFEWQorICB8ICAgIDEgICAgIHwgICAgMSAgICAgfCAgICAgMSAgIHwgICAgICAgMCAgICAgICAgICB8ICBBRERUUworICB8ICAgIDEgICAgIHwgICAgMSAgICAgfCAgICAgMSAgIHwgICAgICAgMSAgICAgICAgICB8ICBBRERUUworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfUW9zU2V0dXAodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBUc3BlY19JbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYykKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgc21lX1Fvc1N0YXR1c1R5cGUgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisgICB0RG90MTFmQmVhY29uSUVzICpwSWVzID0gTlVMTDsKKyAgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyBtb2RpZnlQcm9maWxlRmllbGRzOworICAgZUhhbFN0YXR1cyBoc3RhdHVzOworICAgaWYoICFDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IFNlc3Npb24gSWQgJWQgaXMgaW52YWxpZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgaWYoICFwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogU2Vzc2lvbiAlZCBpcyBpbmFjdGl2ZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKyAgIGlmKCFwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IFNlc3Npb24gJWQgaGFzIGFuIEludmFsaWQgQlNTIERlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBhYyk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorICAgaHN0YXR1cyA9IGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEllcyk7CisgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGhzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCB1bmFibGUgdG8gcGFyc2UgQlNTIElFcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGFjKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisKKyAgIC8qIHN1Y2Nlc3Mgc28gcEllcyB3YXMgYWxsb2NhdGVkICovCisKKyAgIGlmKCAhQ1NSX0lTX1FPU19CU1MocEllcykgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgQVAgZG9lc24ndCBzdXBwb3J0IFFvUyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgdm9zX21lbV9mcmVlKHBJZXMpOworICAgICAgLy9ub3RpZnkgSEREIHRocm91Z2ggdGhlIHN5bmNocm9ub3VzIHN0YXR1cyBtc2cKKyAgICAgIHJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9OT1RfUU9TX0FQX1JTUDsKKyAgIH0KKyAgIGlmKHBUc3BlY19JbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbCB8fCBwVHNwZWNfSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWwpCisgICB7CisgICAgICBwVHNwZWNfSW5mby0+dHNfaW5mby5wc2IgPSAxOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcFRzcGVjX0luZm8tPnRzX2luZm8ucHNiID0gMDsKKyAgIH0KKworICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICBkbworICAgeworICAgICAgLy8gaXMgQUNNIGVuYWJsZWQgZm9yIHRoaXMgQUM/CisgICAgICBpZihDU1JfSVNfQUREVFNfV0hFTl9BQ01PRkZfU1VQUE9SVEVEKHBNYWMpIHx8CisgICAgICAgICBzbWVfUW9zSXNBQ00ocE1hYywgcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYywgYWMsIE5VTEwpKQorICAgICAgeworICAgICAgICAgLy8gQUNNIGlzIGVuYWJsZWQgZm9yIHRoaXMgQUMgc28gd2UgbXVzdCBzZW5kIGFuIEFkZFRTCisgICAgICAgICBpZihwVHNwZWNfSW5mby0+dHNfaW5mby5wc2IgJiYgCisgICAgICAgICAgICAoIXBNYWMtPnBtYy51YXBzZEVuYWJsZWQgKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogUmVxdWVzdCBpcyBsb29raW5nIGZvciBBUFNEIGJ1dCBQTUMgZG9lc24ndCAiCisgICAgICAgICAgICAgICAgICAgICAgImhhdmUgc3VwcG9ydCBmb3IgQVBTRCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmKFNNRV9RT1NfTUFYX1RJRCA9PSBwVHNwZWNfSW5mby0+dHNfaW5mby50aWQpCisgICAgICAgICB7CisgICAgICAgICAgICAvL0FwcCBkaWRuJ3Qgc2V0IFRJRCwgZ2VuZXJhdGUgb25lCisgICAgICAgICAgICBwVHNwZWNfSW5mby0+dHNfaW5mby50aWQgPQorICAgICAgICAgICAgICAgKHZfVThfdCkoU01FX1FPU19XTU1fVVBfTkMgLSBwVHNwZWNfSW5mby0+dHNfaW5mby51cCk7CisgICAgICAgICB9CisgICAgICAgICAvL2FkZHRzIGxvZ2ljCisgICAgICAgICBoc3RhdHVzID0gcW9zSXNzdWVDb21tYW5kKHBNYWMsIHNlc3Npb25JZCwgZVNtZUNvbW1hbmRBZGRUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRzcGVjX0luZm8sIGFjLCAwKTsKKyAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoaHN0YXR1cykpCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogc21lX1Fvc0FkZFRzUmVxKCkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgQWRkVFMgb24gQUMgJWQgaXMgcGVuZGluZyIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGFjKTsKKyAgICAgICAgIHN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUDsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gQUNNIGlzIG5vdCBlbmFibGVkIGZvciB0aGlzIEFDCisgICAgICAvLyBJcyB0aGUgYXBwbGljYXRpb24gbG9va2luZyBmb3IgQVBTRD8KKyAgICAgIGlmKDAgPT0gcFRzcGVjX0luZm8tPnRzX2luZm8ucHNiKQorICAgICAgeworICAgICAgICAgLy9ubywgd2UgZG9uJ3QgbmVlZCBBUFNECisgICAgICAgICAvL2J1dCBjaGVjayB0aGUgY2FzZSwgaWYgdGhlIHNldHVwIGlzIGNhbGxlZCBhcyBhIHJlc3VsdCBvZiBhIHJlbGVhc2UgCisgICAgICAgICAvLyBvciBtb2RpZnkgd2hpY2ggYm9pbHMgZG93biB0byB0aGUgZmFjdCB0aGF0IEFQU0Qgd2FzIHNldCBvbiB0aGlzIEFDCisgICAgICAgICAvLyBidXQgbm8gbG9uZ2VyIG5lZWRlZCAtIHNvIHdlIG5lZWQgYSByZWFzc29jIGZvciB0aGUgYWJvdmUgY2FzZSB0byAKKyAgICAgICAgIC8vIGxldCB0aGUgQVAga25vdworICAgICAgICAgaWYocFNlc3Npb24tPmFwc2RNYXNrICYgKDEgPDwgKFNNRV9RT1NfRURDQV9BQ19WTyAtIGFjKSkpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBBUFNEIHdhcyBmb3JtZXJseSBlbmFibGVkIG9uIHRoaXMgQUMgYnV0IGlzIG5vIGxvbmdlciByZXF1aXJlZAorICAgICAgICAgICAgLy8gc28gd2UgbXVzdCByZWFzc29jaWF0ZQorICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHJlYXNzb2MgbmVlZGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAidG8gZGlzYWJsZSBBUFNEIG9uIEFDICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMpOworICAgICAgICAgICAgY3NyR2V0TW9kaWZ5UHJvZmlsZUZpZWxkcyhwTWFjLCBzZXNzaW9uSWQsICZtb2RpZnlQcm9maWxlRmllbGRzKTsKKyAgICAgICAgICAgIG1vZGlmeVByb2ZpbGVGaWVsZHMudWFwc2RfbWFzayB8PSBwU2Vzc2lvbi0+YXBzZE1hc2s7CisgICAgICAgICAgICBtb2RpZnlQcm9maWxlRmllbGRzLnVhcHNkX21hc2sgJj0gfigxIDw8IChTTUVfUU9TX0VEQ0FfQUNfVk8gLSBhYykpOworICAgICAgICAgICAgaHN0YXR1cyA9IHNtZV9Rb3NSZXF1ZXN0UmVhc3NvYyhwTWFjLCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZnlQcm9maWxlRmllbGRzLCBWT1NfRkFMU0UpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhoc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vZXJyIG1zZworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IFVuYWJsZSB0byByZXF1ZXN0IHJlYXNzb2NpYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCByZWFzc29jaWF0aW9uIHRvIGVuYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIkFQU0Qgb24gQUMgJWQgaXMgcGVuZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGFjKTsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUDsKKyAgICAgICAgICAgICAgIHBBQ0luZm8tPnJlYXNzb2NfcGVuZGluZyA9IFZPU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCBBUFNEIG9uIHRoaXMgQUMKKyAgICAgICAgICAgIC8vIGFuZCB3ZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBBUFNEIG9uIHRoaXMgQUMKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogUmVxdWVzdCBpcyBub3QgbG9va2luZyBmb3IgQVBTRCAmIEFkbWlzc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIkNvbnRyb2wgaXNuJ3QgbWFuZGF0b3J5IGZvciB0aGUgQUMiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgLy9yZXR1cm4gc3VjY2VzcyByaWdodCBhd2F5CisgICAgICAgICAgICBzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUDsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZighKHBJZXMtPldNTVBhcmFtcy5xb3NJbmZvICYgU01FX1FPU19BUF9TVVBQT1JUU19BUFNEKSAmJgorICAgICAgICAgICAgICAhKHBJZXMtPldNTUluZm9BcC51YXBzZCkpCisgICAgICB7CisgICAgICAgICAvLyBhcHBsaWNhdGlvbiBpcyBsb29raW5nIGZvciBBUFNEIGJ1dCBBUCBkb2Vzbid0IHN1cHBvcnQgaXQKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIEFQIGRvZXNuJ3Qgc3VwcG9ydCBBUFNEIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYocFNlc3Npb24tPmFwc2RNYXNrICYgKDEgPDwgKFNNRV9RT1NfRURDQV9BQ19WTyAtIGFjKSkpCisgICAgICB7CisgICAgICAgICAvLyBhcHBsaWNhdGlvbiBpcyBsb29raW5nIGZvciBBUFNECisgICAgICAgICAvLyBhbmQgaXQgaXMgYWxyZWFkeSBlbmFibGVkIG9uIHRoaXMgQUMKKyAgICAgICAgIHN0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWTsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogUmVxdWVzdCBpcyBsb29raW5nIGZvciBBUFNEIGFuZCBpdCBpcyBhbHJlYWR5ICIKKyAgICAgICAgICAgICAgICAgICAic2V0IGZvciB0aGUgQUMiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvLyBhcHBsaWNhdGlvbiBpcyBsb29raW5nIGZvciBBUFNECisgICAgICAgICAvLyBidXQgaXQgaXMgbm90IGVuYWJsZWQgb24gdGhpcyBBQworICAgICAgICAgLy8gc28gd2UgbmVlZCB0byByZWFzc29jaWF0ZQorICAgICAgICAgaWYocE1hYy0+cG1jLnVhcHNkRW5hYmxlZCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCByZWFzc29jIG5lZWRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgInRvIGVuYWJsZSBBUFNEIG9uIEFDICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMpOworICAgICAgICAgICAgLy9yZWFzc29jIGxvZ2ljCisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIFVBUFNEIG1hc2sgdG8gaW5jbHVkZSB0aGUgbmV3IAorICAgICAgICAgICAgLy8gQUMgb24gd2hpY2ggQVBTRCBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGNzckdldE1vZGlmeVByb2ZpbGVGaWVsZHMocE1hYywgc2Vzc2lvbklkLCAmbW9kaWZ5UHJvZmlsZUZpZWxkcyk7CisgICAgICAgICAgICBtb2RpZnlQcm9maWxlRmllbGRzLnVhcHNkX21hc2sgfD0gcFNlc3Npb24tPmFwc2RNYXNrOworICAgICAgICAgICAgbW9kaWZ5UHJvZmlsZUZpZWxkcy51YXBzZF9tYXNrIHw9IDEgPDwgKFNNRV9RT1NfRURDQV9BQ19WTyAtIGFjKTsKKyAgICAgICAgICAgIGhzdGF0dXMgPSBzbWVfUW9zUmVxdWVzdFJlYXNzb2MocE1hYywgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZ5UHJvZmlsZUZpZWxkcywgVk9TX0ZBTFNFKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoaHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBVbmFibGUgdG8gcmVxdWVzdCByZWFzc29jaWF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgcmVhc3NvY2lhdGlvbiB0byBlbmFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJBUFNEIG9uIEFDICVkIGlzIHBlbmRpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBhYyk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9SRVFfUEVORElOR19SU1A7CisgICAgICAgICAgICAgICBwQUNJbmZvLT5yZWFzc29jX3BlbmRpbmcgPSBWT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vZXJyIG1zZzogbm8gc3VwcG9ydCBmb3IgQVBTRCBmcm9tIFBNQworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IG5vIHN1cHBvcnQgZm9yIEFQU0Qgb3IgQk1QUyBmcm9tIFBNQyIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICB9CisgICAgICB9CisgICB9d2hpbGUoMCk7CisKKyAgIHZvc19tZW1fZnJlZShwSWVzKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisvKiBUaGlzIGlzIGEgZHVtbXkgZnVuY3Rpb24gbm93LiBCdXQgdGhlIHB1cnBvc2Ugb2YgbWUgYWRkaW5nIHRoaXMgd2FzIHRvIAorICogZGVsYXkgdGhlIFRTUEVDIHByb2Nlc3NpbmcgdGlsbCBTRVRfS0VZIGNvbXBsZXRlcy4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgCisgKiB1c2VkIHRvIGRvIGFueSBTTUVfUU9TIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIFNFVF9LRVkuIEFzIG9mIG5vdywgaXQgaXMgCisgKiBub3QgcmVxdWlyZWQgYXMgd2UgYXJlIG9rIHdpdGggdHNwZWMgZ2V0dGluZyBwcm9ncmFtbWVkIGJlZm9yZSBzZXRfa2V5IAorICogYXMgdGhlIHJvYW0gdGltaW5ncyBhcmUgbWVhc3VyZWQgd2l0aG91dCB0c3BlYyBpbiByZWFzc29jIQorICovCitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzU2V0S2V5U3VjY2Vzc0luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLCB2b2lkICogcEV2ZW50X2luZm8pCit7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgCisgICAgICAgICAgICAiIyMjIyMjIyMjIyMgQ0NYIFNldCBLZXkgQ29tcGxldGUgIyMjIyMjIyMjIyMjIyIpOworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zQ0NYU2F2ZVRzcGVjUmVzcG9uc2UoKSAtIFRoaXMgZnVuY3Rpb24gc2F2ZXMgdGhlIFRTUEVDCisgICAgICAgICBwYXJhbWV0ZXJzIHRoYXQgY2FtZSBhbG9uZyBpbiB0aGUgVFNQRUMgSUUgaW4gdGhlIHJlYXNzb2MgcmVzcG9uc2UKKyAgCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICBccGFyYW0gc2Vzc2lvbklkIC0gU01FIHNlc3Npb24gSUQgCisgIFxwYXJhbSBwVHNwZWMgLSBQb2ludGVyIHRvIHRoZSBUU1BFQyBJRSBmcm9tIHRoZSByZWFzc29jIHJzcAorICBccGFyYW0gYWMgLSBBY2Nlc3MgQ2F0ZWdvcnkgZm9yIHdoaWNoIHRoaXMgVFNQRUMgcnNwIGlzIHJlY2VpdmVkCisgIFxwYXJhbSB0c3BlY0luZGV4IC0gZmxvdy9kaXJlY3Rpb24KKyAgCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFJlbGVhc2UgaXMgc3VjY2Vzc2Z1bC4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zQ0NYU2F2ZVRzcGVjUmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCwgdERvdDExZklFV01NVFNQRUMgKnBUc3BlYywgdl9VOF90IGFjLCB2X1U4X3QgdHNwZWNJbmRleCkKK3sKKyAgICB0cFNpckFkZHRzUnNwIHBBZGR0c1JzcCA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXS5hY19pbmZvW2FjXS5hZGRUc1JzcFt0c3BlY0luZGV4XTsKKworICAgIGFjID0gc21lX1Fvc1VQdG9BQ01hcFtwVHNwZWMtPnVzZXJfcHJpb3JpdHldOworCisgICAgdm9zX21lbV96ZXJvKHBBZGR0c1JzcCwgc2l6ZW9mKHRTaXJBZGR0c1JzcCkpOworCisgICAgcEFkZHRzUnNwLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX0FERFRTX1JTUDsKKyAgICBwQWRkdHNSc3AtPmxlbmd0aCA9IHNpemVvZih0U2lyQWRkdHNSc3ApOworICAgIHBBZGR0c1JzcC0+cmMgPSBlU0lSX1NVQ0NFU1M7CisgICAgcEFkZHRzUnNwLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgcEFkZHRzUnNwLT5yc3AuZGlhbG9nVG9rZW4gPSAwOworICAgIHBBZGR0c1JzcC0+cnNwLnN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgICBwQWRkdHNSc3AtPnJzcC53bWVUc3BlY1ByZXNlbnQgPSBwVHNwZWMtPnByZXNlbnQ7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAiJXM6IENvcHkgVHNwZWMgdG8gbG9jYWwgZGF0YSBzdHJ1Y3R1cmUgYWM9JWQsIHRzcGVjSWR4PSVkIiwgCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFjLCB0c3BlY0luZGV4KTsKKworICAgIGlmIChwQWRkdHNSc3AtPnJzcC53bWVUc3BlY1ByZXNlbnQpCisgICAgeworICAgICAgICAvL0NvcHkgVFNQRUMgcGFyYW1zIHJlY2VpdmVkIGluIGFzc29jIHJlc3BvbnNlIHRvIGFkZHRzIHJlc3BvbnNlCisgICAgICAgIENvbnZlcnRXTU1UU1BFQyhwTWFjLCAmcEFkZHRzUnNwLT5yc3AudHNwZWMsIHBUc3BlYyk7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NDQ1hQcm9jZXNzUmVhc3NvY1RzcGVjUnNwKCkgLSBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUKKyAgICAgICAgIFdNTSBUU1BFQyBJRSBpbiB0aGUgcmVhc3NvYyByZXNwb25zZS4gUmVhc3NvYyB0cmlnZ2VyZWQgYXMgcGFydCBvZiAKKyAgICAgICAgIENDWCByb2FtaW5nIHRvIGFub3RoZXIgQ0NYIGNhcGFibGUgQVAuIElmIHRoZSBUU1BFQyB3YXMgYWRkZWQgYmVmb3JlIAorICAgICAgICAgcmVhc3NvYywgYXMgcGFydCBvZiBDYWxsIEFkbWlzc2lvbiBDb250cm9sLCB0aGUgcmVhc3NvIHJlcSBmcm9tIHRoZQorICAgICAgICAgU1RBIHdvdWxkIGNhcnJ5IHRoZSBUU1BFQyBwYXJhbWV0ZXJzIHdoaWNoIHdlcmUgYWxyZWFkeSBuZWdvdGlhdGVkCisgICAgICAgICB3aXRoIHRoZSBvbGRlciBBUC4KKyAgCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICBccGFyYW0gc2Vzc2lvbklkIC0gU01FIHNlc3Npb24gSUQgCisgIFxwYXJhbSBwRXZlbl9pbmZvIC0gUG9pbnRlciB0byB0aGUgc21lSm9pblJzcCBzdHJ1Y3R1cmUKKyAgCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFJlbGVhc2UgaXMgc3VjY2Vzc2Z1bC4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zQ0NYUHJvY2Vzc1JlYXNzb2NUc3BlY1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLCB2b2lkKiBwRXZlbnRfaW5mbykKK3sKKyAgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgIHNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisgICAgdERvdDExZklFV01NVFNQRUMgKnBUc3BlY0lFID0gTlVMTDsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBDc3JTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICB0Q3NyUm9hbUNvbm5lY3RlZEluZm8gKnBDc3JDb25uZWN0ZWRJbmZvID0gJnBDc3JTZXNzaW9uLT5jb25uZWN0ZWRJbmZvOworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB2X1U4X3QgYWMsIG51bVRzcGVjLCBjbnQ7CisgICAgdl9VOF90IHRzcGVjX2Zsb3dfaW5kZXgsIHRzcGVjX21hc2tfc3RhdHVzOworICAgIHZfVTMyX3QgdHNwZWNJZUxlbjsKKworICAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCisgICAgLy8gR2V0IHRoZSBUU1BFQyBJRXMgd2hpY2ggY2FtZSBhbG9uZyB3aXRoIHRoZSByZWFzc29jIHJlc3BvbnNlIAorICAgIC8vIGZyb20gdGhlIHBiRnJhbWVzIHBvaW50ZXIKKyAgICBwVHNwZWNJRSA9ICh0RG90MTFmSUVXTU1UU1BFQyAqKShwQ3NyQ29ubmVjdGVkSW5mby0+cGJGcmFtZXMgKyBwQ3NyQ29ubmVjdGVkSW5mby0+bkJlYWNvbkxlbmd0aCArCisgICAgICAgIHBDc3JDb25uZWN0ZWRJbmZvLT5uQXNzb2NSZXFMZW5ndGggKyBwQ3NyQ29ubmVjdGVkSW5mby0+bkFzc29jUnNwTGVuZ3RoICsgcENzckNvbm5lY3RlZEluZm8tPm5SSUNSc3BMZW5ndGgpOworCisgICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgdHNwZWNzIEllcyBpbiB0aGUgZnJhbWUsIHRoZSBtaW4gbGVuZ3RoCisgICAgLy8gc2hvdWxkIGJlIGF0bGVhc3QgZXF1YWwgdG8gdGhlIG9uZSBUU1BFQyBJRSAKKyAgICB0c3BlY0llTGVuID0gcENzckNvbm5lY3RlZEluZm8tPm5Uc3BlY0llTGVuZ3RoOworICAgIGlmICh0c3BlY0llTGVuIDwgc2l6ZW9mKHREb3QxMWZJRVdNTVRTUEVDKSkgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICBGTCgiQ0NYIFRzcGVjIElFIGxlbiAlZCBsZXNzIHRoYW4gbWluICVkIiksIAorICAgICAgICAgICAgICAgIHRzcGVjSWVMZW4sIHNpemVvZih0RG90MTFmSUVXTU1UU1BFQykpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICJUc3BlY0xlbiA9ICVkLCBwYkZyYW1lcyA9ICVwLCBwVHNwZWNJRSA9ICVwXG4iLCAKKyAgICAgICAgICAgICB0c3BlY0llTGVuLCBwQ3NyQ29ubmVjdGVkSW5mby0+cGJGcmFtZXMsIHBUc3BlY0lFKTsKKworICAgIG51bVRzcGVjID0gKHRzcGVjSWVMZW4pL3NpemVvZih0RG90MTFmSUVXTU1UU1BFQyk7CisgICAgZm9yKGNudD0wOyBjbnQ8bnVtVHNwZWM7IGNudCsrKSB7CisgICAgICAgIGFjID0gc21lX1Fvc1VwVG9BYyhwVHNwZWNJRS0+dXNlcl9wcmlvcml0eSk7CisgICAgICAgIHBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworICAgICAgICB0c3BlY19tYXNrX3N0YXR1cyA9IHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzOworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9XQVJOLCAKKyAgICAgICAgICAgICAgICBGTCgiVVA9JWQsIGFjPSVkLCB0c3BlY19tYXNrX3N0YXR1cz0leCIpLCAKKyAgICAgICAgICAgICAgICBwVHNwZWNJRS0+dXNlcl9wcmlvcml0eSwgYWMsICB0c3BlY19tYXNrX3N0YXR1cyApOworCisgICAgICAgICAgICBmb3IgKHRzcGVjX2Zsb3dfaW5kZXggPSAwOyB0c3BlY19mbG93X2luZGV4IDwgU01FX1FPU19UU1BFQ19JTkRFWF9NQVg7IHRzcGVjX2Zsb3dfaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGlmICh0c3BlY19tYXNrX3N0YXR1cyAmICgxIDw8IHRzcGVjX2Zsb3dfaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgCisgICAgICAgICAgICAgICAgRkwoIkZvdW5kIFRzcGVjIGVudHJ5IGZsb3cgPSAlZCBBQyA9ICVkIiksdHNwZWNfZmxvd19pbmRleCwgYWMpOworICAgICAgICAgICAgICAgICAgICBzbWVfUW9zQ0NYU2F2ZVRzcGVjUmVzcG9uc2UocE1hYywgc2Vzc2lvbklkLCBwVHNwZWNJRSwgYWMsIHRzcGVjX2Zsb3dfaW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgCisgICAgICAgICAgICAgICAgRkwoIk5vdCBmb3VuZCBUc3BlYyBlbnRyeSBmbG93ID0gJWQgQUMgPSAlZCIpLHRzcGVjX2Zsb3dfaW5kZXgsIGFjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIC8vIEluY3JlbWVudCB0aGUgcG9pbnRlciB0byBwb2ludCBpdCB0byB0aGUgbmV4dCBUU1BFQyBJRQorICAgICAgICBwVHNwZWNJRSsrOworICAgIH0KKworICAgIC8qIFNlbmQgdGhlIEFnZ3JlZ2F0ZWQgUW9TIHJlcXVlc3QgdG8gSEFMICovCisgICAgc3RhdHVzID0gc21lX1Fvc0ZUQWdnclFvc1JlcShwTWFjLHNlc3Npb25JZCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zQ29weVRzcGVjSW5mbygpIC0gVGhpcyBmdW5jdGlvbiBjb3BpZXMgdGhlIGV4aXN0aW5nIFRTUEVDIAorICAgICAgICAgcGFyYW1ldGVycyBmcm9tIHRoZSBzb3VyY2Ugc3RydWN0dXJlIHRvIHRoZSBkZXN0aW5hdGlvbiBzdHJ1Y3R1cmUuCisgIAorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHBhcmFtIHBUc3BlY19JbmZvIC0gc291cmNlIHN0cnVjdHVyZQorICBccGFyYW0gcFRzcGVjIC0gZGVzdGluYXRpb24gc3RydWN0dXJlCisgIAorICBccmV0dXJuIHZvaWQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHNtZV9Rb3NDb3B5VHNwZWNJbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBUc3BlY19JbmZvLCB0U2lyTWFjVHNwZWNJRSogcFRzcGVjKQoreworICAgIC8qIEFzIHBlciBXTU1fQUNfdGVzdHBsYW5fdjAuMzkgTWluaW11bSBTZXJ2aWNlIEludGVydmFsLCBNYXhpbXVtIFNlcnZpY2UKKyAgICAgKiBJbnRlcnZhbCwgU2VydmljZSBTdGFydCBUaW1lLCBTdXNwZW5zaW9uIEludGVydmFsIGFuZCBEZWxheSBCb3VuZCBhcmUKKyAgICAgKiBhbGwgaW50ZW5kZWQgZm9yIEhDQ0Egb3BlcmF0aW9uIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBzZXQgdG8gemVybyovCisgICAgcFRzcGVjLT5kZWxheUJvdW5kICAgICAgICA9IHBUc3BlY19JbmZvLT5kZWxheV9ib3VuZDsKKyAgICBwVHNwZWMtPmluYWN0SW50ZXJ2YWwgICAgID0gcFRzcGVjX0luZm8tPmluYWN0aXZpdHlfaW50ZXJ2YWw7CisgICAgcFRzcGVjLT5sZW5ndGggICAgICAgICAgICA9IFNNRV9RT1NfVFNQRUNfSUVfTEVOR1RIOworICAgIHBUc3BlYy0+bWF4QnVyc3RTeiAgICAgICAgPSBwVHNwZWNfSW5mby0+bWF4X2J1cnN0X3NpemU7CisgICAgcFRzcGVjLT5tYXhNc2R1U3ogICAgICAgICA9IHBUc3BlY19JbmZvLT5tYXhpbXVtX21zZHVfc2l6ZTsKKyAgICBwVHNwZWMtPm1heFN2Y0ludGVydmFsICAgID0gcFRzcGVjX0luZm8tPm1heF9zZXJ2aWNlX2ludGVydmFsOworICAgIHBUc3BlYy0+bWVhbkRhdGFSYXRlICAgICAgPSBwVHNwZWNfSW5mby0+bWVhbl9kYXRhX3JhdGU7CisgICAgcFRzcGVjLT5tZWRpdW1UaW1lICAgICAgICA9IHBUc3BlY19JbmZvLT5tZWRpdW1fdGltZTsKKyAgICBwVHNwZWMtPm1pbkRhdGFSYXRlICAgICAgID0gcFRzcGVjX0luZm8tPm1pbl9kYXRhX3JhdGU7CisgICAgcFRzcGVjLT5taW5QaHlSYXRlICAgICAgICA9IHBUc3BlY19JbmZvLT5taW5fcGh5X3JhdGU7CisgICAgcFRzcGVjLT5taW5TdmNJbnRlcnZhbCAgICA9IHBUc3BlY19JbmZvLT5taW5fc2VydmljZV9pbnRlcnZhbDsKKyAgICBwVHNwZWMtPm5vbU1zZHVTeiAgICAgICAgID0gcFRzcGVjX0luZm8tPm5vbWluYWxfbXNkdV9zaXplOworICAgIHBUc3BlYy0+cGVha0RhdGFSYXRlICAgICAgPSBwVHNwZWNfSW5mby0+cGVha19kYXRhX3JhdGU7CisgICAgcFRzcGVjLT5zdXJwbHVzQncgICAgICAgICA9IHBUc3BlY19JbmZvLT5zdXJwbHVzX2J3X2FsbG93YW5jZTsKKyAgICBwVHNwZWMtPnN1c3BlbmRJbnRlcnZhbCAgID0gcFRzcGVjX0luZm8tPnN1c3BlbnNpb25faW50ZXJ2YWw7CisgICAgcFRzcGVjLT5zdmNTdGFydFRpbWUgICAgICA9IHBUc3BlY19JbmZvLT5zdmNfc3RhcnRfdGltZTsKKyAgICBwVHNwZWMtPnRzaW5mby50cmFmZmljLmRpcmVjdGlvbiA9IHBUc3BlY19JbmZvLT50c19pbmZvLmRpcmVjdGlvbjsKKworICAgIC8vTWFrZSBzdXJlIFVBUFNEIGlzIGFsbG93ZWQuIEJUQyBtYXkgd2FudCB0byBkaXNhYmxlIFVBUFNEIHdoaWxlIGtlZXAgUW9TIHNldHVwCisgICAgaWYgKHBUc3BlY19JbmZvLT50c19pbmZvLnBzYiAmJiBidGNJc1JlYWR5Rm9yVWFwc2QocE1hYykpIHsKKyAgICAgICAgcFRzcGVjLT50c2luZm8udHJhZmZpYy5wc2IgPSBwVHNwZWNfSW5mby0+dHNfaW5mby5wc2I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFRzcGVjLT50c2luZm8udHJhZmZpYy5wc2IgPSAwOworICAgICAgICBwVHNwZWNfSW5mby0+dHNfaW5mby5wc2IgPSAwOworICAgIH0KKyAgICBwVHNwZWMtPnRzaW5mby50cmFmZmljLnRzaWQgICAgICAgICAgID0gcFRzcGVjX0luZm8tPnRzX2luZm8udGlkOworICAgIHBUc3BlYy0+dHNpbmZvLnRyYWZmaWMudXNlclByaW8gICAgICAgPSBwVHNwZWNfSW5mby0+dHNfaW5mby51cDsKKyAgICBwVHNwZWMtPnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSAgID0gU01FX1FPU19BQ0NFU1NfUE9MSUNZX0VEQ0E7CisgICAgcFRzcGVjLT50c2luZm8udHJhZmZpYy5idXJzdFNpemVEZWZuICA9IHBUc3BlY19JbmZvLT50c19pbmZvLmJ1cnN0X3NpemVfZGVmbjsKKyAgICBwVHNwZWMtPnRzaW5mby50cmFmZmljLmFja1BvbGljeSAgICAgID0gcFRzcGVjX0luZm8tPnRzX2luZm8uYWNrX3BvbGljeTsKKyAgICBwVHNwZWMtPnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgID0gU01FX1FPU19UU1BFQ19JRV9UWVBFOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIiVzOiAlZDogdXAgPSAlZCwgdGlkID0gJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgIHBUc3BlY19JbmZvLT50c19pbmZvLnVwLAorICAgICAgICAgICAgcFRzcGVjX0luZm8tPnRzX2luZm8udGlkKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc0NDeFJldHJpZXZlVHNwZWNJbmZvKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBDU1IKKyAgICAgICAgIHdoZW4gdHJ5IHRvIGNyZWF0ZSByZWFzc29jIHJlcXVlc3QgbWVzc2FnZSB0byBQRSAtIGNzclNlbmRTbWVSZWFzc29jUmVxTXNnCisgICAgICAgICBUaGlzIGZ1bmN0aW9ucyBnZXQgdGhlIGV4aXN0aW5nIHRzcGVjIHBhcmFtZXRlcnMgdG8gYmUgaW5jbHVkZWQKKyAgICAgICAgIGluIHRoZSByZWFzc29jIHJlcXVlc3QuCisgIAorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHBhcmFtIHNlc3Npb25JZCAtIFNNRSBzZXNzaW9uIElEIAorICBccGFyYW0gcFRzcGVjSW5mbyAtIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB0byBjYXJyeSBiYWNrIHRoZSBUU1BFQyBwYXJhbWV0ZXJzCisgIAorICBccmV0dXJuIHZfVThfdCAtIG51bWJlciBvZiBleGlzdGluZyBuZWdvdGlhdGVkIFRTUEVDcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1U4X3Qgc21lX1Fvc0NDeFJldHJpZXZlVHNwZWNJbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHRUc3BlY0luZm8gKnBUc3BlY0luZm8pCit7CisgICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgIHZfVThfdCB0c3BlY19tYXNrX3N0YXR1cyA9IDA7CisgICAgdl9VOF90IHRzcGVjX3BlbmRpbmdfc3RhdHVzID0gMDsKKyAgICB2X1U4X3QgYWMsIG51bVRzcGVjcyA9IDA7CisgICAgdFRzcGVjSW5mbyAqcERzdFRzcGVjID0gcFRzcGVjSW5mbzsKKworICAgIC8vVE9ETzogQ2hlY2sgaWYgVFNQRUMgaGFzIGFscmVhZHkgYmVlbiBlc3RhYmxpc2hlZCwgaWYgbm90IHJldHVybgorCisgICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07ICAgIAorCisgICAgZm9yKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspIHsKKyAgICAgICAgdm9sYXRpbGUgdl9VOF90IHRzcGVjX2luZGV4ID0gMDsKKworICAgICAgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKyAgICAgICAgdHNwZWNfcGVuZGluZ19zdGF0dXMgPSBwQUNJbmZvLT50c3BlY19wZW5kaW5nOworICAgICAgICB0c3BlY19tYXNrX3N0YXR1cyA9IHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmICh0c3BlY19tYXNrX3N0YXR1cyAmIFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV9TRVQpIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBhIHRzcGVjIHN0YXR1cyBpcyBwZW5kaW5nLCB0YWtlIHJlcXVlc3RlZF9Rb1NJbmZvIGZvciBSSUMgcmVxdWVzdCwgZWxzZSB1c2UgY3Vycl9Rb1NJbmZvCisgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBSSUMgcmVxdWVzdCAqLworICAgICAgICAgICAgICAgIGlmICh0c3BlY19wZW5kaW5nX3N0YXR1cyAmIFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV9TRVQpIHsKKyAgICAgICAgICAgICAgICAgICAgc21lX1Fvc0NvcHlUc3BlY0luZm8ocE1hYywgJnBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RzcGVjX2luZGV4XSwgJnBEc3RUc3BlYy0+dHNwZWMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NDb3B5VHNwZWNJbmZvKHBNYWMsICZwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfaW5kZXhdLCAmcERzdFRzcGVjLT50c3BlYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBEc3RUc3BlYy0+dmFsaWQgPSBUUlVFOworICAgICAgICAgICAgICAgIG51bVRzcGVjcysrOworICAgICAgICAgICAgICAgIHBEc3RUc3BlYysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHNwZWNfbWFza19zdGF0dXMgPj49IDE7CisgICAgICAgICAgICB0c3BlY19wZW5kaW5nX3N0YXR1cyA+Pj0gMTsKKyAgICAgICAgICAgIHRzcGVjX2luZGV4Kys7CisgICAgICAgIH0gd2hpbGUgKHRzcGVjX21hc2tfc3RhdHVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVtVHNwZWNzOworfQorCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisKK2VIYWxTdGF0dXMgc21lX1Fvc0NyZWF0ZVRzcGVjUklDSUUodHBBbmlTaXJHbG9iYWwgcE1hYywgc21lX1Fvc1dtbVRzcGVjSW5mbyAqcFRzcGVjX0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwUklDQnVmZmVyLCB2X1UzMl90ICpwUklDTGVuZ3RoLCB2X1U4X3QgKnBSSUNJZGVudGlmaWVyKQoreworICAgIHREb3QxMWZJRVJJQ0RhdGFEZXNjICAgIHJpY0lFOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIG5TdGF0dXM7CisKKyAgICBWT1NfQVNTRVJUKE5VTEwgIT0gcFJJQ0J1ZmZlcik7CisgICAgVk9TX0FTU0VSVChOVUxMICE9IHBSSUNMZW5ndGgpOworICAgIFZPU19BU1NFUlQoTlVMTCAhPSBwUklDSWRlbnRpZmllcik7CisKKyAgICB2b3NfbWVtX3plcm8oJnJpY0lFLCBzaXplb2YodERvdDExZklFUklDRGF0YURlc2MpKTsKKworICAgIHJpY0lFLnByZXNlbnQgPSAxOworICAgIHJpY0lFLlJJQ0RhdGEucHJlc2VudCA9IDE7CisgICAgcmljSUUuUklDRGF0YS5yZXNvdXJjZURlc2NDb3VudCA9IDE7CisgICAgcmljSUUuUklDRGF0YS5zdGF0dXNDb2RlID0gMDsKKyAgICByaWNJRS5SSUNEYXRhLklkZW50aWZpZXIgPSBzbWVfUW9zQXNzaWduRGlhbG9nVG9rZW4oKTsKKyNpZm5kZWYgVVNFXzgwMjExX1dNTVRTUEVDX0ZPUl9SSUMKKyAgICByaWNJRS5UU1BFQy5wcmVzZW50ID0gMTsKKyAgICByaWNJRS5UU1BFQy5kZWxheV9ib3VuZCA9IHBUc3BlY19JbmZvLT5kZWxheV9ib3VuZDsKKyAgICByaWNJRS5UU1BFQy5pbmFjdGl2aXR5X2ludCA9IHBUc3BlY19JbmZvLT5pbmFjdGl2aXR5X2ludGVydmFsOworICAgIHJpY0lFLlRTUEVDLmJ1cnN0X3NpemUgPSBwVHNwZWNfSW5mby0+bWF4X2J1cnN0X3NpemU7CisgICAgcmljSUUuVFNQRUMubWF4X21zZHVfc2l6ZSA9IHBUc3BlY19JbmZvLT5tYXhpbXVtX21zZHVfc2l6ZTsKKyAgICByaWNJRS5UU1BFQy5tYXhfc2VydmljZV9pbnQgPSBwVHNwZWNfSW5mby0+bWF4X3NlcnZpY2VfaW50ZXJ2YWw7CisgICAgcmljSUUuVFNQRUMubWVhbl9kYXRhX3JhdGUgPSBwVHNwZWNfSW5mby0+bWVhbl9kYXRhX3JhdGU7CisgICAgcmljSUUuVFNQRUMubWVkaXVtX3RpbWUgPSBwVHNwZWNfSW5mby0+bWVkaXVtX3RpbWU7CisgICAgcmljSUUuVFNQRUMubWluX2RhdGFfcmF0ZSA9IHBUc3BlY19JbmZvLT5taW5fZGF0YV9yYXRlOworICAgIHJpY0lFLlRTUEVDLm1pbl9waHlfcmF0ZSA9IHBUc3BlY19JbmZvLT5taW5fcGh5X3JhdGU7CisgICAgcmljSUUuVFNQRUMubWluX3NlcnZpY2VfaW50ID0gcFRzcGVjX0luZm8tPm1pbl9zZXJ2aWNlX2ludGVydmFsOworICAgIHJpY0lFLlRTUEVDLnNpemUgPSBwVHNwZWNfSW5mby0+bm9taW5hbF9tc2R1X3NpemU7CisgICAgcmljSUUuVFNQRUMucGVha19kYXRhX3JhdGUgPSBwVHNwZWNfSW5mby0+cGVha19kYXRhX3JhdGU7CisgICAgcmljSUUuVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UgPSBwVHNwZWNfSW5mby0+c3VycGx1c19id19hbGxvd2FuY2U7CisgICAgcmljSUUuVFNQRUMuc3VzcGVuc2lvbl9pbnQgPSBwVHNwZWNfSW5mby0+c3VzcGVuc2lvbl9pbnRlcnZhbDsKKyAgICByaWNJRS5UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUgPSBwVHNwZWNfSW5mby0+c3ZjX3N0YXJ0X3RpbWU7CisgICAgcmljSUUuVFNQRUMuZGlyZWN0aW9uID0gcFRzcGVjX0luZm8tPnRzX2luZm8uZGlyZWN0aW9uOworICAgIC8vTWFrZSBzdXJlIFVBUFNEIGlzIGFsbG93ZWQuIEJUQyBtYXkgd2FudCB0byBkaXNhYmxlIFVBUFNEIHdoaWxlIGtlZXAgUW9TIHNldHVwCisgICAgaWYoIHBUc3BlY19JbmZvLT50c19pbmZvLnBzYiAmJiBidGNJc1JlYWR5Rm9yVWFwc2QocE1hYykgKQorICAgIHsKKyAgICAgICByaWNJRS5UU1BFQy5wc2IgPSBwVHNwZWNfSW5mby0+dHNfaW5mby5wc2I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmljSUUuVFNQRUMucHNiID0gMDsKKyAgICB9CisgICAgcmljSUUuVFNQRUMudHNpZCA9IHBUc3BlY19JbmZvLT50c19pbmZvLnRpZDsKKyAgICByaWNJRS5UU1BFQy51c2VyX3ByaW9yaXR5ID0gcFRzcGVjX0luZm8tPnRzX2luZm8udXA7CisgICAgcmljSUUuVFNQRUMuYWNjZXNzX3BvbGljeSA9IFNNRV9RT1NfQUNDRVNTX1BPTElDWV9FRENBOworCisgICAgKnBSSUNJZGVudGlmaWVyID0gcmljSUUuUklDRGF0YS5JZGVudGlmaWVyOworICAgIAorICAgIG5TdGF0dXMgPSBkb3QxMWZQYWNrSWVSSUNEYXRhRGVzYyhwTWFjLCAmcmljSUUsIHBSSUNCdWZmZXIsIHNpemVvZihyaWNJRSksIHBSSUNMZW5ndGgpOworICAgIGlmIChET1QxMUZfRkFJTEVEKG5TdGF0dXMpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgIEZMKCJQYWNraW5nIG9mIFJJQyBEYXRhIG9mIGxlbmd0aCAlZCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBSSUNMZW5ndGgsIG5TdGF0dXMpOworICAgIH0KKyNlbHNlIC8vIFdNTSBUU1BFQworICAgIC8qQXMgcGVyIFdNTV9BQ190ZXN0cGxhbl92MC4zOSBNaW5pbXVtIFNlcnZpY2UgSW50ZXJ2YWwsIE1heGltdW0gU2VydmljZSAKKyAgICAgIEludGVydmFsLCBTZXJ2aWNlIFN0YXJ0IFRpbWUsIFN1c3BlbnNpb24gSW50ZXJ2YWwgYW5kIERlbGF5IEJvdW5kIGFyZSAKKyAgICAgIGFsbCBpbnRlbmRlZCBmb3IgSENDQSBvcGVyYXRpb24gYW5kIHRoZXJlZm9yZSBtdXN0IGJlIHNldCB0byB6ZXJvKi8KKyAgICByaWNJRS5XTU1UU1BFQy5wcmVzZW50ID0gMTsKKyAgICByaWNJRS5XTU1UU1BFQy52ZXJzaW9uID0gMTsKKyAgICByaWNJRS5XTU1UU1BFQy5kZWxheV9ib3VuZCA9IHBUc3BlY19JbmZvLT5kZWxheV9ib3VuZDsKKyAgICByaWNJRS5XTU1UU1BFQy5pbmFjdGl2aXR5X2ludCA9IHBUc3BlY19JbmZvLT5pbmFjdGl2aXR5X2ludGVydmFsOworICAgIHJpY0lFLldNTVRTUEVDLmJ1cnN0X3NpemUgPSBwVHNwZWNfSW5mby0+bWF4X2J1cnN0X3NpemU7CisgICAgcmljSUUuV01NVFNQRUMubWF4X21zZHVfc2l6ZSA9IHBUc3BlY19JbmZvLT5tYXhpbXVtX21zZHVfc2l6ZTsKKyAgICByaWNJRS5XTU1UU1BFQy5tYXhfc2VydmljZV9pbnQgPSBwVHNwZWNfSW5mby0+bWF4X3NlcnZpY2VfaW50ZXJ2YWw7CisgICAgcmljSUUuV01NVFNQRUMubWVhbl9kYXRhX3JhdGUgPSBwVHNwZWNfSW5mby0+bWVhbl9kYXRhX3JhdGU7CisgICAgcmljSUUuV01NVFNQRUMubWVkaXVtX3RpbWUgPSBwVHNwZWNfSW5mby0+bWVkaXVtX3RpbWU7CisgICAgcmljSUUuV01NVFNQRUMubWluX2RhdGFfcmF0ZSA9IHBUc3BlY19JbmZvLT5taW5fZGF0YV9yYXRlOworICAgIHJpY0lFLldNTVRTUEVDLm1pbl9waHlfcmF0ZSA9IHBUc3BlY19JbmZvLT5taW5fcGh5X3JhdGU7CisgICAgcmljSUUuV01NVFNQRUMubWluX3NlcnZpY2VfaW50ID0gcFRzcGVjX0luZm8tPm1pbl9zZXJ2aWNlX2ludGVydmFsOworICAgIHJpY0lFLldNTVRTUEVDLnNpemUgPSBwVHNwZWNfSW5mby0+bm9taW5hbF9tc2R1X3NpemU7CisgICAgcmljSUUuV01NVFNQRUMucGVha19kYXRhX3JhdGUgPSBwVHNwZWNfSW5mby0+cGVha19kYXRhX3JhdGU7CisgICAgcmljSUUuV01NVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UgPSBwVHNwZWNfSW5mby0+c3VycGx1c19id19hbGxvd2FuY2U7CisgICAgcmljSUUuV01NVFNQRUMuc3VzcGVuc2lvbl9pbnQgPSBwVHNwZWNfSW5mby0+c3VzcGVuc2lvbl9pbnRlcnZhbDsKKyAgICByaWNJRS5XTU1UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUgPSBwVHNwZWNfSW5mby0+c3ZjX3N0YXJ0X3RpbWU7CisgICAgcmljSUUuV01NVFNQRUMuZGlyZWN0aW9uID0gcFRzcGVjX0luZm8tPnRzX2luZm8uZGlyZWN0aW9uOworICAgIC8vTWFrZSBzdXJlIFVBUFNEIGlzIGFsbG93ZWQuIEJUQyBtYXkgd2FudCB0byBkaXNhYmxlIFVBUFNEIHdoaWxlIGtlZXAgUW9TIHNldHVwCisgICAgaWYoIHBUc3BlY19JbmZvLT50c19pbmZvLnBzYiAmJiBidGNJc1JlYWR5Rm9yVWFwc2QocE1hYykgKQorICAgIHsKKyAgICAgICByaWNJRS5XTU1UU1BFQy5wc2IgPSBwVHNwZWNfSW5mby0+dHNfaW5mby5wc2I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmljSUUuV01NVFNQRUMucHNiID0gMDsKKyAgICB9CisgICAgcmljSUUuV01NVFNQRUMudHNpZCA9IHBUc3BlY19JbmZvLT50c19pbmZvLnRpZDsKKyAgICByaWNJRS5XTU1UU1BFQy51c2VyX3ByaW9yaXR5ID0gcFRzcGVjX0luZm8tPnRzX2luZm8udXA7CisgICAgcmljSUUuV01NVFNQRUMuYWNjZXNzX3BvbGljeSA9IFNNRV9RT1NfQUNDRVNTX1BPTElDWV9FRENBOworCisgICAgCisgICAgblN0YXR1cyA9IGRvdDExZlBhY2tJZVJJQ0RhdGFEZXNjKHBNYWMsICZyaWNJRSwgcFJJQ0J1ZmZlciwgc2l6ZW9mKHJpY0lFKSwgcFJJQ0xlbmd0aCk7CisgICAgaWYgKERPVDExRl9GQUlMRUQoblN0YXR1cykpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgRkwoIlBhY2tpbmcgb2YgUklDIERhdGEgb2YgbGVuZ3RoICVkIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFJJQ0xlbmd0aCwgblN0YXR1cyk7CisgICAgfQorI2VuZGlmIC8qIDgwMjExX1RTUEVDICovCisgICAgKnBSSUNJZGVudGlmaWVyID0gcmljSUUuUklDRGF0YS5JZGVudGlmaWVyOworICAgIHJldHVybiBuU3RhdHVzOworfQorCitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzRlRSZWFzc29jUmVxRXYodHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCwgdm9pZCAqIHBFdmVudF9pbmZvKQoreworICAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgICB2X1U4X3QgYWMsIHFvc19yZXF1ZXN0ZWQgPSBGQUxTRTsKKyAgICB2X1U4X3QgdHNwZWNfZmxvd19pbmRleDsKKyAgICBzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeT0gTlVMTDsKKworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgIEZMKCJJbnZva2VkIG9uIHNlc3Npb24gJWQiKSwgc2Vzc2lvbklkKTsKKworICAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCisgICAgZm9yKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspCisgICAgeworICAgICAgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKyAgICAgICAgcW9zX3JlcXVlc3RlZCA9IEZBTFNFOworCisgICAgICAgIGZvciAodHNwZWNfZmxvd19pbmRleCA9IDA7IHRzcGVjX2Zsb3dfaW5kZXggPCBTTUVfUU9TX1RTUEVDX0lOREVYX01BWDsgdHNwZWNfZmxvd19pbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBPbmx5IGluIHRoZSBiZWxvdyBjYXNlLCBjb3B5IHRoZSBBQydzIGN1cnIgUW9TIEluZm8gdG8gcmVxdWVzdGVkIFFvUyBpbmZvICovCisgICAgICAgICAgICBpZiAoKHBBQ0luZm8tPnJpY0lkZW50aWZpZXJbdHNwZWNfZmxvd19pbmRleF0gJiYgIXBBQ0luZm8tPnRzcGVjX3BlbmRpbmcpIHx8CisgICAgICAgICAgICAgICAgICAgIChwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyAmICgxPDx0c3BlY19mbG93X2luZGV4KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgICAgICAgICBGTCgiQ29weWluZyB0aGUgY3VycmVudFFvcyB0byByZXF1ZXN0ZWRRb3MgZm9yIEFDPSVkLCBmbG93PSVkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjLCB0c3BlY19mbG93X2luZGV4ICk7CisKKyAgICAgICAgICAgICAgICBwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1t0c3BlY19mbG93X2luZGV4XSA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19mbG93X2luZGV4XTsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8oJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19mbG93X2luZGV4XSwgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKyAgICAgICAgICAgICAgICBxb3NfcmVxdWVzdGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE9ubHkgaWYgdGhlIHRzcGVjIGlzIHJlcXVpcmVkLCB0cmFuc2l0aW9uIHRoZSBzdGF0ZSB0byAKKyAgICAgICAgLy8gU01FX1FPU19SRVFVRVNURUQgZm9yIHRoaXMgQUMKKyAgICAgICAgaWYgKHFvc19yZXF1ZXN0ZWQpIAorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2gocEFDSW5mby0+Y3Vycl9zdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNNRV9RT1NfSEFORE9GRjoKKyAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1N0YXRlVHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLCBTTUVfUU9TX1JFUVVFU1RFRCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiRlQgUmVhc3NvYyByZXEgZXZlbnQgaW4gdW5leHBlY3RlZCBzdGF0ZSAlZCIpLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyogQXQgdGhpcyBwb2ludCBvZiB0aW1lLCB3ZSBhcmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIG9sZCBBUCwgc28gaXQgaXMgc2FmZQorICAgICAqICAgICAgICAgICAgIHRvIHJlc2V0IGFsbCB0aGVzZSBzZXNzaW9uIHZhcmlhYmxlcyAqLworICAgIHBTZXNzaW9uLT5hcHNkTWFzayA9IDA7CisgICAgcFNlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCA9IDA7CisgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gMDsKKworICAgIC8qIE5vdyBjaGFuZ2UgcmVhc29uIGFuZCBITyByZW5ld2FsIG9mIGFsbCB0aGUgZmxvdyBpbiB0aGlzIHNlc3Npb24gb25seSAqLworICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZzbWVfUW9zQ2IuZmxvd19saXN0LCBWT1NfRkFMU0UgKTsKKyAgICBpZighcEVudHJ5KQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBGbG93IExpc3QgZW1wdHksIG5vdGhpbmcgdG8gdXBkYXRlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIGZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgc21lX1Fvc0Zsb3dJbmZvRW50cnksIGxpbmsgKTsKKyAgICAgICAgaWYoc2Vzc2lvbklkID09IGZsb3dfaW5mby0+c2Vzc2lvbklkKQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IENoYW5naW5nIEZsb3dJRCAlZCByZWFzb24gdG8gU0VUVVAgYW5kIEhPIHJlbmV3YWwgdG8gRkFMU0UiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICAgICAgICAgICBmbG93X2luZm8tPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1NFVFVQOworICAgICAgICAgICAgZmxvd19pbmZvLT5ob1JlbmV3YWwgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBwRW50cnkgPSBjc3JMTE5leHQoICZzbWVfUW9zQ2IuZmxvd19saXN0LCBwRW50cnksIFZPU19GQUxTRSApOworICAgIH0gd2hpbGUoIHBFbnRyeSApOworCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworZUhhbFN0YXR1cyBzbWVfUW9zRlRBZ2dyUW9zUmVxKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkICkKK3sKKyAgICB0U2lyQWdnclFvc1JlcSAqcE1zZyA9IE5VTEw7CisgICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgaW50IGksIGogPSAwOworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICBzZXNzaW9uSWQpOworCisgICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisKKyAgICBwTXNnID0gKHRTaXJBZ2dyUW9zUmVxICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJBZ2dyUW9zUmVxKSk7CisKKyAgICBpZiAoIXBNc2cpCisgICAgeworICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiAlZDogY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbXNnIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICB9CisKKyAgICB2b3NfbWVtX3plcm8ocE1zZywgc2l6ZW9mKHRTaXJBZ2dyUW9zUmVxKSk7CisKKyAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodl9VMTZfdCllV05JX1NNRV9GVF9BR0dSX1FPU19SRVEpOworICAgIHBNc2ctPmxlbmd0aCA9IHNpemVvZih0U2lyQWdnclFvc1JlcSk7CisgICAgcE1zZy0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIHBNc2ctPnRpbWVvdXQgPSAwOworICAgIHBNc2ctPnJzcFJlcWQgPSBWT1NfVFJVRTsKKyAgICB2b3NfbWVtX2NvcHkoICZwTXNnLT5ic3NJZFsgMCBdLAorICAgICAgICAgICAgJnBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MtPmJzc0lkWyAwIF0sCisgICAgICAgICAgICBzaXplb2YodENzckJzc2lkKSApOworCisgICAgZm9yKCBpID0gMDsgaSA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgU01FX1FPU19UU1BFQ19JTkRFWF9NQVg7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIEZMKCJhYz0lZCwgdHNwZWNfbWFza19zdGF1cz0leCwgdHNwZWNfaW5kZXg9JWRcbiIpLCAKKyAgICAgICAgICAgICAgICAgICAgaSwgcFNlc3Npb24tPmFjX2luZm9baV0udHNwZWNfbWFza19zdGF0dXMsIGopOworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgICAgIEZMKCJkaXJlY3Rpb24gPSAlZFxuIiksIHBTZXNzaW9uLT5hY19pbmZvW2ldLmFkZFRzUnNwW2pdLnJzcC50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24pOworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYW55IGZsb3cgaXMgYWN0aXZlIG9uIHRoaXMgQUMKKyAgICAgICAgICAgIGlmICgocFNlc3Npb24tPmFjX2luZm9baV0udHNwZWNfbWFza19zdGF0dXMpICYgKDEgPDwgaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdEFOSV9VOCBkaXJlY3Rpb24gPSBwU2Vzc2lvbi0+YWNfaW5mb1tpXS5hZGRUc1JzcFtqXS5yc3AudHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uOworICAgICAgICAgICAgICAgIGlmICgoZGlyZWN0aW9uID09IFNNRV9RT1NfV01NX1RTX0RJUl9VUExJTkspIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09IFNNRV9RT1NfV01NX1RTX0RJUl9CT1RIKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJGb3VuZCB0c3BlYyBlbnRyeSBBQz0lZCwgZmxvdz0lZCwgZGlyZWN0aW9uID0gJWRcbiIpLCBpLCBqLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBwTXNnLT5hZ2dySW5mby5hZ2dyQWRkVHNJbmZvW2ldLmRpYWxvZ1Rva2VuID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NBc3NpZ25EaWFsb2dUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBwTXNnLT5hZ2dySW5mby5hZ2dyQWRkVHNJbmZvW2ldLmxsZVRzcGVjUHJlc2VudCA9CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+YWNfaW5mb1tpXS5hZGRUc1JzcFtqXS5yc3AubGxlVHNwZWNQcmVzZW50OworICAgICAgICAgICAgICAgICAgICBwTXNnLT5hZ2dySW5mby5hZ2dyQWRkVHNJbmZvW2ldLm51bVRjbGFzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5hY19pbmZvW2ldLmFkZFRzUnNwW2pdLnJzcC5udW1UY2xhczsKKyAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KCBwTXNnLT5hZ2dySW5mby5hZ2dyQWRkVHNJbmZvW2ldLnRjbGFzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+YWNfaW5mb1tpXS5hZGRUc1JzcFtqXS5yc3AudGNsYXNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfVENMQVNJRV9NQVhOVU0gKTsKKyAgICAgICAgICAgICAgICAgICAgcE1zZy0+YWdnckluZm8uYWdnckFkZFRzSW5mb1tpXS50Y2xhc1Byb2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmFjX2luZm9baV0uYWRkVHNSc3Bbal0ucnNwLnRjbGFzUHJvYzsKKyAgICAgICAgICAgICAgICAgICAgcE1zZy0+YWdnckluZm8uYWdnckFkZFRzSW5mb1tpXS50Y2xhc1Byb2NQcmVzZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5hY19pbmZvW2ldLmFkZFRzUnNwW2pdLnJzcC50Y2xhc1Byb2NQcmVzZW50OworICAgICAgICAgICAgICAgICAgICBwTXNnLT5hZ2dySW5mby5hZ2dyQWRkVHNJbmZvW2ldLnRzcGVjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5hY19pbmZvW2ldLmFkZFRzUnNwW2pdLnJzcC50c3BlYzsKKyAgICAgICAgICAgICAgICAgICAgcE1zZy0+YWdnckluZm8uYWdnckFkZFRzSW5mb1tpXS53bWVUc3BlY1ByZXNlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmFjX2luZm9baV0uYWRkVHNSc3Bbal0ucnNwLndtZVRzcGVjUHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgcE1zZy0+YWdnckluZm8uYWdnckFkZFRzSW5mb1tpXS53c21Uc3BlY1ByZXNlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmFjX2luZm9baV0uYWRkVHNSc3Bbal0ucnNwLndzbVRzcGVjUHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgcE1zZy0+YWdnckluZm8udHNwZWNJZHggfD0gKCAxIDw8IGkgKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoZSBpbmRleCBmb3IgdGhpcyBBQyBhcyBwZW5kaW5nIGZvciByZXNwb25zZSwgd2hpY2ggd291bGQgYmUgCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gdmFsaWRhdGUgdGhlIEFkZFRTIHJlc3BvbnNlIGZyb20gSEFMLT5QRS0+U01FCisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5hY19pbmZvW2ldLnRzcGVjX3BlbmRpbmcgPSAoMTw8aik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAiU2VuZGluZyBhZ2dyZWdhdGVkIG1lc3NhZ2UgdG8gSEFMIDB4JXhcbiIsIHBNc2ctPmFnZ3JJbmZvLnRzcGVjSWR4KTsKKworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhwYWxTZW5kTUJNZXNzYWdlKHBNYWMtPmhIZGQsIHBNc2cpKSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBzZW50IGRvd24gYSBBR0dSIFFvUyByZXEgdG8gUEUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NGVFJJQ1Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHREb3QxMWZJRVJJQ0RhdGFEZXNjICpwUmljRGF0YURlc2MsIHZfVThfdCBhYywgdl9VOF90IHRzcGVjSW5kZXgpCit7CisgICAgdEFOSV9VOCAgICAgICAgaSA9IDA7CisgICAgdHBTaXJBZGR0c1JzcCAgIHBBZGR0c1JzcAorICAgICAgICA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXS5hY19pbmZvW2FjXS5hZGRUc1JzcFt0c3BlY0luZGV4XTsKKworICAgIHZvc19tZW1femVybyhwQWRkdHNSc3AsIHNpemVvZih0U2lyQWRkdHNSc3ApKTsKKworICAgIHBBZGR0c1JzcC0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9BRERUU19SU1A7CisgICAgcEFkZHRzUnNwLT5sZW5ndGggPSBzaXplb2YodFNpckFkZHRzUnNwKTsKKyAgICBwQWRkdHNSc3AtPnJjID0gcFJpY0RhdGFEZXNjLT5SSUNEYXRhLnN0YXR1c0NvZGU7CisgICAgcEFkZHRzUnNwLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgcEFkZHRzUnNwLT5yc3AuZGlhbG9nVG9rZW4gPSBwUmljRGF0YURlc2MtPlJJQ0RhdGEuSWRlbnRpZmllcjsKKyAgICBwQWRkdHNSc3AtPnJzcC5zdGF0dXMgPSBwUmljRGF0YURlc2MtPlJJQ0RhdGEuc3RhdHVzQ29kZTsKKyAgICBwQWRkdHNSc3AtPnJzcC53bWVUc3BlY1ByZXNlbnQgPSBwUmljRGF0YURlc2MtPlRTUEVDLnByZXNlbnQ7CisgICAgaWYgKHBBZGR0c1JzcC0+cnNwLndtZVRzcGVjUHJlc2VudCkKKyAgICB7CisgICAgICAgIC8vQ29weSBUU1BFQyBwYXJhbXMgcmVjZWl2ZWQgaW4gUklDIHJlc3BvbnNlIHRvIGFkZHRzIHJlc3BvbnNlCisgICAgICAgIENvbnZlcnRUU1BFQyhwTWFjLCAmcEFkZHRzUnNwLT5yc3AudHNwZWMsICZwUmljRGF0YURlc2MtPlRTUEVDKTsKKyAgICB9CisKKyAgICBwQWRkdHNSc3AtPnJzcC5udW1UY2xhcyA9IHBSaWNEYXRhRGVzYy0+bnVtX1RDTEFTOworICAgIGlmIChwQWRkdHNSc3AtPnJzcC5udW1UY2xhcykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRkdHNSc3AtPnJzcC5udW1UY2xhczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NvcHkgVENMQVMgaW5mbyBwZXIgaW5kZXggdG8gdGhlIGFkZHRzIHJlc3BvbnNlCisgICAgICAgICAgICBDb252ZXJ0VENMQVMocE1hYywgJnBBZGR0c1JzcC0+cnNwLnRjbGFzSW5mb1tpXSwgJnBSaWNEYXRhRGVzYy0+VENMQVNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcEFkZHRzUnNwLT5yc3AudGNsYXNQcm9jUHJlc2VudCA9IHBSaWNEYXRhRGVzYy0+VENMQVNTUFJPQy5wcmVzZW50OworICAgIGlmIChwQWRkdHNSc3AtPnJzcC50Y2xhc1Byb2NQcmVzZW50KQorICAgICAgICBwQWRkdHNSc3AtPnJzcC50Y2xhc1Byb2MgPSBwUmljRGF0YURlc2MtPlRDTEFTU1BST0MucHJvY2Vzc2luZzsKKworCisgICAgcEFkZHRzUnNwLT5yc3Auc2NoZWR1bGVQcmVzZW50ID0gcFJpY0RhdGFEZXNjLT5TY2hlZHVsZS5wcmVzZW50OworICAgIGlmIChwQWRkdHNSc3AtPnJzcC5zY2hlZHVsZVByZXNlbnQpCisgICB7CisgICAgICAgIC8vQ29weSBTY2hlZHVsZSBJRSBwYXJhbXMgdG8gYWRkdHMgcmVzcG9uc2UKKyAgICAgICAgQ29udmVydFNjaGVkdWxlKHBNYWMsICZwQWRkdHNSc3AtPnJzcC5zY2hlZHVsZSwgJnBSaWNEYXRhRGVzYy0+U2NoZWR1bGUpOworICAgIH0KKworICAgIC8vTmVlZCB0byBjaGVjayB0aGUgYmVsb3cgcG9ydGlvbiBpcyBhIHBhcnQgb2YgV01NIFRTUEVDCisgICAgLy9Qcm9jZXNzIERlbGF5IGVsZW1lbnQKKyAgICBpZiAocFJpY0RhdGFEZXNjLT5UU0RlbGF5LnByZXNlbnQpCisgICAgICAgIENvbnZlcnRUU0RlbGF5KHBNYWMsICZwQWRkdHNSc3AtPnJzcC5kZWxheSwgJnBSaWNEYXRhRGVzYy0+VFNEZWxheSk7CisgICAgLy9yZXR1cm4gc21lX1Fvc1Byb2Nlc3NBZGRUc1JzcChwTWFjLCAmYWRkdHNSc3ApOworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgfQorZUhhbFN0YXR1cyBzbWVfUW9zUHJvY2Vzc0FnZ3JRb3NSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqcE1zZ0J1ZikKK3sKKyAgICB0cFNpckFnZ3JRb3NSc3AgcEFnZ3JSc3AgPSAodHBTaXJBZ2dyUW9zUnNwKXBNc2dCdWY7CisgICAgdFNpckFkZHRzUnNwICAgYWRkdHNSc3A7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIGludCBpLCBqID0gMDsKKyAgICB0QU5JX1U4IHNlc3Npb25JZCA9IHBBZ2dyUnNwLT5zZXNzaW9uSWQ7CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgIEZMKCJSZWNlaXZlZCBBR0dSX1FPUyByZXNwIGZyb20gTElNIikpOworCisgICAgLyogQ29weSBvdmVyIHRoZSB1cGRhdGVkIHJlc3BvbnNlIGluZm9ybWF0aW9uIGZvciBUU1BFQyBvZiBhbGwgdGhlIEFDcyAqLworICAgIGZvciggaSA9IDA7IGkgPCBTSVJfUU9TX05VTV9BQ19NQVg7IGkrKyApCisgICAgeworICAgICAgICB0QU5JX1U4IHRzcGVjX21hc2tfc3RhdHVzID0gc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF0uYWNfaW5mb1tpXS50c3BlY19tYXNrX3N0YXR1czsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IFNNRV9RT1NfVFNQRUNfSU5ERVhfTUFYOyBqKysgKSAKKyAgICAgICAgeworICAgICAgICAgICAgdEFOSV9VOCBkaXJlY3Rpb24gPSBzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXS5hY19pbmZvW2ldLgorICAgICAgICAgICAgICAgIGFkZFRzUnNwW2pdLnJzcC50c3BlYy50c2luZm8udHJhZmZpYy5kaXJlY3Rpb247CisKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgIEZMKCJBZGR0cyByc3AgZnJvbSBMSU0gQUM9JWQsIGZsb3c9JWQgZGlyPSVkLCB0c3BlY0lkeD0leFxuIiksCisgICAgICAgICAgICAgICAgICAgIGksIGosIGRpcmVjdGlvbiwgcEFnZ3JSc3AtPmFnZ3JJbmZvLnRzcGVjSWR4KTsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBkaXJlY3Rpb24gaXMgVXBsaW5rIG9yIGJpLWRpcmVjdGlvbmFsCisgICAgICAgICAgICBpZiggKCgxPDxpKSAmIHBBZ2dyUnNwLT5hZ2dySW5mby50c3BlY0lkeCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKCh0c3BlY19tYXNrX3N0YXR1cykgJiAoMTw8aikpICYmCisgICAgICAgICAgICAgICAgICAgICgoZGlyZWN0aW9uID09IFNNRV9RT1NfV01NX1RTX0RJUl9VUExJTkspIHx8CisgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09IFNNRV9RT1NfV01NX1RTX0RJUl9CT1RIKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkdHNSc3AgPSBzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXS5hY19pbmZvW2ldLmFkZFRzUnNwW2pdOworICAgICAgICAgICAgICAgIGFkZHRzUnNwLnJjID0gcEFnZ3JSc3AtPmFnZ3JJbmZvLmFnZ3JSc3BbaV0uc3RhdHVzOworICAgICAgICAgICAgICAgIGFkZHRzUnNwLnJzcC5zdGF0dXMgPSBwQWdnclJzcC0+YWdnckluZm8uYWdnclJzcFtpXS5zdGF0dXM7CisgICAgICAgICAgICAgICAgYWRkdHNSc3AucnNwLnRzcGVjID0gcEFnZ3JSc3AtPmFnZ3JJbmZvLmFnZ3JSc3BbaV0udHNwZWM7CisKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgRkwoIiVzOiBQcm9jZXNzaW5nIEFkZHRzIHJzcCBmcm9tIExJTSBBQz0lZCwgZmxvdz0lZFxuIiksIGksIGopOworICAgICAgICAgICAgICAgIC8qIHBvc3QgQUREIFRTIHJlc3BvbnNlIGZvciBlYWNoICovCisgICAgICAgICAgICAgICAgaWYgKHNtZV9Rb3NQcm9jZXNzQWRkVHNSc3AocE1hYywgJmFkZHRzUnNwKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICByZXR1cm4gc3RhdHVzOworfQorCisKK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NGVFJlYXNzb2NSc3BFdih0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLCB2b2lkICogcEV2ZW50X2luZm8pCit7CisgICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgIHZfVThfdCBhYzsKKyAgICB2X1U4X3QgdHNwZWNfZmxvd19pbmRleDsKKyAgICB0RG90MTFmSUVSSUNEYXRhRGVzYyAqcFJpY0RhdGFEZXNjID0gTlVMTDsKKyAgICBlSGFsU3RhdHVzICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBDc3JTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICB0Q3NyUm9hbUNvbm5lY3RlZEluZm8gKnBDc3JDb25uZWN0ZWRJbmZvID0gJnBDc3JTZXNzaW9uLT5jb25uZWN0ZWRJbmZvOworICAgIHRBTklfVTMyICAgIHJpY1JzcExlbiA9IHBDc3JDb25uZWN0ZWRJbmZvLT5uUklDUnNwTGVuZ3RoOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICBzZXNzaW9uSWQpOworCisgICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisKKyAgICBwUmljRGF0YURlc2MgPSAodERvdDExZklFUklDRGF0YURlc2MgKilwQ3NyQ29ubmVjdGVkSW5mby0+cGJGcmFtZXMgKyBwQ3NyQ29ubmVjdGVkSW5mby0+bkJlYWNvbkxlbmd0aCArCisgICAgICAgIHBDc3JDb25uZWN0ZWRJbmZvLT5uQXNzb2NSZXFMZW5ndGggKyBwQ3NyQ29ubmVjdGVkSW5mby0+bkFzc29jUnNwTGVuZ3RoOworCisgICAgZm9yKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspCisgICAgeworICAgICAgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKworICAgICAgICBmb3IgKHRzcGVjX2Zsb3dfaW5kZXggPSAwOyB0c3BlY19mbG93X2luZGV4IDwgU01FX1FPU19UU1BFQ19JTkRFWF9NQVg7IHRzcGVjX2Zsb3dfaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogT25seSBpbiB0aGUgYmVsb3cgY2FzZSwgY29weSB0aGUgQUMncyBjdXJyIFFvUyBJbmZvIHRvIHJlcXVlc3RlZCBRb1MgaW5mbyAqLworICAgICAgICAgICAgaWYgKHBBQ0luZm8tPnJpY0lkZW50aWZpZXJbdHNwZWNfZmxvd19pbmRleF0pCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpZiAoIXJpY1JzcExlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiUklDIFJlc3BvbnNlIG5vdCByZWNlaXZlZCBmb3IgQUMgJWQgb24gVFNQRUMgSW5kZXggJWQsIFJJQyBSZXEgSWRlbnRpZmllciA9ICVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWMsIHRzcGVjX2Zsb3dfaW5kZXgsIHBBQ0luZm8tPnJpY0lkZW50aWZpZXJbdHNwZWNfZmxvd19pbmRleF0pOworICAgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBOb3cgd2UgZ290IHJlc3BvbnNlIGZvciB0aGlzIGlkZW50aWZpZXIuIFByb2Nlc3MgaXQuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwUmljRGF0YURlc2MtPnByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUmljRGF0YURlc2MtPlJJQ0RhdGEucHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFJpY0RhdGFEZXNjLT5SSUNEYXRhLklkZW50aWZpZXIgIT0gcEFDSW5mby0+cmljSWRlbnRpZmllclt0c3BlY19mbG93X2luZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiUklDIHJlc3BvbnNlIG9yZGVyIG5vdCBzYW1lIGFzIHJlcXVlc3Qgc2VudC4gUmVxdWVzdCBJRCA9ICVkLCBSZXNwb25zZSBJRCA9ICVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDSW5mby0+cmljSWRlbnRpZmllclt0c3BlY19mbG93X2luZGV4XSwgcFJpY0RhdGFEZXNjLT5SSUNEYXRhLklkZW50aWZpZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiUHJvY2Vzc2luZyBSSUMgUmVzcG9uc2UgZm9yIEFDICVkLCBUU1BFQyBGbG93IGluZGV4ICVkIHdpdGggUklDIElEICVkIFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWMsIHRzcGVjX2Zsb3dfaW5kZXgsIHBSaWNEYXRhRGVzYy0+UklDRGF0YS5JZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX1Fvc1Byb2Nlc3NGVFJJQ1Jlc3BvbnNlKHBNYWMsIHNlc3Npb25JZCwgcFJpY0RhdGFEZXNjLCBhYywgdHNwZWNfZmxvd19pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiRmFpbGVkIHdpdGggc3RhdHVzICVkIGZvciBBQyAlZCBpbiBUU1BFQyBGbG93IGluZGV4ID0gJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFjLCB0c3BlY19mbG93X2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmljRGF0YURlc2MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWNSc3BMZW4gLT0gc2l6ZW9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJpY1JzcExlbikKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICBGTCgiUklDIFJlc3BvbnNlIHN0aWxsIGZvbGxvd3MgZGVzcGl0ZSB0cmF2ZXJzaW5nIHRocm91Z2ggYWxsIEFDcy4gUmVtYWluaW5nIGxlbiA9ICVkXG4iKSwgcmljUnNwTGVuKTsKKyAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICB9CisKKyAgICAvKiBTZW5kIHRoZSBBZ2dyZWdhdGVkIFFvUyByZXF1ZXN0IHRvIEhBTCAqLworICAgIHN0YXR1cyA9IHNtZV9Rb3NGVEFnZ3JRb3NSZXEocE1hYyxzZXNzaW9uSWQpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zQWRkVHNSZXEoKSAtIFRvIHNlbmQgZG93biB0aGUgQUREVFMgcmVxdWVzdCB3aXRoIFRTUEVDIHBhcmFtcworICB0byBQRSAKKyAgCisgCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLiAgCisgIFxwYXJhbSBzZXNzaW9uSWQgLSBTZXNzaW9uIHVwb24gd2hpY2ggdGhlIFRTUEVDIHNob3VsZCBiZSBhZGRlZAorICBccGFyYW0gcFRzcGVjX0luZm8gLSBQb2ludGVyIHRvIHNtZV9Rb3NXbW1Uc3BlY0luZm8gd2hpY2ggY29udGFpbnMgdGhlIFdNTSAKKyAgICAgICAgICAgICAgICAgICAgICAgVFNQRUMgcmVsYXRlZCBpbmZvIGFzIGRlZmluZWQgYWJvdmUKKyAgXHBhcmFtIGFjIC0gRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgRURDQSBBY2Nlc3MgQ2F0ZWdvcmllcy4KKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc0FkZFRzUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqIHBUc3BlY19JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc0VkY2FBY1R5cGUgYWMpCit7CisgICB0U2lyQWRkdHNSZXEgKnBNc2cgPSBOVUxMOworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICB0Q3NyUm9hbVNlc3Npb24gKnBDc3JTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfREVGKHFvcywgdm9zX2V2ZW50X3dsYW5fcW9zX3BheWxvYWRfdHlwZSk7CisjZW5kaWYKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIGZvciBBQyAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICBzZXNzaW9uSWQsIGFjKTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgcE1zZyA9ICh0U2lyQWRkdHNSZXEgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFNpckFkZHRzUmVxKSk7CisgICBpZiAoIXBNc2cpCisgICB7CisgICAgICAvL2VyciBtc2cKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBtc2cgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgdm9zX21lbV96ZXJvKHBNc2csIHNpemVvZih0U2lyQWRkdHNSZXEpKTsKKyAgIHBNc2ctPm1lc3NhZ2VUeXBlID0gcGFsX2NwdV90b19iZTE2KCh2X1UxNl90KWVXTklfU01FX0FERFRTX1JFUSk7CisgICBwTXNnLT5sZW5ndGggPSBzaXplb2YodFNpckFkZHRzUmVxKTsKKyAgIHBNc2ctPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgIHBNc2ctPnRpbWVvdXQgPSAwOworICAgcE1zZy0+cnNwUmVxZCA9IFZPU19UUlVFOworICAgcE1zZy0+cmVxLmRpYWxvZ1Rva2VuID0gc21lX1Fvc0Fzc2lnbkRpYWxvZ1Rva2VuKCk7CisgICAvKkFzIHBlciBXTU1fQUNfdGVzdHBsYW5fdjAuMzkgTWluaW11bSBTZXJ2aWNlIEludGVydmFsLCBNYXhpbXVtIFNlcnZpY2UgCisgICAgIEludGVydmFsLCBTZXJ2aWNlIFN0YXJ0IFRpbWUsIFN1c3BlbnNpb24gSW50ZXJ2YWwgYW5kIERlbGF5IEJvdW5kIGFyZSAKKyAgICAgYWxsIGludGVuZGVkIGZvciBIQ0NBIG9wZXJhdGlvbiBhbmQgdGhlcmVmb3JlIG11c3QgYmUgc2V0IHRvIHplcm8qLworICAgcE1zZy0+cmVxLnRzcGVjLmRlbGF5Qm91bmQgPSAwOworICAgcE1zZy0+cmVxLnRzcGVjLmluYWN0SW50ZXJ2YWwgPSBwVHNwZWNfSW5mby0+aW5hY3Rpdml0eV9pbnRlcnZhbDsKKyAgIHBNc2ctPnJlcS50c3BlYy5sZW5ndGggPSBTTUVfUU9TX1RTUEVDX0lFX0xFTkdUSDsKKyAgIHBNc2ctPnJlcS50c3BlYy5tYXhCdXJzdFN6ID0gcFRzcGVjX0luZm8tPm1heF9idXJzdF9zaXplOworICAgcE1zZy0+cmVxLnRzcGVjLm1heE1zZHVTeiA9IHBUc3BlY19JbmZvLT5tYXhpbXVtX21zZHVfc2l6ZTsKKyAgIHBNc2ctPnJlcS50c3BlYy5tYXhTdmNJbnRlcnZhbCA9IHBUc3BlY19JbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbDsKKyAgIHBNc2ctPnJlcS50c3BlYy5tZWFuRGF0YVJhdGUgPSBwVHNwZWNfSW5mby0+bWVhbl9kYXRhX3JhdGU7CisgICBwTXNnLT5yZXEudHNwZWMubWVkaXVtVGltZSA9IHBUc3BlY19JbmZvLT5tZWRpdW1fdGltZTsKKyAgIHBNc2ctPnJlcS50c3BlYy5taW5EYXRhUmF0ZSA9IHBUc3BlY19JbmZvLT5taW5fZGF0YV9yYXRlOworICAgcE1zZy0+cmVxLnRzcGVjLm1pblBoeVJhdGUgPSBwVHNwZWNfSW5mby0+bWluX3BoeV9yYXRlOworICAgcE1zZy0+cmVxLnRzcGVjLm1pblN2Y0ludGVydmFsID0gcFRzcGVjX0luZm8tPm1pbl9zZXJ2aWNlX2ludGVydmFsOworICAgcE1zZy0+cmVxLnRzcGVjLm5vbU1zZHVTeiA9IHBUc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZTsKKyAgIHBNc2ctPnJlcS50c3BlYy5wZWFrRGF0YVJhdGUgPSBwVHNwZWNfSW5mby0+cGVha19kYXRhX3JhdGU7CisgICBwTXNnLT5yZXEudHNwZWMuc3VycGx1c0J3ID0gcFRzcGVjX0luZm8tPnN1cnBsdXNfYndfYWxsb3dhbmNlOworICAgcE1zZy0+cmVxLnRzcGVjLnN1c3BlbmRJbnRlcnZhbCA9IHBUc3BlY19JbmZvLT5zdXNwZW5zaW9uX2ludGVydmFsOworICAgcE1zZy0+cmVxLnRzcGVjLnN2Y1N0YXJ0VGltZSA9IDA7CisgICBwTXNnLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID0gcFRzcGVjX0luZm8tPnRzX2luZm8uZGlyZWN0aW9uOworICAgLy9NYWtlIHN1cmUgVUFQU0QgaXMgYWxsb3dlZC4gQlRDIG1heSB3YW50IHRvIGRpc2FibGUgVUFQU0Qgd2hpbGUga2VlcCBRb1Mgc2V0dXAKKyAgIGlmKCBwVHNwZWNfSW5mby0+dHNfaW5mby5wc2IgCisgICAgICAgICAmJiBidGNJc1JlYWR5Rm9yVWFwc2QocE1hYykgCisgICAgICkKKyAgIHsKKyAgICAgIHBNc2ctPnJlcS50c3BlYy50c2luZm8udHJhZmZpYy5wc2IgPSBwVHNwZWNfSW5mby0+dHNfaW5mby5wc2I7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwTXNnLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMucHNiID0gMDsKKyAgICAgIHBUc3BlY19JbmZvLT50c19pbmZvLnBzYiA9IDA7CisgICB9CisgICBwTXNnLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMudHNpZCA9IHBUc3BlY19JbmZvLT50c19pbmZvLnRpZDsKKyAgIHBNc2ctPnJlcS50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbyA9IHBUc3BlY19JbmZvLT50c19pbmZvLnVwOworICAgcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSA9IFNNRV9RT1NfQUNDRVNTX1BPTElDWV9FRENBOworICAgcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLmJ1cnN0U2l6ZURlZm4gPSBwVHNwZWNfSW5mby0+dHNfaW5mby5idXJzdF9zaXplX2RlZm47CisgICBwTXNnLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMuYWNrUG9saWN5ID0gcFRzcGVjX0luZm8tPnRzX2luZm8uYWNrX3BvbGljeTsKKyAgIHBNc2ctPnJlcS50c3BlYy50eXBlID0gU01FX1FPU19UU1BFQ19JRV9UWVBFOworICAgLypGaWxsIHRoZSBCU1NJRCBwTXNnLT5yZXEuYnNzSWQqLworICAgaWYgKE5VTEwgPT0gcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBCU1MgZGVzY3JpcHRvciBpcyBOVUxMIHNvIHdlIGRvbid0IHNlbmQgcmVxdXN0IHRvIFBFIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgdm9zX21lbV9jb3B5KCAmcE1zZy0+YnNzSWRbIDAgXSwgCisgICAgICAgICAgICAgICAgICZwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjLT5ic3NJZFsgMCBdLCAKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHRDc3JCc3NpZCkgKTsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogdXAgPSAlZCwgdGlkID0gJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIAorICAgICAgICAgICAgIHBUc3BlY19JbmZvLT50c19pbmZvLnVwLAorICAgICAgICAgICAgIHBUc3BlY19JbmZvLT50c19pbmZvLnRpZCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgaWYocENzclNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuaXNDQ1hBc3NvYykKKyAgIHsKKyAgICAgIHBNc2ctPnJlcS50c3JzSUUudHNpZCA9IHBUc3BlY19JbmZvLT50c19pbmZvLnVwOworICAgICAgcE1zZy0+cmVxLnRzcnNQcmVzZW50ID0gMTsKKyAgIH0KKyNlbmRpZgorICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZykpKQorICAgeworICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogc2VudCBkb3duIGEgQUREVFMgcmVxIHRvIFBFIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgIC8vZXZlbnQ6IEVWRU5UX1dMQU5fUU9TCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAgICAgICAgICAKKyAgICAgIHFvcy5ldmVudElkID0gU01FX1FPU19ESUFHX0FERFRTX1JFUTsKKyAgICAgIHFvcy5yZWFzb25Db2RlID0gU01FX1FPU19ESUFHX1VTRVJfUkVRVUVTVEVEOworICAgICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnFvcywgRVZFTlRfV0xBTl9RT1MpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NEZWxUc1JlcSgpIC0gVG8gc2VuZCBkb3duIHRoZSBERUxUUyByZXF1ZXN0IHdpdGggVFNQRUMgcGFyYW1zCisgIHRvIFBFIAorICAKKyAKKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuICAKKyAgXHBhcmFtIHNlc3Npb25JZCAtIFNlc3Npb24gZnJvbSB3aGljaCB0aGUgVFNQRUMgc2hvdWxkIGJlIGRlbGV0ZWQKKyAgXHBhcmFtIGFjIC0gRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgRURDQSBBY2Nlc3MgQ2F0ZWdvcmllcy4KKyAgXHBhcmFtIHRzcGVjX21hc2sgLSBvbiB3aGljaCB0c3BlYyBwZXIgQUMsIHRoZSBkZWx0cyBpcyByZXF1ZXN0ZWQKKyAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NEZWxUc1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHRzcGVjX21hc2spCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIHRTaXJEZWx0c1JlcSAqcE1zZzsKKyAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKnBUc3BlY0luZm87CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYocW9zLCB2b3NfZXZlbnRfd2xhbl9xb3NfcGF5bG9hZF90eXBlKTsKKyNlbmRpZgorICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBpbnZva2VkIG9uIHNlc3Npb24gJWQgZm9yIEFDICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMpOworICAgcE1zZyA9ICh0U2lyRGVsdHNSZXEgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFNpckRlbHRzUmVxKSk7CisgICBpZiAoIXBNc2cpCisgICB7CisgICAgICAvL2VyciBtc2cKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBtc2cgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgdm9zX21lbV96ZXJvKHBNc2csIHNpemVvZih0U2lyRGVsdHNSZXEpKTsKKyAgIC8vIGdldCBwb2ludGVyIHRvIHRoZSBUU1BFQyBiZWluZyBkZWxldGVkCisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKyAgIHBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworICAgcFRzcGVjSW5mbyA9ICZwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfbWFzayAtIDFdOworICAgcE1zZy0+bWVzc2FnZVR5cGUgPSBwYWxfY3B1X3RvX2JlMTYoKHZfVTE2X3QpZVdOSV9TTUVfREVMVFNfUkVRKTsKKyAgIHBNc2ctPmxlbmd0aCA9IHNpemVvZih0U2lyRGVsdHNSZXEpOworICAgcE1zZy0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgcE1zZy0+cnNwUmVxZCA9IFZPU19UUlVFOworICAgcE1zZy0+cmVxLnRzcGVjLmRlbGF5Qm91bmQgPSBwVHNwZWNJbmZvLT5kZWxheV9ib3VuZDsKKyAgIHBNc2ctPnJlcS50c3BlYy5pbmFjdEludGVydmFsID0gcFRzcGVjSW5mby0+aW5hY3Rpdml0eV9pbnRlcnZhbDsKKyAgIHBNc2ctPnJlcS50c3BlYy5sZW5ndGggPSBTTUVfUU9TX1RTUEVDX0lFX0xFTkdUSDsKKyAgIHBNc2ctPnJlcS50c3BlYy5tYXhCdXJzdFN6ID0gcFRzcGVjSW5mby0+bWF4X2J1cnN0X3NpemU7CisgICBwTXNnLT5yZXEudHNwZWMubWF4TXNkdVN6ID0gcFRzcGVjSW5mby0+bWF4aW11bV9tc2R1X3NpemU7CisgICBwTXNnLT5yZXEudHNwZWMubWF4U3ZjSW50ZXJ2YWwgPSBwVHNwZWNJbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbDsKKyAgIHBNc2ctPnJlcS50c3BlYy5tZWFuRGF0YVJhdGUgPSBwVHNwZWNJbmZvLT5tZWFuX2RhdGFfcmF0ZTsKKyAgIHBNc2ctPnJlcS50c3BlYy5tZWRpdW1UaW1lID0gcFRzcGVjSW5mby0+bWVkaXVtX3RpbWU7CisgICBwTXNnLT5yZXEudHNwZWMubWluRGF0YVJhdGUgPSBwVHNwZWNJbmZvLT5taW5fZGF0YV9yYXRlOworICAgcE1zZy0+cmVxLnRzcGVjLm1pblBoeVJhdGUgPSBwVHNwZWNJbmZvLT5taW5fcGh5X3JhdGU7CisgICBwTXNnLT5yZXEudHNwZWMubWluU3ZjSW50ZXJ2YWwgPSBwVHNwZWNJbmZvLT5taW5fc2VydmljZV9pbnRlcnZhbDsKKyAgIHBNc2ctPnJlcS50c3BlYy5ub21Nc2R1U3ogPSBwVHNwZWNJbmZvLT5ub21pbmFsX21zZHVfc2l6ZTsKKyAgIHBNc2ctPnJlcS50c3BlYy5wZWFrRGF0YVJhdGUgPSBwVHNwZWNJbmZvLT5wZWFrX2RhdGFfcmF0ZTsKKyAgIHBNc2ctPnJlcS50c3BlYy5zdXJwbHVzQncgPSBwVHNwZWNJbmZvLT5zdXJwbHVzX2J3X2FsbG93YW5jZTsKKyAgIHBNc2ctPnJlcS50c3BlYy5zdXNwZW5kSW50ZXJ2YWwgPSBwVHNwZWNJbmZvLT5zdXNwZW5zaW9uX2ludGVydmFsOworICAgcE1zZy0+cmVxLnRzcGVjLnN2Y1N0YXJ0VGltZSA9IHBUc3BlY0luZm8tPnN2Y19zdGFydF90aW1lOworICAgcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLmRpcmVjdGlvbiA9IHBUc3BlY0luZm8tPnRzX2luZm8uZGlyZWN0aW9uOworICAgcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLnBzYiA9IHBUc3BlY0luZm8tPnRzX2luZm8ucHNiOworICAgcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLnRzaWQgPSBwVHNwZWNJbmZvLT50c19pbmZvLnRpZDsKKyAgIHBNc2ctPnJlcS50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbyA9IHBUc3BlY0luZm8tPnRzX2luZm8udXA7CisgICBwTXNnLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID0gU01FX1FPU19BQ0NFU1NfUE9MSUNZX0VEQ0E7CisgICBwTXNnLT5yZXEudHNwZWMudHNpbmZvLnRyYWZmaWMuYnVyc3RTaXplRGVmbiA9IHBUc3BlY0luZm8tPnRzX2luZm8uYnVyc3Rfc2l6ZV9kZWZuOworICAgcE1zZy0+cmVxLnRzcGVjLnRzaW5mby50cmFmZmljLmFja1BvbGljeSA9IHBUc3BlY0luZm8tPnRzX2luZm8uYWNrX3BvbGljeTsKKyAgIHBNc2ctPnJlcS50c3BlYy50eXBlID0gU01FX1FPU19UU1BFQ19JRV9UWVBFOworICAgLypGaWxsIHRoZSBCU1NJRCBwTXNnLT5yZXEuYnNzSWQqLworICAgaWYgKE5VTEwgPT0gcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBCU1MgZGVzY3JpcHRvciBpcyBOVUxMIHNvIHdlIGRvbid0IHNlbmQgcmVxdWVzdCB0byBQRSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIHZvc19tZW1fY29weSggJnBNc2ctPmJzc0lkWyAwIF0sIAorICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYy0+YnNzSWRbIDAgXSwgCisgICAgICAgICAgICAgICAgIHNpemVvZih0Q3NyQnNzaWQpICk7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogdXAgPSAlZCwgdGlkID0gJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIAorICAgICAgICAgICAgIHBUc3BlY0luZm8tPnRzX2luZm8udXAsCisgICAgICAgICAgICAgcFRzcGVjSW5mby0+dHNfaW5mby50aWQpOworICAgdm9zX21lbV96ZXJvKCZwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfbWFzayAtIDFdLCAKKyAgICAgICAgICAgICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZykpKQorICAgeworICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogc21lX1Fvc0RlbFRzUmVxOlRlc3Q6IHNlbnQgZG93biBhIERFTFRTIHJlcSB0byBQRSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAvL2V2ZW50OiBFVkVOVF9XTEFOX1FPUworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgICAgICAgCisgICAgICBxb3MuZXZlbnRJZCA9IFNNRV9RT1NfRElBR19ERUxUUzsKKyAgICAgIHFvcy5yZWFzb25Db2RlID0gU01FX1FPU19ESUFHX1VTRVJfUkVRVUVTVEVEOworICAgICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnFvcywgRVZFTlRfV0xBTl9RT1MpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQcm9jZXNzQWRkVHNSc3AoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgIGVXTklfU01FX0FERFRTX1JTUCBjYW1lIGZyb20gUEUgCisgIAorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4gIAorICBccGFyYW0gcE1zZ0J1ZiAtIFBvaW50ZXIgdG8gdGhlIG1zZyBidWZmZXIgY2FtZSBmcm9tIFBFLiAgIAorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NBZGRUc1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKQoreworICAgdHBTaXJBZGR0c1JzcCBwYWRkdHNfcnNwID0gKHRwU2lyQWRkdHNSc3ApcE1zZ0J1ZjsKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICB2X1U4X3Qgc2Vzc2lvbklkID0gcGFkZHRzX3JzcC0+c2Vzc2lvbklkOworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgc21lX1Fvc1dtbVVwVHlwZSB1cCA9IChzbWVfUW9zV21tVXBUeXBlKXBhZGR0c19yc3AtPnJzcC50c3BlYy50c2luZm8udHJhZmZpYy51c2VyUHJpbzsKKyAgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjOworI2VuZGlmCisKKyAgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCBmb3IgVVAgJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgIHNlc3Npb25JZCwgdXApOworCisgICAgYWMgPSBzbWVfUW9zVXBUb0FjKHVwKTsKKyAgICBpZihTTUVfUU9TX0VEQ0FfQUNfTUFYID09IGFjKQorICAgIHsKKyAgICAgICAgLy9lcnIgbXNnCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBpbnZhbGlkIEFDICVkIGZyb20gVVAgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGFjLCB1cCk7CisKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorICAgIHBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOyAgIAorICAgIGlmIChTTUVfUU9TX0hBTkRPRkYgPT0gcEFDSW5mby0+Y3Vycl9zdGF0ZSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgiQUREVFMgUmVzcG9uc2UgcmVjZWl2ZWQgZm9yIEFDICVkIGluIEhBTkRPRkYgU3RhdGUuLiBEcm9wcGluZyIpLCBhYyk7CisgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfREVGKHFvcywgdm9zX2V2ZW50X3dsYW5fcW9zX3BheWxvYWRfdHlwZSk7CisjZW5kaWYKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogSW52b2tlZCBvbiBzZXNzaW9uICVkIHdpdGggcmV0dXJuIGNvZGUgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkLCBwYWRkdHNfcnNwLT5yYyk7CisgICAvLyBvdXIgb3V0c3RhbmRpbmcgcmVxdWVzdCBoYXMgYmVlbiBzZXJ2aWNlZAorICAgLy8gd2UgY2FuIGdvIGludG8gcG93ZXJzYXZlCisgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfVFJVRTsKKyAgIGlmKHBhZGR0c19yc3AtPnJjKQorICAgeworICAgICAgLy9ldmVudDogRVZFTlRfV0xBTl9RT1MKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICAgICAgICAgIAorICAgICAgcW9zLmV2ZW50SWQgPSBTTUVfUU9TX0RJQUdfQUREVFNfUlNQOworICAgICAgcW9zLnJlYXNvbkNvZGUgPSBTTUVfUU9TX0RJQUdfQUREVFNfUkVGVVNFRDsKKyAgICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZxb3MsIEVWRU5UX1dMQU5fUU9TKTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgICAgIHN0YXR1cyA9IHNtZV9Rb3NQcm9jZXNzQWRkVHNGYWlsdXJlUnNwKHBNYWMsIHNlc3Npb25JZCwgJnBhZGR0c19yc3AtPnJzcCk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzdGF0dXMgPSBzbWVfUW9zUHJvY2Vzc0FkZFRzU3VjY2Vzc1JzcChwTWFjLCBzZXNzaW9uSWQsICZwYWRkdHNfcnNwLT5yc3ApOworICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQcm9jZXNzRGVsVHNSc3AoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgIGVXTklfU01FX0RFTFRTX1JTUCBjYW1lIGZyb20gUEUgCisgIAorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4gIAorICBccGFyYW0gcE1zZ0J1ZiAtIFBvaW50ZXIgdG8gdGhlIG1zZyBidWZmZXIgY2FtZSBmcm9tIFBFLiAgIAorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NEZWxUc1JzcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKQoreworICAgdHBTaXJEZWx0c1JzcCBwRGVsdHNSc3AgPSAodHBTaXJEZWx0c1JzcClwTXNnQnVmOworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHZfVThfdCBzZXNzaW9uSWQgPSBwRGVsdHNSc3AtPnNlc3Npb25JZDsKKyAgIC8vIG1zZworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBJbnZva2VkIG9uIHNlc3Npb24gJWQgd2l0aCByZXR1cm4gY29kZSAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICBzZXNzaW9uSWQsIHBEZWx0c1JzcC0+cmMpOworICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICAvLyBvdXIgb3V0c3RhbmRpbmcgcmVxdWVzdCBoYXMgYmVlbiBzZXJ2aWNlZAorICAgLy8gd2UgY2FuIGdvIGludG8gcG93ZXJzYXZlCisgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfVFJVRTsKKyAgICh2b2lkKXNtZV9Rb3NQcm9jZXNzQnVmZmVyZWRDbWQoc2Vzc2lvbklkKTsKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1Byb2Nlc3NEZWxUc0luZCgpIC0gRnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUKKyAgZVdOSV9TTUVfREVMVFNfSU5EIGNhbWUgZnJvbSBQRSAKKyAgCisgIFNpbmNlIGl0J3MgYSBERUxUUyBpbmRpY2F0aW9uIGZyb20gQVAsIHdpbGwgbm90aWZ5IGFsbCB0aGUgZmxvd3MgcnVubmluZyBvbiAKKyAgdGhpcyBBQyBhYm91dCBRb1MgcmVsZWFzZQorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4gIAorICBccGFyYW0gcE1zZ0J1ZiAtIFBvaW50ZXIgdG8gdGhlIG1zZyBidWZmZXIgY2FtZSBmcm9tIFBFLiAgIAorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NEZWxUc0luZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmKQoreworICAgdHBTaXJEZWx0c1JzcCBwZGVsdHNpbmQgPSAodHBTaXJEZWx0c1JzcClwTXNnQnVmOworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisgICB2X1U4X3Qgc2Vzc2lvbklkID0gcGRlbHRzaW5kLT5zZXNzaW9uSWQ7CisgICBzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKyAgIHNtZV9Rb3NTZWFyY2hJbmZvIHNlYXJjaF9rZXk7CisgICBzbWVfUW9zV21tVXBUeXBlIHVwID0gKHNtZV9Rb3NXbW1VcFR5cGUpcGRlbHRzaW5kLT5yc3AudHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW87CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYocW9zLCB2b3NfZXZlbnRfd2xhbl9xb3NfcGF5bG9hZF90eXBlKTsKKyNlbmRpZgorICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBJbnZva2VkIG9uIHNlc3Npb24gJWQgZm9yIFVQICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgIHNlc3Npb25JZCwgdXApOworICAgYWMgPSBzbWVfUW9zVXBUb0FjKHVwKTsKKyAgIGlmKFNNRV9RT1NfRURDQV9BQ19NQVggPT0gYWMpCisgICB7CisgICAgICAvL2VyciBtc2cKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBpbnZhbGlkIEFDICVkIGZyb20gVVAgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgYWMsIHVwKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKworICAgdm9zX21lbV96ZXJvKCZzZWFyY2hfa2V5LCBzaXplb2Yoc21lX1Fvc1NlYXJjaEluZm8pKTsKKyAgIC8vc2V0IHRoZSBrZXkgdHlwZSAmIHRoZSBrZXkgdG8gYmUgc2VhcmNoZWQgaW4gdGhlIEZsb3cgTGlzdAorICAgc2VhcmNoX2tleS5rZXkuYWNfdHlwZSA9IGFjOworICAgc2VhcmNoX2tleS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8yOworICAgc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAvL2ZpbmQgYWxsIEZsb3dzIG9uIHRoZSBwZXJ0aWN1bGFyIEFDICYgZGVsZXRlIHRoZW0sIGFsc28gc2VuZCBIREQgaW5kaWNhdGlvbgorICAgLy8gdGhyb3VnaCB0aGUgY2FsbGJhY2sgaXQgcmVnaXN0ZXJlZCBwZXIgcmVxdWVzdAorICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzbWVfUW9zRmluZEFsbEluRmxvd0xpc3QocE1hYywgc2VhcmNoX2tleSwgc21lX1Fvc0RlbFRzSW5kRm5wKSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogbm8gbWF0Y2ggZm91bmQgZm9yIGFjID0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIAorICAgICAgICAgICAgICAgIHNlYXJjaF9rZXkua2V5LmFjX3R5cGUpOworICAgICAgLy9BU1NFUlQKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIC8vY2xlYW4gdXAgdGhlIENCCisgICB2b3NfbWVtX3plcm8oJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLCAKKyAgICAgICAgICAgICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworICAgdm9zX21lbV96ZXJvKCZwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLCAKKyAgICAgICAgICAgICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworICAgdm9zX21lbV96ZXJvKCZwQUNJbmZvLT5jdXJyX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8xXSwgCisgICAgICAgICAgICAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKyAgIHZvc19tZW1femVybygmcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8xXSwgCisgICAgICAgICAgICAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKyAgIHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzID0gU01FX1FPU19UU1BFQ19NQVNLX0NMRUFSOworICAgcEFDSW5mby0+dHNwZWNfcGVuZGluZyA9IDA7CisgICAvL2V2ZW50OiBFVkVOVF9XTEFOX1FPUworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgICAgICAgCisgICBxb3MuZXZlbnRJZCA9IFNNRV9RT1NfRElBR19ERUxUUzsKKyAgIHFvcy5yZWFzb25Db2RlID0gU01FX1FPU19ESUFHX0RFTFRTX0lORF9GUk9NX0FQOworICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnFvcywgRVZFTlRfV0xBTl9RT1MpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisgICBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfTElOS19VUCk7CisgICAodm9pZClzbWVfUW9zUHJvY2Vzc0J1ZmZlcmVkQ21kKHNlc3Npb25JZCk7CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQcm9jZXNzQXNzb2NDb21wbGV0ZUV2KCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICBTTUVfUU9TX0NTUl9BU1NPQ19DT01QTEVURSBldmVudCBpbmRpY2F0aW9uIGZyb20gQ1NSCisgIFxwYXJhbSBwRXZlbnRfaW5mbyAtIFBvaW50ZXIgdG8gcmVsZXZhbnQgaW5mbyBmcm9tIENTUi4gICAKKyAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzQXNzb2NDb21wbGV0ZUV2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHZvaWQgKiBwRXZlbnRfaW5mbykKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgc21lX1Fvc0VkY2FBY1R5cGUgYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICBpZigoKFNNRV9RT1NfSU5JVCA9PSBwU2Vzc2lvbi0+YWNfaW5mb1tTTUVfUU9TX0VEQ0FfQUNfQkVdLmN1cnJfc3RhdGUpJiYKKyAgICAgICAoU01FX1FPU19JTklUID09IHBTZXNzaW9uLT5hY19pbmZvW1NNRV9RT1NfRURDQV9BQ19CS10uY3Vycl9zdGF0ZSkmJgorICAgICAgIChTTUVfUU9TX0lOSVQgPT0gcFNlc3Npb24tPmFjX2luZm9bU01FX1FPU19FRENBX0FDX1ZJXS5jdXJyX3N0YXRlKSYmCisgICAgICAgKFNNRV9RT1NfSU5JVCA9PSBwU2Vzc2lvbi0+YWNfaW5mb1tTTUVfUU9TX0VEQ0FfQUNfVk9dLmN1cnJfc3RhdGUpKSB8fAorICAgICAgIChwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCkpCisgICB7CisgICAgICAvL2dldCB0aGUgYXNzb2NpYXRpb24gaW5mbworICAgICAgaWYoIXBFdmVudF9pbmZvKQorICAgICAgeworICAgICAgICAgLy9lcnIgbXNnCisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogcEV2ZW50X2luZm8gaXMgTlVMTCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgfQorICAgICAgaWYoISgoc21lX1Fvc0Fzc29jSW5mbyAqKXBFdmVudF9pbmZvKS0+cEJzc0Rlc2MpCisgICAgICB7CisgICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBwQnNzRGVzYyBpcyBOVUxMIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisgICAgICBpZigocFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYykgJiYKKyAgICAgICAgIChjc3JJc0Jzc2lkTWF0Y2gocE1hYywgKHRDc3JCc3NpZCAqKSZwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjLT5ic3NJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICh0Q3NyQnNzaWQgKikgJigoKHNtZV9Rb3NBc3NvY0luZm8gKilwRXZlbnRfaW5mbyktPnBCc3NEZXNjLT5ic3NJZCkpKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBhc3NvYyB3aXRoIHRoZSBzYW1lIEJTUywgbm8gdXBkYXRlIG5lZWRlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBzbWVfUW9zU2F2ZUFzc29jSW5mbyhwU2Vzc2lvbiwgcEV2ZW50X2luZm8pOworICAgICAgfQorICAgfQorICAgZWxzZQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IHdyb25nIHN0YXRlOiBCRSAlZCwgQksgJWQsIFZJICVkLCBWTyAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+YWNfaW5mb1tTTUVfUU9TX0VEQ0FfQUNfQkVdLmN1cnJfc3RhdGUsCisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmFjX2luZm9bU01FX1FPU19FRENBX0FDX0JLXS5jdXJyX3N0YXRlLAorICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5hY19pbmZvW1NNRV9RT1NfRURDQV9BQ19WSV0uY3Vycl9zdGF0ZSwKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+YWNfaW5mb1tTTUVfUU9TX0VEQ0FfQUNfVk9dLmN1cnJfc3RhdGUpOworICAgICAgLy9BU1NFUlQKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorICAgLy8gdGhlIHNlc3Npb24gaXMgYWN0aXZlCisgICBwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSA9IFZPU19UUlVFOworICAgaWYocFNlc3Npb24tPmhhbmRvZmZSZXF1ZXN0ZWQpCisgICB7CisgICAgICBwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCA9IFZPU19GQUxTRTsKKyAgICAgIC8vcmVuZXcgYWxsIGZsb3dzCisgICAgICAodm9pZClzbWVfUW9zUHJvY2Vzc0J1ZmZlcmVkQ21kKHNlc3Npb25JZCk7CisgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgfQorICAgZWxzZQorICAgeworICAgICAgZm9yKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspIAorICAgICAgeworICAgICAgICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICAgICAgICBzd2l0Y2gocEFDSW5mby0+Y3Vycl9zdGF0ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU01FX1FPU19JTklUOgorICAgICAgICAgICAgICAgc21lX1Fvc1N0YXRlVHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLCBTTUVfUU9TX0xJTktfVVApOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNNRV9RT1NfTElOS19VUDoKKyAgICAgICAgICAgIGNhc2UgU01FX1FPU19SRVFVRVNURUQ6CisgICAgICAgICAgICBjYXNlIFNNRV9RT1NfUU9TX09OOgorICAgICAgICAgICAgY2FzZSBTTUVfUU9TX0hBTkRPRkY6CisgICAgICAgICAgICBjYXNlIFNNRV9RT1NfQ0xPU0VEOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIEFDICVkIGlzIGluIHdyb25nIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMsIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworICAgICAgICAgICAgICAgLy9BU1NFUlQKKyAgICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zUHJvY2Vzc1JlYXNzb2NSZXFFdigpIC0gRnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUKKyAgU01FX1FPU19DU1JfUkVBU1NPQ19SRVEgZXZlbnQgaW5kaWNhdGlvbiBmcm9tIENTUgorICBccGFyYW0gcEV2ZW50X2luZm8gLSBQb2ludGVyIHRvIHJlbGV2YW50IGluZm8gZnJvbSBDU1IuICAgCisgIAorICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zUHJvY2Vzc1JlYXNzb2NSZXFFdih0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLCB2b2lkICogcEV2ZW50X2luZm8pCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBpbnZva2VkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgIGlmKHBTZXNzaW9uLT5mdEhhbmRvZmZJblByb2dyZXNzKQorICAgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICIlczogJWQ6IG5vIG5lZWQgZm9yIHN0YXRlIHRyYW5zaXRpb24sIHNob3VsZCAiCisgICAgICAgICAgICAgICAiYWxyZWFkeSBiZSBpbiBoYW5kb2ZmIHN0YXRlIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgIFZPU19BU1NFUlQocFNlc3Npb24tPmFjX2luZm9bMF0uY3Vycl9zdGF0ZSA9PSBTTUVfUU9TX0hBTkRPRkYpOworICAgICAgIFZPU19BU1NFUlQocFNlc3Npb24tPmFjX2luZm9bMV0uY3Vycl9zdGF0ZSA9PSBTTUVfUU9TX0hBTkRPRkYpOworICAgICAgIFZPU19BU1NFUlQocFNlc3Npb24tPmFjX2luZm9bMl0uY3Vycl9zdGF0ZSA9PSBTTUVfUU9TX0hBTkRPRkYpOworICAgICAgIFZPU19BU1NFUlQocFNlc3Npb24tPmFjX2luZm9bM10uY3Vycl9zdGF0ZSA9PSBTTUVfUU9TX0hBTkRPRkYpOworICAgICAgIHNtZV9Rb3NQcm9jZXNzRlRSZWFzc29jUmVxRXYocE1hYywgc2Vzc2lvbklkLCBwRXZlbnRfaW5mbyk7CisgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisjZW5kaWYKKworICAgaWYocFNlc3Npb24tPmhhbmRvZmZSZXF1ZXN0ZWQpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IG5vIG5lZWQgZm9yIHN0YXRlIHRyYW5zaXRpb24sIHNob3VsZCAiCisgICAgICAgICAgICAgICAgImFscmVhZHkgYmUgaW4gaGFuZG9mZiBzdGF0ZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICBWT1NfQVNTRVJUKHBTZXNzaW9uLT5hY19pbmZvWzBdLmN1cnJfc3RhdGUgPT0gU01FX1FPU19IQU5ET0ZGKTsKKyAgICAgIFZPU19BU1NFUlQocFNlc3Npb24tPmFjX2luZm9bMV0uY3Vycl9zdGF0ZSA9PSBTTUVfUU9TX0hBTkRPRkYpOworICAgICAgVk9TX0FTU0VSVChwU2Vzc2lvbi0+YWNfaW5mb1syXS5jdXJyX3N0YXRlID09IFNNRV9RT1NfSEFORE9GRik7CisgICAgICBWT1NfQVNTRVJUKHBTZXNzaW9uLT5hY19pbmZvWzNdLmN1cnJfc3RhdGUgPT0gU01FX1FPU19IQU5ET0ZGKTsKKworICAgICAgLy9idWZmZXIgdGhlIGV4aXN0aW5nIGZsb3dzIHRvIGJlIHJlbmV3ZWQgYWZ0ZXIgaGFuZG9mZiBpcyBkb25lCisgICAgICBzbWVfUW9zQnVmZmVyRXhpc3RpbmdGbG93cyhwTWFjLCBzZXNzaW9uSWQpOworICAgICAgLy9jbGVhbiB1cCB0aGUgY29udHJvbCBibG9jayBwYXJ0aWFsbHkgZm9yIGhhbmRvZmYKKyAgICAgIHNtZV9Rb3NDbGVhbnVwQ3RybEJsa0ZvckhhbmRvZmYocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgfQorLy9UQkg6IEFzc3VtaW5nIGJvdGggaGFuZG9mZiBhbGdvICYgMTFyIHdpbGxuJ3QgYmUgZW5hYmxlZCBhdCB0aGUgc2FtZSB0aW1lCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgIGlmKHBTZXNzaW9uLT5mdEhhbmRvZmZJblByb2dyZXNzKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBubyBuZWVkIGZvciBzdGF0ZSB0cmFuc2l0aW9uLCBzaG91bGQgIgorICAgICAgICAgICAgICAgICJhbHJlYWR5IGJlIGluIGhhbmRvZmYgc3RhdGUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgVk9TX0FTU0VSVChwU2Vzc2lvbi0+YWNfaW5mb1swXS5jdXJyX3N0YXRlID09IFNNRV9RT1NfSEFORE9GRik7CisgICAgICBWT1NfQVNTRVJUKHBTZXNzaW9uLT5hY19pbmZvWzFdLmN1cnJfc3RhdGUgPT0gU01FX1FPU19IQU5ET0ZGKTsKKyAgICAgIFZPU19BU1NFUlQocFNlc3Npb24tPmFjX2luZm9bMl0uY3Vycl9zdGF0ZSA9PSBTTUVfUU9TX0hBTkRPRkYpOworICAgICAgVk9TX0FTU0VSVChwU2Vzc2lvbi0+YWNfaW5mb1szXS5jdXJyX3N0YXRlID09IFNNRV9RT1NfSEFORE9GRik7CisKKyAgICAgIHNtZV9Rb3NQcm9jZXNzRlRSZWFzc29jUmVxRXYocE1hYywgc2Vzc2lvbklkLCBwRXZlbnRfaW5mbyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKyNlbmRpZgorCisgICBmb3IoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykgCisgICB7CisgICAgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKyAgICAgIHN3aXRjaChwQUNJbmZvLT5jdXJyX3N0YXRlKQorICAgICAgeworICAgICAgICAgY2FzZSBTTUVfUU9TX0xJTktfVVA6CisgICAgICAgICBjYXNlIFNNRV9RT1NfUkVRVUVTVEVEOgorICAgICAgICAgY2FzZSBTTUVfUU9TX1FPU19PTjoKKyAgICAgICAgICAgIHNtZV9Rb3NTdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbklkLCBhYywgU01FX1FPU19IQU5ET0ZGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBTTUVfUU9TX0hBTkRPRkY6CisgICAgICAgICAgICAvL1RoaXMgaXMgbm9ybWFsIGJlY2F1c2Ugc21lX1Fvc1JlcXVlc3RSZWFzc29jIG1heSBhbHJlYWR5IGNoYW5nZSB0aGUgc3RhdGUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBTTUVfUU9TX0NMT1NFRDoKKyAgICAgICAgIGNhc2UgU01FX1FPU19JTklUOgorICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIEFDICVkIGlzIGluIHdyb25nIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMsIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworICAgICAgICAgICAgLy9BU1NFUlQKKyAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1Byb2Nlc3NSZWFzc29jU3VjY2Vzc0V2KCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICBTTUVfUU9TX0NTUl9SRUFTU09DX0NPTVBMRVRFIGV2ZW50IGluZGljYXRpb24gZnJvbSBDU1IKKyAgXHBhcmFtIHBFdmVudF9pbmZvIC0gUG9pbnRlciB0byByZWxldmFudCBpbmZvIGZyb20gQ1NSLiAgIAorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NSZWFzc29jU3VjY2Vzc0V2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHZvaWQgKiBwRXZlbnRfaW5mbykKK3sKKyAgIHRwU2lyU21lSm9pblJzcCBwU21lSm9pblJzcCA9ICh0cFNpclNtZUpvaW5Sc3ApIHBFdmVudF9pbmZvOworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisgICBzbWVfUW9zRWRjYUFjVHlwZSBhYywgYWNfaW5kZXg7CisgICBzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5OworICAgc21lX1Fvc1NlYXJjaEluZm8gc2VhcmNoX2tleTE7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0TGlzdEVsZW0gKnBFbnRyeT0gTlVMTDsKKyAgIHNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICAvLyBvdXIgcGVuZGluZyByZWFzc29jaWF0aW9uIGhhcyBjb21wbGV0ZWQKKyAgIC8vIHdlIGNhbiBhbGxvdyBwb3dlcnNhdmUKKyAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgLy9nZXQgdGhlIGFzc29jaWF0aW9uIGluZm8KKyAgIGlmKCFwRXZlbnRfaW5mbykKKyAgIHsKKyAgICAgIC8vZXJyIG1zZworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IHBFdmVudF9pbmZvIGlzIE5VTEwiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKyAgIGlmKCEoKHNtZV9Rb3NBc3NvY0luZm8gKilwRXZlbnRfaW5mbyktPnBCc3NEZXNjKQorICAgeworICAgICAgLy9lcnIgbXNnCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogcEJzc0Rlc2MgaXMgTlVMTCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorICAgc3RhdHVzID0gc21lX1Fvc1NhdmVBc3NvY0luZm8ocFNlc3Npb24sIHBFdmVudF9pbmZvKTsKKyAgIGlmKHN0YXR1cykKKyAgIHsKKyAgICAgIC8vZXJyIG1zZworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IHNtZV9Rb3NTYXZlQXNzb2NJbmZvKCkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgIH0KKy8vVEJIOiBBc3N1bWluZyBib3RoIGhhbmRvZmYgYWxnbyAmIDExciB3aWxsbid0IGJlIGVuYWJsZWQgYXQgdGhlIHNhbWUgdGltZSAgIAorICAgaWYocFNlc3Npb24tPmhhbmRvZmZSZXF1ZXN0ZWQpCisgICB7CisgICAgICBwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCA9IFZPU19GQUxTRTsKKyAgICAgIC8vcmVuZXcgYWxsIGZsb3dzCisgICAgICAodm9pZClzbWVfUW9zUHJvY2Vzc0J1ZmZlcmVkQ21kKHNlc3Npb25JZCk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgaWYgKHBTZXNzaW9uLT5mdEhhbmRvZmZJblByb2dyZXNzKQorICAgeworICAgICAgIGlmIChjc3JSb2FtSXMxMXJBc3NvYyhwTWFjKSkgeworICAgICAgICAgICBpZiAocFNtZUpvaW5Sc3AtPnBhcnNlZFJpY1JzcExlbikgeworICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX1Fvc1Byb2Nlc3NGVFJlYXNzb2NSc3BFdihwTWFjLCBzZXNzaW9uSWQsIHBFdmVudF9pbmZvKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgLy8gSWYgQ0NYIGFzc29jaWF0aW9uIGNoZWNrIGZvciBUU1BFQyBJRXMgaW4gdGhlIHJlYXNzb2MgcnNwIGZyYW1lCisgICAgICAgaWYgKGNzclJvYW1Jc0NDWEFzc29jKHBNYWMpKSB7CisgICAgICAgICAgIGlmIChwU21lSm9pblJzcC0+dHNwZWNJZUxlbikgeworICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX1Fvc0NDWFByb2Nlc3NSZWFzc29jVHNwZWNSc3AocE1hYywgc2Vzc2lvbklkLCBwRXZlbnRfaW5mbyk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisjZW5kaWYKKyAgICAgICBwU2Vzc2lvbi0+ZnRIYW5kb2ZmSW5Qcm9ncmVzcyA9IFZPU19GQUxTRTsKKyAgICAgICBwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCA9IFZPU19GQUxTRTsKKyAgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorI2VuZGlmCisKKyAgIHBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlID0gVk9TX1RSVUU7CisgICBmb3IoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykgCisgICB7CisgICAgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKyAgICAgIHN3aXRjaChwQUNJbmZvLT5jdXJyX3N0YXRlKQorICAgICAgeworICAgICAgICAgY2FzZSBTTUVfUU9TX0hBTkRPRkY6CisgICAgICAgICAgICAvLyByZXR1cm4gdG8gb3VyIHByZXZpb3VzIHN0YXRlCisgICAgICAgICAgICBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIHBBQ0luZm8tPnByZXZfc3RhdGUpOworICAgICAgICAgICAgLy9mb3Igd2hpY2ggYWMgQVBTRCAoaGVuY2UgdGhlIHJlYXNzb2MpIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYocEFDSW5mby0+cmVhc3NvY19wZW5kaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy91cGRhdGUgdGhlIGFwc2QgbWFzayBpbiBDQiAtIG1ha2Ugc3VyZSB0byB0YWtlIGNhcmUgb2YgdGhlIGNhc2UKKyAgICAgICAgICAgICAgIC8vd2hlcmUgd2UgYXJlIHJlc2V0dGluZyB0aGUgYml0IGluIGFwc2RfbWFzaworICAgICAgICAgICAgICAgaWYocEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXS50c19pbmZvLnBzYikKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5hcHNkTWFzayB8PSAxIDw8IChTTUVfUU9TX0VEQ0FfQUNfVk8gLSBhYyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+YXBzZE1hc2sgJj0gfigxIDw8IChTTUVfUU9TX0VEQ0FfQUNfVk8gLSBhYykpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgcEFDSW5mby0+cmVhc3NvY19wZW5kaW5nID0gVk9TX0ZBTFNFOworICAgICAgICAgICAgICAgLy9kdXJpbmcgc2V0dXAgaXQgZ2V0cyBzZXQgYXMgYWRkdHMgJiByZWFzc29jIGJvdGggZ2V0cyBhIHBlbmRpbmcgZmxhZworICAgICAgICAgICAgICAgLy9wQUNJbmZvLT50c3BlY19wZW5kaW5nID0gMDsKKyAgICAgICAgICAgICAgIHNtZV9Rb3NTdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbklkLCBhYywgU01FX1FPU19RT1NfT04pOworICAgICAgICAgICAgICAgLy8gbm90aWZ5IEhERCB3aXRoIG5ldyBTZXJ2aWNlIEludGVydmFsCisgICAgICAgICAgICAgICBwQUNJbmZvLT5jdXJyX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXSA9IAorICAgICAgICAgICAgICAgICAgcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8wXTsKKyAgICAgICAgICAgICAgIHZvc19tZW1femVybygmc2VhcmNoX2tleSwgc2l6ZW9mKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisgICAgICAgICAgICAgICAvL3NldCB0aGUga2V5IHR5cGUgJiB0aGUga2V5IHRvIGJlIHNlYXJjaGVkIGluIHRoZSBGbG93IExpc3QKKyAgICAgICAgICAgICAgIHNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKyAgICAgICAgICAgICAgIHNlYXJjaF9rZXkuaW5kZXggPSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfMjsKKyAgICAgICAgICAgICAgIHNlYXJjaF9rZXkuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICAgICAgICAgLy9ub3RpZnkgUE1DIHRoYXQgcmVhc3NvYyBpcyBkb25lIGZvciBBUFNEIG9uIGNlcnRhaW4gQUM/PworCisgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8oJnNlYXJjaF9rZXkxLCBzaXplb2Yoc21lX1Fvc1NlYXJjaEluZm8pKTsKKyAgICAgICAgICAgICAgIC8vc2V0IHRoZSBob1JlbmV3YWwgZmllbGQgaW4gY29udHJvbCBibG9jayBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgIHNlYXJjaF9rZXkxLmluZGV4ID0gU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzM7CisgICAgICAgICAgICAgICBzZWFyY2hfa2V5MS5rZXkucmVhc29uID0gU01FX1FPU19SRUFTT05fU0VUVVA7CisgICAgICAgICAgICAgICBzZWFyY2hfa2V5MS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgICAgICAgICBmb3IoYWNfaW5kZXggPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjX2luZGV4IDwgU01FX1FPU19FRENBX0FDX01BWDsgYWNfaW5kZXgrKykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBFbnRyeSA9IHNtZV9Rb3NGaW5kSW5GbG93TGlzdChzZWFyY2hfa2V5MSk7CisgICAgICAgICAgICAgICAgICBpZihwRW50cnkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rICk7CisgICAgICAgICAgICAgICAgICAgICBpZihmbG93X2luZm8tPmFjX3R5cGUgPT0gYWMpCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQUNJbmZvLT5ob1JlbmV3YWwgPSBmbG93X2luZm8tPmhvUmVuZXdhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgLy9ub3RpZnkgSEREIHRoZSBzdWNjZXNzIGZvciB0aGUgcmVxdWVzdGVkIGZsb3cgCisgICAgICAgICAgICAgICAvL25vdGlmeSBhbGwgdGhlIG90aGVyIGZsb3dzIHJ1bm5pbmcgb24gdGhlIEFDIHRoYXQgUW9TIGdvdCBtb2RpZmllZAorICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzbWVfUW9zRmluZEFsbEluRmxvd0xpc3QocE1hYywgc2VhcmNoX2tleSwgc21lX1Fvc1JlYXNzb2NTdWNjZXNzRXZGbnApKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBubyBtYXRjaCBmb3VuZCBmb3IgYWMgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfa2V5LmtleS5hY190eXBlKTsKKyAgICAgICAgICAgICAgICAgIC8vQVNTRVJUCisgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBwQUNJbmZvLT5ob1JlbmV3YWwgPSBWT1NfRkFMU0U7CisgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8oJnBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFNNRV9RT1NfSU5JVDoKKyAgICAgICAgIGNhc2UgU01FX1FPU19DTE9TRUQ6CisgICAgICAgICAgICAvL05PUAorICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBTTUVfUU9TX0xJTktfVVA6CisgICAgICAgICBjYXNlIFNNRV9RT1NfUkVRVUVTVEVEOgorICAgICAgICAgY2FzZSBTTUVfUU9TX1FPU19PTjoKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBBQyAlZCBpcyBpbiB3cm9uZyBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGFjLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKyAgICAgICAgICAgIC8vQVNTRVJUCisgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisgICAodm9pZClzbWVfUW9zUHJvY2Vzc0J1ZmZlcmVkQ21kKHNlc3Npb25JZCk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zUHJvY2Vzc1JlYXNzb2NGYWlsdXJlRXYoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgIFNNRV9RT1NfQ1NSX1JFQVNTT0NfRkFJTFVSRSBldmVudCBpbmRpY2F0aW9uIGZyb20gQ1NSCisgIFxwYXJhbSBwRXZlbnRfaW5mbyAtIFBvaW50ZXIgdG8gcmVsZXZhbnQgaW5mbyBmcm9tIENTUi4gICAKKyAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzUmVhc3NvY0ZhaWx1cmVFdih0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLCB2b2lkICogcEV2ZW50X2luZm8pCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBpbnZva2VkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgLy8gb3VyIHBlbmRpbmcgcmVhc3NvY2lhdGlvbiBoYXMgY29tcGxldGVkCisgICAvLyB3ZSBjYW4gYWxsb3cgcG93ZXJzYXZlCisgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfVFJVRTsKKyAgIGZvcihhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSAKKyAgIHsKKyAgICAgIHBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworICAgICAgc3dpdGNoKHBBQ0luZm8tPmN1cnJfc3RhdGUpCisgICAgICB7CisgICAgICAgICBjYXNlIFNNRV9RT1NfSEFORE9GRjoKKyAgICAgICAgICAgIHNtZV9Rb3NTdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbklkLCBhYywgU01FX1FPU19JTklUKTsKKyAgICAgICAgICAgIGlmKHBBQ0luZm8tPnJlYXNzb2NfcGVuZGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBBQ0luZm8tPnJlYXNzb2NfcGVuZGluZyA9IFZPU19GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvc19tZW1femVybygmcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisgICAgICAgICAgICB2b3NfbWVtX3plcm8oJnBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisgICAgICAgICAgICB2b3NfbWVtX3plcm8oJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzFdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzFdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworICAgICAgICAgICAgcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMgPSBTTUVfUU9TX1RTUEVDX01BU0tfQ0xFQVI7CisgICAgICAgICAgICBwQUNJbmZvLT50c3BlY19wZW5kaW5nID0gMDsKKyAgICAgICAgICAgIHBBQ0luZm8tPm51bV9mbG93c1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdID0gMDsKKyAgICAgICAgICAgIHBBQ0luZm8tPm51bV9mbG93c1tTTUVfUU9TX1RTUEVDX0lOREVYXzFdID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBTTUVfUU9TX0lOSVQ6CisgICAgICAgICBjYXNlIFNNRV9RT1NfQ0xPU0VEOgorICAgICAgICAgICAgLy9OT1AKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBTTUVfUU9TX0xJTktfVVA6CisgICAgICAgICBjYXNlIFNNRV9RT1NfUkVRVUVTVEVEOgorICAgICAgICAgY2FzZSBTTUVfUU9TX1FPU19PTjoKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBBQyAlZCBpcyBpbiB3cm9uZyBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGFjLCBwQUNJbmZvLT5jdXJyX3N0YXRlKTsKKyAgICAgICAgICAgIC8vQVNTRVJUCisgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisgICAvL25lZWQgdG8gY2xlYW4gdXAgZmxvd3MKKyAgIHNtZV9Rb3NEZWxldGVFeGlzdGluZ0Zsb3dzKHBNYWMsIHNlc3Npb25JZCk7CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQcm9jZXNzSGFuZG9mZkFzc29jUmVxRXYoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgIFNNRV9RT1NfQ1NSX0hBTkRPRkZfQVNTT0NfUkVRIGV2ZW50IGluZGljYXRpb24gZnJvbSBDU1IKKyAgXHBhcmFtIHBFdmVudF9pbmZvIC0gUG9pbnRlciB0byByZWxldmFudCBpbmZvIGZyb20gQ1NSLiAgIAorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NIYW5kb2ZmQXNzb2NSZXFFdih0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLCB2b2lkICogcEV2ZW50X2luZm8pCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIHZfVThfdCBhYzsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKyAgIGZvcihhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSAKKyAgIHsKKyAgICAgIHBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworICAgICAgc3dpdGNoKHBBQ0luZm8tPmN1cnJfc3RhdGUpCisgICAgICB7CisgICAgICAgICBjYXNlIFNNRV9RT1NfTElOS19VUDoKKyAgICAgICAgIGNhc2UgU01FX1FPU19SRVFVRVNURUQ6CisgICAgICAgICBjYXNlIFNNRV9RT1NfUU9TX09OOgorICAgICAgICAgICAgc21lX1Fvc1N0YXRlVHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLCBTTUVfUU9TX0hBTkRPRkYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFNNRV9RT1NfSEFORE9GRjoKKyAgICAgICAgICAgIC8vcHJpbnQgZXJyb3IgbXNnCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5mdEhhbmRvZmZJblByb2dyZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IFNNRV9RT1NfQ1NSX0hBTkRPRkZfQVNTT0NfUkVRIHJlY2VpdmVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiU01FX1FPU19IQU5ET0ZGIHN0YXRlIHdpdGggRlQgaW4gcHJvZ3Jlc3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgCisgICAgICAgICAgICAgICBicmVhazsgCisgICAgICAgICAgICB9CisjZW5kaWYgICAgICAgICAgICAKKworICAgICAgICAgY2FzZSBTTUVfUU9TX0NMT1NFRDoKKyAgICAgICAgIGNhc2UgU01FX1FPU19JTklUOgorICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIEFDICVkIGlzIGluIHdyb25nIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMsIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworICAgICAgICAgICAgLy9BU1NFUlQKKyAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKyAgIC8vIElmIEZUIGhhbmRvZmYgaXMgaW4gcHJvZ3Jlc3MsIGxlZ2FjeSBoYW5kb2ZmIG5lZWQgbm90IGJlIGVuYWJsZWQKKyAgIGlmICghcFNlc3Npb24tPmZ0SGFuZG9mZkluUHJvZ3Jlc3MpIHsKKyAgICAgICBwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCA9IFZPU19UUlVFOworICAgfQorICAgLy8gdGhpcyBzZXNzaW9uIG5vIGxvbmdlciBuZWVkcyBVQVBTRAorICAgcFNlc3Npb24tPmFwc2RNYXNrID0gMDsKKyAgIC8vIGRvIGFueSBzZXNzaW9ucyBzdGlsbCByZXF1aXJlIFVBUFNEPworICAgaWYgKCFzbWVfUW9zSXNVYXBzZEFjdGl2ZSgpKQorICAgeworICAgICAgLy8gTm8gc2Vzc2lvbnMgcmVxdWlyZSBVQVBTRCBzbyB0dXJuIGl0IG9mZgorICAgICAgLy8gKHJlYWxseSBkb24ndCBjYXJlIHdoZW4gUE1DIHN0b3BzIGl0KQorICAgICAgKHZvaWQpcG1jU3RvcFVhcHNkKHBNYWMpOworICAgfQorICAgcFNlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCA9IFZPU19GQUxTRTsKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1Byb2Nlc3NIYW5kb2ZmU3VjY2Vzc0V2KCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICBTTUVfUU9TX0NTUl9IQU5ET0ZGX0NPTVBMRVRFIGV2ZW50IGluZGljYXRpb24gZnJvbSBDU1IKKyAgXHBhcmFtIHBFdmVudF9pbmZvIC0gUG9pbnRlciB0byByZWxldmFudCBpbmZvIGZyb20gQ1NSLiAgIAorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NIYW5kb2ZmU3VjY2Vzc0V2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHZvaWQgKiBwRXZlbnRfaW5mbykKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgdl9VOF90IGFjOworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBpbnZva2VkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgLy9nbyBiYWNrIHRvIG9yaWdpbmFsIHN0YXRlIGJlZm9yZSBoYW5kb2ZmCisgICBmb3IoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykgCisgICB7CisgICAgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKyAgICAgIHN3aXRjaChwQUNJbmZvLT5jdXJyX3N0YXRlKQorICAgICAgeworICAgICAgICAgY2FzZSBTTUVfUU9TX0hBTkRPRkY6CisgICAgICAgICAgICBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIHBBQ0luZm8tPnByZXZfc3RhdGUpOworICAgICAgICAgICAgLy93ZSB3aWxsIHJldHJ5IGZvciB0aGUgcmVxdWVzdGVkIGZsb3cocykgd2l0aCB0aGUgbmV3IEFQCisgICAgICAgICAgICBpZihTTUVfUU9TX1JFUVVFU1RFRCA9PSBwQUNJbmZvLT5jdXJyX3N0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9zdGF0ZSA9IFNNRV9RT1NfTElOS19VUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIC8vIEZUIGxvZ2ljLCBoYXMgYWxyZWFkeSBtb3ZlZCBpdCB0byBRT1NfUkVRVUVTVEVEIHN0YXRlIGR1cmluZyB0aGUgCisgICAgICAgICAvLyByZWFzc29jIHJlcXVlc3QgZXZlbnQsIHdoaWNoIHdvdWxkIGluY2x1ZGUgdGhlIFFvcyAoVFNQRUMpIHBhcmFtcworICAgICAgICAgLy8gaW4gdGhlIHJlYXNzb2MgcmVxIGZyYW1lCisgICAgICAgICBjYXNlIFNNRV9RT1NfUkVRVUVTVEVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFNNRV9RT1NfSU5JVDoKKyAgICAgICAgIGNhc2UgU01FX1FPU19DTE9TRUQ6CisgICAgICAgICBjYXNlIFNNRV9RT1NfTElOS19VUDoKKyAgICAgICAgIGNhc2UgU01FX1FPU19RT1NfT046CisgICAgICAgICBkZWZhdWx0OgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKiBJbiBjYXNlIG9mIDExciAtIFJJQywgd2UgcmVxdWVzdCBRb1MgYW5kIEhhbmQtb2ZmIGF0IHRoZSBzYW1lIHRpbWUgaGVuY2UgdGhlCisgICBzdGF0ZSBtYXkgYmUgU01FX1FPU19SRVFVRVNURUQgKi8KKyAgICAgICAgICAgIGlmKCBwU2Vzc2lvbi0+ZnRIYW5kb2ZmSW5Qcm9ncmVzcyApCisgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgQUMgJWQgaXMgaW4gd3Jvbmcgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBhYywgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisgICAgICAgICAgICAvL0FTU0VSVAorICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQcm9jZXNzSGFuZG9mZkZhaWx1cmVFdigpIC0gRnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUKKyAgU01FX1FPU19DU1JfSEFORE9GRl9GQUlMVVJFIGV2ZW50IGluZGljYXRpb24gZnJvbSBDU1IKKyAgXHBhcmFtIHBFdmVudF9pbmZvIC0gUG9pbnRlciB0byByZWxldmFudCBpbmZvIGZyb20gQ1NSLiAgIAorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NIYW5kb2ZmRmFpbHVyZUV2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHZvaWQgKiBwRXZlbnRfaW5mbykKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgdl9VOF90IGFjOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBpbnZva2VkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgZm9yKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspIAorICAgeworICAgICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICAgICBzd2l0Y2gocEFDSW5mby0+Y3Vycl9zdGF0ZSkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgU01FX1FPU19IQU5ET0ZGOgorICAgICAgICAgICAgc21lX1Fvc1N0YXRlVHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLCBTTUVfUU9TX0lOSVQpOworICAgICAgICAgICAgLy9uZWVkIHRvIGNsZWFuIHVwIGZsb3dzOiBUT0RPCisgICAgICAgICAgICB2b3NfbWVtX3plcm8oJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZwQUNJbmZvLT5jdXJyX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8xXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKyAgICAgICAgICAgIHZvc19tZW1femVybygmcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bU01FX1FPU19UU1BFQ19JTkRFWF8xXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKyAgICAgICAgICAgIHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzID0gU01FX1FPU19UU1BFQ19NQVNLX0NMRUFSOworICAgICAgICAgICAgcEFDSW5mby0+dHNwZWNfcGVuZGluZyA9IDA7CisgICAgICAgICAgICBwQUNJbmZvLT5udW1fZmxvd3NbU01FX1FPU19UU1BFQ19JTkRFWF8wXSA9IDA7CisgICAgICAgICAgICBwQUNJbmZvLT5udW1fZmxvd3NbU01FX1FPU19UU1BFQ19JTkRFWF8xXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgU01FX1FPU19JTklUOgorICAgICAgICAgY2FzZSBTTUVfUU9TX0NMT1NFRDoKKyAgICAgICAgIGNhc2UgU01FX1FPU19MSU5LX1VQOgorICAgICAgICAgY2FzZSBTTUVfUU9TX1JFUVVFU1RFRDoKKyAgICAgICAgIGNhc2UgU01FX1FPU19RT1NfT046CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgQUMgJWQgaXMgaW4gd3Jvbmcgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBhYywgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisgICAgICAgICAgICAvL0FTU0VSVAorICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorICAgLy9ubyBsb25nZXIgaW4gaGFuZG9mZgorICAgcFNlc3Npb24tPmhhbmRvZmZSZXF1ZXN0ZWQgPSBWT1NfRkFMU0U7CisgICAvL2NsZWFuIHVwIHRoZSBhc3NvYyBpbmZvCisgICBpZihwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjKQorICAgeworICAgICAgdm9zX21lbV9mcmVlKHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MpOworICAgICAgcFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYyA9IE5VTEw7CisgICB9CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQcm9jZXNzRGlzY29ubmVjdEV2KCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICBTTUVfUU9TX0NTUl9ESVNDT05ORUNUX1JFUSBvciAgU01FX1FPU19DU1JfRElTQ09OTkVDVF9JTkQgZXZlbnQgaW5kaWNhdGlvbiAKKyAgZnJvbSBDU1IKKyAgXHBhcmFtIHBFdmVudF9pbmZvIC0gUG9pbnRlciB0byByZWxldmFudCBpbmZvIGZyb20gQ1NSLiAgIAorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NEaXNjb25uZWN0RXYodHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCwgdm9pZCAqIHBFdmVudF9pbmZvKQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKyAgIGlmKChwU2Vzc2lvbi0+aGFuZG9mZlJlcXVlc3RlZCkKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyogSW4gY2FzZSBvZiAxMXIgLSBSSUMsIHdlIHJlcXVlc3QgUW9TIGFuZCBIYW5kLW9mZiBhdCB0aGUgc2FtZSB0aW1lIGhlbmNlIHRoZQorICAgc3RhdGUgbWF5IGJlIFNNRV9RT1NfUkVRVUVTVEVEICovCisgICAgICAmJiAhcFNlc3Npb24tPmZ0SGFuZG9mZkluUHJvZ3Jlc3MKKyNlbmRpZgorICAgICAgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBubyBuZWVkIGZvciBzdGF0ZSB0cmFuc2l0aW9uLCBzaG91bGQgIgorICAgICAgICAgICAgICAgICJhbHJlYWR5IGJlIGluIGhhbmRvZmYgc3RhdGUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgVk9TX0FTU0VSVChwU2Vzc2lvbi0+YWNfaW5mb1swXS5jdXJyX3N0YXRlID09IFNNRV9RT1NfSEFORE9GRik7CisgICAgICBWT1NfQVNTRVJUKHBTZXNzaW9uLT5hY19pbmZvWzFdLmN1cnJfc3RhdGUgPT0gU01FX1FPU19IQU5ET0ZGKTsKKyAgICAgIFZPU19BU1NFUlQocFNlc3Npb24tPmFjX2luZm9bMl0uY3Vycl9zdGF0ZSA9PSBTTUVfUU9TX0hBTkRPRkYpOworICAgICAgVk9TX0FTU0VSVChwU2Vzc2lvbi0+YWNfaW5mb1szXS5jdXJyX3N0YXRlID09IFNNRV9RT1NfSEFORE9GRik7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKyAgIHNtZV9Rb3NJbml0QUNzKHBNYWMsIHNlc3Npb25JZCk7CisgICAvLyB0aGlzIHNlc3Npb24gZG9lc24ndCByZXF1aXJlIFVBUFNECisgICBwU2Vzc2lvbi0+YXBzZE1hc2sgPSAwOworICAgLy8gZG8gYW55IHNlc3Npb25zIHN0aWxsIHJlcXVpcmUgVUFQU0Q/CisgICBpZiAoIXNtZV9Rb3NJc1VhcHNkQWN0aXZlKCkpCisgICB7CisgICAgICAvLyBObyBzZXNzaW9ucyByZXF1aXJlIFVBUFNEIHNvIHR1cm4gaXQgb2ZmCisgICAgICAvLyAocmVhbGx5IGRvbid0IGNhcmUgd2hlbiBQTUMgc3RvcHMgaXQpCisgICAgICAodm9pZClwbWNTdG9wVWFwc2QocE1hYyk7CisgICB9CisgICBwU2Vzc2lvbi0+dWFwc2RBbHJlYWR5UmVxdWVzdGVkID0gVk9TX0ZBTFNFOworICAgcFNlc3Npb24tPmhhbmRvZmZSZXF1ZXN0ZWQgPSBWT1NfRkFMU0U7CisgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfVFJVRTsKKyAgIHBTZXNzaW9uLT5yb2FtSUQgPSAwOworICAgLy9uZWVkIHRvIGNsZWFuIHVwIGJ1ZmZlcmVkIHJlcQorICAgc21lX1Fvc0RlbGV0ZUJ1ZmZlcmVkUmVxdWVzdHMocE1hYywgc2Vzc2lvbklkKTsKKyAgIC8vbmVlZCB0byBjbGVhbiB1cCBmbG93cworICAgc21lX1Fvc0RlbGV0ZUV4aXN0aW5nRmxvd3MocE1hYywgc2Vzc2lvbklkKTsKKyAgIC8vY2xlYW4gdXAgdGhlIGFzc29jIGluZm8KKyAgIGlmKHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MpCisgICB7CisgICAgICB2b3NfbWVtX2ZyZWUocFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYyk7CisgICAgICBwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjID0gTlVMTDsKKyAgIH0KKyAgIHNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdLnNlc3Npb25BY3RpdmUgPSBWT1NfRkFMU0U7CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQcm9jZXNzSm9pblJlcUV2KCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICBTTUVfUU9TX0NTUl9KT0lOX1JFUSBldmVudCBpbmRpY2F0aW9uIGZyb20gQ1NSCisgIFxwYXJhbSBwRXZlbnRfaW5mbyAtIFBvaW50ZXIgdG8gcmVsZXZhbnQgaW5mbyBmcm9tIENTUi4gICAKKyAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzSm9pblJlcUV2KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCBzZXNzaW9uSWQsIHZvaWQgKiBwRXZlbnRfaW5mbykKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKyAgIGlmKHBTZXNzaW9uLT5oYW5kb2ZmUmVxdWVzdGVkKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBubyBuZWVkIGZvciBzdGF0ZSB0cmFuc2l0aW9uLCBzaG91bGQgIgorICAgICAgICAgICAgICAgICJhbHJlYWR5IGJlIGluIGhhbmRvZmYgc3RhdGUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgVk9TX0FTU0VSVChwU2Vzc2lvbi0+YWNfaW5mb1swXS5jdXJyX3N0YXRlID09IFNNRV9RT1NfSEFORE9GRik7CisgICAgICBWT1NfQVNTRVJUKHBTZXNzaW9uLT5hY19pbmZvWzFdLmN1cnJfc3RhdGUgPT0gU01FX1FPU19IQU5ET0ZGKTsKKyAgICAgIFZPU19BU1NFUlQocFNlc3Npb24tPmFjX2luZm9bMl0uY3Vycl9zdGF0ZSA9PSBTTUVfUU9TX0hBTkRPRkYpOworICAgICAgVk9TX0FTU0VSVChwU2Vzc2lvbi0+YWNfaW5mb1szXS5jdXJyX3N0YXRlID09IFNNRV9RT1NfSEFORE9GRik7CisgICAgICAvL2J1ZmZlciB0aGUgZXhpc3RpbmcgZmxvd3MgdG8gYmUgcmVuZXdlZCBhZnRlciBoYW5kb2ZmIGlzIGRvbmUKKyAgICAgIHNtZV9Rb3NCdWZmZXJFeGlzdGluZ0Zsb3dzKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAvL2NsZWFuIHVwIHRoZSBjb250cm9sIGJsb2NrIHBhcnRpYWxseSBmb3IgaGFuZG9mZgorICAgICAgc21lX1Fvc0NsZWFudXBDdHJsQmxrRm9ySGFuZG9mZihwTWFjLCBzZXNzaW9uSWQpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIGZvcihhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSAKKyAgIHsKKyAgICAgIHNtZV9Rb3NTdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbklkLCBhYywgU01FX1FPU19JTklUKTsKKyAgIH0KKyAgIC8vY2xlYW4gdXAgdGhlIGFzc29jIGluZm8gaWYgYWxyZWFkeSBzZXQKKyAgIGlmKHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MpCisgICB7CisgICAgICB2b3NfbWVtX2ZyZWUocFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYyk7CisgICAgICBwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjID0gTlVMTDsKKyAgIH0KKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQcm9jZXNzUHJlYXV0aFN1Y2Nlc3NJbmQoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgIFNNRV9RT1NfQ1NSX1BSRUFVVEhfU1VDQ0VTU19JTkQgZXZlbnQgaW5kaWNhdGlvbiBmcm9tIENTUgorCisgIFxwYXJhbSBwRXZlbnRfaW5mbyAtIFBvaW50ZXIgdG8gcmVsZXZhbnQgaW5mbyBmcm9tIENTUi4gICAKKyAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzUHJlYXV0aFN1Y2Nlc3NJbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCwgdm9pZCAqIHBFdmVudF9pbmZvKQoreworICAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgICB2X1U4X3QgYWM7CisgICAgZUhhbFN0YXR1cyAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgc2Vzc2lvbklkKTsKKworICAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworCisgICAgZm9yKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspCisgICAgeworICAgICAgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKworICAgICAgICBzd2l0Y2gocEFDSW5mby0+Y3Vycl9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTTUVfUU9TX0xJTktfVVA6CisgICAgICAgICAgICBjYXNlIFNNRV9RT1NfUkVRVUVTVEVEOgorICAgICAgICAgICAgY2FzZSBTTUVfUU9TX1FPU19PTjoKKyAgICAgICAgICAgICAgICBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfSEFORE9GRik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNNRV9RT1NfSEFORE9GRjoKKyAgICAgICAgICAgICAgICAvL3ByaW50IGVycm9yIG1zZworICAgICAgICAgICAgY2FzZSBTTUVfUU9TX0NMT1NFRDoKKyAgICAgICAgICAgIGNhc2UgU01FX1FPU19JTklUOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgQUMgJWQgaXMgaW4gd3Jvbmcgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMsIHBBQ0luZm8tPmN1cnJfc3RhdGUpOworICAgICAgICAgICAgICAgIC8vQVNTRVJUCisgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBTZXNzaW9uLT5mdEhhbmRvZmZJblByb2dyZXNzID0gVk9TX1RSVUU7CisKKyAgICAvLyBDaGVjayBpZiBpdHMgYSAxMVIgcm9hbWluZyBiZWZvcmUgcHJlcGFyaW5nIHRoZSBSSUMgSUVzCisgICAgaWYgKGNzclJvYW1JczExckFzc29jKHBNYWMpKSAKKyAgICB7CisgICAgICAgIHZfVTE2X3QgcmljT2Zmc2V0ID0gMDsKKyAgICAgICAgdl9VMzJfdCByaWNJRUxlbmd0aCA9IDA7CisgICAgICAgIHZfVThfdCAgKnJpY0lFOworICAgICAgICB2X1U4X3QgIHRzcGVjX21hc2tfc3RhdHVzID0gMDsKKyAgICAgICAgdl9VOF90ICB0c3BlY19wZW5kaW5nX3N0YXR1cyA9IDA7CisKKyAgICAgICAgLyogQW55IEJsb2NrIEFjayBpbmZvIHRoZXJlLCBzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgZmlsbGVkIGJ5IFBFIGFuZCBwcmVzZW50IGluIHRoaXMgYnVmZmVyCisgICAgICAgICAgIGFuZCB0aGUgcmljX2llc19sZW5ndGggc2hvdWxkIGNvbnRhaW4gdGhlIGxlbmd0aCBvZiB0aGUgd2hvbGUgUklDIElFcy4gRmlsbGluZyBvZiBUU1BFQyBpbmZvCisgICAgICAgICAgIHNob3VsZCBzdGFydCBmcm9tIHRoaXMgbGVuZ3RoICovCisgICAgICAgIHJpY0lFID0gcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcC0+cmljX2llczsKKyAgICAgICAgcmljT2Zmc2V0ID0gcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcC0+cmljX2llc19sZW5ndGg7CisKKyAgICAgICAgLyogTm93IHdlIGhhdmUgdG8gcHJvY2VzcyB0aGUgY3VycmVudFRzcGVJbmZvIGluc2lkZSB0aGlzIHNlc3Npb24gYW5kIGNyZWF0ZSB0aGUgUklDIElFcyAqLworICAgICAgICBmb3IoYWMgPSBTTUVfUU9TX0VEQ0FfQUNfQkU7IGFjIDwgU01FX1FPU19FRENBX0FDX01BWDsgYWMrKykKKyAgICAgICAgeworICAgICAgICAgICAgdm9sYXRpbGUgdl9VOF90ICAgdHNwZWNfaW5kZXggPSAwOworCisgICAgICAgICAgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKyAgICAgICAgICAgIHRzcGVjX3BlbmRpbmdfc3RhdHVzID0gcEFDSW5mby0+dHNwZWNfcGVuZGluZzsKKyAgICAgICAgICAgIHRzcGVjX21hc2tfc3RhdHVzID0gcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXM7CisgICAgICAgICAgICB2b3NfbWVtX3plcm8ocEFDSW5mby0+cmljSWRlbnRpZmllciwgU01FX1FPU19UU1BFQ19JTkRFWF9NQVgpOworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgICAgIEZMKCJBQyAlZCA9PT4gVFNQRUMgc3RhdHVzID0gJWQsIHRzcGVjIHBlbmRpbmcgPSAlZCIpLCAKKyAgICAgICAgICAgICAgICAgICAgYWMsIHRzcGVjX21hc2tfc3RhdHVzLCB0c3BlY19wZW5kaW5nX3N0YXR1cyk7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRzcGVjX21hc2tfc3RhdHVzICYgMHgxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgYSB0c3BlYyBzdGF0dXMgaXMgcGVuZGluZywgdGFrZSByZXF1ZXN0ZWRfUW9TSW5mbyBmb3IgUklDIHJlcXVlc3QsIGVsc2UgdXNlIGN1cnJfUW9TSW5mbworICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIFJJQyByZXF1ZXN0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICh0c3BlY19wZW5kaW5nX3N0YXR1cyAmIDB4MSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX1Fvc0NyZWF0ZVRzcGVjUklDSUUocE1hYywgJnBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RzcGVjX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmljSUUgKyByaWNPZmZzZXQsICZyaWNJRUxlbmd0aCwgJnBBQ0luZm8tPnJpY0lkZW50aWZpZXJbdHNwZWNfaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9Rb3NDcmVhdGVUc3BlY1JJQ0lFKHBNYWMsICZwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWNJRSArIHJpY09mZnNldCwgJnJpY0lFTGVuZ3RoLCAmcEFDSW5mby0+cmljSWRlbnRpZmllclt0c3BlY19pbmRleF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJpY09mZnNldCArPSByaWNJRUxlbmd0aDsKKyAgICAgICAgICAgICAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwLT5yaWNfaWVzX2xlbmd0aCArPSByaWNJRUxlbmd0aDsKKworICAgICAgICAgICAgICAgIHRzcGVjX21hc2tfc3RhdHVzID4+PSAxOworICAgICAgICAgICAgICAgIHRzcGVjX3BlbmRpbmdfc3RhdHVzID4+PSAxOworICAgICAgICAgICAgICAgIHRzcGVjX2luZGV4Kys7CisgICAgICAgICAgICB9IHdoaWxlICh0c3BlY19tYXNrX3N0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1Byb2Nlc3NBZGRUc0ZhaWx1cmVSc3AoKSAtIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlCisgIEFkZHRzIHJlcXVlc3QgZmFpbHVyZSByZXNwb25zZSBjYW1lIGZyb20gUEUgCisgIAorICBXZSB3aWxsIG5vdGlmeSBIREQgb25seSBmb3IgdGhlIHJlcXVlc3RlZCBGbG93LCBvdGhlciBGbG93cyBydW5uaW5nIG9uIHRoZSBBQyAKKyAgc3RheSBpbnRhY3QKKyAgCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLiAgCisgIFxwYXJhbSBwUnNwIC0gUG9pbnRlciB0byB0aGUgYWRkdHMgcmVzcG9uc2Ugc3RydWN0dXJlIGNhbWUgZnJvbSBQRS4gICAKKyAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzQWRkVHNGYWlsdXJlUnNwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQWRkdHNSc3BJbmZvICogcFJzcCkKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisgICBzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5OworICAgdl9VOF90IHRzcGVjX3BlbmRpbmc7CisgICBzbWVfUW9zV21tVXBUeXBlIHVwID0gKHNtZV9Rb3NXbW1VcFR5cGUpcFJzcC0+dHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW87CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCBmb3IgVVAgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkLCB1cCk7CisgICBhYyA9IHNtZV9Rb3NVcFRvQWModXApOworICAgaWYoU01FX1FPU19FRENBX0FDX01BWCA9PSBhYykKKyAgIHsKKyAgICAgIC8vZXJyIG1zZworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IGludmFsaWQgQUMgJWQgZnJvbSBVUCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgYWMsIHVwKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKyAgIC8vIGlzIHRoZXJlIGEgVFNQRUMgcmVxdWVzdCBwZW5kaW5nIG9uIHRoaXMgQUM/CisgICB0c3BlY19wZW5kaW5nID0gcEFDSW5mby0+dHNwZWNfcGVuZGluZzsKKyAgIGlmKCF0c3BlY19wZW5kaW5nKQorICAgeworICAgICAgLy9BU1NFUlQKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIGFuIEFkZFRTIGlzIG5vdCBwZW5kaW5nIG9uIEFDICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICB2b3NfbWVtX3plcm8oJnNlYXJjaF9rZXksIHNpemVvZihzbWVfUW9zU2VhcmNoSW5mbykpOworICAgLy9zZXQgdGhlIGtleSB0eXBlICYgdGhlIGtleSB0byBiZSBzZWFyY2hlZCBpbiB0aGUgRmxvdyBMaXN0CisgICBzZWFyY2hfa2V5LmtleS5hY190eXBlID0gYWM7CisgICBzZWFyY2hfa2V5LmluZGV4ID0gU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzI7CisgICBzZWFyY2hfa2V5LnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc21lX1Fvc0ZpbmRBbGxJbkZsb3dMaXN0KHBNYWMsIHNlYXJjaF9rZXksIHNtZV9Rb3NBZGRUc0ZhaWx1cmVGbnApKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIG5vIG1hdGNoIGZvdW5kIGZvciBhYyA9ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2VhcmNoX2tleS5rZXkuYWNfdHlwZSk7CisgICAgICAvL0FTU0VSVAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgdm9zX21lbV96ZXJvKCZwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0sIAorICAgICAgICAgICAgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisKKyAgIGlmKCghcEFDSW5mby0+bnVtX2Zsb3dzWzBdKSYmCisgICAgICAoIXBBQ0luZm8tPm51bV9mbG93c1sxXSkpCisgICB7CisgICAgICBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1cyAmPSBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgJiAKKyAgICAgICAgICh+cEFDSW5mby0+dHNwZWNfcGVuZGluZyk7CisgICAgICBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfTElOS19VUCk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfUU9TX09OKTsKKyAgIH0KKyAgIHBBQ0luZm8tPnRzcGVjX3BlbmRpbmcgPSAwOworCisgICAodm9pZClzbWVfUW9zUHJvY2Vzc0J1ZmZlcmVkQ21kKHNlc3Npb25JZCk7CisKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zVXBkYXRlVHNwZWNNYXNrKCkgLSBVdGlsdGl0eSBmdW5jdGlvbiB0byB1cGRhdGUgdGhlIHRzcGVjLgorICBUeXBpY2FsIHVzYWdlIHdoaWxlIGFnZ3JlZ2F0aW5nIHVuaWRpcmVjdGlvbmFsIGZsb3dzIGludG8gYSBiaS1kaXJlY3Rpb25hbAorICBmbG93IG9uIEFDIHdoaWNoIGlzIHJ1bm5pbmcgbXVsdGlwbGUgZmxvd3MKKyAgCisgIFxwYXJhbSBzZXNzaW9uSWQgLSBTZXNzaW9uIHVwb24gd2hpY2ggdGhlIFRTUEVDIGlzIGJlaW5nIHVwZGF0ZWQKKyAgXHBhcmFtIGFjIC0gRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgRURDQSBBY2Nlc3MgQ2F0ZWdvcmllcy4KKyAgXHBhcmFtIG9sZF90c3BlY19tYXNrIC0gb24gd2hpY2ggdHNwZWMgcGVyIEFDLCB0aGUgdXBkYXRlIGlzIHJlcXVlc3RlZAorICBccGFyYW0gbmV3X3RzcGVjX21hc2sgLSB0c3BlYyB0byBiZSBzZXQgZm9yIHRoaXMgQUMKKyAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgZUhhbFN0YXR1cyBzbWVfUW9zVXBkYXRlVHNwZWNNYXNrKHZfVThfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NTZWFyY2hJbmZvIHNlYXJjaF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBuZXdfdHNwZWNfbWFzaykKK3sKKyAgIHRMaXN0RWxlbSAqcEVudHJ5PSBOVUxMLCAqcE5leHRFbnRyeSA9IE5VTEw7CisgICBzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCBmb3IgQUMgJWQgVFNQRUMgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkLCBzZWFyY2hfa2V5LmtleS5hY190eXBlLCBuZXdfdHNwZWNfbWFzayk7CisKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgCisgICBpZiAoc2VhcmNoX2tleS5rZXkuYWNfdHlwZSA8IFNNRV9RT1NfRURDQV9BQ19NQVgpCisgICB7CisgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW3NlYXJjaF9rZXkua2V5LmFjX3R5cGVdOworICAgfQorICAgZWxzZQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBFeGNlZWRlZCB0aGUgYXJyYXkgYm91bmRzIG9mIHBTZXNzaW9uLT5hY19pbmZvIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgIFZPU19BU1NFUlQgKDApOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZzbWVfUW9zQ2IuZmxvd19saXN0LCBWT1NfRkFMU0UgKTsKKyAgIGlmKCFwRW50cnkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogRmxvdyBMaXN0IGVtcHR5LCBub3RoaW5nIHRvIHVwZGF0ZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgd2hpbGUoIHBFbnRyeSApCisgICB7CisgICAgICBwTmV4dEVudHJ5ID0gY3NyTExOZXh0KCAmc21lX1Fvc0NiLmZsb3dfbGlzdCwgcEVudHJ5LCBWT1NfRkFMU0UgKTsKKyAgICAgIGZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgc21lX1Fvc0Zsb3dJbmZvRW50cnksIGxpbmsgKTsKKworICAgICAgaWYoc2VhcmNoX2tleS5zZXNzaW9uSWQgPT0gZmxvd19pbmZvLT5zZXNzaW9uSWQpCisgICAgICB7CisgICAgICAgICBpZihzZWFyY2hfa2V5LmluZGV4ICYgU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzQpCisgICAgICAgICB7CisgICAgICAgICAgICBpZigoc2VhcmNoX2tleS5rZXkuYWNfdHlwZSA9PSBmbG93X2luZm8tPmFjX3R5cGUpICYmCisgICAgICAgICAgICAgICAoc2VhcmNoX2tleS5kaXJlY3Rpb24gPT0gZmxvd19pbmZvLT5Rb1NJbmZvLnRzX2luZm8uZGlyZWN0aW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vbXNnCisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IEZsb3cgJWQgbWF0Y2hlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICAgICAgICAgICAgICBwQUNJbmZvLT5udW1fZmxvd3NbZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0tLTsKKyAgICAgICAgICAgICAgIHBBQ0luZm8tPm51bV9mbG93c1tuZXdfdHNwZWNfbWFzayAtIDFdKys7CisgICAgICAgICAgICAgICBmbG93X2luZm8tPnRzcGVjX21hc2sgPSBuZXdfdHNwZWNfbWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYoc2VhcmNoX2tleS5pbmRleCAmIFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF81KQorICAgICAgICAgeworICAgICAgICAgICAgaWYoKHNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPT0gZmxvd19pbmZvLT5hY190eXBlKSAmJgorICAgICAgICAgICAgICAgKHNlYXJjaF9rZXkudHNwZWNfbWFzayA9PSBmbG93X2luZm8tPnRzcGVjX21hc2spKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9tc2cKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogRmxvdyAlZCBtYXRjaGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgICAgICAgICAgICAgIHBBQ0luZm8tPm51bV9mbG93c1tmbG93X2luZm8tPnRzcGVjX21hc2sgLSAxXS0tOworICAgICAgICAgICAgICAgcEFDSW5mby0+bnVtX2Zsb3dzW25ld190c3BlY19tYXNrIC0gMV0rKzsKKyAgICAgICAgICAgICAgIGZsb3dfaW5mby0+dHNwZWNfbWFzayA9IG5ld190c3BlY19tYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisgICAgICBwRW50cnkgPSBwTmV4dEVudHJ5OworICAgfQorCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQcm9jZXNzQWRkVHNTdWNjZXNzUnNwKCkgLSBGdW5jdGlvbiB0byBwcm9jZXNzIHRoZQorICBBZGR0cyByZXF1ZXN0IHN1Y2Nlc3MgcmVzcG9uc2UgY2FtZSBmcm9tIFBFIAorICAKKyAgV2Ugd2lsbCBub3RpZnkgSEREIHdpdGggYWRkdHMgc3VjY2VzcyBmb3IgdGhlIHJlcXVlc3RlZCBGbG93LCAmIGZvciBvdGhlciAKKyAgRmxvd3MgcnVubmluZyBvbiB0aGUgQUMgd2Ugd2lsbCBzZW5kIGFuIGFkZHRzIG1vZGlmeSBzdGF0dXMgCisgIAorICAKKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuICAKKyAgXHBhcmFtIHBSc3AgLSBQb2ludGVyIHRvIHRoZSBhZGR0cyByZXNwb25zZSBzdHJ1Y3R1cmUgY2FtZSBmcm9tIFBFLiAgIAorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NBZGRUc1N1Y2Nlc3NSc3AodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJBZGR0c1JzcEluZm8gKiBwUnNwKQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisgICBzbWVfUW9zRWRjYUFjVHlwZSBhYywgYWNfaW5kZXg7CisgICBzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5OworICAgc21lX1Fvc1NlYXJjaEluZm8gc2VhcmNoX2tleTE7CisgICB2X1U4X3QgdHNwZWNfcGVuZGluZzsKKyAgIHRMaXN0RWxlbSAqcEVudHJ5PSBOVUxMOworICAgc21lX1Fvc0Zsb3dJbmZvRW50cnkgKmZsb3dfaW5mbyA9IE5VTEw7CisgICBzbWVfUW9zV21tVXBUeXBlIHVwID0gKHNtZV9Rb3NXbW1VcFR5cGUpcFJzcC0+dHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW87CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYocW9zLCB2b3NfZXZlbnRfd2xhbl9xb3NfcGF5bG9hZF90eXBlKTsKKyAgIHZvc19sb2dfcW9zX3RzcGVjX3BrdF90eXBlICpsb2dfcHRyID0gTlVMTDsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogaW52b2tlZCBvbiBzZXNzaW9uICVkIGZvciBVUCAlZCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICBzZXNzaW9uSWQsIHVwKTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgYWMgPSBzbWVfUW9zVXBUb0FjKHVwKTsKKyAgIGlmKFNNRV9RT1NfRURDQV9BQ19NQVggPT0gYWMpCisgICB7CisgICAgICAvL2VyciBtc2cKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBpbnZhbGlkIEFDICVkIGZyb20gVVAgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGFjLCB1cCk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIHBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworICAgLy8gaXMgdGhlcmUgYSBUU1BFQyByZXF1ZXN0IHBlbmRpbmcgb24gdGhpcyBBQz8KKyAgIHRzcGVjX3BlbmRpbmcgPSBwQUNJbmZvLT50c3BlY19wZW5kaW5nOworICAgaWYoIXRzcGVjX3BlbmRpbmcpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBhbiBBZGRUUyBpcyBub3QgcGVuZGluZyBvbiBBQyAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGFjKTsKKyAgICAgIC8vQVNTRVJUCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICAvL0FwcCBpcyBsb29raW5nIGZvciBBUFNEIG9yIHRoZSBBcHAgd2hpY2ggd2FzIGxvb2tpbmcgZm9yIEFQU0QgaGFzIGJlZW4gCisgICAvL3JlbGVhc2VkLCBzbyBTVEEgcmUtbmVnb3RpYXRlZCB3aXRoIEFQCisgICBpZihwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0udHNfaW5mby5wc2IpCisgICB7CisgICAgICAvL3VwZGF0ZSB0aGUgc2Vzc2lvbidzIGFwc2QgbWFzaworICAgICAgcFNlc3Npb24tPmFwc2RNYXNrIHw9IDEgPDwgKFNNRV9RT1NfRURDQV9BQ19WTyAtIGFjKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGlmKCgoU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUICYgfnRzcGVjX3BlbmRpbmcpID4gMCkgJiYKKyAgICAgICAgICgoU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xXzJfU0VUICYgfnRzcGVjX3BlbmRpbmcpIDw9IAorICAgICAgICAgICAgU01FX1FPU19UU1BFQ19JTkRFWF9NQVgpKQorICAgICAgeworICAgICAgaWYoIXBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvCisgICAgICAgICBbKFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMV8yX1NFVCAmIH50c3BlY19wZW5kaW5nKSAtIDFdLnRzX2luZm8ucHNiKQorICAgICAgeworICAgICAgICAgLy91cGRhdGUgdGhlIHNlc3Npb24ncyBhcHNkIG1hc2sKKyAgICAgICAgIHBTZXNzaW9uLT5hcHNkTWFzayAmPSB+KDEgPDwgKFNNRV9RT1NfRURDQV9BQ19WTyAtIGFjKSk7CisgICAgICB9CisgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IEV4Y2VlZGVkIHRoZSBhcnJheSBib3VuZHMgb2YgcEFDSW5mby0+cmVxdWVzdGVkX1Fvc0luZm8iLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgVk9TX0FTU0VSVCAoMCk7CisgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgIH0KKyAgIH0KKyAgIHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0gPSAKKyAgICAgIHBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXTsKKyAgIC8qIENoZWNrIGlmIHRoZSBjdXJyZW50IGZsb3cgaXMgZm9yIGJpLWRpcmVjdGlvbmFsLiBJZiBzbywgdXBkYXRlIHRoZSBudW1iZXIgb2YgZmxvd3MKKyAgICAqIHRvIHJlZmxlY3QgdGhhdCBhbGwgZmxvd3MgYXJlIGFnZ3JlZ2F0ZWQgaW50byB0c3BlYyBpbmRleCAwLiAqLworICAgaWYoKHBBQ0luZm8tPmN1cnJfUW9TSW5mb1twQUNJbmZvLT50c3BlY19wZW5kaW5nIC0gMV0udHNfaW5mby5kaXJlY3Rpb24gPT0gU01FX1FPU19XTU1fVFNfRElSX0JPVEgpICYmCisgICAgICAocEFDSW5mby0+bnVtX2Zsb3dzW1NNRV9RT1NfVFNQRUNfSU5ERVhfMV0gPiAwKSkKKyAgIHsKKyAgICAgdm9zX21lbV96ZXJvKCZzZWFyY2hfa2V5LCBzaXplb2Yoc21lX1Fvc1NlYXJjaEluZm8pKTsKKyAgICAgLyogdXBkYXRlIHRzcGVjX21hc2sgZm9yIGFsbCB0aGUgZmxvd3MgaGF2aW5nIFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMl9TRVQgdG8gU01FX1FPU19UU1BFQ19NQVNLX0JJVF8xX1NFVCAqLworICAgICBzZWFyY2hfa2V5LmtleS5hY190eXBlID0gYWM7CisgICAgIHNlYXJjaF9rZXkuaW5kZXggPSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfNTsKKyAgICAgc2VhcmNoX2tleS5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgIHNlYXJjaF9rZXkudHNwZWNfbWFzayA9IFNNRV9RT1NfVFNQRUNfTUFTS19CSVRfMl9TRVQ7CisgICAgIHNtZV9Rb3NVcGRhdGVUc3BlY01hc2soc2Vzc2lvbklkLCBzZWFyY2hfa2V5LCBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfU0VUKTsKKyAgIH0KKworICAgdm9zX21lbV96ZXJvKCZzZWFyY2hfa2V5MSwgc2l6ZW9mKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisgICAvL3NldCB0aGUgaG9yZW5ld2FsIGZpZWxkIGluIGNvbnRyb2wgYmxvY2sgaWYgbmVlZGVkCisgICBzZWFyY2hfa2V5MS5pbmRleCA9IFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8zOworICAgc2VhcmNoX2tleTEua2V5LnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1NFVFVQOworICAgc2VhcmNoX2tleTEuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgZm9yKGFjX2luZGV4ID0gU01FX1FPU19FRENBX0FDX0JFOyBhY19pbmRleCA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjX2luZGV4KyspCisgICB7CisgICAgICBwRW50cnkgPSBzbWVfUW9zRmluZEluRmxvd0xpc3Qoc2VhcmNoX2tleTEpOworICAgICAgaWYocEVudHJ5KQorICAgICAgeworICAgICAgICAgZmxvd19pbmZvID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayApOworICAgICAgICAgaWYoZmxvd19pbmZvLT5hY190eXBlID09IGFjKQorICAgICAgICAgeworICAgICAgICAgICAgcEFDSW5mby0+aG9SZW5ld2FsID0gZmxvd19pbmZvLT5ob1JlbmV3YWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyAgIHZvc19tZW1femVybygmc2VhcmNoX2tleSwgc2l6ZW9mKHNtZV9Rb3NTZWFyY2hJbmZvKSk7CisgICAvL3NldCB0aGUga2V5IHR5cGUgJiB0aGUga2V5IHRvIGJlIHNlYXJjaGVkIGluIHRoZSBGbG93IExpc3QKKyAgIHNlYXJjaF9rZXkua2V5LmFjX3R5cGUgPSBhYzsKKyAgIHNlYXJjaF9rZXkuaW5kZXggPSBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfMjsKKyAgIHNlYXJjaF9rZXkuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgLy9ub3RpZnkgSEREIHRoZSBzdWNjZXNzIGZvciB0aGUgcmVxdWVzdGVkIGZsb3cgCisgICAvL25vdGlmeSBhbGwgdGhlIG90aGVyIGZsb3dzIHJ1bm5pbmcgb24gdGhlIEFDIHRoYXQgUW9TIGdvdCBtb2RpZmllZAorICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzbWVfUW9zRmluZEFsbEluRmxvd0xpc3QocE1hYywgc2VhcmNoX2tleSwgc21lX1Fvc0FkZFRzU3VjY2Vzc0ZucCkpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgbm8gbWF0Y2ggZm91bmQgZm9yIGFjICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2VhcmNoX2tleS5rZXkuYWNfdHlwZSk7CisgICAgICAvL0FTU0VSVAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgcEFDSW5mby0+aG9SZW5ld2FsID0gVk9TX0ZBTFNFOworICAgdm9zX21lbV96ZXJvKCZwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0sIAorICAgICAgICAgICAgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisgICAvL2V2ZW50OiBFVkVOVF9XTEFOX1FPUworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgICAgICAgCisgICBxb3MuZXZlbnRJZCA9IFNNRV9RT1NfRElBR19BRERUU19SU1A7CisgICBxb3MucmVhc29uQ29kZSA9IFNNRV9RT1NfRElBR19BRERUU19BRE1JU1NJT05fQUNDRVBURUQ7CisgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmcW9zLCBFVkVOVF9XTEFOX1FPUyk7CisgICBXTEFOX1ZPU19ESUFHX0xPR19BTExPQyhsb2dfcHRyLCB2b3NfbG9nX3Fvc190c3BlY19wa3RfdHlwZSwgTE9HX1dMQU5fUU9TX1RTUEVDX0MpOworICAgaWYobG9nX3B0cikKKyAgIHsKKyAgICAgIGxvZ19wdHItPmRlbGF5X2JvdW5kID0gcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5kZWxheV9ib3VuZDsKKyAgICAgIGxvZ19wdHItPmluYWN0aXZpdHlfaW50ZXJ2YWwgPSBwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLmluYWN0aXZpdHlfaW50ZXJ2YWw7CisgICAgICBsb2dfcHRyLT5tYXhfYnVyc3Rfc2l6ZSA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubWF4X2J1cnN0X3NpemU7CisgICAgICBsb2dfcHRyLT5tYXhfc2VydmljZV9pbnRlcnZhbCA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubWF4X3NlcnZpY2VfaW50ZXJ2YWw7CisgICAgICBsb2dfcHRyLT5tYXhpbXVtX21zZHVfc2l6ZSA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubWF4aW11bV9tc2R1X3NpemU7CisgICAgICBsb2dfcHRyLT5tZWFuX2RhdGFfcmF0ZSA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubWVhbl9kYXRhX3JhdGU7CisgICAgICBsb2dfcHRyLT5tZWRpdW1fdGltZSA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubWVkaXVtX3RpbWU7CisgICAgICBsb2dfcHRyLT5taW5fZGF0YV9yYXRlID0gcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5taW5fZGF0YV9yYXRlOworICAgICAgbG9nX3B0ci0+bWluX3BoeV9yYXRlID0gcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5taW5fcGh5X3JhdGU7CisgICAgICBsb2dfcHRyLT5taW5fc2VydmljZV9pbnRlcnZhbCA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubWluX3NlcnZpY2VfaW50ZXJ2YWw7CisgICAgICBsb2dfcHRyLT5ub21pbmFsX21zZHVfc2l6ZSA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ubm9taW5hbF9tc2R1X3NpemU7CisgICAgICBsb2dfcHRyLT5wZWFrX2RhdGFfcmF0ZSA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0ucGVha19kYXRhX3JhdGU7CisgICAgICBsb2dfcHRyLT5zdXJwbHVzX2J3X2FsbG93YW5jZSA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0uc3VycGx1c19id19hbGxvd2FuY2U7CisgICAgICBsb2dfcHRyLT5zdXNwZW5zaW9uX2ludGVydmFsID0gcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5zdXJwbHVzX2J3X2FsbG93YW5jZTsKKyAgICAgIGxvZ19wdHItPnN1c3BlbnNpb25faW50ZXJ2YWwgPSBwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLnN1c3BlbnNpb25faW50ZXJ2YWw7CisgICAgICBsb2dfcHRyLT5zdmNfc3RhcnRfdGltZSA9IHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0uc3ZjX3N0YXJ0X3RpbWU7CisgICAgICBsb2dfcHRyLT50c2luZm9bMF0gPSBwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfcGVuZGluZyAtIDFdLnRzX2luZm8uZGlyZWN0aW9uIDw8IDUgfAorICAgICAgICAgcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS50c19pbmZvLnRpZCA8PCAxOworICAgICAgbG9nX3B0ci0+dHNpbmZvWzFdID0gcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS50c19pbmZvLnVwIDw8IDExIHwKKyAgICAgICAgIHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlY19wZW5kaW5nIC0gMV0udHNfaW5mby5wc2IgPDwgMTA7CisgICAgICBsb2dfcHRyLT50c2luZm9bMl0gPSAwOworICAgfQorICAgV0xBTl9WT1NfRElBR19MT0dfUkVQT1JUKGxvZ19wdHIpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgIGlmIChhYyA9PSBTTUVfUU9TX0VEQ0FfQUNfVk8pCisgICB7CisgICAgICAvLyBJbmRpY2F0ZSB0byBuZWlnaGJvciByb2FtIGxvZ2ljIG9mIHRoZSBuZXcgcmVxdWlyZWQgVk8KKyAgICAgIC8vIGFjIGJhbmR3aWR0aCByZXF1aXJlbWVudC4KKyAgICAgIGNzck5laWdoYm9yUm9hbUluZGljYXRlVm9pY2VCVyggcE1hYywgcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX3BlbmRpbmcgLSAxXS5wZWFrX2RhdGFfcmF0ZSwgVFJVRSApOworICAgfQorI2VuZGlmCisgICBwQUNJbmZvLT50c3BlY19wZW5kaW5nID0gMDsKKworICAgc21lX1Fvc1N0YXRlVHJhbnNpdGlvbihzZXNzaW9uSWQsIGFjLCBTTUVfUU9TX1FPU19PTik7CisKKworICAgKHZvaWQpc21lX1Fvc1Byb2Nlc3NCdWZmZXJlZENtZChzZXNzaW9uSWQpOworICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NBZ2dyZWdhdGVQYXJhbXMoKSAtIFV0aWx0aXR5IGZ1bmN0aW9uIHRvIGluY3JlYW1lbnQgdGhlIFRTUEVDIAorICBwYXJhbXMgcGVyIEFDLiBUeXBpY2FsIHVzYWdlIHdoaWxlIHVzaW5nIGZsb3cgYWdncmVnYXRpb24gb3IgZGVsZXRpb24gb2YgZmxvd3MKKyAgCisgIFxwYXJhbSBwSW5wdXRfVHNwZWNfSW5mbyAtIFBvaW50ZXIgdG8gc21lX1Fvc1dtbVRzcGVjSW5mbyB3aGljaCBjb250YWlucyB0aGUgCisgIFdNTSBUU1BFQyByZWxhdGVkIGluZm8gd2l0aCB3aGljaCBwQ3VycmVudF9Uc3BlY19JbmZvIHdpbGwgYmUgdXBkYXRlZAorICBccGFyYW0gcEN1cnJlbnRfVHNwZWNfSW5mbyAtIFBvaW50ZXIgdG8gc21lX1Fvc1dtbVRzcGVjSW5mbyB3aGljaCBjb250YWlucyAKKyAgY3VycmVudCB0aGUgV01NIFRTUEVDIHJlbGF0ZWQgaW5mbworCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NBZ2dyZWdhdGVQYXJhbXMoCisgICBzbWVfUW9zV21tVHNwZWNJbmZvICogcElucHV0X1RzcGVjX0luZm8sCisgICBzbWVfUW9zV21tVHNwZWNJbmZvICogcEN1cnJlbnRfVHNwZWNfSW5mbywKKyAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwVXBkYXRlZF9Uc3BlY19JbmZvKQoreworICAgc21lX1Fvc1dtbVRzcGVjSW5mbyBUc3BlY0luZm87CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgaWYoIXBJbnB1dF9Uc3BlY19JbmZvKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBpbnB1dCBpcyBOVUxMLCBub3RoaW5nIHRvIGFnZ3JlZ2F0ZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIGlmKCFwQ3VycmVudF9Uc3BlY19JbmZvKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBDdXJyZW50IGlzIE5VTEwsIGNhbid0IGFnZ3JlZ2F0ZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIHZvc19tZW1fY29weSgmVHNwZWNJbmZvLCBwQ3VycmVudF9Uc3BlY19JbmZvLCAKKyAgICAgICAgICAgICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykpOworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEFQU0QgcHJlZmVyZW5jZSBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgc2VydmljZSBpbnRlcnZhbCB3YXMgc2V0IGJ5IGFwcAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZihwQ3VycmVudF9Uc3BlY19JbmZvLT5taW5fc2VydmljZV9pbnRlcnZhbCAmJiBwSW5wdXRfVHNwZWNfSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWwpCisgICB7CisgICAgICBUc3BlY0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwgPSBWT1NfTUlOKAorICAgICAgICAgcEN1cnJlbnRfVHNwZWNfSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWwsCisgICAgICAgICBwSW5wdXRfVHNwZWNfSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWwpOworICAgfQorICAgZWxzZSBpZihwSW5wdXRfVHNwZWNfSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWwpCisgICB7CisgICAgICBUc3BlY0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwgPSBwSW5wdXRfVHNwZWNfSW5mby0+bWluX3NlcnZpY2VfaW50ZXJ2YWw7CisgICB9CisgICBpZihwQ3VycmVudF9Uc3BlY19JbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbCkKKyAgIHsKKyAgICAgIFRzcGVjSW5mby5tYXhfc2VydmljZV9pbnRlcnZhbCA9IFZPU19NSU4oCisgICAgICAgICBwQ3VycmVudF9Uc3BlY19JbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbCwKKyAgICAgICAgIHBJbnB1dF9Uc3BlY19JbmZvLT5tYXhfc2VydmljZV9pbnRlcnZhbCk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBUc3BlY0luZm8ubWF4X3NlcnZpY2VfaW50ZXJ2YWwgPSBwSW5wdXRfVHNwZWNfSW5mby0+bWF4X3NlcnZpY2VfaW50ZXJ2YWw7CisgICB9CisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgSWYgZGlyZWN0aW9ucyBkb24ndCBtYXRjaCwgaXQgbXVzdCBuZWNlc3NhcmlseSBiZSBib3RoIHVwbGluayBhbmQKKyAgICAgZG93bmxpbmsKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYocEN1cnJlbnRfVHNwZWNfSW5mby0+dHNfaW5mby5kaXJlY3Rpb24gIT0gCisgICAgICBwSW5wdXRfVHNwZWNfSW5mby0+dHNfaW5mby5kaXJlY3Rpb24pCisgICB7CisgICAgICBUc3BlY0luZm8udHNfaW5mby5kaXJlY3Rpb24gPSBTTUVfUU9TX1dNTV9UU19ESVJfQk9USDsKKyAgIH0KKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBNYXggTVNEVSBzaXplIDogdGhlc2Ugc2l6ZXMgYXJlIGBtYXhlZCcKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgVHNwZWNJbmZvLm1heGltdW1fbXNkdV9zaXplID0gVk9TX01BWChwQ3VycmVudF9Uc3BlY19JbmZvLT5tYXhpbXVtX21zZHVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0X1RzcGVjX0luZm8tPm1heGltdW1fbXNkdV9zaXplKTsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEluYWN0aXZpdHkgaW50ZXJ2YWwgOiB0aGVzZSBzaXplcyBhcmUgYG1heGVkJworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBUc3BlY0luZm8uaW5hY3Rpdml0eV9pbnRlcnZhbCA9IFZPU19NQVgocEN1cnJlbnRfVHNwZWNfSW5mby0+aW5hY3Rpdml0eV9pbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0X1RzcGVjX0luZm8tPmluYWN0aXZpdHlfaW50ZXJ2YWwpOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRGVsYXkgYm91bmRzOiBtaW4gb2YgYWxsIHZhbHVlcworICAgICBDaGVjayBvbiAwOiBpZiAwLCBpdCBtZWFucyBpbml0aWFsIHZhbHVlIHNpbmNlIGRlbGF5IGNhbiBuZXZlciBiZSAwISEKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYocEN1cnJlbnRfVHNwZWNfSW5mby0+ZGVsYXlfYm91bmQpCisgICB7CisgICAgICBUc3BlY0luZm8uZGVsYXlfYm91bmQgPSBWT1NfTUlOKHBDdXJyZW50X1RzcGVjX0luZm8tPmRlbGF5X2JvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRfVHNwZWNfSW5mby0+ZGVsYXlfYm91bmQpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgVHNwZWNJbmZvLmRlbGF5X2JvdW5kID0gcElucHV0X1RzcGVjX0luZm8tPmRlbGF5X2JvdW5kOworICAgfQorICAgVHNwZWNJbmZvLm1heF9idXJzdF9zaXplID0gVk9TX01BWChwQ3VycmVudF9Uc3BlY19JbmZvLT5tYXhfYnVyc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0X1RzcGVjX0luZm8tPm1heF9idXJzdF9zaXplKTsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIE5vbWluYWwgTVNEVSBzaXplIGFsc28gaGFzIGEgZml4ZWQgYml0IHRoYXQgbmVlZHMgdG8gYmUgYGhhbmRsZWQnIGJlZm9yZQorICAgICBhZ2dyZWdhdGlvbgorICAgICBUaGlzIGNhbiBiZSBoYW5kbGVkIG9ubHkgaWYgcHJldmlvdXMgc2l6ZSBpcyB0aGUgc2FtZSBhcyBuZXcgb3IgYm90aCBoYXZlCisgICAgIHRoZSBmaXhlZCBiaXQgc2V0CisgICAgIFRoZXNlIHNpemVzIGFyZSBub3QgYWRkZWQ6IGJ1dCBgbWF4ZWQnCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIFRzcGVjSW5mby5ub21pbmFsX21zZHVfc2l6ZSA9IFZPU19NQVgoCisgICAgICBwQ3VycmVudF9Uc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZSAmIH5TTUVfUU9TXzE2QklUX01TQiwKKyAgICAgIHBJbnB1dF9Uc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZSAmIH5TTUVfUU9TXzE2QklUX01TQik7CisKKyAgIGlmKCAoKHBDdXJyZW50X1RzcGVjX0luZm8tPm5vbWluYWxfbXNkdV9zaXplID09IDApIHx8CisgICAgICAgIChwQ3VycmVudF9Uc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZSAmIFNNRV9RT1NfMTZCSVRfTVNCKSkgJiYKKyAgICAgICAoKHBJbnB1dF9Uc3BlY19JbmZvLT5ub21pbmFsX21zZHVfc2l6ZSA9PSAwKSB8fAorICAgICAgICAocElucHV0X1RzcGVjX0luZm8tPm5vbWluYWxfbXNkdV9zaXplICYgU01FX1FPU18xNkJJVF9NU0IpKSkKKyAgIHsKKyAgICAgVHNwZWNJbmZvLm5vbWluYWxfbXNkdV9zaXplIHw9IFNNRV9RT1NfMTZCSVRfTVNCOworICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRGF0YSByYXRlczogCisgICAgIEFkZCB1cCB0aGUgcmF0ZXMgZm9yIGFnZ3JlZ2F0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIFNNRV9RT1NfQk9VTkRFRF9VMzJfQUREX1lfVE9fWCggVHNwZWNJbmZvLnBlYWtfZGF0YV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRfVHNwZWNfSW5mby0+cGVha19kYXRhX3JhdGUgKTsKKyAgIFNNRV9RT1NfQk9VTkRFRF9VMzJfQUREX1lfVE9fWCggVHNwZWNJbmZvLm1pbl9kYXRhX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dF9Uc3BlY19JbmZvLT5taW5fZGF0YV9yYXRlICk7CisgICAvKiBtZWFuIGRhdGEgcmF0ZSA9IHBlYWsgZGF0YSByYXRlOiBhZ2dyZWdhdGUgdG8gYmUgZmxleGlibGUgb24gYXBwcyAgKi8KKyAgIFNNRV9RT1NfQk9VTkRFRF9VMzJfQUREX1lfVE9fWCggVHNwZWNJbmZvLm1lYW5fZGF0YV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRfVHNwZWNfSW5mby0+bWVhbl9kYXRhX3JhdGUgKTsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFN1c3BlbnNpb24gaW50ZXJ2YWwgOiB0aGlzIGlzIHNldCB0byB0aGUgaW5hY3Rpdml0eSBpbnRlcnZhbCBzaW5jZSBwZXIKKyAgICAgc3BlYyBpdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gaW5hY3Rpdml0eSBpbnRlcnZhbAorICAgICBUaGlzIGlzIG5vdCBwcm92aWRlZCBieSBhcHAgc2luY2Ugd2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgdGhlIEhDQ0EKKyAgICAgbW9kZSBvZiBvcGVyYXRpb24KKyAgICAgQ3VycmVudGx5IHNldCBpdCB0byAwIHRvIGF2b2lkIGNvbmZ1c2lvbjogQ2lzY28gQ0NYIG5lZWRzIH4wOyBzcGVjIAorICAgICByZXF1aXJlcyBpbmFjdGl2aXR5IGludGVydmFsIHRvIGJlID4gc3VzcGVuc2lvbiBpbnRlcnZhbDogdGhpcyBjb3VsZAorICAgICBiZSB0cmlja3khCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIFRzcGVjSW5mby5zdXNwZW5zaW9uX2ludGVydmFsID0gMDsKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBSZW1haW5pbmcgcGFyYW1ldGVycyBkbyBub3QgY29tZSBmcm9tIGFwcCBhcyB0aGV5IGFyZSB2ZXJ5IFdMQU4KKyAgICAgYWlyIGludGVyZmFjZSBzcGVjaWZpYworICAgICBTZXQgbWVhbmluZ2Z1bCB2YWx1ZXMgaGVyZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBUc3BlY0luZm8ubWVkaXVtX3RpbWUgPSAwOyAgICAgICAgICAgICAgIC8qIHBlciBXTU0gc3BlYyAgICAgICAgICAgICAgICAgKi8KKyAgIFRzcGVjSW5mby5taW5fcGh5X3JhdGUgPSBTTUVfUU9TX01JTl9QSFlfUkFURTsKKyAgIFRzcGVjSW5mby5zdmNfc3RhcnRfdGltZSA9IDA7ICAgICAgICAgICAvKiBhcmJpdHJhcnkgICAgICAgICAgICAgICAgICAqLworICAgVHNwZWNJbmZvLnN1cnBsdXNfYndfYWxsb3dhbmNlICs9IHBJbnB1dF9Uc3BlY19JbmZvLT5zdXJwbHVzX2J3X2FsbG93YW5jZTsKKyAgIGlmKFRzcGVjSW5mby5zdXJwbHVzX2J3X2FsbG93YW5jZSA+IFNNRV9RT1NfU1VSUExVU19CV19BTExPV0FOQ0UpCisgICB7CisgICAgICBUc3BlY0luZm8uc3VycGx1c19id19hbGxvd2FuY2UgPSBTTUVfUU9TX1NVUlBMVVNfQldfQUxMT1dBTkNFOworICAgfQorICAgLyogU2V0IGFja19wb2xpY3kgdG8gYmxvY2sgYWNrIGV2ZW4gaWYgb25lIHN0cmVhbSByZXF1ZXN0cyBibG9jayBhY2sgcG9saWN5ICovCisgICBpZigocElucHV0X1RzcGVjX0luZm8tPnRzX2luZm8uYWNrX3BvbGljeSA9PSBTTUVfUU9TX1dNTV9UU19BQ0tfUE9MSUNZX0hUX0lNTUVESUFURV9CTE9DS19BQ0spIHx8CisgICAgICAocEN1cnJlbnRfVHNwZWNfSW5mby0+dHNfaW5mby5hY2tfcG9saWN5ID09IFNNRV9RT1NfV01NX1RTX0FDS19QT0xJQ1lfSFRfSU1NRURJQVRFX0JMT0NLX0FDSykpCisgICB7CisgICAgIFRzcGVjSW5mby50c19pbmZvLmFja19wb2xpY3kgPSBTTUVfUU9TX1dNTV9UU19BQ0tfUE9MSUNZX0hUX0lNTUVESUFURV9CTE9DS19BQ0s7CisgICB9CisKKyAgIGlmKHBJbnB1dF9Uc3BlY19JbmZvLT50c19pbmZvLmJ1cnN0X3NpemVfZGVmbiB8fCBwQ3VycmVudF9Uc3BlY19JbmZvLT50c19pbmZvLmJ1cnN0X3NpemVfZGVmbiApCisgICB7CisgICAgIFRzcGVjSW5mby50c19pbmZvLmJ1cnN0X3NpemVfZGVmbiA9IDE7CisgICB9CisgICBpZihwVXBkYXRlZF9Uc3BlY19JbmZvKQorICAgeworICAgICAgdm9zX21lbV9jb3B5KHBVcGRhdGVkX1RzcGVjX0luZm8sICZUc3BlY0luZm8sIAorICAgICAgICAgICAgICAgICAgIHNpemVvZihzbWVfUW9zV21tVHNwZWNJbmZvKSk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICB2b3NfbWVtX2NvcHkocEN1cnJlbnRfVHNwZWNfSW5mbywgJlRzcGVjSW5mbywgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKyAgIH0KKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1VwZGF0ZVBhcmFtcygpIC0gVXRpbHRpdHkgZnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBUU1BFQyAKKyAgcGFyYW1zIHBlciBBQy4gVHlwaWNhbCB1c2FnZSB3aGlsZSBkZWxldGluZyBmbG93cyBvbiBBQyB3aGljaCBpcyBydW5uaW5nCisgIG11bHRpcGxlIGZsb3dzCisgIAorICBccGFyYW0gc2Vzc2lvbklkIC0gU2Vzc2lvbiB1cG9uIHdoaWNoIHRoZSBUU1BFQyBpcyBiZWluZyB1cGRhdGVkCisgIFxwYXJhbSBhYyAtIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIEVEQ0EgQWNjZXNzIENhdGVnb3JpZXMuCisgIFxwYXJhbSB0c3BlY19tYXNrIC0gb24gd2hpY2ggdHNwZWMgcGVyIEFDLCB0aGUgdXBkYXRlIGlzIHJlcXVlc3RlZAorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBlSGFsU3RhdHVzIHNtZV9Rb3NVcGRhdGVQYXJhbXModl9VOF90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc0VkY2FBY1R5cGUgYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCB0c3BlY19tYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1dtbVRzcGVjSW5mbyAqIHBUc3BlY19JbmZvKQoreworICAgdExpc3RFbGVtICpwRW50cnk9IE5VTEwsICpwTmV4dEVudHJ5ID0gTlVMTDsKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgc21lX1Fvc0Zsb3dJbmZvRW50cnkgKmZsb3dfaW5mbyA9IE5VTEw7CisgICBzbWVfUW9zV21tVHNwZWNJbmZvIFRzcGVjX0luZm87CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IGludm9rZWQgb24gc2Vzc2lvbiAlZCBmb3IgQUMgJWQgVFNQRUMgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkLCBhYywgdHNwZWNfbWFzayk7CisgICBpZighcFRzcGVjX0luZm8pCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogb3V0cHV0IGlzIE5VTEwsIGNhbid0IGFnZ3JlZ2F0ZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIHZvc19tZW1femVybygmVHNwZWNfSW5mbywgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pKTsKKyAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZzbWVfUW9zQ2IuZmxvd19saXN0LCBWT1NfRkFMU0UgKTsKKyAgIGlmKCFwRW50cnkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogRmxvdyBMaXN0IGVtcHR5LCBub3RoaW5nIHRvIHVwZGF0ZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICAvL2luaXQgdGhlIFRTIGluZm8gZmllbGQKKyAgIFRzcGVjX0luZm8udHNfaW5mby51cCAgPSBwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfbWFzayAtIDFdLnRzX2luZm8udXA7CisgICBUc3BlY19JbmZvLnRzX2luZm8ucHNiID0gcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjX21hc2sgLSAxXS50c19pbmZvLnBzYjsKKyAgIFRzcGVjX0luZm8udHNfaW5mby50aWQgPSBwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWNfbWFzayAtIDFdLnRzX2luZm8udGlkOworICAgd2hpbGUoIHBFbnRyeSApCisgICB7CisgICAgICBwTmV4dEVudHJ5ID0gY3NyTExOZXh0KCAmc21lX1Fvc0NiLmZsb3dfbGlzdCwgcEVudHJ5LCBWT1NfRkFMU0UgKTsKKyAgICAgIGZsb3dfaW5mbyA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgc21lX1Fvc0Zsb3dJbmZvRW50cnksIGxpbmsgKTsKKyAgICAgIGlmKChzZXNzaW9uSWQgPT0gZmxvd19pbmZvLT5zZXNzaW9uSWQpICYmCisgICAgICAgICAoYWMgPT0gZmxvd19pbmZvLT5hY190eXBlKSAmJgorICAgICAgICAgKHRzcGVjX21hc2sgPT0gZmxvd19pbmZvLT50c3BlY19tYXNrKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogRmxvdyAlZCBtYXRjaGVzIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgICAgICAgIAorICAgICAgICAgaWYoKFNNRV9RT1NfUkVBU09OX1JFTEVBU0UgPT0gZmxvd19pbmZvLT5yZWFzb24gKSB8fAorICAgICAgICAgICAgKFNNRV9RT1NfUkVBU09OX01PRElGWSA9PSBmbG93X2luZm8tPnJlYXNvbikpCisgICAgICAgICB7CisgICAgICAgICAgICAvL21zZworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBTa2lwcGluZyBGbG93ICVkIGFzIGl0IGlzIG1hcmtlZCAiCisgICAgICAgICAgICAgICAgICAgICAgImZvciByZWxlYXNlL21vZGlmeSIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc21lX1Fvc0FnZ3JlZ2F0ZVBhcmFtcygmZmxvd19pbmZvLT5Rb1NJbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZUc3BlY19JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpKQorICAgICAgICAgeworICAgICAgICAgICAgLy9lcnIgbXNnCisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogc21lX1Fvc0FnZ3JlZ2F0ZVBhcmFtcygpIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBwRW50cnkgPSBwTmV4dEVudHJ5OworICAgfQorICAgLy8gcmV0dXJuIHRoZSBhZ2dyZWdhdGUKKyAgICpwVHNwZWNfSW5mbyA9IFRzcGVjX0luZm87CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NBY1RvVXAoKSAtIFV0aWx0aXR5IGZ1bmN0aW9uIHRvIG1hcCBhbiBBQyB0byBVUAorICBOb3RlOiB0aGVyZSBpcyBhIHF1YW50aXphdGlvbiBsb3NzIGhlcmUgYmVjYXVzZSA0IEFDcyBhcmUgbWFwcGVkIHRvIDggVVBzCisgIE1hcHBpbmcgaXMgZG9uZSBmb3IgY29uc2lzdGVuY3kKKyAgXHBhcmFtIGFjIC0gRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgRURDQSBBY2Nlc3MgQ2F0ZWdvcmllcy4KKyAgXHJldHVybiBhbiBVc2VyIFByaW9yaXR5CisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3NtZV9Rb3NXbW1VcFR5cGUgc21lX1Fvc0FjVG9VcChzbWVfUW9zRWRjYUFjVHlwZSBhYykKK3sKKyAgIHNtZV9Rb3NXbW1VcFR5cGUgdXAgPSBTTUVfUU9TX1dNTV9VUF9NQVg7CisgICBpZihhYyA+PSAwICYmIGFjIDwgU01FX1FPU19FRENBX0FDX01BWCkKKyAgIHsKKyAgICAgIHVwID0gc21lX1Fvc0FDdG9VUE1hcFthY107CisgICB9CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwgCisgICAgICAgICAgICAgIiVzOiAlZDogYWMgPSAlZCB1cCA9ICVkIHJldHVybmVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBhYywgdXApOworICAgcmV0dXJuIHVwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1VwVG9BYygpIC0gVXRpbHRpdHkgZnVuY3Rpb24gdG8gbWFwIGFuIFVQIHRvIEFDCisgIFxwYXJhbSB1cCAtIEVudW1lcmF0aW9uIG9mIHRoZSB2YXJpb3VzIFVzZXIgcHJpb3JpdGllcyAoVVApLgorICBccmV0dXJuIGFuIEFjY2VzcyBDYXRlZ29yeQorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzbWVfUW9zRWRjYUFjVHlwZSBzbWVfUW9zVXBUb0FjKHNtZV9Rb3NXbW1VcFR5cGUgdXApCit7CisgICBzbWVfUW9zRWRjYUFjVHlwZSBhYyA9IFNNRV9RT1NfRURDQV9BQ19NQVg7CisgICBpZih1cCA+PSAwICYmIHVwIDwgU01FX1FPU19XTU1fVVBfTUFYKQorICAgeworICAgICAgYWMgPSBzbWVfUW9zVVB0b0FDTWFwW3VwXTsKKyAgIH0KKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAKKyAgICAgICAgICAgICAiJXM6ICVkOiB1cCA9ICVkIGFjID0gJWQgcmV0dXJuZWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHVwLCBhYyk7CisgICByZXR1cm4gYWM7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKCkgLSBUaGUgc3RhdGUgdHJhbnNpdGlvbiBmdW5jdGlvbiBwZXIgQUMuIFdlCisgIHNhdmUgdGhlIHByZXZpb3VzIHN0YXRlIGFsc28uCisgIFxwYXJhbSBzZXNzaW9uSWQgLSBTZXNzaW9uIHVwb24gd2hpY2ggdGhlIHN0YXRlIG1hY2hpbmUgaXMgcnVubmluZworICBccGFyYW0gYWMgLSBFbnVtZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBFRENBIEFjY2VzcyBDYXRlZ29yaWVzLgorICBccGFyYW0gbmV3X3N0YXRlIC0gVGhlIHN0YXRlIEZTTSBpcyBtb3ZpbmcgdG8uCisgIAorICBccmV0dXJuIE5vbmUKKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgc21lX1Fvc1N0YXRlVHJhbnNpdGlvbih2X1U4X3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21lX1Fvc1N0YXRlcyBuZXdfc3RhdGUpCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICBwQUNJbmZvLT5wcmV2X3N0YXRlID0gcEFDSW5mby0+Y3Vycl9zdGF0ZTsKKyAgIHBBQ0luZm8tPmN1cnJfc3RhdGUgPSBuZXdfc3RhdGU7CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBuZXcgc3RhdGU9JWQsIG9sZCBzdGF0ZT0lZCwgZm9yIEFDPSVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAKKyAgICAgICAgICAgICBzZXNzaW9uSWQsIHBBQ0luZm8tPmN1cnJfc3RhdGUsIHBBQ0luZm8tPnByZXZfc3RhdGUsIGFjICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zRmluZEluRmxvd0xpc3QoKSAtIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCBhbiBmbG93IGVudHJ5IGZyb20KKyAgdGhlIGZsb3dfbGlzdC4KKyAgXHBhcmFtIHNlYXJjaF9rZXkgLSAgV2UgY2FuIGVpdGhlciB1c2UgdGhlIGZsb3dJRCBvciB0aGUgYWMgdHlwZSB0byBmaW5kIHRoZSAKKyAgZW50cnkgaW4gdGhlIGZsb3cgbGlzdC4KKyAgQSBiaXRtYXAgaW4gc21lX1Fvc1NlYXJjaEluZm8gdGVsbHMgd2hpY2gga2V5IHRvIHVzZS4gU3RhcnRpbmcgZnJvbSBMU0IsCisgIGJpdCAwIC0gRmxvdyBJRAorICBiaXQgMSAtIEFDIHR5cGUKKyAgXHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgZW50cnkgaW4gdGhlIGxpbmsgbGlzdAorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0TGlzdEVsZW0gKnNtZV9Rb3NGaW5kSW5GbG93TGlzdChzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5KQoreworICAgdExpc3RFbGVtICpwRW50cnk9IE5VTEwsICpwTmV4dEVudHJ5ID0gTlVMTDsKKyAgIHNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnNtZV9Rb3NDYi5mbG93X2xpc3QsIFZPU19GQUxTRSApOworICAgaWYoIXBFbnRyeSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBGbG93IExpc3QgZW1wdHksIGNhbid0IHNlYXJjaCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIHdoaWxlKCBwRW50cnkgKQorICAgeworICAgICAgcE5leHRFbnRyeSA9IGNzckxMTmV4dCggJnNtZV9Rb3NDYi5mbG93X2xpc3QsIHBFbnRyeSwgVk9TX0ZBTFNFICk7CisgICAgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rICk7CisgICAgICBpZigoc2VhcmNoX2tleS5zZXNzaW9uSWQgPT0gZmxvd19pbmZvLT5zZXNzaW9uSWQpIHx8CisgICAgICAgICAoc2VhcmNoX2tleS5zZXNzaW9uSWQgPT0gU01FX1FPU19TRUFSQ0hfU0VTU0lPTl9JRF9BTlkpKQorICAgICAgeworICAgICAgICAgaWYoc2VhcmNoX2tleS5pbmRleCAmIFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8xKQorICAgICAgICAgeworICAgICAgICAgICAgaWYoc2VhcmNoX2tleS5rZXkuUW9zRmxvd0lEID09IGZsb3dfaW5mby0+UW9zRmxvd0lEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9tc2cKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogbWF0Y2ggZm91bmQgb24gZmxvd0lELCBlbmRpbmcgc2VhcmNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZihzZWFyY2hfa2V5LmluZGV4ICYgU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzIpCisgICAgICAgICB7CisgICAgICAgICAgICBpZihzZWFyY2hfa2V5LmtleS5hY190eXBlID09IGZsb3dfaW5mby0+YWNfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vbXNnCisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IG1hdGNoIGZvdW5kIG9uIGFjLCBlbmRpbmcgc2VhcmNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZihzZWFyY2hfa2V5LmluZGV4ICYgU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzMpCisgICAgICAgICB7CisgICAgICAgICAgICBpZihzZWFyY2hfa2V5LmtleS5yZWFzb24gPT0gZmxvd19pbmZvLT5yZWFzb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL21zZworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBtYXRjaCBmb3VuZCBvbiByZWFzb24sIGVuZGluZyBzZWFyY2giLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmKHNlYXJjaF9rZXkuaW5kZXggJiBTTUVfUU9TX1NFQVJDSF9LRVlfSU5ERVhfNCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChzZWFyY2hfa2V5LmtleS5hY190eXBlID09IGZsb3dfaW5mby0+YWNfdHlwZSkgJiYgCisgICAgICAgICAgICAgICAoc2VhcmNoX2tleS5kaXJlY3Rpb24gPT0gZmxvd19pbmZvLT5Rb1NJbmZvLnRzX2luZm8uZGlyZWN0aW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vbXNnCisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IG1hdGNoIGZvdW5kIG9uIHJlYXNvbiwgZW5kaW5nIHNlYXJjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgICAgcEVudHJ5ID0gcE5leHRFbnRyeTsKKyAgIH0KKyAgIHJldHVybiBwRW50cnk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zRmluZEFsbEluRmxvd0xpc3QoKSAtIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCBhbiBmbG93IGVudHJ5IAorICBmcm9tIHRoZSBmbG93X2xpc3QgJiBhY3Qgb24gaXQuCisgIFxwYXJhbSBzZWFyY2hfa2V5IC0gIFdlIGNhbiBlaXRoZXIgdXNlIHRoZSBmbG93SUQgb3IgdGhlIGFjIHR5cGUgdG8gZmluZCB0aGUgCisgIGVudHJ5IGluIHRoZSBmbG93IGxpc3QuCisgIEEgYml0bWFwIGluIHNtZV9Rb3NTZWFyY2hJbmZvIHRlbGxzIHdoaWNoIGtleSB0byB1c2UuIFN0YXJ0aW5nIGZyb20gTFNCLAorICBiaXQgMCAtIEZsb3cgSUQKKyAgYml0IDEgLSBBQyB0eXBlCisgIFxwYXJhbSBmbnAgLSBmdW5jdGlvbiBwb2ludGVyIHNwZWNpZnlpbmcgdGhlIGFjdGlvbiB0eXBlIGZvciB0aGUgZW50cnkgZm91bmQKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc0ZpbmRBbGxJbkZsb3dMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zU2VhcmNoSW5mbyBzZWFyY2hfa2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NQcm9jZXNzU2VhcmNoRW50cnkgZm5wKQoreworICAgdExpc3RFbGVtICpwRW50cnk9IE5VTEwsICpwTmV4dEVudHJ5ID0gTlVMTDsKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZzbWVfUW9zQ2IuZmxvd19saXN0LCBWT1NfRkFMU0UgKTsKKyAgIGlmKCFwRW50cnkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogRmxvdyBMaXN0IGVtcHR5LCBjYW4ndCBzZWFyY2giLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICB3aGlsZSggcEVudHJ5ICkKKyAgIHsKKyAgICAgIHBOZXh0RW50cnkgPSBjc3JMTE5leHQoICZzbWVfUW9zQ2IuZmxvd19saXN0LCBwRW50cnksIFZPU19GQUxTRSApOworICAgICAgZmxvd19pbmZvID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayApOworICAgICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW2Zsb3dfaW5mby0+c2Vzc2lvbklkXTsKKyAgICAgIGlmKChzZWFyY2hfa2V5LnNlc3Npb25JZCA9PSBmbG93X2luZm8tPnNlc3Npb25JZCkgfHwKKyAgICAgICAgIChzZWFyY2hfa2V5LnNlc3Npb25JZCA9PSBTTUVfUU9TX1NFQVJDSF9TRVNTSU9OX0lEX0FOWSkpCisgICAgICB7CisgICAgICAgICBpZihzZWFyY2hfa2V5LmluZGV4ICYgU01FX1FPU19TRUFSQ0hfS0VZX0lOREVYXzEpCisgICAgICAgICB7CisgICAgICAgICAgICBpZihzZWFyY2hfa2V5LmtleS5Rb3NGbG93SUQgPT0gZmxvd19pbmZvLT5Rb3NGbG93SUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL21zZworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBtYXRjaCBmb3VuZCBvbiBmbG93SUQsIGVuZGluZyBzZWFyY2giLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgc3RhdHVzID0gZm5wKHBNYWMsIHBFbnRyeSk7CisgICAgICAgICAgICAgICBpZihlSEFMX1NUQVRVU19GQUlMVVJFID09IHN0YXR1cykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBGYWlsZWQgdG8gcHJvY2VzcyBlbnRyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYoc2VhcmNoX2tleS5pbmRleCAmIFNNRV9RT1NfU0VBUkNIX0tFWV9JTkRFWF8yKQorICAgICAgICAgeworICAgICAgICAgICAgaWYoc2VhcmNoX2tleS5rZXkuYWNfdHlwZSA9PSBmbG93X2luZm8tPmFjX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL21zZworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBtYXRjaCBmb3VuZCBvbiBhYywgZW5kaW5nIHNlYXJjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICBmbG93X2luZm8tPmhvUmVuZXdhbCA9IHBTZXNzaW9uLT5hY19pbmZvW2Zsb3dfaW5mby0+YWNfdHlwZV0uaG9SZW5ld2FsOworICAgICAgICAgICAgICAgc3RhdHVzID0gZm5wKHBNYWMsIHBFbnRyeSk7CisgICAgICAgICAgICAgICBpZihlSEFMX1NUQVRVU19GQUlMVVJFID09IHN0YXR1cykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBGYWlsZWQgdG8gcHJvY2VzcyBlbnRyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBFbnRyeSA9IHBOZXh0RW50cnk7CisgICB9CisgICByZXR1cm4gc3RhdHVzOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc0lzQUNNKCkgLSBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgcGFydGljdWxhciBBQworICBtYW5kYXRlcyBBZG1pc3Npb24gQ29udHJvbC4KKyAgXHBhcmFtIGFjIC0gRW51bWVyYXRpb24gb2YgdGhlIHZhcmlvdXMgRURDQSBBY2Nlc3MgQ2F0ZWdvcmllcy4KKyAgCisgIFxyZXR1cm4gVk9TX1RSVUUgaWYgdGhlIEFDIG1hbmRhdGVzIEFkbWlzc2lvbiBDb250cm9sCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfQk9PTF90IHNtZV9Rb3NJc0FDTSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCAKKyAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYywgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKyAgIHZfQk9PTF90IHJldF92YWwgPSBWT1NfRkFMU0U7CisgICB0RG90MTFmQmVhY29uSUVzICpwSWVzTG9jYWw7CisgICBpZighcFNpckJzc0Rlc2MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogcFNpckJzc0Rlc2MgaXMgTlVMTCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX0ZBTFNFOworICAgfQorCisgICBpZiAoTlVMTCAhPSBwSWVzKQorICAgeworICAgICAgLyogSUVzIHdlcmUgcHJvdmlkZWQgc28gdXNlIHRoZW0gbG9jYWxseSAqLworICAgICAgcEllc0xvY2FsID0gcEllczsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8qIElFcyB3ZXJlIG5vdCBwcm92aWRlZCBzbyBwYXJzZSB0aGVtIG91cnNlbHZlcyAqLworICAgICAgaWYgKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgcFNpckJzc0Rlc2MsICZwSWVzTG9jYWwpKSkKKyAgICAgIHsKKyAgICAgICAgIC8vZXJyIG1zZworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICIlczogJWQ6IGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKCkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfRkFMU0U7CisgICAgICB9CisKKyAgICAgIC8qIGlmIHN1Y2Nlc3MgdGhlbiBwSWVzTG9jYWwgd2FzIGFsbG9jYXRlZCAqLworICAgfQorCisgICBpZihDU1JfSVNfUU9TX0JTUyhwSWVzTG9jYWwpKQorICAgeworICAgICAgIHN3aXRjaChhYykKKyAgICAgICB7CisgICAgICAgICAgY2FzZSBTTUVfUU9TX0VEQ0FfQUNfQkU6CisgICAgICAgICAgICAgaWYocEllc0xvY2FsLT5XTU1QYXJhbXMuYWNiZV9hY20pIHJldF92YWwgPSBWT1NfVFJVRTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFNNRV9RT1NfRURDQV9BQ19CSzoKKyAgICAgICAgICAgICBpZihwSWVzTG9jYWwtPldNTVBhcmFtcy5hY2JrX2FjbSkgcmV0X3ZhbCA9IFZPU19UUlVFOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgU01FX1FPU19FRENBX0FDX1ZJOgorICAgICAgICAgICAgIGlmKHBJZXNMb2NhbC0+V01NUGFyYW1zLmFjdmlfYWNtKSByZXRfdmFsID0gVk9TX1RSVUU7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBTTUVfUU9TX0VEQ0FfQUNfVk86CisgICAgICAgICAgICAgaWYocEllc0xvY2FsLT5XTU1QYXJhbXMuYWN2b19hY20pIHJldF92YWwgPSBWT1NfVFJVRTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogdW5rbm93biBBQyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgYWMpOworICAgICAgICAgICAgIC8vQXNzZXJ0CisgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICB9Ly9JU19RT1NfQlNTCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICIlczogJWQ6IEFDTSA9ICVkIGZvciBBQyA9ICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCByZXRfdmFsLCBhYyApOworICAgaWYgKE5VTEwgPT0gcEllcykKKyAgIHsKKyAgICAgIC8qIElFcyB3ZXJlIGFsbG9jYXRlZCBsb2NhbGx5IHNvIGZyZWUgdGhlbSAqLworICAgICAgdm9zX21lbV9mcmVlKHBJZXNMb2NhbCk7CisgICB9CisgICByZXR1cm4gcmV0X3ZhbDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NCdWZmZXJFeGlzdGluZ0Zsb3dzKCkgLSBVdGlsaXR5IGZ1bmN0aW9uIHRvIGJ1ZmZlciB0aGUgZXhpc3RpbmcKKyAgZmxvd3MgaW4gZmxvd19saXN0LCBzbyB0aGF0IHdlIGNhbiByZW5ldyB0aGVtIGFmdGVyIGhhbmRvZmYgaXMgZG9uZS4KKworICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGVIYWxTdGF0dXMgc21lX1Fvc0J1ZmZlckV4aXN0aW5nRmxvd3ModHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBzZXNzaW9uSWQpCit7CisgICB0TGlzdEVsZW0gKnBFbnRyeT0gTlVMTCwgKnBOZXh0RW50cnkgPSBOVUxMOworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworICAgc21lX1Fvc0NtZEluZm8gIGNtZDsKKyAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZzbWVfUW9zQ2IuZmxvd19saXN0LCBWT1NfRkFMU0UgKTsKKyAgIGlmKCFwRW50cnkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogRmxvdyBMaXN0IGVtcHR5LCBub3RoaW5nIHRvIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIHdoaWxlKCBwRW50cnkgKQorICAgeworICAgICAgcE5leHRFbnRyeSA9IGNzckxMTmV4dCggJnNtZV9Rb3NDYi5mbG93X2xpc3QsIHBFbnRyeSwgVk9TX0ZBTFNFICk7CisgICAgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rICk7CisgICAgICBpZiAoZmxvd19pbmZvLT5zZXNzaW9uSWQgPT0gc2Vzc2lvbklkKQorICAgICAgeworICAgICAgICAgaWYoKFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTID09IGZsb3dfaW5mby0+cmVhc29uICl8fAorICAgICAgICAgICAgKFNNRV9RT1NfUkVBU09OX1NFVFVQID09IGZsb3dfaW5mby0+cmVhc29uICkpCisgICAgICAgICB7CisgICAgICAgICAgICBjbWQuY29tbWFuZCA9IFNNRV9RT1NfU0VUVVBfUkVROworICAgICAgICAgICAgY21kLnBNYWMgPSBwTWFjOworICAgICAgICAgICAgY21kLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgICAgIGNtZC51LnNldHVwQ21kSW5mby5IRERjb250ZXh0ID0gZmxvd19pbmZvLT5IRERjb250ZXh0OworICAgICAgICAgICAgY21kLnUuc2V0dXBDbWRJbmZvLlFvU0luZm8gPSBmbG93X2luZm8tPlFvU0luZm87CisgICAgICAgICAgICBjbWQudS5zZXR1cENtZEluZm8uUW9TQ2FsbGJhY2sgPSBmbG93X2luZm8tPlFvU0NhbGxiYWNrOworICAgICAgICAgICAgY21kLnUuc2V0dXBDbWRJbmZvLlVQVHlwZSA9IFNNRV9RT1NfV01NX1VQX01BWDsvL3Nob3VsZG4ndCBiZSBuZWVkZWQKKyAgICAgICAgICAgIGNtZC51LnNldHVwQ21kSW5mby5Rb3NGbG93SUQgPSBmbG93X2luZm8tPlFvc0Zsb3dJRDsKKyAgICAgICAgICAgIGlmKFNNRV9RT1NfUkVBU09OX1NFVFVQID09IGZsb3dfaW5mby0+cmVhc29uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNtZC51LnNldHVwQ21kSW5mby5ob1JlbmV3YWwgPSBWT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjbWQudS5zZXR1cENtZEluZm8uaG9SZW5ld2FsID0gVk9TX1RSVUU7Ly9UT0RPOiBtaWdodCBuZWVkIHRoaXMgZm9yIG1vZGlmeQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzbWVfUW9zQnVmZmVyQ21kKCZjbWQsIFZPU19UUlVFKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogY291bGRuJ3QgYnVmZmVyIHRoZSBzZXR1cCByZXF1ZXN0IGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZsb3cgJWQgaW4gaGFuZG9mZiBzdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IGJ1ZmZlcmVkIGEgc2V0dXAgcmVxdWVzdCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmbG93ICVkIGluIGhhbmRvZmYgc3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZihTTUVfUU9TX1JFQVNPTl9SRUxFQVNFID09IGZsb3dfaW5mby0+cmVhc29uICkgCisgICAgICAgICB7CisgICAgICAgICAgICBjbWQuY29tbWFuZCA9IFNNRV9RT1NfUkVMRUFTRV9SRVE7CisgICAgICAgICAgICBjbWQucE1hYyA9IHBNYWM7CisgICAgICAgICAgICBjbWQuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICAgICAgY21kLnUucmVsZWFzZUNtZEluZm8uUW9zRmxvd0lEID0gZmxvd19pbmZvLT5Rb3NGbG93SUQ7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHNtZV9Rb3NCdWZmZXJDbWQoJmNtZCwgVk9TX1RSVUUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBjb3VsZG4ndCBidWZmZXIgdGhlIHJlbGVhc2UgcmVxdWVzdCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmbG93ICVkIGluIGhhbmRvZmYgc3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBidWZmZXJlZCBhIHJlbGVhc2UgcmVxdWVzdCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmbG93ICVkIGluIGhhbmRvZmYgc3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZihTTUVfUU9TX1JFQVNPTl9NT0RJRllfUEVORElORyA9PSBmbG93X2luZm8tPnJlYXNvbikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNtZC5jb21tYW5kID0gU01FX1FPU19NT0RJRllfUkVROworICAgICAgICAgICAgY21kLnBNYWMgPSBwTWFjOworICAgICAgICAgICAgY21kLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgICAgIGNtZC51Lm1vZGlmeUNtZEluZm8uUW9zRmxvd0lEID0gZmxvd19pbmZvLT5Rb3NGbG93SUQ7CisgICAgICAgICAgICBjbWQudS5tb2RpZnlDbWRJbmZvLlFvU0luZm8gPSBmbG93X2luZm8tPlFvU0luZm87CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHNtZV9Rb3NCdWZmZXJDbWQoJmNtZCwgVk9TX1RSVUUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBjb3VsZG4ndCBidWZmZXIgdGhlIG1vZGlmeSByZXF1ZXN0IGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZsb3cgJWQgaW4gaGFuZG9mZiBzdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IGJ1ZmZlcmVkIGEgbW9kaWZ5IHJlcXVlc3QgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvdyAlZCBpbiBoYW5kb2ZmIHN0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIC8vZGVsZXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdAorICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBEZWxldGluZyBvcmlnaW5hbCBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBmbG93X2luZm8sIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgICAgICAgIGNzckxMUmVtb3ZlRW50cnkoJnNtZV9Rb3NDYi5mbG93X2xpc3QsIHBFbnRyeSwgVk9TX1RSVUUgKTsKKyAgICAgICAgIHZvc19tZW1fZnJlZShmbG93X2luZm8pOworICAgICAgfQorICAgICAgcEVudHJ5ID0gcE5leHRFbnRyeTsKKyAgIH0KKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgcFNlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCA9IFZPU19GQUxTRTsKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc0RlbGV0ZUV4aXN0aW5nRmxvd3MoKSAtIFV0aWxpdHkgZnVuY3Rpb24gdG8gRGVsZXRlIHRoZSBleGlzdGluZworICBmbG93cyBpbiBmbG93X2xpc3QsIGlmIHdlIGxvc3QgY29ubmVjdGl2aXR5LgorCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgZUhhbFN0YXR1cyBzbWVfUW9zRGVsZXRlRXhpc3RpbmdGbG93cyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHNlc3Npb25JZCkKK3sKKyAgIHRMaXN0RWxlbSAqcEVudHJ5PSBOVUxMLCAqcE5leHRFbnRyeSA9IE5VTEw7CisgICBzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKyAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZzbWVfUW9zQ2IuZmxvd19saXN0LCBWT1NfVFJVRSApOworICAgaWYoIXBFbnRyeSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogJWQ6IEZsb3cgTGlzdCBlbXB0eSwgbm90aGluZyB0byBkZWxldGUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICB3aGlsZSggcEVudHJ5ICkKKyAgIHsKKyAgICAgIHBOZXh0RW50cnkgPSBjc3JMTE5leHQoICZzbWVfUW9zQ2IuZmxvd19saXN0LCBwRW50cnksIFZPU19UUlVFICk7CisgICAgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rICk7CisgICAgICBpZiAoZmxvd19pbmZvLT5zZXNzaW9uSWQgPT0gc2Vzc2lvbklkKQorICAgICAgeworICAgICAgICAgaWYoKFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTID09IGZsb3dfaW5mby0+cmVhc29uICl8fAorICAgICAgICAgICAgKFNNRV9RT1NfUkVBU09OX1NFVFVQID09IGZsb3dfaW5mby0+cmVhc29uICl8fAorICAgICAgICAgICAgKFNNRV9RT1NfUkVBU09OX1JFTEVBU0UgPT0gZmxvd19pbmZvLT5yZWFzb24gKXx8CisgICAgICAgICAgICAoU01FX1FPU19SRUFTT05fTU9ESUZZID09IGZsb3dfaW5mby0+cmVhc29uICkpCisgICAgICAgICB7CisgICAgICAgICAgICBmbG93X2luZm8tPlFvU0NhbGxiYWNrKHBNYWMsIGZsb3dfaW5mby0+SEREY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUU9TX0xPU1RfSU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICAgICAgICB9CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogRGVsZXRpbmcgZW50cnkgYXQgJXAgd2l0aCBmbG93SUQgJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLCBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICAgICAgICAvL2RlbGV0ZSB0aGUgZW50cnkgZnJvbSBGbG93IExpc3QKKyAgICAgICAgIGNzckxMUmVtb3ZlRW50cnkoJnNtZV9Rb3NDYi5mbG93X2xpc3QsIHBFbnRyeSwgVk9TX1RSVUUgKTsKKyAgICAgICAgIHZvc19tZW1fZnJlZShmbG93X2luZm8pOworICAgICAgfQorICAgICAgcEVudHJ5ID0gcE5leHRFbnRyeTsKKyAgIH0KKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc0J1ZmZlckNtZCgpIC0gVXRpbGl0eSBmdW5jdGlvbiB0byBidWZmZXIgYSByZXF1ZXN0IChzZXR1cC9tb2RpZnkvCisgIHJlbGVhc2UpIGZyb20gY2xpZW50IHdoaWxlIHByb2Nlc3NpbmcgYW5vdGhlciBvbmUgb24gdGhlIHNhbWUgQUMuCisgIFxwYXJhbSBwY21kIC0gYSBwb2ludGVyIHRvIHRoZSBjbWQgc3RydWN0dXJlIHRvIGJlIHNhdmVkIGluc2lkZSB0aGUgYnVmZmVyZWQKKyAgICAgICAgICAgICAgICBjbWQgbGluayBsaXN0CisgICAgICAgICAgICAgICAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NCdWZmZXJDbWQoc21lX1Fvc0NtZEluZm8gKnBjbWQsIHZfQk9PTF90IGluc2VydF9oZWFkKQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NDbWRJbmZvRW50cnkgKiBwZW50cnkgPSBOVUxMOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBJbnZva2VkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgIHBlbnRyeSA9IChzbWVfUW9zQ21kSW5mb0VudHJ5ICopIHZvc19tZW1fbWFsbG9jKHNpemVvZihzbWVfUW9zQ21kSW5mb0VudHJ5KSk7CisgICBpZiAoIXBlbnRyeSkKKyAgIHsKKyAgICAgIC8vZXJyIG1zZworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICAvLyBjb3B5IHRoZSBlbnRpcmUgQ21kSW5mbworICAgcGVudHJ5LT5jbWRJbmZvID0gKnBjbWQ7CisgCisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bcGNtZC0+c2Vzc2lvbklkXTsKKyAgIGlmKGluc2VydF9oZWFkKSAKKyAgIHsKKyAgICAgIGNzckxMSW5zZXJ0SGVhZCgmcFNlc3Npb24tPmJ1ZmZlcmVkQ29tbWFuZExpc3QsICZwZW50cnktPmxpbmssIFZPU19UUlVFKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGNzckxMSW5zZXJ0VGFpbCgmcFNlc3Npb24tPmJ1ZmZlcmVkQ29tbWFuZExpc3QsICZwZW50cnktPmxpbmssIFZPU19UUlVFKTsKKyAgIH0KKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1Byb2Nlc3NCdWZmZXJlZENtZCgpIC0gVXRpbGl0eSBmdW5jdGlvbiB0byBwcm9jZXNzIGEgYnVmZmVyZWQgCisgIHJlcXVlc3QgKHNldHVwL21vZGlmeS9yZWxlYXNlKSBpbml0aWFsbHkgY2FtZSBmcm9tIHRoZSBjbGllbnQuCisKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzQnVmZmVyZWRDbWQodl9VOF90IHNlc3Npb25JZCkKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQ21kSW5mb0VudHJ5ICpwY21kID0gTlVMTDsKKyAgIHRMaXN0RWxlbSAqcEVudHJ5PSBOVUxMOworICAgc21lX1Fvc1N0YXR1c1R5cGUgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAiJXM6ICVkOiBJbnZva2VkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgaWYoIWNzckxMSXNMaXN0RW1wdHkoICZwU2Vzc2lvbi0+YnVmZmVyZWRDb21tYW5kTGlzdCwgVk9TX0ZBTFNFICkpCisgICB7CisgICAgICBwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoICZwU2Vzc2lvbi0+YnVmZmVyZWRDb21tYW5kTGlzdCwgVk9TX1RSVUUgKTsKKyAgICAgIGlmKCFwRW50cnkpCisgICAgICB7CisgICAgICAgICAvL0VyciBtc2cKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBubyBtb3JlIGJ1ZmZlcmVkIGNvbW1hbmRzIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgIHBTZXNzaW9uLT5yZWFkeUZvclBvd2VyU2F2ZSA9IFZPU19UUlVFOworICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICB9CisgICAgICBwY21kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCBzbWVfUW9zQ21kSW5mb0VudHJ5LCBsaW5rICk7CisgICAgICBzd2l0Y2gocGNtZC0+Y21kSW5mby5jb21tYW5kKQorICAgICAgeworICAgICAgY2FzZSBTTUVfUU9TX1NFVFVQX1JFUToKKyAgICAgICAgIGhkZF9zdGF0dXMgPSBzbWVfUW9zSW50ZXJuYWxTZXR1cFJlcShwY21kLT5jbWRJbmZvLnBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbWQtPmNtZEluZm8uc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwY21kLT5jbWRJbmZvLnUuc2V0dXBDbWRJbmZvLlFvU0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtZC0+Y21kSW5mby51LnNldHVwQ21kSW5mby5Rb1NDYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtZC0+Y21kSW5mby51LnNldHVwQ21kSW5mby5IRERjb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21kLT5jbWRJbmZvLnUuc2V0dXBDbWRJbmZvLlVQVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtZC0+Y21kSW5mby51LnNldHVwQ21kSW5mby5Rb3NGbG93SUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19UUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbWQtPmNtZEluZm8udS5zZXR1cENtZEluZm8uaG9SZW5ld2FsKTsKKyAgICAgICAgIGlmKFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQID09IGhkZF9zdGF0dXMpCisgICAgICAgICB7CisgICAgICAgICAgICAvL0VyciBtc2cKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBzbWVfUW9zSW50ZXJuYWxTZXR1cFJlcSBmYWlsZWQgb24gc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgICAgICAgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTUVfUU9TX1JFTEVBU0VfUkVROgorICAgICAgICAgaGRkX3N0YXR1cyA9IHNtZV9Rb3NJbnRlcm5hbFJlbGVhc2VSZXEocGNtZC0+Y21kSW5mby5wTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbWQtPmNtZEluZm8udS5yZWxlYXNlQ21kSW5mby5Rb3NGbG93SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJVRSk7CisgICAgICAgICBpZihTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQID09IGhkZF9zdGF0dXMpCisgICAgICAgICB7CisgICAgICAgICAgICAvL0VyciBtc2cKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBzbWVfUW9zSW50ZXJuYWxSZWxlYXNlUmVxIGZhaWxlZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICAgICBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNNRV9RT1NfTU9ESUZZX1JFUToKKyAgICAgICAgIGhkZF9zdGF0dXMgPSBzbWVfUW9zSW50ZXJuYWxNb2RpZnlSZXEocGNtZC0+Y21kSW5mby5wTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBjbWQtPmNtZEluZm8udS5tb2RpZnlDbWRJbmZvLlFvU0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbWQtPmNtZEluZm8udS5tb2RpZnlDbWRJbmZvLlFvc0Zsb3dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSVUUpOworICAgICAgICAgaWYoU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQID09IGhkZF9zdGF0dXMpCisgICAgICAgICB7CisgICAgICAgICAgICAvL0VyciBtc2cKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBzbWVfUW9zSW50ZXJuYWxNb2RpZnlSZXEgZmFpbGVkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU01FX1FPU19SRVNFTkRfUkVROgorICAgICAgICAgaGRkX3N0YXR1cyA9IHNtZV9Rb3NSZVJlcXVlc3RBZGRUUyhwY21kLT5jbWRJbmZvLnBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21kLT5jbWRJbmZvLnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBjbWQtPmNtZEluZm8udS5yZXNlbmRDbWRJbmZvLlFvU0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbWQtPmNtZEluZm8udS5yZXNlbmRDbWRJbmZvLmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21kLT5jbWRJbmZvLnUucmVzZW5kQ21kSW5mby50c3BlY01hc2spOworICAgICAgICAgaWYoU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQID09IGhkZF9zdGF0dXMpCisgICAgICAgICB7CisgICAgICAgICAgICAvL0VyciBtc2cKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBzbWVfUW9zUmVSZXF1ZXN0QWRkVFMgZmFpbGVkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHVua25vd24gY21kID0gJWQiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBwY21kLT5jbWRJbmZvLmNvbW1hbmQpOworICAgICAgICAgLy9BU1NFUlQKKyAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIGJ1ZmZlcmVkIGNvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkLCByZWNsYWltIHRoZSBtZW1vcnkKKyAgICAgIHZvc19tZW1fZnJlZShwY21kKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogY21kIGJ1ZmZlciBlbXB0eSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfVFJVRTsKKyAgIH0KKyAgIHJldHVybiBoYWxTdGF0dXM7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zRGVsZXRlQnVmZmVyZWRSZXF1ZXN0cygpIC0gVXRpbGl0eSBmdW5jdGlvbiB0byBEZWxldGUgdGhlIGJ1ZmZlcmVkCisgIHJlcXVlc3RzIGluIHRoZSBidWZmZXJlZF9jbWRfbGlzdCwgaWYgd2UgbG9zdCBjb25uZWN0aXZpdHkuCisKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBlSGFsU3RhdHVzIHNtZV9Rb3NEZWxldGVCdWZmZXJlZFJlcXVlc3RzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc2Vzc2lvbklkKQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NDbWRJbmZvRW50cnkgKnBjbWQgPSBOVUxMOworICAgdExpc3RFbGVtICpwRW50cnk9IE5VTEwsICpwTmV4dEVudHJ5ID0gTlVMTDsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogSW52b2tlZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzZXNzaW9uSWQpOworICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcFNlc3Npb24tPmJ1ZmZlcmVkQ29tbWFuZExpc3QsIFZPU19UUlVFICk7CisgICBpZighcEVudHJ5KQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IEJ1ZmZlcmVkIExpc3QgZW1wdHksIG5vdGhpbmcgdG8gZGVsZXRlIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgd2hpbGUoIHBFbnRyeSApCisgICB7CisgICAgICBwTmV4dEVudHJ5ID0gY3NyTExOZXh0KCAmcFNlc3Npb24tPmJ1ZmZlcmVkQ29tbWFuZExpc3QsIHBFbnRyeSwgVk9TX1RSVUUgKTsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBkZWxldGluZyBlbnRyeSBmcm9tIGJ1ZmZlcmVkIExpc3QiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgLy9kZWxldGUgdGhlIGVudHJ5IGZyb20gRmxvdyBMaXN0CisgICAgICBjc3JMTFJlbW92ZUVudHJ5KCZwU2Vzc2lvbi0+YnVmZmVyZWRDb21tYW5kTGlzdCwgcEVudHJ5LCBWT1NfVFJVRSApOworICAgICAgLy8gcmVjbGFpbSB0aGUgbWVtb3J5CisgICAgICBwY21kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCBzbWVfUW9zQ21kSW5mb0VudHJ5LCBsaW5rICk7CisgICAgICB2b3NfbWVtX2ZyZWUocGNtZCk7CisgICAgICBwRW50cnkgPSBwTmV4dEVudHJ5OworICAgfQorICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zU2F2ZUFzc29jSW5mbygpIC0gVXRpbGl0eSBmdW5jdGlvbiB0byBzYXZlIHRoZSBhc3NvYyBpbmZvIGluIHRoZQorICBDQiBsaWtlIEJTUyBkZXNjcml0b3Igb2YgdGhlIEFQLCB0aGUgcHJvZmlsZSB0aGF0IEhERCBzZW50IGRvd24gd2l0aCB0aGUgCisgIGNvbm5lY3QgcmVxdWVzdCwgd2hpbGUgQ1NSIG5vdGlmaWVzIGZvciBhc3NvYy9yZWFzc29jIHN1Y2Nlc3MuCisgIFxwYXJhbSBwQXNzb2NfaW5mbyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgQlNTIGRlc2NyaXRvciAKKyAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEFQLCB0aGUgcHJvZmlsZSB0aGF0IEhERCBzZW50IGRvd24gd2l0aCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1NhdmVBc3NvY0luZm8oc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbiwgc21lX1Fvc0Fzc29jSW5mbyAqcEFzc29jX2luZm8pCit7CisgICB0U2lyQnNzRGVzY3JpcHRpb24gICAgKnBCc3NEZXNjID0gTlVMTDsKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgYnNzTGVuID0gMDsKKyAgIGlmKE5VTEwgPT0gcEFzc29jX2luZm8pCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogcEFzc29jX2luZm8gaXMgTlVMTCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIC8vY2xlYW4gdXAgdGhlIGFzc29jIGluZm8gaWYgYWxyZWFkeSBzZXQKKyAgIGlmKHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MpCisgICB7CisgICAgICB2b3NfbWVtX2ZyZWUocFNlc3Npb24tPmFzc29jSW5mby5wQnNzRGVzYyk7CisgICAgICBwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjID0gTlVMTDsKKyAgIH0KKyAgIGJzc0xlbiA9IHBBc3NvY19pbmZvLT5wQnNzRGVzYy0+bGVuZ3RoICsgCisgICAgICBzaXplb2YocEFzc29jX2luZm8tPnBCc3NEZXNjLT5sZW5ndGgpOworICAgLy9zYXZlIHRoZSBic3MgRGVzY3JpcHRvcgorICAgcEJzc0Rlc2MgPSAodFNpckJzc0Rlc2NyaXB0aW9uICopdm9zX21lbV9tYWxsb2MoYnNzTGVuKTsKKyAgIGlmICghcEJzc0Rlc2MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYnNzIERlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICB2b3NfbWVtX2NvcHkocEJzc0Rlc2MsIHBBc3NvY19pbmZvLT5wQnNzRGVzYywgYnNzTGVuKTsKKyAgIHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MgPSBwQnNzRGVzYzsKKyAgIC8vc2F2ZSB0aGUgYXBzZCBpbmZvIGZyb20gYXNzb2MKKyAgIGlmKHBBc3NvY19pbmZvLT5wUHJvZmlsZSkKKyAgIHsKKyAgICAgICBwU2Vzc2lvbi0+YXBzZE1hc2sgfD0gcEFzc29jX2luZm8tPnBQcm9maWxlLT51YXBzZF9tYXNrOworICAgfQorICAgLy8gW1RPRE9dIERvIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBnbG9iYWwgQVBTRCBiaXRtYXA/CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1NldHVwRm5wKCkgLSBVdGlsaXR5IGZ1bmN0aW9uIChwb2ludGVyKSB0byBub3RpZnkgb3RoZXIgZW50cmllcyAKKyAgaW4gRkxPVyBsaXN0IG9uIHRoZSBzYW1lIEFDIHRoYXQgcW9zIHBhcmFtcyBnb3QgbW9kaWZpZWQKKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgIFxwYXJhbSBwRW50cnkgLSBQb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBmbG93X2xpc3QoaS5lLiB0TGlzdEVsZW0gc3RydWN0dXJlKQorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1NldHVwRm5wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisgICBzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKyAgIHNtZV9Rb3NTdGF0dXNUeXBlIGhkZF9zdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9NT0RJRklFRF9JTkQ7CisgICBzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKyAgIGlmKCFwRW50cnkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogRW50cnkgaXMgTlVMTCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAvL0FTU0VSVAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgZmxvd19pbmZvID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayApOworICAgYWMgPSBmbG93X2luZm8tPmFjX3R5cGU7CisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bZmxvd19pbmZvLT5zZXNzaW9uSWRdOworICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICBpZihTTUVfUU9TX1JFQVNPTl9SRVFfU1VDQ0VTUyA9PSBmbG93X2luZm8tPnJlYXNvbikKKyAgIHsKKyAgICAgIC8vbm90aWZ5IEhERCwgb25seSB0aGUgb3RoZXIgRmxvd3MgcnVubmluZyBvbiB0aGUgQUMgCisgICAgICBmbG93X2luZm8tPlFvU0NhbGxiYWNrKHBNYWMsIGZsb3dfaW5mby0+SEREY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQUNJbmZvLT5jdXJyX1FvU0luZm9bZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkZF9zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogRW50cnkgd2l0aCBmbG93SUQgPSAlZCBnZXR0aW5nIG5vdGlmaWVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgIH0KKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc01vZGlmaWNhdGlvbk5vdGlmeUZucCgpIC0gVXRpbGl0eSBmdW5jdGlvbiAocG9pbnRlcikgdG8gbm90aWZ5IAorICBvdGhlciBlbnRyaWVzIGluIEZMT1cgbGlzdCBvbiB0aGUgc2FtZSBBQyB0aGF0IHFvcyBwYXJhbXMgZ290IG1vZGlmaWVkCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICBccGFyYW0gcEVudHJ5IC0gUG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZmxvd19saXN0KGkuZS4gdExpc3RFbGVtIHN0cnVjdHVyZSkKKyAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NNb2RpZmljYXRpb25Ob3RpZnlGbnAodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIHNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworICAgc21lX1Fvc1N0YXR1c1R5cGUgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX01PRElGSUVEX0lORDsKKyAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjOworICAgaWYoIXBFbnRyeSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBFbnRyeSBpcyBOVUxMIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgIC8vQVNTRVJUCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rICk7CisgICBhYyA9IGZsb3dfaW5mby0+YWNfdHlwZTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tmbG93X2luZm8tPnNlc3Npb25JZF07CisgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKyAgIGlmKFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTID09IGZsb3dfaW5mby0+cmVhc29uKQorICAgeworICAgICAgLy9ub3RpZnkgSERELCBvbmx5IHRoZSBvdGhlciBGbG93cyBydW5uaW5nIG9uIHRoZSBBQyAKKyAgICAgIGZsb3dfaW5mby0+UW9TQ2FsbGJhY2socE1hYywgZmxvd19pbmZvLT5IRERjb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1tmbG93X2luZm8tPnRzcGVjX21hc2sgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBFbnRyeSB3aXRoIGZsb3dJRCA9ICVkIGdldHRpbmcgbm90aWZpZWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgfQorICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zTW9kaWZ5Rm5wKCkgLSBVdGlsaXR5IGZ1bmN0aW9uIChwb2ludGVyKSB0byBkZWxldGUgdGhlIG9yaWdpYW5sIAorICBlbnRyeSBpbiBGTE9XIGxpc3QgJiBhZGQgdGhlIG1vZGlmaWVkIG9uZQorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHBhcmFtIHBFbnRyeSAtIFBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGZsb3dfbGlzdChpLmUuIHRMaXN0RWxlbSBzdHJ1Y3R1cmUpCisgIAorICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zTW9kaWZ5Rm5wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KQoreworICAgc21lX1Fvc0Zsb3dJbmZvRW50cnkgKmZsb3dfaW5mbyA9IE5VTEw7CisgICBpZighcEVudHJ5KQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IEVudHJ5IGlzIE5VTEwiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgZmxvd19pbmZvID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayApOworICAgc3dpdGNoKGZsb3dfaW5mby0+cmVhc29uKQorICAgeworICAgY2FzZSBTTUVfUU9TX1JFQVNPTl9NT0RJRllfUEVORElORzoKKyAgICAgIC8vc2V0IHRoZSBwcm9wZXIgcmVhc29uIGNvZGUgZm9yIHRoZSBuZXcgKHdpdGggbW9kaWZpZWQgcGFyYW1zKSBlbnRyeQorICAgICAgZmxvd19pbmZvLT5yZWFzb24gPSBTTUVfUU9TX1JFQVNPTl9SRVFfU1VDQ0VTUzsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTTUVfUU9TX1JFQVNPTl9NT0RJRlk6CisgICAgICAvL2RlbGV0ZSB0aGUgb3JpZ2luYWwgZW50cnkgZnJvbSBGbG93IExpc3QKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogRGVsZXRpbmcgb3JpZ2luYWwgZW50cnkgYXQgJXAgd2l0aCBmbG93SUQgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgZmxvd19pbmZvLCBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICAgICBjc3JMTFJlbW92ZUVudHJ5KCZzbWVfUW9zQ2IuZmxvd19saXN0LCBwRW50cnksIFZPU19UUlVFICk7CisgICAgICAvLyByZWNsYWltIHRoZSBtZW1vcnkKKyAgICAgIHZvc19tZW1fZnJlZShmbG93X2luZm8pOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NEZWxUc0luZEZucCgpIC0gVXRpbGl0eSBmdW5jdGlvbiAocG9pbnRlcikgdG8gZmluZCBhbGwgRmxvd3Mgb24gCisgIHRoZSBwZXJ0aWN1bGFyIEFDICYgZGVsZXRlIHRoZW0sIGFsc28gc2VuZCBIREQgaW5kaWNhdGlvbiB0aHJvdWdoIHRoZSBjYWxsYmFjayAKKyAgaXQgcmVnaXN0ZXJlZCBwZXIgcmVxdWVzdAorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHBhcmFtIHBFbnRyeSAtIFBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGZsb3dfbGlzdChpLmUuIHRMaXN0RWxlbSBzdHJ1Y3R1cmUpCisgIAorICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUW9zRGVsVHNJbmRGbnAodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIHNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworICAgc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisgICBpZighcEVudHJ5KQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IEVudHJ5IGlzIE5VTEwiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgLy9BU1NFUlQKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIC8vZGVsZXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdAorICAgZmxvd19pbmZvID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayApOworICAgYWMgPSBmbG93X2luZm8tPmFjX3R5cGU7CisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bZmxvd19pbmZvLT5zZXNzaW9uSWRdOworICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICBmbG93X2luZm8tPlFvU0NhbGxiYWNrKHBNYWMsIGZsb3dfaW5mby0+SEREY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwQUNJbmZvLT5jdXJyX1FvU0luZm9bZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfUU9TX0xPU1RfSU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICBwQUNJbmZvLT5udW1fZmxvd3NbZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0tLTsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIiVzOiAlZDogRGVsZXRpbmcgZW50cnkgYXQgJXAgd2l0aCBmbG93SUQgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgZmxvd19pbmZvLCBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICBjc3JMTFJlbW92ZUVudHJ5KCZzbWVfUW9zQ2IuZmxvd19saXN0LCBwRW50cnksIFZPU19UUlVFICk7CisgICAvLyByZWNsYWltIHRoZSBtZW1vcnkKKyAgIHZvc19tZW1fZnJlZShmbG93X2luZm8pOworICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zUmVhc3NvY1N1Y2Nlc3NFdkZucCgpIC0gVXRpbGl0eSBmdW5jdGlvbiAocG9pbnRlcikgdG8gbm90aWZ5IEhERCAKKyAgdGhlIHN1Y2Nlc3MgZm9yIHRoZSByZXF1ZXN0ZWQgZmxvdyAmIG5vdGlmeSBhbGwgdGhlIG90aGVyIGZsb3dzIHJ1bm5pbmcgb24gdGhlIAorICBzYW1lIEFDIHRoYXQgUW9TIHBhcmFtcyBnb3QgbW9kaWZpZWQKKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgIFxwYXJhbSBwRW50cnkgLSBQb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBmbG93X2xpc3QoaS5lLiB0TGlzdEVsZW0gc3RydWN0dXJlKQorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1JlYXNzb2NTdWNjZXNzRXZGbnAodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIHNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworICAgdl9CT09MX3QgZGVsZXRlX2VudHJ5ID0gVk9TX0ZBTFNFOworICAgc21lX1Fvc1N0YXR1c1R5cGUgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOworICAgc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisgICBlSGFsU3RhdHVzIHBtY19zdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgaWYoIXBFbnRyeSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBFbnRyeSBpcyBOVUxMIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgIC8vQVNTRVJUCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgc21lX1Fvc0Zsb3dJbmZvRW50cnksIGxpbmspOworICAgYWMgPSBmbG93X2luZm8tPmFjX3R5cGU7CisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bZmxvd19pbmZvLT5zZXNzaW9uSWRdOworICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICBzd2l0Y2goZmxvd19pbmZvLT5yZWFzb24pCisgICB7CisgICBjYXNlIFNNRV9RT1NfUkVBU09OX1NFVFVQOgorICAgICAgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfSU5EOworICAgICAgZGVsZXRlX2VudHJ5ID0gVk9TX0ZBTFNFOworICAgICAgZmxvd19pbmZvLT5yZWFzb24gPSBTTUVfUU9TX1JFQVNPTl9SRVFfU1VDQ0VTUzsKKyAgICAgIC8vY2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGhhZCB0byBkbyByZWFzc29jIHRvIHJlc2V0IHRoZSBhcHNkIGJpdAorICAgICAgLy9mb3IgdGhlIGFjIC0gcmVsZWFzZSBvciBtb2RpZnkgc2NlbmFyaW8KKyAgICAgIGlmKHBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW1NNRV9RT1NfVFNQRUNfSU5ERVhfMF0udHNfaW5mby5wc2IpCisgICAgICB7CisgICAgICAgICAvLyBub3RpZnkgUE1DIGFzIEFwcCBpcyBsb29raW5nIGZvciBBUFNELiBJZiB3ZSBhbHJlYWR5IHJlcXVlc3RlZAorICAgICAgICAgLy8gdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorICAgICAgICAgaWYoIXBTZXNzaW9uLT51YXBzZEFscmVhZHlSZXF1ZXN0ZWQpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBmaXJzdCBmbG93IHRvIGRldGVjdCB3ZSBuZWVkIFBNQyBpbiBVQVBTRCBtb2RlCisgICAKKyAgICAgICAgICAgIHBtY19zdGF0dXMgPSBwbWNTdGFydFVhcHNkKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zUG1jU3RhcnRVYXBzZENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24pOworICAgICAgICAgICAgLy8gaWYgUE1DIGRvZXNuJ3QgcmV0dXJuIHN1Y2Nlc3MgcmlnaHQgYXdheSBtZWFucyBpdCBpcyB5ZXQgdG8gcHV0CisgICAgICAgICAgICAvLyB0aGUgbW9kdWxlIGluIEJNUFMgc3RhdGUgJiBsYXRlciB0byBVQVBTRCBzdGF0ZQorICAgICAgICAgCisgICAgICAgICAgICBpZihlSEFMX1NUQVRVU19GQUlMVVJFID09IHBtY19zdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9TRVRfRkFJTEVEOworICAgICAgICAgICAgICAgLy93ZSBuZWVkIHRvIGFsd2F5cyBub3RpZnkgdGhpcyBjYXNlCisgICAgICAgICAgICAgICBmbG93X2luZm8tPmhvUmVuZXdhbCA9IFZPU19GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgPT0gcG1jX3N0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vIGxldCBvdGhlciBmbG93cyBrbm93IFBNQyBoYXMgYmVlbiBub3RpZmllZAorICAgICAgICAgICAgICAgcFNlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCA9IFZPU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZm9yIGFueSBvdGhlciBwbWMgc3RhdHVzIHdlIGRlY2xhcmUgc3VjY2VzcworICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIFNNRV9RT1NfUkVBU09OX1JFTEVBU0U6CisgICAgICBwQUNJbmZvLT5udW1fZmxvd3NbU01FX1FPU19UU1BFQ19JTkRFWF8wXS0tOworICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICBjYXNlIFNNRV9RT1NfUkVBU09OX01PRElGWToKKyAgICAgIGRlbGV0ZV9lbnRyeSA9IFZPU19UUlVFOworICAgICAgYnJlYWs7CisgICBjYXNlIFNNRV9RT1NfUkVBU09OX01PRElGWV9QRU5ESU5HOgorICAgICAgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX0lORDsKKyAgICAgIGRlbGV0ZV9lbnRyeSA9IFZPU19GQUxTRTsKKyAgICAgIGZsb3dfaW5mby0+cmVhc29uID0gU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1M7CisgICAgICBpZihwQUNJbmZvLT5yZXF1ZXN0ZWRfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLnRzX2luZm8ucHNiKQorICAgICAgeworICAgCisgICAgICAgICBpZighcFNlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGZpcnN0IGZsb3cgdG8gZGV0ZWN0IHdlIG5lZWQgUE1DIGluIFVBUFNEIG1vZGUKKyAgICAgICAgICAgIHBtY19zdGF0dXMgPSBwbWNTdGFydFVhcHNkKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zUG1jU3RhcnRVYXBzZENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24pOworICAgICAgICAgCisgICAgICAgICAgICAvLyBpZiBQTUMgZG9lc24ndCByZXR1cm4gc3VjY2VzcyByaWdodCBhd2F5IG1lYW5zIGl0IGlzIHlldCB0byBwdXQKKyAgICAgICAgICAgIC8vIHRoZSBtb2R1bGUgaW4gQk1QUyBzdGF0ZSAmIGxhdGVyIHRvIFVBUFNEIHN0YXRlCisgICAgICAgICAgICBpZihlSEFMX1NUQVRVU19GQUlMVVJFID09IHBtY19zdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfSU5EX0FQU0RfU0VUX0ZBSUxFRDsKKyAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWx3YXlzIG5vdGlmeSB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgIGZsb3dfaW5mby0+aG9SZW5ld2FsID0gVk9TX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihlSEFMX1NUQVRVU19QTUNfUEVORElORyA9PSBwbWNfc3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcFNlc3Npb24tPnVhcHNkQWxyZWFkeVJlcXVlc3RlZCA9IFZPU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZm9yIGFueSBvdGhlciBwbWMgc3RhdHVzIHdlIGRlY2xhcmUgc3VjY2VzcworICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICBjYXNlIFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTOgorICAgICAgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX01PRElGSUVEX0lORDsKKyAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgZGVmYXVsdDoKKyAgICAgIGRlbGV0ZV9lbnRyeSA9IFZPU19GQUxTRTsKKyAgICAgIGJyZWFrOworICAgfQorICAgaWYoIWRlbGV0ZV9lbnRyeSkKKyAgIHsKKyAgICAgIGlmKCFmbG93X2luZm8tPmhvUmVuZXdhbCkKKyAgICAgIHsKKyAgICAgICAgIGZsb3dfaW5mby0+UW9TQ2FsbGJhY2socE1hYywgZmxvd19pbmZvLT5IRERjb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBQ0luZm8tPmN1cnJfUW9TSW5mb1tTTUVfUU9TX1RTUEVDX0lOREVYXzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGRfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBmbG93X2luZm8tPmhvUmVuZXdhbCA9IFZPU19GQUxTRTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8vZGVsZXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdAorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBEZWxldGluZyBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBmbG93X2luZm8sIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgICAgIGNzckxMUmVtb3ZlRW50cnkoJnNtZV9Rb3NDYi5mbG93X2xpc3QsIHBFbnRyeSwgVk9TX1RSVUUgKTsKKyAgICAgIC8vIHJlY2xhaW0gdGhlIG1lbW9yeQorICAgICAgdm9zX21lbV9mcmVlKGZsb3dfaW5mbyk7CisgICB9CisgICAKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc0FkZFRzRmFpbHVyZUZucCgpIC0gVXRpbGl0eSBmdW5jdGlvbiAocG9pbnRlciksIAorICBpZiB0aGUgQWRkdHMgcmVxdWVzdCB3YXMgZm9yIGZvciBhbiBmbG93IHNldHVwIHJlcXVlc3QsIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSAKKyAgRmxvdyBsaXN0ICYgbm90aWZ5IEhERCAKKyAgaWYgdGhlIEFkZHRzIHJlcXVlc3Qgd2FzIGZvciBkb3duZ3JhZGluZyBvZiBRb1MgcGFyYW1zIGJlY2F1c2Ugb2YgYW4gZmxvdyAKKyAgcmVsZWFzZSByZXF1ZXN0ZWQgb24gdGhlIEFDLCBkZWxldGUgdGhlIGVudHJ5IGZyb20gRmxvdyBsaXN0ICYgbm90aWZ5IEhERCAKKyAgaWYgdGhlIEFkZHRzIHJlcXVlc3Qgd2FzIGZvciBjaGFuZ2Ugb2YgUW9TIHBhcmFtcyBiZWNhdXNlIG9mIGFuIGZsb3cgCisgIG1vZGlmaWNhdGlvbiByZXF1ZXN0ZWQgb24gdGhlIEFDLCBkZWxldGUgdGhlIG5ldyBlbnRyeSBmcm9tIEZsb3cgbGlzdCAmIG5vdGlmeSAKKyAgSEREIAorCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICBccGFyYW0gcEVudHJ5IC0gUG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZmxvd19saXN0KGkuZS4gdExpc3RFbGVtIHN0cnVjdHVyZSkKKyAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NBZGRUc0ZhaWx1cmVGbnAodHBBbmlTaXJHbG9iYWwgcE1hYywgdExpc3RFbGVtICpwRW50cnkpCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIHNtZV9Rb3NGbG93SW5mb0VudHJ5ICpmbG93X2luZm8gPSBOVUxMOworICAgdl9CT09MX3QgaW5mb3JtX2hkZCA9IFZPU19GQUxTRTsKKyAgIHNtZV9Rb3NTdGF0dXNUeXBlIGhkZF9zdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19TRVRVUF9GQUlMVVJFX1JTUDsKKyAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjOworICAgaWYoIXBFbnRyeSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBFbnRyeSBpcyBOVUxMIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgIC8vQVNTRVJUCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rICk7CisgICBhYyA9IGZsb3dfaW5mby0+YWNfdHlwZTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tmbG93X2luZm8tPnNlc3Npb25JZF07CisgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjXTsKKyAgIHN3aXRjaChmbG93X2luZm8tPnJlYXNvbikKKyAgIHsKKyAgIGNhc2UgU01FX1FPU19SRUFTT05fU0VUVVA6CisgICAgICBoZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfRkFJTFVSRV9SU1A7CisgICAgICBwQUNJbmZvLT5udW1fZmxvd3NbcEFDSW5mby0+dHNwZWNfcGVuZGluZyAtIDFdLS07CisgICAgICBpbmZvcm1faGRkID0gVk9TX1RSVUU7CisgICAgICBicmVhazsKKyAgIGNhc2UgU01FX1FPU19SRUFTT05fUkVMRUFTRToKKyAgICAgIGhkZF9zdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19SRUxFQVNFX0ZBSUxVUkVfUlNQOworICAgICAgcEFDSW5mby0+bnVtX2Zsb3dzW3BBQ0luZm8tPnRzcGVjX3BlbmRpbmcgLSAxXS0tOworICAgICAgaW5mb3JtX2hkZCA9IFZPU19UUlVFOworICAgICAgYnJlYWs7CisgICBjYXNlIFNNRV9RT1NfUkVBU09OX01PRElGWV9QRU5ESU5HOgorICAgICAgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9GQUlMVVJFX1JTUDsKKyAgICAgIGluZm9ybV9oZGQgPSBWT1NfVFJVRTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTTUVfUU9TX1JFQVNPTl9NT0RJRlk6CisgICAgICBmbG93X2luZm8tPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTOworICAgY2FzZSBTTUVfUU9TX1JFQVNPTl9SRVFfU1VDQ0VTUzoKKyAgIGRlZmF1bHQ6CisgICAgICBpbmZvcm1faGRkID0gVk9TX0ZBTFNFOworICAgICAgYnJlYWs7CisgICB9CisgICBpZihpbmZvcm1faGRkKQorICAgeworICAgICAgLy9ub3RpZnkgSERELCBvbmx5IHRoZSByZXF1ZXN0ZWQgRmxvdywgb3RoZXIgRmxvd3MgcnVubmluZyBvbiB0aGUgQUMgc3RheSAKKyAgICAgIC8vIGludGFjdAorICAgICAgaWYoIWZsb3dfaW5mby0+aG9SZW5ld2FsKQorICAgICAgeworICAgICAgICAgZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLCBmbG93X2luZm8tPkhERGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3BBQ0luZm8tPnRzcGVjX3BlbmRpbmcgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLCBmbG93X2luZm8tPkhERGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3BBQ0luZm8tPnRzcGVjX3BlbmRpbmcgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01FX1FPU19TVEFUVVNfUkVMRUFTRV9RT1NfTE9TVF9JTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgICAgIH0KKyAgICAgIC8vZGVsZXRlIHRoZSBlbnRyeSBmcm9tIEZsb3cgTGlzdAorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBEZWxldGluZyBlbnRyeSBhdCAlcCB3aXRoIGZsb3dJRCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBmbG93X2luZm8sIGZsb3dfaW5mby0+UW9zRmxvd0lEKTsKKyAgICAgIGNzckxMUmVtb3ZlRW50cnkoJnNtZV9Rb3NDYi5mbG93X2xpc3QsIHBFbnRyeSwgVk9TX1RSVUUgKTsKKyAgICAgIC8vIHJlY2xhaW0gdGhlIG1lbW9yeQorICAgICAgdm9zX21lbV9mcmVlKGZsb3dfaW5mbyk7CisgICB9CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NBZGRUc1N1Y2Nlc3NGbnAoKSAtIFV0aWxpdHkgZnVuY3Rpb24gKHBvaW50ZXIpLCAKKyAgaWYgdGhlIEFkZHRzIHJlcXVlc3Qgd2FzIGZvciBmb3IgYW4gZmxvdyBzZXR1cCByZXF1ZXN0LCBub3RpZnkgSEREIGZvciBzdWNjZXNzCisgIGZvciB0aGUgZmxvdyAmIG5vdGlmeSBhbGwgdGhlIG90aGVyIGZsb3dzIHJ1bm5pbmcgb24gdGhlIHNhbWUgQUMgdGhhdCBRb1MgCisgIHBhcmFtcyBnb3QgbW9kaWZpZWQKKyAgaWYgdGhlIEFkZHRzIHJlcXVlc3Qgd2FzIGZvciBkb3duZ3JhZGluZyBvZiBRb1MgcGFyYW1zIGJlY2F1c2Ugb2YgYW4gZmxvdyAKKyAgcmVsZWFzZSByZXF1ZXN0ZWQgb24gdGhlIEFDLCBkZWxldGUgdGhlIGVudHJ5IGZyb20gRmxvdyBsaXN0ICYgbm90aWZ5IEhERCAKKyAgaWYgdGhlIEFkZHRzIHJlcXVlc3Qgd2FzIGZvciBjaGFuZ2Ugb2YgUW9TIHBhcmFtcyBiZWNhdXNlIG9mIGFuIGZsb3cgCisgIG1vZGlmaWNhdGlvbiByZXF1ZXN0ZWQgb24gdGhlIEFDLCBkZWxldGUgdGhlIG9sZCBlbnRyeSBmcm9tIEZsb3cgbGlzdCAmIG5vdGlmeSAKKyAgSEREIGZvciBzdWNjZXNzIGZvciB0aGUgZmxvdyAmIG5vdGlmeSBhbGwgdGhlIG90aGVyIGZsb3dzIHJ1bm5pbmcgb24gdGhlIHNhbWUgCisgIEFDIHRoYXQgUW9TIHBhcmFtcyBnb3QgbW9kaWZpZWQKKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgIFxwYXJhbSBwRW50cnkgLSBQb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBmbG93X2xpc3QoaS5lLiB0TGlzdEVsZW0gc3RydWN0dXJlKQorICAKKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc0FkZFRzU3VjY2Vzc0ZucCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0TGlzdEVsZW0gKnBFbnRyeSkKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgc21lX1Fvc0Zsb3dJbmZvRW50cnkgKmZsb3dfaW5mbyA9IE5VTEw7CisgICB2X0JPT0xfdCBpbmZvcm1faGRkID0gVk9TX0ZBTFNFOworICAgdl9CT09MX3QgZGVsZXRlX2VudHJ5ID0gVk9TX0ZBTFNFOworICAgc21lX1Fvc1N0YXR1c1R5cGUgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1NFVFVQX0ZBSUxVUkVfUlNQOworICAgc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisgICBlSGFsU3RhdHVzIHBtY19zdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzIG1vZGlmeVByb2ZpbGVGaWVsZHM7CisKKyAgIGlmKCFwRW50cnkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogRW50cnkgaXMgTlVMTCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAvL0FTU0VSVAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgZmxvd19pbmZvID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCBzbWVfUW9zRmxvd0luZm9FbnRyeSwgbGluayApOworICAgYWMgPSBmbG93X2luZm8tPmFjX3R5cGU7CisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bZmxvd19pbmZvLT5zZXNzaW9uSWRdOworICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICBpZihmbG93X2luZm8tPnRzcGVjX21hc2sgIT0gcEFDSW5mby0+dHNwZWNfcGVuZGluZykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogTm8gbmVlZCB0byBub3RpZnkgdGhlIEhERCwgdGhlIEFERFRTICIKKyAgICAgICAgICAgICAgICAic3VjY2VzcyBpcyBub3QgZm9yIGluZGV4ID0gJWQgb2YgdGhlIEFDID0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgZmxvd19pbmZvLT50c3BlY19tYXNrLCBhYyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKyAgIHN3aXRjaChmbG93X2luZm8tPnJlYXNvbikKKyAgIHsKKyAgIGNhc2UgU01FX1FPU19SRUFTT05fU0VUVVA6CisgICAgICBoZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkQ7CisgICAgICBmbG93X2luZm8tPnJlYXNvbiA9IFNNRV9RT1NfUkVBU09OX1JFUV9TVUNDRVNTOworICAgICAgZGVsZXRlX2VudHJ5ID0gVk9TX0ZBTFNFOworICAgICAgaW5mb3JtX2hkZCA9IFZPU19UUlVFOworICAgICAgLy8gY2hlY2sgaWYgQXBwIGlzIGxvb2tpbmcgZm9yIEFQU0QKKyAgICAgIGlmKHBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3BBQ0luZm8tPnRzcGVjX3BlbmRpbmcgLSAxXS50c19pbmZvLnBzYikKKyAgICAgIHsKKyAgICAgICAgIC8vIG5vdGlmeSBQTUMgYXMgQXBwIGlzIGxvb2tpbmcgZm9yIEFQU0QuIElmIHdlIGFscmVhZHkgcmVxdWVzdGVkCisgICAgICAgICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKKyAgICAgICAgIGlmKCFwU2Vzc2lvbi0+dWFwc2RBbHJlYWR5UmVxdWVzdGVkKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgZmlyc3QgZmxvdyB0byBkZXRlY3Qgd2UgbmVlZCBQTUMgaW4gVUFQU0QgbW9kZQorICAgICAgICAgICAgcG1jX3N0YXR1cyA9IHBtY1N0YXJ0VWFwc2QocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NQbWNTdGFydFVhcHNkQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbik7CisgICAgICAgICAgICAvLyBpZiBQTUMgZG9lc24ndCByZXR1cm4gc3VjY2VzcyByaWdodCBhd2F5IG1lYW5zIGl0IGlzIHlldCB0byBwdXQKKyAgICAgICAgICAgIC8vIHRoZSBtb2R1bGUgaW4gQk1QUyBzdGF0ZSAmIGxhdGVyIHRvIFVBUFNEIHN0YXRlCisgICAgICAgICAgICBpZihlSEFMX1NUQVRVU19GQUlMVVJFID09IHBtY19zdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfU1VDQ0VTU19JTkRfQVBTRF9TRVRfRkFJTEVEOworICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhbHdheXMgbm90aWZ5IHRoaXMgY2FzZQorICAgICAgICAgICAgICAgZmxvd19pbmZvLT5ob1JlbmV3YWwgPSBWT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HID09IHBtY19zdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvLyBsZXQgb3RoZXIgZmxvd3Mga25vdyBQTUMgaGFzIGJlZW4gbm90aWZpZWQKKyAgICAgICAgICAgICAgIHBTZXNzaW9uLT51YXBzZEFscmVhZHlSZXF1ZXN0ZWQgPSBWT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZvciBhbnkgb3RoZXIgcG1jIHN0YXR1cyB3ZSBkZWNsYXJlIHN1Y2Nlc3MKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgY2FzZSBTTUVfUU9TX1JFQVNPTl9SRUxFQVNFOgorICAgICAgcEFDSW5mby0+bnVtX2Zsb3dzW3BBQ0luZm8tPnRzcGVjX3BlbmRpbmcgLSAxXS0tOworICAgICAgaGRkX3N0YXR1cyA9IFNNRV9RT1NfU1RBVFVTX1JFTEVBU0VfU1VDQ0VTU19SU1A7CisgICAgICBpbmZvcm1faGRkID0gVk9TX1RSVUU7CisgICAgICBkZWxldGVfZW50cnkgPSBWT1NfVFJVRTsKKyAgICAgIGJyZWFrOworICAgY2FzZSBTTUVfUU9TX1JFQVNPTl9NT0RJRlk6CisgICAgICBkZWxldGVfZW50cnkgPSBWT1NfVFJVRTsKKyAgICAgIGluZm9ybV9oZGQgPSBWT1NfRkFMU0U7CisgICAgICBicmVhazsKKyAgIGNhc2UgU01FX1FPU19SRUFTT05fTU9ESUZZX1BFTkRJTkc6CisgICAgICBoZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfSU5EOworICAgICAgZGVsZXRlX2VudHJ5ID0gVk9TX0ZBTFNFOworICAgICAgZmxvd19pbmZvLT5yZWFzb24gPSBTTUVfUU9TX1JFQVNPTl9SRVFfU1VDQ0VTUzsKKyAgICAgIGluZm9ybV9oZGQgPSBWT1NfVFJVRTsKKyAgICAgIC8vbm90aWZ5IFBNQyBpZiBBcHAgaXMgbG9va2luZyBmb3IgQVBTRAorICAgICAgaWYocEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bcEFDSW5mby0+dHNwZWNfcGVuZGluZyAtIDFdLnRzX2luZm8ucHNiKQorICAgICAgeworICAgICAgICAgLy8gbm90aWZ5IFBNQyBhcyBBcHAgaXMgbG9va2luZyBmb3IgQVBTRC4gSWYgd2UgYWxyZWFkeSByZXF1ZXN0ZWQKKyAgICAgICAgIC8vIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KKyAgICAgICAgIGlmKCFwU2Vzc2lvbi0+dWFwc2RBbHJlYWR5UmVxdWVzdGVkKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgZmlyc3QgZmxvdyB0byBkZXRlY3Qgd2UgbmVlZCBQTUMgaW4gVUFQU0QgbW9kZQorICAgICAgICAgICAgcG1jX3N0YXR1cyA9IHBtY1N0YXJ0VWFwc2QocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NQbWNTdGFydFVhcHNkQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbik7CisgICAgICAgICAgICAvLyBpZiBQTUMgZG9lc24ndCByZXR1cm4gc3VjY2VzcyByaWdodCBhd2F5IG1lYW5zIGl0IGlzIHlldCB0byBwdXQKKyAgICAgICAgICAgIC8vIHRoZSBtb2R1bGUgaW4gQk1QUyBzdGF0ZSAmIGxhdGVyIHRvIFVBUFNEIHN0YXRlCisgICAgICAgICAgICBpZihlSEFMX1NUQVRVU19GQUlMVVJFID09IHBtY19zdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBoZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfSU5EX0FQU0RfU0VUX0ZBSUxFRDsKKyAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWx3YXlzIG5vdGlmeSB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgIGZsb3dfaW5mby0+aG9SZW5ld2FsID0gVk9TX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihlSEFMX1NUQVRVU19QTUNfUEVORElORyA9PSBwbWNfc3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy8gbGV0IG90aGVyIGZsb3dzIGtub3cgUE1DIGhhcyBiZWVuIG5vdGlmaWVkCisgICAgICAgICAgICAgICBwU2Vzc2lvbi0+dWFwc2RBbHJlYWR5UmVxdWVzdGVkID0gVk9TX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmb3IgYW55IG90aGVyIHBtYyBzdGF0dXMgd2UgZGVjbGFyZSBzdWNjZXNzCisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmKChwQUNJbmZvLT5udW1fZmxvd3NbZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0gPT0gMSkgJiYgCisgICAgICAgICAgIChTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgIT0gcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgb25seSBUU1BFQyBhY3RpdmUgb24gdGhpcyBBQworICAgICAgICAgIC8vIHNvIGluZGljYXRlIHRoYXQgd2Ugbm8gbG9uZ2VyIHJlcXVpcmUgQVBTRAorICAgICAgICAgIHBTZXNzaW9uLT5hcHNkTWFzayAmPSB+KDEgPDwgKFNNRV9RT1NfRURDQV9BQ19WTyAtIGFjKSk7CisgICAgICAgICAgLy9BbHNvIHVwZGF0ZSBtb2RpZnlQcm9maWxlRmllbGRzLnVhcHNkX21hc2sgaW4gQ1NSIGZvciBjb25zaXN0ZW5jeQorICAgICAgICAgIGNzckdldE1vZGlmeVByb2ZpbGVGaWVsZHMocE1hYywgZmxvd19pbmZvLT5zZXNzaW9uSWQsICZtb2RpZnlQcm9maWxlRmllbGRzKTsKKyAgICAgICAgICBtb2RpZnlQcm9maWxlRmllbGRzLnVhcHNkX21hc2sgPSBwU2Vzc2lvbi0+YXBzZE1hc2s7IAorICAgICAgICAgIGNzclNldE1vZGlmeVByb2ZpbGVGaWVsZHMocE1hYywgZmxvd19pbmZvLT5zZXNzaW9uSWQsICZtb2RpZnlQcm9maWxlRmllbGRzKTsKKyAgICAgICAgICBpZighcFNlc3Npb24tPmFwc2RNYXNrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAvLyB0aGlzIHNlc3Npb24gbm8gbG9uZ2VyIG5lZWRzIFVBUFNECisgICAgICAgICAgICAgLy8gZG8gYW55IHNlc3Npb25zIHN0aWxsIHJlcXVpcmUgVUFQU0Q/CisgICAgICAgICAgICAgaWYgKCFzbWVfUW9zSXNVYXBzZEFjdGl2ZSgpKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBObyBzZXNzaW9ucyByZXF1aXJlIFVBUFNEIHNvIHR1cm4gaXQgb2ZmCisgICAgICAgICAgICAgICAgLy8gKHJlYWxseSBkb24ndCBjYXJlIHdoZW4gUE1DIHN0b3BzIGl0KQorICAgICAgICAgICAgICAgICh2b2lkKXBtY1N0b3BVYXBzZChwTWFjKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1M6CisgICAgICBoZGRfc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfTU9ESUZJRURfSU5EOworICAgICAgaW5mb3JtX2hkZCA9IFZPU19UUlVFOworICAgZGVmYXVsdDoKKyAgICAgIGRlbGV0ZV9lbnRyeSA9IFZPU19GQUxTRTsKKyAgICAgIGJyZWFrOworICAgfQorICAgaWYoaW5mb3JtX2hkZCkKKyAgIHsKKyAgICAgIGlmKCFmbG93X2luZm8tPmhvUmVuZXdhbCkKKyAgICAgIHsKKyAgICAgIAorICAgICAgICAgZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLCBmbG93X2luZm8tPkhERGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3BBQ0luZm8tPnRzcGVjX3BlbmRpbmcgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRkX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgZmxvd19pbmZvLT5ob1JlbmV3YWwgPSBWT1NfRkFMU0U7CisgICAgICB9CisgICB9CisgICBpZihkZWxldGVfZW50cnkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IERlbGV0aW5nIGVudHJ5IGF0ICVwIHdpdGggZmxvd0lEICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIGZsb3dfaW5mbywgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgLy9kZWxldGUgdGhlIGVudHJ5IGZyb20gRmxvdyBMaXN0CisgICAgICBjc3JMTFJlbW92ZUVudHJ5KCZzbWVfUW9zQ2IuZmxvd19saXN0LCBwRW50cnksIFZPU19UUlVFICk7CisgICAgICAvLyByZWNsYWltIHRoZSBtZW1vcnkKKyAgICAgIHZvc19tZW1fZnJlZShmbG93X2luZm8pOworICAgfQorCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NJc1JzcFBlbmRpbmcoKSAtIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2UgYXJlIHdhaXRpbmcgCisgIGZvciBhbiBBZGRUUyBvciByZWFzc29jIHJlc3BvbnNlIG9uIHNvbWUgQUMgb3RoZXIgdGhhbiB0aGUgZ2l2ZW4gQUMKKyAgCisgIFxwYXJhbSBzZXNzaW9uSWQgLSBTZXNzaW9uIHdlIGFyZSBpbnRlcnRlZCBpbgorICBccGFyYW0gYWMgLSBFbnVtZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBFRENBIEFjY2VzcyBDYXRlZ29yaWVzLgorICAKKyAgXHJldHVybiBib29sZWFuCisgIFRSVUUgLSBSZXNwb25zZSBpcyBwZW5kaW5nIG9uIGFuIEFDCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2X0JPT0xfdCBzbWVfUW9zSXNSc3BQZW5kaW5nKHZfVThfdCBzZXNzaW9uSWQsIHNtZV9Rb3NFZGNhQWNUeXBlIGFjKQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisgICBzbWVfUW9zRWRjYUFjVHlwZSBhY0luZGV4OworICAgdl9CT09MX3Qgc3RhdHVzID0gVk9TX0ZBTFNFOworICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICBmb3IoYWNJbmRleCA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWNJbmRleCA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjSW5kZXgrKykgCisgICB7CisgICAgICBpZihhY0luZGV4ID09IGFjKQorICAgICAgeworICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBwQUNJbmZvID0gJnBTZXNzaW9uLT5hY19pbmZvW2FjSW5kZXhdOworICAgICAgaWYoKHBBQ0luZm8tPnRzcGVjX3BlbmRpbmcpIHx8IChwQUNJbmZvLT5yZWFzc29jX3BlbmRpbmcpKQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gVk9TX1RSVUU7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zSXNVYXBzZEFjdGl2ZSgpIC0gRnVuY3Rpb24gd2hpY2ggY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUKKyAgaWYgYW55IHNlc3Npb25zIHJlcXVpcmUgUE1DIHRvIGJlIGluIFUtQVBTRCBtb2RlLgorICBccmV0dXJuIGJvb2xlYW4KKyAgCisgIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2Vzc2lvbiByZXF1aXJlZCBQTUMgdG8gYmUgaW4gVS1BUFNEIG1vZGUKKyAgUmV0dXJucyBmYWxzZSBpZiBubyBzZXNzaW9ucyByZXF1aXJlIFBNQyB0byBiZSBpbiBVLUFQU0QgbW9kZQorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdl9CT09MX3Qgc21lX1Fvc0lzVWFwc2RBY3RpdmUodm9pZCkKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICB2X1U4X3Qgc2Vzc2lvbklkOworICAgZm9yIChzZXNzaW9uSWQgPSAwOyBzZXNzaW9uSWQgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgKytzZXNzaW9uSWQpCisgICB7CisgICAgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKyAgICAgIGlmICgocFNlc3Npb24tPnNlc3Npb25BY3RpdmUpICYmIChwU2Vzc2lvbi0+YXBzZE1hc2spKQorICAgICAgeworICAgICAgICAgcmV0dXJuIFZPU19UUlVFOworICAgICAgfQorICAgfQorICAgLy8gbm8gYWN0aXZlIHNlc3Npb25zIGhhdmUgVS1BUFNEIGFjdGl2ZQorICAgcmV0dXJuIFZPU19GQUxTRTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQbWNGdWxsUG93ZXJDYWxsYmFjaygpIC0gQ2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIFBNQyAKKyAgdG8gbm90aWZ5IFNNRS1Rb1Mgd2hlbiBpdCBwdXRzIHRoZSBjaGlwIGludG8gZnVsbCBwb3dlcgorICAKKyAgXHBhcmFtIGNhbGxiYWNrQ29udGV4dCAtIFRoZSBjb250ZXh0IHBhc3NlZCB0byBQTUMgZHVyaW5nIHBtY1JlcXVlc3RGdWxsUG93ZXIKKyAgY2FsbC4KKyAgXHBhcmFtIHN0YXR1cyAtIGVIYWxTdGF0dXMgcmV0dXJuZWQgYnkgUE1DLgorICAKKyAgXHJldHVybiBOb25lCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX1Fvc1BtY0Z1bGxQb3dlckNhbGxiYWNrKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uID0gY2FsbGJhY2tDb250ZXh0OworICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICAodm9pZClzbWVfUW9zUHJvY2Vzc0J1ZmZlcmVkQ21kKHBTZXNzaW9uLT5zZXNzaW9uSWQpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IFBNQyBmYWlsZWQgdG8gcHV0IHRoZSBjaGlwIGluIEZ1bGwgcG93ZXIiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgLy9BU1NFUlQKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQbWNTdGFydFVBUFNEQ2FsbGJhY2soKSAtIENhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCBQTUMgCisgIHRvIG5vdGlmeSBTTUUtUW9TIHdoZW4gaXQgcHV0cyB0aGUgY2hpcCBpbnRvIFVBUFNEIG1vZGUKKyAgCisgIFxwYXJhbSBjYWxsYmFja0NvbnRleHQgLSBUaGUgY29udGV4dCBwYXNzZWQgdG8gUE1DIGR1cmluZyBwbWNTdGFydFVhcHNkIGNhbGwuCisgIFxwYXJhbSBzdGF0dXMgLSBlSGFsU3RhdHVzIHJldHVybmVkIGJ5IFBNQy4KKyAgCisgIFxyZXR1cm4gTm9uZQorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNtZV9Rb3NQbWNTdGFydFVhcHNkQ2FsbGJhY2sodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cykKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb24gPSBjYWxsYmFja0NvbnRleHQ7CisgICAvLyBOT1RFIFdFTEwKKyAgIC8vCisgICAvLyBJbiB0aGUgb3JpZ25hbCBRb1MgZGVzaWduIHRoZSBUTCBtb2R1bGUgd2FzIHJlc3BvbnNpYmxlIGZvcgorICAgLy8gdGhlIGdlbmVyYXRpb24gb2YgdHJpZ2dlciBmcmFtZXMuICBXaGVuIHRoYXQgZGVzaWduIHdhcyBpbgorICAgLy8gdXNlLCB3ZSBoYWQgdG8gcXVldWUgdXAgYW55IGZsb3dzIHdoaWNoIHdlcmUgd2FpdGluZyBmb3IgUE1DCisgICAvLyBzaW5jZSB3ZSBkaWRuJ3Qgd2FudCB0byBub3RpZnkgSEREIHVudGlsIFBNQyBoYWQgY2hhbmdlZCB0bworICAgLy8gVUFQU0Qgc3RhdGUuICBPdGhlcndpc2UgSEREIHdvdWxkIHByb3ZpZGUgVEwgd2l0aCB0aGUgdHJpZ2dlcgorICAgLy8gZnJhbWUgcGFyYW1ldGVycywgYW5kIFRMIHdvdWxkIHN0YXJ0IHRyaWdnZXIgZnJhbWUgZ2VuZXJhdGlvbgorICAgLy8gYmVmb3JlIFBNQyB3YXMgcmVhZHkuICBUaGUgZmxvd3Mgd2VyZSBxdWV1ZWQgaW4gdmFyaW91cyBwbGFjZXMKKyAgIC8vIHRocm91Z2hvdXQgdGhpcyBtb2R1bGUsIGFuZCB0aGV5IHdlcmUgZGVxdWV1ZWQgaGVyZSBmb2xsb3dpbmcKKyAgIC8vIGEgc3VjY2Vzc2Z1bCB0cmFuc2l0aW9uIHRvIHRoZSBVQVBTRCBzdGF0ZSBieSBQTUMuCisgICAvLworICAgLy8gSW4gdGhlIGN1cnJlbnQgUW9TIGRlc2lnbiB0aGUgRmlybXdhcmUgaXMgcmVzcG9uc2libGUgZm9yIHRoZQorICAgLy8gZ2VuZXJhdGlvbiBvZiB0cmlnZ2VyIGZyYW1lcywgYnV0IHRoZSBwYXJhbWV0ZXJzIGFyZSBzdGlsbAorICAgLy8gcHJvdmlkZWQgYnkgVEwgdmlhIEhERC4gIFRoZSBGaXJtd2FyZSB3aWxsIGJlIG5vdGlmaWVkIG9mIHRoZQorICAgLy8gY2hhbmdlIHRvIFVBUFNEIHN0YXRlIGRpcmVjdGx5IGJ5IFBNQywgYXQgd2hpY2ggdGltZSBpdCB3aWxsIGJlCisgICAvLyByZXNwb25zaWJsZSBmb3IgdGhlIGdlbmVyYXRpb24gb2YgdHJpZ2dlciBmcmFtZXMuIFRoZXJlZm9yZQorICAgLy8gd2hlcmUgd2UgdXNlZCB0byBxdWV1ZSB1cCBmbG93cyB3YWl0aW5nIGZvciBQTUMgdG8gdHJhbnNpdGlvbgorICAgLy8gdG8gdGhlIFVBUFNEIHN0YXRlLCB3ZSBub3cgYWx3YXlzIHRyYW5zaXRpb24gZGlyZWN0bHkgdG8gdGhlCisgICAvLyAic3VjY2VzcyIgc3RhdGUgc28gdGhhdCBIREQgd2lsbCBpbW1lZGlhdGVseSBwcm92aWRlIHRoZSB0cmlnZ2VyCisgICAvLyBmcmFtZSBwYXJhbWV0ZXJzIHRvIFRMLCB3aG8gd2lsbCBpbiB0dXJuIHBsdW1iIHRoZW0gZG93biB0byB0aGUKKyAgIC8vIEZpcm13YXJlLiAgVGhhdCB3YXkgdGhlIEZpcm13YXJlIHdpbGwgaGF2ZSB0aGUgdHJpZ2dlciBmcmFtZQorICAgLy8gcGFyYW1ldGVycyB3aGVuIGl0IG5lZWRzIHRoZW0KKyAgIC8vIGp1c3Qgbm90ZSB0aGF0IHRoZXJlIGlzIG5vIGxvbmdlciBhbiBvdXRzdGFuZGluZyByZXF1ZXN0CisgICBwU2Vzc2lvbi0+dWFwc2RBbHJlYWR5UmVxdWVzdGVkID0gVk9TX0ZBTFNFOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1BtY0NoZWNrUm91dGluZSgpIC0gRnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIFBNQyB0byBjaGVjayB3aXRoIAorICBTTUUtUW9TIHdoZW5ldmVyIHRoZSBkZXZpY2UgaXMgYWJvdXQgdG8gZW50ZXIgb25lIG9mIHRoZSBwb3dlciAKKyAgc2F2ZSBtb2Rlcy4gUE1DIHJ1bnMgYSBwb2xsIHdpdGggYWxsIHRoZSByZWdpc3RlcmVkIG1vZHVsZXMgaWYgZGV2aWNlIGNhbiAKKyAgZW50ZXIgcG93ZXJzYXZlIG1vZGUgb3IgcmVtYWluIGluIGZ1bGwgcG93ZXIgIAorICAKKyAgXHBhcmFtIGNhbGxiYWNrQ29udGV4dCAtIFRoZSBjb250ZXh0IHBhc3NlZCB0byBQTUMgZHVyaW5nIHJlZ2lzdHJhdGlvbiB0aHJvdWdoCisgIHBtY1JlZ2lzdGVyUG93ZXJTYXZlQ2hlY2suCisgIFxyZXR1cm4gYm9vbGVhbgorICAKKyAgU01FLVFPUyByZXR1cm5zIFBNQyB0cnVlIG9yIGZhbHNlIHJlc3BlY3RpdmVseSBpZiBpdCB3YW50cyB0byB2b3RlIGZvciAKKyAgZW50ZXJpbmcgcG93ZXIgc2F2ZSBvciBub3QKKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9CT09MX3Qgc21lX1Fvc1BtY0NoZWNrUm91dGluZSh2b2lkICpjYWxsYmFja0NvbnRleHQpCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgdl9VOF90IHNlc3Npb25JZDsKKyAgIGZvciAoc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7ICsrc2Vzc2lvbklkKQorICAgeworICAgICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICAgICBpZiAoKHBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlKSAmJgorICAgICAgICAgICghcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlKSkKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBWT1NfRkFMU0U7CisgICAgICB9CisgICB9CisgICAvLyBhbGwgYWN0aXZlIHNlc3Npb25zIGhhdmUgdm90ZWQgZm9yIHBvd2Vyc2F2ZQorICAgcmV0dXJuIFZPU19UUlVFOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1Fvc1BtY0RldmljZVN0YXRlVXBkYXRlSW5kKCkgLSBDYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggCisgIFBNQyB0byBub3RpZnkgU01FLVFvUyB3aGVuIGl0IGNoYW5nZXMgdGhlIHBvd2VyIHN0YXRlCisgIAorICBccGFyYW0gY2FsbGJhY2tDb250ZXh0IC0gVGhlIGNvbnRleHQgcGFzc2VkIHRvIFBNQyBkdXJpbmcgcmVnaXN0cmF0aW9uIAorICB0aHJvdWdoIHBtY1JlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQuCisgIFxwYXJhbSBwbWNTdGF0ZSAtIEN1cnJlbnQgcG93ZXIgc3RhdGUgdGhhdCBQTUMgbW92ZWQgaW50by4KKyAgCisgIFxyZXR1cm4gTm9uZQorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNtZV9Rb3NQbWNEZXZpY2VTdGF0ZVVwZGF0ZUluZCh2b2lkICpjYWxsYmFja0NvbnRleHQsIHRQbWNTdGF0ZSBwbWNTdGF0ZSkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggY2FsbGJhY2tDb250ZXh0ICk7CisgICAvL2NoZWNrIGFsbCB0aGUgZW50cmllcyBpbiBGbG93IGxpc3QgZm9yIG5vbi16ZXJvIHNlcnZpY2UgaW50ZXJ2YWwsIHdoaWNoIHdpbGwKKyAgIC8vdGVsbCB1cyBpZiB3ZSBuZWVkIHRvIG5vdGlmeSBIREQgd2hlbiBQTUMgaXMgb3V0IG9mIFVBUFNEIG1vZGUgb3IgZ29pbmcgCisgICAvLyBiYWNrIHRvIFVBUFNEIG1vZGUKKyAgIHN3aXRjaChwbWNTdGF0ZSkKKyAgIHsKKyAgIGNhc2UgRlVMTF9QT1dFUjoKKyAgICAgIHN0YXR1cyA9IHNtZV9Rb3NQcm9jZXNzT3V0T2ZVYXBzZE1vZGUocE1hYyk7CisgICAgICBicmVhazsKKyAgIGNhc2UgVUFQU0Q6CisgICAgICBzdGF0dXMgPSBzbWVfUW9zUHJvY2Vzc0ludG9VYXBzZE1vZGUocE1hYyk7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IG5vdGhpbmcgdG8gcHJvY2VzcyBpbiBQTUMgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgcG1jU3RhdGUpOworICAgfQorICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IGlnbm9yaW5nIERldmljZShQTUMpIHN0YXRlIGNoYW5nZSB0byAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBwbWNTdGF0ZSk7CisgICB9CisKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Rb3NQcm9jZXNzT3V0T2ZVYXBzZE1vZGUoKSAtIEZ1bmN0aW9uIHRvIG5vdGlmeSBIREQgd2hlbiBQTUMgCisgIG5vdGlmaWVzIFNNRS1Rb1MgdGhhdCBpdCBtb3ZlZCBvdXQgb2YgVUFQU0QgbW9kZSB0byBGVUxMIHBvd2VyCisgIAorICBccGFyYW0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBNQUMgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgXHJldHVybiBlSGFsU3RhdHVzCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Fvc1Byb2Nlc3NPdXRPZlVhcHNkTW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHRMaXN0RWxlbSAqcEVudHJ5PSBOVUxMLCAqcE5leHRFbnRyeSA9IE5VTEw7CisgICBzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKyAgIAorICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnNtZV9Rb3NDYi5mbG93X2xpc3QsIFZPU19GQUxTRSApOworICAgaWYoIXBFbnRyeSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBGbG93IExpc3QgZW1wdHksIGNhbid0IHNlYXJjaCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIHdoaWxlKCBwRW50cnkgKQorICAgeworICAgICAgcE5leHRFbnRyeSA9IGNzckxMTmV4dCggJnNtZV9Rb3NDYi5mbG93X2xpc3QsIHBFbnRyeSwgVk9TX0ZBTFNFICk7CisgICAgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rICk7CisgICAgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bZmxvd19pbmZvLT5zZXNzaW9uSWRdOworICAgICAgLy9vbmx5IG5vdGlmeSB0aGUgZmxvd3Mgd2hpY2ggYWxyZWFkeSBzdWNjZXNzZnVsbHkgc2V0dXAgVUFQU0QKKyAgICAgIGlmKChmbG93X2luZm8tPlFvU0luZm8ubWF4X3NlcnZpY2VfaW50ZXJ2YWwgfHwKKyAgICAgICAgICBmbG93X2luZm8tPlFvU0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwpICYmCisgICAgICAgICAoU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1MgPT0gZmxvd19pbmZvLT5yZWFzb24pKQorICAgICAgeworICAgICAgICAgZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLCBmbG93X2luZm8tPkhERGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmFjX2luZm9bZmxvd19pbmZvLT5hY190eXBlXS5jdXJyX1FvU0luZm9bZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNRV9RT1NfU1RBVFVTX09VVF9PRl9BUFNEX1BPV0VSX01PREVfSU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2luZm8tPlFvc0Zsb3dJRCk7CisgICAgICB9CisgICAgICBwRW50cnkgPSBwTmV4dEVudHJ5OworICAgfQorICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zUHJvY2Vzc0ludG9VYXBzZE1vZGUoKSAtIEZ1bmN0aW9uIHRvIG5vdGlmeSBIREQgd2hlbiBQTUMgCisgIG5vdGlmaWVzIFNNRS1Rb1MgdGhhdCBpdCBpcyBtb3ZpbmcgaW50byBVQVBTRCBtb2RlIAorICAKKyAgXHBhcmFtIHBNYWMgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgTUFDIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgIFxyZXR1cm4gZUhhbFN0YXR1cworICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Rb3NQcm9jZXNzSW50b1VhcHNkTW9kZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHRMaXN0RWxlbSAqcEVudHJ5PSBOVUxMLCAqcE5leHRFbnRyeSA9IE5VTEw7CisgICBzbWVfUW9zRmxvd0luZm9FbnRyeSAqZmxvd19pbmZvID0gTlVMTDsKKworICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnNtZV9Rb3NDYi5mbG93X2xpc3QsIFZPU19GQUxTRSApOworICAgaWYoIXBFbnRyeSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBGbG93IExpc3QgZW1wdHksIGNhbid0IHNlYXJjaCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKyAgIHdoaWxlKCBwRW50cnkgKQorICAgeworICAgICAgcE5leHRFbnRyeSA9IGNzckxMTmV4dCggJnNtZV9Rb3NDYi5mbG93X2xpc3QsIHBFbnRyeSwgVk9TX0ZBTFNFICk7CisgICAgICBmbG93X2luZm8gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHNtZV9Rb3NGbG93SW5mb0VudHJ5LCBsaW5rICk7CisgICAgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bZmxvd19pbmZvLT5zZXNzaW9uSWRdOworICAgICAgLy9vbmx5IG5vdGlmeSB0aGUgZmxvd3Mgd2hpY2ggYWxyZWFkeSBzdWNjZXNzZnVsbHkgc2V0dXAgVUFQU0QKKyAgICAgIGlmKChmbG93X2luZm8tPlFvU0luZm8ubWF4X3NlcnZpY2VfaW50ZXJ2YWwgfHwKKyAgICAgICAgICBmbG93X2luZm8tPlFvU0luZm8ubWluX3NlcnZpY2VfaW50ZXJ2YWwpICYmCisgICAgICAgICAoU01FX1FPU19SRUFTT05fUkVRX1NVQ0NFU1MgPT0gZmxvd19pbmZvLT5yZWFzb24pKQorICAgICAgeworICAgICAgICAgZmxvd19pbmZvLT5Rb1NDYWxsYmFjayhwTWFjLCBmbG93X2luZm8tPkhERGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmFjX2luZm9bZmxvd19pbmZvLT5hY190eXBlXS5jdXJyX1FvU0luZm9bZmxvd19pbmZvLT50c3BlY19tYXNrIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNRV9RT1NfU1RBVFVTX0lOVE9fQVBTRF9QT1dFUl9NT0RFX0lORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbmZvLT5Rb3NGbG93SUQpOworICAgICAgfQorICAgICAgcEVudHJ5ID0gcE5leHRFbnRyeTsKKyAgIH0KKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCit2b2lkIHNtZV9Rb3NDbGVhbnVwQ3RybEJsa0ZvckhhbmRvZmYodHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCkKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgc21lX1Fvc0VkY2FBY1R5cGUgYWM7CisgICBwU2Vzc2lvbiA9ICZzbWVfUW9zQ2Iuc2Vzc2lvbkluZm9bc2Vzc2lvbklkXTsKKyAgIGZvcihhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKSAKKyAgIHsKKyAgICAgIHBBQ0luZm8gPSAmcFNlc3Npb24tPmFjX2luZm9bYWNdOworICAgICAgdm9zX21lbV96ZXJvKHBBQ0luZm8tPmN1cnJfUW9TSW5mbywgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNtZV9Rb3NXbW1Uc3BlY0luZm8pICogU01FX1FPU19UU1BFQ19JTkRFWF9NQVgpOworICAgICAgdm9zX21lbV96ZXJvKHBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2Yoc21lX1Fvc1dtbVRzcGVjSW5mbykgKiBTTUVfUU9TX1RTUEVDX0lOREVYX01BWCk7CisgICAgICBwQUNJbmZvLT5udW1fZmxvd3NbMF0gPSAwOworICAgICAgcEFDSW5mby0+bnVtX2Zsb3dzWzFdID0gMDsKKyAgICAgIHBBQ0luZm8tPnJlYXNzb2NfcGVuZGluZyA9IFZPU19GQUxTRTsKKyAgICAgIHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzID0gMDsKKyAgICAgIHBBQ0luZm8tPnRzcGVjX3BlbmRpbmcgPSBWT1NfRkFMU0U7CisgICAgICBwQUNJbmZvLT5ob1JlbmV3YWwgPSBWT1NfRkFMU0U7CisgICAgICBwQUNJbmZvLT5wcmV2X3N0YXRlID0gU01FX1FPU19MSU5LX1VQOworICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUW9zSXNUU0luZm9BY2tQb2xpY3lWYWxpZCgpIC0gVGhlIFNNRSBRb1MgQVBJIGV4cG9zZWQgdG8gSEREIHRvIAorICBjaGVjayBpZiBUUyBpbmZvIGFjayBwb2xpY3kgZmllbGQgY2FuIGJlIHNldCB0byAiSFQtaW1tZWRpYXRlIGJsb2NrIGFja25vd2xlZGdlbWVudCIgCisgIAorICBccGFyYW0gcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgXHBhcmFtIHBRb1NJbmZvIC0gUG9pbnRlciB0byBzbWVfUW9zV21tVHNwZWNJbmZvIHdoaWNoIGNvbnRhaW5zIHRoZSBXTU0gVFNQRUMKKyAgICAgICAgICAgICAgICAgICAgcmVsYXRlZCBpbmZvLCBwcm92aWRlZCBieSBIREQKKyAgXHBhcmFtIHNlc3Npb25JZCAtIHNlc3Npb25JZCByZXR1cm5lZCBieSBzbWVfT3BlblNlc3Npb24uCisgIAorICBccmV0dXJuIFZPU19UUlVFIC0gQ3VycmVudCBBc3NvY2lhdGlvbiBpcyBIVCBhc3NvY2lhdGlvbiBhbmQgc28gVFMgaW5mbyBhY2sgcG9saWN5CisgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgc2V0IHRvICJIVC1pbW1lZGlhdGUgYmxvY2sgYWNrbm93bGVkZ2VtZW50IgorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X0JPT0xfdCBzbWVfUW9zSXNUU0luZm9BY2tQb2xpY3lWYWxpZCh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwUW9TSW5mbywKKyAgICB2X1U4X3Qgc2Vzc2lvbklkKQoreworICB0RG90MTFmQmVhY29uSUVzICpwSWVzID0gTlVMTDsKKyAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgZUhhbFN0YXR1cyBoc3RhdHVzOworICBpZiggIUNTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgIiVzOiAlZDogU2Vzc2lvbiBJZCAlZCBpcyBpbnZhbGlkIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICByZXR1cm4gVk9TX0ZBTFNFOworICB9CisKKyAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisKKyAgaWYoICFwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSApCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgIiVzOiAlZDogU2Vzc2lvbiAlZCBpcyBpbmFjdGl2ZSIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgcmV0dXJuIFZPU19GQUxTRTsKKyAgfQorCisgIGlmKCFwU2Vzc2lvbi0+YXNzb2NJbmZvLnBCc3NEZXNjKQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICIlczogJWQ6IFNlc3Npb24gJWQgaGFzIGFuIEludmFsaWQgQlNTIERlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgIHJldHVybiBWT1NfRkFMU0U7CisgIH0KKworICBoc3RhdHVzID0gY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEllcyk7CisgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoaHN0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIHVuYWJsZSB0byBwYXJzZSBCU1MgSUVzIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICByZXR1cm4gVk9TX0ZBTFNFOworICB9CisKKyAgLyogc3VjY2VzcyBtZWFucyBwSWVzIHdhcyBhbGxvY2F0ZWQgKi8KKworICBpZighcEllcy0+SFRDYXBzLnByZXNlbnQgJiYKKyAgICAgcFFvU0luZm8tPnRzX2luZm8uYWNrX3BvbGljeSA9PSBTTUVfUU9TX1dNTV9UU19BQ0tfUE9MSUNZX0hUX0lNTUVESUFURV9CTE9DS19BQ0spCisgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIEhUIENhcHMgYXJlbid0IHByZXNlbnQgYnV0IGFwcGxpY2F0aW9uIHNldCBhY2sgcG9saWN5IHRvIEhUICIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgCisgICAgICB2b3NfbWVtX2ZyZWUocEllcyk7CisgICAgICByZXR1cm4gVk9TX0ZBTFNFOworICB9CisKKyAgdm9zX21lbV9mcmVlKHBJZXMpOworICByZXR1cm4gVk9TX1RSVUU7Cit9CisKK3ZfQk9PTF90IHNtZV9Rb3NWYWxpZGF0ZVJlcXVlc3RlZFBhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgIHNtZV9Rb3NXbW1Uc3BlY0luZm8gKiBwUW9TSW5mbywKKyAgICB2X1U4X3Qgc2Vzc2lvbklkKQoreworICAgdl9CT09MX3QgcmMgPSBWT1NfRkFMU0U7CisKKyAgIGRvCisgICB7CisgICAgICBpZihTTUVfUU9TX1dNTV9UU19ESVJfUkVTViA9PSBwUW9TSW5mby0+dHNfaW5mby5kaXJlY3Rpb24pIGJyZWFrOworICAgICAgaWYoIXNtZV9Rb3NJc1RTSW5mb0Fja1BvbGljeVZhbGlkKHBNYWMsIHBRb1NJbmZvLCBzZXNzaW9uSWQpKSBicmVhazsKKworICAgICAgcmMgPSBWT1NfVFJVRTsKKyAgIH13aGlsZSgwKTsKKyAgIHJldHVybiByYzsKK30KKworc3RhdGljIGVIYWxTdGF0dXMgcW9zSXNzdWVDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1U4X3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU21lQ29tbWFuZFR5cGUgY21kVHlwZSwgc21lX1Fvc1dtbVRzcGVjSW5mbyAqIHBRb1NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zRWRjYUFjVHlwZSBhYywgdl9VOF90IHRzcGVjX21hc2sgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfUkVTT1VSQ0VTOworICAgIHRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKyAgICBkbworICAgIHsKKyAgICAgICAgcENvbW1hbmQgPSBzbWVHZXRDb21tYW5kQnVmZmVyKCBwTWFjICk7CisgICAgICAgIGlmICggIXBDb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXIgZm9yIGNvbW1hbmQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGNtZFR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBjbWRUeXBlOworICAgICAgICBwQ29tbWFuZC0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICBzd2l0Y2ggKCBjbWRUeXBlICkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVTbWVDb21tYW5kQWRkVHM6CisgICAgICAgICAgICBpZiggcFFvU0luZm8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucW9zQ21kLnRzcGVjSW5mbyA9ICpwUW9TSW5mbzsKKyAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5xb3NDbWQuYWMgPSBhYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IE5VTEwgcG9pbnRlciBwYXNzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlU21lQ29tbWFuZERlbFRzOgorICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnFvc0NtZC5hYyA9IGFjOworICAgICAgICAgICAgcENvbW1hbmQtPnUucW9zQ21kLnRzcGVjX21hc2sgPSB0c3BlY19tYXNrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBpbnZhbGlkIGNvbW1hbmQgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgY21kVHlwZSApOworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUoIDAgKTsKKyAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSAmJiBwQ29tbWFuZCApCisgICAgeworICAgICAgICBzbWVQdXNoQ29tbWFuZCggcE1hYywgcENvbW1hbmQsIGVBTklfQk9PTEVBTl9GQUxTRSApOworICAgIH0KKyAgICBlbHNlIGlmKCBwQ29tbWFuZCApCisgICAgeworICAgICAgICBxb3NSZWxlYXNlQ29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICB9CisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KK3RBTklfQk9PTEVBTiBxb3NQcm9jZXNzQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0QU5JX0JPT0xFQU4gZlJlbW92ZUNtZCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIGRvCisgICAgeworICAgICAgICBzd2l0Y2ggKCBwQ29tbWFuZC0+Y29tbWFuZCApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlU21lQ29tbWFuZEFkZFRzOgorICAgICAgICAgICAgc3RhdHVzID0gc21lX1Fvc0FkZFRzUmVxKCBwTWFjLCAodl9VOF90KXBDb21tYW5kLT5zZXNzaW9uSWQsICZwQ29tbWFuZC0+dS5xb3NDbWQudHNwZWNJbmZvLCBwQ29tbWFuZC0+dS5xb3NDbWQuYWMpOworICAgICAgICAgICAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZSZW1vdmVDbWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZVNtZUNvbW1hbmREZWxUczoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9Rb3NEZWxUc1JlcSggcE1hYywgKHZfVThfdClwQ29tbWFuZC0+c2Vzc2lvbklkLCBwQ29tbWFuZC0+dS5xb3NDbWQuYWMsIHBDb21tYW5kLT51LnFvc0NtZC50c3BlY19tYXNrICk7CisgICAgICAgICAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZlJlbW92ZUNtZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogaW52YWxpZCBjb21tYW5kIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHBDb21tYW5kLT5jb21tYW5kICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfS8vc3dpdGNoCisgICAgfSB3aGlsZSgwKTsKKyAgICByZXR1cm4oIGZSZW1vdmVDbWQgKTsKK30KKworLyoKKyAgc21lX1Fvc1RyaWdnZXJVYXBzZENoYW5nZQorICBJbnZva2VkIGJ5IEJUQyB3aGVuIFVBUFNEIGJ5cGFzcyBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisgIFdlLCBpbiB0dXJuLCBtdXN0IGRpc2FibGUgb3IgZW5hYmxlIFVBUFNEIG9uIGFsbCBmbG93cyBhcyBhcHByb3ByaWF0ZQorICBUaGF0IG1heSByZXF1aXJlIHVzIHRvIHJlLWFkZCBUU1BFQ3Mgb3IgdG8gcmVhc3NvY2lhdGUKKyovCitzbWVfUW9zU3RhdHVzVHlwZSBzbWVfUW9zVHJpZ2dlclVhcHNkQ2hhbmdlKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zQUNJbmZvICpwQUNJbmZvOworICAgdl9VOF90IGFjLCB0c3BlYzEgPSAwLCB0c3BlYzIgPSAwOyAKKyAgIHZfVThfdCB1YXBzZF9tYXNrOworICAgdERvdDExZkJlYWNvbklFcyAqcEllc0xvY2FsOworICAgdl9VOF90IGFjbV9tYXNrOworICAgdl9CT09MX3QgZklzVWFwc2ROZWVkZWQ7CisgICB2X1U4X3Qgc2Vzc2lvbklkOworICAgdl9CT09MX3QgYWRkdHNXaGVuQUNNTm90U2V0ID0gQ1NSX0lTX0FERFRTX1dIRU5fQUNNT0ZGX1NVUFBPUlRFRChwTWFjKTsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiJXM6ICVkOiBJbnZva2VkIiwKKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgIGZvciAoc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7ICsrc2Vzc2lvbklkKQorICAgeworICAgICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICAgICBpZiggIXBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlICkKKyAgICAgIHsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICIlczogJWQ6IFNlc3Npb24gJWQgaXMgYWN0aXZlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsIHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MsICZwSWVzTG9jYWwpKSApCisgICAgICB7CisgICAgICAgICAvLyBnZXQgdGhlIEFDTSBtYXNrCisgICAgICAgICBhY21fbWFzayA9IHNtZV9Rb3NHZXRBQ01NYXNrKHBNYWMsIHBTZXNzaW9uLT5hc3NvY0luZm8ucEJzc0Rlc2MsIHBJZXNMb2NhbCk7CisgICAgICAgICB2b3NfbWVtX2ZyZWUocEllc0xvY2FsKTsKKyAgICAgICAgIC8vIGdldCB0aGUgdWFwc2QgbWFzayBmb3IgdGhpcyBzZXNzaW9uCisgICAgICAgICB1YXBzZF9tYXNrID0gcFNlc3Npb24tPmFwc2RNYXNrOworICAgICAgICAgLy8gdW5tYXNrIHRoZSBiaXRzIHdpdGggQUNNIG9uIHRvIGF2b2lkIHJlYXNzb2Mgb24gdGhlbSAKKyAgICAgICAgIHVhcHNkX21hc2sgJj0gfmFjbV9tYXNrOworICAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBBQ3MgdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gcmUtYWRkIGFueSBUU1BFQ3MKKyAgICAgICAgIGZvcihhYyA9IFNNRV9RT1NfRURDQV9BQ19CRTsgYWMgPCBTTUVfUU9TX0VEQ0FfQUNfTUFYOyBhYysrKQorICAgICAgICAgeworICAgICAgICAgICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICAgICAgICAgICAvLyBEb2VzIHRoaXMgQUMgaGF2ZSBRb1MgYWN0aXZlPworICAgICAgICAgICAgaWYoIFNNRV9RT1NfUU9TX09OID09IHBBQ0luZm8tPmN1cnJfc3RhdGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy8gWWVzLCBRb1MgaXMgYWN0aXZlIG9uIHRoaXMgQUMKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBzZXNzaW9uICVkIEFDICVkIGhhcyBRb1MgYWN0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMpOworICAgICAgICAgICAgICAgLy8gRG9lcyB0aGlzIEFDIHJlcXVpcmUgQUNNPworICAgICAgICAgICAgICAgaWYoKCBhY21fbWFzayAmICgxIDw8IChTTUVfUU9TX0VEQ0FfQUNfVk8gLSBhYykpICkgfHwgYWRkdHNXaGVuQUNNTm90U2V0ICkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vIFllcywgc28gd2UgbmVlZCB0byByZS1hZGQgYW55IFRTUEVDUworICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IE9uIHNlc3Npb24gJWQgQUMgJWQgaGFzIEFDTSBlbmFibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMpOworICAgICAgICAgICAgICAgICAgLy8gQXJlIGFueSBUU1BFQ3MgYWN0aXZlPworICAgICAgICAgICAgICAgICAgaWYoIHBBQ0luZm8tPnRzcGVjX21hc2tfc3RhdHVzICkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIC8vIFllcywgYXQgbGVhc3QgMSBUU1BFQyBpcyBhY3RpdmUuICBBcmUgdGhleSBib3RoIGFjdGl2ZT8KKyAgICAgICAgICAgICAgICAgICAgIGlmKCBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgPT0gcEFDSW5mby0+dHNwZWNfbWFza19zdGF0dXMgKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9ib3RoIFRTUEVDUyBhcmUgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICB0c3BlYzEgPSBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfU0VUOworICAgICAgICAgICAgICAgICAgICAgICAgdHNwZWMyID0gU01FX1FPU19UU1BFQ19NQVNLX0JJVF8yX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgb25lIFRTUEVDIGlzIGFjdGl2ZSwgZ2V0IGl0cyBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICB0c3BlYzEgPSBTTUVfUU9TX1RTUEVDX01BU0tfQklUXzFfMl9TRVQgJiBwQUNJbmZvLT50c3BlY19tYXNrX3N0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIC8vIERvZXMgVFNQRUMgMSByZWFsbHkgcmVxdWlyZSBVQVBTRD8KKyAgICAgICAgICAgICAgICAgICAgIGZJc1VhcHNkTmVlZGVkID0gKHZfQk9PTF90KShwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWMxIC0gMV0ubWF4X3NlcnZpY2VfaW50ZXJ2YWwgfHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9Rb1NJbmZvW3RzcGVjMSAtIDFdLm1pbl9zZXJ2aWNlX2ludGVydmFsKTsKKyAgICAgICAgICAgICAgICAgICAgIC8vZG91YmxlIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBkbyBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICAgaWYoIGZJc1VhcHNkTmVlZGVkICkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RzcGVjMSAtIDFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWMxIC0gMV07CisgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zUmVSZXF1ZXN0QWRkVFMoIHBNYWMsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBQ0luZm8tPnJlcXVlc3RlZF9Rb1NJbmZvW3RzcGVjMSAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNwZWMxICk7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAvLyBJcyBUU1BFQyAyIGFjdGl2ZT8KKyAgICAgICAgICAgICAgICAgICAgIGlmKCB0c3BlYzIgKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lcyBUU1BFQyAyIHJlYWxseSByZXF1aXJlIFVBUFNEPworICAgICAgICAgICAgICAgICAgICAgICAgZklzVWFwc2ROZWVkZWQgPSAodl9CT09MX3QpKHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlYzIgLSAxXS5tYXhfc2VydmljZV9pbnRlcnZhbCB8fCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUNJbmZvLT5jdXJyX1FvU0luZm9bdHNwZWMyIC0gMV0ubWluX3NlcnZpY2VfaW50ZXJ2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZJc1VhcHNkTmVlZGVkICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gbmVlZCB0byBpbmZvcm0gSERECisgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BBQ0luZm8tPmhvUmVuZXdhbCA9IFZPU19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bdHNwZWMyIC0gMV0gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQ0luZm8tPmN1cnJfUW9TSW5mb1t0c3BlYzIgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NSZVJlcXVlc3RBZGRUUyggcE1hYywgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFDSW5mby0+cmVxdWVzdGVkX1FvU0luZm9bdHNwZWMyIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3BlYzIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgLy8gUW9TIGlzIHNldCwgQUNNIGlzIG9uLCBidXQgbm8gVFNQRUNzIC0tIGluY29uc2lzdGVudCBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBBQyAlZCBoYXMgUW9TIGVuYWJsZWQgYW5kIEFDTSBpcyBzZXQsIGJ1dCBubyBUU1BFQyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGFjKTsKKyAgICAgICAgICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvL1NpbmNlIEFDTSBiaXQgaXMgbm90IHNldCwgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIFFvUyBpbmZvcm1hdGlvbiBmb3IgYm90aCBkaXJlY3Rpb25zLgorICAgICAgICAgICAgICAgICAgZklzVWFwc2ROZWVkZWQgPSAodl9CT09MX3QpKHBBQ0luZm8tPmN1cnJfUW9TSW5mb1swXS5tYXhfc2VydmljZV9pbnRlcnZhbCB8fCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUNJbmZvLT5jdXJyX1FvU0luZm9bMF0ubWluX3NlcnZpY2VfaW50ZXJ2YWwpOworICAgICAgICAgICAgICAgICAgaWYoZklzVWFwc2ROZWVkZWQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIFVBUFNEIG9uIHRoaXMgQUMgKGFuZCB3ZSBtYXkgbm90IGN1cnJlbnRseSBoYXZlIGl0KQorICAgICAgICAgICAgICAgICAgICAgdWFwc2RfbWFzayB8PSAxIDw8IChTTUVfUU9TX0VEQ0FfQUNfVk8gLSBhYyk7CisgICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBBQyAlZCBoYXMgQUNNIGRpc2FibGVkLCB1YXBzZCBtYXNrIG5vdyAweCVYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMsIHVhcHNkX21hc2spOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgLy8gZG8gd2UgbmVlZCB0byByZWFzc29jaWF0ZT8KKyAgICAgICAgIGlmKHVhcHNkX21hc2spCisgICAgICAgICB7CisgICAgICAgICAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgbW9kaWZ5UHJvZmlsZUZpZWxkczsKKyAgICAgICAgICAgIC8vd2UgbmVlZCB0byBkbyBhIHJlYXNzb2Mgb24gdGhlc2UgQUMgCisgICAgICAgICAgICBjc3JHZXRNb2RpZnlQcm9maWxlRmllbGRzKHBNYWMsIHNlc3Npb25JZCwgJm1vZGlmeVByb2ZpbGVGaWVsZHMpOworICAgICAgICAgICAgaWYoIGJ0Y0lzUmVhZHlGb3JVYXBzZChwTWFjKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBtb2RpZnlQcm9maWxlRmllbGRzLnVhcHNkX21hc2sgPSB1YXBzZF9tYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgCisgICAgICAgICAgICAgICBtb2RpZnlQcm9maWxlRmllbGRzLnVhcHNkX21hc2sgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9EbyB3ZSBuZWVkIHRvIGluZm9ybSBIREQ/CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHNtZV9Rb3NSZXF1ZXN0UmVhc3NvYyhwTWFjLCBzZXNzaW9uSWQsICZtb2RpZnlQcm9maWxlRmllbGRzLCBWT1NfVFJVRSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9lcnIgbXNnCisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBTZXNzaW9uICVkIFJlYXNzb2MgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBPbiBTZXNzaW9uICVkIGZhaWxlZCB0byBwYXJzZSBJRXMiLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgIH0KKyAgIH0KKyAgIC8vIHJldHVybiBzdGF0dXMgaXMgaWdub3JlZCBieSBCVEMKKyAgIHJldHVybiBTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0lORDsKK30KKworLyoKKyAgICBzbWVfUW9zUmVSZXF1ZXN0QWRkVFMgdG8gcmUtc2VuZCBBZGRUUyBmb3IgdGhlIGNvbWJpbmVkIFFvUyByZXF1ZXN0CisqLworc3RhdGljIHNtZV9Rb3NTdGF0dXNUeXBlIHNtZV9Rb3NSZVJlcXVlc3RBZGRUUyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUW9zV21tVHNwZWNJbmZvICogcFFvU0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgdHNwZWNNYXNrKQoreworICAgc21lX1Fvc1Nlc3Npb25JbmZvICpwU2Vzc2lvbjsKKyAgIHNtZV9Rb3NBQ0luZm8gKnBBQ0luZm87CisgICBzbWVfUW9zU3RhdHVzVHlwZSBzdGF0dXMgPSBTTUVfUU9TX1NUQVRVU19NT0RJRllfU0VUVVBfRkFJTFVSRV9SU1A7CisgICBzbWVfUW9zQ21kSW5mbyAgY21kOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICIlczogJWQ6IEludm9rZWQgb24gc2Vzc2lvbiAlZCBmb3IgQUMgJWQgVFNQRUMgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgc2Vzc2lvbklkLCBhYywgdHNwZWNNYXNrKTsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICAvLyBuZWVkIHRvIHZvdGUgb2ZmIHBvd2Vyc2F2ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgcmVxdWVzdAorICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX0ZBTFNFOworICAgLy9jYWxsIFBNQydzIHJlcXVlc3QgZm9yIHBvd2VyIGZ1bmN0aW9uCisgICAvLyBBTkQKKyAgIC8vYW5vdGhlciBjaGVjayBpcyBhZGRlZCBjb25zaWRlcmluZyB0aGUgZmxvd2luZyBzY2VuYXJpbworICAgLy9BZGR0cyByZXFlc3QgaXMgcGVuZGluZyBvbiBvbmUgQUMsIHdoaWxlIEFQU0QgcmVxdWVzdGVkIG9uIGFub3RoZXIgd2hpY2ggCisgICAvL25lZWRzIGEgcmVhc3NvYy4gV2lsbCBidWZmZXIgYSByZXF1ZXN0IGlmIEFkZHRzIGlzIHBlbmRpbmcgb24gYW55IEFDLCAKKyAgIC8vd2hpY2ggd2lsbCBzYWZlZ2F1cmQgdGhlIGFib3ZlIHNjZW5hcmlvLCAmIGFsc28gd29uJ3QgY29uZnVzZSBQRSB3aXRoIGJhY2sgCisgICAvL3RvIGJhY2sgQWRkdHMgb3IgQWRkdHMgZm9sbG93ZWQgYnkgUmVhc3NvYworICAgaWYoc21lX1Fvc0lzUnNwUGVuZGluZyhzZXNzaW9uSWQsIGFjKSB8fCAKKyAgICAgICggZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgPT0gcG1jUmVxdWVzdEZ1bGxQb3dlcihwTWFjLCBzbWVfUW9zUG1jRnVsbFBvd2VyQ2FsbGJhY2ssIHBTZXNzaW9uLCBlU01FX1JFQVNPTl9PVEhFUikpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCBidWZmZXJpbmcgdGhlIEFkZFRTIHJlcXVlc3QgIgorICAgICAgICAgICAgICAgICAgICJmb3IgQUMgJWQgaW4gc3RhdGUgJWQgYXMgQWRkdHMgaXMgcGVuZGluZyAiCisgICAgICAgICAgICAgICAgIm9uIG90aGVyIEFDIG9yIHdhaXRpbmcgZm9yIGZ1bGwgcG93ZXIiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBhYywgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisgICAgICAvL2J1ZmZlciBjbWQKKyAgICAgIGNtZC5jb21tYW5kID0gU01FX1FPU19SRVNFTkRfUkVROworICAgICAgY21kLnBNYWMgPSBwTWFjOworICAgICAgY21kLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgIGNtZC51LnJlc2VuZENtZEluZm8uYWMgPSBhYzsKKyAgICAgIGNtZC51LnJlc2VuZENtZEluZm8udHNwZWNNYXNrID0gdHNwZWNNYXNrOworICAgICAgY21kLnUucmVzZW5kQ21kSW5mby5Rb1NJbmZvID0gKnBRb1NJbmZvOworICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzbWVfUW9zQnVmZmVyQ21kKCZjbWQsIFZPU19GQUxTRSkpKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogT24gc2Vzc2lvbiAlZCB1bmFibGUgdG8gYnVmZmVyIHRoZSBBZGRUUyAiCisgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgZm9yIEFDICVkIFRTUEVDICVkIGluIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgYWMsIHRzcGVjTWFzaywgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisgICAgICAgICAvLyB1bmFibGUgdG8gYnVmZmVyIHRoZSByZXF1ZXN0CisgICAgICAgICAvLyBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICAgICByZXR1cm4gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQOworICAgICAgfQorICAgICAgcmV0dXJuIFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9QRU5ESU5HX1JTUDsKKyAgIH0KKyAgIC8vZ2V0IGludG8gdGhlIHN0YXQgbS9jIHRvIHNlZSBpZiB0aGUgcmVxdWVzdCBjYW4gYmUgZ3JhbnRlZAorICAgc3dpdGNoKHBBQ0luZm8tPmN1cnJfc3RhdGUpCisgICB7CisgICBjYXNlIFNNRV9RT1NfUU9TX09OOgorICAgICAgeworICAgICAgICAgLy9pZiBBQ00sIHNlbmQgb3V0IGEgbmV3IEFERFRTCisgICAgICAgICBwQUNJbmZvLT5ob1JlbmV3YWwgPSBWT1NfVFJVRTsKKyAgICAgICAgIHN0YXR1cyA9IHNtZV9Rb3NTZXR1cChwTWFjLCBzZXNzaW9uSWQsIHBRb1NJbmZvLCBhYyk7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIiVzOiAlZDogc21lX1Fvc1NldHVwIHJldHVybmVkIGluIFNNRV9RT1NfUU9TX09OIHN0YXRlIG9uICIKKyAgICAgICAgICAgICAgICAgICAiQUMgJWQgd2l0aCBzdGF0dXMgPSVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIGFjLCBzdGF0dXMpOworICAgICAgICAgaWYoU01FX1FPU19TVEFUVVNfU0VUVVBfUkVRX1BFTkRJTkdfUlNQICE9IHN0YXR1cykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdlIGFyZW4ndCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIGZyb20gdGhlIEFQCisgICAgICAgICAgICAvLyBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uCisgICAgICAgICAgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfVFJVRTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1JFUV9QRU5ESU5HX1JTUCA9PSBzdGF0dXMpIAorICAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1BFTkRJTkdfUlNQOworICAgICAgICAgICAgcEFDSW5mby0+dHNwZWNfcGVuZGluZyA9IHRzcGVjTWFzazsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYoKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfTk9fQUNNX05PX0FQU0RfUlNQID09IHN0YXR1cykgfHwKKyAgICAgICAgICAgICAgICAgKFNNRV9RT1NfU1RBVFVTX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PSBzdGF0dXMpIHx8CisgICAgICAgICAgICAgICAgIChTTUVfUU9TX1NUQVRVU19TRVRVUF9TVUNDRVNTX0lORF9BUFNEX1BFTkRJTkcgPT0gc3RhdHVzKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBVQVBTRCBpcyBzZXR1cCBhbHJlYWR5IHN0YXR1cyA9ICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgYnkgc21lX1Fvc1NldHVwIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7ICAKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vZXJyIG1zZworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICIlczogJWQ6IHVuZXhwZWN0ZWQgc3RhdHVzID0gJWQgcmV0dXJuZWQgYnkgc21lX1Fvc1NldHVwIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgU01FX1FPU19IQU5ET0ZGOgorICAgY2FzZSBTTUVfUU9TX1JFUVVFU1RFRDoKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6ICVkOiBSZS1BZGQgcmVxdWVzdCBpbiBzdGF0ZSA9ICVkICBidWZmZXIgdGhlIHJlcXVlc3QiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9zdGF0ZSk7CisgICAgICBjbWQuY29tbWFuZCA9IFNNRV9RT1NfUkVTRU5EX1JFUTsKKyAgICAgIGNtZC5wTWFjID0gcE1hYzsKKyAgICAgIGNtZC5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICBjbWQudS5yZXNlbmRDbWRJbmZvLmFjID0gYWM7CisgICAgICBjbWQudS5yZXNlbmRDbWRJbmZvLnRzcGVjTWFzayA9IHRzcGVjTWFzazsKKyAgICAgIGNtZC51LnJlc2VuZENtZEluZm8uUW9TSW5mbyA9ICpwUW9TSW5mbzsKKyAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc21lX1Fvc0J1ZmZlckNtZCgmY21kLCBWT1NfRkFMU0UpKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBjb3VsZG4ndCBidWZmZXIgdGhlIHJlYWRkIHJlcXVlc3QgaW4gc3RhdGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBwQUNJbmZvLT5jdXJyX3N0YXRlICk7CisgICAgICAgICAvLyB1bmFibGUgdG8gYnVmZmVyIHRoZSByZXF1ZXN0CisgICAgICAgICAvLyBub3RoaW5nIGlzIHBlbmRpbmcgc28gdm90ZSBwb3dlcnNhdmUgYmFjayBvbgorICAgICAgICAgcFNlc3Npb24tPnJlYWR5Rm9yUG93ZXJTYXZlID0gVk9TX1RSVUU7CisgICAgICAgICByZXR1cm4gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX0ZBSUxVUkVfUlNQOworICAgICAgfQorICAgICAgc3RhdHVzID0gU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1BFTkRJTkdfUlNQOworICAgICAgYnJlYWs7CisgICBjYXNlIFNNRV9RT1NfQ0xPU0VEOgorICAgY2FzZSBTTUVfUU9TX0lOSVQ6CisgICBjYXNlIFNNRV9RT1NfTElOS19VUDoKKyAgIGRlZmF1bHQ6CisgICAgICAvL3ByaW50IGVycm9yIG1zZywgCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiAlZDogUmVBZGQgcmVxdWVzdCBpbiB1bmV4cGVjdGVkIHN0YXRlID0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgLy8gdW5hYmxlIHRvIHNlcnZpY2UgdGhlIHJlcXVlc3QKKyAgICAgIC8vIG5vdGhpbmcgaXMgcGVuZGluZyBzbyB2b3RlIHBvd2Vyc2F2ZSBiYWNrIG9uCisgICAgICBwU2Vzc2lvbi0+cmVhZHlGb3JQb3dlclNhdmUgPSBWT1NfVFJVRTsKKyAgICAgIC8vIEFTU0VSVD8KKyAgICAgIGJyZWFrOworICAgfQorICAgaWYoKFNNRV9RT1NfU1RBVFVTX01PRElGWV9TRVRVUF9TVUNDRVNTX05PX0FDTV9OT19BUFNEX1JTUCA9PSBzdGF0dXMpIHx8CisgICAgICAoU01FX1FPU19TVEFUVVNfTU9ESUZZX1NFVFVQX1NVQ0NFU1NfQVBTRF9TRVRfQUxSRUFEWSA9PSBzdGF0dXMpKSAKKyAgIHsKKyAgICAgICh2b2lkKXNtZV9Rb3NQcm9jZXNzQnVmZmVyZWRDbWQoc2Vzc2lvbklkKTsKKyAgIH0KKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgc21lX1Fvc0luaXRBQ3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VOF90IHNlc3Npb25JZCkKK3sKKyAgIHNtZV9Rb3NTZXNzaW9uSW5mbyAqcFNlc3Npb247CisgICBzbWVfUW9zRWRjYUFjVHlwZSBhYzsKKyAgIHBTZXNzaW9uID0gJnNtZV9Rb3NDYi5zZXNzaW9uSW5mb1tzZXNzaW9uSWRdOworICAgZm9yKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspIAorICAgeworICAgICAgdm9zX21lbV96ZXJvKCZwU2Vzc2lvbi0+YWNfaW5mb1thY10sIHNpemVvZihzbWVfUW9zQUNJbmZvKSk7CisgICAgICBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfSU5JVCk7CisgICB9Cit9CitzdGF0aWMgZUhhbFN0YXR1cyBzbWVfUW9zUmVxdWVzdFJlYXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzICpwTW9kRmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IGZGb3JjZSApCit7CisgICBzbWVfUW9zU2Vzc2lvbkluZm8gKnBTZXNzaW9uOworICAgc21lX1Fvc0FDSW5mbyAqcEFDSW5mbzsKKyAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICIlczogJWQ6IEludm9rZWQgb24gc2Vzc2lvbiAlZCB3aXRoIFVBUFNEIG1hc2sgMHglWCIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICBzZXNzaW9uSWQsIHBNb2RGaWVsZHMtPnVhcHNkX21hc2spOworICAgcFNlc3Npb24gPSAmc21lX1Fvc0NiLnNlc3Npb25JbmZvW3Nlc3Npb25JZF07CisgICBzdGF0dXMgPSBjc3JSZWFzc29jKHBNYWMsIHNlc3Npb25JZCwgcE1vZEZpZWxkcywgJnBTZXNzaW9uLT5yb2FtSUQsIGZGb3JjZSk7CisgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgIC8vVXBkYXRlIHRoZSBzdGF0ZSB0byBIYW5kb2ZmIHNvIHN1YnNlcXVlbnQgcmVxdWVzdHMgYXJlIHF1ZXVlZCB1bnRpbAorICAgICAgLy8gdGhpcyBvbmUgaXMgZmluaXNoZWQKKyAgICAgIHNtZV9Rb3NFZGNhQWNUeXBlIGFjOworICAgICAgZm9yKGFjID0gU01FX1FPU19FRENBX0FDX0JFOyBhYyA8IFNNRV9RT1NfRURDQV9BQ19NQVg7IGFjKyspIAorICAgICAgeworICAgICAgICAgcEFDSW5mbyA9ICZwU2Vzc2lvbi0+YWNfaW5mb1thY107CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICAiJXM6ICVkOiBBQ1slZF0gaXMgaW4gc3RhdGUgWyVkXSIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICBhYywgcEFDSW5mby0+Y3Vycl9zdGF0ZSApOworICAgICAgICAgLy8gSWYgaXQgaXMgYWxyZWFkeSBpbiBIQU5ET0ZGIHN0YXRlLCBkb24ndCBkbyBhbnl0aGluZyBzaW5jZSB3ZQorICAgICAgICAgLy8gTVVTVCBwcmVzZXJ2ZSB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIHNtZV9Rb3NTdGF0ZVRyYW5zaXRpb24KKyAgICAgICAgIC8vIHdpbGwgY2hhbmdlIHRoZSBwcmV2aW91cyBzdGF0ZQorICAgICAgICAgaWYoU01FX1FPU19IQU5ET0ZGICE9IHBBQ0luZm8tPmN1cnJfc3RhdGUpCisgICAgICAgICB7CisgICAgICAgICAgICBzbWVfUW9zU3RhdGVUcmFuc2l0aW9uKHNlc3Npb25JZCwgYWMsIFNNRV9RT1NfSEFORE9GRik7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICByZXR1cm4gc3RhdHVzOworfQorc3RhdGljIHZfVTMyX3Qgc21lX1Fvc0Fzc2lnbkZsb3dJZCh2b2lkKQoreworICAgdl9VMzJfdCBmbG93SWQ7CisgICBmbG93SWQgPSBzbWVfUW9zQ2IubmV4dEZsb3dJZDsKKyAgIGlmIChTTUVfUU9TX01BWF9GTE9XX0lEID09IGZsb3dJZCkKKyAgIHsKKyAgICAgIC8vIFRoZSBGbG93IElEIHdyYXBwZWQuICBUaGlzIGlzIG9idmlvdXNseSBub3QgYSByZWFsIGxpZmUgc2NlbmFyaW8KKyAgICAgIC8vIGJ1dCBoYW5kbGUgaXQgdG8ga2VlcCB0aGUgc29mdHdhcmUgdGVzdCBmb2xrcyBoYXBweQorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIAorICAgICAgICAgICAgICAgICIlczogJWQ6IFNvZnR3YXJlIFRlc3QgbWFkZSB0aGUgZmxvdyBjb3VudGVyIHdyYXAsICIKKyAgICAgICAgICAgICAgICAiUW9TIG1heSBubyBsb25nZXIgYmUgZnVuY3Rpb25hbCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICBzbWVfUW9zQ2IubmV4dEZsb3dJZCA9IFNNRV9RT1NfTUlOX0ZMT1dfSUQ7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzbWVfUW9zQ2IubmV4dEZsb3dJZCsrOworICAgfQorICAgcmV0dXJuIGZsb3dJZDsKK30KKworc3RhdGljIHZfVThfdCBzbWVfUW9zQXNzaWduRGlhbG9nVG9rZW4odm9pZCkKK3sKKyAgIHZfVThfdCB0b2tlbjsKKyAgIHRva2VuID0gc21lX1Fvc0NiLm5leHREaWFsb2dUb2tlbjsKKyAgIGlmIChTTUVfUU9TX01BWF9ESUFMT0dfVE9LRU4gPT0gdG9rZW4pCisgICB7CisgICAgICAvLyB3cmFwIGlzIG9rCisgICAgICBzbWVfUW9zQ2IubmV4dERpYWxvZ1Rva2VuID0gU01FX1FPU19NSU5fRElBTE9HX1RPS0VOOworICAgfQorICAgZWxzZQorICAgeworICAgICAgc21lX1Fvc0NiLm5leHREaWFsb2dUb2tlbisrOworICAgfQorICAgcmV0dXJuIHRva2VuOworfQorI2VuZGlmIC8qIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvc3JjL2J0Yy9idGNBcGkuYyBiL0NPUkUvU01FL3NyYy9idGMvYnRjQXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkMWZiZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL3NyYy9idGMvYnRjQXBpLmMKQEAgLTAsMCArMSwxOTQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgYnRjQXBpLmMKKyoKKyogRGVzY3JpcHRpb246IFJvdXRpbmVzIHRoYXQgbWFrZSB1cCB0aGUgQlRDIEFQSS4KKyoKKyogQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgInNtc0RlYnVnLmgiCisjaW5jbHVkZSAiYnRjQXBpLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisjaW5jbHVkZSAicG1jLmgiCisjaW5jbHVkZSAic21lUW9zSW50ZXJuYWwuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisjaW5jbHVkZSAidm9zX2RpYWdfY29yZV9ldmVudC5oIgorI2luY2x1ZGUgInZvc19kaWFnX2NvcmVfbG9nLmgiCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworc3RhdGljIHZvaWQgYnRjTG9nRXZlbnQgKHRIYWxIYW5kbGUgaEhhbCwgdHBTbWVCdEV2ZW50IHBCdEV2ZW50KTsKK3N0YXRpYyB2b2lkIGJ0Y1Jlc3RvcmVIZWFydEJlYXRNb25pdG9yaW5nSGFuZGxlKHZvaWQqIGhIYWwpOworc3RhdGljIHZvaWQgYnRjVWFwc2RDaGVjayggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTbWVCdEV2ZW50IHBCdEV2ZW50ICk7CitWT1NfU1RBVFVTIGJ0Y0NoZWNrSGVhcnRCZWF0TW9uaXRvcmluZyh0SGFsSGFuZGxlIGhIYWwsIHRwU21lQnRFdmVudCBwQnRFdmVudCk7CitzdGF0aWMgdm9pZCBidGNQb3dlclN0YXRlQ0IoIHZfUFZPSURfdCBwQ29udGV4dCwgdFBtY1N0YXRlIHBtY1N0YXRlICk7CitzdGF0aWMgVk9TX1NUQVRVUyBidGNEZWZlckV2ZW50KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNtZUJ0RXZlbnQgcEV2ZW50ICk7CitzdGF0aWMgVk9TX1NUQVRVUyBidGNEZWZlckRpc2Nvbm5FdmVudCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTbWVCdEV2ZW50IHBFdmVudCApOworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGJ0Y0RpYWdFdmVudExvZyAodEhhbEhhbmRsZSBoSGFsLCB0cFNtZUJ0RXZlbnQgcEJ0RXZlbnQpOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBidGNPcGVuCisgICAgXGJyaWVmICBBUEkgdG8gaW5pdCB0aGUgQlRDIEV2ZW50cyBMYXllcgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFICBzdWNjZXNzCisgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgIGZhaWx1cmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgYnRjT3BlbiAodEhhbEhhbmRsZSBoSGFsKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICAvKiBJbml0aWFsaXplIEJUQyBjb25maWd1YXJ0aW9uLiAqLworICAgcE1hYy0+YnRjLmJ0Y0NvbmZpZy5idGNFeGVjdXRpb25Nb2RlID0gQlRDX1NNQVJUX0NPRVhJU1RFTkNFOworICAgcE1hYy0+YnRjLmJ0Y0NvbmZpZy5idGNDb25zQnRTbG90c1RvQmxvY2tEdXJpbmdEaGNwID0gMDsKKyAgIHBNYWMtPmJ0Yy5idGNDb25maWcuYnRjQTJEUEJ0U3ViSW50ZXJ2YWxzRHVyaW5nRGhjcCA9IEJUQ19NQVhfTlVNX0FDTF9CVF9TVUJfSU5UUzsKKyAgIHBNYWMtPmJ0Yy5idGNDb25maWcuYnRjQnRJbnRlcnZhbE1vZGUxID0gQlRDX0JUX0lOVEVSVkFMX01PREUxX0RFRkFVTFQ7CisgICBwTWFjLT5idGMuYnRjQ29uZmlnLmJ0Y1dsYW5JbnRlcnZhbE1vZGUxID0gQlRDX1dMQU5fSU5URVJWQUxfTU9ERTFfREVGQVVMVDsKKyAgIHBNYWMtPmJ0Yy5idGNDb25maWcuYnRjQWN0aW9uT25QbUZhaWwgPSBCVENfU1RBUlRfTkVYVDsKKyAgIHBNYWMtPmJ0Yy5idGNSZWFkeSA9IFZPU19GQUxTRTsKKyAgIHBNYWMtPmJ0Yy5idGNFdmVudFN0YXRlID0gMDsKKyAgIHBNYWMtPmJ0Yy5idGNIQkFjdGl2ZSA9IFZPU19UUlVFOworCisgICB2b3NTdGF0dXMgPSB2b3NfdGltZXJfaW5pdCggJnBNYWMtPmJ0Yy5yZXN0b3JlSEJUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICBWT1NfVElNRVJfVFlQRV9TVywKKyAgICAgICAgICAgICAgICAgICAgICBidGNSZXN0b3JlSGVhcnRCZWF0TW9uaXRvcmluZ0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIGhIYWwpOworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYnRjT3BlbjogRmFpbCB0byBpbml0IHRpbWVyIik7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MocG1jUmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCggcE1hYywgYnRjUG93ZXJTdGF0ZUNCLCBwTWFjICkpICkKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJ0Y09wZW46IEZhaWwgdG8gcmVnaXN0ZXIgUE1DIGNhbGxiYWNrXG4iKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGJ0Y0Nsb3NlCisgICAgXGJyaWVmICBBUEkgdG8gZXhpdCB0aGUgQlRDIEV2ZW50cyBMYXllcgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFICBzdWNjZXNzCisgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgIGZhaWx1cmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgYnRjQ2xvc2UgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgcE1hYy0+YnRjLmJ0Y1JlYWR5ID0gVk9TX0ZBTFNFOworICAgcE1hYy0+YnRjLmJ0Y1VhcHNkT2sgPSBWT1NfRkFMU0U7CisgICB2b3NfdGltZXJfc3RvcCgmcE1hYy0+YnRjLnJlc3RvcmVIQlRpbWVyKTsKKyAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9kZXN0cm95KCZwTWFjLT5idGMucmVzdG9yZUhCVGltZXIpOworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYnRjQ2xvc2U6IEZhaWwgdG8gZGVzdHJveSB0aW1lciIpOworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoCisgICAgICBwbWNEZXJlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQocE1hYywgYnRjUG93ZXJTdGF0ZUNCKSkpCisgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAiJXM6ICVkOiBjYW5ub3QgZGVyZWdpc3RlciB3aXRoIHBtY0RlcmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCgpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgIH0KKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGJ0Y1JlYWR5CisgICAgXGJyaWVmICBmbiB0byBpbmZvcm0gQlRDIHRoYXQgZVdOSV9TTUVfU1lTX1JFQURZX0lORCBoYXMgYmVlbiBzZW50IHRvIFBFLgorICAgICAgICAgICAgVGhpcyBhY3RzIGFzIGEgdHJpZ2dlciB0byBzZW5kIGEgbWVzc2FnZSB0byBIQUwgdG8gdXBkYXRlIHRoZSBCVEMKKyAgICAgICAgICAgIHJlbGF0ZWQgY29uaWcgdG8gRlcuIE5vdGUgdGhhdCBpZiBIREQgY29uZmlndXJlcyBhbnkgcG93ZXIgQlRDCisgICAgICAgICAgICByZWxhdGVkIHN0dWZmIGJlZm9yZSB0aGlzIEFQSSBpcyBpbnZva2VkLCBCVEMgd2lsbCBidWZmZXIgYWxsIHRoZQorICAgICAgICAgICAgY29uZmlndXRhaW9uLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgYnRjUmVhZHkgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdl9VMzJfdCBjZmdWYWwgPSAwOworICAgIHZfVThfdCBpOworICAgIHBNYWMtPmJ0Yy5idGNSZWFkeSA9IFZPU19UUlVFOworICAgIHBNYWMtPmJ0Yy5idGNVYXBzZE9rID0gVk9TX1RSVUU7CisgICAgZm9yKGk9MDsgaSA8IEJUX01BWF9TQ09fU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgcE1hYy0+YnRjLmJ0Y1Njb0hhbmRsZXNbaV0gPSBCVF9JTlZBTElEX0NPTk5fSEFORExFOworICAgIH0KKworICAgIC8vIFJlYWQgaGVhcnRiZWF0IHRocmVzaG9sZCBDRkcgYW5kIHNhdmUgaXQuCisgICAgY2NtQ2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQsICZjZmdWYWwpOworICAgIHBNYWMtPmJ0Yy5idGNIQkNvdW50ID0gKHZfVThfdCljZmdWYWw7CisgICAgaWYgKGJ0Y1NlbmRDZmdNc2coaEhhbCwgJihwTWFjLT5idGMuYnRjQ29uZmlnKSkgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgVk9TX1NUQVRVUyBidGNTZW5kQlRFdmVudCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNtZUJ0RXZlbnQgcEJ0RXZlbnQpCit7CisgICB2b3NfbXNnX3QgbXNnOworICAgdHBTbWVCdEV2ZW50IHB0clNtZUJ0RXZlbnQgPSBOVUxMOworICAgc3dpdGNoKHBCdEV2ZW50LT5idEV2ZW50VHlwZSkKKyAgIHsKKyAgICAgIGNhc2UgQlRfRVZFTlRfQ1JFQVRFX1NZTkNfQ09OTkVDVElPTjoKKyAgICAgIGNhc2UgQlRfRVZFTlRfU1lOQ19DT05ORUNUSU9OX1VQREFURUQ6CisgICAgICAgICBpZihwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5saW5rVHlwZSAhPSBCVF9TQ08gJiYKKyAgICAgICAgICAgIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmxpbmtUeXBlICE9IEJUX2VTQ08pCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiAiCisgICAgICAgICAgICAgICAiSW52YWxpZCBsaW5rIHR5cGUgJWQgZm9yIFN5bmMgQ29ubmVjdGlvbi4gQlQgZXZlbnQgd2lsbCBiZSBkcm9wcGVkICIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmxpbmtUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICAgICBpZigocEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uc3RhdHVzID09IEJUX0NPTk5fU1RBVFVTX1NVQ0NFU1MpICYmCisgICAgICAgICAgICAoKHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmxpbmtUeXBlICE9IEJUX1NDTyAmJiBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5saW5rVHlwZSAhPSBCVF9lU0NPKSB8fAorICAgICAgICAgICAgIChwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5jb25uZWN0aW9uSGFuZGxlID09IEJUX0lOVkFMSURfQ09OTl9IQU5ETEUpKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6ICIKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbm5lY3Rpb24gaGFuZGxlICVkIG9yIGxpbmsgdHlwZSAlZCBmb3IgU3luYyBDb25uZWN0aW9uLiBCVCBldmVudCB3aWxsIGJlIGRyb3BwZWQgIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmNvbm5lY3Rpb25IYW5kbGUsCisgICAgICAgICAgICAgICBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5saW5rVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlRfRVZFTlRfTU9ERV9DSEFOR0VEOgorICAgICAgICAgaWYocEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsTW9kZUNoYW5nZS5tb2RlID49IEJUX0FDTF9NT0RFX01BWCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6ICIKKyAgICAgICAgICAgICAgICJJbnZhbGlkIG1vZGUgJWQgZm9yIEFDTCBDb25uZWN0aW9uLiBCVCBldmVudCB3aWxsIGJlIGRyb3BwZWQgIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbE1vZGVDaGFuZ2UubW9kZSk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSBCVF9FVkVOVF9ERVZJQ0VfU1dJVENIRURfT0ZGOgorICAgICAgICAgcE1hYy0+YnRjLmJ0Y0V2ZW50U3RhdGUgPSAwOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgYnJlYWs7CisgICB9CisgICBwdHJTbWVCdEV2ZW50ID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTbWVCdEV2ZW50KSk7CisgICBpZiAoTlVMTCA9PSBwdHJTbWVCdEV2ZW50KQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogIgorICAgICAgICAgIk5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgQlQgZXZlbnQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgYnRjTG9nRXZlbnQocE1hYywgcEJ0RXZlbnQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyAgIGJ0Y0RpYWdFdmVudExvZyhwTWFjLCBwQnRFdmVudCk7CisjZW5kaWYKKyAgIHZvc19tZW1fY29weShwdHJTbWVCdEV2ZW50LCBwQnRFdmVudCwgc2l6ZW9mKHRTbWVCdEV2ZW50KSk7CisgICBtc2cudHlwZSA9IFdEQV9TSUdOQUxfQlRfRVZFTlQ7CisgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgbXNnLmJvZHlwdHIgPSBwdHJTbWVCdEV2ZW50OworICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01PRFVMRV9JRF9XREEsICZtc2cpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogIgorICAgICAgICAgIk5vdCBhYmxlIHRvIHBvc3QgV0RBX1NJR05BTF9CVF9FVkVOVCBtZXNzYWdlIHRvIFdEQSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICB2b3NfbWVtX2ZyZWUoIHB0clNtZUJ0RXZlbnQgKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIC8vIEFmdGVyIHN1Y2Nlc3NmdWxseSBwb3N0aW5nIHRoZSBtZXNzYWdlLCBjaGVjayBpZiBoZWFydCBiZWF0CisgICAvLyBtb25pdG9yaW5nIG5lZWRzIHRvIGJlIHR1cm5lZCBvZmYKKyAgICh2b2lkKWJ0Y0NoZWNrSGVhcnRCZWF0TW9uaXRvcmluZyhwTWFjLCBwQnRFdmVudCk7CisgICAvL0NoZWNrIHdoZXRoZXIgQlRDIGFuZCBVQVBTRCBjYW4gY28tZXhpc3QKKyAgIGJ0Y1VhcHNkQ2hlY2soIHBNYWMsIHBCdEV2ZW50ICk7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgfQorCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGJ0Y1NpZ25hbEJURXZlbnQKKyAgICBcYnJpZWYgIEFQSSB0byBzaWduYWwgQmx1ZXRvb3RoIChCVCkgZXZlbnQgdG8gdGhlIFdMQU4gZHJpdmVyLiBCYXNlZCBvbiB0aGUKKyAgICAgICAgICAgIEJUIGV2ZW50IHR5cGUgYW5kIHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIG9mIExpYnJhIChmdWxsIHBvd2VyLAorICAgICAgICAgICAgQk1QUywgVUFQU0QgZXRjKSwgYXBwcm9wcmlhdGUgQmx1ZXRvb3RoIENvZXhpc3RlbmNlIChCVEMpIHN0cmF0ZWd5CisgICAgICAgICAgICB3b3VsZCBiZSBlbXBsb3llZC4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwQnRFdmVudCAtICBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdHlwZSB0U21lQnRFdmVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGxlciBvd25zIHRoZSBtZW1vcnkgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LgorICAgIFxyZXR1cm4gVk9TX1NUQVRVUworICAgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgliBCVCBFdmVudCBub3QgcGFzc2VkIHRvIEhBTC4gVGhpcyBjYW4gaGFwcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRyaXZlciBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkIG9yIGlmIEJUQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudHMgTGF5ZXIgaGFzIGJlZW4gZGlzYWJsZWQuCisgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgICCWIEJUIEV2ZW50IHBhc3NlZCB0byBIQUwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgYnRjU2lnbmFsQlRFdmVudCAodEhhbEhhbmRsZSBoSGFsLCB0cFNtZUJ0RXZlbnQgcEJ0RXZlbnQpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgaWYoIE5VTEwgPT0gcEJ0RXZlbnQgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogIgorICAgICAgICAgIk51bGwgcG9pbnRlciBmb3IgU01FIEJUIEV2ZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIGlmKCggQlRDX1dMQU5fT05MWSA9PSBwTWFjLT5idGMuYnRjQ29uZmlnLmJ0Y0V4ZWN1dGlvbk1vZGUgKSB8fAorICAgICAgKCBCVENfUFRBX09OTFkgPT0gcE1hYy0+YnRjLmJ0Y0NvbmZpZy5idGNFeGVjdXRpb25Nb2RlICkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiAiCisgICAgICAgICAiQlRDIGV4ZWN1dGlvbiBtb2RlIG5vdCBzZXQgdG8gQlRDX1NNQVJUX0NPRVhJU1RFTkNFLiBCVCBldmVudCB3aWxsIGJlIGRyb3BwZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgaWYoIHBCdEV2ZW50LT5idEV2ZW50VHlwZSA8IDAgfHwgcEJ0RXZlbnQtPmJ0RXZlbnRUeXBlID49IEJUX0VWRU5UX1RZUEVfTUFYICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6ICIKKyAgICAgICAgICJJbnZhbGlkIEJUIGV2ZW50ICVkIGJlaW5nIHBhc3NlZC4gQlQgZXZlbnQgd2lsbCBiZSBkcm9wcGVkIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBCdEV2ZW50LT5idEV2ZW50VHlwZSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICAvL0NoZWNrIFBNQyBzdGF0ZSB0byBtYWtlIHN1cmUgd2hldGhlciB3ZSBuZWVkIHRvIGRlZmVyCisgICAvL0lmIHdlIGFscmVhZHkgaGF2ZSBkZWZlcnJlZCBldmVudHMsIGRlZmVyIHRoZSBuZXcgb25lIGFzIHdlbGwsIGluIGNhc2UgUE1DIGlzIGluIHRyYW5zaXRpb24gc3RhdGUKKyAgIGlmKCBwTWFjLT5idGMuZlJlcGxheUJURXZlbnRzIHx8ICFQTUNfSVNfQ0hJUF9BQ0NFU1NJQkxFKHBtY0dldFBtY1N0YXRlKCBwTWFjICkpICkKKyAgIHsKKyAgICAgICAvL1dlIG5lZWQgdG8gZGVmZXIgdGhlIGV2ZW50CisgICAgICAgdm9zU3RhdHVzID0gYnRjRGVmZXJFdmVudChwTWFjLCBwQnRFdmVudCk7CisgICAgICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKKyAgICAgICB7CisgICAgICAgICAgIHBNYWMtPmJ0Yy5mUmVwbGF5QlRFdmVudHMgPSBWT1NfVFJVRTsKKyAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgIHsKKyAgICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgICAgICB9CisgICB9CisgICAgYnRjU2VuZEJURXZlbnQocE1hYywgcEJ0RXZlbnQpOworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGJ0Y0NoZWNrSGVhcnRCZWF0TW9uaXRvcmluZworICAgIFxicmllZiAgQVBJIHRvIGNoZWNrIHdoZXRoZXIgaGVhcnRiZWF0IG1vbml0b3JpbmcgaXMgcmVxdWlyZWQgdG8gYmUgZGlzYWJsZWQKKyAgICAgICAgICAgIGZvciBzcGVjaWZpYyBCVCBzdGFydCBldmVudHMgd2hpY2ggdGFrZXMgc2lnbmlmaWNhbnQgdGltZSB0byBjb21wbGV0ZQorICAgICAgICAgICAgZHVyaW5nIHdoaWNoIFdMQU4gbWlzc2VzIGJlYWNvbnMuIFRvIGF2b2lkIFdMQU4tTUFDIGZyb20gZGlzY29ubmVjdGluZworICAgICAgICAgICAgZm9yIHRoZSBub3QgZW5vdWdoIGJlYWNvbnMgcmVjZWl2ZWQgd2Ugc3RvcCB0aGUgaGVhcnRiZWF0IHRpbWVyIGR1cmluZworICAgICAgICAgICAgdGhpcyBzdGFydCBCVCBldmVudCB0aWxsIHRoZSBzdG9wIG9mIHRoYXQgQlQgZXZlbnQuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcEJ0RXZlbnQgLSAgUG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHR5cGUgdFNtZUJ0RXZlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxsZXIgb3ducyB0aGUgbWVtb3J5IGFuZCBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdC4KKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFICBDb25maWcgbm90IHBhc3NlZCB0byBIQUwuCisgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgIENvbmZpZyBwYXNzZWQgdG8gSEFMCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIGJ0Y0NoZWNrSGVhcnRCZWF0TW9uaXRvcmluZyh0SGFsSGFuZGxlIGhIYWwsIHRwU21lQnRFdmVudCBwQnRFdmVudCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICBzd2l0Y2gocEJ0RXZlbnQtPmJ0RXZlbnRUeXBlKQorICAgeworICAgICAgLy8gU3RhcnQgZXZlbnRzIHdoaWNoIHJlcXVpcmVzIGhlYXJ0YmVhdCBtb25pdG9yaW5nIGJlIGRpc2FibGVkLgorICAgICAgY2FzZSBCVF9FVkVOVF9JTlFVSVJZX1NUQVJURUQ6CisgICAgICAgICAgcE1hYy0+YnRjLmJ0Y0V2ZW50U3RhdGUgfD0gQlRfSU5RVUlSWV9TVEFSVEVEOworICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCVF9FVkVOVF9QQUdFX1NUQVJURUQ6CisgICAgICAgICAgcE1hYy0+YnRjLmJ0Y0V2ZW50U3RhdGUgfD0gQlRfUEFHRV9TVEFSVEVEOworICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCVF9FVkVOVF9DUkVBVEVfQUNMX0NPTk5FQ1RJT046CisgICAgICAgICAgcE1hYy0+YnRjLmJ0Y0V2ZW50U3RhdGUgfD0gQlRfQ1JFQVRFX0FDTF9DT05ORUNUSU9OX1NUQVJURUQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJUX0VWRU5UX0NSRUFURV9TWU5DX0NPTk5FQ1RJT046CisgICAgICAgICAgcE1hYy0+YnRjLmJ0Y0V2ZW50U3RhdGUgfD0gQlRfQ1JFQVRFX1NZTkNfQ09OTkVDVElPTl9TVEFSVEVEOworICAgICAgICAgIGJyZWFrOworICAgICAgLy8gU3RvcC9kb25lIGV2ZW50cyB3aGljaCBpbmRpY2F0ZXMgaGVhcnRiZWF0IG1vbml0b3JpbmcgY2FuIGJlIGVuYWJsZWQKKyAgICAgIGNhc2UgQlRfRVZFTlRfSU5RVUlSWV9TVE9QUEVEOgorICAgICAgICAgIHBNYWMtPmJ0Yy5idGNFdmVudFN0YXRlICY9IH4oQlRfSU5RVUlSWV9TVEFSVEVEKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlRfRVZFTlRfUEFHRV9TVE9QUEVEOgorICAgICAgICAgIHBNYWMtPmJ0Yy5idGNFdmVudFN0YXRlICY9IH4oQlRfUEFHRV9TVEFSVEVEKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlRfRVZFTlRfQUNMX0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICAgICAgcE1hYy0+YnRjLmJ0Y0V2ZW50U3RhdGUgJj0gfihCVF9DUkVBVEVfQUNMX0NPTk5FQ1RJT05fU1RBUlRFRCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJUX0VWRU5UX1NZTkNfQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICAgICBwTWFjLT5idGMuYnRjRXZlbnRTdGF0ZSAmPSB+KEJUX0NSRUFURV9TWU5DX0NPTk5FQ1RJT05fU1RBUlRFRCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgIC8vIElnbm9yZSBvdGhlciBldmVudHMKKyAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgfQorICAgLy8gQ2hlY2sgaWYgYW55IG9mIHRoZSBCVCBzdGFydCBldmVudHMgYXJlIGFjdGl2ZQorICAgaWYgKHBNYWMtPmJ0Yy5idGNFdmVudFN0YXRlKSB7CisgICAgICAgaWYgKHBNYWMtPmJ0Yy5idGNIQkFjdGl2ZSkgeworICAgICAgICAgICAvLyBzZXQgaGVhcnRiZWF0IHRocmVzaG9sZCBDRkcgdG8gemVybworICAgICAgICAgICBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCwgMCwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgcE1hYy0+YnRjLmJ0Y0hCQWN0aXZlID0gVk9TX0ZBTFNFOworICAgICAgIH0KKyAgICAgICAvLyBEZWFjdGl2YXRlIGFuZCBhY3RpdmUgdGhlIHJlc3RvcmUgSEIgdGltZXIKKyAgICAgICB2b3NfdGltZXJfc3RvcCggJnBNYWMtPmJ0Yy5yZXN0b3JlSEJUaW1lcik7CisgICAgICAgdm9zU3RhdHVzPSB2b3NfdGltZXJfc3RhcnQoICZwTWFjLT5idGMucmVzdG9yZUhCVGltZXIsIEJUX01BWF9FVkVOVF9ET05FX1RJTUVPVVQgKTsKKyAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKSB7CisgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYnRjQ2hlY2tIZWFydEJlYXRNb25pdG9yaW5nOiBGYWlsIHRvIHN0YXJ0IHRpbWVyIik7CisgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICB9CisgICB9IGVsc2UgeworICAgICAgIC8vIFJlc3RvcmUgQ0ZHIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHZhbHVlIG9ubHkgaWYgaXQgd2FzIGRpc2FibGVkCisgICAgICAgaWYgKCFwTWFjLT5idGMuYnRjSEJBY3RpdmUpIHsKKyAgICAgICAgICAgY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQsIHBNYWMtPmJ0Yy5idGNIQkNvdW50LCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICAgICBwTWFjLT5idGMuYnRjSEJBY3RpdmUgPSBWT1NfVFJVRTsKKyAgICAgICB9CisgICAgICAgLy8gRGVhY3RpdmF0ZSB0aGUgdGltZXIKKyAgICAgICB2b3NTdGF0dXMgPSB2b3NfdGltZXJfc3RvcCggJnBNYWMtPmJ0Yy5yZXN0b3JlSEJUaW1lcik7CisgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkgeworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJ0Y0NoZWNrSGVhcnRCZWF0TW9uaXRvcmluZzogRmFpbCB0byBzdG9wIHRpbWVyIik7CisgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICB9CisgICB9CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGJ0Y1Jlc3RvcmVIZWFydEJlYXRNb25pdG9yaW5nSGFuZGxlCisgICAgXGJyaWVmICBUaW1lciBoYW5kbGVyIHRvIGhhbmRsZXQgdGhlIHRpbWVvdXQgY29uZGl0aW9uIHdoZW4gYSBzcGVjaWZpYyBCVAorICAgICAgICAgICAgc3RvcCBldmVudCBkb2VzIG5vdCBjb21lIGJhY2ssIGluIHdoaWNoIGNhc2UgdG8gcmVzdG9yZSBiYWNrIHRoZQorICAgICAgICAgICAgaGVhcnRiZWF0IHRpbWVyLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIFZPSUQKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgYnRjUmVzdG9yZUhlYXJ0QmVhdE1vbml0b3JpbmdIYW5kbGUodEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIGlmKCAhcE1hYy0+YnRjLmJ0Y0hCQWN0aXZlICkKKyAgICB7CisgICAgICAgIHRQbWNTdGF0ZSBwbWNTdGF0ZTsKKyAgICAgICAgLy9DaGVjayBQTUMgc3RhdGUgdG8gbWFrZSBzdXJlIHdoZXRoZXIgd2UgbmVlZCB0byBkZWZlcgorICAgICAgICBwbWNTdGF0ZSA9IHBtY0dldFBtY1N0YXRlKCBwTWFjICk7CisgICAgICAgIGlmKCBQTUNfSVNfQ0hJUF9BQ0NFU1NJQkxFKHBtY1N0YXRlKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgQ0ZHIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHZhbHVlCisgICAgICAgICAgICBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCwgcE1hYy0+YnRjLmJ0Y0hCQ291bnQsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkJUIGV2ZW50IHRpbWVvdXQsIHJlc3RvcmluZyBiYWNrIEhlYXJ0QmVhdCB0aW1lciIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9kZWZlciBpdAorICAgICAgICAgICAgcE1hYy0+YnRjLmJ0Y0V2ZW50UmVwbGF5LmZSZXN0b3JlSEJNb25pdG9yID0gVk9TX1RSVUU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGJ0Y1NldENvbmZpZworICAgIFxicmllZiAgQVBJIHRvIGNoYW5nZSB0aGUgY3VycmVudCBCbHVldG9vdGggQ29leGlzdGVuY2UgKEJUQykgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW52b2tlZCBvbmx5IGFmdGVyIENGRyBkb3dubG9hZCBoYXMgY29tcGxldGVkLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBTbWVCdGNDb25maWcgLSBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTbWVCdGNDb25maWcuIENhbGxlciBvd25zIHRoZSBtZW1vcnkgYW5kIGlzIHJlc3BvbnNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZyZWVpbmcgaXQuCisgICAgXHJldHVybiBWT1NfU1RBVFVTCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAgQ29uZmlnIG5vdCBwYXNzZWQgdG8gSEFMLgorICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICBDb25maWcgcGFzc2VkIHRvIEhBTAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBidGNTZXRDb25maWcgKHRIYWxIYW5kbGUgaEhhbCwgdHBTbWVCdGNDb25maWcgcFNtZUJ0Y0NvbmZpZykKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgLy9TYXZlIGEgY29weSBpbiB0aGUgZ2xvYmFsIEJUQyBjb25maWcKKyAgIHZvc19tZW1fY29weSgmKHBNYWMtPmJ0Yy5idGNDb25maWcpLCBwU21lQnRjQ29uZmlnLCBzaXplb2YodFNtZUJ0Y0NvbmZpZykpOworICAgLy9TZW5kIHRoZSBjb25maWcgZG93biBvbmx5IGlmIFNNRV9IZGRSZWFkeSBoYXMgYmVlbiBpbnZva2VkLiBJZiBub3QgcmVhZHksCisgICAvL0JUQyBjb25maWcgd2lsbCBwbHVtYmVkIGRvd24gd2hlbiBidGNSZWFkeSBpcyBldmVudHVhbGx5IGludm9rZWQuCisgICBpZihwTWFjLT5idGMuYnRjUmVhZHkpCisgICB7CisgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gYnRjU2VuZENmZ01zZyhoSGFsLCBwU21lQnRjQ29uZmlnKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAKKyAgICAgICAgICAgICJGYWlsdXJlIHRvIHNlbmQgQlRDIGNvbmZpZyBkb3duIik7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisgICB9CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGJ0Y1Bvc3RCdGNDZmdNc2cKKyAgICBcYnJpZWYgIFByaXZhdGUgQVBJIHRvIHBvc3QgQlRDIGNvbmZpZyBtZXNzYWdlIHRvIEhBTAorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBTbWVCdGNDb25maWcgLSBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTbWVCdGNDb25maWcuIENhbGxlciBvd25zIHRoZSBtZW1vcnkgYW5kIGlzIHJlc3BvbnNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZyZWVpbmcgaXQuCisgICAgXHJldHVybiBWT1NfU1RBVFVTCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAgQ29uZmlnIG5vdCBwYXNzZWQgdG8gSEFMLgorICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICBDb25maWcgcGFzc2VkIHRvIEhBTAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBidGNTZW5kQ2ZnTXNnKHRIYWxIYW5kbGUgaEhhbCwgdHBTbWVCdGNDb25maWcgcFNtZUJ0Y0NvbmZpZykKK3sKKyAgIHRwU21lQnRjQ29uZmlnIHB0clNtZUJ0Y0NvbmZpZyA9IE5VTEw7CisgICB2b3NfbXNnX3QgbXNnOworICAgaWYoIE5VTEwgPT0gcFNtZUJ0Y0NvbmZpZyApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJ0Y1NlbmRDZmdNc2c6ICIKKyAgICAgICAgICJOdWxsIHBvaW50ZXIgZm9yIEJUQyBDb25maWciKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIGlmKCBwU21lQnRjQ29uZmlnLT5idGNFeGVjdXRpb25Nb2RlID49IEJUX0VYRUNfTU9ERV9NQVggKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJidGNTZW5kQ2ZnTXNnOiAiCisgICAgICAgICAiSW52YWxpZCBCVCBleGVjdXRpb24gbW9kZSAlZCBiZWluZyBzZXQiLAorICAgICAgICAgIHBTbWVCdGNDb25maWctPmJ0Y0V4ZWN1dGlvbk1vZGUpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgcHRyU21lQnRjQ29uZmlnID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTbWVCdGNDb25maWcpKTsKKyAgIGlmIChOVUxMID09IHB0clNtZUJ0Y0NvbmZpZykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYnRjU2VuZENmZ01zZzogIgorICAgICAgICAgIk5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgU01FIEJUQyBDb25maWciKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIHZvc19tZW1fY29weShwdHJTbWVCdGNDb25maWcsIHBTbWVCdGNDb25maWcsIHNpemVvZih0U21lQnRjQ29uZmlnKSk7CisgICBtc2cudHlwZSA9IFdEQV9CVENfU0VUX0NGRzsKKyAgIG1zZy5yZXNlcnZlZCA9IDA7CisgICBtc2cuYm9keXB0ciA9IHB0clNtZUJ0Y0NvbmZpZzsKKyAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NT0RVTEVfSURfV0RBLCAmbXNnKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiYnRjU2VuZENmZ01zZzogIgorICAgICAgICAgIk5vdCBhYmxlIHRvIHBvc3QgV0RBX0JUQ19TRVRfQ0ZHIG1lc3NhZ2UgdG8gV0RBIik7CisgICAgICB2b3NfbWVtX2ZyZWUoIHB0clNtZUJ0Y0NvbmZpZyApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBidGNHZXRDb25maWcKKyAgICBcYnJpZWYgIEFQSSB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBCbHVldG9vdGggQ29leGlzdGVuY2UgKEJUQykgY29uZmlndXJhdGlvbgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBTbWVCdGNDb25maWcgLSBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTbWVCdGNDb25maWcuIENhbGxlciBvd25zIHRoZSBtZW1vcnkgYW5kIGlzIHJlc3BvbnNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZyZWVpbmcgaXQuCisgICAgXHJldHVybiBWT1NfU1RBVFVTCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIGZhaWx1cmUKKyAgICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgc3VjY2VzcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBidGNHZXRDb25maWcgKHRIYWxIYW5kbGUgaEhhbCwgdHBTbWVCdGNDb25maWcgcFNtZUJ0Y0NvbmZpZykKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgaWYoIE5VTEwgPT0gcFNtZUJ0Y0NvbmZpZyApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImJ0Y0dldENvbmZpZzogIgorICAgICAgICAgIk51bGwgcG9pbnRlciBmb3IgQlRDIENvbmZpZyIpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgdm9zX21lbV9jb3B5KHBTbWVCdGNDb25maWcsICYocE1hYy0+YnRjLmJ0Y0NvbmZpZyksIHNpemVvZih0U21lQnRjQ29uZmlnKSk7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorLyoKKyAgICBidGNGaW5kQWNsRXZlbnRIaXN0IGZpbmQgYSBzdWl0ZWQgQUNMIGV2ZW50IGJ1ZmZlcgorICAgIFBhcmFtOiBiZEFkZHIgLSBOVUxMIG1lYW5pbmcgbm90IGNhcmUuCisgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gY2FsbGVyIGFsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIHRoZSBCRCBhZGRyZXNzIHRvIGZpbmQgYSBtYXRjaAorICAgICAgICAgICBoYW5kbGUgLSBCVF9JTlZBTElEX0NPTk5fSEFORExFID09IG5vdCBjYXJlCisgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgYSBoYW5kbGUgdG8gbWF0Y2gKKyAgICBOT1BURTogRWl0aGVyIGJkQWRkciBvciBoYW5kbGUgY2FuIGJlIHZhbGlkLCBpZiBib3RoIG9mIHRoZW0gYXJlIHZhbGlkLCB1c2UgYmRBZGRyIG9ubHkuIElmIG5laXRoZXIgCisgICAgICAgICAgIGJkQWRkciBub3IgaGFuZGxlIGlzIHZhbGlkLCByZXR1cm4gdGhlIG5leHQgZnJlZSBzbG90LgorKi8KK3N0YXRpYyB0cFNtZUJ0QWNsRXZlbnRIaXN0IGJ0Y0ZpbmRBY2xFdmVudEhpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCAqYmRBZGRyLCB2X1UxNl90IGhhbmRsZSApCit7CisgICAgaW50IGksIGo7CisgICAgdHBTbWVCdEFjbEV2ZW50SGlzdCBwUmV0ID0gTlVMTDsKKyAgICB0U21lQnRjRXZlbnRSZXBsYXkgKnBSZXBsYXkgPSAmcE1hYy0+YnRjLmJ0Y0V2ZW50UmVwbGF5OworICAgIGZvciggaSA9IDA7IChpIDwgQlRfTUFYX0FDTF9TVVBQT1JUKSAmJiAoTlVMTCA9PSBwUmV0KTsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBOVUxMICE9IGJkQWRkciApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vdHJ5IHRvIG1hdGNoIGFkZHIKKyAgICAgICAgICAgIGlmKCBwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xDb25uZWN0aW9uRXZlbnRbaV0uYk5leHRFdmVudElkeCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0QWNsQ29ubmVjdGlvbkV2ZW50W2ldLmJOZXh0RXZlbnRJZHg7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB2b3NfbWVtX2NvbXBhcmUocFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0QWNsQ29ubmVjdGlvbkV2ZW50W2ldLmJ0QWNsQ29ubmVjdGlvbltqXS5iZEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBiZEFkZHIsIDYpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3VuZCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgcFJldCA9ICZwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xDb25uZWN0aW9uRXZlbnRbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBCVF9JTlZBTElEX0NPTk5fSEFORExFICE9IGhhbmRsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vdHJ5IHRvIG1hdGNoIGhhbmRsZQorICAgICAgICAgICAgaWYoIHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idEFjbENvbm5lY3Rpb25FdmVudFtpXS5iTmV4dEV2ZW50SWR4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xDb25uZWN0aW9uRXZlbnRbaV0uYk5leHRFdmVudElkeDsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idEFjbENvbm5lY3Rpb25FdmVudFtpXS5idEFjbENvbm5lY3Rpb25bal0uY29ubmVjdGlvbkhhbmRsZSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3VuZCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgcFJldCA9ICZwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xDb25uZWN0aW9uRXZlbnRbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCAwID09IHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idEFjbENvbm5lY3Rpb25FdmVudFtpXS5iTmV4dEV2ZW50SWR4ICkKKyAgICAgICAgeworICAgICAgICAgICAgcFJldCA9ICZwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xDb25uZWN0aW9uRXZlbnRbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHBSZXQpOworfQorCisvKgorICAgIGJ0Y0ZpbmRTeW5jRXZlbnRIaXN0IGZpbmQgYSBzdWl0ZWQgU1lOQyBldmVudCBidWZmZXIKKyAgICBQYXJhbTogYmRBZGRyIC0gTlVMTCBtZWFuaW5nIG5vdCBjYXJlLgorICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIGNhbGxlciBhbG9jYXRlZCBidWZmZXIgY29udGFpbmluZyB0aGUgQkQgYWRkcmVzcyB0byBmaW5kIGEgbWF0Y2gKKyAgICAgICAgICAgaGFuZGxlIC0gQlRfSU5WQUxJRF9DT05OX0hBTkRMRSA9PSBub3QgY2FyZQorICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIGEgaGFuZGxlIHRvIG1hdGNoCisgICAgTk9QVEU6IEVpdGhlciBiZEFkZHIgb3IgaGFuZGxlIGNhbiBiZSB2YWxpZCwgaWYgYm90aCBvZiB0aGVtIGFyZSB2YWxpZCwgdXNlIGJkQWRkciBvbmx5LiBJZiBuZWl0aGVyIAorICAgICAgICAgICBiZEFkZHIgbm9yIGhhbmRsZSBpcyB2YWxpZCwgcmV0dXJuIHRoZSBuZXh0IGZyZWUgc2xvdC4KKyovCitzdGF0aWMgdHBTbWVCdFN5bmNFdmVudEhpc3QgYnRjRmluZFN5bmNFdmVudEhpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfVThfdCAqYmRBZGRyLCB2X1UxNl90IGhhbmRsZSApCit7CisgICAgaW50IGksIGo7CisgICAgdHBTbWVCdFN5bmNFdmVudEhpc3QgcFJldCA9IE5VTEw7CisgICAgdFNtZUJ0Y0V2ZW50UmVwbGF5ICpwUmVwbGF5ID0gJnBNYWMtPmJ0Yy5idGNFdmVudFJlcGxheTsKKyAgICBmb3IoIGkgPSAwOyAoaSA8IEJUX01BWF9TQ09fU1VQUE9SVCkgJiYgKE5VTEwgPT0gcFJldCk7IGkrKyApCisgICAgeworICAgICAgICBpZiggTlVMTCAhPSBiZEFkZHIgKQorICAgICAgICB7CisgICAgICAgICAgICAvL3RyeSB0byBtYXRjaCBhZGRyCisgICAgICAgICAgICBpZiggcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0U3luY0Nvbm5lY3Rpb25FdmVudFtpXS5iTmV4dEV2ZW50SWR4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xDb25uZWN0aW9uRXZlbnRbaV0uYk5leHRFdmVudElkeDsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHZvc19tZW1fY29tcGFyZShwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRTeW5jQ29ubmVjdGlvbkV2ZW50W2ldLmJ0U3luY0Nvbm5lY3Rpb25bal0uYmRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgYmRBZGRyLCA2KSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZm91bmQgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZXQgPSAmcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0U3luY0Nvbm5lY3Rpb25FdmVudFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIEJUX0lOVkFMSURfQ09OTl9IQU5ETEUgIT0gaGFuZGxlICkKKyAgICAgICAgeworICAgICAgICAgICAgLy90cnkgdG8gbWF0Y2ggaGFuZGxlCisgICAgICAgICAgICBpZiggcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0U3luY0Nvbm5lY3Rpb25FdmVudFtpXS5iTmV4dEV2ZW50SWR4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xDb25uZWN0aW9uRXZlbnRbaV0uYk5leHRFdmVudElkeDsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idFN5bmNDb25uZWN0aW9uRXZlbnRbaV0uYnRTeW5jQ29ubmVjdGlvbltqXS5jb25uZWN0aW9uSGFuZGxlID09CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvdW5kIGl0CisgICAgICAgICAgICAgICAgICAgICAgICBwUmV0ID0gJnBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idFN5bmNDb25uZWN0aW9uRXZlbnRbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCAhcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0U3luY0Nvbm5lY3Rpb25FdmVudFtpXS5iTmV4dEV2ZW50SWR4ICkKKyAgICAgICAgeworICAgICAgICAgICAgcFJldCA9ICZwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRTeW5jQ29ubmVjdGlvbkV2ZW50W2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChwUmV0KTsKK30KKworLyoKKyAgICBidGNGaW5kRGlzY29ubkV2ZW50SGlzdCBmaW5kIGEgc2xvdCBmb3IgdGhlIGRlZmVycmVkIGRpc2Nvbm5lY3QgZXZlbnQKKyAgICBJZiBoYW5kbGUgaXMgaW52bGlkLCBpdCByZXR1cm5zIGEgZnJlZSBzbG90LCBpZiBhbnkuIAorICAgIElmIGhhbmRsZSBpcyB2YWxpZCwgaXQgdHJpZXMgdG8gZmluZCBhIG1hdGNoIGZpcnN0IGluIGNhc2Ugc2FtZSBkaXNjb25uZWN0IGV2ZW50IGNvbWVzIGRvd24gYWdhaW4uCisqLworc3RhdGljIHRwU21lQnREaXNjb25uZWN0RXZlbnRIaXN0IGJ0Y0ZpbmREaXNjb25uRXZlbnRIaXN0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1UxNl90IGhhbmRsZSApCit7CisgICAgdHBTbWVCdERpc2Nvbm5lY3RFdmVudEhpc3QgcFJldCA9IE5VTEw7CisgICAgdFNtZUJ0Y0V2ZW50UmVwbGF5ICpwUmVwbGF5ID0gJnBNYWMtPmJ0Yy5idGNFdmVudFJlcGxheTsKKyAgICBpbnQgaTsKKyAgICBpZiggQlRfSU5WQUxJRF9DT05OX0hBTkRMRSAhPSBoYW5kbGUgKQorICAgIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgQlRfTUFYX0RJU0NPTk5fU1VQUE9SVDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0RGlzY29ubmVjdEV2ZW50W2ldLmZWYWxpZCAmJgorICAgICAgICAgICAgICAgIChoYW5kbGUgPT0gcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0RGlzY29ubmVjdEV2ZW50W2ldLmJ0RGlzY29ubmVjdC5jb25uZWN0aW9uSGFuZGxlKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFJldCA9ICZwUmVwbGF5LT5idGNFdmVudEhpc3QuYnREaXNjb25uZWN0RXZlbnRbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoIE5VTEwgPT0gcFJldCApCisgICAgeworICAgICAgICAvL0ZpbmQgYSBmcmVlIHNsb3QKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgQlRfTUFYX0RJU0NPTk5fU1VQUE9SVDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIXBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idERpc2Nvbm5lY3RFdmVudFtpXS5mVmFsaWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBSZXQgPSAmcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0RGlzY29ubmVjdEV2ZW50W2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAocFJldCk7Cit9CisKKy8qCisgICAgYnRjRmluZE1vZGVDaGFuZ2VFdmVudEhpc3QgZmluZCBhIHNsb3QgZm9yIHRoZSBkZWZlcnJlZCBtb3BkZSBjaGFuZ2UgZXZlbnQKKyAgICBJZiBoYW5kbGUgaXMgaW52YWxpZCwgaXQgcmV0dXJucyBhIGZyZWUgc2xvdCwgaWYgYW55LiAKKyAgICBJZiBoYW5kbGUgaXMgdmFsaWQsIGl0IHRyaWVzIHRvIGZpbmQgYSBtYXRjaCBmaXJzdCBpbiBjYXNlIHNhbWUgZGlzY29ubmVjdCBldmVudCBjb21lcyBkb3duIGFnYWluLgorKi8KK3RwU21lQnRBY2xNb2RlQ2hhbmdlRXZlbnRIaXN0IGJ0Y0ZpbmRNb2RlQ2hhbmdlRXZlbnRIaXN0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB2X1UxNl90IGhhbmRsZSApCit7CisgICAgdHBTbWVCdEFjbE1vZGVDaGFuZ2VFdmVudEhpc3QgcFJldCA9IE5VTEw7CisgICAgdFNtZUJ0Y0V2ZW50UmVwbGF5ICpwUmVwbGF5ID0gJnBNYWMtPmJ0Yy5idGNFdmVudFJlcGxheTsKKyAgICBpbnQgaTsKKyAgICBpZiggQlRfSU5WQUxJRF9DT05OX0hBTkRMRSAhPSBoYW5kbGUgKQorICAgIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgQlRfTUFYX0FDTF9TVVBQT1JUOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xNb2RlQ2hhbmdlRXZlbnRbaV0uZlZhbGlkICYmCisgICAgICAgICAgICAgICAgKGhhbmRsZSA9PSBwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xNb2RlQ2hhbmdlRXZlbnRbaV0uYnRBY2xNb2RlQ2hhbmdlLmNvbm5lY3Rpb25IYW5kbGUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUmV0ID0gJnBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idEFjbE1vZGVDaGFuZ2VFdmVudFtpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiggTlVMTCA9PSBwUmV0ICkKKyAgICB7CisgICAgICAgIC8vRmluZCBhIGZyZWUgc2xvdAorICAgICAgICBmb3IoaSA9IDA7IGkgPCBCVF9NQVhfQUNMX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xNb2RlQ2hhbmdlRXZlbnRbaV0uZlZhbGlkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUmV0ID0gJnBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idEFjbE1vZGVDaGFuZ2VFdmVudFtpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHBSZXQpOworfQorCisvKgorICAgIGJ0Y0ZpbmRTeW5jVXBkYXRlRXZlbnRIaXN0IGZpbmQgYSBzbG90IGZvciB0aGUgZGVmZXJyZWQgU1lOQ19VUERBVEUgZXZlbnQKKyAgICBJZiBoYW5kbGUgaXMgaW52YWxpZCwgaXQgcmV0dXJucyBhIGZyZWUgc2xvdCwgaWYgYW55LiAKKyAgICBJZiBoYW5kbGUgaXMgdmFsaWQsIGl0IHRyaWVzIHRvIGZpbmQgYSBtYXRjaCBmaXJzdCBpbiBjYXNlIHNhbWUgZGlzY29ubmVjdCBldmVudCBjb21lcyBkb3duIGFnYWluLgorKi8KK3RwU21lQnRTeW5jVXBkYXRlSGlzdCBidGNGaW5kU3luY1VwZGF0ZUV2ZW50SGlzdCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdl9VMTZfdCBoYW5kbGUgKQoreworICAgIHRwU21lQnRTeW5jVXBkYXRlSGlzdCBwUmV0ID0gTlVMTDsKKyAgICB0U21lQnRjRXZlbnRSZXBsYXkgKnBSZXBsYXkgPSAmcE1hYy0+YnRjLmJ0Y0V2ZW50UmVwbGF5OworICAgIGludCBpOworICAgIGlmKCBCVF9JTlZBTElEX0NPTk5fSEFORExFICE9IGhhbmRsZSApCisgICAgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCBCVF9NQVhfU0NPX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idFN5bmNVcGRhdGVFdmVudFtpXS5mVmFsaWQgJiYKKyAgICAgICAgICAgICAgICAoaGFuZGxlID09IHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idFN5bmNVcGRhdGVFdmVudFtpXS5idFN5bmNDb25uZWN0aW9uLmNvbm5lY3Rpb25IYW5kbGUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUmV0ID0gJnBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idFN5bmNVcGRhdGVFdmVudFtpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiggTlVMTCA9PSBwUmV0ICkKKyAgICB7CisgICAgICAgIC8vRmluZCBhIGZyZWUgc2xvdAorICAgICAgICBmb3IoaSA9IDA7IGkgPCBCVF9NQVhfU0NPX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRTeW5jVXBkYXRlRXZlbnRbaV0uZlZhbGlkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUmV0ID0gJnBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idFN5bmNVcGRhdGVFdmVudFtpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHBSZXQpOworfQorCisvKgorICAgIENhbGwgbXVzdCB2YWxpZGF0ZSBwQWNsRXZlbnRIaXN0CisqLworc3RhdGljIHZvaWQgYnRjUmVsZWFzZUFjbEV2ZW50SGlzdCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTbWVCdEFjbEV2ZW50SGlzdCBwQWNsRXZlbnRIaXN0ICkKK3sKKyAgICB2b3NfbWVtX3plcm8oIHBBY2xFdmVudEhpc3QsIHNpemVvZih0U21lQnRBY2xFdmVudEhpc3QpICk7Cit9CisKKy8qCisgICAgQ2FsbCBtdXN0IHZhbGlkYXRlIHBTeW5jRXZlbnRIaXN0CisqLworc3RhdGljIHZvaWQgYnRjUmVsZWFzZVN5bmNFdmVudEhpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU21lQnRTeW5jRXZlbnRIaXN0IHBTeW5jRXZlbnRIaXN0ICkKK3sKKyAgICB2b3NfbWVtX3plcm8oIHBTeW5jRXZlbnRIaXN0LCBzaXplb2YodFNtZUJ0U3luY0V2ZW50SGlzdCkgKTsKK30KKworLypUbyBkZWZlciBhIEFDTCBjcmVhdGlvbiBldmVudAorICAgIFdlIG9ubHkgc3VwcG9ydCBvbmUgQUNMIHBlciBCRCBhZGRyZXNzLgorICAgIElmIHRoZSBsYXN0IGNhY2hlZCBldmVudCBhbm90aGVyIEFDTCBjcmVhdGUgZXZlbnQsIHJlcGxhY2UgdGhhdCBldmVudCB3aXRoIHRoZSBuZXcgZXZlbnQKKyAgICBJZiBhIGNvbXBsZXRpb24gZXZlbnQgd2l0aCBzdWNjZXNzIHN0YXR1cyBjb2RlLCBhbmQgdGhlIG5ldyBBQ0wgY3JlYXRpb24gCisgICAgb24gc2FtZSBhZGRyZXNzLCBkZWZlciBhIG5ldyBkaXNjb25uZWN0IGV2ZW50KGZha2Ugb25lKSwgdGhlbiBjYWNoZSB0aGlzIEFDTCBjcmVhdGlvbiBldmVudC4KKyAgICBPdGhlcndpc2UsIHNhdmUgdGhpcyBjcmVhdGUgZXZlbnQuCisqLworc3RhdGljIFZPU19TVEFUVVMgYnRjRGVmZXJBY2xDcmVhdGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU21lQnRFdmVudCBwRXZlbnQgKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwU21lQnRBY2xFdmVudEhpc3QgcEFjbEV2ZW50SGlzdDsKKyAgICB0U21lQnRBY2xDb25uZWN0aW9uUGFyYW0gKnBBY2xFdmVudDsKKyAgICBkbworICAgIHsKKyAgICAgICAgLy9GaW5kIGEgbWF0Y2gKKyAgICAgICAgcEFjbEV2ZW50SGlzdCA9IGJ0Y0ZpbmRBY2xFdmVudEhpc3QoIHBNYWMsIHBFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xDb25uZWN0aW9uLmJkQWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9JTlZBTElEX0NPTk5fSEFORExFICk7CisgICAgICAgIGlmKCBOVUxMID09IHBBY2xFdmVudEhpc3QgKQorICAgICAgICB7CisgICAgICAgICAgICAvL05vIGNhY2hlZCBBQ0wgZXZlbnQgb24gdGhpcyBhZGRyZXNzCisgICAgICAgICAgICAvL0ZpbmQgYSBmcmVlIHNsb3QgYW5kIHNhdmUgaXQKKyAgICAgICAgICAgIHBBY2xFdmVudEhpc3QgPSBidGNGaW5kQWNsRXZlbnRIaXN0KCBwTWFjLCBOVUxMLCBCVF9JTlZBTElEX0NPTk5fSEFORExFICk7CisgICAgICAgICAgICBpZiggTlVMTCAhPSBwQWNsRXZlbnRIaXN0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBBY2xFdmVudEhpc3QtPmJ0QWNsQ29ubmVjdGlvblswXSwgJnBFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xDb25uZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTbWVCdEFjbENvbm5lY3Rpb25QYXJhbSkpOworICAgICAgICAgICAgICAgIHBBY2xFdmVudEhpc3QtPmJ0RXZlbnRUeXBlWzBdID0gQlRfRVZFTlRfQ1JFQVRFX0FDTF9DT05ORUNUSU9OOworICAgICAgICAgICAgICAgIHBBY2xFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHggPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWxlZCB0byBmaW5kIEFDTCBldmVudCBzbG90XG4iKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX1JFU09VUkNFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZG9uZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL1RoZXJlIGlzIGhpc3Rvcnkgb24gdGhpcyBCRCBhZGRyZXNzCisgICAgICAgICAgICBWT1NfQVNTRVJUKHBBY2xFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHggPiAwKTsKKyAgICAgICAgICAgIHBBY2xFdmVudCA9ICZwQWNsRXZlbnRIaXN0LT5idEFjbENvbm5lY3Rpb25bcEFjbEV2ZW50SGlzdC0+Yk5leHRFdmVudElkeCAtIDFdOworICAgICAgICAgICAgaWYoQlRfRVZFTlRfQ1JFQVRFX0FDTF9DT05ORUNUSU9OID09IHBBY2xFdmVudEhpc3QtPmJ0RXZlbnRUeXBlW3BBY2xFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHggLSAxXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1RoZSBsYXN0IGNhY2hlZCBldmVudCBpcyBjcmVhdGlvbiwgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgb25lCisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBBY2xFdmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsQ29ubmVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U21lQnRBY2xDb25uZWN0aW9uUGFyYW0pKTsKKyAgICAgICAgICAgICAgICAvL2RvbmUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoQlRfRVZFTlRfQUNMX0NPTk5FQ1RJT05fQ09NUExFVEUgPT0gCisgICAgICAgICAgICAgICAgICAgICAgICBwQWNsRXZlbnRIaXN0LT5idEV2ZW50VHlwZVtwQWNsRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4IC0gMV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9UaGUgbGFzdCBjYWNoZWQgZXZlbnQgaXMgY29tcGxldGlvbiwgY2hlY2sgdGhlIHN0YXR1cy4KKyAgICAgICAgICAgICAgICBpZihCVF9DT05OX1NUQVRVU19TVUNDRVNTID09IHBBY2xFdmVudC0+c3RhdHVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdFNtZUJ0RXZlbnQgYnRFdmVudDsKKyAgICAgICAgICAgICAgICAgICAgLy9UaGUgbGFzdCBldmVudCB3ZSBoYXZlIGlzIHN1Y2Nlc3MgY29tcGxldGlvbiBldmVudC4gCisgICAgICAgICAgICAgICAgICAgIC8vU2hvdWxkIG5vdCBnZXQgYSBjcmVhdGlvbiBldmVudCBiZWZvcmUgY3JlYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBNaXNzaW5nIGRpc2Nvbm5lY3QgZXZlbnQgb24gaGFuZGxlICVkXG4iKSwgcEFjbEV2ZW50LT5jb25uZWN0aW9uSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgLy9GYWtlIGEgZGlzY29ubmVjdCBldmVudAorICAgICAgICAgICAgICAgICAgICBidEV2ZW50LmJ0RXZlbnRUeXBlID0gQlRfRVZFTlRfRElTQ09OTkVDVElPTl9DT01QTEVURTsKKyAgICAgICAgICAgICAgICAgICAgYnRFdmVudC51RXZlbnRQYXJhbS5idERpc2Nvbm5lY3QuY29ubmVjdGlvbkhhbmRsZSA9IHBBY2xFdmVudC0+Y29ubmVjdGlvbkhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgYnRjRGVmZXJEaXNjb25uRXZlbnQocE1hYywgJmJ0RXZlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vTmVlZCB0byBzYXZlIHRoZSBuZXcgZXZlbnQKKyAgICAgICAgICAgIGlmKHBBY2xFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHggPCBCVF9NQVhfTlVNX0VWRU5UX0FDTF9ERUZFUlJFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWNsRXZlbnRIaXN0LT5idEV2ZW50VHlwZVtwQWNsRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4XSA9IEJUX0VWRU5UX0NSRUFURV9BQ0xfQ09OTkVDVElPTjsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBBY2xFdmVudEhpc3QtPmJ0QWNsQ29ubmVjdGlvbltwQWNsRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4XSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsQ29ubmVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U21lQnRBY2xDb25uZWN0aW9uUGFyYW0pKTsKKyAgICAgICAgICAgICAgICBwQWNsRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgQUNMIGV2ZW50IG92ZXJmbG93XG4iKSk7CisgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKkRlZmVyIGEgQUNMIGNvbXBsZXRpb24gZXZlbnQKKyAgSWYgdGhlcmUgaXMgY2FjaGVkIGV2ZW50IG9uIHRoaXMgQkQgYWRkcmVzcywgY2hlY2sgY29tcGxldGlvbiBzdGF0dXMuCisgIElmIHN0YXR1cyBpcyBmYWlsIGFuZCBsYXN0IGNhY2hlZCBldmVudCBpcyBjcmVhdGlvbiwgcmVtb3ZlIHRoZSBjcmVhdGlvbiBldmVudCBhbmQgZHJvcAorICB0aGlzIGNvbXBsZXRpb24gZXZlbnQuIE90aGVyd2lzZSwgY2FjaGUgdGhpcyBjb21wbGV0aW9uIGV2ZW50IGFzIHRoZSBsYXRlc3Qgb25lLgorKi8KK3N0YXRpYyBWT1NfU1RBVFVTIGJ0Y0RlZmVyQWNsQ29tcGxldGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU21lQnRFdmVudCBwRXZlbnQgKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwU21lQnRBY2xFdmVudEhpc3QgcEFjbEV2ZW50SGlzdDsKKyAgICBkbworICAgIHsKKyAgICAgICAgLy9GaW5kIGEgbWF0Y2gKKyAgICAgICAgcEFjbEV2ZW50SGlzdCA9IGJ0Y0ZpbmRBY2xFdmVudEhpc3QoIHBNYWMsIHBFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xDb25uZWN0aW9uLmJkQWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9JTlZBTElEX0NPTk5fSEFORExFICk7CisgICAgICAgIGlmKHBBY2xFdmVudEhpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19BU1NFUlQocEFjbEV2ZW50SGlzdC0+Yk5leHRFdmVudElkeCA+MCk7CisgICAgICAgICAgICAvL0ZvdW5kIG9uZQorICAgICAgICAgICAgaWYoQlRfQ09OTl9TVEFUVVNfU1VDQ0VTUyAhPSBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsQ29ubmVjdGlvbi5zdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9JZiBjb21wbGV0aW9uIGZhaWxzLCBhbmQgdGhlIGxhc3Qgb25lIGlzIGNyZWF0aW9uLCByZW1vdmUgdGhlIGNyZWF0aW9uIGV2ZW50CisgICAgICAgICAgICAgICAgaWYoQlRfRVZFTlRfQ1JFQVRFX0FDTF9DT05ORUNUSU9OID09IHBBY2xFdmVudEhpc3QtPmJ0RXZlbnRUeXBlW3BBY2xFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHgtMV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8oJnBBY2xFdmVudEhpc3QtPmJ0QWNsQ29ubmVjdGlvbltwQWNsRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4LTFdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U21lQnRBY2xDb25uZWN0aW9uUGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgcEFjbEV2ZW50SGlzdC0+Yk5leHRFdmVudElkeC0tOworICAgICAgICAgICAgICAgICAgICAvL0RvbmUgd2l0aCB0aGlzIGV2ZW50CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBBQ0wgY29tcGxldGlvbiBmYWlsIGJ1dCBsYXN0IGV2ZW50KCVkKSBub3QgY3JlYXRpb25cbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcEFjbEV2ZW50SGlzdC0+YnRFdmVudFR5cGVbcEFjbEV2ZW50SGlzdC0+Yk5leHRFdmVudElkeC0xXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCBOVUxMID09IHBBY2xFdmVudEhpc3QgKQorICAgICAgICB7CisgICAgICAgICAgICBwQWNsRXZlbnRIaXN0ID0gYnRjRmluZEFjbEV2ZW50SGlzdCggcE1hYywgTlVMTCwgQlRfSU5WQUxJRF9DT05OX0hBTkRMRSApOworICAgICAgICB9CisgICAgICAgIGlmKHBBY2xFdmVudEhpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBBY2xFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHggPCBCVF9NQVhfTlVNX0VWRU5UX0FDTF9ERUZFUlJFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1NhdmUgdGhpcyBldmVudAorICAgICAgICAgICAgICAgIHBBY2xFdmVudEhpc3QtPmJ0RXZlbnRUeXBlW3BBY2xFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHhdID0gQlRfRVZFTlRfQUNMX0NPTk5FQ1RJT05fQ09NUExFVEU7CisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KCZwQWNsRXZlbnRIaXN0LT5idEFjbENvbm5lY3Rpb25bcEFjbEV2ZW50SGlzdC0+Yk5leHRFdmVudElkeF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbENvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNtZUJ0QWNsQ29ubmVjdGlvblBhcmFtKSk7CisgICAgICAgICAgICAgICAgcEFjbEV2ZW50SGlzdC0+Yk5leHRFdmVudElkeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIEFDTCBldmVudCBvdmVyZmxvd1xuIikpOworICAgICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgY2Fubm90IGZpbmQgbWF0Y2ggZm9yIGZhaWxlZCBCVF9FVkVOVF9BQ0xfQ09OTkVDVElPTl9DT01QTEVURSBvZiBiZEFkZHIgKCUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYKVxuIiksCisgICAgICAgICAgICAgICAgcEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbENvbm5lY3Rpb24uYmRBZGRyWzBdLAorICAgICAgICAgICAgICAgIHBFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xDb25uZWN0aW9uLmJkQWRkclsxXSwKKyAgICAgICAgICAgICAgICBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsQ29ubmVjdGlvbi5iZEFkZHJbMl0sCisgICAgICAgICAgICAgICAgcEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbENvbm5lY3Rpb24uYmRBZGRyWzNdLAorICAgICAgICAgICAgICAgIHBFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xDb25uZWN0aW9uLmJkQWRkcls0XSwKKyAgICAgICAgICAgICAgICBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsQ29ubmVjdGlvbi5iZEFkZHJbNV0pOworICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0VNUFRZOworICAgICAgICB9CisgICAgfXdoaWxlKDApOworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLypUbyBkZWZlciBhIFNZTkMgY3JlYXRpb24gZXZlbnQKKyAgICBJZiB0aGUgbGFzdCBjYWNoZWQgZXZlbnQgaXMgYW5vdGhlciBTWU5DIGNyZWF0ZSBldmVudCwgcmVwbGFjZSAKKyAgICB0aGF0IGV2ZW50IHdpdGggdGhlIG5ldyBldmVudC4KKyAgICBJZiB0aGVyZSBpcyBhIGNvbXBsZXRpb24gZXZlbnQgd2l0aCBzdWNjZXNzIHN0YXR1cyBjb2RlLCBjYWNoZSBhIG5ldyAKKyAgICBkaXNjb25uZWN0IGV2ZW50KGZha2UpIGZpcnN0LCB0aGVuIGNhY2hlIHRoaXMgU1lOQyBjcmVhdGlvbiBldmVudC4KKyAgICBPdGhlcndpc2UsIGNhY2hlIHRoaXMgY3JlYXRlIGV2ZW50LgorKi8KK3N0YXRpYyBWT1NfU1RBVFVTIGJ0Y0RlZmVyU3luY0NyZWF0ZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTbWVCdEV2ZW50IHBFdmVudCApCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdHBTbWVCdFN5bmNFdmVudEhpc3QgcFN5bmNFdmVudEhpc3Q7CisgICAgdFNtZUJ0U3luY0Nvbm5lY3Rpb25QYXJhbSAqcFN5bmNFdmVudDsKKyAgICBkbworICAgIHsKKyAgICAgICAgLy9GaW5kIGEgbWF0Y2gKKyAgICAgICAgcFN5bmNFdmVudEhpc3QgPSBidGNGaW5kU3luY0V2ZW50SGlzdCggcE1hYywgcEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmJkQWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9JTlZBTElEX0NPTk5fSEFORExFICk7CisgICAgICAgIGlmKCBOVUxMID09IHBTeW5jRXZlbnRIaXN0ICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9ObyBjYWNoZWQgQUNMIGV2ZW50IG9uIHRoaXMgYWRkcmVzcworICAgICAgICAgICAgLy9GaW5kIGEgZnJlZSBzbG90IGFuZCBzYXZlIGl0CisgICAgICAgICAgICBwU3luY0V2ZW50SGlzdCA9IGJ0Y0ZpbmRTeW5jRXZlbnRIaXN0KCBwTWFjLCBOVUxMLCBCVF9JTlZBTElEX0NPTk5fSEFORExFICk7CisgICAgICAgICAgICBpZiggTlVMTCAhPSBwU3luY0V2ZW50SGlzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KCZwU3luY0V2ZW50SGlzdC0+YnRTeW5jQ29ubmVjdGlvblswXSwgJnBFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U21lQnRTeW5jQ29ubmVjdGlvblBhcmFtKSk7CisgICAgICAgICAgICAgICAgcFN5bmNFdmVudEhpc3QtPmJ0RXZlbnRUeXBlWzBdID0gQlRfRVZFTlRfQ1JFQVRFX1NZTkNfQ09OTkVDVElPTjsKKyAgICAgICAgICAgICAgICBwU3luY0V2ZW50SGlzdC0+Yk5leHRFdmVudElkeCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbGVkIHRvIGZpbmQgU1lOQyBldmVudCBzbG90XG4iKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX1JFU09VUkNFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZG9uZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL1RoZXJlIGlzIGhpc3Rvcnkgb24gdGhpcyBCRCBhZGRyZXNzCisgICAgICAgICAgICBWT1NfQVNTRVJUKHBTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4ID4gMCk7CisgICAgICAgICAgICBwU3luY0V2ZW50ID0gJnBTeW5jRXZlbnRIaXN0LT5idFN5bmNDb25uZWN0aW9uW3BTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4IC0gMV07CisgICAgICAgICAgICBpZihCVF9FVkVOVF9DUkVBVEVfU1lOQ19DT05ORUNUSU9OID09IAorICAgICAgICAgICAgICAgIHBTeW5jRXZlbnRIaXN0LT5idEV2ZW50VHlwZVtwU3luY0V2ZW50SGlzdC0+Yk5leHRFdmVudElkeCAtIDFdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vVGhlIGxhc3QgY2FjaGVkIGV2ZW50IGlzIGNyZWF0aW9uLCByZXBsYWNlIGl0IHdpdGggdGhlIG5ldyBvbmUKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkocFN5bmNFdmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNtZUJ0U3luY0Nvbm5lY3Rpb25QYXJhbSkpOworICAgICAgICAgICAgICAgIC8vZG9uZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fQ09NUExFVEUgPT0gCisgICAgICAgICAgICAgICAgICAgICAgICBwU3luY0V2ZW50SGlzdC0+YnRFdmVudFR5cGVbcFN5bmNFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHggLSAxXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1RoZSBsYXN0IGNhY2hlZCBldmVudCBpcyBjb21wbGV0aW9uLCBjaGVjayB0aGUgc3RhdHVzLgorICAgICAgICAgICAgICAgIGlmKEJUX0NPTk5fU1RBVFVTX1NVQ0NFU1MgPT0gcFN5bmNFdmVudC0+c3RhdHVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdFNtZUJ0RXZlbnQgYnRFdmVudDsKKyAgICAgICAgICAgICAgICAgICAgLy9UaGUgbGFzdCBldmVudCB3ZSBoYXZlIGlzIHN1Y2Nlc3MgY29tcGxldGlvbiBldmVudC4gCisgICAgICAgICAgICAgICAgICAgIC8vU2hvdWxkIG5vdCBnZXQgYSBjcmVhdGlvbiBldmVudCBiZWZvcmUgY3JlYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBNaXNzaW5nIGRpc2Nvbm5lY3QgZXZlbnQgb24gaGFuZGxlICVkXG4iKSwgcFN5bmNFdmVudC0+Y29ubmVjdGlvbkhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIC8vRmFrZSBhIGRpc2Nvbm5lY3QgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgYnRFdmVudC5idEV2ZW50VHlwZSA9IEJUX0VWRU5UX0RJU0NPTk5FQ1RJT05fQ09NUExFVEU7CisgICAgICAgICAgICAgICAgICAgIGJ0RXZlbnQudUV2ZW50UGFyYW0uYnREaXNjb25uZWN0LmNvbm5lY3Rpb25IYW5kbGUgPSBwU3luY0V2ZW50LT5jb25uZWN0aW9uSGFuZGxlOworICAgICAgICAgICAgICAgICAgICBidGNEZWZlckRpc2Nvbm5FdmVudChwTWFjLCAmYnRFdmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9OZWVkIHRvIHNhdmUgdGhlIG5ldyBldmVudAorICAgICAgICAgICAgaWYocFN5bmNFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHggPCBCVF9NQVhfTlVNX0VWRU5UX1NDT19ERUZFUlJFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU3luY0V2ZW50SGlzdC0+YnRFdmVudFR5cGVbcFN5bmNFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHhdID0gQlRfRVZFTlRfQ1JFQVRFX1NZTkNfQ09OTkVDVElPTjsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBTeW5jRXZlbnRIaXN0LT5idFN5bmNDb25uZWN0aW9uW3BTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4XSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNtZUJ0U3luY0Nvbm5lY3Rpb25QYXJhbSkpOworICAgICAgICAgICAgICAgIHBTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgU1lOQyBldmVudCBvdmVyZmxvd1xuIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfXdoaWxlKDApOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qRGVmZXIgYSBTWU5DIGNvbXBsZXRpb24gZXZlbnQKKyAgSWYgdGhlcmUgaXMgY2FjaGVkIGV2ZW50IG9uIHRoaXMgQkQgYWRkcmVzcywgY2hlY2sgY29tcGxldGlvbiBzdGF0dXMuCisgIElmIHN0YXR1cyBpcyBmYWlsIGFuZCBsYXN0IGNhY2hlZCBldmVudCBpcyBjcmVhdGlvbiwgcmVtb3ZlIHRlIGNyZWF0aW9uIGV2ZW50IGFuZCBkcm9wCisgIHRoaXMgY29tcGxldGlvbiBldmVudC4gCisgIE90aGVyd2lzZSwgY2FjaGUgdGhpcyBjb21wbGV0aW9uIGV2ZW50IGFzIHRoZSBsYXRlc3Qgb25lLgorKi8KK3N0YXRpYyBWT1NfU1RBVFVTIGJ0Y0RlZmVyU3luY0NvbXBsZXRlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNtZUJ0RXZlbnQgcEV2ZW50ICkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cFNtZUJ0U3luY0V2ZW50SGlzdCBwU3luY0V2ZW50SGlzdDsKKyAgICBkbworICAgIHsKKyAgICAgICAgLy9GaW5kIGEgbWF0Y2gKKyAgICAgICAgcFN5bmNFdmVudEhpc3QgPSBidGNGaW5kU3luY0V2ZW50SGlzdCggcE1hYywgcEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmJkQWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9JTlZBTElEX0NPTk5fSEFORExFICk7CisgICAgICAgIGlmKHBTeW5jRXZlbnRIaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfQVNTRVJUKHBTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4ID4wKTsKKyAgICAgICAgICAgIC8vRm91bmQgb25lCisgICAgICAgICAgICBpZihCVF9DT05OX1NUQVRVU19TVUNDRVNTICE9IHBFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5zdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9JZiBjb21wbGV0aW9uIGZhaWxzLCBhbmQgdGhlIGxhc3Qgb25lIGlzIGNyZWF0aW9uLCByZW1vdmUgdGhlIGNyZWF0aW9uIGV2ZW50CisgICAgICAgICAgICAgICAgaWYoQlRfRVZFTlRfQ1JFQVRFX1NZTkNfQ09OTkVDVElPTiA9PSBwU3luY0V2ZW50SGlzdC0+YnRFdmVudFR5cGVbcFN5bmNFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHgtMV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8oJnBTeW5jRXZlbnRIaXN0LT5idFN5bmNDb25uZWN0aW9uW3BTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4LTFdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U21lQnRTeW5jQ29ubmVjdGlvblBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgIHBTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4LS07CisgICAgICAgICAgICAgICAgICAgIC8vRG9uZSB3aXRoIHRoaXMgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIFNZTkMgY29tcGxldGlvbiBmYWlsIGJ1dCBsYXN0IGV2ZW50KCVkKSBub3QgY3JlYXRpb25cbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcFN5bmNFdmVudEhpc3QtPmJ0RXZlbnRUeXBlW3BTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4LTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoTlVMTCA9PSBwU3luY0V2ZW50SGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9JbiBjYXNlIHdlIGRvbid0IGRlZmVyIHRoZSBjcmVhdGlvbiBldmVudAorICAgICAgICAgICAgcFN5bmNFdmVudEhpc3QgPSBidGNGaW5kU3luY0V2ZW50SGlzdCggcE1hYywgTlVMTCwgQlRfSU5WQUxJRF9DT05OX0hBTkRMRSApOworICAgICAgICB9CisgICAgICAgIGlmKHBTeW5jRXZlbnRIaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihwU3luY0V2ZW50SGlzdC0+Yk5leHRFdmVudElkeCA8IEJUX01BWF9OVU1fRVZFTlRfQUNMX0RFRkVSUkVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vU2F2ZSB0aGlzIGV2ZW50CisgICAgICAgICAgICAgICAgcFN5bmNFdmVudEhpc3QtPmJ0RXZlbnRUeXBlW3BTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4XSA9IEJUX0VWRU5UX1NZTkNfQ09OTkVDVElPTl9DT01QTEVURTsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBTeW5jRXZlbnRIaXN0LT5idFN5bmNDb25uZWN0aW9uW3BTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4XSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNtZUJ0U3luY0Nvbm5lY3Rpb25QYXJhbSkpOworICAgICAgICAgICAgICAgIHBTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgU1lOQyBldmVudCBvdmVyZmxvd1xuIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGNhbm5vdCBmaW5kIG1hdGNoIGZvciBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fQ09NUExFVEUgb2YgYmRBZGRyICglMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWClcbiIpLAorICAgICAgICAgICAgICAgIHBFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5iZEFkZHJbMF0sCisgICAgICAgICAgICAgICAgcEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmJkQWRkclsxXSwKKyAgICAgICAgICAgICAgICBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uYmRBZGRyWzJdLAorICAgICAgICAgICAgICAgIHBFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5iZEFkZHJbM10sCisgICAgICAgICAgICAgICAgcEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmJkQWRkcls0XSwKKyAgICAgICAgICAgICAgICBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uYmRBZGRyWzVdKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8vcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFMgaWYgdGhlIGV2ZW50IGhhbmRsZSBjYW5ub3QgYmUgZm91bmQKKy8vVk9TX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBldmVudCBpcyBwcm9jZXNzZWQKKy8vT3RoZXIgZXJyb3Igc3RhdHVzIG1lYW5pbmcgaXQgY2Fubm90IGNvbnRpbnVlIGR1ZSB0byBvdGhlciBlcnJvcnMKKy8qCisgIERlZmVyIGEgZGlzY29ubmVjdCBldmVudCBmb3IgQUNMCisgIENoZWNrIGlmIGFueSBoaXN0b3J5IG9uIHRoaXMgZXZlbnQgaGFuZGxlLgorICBJZiBib3RoIEFDTF9DUkVBVElPTiBhbmQgQUNMX0NPTVBMRVRJT04gaXMgY2FjaGVkLCByZW1vdmUgYm90aCB0aG9zZSBldmVudHMgYW5kIGRyb3AKKyAgdGhpcyBkaXNjb25uZWN0IGV2ZW50LgorICBPdGhlcndpc2Ugc2F2ZSBkaXNjb25uZWN0IGV2ZW50IGluIHRoaXMgQUNMJ3MgYmluLgorICBJZiBub3QgQUNMIG1hdGNoIG9uIHRoaXMgaGFuZGxlLCBub3QgdG8gZG8gYW55dGhpbmcuCisgIEVpdGhlciB3YXksIHJlbW92ZSBhbnkgY2FjaGVkIE1PREVfQ0hBTkdFIGV2ZW50IG1hdGNoZXMgdGhpcyBkaXNjb25uZWN0IGV2ZW50J3MgaGFuZGxlLgorKi8KK3N0YXRpYyBWT1NfU1RBVFVTIGJ0Y0RlZmVyRGlzY29ubmVjdEV2ZW50Rm9yQUNMKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNtZUJ0RXZlbnQgcEV2ZW50ICkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cFNtZUJ0QWNsRXZlbnRIaXN0IHBBY2xFdmVudEhpc3Q7CisgICAgdHBTbWVCdEFjbE1vZGVDaGFuZ2VFdmVudEhpc3QgcE1vZGVDaGFuZ2VFdmVudEhpc3Q7CisgICAgdl9CT09MX3QgZkRvbmUgPSBWT1NfRkFMU0U7CisgICAgaW50IGk7CisgICAgcEFjbEV2ZW50SGlzdCA9IGJ0Y0ZpbmRBY2xFdmVudEhpc3QoIHBNYWMsIE5VTEwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0RGlzY29ubmVjdC5jb25uZWN0aW9uSGFuZGxlICk7CisgICAgaWYocEFjbEV2ZW50SGlzdCkKKyAgICB7CisgICAgICAgIGlmKCBwQWNsRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4ID4gQlRfTUFYX05VTV9FVkVOVF9BQ0xfREVGRVJSRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIEFDTCBldmVudCBoaXN0b3J5IGluZGV4OiVkIG92ZXJmbG93LCByZXNldHRpbmcgdG8gQlRfTUFYX05VTV9FVkVOVF9BQ0xfREVGRVJSRURcbiIpLCBwQWNsRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4KTsKKyAgICAgICAgICAgIHBBY2xFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHggPSBCVF9NQVhfTlVNX0VWRU5UX0FDTF9ERUZFUlJFRDsKKyAgICAgICAgfQorICAgICAgICAvL0xvb2tpbmcgYmFja3dvcmRzCisgICAgICAgIGZvcihpID0gcEFjbEV2ZW50SGlzdC0+Yk5leHRFdmVudElkeCAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggQlRfRVZFTlRfQUNMX0NPTk5FQ1RJT05fQ09NUExFVEUgPT0gcEFjbEV2ZW50SGlzdC0+YnRFdmVudFR5cGVbaV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIHdlIGNhbiBjYW5jZWwgdGhlIGxpbmsKKyAgICAgICAgICAgICAgICBpZiggKGkgPiAwKSAmJiAoQlRfRVZFTlRfQ1JFQVRFX0FDTF9DT05ORUNUSU9OID09IHBBY2xFdmVudEhpc3QtPmJ0RXZlbnRUeXBlW2kgLSAxXSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZkRvbmUgPSBWT1NfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0FsbCBldmVudHMgY2FuIGJlIHdpcGVkIG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgYnRjUmVsZWFzZUFjbEV2ZW50SGlzdChwTWFjLCBwQWNsRXZlbnRIaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSBib3RoIEFDTCBjcmVhdGlvbiBhbmQgY29tcGxldGlvbiwgd2lwZSBvdXQgYWxsIG9mIHRoZW0KKyAgICAgICAgICAgICAgICAgICAgcEFjbEV2ZW50SGlzdC0+Yk5leHRFdmVudElkeCA9ICh0QU5JX1U4KShpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHZvc19tZW1femVybygmcEFjbEV2ZW50SGlzdC0+YnRBY2xDb25uZWN0aW9uW2ktMV0sIHNpemVvZih0U21lQnRBY2xDb25uZWN0aW9uUGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZwQWNsRXZlbnRIaXN0LT5idEFjbENvbm5lY3Rpb25baV0sIHNpemVvZih0U21lQnRBY2xDb25uZWN0aW9uUGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9Ly9mb3IgbG9vcAorICAgICAgICBpZighZkRvbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2F2ZSB0aGlzIGRpc2Nvbm5lY3QgZXZlbnQKKyAgICAgICAgICAgIGlmKHBBY2xFdmVudEhpc3QtPmJOZXh0RXZlbnRJZHggPCBCVF9NQVhfTlVNX0VWRU5UX0FDTF9ERUZFUlJFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWNsRXZlbnRIaXN0LT5idEV2ZW50VHlwZVtwQWNsRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4XSA9IAorICAgICAgICAgICAgICAgICAgICBCVF9FVkVOVF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFOworICAgICAgICAgICAgICAgIHBBY2xFdmVudEhpc3QtPmJ0QWNsQ29ubmVjdGlvbltwQWNsRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4XS5jb25uZWN0aW9uSGFuZGxlID0KKyAgICAgICAgICAgICAgICAgICAgcEV2ZW50LT51RXZlbnRQYXJhbS5idERpc2Nvbm5lY3QuY29ubmVjdGlvbkhhbmRsZTsKKyAgICAgICAgICAgICAgICBwQWNsRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgQUNMIGV2ZW50IG92ZXJmbG93XG4iKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0VYSVNUUzsKKyAgICB9CisgICAgLy9XaXBlIG91dCB0aGUgcmVsYXRlZCBtb2RlIGNoYW5nZSBldmVudCBpZiBpdCBpcyB0aGVyZQorICAgIHBNb2RlQ2hhbmdlRXZlbnRIaXN0ID0gYnRjRmluZE1vZGVDaGFuZ2VFdmVudEhpc3QoIHBNYWMsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0RGlzY29ubmVjdC5jb25uZWN0aW9uSGFuZGxlICk7CisgICAgaWYoIHBNb2RlQ2hhbmdlRXZlbnRIaXN0ICYmIHBNb2RlQ2hhbmdlRXZlbnRIaXN0LT5mVmFsaWQgKQorICAgIHsKKyAgICAgICAgcE1vZGVDaGFuZ2VFdmVudEhpc3QtPmZWYWxpZCA9IFZPU19GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy9UaGlzIGZ1bmN0aW9uIHdvcmtzIHRoZSBzYW1lIGFzIGJ0Y0RlZmVyRGlzY29ubmVjdEV2ZW50Rm9yQUNMIGV4Y2VwdCBpdCBoYW5sZGVzIFNZTkMgZXZlbnRzCisvL3JldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTIGlmIHRoZSBldmVudCBoYW5kbGUgY2Fubm90IGJlIGZvdW5kCisvL1ZPU19TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgZXZlbnQgaXMgcHJvY2Vzc2VkCisvL090aGVyIGVycm9yIHN0YXR1cyBtZWFuaW5nIGl0IGNhbm5vdCBjb250aW51ZSBkdWUgdG8gb3RoZXIgZXJyb3JzCisvKgorICBEZWZlciBhIGRpc2Nvbm5lY3QgZXZlbnQgZm9yIFNZTkMKKyAgQ2hlY2sgaWYgYW55IFNZTkMgaGlzdG9yeSBvbiB0aGlzIGV2ZW50IGhhbmRsZS4KKyAgSWYgeWVzIGFuZCBpZiBib3RoIFNZTkNfQ1JFQVRJT04gYW5kIFNZTkNfQ09NUExFVElPTiBpcyBjYWNoZWQsIHJlbW92ZSBib3RoIHRob3NlIGV2ZW50cyBhbmQgZHJvcAorICB0aGlzIGRpc2Nvbm5lY3QgZXZlbnQuCisgIE90aGVyd2lzZSBzYXZlIGRpc2Nvbm5lY3QgZXZlbnQgaW4gdGhpcyBTWU5DJ3MgYmluLgorICBJZiBubyBtYXRjaCBmb3VuZCwgbm90IHRvIHNhdmUgdGhpcyBldmVudCBoZXJlLgorICBFaXRoZXIgd2F5LCByZW1vdmUgYW55IGNhY2hlZCBTWU5DX1VQREFURSBldmVudCBtYXRjaGVzIHRoaXMgZGlzY29ubmVjdCBldmVudCdzIGhhbmRsZS4KKyovCitzdGF0aWMgVk9TX1NUQVRVUyBidGNEZWZlckRpc2Nvbm5lY3RFdmVudEZvclN5bmMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU21lQnRFdmVudCBwRXZlbnQgKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwU21lQnRTeW5jRXZlbnRIaXN0IHBTeW5jRXZlbnRIaXN0OworICAgIHRwU21lQnRTeW5jVXBkYXRlSGlzdCBwU3luY1VwZGF0ZUhpc3Q7CisgICAgdl9CT09MX3QgZkRvbmUgPSBWT1NfRkFMU0U7CisgICAgaW50IGk7CisgICAgcFN5bmNFdmVudEhpc3QgPSBidGNGaW5kU3luY0V2ZW50SGlzdCggcE1hYywgTlVMTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudC0+dUV2ZW50UGFyYW0uYnREaXNjb25uZWN0LmNvbm5lY3Rpb25IYW5kbGUgKTsKKyAgICBpZihwU3luY0V2ZW50SGlzdCkKKyAgICB7CisgICAgICAgIGlmKCBwU3luY0V2ZW50SGlzdC0+Yk5leHRFdmVudElkeCA+IEJUX01BWF9OVU1fRVZFTlRfU0NPX0RFRkVSUkVEKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBTWU5DIGV2ZW50IGhpc3RvcnkgaW5kZXg6JWQgb3ZlcmZsb3csIHJlc2V0dGluZyB0byBCVF9NQVhfTlVNX0VWRU5UX1NDT19ERUZFUlJFRFxuIiksIHBTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4KTsKKyAgICAgICAgICAgIHBTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4ID0gQlRfTUFYX05VTV9FVkVOVF9TQ09fREVGRVJSRUQ7CisgICAgICAgIH0KKyAgICAgICAgLy9Mb29raW5nIGJhY2t3b3JkcworICAgICAgICBmb3IoaSA9IHBTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4IC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYgYSBtb2RlIGNoYW5nZSBldmVudCBleGlzdHMsIGRyb3AgaXQKKyAgICAgICAgICAgIGlmKCBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fQ09NUExFVEUgPT0gcFN5bmNFdmVudEhpc3QtPmJ0RXZlbnRUeXBlW2ldICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL21ha2Ugc3VyZSB3ZSBjYW4gY2FuY2VsIHRoZSBsaW5rCisgICAgICAgICAgICAgICAgaWYoIChpID4gMCkgJiYgKEJUX0VWRU5UX0NSRUFURV9TWU5DX0NPTk5FQ1RJT04gPT0gcFN5bmNFdmVudEhpc3QtPmJ0RXZlbnRUeXBlW2kgLSAxXSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZkRvbmUgPSBWT1NfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0FsbCBldmVudHMgY2FuIGJlIHdpcGVkIG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgYnRjUmVsZWFzZVN5bmNFdmVudEhpc3QocE1hYywgcFN5bmNFdmVudEhpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy93ZSBoYXZlIGJvdGggQUNMIGNyZWF0aW9uIGFuZCBjb21wbGV0aW9uLCB3aXBlIG91dCBhbGwgb2YgdGhlbQorICAgICAgICAgICAgICAgICAgICBwU3luY0V2ZW50SGlzdC0+Yk5leHRFdmVudElkeCA9ICh0QU5JX1U4KShpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHZvc19tZW1femVybygmcFN5bmNFdmVudEhpc3QtPmJ0U3luY0Nvbm5lY3Rpb25baS0xXSwgc2l6ZW9mKHRTbWVCdFN5bmNDb25uZWN0aW9uUGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZwU3luY0V2ZW50SGlzdC0+YnRTeW5jQ29ubmVjdGlvbltpXSwgc2l6ZW9mKHRTbWVCdFN5bmNDb25uZWN0aW9uUGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9Ly9mb3IgbG9vcAorICAgICAgICBpZighZkRvbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2F2ZSB0aGlzIGRpc2Nvbm5lY3QgZXZlbnQKKyAgICAgICAgICAgIGlmKHBTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4IDwgQlRfTUFYX05VTV9FVkVOVF9TQ09fREVGRVJSRUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFN5bmNFdmVudEhpc3QtPmJ0RXZlbnRUeXBlW3BTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4XSA9IAorICAgICAgICAgICAgICAgICAgICBCVF9FVkVOVF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFOworICAgICAgICAgICAgICAgIHBTeW5jRXZlbnRIaXN0LT5idFN5bmNDb25uZWN0aW9uW3BTeW5jRXZlbnRIaXN0LT5iTmV4dEV2ZW50SWR4XS5jb25uZWN0aW9uSGFuZGxlID0KKyAgICAgICAgICAgICAgICAgICAgcEV2ZW50LT51RXZlbnRQYXJhbS5idERpc2Nvbm5lY3QuY29ubmVjdGlvbkhhbmRsZTsKKyAgICAgICAgICAgICAgICBwU3luY0V2ZW50SGlzdC0+Yk5leHRFdmVudElkeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIFNZTkMgZXZlbnQgb3ZlcmZsb3dcbiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRVhJU1RTOworICAgIH0KKyAgICAvL1dpcGUgb3V0IHRoZSByZWxhdGVkIG1vZGUgY2hhbmdlIGV2ZW50IGlmIGl0IGlzIHRoZXJlCisgICAgcFN5bmNVcGRhdGVIaXN0ID0gYnRjRmluZFN5bmNVcGRhdGVFdmVudEhpc3QoIHBNYWMsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0RGlzY29ubmVjdC5jb25uZWN0aW9uSGFuZGxlICk7CisgICAgaWYoIHBTeW5jVXBkYXRlSGlzdCAmJiBwU3luY1VwZGF0ZUhpc3QtPmZWYWxpZCApCisgICAgeworICAgICAgICBwU3luY1VwZGF0ZUhpc3QtPmZWYWxpZCA9IFZPU19GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgRGVmZXIgYSBkaXNjb25uZWN0IGV2ZW50LgorICBUcnkgdG8gZGVmZXIgaXQgYXMgcGFydCBvZiB0aGUgQUNMIGV2ZW50IGZpcnN0LiAKKyAgSWYgbm8gbWF0Y2ggaXMgZm91bmQsIHRyeSBTWU5DLiAKKyAgSWYgc3RpbGwgbm8gbWF0Y2ggZm91bmQsIGRlZmVyIGl0IGF0IERJU0NPTk5FQ1QgZXZlbnQgYmluLgorKi8KK3N0YXRpYyBWT1NfU1RBVFVTIGJ0Y0RlZmVyRGlzY29ubkV2ZW50KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNtZUJ0RXZlbnQgcEV2ZW50ICkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cFNtZUJ0RGlzY29ubmVjdEV2ZW50SGlzdCBwRGlzY29ubkV2ZW50SGlzdDsKKyAgICBpZiggQlRfSU5WQUxJRF9DT05OX0hBTkRMRSA9PSBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0RGlzY29ubmVjdC5jb25uZWN0aW9uSGFuZGxlICkKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBpbnZhbGlkIGhhbmRsZVxuIikgKTsKKyAgICAgICAgcmV0dXJuIChWT1NfU1RBVFVTX0VfSU5WQUwpOworICAgIH0KKyAgICAvL0NoZWNrIEFDTCBmaXJzdAorICAgIHN0YXR1cyA9IGJ0Y0RlZmVyRGlzY29ubmVjdEV2ZW50Rm9yQUNMKHBNYWMsIHBFdmVudCk7CisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gYnRjRGVmZXJEaXNjb25uZWN0RXZlbnRGb3JTeW5jKHBNYWMsIHBFdmVudCk7CisgICAgfQorICAgIGlmKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKQorICAgIHsKKyAgICAgICAgLy9TYXZlIHRoZSBkaXNjb25uZWN0IGV2ZW50CisgICAgICAgIHBEaXNjb25uRXZlbnRIaXN0ID0gYnRjRmluZERpc2Nvbm5FdmVudEhpc3QoIHBNYWMsIAorICAgICAgICAgICAgcEV2ZW50LT51RXZlbnRQYXJhbS5idERpc2Nvbm5lY3QuY29ubmVjdGlvbkhhbmRsZSApOworICAgICAgICBpZiggcERpc2Nvbm5FdmVudEhpc3QgKQorICAgICAgICB7CisgICAgICAgICAgICBwRGlzY29ubkV2ZW50SGlzdC0+ZlZhbGlkID0gVk9TX1RSVUU7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoICZwRGlzY29ubkV2ZW50SGlzdC0+YnREaXNjb25uZWN0LCAmcEV2ZW50LT51RXZlbnRQYXJhbS5idERpc2Nvbm5lY3QsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHRTbWVCdERpc2Nvbm5lY3RQYXJhbSkgKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBjYW5ub3QgZmluZCBtYXRjaCBmb3IgQlRfRVZFTlRfRElTQ09OTkVDVElPTl9DT01QTEVURSBvZiBoYW5kbGUgKCVkKVxuIiksCisgICAgICAgICAgICAgICAgcEV2ZW50LT51RXZlbnRQYXJhbS5idERpc2Nvbm5lY3QuY29ubmVjdGlvbkhhbmRsZSk7CisgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRU1QVFk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICAgIGJ0Y0RlZmVyRXZlbnQgc2F2ZSB0aGUgZXZlbnQgZm9yIHBvc3NpYmxlIHJlcGxheSB3aGVuIGNoaXAgY2FuIGJlIGFjY2Vzc2VkCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSB3aGVuIGluIElNUFMvU3RhbmRieSBzdGF0ZQorKi8KK3N0YXRpYyBWT1NfU1RBVFVTIGJ0Y0RlZmVyRXZlbnQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU21lQnRFdmVudCBwRXZlbnQgKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwU21lQnRTeW5jVXBkYXRlSGlzdCBwU3luY1VwZGF0ZUhpc3Q7CisgICAgdHBTbWVCdEFjbE1vZGVDaGFuZ2VFdmVudEhpc3QgcE1vZGVDaGFuZ2VFdmVudEhpc3Q7CisgICAgdFNtZUJ0Y0V2ZW50UmVwbGF5ICpwUmVwbGF5ID0gJnBNYWMtPmJ0Yy5idGNFdmVudFJlcGxheTsKKyAgICBzd2l0Y2gocEV2ZW50LT5idEV2ZW50VHlwZSkKKyAgICB7CisgICAgY2FzZSBCVF9FVkVOVF9ERVZJQ0VfU1dJVENIRURfT046CisgICAgICAgIC8vQ2xlYXIgYWxsIGV2ZW50cyBmaXJzdAorICAgICAgICB2b3NfbWVtX3plcm8oICZwUmVwbGF5LT5idGNFdmVudEhpc3QsIHNpemVvZih0U21lQnRjRXZlbnRIaXN0KSApOworICAgICAgICBwUmVwbGF5LT5mQlRTd2l0Y2hPbiA9IFZPU19UUlVFOworICAgICAgICBwUmVwbGF5LT5mQlRTd2l0Y2hPZmYgPSBWT1NfRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfRVZFTlRfREVWSUNFX1NXSVRDSEVEX09GRjoKKyAgICAgICAgLy9DbGVhciBhbGwgZXZlbnRzIGZpcnN0CisgICAgICAgIHZvc19tZW1femVybyggJnBSZXBsYXktPmJ0Y0V2ZW50SGlzdCwgc2l6ZW9mKHRTbWVCdGNFdmVudEhpc3QpICk7CisgICAgICAgIHBSZXBsYXktPmZCVFN3aXRjaE9mZiA9IFZPU19UUlVFOworICAgICAgICBwUmVwbGF5LT5mQlRTd2l0Y2hPbiA9IFZPU19GQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9FVkVOVF9JTlFVSVJZX1NUQVJURUQ6CisgICAgICAgIHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5uSW5xdWlyeUV2ZW50Kys7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfRVZFTlRfSU5RVUlSWV9TVE9QUEVEOgorICAgICAgICBwUmVwbGF5LT5idGNFdmVudEhpc3QubklucXVpcnlFdmVudC0tOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJUX0VWRU5UX1BBR0VfU1RBUlRFRDoKKyAgICAgICAgcFJlcGxheS0+YnRjRXZlbnRIaXN0Lm5QYWdlRXZlbnQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9FVkVOVF9QQUdFX1NUT1BQRUQ6CisgICAgICAgIHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5uUGFnZUV2ZW50LS07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfRVZFTlRfQ1JFQVRFX0FDTF9DT05ORUNUSU9OOgorICAgICAgICBzdGF0dXMgPSBidGNEZWZlckFjbENyZWF0ZShwTWFjLCBwRXZlbnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJUX0VWRU5UX0FDTF9DT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICBzdGF0dXMgPSBidGNEZWZlckFjbENvbXBsZXRlKCBwTWFjLCBwRXZlbnQgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9FVkVOVF9DUkVBVEVfU1lOQ19DT05ORUNUSU9OOgorICAgICAgICBzdGF0dXMgPSBidGNEZWZlclN5bmNDcmVhdGUocE1hYywgcEV2ZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICAgIHN0YXR1cyA9IGJ0Y0RlZmVyU3luY0NvbXBsZXRlKCBwTWFjLCBwRXZlbnQgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fVVBEQVRFRDoKKyAgICAgICAgaWYoIEJUX0lOVkFMSURfQ09OTl9IQU5ETEUgPT0gcEV2ZW50LT51RXZlbnRQYXJhbS5idERpc2Nvbm5lY3QuY29ubmVjdGlvbkhhbmRsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBpbnZhbGlkIGhhbmRsZVxuIikgKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vRmluZCBhIG1hdGNoIG9uIGhhbmRsZS4gSWYgbm90IGZvdW5kLCBnZXQgYSBmcmVlIHNsb3QuCisgICAgICAgIHBTeW5jVXBkYXRlSGlzdCA9IGJ0Y0ZpbmRTeW5jVXBkYXRlRXZlbnRIaXN0KCBwTWFjLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uY29ubmVjdGlvbkhhbmRsZSApOworICAgICAgICBpZihwU3luY1VwZGF0ZUhpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTeW5jVXBkYXRlSGlzdC0+ZlZhbGlkID0gVk9TX1RSVUU7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoJnBTeW5jVXBkYXRlSGlzdC0+YnRTeW5jQ29ubmVjdGlvbiwgJnBFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTbWVCdFN5bmNDb25uZWN0aW9uUGFyYW0pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBjYW5ub3QgZmluZCBtYXRjaCBmb3IgQlRfRVZFTlRfU1lOQ19DT05ORUNUSU9OX1VQREFURUQgb2YgaGFuZGxlICglZClcbiIpLAorICAgICAgICAgICAgICAgIHBFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5jb25uZWN0aW9uSGFuZGxlICk7CisgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRU1QVFk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9FVkVOVF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICBzdGF0dXMgPSBidGNEZWZlckRpc2Nvbm5FdmVudCggcE1hYywgcEV2ZW50ICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfRVZFTlRfTU9ERV9DSEFOR0VEOgorICAgICAgICBpZiggQlRfSU5WQUxJRF9DT05OX0hBTkRMRSA9PSBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0RGlzY29ubmVjdC5jb25uZWN0aW9uSGFuZGxlICkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGludmFsaWQgaGFuZGxlXG4iKSApOworICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy9GaW5kIGEgbWF0Y2ggb24gaGFuZGxlLCBJZiBub3QgZm91bmQsIHJldHVybiBhIGZyZWUgc2xvdAorICAgICAgICBwTW9kZUNoYW5nZUV2ZW50SGlzdCA9IGJ0Y0ZpbmRNb2RlQ2hhbmdlRXZlbnRIaXN0KCBwTWFjLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsTW9kZUNoYW5nZS5jb25uZWN0aW9uSGFuZGxlICk7CisgICAgICAgIGlmKHBNb2RlQ2hhbmdlRXZlbnRIaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBwTW9kZUNoYW5nZUV2ZW50SGlzdC0+ZlZhbGlkID0gVk9TX1RSVUU7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkoICZwTW9kZUNoYW5nZUV2ZW50SGlzdC0+YnRBY2xNb2RlQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsTW9kZUNoYW5nZSwgc2l6ZW9mKHRTbWVCdEFjbE1vZGVDaGFuZ2VQYXJhbSkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBjYW5ub3QgZmluZCBtYXRjaCBmb3IgQlRfRVZFTlRfTU9ERV9DSEFOR0VEIG9mIGhhbmRsZSAoJWQpXG4iKSwKKyAgICAgICAgICAgICAgICBwRXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsTW9kZUNoYW5nZS5jb25uZWN0aW9uSGFuZGxlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJUX0VWRU5UX0EyRFBfU1RSRUFNX1NUQVJUOgorICAgICAgICBwUmVwbGF5LT5idGNFdmVudEhpc3QuZkEyRFBTdGFydGVkID0gVk9TX1RSVUU7CisgICAgICAgIHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5mQTJEUFN0b3BwZWQgPSBWT1NfRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfRVZFTlRfQTJEUF9TVFJFQU1fU1RPUDoKKyAgICAgICAgcFJlcGxheS0+YnRjRXZlbnRIaXN0LmZBMkRQU3RvcHBlZCA9IFZPU19UUlVFOworICAgICAgICBwUmVwbGF5LT5idGNFdmVudEhpc3QuZkEyRFBTdGFydGVkID0gVk9TX0ZBTFNFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZXZlbnQgKCVkKSBpcyBub3QgZGVmZXJyZWRcbiIpLCBwRXZlbnQtPmJ0RXZlbnRUeXBlICk7CisgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9OT1NVUFBPUlQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgICAgUmVwbGF5IGFsbCBjYWNoZWQgZXZlbnRzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIKKyAgICAxLiBJZiBCVF9TV0lUQ0hfT0ZGIGV2ZW50LCBzZW5kIGl0LgorICAgIDIuIFNlbmQgSU5RVUlSWSBldmVudCAoU1RBUlQgb3IgU1RPUCksaWYgYXZhaWxhYmxlCisgICAgMy4gU2VuZCBQQUdFIGV2ZW50IChTVEFSVCBvciBTVE9QKSwgaWYgYXZhaWxhYmxlCisgICAgNC4gU2VuZCBESVNDT05ORUNUIGV2ZW50cywgdGhlc2UgRElTQ09OTkVDVCBldmVudHMgYXJlIG5vdCB0aWVkIHRvIAorICAgICAgICBhbnkgQUNML1NZTkMgZXZlbnQgdGhhdCB3ZSBoYXZlIGNhY2hlZAorICAgIDUuIFNlbmQgQUNMIGV2ZW50cyAocG9zc2libGUgZXZlbnRzLCBDUkVBVElPTiwgQ09NUExFVElPTiwgRElTQ09OTkVDVCkKKyAgICA2LiBTZW5kIE1PREVfQ0hBTkdFIGV2ZW50cywgaWYgYXZhaWxhYmxlCisgICAgNy4gU2VuZCBBMkRQIGV2ZW50KFNUQVJUIG9yIFNUT1ApLCBpZiBhdmFpbGFibGUKKyAgICA4LiBTZW5kIFNZTkMgZXZlbnRzIChwb3NzaWJsZSBldmVudHMsIENSRUFUSU9OLCBDT01QTEVUSU9OLCBESVNDT05ORUNUKQorICAgIDkuIFNlbmQgU1lOQ19VUERBVEUgZXZlbnRzLCBpZiBhdmFpbGFibGUKKyovCitzdGF0aWMgdm9pZCBidGNSZXBsYXlFdmVudHMoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIGludCBpLCBqOworICAgIHRTbWVCdEV2ZW50IGJ0RXZlbnQ7CisgICAgdHBTbWVCdEFjbEV2ZW50SGlzdCBwQWNsSGlzdDsKKyAgICB0cFNtZUJ0U3luY0V2ZW50SGlzdCBwU3luY0hpc3Q7CisgICAgdFNtZUJ0Y0V2ZW50UmVwbGF5ICpwUmVwbGF5ID0gJnBNYWMtPmJ0Yy5idGNFdmVudFJlcGxheTsKKyAgICAvL0Fsd2F5cyB0dXJuIG9uIEhCIG1vbml0b3IgZmlyc3QuIAorICAgIC8vSXQgaXMgaW5kZXBlbmRlbnQgb2YgQlQgZXZlbnRzIGV2ZW4gdGhvdWdoIEJUIGV2ZW50IGNhdXNlcyB0aGlzCisgICAgaWYoIHBSZXBsYXktPmZSZXN0b3JlSEJNb25pdG9yICkKKyAgICB7CisgICAgICAgIHBSZXBsYXktPmZSZXN0b3JlSEJNb25pdG9yID0gVk9TX0ZBTFNFOworICAgICAgICAvL09ubHkgZG8gaXQgd2hlbiBuZWVkZWQKKyAgICAgICAgaWYoICFwTWFjLT5idGMuYnRjSEJBY3RpdmUgKSAKKyAgICAgICAgeworICAgICAgICAgICAgY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQsIHBNYWMtPmJ0Yy5idGNIQkNvdW50LCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgcE1hYy0+YnRjLmJ0Y0hCQWN0aXZlID0gVk9TX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoIHBNYWMtPmJ0Yy5mUmVwbGF5QlRFdmVudHMgKQorICAgIHsKKyAgICAgICAgLypTZXQgdGhlIGZsYWcgdG8gZmFsc2UgaGVyZSBzbyBidGNTaWduYWxCVEV2ZW50IHdvbid0IGRlZmVyIGFueSBmdXJ0aGVyLgorICAgICAgICAgIFRoaXMgd29ya3MgYmVjYXVzZSBTTUUgaGFzIGl0IGdsb2JhbCBsb2NrKi8KKyAgICAgICAgcE1hYy0+YnRjLmZSZXBsYXlCVEV2ZW50cyA9IFZPU19GQUxTRTsKKyAgICAgICAgaWYoIHBSZXBsYXktPmZCVFN3aXRjaE9mZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19tZW1femVybyggJmJ0RXZlbnQsIHNpemVvZih0U21lQnRFdmVudCkgKTsKKyAgICAgICAgICAgIGJ0RXZlbnQuYnRFdmVudFR5cGUgPSBCVF9FVkVOVF9ERVZJQ0VfU1dJVENIRURfT0ZGOworICAgICAgICAgICAgYnRjU2VuZEJURXZlbnQoIHBNYWMsICZidEV2ZW50ICk7CisgICAgICAgICAgICBwUmVwbGF5LT5mQlRTd2l0Y2hPZmYgPSBWT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggcFJlcGxheS0+ZkJUU3dpdGNoT24gKQorICAgICAgICB7CisgICAgICAgICAgICB2b3NfbWVtX3plcm8oICZidEV2ZW50LCBzaXplb2YodFNtZUJ0RXZlbnQpICk7CisgICAgICAgICAgICBidEV2ZW50LmJ0RXZlbnRUeXBlID0gQlRfRVZFTlRfREVWSUNFX1NXSVRDSEVEX09OOworICAgICAgICAgICAgYnRjU2VuZEJURXZlbnQoIHBNYWMsICZidEV2ZW50ICk7CisgICAgICAgICAgICBwUmVwbGF5LT5mQlRTd2l0Y2hPbiA9IFZPU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAvL0RvIGlucXVpcmUgZmlyc3QKKyAgICAgICAgaWYoIHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5uSW5xdWlyeUV2ZW50ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19tZW1femVybyggJmJ0RXZlbnQsIHNpemVvZih0U21lQnRFdmVudCkgKTsKKyAgICAgICAgICAgIGJ0RXZlbnQuYnRFdmVudFR5cGUgPSBCVF9FVkVOVF9JTlFVSVJZX1NUQVJURUQ7CisgICAgICAgICAgICBpID0gcFJlcGxheS0+YnRjRXZlbnRIaXN0Lm5JbnF1aXJ5RXZlbnQ7CisgICAgICAgICAgICB3aGlsZShpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRjU2VuZEJURXZlbnQoIHBNYWMsICZidEV2ZW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggcFJlcGxheS0+YnRjRXZlbnRIaXN0Lm5JbnF1aXJ5RXZlbnQgPCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV96ZXJvKCAmYnRFdmVudCwgc2l6ZW9mKHRTbWVCdEV2ZW50KSApOworICAgICAgICAgICAgYnRFdmVudC5idEV2ZW50VHlwZSA9IEJUX0VWRU5UX0lOUVVJUllfU1RPUFBFRDsKKyAgICAgICAgICAgIGkgPSBwUmVwbGF5LT5idGNFdmVudEhpc3QubklucXVpcnlFdmVudDsKKyAgICAgICAgICAgIHdoaWxlKGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidGNTZW5kQlRFdmVudCggcE1hYywgJmJ0RXZlbnQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL1BhZ2UKKyAgICAgICAgaWYoIHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5uUGFnZUV2ZW50ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19tZW1femVybyggJmJ0RXZlbnQsIHNpemVvZih0U21lQnRFdmVudCkgKTsKKyAgICAgICAgICAgIGJ0RXZlbnQuYnRFdmVudFR5cGUgPSBCVF9FVkVOVF9QQUdFX1NUQVJURUQ7CisgICAgICAgICAgICBpID0gcFJlcGxheS0+YnRjRXZlbnRIaXN0Lm5QYWdlRXZlbnQ7CisgICAgICAgICAgICB3aGlsZShpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRjU2VuZEJURXZlbnQoIHBNYWMsICZidEV2ZW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggcFJlcGxheS0+YnRjRXZlbnRIaXN0Lm5QYWdlRXZlbnQgPCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV96ZXJvKCAmYnRFdmVudCwgc2l6ZW9mKHRTbWVCdEV2ZW50KSApOworICAgICAgICAgICAgYnRFdmVudC5idEV2ZW50VHlwZSA9IEJUX0VWRU5UX1BBR0VfU1RPUFBFRDsKKyAgICAgICAgICAgIGkgPSBwUmVwbGF5LT5idGNFdmVudEhpc3QublBhZ2VFdmVudDsKKyAgICAgICAgICAgIHdoaWxlKGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidGNTZW5kQlRFdmVudCggcE1hYywgJmJ0RXZlbnQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL1JlcGxheSBub24tY29tcGxldGlvbiBkaXNjb25uZWN0IGV2ZW50cyBmaXJzdAorICAgICAgICAvL0Rpc2Nvbm5lY3QKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IEJUX01BWF9ESVNDT05OX1NVUFBPUlQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwUmVwbGF5LT5idGNFdmVudEhpc3QuYnREaXNjb25uZWN0RXZlbnRbaV0uZlZhbGlkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8oICZidEV2ZW50LCBzaXplb2YodFNtZUJ0RXZlbnQpICk7CisgICAgICAgICAgICAgICAgYnRFdmVudC5idEV2ZW50VHlwZSA9IEJUX0VWRU5UX0RJU0NPTk5FQ1RJT05fQ09NUExFVEU7CisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KCAmYnRFdmVudC51RXZlbnRQYXJhbS5idERpc2Nvbm5lY3QsIAorICAgICAgICAgICAgICAgICAgICAmcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0RGlzY29ubmVjdEV2ZW50W2ldLmJ0RGlzY29ubmVjdCwgc2l6ZW9mKHRTbWVCdERpc2Nvbm5lY3RQYXJhbSkgKTsKKyAgICAgICAgICAgICAgICBidGNTZW5kQlRFdmVudCggcE1hYywgJmJ0RXZlbnQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL0FDTAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgQlRfTUFYX0FDTF9TVVBQT1JUOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0QWNsQ29ubmVjdGlvbkV2ZW50W2ldLmJOZXh0RXZlbnRJZHggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBY2xIaXN0ID0gJnBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idEFjbENvbm5lY3Rpb25FdmVudFtpXTsKKyAgICAgICAgICAgICAgICAvL1JlcGxheSBhbGwgQUNMIGV2ZW50cyBmb3IgdGhpcyBCRCBhZGRyZXNzL2hhbmRsZQorICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IHBBY2xIaXN0LT5iTmV4dEV2ZW50SWR4OyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8oICZidEV2ZW50LCBzaXplb2YodFNtZUJ0RXZlbnQpICk7CisgICAgICAgICAgICAgICAgICAgIHZvc19tZW1femVybyggJmJ0RXZlbnQsIHNpemVvZih0U21lQnRFdmVudCkgKTsKKyAgICAgICAgICAgICAgICAgICAgYnRFdmVudC5idEV2ZW50VHlwZSA9IHBBY2xIaXN0LT5idEV2ZW50VHlwZVtqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoQlRfRVZFTlRfRElTQ09OTkVDVElPTl9DT01QTEVURSAhPSBidEV2ZW50LmJ0RXZlbnRUeXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0l0IG11c3QgYmUgQ1JFQVRFIG9yIENPTk5FQ1RJT05fQ09NUExFVEUKKyAgICAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KCAmYnRFdmVudC51RXZlbnRQYXJhbS5idEFjbENvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWNsSGlzdC0+YnRBY2xDb25uZWN0aW9uW2pdLCBzaXplb2YodFNtZUJ0QWNsQ29ubmVjdGlvblBhcmFtKSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBidEV2ZW50LnVFdmVudFBhcmFtLmJ0RGlzY29ubmVjdC5jb25uZWN0aW9uSGFuZGxlID0gcEFjbEhpc3QtPmJ0QWNsQ29ubmVjdGlvbltqXS5jb25uZWN0aW9uSGFuZGxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ0Y1NlbmRCVEV2ZW50KCBwTWFjLCAmYnRFdmVudCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL01vZGUgY2hhbmdlCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBCVF9NQVhfQUNMX1NVUFBPUlQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xNb2RlQ2hhbmdlRXZlbnRbaV0uZlZhbGlkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8oICZidEV2ZW50LCBzaXplb2YodFNtZUJ0RXZlbnQpICk7CisgICAgICAgICAgICAgICAgYnRFdmVudC5idEV2ZW50VHlwZSA9IEJUX0VWRU5UX01PREVfQ0hBTkdFRDsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoICZidEV2ZW50LnVFdmVudFBhcmFtLmJ0QWNsTW9kZUNoYW5nZSwgCisgICAgICAgICAgICAgICAgICAgICZwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRBY2xNb2RlQ2hhbmdlRXZlbnRbaV0uYnRBY2xNb2RlQ2hhbmdlLCBzaXplb2YodFNtZUJ0QWNsTW9kZUNoYW5nZVBhcmFtKSApOworICAgICAgICAgICAgICAgIGJ0Y1NlbmRCVEV2ZW50KCBwTWFjLCAmYnRFdmVudCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgLy9BMkRQCisgICAgICAgIGlmKCBwUmVwbGF5LT5idGNFdmVudEhpc3QuZkEyRFBTdGFydGVkICkKKyAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV96ZXJvKCAmYnRFdmVudCwgc2l6ZW9mKHRTbWVCdEV2ZW50KSApOworICAgICAgICAgICAgYnRFdmVudC5idEV2ZW50VHlwZSA9IEJUX0VWRU5UX0EyRFBfU1RSRUFNX1NUQVJUOworICAgICAgICAgICAgYnRjU2VuZEJURXZlbnQoIHBNYWMsICZidEV2ZW50ICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggcFJlcGxheS0+YnRjRXZlbnRIaXN0LmZBMkRQU3RvcHBlZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19tZW1femVybyggJmJ0RXZlbnQsIHNpemVvZih0U21lQnRFdmVudCkgKTsKKyAgICAgICAgICAgIGJ0RXZlbnQuYnRFdmVudFR5cGUgPSBCVF9FVkVOVF9BMkRQX1NUUkVBTV9TVE9QOworICAgICAgICAgICAgYnRjU2VuZEJURXZlbnQoIHBNYWMsICZidEV2ZW50ICk7CisgICAgICAgIH0KKyAgICAgICAgLy9TQ08KKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IEJUX01BWF9TQ09fU1VQUE9SVDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idFN5bmNDb25uZWN0aW9uRXZlbnRbaV0uYk5leHRFdmVudElkeCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFN5bmNIaXN0ID0gJnBSZXBsYXktPmJ0Y0V2ZW50SGlzdC5idFN5bmNDb25uZWN0aW9uRXZlbnRbaV07CisgICAgICAgICAgICAgICAgLy9SZXBsYXkgYWxsIFNZTkMgZXZlbnRzIGZvciB0aGlzIEJEIGFkZHJlc3MvaGFuZGxlCisgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgcFN5bmNIaXN0LT5iTmV4dEV2ZW50SWR4OyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2b3NfbWVtX3plcm8oICZidEV2ZW50LCBzaXplb2YodFNtZUJ0RXZlbnQpICk7CisgICAgICAgICAgICAgICAgICAgIHZvc19tZW1femVybyggJmJ0RXZlbnQsIHNpemVvZih0U21lQnRFdmVudCkgKTsKKyAgICAgICAgICAgICAgICAgICAgYnRFdmVudC5idEV2ZW50VHlwZSA9IHBTeW5jSGlzdC0+YnRFdmVudFR5cGVbal07CisgICAgICAgICAgICAgICAgICAgIGlmKEJUX0VWRU5UX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUgIT0gYnRFdmVudC5idEV2ZW50VHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9NdXN0IGJlIENSRUFUSU9OIG9yIENPTk5FQ1RJT05fQ09NUExFVEUKKyAgICAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KCAmYnRFdmVudC51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFN5bmNIaXN0LT5idFN5bmNDb25uZWN0aW9uW2pdLCBzaXplb2YodFNtZUJ0U3luY0Nvbm5lY3Rpb25QYXJhbSkgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0RXZlbnQudUV2ZW50UGFyYW0uYnREaXNjb25uZWN0LmNvbm5lY3Rpb25IYW5kbGUgPSBwU3luY0hpc3QtPmJ0U3luY0Nvbm5lY3Rpb25bal0uY29ubmVjdGlvbkhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBidGNTZW5kQlRFdmVudCggcE1hYywgJmJ0RXZlbnQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9TWU5DIHVwZGF0ZQorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgQlRfTUFYX1NDT19TVVBQT1JUOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcFJlcGxheS0+YnRjRXZlbnRIaXN0LmJ0U3luY1VwZGF0ZUV2ZW50W2ldLmZWYWxpZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9zX21lbV96ZXJvKCAmYnRFdmVudCwgc2l6ZW9mKHRTbWVCdEV2ZW50KSApOworICAgICAgICAgICAgICAgIGJ0RXZlbnQuYnRFdmVudFR5cGUgPSBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fVVBEQVRFRDsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoICZidEV2ZW50LnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVwbGF5LT5idGNFdmVudEhpc3QuYnRTeW5jVXBkYXRlRXZlbnRbaV0uYnRTeW5jQ29ubmVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTbWVCdFN5bmNDb25uZWN0aW9uUGFyYW0pICk7CisgICAgICAgICAgICAgICAgYnRjU2VuZEJURXZlbnQoIHBNYWMsICZidEV2ZW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9DbGVhciBhbGwgZXZlbnRzCisgICAgICAgIHZvc19tZW1femVybyggJnBSZXBsYXktPmJ0Y0V2ZW50SGlzdCwgc2l6ZW9mKHRTbWVCdGNFdmVudEhpc3QpICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBidGNQb3dlclN0YXRlQ0IoIHZfUFZPSURfdCBwQ29udGV4dCwgdFBtY1N0YXRlIHBtY1N0YXRlICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QocENvbnRleHQpOworICAgIGlmKCBGVUxMX1BPV0VSID09IHBtY1N0YXRlICkKKyAgICB7CisgICAgICAgIGJ0Y1JlcGxheUV2ZW50cyggcE1hYyApOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGJ0Y0xvZ0V2ZW50CisgICAgXGJyaWVmICBBUEkgdG8gbG9nIHRoZSB0aGUgY3VycmVudCBCbHVldG9vdGggZXZlbnQKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwU21lQnRjQ29uZmlnIC0gUG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U21lQnRFdmVudC4gQ2FsbGVyIG93bnMgdGhlIG1lbW9yeSBhbmQgaXMgcmVzcG9uc2libGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZnJlZWluZyBpdC4KKyAgICBccmV0dXJuIE5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGJ0Y0xvZ0V2ZW50ICh0SGFsSGFuZGxlIGhIYWwsIHRwU21lQnRFdmVudCBwQnRFdmVudCkKK3sKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6ICIKKyAgICAgICAgICAgICAgICJCbHVldG9vdGggRXZlbnQgJWQgcmVjZWl2ZWQiLCBfX0ZVTkNUSU9OX18sIHBCdEV2ZW50LT5idEV2ZW50VHlwZSk7CisgICBzd2l0Y2gocEJ0RXZlbnQtPmJ0RXZlbnRUeXBlKQorICAgeworICAgICAgY2FzZSBCVF9FVkVOVF9DUkVBVEVfU1lOQ19DT05ORUNUSU9OOgorICAgICAgY2FzZSBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICBjYXNlIEJUX0VWRU5UX1NZTkNfQ09OTkVDVElPTl9VUERBVEVEOgorICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiU0NPIENvbm5lY3Rpb246ICIKKyAgICAgICAgICAgICAgICJjb25uZWN0aW9uSGFuZGxlID0gJWQgc3RhdHVzID0gJWQgbGlua1R5cGUgJWQgIgorICAgICAgICAgICAgICAgInNjb0ludGVydmFsICVkIHNjb1dpbmRvdyAlZCByZXRyYW5zbWlzaXNvbldpbmRvdyA9ICVkICIsCisgICAgICAgICAgICAgICBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5jb25uZWN0aW9uSGFuZGxlLAorICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uc3RhdHVzLAorICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24ubGlua1R5cGUsCisgICAgICAgICAgICAgICBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5zY29JbnRlcnZhbCwKKyAgICAgICAgICAgICAgIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLnNjb1dpbmRvdywKKyAgICAgICAgICAgICAgIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLnJldHJhbnNtaXNpc29uV2luZG93KTsKKyAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkJEIEFERFIgPSAiCisgICAgICAgICAgICAgICAiMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXgiLAorICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uYmRBZGRyWzVdLAorICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uYmRBZGRyWzRdLAorICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uYmRBZGRyWzNdLAorICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uYmRBZGRyWzJdLAorICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uYmRBZGRyWzFdLAorICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uYmRBZGRyWzBdKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlRfRVZFTlRfQ1JFQVRFX0FDTF9DT05ORUNUSU9OOgorICAgICAgY2FzZSBCVF9FVkVOVF9BQ0xfQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkFDTCBDb25uZWN0aW9uOiAiCisgICAgICAgICAgICAgICAiY29ubmVjdGlvbkhhbmRsZSA9ICVkIHN0YXR1cyA9ICVkICIsCisgICAgICAgICAgICAgICBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xDb25uZWN0aW9uLmNvbm5lY3Rpb25IYW5kbGUsCisgICAgICAgICAgICAgICBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xDb25uZWN0aW9uLnN0YXR1cyk7CisgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJCRCBBRERSID0gIgorICAgICAgICAgICAgICAgIjB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IiwKKyAgICAgICAgICAgICAgIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbENvbm5lY3Rpb24uYmRBZGRyWzVdLAorICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsQ29ubmVjdGlvbi5iZEFkZHJbNF0sCisgICAgICAgICAgICAgICBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xDb25uZWN0aW9uLmJkQWRkclszXSwKKyAgICAgICAgICAgICAgIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbENvbm5lY3Rpb24uYmRBZGRyWzJdLAorICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsQ29ubmVjdGlvbi5iZEFkZHJbMV0sCisgICAgICAgICAgICAgICBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xDb25uZWN0aW9uLmJkQWRkclswXSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJUX0VWRU5UX01PREVfQ0hBTkdFRDoKKyAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIkFDTCBNb2RlIGNoYW5nZSA6ICIKKyAgICAgICAgICAgICAgICJjb25uZWN0aW9uSGFuZGxlICVkIG1vZGUgJWQgIiwKKyAgICAgICAgICAgICAgIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbE1vZGVDaGFuZ2UuY29ubmVjdGlvbkhhbmRsZSwKKyAgICAgICAgICAgICAgIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbE1vZGVDaGFuZ2UubW9kZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJUX0VWRU5UX0RJU0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJEaXNjb25uZWN0IEV2ZW50IDogIgorICAgICAgICAgICAgICAgImNvbm5lY3Rpb25IYW5kbGUgJWQgIiwgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsTW9kZUNoYW5nZS5jb25uZWN0aW9uSGFuZGxlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBicmVhazsKKyAgIH0KKyB9CisKKy8qCisgICBDYWxsZXIgY2FuIGNoZWNrIHdoZXRoZXIgQlRDJ3MgY3VycmVudCBldmVudCBhbGxvd3MgVUFQU0QuIFRoaXMgZG9lc24ndCBhZmZlY3QKKyAgIEJNUFMuCisgICByZXR1cm46ICBWT1NfVFJVRSAtLSBCVEMgaXMgcmVhZHkgZm9yIFVBUFNECisgICAgICAgICAgICBWT1NfRkFMU0UgLS0gY2VydGFpbiBCVCBldmVudCBpcyBhY3RpdmUsIGNhbm5vdCBlbnRlciBVQVBTRAorKi8KK3ZfQk9PTF90IGJ0Y0lzUmVhZHlGb3JVYXBzZCggdEhhbEhhbmRsZSBoSGFsICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICByZXR1cm4oIHBNYWMtPmJ0Yy5idGNVYXBzZE9rICk7Cit9CisKKy8qCisgICAgQmFzZSBvbiB0aGUgQlQgZXZlbnQsIHRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZmxhZyBvbiB3aGV0aGVyIHRvIGFsbG93IFVBUFNECisgICAgQXQgdGhpcyB0aW1lLCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIFNDTyBhbmQgQTJEUC4KKyAgICBBMkRQIHRyYWNraW5nIGlzIHRocm91Z2ggQlRfRVZFTlRfQTJEUF9TVFJFQU1fU1RBUlQgYW5kIEJUX0VWRU5UX0EyRFBfU1RSRUFNX1NUT1AKKyAgICBTQ08gaXMgdGhyb3VnaCBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fQ09NUExFVEUgYW5kIEJUX0VWRU5UX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUKKyAgICBCVF9FVkVOVF9ERVZJQ0VfU1dJVENIRURfT0ZGIG92ZXJ3cml0ZXMgdGhlbSBhbGwKKyovCit2b2lkIGJ0Y1VhcHNkQ2hlY2soIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU21lQnRFdmVudCBwQnRFdmVudCApCit7CisgICB2X1U4X3QgaTsKKyAgIHZfQk9PTF90IGZMYXN0VWFwc2RTdGF0ZSA9IHBNYWMtPmJ0Yy5idGNVYXBzZE9rLCBmTW9yZVNDTyA9IFZPU19GQUxTRTsKKyAgIHN3aXRjaCggcEJ0RXZlbnQtPmJ0RXZlbnRUeXBlICkKKyAgIHsKKyAgIGNhc2UgQlRfRVZFTlRfRElTQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICBpZiggKFZPU19GQUxTRSA9PSBwTWFjLT5idGMuYnRjVWFwc2RPaykgJiYgCisgICAgICAgICAgIEJUX0lOVkFMSURfQ09OTl9IQU5ETEUgIT0gcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0RGlzY29ubmVjdC5jb25uZWN0aW9uSGFuZGxlICkKKyAgICAgICB7CisgICAgICAgICAgIC8vQ2hlY2sgd2hldGhlciBhbGwgU0NPIGNvbm5lY3Rpb25zIGFyZSBnb25lCisgICAgICAgICAgIGZvcihpPTA7IGkgPCBCVF9NQVhfU0NPX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYoIChCVF9JTlZBTElEX0NPTk5fSEFORExFICE9IHBNYWMtPmJ0Yy5idGNTY29IYW5kbGVzW2ldKSAmJgorICAgICAgICAgICAgICAgICAgIChwTWFjLT5idGMuYnRjU2NvSGFuZGxlc1tpXSAhPSBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnREaXNjb25uZWN0LmNvbm5lY3Rpb25IYW5kbGUpICkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAvL1dlIHN0aWxsIGhhdmUgb3V0c3RhbmRpbmcgU0NPIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICBmTW9yZVNDTyA9IFZPU19UUlVFOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSBpZiggcE1hYy0+YnRjLmJ0Y1Njb0hhbmRsZXNbaV0gPT0gcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0RGlzY29ubmVjdC5jb25uZWN0aW9uSGFuZGxlICkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBwTWFjLT5idGMuYnRjU2NvSGFuZGxlc1tpXSA9IEJUX0lOVkFMSURfQ09OTl9IQU5ETEU7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYoICFmTW9yZVNDTyAmJiAhcE1hYy0+YnRjLmZBMkRQVXAgKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL0FsbCBTQ08gaXMgZGlzY29ubmVjdGVkCisgICAgICAgICAgICAgICBwTWFjLT5idGMuYnRjVWFwc2RPayA9IFZPU19UUlVFOworICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiQlQgZXZlbnQgKERJU0NPTk5FQ1RJT04pIGhhcHBlbnMsIFVBUFNELWFsbG93ZWQgZmxhZyAoJWQpIGNoYW5nZSB0byBUUlVFIFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBwQnRFdmVudC0+YnRFdmVudFR5cGUsIHBNYWMtPmJ0Yy5idGNVYXBzZE9rICk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgYnJlYWs7CisgICBjYXNlIEJUX0VWRU5UX0RFVklDRV9TV0lUQ0hFRF9PRkY6CisgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiQlQgZXZlbnQgKERFVklDRV9PRkYpIGhhcHBlbnMsIFVBUFNELWFsbG93ZWQgZmxhZyAoJWQpIGNoYW5nZSB0byBUUlVFIFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBwQnRFdmVudC0+YnRFdmVudFR5cGUsIHBNYWMtPmJ0Yy5idGNVYXBzZE9rICk7CisgICAgICAgLy9DbGVhbiB1cCBTQ08KKyAgICAgICBmb3IoaT0wOyBpIDwgQlRfTUFYX1NDT19TVVBQT1JUOyBpKyspCisgICAgICAgeworICAgICAgICAgICBwTWFjLT5idGMuYnRjU2NvSGFuZGxlc1tpXSA9IEJUX0lOVkFMSURfQ09OTl9IQU5ETEU7CisgICAgICAgfQorICAgICAgIHBNYWMtPmJ0Yy5mQTJEUFVwID0gVk9TX0ZBTFNFOworICAgICAgIHBNYWMtPmJ0Yy5idGNVYXBzZE9rID0gVk9TX1RSVUU7CisgICAgICAgYnJlYWs7CisgICBjYXNlIEJUX0VWRU5UX0EyRFBfU1RSRUFNX1NUT1A6CisgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiQlQgZXZlbnQgIChBMkRQX1NUUkVBTV9TVE9QKSBoYXBwZW5zLCBVQVBTRC1hbGxvd2VkIGZsYWcgKCVkKSBcbiIsIAorICAgICAgICAgICAgcE1hYy0+YnRjLmJ0Y1VhcHNkT2sgKTsKKyAgICAgICBwTWFjLT5idGMuZkEyRFBVcCA9IFZPU19GQUxTRTsKKyAgICAgICAvL0NoZWNrIHdoZXRoZXIgU0NPIGlzIG9uCisgICAgICAgZm9yKGk9MDsgaSA8IEJUX01BWF9TQ09fU1VQUE9SVDsgaSsrKQorICAgICAgIHsKKyAgICAgICAgICAgaWYocE1hYy0+YnRjLmJ0Y1Njb0hhbmRsZXNbaV0gIT0gQlRfSU5WQUxJRF9DT05OX0hBTkRMRSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBpZiggQlRfTUFYX1NDT19TVVBQT1JUID09IGkgKQorICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPmJ0Yy5mQTJEUFRyYWZTdG9wID0gVk9TX1RSVUU7CisgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkJUX0VWRU5UX0EyRFBfU1RSRUFNX1NUT1A6IFVBUFNELWFsbG93ZWQgZmxhZyBpcyBub3cgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcE1hYy0+YnRjLmJ0Y1VhcHNkT2sgKTsKKyAgICAgICB9CisgICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQlRfRVZFTlRfTU9ERV9DSEFOR0VEOgorICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkJUIGV2ZW50IChCVF9FVkVOVF9NT0RFX0NIQU5HRUQpIGhhcHBlbnMsIE1vZGUgKCVkKSBVQVBTRC1hbGxvd2VkIGZsYWcgKCVkKVxuIiwKKyAgICAgICAgICAgICAgIHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbE1vZGVDaGFuZ2UubW9kZSwgcE1hYy0+YnRjLmJ0Y1VhcHNkT2sgKTsKKyAgICAgICBpZihwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xNb2RlQ2hhbmdlLm1vZGUgPT0gQlRfQUNMX1NOSUZGKQorICAgICAgIHsKKyAgICAgICAgICAgLy9DaGVjayB3aGV0aGVyIFNDTyBpcyBvbgorICAgICAgICAgICBmb3IoaT0wOyBpIDwgQlRfTUFYX1NDT19TVVBQT1JUOyBpKyspCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmKHBNYWMtPmJ0Yy5idGNTY29IYW5kbGVzW2ldICE9IEJUX0lOVkFMSURfQ09OTl9IQU5ETEUpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYoIEJUX01BWF9TQ09fU1VQUE9SVCA9PSBpICkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYoVk9TX1RSVUUgPT0gcE1hYy0+YnRjLmZBMkRQVHJhZlN0b3ApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcE1hYy0+YnRjLmJ0Y1VhcHNkT2sgPSBWT1NfVFJVRTsKKyAgICAgICAgICAgICAgICAgICBwTWFjLT5idGMuZkEyRFBUcmFmU3RvcCA9IFZPU19GQUxTRTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkJUX0VWRU5UX01PREVfQ0hBTkdFRCB3aXRoIE1vZGU6JWQgVUFQU0QtYWxsb3dlZCBmbGFnIGlzIG5vdyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsTW9kZUNoYW5nZS5tb2RlLHBNYWMtPmJ0Yy5idGNVYXBzZE9rICk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgYnJlYWs7CisgICBjYXNlIEJUX0VWRU5UX0NSRUFURV9TWU5DX0NPTk5FQ1RJT046CisgICAgICAgeworICAgICAgICAgICBwTWFjLT5idGMuYnRjVWFwc2RPayA9IFZPU19GQUxTRTsKKyAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiQlRfRVZFTlRfQ1JFQVRFX1NZTkNfQ09OTkVDVElPTiAoJWQpIGhhcHBlbnMsIFVBUFNELWFsbG93ZWQgZmxhZyAoJWQpIGNoYW5nZSB0byBGQUxTRSBcbiIsIAorICAgICAgICAgICAgICAgICAgIHBCdEV2ZW50LT5idEV2ZW50VHlwZSwgcE1hYy0+YnRjLmJ0Y1VhcHNkT2sgKTsKKyAgICAgICB9CisgICAgICAgYnJlYWs7CisgICBjYXNlIEJUX0VWRU5UX1NZTkNfQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICAvL01ha2Ugc3VyZSBpdCBpcyBhIHN1Y2Nlc3MKKyAgICAgICBpZiggQlRfQ09OTl9TVEFUVVNfRkFJTCAhPSBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5zdGF0dXMgKQorICAgICAgIHsKKyAgICAgICAgICAgLy9TYXZlIHRlIGhhbmRsZSBmb3IgbGF0ZXIgdXNlCisgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBCVF9NQVhfU0NPX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX0FTU0VSVChCVF9JTlZBTElEX0NPTk5fSEFORExFICE9IHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmNvbm5lY3Rpb25IYW5kbGUpOworICAgICAgICAgICAgICAgaWYoIChCVF9JTlZBTElEX0NPTk5fSEFORExFID09IHBNYWMtPmJ0Yy5idGNTY29IYW5kbGVzW2ldKSAmJgorICAgICAgICAgICAgICAgICAgIChCVF9JTlZBTElEX0NPTk5fSEFORExFICE9IHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmNvbm5lY3Rpb25IYW5kbGUpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHBNYWMtPmJ0Yy5idGNTY29IYW5kbGVzW2ldID0gcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uY29ubmVjdGlvbkhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorCisgICAgICAgICAgIGlmKCBpID49IEJUX01BWF9TQ09fU1VQUE9SVCApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiVG9vIG1hbnkgU0NPLCBpZ25vcmUgdGhpcyBvbmVcbiIpKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgICAgLy9DaGVjayB3aGV0aGVyIFNDTyBpcyBvbgorICAgICAgICAgICBmb3IoaT0wOyBpIDwgQlRfTUFYX1NDT19TVVBQT1JUOyBpKyspCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmKHBNYWMtPmJ0Yy5idGNTY29IYW5kbGVzW2ldICE9IEJUX0lOVkFMSURfQ09OTl9IQU5ETEUpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgICAgICAvKklmIE5vIE90aGVyIFNjby9BMkRQIGlzIE9OIHJlZW5hYmxlIFVBUFNEKi8KKyAgICAgICAgICAgaWYoIChCVF9NQVhfU0NPX1NVUFBPUlQgPT0gaSkgICYmICFwTWFjLT5idGMuZkEyRFBVcCkgICAgICAgICAgIAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwTWFjLT5idGMuYnRjVWFwc2RPayA9IFZPU19UUlVFOworICAgICAgICAgICB9CisgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiVFNZTkMgY29tcGxldGUgZmFpbGVkXG4iKSk7CisgICAgICAgfQorICAgICAgIGJyZWFrOworICAgY2FzZSBCVF9FVkVOVF9BMkRQX1NUUkVBTV9TVEFSVDoKKyAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJCVF9FVkVOVF9BMkRQX1NUUkVBTV9TVEFSVCAoJWQpIGhhcHBlbnMsIFVBUFNELWFsbG93ZWQgZmxhZyAoJWQpIGNoYW5nZSB0byBGQUxTRSBcbiIsIAorICAgICAgICAgICAgICAgIHBCdEV2ZW50LT5idEV2ZW50VHlwZSwgcE1hYy0+YnRjLmJ0Y1VhcHNkT2sgKTsKKyAgICAgICBwTWFjLT5idGMuZkEyRFBUcmFmU3RvcCA9IFZPU19GQUxTRTsKKyAgICAgICBwTWFjLT5idGMuYnRjVWFwc2RPayA9IFZPU19GQUxTRTsKKyAgICAgICBwTWFjLT5idGMuZkEyRFBVcCA9IFZPU19UUlVFOworICAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgICAvL05vIGNoYW5nZSBmb3IgdGhlc2UgZXZlbnRzCisgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiQlQgZXZlbnQgKCVkKSBoYXBwZW5zLCBVQVBTRC1hbGxvd2VkIGZsYWcgKCVkKSBubyBjaGFuZ2UgXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgcEJ0RXZlbnQtPmJ0RXZlbnRUeXBlLCBwTWFjLT5idGMuYnRjVWFwc2RPayApOworICAgICAgIGJyZWFrOworICAgfQorICAgaWYoZkxhc3RVYXBzZFN0YXRlICE9IHBNYWMtPmJ0Yy5idGNVYXBzZE9rKQorICAgeworICAgICAgc21lX1Fvc1RyaWdnZXJVYXBzZENoYW5nZSggcE1hYyApOworICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gYnRjSGFuZGxlQ29leEluZAorICAgIFxicmllZiAgQVBJIHRvIGhhbmRsZSBDb2V4IGluZGljYXRpb24gZnJvbSBXREkKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFICBzdWNjZXNzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTICBmYWlsdXJlCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGJ0Y0hhbmRsZUNvZXhJbmQodEhhbEhhbmRsZSBoSGFsLCB2b2lkKiBwTXNnKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0U2lyU21lQ29leEluZCAqcFNtZUNvZXhJbmQgPSAodFNpclNtZUNvZXhJbmQgKilwTXNnOworCisgICBpZiAoTlVMTCA9PSBwTXNnKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJpbiAlcyBtc2cgcHRyIGlzIE5VTExcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy8gREVCVUcKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCAiQ29leCBpbmRpY2F0aW9uIGluICVzKCksIHR5cGUgJWQiLAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcFNtZUNvZXhJbmQtPmNvZXhJbmRUeXBlKTsKKworICAgICAvLyBzdXNwZW5kIGhlYXJ0YmVhdCBtb25pdG9yaW5nCisgICAgIGlmIChwU21lQ29leEluZC0+Y29leEluZFR5cGUgPT0gU0lSX0NPRVhfSU5EX1RZUEVfRElTQUJMRV9IQl9NT05JVE9SKQorICAgICB7CisgICAgICAgIC8vIHNldCBoZWFydGJlYXQgdGhyZXNob2xkIENGRyB0byB6ZXJvCisgICAgICAgIGNjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0hFQVJUX0JFQVRfVEhSRVNIT0xELCAwLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICBwTWFjLT5idGMuYnRjSEJBY3RpdmUgPSBWT1NfRkFMU0U7CisgICAgIH0KKworICAgICAvLyByZXN1bWUgaGVhcnRiZWF0IG1vbml0b3JpbmcKKyAgICAgZWxzZSBpZiAocFNtZUNvZXhJbmQtPmNvZXhJbmRUeXBlID09IFNJUl9DT0VYX0lORF9UWVBFX0VOQUJMRV9IQl9NT05JVE9SKQorICAgICB7CisgICAgICAgIGlmICghcE1hYy0+YnRjLmJ0Y0hCQWN0aXZlKSAKKyAgICAgICAgeworICAgICAgICAgICBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR19IRUFSVF9CRUFUX1RIUkVTSE9MRCwgcE1hYy0+YnRjLmJ0Y0hCQ291bnQsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgIHBNYWMtPmJ0Yy5idGNIQkFjdGl2ZSA9IFZPU19UUlVFOworICAgICAgICB9CisgICAgIH0KKworICAgICAvLyB1bmtub3duIGluZGljYXRpb24gdHlwZQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJ1bmtub3duIENvZXggaW5kaWNhdGlvbiB0eXBlIGluICVzKCkiLCBfX0ZVTkNUSU9OX18pOworICAgICB9CisgICB9CisKKyAgIHJldHVybihzdGF0dXMpOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGJ0Y0RpYWdFdmVudExvZworICAgIFxicmllZiAgQVBJIHRvIGxvZyB0aGUgdGhlIGN1cnJlbnQgQmx1ZXRvb3RoIGV2ZW50CisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFNtZUJ0Y0NvbmZpZyAtIFBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNtZUJ0RXZlbnQuIENhbGxlciBvd25zIHRoZSBtZW1vcnkgYW5kIGlzIHJlc3BvbnNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZyZWVpbmcgaXQuCisgICAgXHJldHVybiBOb25lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBidGNEaWFnRXZlbnRMb2cgKHRIYWxIYW5kbGUgaEhhbCwgdHBTbWVCdEV2ZW50IHBCdEV2ZW50KQoreworICAgLy92b3NfZXZlbnRfd2xhbl9idGNfdHlwZSAqbG9nX3B0ciA9IE5VTEw7CisgICBXTEFOX1ZPU19ESUFHX0VWRU5UX0RFRihidERpYWdFdmVudCwgdm9zX2V2ZW50X3dsYW5fYnRjX3R5cGUpOworICAgeworICAgICAgIGJ0RGlhZ0V2ZW50LmV2ZW50SWQgPSBwQnRFdmVudC0+YnRFdmVudFR5cGU7CisgICAgICAgc3dpdGNoKHBCdEV2ZW50LT5idEV2ZW50VHlwZSkKKyAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJUX0VWRU5UX0NSRUFURV9TWU5DX0NPTk5FQ1RJT046CisgICAgICAgICAgICBjYXNlIEJUX0VWRU5UX1NZTkNfQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICAgICAgIGNhc2UgQlRfRVZFTlRfU1lOQ19DT05ORUNUSU9OX1VQREFURUQ6CisgICAgICAgICAgICAgICAgYnREaWFnRXZlbnQuY29ubkhhbmRsZSA9IHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLmNvbm5lY3Rpb25IYW5kbGU7CisgICAgICAgICAgICAgICAgYnREaWFnRXZlbnQuY29ublN0YXR1cyA9IHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idFN5bmNDb25uZWN0aW9uLnN0YXR1czsKKyAgICAgICAgICAgICAgICBidERpYWdFdmVudC5saW5rVHlwZSAgID0gcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24ubGlua1R5cGU7CisgICAgICAgICAgICAgICAgYnREaWFnRXZlbnQuc2NvSW50ZXJ2YWwgPSBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5zY29JbnRlcnZhbDsKKyAgICAgICAgICAgICAgICBidERpYWdFdmVudC5zY29XaW5kb3cgID0gcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0U3luY0Nvbm5lY3Rpb24uc2NvV2luZG93OworICAgICAgICAgICAgICAgIGJ0RGlhZ0V2ZW50LnJldHJhbnNXaW5kb3cgPSBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5yZXRyYW5zbWlzaXNvbldpbmRvdzsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoYnREaWFnRXZlbnQuYnRBZGRyLCBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5iZEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnREaWFnRXZlbnQuYnRBZGRyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJUX0VWRU5UX0NSRUFURV9BQ0xfQ09OTkVDVElPTjoKKyAgICAgICAgICAgIGNhc2UgQlRfRVZFTlRfQUNMX0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICAgICAgICAgICAgYnREaWFnRXZlbnQuY29ubkhhbmRsZSA9IHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbENvbm5lY3Rpb24uY29ubmVjdGlvbkhhbmRsZTsKKyAgICAgICAgICAgICAgICBidERpYWdFdmVudC5jb25uU3RhdHVzID0gcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsQ29ubmVjdGlvbi5zdGF0dXM7CisgICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KGJ0RGlhZ0V2ZW50LmJ0QWRkciwgcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsQ29ubmVjdGlvbi5iZEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidERpYWdFdmVudC5idEFkZHIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlRfRVZFTlRfTU9ERV9DSEFOR0VEOgorICAgICAgICAgICAgICAgIGJ0RGlhZ0V2ZW50LmNvbm5IYW5kbGUgPSBwQnRFdmVudC0+dUV2ZW50UGFyYW0uYnRBY2xNb2RlQ2hhbmdlLmNvbm5lY3Rpb25IYW5kbGU7CisgICAgICAgICAgICAgICAgYnREaWFnRXZlbnQubW9kZSA9IHBCdEV2ZW50LT51RXZlbnRQYXJhbS5idEFjbE1vZGVDaGFuZ2UubW9kZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlRfRVZFTlRfRElTQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICAgICAgICAgICBidERpYWdFdmVudC5jb25uSGFuZGxlID0gcEJ0RXZlbnQtPnVFdmVudFBhcmFtLmJ0QWNsTW9kZUNoYW5nZS5jb25uZWN0aW9uSGFuZGxlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICB9CisgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmYnREaWFnRXZlbnQsIEVWRU5UX1dMQU5fQlRDKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisjZW5kaWYgLyogV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUKi8KZGlmZiAtLWdpdCBhL0NPUkUvU01FL3NyYy9jY20vY2NtQXBpLmMgYi9DT1JFL1NNRS9zcmMvY2NtL2NjbUFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTBhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9zcmMvY2NtL2NjbUFwaS5jCkBAIC0wLDAgKzEsMTEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJwYWxUeXBlcy5oIgorI2luY2x1ZGUgInduaUFwaS5oIiAgICAgLyogV05JX0NGR19TRVRfUkVRICovCisjaW5jbHVkZSAic2lyUGFyYW1zLmgiICAvKiB0U2lyTWJNc2cgKi8KKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsSGRkQXBpcy5oIiAvKiBwYWxBbGxvY2F0ZU1lbW9yeSAqLworI2VuZGlmCisjaW5jbHVkZSAic21zRGVidWcuaCIgICAvKiBzbXNMb2cgKi8KKyNpbmNsdWRlICJjZmdBcGkuaCIKKyNpbmNsdWRlICJjY21BcGkuaCIKKyNpbmNsdWRlICJsb2dEdW1wLmgiCisKKy8vI2RlZmluZSBDQ01fREVCVUcKKyN1bmRlZiBDQ01fREVCVUcKKworI2RlZmluZSBDQ01fREVCVUcyCisvLyN1bmRlZiBDQ01fREVCVUcyCisKKyNkZWZpbmUgQ0ZHT0JKX0FMSUdOVE8gICAgICAgICAgNAorI2RlZmluZSBDRkdPQkpfQUxJR04obGVuKSAgICAgICAoICgobGVuKStDRkdPQkpfQUxJR05UTy0xKSAmIH4oQ0ZHT0JKX0FMSUdOVE8tMSkgKQorCisjZGVmaW5lIENGR09CSl9JRF9TSVpFICAgICAgICAgICAgICAgICAgNCAgICAgICAvKiA0IGJ5dGVzIGZvciBjZmdJZCAqLworI2RlZmluZSBDRkdPQkpfTEVOX1NJWkUgICAgICAgICAgICAgICAgIDQgICAgICAgLyogNCBieXRlcyBmb3IgbGVuZ3RoICovCisjZGVmaW5lIENGR09CSl9JTlRFR0VSX1ZBTFVFX1NJWkUgICAgICAgNCAgICAgICAvKiA0IGJ5dGVzIGZvciBpbnRlZ2VyIHZhbHVlICovCisKKyNkZWZpbmUgQ0ZHX1VQREFURV9NQUdJQ19EV09SRCAgICAgMHhhYmFiCisKKyNkZWZpbmUgaGFsSGFuZGxlMkhkZEhhbmRsZShoSGFsKSAgKCAoTlVMTCA9PSAoaEhhbCkpID8gMCA6ICgodHBBbmlTaXJHbG9iYWwpKGhIYWwpKS0+aEhkZCApCisKK3N0YXRpYyB2b2lkIGNjbUNvbXBsZXRlKHRIZGRIYW5kbGUgaEhkZCwgdm9pZCAqZG9uZSkKK3sKKyAgICBpZiAoZG9uZSkKKyAgICB7CisgICAgICAgICh2b2lkKXBhbFNlbWFwaG9yZUdpdmUoaEhkZCwgZG9uZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjY21XYWl0Rm9yQ29tcGxldGlvbih0SGRkSGFuZGxlIGhIZGQsIHZvaWQgKmRvbmUpCit7CisgICAgaWYgKGRvbmUpCisgICAgeworICAgICAgICAodm9pZClwYWxTZW1hcGhvcmVUYWtlKGhIZGQsIGRvbmUpOworICAgIH0KK30KKworc3RhdGljIHRBTklfVTMyICogZW5jb2RlQ2ZnUmVxKHRIZGRIYW5kbGUgaEhkZCwgdEFOSV9VMzIgKnBsLCB0QU5JX1UzMiBjZmdJZCwgdEFOSV9TMzIgbGVuZ3RoLCB2b2lkICpwQnVmLCB0QU5JX1UzMiB2YWx1ZSwgdEFOSV9VMzIgdHlwZSkKK3sKKyAgICAqcGwrKyA9IHBhbF9jcHVfdG9fYmUzMihjZmdJZCkgOworICAgICpwbCsrID0gcGFsX2NwdV90b19iZTMyKGxlbmd0aCkgOworICAgIGlmICh0eXBlID09IENDTV9JTlRFR0VSX1RZUEUpCisgICAgeworICAgICAgICAqcGwrKyA9IHBhbF9jcHVfdG9fYmUzMih2YWx1ZSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KGhIZGQsICh2b2lkICopcGwsICh2b2lkICopcEJ1ZiwgbGVuZ3RoKTsKKyAgICAgICAgcGwgKz0gKENGR09CSl9BTElHTihsZW5ndGgpIC8gQ0ZHT0JKX0FMSUdOVE8pOworICAgIH0KKyAgICByZXR1cm4gcGwgOworfQorCisvKgorICogQ0NNX1NUUklOR19UWVBFICAgICAgICAgICAgICAgICAgICAgICBDQ01fSU5URUdFUl9UWVBFCisgKiB8PC0tLS0tLS0tICA0ICAgLS0tLS0+fCAgICAgICAgICAgICAgIHw8LS0tLS0tLS0gIDQgICAtLS0tLT58ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICstLS0tLS0tLS0tKyAgICAgICAgICAgIDwtLSBtc2cgIC0tPiAgKy0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiB8dHlwZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHx0eXBlICAgICAgfCAgICAgICAgICAgCisgKiArLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tKyAgICAgICAgICAgCisgKiB8bXNnTGVuPTI0IHwgICAgICAgICAgICAgICAgICAgICAgICAgIHxtc2dMZW49MTYgfCAgICAgICAgICAgCisgKiArLS0tLS0tLS0tLSstLS0tLS0tLS0tKyAgICAgICAgICAgICAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgKiB8IGNmZ0lkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgY2ZnSWQgICAgICAgICAgICAgICB8ICAKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgbGVuZ3RoPTExICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBsZW5ndGg9NCAgICAgICAgICAgIHwgIAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IHZhbHVlICAgICAgICAgICAgICAgfCAgCisgKiB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAKKyAqIHwgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICstLS0tKworICogfCAgICAgICAgICAgICAgICB8Ly8vL3wgPC0gcGFkZGluZyB0byA0LWJ5dGUgYm91bmRhcnkKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0rCisgKi8KK3N0YXRpYyBlSGFsU3RhdHVzIHNlbmRDZmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdEhkZEhhbmRsZSBoSGRkLCB0Q2ZnUmVxICpyZXEsIHRBTklfQk9PTEVBTiBmUnNwKQoreworICAgIHRTaXJNYk1zZyAqbXNnOworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgIHRBTklfUzE2IG1zZ0xlbiA9ICh0QU5JX1UxNikoNCArICAgIC8qIDQgYnl0ZXMgZm9yIG1zZyBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGR09CSl9JRF9TSVpFICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGR09CSl9MRU5fU0laRSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdPQkpfQUxJR04ocmVxLT5sZW5ndGgpKSA7CisKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShoSGRkLCAodm9pZCAqKikmbXNnLCBtc2dMZW4pOworICAgIGlmIChzdGF0dXMgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGlmKCBmUnNwICkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnLT50eXBlID0gcGFsX2NwdV90b19iZTE2KFdOSV9DRkdfU0VUX1JFUSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtc2ctPnR5cGUgPSBwYWxfY3B1X3RvX2JlMTYoV05JX0NGR19TRVRfUkVRX05PX1JTUCk7CisgICAgICAgIH0KKyAgICAgICAgbXNnLT5tc2dMZW4gPSBwYWxfY3B1X3RvX2JlMTYobXNnTGVuKTsKKyAgICAgICAgKHZvaWQpZW5jb2RlQ2ZnUmVxKGhIZGQsIG1zZy0+ZGF0YSwgcmVxLT5jZmdJZCwgcmVxLT5sZW5ndGgsIHJlcS0+Y2NtUHRyLCByZXEtPmNjbVZhbHVlLCByZXEtPnR5cGUpIDsKKworICAgICAgICBzdGF0dXMgPSBwYWxTZW5kTUJNZXNzYWdlKGhIZGQsIG1zZykgOworICAgICAgICBpZiAoc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgRkwoInBhbFNlbmRNQk1lc3NhZ2UoKSBmYWlsZWRcbiIpKTsKKyAgICAgICAgICAgIC8vTm8gbmVlZCB0byBmcmVlIG1zZy4gcGFsU2VuZE1CTWVzc2FnZSBmcmVlcyBpdC4KKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkUgOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgRkwoInBhbEFsbG9jYXRlTWVtb3J5KGxlbj0lZClcbiIpLCBtc2dMZW4gKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzIDsKK30KKworc3RhdGljIHRDZmdSZXEgKiBhbGxvY2F0ZUNmZ1JlcSh0SGRkSGFuZGxlIGhIZGQsIHRBTklfVTMyIHR5cGUsIHRBTklfUzMyIGxlbmd0aCkKK3sKKyAgICB0Q2ZnUmVxICpyZXEgOworICAgIHRBTklfUzMyIGFsbG9jX2xlbiA9IHNpemVvZih0Q2ZnUmVxKSA7CisKKyAgICBpZiAodHlwZSA9PSBDQ01fU1RSSU5HX1RZUEUpCisgICAgeworICAgICAgICBhbGxvY19sZW4gKz0gbGVuZ3RoIDsKKyAgICB9CisKKyAgICBpZiAocGFsQWxsb2NhdGVNZW1vcnkoaEhkZCwgKHZvaWQgKiopJnJlcSwgYWxsb2NfbGVuKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEwgOworICAgIH0KKworICAgIHJlcS0+Y2NtUHRyID0gKHJlcSsxKTsKKworICAgIHJldHVybiByZXEgOworfQorCitzdGF0aWMgdm9pZCBmcmVlQ2ZnUmVxKHRIZGRIYW5kbGUgaEhkZCwgdENmZ1JlcSAqcmVxKQoreworICAgIHBhbEZyZWVNZW1vcnkoaEhkZCwgKHZvaWQqKXJlcSkgOworfQorCitzdGF0aWMgdm9pZCBhZGRfcmVxX3RhaWwodENmZ1JlcSAqcmVxLCBzdHJ1Y3QgY2NtbGluayAqcSkKK3sKKyAgICBpZiAocS0+dGFpbCkKKyAgICB7CisgICAgICAgIHEtPnRhaWwtPm5leHQgPSByZXE7CisgICAgICAgIHEtPnRhaWwgPSByZXEgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBxLT5oZWFkID0gcS0+dGFpbCA9IHJlcSA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWxfcmVxKHRDZmdSZXEgKnJlcSwgc3RydWN0IGNjbWxpbmsgKnEpCit7CisgICAgcS0+aGVhZCA9IHJlcS0+bmV4dCA7CisgICAgcmVxLT5uZXh0ID0gTlVMTCA7CisgICAgaWYgKHEtPmhlYWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHEtPnRhaWwgPSBOVUxMIDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1cmdlUmVxUSh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdEhkZEhhbmRsZSBoSGRkID0gaGFsSGFuZGxlMkhkZEhhbmRsZShoSGFsKTsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICB0Q2ZnUmVxICpyZXEsICp0bXAgOworCisgICAgZm9yIChyZXEgPSBwTWFjLT5jY20ucmVxUS5oZWFkOyByZXE7IHJlcSA9IHRtcCkKKyAgICB7CisgICAgICAgIC8qIGxvb3AgdGhydSByZXFRIGFuZCBpbnZva2UgY2FsbGJhY2sgdG8gcmV0dXJuIGZhaWx1cmUgKi8KKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJkZWxldGluZyBjZmdSZXEsIGNmZ2lkPSVkXG4iKSwgKGludClyZXEtPmNmZ0lkKTsKKworICAgICAgICB0bXAgPSByZXEtPm5leHQgOworCisgICAgICAgIGlmIChyZXEtPmNhbGxiYWNrKQorICAgICAgICB7CisgICAgICAgICAgICByZXEtPmNhbGxiYWNrKGhIYWwsIGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHBhbFNwaW5Mb2NrVGFrZShoSGRkLCBwTWFjLT5jY20ubG9jayk7CisgICAgICAgIGRlbF9yZXEocmVxLCAmcE1hYy0+Y2NtLnJlcVEpOworICAgICAgICBwYWxTcGluTG9ja0dpdmUoaEhkZCwgcE1hYy0+Y2NtLmxvY2spOworICAgICAgICBmcmVlQ2ZnUmVxKGhIZGQsIHJlcSk7CisgICAgfQorICAgIHJldHVybiA7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRRdWV1ZWRSZXFUb01hY1N3KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRIZGRIYW5kbGUgaEhkZCkKK3sKKyAgICB0Q2ZnUmVxICpyZXEgOworCisgICAgLyogU2VuZCB0aGUgaGVhZCByZXEgKi8KKyAgICByZXEgPSBwTWFjLT5jY20ucmVxUS5oZWFkIDsKKyAgICBpZiAocmVxKQorICAgIHsKKyAgICAgICAgaWYgKHJlcS0+c3RhdGUgPT0gZUNDTV9SRVFfUVVFVUVEKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTZW5kIFdOSV9DRkdfU0VUX1JFUSAqLworICAgICAgICAgICAgcmVxLT5zdGF0ZSA9IGVDQ01fUkVRX1NFTlQ7CisgICAgICAgICAgICBpZiAoc2VuZENmZyhwTWFjLCBoSGRkLCByZXEsIGVBTklfQk9PTEVBTl9UUlVFKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgRkwoInNlbmRDZmcoKSBmYWlsZWRcbiIpKTsKKyAgICAgICAgICAgICAgICBwYWxTcGluTG9ja1Rha2UoaEhkZCwgcE1hYy0+Y2NtLmxvY2spOworICAgICAgICAgICAgICAgIGRlbF9yZXEocmVxLCAmcE1hYy0+Y2NtLnJlcVEpIDsKKyAgICAgICAgICAgICAgICBwYWxTcGluTG9ja0dpdmUoaEhkZCwgcE1hYy0+Y2NtLmxvY2spOworICAgICAgICAgICAgICAgIGlmIChyZXEtPmNhbGxiYWNrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxLT5jYWxsYmFjaygodEhhbEhhbmRsZSlwTWFjLCBXTklfQ0ZHX09USEVSX0VSUk9SKSA7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgQ0NNX0RFQlVHCisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJjY21Db21wbGV0ZSglcClcbiIpLCByZXEtPmRvbmUpOworI2VuZGlmCisgICAgICAgICAgICAgICAgY2NtQ29tcGxldGUoaEhkZCwgcmVxLT5kb25lKTsKKworICAgICAgICAgICAgICAgIGZyZWVDZmdSZXEoaEhkZCwgcmVxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgRkwoInJlcVN0YXRlIGlzIG5vdCBlQ0NNX1JFUV9RVUVVRUQsIGlzICVkXG4iKSwgcmVxLT5zdGF0ZSApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworc3RhdGljIGVIYWxTdGF0dXMgY2ZnU2V0U3ViKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRIZGRIYW5kbGUgaEhkZCwgdEFOSV9VMzIgY2ZnSWQsIHRBTklfVTMyIHR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfUzMyIGxlbmd0aCwgdm9pZCAqY2NtUHRyLCB0QU5JX1UzMiBjY21WYWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENjbUNmZ1NldENhbGxiYWNrIGNhbGxiYWNrLCBlQW5pQm9vbGVhbiB0b0JlU2F2ZWQsIHZvaWQgKnNlbSwgdENmZ1JlcSAqKnIpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRDZmdSZXEgKnJlcSA7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgKnIgPSBOVUxMIDsKKworICAgICAgICBpZiAocE1hYy0+Y2NtLnN0YXRlID09IGVDQ01fU1RPUFBFRCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRSA7CisgICAgICAgICAgICBicmVhayA7CisgICAgICAgIH0KKworICAgICAgICByZXEgPSBhbGxvY2F0ZUNmZ1JlcShoSGRkLCB0eXBlLCBsZW5ndGgpOworICAgICAgICBpZiAocmVxID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQyA7CisgICAgICAgICAgICBicmVhayA7CisgICAgICAgIH0KKworICAgICAgICByZXEtPm5leHQgICAgICAgPSBOVUxMIDsKKyAgICAgICAgcmVxLT5jZmdJZCAgICAgID0gKHRBTklfVTE2KWNmZ0lkIDsKKyAgICAgICAgcmVxLT50eXBlICAgICAgID0gKHRBTklfVTgpdHlwZSA7CisgICAgICAgIHJlcS0+c3RhdGUgICAgICA9IGVDQ01fUkVRX1FVRVVFRCA7CisgICAgICAgIHJlcS0+dG9CZVNhdmVkICA9ICEhdG9CZVNhdmVkIDsKKyAgICAgICAgcmVxLT5sZW5ndGggICAgID0gbGVuZ3RoIDsKKyAgICAgICAgcmVxLT5kb25lICAgICAgID0gc2VtIDsKKyAgICAgICAgcmVxLT5jYWxsYmFjayAgID0gY2FsbGJhY2sgOworICAgICAgICBpZiAodHlwZSA9PSBDQ01fSU5URUdFUl9UWVBFKQorICAgICAgICB7CisgICAgICAgICAgICByZXEtPmNjbVZhbHVlID0gY2NtVmFsdWUgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShoSGRkLCAodm9pZCopcmVxLT5jY21QdHIsICh2b2lkKiljY21QdHIsIGxlbmd0aCk7IAorICAgICAgICB9CisKKyAgICAgICAgcGFsU3BpbkxvY2tUYWtlKGhIZGQsIHBNYWMtPmNjbS5sb2NrKTsKKworICAgICAgICBhZGRfcmVxX3RhaWwocmVxLCAmcE1hYy0+Y2NtLnJlcVEpOworICAgICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZXEgb24gdGhlIHF1ZXVlLCBzZW5kIGl0IHRvIE1BQyBTVyAqLworICAgICAgICBpZiAoKHBNYWMtPmNjbS5yZXBsYXkuc3RhcnRlZCA9PSAwKSAmJiAocE1hYy0+Y2NtLnJlcVEuaGVhZCA9PSByZXEpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTZW5kIFdOSV9DRkdfU0VUX1JFUSAqLworICAgICAgICAgICAgcmVxLT5zdGF0ZSA9IGVDQ01fUkVRX1NFTlQ7CisgICAgICAgICAgICBwYWxTcGluTG9ja0dpdmUoaEhkZCwgcE1hYy0+Y2NtLmxvY2spOworICAgICAgICAgICAgc3RhdHVzID0gc2VuZENmZyhwTWFjLCBoSGRkLCByZXEsIGVBTklfQk9PTEVBTl9UUlVFKSA7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCBGTCgic2VuZENmZygpIGZhaWxlZFxuIikpOworICAgICAgICAgICAgICAgIHBhbFNwaW5Mb2NrVGFrZShoSGRkLCBwTWFjLT5jY20ubG9jayk7CisgICAgICAgICAgICAgICAgZGVsX3JlcShyZXEsICZwTWFjLT5jY20ucmVxUSk7CisgICAgICAgICAgICAgICAgcGFsU3BpbkxvY2tHaXZlKGhIZGQsIHBNYWMtPmNjbS5sb2NrKTsKKyAgICAgICAgICAgICAgICBmcmVlQ2ZnUmVxKGhIZGQsIHJlcSk7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbFNwaW5Mb2NrVGFrZShoSGRkLCBwTWFjLT5jY20ubG9jayk7CisgICAgICAgICAgICAgICAgaWYocmVxICE9IHBNYWMtPmNjbS5yZXFRLmhlYWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1dlIHNlbmQgdGhlIHJlcXVlc3QgYW5kIGl0IG11c3QgYmUgZG9uZSBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgIHJlcSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhbFNwaW5Mb2NrR2l2ZShoSGRkLCBwTWFjLT5jY20ubG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwYWxTcGluTG9ja0dpdmUoaEhkZCwgcE1hYy0+Y2NtLmxvY2spOworICAgICAgICB9CisgICAgICAgICpyID0gcmVxIDsKKworICAgIH0gd2hpbGUoMCkgOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVIYWxTdGF0dXMgY2ZnU2V0KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgY2ZnSWQsIHRBTklfVTMyIHR5cGUsIHRBTklfUzMyIGxlbmd0aCwgdm9pZCAqIGNjbVB0ciwgdEFOSV9VMzIgY2NtVmFsdWUsIHRDY21DZmdTZXRDYWxsYmFjayBjYWxsYmFjaywgZUFuaUJvb2xlYW4gdG9CZVNhdmVkKQoreworICAgIHRIZGRIYW5kbGUgaEhkZCA9IGhhbEhhbmRsZTJIZGRIYW5kbGUoaEhhbCk7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdENmZ1JlcSAqcmVxIDsKKworICAgIGlmIChwYWxfaW5faW50ZXJydXB0KCkpCisgICAgeworI2lmZGVmIENDTV9ERUJVRzIKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJXTklfQ0ZHXyVzICglZCAweCV4KSwgaW5faW50ZXJydXB0KCk9VFJVRVxuIiksIGdDZmdQYXJhbU5hbWVbY2ZnSWRdLCAoaW50KWNmZ0lkLCAoaW50KWNmZ0lkKTsKKyNlbmRpZgorICAgICAgICBzdGF0dXMgPSBjZmdTZXRTdWIocE1hYywgaEhkZCwgY2ZnSWQsIHR5cGUsIGxlbmd0aCwgY2NtUHRyLCBjY21WYWx1ZSwgY2FsbGJhY2ssIHRvQmVTYXZlZCwgTlVMTCwgJnJlcSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZvaWQgKnNlbSA7CisKKyNpZmRlZiBDQ01fREVCVUcyCisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiV05JX0NGR18lcyAoJWQgMHgleCksIGluX2ludGVycnVwdCgpPUZBTFNFXG4iKSwgZ0NmZ1BhcmFtTmFtZVtjZmdJZF0sIChpbnQpY2ZnSWQsIChpbnQpY2ZnSWQpOworI2VuZGlmCisgICAgICAgIHBhbF9sb2NhbF9iaF9kaXNhYmxlKCkgOworCisgICAgICAgIHN0YXR1cyA9IHBhbE11dGV4QWxsb2NMb2NrZWQoIGhIZGQsICZzZW0gKSA7CisgICAgICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJtdXRleCBhbGxvYyBmYWlsZWRcbiIpKTsKKyAgICAgICAgICAgIHNlbSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjZmdTZXRTdWIocE1hYywgaEhkZCwgY2ZnSWQsIHR5cGUsIGxlbmd0aCwgY2NtUHRyLCBjY21WYWx1ZSwgY2FsbGJhY2ssIHRvQmVTYXZlZCwgc2VtLCAmcmVxKTsKKyAgICAgICAgICAgIGlmICgoc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpIHx8IChyZXEgPT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9FaXRoZXIgaXQgZmFpbHMgdG8gc2VuZCBvciB0aGUgcmVxIGlzIGZpbmlzaGVkIGFscmVhZHkKKyAgICAgICAgICAgICAgICBwYWxTZW1hcGhvcmVGcmVlKCBoSGRkLCBzZW0gKTsKKyAgICAgICAgICAgICAgICBzZW0gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGFsX2xvY2FsX2JoX2VuYWJsZSgpIDsKKworICAgICAgICBpZiAoKHN0YXR1cyA9PSBlSEFMX1NUQVRVU19TVUNDRVNTKSAmJiAoc2VtICE9IE5VTEwpKQorICAgICAgICB7CisjaWZkZWYgQ0NNX0RFQlVHCisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoImNjbVdhaXRGb3JDb21wbGV0aW9uKCVwKVxuIiksIHJlcS0+ZG9uZSk7CisjZW5kaWYKKyAgICAgICAgICAgIGNjbVdhaXRGb3JDb21wbGV0aW9uKGhIZGQsIHNlbSk7CisKKyNpZmRlZiBDQ01fREVCVUcKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiZnJlZSglcClcbiIpLCByZXEtPmRvbmUpOworI2VuZGlmCisgICAgICAgICAgICBwYWxTZW1hcGhvcmVGcmVlKCBoSGRkLCBzZW0gKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzIDsKK30KKworZUhhbFN0YXR1cyBjY21PcGVuKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0SGRkSGFuZGxlIGhIZGQgPSBoYWxIYW5kbGUySGRkSGFuZGxlKGhIYWwpOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICAgKHZvaWQpcGFsWmVyb01lbW9yeShoSGRkLCAmcE1hYy0+Y2NtLCBzaXplb2YodENjbSkpIDsKKyAgICByZXR1cm4gcGFsU3BpbkxvY2tBbGxvYyhoSGRkLCAmcE1hYy0+Y2NtLmxvY2spOworfQorCitlSGFsU3RhdHVzIGNjbUNsb3NlKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0SGRkSGFuZGxlIGhIZGQgPSBoYWxIYW5kbGUySGRkSGFuZGxlKGhIYWwpOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHRBTklfVTMyIGkgOyAKKyAgICB0Q2ZnUmVxICpyZXEgOworCisgICAgY2NtU3RvcChoSGFsKTsKKworICAgIC8qIEdvIHRocnUgY29tcFtdIHRvIGZyZWUgYWxsIHNhdmVkIHJlcXVlc3RzICovCisgICAgZm9yIChpID0gMCA7IGkgPCBDRkdfUEFSQU1fTUFYX05VTSA7ICsraSkKKyAgICB7CisgICAgICAgIGlmICgocmVxID0gcE1hYy0+Y2NtLmNvbXBbaV0pICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyZWVDZmdSZXEoaEhkZCwgcmVxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwYWxTcGluTG9ja0ZyZWUoaEhkZCwgcE1hYy0+Y2NtLmxvY2spOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGluIChMaW51eCkgc29mdGlycSBjb250ZXh0ICovCit2b2lkIGNjbUNmZ0NuZk1zZ0hhbmRsZXIodEhhbEhhbmRsZSBoSGFsLCB2b2lkICptKQoreworICAgIHRIZGRIYW5kbGUgaEhkZCA9IGhhbEhhbmRsZTJIZGRIYW5kbGUoaEhhbCk7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdFNpck1iTXNnICptc2cgPSAodFNpck1iTXNnICopbSA7CisgICAgdEFOSV9VMzIgcmVzdWx0LCBjZmdJZCA7CisgICAgdENmZ1JlcSAqcmVxLCAqb2xkIDsKKworI2lmIDAKKyAgICBpZiAocE1hYy0+Y2NtLnN0YXRlICE9IGVDQ01fU1RBUlRFRCkKKyAgICB7CisgICAgICAgIHJldHVybiA7CisgICAgfQorI2VuZGlmCisKKyAgICByZXN1bHQgID0gcGFsX2JlMzJfdG9fY3B1KG1zZy0+ZGF0YVswXSk7CisgICAgY2ZnSWQgICA9IHBhbF9iZTMyX3RvX2NwdShtc2ctPmRhdGFbMV0pOworCisgICAgaWYgKHBNYWMtPmNjbS5yZXBsYXkuc3RhcnRlZCAmJiBjZmdJZCA9PSBDRkdfVVBEQVRFX01BR0lDX0RXT1JEKQorICAgIHsKKyAgICAgICAgcE1hYy0+Y2NtLnJlcGxheS5pbl9wcm9ncmVzcyA9IDEgOworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIGlmIChwTWFjLT5jY20ucmVwbGF5LmluX3Byb2dyZXNzKQorICAgIHsKKyAgICAgICAgLyogc2F2ZSBlcnJvciBjb2RlICovCisgICAgICAgIGlmICghQ0NNX0lTX1JFU1VMVF9TVUNDRVNTKHJlc3VsdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPmNjbS5yZXBsYXkucmVzdWx0ID0gcmVzdWx0IDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgtLXBNYWMtPmNjbS5yZXBsYXkubnJfcGFyYW0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+Y2NtLnJlcGxheS5pbl9wcm9ncmVzcyA9IDAgOworCisgICAgICAgICAgICBpZiAocE1hYy0+Y2NtLnJlcGxheS5jYWxsYmFjaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWFjLT5jY20ucmVwbGF5LmNhbGxiYWNrKGhIYWwsIHBNYWMtPmNjbS5yZXBsYXkucmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcE1hYy0+Y2NtLnJlcGxheS5zdGFydGVkID0gMCA7CisKKyAgICAgICAgICAgIC8qIFdha2UgdXAgdGhlIHNsZWVwaW5nIHByb2Nlc3MgKi8KKyNpZmRlZiBDQ01fREVCVUcKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiY2NtQ29tcGxldGUoJXApXG4iKSwgcE1hYy0+Y2NtLnJlcGxheS5kb25lKTsKKyNlbmRpZgorICAgICAgICAgICAgY2NtQ29tcGxldGUoaEhkZCwgcE1hYy0+Y2NtLnJlcGxheS5kb25lKTsKKyAgICAgICAgICAgIC8vTGV0IGdvIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHNldCBDRkdzIHdhaXRpbmcuCisgICAgICAgICAgICBzZW5kUXVldWVkUmVxVG9NYWNTdyhwTWFjLCBoSGRkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBUcnkgdG8gbWF0Y2ggdGhpcyByZXNwb25zZSB3aXRoIHRoZSByZXF1ZXN0LgorICAgICAgICAgKiBXaGF0IGlmIGkgY291bGQgbm90IGZpbmQgdGhlIHJlcSBlbnRyeSA/Pz8KKyAgICAgICAgICovCisgICAgICAgIHJlcSA9IHBNYWMtPmNjbS5yZXFRLmhlYWQgOworICAgICAgICBpZiAocmVxKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmIChyZXEtPmNmZ0lkID09IGNmZ0lkICYmIHJlcS0+c3RhdGUgPT0gZUNDTV9SRVFfU0VOVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxTcGluTG9ja1Rha2UoaEhkZCwgcE1hYy0+Y2NtLmxvY2spOworICAgICAgICAgICAgICAgIGRlbF9yZXEocmVxLCAmcE1hYy0+Y2NtLnJlcVEpOworICAgICAgICAgICAgICAgIHBhbFNwaW5Mb2NrR2l2ZShoSGRkLCBwTWFjLT5jY20ubG9jayk7CisgICAgICAgICAgICAgICAgcmVxLT5zdGF0ZSA9IGVDQ01fUkVRX0RPTkUgOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBXTklfQ0ZHX05FRURfUkVTVEFSVCB8fAorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPT0gV05JX0NGR19ORUVEX1JFTE9BRCkKKyAgICAgICAgICAgICAgICB7CisjaWZkZWYgQ0NNX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgibmVlZCByZXN0YXJ0L3JlbG9hZCwgY2ZnSWQ9JWRcbiIpLCByZXEtPmNmZ0lkKSA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLy9wdXJnZVJlcVEoaEhhbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogaW52b2tlIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgaWYgKHJlcS0+Y2FsbGJhY2spCisgICAgICAgICAgICAgICAgeworI2lmZGVmIENDTV9ERUJVRworICAgICAgICAgICAgICAgICAgICByZXEtPmNhbGxiYWNrKGhIYWwsIGNmZ0lkKSA7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICByZXEtPmNhbGxiYWNrKGhIYWwsIHJlc3VsdCkgOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogV2FrZSB1cCB0aGUgc2xlZXBpbmcgcHJvY2VzcyAqLworI2lmZGVmIENDTV9ERUJVRworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiY2ZnSWQ9JWxkLCBjYWxsaW5nIGNjbUNvbXBsZXRlKCVwKVxuIiksIGNmZ0lkLCByZXEtPmRvbmUpOworI2VuZGlmCisgICAgICAgICAgICAgICAgY2NtQ29tcGxldGUoaEhkZCwgcmVxLT5kb25lKTsKKworICAgICAgICAgICAgICAgIC8qIG1vdmUgdGhlIGNvbXBsZXRlZCByZXEgZnJvbSByZXFRIHRvIGNvbXBbXSAqLworICAgICAgICAgICAgICAgIGlmIChyZXEtPnRvQmVTYXZlZCAmJiAoQ0NNX0lTX1JFU1VMVF9TVUNDRVNTKHJlc3VsdCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChvbGQgPSBwTWFjLT5jY20uY29tcFtjZmdJZF0pICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVDZmdSZXEoaEhkZCwgb2xkKSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+Y2NtLmNvbXBbY2ZnSWRdID0gcmVxIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUNmZ1JlcShoSGRkLCByZXEpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VuZFF1ZXVlZFJlcVRvTWFjU3cocE1hYywgaEhkZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCBGTCgiY2FuIG5vdCBtYXRjaCBSU1Agd2l0aCBSRVEsIHJzcGNmZ2lkPSVkIHJlc3VsdD0lZCByZXFjZmdpZD0lZCByZXFzdGF0ZT0lZFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWNmZ0lkLCAoaW50KXJlc3VsdCwgcmVxLT5jZmdJZCwgcmVxLT5zdGF0ZSk7CisKKyNpZmRlZiBDQ01fREVCVUcKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoImNjbUNvbXBsZXRlKCVwKVxuIiksIHJlcS0+ZG9uZSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBjY21TdGFydCh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICBwTWFjLT5jY20uc3RhdGUgPSBlQ0NNX1NUQVJURUQgOworCisjaWYgZGVmaW5lZChBTklfTE9HRFVNUCkKKyAgICBjY21EdW1wSW5pdChoSGFsKTsKKyNlbmRpZiAvLyNpZiBkZWZpbmVkKEFOSV9MT0dEVU1QKQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBjY21TdG9wKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIHBNYWMtPmNjbS5zdGF0ZSA9IGVDQ01fU1RPUFBFRCA7CisKKyAgICBwYWxfbG9jYWxfYmhfZGlzYWJsZSgpIDsKKyAgICBwdXJnZVJlcVEoaEhhbCk7CisgICAgcGFsX2xvY2FsX2JoX2VuYWJsZSgpIDsKKworICAgIHJldHVybiA7Cit9CisKK2VIYWxTdGF0dXMgY2NtQ2ZnU2V0SW50KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgY2ZnSWQsIHRBTklfVTMyIGNjbVZhbHVlLCB0Q2NtQ2ZnU2V0Q2FsbGJhY2sgY2FsbGJhY2ssIGVBbmlCb29sZWFuIHRvQmVTYXZlZCkKK3sKKyAgICBpZiggY2FsbGJhY2sgfHwgdG9CZVNhdmVkKQorICAgIHsKKyAgICAgICAgLy93ZSBuZWVkIHRvIHN5Y2hyb25vdXMgdGhpcyBvbmUKKyAgICAgICAgcmV0dXJuIGNmZ1NldChoSGFsLCBjZmdJZCwgQ0NNX0lOVEVHRVJfVFlQRSwgc2l6ZW9mKHRBTklfVTMyKSwgTlVMTCwgY2NtVmFsdWUsIGNhbGxiYWNrLCB0b0JlU2F2ZWQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL1NpbXBseSBwdXNoIHRvIENGRyBhbmQgbm90IHdhaXRpbmcgZm9yIHRoZSByZXNwb25zZQorICAgICAgICB0Q2ZnUmVxIHJlcTsKKyAgICAgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICAgICAgcmVxLmNhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgcmVxLm5leHQgPSBOVUxMOworICAgICAgICByZXEuY2ZnSWQgPSAoIHRBTklfVTE2ICljZmdJZDsKKyAgICAgICAgcmVxLmxlbmd0aCA9IHNpemVvZiggdEFOSV9VMzIgKTsKKyAgICAgICAgcmVxLnR5cGUgPSBDQ01fSU5URUdFUl9UWVBFOworICAgICAgICByZXEuY2NtUHRyID0gTlVMTDsKKyAgICAgICAgcmVxLmNjbVZhbHVlID0gY2NtVmFsdWU7CisgICAgICAgIHJlcS50b0JlU2F2ZWQgPSB0b0JlU2F2ZWQ7CisgICAgICAgIHJlcS5zdGF0ZSA9IGVDQ01fUkVRX1NFTlQ7CisKKyAgICAgICAgcmV0dXJuICggc2VuZENmZyggcE1hYywgcE1hYy0+aEhkZCwgJnJlcSwgZUFOSV9CT09MRUFOX0ZBTFNFICkgKTsKKyAgICB9Cit9CisKK2VIYWxTdGF0dXMgY2NtQ2ZnU2V0U3RyKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgY2ZnSWQsIHRBTklfVTggKnBTdHIsIHRBTklfVTMyIGxlbmd0aCwgdENjbUNmZ1NldENhbGxiYWNrIGNhbGxiYWNrLCBlQW5pQm9vbGVhbiB0b0JlU2F2ZWQpCit7CisgICAgaWYoIGNhbGxiYWNrIHx8IHRvQmVTYXZlZCApCisgICAgeworICAgICAgICAvL3dlIG5lZWQgdG8gc3ljaHJvbm91cyB0aGlzIG9uZQorICAgICAgICByZXR1cm4gY2ZnU2V0KGhIYWwsIGNmZ0lkLCBDQ01fU1RSSU5HX1RZUEUsIGxlbmd0aCwgcFN0ciwgMCwgY2FsbGJhY2ssIHRvQmVTYXZlZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vU2ltcGx5IHB1c2ggdG8gQ0ZHIGFuZCBub3Qgd2FpdGluZyBmb3IgdGhlIHJlc3BvbnNlCisgICAgICAgIHRDZmdSZXEgcmVxOworICAgICAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgICAgICByZXEuY2FsbGJhY2sgPSBOVUxMOworICAgICAgICByZXEubmV4dCA9IE5VTEw7CisgICAgICAgIHJlcS5jZmdJZCA9ICggdEFOSV9VMTYgKWNmZ0lkOworICAgICAgICByZXEubGVuZ3RoID0gbGVuZ3RoOworICAgICAgICByZXEudHlwZSA9IENDTV9TVFJJTkdfVFlQRTsKKyAgICAgICAgcmVxLmNjbVB0ciA9IHBTdHI7CisgICAgICAgIHJlcS5jY21WYWx1ZSA9IDA7CisgICAgICAgIHJlcS50b0JlU2F2ZWQgPSB0b0JlU2F2ZWQ7CisgICAgICAgIHJlcS5zdGF0ZSA9IGVDQ01fUkVRX1NFTlQ7CisKKyAgICAgICAgcmV0dXJuICggc2VuZENmZyggcE1hYywgcE1hYy0+aEhkZCwgJnJlcSwgZUFOSV9CT09MRUFOX0ZBTFNFICkgKTsKKyAgICB9Cit9CisKK2VIYWxTdGF0dXMgY2NtQ2ZnR2V0SW50KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgY2ZnSWQsIHRBTklfVTMyICpwVmFsdWUpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTIDsKKyAgICB0Q2ZnUmVxICpyZXEgPSBwTWFjLT5jY20uY29tcFtjZmdJZF0gOworCisgICAgaWYgKHJlcSAmJiByZXEtPnN0YXRlID09IGVDQ01fUkVRX0RPTkUpCisgICAgeworICAgICAgICAqcFZhbHVlID0gcmVxLT5jY21WYWx1ZSA7IAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgKHRBTklfVTE2KWNmZ0lkLCBwVmFsdWUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1cyA7Cit9CisKK2VIYWxTdGF0dXMgY2NtQ2ZnR2V0U3RyKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgY2ZnSWQsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyICpwTGVuZ3RoKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHRIZGRIYW5kbGUgaEhkZCA9IGhhbEhhbmRsZTJIZGRIYW5kbGUoaEhhbCk7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTIDsKKyAgICB0Q2ZnUmVxICpyZXEgPSBwTWFjLT5jY20uY29tcFtjZmdJZF0gOworCisgICAgaWYgKHJlcSAmJiByZXEtPnN0YXRlID09IGVDQ01fUkVRX0RPTkUgJiYgKHRBTklfVTMyKXJlcS0+bGVuZ3RoIDw9ICpwTGVuZ3RoKQorICAgIHsKKyAgICAgICAgKnBMZW5ndGggPSByZXEtPmxlbmd0aCA7IAorICAgICAgICBwYWxDb3B5TWVtb3J5KGhIZGQsICh2b2lkKilwQnVmLCAodm9pZCopcmVxLT5jY21QdHIsIHJlcS0+bGVuZ3RoKTsgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLCAodEFOSV9VMTYpY2ZnSWQsIHBCdWYsIHBMZW5ndGgpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1cyA7Cit9CisKKy8qCisgKiBMb29wIHRocnUgY29tcFtdIGFuZCBmb3JtIGFuIEFOSSBtZXNzYWdlIHdoaWNoIGNvbnRhaW5zIGFsbCBjb21wbGV0ZWQgY2ZnSWRzLgorICogVGhlIG1lc3NhZ2UgYmVnaW5zIHdpdGggYW4gSU5URUdFUiBwYXJhbWV0ZXIgKGNmZ0lkPUNGR19VUERBVEVfTUFHSUNfRFdPUkQpICAgICAKKyAqIHRvIG1hcmsgdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlLgorICovIAorc3RhdGljIGVIYWxTdGF0dXMgY2ZnVXBkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRIZGRIYW5kbGUgaEhkZCwgdENjbUNmZ1NldENhbGxiYWNrIGNhbGxiYWNrKQoreworICAgIHRBTklfVTMyIGksICpwbCA7CisgICAgdENmZ1JlcSAqcmVxIDsKKyAgICB0U2lyTWJNc2cgKm1zZyA7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgOworICAgIHRBTklfUzE2IG1zZ0xlbiA9IDQgKyAgICAgICAvKiA0IGJ5dGVzIGZvciBtc2cgaGVhZGVyICovIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgQ0ZHX1VQREFURV9NQUdJQ19EV09SRCAqLyAKKyAgICAgICAgQ0ZHT0JKX0lEX1NJWkUgKworICAgICAgICBDRkdPQkpfTEVOX1NJWkUgKworICAgICAgICBDRkdPQkpfSU5URUdFUl9WQUxVRV9TSVpFIDsKKworICAgIGlmIChwTWFjLT5jY20uc3RhdGUgPT0gZUNDTV9TVE9QUEVEIHx8IHBNYWMtPmNjbS5yZXBsYXkuc3RhcnRlZCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkUgOworICAgICAgICBnb3RvIGVuZCA7CisgICAgfQorCisgICAgcGFsU3BpbkxvY2tUYWtlKGhIZGQsIHBNYWMtPmNjbS5sb2NrKTsKKworICAgIHBNYWMtPmNjbS5yZXBsYXkuc3RhcnRlZCAgICA9IDEgOworICAgIHBNYWMtPmNjbS5yZXBsYXkubnJfcGFyYW0gICA9IDAgOworCisgICAgcGFsU3BpbkxvY2tHaXZlKGhIZGQsIHBNYWMtPmNjbS5sb2NrKTsKKworICAgIC8qIENhbGN1bGF0ZSBtZXNzYWdlIGxlbmd0aCAqLworICAgIGZvciAoaSA9IDAgOyBpIDwgQ0ZHX1BBUkFNX01BWF9OVU0gOyArK2kpCisgICAgeworICAgICAgICBpZiAoKHJlcSA9IHBNYWMtPmNjbS5jb21wW2ldKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBtc2dMZW4gKz0gKHRBTklfUzE2KShDRkdPQkpfSURfU0laRSArIENGR09CSl9MRU5fU0laRSArIENGR09CSl9BTElHTihyZXEtPmxlbmd0aCkpIDsKKyAgICAgICAgICAgIHBNYWMtPmNjbS5yZXBsYXkubnJfcGFyYW0gKz0gMSA7CisjaWZkZWYgQ0NNX0RFQlVHCisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoImNmZ0lkPSVkXG4iKSwgcmVxLT5jZmdJZCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwTWFjLT5jY20ucmVwbGF5Lm5yX3BhcmFtID09IDApCisgICAgeworICAgICAgICBpZiAoY2FsbGJhY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhbGxiYWNrKCh0SGFsSGFuZGxlKXBNYWMsIFdOSV9DRkdfU1VDQ0VTUykgOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgOworICAgICAgICBnb3RvIGVuZCA7CisgICAgfQorCisgICAgcE1hYy0+Y2NtLnJlcGxheS5pbl9wcm9ncmVzcyA9IDAgOworICAgIHBNYWMtPmNjbS5yZXBsYXkucmVzdWx0ICAgICAgPSBXTklfQ0ZHX1NVQ0NFU1MgOworICAgIHBNYWMtPmNjbS5yZXBsYXkuY2FsbGJhY2sgICAgPSBjYWxsYmFjayA7CisgICAgcE1hYy0+Y2NtLnJlcGxheS5kb25lICAgICAgICA9IE5VTEwgOworCisgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoaEhkZCwgKHZvaWQgKiopJm1zZywgbXNnTGVuKSA7CisgICAgaWYgKHN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcE1hYy0+Y2NtLnJlcGxheS5zdGFydGVkID0gMCA7CisgICAgICAgIGdvdG8gZW5kIDsgCisgICAgfQorCisgICAgbXNnLT50eXBlICAgPSBwYWxfY3B1X3RvX2JlMTYoV05JX0NGR19TRVRfUkVRKTsKKyAgICBtc2ctPm1zZ0xlbiA9IHBhbF9jcHVfdG9fYmUxNihtc2dMZW4pOworCisgICAgLyogRW5jb2RlIHRoZSBzdGFydGluZyBjZmdJZCAqLworICAgIHBsID0gZW5jb2RlQ2ZnUmVxKGhIZGQsIG1zZy0+ZGF0YSwgQ0ZHX1VQREFURV9NQUdJQ19EV09SRCwgNCwgTlVMTCwgMCwgQ0NNX0lOVEVHRVJfVFlQRSkgOworCisgICAgLyogRW5jb2RlIHRoZSBzYXZlZCBjZmcgcmVxdWVzdHMgKi8KKyAgICBmb3IgKGkgPSAwIDsgaSA8IENGR19QQVJBTV9NQVhfTlVNIDsgKytpKQorICAgIHsKKyAgICAgICAgaWYgKChyZXEgPSBwTWFjLT5jY20uY29tcFtpXSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcGwgPSBlbmNvZGVDZmdSZXEoaEhkZCwgcGwsIHJlcS0+Y2ZnSWQsIHJlcS0+bGVuZ3RoLCByZXEtPmNjbVB0ciwgcmVxLT5jY21WYWx1ZSwgcmVxLT50eXBlKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBwYWxTZW5kTUJNZXNzYWdlKGhIZGQsIG1zZykgOworICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgicGFsU2VuZE1CTWVzc2FnZSgpIGZhaWxlZC4gc3RhdHVzPSVkXG4iKSwgc3RhdHVzKTsKKyAgICAgICAgcE1hYy0+Y2NtLnJlcGxheS5zdGFydGVkID0gMCA7CisgICAgICAgIC8vTm8gbmVlZCB0byBmcmVlIG1zZy4gcGFsU2VuZE1CTWVzc2FnZSBmcmVlcyBpdC4KKyAgICAgICAgZ290byBlbmQgOworICAgIH0KKworIGVuZDoKKyAgICByZXR1cm4gc3RhdHVzIDsKK30KKworZUhhbFN0YXR1cyBjY21DZmdVcGRhdGUodEhhbEhhbmRsZSBoSGFsLCB0Q2NtQ2ZnU2V0Q2FsbGJhY2sgY2FsbGJhY2spCit7CisgICAgdEhkZEhhbmRsZSBoSGRkID0gaGFsSGFuZGxlMkhkZEhhbmRsZShoSGFsKTsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA7CisKKyAgICBwYWxfbG9jYWxfYmhfZGlzYWJsZSgpIDsKKworICAgIHN0YXR1cyA9IGNmZ1VwZGF0ZShwTWFjLCBoSGRkLCBjYWxsYmFjaykgOworICAgIGlmIChzdGF0dXMgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGlmIChwTWFjLT5jY20ucmVwbGF5Lm5yX3BhcmFtID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHRoZXJlIGlzIG5vdGhpbmcgc2F2ZWQgYXQgY29tcFtdLCBzbyB3ZSBhcmUgZG9uZSEgKi8KKyAgICAgICAgICAgIHBNYWMtPmNjbS5yZXBsYXkuc3RhcnRlZCA9IDAgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2UgaGF2ZSBzZW50IHVwZGF0ZSBtZXNzYWdlIHRvIE1BQyBTVyAqLworICAgICAgICAgICAgdm9pZCAqc2VtIDsKKworICAgICAgICAgICAgc3RhdHVzID0gcGFsTXV0ZXhBbGxvY0xvY2tlZCggaEhkZCwgJnNlbSApIDsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIm11dGV4IGFsbG9jIGZhaWxlZFxuIikpOworICAgICAgICAgICAgICAgIHBNYWMtPmNjbS5yZXBsYXkuc3RhcnRlZCA9IDAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBNYWMtPmNjbS5yZXBsYXkuZG9uZSA9IHNlbSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYWxfbG9jYWxfYmhfZW5hYmxlKCkgOworCisgICAgLyogV2FpdGluZyBoZXJlIC4uLiAqLworICAgIGlmIChzdGF0dXMgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyAmJiBwTWFjLT5jY20ucmVwbGF5LmRvbmUpCisgICAgeworI2lmZGVmIENDTV9ERUJVRworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoImNjbVdhaXRGb3JDb21wbGV0aW9uKCVwKVxuIiksIHBNYWMtPmNjbS5yZXBsYXkuZG9uZSk7CisjZW5kaWYKKyAgICAgICAgY2NtV2FpdEZvckNvbXBsZXRpb24oaEhkZCwgcE1hYy0+Y2NtLnJlcGxheS5kb25lKTsKKworI2lmZGVmIENDTV9ERUJVRworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoImZyZWUoJXApXG4iKSwgcE1hYy0+Y2NtLnJlcGxheS5kb25lKTsKKyNlbmRpZgorICAgICAgICBwYWxTZW1hcGhvcmVGcmVlKCBoSGRkLCBwTWFjLT5jY20ucmVwbGF5LmRvbmUpIDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzIDsKK30KKworI2lmIDAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICogaGRkX2RldltdOworCit0eXBlZGVmIHN0cnVjdCBwYWxfbmV0ZGV2X3ByaXZfcworeworICAgIC8vIHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRldmljZQorICAgIHN0cnVjdCBwY2lfZGV2ICAqcGNpX2RldjsKKworICAgIC8vIFRBVVJVUyBoYXMgdGhyZWUgQkFSIHJlZ2lzdGVycworCisgICAgLy8gQkFSMCBpcyBhIGZpeGVkIHdpbmRvdyBmb3IgdGhlIFBJRiByZWdpc3RlcnMKKyAgICB2b2xhdGlsZSB2b2lkICp3aW4wX2FkZHI7CisgICAgdEFOSV9VMzIgd2luMF9zaXplOworCisgICAgLy8gQkFSMSBpcyBhIG1vdmFibGUgd2luZG93IGZvciBhbGwgb3RoZXIgcmVnaXN0ZXJzCisgICAgdm9sYXRpbGUgdm9pZCAqd2luMV9hZGRyOworICAgIHRBTklfVTMyIHdpbjFfc2l6ZTsKKyAgICB0QU5JX1UzMiB3aW4xX2N1cnJlbnQ7CisKKyAgICAvLyBCQVIyIGlzIGEgbW92YWJsZSB3aW5kb3cgZm9yIGFsbCBvdGhlciBtZW1vcnkKKyAgICB2b2xhdGlsZSB2b2lkICp3aW4yX2FkZHI7CisgICAgdEFOSV9VMzIgd2luMl9zaXplOworICAgIHRBTklfVTMyIHdpbjJfY3VycmVudDsKKworCit9IHBhbF9uZXRkZXZfcHJpdl90OworCit0eXBlZGVmIHN0cnVjdCBoZGRfc3RhdHNfcyB7CisgICAgLyogU3RhdHMgb24gdGhlIE1BQyBTVyBtZXNzYWdlcyBzZW50IHRvIGFwcGxpY2F0aW9ucyAqLworICAgIHVsb25nIHN0YXRzX21hY19yeF9tYnhfdG90X2NudDsKKyAgICB1bG9uZyBzdGF0c19tYWNfcnhfbWJ4X3N1Y2Nlc3NfY250OworICAgIHVsb25nIHN0YXRzX21hY19yeF9tYnhfZHJvcF9jbnQ7CisKKyAgICAvKiBTdGF0cyBvbiBtZXNzYWdlcyBzZW50IHRvIHRoZSBNQUMgU1cgbWVzc2FnZXMgZnJvbSBhcHBsaWNhdGlvbnMgKi8KKyAgICB1bG9uZyBzdGF0c19tYWNfdHhfbWJ4X3RvdF9jbnQ7CisgICAgdWxvbmcgc3RhdHNfbWFjX3R4X21ieF9zdWNjZXNzX2NudDsKKyAgICB1bG9uZyBzdGF0c19tYWNfdHhfbWJ4X2Ryb3BfY250OworfSBoZGRfc3RhdHNfdDsKKworLyogSEREIERyaXZlciBQcml2YXRlIERhdGEgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBoZGRfbmV0ZGV2X3ByaXZfcworeworICAgIHRBTklfVTMyIG1hZ2ljX2hlYWQ7CisKKyAgICAvLyBjaGlwc2V0LXNwZWNpZmljIHByaXZhdGUgZGF0YQorICAgIHBhbF9uZXRkZXZfcHJpdl90IEFOSV9DSElQU0VUOworCisgICAgdEhhbEhhbmRsZSBoYWxIYW5kbGU7CisKKyNpZmRlZiBBTklfQlVTX1RZUEVfUENJCisgICAgc3RydWN0IHBjaV9kZXYgICpwY2lfZGV2OworICAgIHN0cnVjdCBwY2lfZGV2aWNlX2lkICogcFBjaURldklkOworI2VuZGlmIC8vIEFOSV9CVVNfVFlQRV9QQ0kKKworICAgIC8vIFF1ZXVlZCBFQVBPTCBmcmFtZSBkZXN0aW5hdGlvbi4KKyAgICB0QU5JX1UzMiBlYXBvbF9waWQ7CisKKyAgICB1bnNpZ25lZCBpbnQgbnVtX3htaXQ7CisKKyAgICAvKgorICAgICAqIFZhcmlvdXMgZnJlcXVlbnRseSB1c2VkIHZhcmlhYmxlcyB0aGF0IHBlcnRhaW4gdG8gdGhpcworICAgICAqIGluc3RhbmNlIG9mIHRoZSBkcml2ZXIKKyAgICAgKi8KKyAgICB0QU5JX1UzMiByeF9idWZfc3o7ICAgICAgICAgICAvKiBCYXNlZCBvbiBNVFUrZXh0cmEgaGVhZHJvb20gbmVlZGVkLiovCisgICAgdEFOSV9VMzIgdGRfZW5xdWV1ZV9uZXN0ZWQ7CisKKyAgICAvKgorICAgICAqIEZsYWcgc2V0IGJ5IE1BQyBTVyB0byBpbmRpY2F0ZSBhIFREIHJpbmcgaXMgZGVzaXJlZAorICAgICAqLworICAgIGludCB0ZF9mbHVzaDsKKworICAgIGludCBzZWxlY3RpdmVGbHVzaDsKKworICAgIHNwaW5sb2NrX3QgbG9jazsKKworICAgIC8qIFN0YXRzICovCisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgaW50IGN1cnJfYWNjX2NhdDsKKyNpZmRlZiBMWDUyODAKKyAgICB1bnNpZ25lZCBzaG9ydCBydGxfcHZpZDsgLy9WTEFOIGlkIHRoaXMgSW50ZXJmYWNlIGJlbG9uZ3MgdG8KKyAgICBpbnQgcnRsX2V4dFBvcnROdW07IC8vZXh0IHBvcnQgdXNlZCBpbiBSVEw4NjV4IGRyaXZlcgorICAgIGludCBydGxfbGlua0lkWzE2XTsvL2xpbmsgSUQgb2YgZWFjaCBpbnRlcmZhY2UgZm9yIFJUTDg2NXggZHJpdmVyCisgICAgaW50IHJ0bF93ZHNBY3RpdmU7CisjZW5kaWYKKyAgICB0QU5JX1UxNiBscG9ydDsgLyogc3dpdGNoIGxvZ2ljYWwgcG9ydCAqLworCisgICAgLyogbWFuYWdlbWVudCBhbmQgY29udHJvbCAqLworICAgIHRBTklfVTMyIHN0YXR1czsKKyAgICB0QU5JX1UzMiBtc2dfZW5hYmxlOworICAgIHRBTklfVTMyIHJhZGlvX2lkOyAgICAgICAgICAgICAgICAgIC8qIFVuaXQgIyBvZiB0aGlzIGRldmljZSAqLworCisgICAgaW50IGFwX2ZsYWc7ICAgICAgICAgICAgICAgICAgICAgICAgLyogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW5kaWNhdGVzIGlmIHRoZSBSYWRpbyBpcyBpbiBBUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBvciBCUCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgLyogTkFQSSBQb2xsaW5nIHN1cG9ydCAqLworICAgIHN0cnVjdCB0aW1lcl9saXN0IG9vbV90aW1lcjsgICAgLyogT3V0IG9mIG1lbW9yeSB0aW1lci4gICAgKi8KKworICAgIHN0cnVjdCB0aW1lcl9saXN0IHJlc2V0X3JlcV90aW1lcjsvKiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVGltZXIgc3RhcnRlZCB3aGVuIGEgUmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVxdWVzdCBpcyBzZW50IHRvIFdTTS4gQ2xlYXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aGVuIGEgc3Vic2VxdWVudCBSYWRpbyBEaXNhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJlcXVlc3QgaXMgcmVjZWl2ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgc3RydWN0IHRhc2tsZXRfc3RydWN0ICpyeF90YXNrbGV0OworICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdHhfdGFza2xldDsKKyAgICAgICAKKyAgICB0QU5JX1UzMiBsZWFybl9tb2RlX2ZyYW1lX2NudDsgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIERhdGEgRnJhbWVzIGZvcndhcmRlZCB0byBNQUMgU1cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aGVuIFBvbGFyaXMgaXMgaW4gbGVhcm4gbW9kZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIHRBTklfVTMyIG1nbXRfY3RsX2ZyYW1lczsgICAgICAgICAgIC8qIE1HTVQvQ1RMIEZyYW1lcyBmb3J3YXJkZWQgdG8gTUFDIFNXICovCisKKyAgICB0QU5JX1UzMiBuaXI7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIElTUiBoYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWVuIGludm9rZWQuKi8KKyAgICB0QU5JX1UzMiBzdGF0c19kdW1teV9wa3RfcmVxdWV1ZV9jbnQ7CisgICAgdEFOSV9VMzIgc3RhdHNfcnhfdGRfZHVtbXlfcGt0X2NudDsvKiBURCBEdW1teSBwa3RzIHRoYXQgd2VyZSBhZnRlciBISUYgbG9vcGJhY2sgKi8KKyAgICB0QU5JX1UzMiBzdGF0c19yeF90bV9kdW1teV9wa3RfY250Oy8qIFRNIER1bW15IHBrdHMgdGhhdCB3ZXJlIGFmdGVyIEhJRiBsb29wYmFjayAqLworICAgIHRBTklfVTMyIHN0YXRzX3RkX2R1bW15X3BrdF9jbnQ7ICAgIC8qIER1bW15IHBrdHMgdGhhdCB3ZXJlIHN1Y2Nlc2Z1bGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcHV0IG9uIHRoZSBURCByaW5nIGFuZCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2VyZSBwaWNrZWQgdXAgYnkgdGhlIEhJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgdEFOSV9VMzIgc3RhdHNfbWFjX2R1bW15X3BrdF9kcm9wX2NudDsvKiBOdW1iZXIgb2YgZHVtbXkgcGt0cyBkcm9wcGVkIGJ5IHRoZSBIREQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGR1ZSB0byBhbnkgcmVhc29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0QU5JX1UzMiBzdGF0c193bnNfbDJ1cGRhdGVfY250OyAKKyAgICB0QU5JX1UzMiBzdGF0c19hcHBfaGlmX3dyX3BrdF9jbnQ7CisgICAgaGRkX3N0YXRzX3QgaGRkX3N0YXRzOworCisgICAgdEFOSV9VMzIgc3RhdHNfcmVzZXRfcmVxX3RpbWVyX2NudDsgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBOdW1iZXIgb2YgdGltZXMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IFJlcSBUaW1lciBleHBpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZmRlZiBUQ1BfUFJPRklMRQorICAgIHVuc2lnbmVkIGludCBwdl9jdXJyZW50X2lwX3Byb3RvOworICAgIHVuc2lnbmVkIGludCBwdl9jdXJyZW50X2lwX2J5dGU7CisgICAgdW5zaWduZWQgaW50IHB2X2N1cnJlbnRfYWNrX3NlcTsKKyAgICB1bnNpZ25lZCBpbnQgcHZfY3VycmVudF9zZXE7CisgICAgdW5zaWduZWQgaW50IHB2X3J0dDsKKyAgICB1bnNpZ25lZCBpbnQgcHZfc2VudF9zZXE7CisgICAgdW5zaWduZWQgaW50IHB2X3BfdHM7CisgICAgdW5zaWduZWQgaW50IHB2X3RmcGxfdHM7CisjZW5kaWYKKyAgICB0QU5JX1UzMiBzdGF0c19tYWNfcmVzZXRfY250OyAgICAgICAgIC8qIE1BQyBTVyBSZXNldCBSZXF1ZXN0cyAqLworICAgIHRBTklfVTMyIHN0YXRzX21hY19yZXNldF9lb2Zfc29mOworICAgIHRBTklfVTMyIHN0YXRzX21hY19yZXNldF9ibXU7CisgICAgdEFOSV9VMzIgc3RhdHNfbWFjX3Jlc2V0X3BkdV9sb3c7CisgICAgdEFOSV9VMzIgc3RhdHNfbWFjX3Jlc2V0X3VzZXI7CisgICAgdEFOSV9VMzIgc3RhdHNfbWFjX3Jlc2V0X3dkX3RpbWVvdXQ7CisgICAgdEFOSV9VMzIgc3RhdHNfbWFjX3Jlc2V0X3Vuc3BlY2lmaWVkOworCisgICAgdEFOSV9VMzIgc3RhdHNfd2RfdGltZW91dF9jbnQ7CisgICAgdEFOSV9VMzIgc3RhdHNfcmFkaW9fZW5hYmxlX2NudDsKKyAgICB0QU5JX1UzMiBzdGF0c19yYWRpb19kaXNhYmxlX2NudDsKKworI2lmZGVmIFBMTV9FWFRSQV9TVEFUUworICAgIHRBTklfVTMyIHN0YXRzX3R4X3htaXRfcmVmaWxsZWQ7ICAgICAgICAgLyogUGt0cyB4bWl0LWZpbGxlZCAqLworICAgIHRBTklfVTMyIHN0YXRzX3R4X3F1ZXVlX3N0b3A7CisgICAgdEFOSV9VMzIgc3RhdHNfdHhfcXVldWVfc3RhcnQ7CisKKyAgICB0QU5JX1UzMiBzdGF0c19hbGxvY19mYWlsOworICAgIHRBTklfVTMyIHN0YXRzX3BvbGxfc3RhcnRzOworICAgIHRBTklfVTMyIHN0YXRzX3BvbGxfcGt0czsKKyAgICB0QU5JX1UzMiBzdGF0c19wb2xsX2V4aXRfZG9uZTsKKyAgICB0QU5JX1UzMiBzdGF0c19wb2xsX2V4aXRfbm90X2RvbmU7CisgICAgdEFOSV9VMzIgc3RhdHNfcG9sbF9leGl0X29vbTsKKyAgICB0QU5JX1UzMiBzdGF0c19wb2xsX2V4aXRfZG9uZV9yeF9wZW5kaW5nOworICAgIHRBTklfVTMyIHN0YXRzX3BvbGxfemVyb19yeDsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjaWZkZWYgQU5JX1VTRV9UQVNLTEVUCisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2RyaXZlcl9kaXI7IC8vIGZvciAvcHJvYy9uZXQvZHJpdmVycworI2VuZGlmCisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudF9kaXI7ICAgIC8vIGZvciB0aGUgZGlyZWN0b3J5IGl0c2VsZgorCisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudF9zdGF0czsKKyAgICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZW50X25wX2R1bXA7CisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudF9yaW5nOworICAgIGNoYXIgcHJvY19mbmFtZV9zdGF0c1szMl07CisgICAgY2hhciBwcm9jX2ZuYW1lX25wX2R1bXBbMzJdOworICAgIGNoYXIgcHJvY19mbmFtZV9yaW5nWzMyXTsKKworICAgIC8qIFNldHRpbmcgRGVidWcgbGV2ZWxzICovCisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICogcHJvY19lbnRfZGJnOworICAgIGNoYXIgcHJvY19mbmFtZV9kYmdbMzJdOworCisgICAgLyogRm9yIGJ5cGFzcyBmbGFncyAqLworICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIHByb2NfZW50X2J5cGFzczsKKyAgICBjaGFyIHByb2NfZm5hbWVfYnlwYXNzWzMyXTsKKworICAgIGludCBzaXJfZHVtcF9jbWQ7ICAgLy8gRHVtcCBTSVIgY29tbWFuZAorICAgIGludCBzaXJfZHVtcF9hcmcxOyAgLy8gRHVtcCBTSVIgYXJndW1lbnQgMQorICAgIGludCBzaXJfZHVtcF9hcmcyOyAgLy8gRHVtcCBTSVIgYXJndW1lbnQgMgorICAgIGludCBzaXJfZHVtcF9hcmczOyAgLy8gRHVtcCBTSVIgYXJndW1lbnQgMworICAgIGludCBzaXJfZHVtcF9hcmc0OyAgLy8gRHVtcCBTSVIgYXJndW1lbnQgNAorICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIHByb2NfZW50X3Npcl9kdW1wOworICAgIGNoYXIgcHJvY19mbmFtZV9zaXJfZHVtcFszMl07CisKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA7CisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICogcHJvY19lbnRfZWVwcm9tX2luZm87CisgICAgY2hhciBwcm9jX2ZuYW1lX2VlcHJvbV9pbmZvWzMyXTsKKworI2VuZGlmICAvKiBpZmRlZiBDT05GSUdfUFJPQ19GUyAqLworCisgICAgdEFOSV9VMzIgcnhfc21hbGxfc2tiX2ZhaWx1cmU7CisKKyAgICB1bnNpZ25lZCBsb25nIG9wZW5fdGltZTsgLyogamlmZmllcyBmb3IgbGFzdCBvcGVuICovCisjZW5kaWYgLyogUExNX0VYVFJBX1NUQVRTICovCisKKyAgICBpbnQgbWFjX2Rvd247CisgICAgdEFOSV9VMzIgcnhfbWFjX21zZ19jbnQ7CisgICAgdEFOSV9VMzIgdHhfbWFjX21zZ19jbnQ7CisKKyAgICBpbnQgbWJ4X3NlbnQ7CisKKyAgICB0QU5JX1UzMiBieXBhc3M7ICAgICAgICAgICAgICAgICAgICAvLyBVc2VkIHRvIHZhcmlvdXMgdHlwZXMgb2YgYnlwYXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgZHJpdmVyCisKKyAgICAvKiAKKyAgICAgKiB0aGlzIHRhYmxlIGlzIGluaXRpYWxpemVkIG9uY2UgZm9yIGFsbCBieSBwb2xkcnYgYW5kIHNvIGlzIG5vdCBpbiAKKyAgICAgKiBtYWNfcGFyYW0gc3RydWN0IAorICAgICAqLworICAgIHRfbWFjX2Jsb2NrX3RhYmxlICogbWFjX2Jsb2NrX3RhYmxlOworICAgIHN0cnVjdCBza19idWZmX2hlYWQgbWFjX2xpc3Q7CisjaWYgIGRlZmluZWQoQVNJQ0RYRV9QUk9GSUxFKSAmJiBkZWZpbmVkKExYNTI4MCkKKyAgICB0QU5JX1UzMiBudW1fb2ZfcmVnX3N3aXRjaGVzOworI2VuZGlmCisgICAgdEFOSV9VMzIgbWFnaWNfdGFpbDsKK30gaGRkX25ldGRldl9wcml2X3Q7CisKK3N0YXRpYyB2b2lkIGNjbV9jYWxsYmFjayh0SGFsSGFuZGxlIGhIYWwsIHRBTklfUzMyIGNmZ0lkKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiY2ZnSWQgPSAlZFxuIiksIGNmZ0lkKTsKK30KKworc3RhdGljIHZvaWQgY2NtX2NhbGxiYWNrMih0SGFsSGFuZGxlIGhIYWwsIHRBTklfUzMyIHJlc3VsdCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoInJlc3VsdCA9ICVkXG4iKSwgcmVzdWx0KTsKK30KKwordm9pZCBjY21fdGVzdCh2b2lkKQoreworICAgIHRIYWxIYW5kbGUgaEhhbCA7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBoZGRfbmV0ZGV2X3ByaXZfdCAqbnA7CisgICAgY2hhciBzdHJbODBdID0gezF9IDsKKworICAgIGRldiAgPSBoZGRfZGV2WzBdOworICAgIG5wID0gKGhkZF9uZXRkZXZfcHJpdl90ICopZGV2LT5wcml2OworICAgIGhIYWwgPSBucC0+aGFsSGFuZGxlIDsKKyAgICBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY2NtU3RhcnQoKVxuIik7CisgICAgY2NtU3RhcnQoaEhhbCkgOworCisgICAgc3RhdHVzID0gY2NtQ2ZnVXBkYXRlKGhIYWwsIGNjbV9jYWxsYmFjazIpIDsKKyAgICBzbXNMb2cocE1hYywgTE9HVywgImNjbUNmZ1VwZGF0ZSgpOiBzdGF0dXM9JWRcbiIsIHN0YXR1cyk7CisKKyAgICBzdGF0dXMgPSBjY21DZmdTZXRJbnQoaEhhbCwgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwgMTAwLCBjY21fY2FsbGJhY2ssIDEpIDsKKyAgICBzbXNMb2cocE1hYywgTE9HVywgImNjbUNmZ1NldEludChXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEID0gJWQpOiBzdGF0dXM9JWRcbiIsCisgICAgICAgICAgIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsIHN0YXR1cyk7CisKKyAgICBzdGF0dXMgPSBjY21DZmdTZXRJbnQoaEhhbCwgV05JX0NGR19SVFNfVEhSRVNIT0xELCAxMDAsIGNjbV9jYWxsYmFjaywgMSkgOworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY2NtQ2ZnU2V0SW50KFdOSV9DRkdfUlRTX1RIUkVTSE9MRCA9ICVkKTogc3RhdHVzPSVkXG4iLAorICAgICAgICAgICBXTklfQ0ZHX1JUU19USFJFU0hPTEQsIHN0YXR1cyk7CisKKyAgICAvKiB0aGlzIGNmZ2lkIGNhdXNlcyByZWxvYWQgKi8KKyAgICBzdGF0dXMgPSBjY21DZmdTZXRJbnQoaEhhbCwgV05JX0NGR19NSU1PX0VOQUJMRUQsIDEsIGNjbV9jYWxsYmFjaywgMSkgOworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY2NtQ2ZnU2V0SW50KFdOSV9DRkdfTUlNT19FTkFCTEVEID0gJWQpOiBzdGF0dXM9JWRcbiIsCisgICAgICAgICAgIFdOSV9DRkdfTUlNT19FTkFCTEVELCBzdGF0dXMpOworCisgICAgc3RhdHVzID0gY2NtQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVQsIDEwMCwgY2NtX2NhbGxiYWNrLCAxKSA7CisgICAgc21zTG9nKHBNYWMsIExPR1csICJjY21DZmdTZXRJbnQoV05JX0NGR19TSE9SVF9SRVRSWV9MSU1JVCA9ICVkKTogc3RhdHVzPSVkXG4iLAorICAgICAgICAgICBXTklfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlULCBzdGF0dXMpOworCisgICAgc3RhdHVzID0gY2NtQ2ZnU2V0SW50KGhIYWwsIFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVCwgMTAwLCBjY21fY2FsbGJhY2ssIDEpIDsKKyAgICBzbXNMb2cocE1hYywgTE9HVywgImNjbUNmZ1NldEludChXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVQgPSAlZCk6IHN0YXR1cz0lZFxuIiwKKyAgICAgICAgICAgV05JX0NGR19MT05HX1JFVFJZX0xJTUlULCBzdGF0dXMpOworCisgICAgLyogdGhpcyBjZmdpZCBjYXVzZXMgcmVzdGFydCAqLworICAgIHN0YXR1cyA9IGNjbUNmZ1NldFN0cihoSGFsLCBXTklfQ0ZHX0VEQ0FfV01FX0FDVkksIHN0ciwgc2l6ZW9mKHN0ciksIGNjbV9jYWxsYmFjaywgMSkgOworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY2NtQ2ZnU2V0U3RyKFdOSV9DRkdfRURDQV9XTUVfQUNWSSA9ICVkKTogc3RhdHVzPSVkXG4iLAorICAgICAgICAgICBXTklfQ0ZHX0VEQ0FfV01FX0FDVkksIHN0YXR1cyk7CisKKyAgICBtZGVsYXkoMTAwKTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY2NtU3RvcCgpXG4iKTsKKyAgICBjY21TdG9wKGhIYWwpOworICAgIHN0YXR1cyA9IGNjbUNmZ1VwZGF0ZShoSGFsLCBjY21fY2FsbGJhY2syKSA7CisgICAgc21zTG9nKHBNYWMsIExPR1csICJjY21DZmdVcGRhdGUoKTogc3RhdHVzPSVkXG4iLCBzdGF0dXMpOworCisgICAgc21zTG9nKHBNYWMsIExPR1csICJjY21TdGFydCgpXG4iKTsKKyAgICBjY21TdGFydChoSGFsKSA7CisgICAgc3RhdHVzID0gY2NtQ2ZnVXBkYXRlKGhIYWwsIGNjbV9jYWxsYmFjazIpIDsKKyAgICBzbXNMb2cocE1hYywgTE9HVywgImNjbUNmZ1VwZGF0ZSgpOiBzdGF0dXM9JWRcbiIsIHN0YXR1cyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvU01FL3NyYy9jY20vY2NtTG9nRHVtcC5jIGIvQ09SRS9TTUUvc3JjL2NjbS9jY21Mb2dEdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1YmY2OAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL3NyYy9jY20vY2NtTG9nRHVtcC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2NjbUxvZ0R1bXAuYworCitJbXBsZW1lbnRzIHRoZSBkdW1wIGNvbW1hbmRzIHNwZWNpZmljIHRvIHRoZSBjY20gbW9kdWxlLiAKKworQ29weXJpZ2h0IChjKSAyMDA3IFFVQUxDT01NIEluY29ycG9yYXRlZC4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCitRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgImxvZ0R1bXAuaCIKKworI2lmIGRlZmluZWQoQU5JX0xPR0RVTVApCisKK3N0YXRpYyB0RHVtcEZ1bmNFbnRyeSBjY21NZW51RHVtcFRhYmxlW10gPSB7CisKKyAgIHswLCAgICAgIkNDTSAoODYxLTg3MCkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfSwKKyAgICAvL3s4NjEsICAgIkNDTTogQ0NNIHRlc3RpbmcgIiwgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9jY219CisKK307CisKK3ZvaWQgY2NtRHVtcEluaXQodEhhbEhhbmRsZSBoSGFsKQoreworICAgbG9nRHVtcFJlZ2lzdGVyVGFibGUoICh0cEFuaVNpckdsb2JhbCkgaEhhbCwgJmNjbU1lbnVEdW1wVGFibGVbMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjY21NZW51RHVtcFRhYmxlKS9zaXplb2YoY2NtTWVudUR1bXBUYWJsZVswXSkgKTsKK30KKworI2VuZGlmIC8vI2lmIGRlZmluZWQoQU5JX0xPR0RVTVApCisKZGlmZiAtLWdpdCBhL0NPUkUvU01FL3NyYy9jc3IvY3NyQXBpUm9hbS5jIGIvQ09SRS9TTUUvc3JjL2Nzci9jc3JBcGlSb2FtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjODFhMAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL3NyYy9jc3IvY3NyQXBpUm9hbS5jCkBAIC0wLDAgKzEsMTUwODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAgCisKKyAgCisgICAgXGZpbGUgY3NyQXBpUm9hbS5jCisgIAorICAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgQ29tbW9uIFJvYW1pbmcgaW50ZXJmYWNlcy4KKyAgCisgICAgQ29weXJpZ2h0IChDKSAyMDA4IFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQKKyAgCisgCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisKKyAgd2hlbiAgICAgICAgICAgIHdobyAgICAgICAgICAgICAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0tLSAgICAgICAtLS0gICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzA2LzAzLzEwICAgICBqcyAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgdG8gaG9zdGFwZCBkcml2ZW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWF1dGgvZGlzYXNzb2MvbWljIGZhaWx1cmUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgImFuaUdsb2JhbC5oIiAvL2ZvciB0cEFuaVNpckdsb2JhbAorI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsTXNnQXBpLmgiIC8vZm9yIEhBTF9TVEFfSU5WQUxJRF9JRFguCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxQaHlBcGkuaCIKKyNpbmNsdWRlICJoYWxJbnRlcm5hbC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJwYWxBcGkuaCIKKyNpbmNsdWRlICJjc3JJbnNpZGVBcGkuaCIKKyNpbmNsdWRlICJzbXNEZWJ1Zy5oIgorI2luY2x1ZGUgImxvZ0R1bXAuaCIKKyNpbmNsdWRlICJzbWVRb3NJbnRlcm5hbC5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3RsLmgiCisjaW5jbHVkZSAic21lSW5zaWRlLmgiCisjaW5jbHVkZSAidm9zX2RpYWdfY29yZV9ldmVudC5oIgorI2luY2x1ZGUgInZvc19kaWFnX2NvcmVfbG9nLmgiCisjaW5jbHVkZSAiY3NyQXBpLmgiCisjaW5jbHVkZSAicG1jLmgiCisjaW5jbHVkZSAidm9zX252aXRlbS5oIgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyNpbmNsdWRlICJjc3JOZWlnaGJvclJvYW0uaCIKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORyAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorI2luY2x1ZGUgImNzckNjeC5oIgorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KKworI2RlZmluZSBDU1JfTlVNX0lCU1NfU1RBUlRfQ0hBTk5FTFNfNTAgICAgICA0CisjZGVmaW5lIENTUl9OVU1fSUJTU19TVEFSVF9DSEFOTkVMU18yNCAgICAgIDMKKyNkZWZpbmUgQ1NSX0RFRl9JQlNTX1NUQVJUX0NIQU5ORUxfNTAgICAgICAgMzYKKyNkZWZpbmUgQ1NSX0RFRl9JQlNTX1NUQVJUX0NIQU5ORUxfMjQgICAgICAgMQorI2RlZmluZSBDU1JfSUJTU19KT0lOX1RJTUVPVVRfUEVSSU9EICAgICAgICAoIDEgKiAgUEFMX1RJTUVSX1RPX1NFQ19VTklUICkgIC8vIDEgc2Vjb25kCisjZGVmaW5lIENTUl9XQUlUX0ZPUl9LRVlfVElNRU9VVF9QRVJJT0QgICAgICAgICAoIDUwICogUEFMX1RJTUVSX1RPX1NFQ19VTklUICkgIC8vIDUwIHNlY29uZHMsIGZvciBXUEEsIFdQQTIsIENDS00KKyNkZWZpbmUgQ1NSX1dBSVRfRk9SX1dQU19LRVlfVElNRU9VVF9QRVJJT0QgICAgICAgICAoIDEyMCAqIFBBTF9USU1FUl9UT19TRUNfVU5JVCApICAvLyAxMjAgc2Vjb25kcywgZm9yIFdQUworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgT0JJV0FOIHJlY29tbWVuZHMgWzggMTBdJSA6IHBpY2sgOSUgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDU1JfVkNDX1VMX01BQ19MT1NTX1RIUkVTSE9MRCA5CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE9CSVdBTiByZWNvbW1lbmRzIC04NWRCbSAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENTUl9WQ0NfUlNTSV9USFJFU0hPTEQgODAKKyNkZWZpbmUgQ1NSX01JTl9HTE9CQUxfU1RBVF9RVUVSWV9QRVJJT0QgICA1MDAgLy9tcworI2RlZmluZSBDU1JfTUlOX0dMT0JBTF9TVEFUX1FVRVJZX1BFUklPRF9JTl9CTVBTIDIwMDAgLy9tcworI2RlZmluZSBDU1JfTUlOX1RMX1NUQVRfUVVFUllfUEVSSU9EICAgICAgIDUwMCAvL21zCisjZGVmaW5lIENTUl9ESUFHX0xPR19TVEFUX1BFUklPRCAgICAgICAgICAgMzAwMCAvL21zCisKKy8vV2UgdXNlIGNvbnN0YXRudCA0IGhlcmUKKy8vVGhpcyBtYWNybyByZXR1cm5zIHRydWUgd2hlbiBoaWdoZXIgQUMgcGFyYW1ldGVyIGlzIGJpZ2dlciB0aGFuIGxvd2VyIEFDIGZvciBhIGRpZmZlcmVuY2UKKy8vVGhlIGJpZ2dlciB0aGUgbnVtYmVyLCB0aGUgbGVzcyBjaGFuY2Ugb2YgVFgKKy8vSXQgbXVzdCBwdXQgbG93ZXIgQUMgYXMgdGhlIGZpcnN0IHBhcmFtZXRlci4KKyNkZWZpbmUgU01FX0RFVEVDVF9BQ19XRUlHSFRfRElGRihsb0FDLCBoaUFDKSAgICh2X0JPT0xfdCkoKChoaUFDKSA+IChsb0FDKSkgPyAoKChoaUFDKS0obG9BQykpID4gNCkgOiAwKQorCisvL0ZsYWcgdG8gc2VuZC9kbyBub3Qgc2VuZCBkaXNhc3NvYyBmcmFtZSBvdmVyIHRoZSBhaXIKKyNkZWZpbmUgQ1NSX0RPTlRfU0VORF9ESVNBU1NPQ19PVkVSX1RIRV9BSVIgMQorCisjZGVmaW5lIFJTU0lfSEFDS19CTVBTICgtNDApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBTdGF0aWMgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB0Q2hhbm5lbExpc3RXaXRoUG93ZXIgY3NyUm9hbVBvd2VyVGFibGVGcm9tRWVwcm9tW1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CitzdGF0aWMgdENoYW5uZWxMaXN0V2l0aFBvd2VyIGNzclJvYW1Qb3dlclRhYmxlRnJvbUVlcHJvbTQwTUh6W1dOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTl07CitzdGF0aWMgdENzclJvYW1TZXNzaW9uICAgICAgIGNzclJvYW1Sb2FtU2Vzc2lvbltDU1JfUk9BTV9TRVNTSU9OX01BWF07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKworaW50IGRpYWdBdXRoVHlwZUZyb21DU1JUeXBlKGVDc3JBdXRoVHlwZSBhdXRoVHlwZSkKK3sKKyAgICBpbnQgbiA9IEFVVEhfT1BFTjsKKworICAgIHN3aXRjaChhdXRoVHlwZSkKKyAgICB7CisgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOgorICAgICAgICBuID0gQVVUSF9TSEFSRUQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEE6CisgICAgICAgIG4gPSBBVVRIX1dQQV9FQVA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLOgorICAgICAgICBuID0gQVVUSF9XUEFfUFNLOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfUlNOOgorICAgICAgICBuID0gQVVUSF9XUEEyX0VBUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1JTTl9QU0s6CisgICAgICAgIG4gPSBBVVRIX1dQQTJfUFNLOworICAgICAgICBicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfQ0VSVElGSUNBVEU6CisgICAgICAgIG4gPSBBVVRIX1dBUElfQ0VSVDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1dBUElfV0FJX1BTSzoKKyAgICAgICAgbiA9IEFVVEhfV0FQSV9QU0s7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gKG4pOworfQorCitpbnQgZGlhZ0VuY1R5cGVGcm9tQ1NSVHlwZShlQ3NyRW5jcnlwdGlvblR5cGUgZW5jVHlwZSkKK3sKKyAgICBpbnQgbiA9IEVOQ19NT0RFX09QRU47CisKKyAgICBzd2l0Y2goZW5jVHlwZSkKKyAgICB7CisgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk6CisgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDoKKyAgICAgICAgbiA9IEVOQ19NT0RFX1dFUDQwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWToKKyAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDoKKyAgICAgICAgbiA9IEVOQ19NT0RFX1dFUDEwNDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1RLSVA6CisgICAgICAgIG4gPSBFTkNfTU9ERV9US0lQOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQUVTOgorICAgICAgICBuID0gRU5DX01PREVfQUVTOworICAgICAgICBicmVhazsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk6CisgICAgICAgIG4gPSBFTkNfTU9ERV9TTVM0OworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAobik7Cit9CisKKyNlbmRpZiAvLyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCitzdGF0aWMgY29uc3QgdEFOSV9VOCBjc3JTdGFydElic3NDaGFubmVsczUwWyBDU1JfTlVNX0lCU1NfU1RBUlRfQ0hBTk5FTFNfNTAgXSA9IHsgMzYsIDQwLCAgNDQsICA0OH07IAorc3RhdGljIGNvbnN0IHRBTklfVTggY3NyU3RhcnRJYnNzQ2hhbm5lbHMyNFsgQ1NSX05VTV9JQlNTX1NUQVJUX0NIQU5ORUxTXzI0IF0gPSB7IDEsIDYsIDExIH07CisKK3N0YXRpYyB2b2lkIGluaXRDb25maWdQYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3N0YXRpYyB0QU5JX0JPT0xFQU4gY3NyUm9hbVByb2Nlc3NSZXN1bHRzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JSb2FtQ29tcGxldGVSZXN1bHQgUmVzdWx0LCB2b2lkICpDb250ZXh0ICk7CitzdGF0aWMgZUhhbFN0YXR1cyBjc3JSb2FtU3RhcnRJYnNzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX0JPT0xFQU4gKnBmU2FtZUlic3MgKTsKK3N0YXRpYyB2b2lkIGNzclJvYW1VcGRhdGVDb25uZWN0ZWRQcm9maWxlRnJvbU5ld0JzcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0U2lyU21lTmV3QnNzSW5mbyAqcE5ld0JzcyApOworc3RhdGljIHZvaWQgY3NyUm9hbVByZXBhcmVCc3NQYXJhbXModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzKTsKK3N0YXRpYyB0QW5pQ0JTZWNvbmRhcnlNb2RlIGNzckdldENCTW9kZUZyb21JZXModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBwcmltYXJ5Q2huLCB0RG90MTFmQmVhY29uSUVzICpwSWVzKTsKK2VIYWxTdGF0dXMgY3NySW5pdEdldENoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworc3RhdGljIHZvaWQgY3NyUm9hbWluZ1N0YXRlQ29uZmlnQ25mUHJvY2Vzc29yKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiByZXN1bHQgKTsKK2VIYWxTdGF0dXMgY3NyUm9hbU9wZW4odHBBbmlTaXJHbG9iYWwgcE1hYyk7CitlSGFsU3RhdHVzIGNzclJvYW1DbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyUm9hbU1JQ0Vycm9yVGltZXJIYW5kbGVyKHZvaWQgKnB2KTsKK3ZvaWQgY3NyUm9hbVRLSVBDb3VudGVyTWVhc3VyZVRpbWVySGFuZGxlcih2b2lkICpwdik7Cit0QU5JX0JPT0xFQU4gY3NyUm9hbUlzU2FtZVByb2ZpbGVLZXlzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcENvbm5Qcm9maWxlLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlMik7CisgCitzdGF0aWMgZUhhbFN0YXR1cyBjc3JSb2FtU3RhcnRSb2FtaW5nVGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0QU5JX1UzMiBpbnRlcnZhbCk7CitzdGF0aWMgZUhhbFN0YXR1cyBjc3JSb2FtU3RvcFJvYW1pbmdUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpOworc3RhdGljIHZvaWQgY3NyUm9hbVJvYW1pbmdUaW1lckhhbmRsZXIodm9pZCAqcHYpOworZUhhbFN0YXR1cyBjc3JSb2FtU3RhcnRJYnNzSm9pblRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9VMzIgaW50ZXJ2YWwpOworZUhhbFN0YXR1cyBjc3JSb2FtU3RvcElic3NKb2luVGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKTsKK3N0YXRpYyB2b2lkIGNzclJvYW1JYnNzSm9pblRpbWVySGFuZGxlcih2b2lkICpwdik7CitlSGFsU3RhdHVzIGNzclJvYW1TdGFydFdhaXRGb3JLZXlUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBpbnRlcnZhbCk7CitlSGFsU3RhdHVzIGNzclJvYW1TdG9wV2FpdEZvcktleVRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworc3RhdGljIHZvaWQgY3NyUm9hbVdhaXRGb3JLZXlUaW1lT3V0SGFuZGxlcih2b2lkICpwdik7CisgCitzdGF0aWMgZUhhbFN0YXR1cyBDc3JJbml0MTFkSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyMTFkaW5mbyAqcHMxMWRpbmZvKTsKK3N0YXRpYyBlSGFsU3RhdHVzIGNzclJvYW1GcmVlQ29ubmVjdGVkSW5mbyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJvYW1Db25uZWN0ZWRJbmZvICpwQ29ubmVjdGVkSW5mbyApOworZUhhbFN0YXR1cyBjc3JTZW5kTUJTZXRDb250ZXh0UmVxTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIAorICAgICAgICAgICB0U2lyTWFjQWRkciBwZWVyTWFjQWRkciwgdEFOSV9VOCBudW1LZXlzLCB0QW5pRWRUeXBlIGVkVHlwZSwgCisgICAgICAgICAgIHRBTklfQk9PTEVBTiBmVW5pY2FzdCwgdEFuaUtleURpcmVjdGlvbiBhbmlLZXlEaXJlY3Rpb24sCisgICAgICAgICAgIHRBTklfVTgga2V5SWQsIHRBTklfVTgga2V5TGVuZ3RoLCB0QU5JX1U4ICpwS2V5LCB0QU5JX1U4IHBhZVJvbGUsIAorICAgICAgICAgICB0QU5JX1U4ICpwS2V5UnNjICk7CitzdGF0aWMgZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVSZWFzc29jaWF0ZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSApOwordm9pZCBjc3JSb2FtU3RhdGlzdGljc1RpbWVySGFuZGxlcih2b2lkICpwdik7Cit2b2lkIGNzclJvYW1TdGF0c0dsb2JhbENsYXNzRFRpbWVySGFuZGxlcih2b2lkICpwdik7CisKK3N0YXRpYyB2b2lkIGNzclJvYW1MaW5rVXAodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckJzc2lkIGJzc2lkKTsKK1ZPU19TVEFUVVMgY3NyUm9hbVZjY1RyaWdnZXJSc3NpSW5kQ2FsbGJhY2sodEhhbEhhbmRsZSBoSGFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICByc3NpTm90aWZpY2F0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGNvbnRleHQpOworc3RhdGljIHZvaWQgY3NyUm9hbUxpbmtEb3duKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCk7Cit2b2lkIGNzclJvYW1WY2NUcmlnZ2VyKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworZUhhbFN0YXR1cyBjc3JTZW5kTUJTdGF0c1JlcU1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc3RhdHNNYXNrLCB0QU5JX1U4IHN0YUlkKTsKKy8qCisgICAgcFN0YUVudHJ5IGlzIG5vIGxvbmdlciBpbnZhbGlkIHVwb24gdGhlIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uLgorKi8KK3N0YXRpYyB2b2lkIGNzclJvYW1SZW1vdmVTdGF0TGlzdEVudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3N0YXRpYyBlQ3NyQ2ZnRG90MTFNb2RlIGNzclJvYW1HZXRQaHlNb2RlQmFuZEZvckJzcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSx0QU5JX1U4IG9wZXJhdGlvbkNobiwgZUNzckJhbmQgKnBCYW5kICk7CisjZWxzZQorc3RhdGljIGVDc3JDZmdEb3QxMU1vZGUgY3NyUm9hbUdldFBoeU1vZGVCYW5kRm9yQnNzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCBlQ3NyUGh5TW9kZSBwaHlNb2RlSW4sIHRBTklfVTggb3BlcmF0aW9uQ2huLCBlQ3NyQmFuZCAqcEJhbmQgKTsKKyNlbmRpZgorc3RhdGljIGVIYWxTdGF0dXMgY3NyUm9hbUdldFFvc0luZm9Gcm9tQnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MpOworCisKK3RDc3JTdGF0c0NsaWVudFJlcUluZm8gKiBjc3JSb2FtSW5zZXJ0RW50cnlJbnRvTGlzdCggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERibExpbmtMaXN0ICpwU3RhTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclN0YXRzQ2xpZW50UmVxSW5mbyAqcFN0YUVudHJ5KTsKK3ZvaWQgY3NyUm9hbVN0YXRzQ2xpZW50VGltZXJIYW5kbGVyKHZvaWQgKnB2KTsKK3RDc3JQZVN0YXRzUmVxSW5mbyAqICBjc3JSb2FtQ2hlY2tQZVN0YXRzUmVxTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAgc3RhdHNNYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBwZXJpb2RpY2l0eSwgdEFOSV9CT09MRUFOICpwRm91bmQsIHRBTklfVTggc3RhSWQpOwordm9pZCBjc3JSb2FtUmVwb3J0U3RhdGlzdGljcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzdGF0c01hc2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyU3RhdHNDYWxsYmFjayBjYWxsYmFjaywgdEFOSV9VOCBzdGFJZCwgdm9pZCAqcENvbnRleHQpOwordm9pZCBjc3JSb2FtU2F2ZVN0YXRzRnJvbVRsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSB0bFN0YXRzKTsKK3ZvaWQgY3NyUm9hbVRsU3RhdHNUaW1lckhhbmRsZXIodm9pZCAqcHYpOwordm9pZCBjc3JSb2FtUGVTdGF0c1RpbWVySGFuZGxlcih2b2lkICpwdik7Cit0TGlzdEVsZW0gKiBjc3JSb2FtQ2hlY2tDbGllbnRSZXFMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHN0YXRzTWFzayk7Cit2b2lkIGNzclJvYW1SZW1vdmVFbnRyeUZyb21QZVN0YXRzUmVxTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUGVTdGF0c1JlcUluZm8gKnBQZVN0YUVudHJ5KTsKK3RMaXN0RWxlbSAqIGNzclJvYW1GaW5kSW5QZVN0YXRzUmVxTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAgc3RhdHNNYXNrKTsKK2VIYWxTdGF0dXMgY3NyUm9hbURlcmVnU3RhdGlzdGljc1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3N0YXRpYyB0QU5JX1UzMiBjc3JGaW5kSWJzc1Nlc3Npb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMgKTsKK3N0YXRpYyBlSGFsU3RhdHVzIGNzclJvYW1TdGFydFdkcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjICk7CitzdGF0aWMgdm9pZCBjc3JJbml0U2Vzc2lvbiggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICk7CitzdGF0aWMgZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVTZXRLZXlDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1TZXRLZXkgKnBTZXRLZXksIHRBTklfVTMyIHJvYW1JZCApOworLy9zdGF0aWMgZUhhbFN0YXR1cyBjc3JSb2FtUHJvY2Vzc1N0b3BCc3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICk7CitzdGF0aWMgZUhhbFN0YXR1cyBjc3JSb2FtR2V0UW9zSW5mb0Zyb21Cc3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYyk7Cit2b2lkIGNzclJvYW1SZWlzc3VlUm9hbUNvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0JUQU1QX1VUX1JGCit2b2lkIGNzclJvYW1Kb2luUmV0cnlUaW1lckhhbmRsZXIodm9pZCAqcHYpOworI2VuZGlmCitleHRlcm4gdm9pZCBTeXNQcm9jZXNzTW1oTXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRKiBwTXNnKTsKKworZXh0ZXJuIHZvaWQgYnRhbXBFc3RhYmxpc2hMb2dMaW5rSGRscih2b2lkKiBwTXNnKTsKKworc3RhdGljIHZvaWQgY3NyU2VyRGVzVW5wYWNrRGlhc3NvY1JzcCh0QU5JX1U4ICpwQnVmLCB0U2lyU21lRGlzYXNzb2NSc3AgKnBSc3ApOworCisvL0luaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcworc3RhdGljIHZvaWQgY3NyUm9hbUluaXRHbG9iYWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgaWYocE1hYykKKyAgICB7CisgICAgICAgIHBNYWMtPnJvYW0ucG93ZXJUYWJsZUZyb21FZXByb20gICAgICA9IGNzclJvYW1Qb3dlclRhYmxlRnJvbUVlcHJvbTsKKyAgICAgICAgcE1hYy0+cm9hbS5wb3dlclRhYmxlRnJvbUVlcHJvbTQwTUh6ID0gY3NyUm9hbVBvd2VyVGFibGVGcm9tRWVwcm9tNDBNSHo7CisgICAgICAgIHBNYWMtPnJvYW0ucm9hbVNlc3Npb24gICAgICAgICAgICAgICA9IGNzclJvYW1Sb2FtU2Vzc2lvbjsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIGNzclJvYW1EZUluaXRHbG9iYWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgaWYocE1hYykKKyAgICB7CisgICAgICAgIHBNYWMtPnJvYW0ucG93ZXJUYWJsZUZyb21FZXByb20gICAgICA9IE5VTEw7CisgICAgICAgIHBNYWMtPnJvYW0ucG93ZXJUYWJsZUZyb21FZXByb200ME1IeiA9IE5VTEw7CisgICAgICAgIHBNYWMtPnJvYW0ucm9hbVNlc3Npb24gICAgICAgICAgICAgICA9IE5VTEw7CisgICAgfQorICAgIHJldHVybjsKK30KKworZUhhbFN0YXR1cyBjc3JPcGVuKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHN0YXRpYyB1TnZUYWJsZXMgbnZUYWJsZXM7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICB2X1JFR0RPTUFJTl90IHJlZ0lkOworICAgIHRBTklfVTMyIGk7CisgICAgCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIEluaXRpYWxpemUgQ1NSIFJvYW0gR2xvYmFscyAqLworICAgICAgICBjc3JSb2FtSW5pdEdsb2JhbHMocE1hYyk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKysgKQorICAgICAgICAgICBjc3JSb2FtU3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9TVE9QLCBpKTsKKworICAgICAgICBpbml0Q29uZmlnUGFyYW0ocE1hYyk7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoKHN0YXR1cyA9IGNzclNjYW5PcGVuKHBNYWMpKSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUygoc3RhdHVzID0gY3NyUm9hbU9wZW4ocE1hYykpKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwTWFjLT5yb2FtLm5leHRSb2FtSWQgPSAxOyAgLy9NdXN0IG5vdCBiZSAwCisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5yb2FtLnN0YXRzQ2xpZW50UmVxTGlzdCkpKQorICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JMTE9wZW4ocE1hYy0+aEhkZCwgJnBNYWMtPnJvYW0ucGVTdGF0c1JlcUxpc3QpKSkKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5yb2FtLnJvYW1DbWRQZW5kaW5nTGlzdCkpKQorICAgICAgICAgICBicmVhazsKKworICAgICAgICB2b3NTdGF0dXMgPSB2b3NfbnZfcmVhZERlZmF1bHRDb3VudHJ5VGFibGUoICZudlRhYmxlcyApOworICAgICAgICBpZiAoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsIAorICAgICAgICAgICAgICAgICAgICBudlRhYmxlcy5kZWZhdWx0Q291bnRyeVRhYmxlLmNvdW50cnlDb2RlLCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4gKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgIGZhaWwgdG8gZ2V0IE5WX0ZJRUxEX0lNQUdFXG4iKSApOworICAgICAgICAgICAgLy9oYXJkY29kZWQgZm9yIG5vdworICAgICAgICAgICAgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHRbMF0gPSAnVSc7CisgICAgICAgICAgICBwTWFjLT5zY2FuLmNvdW50cnlDb2RlRGVmYXVsdFsxXSA9ICdTJzsKKyAgICAgICAgICAgIHBNYWMtPnNjYW4uY291bnRyeUNvZGVEZWZhdWx0WzJdID0gJ0knOworICAgICAgICAgICAgLy9zdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBjb3VudHJ5IENvZGUgZnJvbSBudlJhbSAlc1xuIiksIHBNYWMtPnNjYW4uY291bnRyeUNvZGVEZWZhdWx0ICk7CisKKyAgICAgICAgY3NyR2V0UmVndWxhdG9yeURvbWFpbkZvckNvdW50cnkocE1hYywgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsICZyZWdJZCk7CisKKyAgICAgICAgV0RBX1NldFJlZ0RvbWFpbihwTWFjLCByZWdJZCk7CisgICAgICAgIHBNYWMtPnNjYW4uZG9tYWluSWREZWZhdWx0ID0gcmVnSWQ7CisgICAgICAgIHBNYWMtPnNjYW4uZG9tYWluSWRDdXJyZW50ID0gcE1hYy0+c2Nhbi5kb21haW5JZERlZmF1bHQ7CisKKyAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTik7CisgICAgICAgIHN0YXR1cyA9IGNzckluaXRHZXRDaGFubmVscyggcE1hYyApOworCisgICAgfXdoaWxlKDApOworICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorZUhhbFN0YXR1cyBjc3JTZXRSZWdJbmZvKHRIYWxIYW5kbGUgaEhhbCwgIHRBTklfVTggKmFwQ250cnlDb2RlKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICB2X1JFR0RPTUFJTl90IHJlZ0lkOworICAgIHZfVThfdCAgICAgICAgY250cnlDb2RlTGVuZ3RoOworCisgICAgaWYoTlVMTCA9PSBhcENudHJ5Q29kZSkKKyAgICB7CisgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCBGTCgiIEludmFsaWQgY291bnRyeSBDb2RlIFBvaW50ZXJcbiIpICk7CisgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgc21zTG9nKCBwTWFjLCBMT0dXLCBGTCgiIGNvdW50cnkgQ29kZSAlc1xuIiksIGFwQ250cnlDb2RlICk7CisKKyAgICAvKiBUbyBnZXQgY29ycmVjdCBSZWd1bGF0b3J5IGRvbWFpbiBmcm9tIE5WIHRhYmxlIAorICAgICAqIDIgY2hhcmFjdGVyIENvdW50cnkgY29kZSBzaG91bGQgYmUgdXNlZAorICAgICAqIDNyZCBjaGFyYXRlciBpcyBvcHRpb25hbCBmb3IgaW5kb29yL291dGRvb3Igc2V0dGluZyAqLworICAgIGNudHJ5Q29kZUxlbmd0aCA9IHN0cmxlbihhcENudHJ5Q29kZSk7CisKKyAgICBzdGF0dXMgPSBjc3JHZXRSZWd1bGF0b3J5RG9tYWluRm9yQ291bnRyeShwTWFjLCBhcENudHJ5Q29kZSwgJnJlZ0lkKTsKKyAgICBpZiAoc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgIGZhaWwgdG8gZ2V0IHJlZ0lkIGZvciBjb3VudHJ5IENvZGUgJXNcbiIpLCBhcENudHJ5Q29kZSApOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IFdEQV9TZXRSZWdEb21haW4oaEhhbCwgcmVnSWQpOworICAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiAgZmFpbCB0byBnZXQgcmVnSWQgZm9yIGNvdW50cnkgQ29kZSAlc1xuIiksIGFwQ250cnlDb2RlICk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcE1hYy0+c2Nhbi5kb21haW5JZERlZmF1bHQgPSByZWdJZDsKKyAgICBwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCA9IHBNYWMtPnNjYW4uZG9tYWluSWREZWZhdWx0OworCisgICAgLyogQ2xlYXIgQ0MgZmllbGQgKi8KKyAgICBwYWxGaWxsTWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4uY291bnRyeUNvZGVEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiwKKyAgICAgICAgICAgICAgICAgICAwICk7CisgICAgLyogQ29weSAyIG9yIDMgYnl0ZXMgY291bnRyeSBjb2RlICovCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsIAorICAgICAgICAgICAgICAgIGFwQ250cnlDb2RlLCBjbnRyeUNvZGVMZW5ndGggKTsKKworICAgIC8qIElmIDIgYnl0ZXMgY291bnRyeSBjb2RlLCAzcmQgYnl0ZSBtdXN0IGJlIGZpbGxlZCB3aXRoIHNwYWNlICovCisgICAgaWYoKFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiAtIDEpID09IGNudHJ5Q29kZUxlbmd0aCkKKyAgICB7CisgICAgICAgcGFsRmlsbE1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5zY2FuLmNvdW50cnlDb2RlRGVmYXVsdCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAweDIwICk7CisgICAgfQorCisgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTik7CisgICAgc3RhdHVzID0gY3NySW5pdEdldENoYW5uZWxzKCBwTWFjICk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitlSGFsU3RhdHVzIGNzclNldENoYW5uZWxzKHRIYWxIYW5kbGUgaEhhbCwgIHRDc3JDb25maWdQYXJhbSAqcFBhcmFtICApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHRBTklfVTggICBpbmRleCA9IDA7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwUGFyYW0tPkNzcjExZGluZm8uY291bnRyeUNvZGUsIAorICAgICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4gKTsKKworICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLm51bUNoYW5uZWxzIDsgaW5kZXgrKykKKyAgICB7CisgICAgICAgIHBQYXJhbS0+Q3NyMTFkaW5mby5DaGFubmVscy5jaGFubmVsTGlzdFtpbmRleF0gPSBwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLmNoYW5uZWxMaXN0WyBpbmRleCBdOworICAgICAgICBwUGFyYW0tPkNzcjExZGluZm8uQ2huUG93ZXJbaW5kZXhdLmZpcnN0Q2hhbm5lbCA9IHBNYWMtPnNjYW4uYmFzZTIwTUh6Q2hhbm5lbHMuY2hhbm5lbExpc3RbIGluZGV4IF07CisgICAgICAgIHBQYXJhbS0+Q3NyMTFkaW5mby5DaG5Qb3dlcltpbmRleF0ubnVtQ2hhbm5lbHMgPSAxOworICAgICAgICBwUGFyYW0tPkNzcjExZGluZm8uQ2huUG93ZXJbaW5kZXhdLm1heHR4UG93ZXIgPSBwTWFjLT5zY2FuLmRlZmF1bHRQb3dlclRhYmxlW2luZGV4XS5wd3I7CisgICAgfQorICAgIHBQYXJhbS0+Q3NyMTFkaW5mby5DaGFubmVscy5udW1DaGFubmVscyA9IHBNYWMtPnNjYW4uYmFzZTIwTUh6Q2hhbm5lbHMubnVtQ2hhbm5lbHM7CisgICAgCisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCitlSGFsU3RhdHVzIGNzckNsb3NlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIAorICAgIGNzclN0b3AocE1hYyk7CisgICAgY3NyUm9hbUNsb3NlKHBNYWMpOworICAgIGNzclNjYW5DbG9zZShwTWFjKTsKKyAgICBjc3JMTENsb3NlKCZwTWFjLT5yb2FtLnN0YXRzQ2xpZW50UmVxTGlzdCk7CisgICAgY3NyTExDbG9zZSgmcE1hYy0+cm9hbS5wZVN0YXRzUmVxTGlzdCk7CisgICAgY3NyTExDbG9zZSgmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QpOworCisgICAgLyogRGVJbml0IEdsb2JhbHMgKi8KKyAgICBjc3JSb2FtRGVJbml0R2xvYmFscyhwTWFjKTsKKworICAgIHJldHVybiAoc3RhdHVzKTsKK30gCisKK2VIYWxTdGF0dXMgY3NyU3RhcnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgaTsKKyAKKyAgICBkbworICAgIHsKKyAgICAgICAvL3NhdmUgdGhlIGdsb2JhbCB2b3MgY29udGV4dAorICAgICAgICBwTWFjLT5yb2FtLmdWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgcE1hYyk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrICkKKyAgICAgICAgICAgY3NyUm9hbVN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1JTkdfU1RBVEVfSURMRSwgaSApOworCisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1TdGFydChwTWFjKTsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSBicmVhazsKKyAgICAgICAgcE1hYy0+c2Nhbi5mMTFkSW5mb0FwcGxpZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIHN0YXR1cyA9IHBtY1JlZ2lzdGVyUG93ZXJTYXZlQ2hlY2socE1hYywgY3NyQ2hlY2tQU1JlYWR5LCBwTWFjKTsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSBicmVhazsKKyAgICAgICAgcE1hYy0+cm9hbS5zUGVuZGluZ0NvbW1hbmRzID0gMDsKKyAgICAgICAgY3NyU2NhbkVuYWJsZShwTWFjKTsKKyNpZiAgIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgICAgICAgc3RhdHVzID0gY3NyTmVpZ2hib3JSb2FtSW5pdChwTWFjKTsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORyAqLworICAgICAgICBwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLm51bUNsaWVudCA9IDA7CisgICAgICAgIHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8ucGVyaW9kaWNpdHkgPSAwOworICAgICAgICBwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLnRpbWVyUnVubmluZyA9IEZBTFNFOworICAgICAgICAvL2luaXQgdGhlIGxpbmsgcXVhbGl0eSBpbmRpY2F0aW9uIGFsc28KKyAgICAgICAgcE1hYy0+cm9hbS52Y2NMaW5rUXVhbGl0eSA9IGVDU1JfUk9BTV9MSU5LX1FVQUxfTUlOX0lORDsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSAKKyAgICAgICAgeworICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIiBjc3JTdGFydDogQ291bGRuJ3QgSW5pdCBITyBjb250cm9sIGJsayBcbiIpOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKworI2lmIGRlZmluZWQoQU5JX0xPR0RVTVApCisgICAgY3NyRHVtcEluaXQocE1hYyk7CisjZW5kaWYgLy8jaWYgZGVmaW5lZChBTklfTE9HRFVNUCkKKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzclN0b3AodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQ7CisgICAgdEFOSV9VMzIgaTsKKworICAgIGZvcihzZXNzaW9uSWQgPSAwOyBzZXNzaW9uSWQgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgc2Vzc2lvbklkKyspCisgICAgeworICAgICAgICBjc3JSb2FtQ2xvc2VTZXNzaW9uKHBNYWMsIHNlc3Npb25JZCwgVFJVRSwgTlVMTCwgTlVMTCk7CisgICAgfQorCisgICAgY3NyU2NhbkRpc2FibGUocE1hYyk7CisgICAgcE1hYy0+c2Nhbi5mQ2FuY2VsSWRsZVNjYW4gPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgcE1hYy0+c2Nhbi5mUmVzdGFydElkbGVTY2FuID0gZUFOSV9CT09MRUFOX0ZBTFNFOworCisgICAgY3NyTExQdXJnZSggJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0LCBlQU5JX0JPT0xFQU5fVFJVRSApOworICAgIAorI2lmICAgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworICAgIGNzck5laWdoYm9yUm9hbUNsb3NlKHBNYWMpOworI2VuZGlmCisgICAgY3NyU2NhbkZsdXNoUmVzdWx0KHBNYWMpOyAvL0RvIHdlIHdhbnQgdG8gZG8gdGhpcz8KKworICAgIC8vIGRlcmVnaXN0ZXIgZnJvbSBQTUMgc2luY2Ugd2UgcmVnaXN0ZXIgZHVyaW5nIGNzclN0YXJ0KCkKKyAgICAvLyAoaWdub3JlIHN0YXR1cyBzaW5jZSB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbiBkbyBpZiBpdCBmYWlscykKKyAgICAodm9pZCkgcG1jRGVyZWdpc3RlclBvd2VyU2F2ZUNoZWNrKHBNYWMsIGNzckNoZWNrUFNSZWFkeSk7CisKKyAgICAvL1Jlc2V0IHRoZSBkb21haW4gYmFjayB0byB0aGUgZGVhdWx0CisgICAgcE1hYy0+c2Nhbi5kb21haW5JZEN1cnJlbnQgPSBwTWFjLT5zY2FuLmRvbWFpbklkRGVmYXVsdDsKKyAgICBjc3JSZXNldENvdW50cnlJbmZvcm1hdGlvbihwTWFjLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKyApCisgICAgeworICAgICAgIGNzclJvYW1TdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX1NUT1AgLGkgKTsKKyAgICAgICBwTWFjLT5yb2FtLmN1clN1YlN0YXRlW2ldID0gZUNTUl9ST0FNX1NVQlNUQVRFX05PTkU7CisgICAgfQorCisgICAgcmV0dXJuIChlSEFMX1NUQVRVU19TVUNDRVNTKTsKK30KKworCitlSGFsU3RhdHVzIGNzclJlYWR5KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICAgY3NyU2NhbkdldFN1cHBvcnRlZENoYW5uZWxzKCBwTWFjICk7CisgICAgLy9XTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCBzaG91bGQgYmUgc2V0IGJ5IHRoaXMgdGltZQorICAgIC8vdXNlIGl0IHRvIGluaXQgdGhlIGJhY2tncm91bmQgc2NhbiBsaXN0CisgICAgY3NySW5pdEJHU2NhbkNoYW5uZWxMaXN0KHBNYWMpOworICAgIC8qIEhERCBpc3N1ZXMgdGhlIGluaXQgc2NhbiAqLworICAgIGNzclNjYW5TdGFydFJlc3VsdEFnaW5nVGltZXIocE1hYyk7CisKKyAgICAvL1N0b3JlIHRoZSBBQyB3ZWlnaHRzIGluIFRMIGZvciBsYXRlciB1c2UKKyAgICBXTEFOVExfR2V0QUNXZWlnaHRzKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsIHBNYWMtPnJvYW0udWNBQ1dlaWdodHMpOworCisgICAgc3RhdHVzID0gY3NySW5pdENoYW5uZWxMaXN0KCBwTWFjICk7CisgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJjc3JJbml0Q2hhbm5lbExpc3QgZmFpbGVkIGR1cmluZyBjc3JSZWFkeSB3aXRoIHN0YXR1cz0lZFxuIiwKKyAgICAgICAgICAgICAgIHN0YXR1cyApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKwordm9pZCBjc3JTZXREZWZhdWx0RG90MTFNb2RlKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICB2X1UzMl90IHduaURvdDExbW9kZSA9IDA7CisKKyAgICB3bmlEb3QxMW1vZGUgPSBjc3JUcmFuc2xhdGVUb1dOSUNmZ0RvdDExTW9kZShwTWFjLHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSk7CisgICAgY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfRE9UMTFfTU9ERSwgd25pRG90MTFtb2RlLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworfQorCit2b2lkIGNzclNldEdsb2JhbENmZ3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIGNjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xELCBjc3JHZXRGcmFnVGhyZXNoKHBNYWMpLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIGNjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsIGNzckdldFJUU1RocmVzaChwTWFjKSwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR18xMURfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICgocE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExaFN1cHBvcnRFbmFibGVkKSA/IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCA6IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCksIAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR18xMUhfRU5BQkxFRCwgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExaFN1cHBvcnRFbmFibGVkLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIC8vRW5hYmxlIGNoYW5uZWwgYm9uZGluZyBhdCBpbml0OyBmb3IgMi40IEdoeiB3ZSB3aWxsIHVwZGF0ZSB0aGlzIENGRyBhdCBzdGFydCBCU1Mgb3Igam9pbiAKKyAgICBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSwgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9FTkFCTEUsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfSEVBUlRfQkVBVF9USFJFU0hPTEQsIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSGVhcnRiZWF0VGhyZXNoMjQsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgCisgICAgLy9VcGRhdGUgdGhlIG9wZXJhdGluZyBtb2RlIHRvIGNvbmZpZ3VyZWQgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uLAorICAgIC8vU28gdGhhdCBjbGllbnQgY2FuIGFkdmVydGlzZSBmdWxsIGNhcGFiaWxpdGllcyBpbiBQcm9iZSByZXF1ZXN0IGZyYW1lLgorICAgIGNzclNldERlZmF1bHREb3QxMU1vZGUoIHBNYWMgKTsgICAgCit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtT3Blbih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiBpOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisKKyAgICBkbworICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgaSApOworICAgICAgICAgICAgcFNlc3Npb24tPnJvYW1pbmdUaW1lckluZm8ucE1hYyA9IHBNYWM7CisgICAgICAgICAgICBwU2Vzc2lvbi0+cm9hbWluZ1RpbWVySW5mby5zZXNzaW9uSWQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworICAgICAgICB9CisKKyAgICAgICAgcE1hYy0+cm9hbS5XYWl0Rm9yS2V5VGltZXJJbmZvLnBNYWMgPSBwTWFjOworICAgICAgICBwTWFjLT5yb2FtLldhaXRGb3JLZXlUaW1lckluZm8uc2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKyAgICAgICAgc3RhdHVzID0gcGFsVGltZXJBbGxvYyhwTWFjLT5oSGRkLCAmcE1hYy0+cm9hbS5oVGltZXJXYWl0Rm9yS2V5LCBjc3JSb2FtV2FpdEZvcktleVRpbWVPdXRIYW5kbGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBNYWMtPnJvYW0uV2FpdEZvcktleVRpbWVySW5mbyk7CisgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgV2FpdEZvcktleSB0aW1lIG91dCB0aW1lclxuIikpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3RhdHVzID0gcGFsVGltZXJBbGxvYyhwTWFjLT5oSGRkLCAmcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5oVGxTdGF0c1RpbWVyLCBjc3JSb2FtVGxTdGF0c1RpbWVySGFuZGxlciwgcE1hYyk7CisgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICB7CisgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN1bW1hcnkgU3RhdGlzdGljcyB0aW1lclxuIikpOworICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICB9CisgICAgfXdoaWxlICgwKTsKKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1DbG9zZSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTMyIHNlc3Npb25JZDsKKworICAgIGZvcihzZXNzaW9uSWQgPSAwOyBzZXNzaW9uSWQgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgc2Vzc2lvbklkKyspCisgICAgeworICAgICAgICBjc3JSb2FtQ2xvc2VTZXNzaW9uKHBNYWMsIHNlc3Npb25JZCwgVFJVRSwgTlVMTCwgTlVMTCk7CisgICAgfQorCisgICAgcGFsVGltZXJTdG9wKHBNYWMtPmhIZGQsIHBNYWMtPnJvYW0uaFRpbWVyV2FpdEZvcktleSk7CisgICAgcGFsVGltZXJGcmVlKHBNYWMtPmhIZGQsIHBNYWMtPnJvYW0uaFRpbWVyV2FpdEZvcktleSk7CisKKyAgICBwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5oVGxTdGF0c1RpbWVyKTsKKyAgICBwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5oVGxTdGF0c1RpbWVyKTsKKworICAgIHJldHVybiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtU3RhcnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICAodm9pZClwTWFjOworCisgICAgcmV0dXJuIChlSEFMX1NUQVRVU19TVUNDRVNTKTsKK30KKworCit2b2lkIGNzclJvYW1TdG9wKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCkKK3sKKyAgIGNzclJvYW1TdG9wUm9hbWluZ1RpbWVyKHBNYWMsIHNlc3Npb25JZCk7CisgICAvKiBkZXJlZ2lzdGVyIHRoZSBjbGllbnRzIHJlcXVlc3Rpbmcgc3RhdHMgZnJvbSBQRS9UTCAmIGFsc28gc3RvcCB0aGUgY29ycmVzcG9uZGluZyB0aW1lcnMqLworICAgY3NyUm9hbURlcmVnU3RhdGlzdGljc1JlcShwTWFjKTsKK30KKworZUhhbFN0YXR1cyBjc3JSb2FtR2V0Q29ubmVjdFN0YXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgZUNzckNvbm5lY3RTdGF0ZSAqcFN0YXRlKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICBpZiggcFN0YXRlICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICpwU3RhdGUgPSBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlOworICAgIH0gICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKworZUhhbFN0YXR1cyBjc3JSb2FtQ29weUNvbm5lY3RQcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdEFOSV9VMzIgc2l6ZSA9IDA7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgCisgICAgaWYocFByb2ZpbGUpCisgICAgeworICAgICAgICBpZihwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjKQorICAgICAgICB7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgPSBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5sZW5ndGggKyBzaXplb2YocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZihzaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBQcm9maWxlLT5wQnNzRGVzYywgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBQcm9maWxlLT5wQnNzRGVzYywgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYywgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlLT5wQnNzRGVzYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBQcm9maWxlLT5BdXRoVHlwZSA9IHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkF1dGhUeXBlOworICAgICAgICAgICAgICAgIHBQcm9maWxlLT5FbmNyeXB0aW9uVHlwZSA9IHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlOworICAgICAgICAgICAgICAgIHBQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlID0gcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZTsKKyAgICAgICAgICAgICAgICBwUHJvZmlsZS0+QlNTVHlwZSA9IHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGU7CisgICAgICAgICAgICAgICAgcFByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWwgPSBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsOworICAgICAgICAgICAgICAgIHBQcm9maWxlLT5DQk1vZGUgPSBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5DQk1vZGU7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcFByb2ZpbGUtPmJzc2lkLCAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwUHJvZmlsZS0+U1NJRCwgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLlNTSUQsIHNpemVvZih0U2lyTWFjU1NpZCkpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLk1ESUQubWRpZVByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZS0+TURJRC5tZGllUHJlc2VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlLT5NRElELm1vYmlsaXR5RG9tYWluID0gcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuTURJRC5tb2JpbGl0eURvbWFpbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQgPSAwOworICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZS0+TURJRC5tb2JpbGl0eURvbWFpbiA9IDA7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgICAgICAgcFByb2ZpbGUtPmlzQ0NYQXNzb2MgPSBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5pc0NDWEFzc29jOworCisgICAgICAgICAgICAgICAgaWYgKGNzcklzQXV0aFR5cGVDQ1gocFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuQXV0aFR5cGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFByb2ZpbGUtPmNjeENja21JbmZvLmtyaywgCisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5jY3hDY2ttSW5mby5rcmssIENTUl9LUktfS0VZX0xFTiApOworICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZS0+Y2N4Q2NrbUluZm8ucmVhc3NvY19yZXFfbnVtPQorICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuY2N4Q2NrbUluZm8ucmVhc3NvY19yZXFfbnVtOworICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZS0+Y2N4Q2NrbUluZm8ua3JrX3BsdW1iZWQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmNjeENja21JbmZvLmtya19wbHVtYmVkOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfXdoaWxlKDApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisKK2VIYWxTdGF0dXMgY3NyUm9hbUdldENvbm5lY3RQcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgCisgICAgaWYoY3NySXNDb25uU3RhdGVDb25uZWN0ZWQocE1hYywgc2Vzc2lvbklkKSkKKyAgICB7CisgICAgICAgIGlmKHBQcm9maWxlKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtQ29weUNvbm5lY3RQcm9maWxlKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCitlSGFsU3RhdHVzIGNzclJvYW1GcmVlQ29ubmVjdFByb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgCisgICAgaWYocFByb2ZpbGUtPnBCc3NEZXNjKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwUHJvZmlsZS0+cEJzc0Rlc2MpOworICAgIH0KKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBQcm9maWxlLCBzaXplb2YodENzclJvYW1Db25uZWN0ZWRQcm9maWxlKSk7CisgICAgcFByb2ZpbGUtPkF1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjsKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworc3RhdGljIGVIYWxTdGF0dXMgY3NyUm9hbUZyZWVDb25uZWN0ZWRJbmZvKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbUNvbm5lY3RlZEluZm8gKnBDb25uZWN0ZWRJbmZvICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBpZiggcENvbm5lY3RlZEluZm8tPnBiRnJhbWVzICkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBDb25uZWN0ZWRJbmZvLT5wYkZyYW1lcyApOworICAgICAgICBwQ29ubmVjdGVkSW5mby0+cGJGcmFtZXMgPSBOVUxMOworICAgIH0KKyAgICBwQ29ubmVjdGVkSW5mby0+bkJlYWNvbkxlbmd0aCA9IDA7CisgICAgcENvbm5lY3RlZEluZm8tPm5Bc3NvY1JlcUxlbmd0aCA9IDA7CisgICAgcENvbm5lY3RlZEluZm8tPm5Bc3NvY1JzcExlbmd0aCA9IDA7CisgICAgcENvbm5lY3RlZEluZm8tPnN0YUlkID0gMDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIHBDb25uZWN0ZWRJbmZvLT5uUklDUnNwTGVuZ3RoID0gMDsKKyNlbmRpZiAgICAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgcENvbm5lY3RlZEluZm8tPm5Uc3BlY0llTGVuZ3RoID0gMDsKKyNlbmRpZiAgICAKKworCisgICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKKworICAgIAorICAgICAgICAgICAgICAgIAordm9pZCBjc3JSZWxlYXNlQ29tbWFuZFJvYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisgICAgY3NyUmVpbml0Um9hbUNtZChwTWFjLCBwQ29tbWFuZCk7CisgICAgY3NyUmVsZWFzZUNvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7Cit9CisKKwordm9pZCBjc3JSZWxlYXNlQ29tbWFuZFNjYW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisgICAgY3NyUmVpbml0U2NhbkNtZChwTWFjLCBwQ29tbWFuZCk7CisgICAgY3NyUmVsZWFzZUNvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7Cit9CisKKwordm9pZCBjc3JSZWxlYXNlQ29tbWFuZFdtU3RhdHVzQ2hhbmdlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworICAgIGNzclJlaW5pdFdtU3RhdHVzQ2hhbmdlQ21kKHBNYWMsIHBDb21tYW5kKTsKKyAgICBjc3JSZWxlYXNlQ29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKK30KKworCit2b2lkIGNzclJlaW5pdFNldEtleUNtZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCkKK3sKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwQ29tbWFuZC0+dS5zZXRLZXlDbWQsIHNpemVvZih0U2V0S2V5Q21kKSk7Cit9CisKKwordm9pZCBjc3JSZWluaXRSZW1vdmVLZXlDbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcENvbW1hbmQtPnUucmVtb3ZlS2V5Q21kLCBzaXplb2YodFJlbW92ZUtleUNtZCkpOworfQorCisKK3ZvaWQgY3NyUmVsZWFzZUNvbW1hbmRTZXRLZXkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisgICAgY3NyUmVpbml0U2V0S2V5Q21kKHBNYWMsIHBDb21tYW5kKTsKKyAgICBjc3JSZWxlYXNlQ29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKK30KKwordm9pZCBjc3JSZWxlYXNlQ29tbWFuZFJlbW92ZUtleSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCkKK3sKKyAgICBjc3JSZWluaXRSZW1vdmVLZXlDbWQocE1hYywgcENvbW1hbmQpOworICAgIGNzclJlbGVhc2VDb21tYW5kKCBwTWFjLCBwQ29tbWFuZCApOworfQorCit2b2lkIGNzckFib3J0Q29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIHRBTklfQk9PTEVBTiBmU3RvcHBpbmcgKQoreworCisgICAgaWYoIGVTbWVDc3JDb21tYW5kTWFzayAmIHBDb21tYW5kLT5jb21tYW5kICkKKyAgICB7CisgICAgICAgIHN3aXRjaCAocENvbW1hbmQtPmNvbW1hbmQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlU21lQ29tbWFuZFNjYW46CisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGluZm9ybSB0aGUgcmVxdWVzdGVyIGJlZm9yZSBkcm9waW5nIHRoZSBzY2FuIGNvbW1hbmQKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIiVzOiBEcm9wIHNjYW4gcmVhc29uICVkIGNhbGxiYWNrIDB4JVhcbiIsIAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24sICh1bnNpZ25lZCBpbnQpcENvbW1hbmQtPnUuc2NhbkNtZC5jYWxsYmFjayk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBwQ29tbWFuZC0+dS5zY2FuQ21kLmNhbGxiYWNrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIiVzIGNhbGxiYWNrIHNjYW4gcmVxdWVzdGVyXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGNzclNjYW5DYWxsQ2FsbGJhY2socE1hYywgcENvbW1hbmQsIGVDU1JfU0NBTl9BQk9SVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZFNjYW4oIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTbWVDb21tYW5kUm9hbToKKyAgICAgICAgICAgIGNzclJlbGVhc2VDb21tYW5kUm9hbSggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRXbVN0YXR1c0NoYW5nZToKKyAgICAgICAgICAgIGNzclJlbGVhc2VDb21tYW5kV21TdGF0dXNDaGFuZ2UoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTbWVDb21tYW5kU2V0S2V5OgorICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRTZXRLZXkoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTbWVDb21tYW5kUmVtb3ZlS2V5OgorICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRSZW1vdmVLZXkoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICIgQ1NSIGFib3J0IHN0YW5kYXJkIGNvbW1hbmQgJWRcbiIsIHBDb21tYW5kLT5jb21tYW5kICk7CisgICAgICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisKKwordm9pZCBjc3JSb2FtU3Vic3RhdGVDaGFuZ2UoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVDc3JSb2FtU3ViU3RhdGUgTmV3U3Vic3RhdGUsIHRBTklfVTMyIHNlc3Npb25JZCkKK3sKKyAgICBzbXNMb2coIHBNYWMsIExPRzEsICIgICBDU1IgUm9hbVN1YnN0YXRlOiBbICVkIDw9PSAlZCBdXG4iLCBOZXdTdWJzdGF0ZSwgcE1hYy0+cm9hbS5jdXJTdWJTdGF0ZVtzZXNzaW9uSWRdKTsKKworCisgICAgaWYocE1hYy0+cm9hbS5jdXJTdWJTdGF0ZVtzZXNzaW9uSWRdID09IE5ld1N1YnN0YXRlKQorICAgIHsKKyAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgIHBNYWMtPnJvYW0uY3VyU3ViU3RhdGVbc2Vzc2lvbklkXSA9IE5ld1N1YnN0YXRlOworfQorCisKK2VDc3JSb2FtU3RhdGUgY3NyUm9hbVN0YXRlQ2hhbmdlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCBlQ3NyUm9hbVN0YXRlIE5ld1JvYW1TdGF0ZSwgdEFOSV9VOCBzZXNzaW9uSWQpCit7CisgICAgZUNzclJvYW1TdGF0ZSBQcmV2aW91c1N0YXRlOworICAgICAgICAgIAorICAgIHNtc0xvZyggcE1hYywgTE9HMSwgIkNTUiBSb2FtU3RhdGU6IFsgJWQgPD09ICVkIF1cbiIsIE5ld1JvYW1TdGF0ZSwgcE1hYy0+cm9hbS5jdXJTdGF0ZVtzZXNzaW9uSWRdKTsKKworICAgIFByZXZpb3VzU3RhdGUgPSBwTWFjLT5yb2FtLmN1clN0YXRlW3Nlc3Npb25JZF07CisgICAgCisgICAgaWYgKCBOZXdSb2FtU3RhdGUgIT0gcE1hYy0+cm9hbS5jdXJTdGF0ZVtzZXNzaW9uSWRdICkgCisgICAgeworICAgICAgICAvLyBXaGVuZXZlciB3ZSB0cmFuc2l0aW9uIE9VVCBvZiB0aGUgUm9hbWluZyBzdGF0ZSwgY2xlYXIgdGhlIFJvYW1pbmcgc3Vic3RhdGUuLi4KKyAgICAgICAgaWYgKCBDU1JfSVNfUk9BTV9KT0lOSU5HKHBNYWMsIHNlc3Npb25JZCkgKSAKKyAgICAgICAgeworICAgICAgICAgICAgY3NyUm9hbVN1YnN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1fU1VCU1RBVEVfTk9ORSwgc2Vzc2lvbklkICk7CisgICAgICAgIH0KKworICAgICAgICBwTWFjLT5yb2FtLmN1clN0YXRlW3Nlc3Npb25JZF0gPSBOZXdSb2FtU3RhdGU7CisgICAgfQorICAgIHJldHVybiggUHJldmlvdXNTdGF0ZSApOworfQorCisKK3ZvaWQgY3NyQXNzaWduUnNzaUZvckNhdGVnb3J5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY2F0T2Zmc2V0KQoreworICAgIGludCBpOworCisgICAgaWYoY2F0T2Zmc2V0KQorICAgIHsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5iQ2F0UnNzaU9mZnNldCA9IGNhdE9mZnNldDsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgQ1NSX05VTV9SU1NJX0NBVDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlJTU0lDYXRbQ1NSX05VTV9SU1NJX0NBVCAtIGkgLSAxXSA9IChpbnQpQ1NSX0JFU1RfUlNTSV9WQUxVRSAtIChpbnQpKGkgKiBjYXRPZmZzZXQpOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGluaXRDb25maWdQYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGludCBpOworCisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5hZ2luZ0NvdW50ID0gQ1NSX0FHSU5HX0NPVU5UOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHogPSBXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEU7CisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGU1R0h6ID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9FTkFCTEU7CisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5waHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFX1RBVVJVUzsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVCYW5kID0gZUNTUl9CQU5EX0FMTDsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnVDZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFX1RBVVJVUzsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkZyYWdtZW50YXRpb25UaHJlc2hvbGQgPSBlQ1NSX0RPVDExX0ZSQUdfVEhSRVNIX0RFRkFVTFQ7CisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5IZWFydGJlYXRUaHJlc2gyNCA9IDQwOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSGVhcnRiZWF0VGhyZXNoNTAgPSA0MDsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFkU3VwcG9ydEVuYWJsZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkT3JpZ2luYWwgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZVN1cHBvcnRFbmFibGVkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExaFN1cHBvcnRFbmFibGVkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUlRTVGhyZXNob2xkID0gMjM0NjsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNob3J0U2xvdFRpbWUgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLldNTVN1cHBvcnRNb2RlID0gZUNzclJvYW1XbW1BdXRvOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlR4UmF0ZSA9IGVDU1JfVFhfUkFURV9BVVRPOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaW1wc1NsZWVwVGltZSA9IENTUl9JRExFX1NDQU5fTk9fUFNfSU5URVJWQUw7CisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zY2FuQWdlVGltZU5DTlBTID0gQ1NSX1NDQU5fQUdJTkdfVElNRV9OT1RfQ09OTkVDVF9OT19QUzsgIAorICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2NhbkFnZVRpbWVOQ1BTID0gQ1NSX1NDQU5fQUdJTkdfVElNRV9OT1RfQ09OTkVDVF9XX1BTOyAgIAorICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2NhbkFnZVRpbWVDTlBTID0gQ1NSX1NDQU5fQUdJTkdfVElNRV9DT05ORUNUX05PX1BTOyAgIAorICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2NhbkFnZVRpbWVDUFMgPSBDU1JfU0NBTl9BR0lOR19USU1FX0NPTk5FQ1RfV19QUzsgICAKKyAgICBmb3IoaSA9IDA7IGkgPCBDU1JfTlVNX1JTU0lfQ0FUOyBpKyspCisgICAgeworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkJzc1ByZWZlclZhbHVlW2ldID0gaTsKKyAgICB9CisgICAgY3NyQXNzaWduUnNzaUZvckNhdGVnb3J5KHBNYWMsIENTUl9ERUZBVUxUX1JTU0lfREJfR0FQKTsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtaW5nVGltZSA9IENTUl9ERUZBVUxUX1JPQU1JTkdfVElNRTsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZFbmZvcmNlMTFkQ2hhbm5lbHMgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mU3VwcGxpY2FudENvdW50cnlDb2RlSGFzUHJpb3JpdHkgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZFbmZvcmNlQ291bnRyeUNvZGVNYXRjaCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZFbmZvcmNlRGVmYXVsdERvbWFpbiA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNYXhDaG5UaW1lID0gQ1NSX0FDVElWRV9NQVhfQ0hBTk5FTF9USU1FOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1pbkNoblRpbWUgPSBDU1JfQUNUSVZFX01JTl9DSEFOTkVMX1RJTUU7CisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1heENoblRpbWUgPSBDU1JfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNaW5DaG5UaW1lID0gQ1NSX1BBU1NJVkVfTUlOX0NIQU5ORUxfVElNRTsKKworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXNJZGxlU2NhbkVuYWJsZWQgPSBUUlVFOyAvL2VuYWJsZSB0aGUgaWRsZSBzY2FuIGJ5IGRlZmF1bHQKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwID0gQ1NSX01BWF9UWF9QT1dFUjsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnN0YXRzUmVxUGVyaW9kaWNpdHkgPSBDU1JfTUlOX0dMT0JBTF9TVEFUX1FVRVJZX1BFUklPRDsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnN0YXRzUmVxUGVyaW9kaWNpdHlJblBTID0gQ1NSX01JTl9HTE9CQUxfU1RBVF9RVUVSWV9QRVJJT0RfSU5fQk1QUzsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jc3IxMXJDb25maWcuSXNGVFJlc291cmNlUmVxU3VwcG9ydGVkID0gMDsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTWF4TmVpZ2hib3JSZXRyaWVzID0gMzsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkID0gMTIwOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5OZWlnaGJvclJlYXNzb2NSc3NpVGhyZXNob2xkID0gMTI1OworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5OZWlnaGJvclNjYW5NaW5DaGFuVGltZSA9IDIwOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5OZWlnaGJvclNjYW5NYXhDaGFuVGltZSA9IDQwOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5OZWlnaGJvclNjYW5UaW1lclBlcmlvZCA9IDIwMDsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uZWlnaGJvclNjYW5DaGFuTGlzdC5udW1DaGFubmVscyA9IDM7CisgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubmVpZ2hib3JTY2FuQ2hhbkxpc3QuY2hhbm5lbExpc3RbMF0gPSAxOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5laWdoYm9yU2NhbkNoYW5MaXN0LmNoYW5uZWxMaXN0WzFdID0gNjsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uZWlnaGJvclNjYW5DaGFuTGlzdC5jaGFubmVsTGlzdFsyXSA9IDExOworICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5OZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kID0gMjAwMDA7IC8vMjAgc2Vjb25kcworI2VuZGlmCisKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmFkZFRTV2hlbkFDTUlzT2ZmID0gMDsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZTY2FuVHdpY2UgPSBlQU5JX0JPT0xFQU5fRkFMU0U7Cit9CisKK2VDc3JCYW5kIGNzckdldEN1cnJlbnRCYW5kKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICByZXR1cm4gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5iYW5kQ2FwYWJpbGl0eTsKK30KKworZUhhbFN0YXR1cyBjc3JTZXRCYW5kKHRIYWxIYW5kbGUgaEhhbCwgZUNzckJhbmQgZUJhbmQpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIAorICAgIGlmIChDU1JfSVNfUEhZX01PREVfQV9PTkxZKHBNYWMpICYmCisgICAgICAgICAgICAoZUJhbmQgPT0gZUNTUl9CQU5EXzI0KSkKKyAgICB7CisgICAgICAgIC8qIERPVDExIG1vZGUgY29uZmlndXJlZCB0byAxMWEgb25seSBhbmQgcmVjZWl2ZWQgCisgICAgICAgICAgIHJlcXVlc3QgdG8gY2hhbmdlIHRoZSBiYW5kIHRvIDIuNCBHSHogKi8KKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgYmFuZCBjZmc4MDIxMSA9ICV1LCBiYW5kID0gJXVcbiIsICAKKyAgICAgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSwgZUJhbmQpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKChDU1JfSVNfUEhZX01PREVfQl9PTkxZKHBNYWMpIHx8CisgICAgICAgICAgICAgICAgQ1NSX0lTX1BIWV9NT0RFX0dfT05MWShwTWFjKSkgJiYKKyAgICAgICAgICAgIChlQmFuZCA9PSBlQ1NSX0JBTkRfNUcpKQorICAgIHsKKyAgICAgICAgLyogRE9UMTEgbW9kZSBjb25maWd1cmVkIHRvIDExYi8xMWcgb25seSBhbmQgcmVjZWl2ZWQgCisgICAgICAgICAgIHJlcXVlc3QgdG8gY2hhbmdlIHRoZSBiYW5kIHRvIDUgR0h6ICovCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IGJhbmQgZG90MTFtb2RlID0gJXUsIGJhbmQgPSAldVxuIiwgIAorICAgICAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS51Q2ZnRG90MTFNb2RlLCBlQmFuZCk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICJCYW5kIGNoYW5nZWQgdG8gJXUgKDAgLSBBTEwsIDEgLSAyLjQgR0haLCAyIC0gNUdIWilcbiIsIGVCYW5kKTsKKyAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVCYW5kID0gZUJhbmQ7IAorICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYmFuZENhcGFiaWxpdHkgPSBlQmFuZDsgCisgICAgY3NyU2NhbkdldFN1cHBvcnRlZENoYW5uZWxzKCBwTWFjICk7CisgICAgc3RhdHVzID0gY3NySW5pdEdldENoYW5uZWxzKCBwTWFjICk7CisgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKQorICAgICAgICBjc3JJbml0Q2hhbm5lbExpc3QoIGhIYWwgKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitlSGFsU3RhdHVzIGNzckNoYW5nZURlZmF1bHRDb25maWdQYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQ29uZmlnUGFyYW0gKnBQYXJhbSkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBpZihwUGFyYW0pCisgICAgeworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLldNTVN1cHBvcnRNb2RlID0gcFBhcmFtLT5XTU1TdXBwb3J0TW9kZTsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZVN1cHBvcnRFbmFibGVkID0gcFBhcmFtLT5JczExZVN1cHBvcnRFbmFibGVkOworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkZyYWdtZW50YXRpb25UaHJlc2hvbGQgPSBwUGFyYW0tPkZyYWdtZW50YXRpb25UaHJlc2hvbGQ7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCA9IHBQYXJhbS0+SXMxMWRTdXBwb3J0RW5hYmxlZDsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkT3JpZ2luYWwgPSBwUGFyYW0tPklzMTFkU3VwcG9ydEVuYWJsZWQ7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWhTdXBwb3J0RW5hYmxlZCA9IHBQYXJhbS0+SXMxMWhTdXBwb3J0RW5hYmxlZDsKKworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZlbmFibGVNQ0NNb2RlID0gcFBhcmFtLT5mRW5hYmxlTUNDTW9kZTsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jaGFubmVsQm9uZGluZ01vZGUyNEdIeiA9IHBQYXJhbS0+Y2hhbm5lbEJvbmRpbmdNb2RlMjRHSHo7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlNUdIeiA9IHBQYXJhbS0+Y2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5SVFNUaHJlc2hvbGQgPSBwUGFyYW0tPlJUU1RocmVzaG9sZDsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5waHlNb2RlID0gcFBhcmFtLT5waHlNb2RlOworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNob3J0U2xvdFRpbWUgPSBwUGFyYW0tPnNob3J0U2xvdFRpbWU7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSGVhcnRiZWF0VGhyZXNoMjQgPSBwUGFyYW0tPkhlYXJ0YmVhdFRocmVzaDI0OworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkhlYXJ0YmVhdFRocmVzaDUwID0gcFBhcmFtLT5IZWFydGJlYXRUaHJlc2g1MDsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZCA9IHBQYXJhbS0+UHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQ7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uVHhSYXRlID0gcFBhcmFtLT5UeFJhdGU7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uQWRIb2NDaGFubmVsMjQgPSBwUGFyYW0tPkFkSG9jQ2hhbm5lbDI0OworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkFkSG9jQ2hhbm5lbDVHID0gcFBhcmFtLT5BZEhvY0NoYW5uZWw1RzsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5iYW5kQ2FwYWJpbGl0eSA9IHBQYXJhbS0+YmFuZENhcGFiaWxpdHk7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2JDaG9pY2UgPSBwUGFyYW0tPmNiQ2hvaWNlOworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmJnU2NhbkludGVydmFsID0gcFBhcmFtLT5iZ1NjYW5JbnRlcnZhbDsKKworICAgICAgICAvL2lmIEhERCBwYXNzZWQgZG93biBub24gemVybyB2YWx1ZXMgdGhlbiBvbmx5IHVwZGF0ZSwKKyAgICAgICAgLy9vdGhlcndpc2Uga2VlcCB1c2luZyB0aGUgZGVmYXVsdHMKKyAgICAgICAgaWYocFBhcmFtLT5uQWN0aXZlTWF4Q2huVGltZSkKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWF4Q2huVGltZSA9IHBQYXJhbS0+bkFjdGl2ZU1heENoblRpbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYocFBhcmFtLT5uQWN0aXZlTWluQ2huVGltZSkKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWluQ2huVGltZSA9IHBQYXJhbS0+bkFjdGl2ZU1pbkNoblRpbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYocFBhcmFtLT5uUGFzc2l2ZU1heENoblRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNYXhDaG5UaW1lID0gcFBhcmFtLT5uUGFzc2l2ZU1heENoblRpbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYocFBhcmFtLT5uUGFzc2l2ZU1pbkNoblRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNaW5DaG5UaW1lID0gcFBhcmFtLT5uUGFzc2l2ZU1pbkNoblRpbWU7CisgICAgICAgIH0KKyAgICAgICAgLy9pZiB1cHBlciBsYXllciB3YW50cyB0byBkaXNhYmxlIGlkbGUgc2NhbiBhbHRvZ2V0aGVyIHNldCBpdCB0byAwCisgICAgICAgIGlmKHBQYXJhbS0+aW1wc1NsZWVwVGltZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9DaGFuZ2UgdGhlIHVuaXQgZnJvbSBzZWNvbmQgdG8gbWljcm9zZWNvbmQKKyAgICAgICAgICAgIHRBTklfVTMyIGltcHNTbGVlcFRpbWUgPSBwUGFyYW0tPmltcHNTbGVlcFRpbWUgKiBQQUxfVElNRVJfVE9fU0VDX1VOSVQ7CisKKyAgICAgICAgICAgIGlmKENTUl9JRExFX1NDQU5fTk9fUFNfSU5URVJWQUxfTUlOIDw9IGltcHNTbGVlcFRpbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pbXBzU2xlZXBUaW1lID0gaW1wc1NsZWVwVGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmltcHNTbGVlcFRpbWUgPSBDU1JfSURMRV9TQ0FOX05PX1BTX0lOVEVSVkFMOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmltcHNTbGVlcFRpbWUgPSAwOworICAgICAgICB9CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZUJhbmQgPSBwUGFyYW0tPmVCYW5kOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS51Q2ZnRG90MTFNb2RlID0gY3NyR2V0Q2ZnRG90MTFNb2RlRnJvbUNzclBoeU1vZGUoTlVMTCwgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5waHlNb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlByb3ByaWV0YXJ5UmF0ZXNFbmFibGVkKTsKKyNlbHNlCisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSA9IGNzckdldENmZ0RvdDExTW9kZUZyb21Dc3JQaHlNb2RlKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZCk7CisjZW5kaWYKKyAgICAgICAgLy9pZiBIREQgcGFzc2VkIGRvd24gbm9uIHplcm8gdmFsdWVzIGZvciBhZ2UgcGFyYW1zLCB0aGVuIG9ubHkgdXBkYXRlLAorICAgICAgICAvL290aGVyd2lzZSBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0cworICAgICAgICBpZihwUGFyYW0tPm5TY2FuUmVzdWx0QWdlQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYWdpbmdDb3VudCA9IHBQYXJhbS0+blNjYW5SZXN1bHRBZ2VDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBQYXJhbS0+c2NhbkFnZVRpbWVOQ05QUykKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zY2FuQWdlVGltZU5DTlBTID0gcFBhcmFtLT5zY2FuQWdlVGltZU5DTlBTOyAgCisgICAgICAgIH0KKworICAgICAgICBpZihwUGFyYW0tPnNjYW5BZ2VUaW1lTkNQUykKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zY2FuQWdlVGltZU5DUFMgPSBwUGFyYW0tPnNjYW5BZ2VUaW1lTkNQUzsgICAKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBQYXJhbS0+c2NhbkFnZVRpbWVDTlBTKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNjYW5BZ2VUaW1lQ05QUyA9IHBQYXJhbS0+c2NhbkFnZVRpbWVDTlBTOyAgIAorICAgICAgICB9CisgICAgICAgIGlmKHBQYXJhbS0+c2NhbkFnZVRpbWVDUFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2NhbkFnZVRpbWVDUFMgPSBwUGFyYW0tPnNjYW5BZ2VUaW1lQ1BTOyAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjc3JBc3NpZ25Sc3NpRm9yQ2F0ZWdvcnkocE1hYywgcFBhcmFtLT5iQ2F0UnNzaU9mZnNldCk7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublJvYW1pbmdUaW1lID0gcFBhcmFtLT5uUm9hbWluZ1RpbWU7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZkVuZm9yY2UxMWRDaGFubmVscyA9IHBQYXJhbS0+ZkVuZm9yY2UxMWRDaGFubmVsczsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mU3VwcGxpY2FudENvdW50cnlDb2RlSGFzUHJpb3JpdHkgPSBwUGFyYW0tPmZTdXBwbGljYW50Q291bnRyeUNvZGVIYXNQcmlvcml0eTsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mRW5mb3JjZUNvdW50cnlDb2RlTWF0Y2ggPSBwUGFyYW0tPmZFbmZvcmNlQ291bnRyeUNvZGVNYXRjaDsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mRW5mb3JjZURlZmF1bHREb21haW4gPSBwUGFyYW0tPmZFbmZvcmNlRGVmYXVsdERvbWFpbjsKKworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnZjY1Jzc2lUaHJlc2hvbGQgPSBwUGFyYW0tPnZjY1Jzc2lUaHJlc2hvbGQ7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udmNjVWxNYWNMb3NzVGhyZXNob2xkID0gcFBhcmFtLT52Y2NVbE1hY0xvc3NUaHJlc2hvbGQ7CisKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5Jc0lkbGVTY2FuRW5hYmxlZCA9IHBQYXJhbS0+SXNJZGxlU2NhbkVuYWJsZWQ7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc3RhdHNSZXFQZXJpb2RpY2l0eSA9IHBQYXJhbS0+c3RhdHNSZXFQZXJpb2RpY2l0eTsKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zdGF0c1JlcVBlcmlvZGljaXR5SW5QUyA9IHBQYXJhbS0+c3RhdHNSZXFQZXJpb2RpY2l0eUluUFM7CisgICAgICAgIC8vQXNzaWduIHRoaXMgYmVmb3JlIGNhbGxpbmcgQ3NySW5pdDExZEluZm8KKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uVHhQb3dlckNhcCA9IHBQYXJhbS0+blR4UG93ZXJDYXA7CisKKyAgICAgICAgaWYoIGNzcklzMTFkU3VwcG9ydGVkKCBwTWFjICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBDc3JJbml0MTFkSW5mbyhwTWFjLCAmcFBhcmFtLT5Dc3IxMWRpbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnNjYW4uY3VyU2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgICAgICB9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICZwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNzcjExckNvbmZpZywgJnBQYXJhbS0+Y3NyMTFyQ29uZmlnLCBzaXplb2YodENzcjExckNvbmZpZ1BhcmFtcykgKTsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCAiSXNGVFJlc291cmNlUmVxU3VwcCA9ICVkXG4iLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNzcjExckNvbmZpZy5Jc0ZUUmVzb3VyY2VSZXFTdXBwb3J0ZWQpOyAKKyNlbmRpZgorCisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fQ0NYKQorICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzRmFzdFRyYW5zaXRpb25FbmFibGVkID0gcFBhcmFtLT5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZDsKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWCAKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0NjeEluaUZlYXR1cmVFbmFibGVkID0gcFBhcmFtLT5pc0NjeEluaUZlYXR1cmVFbmFibGVkOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAmcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcsICZwUGFyYW0tPm5laWdoYm9yUm9hbUNvbmZpZywgc2l6ZW9mKHRDc3JOZWlnaGJvclJvYW1Db25maWdQYXJhbXMpICk7CisKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCAibk5laWdoYm9yU2NhblRpbWVyUGVyaW9pZCA9ICVkXG4iLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JTY2FuVGltZXJQZXJpb2QpOworICAgICAgICBzbXNMb2coIHBNYWMsIExPRzEsICJuTmVpZ2hib3JSZWFzc29jUnNzaVRocmVzaG9sZCA9ICVkXG4iLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JSZWFzc29jUnNzaVRocmVzaG9sZCk7ICAKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCAibk5laWdoYm9yTG9va3VwUnNzaVRocmVzaG9sZCA9ICVkXG4iLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkKTsgIAorICAgICAgICBzbXNMb2coIHBNYWMsIExPRzEsICJuTmVpZ2hib3JTY2FuTWluQ2hhblRpbWUgPSAlZFxuIiwgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yU2Nhbk1pbkNoYW5UaW1lKTsgCisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgIm5OZWlnaGJvclNjYW5NYXhDaGFuVGltZSA9ICVkXG4iLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWUpOworICAgICAgICBzbXNMb2coIHBNYWMsIExPRzEsICJuTWF4TmVpZ2hib3JSZXRyaWVzID0gJWRcbiIsIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5NYXhOZWlnaGJvclJldHJpZXMpOyAKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCAibk5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2QgPSAlZFxuIiwgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2QpOyAKKworICAgICAgICB7CisgICAgICAgICAgIGludCBpOworICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPRzEsIEZMKCJOdW0gb2YgQ2hhbm5lbHMgaW4gQ0ZHIENoYW5uZWwgTGlzdDogJWRcbiIpLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uZWlnaGJvclNjYW5DaGFuTGlzdC5udW1DaGFubmVscyk7IAorCisgICAgICAgICAgIGZvciggaT0wOyBpPCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uZWlnaGJvclNjYW5DaGFuTGlzdC5udW1DaGFubmVsczsgaSsrKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgIiVkICIsIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5laWdoYm9yU2NhbkNoYW5MaXN0LmNoYW5uZWxMaXN0W2ldICk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCAiXG4iKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5hZGRUU1doZW5BQ01Jc09mZiA9IHBQYXJhbS0+YWRkVFNXaGVuQUNNSXNPZmY7CisgICAgICAgIHBNYWMtPnNjYW4uZlZhbGlkYXRlTGlzdCA9IHBQYXJhbS0+ZlZhbGlkYXRlTGlzdDsKKyAgICAgICAgcE1hYy0+c2Nhbi5mRW5hYmxlQnlwYXNzMTFkID0gcFBhcmFtLT5mRW5hYmxlQnlwYXNzMTFkOworICAgICAgICBwTWFjLT5zY2FuLmZFbmFibGVERlNDaG5sU2NhbiA9IHBQYXJhbS0+ZkVuYWJsZURGU0NobmxTY2FuOworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZTY2FuVHdpY2UgPSBwUGFyYW0tPmZTY2FuVHdpY2U7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworZUhhbFN0YXR1cyBjc3JHZXRDb25maWdQYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQ29uZmlnUGFyYW0gKnBQYXJhbSkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworCisgICAgaWYocFBhcmFtKQorICAgIHsKKyAgICAgICAgcFBhcmFtLT5XTU1TdXBwb3J0TW9kZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uV01NU3VwcG9ydE1vZGU7CisgICAgICAgIHBQYXJhbS0+SXMxMWVTdXBwb3J0RW5hYmxlZCA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWVTdXBwb3J0RW5hYmxlZDsKKyAgICAgICAgcFBhcmFtLT5GcmFnbWVudGF0aW9uVGhyZXNob2xkID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5GcmFnbWVudGF0aW9uVGhyZXNob2xkOworICAgICAgICBwUGFyYW0tPklzMTFkU3VwcG9ydEVuYWJsZWQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFkU3VwcG9ydEVuYWJsZWQ7CisgICAgICAgIHBQYXJhbS0+SXMxMWRTdXBwb3J0RW5hYmxlZE9yaWdpbmFsID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkT3JpZ2luYWw7CisgICAgICAgIHBQYXJhbS0+SXMxMWhTdXBwb3J0RW5hYmxlZCA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWhTdXBwb3J0RW5hYmxlZDsKKyAgICAgICAgcFBhcmFtLT5jaGFubmVsQm9uZGluZ01vZGUyNEdIeiA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHo7CisgICAgICAgIHBQYXJhbS0+Y2hhbm5lbEJvbmRpbmdNb2RlNUdIeiA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKKyAgICAgICAgcFBhcmFtLT5SVFNUaHJlc2hvbGQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlJUU1RocmVzaG9sZDsKKyAgICAgICAgcFBhcmFtLT5waHlNb2RlID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5waHlNb2RlOworICAgICAgICBwUGFyYW0tPnNob3J0U2xvdFRpbWUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNob3J0U2xvdFRpbWU7CisgICAgICAgIHBQYXJhbS0+SGVhcnRiZWF0VGhyZXNoMjQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkhlYXJ0YmVhdFRocmVzaDI0OworICAgICAgICBwUGFyYW0tPkhlYXJ0YmVhdFRocmVzaDUwID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5IZWFydGJlYXRUaHJlc2g1MDsKKyAgICAgICAgcFBhcmFtLT5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZCA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQ7CisgICAgICAgIHBQYXJhbS0+VHhSYXRlID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5UeFJhdGU7CisgICAgICAgIHBQYXJhbS0+QWRIb2NDaGFubmVsMjQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkFkSG9jQ2hhbm5lbDI0OworICAgICAgICBwUGFyYW0tPkFkSG9jQ2hhbm5lbDVHID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5BZEhvY0NoYW5uZWw1RzsKKyAgICAgICAgcFBhcmFtLT5iYW5kQ2FwYWJpbGl0eSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYmFuZENhcGFiaWxpdHk7CisgICAgICAgIHBQYXJhbS0+Y2JDaG9pY2UgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNiQ2hvaWNlOworICAgICAgICBwUGFyYW0tPmJnU2NhbkludGVydmFsID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5iZ1NjYW5JbnRlcnZhbDsKKworICAgICAgICBwUGFyYW0tPm5BY3RpdmVNYXhDaG5UaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWF4Q2huVGltZTsKKyAgICAgICAgcFBhcmFtLT5uQWN0aXZlTWluQ2huVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1pbkNoblRpbWU7CisgICAgICAgIHBQYXJhbS0+blBhc3NpdmVNYXhDaG5UaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1heENoblRpbWU7CisgICAgICAgIHBQYXJhbS0+blBhc3NpdmVNaW5DaG5UaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1pbkNoblRpbWU7CisKKyAgICAgICAgLy9DaGFuZ2UgdGhlIHVuaXQgZnJvbSBtaWNyb3NlY29uZCB0byBzZWNvbmQKKyAgICAgICAgcFBhcmFtLT5pbXBzU2xlZXBUaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pbXBzU2xlZXBUaW1lIC8gUEFMX1RJTUVSX1RPX1NFQ19VTklUOworICAgICAgICBwUGFyYW0tPmVCYW5kID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lQmFuZDsKKyAgICAgICAgcFBhcmFtLT5uU2NhblJlc3VsdEFnZUNvdW50ID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5hZ2luZ0NvdW50OworICAgICAgICBwUGFyYW0tPnNjYW5BZ2VUaW1lTkNOUFMgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNjYW5BZ2VUaW1lTkNOUFM7ICAKKyAgICAgICAgcFBhcmFtLT5zY2FuQWdlVGltZU5DUFMgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNjYW5BZ2VUaW1lTkNQUzsgICAKKyAgICAgICAgcFBhcmFtLT5zY2FuQWdlVGltZUNOUFMgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNjYW5BZ2VUaW1lQ05QUzsgICAKKyAgICAgICAgcFBhcmFtLT5zY2FuQWdlVGltZUNQUyA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2NhbkFnZVRpbWVDUFM7ICAgCisgICAgICAgIHBQYXJhbS0+YkNhdFJzc2lPZmZzZXQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmJDYXRSc3NpT2Zmc2V0OworICAgICAgICBwUGFyYW0tPm5Sb2FtaW5nVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublJvYW1pbmdUaW1lOworICAgICAgICBwUGFyYW0tPmZFbmZvcmNlMTFkQ2hhbm5lbHMgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZFbmZvcmNlMTFkQ2hhbm5lbHM7CisgICAgICAgIHBQYXJhbS0+ZlN1cHBsaWNhbnRDb3VudHJ5Q29kZUhhc1ByaW9yaXR5ID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mU3VwcGxpY2FudENvdW50cnlDb2RlSGFzUHJpb3JpdHk7CisgICAgICAgIHBQYXJhbS0+ZkVuZm9yY2VDb3VudHJ5Q29kZU1hdGNoID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mRW5mb3JjZUNvdW50cnlDb2RlTWF0Y2g7CisgICAgICAgIHBQYXJhbS0+ZkVuZm9yY2VEZWZhdWx0RG9tYWluID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mRW5mb3JjZURlZmF1bHREb21haW47ICAgICAgICAKKyAgICAgICAgcFBhcmFtLT52Y2NSc3NpVGhyZXNob2xkID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS52Y2NSc3NpVGhyZXNob2xkOworICAgICAgICBwUGFyYW0tPnZjY1VsTWFjTG9zc1RocmVzaG9sZCA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udmNjVWxNYWNMb3NzVGhyZXNob2xkOworCisgICAgICAgIHBQYXJhbS0+SXNJZGxlU2NhbkVuYWJsZWQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzSWRsZVNjYW5FbmFibGVkOworICAgICAgICBwUGFyYW0tPm5UeFBvd2VyQ2FwID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uVHhQb3dlckNhcDsKKyAgICAgICAgcFBhcmFtLT5zdGF0c1JlcVBlcmlvZGljaXR5ID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zdGF0c1JlcVBlcmlvZGljaXR5OworICAgICAgICBwUGFyYW0tPnN0YXRzUmVxUGVyaW9kaWNpdHlJblBTID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zdGF0c1JlcVBlcmlvZGljaXR5SW5QUzsKKworICAgICAgICBwUGFyYW0tPmFkZFRTV2hlbkFDTUlzT2ZmID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5hZGRUU1doZW5BQ01Jc09mZjsKKyAgICAgICAgcFBhcmFtLT5mVmFsaWRhdGVMaXN0ID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mVmFsaWRhdGVMaXN0OworICAgICAgICBwUGFyYW0tPmZFbmFibGVCeXBhc3MxMWQgPSBwTWFjLT5zY2FuLmZFbmFibGVCeXBhc3MxMWQ7CisgICAgICAgIHBQYXJhbS0+ZkVuYWJsZURGU0NobmxTY2FuID0gcE1hYy0+c2Nhbi5mRW5hYmxlREZTQ2hubFNjYW47CisgICAgICAgIHBQYXJhbS0+ZlNjYW5Ud2ljZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZlNjYW5Ud2ljZTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICZwUGFyYW0tPm5laWdoYm9yUm9hbUNvbmZpZywgJnBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLCBzaXplb2YodENzck5laWdoYm9yUm9hbUNvbmZpZ1BhcmFtcykgKTsKKyNlbmRpZgorCisgICAgICAgIGNzclNldENoYW5uZWxzKHBNYWMsIHBQYXJhbSk7CisKKyAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTZXRQaHlNb2RlKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgcGh5TW9kZSwgZUNzckJhbmQgZUJhbmQsIHRBTklfQk9PTEVBTiAqcGZSZXN0YXJ0TmVlZGVkKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdEFOSV9CT09MRUFOIGZSZXN0YXJ0TmVlZGVkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGVDc3JQaHlNb2RlIG5ld1BoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfQVVUTzsKKworICAgIGRvCisgICAgeworICAgICAgICBpZihlQ1NSX0JBTkRfMjQgPT0gZUJhbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKENTUl9JU19SQURJT19BX09OTFkocE1hYykpIGJyZWFrOworICAgICAgICAgICAgaWYoKGVDU1JfRE9UMTFfTU9ERV8xMWEgJiBwaHlNb2RlKSB8fCAoZUNTUl9ET1QxMV9NT0RFXzExYV9PTkxZICYgcGh5TW9kZSkpIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKGVDU1JfQkFORF81RyA9PSBlQmFuZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoQ1NSX0lTX1JBRElPX0JHX09OTFkocE1hYykpIGJyZWFrOworICAgICAgICAgICAgaWYoKGVDU1JfRE9UMTFfTU9ERV8xMWIgJiBwaHlNb2RlKSB8fCAoZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZICYgcGh5TW9kZSkgfHwKKyAgICAgICAgICAgICAgICAoZUNTUl9ET1QxMV9NT0RFXzExZyAmIHBoeU1vZGUpIHx8IChlQ1NSX0RPVDExX01PREVfMTFnX09OTFkgJiBwaHlNb2RlKSAKKyAgICAgICAgICAgICAgICApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCgwID09IHBoeU1vZGUpIHx8IChlQ1NSX0RPVDExX01PREVfVEFVUlVTICYgcGh5TW9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld1BoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfVEFVUlVTOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoZUNTUl9ET1QxMV9NT0RFX0FVVE8gJiBwaHlNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdQaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFX0FVVE87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0NoZWNrIGZvciBkdWFsIGJhbmQgYW5kIGhpZ2hlciBjYXBhYmlsaXR5IGZpcnN0CisgICAgICAgICAgICBpZihlQ1NSX0RPVDExX01PREVfMTFuX09OTFkgJiBwaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGVDU1JfRE9UMTFfTU9ERV8xMW5fT05MWSAhPSBwaHlNb2RlKSBicmVhazsKKyAgICAgICAgICAgICAgICBuZXdQaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExbl9PTkxZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihlQ1NSX0RPVDExX01PREVfMTFhX09OTFkgJiBwaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGVDU1JfRE9UMTFfTU9ERV8xMWFfT05MWSAhPSBwaHlNb2RlKSBicmVhazsKKyAgICAgICAgICAgICAgICBpZihlQ1NSX0JBTkRfMjQgPT0gZUJhbmQpIGJyZWFrOworICAgICAgICAgICAgICAgIG5ld1BoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFhX09OTFk7CisgICAgICAgICAgICAgICAgZUJhbmQgPSBlQ1NSX0JBTkRfNUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWSAmIHBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZICE9IHBoeU1vZGUpIGJyZWFrOworICAgICAgICAgICAgICAgIGlmKGVDU1JfQkFORF81RyA9PSBlQmFuZCkgYnJlYWs7CisgICAgICAgICAgICAgICAgbmV3UGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWTsKKyAgICAgICAgICAgICAgICBlQmFuZCA9IGVDU1JfQkFORF8yNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZICYgcGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihlQ1NSX0RPVDExX01PREVfMTFiX09OTFkgIT0gcGh5TW9kZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYoZUNTUl9CQU5EXzVHID09IGVCYW5kKSBicmVhazsKKyAgICAgICAgICAgICAgICBuZXdQaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZOworICAgICAgICAgICAgICAgIGVCYW5kID0gZUNTUl9CQU5EXzI0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihlQ1NSX0RPVDExX01PREVfMTFuICYgcGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdQaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoZUNTUl9ET1QxMV9NT0RFX2FiZyAmIHBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3UGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV9hYmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGVDU1JfRE9UMTFfTU9ERV8xMWEgJiBwaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKChlQ1NSX0RPVDExX01PREVfMTFnICYgcGh5TW9kZSkgfHwgKGVDU1JfRE9UMTFfTU9ERV8xMWIgJiBwaHlNb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKGVDU1JfQkFORF9BTEwgPT0gZUJhbmQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfYWJnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9iYWQgc2V0dGluZworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3UGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWE7CisgICAgICAgICAgICAgICAgICAgIGVCYW5kID0gZUNTUl9CQU5EXzVHOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoZUNTUl9ET1QxMV9NT0RFXzExZyAmIHBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3UGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWc7CisgICAgICAgICAgICAgICAgZUJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGVDU1JfRE9UMTFfTU9ERV8xMWIgJiBwaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld1BoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFiOworICAgICAgICAgICAgICAgIGVCYW5kID0gZUNTUl9CQU5EXzI0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vV2Ugd2lsbCBuZXZlciBiZSBoZXJlCisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGNhbm5vdCByZWNvZ25pemUgdGhlIHBoeSBtb2RlIDB4JTA4WFxuIiksIHBoeU1vZGUgKTsKKyAgICAgICAgICAgICAgICBuZXdQaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFX0FVVE87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL0RvbmUgdmFsaWRhdGluZworICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICAgICAgIC8vTm93IHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBhIHJlc3RhcnQgaXMgbmVlZGVkLgorICAgICAgICBpZihlQmFuZCAhPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVCYW5kKQorICAgICAgICB7CisgICAgICAgICAgICBmUmVzdGFydE5lZWRlZCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYobmV3UGh5TW9kZSAhPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZSZXN0YXJ0TmVlZGVkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfXdoaWxlKDApOworCisgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgeworICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVCYW5kID0gZUJhbmQ7CisgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ucGh5TW9kZSA9IG5ld1BoeU1vZGU7CisgICAgICAgIGlmKHBmUmVzdGFydE5lZWRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgKnBmUmVzdGFydE5lZWRlZCA9IGZSZXN0YXJ0TmVlZGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorICAgIAorCit2b2lkIGNzclBydW5lQ2hhbm5lbExpc3RGb3JNb2RlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQ2hhbm5lbCAqcENoYW5uZWxMaXN0ICkKK3sKKyAgICB0QU5JX1U4IEluZGV4OworICAgIHRBTklfVTggY0NoYW5uZWxzOworCisgICAgLy8gZm9yIGR1YWwgYmFuZCBOSUNzLCBkb24ndCBuZWVkIHRvIHRyaW0gdGhlIGNoYW5uZWwgbGlzdC4uLi4KKyAgICBpZiAoICFDU1JfSVNfT1BFQVJUSU5HX0RVQUxfQkFORCggcE1hYyApICkKKyAgICB7CisgICAgICAgIC8vIDIuNCBHSHogYmFuZCBvcGVyYXRpb24gcmVxdWlyZXMgdGhlIGNoYW5uZWwgbGlzdCB0byBiZSB0cmltbWVkIHRvCisgICAgICAgIC8vIHRoZSAyLjQgR0h6IGNoYW5uZWxzIG9ubHkuLi4KKyAgICAgICAgaWYgKCBDU1JfSVNfMjRfQkFORF9PTkxZKCBwTWFjICkgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIEluZGV4ID0gMCwgY0NoYW5uZWxzID0gMDsgSW5kZXggPCBwQ2hhbm5lbExpc3QtPm51bUNoYW5uZWxzOworICAgICAgICAgICAgICAgICBJbmRleCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIENTUl9JU19DSEFOTkVMXzI0R0haKHBDaGFubmVsTGlzdC0+Y2hhbm5lbExpc3RbIEluZGV4IF0pICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBDaGFubmVsTGlzdC0+Y2hhbm5lbExpc3RbIGNDaGFubmVscyBdID0gcENoYW5uZWxMaXN0LT5jaGFubmVsTGlzdFsgSW5kZXggXTsKKyAgICAgICAgICAgICAgICAgICAgY0NoYW5uZWxzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDbGVhbnVwIHRoZSByZXN0IG9mIGNoYW5uZWxzLiAgIE5vdGUgd2Ugb25seSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBjaGFubmVscyBpZiB3ZSBoYWQKKyAgICAgICAgICAgIC8vIHRvIHRyaW0gdGhlIGxpc3QuICBDYWxsaW5nIHBhbFplcm9NZW1vcnkoKSB3aXRoIGEgMCBzaXplIGlzIGdvaW5nIHRvIHRocm93IGFzc2VydHMgb24gCisgICAgICAgICAgICAvLyB0aGUgZGVidWcgYnVpbGRzIHNvIGxldCdzIGJlIGEgYml0IHNtYXJ0ZXIgYWJvdXQgdGhhdC4gIFplcm8gb3V0IHRoZSByZXNldCBvZiB0aGUgY2hhbm5lbHMKKyAgICAgICAgICAgIC8vIG9ubHkgaWYgd2UgbmVlZCB0by4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGUgYW1vdW50IG9mIG1lbW9yeSB0byBjbGVhciBpcyB0aGUgbnVtYmVyIG9mIGNoYW5uZXNsIHRoYXQgd2UgdHJpbW1lZCAKKyAgICAgICAgICAgIC8vIChwQ2hhbm5lbExpc3QtPm51bUNoYW5uZWxzIC0gY0NoYW5uZWxzKSB0aW1lcyB0aGUgc2l6ZSBvZiBhIGNoYW5uZWwgaW4gdGhlIHN0cnVjdHVyZS4KKyAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHBDaGFubmVsTGlzdC0+bnVtQ2hhbm5lbHMgPiBjQ2hhbm5lbHMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICZwQ2hhbm5lbExpc3QtPmNoYW5uZWxMaXN0WyBjQ2hhbm5lbHMgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHBDaGFubmVsTGlzdC0+Y2hhbm5lbExpc3RbIDAgXSApICogKCBwQ2hhbm5lbExpc3QtPm51bUNoYW5uZWxzIC0gY0NoYW5uZWxzICkgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcENoYW5uZWxMaXN0LT5udW1DaGFubmVscyA9IGNDaGFubmVsczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggQ1NSX0lTXzVHX0JBTkRfT05MWSggcE1hYyApICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggSW5kZXggPSAwLCBjQ2hhbm5lbHMgPSAwOyBJbmRleCA8IHBDaGFubmVsTGlzdC0+bnVtQ2hhbm5lbHM7IEluZGV4KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggQ1NSX0lTX0NIQU5ORUxfNUdIWihwQ2hhbm5lbExpc3QtPmNoYW5uZWxMaXN0WyBJbmRleCBdKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbExpc3QtPmNoYW5uZWxMaXN0WyBjQ2hhbm5lbHMgXSA9IHBDaGFubmVsTGlzdC0+Y2hhbm5lbExpc3RbIEluZGV4IF07CisgICAgICAgICAgICAgICAgICAgIGNDaGFubmVscysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2xlYW51cCB0aGUgcmVzdCBvZiBjaGFubmVscy4gICBOb3RlIHdlIG9ubHkgbmVlZCB0byBjbGVhbiB1cCB0aGUgY2hhbm5lbHMgaWYgd2UgaGFkCisgICAgICAgICAgICAvLyB0byB0cmltIHRoZSBsaXN0LiAgQ2FsbGluZyBwYWxaZXJvTWVtb3J5KCkgd2l0aCBhIDAgc2l6ZSBpcyBnb2luZyB0byB0aHJvdyBhc3NlcnRzIG9uIAorICAgICAgICAgICAgLy8gdGhlIGRlYnVnIGJ1aWxkcyBzbyBsZXQncyBiZSBhIGJpdCBzbWFydGVyIGFib3V0IHRoYXQuICBaZXJvIG91dCB0aGUgcmVzZXQgb2YgdGhlIGNoYW5uZWxzCisgICAgICAgICAgICAvLyBvbmx5IGlmIHdlIG5lZWQgdG8uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gY2xlYXIgaXMgdGhlIG51bWJlciBvZiBjaGFubmVzbCB0aGF0IHdlIHRyaW1tZWQgCisgICAgICAgICAgICAvLyAocENoYW5uZWxMaXN0LT5udW1DaGFubmVscyAtIGNDaGFubmVscykgdGltZXMgdGhlIHNpemUgb2YgYSBjaGFubmVsIGluIHRoZSBzdHJ1Y3R1cmUuCisgICAgICAgICAgICBpZiAoIHBDaGFubmVsTGlzdC0+bnVtQ2hhbm5lbHMgPiBjQ2hhbm5lbHMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICZwQ2hhbm5lbExpc3QtPmNoYW5uZWxMaXN0WyBjQ2hhbm5lbHMgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHBDaGFubmVsTGlzdC0+Y2hhbm5lbExpc3RbIDAgXSApICogKCBwQ2hhbm5lbExpc3QtPm51bUNoYW5uZWxzIC0gY0NoYW5uZWxzICkgKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHBDaGFubmVsTGlzdC0+bnVtQ2hhbm5lbHMgPSBjQ2hhbm5lbHM7CisgICAgICAgIH0KKyAgICB9CisKK30KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNkZWZpbmUgSU5GUkFfQVBfREVGQVVMVF9DSEFOTkVMIDYKK2VIYWxTdGF0dXMgY3NySXNWYWxpZENoYW5uZWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjaG5OdW0pCit7CisgICAgdEFOSV9VOCBpbmRleD0gMDsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgZm9yIChpbmRleD0wOyBpbmRleCA8IHBNYWMtPnNjYW4uYmFzZTIwTUh6Q2hhbm5lbHMubnVtQ2hhbm5lbHMgO2luZGV4KyspCisgICAgeworICAgICAgICBpZihwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLmNoYW5uZWxMaXN0WyBpbmRleCBdID09IGNobk51bSl7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCitlSGFsU3RhdHVzIGNzckluaXRHZXRDaGFubmVscyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0QU5JX1U4IG51bTIwTUh6Q2hhbm5lbHNGb3VuZCA9IDA7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICAgdEFOSV9VOCBJbmRleCA9IDA7CisgICAgdEFOSV9VOCBudW00ME1IekNoYW5uZWxzRm91bmQgPSAwOworCisgICAgCisgICAgLy9UT0RPOiB0aGlzIGludGVyZmFjZSBjaGFuZ2VkIHRvIGluY2x1ZGUgdGhlIDQwTUh6IGNoYW5uZWwgbGlzdAorICAgIC8vIHRoaXMgbmVlZHMgdG8gYmUgdGllZCBpbnRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZSBzb21laG93IGFuZCByZWZlcmVuY2VkIGFwcHJvcHJpYXRlbHkgZm9yIENCIG9wZXJhdGlvbgorICAgIC8vIFJlYWQgdGhlIHNjYW4gY2hhbm5lbCBsaXN0IChpbmNsdWRpbmcgdGhlIHBvd2VyIGxpbWl0KSBmcm9tIEVFUFJPTQorICAgIHZvc1N0YXR1cyA9IHZvc19udl9nZXRDaGFubmVsTGlzdFdpdGhQb3dlciggcE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZSwgJm51bTIwTUh6Q2hhbm5lbHNGb3VuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5zY2FuLmRlZmF1bHRQb3dlclRhYmxlNDBNSHosICZudW00ME1IekNoYW5uZWxzRm91bmQpOworICAgIGlmICggKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpIHx8IChudW0yME1IekNoYW5uZWxzRm91bmQgPT0gMCkgKQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiZmFpbGVkIHRvIGdldCBjaGFubmVscyBcbiIpKTsKKyAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCBudW0yME1IekNoYW5uZWxzRm91bmQgPiBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4gKQorICAgICAgICB7CisgICAgICAgICAgICBudW0yME1IekNoYW5uZWxzRm91bmQgPSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU47CisgICAgICAgIH0KKyAgICAgICAgcE1hYy0+c2Nhbi5udW1DaGFubmVsc0RlZmF1bHQgPSBudW0yME1IekNoYW5uZWxzRm91bmQ7CisgICAgICAgIC8vIE1vdmUgdGhlIGNoYW5uZWwgbGlzdCB0byB0aGUgZ2xvYmFsIGRhdGEKKyAgICAgICAgLy8gc3RydWN0dXJlIC0tIHRoaXMgd2lsbCBiZSB1c2VkIGFzIHRoZSBzY2FuIGxpc3QKKyAgICAgICAgZm9yICggSW5kZXggPSAwOyBJbmRleCA8IG51bTIwTUh6Q2hhbm5lbHNGb3VuZDsgSW5kZXgrKykKKyAgICAgICAgeworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAvKiBOZWVkIHRvIGZpeCB0aGlzIHdoaWxlIGRlYWxpbmcgd2l0aCBOViBpdGVtICovCisgICAgICAgICAgICBwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLmNoYW5uZWxMaXN0WyBJbmRleCBdID0gcE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZVsgSW5kZXggXS5jaGFuSWQ7CisjZWxzZQorICAgICAgICAgICBwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLmNoYW5uZWxMaXN0WyBJbmRleCBdID0gSW5kZXggKyAxOworICAgICAgICAgICBwTWFjLT5zY2FuLmRlZmF1bHRQb3dlclRhYmxlW0luZGV4XS5jaGFuSWQgPSBJbmRleCArIDE7CisgICAgICAgICAgIHBNYWMtPnNjYW4uZGVmYXVsdFBvd2VyVGFibGVbSW5kZXhdLnB3ciA9IDI1OworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgcE1hYy0+c2Nhbi5iYXNlMjBNSHpDaGFubmVscy5udW1DaGFubmVscyA9IG51bTIwTUh6Q2hhbm5lbHNGb3VuZDsKKyAgICAgICAgaWYobnVtNDBNSHpDaGFubmVsc0ZvdW5kID4gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOKQorICAgICAgICB7CisgICAgICAgICAgICBudW00ME1IekNoYW5uZWxzRm91bmQgPSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU47CisgICAgICAgIH0KKyAgICAgICAgZm9yICggSW5kZXggPSAwOyBJbmRleCA8IG51bTQwTUh6Q2hhbm5lbHNGb3VuZDsgSW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+c2Nhbi5iYXNlNDBNSHpDaGFubmVscy5jaGFubmVsTGlzdFsgSW5kZXggXSA9IHBNYWMtPnNjYW4uZGVmYXVsdFBvd2VyVGFibGU0ME1IelsgSW5kZXggXS5jaGFuSWQ7CisgICAgICAgIH0KKyAgICAgICAgcE1hYy0+c2Nhbi5iYXNlNDBNSHpDaGFubmVscy5udW1DaGFubmVscyA9IG51bTQwTUh6Q2hhbm5lbHNGb3VuZDsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7ICAKK30KKworCitlSGFsU3RhdHVzIGNzckluaXRDaGFubmVsTGlzdCggdEhhbEhhbmRsZSBoSGFsICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBjc3JQcnVuZUNoYW5uZWxMaXN0Rm9yTW9kZShwTWFjLCAmcE1hYy0+c2Nhbi5iYXNlQ2hhbm5lbHMpOworICAgIGNzclBydW5lQ2hhbm5lbExpc3RGb3JNb2RlKHBNYWMsICZwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzKTsKKyAgICAvLyBBcHBseSB0aGUgYmFzZSBjaGFubmVsIGxpc3QsIHBvd2VyIGluZm8sIGFuZCBzZXQgdGhlIENvdW50cnkgY29kZS4uLgorICAgIGNzckFwcGx5Q2hhbm5lbFBvd2VyQ291bnRyeUluZm8oIHBNYWMsICZwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLCBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCApOworIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzckNoYW5nZUNvbmZpZ1BhcmFtcyh0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JVcGRhdGVDb25maWdQYXJhbSAqcFVwZGF0ZUNvbmZpZ1BhcmFtKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdENzcjExZGluZm8gKnBzMTFkaW5mbyA9IE5VTEw7CisKKyAgIHBzMTFkaW5mbyA9ICZwVXBkYXRlQ29uZmlnUGFyYW0tPkNzcjExZGluZm87CisgICBzdGF0dXMgPSBDc3JJbml0MTFkSW5mbyhwTWFjLCBwczExZGluZm8pOworICAgcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0aWMgZUhhbFN0YXR1cyBDc3JJbml0MTFkSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyMTFkaW5mbyAqcHMxMWRpbmZvKQoreworICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgIHRBTklfVTggIGluZGV4OworICB0QU5JX1UzMiBjb3VudD0wOworICB0U2lyTWFjQ2hhbkluZm8gKnBDaGFuSW5mbzsKKyAgdFNpck1hY0NoYW5JbmZvICpwQ2hhbkluZm9TdGFydDsKKyAgdEFOSV9CT09MRUFOIGFwcGx5Q29uZmlnID0gVFJVRTsKKworICBpZighcHMxMWRpbmZvKQorICB7CisgICAgIHJldHVybiAoc3RhdHVzKTsKKyAgfQorCisgIGlmICggcHMxMWRpbmZvLT5DaGFubmVscy5udW1DaGFubmVscyAmJiAoIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTiA+PSBwczExZGluZm8tPkNoYW5uZWxzLm51bUNoYW5uZWxzICkgKSAKKyAgeworICAgIHBNYWMtPnNjYW4uYmFzZTIwTUh6Q2hhbm5lbHMubnVtQ2hhbm5lbHMgPSBwczExZGluZm8tPkNoYW5uZWxzLm51bUNoYW5uZWxzOworICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5iYXNlMjBNSHpDaGFubmVscy5jaGFubmVsTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwczExZGluZm8tPkNoYW5uZWxzLmNoYW5uZWxMaXN0LCBwczExZGluZm8tPkNoYW5uZWxzLm51bUNoYW5uZWxzKTsKKyAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHJldHVybiAoc3RhdHVzKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAgLy9ObyBjaGFuZ2UKKyAgICAgcmV0dXJuIChlSEFMX1NUQVRVU19TVUNDRVNTKTsKKyAgfQorCisgIC8vbGVnYWN5IG1haW50ZW5hbmNlCisgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzMTFkaW5mby0+Y291bnRyeUNvZGUsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTik7CisgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgcmV0dXJuIChzdGF0dXMpOworCisgIC8vVHVzaDogYXQgY3Nyb3BlbiBnZXQgdGhpcyBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHQsIGR1cmluZyBjc3IgcmVzZXQgaWYgdGhpcyAKKyAgLy8gYWxyZWFkeSBzZXQgd2l0aCBzb21lIHZhbHVlIG5vIG5lZWQgaW5pdGlsYWl6ZSB3aXRoIGRlZmF1bHQgYWdhaW4KKyAgaWYoMCA9PSBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudFswXSkKKyAgeworICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwczExZGluZm8tPmNvdW50cnlDb2RlLCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHJldHVybiAoc3RhdHVzKTsKKyAgfQorCisgIC8vIG5lZWQgdG8gYWRkIHRoZSBtYXggcG93ZXIgY2hhbm5lbCBsaXN0CisgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcENoYW5JbmZvLCBzaXplb2YodFNpck1hY0NoYW5JbmZvKSAqIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTikpKQorICB7CisgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBDaGFuSW5mbywgc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbykgKiBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pOworICAgICAgcENoYW5JbmZvU3RhcnQgPSBwQ2hhbkluZm87CisKKyAgICAgIGZvcihpbmRleCA9IDA7IGluZGV4IDwgcHMxMWRpbmZvLT5DaGFubmVscy5udW1DaGFubmVsczsgaW5kZXgrKykKKyAgICAgIHsKKyAgICAgICAgcENoYW5JbmZvLT5maXJzdENoYW5OdW0gPSBwczExZGluZm8tPkNoblBvd2VyW2luZGV4XS5maXJzdENoYW5uZWw7CisgICAgICAgIHBDaGFuSW5mby0+bnVtQ2hhbm5lbHMgID0gcHMxMWRpbmZvLT5DaG5Qb3dlcltpbmRleF0ubnVtQ2hhbm5lbHM7CisgICAgICAgIHBDaGFuSW5mby0+bWF4VHhQb3dlciAgID0gQ1NSX1JPQU1fTUlOKCBwczExZGluZm8tPkNoblBvd2VyW2luZGV4XS5tYXh0eFBvd2VyLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwICk7CisgICAgICAgIHBDaGFuSW5mbysrOworICAgICAgICBjb3VudCsrOworICAgICAgfQorICAgICAgaWYoY291bnQpCisgICAgICB7CisgICAgICAgICAgY3NyU2F2ZVRvQ2hhbm5lbFBvd2VyMkdfNUcoIHBNYWMsIGNvdW50ICogc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbyksIHBDaGFuSW5mb1N0YXJ0ICk7CisgICAgICB9CisgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBDaGFuSW5mb1N0YXJ0KTsKKyAgfQorCisgIC8vT25seSBhcHBseSB0aGVtIHRvIENGRyB3aGVuIG5vdCBpbiBTVE9QIHN0YXRlLiBPdGhlcndpc2UgdGhleSB3aWxsIGJlIGFwcGxpZWQgbGF0ZXIKKyAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkKKyAgeworICAgICAgZm9yKCBpbmRleCA9IDA7IGluZGV4IDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGluZGV4KysgKQorICAgICAgeworICAgICAgICAgIGlmKChDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBpbmRleCkpICYmIENTUl9JU19ST0FNX1NUT1AocE1hYywgaW5kZXgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYXBwbHlDb25maWcgPSBGQUxTRTsKKyAgICAgICAgICB9CisgICAgfQorCisgICAgaWYoVFJVRSA9PSBhcHBseUNvbmZpZykKKyAgICB7CisgICAgICAgIC8vIEFwcGx5IHRoZSBiYXNlIGNoYW5uZWwgbGlzdCwgcG93ZXIgaW5mbywgYW5kIHNldCB0aGUgQ291bnRyeSBjb2RlLi4uCisgICAgICAgIGNzckFwcGx5Q2hhbm5lbFBvd2VyQ291bnRyeUluZm8oIHBNYWMsICZwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLCBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCApOworICAgIH0KKworICB9CisKKyAgcmV0dXJuIChzdGF0dXMpOworfQorCisvL3BDb21tYW5kIG1heSBiZSBOVUxMCisvL1Bhc3MgaW4gc2Vzc2lvbklkIGluIGNhc2UgcENvbW1hbmQgaXMgTlVMTC4gc2Vzc2lvbklkIGlzIG5vdCB1c2VkIGluIGNhc2UgcENvbW1hbmQgaXMgbm90IE5VTEwuCit2b2lkIGNzclJvYW1SZW1vdmVEdXBsaWNhdGVDb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdFNtZUNtZCAqcENvbW1hbmQsIGVDc3JSb2FtUmVhc29uIGVSb2FtUmVhc29uKQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5LCAqcE5leHRFbnRyeTsKKyAgICB0U21lQ21kICpwRHVwQ29tbWFuZDsKKyAgICB0RGJsTGlua0xpc3QgbG9jYWxMaXN0OworCisgICAgdm9zX21lbV96ZXJvKCZsb2NhbExpc3QsIHNpemVvZih0RGJsTGlua0xpc3QpKTsKKyAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGNzckxMT3BlbihwTWFjLT5oSGRkLCAmbG9jYWxMaXN0KSkpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBmYWlsZWQgdG8gb3BlbiBsaXN0IikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNzckxMTG9jayggJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCApOworICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsIExMX0FDQ0VTU19OT0xPQ0sgKTsKKyAgICB3aGlsZSggcEVudHJ5ICkKKyAgICB7CisgICAgICAgIHBOZXh0RW50cnkgPSBjc3JMTE5leHQoICZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyApOworICAgICAgICBwRHVwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgcHJldmlvdXMgY29tbWFuZCBpZi4uCisgICAgICAgIC8vIC0gdGhlIG5ldyByb2FtIGNvbW1hbmQgaXMgZm9yIHRoZSBzYW1lIFJvYW1SZWFzb24uLi4KKyAgICAgICAgLy8gLSB0aGUgbmV3IHJvYW0gY29tbWFuZCBpcyBhIE5ld1Byb2ZpbGVMaXN0LgorICAgICAgICAvLyAtIHRoZSBuZXcgcm9hbSBjb21tYW5kIGlzIGEgRm9yY2VkIERpc3NvYworICAgICAgICAvLyAtIHRoZSBuZXcgcm9hbSBjb21tYW5kIGlzIGZyb20gYW4gODAyLjExIE9JRCAoT0lEX1NTSUQgb3IgT0lEX0JTU0lEKS4KKyAgICAgICAgaWYgKCAKKyAgICAgICAgICAgIChwQ29tbWFuZCAmJiAoIHBDb21tYW5kLT5zZXNzaW9uSWQgPT0gcER1cENvbW1hbmQtPnNlc3Npb25JZCApICYmCisgICAgICAgICAgICAgICAgKChwQ29tbWFuZC0+Y29tbWFuZCA9PSBwRHVwQ29tbWFuZC0+Y29tbWFuZCkgJiYKKyAgICAgICAgICAgICAgICAgKHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9PSBwRHVwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gfHwKKyAgICAgICAgICAgICAgICAgICAgZUNzckZvcmNlZERpc2Fzc29jID09IHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiB8fAorICAgICAgICAgICAgICAgICAgICBlQ3NySGRkSXNzdWVkID09IHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbikpKSAKKyAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgLy9iZWxvdyB0aGUgcENvbW1hbmQgaXMgTlVMTAorICAgICAgICAgICAgKCAoc2Vzc2lvbklkID09IHBEdXBDb21tYW5kLT5zZXNzaW9uSWQpICYmIChlQ3NyUm9hbUNvbW1hbmRSb2FtID09IHBEdXBDb21tYW5kLT5jb21tYW5kKSAmJgorICAgICAgICAgICAgICAgICAoKGVDc3JGb3JjZWREaXNhc3NvYyA9PSBlUm9hbVJlYXNvbikgfHwKKyAgICAgICAgICAgICAgICAgICAgKGVDc3JIZGRJc3N1ZWQgPT0gZVJvYW1SZWFzb24pKQorICAgICAgICAgICAgICAgKQorICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiICAgcm9hbVJlYXNvbiA9ICVkXG4iKSwgcER1cENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgJ3N0YWxlJyByb2FtIGNvbW1hbmQgZnJvbSB0aGUgcGVuZGluZyBsaXN0Li4uCisgICAgICAgICAgICBpZihjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0sgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjc3JMTEluc2VydFRhaWwoJmxvY2FsTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwRW50cnkgPSBwTmV4dEVudHJ5OworICAgIH0KKyAgICBjc3JMTFVubG9jayggJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCApOworCisgICAgd2hpbGUoIChwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoJmxvY2FsTGlzdCwgTExfQUNDRVNTX05PTE9DSykpICkKKyAgICB7CisgICAgICAgIHBEdXBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgIC8vVGVsbCBjYWxsZXIgdGhhdCB0aGUgY29tbWFuZCBpcyBjYW5jZWxsZWQKKyAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBwRHVwQ29tbWFuZC0+c2Vzc2lvbklkLCBOVUxMLCBwRHVwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX0NBTkNFTExFRCwgZUNTUl9ST0FNX1JFU1VMVF9OT05FKTsKKyAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRSb2FtKHBNYWMsIHBEdXBDb21tYW5kKTsKKyAgICB9CisgICAgY3NyTExDbG9zZSgmbG9jYWxMaXN0KTsKK30KKworZUhhbFN0YXR1cyBjc3JSb2FtQ2FsbENhbGxiYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1JbmZvICpwUm9hbUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHJvYW1JZCwgZVJvYW1DbWRTdGF0dXMgdTEsIGVDc3JSb2FtUmVzdWx0IHUyKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfREVGKGNvbm5lY3Rpb25TdGF0dXMsIHZvc19ldmVudF93bGFuX3N0YXR1c19wYXlsb2FkX3R5cGUpOworI2VuZGlmCisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkKSApCisgICAgeworICAgICAgICBwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJTZXNzaW9uIElEOiVkIGlzIG5vdCB2YWxpZFxuIiwgc2Vzc2lvbklkKTsKKyAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIGlmKGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OID09IHUxICYmIHBSb2FtSW5mbykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiIEFzc29jIGNvbXBsZXRlIHJlc3VsdCA9ICVkIHN0YXR1c0NvZGUgPSAlZCByZWFzb25Db2RlID0gJWRcbiIsIHUyLCBwUm9hbUluZm8tPnN0YXR1c0NvZGUsIHBSb2FtSW5mby0+cmVhc29uQ29kZSk7CisgICAgfQorCisgICAgaWYgKCAocFNlc3Npb24gPT0gTlVMTCkgfHwKKyAgICAgICAgKGVBTklfQk9PTEVBTl9GQUxTRSA9PSBwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSkgKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsICJTZXNzaW9uIElEIGlzIG5vdCB2YWxpZFxuIik7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIGlmKE5VTEwgIT0gcFNlc3Npb24tPmNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgaWYoIHBSb2FtSW5mbyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBSb2FtSW5mby0+c2Vzc2lvbklkID0gKHRBTklfVTgpc2Vzc2lvbklkOworICAgICAgICB9CisKKyAgICAgICAgLyogYXZvaWQgaG9sZGluZyB0aGUgZ2xvYmFsIGxvY2sgd2hlbiBtYWtpbmcgdGhlIHJvYW1pbmcgY2FsbGJhY2sgLCBvcmlnaW5hbCBjaGFuZ2UgY2FtZSAKKyAgICAgICAgZnJvbSBhIHJhaXNlZCBDUiAoQ1IzMDQ4NzQpLiAgU2luY2UgdGhpcyBjYWxsYmFjayBpcyBpbiBIREQgYSBwb3RlbnRpYWwgZGVhZGxvY2sgCisgICAgICAgIGlzIHBvc3NpYmxlIG9uIG90aGVyIE9TIHBvcnRzIHdoZXJlIHRoZSBjYWxsYmFjayBtYXkgbmVlZCB0byB0YWtlIGxvY2tzIHRvIHByb3RlY3QgCisgICAgICAgIEhERCBzdGF0ZSAKKyAgICAgICAgIFVQREFURSA6IHJldmVydCB0aGlzIGNoYW5nZSBidXQga2VlcCB0aGUgY29tbWVudHMgaGVyZS4gTmVlZCB0byByZXZpc2l0IGFzIHRoZXJlIGFyZSBjYWxsYmFja3MKKyAgICAgICAgIHRoYXQgbWF5IGFjdHVhbGx5IGRlcGVuZCBvbiB0aGUgbG9jayBiZWluZyBoZWxkICovCisgICAgICAgIC8vIFRPRE86IHJldmlzaXQ6IHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgICAgICBzdGF0dXMgPSBwU2Vzc2lvbi0+Y2FsbGJhY2socFNlc3Npb24tPnBDb250ZXh0LCBwUm9hbUluZm8sIHJvYW1JZCwgdTEsIHUyKTsKKyAgICAgICAgLy8gVE9ETzogcmV2aXNpdDogc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorICAgIC8vRVZFTlRfV0xBTl9TVEFUVVM6IGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OLCAKKyAgICAvLyAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fTE9TVExJTkssIGVDU1JfUk9BTV9ESVNBU1NPQ0lBVEVELCAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUiAgICAKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZjb25uZWN0aW9uU3RhdHVzLCBzaXplb2Yodm9zX2V2ZW50X3dsYW5fc3RhdHVzX3BheWxvYWRfdHlwZSkpOworICAgIGlmKChlQ1NSX1JPQU1fQVNTT0NJQVRJT05fQ09NUExFVElPTiA9PSB1MSkgJiYgKGVDU1JfUk9BTV9SRVNVTFRfQVNTT0NJQVRFRCA9PSB1MikpCisgICAgeworICAgICAgIGNvbm5lY3Rpb25TdGF0dXMuZXZlbnRJZCA9IGVDU1JfV0xBTl9TVEFUVVNfQ09OTkVDVDsKKyAgICAgICBjb25uZWN0aW9uU3RhdHVzLmJzc1R5cGUgPSBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUtPkJTU1R5cGU7CisgICAgICAgaWYoTlVMTCAhPSBwUm9hbUluZm8tPnBCc3NEZXNjKQorICAgICAgIHsKKyAgICAgICAgICBjb25uZWN0aW9uU3RhdHVzLnJzc2kgPSBwUm9hbUluZm8tPnBCc3NEZXNjLT5yc3NpICogKC0xKTsKKyAgICAgICAgICBjb25uZWN0aW9uU3RhdHVzLmNoYW5uZWwgPSBwUm9hbUluZm8tPnBCc3NEZXNjLT5jaGFubmVsSWQ7CisgICAgICAgfQorCisgICAgICAgY29ubmVjdGlvblN0YXR1cy5xb3NDYXBhYmlsaXR5ID0gcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5xb3NDb25uZWN0aW9uOworICAgICAgIGNvbm5lY3Rpb25TdGF0dXMuYXV0aFR5cGUgPSAodl9VOF90KWRpYWdBdXRoVHlwZUZyb21DU1JUeXBlKHBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZS0+QXV0aFR5cGUpOworICAgICAgIGNvbm5lY3Rpb25TdGF0dXMuZW5jcnlwdGlvblR5cGUgPSAodl9VOF90KWRpYWdFbmNUeXBlRnJvbUNTUlR5cGUocFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlLT5FbmNyeXB0aW9uVHlwZSk7CisgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBjb25uZWN0aW9uU3RhdHVzLnNzaWQsIHBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZS0+U1NJRC5zc0lkLCA2KTsKKyAgICAgICBjb25uZWN0aW9uU3RhdHVzLnJlYXNvbiA9IGVDU1JfUkVBU09OX1VOU1BFQ0lGSUVEOworICAgICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZjb25uZWN0aW9uU3RhdHVzLCBFVkVOVF9XTEFOX1NUQVRVUyk7CisgICAgfQorCisgICAgaWYoKGVDU1JfUk9BTV9NSUNfRVJST1JfSU5EID09IHUxKSB8fCAoZUNTUl9ST0FNX1JFU1VMVF9NSUNfRkFJTFVSRSA9PSB1MikpCisgICAgeworICAgICAgIGNvbm5lY3Rpb25TdGF0dXMuZXZlbnRJZCA9IGVDU1JfV0xBTl9TVEFUVVNfRElTQ09OTkVDVDsKKyAgICAgICBjb25uZWN0aW9uU3RhdHVzLnJlYXNvbiA9IGVDU1JfUkVBU09OX01JQ19FUlJPUjsKKyAgICAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmY29ubmVjdGlvblN0YXR1cywgRVZFTlRfV0xBTl9TVEFUVVMpOworICAgIH0KKworICAgIGlmKGVDU1JfUk9BTV9SRVNVTFRfRk9SQ0VEID09IHUyKQorICAgIHsKKyAgICAgICBjb25uZWN0aW9uU3RhdHVzLmV2ZW50SWQgPSBlQ1NSX1dMQU5fU1RBVFVTX0RJU0NPTk5FQ1Q7CisgICAgICAgY29ubmVjdGlvblN0YXR1cy5yZWFzb24gPSBlQ1NSX1JFQVNPTl9VU0VSX1JFUVVFU1RFRDsKKyAgICAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmY29ubmVjdGlvblN0YXR1cywgRVZFTlRfV0xBTl9TVEFUVVMpOworICAgIH0KKworICAgIGlmKGVDU1JfUk9BTV9SRVNVTFRfRElTQVNTT0NfSU5EID09IHUyKQorICAgIHsKKyAgICAgICBjb25uZWN0aW9uU3RhdHVzLmV2ZW50SWQgPSBlQ1NSX1dMQU5fU1RBVFVTX0RJU0NPTk5FQ1Q7CisgICAgICAgY29ubmVjdGlvblN0YXR1cy5yZWFzb24gPSBlQ1NSX1JFQVNPTl9ESVNBU1NPQzsKKyAgICAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmY29ubmVjdGlvblN0YXR1cywgRVZFTlRfV0xBTl9TVEFUVVMpOworICAgIH0KKworICAgIGlmKGVDU1JfUk9BTV9SRVNVTFRfREVBVVRIX0lORCA9PSB1MikKKyAgICB7CisgICAgICAgY29ubmVjdGlvblN0YXR1cy5ldmVudElkID0gZUNTUl9XTEFOX1NUQVRVU19ESVNDT05ORUNUOworICAgICAgIGNvbm5lY3Rpb25TdGF0dXMucmVhc29uID0gZUNTUl9SRUFTT05fREVBVVRIOworICAgICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZjb25uZWN0aW9uU3RhdHVzLCBFVkVOVF9XTEFOX1NUQVRVUyk7CisgICAgfQorCisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLy8gUmV0dXJucyB3aGV0aGVyIGhhbmRvZmYgaXMgY3VycmVudGx5IGluIHByb2dyZXNzIG9yIG5vdAordEFOSV9CT09MRUFOIGNzclJvYW1Jc0hhbmRvZmZJblByb2dyZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgICByZXR1cm4gY3NyTmVpZ2hib3JSb2FtSXNIYW5kb2ZmSW5Qcm9ncmVzcyhwTWFjKTsgICAgICAgICAgICAgICAgICAgIAorI2Vsc2UKKyAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworI2VuZGlmCisKK30KKworZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVEaXNhc3NvY2lhdGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyUm9hbVN1YlN0YXRlIE5ld1N1YnN0YXRlLCB0QU5JX0JPT0xFQU4gZk1JQ0ZhaWx1cmUgKQoreyAgIAorICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0Q3NyQnNzaWQgYnNzSWQgPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgdEFOSV9VMTYgcmVhc29uQ29kZTsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAKKyAgICAvL1Jlc3RvcmUgQUMgd2VpZ2h0IGluIGNhc2Ugd2UgY2hhbmdlIGl0IAorICAgIGlmICggY3NySXNDb25uU3RhdGVDb25uZWN0ZWRJbmZyYSggcE1hYywgc2Vzc2lvbklkICkgKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgcmVzdG9yZSBBQyB3ZWlnaHRzICglZC0lZC0lZC0lZClcbiIpLCBwTWFjLT5yb2FtLnVjQUNXZWlnaHRzWzBdLCBwTWFjLT5yb2FtLnVjQUNXZWlnaHRzWzFdLAorICAgICAgICAgICAgcE1hYy0+cm9hbS51Y0FDV2VpZ2h0c1syXSwgcE1hYy0+cm9hbS51Y0FDV2VpZ2h0c1szXSk7CisgICAgICAgIFdMQU5UTF9TZXRBQ1dlaWdodHMocE1hYy0+cm9hbS5nVm9zQ29udGV4dCwgcE1hYy0+cm9hbS51Y0FDV2VpZ2h0cyk7CisgICAgfQorICAgIAorICAgIGlmICggZk1JQ0ZhaWx1cmUgKQorICAgIHsKKyAgICAgICAgcmVhc29uQ29kZSA9IGVTSVJfTUFDX01JQ19GQUlMVVJFX1JFQVNPTjsKKyAgICB9CisgICAgZWxzZSBpZiAoTmV3U3Vic3RhdGUgPT0gZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hBTkRPRkYpCisgICAgeworICAgICAgICByZWFzb25Db2RlID0gZVNJUl9NQUNfRElTQVNTT0NfRFVFX1RPX0ZUSEFORE9GRl9SRUFTT047CisgICAgfSBlbHNlIAorICAgIHsKKyAgICAgICAgcmVhc29uQ29kZSA9IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTjsKKyAgICB9ICAgIAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBpZiAoIChjc3JSb2FtSXNIYW5kb2ZmSW5Qcm9ncmVzcyhwTWFjKSkgJiYgCisgICAgICAgICAoTmV3U3Vic3RhdGUgIT0gZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hBTkRPRkYpKQorICAgIHsKKyAgICAgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyBwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm87CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJmJzc0lkLCBwTmVpZ2hib3JSb2FtSW5mby0+Y3NyTmVpZ2hib3JSb2FtUHJvZmlsZS5CU1NJRHMuYnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgfSBlbHNlIAorI2VuZGlmCisgICAgaWYocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYykKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJmJzc0lkLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5ic3NJZCwgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgIH0KKworICAgIAorICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkNTUiBBdHRlbXB0aW5nIHRvIERpc2Fzc29jaWF0ZSBCc3NpZD0gJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnggc3ViU3RhdGUgPSAlZFxuIiwgCisgICAgICAgICAgICAgICAgICBic3NJZFsgMCBdLCBic3NJZFsgMSBdLCBic3NJZFsgMiBdLAorICAgICAgICAgICAgICAgICAgYnNzSWRbIDMgXSwgYnNzSWRbIDQgXSwgYnNzSWRbIDUgXSwgTmV3U3Vic3RhdGUgKTsgICAgCisKKyAgICBjc3JSb2FtU3Vic3RhdGVDaGFuZ2UoIHBNYWMsIE5ld1N1YnN0YXRlLCBzZXNzaW9uSWQpOworCisgICAgc3RhdHVzID0gY3NyU2VuZE1CRGlzYXNzb2NSZXFNc2coIHBNYWMsIHNlc3Npb25JZCwgYnNzSWQsIHJlYXNvbkNvZGUgKTsgICAgCisgICAgCisgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIAorICAgIHsKKyAgICAgICAgY3NyUm9hbUxpbmtEb3duKHBNYWMsIHNlc3Npb25JZCk7CisKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgICAgIC8vbm8gbmVlZCB0byB0ZWxsIFFvUyB0aGF0IHdlIGFyZSBkaXNhc3NvY2lhdGluZywgaXQgd2lsbCBiZSB0YWtlbiBjYXJlIG9mZiBpbiBhc3NvYyByZXEgZm9yIEhPCisgICAgICAgIGlmKGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19IQU5ET0ZGICE9IE5ld1N1YnN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICAvL1R1c2gtUW9TOiBub3RpZnkgUW9TIG1vZHVsZSB0aGF0IGRpc2Fzc29jIGhhcHBlbmluZworICAgICAgICAgICAgc21lX1Fvc0NzckV2ZW50SW5kKHBNYWMsICh2X1U4X3Qpc2Vzc2lvbklkLCBTTUVfUU9TX0NTUl9ESVNDT05ORUNUX1JFUSwgTlVMTCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyUm9hbUlzc3VlRGlzYXNzb2NpYXRlU3RhQ21kCisgICAgXGJyaWVmIGNzciBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBkaXNhc3NvY2lhdGUgYSBhc3NvY2lhdGVkIHN0YXRpb24KKyAgICBccGFyYW0gc2Vzc2lvbklkICAgIC0gc2Vzc2lvbiBJZCBmb3IgU29mdCBBUAorICAgIFxwYXJhbSBwUGVlck1hY0FkZHIgLSBNQUMgb2YgYXNzb2NpYXRlZCBzdGF0aW9uIHRvIGRlbGV0ZQorICAgIFxwYXJhbSByZWFzb24gLSByZWFzb24gY29kZSwgYmUgb25lIG9mIHRoZSB0U2lyTWFjUmVhc29uQ29kZXMKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlRGlzYXNzb2NpYXRlU3RhQ21kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBQZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiByZWFzb24pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTbWVDbWQgKnBDb21tYW5kOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlciggcE1hYyApOworICAgICAgICBpZiAoICFwQ29tbWFuZCApIAorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXIiKSApOworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfUkVTT1VSQ0VTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFJvYW07CisgICAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IGVDc3JGb3JjZWREaXNhc3NvY1N0YTsKKyAgICAgICAgdm9zX21lbV9jb3B5KHBDb21tYW5kLT51LnJvYW1DbWQucGVlck1hYywgcFBlZXJNYWNBZGRyLCA2KTsKKyAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yZWFzb24gPSAodFNpck1hY1JlYXNvbkNvZGVzKXJlYXNvbjsKKyAgICAgICAgc3RhdHVzID0gY3NyUXVldWVTbWVDb21tYW5kKHBNYWMsIHBDb21tYW5kLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBzZW5kIG1lc3NhZ2Ugc3RhdHVzID0gJWRcbiIpLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIGNzclJlbGVhc2VDb21tYW5kUm9hbSggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyUm9hbUlzc3VlRGVhdXRoU3RhCisgICAgXGJyaWVmIGNzciBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBkZWxldGUgYSBhc3NvY2lhdGVkIHN0YXRpb24KKyAgICBccGFyYW0gc2Vzc2lvbklkICAgIC0gc2Vzc2lvbiBJZCBmb3IgU29mdCBBUAorICAgIFxwYXJhbSBwUGVlck1hY0FkZHIgLSBNQUMgb2YgYXNzb2NpYXRlZCBzdGF0aW9uIHRvIGRlbGV0ZQorICAgIFxwYXJhbSByZWFzb24gLSByZWFzb24gY29kZSwgYmUgb25lIG9mIHRoZSB0U2lyTWFjUmVhc29uQ29kZXMKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlRGVhdXRoU3RhQ21kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBQZWVyTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiByZWFzb24pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTbWVDbWQgKnBDb21tYW5kOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlciggcE1hYyApOworICAgICAgICBpZiAoICFwQ29tbWFuZCApIAorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXIiKSApOworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfUkVTT1VSQ0VTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFJvYW07CisgICAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IGVDc3JGb3JjZWREZWF1dGhTdGE7CisgICAgICAgIHZvc19tZW1fY29weShwQ29tbWFuZC0+dS5yb2FtQ21kLnBlZXJNYWMsIHBQZWVyTWFjQWRkciwgNik7CisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucmVhc29uID0gKHRTaXJNYWNSZWFzb25Db2RlcylyZWFzb247CisgICAgICAgIHN0YXR1cyA9IGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwQ29tbWFuZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzICk7CisgICAgICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZFJvYW0oIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKworZUhhbFN0YXR1cworY3NyUm9hbUlzc3VlVGtpcENvdW50ZXJNZWFzdXJlcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9CT09MRUFOIGJFbmFibGUgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0Q3NyQnNzaWQgYnNzSWQgPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBpZiAoIXBTZXNzaW9uKQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiY3NyUm9hbUlzc3VlVGtpcENvdW50ZXJNZWFzdXJlczpDU1IgU2Vzc2lvbiBub3QgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gKHN0YXR1cyk7CisgICAgfQorCisgICAgaWYgKHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZic3NJZCwgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+YnNzSWQsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiY3NyUm9hbUlzc3VlVGtpcENvdW50ZXJNZWFzdXJlczpDb25uZWN0ZWQgQlNTIERlc2NyaXB0aW9uIGluIENTUiBTZXNzaW9uIG5vdCBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiAoc3RhdHVzKTsKKyAgICB9CisKKyAgICBzbXNMb2coIHBNYWMsIExPRzIsICJDU1IgaXNzdWluZyB0a2lwIGNvdW50ZXIgbWVhc3VyZXMgZm9yIEJzc2lkID0gJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngsIEVuYWJsZSA9ICVkXG4iLCAKKyAgICAgICAgICAgICAgICAgIGJzc0lkWyAwIF0sIGJzc0lkWyAxIF0sIGJzc0lkWyAyIF0sCisgICAgICAgICAgICAgICAgICBic3NJZFsgMyBdLCBic3NJZFsgNCBdLCBic3NJZFsgNSBdICwgYkVuYWJsZSk7CisKKyAgICBzdGF0dXMgPSBjc3JTZW5kTUJUa2lwQ291bnRlck1lYXN1cmVzUmVxTXNnKCBwTWFjLCBzZXNzaW9uSWQsIGJFbmFibGUsIGJzc0lkICk7CisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCitlSGFsU3RhdHVzCitjc3JSb2FtR2V0QXNzb2NpYXRlZFN0YXMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTU9EVUxFX0lEIG1vZElkLCAgdm9pZCAqcFVzckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGZuU2FwRXZlbnRDYWxsYmFjaywgdl9VOF90ICpwQXNzb2NTdGFzQnVmICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdENzckJzc2lkIGJzc0lkID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgaWYgKCFwU2Vzc2lvbikKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgImNzclJvYW1HZXRBc3NvY2lhdGVkU3RhczpDU1IgU2Vzc2lvbiBub3QgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gKHN0YXR1cyk7CisgICAgfQorCisgICAgaWYocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYykKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICZic3NJZCwgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+YnNzSWQsIHNpemVvZih0Q3NyQnNzaWQpICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgImNzclJvYW1HZXRBc3NvY2lhdGVkU3RhczpDb25uZWN0ZWQgQlNTIERlc2NyaXB0aW9uIGluIENTUiBTZXNzaW9uIG5vdCBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiAoc3RhdHVzKTsKKyAgICB9CisKKyAgICBzbXNMb2coIHBNYWMsIExPRzIsICJDU1IgZ2V0dGluZyBhc3NvY2lhdGVkIHN0YXRpb25zIGZvciBCc3NpZCA9ICUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgYnNzSWRbIDAgXSwgYnNzSWRbIDEgXSwgYnNzSWRbIDIgXSwKKyAgICAgICAgICAgICAgICAgIGJzc0lkWyAzIF0sIGJzc0lkWyA0IF0sIGJzc0lkWyA1IF0gKTsKKworICAgIHN0YXR1cyA9IGNzclNlbmRNQkdldEFzc29jaWF0ZWRTdGFzUmVxTXNnKCBwTWFjLCBzZXNzaW9uSWQsIG1vZElkLCBic3NJZCwgcFVzckNvbnRleHQsIHBmblNhcEV2ZW50Q2FsbGJhY2ssIHBBc3NvY1N0YXNCdWYgKTsKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKK2VIYWxTdGF0dXMKK2NzclJvYW1HZXRXcHNTZXNzaW9uT3ZlcmxhcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwVXNyQ29udGV4dCwgdm9pZCAqcGZuU2FwRXZlbnRDYWxsYmFjaywgdl9NQUNBRERSX3QgcFJlbW92ZU1hYyApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRDc3JCc3NpZCBic3NJZCA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAKKyAgICBpZiAoIXBTZXNzaW9uKQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiY3NyUm9hbUdldFdwc1Nlc3Npb25PdmVybGFwOkNTUiBTZXNzaW9uIG5vdCBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiAoc3RhdHVzKTsKKyAgICB9CisKKyAgICBpZihwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgJmJzc0lkLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5ic3NJZCwgc2l6ZW9mKHRDc3JCc3NpZCkgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiY3NyUm9hbUdldFdwc1Nlc3Npb25PdmVybGFwOkNvbm5lY3RlZCBCU1MgRGVzY3JpcHRpb24gaW4gQ1NSIFNlc3Npb24gbm90IGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIChzdGF0dXMpOworICAgIH0KKworICAgIHNtc0xvZyggcE1hYywgTE9HMiwgIkNTUiBnZXR0aW5nIFdQUyBTZXNzaW9uIE92ZXJsYXAgZm9yIEJzc2lkID0gJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnhcbiIsCisgICAgICAgICAgICAgICAgICBic3NJZFsgMCBdLCBic3NJZFsgMSBdLCBic3NJZFsgMiBdLAorICAgICAgICAgICAgICAgICAgYnNzSWRbIDMgXSwgYnNzSWRbIDQgXSwgYnNzSWRbIDUgXSApOworICAgICAKKyAgICBzdGF0dXMgPSBjc3JTZW5kTUJHZXRXUFNQQkNTZXNzaW9ucyggcE1hYywgc2Vzc2lvbklkLCBic3NJZCwgcFVzckNvbnRleHQsIHBmblNhcEV2ZW50Q2FsbGJhY2ssIHBSZW1vdmVNYWMpOyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisjZW5kaWYKKworZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVEZWF1dGgoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgZUNzclJvYW1TdWJTdGF0ZSBOZXdTdWJzdGF0ZSApCit7ICAgCisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRDc3JCc3NpZCBic3NJZCA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAKKyAgICBpZihwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmYnNzSWQsIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MtPmJzc0lkLCBzaXplb2YodENzckJzc2lkKSk7CisgICAgfQorCisgICAgc21zTG9nKCBwTWFjLCBMT0cyLCAiQ1NSIEF0dGVtcHRpbmcgdG8gRGVhdXRoIEJzc2lkPSAlMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeFxuIiwgCisgICAgICAgICAgICAgICAgICBic3NJZFsgMCBdLCBic3NJZFsgMSBdLCBic3NJZFsgMiBdLAorICAgICAgICAgICAgICAgICAgYnNzSWRbIDMgXSwgYnNzSWRbIDQgXSwgYnNzSWRbIDUgXSApOyAgICAKKworICAgIGNzclJvYW1TdWJzdGF0ZUNoYW5nZSggcE1hYywgTmV3U3Vic3RhdGUsIHNlc3Npb25JZCk7CisgICAgCisgICAgc3RhdHVzID0gY3NyU2VuZE1CRGVhdXRoUmVxTXNnKCBwTWFjLCBzZXNzaW9uSWQsIGJzc0lkLCBlU0lSX01BQ19ESVNBU1NPQ19MRUFWSU5HX0JTU19SRUFTT04gKTsgICAgCisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKworZUhhbFN0YXR1cyBjc3JSb2FtU2F2ZUNvbm5lY3RlZEJzc0Rlc2MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYyApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIHRBTklfVTMyIHNpemU7CisgICAgCisgICAgLy8gSWYgbm8gQlNTIGRlc2NyaXB0aW9uIHdhcyBmb3VuZCBpbiB0aGlzIGNvbm5lY3Rpb24gKGhhcHBlbnMgd2l0aCBzdGFydCBJQlNTKSwgdGhlbiAKKyAgICAvLyBuaXggdGhlIEJTUyBkZXNjcmlwdGlvbiB0aGF0IHdlIGtlZXAgYXJvdW5kIGZvciB0aGUgY29ubmVjdGVkIEJTUykgYW5kIGdldCBvdXQuLi4KKyAgICBpZihOVUxMID09IHBCc3NEZXNjKQorICAgIHsKKyAgICAgICAgY3NyRnJlZUNvbm5lY3RCc3NEZXNjKHBNYWMsIHNlc3Npb25JZCk7CisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgICBzaXplID0gcEJzc0Rlc2MtPmxlbmd0aCArIHNpemVvZiggcEJzc0Rlc2MtPmxlbmd0aCApOworICAgICAgICBpZihOVUxMICE9IHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCgocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+bGVuZ3RoKSArIHNpemVvZihwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5sZW5ndGgpKSA8IHNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9ub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXcgQlNTLCBwTWFjLT5yb2FtLnBDb25uZWN0QnNzRGVzYyBpcyBmcmVlZCBpbnNpZGUKKyAgICAgICAgICAgICAgICBjc3JGcmVlQ29ubmVjdEJzc0Rlc2MocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihOVUxMID09IHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYywgc2l6ZSk7IAorICAgICAgICB9CisgICAgICAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgJiYgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYyApIAorICAgICAgICB7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLCBwQnNzRGVzYywgc2l6ZSApOyAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtUHJlcGFyZUJzc0NvbmZpZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsIHRCc3NDb25maWdQYXJhbSAqcEJzc0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIGVDc3JDZmdEb3QxMU1vZGUgY2ZnRG90MTFNb2RlOworCisjaWYgZGVmaW5lZChWT1NTX0VOQUJMRUQpCisgICAgVk9TX0FTU0VSVCggcEllcyAhPSBOVUxMICk7CisjZW5kaWYKKyAgICAKKyAgICBkbworICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcEJzc0NvbmZpZy0+QnNzQ2FwLCAmcEJzc0Rlc2MtPmNhcGFiaWxpdHlJbmZvLCBzaXplb2YodFNpck1hY0NhcGFiaWxpdHlJbmZvKSk7CisgICAgICAgIC8vZ2V0IHFvcworICAgICAgICBwQnNzQ29uZmlnLT5xb3NUeXBlID0gY3NyR2V0UW9TRnJvbUJzc0Rlc2MocE1hYywgcEJzc0Rlc2MsIHBJZXMpOworICAgICAgICAvL2dldCBTU0lECisgICAgICAgIGlmKHBJZXMtPlNTSUQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcEJzc0NvbmZpZy0+U1NJRC5zc0lkLCBwSWVzLT5TU0lELnNzaWQsIHBJZXMtPlNTSUQubnVtX3NzaWQpOworICAgICAgICAgICAgcEJzc0NvbmZpZy0+U1NJRC5sZW5ndGggPSBwSWVzLT5TU0lELm51bV9zc2lkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBCc3NDb25maWctPlNTSUQubGVuZ3RoID0gMDsKKyAgICAgICAgaWYoY3NySXNOVUxMU1NJRChwQnNzQ29uZmlnLT5TU0lELnNzSWQsIHBCc3NDb25maWctPlNTSUQubGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICIgIEJTUyBkZXNjIFNTSUQgaXMgYSB3aWxkY2FyZFxuIik7CisgICAgICAgICAgICAvL1JldHVybiBmYWlsZWQgaWYgcHJvZmlsZSBkb2Vzbid0IGhhdmUgYW4gU1NJRCBlaXRoZXIuCisgICAgICAgICAgICBpZihwUHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiICBCb3RoIEJTUyBkZXNjIGFuZCBwcm9maWxlIGRvZXNuJ3QgaGF2ZSBTU0lEXG4iKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKENTUl9JU19DSEFOTkVMXzVHSFoocEJzc0Rlc2MtPmNoYW5uZWxJZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NDb25maWctPmVCYW5kID0gZUNTUl9CQU5EXzVHOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0NvbmZpZy0+ZUJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisgICAgICAgIH0KKyAgICAgICAgLy9waHltb2RlCisgICAgICAgIGlmKGNzcklzUGh5TW9kZU1hdGNoKCBwTWFjLCBwUHJvZmlsZS0+cGh5TW9kZSwgcEJzc0Rlc2MsIHBQcm9maWxlLCAmY2ZnRG90MTFNb2RlLCBwSWVzICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NDb25maWctPnVDZmdEb3QxMU1vZGUgPSBjZmdEb3QxMU1vZGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICIgICBDYW4gbm90IGZpbmQgbWF0Y2ggcGh5IG1vZGVcbiIpOworICAgICAgICAgICAgLy9mb3JjZSBpdAorICAgICAgICAgICAgaWYoZUNTUl9CQU5EXzI0ID09IHBCc3NDb25maWctPmVCYW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBCc3NDb25maWctPnVDZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnNzQ29uZmlnLT51Q2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL1FvcworICAgICAgICBpZiAoKHBCc3NDb25maWctPnVDZmdEb3QxMU1vZGUgIT0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU4pICYmCisgICAgICAgICAgICAgICAgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uV01NU3VwcG9ydE1vZGUgPT0gZUNzclJvYW1XbW1Ob1FvcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vSm9pbmluZyBCU1MgaXMgbm90IDExbiBjYXBhYmxlIGFuZCBXTU0gaXMgZGlzYWJsZWQgb24gY2xpZW50LgorICAgICAgICAgICAgLy9EaXNhYmxlIFFvUyBhbmQgV01NCisgICAgICAgICAgICBwQnNzQ29uZmlnLT5xb3NUeXBlID0gZUNTUl9NRURJVU1fQUNDRVNTX0RDRjsKKyAgICAgICAgfQorICAgICAgIAorICAgICAgICAvL2F1dGggdHlwZQorICAgICAgICBzd2l0Y2goIHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgKSAKKyAgICAgICAgeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBOgorICAgICAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLOgorICAgICAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfTk9ORToKKyAgICAgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU06CisgICAgICAgICAgICAgICAgcEJzc0NvbmZpZy0+YXV0aFR5cGUgPSBlU0lSX09QRU5fU1lTVEVNOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk6CisgICAgICAgICAgICAgICAgcEJzc0NvbmZpZy0+YXV0aFR5cGUgPSBlU0lSX1NIQVJFRF9LRVk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfQVVUT1NXSVRDSDoKKyAgICAgICAgICAgICAgICBwQnNzQ29uZmlnLT5hdXRoVHlwZSA9IGVTSVJfQVVUT19TV0lUQ0g7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy9zaG9ydCBzbG90IHRpbWUKKyAgICAgICAgaWYoIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCICE9IGNmZ0RvdDExTW9kZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NDb25maWctPnVTaG9ydFNsb3RUaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zaG9ydFNsb3RUaW1lOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0NvbmZpZy0+dVNob3J0U2xvdFRpbWUgPSAwOworICAgICAgICB9CisgICAgICAgIGlmKHBCc3NDb25maWctPkJzc0NhcC5pYnNzKQorICAgICAgICB7CisgICAgICAgICAgICAvL1dlIGRvbid0IHN1cHBvcnQgMTFoIG9uIElCU1MKKyAgICAgICAgICAgIHBCc3NDb25maWctPmYxMWhTdXBwb3J0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOyAKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NDb25maWctPmYxMWhTdXBwb3J0ID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExaFN1cHBvcnRFbmFibGVkOworICAgICAgICB9CisgICAgICAgIC8vcG93ZXIgY29uc3RyYWludAorICAgICAgICBwQnNzQ29uZmlnLT51UG93ZXJMaW1pdCA9IGNzckdldDExaFBvd2VyQ29uc3RyYWludChwTWFjLCAmcEllcy0+UG93ZXJDb25zdHJhaW50cyk7CisgICAgICAgIC8vaGVhcnRiZWF0CisgICAgICAgIGlmICggQ1NSX0lTXzExQV9CU1MoIHBCc3NEZXNjICkgKQorICAgICAgICB7CisgICAgICAgICAgICAgcEJzc0NvbmZpZy0+dUhlYXJ0QmVhdFRocmVzaCA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSGVhcnRiZWF0VGhyZXNoNTA7ICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICBwQnNzQ29uZmlnLT51SGVhcnRCZWF0VGhyZXNoID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5IZWFydGJlYXRUaHJlc2gyNDsKKyAgICAgICAgfQorICAgICAgICAvL0pvaW4gdGltZW91dAorICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgQmVhY29uSW50ZXJ2YWwgaW4gdGhlIEJzc0Rlc2NyaXB0aW9uLCB0aGVuIHNldCB0aGUgSm9pbiBUaW1lb3V0IHRvIAorICAgICAgICAvLyBiZSAzIHggdGhlIEJlYWNvbkludGVydmFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmICggcEJzc0Rlc2MtPmJlYWNvbkludGVydmFsICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9NYWtlIHN1cmUgaXQgaXMgYmlnZ2VyIHRoYW4gdGhlIG1pbmltYWwKKyAgICAgICAgICAgIHBCc3NDb25maWctPnVKb2luVGltZU91dCA9IENTUl9ST0FNX01BWCgzICogcEJzc0Rlc2MtPmJlYWNvbkludGVydmFsLCBDU1JfSk9JTl9GQUlMVVJFX1RJTUVPVVRfTUlOKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICBwQnNzQ29uZmlnLT51Sm9pblRpbWVPdXQgPSBDU1JfSk9JTl9GQUlMVVJFX1RJTUVPVVRfREVGQVVMVDsKKyAgICAgICAgfQorICAgICAgICAvL3ZhbGlkYXRlIENCCisgICAgICAgIHBCc3NDb25maWctPmNiTW9kZSA9IGNzckdldENCTW9kZUZyb21JZXMocE1hYywgcEJzc0Rlc2MtPmNoYW5uZWxJZCwgcEllcyk7CisgICAgfXdoaWxlKDApOworCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK3N0YXRpYyBlSGFsU3RhdHVzIGNzclJvYW1QcmVwYXJlQnNzQ29uZmlnRnJvbVByb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCc3NDb25maWdQYXJhbSAqcEJzc0NvbmZpZywgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYykKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdEFOSV9VOCBvcGVyYXRpb25DaGFubmVsID0gMDsgCisgICAgdEFOSV9VOCBxQVBpc0VuYWJsZWQgPSBGQUxTRTsKKyAgICAvL1NTSUQKKyAgICBwQnNzQ29uZmlnLT5TU0lELmxlbmd0aCA9IDA7CisgICAgaWYocFByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMpCisgICAgeworICAgICAgICAvL29ubHkgdXNlIHRoZSBmaXJzdCBvbmUKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcEJzc0NvbmZpZy0+U1NJRCwgJnBQcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5TU0lELCBzaXplb2YodFNpck1hY1NTaWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9TU0lEIG11c3QgcHJlc2VudAorICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvL1NldHRvbWcgdXAgdGhlIGNhcGFiaWxpdGllcworICAgIGlmKCBjc3JJc0Jzc1R5cGVJQlNTKHBQcm9maWxlLT5CU1NUeXBlKSApCisgICAgeworICAgICAgICBwQnNzQ29uZmlnLT5Cc3NDYXAuaWJzcyA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NDb25maWctPkJzc0NhcC5lc3MgPSAxOworICAgIH0KKyAgICBpZiggZUNTUl9FTkNSWVBUX1RZUEVfTk9ORSAhPSBwUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gKQorICAgIHsKKyAgICAgICAgcEJzc0NvbmZpZy0+QnNzQ2FwLnByaXZhY3kgPSAxOworICAgIH0KKworICAgIHBCc3NDb25maWctPmVCYW5kID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lQmFuZDsKKyAgICAvL3BoeW1vZGUKKyAgICBpZihwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpCisgICAgeworICAgICAgIG9wZXJhdGlvbkNoYW5uZWwgPSBwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbMF07CisgICAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHBCc3NDb25maWctPnVDZmdEb3QxMU1vZGUgPSBjc3JSb2FtR2V0UGh5TW9kZUJhbmRGb3JCc3MocE1hYywgcFByb2ZpbGUsIG9wZXJhdGlvbkNoYW5uZWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQnNzQ29uZmlnLT5lQmFuZCk7CisjZWxzZQorCisgICAgcEJzc0NvbmZpZy0+dUNmZ0RvdDExTW9kZSA9IGNzclJvYW1HZXRQaHlNb2RlQmFuZEZvckJzcyhwTWFjLCAoZUNzclBoeU1vZGUpcFByb2ZpbGUtPnBoeU1vZGUsIG9wZXJhdGlvbkNoYW5uZWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQnNzQ29uZmlnLT5lQmFuZCk7CisjZW5kaWYKKyAgICAvL1FPUworICAgIC8vSXMgdGhpcyBjb3JyZWN0IHRvIGFsd2F5cyBzZXQgdG8gdGhpcyAvLyoqKgorCisgICAgaWYgKCBwQnNzQ29uZmlnLT5Cc3NDYXAuZXNzID09IDEgKSAKKyAgICB7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAvKkZvciBTb2Z0YXAgY2FzZSBlbmFibGUgV01NKi8KKyAgICAgICAgaWYoQ1NSX0lTX0lORlJBX0FQKHBQcm9maWxlKSAmJiAoZUNzclJvYW1XbW1Ob1FvcyAhPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLldNTVN1cHBvcnRNb2RlICkpeworICAgICAgICAgICAgIHFBUGlzRW5hYmxlZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIGlmIChjc3JSb2FtR2V0UW9zSW5mb0Zyb21Cc3MocE1hYywgcEJzc0Rlc2MpID09IGVIQUxfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICBxQVBpc0VuYWJsZWQgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHFBUGlzRW5hYmxlZCA9IEZBTFNFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBxQVBpc0VuYWJsZWQgPSBUUlVFOworICAgIH0KKworICAgIGlmICgoIGVDc3JSb2FtV21tTm9Rb3MgIT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5XTU1TdXBwb3J0TW9kZSAmJiBxQVBpc0VuYWJsZWQpIHx8CisgICAgICAgICAgKCggZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU4gPT0gcEJzc0NvbmZpZy0+dUNmZ0RvdDExTW9kZSAmJiBxQVBpc0VuYWJsZWQpIHx8CisgICAgICAgICAgICAgKCBlQ1NSX0NGR19ET1QxMV9NT0RFX1RBVVJVUyA9PSBwQnNzQ29uZmlnLT51Q2ZnRG90MTFNb2RlICkgKSAvL0ZvciAxMW4sIG5lZWQgUW9TCisgICAgICApCisgICAgeworICAgICAgICBwQnNzQ29uZmlnLT5xb3NUeXBlID0gZUNTUl9NRURJVU1fQUNDRVNTX1dNTV9lRENGX0RTQ1A7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcEJzc0NvbmZpZy0+cW9zVHlwZSA9IGVDU1JfTUVESVVNX0FDQ0VTU19EQ0Y7CisgICAgfQorICAgIAorICAgIC8vYXV0aCB0eXBlCisgICAgc3dpdGNoKCBwUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0gKSAvL1Rha2UgdGhlIHByZWZlcmVkIEF1dGggdHlwZS4KKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBOgorICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1dQQV9QU0s6CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBX05PTkU6CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU06CisgICAgICAgICAgICBwQnNzQ29uZmlnLT5hdXRoVHlwZSA9IGVTSVJfT1BFTl9TWVNURU07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk6CisgICAgICAgICAgICBwQnNzQ29uZmlnLT5hdXRoVHlwZSA9IGVTSVJfU0hBUkVEX0tFWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfQVVUT1NXSVRDSDoKKyAgICAgICAgICAgIHBCc3NDb25maWctPmF1dGhUeXBlID0gZVNJUl9BVVRPX1NXSVRDSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvL3Nob3J0IHNsb3QgdGltZQorICAgIGlmKCBXTklfQ0ZHX1BIWV9NT0RFXzExQiAhPSBwQnNzQ29uZmlnLT51Q2ZnRG90MTFNb2RlICkKKyAgICB7CisgICAgICAgIHBCc3NDb25maWctPnVTaG9ydFNsb3RUaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zaG9ydFNsb3RUaW1lOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQnNzQ29uZmlnLT51U2hvcnRTbG90VGltZSA9IDA7CisgICAgfQorICAgIC8vcG93ZXIgY29uc3RyYWludC4gV2UgZG9uJ3Qgc3VwcG9ydCAxMWggb24gSUJTUworICAgIHBCc3NDb25maWctPmYxMWhTdXBwb3J0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHBCc3NDb25maWctPnVQb3dlckxpbWl0ID0gMDsKKyAgICAvL2hlYXJ0YmVhdAorICAgIGlmICggZUNTUl9CQU5EXzVHID09IHBCc3NDb25maWctPmVCYW5kICkKKyAgICB7CisgICAgICAgIHBCc3NDb25maWctPnVIZWFydEJlYXRUaHJlc2ggPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkhlYXJ0YmVhdFRocmVzaDUwOyAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NDb25maWctPnVIZWFydEJlYXRUaHJlc2ggPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkhlYXJ0YmVhdFRocmVzaDI0OworICAgIH0KKyAgICAvL0pvaW4gdGltZW91dAorICAgIHBCc3NDb25maWctPnVKb2luVGltZU91dCA9IENTUl9KT0lOX0ZBSUxVUkVfVElNRU9VVF9ERUZBVUxUOworICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworc3RhdGljIGVIYWxTdGF0dXMgY3NyUm9hbUdldFFvc0luZm9Gcm9tQnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMgPSBOVUxMOworICAgCisgIGRvCisgICB7CisgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsIHBCc3NEZXNjLCAmcEllcykpKQorICAgICAgeworICAgICAgICAgLy9lcnIgbXNnCisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgImNzclJvYW1HZXRRb3NJbmZvRnJvbUJzcygpIGZhaWxlZFxuIik7CisKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy9jaGVjayBpZiB0aGUgQVAgaXMgUUFQICYgaXQgc3VwcG9ydHMgQVBTRAorICAgICAgaWYoIENTUl9JU19RT1NfQlNTKHBJZXMpICkKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgfQorICAgfSB3aGlsZSAoMCk7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBjc3JTZXRDZmdQcml2YWN5KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCB0QU5JX0JPT0xFQU4gZlByaXZhY3kgKQoreworCisgICAgLy8gISEgTm90ZTogIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUgY3NyU2V0Q2ZnUHJpdmFjeUZyb21Qcm9maWxlKCkgaXMgdGhlIAorICAgIC8vIHNldHRpbmcgb2YgdGhlIHByaXZhY3kgQ0ZHIGJhc2VkIG9uIHRoZSBhZHZlcnRpc2VkIHByaXZhY3kgc2V0dGluZyBmcm9tIHRoZSBBUCBmb3IgV1BBIGFzc29jaWF0aW9ucy4gCisgICAgLy8gU2VlICEhTm90ZTogYmVsb3cgaW4gdGhpcyBmdW5jdGlvbi4uLgorICAgIHRBTklfVTMyIFByaXZhY3lFbmFibGVkID0gMDsKKyAgICB0QU5JX1UzMiBSc25FbmFibGVkID0gMDsKKyAgICB0QU5JX1UzMiBXZXBEZWZhdWx0S2V5SWQgPSAwOworICAgIHRBTklfVTMyIFdlcEtleUxlbmd0aCA9IFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfNTsgICAvKiBkZWZhdWx0IDQwIGJpdHMgKi8KKyAgICB0QU5JX1UzMiBLZXkwTGVuZ3RoID0gMDsKKyAgICB0QU5JX1UzMiBLZXkxTGVuZ3RoID0gMDsKKyAgICB0QU5JX1UzMiBLZXkyTGVuZ3RoID0gMDsKKyAgICB0QU5JX1UzMiBLZXkzTGVuZ3RoID0gMDsKKyAgICAKKyAgICAvLyBSZXNlcnZlIGZvciB0aGUgYmlnZ2VzdCBrZXkgCisgICAgdEFOSV9VOCBLZXkwWyBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8xX0xFTiBdOworICAgIHRBTklfVTggS2V5MVsgV05JX0NGR19XRVBfREVGQVVMVF9LRVlfMl9MRU4gXTsKKyAgICB0QU5JX1U4IEtleTJbIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzNfTEVOIF07CisgICAgdEFOSV9VOCBLZXkzWyBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV80X0xFTiBdOworICAgIAorICAgIHN3aXRjaCAoIHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSApCisgICAgeworICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX05PTkU6CisgICAgICAgIAorICAgICAgICAgICAgLy8gZm9yIE5PIGVuY3J5cHRpb24sIHR1cm4gb2ZmIFByaXZhY3kgYW5kIFJzbi4KKyAgICAgICAgICAgIFByaXZhY3lFbmFibGVkID0gMDsgICAgICAgICAgIAorICAgICAgICAgICAgUnNuRW5hYmxlZCA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdFUCBrZXkgbGVuZ3RoIGFuZCBXZXAgRGVmYXVsdCBLZXkgSUQgZG9uJ3QgbWF0dGVyIGluIHRoaXMgY2FzZS4uLi4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gY2xlYXIgb3V0IHRoZSBXRVAga2V5cyB0aGF0IG1heSBiZSBoYW5naW5nIGFyb3VuZC4KKyAgICAgICAgICAgIEtleTBMZW5ndGggPSAwOworICAgICAgICAgICAgS2V5MUxlbmd0aCA9IDA7CisgICAgICAgICAgICBLZXkyTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIEtleTNMZW5ndGggPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWToKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gUHJpdmFjeSBpcyBPTi4gIE5PIFJTTiBmb3IgV2VwNDAgc3RhdGljIGtleS4KKyAgICAgICAgICAgIFByaXZhY3lFbmFibGVkID0gMTsgICAgICAgICAgIAorICAgICAgICAgICAgUnNuRW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFNldCB0aGUgV2VwIGRlZmF1bHQga2V5IElELgorICAgICAgICAgICAgV2VwRGVmYXVsdEtleUlkID0gcFByb2ZpbGUtPktleXMuZGVmYXVsdEluZGV4OworCisgICAgICAgICAgICAvLyBXZXAga2V5IHNpemUgaWYgNSBieXRlcyAoNDAgYml0cykuCisgICAgICAgICAgICBXZXBLZXlMZW5ndGggPSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzU7ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHNldCBlbmNyeXB0aW9uIGtleXMgaW4gdGhlIENGRyBkYXRhYmFzZSBvciBjbGVhciB0aG9zZSB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGlzIHByb2ZpbGUuCisgICAgICAgICAgICBpZiAoIHBQcm9maWxlLT5LZXlzLktleUxlbmd0aFswXSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIEtleTAsIHBQcm9maWxlLT5LZXlzLktleU1hdGVyaWFsWzBdLCBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzUgKTsKKyAgICAgICAgICAgICAgICBLZXkwTGVuZ3RoID0gV05JX0NGR19XRVBfS0VZX0xFTkdUSF81OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtleTBMZW5ndGggPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHBQcm9maWxlLT5LZXlzLktleUxlbmd0aFsxXSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIEtleTEsIHBQcm9maWxlLT5LZXlzLktleU1hdGVyaWFsWzFdLCBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzUgKTsKKyAgICAgICAgICAgICAgICBLZXkxTGVuZ3RoID0gV05JX0NGR19XRVBfS0VZX0xFTkdUSF81OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtleTFMZW5ndGggPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHBQcm9maWxlLT5LZXlzLktleUxlbmd0aFsyXSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIEtleTIsIHBQcm9maWxlLT5LZXlzLktleU1hdGVyaWFsWzJdLCBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzUgKTsKKyAgICAgICAgICAgICAgICBLZXkyTGVuZ3RoID0gV05JX0NGR19XRVBfS0VZX0xFTkdUSF81OyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLZXkyTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCBwUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhbM10gKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBLZXkzLCBwUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFszXSwgV05JX0NGR19XRVBfS0VZX0xFTkdUSF81ICk7CisgICAgICAgICAgICAgICAgS2V5M0xlbmd0aCA9IFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfNTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS2V5M0xlbmd0aCA9IDA7CisgICAgICAgICAgICB9ICAgICAgCisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBQcml2YWN5IGlzIE9OLiAgTk8gUlNOIGZvciBXZXA0MCBzdGF0aWMga2V5LgorICAgICAgICAgICAgUHJpdmFjeUVuYWJsZWQgPSAxOyAgICAgICAgICAgCisgICAgICAgICAgICBSc25FbmFibGVkID0gMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU2V0IHRoZSBXZXAgZGVmYXVsdCBrZXkgSUQuCisgICAgICAgICAgICBXZXBEZWZhdWx0S2V5SWQgPSBwUHJvZmlsZS0+S2V5cy5kZWZhdWx0SW5kZXg7CisgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2VwIGtleSBzaXplIGlmIDEzIGJ5dGVzICgxMDQgYml0cykuCisgICAgICAgICAgICBXZXBLZXlMZW5ndGggPSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzZXQgZW5jcnlwdGlvbiBrZXlzIGluIHRoZSBDRkcgZGF0YWJhc2Ugb3IgY2xlYXIgdGhvc2UgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhpcyBwcm9maWxlLgorICAgICAgICAgICAgaWYgKCBwUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhbMF0gKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBLZXkwLCBwUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFsgMCBdLCBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzICk7CisgICAgICAgICAgICAgICAgS2V5MExlbmd0aCA9IFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfMTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS2V5MExlbmd0aCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggcFByb2ZpbGUtPktleXMuS2V5TGVuZ3RoWzFdICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgS2V5MSwgcFByb2ZpbGUtPktleXMuS2V5TWF0ZXJpYWxbIDEgXSwgV05JX0NGR19XRVBfS0VZX0xFTkdUSF8xMyApOworICAgICAgICAgICAgICAgIEtleTFMZW5ndGggPSBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtleTFMZW5ndGggPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHBQcm9maWxlLT5LZXlzLktleUxlbmd0aFsyXSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIEtleTIsIHBQcm9maWxlLT5LZXlzLktleU1hdGVyaWFsWyAyIF0sIFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfMTMgKTsKKyAgICAgICAgICAgICAgICBLZXkyTGVuZ3RoID0gV05JX0NGR19XRVBfS0VZX0xFTkdUSF8xMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLZXkyTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCBwUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhbM10gKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBLZXkzLCBwUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFsgMyBdLCBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RIXzEzICk7CisgICAgICAgICAgICAgICAgS2V5M0xlbmd0aCA9IFdOSV9DRkdfV0VQX0tFWV9MRU5HVEhfMTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS2V5M0xlbmd0aCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOgorICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDoKKyAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9US0lQOgorICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX0FFUzoKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dQSToKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworICAgICAgICAgICAgLy8gISEgTm90ZTogIHRoaXMgaXMgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24gYW5kIHRoZSBjc3JTZXRDZmdQcml2YWN5RnJvbVByb2ZpbGUoKQorICAgICAgICAgICAgLy8gKHNldHRpbmcgb2YgdGhlIHByaXZhY3kgQ0ZHIGJhc2VkIG9uIHRoZSBhZHZlcnRpc2VkIHByaXZhY3kgc2V0dGluZyBmcm9tIHRoZSBBUCBmb3IgV1BBL1dBUEkgYXNzb2NpYXRpb25zICkuICAgICAgICAKKyAgICAgICAgICAgIFByaXZhY3lFbmFibGVkID0gKDAgIT0gZlByaXZhY3kpOworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gdHVybiBvbiBSU04gZW5hYmxlZCBmb3IgV1BBIGFzc29jaWF0aW9ucyAgIAorICAgICAgICAgICAgUnNuRW5hYmxlZCA9IDE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdFUCBrZXkgbGVuZ3RoIGFuZCBXZXAgRGVmYXVsdCBLZXkgSUQgZG9uJ3QgbWF0dGVyIGluIHRoaXMgY2FzZS4uLi4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gY2xlYXIgb3V0IHRoZSBzdGF0aWMgV0VQIGtleXMgdGhhdCBtYXkgYmUgaGFuZ2luZyBhcm91bmQuCisgICAgICAgICAgICBLZXkwTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIEtleTFMZW5ndGggPSAwOworICAgICAgICAgICAgS2V5Mkxlbmd0aCA9IDA7CisgICAgICAgICAgICBLZXkzTGVuZ3RoID0gMDsgICAgICAgIAorICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7ICAgICAKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHJpdmFjeUVuYWJsZWQgPSAwOworICAgICAgICAgICAgUnNuRW5hYmxlZCA9IDA7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICB9ICAgICAgICAgICAKKyAgICAKKyAgICBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR19QUklWQUNZX0VOQUJMRUQsIFByaXZhY3lFbmFibGVkLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIGNjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX1JTTl9FTkFCTEVELCBSc25FbmFibGVkLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8xLCBLZXkwLCBLZXkwTGVuZ3RoLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8yLCBLZXkxLCBLZXkxTGVuZ3RoLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV8zLCBLZXkyLCBLZXkyTGVuZ3RoLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX1dFUF9ERUZBVUxUX0tFWV80LCBLZXkzLCBLZXkzTGVuZ3RoLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIGNjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX1dFUF9LRVlfTEVOR1RILCBXZXBLZXlMZW5ndGgsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSUQsIFdlcERlZmF1bHRLZXlJZCwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKK30KKworCitzdGF0aWMgdm9pZCBjc3JTZXRDZmdTc2lkKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjU1NpZCAqcFNTSUQgKQoreworICAgIHRBTklfVTMyIGxlbiA9IDA7CisgICAgaWYocFNTSUQtPmxlbmd0aCA8PSBXTklfQ0ZHX1NTSURfTEVOKQorICAgIHsKKyAgICAgICAgbGVuID0gcFNTSUQtPmxlbmd0aDsKKyAgICB9CisgICAgY2NtQ2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfU1NJRCwgKHRBTklfVTggKilwU1NJRC0+c3NJZCwgbGVuLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2V0UW9zVG9DZmcoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgZUNzck1lZGlhQWNjZXNzVHlwZSBxb3NUeXBlICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgUW9TRW5hYmxlZDsKKyAgICB0QU5JX1UzMiBXbWVFbmFibGVkOworCisgICAgLy8gc2V0IHRoZSBDRkcgZW5hYmxlL2Rpc2FibGUgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSBxb3NUeXBlIGJlaW5nIGNvbmZpZ3VyZWQuLi4KKyAgICBzd2l0Y2goIHFvc1R5cGUgKQorICAgIHsKKworICAgICAgICBjYXNlIGVDU1JfTUVESVVNX0FDQ0VTU19XTU1fZURDRl84MDJkb3QxcDoKKyAgICAgICAgICAgIFFvU0VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIFdtZUVuYWJsZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX01FRElVTV9BQ0NFU1NfV01NX2VEQ0ZfRFNDUDoKKyAgICAgICAgICAgIFFvU0VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIFdtZUVuYWJsZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX01FRElVTV9BQ0NFU1NfV01NX2VEQ0ZfTm9DbGFzc2lmeToKKyAgICAgICAgICAgIFFvU0VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIFdtZUVuYWJsZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX01FRElVTV9BQ0NFU1NfMTFlX2VEQ0Y6CisgICAgICAgICAgICBRb1NFbmFibGVkID0gVFJVRTsKKyAgICAgICAgICAgIFdtZUVuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9NRURJVU1fQUNDRVNTXzExZV9IQ0Y6CisgICAgICAgICAgICBRb1NFbmFibGVkID0gVFJVRTsKKyAgICAgICAgICAgIFdtZUVuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgZUNTUl9NRURJVU1fQUNDRVNTX0RDRjoKKyAgICAgICAgICAgIFFvU0VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIFdtZUVuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorICAgIC8vc2F2ZSB0aGUgV01NIHNldHRpbmcgZm9yIGxhdGVyIHVzZQorICAgIHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5mV01NQ29ubmVjdGlvbiA9ICh0QU5JX0JPT0xFQU4pV21lRW5hYmxlZDsKKworICAgIHN0YXR1cyA9IGNjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX1FPU19FTkFCTEVELCBRb1NFbmFibGVkLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIHN0YXR1cyA9IGNjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX1dNRV9FTkFCTEVELCBXbWVFbmFibGVkLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCitzdGF0aWMgZUhhbFN0YXR1cyBjc3JHZXRSYXRlU2V0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgZUNzclBoeU1vZGUgcGh5TW9kZSwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRTaXJNYWNSYXRlU2V0ICpwT3BSYXRlU2V0LCB0U2lyTWFjUmF0ZVNldCAqcEV4UmF0ZVNldCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgaW50IGk7CisgICAgZUNzckNmZ0RvdDExTW9kZSBjZmdEb3QxMU1vZGU7CisgICAgdEFOSV9VOCAqcERzdFJhdGU7CisKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBPcFJhdGVTZXQsIHNpemVvZih0U2lyTWFjUmF0ZVNldCkpOworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcEV4UmF0ZVNldCwgc2l6ZW9mKHRTaXJNYWNSYXRlU2V0KSk7CisKKyNpZiBkZWZpbmVkKFZPU1NfRU5BQkxFRCkKKyAgICBWT1NfQVNTRVJUKCBwSWVzICE9IE5VTEwgKTsKKyNlbmRpZgorICAgIAorICAgIGlmKCBOVUxMICE9IHBJZXMgKQorICAgIHsKKyAgICAgICAgY3NySXNQaHlNb2RlTWF0Y2goIHBNYWMsIHBoeU1vZGUsIHBCc3NEZXNjLCBwUHJvZmlsZSwgJmNmZ0RvdDExTW9kZSwgcEllcyApOworCisgICAgICAgIC8vIE9yaWdpbmFsbHksIHdlIHRob3VnaHQgdGhhdCBmb3IgMTFhIG5ldHdvcmtzLCB0aGUgMTFhIHJhdGVzIGFyZSBhbHdheXMKKyAgICAgICAgLy8gaW4gdGhlIE9wZXJhdGlvbmFsIFJhdGUgc2V0ICYgZm9yIDExYiBhbmQgMTFnIG5ldHdvcmtzLCB0aGUgMTFiIHJhdGVzCisgICAgICAgIC8vIGFwcGVhciBpbiB0aGUgT3BlcmF0aW9uYWwgUmF0ZSBzZXQuICBDb25zZXF1ZW50bHksIGluIGVpdGhlciBjYXNlLCB3ZQorICAgICAgICAvLyB3b3VsZCBibGluZGx5IHB1dCB0aGUgcmF0ZXMgd2Ugc3VwcG9ydCBpbnRvIG91ciBPcGVyYXRpb25hbCBSYXRlIHNldAorICAgICAgICAvLyAoaW5jbHVkaW5nIHRoZSBiYXNpYyByYXRlcywgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IHZlcmlmaWVkIGFyZQorICAgICAgICAvLyBzdXBwb3J0ZWQgZWFybGllciBpbiB0aGUgcm9hbWluZyBkZWNpc2lvbikuCisKKyAgICAgICAgLy8gSG93ZXZlciwgaXQgdHVybnMgb3V0IHRoYXQgdGhpcyBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLiAgU29tZSBBUCdzCisgICAgICAgIC8vIChlLmcuIEQtTGluayBESS03ODQpIHJhbSAxMWcgcmF0ZXMgaW50byB0aGUgT3BlcmF0aW9uYWwgUmF0ZSBzZXQsCisgICAgICAgIC8vIHRvby4gIE5vdywgd2UncmUgYSBsaXR0bGUgbW9yZSBjYXJlZnVsOgorICAgICAgICBwRHN0UmF0ZSA9IHBPcFJhdGVTZXQtPnJhdGU7CisgICAgICAgIGlmKHBJZXMtPlN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBJZXMtPlN1cHBSYXRlcy5udW1fcmF0ZXM7IGkrKyApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggY3NyUmF0ZXNJc0RvdDExUmF0ZVN1cHBvcnRlZCggcE1hYywgcEllcy0+U3VwcFJhdGVzLnJhdGVzWyBpIF0gKSApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBEc3RSYXRlKysgPSBwSWVzLT5TdXBwUmF0ZXMucmF0ZXNbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgcE9wUmF0ZVNldC0+bnVtUmF0ZXMrKzs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRyA9PSBjZmdEb3QxMU1vZGUgfHwgCisgICAgICAgICAgICAgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU4gPT0gY2ZnRG90MTFNb2RlIHx8CisgICAgICAgICAgICAgZUNTUl9DRkdfRE9UMTFfTU9ERV9UQVVSVVMgPT0gY2ZnRG90MTFNb2RlIHx8CisgICAgICAgICAgICAgZUNTUl9DRkdfRE9UMTFfTU9ERV9BQkcgPT0gY2ZnRG90MTFNb2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIEV4dGVuZGVkIFJhdGVzIGluIHRoZSBiZWFjb24sIHdlIHdpbGwgcmVmbGVjdCB0aG9zZQorICAgICAgICAgICAgLy8gZXh0ZW5kZWQgcmF0ZXMgdGhhdCB3ZSBzdXBwb3J0IGluIG91dCBFeHRlbmRlZCBPcGVyYXRpb25hbCBSYXRlCisgICAgICAgICAgICAvLyBzZXQ6CisgICAgICAgICAgICBwRHN0UmF0ZSA9IHBFeFJhdGVTZXQtPnJhdGU7CisgICAgICAgICAgICBpZihwSWVzLT5FeHRTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBJZXMtPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXM7IGkrKyApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjc3JSYXRlc0lzRG90MTFSYXRlU3VwcG9ydGVkKCBwTWFjLCBwSWVzLT5FeHRTdXBwUmF0ZXMucmF0ZXNbIGkgXSApICkgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwRHN0UmF0ZSsrID0gcEllcy0+RXh0U3VwcFJhdGVzLnJhdGVzWyBpIF07CisgICAgICAgICAgICAgICAgICAgICAgICBwRXhSYXRlU2V0LT5udW1SYXRlcysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfS8vUGFyc2luZyBCU1NEZXNjCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJmYWlsZWQgdG8gcGFyc2UgQnNzRGVzY1xuIikpOworICAgIH0KKyAgICBpZiAocE9wUmF0ZVNldC0+bnVtUmF0ZXMgPiAwIHx8IHBFeFJhdGVTZXQtPm51bVJhdGVzID4gMCkgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICByZXR1cm4gc3RhdHVzOworfQorICAgIAorc3RhdGljIHZvaWQgY3NyU2V0Q2ZnUmF0ZVNldCggdHBBbmlTaXJHbG9iYWwgcE1hYywgZUNzclBoeU1vZGUgcGh5TW9kZSwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisgICAgaW50IGk7CisgICAgdEFOSV9VOCAqcERzdFJhdGU7CisgICAgZUNzckNmZ0RvdDExTW9kZSBjZmdEb3QxMU1vZGU7CisgICAgdEFOSV9VOCBPcGVyYXRpb25hbFJhdGVzWyBDU1JfRE9UMTFfU1VQUE9SVEVEX1JBVEVTX01BWCBdOyAgICAvLyBsZWF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIG1heCBudW1iZXIgb2YgcmF0ZXMKKyAgICB0QU5JX1UzMiBPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0gMDsKKyAgICB0QU5JX1U4IEV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc1sgQ1NSX0RPVDExX0VYVEVOREVEX1NVUFBPUlRFRF9SQVRFU19NQVggXTsgICAgLy8gbGVhdmUgZW5vdWdoIHJvb20gZm9yIHRoZSBtYXggbnVtYmVyIG9mIHJhdGVzCisgICAgdEFOSV9VMzIgRXh0ZW5kZWRPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0gMDsKKyAgICB0QU5JX1U4IFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc1sgNCBdOyAgICAvLyBsZWF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIG1heCBudW1iZXIgb2YgcHJvcHJpZXRhcnkgcmF0ZXMKKyAgICB0QU5JX1UzMiBQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSAwOworICAgIHRBTklfVTMyIFByb3BSYXRlc0VuYWJsZSA9IDA7CisgICAgdEFOSV9VOCBNQ1NSYXRlSWR4U2V0WyBTSVpFX09GX1NVUFBPUlRFRF9NQ1NfU0VUIF07CisgICAgdEFOSV9VMzIgTUNTUmF0ZUxlbmd0aCA9IDA7CisKKyNpZiBkZWZpbmVkKFZPU1NfRU5BQkxFRCkKKyAgICBWT1NfQVNTRVJUKCBwSWVzICE9IE5VTEwgKTsKKyNlbmRpZgorCisgICAgaWYoIE5VTEwgIT0gcEllcyApCisgICAgeworICAgICAgICBjc3JJc1BoeU1vZGVNYXRjaCggcE1hYywgcGh5TW9kZSwgcEJzc0Rlc2MsIHBQcm9maWxlLCAmY2ZnRG90MTFNb2RlLCBwSWVzICk7CisKKyAgICAgICAgLy8gT3JpZ2luYWxseSwgd2UgdGhvdWdodCB0aGF0IGZvciAxMWEgbmV0d29ya3MsIHRoZSAxMWEgcmF0ZXMgYXJlIGFsd2F5cworICAgICAgICAvLyBpbiB0aGUgT3BlcmF0aW9uYWwgUmF0ZSBzZXQgJiBmb3IgMTFiIGFuZCAxMWcgbmV0d29ya3MsIHRoZSAxMWIgcmF0ZXMKKyAgICAgICAgLy8gYXBwZWFyIGluIHRoZSBPcGVyYXRpb25hbCBSYXRlIHNldC4gIENvbnNlcXVlbnRseSwgaW4gZWl0aGVyIGNhc2UsIHdlCisgICAgICAgIC8vIHdvdWxkIGJsaW5kbHkgcHV0IHRoZSByYXRlcyB3ZSBzdXBwb3J0IGludG8gb3VyIE9wZXJhdGlvbmFsIFJhdGUgc2V0CisgICAgICAgIC8vIChpbmNsdWRpbmcgdGhlIGJhc2ljIHJhdGVzLCB3aGljaCB3ZSBoYXZlIGFscmVhZHkgdmVyaWZpZWQgYXJlCisgICAgICAgIC8vIHN1cHBvcnRlZCBlYXJsaWVyIGluIHRoZSByb2FtaW5nIGRlY2lzaW9uKS4KKworICAgICAgICAvLyBIb3dldmVyLCBpdCB0dXJucyBvdXQgdGhhdCB0aGlzIGlzIG5vdCBhbHdheXMgdGhlIGNhc2UuICBTb21lIEFQJ3MKKyAgICAgICAgLy8gKGUuZy4gRC1MaW5rIERJLTc4NCkgcmFtIDExZyByYXRlcyBpbnRvIHRoZSBPcGVyYXRpb25hbCBSYXRlIHNldCwKKyAgICAgICAgLy8gdG9vLiAgTm93LCB3ZSdyZSBhIGxpdHRsZSBtb3JlIGNhcmVmdWw6CisgICAgICAgIHBEc3RSYXRlID0gT3BlcmF0aW9uYWxSYXRlczsKKyAgICAgICAgaWYocEllcy0+U3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcEllcy0+U3VwcFJhdGVzLm51bV9yYXRlczsgaSsrICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBjc3JSYXRlc0lzRG90MTFSYXRlU3VwcG9ydGVkKCBwTWFjLCBwSWVzLT5TdXBwUmF0ZXMucmF0ZXNbIGkgXSApICYmCisgICAgICAgICAgICAgICAgICAgICAoIE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPCBDU1JfRE9UMTFfU1VQUE9SVEVEX1JBVEVTX01BWCApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBEc3RSYXRlKysgPSBwSWVzLT5TdXBwUmF0ZXMucmF0ZXNbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUcgPT0gY2ZnRG90MTFNb2RlIHx8IAorICAgICAgICAgICAgIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOID09IGNmZ0RvdDExTW9kZSB8fAorICAgICAgICAgICAgIGVDU1JfQ0ZHX0RPVDExX01PREVfVEFVUlVTID09IGNmZ0RvdDExTW9kZSB8fAorICAgICAgICAgICAgIGVDU1JfQ0ZHX0RPVDExX01PREVfQUJHID09IGNmZ0RvdDExTW9kZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBFeHRlbmRlZCBSYXRlcyBpbiB0aGUgYmVhY29uLCB3ZSB3aWxsIHJlZmxlY3QgdGhvc2UKKyAgICAgICAgICAgIC8vIGV4dGVuZGVkIHJhdGVzIHRoYXQgd2Ugc3VwcG9ydCBpbiBvdXQgRXh0ZW5kZWQgT3BlcmF0aW9uYWwgUmF0ZQorICAgICAgICAgICAgLy8gc2V0OgorICAgICAgICAgICAgcERzdFJhdGUgPSBFeHRlbmRlZE9wZXJhdGlvbmFsUmF0ZXM7CisgICAgICAgICAgICBpZihwSWVzLT5FeHRTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBJZXMtPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXM7IGkrKyApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjc3JSYXRlc0lzRG90MTFSYXRlU3VwcG9ydGVkKCBwTWFjLCBwSWVzLT5FeHRTdXBwUmF0ZXMucmF0ZXNbIGkgXSApICYmCisgICAgICAgICAgICAgICAgICAgICAoIEV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA8IENTUl9ET1QxMV9FWFRFTkRFRF9TVVBQT1JURURfUkFURVNfTUFYICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwRHN0UmF0ZSsrID0gcEllcy0+RXh0U3VwcFJhdGVzLnJhdGVzWyBpIF07CisgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGgrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuYWJsZSBwcm9wcmlldGFyeSBNQUMgZmVhdHVyZXMgaWYgcGVlciBub2RlIGlzIEFpcmdvIG5vZGUgYW5kIFNUQQorICAgICAgICAvLyB1c2VyIHdhbnRzIHRvIHVzZSB0aGVtCisgICAgICAgIGlmKCBwSWVzLT5BaXJnby5wcmVzZW50ICYmIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQgKQorICAgICAgICB7CisgICAgICAgICAgICBQcm9wUmF0ZXNFbmFibGUgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUHJvcFJhdGVzRW5hYmxlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvciBBTkkgbmV0d29yayBjb21wYW5pb25zLCB3ZSBuZWVkIHRvIHBvcHVsYXRlIHRoZSBwcm9wcmlldGFyeSByYXRlCisgICAgICAgIC8vIHNldCB3aXRoIGFueSBwcm9wcmlldGFyeSByYXRlcyB3ZSBmb3VuZCBpbiB0aGUgYmVhY29uLCBvbmx5IGlmIHVzZXIKKyAgICAgICAgLy8gYWxsb3dzIHRoZW0uLi4KKyAgICAgICAgaWYgKCBQcm9wUmF0ZXNFbmFibGUgJiYgcEllcy0+QWlyZ28uUHJvcFN1cHBSYXRlcy5wcmVzZW50ICYmCisgICAgICAgICAgICAgKCBwSWVzLT5BaXJnby5Qcm9wU3VwcFJhdGVzLm51bV9yYXRlcyA+IDAgKSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9IHBJZXMtPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzOworICAgICAgICAgICAgaWYgKCBQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPiBzaXplb2YoUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSBzaXplb2YgKFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXMsIHBJZXMtPkFpcmdvLlByb3BTdXBwUmF0ZXMucmF0ZXMsIFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gTm8gcHJvcHJpZXRhcnkgbW9kZXMuLi4KKyAgICAgICAgICAgIFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgTUNTIFJhdGUgKi8KKyAgICAgICAgcERzdFJhdGUgPSBNQ1NSYXRlSWR4U2V0OworICAgICAgICBpZiAoIHBJZXMtPkhUQ2Fwcy5wcmVzZW50ICkKKyAgICAgICAgeworICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IFZBTElEX01BWF9NQ1NfSU5ERVg7IGkrKyApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCAodW5zaWduZWQgaW50KXBJZXMtPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXRbMF0gJiAoMSA8PCBpKSApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgTUNTUmF0ZUxlbmd0aCsrOworICAgICAgICAgICAgICAgICAqcERzdFJhdGUrKyA9IGk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHRoZSBvcGVyYXRpb25hbCByYXRlIHNldCBDRkcgdmFyaWFibGVzLi4uCisgICAgICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX09QRVJBVElPTkFMX1JBVEVfU0VULCBPcGVyYXRpb25hbFJhdGVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGgsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VULCBFeHRlbmRlZE9wZXJhdGlvbmFsUmF0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgY2NtQ2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfUFJPUFJJRVRBUllfT1BFUkFUSU9OQUxfUkFURV9TRVQsIAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfUFJPUFJJRVRBUllfQU5JX0ZFQVRVUkVTX0VOQUJMRUQsIFByb3BSYXRlc0VuYWJsZSwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgY2NtQ2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfQ1VSUkVOVF9NQ1NfU0VULCBNQ1NSYXRlSWR4U2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE1DU1JhdGVMZW5ndGgsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7ICAgICAgICAKKyAgICB9Ly9QYXJzaW5nIEJTU0Rlc2MKKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImZhaWxlZCB0byBwYXJzZSBCc3NEZXNjXG4iKSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGNzclNldENmZ1JhdGVTZXRGcm9tUHJvZmlsZSggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSAgKQoreworICAgIHRTaXJNYWNSYXRlU2V0SUUgRGVmYXVsdFN1cHBvcnRlZFJhdGVzMTFhID0geyAgU0lSX01BQ19SQVRFU0VUX0VJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNJUl9NQUNfUkFURV82LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfUkFURV85LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfUkFURV8xMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX1JBVEVfMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX1JBVEVfMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX1JBVEVfMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX1JBVEVfNDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19SQVRFXzU0ICB9IH0gfTsKKworICAgIHRTaXJNYWNSYXRlU2V0SUUgRGVmYXVsdFN1cHBvcnRlZFJhdGVzMTFiID0geyAgU0lSX01BQ19SQVRFU0VUX0VJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNJUl9NQUNfUkFURV8xLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfUkFURV8yLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfUkFURV81XzUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfUkFURV8xMSAgfSB9IH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB0U2lyTWFjUHJvcFJhdGVTZXQgRGVmYXVsdFN1cHBvcnRlZFByb3BSYXRlcyA9IHsgMywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU0lSX01BQ19SQVRFXzcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX1JBVEVfOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19SQVRFXzEwOCB9IH07CisgICAgZUNzckNmZ0RvdDExTW9kZSBjZmdEb3QxMU1vZGU7CisgICAgZUNzckJhbmQgZUJhbmQ7CisgICAgdEFOSV9VOCBPcGVyYXRpb25hbFJhdGVzWyBDU1JfRE9UMTFfU1VQUE9SVEVEX1JBVEVTX01BWCBdOyAgICAvLyBsZWF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIG1heCBudW1iZXIgb2YgcmF0ZXMKKyAgICB0QU5JX1UzMiBPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0gMDsKKyAgICB0QU5JX1U4IEV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc1sgQ1NSX0RPVDExX0VYVEVOREVEX1NVUFBPUlRFRF9SQVRFU19NQVggXTsgICAgLy8gbGVhdmUgZW5vdWdoIHJvb20gZm9yIHRoZSBtYXggbnVtYmVyIG9mIHJhdGVzCisgICAgdEFOSV9VMzIgRXh0ZW5kZWRPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0gMDsKKyAgICB0QU5JX1U4IFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc1sgNCBdOyAgICAvLyBsZWF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIG1heCBudW1iZXIgb2YgcHJvcHJpZXRhcnkgcmF0ZXMKKyAgICB0QU5JX1UzMiBQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSAwOworICAgIHRBTklfVTMyIFByb3BSYXRlc0VuYWJsZSA9IDA7CisgICAgdEFOSV9VOCBvcGVyYXRpb25DaGFubmVsID0gMDsgCisKKyAgICBpZihwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpCisgICAgeworICAgICAgIG9wZXJhdGlvbkNoYW5uZWwgPSBwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbMF07CisgICAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGNmZ0RvdDExTW9kZSA9IGNzclJvYW1HZXRQaHlNb2RlQmFuZEZvckJzcyggcE1hYywgcFByb2ZpbGUsIG9wZXJhdGlvbkNoYW5uZWwsICZlQmFuZCApOworI2Vsc2UKKyAgICBjZmdEb3QxMU1vZGUgPSBjc3JSb2FtR2V0UGh5TW9kZUJhbmRGb3JCc3MoIHBNYWMsIChlQ3NyUGh5TW9kZSlwUHJvZmlsZS0+cGh5TW9kZSwgb3BlcmF0aW9uQ2hhbm5lbCwgJmVCYW5kICk7CisjZW5kaWYKKyAgICAvLyBGb3IgMTFhIG5ldHdvcmtzLCB0aGUgMTFhIHJhdGVzIGdvIGludG8gdGhlIE9wZXJhdGlvbmFsIFJhdGUgc2V0LiAgRm9yIDExYiBhbmQgMTFnIAorICAgIC8vIG5ldHdvcmtzLCB0aGUgMTFiIHJhdGVzIGFwcGVhciBpbiB0aGUgT3BlcmF0aW9uYWwgUmF0ZSBzZXQuICBJbiBlaXRoZXIgY2FzZSwKKyAgICAvLyB3ZSBjYW4gYmxpbmRseSBwdXQgdGhlIHJhdGVzIHdlIHN1cHBvcnQgaW50byBvdXIgT3BlcmF0aW9uYWwgUmF0ZSBzZXQgCisgICAgLy8gKGluY2x1ZGluZyB0aGUgYmFzaWMgcmF0ZXMsIHdoaWNoIHdlIGhhdmUgYWxyZWFkeSB2ZXJpZmllZCBhcmUgc3VwcG9ydGVkIAorICAgIC8vIGVhcmxpZXIgaW4gdGhlIHJvYW1pbmcgZGVjaXNpb24pLgorICAgIGlmICggZUNTUl9CQU5EXzVHID09IGVCYW5kICkgCisgICAgeyAgICAgICAKKyAgICAgICAgLy8gMTFhIHJhdGVzIGludG8gdGhlIE9wZXJhdGlvbmFsIFJhdGUgU2V0LiAgICAgICAgICAgICAgICAgCisgICAgICAgIE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSBEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWEuc3VwcG9ydGVkUmF0ZVNldC5udW1SYXRlcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqRGVmYXVsdFN1cHBvcnRlZFJhdGVzMTFhLnN1cHBvcnRlZFJhdGVTZXQucmF0ZSk7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIE9wZXJhdGlvbmFsUmF0ZXMsICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWEuc3VwcG9ydGVkUmF0ZVNldC5yYXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gTm90aGluZyBpbiB0aGUgRXh0ZW5kZWQgcmF0ZSBzZXQuCisgICAgICAgIEV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9IDA7CisKKyAgICAgICAgLy8gcG9wdWxhdGUgcHJvcHJpZXRhcnkgcmF0ZXMgaWYgdXNlciBhbGxvd3MgdGhlbQorICAgICAgICBpZiAoIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQgKSAKKyAgICAgICAgeworICAgICAgICAgICAgUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0gRGVmYXVsdFN1cHBvcnRlZFByb3BSYXRlcy5udW1Qcm9wUmF0ZXMgKiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqRGVmYXVsdFN1cHBvcnRlZFByb3BSYXRlcy5wcm9wUmF0ZSk7ICAgICAgICAgCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFN1cHBvcnRlZFByb3BSYXRlcy5wcm9wUmF0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzTGVuZ3RoICk7CisgICAgICAgIH0gICAgCisgICAgICAgIGVsc2UgCisgICAgICAgIHsgICAgICAgCisgICAgICAgICAgICAvLyBObyBwcm9wcmlldGFyeSBtb2RlcworICAgICAgICAgICAgUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0gMDsgICAgICAgICAKKyAgICAgICAgfSAgICAKKyAgICB9ICAgIAorICAgIGVsc2UgaWYgKCBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQiA9PSBjZmdEb3QxMU1vZGUgKSAKKyAgICB7ICAgICAgIAorICAgICAgICAvLyAxMWIgcmF0ZXMgaW50byB0aGUgT3BlcmF0aW9uYWwgUmF0ZSBTZXQuICAgICAgICAgCisgICAgICAgIE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggPSBEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWIuc3VwcG9ydGVkUmF0ZVNldC5udW1SYXRlcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWIuc3VwcG9ydGVkUmF0ZVNldC5yYXRlKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgT3BlcmF0aW9uYWxSYXRlcywgCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWIuc3VwcG9ydGVkUmF0ZVNldC5yYXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggKTsKKyAgICAgICAgLy8gTm90aGluZyBpbiB0aGUgRXh0ZW5kZWQgcmF0ZSBzZXQuCisgICAgICAgIEV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9IDA7CisgICAgICAgIC8vIE5vIHByb3ByaWV0YXJ5IG1vZGVzCisgICAgICAgIFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9IDA7CisgICAgfSAgICAKKyAgICBlbHNlIAorICAgIHsgICAgICAgCisgICAgICAgIC8vIDExRworICAgICAgICAKKyAgICAgICAgLy8gMTFiIHJhdGVzIGludG8gdGhlIE9wZXJhdGlvbmFsIFJhdGUgU2V0LiAgICAgICAgIAorICAgICAgICBPcGVyYXRpb25hbFJhdGVzTGVuZ3RoID0gRGVmYXVsdFN1cHBvcnRlZFJhdGVzMTFiLnN1cHBvcnRlZFJhdGVTZXQubnVtUmF0ZXMgKiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWIuc3VwcG9ydGVkUmF0ZVNldC5yYXRlKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgT3BlcmF0aW9uYWxSYXRlcywgCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWIuc3VwcG9ydGVkUmF0ZVNldC5yYXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggKTsKKyAgICAgICAgCisgICAgICAgIC8vIDExYSByYXRlcyBnbyBpbiB0aGUgRXh0ZW5kZWQgcmF0ZSBzZXQuCisgICAgICAgIEV4dGVuZGVkT3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9IERlZmF1bHRTdXBwb3J0ZWRSYXRlczExYS5zdXBwb3J0ZWRSYXRlU2V0Lm51bVJhdGVzICogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpEZWZhdWx0U3VwcG9ydGVkUmF0ZXMxMWEuc3VwcG9ydGVkUmF0ZVNldC5yYXRlKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgRXh0ZW5kZWRPcGVyYXRpb25hbFJhdGVzLCAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFN1cHBvcnRlZFJhdGVzMTFhLnN1cHBvcnRlZFJhdGVTZXQucmF0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZE9wZXJhdGlvbmFsUmF0ZXNMZW5ndGggKTsKKyAgICAgICAgCisgICAgICAgIC8vIHBvcHVsYXRlIHByb3ByaWV0YXJ5IHJhdGVzIGlmIHVzZXIgYWxsb3dzIHRoZW0KKyAgICAgICAgaWYgKCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlByb3ByaWV0YXJ5UmF0ZXNFbmFibGVkICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9IERlZmF1bHRTdXBwb3J0ZWRQcm9wUmF0ZXMubnVtUHJvcFJhdGVzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqRGVmYXVsdFN1cHBvcnRlZFByb3BSYXRlcy5wcm9wUmF0ZSk7ICAgICAgICAgCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBQcm9wcmlldGFyeU9wZXJhdGlvbmFsUmF0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRTdXBwb3J0ZWRQcm9wUmF0ZXMucHJvcFJhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCApOworICAgICAgICB9ICAKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyAgICAgICAKKyAgICAgICAgICAgLy8gTm8gcHJvcHJpZXRhcnkgbW9kZXMKKyAgICAgICAgICAgIFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCA9IDA7ICAgICAgICAgCisgICAgICAgIH0gICAgCisgICAgfSAgCisKKyAgICAvLyBzZXQgdGhpcyB0byAxIGlmIHByb3AuIHJhdGVzIG5lZWQgdG8gYmUgYWR2ZXJ0aXNlZCBpbiB0byB0aGUgSUJTUyBiZWFjb24gYW5kIHVzZXIgd2FudHMgdG8gdXNlIHRoZW0KKyAgICBpZiAoIFByb3ByaWV0YXJ5T3BlcmF0aW9uYWxSYXRlc0xlbmd0aCAmJiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlByb3ByaWV0YXJ5UmF0ZXNFbmFibGVkICkgCisgICAgeworICAgICAgICBQcm9wUmF0ZXNFbmFibGUgPSAxOyAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICAgIFByb3BSYXRlc0VuYWJsZSA9IDA7ICAgIAorICAgIH0KKyAgICAgICAgCisgICAgLy8gU2V0IHRoZSBvcGVyYXRpb25hbCByYXRlIHNldCBDRkcgdmFyaWFibGVzLi4uCisgICAgY2NtQ2ZnU2V0U3RyKHBNYWMsIFdOSV9DRkdfT1BFUkFUSU9OQUxfUkFURV9TRVQsIE9wZXJhdGlvbmFsUmF0ZXMsIAorICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25hbFJhdGVzTGVuZ3RoLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VULCBFeHRlbmRlZE9wZXJhdGlvbmFsUmF0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRPcGVyYXRpb25hbFJhdGVzTGVuZ3RoLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX1BST1BSSUVUQVJZX09QRVJBVElPTkFMX1JBVEVfU0VULCAKKyAgICAgICAgICAgICAgICAgICAgUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzLCAKKyAgICAgICAgICAgICAgICAgICAgUHJvcHJpZXRhcnlPcGVyYXRpb25hbFJhdGVzTGVuZ3RoLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIGNjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX1BST1BSSUVUQVJZX0FOSV9GRUFUVVJFU19FTkFCTEVELCBQcm9wUmF0ZXNFbmFibGUsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisKK30KKwordm9pZCBjc3JSb2FtQ2NtQ2ZnU2V0Q2FsbGJhY2sodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1MzMiByZXN1bHQpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdExpc3RFbGVtICpwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0spOworICAgIHRBTklfVTMyIHNlc3Npb25JZDsKKyAgICB0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisKKyAgICBpZihOVUxMID09IHBFbnRyeSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiICAgQ0ZHX0NORiB3aXRoIGFjdGl2ZSBsaXN0IGVtcHR5XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKyAgICBzZXNzaW9uSWQgPSBwQ29tbWFuZC0+c2Vzc2lvbklkOworCisgICAgaWYoQ1NSX0lTX1JPQU1fSk9JTklORyhwTWFjLCBzZXNzaW9uSWQpICYmIENTUl9JU19ST0FNX1NVQlNUQVRFX0NPTkZJRyhwTWFjLCBzZXNzaW9uSWQpKQorICAgIHsKKyAgICAgICAgY3NyUm9hbWluZ1N0YXRlQ29uZmlnQ25mUHJvY2Vzc29yKHBNYWMsICh0QU5JX1UzMilyZXN1bHQpOworICAgIH0KK30KKworCisvL1RoaXMgZnVuY3Rpb24gaXMgdmVyeSBkdW1wLiBJdCBpcyBoZXJlIGJlY2F1c2UgUEUgc3RpbGwgbmVlZCBXTklfQ0ZHX1BIWV9NT0RFCit0QU5JX1UzMiBjc3JSb2FtR2V0UGh5TW9kZUZyb21Eb3QxMU1vZGUoZUNzckNmZ0RvdDExTW9kZSBkb3QxMU1vZGUsIGVDc3JCYW5kIGJhbmQpCit7CisgICAgaWYoZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUIgPT0gZG90MTFNb2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChXTklfQ0ZHX1BIWV9NT0RFXzExQik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKGVDU1JfQkFORF8yNCA9PSBiYW5kKQorICAgICAgICAgICAgcmV0dXJuIChXTklfQ0ZHX1BIWV9NT0RFXzExRyk7CisgICAgfQorCisgICAgcmV0dXJuIChXTklfQ0ZHX1BIWV9NT0RFXzExQSk7Cit9CisKKyAgICAgICAgCisvL3BJZXMgbWF5IGJlIE5VTEwKK2VIYWxTdGF0dXMgY3NyUm9hbVNldEJzc0NvbmZpZ0NmZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsIHRCc3NDb25maWdQYXJhbSAqcEJzc0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgICBjZmdDYiA9IFdOSV9DRkdfQ0hBTk5FTF9CT05ESU5HX01PREVfRElTQUJMRTsKKyAgICB0QU5JX1U4ICAgIGNoYW5uZWwgPSAwOworICAgIC8vTWFrZSBzdXJlIHdlIGhhdmUgdGhlIGRvbWFpbiBpbmZvIGZvciB0aGUgQlNTIHdlIHRyeSB0byBjb25uZWN0IHRvLgorICAgIC8vRG8gd2UgbmVlZCB0byB3b3JyeSBhYm91dCBzZXF1ZW5jZSBmb3IgT1NzIHRoYXQgYXJlIG5vdCBXaW5kb3dzPz8KKyAgICBpZihwQnNzRGVzYykKKyAgICB7CisgICAgICAgIGlmKGNzckxlYXJuQ291bnRyeUluZm9ybWF0aW9uKHBNYWMsIHBCc3NEZXNjLCBwSWVzLCBlQU5JX0JPT0xFQU5fVFJVRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vTWFrZSBzdXJlIHRoZSAxMWQgaW5mbyBmcm9tIHRoaXMgQlNTRGVzYyBjYW4gYmUgYXBwbGllZAorICAgICAgICAgICAgcE1hYy0+c2Nhbi5mQW1iaWd1b3VzMTFkSW5mb0ZvdW5kID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgY3NyQXBwbHlDb3VudHJ5SW5mb3JtYXRpb24oIHBNYWMsIFRSVUUgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgLy9Rb3MKKyAgICBjc3JTZXRRb3NUb0NmZyggcE1hYywgc2Vzc2lvbklkLCBwQnNzQ29uZmlnLT5xb3NUeXBlICk7CisgICAgLy9TU0lECisgICAgY3NyU2V0Q2ZnU3NpZChwTWFjLCAmcEJzc0NvbmZpZy0+U1NJRCApOworICAgIC8vZnJhZ21lbnQgdGhyZXNob2xkCisgICAgLy9jY21DZmdTZXRJbnQocE1hYywgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwgY3NyR2V0RnJhZ1RocmVzaChwTWFjKSwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAvL1JUUyB0aHJlc2hvbGQKKyAgICAvL2NjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsIGNzckdldFJUU1RocmVzaChwTWFjKSwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKworICAgIC8vY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfRE9UMTFfTU9ERSwgY3NyVHJhbnNsYXRlVG9XTklDZmdEb3QxMU1vZGUocE1hYywgcEJzc0NvbmZpZy0+dUNmZ0RvdDExTW9kZSksIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgIAorICAgIC8vQXV0aCB0eXBlCisgICAgY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfQVVUSEVOVElDQVRJT05fVFlQRSwgcEJzc0NvbmZpZy0+YXV0aFR5cGUsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgLy9lbmNyeXB0aW9uIHR5cGUKKyAgICBjc3JTZXRDZmdQcml2YWN5KHBNYWMsIHBQcm9maWxlLCAodEFOSV9CT09MRUFOKXBCc3NDb25maWctPkJzc0NhcC5wcml2YWN5ICk7CisgICAgLy9zaG9ydCBzbG90IHRpbWUKKyAgICBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR18xMUdfU0hPUlRfU0xPVF9USU1FX0VOQUJMRUQsIHBCc3NDb25maWctPnVTaG9ydFNsb3RUaW1lLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIC8vMTFkCisgICAgY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfMTFEX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKHBCc3NDb25maWctPmYxMWhTdXBwb3J0KSA/IHBCc3NDb25maWctPmYxMWhTdXBwb3J0IDogcFByb2ZpbGUtPmllZWU4MDIxMWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyNlbmRpZgorICAgIC8qLy8xMWgKKyAgICBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR18xMUhfRU5BQkxFRCwgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExaFN1cHBvcnRFbmFibGVkLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICovCisgICAgY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfTE9DQUxfUE9XRVJfQ09OU1RSQUlOVCwgcEJzc0NvbmZpZy0+dVBvd2VyTGltaXQsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgLy9DQgorICAgIGlmKENTUl9JU19JTkZSQV9BUChwUHJvZmlsZSkgfHwgQ1NSX0lTX1dEU19BUChwUHJvZmlsZSkpCisgICAgeworICAgICAgICBjaGFubmVsID0gcFByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHBCc3NEZXNjKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFubmVsID0gcEJzc0Rlc2MtPmNoYW5uZWxJZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZigwICE9IGNoYW5uZWwpCisgICAgeworICAgICAgICBpZihDU1JfSVNfQ0hBTk5FTF8yNEdIWihjaGFubmVsKSkKKyAgICAgICAgey8vZm9yIG5vdyBpZiB3ZSBhcmUgb24gMi40IEdoeiwgQ0Igd2lsbCBiZSBhbHdheXMgZGlzYWJsZWQKKyAgICAgICAgICAgIGNmZ0NiID0gV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERV9ESVNBQkxFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAvL2NmZ0NiID0gcEJzc0NvbmZpZy0+Y2JNb2RlOworICAgICAgICAgICBjZmdDYiA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKKyAgICAgICAgfQorICAgIH0KKyAgICBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR19DSEFOTkVMX0JPTkRJTkdfTU9ERSwgY2ZnQ2IsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgLy9SYXRlCisgICAgLy9GaXhlZCBSYXRlCisgICAgaWYocEJzc0Rlc2MpCisgICAgeworICAgICAgICBjc3JTZXRDZmdSYXRlU2V0KHBNYWMsIChlQ3NyUGh5TW9kZSlwUHJvZmlsZS0+cGh5TW9kZSwgcFByb2ZpbGUsIHBCc3NEZXNjLCBwSWVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY3NyU2V0Q2ZnUmF0ZVNldEZyb21Qcm9maWxlKHBNYWMsIHBQcm9maWxlKTsKKyAgICB9CisgICAgLy9NYWtlIHRoaXMgdGhlIGxhc3QgQ0ZHIHRvIHNldC4gVGhlIGNhbGxiYWNrIHdpbGwgdHJpZ2dlciBhIGpvaW5fcmVxCisgICAgLy9Kb2luIHRpbWUgb3V0CisgICAgY3NyUm9hbVN1YnN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1fU1VCU1RBVEVfQ09ORklHLCBzZXNzaW9uSWQgKTsKKworICAgIGNjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0pPSU5fRkFJTFVSRV9USU1FT1VULCBwQnNzQ29uZmlnLT51Sm9pblRpbWVPdXQsICh0Q2NtQ2ZnU2V0Q2FsbGJhY2spY3NyUm9hbUNjbUNmZ1NldENhbGxiYWNrLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKworZUhhbFN0YXR1cyBjc3JSb2FtU3RvcE5ldHdvcmsoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICB0QnNzQ29uZmlnUGFyYW0gKnBCc3NDb25maWc7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcEJzc0NvbmZpZywgc2l6ZW9mKHRCc3NDb25maWdQYXJhbSkpOyAKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcEJzc0NvbmZpZywgc2l6ZW9mKHRCc3NDb25maWdQYXJhbSkpOworICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJlcGFyZUJzc0NvbmZpZyhwTWFjLCBwUHJvZmlsZSwgcEJzc0Rlc2MsIHBCc3NDb25maWcsIHBJZXMpOworICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcFNlc3Npb24tPmJzc1BhcmFtcy51Q2ZnRG90MTFNb2RlID0gcEJzc0NvbmZpZy0+dUNmZ0RvdDExTW9kZTsKKyAgICAgICAgICAgIC8vRm9yIElCU1MsIHdlIG5lZWQgdG8gcHJlcGFyZSBzb21lIG1vcmUgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGlmKCBjc3JJc0Jzc1R5cGVJQlNTKHBQcm9maWxlLT5CU1NUeXBlKSB8fCBDU1JfSVNfV0RTKCBwUHJvZmlsZSApCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgICB8fCBDU1JfSVNfSU5GUkFfQVAocFByb2ZpbGUpCisjZW5kaWYKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjc3JSb2FtUHJlcGFyZUJzc1BhcmFtcyhwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCBwQnNzRGVzYywgcEllcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gYW4gSUJTUywgdGhlbiBzdG9wIHRoZSBJQlNTLi4uCisgICAgICAgICAgICAvLy8vTm90IHdvcnJ5IGFib3V0IFdEUyBjb25uZWN0aW9uIGZvciBub3cKKyAgICAgICAgICAgIGlmICggY3NySXNDb25uU3RhdGVJYnNzKCBwTWFjLCBzZXNzaW9uSWQgKSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZVN0b3BCc3MoIHBNYWMsIHNlc3Npb25JZCwgZUNTUl9ST0FNX1NVQlNUQVRFX0RJU0NPTk5FQ1RfQ09OVElOVUVfUk9BTUlORyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gYW4gSW5mcmFzdHJ1Y3R1cmUgYXNzb2NpYXRpb24uLi4uCisgICAgICAgICAgICAgICAgaWYgKCBjc3JJc0Nvbm5TdGF0ZUluZnJhKCBwTWFjLCBzZXNzaW9uSWQgKSApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBuZXcgQnNzIGlzIGFuIElic3MgT1Igd2UgYXJlIHJvYW1pbmcgZnJvbSBJbmZyYSB0byBJbmZyYQorICAgICAgICAgICAgICAgICAgICAvLyBhY3Jvc3MgU1NJRHMgKHJvYW1pbmcgdG8gYSBuZXcgU1NJRCkuLi4gICAgICAgICAgICAvLyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvL05vdCB3b3JyeSBhYm91dCBXRFMgY29ubmVjdGlvbiBmb3Igbm93CisgICAgICAgICAgICAgICAgICAgIGlmICggcEJzc0Rlc2MgJiYgKCAoIGNzcklzSWJzc0Jzc0Rlc2MoIHBCc3NEZXNjICkgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAhY3NySXNTc2lkRXF1YWwoIHBNYWMsIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MsIHBCc3NEZXNjLCBwSWVzICkgKSApICAgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBkaXNhc3NvY2lhdGUgZnJvbSB0aGUgSW5mcmFzdHJ1Y3R1cmUgbmV0d29yay4uLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlRGlzYXNzb2NpYXRlKCBwTWFjLCBzZXNzaW9uSWQsIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNDT05ORUNUX0NPTlRJTlVFX1JPQU1JTkcsIEZBTFNFICk7ICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICB7ICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGFuIEluZnJhc3R1Y3R1cmUgYW5kIGdvaW5nIHRvIGFuIEluZnJhc3RydWN0dXJlIG5ldHdvcmsgd2l0aCB0aGUgc2FtZSBTU0lELiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgZm9yIGEgUmVhc3NvY2lhdGlvbiBzZXF1ZW5jZS4gIFNvIGlzc3VlIHRoZSBDRkcgc2V0cyBmb3IgdGhpcyBuZXcgQVAuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBCc3NEZXNjICkgCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHBhcmFtZXRlcnMgZm9yIHRoaXMgQnNzLiAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtU2V0QnNzQ29uZmlnQ2ZnKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIHBCc3NEZXNjLCBwQnNzQ29uZmlnLCBwSWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTmVpaGVyIGluIElCU1Mgbm9yIGluIEluZnJhLiAgV2UgY2FuIGdvIGFoZWFkIGFuZCBzZXQgdGhlIENGRyBmb3IgdG5lIG5ldyBuZXR3b3JrLi4uCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gc3RvcC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwQnNzRGVzYyB8fCBDU1JfSVNfV0RTX0FQKCBwUHJvZmlsZSApCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgICAgICAgICAgfHwgQ1NSX0lTX0lORlJBX0FQKHBQcm9maWxlKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkgCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBwYXJhbWV0ZXJzIGZvciB0aGlzIEJzcy4gICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtU2V0QnNzQ29uZmlnQ2ZnKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIHBCc3NEZXNjLCBwQnNzQ29uZmlnLCBwSWVzKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9Ly9TdWNjZXNzIGdldHRpbmcgQlNTIGNvbmZpZyBpbmZvCisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEJzc0NvbmZpZyk7CisgICAgfS8vQWxsb2NhdGUgbWVtb3J5CisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VDc3JKb2luU3RhdGUgY3NyUm9hbUpvaW4oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyU2NhblJlc3VsdEluZm8gKnBTY2FuUmVzdWx0LCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlICkKK3sKKyAgICBlQ3NySm9pblN0YXRlIGVSb2FtU3RhdGUgPSBlQ3NyQ29udGludWVSb2FtaW5nOworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MgPSAmcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3I7CisgICAgdERvdDExZkJlYWNvbklFcyAqcEllc0xvY2FsID0gKHREb3QxMWZCZWFjb25JRXMgKikoIHBTY2FuUmVzdWx0LT5wdkllcyApOyAvL1RoaXMgbWF5IGJlIE5VTEwKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKworICAgIGlmKCBDU1JfSVNfV0RTX1NUQSggcFByb2ZpbGUgKSApCisgICAgeworICAgICAgICBzdGF0dXMgPSBjc3JSb2FtU3RhcnRXZHMoIHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIHBCc3NEZXNjICk7CisgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVSb2FtU3RhdGUgPSBlQ3NyU3RvcFJvYW1pbmc7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoICFwSWVzTG9jYWwgJiYgKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgcEJzc0Rlc2MsICZwSWVzTG9jYWwpKSkgKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHBhcnNlIElFcyIpKTsKKyAgICAgICAgICAgIHJldHVybiAoZUNzclN0b3BSb2FtaW5nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGNzcklzSW5mcmFCc3NEZXNjKCBwQnNzRGVzYyApICkgCisgICAgeworICAgICAgICAvLyBJZiB3ZSBhcmUgY29ubmVjdGVkIGluIGluZnJhc3RydWN0dXJlIG1vZGUgYW5kIHRoZSBKb2luIEJzcyBkZXNjcmlwdGlvbiBpcyBmb3IgdGhlIHNhbWUgQnNzSUQsIHRoZW4gd2UgYXJlCisgICAgICAgIC8vIGF0dGVtcHRpbmcgdG8gam9pbiB0aGUgQVAgd2UgYXJlIGFscmVhZHkgY29ubmVjdGVkIHdpdGguICBJbiB0aGF0IGNhc2UsIHNlZSBpZiB0aGUgQnNzIG9yIFN0YSBjYXBhYmlsaXRpZXMKKyAgICAgICAgLy8gaGF2ZSBjaGFuZ2VkIGFuZCBoYW5kbGUgdGhlIGNoYW5nZXMgKHdpdGhvdXQgZGlzdHVyYmluZyB0aGUgY3VycmVudCBhc3NvY2lhdGlvbikuCisgICAgICAgICAgICAgICAgCisgICAgICAgIGlmICggY3NySXNDb25uU3RhdGVDb25uZWN0ZWRJbmZyYShwTWFjLCBzZXNzaW9uSWQpICYmIAorICAgICAgICAgICAgIGNzcklzQnNzSWRFcXVhbCggcE1hYywgcEJzc0Rlc2MsIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MgKSAmJgorICAgICAgICAgICAgICAgICBjc3JJc1NzaWRFcXVhbCggcE1hYywgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYywgcEJzc0Rlc2MsIHBJZXNMb2NhbCApCisgICAgICAgICAgICkgICAgICAgICAgICAgICAKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBBdXRoIHR5cGUgaGFzIGNoYW5nZWQgaW4gdGhlIFByb2ZpbGUuICBJZiBzbywgd2UgZG9uJ3Qgd2FudCB0byBSZWFzc29jaWF0ZQorICAgICAgICAgICAgLy8gd2l0aCBBdXRoZW50aWNhdGluZyBmaXJzdC4gIFRvIGZvcmNlIHRoaXMsIHN0b3AgdGhlIGN1cnJlbnQgYXNzb2NpYXRpb24gKERpc2Fzc29jaWF0ZSkgYW5kIAorICAgICAgICAgICAgLy8gdGhlbiByZSAnSm9pbicgdGhlIEFQLCB3aWhjaCB3aWxsIGZvcmNlIGFuIEF1dGhlbnRpY2F0aW9uICh3aXRoIHRoZSBuZXcgQXV0aCB0eXBlKSBmb2xsb3dlZCBieSAKKyAgICAgICAgICAgIC8vIGEgbmV3IEFzc29jaWF0aW9uLgorICAgICAgICAgICAgaWYoY3NySXNTYW1lUHJvZmlsZShwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUsIHBQcm9maWxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiAgZGV0ZWN0IHNhbWUgcHJvZmlsZSBhdXRoVHlwZSA9ICVkIGVuY3J5VHlwZSA9ICVkXG4iKSwgcFByb2ZpbGUtPkF1dGhUeXBlLCBwUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUpOworICAgICAgICAgICAgICAgIGlmKGNzclJvYW1Jc1NhbWVQcm9maWxlS2V5cyhwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUsIHBQcm9maWxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVSb2FtU3RhdGUgPSBlQ3NyUmVhc3NvY1RvU2VsZk5vQ2FwQ2hhbmdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0QnNzQ29uZmlnUGFyYW0gYnNzQ29uZmlnOworCisgICAgICAgICAgICAgICAgICAgIC8vVGhlIGtleSBjaGFuZ2VzCisgICAgICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJmJzc0NvbmZpZywgc2l6ZW9mKGJzc0NvbmZpZykpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJlcGFyZUJzc0NvbmZpZyhwTWFjLCBwUHJvZmlsZSwgcEJzc0Rlc2MsICZic3NDb25maWcsIHBJZXNMb2NhbCk7CisgICAgICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+YnNzUGFyYW1zLnVDZmdEb3QxMU1vZGUgPSBic3NDb25maWcudUNmZ0RvdDExTW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVhcHBseSB0aGUgY29uZmlnIGluY2x1ZGluZyBLZXlzIHNvIHJlYXNzb2MgaXMgaGFwcGVuaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbVNldEJzc0NvbmZpZ0NmZyhwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCBwQnNzRGVzYywgJmJzc0NvbmZpZywgcEllc0xvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlUm9hbVN0YXRlID0gZUNzclN0b3BSb2FtaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZVJvYW1TdGF0ZSA9IGVDc3JTdG9wUm9hbWluZzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vL3NhbWUgcHJvZmlsZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyUm9hbUlzc3VlRGlzYXNzb2NpYXRlKCBwTWFjLCBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfUkVRLCBGQUxTRSApKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiICBmYWlsIHRvIGlzc3VlIGRpc2Fzc29jaWF0ZVxuIikpOworICAgICAgICAgICAgICAgICAgICBlUm9hbVN0YXRlID0gZUNzclN0b3BSb2FtaW5nOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGU6ICB3ZSB1c2VkIHRvIHByZS1hdXRoIGhlcmUgd2l0aCBvcGVuIGF1dGhlbnRpY2F0aW9uIG5ldHdvcmtzIGJ1dCB0aGF0IHdhcyBub3Qgd29ya2luZyBzbyB3ZWxsLgorICAgICAgICAgICAgLy8gd2UgaGFkIGEgbG90IG9mIGpvaW4gdGltZW91dHMgd2hlbiB0ZXN0aW5nIGF0IFNhbXN1bmcuICByZW1vdmluZyB0aGlzIHN0ZXAgaGVscGVkIGFzc29jaWF0aW9ucyAKKyAgICAgICAgICAgIC8vIHdvcmsgbXVjaCBiZXR0ZXIuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHN0b3AgdGhlIGV4aXN0aW5nIG5ldHdvcmsgYmVmb3JlIGF0dGVtcHRpbmcgdG8gam9pbiB0aGUgbmV3IG5ldHdvcmsuLi4KKyAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGNzclJvYW1TdG9wTmV0d29yayhwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCBwQnNzRGVzYywgcEllc0xvY2FsKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZVJvYW1TdGF0ZSA9IGVDc3JTdG9wUm9hbWluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB9Ly9JbmZyYQorICAgIGVsc2UgCisgICAgeworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JSb2FtU3RvcE5ldHdvcmsocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgcEJzc0Rlc2MsIHBJZXNMb2NhbCkpKQorICAgICAgICB7CisgICAgICAgICAgICBlUm9hbVN0YXRlID0gZUNzclN0b3BSb2FtaW5nOworICAgICAgICB9CisgICAgfQorICAgICAgICBpZiggcEllc0xvY2FsICYmICFwU2NhblJlc3VsdC0+cHZJZXMgKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXNMb2NhbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oIGVSb2FtU3RhdGUgKTsKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1TaG91bGRSb2FtKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsIHRBTklfVTMyIHJvYW1JZCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdENzclJvYW1JbmZvIHJvYW1JbmZvOworCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcm9hbUluZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pKTsKKyAgICByb2FtSW5mby5wQnNzRGVzYyA9IHBCc3NEZXNjOworICAgIHN0YXR1cyA9IGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIHJvYW1JZCwgZUNTUl9ST0FNX1NIT1VMRF9ST0FNLCBlQ1NSX1JPQU1fUkVTVUxUX05PTkUpOworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLy9JbiBjYXNlIG5vIG1hdGNoaW5nIEJTUyBpcyBmb3VuZCwgdXNlIHdoYXRldmVyIGRlZmF1bHQgd2UgY2FuIGZpbmQKK3N0YXRpYyB2b2lkIGNzclJvYW1Bc3NpZ25EZWZhdWx0UGFyYW0oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICkKK3sKKyAgICAvL05lZWQgdG8gZ2V0IGFsbCBuZWdvdGlhdGVkIHR5cGVzIGluIHBsYWNlIGZpcnN0CisgICAgLy9hdXRoIHR5cGUKKyAgICBzd2l0Y2goIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuQXV0aFR5cGUuYXV0aFR5cGVbMF0gKSAvL1Rha2UgdGhlIHByZWZlcmVkIEF1dGggdHlwZS4KKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBOgorICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1dQQV9QU0s6CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBX05PTkU6CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU06CisgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS5uZWdvdGlhdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1NIQVJFRF9LRVk6CisgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS5uZWdvdGlhdGVkQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfQVVUT1NXSVRDSDoKKyAgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLm5lZ290aWF0ZWRBdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX0FVVE9TV0lUQ0g7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUubmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgPSAKKyAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdOyAKKyAgICAvL0luIHRoaXMgY2FzZSwgdGhlIG11bHRpY2FzdCBlbmNyeXB0aW9uIG5lZWRzIHRvIGZvbGxvdyB0aGUgdW5jYXN0IG9uZXMuCisgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS5uZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZSA9IAorICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF07Cit9CisKK3N0YXRpYyBlQ3NySm9pblN0YXRlIGNzclJvYW1Kb2luTmV4dEJzcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIHRBTklfQk9PTEVBTiBmVXNlU2FtZUJzcyApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdENzclNjYW5SZXN1bHQgKnBTY2FuUmVzdWx0ID0gTlVMTDsKKyAgICBlQ3NySm9pblN0YXRlIGVSb2FtU3RhdGUgPSBlQ3NyU3RvcFJvYW1pbmc7CisgICAgdFNjYW5SZXN1bHRMaXN0ICpwQlNTTGlzdCA9ICh0U2NhblJlc3VsdExpc3QgKilwQ29tbWFuZC0+dS5yb2FtQ21kLmhCU1NMaXN0OworICAgIHRBTklfQk9PTEVBTiBmRG9uZSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB0Q3NyUm9hbUluZm8gcm9hbUluZm8sICpwUm9hbUluZm8gPSBOVUxMOworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgICB2X1U4X3QgYWNtX21hc2sgPSAwOworI2VuZGlmIAorICAgIHRBTklfVTMyIHNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSA9ICZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlOworICAgIHRBTklfVTggIGNvbmN1cnJlbnRDaGFubmVsID0gMDsKKyAgICAKKyAgICBkbyAgCisgICAgeworICAgICAgICAvLyBDaGVjayBmb3IgQ2FyZGJ1cyBlamVjdCBjb25kaXRpb24sIGJlZm9yZSB0cnlpbmcgdG8gUm9hbSB0byBhbnkgQlNTCisgICAgICAgIC8vKioqaWYoICFiYWxJc0NhcmRQcmVzZW50KHBBZGFwdGVyKSApIGJyZWFrOworICAgICAgICAKKyAgICAgICAgaWYoTlVMTCAhPSBwQlNTTGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2hlbiBoYW5kbGluZyBBUCdzIGNhcGFiaWxpdHkgY2hhbmdlLCBjb250aW51ZSB0byBhc3NvY2lhdGUgdG8KKyAgICAgICAgICAgIC8vIHNhbWUgQlNTIGFuZCBtYWtlIHN1cmUgcFJvYW1Cc3NFbnRyeSBpcyBub3QgTnVsbC4KKyAgICAgICAgICAgIGlmKChlQU5JX0JPT0xFQU5fRkFMU0UgPT0gZlVzZVNhbWVCc3MpIHx8IChwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnkgPT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYocENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1RyeSB0aGUgZmlyc3QgQlNTCisgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucExhc3RSb2FtQnNzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5ID0gY3NyTExQZWVrSGVhZCgmcEJTU0xpc3QtPkxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5ID0gY3NyTExOZXh0KCZwQlNTTGlzdC0+TGlzdCwgcENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5LCBMTF9BQ0NFU1NfTE9DSyk7CisgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0RvbmUgd2l0aCBhbGwgdGhlIEJTU3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSW4gdGhpcyBjYXNlLCAgIHdpbGwgdGVsbCBIREQgdGhlIGNvbXBsZXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9XZSBuZWVkIHRvIGluZGljYXRlIHRvIEhERCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhpcyBvbmUuCisgICAgICAgICAgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbykpOworICAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8ucEJzc0Rlc2MgPSBwQ29tbWFuZC0+dS5yb2FtQ21kLnBMYXN0Um9hbUJzczsgICAgIC8vdGhpcyBzaGFsbCBub3QgYmUgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8uc3RhdHVzQ29kZSA9IHBTZXNzaW9uLT5qb2luRmFpbFN0YXR1c0NvZGUuc3RhdHVzQ29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLnJlYXNvbkNvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8gPSAmcm9hbUluZm87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUocENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXN1bHQgPSBHRVRfQkFTRV9BRERSKHBDb21tYW5kLT51LnJvYW1DbWQucFJvYW1Cc3NFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworCisgICAgICAgICAgICAgICAgICAgIC8qSWYgY29uY3VycmVuY3kgZW5hYmxlZCB0YWtlIHRoZSBjb25jdXJyZW50IGNvbm5lY3RlZCBjaGFubmVsIGZpcnN0LiAqLworICAgICAgICAgICAgICAgICAgICAvKiBWYWxpZCBtdWx0aWNoYW5uZWwgY29uY3VycmVudCBzZXNzaW9ucyBleGVtcHRlZCAqLworICAgICAgICAgICAgICAgICAgICBpZiAodm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZygpICYmICFjc3JJc1ZhbGlkTWNDb25jdXJyZW50U2Vzc2lvbihwTWFjLCBzZXNzaW9uSWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW50Q2hhbm5lbCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzckdldENvbmN1cnJlbnRPcGVyYXRpb25DaGFubmVsKHBNYWMpOworICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAiJXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjc3IgQ29uY3VycmVudCBDaGFubmVsID0gJWQiLCBfX0ZVTkNUSU9OX18sIGNvbmN1cnJlbnRDaGFubmVsKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjb25jdXJyZW50Q2hhbm5lbCkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jdXJyZW50Q2hhbm5lbCA9PSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5jaGFubmVsSWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbWFrZSB0aGlzIDAgYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWxvdyBjaGVjayB0byBwYXNzIGFzIHdlIGRvbid0IHdhbnQgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25uZWN0IG9uIG90aGVyIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIkNvbmN1cnJlbnQgY2hhbm5lbCBtYXRjaCA9JWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbnRDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW50Q2hhbm5lbCA9IDA7IAorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCh2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNzcklzQW55U2Vzc2lvbkluQ29ubmVjdFN0YXRlKCBwTWFjICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY29uY3VycmVuY3lFbmFibGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghY29uY3VycmVudENoYW5uZWwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKGNzclJvYW1TaG91bGRSb2FtKHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCAmcFNjYW5SZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9PayB0byByb2FtIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5ID0gY3NyTExOZXh0KCZwQlNTTGlzdC0+TGlzdCwgcENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5LCBMTF9BQ0NFU1NfTE9DSyk7CisgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0RvbmUgd2l0aCBhbGwgdGhlIEJTU3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGZEb25lID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihmRG9uZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL1dlIGhhdmUgc29tZXRoaW5nIHRvIHJvYW0sIHRlbGwgSEREIHdoZW4gaXQgaXMgaW5mcmEuCisgICAgICAgIC8vRm9yIElCU1MsIHRoZSBpbmRpY2F0aW9uIGdvZXMgYmFjayB0byBIREQgdmlhIGVDU1JfUk9BTV9JQlNTX0lORAorICAgICAgICAvL0ZvciBXRFMsIHRoZSBpbmRpY2F0aW9uIGlzIGVDU1JfUk9BTV9XRFNfSU5ECisgICAgICAgIGlmKCBDU1JfSVNfSU5GUkFTVFJVQ1RVUkUoIHBQcm9maWxlICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwUm9hbUluZm8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250LS07CisgICAgICAgICAgICAgICAgLy9Db21wbGV0ZSB0aGUgbGFzdCBhc3NvY2lhdGlvbiBhdHRlbXAgYmVjYXVzZSBhIG5ldyBvbmUgaXMgYWJvdXQgdG8gYmUgdHJpZWQKKyAgICAgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgcFJvYW1JbmZvLCBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfTk9UX0FTU09DSUFURUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcm9hbUluZm8sIHNpemVvZihyb2FtSW5mbykpOworICAgICAgICAgICAgaWYocFNjYW5SZXN1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllc0xvY2FsID0gKHREb3QxMWZCZWFjb25JRXMgKilwU2NhblJlc3VsdC0+UmVzdWx0LnB2SWVzOworCisgICAgICAgICAgICAgICAgaWYoICFwSWVzTG9jYWwgJiYgKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgJnBTY2FuUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvciwgJnBJZXNMb2NhbCkpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBjYW5ub3QgcGFyc2UgSUVzXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIGZEb25lID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIGVSb2FtU3RhdGUgPSBlQ3NyU3RvcFJvYW1pbmc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb2FtSW5mby5wQnNzRGVzYyA9ICZwU2NhblJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5wTGFzdFJvYW1Cc3MgPSByb2FtSW5mby5wQnNzRGVzYzsKKyAgICAgICAgICAgICAgICAvL05vIG5lZWQgdG8gcHV0IHVhcHNkX21hc2sgaW4gaWYgdGhlIEJTUyBkb2Vzbid0IHN1cHBvcnQgdUFQU0QKKyAgICAgICAgICAgICAgICBpZiggcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS51YXBzZF9tYXNrICYmCisgICAgICAgICAgICAgICAgICAgIENTUl9JU19RT1NfQlNTKHBJZXNMb2NhbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgQ1NSX0lTX1VBUFNEX0JTUyhwSWVzTG9jYWwpICkKKyAgICAgICAgICAgICAgICB7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorCisgICAgICAgICAgICAgICAgICAgIGFjbV9tYXNrID0gc21lX1Fvc0dldEFDTU1hc2socE1hYywgJnBTY2FuUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgcEllc0xvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS51YXBzZF9tYXNrICY9IH4oYWNtX21hc2spOworI2VuZGlmIC8qIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVCovCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS51YXBzZF9tYXNrID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHBJZXNMb2NhbCAmJiAhcFNjYW5SZXN1bHQtPlJlc3VsdC5wdkllcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEllc0xvY2FsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS51YXBzZF9tYXNrID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvYW1JbmZvLnBQcm9maWxlID0gcFByb2ZpbGU7CisgICAgICAgICAgICBwU2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQrKzsKKyAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2soIHBNYWMsIHNlc3Npb25JZCwgJnJvYW1JbmZvLCBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fU1RBUlQsIGVDU1JfUk9BTV9SRVNVTFRfTk9ORSApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBOVUxMID09IHBDb21tYW5kLT51LnJvYW1DbWQucFJvYW1Cc3NFbnRyeSApIAorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3RhcnQgSUJTUyBwcm9maWxlLCB0aGVuIHdlIG5lZWQgdG8gc3RhcnQgdGhlIElCU1MuCisgICAgICAgICAgICBpZiAoIENTUl9JU19TVEFSVF9JQlNTKHBQcm9maWxlKSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRBTklfQk9PTEVBTiBmU2FtZUlic3MgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHN0YXJ0IHRoaXMgSUJTUy4uLgorICAgICAgICAgICAgICAgIGNzclJvYW1Bc3NpZ25EZWZhdWx0UGFyYW0oIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbVN0YXJ0SWJzcyggcE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgJmZTYW1lSWJzcyApOworICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBmU2FtZUlic3MgKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZVJvYW1TdGF0ZSA9IGVDc3JTdGFydElic3NTYW1lSWJzczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVSb2FtU3RhdGUgPSBlQ3NyQ29udGludWVSb2FtaW5nOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vaXQgc29tZWhvdyBmYWlsIG5lZWQgdG8gc3RvcAorICAgICAgICAgICAgICAgICAgICBlUm9hbVN0YXRlID0gZUNzclN0b3BSb2FtaW5nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoQ1NSX0lTX1dEU19BUChwUHJvZmlsZSkpCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgIHx8IChDU1JfSVNfSU5GUkFfQVAocFByb2ZpbGUpKQorI2VuZGlmCisgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBzdGFydCB0aGlzIFdEUy4uLgorICAgICAgICAgICAgICAgIGNzclJvYW1Bc3NpZ25EZWZhdWx0UGFyYW0oIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgLyogRm9yIEFQIFdEUywgd2UgZG9udCBoYXZlIGFueSBCU1NEZXNjcmlwdGlvbiAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1TdGFydFdkcyggcE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgTlVMTCApOworICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZVJvYW1TdGF0ZSA9IGVDc3JDb250aW51ZVJvYW1pbmc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2l0IHNvbWVob3cgZmFpbCBuZWVkIHRvIHN0b3AKKyAgICAgICAgICAgICAgICAgICAgZVJvYW1TdGF0ZSA9IGVDc3JTdG9wUm9hbWluZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vTm90aGluZyB3ZSBjYW4gZG8KKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoImNhbm5vdCBjb250aW51ZSB3aXRob3V0IEJTUyBsaXN0XG4iKSk7CisgICAgICAgICAgICAgICAgZVJvYW1TdGF0ZSA9IGVDc3JTdG9wUm9hbWluZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSAvL1dlIGhhdmUgQlNTIAorICAgICAgICB7CisgICAgICAgICAgICAvL05lZWQgdG8gYXNzaWduIHRoZXNlIHZhbHVlIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBpbiBjc3JJc1NhbWVQcm9maWxlCisgICAgICAgICAgICBwU2NhblJlc3VsdCA9IEdFVF9CQVNFX0FERFIocENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5LCB0Q3NyU2NhblJlc3VsdCwgTGluayk7CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlID0gcFNjYW5SZXN1bHQtPnVjRW5jcnlwdGlvblR5cGU7IC8vTmVnb3RpYXRlZCB3aGlsZSBidWlsZGluZyBzY2FuIHJlc3VsdC4KKyAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUubmVnb3RpYXRlZE1DRW5jcnlwdGlvblR5cGUgPSBwU2NhblJlc3VsdC0+bWNFbmNyeXB0aW9uVHlwZTsKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUubmVnb3RpYXRlZEF1dGhUeXBlID0gcFNjYW5SZXN1bHQtPmF1dGhUeXBlOworICAgICAgICAgICAgaWYgKCBDU1JfSVNfU1RBUlRfSUJTUygmcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGNzcklzU2FtZVByb2ZpbGUocE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLCBwUHJvZmlsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlUm9hbVN0YXRlID0gZUNzclN0YXJ0SWJzc1NhbWVJYnNzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHBDb21tYW5kLT51LnJvYW1DbWQuZlJlYXNzb2NUb1NlbGZOb0NhcENoYW5nZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy90cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgb25lIGFscmVhZHkgY29ubmVjdGVkCisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5mUmVhc3NvY1RvU2VsZk5vQ2FwQ2hhbmdlID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgIGVSb2FtU3RhdGUgPSBlQ3NyUmVhc3NvY1RvU2VsZk5vQ2FwQ2hhbmdlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBKb2luIHRoaXMgQnNzLi4uCisgICAgICAgICAgICBlUm9hbVN0YXRlID0gY3NyUm9hbUpvaW4oIHBNYWMsIHNlc3Npb25JZCwgJnBTY2FuUmVzdWx0LT5SZXN1bHQsIHBQcm9maWxlICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICBpZiggKGVDc3JTdG9wUm9hbWluZyA9PSBlUm9hbVN0YXRlKSAmJiAoQ1NSX0lTX0lORlJBU1RSVUNUVVJFKCBwUHJvZmlsZSApKSApCisgICAgeworICAgICAgICAvL05lZWQgdG8gaW5kaWNhdGUgYXNzb2NpYXRpb25fY29tcGxldGlvbiBpZiBhc3NvY2lhdGlvbl9zdGFydCBoYXMgYmVlbiBkb25lCisgICAgICAgIGlmKHBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudC0tOworICAgICAgICAgICAgLy9Db21wbGV0ZSB0aGUgbGFzdCBhc3NvY2lhdGlvbiBhdHRlbXAgYmVjYXVzZSBhIG5ldyBvbmUgaXMgYWJvdXQgdG8gYmUgdHJpZWQKKyAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fQ09NUExFVElPTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9OT1RfQVNTT0NJQVRFRCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oIGVSb2FtU3RhdGUgKTsKK30KKworCitzdGF0aWMgZUhhbFN0YXR1cyBjc3JSb2FtKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIGVDc3JKb2luU3RhdGUgUm9hbVN0YXRlOworICAgIHRBTklfVTMyIHNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisgICAgCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJpcyBjYWxsZWRcbiIpKTsKKyAgICAvLyoqKmlmKCBoZGRJc1JhZGlvU3RhdGVPbiggcEFkYXB0ZXIgKSApCisgICAgeworICAgICAgICAvLyBBdHRlcHQgdG8gam9pbiBhIEJzcy4uLgorICAgICAgICBSb2FtU3RhdGUgPSBjc3JSb2FtSm9pbk5leHRCc3MoIHBNYWMsIHBDb21tYW5kLCBlQU5JX0JPT0xFQU5fRkFMU0UgKTsKKyAgICAKKyAgICAgICAgLy8gaWYgbm90aGluZyB0byBqb2luLi4KKyAgICAgICAgaWYgKCBlQ3NyU3RvcFJvYW1pbmcgPT0gUm9hbVN0YXRlICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfQk9PTEVBTiBmQ29tcGxldGUgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICAgICAgICAgIC8vIGFuZCBpZiBjb25uZWN0ZWQgaW4gSW5mcmFzdHJ1Y3R1cmUgbW9kZS4uLgorICAgICAgICAgICAgaWYgKCBjc3JJc0Nvbm5TdGF0ZUluZnJhKHBNYWMsIHNlc3Npb25JZCkgKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLy4uLiB0aGVuIHdlIG5lZWQgdG8gaXNzdWUgYSBkaXNhc3NvY2lhdGlvbgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZURpc2Fzc29jaWF0ZSggcE1hYywgc2Vzc2lvbklkLCBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfTk9USElOR19UT19KT0lOLCBGQUxTRSApOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiICBmYWlsZWQgdG8gaXNzdWUgZGlzYXNzb2NpYXRlLCBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIC8vcm9hbSBjb21tYW5kIGlzIGNvbXBsZXRlZCBieSBjYWxsZXIgaW4gdGhlIGZhaWxlZCBjYXNlCisgICAgICAgICAgICAgICAgICAgIGZDb21wbGV0ZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIGNzcklzQ29ublN0YXRlSWJzcyhwTWFjLCBzZXNzaW9uSWQpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVTdG9wQnNzKCBwTWFjLCBzZXNzaW9uSWQsIGVDU1JfUk9BTV9TVUJTVEFURV9TVE9QX0JTU19SRVEgKTsKKyAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiAgZmFpbGVkIHRvIGlzc3VlIHN0b3AgYnNzLCBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIC8vcm9hbSBjb21tYW5kIGlzIGNvbXBsZXRlZCBieSBjYWxsZXIgaW4gdGhlIGZhaWxlZCBjYXNlCisgICAgICAgICAgICAgICAgICAgIGZDb21wbGV0ZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICBlbHNlIGlmIChjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZEluZnJhQXAocE1hYywgc2Vzc2lvbklkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVTdG9wQnNzKCBwTWFjLCBzZXNzaW9uSWQsIGVDU1JfUk9BTV9TVUJTVEFURV9TVE9QX0JTU19SRVEgKTsKKyAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiAgZmFpbGVkIHRvIGlzc3VlIHN0b3AgYnNzLCBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIC8vcm9hbSBjb21tYW5kIGlzIGNvbXBsZXRlZCBieSBjYWxsZXIgaW4gdGhlIGZhaWxlZCBjYXNlCisgICAgICAgICAgICAgICAgICAgIGZDb21wbGV0ZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgCisgICAgICAgICAgICAgICAgZkNvbXBsZXRlID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihmQ29tcGxldGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvLyAuLi4gb3RoZXJ3aXNlLCB3ZSBjYW4gY29tcGxldGUgdGhlIFJvYW0gY29tbWFuZCBoZXJlLgorICAgICAgICAgICAgICAgY3NyUm9hbUNvbXBsZXRlKCBwTWFjLCBlQ3NyTm90aGluZ1RvSm9pbiwgTlVMTCApOworICAgICAgICAgICAgfSAgICAKKyAgICAgICB9CisgICAgICAgZWxzZSBpZiAoIGVDc3JSZWFzc29jVG9TZWxmTm9DYXBDaGFuZ2UgPT0gUm9hbVN0YXRlICkKKyAgICAgICB7CisgICAgICAgICAgIGNzclJvYW1Db21wbGV0ZSggcE1hYywgZUNzclNpbGVudGx5U3RvcFJvYW1pbmdTYXZlU3RhdGUsIE5VTEwgKTsKKyAgICAgICB9CisgICAgICAgZWxzZSBpZiAoIGVDc3JTdGFydElic3NTYW1lSWJzcyA9PSBSb2FtU3RhdGUgKQorICAgICAgIHsKKyAgICAgICAgICAgY3NyUm9hbUNvbXBsZXRlKCBwTWFjLCBlQ3NyU2lsZW50bHlTdG9wUm9hbWluZywgTlVMTCApOyAgICAgICAgCisgICAgICAgfQorICAgIH0vL2hkZElzUmFkaW9TdGF0ZU9uCisgICAgCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworZUhhbFN0YXR1cyBjc3JQcm9jZXNzRlRSZWFzc29jUm9hbUNvbW1hbmQgKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCApCit7CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisgICAgdENzclNjYW5SZXN1bHQgKnBTY2FuUmVzdWx0ID0gTlVMTDsKKyAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjID0gTlVMTDsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBzZXNzaW9uSWQgPSBwQ29tbWFuZC0+c2Vzc2lvbklkOworICAgIHBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKworICAgIGlmKENTUl9JU19ST0FNSU5HKHBTZXNzaW9uKSAmJiBwU2Vzc2lvbi0+ZkNhbmNlbFJvYW1pbmcpCisgICAgeworICAgICAgICAvL3RoZSByb2FtaW5nIGlzIGNhbmNlbGxlZC4gU2ltcGx5IGNvbXBsZXRlIHRoZSBjb21tYW5kCisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgiICBSb2FtIGNvbW1hbmQgY2FuY2VsbGVkXG4iKSk7CisgICAgICAgIGNzclJvYW1Db21wbGV0ZShwTWFjLCBlQ3NyTm90aGluZ1RvSm9pbiwgTlVMTCk7IAorICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAocENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5KQorICAgIHsKKyAgICAgICAgcFNjYW5SZXN1bHQgPSBHRVRfQkFTRV9BRERSKHBDb21tYW5kLT51LnJvYW1DbWQucFJvYW1Cc3NFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworICAgICAgICBwQnNzRGVzYyA9ICZwU2NhblJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vdGhlIHJvYW1pbmcgaXMgY2FuY2VsbGVkLiBTaW1wbHkgY29tcGxldGUgdGhlIGNvbW1hbmQKKyAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsIEZMKCIgIFJvYW0gY29tbWFuZCBjYW5jZWxsZWRcbiIpKTsKKyAgICAgICAgY3NyUm9hbUNvbXBsZXRlKHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMKTsgCisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZVJlYXNzb2NpYXRlKHBNYWMsIHNlc3Npb25JZCwgcEJzc0Rlc2MsIAorICAgICAgICAodERvdDExZkJlYWNvbklFcyAqKSggcFNjYW5SZXN1bHQtPlJlc3VsdC5wdkllcyApLCAmcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1Qcm9jZXNzQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0Q3NyUm9hbUluZm8gcm9hbUluZm87CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAKKyAgICBzd2l0Y2ggKCBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gKQorICAgIHsKKyAgICBjYXNlIGVDc3JGb3JjZWREaXNhc3NvYzoKKyAgICAgICAgY3NyRnJlZVJvYW1Qcm9maWxlKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Qcm9jZXNzRGlzYXNzb2NEZWF1dGgoIHBNYWMsIHBDb21tYW5kLCBUUlVFLCBGQUxTRSApOworICAgICAgICBicmVhazsKKworICAgICBjYXNlIGVDc3JTbWVJc3N1ZWREaXNhc3NvY0ZvckhhbmRvZmY6CisgICAgICAgIC8vTm90IHRvIGZyZWUgcE1hYy0+cm9hbS5wQ3VyUm9hbVByb2ZpbGUgKHZpYSBjc3JGcmVlUm9hbVByb2ZpbGUpIGJlY2F1c2UgaXQgaXMgbmVlZGVkIGFmdGVyIGRpc2Nvbm5lY3QKKyNpZiAwIC8vIFRPRE8gOiBDb25maXJtIHRoaXMgY2hhbmdlCisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Qcm9jZXNzRGlzYXNzb2NpYXRlKCBwTWFjLCBwQ29tbWFuZCwgRkFMU0UgKTsKKyNlbHNlCisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Qcm9jZXNzRGlzYXNzb2NEZWF1dGgoIHBNYWMsIHBDb21tYW5kLCBUUlVFLCBGQUxTRSApOworI2VuZGlmCisKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVDc3JGb3JjZWREaXNhc3NvY01JQ0ZhaWx1cmU6CisgICAgICAgIGNzckZyZWVSb2FtUHJvZmlsZShwTWFjLCBzZXNzaW9uSWQpOworICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJvY2Vzc0Rpc2Fzc29jRGVhdXRoKCBwTWFjLCBwQ29tbWFuZCwgVFJVRSwgVFJVRSApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgZUNzckZvcmNlZERlYXV0aDoKKyAgICAgICAgY3NyRnJlZVJvYW1Qcm9maWxlKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Qcm9jZXNzRGlzYXNzb2NEZWF1dGgoIHBNYWMsIHBDb21tYW5kLCBGQUxTRSwgRkFMU0UgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVDc3JIZGRJc3N1ZWRSZWFzc29jVG9TYW1lQVA6CisgICAgY2FzZSBlQ3NyU21lSXNzdWVkUmVhc3NvY1RvU2FtZUFQOgorICAgIHsKKyAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcyA9IE5VTEw7CisKKworICAgICAgICBpZiggcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MsICZwSWVzKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgIGZhaWwgdG8gcGFyc2UgSUVzXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9hbUluZm8ucmVhc29uQ29kZSA9IGVDc3JSb2FtUmVhc29uU3RhQ2FwYWJpbGl0eUNoYW5nZWQ7CisgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBwU2Vzc2lvbi0+c2Vzc2lvbklkLCAmcm9hbUluZm8sIDAsIGVDU1JfUk9BTV9ST0FNSU5HX1NUQVJULCBlQ1NSX1JPQU1fUkVTVUxUX05PTkUpOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5yb2FtaW5nUmVhc29uID0gZUNzclJlYXNzb2NSb2FtaW5nOworCisgICAgICAgICAgICAgICAgcm9hbUluZm8ucEJzc0Rlc2MgPSBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjOworICAgICAgICAgICAgICAgIHJvYW1JbmZvLnBQcm9maWxlID0gJnBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGU7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250Kys7CisgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayggcE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fU1RBUlQsIGVDU1JfUk9BTV9SRVNVTFRfTk9ORSApOworICAgCisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsIEZMKCIgIGNhbGxpbmcgY3NyUm9hbUlzc3VlUmVhc3NvY2lhdGVcbiIpKTsKKyAgICAgICAgICAgICAgICBjc3JSb2FtSXNzdWVSZWFzc29jaWF0ZSggcE1hYywgc2Vzc2lvbklkLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLCBwSWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSApOworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEllcyk7CisgICAgICAgICAgICAgICAgcEllcyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBlQ3NyQ2Fwc0NoYW5nZToKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJyZWNlaXZlZCBlQ3NyQ2Fwc0NoYW5nZSBcbiIpKTsKKyAgICAgICAgY3NyUm9hbVN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTklORywgc2Vzc2lvbklkICk7CisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZURpc2Fzc29jaWF0ZSggcE1hYywgc2Vzc2lvbklkLCBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQ09OTkVDVF9DT05USU5VRV9ST0FNSU5HLCBGQUxTRSk7IAorICAgICAgICBicmVhazsKKworICAgIGNhc2UgZUNzclNtZUlzc3VlZEZUUmVhc3NvYzoKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJyZWNlaXZlZCBGVCBSZWFzc29jIFJlcSBcbiIpKTsKKyAgICAgICAgc3RhdHVzID0gY3NyUHJvY2Vzc0ZUUmVhc3NvY1JvYW1Db21tYW5kKHBNYWMsIHBDb21tYW5kKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ3NyU3RvcEJzczoKKyAgICAgICBjc3JSb2FtU3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HLCBzZXNzaW9uSWQpOworICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZVN0b3BCc3MoIHBNYWMsIHNlc3Npb25JZCwgZUNTUl9ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUSApOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSBlQ3NyRm9yY2VkRGlzYXNzb2NTdGE6CisgICAgICAgY3NyUm9hbVN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTklORywgc2Vzc2lvbklkKTsKKyAgICAgICBjc3JSb2FtU3Vic3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRVEsIHNlc3Npb25JZCk7CisgICAgICAgc3RhdHVzID0gY3NyU2VuZE1CRGlzYXNzb2NSZXFNc2coIHBNYWMsIHNlc3Npb25JZCwgcENvbW1hbmQtPnUucm9hbUNtZC5wZWVyTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucmVhc29uKTsKKyAgICAgICBicmVhazsKKworICAgIGNhc2UgZUNzckZvcmNlZERlYXV0aFN0YToKKyAgICAgICBjc3JSb2FtU3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HLCBzZXNzaW9uSWQpOworICAgICAgIGNzclJvYW1TdWJzdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX0RFQVVUSF9SRVEsIHNlc3Npb25JZCk7CisgICAgICAgc3RhdHVzID0gY3NyU2VuZE1CRGVhdXRoUmVxTXNnKCBwTWFjLCBzZXNzaW9uSWQsIHBDb21tYW5kLT51LnJvYW1DbWQucGVlck1hYywgCisgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJlYXNvbik7CisgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBjc3JSb2FtU3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HLCBzZXNzaW9uSWQgKTsKKworICAgICAgICBpZiggcENvbW1hbmQtPnUucm9hbUNtZC5mVXBkYXRlQ3VyUm9hbVByb2ZpbGUgKQorICAgICAgICB7CisgICAgICAgICAgICAvL1JlbWVtYmVyIHRoZSByb2FtaW5nIHByb2ZpbGUgCisgICAgICAgICAgICBjc3JGcmVlUm9hbVByb2ZpbGUocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSwgc2l6ZW9mKHRDc3JSb2FtUHJvZmlsZSkpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUsIHNpemVvZih0Q3NyUm9hbVByb2ZpbGUpKTsKKyAgICAgICAgICAgICAgICBjc3JSb2FtQ29weVByb2ZpbGUocE1hYywgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSwgJnBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgCisgICAgICAgIC8vQXQgdGhpcyBwb2ludCwgb3JpZ2luYWwgdWFwc2RfbWFzayBpcyBzYXZlZCBpbiBwQ3VyUm9hbVByb2ZpbGUKKyAgICAgICAgLy91YXBzZF9tYXNrIGluIHRoZSBwQ29tbWFuZCBtYXkgY2hhbmdlIGZyb20gdGhpcyBwb2ludCBvbi4KKyAKKyAgICAgICAgLy8gQXR0ZW1wdCB0byByb2FtIHdpdGggdGhlIG5ldyBzY2FuIHJlc3VsdHMgKGlmIHdlIG5lZWQgdG8uLikKKyAgICAgICAgc3RhdHVzID0gY3NyUm9hbSggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK3ZvaWQgY3NyUmVpbml0Um9hbUNtZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCkgCit7CisgICAgaWYocENvbW1hbmQtPnUucm9hbUNtZC5mUmVsZWFzZUJzc0xpc3QpCisgICAgeworICAgICAgICBjc3JTY2FuUmVzdWx0UHVyZ2UocE1hYywgcENvbW1hbmQtPnUucm9hbUNtZC5oQlNTTGlzdCk7CisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VCc3NMaXN0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLmhCU1NMaXN0ID0gQ1NSX0lOVkFMSURfU0NBTlJFU1VMVF9IQU5ETEU7CisgICAgfQorICAgIGlmKHBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VQcm9maWxlKQorICAgIHsKKyAgICAgICAgY3NyUmVsZWFzZVByb2ZpbGUocE1hYywgJnBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUpOworICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLmZSZWxlYXNlUHJvZmlsZSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB9CisgICAgcENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5ID0gTlVMTDsKKyAgICAvL0JlY2F1c2UgdS5yb2FtQ21kIGlzIHVuaW9uIGFuZCBzaGFyZSB3aXRoIHNjYW5DbWQgYW5kIFN0YXR1c0NoYW5nZQorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBDb21tYW5kLT51LnJvYW1DbWQsIHNpemVvZih0Um9hbUNtZCkpOworfQorCisKK3ZvaWQgY3NyUmVpbml0V21TdGF0dXNDaGFuZ2VDbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcENvbW1hbmQtPnUud21TdGF0dXNDaGFuZ2VDbWQsIHNpemVvZih0V21TdGF0dXNDaGFuZ2VDbWQpKTsKK30KKwordm9pZCBjc3JSb2FtQ29tcGxldGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVDc3JSb2FtQ29tcGxldGVSZXN1bHQgUmVzdWx0LCB2b2lkICpDb250ZXh0ICkKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0U21lQ21kICpwQ29tbWFuZDsKKyAgICB0QU5JX0JPT0xFQU4gZlJlbGVhc2VDb21tYW5kID0gZUFOSV9CT09MRUFOX1RSVUU7CisKKyAgICBzbXNMb2coIHBNYWMsIExPRzIsICJyb2FtUTogUm9hbSBDb21wbGV0aW9uIC4uLlxuIiApOworCisgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyApOworICAgIGlmICggcEVudHJ5ICkKKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisKKyAgICAgICAgLy8gSWYgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGlzIEFjdGl2ZSBhbmQgaXQgaXMgYSBST0FNIGNvbW1hbmQsIHJlbW92ZQorICAgICAgICAvLyBhbmQgcHV0IHRoaXMgb24gdGhlIEZyZWUgcXVldWUuCisgICAgICAgIGlmICggZVNtZUNvbW1hbmRSb2FtID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgLy93ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHJlc3VsdCBmaXJzdCBiZWZvcmUgcmVtb3ZpbmcgaXQgZnJvbSBhY3RpdmUgbGlzdCBiZWNhdXNlIHN0YXRlIGNoYW5nZXMgCisgICAgICAgICAgICAvL3N0aWxsIGhhcHBlbmluZyBpbnNpZGVzIHJvYW1RUHJvY2Vzc1JvYW1SZXN1bHRzIHNvIG5vIG90aGVyIHJvYW0gY29tbWFuZCBzaG91bGQgYmUgaXNzdWVkCisgICAgICAgICAgICBmUmVsZWFzZUNvbW1hbmQgPSBjc3JSb2FtUHJvY2Vzc1Jlc3VsdHMoIHBNYWMsIHBDb21tYW5kLCBSZXN1bHQsIENvbnRleHQgKTsKKyAgICAgICAgICAgIGlmKCBmUmVsZWFzZUNvbW1hbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0sgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZFJvYW0oIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIiAqKioqKioqKioqY3NyUm9hbUNvbXBsZXRlIGZhaWwgdG8gcmVsZWFzZSBjb21tYW5kIHJlYXNvbiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICIgKioqKioqKioqKmNzclJvYW1Db21wbGV0ZSBmYWlsIHRvIHJlbGVhc2UgY29tbWFuZCByZWFzb24gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiQ1NSOiBSb2FtIENvbXBsZXRpb24gY2FsbGVkIGJ1dCBST0FNIGNvbW1hbmQgaXMgbm90IEFDVElWRSAuLi5cbiIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICJDU1I6IFJvYW0gQ29tcGxldGlvbiBjYWxsZWQgYnV0IE5PIGNvbW1hbmRzIGFyZSBBQ1RJVkUgLi4uXG4iICk7CisgICAgfQorCisgICAgaWYoIGZSZWxlYXNlQ29tbWFuZCApCisgICAgeworICAgICAgICBzbWVQcm9jZXNzUGVuZGluZ1F1ZXVlKCBwTWFjICk7CisgICAgfQorfQorCisKK3ZvaWQgY3NyUmVzZXRQTUtJRENhbmRpZGF0ZUxpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApCit7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAmKHBTZXNzaW9uLT5QbWtpZENhbmRpZGF0ZUluZm9bMF0pLCBzaXplb2YodFBta2lkQ2FuZGlkYXRlSW5mbykgKiBDU1JfTUFYX1BNS0lEX0FMTE9XRUQgKTsKKyAgICBwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUgPSAwOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKK3ZvaWQgY3NyUmVzZXRCS0lEQ2FuZGlkYXRlTGlzdCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICkKK3sKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAmKHBTZXNzaW9uLT5Ca2lkQ2FuZGlkYXRlSW5mb1swXSksIHNpemVvZih0QmtpZENhbmRpZGF0ZUluZm8pICogQ1NSX01BWF9CS0lEX0FMTE9XRUQgKTsKKyAgICBwU2Vzc2lvbi0+TnVtQmtpZENhbmRpZGF0ZSA9IDA7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKworZXh0ZXJuIHRBTklfVTggY3NyV3BhT3VpW11bIENTUl9XUEFfT1VJX1NJWkUgXTsKKworCisKK3N0YXRpYyBlSGFsU3RhdHVzIGNzclJvYW1TYXZlU2VjdXJpdHlSc3BJRSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIGVDc3JBdXRoVHlwZSBhdXRoVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXNMb2NhbCA9IHBJZXM7CisKKyAgICBpZigoZUNTUl9BVVRIX1RZUEVfV1BBID09IGF1dGhUeXBlKSB8fAorICAgICAgICAoZUNTUl9BVVRIX1RZUEVfV1BBX1BTSyA9PSBhdXRoVHlwZSkgfHwKKyAgICAgICAgKGVDU1JfQVVUSF9UWVBFX1JTTiA9PSBhdXRoVHlwZSkgfHwKKyAgICAgICAgKGVDU1JfQVVUSF9UWVBFX1JTTl9QU0sgPT0gYXV0aFR5cGUpCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgfHwKKyAgICAgICAoZUNTUl9BVVRIX1RZUEVfRlRfUlNOID09IGF1dGhUeXBlKSB8fAorICAgICAgIChlQ1NSX0FVVEhfVFlQRV9GVF9SU05fUFNLID09IGF1dGhUeXBlKQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkgCisgICAgICB8fAorICAgICAgIChlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9QU0sgPT0gYXV0aFR5cGUpIHx8CisgICAgICAgKGVDU1JfQVVUSF9UWVBFX1dBUElfV0FJX0NFUlRJRklDQVRFID09IGF1dGhUeXBlKQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisgICAgICAgICkKKyAgICB7CisKKyAgICAgICAgaWYoICFwSWVzTG9jYWwgJiYgKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgcFNpckJzc0Rlc2MsICZwSWVzTG9jYWwpKSkgKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBjYW5ub3QgcGFyc2UgSUVzXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIHBJZXNMb2NhbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTMyIG5JZUxlbjsKKyAgICAgICAgICAgIHRBTklfVTggKnBJZUJ1ZjsKKworICAgICAgICAgICAgaWYoKGVDU1JfQVVUSF9UWVBFX1JTTiA9PSBhdXRoVHlwZSkgfHwKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgICAgICAgICAgKGVDU1JfQVVUSF9UWVBFX0ZUX1JTTiA9PSBhdXRoVHlwZSkgfHwKKyAgICAgICAgICAgICAgICAoZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSyA9PSBhdXRoVHlwZSkgfHwKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworICAgICAgICAgICAgICAgIChlQ1NSX0FVVEhfVFlQRV9SU05fUFNLID09IGF1dGhUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwSWVzTG9jYWwtPlJTTi5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DYWxjdWxhdGUgdGhlIGFjdHVhbCBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgbkllTGVuID0gOCAvL3ZlcnNpb24gKyBncF9jaXBoZXJfc3VpdGUgKyBwd2lzZV9jaXBoZXJfc3VpdGVfY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcEllc0xvY2FsLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ICogNCAgICAvL3B3aXNlX2NpcGhlcl9zdWl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgMiAvL2FrbV9zdWl0ZV9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgKyBwSWVzTG9jYWwtPlJTTi5ha21fc3VpdGVfY291bnQgKiA0IC8vYWttX3N1aXRlcworICAgICAgICAgICAgICAgICAgICAgICAgKyAyOyAvL3Jlc2VydmVkCisgICAgICAgICAgICAgICAgICAgIGlmKCBwSWVzTG9jYWwtPlJTTi5wbWtpZF9jb3VudCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5JZUxlbiArPSAyICsgcEllc0xvY2FsLT5SU04ucG1raWRfY291bnQgKiA0OyAgLy9wbWtpZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vbkllTGVuIGRvZXNuJ3QgY291bnQgRUlEIGFuZCBsZW5ndGggZmllbGRzCisgICAgICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUygoc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTZXNzaW9uLT5wV3BhUnNuUnNwSUUsIG5JZUxlbiArIDIpKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wV3BhUnNuUnNwSUVbMF0gPSBET1QxMUZfRUlEX1JTTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wV3BhUnNuUnNwSUVbMV0gPSAodEFOSV9VOCluSWVMZW47CisgICAgICAgICAgICAgICAgICAgICAgICAvL2NvcHkgdXB0byBha21fc3VpdGVzCisgICAgICAgICAgICAgICAgICAgICAgICBwSWVCdWYgPSBwU2Vzc2lvbi0+cFdwYVJzblJzcElFICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcEllQnVmLCAmcEllc0xvY2FsLT5SU04udmVyc2lvbiwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwSWVCdWYgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwSWVzTG9jYWwtPlJTTi5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29weSBwd2lzZV9jaXBoZXJfc3VpdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwSWVCdWYsIHBJZXNMb2NhbC0+UlNOLnB3aXNlX2NpcGhlcl9zdWl0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVzTG9jYWwtPlJTTi5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKiA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVCdWYgKz0gcEllc0xvY2FsLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ICogNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcEllQnVmLCAmcEllc0xvY2FsLT5SU04uYWttX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJZUJ1ZiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBJZXNMb2NhbC0+UlNOLmFrbV9zdWl0ZV9jb3VudCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb3B5IGFrbV9zdWl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBJZUJ1ZiwgcEllc0xvY2FsLT5SU04uYWttX3N1aXRlcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZXNMb2NhbC0+UlNOLmFrbV9zdWl0ZV9jb3VudCAqIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZUJ1ZiArPSBwSWVzTG9jYWwtPlJTTi5ha21fc3VpdGVfY291bnQgKiA0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9jb3B5IHRoZSByZXN0CisgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBJZUJ1ZiwgcEllc0xvY2FsLT5SU04uYWttX3N1aXRlcyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZXNMb2NhbC0+UlNOLmFrbV9zdWl0ZV9jb3VudCAqIDQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKyBwSWVzTG9jYWwtPlJTTi5wbWtpZF9jb3VudCAqIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPm5XcGFSc25Sc3BJZUxlbmd0aCA9IG5JZUxlbiArIDI7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigoZUNTUl9BVVRIX1RZUEVfV1BBID09IGF1dGhUeXBlKSB8fAorICAgICAgICAgICAgICAgIChlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLID09IGF1dGhUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwSWVzTG9jYWwtPldQQS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DYWxjdWxhdGUgdGhlIGFjdHVhbCBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgbkllTGVuID0gMTIgLy9PVUkgKyB2ZXJzaW9uICsgbXVsdGljYXN0X2NpcGhlciArIHVuaWNhc3RfY2lwaGVyX2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICArIHBJZXNMb2NhbC0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50ICogNCAgICAvL3VuaWNhc3RfY2lwaGVycworICAgICAgICAgICAgICAgICAgICAgICAgKyAyIC8vYXV0aF9zdWl0ZV9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgKyBwSWVzTG9jYWwtPldQQS5hdXRoX3N1aXRlX2NvdW50ICogNDsgLy9hdXRoX3N1aXRlcworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgV1BBIGNhcGFiaWxpdGllcyBmb2xsb3dzIHRoZSBBdXRoIFN1aXRlICh0d28gb2N0ZWN0cyktLQorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIG9wdGlvbmFsLCBhbmQgd2UgYWx3YXlzICJzZW5kIiB6ZXJvLCBzbyBqdXN0CisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpdC4gIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIG91ciBhc3N1bXB0aW9ucyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIGNvbXBpbGVyOyBjLmYuIGJ1ZyAxNTIzNDoKKyAgICAgICAgICAgICAgICAgICAgLy9uSWVMZW4gZG9lc24ndCBjb3VudCBFSUQgYW5kIGxlbmd0aCBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKChzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNlc3Npb24tPnBXcGFSc25Sc3BJRSwgbkllTGVuICsgMikpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBXcGFSc25Sc3BJRVswXSA9IERPVDExRl9FSURfV1BBOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBXcGFSc25Sc3BJRVsxXSA9ICh0QU5JX1U4KW5JZUxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJZUJ1ZiA9IHBTZXNzaW9uLT5wV3BhUnNuUnNwSUUgKyAyOworICAgICAgICAgICAgICAgICAgICAgICAgLy9Db3B5IFdQQSBPVUkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcEllQnVmLCAmY3NyV3BhT3VpWzFdLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJZUJ1ZiArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwSWVCdWYsICZwSWVzTG9jYWwtPldQQS52ZXJzaW9uLCA4ICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllc0xvY2FsLT5XUEEudW5pY2FzdF9jaXBoZXJfY291bnQgKiA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJZUJ1ZiArPSA4ICsgcEllc0xvY2FsLT5XUEEudW5pY2FzdF9jaXBoZXJfY291bnQgKiA0OworICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwSWVCdWYsICZwSWVzTG9jYWwtPldQQS5hdXRoX3N1aXRlX2NvdW50LCAyICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllc0xvY2FsLT5XUEEuYXV0aF9zdWl0ZV9jb3VudCAqIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgcEllQnVmICs9IHBJZXNMb2NhbC0+V1BBLmF1dGhfc3VpdGVfY291bnQgKiA0OworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPm5XcGFSc25Sc3BJZUxlbmd0aCA9IG5JZUxlbiArIDI7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgICAgZWxzZSBpZigoZUNTUl9BVVRIX1RZUEVfV0FQSV9XQUlfUFNLID09IGF1dGhUeXBlKSB8fAorICAgICAgICAgICAgICAgICAgKGVDU1JfQVVUSF9UWVBFX1dBUElfV0FJX0NFUlRJRklDQVRFID09IGF1dGhUeXBlKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYocEllc0xvY2FsLT5XQVBJLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIC8vQ2FsY3VsYXRlIHRoZSBhY3R1YWwgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgbkllTGVuID0gNCAvL3ZlcnNpb24gKyBha21fc3VpdGVfY291bnQgCisgICAgICAgICAgICAgICAgICAgICAgKyBwSWVzTG9jYWwtPldBUEkuYWttX3N1aXRlX2NvdW50ICogNCAvLyBha21fc3VpdGVzCisgICAgICAgICAgICAgICAgICAgICAgKyAyIC8vcHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgKyBwSWVzTG9jYWwtPldBUEkudW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQgKiA0ICAgIC8vcHdpc2VfY2lwaGVyX3N1aXRlcworICAgICAgICAgICAgICAgICAgICAgICsgNjsgLy9ncF9jaXBoZXJfc3VpdGUgKyBwcmVhdXRoICsgcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICBpZiggcEllc0xvY2FsLT5XQVBJLmJraWRfY291bnQgKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JZUxlbiArPSAyICsgcEllc0xvY2FsLT5XQVBJLmJraWRfY291bnQgKiA0OyAgLy9ia2lkCisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAvL25JZUxlbiBkb2Vzbid0IGNvdW50IEVJRCBhbmQgbGVuZ3RoIGZpZWxkcworICAgICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUygoc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTZXNzaW9uLT5wV2FwaVJzcElFLCBuSWVMZW4gKyAyKSkpKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cFdhcGlSc3BJRVswXSA9IERPVDExRl9FSURfV0FQSTsKKyAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cFdhcGlSc3BJRVsxXSA9ICh0QU5JX1U4KW5JZUxlbjsKKyAgICAgICAgICAgICAgICAgICAgICBwSWVCdWYgPSBwU2Vzc2lvbi0+cFdhcGlSc3BJRSArIDI7CisgICAgICAgICAgICAgICAgICAgICAgLy9jb3B5IHVwdG8gYWttX3N1aXRlX2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwSWVCdWYsICZwSWVzTG9jYWwtPldBUEkudmVyc2lvbiwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgcEllQnVmICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgaWYoIHBJZXNMb2NhbC0+V0FQSS5ha21fc3VpdGVfY291bnQgKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvcHkgYWttX3N1aXRlcworICAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcEllQnVmLCBwSWVzTG9jYWwtPldBUEkuYWttX3N1aXRlcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllc0xvY2FsLT5XQVBJLmFrbV9zdWl0ZV9jb3VudCAqIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgIHBJZUJ1ZiArPSBwSWVzTG9jYWwtPldBUEkuYWttX3N1aXRlX2NvdW50ICogNDsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwSWVCdWYsICZwSWVzTG9jYWwtPldBUEkudW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgIHBJZUJ1ZiArPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgaWYoIHBJZXNMb2NhbC0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCApCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29weSBwd2lzZV9jaXBoZXJfc3VpdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwSWVCdWYsIHBJZXNMb2NhbC0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZXNMb2NhbC0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgIHBJZUJ1ZiArPSBwSWVzTG9jYWwtPldBUEkudW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQgKiA0OworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAvL2dwX2NpcGhlcl9zdWl0ZSArIHByZWF1dGggKyByZXNlcnZlZCArIGJraWRfY291bnQKKyAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBJZUJ1ZiwgJnBJZXNMb2NhbC0+V0FQSS5tdWx0aWNhc3RfY2lwaGVyX3N1aXRlLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICBwSWVCdWYgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICBpZiggcEllc0xvY2FsLT5XQVBJLmJraWRfY291bnQgKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvcHkgYWttX3N1aXRlcworICAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcEllQnVmLCBwSWVzTG9jYWwtPldBUEkuYmtpZCwgcEllc0xvY2FsLT5XQVBJLmJraWRfY291bnQgKiA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBwSWVCdWYgKz0gcEllc0xvY2FsLT5XQVBJLmJraWRfY291bnQgKiA0OworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+bldhcGlSc3BJZUxlbmd0aCA9IG5JZUxlbiArIDI7IAorICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyAgICAgICAgICAgIGlmKCAhcEllcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9sb2NhbGx5IGFsbG9jYXRlZAorICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEllc0xvY2FsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworCitzdGF0aWMgdm9pZCBjc3JDaGVja0FuZFVwZGF0ZUFDV2VpZ2h0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmQmVhY29uSUVzICpwSUVzICkKK3sKKyAgICB2X1U4X3QgYkFDV2VpZ2h0c1tXTEFOVExfTUFYX0FDXTsKKyAgICB2X1U4X3QgcGFyYW1CaywgcGFyYW1CZSwgcGFyYW1WaSwgcGFyYW1WbzsKKyAgICB2X0JPT0xfdCBmV2VpZ2h0Q2hhbmdlID0gVk9TX0ZBTFNFOworCisgICAgLy9Db21wYXJlIHR3byBBQ3MnIEVEQ0EgcGFyYW1ldGVycywgZnJvbSBsb3cgdG8gaGlnaCAoQkssIEJFLCBWSSwgVk8pCisgICAgLy9UaGUgImZvcm11bGEiIGlzLCBpZiBsb3dlciBBQydzIEFJRlNOK0NXTWluIGlzIGJpZ2dlciB0aGFuIGEgZml4ZWQgYW1vdW50CisgICAgLy9vZiB0aGUgaGlnaGVyIEFDIG9uZSwgbWFrZSB0aGUgaGlnaGVyIEFDIGhhcyB0aGUgc2FtZSB3ZWlnaHQgYXMgdGhlIGxvd2VyIEFDLgorICAgIC8vVGhpcyBkb2Vzbid0IGFkZHJlc3MgdGhlIGNhc2Ugd2hlcmUgdGhlIGxvd2VyIEFDIG5lZWRzIGEgcmVhbCBoaWdoZXIgd2VpZ2h0CisgICAgaWYoIHBJRXMtPldNTVBhcmFtcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIC8vbm8gY2hhbmdlIHRvIHRoZSBsb3dlc3Qgb25lcworICAgICAgICBiQUNXZWlnaHRzW1dMQU5UTF9BQ19CS10gPSBwTWFjLT5yb2FtLnVjQUNXZWlnaHRzW1dMQU5UTF9BQ19CS107CisgICAgICAgIGJBQ1dlaWdodHNbV0xBTlRMX0FDX0JFXSA9IHBNYWMtPnJvYW0udWNBQ1dlaWdodHNbV0xBTlRMX0FDX0JFXTsKKyAgICAgICAgYkFDV2VpZ2h0c1tXTEFOVExfQUNfVkldID0gcE1hYy0+cm9hbS51Y0FDV2VpZ2h0c1tXTEFOVExfQUNfVkldOworICAgICAgICBiQUNXZWlnaHRzW1dMQU5UTF9BQ19WT10gPSBwTWFjLT5yb2FtLnVjQUNXZWlnaHRzW1dMQU5UTF9BQ19WT107CisgICAgICAgIHBhcmFtQmsgPSBwSUVzLT5XTU1QYXJhbXMuYWNia19haWZzbiArIHBJRXMtPldNTVBhcmFtcy5hY2JrX2Fjd21pbjsKKyAgICAgICAgcGFyYW1CZSA9IHBJRXMtPldNTVBhcmFtcy5hY2JlX2FpZnNuICsgcElFcy0+V01NUGFyYW1zLmFjYmVfYWN3bWluOworICAgICAgICBwYXJhbVZpID0gcElFcy0+V01NUGFyYW1zLmFjdmlfYWlmc24gKyBwSUVzLT5XTU1QYXJhbXMuYWN2aV9hY3dtaW47CisgICAgICAgIHBhcmFtVm8gPSBwSUVzLT5XTU1QYXJhbXMuYWN2b19haWZzbiArIHBJRXMtPldNTVBhcmFtcy5hY3ZvX2Fjd21pbjsKKyAgICAgICAgaWYoIFNNRV9ERVRFQ1RfQUNfV0VJR0hUX0RJRkYocGFyYW1CaywgcGFyYW1CZSkgKQorICAgICAgICB7CisgICAgICAgICAgICBiQUNXZWlnaHRzW1dMQU5UTF9BQ19CRV0gPSBiQUNXZWlnaHRzW1dMQU5UTF9BQ19CS107CisgICAgICAgICAgICBmV2VpZ2h0Q2hhbmdlID0gVk9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYoIFNNRV9ERVRFQ1RfQUNfV0VJR0hUX0RJRkYocGFyYW1CaywgcGFyYW1WaSkgKQorICAgICAgICB7CisgICAgICAgICAgICBiQUNXZWlnaHRzW1dMQU5UTF9BQ19WSV0gPSBiQUNXZWlnaHRzW1dMQU5UTF9BQ19CS107CisgICAgICAgICAgICBmV2VpZ2h0Q2hhbmdlID0gVk9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggU01FX0RFVEVDVF9BQ19XRUlHSFRfRElGRihwYXJhbUJlLCBwYXJhbVZpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJBQ1dlaWdodHNbV0xBTlRMX0FDX1ZJXSA9IGJBQ1dlaWdodHNbV0xBTlRMX0FDX0JFXTsKKyAgICAgICAgICAgIGZXZWlnaHRDaGFuZ2UgPSBWT1NfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBpZiggU01FX0RFVEVDVF9BQ19XRUlHSFRfRElGRihwYXJhbUJrLCBwYXJhbVZvKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJBQ1dlaWdodHNbV0xBTlRMX0FDX1ZPXSA9IGJBQ1dlaWdodHNbV0xBTlRMX0FDX0JLXTsKKyAgICAgICAgICAgIGZXZWlnaHRDaGFuZ2UgPSBWT1NfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBTTUVfREVURUNUX0FDX1dFSUdIVF9ESUZGKHBhcmFtQmUsIHBhcmFtVm8pICkKKyAgICAgICAgeworICAgICAgICAgICAgYkFDV2VpZ2h0c1tXTEFOVExfQUNfVk9dID0gYkFDV2VpZ2h0c1tXTEFOVExfQUNfQkVdOworICAgICAgICAgICAgZldlaWdodENoYW5nZSA9IFZPU19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIFNNRV9ERVRFQ1RfQUNfV0VJR0hUX0RJRkYocGFyYW1WaSwgcGFyYW1WbykgKQorICAgICAgICB7CisgICAgICAgICAgICBiQUNXZWlnaHRzW1dMQU5UTF9BQ19WT10gPSBiQUNXZWlnaHRzW1dMQU5UTF9BQ19WSV07CisgICAgICAgICAgICBmV2VpZ2h0Q2hhbmdlID0gVk9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYoZldlaWdodENoYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgY2hhbmdlIEFDIHdlaWdodHMgKCVkLSVkLSVkLSVkKVxuIiksIGJBQ1dlaWdodHNbMF0sIGJBQ1dlaWdodHNbMV0sCisgICAgICAgICAgICAgICAgYkFDV2VpZ2h0c1syXSwgYkFDV2VpZ2h0c1szXSk7CisgICAgICAgICAgICBXTEFOVExfU2V0QUNXZWlnaHRzKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsIGJBQ1dlaWdodHMpOworICAgICAgICB9CisgICAgfQorfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8vUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIGlzIGEgMTFyIGFzc29jIG9yIG5vdAordEFOSV9CT09MRUFOIGNzclJvYW1JczExckFzc29jKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgICByZXR1cm4gY3NyTmVpZ2hib3JSb2FtSXMxMXJBc3NvYyhwTWFjKTsKKyNlbHNlCisgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9GQUxTRTsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisvL1JldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBhc3NvY2lhdGlvbiBpcyBhIENDWCBhc3NvYyBvciBub3QKK3RBTklfQk9PTEVBTiBjc3JSb2FtSXNDQ1hBc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisgICAgcmV0dXJuIGNzck5laWdoYm9yUm9hbUlzQ0NYQXNzb2MocE1hYyk7CisjZWxzZQorICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisjZW5kaWYKK30KKyNlbmRpZgorCisvL1JldHVybiB0cnVlIG1lYW5zIHRoZSBjb21tYW5kIGNhbiBiZSByZWxlYXNlLCBlbHNlIG5vdAorc3RhdGljIHRBTklfQk9PTEVBTiBjc3JSb2FtUHJvY2Vzc1Jlc3VsdHMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNzclJvYW1Db21wbGV0ZVJlc3VsdCBSZXN1bHQsIHZvaWQgKkNvbnRleHQgKQoreworICAgIHRBTklfQk9PTEVBTiBmUmVsZWFzZUNvbW1hbmQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjID0gTlVMTDsgICAKKyAgICB0U2lyTWFjQWRkciBCcm9hZGNhc3RNYWMgPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKyAgICB0Q3NyU2NhblJlc3VsdCAqcFNjYW5SZXN1bHQgPSBOVUxMOworICAgIHRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKyAgICBzbWVfUW9zQXNzb2NJbmZvIGFzc29jSW5mbzsKKyAgICBzbWVfUW9zQ3NyRXZlbnRJbmRUeXBlIGluZF9xb3M7Ly9pbmRpY2F0aW9uIGZvciBRb1MgbW9kdWxlIGluIFNNRQorICAgIHRBTklfVTggYWNtX21hc2sgPSAwOyAvL0hERCBuZWVkcyB0aGUgQUNNIG1hc2sgaW4gdGhlIGFzc29jIHJzcCBjYWxsYmFjaworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMgPSBOVUxMOworICAgIHRBTklfVTMyIHNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSA9ICZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlOworICAgIGVSb2FtQ21kU3RhdHVzIHJvYW1TdGF0dXM7CisgICAgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdDsKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICB0QU5JX1UzMiBrZXlfdGltZW91dF9pbnRlcnZhbCA9IDA7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHRTaXJTbWVTdGFydEJzc1JzcCAgKnBTbWVTdGFydEJzc1JzcCA9IE5VTEw7CisjZW5kaWYKKworCisgICAgc21zTG9nKCBwTWFjLCBMT0cxLCBGTCgiUHJvY2Vzc2luZyBST0FNIHJlc3VsdHMuLi5cbiIpKTsKKworICAgIHN3aXRjaCggUmVzdWx0ICkKKyAgICB7CisgICAgICAgIGNhc2UgZUNzckpvaW5TdWNjZXNzOgorICAgICAgICAgICAgLy8gcmVzZXQgdGhlIElETEUgdGltZXIKKyAgICAgICAgICAgIC8vICEhCisgICAgICAgICAgICAvLyAhISBmYWxsIHRocm91Z2ggdG8gdGhlIG5leHQgQ0FTRSBzdGF0ZW1lbnQgaGVyZSBpcyBpbnRlbnRpb25hbCAhIQorICAgICAgICAgICAgLy8gISEKKyAgICAgICAgY2FzZSBlQ3NyUmVhc3NvY1N1Y2Nlc3M6CisgICAgICAgICAgICBpZihlQ3NyUmVhc3NvY1N1Y2Nlc3MgPT0gUmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZF9xb3MgPSBTTUVfUU9TX0NTUl9SRUFTU09DX0NPTVBMRVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZF9xb3MgPSBTTUVfUU9TX0NTUl9BU1NPQ19DT01QTEVURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN1Y2Nlc3MgSm9pbiBSZXNwb25zZSBmcm9tIExJTS4gIFRlbGwgTkRJUyB3ZSBhcmUgY29ubmVjdGVkIGFuZCBzYXZlIHRoZQorICAgICAgICAgICAgLy8gQ29ubmVjdGVkIHN0YXRlLi4uCisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoInJlY2VpdmVzIGFzc29jaWF0aW9uIGluZGljYXRpb25cbiIpKTsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLCBzaXplb2Yocm9hbUluZm8pKTsKKyAgICAgICAgICAgIC8vYWx3YXlzIGZyZWUgdGhlIG1lbW9yeSBoZXJlCisgICAgICAgICAgICBpZihwU2Vzc2lvbi0+cFdwYVJzblJzcElFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5uV3BhUnNuUnNwSWVMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBXcGFSc25Sc3BJRSk7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBXcGFSc25Sc3BJRSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgICAgICAgICAgaWYocFNlc3Npb24tPnBXYXBpUnNwSUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPm5XYXBpUnNwSWVMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBXYXBpUnNwSUUpOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wV2FwaVJzcElFID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorICAgICAgICAgICAgLy9SZXNldCBjb3VudGVyIHNvIG5vIGpvaW4gcmV0cnkgaXMgbmVlZGVkLgorICAgICAgICAgICAgcFNlc3Npb24tPm1heFJldHJ5Q291bnQgPSAwOworICAgICAgICAgICAgY3NyUm9hbVN0b3BKb2luUmV0cnlUaW1lcihwTWFjLCBzZXNzaW9uSWQpOworI2VuZGlmCisgICAgICAgICAgICAvKiBUaGlzIGNyZWF0ZXMgcHJvYmxlbSBzaW5jZSB3ZSBoYXZlIG5vdCBzYXZlZCB0aGUgY29ubmVjdGVkIHByb2ZpbGUuCisgICAgICAgICAgICBTbyBtb3ZpbmcgdGhpcyBhZnRlciBzYXZpbmcgdGhlIHByb2ZpbGUKKyAgICAgICAgICAgICovCisgICAgICAgICAgICAvL2NzclJvYW1TdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5FRCApOworICAgICAgICAgICAgaWYoIENTUl9JU19JTkZSQVNUUlVDVFVSRSggcFByb2ZpbGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JTkZSQV9BU1NPQ0lBVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb25uZWN0U3RhdGUgPSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfV0RTX0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9Vc2UgdGhlIGxhc3QgY29ubmVjdGVkIGJzc2Rlc2MgZm9yIHJlYXNzb2MtaW5nIHRvIHRoZSBzYW1lIEFQLgorICAgICAgICAgICAgLy9OT1RFOiBXaGF0IHRvIGRvIHdoZW4gcmVhc3NvYyB0byBhIGRpZmZlcmVudCBBUD8/PworICAgICAgICAgICAgaWYoIChlQ3NySGRkSXNzdWVkUmVhc3NvY1RvU2FtZUFQID09IHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbikgfHwKKyAgICAgICAgICAgICAgICAoZUNzclNtZUlzc3VlZFJlYXNzb2NUb1NhbWVBUCA9PSBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2lyQnNzRGVzYyA9IHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2M7CisgICAgICAgICAgICAgICAgaWYocFNpckJzc0Rlc2MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mby5ic3NpZCwgJnBTaXJCc3NEZXNjLT5ic3NJZCwgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgIAorICAgICAgICAgICAgICAgIGlmKHBDb21tYW5kLT51LnJvYW1DbWQucFJvYW1Cc3NFbnRyeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0ID0gR0VUX0JBU0VfQUREUihwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocFNjYW5SZXN1bHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNpckJzc0Rlc2MgPSAmcFNjYW5SZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIGNhbiBiZSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICBwSWVzID0gKHREb3QxMWZCZWFjb25JRXMgKikoIHBTY2FuUmVzdWx0LT5SZXN1bHQucHZJZXMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLmJzc2lkLCAmcFNpckJzc0Rlc2MtPmJzc0lkLCBzaXplb2YodENzckJzc2lkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggcFNpckJzc0Rlc2MgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgcm9hbUluZm8uc3RhSWQgPSBIQUxfU1RBX0lOVkFMSURfSURYOworCisgICAgICAgICAgICAgICAgY3NyUm9hbVNhdmVDb25uZWN0ZWRJbmZvbWF0aW9uKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIHBTaXJCc3NEZXNjLCBwSWVzKTsKKyAgICAgICAgICAgICAgICAgICAgLy9TYXZlIFdQQS9SU04gSUUKKyAgICAgICAgICAgICAgICBjc3JSb2FtU2F2ZVNlY3VyaXR5UnNwSUUocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlLCBwU2lyQnNzRGVzYywgcEllcyk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAgICAgICAgIHJvYW1JbmZvLmlzQ0NYQXNzb2MgPSBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5pc0NDWEFzc29jOworI2VuZGlmCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gY3NyUm9hbVN0YXRlQ2hhbmdlIGFsc28gYWZmZWN0cyBzdWItc3RhdGUuIEhlbmNlLCBjc3JSb2FtU3RhdGVDaGFuZ2UgaGFwcGVucyBmaXJzdCBhbmQgdGhlbgorICAgICAgICAgICAgICAgIC8vIHN1YnN0YXRlIGNoYW5nZS4KKyAgICAgICAgICAgICAgICAvLyBNb3ZpbmcgZXZlbiBzYXZlIHByb2ZpbGUgYWJvdmUgc28gdGhhdCBiZWxvdyBtZW50aW9uZWQgY29uZGl0b24gaXMgYWxzbyBtZXQuCisgICAgICAgICAgICAgICAgLy8gSkVaMTAwMjI1OiBNb3ZlZCB0byBhZnRlciBzYXZpbmcgdGhlIHByb2ZpbGUuIEZpeCBuZWVkZWQgaW4gbWFpbi9sYXRlc3QKKyAgICAgICAgICAgICAgICBjc3JSb2FtU3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lORUQsIHNlc3Npb25JZCApOworCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBTZXQgQ29udGV4dCBpcyBpc3N1ZWQgYmVmb3JlIGxpbmsgaW5kaWNhdGlvbiB0byBORElTLiAgQWZ0ZXIgbGluayBpbmRpY2F0aW9uIGlzIAorICAgICAgICAgICAgICAgIC8vIG1hZGUgdG8gTkRJUywgZnJhbWVzIGNvdWxkIHN0YXJ0IGZsb3dpbmcuICBJZiB3ZSBoYXZlIG5vdCBzZXQgY29udGV4dCB3aXRoIExJTSwgdGhlIGZyYW1lcworICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgZHJvcHBlZCBmb3IgdGhlIHNlY3VyaXR5IGNvbnRleHQgbWF5IG5vdCBiZSBzZXQgcHJvcGVybHkuIAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gdGhpcyB3YXMgY2F1c2luZyBpc3N1ZXMgaW4gdGhlIDJjX3dsYW5fd2VwIFdIUUwgdGVzdCB3aGVuIHRoZSBTZXRDb250ZXh0IHdhcyBpc3N1ZWQgYWZ0ZXIgdGhlIGxpbmsKKyAgICAgICAgICAgICAgICAvLyBpbmRpY2F0aW9uLiAgKExpbmsgSW5kaWNhdGlvbiBoYXBwZW5zIGluIHRoZSBwcm9mRlNNU2V0Q29ubmVjdGVkSW5mcmEgY2FsbCkuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJlb3JkZXJpbmcgd2FzIGRvbmUgb24gdGl0YW5fcHJvZF91c2IgYnJhbmNoIGFuZCBpcyBiZWluZyByZXBsaWNhdGVkIGhlcmUuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCBDU1JfSVNfRU5DX1RZUEVfU1RBVElDKCBwUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwUHJvZmlsZS0+YldQU0Fzc29jaWF0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgdGhlIHNldCBDb250ZXh0IHJlcXVlc3QgdG8gTElNIHRvIGVzdGFibGlzaCB0aGUgVW5pY2FzdCBTVEEgY29udGV4dAorICAgICAgICAgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggY3NyUm9hbUlzc3VlU2V0Q29udGV4dFJlcSggcE1hYywgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXJCc3NEZXNjLCAmKHBTaXJCc3NEZXNjLT5ic3NJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgVFJVRSwgZVNJUl9UWF9SWCwgMCwgMCwgTlVMTCwgMCApICkgKSAvLyBOTyBrZXlzLi4uIHRoZXNlIGtleSBwYXJhbWV0ZXJzIGRvbid0IG1hdHRlci4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiICBTZXQgY29udGV4dCBmb3IgdW5pY2FzdCBmYWlsXG4iKSApOworICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbVN1YnN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1fU1VCU1RBVEVfTk9ORSwgc2Vzc2lvbklkICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgdGhlIHNldCBDb250ZXh0IHJlcXVlc3QgdG8gTElNIHRvIGVzdGFibGlzaCB0aGUgQnJvYWRjYXN0IFNUQSBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgIGNzclJvYW1Jc3N1ZVNldENvbnRleHRSZXEoIHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUtPm5lZ290aWF0ZWRNQ0VuY3J5cHRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2lyQnNzRGVzYywgJkJyb2FkY2FzdE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIEZBTFNFLCBlU0lSX1RYX1JYLCAwLCAwLCBOVUxMLCAwICk7IC8vIE5PIGtleXMuLi4gdGhlc2Uga2V5IHBhcmFtZXRlcnMgZG9uJ3QgbWF0dGVyLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL05lZWQgdG8gd2FpdCBmb3Igc3VwcGxpY2FudCBhdXRodGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8uZkF1dGhSZXF1aXJlZCA9IGVBTklfQk9PTEVBTl9UUlVFOworCisgICAgICAgICAgICAgICAgICAgIC8vU2V0IHRoZSBzdWJlc3RhdGUgdG8gV2FpdEZvcktleSBpbiBjYXNlIGF1dGhlbnRpYXRpb24gaXMgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIGNzclJvYW1TdWJzdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX1dBSVRfRk9SX0tFWSwgc2Vzc2lvbklkICk7CisKKworICAgICAgICAgICAgICAgICAgICBpZihwUHJvZmlsZS0+YldQU0Fzc29jaWF0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdGltZW91dF9pbnRlcnZhbCA9IENTUl9XQUlUX0ZPUl9XUFNfS0VZX1RJTUVPVVRfUEVSSU9EOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAga2V5X3RpbWVvdXRfaW50ZXJ2YWwgPSBDU1JfV0FJVF9GT1JfS0VZX1RJTUVPVVRfUEVSSU9EOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvL1NhdmUgc2Vzc2lvbklkIGluIGNhc2Ugb2YgdGltZW91dAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLldhaXRGb3JLZXlUaW1lckluZm8uc2Vzc2lvbklkID0gKHRBTklfVTgpc2Vzc2lvbklkOworICAgICAgICAgICAgICAgICAgICAvL1RoaXMgdGltZSBzaG91bGQgYmUgbG9uZyBlbm91Z2ggZm9yIHRoZSByZXN0IG9mIHRoZSBwcm9jZXNzIHBsdXMgc2V0dGluZyBrZXkKKyAgICAgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyggY3NyUm9hbVN0YXJ0V2FpdEZvcktleVRpbWVyKCBwTWFjLCBrZXlfdGltZW91dF9pbnRlcnZhbCApICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1Jlc2V0IG91ciBzdGF0ZSBzbyBub3RodGluZyBpcyBibG9ja2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiICAgRmFpbGVkIHRvIHN0YXJ0IHByZS1hdXRoIHRpbWVyXG4iKSApOworICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbVN1YnN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1fU1VCU1RBVEVfTk9ORSwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhc3NvY0luZm8ucEJzc0Rlc2MgPSBwU2lyQnNzRGVzYzsgLy9jb3VsZCBiZSBOVUxMCisgICAgICAgICAgICAgICAgYXNzb2NJbmZvLnBQcm9maWxlID0gcFByb2ZpbGU7CisKKyAgICAgICAgICAgICAgICBpZihDb250ZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdFNpclNtZUpvaW5Sc3AgKnBKb2luUnNwID0gKHRTaXJTbWVKb2luUnNwICopQ29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbGVuOworCisgICAgICAgICAgICAgICAgICAgIGNzclJvYW1GcmVlQ29ubmVjdGVkSW5mbyggcE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRJbmZvICk7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IHBKb2luUnNwLT5hc3NvY1JlcUxlbmd0aCArIHBKb2luUnNwLT5hc3NvY1JzcExlbmd0aCArIHBKb2luUnNwLT5iZWFjb25MZW5ndGg7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IHBKb2luUnNwLT5wYXJzZWRSaWNSc3BMZW47CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8gICAgICAgICAgICAgICAgICAgIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IHBKb2luUnNwLT50c3BlY0llTGVuOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlmKGxlbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5wYkZyYW1lcywgbGVuKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKCBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5wYkZyYW1lcywgcEpvaW5Sc3AtPmZyYW1lcywgbGVuKSApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RlZEluZm8ubkFzc29jUmVxTGVuZ3RoID0gcEpvaW5Sc3AtPmFzc29jUmVxTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5uQXNzb2NSc3BMZW5ndGggPSBwSm9pblJzcC0+YXNzb2NSc3BMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRJbmZvLm5CZWFjb25MZW5ndGggPSBwSm9pblJzcC0+YmVhY29uTGVuZ3RoOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRJbmZvLm5SSUNSc3BMZW5ndGggPSBwSm9pblJzcC0+cGFyc2VkUmljUnNwTGVuOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRJbmZvLm5Uc3BlY0llTGVuZ3RoID0gcEpvaW5Sc3AtPnRzcGVjSWVMZW47CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8ubkFzc29jUmVxTGVuZ3RoID0gcEpvaW5Sc3AtPmFzc29jUmVxTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2FtSW5mby5uQXNzb2NSc3BMZW5ndGggPSBwSm9pblJzcC0+YXNzb2NSc3BMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLm5CZWFjb25MZW5ndGggPSBwSm9pblJzcC0+YmVhY29uTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2FtSW5mby5wYkZyYW1lcyA9IHBTZXNzaW9uLT5jb25uZWN0ZWRJbmZvLnBiRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiVzOiBDb3B5aW5nIG9mIG1lbW9yeSBmYWlsZWQgZm9yICVkIGJ5dGVzICEhIVxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5wYkZyYW1lcyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5wYkZyYW1lcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHBDb21tYW5kLT51LnJvYW1DbWQuZlJlYXNzb2MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLmZSZWFzc29jUmVxID0gcm9hbUluZm8uZlJlYXNzb2NSc3AgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5zdGFJZCA9ICggdEFOSV9VOCApcEpvaW5Sc3AtPnN0YUlkOworICAgICAgICAgICAgICAgICAgICByb2FtSW5mby5zdGFJZCA9ICggdEFOSV9VOCApcEpvaW5Sc3AtPnN0YUlkOworICAgICAgICAgICAgICAgICAgICByb2FtSW5mby51Y2FzdFNpZyA9ICggdEFOSV9VOCApcEpvaW5Sc3AtPnVjYXN0U2lnOworICAgICAgICAgICAgICAgICAgICByb2FtSW5mby5iY2FzdFNpZyA9ICggdEFOSV9VOCApcEpvaW5Sc3AtPmJjYXN0U2lnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGlmKHBDb21tYW5kLT51LnJvYW1DbWQuZlJlYXNzb2MpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICByb2FtSW5mby5mUmVhc3NvY1JlcSA9IHJvYW1JbmZvLmZSZWFzc29jUnNwID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLm5Bc3NvY1JlcUxlbmd0aCA9IHBTZXNzaW9uLT5jb25uZWN0ZWRJbmZvLm5Bc3NvY1JlcUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8ubkFzc29jUnNwTGVuZ3RoID0gcFNlc3Npb24tPmNvbm5lY3RlZEluZm8ubkFzc29jUnNwTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICByb2FtSW5mby5uQmVhY29uTGVuZ3RoID0gcFNlc3Npb24tPmNvbm5lY3RlZEluZm8ubkJlYWNvbkxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8ucGJGcmFtZXMgPSBwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5wYkZyYW1lczsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBTTUUtUU9TIHdpdGggcmVhc3NvYyBzdWNjZXNzIGV2ZW50LCBvbmx5IGFmdGVyIAorICAgICAgICAgICAgICAgIC8vIGNvcHlpbmcgdGhlIGZyYW1lcyAKKyAgICAgICAgICAgICAgICBzbWVfUW9zQ3NyRXZlbnRJbmQocE1hYywgKHZfVThfdClzZXNzaW9uSWQsIGluZF9xb3MsICZhc3NvY0luZm8pOworI2VuZGlmCisKKworICAgICAgICAgICAgICAgIHJvYW1JbmZvLnBCc3NEZXNjID0gcFNpckJzc0Rlc2M7CisgICAgICAgICAgICAgICAgcm9hbUluZm8uc3RhdHVzQ29kZSA9IHBTZXNzaW9uLT5qb2luRmFpbFN0YXR1c0NvZGUuc3RhdHVzQ29kZTsKKyAgICAgICAgICAgICAgICByb2FtSW5mby5yZWFzb25Db2RlID0gcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5yZWFzb25Db2RlOworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgICAgICAgICAgICAgICBhY21fbWFzayA9IHNtZV9Rb3NHZXRBQ01NYXNrKHBNYWMsIHBTaXJCc3NEZXNjLCBOVUxMKTsKKyNlbmRpZiAvKiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQqLworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmFjbV9tYXNrID0gYWNtX21hc2s7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVUFQU0RfRldfVFJHX0ZSQU1FUworICAgICAgICAgICAgICAgIC8vc3RhcnQgVUFQU0QgaWYgdWFwc2RfbWFzayBpcyBub3QgMCBiZWNhdXNlIEhERCB3aWxsIGNvbmZpZ3VyZSBmb3IgdHJpZ2dlciBmcmFtZQorICAgICAgICAgICAgICAgIC8vSXQgbWF5IGJlIGJldHRlciB0byBsZXQgUW9TIGRvIHRoaXM/Pz8/CisgICAgICAgICAgICAgICAgaWYoIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm1vZGlmeVByb2ZpbGVGaWVsZHMudWFwc2RfbWFzayApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiB1YXBzZF9tYXNrICgweCVYKSBzZXQsIHJlcXVlc3QgVUFQU0Qgbm93XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUubW9kaWZ5UHJvZmlsZUZpZWxkcy51YXBzZF9tYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgcG1jU3RhcnRVYXBzZCggcE1hYywgTlVMTCwgTlVMTCApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgcm9hbUluZm8udS5wQ29ubmVjdGVkUHJvZmlsZSA9ICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZTsKKyAgICAgICAgICAgICAgICBpZiggcFNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250ID4gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+YlJlZkFzc29jU3RhcnRDbnQtLTsKKyAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQsIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OLCBlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjc3JSb2FtQ29tcGxldGlvbihwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIHBDb21tYW5kLCBlQ1NSX1JPQU1fUkVTVUxUX05PTkUsIGVBTklfQk9PTEVBTl9UUlVFKTsKKworICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBQTUtJRCBjYW5kaWRhdGUgbGlzdAorICAgICAgICAgICAgICAgIGNzclJlc2V0UE1LSURDYW5kaWRhdGVMaXN0KCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAgICAgICAgICAgICAvL1VwZGF0ZSBUTCdzIEFDIHdlaWdodCBiYXNlIG9uIHRoZSBjdXJyZW50IEVEQ0EgcGFyYW1ldGVycworICAgICAgICAgICAgICAgIC8vVGhlc2UgcGFyYW1ldGVycyBtYXkgY2hhbmdlIGluIHRoZSBjb3Vyc2Ugb2YgdGhlIGNvbm5lY3Rpb24sIHRoYXQgc2ljdHVhdGlvbgorICAgICAgICAgICAgICAgIC8vaXMgbm90IHRha2VuIGNhcmUgaGVyZS4gVGhpcyBjaGFuZ2UgaXMgbWFpbmx5IHRvIGFkZHJlc3MgYSBXSUZJIFdNTSB0ZXN0IHdoZXJlCisgICAgICAgICAgICAgICAgLy9CRSBoYXMgYSBlcXVhbCBvciBoaWdoZXIgVFggcHJpb3JpdHkgdGhhbiBWSS4gCisgICAgICAgICAgICAgICAgLy9XZSBvbmx5IGRvIHRoaXMgZm9yIGluZnJhIGxpbmsKKyAgICAgICAgICAgICAgICBpZiggY3NySXNDb25uU3RhdGVDb25uZWN0ZWRJbmZyYShwTWFjLCBzZXNzaW9uSWQgKSAmJiBwSWVzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzckNoZWNrQW5kVXBkYXRlQUNXZWlnaHQocE1hYywgcEllcyk7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIEJLSUQgY2FuZGlkYXRlIGxpc3QKKyAgICAgICAgICAgICAgICBjc3JSZXNldEJLSURDYW5kaWRhdGVMaXN0KCBwTWFjLCBzZXNzaW9uSWQgKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiICBSb2FtIGNvbW1hbmQgZG9lc24ndCBoYXZlIGEgQlNTIGRlc2NcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjc3JTY2FuQ2FuY2VsSWRsZVNjYW4ocE1hYyk7CisgICAgICAgICAgICAvL05vdCB0byBzaWduYWwgbGluayB1cCBiZWNhdXNlIGtleXMgYXJlIHlldCB0byBiZSBzZXQuCisgICAgICAgICAgICAvL1RoZSBsaW5rdXAgZnVuY3Rpb24gd2lsbCBvdmVyd3JpdGUgdGhlIHN1Yi1zdGF0ZSB0aGF0IHdlIG5lZWQgdG8ga2VlcCBhdCB0aGlzIHBvaW50LgorICAgICAgICAgICAgaWYoICFDU1JfSVNfV0FJVF9GT1JfS0VZKHBNYWMsIHNlc3Npb25JZCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzclJvYW1MaW5rVXAocE1hYywgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0NoZWNrIGlmIEJNUFMgaXMgcmVxdWlyZWQgYW5kIHN0YXJ0IHRoZSBCTVBTIHJldHJ5IHRpbWVyLiAgVGltZXIgcGVyaW9kIGlzIGxhcmdlCisgICAgICAgICAgICAvL2Vub3VnaCB0byBsZXQgc2VjdXJpdHkgYW5kIERIQ1AgaGFuZHNoYWtlIHN1Y2NlZWQgYmVmb3JlIGVudHJ5IGludG8gQk1QUworICAgICAgICAgICAgaWYgKHBtY1Nob3VsZEJtcHNUaW1lclJ1bihwTWFjKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocG1jU3RhcnRUcmFmZmljVGltZXIocE1hYywgQk1QU19UUkFGRklDX1RJTUVSX0FMTE9XX1NFQ1VSSVRZX0RIQ1ApCisgICAgICAgICAgICAgICAgICAgICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HUCwgRkwoIkNhbm5vdCBzdGFydCBCTVBTIFJldHJ5IHRpbWVyIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkJNUFMgUmV0cnkgVGltZXIgYWxyZWFkeSBydW5uaW5nIG9yIHN0YXJ0ZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBlQ3NyU3RhcnRCc3NTdWNjZXNzOgorICAgICAgICAgICAgLy8gb24gdGhlIFN0YXJ0QnNzIFJlc3BvbnNlLCBMSU0gaXMgcmV0dXJuaW5nIHRoZSBCc3MgRGVzY3JpcHRpb24gdGhhdCB3ZQorICAgICAgICAgICAgLy8gYXJlIGJlYWNvbmluZy4gIEFkZCB0aGlzIEJzcyBEZXNjcmlwdGlvbiB0byBvdXIgc2NhbiByZXN1bHRzIGFuZAorICAgICAgICAgICAgLy8gY2hhaW4gdGhlIFByb2ZpbGUgdG8gdGhpcyBCc3MgRGVzY3JpcHRpb24uICBPbiBhIFN0YXJ0IEJTUywgdGhlcmUgd2FzIG5vCisgICAgICAgICAgICAvLyBkZXRlY3RlZCBCc3MgZGVzY3JpcHRpb24gKG5vIHBhcnRuZXIpIHNvIHdlIGlzc3VlZCB0aGUgU3RhcnQgQnNzIHRvCisgICAgICAgICAgICAvLyBzdGFydCB0aGUgSWJzcyB3aXRob3V0IGFueSBCc3MgZGVzY3JpcHRpb24uICBMaW0gd2FzIGtpbmQgZW5vdWdoIHRvIHJldHVybgorICAgICAgICAgICAgLy8gdGhlIEJzcyBEZXNjcmlwdGlvbiB0aGF0IHdlIHN0YXJ0IGJlYWNvbmluZyBmb3IgdGhlIG5ld2x5IHN0YXJ0ZWQgSWJzcy4KKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgicmVjZWl2ZXMgc3RhcnQgQlNTIG9rIGluZGljYXRpb25cbiIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgcFNtZVN0YXJ0QnNzUnNwID0gKHRTaXJTbWVTdGFydEJzc1JzcCAqKUNvbnRleHQ7CisjZW5kaWYgICAgICAgICAgICAgCisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbykpOworICAgICAgICAgICAgaWYoIENTUl9JU19JQlNTKCBwUHJvZmlsZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdFN0YXRlID0gZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lCU1NfRElTQ09OTkVDVEVEOworICAgICAgICAgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgIGVsc2UgaWYgKENTUl9JU19JTkZSQV9BUChwUHJvZmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JTkZSQV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdFN0YXRlID0gZUNTUl9BU1NPQ19TVEFURV9UWVBFX1dEU19ESVNDT05ORUNURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIUNTUl9JU19XRFNfU1RBKCBwUHJvZmlsZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjc3JSb2FtU3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lORUQsIHNlc3Npb25JZCApOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICBwU2lyQnNzRGVzYyA9ICZwU21lU3RhcnRCc3NSc3AtPmJzc0Rlc2NyaXB0aW9uOworI2Vsc2UKKyAgICAgICAgICAgICAgICBwU2lyQnNzRGVzYyA9ICh0U2lyQnNzRGVzY3JpcHRpb24gKilDb250ZXh0OworI2VuZGlmCisgICAgICAgICAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMoIHBNYWMsIHBTaXJCc3NEZXNjLCAmcEllcyApKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoImNhbm5vdCBwYXJzZSBJQlNTIElFc1xuIikpOworICAgICAgICAgICAgICAgICAgICByb2FtSW5mby5wQnNzRGVzYyA9IHBTaXJCc3NEZXNjOworICAgICAgICAgICAgICAgICAgICAvL1dlIG5lZWQgdG8gYXNzb2NpYXRlX2NvbXBsZXRlIGl0IGZpcnN0LCBiZWNhc3VlIEFzc29jaWF0ZV9zdGFydCBhbHJlYWR5IGluZGljYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayggcE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fSUJTU19JTkQsIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19TVEFSVF9GQUlMRUQgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICBpZiAoIUNTUl9JU19JTkZSQV9BUChwUHJvZmlsZSkpCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0ID0gY3NyU2NhbkFwcGVuZEJzc0Rlc2NyaXB0aW9uKCBwTWFjLCBwU2lyQnNzRGVzYywgcEllcyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjc3JSb2FtU2F2ZUNvbm5lY3RlZEJzc0Rlc2MocE1hYywgc2Vzc2lvbklkLCBwU2lyQnNzRGVzYyk7CisgICAgICAgICAgICAgICAgY3NyUm9hbUZyZWVDb25uZWN0UHJvZmlsZShwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpOworICAgICAgICAgICAgICAgIGNzclJvYW1GcmVlQ29ubmVjdGVkSW5mbyggcE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRJbmZvICk7CisgICAgICAgICAgICAgICAgaWYocFNpckJzc0Rlc2MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjc3JSb2FtU2F2ZUNvbm5lY3RlZEluZm9tYXRpb24ocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgcFNpckJzc0Rlc2MsIHBJZXMpOworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mby5ic3NpZCwgJnBTaXJCc3NEZXNjLT5ic3NJZCwgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL1dlIGFyZSBkb2VuIHdpdGggdGhlIElFcyBzbyBmcmVlIGl0CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwSWVzKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2b3NfbG9nX2lic3NfcGt0X3R5cGUgKnBJYnNzTG9nOworICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBiaTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgV0xBTl9WT1NfRElBR19MT0dfQUxMT0MocElic3NMb2csIHZvc19sb2dfaWJzc19wa3RfdHlwZSwgTE9HX1dMQU5fSUJTU19DKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocElic3NMb2cpCisgICAgICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICAgICBpZihDU1JfSU5WQUxJRF9TQ0FOUkVTVUxUX0hBTkRMRSA9PSBwQ29tbWFuZC0+dS5yb2FtQ21kLmhCU1NMaXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vV2Ugc3RhcnQgdGhlIElCU1MgKGRpZG4ndCBmaW5kIGFueSBtYXRjaGVkIElCU1Mgb3V0IHRoZXJlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJYnNzTG9nLT5ldmVudElkID0gV0xBTl9JQlNTX0VWRU5UX1NUQVJUX0lCU1NfUlNQOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJYnNzTG9nLT5ldmVudElkID0gV0xBTl9JQlNTX0VWRU5UX0pPSU5fSUJTU19SU1A7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2lyQnNzRGVzYykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBJYnNzTG9nLT5ic3NpZCwgcFNpckJzc0Rlc2MtPmJzc0lkLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWJzc0xvZy0+b3BlcmF0aW5nQ2hhbm5lbCA9IHBTaXJCc3NEZXNjLT5jaGFubmVsSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MoY2NtQ2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQkVBQ09OX0lOVEVSVkFMLCAmYmkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyoqKlU4IGlzIG5vdCBlbm91Z2ggZm9yIGJlYWNvbiBpbnRlcnZhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJYnNzTG9nLT5iZWFjb25JbnRlcnZhbCA9ICh2X1U4X3QpYmk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19SRVBPUlQocElic3NMb2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisgICAgICAgICAgICAgICAgLy9Pbmx5IHNldCBjb250ZXh0IGZvciBub24tV0RTX1NUQS4gV2UgZG9uJ3QgZXZlbiBuZWVkIGl0IGZvciBXRFNfQVAuIEJ1dCBzaW5jZSB0aGUgZW5jcnlwdGlvbgorICAgICAgICAgICAgICAgIC8vaXMgV1BBMi1QU0sgc28gaXQgd29uJ3QgbWF0dGVyLgorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgICAgIGlmKCBDU1JfSVNfRU5DX1RZUEVfU1RBVElDKCBwUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgKSAmJiAhQ1NSX0lTX0lORlJBX0FQKCBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlICkpCisgICAgICAgICAgICAgICAgeworI2Vsc2UgCisgICAgICAgICAgICAgICAgaWYoIENTUl9JU19FTkNfVFlQRV9TVEFUSUMoIHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSApKQorICAgICAgICAgICAgICAgIHsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvLyBJc3N1ZSB0aGUgc2V0IENvbnRleHQgcmVxdWVzdCB0byBMSU0gdG8gZXN0YWJsaXNoIHRoZSBCcm9hZGNhc3QgU1RBIGNvbnRleHQgZm9yIHRoZSBJYnNzLgorICAgICAgICAgICAgICAgICAgICBjc3JSb2FtSXNzdWVTZXRDb250ZXh0UmVxKCBwTWFjLCBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlLT5uZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpckJzc0Rlc2MsICZCcm9hZGNhc3RNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIEZBTFNFLCBlU0lSX1RYX1JYLCAwLCAwLCBOVUxMLCAwICk7IC8vIE5PIGtleXMuLi4gdGhlc2Uga2V5IHBhcmFtZXRlcnMgZG9uJ3QgbWF0dGVyLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0tlZXAgdGhlIHN0YXRlIHRvIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HCisgICAgICAgICAgICAgICAgLy9OZWVkIHRvIHNlbmQgam9pbl9yZXEuCisgICAgICAgICAgICAgICAgaWYocENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHBTY2FuUmVzdWx0ID0gR0VUX0JBU0VfQUREUihwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTaXJCc3NEZXNjID0gJnBTY2FuUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJZXMgPSAodERvdDExZkJlYWNvbklFcyAqKSggcFNjYW5SZXN1bHQtPlJlc3VsdC5wdkllcyApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSByb2FtaW5nIHN1YnN0YXRlIHRvICdqb2luIGF0dGVtcHQnLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtU3Vic3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9KT0lOX1JFUSwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclNlbmRKb2luUmVxTXNnKCBwTWFjLCBzZXNzaW9uSWQsIHBTaXJCc3NEZXNjLCBwUHJvZmlsZSwgcEllcyApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIiBTdGFydEJTUyBmb3IgV0RTIHN0YXRpb24gd2l0aCBubyBCc3NEZXNjXG4iICk7CisgICAgICAgICAgICAgICAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL09ubHkgdGVsbCB1cHBlciBsYXllciBpcyB3ZSBzdGFydCB0aGUgQlNTIGJlY2F1c2UgVmlzdGEgZG9lc24ndCBsaWtlIG11bHRpcGxlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vaW5kaWNhdGlvbnMuIElmIHdlIGRvbid0IHN0YXJ0IHRoZSBCU1Mgb3Vyc2VsZiwgaGFuZGxlciBvZiBlU0lSX1NNRV9KT0lORURfTkVXX0JTUyB3aWxsIAorICAgICAgICAgICAgLy90cmlnZ2VyIHRoZSBjb25uZWN0aW9uIHN0YXJ0IGluZGljYXRpb24gaW4gVmlzdGEKKyAgICAgICAgICAgIGlmKCAhQ1NSX0lTX0pPSU5fVE9fSUJTUyggcFByb2ZpbGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9hbVN0YXR1cyA9IGVDU1JfUk9BTV9JQlNTX0lORDsKKyAgICAgICAgICAgICAgICByb2FtUmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1NUQVJURUQ7CisgICAgICAgICAgICAgICAgaWYoIENTUl9JU19XRFMoIHBQcm9maWxlICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm9hbVN0YXR1cyA9IGVDU1JfUk9BTV9XRFNfSU5EOworICAgICAgICAgICAgICAgICAgICByb2FtUmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9XRFNfU1RBUlRFRDsKKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgICAgIGlmKCBDU1JfSVNfSU5GUkFfQVAoIHBQcm9maWxlICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm9hbVN0YXR1cyA9IGVDU1JfUk9BTV9JTkZSQV9JTkQ7CisgICAgICAgICAgICAgICAgICAgIHJvYW1SZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX1NUQVJURUQ7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmICAKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy9Pbmx5IHRlbGwgdXBwZXIgbGF5ZXIgaXMgd2Ugc3RhcnQgdGhlIEJTUyBiZWNhdXNlIFZpc3RhIGRvZXNuJ3QgbGlrZSBtdWx0aXBsZSBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgLy9pbmRpY2F0aW9ucy4gSWYgd2UgZG9uJ3Qgc3RhcnQgdGhlIEJTUyBvdXJzZWxmLCBoYW5kbGVyIG9mIGVTSVJfU01FX0pPSU5FRF9ORVdfQlNTIHdpbGwgCisgICAgICAgICAgICAgICAgLy90cmlnZ2VyIHRoZSBjb25uZWN0aW9uIHN0YXJ0IGluZGljYXRpb24gaW4gVmlzdGEKKyAgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbykpOworICAgICAgICAgICAgICAgIHJvYW1JbmZvLnN0YXR1c0NvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnN0YXR1c0NvZGU7CisgICAgICAgICAgICAgICAgcm9hbUluZm8ucmVhc29uQ29kZSA9IHBTZXNzaW9uLT5qb2luRmFpbFN0YXR1c0NvZGUucmVhc29uQ29kZTsKKyAgICAgICAgICAgICAgICBpZihDU1JfSU5WQUxJRF9TQ0FOUkVTVUxUX0hBTkRMRSA9PSBwQ29tbWFuZC0+dS5yb2FtQ21kLmhCU1NMaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9XZSBzdGFydCB0aGUgSUJTUyAoZGlkbid0IGZpbmQgYW55IG1hdGNoZWQgSUJTUyBvdXQgdGhlcmUpCisgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLnBCc3NEZXNjID0gcFNpckJzc0Rlc2M7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICByb2FtSW5mby5zdGFJZCA9ICh0QU5JX1U4KXBTbWVTdGFydEJzc1JzcC0+c3RhSWQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKCBwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQsIHJvYW1TdGF0dXMsIHJvYW1SZXN1bHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGNzclNjYW5DYW5jZWxJZGxlU2NhbihwTWFjKTsKKyAgICAgICAgICAgIC8vT25seSB1c2UgdGhpcyB0aW1lciBmb3IgaWJzcy4gQkFQIGhhcyBpdHMgb3duIHRpbWVyIGZvciBXRFMKKyAgICAgICAgICAgIGlmKCBDU1JfSVNfSUJTUyggcFByb2ZpbGUpICYmIENTUl9JTlZBTElEX1NDQU5SRVNVTFRfSEFORExFICE9IHBDb21tYW5kLT51LnJvYW1DbWQuaEJTU0xpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vc3RhcnQgdGhlIGpvaW4gSUJTUyB0aW1lcgorICAgICAgICAgICAgICAgIGNzclJvYW1TdGFydElic3NKb2luVGltZXIocE1hYywgc2Vzc2lvbklkLCBDU1JfSUJTU19KT0lOX1RJTUVPVVRfUEVSSU9EKTsgLy9pbnRlcnZhbAorICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5pYnNzX2pvaW5fcGVuZGluZyA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9BbHJlYWR5IHNlbnQgam9pbl9yZXEgZm9yIHRoZSBXRFMgc3RhdGlvbgorICAgICAgICAgICAgICAgIGZSZWxlYXNlQ29tbWFuZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIENTUl9JU19XRFNfU1RBKCBwUHJvZmlsZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL25lZWQgdG8gc2VuZCBzdG9wIEJTUyBiZWNhdXNlIHdlIGZhaWwgdG8gc2VuZCBqb2luX3JlcQorICAgICAgICAgICAgICAgIGNzclJvYW1Jc3N1ZURpc2Fzc29jaWF0ZUNtZCggcE1hYywgc2Vzc2lvbklkLCBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEICk7CisgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayggcE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fV0RTX0lORCwgZUNTUl9ST0FNX1JFU1VMVF9XRFNfU1RPUFBFRCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDc3JTdGFydEJzc0ZhaWx1cmU6CisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b3NfbG9nX2lic3NfcGt0X3R5cGUgKnBJYnNzTG9nOworCisgICAgICAgICAgICAgICAgV0xBTl9WT1NfRElBR19MT0dfQUxMT0MocElic3NMb2csIHZvc19sb2dfaWJzc19wa3RfdHlwZSwgTE9HX1dMQU5fSUJTU19DKTsKKyAgICAgICAgICAgICAgICBpZihwSWJzc0xvZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBJYnNzTG9nLT5zdGF0dXMgPSBXTEFOX0lCU1NfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfTE9HX1JFUE9SVChwSWJzc0xvZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8vI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisKKyAgICAgICAgICAgIHJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fSUJTU19JTkQ7CisgICAgICAgICAgICByb2FtUmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1NUQVJURUQ7CisgICAgICAgICAgICBpZiggQ1NSX0lTX1dEUyggcFByb2ZpbGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9hbVN0YXR1cyA9IGVDU1JfUk9BTV9XRFNfSU5EOworICAgICAgICAgICAgICAgIHJvYW1SZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX1dEU19TVEFSVEVEOworICAgICAgICAgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgIGlmKCBDU1JfSVNfSU5GUkFfQVAoIHBQcm9maWxlICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fSU5GUkFfSU5EOworICAgICAgICAgICAgICAgIHJvYW1SZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX1NUQVJUX0ZBSUxFRDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYoQ29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2lyQnNzRGVzYyA9ICh0U2lyQnNzRGVzY3JpcHRpb24gKilDb250ZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTaXJCc3NEZXNjID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisgICAgICAgICAgICByb2FtSW5mby5wQnNzRGVzYyA9IHBTaXJCc3NEZXNjOworICAgICAgICAgICAgLy9XZSBuZWVkIHRvIGFzc29jaWF0ZV9jb21wbGV0ZSBpdCBmaXJzdCwgYmVjYXN1ZSBBc3NvY2lhdGVfc3RhcnQgYWxyZWFkeSBpbmRpY2F0ZWQuCisgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKCBwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQsIHJvYW1TdGF0dXMsIHJvYW1SZXN1bHQgKTsKKyAgICAgICAgICAgIGNzclNldERlZmF1bHREb3QxMU1vZGUoIHBNYWMgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNzclNpbGVudGx5U3RvcFJvYW1pbmc6CisgICAgICAgICAgICAvLyBXZSBhcmUgaGVyZSBiZWNhdXNlIHdlIHRyeSB0byBzdGFydCB0aGUgc2FtZSBJQlNTCisgICAgICAgICAgICAvL05vIG1lc3NhZ2UgdG8gUEUKKyAgICAgICAgICAgIC8vIHJldHVybiB0aGUgcm9hbWluZyBzdGF0ZSB0byBKb2luZWQuCisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoInJlY2VpdmVzIHNpbGVudGx5IHJvYW1pbmcgaW5kaWNhdGlvblxuIikpOworICAgICAgICAgICAgY3NyUm9hbVN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTkVELCBzZXNzaW9uSWQgKTsKKyAgICAgICAgICAgIGNzclJvYW1TdWJzdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX05PTkUsIHNlc3Npb25JZCApOworICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcm9hbUluZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pKTsKKyAgICAgICAgICAgIHJvYW1JbmZvLnBCc3NEZXNjID0gcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYzsKKyAgICAgICAgICAgIGlmKCByb2FtSW5mby5wQnNzRGVzYyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcm9hbUluZm8uYnNzaWQsICZyb2FtSW5mby5wQnNzRGVzYy0+YnNzSWQsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vU2luY2UgdGhlcmUgaXMgbm8gY2hhbmdlIGluIHRoZSBjdXJyZW50IHN0YXRlLCBzaW1wbHkgcGFzcyBiYWNrIG5vIHJlc3VsdCBvdGhlcndpc2UKKyAgICAgICAgICAgIC8vSEREIG1heSBiZSBtaXN0YWtlbmx5IG1hcmsgdG8gZGlzY29ubmVjdGVkIHN0YXRlLgorICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayggcE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fSUJTU19JTkQsIGVDU1JfUk9BTV9SRVNVTFRfTk9ORSApOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDc3JTaWxlbnRseVN0b3BSb2FtaW5nU2F2ZVN0YXRlOgorICAgICAgICAgICAgLy9XZSBhcmUgaGVyZSBiZWNhdXNlIHdlIHRyeSB0byBjb25uZWN0IHRvIHRoZSBzYW1lIEFQCisgICAgICAgICAgICAvL05vIG1lc3NhZ2UgdG8gUEUKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgicmVjZWl2ZXMgc2lsZW50bHkgc3RvcCByb2FtaW5nIGluZGljYXRpb25cbiIpKTsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLCBzaXplb2Yocm9hbUluZm8pKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy90byBhdmlvZCByZXNldHRpbmcgdGhlIHN1YnN0YXRlIHRvIE5PTkUKKyAgICAgICAgICAgIHBNYWMtPnJvYW0uY3VyU3RhdGVbc2Vzc2lvbklkXSA9IGVDU1JfUk9BTUlOR19TVEFURV9KT0lORUQ7CisgICAgICAgICAgICAvL05vIG5lZWQgdG8gY2hhbmdlIHN1YnN0YXRlIHRvIHdhaV9mb3Jfa2V5IGJlY2F1c2UgdGhlcmUgaXMgbm8gc3RhdGUgY2hhbmdlCisgICAgICAgICAgICByb2FtSW5mby5wQnNzRGVzYyA9IHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2M7CisgICAgICAgICAgICBpZiggcm9hbUluZm8ucEJzc0Rlc2MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLmJzc2lkLCAmcm9hbUluZm8ucEJzc0Rlc2MtPmJzc0lkLCBzaXplb2YodENzckJzc2lkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJvYW1JbmZvLnN0YXR1c0NvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnN0YXR1c0NvZGU7CisgICAgICAgICAgICByb2FtSW5mby5yZWFzb25Db2RlID0gcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5yZWFzb25Db2RlOworICAgICAgICAgICAgcm9hbUluZm8ubkJlYWNvbkxlbmd0aCA9IHBTZXNzaW9uLT5jb25uZWN0ZWRJbmZvLm5CZWFjb25MZW5ndGg7CisgICAgICAgICAgICByb2FtSW5mby5uQXNzb2NSZXFMZW5ndGggPSBwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5uQXNzb2NSZXFMZW5ndGg7CisgICAgICAgICAgICByb2FtSW5mby5uQXNzb2NSc3BMZW5ndGggPSBwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5uQXNzb2NSc3BMZW5ndGg7CisgICAgICAgICAgICByb2FtSW5mby5wYkZyYW1lcyA9IHBTZXNzaW9uLT5jb25uZWN0ZWRJbmZvLnBiRnJhbWVzOworICAgICAgICAgICAgcm9hbUluZm8uc3RhSWQgPSBwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mby5zdGFJZDsKKyAgICAgICAgICAgIHJvYW1JbmZvLnUucENvbm5lY3RlZFByb2ZpbGUgPSAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGU7CisjaWYgZGVmaW5lZChWT1NTX0VOQUJMRUQpCisgICAgICAgICAgICBWT1NfQVNTRVJUKCByb2FtSW5mby5zdGFJZCAhPSAwICk7CisjZW5kaWYKKyAgICAgICAgICAgIHBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudC0tOworICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OLCBlQ1NSX1JPQU1fUkVTVUxUX0FTU09DSUFURUQpOworICAgICAgICAgICAgY3NyUm9hbUNvbXBsZXRpb24ocE1hYywgc2Vzc2lvbklkLCBOVUxMLCBwQ29tbWFuZCwgZUNTUl9ST0FNX1JFU1VMVF9BU1NPQ0lBVEVELCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDc3JSZWFzc29jRmFpbHVyZToKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgICAgICAgICBzbWVfUW9zQ3NyRXZlbnRJbmQocE1hYywgKHRBTklfVTgpc2Vzc2lvbklkLCBTTUVfUU9TX0NTUl9SRUFTU09DX0ZBSUxVUkUsIE5VTEwpOworI2VuZGlmCisgICAgICAgIGNhc2UgZUNzckpvaW5XZHNGYWlsdXJlOgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJmYWlsZWQgdG8gam9pbiBXRFNcbiIpKTsKKyAgICAgICAgICAgIGNzckZyZWVDb25uZWN0QnNzRGVzYyhwTWFjLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgY3NyUm9hbUZyZWVDb25uZWN0UHJvZmlsZShwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpOworICAgICAgICAgICAgY3NyUm9hbUZyZWVDb25uZWN0ZWRJbmZvKCBwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZEluZm8gKTsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisgICAgICAgICAgICByb2FtSW5mby5wQnNzRGVzYyA9IHBDb21tYW5kLT51LnJvYW1DbWQucExhc3RSb2FtQnNzOworICAgICAgICAgICAgcm9hbUluZm8uc3RhdHVzQ29kZSA9IHBTZXNzaW9uLT5qb2luRmFpbFN0YXR1c0NvZGUuc3RhdHVzQ29kZTsKKyAgICAgICAgICAgIHJvYW1JbmZvLnJlYXNvbkNvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgJnJvYW1JbmZvLCBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fV0RTX0lORCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fUkVTVUxUX1dEU19OT1RfQVNTT0NJQVRFRCk7CisgICAgICAgICAgICAvL05lZWQgdG8gaXNzdWUgc3RvcF9ic3MKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNzckpvaW5GYWlsdXJlOgorICAgICAgICBjYXNlIGVDc3JOb3RoaW5nVG9Kb2luOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoInJlY2VpdmVzIG5vIGFzc29jaWF0aW9uIGluZGljYXRpb25cbiIpKTsKKyAgICAgICAgICAgIGlmKCBDU1JfSVNfSU5GUkFTVFJVQ1RVUkUoICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSApIHx8IAorICAgICAgICAgICAgICAgIENTUl9JU19ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUSggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vZG8gbm90IGZyZWUgZm9yIHRoZSBvdGhlciBwcm9maWxlcyBhcyB3ZSBuZWVkIHRvIHNlbmQgZG93biBzdG9wIEJTUyBsYXRlcgorICAgICAgICAgICAgICAgIGNzckZyZWVDb25uZWN0QnNzRGVzYyhwTWFjLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGNzclJvYW1GcmVlQ29ubmVjdFByb2ZpbGUocE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKTsKKyAgICAgICAgICAgICAgICBjc3JSb2FtRnJlZUNvbm5lY3RlZEluZm8oIHBNYWMsICZwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mbyApOworICAgICAgICAgICAgICAgIGNzclNldERlZmF1bHREb3QxMU1vZGUoIHBNYWMgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoKCBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgdHJhbnNpdGlvbiBpcyBiZWNhdXNlIG9mIGFuIDgwMi4xMSBPSUQsIHRoZW4gd2UgdHJhbnNpdGlvbgorICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gSU5JVCBzdGF0ZSBzbyB3ZSBzaXQgd2FpdGluZyBmb3IgbW9yZSBPSURzIHRvIGJlIGlzc3VlZCBhbmQKKyAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBzdGFydCB0aGUgSURMRSB0aW1lci4KKyAgICAgICAgICAgICAgICBjYXNlIGVDc3JTbWVJc3N1ZWRBc3NvY1RvU2ltaWxhckFQOgorICAgICAgICAgICAgICAgIGNhc2UgZUNzckhkZElzc3VlZDoKKyAgICAgICAgICAgICAgICAgICAgY3NyUm9hbVN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1JTkdfU1RBVEVfSURMRSwgc2Vzc2lvbklkICk7CisgICAgICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLnBCc3NEZXNjID0gcENvbW1hbmQtPnUucm9hbUNtZC5wTGFzdFJvYW1Cc3M7CisgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLnN0YXR1c0NvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnN0YXR1c0NvZGU7CisgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLnJlYXNvbkNvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRGVmZWF0dXJpemUgdGhpcyBsYXRlciBpZiBuZWVkZWQgKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworICAgICAgICAgICAgICAgICAgICAvKiBJZiBKb2luIGZhaWxzIHdoaWxlIEhhbmRvZmYgaXMgaW4gcHJvZ3Jlc3MsIGluZGljYXRlIGRpc2Fzc29jaWF0ZWQgZXZlbnQgdG8gc3VwcGxpY2FudCB0byByZWNvbm5lY3QgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNzclJvYW1Jc0hhbmRvZmZJblByb2dyZXNzKHBNYWMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQsIGVDU1JfUk9BTV9ESVNBU1NPQ0lBVEVELCBlQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgaW5kaWNhdGUgbmVpZ2hib3Igcm9hbSBhbGdvcml0aG0gYWJvdXQgdGhlIGNvbm5lY3QgZmFpbHVyZSBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1JbmRpY2F0ZUNvbm5lY3QocE1hYywgKHRBTklfVTgpc2Vzc2lvbklkLCBWT1NfU1RBVFVTX0VfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HMSwgRkwoIiAgcm9hbShyZWFzb24gJWQpIGZhaWxlZFxuIiksIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbik7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgICAgICAgICAgICAgICAgICBzbWVfUW9zQ3NyRXZlbnRJbmQocE1hYywgKHRBTklfVTgpc2Vzc2lvbklkLCBTTUVfUU9TX0NTUl9ESVNDT05ORUNUX0lORCwgTlVMTCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNvbXBsZXRpb24ocE1hYywgc2Vzc2lvbklkLCBOVUxMLCBwQ29tbWFuZCwgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBjc3JTY2FuU3RhcnRJZGxlU2NhbihwTWFjKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQlRBTVBfVVRfUkYKKyAgICAgICAgICAgICAgICAgICAgLy9Gb3IgV0RTIFNUQS4gVG8gZml4IHRoZSBpc3N1ZSB3aGVyZSB0aGUgV0RTIEFQIHNpZGUgbWF5IGJlIHRvbyBidXN5IGJ5CisgICAgICAgICAgICAgICAgICAgIC8vQlQgYWN0aXZpdHkgYW5kIG5vdCBhYmxlIHRvIHJlY2V2aWUgV0xBTiB0cmFmZmljLiBSZXRyeSB0aGUgam9pbgorICAgICAgICAgICAgICAgICAgICBpZiggQ1NSX0lTX1dEU19TVEEocFByb2ZpbGUpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbVN0YXJ0Sm9pblJldHJ5VGltZXIocE1hYywgc2Vzc2lvbklkLCBDU1JfSk9JTl9SRVRSWV9USU1FT1VUX1BFUklPRCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgZUNzckhkZElzc3VlZFJlYXNzb2NUb1NhbWVBUDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDc3JTbWVJc3N1ZWRSZWFzc29jVG9TYW1lQVA6CisgICAgICAgICAgICAgICAgICAgIGNzclJvYW1TdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0lETEUsIHNlc3Npb25JZCk7CisKKyAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLCBlQ1NSX1JPQU1fRElTQVNTT0NJQVRFRCwgZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQpOworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NDc3JFdmVudEluZChwTWFjLCAodEFOSV9VOClzZXNzaW9uSWQsIFNNRV9RT1NfQ1NSX0RJU0NPTk5FQ1RfSU5ELCBOVUxMKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBjc3JSb2FtQ29tcGxldGlvbihwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIHBDb21tYW5kLCBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGNzclNjYW5TdGFydElkbGVTY2FuKHBNYWMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVDc3JGb3JjZWREaXNhc3NvYzoKKyAgICAgICAgICAgICAgICBjYXNlIGVDc3JGb3JjZWREZWF1dGg6CisgICAgICAgICAgICAgICAgY2FzZSBlQ3NyU21lSXNzdWVkSWJzc0pvaW5GYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICBjc3JSb2FtU3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9JRExFLCBzZXNzaW9uSWQpOworCisgICAgICAgICAgICAgICAgICAgIGlmKGVDc3JTbWVJc3N1ZWRJYnNzSm9pbkZhaWx1cmUgPT0gcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgSEREIHRoYXQgSUJTUyBqb2luIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIDAsIGVDU1JfUk9BTV9JQlNTX0lORCwgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX0pPSU5fRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fRElTQVNTT0NJQVRFRCwgZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQpOworICAgICAgICAgICAgICAgICAgICB9CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgICAgICAgICAgICAgICAgICBzbWVfUW9zQ3NyRXZlbnRJbmQocE1hYywgKHRBTklfVTgpc2Vzc2lvbklkLCBTTUVfUU9TX0NTUl9ESVNDT05ORUNUX0lORCwgTlVMTCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUxpbmtEb3duKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIGNzclNjYW5TdGFydElkbGVTY2FuKHBNYWMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVDc3JGb3JjZWRJYnNzTGVhdmU6CisgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9JQlNTX0xFQVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19TVE9QKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlQ3NyRm9yY2VkRGlzYXNzb2NNSUNGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICBjc3JSb2FtU3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9JRExFLCBzZXNzaW9uSWQgKTsKKworICAgICAgICAgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQsIGVDU1JfUk9BTV9ESVNBU1NPQ0lBVEVELCBlQ1NSX1JPQU1fUkVTVUxUX01JQ19GQUlMVVJFKTsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NDc3JFdmVudEluZChwTWFjLCAodEFOSV9VOClzZXNzaW9uSWQsIFNNRV9RT1NfQ1NSX0RJU0NPTk5FQ1RfUkVRLCBOVUxMKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBjc3JTY2FuU3RhcnRJZGxlU2NhbihwTWFjKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgICAgIGNhc2UgZUNzclN0b3BCc3M6CisgICAgICAgICAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX0lORlJBX0lORCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9TVE9QUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlQ3NyRm9yY2VkRGlzYXNzb2NTdGE6CisgICAgICAgICAgICAgICAgY2FzZSBlQ3NyRm9yY2VkRGVhdXRoU3RhOgorICAgICAgICAgICAgICAgICAgIGNzclJvYW1TdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5FRCwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSApCisgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICghcFNlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICBpZiAoIENTUl9JU19JTkZSQV9BUCgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpICkKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8udS5wQ29ubmVjdGVkUHJvZmlsZSA9ICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcm9hbUluZm8ucGVlck1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnBlZXJNYWMsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8ucmVhc29uQ29kZSA9IGVDU1JfUk9BTV9SRVNVTFRfRk9SQ0VEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8uc3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcm9hbUluZm8sIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9MT1NUTElOSywgZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQpOworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICAgICAgY2FzZSBlQ3NyTG9zdExpbmsxOgorICAgICAgICAgICAgICAgICAgICAvLyBpZiBsb3N0IGxpbmsgcm9hbTEgZmFpbGVkLCB0aGVuIGlzc3VlIGxvc3QgbGluayBTY2FuMiAuLi4KKyAgICAgICAgICAgICAgICAgICAgY3NyU2NhblJlcXVlc3RMb3N0TGluazIocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlQ3NyTG9zdExpbmsyOgorICAgICAgICAgICAgICAgICAgICAvLyBpZiBsb3N0IGxpbmsgcm9hbTIgZmFpbGVkLCB0aGVuIGlzc3VlIGxvc3QgbGluayBzY2FuMyAuLi4KKyAgICAgICAgICAgICAgICAgICAgY3NyU2NhblJlcXVlc3RMb3N0TGluazMocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlQ3NyTG9zdExpbmszOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNzclJvYW1TdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0lETEUsIHNlc3Npb25JZCApOworCisgICAgICAgICAgICAgICAgICAgIC8vV2UgYXJlIGRvbmUgd2l0aCBvbmUgcm91bmQgb2YgbG9zdGxpbmsgcm9hbWluZyBoZXJlCisgICAgICAgICAgICAgICAgICAgIGNzclNjYW5IYW5kbGVGYWlsZWRMb3N0bGluazMocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICggZlJlbGVhc2VDb21tYW5kICk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtUmVnaXN0ZXJDYWxsYmFjayh0cEFuaVNpckdsb2JhbCBwTWFjLCBjc3JSb2FtQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqcENvbnRleHQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbUNvcHlQcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtUHJvZmlsZSAqcERzdFByb2ZpbGUsIHRDc3JSb2FtUHJvZmlsZSAqcFNyY1Byb2ZpbGUpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRBTklfVTMyIHNpemUgPSAwOworICAgIAorICAgIGRvCisgICAgeworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBEc3RQcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSk7CisgICAgICAgIGlmKHBTcmNQcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YodENzckJzc2lkKSAqIHBTcmNQcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHM7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcERzdFByb2ZpbGUtPkJTU0lEcy5ic3NpZCwgc2l6ZSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRHN0UHJvZmlsZS0+QlNTSURzLm51bU9mQlNTSURzID0gcFNyY1Byb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEczsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcERzdFByb2ZpbGUtPkJTU0lEcy5ic3NpZCwgcFNyY1Byb2ZpbGUtPkJTU0lEcy5ic3NpZCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYocFNyY1Byb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YodENzclNTSURJbmZvKSAqIHBTcmNQcm9maWxlLT5TU0lEcy5udW1PZlNTSURzOworICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBEc3RQcm9maWxlLT5TU0lEcy5TU0lETGlzdCwgc2l6ZSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRHN0UHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcyA9IHBTcmNQcm9maWxlLT5TU0lEcy5udW1PZlNTSURzOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwRHN0UHJvZmlsZS0+U1NJRHMuU1NJRExpc3QsIHBTcmNQcm9maWxlLT5TU0lEcy5TU0lETGlzdCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYocFNyY1Byb2ZpbGUtPm5XUEFSZXFJRUxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBEc3RQcm9maWxlLT5wV1BBUmVxSUUsIHBTcmNQcm9maWxlLT5uV1BBUmVxSUVMZW5ndGgpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcERzdFByb2ZpbGUtPm5XUEFSZXFJRUxlbmd0aCA9IHBTcmNQcm9maWxlLT5uV1BBUmVxSUVMZW5ndGg7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBEc3RQcm9maWxlLT5wV1BBUmVxSUUsIHBTcmNQcm9maWxlLT5wV1BBUmVxSUUsIHBTcmNQcm9maWxlLT5uV1BBUmVxSUVMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmKHBTcmNQcm9maWxlLT5uUlNOUmVxSUVMZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRHN0UHJvZmlsZS0+cFJTTlJlcUlFLCBwU3JjUHJvZmlsZS0+blJTTlJlcUlFTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEc3RQcm9maWxlLT5uUlNOUmVxSUVMZW5ndGggPSBwU3JjUHJvZmlsZS0+blJTTlJlcUlFTGVuZ3RoOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwRHN0UHJvZmlsZS0+cFJTTlJlcUlFLCBwU3JjUHJvZmlsZS0+cFJTTlJlcUlFLCBwU3JjUHJvZmlsZS0+blJTTlJlcUlFTGVuZ3RoKTsKKyAgICAgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgIGlmKHBTcmNQcm9maWxlLT5uV0FQSVJlcUlFTGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcERzdFByb2ZpbGUtPnBXQVBJUmVxSUUsIHBTcmNQcm9maWxlLT5uV0FQSVJlcUlFTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEc3RQcm9maWxlLT5uV0FQSVJlcUlFTGVuZ3RoID0gcFNyY1Byb2ZpbGUtPm5XQVBJUmVxSUVMZW5ndGg7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBEc3RQcm9maWxlLT5wV0FQSVJlcUlFLCBwU3JjUHJvZmlsZS0+cFdBUElSZXFJRSwgcFNyY1Byb2ZpbGUtPm5XQVBJUmVxSUVMZW5ndGgpOworICAgICAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKworICAgICAgICBpZihwU3JjUHJvZmlsZS0+bkFkZElFU2Nhbkxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZwRHN0UHJvZmlsZS0+cEFkZElFU2NhbiwgcFNyY1Byb2ZpbGUtPm5BZGRJRVNjYW5MZW5ndGgpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcERzdFByb2ZpbGUtPm5BZGRJRVNjYW5MZW5ndGggPSBwU3JjUHJvZmlsZS0+bkFkZElFU2Nhbkxlbmd0aDsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcERzdFByb2ZpbGUtPnBBZGRJRVNjYW4sIHBTcmNQcm9maWxlLT5wQWRkSUVTY2FuLAorICAgICAgICAgICAgICAgIHBTcmNQcm9maWxlLT5uQWRkSUVTY2FuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBTcmNQcm9maWxlLT5uQWRkSUVBc3NvY0xlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZwRHN0UHJvZmlsZS0+cEFkZElFQXNzb2MsIHBTcmNQcm9maWxlLT5uQWRkSUVBc3NvY0xlbmd0aCk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRHN0UHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGggPSBwU3JjUHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGg7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBEc3RQcm9maWxlLT5wQWRkSUVBc3NvYywgcFNyY1Byb2ZpbGUtPnBBZGRJRUFzc29jLAorICAgICAgICAgICAgICAgIHBTcmNQcm9maWxlLT5uQWRkSUVBc3NvY0xlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBpZihwU3JjUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRHN0UHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QsIHBTcmNQcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEc3RQcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gcFNyY1Byb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHM7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBEc3RQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCwgcFNyY1Byb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LCBwU3JjUHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyk7CisgICAgICAgIH0KKworICAgICAgICBwRHN0UHJvZmlsZS0+QXV0aFR5cGUgPSBwU3JjUHJvZmlsZS0+QXV0aFR5cGU7CisgICAgICAgIHBEc3RQcm9maWxlLT5FbmNyeXB0aW9uVHlwZSA9IHBTcmNQcm9maWxlLT5FbmNyeXB0aW9uVHlwZTsKKyAgICAgICAgcERzdFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUgPSBwU3JjUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZTsKKyAgICAgICAgcERzdFByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlID0gcFNyY1Byb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlOworICAgICAgICBwRHN0UHJvZmlsZS0+bmVnb3RpYXRlZE1DRW5jcnlwdGlvblR5cGUgPSBwU3JjUHJvZmlsZS0+bmVnb3RpYXRlZE1DRW5jcnlwdGlvblR5cGU7CisgICAgICAgIHBEc3RQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgPSBwU3JjUHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlOworICAgICAgICBwRHN0UHJvZmlsZS0+QlNTVHlwZSA9IHBTcmNQcm9maWxlLT5CU1NUeXBlOworICAgICAgICBwRHN0UHJvZmlsZS0+cGh5TW9kZSA9IHBTcmNQcm9maWxlLT5waHlNb2RlOworICAgICAgICBwRHN0UHJvZmlsZS0+Y3NyUGVyc29uYSA9IHBTcmNQcm9maWxlLT5jc3JQZXJzb25hOworICAgICAgICAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgICAgICBpZihjc3JJc1Byb2ZpbGVXYXBpKHBTcmNQcm9maWxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgIGlmKHBEc3RQcm9maWxlLT5waHlNb2RlICYgZUNTUl9ET1QxMV9NT0RFXzExbikKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFByb2ZpbGUtPnBoeU1vZGUgJj0gfmVDU1JfRE9UMTFfTU9ERV8xMW47CisgICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyAgICAgICAgcERzdFByb2ZpbGUtPkNCTW9kZSA9IHBTcmNQcm9maWxlLT5DQk1vZGU7CisgICAgICAgIC8qU2F2ZSB0aGUgV1BTIGluZm8qLworICAgICAgICBwRHN0UHJvZmlsZS0+YldQU0Fzc29jaWF0aW9uID0gcFNyY1Byb2ZpbGUtPmJXUFNBc3NvY2lhdGlvbjsKKyAgICAgICAgcERzdFByb2ZpbGUtPnVhcHNkX21hc2sgPSBwU3JjUHJvZmlsZS0+dWFwc2RfbWFzazsKKworICAgICAgICBwRHN0UHJvZmlsZS0+YmVhY29uSW50ZXJ2YWwgPSBwU3JjUHJvZmlsZS0+YmVhY29uSW50ZXJ2YWw7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBwRHN0UHJvZmlsZS0+cHJpdmFjeSAgICAgICAgICAgPSBwU3JjUHJvZmlsZS0+cHJpdmFjeTsKKyAgICAgICAgcERzdFByb2ZpbGUtPmZ3ZFdQU1BCQ1Byb2JlUmVxID0gcFNyY1Byb2ZpbGUtPmZ3ZFdQU1BCQ1Byb2JlUmVxOworICAgICAgICBwRHN0UHJvZmlsZS0+Y3NyODAyMTFBdXRoVHlwZSAgPSBwU3JjUHJvZmlsZS0+Y3NyODAyMTFBdXRoVHlwZTsKKyAgICAgICAgcERzdFByb2ZpbGUtPmR0aW1QZXJpb2QgICAgICAgID0gcFNyY1Byb2ZpbGUtPmR0aW1QZXJpb2Q7CisgICAgICAgIHBEc3RQcm9maWxlLT5BcFVhcHNkRW5hYmxlICAgICA9IHBTcmNQcm9maWxlLT5BcFVhcHNkRW5hYmxlOyAgIAorICAgICAgICBwRHN0UHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uc3NpZEhpZGRlbiA9IHBTcmNQcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5zc2lkSGlkZGVuOworICAgICAgICBwRHN0UHJvZmlsZS0+cHJvdEVuYWJsZWQgICAgICAgPSBwU3JjUHJvZmlsZS0+cHJvdEVuYWJsZWQ7ICAKKyAgICAgICAgcERzdFByb2ZpbGUtPm9ic3NQcm90RW5hYmxlZCAgID0gcFNyY1Byb2ZpbGUtPm9ic3NQcm90RW5hYmxlZDsgIAorICAgICAgICBwRHN0UHJvZmlsZS0+Y2ZnX3Byb3RlY3Rpb24gICAgPSBwU3JjUHJvZmlsZS0+Y2ZnX3Byb3RlY3Rpb247CisgICAgICAgIHBEc3RQcm9maWxlLT53cHNfc3RhdGUgICAgICAgICA9IHBTcmNQcm9maWxlLT53cHNfc3RhdGU7CisgICAgICAgIHBEc3RQcm9maWxlLT5pZWVlODAyMTFkICAgICAgICA9IHBTcmNQcm9maWxlLT5pZWVlODAyMTFkOworI2VuZGlmCisKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcERzdFByb2ZpbGUtPktleXMsICZwU3JjUHJvZmlsZS0+S2V5cywgc2l6ZW9mKHBEc3RQcm9maWxlLT5LZXlzKSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICBpZiAocFNyY1Byb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RQcm9maWxlLT5NRElELm1kaWVQcmVzZW50ID0gMTsKKyAgICAgICAgICAgIHBEc3RQcm9maWxlLT5NRElELm1vYmlsaXR5RG9tYWluID0gcFNyY1Byb2ZpbGUtPk1ESUQubW9iaWxpdHlEb21haW47CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgfXdoaWxlKDApOworICAgIAorICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIGNzclJlbGVhc2VQcm9maWxlKHBNYWMsIHBEc3RQcm9maWxlKTsKKyAgICAgICAgcERzdFByb2ZpbGUgPSBOVUxMOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKK2VIYWxTdGF0dXMgY3NyUm9hbUNvcHlDb25uZWN0ZWRQcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwRHN0UHJvZmlsZSApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcFNyY1Byb2ZpbGUgPSAmcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGU7IAorICAgIGRvCisgICAgeworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBEc3RQcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSk7CisgICAgICAgIGlmKHBTcmNQcm9maWxlLT5ic3NpZCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBEc3RQcm9maWxlLT5CU1NJRHMuYnNzaWQsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEc3RQcm9maWxlLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSAxOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwRHN0UHJvZmlsZS0+QlNTSURzLmJzc2lkLCBwU3JjUHJvZmlsZS0+YnNzaWQsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyAgICAgICAgfQorICAgICAgICBpZihwU3JjUHJvZmlsZS0+U1NJRC5zc0lkKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcERzdFByb2ZpbGUtPlNTSURzLlNTSURMaXN0LCBzaXplb2YodENzclNTSURJbmZvKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRHN0UHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcyA9IDE7CisgICAgICAgICAgICBwRHN0UHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uaGFuZG9mZlBlcm1pdHRlZCA9IHBTcmNQcm9maWxlLT5oYW5kb2ZmUGVybWl0dGVkOworICAgICAgICAgICAgcERzdFByb2ZpbGUtPlNTSURzLlNTSURMaXN0WzBdLnNzaWRIaWRkZW4gPSBwU3JjUHJvZmlsZS0+c3NpZEhpZGRlbjsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBEc3RQcm9maWxlLT5TU0lEcy5TU0lETGlzdFswXS5TU0lELCAmcFNyY1Byb2ZpbGUtPlNTSUQsIHNpemVvZih0U2lyTWFjU1NpZCkpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBEc3RQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCwgMSk7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwRHN0UHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDE7CisgICAgICAgIHBEc3RQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXSA9IHBTcmNQcm9maWxlLT5vcGVyYXRpb25DaGFubmVsOworCisgICAgICAgIHBEc3RQcm9maWxlLT5BdXRoVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICAgICAgcERzdFByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdID0gcFNyY1Byb2ZpbGUtPkF1dGhUeXBlOworICAgICAgICBwRHN0UHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlID0gcFNyY1Byb2ZpbGUtPkF1dGhUeXBlOworICAgICAgICBwRHN0UHJvZmlsZS0+RW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgIHBEc3RQcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IHBTcmNQcm9maWxlLT5FbmNyeXB0aW9uVHlwZTsKKyAgICAgICAgcERzdFByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlID0gcFNyY1Byb2ZpbGUtPkVuY3J5cHRpb25UeXBlOworICAgICAgICBwRHN0UHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICAgICAgcERzdFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBwU3JjUHJvZmlsZS0+bWNFbmNyeXB0aW9uVHlwZTsKKyAgICAgICAgcERzdFByb2ZpbGUtPm5lZ290aWF0ZWRNQ0VuY3J5cHRpb25UeXBlID0gcFNyY1Byb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGU7CisgICAgICAgIHBEc3RQcm9maWxlLT5CU1NUeXBlID0gcFNyY1Byb2ZpbGUtPkJTU1R5cGU7CisgICAgICAgIHBEc3RQcm9maWxlLT5DQk1vZGUgPSBwU3JjUHJvZmlsZS0+Q0JNb2RlOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwRHN0UHJvZmlsZS0+S2V5cywgJnBTcmNQcm9maWxlLT5LZXlzLCBzaXplb2YocERzdFByb2ZpbGUtPktleXMpKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICBpZiAocFNyY1Byb2ZpbGUtPk1ESUQubWRpZVByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RQcm9maWxlLT5NRElELm1kaWVQcmVzZW50ID0gMTsKKyAgICAgICAgICAgIHBEc3RQcm9maWxlLT5NRElELm1vYmlsaXR5RG9tYWluID0gcFNyY1Byb2ZpbGUtPk1ESUQubW9iaWxpdHlEb21haW47CisgICAgICAgIH0KKyNlbmRpZgorICAgIAorICAgIH13aGlsZSgwKTsKKyAgICAKKyAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgeworICAgICAgICBjc3JSZWxlYXNlUHJvZmlsZShwTWFjLCBwRHN0UHJvZmlsZSk7CisgICAgICAgIHBEc3RQcm9maWxlID0gTlVMTDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlQ29ubmVjdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2NhblJlc3VsdEhhbmRsZSBoQlNTTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JSb2FtUmVhc29uIHJlYXNvbiwgdEFOSV9VMzIgcm9hbUlkLCB0QU5JX0JPT0xFQU4gZkltZWRpYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX0JPT0xFQU4gZkNsZWFyU2NhbikKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNtZUNtZCAqcENvbW1hbmQ7CisgICAgCisgICAgcENvbW1hbmQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOworICAgIGlmKE5VTEwgPT0gcENvbW1hbmQpCisgICAgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXJcbiIpICk7CisgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIGZDbGVhclNjYW4gKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JTY2FuQ2FuY2VsSWRsZVNjYW4ocE1hYyk7CisgICAgICAgICAgICBjc3JTY2FuQWJvcnRNYWNTY2FuTm90Rm9yQ29ubmVjdChwTWFjKTsKKyAgICAgICAgfQorICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLmZSZWxlYXNlUHJvZmlsZSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgaWYoTlVMTCA9PSBwUHJvZmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9XZSBjYW4gcm9hbSBub3cKKyAgICAgICAgICAgIC8vU2luY2UgcFByb2ZpbGUgaXMgTlVMTCwgd2UgbmVlZCB0byBidWlsZCBvdXIgb3duIHByb2ZpbGUsIHNldCBldmVyeXRoaW5nIHRvIGRlZmF1bHQKKyAgICAgICAgICAgIC8vV2UgY2FuIG9ubHkgc3VwcG9ydCBvcGVuIGFuZCBubyBlbmNyeXB0aW9uCisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLkF1dGhUeXBlLm51bUVudHJpZXMgPSAxOyAKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuQXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuRW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuY3NyUGVyc29uYSA9IFZPU19TVEFfTU9ERTsgCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL21ha2UgYSBjb3B5IG9mIHRoZSBwcm9maWxlCisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtQ29weVByb2ZpbGUocE1hYywgJnBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUsIHBQcm9maWxlKTsKKyAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VQcm9maWxlID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFJvYW07CisgICAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQuaEJTU0xpc3QgPSBoQlNTTGlzdDsKKyAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQgPSByb2FtSWQ7CisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IHJlYXNvbjsKKyAgICAgICAgLy9XZSBuZWVkIHRvIGZyZWUgdGhlIEJzc0xpc3Qgd2hlbiB0aGUgY29tbWFuZCBpcyBkb25lCisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VCc3NMaXN0ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQuZlVwZGF0ZUN1clJvYW1Qcm9maWxlID0gZUFOSV9CT09MRUFOX1RSVUU7CisKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIEZMKCJDU1IgUEVSU09OQT0lZCIpLAorICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS5jc3JQZXJzb25hKTsKKworICAgICAgICBzdGF0dXMgPSBjc3JRdWV1ZVNtZUNvbW1hbmQocE1hYywgcENvbW1hbmQsIGZJbWVkaWF0ZSk7CisgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyApOworICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRSb2FtKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVSZWFzc29jKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgKnBNbW9kUHJvZmlsZUZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyUm9hbVJlYXNvbiByZWFzb24sIHRBTklfVTMyIHJvYW1JZCwgdEFOSV9CT09MRUFOIGZJbWVkaWF0ZSkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNtZUNtZCAqcENvbW1hbmQ7CisgICAgCisgICAgcENvbW1hbmQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOworICAgIGlmKE5VTEwgPT0gcENvbW1hbmQpCisgICAgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXJcbiIpICk7CisgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY3NyU2NhbkNhbmNlbElkbGVTY2FuKHBNYWMpOworICAgICAgICBjc3JTY2FuQWJvcnRNYWNTY2FuTm90Rm9yQ29ubmVjdChwTWFjKTsKKyAgICAgICAgaWYocFByb2ZpbGUpCisgICAgICAgIHsKKworICAgICAgICAgICAvL1RoaXMgaXMgbGlrZWx5IHRyeWluZyB0byByZWFzc29jIHRvIGRpZmZlcmVudCBwcm9maWxlCisgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VQcm9maWxlID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAvL21ha2UgYSBjb3B5IG9mIHRoZSBwcm9maWxlCisgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Db3B5UHJvZmlsZShwTWFjLCAmcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSwgcFByb2ZpbGUpOworICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLmZVcGRhdGVDdXJSb2FtUHJvZmlsZSA9IGVBTklfQk9PTEVBTl9UUlVFOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtQ29weUNvbm5lY3RlZFByb2ZpbGUocE1hYywgc2Vzc2lvbklkLCAmcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSk7CisgICAgICAgICAgICAvL2hvdyB0byB1cGRhdGUgV1BBL1dQQTIgaW5mbyBpbiByb2FtUHJvZmlsZT8/CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLnVhcHNkX21hc2sgPSBwTW1vZFByb2ZpbGVGaWVsZHMtPnVhcHNkX21hc2s7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VQcm9maWxlID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFJvYW07CisgICAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkID0gcm9hbUlkOworICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSByZWFzb247CisgICAgICAgIC8vV2UgbmVlZCB0byBmcmVlIHRoZSBCc3NMaXN0IHdoZW4gdGhlIGNvbW1hbmQgaXMgZG9uZQorICAgICAgICAvL0ZvciByZWFzc29jIHRoZXJlIGlzIG5vIEJTUyBsaXN0LCBzbyB0aGUgYm9vbGVhbiBzZXQgdG8gZmFsc2UKKyAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5oQlNTTGlzdCA9IENTUl9JTlZBTElEX1NDQU5SRVNVTFRfSEFORExFOyAKKyAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5mUmVsZWFzZUJzc0xpc3QgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQuZlJlYXNzb2MgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKworICAgICAgICBzdGF0dXMgPSBjc3JRdWV1ZVNtZUNvbW1hbmQocE1hYywgcENvbW1hbmQsIGZJbWVkaWF0ZSk7CisgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzICk7CisgICAgICAgICAgICBjc3JSb2FtQ29tcGxldGlvbihwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIHBDb21tYW5kLCBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZFJvYW0oIHBNYWMsIHBDb21tYW5kICk7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1Db25uZWN0V2l0aEJTU0xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2NhblJlc3VsdEhhbmRsZSBoQnNzTGlzdEluLCB0QU5JX1UzMiAqcFJvYW1JZCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdFNjYW5SZXN1bHRIYW5kbGUgaEJTU0xpc3Q7CisgICAgdEFOSV9VMzIgcm9hbUlkID0gMDsKKworICAgIHN0YXR1cyA9IGNzclNjYW5Db3B5UmVzdWx0TGlzdChwTWFjLCBoQnNzTGlzdEluLCAmaEJTU0xpc3QpOworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAgcm9hbUlkID0gR0VUX05FWFRfUk9BTV9JRCgmcE1hYy0+cm9hbSk7CisgICAgICAgIGlmKHBSb2FtSWQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwUm9hbUlkID0gcm9hbUlkOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZUNvbm5lY3QocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgaEJTU0xpc3QsIGVDc3JIZGRJc3N1ZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1JZCwgZUFOSV9CT09MRUFOX0ZBTFNFLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiZmFpbGVkIHRvIHN0YXJ0IGEgam9pbiBwcm9jZXNzXG4iKSk7CisgICAgICAgICAgICBjc3JTY2FuUmVzdWx0UHVyZ2UocE1hYywgaEJTU0xpc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbUNvbm5lY3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdFNjYW5SZXN1bHRIYW5kbGUgaEJzc0xpc3RJbiwgdEFOSV9VMzIgKnBSb2FtSWQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhCU1NMaXN0OworICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwU2NhbkZpbHRlcjsKKyAgICB0QU5JX1UzMiByb2FtSWQgPSAwOworICAgIHRBTklfQk9PTEVBTiBmQ2FsbENhbGxiYWNrID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgaWYgKE5VTEwgPT0gcFByb2ZpbGUpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HUCwgRkwoIk5vIHByb2ZpbGUgc3BlY2lmaWVkIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBzbXNMb2cocE1hYywgTE9HMSwgRkwoImNhbGxlZCAgQlNTVHlwZSA9ICVkIGF1dGh0eXBlID0gJWQgIGVuY3J5VHlwZSA9ICVkXG4iKSwKKyAgICAgICAgICAgICAgICBwUHJvZmlsZS0+QlNTVHlwZSwgcFByb2ZpbGUtPkF1dGhUeXBlLmF1dGhUeXBlWzBdLCBwUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0pOworCisgICAgaWYoIENTUl9JU19XRFMoIHBQcm9maWxlICkgJiYgCisgICAgICAgICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyA9IGNzcklzQlRBTVBBbGxvd2VkKCBwTWFjLCBwUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbCApICkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgY3NyUm9hbUNhbmNlbFJvYW1pbmcocE1hYywgc2Vzc2lvbklkKTsKKyAgICBjc3JTY2FuUmVtb3ZlRnJlc2hTY2FuQ29tbWFuZChwTWFjLCBzZXNzaW9uSWQpOworICAgIGNzclNjYW5DYW5jZWxJZGxlU2NhbihwTWFjKTsKKyAgICAvL09ubHkgYWJvcnQgdGhlIHNjYW4gaWYgaXQgaXMgbm90IHVzZWQgZm9yIG90aGVyIHJvYW0vY29ubmVjdCBwdXJwb3NlCisgICAgY3NyU2NhbkFib3J0TWFjU2NhbihwTWFjKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBpZiAoIXZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSAmJiAoVk9TX1NUQV9TQVBfTU9ERSA9PSBwUHJvZmlsZS0+Y3NyUGVyc29uYSkpLy9JbiBjYXNlIG9mIEFQIG1vZGUgd2UgZG8gbm90IHdhbnQgaWRsZSBtb2RlIHNjYW4KKyAgICB7CisgICAgICAgIGNzclNjYW5EaXNhYmxlKHBNYWMpOworICAgIH0KKyNlbmRpZgorCisgICAgY3NyUm9hbVJlbW92ZUR1cGxpY2F0ZUNvbW1hbmQocE1hYywgc2Vzc2lvbklkLCBOVUxMLCBlQ3NySGRkSXNzdWVkKTsKKyAgICAvL0NoZWNrIHdoZXRoZXIgc3NpZCBjaGFuZ2VzCisgICAgaWYoY3NySXNDb25uU3RhdGVDb25uZWN0ZWQocE1hYywgc2Vzc2lvbklkKSkKKyAgICB7CisgICAgICAgIGlmKHBQcm9maWxlLT5TU0lEcy5udW1PZlNTSURzICYmICFjc3JJc1NzaWRJbkxpc3QocE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLlNTSUQsICZwUHJvZmlsZS0+U1NJRHMpKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JSb2FtSXNzdWVEaXNhc3NvY2lhdGVDbWQocE1hYywgc2Vzc2lvbklkLCBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEKTsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQlRBTVBfVVRfUkYKKyAgICBwU2Vzc2lvbi0+bWF4UmV0cnlDb3VudCA9IENTUl9KT0lOX01BWF9SRVRSWV9DT1VOVDsgCisjZW5kaWYKKyAgICBpZihDU1JfSU5WQUxJRF9TQ0FOUkVTVUxUX0hBTkRMRSAhPSBoQnNzTGlzdEluKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJpcyBjYWxsZWQgd2l0aCBCU1NMaXN0XG4iKSk7CisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Db25uZWN0V2l0aEJTU0xpc3QocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgaEJzc0xpc3RJbiwgcFJvYW1JZCk7CisgICAgICAgIGlmKHBSb2FtSWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvYW1JZCA9ICpwUm9hbUlkOworICAgICAgICB9CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgZkNhbGxDYWxsYmFjayA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKyAgICAgICAgICAgIC8vVHJ5IHRvIGNvbm5lY3QgdG8gYW55IEJTUworICAgICAgICAgICAgaWYoTlVMTCA9PSBwUHJvZmlsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL05vIGVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICBwU2NhbkZpbHRlci0+RW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgICAgICAgICAgcFNjYW5GaWx0ZXItPkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyAgICAgICAgICAgIH0vL3dlIGRvbid0IGhhdmUgYSBwcm9maWxlCisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vSGVyZSBpcyB0aGUgcHJvZmlsZSB3ZSBuZWVkIHRvIGNvbm5lY3QgdG8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJlcGFyZUZpbHRlckZyb21Qcm9maWxlKHBNYWMsIHBQcm9maWxlLCBwU2NhbkZpbHRlcik7CisgICAgICAgICAgICB9Ly9XZSBoYXZlIGEgcHJvZmlsZQorICAgICAgICAgICAgcm9hbUlkID0gR0VUX05FWFRfUk9BTV9JRCgmcE1hYy0+cm9hbSk7CisgICAgICAgICAgICBpZihwUm9hbUlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwUm9hbUlkID0gcm9hbUlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlNhdmUgdGhlIFdQUyBpbmZvKi8KKyAgICAgICAgICAgICAgICBpZihOVUxMICE9IHBQcm9maWxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFNjYW5GaWx0ZXItPmJXUFNBc3NvY2lhdGlvbiA9IHBQcm9maWxlLT5iV1BTQXNzb2NpYXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5iV1BTQXNzb2NpYXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggKHBQcm9maWxlICYmIENTUl9JU19XRFNfQVAoIHBQcm9maWxlICkgKQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICAgICAgIHx8IChwUHJvZmlsZSAmJiBDU1JfSVNfSU5GUkFfQVAgKCBwUHJvZmlsZSApKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGlzIGNhbiBiZSBzdGFydCByaWdodCBhd2F5CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVDb25uZWN0KHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIE5VTEwsIGVDc3JIZGRJc3N1ZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1JZCwgZUFOSV9CT09MRUFOX0ZBTFNFLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDYWxsQ2FsbGJhY2sgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyU2NhbkdldFJlc3VsdChwTWFjLCBwU2NhbkZpbHRlciwgJmhCU1NMaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICIqKioqKioqKioqKiogY3NyU2NhbkdldFJlc3VsdCBTdGF0dXMgKioqKioqKioqICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVDb25uZWN0KHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIGhCU1NMaXN0LCBlQ3NySGRkSXNzdWVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2FtSWQsIGVBTklfQk9PTEVBTl9GQUxTRSwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JTY2FuUmVzdWx0UHVyZ2UocE1hYywgaEJTU0xpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDYWxsQ2FsbGJhY2sgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfS8vSGF2ZSBzY2FuIHJlc3VsdAorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKE5VTEwgIT0gcFByb2ZpbGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgd2hldGhlciBpdCBpcyBmb3Igc3RhcnQgaWJzcworICAgICAgICAgICAgICAgICAgICAgICAgaWYoQ1NSX0lTX1NUQVJUX0lCU1MocFByb2ZpbGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZUNvbm5lY3QocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgTlVMTCwgZUNzckhkZElzc3VlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1JZCwgZUFOSV9CT09MRUFOX0ZBTFNFLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiICAgQ1NSIGZhaWxlZCB0byBpc3N1ZSBzdGFydElCU1MgY29tbWFuZCB3aXRoIHN0YXR1cyA9IDB4JTA4WFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNhbGxDYWxsYmFjayA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NjYW4gZm9yIHRoaXMgU1NJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclNjYW5Gb3JTU0lEKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIHJvYW1JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNhbGxDYWxsYmFjayA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZDYWxsQ2FsbGJhY2sgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApOworICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gcFByb2ZpbGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL3dlIG5lZWQgdG8gZnJlZSBtZW1vcnkgZm9yIGZpbHRlciBpZiBwcm9maWxlIGV4aXN0cworICAgICAgICAgICAgICAgICAgICBjc3JGcmVlU2NhbkZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS8vR290IHRoZSBzY2FuIGZpbHRlciBmcm9tIHByb2ZpbGUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlcik7CisgICAgICAgIH0vL2FsbG9jYXRlZCBtZW1vcnkgZm9yIHBTY2FuRmlsdGVyCisgICAgfS8vTm8gQnNzbGlzdCBjb21pbmcgaW4KKyAgICAvL3RlbGwgdGhlIGNhbGxlciBpZiB3ZSBmYWlsIHRvIHRyaWdnZXIgYSBqb2luIHJlcXVlc3QKKyAgICBpZiggZkNhbGxDYWxsYmFjayApCisgICAgeworICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgcm9hbUlkLCBlQ1NSX1JPQU1fRkFJTEVELCBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworICAgIH0KKyAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgCisKK2VIYWxTdGF0dXMgY3NyUm9hbVJlYXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgbW9kUHJvZmlsZUZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBSb2FtSWQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0QU5JX0JPT0xFQU4gZkNhbGxDYWxsYmFjayA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgdEFOSV9VMzIgcm9hbUlkID0gMDsKKyAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICBpZiAoTlVMTCA9PSBwUHJvZmlsZSkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dQLCBGTCgiTm8gcHJvZmlsZSBzcGVjaWZpZWQiKSk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgc21zTG9nKHBNYWMsIExPRzEsIEZMKCJjYWxsZWQgIEJTU1R5cGUgPSAlZCBhdXRodHlwZSA9ICVkICBlbmNyeVR5cGUgPSAlZFxuIiksIHBQcm9maWxlLT5CU1NUeXBlLCBwUHJvZmlsZS0+QXV0aFR5cGUuYXV0aFR5cGVbMF0sIHBQcm9maWxlLT5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSk7CisgICBjc3JSb2FtQ2FuY2VsUm9hbWluZyhwTWFjLCBzZXNzaW9uSWQpOworICAgY3NyU2NhblJlbW92ZUZyZXNoU2NhbkNvbW1hbmQocE1hYywgc2Vzc2lvbklkKTsKKyAgIGNzclNjYW5DYW5jZWxJZGxlU2NhbihwTWFjKTsKKyAgIGNzclNjYW5BYm9ydE1hY1NjYW5Ob3RGb3JDb25uZWN0KHBNYWMpOworICAgY3NyUm9hbVJlbW92ZUR1cGxpY2F0ZUNvbW1hbmQocE1hYywgc2Vzc2lvbklkLCBOVUxMLCBlQ3NySGRkSXNzdWVkUmVhc3NvY1RvU2FtZUFQKTsKKworICAgaWYoY3NySXNDb25uU3RhdGVDb25uZWN0ZWQocE1hYywgc2Vzc2lvbklkKSkKKyAgIHsKKyAgICAgIGlmKHBQcm9maWxlKQorICAgICAgeworICAgICAgICAgaWYocFByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMgJiYgCisgICAgICAgICAgICBjc3JJc1NzaWRJbkxpc3QocE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLlNTSUQsICZwUHJvZmlsZS0+U1NJRHMpKQorICAgICAgICAgeworICAgICAgICAgICAgZkNhbGxDYWxsYmFjayA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgiTm90IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBTU0lEIGFza2VkIGluIHRoZSBwcm9maWxlXG4iKSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmKCFwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCAmbW9kUHJvZmlsZUZpZWxkcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUubW9kaWZ5UHJvZmlsZUZpZWxkcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzKSkpCisgICAgICB7CisgICAgICAgICBmQ2FsbENhbGxiYWNrID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsIEZMKCJFaXRoZXIgdGhlIHByb2ZpbGUgaXMgTlVMTCBvciBub25lIG9mIHRoZSBmaWVsZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgZ290IG1vZGlmaWVkXG4iKSk7CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HMSwgRkwoIk5vdCBjb25uZWN0ZWQhIE5vIG5lZWQgdG8gcmVhc3NvY1xuIikpOworICAgfQorCisgICBpZighZkNhbGxDYWxsYmFjaykKKyAgIHsKKyAgICAgIHJvYW1JZCA9IEdFVF9ORVhUX1JPQU1fSUQoJnBNYWMtPnJvYW0pOworICAgICAgaWYocFJvYW1JZCkKKyAgICAgIHsKKyAgICAgICAgICpwUm9hbUlkID0gcm9hbUlkOworICAgICAgfQorCisKKyAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZVJlYXNzb2MocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgJm1vZFByb2ZpbGVGaWVsZHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NySGRkSXNzdWVkUmVhc3NvY1RvU2FtZUFQLCByb2FtSWQsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN0YXR1cyA9IGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBOVUxMLCByb2FtSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fRkFJTEVELCBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCitlSGFsU3RhdHVzIGNzclJvYW1Kb2luTGFzdFByb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0U2NhblJlc3VsdEhhbmRsZSBoQlNTTGlzdCA9IE5VTEw7CisgICAgdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyID0gTlVMTDsKKyAgICB0QU5JX1UzMiByb2FtSWQ7CisgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSA9IE5VTEw7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyU2NhbkNhbmNlbElkbGVTY2FuKHBNYWMpOworICAgICAgICAgICAgY3NyU2NhbkFib3J0TWFjU2Nhbk5vdEZvckNvbm5lY3QocE1hYyk7CisgICAgICAgICAgICAvL1dlIGhhdmUgdG8gbWFrZSBhIGNvcHkgb2YgcEN1clJvYW1Qcm9maWxlIGJlY2F1c2UgaXQgd2lsbCBiZSBmcmVlIGluc2lkZSBjc3JSb2FtSXNzdWVDb25uZWN0CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFByb2ZpbGUsIHNpemVvZih0Q3NyUm9hbVByb2ZpbGUpKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcFByb2ZpbGUsIHNpemVvZih0Q3NyUm9hbVByb2ZpbGUpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Db3B5UHJvZmlsZShwTWFjLCBwUHJvZmlsZSwgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNjYW5GaWx0ZXIsIHNpemVvZih0Q3NyU2NhblJlc3VsdEZpbHRlcikpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJlcGFyZUZpbHRlckZyb21Qcm9maWxlKHBNYWMsIHBQcm9maWxlLCBwU2NhbkZpbHRlcik7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByb2FtSWQgPSBHRVRfTkVYVF9ST0FNX0lEKCZwTWFjLT5yb2FtKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclNjYW5HZXRSZXN1bHQocE1hYywgcFNjYW5GaWx0ZXIsICZoQlNTTGlzdCk7CisgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3dlIHdhbnQgdG8gcHV0IHRoZSBsYXN0IGNvbm5lY3RlZCBCU1MgdG8gdGhlIHZlcnkgYmVnaW5uaW5nLCBpZiBwb3NzaWJsZQorICAgICAgICAgICAgICAgIGNzck1vdmVCc3NUb0hlYWRGcm9tQlNTSUQocE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLCBoQlNTTGlzdCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlQ29ubmVjdChwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCBoQlNTTGlzdCwgZUNzckhkZElzc3VlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2FtSWQsIGVBTklfQk9PTEVBTl9GQUxTRSwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjc3JTY2FuUmVzdWx0UHVyZ2UocE1hYywgaEJTU0xpc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9EbyBhIHNjYW4gb24gdGhpcyBwcm9maWxlCisgICAgICAgICAgICAgICAgLy9zY2FuIGZvciB0aGlzIFNTSUQgb25seSBpbiBjYXNlIHRoZSBBUCBzdXBwcmVzc2VzIFNTSUQKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JTY2FuRm9yU1NJRChwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCByb2FtSWQpOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS8vV2UgaGF2ZSBhIHByb2ZpbGUKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoImNhbm5vdCBmaW5kIGEgcm9hbWluZyBwcm9maWxlXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKyAgICBpZihwU2NhbkZpbHRlcikKKyAgICB7CisgICAgICAgIGNzckZyZWVTY2FuRmlsdGVyKHBNYWMsIHBTY2FuRmlsdGVyKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlcik7CisgICAgfQorICAgIGlmKE5VTEwgIT0gcFByb2ZpbGUpCisgICAgeworICAgICAgICBjc3JSZWxlYXNlUHJvZmlsZShwTWFjLCBwUHJvZmlsZSk7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFByb2ZpbGUpOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworZUhhbFN0YXR1cyBjc3JSb2FtUmVjb25uZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisKKyAgICBpZihjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlRGlzYXNzb2NpYXRlQ21kKHBNYWMsIHNlc3Npb25JZCwgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSm9pbkxhc3RQcm9maWxlKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtQ29ubmVjdFRvTGFzdFByb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiaXMgY2FsbGVkXG4iKSk7CisgICAgY3NyUm9hbUNhbmNlbFJvYW1pbmcocE1hYywgc2Vzc2lvbklkKTsKKyAgICBjc3JSb2FtUmVtb3ZlRHVwbGljYXRlQ29tbWFuZChwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIGVDc3JIZGRJc3N1ZWQpOworICAgIGlmKGNzcklzQ29ublN0YXRlRGlzY29ubmVjdGVkKHBNYWMsIHNlc3Npb25JZCkpCisgICAgeworICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSm9pbkxhc3RQcm9maWxlKHBNYWMsIHNlc3Npb25JZCk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbVByb2Nlc3NEaXNhc3NvY0RlYXV0aCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIHRBTklfQk9PTEVBTiBmRGlzYXNzb2MsIHRBTklfQk9PTEVBTiBmTUlDRmFpbHVyZSApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRBTklfQk9PTEVBTiBmQ29tcGxldGUgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgZUNzclJvYW1TdWJTdGF0ZSBOZXdTdWJzdGF0ZTsKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQgPSBwQ29tbWFuZC0+c2Vzc2lvbklkOworICAgIAorICAgIC8vIGNoYW5nZSBzdGF0ZSB0byAnUm9hbWluZycuLi4KKyAgICBjc3JSb2FtU3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9KT0lOSU5HLCBzZXNzaW9uSWQgKTsKKworICAgIGlmICggY3NySXNDb25uU3RhdGVJYnNzKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgeworICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gYW4gSUJTUywgdGhlbiBzdG9wIHRoZSBJQlNTLi4uCisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZVN0b3BCc3MoIHBNYWMsIHNlc3Npb25JZCwgZUNTUl9ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUSApOworICAgICAgICBmQ29tcGxldGUgPSAoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGNzcklzQ29ublN0YXRlSW5mcmEoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIHJlc3RvcmUgQUMgd2VpZ2h0cyAoJWQtJWQtJWQtJWQpXG4iKSwgcE1hYy0+cm9hbS51Y0FDV2VpZ2h0c1swXSwgcE1hYy0+cm9hbS51Y0FDV2VpZ2h0c1sxXSwKKyAgICAgICAgICAgIHBNYWMtPnJvYW0udWNBQ1dlaWdodHNbMl0sIHBNYWMtPnJvYW0udWNBQ1dlaWdodHNbM10pOworICAgICAgICAvL1Jlc3RvcmUgQUMgd2VpZ2h0IGluIGNhc2Ugd2UgY2hhbmdlIGl0IAorICAgICAgICBXTEFOVExfU2V0QUNXZWlnaHRzKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsIHBNYWMtPnJvYW0udWNBQ1dlaWdodHMpOworICAgICAgICAvLyBpbiBJbmZyYXN0dXJjdHVyZSwgd2UgbmVlZCB0byBkaXNhc3NvY2lhdGUgZnJvbSB0aGUgSW5mcmFzdHJ1Y3R1cmUgbmV0d29yay4uLgorICAgICAgICBOZXdTdWJzdGF0ZSA9IGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19GT1JDRUQ7CisgICAgICAgIGlmKGVDc3JTbWVJc3N1ZWREaXNhc3NvY0ZvckhhbmRvZmYgPT0gcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBOZXdTdWJzdGF0ZSA9IGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19IQU5ET0ZGOworICAgICAgICB9CisgICAgICAgIGlmKCBmRGlzYXNzb2MgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVEaXNhc3NvY2lhdGUoIHBNYWMsIHNlc3Npb25JZCwgTmV3U3Vic3RhdGUsIGZNSUNGYWlsdXJlICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVEZWF1dGgoIHBNYWMsIHNlc3Npb25JZCwgZUNTUl9ST0FNX1NVQlNUQVRFX0RFQVVUSF9SRVEgKTsKKyAgICAgICAgfQorICAgICAgICBmQ29tcGxldGUgPSAoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGNzcklzQ29ublN0YXRlV2RzKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgeworICAgICAgICBpZiggQ1NSX0lTX1dEU19BUCggJnBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0ZWRQcm9maWxlICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVTdG9wQnNzKCBwTWFjLCBzZXNzaW9uSWQsIGVDU1JfUk9BTV9TVUJTVEFURV9TVE9QX0JTU19SRVEgKTsKKyAgICAgICAgICAgIGZDb21wbGV0ZSA9ICghSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpOworICAgICAgICB9CisgICAgICAgIC8vVGhpcyBoYXMgdG8gYmUgV0RTIHN0YXRpb24KKyAgICAgICAgZWxzZSAgaWYoIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkV2RzKCBwTWFjLCBzZXNzaW9uSWQgKSApIC8vVGhpcyBoYXMgdG8gYmUgV0RTIHN0YXRpb24KKyAgICAgICAgeworIAorICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5mU3RvcFdkcyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgaWYoIGZEaXNhc3NvYyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlRGlzYXNzb2NpYXRlKCBwTWFjLCBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQ09OTkVDVF9DT05USU5VRV9ST0FNSU5HLCBmTUlDRmFpbHVyZSApOworICAgICAgICAgICAgICAgIGZDb21wbGV0ZSA9ICghSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gd2UgZ290IGEgZGlzLWFzc29jIHJlcXVlc3Qgd2hpbGUgbm90IGNvbm5lY3RlZCB0byBhbnkgcGVlcgorICAgICAgICAvLyBqdXN0IGNvbXBsZXRlIHRoZSBjb21tYW5kCisgICAgICAgICAgIGZDb21wbGV0ZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKyAgICBpZihmQ29tcGxldGUpCisgICAgeworICAgICAgICBjc3JSb2FtQ29tcGxldGUoIHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMICk7CisgICAgfQorCisgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgeworICAgICAgICBpZiAoIGNzcklzQ29ublN0YXRlSW5mcmEoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TZXQgdGhlIHN0YXRlIHRvIGRpc2Nvbm5lY3QgaGVyZSAKKyAgICAgICAgICAgIHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGUgPSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfTk9UX0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworLyogVGhpcyBpcyBiZWVuIHJlbW92ZWQgZnJvbSBsYXRlc3QgY29kZSBiYXNlICovCisvKgorc3RhdGljIGVIYWxTdGF0dXMgY3NyUm9hbVByb2Nlc3NTdG9wQnNzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsKKworICAgIGNzclJvYW1TdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5JTkcgKTsKKyAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVTdG9wQnNzKCBwTWFjLCBzZXNzaW9uSWQsIGVDU1JfUk9BTV9TVUJTVEFURV9TVE9QX0JTU19SRVEgKTsKKworICAgIHJldHVybiAoIHN0YXR1cyApOworfQorKi8KKworCitlSGFsU3RhdHVzIGNzclJvYW1Jc3N1ZURpc2Fzc29jaWF0ZUNtZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCBlQ3NyUm9hbURpc2Nvbm5lY3RSZWFzb24gcmVhc29uICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNtZUNtZCAqcENvbW1hbmQ7CisgICAgICAgIHRBTklfQk9PTEVBTiBmSGlnaFByaW9yaXR5ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiAgcmVhc29uID0gJWRcbiIpLCByZWFzb24gKTsKKyAgICAgICAgcENvbW1hbmQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKCBwTWFjICk7CisgICAgICAgIGlmICggIXBDb21tYW5kICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIGdldCBjb21tYW5kIGJ1ZmZlclxuIikgKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vQ2hhbmdlIHRoZSBzdWJzdGF0ZSBpbiBjYXNlIGl0IGlzIHdhaXQtZm9yLWtleQorICAgICAgICBpZiggQ1NSX0lTX1dBSVRfRk9SX0tFWSggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JSb2FtU3RvcFdhaXRGb3JLZXlUaW1lciggcE1hYyApOworICAgICAgICAgICAgY3NyUm9hbVN1YnN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1fU1VCU1RBVEVfTk9ORSwgc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgICAgICBwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kUm9hbTsKKyAgICAgICAgcENvbW1hbmQtPnNlc3Npb25JZCA9ICh0QU5JX1U4KXNlc3Npb25JZDsKKyAgICAgICAgc3dpdGNoICggcmVhc29uICkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fTUlDX0VSUk9SOgorICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uID0gZUNzckZvcmNlZERpc2Fzc29jTUlDRmFpbHVyZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9ERUFVVEg6CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSBlQ3NyRm9yY2VkRGVhdXRoOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0hBTkRPRkY6CisgICAgICAgICAgICBmSGlnaFByaW9yaXR5ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSBlQ3NyU21lSXNzdWVkRGlzYXNzb2NGb3JIYW5kb2ZmOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX1VOU1BFQ0lGSUVEOgorICAgICAgICBjYXNlIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fRElTQVNTT0M6CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSBlQ3NyRm9yY2VkRGlzYXNzb2M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fSUJTU19KT0lOX0ZBSUxVUkU6CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSBlQ3NyU21lSXNzdWVkSWJzc0pvaW5GYWlsdXJlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0lCU1NfTEVBVkU6CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSBlQ3NyRm9yY2VkSWJzc0xlYXZlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwQ29tbWFuZCwgZkhpZ2hQcmlvcml0eSk7CisgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyApOworICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRSb2FtKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICB9CisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1Jc3N1ZVN0b3BCc3NDbWQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9CT09MRUFOIGZIaWdoUHJpb3JpdHkgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0U21lQ21kICpwQ29tbWFuZDsKKworICAgIHBDb21tYW5kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlciggcE1hYyApOworICAgIGlmICggTlVMTCAhPSBwQ29tbWFuZCApIAorICAgIHsKKyAgICAgICAgLy9DaGFuZ2UgdGhlIHN1YnN0YXRlIGluIGNhc2UgaXQgaXMgd2FpdC1mb3Ita2V5CisgICAgICAgIGlmKCBDU1JfSVNfV0FJVF9GT1JfS0VZKCBwTWFjLCBzZXNzaW9uSWQpICkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyUm9hbVN0b3BXYWl0Rm9yS2V5VGltZXIoIHBNYWMgKTsKKyAgICAgICAgICAgIGNzclJvYW1TdWJzdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX05PTkUsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFJvYW07CisgICAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IGVDc3JTdG9wQnNzOworICAgICAgICBzdGF0dXMgPSBjc3JRdWV1ZVNtZUNvbW1hbmQocE1hYywgcENvbW1hbmQsIGZIaWdoUHJpb3JpdHkpOworICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBzZW5kIG1lc3NhZ2Ugc3RhdHVzID0gJWRcbiIpLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIGNzclJlbGVhc2VDb21tYW5kUm9hbSggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXJcbiIpICk7CisgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICB9CisKKyAgICByZXR1cm4gKCBzdGF0dXMgKTsKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1EaXNjb25uZWN0SW50ZXJuYWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCBlQ3NyUm9hbURpc2Nvbm5lY3RSZWFzb24gcmVhc29uKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQlRBTVBfVVRfUkYKKyAgICAvL1N0b3AgdGUgcmV0cnkKKyAgICBwU2Vzc2lvbi0+bWF4UmV0cnlDb3VudCA9IDA7CisgICAgY3NyUm9hbVN0b3BKb2luUmV0cnlUaW1lcihwTWFjLCBzZXNzaW9uSWQpOworI2VuZGlmCisgICAgLy9Ob3QgdG8gY2FsbCBjYW5jZWwgcm9hbWluZyBoZXJlCisgICAgLy9Pbmx5IGlzc3VlIGRpc2Nvbm5lY3Qgd2hlbiBuZWNlc3NhcnkKKyAgICBpZihjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpIHx8IGNzcklzQnNzVHlwZUlCU1MocFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuQlNTVHlwZSkgCisgICAgICAgICAgICAgICAgfHwgY3NySXNCc3NUeXBlV0RTKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGUpIAorICAgICAgICAgICAgICAgIHx8IGNzcklzUm9hbUNvbW1hbmRXYWl0aW5nRm9yU2Vzc2lvbihwTWFjLCBzZXNzaW9uSWQpICkKKyAgICAgICAgICAgICAgICAKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiY2FsbGVkXG4iKSk7CisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZURpc2Fzc29jaWF0ZUNtZChwTWFjLCBzZXNzaW9uSWQsIHJlYXNvbik7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbURpc2Nvbm5lY3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCBlQ3NyUm9hbURpc2Nvbm5lY3RSZWFzb24gcmVhc29uKQoreworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgY3NyUm9hbUNhbmNlbFJvYW1pbmcocE1hYywgc2Vzc2lvbklkKTsKKyAgICBwU2Vzc2lvbi0+aWJzc19qb2luX3BlbmRpbmcgPSBGQUxTRTsKKyAgICBjc3JSb2FtU3RvcElic3NKb2luVGltZXIocE1hYywgc2Vzc2lvbklkKTsKKyAgICBjc3JSb2FtUmVtb3ZlRHVwbGljYXRlQ29tbWFuZChwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIGVDc3JGb3JjZWREaXNhc3NvYyk7CisgICAgCisgICAgcmV0dXJuIChjc3JSb2FtRGlzY29ubmVjdEludGVybmFsKHBNYWMsIHNlc3Npb25JZCwgcmVhc29uKSk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtU2F2ZUNvbm5lY3RlZEluZm9tYXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXNUZW1wID0gcEllczsKKyAgICB0QU5JX1U4IGluZGV4OworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcENvbm5lY3RQcm9maWxlID0gJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworICAgIAorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLCBzaXplb2YodENzclJvYW1Db25uZWN0ZWRQcm9maWxlKSk7CisgICAgcENvbm5lY3RQcm9maWxlLT5BdXRoVHlwZSA9IHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGU7CisgICAgICAgIHBDb25uZWN0UHJvZmlsZS0+QXV0aEluZm8gPSBwUHJvZmlsZS0+QXV0aFR5cGU7CisgICAgcENvbm5lY3RQcm9maWxlLT5DQk1vZGUgPSBwUHJvZmlsZS0+Q0JNb2RlOyAgLy8qKiogdGhpcyBtYXkgbm90IGJlIHZhbGlkCisgICAgcENvbm5lY3RQcm9maWxlLT5FbmNyeXB0aW9uVHlwZSA9IHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZTsKKyAgICAgICAgcENvbm5lY3RQcm9maWxlLT5FbmNyeXB0aW9uSW5mbyA9IHBQcm9maWxlLT5FbmNyeXB0aW9uVHlwZTsKKyAgICBwQ29ubmVjdFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUgPSBwUHJvZmlsZS0+bmVnb3RpYXRlZE1DRW5jcnlwdGlvblR5cGU7CisgICAgICAgIHBDb25uZWN0UHJvZmlsZS0+bWNFbmNyeXB0aW9uSW5mbyA9IHBQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlOworICAgIHBDb25uZWN0UHJvZmlsZS0+QlNTVHlwZSA9IHBQcm9maWxlLT5CU1NUeXBlOworICAgIHBDb25uZWN0UHJvZmlsZS0+bW9kaWZ5UHJvZmlsZUZpZWxkcy51YXBzZF9tYXNrID0gcFByb2ZpbGUtPnVhcHNkX21hc2s7CisgICAgcENvbm5lY3RQcm9maWxlLT5vcGVyYXRpb25DaGFubmVsID0gcFNpckJzc0Rlc2MtPmNoYW5uZWxJZDsKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwQ29ubmVjdFByb2ZpbGUtPktleXMsICZwUHJvZmlsZS0+S2V5cywgc2l6ZW9mKHRDc3JLZXlzKSk7CisgICAgLy9TYXZlIGJzc2lkCisgICAgY3NyR2V0QnNzSWRCc3NEZXNjKHBNYWMsIHBTaXJCc3NEZXNjLCAmcENvbm5lY3RQcm9maWxlLT5ic3NpZCk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBpZiAocFNpckJzc0Rlc2MtPm1kaWVQcmVzZW50KQorICAgIHsKKyAgICAgICAgcENvbm5lY3RQcm9maWxlLT5NRElELm1kaWVQcmVzZW50ID0gMTsKKyAgICAgICAgcENvbm5lY3RQcm9maWxlLT5NRElELm1vYmlsaXR5RG9tYWluID0gKHBTaXJCc3NEZXNjLT5tZGllWzFdIDw8IDgpIHwgKHBTaXJCc3NEZXNjLT5tZGllWzBdKTsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgaWYgKChjc3JJc1Byb2ZpbGVDQ1gocFByb2ZpbGUpIHx8ICgocEllc1RlbXAtPkNDWFZlcnNpb24ucHJlc2VudCkgJiYgKChwUHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlID09IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNKSB8fCAocFByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9XUEEpKSkpICYmICghKGNzcklzUHJvZmlsZTExciggcFByb2ZpbGUgKSkpICYmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzQ2N4SW5pRmVhdHVyZUVuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcENvbm5lY3RQcm9maWxlLT5pc0NDWEFzc29jID0gMTsKKyAgICB9CisjZW5kaWYKKyAgICAvL3NhdmUgc3NpZAorICAgIGlmKCBOVUxMID09IHBJZXNUZW1wICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsIHBTaXJCc3NEZXNjLCAmcEllc1RlbXApOworICAgIH0KKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIGlmKHBJZXNUZW1wLT5TU0lELnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBDb25uZWN0UHJvZmlsZS0+U1NJRC5sZW5ndGggPSBwSWVzVGVtcC0+U1NJRC5udW1fc3NpZDsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcENvbm5lY3RQcm9maWxlLT5TU0lELnNzSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZXNUZW1wLT5TU0lELnNzaWQsIHBJZXNUZW1wLT5TU0lELm51bV9zc2lkKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy9TYXZlIHRoZSBic3MgZGVzYworICAgICAgICBzdGF0dXMgPSBjc3JSb2FtU2F2ZUNvbm5lY3RlZEJzc0Rlc2MocE1hYywgc2Vzc2lvbklkLCBwU2lyQnNzRGVzYyk7CisKKyAgICAgICAgICAgaWYoIENTUl9JU19RT1NfQlNTKHBJZXNUZW1wKSApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcENvbm5lY3RQcm9maWxlLT5xYXAgPSBUUlVFOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBwQ29ubmVjdFByb2ZpbGUtPnFhcCA9IEZBTFNFOworICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKCBOVUxMID09IHBJZXMgKQorICAgICAgICB7CisgICAgICAgICAgICAvL0ZyZWUgbWVtb3J5IGlmIGl0IGFsbG9jYXRlZCBsb2NhbGx5CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXNUZW1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvL1NhdmUgUW9zIGNvbm5lY3Rpb24KKyAgICBwQ29ubmVjdFByb2ZpbGUtPnFvc0Nvbm5lY3Rpb24gPSBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uZldNTUNvbm5lY3Rpb247CisgICAgCisgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAgY3NyRnJlZUNvbm5lY3RCc3NEZXNjKHBNYWMsIHNlc3Npb25JZCk7CisgICAgfQorICAgIGZvcihpbmRleCA9IDA7IGluZGV4IDwgcFByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHM7IGluZGV4KyspCisgICAgeworICAgICAgIGlmKChwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbaW5kZXhdLlNTSUQubGVuZ3RoID09IHBDb25uZWN0UHJvZmlsZS0+U1NJRC5sZW5ndGgpICYmCisgICAgICAgICAgcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgcFByb2ZpbGUtPlNTSURzLlNTSURMaXN0W2luZGV4XS5TU0lELnNzSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25uZWN0UHJvZmlsZS0+U1NJRC5zc0lkLCBwQ29ubmVjdFByb2ZpbGUtPlNTSUQubGVuZ3RoKSkKKyAgICAgICB7CisgICAgICAgICAgcENvbm5lY3RQcm9maWxlLT5oYW5kb2ZmUGVybWl0dGVkID0gcFByb2ZpbGUtPlNTSURzLlNTSURMaXN0W2luZGV4XS5oYW5kb2ZmUGVybWl0dGVkOworICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgICAgICBwQ29ubmVjdFByb2ZpbGUtPmhhbmRvZmZQZXJtaXR0ZWQgPSBGQUxTRTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKworc3RhdGljIHZvaWQgY3NyUm9hbUpvaW5Sc3BQcm9jZXNzb3IoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVKb2luUnNwICpwU21lSm9pblJzcCApCit7CisgICB0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisgICB0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisKKyAgIC8vVGhlIGhlYWQgb2YgdGhlIGFjdGl2ZSBsaXN0IGlzIHRoZSByZXF1ZXN0IHdlIHNlbnQKKyAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisgICBpZihwRW50cnkpCisgICB7CisgICAgICAgcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisgICB9CisKKyAgIGlmICggZVNJUl9TTUVfU1VDQ0VTUyA9PSBwU21lSm9pblJzcC0+c3RhdHVzQ29kZSApIAorICAgeworICAgICAgICAgICAgaWYocENvbW1hbmQgJiYgZUNzclNtZUlzc3VlZEFzc29jVG9TaW1pbGFyQVAgPT0gcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uKQorICAgICAgICAgICAgeworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgICAgICAgICAgICAgIHNtZV9Rb3NDc3JFdmVudEluZChwTWFjLCBwU21lSm9pblJzcC0+c2Vzc2lvbklkLCBTTUVfUU9TX0NTUl9IQU5ET0ZGX0NPTVBMRVRFLCBOVUxMKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgY3NyUm9hbUNvbXBsZXRlKCBwTWFjLCBlQ3NySm9pblN1Y2Nlc3MsICh2b2lkICopcFNtZUpvaW5Sc3AgKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICAgdEFOSV9VMzIgcm9hbUlkID0gMDsKKyAgICAgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgcFNtZUpvaW5Sc3AtPnNlc3Npb25JZCApOworICAgICAgICAKKyAgICAgICAgLy9UaGUgaGVhZCBvZiB0aGUgYWN0aXZlIGxpc3QgaXMgdGhlIHJlcXVlc3Qgd2Ugc2VudAorICAgICAgICAvL1RyeSB0byBnZXQgYmFjayB0aGUgc2FtZSBwcm9maWxlIGFuZCByb2FtIGFnYWluCisgICAgICAgIGlmKHBDb21tYW5kKQorICAgICAgICB7CisgICAgICAgICAgICByb2FtSWQgPSBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1JZDsKKyAgICAgICAgfQorCisgICAgICAgIHBTZXNzaW9uLT5qb2luRmFpbFN0YXR1c0NvZGUuc3RhdHVzQ29kZSA9IHBTbWVKb2luUnNwLT5zdGF0dXNDb2RlOworICAgICAgICBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGUgPSBwU21lSm9pblJzcC0+cHJvdFN0YXR1c0NvZGU7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIlNtZUpvaW5SZXEgZmFpbGVkIHdpdGggc3RhdHVzQ29kZT0gMHglMDhsWCBbJWRdXG4iLCBwU21lSm9pblJzcC0+c3RhdHVzQ29kZSwgcFNtZUpvaW5Sc3AtPnN0YXR1c0NvZGUgKTsKKyNpZiAgIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgICAgICAgLyogSWYgSm9pbiBmYWlscyB3aGlsZSBIYW5kb2ZmIGlzIGluIHByb2dyZXNzLCBpbmRpY2F0ZSBkaXNhc3NvY2lhdGVkIGV2ZW50IHRvIHN1cHBsaWNhbnQgdG8gcmVjb25uZWN0ICovCisgICAgICAgIGlmIChjc3JSb2FtSXNIYW5kb2ZmSW5Qcm9ncmVzcyhwTWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBwU21lSm9pblJzcC0+c2Vzc2lvbklkLCBOVUxMLCByb2FtSWQsIGVDU1JfUk9BTV9ESVNBU1NPQ0lBVEVELCBlQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCk7CisgICAgICAgICAgICAvKiBTaG91bGQgaW5kaWNhdGUgbmVpZ2hib3Igcm9hbSBhbGdvcml0aG0gYWJvdXQgdGhlIGNvbm5lY3QgZmFpbHVyZSBoZXJlICovCisgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1JbmRpY2F0ZUNvbm5lY3QocE1hYywgcFNtZUpvaW5Sc3AtPnNlc3Npb25JZCwgVk9TX1NUQVRVU19FX0ZBSUxVUkUpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKHBDb21tYW5kKQorICAgICAgICB7CisgICAgICAgICAgICBpZihDU1JfSVNfV0RTX1NUQSggJnBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5mU3RvcFdkcyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9XRFNfU1RBOworICAgICAgICAgICAgICBjc3JSb2FtUmVpc3N1ZVJvYW1Db21tYW5kKHBNYWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggQ1NSX0lTX1dEUyggJnBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3NyUm9hbUNvbXBsZXRlKCBwTWFjLCBlQ3NyTm90aGluZ1RvSm9pbiwgTlVMTCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzclJvYW0ocE1hYywgcENvbW1hbmQpOworICAgICAgICAgICAgfSAgICAKKyAgICAgICAgfSAgICAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgIGNzclJvYW1Db21wbGV0ZSggcE1hYywgZUNzck5vdGhpbmdUb0pvaW4sIE5VTEwgKTsKKyAgICAgICAgfQorICAgIH0gLyplbHNlOiAoIGVTSVJfU01FX1NVQ0NFU1MgPT0gcFNtZUpvaW5Sc3AtPnN0YXR1c0NvZGUgKSAqLworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlSm9pbiggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdEFOSV9VMzIgcm9hbUlkICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKworICAgIHNtc0xvZyggcE1hYywgTE9HMSwgIkF0dGVtcHRpbmcgdG8gSm9pbiBCc3NpZD0gJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnhcbiIsIAorICAgICAgICAgICAgICAgICAgcFNpckJzc0Rlc2MtPmJzc0lkWyAwIF0scFNpckJzc0Rlc2MtPmJzc0lkWyAxIF0scFNpckJzc0Rlc2MtPmJzc0lkWyAyIF0sCisgICAgICAgICAgICAgICAgICBwU2lyQnNzRGVzYy0+YnNzSWRbIDMgXSxwU2lyQnNzRGVzYy0+YnNzSWRbIDQgXSxwU2lyQnNzRGVzYy0+YnNzSWRbIDUgXSApOworICAgIAorICAgIC8vIFNldCB0aGUgcm9hbWluZyBzdWJzdGF0ZSB0byAnam9pbiBhdHRlbXB0Jy4uLgorICAgIGNzclJvYW1TdWJzdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX0pPSU5fUkVRLCBzZXNzaW9uSWQpOworCisgICAgLy8gYXR0ZW1wdCB0byBKb2luIHRoaXMgQlNTLi4uCisgICAgc3RhdHVzID0gY3NyU2VuZEpvaW5SZXFNc2coIHBNYWMsIHNlc3Npb25JZCwgcFNpckJzc0Rlc2MsIHBQcm9maWxlLCBwSWVzICk7CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworc3RhdGljIGVIYWxTdGF0dXMgY3NyUm9hbUlzc3VlUmVhc3NvY2lhdGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlKQoreworICAgIGNzclJvYW1TdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5JTkcsIHNlc3Npb25JZCk7CisKKyAgICAvLyBTZXQgdGhlIHJvYW1pbmcgc3Vic3RhdGUgdG8gJ2pvaW4gYXR0ZW1wdCcuLi4KKyAgICBjc3JSb2FtU3Vic3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9SRUFTU09DX1JFUSwgc2Vzc2lvbklkICk7CisKKyAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiAgY2FsbGluZyBjc3JTZW5kU21lUmVhc3NvY1JlcU1zZ1xuIikpOworICAgIAorICAgIC8vIGF0dGVtcHQgdG8gSm9pbiB0aGlzIEJTUy4uLgorICAgIHJldHVybiBjc3JTZW5kU21lUmVhc3NvY1JlcU1zZyggcE1hYywgc2Vzc2lvbklkLCBwU2lyQnNzRGVzYywgcEllcywgcFByb2ZpbGUgKTsKK30KKworCisKK3ZvaWQgY3NyUm9hbVJlaXNzdWVSb2FtQ29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRTbWVDbWQgKnBDb21tYW5kOworICAgIHRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQ7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKyAgICAgICAgICAgIAorICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisgICAgaWYocEVudHJ5KQorICAgIHsKKyAgICAgICAgcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisgICAgICAgIGlmICggZVNtZUNvbW1hbmRSb2FtID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsKKyAgICAgICAgICAgIHBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAgICAgICAgIGlmKCBwQ29tbWFuZC0+dS5yb2FtQ21kLmZTdG9wV2RzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbykpOworICAgICAgICAgICAgICAgIHJvYW1JbmZvLnBCc3NEZXNjID0gcENvbW1hbmQtPnUucm9hbUNtZC5wTGFzdFJvYW1Cc3M7CisgICAgICAgICAgICAgICAgcm9hbUluZm8uc3RhdHVzQ29kZSA9IHBTZXNzaW9uLT5qb2luRmFpbFN0YXR1c0NvZGUuc3RhdHVzQ29kZTsKKyAgICAgICAgICAgICAgICByb2FtSW5mby5yZWFzb25Db2RlID0gcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5yZWFzb25Db2RlOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChDU1JfSVNfV0RTKCZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSkpeworI2VuZGlmCisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9XRFNfRElTQ09OTkVDVEVEOworICAgICAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fV0RTX0lORCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9XRFNfRElTQVNTT0NJQVRFRCk7CisjaWZkZWYgIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYgKENTUl9JU19JTkZSQV9BUCgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdFN0YXRlID0gZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lORlJBX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgJnJvYW1JbmZvLCBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX0lORlJBX0lORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9JTkZSQV9ESVNBU1NPQ0lBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCisgCisjZW5kaWYgICAgICAgICAgICAgICAgICAKKworCisgICAgICAgICAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIGNzclJvYW1Jc3N1ZVN0b3BCc3MoIHBNYWMsIHNlc3Npb25JZCwgZUNTUl9ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUSApICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICIgRmFpbGVkIHRvIHJlaXNzdWUgc3RvcF9ic3MgY29tbWFuZCBmb3IgV0RTIGFmdGVyIGRpc2Fzc29jaWF0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgICBjc3JSb2FtQ29tcGxldGUoIHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihlQ3NyU3RvcFJvYW1pbmcgPT0gY3NyUm9hbUpvaW5OZXh0QnNzKHBNYWMsIHBDb21tYW5kLCBlQU5JX0JPT0xFQU5fVFJVRSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICIgRmFpbGVkIHRvIHJlaXNzdWUgam9pbiBjb21tYW5kIGFmdGVyIGRpc2Fzc29jaWF0ZWRcbiIpOworICAgICAgICAgICAgICAgIGNzclJvYW1Db21wbGV0ZSggcE1hYywgZUNzck5vdGhpbmdUb0pvaW4sIE5VTEwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiICBDb21tYW5kIGlzIG5vdCByb2FtaW5nIGFmdGVyIGRpc2Fzc29jaWF0ZWRcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiAgIERpc2Fzc29jIHJzcCBjYW5ub3QgY29udGludWUgYmVjYXVzZSBubyBjb21tYW5kIGlzIGF2YWlsYWJsZVxuIik7CisgICAgfQorfQorCisKK3RBTklfQk9PTEVBTiBjc3JJc1JvYW1Db21tYW5kV2FpdGluZ0ZvclNlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIHRBTklfQk9PTEVBTiBmUmV0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKworICAgIC8vYWx3YXN5IGxvY2sgYWN0aXZlIGxpc3QgYmVmb3JlIGxvY2tpbmcgcGVuZGluZyBsaXN0CisgICAgY3NyTExMb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKyAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisgICAgaWYocEVudHJ5KQorICAgIHsKKyAgICAgICAgcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisgICAgICAgIGlmKCAoIGVTbWVDb21tYW5kUm9hbSA9PSBwQ29tbWFuZC0+Y29tbWFuZCApICYmICggc2Vzc2lvbklkID09IHBDb21tYW5kLT5zZXNzaW9uSWQgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZSZXQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihlQU5JX0JPT0xFQU5fRkFMU0UgPT0gZlJldCkKKyAgICB7CisgICAgICAgIGNzckxMTG9jaygmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0KTsKKyAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgd2hpbGUocEVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKyAgICAgICAgICAgIGlmKCAoIGVTbWVDb21tYW5kUm9hbSA9PSBwQ29tbWFuZC0+Y29tbWFuZCApICYmICggc2Vzc2lvbklkID09IHBDb21tYW5kLT5zZXNzaW9uSWQgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZlJldCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyk7CisgICAgICAgIH0KKyAgICAgICAgY3NyTExVbmxvY2soJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCk7CisgICAgfQorICAgIGNzckxMVW5sb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKworICAgIHJldHVybiAoZlJldCk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzcklzUm9hbUNvbW1hbmRXYWl0aW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9CT09MRUFOIGZSZXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdEFOSV9VMzIgaTsKKworICAgIGZvciggaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgaSApICYmICggZlJldCA9IGNzcklzUm9hbUNvbW1hbmRXYWl0aW5nRm9yU2Vzc2lvbiggcE1hYywgaSApICkgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIGZSZXQgKTsKK30KKworCit0QU5JX0JPT0xFQU4gY3NySXNDb21tYW5kV2FpdGluZyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfQk9PTEVBTiBmUmV0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworCisgICAgLy9hbHdhc3kgbG9jayBhY3RpdmUgbGlzdCBiZWZvcmUgbG9ja2luZyBwZW5kaW5nIGxpc3QKKyAgICBjc3JMTExvY2soICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCApOworICAgIGZSZXQgPSBjc3JMTElzTGlzdEVtcHR5KCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisgICAgaWYoZUFOSV9CT09MRUFOX0ZBTFNFID09IGZSZXQpCisgICAgeworICAgICAgICBmUmV0ID0gY3NyTExJc0xpc3RFbXB0eSgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisgICAgfQorICAgIGNzckxMVW5sb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKworICAgIHJldHVybiAoZlJldCk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzcklzU2NhbkZvclJvYW1Db21tYW5kQWN0aXZlKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZlJldCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0Q3NyQ21kICpwQ29tbWFuZDsKKworICAgIC8vYWx3YXN5IGxvY2sgYWN0aXZlIGxpc3QgYmVmb3JlIGxvY2tpbmcgcGVuZGluZyBsaXN0CisgICAgY3NyTExMb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKyAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisgICAgaWYoIHBFbnRyeSApCisgICAgeworICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0Q3NyQ21kLCBMaW5rKTsKKyAgICAgICAgaWYoICggZUNzclJvYW1Db21tYW5kU2NhbiA9PSBwQ29tbWFuZC0+Y29tbWFuZCApICYmIAorICAgICAgICAgICAgKCAoIGVDc3JTY2FuRm9yU3NpZCA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiApIHx8IAorICAgICAgICAgICAgICAoIGVDc3JTY2FuRm9yQ2Fwc0NoYW5nZSA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiApIHx8CisgICAgICAgICAgICAgICggZUNzclNjYW5QMlBGaW5kUGVlciA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiApICkgKQorICAgICAgICB7CisgICAgICAgICAgICBmUmV0ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgY3NyTExVbmxvY2soICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCApOworCisgICAgcmV0dXJuIChmUmV0KTsKK30KKworZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVSZWFzc29jaWF0ZUNtZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNtZUNtZCAqcENvbW1hbmQgPSBOVUxMOworICAgIHRBTklfQk9PTEVBTiBmSGlnaFByaW9yaXR5ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgdEFOSV9CT09MRUFOIGZSZW1vdmVDbWQgPSBGQUxTRTsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsgCisKKyAgICAvLyBEZWxldGUgdGhlIG9sZCBhc3NvYyBjb21tYW5kLiBBbGwgaXMgc2V0dXAgZm9yIHJlYXNzb2MgdG8gYmUgc2VyaWFsaXplZAorICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICBpZiAoIHBFbnRyeSApCisgICAgeworICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworICAgICAgICBpZiAoICFwQ29tbWFuZCApIAorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXJcbiIpICk7CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfUkVTT1VSQ0VTOworICAgICAgICB9CisgICAgICAgIGlmICggZVNtZUNvbW1hbmRSb2FtID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9PSBlQ3NyU21lSXNzdWVkQXNzb2NUb1NpbWlsYXJBUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmUmVtb3ZlQ21kID0gY3NyTExSZW1vdmVFbnRyeSggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBwRW50cnksIExMX0FDQ0VTU19MT0NLICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBVbmV4cGVjdGVkIGFjdGl2ZSByb2FtIGNvbW1hbmQgcHJlc2VudCBcbiIpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZlJlbW92ZUNtZCA9PSBGQUxTRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJbXBsaWVzIHdlIGRpZCBub3QgZ2V0IHRoZSBzZXJpYWxpemVkIGFzc29jIGNvbW1hbmQgd2UKKyAgICAgICAgICAgICAgICAvLyB3ZXJlIGV4cGVjdGluZworICAgICAgICAgICAgICAgIHBDb21tYW5kID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKE5VTEwgPT0gcENvbW1hbmQpCisgICAgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXIgYXMgZXhwZWN0ZWQgYmFzZWQgb24gcHJldmlvdXMgY29ubmVjdCByb2FtIGNvbW1hbmRcbiIpICk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICAgfQorCisgICAgZG8gCisgICAgeworICAgICAgICAvL0NoYW5nZSB0aGUgc3Vic3RhdGUgaW4gY2FzZSBpdCBpcyB3YWl0LWZvci1rZXkKKyAgICAgICAgaWYoIENTUl9JU19XQUlUX0ZPUl9LRVkoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyUm9hbVN0b3BXYWl0Rm9yS2V5VGltZXIoIHBNYWMgKTsKKyAgICAgICAgICAgIGNzclJvYW1TdWJzdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX05PTkUsIHNlc3Npb25JZCApOworICAgICAgICB9CisgICAgICAgIHBDb21tYW5kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRSb2FtOworICAgICAgICBwQ29tbWFuZC0+c2Vzc2lvbklkID0gKHRBTklfVTgpc2Vzc2lvbklkOworICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1SZWFzb24gPSBlQ3NyU21lSXNzdWVkRlRSZWFzc29jOworCisgICAgICAgIHN0YXR1cyA9IGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwQ29tbWFuZCwgZkhpZ2hQcmlvcml0eSk7CisgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyApOworICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRSb2FtKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICB9CisgICAgfSB3aGlsZSggMCApOworCisKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorc3RhdGljIHZvaWQgY3NyUm9hbWluZ1N0YXRlQ29uZmlnQ25mUHJvY2Vzc29yKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiByZXN1bHQgKQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5ID0gY3NyTExQZWVrSGVhZCgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKyAgICB0Q3NyU2NhblJlc3VsdCAqcFNjYW5SZXN1bHQgPSBOVUxMOworICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MgPSBOVUxMOworICAgIHRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQ7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworICAgIGlmKE5VTEwgPT0gcEVudHJ5KQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICIgICBDRkdfQ05GIHdpdGggYWN0aXZlIGxpc3QgZW1wdHlcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworICAgIHNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIGlmKENTUl9JU19ST0FNSU5HKHBTZXNzaW9uKSAmJiBwU2Vzc2lvbi0+ZkNhbmNlbFJvYW1pbmcpCisgICAgeworICAgICAgICAvL3RoZSByb2FtaW5nIGlzIGNhbmNlbGxlZC4gU2ltcGx5IGNvbXBsZXRlIHRoZSBjb21tYW5kCisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiICBSb2FtIGNvbW1hbmQgY2FuY2VsbGVkXG4iKSk7CisgICAgICAgIGNzclJvYW1Db21wbGV0ZShwTWFjLCBlQ3NyTm90aGluZ1RvSm9pbiwgTlVMTCk7IAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoIENDTV9JU19SRVNVTFRfU1VDQ0VTUyhyZXN1bHQpICkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPRzIsICJDZmcgc2VxdWVuY2UgY29tcGxldGVcbiIpOworICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bGx5IHNldCB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgbmV3IEJzcy4gIEF0dGVtcHQgdG8KKyAgICAgICAgICAgIC8vIGpvaW4gdGhlIHJvYW1pbmcgQnNzLgorICAgICAgICAgICAgaWYocENvbW1hbmQtPnUucm9hbUNtZC5wUm9hbUJzc0VudHJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0ID0gR0VUX0JBU0VfQUREUihwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKyAgICAgICAgICAgICAgICBwQnNzRGVzYyA9ICZwU2NhblJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGNzcklzQnNzVHlwZUlCU1MoIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUuQlNTVHlwZSApIHx8CisgICAgICAgICAgICAgICAgIENTUl9JU19XRFMoICZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlICkgCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgICAgICAgfHwgQ1NSX0lTX0lORlJBX0FQKCZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlKSAKKyNlbmRpZgorICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyUm9hbUlzc3VlU3RhcnRCc3MoIHBNYWMsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmJzc1BhcmFtcywgJnBDb21tYW5kLT51LnJvYW1DbWQucm9hbVByb2ZpbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NEZXNjLCBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1JZCApKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiIENTUiBzdGFydCBCU1MgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgLy9XZSBuZWVkIHRvIGNvbXBsZXRlIHRoZSBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgIGNzclJvYW1Db21wbGV0ZShwTWFjLCBlQ3NyU3RhcnRCc3NGYWlsdXJlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIiBwUm9hbUJzc0VudHJ5IGlzIE5VTExcbiIpOworICAgICAgICAgICAgICAgICAgICAvL1dlIG5lZWQgdG8gY29tcGxldGUgdGhlIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNvbXBsZXRlKHBNYWMsIGVDc3JKb2luRmFpbHVyZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSByb2FtaW5nIFRPIGFuIEluZnJhc3RydWN0dXJlIEJTUy4uLgorICAgICAgICAgICAgICAgIFZPU19BU1NFUlQocFNjYW5SZXN1bHQgIT0gTlVMTCk7IAorICAgICAgICAgICAgICAgIGlmICggY3NySXNJbmZyYUJzc0Rlc2MoIHBCc3NEZXNjICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllc0xvY2FsID0gKHREb3QxMWZCZWFjb25JRXMgKilwU2NhblJlc3VsdC0+UmVzdWx0LnB2SWVzOworCisgICAgICAgICAgICAgICAgICAgIGlmKHBJZXNMb2NhbCB8fCAoSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsIHBCc3NEZXNjLCAmcEllc0xvY2FsKSkpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLmFuZCBjdXJyZW50bHkgaW4gYW4gSW5mcmFzdHJ1Y3R1cmUgY29ubmVjdGlvbi4uLi4KKyAgICAgICAgICAgICAgICAgICAgaWYoIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSW5mcmEoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uYW5kIHRoZSBTU0lEcyBhcmUgZXF1YWwsIHRoZW4gd2UgUmVhc3NvYy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIGNzcklzU3NpZEVxdWFsKCBwTWFjLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLCBwQnNzRGVzYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllc0xvY2FsICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi5hbmQgY3VycmVudGx5IGluIGFuIGluZnJhc3RydWN0dXJlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGlzc3VlIGEgUmVhc3NvYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5yb2FtQ21kLmZSZWFzc29jID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1Jc3N1ZVJlYXNzb2NpYXRlKCBwTWFjLCBzZXNzaW9uSWQsIHBCc3NEZXNjLCBwSWVzTG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgd2UgaGF2ZSB0byBpc3N1ZSBhIG5ldyBKb2luIHJlcXVlc3QgdG8gTElNIGJlY2F1c2Ugd2UgZGlzYXNzb2NpYXRlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzbHkgYXNzb2NpYXRlZCBBUC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGNzclJvYW1Jc3N1ZUpvaW4oIHBNYWMsIHNlc3Npb25JZCwgcEJzc0Rlc2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllc0xvY2FsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSwgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQgKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RyeSBzb21ldGhpbmcgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVIYWxTdGF0dXMgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIGNvbWUgd2l0aCBvdGhlciB3YXkgdG8gZmlndXJlIG91dCB0aGF0IHRoaXMgaXMgYmVjYXVzZSBvZiBITyBpbiBCTVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBiZWxvdyBBUEkgd2lsbCBiZSBvbmx5IGF2YWlsYWJsZSBmb3IgQW5kcm9pZCBhcyBpdCB1c2VzIGEgZGlmZmVyZW50IEhPIGFsZ29yaXRobSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhc3NvYyByZXF1ZXN0IHdpbGwgYmUgdXNlZCBvbmx5IGZvciBDQ1ggYW5kIDExciBoYW5kb2ZmIHdoZXJlYXMgb3RoZXIgbGVnYWN5IHJvYW1pbmcgc2hvdWxkIAorICAgICAgICAgICAgICAgICAgICAgICAgICogdXNlIGpvaW4gcmVxdWVzdCAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3NyUm9hbUlzSGFuZG9mZkluUHJvZ3Jlc3MocE1hYykgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtSXMxMXJBc3NvYyhwTWFjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVSZWFzc29jaWF0ZShwTWFjLCBzZXNzaW9uSWQsIHBCc3NEZXNjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0RG90MTFmQmVhY29uSUVzICopKCBwU2NhblJlc3VsdC0+UmVzdWx0LnB2SWVzICksICZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzclJvYW1Jc0hhbmRvZmZJblByb2dyZXNzKHBNYWMpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUlzQ0NYQXNzb2MocE1hYykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHNlcmlhbGl6ZSB0aGUgcmVhc3NvYyBjb21tYW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZVJlYXNzb2NpYXRlQ21kKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Ugd2UgYXJlIG5vdCBjb25uZWN0ZWQgYW5kIGF0dGVtcHRpbmcgdG8gSm9pbi4gIElzc3VlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSm9pbiByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZUpvaW4oIHBNYWMsIHNlc3Npb25JZCwgcEJzc0Rlc2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHREb3QxMWZCZWFjb25JRXMgKikoIHBTY2FuUmVzdWx0LT5SZXN1bHQucHZJZXMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1Qcm9maWxlLCBwQ29tbWFuZC0+dS5yb2FtQ21kLnJvYW1JZCApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJ5IHNvbWV0aGluZyBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbSggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFwU2NhblJlc3VsdC0+UmVzdWx0LnB2SWVzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0xvY2FsbHkgYWxsb2NhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwSWVzTG9jYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfS8vaWYgKCBjc3JJc0luZnJhQnNzRGVzYyggcEJzc0Rlc2MgKSApCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgIGZvdW5kIEJTU1R5cGUgbWlzbWF0Y2hpbmcgdGhlIG9uZSBpbiBCU1MgZGVzY3JpcHRpb25cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Ly9lbHNlCisgICAgICAgIH0vL2lmICggV05JX0NGR19TVUNDRVNTID09IHJlc3VsdCApCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSW4gdGhlIGV2ZW50IHRoZSBjb25maWd1cmF0aW9uIGZhaWxlZCwgIGZvciBpbmZyYSBsZXQgdGhlIHJvYW0gcHJvY2Vzc29yIAorICAgICAgICAgICAgLy9hdHRlbXB0IHRvIGpvaW4gc29tZXRoaW5nIGVsc2UuLi4KKyAgICAgICAgICAgIGlmKCBwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnkgJiYgQ1NSX0lTX0lORlJBU1RSVUNUVVJFKCAmcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNzclJvYW0ocE1hYywgcENvbW1hbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vV2UgbmVlZCB0byBjb21wbGV0ZSB0aGUgY29tbWFuZAorICAgICAgICAgICAgICAgIGlmICggY3NySXNCc3NUeXBlSUJTUyggcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZS5CU1NUeXBlICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNvbXBsZXRlKHBNYWMsIGVDc3JTdGFydEJzc0ZhaWx1cmUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjc3JSb2FtQ29tcGxldGUoIHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfS8vd2UgaGF2ZSBhY3RpdmUgZW50cnkKK30KKworCitzdGF0aWMgdm9pZCBjc3JSb2FtUm9hbWluZ1N0YXRlQXV0aFJzcFByb2Nlc3NvciggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclNtZUF1dGhSc3AgKnBTbWVBdXRoUnNwICkKK3sKKyAgICAvL05vIG9uZSBpcyBzZW5kaW5nIGVXTklfU01FX0FVVEhfUkVRIHRvIFBFLgorICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiaXMgbm8tb3BcbiIpKTsKKyAgICBpZiAoIGVTSVJfU01FX1NVQ0NFU1MgPT0gcFNtZUF1dGhSc3AtPnN0YXR1c0NvZGUgKSAKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIkNTUiBTbWVBdXRoUmVxIFN1Y2Nlc3NmdWxcbiIgKTsKKyAgICAgICAgLy8gU3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQgd2l0aCBhIG5ldyBCc3MuICBBdHRlbXB0IHRvIHN0b3AgdGhlIGN1cnJlbnQgQnNzIGFuZAorICAgICAgICAvLyBqb2luIHRoZSBuZXcgb25lLi4uCisgICAgICAgIC8qKipwQnNzRGVzYyA9IHByb2ZHZXRSb2FtaW5nQnNzRGVzYyggcEFkYXB0ZXIsICZwSGRkUHJvZmlsZSApOworCisgICAgICAgIHJvYW1TdG9wTmV0d29yayggcEFkYXB0ZXIsICZwQnNzRGVzYy0+U2lyQnNzRGVzY3JpcHRpb24gKTsqKiovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICJDU1IgU21lQXV0aFJlcSBmYWlsZWQgd2l0aCBzdGF0dXNDb2RlPSAweCUwOGxYIFslZF1cbiIsIHBTbWVBdXRoUnNwLT5zdGF0dXNDb2RlLCBwU21lQXV0aFJzcC0+c3RhdHVzQ29kZSApOworICAgICAgICAvKioqcHJvZkhhbmRsZUxvc3RMaW5rQWZ0ZXJSZXNldChwQWRhcHRlcik7CisgICAgICAgIC8vIEluIHRoZSBldmVudCB0aGUgYXV0aGVudGljYXRlIGZhaWxzLCBsZXQgdGhlIHJvYW0gcHJvY2Vzc29yIGF0dGVtcHQgdG8gam9pbiBzb21ldGhpbmcgZWxzZS4uLgorICAgICAgICByb2FtUm9hbSggcEFkYXB0ZXIgKTsqKiovCisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGNzclJvYW1Sb2FtaW5nU3RhdGVSZWFzc29jUnNwUHJvY2Vzc29yKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZUpvaW5Sc3AgcFNtZUpvaW5Sc3AgKQoreworICAgIGVDc3JSb2FtQ29tcGxldGVSZXN1bHQgcmVzdWx0OworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIHRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKyAgICB0QU5JX1UzMiByb2FtSWQgPSAwOworICAgIAorICAgIGlmICggZVNJUl9TTUVfU1VDQ0VTUyA9PSBwU21lSm9pblJzcC0+c3RhdHVzQ29kZSApIAorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiQ1NSIFNtZVJlYXNzb2NSZXEgU3VjY2Vzc2Z1bFxuIiApOworICAgICAgICByZXN1bHQgPSBlQ3NyUmVhc3NvY1N1Y2Nlc3M7CisKKyAgICAgICAgLyogRGVmZWF0dXJpemUgdGhpcyBwYXJ0IGxhdGVyIGlmIG5lZWRlZCAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisgICAgICAgIC8qIFNpbmNlIHRoZSBuZWlnaGJvciByb2FtIGFsZ29yaXRobSB1c2VzIHJlYXNzb2MgcmVxIGZvciBoYW5kb2ZmIGluc3RlYWQgb2Ygam9pbiwgCisgICAgICAgICAqIHdlIG5lZWQgdGhlIHJlc3BvbnNlIGNvbnRlbnRzIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJlc3VsdCBpbiBjc3JSb2FtUHJvY2Vzc1Jlc3VsdHMoKSAqLworICAgICAgICBpZiAoY3NyUm9hbUlzSGFuZG9mZkluUHJvZ3Jlc3MocE1hYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5lZWQgdG8gZGlnIG1vcmUgb24gaW5kaWNhdGluZyBldmVudHMgdG8gU01FIFFvUyBtb2R1bGUgKi8KKyAgICAgICAgICAgIHNtZV9Rb3NDc3JFdmVudEluZChwTWFjLCBwU21lSm9pblJzcC0+c2Vzc2lvbklkLCBTTUVfUU9TX0NTUl9IQU5ET0ZGX0NPTVBMRVRFLCBOVUxMKTsKKyAgICAgICAgICAgIGNzclJvYW1Db21wbGV0ZSggcE1hYywgcmVzdWx0LCBwU21lSm9pblJzcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzclJvYW1Db21wbGV0ZSggcE1hYywgcmVzdWx0LCBOVUxMICk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogU2hvdWxkIHdlIGhhbmRsZSB0aGlzIHNpbWlsYXIgdG8gaGFuZGxpbmcgdGhlIGpvaW4gZmFpbHVyZT8gSXMgaXQgb2sKKyAgICAgKiB0byBjYWxsIGNzclJvYW1Db21wbGV0ZSgpIHdpdGggc3RhdGUgYXMgQ3NySm9pbkZhaWx1cmUgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICJDU1IgU21lUmVhc3NvY1JlcSBmYWlsZWQgd2l0aCBzdGF0dXNDb2RlPSAweCUwOGxYIFslZF1cbiIsIHBTbWVKb2luUnNwLT5zdGF0dXNDb2RlLCBwU21lSm9pblJzcC0+c3RhdHVzQ29kZSApOworICAgICAgICByZXN1bHQgPSBlQ3NyUmVhc3NvY0ZhaWx1cmU7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgaWYgKChlU0lSX1NNRV9GVF9SRUFTU09DX1RJTUVPVVRfRkFJTFVSRSA9PSBwU21lSm9pblJzcC0+c3RhdHVzQ29kZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChlU0lSX1NNRV9GVF9SRUFTU09DX0ZBSUxVUkUgPT0gcFNtZUpvaW5Sc3AtPnN0YXR1c0NvZGUpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSW5mb3JtIEhERCB0byB0dXJuIG9mZiBGVCBmbGFnIGluIEhERCAKKyAgICAgICAgICAgICAgICBpZiAocE5laWdoYm9yUm9hbUluZm8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdm9zX21lbV96ZXJvKCZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbykpOworICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBwTmVpZ2hib3JSb2FtSW5mby0+Y3NyU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyb2FtSW5mbywgcm9hbUlkLCBlQ1NSX1JPQU1fRlRfUkVBU1NPQ19GQUlMRUQsIGVTSVJfU01FX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8vIEluIHRoZSBldmVudCB0aGF0IHRoZSBSZWFzc29jaWF0aW9uIGZhaWxzLCB0aGVuIHdlIG5lZWQgdG8gRGlzYXNzb2NpYXRlIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIGFuZCBrZWVwCisgICAgICAgIC8vIHJvYW1pbmcuICBOb3RlIHRoYXQgd2Ugd2lsbCBhdHRlbXB0IHRvIEpvaW4gdGhlIEFQIGluc3RlYWQgb2YgYSBSZWFzc29jIHNpbmNlIHdlIG1heSBoYXZlIGF0dGVtcHRlZCBhCisgICAgICAgIC8vICdSZWFzc29jIHRvIHNlbGYnLCB3aGljaCBBUCdzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBSZWFzc29jIHdpbGwgZm9yY2UgYSBEaXNhc3NvYy4KKyAgICAgICAgLy9UaGUgZGlzYXNzb2MgcnNwIG1lc3NhZ2Ugd2lsbCByZW1vdmUgdGhlIGNvbW1hbmQgZnJvbSBhY3RpdmUgbGlzdAorICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGNzclJvYW1Jc3N1ZURpc2Fzc29jaWF0ZSggcE1hYywgcFNtZUpvaW5Sc3AtPnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRUFTU09DX0ZBSUxVUkUsIEZBTFNFICkpKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JSb2FtQ29tcGxldGUoIHBNYWMsIGVDc3JKb2luRmFpbHVyZSwgTlVMTCApOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGNzclJvYW1Sb2FtaW5nU3RhdGVTdG9wQnNzUnNwUHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVSc3AgKnBTbWVSc3ApCit7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorICAgIHsKKyAgICAgICAgdm9zX2xvZ19pYnNzX3BrdF90eXBlICpwSWJzc0xvZzsKKworICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19BTExPQyhwSWJzc0xvZywgdm9zX2xvZ19pYnNzX3BrdF90eXBlLCBMT0dfV0xBTl9JQlNTX0MpOworICAgICAgICBpZihwSWJzc0xvZykKKyAgICAgICAgeworICAgICAgICAgICAgcElic3NMb2ctPmV2ZW50SWQgPSBXTEFOX0lCU1NfRVZFTlRfU1RPUF9SU1A7CisgICAgICAgICAgICBpZihlU0lSX1NNRV9TVUNDRVNTICE9IHBTbWVSc3AtPnN0YXR1c0NvZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcElic3NMb2ctPnN0YXR1cyA9IFdMQU5fSUJTU19TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfTE9HX1JFUE9SVChwSWJzc0xvZyk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCisgICAgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltwU21lUnNwLT5zZXNzaW9uSWRdLmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9OT1RfQ09OTkVDVEVEOworICAgIGlmKENTUl9JU19ST0FNX1NVQlNUQVRFX1NUT1BfQlNTX1JFUSggcE1hYywgcFNtZVJzcC0+c2Vzc2lvbklkKSkKKyAgICB7CisgICAgICAgIGNzclJvYW1Db21wbGV0ZSggcE1hYywgZUNzck5vdGhpbmdUb0pvaW4sIE5VTEwgKTsKKyAgICB9CisgICAgZWxzZSBpZihDU1JfSVNfUk9BTV9TVUJTVEFURV9ESVNDT05ORUNUX0NPTlRJTlVFKCBwTWFjLCBwU21lUnNwLT5zZXNzaW9uSWQpKQorICAgIHsKKyAgICAgICAgY3NyUm9hbVJlaXNzdWVSb2FtQ29tbWFuZChwTWFjKTsKKyAgICB9Cit9CisKKwordm9pZCBjc3JSb2FtUm9hbWluZ1N0YXRlRGlzYXNzb2NSc3BQcm9jZXNzb3IoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVEaXNhc3NvY1JzcCAqcFNtZVJzcCApCit7CisgICAgdFNpclJlc3VsdENvZGVzIHN0YXR1c0NvZGU7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhCU1NMaXN0OworICAgIHRBTklfQk9PTEVBTiBmQ2FsbENhbGxiYWNrLCBmUmVtb3ZlQ21kOworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgIHRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKyAgICB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXIgPSBOVUxMOworICAgIHRBTklfVTMyIHJvYW1JZCA9IDA7CisgICAgdENzclJvYW1Qcm9maWxlICpwQ3VyUm9hbVByb2ZpbGUgPSBOVUxMOworICAgIHRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKyAgICB0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisjZW5kaWYKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQ7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKyAgICB0U2lyU21lRGlzYXNzb2NSc3AgU21lRGlzYXNzb2NSc3A7CisKKyAgICBjc3JTZXJEZXNVbnBhY2tEaWFzc29jUnNwKCh0QU5JX1U4ICopcFNtZVJzcCwgJlNtZURpc2Fzc29jUnNwKTsKKyAgICBzZXNzaW9uSWQgPSBTbWVEaXNhc3NvY1JzcC5zZXNzaW9uSWQ7CisgICAgc3RhdHVzQ29kZSA9IFNtZURpc2Fzc29jUnNwLnN0YXR1c0NvZGU7CisKKyAgICBzbXNMb2coIHBNYWMsIExPRzIsICJjc3JSb2FtUm9hbWluZ1N0YXRlRGlzYXNzb2NSc3BQcm9jZXNzb3Igc2Vzc2lvbklkICVkXG4iLCBzZXNzaW9uSWQpOworCisgICAgaWYgKCBjc3JJc0Nvbm5TdGF0ZUluZnJhKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgeworICAgICAgICBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlID0gZUNTUl9BU1NPQ19TVEFURV9UWVBFX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIGlmICggQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfTk9fSk9JTiggcE1hYywgc2Vzc2lvbklkICkgKQorICAgIHsKKyAgICAgICAgY3NyUm9hbUNvbXBsZXRlKCBwTWFjLCBlQ3NyTm90aGluZ1RvSm9pbiwgTlVMTCApOworICAgIH0KKyAgICBlbHNlIGlmICggQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfRk9SQ0VEKCBwTWFjLCBzZXNzaW9uSWQgKSB8fAorICAgICAgICAgICAgICBDU1JfSVNfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19SRVEoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICB7CisgICAgICAgIGlmICggZVNJUl9TTUVfU1VDQ0VTUyA9PSBzdGF0dXNDb2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cyLCAiQ1NSIFNtZURpc2Fzc29jUmVxIGZvcmNlIGRpc2Fzc29jaWF0ZWQgU3VjY2Vzc2Z1bGx5XG4iICk7CisgICAgICAgICAgICAvL0EgY2FsbGJhY2sgdG8gSEREIHdpbGwgYmUgaXNzdWVkIGZyb20gY3NyUm9hbUNvbXBsZXRlIHNvIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZQorICAgICAgICB9IAorICAgICAgICBjc3JSb2FtQ29tcGxldGUoIHBNYWMsIGVDc3JOb3RoaW5nVG9Kb2luLCBOVUxMICk7CisgICAgfQorCisgICAgZWxzZSBpZiAoIENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hPKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgeworICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkNTUiBTbWVEaXNhc3NvY1JlcSBkdWUgdG8gSE9cbiIgKTsKKyNpZiAgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HKQorICAgICAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLICk7CisgICAgICAgIGlmICggcEVudHJ5ICkKKyAgICAgICAgeworICAgICAgICAgICAgcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRTbWVDbWQsIExpbmsgKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGlzIEFjdGl2ZSBhbmQgaXQgaXMgYSBST0FNIGNvbW1hbmQsIHJlbW92ZQorICAgICAgICAgICAgLy8gYW5kIHB1dCB0aGlzIG9uIHRoZSBGcmVlIHF1ZXVlLgorICAgICAgICAgICAgaWYgKCBlU21lQ29tbWFuZFJvYW0gPT0gcENvbW1hbmQtPmNvbW1hbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vd2UgbmVlZCB0byBwcm9jZXNzIHRoZSByZXN1bHQgZmlyc3QgYmVmb3JlIHJlbW92aW5nIGl0IGZyb20gYWN0aXZlIGxpc3QgYmVjYXVzZSBzdGF0ZSBjaGFuZ2VzIAorICAgICAgICAgICAgICAgIC8vc3RpbGwgaGFwcGVuaW5nIGluc2lkZXMgcm9hbVFQcm9jZXNzUm9hbVJlc3VsdHMgc28gbm8gb3RoZXIgcm9hbSBjb21tYW5kIHNob3VsZCBiZSBpc3N1ZWQKKyAgICAgICAgICAgICAgICBmUmVtb3ZlQ21kID0gY3NyTExSZW1vdmVFbnRyeSggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBwRW50cnksIExMX0FDQ0VTU19MT0NLICk7CisgICAgICAgICAgICAgICAgaWYocENvbW1hbmQtPnUucm9hbUNtZC5mUmVsZWFzZVByb2ZpbGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjc3JSZWxlYXNlUHJvZmlsZShwTWFjLCAmcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnJvYW1DbWQuZlJlbGVhc2VQcm9maWxlID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBmUmVtb3ZlQ21kICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzclJlbGVhc2VDb21tYW5kUm9hbSggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiICAqKioqKioqKmNzclJvYW1Sb2FtaW5nU3RhdGVEaXNhc3NvY1JzcFByb2Nlc3NvciBmYWlsIHRvIHJlbW92ZSBjbWQgcmVhc29uICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIkNTUjogUm9hbSBDb21wbGV0aW9uIGNhbGxlZCBidXQgUk9BTSBjb21tYW5kIGlzIG5vdCBBQ1RJVkUgLi4uXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICJDU1I6IFJvYW0gQ29tcGxldGlvbiBjYWxsZWQgYnV0IE5PIGNvbW1hbmRzIGFyZSBBQ1RJVkUgLi4uXG4iICk7CisgICAgICAgIH0KKworICAgICAgICAvL25vdGlmeSBIREQgZm9yIGhhbmRvZmYsIHByb3ZpZGluZyB0aGUgQlNTSUQgdG9vCisgICAgICAgIHJvYW1JbmZvLnJlYXNvbkNvZGUgPSBlQ3NyUm9hbVJlYXNvbkJldHRlckFQOworCisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcm9hbUluZm8uYnNzaWQsIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5jc3JOZWlnaGJvclJvYW1Qcm9maWxlLkJTU0lEcy5ic3NpZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLHNlc3Npb25JZCwgJnJvYW1JbmZvLCAwLCBlQ1NSX1JPQU1fUk9BTUlOR19TVEFSVCwgZUNTUl9ST0FNX1JFU1VMVF9OT05FKTsKKworICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNjYW5GaWx0ZXIsIHNpemVvZih0Q3NyU2NhblJlc3VsdEZpbHRlcikpOworICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJlcGFyZUZpbHRlckZyb21Qcm9maWxlKHBNYWMsICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8uY3NyTmVpZ2hib3JSb2FtUHJvZmlsZSwgcFNjYW5GaWx0ZXIpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIGNzclJvYW1QcmVwYXJlRmlsdGVyRnJvbVByb2ZpbGUgZmFpbCB0byBjcmVhdGUgc2NhbiBmaWx0ZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBzdGF0dXMgPSBjc3JTY2FuR2V0UmVzdWx0KHBNYWMsIHBTY2FuRmlsdGVyLCAmaEJTU0xpc3QpOworICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9jb3B5IG92ZXIgdGhlIGNvbm5lY3RlZCBwcm9maWxlIHRvIGFwcGx5IHRoZSBzYW1lIGZvciB0aGlzIGNvbm5lY3Rpb24gYXMgd2VsbAorICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcEN1clJvYW1Qcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwQ3VyUm9hbVByb2ZpbGUsIHNpemVvZih0Q3NyUm9hbVByb2ZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNvcHlQcm9maWxlKHBNYWMsIHBDdXJSb2FtUHJvZmlsZSwgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIHRvIHB1dCBpdCBhdCB0aGUgaGVhZCBvZiB0aGUgY21kIHF1ZXVlCisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlQ29ubmVjdChwTWFjLCBzZXNzaW9uSWQsIHBDdXJSb2FtUHJvZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQlNTTGlzdCwgZUNzclNtZUlzc3VlZEFzc29jVG9TaW1pbGFyQVAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9hbUlkLCBlQU5JX0JPT0xFQU5fVFJVRSwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL21zZworICAgICAgICAgICAgICAgICAgICBmQ2FsbENhbGxiYWNrID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIE5vdGlmeSBzdWItbW9kdWxlcyBsaWtlIFFvUyBldGMuIHRoYXQgaGFuZG9mZiBoYXBwZW5pbmcgICAgICAgICAqLworICAgICAgICAgICAgICAgIHNtZV9Rb3NDc3JFdmVudEluZChwTWFjLCBzZXNzaW9uSWQsIFNNRV9RT1NfQ1NSX0hBTkRPRkZfQVNTT0NfUkVRLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBDdXJSb2FtUHJvZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9tc2cKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsImNzclJvYW1Sb2FtaW5nU3RhdGVEaXNhc3NvY1JzcFByb2Nlc3NvcjogY3NyU2NhbkdldFJlc3VsdCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgaGF2ZSBhc3NlcnRlZCwgc2VuZGluZyB1cCByb2FtIGNvbXBsZXRlIGluc3RlYWQuIExldCB1cHBlciBsYXllcgorICAgICAgICAgICAgICAgIC8vIGRlY2lkZSB3aGF0IHRvIGRvIG5leHQKKyAgICAgICAgICAgICAgICBjc3JDYWxsUm9hbWluZ0NvbXBsZXRpb25DYWxsYmFjayhwTWFjLCBwU2Vzc2lvbiwgJnJvYW1JbmZvLCAwLCBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNjYW4gZmlsdGVyXG4iKSk7CisgICAgICAgICAgICBjc3JDYWxsUm9hbWluZ0NvbXBsZXRpb25DYWxsYmFjayhwTWFjLCBwU2Vzc2lvbiwgJnJvYW1JbmZvLCAwLCBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIGlmKCBwU2NhbkZpbHRlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzckZyZWVTY2FuRmlsdGVyKHBNYWMsIHBTY2FuRmlsdGVyKTsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBTY2FuRmlsdGVyICk7CisgICAgICAgIH0KKworCisjZW5kaWYKKyAgICB9IC8vZWxzZSBpZiAoIENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hPKCBwTWFjICkgKQorICAgIGVsc2UgaWYgKCBDU1JfSVNfUk9BTV9TVUJTVEFURV9SRUFTU09DX0ZBSUwoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICB7CisgICAgICAgIC8vIERpc2Fzc29jIGR1ZSB0byBSZWFzc29jIGZhaWx1cmUgZmFsbHMgaW50byB0aGlzIGNvZGVwYXRoLi4uLgorICAgICAgICBjc3JSb2FtQ29tcGxldGUoIHBNYWMsIGVDc3JKb2luRmFpbHVyZSwgTlVMTCApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoIGVTSVJfU01FX1NVQ0NFU1MgPT0gc3RhdHVzQ29kZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFN1Y2Nlc3NmdWxseSBkaXNhc3NvY2lhdGVkIGZyb20gdGhlICdvbGQnIEJzcy4uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFdlIGdldCBEaXNhc3NvY2lhdGUgcmVzcG9uc2UgaW4gdGhyZWUgY29uZGl0aW9ucy4KKyAgICAgICAgICAgIC8vIC0gRmlyc3QgaXMgdGhlIGNhc2Ugd2hlcmUgd2UgYXJlIGRpc2Fzb2NpYXRpbmcgZnJvbSBhbiBJbmZyYSBCc3MgdG8gc3RhcnQgYW4gSUJTUy4KKyAgICAgICAgICAgIC8vIC0gU2Vjb25kIGlzIHRoZSB3aGVuIHdlIGFyZSBkaXNhc3NvY2lhdGluZyBmcm9tIGFuIEluZnJhIEJzcyB0byBqb2luIGFuIElCU1Mgb3IgYSBuZXcKKyAgICAgICAgICAgIC8vIEluZnJhc3RydWN0dXJlIG5ldHdvcmsuCisgICAgICAgICAgICAvLyAtIFRoaXJkIGlzIHdoZXJlIHdlIGFyZSBkb2luZyBhbiBJbmZyYSB0byBJbmZyYSByb2FtIGJldHdlZW4gbmV0d29ya3Mgd2l0aCBkaWZmZXJlbnQKKyAgICAgICAgICAgIC8vIFNTSURzLiAgSW4gYWxsIGNhc2VzLCB3ZSBzZXQgdGhlIG5ldyBCc3MgY29uZmlndXJhdGlvbiBoZXJlIGFuZCBhdHRlbXB0IHRvIGpvaW4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cyLCAiQ1NSIFNtZURpc2Fzc29jUmVxIGRpc2Fzc29jaWF0ZWQgU3VjY2Vzc2Z1bGx5XG4iICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJTbWVEaXNhc3NvY1JlcSBmYWlsZWQgd2l0aCBzdGF0dXNDb2RlPSAweCUwOGxYXG4iLCBzdGF0dXNDb2RlICk7CisgICAgICAgIH0KKyAgICAgICAgLy9XZSBhcmUgbm90IGRvbmUgeWV0LiBHZXQgdGhlIGRhdGEgYW5kIGNvbnRpbnVlIHJvYW1pbmcKKyAgICAgICAgY3NyUm9hbVJlaXNzdWVSb2FtQ29tbWFuZChwTWFjKTsKKyAgICB9CisKK30KKworCitzdGF0aWMgdm9pZCBjc3JSb2FtUm9hbWluZ1N0YXRlRGVhdXRoUnNwUHJvY2Vzc29yKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyU21lRGVhdXRoUnNwICpwU21lUnNwICkKK3sKKyAgICB0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZTsKKworICAgIC8vTm8gb25lIGlzIHNlbmRpbmcgZVdOSV9TTUVfREVBVVRIX1JFUSB0byBQRS4KKyAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoImlzIG5vLW9wXG4iKSk7CisgICAgc3RhdHVzQ29kZSA9IGNzckdldERlQXV0aFJzcFN0YXR1c0NvZGUoIHBTbWVSc3AgKTsKKyAgICBpZiAoIENTUl9JU19ST0FNX1NVQlNUQVRFX0RFQVVUSF9SRVEoIHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCkgKQorICAgIHsKKyAgICAgICAgY3NyUm9hbUNvbXBsZXRlKCBwTWFjLCBlQ3NyTm90aGluZ1RvSm9pbiwgTlVMTCApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoIGVTSVJfU01FX1NVQ0NFU1MgPT0gc3RhdHVzQ29kZSApIAorICAgICAgICB7CisgICAgICAgICAgICAvLyBTdWNjZXNzZnVsbHkgZGVhdXRoIGZyb20gdGhlICdvbGQnIEJzcy4uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMiwgIkNTUiBTbWVEZWF1dGhSZXEgZGlzYXNzb2NpYXRlZCBTdWNjZXNzZnVsbHlcbiIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIlNtZURlYXV0aFJlcSBmYWlsZWQgd2l0aCBzdGF0dXNDb2RlPSAweCUwOGxYXG4iLCBzdGF0dXNDb2RlICk7CisgICAgICAgIH0KKyAgICAgICAgLy9XZSBhcmUgbm90IGRvbmUgeWV0LiBHZXQgdGhlIGRhdGEgYW5kIGNvbnRpbnVlIHJvYW1pbmcKKyAgICAgICAgY3NyUm9hbVJlaXNzdWVSb2FtQ29tbWFuZChwTWFjKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgY3NyUm9hbVJvYW1pbmdTdGF0ZVN0YXJ0QnNzUnNwUHJvY2Vzc29yKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyU21lU3RhcnRCc3NSc3AgKnBTbWVTdGFydEJzc1JzcCApCit7CisgICAgZUNzclJvYW1Db21wbGV0ZVJlc3VsdCByZXN1bHQ7CisgICAgCisgICAgaWYgKCBlU0lSX1NNRV9TVUNDRVNTID09IHBTbWVTdGFydEJzc1JzcC0+c3RhdHVzQ29kZSApIAorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiU21lU3RhcnRCc3NSZXEgU3VjY2Vzc2Z1bFxuIiApOworICAgICAgICByZXN1bHQgPSBlQ3NyU3RhcnRCc3NTdWNjZXNzOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiU21lU3RhcnRCc3NSZXEgZmFpbGVkIHdpdGggc3RhdHVzQ29kZT0gMHglMDhsWFxuIiwgcFNtZVN0YXJ0QnNzUnNwLT5zdGF0dXNDb2RlICk7CisgICAgICAgIC8vTGV0IGNzclJvYW1Db21wbGV0ZSBkZWNpZGUgd2hhdCB0byBkbworICAgICAgICByZXN1bHQgPSBlQ3NyU3RhcnRCc3NGYWlsdXJlOworICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgY3NyUm9hbUNvbXBsZXRlKCBwTWFjLCByZXN1bHQsIHBTbWVTdGFydEJzc1JzcCk7CisjZWxzZQorICAgIGNzclJvYW1Db21wbGV0ZSggcE1hYywgcmVzdWx0LCAmcFNtZVN0YXJ0QnNzUnNwLT5ic3NEZXNjcmlwdGlvbiApOworI2VuZGlmCit9CisKKworLyoKKyAgV2UgbmVlZCB0byBiZSBjYXJlZnVsIG9uIHdoZXRoZXIgdG8gY2FzdCBwTXNnQnVmIChwU21lUnNwKSB0byBvdGhlciB0eXBlIG9mIHN0cnVjdXRyZXMuCisgIEl0IGRlcGVuZHMgb24gaG93IHRoZSBtZXNzYWdlIGlzIGNvbnN0cnVjdGVkLiBJZiB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGxpbVNlbmRTbWVSc3AsCisgIHRoZSBwTXNnQnVmIGlzIG9ubHkgYSBnZW5lcmljIHJlc3BvbnNlIGFuZCBjYW4gb25seSBiZSB1c2VkIGFzIHBvaW50ZXIgdG8gdFNpclNtZVJzcC4KKyAgRm9yIHRoZSBtZXNzYWdlcyB3aGVyZSBzZW5kZXIgYWxsb2NhdGVzIG1lbW9yeSBmb3Igc3BlY2lmaWMgc3RydWN0dXJlcywgdGhlbiBpdCBjYW4gYmUgCisgIGNhc3QgYWNjb3JkaW5nbHkuCisqLwordm9pZCBjc3JSb2FtaW5nU3RhdGVNc2dQcm9jZXNzb3IoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYgKQoreworICAgIHRTaXJTbWVSc3AgKnBTbWVSc3A7CisgICAgdFNtZUlic3NQZWVySW5kICpwSWJzc1BlZXJJbmQ7CisgICAgdENzclJvYW1JbmZvIHJvYW1JbmZvOworICAgICAgICAvLyBUT0RPIFNlc3Npb24gSWQgbmVlZCB0byBiZSBhY3F1aXJlZCBpbiB0aGlzIGZ1bmN0aW9uCisgICAgICAgIHRBTklfVTMyIHNlc3Npb25JZCA9IDA7CisKKyAgICBwU21lUnNwID0gKHRTaXJTbWVSc3AgKilwTXNnQnVmOworCisgICAgc21zTG9nKCBwTWFjLCBMT0cyLCAiTWVzc2FnZSAlZFsweCUwNFhdIHJlY2VpdmVkIGluIHN1YnN0YXRlICVkXG4iLAorICAgICAgICAgICAgICAgIHBTbWVSc3AtPm1lc3NhZ2VUeXBlLCBwU21lUnNwLT5tZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLmN1clN1YlN0YXRlW3BTbWVSc3AtPnNlc3Npb25JZF0gKTsKKyNpZiBkZWZpbmVkIEFOSV9QUk9EVUNUX1RZUEVfQVAKKyAgICBwU21lUnNwLT5tZXNzYWdlVHlwZSA9IHBhbF9iZTE2X3RvX2NwdShwU21lUnNwLT5tZXNzYWdlVHlwZSk7CisgICAgcFNtZVJzcC0+bGVuZ3RoID0gcGFsX2JlMTZfdG9fY3B1KHBTbWVSc3AtPmxlbmd0aCk7CisgICAgcFNtZVJzcC0+c3RhdHVzQ29kZSA9IHBhbF9iZTMyX3RvX2NwdShwU21lUnNwLT5zdGF0dXNDb2RlKTsKKyNlbHNlCisgICAgcFNtZVJzcC0+bWVzc2FnZVR5cGUgPSAocFNtZVJzcC0+bWVzc2FnZVR5cGUpOworICAgIHBTbWVSc3AtPmxlbmd0aCA9IChwU21lUnNwLT5sZW5ndGgpOworICAgIHBTbWVSc3AtPnN0YXR1c0NvZGUgPSAocFNtZVJzcC0+c3RhdHVzQ29kZSk7CisjZW5kaWYKKyAgICBzd2l0Y2ggKHBTbWVSc3AtPm1lc3NhZ2VUeXBlKSAKKyAgICB7CisgICAgICAgIAorICAgICAgICBjYXNlIGVXTklfU01FX0pPSU5fUlNQOiAgICAgIC8vIGluIFJvYW1pbmcgc3RhdGUsIHByb2Nlc3MgdGhlIEpvaW4gcmVzcG9uc2UgbWVzc2FnZS4uLgorICAgICAgICAgICAgaWYgKENTUl9JU19ST0FNX1NVQlNUQVRFX0pPSU5fUkVRKHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9XZSBzZW50IGEgSk9JTl9SRVEKKyAgICAgICAgICAgICAgICBjc3JSb2FtSm9pblJzcFByb2Nlc3NvciggcE1hYywgKHRTaXJTbWVKb2luUnNwICopcFNtZVJzcCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgIGNhc2UgZVdOSV9TTUVfQVVUSF9SU1A6ICAgICAgIC8vIG9yIHRoZSBBdXRoZW50aWNhdGUgcmVzcG9uc2UgbWVzc2FnZS4uLgorICAgICAgICAgICAgaWYgKENTUl9JU19ST0FNX1NVQlNUQVRFX0FVVEhfUkVRKCBwTWFjLCBwU21lUnNwLT5zZXNzaW9uSWQpICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9XZSBzZW50IGEgQVVUSF9SRVEKKyAgICAgICAgICAgICAgICBjc3JSb2FtUm9hbWluZ1N0YXRlQXV0aFJzcFByb2Nlc3NvciggcE1hYywgKHRTaXJTbWVBdXRoUnNwICopcFNtZVJzcCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgIGNhc2UgZVdOSV9TTUVfUkVBU1NPQ19SU1A6ICAgICAvLyBvciB0aGUgUmVhc3NvY2lhdGlvbiByZXNwb25zZSBtZXNzYWdlLi4uCisgICAgICAgICAgICBpZiAoQ1NSX0lTX1JPQU1fU1VCU1RBVEVfUkVBU1NPQ19SRVEoIHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCkgKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjc3JSb2FtUm9hbWluZ1N0YXRlUmVhc3NvY1JzcFByb2Nlc3NvciggcE1hYywgKHRwU2lyU21lSm9pblJzcCApcFNtZVJzcCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGNhc2UgZVdOSV9TTUVfU1RPUF9CU1NfUlNQOiAgICAvLyBvciB0aGUgU3RvcCBCc3MgcmVzcG9uc2UgbWVzc2FnZS4uLgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzclJvYW1Sb2FtaW5nU3RhdGVTdG9wQnNzUnNwUHJvY2Vzc29yKHBNYWMsIHBTbWVSc3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgIGNhc2UgZVdOSV9TTUVfRElTQVNTT0NfUlNQOiAgICAvLyBvciB0aGUgRGlzYXNzb2NpYXRlIHJlc3BvbnNlIG1lc3NhZ2UuLi4KKyAgICAgICAgICAgIGlmICggQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfUkVRKCBwTWFjLCBwU21lUnNwLT5zZXNzaW9uSWQgKSAgICAgIHx8CisgICAgICAgICAgICAgICAgIENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX05PX0pPSU4oIHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCApICB8fAorICAgICAgICAgICAgICAgICBDU1JfSVNfUk9BTV9TVUJTVEFURV9SRUFTU09DX0ZBSUwoIHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCApICAgICAgfHwKKyAgICAgICAgICAgICAgICAgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfRElTQVNTT0NfRk9SQ0VEKCBwTWFjLCBwU21lUnNwLT5zZXNzaW9uSWQgKSAgIHx8CisgICAgICAgICAgICAgICAgIENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0NPTk5FQ1RfQ09OVElOVUUoIHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCApIHx8CisvL0hPCisgICAgICAgICAgICAgICAgIENTUl9JU19ST0FNX1NVQlNUQVRFX0RJU0FTU09DX0hPKCBwTWFjLCBwU21lUnNwLT5zZXNzaW9uSWQgKSAgICAgICAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImVXTklfU01FX0RJU0FTU09DX1JTUCBzdWJTdGF0ZSA9ICVkXG4iKSwgcE1hYy0+cm9hbS5jdXJTdWJTdGF0ZVtwU21lUnNwLT5zZXNzaW9uSWRdKTsKKyAgICAgICAgICAgICAgICBjc3JSb2FtUm9hbWluZ1N0YXRlRGlzYXNzb2NSc3BQcm9jZXNzb3IoIHBNYWMsICh0U2lyU21lRGlzYXNzb2NSc3AgKilwU21lUnNwICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBlV05JX1NNRV9ERUFVVEhfUlNQOiAgICAvLyBvciB0aGUgRGVhdXRoZW50aWNhdGlvbiByZXNwb25zZSBtZXNzYWdlLi4uCisgICAgICAgICAgICBpZiAoIENTUl9JU19ST0FNX1NVQlNUQVRFX0RFQVVUSF9SRVEoIHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCApICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3NyUm9hbVJvYW1pbmdTdGF0ZURlYXV0aFJzcFByb2Nlc3NvciggcE1hYywgKHRTaXJTbWVEZWF1dGhSc3AgKilwU21lUnNwICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TVEFSVF9CU1NfUlNQOiAgICAgIC8vIG9yIHRoZSBTdGFydCBCU1MgcmVzcG9uc2UgbWVzc2FnZS4uLgorICAgICAgICAgICAgaWYgKENTUl9JU19ST0FNX1NVQlNUQVRFX1NUQVJUX0JTU19SRVEoIHBNYWMsIHBTbWVSc3AtPnNlc3Npb25JZCApICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3NyUm9hbVJvYW1pbmdTdGF0ZVN0YXJ0QnNzUnNwUHJvY2Vzc29yKCBwTWFjLCAodFNpclNtZVN0YXJ0QnNzUnNwICopcFNtZVJzcCApOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjYXNlIFdOSV9DRkdfU0VUX0NORjogICAgLy8gcHJvY2VzcyB0aGUgQ29uZmlnIENvbmZpcm0gbWVzc2FnZXMgd2hlbiB3ZSBhcmUgaW4gJ0NvbmZpZycgc3Vic3RhdGUuLi4KKyAgICAgICAgICAgIGlmICggQ1NSX0lTX1JPQU1fU1VCU1RBVEVfQ09ORklHKCBwTWFjLCBwU21lUnNwLT5zZXNzaW9uSWQgKSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzclJvYW1pbmdTdGF0ZUNvbmZpZ0NuZlByb2Nlc3NvciggcE1hYywgKCh0Q3NyQ2ZnU2V0UnNwICopcFNtZVJzcCktPnJlc3BTdGF0dXMgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy9JbiBjYXNlIENTUiBpc3N1ZXMgU1RPUF9CU1MsIHdlIG5lZWQgdG8gdGVsbCBIREQgYWJvdXQgcGVlciBkZXBhcnRlZCBiZWNhc3VlIFBFIGlzIHJlbW92aW5nIHRoZW0KKyAgICAgICAgY2FzZSBlV05JX1NNRV9JQlNTX1BFRVJfREVQQVJURURfSU5EOgorICAgICAgICAgICAgcElic3NQZWVySW5kID0gKHRTbWVJYnNzUGVlckluZCopcFNtZVJzcDsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiQ1NSOiBQZWVyIGRlcGFydGVkIG5vdGlmaWNhdGlvbiBmcm9tIExJTSBpbiBqb2luaW5nIHN0YXRlXG4iKTsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbykgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLnN0YUlkID0gKHRBTklfVTgpcElic3NQZWVySW5kLT5zdGFJZDsKKyAgICAgICAgICAgIHJvYW1JbmZvLnVjYXN0U2lnID0gKHRBTklfVTgpcElic3NQZWVySW5kLT51Y2FzdFNpZzsKKyAgICAgICAgICAgIHJvYW1JbmZvLmJjYXN0U2lnID0gKHRBTklfVTgpcElic3NQZWVySW5kLT5iY2FzdFNpZzsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLnBlZXJNYWMsIHBJYnNzUGVlckluZC0+cGVlckFkZHIsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fQ09OTkVDVF9TVEFUVVNfVVBEQVRFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1BFRVJfREVQQVJURUQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlID0gJWRbMHglWF0gcmVjZWl2ZWQgaW4gc3Vic3RhdGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcFNtZVJzcC0+bWVzc2FnZVR5cGUsIHBTbWVSc3AtPm1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0uY3VyU3ViU3RhdGVbcFNtZVJzcC0+c2Vzc2lvbklkXSApOworCisgICAgICAgICAgICAvL0lmIHdlIGFyZSBjb25uZWN0ZWQsIGNoZWNrIHRoZSBsaW5rIHN0YXR1cyBjaGFuZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICBpZighY3NySXNDb25uU3RhdGVEaXNjb25uZWN0ZWQocE1hYywgc2Vzc2lvbklkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNoZWNrRm9yTGlua1N0YXR1c0NoYW5nZSggcE1hYywgcFNtZVJzcCApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIAorICAgIH0KK30KKworCit2b2lkIGNzclJvYW1Kb2luZWRTdGF0ZU1zZ1Byb2Nlc3NvciggdHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqcE1zZ0J1ZiApCit7CisgICAgdFNpclNtZVJzcCAqcFNpck1zZyA9ICh0U2lyU21lUnNwICopcE1zZ0J1ZjsKKworICAgIHN3aXRjaCAocFNpck1zZy0+bWVzc2FnZVR5cGUpIAorICAgIHsKKyAgICAgICBjYXNlIGVXTklfU01FX0dFVF9TVEFUSVNUSUNTX1JTUDoKKyAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJTdGF0cyByc3AgZnJvbSBQRVxuIikpOworICAgICAgICAgIGNzclJvYW1TdGF0c1JzcFByb2Nlc3NvciggcE1hYywgcFNpck1zZyApOworICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgY2FzZSBlV05JX1NNRV9VUFBFUl9MQVlFUl9BU1NPQ19DTkY6CisgICAgICAgIHsKKyAgICAgICAgICAgIHRDc3JSb2FtU2Vzc2lvbiAgKnBTZXNzaW9uOworICAgICAgICAgICAgdFNpclNtZUFzc29jSW5kVG9VcHBlckxheWVyQ25mICpwVXBwZXJMYXllckFzc29jQ25mOworICAgICAgICAgICAgdENzclJvYW1JbmZvIHJvYW1JbmZvOworICAgICAgICAgICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8gPSBOVUxMOworICAgICAgICAgICAgdEFOSV9VMzIgc2Vzc2lvbklkOworICAgICAgICAgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoIkFTU09DSUFUSU9OIGNvbmZpcm1hdGlvbiBjYW4gYmUgZ2l2ZW4gdG8gdXBwZXIgbGF5ZXIgXG4iKSk7CisKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisgICAgICAgICAgICBwUm9hbUluZm8gPSAmcm9hbUluZm87CisKKyAgICAgICAgICAgIHBVcHBlckxheWVyQXNzb2NDbmYgPSAodFNpclNtZUFzc29jSW5kVG9VcHBlckxheWVyQ25mICopcE1zZ0J1ZjsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1HZXRTZXNzaW9uSWRGcm9tQlNTSUQoIHBNYWMsICh0Q3NyQnNzaWQgKilwVXBwZXJMYXllckFzc29jQ25mLT5ic3NJZCwgJnNlc3Npb25JZCApOworICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworICAgICAgICAgICAgcFJvYW1JbmZvLT5zdGF0dXNDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsgLy9zZW5kIHRoZSBzdGF0dXMgY29kZSBhcyBTdWNjZXNzIAorICAgICAgICAgICAgcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlID0gJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCisgICAgICAgICAgICBwUm9hbUluZm8tPnN0YUlkID0gKHRBTklfVTgpcFVwcGVyTGF5ZXJBc3NvY0NuZi0+YWlkOworICAgICAgICAgICAgcFJvYW1JbmZvLT5yc25JRUxlbiA9ICh0QU5JX1U4KXBVcHBlckxheWVyQXNzb2NDbmYtPnJzbklFLmxlbmd0aDsKKyAgICAgICAgICAgIHBSb2FtSW5mby0+cHJzbklFID0gcFVwcGVyTGF5ZXJBc3NvY0NuZi0+cnNuSUUucnNuSUVkYXRhOworCisgICAgICAgICAgICBwUm9hbUluZm8tPmFkZElFTGVuID0gKHRBTklfVTgpcFVwcGVyTGF5ZXJBc3NvY0NuZi0+YWRkSUUubGVuZ3RoOworICAgICAgICAgICAgcFJvYW1JbmZvLT5wYWRkSUUgPSBwVXBwZXJMYXllckFzc29jQ25mLT5hZGRJRS5hZGRJRWRhdGE7ICAgICAgICAgICAKKworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwUm9hbUluZm8tPnBlZXJNYWMsIHBVcHBlckxheWVyQXNzb2NDbmYtPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBSb2FtSW5mby0+YnNzaWQsIHBVcHBlckxheWVyQXNzb2NDbmYtPmJzc0lkLCBzaXplb2YodENzckJzc2lkKSk7CisKKyAgICAgICAgICAgIHBSb2FtSW5mby0+d21tRW5hYmxlZFN0YSA9IHBVcHBlckxheWVyQXNzb2NDbmYtPndtbUVuYWJsZWRTdGE7CisKKyAgICAgICAgICAgIGlmKENTUl9JU19JTkZSQV9BUChwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlID0gZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lORlJBX0NPTk5FQ1RFRDsKKyAgICAgICAgICAgICAgICBwUm9hbUluZm8tPmZSZWFzc29jUmVxID0gcFVwcGVyTGF5ZXJBc3NvY0NuZi0+cmVhc3NvY1JlcTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgcFJvYW1JbmZvLCAwLCBlQ1NSX1JPQU1fSU5GUkFfSU5ELCBlQ1NSX1JPQU1fUkVTVUxUX0lORlJBX0FTU09DSUFUSU9OX0NORik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihDU1JfSVNfV0RTX0FQKCBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZvc19zbGVlcCggMTAwICk7CisgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9XRFNfQ09OTkVDVEVEOy8vU3RhCisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIHBSb2FtSW5mbywgMCwgZUNTUl9ST0FNX1dEU19JTkQsIGVDU1JfUk9BTV9SRVNVTFRfV0RTX0FTU09DSUFUSU9OX0lORCk7Ly9TdGEKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY3NyUm9hbUNoZWNrRm9yTGlua1N0YXR1c0NoYW5nZSggcE1hYywgcFNpck1zZyApOworICAgICAgICAgIGJyZWFrOworICAgIH0KKworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlU2V0Q29udGV4dFJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCBlQ3NyRW5jcnlwdGlvblR5cGUgRW5jcnlwdFR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjQWRkciAqYnNzSWQsIHRBTklfQk9PTEVBTiBhZGRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX0JPT0xFQU4gZlVuaWNhc3QsIHRBbmlLZXlEaXJlY3Rpb24gYW5pS2V5RGlyZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTgga2V5SWQsIHRBTklfVTE2IGtleUxlbmd0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwS2V5LCB0QU5JX1U4IHBhZVJvbGUgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0QW5pRWRUeXBlIGVkVHlwZTsKKyAgICAKKyAgICBpZihlQ1NSX0VOQ1JZUFRfVFlQRV9VTktOT1dOID09IEVuY3J5cHRUeXBlKQorICAgIHsKKyAgICAgICAgRW5jcnlwdFR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOyAvLyoqKgorICAgIH0KKyAgICAKKyAgICBlZFR5cGUgPSBjc3JUcmFuc2xhdGVFbmNyeXB0VHlwZVRvRWRUeXBlKCBFbmNyeXB0VHlwZSApOworICAgIAorICAgIC8vIEFsbG93IDAga2V5cyB0byBiZSBzZXQgZm9yIHRoZSBub24tV1BBIGVuY3J5cHQgdHlwZXMuLi4gIEZvciBXUEEgZW5jcnlwdCB0eXBlcywgdGhlIG51bSBrZXlzIG11c3QgYmUgbm9uLXplcm8KKyAgICAvLyBvciBMSU0gd2lsbCByZWplY3QgdGhlIHNldCBjb250ZXh0IChhc3N1bWVzIHRoZSBTRVRfQ09OVEVYVCBkb2VzIG5vdCBvY2N1ciB1bnRpbCB0aGUga2V5cyBhcmUgZGlzdHJ1YnV0ZWQpLgorICAgIGlmICggQ1NSX0lTX0VOQ19UWVBFX1NUQVRJQyggRW5jcnlwdFR5cGUgKSB8fAorICAgICAgICAgICBhZGRLZXkgKSAgICAgCisgICAgeworICAgICAgICB0Q3NyUm9hbVNldEtleSBzZXRLZXk7CisKKyAgICAgICAgc2V0S2V5LmVuY1R5cGUgPSBFbmNyeXB0VHlwZTsKKyAgICAgICAgc2V0S2V5LmtleURpcmVjdGlvbiA9IGFuaUtleURpcmVjdGlvbjsgICAgLy9UeCwgUnggb3IgVHgtYW5kLVJ4CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICZzZXRLZXkucGVlck1hYywgYnNzSWQsIHNpemVvZih0Q3NyQnNzaWQpICk7ICAgCisgICAgICAgIHNldEtleS5wYWVSb2xlID0gcGFlUm9sZTsgICAgICAvLzAgZm9yIHN1cHBsaWNhbnQKKyAgICAgICAgc2V0S2V5LmtleUlkID0ga2V5SWQ7ICAvLyBLeWUgaW5kZXgKKyAgICAgICAgc2V0S2V5LmtleUxlbmd0aCA9IGtleUxlbmd0aDsgIAorICAgICAgICBpZigga2V5TGVuZ3RoICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgc2V0S2V5LktleSwgcEtleSwga2V5TGVuZ3RoICk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlU2V0S2V5Q29tbWFuZCggcE1hYywgc2Vzc2lvbklkLCAmc2V0S2V5LCAwICk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK3N0YXRpYyBlSGFsU3RhdHVzIGNzclJvYW1Jc3N1ZVNldEtleUNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbVNldEtleSAqcFNldEtleSwgdEFOSV9VMzIgcm9hbUlkICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgIHRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NDWCAqLworIAorICAgIGRvCisgICAgeworICAgICAgICBwQ29tbWFuZCA9IGNzckdldENvbW1hbmRCdWZmZXIocE1hYyk7CisgICAgICAgIGlmKE5VTEwgPT0gcENvbW1hbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIGdldCBjb21tYW5kIGJ1ZmZlclxuIikgKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBDb21tYW5kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRTZXRLZXk7CisgICAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIC8vIHZhbGlkYXRlIHRoZSBrZXkgbGVuZ3RoLCAgQWRqdXN0IGlmIHRvbyBsb25nLi4uCisgICAgICAgIC8vIGZvciBzdGF0aWMgV0VQIHRoZSBrZXlzIGFyZSBub3Qgc2V0IHRocnUnIFNldENvbnRleHRSZXEKKyAgICAgICAgaWYgKCAoIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwID09IHBTZXRLZXktPmVuY1R5cGUgKSB8fCAKKyAgICAgICAgICAgICAoIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWSA9PSBwU2V0S2V5LT5lbmNUeXBlICkgKSAKKyAgICAgICAgeworICAgICAgICAgICAgLy9LZXlMZW5ndGggbWF5YmUgMCBmb3Igc3RhdGljIFdFUAorICAgICAgICAgICAgaWYoIHBTZXRLZXktPmtleUxlbmd0aCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBwU2V0S2V5LT5rZXlMZW5ndGggPCBDU1JfV0VQNDBfS0VZX0xFTiApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiSW52YWxpZCBXRVA0MCBrZXlsZW5ndGggWz0gJWRdIGluIFNldENvbnRleHQgY2FsbFxuIiwgcFNldEtleS0+a2V5TGVuZ3RoICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnNldEtleUNtZC5rZXlMZW5ndGggPSBDU1JfV0VQNDBfS0VZX0xFTjsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQ29tbWFuZC0+dS5zZXRLZXlDbWQuS2V5LCBwU2V0S2V5LT5LZXksIENTUl9XRVA0MF9LRVlfTEVOICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICggZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0ID09IHBTZXRLZXktPmVuY1R5cGUgKSB8fCAKKyAgICAgICAgICAgICAoIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVkgPT0gcFNldEtleS0+ZW5jVHlwZSApICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vS2V5TGVuZ3RoIG1heWJlIDAgZm9yIHN0YXRpYyBXRVAKKyAgICAgICAgICAgIGlmKCBwU2V0S2V5LT5rZXlMZW5ndGggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcFNldEtleS0+a2V5TGVuZ3RoIDwgQ1NSX1dFUDEwNF9LRVlfTEVOICkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICJJbnZhbGlkIFdFUDEwNCBrZXlsZW5ndGggWz0gJWRdIGluIFNldENvbnRleHQgY2FsbFxuIiwgcFNldEtleS0+a2V5TGVuZ3RoICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnNldEtleUNtZC5rZXlMZW5ndGggPSBDU1JfV0VQMTA0X0tFWV9MRU47CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcENvbW1hbmQtPnUuc2V0S2V5Q21kLktleSwgcFNldEtleS0+S2V5LCBDU1JfV0VQMTA0X0tFWV9MRU4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZUNTUl9FTkNSWVBUX1RZUEVfVEtJUCA9PSBwU2V0S2V5LT5lbmNUeXBlICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcFNldEtleS0+a2V5TGVuZ3RoIDwgQ1NSX1RLSVBfS0VZX0xFTiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiSW52YWxpZCBUS0lQIGtleWxlbmd0aCBbPSAlZF0gaW4gU2V0Q29udGV4dCBjYWxsXG4iLCBwU2V0S2V5LT5rZXlMZW5ndGggKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNldEtleUNtZC5rZXlMZW5ndGggPSBDU1JfVEtJUF9LRVlfTEVOOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcENvbW1hbmQtPnUuc2V0S2V5Q21kLktleSwgcFNldEtleS0+S2V5LCBDU1JfVEtJUF9LRVlfTEVOICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIGVDU1JfRU5DUllQVF9UWVBFX0FFUyA9PSBwU2V0S2V5LT5lbmNUeXBlICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcFNldEtleS0+a2V5TGVuZ3RoIDwgQ1NSX0FFU19LRVlfTEVOICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICJJbnZhbGlkIEFFUy9DQ01QIGtleWxlbmd0aCBbPSAlZF0gaW4gU2V0Q29udGV4dCBjYWxsXG4iLCBwU2V0S2V5LT5rZXlMZW5ndGggKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNldEtleUNtZC5rZXlMZW5ndGggPSBDU1JfQUVTX0tFWV9MRU47CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQ29tbWFuZC0+dS5zZXRLZXlDbWQuS2V5LCBwU2V0S2V5LT5LZXksIENTUl9BRVNfS0VZX0xFTiApOworICAgICAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICAgICAgZWxzZSBpZiAoIGVDU1JfRU5DUllQVF9UWVBFX1dQSSA9PSBwU2V0S2V5LT5lbmNUeXBlICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcFNldEtleS0+a2V5TGVuZ3RoIDwgQ1NSX1dBUElfS0VZX0xFTiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiSW52YWxpZCBXQVBJIGtleWxlbmd0aCBbPSAlZF0gaW4gU2V0Q29udGV4dCBjYWxsXG4iLCBwU2V0S2V5LT5rZXlMZW5ndGggKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNldEtleUNtZC5rZXlMZW5ndGggPSBDU1JfV0FQSV9LRVlfTEVOOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcENvbW1hbmQtPnUuc2V0S2V5Q21kLktleSwgcFNldEtleS0+S2V5LCBDU1JfV0FQSV9LRVlfTEVOICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgZWxzZSBpZiAoIGVDU1JfRU5DUllQVF9UWVBFX0tSSyA9PSBwU2V0S2V5LT5lbmNUeXBlICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcFNldEtleS0+a2V5TGVuZ3RoIDwgQ1NSX0tSS19LRVlfTEVOICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICJJbnZhbGlkIEtSSyBrZXlsZW5ndGggWz0gJWRdIGluIFNldENvbnRleHQgY2FsbFxuIiwgcFNldEtleS0+a2V5TGVuZ3RoICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+Y2N4Q2NrbUluZm8ua3JrLCBwU2V0S2V5LT5LZXksIENTUl9LUktfS0VZX0xFTiApOworICAgICAgICAgICAgcFNlc3Npb24tPmNjeENja21JbmZvLnJlYXNzb2NfcmVxX251bT0xOworICAgICAgICAgICAgcFNlc3Npb24tPmNjeENja21JbmZvLmtya19wbHVtYmVkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0NYICovCisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworICAgICAgICAvL0NoZWNrIGZvciAxMXcgQklQCisgICAgICAgIGVsc2UgaWYgKCBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVNfQ01BQyA9PSBwU2V0S2V5LT5lbmNUeXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgdEFOSV9VMTYgY291bnQgPSAwOworICAgICAgICAgICAgaWYgKCBwU2V0S2V5LT5rZXlMZW5ndGggPCBDU1JfQUVTX0tFWV9MRU4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIkludmFsaWQgQUVTL0NDTVAga2V5bGVuZ3RoIFs9ICVkXSBpbiBTZXRDb250ZXh0IGNhbGxcbiIsIHBTZXRLZXktPmtleUxlbmd0aCApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcENvbW1hbmQtPnUuc2V0S2V5Q21kLmtleUxlbmd0aCA9IENTUl9BRVNfS0VZX0xFTjsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBDb21tYW5kLT51LnNldEtleUNtZC5LZXksIHBTZXRLZXktPktleSwgQ1NSX0FFU19LRVlfTEVOICk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICBwQ29tbWFuZC0+dS5zZXRLZXlDbWQucm9hbUlkID0gcm9hbUlkOworICAgICAgICBwQ29tbWFuZC0+dS5zZXRLZXlDbWQuZW5jVHlwZSA9IHBTZXRLZXktPmVuY1R5cGU7CisgICAgICAgIHBDb21tYW5kLT51LnNldEtleUNtZC5rZXlEaXJlY3Rpb24gPSBwU2V0S2V5LT5rZXlEaXJlY3Rpb247ICAgIC8vVHgsIFJ4IG9yIFR4LWFuZC1SeAorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAmcENvbW1hbmQtPnUuc2V0S2V5Q21kLnBlZXJNYWMsICZwU2V0S2V5LT5wZWVyTWFjLCBzaXplb2YodENzckJzc2lkKSApOyAgIAorICAgICAgICBwQ29tbWFuZC0+dS5zZXRLZXlDbWQucGFlUm9sZSA9IHBTZXRLZXktPnBhZVJvbGU7ICAgICAgLy8wIGZvciBzdXBwbGljYW50CisgICAgICAgIHBDb21tYW5kLT51LnNldEtleUNtZC5rZXlJZCA9IHBTZXRLZXktPmtleUlkOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQ29tbWFuZC0+dS5zZXRLZXlDbWQua2V5UnNjLCBwU2V0S2V5LT5rZXlSc2MsIENTUl9NQVhfUlNDX0xFTiApOworICAgICAgICAvL0Fsd2F5cyBwdXQgc2V0IGtleSB0byB0aGUgaGVhZCBvZiB0aGUgUSBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IHRoaW5nIHRvIGdldCBleGVjdXRlZCBpbiBjYXNlIG9mIFdUX0tFWSBzdGF0ZQorICAgICAgICAgCisgICAgICAgIHN0YXR1cyA9IGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwQ29tbWFuZCwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBzZW5kIG1lc3NhZ2Ugc3RhdHVzID0gJWRcbiIpLCBzdGF0dXMgKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKDApOworCisgICAgLy8gRnJlZSB0aGUgY29tbWFuZCBpZiB0aGVyZSBoYXMgYmVlbiBhIGZhaWx1cmUsIG9yIGl0IGlzIGEgCisgICAgLy8gImxvY2FsIiBvcGVyYXRpb24gbGlrZSB0aGUgc2V0IENDWCBDQ0tNIEtSSyBrZXkuCisgICAgaWYoICghSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSAmJiAoIE5VTEwgIT0gcENvbW1hbmQgKSkgCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAgICAgfHwgKCBlQ1NSX0VOQ1JZUFRfVFlQRV9LUksgPT0gcFNldEtleS0+ZW5jVHlwZSApIAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KKyAgICAgICAgICAgICkKKyAgICB7CisgICAgICAgIGNzclJlbGVhc2VDb21tYW5kU2V0S2V5KCBwTWFjLCBwQ29tbWFuZCApOworICAgIH0KKworICAgIHJldHVybiggc3RhdHVzICk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVSZW1vdmVLZXlDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtUmVtb3ZlS2V5ICpwUmVtb3ZlS2V5LCB0QU5JX1UzMiByb2FtSWQgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgdFNtZUNtZCAqcENvbW1hbmQgPSBOVUxMOworICAgIHRBTklfQk9PTEVBTiBmSW1lZGlhdGUgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiggIWNzcklzU2V0S2V5QWxsb3dlZChwTWFjLCBzZXNzaW9uSWQpICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgRkwoIiB3cm9uZyBzdGF0ZSBub3QgYWxsb3dlZCB0byBzZXQga2V5XG4iKSApOworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfQ1NSX1dST05HX1NUQVRFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcENvbW1hbmQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOworICAgICAgICBpZihOVUxMID09IHBDb21tYW5kKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXJcbiIpICk7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kUmVtb3ZlS2V5OworICAgICAgICBwQ29tbWFuZC0+c2Vzc2lvbklkID0gKHRBTklfVTgpc2Vzc2lvbklkOworICAgICAgICBwQ29tbWFuZC0+dS5yZW1vdmVLZXlDbWQucm9hbUlkID0gcm9hbUlkOworICAgICAgICBwQ29tbWFuZC0+dS5yZW1vdmVLZXlDbWQuZW5jVHlwZSA9IHBSZW1vdmVLZXktPmVuY1R5cGU7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICZwQ29tbWFuZC0+dS5yZW1vdmVLZXlDbWQucGVlck1hYywgJnBSZW1vdmVLZXktPnBlZXJNYWMsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyAgICAgICAgcENvbW1hbmQtPnUucmVtb3ZlS2V5Q21kLmtleUlkID0gcFJlbW92ZUtleS0+a2V5SWQ7CisgICAgICAgIGlmKCBDU1JfSVNfV0FJVF9GT1JfS0VZKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaW4gdGhpcyBjYXNlLCBwdXQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgUSBpbmNhc2UgdGhlcmUgaXMgYSBzZXQga2V5IHBlbmRpbmcuCisgICAgICAgICAgICBmSW1lZGlhdGUgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCJrZXlUeXBlPSVkLCBrZXlJZD0lZCwgUGVlck1hYz0lMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4XG4iKSwgICAgICAgCisgICAgICAgICAgICBwUmVtb3ZlS2V5LT5lbmNUeXBlLCBwUmVtb3ZlS2V5LT5rZXlJZCwKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnJlbW92ZUtleUNtZC5wZWVyTWFjWzBdLAorICAgICAgICAgICAgcENvbW1hbmQtPnUucmVtb3ZlS2V5Q21kLnBlZXJNYWNbMV0sCisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yZW1vdmVLZXlDbWQucGVlck1hY1syXSwgCisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yZW1vdmVLZXlDbWQucGVlck1hY1szXSwgCisgICAgICAgICAgICBwQ29tbWFuZC0+dS5yZW1vdmVLZXlDbWQucGVlck1hY1s0XSwKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnJlbW92ZUtleUNtZC5wZWVyTWFjWzVdKTsKKworICAgICAgICBzdGF0dXMgPSBjc3JRdWV1ZVNtZUNvbW1hbmQocE1hYywgcENvbW1hbmQsIGZJbWVkaWF0ZSk7CisgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICgwKTsKKworICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSAmJiAoIE5VTEwgIT0gcENvbW1hbmQgKSApCisgICAgeworICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZFJlbW92ZUtleSggcE1hYywgcENvbW1hbmQgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyApOworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbVByb2Nlc3NTZXRLZXlDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdEFOSV9VOCBudW1LZXlzID0gKCBwQ29tbWFuZC0+dS5zZXRLZXlDbWQua2V5TGVuZ3RoICkgPyAxIDogMDsKKyAgICB0QW5pRWRUeXBlIGVkVHlwZSA9IGNzclRyYW5zbGF0ZUVuY3J5cHRUeXBlVG9FZFR5cGUoIHBDb21tYW5kLT51LnNldEtleUNtZC5lbmNUeXBlICk7CisgICAgdEFOSV9CT09MRUFOIGZVbmljYXN0ID0gKCBwQ29tbWFuZC0+dS5zZXRLZXlDbWQucGVlck1hY1swXSA9PSAweEZGICkgPyBlQU5JX0JPT0xFQU5fRkFMU0UgOiBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQgPSBwQ29tbWFuZC0+c2Vzc2lvbklkOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX0RFRihzZXRLZXlFdmVudCwgdm9zX2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlKTsKKworICAgIGlmKGVDU1JfRU5DUllQVF9UWVBFX05PTkUgIT0gZWRUeXBlKQorICAgIHsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmc2V0S2V5RXZlbnQsIHNpemVvZih2b3NfZXZlbnRfd2xhbl9zZWN1cml0eV9wYXlsb2FkX3R5cGUpKTsKKyAgICAgICAgaWYoICooKCB0QU5JX1U4ICopJnBDb21tYW5kLT51LnNldEtleUNtZC5wZWVyTWFjKSAmIDB4MDEgKQorICAgICAgICB7CisgICAgICAgICAgICBzZXRLZXlFdmVudC5ldmVudElkID0gV0xBTl9TRUNVUklUWV9FVkVOVF9TRVRfR1RLX1JFUTsKKyAgICAgICAgICAgIHNldEtleUV2ZW50LmVuY3J5cHRpb25Nb2RlTXVsdGljYXN0ID0gKHZfVThfdClkaWFnRW5jVHlwZUZyb21DU1JUeXBlKHBDb21tYW5kLT51LnNldEtleUNtZC5lbmNUeXBlKTsKKyAgICAgICAgICAgIHNldEtleUV2ZW50LmVuY3J5cHRpb25Nb2RlVW5pY2FzdCA9ICh2X1U4X3QpZGlhZ0VuY1R5cGVGcm9tQ1NSVHlwZShwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5FbmNyeXB0aW9uVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzZXRLZXlFdmVudC5ldmVudElkID0gV0xBTl9TRUNVUklUWV9FVkVOVF9TRVRfUFRLX1JFUTsKKyAgICAgICAgICAgIHNldEtleUV2ZW50LmVuY3J5cHRpb25Nb2RlVW5pY2FzdCA9ICh2X1U4X3QpZGlhZ0VuY1R5cGVGcm9tQ1NSVHlwZShwQ29tbWFuZC0+dS5zZXRLZXlDbWQuZW5jVHlwZSk7CisgICAgICAgICAgICBzZXRLZXlFdmVudC5lbmNyeXB0aW9uTW9kZU11bHRpY2FzdCA9ICh2X1U4X3QpZGlhZ0VuY1R5cGVGcm9tQ1NSVHlwZShwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlKTsKKyAgICAgICAgfQorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBzZXRLZXlFdmVudC5ic3NpZCwgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQsIDYgKTsKKyAgICAgICAgaWYoQ1NSX0lTX0VOQ19UWVBFX1NUQVRJQyhlZFR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICB0QU5JX1UzMiBkZWZLZXlJZDsKKworICAgICAgICAgICAgLy9JdCBoYXMgdG8gYmUgc3RhdGljIFdFUCBoZXJlCisgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MoY2NtQ2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSUQsICZkZWZLZXlJZCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldEtleUV2ZW50LmtleUlkID0gKHZfVThfdClkZWZLZXlJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldEtleUV2ZW50LmtleUlkID0gcENvbW1hbmQtPnUuc2V0S2V5Q21kLmtleUlkOworICAgICAgICB9CisgICAgICAgIHNldEtleUV2ZW50LmF1dGhNb2RlID0gKHZfVThfdClkaWFnQXV0aFR5cGVGcm9tQ1NSVHlwZShwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5BdXRoVHlwZSk7CisgICAgICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZzZXRLZXlFdmVudCwgRVZFTlRfV0xBTl9TRUNVUklUWSk7CisgICAgfQorI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKworICAgIGlmKCBjc3JJc1NldEtleUFsbG93ZWQocE1hYywgc2Vzc2lvbklkKSApCisgICAgeworICAgICAgICBzdGF0dXMgPSBjc3JTZW5kTUJTZXRDb250ZXh0UmVxTXNnKCBwTWFjLCBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTggKikmcENvbW1hbmQtPnUuc2V0S2V5Q21kLnBlZXJNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1LZXlzLCBlZFR5cGUsIGZVbmljYXN0LCBwQ29tbWFuZC0+dS5zZXRLZXlDbWQua2V5RGlyZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUuc2V0S2V5Q21kLmtleUlkLCBwQ29tbWFuZC0+dS5zZXRLZXlDbWQua2V5TGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUuc2V0S2V5Q21kLktleSwgcENvbW1hbmQtPnUuc2V0S2V5Q21kLnBhZVJvbGUsIAorICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5zZXRLZXlDbWQua2V5UnNjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCBGTCgiIGNhbm5vdCBwcm9jZXNzIG5vdCBjb25uZWN0ZWRcbiIpICk7CisgICAgICAgIC8vU2V0IHRoaXMgc3RhdHVzIHNvIHRoZSBlcnJvciBoYW5kbGluZyB0YWtlIGNhcmUgb2YgdGhlIGNhc2UuCisgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0NTUl9XUk9OR19TVEFURTsKKyAgICB9CisgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSApCisgICAgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgIGVycm9yIHN0YXR1cyAlZFxuIiksIHN0YXR1cyApOworICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKCBwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIHBDb21tYW5kLT51LnNldEtleUNtZC5yb2FtSWQsIGVDU1JfUk9BTV9TRVRfS0VZX0NPTVBMRVRFLCBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKyAgICAgICAgaWYoZUNTUl9FTkNSWVBUX1RZUEVfTk9ORSAhPSBlZFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAqKCggdEFOSV9VOCAqKSZwQ29tbWFuZC0+dS5zZXRLZXlDbWQucGVlck1hYykgJiAweDAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXRLZXlFdmVudC5ldmVudElkID0gV0xBTl9TRUNVUklUWV9FVkVOVF9TRVRfR1RLX1JTUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXRLZXlFdmVudC5ldmVudElkID0gV0xBTl9TRUNVUklUWV9FVkVOVF9TRVRfUFRLX1JTUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEtleUV2ZW50LnN0YXR1cyA9IFdMQU5fU0VDVVJJVFlfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmc2V0S2V5RXZlbnQsIEVWRU5UX1dMQU5fU0VDVVJJVFkpOworICAgICAgICB9CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCisgICAgfQorCisgICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtUHJvY2Vzc1JlbW92ZUtleUNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICB0cFNpclNtZVJlbW92ZUtleVJlcSBwTXNnID0gTlVMTDsKKyAgICB0QU5JX1UxNiB3TXNnTGVuID0gc2l6ZW9mKHRTaXJTbWVSZW1vdmVLZXlSZXEpOworICAgIHRBTklfVTggKnA7CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYocmVtb3ZlS2V5RXZlbnQsIHZvc19ldmVudF93bGFuX3NlY3VyaXR5X3BheWxvYWRfdHlwZSk7CisKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZyZW1vdmVLZXlFdmVudCwgc2l6ZW9mKHZvc19ldmVudF93bGFuX3NlY3VyaXR5X3BheWxvYWRfdHlwZSkpOworICAgIHJlbW92ZUtleUV2ZW50LmV2ZW50SWQgPSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1JFTU9WRV9LRVlfUkVROworICAgIHJlbW92ZUtleUV2ZW50LmVuY3J5cHRpb25Nb2RlTXVsdGljYXN0ID0gKHZfVThfdClkaWFnRW5jVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm1jRW5jcnlwdGlvblR5cGUpOworICAgIHJlbW92ZUtleUV2ZW50LmVuY3J5cHRpb25Nb2RlVW5pY2FzdCA9ICh2X1U4X3QpZGlhZ0VuY1R5cGVGcm9tQ1NSVHlwZShwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5FbmNyeXB0aW9uVHlwZSk7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcmVtb3ZlS2V5RXZlbnQuYnNzaWQsIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLCA2ICk7CisgICAgcmVtb3ZlS2V5RXZlbnQua2V5SWQgPSBwQ29tbWFuZC0+dS5yZW1vdmVLZXlDbWQua2V5SWQ7CisgICAgcmVtb3ZlS2V5RXZlbnQuYXV0aE1vZGUgPSAodl9VOF90KWRpYWdBdXRoVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkF1dGhUeXBlKTsKKyAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmcmVtb3ZlS2V5RXZlbnQsIEVWRU5UX1dMQU5fU0VDVVJJVFkpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKworICAgIGlmKCBjc3JJc1NldEtleUFsbG93ZWQocE1hYywgc2Vzc2lvbklkKSApCisgICAgeworICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIHdNc2dMZW4gKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCBGTCgiIHdyb25nIHN0YXRlIG5vdCBhbGxvd2VkIHRvIHNldCBrZXlcbiIpICk7CisgICAgICAgIC8vU2V0IHRoZSBlcnJvciBzdGF0dXMgc28gZXJyb3IgaGFuZGxpbmcga2lja3MgaW4gYmVsb3cKKyAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfQ1NSX1dST05HX1NUQVRFOworICAgIH0KKyAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgeworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2csIHdNc2dMZW4pOworICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfUkVNT1ZFS0VZX1JFUSk7CisgICAgICAgICAgICAgICAgcE1zZy0+bGVuZ3RoID0gcGFsX2NwdV90b19iZTE2KHdNc2dMZW4pOworCisgICAgICAgIHBNc2ctPnNlc3Npb25JZCA9ICh0QU5JX1U4KXNlc3Npb25JZDsKKyAgICAgICAgcE1zZy0+dHJhbnNhY3Rpb25JZCA9IDA7CisgICAgICAgIHAgPSAodEFOSV9VOCAqKXBNc2cgKyBzaXplb2YocE1zZy0+bWVzc2FnZVR5cGUpICsgc2l6ZW9mKHBNc2ctPmxlbmd0aCkgKworICAgICAgICAgICAgc2l6ZW9mKHBNc2ctPnNlc3Npb25JZCkgKyBzaXplb2YocE1zZy0+dHJhbnNhY3Rpb25JZCk7CisgICAgICAgIC8vIGJzc0lkIC0gY29weSBmcm9tIHNlc3Npb24gSW5mbworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwLCAmcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyAgICAgICAgcCArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgICAgICAvLyBwZWVyTWFjQWRkcgorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwLCBwQ29tbWFuZC0+dS5yZW1vdmVLZXlDbWQucGVlck1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworICAgICAgICBwICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgICAgIC8vIGVkVHlwZQorICAgICAgICAqcCA9ICh0QU5JX1U4KWNzclRyYW5zbGF0ZUVuY3J5cHRUeXBlVG9FZFR5cGUoIHBDb21tYW5kLT51LnJlbW92ZUtleUNtZC5lbmNUeXBlICk7CisgICAgICAgIHArKzsKKyAgICAgICAgLy8gd2VwdHlwZQorICAgICAgICBpZiggKCBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVkgPT0gcENvbW1hbmQtPnUucmVtb3ZlS2V5Q21kLmVuY1R5cGUgKSB8fCAKKyAgICAgICAgICAgICggZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWSA9PSBwQ29tbWFuZC0+dS5yZW1vdmVLZXlDbWQuZW5jVHlwZSApICkKKyAgICAgICAgeworICAgICAgICAgICAgKnAgPSAodEFOSV9VOCllU0lSX1dFUF9TVEFUSUM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcCA9ICh0QU5JX1U4KWVTSVJfV0VQX0RZTkFNSUM7CisgICAgICAgIH0KKyAgICAgICAgcCsrOworICAgICAgICAvL2tleWlkCisgICAgICAgICpwID0gcENvbW1hbmQtPnUucmVtb3ZlS2V5Q21kLmtleUlkOworICAgICAgICBwKys7CisgICAgICAgICpwID0gKHBDb21tYW5kLT51LnJlbW92ZUtleUNtZC5wZWVyTWFjWzBdID09IDB4RkYgKSA/IDAgOiAxOworCisgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgfQorCisgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBlcnJvciBzdGF0dXMgXG4iKSwgc3RhdHVzICk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorICAgICAgICByZW1vdmVLZXlFdmVudC5ldmVudElkID0gV0xBTl9TRUNVUklUWV9FVkVOVF9SRU1PVkVfS0VZX1JTUDsKKyAgICAgICAgcmVtb3ZlS2V5RXZlbnQuc3RhdHVzID0gV0xBTl9TRUNVUklUWV9TVEFUVVNfRkFJTFVSRTs7CisgICAgICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZyZW1vdmVLZXlFdmVudCwgRVZFTlRfV0xBTl9TRUNVUklUWSk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCisgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2soIHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgcENvbW1hbmQtPnUucmVtb3ZlS2V5Q21kLnJvYW1JZCwgZUNTUl9ST0FNX1JFTU9WRV9LRVlfQ09NUExFVEUsIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSk7CisgICAgfQorCisgICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKKworCitlSGFsU3RhdHVzIGNzclJvYW1TZXRLZXkoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1TZXRLZXkgKnBTZXRLZXksIHRBTklfVTMyIHJvYW1JZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgCisgICAgaWYoICFjc3JJc1NldEtleUFsbG93ZWQocE1hYywgc2Vzc2lvbklkKSApCisgICAgeworICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19DU1JfV1JPTkdfU1RBVEU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZVNldEtleUNvbW1hbmQoIHBNYWMsIHNlc3Npb25JZCwgcFNldEtleSwgcm9hbUlkICk7CisgICAgfQorCisgICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKKworLyoKKyAgIFByZXBhcmUgYSBmaWx0ZXIgYmFzZSBvbiBhIHByb2ZpbGUgZm9yIHBhcnNpbmcgdGhlIHNjYW4gcmVzdWx0cy4KKyAgIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIGNhbGxlciBNVVNUIGNhbGwgY3NyRnJlZVNjYW5GaWx0ZXIgb24gCisgICBwU2NhbkZpbHRlciB3aGVuIGl0IGlzIGRvbmUgd2l0aCB0aGUgZmlsdGVyLgorKi8KK2VIYWxTdGF0dXMgY3NyUm9hbVByZXBhcmVGaWx0ZXJGcm9tUHJvZmlsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXIpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRBTklfVTMyIHNpemUgPSAwOworICAgIHRBTklfVTggIGluZGV4ID0gMDsKKyAgICAKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYocFByb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEcykKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZSA9IHNpemVvZih0Q3NyQnNzaWQpICogcFByb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEczsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2NhbkZpbHRlci0+QlNTSURzLmJzc2lkLCBzaXplKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSBwUHJvZmlsZS0+QlNTSURzLm51bU9mQlNTSURzOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlci0+QlNTSURzLmJzc2lkLCBwUHJvZmlsZS0+QlNTSURzLmJzc2lkLCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZihwUHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFDU1JfSVNfV0RTX1NUQSggcFByb2ZpbGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNjYW5GaWx0ZXItPlNTSURzLm51bU9mU1NJRHMgPSBwUHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0ZvciBXRFMgc3RhdGlvbgorICAgICAgICAgICAgICAgIC8vV2UgYWx3YXlzIHVzZSBpbmRleCAxIGZvciBzZWxmIFNTSUQuIEluZGV4IDAgZm9yIHBlZXIncyBTU0lEIHRoYXQgd2Ugd2FudCB0byBqb2luCisgICAgICAgICAgICAgICAgcFNjYW5GaWx0ZXItPlNTSURzLm51bU9mU1NJRHMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZSA9IHNpemVvZih0Q3NyU1NJREluZm8pICogcFByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHM7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0LCBzaXplKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0LCBwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3QsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGlmKCFwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgfHwgKHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXSA9PSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKyAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihwUHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscykKKyAgICAgICAgeworICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNjYW5GaWx0ZXItPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LCBzaXplb2YoKnBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCkgKiBwUHJvZmlsZS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyk7CisgICAgICAgICAgIHBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKyAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IHBQcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOyBpbmRleCsrKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGlmKGNzclJvYW1Jc0NoYW5uZWxWYWxpZChwTWFjLCBwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaW5kZXhdKSkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwU2NhbkZpbHRlci0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbcFNjYW5GaWx0ZXItPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHNdIAorICAgICAgICAgICAgICAgICAgICAgICA9IHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpbmRleF07CisgICAgICAgICAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzKys7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgicHJvY2VzcyBhIGNoYW5uZWwgKCVkKSB0aGF0IGlzIGludmFsaWRcbiIpLCBwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIkNoYW5uZWwgbGlzdCBlbXB0eVxuIikpOworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBTY2FuRmlsdGVyLT51YXBzZF9tYXNrID0gcFByb2ZpbGUtPnVhcHNkX21hc2s7CisgICAgICAgIHBTY2FuRmlsdGVyLT5hdXRoVHlwZSA9IHBQcm9maWxlLT5BdXRoVHlwZTsKKyAgICAgICAgcFNjYW5GaWx0ZXItPkVuY3J5cHRpb25UeXBlID0gcFByb2ZpbGUtPkVuY3J5cHRpb25UeXBlOworICAgICAgICBwU2NhbkZpbHRlci0+bWNFbmNyeXB0aW9uVHlwZSA9IHBQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlOworICAgICAgICBwU2NhbkZpbHRlci0+QlNTVHlwZSA9IHBQcm9maWxlLT5CU1NUeXBlOworICAgICAgICBwU2NhbkZpbHRlci0+cGh5TW9kZSA9IHBQcm9maWxlLT5waHlNb2RlOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgIC8vY2hlY2sgaWYgdXNlciBhc2tlZCBmb3IgV0FQSSB3aXRoIDExbiBvciBhdXRvIG1vZGUsIGluIHRoYXQgY2FzZSBtb2RpZnkKKyAgICAgICAgLy90aGUgcGh5bW9kZSB0byAxMWcKKyAgICAgICAgaWYoY3NySXNQcm9maWxlV2FwaShwUHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICBpZihwU2NhbkZpbHRlci0+cGh5TW9kZSAmIGVDU1JfRE9UMTFfTU9ERV8xMW4pCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5waHlNb2RlICY9IH5lQ1NSX0RPVDExX01PREVfMTFuOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBpZihwU2NhbkZpbHRlci0+cGh5TW9kZSAmIGVDU1JfRE9UMTFfTU9ERV9BVVRPKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2NhbkZpbHRlci0+cGh5TW9kZSAmPSB+ZUNTUl9ET1QxMV9NT0RFX0FVVE87CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmKCFwU2NhbkZpbHRlci0+cGh5TW9kZSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5waHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExZzsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisgICAgICAgIC8qU2F2ZSB0aGUgV1BTIGluZm8qLworICAgICAgICBwU2NhbkZpbHRlci0+YldQU0Fzc29jaWF0aW9uID0gcFByb2ZpbGUtPmJXUFNBc3NvY2lhdGlvbjsKKworICAgICAgICBpZiggcFByb2ZpbGUtPmNvdW50cnlDb2RlWzBdICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9UaGlzIGNhdXNlcyB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24gdG8gdXNlIGNvdW50cnlDb2RlIGFzIG9uZSBvZiB0aGUgY3JpdGVyaWEuCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU2NhbkZpbHRlci0+Y291bnRyeUNvZGUsIHBQcm9maWxlLT5jb3VudHJ5Q29kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4gKTsKKyAgICAgICAgfQorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgIGlmIChwUHJvZmlsZS0+TURJRC5tZGllUHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgcFNjYW5GaWx0ZXItPk1ESUQubWRpZVByZXNlbnQgPSAxOworICAgICAgICAgICAgcFNjYW5GaWx0ZXItPk1ESUQubW9iaWxpdHlEb21haW4gPSBwUHJvZmlsZS0+TURJRC5tb2JpbGl0eURvbWFpbjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgCisgICAgfXdoaWxlKDApOworICAgIAorICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIGNzckZyZWVTY2FuRmlsdGVyKHBNYWMsIHBTY2FuRmlsdGVyKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuKHN0YXR1cyk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzclJvYW1Jc3N1ZVdtU3RhdHVzQ2hhbmdlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JSb2FtV21TdGF0dXNDaGFuZ2VUeXBlcyBUeXBlLCB0U2lyU21lUnNwICpwU21lUnNwICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZkNvbW1hbmRRdWV1ZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdFNtZUNtZCAqcENvbW1hbmQ7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHR5cGUgaXMgb2suLi4KKyAgICAgICAgaWYgKCAoIGVDc3JEaXNhc3NvY2lhdGVkICE9IFR5cGUgKSAmJiAoIGVDc3JEZWF1dGhlbnRpY2F0ZWQgIT0gVHlwZSApICkgYnJlYWs7CisgICAgICAgIHBDb21tYW5kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlciggcE1hYyApOworICAgICAgICBpZiAoICFwQ29tbWFuZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIGdldCBjb21tYW5kIGJ1ZmZlclxuIikgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vQ2hhbmdlIHRoZSBzdWJzdGF0ZSBpbiBjYXNlIGl0IGlzIHdhaXRpbmcgZm9yIGtleQorICAgICAgICBpZiggQ1NSX0lTX1dBSVRfRk9SX0tFWSggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JSb2FtU3RvcFdhaXRGb3JLZXlUaW1lciggcE1hYyApOworICAgICAgICAgICAgY3NyUm9hbVN1YnN0YXRlQ2hhbmdlKCBwTWFjLCBlQ1NSX1JPQU1fU1VCU1RBVEVfTk9ORSwgc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgICAgICBwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kV21TdGF0dXNDaGFuZ2U7CisgICAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIHBDb21tYW5kLT51LndtU3RhdHVzQ2hhbmdlQ21kLlR5cGUgPSBUeXBlOworICAgICAgICBpZiAoIGVDc3JEaXNhc3NvY2lhdGVkID09ICBUeXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgJnBDb21tYW5kLT51LndtU3RhdHVzQ2hhbmdlQ21kLnUuRGlzYXNzb2NJbmRNc2csIHBTbWVSc3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHBDb21tYW5kLT51LndtU3RhdHVzQ2hhbmdlQ21kLnUuRGlzYXNzb2NJbmRNc2cgKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgJnBDb21tYW5kLT51LndtU3RhdHVzQ2hhbmdlQ21kLnUuRGVhdXRoSW5kTXNnLCBwU21lUnNwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHBDb21tYW5kLT51LndtU3RhdHVzQ2hhbmdlQ21kLnUuRGVhdXRoSW5kTXNnICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBjc3JRdWV1ZVNtZUNvbW1hbmQocE1hYywgcENvbW1hbmQsIGVBTklfQk9PTEVBTl9UUlVFKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgZkNvbW1hbmRRdWV1ZWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBcbiIpICk7CisgICAgICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZFdtU3RhdHVzQ2hhbmdlKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICB9CisKKworICAgICAgICAvKiBBUCBoYXMgaXNzdWVkIERpc3NhYy9EZWF1dGgsIFNldCB0aGUgb3BlcmF0aW5nIG1vZGUgdmFsdWUgdG8gY29uZmlndXJlZCB2YWx1ZSAqLworICAgICAgICBjc3JTZXREZWZhdWx0RG90MTFNb2RlKCBwTWFjICk7CisKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICByZXR1cm4oIGZDb21tYW5kUXVldWVkICk7Cit9CisKKworc3RhdGljIHZvaWQgY3NyVXBkYXRlUnNzaSh0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkKiBwTXNnKQoreworICAgIHZfUzdfdCAgcnNzaSA9IDA7CisgICAgdEFuaUdldFJzc2lSZXEgKnBHZXRSc3NpUmVxID0gKHRBbmlHZXRSc3NpUmVxKilwTXNnOworICAgIGlmKHBHZXRSc3NpUmVxKQorICAgIHsKKyAgICAgICAgaWYoTlVMTCAhPSBwR2V0UnNzaVJlcS0+cFZvc0NvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdMQU5UTF9HZXRSc3NpKHBHZXRSc3NpUmVxLT5wVm9zQ29udGV4dCwgcEdldFJzc2lSZXEtPnN0YUlkLCAmcnNzaSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCJwR2V0UnNzaVJlcS0+cFZvc0NvbnRleHQgaXMgTlVMTFxuIikpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGlmKE5VTEwgIT0gcEdldFJzc2lSZXEtPnJzc2lDYWxsYmFjaykKKyAgICAgICAgeworICAgICAgICAgICAgKCh0Q3NyUnNzaUNhbGxiYWNrKShwR2V0UnNzaVJlcS0+cnNzaUNhbGxiYWNrKSkocnNzaSwgcEdldFJzc2lSZXEtPnN0YUlkLCBwR2V0UnNzaVJlcS0+cERldkNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgicEdldFJzc2lSZXEtPnJzc2lDYWxsYmFjayBpcyBOVUxMXG4iKSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoInBHZXRSc3NpUmVxIGlzIE5VTExcbiIpKTsgICAgCisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBjc3JSb2FtQ2hlY2tGb3JMaW5rU3RhdHVzQ2hhbmdlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyU21lUnNwICpwU2lyTXNnICkKK3sKKyAgICB0U2lyU21lQXNzb2NJbmQgKnBBc3NvY0luZDsKKyAgICB0U2lyU21lRGlzYXNzb2NJbmQgKnBEaXNhc3NvY0luZDsKKyAgICB0U2lyU21lRGVhdXRoSW5kICpwRGVhdXRoSW5kOworICAgIHRTaXJTbWVXbVN0YXR1c0NoYW5nZU50ZiAqcFN0YXR1c0NoYW5nZU1zZzsKKyAgICB0U2lyU21lTmV3QnNzSW5mbyAqcE5ld0JzczsKKyAgICB0U21lSWJzc1BlZXJJbmQgKnBJYnNzUGVlckluZDsKKyAgICB0U2lyTWFjQWRkciBCcm9hZGNhc3RhZGRyID0gezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9OworICAgIHRTaXJTbWVBcE5ld0NhcHMgKnBBcE5ld0NhcHM7CisgICAgZUNzclJvYW1SZXN1bHQgcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9OT05FOworICAgIGVSb2FtQ21kU3RhdHVzIHJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fRkFJTEVEOworICAgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvID0gTlVMTDsKKyAgICB0Q3NyUm9hbUluZm8gcm9hbUluZm87CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gTlVMTDsKKyAgICB0cFNpclNtZVN3aXRjaENoYW5uZWxJbmQgcFN3aXRjaENobkluZDsKKyAgICB0U21lTWF4QXNzb2NJbmQgKnBTbWVNYXhBc3NvY0luZDsKKworI2lmIGRlZmluZWQgQU5JX1BST0RVQ1RfVFlQRV9BUAorICAgIHBTaXJNc2ctPm1lc3NhZ2VUeXBlID0gcGFsX2JlMTZfdG9fY3B1KHBTaXJNc2ctPm1lc3NhZ2VUeXBlKTsKKyAgICBwU2lyTXNnLT5sZW5ndGggPSBwYWxfYmUxNl90b19jcHUocFNpck1zZy0+bGVuZ3RoKTsKKyAgICBwU2lyTXNnLT5zdGF0dXNDb2RlID0gcGFsX2JlMzJfdG9fY3B1KHBTaXJNc2ctPnN0YXR1c0NvZGUpOworI2Vsc2UKKyAgICBwU2lyTXNnLT5tZXNzYWdlVHlwZSA9IChwU2lyTXNnLT5tZXNzYWdlVHlwZSk7CisgICAgcFNpck1zZy0+bGVuZ3RoID0gKHBTaXJNc2ctPmxlbmd0aCk7CisgICAgcFNpck1zZy0+c3RhdHVzQ29kZSA9IChwU2lyTXNnLT5zdGF0dXNDb2RlKTsKKyNlbmRpZgorCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcm9hbUluZm8sIHNpemVvZihyb2FtSW5mbykpOworCisgICAgc3dpdGNoKCBwU2lyTXNnLT5tZXNzYWdlVHlwZSApIAorICAgIHsKKyAgICAgICAgY2FzZSBlV05JX1NNRV9BU1NPQ19JTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdENzclJvYW1TZXNzaW9uICAqcFNlc3Npb247CisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCBGTCgiQVNTT0NJQVRJT04gSW5kaWNhdGlvbiBmcm9tIFNNRVxuIikpOworICAgICAgICAgICAgICAgIHBBc3NvY0luZCA9ICh0U2lyU21lQXNzb2NJbmQgKilwU2lyTXNnOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1HZXRTZXNzaW9uSWRGcm9tQlNTSUQoIHBNYWMsICh0Q3NyQnNzaWQgKilwQXNzb2NJbmQtPmJzc0lkLCAmc2Vzc2lvbklkICk7CisgICAgICAgICAgICAgICAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworICAgICAgICAgICAgICAgIHBSb2FtSW5mbyA9ICZyb2FtSW5mbzsKKworICAgICAgICAgICAgICAgIC8vIFJlcXVpcmVkIGZvciBpbmRpY2F0aW5nIHRoZSBmcmFtZXMgdG8gdXBwZXIgbGF5ZXIKKyAgICAgICAgICAgICAgICBwUm9hbUluZm8tPmFzc29jUmVxTGVuZ3RoID0gcEFzc29jSW5kLT5hc3NvY1JlcUxlbmd0aDsKKyAgICAgICAgICAgICAgICBwUm9hbUluZm8tPmFzc29jUmVxUHRyID0gcEFzc29jSW5kLT5hc3NvY1JlcVB0cjsKKworICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+YmVhY29uUHRyID0gcEFzc29jSW5kLT5iZWFjb25QdHI7CisgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5iZWFjb25MZW5ndGggPSBwQXNzb2NJbmQtPmJlYWNvbkxlbmd0aDsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5zdGF0dXNDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsgLy9zZW5kIHRoZSBzdGF0dXMgY29kZSBhcyBTdWNjZXNzIAorICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZSA9ICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZTsKKworICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8tPnN0YUlkID0gKHRBTklfVTgpcEFzc29jSW5kLT5zdGFJZDsKKyAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5yc25JRUxlbiA9ICh0QU5JX1U4KXBBc3NvY0luZC0+cnNuSUUubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8tPnByc25JRSA9IHBBc3NvY0luZC0+cnNuSUUucnNuSUVkYXRhOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+YWRkSUVMZW4gPSAodEFOSV9VOClwQXNzb2NJbmQtPmFkZElFLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBwUm9hbUluZm8tPnBhZGRJRSA9ICBwQXNzb2NJbmQtPmFkZElFLmFkZElFZGF0YTsKKworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBSb2FtSW5mby0+cGVlck1hYywgcEFzc29jSW5kLT5wZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBSb2FtSW5mby0+YnNzaWQsIHBBc3NvY0luZC0+YnNzSWQsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+d21tRW5hYmxlZFN0YSA9IHBBc3NvY0luZC0+d21tRW5hYmxlZFN0YTsKKyAgICAgICAgICAgICAgICAgICAgaWYoQ1NSX0lTX1dEU19BUCggcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlKSkKKyNlbmRpZiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIDAsIGVDU1JfUk9BTV9XRFNfSU5ELCBlQ1NSX1JPQU1fUkVTVUxUX1dEU19BU1NPQ0lBVElPTl9JTkQpOy8vU3RhCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgICAgICAgICBpZihDU1JfSVNfSU5GUkFfQVAocFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIENTUl9JU19FTkNfVFlQRV9TVEFUSUMoIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlICkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUlzc3VlU2V0Q29udGV4dFJlcSggcE1hYywgc2Vzc2lvbklkLCBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwUm9hbUluZm8tPnBlZXJNYWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIFRSVUUsIGVTSVJfVFhfUlgsIDAsIDAsIE5VTEwsIDAgKTsgLy8gTk8ga2V5cy4uLiB0aGVzZSBrZXkgcGFyYW1ldGVycyBkb24ndCBtYXR0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5mQXV0aFJlcXVpcmVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5mQXV0aFJlcXVpcmVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIDAsIGVDU1JfUk9BTV9JTkZSQV9JTkQsIGVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfQVNTT0NJQVRJT05fSU5EKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5zdGF0dXNDb2RlID0gZVNJUl9TTUVfQVNTT0NfUkVGVVNFRDsvLyBSZWZ1c2VkIGR1ZSB0byBNYWMgZmlsdGVyaW5nIAorICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgCisgICAgICAgICAgICAgICAgICAgIC8qIFNlbmQgQXNzb2NpYXRpb24gY29tcGxldGlvbiBtZXNzYWdlIHRvIFBFICovCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclNlbmRBc3NvY0NuZk1zZyggcE1hYywgcEFzc29jSW5kLCBzdGF0dXMgKTsvL1N0YQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogc2VuZCBhIG1lc3NhZ2UgdG8gQ1NSIGl0c2VsZiBqdXN0IHRvIGF2b2lkIHRoZSBFQVBPTCBmcmFtZXMgZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICogT1RBIGJlZm9yZSBhc3NvY2lhdGlvbiByZXNwb25zZSAqLworCisgICAgICAgICAgICAgICAgICAgIGlmKENTUl9JU19XRFNfQVAoIHBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JTZW5kQXNzb2NJbmRUb1VwcGVyTGF5ZXJDbmZNc2cocE1hYywgcEFzc29jSW5kLCBzdGF0dXMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICBlbHNlIGlmKENTUl9JU19JTkZSQV9BUChwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUpICYmIChwUm9hbUluZm8tPnN0YXR1c0NvZGUgIT0gZVNJUl9TTUVfQVNTT0NfUkVGVVNFRCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8tPmZSZWFzc29jUmVxID0gcEFzc29jSW5kLT5yZWFzc29jUmVxOworICAgICAgICAgICAgICAgICAgICAvL3N0YXR1cyA9IGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIDAsIGVDU1JfUk9BTV9JTkZSQV9JTkQsIGVDU1JfUk9BTV9SRVNVTFRfSU5GUkFfQVNTT0NJQVRJT05fQ05GKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyU2VuZEFzc29jSW5kVG9VcHBlckxheWVyQ25mTXNnKHBNYWMsIHBBc3NvY0luZCwgc3RhdHVzLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9TTUVfRElTQVNTT0NfSU5EOgorICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiRElTQVNTT0NJQVRJT04gSW5kaWNhdGlvbiBmcm9tIE1BQ1xuIikpOworCisgICAgICAgICAgICAvLyBDaGVjayBpZiBBUCBkaXMtYXNzb2NpYXRlZCB1cyBiZWNhdXNlIG9mIE1JQyBmYWlsdXJlLiBJZiBzbywKKyAgICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byB0YWtlIGFjdGlvbiBpbW1lZGlhdGVseSBhbmQgbm90IHdhaXQgdGlsbCB0aGUKKyAgICAgICAgICAgIC8vIHRoZSBXbVN0YXR1c0NoYW5nZSByZXF1ZXN0cyBpcyBwdXNoZWQgYW5kIHByb2Nlc3NlZAorICAgICAgICAgICAgcERpc2Fzc29jSW5kID0gKHRTaXJTbWVEaXNhc3NvY0luZCAqKXBTaXJNc2c7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtR2V0U2Vzc2lvbklkRnJvbUJTU0lEKCBwTWFjLCAodENzckJzc2lkICopcERpc2Fzc29jSW5kLT5ic3NJZCwgJnNlc3Npb25JZCApOworICAgICAgICAgICAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiBuZWlnaGJvciBwcmVhdXRoIGRvbmUgc3RhdGUgdGhlbiBvbiByZWNlaXZpbmcKKyAgICAgICAgICAgICAgICAvLyBkaXNhc3NvYyBvciBkZWF1dGggd2UgZG9udCByb2FtIGluc3RlYWQgd2UganVzdCBkaXNhc3NvYworICAgICAgICAgICAgICAgIC8vIGZyb20gY3VycmVudCBhcCBhbmQgdGhlbiBnbyB0byBkaXNjb25uZWN0ZWQgc3RhdGUgCisgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIGZvciBDQ1ggYW5kIDExciBGVCBjb25uZWN0aW9ucyBPTkxZLgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgICAgICAgICAgaWYgKGNzclJvYW1JczExckFzc29jKHBNYWMpICYmIChjc3JOZWlnaGJvclJvYW1TdGF0ZVByZWF1dGhEb25lKHBNYWMpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzck5laWdoYm9yUm9hbVRyYW5pc3Rpb25QcmVhdXRoRG9uZVRvRGlzY29ubmVjdGVkKHBNYWMpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgICAgICAgICBpZiAoY3NyUm9hbUlzQ0NYQXNzb2MocE1hYykgJiYgKGNzck5laWdoYm9yUm9hbVN0YXRlUHJlYXV0aERvbmUocE1hYykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtVHJhbmlzdGlvblByZWF1dGhEb25lVG9EaXNjb25uZWN0ZWQocE1hYyk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgICAgICAgICAgICAgaWYgKCBjc3JJc0Nvbm5TdGF0ZUluZnJhKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdFN0YXRlID0gZUNTUl9BU1NPQ19TVEFURV9UWVBFX05PVF9DT05ORUNURUQ7CisgICAgICAgICAgICAgICAgfQorCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgICAgICAgICAgICAgIHNtZV9Rb3NDc3JFdmVudEluZChwTWFjLCAodl9VOF90KXNlc3Npb25JZCwgU01FX1FPU19DU1JfRElTQ09OTkVDVF9JTkQsIE5VTEwpOworI2VuZGlmCisgICAgICAgICAgICAgICAgY3NyUm9hbUxpbmtEb3duKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgY3NyUm9hbUlzc3VlV21TdGF0dXNDaGFuZ2UoIHBNYWMsIHNlc3Npb25JZCwgZUNzckRpc2Fzc29jaWF0ZWQsIHBTaXJNc2cgKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgaWYoQ1NSX0lTX0lORlJBX0FQKCZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSkpCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mbyA9ICZyb2FtSW5mbzsKKworICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8tPnN0YXR1c0NvZGUgPSBwRGlzYXNzb2NJbmQtPnN0YXR1c0NvZGU7IAorICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8tPnUucENvbm5lY3RlZFByb2ZpbGUgPSAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGU7CisKKyAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5zdGFJZCA9ICh0QU5JX1U4KXBEaXNhc3NvY0luZC0+c3RhSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwUm9hbUluZm8tPnBlZXJNYWMsIHBEaXNhc3NvY0luZC0+cGVlck1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwUm9hbUluZm8tPmJzc2lkLCBwRGlzYXNzb2NJbmQtPmJzc0lkLCBzaXplb2YodENzckJzc2lkKSk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIHBSb2FtSW5mbywgMCwgZUNTUl9ST0FNX0lORlJBX0lORCwgZUNTUl9ST0FNX1JFU1VMVF9ESVNBU1NPQ19JTkQpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9TTUVfREVBVVRIX0lORDoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoIkRFQVVUSEVOVElDQVRJT04gSW5kaWNhdGlvbiBmcm9tIE1BQ1xuIikpOworICAgICAgICAgICAgcERlYXV0aEluZCA9ICh0cFNpclNtZURlYXV0aEluZClwU2lyTXNnOworICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUdldFNlc3Npb25JZEZyb21CU1NJRCggcE1hYywgKHRDc3JCc3NpZCAqKXBEZWF1dGhJbmQtPmJzc0lkLCAmc2Vzc2lvbklkICk7CisgICAgICAgICAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGluIG5laWdoYm9yIHByZWF1dGggZG9uZSBzdGF0ZSB0aGVuIG9uIHJlY2VpdmluZworICAgICAgICAgICAgICAgIC8vIGRpc2Fzc29jIG9yIGRlYXV0aCB3ZSBkb250IHJvYW0gaW5zdGVhZCB3ZSBqdXN0IGRpc2Fzc29jCisgICAgICAgICAgICAgICAgLy8gZnJvbSBjdXJyZW50IGFwIGFuZCB0aGVuIGdvIHRvIGRpc2Nvbm5lY3RlZCBzdGF0ZSAKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgZm9yIENDWCBhbmQgMTFyIEZUIGNvbm5lY3Rpb25zIE9OTFkuCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgICAgICAgICBpZiAoY3NyUm9hbUlzMTFyQXNzb2MocE1hYykgJiYgKGNzck5laWdoYm9yUm9hbVN0YXRlUHJlYXV0aERvbmUocE1hYykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtVHJhbmlzdGlvblByZWF1dGhEb25lVG9EaXNjb25uZWN0ZWQocE1hYyk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAgICAgICAgIGlmIChjc3JSb2FtSXNDQ1hBc3NvYyhwTWFjKSAmJiAoY3NyTmVpZ2hib3JSb2FtU3RhdGVQcmVhdXRoRG9uZShwTWFjKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1UcmFuaXN0aW9uUHJlYXV0aERvbmVUb0Rpc2Nvbm5lY3RlZChwTWFjKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGNzcklzQ29ublN0YXRlSW5mcmEoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb25uZWN0U3RhdGUgPSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfTk9UX0NPTk5FQ1RFRDsKKyAgICAgICAgICAgICAgICB9CisKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgICAgICAgICAgICAgc21lX1Fvc0NzckV2ZW50SW5kKHBNYWMsICh2X1U4X3Qpc2Vzc2lvbklkLCBTTUVfUU9TX0NTUl9ESVNDT05ORUNUX0lORCwgTlVMTCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjc3JSb2FtTGlua0Rvd24ocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBjc3JSb2FtSXNzdWVXbVN0YXR1c0NoYW5nZSggcE1hYywgc2Vzc2lvbklkLCBlQ3NyRGVhdXRoZW50aWNhdGVkLCBwU2lyTXNnICk7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgICAgIGlmKENTUl9JU19JTkZSQV9BUCgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8gPSAmcm9hbUluZm87CisKKyAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5zdGF0dXNDb2RlID0gcERlYXV0aEluZC0+c3RhdHVzQ29kZTsKKyAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlID0gJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworCisgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+c3RhSWQgPSAodEFOSV9VOClwRGVhdXRoSW5kLT5zdGFJZDsKKworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBSb2FtSW5mby0+cGVlck1hYywgcERlYXV0aEluZC0+cGVlck1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwUm9hbUluZm8tPmJzc2lkLCBwRGVhdXRoSW5kLT5ic3NJZCwgc2l6ZW9mKHRDc3JCc3NpZCkpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIDAsIGVDU1JfUk9BTV9JTkZSQV9JTkQsIGVDU1JfUk9BTV9SRVNVTFRfREVBVVRIX0lORCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICBjYXNlIGVXTklfU01FX1NXSVRDSF9DSExfUkVROiAgICAgICAgLy8gaW4gY2FzZSBvZiBTVEEsIHRoZSBTV0lUQ0hfQ0hBTk5FTCBvcmlnaW5hdGVzIGZyb20gaXRzIEFQCisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJlV05JX1NNRV9TV0lUQ0hfQ0hMX1JFUSBmcm9tIFNNRVxuIikpOworICAgICAgICAgICAgcFN3aXRjaENobkluZCA9ICh0cFNpclNtZVN3aXRjaENoYW5uZWxJbmQpcFNpck1zZzsKKyAgICAgICAgICAgIC8vVXBkYXRlIHdpdGggdGhlIG5ldyBjaGFubmVsIGlkLgorICAgICAgICAgICAgLy9UaGUgY2hhbm5lbCBpZCBpcyBoaWRkZW4gaW4gdGhlIHN0YXR1c0NvZGUuCisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtR2V0U2Vzc2lvbklkRnJvbUJTU0lEKCBwTWFjLCAodENzckJzc2lkICopcFN3aXRjaENobkluZC0+YnNzSWQsICZzZXNzaW9uSWQgKTsKKyAgICAgICAgICAgIGlmKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUub3BlcmF0aW9uQ2hhbm5lbCA9ICh0QU5JX1U4KXBTd2l0Y2hDaG5JbmQtPm5ld0NoYW5uZWxJZDsKKyAgICAgICAgICAgICAgICBpZihwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+Y2hhbm5lbElkID0gKHRBTklfVTgpcFN3aXRjaENobkluZC0+bmV3Q2hhbm5lbElkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICBjYXNlIGVXTklfU01FX0RFQVVUSF9SU1A6CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJlV05JX1NNRV9ERUFVVEhfUlNQIGZyb20gU01FXG4iKSk7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRTaXJTbWVEZWF1dGhSc3AqIHBEZWF1dGhSc3AgPSAodFNpclNtZURlYXV0aFJzcCAqKXBTaXJNc2c7CisgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gcERlYXV0aFJzcC0+c2Vzc2lvbklkOworICAgICAgICAgICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBzZXNzaW9uSWQpICkKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIENTUl9JU19JTkZSQV9BUCgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvID0gJnJvYW1JbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlID0gJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwUm9hbUluZm8tPnBlZXJNYWMsIHBEZWF1dGhSc3AtPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+cmVhc29uQ29kZSA9IGVDU1JfUk9BTV9SRVNVTFRfRk9SQ0VEOworICAgICAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5zdGF0dXNDb2RlID0gcERlYXV0aFJzcC0+c3RhdHVzQ29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIDAsIGVDU1JfUk9BTV9MT1NUTElOSywgZUNTUl9ST0FNX1JFU1VMVF9GT1JDRUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIGVXTklfU01FX0RJU0FTU09DX1JTUDoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgRkwoImVXTklfU01FX0RJU0FTU09DX1JTUCBmcm9tIFNNRSBzdWJTdGF0ZSA9ICVkXG4iKSwgcE1hYy0+cm9hbS5jdXJTdWJTdGF0ZVtzZXNzaW9uSWRdKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdFNpclNtZURpc2Fzc29jUnNwICpwRGlzYXNzb2NSc3AgPSAodFNpclNtZURpc2Fzc29jUnNwICopcFNpck1zZzsKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBwRGlzYXNzb2NSc3AtPnNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgc2Vzc2lvbklkKSApCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBDU1JfSVNfSU5GUkFfQVAoJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mbyA9ICZyb2FtSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+dS5wQ29ubmVjdGVkUHJvZmlsZSA9ICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFJvYW1JbmZvLT5wZWVyTWFjLCBwRGlzYXNzb2NSc3AtPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mby0+cmVhc29uQ29kZSA9IGVDU1JfUk9BTV9SRVNVTFRfRk9SQ0VEOworICAgICAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT5zdGF0dXNDb2RlID0gcERpc2Fzc29jUnNwLT5zdGF0dXNDb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIHBSb2FtSW5mbywgMCwgZUNTUl9ST0FNX0xPU1RMSU5LLCBlQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9TTUVfTUlDX0ZBSUxVUkVfSU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwU2lyU21lTWljRmFpbHVyZUluZCBwTWljSW5kID0gKHRwU2lyU21lTWljRmFpbHVyZUluZClwU2lyTXNnOworICAgICAgICAgICAgICAgIHRDc3JSb2FtSW5mbyByb2FtSW5mbywgKnBSb2FtSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgZUNzclJvYW1SZXN1bHQgcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfVU5JQ0FTVDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAgICAgICAgICAgICAgICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYoc2VjRXZlbnQsIHZvc19ldmVudF93bGFuX3NlY3VyaXR5X3BheWxvYWRfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnNlY0V2ZW50LCBzaXplb2Yodm9zX2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlKSk7CisgICAgICAgICAgICAgICAgICAgIHNlY0V2ZW50LmV2ZW50SWQgPSBXTEFOX1NFQ1VSSVRZX0VWRU5UX01JQ19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgc2VjRXZlbnQuZW5jcnlwdGlvbk1vZGVNdWx0aWNhc3QgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICh2X1U4X3QpZGlhZ0VuY1R5cGVGcm9tQ1NSVHlwZShwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgc2VjRXZlbnQuZW5jcnlwdGlvbk1vZGVVbmljYXN0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KWRpYWdFbmNUeXBlRnJvbUNTUlR5cGUocFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuRW5jcnlwdGlvblR5cGUpOworICAgICAgICAgICAgICAgICAgICBzZWNFdmVudC5hdXRoTW9kZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgKHZfVThfdClkaWFnQXV0aFR5cGVGcm9tQ1NSVHlwZShwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5BdXRoVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHNlY0V2ZW50LmJzc2lkLCBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCwgNiApOworICAgICAgICAgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmc2VjRXZlbnQsIEVWRU5UX1dMQU5fU0VDVVJJVFkpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZi8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1HZXRTZXNzaW9uSWRGcm9tQlNTSUQoIHBNYWMsICh0Q3NyQnNzaWQgKilwTWljSW5kLT5ic3NJZCwgJnNlc3Npb25JZCApOworICAgICAgICAgICAgICAgIGlmKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLnUucE1JQ0ZhaWx1cmVJbmZvID0gJnBNaWNJbmQtPmluZm87CisgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mbyA9ICZyb2FtSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgaWYocE1pY0luZC0+aW5mby5tdWx0aWNhc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfTUlDX0VSUk9SX0dST1VQOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9NSUNfRVJST1JfVU5JQ0FTVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgcFJvYW1JbmZvLCAwLCBlQ1NSX1JPQU1fTUlDX0VSUk9SX0lORCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgY2FzZSBlV05JX1NNRV9XUFNfUEJDX1BST0JFX1JFUV9JTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBTaXJTbWVQcm9iZVJlcUluZCBwUHJvYmVSZXFJbmQgPSAodHBTaXJTbWVQcm9iZVJlcUluZClwU2lyTXNnOworICAgICAgICAgICAgICAgIHRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKworICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoIldQUyBQQkMgUHJvYmUgcmVxdWVzdCBJbmRpY2F0aW9uIGZyb20gU01FXG4iKSk7CisgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1HZXRTZXNzaW9uSWRGcm9tQlNTSUQoIHBNYWMsICh0Q3NyQnNzaWQgKilwUHJvYmVSZXFJbmQtPmJzc0lkLCAmc2Vzc2lvbklkICk7CisgICAgICAgICAgICAgICAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcm9hbUluZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8udS5wV1BTUEJDUHJvYmVSZXEgPSAmcFByb2JlUmVxSW5kLT5XUFNQQkNQcm9iZVJlcTsKKyAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgMCwgZUNTUl9ST0FNX1dQU19QQkNfUFJPQkVfUkVRX0lORCwgCisgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fUkVTVUxUX1dQU19QQkNfUFJPQkVfUkVRX0lORCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyNlbmRpZgorICAgICAgICAgICAgCisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9XTV9TVEFUVVNfQ0hBTkdFX05URjoKKyAgICAgICAgICAgIHBTdGF0dXNDaGFuZ2VNc2cgPSAodFNpclNtZVdtU3RhdHVzQ2hhbmdlTnRmICopcFNpck1zZzsKKyAgICAgICAgICAgIHN3aXRjaCggcFN0YXR1c0NoYW5nZU1zZy0+c3RhdHVzQ2hhbmdlQ29kZSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZVNJUl9TTUVfSUJTU19BQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IGNzckZpbmRJYnNzU2Vzc2lvbiggcE1hYyApOworICAgICAgICAgICAgICAgICAgICBpZiggQ1NSX1NFU1NJT05fSURfSU5WQUxJRCAhPSBzZXNzaW9uSWQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdFN0YXRlID0gZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lCU1NfQ09OTkVDVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mby5ic3NpZCwgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+YnNzSWQsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2FtSW5mby51LnBDb25uZWN0ZWRQcm9maWxlID0gJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSb2FtSW5mbyA9ICZyb2FtSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiAgQ1NSIGVTSVJfU01FX0lCU1NfTkVXX1BFRVIgY29ubmVjdGVkIEJTUyBpcyBlbXB0eVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfQ09OTkVDVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fQ09OTkVDVF9TVEFUVVNfVVBEQVRFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBlU0lSX1NNRV9JQlNTX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBjc3JGaW5kSWJzc1Nlc3Npb24oIHBNYWMgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIENTUl9TRVNTSU9OX0lEX0lOVkFMSUQgIT0gc2Vzc2lvbklkICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JQlNTX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfSUJTU19JTkFDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fQ09OTkVDVF9TVEFUVVNfVVBEQVRFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBlU0lSX1NNRV9KT0lORURfTkVXX0JTUzogICAgLy8gSUJTUyBjb2FsZXNjaW5nLgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBjc3JGaW5kSWJzc1Nlc3Npb24oIHBNYWMgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIENTUl9TRVNTSU9OX0lEX0lOVkFMSUQgIT0gc2Vzc2lvbklkICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBjb25uZWN0aW9uIHN0YXRlIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBwTmV3QnNzID0gJnBTdGF0dXNDaGFuZ2VNc2ctPnN0YXR1c0NoYW5nZUluZm8ubmV3QnNzSW5mbzsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX2xvZ19pYnNzX3BrdF90eXBlICpwSWJzc0xvZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBiaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfTE9HX0FMTE9DKHBJYnNzTG9nLCB2b3NfbG9nX2lic3NfcGt0X3R5cGUsIExPR19XTEFOX0lCU1NfQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocElic3NMb2cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWJzc0xvZy0+ZXZlbnRJZCA9IFdMQU5fSUJTU19FVkVOVF9DT0FMRVNDSU5HOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwTmV3QnNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBJYnNzTG9nLT5ic3NpZCwgcE5ld0Jzcy0+YnNzSWQsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocE5ld0Jzcy0+c3NJZC5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwSWJzc0xvZy0+c3NpZCwgcE5ld0Jzcy0+c3NJZC5zc0lkLCBwTmV3QnNzLT5zc0lkLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWJzc0xvZy0+b3BlcmF0aW5nQ2hhbm5lbCA9IHBOZXdCc3MtPmNoYW5uZWxOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKGNjbUNmZ0dldEludChwTWFjLCBXTklfQ0ZHX0JFQUNPTl9JTlRFUlZBTCwgJmJpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vKioqVTggaXMgbm90IGVub3VnaCBmb3IgYmVhY29uIGludGVydmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWJzc0xvZy0+YmVhY29uSW50ZXJ2YWwgPSAodl9VOF90KWJpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfTE9HX1JFUE9SVChwSWJzc0xvZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKworICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbVVwZGF0ZUNvbm5lY3RlZFByb2ZpbGVGcm9tTmV3QnNzKCBwTWFjLCBzZXNzaW9uSWQsIHBOZXdCc3MgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1Jc3N1ZVNldENvbnRleHRSZXEoIHBNYWMsIHNlc3Npb25JZCwgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuRW5jcnlwdGlvblR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQnJvYWRjYXN0YWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBGQUxTRSwgZVNJUl9UWF9SWCwgMCwgMCwgTlVMTCwgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9JQlNTX0NPQUxFU0NFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fSUJTU19JTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mby5ic3NpZCwgJnBOZXdCc3MtPmJzc0lkLCBzaXplb2YodENzckJzc2lkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8gPSAmcm9hbUluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAvL1RoaXMgQlNTSUQgaXMgdGggZXJlYWwgQlNTSUQsIGxldCdzIHNhdmUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLT5ic3NJZCwgJnBOZXdCc3MtPmJzc0lkLCBzaXplb2YodENzckJzc2lkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBqb2luIElCU1MgdGltZXIgaW4gY2FzZSBvZiBqb2luLCBmb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW51aW5lIG1lcmdlIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5pYnNzX2pvaW5fcGVuZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5pYnNzX2pvaW5fcGVuZGluZyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbVN0b3BJYnNzSm9pblRpbWVyKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfSk9JTl9TVUNDRVNTOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiQ1NSOiAgZVNJUl9TTUVfSk9JTkVEX05FV19CU1MgcmVjZWl2ZWQgZnJvbSBQRVxuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gZGV0ZWN0aW9uIGJ5IExJTSB0aGF0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgQVAgaGF2ZSBjaGFuZ2VkLgorICAgICAgICAgICAgICAgIGNhc2UgZVNJUl9TTUVfQVBfQ0FQU19DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICBwQXBOZXdDYXBzID0gJnBTdGF0dXNDaGFuZ2VNc2ctPnN0YXR1c0NoYW5nZUluZm8uYXBOZXdDYXBzOworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIkNTUiBoYW5kbGluZyBlU0lSX1NNRV9BUF9DQVBTX0NIQU5HRURcbiIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtR2V0U2Vzc2lvbklkRnJvbUJTU0lEKCBwTWFjLCAodENzckJzc2lkICopcEFwTmV3Q2Fwcy0+YnNzSWQsICZzZXNzaW9uSWQgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzclNjYW5Gb3JDYXBhYmlsaXR5Q2hhbmdlKCBwTWFjLCBwQXBOZXdDYXBzICk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfQ0FQX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgICAgIHJvYW1TdGF0dXMgPSBlQ1NSX1JPQU1fR0VOX0lORk87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByb2FtU3RhdHVzID0gZUNTUl9ST0FNX0ZBSUxFRDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9OT05FOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfSAgLy8gZW5kIHN3aXRjaCBvbiBzdGF0dXNDaGFuZ2VDb2RlCisgICAgICAgICAgICBpZihlQ1NSX1JPQU1fUkVTVUxUX05PTkUgIT0gcmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIDAsIHJvYW1TdGF0dXMsIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX0lCU1NfTkVXX1BFRVJfSU5EOgorICAgICAgICAgICAgcElic3NQZWVySW5kID0gKHRTbWVJYnNzUGVlckluZCAqKXBTaXJNc2c7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZvc19sb2dfaWJzc19wa3RfdHlwZSAqcElic3NMb2c7CisKKyAgICAgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19BTExPQyhwSWJzc0xvZywgdm9zX2xvZ19pYnNzX3BrdF90eXBlLCBMT0dfV0xBTl9JQlNTX0MpOworICAgICAgICAgICAgICAgIGlmKHBJYnNzTG9nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcElic3NMb2ctPmV2ZW50SWQgPSBXTEFOX0lCU1NfRVZFTlRfUEVFUl9KT0lOOworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBJYnNzTG9nLT5wZWVyTWFjQWRkciwgJnBJYnNzUGVlckluZC0+cGVlckFkZHIsIDYpOworICAgICAgICAgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19SRVBPUlQocElic3NMb2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IGNzckZpbmRJYnNzU2Vzc2lvbiggcE1hYyApOworICAgICAgICAgICAgaWYoIENTUl9TRVNTSU9OX0lEX0lOVkFMSUQgIT0gc2Vzc2lvbklkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgICAgICAgICAvLyBJc3N1ZSB0aGUgc2V0IENvbnRleHQgcmVxdWVzdCB0byBMSU0gdG8gZXN0YWJsaXNoIHRoZSBVbmljYXN0IFNUQSBjb250ZXh0IGZvciB0aGUgbmV3IHBlZXIuLi4KKyAgICAgICAgICAgICAgICBpZihwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcm9hbUluZm8ucGVlck1hYywgcElic3NQZWVySW5kLT5wZWVyQWRkciwgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mby5ic3NpZCwgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYy0+YnNzSWQsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocElic3NQZWVySW5kLT5tZXNnTGVuID4gc2l6ZW9mKHRTbWVJYnNzUGVlckluZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZyb2FtSW5mby5wYkZyYW1lcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocElic3NQZWVySW5kLT5tZXNnTGVuIC0gc2l6ZW9mKHRTbWVJYnNzUGVlckluZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLm5CZWFjb25MZW5ndGggPSAocElic3NQZWVySW5kLT5tZXNnTGVuIC0gc2l6ZW9mKHRTbWVJYnNzUGVlckluZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcm9hbUluZm8ucGJGcmFtZXMsICgodEFOSV9VOCAqKXBJYnNzUGVlckluZCkgKyBzaXplb2YodFNtZUlic3NQZWVySW5kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLm5CZWFjb25MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8uc3RhSWQgPSAodEFOSV9VOClwSWJzc1BlZXJJbmQtPnN0YUlkOworICAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8udWNhc3RTaWcgPSAodEFOSV9VOClwSWJzc1BlZXJJbmQtPnVjYXN0U2lnOworICAgICAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8uYmNhc3RTaWcgPSAodEFOSV9VOClwSWJzc1BlZXJJbmQtPmJjYXN0U2lnOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnJvYW1JbmZvLnBCc3NEZXNjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MtPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHJvYW1JbmZvLnBCc3NEZXNjLCBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MtPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8gPSAmcm9hbUluZm87CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocm9hbUluZm8ucGJGcmFtZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHJvYW1JbmZvLnBiRnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocm9hbUluZm8ucEJzc0Rlc2MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHJvYW1JbmZvLnBCc3NEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8gPSAmcm9hbUluZm87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1Jc3N1ZVNldENvbnRleHRSZXEoIHBNYWMsIHNlc3Npb25JZCwgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuRW5jcnlwdGlvblR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBJYnNzUGVlckluZC0+cGVlckFkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgVFJVRSwgZVNJUl9UWF9SWCwgMCwgMCwgTlVMTCwgMCApOyAvLyBOTyBrZXlzLi4uIHRoZXNlIGtleSBwYXJhbWV0ZXJzIGRvbid0IG1hdHRlci4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICIgIENTUiBlU0lSX1NNRV9JQlNTX05FV19QRUVSIGNvbm5lY3RlZCBCU1MgaXMgZW1wdHlcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL3NlbmQgdXAgdGhlIHNlYyB0eXBlIGZvciB0aGUgbmV3IHBlZXIKKyAgICAgICAgICAgICAgICBpZiAocFJvYW1JbmZvKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvLT51LnBDb25uZWN0ZWRQcm9maWxlID0gJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgcFJvYW1JbmZvLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fQ09OTkVDVF9TVEFUVVNfVVBEQVRFLCBlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfTkVXX1BFRVIpOworICAgICAgICAgICAgICAgIGlmKHBSb2FtSW5mbykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHJvYW1JbmZvLnBiRnJhbWVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHJvYW1JbmZvLnBiRnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihyb2FtSW5mby5wQnNzRGVzYykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCByb2FtSW5mby5wQnNzRGVzYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX0lCU1NfUEVFUl9ERVBBUlRFRF9JTkQ6CisgICAgICAgICAgICBwSWJzc1BlZXJJbmQgPSAodFNtZUlic3NQZWVySW5kKilwU2lyTXNnOworICAgICAgICAgICAgc2Vzc2lvbklkID0gY3NyRmluZElic3NTZXNzaW9uKCBwTWFjICk7CisgICAgICAgICAgICBpZiggQ1NSX1NFU1NJT05fSURfSU5WQUxJRCAhPSBzZXNzaW9uSWQgKQorICAgICAgICAgICAgeworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZvc19sb2dfaWJzc19wa3RfdHlwZSAqcElic3NMb2c7CisgCisgICAgICAgICAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfTE9HX0FMTE9DKHBJYnNzTG9nLCB2b3NfbG9nX2lic3NfcGt0X3R5cGUsIExPR19XTEFOX0lCU1NfQyk7CisgICAgICAgICAgICAgICAgICAgIGlmKHBJYnNzTG9nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwSWJzc0xvZy0+ZXZlbnRJZCA9IFdMQU5fSUJTU19FVkVOVF9QRUVSX0xFQVZFOworICAgICAgICAgICAgICAgICAgICAgICAgaWYocElic3NQZWVySW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcElic3NMb2ctPnBlZXJNYWNBZGRyLCAmcElic3NQZWVySW5kLT5wZWVyQWRkciwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19SRVBPUlQocElic3NMb2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiQ1NSOiBQZWVyIGRlcGFydGVkIG5vdGlmaWNhdGlvbiBmcm9tIExJTVxuIik7CisgICAgICAgICAgICAgICAgcm9hbUluZm8uc3RhSWQgPSAodEFOSV9VOClwSWJzc1BlZXJJbmQtPnN0YUlkOworICAgICAgICAgICAgICAgIHJvYW1JbmZvLnVjYXN0U2lnID0gKHRBTklfVTgpcElic3NQZWVySW5kLT51Y2FzdFNpZzsKKyAgICAgICAgICAgICAgICByb2FtSW5mby5iY2FzdFNpZyA9ICh0QU5JX1U4KXBJYnNzUGVlckluZC0+YmNhc3RTaWc7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcm9hbUluZm8ucGVlck1hYywgcElic3NQZWVySW5kLT5wZWVyQWRkciwgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgICAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX0NPTk5FQ1RfU1RBVFVTX1VQREFURSwgZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1BFRVJfREVQQVJURUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9TRVRDT05URVhUX1JTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0U2lyU21lU2V0Q29udGV4dFJzcCAqcFJzcCA9ICh0U2lyU21lU2V0Q29udGV4dFJzcCAqKXBTaXJNc2c7CisgICAgICAgICAgICAgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgICAgICAgICAgICAgdFNtZUNtZCAqcENvbW1hbmQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyApOworICAgICAgICAgICAgICAgIGlmICggcEVudHJ5ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggZVNtZUNvbW1hbmRTZXRLZXkgPT0gcENvbW1hbmQtPmNvbW1hbmQgKQorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgICAgIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisgICAgICAgICAgICAgICAgICAgICAgICBpZihlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FICE9IHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfREVGKHNldEtleUV2ZW50LCB2b3NfZXZlbnRfd2xhbl9zZWN1cml0eV9wYXlsb2FkX3R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnNldEtleUV2ZW50LCBzaXplb2Yodm9zX2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBSc3AtPnBlZXJNYWNBZGRyWzBdICYgMHgwMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRLZXlFdmVudC5ldmVudElkID0gV0xBTl9TRUNVUklUWV9FVkVOVF9TRVRfR1RLX1JTUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5RXZlbnQuZXZlbnRJZCA9IFdMQU5fU0VDVVJJVFlfRVZFTlRfU0VUX1BUS19SU1A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleUV2ZW50LmVuY3J5cHRpb25Nb2RlTXVsdGljYXN0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1U4X3QpZGlhZ0VuY1R5cGVGcm9tQ1NSVHlwZShwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRLZXlFdmVudC5lbmNyeXB0aW9uTW9kZVVuaWNhc3QgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVThfdClkaWFnRW5jVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBzZXRLZXlFdmVudC5ic3NpZCwgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQsIDYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRLZXlFdmVudC5hdXRoTW9kZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KWRpYWdBdXRoVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkF1dGhUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZVNJUl9TVUNDRVNTICE9IHBSc3AtPnN0YXR1c0NvZGUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5RXZlbnQuc3RhdHVzID0gV0xBTl9TRUNVUklUWV9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnNldEtleUV2ZW50LCBFVkVOVF9XTEFOX1NFQ1VSSVRZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggQ1NSX0lTX1dBSVRfRk9SX0tFWSggcE1hYywgc2Vzc2lvbklkKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9XZSBhcmUgZG9uZSB3aXRoIGF1dGhlbnRpY2F0aW9uLCB3aGV0aGVyZSBzdWNjZWVkIG9yIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1TdWJzdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX05PTkUsIHNlc3Npb25JZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtU3RvcFdhaXRGb3JLZXlUaW1lciggcE1hYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vV2UgZG8gaXQgaGVyZSBiZWNhdXNlIHRoaXMgbGlua3VwIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQgYWZ0ZXIgYXNzb2NpYXRpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93aGVuIGEga2V5IG5lZWRzIHRvIGJlIHNldC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSW5mcmEocE1hYywgc2Vzc2lvbklkKSApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbUxpbmtVcChwTWFjLCBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVTSVJfU1VDQ0VTUyA9PSBwUnNwLT5zdGF0dXNDb2RlICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLCAmcm9hbUluZm8ucGVlck1hYywgJnBSc3AtPnBlZXJNYWNBZGRyLCBzaXplb2YodENzckJzc2lkKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTWFrZSBzdXJlIHdlIGluc3RhbGwgdGhlIEdUSyBiZWZvcmUgaW5kaWNhdGluZyB0byBIREQgYXMgYXV0aGVudGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhpcyBpcyB0byBwcmV2ZW50IGJyb2FkY2FzdCBwYWNrZXRzIGdvIG91dCBhZnRlciBQVEsgYW5kIGJlZm9yZSBHVEsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBhbEVxdWFsTWVtb3J5KCBwTWFjLT5oSGRkLCAmQnJvYWRjYXN0YWRkciwgcFJzcC0+cGVlck1hY0FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0FVVEhFTlRJQ0FURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUm9hbUluZm8gPSAmcm9hbUluZm87CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkNTUjogUm9hbSBDb21wbGV0aW9uIHNldGtleSBjb21tYW5kIGZhaWxlZCglZCkgUGVlck1hYyAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC4uLlxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSc3AtPnN0YXR1c0NvZGUsIHBSc3AtPnBlZXJNYWNBZGRyWzBdLCBwUnNwLT5wZWVyTWFjQWRkclsxXSwgcFJzcC0+cGVlck1hY0FkZHJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSc3AtPnBlZXJNYWNBZGRyWzNdLCBwUnNwLT5wZWVyTWFjQWRkcls0XSwgcFJzcC0+cGVlck1hY0FkZHJbNV0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIHBDb21tYW5kLT51LnNldEtleUNtZC5yb2FtSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fU0VUX0tFWV9DT01QTEVURSwgcmVzdWx0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgU01FX1FPUyB0aGF0IHRoZSBTRVRfS0VZIGlzIGNvbXBsZXRlZCwgc28gdGhhdCBTTUVfUU9TCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gZ28gYWhlYWQgYW5kIGluaXRpYXRlIHRoZSBUU1BFQyBpZiBhbnkgYXJlIHBlbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtZV9Rb3NDc3JFdmVudEluZChwTWFjLCAodl9VOF90KXNlc3Npb25JZCwgU01FX1FPU19DU1JfU0VUX0tFWV9TVUNDRVNTX0lORCwgTlVMTCk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgICAgICAgICAgICAgICAvL1NlbmQgQWRqYWNlbnQgQVAgcmVwb3QgdG8gbmV3IEFQLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBlQ1NSX1JPQU1fUkVTVUxUX0FVVEhFTlRJQ0FURUQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+aXNQcmV2QXBJbmZvVmFsaWQgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuaXNDQ1hBc3NvYykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyQ2N4U2VuZEFkamFjZW50QXBSZXBNc2cocE1hYywgcFNlc3Npb24pOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmlzUHJldkFwSW5mb1ZhbGlkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNzckxMUmVtb3ZlRW50cnkoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTE9DSyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZFNldEtleSggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkNTUjogUm9hbSBDb21wbGV0aW9uIGNhbGxlZCBidXQgc2V0a2V5IGNvbW1hbmQgaXMgbm90IEFDVElWRSAuLi5cbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJDU1I6IFNldEtleSBDb21wbGV0aW9uIGNhbGxlZCBidXQgTk8gY29tbWFuZHMgYXJlIEFDVElWRSAuLi5cbiIgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzbWVQcm9jZXNzUGVuZGluZ1F1ZXVlKCBwTWFjICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX1JFTU9WRUtFWV9SU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdFNpclNtZVJlbW92ZUtleVJzcCAqcFJzcCA9ICh0U2lyU21lUmVtb3ZlS2V5UnNwICopcFNpck1zZzsKKyAgICAgICAgICAgICAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICAgICAgICAgICAgICB0U21lQ21kICpwQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLICk7CisgICAgICAgICAgICAgICAgaWYgKCBwRW50cnkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRTbWVDbWQsIExpbmsgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBlU21lQ29tbWFuZFJlbW92ZUtleSA9PSBwQ29tbWFuZC0+Y29tbWFuZCApCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBwQ29tbWFuZC0+c2Vzc2lvbklkOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX0RFRihyZW1vdmVLZXlFdmVudCwgdm9zX2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZyZW1vdmVLZXlFdmVudCwgc2l6ZW9mKHZvc19ldmVudF93bGFuX3NlY3VyaXR5X3BheWxvYWRfdHlwZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUtleUV2ZW50LmV2ZW50SWQgPSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1JFTU9WRV9LRVlfUlNQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUtleUV2ZW50LmVuY3J5cHRpb25Nb2RlTXVsdGljYXN0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1U4X3QpZGlhZ0VuY1R5cGVGcm9tQ1NSVHlwZShwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5tY0VuY3J5cHRpb25UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVLZXlFdmVudC5lbmNyeXB0aW9uTW9kZVVuaWNhc3QgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVThfdClkaWFnRW5jVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCByZW1vdmVLZXlFdmVudC5ic3NpZCwgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQsIDYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVLZXlFdmVudC5hdXRoTW9kZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KWRpYWdBdXRoVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkF1dGhUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZVNJUl9TVUNDRVNTICE9IHBSc3AtPnN0YXR1c0NvZGUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlS2V5RXZlbnQuc3RhdHVzID0gV0xBTl9TRUNVUklUWV9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnJlbW92ZUtleUV2ZW50LCBFVkVOVF9XTEFOX1NFQ1VSSVRZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlU0lSX1NVQ0NFU1MgPT0gcFJzcC0+c3RhdHVzQ29kZSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYywgJnJvYW1JbmZvLnBlZXJNYWMsICZwUnNwLT5wZWVyTWFjQWRkciwgc2l6ZW9mKHRDc3JCc3NpZCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJvYW1JbmZvID0gJnJvYW1JbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIHBDb21tYW5kLT51LnNldEtleUNtZC5yb2FtSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fUkVNT1ZFX0tFWV9DT01QTEVURSwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0sgKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRSZW1vdmVLZXkoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICJDU1I6IFJvYW0gQ29tcGxldGlvbiBjYWxsZWQgYnV0IHNldGtleSBjb21tYW5kIGlzIG5vdCBBQ1RJVkUgLi4uXG4iICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiQ1NSOiBTZXRLZXkgQ29tcGxldGlvbiBjYWxsZWQgYnV0IE5PIGNvbW1hbmRzIGFyZSBBQ1RJVkUgLi4uXG4iICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc21lUHJvY2Vzc1BlbmRpbmdRdWV1ZSggcE1hYyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1NNRV9HRVRfU1RBVElTVElDU19SU1A6CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJTdGF0cyByc3AgZnJvbSBQRVxuIikpOworICAgICAgICAgICAgY3NyUm9hbVN0YXRzUnNwUHJvY2Vzc29yKCBwTWFjLCBwU2lyTXNnICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX0dFVF9SU1NJX1JFUToKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgRkwoIkdldFJzc2lSZXEgZnJvbSBzZWxmXG4iKSk7CisgICAgICAgICAgICBjc3JVcGRhdGVSc3NpKCBwTWFjLCBwU2lyTXNnICk7CisgICAgICAgICAgICBicmVhazsKKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgY2FzZSBlV05JX1NNRV9GVF9QUkVfQVVUSF9SU1A6CisgICAgICAgICAgICBjc3JSb2FtRlRQcmVBdXRoUnNwUHJvY2Vzc29yKCBwTWFjLCAodHBTaXJGVFByZUF1dGhSc3ApcFNpck1zZyApOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICBjYXNlIGVXTklfU01FX01BWF9BU1NPQ19FWENFRURFRDoKKyAgICAgICAgICAgIHBTbWVNYXhBc3NvY0luZCA9ICh0U21lTWF4QXNzb2NJbmQqKXBTaXJNc2c7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPRzEsIEZMKCJzZW5kIGluZGljYXRpb24gdGhhdCBtYXggYXNzb2MgaGF2ZSBiZWVuIHJlYWNoZWQgYW5kIHRoZSBuZXcgcGVlciBjYW5ub3QgYmUgYWNjZXB0ZWRcbiIpKTsgICAgICAgICAgCisgICAgICAgICAgICBzZXNzaW9uSWQgPSBwU21lTWF4QXNzb2NJbmQtPnNlc3Npb25JZDsKKyAgICAgICAgICAgIHJvYW1JbmZvLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLnBlZXJNYWMsIHBTbWVNYXhBc3NvY0luZC0+cGVlck1hYywgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgMCwgCisgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9JTkZSQV9JTkQsIGVDU1JfUk9BTV9SRVNVTFRfTUFYX0FTU09DX0VYQ0VFREVEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgZVdOSV9TTUVfQlRBTVBfTE9HX0xJTktfSU5EOgorICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCBGTCgiRXN0YWJsaXNoIGxvZ2ljYWwgbGluayByZXEgZnJvbSBIQ0kgc2VyaWFsaXplZCB0aHJvdWdoIE1DIHRocmVhZFxuIikpOworICAgICAgICAgICAgYnRhbXBFc3RhYmxpc2hMb2dMaW5rSGRsciggcFNpck1zZyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfSAgLy8gZW5kIHN3aXRjaCBvbiBtZXNzYWdlIHR5cGUKKworfQorCisKK3ZvaWQgY3NyQ2FsbFJvYW1pbmdDb21wbGV0aW9uQ2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLCB0QU5JX1UzMiByb2FtSWQsIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQpCit7CisgICBpZihwU2Vzc2lvbikKKyAgIHsKKyAgICAgIGlmKHBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudCkKKyAgICAgIHsKKyAgICAgICAgIHBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudC0tOworICAgICAgICAgVk9TX0FTU0VSVCggcFNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250ID09IDApOworICAgICAgICAgLy9OZWVkIHRvIGNhbGwgYXNzb2NpYXRpb25fY29tcGxldGlvbiBiZWNhdXNlIHRoZXJlIGlzIGFuIGFzc29jX3N0YXJ0IHBlbmRpbmcuCisgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHBTZXNzaW9uLT5zZXNzaW9uSWQsIE5VTEwsIHJvYW1JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9DT01QTEVUSU9OLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFKTsKKyAgICAgIH0KKyAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgcFNlc3Npb24tPnNlc3Npb25JZCwgcFJvYW1JbmZvLCByb2FtSWQsIGVDU1JfUk9BTV9ST0FNSU5HX0NPTVBMRVRJT04sIHJvYW1SZXN1bHQpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgIHBTZXNzaW9uIGlzIE5VTEwiKSk7CisgICB9Cit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtU3RhcnRSb2FtaW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgZUNzclJvYW1pbmdSZWFzb24gcm9hbWluZ1JlYXNvbikKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisKKyAgICBpZihDU1JfSVNfTE9TVExJTktfUk9BTUlORyhyb2FtaW5nUmVhc29uKSAmJiAKKyAgICAgICAgKGVBTklfQk9PTEVBTl9GQUxTRSA9PSBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uZkNhbmNlbFJvYW1pbmcpKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gY3NyU2NhblJlcXVlc3RMb3N0TGluazEoIHBNYWMsIHNlc3Npb25JZCApOworICAgIH0KKworICAgIHJldHVybihzdGF0dXMpOworfQorCisKKy8vcmV0dXJuIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0aGVyIHJvYW1pbmcgY29tcGxldGVkIG9yIGNvbnRpbnVlLgordEFOSV9CT09MRUFOIGNzclJvYW1Db21wbGV0ZVJvYW1pbmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfQk9PTEVBTiBmRm9yY2UsIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQpCit7CisgICAgdEFOSV9CT09MRUFOIGZDb21wbGV0ZWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB0QU5JX1RJTUVTVEFNUCByb2FtVGltZSA9ICh0QU5JX1RJTUVTVEFNUCkocE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUm9hbWluZ1RpbWUgKiBQQUxfVElDS1NfUEVSX1NFQ09ORCk7CisgICAgdEFOSV9USU1FU1RBTVAgY3VyVGltZSA9ICh0QU5JX1RJTUVTVEFNUClwYWxHZXRUaWNrQ291bnQocE1hYy0+aEhkZCk7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICAvL0NoZWNrIHdoZXRoZXIgdGltZSBpcyB1cAorICAgIGlmKHBTZXNzaW9uLT5mQ2FuY2VsUm9hbWluZyB8fCBmRm9yY2UgfHwgCisgICAgICAgKChjdXJUaW1lIC0gcFNlc3Npb24tPnJvYW1pbmdTdGFydFRpbWUpID4gcm9hbVRpbWUpIHx8CisgICAgICAgZUNzclJlYXNzb2NSb2FtaW5nID09IHBTZXNzaW9uLT5yb2FtaW5nUmVhc29uIHx8CisgICAgICAgZUNzckR5bmFtaWNSb2FtaW5nID09IHBTZXNzaW9uLT5yb2FtaW5nUmVhc29uKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgIGluZGljYXRlcyByb2FtaW5nIGNvbXBsZXRpb25cbiIpKTsKKyAgICAgICAgaWYocFNlc3Npb24tPmZDYW5jZWxSb2FtaW5nICYmIENTUl9JU19MT1NUTElOS19ST0FNSU5HKHBTZXNzaW9uLT5yb2FtaW5nUmVhc29uKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9yb2FtaW5nIGlzIGNhbmNlbGxlZCwgdGVsbCBIREQgdG8gaW5kaWNhdGUgZGlzY29ubmVjdAorICAgICAgICAgICAgLy9CZWNhdXNlIExJTSBvdmVybG9hZCBkZWF1dGhfaW5kIGZvciBib3RoIGRlYXV0aCBmcmFtZSBhbmQgbWlzc2VkIGJlYWNvbgorICAgICAgICAgICAgLy93ZSBuZWVkIHRvIHVzZSB0aGlzIGxvZ2ljIHRvIGRldGluZ3Vpc2ggaXQuIEZvciBtaXNzZWQgYmVhY29uLCBMSU0gc2V0IHJlYXNvbgorICAgICAgICAgICAgLy90byBiZSBlU0lSX0JFQUNPTl9NSVNTRUQKKyAgICAgICAgICAgIGlmKGVTSVJfQkVBQ09OX01JU1NFRCA9PSBwU2Vzc2lvbi0+cm9hbWluZ1N0YXR1c0NvZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9hbVJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfTE9TVExJTks7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGVDc3JMb3N0bGlua1JvYW1pbmdEaXNhc3NvYyA9PSBwU2Vzc2lvbi0+cm9hbWluZ1JlYXNvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb2FtUmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9ESVNBU1NPQ19JTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGVDc3JMb3N0bGlua1JvYW1pbmdEZWF1dGggPT0gcFNlc3Npb24tPnJvYW1pbmdSZWFzb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9hbVJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfREVBVVRIX0lORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb2FtUmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9MT1NUTElOSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjc3JDYWxsUm9hbWluZ0NvbXBsZXRpb25DYWxsYmFjayhwTWFjLCBwU2Vzc2lvbiwgTlVMTCwgMCwgcm9hbVJlc3VsdCk7CisgICAgICAgIHBTZXNzaW9uLT5yb2FtaW5nUmVhc29uID0gZUNzck5vdFJvYW1pbmc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBTZXNzaW9uLT5yb2FtUmVzdWx0ID0gcm9hbVJlc3VsdDsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JSb2FtU3RhcnRSb2FtaW5nVGltZXIocE1hYywgc2Vzc2lvbklkLCBQQUxfVElNRVJfVE9fU0VDX1VOSVQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyQ2FsbFJvYW1pbmdDb21wbGV0aW9uQ2FsbGJhY2socE1hYywgcFNlc3Npb24sIE5VTEwsIDAsIHJvYW1SZXN1bHQpOworICAgICAgICAgICAgcFNlc3Npb24tPnJvYW1pbmdSZWFzb24gPSBlQ3NyTm90Um9hbWluZzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZDb21wbGV0ZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oZkNvbXBsZXRlZCk7Cit9CisKKwordm9pZCBjc3JSb2FtQ2FuY2VsUm9hbWluZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBpZihDU1JfSVNfUk9BTUlORyhwU2Vzc2lvbikpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIiAgIENhbmNlbGxpbmcgcm9hbWluZ1xuIik7CisgICAgICAgIHBTZXNzaW9uLT5mQ2FuY2VsUm9hbWluZyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICBpZihDU1JfSVNfUk9BTV9KT0lOSU5HKHBNYWMsIHNlc3Npb25JZCkgJiYgQ1NSX0lTX1JPQU1fU1VCU1RBVEVfQ09ORklHKHBNYWMsIHNlc3Npb25JZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vTm8gbmVlZCB0byBkbyBhbnl0aGluZyBpbiBoZXJlIGJlY2F1c2UgdGhlIGhhbmRsZXIgdGFrZXMgY2FyZSBvZiBpdAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCA9IENTUl9JU19MT1NUTElOS19ST0FNSU5HKHBTZXNzaW9uLT5yb2FtaW5nUmVhc29uKSA/IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfTE9TVExJTksgOiBlQ1NSX1JPQU1fUkVTVUxUX05PTkU7CisgICAgICAgICAgICAvL1JvYW1pbmcgaXMgc3RvcHBlZCBhZnRlciBoZXJlIAorICAgICAgICAgICAgY3NyUm9hbUNvbXBsZXRlUm9hbWluZyhwTWFjLCBzZXNzaW9uSWQsIGVBTklfQk9PTEVBTl9UUlVFLCByb2FtUmVzdWx0KTsKKyAgICAgICAgICAgIC8vU2luY2UgQ1NSIG1heSBiZSBpbiBsb3N0bGluayByb2FtaW5nIHNpdHVhdGlvbiwgYWJvcnQgYWxsIHJvYW1pbmcgcmVsYXRlZCBhY3Rpdml0aWVzCisgICAgICAgICAgICBjc3JTY2FuQWJvcnRNYWNTY2FuKHBNYWMpOworICAgICAgICAgICAgY3NyUm9hbVN0b3BSb2FtaW5nVGltZXIocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIGNzclJvYW1Sb2FtaW5nVGltZXJIYW5kbGVyKHZvaWQgKnB2KQoreworICAgIHRDc3JUaW1lckluZm8gKnBJbmZvID0gKHRDc3JUaW1lckluZm8gKilwdjsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gcEluZm8tPnBNYWM7CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkID0gcEluZm8tPnNlc3Npb25JZDsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAKKyAgICBpZihlQU5JX0JPT0xFQU5fRkFMU0UgPT0gcFNlc3Npb24tPmZDYW5jZWxSb2FtaW5nKSAKKyAgICB7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyUm9hbVN0YXJ0Um9hbWluZyhwTWFjLCBzZXNzaW9uSWQsIHBTZXNzaW9uLT5yb2FtaW5nUmVhc29uKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzckNhbGxSb2FtaW5nQ29tcGxldGlvbkNhbGxiYWNrKHBNYWMsIHBTZXNzaW9uLCBOVUxMLCAwLCBwU2Vzc2lvbi0+cm9hbVJlc3VsdCk7CisgICAgICAgICAgICBwU2Vzc2lvbi0+cm9hbWluZ1JlYXNvbiA9IGVDc3JOb3RSb2FtaW5nOworICAgICAgICB9CisgICAgfQorfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbVN0YXJ0Um9hbWluZ1RpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9VMzIgaW50ZXJ2YWwpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgCisgICAgc21zTG9nKHBNYWMsIExPRzEsICIgY3NyU2NhblN0YXJ0Um9hbWluZ1RpbWVyIFxuICIpOworICAgIHBTZXNzaW9uLT5yb2FtaW5nVGltZXJJbmZvLnNlc3Npb25JZCA9ICh0QU5JX1U4KXNlc3Npb25JZDsKKyAgICBzdGF0dXMgPSBwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5oVGltZXJSb2FtaW5nLCBpbnRlcnZhbCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtU3RvcFJvYW1pbmdUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICAgcmV0dXJuIChwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmhUaW1lclJvYW1pbmcpKTsKK30KKworCit2b2lkIGNzclJvYW1XYWl0Rm9yS2V5VGltZU91dEhhbmRsZXIodm9pZCAqcHYpCit7CisgICAgdENzclRpbWVySW5mbyAqcEluZm8gPSAodENzclRpbWVySW5mbyAqKXB2OworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBwSW5mby0+cE1hYzsKKworICAgIGlmKCBDU1JfSVNfV0FJVF9GT1JfS0VZKCBwTWFjLCBwSW5mby0+c2Vzc2lvbklkICkgKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICIgU01FIHByZS1hdXRoIHN0YXRlIHRpbWVvdXQuIFxuICIpOworICAgICAgICAvL0NoYW5nZSB0aGUgc3Vic3RhdGUgc28gY29tbWFuZCBxdWV1ZSBpcyB1bmJsb2NrZWQuCisgICAgICAgIGNzclJvYW1TdWJzdGF0ZUNoYW5nZSggcE1hYywgZUNTUl9ST0FNX1NVQlNUQVRFX05PTkUsIHBJbmZvLT5zZXNzaW9uSWQpOworICAgIH0KKyAgICAKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1TdGFydFdhaXRGb3JLZXlUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBpbnRlcnZhbCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICAKKyAgICBzbXNMb2cocE1hYywgTE9HMSwgIiBjc3JTY2FuU3RhcnRXYWl0Rm9yS2V5VGltZXIgXG4gIik7CisgICAgc3RhdHVzID0gcGFsVGltZXJTdGFydChwTWFjLT5oSGRkLCBwTWFjLT5yb2FtLmhUaW1lcldhaXRGb3JLZXksIGludGVydmFsLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1TdG9wV2FpdEZvcktleVRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgcmV0dXJuIChwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE1hYy0+cm9hbS5oVGltZXJXYWl0Rm9yS2V5KSk7Cit9CisKKwordm9pZCBjc3JSb2FtSWJzc0pvaW5UaW1lckhhbmRsZXIodm9pZCAqcHYpCit7CisgICAgdENzclRpbWVySW5mbyAqcEluZm8gPSAodENzclRpbWVySW5mbyAqKXB2OworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBwSW5mby0+cE1hYzsKKyAgICBlQ3NyUm9hbURpc2Nvbm5lY3RSZWFzb24gcmVhc29uID0gZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9JQlNTX0pPSU5fRkFJTFVSRTsKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQgPSBwSW5mby0+c2Vzc2lvbklkOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIAorICAgIHBTZXNzaW9uLT5pYnNzX2pvaW5fcGVuZGluZyA9IEZBTFNFOworICAgIC8vIEpFWjEwMDIyNTogIEFzIG9mIG1haW4vbGF0ZXN0ICJ0aXAiLCB3ZSBhcmUgbm8gbG9uZ2VyIGRvaW5nIHRoaXMuIENoZWNrIG9uIHRoaXMuCisgICAgLy9jc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgMCwgZUNTUl9ST0FNX0lCU19JTkQsIGVDU1JfUk9BTV9SRVNVTFRfSUJTU19KT0lOX0ZBSUxFRCk7CisgICAgLy8gU2VuZCBhbiBJQlNTIHN0b3AgcmVxdWVzdCB0byBQRQorICAgIGNzclJvYW1EaXNjb25uZWN0SW50ZXJuYWwocE1hYywgc2Vzc2lvbklkLCByZWFzb24pOworCit9CisKK2VIYWxTdGF0dXMgY3NyUm9hbVN0YXJ0SWJzc0pvaW5UaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRBTklfVTMyIGludGVydmFsKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIAorICAgIHNtc0xvZyhwTWFjLCBMT0cxLCAiIGNzclJvYW1TdGFydElic3NKb2luVGltZXIgXG4gIik7CisgICAgcFNlc3Npb24tPmlic3NKb2luVGltZXJJbmZvLnNlc3Npb25JZCA9ICh0QU5JX1U4KXNlc3Npb25JZDsKKyAgICBzdGF0dXMgPSBwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5oVGltZXJJYnNzSm9pbmluZywgaW50ZXJ2YWwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCitlSGFsU3RhdHVzIGNzclJvYW1TdG9wSWJzc0pvaW5UaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICAgcmV0dXJuIChwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmhUaW1lcklic3NKb2luaW5nKSk7Cit9CisKK3ZvaWQgY3NyUm9hbUNvbXBsZXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywgdFNtZUNtZCAqcENvbW1hbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCwgdEFOSV9CT09MRUFOIGZTdWNjZXNzKQoreworICAgIGVSb2FtQ21kU3RhdHVzIHJvYW1TdGF0dXMgPSBjc3JHZXRSb2FtQ29tcGxldGVTdGF0dXMocE1hYywgc2Vzc2lvbklkKTsKKyAgICB0QU5JX1UzMiByb2FtSWQgPSAwOworICAgIAorICAgIGlmKHBDb21tYW5kKQorICAgIHsKKyAgICAgICAgcm9hbUlkID0gcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtSWQ7CisjaWYgZGVmaW5lZChWT1NTX0VOQUJMRUQpCisgICAgICAgIFZPU19BU1NFUlQoIHNlc3Npb25JZCA9PSBwQ29tbWFuZC0+c2Vzc2lvbklkICk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZihlQ1NSX1JPQU1fUk9BTUlOR19DT01QTEVUSU9OID09IHJvYW1TdGF0dXMpCisgICAgeworICAgICAgICAvL2lmIHN1Y2Nlc3MsIGZvcmNlIHJvYW1pbmcgY29tcGxldGlvbgorICAgICAgICBjc3JSb2FtQ29tcGxldGVSb2FtaW5nKHBNYWMsIHNlc3Npb25JZCwgZlN1Y2Nlc3MsIHJvYW1SZXN1bHQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWT1NfQVNTRVJUKChDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApKS0+YlJlZkFzc29jU3RhcnRDbnQgPT0gMCk7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiICBpbmRpY2F0ZXMgYXNzb2NpYXRpb24gY29tcGxldGlvbi4gcm9hbVJlc3VsdCA9ICVkXG4iKSwgcm9hbVJlc3VsdCk7CisgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIHJvYW1JZCwgcm9hbVN0YXR1cywgcm9hbVJlc3VsdCk7CisgICAgfQorfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbUxvc3RMaW5rKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRBTklfVTMyIHR5cGUsIHRTaXJTbWVSc3AgKnBTaXJNc2cpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTaXJTbWVEZWF1dGhJbmQgKnBEZWF1dGhJbmRNc2cgPSBOVUxMOworICAgIHRTaXJTbWVEaXNhc3NvY0luZCAqcERpc2Fzc29jSW5kTXNnID0gTlVMTDsKKyAgICBlQ3NyUm9hbVJlc3VsdCByZXN1bHQgPSBlQ1NSX1JPQU1fUkVTVUxUX0xPU1RMSU5LOworICAgIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvID0gTlVMTDsKKyAgICB0Q3NyUm9hbUluZm8gcm9hbUluZm87CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgLy9Pbmx5IG5lZWQgdG8gcm9hbSBmb3IgaW5mcmEgc3RhdGlvbi4gSW4gdGhpcyBjYXNlIFAyUCBjbGllbnQgd2lsbCByb2FtIGFzIHdlbGwKKyAgICB0QU5JX0JPT0xFQU4gZlRvUm9hbSA9IENTUl9JU19JTkZSQVNUUlVDVFVSRSgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpOworCisgICAgcFNlc3Npb24tPmZDYW5jZWxSb2FtaW5nID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGlmICggZVdOSV9TTUVfRElTQVNTT0NfSU5EID09IHR5cGUgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9ESVNBU1NPQ19JTkQ7CisgICAgICAgIHBEaXNhc3NvY0luZE1zZyA9ICh0U2lyU21lRGlzYXNzb2NJbmQgKilwU2lyTXNnOworICAgICAgICBwU2Vzc2lvbi0+cm9hbWluZ1N0YXR1c0NvZGUgPSBwRGlzYXNzb2NJbmRNc2ctPnN0YXR1c0NvZGU7CisgICAgfQorICAgIGVsc2UgaWYgKCBlV05JX1NNRV9ERUFVVEhfSU5EID09IHR5cGUgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9ERUFVVEhfSU5EOworICAgICAgICBwRGVhdXRoSW5kTXNnID0gKHRTaXJTbWVEZWF1dGhJbmQgKilwU2lyTXNnOworICAgICAgICBwU2Vzc2lvbi0+cm9hbWluZ1N0YXR1c0NvZGUgPSBwRGVhdXRoSW5kTXNnLT5zdGF0dXNDb2RlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoImdldHMgYW4gdW5rbm93biB0eXBlICglZClcbiIpLCB0eXBlKTsKKyAgICAgICAgcmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9OT05FOworICAgIH0KKyAgICAKKyAgICAvLyBjYWxsIHByb2ZpbGUgbG9zdCBsaW5rIHJvdXRpbmUgaGVyZQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBpZighQ1NSX0lTX0lORlJBX0FQKCZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSkpCisjZW5kaWYKKyAgICB7CisgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBOVUxMLCAwLCBlQ1NSX1JPQU1fTE9TVExJTktfREVURUNURUQsIHJlc3VsdCk7CisgICAgfQorICAgIAorICAgIGlmICggZVdOSV9TTUVfRElTQVNTT0NfSU5EID09IHR5cGUgKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gY3NyU2VuZE1CRGlzYXNzb2NDbmZNc2cocE1hYywgcERpc2Fzc29jSW5kTXNnKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGVXTklfU01FX0RFQVVUSF9JTkQgPT0gdHlwZSApCisgICAgeworICAgICAgICBzdGF0dXMgPSBjc3JTZW5kTUJEZWF1dGhDbmZNc2cocE1hYywgcERlYXV0aEluZE1zZyk7CisgICAgfQorCisgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAvL0lmIGZhaWwgdG8gc2VuZCBjb25maXJtYXRpb24gdG8gUEUsIG5vdCB0byB0cmlnZ2VyIHJvYW1pbmcKKyAgICAgICBmVG9Sb2FtID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIH0KKworICAgIC8vdGVsbCBIREQgdG8gZGlzY29ubmVjdAorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisgICAgcm9hbUluZm8uc3RhdHVzQ29kZSA9ICh0U2lyUmVzdWx0Q29kZXMpcFNlc3Npb24tPnJvYW1pbmdTdGF0dXNDb2RlOworICAgIHJvYW1JbmZvLnJlYXNvbkNvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKCBlV05JX1NNRV9ESVNBU1NPQ19JTkQgPT0gdHlwZSkKKyAgICB7CisgICAgICAgIC8vc3RhTWFjQWRkcgorICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHJvYW1JbmZvLnBlZXJNYWMsIHBEaXNhc3NvY0luZE1zZy0+cGVlck1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICByb2FtSW5mby5zdGFJZCA9ICh0QU5JX1U4KXBEaXNhc3NvY0luZE1zZy0+c3RhSWQ7CisgICAgfQorICAgIGVsc2UgaWYoIGVXTklfU01FX0RFQVVUSF9JTkQgPT0gdHlwZSApCisgICAgeworICAgICAgICAvL3N0YU1hY0FkZHIKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCByb2FtSW5mby5wZWVyTWFjLCBwRGVhdXRoSW5kTXNnLT5wZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgIHJvYW1JbmZvLnN0YUlkID0gKHRBTklfVTgpcERlYXV0aEluZE1zZy0+c3RhSWQ7CisgICAgfQorI2VuZGlmCisgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJyb2FtSW5mby5zdGFJZCAoJWQpXG4iKSwgcm9hbUluZm8uc3RhSWQpOworICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIDAsIGVDU1JfUk9BTV9MT1NUTElOSywgcmVzdWx0KTsKKyAgICBpZihmVG9Sb2FtKQorICAgIHsKKyAgICAgICAgLy9Pbmx5IHJlbW92ZSB0aGUgY29ubmVjdGVkIEJTUyBpbiBpbmZyYXN0cnVjdHVyZSBtb2RlCisgICAgICAgIGNzclJvYW1SZW1vdmVDb25uZWN0ZWRCc3NGcm9tU2NhbkNhY2hlKHBNYWMsICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSk7CisgICAgICAgIC8vTm90IHRvIGRvIGFueWluZyBmb3IgbG9zdGxpbmsgd2l0aCBXRFMKKyAgICAgICAgaWYoIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublJvYW1pbmdUaW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cyA9IGNzclJvYW1TdGFydFJvYW1pbmcocE1hYywgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgKCBlV05JX1NNRV9ERUFVVEhfSU5EID09IHR5cGUgKSA/IAorICAgICAgICAgICAgICAgICAgICAgICAgZUNzckxvc3RsaW5rUm9hbWluZ0RlYXV0aCA6IGVDc3JMb3N0bGlua1JvYW1pbmdEaXNhc3NvYykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisgICAgICAgICAgICAgICAgLy9Gb3IgSUJTUywgd2UgbmVlZCB0byBnaXZlIHNvbWUgbW9yZSBpbmZvIHRvIEhERAorICAgICAgICAgICAgICAgIGlmKGNzcklzQnNzVHlwZUlCU1MocFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuQlNTVHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByb2FtSW5mby51LnBDb25uZWN0ZWRQcm9maWxlID0gJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlOworICAgICAgICAgICAgICAgICAgICByb2FtSW5mby5zdGF0dXNDb2RlID0gKHRTaXJSZXN1bHRDb2RlcylwU2Vzc2lvbi0+cm9hbWluZ1N0YXR1c0NvZGU7CisgICAgICAgICAgICAgICAgICAgIHJvYW1JbmZvLnJlYXNvbkNvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcm9hbUluZm8ucmVhc29uQ29kZSA9IGVDc3JSb2FtUmVhc29uU21lSXNzdWVkRm9yTG9zdExpbms7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBSb2FtSW5mbyA9ICZyb2FtSW5mbzsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cm9hbWluZ1JlYXNvbiA9ICggZVdOSV9TTUVfREVBVVRIX0lORCA9PSB0eXBlICkgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JMb3N0bGlua1JvYW1pbmdEZWF1dGggOiBlQ3NyTG9zdGxpbmtSb2FtaW5nRGlzYXNzb2M7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnJvYW1pbmdTdGFydFRpbWUgPSAodEFOSV9USU1FU1RBTVApcGFsR2V0VGlja0NvdW50KHBNYWMtPmhIZGQpOworICAgICAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBwUm9hbUluZm8sIDAsIGVDU1JfUk9BTV9ST0FNSU5HX1NUQVJULCBlQ1NSX1JPQU1fUkVTVUxUX0xPU1RMSU5LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIiAlcyBGYWlsIHRvIHN0YXJ0IHJvYW1pbmcsIHN0YXR1cyA9ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIGZUb1JvYW0gPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL1dlIGFyZSB0b2xkIG5vdCB0byByb2FtLCBpbmRpY2F0ZSBsb3N0bGluaworICAgICAgICAgICAgZlRvUm9hbSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCFmVG9Sb2FtKQorICAgIHsKKyAgICAgICBpZiggZVdOSV9TTUVfRElTQVNTT0NfSU5EID09IHR5cGUpCisgICAgICAgeworICAgICAgICAgICAvL3N0YU1hY0FkZHIKKyAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCByb2FtSW5mby5wZWVyTWFjLCBwRGlzYXNzb2NJbmRNc2ctPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgcm9hbUluZm8uc3RhSWQgPSAodEFOSV9VOClwRGlzYXNzb2NJbmRNc2ctPnN0YUlkOworICAgICAgIH0KKyAgICAgICBlbHNlIGlmKCBlV05JX1NNRV9ERUFVVEhfSU5EID09IHR5cGUgKQorICAgICAgIHsKKyAgICAgICAgICAgLy9zdGFNYWNBZGRyCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHJvYW1JbmZvLnBlZXJNYWMsIHBEZWF1dGhJbmRNc2ctPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICAgIHJvYW1JbmZvLnN0YUlkID0gKHRBTklfVTgpcERlYXV0aEluZE1zZy0+c3RhSWQ7CisgICAgICAgIH0KKyAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsICZyb2FtSW5mbywgMCwgZUNTUl9ST0FNX0xPU1RMSU5LLCByZXN1bHQpOworICAgICAgIAorICAgICAgICAvKk5vIG5lZWQgdG8gc3RhcnQgaWRsZSBzY2FuIGluIGNhc2Ugb2YgSUJTUy9TQVAgCisgICAgICAgICBTdGlsbCBlbmFibGUgaWRsZSBzY2FuIGZvciBwb2xsaW5nIGluIGNhc2UgY29uY3VycmVudCBzZXNzaW9ucyBhcmUgcnVubmluZyAqLworICAgICAgICBpZihDU1JfSVNfSU5GUkFTVFJVQ1RVUkUoJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKSkKKyAgICAgICAgeworICAgICAgICAgICBjc3JTY2FuU3RhcnRJZGxlU2NhbihwTWFjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtTG9zdExpbmtBZnRlcmhhbmRvZmZGYWlsdXJlKCB0cEFuaVNpckdsb2JhbCBwTWFjLHRBTklfVTMyIHNlc3Npb25JZCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworICAgIHRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICBwU2Vzc2lvbi0+ZkNhbmNlbFJvYW1pbmcgPSAgZUFOSV9CT09MRUFOX0ZBTFNFOworCisgICAgLy9Pbmx5IHJlbW92ZSB0aGUgY29ubmVjdGVkIEJTUyBpbiBpbmZyYXN0cnVjdHVyZSBtb2RlCisgICAgY3NyUm9hbVJlbW92ZUNvbm5lY3RlZEJzc0Zyb21TY2FuQ2FjaGUocE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlKTsKKyAgICBpZihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5Sb2FtaW5nVGltZSkKKyAgICB7CisgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cyA9IGNzclJvYW1TdGFydFJvYW1pbmcocE1hYyxzZXNzaW9uSWQsIHBTZXNzaW9uLT5yb2FtaW5nUmVhc29uKSkpCisgICAgICAgeworICAgICAgICAgIC8vYmVmb3JlIHN0YXJ0aW5nIHRoZSBsb3N0IGxpbmsgbG9naWMgcmVsZWFzZSB0aGUgcm9hbSBjb21tYW5kIGZvciBoYW5kb2ZmCisgICAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCgmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKyAgICAgICAgICBpZihwRW50cnkpCisgICAgICAgICAgeworICAgICAgICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYocENvbW1hbmQpCisgICAgICAgICAgeworICAgICAgICAgICAgIGlmICgoIGVTbWVDb21tYW5kUm9hbSA9PSBwQ29tbWFuZC0+Y29tbWFuZCApICYmCisgICAgICAgICAgICAgICAgICggZUNzclNtZUlzc3VlZEFzc29jVG9TaW1pbGFyQVAgPT0gcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGlmKCBjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0sgKSApCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRSb2FtKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIkxvc3QgbGluayByb2FtaW5nIHN0YXJ0ZWQgLi4uXG4iKTsKKyAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgLy9XZSBhcmUgdG9sZCBub3QgdG8gcm9hbSwgaW5kaWNhdGUgbG9zdGxpbmsKKyAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKK3ZvaWQgY3NyUm9hbVdtU3RhdHVzQ2hhbmdlQ29tcGxldGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRTbWVDbWQgKnBDb21tYW5kOworCisgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyApOworICAgIGlmICggcEVudHJ5ICkKKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgIGlmICggZVNtZUNvbW1hbmRXbVN0YXR1c0NoYW5nZSA9PSBwQ29tbWFuZC0+Y29tbWFuZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gcHJvY2VzcyBpbiBhIExvc3QgTGluayBjb21wbGV0aW9uLi4uLiAgSXQganVzdCBraWNrcyBvZmYgYQorICAgICAgICAgICAgLy8gcm9hbWluZyBzZXF1ZW5jZS4KKyAgICAgICAgICAgIGlmKCBjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0sgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRXbVN0YXR1c0NoYW5nZSggcE1hYywgcENvbW1hbmQgKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICIgKioqKioqY3NyUm9hbVdtU3RhdHVzQ2hhbmdlQ29tcGxldGUgZmFpbCB0byByZWxlYXNlIGNvbW1hbmRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICJDU1I6IFdtU3RhdHVzQ2hhbmdlIENvbXBsZXRpb24gY2FsbGVkIGJ1dCBMT1NUIExJTksgY29tbWFuZCBpcyBub3QgQUNUSVZFIC4uLlxuIiApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIkNTUjogV21TdGF0dXNDaGFuZ2UgQ29tcGxldGlvbiBjYWxsZWQgYnV0IE5PIGNvbW1hbmRzIGFyZSBBQ1RJVkUgLi4uXG4iICk7CisgICAgfQorCisgICAgc21lUHJvY2Vzc1BlbmRpbmdRdWV1ZSggcE1hYyApOworfQorCisKK3ZvaWQgY3NyUm9hbVByb2Nlc3NXbVN0YXR1c0NoYW5nZUNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdFNpclNtZVJzcCAqcFNpclNtZU1zZzsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBwQ29tbWFuZC0+c2Vzc2lvbklkICk7CisKKyAgICBzd2l0Y2ggKCBwQ29tbWFuZC0+dS53bVN0YXR1c0NoYW5nZUNtZC5UeXBlICkKKyAgICB7CisgICAgICAgIGNhc2UgZUNzckRpc2Fzc29jaWF0ZWQ6CisgICAgICAgICAgICBwU2lyU21lTXNnID0gKHRTaXJTbWVSc3AgKikmcENvbW1hbmQtPnUud21TdGF0dXNDaGFuZ2VDbWQudS5EaXNhc3NvY0luZE1zZzsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Mb3N0TGluayhwTWFjLCBwQ29tbWFuZC0+c2Vzc2lvbklkLCBlV05JX1NNRV9ESVNBU1NPQ19JTkQsIHBTaXJTbWVNc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ3NyRGVhdXRoZW50aWNhdGVkOgorICAgICAgICAgICAgcFNpclNtZU1zZyA9ICh0U2lyU21lUnNwICopJnBDb21tYW5kLT51LndtU3RhdHVzQ2hhbmdlQ21kLnUuRGVhdXRoSW5kTXNnOworICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUxvc3RMaW5rKHBNYWMsIHBDb21tYW5kLT5zZXNzaW9uSWQsIGVXTklfU01FX0RFQVVUSF9JTkQsIHBTaXJTbWVNc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiZ2V0cyBhbiB1bmtub3duIGNvbW1hbmQgJWRcbiIpLCBwQ29tbWFuZC0+dS53bVN0YXR1c0NoYW5nZUNtZC5UeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvL0ZvciBXRFMsIHdlIHdhbnQgdG8gc3RvcCBCU1MgYXMgd2VsbCB3aGVuIGl0IGlzIGluZGljYXRlZCB0aGF0IGl0IGlzIGRpc2Nvbm5lY3RlZC4KKyAgICBpZiggQ1NSX0lTX0NPTk5fV0RTKCZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZSkgKQorICAgIHsKKyAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyUm9hbUlzc3VlU3RvcEJzc0NtZCggcE1hYywgcENvbW1hbmQtPnNlc3Npb25JZCwgZUFOSV9CT09MRUFOX1RSVUUgKSkgKQorICAgICAgICB7CisgICAgICAgICAgICAvL1RoaXMgaXMgbm90IGdvb2QKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBmYWlsZWQgdG8gaXNzdWUgc3RvcEJTUyBjb21tYW5kXG4iKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBMb3N0IExpbmsganVzdCB0cmlnZ2VycyBhIHJvYW1pbmcgc2VxdWVuY2UuICBXZSBjYW4gY29tcGx0ZSB0aGUgTG9zdCBMaW5rCisgICAgLy8gY29tbWFuZCBoZXJlIHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkby4KKyAgICBjc3JSb2FtV21TdGF0dXNDaGFuZ2VDb21wbGV0ZSggcE1hYyApOworfQorCisKKy8vVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJhbmQgYW5kIG1vZGUgaW5mb3JtYXRpb24uCisvL1RoZSBvbmx5IHRyaWNreSBwYXJ0IGlzIHRoYXQgaWYgcGh5TW9kZSBpcyBzZXQgdG8gMTFhYmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQgorLy9pbnN0ZWFkIG9mIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFHIGlmIGV2ZXJ5dGhpbmcgaXMgc2V0IHRvIGF1dG8tcGljay4KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCitzdGF0aWMgZUNzckNmZ0RvdDExTW9kZSBjc3JSb2FtR2V0UGh5TW9kZUJhbmRGb3JCc3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IG9wZXJhdGlvbkNobiwgZUNzckJhbmQgKnBCYW5kICkKKyNlbHNlCitzdGF0aWMgZUNzckNmZ0RvdDExTW9kZSBjc3JSb2FtR2V0UGh5TW9kZUJhbmRGb3JCc3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVDc3JQaHlNb2RlIHBoeU1vZGVJbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggb3BlcmF0aW9uQ2huLCBlQ3NyQmFuZCAqcEJhbmQgKQorI2VuZGlmCit7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgZUNzclBoeU1vZGUgcGh5TW9kZUluID0gKGVDc3JQaHlNb2RlKXBQcm9maWxlLT5waHlNb2RlOworICAgIGVDc3JDZmdEb3QxMU1vZGUgY2ZnRG90MTFNb2RlID0gY3NyR2V0Q2ZnRG90MTFNb2RlRnJvbUNzclBoeU1vZGUocFByb2ZpbGUsIHBoeU1vZGVJbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQpOworI2Vsc2UKKyAgICBlQ3NyQ2ZnRG90MTFNb2RlIGNmZ0RvdDExTW9kZSA9IGNzckdldENmZ0RvdDExTW9kZUZyb21Dc3JQaHlNb2RlKHBoeU1vZGVJbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQpOworI2VuZGlmCisgICAgZUNzckJhbmQgZUJhbmQ7CisgICAgCisgICAgLy9JZiB0aGUgZ2xvYmFsIHNldHRpbmcgZm9yIGRvdDExTW9kZSBpcyBzZXQgdG8gYXV0by9hYmcsIHdlIG92ZXJ3cml0ZSB0aGUgc2V0dGluZyBpbiB0aGUgcHJvZmlsZS4KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYoICgoIUNTUl9JU19JTkZSQV9BUChwUHJvZmlsZSApJiYgIUNTUl9JU19XRFMocFByb2ZpbGUgKSkgJiYgCisgICAgICAgICAoKGVDU1JfQ0ZHX0RPVDExX01PREVfQVVUTyA9PSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnVDZmdEb3QxMU1vZGUpIHx8CisgICAgICAgICAoZUNTUl9DRkdfRE9UMTFfTU9ERV9BQkcgPT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS51Q2ZnRG90MTFNb2RlKSkpIHx8CisgICAgICAgIChlQ1NSX0NGR19ET1QxMV9NT0RFX0FVVE8gPT0gY2ZnRG90MTFNb2RlKSB8fCAoZUNTUl9DRkdfRE9UMTFfTU9ERV9BQkcgPT0gY2ZnRG90MTFNb2RlKSApCisjZWxzZQorICAgIGlmKCAoZUNTUl9DRkdfRE9UMTFfTU9ERV9BVVRPID09IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSkgfHwKKyAgICAgICAgKGVDU1JfQ0ZHX0RPVDExX01PREVfQUJHID09IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSkgfHwKKyAgICAgICAgKGVDU1JfQ0ZHX0RPVDExX01PREVfQVVUTyA9PSBjZmdEb3QxMU1vZGUpIHx8IChlQ1NSX0NGR19ET1QxMV9NT0RFX0FCRyA9PSBjZmdEb3QxMU1vZGUpICkKKworI2VuZGlmCisgICAgeworICAgICAgICBzd2l0Y2goIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udUNmZ0RvdDExTW9kZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE6CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE7CisgICAgICAgICAgICAgICAgZUJhbmQgPSBlQ1NSX0JBTkRfNUc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOgorICAgICAgICAgICAgICAgIGNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOworICAgICAgICAgICAgICAgIGVCYW5kID0gZUNTUl9CQU5EXzI0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzoKKyAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKyAgICAgICAgICAgICAgICBlQmFuZCA9IGVDU1JfQkFORF8yNDsKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU46CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisgICAgICAgICAgICAgICAgZUJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgICAgICAvL2Nhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV9CRVNUOgorICAgICAgICAgICAgLy8gICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV9CRVNUOworICAgICAgICAgICAgLy8gICAgZUJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisgICAgICAgICAgICAvLyAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gR2xvYmFsIGRvdDExIE1vZGUgc2V0dGluZyBpcyAxMWEvYi9nLgorICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgY2hhbm5lbCBudW1iZXIgdG8gZGV0ZXJtaW5lIHRoZSBNb2RlIHNldHRpbmcuCisgICAgICAgICAgICAgICAgaWYgKCBlQ1NSX09QRVJBVElOR19DSEFOTkVMX0FVVE8gPT0gb3BlcmF0aW9uQ2huICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVCYW5kID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lQmFuZDsKKyAgICAgICAgICAgICAgICAgICAgaWYoZUNTUl9CQU5EXzI0ID09IGVCYW5kKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1NlZSByZWFzb24gaW4gZWxzZSBpZiAoIENTUl9JU19DSEFOTkVMXzI0R0haKG9wZXJhdGlvbkNobikgKSB0byBwaWNrIDExQgorICAgICAgICAgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByZWZlciA1R0h6CisgICAgICAgICAgICAgICAgICAgICAgICBlQmFuZCA9IGVDU1JfQkFORF81RzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBDU1JfSVNfQ0hBTk5FTF8yNEdIWihvcGVyYXRpb25DaG4pICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwgaXMgYSAyLjRHSHogY2hhbm5lbC4gIFNldCBtb2RlIHRvIDExZy4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gISFMQUMgLSBXaUZpIHRlc3RzIHJlcXVpcmUgSUJTUyBuZXR3b3JrcyB0byBzdGFydCBpbiAxMWIgbW9kZSB3aXRob3V0IGFueSBjaGFuZ2UgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgcGFyYW1ldGVyIHNldHRpbmdzIG9uIHRoZSBhZGFwdGVyLiAgV2UgdXNlIEFDVSB0byBzdGFydCBhbiBJQlNTIHRocm91Z2ggY3JlYXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gb2YgYSBzdGFydElCU1MgcHJvZmlsZS4gICB0aGlzIHN0YXJ0SUJTUyBwcm9maWxlIGhhcyBBdXRvIE1BQ1Byb3RvY29sIGFuZCB0aGUgCisgICAgICAgICAgICAgICAgICAgIC8vIGFkYXB0ZXIgcHJvcGVydHkgc2V0dGluZyBmb3IgZG90MTFNb2RlIGlzIGFsc28gQVVUTy4gICBTbyBpbiB0aGlzIGNhc2UsIGxldCdzIHN0YXJ0IAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgSUJTUyBuZXR3b3JrIGluIDExYiBtb2RlIGluc3RlYWQgb2YgMTFnIG1vZGUuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoaXMgaXMgZm9yIEF1dG89cHJvZmlsZS0+TWFjUHJvdG9jb2wgJiYgQXV0bz1HbG9iYWwuZG90MTFNb2RlICYmIHByb2ZpbGUtPmNoYW5uZWwgaXMgPCAxNCwgCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gc3RhcnQgdGhlIElCU1MgaW4gYiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogIHdlIHVzZWQgdG8gaGF2ZSB0aGlzIHN0YXJ0IGFzIGFuIDExZyBJQlNTIGZvciBiZXN0IHBlcmZvcm1hbmNlLi4uIG5vdyB0byBzcGVjaWZ5IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgd2lsbCBoYXZlIHRvIHNldCB0aGUgZG8xMU1vZGUgaW4gdGhlIHByb3BlcnR5IHBhZ2UgdG8gMTFnIHRvIGZvcmNlIGl0LgorICAgICAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKyAgICAgICAgICAgICAgICAgICAgZUJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgICAgICAvLyBlbHNlLCBpdCdzIGEgNS4wR0h6IGNoYW5uZWwuICBTZXQgbW9kZSB0byAxMWEuCisgICAgICAgICAgICAgICAgICAgIGNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOworICAgICAgICAgICAgICAgICAgICBlQmFuZCA9IGVDU1JfQkFORF81RzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0vL3N3aXRjaAorICAgIH0vL2lmKCBlQ1NSX0NGR19ET1QxMV9NT0RFX0FCRyA9PSBjZmdEb3QxMU1vZGUgKQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICAgICAvL2RvdDExIG1vZGUgaXMgc2V0LCBsZXRzIHBpY2sgdGhlIGJhbmQKKyAgICAgICAgICAgIGlmICggZUNTUl9PUEVSQVRJTkdfQ0hBTk5FTF9BVVRPID09IG9wZXJhdGlvbkNobiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gY2hhbm5lbCBpcyBBdXRvIGFsc28uIAorICAgICAgICAgICAgICAgIGVCYW5kID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lQmFuZDsKKyAgICAgICAgICAgICAgICBpZihlQ1NSX0JBTkRfQUxMID09IGVCYW5kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9wcmVmZXIgNUdIegorICAgICAgICAgICAgICAgICAgICBlQmFuZCA9IGVDU1JfQkFORF81RzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggQ1NSX0lTX0NIQU5ORUxfMjRHSFoob3BlcmF0aW9uQ2huKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZUJhbmQgPSBlQ1NSX0JBTkRfMjQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIGVCYW5kID0gZUNTUl9CQU5EXzVHOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgaWYocEJhbmQpCisgICAgeworICAgICAgICAqcEJhbmQgPSBlQmFuZDsKKyAgICB9CisgICAgCisgICBpZiAob3BlcmF0aW9uQ2huID09IDE0KXsgCisgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBTd2l0Y2hpbmcgdG8gRG90MTFCIG1vZGUgXG4iKSk7CisgICAgIGNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOworICAgfQorCisgICAgcmV0dXJuKCBjZmdEb3QxMU1vZGUgKTsKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1Jc3N1ZVN0b3BCc3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgZUNzclJvYW1TdWJTdGF0ZSBOZXdTdWJzdGF0ZSApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorICAgIHsKKyAgICAgICAgdm9zX2xvZ19pYnNzX3BrdF90eXBlICpwSWJzc0xvZzsKKworICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19BTExPQyhwSWJzc0xvZywgdm9zX2xvZ19pYnNzX3BrdF90eXBlLCBMT0dfV0xBTl9JQlNTX0MpOworICAgICAgICBpZihwSWJzc0xvZykKKyAgICAgICAgeworICAgICAgICAgICAgcElic3NMb2ctPmV2ZW50SWQgPSBXTEFOX0lCU1NfRVZFTlRfU1RPUF9SRVE7CisgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19SRVBPUlQocElic3NMb2cpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKworICAgIHBTZXNzaW9uLT5pYnNzX2pvaW5fcGVuZGluZyA9IEZBTFNFOworICAgIGNzclJvYW1TdG9wSWJzc0pvaW5UaW1lcihwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAvLyBTZXQgdGhlIHJvYW1pbmcgc3Vic3RhdGUgdG8gJ3N0b3AgQnNzIHJlcXVlc3QnLi4uCisgICAgY3NyUm9hbVN1YnN0YXRlQ2hhbmdlKCBwTWFjLCBOZXdTdWJzdGF0ZSwgc2Vzc2lvbklkICk7CisKKyAgICAvLyBhdHRlbXB0IHRvIHN0b3AgdGhlIEJzcyAocmVhc29uIGNvZGUgaXMgaWdub3JlZC4uLikKKyAgICBzdGF0dXMgPSBjc3JTZW5kTUJTdG9wQnNzUmVxTXNnKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworLy9wTnVtQ2hhbiBpcyBhIGNhbGxlciBhbGxvY2F0ZWQgc3BhY2Ugd2l0aCB0aGUgc2l6ZW9mIHBDaGFubmVscworZUhhbFN0YXR1cyBjc3JHZXRDZmdWYWxpZENoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBDaGFubmVscywgdEFOSV9VMzIgKnBOdW1DaGFuKQoreworICAgCisgICAgcmV0dXJuIChjY21DZmdHZXRTdHIocE1hYywgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QsCisgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKXBDaGFubmVscywKKyAgICAgICAgICAgICAgICAgIHBOdW1DaGFuKSk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzclJvYW1Jc0NoYW5uZWxWYWxpZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjaGFubmVsICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZlZhbGlkID0gRkFMU0U7CisgICAgdEFOSV9VMzIgaWR4VmFsaWRDaGFubmVsczsKKyAgICB0QU5JX1UzMiBsZW4gPSBzaXplb2YocE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0KTsKKyAgICAKKyAgICBpZiAoSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldENmZ1ZhbGlkQ2hhbm5lbHMocE1hYywgcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCAmbGVuKSkpCisgICAgeworICAgICAgICBmb3IgKCBpZHhWYWxpZENoYW5uZWxzID0gMDsgKCBpZHhWYWxpZENoYW5uZWxzIDwgbGVuICk7IGlkeFZhbGlkQ2hhbm5lbHMrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggY2hhbm5lbCA9PSBwTWFjLT5yb2FtLnZhbGlkQ2hhbm5lbExpc3RbIGlkeFZhbGlkQ2hhbm5lbHMgXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZlZhbGlkID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgCisgICAgcE1hYy0+cm9hbS5udW1WYWxpZENoYW5uZWxzID0gbGVuOyAgIAorICAgIHJldHVybiBmVmFsaWQ7Cit9CisKKwordEFOSV9CT09MRUFOIGNzclJvYW1Jc1ZhbGlkNDBNaHpDaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY2hhbm5lbCkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZlZhbGlkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHRBTklfVTggaTsKKworICAgIGZvcihpID0gMDsgaSA8IHBNYWMtPnNjYW4uYmFzZTQwTUh6Q2hhbm5lbHMubnVtQ2hhbm5lbHM7IGkrKykKKyAgICB7CisgICAgICAgIGlmKGNoYW5uZWwgPT0gcE1hYy0+c2Nhbi5iYXNlNDBNSHpDaGFubmVscy5jaGFubmVsTGlzdFtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgZlZhbGlkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoZlZhbGlkKTsKK30KKworCisvL1RoaXMgZnVuY3Rpb24gY2hlY2sgYW5kIHZhbGlkYXRlIHdoZXRoZXIgdGhlIE5JQyBjYW4gZG8gQ0IgKDQwTUh6KQorc3RhdGljIHRBbmlDQlNlY29uZGFyeU1vZGUgY3NyR2V0Q0JNb2RlRnJvbUllcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IHByaW1hcnlDaG4sIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisgICAgdEFuaUNCU2Vjb25kYXJ5TW9kZSBlUmV0ID0gZUFOSV9DQl9TRUNPTkRBUllfTk9ORTsKKyAgICB0QU5JX1U4IGNlbnRlckNobjsKKyAgICB0QU5JX1UzMiBDaGFubmVsQm9uZGluZ01vZGU7CisKKyAgICBpZihDU1JfSVNfQ0hBTk5FTF8yNEdIWihwcmltYXJ5Q2huKSkKKyAgICB7CisgICAgICAgIENoYW5uZWxCb25kaW5nTW9kZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlMjRHSHo7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENoYW5uZWxCb25kaW5nTW9kZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY2hhbm5lbEJvbmRpbmdNb2RlNUdIejsKKyAgICB9CisgICAgLy9GaWd1cmUgd2hhdCB0aGUgb3RoZXIgc2lkZSdzIENCIG1vZGUKKyAgICBpZihXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEUgIT0gQ2hhbm5lbEJvbmRpbmdNb2RlKQorICAgIHsKKyAgICAgICAgaWYocEllcy0+SFRDYXBzLnByZXNlbnQgJiYgKGVIVF9DSEFOTkVMX1dJRFRIXzQwTUhaID09IHBJZXMtPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwSWVzLT5IVEluZm8ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihQSFlfRE9VQkxFX0NIQU5ORUxfTE9XX1BSSU1BUlkgPT0gcEllcy0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlUmV0ID0gZUFOSV9DQl9TRUNPTkRBUllfVVA7CisgICAgICAgICAgICAgICAgICAgIGNlbnRlckNobiA9IHByaW1hcnlDaG4gKyBDU1JfQ0JfQ0VOVEVSX0NIQU5ORUxfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKFBIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlkgPT0gcEllcy0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlUmV0ID0gZUFOSV9DQl9TRUNPTkRBUllfRE9XTjsKKyAgICAgICAgICAgICAgICAgICAgY2VudGVyQ2huID0gcHJpbWFyeUNobiAtIENTUl9DQl9DRU5URVJfQ0hBTk5FTF9PRkZTRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVECisgICAgICAgICAgICAgICAgICAgIGNlbnRlckNobiA9IHByaW1hcnlDaG47CisgICAgICAgICAgICAgICAgICAgIGVSZXQgPSBlQU5JX0NCX1NFQ09OREFSWV9OT05FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZigoZUFOSV9DQl9TRUNPTkRBUllfTk9ORSAhPSBlUmV0KSAmJiAhY3NyUm9hbUlzVmFsaWQ0ME1oekNoYW5uZWwocE1hYywgY2VudGVyQ2huKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiICBJbnZhbGlkIGNlbnRlciBjaGFubmVsICglZCksIGRpc2FibGUgNDBNSHogbW9kZVxuIiwgY2VudGVyQ2huKTsKKyAgICAgICAgICAgICAgICAgICAgZVJldCA9IGVBTklfQ0JfU0VDT05EQVJZX05PTkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVSZXQ7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JJc0VuY3J5cHRpb25Jbkxpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JFbmNyeXB0aW9uTGlzdCAqcENpcGhlckxpc3QsIGVDc3JFbmNyeXB0aW9uVHlwZSBlbmNyeXB0aW9uVHlwZSApCit7CisgICAgdEFOSV9CT09MRUFOIGZGb3VuZCA9IEZBTFNFOworICAgIHRBTklfVTMyIGlkeDsKKworICAgIGZvciggaWR4ID0gMDsgaWR4IDwgcENpcGhlckxpc3QtPm51bUVudHJpZXM7IGlkeCsrICkKKyAgICB7CisgICAgICAgIGlmKCBwQ2lwaGVyTGlzdC0+ZW5jcnlwdGlvblR5cGVbaWR4XSA9PSBlbmNyeXB0aW9uVHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZGb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmRm91bmQ7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JJc0F1dGhJbkxpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JBdXRoTGlzdCAqcEF1dGhMaXN0LCBlQ3NyQXV0aFR5cGUgYXV0aFR5cGUgKQoreworICAgIHRBTklfQk9PTEVBTiBmRm91bmQgPSBGQUxTRTsKKyAgICB0QU5JX1UzMiBpZHg7CisKKyAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IHBBdXRoTGlzdC0+bnVtRW50cmllczsgaWR4KysgKQorICAgIHsKKyAgICAgICAgaWYoIHBBdXRoTGlzdC0+YXV0aFR5cGVbaWR4XSA9PSBhdXRoVHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZGb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmRm91bmQ7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JJc1NhbWVQcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcFByb2ZpbGUxLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlMikKK3sKKyAgICB0QU5JX0JPT0xFQU4gZkNoZWNrID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwU2NhbkZpbHRlciA9IE5VTEw7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIAorICAgIGlmKHBQcm9maWxlMSAmJiBwUHJvZmlsZTIpCisgICAgeworICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNjYW5GaWx0ZXIsIHNpemVvZih0Q3NyU2NhblJlc3VsdEZpbHRlcikpOworICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJlcGFyZUZpbHRlckZyb21Qcm9maWxlKHBNYWMsIHBQcm9maWxlMiwgcFNjYW5GaWx0ZXIpOworICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZkNoZWNrID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBpOworICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBwU2NhbkZpbHRlci0+U1NJRHMubnVtT2ZTU0lEczsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmQ2hlY2sgPSBjc3JJc1NzaWRNYXRjaCggcE1hYywgcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0W2ldLlNTSUQuc3NJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NhbkZpbHRlci0+U1NJRHMuU1NJRExpc3RbaV0uU1NJRC5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZTEtPlNTSUQuc3NJZCwgcFByb2ZpbGUxLT5TU0lELmxlbmd0aCwgZUFOSV9CT09MRUFOX0ZBTFNFICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGZDaGVjayApIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCFmQ2hlY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCAhY3NySXNBdXRoSW5MaXN0KCBwTWFjLCAmcFByb2ZpbGUyLT5BdXRoVHlwZSwgcFByb2ZpbGUxLT5BdXRoVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQcm9maWxlMi0+QlNTVHlwZSAhPSBwUHJvZmlsZTEtPkJTU1R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFjc3JJc0VuY3J5cHRpb25Jbkxpc3QoIHBNYWMsICZwUHJvZmlsZTItPkVuY3J5cHRpb25UeXBlLCBwUHJvZmlsZTEtPkVuY3J5cHRpb25UeXBlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZkNoZWNrID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICAgICAgICAgICAgICBpZiAocFByb2ZpbGUxLT5NRElELm1kaWVQcmVzZW50IHx8IHBQcm9maWxlMi0+TURJRC5tZGllUHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQcm9maWxlMS0+TURJRC5tb2JpbGl0eURvbWFpbiAhPSBwUHJvZmlsZTItPk1ESUQubW9iaWxpdHlEb21haW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNoZWNrID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLy9NYXRjaCBmb3VuZAorICAgICAgICAgICAgICAgICAgICBmQ2hlY2sgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICB9d2hpbGUoMCk7CisgICAgICAgICAgICAgICAgY3NyRnJlZVNjYW5GaWx0ZXIocE1hYywgcFNjYW5GaWx0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIChmQ2hlY2spOworfQorCisKK3RBTklfQk9PTEVBTiBjc3JSb2FtSXNTYW1lUHJvZmlsZUtleXModHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwQ29ublByb2ZpbGUsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUyKQoreworICAgIHRBTklfQk9PTEVBTiBmQ2hlY2sgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgaW50IGk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLy9Pbmx5IGNoZWNrIGZvciBzdGF0aWMgV0VQCisgICAgICAgIGlmKCFjc3JJc0VuY3J5cHRpb25Jbkxpc3QocE1hYywgJnBQcm9maWxlMi0+RW5jcnlwdGlvblR5cGUsIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWSkgJiYKKyAgICAgICAgICAgICFjc3JJc0VuY3J5cHRpb25Jbkxpc3QocE1hYywgJnBQcm9maWxlMi0+RW5jcnlwdGlvblR5cGUsIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVkpKQorICAgICAgICB7CisgICAgICAgICAgICBmQ2hlY2sgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKCFjc3JJc0VuY3J5cHRpb25Jbkxpc3QocE1hYywgJnBQcm9maWxlMi0+RW5jcnlwdGlvblR5cGUsIHBDb25uUHJvZmlsZS0+RW5jcnlwdGlvblR5cGUpKSBicmVhazsKKyAgICAgICAgaWYocENvbm5Qcm9maWxlLT5LZXlzLmRlZmF1bHRJbmRleCAhPSBwUHJvZmlsZTItPktleXMuZGVmYXVsdEluZGV4KSBicmVhazsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgQ1NSX01BWF9OVU1fS0VZOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBDb25uUHJvZmlsZS0+S2V5cy5LZXlMZW5ndGhbaV0gIT0gcFByb2ZpbGUyLT5LZXlzLktleUxlbmd0aFtpXSkgYnJlYWs7CisgICAgICAgICAgICBpZighcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgJnBDb25uUHJvZmlsZS0+S2V5cy5LZXlNYXRlcmlhbFtpXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcm9maWxlMi0+S2V5cy5LZXlNYXRlcmlhbFtpXSwgcFByb2ZpbGUyLT5LZXlzLktleUxlbmd0aFtpXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoIGkgPT0gQ1NSX01BWF9OVU1fS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBmQ2hlY2sgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKworICAgIHJldHVybiAoZkNoZWNrKTsKK30KKworCisvL0lCU1MKKworCit0QU5JX1U4IGNzclJvYW1HZXRJYnNzU3RhcnRDaGFubmVsTnVtYmVyNTAoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIHRBTklfVTggY2hhbm5lbCA9IDA7ICAgICAKKyAgICB0QU5JX1UzMiBpZHg7CisgICAgdEFOSV9VMzIgaWR4VmFsaWRDaGFubmVsczsKKyAgICB0QU5JX0JPT0xFQU4gZkZvdW5kID0gRkFMU0U7CisgICAgdEFOSV9VMzIgbGVuID0gc2l6ZW9mKHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCk7CisgICAgCisgICAgaWYoZUNTUl9PUEVSQVRJTkdfQ0hBTk5FTF9BTlkgIT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5BZEhvY0NoYW5uZWw1RykKKyAgICB7CisgICAgICAgIGNoYW5uZWwgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkFkSG9jQ2hhbm5lbDVHOworICAgICAgICBpZighY3NyUm9hbUlzQ2hhbm5lbFZhbGlkKHBNYWMsIGNoYW5uZWwpKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFubmVsID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoMCA9PSBjaGFubmVsICYmIEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRDZmdWYWxpZENoYW5uZWxzKHBNYWMsICh0QU5JX1U4ICopcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCAmbGVuKSkpCisgICAgeworICAgICAgICBmb3IgKCBpZHggPSAwOyAoIGlkeCA8IENTUl9OVU1fSUJTU19TVEFSVF9DSEFOTkVMU181MCApICYmICFmRm91bmQ7IGlkeCsrICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGlkeFZhbGlkQ2hhbm5lbHMgPSAwOyAoIGlkeFZhbGlkQ2hhbm5lbHMgPCBsZW4gKSAmJiAhZkZvdW5kOyBpZHhWYWxpZENoYW5uZWxzKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggY3NyU3RhcnRJYnNzQ2hhbm5lbHM1MFsgaWR4IF0gPT0gcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0WyBpZHhWYWxpZENoYW5uZWxzIF0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZkZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IGNzclN0YXJ0SWJzc0NoYW5uZWxzNTBbIGlkeCBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgaXMgcmFyZSwgYnV0IGlmIGl0IGRvZXMgaGFwcGVuLCB3ZSBmaW5kIGFueW9uZSBpbiAxMWEgYmFuZHdpZHRoIGFuZCByZXR1cm4gdGhlIGZpcnN0IDExYSBjaGFubmVsIGZvdW5kIQorICAgICAgICBpZiAoIWZGb3VuZCkgICAgCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGlkeFZhbGlkQ2hhbm5lbHMgPSAwOyBpZHhWYWxpZENoYW5uZWxzIDwgbGVuIDsgaWR4VmFsaWRDaGFubmVscysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIENTUl9JU19DSEFOTkVMXzVHSFoocE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0WyBpZHggXSkgKSAgIC8vIHRoZSBtYXggY2hhbm5lbCMgaW4gMTFnIGlzIDE0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gY3NyU3RhcnRJYnNzQ2hhbm5lbHM1MFsgaWR4IF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0vL2lmCisgICAgCisgICAgcmV0dXJuKCBjaGFubmVsICk7ICAgIAorfQorCisKK3RBTklfVTggY3NyUm9hbUdldElic3NTdGFydENoYW5uZWxOdW1iZXIyNCggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgICAgdEFOSV9VOCBjaGFubmVsID0gMTsKKyAgICB0QU5JX1UzMiBpZHg7CisgICAgdEFOSV9VMzIgaWR4VmFsaWRDaGFubmVsczsKKyAgICB0QU5JX0JPT0xFQU4gZkZvdW5kID0gRkFMU0U7CisgICAgdEFOSV9VMzIgbGVuID0gc2l6ZW9mKHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCk7CisgICAgCisgICAgaWYoZUNTUl9PUEVSQVRJTkdfQ0hBTk5FTF9BTlkgIT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5BZEhvY0NoYW5uZWwyNCkKKyAgICB7CisgICAgICAgIGNoYW5uZWwgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkFkSG9jQ2hhbm5lbDI0OworICAgICAgICBpZighY3NyUm9hbUlzQ2hhbm5lbFZhbGlkKHBNYWMsIGNoYW5uZWwpKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFubmVsID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoMCA9PSBjaGFubmVsICYmIEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRDZmdWYWxpZENoYW5uZWxzKHBNYWMsICh0QU5JX1U4ICopcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCAmbGVuKSkpCisgICAgeworICAgICAgICBmb3IgKCBpZHggPSAwOyAoIGlkeCA8IENTUl9OVU1fSUJTU19TVEFSVF9DSEFOTkVMU18yNCApICYmICFmRm91bmQ7IGlkeCsrICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGlkeFZhbGlkQ2hhbm5lbHMgPSAwOyAoIGlkeFZhbGlkQ2hhbm5lbHMgPCBsZW4gKSAmJiAhZkZvdW5kOyBpZHhWYWxpZENoYW5uZWxzKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggY3NyU3RhcnRJYnNzQ2hhbm5lbHMyNFsgaWR4IF0gPT0gcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0WyBpZHhWYWxpZENoYW5uZWxzIF0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZkZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IGNzclN0YXJ0SWJzc0NoYW5uZWxzMjRbIGlkeCBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4oIGNoYW5uZWwgKTsgICAgCit9CisKKworc3RhdGljIHZvaWQgY3NyUm9hbUdldEJzc1N0YXJ0UGFybXMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbVN0YXJ0QnNzUGFyYW1zICpwUGFyYW0gKQoreworICAgIGVDc3JDZmdEb3QxMU1vZGUgY2ZnRG90MTFNb2RlOworICAgIGVDc3JCYW5kIGVCYW5kOworICAgIHRBTklfVTggY2hhbm5lbCA9IDA7CisgICAgdFNpck53VHlwZSBud1R5cGU7CisgICAgdEFOSV9VOCBvcGVyYXRpb25DaGFubmVsID0gMDsgCisgICAgCisgICAgaWYocFByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgJiYgcFByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KQorICAgIHsKKyAgICAgICBvcGVyYXRpb25DaGFubmVsID0gcFByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0WzBdOworICAgIH0KKyAgICAKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgY2ZnRG90MTFNb2RlID0gY3NyUm9hbUdldFBoeU1vZGVCYW5kRm9yQnNzKCBwTWFjLCBwUHJvZmlsZSwgb3BlcmF0aW9uQ2hhbm5lbCwgJmVCYW5kICk7CisjZWxzZQorICAgIGNmZ0RvdDExTW9kZSA9IGNzclJvYW1HZXRQaHlNb2RlQmFuZEZvckJzcyggcE1hYywgKGVDc3JQaHlNb2RlKXBQcm9maWxlLT5waHlNb2RlLCBvcGVyYXRpb25DaGFubmVsLCAmZUJhbmQgKTsKKyNlbmRpZgorICAgIAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICBpZiggKCAocFByb2ZpbGUtPmNzclBlcnNvbmEgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSkgfHwKKyAgICAgICAgICAocFByb2ZpbGUtPmNzclBlcnNvbmEgPT0gVk9TX1AyUF9HT19NT0RFKSApCisgICAgICYmICggY2ZnRG90MTFNb2RlID09IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCKQorICAgICAgKQorICAgIHsKKyAgICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAKKyAgICAgICAgICAgICAgRkwoIkZvciBQMlBDbGllbnQvUDJQLUdPIChwZXJzb25hICVkKSBjZmdEb3QxMU1vZGUgaXMgMTFCXG4iKSwgCisgICAgICAgICAgICAgIHBQcm9maWxlLT5jc3JQZXJzb25hKTsKKyAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICB9CisjZW5kaWYKKworICAgIHN3aXRjaCggY2ZnRG90MTFNb2RlICkKKyAgICB7CisgICAgICAgIGNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUc6CisgICAgICAgICAgICBud1R5cGUgPSBlU0lSXzExR19OV19UWVBFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjoKKyAgICAgICAgICAgIG53VHlwZSA9IGVTSVJfMTFCX05XX1RZUEU7CisgICAgICAgICAgICBicmVhazsgICAKKworICAgICAgICBjYXNlIGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOgorICAgICAgICAgICAgbndUeXBlID0gZVNJUl8xMUFfTldfVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU46CisgICAgICAgIGNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV9UQVVSVVM6CisgICAgICAgICAgICAvL0JlY2F1c2UgTElNIG9ubHkgdmVyaWZpZXMgaXQgYWdhaW5zdCAxMWEsIDExYiBvciAxMWcsIHNldCBvbmx5IDExZyBvciAxMWEgaGVyZQorICAgICAgICAgICAgaWYoZUNTUl9CQU5EXzI0ID09IGVCYW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG53VHlwZSA9IGVTSVJfMTFHX05XX1RZUEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbndUeXBlID0gZVNJUl8xMUFfTldfVFlQRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gICAKKworICAgIHBQYXJhbS0+ZXh0ZW5kZWRSYXRlU2V0Lm51bVJhdGVzID0gMDsKKworICAgIHN3aXRjaCAoIG53VHlwZSApCisgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJzZWVzIGFuIHVua25vd24gcFNpck53VHlwZSAoJWQpXG4iKSwgbndUeXBlKTsKKyAgICAgICAgY2FzZSBlU0lSXzExQV9OV19UWVBFOgorICAgICAgICAKKyAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID0gODsKKyAgICAgICAgCisgICAgICAgICAgICBwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlWzBdID0gU0lSX01BQ19SQVRFXzYgfCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLOworICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVsxXSA9IFNJUl9NQUNfUkFURV85OworICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVsyXSA9IFNJUl9NQUNfUkFURV8xMiB8IENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0s7CisgICAgICAgICAgICBwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlWzNdID0gU0lSX01BQ19SQVRFXzE4OworICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVs0XSA9IFNJUl9NQUNfUkFURV8yNCB8IENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0s7CisgICAgICAgICAgICBwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlWzVdID0gU0lSX01BQ19SQVRFXzM2OworICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVs2XSA9IFNJUl9NQUNfUkFURV80ODsKKyAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbN10gPSBTSVJfTUFDX1JBVEVfNTQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggZUNTUl9PUEVSQVRJTkdfQ0hBTk5FTF9BTlkgPT0gb3BlcmF0aW9uQ2hhbm5lbCApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBjc3JSb2FtR2V0SWJzc1N0YXJ0Q2hhbm5lbE51bWJlcjUwKCBwTWFjICk7CisgICAgICAgICAgICAgICAgaWYoIDAgPT0gY2hhbm5lbCAmJgorICAgICAgICAgICAgICAgICAgICBDU1JfSVNfUEhZX01PREVfRFVBTF9CQU5EKHBQcm9maWxlLT5waHlNb2RlKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgQ1NSX0lTX1BIWV9NT0RFX0RVQUxfQkFORChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUpIAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1dlIGNvdWxkIG5vdCBmaW5kIGEgNUcgY2hhbm5lbCBieSBhdXRvIHBpY2ssIGxldCdzIHRyeSAyLjRHIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIC8vV2Ugb25seSBkbyB0aGlzIGhlcmUgYmVjYXVzZSBjc3JSb2FtR2V0UGh5TW9kZUJhbmRGb3JCc3MgYWx3YXlzIHBpY2tzIDExYSBmb3IgQVVUTworICAgICAgICAgICAgICAgICAgICBud1R5cGUgPSBlU0lSXzExQl9OV19UWVBFOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gY3NyUm9hbUdldElic3NTdGFydENoYW5uZWxOdW1iZXIyNCggcE1hYyApOworICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID0gNDsKKyAgICAgICAgICAgICAgICAgICBwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlWzBdID0gU0lSX01BQ19SQVRFXzEgfCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLOworICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbMV0gPSBTSVJfTUFDX1JBVEVfMiB8IENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0s7CisgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVsyXSA9IFNJUl9NQUNfUkFURV81XzUgfCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLOworICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbM10gPSBTSVJfTUFDX1JBVEVfMTEgfCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhbm5lbCA9IG9wZXJhdGlvbkNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIGVTSVJfMTFCX05XX1RZUEU6CisgICAgICAgICAgICBwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlcyA9IDQ7CisgICAgICAgICAgICBwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlWzBdID0gU0lSX01BQ19SQVRFXzEgfCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLOworICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVsxXSA9IFNJUl9NQUNfUkFURV8yIHwgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSzsKKyAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbMl0gPSBTSVJfTUFDX1JBVEVfNV81IHwgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSzsKKyAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbM10gPSBTSVJfTUFDX1JBVEVfMTEgfCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLOworCisgICAgICAgICAgICBpZiAoIGVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQU5ZID09IG9wZXJhdGlvbkNoYW5uZWwgKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsID0gY3NyUm9hbUdldElic3NTdGFydENoYW5uZWxOdW1iZXIyNCggcE1hYyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsID0gb3BlcmF0aW9uQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7ICAgICAKKworICAgICAgICBjYXNlIGVTSVJfMTFHX05XX1RZUEU6CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgLyogRm9yIFAyUCBDbGllbnQgYW5kIFAyUCBHTywgZGlzYWJsZSAxMWIgcmF0ZXMgKi8gCisgICAgICAgICAgICBpZiggKHBQcm9maWxlLT5jc3JQZXJzb25hID09IFZPU19QMlBfQ0xJRU5UX01PREUpIHx8CisgICAgICAgICAgICAgICAgKHBQcm9maWxlLT5jc3JQZXJzb25hID09IFZPU19QMlBfR09fTU9ERSkKKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID0gODsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbMF0gPSBTSVJfTUFDX1JBVEVfNiB8IENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0s7CisgICAgICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVsxXSA9IFNJUl9NQUNfUkFURV85OworICAgICAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbMl0gPSBTSVJfTUFDX1JBVEVfMTIgfCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLOworICAgICAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbM10gPSBTSVJfTUFDX1JBVEVfMTg7CisgICAgICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVs0XSA9IFNJUl9NQUNfUkFURV8yNCB8IENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0s7CisgICAgICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVs1XSA9IFNJUl9NQUNfUkFURV8zNjsKKyAgICAgICAgICAgICAgICBwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlWzZdID0gU0lSX01BQ19SQVRFXzQ4OworICAgICAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbN10gPSBTSVJfTUFDX1JBVEVfNTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgICAgICAgICAgICAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID0gNDsKKworICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZVswXSA9IFNJUl9NQUNfUkFURV8xIHwgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSzsKKyAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0LnJhdGVbMV0gPSBTSVJfTUFDX1JBVEVfMiB8IENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0s7CisgICAgICAgICAgICBwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlWzJdID0gU0lSX01BQ19SQVRFXzVfNSB8IENTUl9ET1QxMV9CQVNJQ19SQVRFX01BU0s7CisgICAgICAgICAgICBwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldC5yYXRlWzNdID0gU0lSX01BQ19SQVRFXzExIHwgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSzsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcFBhcmFtLT5leHRlbmRlZFJhdGVTZXQubnVtUmF0ZXMgPSA4OworCisgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPmV4dGVuZGVkUmF0ZVNldC5yYXRlWzBdID0gU0lSX01BQ19SQVRFXzY7CisgICAgICAgICAgICBwUGFyYW0tPmV4dGVuZGVkUmF0ZVNldC5yYXRlWzFdID0gU0lSX01BQ19SQVRFXzk7CisgICAgICAgICAgICBwUGFyYW0tPmV4dGVuZGVkUmF0ZVNldC5yYXRlWzJdID0gU0lSX01BQ19SQVRFXzEyOworICAgICAgICAgICAgcFBhcmFtLT5leHRlbmRlZFJhdGVTZXQucmF0ZVszXSA9IFNJUl9NQUNfUkFURV8xODsKKyAgICAgICAgICAgIHBQYXJhbS0+ZXh0ZW5kZWRSYXRlU2V0LnJhdGVbNF0gPSBTSVJfTUFDX1JBVEVfMjQ7CisgICAgICAgICAgICBwUGFyYW0tPmV4dGVuZGVkUmF0ZVNldC5yYXRlWzVdID0gU0lSX01BQ19SQVRFXzM2OworICAgICAgICAgICAgcFBhcmFtLT5leHRlbmRlZFJhdGVTZXQucmF0ZVs2XSA9IFNJUl9NQUNfUkFURV80ODsKKyAgICAgICAgICAgIHBQYXJhbS0+ZXh0ZW5kZWRSYXRlU2V0LnJhdGVbN10gPSBTSVJfTUFDX1JBVEVfNTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggZUNTUl9PUEVSQVRJTkdfQ0hBTk5FTF9BTlkgPT0gb3BlcmF0aW9uQ2hhbm5lbCApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBjc3JSb2FtR2V0SWJzc1N0YXJ0Q2hhbm5lbE51bWJlcjI0KCBwTWFjICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBvcGVyYXRpb25DaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICB9CisgICAgcFBhcmFtLT5vcGVyYXRpb25DaG4gPSBjaGFubmVsOworICAgIHBQYXJhbS0+c2lyTndUeXBlID0gbndUeXBlOworfQorCisKK3N0YXRpYyB2b2lkIGNzclJvYW1HZXRCc3NTdGFydFBhcm1zRnJvbUJzc0Rlc2MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JSb2FtU3RhcnRCc3NQYXJhbXMgKnBQYXJhbSApCit7CisgICAgCisgICAgaWYoIHBQYXJhbSApCisgICAgeworICAgICAgICBwUGFyYW0tPnNpck53VHlwZSA9IHBCc3NEZXNjLT5ud1R5cGU7CisgICAgICAgIHBQYXJhbS0+Y2JNb2RlID0gZUFOSV9DQl9TRUNPTkRBUllfTk9ORTsKKyAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25DaG4gPSBwQnNzRGVzYy0+Y2hhbm5lbElkOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAmcFBhcmFtLT5ic3NpZCwgcEJzc0Rlc2MtPmJzc0lkLCBzaXplb2YodENzckJzc2lkKSApOworICAgIAorICAgICAgICBpZiggcEllcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBJZXMtPlN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID0gcEllcy0+U3VwcFJhdGVzLm51bV9yYXRlczsKKyAgICAgICAgICAgICAgICBpZihwSWVzLT5TdXBwUmF0ZXMubnVtX3JhdGVzID4gU0lSX01BQ19SQVRFU0VUX0VJRF9NQVgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIm51bV9yYXRlcyA6JWQgaXMgbW9yZSB0aGFuIFNJUl9NQUNfUkFURVNFVF9FSURfTUFYLCByZXNldHRpbmcgdG8gU0lSX01BQ19SQVRFU0VUX0VJRF9NQVhcbiIpLAorICAgICAgICAgICAgICAgICAgICAgIHBJZXMtPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgICAgICAgICBwSWVzLT5TdXBwUmF0ZXMubnVtX3JhdGVzID0gU0lSX01BQ19SQVRFU0VUX0VJRF9NQVg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZSwgcEllcy0+U3VwcFJhdGVzLnJhdGVzLCAKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwSWVzLT5TdXBwUmF0ZXMucmF0ZXMpICogcEllcy0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggcEllcy0+U1NJRC5wcmVzZW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUGFyYW0tPnNzSWQubGVuZ3RoID0gcEllcy0+U1NJRC5udW1fc3NpZDsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBQYXJhbS0+c3NJZC5zc0lkLCBwSWVzLT5TU0lELnNzaWQsIHBQYXJhbS0+c3NJZC5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFBhcmFtLT5jYk1vZGUgPSBjc3JHZXRDQk1vZGVGcm9tSWVzKHBNYWMsIHBQYXJhbS0+b3BlcmF0aW9uQ2huLCBwSWVzKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFBhcmFtLT5zc0lkLmxlbmd0aCA9IDA7CisgICAgICAgICAgIHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBjc3JSb2FtRGV0ZXJtaW5lTWF4UmF0ZUZvckFkSG9jKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjUmF0ZVNldCAqcFNpclJhdGVTZXQgKQoreworICAgIHRBTklfVTggTWF4UmF0ZSA9IDA7CisgICAgdEFOSV9VMzIgaTsKKyAgICB0QU5JX1U4ICpwUmF0ZTsgICAgCisgICAKKyAgICBwUmF0ZSA9IHBTaXJSYXRlU2V0LT5yYXRlOworICAgIGZvciAoIGkgPSAwOyBpIDwgcFNpclJhdGVTZXQtPm51bVJhdGVzOyBpKysgKQorICAgIHsKKyAgICAgICAgTWF4UmF0ZSA9IENTUl9NQVgoIE1heFJhdGUsICggcFJhdGVbIGkgXSAmICh+Q1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSykgKSApOworICAgIH0KKyAgICAKKyAgICAvLyBTYXZlIHRoZSBtYXggcmF0ZSBpbiB0aGUgY29ubmVjdGVkIHN0YXRlIGluZm9ybWF0aW9uLi4uCisgICAgCisgICAgLy8gbW9kaWZ5IExhc3RSYXRlcyB2YXJpYWJsZSBhcyB3ZWxsCisgICAgCisgICAgcmV0dXJuOworfQorCisKKy8vdGhpcyBmdW5jdGlvbiBmaW5kcyBhIHZhbGlkIHNlY29uZGFyeSBjaGFubmVsIGZvciBjaGFubmVsIGJvbmRpbmcgd2l0aCAiY2hhbm5lbCIuCisvL1BhcmFtOiBjaGFubmVsIC0tIHByaW1hcnkgY2hhbm5lbCwgY2FsbGVyIG11c3QgdmFsaWRhdGUgaXQKKy8vICAgICAgIGNiQ2hvaWNlIC0tIENCIGRpcmVjdG9yeQorLy9SZXR1cm46IGlmIDAsIG5vIHNlY29uZGFyeSBjaGFubmVsIGlzIGZvdW5kLiBPdGhlcndpc2UgYSB2YWxpZCBzZWNvbmRhcnkgY2hhbm5lbC4KK3N0YXRpYyB0QU5JX1U4IGNzclJvYW1HZXRTZWNvbmRhcnlDaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY2hhbm5lbCwgZUNzckNCQ2hvaWNlIGNiQ2hvaWNlKQoreworICAgIHRBTklfVTggY2huVXAgPSAwLCBjaG5Eb3duID0gMCwgY2huUmV0ID0gMDsKKworICAgIHN3aXRjaCAoY2JDaG9pY2UpCisgICAgeworICAgIGNhc2UgZUNTUl9DQl9PRkY6CisgICAgICAgIGNoblVwID0gMDsKKyAgICAgICAgY2huRG93biA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNTUl9DQl9ET1dOOgorICAgICAgICBjaG5VcCA9IDA7CisgICAgICAgIGNobkRvd24gPSBjaGFubmVsIC0gQ1NSX0NCX0NIQU5ORUxfR0FQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGVDU1JfQ0JfVVA6CisgICAgICAgIGNoblVwID0gY2hhbm5lbCArIENTUl9DQl9DSEFOTkVMX0dBUDsKKyAgICAgICAgY2huRG93biA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNTUl9DQl9BVVRPOgorICAgIC8vY29uc2lkZXIgZXZlcnkgb3RoZXIgdmFsdWUgbWVhbnMgYXV0bworICAgIGRlZmF1bHQ6CisgICAgICAgIGNoblVwID0gY2hhbm5lbCArIENTUl9DQl9DSEFOTkVMX0dBUDsKKyAgICAgICAgY2huRG93biA9IGNoYW5uZWwgLSBDU1JfQ0JfQ0hBTk5FTF9HQVA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vaWYgQ0JfVVAgb3IgYXV0bywgdHJ5IGNoYW5uZWwgdXAgZmlyc3QKKyAgICBpZihjaG5VcCAmJiBDU1JfSVNfU0FNRV9CQU5EX0NIQU5ORUxTKGNoblVwLCBjaGFubmVsKSAmJiBjc3JSb2FtSXNDaGFubmVsVmFsaWQocE1hYywgY2huVXApKQorICAgIHsKKyAgICAgICAgLy9mb3VuZCBhIHZhbGlkIHVwIGNoYW5uZWwgZm9yIGNoYW5uZWwgYm9uZGluZworICAgICAgICAvL2NoZWNrIHdoZXRoZXIgdGhlIGNlbnRlciBjaGFubmVsIGlzIHZhbGlkCisgICAgICAgIGlmKGNzclJvYW1Jc1ZhbGlkNDBNaHpDaGFubmVsKHBNYWMsIGNoYW5uZWwgKyBDU1JfQ0JfQ0VOVEVSX0NIQU5ORUxfT0ZGU0VUKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2huUmV0ID0gY2huVXA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoY2huUmV0ID09IDAgJiYgY2huRG93biAmJiBDU1JfSVNfU0FNRV9CQU5EX0NIQU5ORUxTKGNobkRvd24sIGNoYW5uZWwpICYmIGNzclJvYW1Jc0NoYW5uZWxWYWxpZChwTWFjLCBjaG5Eb3duKSkKKyAgICB7CisgICAgICAgIC8vZm91bmQgYSB2YWxpZCBkb3duIGNoYW5uZWwgZm9yIGNoYW5uZWwgYm9uZGluZworICAgICAgICBpZihjc3JSb2FtSXNWYWxpZDQwTWh6Q2hhbm5lbChwTWFjLCBjaGFubmVsIC0gQ1NSX0NCX0NFTlRFUl9DSEFOTkVMX09GRlNFVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoblJldCA9IGNobkRvd247CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2huUmV0OworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlU3RhcnRCc3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1TdGFydEJzc1BhcmFtcyAqcFBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsIHRBTklfVTMyIHJvYW1JZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIGVDc3JCYW5kIGVCYW5kOworCisgICAgLy8gU2V0IHRoZSByb2FtaW5nIHN1YnN0YXRlIHRvICdTdGFydCBCU1MgYXR0ZW1wdCcuLi4KKyAgICBjc3JSb2FtU3Vic3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTV9TVUJTVEFURV9TVEFSVF9CU1NfUkVRLCBzZXNzaW9uSWQgKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisgICAgLy9OZWVkIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSBuZWVkIHRvIGxvZyBXRFM/Pz8KKyAgICBpZiggQ1NSX0lTX0lCU1MoIHBQcm9maWxlICkgKQorICAgIHsKKyAgICAgICAgdm9zX2xvZ19pYnNzX3BrdF90eXBlICpwSWJzc0xvZzsKKworICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19BTExPQyhwSWJzc0xvZywgdm9zX2xvZ19pYnNzX3BrdF90eXBlLCBMT0dfV0xBTl9JQlNTX0MpOworICAgICAgICBpZihwSWJzc0xvZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEJzc0Rlc2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcElic3NMb2ctPmV2ZW50SWQgPSBXTEFOX0lCU1NfRVZFTlRfSk9JTl9JQlNTX1JFUTsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBJYnNzTG9nLT5ic3NpZCwgcEJzc0Rlc2MtPmJzc0lkLCA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSWJzc0xvZy0+ZXZlbnRJZCA9IFdMQU5fSUJTU19FVkVOVF9TVEFSVF9JQlNTX1JFUTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcElic3NMb2ctPnNzaWQsIHBQYXJhbS0+c3NJZC5zc0lkLAorICAgICAgICAgICAgICAgIHBQYXJhbS0+c3NJZC5sZW5ndGgpOworICAgICAgICAgICAgaWYocFByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSWJzc0xvZy0+Y2hhbm5lbFNldHRpbmcgPSBBVVRPX1BJQ0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcElic3NMb2ctPmNoYW5uZWxTZXR0aW5nID0gU1BFQ0lGSUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcElic3NMb2ctPm9wZXJhdGluZ0NoYW5uZWwgPSBwUGFyYW0tPm9wZXJhdGlvbkNobjsKKyAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfTE9HX1JFUE9SVChwSWJzc0xvZyk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorICAgIC8vUHV0IFJTTiBpbmZvcm1hdGlvbiBpbiBmb3IgU3RhcnRpbmcgQlNTCisgICAgcFBhcmFtLT5uUlNOSUVMZW5ndGggPSAodEFOSV9VMTYpcFByb2ZpbGUtPm5SU05SZXFJRUxlbmd0aDsKKyAgICBwUGFyYW0tPnBSU05JRSA9IHBQcm9maWxlLT5wUlNOUmVxSUU7CisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBwUGFyYW0tPnByaXZhY3kgICAgICAgICAgID0gcFByb2ZpbGUtPnByaXZhY3k7CisgICAgcFBhcmFtLT5md2RXUFNQQkNQcm9iZVJlcSA9IHBQcm9maWxlLT5md2RXUFNQQkNQcm9iZVJlcTsgICAKKyAgICBwUGFyYW0tPmF1dGhUeXBlICAgICAgICAgID0gcFByb2ZpbGUtPmNzcjgwMjExQXV0aFR5cGU7CisgICAgcFBhcmFtLT5iZWFjb25JbnRlcnZhbCAgICA9IHBQcm9maWxlLT5iZWFjb25JbnRlcnZhbDsKKyAgICBwUGFyYW0tPmR0aW1QZXJpb2QgICAgICAgID0gcFByb2ZpbGUtPmR0aW1QZXJpb2Q7CisgICAgcFBhcmFtLT5BcFVhcHNkRW5hYmxlICAgICA9IHBQcm9maWxlLT5BcFVhcHNkRW5hYmxlOworICAgIHBQYXJhbS0+c3NpZEhpZGRlbiAgICAgICAgPSBwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3RbMF0uc3NpZEhpZGRlbjsKKyAgICBpZiAoQ1NSX0lTX0lORlJBX0FQKHBQcm9maWxlKSYmIChwUGFyYW0tPm9wZXJhdGlvbkNobiAhPSAwKSkKKyAgICB7CisgICAgICAgIGlmIChjc3JJc1ZhbGlkQ2hhbm5lbChwTWFjLCBwUGFyYW0tPm9wZXJhdGlvbkNobikgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcFBhcmFtLT5vcGVyYXRpb25DaG4gPSBJTkZSQV9BUF9ERUZBVUxUX0NIQU5ORUw7ICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAKKyAgICB9CisKKyAgICBwUGFyYW0tPnByb3RFbmFibGVkICAgICA9IHBQcm9maWxlLT5wcm90RW5hYmxlZDsKKyAgICBwUGFyYW0tPm9ic3NQcm90RW5hYmxlZCA9IHBQcm9maWxlLT5vYnNzUHJvdEVuYWJsZWQ7CisgICAgcFBhcmFtLT5odF9wcm90ZWN0aW9uICAgPSBwUHJvZmlsZS0+Y2ZnX3Byb3RlY3Rpb247CisgICAgcFBhcmFtLT53cHNfc3RhdGUgICAgICAgPSBwUHJvZmlsZS0+d3BzX3N0YXRlOworI2VuZGlmCisgICAgCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgcFBhcmFtLT51Q2ZnRG90MTFNb2RlID0gY3NyUm9hbUdldFBoeU1vZGVCYW5kRm9yQnNzKHBNYWMsIHBQcm9maWxlLCBwUGFyYW0tPm9wZXJhdGlvbkNobiAvKiBwUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbCovLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZUJhbmQpOworI2Vsc2UKKyAgICBwUGFyYW0tPnVDZmdEb3QxMU1vZGUgPSBjc3JSb2FtR2V0UGh5TW9kZUJhbmRGb3JCc3MocE1hYywgKGVDc3JQaHlNb2RlKXBQcm9maWxlLT5waHlNb2RlLCBwUHJvZmlsZS0+b3BlcmF0aW9uQ2hhbm5lbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVCYW5kKTsKKyNlbmRpZgorICAgIHBQYXJhbS0+YnNzUGVyc29uYSA9IHBQcm9maWxlLT5jc3JQZXJzb25hOworICAgIC8vIFdoZW4gc3RhcnRpbmcgYW4gSUJTUywgc3RhcnQgb24gdGhlIGNoYW5uZWwgZnJvbSB0aGUgUHJvZmlsZS4KKyAgICBzdGF0dXMgPSBjc3JTZW5kTUJTdGFydEJzc1JlcU1zZyggcE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZS0+QlNTVHlwZSwgcFBhcmFtLCBwQnNzRGVzYyApOworCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK3N0YXRpYyB2b2lkIGNzclJvYW1QcmVwYXJlQnNzUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKyAgICB0QU5JX1U4IENoYW5uZWwsIFNlY29uZENobjsKKyAgICB0QW5pQ0JTZWNvbmRhcnlNb2RlIGNiTW9kZSA9IGVBTklfQ0JfU0VDT05EQVJZX05PTkU7CisgICAgZUNzckNCQ2hvaWNlIGNiQ2hvaWNlOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgaWYoIHBCc3NEZXNjICkKKyAgICB7CisgICAgICAgIGNzclJvYW1HZXRCc3NTdGFydFBhcm1zRnJvbUJzc0Rlc2MoIHBNYWMsIHBCc3NEZXNjLCBwSWVzLCAmcFNlc3Npb24tPmJzc1BhcmFtcyApOworICAgICAgICAvL1NpbmNlIGNzclJvYW1HZXRCc3NTdGFydFBhcm1zRnJvbUJzc0Rlc2MgZmlsbHMgaW4gdGhlIGJzc2lkIGZvciBwU2Vzc2lvbi0+YnNzUGFyYW1zCisgICAgICAgIC8vVGhlIGZvbGxvd2luZyBjb2RlIGhhcyB0byBiZSBkbyBhZnRlciB0aGF0LgorICAgICAgICAvL0ZvciBXRFMgc3RhdGlvbiwgdXNlIHNlbGZNYWMgYXMgdGhlIHNlbGYgQlNTSUQKKyAgICAgICAgaWYoIENTUl9JU19XRFNfU1RBKCBwUHJvZmlsZSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcFNlc3Npb24tPmJzc1BhcmFtcy5ic3NpZCwgJnBTZXNzaW9uLT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNzclJvYW1HZXRCc3NTdGFydFBhcm1zKHBNYWMsIHBQcm9maWxlLCAmcFNlc3Npb24tPmJzc1BhcmFtcyk7CisKKyAgICAgICAgLy9Vc2UgdGhlIGZpcnN0IFNTSUQKKyAgICAgICAgaWYocFByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBTZXNzaW9uLT5ic3NQYXJhbXMuc3NJZCwgcFByb2ZpbGUtPlNTSURzLlNTSURMaXN0LCBzaXplb2YodFNpck1hY1NTaWQpKTsKKyAgICAgICAgfQorICAgICAgICAvL0ZvciBXRFMgc3RhdGlvbiwgdXNlIHNlbGZNYWMgYXMgdGhlIHNlbGYgQlNTSUQKKyAgICAgICAgaWYoIENTUl9JU19XRFNfU1RBKCBwUHJvZmlsZSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcFNlc3Npb24tPmJzc1BhcmFtcy5ic3NpZCwgJnBTZXNzaW9uLT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgICAgICB9CisgICAgICAgIC8vVXNlIHRoZSBmaXJzdCBCU1NJRAorICAgICAgICBlbHNlIGlmKCBwUHJvZmlsZS0+QlNTSURzLm51bU9mQlNTSURzICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcFNlc3Npb24tPmJzc1BhcmFtcy5ic3NpZCwgcFByb2ZpbGUtPkJTU0lEcy5ic3NpZCwgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgJnBTZXNzaW9uLT5ic3NQYXJhbXMuYnNzaWQsIHNpemVvZih0Q3NyQnNzaWQpICk7CisgICAgICAgIH0KKyAgICB9CisgICAgQ2hhbm5lbCA9IHBTZXNzaW9uLT5ic3NQYXJhbXMub3BlcmF0aW9uQ2huOworCisgICAgLy9TZXQgb3BlcmF0aW5nIGNoYW5uZWwgaW4gcFByb2ZpbGUgd2hpY2ggd2lsbCBiZSB1c2VkIAorICAgIC8vaW4gY3NyUm9hbVNldEJzc0NvbmZpZ0NmZygpIHRvIGRldGVybWluZSBjaGFubmVsIGJvbmRpbmcKKyAgICAvL21vZGUgYW5kIHdpbGwgYmUgY29uZmlndXJlZCBpbiBDRkcgbGF0ZXIgCisgICAgcFByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWwgPSBDaGFubmVsOworICAgIAorICAgIGlmKENoYW5uZWwgPT0gMCkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiICAgQ1NSIGNhbm5vdCBmaW5kIGEgY2hhbm5lbCB0byBzdGFydCBJQlNTXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgCisgICAgICAgIGNzclJvYW1EZXRlcm1pbmVNYXhSYXRlRm9yQWRIb2MoIHBNYWMsICZwU2Vzc2lvbi0+YnNzUGFyYW1zLm9wZXJhdGlvbmFsUmF0ZVNldCApOworCisgICAgICAgIGlmKCBDU1JfSVNfU1RBUlRfSUJTUyggcFByb2ZpbGUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgLy9UQkg6IGNoYW5uZWwgYm9uZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBMaWJyYQorICAgICAgICAgICAgaWYoIHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCAmJiBlQ1NSX09QRVJBVElOR19DSEFOTkVMX0FVVE8gIT0gcFByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0WzBdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGFubmVsID0gcFByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0WzBdOworICAgICAgICAgICAgICAgIGNiQ2hvaWNlID0gcFByb2ZpbGUtPkNCTW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNiQ2hvaWNlID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5jYkNob2ljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTZXNzaW9uLT5ic3NQYXJhbXMub3BlcmF0aW9uQ2huID0gQ2hhbm5lbDsKKyAgICAgICAgICAgIC8vbWFrZSBzdXJlIGNoYW5uZWwgaXMgdmFsaWQKKyAgICAgICAgICAgIGlmKCFjc3JSb2FtSXNDaGFubmVsVmFsaWQocE1hYywgQ2hhbm5lbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9zZXQgQ2hhbm5lbCB0byAwIHRvIGxldCBsaW0ga25vdyB0aGlzIGlzIGludmFsaWQKKyAgICAgICAgICAgICAgICAvL1dlIHN0aWxsIHNlbmQgdGhpcyByZXF1ZXN0IGRvd24gdG8gbGltIGV2ZW4gdGhvdWdoIHdlIGtub3cgdGhlIGNoYW5uZWwgaXMgd3JvbmcgYmVjYXVzZQorICAgICAgICAgICAgICAgIC8vbGltIHdpbGwgcmVzcG9uc2Ugd2l0aCBlcnJvciBhbmQgaGRkJ3MgZVdOSV9TTUVfU1RBUlRfQlNTX1JTUCBoYW5kbGVyIHdpbGwgcm9hbSBvdGhlciBwcm9maWxlIChpZiBhbnkpCisgICAgICAgICAgICAgICAgQ2hhbm5lbCA9IDA7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmJzc1BhcmFtcy5vcGVyYXRpb25DaG4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdEFOSV9VMzIgQ2hhbm5lbEJvbmRpbmdNb2RlOworCisgICAgICAgICAgICAgICAgaWYoQ1NSX0lTX0NIQU5ORUxfMjRHSFooQ2hhbm5lbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDaGFubmVsQm9uZGluZ01vZGUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNoYW5uZWxCb25kaW5nTW9kZTI0R0h6OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDaGFubmVsQm9uZGluZ01vZGUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNoYW5uZWxCb25kaW5nTW9kZTVHSHo7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9ub3cgd2UgaGF2ZSBhIHZhbGlkIGNoYW5uZWwKKyAgICAgICAgICAgICAgICBpZihXTklfQ0ZHX0NIQU5ORUxfQk9ORElOR19NT0RFX0RJU0FCTEUgIT0gQ2hhbm5lbEJvbmRpbmdNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9sZXQncyBwaWNrIGEgc2Vjb25kYXJkIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgU2Vjb25kQ2huID0gY3NyUm9hbUdldFNlY29uZGFyeUNoYW5uZWwocE1hYywgQ2hhbm5lbCwgY2JDaG9pY2UpOworCisgICAgICAgICAgICAgICAgICAgIGlmKFNlY29uZENobiA+IENoYW5uZWwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNiTW9kZSA9IGVBTklfQ0JfU0VDT05EQVJZX1VQOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoU2Vjb25kQ2huICYmIFNlY29uZENobiA8IENoYW5uZWwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNiTW9kZSA9ZUFOSV9DQl9TRUNPTkRBUllfRE9XTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNiTW9kZSA9IGVBTklfQ0JfU0VDT05EQVJZX05PTkU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmJzc1BhcmFtcy5jYk1vZGUgPSBjYk1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5ic3NQYXJhbXMuY2JNb2RlID0gZUFOSV9DQl9TRUNPTkRBUllfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCitzdGF0aWMgZUhhbFN0YXR1cyBjc3JSb2FtU3RhcnRJYnNzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9CT09MRUFOICpwZlNhbWVJYnNzICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdEFOSV9CT09MRUFOIGZTYW1lSWJzcyA9IEZBTFNFOworICAgICAKKyAgICBpZiAoIGNzcklzQ29ublN0YXRlSWJzcyggcE1hYywgc2Vzc2lvbklkICkgKSAKKyAgICB7IAorICAgICAgICAvLyBDaGVjayBpZiBhbnkgcHJvZmlsZSBwYXJhbWV0ZXIgaGFzIGNoYW5nZWQgPyBJZiBhbnkgcHJvZmlsZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8gaGFzIGNoYW5nZWQgdGhlbiBzdG9wIG9sZCBCU1MgYW5kIHN0YXJ0IGEgbmV3IG9uZSB3aXRoIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgIGlmICggY3NySXNTYW1lUHJvZmlsZSggcE1hYywgJnBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0ZWRQcm9maWxlLCBwUHJvZmlsZSApICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGZTYW1lSWJzcyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVTdG9wQnNzKCBwTWFjLCBzZXNzaW9uSWQsIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNDT05ORUNUX0NPTlRJTlVFX1JPQU1JTkcgKTsKKyAgICAgICAgfSAgICAgICAKKyAgICB9CisgICAgZWxzZSBpZiAoIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSW5mcmEoIHBNYWMsIHNlc3Npb25JZCApICkgCisgICAgeworICAgICAgICAvLyBEaXNhc3NvY2lhdGUgZnJvbSB0aGUgY29ubmVjdGVkIEluZnJhc3RydWN0dXJlIG5ldHdvcmsuLi4KKyAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlRGlzYXNzb2NpYXRlKCBwTWFjLCBzZXNzaW9uSWQsIGVDU1JfUk9BTV9TVUJTVEFURV9ESVNDT05ORUNUX0NPTlRJTlVFX1JPQU1JTkcsIEZBTFNFICk7CisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgICB0QnNzQ29uZmlnUGFyYW0gKnBCc3NDb25maWc7CisgICAgICAgIAorICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcEJzc0NvbmZpZywgc2l6ZW9mKHRCc3NDb25maWdQYXJhbSkpOyAKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcEJzc0NvbmZpZywgc2l6ZW9mKHRCc3NDb25maWdQYXJhbSkpOworICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gQnNzIGRlc2NyaXB0aW9uIGJlZm9yZSB3ZSBzdGFydCBhbiBJQlNTIHNvIHdlIG5lZWQgdG8gYWRvcHQKKyAgICAgICAgICAgIC8vIGFsbCBCc3MgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZyb20gdGhlIFByb2ZpbGUuCisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJlcGFyZUJzc0NvbmZpZ0Zyb21Qcm9maWxlKHBNYWMsIHBQcm9maWxlLCBwQnNzQ29uZmlnLCBOVUxMKTsKKyAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vc2F2ZSBkb3RNb2RlCisgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmJzc1BhcmFtcy51Q2ZnRG90MTFNb2RlID0gcEJzc0NvbmZpZy0+dUNmZ0RvdDExTW9kZTsKKyAgICAgICAgICAgICAgICAvL1ByZXBhcmUgc29tZSBtb3JlIHBhcmFtZXRlcnMgZm9yIHRoaXMgSUJTUworICAgICAgICAgICAgICAgIGNzclJvYW1QcmVwYXJlQnNzUGFyYW1zKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1TZXRCc3NDb25maWdDZmcocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgTlVMTCwgcEJzc0NvbmZpZywgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEJzc0NvbmZpZyk7CisgICAgICAgIH0vL0FsbG9jYXRlIG1lbW9yeQorICAgIH0KKyAgICAKKyAgICBpZihwZlNhbWVJYnNzKQorICAgIHsKKyAgICAgICAgKnBmU2FtZUlic3MgPSBmU2FtZUlic3M7CisgICAgfQorICAgIHJldHVybiggc3RhdHVzICk7Cit9CisKKworc3RhdGljIHZvaWQgY3NyUm9hbVVwZGF0ZUNvbm5lY3RlZFByb2ZpbGVGcm9tTmV3QnNzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyU21lTmV3QnNzSW5mbyAqcE5ld0JzcyApCit7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBpZiggcE5ld0JzcyApCisgICAgeworICAgICAgICAvLyBTZXQgdGhlIG9wZXJhdGluZyBjaGFubmVsLgorICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsID0gcE5ld0Jzcy0+Y2hhbm5lbE51bWJlcjsKKyAgICAgICAgLy8gbW92ZSB0aGUgQlNTSWQgZnJvbSB0aGUgQlNTIGRlc2NyaXB0aW9uIGludG8gdGhlIGNvbm5lY3RlZCBzdGF0ZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAmKHBOZXdCc3MtPmJzc0lkKSwgc2l6ZW9mKCB0Q3NyQnNzaWQgKSApOyAgICAKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCitlSGFsU3RhdHVzIGNzclJvYW1TZXRCS0lEQ2FjaGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEJraWRDYWNoZUluZm8gKnBCS0lEQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBudW1JdGVtcyApCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworICAgaWYoIUNTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSkKKyAgIHsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiAgSW52YWxpZCBzZXNzaW9uIElEXG4iKSk7CisgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKyAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyUm9hbVNldEJLSURDYWNoZSBjYWxsZWQsIG51bUl0ZW1zID0gJWRcbiIsIG51bUl0ZW1zKTsKKyAgIHBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgIGlmKG51bUl0ZW1zIDw9IENTUl9NQVhfQktJRF9BTExPV0VEKQorICAgeworICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgLy9udW1JdGVtcyBtYXkgYmUgMCB0byBjbGVhciB0aGUgY2FjaGUKKyAgICAgICBwU2Vzc2lvbi0+TnVtQmtpZENhY2hlID0gKHRBTklfVTE2KW51bUl0ZW1zOworICAgICAgIGlmKG51bUl0ZW1zICYmIHBCS0lEQ2FjaGUpCisgICAgICAgeworICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+QmtpZENhY2hlSW5mbywgcEJLSURDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0QmtpZENhY2hlSW5mbykgKiBudW1JdGVtcyApOworICAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCitlSGFsU3RhdHVzIGNzclJvYW1HZXRCS0lEQ2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0QU5JX1UzMiAqcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJraWRDYWNoZUluZm8gKnBCa2lkQ2FjaGUpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworICAgaWYoIUNTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSkKKyAgIHsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiAgSW52YWxpZCBzZXNzaW9uIElEXG4iKSk7CisgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgaWYocE51bSAmJiBwQmtpZENhY2hlKQorICAgeworICAgICAgIGlmKHBTZXNzaW9uLT5OdW1Ca2lkQ2FjaGUgPT0gMCkKKyAgICAgICB7CisgICAgICAgICAgICpwTnVtID0gMDsKKyAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICB9CisgICAgICAgZWxzZSBpZigqcE51bSA+PSBwU2Vzc2lvbi0+TnVtQmtpZENhY2hlKQorICAgICAgIHsKKyAgICAgICAgICAgaWYocFNlc3Npb24tPk51bUJraWRDYWNoZSA+IENTUl9NQVhfUE1LSURfQUxMT1dFRCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJOdW1QbWtpZENhY2hlIDolZCBpcyBtb3JlIHRoYW4gQ1NSX01BWF9QTUtJRF9BTExPV0VELCByZXNldHRpbmcgdG8gQ1NSX01BWF9QTUtJRF9BTExPV0VEXG4iKSwKKyAgICAgICAgICAgICAgICAgcFNlc3Npb24tPk51bUJraWRDYWNoZSk7CisgICAgICAgICAgICAgICBwU2Vzc2lvbi0+TnVtQmtpZENhY2hlID0gQ1NSX01BWF9QTUtJRF9BTExPV0VEOworICAgICAgICAgICB9CisgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCa2lkQ2FjaGUsIHBTZXNzaW9uLT5Ca2lkQ2FjaGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRCa2lkQ2FjaGVJbmZvKSAqIHBTZXNzaW9uLT5OdW1Ca2lkQ2FjaGUgKTsKKyAgICAgICAgICAgKnBOdW0gPSBwU2Vzc2lvbi0+TnVtQmtpZENhY2hlOworICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworCit9CisKK3RBTklfVTMyIGNzclJvYW1HZXROdW1CS0lEQ2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgcmV0dXJuIChwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uTnVtQmtpZENhY2hlKTsKKworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKK2VIYWxTdGF0dXMgY3NyUm9hbVNldFBNS0lEQ2FjaGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQbWtpZENhY2hlSW5mbyAqcFBNS0lEQ2FjaGUsIHRBTklfVTMyIG51bUl0ZW1zICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtU2V0UE1LSURDYWNoZSBjYWxsZWQsIG51bUl0ZW1zID0gJWRcbiIsIG51bUl0ZW1zKTsKKyAgICBpZihudW1JdGVtcyA8PSBDU1JfTUFYX1BNS0lEX0FMTE9XRUQpCisgICAgeworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisgICAgICAgIHsKKyAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfREVGKHNlY0V2ZW50LCB2b3NfZXZlbnRfd2xhbl9zZWN1cml0eV9wYXlsb2FkX3R5cGUpOworICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmc2VjRXZlbnQsIHNpemVvZih2b3NfZXZlbnRfd2xhbl9zZWN1cml0eV9wYXlsb2FkX3R5cGUpKTsKKyAgICAgICAgICAgIHNlY0V2ZW50LmV2ZW50SWQgPSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1BNS0lEX1VQREFURTsKKyAgICAgICAgICAgIHNlY0V2ZW50LmVuY3J5cHRpb25Nb2RlTXVsdGljYXN0ID0gCisgICAgICAgICAgICAgICAgKHZfVThfdClkaWFnRW5jVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm1jRW5jcnlwdGlvblR5cGUpOworICAgICAgICAgICAgc2VjRXZlbnQuZW5jcnlwdGlvbk1vZGVVbmljYXN0ID0gCisgICAgICAgICAgICAgICAgKHZfVThfdClkaWFnRW5jVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlKTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHNlY0V2ZW50LmJzc2lkLCBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCwgNiApOworICAgICAgICAgICAgc2VjRXZlbnQuYXV0aE1vZGUgPSAKKyAgICAgICAgICAgICAgICAodl9VOF90KWRpYWdBdXRoVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkF1dGhUeXBlKTsKKyAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZzZWNFdmVudCwgRVZFTlRfV0xBTl9TRUNVUklUWSk7CisgICAgICAgIH0KKyNlbmRpZi8vRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKworICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAvL251bUl0ZW1zIG1heSBiZSAwIHRvIGNsZWFyIHRoZSBjYWNoZQorICAgICAgICBwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZSA9ICh0QU5JX1UxNiludW1JdGVtczsKKyAgICAgICAgaWYobnVtSXRlbXMgJiYgcFBNS0lEQ2FjaGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5QbWtpZENhY2hlSW5mbywgcFBNS0lEQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRQbWtpZENhY2hlSW5mbykgKiBudW1JdGVtcyApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK3RBTklfVTMyIGNzclJvYW1HZXROdW1QTUtJRENhY2hlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCkKK3sKKyAgICByZXR1cm4gKHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5OdW1QbWtpZENhY2hlKTsKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1HZXRQTUtJRENhY2hlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9VMzIgKnBOdW0sIHRQbWtpZENhY2hlSW5mbyAqcFBta2lkQ2FjaGUpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKworICAgIGlmKHBOdW0gJiYgcFBta2lkQ2FjaGUpCisgICAgeworICAgICAgICBpZihwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAqcE51bSA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKnBOdW0gPj0gcFNlc3Npb24tPk51bVBta2lkQ2FjaGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5OdW1QbWtpZENhY2hlID4gQ1NSX01BWF9QTUtJRF9BTExPV0VEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiTnVtUG1raWRDYWNoZSA6JWQgaXMgbW9yZSB0aGFuIENTUl9NQVhfUE1LSURfQUxMT1dFRCwgcmVzZXR0aW5nIHRvIENTUl9NQVhfUE1LSURfQUxMT1dFRFxuIiksCisgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+TnVtUG1raWRDYWNoZSk7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPk51bVBta2lkQ2FjaGUgPSBDU1JfTUFYX1BNS0lEX0FMTE9XRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwUG1raWRDYWNoZSwgcFNlc3Npb24tPlBta2lkQ2FjaGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0UG1raWRDYWNoZUluZm8pICogcFNlc3Npb24tPk51bVBta2lkQ2FjaGUgKTsKKyAgICAgICAgICAgICpwTnVtID0gcFNlc3Npb24tPk51bVBta2lkQ2FjaGU7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbUdldFdwYVJzblJlcUlFKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9VMzIgKnBMZW4sIHRBTklfVTggKnBCdWYpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB0QU5JX1UzMiBsZW47CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBpZihwTGVuKQorICAgIHsKKyAgICAgICAgbGVuID0gKnBMZW47CisgICAgICAgICpwTGVuID0gcFNlc3Npb24tPm5XcGFSc25SZXFJZUxlbmd0aDsKKyAgICAgICAgaWYocEJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYobGVuID49IHBTZXNzaW9uLT5uV3BhUnNuUmVxSWVMZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwQnVmLCBwU2Vzc2lvbi0+cFdwYVJzblJlcUlFLCBwU2Vzc2lvbi0+bldwYVJzblJlcUllTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzclJvYW1HZXRXcGFSc25Sc3BJRSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRBTklfVTMyICpwTGVuLCB0QU5JX1U4ICpwQnVmKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgdEFOSV9VMzIgbGVuOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgaWYocExlbikKKyAgICB7CisgICAgICAgIGxlbiA9ICpwTGVuOworICAgICAgICAqcExlbiA9IHBTZXNzaW9uLT5uV3BhUnNuUnNwSWVMZW5ndGg7CisgICAgICAgIGlmKHBCdWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGxlbiA+PSBwU2Vzc2lvbi0+bldwYVJzblJzcEllTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcEJ1ZiwgcFNlc3Npb24tPnBXcGFSc25Sc3BJRSwgcFNlc3Npb24tPm5XcGFSc25Sc3BJZUxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorZUhhbFN0YXR1cyBjc3JSb2FtR2V0V2FwaVJlcUlFKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9VMzIgKnBMZW4sIHRBTklfVTggKnBCdWYpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB0QU5JX1UzMiBsZW47CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgaWYocExlbikKKyAgICB7CisgICAgICAgIGxlbiA9ICpwTGVuOworICAgICAgICAqcExlbiA9IHBTZXNzaW9uLT5uV2FwaVJlcUllTGVuZ3RoOworICAgICAgICBpZihwQnVmKQorICAgICAgICB7CisgICAgICAgICAgICBpZihsZW4gPj0gcFNlc3Npb24tPm5XYXBpUmVxSWVMZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwQnVmLCBwU2Vzc2lvbi0+cFdhcGlSZXFJRSwgcFNlc3Npb24tPm5XYXBpUmVxSWVMZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCitlSGFsU3RhdHVzIGNzclJvYW1HZXRXYXBpUnNwSUUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0QU5JX1UzMiAqcExlbiwgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgIHRBTklfVTMyIGxlbjsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKworICAgIGlmKHBMZW4pCisgICAgeworICAgICAgICBsZW4gPSAqcExlbjsKKyAgICAgICAgKnBMZW4gPSBwU2Vzc2lvbi0+bldhcGlSc3BJZUxlbmd0aDsKKyAgICAgICAgaWYocEJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYobGVuID49IHBTZXNzaW9uLT5uV2FwaVJzcEllTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcEJ1ZiwgcFNlc3Npb24tPnBXYXBpUnNwSUUsIHBTZXNzaW9uLT5uV2FwaVJzcEllTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCitlUm9hbUNtZFN0YXR1cyBjc3JHZXRSb2FtQ29tcGxldGVTdGF0dXModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIGVSb2FtQ21kU3RhdHVzIHJldFN0YXR1cyA9IGVDU1JfUk9BTV9DT05ORUNUX0NPTVBMRVRJT047CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBpZihDU1JfSVNfUk9BTUlORyhwU2Vzc2lvbikpCisgICAgeworICAgICAgICByZXRTdGF0dXMgPSBlQ1NSX1JPQU1fUk9BTUlOR19DT01QTEVUSU9OOworICAgICAgICBwU2Vzc2lvbi0+ZlJvYW1pbmcgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIChyZXRTdGF0dXMpOworfQorCisKKy8vVGhpcyBmdW5jdGlvbiByZW1vdmUgdGhlIGNvbm5lY3RlZCBCU1MgZnJvbSB0ZSBjYWNoZWQgc2NhbiByZXN1bHQKK2VIYWxTdGF0dXMgY3NyUm9hbVJlbW92ZUNvbm5lY3RlZEJzc0Zyb21TY2FuQ2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwQ29ublByb2ZpbGUpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwU2NhbkZpbHRlciA9IE5VTEw7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdENzclNjYW5SZXN1bHQgKnBSZXN1bHQ7CisgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXM7CisgICAgdEFOSV9CT09MRUFOIGZNYXRjaDsKKworICAgIGlmKCEoY3NySXNNYWNBZGRyZXNzWmVybyhwTWFjLCAmcENvbm5Qcm9maWxlLT5ic3NpZCkgfHwKKyAgICAgICAgICAgIGNzcklzTWFjQWRkcmVzc0Jyb2FkY2FzdChwTWFjLCAmcENvbm5Qcm9maWxlLT5ic3NpZCkpKQorICAgIHsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgLy9QcmVwYXJlIHRoZSBmaWx0ZXIuIE9ubHkgZmlsbCBpbiB0aGUgbmVjZXNzYXJ5IGZpZWxkcy4gTm90IGFsbCBmaWVsZHMgYXJlIG5lZWRlZAorICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgYnJlYWs7CisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2NhbkZpbHRlci0+QlNTSURzLmJzc2lkLCBzaXplb2YodENzckJzc2lkKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIGJyZWFrOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlci0+QlNTSURzLmJzc2lkLCAmcENvbm5Qcm9maWxlLT5ic3NpZCwgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgICAgICAgICAgcFNjYW5GaWx0ZXItPkJTU0lEcy5udW1PZkJTU0lEcyA9IDE7CisgICAgICAgICAgICBpZighY3NySXNOVUxMU1NJRChwQ29ublByb2ZpbGUtPlNTSUQuc3NJZCwgcENvbm5Qcm9maWxlLT5TU0lELmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdCwgc2l6ZW9mKHRDc3JTU0lESW5mbykpOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0WzBdLlNTSUQsICZwQ29ublByb2ZpbGUtPlNTSUQsIHNpemVvZih0U2lyTWFjU1NpZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNjYW5GaWx0ZXItPmF1dGhUeXBlLm51bUVudHJpZXMgPSAxOworICAgICAgICAgICAgcFNjYW5GaWx0ZXItPmF1dGhUeXBlLmF1dGhUeXBlWzBdID0gcENvbm5Qcm9maWxlLT5BdXRoVHlwZTsKKyAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5CU1NUeXBlID0gcENvbm5Qcm9maWxlLT5CU1NUeXBlOworICAgICAgICAgICAgcFNjYW5GaWx0ZXItPkVuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworICAgICAgICAgICAgcFNjYW5GaWx0ZXItPkVuY3J5cHRpb25UeXBlLmVuY3J5cHRpb25UeXBlWzBdID0gcENvbm5Qcm9maWxlLT5FbmNyeXB0aW9uVHlwZTsKKyAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5tY0VuY3J5cHRpb25UeXBlLm51bUVudHJpZXMgPSAxOworICAgICAgICAgICAgcFNjYW5GaWx0ZXItPm1jRW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBwQ29ublByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGU7CisgICAgICAgICAgICAvL1dlIGlnbm9yZSB0aGUgY2hhbm5lbCBmb3Igbm93LCBCU1NJRCBzaG91bGQgYmUgZW5vdWdoCisgICAgICAgICAgICBwU2NhbkZpbHRlci0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDA7CisgICAgICAgICAgICAvL0Fsc28gaWdub3JlIHRoZSBmb2xsb3dpbmcgZmllbGRzCisgICAgICAgICAgICBwU2NhbkZpbHRlci0+dWFwc2RfbWFzayA9IDA7CisgICAgICAgICAgICBwU2NhbkZpbHRlci0+YldQU0Fzc29jaWF0aW9uID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgcFNjYW5GaWx0ZXItPmNvdW50cnlDb2RlWzBdID0gMDsKKyAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5waHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFX1RBVVJVUzsKKworICAgICAgICAgICAgY3NyTExMb2NrKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0KTsKKyAgICAgICAgICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLICk7CisgICAgICAgICAgICB3aGlsZSggcEVudHJ5ICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFJlc3VsdCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmsgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllcyA9ICh0RG90MTFmQmVhY29uSUVzICopKCBwUmVzdWx0LT5SZXN1bHQucHZJZXMgKTsKKyAgICAgICAgICAgICAgICBmTWF0Y2ggPSBjc3JNYXRjaEJTUyhwTWFjLCAmcFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuRmlsdGVyLCBOVUxMLCBOVUxMLCBOVUxMLCAmcEllcyk7CisgICAgICAgICAgICAgICAgLy9SZWxlYXNlIHRoZSBJRXMgYWxsb2NhdGVkIGJ5IGNzck1hdGNoQlNTIGlzIG5lZWRlZAorICAgICAgICAgICAgICAgIGlmKCAhcFJlc3VsdC0+UmVzdWx0LnB2SWVzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vbmVlZCB0byBmcmVlIHRoZSBJRXMgc2luY2UgaXQgaXMgYWxsb2NhdGVkIGJ5IGNzck1hdGNoQlNTCisgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEllcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGZNYXRjaCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vV2UgZm91bmQgdGhlIG9uZQorICAgICAgICAgICAgICAgICAgICBpZiggY3NyTExSZW1vdmVFbnRyeSgmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vRnJlZSB0aGUgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICBjc3JGcmVlU2NhblJlc3VsdEVudHJ5KCBwTWFjLCBwUmVzdWx0ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBFbnRyeSA9IGNzckxMTmV4dCgmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgICAgIH0vL3doaWxlCisgICAgICAgICAgICBjc3JMTFVubG9jaygmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisgICAgICAgIH13aGlsZSgwKTsKKyAgICAgICAgaWYocFNjYW5GaWx0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzckZyZWVTY2FuRmlsdGVyKHBNYWMsIHBTY2FuRmlsdGVyKTsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5GaWx0ZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisKKy8vQlQtQU1QCisKK2VIYWxTdGF0dXMgY3NySXNCVEFNUEFsbG93ZWQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGNobklkICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkOworCisgICAgZm9yKCBzZXNzaW9uSWQgPSAwOyBzZXNzaW9uSWQgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgc2Vzc2lvbklkKysgKQorICAgIHsKKyAgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjc3JJc0Nvbm5TdGF0ZUlic3MoIHBNYWMsIHNlc3Npb25JZCApIHx8IGNzcklzQlRBTVAoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2NvLWV4aXN0IHdpdGggSUJTUyBvciBCVC1BTVAgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIiBCVEFNUCBpcyBub3QgYWxsb3dlZCBkdWUgdG8gSUJTUy9CVC1BTVAgZXhpc3QgaW4gc2Vzc2lvbiAlZFxuIiwgc2Vzc2lvbklkICk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfQ1NSX1dST05HX1NUQVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIGNzcklzQ29ublN0YXRlSW5mcmEoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggY2huSWQgJiYgCisgICAgICAgICAgICAgICAgICAgICggKHRBTklfVTgpY2huSWQgIT0gcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGUub3BlcmF0aW9uQ2hhbm5lbCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIiBCVEFNUCBpcyBub3QgYWxsb3dlZCBkdWUgdG8gY2hhbm5lbCAoJWQpIGRpZmYgdGhhbiBpbmZyIGNoYW5uZWwgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNobklkLCBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsICk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0NTUl9XUk9OR19TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKKworc3RhdGljIGVIYWxTdGF0dXMgY3NyUm9hbVN0YXJ0V2RzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICB0QnNzQ29uZmlnUGFyYW0gYnNzQ29uZmlnOworCisgICAgaWYgKCBjc3JJc0Nvbm5TdGF0ZUlic3MoIHBNYWMsIHNlc3Npb25JZCApICkgCisgICAgeyAKKyAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlU3RvcEJzcyggcE1hYywgc2Vzc2lvbklkLCBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQ09OTkVDVF9DT05USU5VRV9ST0FNSU5HICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZEluZnJhKCBwTWFjLCBzZXNzaW9uSWQgKSApIAorICAgIHsKKyAgICAgICAgLy8gRGlzYXNzb2NpYXRlIGZyb20gdGhlIGNvbm5lY3RlZCBJbmZyYXN0cnVjdHVyZSBuZXR3b3JrLi4uCisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZURpc2Fzc29jaWF0ZSggcE1hYywgc2Vzc2lvbklkLCBlQ1NSX1JPQU1fU1VCU1RBVEVfRElTQ09OTkVDVF9DT05USU5VRV9ST0FNSU5HLCBGQUxTRSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmIGRlZmluZWQoVk9TU19FTkFCTEVEKQorICAgICAgICAvL1dlIGRvbid0IGV4cGVjdCBCdC1BTVAgSEREIG5vdCB0byBkaXNjb25uZWN0IHRoZSBsYXN0IGNvbm5lY3Rpb24gZmlyc3QgYXQgdGhpcyB0aW1lLiAKKyAgICAgICAgLy9PdGhlcndpc2Ugd2UgbmVlZCB0byBhZGQgY29kZSB0byBoYW5kbGUgdGhlCisgICAgICAgIC8vc2l0dWF0aW9uIGp1c3QgbGlrZSBJQlNTLiBUaG91Z2ggZm9yIFdEUyBzdGF0aW9uLCB3ZSBuZWVkIHRvIHNlbmQgZGlzYXNzb2MgdG8gUEUgZmlyc3QgdGhlbiAKKyAgICAgICAgLy9zZW5kIHN0b3BfYnNzIHRvIFBFLCBiZWZvcmUgd2UgY2FuIGNvbnRpbnVlLgorICAgICAgICBWT1NfQVNTRVJUKCAhY3NySXNDb25uU3RhdGVXZHMoIHBNYWMsIHNlc3Npb25JZCApICk7CisjZW5kaWYKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmYnNzQ29uZmlnLCBzaXplb2YodEJzc0NvbmZpZ1BhcmFtKSk7CisgICAgICAgIC8qIEFzc3VtZSBIREQgcHJvdmlkZSBic3NpZCBpbiBwcm9maWxlICovCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICZwU2Vzc2lvbi0+YnNzUGFyYW1zLmJzc2lkLCBwUHJvZmlsZS0+QlNTSURzLmJzc2lkWzBdLCBzaXplb2YodENzckJzc2lkKSApOworICAgICAgICAvLyB0aGVyZSBpcyBubyBCc3MgZGVzY3JpcHRpb24gYmVmb3JlIHdlIHN0YXJ0IGFuIFdEUyBzbyB3ZSBuZWVkCisgICAgICAgIC8vIHRvIGFkb3B0IGFsbCBCc3MgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZyb20gdGhlIFByb2ZpbGUuCisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1QcmVwYXJlQnNzQ29uZmlnRnJvbVByb2ZpbGUocE1hYywgcFByb2ZpbGUsICZic3NDb25maWcsIHBCc3NEZXNjKTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2F2ZSBwcm9maWxlIGZvciBsYXRlIHVzZQorICAgICAgICAgICAgY3NyRnJlZVJvYW1Qcm9maWxlKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAgICAgICAgIGlmIChIQUxfU1RBVFVTX1NVQ0NFU1MocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodENzclJvYW1Qcm9maWxlKSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSwgc2l6ZW9mKHRDc3JSb2FtUHJvZmlsZSkpOworICAgICAgICAgICAgICAgIGNzclJvYW1Db3B5UHJvZmlsZShwTWFjLCBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLCBwUHJvZmlsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vUHJlcGFyZSBzb21lIG1vcmUgcGFyYW1ldGVycyBmb3IgdGhpcyBXRFMKKyAgICAgICAgICAgIGNzclJvYW1QcmVwYXJlQnNzUGFyYW1zKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbVNldEJzc0NvbmZpZ0NmZyhwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCBOVUxMLCAmYnNzQ29uZmlnLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vTWFpbCBib3gKKworCisvL3BCdWYgaXMgY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgcG9pbnQgdG8gJih0U2lyU21lSm9pblJlcS0+cnNuSUUucnNuSUVkYXRhWyAwIF0pICsgcE1zZy0+cnNuSUUubGVuZ3RoOworLy9vciAmKHRTaXJTbWVSZWFzc29jUmVxLT5yc25JRS5yc25JRWRhdGFbIDAgXSkgKyBwTXNnLT5yc25JRS5sZW5ndGg7CitzdGF0aWMgdm9pZCBjc3JQcmVwYXJlSm9pblJlYXNzb2NSZXFCdWZmZXIoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjcmlwdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsIHRBTklfVTggdWFwc2RNYXNrKQoreworICAgIHRDc3JDaGFubmVsU2V0IGNoYW5uZWxHcm91cDsKKyAgICB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gKnBBUF9jYXBhYmlsaXR5SW5mbzsKKyAgICB0QW5pQm9vbCBmVG1wOworICAgIHRBTklfQk9PTEVBTiBmb3VuZCA9IEZBTFNFOworICAgIHRBTklfVTMyIHNpemUgPSAwOworICAgICAgICB0QU5JX1UxNiBpOworCisgICAgLy8gcGx1ZyBpbiBuZWlnaGJvcmhvb2Qgb2NjdXBhbmN5IGluZm8gKGkuZS4gQlNTZXMgb24gcHJpbWFyeSBvciBzZWNvbmRhcnkgY2hhbm5lbHMpCisgICAgKnBCdWYrKyA9ICh0QU5JX1U4KUZBTFNFOyAgLy90QW5pVGl0YW5DQk5laWdoYm9ySW5mby0+Y2JCc3NGb3VuZFByaQorICAgICpwQnVmKysgPSAodEFOSV9VOClGQUxTRTsgIC8vdEFuaVRpdGFuQ0JOZWlnaGJvckluZm8tPmNiQnNzRm91bmRTZWNEb3duCisgICAgKnBCdWYrKyA9ICh0QU5JX1U4KUZBTFNFOyAgLy90QW5pVGl0YW5DQk5laWdoYm9ySW5mby0+Y2JCc3NGb3VuZFNlY1VwCisKKyAgICAvLyA4MDIuMTFoCisgICAgLy9XZSBjYW4gZG8gdGhpcyBiZWNhdXNlIGl0IGlzIGluIEhPU1QgQ1BVIG9yZGVyIGZvciBub3cuCisgICAgcEFQX2NhcGFiaWxpdHlJbmZvID0gKHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqKSZwQnNzRGVzY3JpcHRpb24tPmNhcGFiaWxpdHlJbmZvOworCisgICAgICAgIC8vdGVsbCB0aGUgdGFyZ2V0IEFQIG15IDExSCBjYXBhYmlsaXR5IG9ubHkgaWYgYm90aCBBUCBhbmQgU1RBIHN1cHBvcnQgMTFIIGFuZCB0aGUgY2hhbm5lbCBiZWluZyB1c2VkIGlzIDExYQorICAgICAgICBpZiAoIGNzcklzMTFoU3VwcG9ydGVkKCBwTWFjICkgJiYgcEFQX2NhcGFiaWxpdHlJbmZvLT5zcGVjdHJ1bU1ndCAmJiBlU0lSXzExQV9OV19UWVBFID09IHBCc3NEZXNjcmlwdGlvbi0+bndUeXBlICkgICAKKyAgICAgICAgeyAgCisgICAgICAgIGZUbXAgPSAodEFuaUJvb2wpcGFsX2NwdV90b19iZTMyKDEpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGZUbXAgPSAodEFuaUJvb2wpMDsKKyAgIAorICAgIC8vIGNvcnJlc3BvbmRzIHRvIC0tLSBwTXNnLT5zcGVjdHJ1bU1ndEluZGljYXRvciA9IE9OOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICh0QU5JX1U4ICopJmZUbXAsIHNpemVvZih0QW5pQm9vbCkgKTsKKyAgICBwQnVmICs9IHNpemVvZih0QW5pQm9vbCk7CisgICAgKnBCdWYrKyA9IE1JTl9TVEFfUFdSX0NBUF9EQk07IC8vIGl0IGlzIGZvciBwTXNnLT5wb3dlckNhcC5taW5UeFBvd2VyID0gMDsKKyAgICAgICAgZm91bmQgPSBjc3JTZWFyY2hDaGFubmVsTGlzdEZvclR4UG93ZXIocE1hYywgcEJzc0Rlc2NyaXB0aW9uLCAmY2hhbm5lbEdyb3VwKTsKKworICAgIC8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIDExayB0ZXN0IFZvV2lGaSBFbnQ6IFRlc3QgMi4KKyAgICAvLyBXZSBuZWVkIHRoZSBwb3dlciBjYXBhYmlsaXRpZXMgZm9yIEFzc29jIFJlcS4gCisgICAgLy8gVGhpcyBtYWNybyBpcyBwcm92aWRlZCBieSB0aGUgaGFsUGh5Q2ZnLmguIFdlIHBpY2sgb3VyCisgICAgLy8gbWF4IGFuZCBtaW4gY2FwYWJpbGl0eSBieSB0aGUgaGFsUGh5IHByb3ZpZGVkIG1hY3JvcworICAgICpwQnVmKysgPSBNQVhfU1RBX1BXUl9DQVBfREJNOworCisgICAgc2l6ZSA9IHNpemVvZihwTWFjLT5yb2FtLnZhbGlkQ2hhbm5lbExpc3QpOworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRDZmdWYWxpZENoYW5uZWxzKHBNYWMsICh0QU5JX1U4ICopcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCAmc2l6ZSkpKQorICAgIHsgCisgICAgICAgICpwQnVmKysgPSAodEFOSV9VOClzaXplOyAgICAgICAgLy90U2lyU3VwQ2hubC0+bnVtQ2hubCAgICAgICAgCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSAKKyAgICAgICAgeworICAgICAgICAgICAgKnBCdWYrKyA9IHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdFsgaSBdOyAgIC8vdFNpclN1cENobmwtPmNoYW5uZWxMaXN0WyBpIF0KKyAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNhbiBub3QgZmluZCBhbnkgdmFsaWQgY2hhbm5lbFxuIikpOworICAgICAgICAqcEJ1ZisrID0gMDsgIC8vdFNpclN1cENobmwtPm51bUNobmwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAvL0NoZWNrIHdoZXRoZXIgaXQgaXMgb2sgdG8gZW50ZXIgVUFQU0QKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgaWYoIGJ0Y0lzUmVhZHlGb3JVYXBzZChwTWFjKSApCisjZW5kaWYgLyogV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUKi8KKyAgICB7CisgICAgICAgKnBCdWYrKyA9IHVhcHNkTWFzazsKKyAgICB9CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIEJUQyBkb2Vzbid0IGFsbG93IFVBUFNEIGZvciB1YXBzZF9tYXNrKDB4JVgpXG4iKSwgdWFwc2RNYXNrKTsKKyAgICAgICAgKnBCdWYrKyA9IDA7CisgICAgfQorI2VuZGlmIC8qIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVCovCisgIAorCisgICAgLy8gbW92ZSB0aGUgZW50aXJlIEJzc0Rlc2NyaXB0aW9uIGludG8gdGhlIGpvaW4gcmVxdWVzdC4KKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBwQnNzRGVzY3JpcHRpb24sIAorICAgICAgICAgICAgICAgICAgICBwQnNzRGVzY3JpcHRpb24tPmxlbmd0aCArIHNpemVvZiggcEJzc0Rlc2NyaXB0aW9uLT5sZW5ndGggKSApOworCisgICAgcEJ1ZiArPSBwQnNzRGVzY3JpcHRpb24tPmxlbmd0aCArIHNpemVvZiggcEJzc0Rlc2NyaXB0aW9uLT5sZW5ndGggKTsgICAvLyB1cGRhdGUgdG8gbmV3IGxvY2F0aW9uCit9CisKKworLyogCisgICogVGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiBIREQgYW5kIExJTSBpcyB0aHJ1IG1haWxib3ggKE1CKS4KKyAgKiBCb3RoIHNpZGVzIHdpbGwgYWNjZXNzIHRoZSBkYXRhIHN0cnVjdHVyZSAidFNpclNtZUpvaW5SZXEiLgorICAqICBUaGUgcnVsZSBpcywgd2hpbGUgdGhlIGNvbXBvbmVudHMgb2YgInRTaXJTbWVKb2luUmVxIiBjYW4gYmUgYWNjZXNzZWQgaW4gdGhlIHJlZ3VsYXIgd2F5IGxpa2UgdFNpclNtZUpvaW5SZXEuYXNzb2NUeXBlLCB0aGlzIGd1aWRlbGluZQorICAqICBzdG9wcyBhdCBjb21wb25lbnQgdFNpclJTTmllOyBhbnkgYWNjZXMgdG8gdGhlIGNvbXBvbmVudHMgYWZ0ZXIgdFNpclJTTmllIGlzIGZvcmJpZGRlbiBiZWNhdXNlIHRoZSBzcGFjZSBmcm9tIHRTaXJSU05pZSBpcyBxdXVlZXplZAorICAqICB3aXRoIHRoZSBjb21wb25lbnQgInRTaXJCc3NEZXNjcmlwdGlvbiIuIEFuZCBzaW5jZSB0aGUgc2l6ZSBvZiBhY3R1YWwgJ3RTaXJCc3NEZXNjcmlwdGlvbicgdmFyaWVzLCB0aGUgcmVjZWl2aW5nIHNpZGUgKHdoaWNoIGlzIHRoZSByb3V0aW5lCisgICogIGxpbUpvaW5SZXFTZXJEZXMoKSBvZiBsaW1TZXJEZXNVdGlscy5jYykgc2hvdWxkIGtlZXAgaW4gbWluZCBub3QgdG8gYWNjZXNzIHRoZSBjb21wb25lbnRzIERJUkVDVExZIGFmdGVyIHRTaXJSU05pZS4KKyAgKi8KK2VIYWxTdGF0dXMgY3NyU2VuZEpvaW5SZXFNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzY3JpcHRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdERvdDExZkJlYWNvbklFcyAqcEllcyApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTaXJTbWVKb2luUmVxICpwTXNnOworICAgIHRBTklfVTggKnBCdWY7CisgICAgdEFOSV9VMTYgbXNnTGVuLCB3VG1wLCBpZUxlbjsKKyAgICB0U2lyTWFjUmF0ZVNldCBPcFJhdGVTZXQ7CisgICAgdFNpck1hY1JhdGVTZXQgRXhSYXRlU2V0OworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIHRBTklfVTMyIGR3VG1wOworICAgIHRBTklfVTggd3BhUnNuSUVbRE9UMTFGX0lFX1JTTl9NQVhfTEVOXTsgICAgLy9SU04gTUFYIGlzIGJpZ2dlciB0aGFuIFdQQSBNQVgKKworICAgIGRvIHsKKyAgICAgICAgcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5zdGF0dXNDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICAgICAgcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5yZWFzb25Db2RlID0gMDsKKyAgICAgICAgLy8gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgdG8gY29uc2lkZXIuICBGaXJzdCwgdGhlIHRTaXJTbWVKb2luUmVxCisgICAgICAgIC8vIGluY2x1ZGVzIGEgc2luZ2xlIGJzc0Rlc2NyaXB0aW9uLiAgIGJzc0Rlc2NyaXB0aW9uIGluY2x1ZGVzIGEgc2luZ2xlIHRBTklfVTMyIGZvciB0aGUgCisgICAgICAgIC8vIElFIGZpZWxkcywgYnV0IHRoZSBsZW5ndGggZmllbGQgaW4gdGhlIGJzc0Rlc2NyaXB0aW9uIG5lZWRzIHRvIGJlIGludGVycHJldGVkIHRvIAorICAgICAgICAvLyBkZXRlcm1pbmUgbGVuZ3RoIG9mIHRoZSBJRSBmaWVsZHMuCisgICAgICAgIC8vCisgICAgICAgIC8vIFNvLCB0YWtlIHRoZSBzaXplIG9mIHRoZSBKb2luUmVxLCBzdWJ0cmFjdCB0aGUgc2l6ZSBvZiB0aGUgYnNzRGVzY3JpcHRpb24gYW5kIAorICAgICAgICAvLyBhZGQgaW4gdGhlIGxlbmd0aCBmcm9tIHRoZSBic3NEZXNjcmlwdGlvbiAodGhlbiBhZGQgdGhlIHNpemUgb2YgdGhlICdsZW5ndGgnIGZpZWxkCisgICAgICAgIC8vIGl0c2VsZiBiZWNhdXNlIHRoYXQgaXMgTk9UIGluY2x1ZGVkIGluIHRoZSBsZW5ndGggZmllbGQpLgorICAgICAgICBtc2dMZW4gPSBzaXplb2YoIHRTaXJTbWVKb2luUmVxICkgLSBzaXplb2YoICpwQnNzRGVzY3JpcHRpb24gKSArIAorICAgICAgICAgICAgcEJzc0Rlc2NyaXB0aW9uLT5sZW5ndGggKyBzaXplb2YoIHBCc3NEZXNjcmlwdGlvbi0+bGVuZ3RoICkgKworICAgICAgICAgICAgc2l6ZW9mKCB0Q3NyV3BhSWUgKSArIHNpemVvZiggdENzcldwYUF1dGhJZSApICsgc2l6ZW9mKCB0QU5JX1UxNiApOyAvLyBhZGQgaW4gdGhlIHNpemUgb2YgdGhlIFdQQSBJRSB0aGF0IHdlIG1heSBidWlsZC4KKworICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgbXNnTGVuKTsKKyAgICAgICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKSBicmVhazsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTXNnLCBtc2dMZW4pOworICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfSk9JTl9SRVEpOworICAgICAgICBwTXNnLT5sZW5ndGggPSBwYWxfY3B1X3RvX2JlMTYobXNnTGVuKTsKKyAgICAgICAgcEJ1ZiA9ICZwTXNnLT5zZXNzaW9uSWQ7CisKKyAgICAgICAgLy8gc2Vzc2lvbklkCisgICAgICAgICpwQnVmID0gKHRBTklfVTgpc2Vzc2lvbklkOworICAgICAgICBwQnVmKys7CisKKyAgICAgICAgLy8gdHJhbnNhY3Rpb25JZAorICAgICAgICAqcEJ1ZiA9IDA7CisgICAgICAgICooIHBCdWYgKyAxICkgPSAwOworICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICAgICAgLy8gc3NJZAorICAgICAgICBpZiggcEllcy0+U1NJRC5wcmVzZW50ICYmIHBJZXMtPlNTSUQubnVtX3NzaWQgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzc0lkIGxlbgorICAgICAgICAgICAgKnBCdWYgPSBwSWVzLT5TU0lELm51bV9zc2lkOworICAgICAgICAgICAgcEJ1ZisrOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcEllcy0+U1NJRC5zc2lkLCBwSWVzLT5TU0lELm51bV9zc2lkICk7CisgICAgICAgICAgICBwQnVmICs9IHBJZXMtPlNTSUQubnVtX3NzaWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcEJ1ZiA9IDA7CisgICAgICAgICAgICBwQnVmKys7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZWxmTWFjQWRkcgorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodFNpck1hY0FkZHIgKilwQnVmLCAmcFNlc3Npb24tPnNlbGZNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpICk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgLy8gYnNzdHlwZQorICAgICAgICBkd1RtcCA9IHBhbF9jcHVfdG9fYmUzMiggY3NyVHJhbnNsYXRlQnNzdHlwZVRvTWFjVHlwZSggcFByb2ZpbGUtPkJTU1R5cGUgKSApOworICAgICAgICBpZiAoZHdUbXAgPT0gZVNJUl9CVEFNUF9TVEFfTU9ERSkgZHdUbXAgPSBlU0lSX0JUQU1QX0FQX01PREU7IC8vIE92ZXJyaWRlIEJzc1R5cGUgZm9yIEJUQU1QCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICZkd1RtcCwgc2l6ZW9mKHRTaXJCc3NUeXBlKSApOworICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyQnNzVHlwZSk7CisgICAgICAgIC8vIGRvdDExbW9kZQorICAgICAgICAqcEJ1ZiA9ICh0QU5JX1U4KWNzclRyYW5zbGF0ZVRvV05JQ2ZnRG90MTFNb2RlKCBwTWFjLCBwU2Vzc2lvbi0+YnNzUGFyYW1zLnVDZmdEb3QxMU1vZGUgKTsKKyAgICAgICAgcEJ1ZisrOworCisgICAgICAgIC8vUGVyc29uYQorICAgICAgICAqcEJ1ZiA9ICh0QU5JX1U4KXBQcm9maWxlLT5jc3JQZXJzb25hOworICAgICAgICBwQnVmKys7CisKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIEZMKCJDU1IgUEVSU09OQT0lZCIpLCBwUHJvZmlsZS0+Y3NyUGVyc29uYSk7CisgICAgICAgIAorICAgICAgICAvLyB1YXBzZFBlckFjQml0bWFzaworICAgICAgICAqcEJ1ZiA9IHBQcm9maWxlLT51YXBzZF9tYXNrOworICAgICAgICBwQnVmKys7CisKKworICAgIAorI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKSAgICAgICAgCisjZW5kaWYgLyooV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkqLworCisgICAgICAgIHN0YXR1cyA9IGNzckdldFJhdGVTZXQocE1hYywgcFByb2ZpbGUsIChlQ3NyUGh5TW9kZSlwUHJvZmlsZS0+cGh5TW9kZSwgcEJzc0Rlc2NyaXB0aW9uLCBwSWVzLCAmT3BSYXRlU2V0LCAmRXhSYXRlU2V0KTsKKyAgICAgICAgaWYgKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE9wZXJhdGlvbmFsUmF0ZVNldAorICAgICAgICAgICAgaWYgKE9wUmF0ZVNldC5udW1SYXRlcykgeworICAgICAgICAgICAgICAgICpwQnVmKysgPSBPcFJhdGVTZXQubnVtUmF0ZXM7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwQnVmLCBPcFJhdGVTZXQucmF0ZSwgT3BSYXRlU2V0Lm51bVJhdGVzKTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IE9wUmF0ZVNldC5udW1SYXRlczsKKyAgICAgICAgICAgIH0gZWxzZSAqcEJ1ZisrID0gMDsKKyAgICAgICAgICAgIC8vIEV4dGVuZGVkUmF0ZVNldAorICAgICAgICAgICAgaWYgKEV4UmF0ZVNldC5udW1SYXRlcykgeworICAgICAgICAgICAgICAgICpwQnVmKysgPSBFeFJhdGVTZXQubnVtUmF0ZXM7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwQnVmLCBFeFJhdGVTZXQucmF0ZSwgRXhSYXRlU2V0Lm51bVJhdGVzKTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IEV4UmF0ZVNldC5udW1SYXRlczsKKyAgICAgICAgICAgIH0gZWxzZSAqcEJ1ZisrID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpwQnVmKysgPSAwOworICAgICAgICAgICAgKnBCdWYrKyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyByc25JRQorICAgICAgICBpZiAoIGNzcklzUHJvZmlsZVdwYSggcFByb2ZpbGUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEluc2VydCB0aGUgV3BhIElFIGludG8gdGhlIGpvaW4gcmVxdWVzdAorICAgICAgICAgICAgaWVMZW4gPSBjc3JSZXRyaWV2ZVdwYUllKCBwTWFjLCBwUHJvZmlsZSwgcEJzc0Rlc2NyaXB0aW9uLCBwSWVzLAorICAgICAgICAgICAgICAgICAgICAodENzcldwYUllICopKCB3cGFSc25JRSApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggY3NySXNQcm9maWxlUlNOKCBwUHJvZmlsZSApICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBSU04gSUUgaW50byB0aGUgam9pbiByZXF1ZXN0CisgICAgICAgICAgICBpZUxlbiA9IGNzclJldHJpZXZlUnNuSWUoIHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIHBCc3NEZXNjcmlwdGlvbiwgcEllcywKKyAgICAgICAgICAgICAgICAgICAgKHRDc3JSU05JZSAqKSggd3BhUnNuSUUgKSApOworICAgICAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICAgICAgZWxzZSBpZiggY3NySXNQcm9maWxlV2FwaSggcFByb2ZpbGUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEluc2VydCB0aGUgV0FQSSBJRSBpbnRvIHRoZSBqb2luIHJlcXVlc3QKKyAgICAgICAgICAgIGllTGVuID0gY3NyUmV0cmlldmVXYXBpSWUoIHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIHBCc3NEZXNjcmlwdGlvbiwgcEllcywKKyAgICAgICAgICAgICAgICAgICAgKHRDc3JXYXBpSWUgKikoIHdwYVJzbklFICkgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZUxlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy9yZW1lbWJlciB0aGUgSUUgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgaWYoIGllTGVuICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoaWVMZW4gPiBET1QxMUZfSUVfUlNOX01BWF9MRU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgV1BBIFJTTiBJRSBsZW5ndGggOiVkIGlzIG1vcmUgdGhhbiBET1QxMUZfSUVfUlNOX01BWF9MRU4sIHJlc2V0dGluZyB0byAlZFxuIiksIGllTGVuLCBET1QxMUZfSUVfUlNOX01BWF9MRU4pOworICAgICAgICAgICAgICAgIGllTGVuID0gRE9UMTFGX0lFX1JTTl9NQVhfTEVOOworICAgICAgICAgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgICAgICBpZiggY3NySXNQcm9maWxlV2FwaSggcFByb2ZpbGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9DaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkKKyAgICAgICAgICAgICAgICBpZihpZUxlbiA+IHBTZXNzaW9uLT5uV2FwaVJlcUllTGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYocFNlc3Npb24tPnBXYXBpUmVxSUUgJiYgcFNlc3Npb24tPm5XYXBpUmVxSWVMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBXYXBpUmVxSUUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2Vzc2lvbi0+cFdhcGlSZXFJRSwgaWVMZW4pOworICAgICAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+bldhcGlSZXFJZUxlbmd0aCA9IGllTGVuOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBXYXBpUmVxSUUsIHdwYVJzbklFLCBpZUxlbik7CisgICAgICAgICAgICAgICAgd1RtcCA9IHBhbF9jcHVfdG9fYmUxNiggaWVMZW4gKTsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmd1RtcCwgc2l6ZW9mKHRBTklfVTE2KSApOworICAgICAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCB3cGFSc25JRSwgaWVMZW4gKTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IGllTGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZS8vc2hvdWxkIGJlIFdQQS9XUEEyIG90aGVyd2lzZQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9DaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkKKyAgICAgICAgICAgICAgICBpZihpZUxlbiA+IHBTZXNzaW9uLT5uV3BhUnNuUmVxSWVMZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihwU2Vzc2lvbi0+cFdwYVJzblJlcUlFICYmIHBTZXNzaW9uLT5uV3BhUnNuUmVxSWVMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBXcGFSc25SZXFJRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTZXNzaW9uLT5wV3BhUnNuUmVxSUUsIGllTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPm5XcGFSc25SZXFJZUxlbmd0aCA9IGllTGVuOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBXcGFSc25SZXFJRSwgd3BhUnNuSUUsIGllTGVuKTsKKyAgICAgICAgICAgICAgICB3VG1wID0gcGFsX2NwdV90b19iZTE2KCBpZUxlbiApOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICZ3VG1wLCBzaXplb2YodEFOSV9VMTYpICk7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsIHdwYVJzbklFLCBpZUxlbiApOworICAgICAgICAgICAgICAgIHBCdWYgKz0gaWVMZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL2ZyZWUgd2hhdGV2ZXIgb2xkIGluZm8KKyAgICAgICAgICAgIHBTZXNzaW9uLT5uV3BhUnNuUmVxSWVMZW5ndGggPSAwOworICAgICAgICAgICAgaWYocFNlc3Npb24tPnBXcGFSc25SZXFJRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5wV3BhUnNuUmVxSUUpOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wV3BhUnNuUmVxSUUgPSBOVUxMOworICAgICAgICAgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgICAgICBwU2Vzc2lvbi0+bldhcGlSZXFJZUxlbmd0aCA9IDA7CisgICAgICAgICAgICBpZihwU2Vzc2lvbi0+cFdhcGlSZXFJRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5wV2FwaVJlcUlFKTsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cFdhcGlSZXFJRSA9IE5VTEw7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyAgICAgICAgICAgIC8vbGVuZ3RoIGlzIHR3byBieXRlcworICAgICAgICAgICAgKnBCdWYgPSAwOworICAgICAgICAgICAgKihwQnVmICsgMSkgPSAwOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgIC8vIE5ldmVyIGluY2x1ZGUgdGhlIGNja21JRSBpbiBhbiBKb2luIFJlcXVlc3QKKyAgICAgICAgLy9sZW5ndGggaXMgdHdvIGJ5dGVzCisgICAgICAgICpwQnVmID0gMDsKKyAgICAgICAgKihwQnVmICsgMSkgPSAwOworICAgICAgICBwQnVmICs9IDI7CisjZW5kaWYgCisKKyAgICAgICAgLy8gYWRkSUVTY2FuCisgICAgICAgIGlmKHBQcm9maWxlLT5uQWRkSUVTY2FuTGVuZ3RoICYmIHBQcm9maWxlLT5wQWRkSUVTY2FuKQorICAgICAgICB7CisgICAgICAgICAgICBpZUxlbiA9IHBQcm9maWxlLT5uQWRkSUVTY2FuTGVuZ3RoOworCisgICAgICAgICAgICBpZihpZUxlbiA+IHBTZXNzaW9uLT5uQWRkSUVTY2FuTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5wQWRkSUVTY2FuICYmIHBTZXNzaW9uLT5uQWRkSUVTY2FuTGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBBZGRJRVNjYW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZwU2Vzc2lvbi0+cEFkZElFU2NhbiwgaWVMZW4pOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2Vzc2lvbi0+bkFkZElFU2Nhbkxlbmd0aCA9IGllTGVuOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+cEFkZElFU2NhbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlLT5wQWRkSUVTY2FuLCBpZUxlbik7CisgICAgICAgICAgICB3VG1wID0gcGFsX2NwdV90b19iZTE2KCBpZUxlbiApOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJndUbXAsIHNpemVvZih0QU5JX1UxNikgKTsKKyAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsIHBQcm9maWxlLT5wQWRkSUVTY2FuLCBpZUxlbiApOworICAgICAgICAgICAgcEJ1ZiArPSBpZUxlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5uQWRkSUVTY2FuTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5wQWRkSUVTY2FuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBBZGRJRVNjYW4pOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQWRkSUVTY2FuID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwQnVmID0gMDsKKyAgICAgICAgICAgICoocEJ1ZiArIDEpID0gMDsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZElFQXNzb2MKKyAgICAgICAgaWYocFByb2ZpbGUtPm5BZGRJRUFzc29jTGVuZ3RoICYmIHBQcm9maWxlLT5wQWRkSUVBc3NvYykKKyAgICAgICAgeworICAgICAgICAgICAgaWVMZW4gPSBwUHJvZmlsZS0+bkFkZElFQXNzb2NMZW5ndGg7CisKKyAgICAgICAgICAgIGlmKGllTGVuID4gcFNlc3Npb24tPm5BZGRJRUFzc29jTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5wQWRkSUVBc3NvYyAmJiBwU2Vzc2lvbi0+bkFkZElFQXNzb2NMZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5wQWRkSUVBc3NvYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopJnBTZXNzaW9uLT5wQWRkSUVBc3NvYywgaWVMZW4pOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2Vzc2lvbi0+bkFkZElFQXNzb2NMZW5ndGggPSBpZUxlbjsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBBZGRJRUFzc29jLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGUtPnBBZGRJRUFzc29jLCBpZUxlbik7CisgICAgICAgICAgICB3VG1wID0gcGFsX2NwdV90b19iZTE2KCBpZUxlbiApOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJndUbXAsIHNpemVvZih0QU5JX1UxNikgKTsKKyAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsIHBQcm9maWxlLT5wQWRkSUVBc3NvYywgaWVMZW4gKTsKKyAgICAgICAgICAgIHBCdWYgKz0gaWVMZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+bkFkZElFQXNzb2NMZW5ndGggPSAwOworICAgICAgICAgICAgaWYocFNlc3Npb24tPnBBZGRJRUFzc29jKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBBZGRJRUFzc29jKTsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cEFkZElFQXNzb2MgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBCdWYgPSAwOworICAgICAgICAgICAgKihwQnVmICsgMSkgPSAwOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICB9CisKKyAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIoIGNzclRyYW5zbGF0ZUVuY3J5cHRUeXBlVG9FZFR5cGUoIHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSkgKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJmR3VG1wLCBzaXplb2YodEFOSV9VMzIpICk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsgICAgICAgIAorCisgICAgICAgIGR3VG1wID0gcGFsX2NwdV90b19iZTMyKCBjc3JUcmFuc2xhdGVFbmNyeXB0VHlwZVRvRWRUeXBlKCBwUHJvZmlsZS0+bmVnb3RpYXRlZE1DRW5jcnlwdGlvblR5cGUpICk7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICZkd1RtcCwgc2l6ZW9mKHRBTklfVTMyKSApOworICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7ICAgICAgICAKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgIGlmIChjc3JJc1Byb2ZpbGUxMXIoIHBQcm9maWxlICkgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpczExUmNvbm5lY3Rpb247CisgICAgICAgICAgICBkd1RtcCA9IHBhbF9jcHVfdG9fYmUzMihUUlVFKTsgCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmZHdUbXAsIHNpemVvZih0QW5pQm9vbCkgKTsKKyAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlCb29sKTsgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaXMxMVJjb25uZWN0aW9uOworICAgICAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIoRkFMU0UpOyAKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICZkd1RtcCwgc2l6ZW9mKHRBbmlCb29sKSApOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFuaUJvb2wpOyAgICAgICAgCisgICAgICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAvKiBBIHByb2ZpbGUgY2FuIG5vdCBiZSBib3RoIENDWCBhbmQgMTFSLiBCdXQgYW4gODAyLjExUiBBUAorICAgICAgICAgKiBtYXkgYmUgYWR2ZXJ0aXNpbmcgc3VwcG9ydCBmb3IgQ0NYIGFzIHdlbGwuIFNvIGlmIHdlIGFyZSAKKyAgICAgICAgICogYXNzb2NpYXRpbmcgT3BlbiBvciBleHBsaWNpdGx5IENDWCB0aGVuIHdlIHdpbGwgZ2V0IENDWC4KKyAgICAgICAgICogSWYgd2UgYXJlIGFzc29jaWF0aW5nIGV4cGxpY3RseSAxMVIgb25seSB0aGVuIHdlIHdpbGwgZ2V0CisgICAgICAgICAqIDExUi4KKyAgICAgICAgICovCisgICAgICAgIGlmICgoY3NySXNQcm9maWxlQ0NYKHBQcm9maWxlKSB8fCAoKHBJZXMtPkNDWFZlcnNpb24ucHJlc2VudCkgJiYgKChwUHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlID09IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNKSB8fCAocFByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9XUEEpKSkpICYmICghKGNzcklzUHJvZmlsZTExciggcFByb2ZpbGUgKSkpICYmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzQ2N4SW5pRmVhdHVyZUVuYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpc0NDWGNvbm5lY3Rpb247CisgICAgICAgICAgICBkd1RtcCA9IHBhbF9jcHVfdG9fYmUzMihUUlVFKTsgCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmZHdUbXAsIHNpemVvZih0QW5pQm9vbCkgKTsKKyAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlCb29sKTsgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaXNDQ1hjb25uZWN0aW9uOworICAgICAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIoRkFMU0UpOyAKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICZkd1RtcCwgc2l6ZW9mKHRBbmlCb29sKSApOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFuaUJvb2wpOyAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdENDWFRzcGVjSW5mbyBjY3hUc3BlYzsKKyAgICAgICAgICAgIC8vIENDWC1Uc3BlYyBJRXMgaW4gdGhlIEFTU09DIHJlcXVlc3QgaXMgcHJlc2VudGx5IG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgIC8vIHNvIG51bGxpZnkgdGhlIFRTUEVDIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJmNjeFRzcGVjLCBzaXplb2YodENDWFRzcGVjSW5mbykpOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJmNjeFRzcGVjLCBzaXplb2YodENDWFRzcGVjSW5mbykpOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodENDWFRzcGVjSW5mbyk7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiB8fCBkZWZpbmVkIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgLy8gRmlsbCBpbiBpc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZAorICAgICAgICBpZiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIoVFJVRSk7IAorICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJmR3VG1wLCBzaXplb2YodEFuaUJvb2wpICk7CisgICAgICAgICAgICBwQnVmICs9IHNpemVvZih0QW5pQm9vbCk7ICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGR3VG1wID0gcGFsX2NwdV90b19iZTMyKEZBTFNFKTsgCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmZHdUbXAsIHNpemVvZih0QW5pQm9vbCkgKTsKKyAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlCb29sKTsgICAgICAgIAorICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvL0Jzc0Rlc2MKKyAgICAgICAgY3NyUHJlcGFyZUpvaW5SZWFzc29jUmVxQnVmZmVyKCBwTWFjLCBwQnNzRGVzY3JpcHRpb24sIHBCdWYsIAorICAgICAgICAgICAgICAgICh0QU5JX1U4KXBQcm9maWxlLT51YXBzZF9tYXNrKTsKKworICAgICAgICBzdGF0dXMgPSBwYWxTZW5kTUJNZXNzYWdlKHBNYWMtPmhIZGQsIHBNc2cgKTsgICAgCisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vVHVzaC1Rb1M6IG5vdGlmeSBRb1MgbW9kdWxlIHRoYXQgam9pbiBoYXBwZW5pbmcKKyAgICAgICAgZWxzZQorICAgICAgICB7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgICAgICAgICAgc21lX1Fvc0NzckV2ZW50SW5kKHBNYWMsICh2X1U4X3Qpc2Vzc2lvbklkLCBTTUVfUU9TX0NTUl9KT0lOX1JFUSwgTlVMTCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0gd2hpbGUoIDAgKTsKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2VuZFNtZVJlYXNzb2NSZXFNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzY3JpcHRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdFNpclNtZVJlYXNzb2NSZXEgKnBNc2c7CisgICAgdEFOSV9VOCAqcEJ1ZjsKKyAgICB2X1U4X3QgYWNtX21hc2sgPSAwLCB1YXBzZF9tYXNrOworICAgIHRBTklfVTE2IG1zZ0xlbiwgaWVMZW4sIHdUbXA7CisgICAgdEFOSV9VMzIgZHdUbXA7CisgICAgdFNpck1hY1JhdGVTZXQgT3BSYXRlU2V0OworICAgIHRTaXJNYWNSYXRlU2V0IEV4UmF0ZVNldDsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICB0QU5JX1U4IHdwYVJzbklFW0RPVDExRl9JRV9SU05fTUFYX0xFTl07ICAgIC8vUlNOIE1BWCBpcyBiaWdnZXIgdGhhbiBXUEEgTUFYCisKKyAgICAvKiBUbyBzYXRpc2Z5IGtsb2Nrd29ya3MgKi8KKyAgICBpZiAocEJzc0Rlc2NyaXB0aW9uID09IE5VTEwpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBwQnNzRGVzY3JpcHRpb24gaXMgTlVMTFxuIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIC8vIFRoZXJlIGFyZSBhIG51bWJlciBvZiB2YXJpYWJsZSBsZW5ndGggZmllbGRzIHRvIGNvbnNpZGVyLiAgRmlyc3QsIHRoZSB0U2lyU21lSm9pblJlcQorICAgICAgICAvLyBpbmNsdWRlcyBhIHNpbmdsZSBic3NEZXNjcmlwdGlvbi4gICBic3NEZXNjcmlwdGlvbiBpbmNsdWRlcyBhIHNpbmdsZSB0QU5JX1UzMiBmb3IgdGhlIAorICAgICAgICAvLyBJRSBmaWVsZHMsIGJ1dCB0aGUgbGVuZ3RoIGZpZWxkIGluIHRoZSBic3NEZXNjcmlwdGlvbiBuZWVkcyB0byBiZSBpbnRlcnByZXRlZCB0byAKKyAgICAgICAgLy8gZGV0ZXJtaW5lIGxlbmd0aCBvZiB0aGUgSUUgZmllbGRzLgorICAgICAgICAvLworICAgICAgICAvLyBTbywgdGFrZSB0aGUgc2l6ZSBvZiB0aGUgSm9pblJlcSwgc3VidHJhY3QgdGhlIHNpemUgb2YgdGhlIGJzc0Rlc2NyaXB0aW9uIGFuZCAKKyAgICAgICAgLy8gYWRkIGluIHRoZSBsZW5ndGggZnJvbSB0aGUgYnNzRGVzY3JpcHRpb24gKHRoZW4gYWRkIHRoZSBzaXplIG9mIHRoZSAnbGVuZ3RoJyBmaWVsZAorICAgICAgICAvLyBpdHNlbGYgYmVjYXVzZSB0aGF0IGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgbGVuZ3RoIGZpZWxkKS4KKyAgICAgICAgbXNnTGVuID0gc2l6ZW9mKCB0U2lyU21lUmVhc3NvY1JlcSApIC0gc2l6ZW9mKCAqcEJzc0Rlc2NyaXB0aW9uICkgKyAKKyAgICAgICAgICAgICAgICAgcEJzc0Rlc2NyaXB0aW9uLT5sZW5ndGggKyBzaXplb2YoIHBCc3NEZXNjcmlwdGlvbi0+bGVuZ3RoICkgKworICAgICAgICAgICAgICAgICBzaXplb2YoIHRDc3JXcGFJZSApICsgc2l6ZW9mKCB0Q3NyV3BhQXV0aEllICkgKyBzaXplb2YoIHRBTklfVTE2ICk7IC8vIGFkZCBpbiB0aGUgc2l6ZSBvZiB0aGUgV1BBIElFIHRoYXQgd2UgbWF5IGJ1aWxkLgorICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgbXNnTGVuKTsgICAgICAgICAKKyAgICAgICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKSBicmVhazsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTXNnLCBtc2dMZW4pOworICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfUkVBU1NPQ19SRVEpOworICAgICAgICAgICAgICAgIHBNc2ctPmxlbmd0aCA9IHBhbF9jcHVfdG9fYmUxNihtc2dMZW4pOworICAgICAgICBwQnVmID0gJnBNc2ctPnNlc3Npb25JZDsKKyAgICAgICAgLy8gc2Vzc2lvbklkCisgICAgICAgICpwQnVmKysgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIC8vIHRyYW5zYWN0aW9uSWQKKyAgICAgICAgKnBCdWYgPSAwOworICAgICAgICAqKHBCdWYgKyAxKSA9IDA7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mICh0QU5JX1UxNik7CisgICAgICAgIC8vIHNzSWQKKyAgICAgICAgaWYoIHBJZXMtPlNTSUQucHJlc2VudCAmJiBwSWVzLT5TU0lELm51bV9zc2lkICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc3NJZCBsZW4KKyAgICAgICAgICAgICpwQnVmKysgPSBwSWVzLT5TU0lELm51bV9zc2lkOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcEllcy0+U1NJRC5zc2lkLCBwSWVzLT5TU0lELm51bV9zc2lkICk7CisgICAgICAgICAgICBwQnVmICs9IHBJZXMtPlNTSUQubnVtX3NzaWQ7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBCdWYrKyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2VsZk1hY0FkZHIKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRTaXJNYWNBZGRyICopcEJ1ZiwgJnBTZXNzaW9uLT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgICAgIC8vIGJzc3R5cGUKKyAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIoIGNzclRyYW5zbGF0ZUJzc3R5cGVUb01hY1R5cGUoIHBQcm9maWxlLT5CU1NUeXBlICkgKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJmR3VG1wLCBzaXplb2YodFNpckJzc1R5cGUpICk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJCc3NUeXBlKTsKKyAgICAgICAgLy8gZG90MTFtb2RlCisgICAgICAgICpwQnVmID0gKHRBTklfVTgpY3NyVHJhbnNsYXRlVG9XTklDZmdEb3QxMU1vZGUoIHBNYWMsIHBTZXNzaW9uLT5ic3NQYXJhbXMudUNmZ0RvdDExTW9kZSApOworICAgICAgICBwQnVmKys7CisKKyAgICAgICAgLy9QZXJzb25hCisgICAgICAgICpwQnVmID0gKHRBTklfVTgpcFByb2ZpbGUtPmNzclBlcnNvbmE7CisgICAgICAgIHBCdWYrKzsKKworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgRkwoIkNTUiBQRVJTT05BPSVkXG4iKSwgcFByb2ZpbGUtPmNzclBlcnNvbmEpOworICAgICAgICAKKyAgICAgICAgLy8gdWFwc2RQZXJBY0JpdG1hc2sKKyAgICAgICAgKnBCdWYgPSBwUHJvZmlsZS0+dWFwc2RfbWFzazsKKyAgICAgICAgcEJ1ZisrOworCisKKworICAgICAgICBzdGF0dXMgPSBjc3JHZXRSYXRlU2V0KHBNYWMsIHBQcm9maWxlLCAoZUNzclBoeU1vZGUpcFByb2ZpbGUtPnBoeU1vZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0Rlc2NyaXB0aW9uLCBwSWVzLCAmT3BSYXRlU2V0LCAmRXhSYXRlU2V0KTsKKyAgICAgICAgaWYgKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE9wZXJhdGlvbmFsUmF0ZVNldAorICAgICAgICAgICAgaWYgKE9wUmF0ZVNldC5udW1SYXRlcykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBCdWYrKyA9IE9wUmF0ZVNldC5udW1SYXRlczsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBCdWYsIE9wUmF0ZVNldC5yYXRlLCBPcFJhdGVTZXQubnVtUmF0ZXMpOworICAgICAgICAgICAgICAgIHBCdWYgKz0gT3BSYXRlU2V0Lm51bVJhdGVzOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGVsc2UgKnBCdWYrKyA9IDA7CisgICAgICAgICAgICAvLyBFeHRlbmRlZFJhdGVTZXQKKyAgICAgICAgICAgIGlmIChFeFJhdGVTZXQubnVtUmF0ZXMpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwQnVmKysgPSBFeFJhdGVTZXQubnVtUmF0ZXM7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwQnVmLCBFeFJhdGVTZXQucmF0ZSwgRXhSYXRlU2V0Lm51bVJhdGVzKTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IEV4UmF0ZVNldC5udW1SYXRlczsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlICpwQnVmKysgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBCdWYrKyA9IDA7CisgICAgICAgICAgICAqcEJ1ZisrID0gMDsKKyAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcnNuSUUKKyAgICAgICAgaWYgKCBjc3JJc1Byb2ZpbGVXcGEoIHBQcm9maWxlICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBXcGEgSUUgaW50byB0aGUgam9pbiByZXF1ZXN0CisgICAgICAgICAgICBpZUxlbiA9IGNzclJldHJpZXZlV3BhSWUoIHBNYWMsIHBQcm9maWxlLCBwQnNzRGVzY3JpcHRpb24sIHBJZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodENzcldwYUllICopKCB3cGFSc25JRSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNzcklzUHJvZmlsZVJTTiggcFByb2ZpbGUgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIFJTTiBJRSBpbnRvIHRoZSBqb2luIHJlcXVlc3QKKyAgICAgICAgICAgIGllTGVuID0gY3NyUmV0cmlldmVSc25JZSggcE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgcEJzc0Rlc2NyaXB0aW9uLCBwSWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0Q3NyUlNOSWUgKikoIHdwYVJzbklFICkgKTsKKyAgICAgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgIGVsc2UgaWYoIGNzcklzUHJvZmlsZVdhcGkoIHBQcm9maWxlICkgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIFdBUEkgSUUgaW50byB0aGUgam9pbiByZXF1ZXN0CisgICAgICAgICAgICBpZUxlbiA9IGNzclJldHJpZXZlV2FwaUllKCBwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCBwQnNzRGVzY3JpcHRpb24sIHBJZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodENzcldhcGlJZSAqKSggd3BhUnNuSUUpICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGllTGVuID0gMDsKKyAgICAgICAgfQorICAgICAgICAvL3JlbWVtYmVyIHRoZSBJRSBmb3IgZnV0dXJlIHVzZQorICAgICAgICBpZiggaWVMZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBpZihpZUxlbiA+IERPVDExRl9JRV9SU05fTUFYX0xFTikKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIFdQQSBSU04gSUUgbGVuZ3RoIDolZCBpcyBtb3JlIHRoYW4gRE9UMTFGX0lFX1JTTl9NQVhfTEVOLCByZXNldHRpbmcgdG8gJWRcbiIpLCBpZUxlbiwgRE9UMTFGX0lFX1JTTl9NQVhfTEVOKTsKKyAgICAgICAgICAgICAgICAgaWVMZW4gPSBET1QxMUZfSUVfUlNOX01BWF9MRU47CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0NoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeQorICAgICAgICAgICAgaWYoaWVMZW4gPiBwU2Vzc2lvbi0+bldwYVJzblJlcUllTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5wV3BhUnNuUmVxSUUgJiYgcFNlc3Npb24tPm5XcGFSc25SZXFJZUxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBXcGFSc25SZXFJRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2Vzc2lvbi0+cFdwYVJzblJlcUlFLCBpZUxlbik7CisgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTZXNzaW9uLT5uV3BhUnNuUmVxSWVMZW5ndGggPSBpZUxlbjsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBXcGFSc25SZXFJRSwgd3BhUnNuSUUsIGllTGVuKTsKKyAgICAgICAgICAgIHdUbXAgPSBwYWxfY3B1X3RvX2JlMTYoIGllTGVuICk7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmd1RtcCwgc2l6ZW9mKHRBTklfVTE2KSApOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1Ziwgd3BhUnNuSUUsIGllTGVuICk7CisgICAgICAgICAgICBwQnVmICs9IGllTGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgLy9mcmVlIHdoYXRldmVyIG9sZCBpbmZvCisgICAgICAgICAgICBwU2Vzc2lvbi0+bldwYVJzblJlcUllTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5wV3BhUnNuUmVxSUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+cFdwYVJzblJlcUlFKTsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cFdwYVJzblJlcUlFID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vbGVuZ3RoIGlzIHR3byBieXRlcworICAgICAgICAgICAgKnBCdWYgPSAwOworICAgICAgICAgICAgKihwQnVmICsgMSkgPSAwOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgLy8gY2NrbUlFCisgICAgICAgIGlmKCBjc3JJc1Byb2ZpbGVDQ1goIHBQcm9maWxlICkgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIENDS00gSUUgaW50byB0aGUgam9pbiByZXF1ZXN0CisgICAgICAgICAgICBpZUxlbiA9IGNzckNvbnN0cnVjdENjeENja21JZSggcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzRGVzY3JpcHRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBXcGFSc25SZXFJRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+bldwYVJzblJlcUllTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoIHdwYVJzbklFICkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGllTGVuID0gMDsKKyAgICAgICAgfQorICAgICAgICAvL0lmIHByZXNlbnQsIGNvcHkgdGhlIElFIGludG8gdGhlIGVXTklfU01FX1JFQVNTT0NfUkVRIG1lc3NhZ2UgYnVmZmVyCisgICAgICAgIGlmKCBpZUxlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vQ29weSB0aGUgQ0NLTSBJRSBvdmVyIGZyb20gdGhlIHRlbXAgYnVmZmVyICh3cGFSc25JRSkKKyAgICAgICAgICAgIHdUbXAgPSBwYWxfY3B1X3RvX2JlMTYoIGllTGVuICk7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmd1RtcCwgc2l6ZW9mKHRBTklfVTE2KSApOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1Ziwgd3BhUnNuSUUsIGllTGVuICk7CisgICAgICAgICAgICBwQnVmICs9IGllTGVuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9JbmRpY2F0ZSB5b3UgaGF2ZSBubyBDQ0tNIElFCisgICAgICAgICAgICAvL2xlbmd0aCBpcyB0d28gYnl0ZXMKKyAgICAgICAgICAgICpwQnVmID0gMDsKKyAgICAgICAgICAgICoocEJ1ZiArIDEpID0gMDsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KKworICAgICAgICAvLyBhZGRJRVNjYW4KKyAgICAgICAgaWYocFByb2ZpbGUtPm5BZGRJRVNjYW5MZW5ndGggJiYgcFByb2ZpbGUtPnBBZGRJRVNjYW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGllTGVuID0gcFByb2ZpbGUtPm5BZGRJRVNjYW5MZW5ndGg7CisKKyAgICAgICAgICAgIGlmKGllTGVuID4gcFNlc3Npb24tPm5BZGRJRVNjYW5MZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYocFNlc3Npb24tPnBBZGRJRVNjYW4gJiYgcFNlc3Npb24tPm5BZGRJRVNjYW5MZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5wQWRkSUVTY2FuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikmcFNlc3Npb24tPnBBZGRJRVNjYW4sIGllTGVuKTsKKyAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNlc3Npb24tPm5BZGRJRVNjYW5MZW5ndGggPSBpZUxlbjsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBBZGRJRVNjYW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZS0+cEFkZElFU2NhbiwgaWVMZW4pOworICAgICAgICAgICAgd1RtcCA9IHBhbF9jcHVfdG9fYmUxNiggaWVMZW4gKTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICZ3VG1wLCBzaXplb2YodEFOSV9VMTYpICk7CisgICAgICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBwUHJvZmlsZS0+cEFkZElFU2NhbiwgaWVMZW4gKTsKKyAgICAgICAgICAgIHBCdWYgKz0gaWVMZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+bkFkZElFU2Nhbkxlbmd0aCA9IDA7CisgICAgICAgICAgICBpZihwU2Vzc2lvbi0+cEFkZElFU2NhbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5wQWRkSUVTY2FuKTsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cEFkZElFU2NhbiA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcEJ1ZiA9IDA7CisgICAgICAgICAgICAqKHBCdWYgKyAxKSA9IDA7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGRJRUFzc29jCisgICAgICAgIGlmKHBQcm9maWxlLT5uQWRkSUVBc3NvY0xlbmd0aCAmJiBwUHJvZmlsZS0+cEFkZElFQXNzb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGllTGVuID0gcFByb2ZpbGUtPm5BZGRJRUFzc29jTGVuZ3RoOworCisgICAgICAgICAgICBpZihpZUxlbiA+IHBTZXNzaW9uLT5uQWRkSUVBc3NvY0xlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwU2Vzc2lvbi0+cEFkZElFQXNzb2MgJiYgcFNlc3Npb24tPm5BZGRJRUFzc29jTGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBBZGRJRUFzc29jKTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopJnBTZXNzaW9uLT5wQWRkSUVBc3NvYywgaWVMZW4pOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIHBTZXNzaW9uLT5uQWRkSUVBc3NvY0xlbmd0aCA9IGllTGVuOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+cEFkZElFQXNzb2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZS0+cEFkZElFQXNzb2MsIGllTGVuKTsKKyAgICAgICAgICAgIHdUbXAgPSBwYWxfY3B1X3RvX2JlMTYoIGllTGVuICk7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmd1RtcCwgc2l6ZW9mKHRBTklfVTE2KSApOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcFByb2ZpbGUtPnBBZGRJRUFzc29jLCBpZUxlbiApOworICAgICAgICAgICAgcEJ1ZiArPSBpZUxlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5uQWRkSUVBc3NvY0xlbmd0aCA9IDA7CisgICAgICAgICAgICBpZihwU2Vzc2lvbi0+cEFkZElFQXNzb2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+cEFkZElFQXNzb2MpOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQWRkSUVBc3NvYyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcEJ1ZiA9IDA7CisgICAgICAgICAgICAqKHBCdWYgKyAxKSA9IDA7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIH0KKworICAgICAgICAvL1VubWFzayBhbnkgQUMgaW4gcmVhc3NvYyB0aGF0IGlzIEFDTS1zZXQKKyAgICAgICAgdWFwc2RfbWFzayA9ICh2X1U4X3QpcFByb2ZpbGUtPnVhcHNkX21hc2s7CisgICAgICAgIGlmKCB1YXBzZF9tYXNrICYmICggTlVMTCAhPSBwQnNzRGVzY3JpcHRpb24gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBDU1JfSVNfUU9TX0JTUyhwSWVzKSAmJiBDU1JfSVNfVUFQU0RfQlNTKHBJZXMpICkKKyAgICAgICAgICAgIHsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgICAgICAgICAgICAgYWNtX21hc2sgPSBzbWVfUW9zR2V0QUNNTWFzayhwTWFjLCBwQnNzRGVzY3JpcHRpb24sIHBJZXMpOworI2VuZGlmIC8qIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVCovCisgICAgICAgICAgICAgICAgdWFwc2RfbWFzayAmPSB+KGFjbV9tYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1YXBzZF9tYXNrID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIoIGNzclRyYW5zbGF0ZUVuY3J5cHRUeXBlVG9FZFR5cGUoIHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSkgKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJmR3VG1wLCBzaXplb2YodEFOSV9VMzIpICk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIoIGNzclRyYW5zbGF0ZUVuY3J5cHRUeXBlVG9FZFR5cGUoIHBQcm9maWxlLT5uZWdvdGlhdGVkTUNFbmNyeXB0aW9uVHlwZSkgKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJmR3VG1wLCBzaXplb2YodEFOSV9VMzIpICk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsgICAgICAgIAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgLy8gaXMxMVJjb25uZWN0aW9uOworICAgICAgICBkd1RtcCA9IGNzcklzUHJvZmlsZTExciggcFByb2ZpbGUgKT8gIHBhbF9jcHVfdG9fYmUzMihUUlVFKSA6IDA7IAorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmZHdUbXAsIHNpemVvZih0QW5pQm9vbCkgKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFuaUJvb2wpOyAgICAgICAgCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgIC8vaXNDQ1hjb25uZWN0aW9uOworICAgICAgICAvL0NDS00gcHJvZmlsZSwgY2N4dmVyc2lvbiBpZSBwcmVzZW50LCBub3QgMTFyIGFuZCBpbmkgZmlsZSBoYXMgQ0NYIGVuYWJsZWQKKyAgICAgICAgZHdUbXAgPSAoKGNzcklzUHJvZmlsZUNDWChwUHJvZmlsZSkgfHwgKChwSWVzLT5DQ1hWZXJzaW9uLnByZXNlbnQpICYmICgocFByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTSkgfHwgKHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfV1BBKSkpKSAmJiAoIShjc3JJc1Byb2ZpbGUxMXIoIHBQcm9maWxlICkpKSAmJiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0NjeEluaUZlYXR1cmVFbmFibGVkKSkgPyBwYWxfY3B1X3RvX2JlMzIoVFJVRSkgOiAwOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmZHdUbXAsIHNpemVvZih0QW5pQm9vbCkgKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFuaUJvb2wpOyAgICAgICAgCisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX0NDWAorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgIGlmICgoY3NySXNQcm9maWxlQ0NYKHBQcm9maWxlKSB8fCAoKHBJZXMtPkNDWFZlcnNpb24ucHJlc2VudCkgJiYgKChwUHJvZmlsZS0+bmVnb3RpYXRlZEF1dGhUeXBlID09IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNKSB8fCAocFByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9XUEEpKSkpICYmICghKGNzcklzUHJvZmlsZTExciggcFByb2ZpbGUgKSkpICYmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzQ2N4SW5pRmVhdHVyZUVuYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgIHRDQ1hUc3BlY0luZm8gY2N4VHNwZWM7CisKKyAgICAgICAgICAgLy8gQ0NYIFRzcGVjIGluZm9ybWF0aW9uCisgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJmNjeFRzcGVjLCBzaXplb2YodENDWFRzcGVjSW5mbykpOworICAgICAgICAgICBjY3hUc3BlYy5udW1Uc3BlY3MgPSBzbWVfUW9zQ0N4UmV0cmlldmVUc3BlY0luZm8ocE1hYywgc2Vzc2lvbklkLCAodFRzcGVjSW5mbyAqKSAmY2N4VHNwZWMudHNwZWNbMF0pOworICAgICAgICAgICAqcEJ1ZiA9IGNjeFRzcGVjLm51bVRzcGVjczsKKyAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VOCk7CisKKyAgICAgICAgICAgLy8gQ29weSB0aGUgVFNQRUMgaW5mb3JtYXRpb24gb25seSBpZiBwcmVzZW50CisgICAgICAgICAgIGlmIChjY3hUc3BlYy5udW1Uc3BlY3MpIHsKKyAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcEJ1ZiwgKHZvaWQqKSZjY3hUc3BlYy50c3BlY1swXSwgKGNjeFRzcGVjLm51bVRzcGVjcypzaXplb2YodFRzcGVjSW5mbykpKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBwQnVmICs9IHNpemVvZihjY3hUc3BlYy50c3BlYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRDQ1hUc3BlY0luZm8gY2N4VHNwZWM7CisgICAgICAgICAgICAgICAgLy8gQ0NYLVRzcGVjIElFcyBpbiB0aGUgQVNTT0MgcmVxdWVzdCBpcyBwcmVzZW50bHkgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgIC8vIHNvIG51bGxpZnkgdGhlIFRTUEVDIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZjY3hUc3BlYywgc2l6ZW9mKHRDQ1hUc3BlY0luZm8pKTsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmY2N4VHNwZWMsIHNpemVvZih0Q0NYVHNwZWNJbmZvKSk7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodENDWFRzcGVjSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fQ0NYCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSIHx8IGRlZmluZWQgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICAvLyBGaWxsIGluIGlzRmFzdFRyYW5zaXRpb25FbmFibGVkCisgICAgICAgIGlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmlzRmFzdFRyYW5zaXRpb25FbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBkd1RtcCA9IHBhbF9jcHVfdG9fYmUzMihUUlVFKTsgCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmZHdUbXAsIHNpemVvZih0QW5pQm9vbCkgKTsKKyAgICAgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlCb29sKTsgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIoRkFMU0UpOyAKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICZkd1RtcCwgc2l6ZW9mKHRBbmlCb29sKSApOworICAgICAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFuaUJvb2wpOyAgICAgICAgCisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGNzclByZXBhcmVKb2luUmVhc3NvY1JlcUJ1ZmZlciggcE1hYywgcEJzc0Rlc2NyaXB0aW9uLCBwQnVmLCB1YXBzZF9tYXNrKTsKKyAgICAgICAgCisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgICAgICAvL1R1c2gtUW9TOiBub3RpZnkgUW9TIG1vZHVsZSB0aGF0IHJlYXNzb2MgaGFwcGVuaW5nCisgICAgICAgIHNtZV9Rb3NDc3JFdmVudEluZChwTWFjLCAodl9VOF90KXNlc3Npb25JZCwgU01FX1FPU19DU1JfUkVBU1NPQ19SRVEsIE5VTEwpOworI2VuZGlmCisgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UoIHBNYWMtPmhIZGQsIHBNc2cgKTsKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICByZXR1cm4oIHN0YXR1cyApOworCit9CisKKworLy8KK2VIYWxTdGF0dXMgY3NyU2VuZE1CRGlzYXNzb2NSZXFNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdFNpck1hY0FkZHIgYnNzSWQsIHRBTklfVTE2IHJlYXNvbkNvZGUgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0U2lyU21lRGlzYXNzb2NSZXEgKnBNc2c7CisgICAgdEFOSV9VOCAqcEJ1ZjsKKyAgICB0QU5JX1UxNiB3VG1wOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICBpZiAoIUNTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSkKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisjZW5kaWYKKworICAgIGRvIHsKKyAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIHNpemVvZiggdFNpclNtZURpc2Fzc29jUmVxICkpOworICAgICAgICBpZiAoICFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSApIGJyZWFrOworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2csIHNpemVvZiggdFNpclNtZURpc2Fzc29jUmVxICkpOworICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfRElTQVNTT0NfUkVRKTsKKyAgICAgICAgcE1zZy0+bGVuZ3RoID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNilzaXplb2YoIHRTaXJTbWVEaXNhc3NvY1JlcSApKTsKKworICAgICAgICBwQnVmID0gJnBNc2ctPnNlc3Npb25JZDsKKyAgICAgICAgLy8gc2Vzc2lvbklkCisgICAgICAgICpwQnVmKysgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIC8vIHRyYW5zYWN0aW9uSWQKKyAgICAgICAgKnBCdWYgPSAwOworICAgICAgICAqKCBwQnVmICsgMSApID0gMDsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgICAKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFICAgICAgICAKKyAgICAgICAgaWYgKCAocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSAhPSBOVUxMICkgJiYgCisgICAgICAgICAgICAgKCByZWFzb25Db2RlID09IGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTiApICYmIAorICAgICAgICAgICAgICgoQ1NSX0lTX0lORlJBX0FQKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpKSB8fCAoQ1NSX0lTX1dEU19BUChwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTZXQgdGhlIGJzc2lkIGFkZHJlc3MgYmVmb3JlIHNlbmRpbmcgdGhlIG1lc3NhZ2UgdG8gTElNCisgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodFNpck1hY0FkZHIgKilwQnVmLCBwU2Vzc2lvbi0+c2VsZk1hY0FkZHIsIHNpemVvZiggdFNpck1hY0FkZHIgKSApOworICAgICAgICAgICAgcEJ1ZiA9IHBCdWYgKyBzaXplb2YgKCB0U2lyTWFjQWRkciApOworCisgICAgICAgICAgICAvLyBTZXQgdGhlIHBlZXIgTUFDIGFkZHJlc3MgYmVmb3JlIHNlbmRpbmcgdGhlIG1lc3NhZ2UgdG8gTElNCisgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodFNpck1hY0FkZHIgKilwQnVmLCBic3NJZCwgc2l6ZW9mKCB0U2lyTWFjQWRkciApICk7IC8vcGVyTWFjQWRkciBpcyBwYXNzZWQgYXMgYnNzSWQgZm9yIHNvZnRBUAorICAgICAgICAgICAgcEJ1ZiA9IHBCdWYgKyBzaXplb2YgKCB0U2lyTWFjQWRkciApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2VuZGlmCisgICAgICAgICAgICAvLyBTZXQgdGhlIHBlZXIgTUFDIGFkZHJlc3MgYmVmb3JlIHNlbmRpbmcgdGhlIG1lc3NhZ2UgdG8gTElNCisgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodFNpck1hY0FkZHIgKilwQnVmLCBic3NJZCwgc2l6ZW9mKCB0U2lyTWFjQWRkciApICk7CisgICAgICAgICAgICBwQnVmID0gcEJ1ZiArIHNpemVvZiAoIHRTaXJNYWNBZGRyICk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0U2lyTWFjQWRkciAqKXBCdWYsIGJzc0lkLCBzaXplb2YoIHBNc2ctPmJzc0lkICkgKTsKKyAgICAgICAgICAgIHBCdWYgPSBwQnVmICsgc2l6ZW9mICggdFNpck1hY0FkZHIgKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlYXNvbkNvZGUKKyAgICAgICAgd1RtcCA9IHBhbF9jcHVfdG9fYmUxNihyZWFzb25Db2RlKTsKKyAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJndUbXAsIHNpemVvZih0QU5JX1UxNikgKTsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgICAgIC8qIFRoZSBzdGF0ZSB3aWxsIGJlIERJU0FTU09DX0hBTkRPRkYgb25seSB3aGVuIHdlIGFyZSBkb2luZyBoYW5kb2ZmLiAKKyAgICAgICAgICAgICAgICAgICAgSGVyZSB3ZSBzaG91bGQgbm90IHNlbmQgdGhlIGRpc2Fzc29jIG92ZXIgdGhlIGFpciB0byB0aGUgQVAgKi8KKyAgICAgICAgaWYgKCBDU1JfSVNfUk9BTV9TVUJTVEFURV9ESVNBU1NPQ19ITyhwTWFjLCBzZXNzaW9uSWQpCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgICAgICAgICAmJiBjc3JSb2FtSXMxMXJBc3NvYyhwTWFjKQorI2VuZGlmCisgICAgICAgICAgICkgICAgICAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgKnBCdWYgPSBDU1JfRE9OVF9TRU5EX0RJU0FTU09DX09WRVJfVEhFX0FJUjsgIC8qIFNldCBEb05vdFNlbmRPdmVyVGhlQWlyIGZsYWcgdG8gMSBvbmx5IGZvciBoYW5kb2ZmIGNhc2UgKi8KKyAgICAgICAgfQorICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1U4KTsKKyAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZSggcE1hYy0+aEhkZCwgcE1zZyApOworCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK2VIYWxTdGF0dXMgY3NyU2VuZE1CVGtpcENvdW50ZXJNZWFzdXJlc1JlcU1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0QU5JX0JPT0xFQU4gYkVuYWJsZSwgdFNpck1hY0FkZHIgYnNzSWQgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0U2lyU21lVGtpcENudHJNZWFzUmVxICpwTXNnOworICAgIHRBTklfVTggKnBCdWY7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIHNpemVvZiggdFNpclNtZVRraXBDbnRyTWVhc1JlcSApKTsKKyAgICAgICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKSBicmVhazsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTXNnLCBzaXplb2YoIHRTaXJTbWVUa2lwQ250ck1lYXNSZXEgKSk7CisgICAgICAgIHBNc2ctPm1lc3NhZ2VUeXBlID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNillV05JX1NNRV9US0lQX0NOVFJfTUVBU19SRVEpOworICAgICAgICBwTXNnLT5sZW5ndGggPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KXNpemVvZiggdFNpclNtZVRraXBDbnRyTWVhc1JlcSApKTsKKworICAgICAgICBwQnVmID0gJnBNc2ctPnNlc3Npb25JZDsKKyAgICAgICAgLy8gc2Vzc2lvbklkCisgICAgICAgICpwQnVmKysgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIC8vIHRyYW5zYWN0aW9uSWQKKyAgICAgICAgKnBCdWYgPSAwOworICAgICAgICAqKCBwQnVmICsgMSApID0gMDsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgICAgICAvLyBic3NpZAorICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTXNnLT5ic3NJZCwgYnNzSWQsIHNpemVvZiggdFNpck1hY0FkZHIgKSApOworICAgICAgICBwQnVmID0gcEJ1ZiArIHNpemVvZiAoIHRTaXJNYWNBZGRyICk7CisgICAgICAgIC8vIGJFbmFibGUKKyAgICAgICAgKnBCdWYgPSAodEFOSV9CT09MRUFOKWJFbmFibGU7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZSggcE1hYy0+aEhkZCwgcE1zZyApOworCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworZUhhbFN0YXR1cworY3NyU2VuZE1CR2V0QXNzb2NpYXRlZFN0YXNSZXFNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NT0RVTEVfSUQgbW9kSWQsIHRTaXJNYWNBZGRyIGJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFVzckNvbnRleHQsIHZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQXNzb2NTdGFzQnVmICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNpclNtZUdldEFzc29jU1RBc1JlcSAqcE1zZzsKKyAgICB0QU5JX1U4ICpwQnVmID0gTlVMTCwgKndUbXBCdWYgPSBOVUxMOworICAgIHRBTklfVTMyIGR3VG1wOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgc2l6ZW9mKCB0U2lyU21lR2V0QXNzb2NTVEFzUmVxICkgKTsKKyAgICAgICAgaWYgKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgYnJlYWs7CisgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBNc2csIHNpemVvZiggdFNpclNtZUdldEFzc29jU1RBc1JlcSApICk7CisgICAgICAgIHBNc2ctPm1lc3NhZ2VUeXBlID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNillV05JX1NNRV9HRVRfQVNTT0NfU1RBU19SRVEpOworCisgICAgICAgIHBCdWYgPSAodEFOSV9VOCAqKSZwTXNnLT5ic3NJZDsKKyAgICAgICAgd1RtcEJ1ZiA9IHBCdWY7CisKKyAgICAgICAgLy8gYnNzSWQKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRTaXJNYWNBZGRyICopcEJ1ZiwgYnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisgICAgICAgIC8vIG1vZElkIAorICAgICAgICBkd1RtcCA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpbW9kSWQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSZkd1RtcCwgc2l6ZW9mKHRBTklfVTE2KSk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKworICAgICAgICAvLyBwVXNyQ29udGV4dAorICAgICAgICBkd1RtcCA9IHBhbF9jcHVfdG9fYmUzMigodEFOSV9VMzIpcFVzckNvbnRleHQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSZkd1RtcCwgc2l6ZW9mKHRBTklfVTMyKSk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgICAgICAvLyBwZm5TYXBFdmVudENhbGxiYWNrCisgICAgICAgIGR3VG1wID0gcGFsX2NwdV90b19iZTMyKCh0QU5JX1UzMilwZm5TYXBFdmVudENhbGxiYWNrKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgKHRBTklfVTggKikmZHdUbXAsIHNpemVvZih0QU5JX1UzMikpOworICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICAgICAgLy8gcEFzc29jU3Rhc0J1ZgorICAgICAgICBkd1RtcCA9IHBhbF9jcHVfdG9fYmUzMigodEFOSV9VMzIpcEFzc29jU3Rhc0J1Zik7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICh0QU5JX1U4ICopJmR3VG1wLCBzaXplb2YodEFOSV9VMzIpKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMzIpOworCisgICAgICAgIHBNc2ctPmxlbmd0aCA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpKHNpemVvZih0QU5JX1UzMiApICsgKHBCdWYgLSB3VG1wQnVmKSkpOy8vbXNnX2hlYWRlciArIG1zZworCisgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UoIHBNYWMtPmhIZGQsIHBNc2cgKTsKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICByZXR1cm4oIHN0YXR1cyApOworICAgICAgICB9CisKK2VIYWxTdGF0dXMKK2NzclNlbmRNQkdldFdQU1BCQ1Nlc3Npb25zKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgYnNzSWQsIHZvaWQgKnBVc3JDb250ZXh0LCB2b2lkICpwZm5TYXBFdmVudENhbGxiYWNrLHZfTUFDQUREUl90IHBSZW1vdmVNYWMpCisgICAgICAgIHsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNpclNtZUdldFdQU1BCQ1Nlc3Npb25zUmVxICpwTXNnOworICAgIHRBTklfVTggKnBCdWYgPSBOVUxMLCAqd1RtcEJ1ZiA9IE5VTEw7CisgICAgdEFOSV9VMzIgZHdUbXA7CisKKyAgICBkbworICAgICAgICB7CisgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgc2l6ZW9mKHRTaXJTbWVHZXRXUFNQQkNTZXNzaW9uc1JlcSkgKTsKKyAgICAgICAgaWYgKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgYnJlYWs7CisgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBNc2csIHNpemVvZiggdFNpclNtZUdldFdQU1BCQ1Nlc3Npb25zUmVxICkgKTsKKyAgICAgICAgcE1zZy0+bWVzc2FnZVR5cGUgPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KWVXTklfU01FX0dFVF9XUFNQQkNfU0VTU0lPTl9SRVEpOworCisgICAgICAgIHBCdWYgPSAodEFOSV9VOCAqKSZwTXNnLT5wVXNyQ29udGV4dDsKKyAgICAgICAgd1RtcEJ1ZiA9IHBCdWY7CisKKyAgICAgICAgLy8gcFVzckNvbnRleHQKKyAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIoKHRBTklfVTMyKXBVc3JDb250ZXh0KTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgKHRBTklfVTggKikmZHdUbXAsIHNpemVvZih0QU5JX1UzMikpOworICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICAgICAgLy8gcFNhcEV2ZW50Q2FsbGJhY2sKKyAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIoKHRBTklfVTMyKXBmblNhcEV2ZW50Q2FsbGJhY2spOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSZkd1RtcCwgc2l6ZW9mKHRBTklfVTMyKSk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTMyKTsKKworICAgICAgICAvLyBic3NJZAorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodFNpck1hY0FkZHIgKilwQnVmLCBic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKyAgICAgICAgLy8gTUFDIEFkZHJlc3Mgb2YgU1RBIGluIFdQUyBzZXNzaW9uCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0U2lyTWFjQWRkciAqKXBCdWYsIHBSZW1vdmVNYWMuYnl0ZXMsIHNpemVvZih2X01BQ0FERFJfdCkpOworICAgICAgICBwQnVmICs9IHNpemVvZih2X01BQ0FERFJfdCk7CisKKyAgICAgICAgcE1zZy0+bGVuZ3RoID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNikoc2l6ZW9mKHRBTklfVTMyICkgKyAocEJ1ZiAtIHdUbXBCdWYpKSk7Ly9tc2dfaGVhZGVyICsgbXNnCisKKyAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZSggcE1hYy0+aEhkZCwgcE1zZyApOworCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKyNlbmRpZgorCitlSGFsU3RhdHVzIGNzclNlbmRNQkRlYXV0aFJlcU1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0U2lyTWFjQWRkciBic3NJZCwgdEFOSV9VMTYgcmVhc29uQ29kZSApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTaXJTbWVEZWF1dGhSZXEgKnBNc2c7CisgICAgdEFOSV9VOCAqcEJ1ZjsKKyAgICB0QU5JX1UxNiB3VG1wOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIGlmICghQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIHNlc3Npb25JZCApKQorICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgIGRvIHsKKyAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIHNpemVvZiggdFNpclNtZURlYXV0aFJlcSApKTsKKyAgICAgICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKSBicmVhazsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTXNnLCBzaXplb2YoIHRTaXJTbWVEZWF1dGhSZXEgKSk7CisgICAgICAgICAgICAgICAgcE1zZy0+bWVzc2FnZVR5cGUgPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KWVXTklfU01FX0RFQVVUSF9SRVEpOworICAgICAgICAgICAgICAgIHBNc2ctPmxlbmd0aCA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpc2l6ZW9mKCB0U2lyU21lRGVhdXRoUmVxICkpOworICAgICAgICAvL3Nlc3Npb25JZAorICAgICAgICBwQnVmID0gJnBNc2ctPnNlc3Npb25JZDsKKyAgICAgICAgKnBCdWYrKyA9ICh0QU5JX1U4KXNlc3Npb25JZDsKKyAgICAgICAgCisgICAgICAgIC8vdGFuc2FjdGlvbklkCisgICAgICAgICpwQnVmID0gMDsKKyAgICAgICAgKihwQnVmICsgMSApID0gMDsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgICAgIGlmICgocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSAhPSBOVUxMKSAgJiYgKAorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAoQ1NSX0lTX0lORlJBX0FQKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpKSB8fCAKKyNlbmRpZgorICAgICAgICAgICAgIChDU1JfSVNfV0RTX0FQKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpKSkpeyAKKyAgICAgICAgICAgIC8vIFNldCB0aGUgQlNTSUQgYmVmb3JlIHNlbmRpbmcgdGhlIG1lc3NhZ2UgdG8gTElNCisgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodFNpck1hY0FkZHIgKilwQnVmLCBwU2Vzc2lvbi0+c2VsZk1hY0FkZHIsIHNpemVvZiggcE1zZy0+cGVlck1hY0FkZHIgKSApOworICAgICAgICAgICAgcEJ1ZiA9ICBwQnVmICsgc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNldCB0aGUgQlNTSUQgYmVmb3JlIHNlbmRpbmcgdGhlIG1lc3NhZ2UgdG8gTElNCisgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodFNpck1hY0FkZHIgKilwQnVmLCBic3NJZCwgc2l6ZW9mKCBwTXNnLT5wZWVyTWFjQWRkciApICk7CisgICAgICAgICAgICBwQnVmID0gIHBCdWYgKyBzaXplb2YodFNpck1hY0FkZHIpOworCisgICAgICAgIH0KKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gICAgIAorICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcGVlciBNQUMgYWRkcmVzcyBiZWZvcmUgc2VuZGluZyB0aGUgbWVzc2FnZSB0byBMSU0KKyAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRTaXJNYWNBZGRyICopIHBCdWYsIGJzc0lkLCBzaXplb2YoIHBNc2ctPnBlZXJNYWNBZGRyICkgKTsKKyAgICAgICAgcEJ1ZiA9ICBwQnVmICsgc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gICAgIAorICAgICAgICB3VG1wID0gcGFsX2NwdV90b19iZTE2KHJlYXNvbkNvZGUpOworICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmd1RtcCxzaXplb2YoIHRBTklfVTE2ICkgKTsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZSggcE1hYy0+aEhkZCwgcE1zZyApOworCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworCitlSGFsU3RhdHVzIGNzclNlbmRNQkRpc2Fzc29jQ25mTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZURpc2Fzc29jSW5kIHBEaXNhc3NvY0luZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTaXJTbWVEaXNhc3NvY0NuZiAqcE1zZzsKKworICAgIGRvIHsKKyAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIHNpemVvZiggdFNpclNtZURpc2Fzc29jQ25mICkpOworICAgICAgICBpZiAoICFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSApIGJyZWFrOworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2csIHNpemVvZiggdFNpclNtZURpc2Fzc29jQ25mICkpOworICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfRElTQVNTT0NfQ05GKTsKKyAgICAgICAgcE1zZy0+c3RhdHVzQ29kZSA9ICh0U2lyUmVzdWx0Q29kZXMpcGFsX2NwdV90b19iZTMyKGVTSVJfU01FX1NVQ0NFU1MpOworICAgICAgICBwTXNnLT5sZW5ndGggPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KXNpemVvZiggdFNpclNtZURpc2Fzc29jQ25mICkpOworICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBNc2ctPnBlZXJNYWNBZGRyLCBwRGlzYXNzb2NJbmQtPnBlZXJNYWNBZGRyLCBzaXplb2YocE1zZy0+cGVlck1hY0FkZHIpKTsgCisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisvL1RvIHRlc3QgcmVjb25uICAgICAgICAKKyAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwTXNnLT5ic3NJZCwgcERpc2Fzc29jSW5kLT5ic3NJZCwgc2l6ZW9mKHBNc2ctPnBlZXJNYWNBZGRyKSk7IAorICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorLy9UbyB0ZXN0IHJlY29ubiBlbmRzCisKKyAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZSggcE1hYy0+aEhkZCwgcE1zZyApOworCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworCitlSGFsU3RhdHVzIGNzclNlbmRNQkRlYXV0aENuZk1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVEZWF1dGhJbmQgcERlYXV0aEluZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTaXJTbWVEZWF1dGhDbmYgKnBNc2c7CisKKyAgICBkbyB7CisgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTXNnLCBzaXplb2YoIHRTaXJTbWVEZWF1dGhDbmYgKSk7CisgICAgICAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkgYnJlYWs7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1zZywgc2l6ZW9mKCB0U2lyU21lRGVhdXRoQ25mICkpOworICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfREVBVVRIX0NORik7CisgICAgICAgIHBNc2ctPnN0YXR1c0NvZGUgPSAodFNpclJlc3VsdENvZGVzKXBhbF9jcHVfdG9fYmUzMihlU0lSX1NNRV9TVUNDRVNTKTsKKyAgICAgICAgcE1zZy0+bGVuZ3RoID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNilzaXplb2YoIHRTaXJTbWVEZWF1dGhDbmYgKSk7CisgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1zZy0+YnNzSWQsIHBEZWF1dGhJbmQtPmJzc0lkLCBzaXplb2YocE1zZy0+YnNzSWQpKTsgCisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1zZy0+cGVlck1hY0FkZHIsIHBEZWF1dGhJbmQtPnBlZXJNYWNBZGRyLCBzaXplb2YocE1zZy0+cGVlck1hY0FkZHIpKTsgCisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZSggcE1hYy0+aEhkZCwgcE1zZyApOworCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworZUhhbFN0YXR1cyBjc3JTZW5kQXNzb2NDbmZNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyU21lQXNzb2NJbmQgcEFzc29jSW5kLCBlSGFsU3RhdHVzIEhhbHN0YXR1cyApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTaXJTbWVBc3NvY0NuZiAqcE1zZzsKKyAgICB0QU5JX1U4ICpwQnVmOworICAgIHRTaXJSZXN1bHRDb2RlcyBzdGF0dXNDb2RlOworICAgIHRBTklfVTE2IHdUbXA7CisKKyAgICBkbyB7CisgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTXNnLCBzaXplb2YoIHRTaXJTbWVBc3NvY0NuZiApKTsKKyAgICAgICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKSBicmVhazsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTXNnLCBzaXplb2YoIHRTaXJTbWVBc3NvY0NuZiApKTsKKyAgICAgICAgICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfQVNTT0NfQ05GKTsKKyAgICAgICAgICAgICAgICBwTXNnLT5sZW5ndGggPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KXNpemVvZiggdFNpclNtZUFzc29jQ25mICkpOworCisgICAgICAgIHBCdWYgPSAodEFOSV9VOCAqKSZwTXNnLT5zdGF0dXNDb2RlOworICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MoSGFsc3RhdHVzKSkKKyAgICAgICAgICAgIHN0YXR1c0NvZGUgPSAodFNpclJlc3VsdENvZGVzKXBhbF9jcHVfdG9fYmUzMihlU0lSX1NNRV9TVUNDRVNTKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhdHVzQ29kZSA9ICh0U2lyUmVzdWx0Q29kZXMpcGFsX2NwdV90b19iZTMyKGVTSVJfU01FX0FTU09DX1JFRlVTRUQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmc3RhdHVzQ29kZSwgc2l6ZW9mKHRTaXJSZXN1bHRDb2RlcykgKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodFNpclJlc3VsdENvZGVzKTsKKyAgICAgICAgLy8gYnNzSWQKKyAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodFNpck1hY0FkZHIgKilwQnVmLCBwQXNzb2NJbmQtPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YgKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgLy8gcGVlck1hY0FkZHIKKyAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodFNpck1hY0FkZHIgKilwQnVmLCBwQXNzb2NJbmQtPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsgCisgICAgICAgIHBCdWYgKz0gc2l6ZW9mICh0U2lyTWFjQWRkcik7CisgICAgICAgIC8vIGFpZAorICAgICAgICB3VG1wID0gcGFsX2NwdV90b19iZTE2KHBBc3NvY0luZC0+YWlkKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJndUbXAsIHNpemVvZih0QU5JX1UxNikgKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YgKHRBTklfVTE2KTsKKyAgICAgICAgLy8gYWx0ZXJuYXRlQnNzSWQKKyAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodFNpck1hY0FkZHIgKilwQnVmLCBwQXNzb2NJbmQtPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YgKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgLy8gYWx0ZXJuYXRlQ2hhbm5lbElkCisgICAgICAgICpwQnVmID0gMTE7CisKKyAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZSggcE1hYy0+aEhkZCwgcE1zZyApOworICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vcE1zZyBpcyBmcmVlZCBieSBwYWxTZW5kTUJNZXNzYWdlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK2VIYWxTdGF0dXMgY3NyU2VuZEFzc29jSW5kVG9VcHBlckxheWVyQ25mTXNnKCAgIHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJTbWVBc3NvY0luZCBwQXNzb2NJbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUhhbFN0YXR1cyBIYWxzdGF0dXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBzZXNzaW9uSWQpCit7CisgICAgdFNpck1zZ1EgICAgICAgICAgICBtc2dROworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0U2lyU21lQXNzb2NJbmRUb1VwcGVyTGF5ZXJDbmYgKnBNc2c7CisgICAgdEFOSV9VOCAqcEJ1ZjsKKyAgICB0U2lyUmVzdWx0Q29kZXMgc3RhdHVzQ29kZTsKKyAgICB0QU5JX1UxNiB3VG1wOworCisgICAgZG8geworICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgc2l6ZW9mKCB0U2lyU21lQXNzb2NJbmRUb1VwcGVyTGF5ZXJDbmYgKSk7CisgICAgICAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkgYnJlYWs7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1zZywgc2l6ZW9mKCB0U2lyU21lQXNzb2NJbmRUb1VwcGVyTGF5ZXJDbmYgKSk7CisgICAgICAgIHBNc2ctPm1lc3NhZ2VUeXBlID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNillV05JX1NNRV9VUFBFUl9MQVlFUl9BU1NPQ19DTkYpOworICAgICAgICBwTXNnLT5sZW5ndGggPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KXNpemVvZiggdFNpclNtZUFzc29jSW5kVG9VcHBlckxheWVyQ25mICkpOworCisgICAgICAgIHBNc2ctPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworICAgICAgICBwQnVmID0gKHRBTklfVTggKikmcE1zZy0+c3RhdHVzQ29kZTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKEhhbHN0YXR1cykpCisgICAgICAgICAgICBzdGF0dXNDb2RlID0gKHRTaXJSZXN1bHRDb2RlcylwYWxfY3B1X3RvX2JlMzIoZVNJUl9TTUVfU1VDQ0VTUyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0YXR1c0NvZGUgPSAodFNpclJlc3VsdENvZGVzKXBhbF9jcHVfdG9fYmUzMihlU0lSX1NNRV9BU1NPQ19SRUZVU0VEKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJnN0YXR1c0NvZGUsIHNpemVvZih0U2lyUmVzdWx0Q29kZXMpICk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJSZXN1bHRDb2Rlcyk7CisgICAgICAgIC8vIGJzc0lkCisgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHRTaXJNYWNBZGRyICopcEJ1ZiwgcEFzc29jSW5kLT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mICh0U2lyTWFjQWRkcik7CisgICAgICAgIC8vIHBlZXJNYWNBZGRyCisgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHRTaXJNYWNBZGRyICopcEJ1ZiwgcEFzc29jSW5kLT5wZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7IAorICAgICAgICBwQnVmICs9IHNpemVvZiAodFNpck1hY0FkZHIpOworICAgICAgICAvLyBTdGFJZAorICAgICAgICB3VG1wID0gcGFsX2NwdV90b19iZTE2KHBBc3NvY0luZC0+c3RhSWQpOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmd1RtcCwgc2l6ZW9mKHRBTklfVTE2KSApOworICAgICAgICBwQnVmICs9IHNpemVvZiAodEFOSV9VMTYpOworICAgICAgICAvLyBhbHRlcm5hdGVCc3NJZAorICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh0U2lyTWFjQWRkciAqKXBCdWYsIHBBc3NvY0luZC0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBwQnVmICs9IHNpemVvZiAodFNpck1hY0FkZHIpOworICAgICAgICAvLyBhbHRlcm5hdGVDaGFubmVsSWQKKyAgICAgICAgKnBCdWYgPSAxMTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YgKHRBTklfVTgpOworCisgICAgICAgIC8vIEluc3RlYWQgb2YgY29weWluZyByb2FtIEluZm8sIHdlIGp1c3QgY29weSBvbmx5IFdtbUVuYWJsZWQgLCBSc25JRSBpbmZvcm1hdGlvbgorICAgICAgICAvL1dtbQorICAgICAgICAqcEJ1ZiA9IHBBc3NvY0luZC0+d21tRW5hYmxlZFN0YTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YgKHRBTklfVTgpOworCisgICAgICAgIC8vUlNOIElFCisgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHRTaXJSU05pZSAqKXBCdWYsICZwQXNzb2NJbmQtPnJzbklFLCBzaXplb2YodFNpclJTTmllKSk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mICh0U2lyUlNOaWUpOworCisgICAgICAgIC8vQWRkaXRpb25hbCBJRQorICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopcEJ1ZiwgJnBBc3NvY0luZC0+YWRkSUUsIHNpemVvZih0U2lyQWRkaWUpKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YgKHRTaXJBZGRpZSk7CisKKyAgICAgICAgLy9yZWFzc29jUmVxCisgICAgICAgICpwQnVmID0gcEFzc29jSW5kLT5yZWFzc29jUmVxOworICAgICAgICBwQnVmICs9IHNpemVvZiAodEFOSV9VOCk7CisKKyAgICAgICAgbXNnUS50eXBlID0gZVdOSV9TTUVfVVBQRVJfTEFZRVJfQVNTT0NfQ05GOworICAgICAgICBtc2dRLmJvZHlwdHIgPSBwTXNnOworICAgICAgICBtc2dRLmJvZHl2YWwgPSAwOworCisgICAgICAgIFN5c1Byb2Nlc3NNbWhNc2cocE1hYywgJm1zZ1EpOworCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKyNlbmRpZgorCisKK2VIYWxTdGF0dXMgY3NyU2VuZE1CU2V0Q29udGV4dFJlcU1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICwKKyAgICAgICAgICAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyLCB0QU5JX1U4IG51bUtleXMsIHRBbmlFZFR5cGUgZWRUeXBlLCAKKyAgICAgICAgICAgIHRBTklfQk9PTEVBTiBmVW5pY2FzdCwgdEFuaUtleURpcmVjdGlvbiBhbmlLZXlEaXJlY3Rpb24sCisgICAgICAgICAgICB0QU5JX1U4IGtleUlkLCB0QU5JX1U4IGtleUxlbmd0aCwgdEFOSV9VOCAqcEtleSwgdEFOSV9VOCBwYWVSb2xlLCAKKyAgICAgICAgICAgIHRBTklfVTggKnBLZXlSc2MgKQoreworICAgIHRTaXJTbWVTZXRDb250ZXh0UmVxICpwTXNnOworICAgIHRBTklfVTE2IG1zZ0xlbjsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdEFuaUVkVHlwZSB0bXBFZFR5cGU7CisgICAgdEFuaUtleURpcmVjdGlvbiB0bXBEaXJlY3Rpb247CisgICAgdEFOSV9VOCAqcEJ1ZjsKKyAgICB0QU5JX1U4ICpwOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgZG8geworCisgICAgICAgIGlmKCAoIDEgIT0gbnVtS2V5cyApICYmICggMCAhPSBudW1LZXlzICkgKSBicmVhazsKKworICAgICAgICAvLyBhbGwgb2YgdGhlc2UgZmllbGRzIGFwcGVhciBpbiBldmVyeSBTRVRfQ09OVEVYVCBtZXNzYWdlLiAgQmVsb3cgd2UnbGwgYWRkIGluIHRoZSBzaXplIGZvciBlYWNoIAorICAgICAgICAvLyBrZXkgc2V0LiBTaW5jZSB3ZSBvbmx5IHN1cHBvcnQgdXB0byBvbmUga2V5LCB3ZSBhbHdheXMgYWxsb2NhdGUgbWVtb3J5IGZvciAxIGtleQorICAgICAgICBtc2dMZW4gID0gc2l6ZW9mKCB0QU5JX1UxNikgKyBzaXplb2YoIHRBTklfVTE2ICkgKyBzaXplb2YoIHRTaXJNYWNBZGRyICkgKworICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0U2lyTWFjQWRkciApICsgMSArIHNpemVvZih0QU5JX1UxNikgKworICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBwTXNnLT5rZXlNYXRlcmlhbC5sZW5ndGggKSArIHNpemVvZiggcE1zZy0+a2V5TWF0ZXJpYWwuZWRUeXBlICkgKyBzaXplb2YoIHBNc2ctPmtleU1hdGVyaWFsLm51bUtleXMgKSArCisgICAgICAgICAgICAgICAgICAoIHNpemVvZiggcE1zZy0+a2V5TWF0ZXJpYWwua2V5ICkgKTsKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgbXNnTGVuKTsKKyAgICAgICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKSBicmVhazsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTXNnLCBtc2dMZW4pOworICAgICAgICAgICAgICAgIHBNc2ctPm1lc3NhZ2VUeXBlID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNillV05JX1NNRV9TRVRDT05URVhUX1JFUSk7CisgICAgICAgICAgICAgICAgcE1zZy0+bGVuZ3RoID0gcGFsX2NwdV90b19iZTE2KG1zZ0xlbik7CisKKyAgICAgICAgLy9zZXNzaW9uSWQKKyAgICAgICAgcEJ1ZiA9ICZwTXNnLT5zZXNzaW9uSWQ7CisgICAgICAgICpwQnVmID0gKHRBTklfVTgpc2Vzc2lvbklkOworICAgICAgICBwQnVmKys7CisgICAgICAgIC8vIHRyYW5zYWN0aW9uSWQKKyAgICAgICAgKnBCdWYgPSAwOworICAgICAgICAqKHBCdWYgKyAxKSA9IDA7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAgICAgICAgLy8gcGVlck1hY0FkZHIKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgCisgICAgICAgICAgICAgKHRBTklfVTggKilwZWVyTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworCisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKworICAgICAgICAvLyBic3NJZAorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAKKyAgICAgICAgICAgICh0QU5JX1U4ICopJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpICk7CisKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisgICAgICAgIHAgPSBwQnVmOworCisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBwTXNnLT5rZXlNYXRlcmlhbC5sZW5ndGggZmllbGQgKHRoaXMgbGVuZ3RoIGlzIGRlZmluZWQgYXMgYWxsIGRhdGEgdGhhdCBmb2xsb3dzIHRoZSBlZFR5cGUgZmllbGQKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgdFNpcktleU1hdGVyaWFsIGtleU1hdGVyaWFsOyBmaWVsZCkuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAhIU5PVEU6ICBUaGlzIGtleU1hdGVyaWFsLmxlbmd0aCBjb250YWlucyB0aGUgbGVuZ3RoIG9mIGEgTUFYIHNpemUga2V5LCB0aG91Z2ggdGhlIGtleUxlbmd0aCBjYW4gYmUgCisgICAgICAgICAgICAgICAgLy8gc2hvcnRlciB0aGFuIHRoaXMgbWF4IHNpemUuICBJcyBMSU0gaW50ZXJwcmV0aW5nIHRoaXMgb2sgPworICAgICAgICAgICAgICAgIHAgPSBwYWxfc2V0X1UxNiggcCwgcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNikoIHNpemVvZiggcE1zZy0+a2V5TWF0ZXJpYWwubnVtS2V5cyApICsgKCBudW1LZXlzICogc2l6ZW9mKCBwTXNnLT5rZXlNYXRlcmlhbC5rZXkgKSApICkpICk7CisKKyAgICAgICAgICAgICAgICAvLyBzZXQgcE1zZy0+a2V5TWF0ZXJpYWwuZWRUeXBlCisgICAgICAgIHRtcEVkVHlwZSA9ICh0QW5pRWRUeXBlKXBhbF9jcHVfdG9fYmUzMihlZFR5cGUpOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwLCAodEFOSV9VOCAqKSZ0bXBFZFR5cGUsIHNpemVvZih0QW5pRWRUeXBlKSApOworICAgICAgICBwICs9IHNpemVvZiggcE1zZy0+a2V5TWF0ZXJpYWwuZWRUeXBlICk7CisKKyAgICAgICAgLy8gc2V0IHRoZSBwTXNnLT5rZXlNYXRlcmlhbC5udW1LZXlzIGZpZWxkCisgICAgICAgICpwID0gbnVtS2V5czsKKyAgICAgICAgcCArPSBzaXplb2YoIHBNc2ctPmtleU1hdGVyaWFsLm51bUtleXMgKTsgICAKKworICAgICAgICAvLyBzZXQgcFNpcktleS0+a2V5SWQgPSBrZXlJZDsKKyAgICAgICAgKnAgPSBrZXlJZDsKKyAgICAgICAgcCArPSBzaXplb2YoIHBNc2ctPmtleU1hdGVyaWFsLmtleVsgMCBdLmtleUlkICk7CisKKyAgICAgICAgLy8gc2V0IHBTaXJLZXktPnVuaWNhc3QgPSAodEFOSV9VOClmVW5pY2FzdDsKKyAgICAgICAgKnAgPSAodEFOSV9VOClmVW5pY2FzdDsKKyAgICAgICAgcCArPSBzaXplb2YoIHBNc2ctPmtleU1hdGVyaWFsLmtleVsgMCBdLnVuaWNhc3QgKTsKKworICAgICAgICAgICAgICAgIC8vIHNldCBwU2lyS2V5LT5rZXlEaXJlY3Rpb24gPSBhbmlLZXlEaXJlY3Rpb247CisgICAgICAgIHRtcERpcmVjdGlvbiA9ICh0QW5pS2V5RGlyZWN0aW9uKXBhbF9jcHVfdG9fYmUzMihhbmlLZXlEaXJlY3Rpb24pOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwLCAodEFOSV9VOCAqKSZ0bXBEaXJlY3Rpb24sIHNpemVvZih0QW5pS2V5RGlyZWN0aW9uKSApOworICAgICAgICBwICs9IHNpemVvZih0QW5pS2V5RGlyZWN0aW9uKTsKKyAgICAgICAgLy8gICAgcFNpcktleS0+a2V5UnNjID0gOzsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcCwgcEtleVJzYywgQ1NSX01BWF9SU0NfTEVOICk7CisgICAgICAgIHAgKz0gc2l6ZW9mKCBwTXNnLT5rZXlNYXRlcmlhbC5rZXlbIDAgXS5rZXlSc2MgKTsKKworICAgICAgICAgICAgICAgIC8vIHNldCBwU2lyS2V5LT5wYWVSb2xlCisgICAgICAgICAgICAgICAgKnAgPSBwYWVSb2xlOyAgIC8vIDAgaXMgU3VwcGxpY2FudAorICAgICAgICAgICAgICAgIHArKzsKKworICAgICAgICAgICAgICAgIC8vIHNldCBwU2lyS2V5LT5rZXlMZW5ndGggPSBrZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgcCA9IHBhbF9zZXRfVTE2KCBwLCBwYWxfY3B1X3RvX2JlMTYoa2V5TGVuZ3RoKSApOworCisgICAgICAgIGlmICgga2V5TGVuZ3RoICYmIHBLZXkgKSAKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcCwgcEtleSwga2V5TGVuZ3RoICk7IAorICAgICAgICAgICAgaWYoa2V5TGVuZ3RoID09IDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiICBTTUUgU2V0IGtleUlkeCAoJWQpIGVuY1R5cGUoJWQpIGtleSA9ICUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlhcbiIsCisgICAgICAgICAgICAgICAga2V5SWQsIGVkVHlwZSwgcEtleVswXSwgcEtleVsxXSwgcEtleVsyXSwgcEtleVszXSwgcEtleVs0XSwKKyAgICAgICAgICAgICAgICBwS2V5WzVdLCBwS2V5WzZdLCBwS2V5WzddLCBwS2V5WzhdLAorICAgICAgICAgICAgICAgIHBLZXlbOV0sIHBLZXlbMTBdLCBwS2V5WzExXSwgcEtleVsxMl0sIHBLZXlbMTNdLCBwS2V5WzE0XSwgcEtleVsxNV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZShwTWFjLT5oSGRkLCBwTXNnKTsKKworICAgIH0gd2hpbGUoIDAgKTsKKworICAgIHJldHVybiggc3RhdHVzICk7Cit9CisKKworCitlSGFsU3RhdHVzIGNzclNlbmRNQlN0YXJ0QnNzUmVxTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtU3RhcnRCc3NQYXJhbXMgKnBQYXJhbSwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYyApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdFNpclNtZVN0YXJ0QnNzUmVxICpwTXNnOworICAgIHRBTklfVTggKnBCdWYgPSBOVUxMOworICAgIHRBTklfVTggICp3VG1wQnVmICA9IE5VTEw7CisgICAgdEFOSV9VMTYgbXNnTGVuLCB3VG1wOworICAgIHRBTklfVTMyIGR3VG1wOworICAgIHRTaXJOd1R5cGUgbndUeXBlOworICAgIHRBbmlDQlNlY29uZGFyeU1vZGUgY2JNb2RlOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB0QU5JX1UzMiBhdXRoVHlwZTsKKyNlbmRpZgorCisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgZG8geworICAgICAgICBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnN0YXR1c0NvZGUgPSBlU0lSX1NNRV9TVUNDRVNTOworICAgICAgICBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGUgPSAwOworICAgICAgICBtc2dMZW4gPSBzaXplb2YodFNpclNtZVN0YXJ0QnNzUmVxKTsKKyAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIG1zZ0xlbik7CisgICAgICAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkgYnJlYWs7CisKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTXNnLCBtc2dMZW4pOworICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfU1RBUlRfQlNTX1JFUSk7CisKKyAgICAgICAgcEJ1ZiA9ICZwTXNnLT5zZXNzaW9uSWQ7CisKKyAgICAgICAgd1RtcEJ1ZiA9IHBCdWY7CisKKyAgICAgICAgLy9zZXNzaW9uSWQKKyAgICAgICAgKnBCdWYgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIHBCdWYrKzsKKyAgICAgICAgLy8gdHJhbnNhY3Rpb25JZAorICAgICAgICAqcEJ1ZiA9IDA7CisgICAgICAgICoocEJ1ZiArIDEpID0gMDsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgICAgIC8vIGJzc2lkIAorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCBwUGFyYW0tPmJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpICk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgLy8gc2VsZk1hY0FkZHIKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcFNlc3Npb24tPnNlbGZNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpICk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJNYWNBZGRyKTsKKyAgICAgICAgLy8gYmVhY29uSW50ZXJ2YWwKKyAgICAgICAgaWYoIHBCc3NEZXNjICYmIHBCc3NEZXNjLT5iZWFjb25JbnRlcnZhbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdUbXAgPSBwYWxfY3B1X3RvX2JlMTYoIHBCc3NEZXNjLT5iZWFjb25JbnRlcnZhbCApOworICAgICAgICB9CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICBlbHNlIGlmKHBQYXJhbS0+YmVhY29uSW50ZXJ2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdUbXAgPSBwYWxfY3B1X3RvX2JlMTYoIHBQYXJhbS0+YmVhY29uSW50ZXJ2YWwgKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd1RtcCA9IHBhbF9jcHVfdG9fYmUxNiggV05JX0NGR19CRUFDT05fSU5URVJWQUxfU1RBREVGICk7CisgICAgICAgIH0KKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgJndUbXAsIHNpemVvZiggdEFOSV9VMTYgKSApOyAKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgICAgICAvLyBkb3QxMW1vZGUKKyAgICAgICAgKnBCdWYgPSAodEFOSV9VOCljc3JUcmFuc2xhdGVUb1dOSUNmZ0RvdDExTW9kZSggcE1hYywgcFBhcmFtLT51Q2ZnRG90MTFNb2RlICk7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgLy8gYnNzVHlwZQorICAgICAgICBkd1RtcCA9IHBhbF9jcHVfdG9fYmUzMiggY3NyVHJhbnNsYXRlQnNzdHlwZVRvTWFjVHlwZSggYnNzVHlwZSApICk7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICZkd1RtcCwgc2l6ZW9mKHRTaXJCc3NUeXBlKSApOworICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyQnNzVHlwZSk7CisgICAgICAgIC8vIHNzSWQKKyAgICAgICAgaWYoIHBQYXJhbS0+c3NJZC5sZW5ndGggKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzc0lkIGxlbgorICAgICAgICAgICAgKnBCdWYgPSBwUGFyYW0tPnNzSWQubGVuZ3RoOworICAgICAgICAgICAgcEJ1ZisrOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcFBhcmFtLT5zc0lkLnNzSWQsIHBQYXJhbS0+c3NJZC5sZW5ndGggKTsKKyAgICAgICAgICAgIHBCdWYgKz0gcFBhcmFtLT5zc0lkLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpwQnVmID0gMDsKKyAgICAgICAgICAgIHBCdWYrKzsgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IHRoZSBjaGFubmVsIElkCisgICAgICAgICpwQnVmID0gcFBhcmFtLT5vcGVyYXRpb25DaG47CisgICAgICAgIHBCdWYrKzsKKyAgICAgICAgLy9XaGF0IHNob3VsZCB3ZSByZWFsbHkgZG8gZm9yIHRoZSBjYm1vZGUuCisgICAgICAgIGNiTW9kZSA9ICh0QW5pQ0JTZWNvbmRhcnlNb2RlKXBhbF9jcHVfdG9fYmUzMihwUGFyYW0tPmNiTW9kZSk7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYsICh0QU5JX1U4ICopJmNiTW9kZSwgc2l6ZW9mKHRBbmlDQlNlY29uZGFyeU1vZGUpICk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlDQlNlY29uZGFyeU1vZGUpOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAvLyBTZXQgcHJpdmFjeQorICAgICAgICAqcEJ1ZiA9IHBQYXJhbS0+cHJpdmFjeTsKKyAgICAgICAgcEJ1ZisrOworIAorICAgICAgICAvL1NldCBVYXBzZCAKKyAgICAgICAgKnBCdWYgPSBwUGFyYW0tPkFwVWFwc2RFbmFibGU7CisgICAgICAgIHBCdWYrKzsKKworICAgICAgICAvL1NldCBTU0lEIGhpZGRlbgorICAgICAgICAqcEJ1ZiA9IHBQYXJhbS0+c3NpZEhpZGRlbjsKKyAgICAgICAgcEJ1ZisrOworCisgICAgICAgICpwQnVmID0gKHRBTklfVTgpcFBhcmFtLT5md2RXUFNQQkNQcm9iZVJlcTsKKyAgICAgICAgcEJ1ZisrOworICAgICAgICAKKyAgICAgICAgLy9IdCBwcm90ZWN0aW9uIEVuYWJsZS9EaXNhYmxlCisgICAgICAgICpwQnVmID0gKHRBTklfVTgpcFBhcmFtLT5wcm90RW5hYmxlZDsKKyAgICAgICAgcEJ1ZisrOworCisgICAgICAgIC8vRW5hYmxlIEJlYWNvbnMgdG8gUmVjZWl2ZSBmb3IgT0JTUyBwcm90ZWN0aW9uIEVuYWJsZS9EaXNhYmxlCisgICAgICAgICpwQnVmID0gKHRBTklfVTgpcFBhcmFtLT5vYnNzUHJvdEVuYWJsZWQ7CisgICAgICAgIHBCdWYrKzsKKworICAgICAgICAvL3NldCBjZmcgcmVsYXRlZCB0byBwcm90ZWN0aW9uCisgICAgICAgIHdUbXAgPSBwYWxfY3B1X3RvX2JlMTYoIHBQYXJhbS0+aHRfcHJvdGVjdGlvbiApOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmd1RtcCwgc2l6ZW9mKCB0QU5JX1UxNiApICk7IAorICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisKKyAgICAgICAgLy8gU2V0IEF1dGggdHlwZQorICAgICAgICBhdXRoVHlwZSA9IHBhbF9jcHVfdG9fYmUzMihwUGFyYW0tPmF1dGhUeXBlKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgKHRBTklfVTggKikmYXV0aFR5cGUsIHNpemVvZih0QU5JX1UzMikpOworICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICAgICAgLy8gU2V0IERUSU0KKyAgICAgICAgZHdUbXAgPSBwYWxfY3B1X3RvX2JlMzIocFBhcmFtLT5kdGltUGVyaW9kKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgKHRBTklfVTggKikmZHdUbXAsIHNpemVvZih0QU5JX1UzMikpOworICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UzMik7CisKKyAgICAgICAgLy8gU2V0IHdwc19zdGF0ZQorICAgICAgICAqcEJ1ZiA9IHBQYXJhbS0+d3BzX3N0YXRlOworICAgICAgICBwQnVmKys7CisKKyNlbmRpZgorICAgICAgICAvL1BlcnNvbmEKKyAgICAgICAgKnBCdWYgPSAodEFOSV9VOClwUGFyYW0tPmJzc1BlcnNvbmE7CisgICAgICAgIHBCdWYrKzsKKyAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIC8vIHNldCBSU04gSUUgCisgICAgICAgIGlmKCBwUGFyYW0tPm5SU05JRUxlbmd0aCA+IHNpemVvZihwTXNnLT5yc25JRS5yc25JRWRhdGEpICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwTXNnICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3VG1wID0gcGFsX2NwdV90b19iZTE2KCBwUGFyYW0tPm5SU05JRUxlbmd0aCApOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAmd1RtcCwgc2l6ZW9mKHRBTklfVTE2KSApOworICAgICAgICBwQnVmICs9IHNpemVvZih0QU5JX1UxNik7CisgICAgICAgIGlmKCB3VG1wICkKKyAgICAgICAgeworICAgICAgICAgICAgd1RtcCA9IHBQYXJhbS0+blJTTklFTGVuZ3RoOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcFBhcmFtLT5wUlNOSUUsIHdUbXAgKTsKKyAgICAgICAgICAgIHBCdWYgKz0gd1RtcDsKKyAgICAgICAgfQorICAgICAgICBud1R5cGUgPSAodFNpck53VHlwZSlwYWxfY3B1X3RvX2JlMzIocFBhcmFtLT5zaXJOd1R5cGUpOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQnVmLCAodEFOSV9VOCAqKSZud1R5cGUsIHNpemVvZih0U2lyTndUeXBlKSApOworICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyTndUeXBlKTsKKworICAgICAgICAqcEJ1ZiA9IHBQYXJhbS0+b3BlcmF0aW9uYWxSYXRlU2V0Lm51bVJhdGVzOyAvL3RTaXJNYWNSYXRlU2V0LT5udW1SYXRlcworICAgICAgICBwQnVmKys7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQucmF0ZSwgcFBhcmFtLT5vcGVyYXRpb25hbFJhdGVTZXQubnVtUmF0ZXMgKTsKKyAgICAgICAgcEJ1ZiArPSBwUGFyYW0tPm9wZXJhdGlvbmFsUmF0ZVNldC5udW1SYXRlcyA7CisgICAgICAgICpwQnVmKysgPSBwUGFyYW0tPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlczsKKyAgICAgICAgaWYoMCAhPSBwUGFyYW0tPmV4dGVuZGVkUmF0ZVNldC5udW1SYXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwgcFBhcmFtLT5leHRlbmRlZFJhdGVTZXQucmF0ZSwgcFBhcmFtLT5leHRlbmRlZFJhdGVTZXQubnVtUmF0ZXMgKTsKKyAgICAgICAgICAgIHBCdWYgKz0gcFBhcmFtLT5leHRlbmRlZFJhdGVTZXQubnVtUmF0ZXM7CisgICAgICAgIH0KKworICAgICAgICBtc2dMZW4gPSAodEFOSV9VMTYpKHNpemVvZih0QU5JX1UzMiApICsgKHBCdWYgLSB3VG1wQnVmKSk7IC8vbXNnX2hlYWRlciArIG1zZworICAgICAgICBwTXNnLT5sZW5ndGggPSBwYWxfY3B1X3RvX2JlMTYobXNnTGVuKTsKKyAgICAgICAgCisgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyk7CisKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworCitlSGFsU3RhdHVzIGNzclNlbmRNQlN0b3BCc3NSZXFNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRTaXJTbWVTdG9wQnNzUmVxICpwTXNnOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIHRBTklfVTggKnBCdWY7CisgICAgdEFOSV9VMTYgbXNnTGVuOworCisgICAgZG8geworICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLCAodm9pZCAqKikmcE1zZywgc2l6ZW9mKHRTaXJTbWVTdG9wQnNzUmVxKSk7CisgICAgICAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkgYnJlYWs7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1zZywgc2l6ZW9mKCB0U2lyU21lU3RvcEJzc1JlcSApKTsKKyAgICAgICAgcE1zZy0+bWVzc2FnZVR5cGUgPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KWVXTklfU01FX1NUT1BfQlNTX1JFUSk7CisgICAgICAgIHBCdWYgPSAmcE1zZy0+c2Vzc2lvbklkOworICAgICAgICAvL3Nlc3Npb25JZAorICAgICAgICAqcEJ1ZiA9ICh0QU5JX1U4KXNlc3Npb25JZDsKKyAgICAgICAgcEJ1ZisrOworICAgICAgICAvLyB0cmFuc2FjdGlvbklkCisgICAgICAgICpwQnVmID0gMDsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworICAgICAgICAvL3JlYXNvbiBjb2RlCisgICAgICAgICpwQnVmICA9IDA7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRTaXJSZXN1bHRDb2Rlcyk7CisgICAgICAgIC8vIGJzc2lkIAorICAgICAgICAvLyBpZiBCU1NUeXBlIGlzIFdEUyBzdGEsIHVzZSBzZWxmbWFjQWRkciBhcyBic3NpZCwgZWxzZSB1c2UgYnNzaWQgaW4gY29ubmVjdGVkUHJvZmlsZQorICAgICAgICBpZiggQ1NSX0lTX0NPTk5fV0RTX1NUQSgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwodEFOSV9VOCAqKSZwU2Vzc2lvbi0+c2VsZk1hY0FkZHIsICBzaXplb2YodFNpck1hY0FkZHIpICk7ICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJ1ZiwodEFOSV9VOCAqKSZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCwgIHNpemVvZih0U2lyTWFjQWRkcikgKTsgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworICAgICAgIG1zZ0xlbiA9IHNpemVvZih0QU5JX1UxNikgKyBzaXplb2YodEFOSV9VMTYpICsgMSArIHNpemVvZih0QU5JX1UxNikgKyBzaXplb2YodFNpclJlc3VsdENvZGVzKSArIHNpemVvZih0U2lyTWFjQWRkcik7CisgICAgICAgcE1zZy0+bGVuZ3RoID0gIHBhbF9jcHVfdG9fYmUxNihtc2dMZW4pOworCisgICAgICAgc3RhdHVzID0gIHBhbFNlbmRNQk1lc3NhZ2UoIHBNYWMtPmhIZGQsIHBNc2cgKTsKKyNpZiAwICAgICAgICAgICAgCisgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMsICh2b2lkICoqKSZwTXNnLCBzaXplb2YodFNpclNtZVN0b3BCc3NSZXEpKTsKKyAgICAgICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKSBicmVhazsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTXNnLCBzaXplb2YoIHRTaXJTbWVTdG9wQnNzUmVxICkpOworICAgICAgICAgICAgICAgIHBNc2ctPm1lc3NhZ2VUeXBlID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNillV05JX1NNRV9TVE9QX0JTU19SRVEpOworICAgICAgICAgICAgICAgIHBNc2ctPnJlYXNvbkNvZGUgPSAwOworICAgICAgICAvLyBic3NpZAorICAgICAgICAvLyBpZiBCU1NUeXBlIGlzIFdEUyBzdGEsIHVzZSBzZWxmbWFjQWRkciBhcyBic3NpZCwgZWxzZSB1c2UgYnNzaWQgaW4gY29ubmVjdGVkUHJvZmlsZQorICAgICAgICBpZiggQ1NSX0lTX0NPTk5fV0RTX1NUQSgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpICkKKyAgICAgICAgeworICAgICAgICAgICAgcGJCc3NpZCA9ICh0QU5JX1U4ICopJnBTZXNzaW9uLT5zZWxmTWFjQWRkcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBiQnNzaWQgPSAodEFOSV9VOCAqKSZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZDsKKyAgICAgICAgfQorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAmcE1zZy0+YnNzSWQsIHBiQnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyAgICAgICAgcE1zZy0+dHJhbnNhY3Rpb25JZCA9IDA7CisgICAgICAgIHBNc2ctPnNlc3Npb25JZCA9ICh0QU5JX1U4KXNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICBwTXNnLT5sZW5ndGggPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KXNpemVvZiggdFNpclNtZVN0b3BCc3NSZXEgKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZSggcE1hYy0+aEhkZCwgcE1zZyApOworI2VuZGlmICAgICAgICAgICAgICAgIAorICAgICAgICB9IHdoaWxlKCAwICk7CisKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorCisKK2VIYWxTdGF0dXMgY3NyUmVhc3NvYyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqcE1vZFByb2ZpbGVGaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBSb2FtSWQsIHZfQk9PTF90IGZGb3JjZSkKK3sKKworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdEFOSV9VMzIgcm9hbUlkID0gMDsKKyAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICBpZigoY3NySXNDb25uU3RhdGVDb25uZWN0ZWQocE1hYywgc2Vzc2lvbklkKSkgJiYKKyAgICAgIChmRm9yY2UgfHwgKCFwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCAmcE1vZFByb2ZpbGVGaWVsZHMsIAorICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUubW9kaWZ5UHJvZmlsZUZpZWxkcywgCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMpKSkpICkKKyAgIHsKKyAgICAgIHJvYW1JZCA9IEdFVF9ORVhUX1JPQU1fSUQoJnBNYWMtPnJvYW0pOworICAgICAgaWYocFJvYW1JZCkKKyAgICAgIHsKKyAgICAgICAgICpwUm9hbUlkID0gcm9hbUlkOworICAgICAgfQorCisKKyAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZVJlYXNzb2MocE1hYywgc2Vzc2lvbklkLCBOVUxMLCBwTW9kUHJvZmlsZUZpZWxkcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JTbWVJc3N1ZWRSZWFzc29jVG9TYW1lQVAsIHJvYW1JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVBTklfQk9PTEVBTl9GQUxTRSk7CisKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVIYWxTdGF0dXMgY3NyUm9hbVNlc3Npb25PcGVuZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0Q3NyUm9hbUluZm8gcm9hbUluZm87CisKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbykpOworICAgIHN0YXR1cyA9IGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1NFU1NJT05fT1BFTkVELCBlQ1NSX1JPQU1fUkVTVUxUX05PTkUpOworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworZUhhbFN0YXR1cyBjc3JQcm9jZXNzQWRkU3RhU2Vzc2lvblJzcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcE1zZykKK3sKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHRMaXN0RWxlbSAgICAgICAgICAgICAgICAgICAgICAgICAgKnBFbnRyeSA9IE5VTEw7CisgICB0U21lQ21kICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQ29tbWFuZCA9IE5VTEw7CisgICB0U2lyU21lQWRkU3RhU2VsZlJzcCAgICAgICAgICAgICAgICpwUnNwOworCisgICBkbworICAgeworICAgICAgaWYocE1zZyA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJpbiAlcyBtc2cgcHRyIGlzIE5VTExcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICAgIGlmKHBFbnRyeSkKKyAgICAgIHsKKyAgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgICBpZihlU21lQ29tbWFuZEFkZFN0YVNlc3Npb24gPT0gcENvbW1hbmQtPmNvbW1hbmQpCisgICAgICAgICB7CisgICAgICAgICAgICBwUnNwID0gKHRTaXJTbWVBZGRTdGFTZWxmUnNwKilwTXNnOworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCAiQWRkIFN0YSByc3Agc3RhdHVzID0gJWRcbiIsIHBSc3AtPnN0YXR1cyApOworICAgICAgICAgICAgLy9Ob3RoaW5nIHRvIGJlIGRvbmUuIE1heSBiZSBpbmRpY2F0ZSB0aGUgc2VsZiBzdGEgYWRkaXRpb24gc3VjY2VzcyBieSBjYWxsaW5nIHNlc3Npb24gY2FsbGJhY2sgKFRPRE8pLgorCisgICAgICAgICAgICBjc3JSb2FtU2Vzc2lvbk9wZW5lZChwTWFjLCBwQ29tbWFuZC0+c2Vzc2lvbklkKTsKKworICAgICAgICAgICAgLy9SZW1vdmUgdGhpcyBjb21tYW5kIG91dCBvZiB0aGUgYWN0aXZlIGxpc3QKKyAgICAgICAgICAgIGlmKGNzckxMUmVtb3ZlRW50cnkoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBwRW50cnksIExMX0FDQ0VTU19MT0NLKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vTm93IHB1dCB0aGlzIGNvbW1hbmQgYmFjayBvbiB0aGUgYXZpbGFibGUgY29tbWFuZCBsaXN0CisgICAgICAgICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZChwTWFjLCBwQ29tbWFuZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbWVQcm9jZXNzUGVuZGluZ1F1ZXVlKCBwTWFjICk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgImluICVzIGVXTklfU01FX0FERF9TVEFfU0VMRl9SU1AgUmVjZWl2ZWQgYnV0IE5PIEFkZCBzdGEgc2Vzc2lvbiBjb21tYW5kIGFyZSBBQ1RJVkUgLi4uXG4iLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiaW4gJXMgZVdOSV9TTUVfQUREX1NUQV9TRUxGX1JTUCBSZWNlaXZlZCBidXQgTk8gY29tbWFuZHMgYXJlIEFDVElWRSAuLi5cbiIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfSB3aGlsZSgwKTsKKworICAgcmV0dXJuIHN0YXR1czsKKworfQorCitlSGFsU3RhdHVzIGNzclNlbmRNQkFkZFNlbGZTdGFSZXFNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIG1hY0FkZHIgKQoreworICAgdFNpclNtZUFkZFN0YVNlbGZSZXEgKnBNc2c7CisgICB0QU5JX1UxNiBtc2dMZW47CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisKKyAgIGRvIHsKKworICAgICAgbXNnTGVuICA9IHNpemVvZiggdEFOSV9VMTYgKSArIHNpemVvZiggdEFOSV9VMTYgKSArIHNpemVvZiggdFNpck1hY0FkZHIgKSAvKisKKyAgICAgICAgIHNpemVvZiggdFNpckJzc1R5cGUgKSovOworCisgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgbXNnTGVuKTsKKyAgICAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkgYnJlYWs7CisKKyAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1zZywgbXNnTGVuKTsKKworICAgICAgcE1zZy0+bWVzZ1R5cGUgPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KWVXTklfU01FX0FERF9TVEFfU0VMRl9SRVEpOworICAgICAgcE1zZy0+bWVzZ0xlbiA9IHBhbF9jcHVfdG9fYmUxNihtc2dMZW4pOworCisgICAgICAvLyBzZWxmIHN0YXRpb24gYWRkcmVzcworICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKilwTXNnLT5zZWxmTWFjQWRkciwgKHRBTklfVTggKiltYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpICk7CisKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgic2VsZk1hYz0lMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4XG4iKSwgICAgICAgCisgICAgICAgICAgICBwTXNnLT5zZWxmTWFjQWRkclswXSwKKyAgICAgICAgICAgIHBNc2ctPnNlbGZNYWNBZGRyWzFdLAorICAgICAgICAgICAgcE1zZy0+c2VsZk1hY0FkZHJbMl0sCisgICAgICAgICAgICBwTXNnLT5zZWxmTWFjQWRkclszXSwKKyAgICAgICAgICAgIHBNc2ctPnNlbGZNYWNBZGRyWzRdLAorICAgICAgICAgICAgcE1zZy0+c2VsZk1hY0FkZHJbNV0pOworICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZShwTWFjLT5oSGRkLCBwTXNnKTsKKworICAgfSB3aGlsZSggMCApOworCisgICByZXR1cm4oIHN0YXR1cyApOworfQorCitlSGFsU3RhdHVzIGNzcklzc3VlQWRkU3RhRm9yU2Vzc2lvblJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRTaXJNYWNBZGRyIHNlc3Npb25NYWNBZGRyKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdFNtZUNtZCAqcENvbW1hbmQ7CisKKyAgIHBDb21tYW5kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlcihwTWFjKTsKKyAgIGlmKE5VTEwgPT0gcENvbW1hbmQpCisgICB7CisgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kQWRkU3RhU2Vzc2lvbjsKKyAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQ29tbWFuZC0+dS5hZGRTdGFTZXNzaW9uQ21kLnNlbGZNYWNBZGRyLCBzZXNzaW9uTWFjQWRkciwgc2l6ZW9mKCB0U2lyTWFjQWRkciApICk7CisKKyAgICAgIHN0YXR1cyA9IGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwQ29tbWFuZCwgVFJVRSk7CisgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgeworICAgICAgICAgLy9TaG91bGQgYmUgcGFuaWM/PworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzICk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworZUhhbFN0YXR1cyBjc3JQcm9jZXNzQWRkU3RhU2Vzc2lvbkNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICkKK3sKKyAgIHJldHVybiBjc3JTZW5kTUJBZGRTZWxmU3RhUmVxTXNnKCBwTWFjLCAKKyAgICAgICAgIHBDb21tYW5kLT51LmFkZFN0YVNlc3Npb25DbWQuc2VsZk1hY0FkZHIgKTsKK30KKworZUhhbFN0YXR1cyBjc3JSb2FtT3BlblNlc3Npb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIGNzclJvYW1Db21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFNlbGZNYWNBZGRyLCB0QU5JX1U4ICpwYlNlc3Npb25JZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRBTklfVTMyIGk7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworICAgICpwYlNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisgICAgZm9yKCBpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoICFDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgaSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIGkgKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgcFNlc3Npb24tPnNlc3Npb25JZCA9ICh0QU5JX1U4KWk7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICBwU2Vzc2lvbi0+cENvbnRleHQgPSBwQ29udGV4dDsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICZwU2Vzc2lvbi0+c2VsZk1hY0FkZHIsIHBTZWxmTWFjQWRkciwgc2l6ZW9mKHRDc3JCc3NpZCkgKTsKKyAgICAgICAgICAgICpwYlNlc3Npb25JZCA9ICh0QU5JX1U4KWk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbFRpbWVyQWxsb2MocE1hYy0+aEhkZCwgJnBTZXNzaW9uLT5oVGltZXJSb2FtaW5nLCBjc3JSb2FtUm9hbWluZ1RpbWVySGFuZGxlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPnJvYW1pbmdUaW1lckluZm8pOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgUm9hbWluZyB0aW1lclxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorICAgICAgICAgICAgc3RhdHVzID0gcGFsVGltZXJBbGxvYyhwTWFjLT5oSGRkLCAmcFNlc3Npb24tPmhUaW1lckpvaW5SZXRyeSwgY3NyUm9hbUpvaW5SZXRyeVRpbWVySGFuZGxlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmpvaW5SZXRyeVRpbWVySW5mbyk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBqb2lucmV0cnkgdGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgcFNlc3Npb24tPmlic3NKb2luVGltZXJJbmZvLnBNYWMgPSBwTWFjOworICAgICAgICAgICAgcFNlc3Npb24tPmlic3NKb2luVGltZXJJbmZvLnNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbFRpbWVyQWxsb2MocE1hYy0+aEhkZCwgJnBTZXNzaW9uLT5oVGltZXJJYnNzSm9pbmluZywgY3NyUm9hbUlic3NKb2luVGltZXJIYW5kbGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU2Vzc2lvbi0+aWJzc0pvaW5UaW1lckluZm8pOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgSWJzc0pvaW5pbmcgdGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IGNzcklzc3VlQWRkU3RhRm9yU2Vzc2lvblJlcSAoIHBNYWMsIGksIHBTZWxmTWFjQWRkciApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoIENTUl9ST0FNX1NFU1NJT05fTUFYID09IGkgKQorICAgIHsKKyAgICAgICAgLy9ObyBzZXNzaW9uIGlzIGF2YWlsYWJsZQorICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICAgfQorCisgICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKK2VIYWxTdGF0dXMgY3NyUHJvY2Vzc0RlbFN0YVNlc3Npb25Sc3AoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBNc2cpCit7CisgICBlSGFsU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0TGlzdEVsZW0gICAgICAgICAgICAgICAgICAgICAgICAgICpwRW50cnkgPSBOVUxMOworICAgdFNtZUNtZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcENvbW1hbmQgPSBOVUxMOworICAgdFNpclNtZURlbFN0YVNlbGZSc3AgICAgICAgICAgICAgICAqcFJzcDsKKworICAgZG8KKyAgIHsKKyAgICAgIGlmKHBNc2cgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiaW4gJXMgbXNnIHB0ciBpcyBOVUxMXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLICk7CisgICAgICBpZihwRW50cnkpCisgICAgICB7CisgICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworICAgICAgICAgaWYoZVNtZUNvbW1hbmREZWxTdGFTZXNzaW9uID09IHBDb21tYW5kLT5jb21tYW5kKQorICAgICAgICAgeworICAgICAgICAgICAgdEFOSV9VOCBzZXNzaW9uSWQgPSBwQ29tbWFuZC0+c2Vzc2lvbklkOworCisgICAgICAgICAgICBwUnNwID0gKHRTaXJTbWVEZWxTdGFTZWxmUnNwKilwTXNnOworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCAiRGVsIFN0YSByc3Agc3RhdHVzID0gJWRcbiIsIHBSc3AtPnN0YXR1cyApOworCisgICAgICAgICAgICAvL1RoaXMgc2Vzc2lvbiBpcyBkb25lLgorICAgICAgICAgICAgY3NyQ2xlYW51cFNlc3Npb24ocE1hYywgc2Vzc2lvbklkKTsKKworICAgICAgICAgICAgaWYocENvbW1hbmQtPnUuZGVsU3RhU2Vzc2lvbkNtZC5jYWxsYmFjaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgICAgICAgICAgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LmRlbFN0YVNlc3Npb25DbWQuY2FsbGJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LmRlbFN0YVNlc3Npb25DbWQucENvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dQLCAiJXM6IEZhaWxlZCB0byBBY3F1aXJlIExvY2tcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiVzOiBGYWlsZWQgdG8gUmVsZWFzZSBMb2NrXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gCisgICAKKyAgICAgICAgICAgIC8vUmVtb3ZlIHRoaXMgY29tbWFuZCBvdXQgb2YgdGhlIGFjdGl2ZSBsaXN0CisgICAgICAgICAgICBpZihjc3JMTFJlbW92ZUVudHJ5KCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTE9DSykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL05vdyBwdXQgdGhpcyBjb21tYW5kIGJhY2sgb24gdGhlIGF2aWxhYmxlIGNvbW1hbmQgbGlzdAorICAgICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmQocE1hYywgcENvbW1hbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc21lUHJvY2Vzc1BlbmRpbmdRdWV1ZSggcE1hYyApOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJpbiAlcyBlV05JX1NNRV9ERUxfU1RBX1NFTEZfUlNQIFJlY2VpdmVkIGJ1dCBOTyBEZWwgc3RhIHNlc3Npb24gY29tbWFuZCBhcmUgQUNUSVZFIC4uLlxuIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgImluICVzIGVXTklfU01FX0RFTF9TVEFfU0VMRl9SU1AgUmVjZWl2ZWQgYnV0IE5PIGNvbW1hbmRzIGFyZSBBQ1RJVkUgLi4uXG4iLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0gd2hpbGUoMCk7CisKKyAgIHJldHVybiBzdGF0dXM7CisKK30KKworZUhhbFN0YXR1cyBjc3JTZW5kTUJEZWxTZWxmU3RhUmVxTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjQWRkciBtYWNBZGRyICkKK3sKKyAgIHRTaXJTbWVEZWxTdGFTZWxmUmVxICpwTXNnOworICAgdEFOSV9VMTYgbXNnTGVuOworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworCisgICBkbyB7CisKKyAgICAgIG1zZ0xlbiAgPSBzaXplb2YoIHRBTklfVTE2ICkgKyBzaXplb2YoIHRBTklfVTE2ICkgKyBzaXplb2YoIHRTaXJNYWNBZGRyICkgLyorCisgICAgICAgICBzaXplb2YoIHRTaXJCc3NUeXBlICkqLzsKKworICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIG1zZ0xlbik7CisgICAgICBpZiAoICFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSApIGJyZWFrOworICAgCisgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2csIG1zZ0xlbik7CisKKyAgICAgIHBNc2ctPm1lc2dUeXBlID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNillV05JX1NNRV9ERUxfU1RBX1NFTEZfUkVRKTsKKyAgICAgIHBNc2ctPm1lc2dMZW4gPSBwYWxfY3B1X3RvX2JlMTYobXNnTGVuKTsKKworICAgICAgLy8gc2VsZiBzdGF0aW9uIGFkZHJlc3MKKyAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopcE1zZy0+c2VsZk1hY0FkZHIsICh0QU5JX1U4ICopbWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworCisgICAgICBzdGF0dXMgPSBwYWxTZW5kTUJNZXNzYWdlKHBNYWMtPmhIZGQsIHBNc2cpOworCisgICB9IHdoaWxlKCAwICk7CisKKyAgIHJldHVybiggc3RhdHVzICk7Cit9CisKK2VIYWxTdGF0dXMgY3NySXNzdWVEZWxTdGFGb3JTZXNzaW9uUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyIHNlc3Npb25NYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbVNlc3Npb25DbG9zZUNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENvbnRleHQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdFNtZUNtZCAqcENvbW1hbmQ7CisKKyAgIHBDb21tYW5kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlcihwTWFjKTsKKyAgIGlmKE5VTEwgPT0gcENvbW1hbmQpCisgICB7CisgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kRGVsU3RhU2Vzc2lvbjsKKyAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICBwQ29tbWFuZC0+dS5kZWxTdGFTZXNzaW9uQ21kLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICBwQ29tbWFuZC0+dS5kZWxTdGFTZXNzaW9uQ21kLnBDb250ZXh0ID0gcENvbnRleHQ7CisgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQ29tbWFuZC0+dS5kZWxTdGFTZXNzaW9uQ21kLnNlbGZNYWNBZGRyLCBzZXNzaW9uTWFjQWRkciwgc2l6ZW9mKCB0U2lyTWFjQWRkciApICk7CisKKyAgICAgIHN0YXR1cyA9IGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwQ29tbWFuZCwgVFJVRSk7CisgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgeworICAgICAgICAgLy9TaG91bGQgYmUgcGFuaWM/PworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzICk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworZUhhbFN0YXR1cyBjc3JQcm9jZXNzRGVsU3RhU2Vzc2lvbkNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICkKK3sKKyAgIHJldHVybiBjc3JTZW5kTUJEZWxTZWxmU3RhUmVxTXNnKCBwTWFjLCAKKyAgICAgICAgIHBDb21tYW5kLT51LmRlbFN0YVNlc3Npb25DbWQuc2VsZk1hY0FkZHIgKTsKK30KKworc3RhdGljIHZvaWQgcHVyZ2VDc3JTZXNzaW9uQ21kTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICAgdERibExpbmtMaXN0ICpwTGlzdCA9ICZwTWFjLT5yb2FtLnJvYW1DbWRQZW5kaW5nTGlzdDsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeSwgKnBOZXh0OworICAgIHRTbWVDbWQgKnBDb21tYW5kOworICAgIHREYmxMaW5rTGlzdCBsb2NhbExpc3Q7CisKKyAgICB2b3NfbWVtX3plcm8oJmxvY2FsTGlzdCwgc2l6ZW9mKHREYmxMaW5rTGlzdCkpOworICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyTExPcGVuKHBNYWMtPmhIZGQsICZsb2NhbExpc3QpKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWxlZCB0byBvcGVuIGxpc3QiKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjc3JMTExvY2socExpc3QpOworICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQocExpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworICAgIHdoaWxlKHBFbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcE5leHQgPSBjc3JMTE5leHQocExpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyk7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgIGlmKHBDb21tYW5kLT5zZXNzaW9uSWQgPT0gc2Vzc2lvbklkKQorICAgICAgICB7CisgICAgICAgICAgICBpZihjc3JMTFJlbW92ZUVudHJ5KHBMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzckxMSW5zZXJ0VGFpbCgmbG9jYWxMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBFbnRyeSA9IHBOZXh0OworICAgIH0KKyAgICBjc3JMTFVubG9jayhwTGlzdCk7CisKKyAgICB3aGlsZSggKHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZCgmbG9jYWxMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKSkgKQorICAgIHsKKyAgICAgICAgcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRTbWVDbWQsIExpbmsgKTsKKyAgICAgICAgY3NyQWJvcnRDb21tYW5kKHBNYWMsIHBDb21tYW5kLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgfQorICAgIGNzckxMQ2xvc2UoJmxvY2FsTGlzdCk7Cit9CisKKwordm9pZCBjc3JDbGVhbnVwU2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgeworICAgICAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKworICAgICAgICBjc3JSb2FtU3RvcChwTWFjLCBzZXNzaW9uSWQpOworICAgICAgICBjc3JGcmVlQ29ubmVjdEJzc0Rlc2MocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgICAgY3NyUm9hbUZyZWVDb25uZWN0UHJvZmlsZSggcE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlICk7CisgICAgICAgIGNzclJvYW1GcmVlQ29ubmVjdGVkSW5mbyAoIHBNYWMsICZwU2Vzc2lvbi0+Y29ubmVjdGVkSW5mbyk7CisgICAgICAgIHBhbFRpbWVyRnJlZShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+aFRpbWVyUm9hbWluZyk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0JUQU1QX1VUX1JGCisgICAgICAgIHBhbFRpbWVyRnJlZShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+aFRpbWVySm9pblJldHJ5KTsKKyNlbmRpZgorICAgICAgICBwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcFNlc3Npb24tPmhUaW1lcklic3NKb2luaW5nKTsKKyAgICAgICAgcHVyZ2VTbWVTZXNzaW9uQ21kTGlzdChwTWFjLCBzZXNzaW9uSWQpOworICAgICAgICBwdXJnZUNzclNlc3Npb25DbWRMaXN0KHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgIGNzckluaXRTZXNzaW9uKHBNYWMsIHNlc3Npb25JZCk7CisgICAgfQorfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbUNsb3NlU2Vzc2lvbiggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX0JPT0xFQU4gZlN5bmMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtU2Vzc2lvbkNsb3NlQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDb250ZXh0ICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICB7CisgICAgICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgICAgICBpZihmU3luYykKKyAgICAgICAgeworICAgICAgICAgICAgY3NyQ2xlYW51cFNlc3Npb24ocE1hYywgc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgCisgICAgICAgICAgICBwdXJnZVNtZVNlc3Npb25DbWRMaXN0KHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICBwdXJnZUNzclNlc3Npb25DbWRMaXN0KHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JJc3N1ZURlbFN0YUZvclNlc3Npb25SZXEoIHBNYWMsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2VsZk1hY0FkZHIsIGNhbGxiYWNrLCBwQ29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKKworc3RhdGljIHZvaWQgY3NySW5pdFNlc3Npb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApCit7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBwU2Vzc2lvbi0+c2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKyAgICBwU2Vzc2lvbi0+Y2FsbGJhY2sgPSBOVUxMOworICAgIHBTZXNzaW9uLT5wQ29udGV4dCA9IE5VTEw7CisgICAgcFNlc3Npb24tPmlic3Nfam9pbl9wZW5kaW5nID0gRkFMU0U7CisgICAgcFNlc3Npb24tPmNvbm5lY3RTdGF0ZSA9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9OT1RfQ09OTkVDVEVEOworICAgIC8vIFRPRE8gOiBDb25maXJtIHBNYWMtPnJvYW0uZlJlYWR5Rm9yUG93ZXJTYXZlID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIGNzckZyZWVSb2FtUHJvZmlsZSggcE1hYywgc2Vzc2lvbklkICk7CisgICAgY3NyUm9hbUZyZWVDb25uZWN0UHJvZmlsZShwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpOworICAgIGNzclJvYW1GcmVlQ29ubmVjdGVkSW5mbyggcE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRJbmZvICk7CisgICAgY3NyRnJlZUNvbm5lY3RCc3NEZXNjKHBNYWMsIHNlc3Npb25JZCk7CisgICAgY3NyU2NhbkVuYWJsZShwTWFjKTsKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAmcFNlc3Npb24tPnNlbGZNYWNBZGRyLCBzaXplb2YodENzckJzc2lkKSApOworICAgIGlmKHBTZXNzaW9uLT5wV3BhUnNuUmVxSUUpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5wV3BhUnNuUmVxSUUpOworICAgICAgICBwU2Vzc2lvbi0+cFdwYVJzblJlcUlFID0gTlVMTDsKKyAgICB9CisgICAgcFNlc3Npb24tPm5XcGFSc25SZXFJZUxlbmd0aCA9IDA7CisgICAgaWYocFNlc3Npb24tPnBXcGFSc25Sc3BJRSkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBXcGFSc25Sc3BJRSk7CisgICAgICAgIHBTZXNzaW9uLT5wV3BhUnNuUnNwSUUgPSBOVUxMOworICAgIH0KKyAgICBwU2Vzc2lvbi0+bldwYVJzblJzcEllTGVuZ3RoID0gMDsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgIGlmKHBTZXNzaW9uLT5wV2FwaVJlcUlFKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+cFdhcGlSZXFJRSk7CisgICAgICAgIHBTZXNzaW9uLT5wV2FwaVJlcUlFID0gTlVMTDsKKyAgICB9CisgICAgcFNlc3Npb24tPm5XYXBpUmVxSWVMZW5ndGggPSAwOworICAgIGlmKHBTZXNzaW9uLT5wV2FwaVJzcElFKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+cFdhcGlSc3BJRSk7CisgICAgICAgIHBTZXNzaW9uLT5wV2FwaVJzcElFID0gTlVMTDsKKyAgICB9CisgICAgcFNlc3Npb24tPm5XYXBpUnNwSWVMZW5ndGggPSAwOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyAgICBpZihwU2Vzc2lvbi0+cEFkZElFU2NhbikKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBBZGRJRVNjYW4pOworICAgICAgICBwU2Vzc2lvbi0+cEFkZElFU2NhbiA9IE5VTEw7CisgICAgfQorICAgIHBTZXNzaW9uLT5uQWRkSUVTY2FuTGVuZ3RoID0gMDsKKworICAgIGlmKHBTZXNzaW9uLT5wQWRkSUVBc3NvYykKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBBZGRJRUFzc29jKTsKKyAgICAgICAgcFNlc3Npb24tPnBBZGRJRUFzc29jID0gTlVMTDsKK30KKyAgICBwU2Vzc2lvbi0+bkFkZElFQXNzb2NMZW5ndGggPSAwOworCit9CisKKworZUhhbFN0YXR1cyBjc3JSb2FtR2V0U2Vzc2lvbklkRnJvbUJTU0lEKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQnNzaWQgKmJzc2lkLCB0QU5JX1UzMiAqcFNlc3Npb25JZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRBTklfVTMyIGk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKyApCisgICAgeworICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIGkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjc3JJc01hY0FkZHJlc3NFcXVhbCggcE1hYywgYnNzaWQsICZwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW2ldLmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9Gb3VuZCBpdAorICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgKnBTZXNzaW9uSWQgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworCisvL1RoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHdlIG9ubHkgc3VwcG9ydCBvbmUgSUJTUyBzZXNzaW9uLiBXZSBjYW5ub3QgdXNlIEJTU0lEIHRvIGlkZW50aWZ5IAorLy9zZXNzaW9uIGJlY2F1c2UgZm9yIElCU1MsIHRoZSBic3NpZCBjaGFuZ2VzLgorc3RhdGljIHRBTklfVTMyIGNzckZpbmRJYnNzU2Vzc2lvbiggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgICAgdEFOSV9VMzIgaSwgblJldCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworICAgIGZvciggaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgaSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIGkgKTsKKyAgICAgICAgICAgIGlmKCBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlICYmICggY3NySXNCc3NUeXBlSUJTUyggcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuQlNTVHlwZSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vRm91bmQgaXQKKyAgICAgICAgICAgICAgICBuUmV0ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoblJldCk7Cit9CisKK3N0YXRpYyB2b2lkIGNzclJvYW1MaW5rVXAodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckJzc2lkIGJzc2lkKQoreworICAgLyogVXBkYXRlIHRoZSBjdXJyZW50IEJTUyBpbmZvIGluIGhvIGNvbnRyb2wgYmxvY2sgYmFzZWQgb24gY29ubmVjdGVkIAorICAgICAgcHJvZmlsZSBpbmZvIGZyb20gcG1hYyBnbG9iYWwgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgIAorCisgICBzbXNMb2cocE1hYywgTE9HVywgIiBjc3JSb2FtTGlua1VwOiBXTEFOIGxpbmsgVVAgd2l0aCBBUD0gJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnhcbiIsIAorICAgICAgICAgIGJzc2lkWyAwIF0sIGJzc2lkWyAxIF0sIGJzc2lkWyAyIF0sCisgICAgICAgICAgYnNzaWRbIDMgXSwgYnNzaWRbIDQgXSwgYnNzaWRbIDUgXSApOworCisgICAvKiBDaGVjayBmb3IgdXNlciBtaXNjb25maWcgb2YgUlNTSSB0cmlnZ2VyIHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICovCisgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnZjY1Jzc2lUaHJlc2hvbGQgPQorICAgICAgKCAwID09IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0udmNjUnNzaVRocmVzaG9sZCApID8gCisgICAgICBDU1JfVkNDX1JTU0lfVEhSRVNIT0xEIDogcE1hYy0+cm9hbS5jb25maWdQYXJhbS52Y2NSc3NpVGhyZXNob2xkOworICAgcE1hYy0+cm9hbS52Y2NMaW5rUXVhbGl0eSA9IGVDU1JfUk9BTV9MSU5LX1FVQUxfUE9PUl9JTkQ7CisKKyAgICAvKiBDaGVjayBmb3IgdXNlciBtaXNjb25maWcgb2YgVUwgTUFDIExvc3MgdHJpZ2dlciB0aHJlc2hvbGQgICAgICAgICAgICovCisgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnZjY1VsTWFjTG9zc1RocmVzaG9sZCA9CisgICAgICAoIDAgPT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS52Y2NVbE1hY0xvc3NUaHJlc2hvbGQgKSA/IAorICAgICAgQ1NSX1ZDQ19VTF9NQUNfTE9TU19USFJFU0hPTEQgOiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnZjY1VsTWFjTG9zc1RocmVzaG9sZDsKKworI2lmICAgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworICAgIHsKKyAgICAgICAgdEFOSV9VMzIgc2Vzc2lvbklkID0gMDsKKworICAgICAgICAvKiBJbmRpY2F0ZSB0aGUgbmVpZ2hib3Igcm9hbCBhbGdvcml0aG0gYWJvdXQgdGhlIGNvbm5lY3QgaW5kaWNhdGlvbiAqLworICAgICAgICBjc3JSb2FtR2V0U2Vzc2lvbklkRnJvbUJTU0lEKHBNYWMsICh0Q3NyQnNzaWQgKilic3NpZCwgJnNlc3Npb25JZCk7CisgICAgICAgIGNzck5laWdoYm9yUm9hbUluZGljYXRlQ29ubmVjdChwTWFjLCBzZXNzaW9uSWQsIFZPU19TVEFUVVNfU1VDQ0VTUyk7CisgICAgfQorI2VuZGlmCisKK30KKworCitzdGF0aWMgdm9pZCBjc3JSb2FtTGlua0Rvd24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgIC8vT25seSB0byBoYW5kbGUgdGhlIGNhc2UgZm9yIEhhbmRvdmVyIG9uIGluZnJhIGxpbmsKKyAgIGlmKCBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFICE9IHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGUgKQorICAgeworICAgICAgcmV0dXJuOworICAgfQorCisKKyAgIC8qIGRlcmVnaXN0ZXIgdGhlIGNsaWVudHMgcmVxdWVzdGluZyBzdGF0cyBmcm9tIFBFL1RMICYgYWxzbyBzdG9wIHRoZSBjb3JyZXNwb25kaW5nIHRpbWVycyovCisgICBjc3JSb2FtRGVyZWdTdGF0aXN0aWNzUmVxKHBNYWMpOworICAgcE1hYy0+cm9hbS52Y2NMaW5rUXVhbGl0eSA9IGVDU1JfUk9BTV9MSU5LX1FVQUxfUE9PUl9JTkQ7CisjaWYgICBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisgICAvKiBJbmRpY2F0ZSB0aGUgbmVpZ2hib3Igcm9hbCBhbGdvcml0aG0gYWJvdXQgdGhlIGRpc2Nvbm5lY3QgaW5kaWNhdGlvbiAqLworICAgY3NyTmVpZ2hib3JSb2FtSW5kaWNhdGVEaXNjb25uZWN0KHBNYWMsIHNlc3Npb25JZCk7CisjZW5kaWYKKyAgIAorfQorCisKK3ZvaWQgY3NyUm9hbVRsU3RhdHNUaW1lckhhbmRsZXIodm9pZCAqcHYpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIHB2ICk7CisgICBlSGFsU3RhdHVzIHN0YXR1czsKKworICAgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby50aW1lclJ1bm5pbmcgPSBGQUxTRTsKKworI2lmIDAKKyAgIC8vIFRPRE8gUGVyc2Vzc2lvbiAuPz8/CisgICAvL3JlcSBUTCBmb3Igc3RhdHMKKyAgIGlmKFdMQU5UTF9HZXRTdGF0aXN0aWNzKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsICZ0bFN0YXRzLCBwTWFjLT5yb2FtLmNvbm5lY3RlZEluZm8uc3RhSWQpKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjc3JSb2FtVGxTdGF0c1RpbWVySGFuZGxlcjpjb3VsZG4ndCBnZXQgdGhlIHN0YXRzIGZyb20gVExcbiIpKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8vc2F2ZSBpbiBTTUUKKyAgICAgIGNzclJvYW1TYXZlU3RhdHNGcm9tVGwocE1hYywgdGxTdGF0cyk7CisgICB9CisjZW5kaWYKKyAgIGlmKCFwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLnRpbWVyUnVubmluZykKKyAgIHsKKyAgICAgIGlmKHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8ucGVyaW9kaWNpdHkpCisgICAgICB7CisgICAgICAgICAvL3N0YXJ0IHRpbWVyCisgICAgICAgICBzdGF0dXMgPSBwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8uaFRsU3RhdHNUaW1lciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8ucGVyaW9kaWNpdHkgKiBQQUxfVElNRVJfVE9fTVNfVU5JVCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiY3NyUm9hbVRsU3RhdHNUaW1lckhhbmRsZXI6Y2Fubm90IHN0YXJ0IFRsU3RhdHNUaW1lciB0aW1lclxuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgICAgICAgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby50aW1lclJ1bm5pbmcgPSBUUlVFOworICAgICAgfQorICAgfQorfQorCit2b2lkIGNzclJvYW1QZVN0YXRzVGltZXJIYW5kbGVyKHZvaWQgKnB2KQoreworICAgdENzclBlU3RhdHNSZXFJbmZvICpwUGVTdGF0c1JlcUxpc3RFbnRyeSA9ICh0Q3NyUGVTdGF0c1JlcUluZm8gKilwdjsKKyAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IHBQZVN0YXRzUmVxTGlzdEVudHJ5LT5wTWFjOworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICB0UG1jUG93ZXJTdGF0ZSBwb3dlclN0YXRlOworCisgICBwUGVTdGF0c1JlcUxpc3RFbnRyeS0+dGltZXJSdW5uaW5nID0gRkFMU0U7CisgICBpZiggcFBlU3RhdHNSZXFMaXN0RW50cnktPnRpbWVyU3RvcEZhaWxlZCA9PSBUUlVFICkKKyAgIHsKKyAgICAgIC8vIElmIHdlIGVudGVyZWQgaGVyZSwgbWVhbmluZyB0aGUgdGltZXIgY291bGQgbm90IGJlIHN1Y2Nlc3NmdWxseSAKKyAgICAgIC8vIHN0b3BwZWQgaW4gY3NyUm9hbVJlbW92ZUVudHJ5RnJvbVBlU3RhdHNSZXFMaXN0KCkuIFNvIGRvIGl0IGhlcmUuCisKKyAgICAgIC8qIERlc3Ryb3kgdGhlIHRpbWVyICovCisgICAgICB2b3NTdGF0dXMgPSB2b3NfdGltZXJfZGVzdHJveSggJnBQZVN0YXRzUmVxTGlzdEVudHJ5LT5oUGVTdGF0c1RpbWVyICk7CisgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiY3NyUm9hbVBlU3RhdHNUaW1lckhhbmRsZXI6ZmFpbGVkIHRvIGRlc3Ryb3kgaFBlU3RhdHNUaW1lciB0aW1lclxuIikpOworICAgICAgfQorCisgICAgICAvLyBGcmVlIHRoZSBlbnRyeQorICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwUGVTdGF0c1JlcUxpc3RFbnRyeSk7CisgICAgICBwUGVTdGF0c1JlcUxpc3RFbnRyeSA9IE5VTEw7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpZighcFBlU3RhdHNSZXFMaXN0RW50cnktPnJzcFBlbmRpbmcpCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBjc3JTZW5kTUJTdGF0c1JlcU1zZyhwTWFjLCBwUGVTdGF0c1JlcUxpc3RFbnRyeS0+c3RhdHNNYXNrICYgfigxIDw8IGVDc3JHbG9iYWxDbGFzc0RTdGF0cyksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBlU3RhdHNSZXFMaXN0RW50cnktPnN0YUlkKTsKKyAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiY3NyUm9hbVBlU3RhdHNUaW1lckhhbmRsZXI6ZmFpbGVkIHRvIHNlbmQgZG93biBzdGF0cyByZXEgdG8gUEVcbiIpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBQZVN0YXRzUmVxTGlzdEVudHJ5LT5yc3BQZW5kaW5nID0gVFJVRTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy9zZW5kIGRvd24gYSByZXEKKyAgICAgIGlmKHBQZVN0YXRzUmVxTGlzdEVudHJ5LT5wZXJpb2RpY2l0eSAmJiAKKyAgICAgICAgIChWT1NfVElNRVJfU1RBVEVfU1RPUFBFRCA9PSB2b3NfdGltZXJfZ2V0Q3VycmVudFN0YXRlKCZwUGVTdGF0c1JlcUxpc3RFbnRyeS0+aFBlU3RhdHNUaW1lcikpKQorICAgICAgeworICAgICAgICAgcG1jUXVlcnlQb3dlclN0YXRlKHBNYWMsICZwb3dlclN0YXRlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgIGlmKGVQTUNfRlVMTF9QT1dFUiA9PSBwb3dlclN0YXRlKQorICAgICAgICAgeworICAgICAgICAgICAgaWYocFBlU3RhdHNSZXFMaXN0RW50cnktPnBlcmlvZGljaXR5IDwgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zdGF0c1JlcVBlcmlvZGljaXR5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcFBlU3RhdHNSZXFMaXN0RW50cnktPnBlcmlvZGljaXR5ID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zdGF0c1JlcVBlcmlvZGljaXR5OworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgaWYocFBlU3RhdHNSZXFMaXN0RW50cnktPnBlcmlvZGljaXR5IDwgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zdGF0c1JlcVBlcmlvZGljaXR5SW5QUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBQZVN0YXRzUmVxTGlzdEVudHJ5LT5wZXJpb2RpY2l0eSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc3RhdHNSZXFQZXJpb2RpY2l0eUluUFM7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICAvL3N0YXJ0IHRpbWVyCisgICAgICAgICB2b3NTdGF0dXMgPSB2b3NfdGltZXJfc3RhcnQoICZwUGVTdGF0c1JlcUxpc3RFbnRyeS0+aFBlU3RhdHNUaW1lciwgcFBlU3RhdHNSZXFMaXN0RW50cnktPnBlcmlvZGljaXR5ICk7CisgICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkgCisgICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNzclJvYW1QZVN0YXRzVGltZXJIYW5kbGVyOmNhbm5vdCBzdGFydCBoUGVTdGF0c1RpbWVyIHRpbWVyXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisKKyAgICAgICAgIHBQZVN0YXRzUmVxTGlzdEVudHJ5LT50aW1lclJ1bm5pbmcgPSBUUlVFOworCisgICAgICB9CisKKyAgIH0KK30KKwordm9pZCBjc3JSb2FtU3RhdHNDbGllbnRUaW1lckhhbmRsZXIodm9pZCAqcHYpCit7CisgICB0Q3NyU3RhdHNDbGllbnRSZXFJbmZvICpwU3RhRW50cnkgPSAodENzclN0YXRzQ2xpZW50UmVxSW5mbyAqKXB2OworCisgICBpZihWT1NfVElNRVJfU1RBVEVfU1RPUFBFRCA9PSB2b3NfdGltZXJfZ2V0Q3VycmVudFN0YXRlKCZwU3RhRW50cnktPnRpbWVyKSkKKyAgIHsKKyNpZiAwCisgICAgICAgLy8gVE9ETyBTdGF0cyBmaXggZm9yIG11bHRpc2Vzc2lvbgorICAgICAgIC8vc3RhcnQgdGhlIHRpbWVyCisgICAgICAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX3N0YXJ0KCAmcFN0YUVudHJ5LT50aW1lciwgcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSApOworICAgCisgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApIAorICAgICAgIHsKKyAgICAgICAgICBzbXNMb2cocFN0YUVudHJ5LT5wTWFjLCBMT0dFLCBGTCgiY3NyR2V0U3RhdGlzdGljczpjYW5ub3Qgc3RhcnQgU3RhdHNDbGllbnQgdGltZXJcbiIpKTsKKworICAgICAgIH0KKyNlbmRpZiAgICAgICAKKyAgIH0KKyNpZiAwCisgICAvL3NlbmQgdXAgdGhlIHN0YXRzIHJlcG9ydAorICAgY3NyUm9hbVJlcG9ydFN0YXRpc3RpY3MocFN0YUVudHJ5LT5wTWFjLCBwU3RhRW50cnktPnN0YXRzTWFzaywgcFN0YUVudHJ5LT5jYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhRW50cnktPnN0YUlkLCBwU3RhRW50cnktPnBDb250ZXh0KTsKKyNlbmRpZgorfQorCisKKworCitlSGFsU3RhdHVzIGNzclNlbmRNQlN0YXRzUmVxTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzdGF0c01hc2ssIHRBTklfVTggc3RhSWQpCit7CisgICB0QW5pR2V0UEVTdGF0c1JlcSAqcE1zZzsKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTXNnLCBzaXplb2YodEFuaUdldFBFU3RhdHNSZXEpKTsKKyAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkgCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HMSwgIiBjc3JTZW5kTUJTdGF0c1JlcU1zZzogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbSBmb3Igc3RhdHMgcmVxIFxuIik7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorICAgLy8gbmVlZCB0byBpbml0aWF0ZSBhIHN0YXRzIHJlcXVlc3QgdG8gUEUKKyAgIHBNc2ctPm1zZ1R5cGUgPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KWVXTklfU01FX0dFVF9TVEFUSVNUSUNTX1JFUSk7CisgICBwTXNnLT5tc2dMZW4gPSAodEFOSV9VMTYpc2l6ZW9mKHRBbmlHZXRQRVN0YXRzUmVxKTsKKyAgIHBNc2ctPnN0YUlkID0gc3RhSWQ7CisgICBwTXNnLT5zdGF0c01hc2sgPSBzdGF0c01hc2s7CisKKyAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyApOyAgICAKKworICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPRzEsICIgY3NyU2VuZE1CU3RhdHNSZXFNc2c6IGZhaWxlZCB0byBzZW5kIGRvd24gdGhlIHN0YXRzIHJlcSBcbiIpOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGNzclJvYW1TdGF0c1JzcFByb2Nlc3Nvcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyU21lUnNwICpwU2lyTXNnKQoreworICAgdEFuaUdldFBFU3RhdHNSc3AgKnBTbWVTdGF0c1JzcDsKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKyAgIHRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnBUZW1wU3RhRW50cnkgPSBOVUxMOworICAgdENzclBlU3RhdHNSZXFJbmZvICpwUGVTdGFFbnRyeSA9IE5VTEw7CisgICB0QU5JX1UzMiAgdGVtcE1hc2sgPSAwOworICAgdEFOSV9VOCBjb3VudGVyID0gMDsKKyAgIHRBTklfVTggKnBTdGF0cyA9IE5VTEw7CisgICB0QU5JX1UzMiAgIGxlbmd0aCA9IDA7CisgICB2X1BWT0lEX3QgIHB2b3NHQ3R4OworICAgdl9TN190ICAgICByc3NpID0gMDsKKyAgIHRBTklfVTMyICAgKnBSc3NpID0gTlVMTDsKKworICAgcFNtZVN0YXRzUnNwID0gKHRBbmlHZXRQRVN0YXRzUnNwICopcFNpck1zZzsKKyAgIGlmKHBTbWVTdGF0c1JzcC0+cmMpCisgICB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJjc3JSb2FtU3RhdHNSc3BQcm9jZXNzb3I6c3RhdHMgcnNwIGZyb20gUEUgc2hvd3MgZmFpbHVyZVxuIikpOworICAgICAgZ290byBwb3N0X3VwZGF0ZTsKKyAgIH0KKworICAgdGVtcE1hc2sgPSBwU21lU3RhdHNSc3AtPnN0YXRzTWFzazsKKyAgIHBTdGF0cyA9ICgodEFOSV9VOCAqKSZwU21lU3RhdHNSc3AtPnN0YXRzTWFzaykgKyBzaXplb2YocFNtZVN0YXRzUnNwLT5zdGF0c01hc2spOworCisgICAvKiBzdWJ0cmFjdCBhbGwgc3RhdGlzdGljcyBmcm9tIHRoaXMgbGVuZ3RoLCBhbmQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZW50aXJlIAorICAgICogJ3N0YXQnIHBhcnQgb2YgdGhlIG1lc3NhZ2UsIGlmIHRoZSBsZW5ndGggaXMgbm90IHplcm8sIHRoZW4gcnNzaSBpcyBwaWdneSBwYWNrZWQgCisgICAgKiBpbiB0aGlzICdzdGF0cycgbWVzc2FnZS4KKyAgICAqLworICAgbGVuZ3RoID0gcFNtZVN0YXRzUnNwLT5tc2dMZW4gLSBzaXplb2YodEFuaUdldFBFU3RhdHNSc3ApOworCisgICAvL25ldyBzdGF0cyBpbmZvIGZyb20gUEUsIGZpbGwgdXAgdGhlIHN0YXRzIHN0cnVjdXRyZXMgaW4gUE1BQworICAgd2hpbGUodGVtcE1hc2spCisgICB7CisgICAgICBpZih0ZW1wTWFzayAmIDEpCisgICAgICB7CisgICAgICAgICBzd2l0Y2goY291bnRlcikKKyAgICAgICAgIHsKKyAgICAgICAgIGNhc2UgZUNzclN1bW1hcnlTdGF0czoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoImNzclJvYW1TdGF0c1JzcFByb2Nlc3NvcjpzdW1tYXJ5IHN0YXRzXG4iKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh0QU5JX1U4ICopJnBNYWMtPnJvYW0uc3VtbWFyeVN0YXRzSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0cywgc2l6ZW9mKHRDc3JTdW1tYXJ5U3RhdHNJbmZvKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJjc3JSb2FtU3RhdHNSc3BQcm9jZXNzb3I6ZmFpbGVkIHRvIGNvcHkgc3VtbWFyeSBzdGF0c1xuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFN0YXRzICs9IHNpemVvZih0Q3NyU3VtbWFyeVN0YXRzSW5mbyk7CisgICAgICAgICAgICBsZW5ndGggLT0gc2l6ZW9mKHRDc3JTdW1tYXJ5U3RhdHNJbmZvKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIGVDc3JHbG9iYWxDbGFzc0FTdGF0czoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoImNzclJvYW1TdGF0c1JzcFByb2Nlc3NvcjpDbGFzc0Egc3RhdHNcbiIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTggKikmcE1hYy0+cm9hbS5jbGFzc0FTdGF0c0luZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdHMsIHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NBU3RhdHNJbmZvKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJjc3JSb2FtU3RhdHNSc3BQcm9jZXNzb3I6ZmFpbGVkIHRvIGNvcHkgQ2xhc3NBIHN0YXRzXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU3RhdHMgKz0gc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0FTdGF0c0luZm8pOworICAgICAgICAgICAgbGVuZ3RoIC09IHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NBU3RhdHNJbmZvKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIGVDc3JHbG9iYWxDbGFzc0JTdGF0czoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoImNzclJvYW1TdGF0c1JzcFByb2Nlc3NvcjpDbGFzc0Igc3RhdHNcbiIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTggKikmcE1hYy0+cm9hbS5jbGFzc0JTdGF0c0luZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdHMsIHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NCU3RhdHNJbmZvKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJjc3JSb2FtU3RhdHNSc3BQcm9jZXNzb3I6ZmFpbGVkIHRvIGNvcHkgQ2xhc3NCIHN0YXRzXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU3RhdHMgKz0gc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0JTdGF0c0luZm8pOworICAgICAgICAgICAgbGVuZ3RoIC09IHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NCU3RhdHNJbmZvKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIGVDc3JHbG9iYWxDbGFzc0NTdGF0czoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoImNzclJvYW1TdGF0c1JzcFByb2Nlc3NvcjpDbGFzc0Mgc3RhdHNcbiIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTggKikmcE1hYy0+cm9hbS5jbGFzc0NTdGF0c0luZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdHMsIHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NDU3RhdHNJbmZvKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJjc3JSb2FtU3RhdHNSc3BQcm9jZXNzb3I6ZmFpbGVkIHRvIGNvcHkgQ2xhc3NDIHN0YXRzXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU3RhdHMgKz0gc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0NTdGF0c0luZm8pOworICAgICAgICAgICAgbGVuZ3RoIC09IHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NDU3RhdHNJbmZvKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIGVDc3JQZXJTdGFTdGF0czoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoImNzclJvYW1TdGF0c1JzcFByb2Nlc3NvcjpQZXJTdGEgc3RhdHNcbiIpKTsKKyAgICAgICAgICAgIGlmKCBDU1JfTUFYX1NUQSA+IHBTbWVTdGF0c1JzcC0+c3RhSWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodEFOSV9VOCAqKSZwTWFjLT5yb2FtLnBlclN0YVN0YXRzSW5mb1twU21lU3RhdHNSc3AtPnN0YUlkXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0cywgc2l6ZW9mKHRDc3JQZXJTdGFTdGF0c0luZm8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCJjc3JSb2FtU3RhdHNSc3BQcm9jZXNzb3I6b3V0IGJvdW5kIHN0YUlkOiVkXG4iKSwgcFNtZVN0YXRzUnNwLT5zdGFJZCk7CisgICAgICAgICAgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJjc3JSb2FtU3RhdHNSc3BQcm9jZXNzb3I6ZmFpbGVkIHRvIGNvcHkgUGVyU3RhIHN0YXRzXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU3RhdHMgKz0gc2l6ZW9mKHRDc3JQZXJTdGFTdGF0c0luZm8pOworICAgICAgICAgICAgbGVuZ3RoIC09IHNpemVvZih0Q3NyUGVyU3RhU3RhdHNJbmZvKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCBGTCgiY3NyUm9hbVN0YXRzUnNwUHJvY2Vzc29yOnVua25vd24gc3RhdHMgdHlwZVxuIikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGVtcE1hc2sgPj49MTsKKyAgICAgIGNvdW50ZXIrKzsKKyAgIH0KKyAgIHB2b3NHQ3R4ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgcE1hYyk7CisgICBpZiAobGVuZ3RoICE9IDApCisgICB7CisgICAgICAgcFJzc2kgPSAodEFOSV9VMzIqKXBTdGF0czsKKyAgICAgICByc3NpID0gKHZfUzdfdCkqcFJzc2k7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgLyogSWYgcml2YSBpcyBub3Qgc2VuZGluZyByc3NpLCBjb250aW51ZSB0byB1c2UgdGhlIGhhY2sgKi8KKyAgICAgICByc3NpID0gUlNTSV9IQUNLX0JNUFM7CisgICB9CisgICBXREFfVXBkYXRlUnNzaUJtcHMocHZvc0dDdHgsIHBTbWVTdGF0c1JzcC0+c3RhSWQsIHJzc2kpOworCitwb3N0X3VwZGF0ZTogICAKKyAgIC8vbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUgcGUgc3RhdHMgcmVxIGxpc3QgCisgICBwRW50cnkgPSBjc3JSb2FtRmluZEluUGVTdGF0c1JlcUxpc3QocE1hYywgcFNtZVN0YXRzUnNwLT5zdGF0c01hc2spOworICAgaWYocEVudHJ5KQorICAgICAgeworICAgICAgcFBlU3RhRW50cnkgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JQZVN0YXRzUmVxSW5mbywgbGluayApOworICAgICAgcFBlU3RhRW50cnktPnJzcFBlbmRpbmcgPSBGQUxTRTsKKyAgIAorICAgfQorICAgLy9jaGVjayB0aGUgb25lIHRpbWVyIGNhc2VzCisgICBwRW50cnkgPSBjc3JSb2FtQ2hlY2tDbGllbnRSZXFMaXN0KHBNYWMsIHBTbWVTdGF0c1JzcC0+c3RhdHNNYXNrKTsKKyAgIGlmKHBFbnRyeSkKKyAgIHsKKworICAgICAgcFRlbXBTdGFFbnRyeSA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdENzclN0YXRzQ2xpZW50UmVxSW5mbywgbGluayApOworCisgICAgICBpZihwVGVtcFN0YUVudHJ5LT50aW1lckV4cGlyZWQpCisgICAgICB7CisgICAgICAgICAvL3NlbmQgdXAgdGhlIHN0YXRzIHJlcG9ydAorICAgICAgICAgY3NyUm9hbVJlcG9ydFN0YXRpc3RpY3MocE1hYywgcFRlbXBTdGFFbnRyeS0+c3RhdHNNYXNrLCBwVGVtcFN0YUVudHJ5LT5jYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFN0YUVudHJ5LT5zdGFJZCwgcFRlbXBTdGFFbnRyeS0+cENvbnRleHQpOworICAgICAgICAgLy9hbHNvIHJlbW92ZSBmcm9tIHRoZSBjbGllbnQgbGlzdAorICAgICAgICAgY3NyUm9hbVJlbW92ZVN0YXRMaXN0RW50cnkocE1hYywgcEVudHJ5KTsKKyAgICAgICAgIHBUZW1wU3RhRW50cnkgPSBOVUxMOworCisgICAgICB9CisgICB9CisKK30KKwordExpc3RFbGVtICogY3NyUm9hbUZpbmRJblBlU3RhdHNSZXFMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICBzdGF0c01hc2spCit7CisgICB0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisgICB0Q3NyUGVTdGF0c1JlcUluZm8gKnBUZW1wU3RhRW50cnkgPSBOVUxMOworCisgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+cm9hbS5wZVN0YXRzUmVxTGlzdCwgTExfQUNDRVNTX0xPQ0sgKTsKKworICAgaWYoIXBFbnRyeSkKKyAgIHsKKyAgICAgIC8vbGlzdCBlbXB0eQorICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtRmluZEluUGVTdGF0c1JlcUxpc3Q6IExpc3QgZW1wdHksIG5vIHJlcXVlc3QgdG8gUEVcbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIHdoaWxlKCBwRW50cnkgKQorICAgeworICAgICAgcFRlbXBTdGFFbnRyeSA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdENzclBlU3RhdHNSZXFJbmZvLCBsaW5rICk7CisKKyAgICAgIGlmKHBUZW1wU3RhRW50cnktPnN0YXRzTWFzayA9PSBzdGF0c01hc2spCisgICAgICB7CisgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgImNzclJvYW1GaW5kSW5QZVN0YXRzUmVxTGlzdDogbWF0Y2ggZm91bmRcbiIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHBFbnRyeSA9IGNzckxMTmV4dCggJnBNYWMtPnJvYW0ucGVTdGF0c1JlcUxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyApOworICAgfQorCisgICByZXR1cm4gcEVudHJ5OworfQorCisKK3RMaXN0RWxlbSAqIGNzclJvYW1DaGVja25VcGRhdGVDbGllbnRSZXFMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnBTdGFFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfQk9PTEVBTiB1cGRhdGUpCit7CisgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgIHRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnBUZW1wU3RhRW50cnk7CisKKyAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5yb2FtLnN0YXRzQ2xpZW50UmVxTGlzdCwgTExfQUNDRVNTX0xPQ0sgKTsKKworICAgaWYoIXBFbnRyeSkKKyAgIHsKKyAgICAgIC8vbGlzdCBlbXB0eQorICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtQ2hlY2tuVXBkYXRlQ2xpZW50UmVxTGlzdDogTGlzdCBlbXB0eSwgbm8gcmVxdWVzdCBmcm9tICIKKyAgICAgICAgICAgICAidXBwZXIgbGF5ZXIgY2xpZW50KHMpXG4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICB3aGlsZSggcEVudHJ5ICkKKyAgIHsKKyAgICAgIHBUZW1wU3RhRW50cnkgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTdGF0c0NsaWVudFJlcUluZm8sIGxpbmsgKTsKKworICAgICAgaWYoKHBUZW1wU3RhRW50cnktPnJlcXVlc3RlcklkID09IHBTdGFFbnRyeS0+cmVxdWVzdGVySWQpICYmIAorICAgICAgICAgKHBUZW1wU3RhRW50cnktPnN0YXRzTWFzayA9PSBwU3RhRW50cnktPnN0YXRzTWFzaykpCisgICAgICB7CisgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgImNzclJvYW1DaGVja25VcGRhdGVDbGllbnRSZXFMaXN0OiBtYXRjaCBmb3VuZFxuIik7CisgICAgICAgICBpZih1cGRhdGUpCisgICAgICAgICB7CisgICAgICAgICBwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSA9IHBTdGFFbnRyeS0+cGVyaW9kaWNpdHk7CisgICAgICAgICBwVGVtcFN0YUVudHJ5LT5jYWxsYmFjayA9IHBTdGFFbnRyeS0+Y2FsbGJhY2s7CisgICAgICAgICBwVGVtcFN0YUVudHJ5LT5wQ29udGV4dCA9IHBTdGFFbnRyeS0+cENvbnRleHQ7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCAmcE1hYy0+cm9hbS5zdGF0c0NsaWVudFJlcUxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyApOworICAgfQorCisgICByZXR1cm4gcEVudHJ5OworfQorCit0TGlzdEVsZW0gKiBjc3JSb2FtQ2hlY2tDbGllbnRSZXFMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHN0YXRzTWFzaykKK3sKKyAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgdENzclN0YXRzQ2xpZW50UmVxSW5mbyAqcFRlbXBTdGFFbnRyeTsKKworICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnBNYWMtPnJvYW0uc3RhdHNDbGllbnRSZXFMaXN0LCBMTF9BQ0NFU1NfTE9DSyApOworCisgICBpZighcEVudHJ5KQorICAgeworICAgICAgLy9saXN0IGVtcHR5CisgICAgICBzbXNMb2cocE1hYywgTE9HVywgImNzclJvYW1DaGVja0NsaWVudFJlcUxpc3Q6IExpc3QgZW1wdHksIG5vIHJlcXVlc3QgZnJvbSAiCisgICAgICAgICAgICAgInVwcGVyIGxheWVyIGNsaWVudChzKVxuIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgd2hpbGUoIHBFbnRyeSApCisgICB7CisgICAgICBwVGVtcFN0YUVudHJ5ID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0Q3NyU3RhdHNDbGllbnRSZXFJbmZvLCBsaW5rICk7CisKKyAgICAgIGlmKChwVGVtcFN0YUVudHJ5LT5zdGF0c01hc2sgJiB+KDEgPDwgZUNzckdsb2JhbENsYXNzRFN0YXRzKSkgID09IHN0YXRzTWFzaykKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyUm9hbUNoZWNrQ2xpZW50UmVxTGlzdDogbWF0Y2ggZm91bmRcbiIpOworCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCAmcE1hYy0+cm9hbS5zdGF0c0NsaWVudFJlcUxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyApOworICAgfQorCisgICByZXR1cm4gcEVudHJ5OworfQorCisKK2VIYWxTdGF0dXMgY3NyUm9hbVJlZ2lzdGVyTGlua1F1YWxpdHlJbmRDYWxsYmFjayh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1MaW5rUXVhbGl0eUluZENhbGxiYWNrICAgY2FsbGJhY2ssICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDb250ZXh0KQoreworICAgcE1hYy0+cm9hbS5saW5rUXVhbGl0eUluZEluZm8uY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgIHBNYWMtPnJvYW0ubGlua1F1YWxpdHlJbmRJbmZvLmNvbnRleHQgPSBwQ29udGV4dDsKKyAgIGlmKCBOVUxMID09IGNhbGxiYWNrICkKKyAgIHsKKyAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtUmVnaXN0ZXJMaW5rUXVhbGl0eUluZENhbGxiYWNrOiBpbmRpY2F0aW9uIGNhbGxiYWNrIGJlaW5nIGRlcmVnaXN0ZXJlZCIpOworICAgfQorICAgZWxzZQorICAgeworICAgICBzbXNMb2cocE1hYywgTE9HVywgImNzclJvYW1SZWdpc3RlckxpbmtRdWFsaXR5SW5kQ2FsbGJhY2s6IGluZGljYXRpb24gY2FsbGJhY2sgYmVpbmcgcmVnaXN0ZXJlZCIpOworCisgICAgIC8qIGRvIHdlIG5lZWQgdG8gaW52b2tlIHRoZSBjYWxsYmFjayB0byBub3RpZnkgY2xpZW50IG9mIGluaXRpYWwgdmFsdWUgPz8gICovCisgICB9CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBjc3JSb2FtVmNjVHJpZ2dlcih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgZUNzclJvYW1MaW5rUXVhbGl0eUluZCBuZXdWY2NMaW5rUXVhbGl0eTsKKyAgIHRBTklfVTMyIHVsX21hY19sb3NzID0gMDsKKyAgIHRBTklfVTMyIHVsX21hY19sb3NzX3RyaWdnZXJfdGhyZXNob2xkOworCisgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBMaW5rIHF1YWxpdHkgaXMgY3VycmVudGx5IGJpbmFyeSBiYXNlZCBvbiBPQklXQU4gcmVjb21tZW5kZWQgdHJpZ2dlcnMKKworICAgICBDaGVjayBmb3IgYSBjaGFuZ2UgaW4gbGluayBxdWFsaXR5IGFuZCBub3RpZnkgY2xpZW50IGlmIG5lY2Vzc2FyeQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICB1bF9tYWNfbG9zc190cmlnZ2VyX3RocmVzaG9sZCA9IAorICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS52Y2NVbE1hY0xvc3NUaHJlc2hvbGQ7CisKKyAgIFZPU19BU1NFUlQoIHVsX21hY19sb3NzX3RyaWdnZXJfdGhyZXNob2xkICE9IDAgKTsKKworICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtVmNjVHJpZ2dlcjogVUxfTUFDX0xPU1NfVEhSRVNIT0xEIGlzICVkXG4iLCAKKyAgICAgICAgICB1bF9tYWNfbG9zc190cmlnZ2VyX3RocmVzaG9sZCApOworCisgICBpZih1bF9tYWNfbG9zc190cmlnZ2VyX3RocmVzaG9sZCA8IHVsX21hY19sb3NzKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtVmNjVHJpZ2dlcjogbGluayBxdWFsaXR5IGlzIFBPT1IgXG4iKTsKKyAgICAgIG5ld1ZjY0xpbmtRdWFsaXR5ID0gZUNTUl9ST0FNX0xJTktfUVVBTF9QT09SX0lORDsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyUm9hbVZjY1RyaWdnZXI6IGxpbmsgcXVhbGl0eSBpcyBHT09EXG4iKTsKKyAgICAgIG5ld1ZjY0xpbmtRdWFsaXR5ID0gZUNTUl9ST0FNX0xJTktfUVVBTF9HT09EX0lORDsKKyAgIH0KKworICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtVmNjVHJpZ2dlcjogbGluayBxdWFsIDogKioqIFVMX01BQ19MT1NTICVkICoqKiAiLAorICAgICAgICAgIHVsX21hY19sb3NzKTsKKworICAgaWYobmV3VmNjTGlua1F1YWxpdHkgIT0gcE1hYy0+cm9hbS52Y2NMaW5rUXVhbGl0eSkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyUm9hbVZjY1RyaWdnZXI6IGxpbmsgcXVhbGl0eSBjaGFuZ2VkOiB0cmlnZ2VyIG5lY2Vzc2FyeVxuIik7CisgICAgICBpZihOVUxMICE9IHBNYWMtPnJvYW0ubGlua1F1YWxpdHlJbmRJbmZvLmNhbGxiYWNrKSAKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyUm9hbVZjY1RyaWdnZXI6IGxpbmsgcXVhbGl0eSBpbmRpY2F0aW9uICVkXG4iLAorICAgICAgICAgICAgICAgIG5ld1ZjY0xpbmtRdWFsaXR5ICk7CisgICAgICAgICAKKyAgICAgICAgIC8qIHdlIG5vdyBpbnZva2UgdGhlIGNhbGxiYWNrIG9uY2UgdG8gbm90aWZ5IGNsaWVudCBvZiBpbml0aWFsIHZhbHVlICAgKi8KKyAgICAgICAgIHBNYWMtPnJvYW0ubGlua1F1YWxpdHlJbmRJbmZvLmNhbGxiYWNrKCBuZXdWY2NMaW5rUXVhbGl0eSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS5saW5rUXVhbGl0eUluZEluZm8uY29udGV4dCApOworICAgICAgICAgLy9ldmVudDogRVZFTlRfV0xBTl9WQ0MKKyAgICAgIH0KKyAgIH0KKworICAgcE1hYy0+cm9hbS52Y2NMaW5rUXVhbGl0eSA9IG5ld1ZjY0xpbmtRdWFsaXR5OworCisKK30KKworVk9TX1NUQVRVUyBjc3JSb2FtVmNjVHJpZ2dlclJzc2lJbmRDYWxsYmFjayh0SGFsSGFuZGxlIGhIYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgIHJzc2lOb3RpZmljYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogY29udGV4dCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggY29udGV4dCApOworICAgZUNzclJvYW1MaW5rUXVhbGl0eUluZCBuZXdWY2NMaW5rUXVhbGl0eTsKKyAgICAgICAgLy8gVE9ETyA6IFNlc3Npb24gaW5mbyB1bmF2YWlsYWJsZQorICAgICAgICB0QU5JX1UzMiBzZXNzaW9uSWQgPSAwOworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgTGluayBxdWFsaXR5IGlzIGN1cnJlbnRseSBiaW5hcnkgYmFzZWQgb24gT0JJV0FOIHJlY29tbWVuZGVkIHRyaWdnZXJzCisKKyAgICAgQ2hlY2sgZm9yIGEgY2hhbmdlIGluIGxpbmsgcXVhbGl0eSBhbmQgbm90aWZ5IGNsaWVudCBpZiBuZWNlc3NhcnkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtVmNjVHJpZ2dlclJzc2lJbmRDYWxsYmFjazogUlNTSSB0cmlnZ2VyIHRocmVzaG9sZCBpcyAlZFxuIiwgCisgICAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS52Y2NSc3NpVGhyZXNob2xkKTsKKyAgIGlmKCFjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZEluZnJhKHBNYWMsIHNlc3Npb25JZCkpCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HVywgImNzclJvYW1WY2NUcmlnZ2VyUnNzaUluZENhbGxiYWNrOiBpZ25vcmluZyB0aGUgaW5kaWNhdGlvbiBhcyB3ZSBhcmUgbm90IGNvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgfQorCisgICBpZihXTEFOVExfSE9fVEhSRVNIT0xEX0RPV04gPT0gcnNzaU5vdGlmaWNhdGlvbikKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyUm9hbVZjY1RyaWdnZXJSc3NpSW5kQ2FsbGJhY2s6IGxpbmsgcXVhbGl0eSBpcyBQT09SXG4iKTsKKyAgICAgIG5ld1ZjY0xpbmtRdWFsaXR5ID0gZUNTUl9ST0FNX0xJTktfUVVBTF9QT09SX0lORDsKKyAgIH0KKyAgIGVsc2UgaWYoV0xBTlRMX0hPX1RIUkVTSE9MRF9VUCA9PSByc3NpTm90aWZpY2F0aW9uKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtVmNjVHJpZ2dlclJzc2lJbmRDYWxsYmFjazogbGluayBxdWFsaXR5IGlzIEdPT0QgXG4iKTsKKyAgICAgIG5ld1ZjY0xpbmtRdWFsaXR5ID0gZUNTUl9ST0FNX0xJTktfUVVBTF9HT09EX0lORDsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyUm9hbVZjY1RyaWdnZXJSc3NpSW5kQ2FsbGJhY2s6IHVua25vd24gcnNzaSBub3RpZmljYXRpb24gJWRcbiIsIHJzc2lOb3RpZmljYXRpb24pOworICAgICAgLy9TZXQgdG8gdGhpcyBzbyB0aGUgY29kZSBiZWxvdyB3b24ndCBkbyBhbnl0aGluZworICAgICAgbmV3VmNjTGlua1F1YWxpdHkgPSBwTWFjLT5yb2FtLnZjY0xpbmtRdWFsaXR5OyAgICAKKworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgIH0KKworCisgICBpZihuZXdWY2NMaW5rUXVhbGl0eSAhPSBwTWFjLT5yb2FtLnZjY0xpbmtRdWFsaXR5KQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtVmNjVHJpZ2dlclJzc2lJbmRDYWxsYmFjazogbGluayBxdWFsaXR5IGNoYW5nZWQ6IHRyaWdnZXIgbmVjZXNzYXJ5XG4iKTsKKyAgICAgIGlmKE5VTEwgIT0gcE1hYy0+cm9hbS5saW5rUXVhbGl0eUluZEluZm8uY2FsbGJhY2spIAorICAgICAgeworICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtVmNjVHJpZ2dlclJzc2lJbmRDYWxsYmFjazogbGluayBxdWFsaXR5IGluZGljYXRpb24gJWRcbiIsCisgICAgICAgICAgICAgICAgbmV3VmNjTGlua1F1YWxpdHkpOworCisgICAgICAgIC8qIHdlIG5vdyBpbnZva2UgdGhlIGNhbGxiYWNrIG9uY2UgdG8gbm90aWZ5IGNsaWVudCBvZiBpbml0aWFsIHZhbHVlICAgKi8KKyAgICAgICAgcE1hYy0+cm9hbS5saW5rUXVhbGl0eUluZEluZm8uY2FsbGJhY2soIG5ld1ZjY0xpbmtRdWFsaXR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0ubGlua1F1YWxpdHlJbmRJbmZvLmNvbnRleHQgKTsKKyAgICAgICAgIC8vZXZlbnQ6IEVWRU5UX1dMQU5fVkNDCisgICAgICB9CisgICB9CisKKyAgIHBNYWMtPnJvYW0udmNjTGlua1F1YWxpdHkgPSBuZXdWY2NMaW5rUXVhbGl0eTsKKworICAgcmV0dXJuIHN0YXR1czsKK30KKworCit0Q3NyU3RhdHNDbGllbnRSZXFJbmZvICogY3NyUm9hbUluc2VydEVudHJ5SW50b0xpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYmxMaW5rTGlzdCAqcFN0YUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnBTdGFFbnRyeSkKK3sKKyAgIHRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnBOZXdTdGFFbnRyeSA9IE5VTEw7CisKKyAgIGVIYWxTdGF0dXMgIHN0YXR1czsKKworICAgLy9pZiBzYW1lIGVudGl0eSByZXF1ZXN0ZWQgZm9yIHNhbWUgc2V0IG9mIHN0YXRzIHdpdGggZGlmZmVyZW50IHBlcmlvZGljaXR5ICYgCisgICAvLyBjYWxsYmFjayB1cGRhdGUgaXQKKyAgIGlmKE5VTEwgPT0gY3NyUm9hbUNoZWNrblVwZGF0ZUNsaWVudFJlcUxpc3QocE1hYywgcFN0YUVudHJ5LCBUUlVFKSkKKyAgIHsKKyAgIAorICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBOZXdTdGFFbnRyeSwgc2l6ZW9mKHRDc3JTdGF0c0NsaWVudFJlcUluZm8pKTsKKyAgICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICB7CisgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgImNzclJvYW1JbnNlcnRFbnRyeUludG9MaXN0OiBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSAiCisgICAgICAgICAgICAgICAgImVudHJ5XG4iKTsKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgCisKKyAgICAgIHBOZXdTdGFFbnRyeS0+Y2FsbGJhY2sgPSBwU3RhRW50cnktPmNhbGxiYWNrOworICAgICAgcE5ld1N0YUVudHJ5LT5wQ29udGV4dCA9IHBTdGFFbnRyeS0+cENvbnRleHQ7CisgICAgICBwTmV3U3RhRW50cnktPnBlcmlvZGljaXR5ID0gcFN0YUVudHJ5LT5wZXJpb2RpY2l0eTsKKyAgICAgIHBOZXdTdGFFbnRyeS0+cmVxdWVzdGVySWQgPSBwU3RhRW50cnktPnJlcXVlc3RlcklkOworICAgICAgcE5ld1N0YUVudHJ5LT5zdGF0c01hc2sgPSBwU3RhRW50cnktPnN0YXRzTWFzazsKKyAgICAgIHBOZXdTdGFFbnRyeS0+cFBlU3RhRW50cnkgPSBwU3RhRW50cnktPnBQZVN0YUVudHJ5OworICAgICAgcE5ld1N0YUVudHJ5LT5wTWFjID0gcFN0YUVudHJ5LT5wTWFjOworICAgICAgcE5ld1N0YUVudHJ5LT5zdGFJZCA9IHBTdGFFbnRyeS0+c3RhSWQ7CisgICAgICBwTmV3U3RhRW50cnktPnRpbWVyRXhwaXJlZCA9IHBTdGFFbnRyeS0+dGltZXJFeHBpcmVkOworICAgICAgCisgICAgICBjc3JMTEluc2VydFRhaWwoIHBTdGFMaXN0LCAmcE5ld1N0YUVudHJ5LT5saW5rLCBMTF9BQ0NFU1NfTE9DSyAgKTsKKyAgIH0KKyAgIHJldHVybiBwTmV3U3RhRW50cnk7Cit9CisKKwordENzclBlU3RhdHNSZXFJbmZvICogY3NyUm9hbUluc2VydEVudHJ5SW50b1BlU3RhdHNSZXFMaXN0KCB0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RGJsTGlua0xpc3QgKnBTdGFMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUGVTdGF0c1JlcUluZm8gKnBTdGFFbnRyeSkKK3sKKyAgIHRDc3JQZVN0YXRzUmVxSW5mbyAqcE5ld1N0YUVudHJ5ID0gTlVMTDsKKworICAgZUhhbFN0YXR1cyAgc3RhdHVzOworCisgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE5ld1N0YUVudHJ5LCBzaXplb2YodENzclBlU3RhdHNSZXFJbmZvKSk7CisgICBpZiAoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtSW5zZXJ0RW50cnlJbnRvUGVTdGF0c1JlcUxpc3Q6IGNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlICIKKyAgICAgICAgICAgICAgICAgICJlbnRyeVxuIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIAorCisgICBwTmV3U3RhRW50cnktPmhQZVN0YXRzVGltZXIgPSBwU3RhRW50cnktPmhQZVN0YXRzVGltZXI7CisgICBwTmV3U3RhRW50cnktPm51bUNsaWVudCA9IHBTdGFFbnRyeS0+bnVtQ2xpZW50OworICAgcE5ld1N0YUVudHJ5LT5wZXJpb2RpY2l0eSA9IHBTdGFFbnRyeS0+cGVyaW9kaWNpdHk7CisgICBwTmV3U3RhRW50cnktPnN0YXRzTWFzayA9IHBTdGFFbnRyeS0+c3RhdHNNYXNrOworICAgcE5ld1N0YUVudHJ5LT5wTWFjID0gcFN0YUVudHJ5LT5wTWFjOworICAgcE5ld1N0YUVudHJ5LT5zdGFJZCA9IHBTdGFFbnRyeS0+c3RhSWQ7CisgICBwTmV3U3RhRW50cnktPnRpbWVyUnVubmluZyA9IHBTdGFFbnRyeS0+dGltZXJSdW5uaW5nOworICAgcE5ld1N0YUVudHJ5LT5yc3BQZW5kaW5nID0gcFN0YUVudHJ5LT5yc3BQZW5kaW5nOworICAgCisgICBjc3JMTEluc2VydFRhaWwoIHBTdGFMaXN0LCAmcE5ld1N0YUVudHJ5LT5saW5rLCBMTF9BQ0NFU1NfTE9DSyAgKTsKKworICAgcmV0dXJuIHBOZXdTdGFFbnRyeTsKK30KKworCitlSGFsU3RhdHVzIGNzckdldFJzc2kodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJzc2lDYWxsYmFjayBjYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBzdGFJZCwgdENzckJzc2lkIGJzc0lkLCB2b2lkICpwQ29udGV4dCwgdm9pZCogcFZvc0NvbnRleHQpCit7ICAKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHZvc19tc2dfdCAgbXNnOworICAgdEFOSV9VMzIgc2Vzc2lvbklkOworCisgICB0QW5pR2V0UnNzaVJlcSAqcE1zZzsKKyAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiY2FsbGVkIikpOyAgICAgIAorICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIHNpemVvZih0QW5pR2V0UnNzaVJlcSkpOworICAgaWYgKCAhSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKSAKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiIGNzckdldFJzc2k6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW0gZm9yIHJlcSBcbiIpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgY3NyUm9hbUdldFNlc3Npb25JZEZyb21CU1NJRChwTWFjLCAodENzckJzc2lkICopYnNzSWQsICZzZXNzaW9uSWQpOworCisgICBwTXNnLT5tc2dUeXBlID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNillV05JX1NNRV9HRVRfUlNTSV9SRVEpOworICAgcE1zZy0+bXNnTGVuID0gKHRBTklfVTE2KXNpemVvZih0QW5pR2V0UnNzaVJlcSk7CisgICBwTXNnLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICBwTXNnLT5zdGFJZCA9IHN0YUlkOworICAgcE1zZy0+cnNzaUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICBwTXNnLT5wRGV2Q29udGV4dCA9IHBDb250ZXh0OworICAgcE1zZy0+cFZvc0NvbnRleHQgPSBwVm9zQ29udGV4dDsKKworICAgbXNnLnR5cGUgPSBlV05JX1NNRV9HRVRfUlNTSV9SRVE7CisgICBtc2cuYm9keXB0ciA9IHBNc2c7CisgICBtc2cucmVzZXJ2ZWQgPSAwOworCisgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfU01FLCAmbXNnKSkKKyAgIHsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiBjc3JHZXRSc3NpIGZhaWxlZCB0byBwb3N0IG1zZyB0byBzZWxmIFxuIik7ICAgCisgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKXBNc2cpOworICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoInJldHVybmVkIikpOyAgICAgIAorICAgcmV0dXJuIHN0YXR1czsKK30KKworZUhhbFN0YXR1cyBjc3JHZXRTdGF0aXN0aWNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVDc3JTdGF0c1JlcXVlc3RlclR5cGUgcmVxdWVzdGVySWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHN0YXRzTWFzaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclN0YXRzQ2FsbGJhY2sgY2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHBlcmlvZGljaXR5LCB0QU5JX0JPT0xFQU4gY2FjaGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggc3RhSWQsIHZvaWQgKnBDb250ZXh0KQoreyAgCisgICB0Q3NyU3RhdHNDbGllbnRSZXFJbmZvIHN0YUVudHJ5OworICAgdENzclN0YXRzQ2xpZW50UmVxSW5mbyAqcFN0YUVudHJ5ID0gTlVMTDsKKyAgIHRDc3JQZVN0YXRzUmVxSW5mbyAqcFBlU3RhRW50cnkgPSBOVUxMOyAKKyAgIHRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKyAgIHRBTklfQk9PTEVBTiBmb3VuZCA9IEZBTFNFOworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdEFOSV9CT09MRUFOIGluc2VydEluQ2xpZW50TGlzdCA9IEZBTFNFOworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisKKyAgIGlmKCBjc3JJc0FsbFNlc3Npb25EaXNjb25uZWN0ZWQocE1hYykgKQorICAgeworICAgICAgLy9zbXNMb2cocE1hYywgTE9HVywgImNzckdldFN0YXRpc3RpY3M6IHdyb25nIHN0YXRlIGN1clN0YXRlKCVkKSBub3QgY29ubmVjdGVkXG4iLCBwTWFjLT5yb2FtLmN1clN0YXRlKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICBpZigoIXN0YXRzTWFzaykgJiYgKCFjYWxsYmFjaykpCisgICB7CisgICAgICAvL21zZworICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JHZXRTdGF0aXN0aWNzOiBzdGF0c01hc2sgJiBjYWxsYmFjayBlbXB0eSBpbiB0aGUgcmVxdWVzdFxuIik7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgLy9mb3IgdGhlIHNlYXJjaCBsaXN0IG1ldGhvZCBmb3IgZGVyZWdpc3RlcgorICAgc3RhRW50cnkucmVxdWVzdGVySWQgPSByZXF1ZXN0ZXJJZDsKKyAgIHN0YUVudHJ5LnN0YXRzTWFzayA9IHN0YXRzTWFzazsKKyAgIC8vcmVxdWVzdGVyIHdhbnRzIHRvIGRlcmVnaXN0ZXIgb3IganVzdCBhbiBlcnJvcgorICAgaWYoKHN0YXRzTWFzaykgJiYgKCFjYWxsYmFjaykpCisgICB7CisgICAgICBwRW50cnkgPSBjc3JSb2FtQ2hlY2tuVXBkYXRlQ2xpZW50UmVxTGlzdChwTWFjLCAmc3RhRW50cnksIEZBTFNFKTsKKyAgICAgIGlmKCFwRW50cnkpCisgICAgICB7CisgICAgICAgICAvL21zZworICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JHZXRTdGF0aXN0aWNzOiBjYWxsYmFjayBpcyBlbXB0eSBpbiB0aGUgcmVxdWVzdCAmIGNvdWxkbid0ICIKKyAgICAgICAgICAgICAgICAiZmluZCBhbnkgZXhpc3RpbmcgcmVxdWVzdCBpbiBzdGF0c0NsaWVudFJlcUxpc3RcbiIpOworICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvL2NsZWFuIHVwICYgcmV0dXJuCisgICAgICAgICBwU3RhRW50cnkgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTdGF0c0NsaWVudFJlcUluZm8sIGxpbmsgKTsKKyAgICAgICAgIHBTdGFFbnRyeS0+cFBlU3RhRW50cnktPm51bUNsaWVudC0tOworICAgICAgICAgLy9jaGVjayBpZiB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSBwZVN0YXRzUmVxTGlzdCB0b28KKyAgICAgICAgIGlmKCFwU3RhRW50cnktPnBQZVN0YUVudHJ5LT5udW1DbGllbnQpCisgICAgICAgICB7CisgICAgICAgICAgICBjc3JSb2FtUmVtb3ZlRW50cnlGcm9tUGVTdGF0c1JlcUxpc3QocE1hYywgcFN0YUVudHJ5LT5wUGVTdGFFbnRyeSk7CisgICAgICAgICB9CisgICAgICAgICAvL2NoZWNrIGlmIHdlIG5lZWQgdG8gc3RvcCB0aGUgdGwgc3RhdHMgdGltZXIgdG9vIAorICAgICAgICAgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5udW1DbGllbnQtLTsKKyAgICAgICAgIGlmKCFwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLm51bUNsaWVudCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8udGltZXJSdW5uaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsVGltZXJTdG9wKHBNYWMtPmhIZGQsIHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8uaFRsU3RhdHNUaW1lcik7CisgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNzckdldFN0YXRpc3RpY3M6Y2Fubm90IHN0b3AgVGxTdGF0c1RpbWVyIHRpbWVyXG4iKSk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8ucGVyaW9kaWNpdHkgPSAwOworICAgICAgICAgICAgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby50aW1lclJ1bm5pbmcgPSBGQUxTRTsKKyAgICAgICAgIH0KKyAgICAgICAgIHZvc190aW1lcl9zdG9wKCAmcFN0YUVudHJ5LT50aW1lciApOworCisgICAgICAgICAvLyBEZXN0cm95IHRoZSB2b3MgdGltZXIuLi4gICAgICAKKyAgICAgICAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9kZXN0cm95KCAmcFN0YUVudHJ5LT50aW1lciApOworICAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNzckdldFN0YXRpc3RpY3M6ZmFpbGVkIHRvIGRlc3Ryb3kgQ2xpZW50IHJlcSB0aW1lclxuIikpOworICAgICAgICAgfQorCisgICAgICAgICBjc3JSb2FtUmVtb3ZlU3RhdExpc3RFbnRyeShwTWFjLCBwRW50cnkpOworICAgICAgICAgcFN0YUVudHJ5ID0gTlVMTDsKKyAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgfQorICAgfQorICAgCisgICBpZihjYWNoZSAmJiAhcGVyaW9kaWNpdHkpCisgICB7CisgICAgICAvL3JldHVybiB0aGUgY2FjaGVkIHN0YXRzCisgICAgICBjc3JSb2FtUmVwb3J0U3RhdGlzdGljcyhwTWFjLCBzdGF0c01hc2ssIGNhbGxiYWNrLCBzdGFJZCwgcENvbnRleHQpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy9hZGQgdGhlIHJlcXVlc3QgaW4gdGhlIGNsaWVudCByZXEgbGlzdAorICAgICAgc3RhRW50cnkuY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgIHN0YUVudHJ5LnBDb250ZXh0ID0gcENvbnRleHQ7CisgICAgICBzdGFFbnRyeS5wZXJpb2RpY2l0eSA9IHBlcmlvZGljaXR5OworICAgICAgc3RhRW50cnkucFBlU3RhRW50cnkgPSBOVUxMOworICAgICAgc3RhRW50cnkuc3RhSWQgPSBzdGFJZDsKKyAgICAgIHN0YUVudHJ5LnBNYWMgPSBwTWFjOworICAgICAgc3RhRW50cnkudGltZXJFeHBpcmVkID0gRkFMU0U7CisgICAKKyAgIAorCisgICAgICAvL2lmIHBlcmlvZGljIHJlcG9ydCByZXF1ZXN0ZWQgd2l0aCBub24gY2FjaGVkIHJlc3VsdCBmcm9tIFBFL1RMCisgICAgICBpZihwZXJpb2RpY2l0eSkKKyAgICAgIHsKKyAgICAgIAorICAgICAgICAgLy9pZiBsb29raW5nIGZvciBzdGF0cyBmcm9tIFBFCisgICAgICAgICBpZihzdGF0c01hc2sgJiB+KDEgPDwgZUNzckdsb2JhbENsYXNzRFN0YXRzKSkKKyAgICAgICAgIHsKKyAgICAgICAgIAorICAgICAgICAgICAgLy9jaGVjayBpZiBzYW1lIHJlcXVlc3QgbWFkZSBhbHJlYWR5ICYgd2FpdGluZyBmb3IgcnNwCisgICAgICAgICAgICBwUGVTdGFFbnRyeSA9IGNzclJvYW1DaGVja1BlU3RhdHNSZXFMaXN0KHBNYWMsIHN0YXRzTWFzayAmIH4oMSA8PCBlQ3NyR2xvYmFsQ2xhc3NEU3RhdHMpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNpdHksICZmb3VuZCwgc3RhSWQpOworICAgICAgICAgICAgaWYoIXBQZVN0YUVudHJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9iYWlsIG91dCwgbWF4ZWQgb3V0IG9uIG51bWJlciBvZiByZXEgZm9yIFBFCisgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHN0YUVudHJ5LnBQZVN0YUVudHJ5ID0gcFBlU3RhRW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIC8vcmVxdWVzdCBzdGF0cyBmcm9tIFRMIHJpZ2h0YXdheSBpZiByZXF1ZXN0ZWQgYnkgY2xpZW50LCB1cGRhdGUgdGxTdGF0c1JlcUluZm8gaWYgbmVlZGVkCisgICAgICAgICBpZihzdGF0c01hc2sgJiAoMSA8PCBlQ3NyR2xvYmFsQ2xhc3NEU3RhdHMpKQorICAgICAgICAgeworICAgICAgICAgICAgaWYoY2FjaGUgJiYgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5udW1DbGllbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNzckdldFN0YXRpc3RpY3M6TG9va2luZyBmb3IgY2FjaGVkIHN0YXRzIGZyb20gVExcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgLy91cGRhdGUgcGVyaW9kaWNpdHkKKyAgICAgICAgICAgICAgIGlmKHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8ucGVyaW9kaWNpdHkpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLnBlcmlvZGljaXR5ID0gCisgICAgICAgICAgICAgICAgICAgICBDU1JfUk9BTV9NSU4ocGVyaW9kaWNpdHksIHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8ucGVyaW9kaWNpdHkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5wZXJpb2RpY2l0eSA9IHBlcmlvZGljaXR5OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaWYocE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5wZXJpb2RpY2l0eSA8IENTUl9NSU5fVExfU1RBVF9RVUVSWV9QRVJJT0QpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLnBlcmlvZGljaXR5ID0gQ1NSX01JTl9UTF9TVEFUX1FVRVJZX1BFUklPRDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgaWYoIXBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8udGltZXJSdW5uaW5nKQorICAgICAgICAgICAgICAgeworI2lmIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBTZXNzaW9uIFNwZWNpZmljIGluZm8gY29ubmVjdGVkSW5mbworICAgICAgICAgICAgICAgICAgLy9yZXEgVEwgZm9yIGNsYXNzIEQgc3RhdHMKKyAgICAgICAgICAgICAgICAgIGlmKFdMQU5UTF9HZXRTdGF0aXN0aWNzKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsICZ0bFN0YXRzLCBwTWFjLT5yb2FtLmNvbm5lY3RlZEluZm8uc3RhSWQpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjc3JHZXRTdGF0aXN0aWNzOmNvdWxkbid0IGdldCB0aGUgc3RhdHMgZnJvbSBUTFxuIikpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgLy9zYXZlIGluIFNNRQorICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbVNhdmVTdGF0c0Zyb21UbChwTWFjLCB0bFN0YXRzKTsKKyAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgaWYocE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5wZXJpb2RpY2l0eSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIC8vc3RhcnQgdGltZXIKKyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5oVGxTdGF0c1RpbWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5wZXJpb2RpY2l0eSAqIFBBTF9USU1FUl9UT19NU19VTklULCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjc3JHZXRTdGF0aXN0aWNzOmNhbm5vdCBzdGFydCBUbFN0YXRzVGltZXIgdGltZXJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby50aW1lclJ1bm5pbmcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5udW1DbGllbnQrKzsKKyAgICAgICAgIH0KKyAgIAorICAgICAgICAgaW5zZXJ0SW5DbGllbnRMaXN0ID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIC8vaWYgb25lIHRpbWUgcmVwb3J0IHJlcXVlc3RlZCB3aXRoIG5vbiBjYWNoZWQgcmVzdWx0IGZyb20gUEUvVEwKKyAgICAgIGVsc2UgaWYoIWNhY2hlICYmICFwZXJpb2RpY2l0eSkKKyAgICAgIHsKKyAgICAgICAgIGlmKHN0YXRzTWFzayAmIH4oMSA8PCBlQ3NyR2xvYmFsQ2xhc3NEU3RhdHMpKQorICAgICAgICAgeworICAgICAgICAgICAgLy9zZW5kIGRvd24gYSByZXEKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclNlbmRNQlN0YXRzUmVxTXNnKHBNYWMsIHN0YXRzTWFzayAmIH4oMSA8PCBlQ3NyR2xvYmFsQ2xhc3NEU3RhdHMpLCBzdGFJZCk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNzckdldFN0YXRpc3RpY3M6ZmFpbGVkIHRvIHNlbmQgZG93biBzdGF0cyByZXEgdG8gUEVcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vc28gdGhhdCB3aGVuIHRoZSBzdGF0cyByc3AgY29tZXMgYmFjayBmcm9tIFBFIHdlIHJlc3BvbmQgdG8gdXBwZXIgbGF5ZXIKKyAgICAgICAgICAgIC8vcmlnaHQgYXdheQorICAgICAgICAgICAgc3RhRW50cnkudGltZXJFeHBpcmVkID0gVFJVRTsKKyAgICAgICAgICAgIGluc2VydEluQ2xpZW50TGlzdCA9IFRSVUU7CisKKyAgICAgICAgIH0KKyAgICAgICAgIGlmKHN0YXRzTWFzayAmICgxIDw8IGVDc3JHbG9iYWxDbGFzc0RTdGF0cykpCisgICAgICAgICB7CisjaWYgMAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBQZXIgU2Vzc2lvbiBpbmZvIGNvbm5lY3RlZEluZm8KKyAgICAgICAgICAgIC8vcmVxIFRMIGZvciBjbGFzcyBEIHN0YXRzCisgICAgICAgICAgICBpZihXTEFOVExfR2V0U3RhdGlzdGljcyhwTWFjLT5yb2FtLmdWb3NDb250ZXh0LCAmdGxTdGF0cywgcE1hYy0+cm9hbS5jb25uZWN0ZWRJbmZvLnN0YUlkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiY3NyR2V0U3RhdGlzdGljczpjb3VsZG4ndCBnZXQgdGhlIHN0YXRzIGZyb20gVExcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vc2F2ZSBpbiBTTUUKKyAgICAgICAgICAgICAgIGNzclJvYW1TYXZlU3RhdHNGcm9tVGwocE1hYywgdGxTdGF0cyk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgfQorICAgICAgICAgLy9pZiBsb29raW5nIGZvciBzdGF0cyBmcm9tIFRMIG9ubHkgCisgICAgICAgICBpZighaW5zZXJ0SW5DbGllbnRMaXN0KQorICAgICAgICAgeworICAgICAgICAgICAgLy9yZXR1cm4gdGhlIHN0YXRzCisgICAgICAgICAgICBjc3JSb2FtUmVwb3J0U3RhdGlzdGljcyhwTWFjLCBzdGF0c01hc2ssIGNhbGxiYWNrLCBzdGFJZCwgcENvbnRleHQpOworICAgICAgICAgfQorCisgICAgICB9CisKKyAgICAgIGlmKGluc2VydEluQ2xpZW50TGlzdCkKKyAgICAgIHsKKyAgICAgICAgIHBTdGFFbnRyeSA9IGNzclJvYW1JbnNlcnRFbnRyeUludG9MaXN0KHBNYWMsICZwTWFjLT5yb2FtLnN0YXRzQ2xpZW50UmVxTGlzdCwgJnN0YUVudHJ5KTsgCisgICAgICAgICBpZighcFN0YUVudHJ5KQorICAgICAgICAgeworICAgICAgICAgICAgLy9tc2cKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyR2V0U3RhdGlzdGljczogRmFpbGVkIHRvIGluc2VydCByZXEgaW4gc3RhdHNDbGllbnRSZXFMaXN0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgfQorICAgICAgICAgLy9Jbml0ICYgc3RhcnQgdGltZXIgaWYgbmVlZGVkCisgICAgICAgICBpZihwZXJpb2RpY2l0eSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9pbml0KCAmcFN0YUVudHJ5LT50aW1lciwgVk9TX1RJTUVSX1RZUEVfU1csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1TdGF0c0NsaWVudFRpbWVySGFuZGxlciwgcFN0YUVudHJ5ICk7CisgICAgICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiY3NyR2V0U3RhdGlzdGljczpjYW5ub3QgaW5pdCBTdGF0c0NsaWVudCB0aW1lclxuIikpOworICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b3NTdGF0dXMgPSB2b3NfdGltZXJfc3RhcnQoICZwU3RhRW50cnktPnRpbWVyLCBwZXJpb2RpY2l0eSApOworICAgICAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjc3JHZXRTdGF0aXN0aWNzOmNhbm5vdCBzdGFydCBTdGF0c0NsaWVudCB0aW1lclxuIikpOworICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIH0KKworICAgICAgfQorCisgICB9CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCit0Q3NyUGVTdGF0c1JlcUluZm8gKiBjc3JSb2FtQ2hlY2tQZVN0YXRzUmVxTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiAgc3RhdHNNYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHBlcmlvZGljaXR5LCB0QU5JX0JPT0xFQU4gKnBGb3VuZCwgdEFOSV9VOCBzdGFJZCkKK3sKKyAgIHRBTklfQk9PTEVBTiBmb3VuZCA9IEZBTFNFOworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdENzclBlU3RhdHNSZXFJbmZvIHN0YUVudHJ5OworICAgdENzclBlU3RhdHNSZXFJbmZvICpwVGVtcFN0YUVudHJ5ID0gTlVMTDsKKyAgIHRMaXN0RWxlbSAqcFN0YUVudHJ5ID0gTlVMTDsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgdFBtY1Bvd2VyU3RhdGUgcG93ZXJTdGF0ZTsKKyAgICpwRm91bmQgPSBGQUxTRTsKKyAgICAgIAorICAgcFN0YUVudHJ5ID0gY3NyUm9hbUZpbmRJblBlU3RhdHNSZXFMaXN0KHBNYWMsIHN0YXRzTWFzayk7CisgICBpZihwU3RhRW50cnkpCisgICB7CisgICAgICBwVGVtcFN0YUVudHJ5ID0gR0VUX0JBU0VfQUREUiggcFN0YUVudHJ5LCB0Q3NyUGVTdGF0c1JlcUluZm8sIGxpbmsgKTsKKyAgICAgIGlmKHBUZW1wU3RhRW50cnktPnBlcmlvZGljaXR5KQorICAgICAgeworICAgICAgICAgcFRlbXBTdGFFbnRyeS0+cGVyaW9kaWNpdHkgPSAKKyAgICAgICAgICAgIENTUl9ST0FNX01JTihwZXJpb2RpY2l0eSwgcFRlbXBTdGFFbnRyeS0+cGVyaW9kaWNpdHkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgcFRlbXBTdGFFbnRyeS0+cGVyaW9kaWNpdHkgPSBwZXJpb2RpY2l0eTsKKyAgICAgIH0KKworICAgICAgcFRlbXBTdGFFbnRyeS0+bnVtQ2xpZW50Kys7CisgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZzdGFFbnRyeSwgc2l6ZW9mKHRDc3JQZVN0YXRzUmVxSW5mbykpOworICAgICAgc3RhRW50cnkubnVtQ2xpZW50ID0gMTsKKyAgICAgIHN0YUVudHJ5LnBlcmlvZGljaXR5ID0gcGVyaW9kaWNpdHk7CisgICAgICBzdGFFbnRyeS5wTWFjID0gcE1hYzsKKyAgICAgIHN0YUVudHJ5LnJzcFBlbmRpbmcgPSBGQUxTRTsKKyAgICAgIHN0YUVudHJ5LnN0YUlkID0gc3RhSWQ7CisgICAgICBzdGFFbnRyeS5zdGF0c01hc2sgPSBzdGF0c01hc2s7CisgICAgICBzdGFFbnRyeS50aW1lclJ1bm5pbmcgPSBGQUxTRTsKKyAgICAgIHBUZW1wU3RhRW50cnkgPSBjc3JSb2FtSW5zZXJ0RW50cnlJbnRvUGVTdGF0c1JlcUxpc3QocE1hYywgJnBNYWMtPnJvYW0ucGVTdGF0c1JlcUxpc3QsICZzdGFFbnRyeSk7IAorICAgICAgaWYoIXBUZW1wU3RhRW50cnkpCisgICAgICB7CisgICAgICAgICAvL21zZworICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtQ2hlY2tQZVN0YXRzUmVxTGlzdDogRmFpbGVkIHRvIGluc2VydCByZXEgaW4gcGVTdGF0c1JlcUxpc3RcbiIpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICB9CisKKyAgIHBtY1F1ZXJ5UG93ZXJTdGF0ZShwTWFjLCAmcG93ZXJTdGF0ZSwgTlVMTCwgTlVMTCk7CisgICBpZihlUE1DX0ZVTExfUE9XRVIgPT0gcG93ZXJTdGF0ZSkKKyAgIHsKKyAgICAgIGlmKHBUZW1wU3RhRW50cnktPnBlcmlvZGljaXR5IDwgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zdGF0c1JlcVBlcmlvZGljaXR5KQorICAgICAgeworICAgICAgICAgcFRlbXBTdGFFbnRyeS0+cGVyaW9kaWNpdHkgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnN0YXRzUmVxUGVyaW9kaWNpdHk7CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpZihwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSA8IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc3RhdHNSZXFQZXJpb2RpY2l0eUluUFMpCisgICAgICB7CisgICAgICAgICBwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc3RhdHNSZXFQZXJpb2RpY2l0eUluUFM7CisgICAgICB9CisgICB9CisgICBpZighcFRlbXBTdGFFbnRyeS0+dGltZXJSdW5uaW5nKQorICAgeworICAgICAgLy9zZW5kIGRvd24gYSByZXEgaW4gY2FzZSBvZiBvbmUgdGltZSByZXEsIGZvciBwZXJpb2RpYyBvbmVzIHdhaXQgZm9yIHRpbWVyIHRvIGV4cGlyZQorICAgICAgaWYoIXBUZW1wU3RhRW50cnktPnJzcFBlbmRpbmcgJiYgCisgICAgICAgICAhcFRlbXBTdGFFbnRyeS0+cGVyaW9kaWNpdHkpCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBjc3JTZW5kTUJTdGF0c1JlcU1zZyhwTWFjLCBzdGF0c01hc2sgJiB+KDEgPDwgZUNzckdsb2JhbENsYXNzRFN0YXRzKSwgc3RhSWQpOworICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjc3JSb2FtQ2hlY2tQZVN0YXRzUmVxTGlzdDpmYWlsZWQgdG8gc2VuZCBkb3duIHN0YXRzIHJlcSB0byBQRVxuIikpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgcFRlbXBTdGFFbnRyeS0+cnNwUGVuZGluZyA9IFRSVUU7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBpZihwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSkKKyAgICAgIHsKKyAgICAgICAgIGlmKCFmb3VuZCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX2luaXQoICZwVGVtcFN0YUVudHJ5LT5oUGVTdGF0c1RpbWVyLCBWT1NfVElNRVJfVFlQRV9TVywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbVBlU3RhdHNUaW1lckhhbmRsZXIsIHBUZW1wU3RhRW50cnkgKTsKKyAgICAgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjc3JSb2FtQ2hlY2tQZVN0YXRzUmVxTGlzdDpjYW5ub3QgaW5pdCBoUGVTdGF0c1RpbWVyIHRpbWVyXG4iKSk7CisgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgfQorICAgICAgICAgLy9zdGFydCB0aW1lcgorICAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsICJjc3JSb2FtQ2hlY2tQZVN0YXRzUmVxTGlzdDpwZVN0YXRzVGltZXIgcGVyaW9kICVkXG4iLCBwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSk7CisKKyAgICAgICAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9zdGFydCggJnBUZW1wU3RhRW50cnktPmhQZVN0YXRzVGltZXIsIHBUZW1wU3RhRW50cnktPnBlcmlvZGljaXR5ICk7CisgICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkgCisgICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNzclJvYW1DaGVja1BlU3RhdHNSZXFMaXN0OmNhbm5vdCBzdGFydCBoUGVTdGF0c1RpbWVyIHRpbWVyXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgIH0KKyAgICAgICAgIHBUZW1wU3RhRW50cnktPnRpbWVyUnVubmluZyA9IFRSVUU7CisgICAgICB9CisgICB9CisKKyAgICpwRm91bmQgPSBmb3VuZDsKKyAgIHJldHVybiBwVGVtcFN0YUVudHJ5OworfQorCisKKy8qCisgICAgcFN0YUVudHJ5IGlzIG5vIGxvbmdlciBpbnZhbGlkIHVwb24gdGhlIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uLgorKi8KK3N0YXRpYyB2b2lkIGNzclJvYW1SZW1vdmVTdGF0TGlzdEVudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRMaXN0RWxlbSAqcEVudHJ5KQoreworICAgIGlmKHBFbnRyeSkKKyAgICB7CisgICAgICAgIGlmKGNzckxMUmVtb3ZlRW50cnkoJnBNYWMtPnJvYW0uc3RhdHNDbGllbnRSZXFMaXN0LCBwRW50cnksIExMX0FDQ0VTU19MT0NLKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTdGF0c0NsaWVudFJlcUluZm8sIGxpbmsgKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBjc3JSb2FtUmVtb3ZlRW50cnlGcm9tUGVTdGF0c1JlcUxpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclBlU3RhdHNSZXFJbmZvICpwUGVTdGFFbnRyeSkKK3sKKyAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgdENzclBlU3RhdHNSZXFJbmZvICpwVGVtcFN0YUVudHJ5OworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+cm9hbS5wZVN0YXRzUmVxTGlzdCwgTExfQUNDRVNTX0xPQ0sgKTsKKworICAgaWYoIXBFbnRyeSkKKyAgIHsKKyAgICAgIC8vbGlzdCBlbXB0eQorICAgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JSb2FtUmVtb3ZlRW50cnlGcm9tUGVTdGF0c1JlcUxpc3Q6IExpc3QgZW1wdHksIG5vIHN0YXRzIHJlcSBmb3IgUEVcbiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICB3aGlsZSggcEVudHJ5ICkKKyAgIHsKKyAgICAgIHBUZW1wU3RhRW50cnkgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JQZVN0YXRzUmVxSW5mbywgbGluayApOworCisgICAgICBpZiggcFRlbXBTdGFFbnRyeSAmJiBwVGVtcFN0YUVudHJ5LT5zdGF0c01hc2sgPT0gcFBlU3RhRW50cnktPnN0YXRzTWFzaykKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyUm9hbVJlbW92ZUVudHJ5RnJvbVBlU3RhdHNSZXFMaXN0OiBtYXRjaCBmb3VuZFxuIik7CisgICAgICAgICBpZihwVGVtcFN0YUVudHJ5LT50aW1lclJ1bm5pbmcpCisgICAgICAgICB7CisgICAgICAgICAgICB2b3NTdGF0dXMgPSB2b3NfdGltZXJfc3RvcCggJnBUZW1wU3RhRW50cnktPmhQZVN0YXRzVGltZXIgKTsKKyAgICAgICAgICAgIC8qIElmIHdlIGFyZSBub3QgYWJsZSB0byBzdG9wIHRoZSB0aW1lciBoZXJlLCBqdXN0IHJlbW92ZSAKKyAgICAgICAgICAgICAqIHRoZSBlbnRyeSBmcm9tIHRoZSBsaW5rZWQgbGlzdC4gRGVzdHJveSB0aGUgdGltZXIgb2JqZWN0IAorICAgICAgICAgICAgICogYW5kIGZyZWUgdGhlIG1lbW9yeSBpbiB0aGUgdGltZXIgQ0IKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoIHZvc1N0YXR1cyA9PSBWT1NfU1RBVFVTX1NVQ0NFU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogdGhlIHRpbWVyIGlzIHN1Y2Nlc3NmdWxseSBzdG9wcGVkICovCisgICAgICAgICAgICAgICBwVGVtcFN0YUVudHJ5LT50aW1lclJ1bm5pbmcgPSBGQUxTRTsKKworICAgICAgICAgICAgICAgLyogRGVzdHJveSB0aGUgdGltZXIgKi8KKyAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9kZXN0cm95KCAmcFRlbXBTdGFFbnRyeS0+aFBlU3RhdHNUaW1lciApOworICAgICAgICAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNzclJvYW1SZW1vdmVFbnRyeUZyb21QZVN0YXRzUmVxTGlzdDpmYWlsZWQgdG8gZGVzdHJveSBoUGVTdGF0c1RpbWVyIHRpbWVyXG4iKSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvLyB0aGUgdGltZXIgY291bGQgbm90IGJlIHN0b3BwZWQuIEhlbmNlIGRlc3Ryb3kgYW5kIGZyZWUgdGhlIAorICAgICAgICAgICAgICAgLy8gbWVtb3J5IGZvciB0aGUgUEUgc3RhdCBlbnRyeSBpbiB0aGUgdGltZXIgQ0IuCisgICAgICAgICAgICAgICBwVGVtcFN0YUVudHJ5LT50aW1lclN0b3BGYWlsZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBpZihjc3JMTFJlbW92ZUVudHJ5KCZwTWFjLT5yb2FtLnBlU3RhdHNSZXFMaXN0LCBwRW50cnksIExMX0FDQ0VTU19MT0NLKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE9ubHkgZnJlZSB0aGUgbWVtb3J5IGlmIHdlIGNvdWxkIHN0b3AgdGhlIHRpbWVyIHN1Y2Nlc3NmdWxseQorICAgICAgICAgICAgaWYoIXBUZW1wU3RhRW50cnktPnRpbWVyU3RvcEZhaWxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFRlbXBTdGFFbnRyeSk7CisgICAgICAgICAgICAgICBwVGVtcFN0YUVudHJ5ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBwRW50cnkgPSBjc3JMTE5leHQoICZwTWFjLT5yb2FtLnBlU3RhdHNSZXFMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0sgKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuOworfQorCisKK3ZvaWQgY3NyUm9hbVNhdmVTdGF0c0Zyb21UbCh0cEFuaVNpckdsb2JhbCBwTWFjLCBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgdGxTdGF0cykKK3sKKworICAgcE1hYy0+cm9hbS5jbGFzc0RTdGF0c0luZm8ubnVtX3J4X2J5dGVzX2NyY19vayA9IHRsU3RhdHMucnhCY250Q1JDb2s7CisgICBwTWFjLT5yb2FtLmNsYXNzRFN0YXRzSW5mby5yeF9iY19ieXRlX2NudCA9IHRsU3RhdHMucnhCQ0JjbnQ7CisgICBwTWFjLT5yb2FtLmNsYXNzRFN0YXRzSW5mby5yeF9iY19mcm1fY250ID0gdGxTdGF0cy5yeEJDRmNudDsKKyAgIHBNYWMtPnJvYW0uY2xhc3NEU3RhdHNJbmZvLnJ4X2J5dGVfY250ID0gdGxTdGF0cy5yeEJjbnQ7CisgICBwTWFjLT5yb2FtLmNsYXNzRFN0YXRzSW5mby5yeF9tY19ieXRlX2NudCA9IHRsU3RhdHMucnhNQ0JjbnQ7CisgICBwTWFjLT5yb2FtLmNsYXNzRFN0YXRzSW5mby5yeF9tY19mcm1fY250ID0gdGxTdGF0cy5yeE1DRmNudDsKKyAgIHBNYWMtPnJvYW0uY2xhc3NEU3RhdHNJbmZvLnJ4X3JhdGUgPSB0bFN0YXRzLnJ4UmF0ZTsKKyAgIC8vPz8gbmVlZCBwZXIgQUMKKyAgIHBNYWMtPnJvYW0uY2xhc3NEU3RhdHNJbmZvLnJ4X3VjX2J5dGVfY250WzBdID0gdGxTdGF0cy5yeFVDQmNudDsKKyAgIHBNYWMtPnJvYW0uY2xhc3NEU3RhdHNJbmZvLnJ4X3VjX2ZybV9jbnQgPSB0bFN0YXRzLnJ4VUNGY250OworICAgcE1hYy0+cm9hbS5jbGFzc0RTdGF0c0luZm8udHhfYmNfYnl0ZV9jbnQgPSB0bFN0YXRzLnR4QkNCY250OworICAgcE1hYy0+cm9hbS5jbGFzc0RTdGF0c0luZm8udHhfYmNfZnJtX2NudCA9IHRsU3RhdHMudHhCQ0ZjbnQ7CisgICBwTWFjLT5yb2FtLmNsYXNzRFN0YXRzSW5mby50eF9tY19ieXRlX2NudCA9IHRsU3RhdHMudHhNQ0JjbnQ7CisgICBwTWFjLT5yb2FtLmNsYXNzRFN0YXRzSW5mby50eF9tY19mcm1fY250ID0gdGxTdGF0cy50eE1DRmNudDsKKyAgIC8vPz8gbmVlZCBwZXIgQUMKKyAgIHBNYWMtPnJvYW0uY2xhc3NEU3RhdHNJbmZvLnR4X3VjX2J5dGVfY250WzBdID0gdGxTdGF0cy50eFVDQmNudDsKKyAgIHBNYWMtPnJvYW0uY2xhc3NEU3RhdHNJbmZvLnR4X3VjX2ZybV9jbnQgPSB0bFN0YXRzLnR4VUNGY250OworCit9CisKKwordm9pZCBjc3JSb2FtUmVwb3J0U3RhdGlzdGljcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzdGF0c01hc2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyU3RhdHNDYWxsYmFjayBjYWxsYmFjaywgdEFOSV9VOCBzdGFJZCwgdm9pZCAqcENvbnRleHQpCit7CisgICB0QU5JX1U4IHN0YXRzWzUwMF07CisgICB0QU5JX1U4ICpwU3RhdHMgPSBOVUxMOworICAgdEFOSV9VMzIgdGVtcE1hc2sgPSAwOworICAgdEFOSV9VOCBjb3VudGVyID0gMDsKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgaWYoIWNhbGxiYWNrKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjc3JSb2FtUmVwb3J0U3RhdGlzdGljczpjYW5ub3QgcmVwb3J0IGNhbGxiYWNrIE5VTExcbiIpKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIGlmKCFzdGF0c01hc2spCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNzclJvYW1SZXBvcnRTdGF0aXN0aWNzOmNhbm5vdCByZXBvcnQgc3RhdHNNYXNrIGlzIDBcbiIpKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcFN0YXRzID0gc3RhdHM7CisKKyAgIHRlbXBNYXNrID0gc3RhdHNNYXNrOworCisgICB3aGlsZSh0ZW1wTWFzaykKKyAgIHsKKyAgICAgIGlmKHRlbXBNYXNrICYgMSkKKyAgICAgIHsKKyAgICAgICAgIC8vbmV3IHN0YXRzIGluZm8gZnJvbSBQRSwgZmlsbCB1cCB0aGUgc3RhdHMgc3RydWN1dHJlcyBpbiBQTUFDCisgICAgICAgICBzd2l0Y2goY291bnRlcikKKyAgICAgICAgIHsKKyAgICAgICAgIGNhc2UgZUNzclN1bW1hcnlTdGF0czoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoImNzclJvYW1SZXBvcnRTdGF0aXN0aWNzOnN1bW1hcnkgc3RhdHNcbiIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFN0YXRzLCAodEFOSV9VOCAqKSZwTWFjLT5yb2FtLnN1bW1hcnlTdGF0c0luZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodENzclN1bW1hcnlTdGF0c0luZm8pKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoImNzclJvYW1SZXBvcnRTdGF0aXN0aWNzOmZhaWxlZCB0byBjb3B5IHN1bW1hcnkgc3RhdHNcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTdGF0cyArPSBzaXplb2YodENzclN1bW1hcnlTdGF0c0luZm8pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgZUNzckdsb2JhbENsYXNzQVN0YXRzOgorICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCBGTCgiY3NyUm9hbVJlcG9ydFN0YXRpc3RpY3M6Q2xhc3NBIHN0YXRzXG4iKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBTdGF0cywgKHRBTklfVTggKikmcE1hYy0+cm9hbS5jbGFzc0FTdGF0c0luZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodENzckdsb2JhbENsYXNzQVN0YXRzSW5mbykpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCBGTCgiY3NyUm9hbVJlcG9ydFN0YXRpc3RpY3M6ZmFpbGVkIHRvIGNvcHkgQ2xhc3NBIHN0YXRzXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU3RhdHMgKz0gc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0FTdGF0c0luZm8pOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBlQ3NyR2xvYmFsQ2xhc3NCU3RhdHM6CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPRzEsIEZMKCJjc3JSb2FtUmVwb3J0U3RhdGlzdGljczpDbGFzc0Igc3RhdHNcbiIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFN0YXRzLCAodEFOSV9VOCAqKSZwTWFjLT5yb2FtLmNsYXNzQlN0YXRzSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NCU3RhdHNJbmZvKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPRzEsIEZMKCJjc3JSb2FtUmVwb3J0U3RhdGlzdGljczpmYWlsZWQgdG8gY29weSBDbGFzc0Igc3RhdHNcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTdGF0cyArPSBzaXplb2YodENzckdsb2JhbENsYXNzQlN0YXRzSW5mbyk7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIGVDc3JHbG9iYWxDbGFzc0NTdGF0czoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoImNzclJvYW1SZXBvcnRTdGF0aXN0aWNzOkNsYXNzQyBzdGF0c1xuIikpOworICAgICAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU3RhdHMsICh0QU5JX1U4ICopJnBNYWMtPnJvYW0uY2xhc3NDU3RhdHNJbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0NTdGF0c0luZm8pKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoImNzclJvYW1SZXBvcnRTdGF0aXN0aWNzOmZhaWxlZCB0byBjb3B5IENsYXNzQyBzdGF0c1xuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFN0YXRzICs9IHNpemVvZih0Q3NyR2xvYmFsQ2xhc3NDU3RhdHNJbmZvKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgZUNzckdsb2JhbENsYXNzRFN0YXRzOgorICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCBGTCgiY3NyUm9hbVJlcG9ydFN0YXRpc3RpY3M6Q2xhc3NEIHN0YXRzXG4iKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBTdGF0cywgKHRBTklfVTggKikmcE1hYy0+cm9hbS5jbGFzc0RTdGF0c0luZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodENzckdsb2JhbENsYXNzRFN0YXRzSW5mbykpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCBGTCgiY3NyUm9hbVJlcG9ydFN0YXRpc3RpY3M6ZmFpbGVkIHRvIGNvcHkgQ2xhc3NEIHN0YXRzXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU3RhdHMgKz0gc2l6ZW9mKHRDc3JHbG9iYWxDbGFzc0RTdGF0c0luZm8pOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBlQ3NyUGVyU3RhU3RhdHM6CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPRzEsIEZMKCJjc3JSb2FtUmVwb3J0U3RhdGlzdGljczpQZXJTdGEgc3RhdHNcbiIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFN0YXRzLCAodEFOSV9VOCAqKSZwTWFjLT5yb2FtLnBlclN0YVN0YXRzSW5mb1tzdGFJZF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodENzclBlclN0YVN0YXRzSW5mbykpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCBGTCgiY3NyUm9hbVJlcG9ydFN0YXRpc3RpY3M6ZmFpbGVkIHRvIGNvcHkgUGVyU3RhIHN0YXRzXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU3RhdHMgKz0gc2l6ZW9mKHRDc3JQZXJTdGFTdGF0c0luZm8pOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HMSwgRkwoImNzclJvYW1SZXBvcnRTdGF0aXN0aWNzOnVua25vd24gc3RhdHMgdHlwZVxuIikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGVtcE1hc2sgPj49MTsKKyAgICAgIGNvdW50ZXIrKzsKKyAgIH0KKworICAgY2FsbGJhY2soc3RhdHMsIHBDb250ZXh0ICk7CisKK30KKworCisKK2VIYWxTdGF0dXMgY3NyUm9hbURlcmVnU3RhdGlzdGljc1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworICAgdExpc3RFbGVtICpwUHJldkVudHJ5ID0gTlVMTDsKKyAgIHRDc3JTdGF0c0NsaWVudFJlcUluZm8gKnBUZW1wU3RhRW50cnkgPSBOVUxMOworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+cm9hbS5zdGF0c0NsaWVudFJlcUxpc3QsIExMX0FDQ0VTU19MT0NLICk7CisKKyAgIGlmKCFwRW50cnkpCisgICB7CisgICAgICAvL2xpc3QgZW1wdHkKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyUm9hbURlcmVnU3RhdGlzdGljc1JlcTogTGlzdCBlbXB0eSwgbm8gcmVxdWVzdCBmcm9tICIKKyAgICAgICAgICAgICAidXBwZXIgbGF5ZXIgY2xpZW50KHMpXG4iKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisKKyAgIHdoaWxlKCBwRW50cnkgKQorICAgeworICAgICAgaWYocFByZXZFbnRyeSkKKyAgICAgIHsKKyAgICAgICAgIHBUZW1wU3RhRW50cnkgPSBHRVRfQkFTRV9BRERSKCBwUHJldkVudHJ5LCB0Q3NyU3RhdHNDbGllbnRSZXFJbmZvLCBsaW5rICk7CisgICAgICAgICAvL3NlbmQgdXAgdGhlIHN0YXRzIHJlcG9ydAorICAgICAgICAgY3NyUm9hbVJlcG9ydFN0YXRpc3RpY3MocE1hYywgcFRlbXBTdGFFbnRyeS0+c3RhdHNNYXNrLCBwVGVtcFN0YUVudHJ5LT5jYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFN0YUVudHJ5LT5zdGFJZCwgcFRlbXBTdGFFbnRyeS0+cENvbnRleHQpOworICAgICAgICAgY3NyUm9hbVJlbW92ZVN0YXRMaXN0RW50cnkocE1hYywgcFByZXZFbnRyeSk7CisgICAgICB9CisKKyAgICAgIHBUZW1wU3RhRW50cnkgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTdGF0c0NsaWVudFJlcUluZm8sIGxpbmsgKTsKKworICAgICAgaWYgKHBUZW1wU3RhRW50cnktPnBQZVN0YUVudHJ5KSAgLy9wUGVTdGFFbnRyeSBjYW4gYmUgTlVMTAorICAgICAgeworICAgICAgcFRlbXBTdGFFbnRyeS0+cFBlU3RhRW50cnktPm51bUNsaWVudC0tOworICAgICAgLy9jaGVjayBpZiB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSBwZVN0YXRzUmVxTGlzdCB0b28KKyAgICAgIGlmKCFwVGVtcFN0YUVudHJ5LT5wUGVTdGFFbnRyeS0+bnVtQ2xpZW50KQorICAgICAgeworICAgICAgICAgY3NyUm9hbVJlbW92ZUVudHJ5RnJvbVBlU3RhdHNSZXFMaXN0KHBNYWMsIHBUZW1wU3RhRW50cnktPnBQZVN0YUVudHJ5KTsKKyAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy9jaGVjayBpZiB3ZSBuZWVkIHRvIHN0b3AgdGhlIHRsIHN0YXRzIHRpbWVyIHRvbyAKKyAgICAgIHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8ubnVtQ2xpZW50LS07CisgICAgICBpZighcE1hYy0+cm9hbS50bFN0YXRzUmVxSW5mby5udW1DbGllbnQpCisgICAgICB7CisgICAgICAgICBpZihwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLnRpbWVyUnVubmluZykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLmhUbFN0YXRzVGltZXIpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjc3JSb2FtRGVyZWdTdGF0aXN0aWNzUmVxOmNhbm5vdCBzdG9wIFRsU3RhdHNUaW1lciB0aW1lclxuIikpOworICAgICAgICAgICAgICAgLy93ZSB3aWxsIGNvbnRpbnVlCisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBwTWFjLT5yb2FtLnRsU3RhdHNSZXFJbmZvLnBlcmlvZGljaXR5ID0gMDsKKyAgICAgICAgIHBNYWMtPnJvYW0udGxTdGF0c1JlcUluZm8udGltZXJSdW5uaW5nID0gRkFMU0U7CisgICAgICB9CisKKyAgICAgIGlmIChwVGVtcFN0YUVudHJ5LT5wZXJpb2RpY2l0eSkKKyAgICAgIHsKKyAgICAgICAgICAvL1doaWxlIGNyZWF0aW5nIFN0YUVudHJ5IGluIGNzckdldFN0YXRpc3RpY3MsCisgICAgICAgICAgLy9Jbml0aWFsaXppbmcgYW5kIHN0YXJ0aW5nIHRpbWVyIG9ubHkgd2hlbiBwZXJpb2RpY2l0eSBpcyBzZXQuIAorICAgICAgICAgIC8vU28gU3RvcCBhbmQgRGVzdHJveSB0aW1lciBvbmx5IHdoZW4gcGVyaW9kaWNpdHkgaXMgc2V0LgorICAgICAgICAgIAorCisgICAgICB2b3NfdGltZXJfc3RvcCggJnBUZW1wU3RhRW50cnktPnRpbWVyICk7CisKKyAgICAgIC8vIERlc3Ryb3kgdGhlIHZvcyB0aW1lci4uLiAgICAgIAorICAgICAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX2Rlc3Ryb3koICZwVGVtcFN0YUVudHJ5LT50aW1lciApOworICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICAgICB7CisgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNzclJvYW1EZXJlZ1N0YXRpc3RpY3NSZXE6ZmFpbGVkIHRvIGRlc3Ryb3kgQ2xpZW50IHJlcSB0aW1lclxuIikpOworICAgICAgfQorICAgICAgfQorCisgICAgICAKKyAgICAgIHBQcmV2RW50cnkgPSBwRW50cnk7CisgICAgICBwRW50cnkgPSBjc3JMTE5leHQoICZwTWFjLT5yb2FtLnN0YXRzQ2xpZW50UmVxTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLICk7CisgICB9CisgICAvL3RoZSBsYXN0IG9uZQorICAgaWYocFByZXZFbnRyeSkKKyAgIHsKKyAgICAgIHBUZW1wU3RhRW50cnkgPSBHRVRfQkFTRV9BRERSKCBwUHJldkVudHJ5LCB0Q3NyU3RhdHNDbGllbnRSZXFJbmZvLCBsaW5rICk7CisgICAgICAvL3NlbmQgdXAgdGhlIHN0YXRzIHJlcG9ydAorICAgICAgY3NyUm9hbVJlcG9ydFN0YXRpc3RpY3MocE1hYywgcFRlbXBTdGFFbnRyeS0+c3RhdHNNYXNrLCBwVGVtcFN0YUVudHJ5LT5jYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFN0YUVudHJ5LT5zdGFJZCwgcFRlbXBTdGFFbnRyeS0+cENvbnRleHQpOworICAgICAgY3NyUm9hbVJlbW92ZVN0YXRMaXN0RW50cnkocE1hYywgcFByZXZFbnRyeSk7CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7CisgICAKK30KKworCitlSGFsU3RhdHVzIGNzcklzRnVsbFBvd2VyTmVlZGVkKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRSZXF1ZXN0RnVsbFBvd2VyUmVhc29uICpwUmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX0JPT0xFQU4gKnBmTmVlZFBvd2VyICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZk5lZWRGdWxsUG93ZXIgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdFJlcXVlc3RGdWxsUG93ZXJSZWFzb24gcmVhc29uID0gZVNNRV9SRUFTT05fT1RIRVI7CisgICAgdFBtY1N0YXRlIHBtY1N0YXRlOworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgLy8gVE9ETyA6IFNlc3Npb24gaW5mbyB1bmF2YWlsYWJsZQorICAgICAgICB0QU5JX1UzMiBzZXNzaW9uSWQgPSAwOworCisgICAgaWYoIHBmTmVlZFBvd2VyICkKKyAgICB7CisgICAgICAgICpwZk5lZWRQb3dlciA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB9CisgICAgICAgIC8vV2Ugb25seSBoYW5kbGUgQ1NSIGNvbW1hbmRzCisgICAgICAgIGlmKCAhKGVTbWVDc3JDb21tYW5kTWFzayAmIHBDb21tYW5kLT5jb21tYW5kKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorCisgICAgLy9DaGVjayBQTUMgc3RhdGUgZmlyc3QKKyAgICBwbWNTdGF0ZSA9IHBtY0dldFBtY1N0YXRlKCBwTWFjICk7CisKKyAgICBzd2l0Y2goIHBtY1N0YXRlICkKKyAgICB7CisgICAgY2FzZSBSRVFVRVNUX0lNUFM6CisgICAgY2FzZSBJTVBTOgorICAgICAgICBpZiggZVNtZUNvbW1hbmRTY2FuID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKCBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGVDc3JTY2FuR2V0UmVzdWx0OgorICAgICAgICAgICAgY2FzZSBlQ3NyU2NhbkJHU2NhbkFib3J0OgorICAgICAgICAgICAgY2FzZSBlQ3NyU2NhbkJHU2NhbkVuYWJsZToKKyAgICAgICAgICAgIGNhc2UgZUNzclNjYW5HZXRTY2FuQ2huSW5mbzoKKyAgICAgICAgICAgICAgICAvL0ludGVybmFsIHByb2Nlc3MsIG5vIG5lZWQgZm9yIGZ1bGwgcG93ZXIKKyAgICAgICAgICAgICAgICBmTmVlZEZ1bGxQb3dlciA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvL090aGVyIHNjYW5zIGFyZSByZWFsIHNjYW4sIGFzayBmb3IgcG93ZXIKKyAgICAgICAgICAgICAgICBmTmVlZEZ1bGxQb3dlciA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAvL3N3aXRjaAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9hc2sgZm9yIHBvd2VyIGZvciByb2FtIGFuZCBzdGF0dXMgY2hhbmdlCisgICAgICAgICAgICBmTmVlZEZ1bGxQb3dlciA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVFVRVNUX0JNUFM6CisgICAgY2FzZSBCTVBTOgorICAgIGNhc2UgUkVRVUVTVF9TVEFSVF9VQVBTRDoKKyAgICBjYXNlIFVBUFNEOgorICAgIC8vV2UgdHJlYXQgV09XTCBzYW1lIGFzIEJNUFMKKyAgICBjYXNlIFJFUVVFU1RfRU5URVJfV09XTDoKKyAgICBjYXNlIFdPV0w6CisgICAgICAgIGlmKCBlU21lQ29tbWFuZFJvYW0gPT0gcENvbW1hbmQtPmNvbW1hbmQgKQorICAgICAgICB7CisgICAgICAgICAgICB0U2NhblJlc3VsdExpc3QgKnBCU1NMaXN0ID0gKHRTY2FuUmVzdWx0TGlzdCAqKXBDb21tYW5kLT51LnJvYW1DbWQuaEJTU0xpc3Q7CisgICAgICAgICAgICB0Q3NyU2NhblJlc3VsdCAqcFNjYW5SZXN1bHQ7CisgICAgICAgICAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKworICAgICAgICAgICAgc3dpdGNoICggcENvbW1hbmQtPnUucm9hbUNtZC5yb2FtUmVhc29uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgZUNzckZvcmNlZERpc2Fzc29jOgorICAgICAgICAgICAgY2FzZSBlQ3NyRm9yY2VkRGlzYXNzb2NNSUNGYWlsdXJlOgorICAgICAgICAgICAgICAgIHJlYXNvbiA9IGVTTUVfTElOS19ESVNDT05ORUNURURfQllfSEREOworICAgICAgICAgICAgICAgIGZOZWVkRnVsbFBvd2VyID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlQ3NyU21lSXNzdWVkRGlzYXNzb2NGb3JIYW5kb2ZmOgorICAgICAgICAgICAgY2FzZSBlQ3NyRm9yY2VkRGVhdXRoOgorICAgICAgICAgICAgY2FzZSBlQ3NySGRkSXNzdWVkUmVhc3NvY1RvU2FtZUFQOgorICAgICAgICAgICAgY2FzZSBlQ3NyU21lSXNzdWVkUmVhc3NvY1RvU2FtZUFQOgorICAgICAgICAgICAgICAgIGZOZWVkRnVsbFBvd2VyID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgZUNzckNhcHNDaGFuZ2U6CisgICAgICAgICAgICAgICAgZk5lZWRGdWxsUG93ZXIgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvL0NoZWNrIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgYWxyZWFkeSBjb25uZWN0ZWQuIElmIHNvLCBubyBuZWVkIGZvciBmdWxsIHBvd2VyCisgICAgICAgICAgICAgICAgLy9Ob3RlOiBJQlNTIGlzIGlnbm9yZWQgZm9yIG5vdyBiZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQgcG93ZXJzYXZlIGluIElCU1MKKyAgICAgICAgICAgICAgICBpZiAoIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSW5mcmEocE1hYywgc2Vzc2lvbklkKSAmJiBwQlNTTGlzdCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL09ubHkgbmVlZCB0byBjaGVjayB0aGUgZmlyc3Qgb25lCisgICAgICAgICAgICAgICAgICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoJnBCU1NMaXN0LT5MaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwRW50cnkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlc3VsdCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0Q3NyU2NhblJlc3VsdCwgTGluayk7CisjaWYgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IFNlc3Npb24gU3BlY2lmaWMgaW5mbyBwQ29ubmVjdEJzc0Rlc2MKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjc3JJc0Jzc0lkRXF1YWwoIHBNYWMsICZwU2NhblJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IsIHBNYWMtPnJvYW0ucENvbm5lY3RCc3NEZXNjICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JJc1NzaWRFcXVhbCggcE1hYywgcE1hYy0+cm9hbS5wQ29ubmVjdEJzc0Rlc2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNjYW5SZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCAodERvdDExZkJlYWNvbklFcyAqKSggcFNjYW5SZXN1bHQtPlJlc3VsdC5wdkllcyApICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgQXV0aCB0eXBlIGhhcyBjaGFuZ2VkIGluIHRoZSBQcm9maWxlLiAgSWYgc28sIHdlIGRvbid0IHdhbnQgdG8gUmVhc3NvY2lhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIEF1dGhlbnRpY2F0aW5nIGZpcnN0LiAgVG8gZm9yY2UgdGhpcywgc3RvcCB0aGUgY3VycmVudCBhc3NvY2lhdGlvbiAoRGlzYXNzb2NpYXRlKSBhbmQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZSAnSm9pbicgdGhlIEFQLCB3aWhjaCB3aWxsIGZvcmNlIGFuIEF1dGhlbnRpY2F0aW9uICh3aXRoIHRoZSBuZXcgQXV0aCB0eXBlKSBmb2xsb3dlZCBieSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG5ldyBBc3NvY2lhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjc3JJc1NhbWVQcm9maWxlKHBNYWMsICZwTWFjLT5yb2FtLmNvbm5lY3RlZFByb2ZpbGUsIHBQcm9maWxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNzclJvYW1Jc1NhbWVQcm9maWxlS2V5cyhwTWFjLCAmcE1hYy0+cm9hbS5jb25uZWN0ZWRQcm9maWxlLCBwUHJvZmlsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRG9uZSwgZXZlbnR1YWxseSwgdGhlIGNvbW1hbmQgcmVhY2hlcyBlQ3NyUmVhc3NvY1RvU2VsZk5vQ2FwQ2hhbmdlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ObyBuZWVkIGZvciBmdWxsIHBvd2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgZmxhZyBzbyB0aGUgY29kZSBsYXRlciBjYW4gYXZvaWQgdG8gZG8gdGhlIGFib3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGFnYWluLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucm9hbUNtZC5mUmVhc3NvY1RvU2VsZk5vQ2FwQ2hhbmdlID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vSWYgd2UgYXJlIGhlcmUsIGZ1bGwgcG93ZXIgaXMgbmVlZGVkCisgICAgICAgICAgICAgICAgZk5lZWRGdWxsUG93ZXIgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBlU21lQ29tbWFuZFdtU3RhdHVzQ2hhbmdlID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9uZWVkIGZ1bGwgcG93ZXIgZm9yIGFsbAorICAgICAgICAgICAgZk5lZWRGdWxsUG93ZXIgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIHJlYXNvbiA9IGVTTUVfTElOS19ESVNDT05ORUNURURfQllfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFUVVFU1RfU1RPUF9VQVBTRDoKKyAgICBjYXNlIFJFUVVFU1RfRVhJVF9XT1dMOgorICAgICAgICBpZiggZVNtZUNvbW1hbmRSb2FtID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgZk5lZWRGdWxsUG93ZXIgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIHN3aXRjaCAoIHBDb21tYW5kLT51LnJvYW1DbWQucm9hbVJlYXNvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlQ3NyRm9yY2VkRGlzYXNzb2M6CisgICAgICAgICAgICAgICAgY2FzZSBlQ3NyRm9yY2VkRGlzYXNzb2NNSUNGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICByZWFzb24gPSBlU01FX0xJTktfRElTQ09OTkVDVEVEX0JZX0hERDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgU1RPUFBFRDoKKyAgICBjYXNlIFJFUVVFU1RfU1RBTkRCWToKKyAgICBjYXNlIFNUQU5EQlk6CisgICAgY2FzZSBMT1dfUE9XRVI6CisgICAgICAgIC8vV2UgYXJlIG5vdCBzdXBwb3NlZCB0byBkbyBhbnl0aGluZworICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCAiICBjYW5ub3QgcHJvY2VzcyBiZWNhdXNlIFBNQyBpcyBpbiBzdG9wcGVkL3N0YW5kYnkgc3RhdGUgJWRcbiIgKSwgcG1jU3RhdGUgKTsKKyAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZVTExfUE9XRVI6CisgICAgY2FzZSBSRVFVRVNUX0ZVTExfUE9XRVI6CisgICAgZGVmYXVsdDoKKyAgICAgICAgLy9ObyBuZWVkIHRvIGFzayBmb3IgZnVsbCBwb3dlci4gVGhpcyBoYXMgdG8gYmUgRlVMTF9QT1dFUiBzdGF0ZQorICAgICAgICBicmVhazsKKworICAgIH0gLy9zd2l0Y2gKKworICAgIGlmKCBwUmVhc29uICkKKyAgICB7CisgICAgICAgICpwUmVhc29uID0gcmVhc29uOworICAgIH0KKyAgICBpZiggcGZOZWVkUG93ZXIgKQorICAgIHsKKyAgICAgICAgKnBmTmVlZFBvd2VyID0gZk5lZWRGdWxsUG93ZXI7CisgICAgfQorCisgICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKKworc3RhdGljIGVIYWxTdGF0dXMgY3NyUmVxdWVzdEZ1bGxQb3dlciggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0QU5JX0JPT0xFQU4gZk5lZWRGdWxsUG93ZXIgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdFJlcXVlc3RGdWxsUG93ZXJSZWFzb24gcmVhc29uID0gZVNNRV9SRUFTT05fT1RIRVI7CisKKyAgICBzdGF0dXMgPSBjc3JJc0Z1bGxQb3dlck5lZWRlZCggcE1hYywgcENvbW1hbmQsICZyZWFzb24sICZmTmVlZEZ1bGxQb3dlciApOworCisgICAgaWYoIGZOZWVkRnVsbFBvd2VyICYmIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gcG1jUmVxdWVzdEZ1bGxQb3dlcihwTWFjLCBjc3JGdWxsUG93ZXJDYWxsYmFjaywgcE1hYywgcmVhc29uKTsKKyAgICB9CisKKyAgICByZXR1cm4gKCBzdGF0dXMgKTsKK30KKworCit0U21lQ21kICpjc3JHZXRDb21tYW5kQnVmZmVyKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICB0U21lQ21kICpwQ21kID0gc21lR2V0Q29tbWFuZEJ1ZmZlciggcE1hYyApOworCisgICAgaWYoIHBDbWQgKQorICAgIHsKKyAgICAgICAgcE1hYy0+cm9hbS5zUGVuZGluZ0NvbW1hbmRzKys7CisgICAgfQorCisgICAgcmV0dXJuICggcENtZCApOworfQorCisKK3ZvaWQgY3NyUmVsZWFzZUNvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisgICBpZiAocE1hYy0+cm9hbS5zUGVuZGluZ0NvbW1hbmRzID4gMCkKKyAgIHsKKyAgICAgICAvL0FsbCBjb21tYW5kIGFsbG9jYXRlZCB0aHJvdWdoIGNzckdldENvbW1hbmRCdWZmZXIgbmVlZCB0bworICAgICAgIC8vZGVjcmVtZW50IHRoZSBwZW5kaW5nIGNvdW50IHdoZW4gcmVsZWFzaW5nLgorICAgICAgIHBNYWMtPnJvYW0uc1BlbmRpbmdDb21tYW5kcy0tOworICAgICAgIHNtZVJlbGVhc2VDb21tYW5kKCBwTWFjLCBwQ29tbWFuZCApOworICAgfQorICAgZWxzZQorICAgeworICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCggIm5vIHBlbmRpbmcgY29tbWFuZHMiKSk7CisgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgIH0KK30KKworCisvL1JldHVybiBTVUNDRVNTIGlzIHRoZSBjb21tYW5kIGlzIHF1ZXVlZCwgZmFpbGVkCitlSGFsU3RhdHVzIGNzclF1ZXVlU21lQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIHRBTklfQk9PTEVBTiBmSGlnaFByaW9yaXR5ICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKworICAgIGlmKCAoZVNtZUNvbW1hbmRTY2FuID09IHBDb21tYW5kLT5jb21tYW5kKSAmJiBwTWFjLT5zY2FuLmZEcm9wU2NhbkNtZCApCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBkcm9wIHNjYW4gKHNjYW4gcmVhc29uICVkKSBjb21tYW5kIiksCisgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0NTUl9XUk9OR19TVEFURTsKKyAgICB9CisKKyAgICAvL1dlIGNhbiBjYWxsIHJlcXVlc3QgZnVsbCBwb3dlciBmaXJzdCBiZWZvcmUgcHV0dGluZyB0aGUgY29tbWFuZCBpbnRvIHBlbmRpbmcgUQorICAgIC8vYmVjYXVzZSB3ZSBhcmUgaG9sZGluZyBTTUUgbG9jayBhdCB0aGlzIHBvaW50LgorICAgIHN0YXR1cyA9IGNzclJlcXVlc3RGdWxsUG93ZXIoIHBNYWMsIHBDb21tYW5kICk7CisgICAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgdEFOSV9CT09MRUFOIGZOb0NtZFBlbmRpbmc7CisKKyAgICAgICAgLy9tYWtlIHN1cmUgcm9hbUNtZFBlbmRpbmdMaXN0IGlzIG5vdCBlbXB0eSBmaXJzdAorICAgICAgICBmTm9DbWRQZW5kaW5nID0gY3NyTExJc0xpc3RFbXB0eSggJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0LCBlQU5JX0JPT0xFQU5fRkFMU0UgKTsKKyAgICAgICAgaWYoIGZOb0NtZFBlbmRpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBzbWVQdXNoQ29tbWFuZCggcE1hYywgcENvbW1hbmQsIGZIaWdoUHJpb3JpdHkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAvL090aGVyIGNvbW1hbmRzIGFyZSB3YWl0aW5nIGZvciBQTUMgY2FsbGJhY2ssIHF1ZXVlIHRoZSBuZXcgY29tbWFuZCB0byB0aGUgcGVuZGluZyBRCisgICAgICAgICAgICAvL25vIGxpc3QgbG9jayBpcyBuZWVkZWQgc2luY2UgU01FIGxvY2sgaXMgaGVsZAorICAgICAgICAgICAgaWYoICFmSGlnaFByaW9yaXR5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjc3JMTEluc2VydFRhaWwoICZwTWFjLT5yb2FtLnJvYW1DbWRQZW5kaW5nTGlzdCwgJnBDb21tYW5kLT5MaW5rLCBlQU5JX0JPT0xFQU5fRkFMU0UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNzckxMSW5zZXJ0SGVhZCggJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0LCAmcENvbW1hbmQtPkxpbmssIGVBTklfQk9PTEVBTl9GQUxTRSApOworICAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgPT0gc3RhdHVzICkKKyAgICB7CisgICAgICAgIC8vbm8gbGlzdCBsb2NrIGlzIG5lZWRlZCBzaW5jZSBTTUUgbG9jayBpcyBoZWxkCisgICAgICAgIGlmKCAhZkhpZ2hQcmlvcml0eSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzckxMSW5zZXJ0VGFpbCggJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0LCAmcENvbW1hbmQtPkxpbmssIGVBTklfQk9PTEVBTl9GQUxTRSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY3NyTExJbnNlcnRIZWFkKCAmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QsICZwQ29tbWFuZC0+TGluaywgZUFOSV9CT09MRUFOX0ZBTFNFICk7CisgICAgICAgIH0KKyAgICAgICAgLy9MZXQgY2FsbGVyIGtub3cgdGhlIGNvbW1hbmQgaXMgcXVldWUKKyAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9Ob3QgdG8gZGVjcmVhc2UgcE1hYy0+cm9hbS5zUGVuZGluZ0NvbW1hbmRzIGhlcmUuIENhbGxlciB3aWxsIGRlY3JlYXNlIGl0IHdoZW4gaXQgCisgICAgICAgIC8vcmVsZWFzZSB0aGUgY29tbWFuZC4KKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCggIiAgY2Fubm90IHF1ZXVlIGNvbW1hbmQgJWRcbiIgKSwgcENvbW1hbmQtPmNvbW1hbmQgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKCBzdGF0dXMgKTsKKworfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorZUhhbFN0YXR1cyBjc3JSb2FtVXBkYXRlQVBXUFNJRSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0U2lyQVBXUFNJRXMqIHBBUFdQU0lFUyApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTaXJVcGRhdGVBUFdQU0lFc1JlcSAqcE1zZzsKKyAgICB0QU5JX1U4ICpwQnVmID0gTlVMTCwgKndUbXBCdWYgPSBOVUxMOworICAgIAorICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIGlmIChOVUxMID09IHBTZXNzaW9uKQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCggIiAgU2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3Igc2Vzc2lvbiBpZCAlZCIgKSwgc2Vzc2lvbklkKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisKKyAgICBkbworICAgIHsKKyAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTXNnLCBzaXplb2YodFNpclVwZGF0ZUFQV1BTSUVzUmVxKSApOworICAgICAgICBpZiAoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSBicmVhazsKKyAgICAgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgcE1zZywgc2l6ZW9mKHRTaXJVcGRhdGVBUFdQU0lFc1JlcSkgKTsKKyAgICAgICAgcE1zZy0+bWVzc2FnZVR5cGUgPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KWVXTklfU01FX1VQREFURV9BUFdQU0lFX1JFUSk7CisKKyAgICAgICAgcEJ1ZiA9ICh0QU5JX1U4ICopJnBNc2ctPnRyYW5zYWN0aW9uSWQ7CisgICAgICAgIHdUbXBCdWYgPSBwQnVmOworCisgICAgICAgIC8vIHRyYW5zYWN0aW9uSWQKKyAgICAgICAgKnBCdWYgPSAwOworICAgICAgICAqKCBwQnVmICsgMSApID0gMDsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFOSV9VMTYpOworCisgICAgICAgIC8vIGJzc0lkCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0U2lyTWFjQWRkciAqKXBCdWYsICZwU2Vzc2lvbi0+c2VsZk1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodFNpck1hY0FkZHIpOworCisgICAgICAgIC8vc2Vzc2lvbklkCisgICAgICAgICpwQnVmKysgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisKKyAgICAgICAgLy8gQVBXUFNJRXMKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRTaXJBUFdQU0lFcyAqKXBCdWYsIHBBUFdQU0lFUywgc2l6ZW9mKHRTaXJBUFdQU0lFcykpOworICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyQVBXUFNJRXMpOworCisgICAgICAgIHBNc2ctPmxlbmd0aCA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpKHNpemVvZih0QU5JX1UzMikgKyAocEJ1ZiAtIHdUbXBCdWYpKSk7IC8vbXNnX2hlYWRlciArIG1zZworCisgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyk7CisKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICByZXR1cm4gKCBzdGF0dXMgKTsKK30KKworZUhhbFN0YXR1cyBjc3JSb2FtVXBkYXRlV1BBUlNOSUVzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRTaXJSU05pZSAqIHBBUFNpclJTTmllKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0U2lyVXBkYXRlQVBXUEFSU05JRXNSZXEgKnBNc2c7CisgICAgdEFOSV9VOCAqcEJ1ZiA9IE5VTEwsICp3VG1wQnVmID0gTlVMTDsKKworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIGlmIChOVUxMID09IHBTZXNzaW9uKQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCggIiAgU2Vzc2lvbiBkb2VzIG5vdCBleGlzdCBmb3Igc2Vzc2lvbiBpZCAlZCIgKSwgc2Vzc2lvbklkKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgc2l6ZW9mKHRTaXJVcGRhdGVBUFdQQVJTTklFc1JlcSkgKTsKKyAgICAgICAgaWYgKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgYnJlYWs7CisgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBNc2csIHNpemVvZiggdFNpclVwZGF0ZUFQV1BBUlNOSUVzUmVxICkgKTsKKyAgICAgICAgcE1zZy0+bWVzc2FnZVR5cGUgPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KWVXTklfU01FX1NFVF9BUFdQQVJTTklFc19SRVEpOworCisgICAgICAgIHBCdWYgPSAodEFOSV9VOCAqKSZwTXNnLT50cmFuc2FjdGlvbklkOworICAgICAgICB3VG1wQnVmID0gcEJ1ZjsKKworICAgICAgICAvLyB0cmFuc2FjdGlvbklkCisgICAgICAgICpwQnVmID0gMDsKKyAgICAgICAgKiggcEJ1ZiArIDEgKSA9IDA7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBTklfVTE2KTsKKyAKKyAgICAgICAgLy8gYnNzSWQKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRTaXJNYWNBZGRyICopcEJ1ZiwgJnBTZXNzaW9uLT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyTWFjQWRkcik7CisKKyAgICAgICAgLy8gc2Vzc2lvbklkCisgICAgICAgICpwQnVmKysgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgCisgICAgICAgIC8vIEFQV1BBUlNOSUVzCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0U2lyUlNOaWUgKilwQnVmLCBwQVBTaXJSU05pZSwgc2l6ZW9mKHRTaXJSU05pZSkpOworICAgICAgICBwQnVmICs9IHNpemVvZih0U2lyUlNOaWUpOworCisgICAgICAgIHBNc2ctPmxlbmd0aCA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpKHNpemVvZih0QU5JX1UzMiApICsgKHBCdWYgLSB3VG1wQnVmKSkpOyAvL21zZ19oZWFkZXIgKyBtc2cKKworICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyk7CisKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICByZXR1cm4gKCBzdGF0dXMgKTsKK30KKworI2VuZGlmIC8vI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvL2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlRlRQcmVhdXRoUmVxKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyQnNzaWQgcHJlQXV0aEJzc2lkLCB0QU5JX1U4IGNoYW5uZWxJZCkKK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlRlRQcmVhdXRoUmVxKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgc2Vzc2lvbklkLCB0cFNpckJzc0Rlc2NyaXB0aW9uIHBCc3NEZXNjcmlwdGlvbikKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICB0cFNpckZUUHJlQXV0aFJlcSBwZnRQcmVBdXRoUmVxOworICAgIHRBTklfVTE2IGF1dGhfcmVxX2xlbiA9IDA7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBhdXRoX3JlcV9sZW4gPSBzaXplb2YodFNpckZUUHJlQXV0aFJlcSk7CisgICAgcGZ0UHJlQXV0aFJlcSA9ICh0cFNpckZUUHJlQXV0aFJlcSl2b3NfbWVtX21hbGxvYyhhdXRoX3JlcV9sZW4pOworICAgIGlmIChwZnRQcmVBdXRoUmVxID09IE5VTEwpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIk1lbW9yeSBhbGxvY2F0aW9uIGZvciBGVCBQcmVhdXRoIHJlcXVlc3QgZmFpbGVkIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfUkVTT1VSQ0VTOworICAgIH0KKworICAgIC8vIFNhdmUgdGhlIFNNRSBTZXNzaW9uIElEIGhlcmUuIFdlIG5lZWQgaXQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgcHJlYXV0aCByZXNwb25zZQorICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5zbWVTZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKyAgICB2b3NfbWVtX3plcm8ocGZ0UHJlQXV0aFJlcSwgYXV0aF9yZXFfbGVuKTsKKworICAgIHBmdFByZUF1dGhSZXEtPnBic3NEZXNjcmlwdGlvbiA9ICh0cFNpckJzc0Rlc2NyaXB0aW9uKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgc2l6ZW9mKHBCc3NEZXNjcmlwdGlvbi0+bGVuZ3RoKSArIHBCc3NEZXNjcmlwdGlvbi0+bGVuZ3RoKTsKKworICAgIHBmdFByZUF1dGhSZXEtPm1lc3NhZ2VUeXBlID0gcGFsX2NwdV90b19iZTE2KGVXTklfU01FX0ZUX1BSRV9BVVRIX1JFUSk7CisKKyAgICBwZnRQcmVBdXRoUmVxLT5wcmVBdXRoY2hhbm5lbE51bSA9IHBCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbElkOworCisKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopJnBmdFByZUF1dGhSZXEtPmN1cnJic3NJZCwgKHZvaWQgKilwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopJnBmdFByZUF1dGhSZXEtPnByZUF1dGhic3NJZCwgKHZvaWQgKilwQnNzRGVzY3JpcHRpb24tPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsgIAorCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGlmIChjc3JSb2FtSXMxMXJBc3NvYyhwTWFjKSkKKyAgICB7CisgICAgICAgIHBmdFByZUF1dGhSZXEtPmZ0X2llc19sZW5ndGggPSAodEFOSV9VMTYpcE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzX2xlbmd0aDsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwZnRQcmVBdXRoUmVxLT5mdF9pZXMsIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llc19sZW5ndGgpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIHBmdFByZUF1dGhSZXEtPmZ0X2llc19sZW5ndGggPSAwOyAKKyAgICB9CisKKyAgICB2b3NfbWVtX2NvcHkocGZ0UHJlQXV0aFJlcS0+cGJzc0Rlc2NyaXB0aW9uLCBwQnNzRGVzY3JpcHRpb24sIHBCc3NEZXNjcmlwdGlvbi0+bGVuZ3RoKTsKKworICAgIHBmdFByZUF1dGhSZXEtPmxlbmd0aCA9IHBhbF9jcHVfdG9fYmUxNihzaXplb2YodFNpckZUUHJlQXV0aFJlcSkgKyBzaXplb2YocEJzc0Rlc2NyaXB0aW9uLT5sZW5ndGgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzRGVzY3JpcHRpb24tPmxlbmd0aCk7IAorCisgICAgcmV0dXJuIHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcGZ0UHJlQXV0aFJlcSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgd2lsbCByZWNlaXZlIGFuZCBwcm9jZXNzIHRoZSBGVCBQcmUgQXV0aCBSc3AgZnJvbSB0aGUgY3VycmVudCAKKyAqIGFzc29jaWF0ZWQgYXAuIAorICogCisgKiBUaGlzIHdpbGwgaW52b2tlIHRoZSBoZGQgY2FsbCBiYWNrLiBUaGlzIGlzIHNvIHRoYXQgaGRkIGNhbiBub3cKKyAqIHNlbmQgdGhlIEZUSUVzIGZyb20gdGhlIEF1dGggUnNwIChBdXRoIFNlcSAyKSB0byB0aGUgc3VwcGxpY2FudC4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyUm9hbUZUUHJlQXV0aFJzcFByb2Nlc3NvciggdEhhbEhhbmRsZSBoSGFsLCB0cFNpckZUUHJlQXV0aFJzcCBwRlRQcmVBdXRoUnNwICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBlSGFsU3RhdHVzICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIlByZWF1dGggcmVzcG9uc2Ugc3RhdHVzIGNvZGUgJWQiKSwgcEZUUHJlQXV0aFJzcC0+c3RhdHVzKTsgCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HICAgIAorICAgIGNzck5laWdoYm9yUm9hbVByZWF1dGhSc3BIYW5kbGVyKHBNYWMsIChWT1NfU1RBVFVTKXBGVFByZUF1dGhSc3AtPnN0YXR1cyk7CisjZW5kaWYKKworICAgIC8qIFRoZSBiZWxvdyBmdW5jdGlvbiBjYWxscy90aW1lcnMgc2hvdWxkIGJlIGludm9rZWQgb25seSBpZiB0aGUgcHJlLWF1dGggaXMgc3VjY2Vzc2Z1bCAqLworICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gKFZPU19TVEFUVVMpcEZUUHJlQXV0aFJzcC0+c3RhdHVzKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBJbXBsaWVzIGEgc3VjY2VzcworICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5GVFN0YXRlID0gZUZUX0FVVEhfQ09NUExFVEU7CisKKyAgICAvLyBJbmRpY2F0ZSBTTUUgUW9TIG1vZHVsZSB0aGUgY29tcGxldGlvbiBvZiBQcmVhdXRoIHN1Y2Nlc3MuIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBSSUMgSUVzCisgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcCA9IHBGVFByZUF1dGhSc3A7CisgICAgc21lX1Fvc0NzckV2ZW50SW5kKHBNYWMsIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5zbWVTZXNzaW9uSWQsIFNNRV9RT1NfQ1NSX1BSRUFVVEhfU1VDQ0VTU19JTkQsIE5VTEwpOworCisgICAgLyogU3RhcnQgdGhlIHByZS1hdXRoIHJlYXNzb2MgaW50ZXJ2YWwgdGltZXIgd2l0aCBhIHBlcmlvZCBvZiA0MDBtcy4gV2hlbiB0aGlzIGV4cGlyZXMsIAorICAgICAqIGFjdHVhbCB0cmFuc2l0aW9uIGZyb20gdGhlIGN1cnJlbnQgdG8gaGFuZG9mZiBBUCBpcyB0cmlnZ2VyZWQgKi8KKyAgICBzdGF0dXMgPSBwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wcmVBdXRoUmVhc3NvY0ludHZsVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MCAqIFBBTF9USU1FUl9UT19NU19VTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlByZWF1dGggcmVhc3NvYyBpbnRlcnZhbCB0aW1lciBzdGFydCBmYWlsZWQgdG8gc3RhcnQgd2l0aCBzdGF0dXMgJWRcbiIpLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gU2F2ZSB0aGUgcmVjZWl2ZWQgcmVzcG9uc2UKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopJnBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wcmVBdXRoYnNzSWQsICh2b2lkICopcEZUUHJlQXV0aFJzcC0+cHJlQXV0aGJzc0lkLCBzaXplb2YodENzckJzc2lkKSk7CisgICAgaWYgKGNzclJvYW1JczExckFzc29jKHBNYWMpKQorICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgcEZUUHJlQXV0aFJzcC0+c21lU2Vzc2lvbklkLCBOVUxMLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9GVF9SRVNQT05TRSwgZUNTUl9ST0FNX1JFU1VMVF9OT05FKTsKKworICAgIC8vIEN1cnJlbnRseSB3ZSBkb250IGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIENDWCBjb25uZWN0aW9uLgorICAgIAorCisgICAgLy8gRG9uZSB3aXRoIGl0LCBpbml0IGl0LgorICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AgPSBOVUxMOworfQorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0JUQU1QX1VUX1JGCit2b2lkIGNzclJvYW1Kb2luUmV0cnlUaW1lckhhbmRsZXIodm9pZCAqcHYpCit7CisgICAgdENzclRpbWVySW5mbyAqcEluZm8gPSAodENzclRpbWVySW5mbyAqKXB2OworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBwSW5mby0+cE1hYzsKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQgPSBwSW5mby0+c2Vzc2lvbklkOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisgICAgCisgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkgKQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCggIiAgcmV0cnlpbmcgdGhlIGxhc3Qgcm9hbSBwcm9maWxlIG9uIHNlc3Npb24gJWRcbiIgKSwgc2Vzc2lvbklkICk7CisgICAgICAgIHBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAgICAgaWYocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSAmJiBjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JSb2FtSm9pbkxhc3RQcm9maWxlKHBNYWMsIHNlc3Npb25JZCkpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoICIgIGZhaWwgdG8gcmV0cnkgdGhlIGxhc3Qgcm9hbSBwcm9maWxlXG4iICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworZUhhbFN0YXR1cyBjc3JSb2FtU3RhcnRKb2luUmV0cnlUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRBTklfVTMyIGludGVydmFsKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAKKyAgICBpZihwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlICYmIHBTZXNzaW9uLT5tYXhSZXRyeUNvdW50KQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgY2FsbCBzZXNzaW9uSWQgJWQgcmV0cnkgY291bnQgJWQgbGVmdFxuICIpLCBzZXNzaW9uSWQsIHBTZXNzaW9uLT5tYXhSZXRyeUNvdW50KTsKKyAgICAgICAgcFNlc3Npb24tPm1heFJldHJ5Q291bnQtLTsKKyAgICAgICAgcFNlc3Npb24tPmpvaW5SZXRyeVRpbWVySW5mby5wTWFjID0gcE1hYzsKKyAgICAgICAgcFNlc3Npb24tPmpvaW5SZXRyeVRpbWVySW5mby5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIHN0YXR1cyA9IHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcFNlc3Npb24tPmhUaW1lckpvaW5SZXRyeSwgaW50ZXJ2YWwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBzdGFydCB0aW1lciBzdGF0dXMgJXMgXG4gIiksIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgbm90IHRvIHN0YXJ0IHRpbWVyIGR1ZSB0byBubyBwcm9maWxlIG9yIHJlYWNoIG1hYyByZXQgKCVkKVxuICIpLCAKKyAgICAgICAgICAgICAgIHBTZXNzaW9uLT5tYXhSZXRyeUNvdW50KTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCitlSGFsU3RhdHVzIGNzclJvYW1TdG9wSm9pblJldHJ5VGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiIGNzclJvYW1TdG9wSm9pblJldHJ5VGltZXIgXG4gIik7CisgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKHBNYWMsIHNlc3Npb25JZCkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmhUaW1lckpvaW5SZXRyeSkpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisKKy8qCisgIHBCdWYgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UKKyAgTElNIHBhY2tzIGRpc2Fzc29jIHJzcCBhcyBiZWxvdywKKyAgICAgIG1lc3NhZ2VUeXBlIC0gMiBieXRlcworICAgICAgbWVzc2FnZUxlbmd0aCAtIDIgYnl0ZXMKKyAgICAgIHNlc3Npb25JZCAtIDEgYnl0ZQorICAgICAgdHJhbnNhY3Rpb25JZCAtIDIgYnl0ZXMgKHRBTklfVTE2KQorICAgICAgcmVhc29uQ29kZSAtIDQgYnl0ZXMgKHNpemVvZih0U2lyUmVzdWx0Q29kZXMpKQorICAgICAgcGVlck1hY0FkZHIgLSA2IGJ5dGVzCisgICAgICBUaGUgcmVzdCBpcyBjb25kaXRpb25hbGx5IGRlZmluZWQgb2YgKFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVApIGFuZCBub3QgdXNlZAorKi8KK3N0YXRpYyB2b2lkIGNzclNlckRlc1VucGFja0RpYXNzb2NSc3AodEFOSV9VOCAqcEJ1ZiwgdFNpclNtZURpc2Fzc29jUnNwICpwUnNwKQoreworICAgaWYocEJ1ZiAmJiBwUnNwKQorICAgeworICAgICAgcEJ1ZiArPSA0OyAvL3NraXAgdHlwZSBhbmQgbGVuZ3RoCisgICAgICBwUnNwLT5zZXNzaW9uSWQgID0gKnBCdWYrKzsKKyAgICAgIHBhbF9nZXRfVTE2KCBwQnVmLCAodEFOSV9VMTYgKikmcFJzcC0+dHJhbnNhY3Rpb25JZCApOworICAgICAgcEJ1ZiArPSAyOworICAgICAgcGFsX2dldF9VMzIoIHBCdWYsICh0QU5JX1UzMiAqKSZwUnNwLT5zdGF0dXNDb2RlICk7CisgICAgICBwQnVmICs9IDQ7CisgICAgICB2b3NfbWVtX2NvcHkocFJzcC0+cGVlck1hY0FkZHIsIHBCdWYsIDYpOworICAgfQorfQorCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9zcmMvY3NyL2NzckFwaVNjYW4uYyBiL0NPUkUvU01FL3NyYy9jc3IvY3NyQXBpU2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNDFjYjQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9zcmMvY3NyL2NzckFwaVNjYW4uYwpAQCAtMCwwICsxLDY0NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAgCisKKyAgCisgICAgXGZpbGUgY3NyQXBpU2Nhbi5jCisgIAorICAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgQ29tbW9uIFNjYW4gaW50ZXJmYWNlcy4KKyAgCisgICAgQ29weXJpZ2h0IChDKSAyMDA2IEFpcmdvIE5ldHdvcmtzLCBJbmNvcnBvcmF0ZWQgCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisKKyNpbmNsdWRlICJwYWxBcGkuaCIKKyNpbmNsdWRlICJjc3JJbnNpZGVBcGkuaCIKKyNpbmNsdWRlICJzbWVJbnNpZGUuaCIKKyNpbmNsdWRlICJzbXNEZWJ1Zy5oIgorCisjaW5jbHVkZSAiY3NyU3VwcG9ydC5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3RsLmgiCisKKyNpbmNsdWRlICJ2b3NfZGlhZ19jb3JlX2xvZy5oIgorI2luY2x1ZGUgInZvc19kaWFnX2NvcmVfZXZlbnQuaCIKKworI2luY2x1ZGUgInZvc19udml0ZW0uaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGEuaCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBDU1JfVkFMSURBVEVfTElTVCAgLy9UaGlzIHBvcnRpb24gb2YgY29kZSBuZWVkIHRvIGJlIHJlbW92ZWQgb25jZSB0aGUgaXNzdWUgaXMgcmVzb2x2ZWQuCisKKyNpZmRlZiBDU1JfVkFMSURBVEVfTElTVAordERibExpbmtMaXN0ICpnX3BjaGFubmVsUG93ZXJJbmZvTGlzdDI0ID0gTlVMTCwgKiBnX3BjaGFubmVsUG93ZXJJbmZvTGlzdDUgPSBOVUxMOwordHBBbmlTaXJHbG9iYWwgZ19wTWFjID0gTlVMTDsKKyNlbmRpZgorCisvKiBQdXJwb3NlIG9mIEhJRERFTl9USU1FUiAKKyoqIFdoZW4gd2UgcmVtb3ZlIGhpZGRlbiBzc2lkIGZyb20gdGhlIHByb2ZpbGUgaS5lLiwgZm9yZ2V0IHRoZSBTU0lEIHZpYSBHVUkgdGhhdCBTU0lEIHNob3VsZG4ndCBzZWUgaW4gdGhlIHByb2ZpbGUKKyoqIEZvciBhYm92ZSByZXF1aXJlbWVudCB3ZSB1c2VkIHRpbWVyIGxpbWl0LCBsb2dpYyBpcyBleHBsYWluZWQgYmVsb3cKKyoqIFRpbWVyIHZhbHVlIGlzIGluaXRpYWxzZWQgdG8gY3VycmVudCB0aW1lICB3aGVuIGl0IHJlY2VpdmVzIGNvcnJlc3BvbmRpbmcgcHJvYmUgcmVzcG9uc2Ugb2YgaGlkZGVuIFNTSUQgKFRoZSBwcm9iZSByZXF1ZXN0IGlzCisqKiByZWNlaXZlZCByZWd1bGFybHkgdGlsbCBTU0lEIGluIHRoZSBwcm9maWxlLiBPbmNlIGl0IGlzIHJlbW92ZWQgZnJvbSBwcm9maWxlIHByb2JlIHJlcXVlc3QgaXMgbm90IHNlbnQuKSB3aGVuIHdlIHJlY2VpdmUgcHJvYmUgcmVzcG9uc2UKKyoqIGZvciBicm9hZGNhc3QgcHJvYmUgcmVxdWVzdCwgZHVyaW5nIHVwZGF0ZSBTU0lEIHdpdGggc2F2ZWQgU1NJRCB3ZSB3aWxsIGRpZmYgY3VycmVudCB0aW1lIHdpdGggc2F2ZWQgU1NJRCB0aW1lIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxIG1pbgorKiogdGhlbiB3ZSBhcmUgbm90IHVwZGF0aW5nIHdpdGggb2xkIG9uZQorKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBISURERU5fVElNRVIgKDEqNjAqMTAwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgQ1NSX1NDQU5fUkVTVUxUX1JTU0lfV0VJR0hUICAgICA4MCAvLyBtdXN0IGJlIGxlc3MgdGhhbiAxMDAsIHJlcHJlc2VudCB0aGUgcGVyc2VudGFnZSBvZiBuZXcgUlNTSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBQRVIgZmlsdGVyIGNvbnN0YW50IGZyYWN0aW9uOiBpdCBpcyBhICUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKKyNkZWZpbmUgQ1NSX1NDQU5fUEVSX0ZJTFRFUl9GUkFDIDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBSU1NJIGZpbHRlciBjb25zdGFudCBmcmFjdGlvbjogaXQgaXMgYSAlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCisjZGVmaW5lIENTUl9TQ0FOX1JTU0lfRklMVEVSX0ZSQUMgMTAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb252ZXJ0IFJTU0kgaW50byBvdmVyYWxsIHNjb3JlOiBTaW5jZSBSU1NJIGlzIGluIC1kQm0gdmFsdWVzLCBhbmQgdGhlIAorb3ZlcmFsbCBuZWVkcyB0byBiZSB3ZWlnaHRlZCBpbnZlcnNlbHkgKHdoZXJlIGdyZWF0ZXIgdmFsdWUgbWVhbnMgYmV0dGVyCitzeXN0ZW0pLCB3ZSBjb252ZXJ0LgorUlNTSSAqY2Fubm90KiBiZSBtb3JlIHRoYW4gMHhGRiBvciBsZXNzIHRoYW4gMCBmb3IgbWVhbmluZ2Z1bCBXTEFOIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ1NSX1NDQU5fTUFYX1NDT1JFX1ZBTCAweEZGCisjZGVmaW5lIENTUl9TQ0FOX01JTl9TQ09SRV9WQUwgMHgwCisjZGVmaW5lIENTUl9TQ0FOX0hBTkRPRkZfREVMVEEgMTAKKyNkZWZpbmUgQ1NSX1NDQU5fT1ZFUkFMTF9TQ09SRSggcnNzaSApIFwKKyAgKCByc3NpIDwgQ1NSX1NDQU5fTUFYX1NDT1JFX1ZBTCApXAorICAgPyAoQ1NSX1NDQU5fTUFYX1NDT1JFX1ZBTC1yc3NpKSA6IENTUl9TQ0FOX01JTl9TQ09SRV9WQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjZGVmaW5lIENTUl9TQ0FOX0lTX09WRVJfQlNTX0xJTUlUKHBNYWMpICBcCisgICAoIChwTWFjKS0+c2Nhbi5uQnNzTGltaXQgPD0gKGNzckxMQ291bnQoJihwTWFjKS0+c2Nhbi5zY2FuUmVzdWx0TGlzdCkpICkKKworLy8qKiogVGhpcyBpcyB0ZW1wb3Jhcnkgd29yayBhcm91bmQuIEl0IG5lZWQgdG8gY2FsbCBDQ00gYXBpIHRvIGdldCB0byBDRkcgbGF0ZXIKKy8vLyBHZXQgc3RyaW5nIHBhcmFtZXRlciB2YWx1ZQorZXh0ZXJuIHRTaXJSZXRTdGF0dXMgd2xhbl9jZmdHZXRTdHIodHBBbmlTaXJHbG9iYWwsIHRBTklfVTE2LCB0QU5JX1U4KiwgdEFOSV9VMzIqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAordm9pZCBjc3JTY2FuR2V0UmVzdWx0VGltZXJIYW5kbGVyKHZvaWQgKik7Cit2b2lkIGNzclNjYW5SZXN1bHRBZ2luZ1RpbWVySGFuZGxlcih2b2lkICpwdik7Cit2b2lkIGNzclNjYW5JZGxlU2NhblRpbWVySGFuZGxlcih2b2lkICopOworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCitzdGF0aWMgdm9pZCBjc3JTdGFBcENvbmNUaW1lckhhbmRsZXIodm9pZCAqKTsKKyNlbmRpZgorZUhhbFN0YXR1cyBjc3JTY2FuQ2hhbm5lbHMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICk7Cit2b2lkIGNzclNldENmZ1ZhbGlkQ2hhbm5lbExpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBDaGFubmVsTGlzdCwgdEFOSV9VOCBOdW1DaGFubmVscyApOwordm9pZCBjc3JTYXZlVHhQb3dlclRvQ2ZnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0QU5JX1UzMiBjZmdJZCApOwordm9pZCBjc3JTZXRDZmdDb3VudHJ5Q29kZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqY291bnRyeUNvZGUgKTsKK3ZvaWQgY3NyUHVyZ2VDaGFubmVsUG93ZXIoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREYmxMaW5rTGlzdCAqcENoYW5uZWxMaXN0ICk7CisvL2lmIGJnUGVyaW9kIGlzIDAsIGJhY2tncm91bmQgc2NhbiBpcyBkaXNhYmxlZC4gSXQgaXMgaW4gbWlsbGlzZWNvbmQgdW5pdHMKK2VIYWxTdGF0dXMgY3NyU2V0Q2ZnQmFja2dyb3VuZFNjYW5QZXJpb2QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYmdQZXJpb2QpOworZUhhbFN0YXR1cyBjc3JQcm9jZXNzU2V0QkdTY2FuUGFyYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOwordm9pZCBjc3JSZWxlYXNlU2NhbkNvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIGVDc3JTY2FuU3RhdHVzIHNjYW5TdGF0dXMpOworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JTY2FuVmFsaWRhdGVTY2FuUmVzdWx0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQ2hhbm5lbHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IG51bUNobiwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKipwcEllcyApOworZUhhbFN0YXR1cyBjc3JTZXRCR1NjYW5DaGFubmVsTGlzdCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcEFkanVzdENoYW5uZWxzLCB0QU5JX1U4IE51bUFkanVzdENoYW5uZWxzKTsKK3ZvaWQgY3NyUmVsZWFzZUNtZFNpbmdsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCk7Cit0QU5JX0JPT0xFQU4gY3NyUm9hbUlzVmFsaWRDaGFubmVsKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGNoYW5uZWwgKTsKKworLy9wUmVzdWx0IGlzIGludmFsaWQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgordm9pZCBjc3JGcmVlU2NhblJlc3VsdEVudHJ5KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlc3VsdCAqcFJlc3VsdCApCit7CisgICAgaWYoIE5VTEwgIT0gcFJlc3VsdC0+UmVzdWx0LnB2SWVzICkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBSZXN1bHQtPlJlc3VsdC5wdkllcyApOworICAgIH0KKyAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBSZXN1bHQpOworfQorCisKK3N0YXRpYyBlSGFsU3RhdHVzIGNzckxMU2NhblB1cmdlUmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREYmxMaW5rTGlzdCAqcExpc3QpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRDc3JTY2FuUmVzdWx0ICpwQnNzRGVzYzsKKyAgICAKKyAgICBjc3JMTExvY2socExpc3QpOworICAgIAorICAgIHdoaWxlKChwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQocExpc3QsIExMX0FDQ0VTU19OT0xPQ0spKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcEJzc0Rlc2MgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rICk7CisgICAgICAgIGNzckZyZWVTY2FuUmVzdWx0RW50cnkoIHBNYWMsIHBCc3NEZXNjICk7CisgICAgfQorICAgIAorICAgIGNzckxMVW5sb2NrKHBMaXN0KTsgICAKKyAgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2ludCBjc3JDaGVja1ZhbGlkYXRlTGlzdHModm9pZCAqIGRlc3QsIGNvbnN0IHZvaWQgKnNyYywgdl9TSVpFX3QgbnVtLCBpbnQgaWR4KQoreworI2lmZGVmIENTUl9WQUxJREFURV9MSVNUCisKKyAgICBpbnQgaWkgPSAxOworCisgICAgaWYoIChOVUxMID09IGdfcE1hYykgfHwgKCFnX3BNYWMtPnNjYW4uZlZhbGlkYXRlTGlzdCApICkKKyAgICB7CisgICAgICAgIHJldHVybiBpaTsKKyAgICB9CisgICAgaWYoZ19wY2hhbm5lbFBvd2VySW5mb0xpc3QyNCkKKyAgICB7CisgICAgICAgIC8vY2hlY2sgMi40IGxpc3QKKyAgICAgICAgdExpc3RFbGVtICpwRWxlbSwgKnBIZWFkOworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIAorICAgICAgICBjb3VudCA9IChpbnQpKGdfcGNoYW5uZWxQb3dlckluZm9MaXN0MjQtPkNvdW50KTsKKyAgICAgICAgcEhlYWQgPSAmZ19wY2hhbm5lbFBvd2VySW5mb0xpc3QyNC0+TGlzdEhlYWQ7CisgICAgICAgIHBFbGVtID0gcEhlYWQtPm5leHQ7CisgICAgICAgIGlmKCh0QU5JX1UzMikocEhlYWQtPm5leHQpID4gMHgwMDAxMDAwMCkgLy9Bc3N1bWluZyBrZXJuZWwgYWRkcmVzcyBpcyBub3QgdGhhdCBsb3cuCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vdGhpcyBsb29wIGNyYXNoZXMgaWYgdGhlIHBvaW50ZXIgaXMgbm90IHJpZ2h0CisgICAgICAgICAgICB3aGlsZShwRWxlbS0+bmV4dCAhPSBwSGVhZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigodEFOSV9VMzIpKHBFbGVtLT5uZXh0KSA+IDB4MDAwMTAwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRWxlbSA9IHBFbGVtLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKGNvdW50ID4gMCk7CisgICAgICAgICAgICAgICAgICAgIGNvdW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICVkIERldGVjdCAxIGxpc3QoMHglWCkgZXJyb3IgSGVhZCgweCVYKSBuZXh0KDB4JVgpIENvdW50ICVkLCBkZXN0KDB4JVgpIHNyYygweCVYKSBudW1CeXRlcyglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgKHVuc2lnbmVkIGludClnX3BjaGFubmVsUG93ZXJJbmZvTGlzdDI0LCAodW5zaWduZWQgaW50KXBIZWFkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKHBIZWFkLT5uZXh0KSwgKGludClnX3BjaGFubmVsUG93ZXJJbmZvTGlzdDI0LT5Db3VudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWRlc3QsICh1bnNpZ25lZCBpbnQpc3JjLCAoaW50KW51bSk7CisgICAgICAgICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgICAgIGlpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9CYWQgbGlzdAorICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIgJWQgRGV0ZWN0IGxpc3QoMHglWCkgZXJyb3IgSGVhZCgweCVYKSBuZXh0KDB4JVgpIENvdW50ICVkLCBkZXN0KDB4JVgpIHNyYygweCVYKSBudW1CeXRlcyglZCkiLCAKKyAgICAgICAgICAgICAgICBpZHgsICh1bnNpZ25lZCBpbnQpZ19wY2hhbm5lbFBvd2VySW5mb0xpc3QyNCwgKHVuc2lnbmVkIGludClwSGVhZCwgCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkocEhlYWQtPm5leHQpLCAoaW50KWdfcGNoYW5uZWxQb3dlckluZm9MaXN0MjQtPkNvdW50LCAKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWRlc3QsICh1bnNpZ25lZCBpbnQpc3JjLCAoaW50KW51bSk7CisgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgaWkgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vbGlzdCBvaworICAgICAgICBpaSA9IDE7CisgICAgfQorCisKKyAgICByZXR1cm4gaWk7CisKKyNlbHNlCisgICAgcmV0dXJuIDE7CisjZW5kaWYgLy8jaWZkZWYgQ1NSX1ZBTElEQVRFX0xJU1QKK30KKworCitlSGFsU3RhdHVzIGNzclNjYW5PcGVuKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICAKKyAgICBkbworICAgIHsKKyAgICAgICAgY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0KTsKKyAgICAgICAgY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5zY2FuLnRlbXBTY2FuUmVzdWx0cyk7CisgICAgICAgIGNzckxMT3BlbihwTWFjLT5oSGRkLCAmcE1hYy0+c2Nhbi5jaGFubmVsUG93ZXJJbmZvTGlzdDI0KTsKKyAgICAgICAgY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5zY2FuLmNoYW5uZWxQb3dlckluZm9MaXN0NUcpOworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisgICAgICAgIGNzckxMT3BlbihwTWFjLT5oSGRkLCAmcE1hYy0+c2Nhbi5zY2FuQ21kUGVuZGluZ0xpc3QpOworI2VuZGlmCisjaWZkZWYgQ1NSX1ZBTElEQVRFX0xJU1QKKyAgICAgICAgZ19wY2hhbm5lbFBvd2VySW5mb0xpc3Q1ID0gJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3Q1RzsKKyAgICAgICAgZ19wTWFjID0gcE1hYzsKKyAgICAgICAgZ19wY2hhbm5lbFBvd2VySW5mb0xpc3QyNCA9ICZwTWFjLT5zY2FuLmNoYW5uZWxQb3dlckluZm9MaXN0MjQ7CisjZW5kaWYKKyAgICAgICAgcE1hYy0+c2Nhbi5mRnVsbFNjYW5Jc3N1ZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIHBNYWMtPnNjYW4ubkJzc0xpbWl0ID0gQ1NSX01BWF9CU1NfU1VQUE9SVDsKKyAgICAgICAgc3RhdHVzID0gcGFsVGltZXJBbGxvYyhwTWFjLT5oSGRkLCAmcE1hYy0+c2Nhbi5oVGltZXJHZXRSZXN1bHQsIGNzclNjYW5HZXRSZXN1bHRUaW1lckhhbmRsZXIsIHBNYWMpOworICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2V0UmVzdWx0IHRpbWVyXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisgICAgICAgIHN0YXR1cyA9IHBhbFRpbWVyQWxsb2MocE1hYy0+aEhkZCwgJnBNYWMtPnNjYW4uaFRpbWVyU3RhQXBDb25jVGltZXIsIGNzclN0YUFwQ29uY1RpbWVySGFuZGxlciwgcE1hYyk7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBoVGltZXJTdGFBcENvbmNUaW1lciB0aW1lclxuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZiAgICAgICAgCisgICAgICAgIHN0YXR1cyA9IHBhbFRpbWVyQWxsb2MocE1hYy0+aEhkZCwgJnBNYWMtPnNjYW4uaFRpbWVySWRsZVNjYW4sIGNzclNjYW5JZGxlU2NhblRpbWVySGFuZGxlciwgcE1hYyk7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBpZGxlU2NhbiB0aW1lclxuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcGFsVGltZXJBbGxvYyhwTWFjLT5oSGRkLCAmcE1hYy0+c2Nhbi5oVGltZXJSZXN1bHRBZ2luZywgY3NyU2NhblJlc3VsdEFnaW5nVGltZXJIYW5kbGVyLCBwTWFjKTsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJlc3VsdEFnaW5nIHRpbWVyXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuQ2xvc2UoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworI2lmZGVmIENTUl9WQUxJREFURV9MSVNUCisgICAgZ19wY2hhbm5lbFBvd2VySW5mb0xpc3QyNCA9IE5VTEw7CisgICAgZ19wY2hhbm5lbFBvd2VySW5mb0xpc3Q1ID0gTlVMTDsKKyAgICBnX3BNYWMgPSBOVUxMOworI2VuZGlmCisgICAgY3NyTExTY2FuUHVyZ2VSZXN1bHQocE1hYywgJnBNYWMtPnNjYW4udGVtcFNjYW5SZXN1bHRzKTsKKyAgICBjc3JMTFNjYW5QdXJnZVJlc3VsdChwTWFjLCAmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisjaWZkZWYgV0xBTl9BUF9TVEFfQ09OQ1VSUkVOQ1kKKyAgICBjc3JMTFNjYW5QdXJnZVJlc3VsdChwTWFjLCAmcE1hYy0+c2Nhbi5zY2FuQ21kUGVuZGluZ0xpc3QpOworI2VuZGlmCisgICAgY3NyTExDbG9zZSgmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisgICAgY3NyTExDbG9zZSgmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMpOworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisgICAgY3NyTExDbG9zZSgmcE1hYy0+c2Nhbi5zY2FuQ21kUGVuZGluZ0xpc3QpOworI2VuZGlmCisgICAgY3NyUHVyZ2VDaGFubmVsUG93ZXIocE1hYywgJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3QyNCk7CisgICAgY3NyUHVyZ2VDaGFubmVsUG93ZXIocE1hYywgJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3Q1Ryk7CisgICAgY3NyTExDbG9zZSgmcE1hYy0+c2Nhbi5jaGFubmVsUG93ZXJJbmZvTGlzdDI0KTsKKyAgICBjc3JMTENsb3NlKCZwTWFjLT5zY2FuLmNoYW5uZWxQb3dlckluZm9MaXN0NUcpOworICAgIGNzclNjYW5EaXNhYmxlKHBNYWMpOworICAgIHBhbFRpbWVyRnJlZShwTWFjLT5oSGRkLCBwTWFjLT5zY2FuLmhUaW1lclJlc3VsdEFnaW5nKTsKKyAgICBwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5oVGltZXJHZXRSZXN1bHQpOworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisgICAgcGFsVGltZXJGcmVlKHBNYWMtPmhIZGQsIHBNYWMtPnNjYW4uaFRpbWVyU3RhQXBDb25jVGltZXIpOworI2VuZGlmCisgICAgcGFsVGltZXJGcmVlKHBNYWMtPmhIZGQsIHBNYWMtPnNjYW4uaFRpbWVySWRsZVNjYW4pOworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2NhbkVuYWJsZSggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgICAgCisgICAgcE1hYy0+c2Nhbi5mU2NhbkVuYWJsZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIHBNYWMtPnNjYW4uZlJlc3RhcnRJZGxlU2NhbiA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIAorICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2NhbkRpc2FibGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIAorICAgIGNzclNjYW5TdG9wVGltZXJzKHBNYWMpOworICAgIHBNYWMtPnNjYW4uZlNjYW5FbmFibGUgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisvL1JldHVybiBTVUNDRVNTIGlzIHRoZSBjb21tYW5kIGlzIHF1ZXVlZCwgZWxzZSByZXR1cm5zIGVIQUxfU1RBVFVTX0ZBSUxVUkUgCitlSGFsU3RhdHVzIGNzclF1ZXVlU2NhblJlcXVlc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBTY2FuQ21kICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICB0QU5JX0JPT0xFQU4gZk5vQ21kUGVuZGluZzsKKyAgICB0U21lQ21kICpwUXVldWVTY2FuQ21kPU5VTEw7CisgICAgdFNtZUNtZCAqcFNlbmRTY2FuQ21kPU5VTEw7CisKKyAgICBpZiAodm9zX2dldF9jb25jdXJyZW5jeV9tb2RlKCkgPT0gVk9TX1NUQV9TQVApIC8vVE9ETzotIEFsc28gbWFrZSBzdXJlIEFQIEJTUyBoYXMgc3RhcnRlZAorICAgIHsKKworICAgICAgICB0Q3NyU2NhblJlcXVlc3Qgc2NhblJlcTsKKyAgICAgICAgdEFOSV9VOCBudW1DaG4gPSBwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKyAgICAgICAgdENzckNoYW5uZWxJbmZvICpwQ2huSW5mbyA9ICZzY2FuUmVxLkNoYW5uZWxJbmZvOworICAgICAgICB0QU5JX1U4ICAgIGNoYW5uZWxUb1NjYW5bV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKKyAgICAgICAgdEFOSV9VOCAgICBpID0gMDsKKyAgICAgICAgdEFOSV9CT09MRUFOIGJNZW1BbGxvYyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKworICAgICAgICBpZiAobnVtQ2huID09IDApCisgICAgICAgIHsKKworICAgICAgICAgICAgbnVtQ2huID0gcE1hYy0+c2Nhbi5iYXNlQ2hhbm5lbHMubnVtQ2hhbm5lbHM7CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QsIG51bUNobiApOworICAgICAgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgRmFpbGVkIHRvIGdldCBtZW1vcnkgZm9yIGNoYW5uZWwgbGlzdCBcbiIpICk7CisgICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBiTWVtQWxsb2MgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4uYmFzZUNoYW5uZWxzLmNoYW5uZWxMaXN0LCBudW1DaG4gKTsKKyAgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ICk7CisgICAgICAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBGYWlsZWQgdG8gY29weSBtZW1vcnkgdG8gY2hhbm5lbCBsaXN0IFxuIikgKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gbnVtQ2huOworICAgICAgICAgfQorCisgICAgICAgICAvL1doZW5ldmVyIHdlIGdldCBhIHNjYW4gcmVxdWVzdCB3aXRoIG11bHRpcGxlIGNoYW5uZWxzIHdlIGJyZWFrIGl0IHVwIGludG8gMiByZXF1ZXN0cworICAgICAgICAgLy9GaXJzdCByZXF1ZXN0ICBmb3IgZmlyc3QgY2hhbm5lbCB0byBzY2FuIGFuZCBzZWNvbmQgcmVxdWVzdCB0byBzY2FuIHJlbWFpbmluZyBjaGFubmVscworICAgICAgICAgZm9yICAoaT0wOyBpIDwgMjsgaSsrKQorICAgICAgICAgeyAgIC8vZ28gdGhyb3VnaCBtYXggMiBpdGVyYXRpb25zLiAKKyAgICAgICAgICAgICAvL09uY2UgZm9yIHVzaW5nIHRoZSBleGlzdGluZyBjb21tYW5kIHdoZW4gbnVtYmVyIG9mIGNoYW5uZWxzIGlzIDEgCisgICAgICAgICAgICAgLy9TZWNvbmQgdG8gZ28gb3ZlciB0aGUgcmVtYWluaW5nIGNoYW5uZWxzIGFmdGVyIGNyZWF0aW5nIGEgbmV3IGNvbW1hbmQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKDEgPT0gbnVtQ2huKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTZW5kU2NhbkNtZCA9IHBTY2FuQ21kOworICAgICAgICAgICAgICAgIHBTZW5kU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgcFNlbmRTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5zY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgICAgICAgICAgICAgcFNlbmRTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5tYXhDaG5UaW1lID0gCisgICAgICAgICAgICAgICAgICAgIENTUl9NSU4ocFNlbmRTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5tYXhDaG5UaW1lLENTUl9BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9DT05DKTsKKyAgICAgICAgICAgICAgICBwU2VuZFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1pbkNoblRpbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgQ1NSX01JTihwU2VuZFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1pbkNoblRpbWUsIENTUl9BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DKTsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgICAgIHsgLy9DYWxsYmFjayBzaG91bGQgYmUgTlVMTCBmb3IgYWxsIGV4Y2VwdCBsYXN0IGNoYW5uZWwgU28gaGRkX2NhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgbGFzdCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAvL2khPTAgdGhlbiB3ZSBjYW1lIGhlcmUgaW4gc2Vjb25kIGl0ZXJhdGlvbiAKKyAgICAgICAgICAgICAgICAgICBwU2VuZFNjYW5DbWQtPnUuc2NhbkNtZC5jYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOyAvL2JyZWFrIG91dCBvZiB0aGlzIGxvb3AgaW4gY2FzZSB0aGVyZSBpcyBvbmx5IDEgY2hhbm5lbCB0aGVuIG5vIG5lZWQgZm9yIDJuZCBpdGVyYXRpb24KKyAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIHsgLy9pZiBudW1iZXIgb2YgY2hhbm5lbHMgPiAxIHRoZW4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnNjYW5SZXEsIHNpemVvZih0Q3NyU2NhblJlcXVlc3QpKTsKKworICAgICAgICAgICAgICAgIHBRdWV1ZVNjYW5DbWQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOyAvL29wdGltaXplIHRoaXMgdG8gdXNlIDIgY29tbWFuZCBidWZmZXIgb25seQorICAgICAgICAgICAgICAgIGlmICghcFF1ZXVlU2NhbkNtZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiTWVtQWxsb2MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCApOworICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIEZhaWxlZCB0byBnZXQgUXVldWUgY29tbWFuZCBidWZmZXJcbiIpICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwUXVldWVTY2FuQ21kLT5jb21tYW5kID0gcFNjYW5DbWQtPmNvbW1hbmQ7IAorICAgICAgICAgICAgICAgIHBRdWV1ZVNjYW5DbWQtPnNlc3Npb25JZCA9IHBTY2FuQ21kLT5zZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgcFF1ZXVlU2NhbkNtZC0+dS5zY2FuQ21kLmNhbGxiYWNrID0gcFNjYW5DbWQtPnUuc2NhbkNtZC5jYWxsYmFjazsKKyAgICAgICAgICAgICAgICBwUXVldWVTY2FuQ21kLT51LnNjYW5DbWQucENvbnRleHQgPSBwU2NhbkNtZC0+dS5zY2FuQ21kLnBDb250ZXh0OworICAgICAgICAgICAgICAgIHBRdWV1ZVNjYW5DbWQtPnUuc2NhbkNtZC5yZWFzb24gPSBwU2NhbkNtZC0+dS5zY2FuQ21kLnJlYXNvbjsKKyAgICAgICAgICAgICAgICBwUXVldWVTY2FuQ21kLT51LnNjYW5DbWQuc2NhbklEID0gcE1hYy0+c2Nhbi5uZXh0U2NhbklEKys7IC8vbGV0IGl0IHdyYXAgYXJvdW5kCisKKyAgICAgICAgICAgICAgICBwQ2huSW5mby0+bnVtT2ZDaGFubmVscyA9IHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzIC0gMTsKKworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sIAorICAgICAgICAgICAgICAgICAgIEZMKCIgJmNoYW5uZWxUb1NjYW4gJTB4IHBTY2FuQ21kKDB4JVgpIHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCgweCVYKW51bUNobiglZCkiKSwKKyAgICAgICAgICAgICAgICAgICAmY2hhbm5lbFRvU2NhblswXSwgKHVuc2lnbmVkIGludClwU2NhbkNtZCwgCisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QsIG51bUNobik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJmNoYW5uZWxUb1NjYW5bMF0sICZwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbMV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENobkluZm8tPm51bU9mQ2hhbm5lbHMgKiBzaXplb2YodEFOSV9VOCkpOworCisgICAgICAgICAgICAgICAgcENobkluZm8tPkNoYW5uZWxMaXN0ID0gJmNoYW5uZWxUb1NjYW5bMF07CisgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgc2NhblJlcS5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9BTlk7CisgICAgICAgICAgICAgICAgLy9Nb2RpZnkgY2FsbGVycyBwYXJhbWV0ZXJzIGluIGNhc2Ugb2YgY29uY3VycmVuY3kKKyAgICAgICAgICAgICAgICBzY2FuUmVxLnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKyAgICAgICAgICAgICAgICBzY2FuUmVxLm1heENoblRpbWUgPSBDU1JfQUNUSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQzsKKyAgICAgICAgICAgICAgICBzY2FuUmVxLm1pbkNoblRpbWUgPSBDU1JfQUNUSVZFX01JTl9DSEFOTkVMX1RJTUVfQ09OQzsKKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclNjYW5Db3B5UmVxdWVzdChwTWFjLCAmcFF1ZXVlU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QsICZzY2FuUmVxKTsKKyAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYk1lbUFsbG9jKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBGYWlsZWQgdG8gZ2V0IGNvcHkgY3NyU2NhblJlcXVlc3QgPSAlZFxuIiksIHN0YXR1cyApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9ICAgICAgIAorICAgICAgICAgICAgICAgIG51bUNobiA9IDE7IC8vbWFrZSBudW1DaG4gdG8gYmUgMSBmb3Igc2Vjb25kIGl0ZXJhdGlvbiB0byBjcmVhdGUgYSBzZW5kIGNvbW1hbmQKKyAgICAgICAgICAgIH0gIAorCisgICAgICAgICB9CisKKyAgICAgICAgIGZOb0NtZFBlbmRpbmcgPSBjc3JMTElzTGlzdEVtcHR5KCAmcE1hYy0+c2Nhbi5zY2FuQ21kUGVuZGluZ0xpc3QsIExMX0FDQ0VTU19MT0NLICk7CisKKyAgICAgICAgIC8vTG9naWMgQmVsb3cgaXMgYXMgZm9sbG93cworICAgICAgICAgLy8gSWYgdGhlIHNjYW5DbWRQZW5kaW5nTGlzdCBpcyBlbXB0eSB0aGVuIHdlIGRpcmVjdGx5IHNlbmQgdGhhdCBjb21tYW5kCisgICAgICAgICAvLyB0byBzbWVDb21tYW5kUXVldWUgZWxzZSB3ZSBidWZmZXIgaXQgaW4gb3VyIHNjYW5DbWRQZW5kaW5nTGlzdCBRdWV1ZQorICAgICAgICAgaWYoIGZOb0NtZFBlbmRpbmcgKQorICAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocFF1ZXVlU2NhbkNtZCAhPSBOVUxMKQorICAgICAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgICBjc3JMTEluc2VydFRhaWwoICZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCwgJnBRdWV1ZVNjYW5DbWQtPkxpbmssIExMX0FDQ0VTU19MT0NLICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwU2VuZFNjYW5DbWQgIT0gTlVMTCkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gY3NyUXVldWVTbWVDb21tYW5kKHBNYWMsIHBTZW5kU2NhbkNtZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBTZW5kU2NhbkNtZCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzckxMSW5zZXJ0VGFpbCggJnBNYWMtPnNjYW4uc2NhbkNtZFBlbmRpbmdMaXN0LCAmcFNlbmRTY2FuQ21kLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBRdWV1ZVNjYW5DbWQgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjc3JMTEluc2VydFRhaWwoICZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCwgJnBRdWV1ZVNjYW5DbWQtPkxpbmssIExMX0FDQ0VTU19MT0NLICk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgIHsgIC8vTm8gY29uY3VycmVuY3kgY2FzZQorICAgICAgICByZXR1cm4gY3NyUXVldWVTbWVDb21tYW5kKHBNYWMsIHBTY2FuQ21kLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIH0KKyAgICAKKworCisgICAgcmV0dXJuICggc3RhdHVzICk7CisKK30KKyNlbmRpZgorCitlSGFsU3RhdHVzIGNzclNjYW5SZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IHNlc3Npb25JZCwgCisgICAgICAgICAgICAgIHRDc3JTY2FuUmVxdWVzdCAqcFNjYW5SZXF1ZXN0LCB0QU5JX1UzMiAqcFNjYW5SZXF1ZXN0SUQsIAorICAgICAgICAgICAgICBjc3JTY2FuQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqcENvbnRleHQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRTbWVDbWQgKnBTY2FuQ21kID0gTlVMTDsKKyAgICAKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYocE1hYy0+c2Nhbi5mU2NhbkVuYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgcFNjYW5DbWQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOworICAgICAgICAgICAgaWYocFNjYW5DbWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcFNjYW5DbWQtPnUuc2NhbkNtZCwgc2l6ZW9mKHRTY2FuQ21kKSk7CisgICAgICAgICAgICAgICAgcFNjYW5DbWQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFNjYW47IAorICAgICAgICAgICAgICAgIHBTY2FuQ21kLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQucENvbnRleHQgPSBwQ29udGV4dDsKKyAgICAgICAgICAgICAgICBpZihlQ1NSX1NDQU5fUkVRVUVTVF8xMURfU0NBTiA9PSBwU2NhblJlcXVlc3QtPnJlcXVlc3RUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5yZWFzb24gPSBlQ3NyU2NhbjExZDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoKGVDU1JfU0NBTl9SRVFVRVNUX0ZVTExfU0NBTiA9PSBwU2NhblJlcXVlc3QtPnJlcXVlc3RUeXBlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGVDU1JfU0NBTl9QMlBfRElTQ09WRVJZID09IHBTY2FuUmVxdWVzdC0+cmVxdWVzdFR5cGUpCisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8KGVDU1JfU0NBTl9TT0ZUQVBfQ0hBTk5FTF9SQU5HRSA9PSBwU2NhblJlcXVlc3QtPnJlcXVlc3RUeXBlKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW5Vc2VyUmVxdWVzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihlQ1NSX1NDQU5fSE9fQkdfU0NBTiA9PSBwU2NhblJlcXVlc3QtPnJlcXVlc3RUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5yZWFzb24gPSBlQ3NyU2NhbkJnU2NhbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihlQ1NSX1NDQU5fSE9fUFJPQkVfU0NBTiA9PSBwU2NhblJlcXVlc3QtPnJlcXVlc3RUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5yZWFzb24gPSBlQ3NyU2NhblByb2JlQnNzOworICAgICAgICAgICAgICAgIH0KKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgICAgICAgICBlbHNlIGlmKGVDU1JfU0NBTl9QMlBfRklORF9QRUVSID09IHBTY2FuUmVxdWVzdC0+cmVxdWVzdFR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwU2NhbkNtZC0+dS5zY2FuQ21kLnJlYXNvbiA9IGVDc3JTY2FuUDJQRmluZFBlZXI7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW5JZGxlU2NhbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYocFNjYW5SZXF1ZXN0LT5taW5DaG5UaW1lID09IDAgJiYgcFNjYW5SZXF1ZXN0LT5tYXhDaG5UaW1lID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1RoZSBjYWxsZXIgZG9lc24ndCBzZXQgdGhlIHRpbWUgY29ycmVjdGx5LiBTZXQgaXQgaGVyZQorICAgICAgICAgICAgICAgICAgICBpZihwU2NhblJlcXVlc3QtPnNjYW5UeXBlID09IGVTSVJfQUNUSVZFX1NDQU4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVxdWVzdC0+bWF4Q2huVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1heENoblRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlcXVlc3QtPm1pbkNoblRpbWUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNaW5DaG5UaW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXF1ZXN0LT5tYXhDaG5UaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uUGFzc2l2ZU1heENoblRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlcXVlc3QtPm1pbkNoblRpbWUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5QYXNzaXZlTWluQ2huVGltZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL05lZWQgdG8gbWFrZSB0aGUgZm9sbG93aW5nIGF0b21pYworICAgICAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQuc2NhbklEID0gcE1hYy0+c2Nhbi5uZXh0U2NhbklEKys7IC8vbGV0IGl0IHdyYXAgYXJvdW5kCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYocFNjYW5SZXF1ZXN0SUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFNjYW5SZXF1ZXN0SUQgPSBwU2NhbkNtZC0+dS5zY2FuQ21kLnNjYW5JRDsgCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9UdXNoIDogSWYgaXQgaXMgdGhlIGZpcnN0IHNjYW4gcmVxdWVzdCBmcm9tIEhERCwgQ1NSIGNoZWNrcyBpZiBpdCBpcyBmb3IgMTFkLiAKKyAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBub3QsIENTUiB3aWxsIHNhdmUgdGhlIHNjYW4gcmVxdWVzdCBpbiB0aGUgcGVuZGluZyBjbWQgcXVldWUgCisgICAgICAgICAgICAgICAgLy8gJiBpc3N1ZSBhbiAxMWQgc2NhbiByZXF1ZXN0IHRvIFBFLgorICAgICAgICAgICAgICAgIGlmKCgoMCA9PSBwU2NhbkNtZC0+dS5zY2FuQ21kLnNjYW5JRCkKKyAgICAgICAgICAgICAgICAgICAmJiAoZUNTUl9TQ0FOX1JFUVVFU1RfMTFEX1NDQU4gIT0gcFNjYW5SZXF1ZXN0LT5yZXF1ZXN0VHlwZSkpCisjaWZkZWYgU09GVEFQX0NIQU5ORUxfUkFOR0UKKyAgICAgICAgICAgICAgICAgICAmJiAoZUNTUl9TQ0FOX1NPRlRBUF9DSEFOTkVMX1JBTkdFICE9IHBTY2FuUmVxdWVzdC0+cmVxdWVzdFR5cGUpCisjZW5kaWYgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgJiYgKGVBTklfQk9PTEVBTl9GQUxTRSA9PSBwTWFjLT5zY2FuLmZFbmFibGVCeXBhc3MxMWQpCisgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdFNtZUNtZCAqcDExZFNjYW5DbWQ7CisgICAgICAgICAgICAgICAgICAgIHRDc3JTY2FuUmVxdWVzdCBzY2FuUmVxOworICAgICAgICAgICAgICAgICAgICB0Q3NyQ2hhbm5lbEluZm8gKnBDaG5JbmZvID0gJnNjYW5SZXEuQ2hhbm5lbEluZm87CisKKyAgICAgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmc2NhblJlcSwgc2l6ZW9mKHRDc3JTY2FuUmVxdWVzdCkpOworCisgICAgICAgICAgICAgICAgICAgIHAxMWRTY2FuQ21kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlcihwTWFjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocDExZFNjYW5DbWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG51bUNobiA9IHBNYWMtPnNjYW4uYmFzZUNoYW5uZWxzLm51bUNoYW5uZWxzOworCisgICAgICAgICAgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwMTFkU2NhbkNtZC0+dS5zY2FuQ21kLCBzaXplb2YodFNjYW5DbWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcENobkluZm8tPkNoYW5uZWxMaXN0LCBudW1DaG4gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQ2huSW5mby0+Q2hhbm5lbExpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5iYXNlQ2hhbm5lbHMuY2hhbm5lbExpc3QsIG51bUNobiApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwQ2huSW5mby0+Q2hhbm5lbExpc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2huSW5mby0+Q2hhbm5lbExpc3QgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcENobkluZm8tPm51bU9mQ2hhbm5lbHMgPSAodEFOSV9VOCludW1DaG47CisgICAgICAgICAgICAgICAgICAgICAgICBwMTFkU2NhbkNtZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kU2NhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAxMWRTY2FuQ21kLT51LnNjYW5DbWQuY2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgcDExZFNjYW5DbWQtPnUuc2NhbkNtZC5wQ29udGV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwMTFkU2NhbkNtZC0+dS5zY2FuQ21kLnNjYW5JRCA9IHBNYWMtPnNjYW4ubmV4dFNjYW5JRCsrOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXEuQlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNzcklzMTFkU3VwcG9ydGVkKHBNYWMpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVxLnNjYW5UeXBlID0gZVNJUl9QQVNTSVZFX1NDQU47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlcS5yZXF1ZXN0VHlwZSA9IGVDU1JfU0NBTl9SRVFVRVNUXzExRF9TQ0FOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAxMWRTY2FuQ21kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW4xMWQxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXEubWF4Q2huVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNYXhDaG5UaW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXEubWluQ2huVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNaW5DaG5UaW1lOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXEuc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXEucmVxdWVzdFR5cGUgPSBlQ1NSX1NDQU5fSURMRV9NT0RFX1NDQU47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDExZFNjYW5DbWQtPnUuc2NhbkNtZC5yZWFzb24gPSBlQ3NyU2NhbklkbGVTY2FuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXEubWF4Q2huVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1heENoblRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlcS5taW5DaG5UaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWluQ2huVGltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclNjYW5Db3B5UmVxdWVzdChwTWFjLCAmcDExZFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LCAmc2NhblJlcSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0ZyZWUgdGhlIGNoYW5uZWwgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcENobkluZm8tPkNoYW5uZWxMaXN0ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RhcnQgcHJvY2VzcyB0aGUgY29tbWFuZAorI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUXVldWVTY2FuUmVxdWVzdChwTWFjLCBwMTFkU2NhbkNtZCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwMTFkU2NhbkNtZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2Vycm9yCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JTY2FuQ29weVJlcXVlc3QocE1hYywgJnBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdCwgcFNjYW5SZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vU3RhcnQgcHJvY2VzcyB0aGUgY29tbWFuZAorI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclF1ZXVlU2NhblJlcXVlc3QocE1hYyxwU2NhbkNtZCk7IAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUXVldWVTbWVDb21tYW5kKHBNYWMsIHBTY2FuQ21kLCBlQU5JX0JPT0xFQU5fRkFMU0UpOyAgICAgICAgICAgICAgICAgICAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBzZW5kIG1lc3NhZ2Ugc3RhdHVzID0gJWRcbiIpLCBzdGF0dXMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBjb3B5IHJlcXVlc3Qgc3RhdHVzID0gJWRcbiIpLCBzdGF0dXMgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2xvZyBlcnJvcgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSgwKTsKKyAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgJiYgcFNjYW5DbWQpCisgICAgeworICAgICAgICBpZiggZUNzclNjYW5JZGxlU2NhbiA9PSBwU2NhbkNtZC0+dS5zY2FuQ21kLnJlYXNvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2V0IHRoZSBmbGFnIGJhY2sgZm9yIHJlc3RhcnRpbmcgaWRsZSBzY2FuCisgICAgICAgICAgICBwTWFjLT5zY2FuLmZSZXN0YXJ0SWRsZVNjYW4gPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZFNjYW4ocE1hYywgcFNjYW5DbWQpOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzclNjYW5SZXF1ZXN0UmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTbWVDbWQgKnBTY2FuQ21kOworICAgIAorICAgIGlmKHBNYWMtPnNjYW4uZlNjYW5FbmFibGUpCisgICAgeworICAgICAgICBwU2NhbkNtZCA9IGNzckdldENvbW1hbmRCdWZmZXIocE1hYyk7CisgICAgICAgIGlmKHBTY2FuQ21kKQorICAgICAgICB7CisgICAgICAgICAgICBwU2NhbkNtZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kU2NhbjsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBTY2FuQ21kLT51LnNjYW5DbWQsIHNpemVvZih0U2NhbkNtZCkpOworICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5jYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICBwU2NhbkNtZC0+dS5zY2FuQ21kLnBDb250ZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW5HZXRSZXN1bHQ7CisgICAgICAgICAgICAvL05lZWQgdG8gbWFrZSB0aGUgZm9sbG93aW5nIGF0b21pYworICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5zY2FuSUQgPSBwTWFjLT5zY2FuLm5leHRTY2FuSUQrKzsgLy9sZXQgaXQgd3JhcCBhcm91bmQKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwU2NhbkNtZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzICk7CisgICAgICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRTY2FuKHBNYWMsIHBTY2FuQ21kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICAvL2xvZyBlcnJvcgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjYW4gbm90IG9idGFpbiBhIGNvbW1vbiBidWZmZXJcbiIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuQWxsQ2hhbm5lbHModHBBbmlTaXJHbG9iYWwgcE1hYywgZUNzclJlcXVlc3RUeXBlIHJlcVR5cGUpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRBTklfVTMyIHNjYW5JZDsKKyAgICB0Q3NyU2NhblJlcXVlc3Qgc2NhblJlcTsKKworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnNjYW5SZXEsIHNpemVvZih0Q3NyU2NhblJlcXVlc3QpKTsKKyAgICBzY2FuUmVxLkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0FOWTsKKyAgICBzY2FuUmVxLnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKyAgICBzY2FuUmVxLnJlcXVlc3RUeXBlID0gcmVxVHlwZTsKKyAgICBzY2FuUmVxLm1heENoblRpbWUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNYXhDaG5UaW1lOworICAgIHNjYW5SZXEubWluQ2huVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1pbkNoblRpbWU7CisgICAgLy9TY2FuIHdpdGggaW52YWxpZCBzZXNzaW9uSWQuIAorICAgIC8vVGhpcyByZXN1bHRzIGluIFNNRSB1c2luZyB0aGUgZmlyc3QgYXZhaWxhYmxlIHNlc3Npb24gdG8gc2Nhbi4KKyAgICBzdGF0dXMgPSBjc3JTY2FuUmVxdWVzdChwTWFjLCBDU1JfU0VTU0lPTl9JRF9JTlZBTElELCAmc2NhblJlcSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYW5JZCwgTlVMTCwgTlVMTCk7CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworCisKK2VIYWxTdGF0dXMgY3NySXNzdWVSb2FtQWZ0ZXJMb3N0bGlua1NjYW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCBlQ3NyUm9hbVJlYXNvbiByZWFzb24pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhCU1NMaXN0ID0gTlVMTDsKKyAgICB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXIgPSBOVUxMOworICAgIHRBTklfVTMyIHJvYW1JZCA9IDA7CisgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSA9IE5VTEw7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsICIgY3NySXNzdWVSb2FtQWZ0ZXJMb3N0bGlua1NjYW4gY2FsbGVkXG4iKTsKKyAgICAgICAgaWYocFNlc3Npb24tPmZDYW5jZWxSb2FtaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIiBsb3N0bGluayByb2FtaW5nIGlzIGNhbmNlbGxlZFxuIik7CisgICAgICAgICAgICBjc3JTY2FuU3RhcnRJZGxlU2NhbihwTWFjKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvL0hlcmUgaXMgdGhlIHByb2ZpbGUgd2UgbmVlZCB0byBjb25uZWN0IHRvCisgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKyAgICAgICAgaWYoTlVMTCA9PSBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKQorICAgICAgICB7CisgICAgICAgICAgICBwU2NhbkZpbHRlci0+RW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7CisgICAgICAgICAgICBwU2NhbkZpbHRlci0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9XZSBoYXZlIHRvIG1ha2UgYSBjb3B5IG9mIHBDdXJSb2FtUHJvZmlsZSBiZWNhdXNlIGl0IHdpbGwgYmUgZnJlZSBpbnNpZGUgY3NyUm9hbUlzc3VlQ29ubmVjdAorICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBQcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBQcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtQ29weVByb2ZpbGUocE1hYywgcFByb2ZpbGUsIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbVByZXBhcmVGaWx0ZXJGcm9tUHJvZmlsZShwTWFjLCBwUHJvZmlsZSwgcFNjYW5GaWx0ZXIpOworICAgICAgICB9Ly9XZSBoYXZlIGEgcHJvZmlsZQorICAgICAgICByb2FtSWQgPSBHRVRfTkVYVF9ST0FNX0lEKCZwTWFjLT5yb2FtKTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclNjYW5HZXRSZXN1bHQocE1hYywgcFNjYW5GaWx0ZXIsICZoQlNTTGlzdCk7CisgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihlQ3NyTG9zdExpbmsxID09IHJlYXNvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vd2Ugd2FudCB0byBwdXQgdGhlIGxhc3QgY29ubmVjdGVkIEJTUyB0byB0aGUgdmVyeSBiZWdpbm5pbmcsIGlmIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgICAgIGNzck1vdmVCc3NUb0hlYWRGcm9tQlNTSUQocE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLCBoQlNTTGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Jc3N1ZUNvbm5lY3QocE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgaEJTU0xpc3QsIHJlYXNvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2FtSWQsIGVBTklfQk9PTEVBTl9UUlVFLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NyU2NhblJlc3VsdFB1cmdlKHBNYWMsIGhCU1NMaXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Ly9IYXZlIHNjYW4gcmVzdWx0CisgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisgICAgaWYocFNjYW5GaWx0ZXIpCisgICAgeworICAgICAgICAvL3dlIG5lZWQgdG8gZnJlZSBtZW1vcnkgZm9yIGZpbHRlciBpZiBwcm9maWxlIGV4aXN0cworICAgICAgICBjc3JGcmVlU2NhbkZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5GaWx0ZXIpOworICAgIH0KKyAgICBpZihOVUxMICE9IHBQcm9maWxlKQorICAgIHsKKyAgICAgICAgY3NyUmVsZWFzZVByb2ZpbGUocE1hYywgcFByb2ZpbGUpOworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopcFByb2ZpbGUpOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzclNjYW5HZXRTY2FuQ2huSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0U21lQ21kICpwU2NhbkNtZDsKKyAgICAKKyAgICBpZihwTWFjLT5zY2FuLmZTY2FuRW5hYmxlKQorICAgIHsKKyAgICAgICAgcFNjYW5DbWQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOworICAgICAgICBpZihwU2NhbkNtZCkKKyAgICAgICAgeworICAgICAgICAgICAgcFNjYW5DbWQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFNjYW47CisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwU2NhbkNtZC0+dS5zY2FuQ21kLCBzaXplb2YodFNjYW5DbWQpKTsKKyAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQuY2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5wQ29udGV4dCA9IE5VTEw7CisgICAgICAgICAgICBwU2NhbkNtZC0+dS5zY2FuQ21kLnJlYXNvbiA9IGVDc3JTY2FuR2V0U2NhbkNobkluZm87CisgICAgICAgICAgICAvL05lZWQgdG8gbWFrZSB0aGUgZm9sbG93aW5nIGF0b21pYworICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5zY2FuSUQgPSBwTWFjLT5zY2FuLm5leHRTY2FuSUQrKzsgLy9sZXQgaXQgd3JhcCBhcm91bmQKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwU2NhbkNtZCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzICk7CisgICAgICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRTY2FuKHBNYWMsIHBTY2FuQ21kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICAvL2xvZyBlcnJvcgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJjYW4gbm90IG9idGFpbiBhIGNvbW1vbiBidWZmZXJcbiIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuSGFuZGxlRmFpbGVkTG9zdGxpbmsxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBzbXNMb2cocE1hYywgTE9HVywgIiAgTG9zdGxpbmsgc2NhbiAxIGZhaWxlZFxuIik7CisgICAgaWYocFNlc3Npb24tPmZDYW5jZWxSb2FtaW5nKQorICAgIHsKKyAgICAgICAgY3NyU2NhblN0YXJ0SWRsZVNjYW4ocE1hYyk7CisgICAgfQorICAgIGVsc2UgaWYocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkKKyAgICB7CisgICAgICAgIC8vV2UgZmFpbCBsb3N0bGluazEgYnV0IHRoZXJlIG1heSBiZSBvdGhlciBCU1MgaW4gdGhlIGNhY2hlZCByZXN1bHQgZml0IHRoZSBwcm9maWxlLiBHaXZlIGl0IGEgdHJ5IGZpcnN0CisgICAgICAgIGlmKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMgPT0gMCB8fAorICAgICAgICAgICAgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcyA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vdHJ5IGxvc3RsaW5rIHNjYW4yCisgICAgICAgICAgICBzdGF0dXMgPSBjc3JTY2FuUmVxdWVzdExvc3RMaW5rMihwTWFjLCBzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIXBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0IHx8IAorICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0WzBdID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vZ28gc3RyYWlnaHQgdG8gbG9zdGxpbmsgc2NhbjMKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclNjYW5SZXF1ZXN0TG9zdExpbmszKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL3dlIGFyZSBkb25lIHdpdGggbG9zdGxpbmsKKyAgICAgICAgICAgIGlmKGNzclJvYW1Db21wbGV0ZVJvYW1pbmcocE1hYywgc2Vzc2lvbklkLCBlQU5JX0JPT0xFQU5fRkFMU0UsIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3NyU2NhblN0YXJ0SWRsZVNjYW4ocE1hYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGNzclNjYW5SZXF1ZXN0TG9zdExpbmszKHBNYWMsIHNlc3Npb25JZCk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOyAgICAKK30KKworCisKK2VIYWxTdGF0dXMgY3NyU2NhbkhhbmRsZUZhaWxlZExvc3RsaW5rMih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgc21zTG9nKHBNYWMsIExPR1csICIgIExvc3RsaW5rIHNjYW4gMiBmYWlsZWRcbiIpOworICAgIGlmKHBTZXNzaW9uLT5mQ2FuY2VsUm9hbWluZykKKyAgICB7CisgICAgICAgIGNzclNjYW5TdGFydElkbGVTY2FuKHBNYWMpOworICAgIH0KKyAgICBlbHNlIGlmKCFwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlIHx8ICFwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCB8fCAKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXSA9PSAwKQorICAgIHsKKyAgICAgICAgLy90cnkgbG9zdGxpbmsgc2NhbjMKKyAgICAgICAgc3RhdHVzID0gY3NyU2NhblJlcXVlc3RMb3N0TGluazMocE1hYywgc2Vzc2lvbklkKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy93ZSBhcmUgZG9uZSB3aXRoIGxvc3RsaW5rCisgICAgICAgIGlmKGNzclJvYW1Db21wbGV0ZVJvYW1pbmcocE1hYywgc2Vzc2lvbklkLCBlQU5JX0JPT0xFQU5fRkFMU0UsIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzclNjYW5TdGFydElkbGVTY2FuKHBNYWMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOyAgICAKK30KKworCisKK2VIYWxTdGF0dXMgY3NyU2NhbkhhbmRsZUZhaWxlZExvc3RsaW5rMyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICAgc21zTG9nKHBNYWMsIExPR1csICIgIExvc3RsaW5rIHNjYW4gMyBmYWlsZWRcbiIpOworICAgIGlmKGVBTklfQk9PTEVBTl9UUlVFID09IGNzclJvYW1Db21wbGV0ZVJvYW1pbmcocE1hYywgc2Vzc2lvbklkLCBlQU5JX0JPT0xFQU5fRkFMU0UsIGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRSkpCisgICAgeworICAgICAgICAvL3dlIGFyZSBkb25lIHdpdGggbG9zdGxpbmsKKyAgICAgICAgY3NyU2NhblN0YXJ0SWRsZVNjYW4ocE1hYyk7CisgICAgfQorICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsgICAgCit9CisKKworCisKKy8vTG9zdGxpbmsxIHNjYW4gaXMgdG8gYWN0aXZlbHkgc2NhbiB0aGUgbGFzdCBjb25uZWN0ZWQgcHJvZmlsZSdzIFNTSUQgb24gYWxsIG1hdGNoZWQgQlNTIGNoYW5uZWxzLgorLy9JZiBubyByb2FtIHByb2ZpbGUgKGl0IHNob3VsZCBub3QpLCBpdCBpcyBsaWtlIGxvc3RsaW5rc2NhbjMKK2VIYWxTdGF0dXMgY3NyU2NhblJlcXVlc3RMb3N0TGluazEoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKyAgICB0QU5JX1U4IGJBZGRyWzZdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwU2NhbkZpbHRlciA9IE5VTEw7CisgICAgdFNjYW5SZXN1bHRIYW5kbGUgaEJTU0xpc3QgPSBOVUxMOworICAgIHRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQgPSBOVUxMOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgY2FsbGVkXG4iKSk7CisgICAgZG8KKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlcihwTWFjKTsKKyAgICAgICAgaWYoIXBDb21tYW5kKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwQ29tbWFuZC0+dS5zY2FuQ21kLCBzaXplb2YodFNjYW5DbWQpKTsKKyAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFNjYW47CisgICAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW5Mb3N0TGluazE7CisgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQuY2FsbGJhY2sgPSBOVUxMOworICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnBDb250ZXh0ID0gTlVMTDsKKyAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1heENoblRpbWUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNYXhDaG5UaW1lOworICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QubWluQ2huVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1pbkNoblRpbWU7CisgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5zY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgICAgIGlmKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLlNTSUQubGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0LCBzaXplb2YodENzclNTSURJbmZvKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuU1NJRHMubnVtT2ZTU0lEcyA9IDE7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuU1NJRHMuU1NJRExpc3RbMF0uU1NJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5TU0lELCBzaXplb2YodFNpck1hY1NTaWQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5TU0lEcy5udW1PZlNTSURzID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZihwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNjYW5GaWx0ZXIsIHNpemVvZih0Q3NyU2NhblJlc3VsdEZpbHRlcikpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJlcGFyZUZpbHRlckZyb21Qcm9maWxlKHBNYWMsIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUsIHBTY2FuRmlsdGVyKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vRG9uJ3QgY2hhbmdlIHZhcmlhYmxlIHN0YXR1cyBoZXJlIGJlY2F1c2Ugd2hldGhlciB3ZSBjYW4gZ2V0IHJlc3VsdCBvciBub3QsIHRoZSBjb21tYW5kIGdvZXMgdG8gUEUuCisgICAgICAgICAgICAvL1RoZSBzdGF0dXMgaXMgYWxzbyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgcXVldWVkLiBOb3Qgc3VjY2VzcyBtZWFuaW5nIG5vdCBxdWV1ZQorICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKChjc3JTY2FuR2V0UmVzdWx0KHBNYWMsIHBTY2FuRmlsdGVyLCAmaEJTU0xpc3QpKSkgJiYgaEJTU0xpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdEFOSV9VOCBpLCBuQ2huID0gMDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTik7CisgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCgocFNjYW5SZXN1bHQgPSBjc3JTY2FuUmVzdWx0R2V0TmV4dChwTWFjLCBoQlNTTGlzdCkpICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgICAgIG5DaG4gPCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBuQ2huOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpXSA9PSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5jaGFubmVsSWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBuQ2huKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbbkNobisrXSA9IHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL0luY2x1ZGUgdGhlIGxhc3QgY29ubmVjdGVkIEJTUycgY2hhbm5lbAorICAgICAgICAgICAgICAgIGlmKGNzclJvYW1Jc0NoYW5uZWxWYWxpZChwTWFjLCBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IG5DaG47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYocENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W2ldID09IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBuQ2huKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbbkNobisrXSA9IHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSBuQ2huOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGNzclJvYW1Jc0NoYW5uZWxWYWxpZChwTWFjLCBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgICAgICAvL2p1c3QgdHJ5IHRoZSBsYXN0IGNvbm5lY3RlZCBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbMF0gPSBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsOworICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5ic3NpZCwgYkFkZHIsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyAgICAgICAgc3RhdHVzID0gY3NyUXVldWVTbWVDb21tYW5kKHBNYWMsIHBDb21tYW5kLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBzZW5kIG1lc3NhZ2Ugc3RhdHVzID0gJWRcbiIpLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSggMCApOworCisgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICIgY3NyU2NhblJlcXVlc3RMb3N0TGluazEgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLCBzdGF0dXMpOworICAgICAgICBpZihwQ29tbWFuZCkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRTY2FuKHBNYWMsIHBDb21tYW5kKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBjc3JTY2FuSGFuZGxlRmFpbGVkTG9zdGxpbmsxKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICB9CisgICAgaWYocFNjYW5GaWx0ZXIpCisgICAgeworICAgICAgICBjc3JGcmVlU2NhbkZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5GaWx0ZXIpOworICAgIH0KKyAgICBpZihoQlNTTGlzdCkKKyAgICB7CisgICAgICAgIGNzclNjYW5SZXN1bHRQdXJnZShwTWFjLCBoQlNTTGlzdCk7CisgICAgfQorCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworCisvL0xvc3RsaW5rMiBzY2FuIGlzIHRvIGFjdGl2ZWx5IHNjYW4gdGhlIGFsbCBTU0lEcyBvZiB0aGUgbGFzdCByb2FtaW5nIHByb2ZpbGUncyBvbiBhbGwgbWF0Y2hlZCBCU1MgY2hhbm5lbHMuCisvL1NpbmNlIE1BQyBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgU1NJRCwgd2Ugc2NhbiBhbGwgU1NJRHMgYW5kIGZpbHRlciB0aGVtIGFmdGVyd2FyZHMKK2VIYWxTdGF0dXMgY3NyU2NhblJlcXVlc3RMb3N0TGluazIoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRBTklfVTggYkFkZHJbNl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyID0gTlVMTDsKKyAgICB0U2NhblJlc3VsdEhhbmRsZSBoQlNTTGlzdCA9IE5VTEw7CisgICAgdENzclNjYW5SZXN1bHRJbmZvICpwU2NhblJlc3VsdCA9IE5VTEw7CisgICAgdFNtZUNtZCAqcENvbW1hbmQgPSBOVUxMOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgY2FsbGVkXG4iKSk7CisgICAgZG8KKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlcihwTWFjKTsKKyAgICAgICAgaWYoIXBDb21tYW5kKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwQ29tbWFuZC0+dS5zY2FuQ21kLCBzaXplb2YodFNjYW5DbWQpKTsKKyAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFNjYW47CisgICAgICAgIHBDb21tYW5kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7CisgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW5Mb3N0TGluazI7CisgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQuY2FsbGJhY2sgPSBOVUxMOworICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnBDb250ZXh0ID0gTlVMTDsKKyAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1heENoblRpbWUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNYXhDaG5UaW1lOworICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QubWluQ2huVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubkFjdGl2ZU1pbkNoblRpbWU7CisgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5zY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgICAgIGlmKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1QcmVwYXJlRmlsdGVyRnJvbVByb2ZpbGUocE1hYywgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSwgcFNjYW5GaWx0ZXIpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gY3NyU2NhbkdldFJlc3VsdChwTWFjLCBwU2NhbkZpbHRlciwgJmhCU1NMaXN0KTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGhCU1NMaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRBTklfVTggaSwgbkNobiA9IDA7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSgoKHBTY2FuUmVzdWx0ID0gY3NyU2NhblJlc3VsdEdldE5leHQocE1hYywgaEJTU0xpc3QpKSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgICAgICBuQ2huIDwgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbkNobjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaV0gPT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKGkgPT0gbkNobikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W25DaG4rK10gPSBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5jaGFubmVsSWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSBuQ2huOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5ic3NpZCwgYkFkZHIsIHNpemVvZih0Q3NyQnNzaWQpKTsKKyAgICAgICAgLy9QdXQgdG8gdGhlIGhlYWQgaW4gcGVuZGluZyBxdWV1ZQorICAgICAgICBzdGF0dXMgPSBjc3JRdWV1ZVNtZUNvbW1hbmQocE1hYywgcENvbW1hbmQsIGVBTklfQk9PTEVBTl9UUlVFKTsKKyAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gc2VuZCBtZXNzYWdlIHN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUoIDAgKTsKKworICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiIGNzclNjYW5SZXF1ZXN0TG9zdExpbmsyIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgaWYocENvbW1hbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzclJlbGVhc2VDb21tYW5kU2NhbihwTWFjLCBwQ29tbWFuZCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gY3NyU2NhbkhhbmRsZUZhaWxlZExvc3RsaW5rMiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgfQorICAgIGlmKHBTY2FuRmlsdGVyKQorICAgIHsKKyAgICAgICAgY3NyRnJlZVNjYW5GaWx0ZXIocE1hYywgcFNjYW5GaWx0ZXIpOworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTY2FuRmlsdGVyKTsKKyAgICB9CisgICAgaWYoaEJTU0xpc3QpCisgICAgeworICAgICAgICBjc3JTY2FuUmVzdWx0UHVyZ2UocE1hYywgaEJTU0xpc3QpOworICAgIH0KKworICAgIHJldHVybiggc3RhdHVzICk7Cit9CisKKworLy9UbyBhY3RpdmVseSBzY2FuIGFsbCB2YWxpZCBjaGFubmVscworZUhhbFN0YXR1cyBjc3JTY2FuUmVxdWVzdExvc3RMaW5rMyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNtZUNtZCAqcENvbW1hbmQ7CisgICAgdEFOSV9VOCBiQWRkcls2XSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiIGNhbGxlZFxuIikpOworICAgIGRvCisgICAgeworICAgICAgICBwQ29tbWFuZCA9IGNzckdldENvbW1hbmRCdWZmZXIocE1hYyk7CisgICAgICAgIGlmKCFwQ29tbWFuZCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfUkVTT1VSQ0VTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmcENvbW1hbmQtPnUuc2NhbkNtZCwgc2l6ZW9mKHRTY2FuQ21kKSk7CisgICAgICAgIHBDb21tYW5kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRTY2FuOworICAgICAgICBwQ29tbWFuZC0+c2Vzc2lvbklkID0gKHRBTklfVTgpc2Vzc2lvbklkOworICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiA9IGVDc3JTY2FuTG9zdExpbmszOworICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLmNhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC5wQ29udGV4dCA9IE5VTEw7CisgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5tYXhDaG5UaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWF4Q2huVGltZTsKKyAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1pbkNoblRpbWUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5BY3RpdmVNaW5DaG5UaW1lOworICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3Quc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuYnNzaWQsIGJBZGRyLCBzaXplb2YodENzckJzc2lkKSk7CisgICAgICAgIC8vUHV0IHRvIHRoZSBoZWFkIG9mIHBlbmRpbmcgcXVldWUKKyAgICAgICAgc3RhdHVzID0gY3NyUXVldWVTbWVDb21tYW5kKHBNYWMsIHBDb21tYW5kLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IHdoaWxlKCAwICk7CisgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICIgY3NyU2NhblJlcXVlc3RMb3N0TGluazMgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLCBzdGF0dXMpOworICAgICAgICBpZihjc3JSb2FtQ29tcGxldGVSb2FtaW5nKHBNYWMsIHNlc3Npb25JZCwgZUFOSV9CT09MRUFOX0ZBTFNFLCBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JTY2FuU3RhcnRJZGxlU2NhbihwTWFjKTsKKyAgICAgICAgfQorICAgICAgICBpZihwQ29tbWFuZCkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRTY2FuKHBNYWMsIHBDb21tYW5kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiggc3RhdHVzICk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuSGFuZGxlU2VhcmNoRm9yU1NJRCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdFNjYW5SZXN1bHRIYW5kbGUgaEJTU0xpc3QgPSBDU1JfSU5WQUxJRF9TQ0FOUkVTVUxUX0hBTkRMRTsKKyAgICB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXIgPSBOVUxMOworICAgIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUgPSBwQ29tbWFuZC0+dS5zY2FuQ21kLnBUb1JvYW1Qcm9maWxlOworICAgIHRBTklfVTMyIHNlc3Npb25JZCA9IHBDb21tYW5kLT5zZXNzaW9uSWQ7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0JUQU1QX1VUX1JGCisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisjZW5kaWYKKyAgICBkbworICAgIHsKKyAgICAgICAgLy9JZiB0aGVyZSBpcyByb2FtIGNvbW1hbmQgd2FpdGluZywgaWdub3JlIHRoaXMgcm9hbSBiZWNhdXNlIHRoZSBuZXdlciByb2FtIGNvbW1hbmQgaXMgdGhlIG9uZSB0byBleGVjdXRlCisgICAgICAgIGlmKGNzcklzUm9hbUNvbW1hbmRXYWl0aW5nRm9yU2Vzc2lvbihwTWFjLCBzZXNzaW9uSWQpKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBhYm9ydHMgYmVjYXVzZSByb2FtIGNvbW1hbmQgd2FpdGluZ1xuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYocFByb2ZpbGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNjYW5GaWx0ZXIsIHNpemVvZih0Q3NyU2NhblJlc3VsdEZpbHRlcikpOworICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisgICAgICAgIHN0YXR1cyA9IGNzclJvYW1QcmVwYXJlRmlsdGVyRnJvbVByb2ZpbGUocE1hYywgcFByb2ZpbGUsIHBTY2FuRmlsdGVyKTsKKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0YXR1cyA9IGNzclNjYW5HZXRSZXN1bHQocE1hYywgcFNjYW5GaWx0ZXIsICZoQlNTTGlzdCk7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVDb25uZWN0KHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIGhCU1NMaXN0LCBlQ3NySGRkSXNzdWVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucm9hbUlkLCBlQU5JX0JPT0xFQU5fVFJVRSwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfXdoaWxlKDApOworICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIGlmKENTUl9JTlZBTElEX1NDQU5SRVNVTFRfSEFORExFICE9IGhCU1NMaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBjc3JTY2FuUmVzdWx0UHVyZ2UocE1hYywgaEJTU0xpc3QpOworICAgICAgICB9CisgICAgICAgIC8vV2UgaGF2ZW4ndCBkb25lIGFueXRoaW5nIHRvIHRoaXMgcHJvZmlsZQorICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgcENvbW1hbmQtPnUuc2NhbkNtZC5yb2FtSWQsCisgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fQVNTT0NJQVRJT05fRkFJTFVSRSwgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFKTsKKyAgICAgICAgLy9JbiBjYXNlIHdlIGhhdmUgbm90aGluZyBlbHNlIHRvIGRvLCByZXN0YXJ0IGlkbGUgc2NhbgorICAgICAgICBpZihjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpICYmICFjc3JJc1JvYW1Db21tYW5kV2FpdGluZyhwTWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gY3NyU2NhblN0YXJ0SWRsZVNjYW4ocE1hYyk7CisgICAgICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQlRBTVBfVVRfUkYKKyAgICAgICAgLy9JbiBjYXNlIG9mIFdEUyBzdGF0aW9uLCBsZXQgaXQgcmV0cnkuCisgICAgICAgIGlmKCBDU1JfSVNfV0RTX1NUQShwUHJvZmlsZSkgKQorICAgICAgICB7CisgICAgICAgICAgICAvL1NhdmUgdGhlIHJvbWEgcHJvZmlsZSBzbyB3ZSBjYW4gcmV0cnkKKyAgICAgICAgICAgIGNzckZyZWVSb2FtUHJvZmlsZSggcE1hYywgc2Vzc2lvbklkICk7CisgICAgICAgICAgICBpZiAoSEFMX1NUQVRVU19TVUNDRVNTKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Q3NyUm9hbVByb2ZpbGUpKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSk7CisgICAgICAgICAgICAgICAgY3NyUm9hbUNvcHlQcm9maWxlKHBNYWMsIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUsIHBQcm9maWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNzclJvYW1TdGFydEpvaW5SZXRyeVRpbWVyKHBNYWMsIHNlc3Npb25JZCwgQ1NSX0pPSU5fUkVUUllfVElNRU9VVF9QRVJJT0QpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgaWYocFNjYW5GaWx0ZXIpCisgICAgeworICAgICAgICBjc3JGcmVlU2NhbkZpbHRlcihwTWFjLCBwU2NhbkZpbHRlcik7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5GaWx0ZXIpOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzclNjYW5IYW5kbGVTZWFyY2hGb3JTU0lERmFpbHVyZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsKKyAgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlID0gcENvbW1hbmQtPnUuc2NhbkNtZC5wVG9Sb2FtUHJvZmlsZTsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKworI2lmIGRlZmluZWQoV0xBTl9ERUJVRykKKyAgICBpZihwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuU1NJRHMubnVtT2ZTU0lEcyA9PSAxKQorICAgIHsKKyAgICAgICAgY2hhciBzdHJbMzZdOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHN0ciwgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0WzBdLlNTSUQuc3NJZCwKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5TU0lEcy5TU0lETGlzdFswXS5TU0lELmxlbmd0aCk7CisgICAgICAgIHN0cltwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuU1NJRHMuU1NJRExpc3RbMF0uU1NJRC5sZW5ndGhdID0gMDsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgU1NJRCA9ICVzXG4iKSwgc3RyKTsKKyAgICB9CisjZW5kaWYKKyAgICAvL0NoZWNrIHdoZXRoZXIgaXQgaXMgZm9yIHN0YXJ0IGlic3MuIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaWYgaXQgaXMgYSBKT0lOIHJlcXVlc3QKKyAgICBpZihwUHJvZmlsZSAmJiBDU1JfSVNfU1RBUlRfSUJTUyhwUHJvZmlsZSkpCisgICAgeworICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVDb25uZWN0KHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIE5VTEwsIGVDc3JIZGRJc3N1ZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucm9hbUlkLCBlQU5JX0JPT0xFQU5fVFJVRSwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiZmFpbGVkIHRvIGlzc3VlIHN0YXJ0SUJTUyBjb21tYW5kIHdpdGggc3RhdHVzID0gMHglMDhYXG4iKSwgc3RhdHVzKTsKKyAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBOVUxMLCBwQ29tbWFuZC0+dS5zY2FuQ21kLnJvYW1JZCwgZUNTUl9ST0FNX0ZBSUxFRCwgZUNTUl9ST0FNX1JFU1VMVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCA9IGVDU1JfUk9BTV9SRVNVTFRfRkFJTFVSRTsKKworICAgICAgICBpZihjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpICYmCisgICAgICAgICAgIWNzcklzUm9hbUNvbW1hbmRXYWl0aW5nRm9yU2Vzc2lvbihwTWFjLCBzZXNzaW9uSWQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JTY2FuU3RhcnRJZGxlU2NhbihwTWFjKTsKKyAgICAgICAgfQorICAgICAgICBpZigoTlVMTCA9PSBwUHJvZmlsZSkgfHwgIWNzcklzQnNzVHlwZUlCU1MocFByb2ZpbGUtPkJTU1R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICAvL09ubHkgaW5kaWNhdGUgYXNzb2NfY29tcGxldGlvbiBpZiB3ZSBpbmRpY2F0ZSBhc3NvY19zdGFydC4KKyAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5iUmVmQXNzb2NTdGFydENudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdENzclJvYW1JbmZvICpwUm9hbUluZm8gPSBOVUxMLCByb2FtSW5mbzsKKyAgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZyb2FtSW5mbywgc2l6ZW9mKHRDc3JSb2FtSW5mbykpOworICAgICAgICAgICAgICAgIHBSb2FtSW5mbyA9ICZyb2FtSW5mbzsKKyAgICAgICAgICAgICAgICBpZihwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0Q3NyU2NhblJlc3VsdCAqcFNjYW5SZXN1bHQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0JBU0VfQUREUihwQ29tbWFuZC0+dS5yb2FtQ21kLnBSb2FtQnNzRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKyAgICAgICAgICAgICAgICAgICAgcm9hbUluZm8ucEJzc0Rlc2MgPSAmcFNjYW5SZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb2FtSW5mby5zdGF0dXNDb2RlID0gcFNlc3Npb24tPmpvaW5GYWlsU3RhdHVzQ29kZS5zdGF0dXNDb2RlOworICAgICAgICAgICAgICAgIHJvYW1JbmZvLnJlYXNvbkNvZGUgPSBwU2Vzc2lvbi0+am9pbkZhaWxTdGF0dXNDb2RlLnJlYXNvbkNvZGU7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmJSZWZBc3NvY1N0YXJ0Q250LS07CisgICAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBzZXNzaW9uSWQsIHBSb2FtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucm9hbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX0FTU09DSUFUSU9OX0NPTVBMRVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorICAgICAgICAgICAgLy9JbiBjYXNlIG9mIFdEUyBzdGF0aW9uLCBsZXQgaXQgcmV0cnkuCisgICAgICAgICAgICBpZiggQ1NSX0lTX1dEU19TVEEocFByb2ZpbGUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1NhdmUgdGhlIHJvbWEgcHJvZmlsZSBzbyB3ZSBjYW4gcmV0cnkKKyAgICAgICAgICAgICAgICBjc3JGcmVlUm9hbVByb2ZpbGUoIHBNYWMsIHNlc3Npb25JZCApOworICAgICAgICAgICAgICAgIGlmIChIQUxfU1RBVFVTX1NVQ0NFU1MocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodENzclJvYW1Qcm9maWxlKSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSk7CisgICAgICAgICAgICAgICAgICAgIGNzclJvYW1Db3B5UHJvZmlsZShwTWFjLCBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLCBwUHJvZmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNzclJvYW1TdGFydEpvaW5SZXRyeVRpbWVyKHBNYWMsIHNlc3Npb25JZCwgQ1NSX0pPSU5fUkVUUllfVElNRU9VVF9QRVJJT0QpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByb2FtUmVzdWx0ID0gZUNTUl9ST0FNX1JFU1VMVF9JQlNTX1NUQVJUX0ZBSUxFRDsKKyAgICAgICAgfQorICAgICAgICBjc3JSb2FtQ29tcGxldGlvbihwTWFjLCBzZXNzaW9uSWQsIE5VTEwsIHBDb21tYW5kLCByb2FtUmVzdWx0LCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisvL0FmdGVyIHNjYW4gZm9yIGNhcCBjaGFuZ2VzLCBpc3N1ZSBhIHJvYW1pbmcgY29tbWFuZCB0byBlaXRoZXIgcmVjb25uZWN0IHRvIHRoZSBBUCBvciBwaWNrIGFub3RoZXIgb25lIHRvIGNvbm5lY3QKK2VIYWxTdGF0dXMgY3NyU2NhbkhhbmRsZUNhcENoYW5nZVNjYW5Db21wbGV0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhCU1NMaXN0ID0gTlVMTDsKKyAgICB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXIgPSBOVUxMOworICAgIHRBTklfVTMyIHJvYW1JZCA9IDA7CisgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSA9IE5VTEw7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLy9IZXJlIGlzIHRoZSBwcm9maWxlIHdlIG5lZWQgdG8gY29ubmVjdCB0bworICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNjYW5GaWx0ZXIsIHNpemVvZih0Q3NyU2NhblJlc3VsdEZpbHRlcikpOworICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisgICAgICAgIGlmKE5VTEwgPT0gcFNlc3Npb24pIGJyZWFrOworICAgICAgICBpZihOVUxMID09IHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5FbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICAgICAgICAgIHBTY2FuRmlsdGVyLT5FbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL1dlIGhhdmUgdG8gbWFrZSBhIGNvcHkgb2YgcEN1clJvYW1Qcm9maWxlIGJlY2F1c2UgaXQgd2lsbCBiZSBmcmVlIGluc2lkZSBjc3JSb2FtSXNzdWVDb25uZWN0CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFByb2ZpbGUsIHNpemVvZih0Q3NyUm9hbVByb2ZpbGUpKTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Db3B5UHJvZmlsZShwTWFjLCBwUHJvZmlsZSwgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJlcGFyZUZpbHRlckZyb21Qcm9maWxlKHBNYWMsIHBQcm9maWxlLCBwU2NhbkZpbHRlcik7CisgICAgICAgIH0vL1dlIGhhdmUgYSBwcm9maWxlCisgICAgICAgIHJvYW1JZCA9IEdFVF9ORVhUX1JPQU1fSUQoJnBNYWMtPnJvYW0pOworICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gY3NyU2NhbkdldFJlc3VsdChwTWFjLCBwU2NhbkZpbHRlciwgJmhCU1NMaXN0KTsKKyAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vd2Ugd2FudCB0byBwdXQgdGhlIGxhc3QgY29ubmVjdGVkIEJTUyB0byB0aGUgdmVyeSBiZWdpbm5pbmcsIGlmIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgY3NyTW92ZUJzc1RvSGVhZEZyb21CU1NJRChwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWQsIGhCU1NMaXN0KTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVDb25uZWN0KHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIGhCU1NMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNzckNhcHNDaGFuZ2UsIDAsIGVBTklfQk9PTEVBTl9UUlVFLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NyU2NhblJlc3VsdFB1cmdlKHBNYWMsIGhCU1NMaXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Ly9IYXZlIHNjYW4gcmVzdWx0CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJjYW5ub3QgZmluZCBtYXRjaGluZyBCU1Mgb2YgJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlhcbiIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUuYnNzaWRbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZFs1XSk7CisgICAgICAgICAgICAgICAgLy9EaXNjb25uZWN0CisgICAgICAgICAgICAgICAgY3NyUm9hbURpc2Nvbm5lY3RJbnRlcm5hbChwTWFjLCBzZXNzaW9uSWQsIGVDU1JfRElTQ09OTkVDVF9SRUFTT05fVU5TUEVDSUZJRUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfXdoaWxlKDApOworICAgIGlmKHBTY2FuRmlsdGVyKQorICAgIHsKKyAgICAgICAgY3NyRnJlZVNjYW5GaWx0ZXIocE1hYywgcFNjYW5GaWx0ZXIpOworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTY2FuRmlsdGVyKTsKKyAgICB9CisgICAgaWYoTlVMTCAhPSBwUHJvZmlsZSkKKyAgICB7CisgICAgICAgIGNzclJlbGVhc2VQcm9maWxlKHBNYWMsIHBQcm9maWxlKTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwUHJvZmlsZSk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKworZUhhbFN0YXR1cyBjc3JTY2FuUmVzdWx0UHVyZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5MaXN0KQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgdFNjYW5SZXN1bHRMaXN0ICpwU2Nhbkxpc3QgPSAodFNjYW5SZXN1bHRMaXN0ICopaFNjYW5MaXN0OworICAgICAKKyAgICBpZihwU2Nhbkxpc3QpCisgICAgeworICAgICAgICBzdGF0dXMgPSBjc3JMTFNjYW5QdXJnZVJlc3VsdChwTWFjLCAmcFNjYW5MaXN0LT5MaXN0KTsKKyAgICAgICAgY3NyTExDbG9zZSgmcFNjYW5MaXN0LT5MaXN0KTsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwU2Nhbkxpc3QpOworICAgIH0KKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworc3RhdGljIHRBTklfVTMyIGNzckdldEJzc1ByZWZlclZhbHVlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGludCByc3NpKQoreworICAgIHRBTklfVTMyIHJldCA9IDA7CisgICAgaW50IGkgPSBDU1JfTlVNX1JTU0lfQ0FUIC0gMTsKKworICAgIHdoaWxlKGkgPj0gMCkKKyAgICB7CisgICAgICAgIGlmKHJzc2kgPj0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5SU1NJQ2F0W2ldKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkJzc1ByZWZlclZhbHVlW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaS0tOworICAgIH07CisKKyAgICByZXR1cm4gKHJldCk7Cit9CisKKworLy9SZXR1cm4gYSBDYXBWYWx1ZSBiYXNlIG9uIHRoZSBjYXBhYmlsaXRpZXMgb2YgYSBCU1MKK3N0YXRpYyB0QU5JX1UzMiBjc3JHZXRCc3NDYXBWYWx1ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworICAgIHRBTklfVTMyIHJldCA9IENTUl9CU1NfQ0FQX1ZBTFVFX05PTkU7CisKKyAgICBpZiggcEllcyApCisgICAgeworICAgICAgICAvL1dlIG9ubHkgY2FyZSBhYm91dCAxMU4gY2FwYWJpbGl0eQorICAgICAgICBpZihwSWVzLT5IVENhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ICs9IENTUl9CU1NfQ0FQX1ZBTFVFX0hUOworICAgICAgICB9CisgICAgICAgIGlmKENTUl9JU19RT1NfQlNTKHBJZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgKz0gQ1NSX0JTU19DQVBfVkFMVUVfV01NOworICAgICAgICAgICAgLy9HaXZlIGFkdmFudGFnZSB0byBVQVBTRAorICAgICAgICAgICAgaWYoQ1NSX0lTX1VBUFNEX0JTUyhwSWVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgKz0gQ1NSX0JTU19DQVBfVkFMVUVfVUFQU0Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHJldCk7Cit9CisKKworLy9UbyBjaGVjayB3aHRoZXIgcEJzczEgaXMgYmV0dGVyIHRoYW4gcEJzczIKK3N0YXRpYyB0QU5JX0JPT0xFQU4gY3NySXNCZXR0ZXJCc3ModENzclNjYW5SZXN1bHQgKnBCc3MxLCB0Q3NyU2NhblJlc3VsdCAqcEJzczIpCit7CisgICAgdEFOSV9CT09MRUFOIHJldDsKKworICAgIGlmKENTUl9JU19CRVRURVJfUFJFRkVSX1ZBTFVFKHBCc3MxLT5wcmVmZXJWYWx1ZSwgcEJzczItPnByZWZlclZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIH0KKyAgICBlbHNlIGlmKENTUl9JU19FUVVBTF9QUkVGRVJfVkFMVUUocEJzczEtPnByZWZlclZhbHVlLCBwQnNzMi0+cHJlZmVyVmFsdWUpKQorICAgIHsKKyAgICAgICAgaWYoQ1NSX0lTX0JFVFRFUl9DQVBfVkFMVUUocEJzczEtPmNhcFZhbHVlLCBwQnNzMi0+Y2FwVmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIChyZXQpOworfQorCisKKy8vUHV0IHRoZSBCU1MgaW50byB0aGUgc2NhbiByZXN1bHQgbGlzdAorLy9wSWVzIGNhbiBub3QgYmUgTlVMTAorc3RhdGljIHZvaWQgY3NyU2NhbkFkZFJlc3VsdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlc3VsdCAqcFJlc3VsdCwgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKyAgICBwUmVzdWx0LT5wcmVmZXJWYWx1ZSA9IGNzckdldEJzc1ByZWZlclZhbHVlKHBNYWMsIChpbnQpcFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IucnNzaSk7CisgICAgcFJlc3VsdC0+Y2FwVmFsdWUgPSBjc3JHZXRCc3NDYXBWYWx1ZShwTWFjLCAmcFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IsIHBJZXMpOworICAgIGNzckxMSW5zZXJ0VGFpbCggJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsICZwUmVzdWx0LT5MaW5rLCBMTF9BQ0NFU1NfTE9DSyApOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2NhbkdldFJlc3VsdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcEZpbHRlciwgdFNjYW5SZXN1bHRIYW5kbGUgKnBoUmVzdWx0KQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgIHRTY2FuUmVzdWx0TGlzdCAqcFJldExpc3Q7CisgICAgdENzclNjYW5SZXN1bHQgKnBSZXN1bHQsICpwQnNzRGVzYzsKKyAgICB0QU5JX1UzMiBjb3VudCA9IDA7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdEFOSV9VMzIgYnNzTGVuLCBhbGxvY0xlbjsKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgdWMgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FLCBtYyA9IGVDU1JfRU5DUllQVF9UWVBFX05PTkU7CisgICAgZUNzckF1dGhUeXBlIGF1dGggPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKyAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLCAqcE5ld0llczsKKyAgICB0QU5JX0JPT0xFQU4gZk1hdGNoOworICAgIAorICAgIGlmKHBoUmVzdWx0KQorICAgIHsKKyAgICAgICAgKnBoUmVzdWx0ID0gQ1NSX0lOVkFMSURfU0NBTlJFU1VMVF9IQU5ETEU7CisgICAgfQorICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwUmV0TGlzdCwgc2l6ZW9mKHRTY2FuUmVzdWx0TGlzdCkpOworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwUmV0TGlzdCwgc2l6ZW9mKHRTY2FuUmVzdWx0TGlzdCkpOworICAgICAgICBjc3JMTE9wZW4ocE1hYy0+aEhkZCwgJnBSZXRMaXN0LT5MaXN0KTsKKyAgICAgICAgcFJldExpc3QtPnBDdXJFbnRyeSA9IE5VTEw7CisgICAgICAgIAorICAgICAgICBjc3JMTExvY2soJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QpOworICAgICAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgTExfQUNDRVNTX05PTE9DSyApOworICAgICAgICB3aGlsZSggcEVudHJ5ICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NEZXNjID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0Q3NyU2NhblJlc3VsdCwgTGluayApOworICAgICAgICAgICAgcEllcyA9ICh0RG90MTFmQmVhY29uSUVzICopKCBwQnNzRGVzYy0+UmVzdWx0LnB2SWVzICk7CisgICAgICAgICAgICAvL2lmIHBCc3NEZXNjLT5SZXN1bHQucHZJZXMgaXMgTlVMTCwgd2UgbmVlZCB0byBmcmVlIGFueSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGNzck1hdGNoQlNTCisgICAgICAgICAgICAvL2ZvciBhbnkgZXJyb3IgY29uZGl0aW9uLCBvdGhlcndpYXNlLCBpdCB3aWxsIGJlIGZyZWVkIGxhdGVyLgorICAgICAgICAgICAgLy9yZXNldAorICAgICAgICAgICAgZk1hdGNoID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgcE5ld0llcyA9IE5VTEw7CisKKyAgICAgICAgICAgIGlmKHBGaWx0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZk1hdGNoID0gY3NyTWF0Y2hCU1MocE1hYywgJnBCc3NEZXNjLT5SZXN1bHQuQnNzRGVzY3JpcHRvciwgcEZpbHRlciwgJmF1dGgsICZ1YywgJm1jLCAmcEllcyk7CisgICAgICAgICAgICAgICAgaWYoIE5VTEwgIT0gcEllcyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL09ubHkgc2F2ZSBpdCB3aGVuIG1hdGNoaW5nCisgICAgICAgICAgICAgICAgICAgIGlmKGZNYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFwQnNzRGVzYy0+UmVzdWx0LnB2SWVzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Nzck1hdGNoQlNTIGFsbG9jYXRlcyB0aGUgbWVtb3J5LiBTaW1wbHkgcGFzcyBpdCBhbmQgaXQgaXMgZnJlZWQgbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV3SWVzID0gcEllczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoZSBwSWVzIGlzIGFsbG9jYXRlZCBieSBzb21lb25lIGVsc2UuIG1ha2UgYSBjb3B5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Pbmx5IHRvIHNhdmUgcGFyc2VkIElFcyBpZiBjYWxsZXIgcHJvdmlkZXMgYSBmaWx0ZXIuIE1vc3QgbGlrZWx5IHRoZSBjYWxsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIHVzaW5nIHRvIGZvciBhc3NvY2lhdGlvbiwgaGVuY2Ugc2F2ZSB0aGUgcGFyc2VkIElFcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTmV3SWVzLCBzaXplb2YodERvdDExZkJlYWNvbklFcykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBOZXdJZXMsIHBJZXMsIHNpemVvZiggdERvdDExZkJlYWNvbklFcyApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJRXNcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9OZWVkIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBjc3JNYXRjaEJTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXBCc3NEZXNjLT5SZXN1bHQucHZJZXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfS8vZk1hdGNoCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICFwQnNzRGVzYy0+UmVzdWx0LnB2SWVzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwSWVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKE5VTEwgPT0gcEZpbHRlciB8fCBmTWF0Y2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnNzTGVuID0gcEJzc0Rlc2MtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmxlbmd0aCArIHNpemVvZihwQnNzRGVzYy0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBhbGxvY0xlbiA9IHNpemVvZiggdENzclNjYW5SZXN1bHQgKSArIGJzc0xlbjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFJlc3VsdCwgYWxsb2NMZW4pOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBmYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc2NhbiByZXN1bHQsIGxlbj0lZFxuIiksIGFsbG9jTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocE5ld0llcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwTmV3SWVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwUmVzdWx0LCBhbGxvY0xlbik7CisgICAgICAgICAgICAgICAgcFJlc3VsdC0+Y2FwVmFsdWUgPSBwQnNzRGVzYy0+Y2FwVmFsdWU7CisgICAgICAgICAgICAgICAgcFJlc3VsdC0+cHJlZmVyVmFsdWUgPSBwQnNzRGVzYy0+cHJlZmVyVmFsdWU7CisgICAgICAgICAgICAgICAgcFJlc3VsdC0+dWNFbmNyeXB0aW9uVHlwZSA9IHVjOworICAgICAgICAgICAgICAgIHBSZXN1bHQtPm1jRW5jcnlwdGlvblR5cGUgPSBtYzsKKyAgICAgICAgICAgICAgICBwUmVzdWx0LT5hdXRoVHlwZSA9IGF1dGg7CisgICAgICAgICAgICAgICAgcFJlc3VsdC0+UmVzdWx0LnNzSWQgPSBwQnNzRGVzYy0+UmVzdWx0LnNzSWQ7CisgICAgICAgICAgICAgICAgcFJlc3VsdC0+UmVzdWx0LnRpbWVyID0gMDsKKyAgICAgICAgICAgICAgICAvL3NhdmUgdGhlIHBJZXMgZm9yIGxhdGVyIHVzZQorICAgICAgICAgICAgICAgIHBSZXN1bHQtPlJlc3VsdC5wdkllcyA9IHBOZXdJZXM7CisgICAgICAgICAgICAgICAgLy9zYXZlIGJzcyBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCAmcEJzc0Rlc2MtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCBic3NMZW4pOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBmYWlsIHRvIGNvcHkgbWVtb3J5IGZvciBzY2FuIHJlc3VsdFxuIikpOworICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZihwTmV3SWVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBOZXdJZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL05vIG5lZWQgdG8gbG9jayBwUmV0TGlzdCBiZWNhdXNlIGl0IGlzIGxvY2FsbHkgYWxsb2NhdGVkIGFuZCBubyBvdXRzaWRlIGNhbiBhY2Nlc3MgaXQgYXQgdGhpcyB0aW1lCisgICAgICAgICAgICAgICAgaWYoY3NyTExJc0xpc3RFbXB0eSgmcFJldExpc3QtPkxpc3QsIExMX0FDQ0VTU19OT0xPQ0spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NyTExJbnNlcnRUYWlsKCZwUmV0TGlzdC0+TGlzdCwgJnBSZXN1bHQtPkxpbmssIExMX0FDQ0VTU19OT0xPQ0spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1RvIHNvcnQgdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgdExpc3RFbGVtICpwVG1wRW50cnk7CisgICAgICAgICAgICAgICAgICAgIHRDc3JTY2FuUmVzdWx0ICpwVG1wUmVzdWx0OworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcFRtcEVudHJ5ID0gY3NyTExQZWVrSGVhZCgmcFJldExpc3QtPkxpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworICAgICAgICAgICAgICAgICAgICB3aGlsZShwVG1wRW50cnkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBSZXN1bHQgPSBHRVRfQkFTRV9BRERSKCBwVG1wRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjc3JJc0JldHRlckJzcyhwUmVzdWx0LCBwVG1wUmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JMTEluc2VydEVudHJ5KCZwUmV0TGlzdC0+TGlzdCwgcFRtcEVudHJ5LCAmcFJlc3VsdC0+TGluaywgTExfQUNDRVNTX05PTE9DSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UbyBpbmRpY2F0ZSB3ZSBhcmUgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXN1bHQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcFRtcEVudHJ5ID0gY3NyTExOZXh0KCZwUmV0TGlzdC0+TGlzdCwgcFRtcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihwUmVzdWx0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhpcyBvbmUgaXMgbm90IGJldHRlciB0aGFuIGFueSBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzckxMSW5zZXJ0VGFpbCgmcFJldExpc3QtPkxpc3QsICZwUmVzdWx0LT5MaW5rLCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCAmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLICk7CisgICAgICAgIH0vL3doaWxlCisgICAgICAgIGNzckxMVW5sb2NrKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0KTsKKyAgICAgICAgCisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgicmV0dXJuICVkIEJTU1xuIiksIGNzckxMQ291bnQoJnBSZXRMaXN0LT5MaXN0KSk7CisgICAgICAgIAorICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpIHx8IChwaFJlc3VsdCA9PSBOVUxMKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vRmFpbCBvciBObyBvbmUgd2FudHMgdGhlIHJlc3VsdC4KKyAgICAgICAgICAgIGNzclNjYW5SZXN1bHRQdXJnZShwTWFjLCAodFNjYW5SZXN1bHRIYW5kbGUpcFJldExpc3QpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoMCA9PSBjb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1dlIGFyZSBoZXJlIG1lYW5pbmcgdGhlIHRoZXJlIGlzIG5vIG1hdGNoCisgICAgICAgICAgICAgICAgY3NyTExDbG9zZSgmcFJldExpc3QtPkxpc3QpOworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFJldExpc3QpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0VfTlVMTF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYocGhSZXN1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBoUmVzdWx0ID0gcFJldExpc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Ly9BbGxvY2F0ZWQgcFJldExpc3QKKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuRmx1c2hSZXN1bHQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICByZXR1cm4gKCBjc3JMTFNjYW5QdXJnZVJlc3VsdChwTWFjLCAmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCkgKTsKK30KKworLyoqCisgKiBjc3JDaGVjazExZENoYW5uZWwKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBjc3JTY2FuRmlsdGVyMTFkUmVzdWx0IGZ1bmN0aW9uIGFuZAorICogY29tcGFyZSBjaGFubmVsIG51bWJlciB3aXRoIGdpdmVuIGNoYW5uZWwgbGlzdC4KKyAqCisgKkxPR0lDOgorICogQ2hlY2sgU2NhbiByZXN1bHQgY2hhbm5lbCBudW1iZXIgd2l0aCBDRkcgY2hhbm5lbCBsaXN0CisgKgorICpBU1NVTVBUSU9OUzoKKyAqCisgKgorICpOT1RFOgorICoKKyAqIEBwYXJhbSAgY2hhbm5lbElkICAgICAgY2hhbm5lbCBudW1iZXIKKyAqIEBwYXJhbSAgcENoYW5uZWxMaXN0ICAgUG9pbnRlciB0byBjaGFubmVsIGxpc3QKKyAqIEBwYXJhbSAgbnVtQ2hhbm5lbHMgICAgTnVtYmVyIG9mIGNoYW5uZWwgaW4gY2hhbm5lbCBsaXN0CisgKgorICogQHJldHVybiBTdGF0dXMKKyAqLworCitlSGFsU3RhdHVzIGNzckNoZWNrMTFkQ2hhbm5lbCh0QU5JX1U4IGNoYW5uZWxJZCwgdEFOSV9VOCAqcENoYW5uZWxMaXN0LCB0QU5JX1UzMiBudW1DaGFubmVscykKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdEFOSV9VOCBpID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1DaGFubmVsczsgaSsrKQorICAgIHsKKyAgICAgICAgaWYocENoYW5uZWxMaXN0WyBpIF0gPT0gY2hhbm5lbElkKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBjc3JTY2FuRmlsdGVyMTFkUmVzdWx0CisgKgorICpGVU5DVElPTjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gY3NyQXBwbHlDb3VudHJ5SW5mb3JtYXRpb24gZnVuY3Rpb24gYW5kCisgKiBmaWx0ZXIgc2NhbiByZXN1bHQgYmFzZWQgb24gdmFsaWQgY2hhbm5lbCBsaXN0IG51bWJlci4KKyAqCisgKkxPR0lDOgorICogR2V0IHNjYW4gcmVzdWx0IGZyb20gc2NhbiBsaXN0IGFuZCBDaGVjayBTY2FuIHJlc3VsdCBjaGFubmVsIG51bWJlcgorICogd2l0aCAxMWQgY2hhbm5lbCBsaXN0IGlmIGNoYW5uZWwgbnVtYmVyIGlzIGZvdW5kIGluIDExZCBjaGFubmVsIGxpc3QKKyAqIHRoZW4gZG8gbm90IHJlbW92ZSBzY2FuIHJlc3VsdCBlbnRyeSBmcm9tIHNjYW4gbGlzdAorICoKKyAqQVNTVU1QVElPTlM6CisgKgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gIHBNYWMgICAgICAgIFBvaW50ZXIgdG8gR2xvYmFsIE1BQyBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJuIFN0YXR1cworICovCisKK2VIYWxTdGF0dXMgY3NyU2NhbkZpbHRlcjExZFJlc3VsdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeSwqcFRlbXBFbnRyeTsKKyAgICB0Q3NyU2NhblJlc3VsdCAqcEJzc0Rlc2M7CisgICAgdEFOSV9VMzIgbGVuID0gc2l6ZW9mKHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCk7CisKKyAgICAvKiBHZXQgdmFsaWQgY2hhbm5lbHMgbGlzdCBmcm9tIENGRyAqLworICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldENmZ1ZhbGlkQ2hhbm5lbHMocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCAmbGVuKSkpCisgICAgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPRzEsICJGYWlsZWQgdG8gZ2V0IENoYW5uZWwgbGlzdCBmcm9tIENGRyIpOworICAgIH0KKworICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBMTF9BQ0NFU1NfTE9DSyApOworICAgIHdoaWxlKCBwRW50cnkgKQorICAgIHsKKyAgICAgICAgcEJzc0Rlc2MgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rICk7CisgICAgICAgIHBUZW1wRW50cnkgPSBjc3JMTE5leHQoICZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBwRW50cnksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICAgICAgaWYoY3NyQ2hlY2sxMWRDaGFubmVsKHBCc3NEZXNjLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5jaGFubmVsSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCBsZW4pKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZW1vdmUgU2NhbiByZXN1bHQgd2hpY2ggZG9lcyBub3QgaGF2ZSAxMWQgY2hhbm5lbCAqLworICAgICAgICAgICAgaWYoIGNzckxMUmVtb3ZlRW50cnkoICZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBwRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FDQ0VTU19MT0NLICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3NyRnJlZVNjYW5SZXN1bHRFbnRyeSggcE1hYywgcEJzc0Rlc2MgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwRW50cnkgPSBwVGVtcEVudHJ5OworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2NhbkNvcHlSZXN1bHRMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTY2FuUmVzdWx0SGFuZGxlIGhJbiwgdFNjYW5SZXN1bHRIYW5kbGUgKnBoUmVzdWx0KQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0U2NhblJlc3VsdExpc3QgKnBSZXRMaXN0LCAqcEluTGlzdCA9ICh0U2NhblJlc3VsdExpc3QgKiloSW47CisgICAgdENzclNjYW5SZXN1bHQgKnBSZXN1bHQsICpwU2NhblJlc3VsdDsKKyAgICB0QU5JX1UzMiBjb3VudCA9IDA7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdEFOSV9VMzIgYnNzTGVuLCBhbGxvY0xlbjsKKyAgICAKKyAgICBpZihwaFJlc3VsdCkKKyAgICB7CisgICAgICAgICpwaFJlc3VsdCA9IENTUl9JTlZBTElEX1NDQU5SRVNVTFRfSEFORExFOworICAgIH0KKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFJldExpc3QsIHNpemVvZih0U2NhblJlc3VsdExpc3QpKTsKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcFJldExpc3QsIHNpemVvZih0U2NhblJlc3VsdExpc3QpKTsKKyAgICAgICAgY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwUmV0TGlzdC0+TGlzdCk7CisgICAgICAgIHBSZXRMaXN0LT5wQ3VyRW50cnkgPSBOVUxMOworICAgICAgICBjc3JMTExvY2soJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QpOworICAgICAgICBjc3JMTExvY2soJnBJbkxpc3QtPkxpc3QpOworICAgICAgICAKKyAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnBJbkxpc3QtPkxpc3QsIExMX0FDQ0VTU19OT0xPQ0sgKTsKKyAgICAgICAgd2hpbGUoIHBFbnRyeSApIAorICAgICAgICB7CisgICAgICAgICAgICBwU2NhblJlc3VsdCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmsgKTsKKyAgICAgICAgICAgIGJzc0xlbiA9IHBTY2FuUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5sZW5ndGggKyBzaXplb2YocFNjYW5SZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmxlbmd0aCk7CisgICAgICAgICAgICBhbGxvY0xlbiA9IHNpemVvZiggdENzclNjYW5SZXN1bHQgKSArIGJzc0xlbjsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwUmVzdWx0LCBhbGxvY0xlbik7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3NyU2NhblJlc3VsdFB1cmdlKHBNYWMsICh0U2NhblJlc3VsdEhhbmRsZSAqKXBSZXRMaXN0KTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBSZXN1bHQsIGFsbG9jTGVuKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCAmcFNjYW5SZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCBic3NMZW4pOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzclNjYW5SZXN1bHRQdXJnZShwTWFjLCAodFNjYW5SZXN1bHRIYW5kbGUgKilwUmV0TGlzdCk7CisgICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHBTY2FuUmVzdWx0LT5SZXN1bHQucHZJZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwUmVzdWx0LT5SZXN1bHQucHZJZXMsIHNpemVvZiggdERvdDExZkJlYWNvbklFcyApKTsKKyAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0ZyZWUgdGhlIG1lbW9yeSB3ZSBhbGxvY2F0ZSBhYm92ZSBmaXJzdAorICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwUmVzdWx0ICk7CisgICAgICAgICAgICAgICAgICAgIGNzclNjYW5SZXN1bHRQdXJnZShwTWFjLCAodFNjYW5SZXN1bHRIYW5kbGUgKilwUmV0TGlzdCk7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFJlc3VsdC0+UmVzdWx0LnB2SWVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXN1bHQtPlJlc3VsdC5wdkllcywgc2l6ZW9mKCB0RG90MTFmQmVhY29uSUVzICkpOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vRnJlZSB0aGUgbWVtb3J5IHdlIGFsbG9jYXRlIGFib3ZlIGZpcnN0CisgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBSZXN1bHQgKTsKKyAgICAgICAgICAgICAgICAgICAgY3NyU2NhblJlc3VsdFB1cmdlKHBNYWMsICh0U2NhblJlc3VsdEhhbmRsZSAqKXBSZXRMaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjc3JMTEluc2VydFRhaWwoJnBSZXRMaXN0LT5MaXN0LCAmcFJlc3VsdC0+TGluaywgTExfQUNDRVNTX0xPQ0spOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIHBFbnRyeSA9IGNzckxMTmV4dCggJnBJbkxpc3QtPkxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyApOworICAgICAgICB9Ly93aGlsZQorICAgICAgICBjc3JMTFVubG9jaygmcEluTGlzdC0+TGlzdCk7CisgICAgICAgIGNzckxMVW5sb2NrKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0KTsKKyAgICAgICAgCisgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBpZigwID09IGNvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzckxMQ2xvc2UoJnBSZXRMaXN0LT5MaXN0KTsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBSZXRMaXN0KTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19FX05VTExfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHBoUmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwaFJlc3VsdCA9IHBSZXRMaXN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfS8vQWxsb2NhdGVkIHBSZXRMaXN0CisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKyAKK2VIYWxTdGF0dXMgY3NyU2Nhbm5pbmdTdGF0ZU1zZ1Byb2Nlc3NvciggdHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqcE1zZ0J1ZiApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTaXJNYk1zZyAqcE1zZyA9ICh0U2lyTWJNc2cgKilwTXNnQnVmOworCisgICAgaWYoKGVXTklfU01FX1NDQU5fUlNQID09IHBNc2ctPnR5cGUpIHx8IChlV05JX1NNRV9HRVRfU0NBTk5FRF9DSEFOTkVMX1JTUCA9PSBwTXNnLT50eXBlKSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGNzclNjYW5TbWVTY2FuUmVzcG9uc2UoIHBNYWMsIHBNc2dCdWYgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIGNzcklzQW55U2Vzc2lvbkluQ29ubmVjdFN0YXRlKCBwTWFjICkgKQorICAgICAgICB7CisgICAgICAgICAgICAvL0luIGNhc2Ugb2Ygd2UgYXJlIGNvbm5lY3RlZCwgd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIGNvbm5lY3Qgc3RhdHVzIGNoYW5nZXMKKyAgICAgICAgICAgIC8vYmVjYXVzZSBzY2FuIG1heSBhbHNvIHJ1biB3aGlsZSBjb25uZWN0ZWQuCisgICAgICAgICAgICBjc3JSb2FtQ2hlY2tGb3JMaW5rU3RhdHVzQ2hhbmdlKCBwTWFjLCAoIHRTaXJTbWVSc3AgKiApcE1zZ0J1ZiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiTWVzc2FnZSBbMHglMDR4XSByZWNlaXZlZCBpbiBzdGF0ZSwgd2hlbiBleHBlY3RpbmcgU2NhbiBSZXNwb25zZVxuIiwgcE1zZy0+dHlwZSApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKwordm9pZCBjc3JDaGVja05TYXZlV3NjSWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwTmV3QnNzRGVzY3IsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcE9sZEJzc0Rlc2NyKQoreworICAgIGludCBpZHgsIGxlbjsKKyAgICB0QU5JX1U4ICpwYkllOworCisgICAgLy9JZiBmYWlsZWQgdG8gcmVtb3ZlLCBhc3N1bWluZyBzb21lb25lIGVsc2UgZ290IGl0LgorICAgIGlmKChwTmV3QnNzRGVzY3ItPmZQcm9iZVJzcCAhPSBwT2xkQnNzRGVzY3ItPmZQcm9iZVJzcCkgJiYKKyAgICAgICAoMCA9PSBwTmV3QnNzRGVzY3ItPldzY0llTGVuKSkKKyAgICB7CisgICAgICAgIGlkeCA9IDA7CisgICAgICAgIGxlbiA9IHBPbGRCc3NEZXNjci0+bGVuZ3RoIC0gc2l6ZW9mKHRTaXJCc3NEZXNjcmlwdGlvbikgKyAKKyAgICAgICAgICAgICAgICBzaXplb2YodEFOSV9VMTYpICsgc2l6ZW9mKHRBTklfVTMyKSAtIERPVDExRl9JRV9XU0NQUk9CRVJFU19NSU5fTEVOIC0gMjsKKyAgICAgICAgcGJJZSA9ICh0QU5JX1U4ICopcE9sZEJzc0Rlc2NyLT5pZUZpZWxkczsKKyAgICAgICAgLy9TYXZlIFdQUyBJRSBpZiBpdCBleGlzdHMKKyAgICAgICAgcE5ld0Jzc0Rlc2NyLT5Xc2NJZUxlbiA9IDA7CisgICAgICAgIHdoaWxlKGlkeCA8IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYoKERPVDExRl9FSURfV1NDUFJPQkVSRVMgPT0gcGJJZVswXSkgJiYKKyAgICAgICAgICAgICAgICAoMHgwMCA9PSBwYkllWzJdKSAmJiAoMHg1MCA9PSBwYkllWzNdKSAmJiAoMHhmMiA9PSBwYkllWzRdKSAmJiAoMHgwNCA9PSBwYkllWzVdKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0ZvdW5yZCBpdAorICAgICAgICAgICAgICAgIGlmKChET1QxMUZfSUVfV1NDUFJPQkVSRVNfTUFYX0xFTiAtIDIpID49IHBiSWVbMV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBOZXdCc3NEZXNjci0+V3NjSWVQcm9iZVJzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJJZSwgcGJJZVsxXSArIDIpOworICAgICAgICAgICAgICAgICAgICBwTmV3QnNzRGVzY3ItPldzY0llTGVuID0gcGJJZVsxXSArIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWR4ICs9IHBiSWVbMV0gKyAyOworICAgICAgICAgICAgcGJJZSArPSBwYkllWzFdICsgMjsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKKy8vcEllcyBtYXkgYmUgTlVMTAordEFOSV9CT09MRUFOIGNzclJlbW92ZUR1cEJzc0Rlc2NyaXB0aW9uKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywgdEFuaVNTSUQgKnBTc2lkICwgdl9USU1FX3QgKnRpbWVyICkgCit7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisKKyAgICB0Q3NyU2NhblJlc3VsdCAqcEJzc0Rlc2M7CisgICAgdEFOSV9CT09MRUFOIGZSQyA9IEZBTFNFOworCisgICAgLy8gV2FsayB0aHJvdWdoIGFsbCB0aGUgY2hhaW5lZCBCc3NEZXNjcmlwdGlvbnMuICBJZiB3ZSBmaW5kIGEgY2hhaW5lZCBCc3NEZXNjcmlwdGlvbiB0aGF0CisgICAgLy8gbWF0Y2hlcyB0aGUgQnNzSUQgb2YgdGhlIEJzc0Rlc2NyaXB0aW9uIHBhc3NlZCBpbiwgdGhlbiB0aGVzZSBtdXN0IGJlIGR1cGxpY2F0ZSBzY2FuCisgICAgLy8gcmVzdWx0cyBmb3IgdGhpcyBCc3MuICBJbiB0aGF0IGNhc2UsIHJlbW92ZSB0aGUgJ29sZCcgQnNzIGRlc2NyaXB0aW9uIGZyb20gdGhlIGxpbmtlZCBsaXN0LgorICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0LCBMTF9BQ0NFU1NfTE9DSyApOworCisgICAgd2hpbGUoIHBFbnRyeSApIAorICAgIHsKKyAgICAgICAgcEJzc0Rlc2MgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rICk7CisKKyAgICAgICAgLy8gd2UgaGF2ZSBhIGR1cGxpY2F0ZSBzY2FuIHJlc3VsdHMgb25seSB3aGVuIEJTU0lELCBTU0lELCBDaGFubmVsIGFuZCBOZXR3b3JrVHlwZQorICAgICAgICAvLyBtYXRjaGVzCisgICAgICAgIGlmICggY3NySXNEdXBsaWNhdGVCc3NEZXNjcmlwdGlvbiggcE1hYywgJnBCc3NEZXNjLT5SZXN1bHQuQnNzRGVzY3JpcHRvciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXJCc3NEZXNjciwgcEllcyApICkKKyAgICAgICAgeworICAgICAgICAgICAgcFNpckJzc0Rlc2NyLT5yc3NpID0gKHRBTklfUzgpKCAoKCh0QU5JX1MzMilwU2lyQnNzRGVzY3ItPnJzc2kgKiBDU1JfU0NBTl9SRVNVTFRfUlNTSV9XRUlHSFQgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRBTklfUzMyKXBCc3NEZXNjLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5yc3NpICogKDEwMCAtIENTUl9TQ0FOX1JFU1VMVF9SU1NJX1dFSUdIVCkgKSkgLyAxMDAgKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgJ29sZCcgZW50cnkgZnJvbSB0aGUgbGlzdC4uLi4KKyAgICAgICAgICAgIGlmKCBjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTE9DSyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAhd2UgbmVlZCB0byBmcmVlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZQorICAgICAgICAgICAgICAgIC8vSWYgZmFpbGVkIHRvIHJlbW92ZSwgYXNzdW1pbmcgc29tZW9uZSBlbHNlIGdvdCBpdC4KKyAgICAgICAgICAgICAgICAqcFNzaWQgPSBwQnNzRGVzYy0+UmVzdWx0LnNzSWQ7CisgICAgICAgICAgICAgICAgKnRpbWVyID0gcEJzc0Rlc2MtPlJlc3VsdC50aW1lcjsKKyAgICAgICAgICAgICAgICBjc3JDaGVja05TYXZlV3NjSWUocE1hYywgcFNpckJzc0Rlc2NyLCAmcEJzc0Rlc2MtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjc3JGcmVlU2NhblJlc3VsdEVudHJ5KCBwTWFjLCBwQnNzRGVzYyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgRkwoICIgIGZhaWwgdG8gcmVtb3ZlIGVudHJ5XG4iICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZSQyA9IFRSVUU7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgbWF0Y2gsIHdlIGNhbiBzdG9wIGxvb2tpbmcgdGhyb3VnaCB0aGUgbGlzdC4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCAmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTE9DSyApOworICAgIH0KKworICAgIHJldHVybiBmUkM7Cit9CisKKworZUhhbFN0YXR1cyBjc3JBZGRQTUtJRENhbmRpZGF0ZUxpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBzbXNMb2cocE1hYywgTE9HVywgImNzckFkZFBNS0lEQ2FuZGlkYXRlTGlzdCBjYWxsZWQgcE1hYy0+c2Nhbi5OdW1QbWtpZENhbmRpZGF0ZSA9ICVkXG4iLCBwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUpOworICAgIGlmKCBwSWVzICkKKyAgICB7CisgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgYSBSU04gQlNTCisgICAgICAgIGlmKCBwSWVzLT5SU04ucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBCU1MgaXMgY2FwYWJsZSBvZiBkb2luZyBwcmUtYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgIGlmKCBwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUgPCBDU1JfTUFYX1BNS0lEX0FMTE9XRUQgKQorICAgICAgICAgICAgeworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfREVGKHNlY0V2ZW50LCB2b3NfZXZlbnRfd2xhbl9zZWN1cml0eV9wYXlsb2FkX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZzZWNFdmVudCwgc2l6ZW9mKHZvc19ldmVudF93bGFuX3NlY3VyaXR5X3BheWxvYWRfdHlwZSkpOworICAgICAgICAgICAgICAgICAgICBzZWNFdmVudC5ldmVudElkID0gV0xBTl9TRUNVUklUWV9FVkVOVF9QTUtJRF9DQU5ESURBVEVfRk9VTkQ7CisgICAgICAgICAgICAgICAgICAgIHNlY0V2ZW50LmVuY3J5cHRpb25Nb2RlTXVsdGljYXN0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KWRpYWdFbmNUeXBlRnJvbUNTUlR5cGUocFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUubWNFbmNyeXB0aW9uVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHNlY0V2ZW50LmVuY3J5cHRpb25Nb2RlVW5pY2FzdCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgKHZfVThfdClkaWFnRW5jVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkVuY3J5cHRpb25UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgc2VjRXZlbnQuYnNzaWQsIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLCA2ICk7CisgICAgICAgICAgICAgICAgICAgIHNlY0V2ZW50LmF1dGhNb2RlID0gCisgICAgICAgICAgICAgICAgICAgICAgICAodl9VOF90KWRpYWdBdXRoVHlwZUZyb21DU1JUeXBlKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkF1dGhUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnNlY0V2ZW50LCBFVkVOVF9XTEFOX1NFQ1VSSVRZKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYvLyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCisgICAgICAgICAgICAgICAgLy8gaWYgeWVzLCB0aGVuIGFkZCB0byBQTUtJRENhbmRpZGF0ZUxpc3QKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5QbWtpZENhbmRpZGF0ZUluZm9bcFNlc3Npb24tPk51bVBta2lkQ2FuZGlkYXRlXS5CU1NJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NEZXNjLT5ic3NJZCwgV05JX0NGR19CU1NJRF9MRU4pOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwSWVzLT5SU04ucHJlYXV0aCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5QbWtpZENhbmRpZGF0ZUluZm9bcFNlc3Npb24tPk51bVBta2lkQ2FuZGlkYXRlXS5wcmVBdXRoU3VwcG9ydGVkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+UG1raWRDYW5kaWRhdGVJbmZvW3BTZXNzaW9uLT5OdW1QbWtpZENhbmRpZGF0ZV0ucHJlQXV0aFN1cHBvcnRlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLy9UaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIG5ldyBBUCBpcyBmb3VuZCBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGVkIHByb2ZpbGUKKy8vSWYgaXQgaXMgZm91bmQsIGl0IHJldHVybiB0aGUgc2Vzc2lvbklkLCBlbHNlIGl0IHJldHVybiBpbnZhbGlkIHNlc3Npb25JRAordEFOSV9VMzIgY3NyUHJvY2Vzc0JTU0Rlc2NGb3JQTUtJRExpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworICAgIHRBTklfVTMyIGksIGJSZXQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisgICAgdERvdDExZkJlYWNvbklFcyAqcEllc0xvY2FsID0gcEllczsKKworICAgIGlmKCBwSWVzTG9jYWwgfHwgSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsIHBCc3NEZXNjLCAmcEllc0xvY2FsKSkgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIGkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIGkgKTsKKyAgICAgICAgICAgICAgICBpZiggY3NySXNDb25uU3RhdGVDb25uZWN0ZWRJbmZyYSggcE1hYywgaSApICYmIAorICAgICAgICAgICAgICAgICAgICAoIGVDU1JfQVVUSF9UWVBFX1JTTiA9PSBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5BdXRoVHlwZSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKGNzck1hdGNoQlNTVG9Db25uZWN0UHJvZmlsZShwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUsIHBCc3NEZXNjLCBwSWVzTG9jYWwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgbmV3IEJTUyBmaXRzIHRoZSBjdXJyZW50IHByb2ZpbGUgY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyQWRkUE1LSURDYW5kaWRhdGVMaXN0KHBNYWMsIGksIHBCc3NEZXNjLCBwSWVzTG9jYWwpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmV0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCAhcEllcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEllc0xvY2FsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAodEFOSV9VOCliUmV0OworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKK2VIYWxTdGF0dXMgY3NyQWRkQktJRENhbmRpZGF0ZUxpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyQWRkQktJRENhbmRpZGF0ZUxpc3QgY2FsbGVkIHBNYWMtPnNjYW4uTnVtQmtpZENhbmRpZGF0ZSA9ICVkXG4iLCBwU2Vzc2lvbi0+TnVtQmtpZENhbmRpZGF0ZSk7CisgICAgaWYoIHBJZXMgKQorICAgIHsKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBhIFdBUEkgQlNTCisgICAgICAgIGlmKCBwSWVzLT5XQVBJLnByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgQlNTIGlzIGNhcGFibGUgb2YgZG9pbmcgcHJlLWF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICBpZiggcFNlc3Npb24tPk51bUJraWRDYW5kaWRhdGUgPCBDU1JfTUFYX0JLSURfQUxMT1dFRCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAvLyBpZiB5ZXMsIHRoZW4gYWRkIHRvIEJLSURDYW5kaWRhdGVMaXN0CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2Vzc2lvbi0+QmtpZENhbmRpZGF0ZUluZm9bcFNlc3Npb24tPk51bUJraWRDYW5kaWRhdGVdLkJTU0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0Rlc2MtPmJzc0lkLCBXTklfQ0ZHX0JTU0lEX0xFTik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHBJZXMtPldBUEkucHJlYXV0aCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5Ca2lkQ2FuZGlkYXRlSW5mb1twU2Vzc2lvbi0+TnVtQmtpZENhbmRpZGF0ZV0ucHJlQXV0aFN1cHBvcnRlZCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPkJraWRDYW5kaWRhdGVJbmZvW3BTZXNzaW9uLT5OdW1Ca2lkQ2FuZGlkYXRlXS5wcmVBdXRoU3VwcG9ydGVkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5OdW1Ca2lkQ2FuZGlkYXRlKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8vVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciBuZXcgQVAgaXMgZm91bmQgZm9yIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBwcm9maWxlCisvL2lmIHNvIGFkZCB0byBCS0lEQ2FuZGlkYXRlTGlzdAordEFOSV9CT09MRUFOIGNzclByb2Nlc3NCU1NEZXNjRm9yQktJRExpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisgICAgdEFOSV9CT09MRUFOIGZSQyA9IEZBTFNFOworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXNMb2NhbCA9IHBJZXM7CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb247CisKKyAgICBpZiggcEllc0xvY2FsIHx8IEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRQYXJzZWRCc3NEZXNjcmlwdGlvbklFcyhwTWFjLCBwQnNzRGVzYywgJnBJZXNMb2NhbCkpICkKKyAgICB7CisgICAgICAgIGZvciggc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IHNlc3Npb25JZCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgICAgICAgICAgICAgaWYoIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSW5mcmEoIHBNYWMsIHNlc3Npb25JZCApICYmIAorICAgICAgICAgICAgICAgICAgICBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9DRVJUSUZJQ0FURSA9PSBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5BdXRoVHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKGNzck1hdGNoQlNTVG9Db25uZWN0UHJvZmlsZShwTWFjLCAmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUscEJzc0Rlc2MsIHBJZXNMb2NhbCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBuZXcgQlNTIGZpdHMgdGhlIGN1cnJlbnQgcHJvZmlsZSBjb25uZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JBZGRCS0lEQ2FuZGlkYXRlTGlzdChwTWFjLCBzZXNzaW9uSWQsIHBCc3NEZXNjLCBwSWVzTG9jYWwpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUkMgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCFwSWVzKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXNMb2NhbCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICByZXR1cm4gZlJDOworfQorCisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBjc3JNb3ZlVGVtcFNjYW5SZXN1bHRzVG9NYWluTGlzdCggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdENzclNjYW5SZXN1bHQgKnBCc3NEZXNjcmlwdGlvbjsKKyAgICB0QU5JX1M4ICAgICAgICAgY2FuZF9Cc3NfcnNzaTsKKyAgICB0QU5JX0JPT0xFQU4gICAgZkR1cEJzczsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgIHRBTklfQk9PTEVBTiBmTmV3V2FwaUJTU0ZvckN1ckNvbm5lY3Rpb24gPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzTG9jYWwgPSBOVUxMOworICAgIHRBTklfVTMyIHNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisgICAgdEFuaVNTSUQgdG1wU3NpZDsKKyAgICB2X1RJTUVfdCB0aW1lcj0wOworCisgICAgdG1wU3NpZC5sZW5ndGggPSAwOworICAgIGNhbmRfQnNzX3Jzc2kgPSAtMTI4OyAvLyBSU1NJIGNvbWluZyBmcm9tIFBFIGlzIC12ZQorCisgICAgLy8gcmVtb3ZlIHRoZSBCU1MgZGVzY3JpcHRpb25zIGZyb20gdGVtcG9yYXJ5IGxpc3QKKyAgICB3aGlsZSggKCBwRW50cnkgPSBjc3JMTFJlbW92ZVRhaWwoICZwTWFjLT5zY2FuLnRlbXBTY2FuUmVzdWx0cywgTExfQUNDRVNTX0xPQ0sgKSApICE9IE5VTEwpCisgICAgeworICAgICAgICBwQnNzRGVzY3JpcHRpb24gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rICk7CisKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiLi4uQnNzaWQ9ICUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4IGNoYW49ICVkLCByc3NpID0gLSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuYnNzSWRbIDAgXSwgcEJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5ic3NJZFsgMSBdLAorICAgICAgICAgICAgICAgICAgICAgIHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuYnNzSWRbIDIgXSwgcEJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5ic3NJZFsgMyBdLAorICAgICAgICAgICAgICAgICAgICAgIHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuYnNzSWRbIDQgXSwgcEJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQuQnNzRGVzY3JpcHRvci5ic3NJZFsgNSBdLAorICAgICAgICAgICAgICAgICAgICAgIHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkLAorICAgICAgICAgICAgICAgIHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IucnNzaSAqICgtMSkgKTsKKworICAgICAgICAvL0F0IHRoaXMgdGltZSwgcEJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQucHZJZXMgbWF5IGJlIE5VTEwKKyAgICAgICAgcEllc0xvY2FsID0gKHREb3QxMWZCZWFjb25JRXMgKikoIHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LnB2SWVzICk7CisgICAgICAgIGlmKCAhcEllc0xvY2FsICYmICghSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsICZwQnNzRGVzY3JpcHRpb24tPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCAmcEllc0xvY2FsKSkpICkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgIENhbm5vdCBwYXJlZCBJRXNcbiIpKTsKKyAgICAgICAgICAgIGNzckZyZWVTY2FuUmVzdWx0RW50cnkocE1hYywgcEJzc0Rlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZEdXBCc3MgPSBjc3JSZW1vdmVEdXBCc3NEZXNjcmlwdGlvbiggcE1hYywgJnBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IsIHBJZXNMb2NhbCwgJnRtcFNzaWQgLCAmdGltZXIgKTsKKyAgICAgICAgLy9DaGVjayB3aGV0aGVyIHdlIGhhdmUgcmVhY2ggb3V0IGxpbWl0CisgICAgICAgIGlmKCBDU1JfU0NBTl9JU19PVkVSX0JTU19MSU1JVChwTWFjKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vTGltaXQgcmVhY2gKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiICBCU1MgbGltaXQgcmVhY2hlZFxuIikpOworICAgICAgICAgICAgLy9GcmVlIHRoZSByZXNvdXJjZXMKKyAgICAgICAgICAgIGlmKCAocEJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQucHZJZXMgPT0gTlVMTCkgJiYgcEllc0xvY2FsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXNMb2NhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjc3JGcmVlU2NhblJlc3VsdEVudHJ5KHBNYWMsIHBCc3NEZXNjcmlwdGlvbik7CisgICAgICAgICAgICAvL0NvbnRpbnVlIGJlY2F1c2UgdGhlcmUgbWF5IGJlIGR1cGxpY2F0ZWQgQlNTCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBjaGVjayBmb3IgZHVwbGljYXRlIHNjYW4gcmVzdWx0cworICAgICAgICBpZiAoICFmRHVwQnNzICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9Gb3VuZCBhIG5ldyBCU1MKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IGNzclByb2Nlc3NCU1NEZXNjRm9yUE1LSURMaXN0KHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQuQnNzRGVzY3JpcHRvciwgcEllc0xvY2FsKTsKKyAgICAgICAgICAgIGlmKCBDU1JfU0VTU0lPTl9JRF9JTlZBTElEICE9IHNlc3Npb25JZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fU0NBTl9GT1VORF9ORVdfQlNTLCBlQ1NSX1JPQU1fUkVTVUxUX05PTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9DaGVjayBpZiB0aGUgbmV3IG9uZSBoYXMgU1NJRCBpdCBpdCwgaWYgbm90LCB1c2UgdGhlIG9sZGVyIFNTSUQgaWYgaXQgZXhpc3RzLgorICAgICAgICAgICAgaWYoICgwID09IHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LnNzSWQubGVuZ3RoKSAmJiB0bXBTc2lkLmxlbmd0aCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9OZXcgQlNTIGhhcyBhIGhpZGRlbiBTU0lEIGFuZCBvbGQgb25lIGhhcyB0aGUgU1NJRC4gS2VlcCB0aGUgU1NJRCBvbmx5IAorICAgICAgICAgICAgICAgIC8vaWYgZGlmZiBvZiBzYXZlZCBTU0lEIHRpbWUgYW5kIGN1cnJlbnQgdGltZSBpcyBsZXNzIHRoYW4gMSBtaW4gdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAvL3NpZGUgZWZmZWN0IG9mIHNhdmluZyBTU0lEIHdpdGggb2xkIG9uZSBpcyB0aGF0IGlmIEFQIGNoYW5nZXMgaXRzIFNTSUQgd2hpbGUgcmVtYWluCisgICAgICAgICAgICAgICAgLy9oaWRkZW4sIHdlIG1heSBuZXZlciBzZWUgaXQgYW5kIGFsc28gdG8gYWRkcmVzcyB0aGUgcmVxdWlyZW1lbnQgb2YgCisgICAgICAgICAgICAgICAgLy9XaGVuIHdlIHJlbW92ZSBoaWRkZW4gc3NpZCBmcm9tIHRoZSBwcm9maWxlIGkuZS4sIGZvcmdldCB0aGUgU1NJRCB2aWEgCisgICAgICAgICAgICAgICAgLy8gR1VJIHRoYXQgU1NJRCBzaG91bGRuJ3Qgc2VlIGluIHRoZSBwcm9maWxlCisgICAgICAgICAgICAgICAgaWYoICh2b3NfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCkgLSB0aW1lcikgPD0gSElEREVOX1RJTUVSKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBwQnNzRGVzY3JpcHRpb24tPlJlc3VsdC50aW1lciA9IHRpbWVyOworICAgICAgICAgICAgICAgICAgIHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LnNzSWQgPSB0bXBTc2lkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vVHVzaDogZmluZCBhIGdvb2QgQVAgZm9yIDExZCBpbmZvCisgICAgICAgIGlmKCBjc3JJczExZFN1cHBvcnRlZCggcE1hYyApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY2FuZF9Cc3NfcnNzaSA8IHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IucnNzaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBjb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQgaXMgcHJlc2VudAorICAgICAgICAgICAgICAgIGlmKHBJZXNMb2NhbC0+Q291bnRyeS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuZF9Cc3NfcnNzaSA9IHBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IucnNzaTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVhcm4gY291bnRyeSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICBjc3JMZWFybkNvdW50cnlJbmZvcm1hdGlvbiggcE1hYywgJnBCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVzTG9jYWwsIGVBTklfQk9PTEVBTl9GQUxTRSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYXBwZW5kIHRvIG1haW4gbGlzdAorICAgICAgICBjc3JTY2FuQWRkUmVzdWx0KHBNYWMsIHBCc3NEZXNjcmlwdGlvbiwgcEllc0xvY2FsKTsKKyAgICAgICAgaWYoIChwQnNzRGVzY3JpcHRpb24tPlJlc3VsdC5wdkllcyA9PSBOVUxMKSAmJiBwSWVzTG9jYWwgKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXNMb2NhbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL1R1c2g6IElmIHdlIGNhbiBmaW5kIHRoZSBjdXJyZW50IDExZCBpbmZvIGluIGFueSBvZiB0aGUgc2NhbiByZXN1bHRzLCBvcgorICAgIC8vIGEgZ29vZCBlbm91Z2ggQVAgd2l0aCB0aGUgMTFkIGluZm8gZnJvbSB0aGUgc2NhbiByZXN1bHRzIHRoZW4gbm8gbmVlZCB0bworICAgIC8vIGdldCBpbnRvIGFtYmlndW91cyBzdGF0ZQorICAgIGlmKHBNYWMtPnNjYW4uZkFtYmlndW91czExZEluZm9Gb3VuZCkgCisgICAgeworICAgICAgaWYoKHBNYWMtPnNjYW4uZkN1cnJlbnQxMWRJbmZvTWF0Y2gpIHx8IChjYW5kX0Jzc19yc3NpICE9IC0xMjgpKQorICAgICAgeworICAgICAgICBwTWFjLT5zY2FuLmZBbWJpZ3VvdXMxMWRJbmZvRm91bmQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICB9CisgICAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICBpZihmTmV3V2FwaUJTU0ZvckN1ckNvbm5lY3Rpb24pCisgICAgeworICAgICAgICAvL3JlbWVtYmVyIGl0IGZpcnN0CisgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBOVUxMLCAwLCBlQ1NSX1JPQU1fU0NBTl9GT1VORF9ORVdfQlNTLCBlQ1NSX1JPQU1fUkVTVUxUX05FV19XQVBJX0JTUyk7CisgICAgfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyAgICByZXR1cm47Cit9CisKKworc3RhdGljIHRDc3JTY2FuUmVzdWx0ICpjc3JTY2FuU2F2ZUJzc0Rlc2NyaXB0aW9uKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBCU1NEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKyAgICB0Q3NyU2NhblJlc3VsdCAqcENzckJzc0Rlc2NyaXB0aW9uID0gTlVMTDsKKyAgICB0QU5JX1UzMiBjYkJTU0Rlc2M7CisgICAgdEFOSV9VMzIgY2JBbGxvY2F0ZWQ7CisgICAgZUhhbFN0YXR1cyBoYWxTdGF0dXM7CisKKyAgICAvLyBmaWd1cmUgb3V0IGhvdyBiaWcgdGhlIEJTUyBkZXNjcmlwdGlvbiBpcyAodGhlIEJTU0Rlc2MtPmxlbmd0aCBkb2VzIE5PVAorICAgIC8vIGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYpLgorICAgIGNiQlNTRGVzYyA9IHBCU1NEZXNjcmlwdGlvbi0+bGVuZ3RoICsgc2l6ZW9mKCBwQlNTRGVzY3JpcHRpb24tPmxlbmd0aCApOworCisgICAgY2JBbGxvY2F0ZWQgPSBzaXplb2YoIHRDc3JTY2FuUmVzdWx0ICkgKyBjYkJTU0Rlc2M7CisKKyAgICBoYWxTdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBDc3JCc3NEZXNjcmlwdGlvbiwgY2JBbGxvY2F0ZWQgKTsKKyAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyhoYWxTdGF0dXMpICkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBDc3JCc3NEZXNjcmlwdGlvbiwgY2JBbGxvY2F0ZWQgKTsKKyAgICAgICAgcENzckJzc0Rlc2NyaXB0aW9uLT5BZ2luZ0NvdW50ID0gKHRBTklfUzMyKXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYWdpbmdDb3VudDsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcENzckJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQuQnNzRGVzY3JpcHRvciwgcEJTU0Rlc2NyaXB0aW9uLCBjYkJTU0Rlc2MgKTsKKyNpZiBkZWZpbmVkKFZPU1NfRU5TQkFMRUQpCisgICAgICAgIFZPU19BU1NFUlQoIHBDc3JCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LnB2SWVzID09IE5VTEwgKTsKKyNlbmRpZgorICAgICAgICBjc3JTY2FuQWRkUmVzdWx0KHBNYWMsIHBDc3JCc3NEZXNjcmlwdGlvbiwgcEllcyk7CisgICAgfQorCisgICAgcmV0dXJuKCBwQ3NyQnNzRGVzY3JpcHRpb24gKTsKK30KKworLy8gQXBwZW5kIGEgQnNzIERlc2NyaXB0aW9uLi4uCit0Q3NyU2NhblJlc3VsdCAqY3NyU2NhbkFwcGVuZEJzc0Rlc2NyaXB0aW9uKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2NyaXB0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMgKQoreworICAgIHRDc3JTY2FuUmVzdWx0ICpwQ3NyQnNzRGVzY3JpcHRpb24gPSBOVUxMOworICAgIHRBbmlTU0lEIHRtcFNzaWQ7CisgICAgdl9USU1FX3QgdGltZXIgPSAwOworICAgIGludCByZXN1bHQ7CisKKyAgICB0bXBTc2lkLmxlbmd0aCA9IDA7CisgICAgcmVzdWx0ID0gY3NyUmVtb3ZlRHVwQnNzRGVzY3JpcHRpb24oIHBNYWMsIHBTaXJCc3NEZXNjcmlwdGlvbiwgcEllcywgJnRtcFNzaWQsICZ0aW1lciApOworICAgIHBDc3JCc3NEZXNjcmlwdGlvbiA9IGNzclNjYW5TYXZlQnNzRGVzY3JpcHRpb24oIHBNYWMsIHBTaXJCc3NEZXNjcmlwdGlvbiwgcEllcyApOworICAgIGlmIChyZXN1bHQgJiYgKHBDc3JCc3NEZXNjcmlwdGlvbiAhPSBOVUxMKSkKKyAgICB7CisgICAgICAgIC8vQ2hlY2sgaWYgdGhlIG5ldyBvbmUgaGFzIFNTSUQgaXQgaXQsIGlmIG5vdCwgdXNlIHRoZSBvbGRlciBTU0lEIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgaWYoICgwID09IHBDc3JCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LnNzSWQubGVuZ3RoKSAmJiB0bXBTc2lkLmxlbmd0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vTmV3IEJTUyBoYXMgYSBoaWRkZW4gU1NJRCBhbmQgb2xkIG9uZSBoYXMgdGhlIFNTSUQuIEtlZXAgdGhlIFNTSUQgb25seQorICAgICAgICAgICAgLy9pZiBkaWZmIG9mIHNhdmVkIFNTSUQgdGltZSBhbmQgY3VycmVudCB0aW1lIGlzIGxlc3MgdGhhbiAxIG1pbiB0byBhdm9pZAorICAgICAgICAgICAgLy9zaWRlIGVmZmVjdCBvZiBzYXZpbmcgU1NJRCB3aXRoIG9sZCBvbmUgaXMgdGhhdCBpZiBBUCBjaGFuZ2VzIGl0cyBTU0lEIHdoaWxlIHJlbWFpbgorICAgICAgICAgICAgLy9oaWRkZW4sIHdlIG1heSBuZXZlciBzZWUgaXQgYW5kIGFsc28gdG8gYWRkcmVzcyB0aGUgcmVxdWlyZW1lbnQgb2YKKyAgICAgICAgICAgIC8vV2hlbiB3ZSByZW1vdmUgaGlkZGVuIHNzaWQgZnJvbSB0aGUgcHJvZmlsZSBpLmUuLCBmb3JnZXQgdGhlIFNTSUQgdmlhCisgICAgICAgICAgICAvLyBHVUkgdGhhdCBTU0lEIHNob3VsZG4ndCBzZWUgaW4gdGhlIHByb2ZpbGUKKyAgICAgICAgICAgIGlmKCh2b3NfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCktdGltZXIpIDw9IEhJRERFTl9USU1FUikKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgIHBDc3JCc3NEZXNjcmlwdGlvbi0+UmVzdWx0LnNzSWQgPSB0bXBTc2lkOworICAgICAgICAgICAgICBwQ3NyQnNzRGVzY3JpcHRpb24tPlJlc3VsdC50aW1lciA9IHRpbWVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICByZXR1cm4oIHBDc3JCc3NEZXNjcmlwdGlvbiApOworfQorCisKKwordm9pZCBjc3JQdXJnZUNoYW5uZWxQb3dlciggdHBBbmlTaXJHbG9iYWwgcE1hYywgdERibExpbmtMaXN0ICpwQ2hhbm5lbExpc3QgKQoreworICAgIHRDc3JDaGFubmVsUG93ZXJJbmZvICpwQ2hhbm5lbFNldDsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKworICAgIGNzckxMTG9jayhwQ2hhbm5lbExpc3QpOyAKKyAgICAvLyBSZW1vdmUgdGhlIGNoYW5uZWwgc2V0cyBmcm9tIHRoZSBsZWFybmVkIGxpc3QgYW5kIHB1dCB0aGVtIGluIHRoZSBmcmVlIGxpc3QKKyAgICB3aGlsZSggKCBwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoIHBDaGFubmVsTGlzdCwgTExfQUNDRVNTX05PTE9DSyApICkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBDaGFubmVsU2V0ID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0Q3NyQ2hhbm5lbFBvd2VySW5mbywgbGluayApOworICAgICAgICBpZiggcENoYW5uZWxTZXQgKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwQ2hhbm5lbFNldCApOworICAgICAgICB9CisgICAgfQorICAgIGNzckxMVW5sb2NrKHBDaGFubmVsTGlzdCk7CisgICAgcmV0dXJuOworfQorCisKKy8qCisgKiBTYXZlIHRoZSBjaGFubmVsTGlzdCBpbnRvIHRoZSB1bHRpbWF0ZSBzdG9yYWdlIGFzIHRoZSBmaW5hbCBzdGFnZSBvZiBjaGFubmVsIAorICogSW5wdXQ6IHBDb3VudHJ5SW5mbyAtLSB0aGUgY291bnRyeSBjb2RlIChlLmcuICJVU0kiKSwgY2hhbm5lbCBsaXN0LCBhbmQgcG93ZXIgbGltaXQgYXJlIGFsbCBzdG9yZWQgaW5zaWRlIHRoaXMgZGF0YSBzdHJ1Y3R1cmUKKyAqLwordm9pZCBjc3JTYXZlVG9DaGFubmVsUG93ZXIyR181RyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgdGFibGVTaXplLCB0U2lyTWFjQ2hhbkluZm8gKmNoYW5uZWxUYWJsZSApCit7CisgICAgdEFOSV9VMzIgaSA9IHRhYmxlU2l6ZSAvIHNpemVvZiggdFNpck1hY0NoYW5JbmZvICk7CisgICAgdFNpck1hY0NoYW5JbmZvICpwQ2hhbm5lbEluZm87CisgICAgdENzckNoYW5uZWxQb3dlckluZm8gKnBDaGFubmVsU2V0OworICAgIHRBTklfQk9PTEVBTiBmMkdIekluZm9Gb3VuZCA9IEZBTFNFOworICAgIHRBTklfQk9PTEVBTiBmMkdMaXN0UHVyZ2VkID0gRkFMU0UsIGY1R0xpc3RQdXJnZWQgPSBGQUxTRTsKKyAgICBlSGFsU3RhdHVzIGhhbFN0YXR1czsKKworICAgIHBDaGFubmVsSW5mbyA9IGNoYW5uZWxUYWJsZTsKKyAgICAvLyBhdGxlYXN0IDMgYnl0ZXMgaGF2ZSB0byBiZSByZW1haW5pbmcgIC0tIGZyb20gImNvdW50cnlTdHJpbmciCisgICAgd2hpbGUgKCBpLS0gKQorICAgIHsKKyAgICAgICAgaGFsU3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQ2hhbm5lbFNldCwgc2l6ZW9mKHRDc3JDaGFubmVsUG93ZXJJbmZvKSApOworICAgICAgICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gaGFsU3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwQ2hhbm5lbFNldCwgc2l6ZW9mKHRDc3JDaGFubmVsUG93ZXJJbmZvKSk7CisgICAgICAgICAgICBwQ2hhbm5lbFNldC0+Zmlyc3RDaGFubmVsID0gcENoYW5uZWxJbmZvLT5maXJzdENoYW5OdW07CisgICAgICAgICAgICBwQ2hhbm5lbFNldC0+bnVtQ2hhbm5lbHMgPSBwQ2hhbm5lbEluZm8tPm51bUNoYW5uZWxzOworCisgICAgICAgICAgICAvLyBOb3cgc2V0IHRoZSBpbnRlci1jaGFubmVsIG9mZnNldCBiYXNlZCBvbiB0aGUgZnJlcXVlbmN5IGJhbmQgdGhlIGNoYW5uZWwgc2V0IGxpZXMgaW4KKyAgICAgICAgICAgIGlmKCBDU1JfSVNfQ0hBTk5FTF8yNEdIWihwQ2hhbm5lbFNldC0+Zmlyc3RDaGFubmVsKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENoYW5uZWxTZXQtPmludGVyQ2hhbm5lbE9mZnNldCA9IDE7CisgICAgICAgICAgICAgICAgZjJHSHpJbmZvRm91bmQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDaGFubmVsU2V0LT5pbnRlckNoYW5uZWxPZmZzZXQgPSA0OworICAgICAgICAgICAgICAgIGYyR0h6SW5mb0ZvdW5kID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQ2hhbm5lbFNldC0+dHhQb3dlciA9IENTUl9ST0FNX01JTiggcENoYW5uZWxJbmZvLT5tYXhUeFBvd2VyLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwICk7CisKKyAgICAgICAgICAgIGlmKCBmMkdIekluZm9Gb3VuZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFmMkdMaXN0UHVyZ2VkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHB1cmdlIHByZXZpb3VzIHJlc3VsdHMgaWYgZm91bmQgbmV3CisgICAgICAgICAgICAgICAgICAgIGNzclB1cmdlQ2hhbm5lbFBvd2VyKCBwTWFjLCAmcE1hYy0+c2Nhbi5jaGFubmVsUG93ZXJJbmZvTGlzdDI0ICk7CisgICAgICAgICAgICAgICAgICAgIGYyR0xpc3RQdXJnZWQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKENTUl9JU19PUEVSQVRJTkdfQkdfQkFORChwTWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgbGlzdCBvZiAyLjQgR0h6IGNoYW5uZWwgc2V0cworICAgICAgICAgICAgICAgICAgICBjc3JMTEluc2VydFRhaWwoICZwTWFjLT5zY2FuLmNoYW5uZWxQb3dlckluZm9MaXN0MjQsICZwQ2hhbm5lbFNldC0+bGluaywgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgRkwoIkFkZGluZyAxMUIvRyBjaGFubmVscyBpbiAxMUEgbW9kZSAtLSBGaXJzdCBDaGFubmVsIGlzICVkIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbFNldC0+Zmlyc3RDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQ2hhbm5lbFNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIDVHSHogaW5mbyBmb3VuZAorICAgICAgICAgICAgICAgIGlmKCAhZjVHTGlzdFB1cmdlZCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBwdXJnZSBwcmV2aW91cyByZXN1bHRzIGlmIGZvdW5kIG5ldworICAgICAgICAgICAgICAgICAgICBjc3JQdXJnZUNoYW5uZWxQb3dlciggcE1hYywgJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3Q1RyApOworICAgICAgICAgICAgICAgICAgICBmNUdMaXN0UHVyZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihDU1JfSVNfT1BFUkFUSU5HX0FfQkFORChwTWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgbGlzdCBvZiA1R0h6IGNoYW5uZWwgc2V0cworICAgICAgICAgICAgICAgICAgICBjc3JMTEluc2VydFRhaWwoICZwTWFjLT5zY2FuLmNoYW5uZWxQb3dlckluZm9MaXN0NUcsICZwQ2hhbm5lbFNldC0+bGluaywgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgRkwoIkFkZGluZyAxMUEgY2hhbm5lbHMgaW4gQi9HIG1vZGUgLS0gRmlyc3QgQ2hhbm5lbCBpcyAlZCIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYW5uZWxTZXQtPmZpcnN0Q2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcENoYW5uZWxTZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBDaGFubmVsSW5mbysrOyAgICAgICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZW50cnkKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworCit2b2lkIGNzckFwcGx5UG93ZXIyQ3VycmVudCggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgICAgc21zTG9nKCBwTWFjLCBMT0czLCBGTCgiIFVwZGF0aW5nIENmZyB3aXRoIHBvd2VyIHNldHRpbmdzXG4iKSk7CisgICAgY3NyU2F2ZVR4UG93ZXJUb0NmZyggcE1hYywgJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3QyNCwgV05JX0NGR19NQVhfVFhfUE9XRVJfMl80ICk7CisgICAgY3NyU2F2ZVR4UG93ZXJUb0NmZyggcE1hYywgJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3Q1RywgV05JX0NGR19NQVhfVFhfUE9XRVJfNSApOworfQorCisKK3ZvaWQgY3NyQXBwbHlDaGFubmVsUG93ZXJDb3VudHJ5SW5mbyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckNoYW5uZWwgKnBDaGFubmVsTGlzdCwgdEFOSV9VOCAqY291bnRyeUNvZGUpCit7CisgICAgaW50IGk7CisgICAgZU5WQ2hhbm5lbEVuYWJsZWRUeXBlIGNoYW5uZWxFbmFibGVkVHlwZTsKKyAgICB0QU5JX1U4IG51bUNoYW5uZWxzID0gMDsKKyAgICB0QU5JX1U4IHRlbXBOdW1DaGFubmVscyA9IDA7CisgICAgdENzckNoYW5uZWwgQ2hhbm5lbExpc3Q7CisgICAgaWYoIHBDaGFubmVsTGlzdC0+bnVtQ2hhbm5lbHMgKQorICAgIHsKKyAgICAgICAgdGVtcE51bUNoYW5uZWxzID0gQ1NSX01JTihwQ2hhbm5lbExpc3QtPm51bUNoYW5uZWxzLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pOworICAgICAgICAvKiBJZiB1c2VyIGRvZXNuJ3Qgd2FudCB0byBzY2FuIHRoZSBERlMgY2hhbm5lbHMgbGV0cyB0cmltIHRoZW0gZnJvbSAKKyAgICAgICAgdGhlIHZhbGlkIGNoYW5uZWwgbGlzdCovCisgICAgICAgIGlmKEZBTFNFID09IHBNYWMtPnNjYW4uZkVuYWJsZURGU0NobmxTY2FuKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGk8IHRlbXBOdW1DaGFubmVsczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBjaGFubmVsRW5hYmxlZFR5cGUgPSAKKyAgICAgICAgICAgICAgICAgICAgIHZvc19udl9nZXRDaGFubmVsRW5hYmxlZFN0YXRlKHBDaGFubmVsTGlzdC0+Y2hhbm5lbExpc3RbaV0pOworICAgICAgICAgICAgICAgICBpZiggTlZfQ0hBTk5FTF9FTkFCTEUgPT0gIGNoYW5uZWxFbmFibGVkVHlwZSkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbExpc3QuY2hhbm5lbExpc3RbbnVtQ2hhbm5lbHNdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbExpc3QtPmNoYW5uZWxMaXN0W2ldOworICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMrKzsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2hhbm5lbExpc3QubnVtQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENoYW5uZWxMaXN0Lm51bUNoYW5uZWxzID0gdGVtcE51bUNoYW5uZWxzOworICAgICAgICAgICAgIHZvc19tZW1fY29weShDaGFubmVsTGlzdC5jaGFubmVsTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYW5uZWxMaXN0LT5jaGFubmVsTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbExpc3QubnVtQ2hhbm5lbHMpOworICAgICAgICB9CisKKyAgICAgICAgY3NyU2V0Q2ZnVmFsaWRDaGFubmVsTGlzdChwTWFjLCBDaGFubmVsTGlzdC5jaGFubmVsTGlzdCwgQ2hhbm5lbExpc3QubnVtQ2hhbm5lbHMpOworICAgICAgICAvLyBleHRlbmQgc2NhbiBjYXBhYmlsaXR5CisgICAgICAgIGNzclNldENmZ1NjYW5Db250cm9sTGlzdChwTWFjLCBjb3VudHJ5Q29kZSwgJkNoYW5uZWxMaXN0KTsgICAgIC8vICBidWlsZCBhIHNjYW4gbGlzdCBiYXNlZCBvbiB0aGUgY2hhbm5lbCBsaXN0IDogY2hhbm5lbCMgKyBhY3RpdmUvcGFzc2l2ZSBzY2FuCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisgICAgICAgIC8vIFNlbmQgSEFMIFVwZGF0ZVNjYW5QYXJhbXMgbWVzc2FnZQorICAgICAgICAvL3BtY1VwZGF0ZVNjYW5QYXJhbXMocE1hYywgJihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtKSwgcENoYW5uZWxMaXN0LCBUUlVFKTsKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiICAxMUQgY2hhbm5lbCBsaXN0IGlzIGVtcHR5XG4iKSk7CisgICAgfQorICAgIGNzckFwcGx5UG93ZXIyQ3VycmVudCggcE1hYyApOyAgICAgLy8gU3RvcmUgdGhlIGNoYW5uZWwrcG93ZXIgaW5mbyBpbiB0aGUgZ2xvYmFsIHBsYWNlOiBDZmcgCisgICAgY3NyU2V0Q2ZnQ291bnRyeUNvZGUocE1hYywgY291bnRyeUNvZGUpOworfQorCisKK3ZvaWQgY3NyUmVzZXRDb3VudHJ5SW5mb3JtYXRpb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfQk9PTEVBTiBmRm9yY2UgKQoreworICAgIGlmKCBmRm9yY2UgfHwgKGNzcklzMTFkU3VwcG9ydGVkKCBwTWFjICkgJiYgKCFwTWFjLT5zY2FuLmYxMWRJbmZvUmVzZXQpKSkKKyAgICB7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorICAgIHsKKyAgICAgICAgdm9zX2xvZ184MDJfMTFkX3BrdF90eXBlICpwMTFkTG9nOworICAgICAgICBpbnQgSW5kZXg7CisKKyAgICAgICAgV0xBTl9WT1NfRElBR19MT0dfQUxMT0MocDExZExvZywgdm9zX2xvZ184MDJfMTFkX3BrdF90eXBlLCBMT0dfV0xBTl84MDIxMURfQyk7CisgICAgICAgIGlmKHAxMWRMb2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxMWRMb2ctPmV2ZW50SWQgPSBXTEFOXzgwMjExRF9FVkVOVF9SRVNFVDsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcDExZExvZy0+Y291bnRyeUNvZGUsIHBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LCAzKTsKKyAgICAgICAgICAgIHAxMWRMb2ctPm51bUNoYW5uZWwgPSBwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLm51bUNoYW5uZWxzOworICAgICAgICAgICAgaWYocDExZExvZy0+bnVtQ2hhbm5lbCA8PSBWT1NfTE9HX01BWF9OVU1fQ0hBTk5FTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHAxMWRMb2ctPkNoYW5uZWxzLCBwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLmNoYW5uZWxMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMTFkTG9nLT5udW1DaGFubmVsKTsKKyAgICAgICAgICAgICAgICBmb3IgKEluZGV4PTA7IEluZGV4IDwgcE1hYy0+c2Nhbi5iYXNlMjBNSHpDaGFubmVscy5udW1DaGFubmVsczsgSW5kZXgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHAxMWRMb2ctPlR4UHdyW0luZGV4XSA9IENTUl9ST0FNX01JTiggcE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZVtJbmRleF0ucHdyLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwMTFkTG9nLT5zdXBwb3J0TXVsdGlwbGVEb21haW4gPSBXTEFOXzgwMjExRF9ESVNBQkxFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYocE1hYy0+cm9hbS5jb25maWdQYXJhbS5mRW5mb3JjZURlZmF1bHREb21haW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcDExZExvZy0+c3VwcG9ydE11bHRpcGxlRG9tYWluID0gV0xBTl84MDIxMURfTk9UX1NVUFBPUlRfTVVMVElfRE9NQUlOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAxMWRMb2ctPnN1cHBvcnRNdWx0aXBsZURvbWFpbiA9IFdMQU5fODAyMTFEX1NVUFBPUlRfTVVMVElfRE9NQUlOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgV0xBTl9WT1NfRElBR19MT0dfUkVQT1JUKHAxMWRMb2cpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisKKyAgICAgICAgLy8gc3dpdGNoIHRvIHBhc3NpdmUgc2NhbnMgb25seSB3aGVuIDExZCBpcyBlbmFibGVkCisgICAgICAgIGlmKCBjc3JJczExZFN1cHBvcnRlZCggcE1hYyApICkKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+c2Nhbi5jdXJTY2FuVHlwZSA9IGVTSVJfUEFTU0lWRV9TQ0FOOworICAgICAgICB9CisgICAgICAgIGNzclNhdmVDaGFubmVsUG93ZXJGb3JCYW5kKHBNYWMsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgIGNzclNhdmVDaGFubmVsUG93ZXJGb3JCYW5kKHBNYWMsIGVBTklfQk9PTEVBTl9UUlVFKTsKKyAgICAgICAgLy8gLi4uIGFuZCBhcHBseSB0aGUgY2hhbm5lbCBsaXN0LCBwb3dlciBzZXR0aW5ncywgYW5kIHRoZSBjb3VudHJ5IGNvZGUuCisgICAgICAgIGNzckFwcGx5Q2hhbm5lbFBvd2VyQ291bnRyeUluZm8oIHBNYWMsICZwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzLCBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudCApOworICAgICAgICAvLyBjbGVhciB0aGUgMTFkIGNoYW5uZWwgbGlzdAorICAgICAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAmcE1hYy0+c2Nhbi5jaGFubmVsczExZCwgc2l6ZW9mKHBNYWMtPnNjYW4uY2hhbm5lbHMxMWQpICk7CisgICAgICAgIHBNYWMtPnNjYW4uZjExZEluZm9SZXNldCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICBwTWFjLT5zY2FuLmYxMWRJbmZvQXBwbGllZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworZUhhbFN0YXR1cyBjc3JSZXNldENvdW50cnlDb2RlSW5mb3JtYXRpb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9CT09MRUFOICpwZlJlc3RhcnROZWVkZWQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRBTklfQk9PTEVBTiBmUmVzdGFydCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKworICAgIC8vVXNlIHRoZSBDb3VudHJ5IGNvZGUgYW5kIGRvbWFpbiBmcm9tIEVFUFJPTQorICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnQsIHBNYWMtPnNjYW4uY291bnRyeUNvZGVEZWZhdWx0LCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworICAgIGNzclNldFJlZ3VsYXRvcnlEb21haW4ocE1hYywgcE1hYy0+c2Nhbi5kb21haW5JZEN1cnJlbnQsICZmUmVzdGFydCk7CisgICAgaWYoZUFOSV9CT09MRUFOX0ZBTFNFID09IGZSZXN0YXJ0IHx8IChwZlJlc3RhcnROZWVkZWQgPT0gTlVMTCkpCisgICAgeworICAgICAgICAvL09ubHkgcmVzZXQgdGhlIGNvdW50cnkgaW5mbyBpZiB3ZSBkb24ndCBuZWVkIHRvIHJlc3RhcnQKKyAgICAgICAgY3NyUmVzZXRDb3VudHJ5SW5mb3JtYXRpb24ocE1hYywgZUFOSV9CT09MRUFOX1RSVUUpOworICAgIH0KKyAgICBpZihwZlJlc3RhcnROZWVkZWQpCisgICAgeworICAgICAgICAqcGZSZXN0YXJ0TmVlZGVkID0gZlJlc3RhcnQ7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2V0Q291bnRyeUNvZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcENvdW50cnksIHRBTklfQk9PTEVBTiAqcGZSZXN0YXJ0TmVlZGVkKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgdl9SRUdET01BSU5fdCBkb21haW5JZDsKKworICAgIGlmKHBDb3VudHJ5KQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gY3NyR2V0UmVndWxhdG9yeURvbWFpbkZvckNvdW50cnkocE1hYywgcENvdW50cnksICZkb21haW5JZCk7CisgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JTZXRSZWd1bGF0b3J5RG9tYWluKHBNYWMsIGRvbWFpbklkLCBwZlJlc3RhcnROZWVkZWQpOworICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9XZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZFbmZvcmNlRGVmYXVsdERvbWFpbiBmbGFnIGhlcmUsCisgICAgICAgICAgICAgICAgLy9jc3JTZXRSZWd1bGF0b3J5RG9tYWluIHdpbGwgZmFpbCBpZiB0aGUgY291bnRyeSBkb2Vzbid0IGZpdCBvdXIgZG9tYWluIGNyaXRlcmlhLgorICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnQsIHBDb3VudHJ5LCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworICAgICAgICAgICAgICAgIGlmKChwZlJlc3RhcnROZWVkZWQgPT0gTlVMTCkgfHwgISgqcGZSZXN0YXJ0TmVlZGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vU2ltcGx5IHNldCBpdCB0byBjZmcuIElmIHdlIG5lZWQgdG8gcmVzdGFydCwgcmVzdGFydCB3aWxsIGFwcGx5IGl0IHRvIHRoZSBDRkcKKyAgICAgICAgICAgICAgICAgICAgY3NyU2V0Q2ZnQ291bnRyeUNvZGUocE1hYywgcENvdW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisKKy8vY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBOdW1DaG4gYW5kIHBDaG5Qb3dlckluZm8KKy8vQXMgaW5wdXQsICpwTnVtQ2huIGhhcyB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgb2YgcENoblBvd2VySW5mbworLy9VcG9uIHJldHVybiwgKnBOdW1DaG4gaGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXNzaWduZWQuCit2b2lkIGNzckdldENoYW5uZWxQb3dlckluZm8oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREYmxMaW5rTGlzdCAqcExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwTnVtQ2huLCB0Q2hhbm5lbExpc3RXaXRoUG93ZXIgKnBDaG5Qb3dlckluZm8pCit7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdEFOSV9VMzIgY2huSWR4ID0gMCwgaWR4OworICAgIHRDc3JDaGFubmVsUG93ZXJJbmZvICpwQ2hhbm5lbFNldDsKKworICAgIC8vR2V0IDIuNEdoeiBmaXJzdAorICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoIHBMaXN0LCBMTF9BQ0NFU1NfTE9DSyApOworICAgIHdoaWxlKCBwRW50cnkgJiYgKGNobklkeCA8ICpwTnVtQ2huKSApCisgICAgeworICAgICAgICBwQ2hhbm5lbFNldCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdENzckNoYW5uZWxQb3dlckluZm8sIGxpbmsgKTsKKyAgICAgICAgaWYgKCAxICE9IHBDaGFubmVsU2V0LT5pbnRlckNoYW5uZWxPZmZzZXQgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGlkeCA9IDA7IChpZHggPCBwQ2hhbm5lbFNldC0+bnVtQ2hhbm5lbHMpICYmIChjaG5JZHggPCAqcE51bUNobik7IGlkeCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2huUG93ZXJJbmZvW2NobklkeF0uY2hhbklkID0gKHRBTklfVTgpKHBDaGFubmVsU2V0LT5maXJzdENoYW5uZWwgKyAoIGlkeCAqIHBDaGFubmVsU2V0LT5pbnRlckNoYW5uZWxPZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgcENoblBvd2VySW5mb1tjaG5JZHgrK10ucHdyID0gcENoYW5uZWxTZXQtPnR4UG93ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGlkeCA9IDA7IChpZHggPCBwQ2hhbm5lbFNldC0+bnVtQ2hhbm5lbHMpICYmIChjaG5JZHggPCAqcE51bUNobik7IGlkeCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2huUG93ZXJJbmZvW2NobklkeF0uY2hhbklkID0gKHRBTklfVTgpKHBDaGFubmVsU2V0LT5maXJzdENoYW5uZWwgKyBpZHgpOworICAgICAgICAgICAgICAgIHBDaG5Qb3dlckluZm9bY2huSWR4KytdLnB3ciA9IHBDaGFubmVsU2V0LT50eFBvd2VyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCBwTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTE9DSyApOworICAgIH0KKyAgICAqcE51bUNobiA9IGNobklkeDsKKworICAgIHJldHVybiA7Cit9CisKKworCit2b2lkIGNzckFwcGx5Q291bnRyeUluZm9ybWF0aW9uKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX0JPT0xFQU4gZkZvcmNlICkKK3sKKyAgICB2X1JFR0RPTUFJTl90IGRvbWFpbklkOworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiggIWNzcklzMTFkU3VwcG9ydGVkKCBwTWFjICkgfHwgMCA9PSBwTWFjLT5zY2FuLmNoYW5uZWxPZjExZEluZm8pIGJyZWFrOworICAgICAgICBpZiggcE1hYy0+c2Nhbi5mQW1iaWd1b3VzMTFkSW5mb0ZvdW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gYW1iaWd1b3VzIGluZm8gZm91bmQKKyAgICAgICAgICAgIC8vUmVzdG9yZSB0ZSBkZWZhdWx0IGRvbWFpbiBhcyB3ZWxsCisgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UmVndWxhdG9yeURvbWFpbkZvckNvdW50cnkoIHBNYWMsIHBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LCAmZG9tYWluSWQgKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5kb21haW5JZEN1cnJlbnQgPSBkb21haW5JZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBmYWlsZWQgdG8gZ2V0IGRvbWFpbiBmcm9tIGN1cnJlbnRDb3VudHJ5Q29kZSAlMDJYJTAyWFxuIiksIAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5zY2FuLmNvdW50cnlDb2RlQ3VycmVudFswXSwgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnRbMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3NyUmVzZXRDb3VudHJ5SW5mb3JtYXRpb24oIHBNYWMsIGVBTklfQk9PTEVBTl9GQUxTRSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBwTWFjLT5zY2FuLmYxMWRJbmZvQXBwbGllZCAmJiAhZkZvcmNlICkgYnJlYWs7CisgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRSZWd1bGF0b3J5RG9tYWluRm9yQ291bnRyeSggcE1hYywgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZTExZCwgJmRvbWFpbklkICkpKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBlbmZvcmNlIGRlZmF1bHQgZG9tYWluCisgICAgICAgICAgICBpZiggKCAhcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mRW5mb3JjZURlZmF1bHREb21haW4gKSB8fAorICAgICAgICAgICAgICAgIChwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCA9PSBkb21haW5JZCkgKQorICAgICAgICAgICAgeworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZvc19sb2dfODAyXzExZF9wa3RfdHlwZSAqcDExZExvZzsKKyAgICAgICAgICAgICAgICAgICAgdENoYW5uZWxMaXN0V2l0aFBvd2VyIGNoblB3ckluZm9bV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOXTsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkNobkluZm8gPSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4sIG5UbXA7CisKKyAgICAgICAgICAgICAgICAgICAgV0xBTl9WT1NfRElBR19MT0dfQUxMT0MocDExZExvZywgdm9zX2xvZ184MDJfMTFkX3BrdF90eXBlLCBMT0dfV0xBTl84MDIxMURfQyk7CisgICAgICAgICAgICAgICAgICAgIGlmKHAxMWRMb2cpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAxMWRMb2ctPmV2ZW50SWQgPSBXTEFOXzgwMjExRF9FVkVOVF9DT1VOVFJZX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcDExZExvZy0+Y291bnRyeUNvZGUsIHBNYWMtPnNjYW4uY291bnRyeUNvZGUxMWQsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgcDExZExvZy0+bnVtQ2hhbm5lbCA9IHBNYWMtPnNjYW4uY2hhbm5lbHMxMWQubnVtQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwMTFkTG9nLT5udW1DaGFubmVsIDw9IFZPU19MT0dfTUFYX05VTV9DSEFOTkVMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcDExZExvZy0+Q2hhbm5lbHMsIHBNYWMtPnNjYW4uY2hhbm5lbHMxMWQuY2hhbm5lbExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAxMWRMb2ctPm51bUNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzckdldENoYW5uZWxQb3dlckluZm8ocE1hYywgJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3QyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbkNobkluZm8sIGNoblB3ckluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5UbXAgPSBuQ2huSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2huSW5mbyA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTiAtIG5UbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyR2V0Q2hhbm5lbFBvd2VySW5mbyhwTWFjLCAmcE1hYy0+c2Nhbi5jaGFubmVsUG93ZXJJbmZvTGlzdDVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuQ2huSW5mbywgJmNoblB3ckluZm9bblRtcF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihuVG1wID0gMDsgblRtcCA8IHAxMWRMb2ctPm51bUNoYW5uZWw7IG5UbXArKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihuQ2huSW5mbyA9IDA7IG5DaG5JbmZvIDwgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOOyBuQ2huSW5mbysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwMTFkTG9nLT5DaGFubmVsc1tuVG1wXSA9PSBjaG5Qd3JJbmZvW25DaG5JbmZvXS5jaGFuSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDExZExvZy0+VHhQd3JbblRtcF0gPSBjaG5Qd3JJbmZvW25DaG5JbmZvXS5wd3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZighcE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAxMWRMb2ctPnN1cHBvcnRNdWx0aXBsZURvbWFpbiA9IFdMQU5fODAyMTFEX0RJU0FCTEVEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZFbmZvcmNlRGVmYXVsdERvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMTFkTG9nLT5zdXBwb3J0TXVsdGlwbGVEb21haW4gPSBXTEFOXzgwMjExRF9OT1RfU1VQUE9SVF9NVUxUSV9ET01BSU47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDExZExvZy0+c3VwcG9ydE11bHRpcGxlRG9tYWluID0gV0xBTl84MDIxMURfU1VQUE9SVF9NVUxUSV9ET01BSU47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19SRVBPUlQocDExZExvZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8jaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKyAgICAgICAgICAgICAgICBpZihwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCAhPSBkb21haW5JZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgLyogUmVndWxhdG9yeSBEb21haW4gQ2hhbmdlZCwgUHVyZ2UgT25seSBzY2FuIHJlc3VsdCAKKyAgICAgICAgICAgICAgICAgICAgKiB3aGljaCBkb2VzIG5vdCBoYXZlIGNoYW5uZWwgbnVtYmVyIGJlbG9uZyB0byAxMWQgCisgICAgICAgICAgICAgICAgICAgICogY2hhbm5lbCBsaXN0CisgICAgICAgICAgICAgICAgICAgICogKi8KKyAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIkRvbWFpbiBDaGFuZ2VkIE9sZCAlZCwgbmV3ICVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4uZG9tYWluSWRDdXJyZW50LCBkb21haW5JZCk7CisgICAgICAgICAgICAgICAgICAgY3NyU2NhbkZpbHRlcjExZFJlc3VsdChwTWFjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gV0RBX1NldFJlZ0RvbWFpbihwTWFjLCBkb21haW5JZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiICBmYWlsIHRvIHNldCByZWdJZCAlZFxuIiksIGRvbWFpbklkICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4uZG9tYWluSWRDdXJyZW50ID0gZG9tYWluSWQ7CisgICAgICAgICAgICAgICAgY3NyQXBwbHlDaGFubmVsUG93ZXJDb3VudHJ5SW5mbyggcE1hYywgJnBNYWMtPnNjYW4uY2hhbm5lbHMxMWQsIHBNYWMtPnNjYW4uY291bnRyeUNvZGUxMWQgKTsKKyAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gYWN0aXZlIHNjYW5zIHVzaW5nIHRoaXMgbmV3IGNoYW5uZWwgbGlzdAorICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4uY3VyU2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4uZjExZEluZm9BcHBsaWVkID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5mMTFkSW5mb1Jlc2V0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICByZXR1cm47Cit9CisKKworCit0QU5JX0JPT0xFQU4gY3NyU2F2ZTExZENvdW50cnlTdHJpbmcoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBDb3VudHJ5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgIHRBTklfQk9PTEVBTiBmRm9yY2UpCit7CisgICAgdEFOSV9CT09MRUFOIGZDb3VudHJ5U3RyaW5nQ2hhbmdlZCA9IEZBTFNFLCBmVW5rbm93bkNvdW50cnlDb2RlID0gRkFMU0U7CisgICAgdEFOSV9VMzIgaTsKKworICAgIC8vIGNvbnZlcnQgdG8gVVBQRVIgaGVyZSBzbyB3ZSBhcmUgYXNzdXJlZCB0aGUgc3RyaW5ncyBhcmUgYWx3YXlzIGluIHVwcGVyIGNhc2UuCisgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgeworICAgICAgICBwQ291bnRyeUNvZGVbIGkgXSA9ICh0QU5JX1U4KWNzclRvVXBwZXIoIHBDb3VudHJ5Q29kZVsgaSBdICk7CisgICAgfQorCisgICAgLy8gU29tZSBvZiB0aGUgJ29sZCcgQ2lzY28gMzUwIHNlcmllcyBBUCdzIGFkdmVydGlzZSBOQSBhcyB0aGUgY291bnRyeSBjb2RlIChmb3IgTm9ydGggQW1lcmljYSA/PykuCisgICAgLy8gTkEgaXMgbm90IGEgdmFsaWQgY291bnRyeSBjb2RlIG9yIGRvbWFpbiBzbyBsZXQncyBhbGxvdyB0aGlzIGJ5IGNoYW5naW5nIGl0IHRvIHRoZSBwcm9wZXIKKyAgICAvLyBjb3VudHJ5IGNvZGUgKHdoaWNoIGlzIFVTKS4gIFdlJ3ZlIGFsc28gc2VlbiBzb21lIE5FVEdFQVIgQVAncyB0aGF0IGhhdmUgIlhYICIgYXMgdGhlIGNvdW50cnkgY29kZQorICAgIC8vIHdpdGggdmFsaWQgMi40IEdIeiBVUyBjaGFubmVsIGluZm9ybWF0aW9uLiAgSWYgd2UgY2Fubm90IGZpbmQgdGhlIGNvdW50cnkgY29kZSBhZHZlcnRpc2VkIGluIHRoZQorICAgIC8vIDExZCBpbmZvcm1hdGlvbiBlbGVtZW50LCBsZXQncyBkZWZhdWx0IHRvIFVTLgorICAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRSZWd1bGF0b3J5RG9tYWluRm9yQ291bnRyeSggcE1hYywgcENvdW50cnlDb2RlLCBOVUxMICkgKSApCisgICAgeworICAgICAgICAvLyBDaGVjayB0aGUgZW5mb3JjZW1lbnQgZmlyc3QKKyAgICAgICAgaWYoIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZkVuZm9yY2VEZWZhdWx0RG9tYWluIHx8IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZkVuZm9yY2VDb3VudHJ5Q29kZU1hdGNoICkKKyAgICAgICAgeworICAgICAgICAgICAgZlVua25vd25Db3VudHJ5Q29kZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQ291bnRyeUNvZGVbIDAgXSA9ICdVJzsKKyAgICAgICAgICAgIHBDb3VudHJ5Q29kZVsgMSBdID0gJ1MnOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UndmUgc2VlbiBzb21lIG9mIHRoZSBBUCdzIGltcHJvcGVybHkgcHV0IGEgMCBmb3IgdGhlIHRoaXJkIGNoYXJhY3RlciBvZiB0aGUgY291bnRyeSBjb2RlLgorICAgIC8vIHNwZWMgc2F5cyB2YWxpZCBjaGFyY3RlcnMgYXJlICdPJyAoZm9yIG91dGRvb3IpLCAnSScgZm9yIEluZG9vciwgb3IgJyAnIChzcGFjZTsgZm9yIGVpdGhlcikuCisgICAgLy8gaWYgd2Ugc2VlIGEgMCBpbiB0aGlzIHRoaXJkIGNoYXJhY3RlciwgbGV0J3MgY2hhbmdlIGl0IHRvIGEgJyAnLgorICAgIGlmICggMCA9PSBwQ291bnRyeUNvZGVbIDIgXSApCisgICAgeworICAgICAgICBwQ291bnRyeUNvZGVbIDIgXSA9ICcgJzsKKyAgICB9CisKKyAgICBpZiggIWZVbmtub3duQ291bnRyeUNvZGUgKQorICAgIHsKKyAgICAgICAgZkNvdW50cnlTdHJpbmdDaGFuZ2VkID0gKCFwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwKKyAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZTExZCwgcENvdW50cnlDb2RlLCAyKSk7CisKKworICAgICAgICBpZigoIDAgPT0gcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZTExZFsgMCBdICYmIDAgPT0gcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZTExZFsgMSBdICkKKyAgICAgICAgICAgICB8fCAoZkZvcmNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgZmlyc3QgLjExZCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZTExZCwgcENvdW50cnlDb2RlLCBzaXplb2YoIHBNYWMtPnNjYW4uY291bnRyeUNvZGUxMWQgKSApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKCBmQ291bnRyeVN0cmluZ0NoYW5nZWQgKTsKK30KKworCit2b2lkIGNzclNhdmVDaGFubmVsUG93ZXJGb3JCYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX0JPT0xFQU4gZlBvcHVsYXRlNUdCYW5kICkKK3sKKyAgICB0QU5JX1UzMiBJbmRleCwgY291bnQ9MDsKKyAgICB0U2lyTWFjQ2hhbkluZm8gKnBDaGFuSW5mbzsKKyAgICB0U2lyTWFjQ2hhbkluZm8gKnBDaGFuSW5mb1N0YXJ0OworCisgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQ2hhbkluZm8sIHNpemVvZih0U2lyTWFjQ2hhbkluZm8pICogV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOKSkpCisgICAgeworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBDaGFuSW5mbywgc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbykgKiBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pOworICAgICAgICBwQ2hhbkluZm9TdGFydCA9IHBDaGFuSW5mbzsKKyAgICAgICAgZm9yIChJbmRleD0wOyBJbmRleCA8IHBNYWMtPnNjYW4uYmFzZTIwTUh6Q2hhbm5lbHMubnVtQ2hhbm5lbHM7IEluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZlBvcHVsYXRlNUdCYW5kICYmIChDU1JfSVNfQ0hBTk5FTF81R0haKHBNYWMtPnNjYW4uZGVmYXVsdFBvd2VyVGFibGVbSW5kZXhdLmNoYW5JZCkpKSB8fAorICAgICAgICAgICAgICAgICghZlBvcHVsYXRlNUdCYW5kICYmIChDU1JfSVNfQ0hBTk5FTF8yNEdIWihwTWFjLT5zY2FuLmRlZmF1bHRQb3dlclRhYmxlW0luZGV4XS5jaGFuSWQpKSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDaGFuSW5mby0+Zmlyc3RDaGFuTnVtID0gcE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZVtJbmRleF0uY2hhbklkOworICAgICAgICAgICAgICAgIHBDaGFuSW5mby0+bnVtQ2hhbm5lbHMgID0gMTsKKyAgICAgICAgICAgICAgICBwQ2hhbkluZm8tPm1heFR4UG93ZXIgICA9IENTUl9ST0FNX01JTiggcE1hYy0+c2Nhbi5kZWZhdWx0UG93ZXJUYWJsZVtJbmRleF0ucHdyLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5UeFBvd2VyQ2FwICk7CisgICAgICAgICAgICAgICAgcENoYW5JbmZvKys7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyU2F2ZVRvQ2hhbm5lbFBvd2VyMkdfNUcoIHBNYWMsIGNvdW50ICogc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbyksIHBDaGFuSW5mb1N0YXJ0ICk7CisgICAgICAgIH0KKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQ2hhbkluZm9TdGFydCk7CisgICAgfQorfQorCisKK3ZvaWQgY3NyU2V0T3Bwb3NpdGVCYW5kQ2hhbm5lbEluZm8oIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIHRBTklfQk9PTEVBTiBmUG9wdWxhdGU1R0JhbmQgPSBGQUxTRTsKKworICAgIGRvIAorICAgIHsKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgYSBkdWFsIGJhbmQgcHJvZHVjdCwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgb3Bwb3NpdGUKKyAgICAgICAgLy8gYmFuZCBpbmZvLiAgV2Ugb25seSB3b3JrIGluIG9uZSBiYW5kIHNvIG5vIG5lZWQgdG8gbG9vayBpbiB0aGUgb3RoZXIgYmFuZC4KKyAgICAgICAgaWYgKCAhQ1NSX0lTX09QRUFSVElOR19EVUFMX0JBTkQoIHBNYWMgKSApIGJyZWFrOworICAgICAgICAvLyBpZiB3ZSBmb3VuZCBjaGFubmVsIGluZm8gb24gdGhlIDUuMCBiYW5kIGFuZC4uLgorICAgICAgICBpZiAoIENTUl9JU19DSEFOTkVMXzVHSFooIHBNYWMtPnNjYW4uY2hhbm5lbE9mMTFkSW5mbyApICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gYW5kIHRoZSAyLjQgYmFuZCBpcyBlbXB0eSwgdGhlbiBwb3B1bGF0ZSB0aGUgMi40IGNoYW5uZWwgaW5mbworICAgICAgICAgICAgaWYgKCAhY3NyTExJc0xpc3RFbXB0eSggJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3QyNCwgTExfQUNDRVNTX0xPQ0sgKSApIGJyZWFrOworICAgICAgICAgICAgZlBvcHVsYXRlNUdCYW5kID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBlbHNlLCB3ZSBmb3VuZCBjaGFubmVsIGluZm8gaW4gdGhlIDIuNCBHSHogYmFuZC4gIElmIHRoZSA1LjAgYmFuZCBpcyBlbXB0eQorICAgICAgICAgICAgLy8gc2V0IHRoZSA1LjAgYmFuZCBpbmZvIGZyb20gdGhlIDIuNCBjb3VudHJ5IGNvZGUuCisgICAgICAgICAgICBpZiAoICFjc3JMTElzTGlzdEVtcHR5KCAmcE1hYy0+c2Nhbi5jaGFubmVsUG93ZXJJbmZvTGlzdDVHLCBMTF9BQ0NFU1NfTE9DSyApICkgYnJlYWs7CisgICAgICAgICAgICBmUG9wdWxhdGU1R0JhbmQgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIGNzclNhdmVDaGFubmVsUG93ZXJGb3JCYW5kKCBwTWFjLCBmUG9wdWxhdGU1R0JhbmQgKTsKKworICAgIH0gd2hpbGUoIDAgKTsKK30KKworCit0QU5JX0JPT0xFQU4gY3NySXNTdXBwb3J0ZWRDaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY2hhbm5lbElkKQoreworICAgIHRBTklfQk9PTEVBTiBmUmV0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHRBTklfVTMyIGk7CisKKyAgICAvL01ha2Ugc3VyZSBpdCBpcyBhIGNoYW5uZWwgdGhhdCBpcyBpbiBvdXIgc3VwcG9ydGVkIGxpc3QuCisgICAgZm9yICggaSA9IDA7IGkgPCBwTWFjLT5zY2FuLmJhc2VDaGFubmVscy5udW1DaGFubmVsczsgaSsrICkKKyAgICB7CisgICAgICAgIGlmICggY2hhbm5lbElkID09IHBNYWMtPnNjYW4uYmFzZUNoYW5uZWxzLmNoYW5uZWxMaXN0W2ldICkKKyAgICAgICAgeworICAgICAgICAgICAgZlJldCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL0lmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gbGltaXQgYSBzZXQgb2YgdGhlIGNoYW5uZWxzCisgICAgaWYoIGZSZXQgJiYgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mRW5mb3JjZTExZENoYW5uZWxzICkKKyAgICB7CisgICAgICAgIGZSZXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcE1hYy0+c2Nhbi5iYXNlMjBNSHpDaGFubmVscy5udW1DaGFubmVsczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBjaGFubmVsSWQgPT0gcE1hYy0+c2Nhbi5iYXNlMjBNSHpDaGFubmVscy5jaGFubmVsTGlzdFtpXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZlJldCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChmUmV0KTsKK30KKworCisKKy8vYlNpemUgc3BlY2lmeSB0aGUgYnVmZmVyIHNpemUgb2YgcENoYW5uZWxMaXN0Cit0QU5JX1U4IGNzckdldENoYW5uZWxMaXN0RnJvbUNoYW5uZWxTZXQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBDaGFubmVsTGlzdCwgdEFOSV9VOCBiU2l6ZSwgdENzckNoYW5uZWxQb3dlckluZm8gKnBDaGFubmVsU2V0ICkKK3sKKyAgICB0QU5JX1U4IGksIGogPSAwLCBjaG5JZDsKKworICAgIGJTaXplID0gQ1NSX01JTihiU2l6ZSwgcENoYW5uZWxTZXQtPm51bUNoYW5uZWxzKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgYlNpemU7IGkrKyApCisgICAgeworICAgICAgICBjaG5JZCA9ICh0QU5JX1U4KShwQ2hhbm5lbFNldC0+Zmlyc3RDaGFubmVsICsgKCBpICogcENoYW5uZWxTZXQtPmludGVyQ2hhbm5lbE9mZnNldCApKTsKKyAgICAgICAgaWYgKCBjc3JJc1N1cHBvcnRlZENoYW5uZWwoIHBNYWMsIGNobklkICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwQ2hhbm5lbExpc3RbaisrXSA9IGNobklkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChqKTsKK30KKworCisKKy8vYlNpemUgLS0gc3BlY2lmeSB0aGUgYnVmZmVyIHNpemUgb2YgcENoYW5uZWxMaXN0Cit2b2lkIGNzckNvbnN0cnVjdEN1cnJlbnRWYWxpZENoYW5uZWxMaXN0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0RGJsTGlua0xpc3QgKnBDaGFubmVsU2V0TGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBDaGFubmVsTGlzdCwgdEFOSV9VOCBiU2l6ZSwgdEFOSV9VOCAqcE51bUNoYW5uZWxzICkKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0Q3NyQ2hhbm5lbFBvd2VySW5mbyAqcENoYW5uZWxTZXQ7CisgICAgdEFOSV9VOCBudW1DaGFubmVsczsKKyAgICB0QU5JX1U4ICpwQ2hhbm5lbHM7CisKKyAgICBpZiggcENoYW5uZWxTZXRMaXN0ICYmIHBDaGFubmVsTGlzdCAmJiBwTnVtQ2hhbm5lbHMgKQorICAgIHsKKyAgICAgICAgcENoYW5uZWxzID0gcENoYW5uZWxMaXN0OworICAgICAgICAqcE51bUNoYW5uZWxzID0gMDsKKyAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggcENoYW5uZWxTZXRMaXN0LCBMTF9BQ0NFU1NfTE9DSyApOworICAgICAgICB3aGlsZSggcEVudHJ5ICkKKyAgICAgICAgeworICAgICAgICAgICAgcENoYW5uZWxTZXQgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JDaGFubmVsUG93ZXJJbmZvLCBsaW5rICk7CisgICAgICAgICAgICBudW1DaGFubmVscyA9IGNzckdldENoYW5uZWxMaXN0RnJvbUNoYW5uZWxTZXQoIHBNYWMsIHBDaGFubmVscywgYlNpemUsIHBDaGFubmVsU2V0ICk7CisgICAgICAgICAgICBwQ2hhbm5lbHMgKz0gbnVtQ2hhbm5lbHM7CisgICAgICAgICAgICAqcE51bUNoYW5uZWxzICs9IG51bUNoYW5uZWxzOworICAgICAgICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCBwQ2hhbm5lbFNldExpc3QsIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKgorICAqIDgwMi4xMUQgb25seTogR2F0aGVyIDExZCBJRSB2aWEgYmVhY29uIG9yIFByb2JlIHJlc3BvbnNlIGFuZCBzdG9yZSB0aGVtIGluIHBBZGFwdGVyLT5jaGFubmVsczExZAorKi8KK3RBTklfQk9PTEVBTiBjc3JMZWFybkNvdW50cnlJbmZvcm1hdGlvbiggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywgdEFOSV9CT09MRUFOIGZGb3JjZSkKK3sKKyAgICB0QU5JX1U4IE51bTJHQ2hhbm5lbHMsIGJNYXhOdW1DaG47CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdEFOSV9CT09MRUFOIGZSZXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdl9SRUdET01BSU5fdCBkb21haW5JZDsKKyAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzTG9jYWwgPSBwSWVzOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmIChWT1NfU1RBX1NBUF9NT0RFID09IHZvc19nZXRfY29ucGFyYW0gKCkpCisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworI2VuZGlmCisKKyAgICBkbworICAgIHsKKyAgICAgICAgLy8gY2hlY2sgaWYgLjExZCBzdXBwb3J0IGlzIGVuYWJsZWQKKyAgICAgICAgaWYoICFjc3JJczExZFN1cHBvcnRlZCggcE1hYyApICkgYnJlYWs7CisgICAgICAgIGlmKCAhcEllc0xvY2FsICYmICghSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsIHBTaXJCc3NEZXNjLCAmcEllc0xvY2FsKSkpICkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgaWYgY291bnRyeSBpbmZvcm1hdGlvbiBlbGVtZW50IGlzIHByZXNlbnQKKyAgICAgICAgaWYoIXBJZXNMb2NhbC0+Q291bnRyeS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICAvL05vIGNvdW50cnkgaW5mbworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggY3NyU2F2ZTExZENvdW50cnlTdHJpbmcoIHBNYWMsIHBJZXNMb2NhbC0+Q291bnRyeS5jb3VudHJ5LCBmRm9yY2UgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvdW50cnkgc3RyaW5nIGNoYW5nZWQsIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKyAgICAgICAgICAgIC8vTmVlZCB0byBjaGVjayB3aGV0aGVyIHdlIGNhcmUgYWJvdXQgdGhpcyBCU1MnIGRvbWFpbiBpbmZvCisgICAgICAgICAgICAvL0lmIGl0IGRvZXNuJ3QgbWF0Y2ggb2YgdGhlIGNvbm5lY3RlZCBwcm9maWxlIG9yIHJvYW1pbmcgcHJvZmlsZSwgbGV0J3MgaWdub3JlIGl0CisgICAgICAgICAgICB0QU5JX1UzMiBpOworICAgICAgICAgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgaSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBpICk7CisgICAgICAgICAgICAgICAgICAgIGlmKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyIGZpbHRlcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmZmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1QcmVwYXJlRmlsdGVyRnJvbVByb2ZpbGUocE1hYywgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSwgJmZpbHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX0JPT0xFQU4gZk1hdGNoID0gY3NyTWF0Y2hCU1MocE1hYywgcFNpckJzc0Rlc2MsICZmaWx0ZXIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRnJlZSB0aGUgcmVzb3VyY2UgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JGcmVlU2NhbkZpbHRlciggcE1hYywgJmZpbHRlciApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZNYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiICAgTWF0Y2hpbmcgcm9hbSBwcm9maWxlIEJTU0lEICUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYIGNhdXNpbmcgYW1iaWd1b3VzIGRvbWFpbiBpbmZvXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpckJzc0Rlc2MtPmJzc0lkWzBdLCBwU2lyQnNzRGVzYy0+YnNzSWRbMV0sIHBTaXJCc3NEZXNjLT5ic3NJZFsyXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2lyQnNzRGVzYy0+YnNzSWRbM10sIHBTaXJCc3NEZXNjLT5ic3NJZFs0XSwgcFNpckJzc0Rlc2MtPmJzc0lkWzVdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5mQW1iaWd1b3VzMTFkSW5mb0ZvdW5kID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZChwTWFjLCBpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWFjaCBoZXJlIG9ubHkgd2hlbiB0aGUgY3VycmVudGlvbiBpcyBiYXNlIG9uIG5vIHByb2ZpbGUuIAorICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc2VyIGRvZXNuJ3QgZ2l2ZSBwcm9maWxlIGFuZCBqdXN0IGNvbm5lY3QgdG8gYW55dGhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBpZihjc3JNYXRjaEJTU1RvQ29ubmVjdFByb2ZpbGUocE1hYywgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLCBwU2lyQnNzRGVzYywgcEllc0xvY2FsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIiAgIE1hdGNoaW5nIGNvbm5lY3QgcHJvZmlsZSBCU1NJRCAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWCBjYXVzaW5nIGFtYmlndW91cyBkb21haW4gaW5mb1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpckJzc0Rlc2MtPmJzc0lkWzBdLCBwU2lyQnNzRGVzYy0+YnNzSWRbMV0sIHBTaXJCc3NEZXNjLT5ic3NJZFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpckJzc0Rlc2MtPmJzc0lkWzNdLCBwU2lyQnNzRGVzYy0+YnNzSWRbNF0sIHBTaXJCc3NEZXNjLT5ic3NJZFs1XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UdXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5mQW1iaWd1b3VzMTFkSW5mb0ZvdW5kID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3NySXNCc3NpZE1hdGNoKHBNYWMsICh0Q3NyQnNzaWQgKikmcFNpckJzc0Rlc2MtPmJzc0lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0FQIGNoYW5nZWQgdGhlIDExZCBpbmZvIG9uIHRoZSBmbHksIG1vZGlmeSBjZmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5mQW1iaWd1b3VzMTFkSW5mb0ZvdW5kID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmV0ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvL3ZhbGlkIHNlc3Npb24KKyAgICAgICAgICAgIH0gLy9mb3IKKyAgICAgICAgICAgIGlmICggaSA9PSBDU1JfUk9BTV9TRVNTSU9OX01BWCApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vQ2hlY2sgd2hldGhlciB3ZSBjYW4gdXNlIHRoaXMgY291bnRyeSdzIDExZCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGlmKCAhcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mRW5mb3JjZURlZmF1bHREb21haW4gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5mQW1iaWd1b3VzMTFkSW5mb0ZvdW5kID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKCBwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCA9PSBwTWFjLT5zY2FuLmRvbWFpbklkRGVmYXVsdCApOworICAgICAgICAgICAgICAgICAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldFJlZ3VsYXRvcnlEb21haW5Gb3JDb3VudHJ5KCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYywgcEllc0xvY2FsLT5Db3VudHJ5LmNvdW50cnksICZkb21haW5JZCApKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGRvbWFpbklkID09IHBNYWMtPnNjYW4uZG9tYWluSWRDdXJyZW50ICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1R3byBjb3VudHJpZXMgaW4gdGhlIHNhbWUgZG9tYWluCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvL1R1c2gKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+c2Nhbi5mQ3VycmVudDExZEluZm9NYXRjaCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgLy9JbiBjYXNlIHRoYXQgc29tZSBjaGFubmVscyBpbiA1R0h6IGhhdmUgdGhlIHNhbWUgY2hhbm5lbCBudW1iZXIgYXMgMi40R0h6ICg8PSAxNCkKKyAgICAgICAgaWYoQ1NSX0lTX0NIQU5ORUxfNUdIWihwU2lyQnNzRGVzYy0+Y2hhbm5lbElkKSkKKyAgICAgICAgeworICAgICAgICAgICAgdEFOSV9VOCBpQzsKKyAgICAgICAgICAgIHRTaXJNYWNDaGFuSW5mbyogcE1hY0NoblNldCA9ICh0U2lyTWFjQ2hhbkluZm8gKikoJnBJZXNMb2NhbC0+Q291bnRyeS50cmlwbGV0c1swXSk7CisKKyAgICAgICAgICAgIGZvcihpQyA9IDA7IGlDIDwgcEllc0xvY2FsLT5Db3VudHJ5Lm51bV90cmlwbGV0czsgaUMrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihDU1JfSVNfQ0hBTk5FTF8yNEdIWihwTWFjQ2huU2V0W2lDXS5maXJzdENoYW5OdW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE1hY0NoblNldFtpQ10uZmlyc3RDaGFuTnVtICs9IDIwMDsgLy8qKiogV2hlcmUgaXMgdGhpcyAyMDAgZGVmaW5lZD8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgICVkIHNldHMgZWFjaCBvbmUgaXMgJWRcbiIpLCBwSWVzTG9jYWwtPkNvdW50cnkubnVtX3RyaXBsZXRzLCBzaXplb2YodFNpck1hY0NoYW5JbmZvKSk7CisgICAgICAgIC8vIHNhdmUgdGhlIGNoYW5uZWwvcG93ZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgQ2hhbm5lbCBJRS4KKyAgICAgICAgLy9zaXplb2YodFNpck1hY0NoYW5JbmZvKSBoYXMgdG8gYmUgMworICAgICAgICBjc3JTYXZlVG9DaGFubmVsUG93ZXIyR181RyggcE1hYywgcEllc0xvY2FsLT5Db3VudHJ5Lm51bV90cmlwbGV0cyAqIHNpemVvZih0U2lyTWFjQ2hhbkluZm8pLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodFNpck1hY0NoYW5JbmZvICopKCZwSWVzTG9jYWwtPkNvdW50cnkudHJpcGxldHNbMF0pICk7CisgICAgICAgIC8vIHNldCB0aGUgaW5kaWNhdG9yIG9mIHRoZSBjaGFubmVsIHdoZXJlIHRoZSBjb3VudHJ5IElFIHdhcyBmb3VuZC4uLgorICAgICAgICBwTWFjLT5zY2FuLmNoYW5uZWxPZjExZEluZm8gPSBwU2lyQnNzRGVzYy0+Y2hhbm5lbElkOworICAgICAgICAvLyBQb3B1bGF0ZSBib3RoIGJhbmQgY2hhbm5lbCBsaXN0cyBiYXNlZCBvbiB3aGF0IHdlIGZvdW5kIGluIHRoZSBjb3VudHJ5IGluZm9ybWF0aW9uLi4uCisgICAgICAgIGNzclNldE9wcG9zaXRlQmFuZENoYW5uZWxJbmZvKCBwTWFjICk7CisgICAgICAgIGJNYXhOdW1DaG4gPSBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU47CisgICAgICAgIC8vIGNvbnN0cnVjdCAyR0h6IGNoYW5uZWwgbGlzdCBmaXJzdAorICAgICAgICBjc3JDb25zdHJ1Y3RDdXJyZW50VmFsaWRDaGFubmVsTGlzdCggcE1hYywgJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3QyNCwgcE1hYy0+c2Nhbi5jaGFubmVsczExZC5jaGFubmVsTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4TnVtQ2huLCAmTnVtMkdDaGFubmVscyApOworICAgICAgICAvLyBjb25zdHJ1Y3QgNUdIeiBjaGFubmVsIGxpc3Qgbm93CisgICAgICAgIGlmKGJNYXhOdW1DaG4gPiBOdW0yR0NoYW5uZWxzKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JDb25zdHJ1Y3RDdXJyZW50VmFsaWRDaGFubmVsTGlzdCggcE1hYywgJnBNYWMtPnNjYW4uY2hhbm5lbFBvd2VySW5mb0xpc3Q1RywgcE1hYy0+c2Nhbi5jaGFubmVsczExZC5jaGFubmVsTGlzdCArIE51bTJHQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heE51bUNobiAtIE51bTJHQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBNYWMtPnNjYW4uY2hhbm5lbHMxMWQubnVtQ2hhbm5lbHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHBNYWMtPnNjYW4uY2hhbm5lbHMxMWQubnVtQ2hhbm5lbHMgKz0gTnVtMkdDaGFubmVsczsKKyAgICAgICAgZlJldCA9IGVBTklfQk9PTEVBTl9UUlVFOworCisgICAgfSB3aGlsZSggMCApOworICAgIAorICAgIGlmKCAhcEllcyAmJiBwSWVzTG9jYWwgKQorICAgIHsKKyAgICAgICAgLy9sb2NhbGx5IGFsbG9jYXRlZAorICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXNMb2NhbCk7CisgICAgfQorCisgICAgcmV0dXJuKCBmUmV0ICk7Cit9CisKKworc3RhdGljIHZvaWQgY3NyU2F2ZVNjYW5SZXN1bHRzKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICAvLyBpbml0aWFsaXplIHRoaXMgdG8gRkFMU0UuIHByb2ZNb3ZlSW50ZXJpbVNjYW5SZXN1bHRzVG9NYWluTGlzdCgpIHJvdXRpbmUKKyAgICAvLyB3aWxsIHNldCB0aGlzIHRvIHRoZSBjaGFubmVsIHdoZXJlIGFuIC4xMWQgYmVhY29uIGlzIHNlZW4KKyAgICBwTWFjLT5zY2FuLmNoYW5uZWxPZjExZEluZm8gPSAwOworICAgIC8vIGlmIHdlIGdldCBhbnkgYW1iaWd1b3VzIC4xMWQgaW5mb3JtYXRpb24gdGhlbiB0aGlzIHdpbGwgYmUgc2V0IHRvIFRSVUUKKyAgICBwTWFjLT5zY2FuLmZBbWJpZ3VvdXMxMWRJbmZvRm91bmQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgLy9UdXNoCisgICAgLy8gaWYgd2UgZ2V0IGFueSBhbWJpZ3VvdXMgLjExZCBpbmZvcm1hdGlvbiwgdGhlbiB0aGlzIHdpbGwgYmUgc2V0IHRvIFRSVUUKKyAgICAvLyBvbmx5IGlmIHRoZSBhcHBsaWVkIDExZCBpbmZvIGNvdWxkIGJlIGZvdW5kIGluIG9uZSBvZiB0aGUgc2NhbiByZXN1bHRzCisgICAgcE1hYy0+c2Nhbi5mQ3VycmVudDExZEluZm9NYXRjaCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAvLyBtb3ZlIHRoZSBzY2FuIHJlc3VsdHMgZnJvbSBpbnRlcmltIGxpc3QgdG8gdGhlIG1haW4gc2NhbiBsaXN0CisgICAgY3NyTW92ZVRlbXBTY2FuUmVzdWx0c1RvTWFpbkxpc3QoIHBNYWMgKTsKKworICAgIC8vIE5vdyBjaGVjayBpZiB3ZSBnYXRoZXJlZCBhbnkgZG9tYWluL2NvdW50cnkgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAgICAvLyBJZiBzbywgd2Ugc2hvdWxkIHVwZGF0ZSBjaGFubmVsIGxpc3QgYW5kIGFwcGx5IFR4IHBvd2VyIHNldHRpbmdzCisgICAgY3NyQXBwbHlDb3VudHJ5SW5mb3JtYXRpb24oIHBNYWMsIEZBTFNFICk7Cit9CisKKwordm9pZCBjc3JSZWluaXRTY2FuQ21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworICAgIHN3aXRjaCAocENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pCisgICAgeworICAgIGNhc2UgZUNzclNjYW5TZXRCR1NjYW5QYXJhbToKKyAgICBjYXNlIGVDc3JTY2FuQWJvcnRCZ1NjYW46CisgICAgICAgIGlmKHBDb21tYW5kLT51LnNjYW5DbWQudS5iZ1NjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBDb21tYW5kLT51LnNjYW5DbWQudS5iZ1NjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5iZ1NjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGVDc3JTY2FuQkdTY2FuQWJvcnQ6CisgICAgY2FzZSBlQ3NyU2NhbkJHU2NhbkVuYWJsZToKKyAgICBjYXNlIGVDc3JTY2FuR2V0U2NhbkNobkluZm86CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNzclNjYW5BYm9ydE5vcm1hbFNjYW46CisgICAgZGVmYXVsdDoKKyAgICAgICAgY3NyU2NhbkZyZWVSZXF1ZXN0KHBNYWMsICZwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYocENvbW1hbmQtPnUuc2NhbkNtZC5wVG9Sb2FtUHJvZmlsZSkKKyAgICB7CisgICAgICAgIGNzclJlbGVhc2VQcm9maWxlKHBNYWMsIHBDb21tYW5kLT51LnNjYW5DbWQucFRvUm9hbVByb2ZpbGUpOworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBDb21tYW5kLT51LnNjYW5DbWQucFRvUm9hbVByb2ZpbGUpOworICAgIH0KKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwQ29tbWFuZC0+dS5zY2FuQ21kLCBzaXplb2YodFNjYW5DbWQpKTsKK30KKworCit0QU5JX0JPT0xFQU4gY3NyR2V0UmVtYWluaW5nQ2hhbm5lbHNGb3IxMWRTY2FuKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQ2hhbm5lbHMsIHRBTklfVTggKnBjQ2hhbm5lbHMgKQoreworICAgIHRBTklfVTMyIGluZGV4MTFkQ2hhbm5lbHMsIGluZGV4OworICAgIHRBTklfVTMyIGluZGV4Q3VycmVudENoYW5uZWxzOworICAgIHRBTklfQk9PTEVBTiBmQ2hhbm5lbEFscmVhZHlTY2FubmVkOworICAgIHRBTklfVTMyIGxlbiA9IHNpemVvZihwTWFjLT5yb2FtLnZhbGlkQ2hhbm5lbExpc3QpOworCisgICAgKnBjQ2hhbm5lbHMgPSAwOworICAgIGlmICggQ1NSX0lTXzExRF9JTkZPX0ZPVU5EKHBNYWMpICYmIGNzclJvYW1Jc0NoYW5uZWxWYWxpZChwTWFjLCBwTWFjLT5zY2FuLmNoYW5uZWxPZjExZEluZm8pICkKKyAgICB7CisgICAgICAgIGlmIChIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0Q2ZnVmFsaWRDaGFubmVscyhwTWFjLCAodEFOSV9VOCAqKXBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCwgJmxlbikpKQorICAgICAgICB7CisgICAgICAgICAgICAvL0ZpbmQgdGhlIGNoYW5uZWwgaW5kZXggd2hlcmUgd2UgZm91bmQgdGhlIDExZCBpbmZvCisgICAgICAgICAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgaW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwTWFjLT5zY2FuLmNoYW5uZWxPZjExZEluZm8gPT0gcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0W2luZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2NoZWNrIHdoZXRoZXIgd2UgZm91bmQgdGhlIGNoYW5uZWwgaW5kZXgKKyAgICAgICAgICAgIGlmKGluZGV4IDwgbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5vdywgbG9vayB0aHJvdWdoIHRoZSAxMWQgY2hhbm5lbCBsaXN0IGFuZCBjcmVhdGUgYSBsaXN0IG9mIGFsbCBjaGFubmVscyBpbiB0aGUgMTFkIGxpc3QgdGhhdCBhcmUKKyAgICAgICAgICAgICAgICAvLyBOT1QgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbCBsaXN0LiAgVGhpcyBnaXZlcyB1cyBhIGxpc3Qgb2YgdGhlIG5ldyBjaGFubmVscyB0aGF0IGhhdmUgbm90IGJlZW4KKyAgICAgICAgICAgICAgICAvLyBzY2FubmVkLiAgV2UnbGwgc2NhbiB0aGlzIG5ldyBsaXN0IHNvIHdlIGhhdmUgYSBjb21wbGV0ZSBzZXQgb2Ygc2NhbiByZXN1bHRzIG9uIGFsbCBvZiB0aGUgZG9tYWluIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGx5LgorICAgICAgICAgICAgICAgIGZvciAoIGluZGV4MTFkQ2hhbm5lbHMgPSAwOyBpbmRleDExZENoYW5uZWxzIDwgcE1hYy0+c2Nhbi5jaGFubmVsczExZC5udW1DaGFubmVsczsgaW5kZXgxMWRDaGFubmVscysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZDaGFubmVsQWxyZWFkeVNjYW5uZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpbmRleEN1cnJlbnRDaGFubmVscyA9IDA7IGluZGV4Q3VycmVudENoYW5uZWxzIDwgaW5kZXg7IGluZGV4Q3VycmVudENoYW5uZWxzKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdFsgaW5kZXhDdXJyZW50Q2hhbm5lbHMgXSA9PSBwTWFjLT5zY2FuLmNoYW5uZWxzMTFkLmNoYW5uZWxMaXN0WyBpbmRleDExZENoYW5uZWxzIF0gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDaGFubmVsQWxyZWFkeVNjYW5uZWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggIWZDaGFubmVsQWxyZWFkeVNjYW5uZWQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbHNbICpwY0NoYW5uZWxzIF0gPSBwTWFjLT5zY2FuLmNoYW5uZWxzMTFkLmNoYW5uZWxMaXN0WyBpbmRleDExZENoYW5uZWxzIF07CisgICAgICAgICAgICAgICAgICAgICAgICAoICpwY0NoYW5uZWxzICkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS8vR2V0Q0ZHCisgICAgfQorICAgIHJldHVybiggKnBjQ2hhbm5lbHMgKTsKK30KKworCitlQ3NyU2NhbkNvbXBsZXRlTmV4dENvbW1hbmQgY3NyU2NhbkdldE5leHRDb21tYW5kU3RhdGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kLCB0QU5JX0JPT0xFQU4gZlN1Y2Nlc3MgKQoreworICAgIGVDc3JTY2FuQ29tcGxldGVOZXh0Q29tbWFuZCBOZXh0Q29tbWFuZCA9IGVDc3JOZXh0U2Nhbk5vdGhpbmc7CisgICAgCisgICAgc3dpdGNoKCBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiApCisgICAgeworICAgICAgICBjYXNlIGVDc3JTY2FuMTFkMToKKyAgICAgICAgICAgIE5leHRDb21tYW5kID0gKGZTdWNjZXNzKSA/IGVDc3JOZXh0MTFkU2NhbjFTdWNjZXNzIDogZUNzck5leHQxMWRTY2FuMUZhaWx1cmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ3NyU2NhbjExZDI6CisgICAgICAgICAgICBOZXh0Q29tbWFuZCA9IChmU3VjY2VzcykgPyBlQ3NyTmV4dDExZFNjYW4yU3VjY2VzcyA6IGVDc3JOZXh0MTFkU2NhbjJGYWlsdXJlOworICAgICAgICAgICAgYnJlYWs7ICAgIAorICAgICAgICBjYXNlIGVDc3JTY2FuMTFkRG9uZToKKyAgICAgICAgICAgIE5leHRDb21tYW5kID0gZUNzck5leHQxMWRTY2FuQ29tcGxldGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ3NyU2Nhbkxvc3RMaW5rMToKKyAgICAgICAgICAgIE5leHRDb21tYW5kID0gKGZTdWNjZXNzKSA/IGVDc3JOZXh0TG9zdExpbmtTY2FuMVN1Y2Nlc3MgOiBlQ3NyTmV4dExvc3RMaW5rU2NhbjFGYWlsZWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ3NyU2Nhbkxvc3RMaW5rMjoKKyAgICAgICAgICAgIE5leHRDb21tYW5kID0gKGZTdWNjZXNzKSA/IGVDc3JOZXh0TG9zdExpbmtTY2FuMlN1Y2Nlc3MgOiBlQ3NyTmV4dExvc3RMaW5rU2NhbjJGYWlsZWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ3NyU2Nhbkxvc3RMaW5rMzoKKyAgICAgICAgICAgIE5leHRDb21tYW5kID0gKGZTdWNjZXNzKSA/IGVDc3JOZXh0TG9zdExpbmtTY2FuM1N1Y2Nlc3MgOiBlQ3NyTmV4dExvc3RMaW5rU2NhbjNGYWlsZWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ3NyU2NhbkZvclNzaWQ6CisgICAgICAgICAgICBOZXh0Q29tbWFuZCA9IChmU3VjY2VzcykgPyBlQ3NyTmV4dGVTY2FuRm9yU3NpZFN1Y2Nlc3MgOiBlQ3NyTmV4dGVTY2FuRm9yU3NpZEZhaWx1cmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlQ3NyU2NhbkZvckNhcHNDaGFuZ2U6CisgICAgICAgICAgICBOZXh0Q29tbWFuZCA9IGVDc3JOZXh0Q2FwQ2hhbmdlU2NhbkNvbXBsZXRlOyAgICAvL2Rvbid0IGNhcmUgc3VjY2VzcyBvciBub3QKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVDc3JTY2FuSWRsZVNjYW46CisgICAgICAgICAgICBOZXh0Q29tbWFuZCA9IGVDc3JOZXh0SWRsZVNjYW5Db21wbGV0ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTmV4dENvbW1hbmQgPSBlQ3NyTmV4dFNjYW5Ob3RoaW5nOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiggTmV4dENvbW1hbmQgKTsKK30KKworCisvL1JldHVybiB3aGV0aGVyIHRoZSBwQ29tbWFuZCBpcyBmaW5pc2hlZC4KK3RBTklfQk9PTEVBTiBjc3JIYW5kbGVTY2FuMTFkMUZhaWx1cmUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpCit7CisgICAgdEFOSV9CT09MRUFOIGZSZXQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAKKyAgICAvL0FwcGx5IGJhY2sgdGhlIGRlZmF1bHQgc2V0dGluZyBhbmQgcGFzc2l2ZWx5IHNjYW4gb25lIG1vcmUgdGltZS4KKyAgICBjc3JSZXNldENvdW50cnlJbmZvcm1hdGlvbihwTWFjLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW4xMWQyOworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JTY2FuQ2hhbm5lbHMocE1hYywgcENvbW1hbmQpKSkKKyAgICB7CisgICAgICAgIGZSZXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorICAgIAorICAgIHJldHVybiAoZlJldCk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzckhhbmRsZVNjYW4xMWRTdWNjZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kKQoreworICAgIHRBTklfQk9PTEVBTiBmUmV0ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgdEFOSV9VOCAqcENoYW5uZWxzOworICAgIHRBTklfVTggY0NoYW5uZWxzOworICAgIAorICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcENoYW5uZWxzLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pKSkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcENoYW5uZWxzLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU4pOworICAgICAgICBpZiAoIGNzckdldFJlbWFpbmluZ0NoYW5uZWxzRm9yMTFkU2NhbiggcE1hYywgcENoYW5uZWxzLCAmY0NoYW5uZWxzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiA9IGVDc3JTY2FuMTFkRG9uZTsKKyAgICAgICAgICAgIGlmKHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QsIGNDaGFubmVscykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LCBwQ2hhbm5lbHMsIGNDaGFubmVscyk7CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSBjQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LnJlcXVlc3RUeXBlID0gZUNTUl9TQ0FOX1JFUVVFU1RfRlVMTF9TQ0FOOworICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5zY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKGNzclNjYW5DaGFubmVscyhwTWFjLCBwQ29tbWFuZCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9SZXVzZSB0aGUgc2FtZSBjb21tYW5kIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBmUmV0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBDaGFubmVscyk7CisgICAgfQorICAgIAorICAgIHJldHVybiAoZlJldCk7Cit9CisKKy8vUmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHJlbW92ZWQKK3RBTklfQk9PTEVBTiBjc3JTY2FuQ29tcGxldGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVTY2FuUnNwICpwU2NhblJzcCApCit7CisgICAgZUNzclNjYW5Db21wbGV0ZU5leHRDb21tYW5kIE5leHRDb21tYW5kID0gZUNzck5leHRTY2FuTm90aGluZzsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0U21lQ21kICpwQ29tbWFuZDsKKyAgICB0QU5JX0JPT0xFQU4gZlJlbW92ZUNvbW1hbmQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB0QU5JX0JPT0xFQU4gZlN1Y2Nlc3M7CisKKyAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIExMX0FDQ0VTU19MT0NLICk7CisKKyAgICBpZiAoIHBFbnRyeSApCisgICAgeworICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworCisgICAgICAgIC8vIElmIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBpcyBBY3RpdmUgYW5kIGl0IGlzIGEgU0NBTiBjb21tYW5kLCByZW1vdmUKKyAgICAgICAgLy8gYW5kIHB1dCB0aGlzIG9uIHRoZSBGcmVlIHF1ZXVlLgorICAgICAgICBpZiAoIGVTbWVDb21tYW5kU2NhbiA9PSBwQ29tbWFuZC0+Y29tbWFuZCApCisgICAgICAgIHsgICAgIAorICAgICAgICAgICAgdEFOSV9VMzIgc2Vzc2lvbklkID0gcENvbW1hbmQtPnNlc3Npb25JZDsKKworICAgICAgICAgICAgaWYoZVNJUl9TTUVfU1VDQ0VTUyAhPSBwU2NhblJzcC0+c3RhdHVzQ29kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmU3VjY2VzcyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3BNYWMtPnNjYW4udGVtcFNjYW5SZXN1bHRzIGlzIG5vdCBlbXB0eSBtZWFuaW5nIHRoZSBzY2FuIGZvdW5kIHNvbWV0aGluZworICAgICAgICAgICAgICAgIC8vVGhpcyBjaGVjayBvbmx5IHZhbGlkIGhlcmUgYmVjYXVzZSBjc3JTYXZlU2NhbnJlc3VsdHMgaXMgbm90IHlldCBjYWxsZWQKKyAgICAgICAgICAgICAgICBmU3VjY2VzcyA9ICghY3NyTExJc0xpc3RFbXB0eSgmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMsIExMX0FDQ0VTU19MT0NLKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjc3JTYXZlU2NhblJlc3VsdHMocE1hYyk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZvc19sb2dfc2Nhbl9wa3RfdHlwZSAqcFNjYW5Mb2cgPSBOVUxMOworICAgICAgICAgICAgICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0OworICAgICAgICAgICAgICAgIHRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQ7CisgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllczsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IDAsIGMgPSAwOworCisgICAgICAgICAgICAgICAgV0xBTl9WT1NfRElBR19MT0dfQUxMT0MocFNjYW5Mb2csIHZvc19sb2dfc2Nhbl9wa3RfdHlwZSwgTE9HX1dMQU5fU0NBTl9DKTsKKyAgICAgICAgICAgICAgICBpZihwU2NhbkxvZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKGVDc3JTY2FuQmdTY2FuID09IHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgZUNzclNjYW5Qcm9iZUJzcyA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZUNzclNjYW5TZXRCR1NjYW5QYXJhbSA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5Mb2ctPmV2ZW50SWQgPSBXTEFOX1NDQU5fRVZFTlRfSE9fU0NBTl9SU1A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZVNJUl9QQVNTSVZFX1NDQU4gIT0gcE1hYy0+c2Nhbi5jdXJTY2FuVHlwZSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5Mb2ctPmV2ZW50SWQgPSBXTEFOX1NDQU5fRVZFTlRfQUNUSVZFX1NDQU5fUlNQOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuTG9nLT5ldmVudElkID0gV0xBTl9TQ0FOX0VWRU5UX1BBU1NJVkVfU0NBTl9SU1A7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoZVNJUl9TTUVfU1VDQ0VTUyA9PSBwU2NhblJzcC0+c3RhdHVzQ29kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKGNzclNjYW5HZXRSZXN1bHQocE1hYywgTlVMTCwgJmhTY2FuUmVzdWx0KSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoKChwU2NhblJlc3VsdCA9IGNzclNjYW5SZXN1bHRHZXROZXh0KHBNYWMsIGhTY2FuUmVzdWx0KSkgIT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbiA8IFZPU19MT0dfTUFYX05VTV9CU1NJRCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgJnBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLCAmcEllcykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWwgdG8gcGFyc2UgSUVzXG4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBTY2FuTG9nLT5ic3NpZFtuXSwgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWQsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocEllcyAmJiBwSWVzLT5TU0lELnByZXNlbnQgJiYgVk9TX0xPR19NQVhfU1NJRF9TSVpFID49IHBJZXMtPlNTSUQubnVtX3NzaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkxvZy0+c3NpZFtuXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVzLT5TU0lELnNzaWQsIHBJZXMtPlNTSUQubnVtX3NzaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwSWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuTG9nLT5udW1Tc2lkID0gKHZfVThfdCluOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuTG9nLT50b3RhbFNzaWQgPSAodl9VOF90KWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyU2NhblJlc3VsdFB1cmdlKHBNYWMsIGhTY2FuUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuTG9nLT5zdGF0dXMgPSBXTEFOX1NDQU5fU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgV0xBTl9WT1NfRElBR19MT0dfUkVQT1JUKHBTY2FuTG9nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLy8jaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKworICAgICAgICAgICAgTmV4dENvbW1hbmQgPSBjc3JTY2FuR2V0TmV4dENvbW1hbmRTdGF0ZShwTWFjLCBwQ29tbWFuZCwgZlN1Y2Nlc3MpOworICAgICAgICAgICAgLy9XZSByZXVzZSB0aGUgY29tbWFuZCBoZXJlIGluc3RlYWQgcmVpc3N1ZSBhIG5ldyBjb21tYW5kCisgICAgICAgICAgICBzd2l0Y2goTmV4dENvbW1hbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGVDc3JOZXh0MTFkU2NhbjFTdWNjZXNzOgorICAgICAgICAgICAgY2FzZSBlQ3NyTmV4dDExZFNjYW4yU3VjY2VzczoKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPRzIsIEZMKCIxMWRTY2FuMS8zIHByb2R1Y2VkIHJlc3VsdHMuICBSZWlzc3VlIEFjdGl2ZSBzY2FuLi4uXG4iKSk7CisgICAgICAgICAgICAgICAgLy8gaWYgd2UgZm91bmQgY291bnRyeSBpbmZvcm1hdGlvbiwgbm8gbmVlZCB0byBjb250aW51ZSBzY2FubmluZyBmdXJ0aGVyLCBiYWlsIG91dAorICAgICAgICAgICAgICAgIGZSZW1vdmVDb21tYW5kID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgTmV4dENvbW1hbmQgPSBlQ3NyTmV4dDExZFNjYW5Db21wbGV0ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNzck5leHQxMWRTY2FuMUZhaWx1cmU6CisgICAgICAgICAgICAgICAgLy9XZSBhcmUgbm90IGRvbmUgeWV0LiAxMWQgc2NhbiBmYWlsIG9uY2UuIFdlIHdpbGwgdHJ5IHRvIHJlc2V0IGFueXRoaW5nIGFuZCBkbyBpdCBvdmVyIGFnYWluCisgICAgICAgICAgICAgICAgLy9UaGUgb25seSBtZWFuaW5nZnVsIHRoaW5nIGZvciB0aGlzIHJldHJ5IGlzIHRoYXQgd2UgY2Fubm90IGZpbmQgMTFkIGluZm9ybWF0aW9uIGFmdGVyIGEgcmVzZXQgc28KKyAgICAgICAgICAgICAgICAvL3dlIGNsZWFyIHRoZSAib2xkIiAxMWQgaW5mbyBhbmQgZ2l2ZSBpdCBvbmNlIG1vcmUgY2hhbmNlCisgICAgICAgICAgICAgICAgZlJlbW92ZUNvbW1hbmQgPSBjc3JIYW5kbGVTY2FuMTFkMUZhaWx1cmUocE1hYywgcENvbW1hbmQpOworICAgICAgICAgICAgICAgIGlmKGZSZW1vdmVDb21tYW5kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmV4dENvbW1hbmQgPSBlQ3NyTmV4dDExZFNjYW5Db21wbGV0ZTsKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyTmV4dExvc3RMaW5rU2NhbjFTdWNjZXNzOgorICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NySXNzdWVSb2FtQWZ0ZXJMb3N0bGlua1NjYW4ocE1hYywgc2Vzc2lvbklkLCBlQ3NyTG9zdExpbmsxKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjc3JTY2FuSGFuZGxlRmFpbGVkTG9zdGxpbmsxKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyTmV4dExvc3RMaW5rU2NhbjJTdWNjZXNzOgorICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NySXNzdWVSb2FtQWZ0ZXJMb3N0bGlua1NjYW4ocE1hYywgc2Vzc2lvbklkLCBlQ3NyTG9zdExpbmsyKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjc3JTY2FuSGFuZGxlRmFpbGVkTG9zdGxpbmsyKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyTmV4dExvc3RMaW5rU2NhbjNTdWNjZXNzOgorICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NySXNzdWVSb2FtQWZ0ZXJMb3N0bGlua1NjYW4ocE1hYywgc2Vzc2lvbklkLCBlQ3NyTG9zdExpbmszKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjc3JTY2FuSGFuZGxlRmFpbGVkTG9zdGxpbmszKHBNYWMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyTmV4dExvc3RMaW5rU2NhbjFGYWlsZWQ6CisgICAgICAgICAgICAgICAgY3NyU2NhbkhhbmRsZUZhaWxlZExvc3RsaW5rMShwTWFjLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyTmV4dExvc3RMaW5rU2NhbjJGYWlsZWQ6CisgICAgICAgICAgICAgICAgY3NyU2NhbkhhbmRsZUZhaWxlZExvc3RsaW5rMihwTWFjLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyTmV4dExvc3RMaW5rU2NhbjNGYWlsZWQ6CisgICAgICAgICAgICAgICAgY3NyU2NhbkhhbmRsZUZhaWxlZExvc3RsaW5rMyhwTWFjLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAKKyAgICAgICAgICAgIGNhc2UgZUNzck5leHRlU2NhbkZvclNzaWRTdWNjZXNzOgorICAgICAgICAgICAgICAgIGNzclNjYW5IYW5kbGVTZWFyY2hGb3JTU0lEKHBNYWMsIHBDb21tYW5kKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNzck5leHRlU2NhbkZvclNzaWRGYWlsdXJlOgorICAgICAgICAgICAgICAgIGNzclNjYW5IYW5kbGVTZWFyY2hGb3JTU0lERmFpbHVyZShwTWFjLCBwQ29tbWFuZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDc3JOZXh0SWRsZVNjYW5Db21wbGV0ZToKKyAgICAgICAgICAgICAgICBwTWFjLT5zY2FuLmZSZXN0YXJ0SWRsZVNjYW4gPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNzck5leHRDYXBDaGFuZ2VTY2FuQ29tcGxldGU6CisgICAgICAgICAgICAgICAgY3NyU2NhbkhhbmRsZUNhcENoYW5nZVNjYW5Db21wbGV0ZShwTWFjLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCBGTCgiU2NhbiBDb21wbGV0aW9uIGNhbGxlZCBidXQgU0NBTiBjb21tYW5kIGlzIG5vdCBBQ1RJVkUgLi4uXG4iKSk7CisgICAgICAgICAgICBmUmVtb3ZlQ29tbWFuZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csIEZMKCJTY2FuIENvbXBsZXRpb24gY2FsbGVkIGJ1dCBOTyBjb21tYW5kcyBhcmUgQUNUSVZFIC4uLlxuIikpOworICAgICAgICBmUmVtb3ZlQ29tbWFuZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB9CisgICAKKyAgICByZXR1cm4oIGZSZW1vdmVDb21tYW5kICk7Cit9CisKKworCitzdGF0aWMgdm9pZCBjc3JTY2FuUmVtb3ZlRHVwQnNzRGVzY3JpcHRpb25Gcm9tSW50ZXJpbUxpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0Q3NyU2NhblJlc3VsdCAqcENzckJzc0Rlc2NyaXB0aW9uOworCisgICAgLy8gV2FsayB0aHJvdWdoIGFsbCB0aGUgY2hhaW5lZCBCc3NEZXNjcmlwdGlvbnMuICBJZiB3ZSBmaW5kIGEgY2hhaW5lZCBCc3NEZXNjcmlwdGlvbiB0aGF0CisgICAgLy8gbWF0Y2hlcyB0aGUgQnNzSUQgb2YgdGhlIEJzc0Rlc2NyaXB0aW9uIHBhc3NlZCBpbiwgdGhlbiB0aGVzZSBtdXN0IGJlIGR1cGxpY2F0ZSBzY2FuCisgICAgLy8gcmVzdWx0cyBmb3IgdGhpcyBCc3MuICBJbiB0aGF0IGNhc2UsIHJlbW92ZSB0aGUgJ29sZCcgQnNzIGRlc2NyaXB0aW9uIGZyb20gdGhlIGxpbmtlZCBsaXN0LgorICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zY2FuLnRlbXBTY2FuUmVzdWx0cywgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICB3aGlsZSggcEVudHJ5ICkgCisgICAgeworICAgICAgICBwQ3NyQnNzRGVzY3JpcHRpb24gPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rICk7CisKKyAgICAgICAgLy8gd2UgaGF2ZSBhIGR1cGxpY2F0ZSBzY2FuIHJlc3VsdHMgb25seSB3aGVuIEJTU0lELCBTU0lELCBDaGFubmVsIGFuZCBOZXR3b3JrVHlwZQorICAgICAgICAvLyBtYXRjaGVzCisKKyAgICAgICAgaWYgKCBjc3JJc0R1cGxpY2F0ZUJzc0Rlc2NyaXB0aW9uKCBwTWFjLCAmcENzckJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQuQnNzRGVzY3JpcHRvciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2lyQnNzRGVzY3IsIHBJZXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTaXJCc3NEZXNjci0+cnNzaSA9ICh0QU5JX1M4KSggKCgodEFOSV9TMzIpcFNpckJzc0Rlc2NyLT5yc3NpICogQ1NSX1NDQU5fUkVTVUxUX1JTU0lfV0VJR0hUICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0QU5JX1MzMilwQ3NyQnNzRGVzY3JpcHRpb24tPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLnJzc2kgKiAoMTAwIC0gQ1NSX1NDQU5fUkVTVUxUX1JTU0lfV0VJR0hUKSApKSAvIDEwMCApOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlICdvbGQnIGVudHJ5IGZyb20gdGhlIGxpc3QuLi4uCisgICAgICAgICAgICBpZiggY3NyTExSZW1vdmVFbnRyeSggJnBNYWMtPnNjYW4udGVtcFNjYW5SZXN1bHRzLCBwRW50cnksIExMX0FDQ0VTU19MT0NLICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzckNoZWNrTlNhdmVXc2NJZShwTWFjLCBwU2lyQnNzRGVzY3IsICZwQ3NyQnNzRGVzY3JpcHRpb24tPlJlc3VsdC5Cc3NEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGZyZWUgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlCisgICAgICAgICAgICAgICAgY3NyRnJlZVNjYW5SZXN1bHRFbnRyeSggcE1hYywgcENzckJzc0Rlc2NyaXB0aW9uICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgbWF0Y2gsIHdlIGNhbiBzdG9wIGxvb2tpbmcgdGhyb3VnaCB0aGUgbGlzdC4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCAmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMsIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICB9Cit9CisKKworCisvL0NhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHBmTmV3QnNzRm9yQ29ubiB0byByZXR1cm4gd2hldGhlciBuZXcgY2FuZGlkYXRlIGZvcgorLy9jdXJyZW50IGNvbm5lY3Rpb24gaXMgZm91bmQuIENhbm5vdCBiZSBOVUxMCit0Q3NyU2NhblJlc3VsdCAqY3NyU2NhblNhdmVCc3NEZXNjcmlwdGlvblRvSW50ZXJpbUxpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCU1NEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKyAgICB0Q3NyU2NhblJlc3VsdCAqcENzckJzc0Rlc2NyaXB0aW9uID0gTlVMTDsKKyAgICB0QU5JX1UzMiBjYkJTU0Rlc2M7CisgICAgdEFOSV9VMzIgY2JBbGxvY2F0ZWQ7CisgICAgZUhhbFN0YXR1cyBoYWxTdGF0dXM7CisgICAgCisgICAgLy8gZmlndXJlIG91dCBob3cgYmlnIHRoZSBCU1MgZGVzY3JpcHRpb24gaXMgKHRoZSBCU1NEZXNjLT5sZW5ndGggZG9lcyBOT1QKKyAgICAvLyBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmKS4KKyAgICBjYkJTU0Rlc2MgPSBwQlNTRGVzY3JpcHRpb24tPmxlbmd0aCArIHNpemVvZiggcEJTU0Rlc2NyaXB0aW9uLT5sZW5ndGggKTsKKworICAgIGNiQWxsb2NhdGVkID0gc2l6ZW9mKCB0Q3NyU2NhblJlc3VsdCApICsgY2JCU1NEZXNjOworCisgICAgaGFsU3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQ3NyQnNzRGVzY3JpcHRpb24sIGNiQWxsb2NhdGVkICk7CisgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoaGFsU3RhdHVzKSApCisgICAgeworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBDc3JCc3NEZXNjcmlwdGlvbiwgY2JBbGxvY2F0ZWQpOworICAgICAgICBwQ3NyQnNzRGVzY3JpcHRpb24tPkFnaW5nQ291bnQgPSAodEFOSV9TMzIpcE1hYy0+cm9hbS5jb25maWdQYXJhbS5hZ2luZ0NvdW50OworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwQ3NyQnNzRGVzY3JpcHRpb24tPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCBwQlNTRGVzY3JpcHRpb24sIGNiQlNTRGVzYyApOworICAgICAgICAvL1NhdmUgU1NJRCBzZXBhcmF0ZWx5IGZvciBsYXRlciB1c2UKKyAgICAgICAgaWYoIHBJZXMtPlNTSUQucHJlc2VudCAmJiAhY3NySXNOVUxMU1NJRChwSWVzLT5TU0lELnNzaWQsIHBJZXMtPlNTSUQubnVtX3NzaWQpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TU0lEIG5vdCBoaWRkZW4KKyAgICAgICAgICAgIHRBTklfVTMyIGxlbiA9IHBJZXMtPlNTSUQubnVtX3NzaWQ7OworICAgICAgICAgICAgaWYgKGxlbiA+IFNJUl9NQUNfTUFYX1NTSURfTEVOR1RIKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdG8gZml0IGluIG91ciBzdHJ1Y3QKKyAgICAgICAgICAgICAgIGxlbiA9IFNJUl9NQUNfTUFYX1NTSURfTEVOR1RIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcENzckJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQuc3NJZC5sZW5ndGggPSBsZW47CisgICAgICAgICAgICBwQ3NyQnNzRGVzY3JpcHRpb24tPlJlc3VsdC50aW1lciA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcENzckJzc0Rlc2NyaXB0aW9uLT5SZXN1bHQuc3NJZC5zc0lkLCAKKyAgICAgICAgICAgICAgICBwSWVzLT5TU0lELnNzaWQsIGxlbiApOworICAgICAgICB9CisgICAgICAgIGNzckxMSW5zZXJ0VGFpbCggJnBNYWMtPnNjYW4udGVtcFNjYW5SZXN1bHRzLCAmcENzckJzc0Rlc2NyaXB0aW9uLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSyApOworICAgIH0KKworICAgIHJldHVybiggcENzckJzc0Rlc2NyaXB0aW9uICk7Cit9CisKKworICAgIAorCit0QU5JX0JPT0xFQU4gY3NySXNEdXBsaWNhdGVCc3NEZXNjcmlwdGlvbiggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MyLCB0RG90MTFmQmVhY29uSUVzICpwSWVzMiApCit7CisgICAgdEFOSV9CT09MRUFOIGZNYXRjaCA9IEZBTFNFOworICAgIHRTaXJNYWNDYXBhYmlsaXR5SW5mbyAqcENhcDEsICpwQ2FwMjsKKyAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzMSA9IE5VTEw7CisKKyAgICBwQ2FwMSA9ICh0U2lyTWFjQ2FwYWJpbGl0eUluZm8gKikmcFNpckJzc0Rlc2MxLT5jYXBhYmlsaXR5SW5mbzsKKyAgICBwQ2FwMiA9ICh0U2lyTWFjQ2FwYWJpbGl0eUluZm8gKikmcFNpckJzc0Rlc2MyLT5jYXBhYmlsaXR5SW5mbzsKKyAgICBpZihwQ2FwMS0+ZXNzID09IHBDYXAyLT5lc3MpCisgICAgeworICAgICAgICBpZiAocENhcDEtPmVzcyAmJiAKKyAgICAgICAgICAgICAgICBjc3JJc01hY0FkZHJlc3NFcXVhbCggcE1hYywgKHRDc3JCc3NpZCAqKXBTaXJCc3NEZXNjMS0+YnNzSWQsICh0Q3NyQnNzaWQgKilwU2lyQnNzRGVzYzItPmJzc0lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgZk1hdGNoID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwQ2FwMS0+aWJzcyAmJiAocFNpckJzc0Rlc2MxLT5jaGFubmVsSWQgPT0gcFNpckJzc0Rlc2MyLT5jaGFubmVsSWQpKQorICAgICAgICB7CisgICAgICAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzVGVtcCA9IHBJZXMyOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgcFNpckJzc0Rlc2MxLCAmcEllczEpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggTlVMTCA9PSBwSWVzVGVtcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsIHBTaXJCc3NEZXNjMiwgJnBJZXNUZW1wKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vU2FtZSBjaGFubmVsIGNhbm5vdCBoYXZlIHNhbWUgU1NJRCBmb3IgZGlmZmVyZW50IElCU1MKKyAgICAgICAgICAgICAgICBpZihwSWVzMS0+U1NJRC5wcmVzZW50ICYmIHBJZXNUZW1wLT5TU0lELnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBjc3JJc1NzaWRNYXRjaChwTWFjLCBwSWVzMS0+U1NJRC5zc2lkLCBwSWVzMS0+U1NJRC5udW1fc3NpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZXNUZW1wLT5TU0lELnNzaWQsIHBJZXNUZW1wLT5TU0lELm51bV9zc2lkLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfXdoaWxlKDApOworICAgICAgICAgICAgaWYoIChOVUxMID09IHBJZXMyKSAmJiBwSWVzVGVtcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9sb2NhbGx5IGFsbG9jYXRlZAorICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEllc1RlbXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgIC8qIEluIGNhc2Ugb2YgUDJQIGRldmljZXMsIGVzcyBhbmQgaWJzcyB3aWxsIGJlIHNldCB0byB6ZXJvICovCisgICAgICAgIGVsc2UgaWYgKCFwQ2FwMS0+ZXNzICYmIAorICAgICAgICAgICAgICAgIGNzcklzTWFjQWRkcmVzc0VxdWFsKCBwTWFjLCAodENzckJzc2lkICopcFNpckJzc0Rlc2MxLT5ic3NJZCwgKHRDc3JCc3NpZCAqKXBTaXJCc3NEZXNjMi0+YnNzSWQpKQorICAgICAgICB7CisgICAgICAgICAgICBmTWF0Y2ggPSBUUlVFOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBpZihwSWVzMSkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEllczEpOworICAgIH0KKworICAgIHJldHVybiggZk1hdGNoICk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzcklzTmV0d29ya1R5cGVFcXVhbCggdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzEsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MyICkKK3sKKyAgICByZXR1cm4oIHBTaXJCc3NEZXNjMS0+bndUeXBlID09IHBTaXJCc3NEZXNjMi0+bndUeXBlICk7Cit9CisKKworLy90byBjaGVjayB3aGV0aGVyIHRoZSBCU1MgbWF0Y2hlcyB0aGUgZG90MTFNb2RlCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzclNjYW5Jc0Jzc0FsbG93ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKyAgICB0QU5JX0JPT0xFQU4gZkFsbG93ZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgZUNzclBoeU1vZGUgcGh5TW9kZTsKKworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRQaHlNb2RlRnJvbUJzcyhwTWFjLCBwQnNzRGVzYywgJnBoeU1vZGUsIHBJZXMpKSkKKyAgICB7CisgICAgICAgIHN3aXRjaChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlQ1NSX0RPVDExX01PREVfMTFiOgorICAgICAgICAgICAgZkFsbG93ZWQgPSAodEFOSV9CT09MRUFOKShlQ1NSX0RPVDExX01PREVfMTFhICE9IHBoeU1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExZzoKKyAgICAgICAgICAgIGZBbGxvd2VkID0gKHRBTklfQk9PTEVBTikoZUNTUl9ET1QxMV9NT0RFXzExYSAhPSBwaHlNb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWToKKyAgICAgICAgICAgIGZBbGxvd2VkID0gKHRBTklfQk9PTEVBTikoZUNTUl9ET1QxMV9NT0RFXzExZyA9PSBwaHlNb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWE6CisgICAgICAgICAgICBmQWxsb3dlZCA9ICh0QU5JX0JPT0xFQU4pKChlQ1NSX0RPVDExX01PREVfMTFiICE9IHBoeU1vZGUpICYmIChlQ1NSX0RPVDExX01PREVfMTFnICE9IHBoeU1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV8xMW5fT05MWToKKyAgICAgICAgICAgIGZBbGxvd2VkID0gKHRBTklfQk9PTEVBTikoKGVDU1JfRE9UMTFfTU9ERV8xMW4gPT0gcGh5TW9kZSkgfHwgKGVDU1JfRE9UMTFfTU9ERV9UQVVSVVMgPT0gcGh5TW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZOgorICAgICAgICAgICAgZkFsbG93ZWQgPSAodEFOSV9CT09MRUFOKShlQ1NSX0RPVDExX01PREVfMTFiID09IHBoeU1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYV9PTkxZOgorICAgICAgICAgICAgZkFsbG93ZWQgPSAodEFOSV9CT09MRUFOKShlQ1NSX0RPVDExX01PREVfMTFhID09IHBoeU1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExbjoKKyAgICAgICAgY2FzZSBlQ1NSX0RPVDExX01PREVfVEFVUlVTOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZkFsbG93ZWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChmQWxsb3dlZCk7Cit9CisKKworCisvL1JldHVybiBwSWVzIHRvIGNhbGxlciBmb3IgZnV0dXJlIHVzZSB3aGVuIHJldHVybmluZyBUUlVFLgorc3RhdGljIHRBTklfQk9PTEVBTiBjc3JTY2FuVmFsaWRhdGVTY2FuUmVzdWx0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQ2hhbm5lbHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IG51bUNobiwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKipwcEllcyApCit7CisgICAgdEFOSV9CT09MRUFOIGZWYWxpZENoYW5uZWwgPSBGQUxTRTsKKyAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzID0gTlVMTDsKKyAgICB0QU5JX1U4IGluZGV4OworCisgICAgZm9yKCBpbmRleCA9IDA7IGluZGV4IDwgbnVtQ2huOyBpbmRleCsrICkKKyAgICB7CisgICAgICAgIC8vIFRoaXMgY2hlY2sgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYSBzaW5nbGUgQlNTIGRlc2NyaXB0aW9uIGlzIHJldHVybmVkIGluIGVhY2gKKyAgICAgICAgLy8gU2NhblJzcCBjYWxsLCB3aGljaCBpcyB0aGUgd2F5IExJTSBpbXBsZW1lbnRlZCB0aGUgc2NhbiByZXEvcnNwIGZ1bnRpb25zLiAgV2UgY2hhbmdlZCAKKyAgICAgICAgLy8gdG8gdGhpcyBtb2RlbCB3aGVuIHdlIHJhbiB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIEFQcy4gIElmIHRoaXMgd2VyZSB0byBjaGFuZ2UsIHRoZW4gCisgICAgICAgIC8vIHRoaXMgY2hlY2sgd291bGQgaGF2ZSB0byBtZXNzIHdpdGggcmVtb3ZpbmcgdGhlIGJzc0Rlc2NyaXB0aW9uIGZyb20gc29tZXdoZXJlIGluIGFuIAorICAgICAgICAvLyBhcmJpdHJhcnkgaW5kZXggaW4gdGhlIGJzc0Rlc2NyaXB0aW9uIGFycmF5LgorICAgICAgICBpZiAoIHBDaGFubmVsc1sgaW5kZXggXSA9PSBwQnNzRGVzYy0+Y2hhbm5lbElkICkgCisgICAgICAgIHsKKyAgICAgICAgICAgZlZhbGlkQ2hhbm5lbCA9IFRSVUU7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgICpwcEllcyA9IE5VTEw7CisgICAgaWYoZlZhbGlkQ2hhbm5lbCkKKyAgICB7CisgICAgICAgIGlmKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIGNzckdldFBhcnNlZEJzc0Rlc2NyaXB0aW9uSUVzKHBNYWMsIHBCc3NEZXNjLCAmcEllcykgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZWYWxpZENoYW5uZWwgPSBjc3JTY2FuSXNCc3NBbGxvd2VkKHBNYWMsIHBCc3NEZXNjLCBwSWVzKTsKKyAgICAgICAgICAgIGlmKCBmVmFsaWRDaGFubmVsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcHBJZXMgPSBwSWVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBJZXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZWYWxpZENoYW5uZWwgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiggZlZhbGlkQ2hhbm5lbCApOyAgIAorfQorCisKKy8vUmV0dXJuIHdoZXRoZXIgbGFzdCBzY2FuIHJlc3VsdCBpcyByZWNlaXZlZAorc3RhdGljIHRBTklfQk9PTEVBTiBjc3JTY2FuUHJvY2Vzc1NjYW5SZXN1bHRzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyU21lU2NhblJzcCAqcFNjYW5Sc3AsIHRBTklfQk9PTEVBTiAqcGZSZW1vdmVDb21tYW5kICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZlJldCA9IGVBTklfQk9PTEVBTl9GQUxTRSwgZlJlbW92ZUNvbW1hbmQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdERvdDExZkJlYWNvbklFcyAqcEllcyA9IE5VTEw7CisgICAgdEFOSV9VMzIgY2JQYXJzZWQ7CisgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzY3JpcHRpb247CisgICAgdEFOSV9VMzIgY2JCc3NEZXNjOworICAgIHRBTklfVTMyIGNiU2NhblJlc3VsdCA9IEdFVF9GSUVMRF9PRkZTRVQoIHRTaXJTbWVTY2FuUnNwLCBic3NEZXNjcmlwdGlvbiApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRTaXJCc3NEZXNjcmlwdGlvbik7ICAgIC8vV2UgbmVlZCBhdCBsZWFzdCBvbmUgQ0IKKworICAgIC8vIGRvbid0IGNvbnNpZGVyIHRoZSBzY2FuIHJzcCB0byBiZSB2YWxpZCBpZiB0aGUgc3RhdHVzIGNvZGUgaXMgU2NhbiBGYWlsdXJlLiAgU2NhbiBGYWlsdXJlCisgICAgLy8gaXMgcmV0dXJuZWQgd2hlbiB0aGUgc2NhbiBjb3VsZCBub3QgZmluZCBhbnl0aGluZy4gIHNvIGlmIHdlIGdldCBzY2FuIGZhaWx1cmUgcmV0dXJuIHRoYXQKKyAgICAvLyB0aGUgc2NhbiByZXNwb25zZSBpcyBpbnZhbGlkLiAgQWxzbyBjaGVjayB0aGUgbGVuZ2h0IGluIHRoZSBzY2FuIHJlc3VsdCBmb3IgdmFsaWQgc2NhbgorICAgIC8vIEJzc0Rlc2NyaXB0aW9ucy4uLi4KKyAgICBkbworICAgIHsKKyAgICAgICAgaWYgKCAoIGNiU2NhblJlc3VsdCA8PSBwU2NhblJzcC0+bGVuZ3RoICkgJiYgCisgICAgICAgICAgICAgKCggZVNJUl9TTUVfU1VDQ0VTUyA9PSBwU2NhblJzcC0+c3RhdHVzQ29kZSApIHx8CisgICAgICAgICAgICAgICggZVNJUl9TTUVfTU9SRV9TQ0FOX1JFU1VMVFNfRk9MTE9XID09IHBTY2FuUnNwLT5zdGF0dXNDb2RlICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTggKnBDaGFubmVsTGlzdCA9IE5VTEw7CisgICAgICAgICAgICB0QU5JX1U4IGNDaGFubmVscyA9IDA7CisKKyAgICAgICAgICAgIC8vRGlmZmVyZW50IHNjYW4gdHlwZSBjYW4gcmVhY2ggdGhpcyBwb2ludCwgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBpdAorICAgICAgICAgICAgaWYoIGVDc3JTY2FuU2V0QkdTY2FuUGFyYW0gPT0gcENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vZUNzclNjYW5TZXRCR1NjYW5QYXJhbSB1c2VzIGRpZmZlcmVudCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICB0Q3NyQkdTY2FuUmVxdWVzdCAqcEJnU2NhblJlcSA9ICZwQ29tbWFuZC0+dS5zY2FuQ21kLnUuYmdTY2FuUmVxdWVzdDsKKworICAgICAgICAgICAgICAgIGNDaGFubmVscyA9IHBCZ1NjYW5SZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgcENoYW5uZWxMaXN0ID0gcEJnU2NhblJlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy90aGUgcmVzdCB1c2UgZ2VuZXJpYyBzY2FuIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBjQ2hhbm5lbHMgPSBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKyAgICAgICAgICAgICAgICBwQ2hhbm5lbExpc3QgPSBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBzY2FuIHJlc3VsdCBpcyBub3Qgb24gb25lIG9mIHRoZSBjaGFubmVscyBpbiB0aGUgVmFsaWQgY2hhbm5lbCBsaXN0LCB0aGVuIGl0CisgICAgICAgICAgICAvLyBtdXN0IGhhdmUgY29tZSBmcm9tIGFuIEFQIG9uIGFuIG92ZXJsYXBwaW5nIGNoYW5uZWwgKGluIHRoZSAyLjRHSHogYmFuZCkuICBJbiB0aGlzIGNhc2UsCisgICAgICAgICAgICAvLyBsZXQncyBkcm9wIHRoZSBzY2FuIHJlc3VsdC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGUgb3RoZXIgc2l0dWF0aW9uIGlzIHdoZXJlIHRoZSBzY2FuIHJlcXVlc3QgaXMgZm9yIGEgc2NhbiBvbiBhIHBhcnRpY3VsYXIgY2hhbm5lbCBzZXQKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgc2NhbiByZXN1bHQgaXMgZnJvbSBhIAorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBpZiB0aGUgTnVtQ2hhbm5lbHMgaXMgMCwgdGhlbiB3ZSBhcmUgc3VwcG9zZWQgdG8gYmUgc2Nhbm5pbmcgYWxsIGNoYW5uZWxzLiAgVXNlIHRoZSBmdWxsIGNoYW5uZWwKKyAgICAgICAgICAgIC8vIGxpc3QgYXMgdGhlICd2YWxpZCcgY2hhbm5lbCBsaXN0LiAgT3RoZXJ3aXNlLCB1c2UgdGhlIHNwZWNpZmljIGNoYW5uZWwgbGlzdCBpbiB0aGUgc2NhbiBwYXJtcworICAgICAgICAgICAgLy8gYXMgdGhlIHZhbGlkIGNoYW5uZWxzLgorICAgICAgICAgICAgaWYgKCAwID09IGNDaGFubmVscyApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRBTklfVTMyIGxlbiA9IHNpemVvZihwTWFjLT5yb2FtLnZhbGlkQ2hhbm5lbExpc3QpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0Q2ZnVmFsaWRDaGFubmVscyhwTWFjLCAodEFOSV9VOCAqKXBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCwgJmxlbikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcENoYW5uZWxMaXN0ID0gcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0OworICAgICAgICAgICAgICAgICAgICBjQ2hhbm5lbHMgPSAodEFOSV9VOClsZW47IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0Nhbm5vdCBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJDU1I6IFByb2Nlc3NpbmcgaW50ZXJuYWwgU0NBTiByZXN1bHRzLi4uY3NyR2V0Q2ZnVmFsaWRDaGFubmVscyBmYWlsZWRcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPRzIsICJDU1I6IFByb2Nlc3NpbmcgaW50ZXJuYWwgU0NBTiByZXN1bHRzLi4uIiApOworICAgICAgICAgICAgY2JQYXJzZWQgPSBHRVRfRklFTERfT0ZGU0VUKCB0U2lyU21lU2NhblJzcCwgYnNzRGVzY3JpcHRpb24gKTsKKyAgICAgICAgICAgIHBTaXJCc3NEZXNjcmlwdGlvbiA9IHBTY2FuUnNwLT5ic3NEZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIHdoaWxlKCBjYlBhcnNlZCA8IHBTY2FuUnNwLT5sZW5ndGggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggY3NyU2NhblZhbGlkYXRlU2NhblJlc3VsdCggcE1hYywgcENoYW5uZWxMaXN0LCBjQ2hhbm5lbHMsIHBTaXJCc3NEZXNjcmlwdGlvbiwgJnBJZXMgKSApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NyU2NhblJlbW92ZUR1cEJzc0Rlc2NyaXB0aW9uRnJvbUludGVyaW1MaXN0KHBNYWMsIHBTaXJCc3NEZXNjcmlwdGlvbiwgcEllcyk7CisgICAgICAgICAgICAgICAgICAgIGNzclNjYW5TYXZlQnNzRGVzY3JpcHRpb25Ub0ludGVyaW1MaXN0KCBwTWFjLCBwU2lyQnNzRGVzY3JpcHRpb24sIHBJZXMgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGVTSVJfUEFTU0lWRV9TQ0FOID09IHBNYWMtPnNjYW4uY3VyU2NhblR5cGUgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3NySXMxMWRTdXBwb3J0ZWQoIHBNYWMpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIHdoZXRoZXIgdGhlIEJTUyBpcyBhY2NlcHRhYmxlIGJhc2Ugb24gMTFkIGluZm8gYW5kIG91ciBjb25maWdzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjc3JNYXRjaENvdW50cnlDb2RlKCBwTWFjLCBOVUxMLCBwSWVzICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Eb3VibGUgY2hlY2sgd2hldGhlciB0aGUgY2hhbm5lbCBpcyBhY2NlcHRhYmxlIGJ5IHVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3NySXNTdXBwb3J0ZWRDaGFubmVsKCBwTWFjLCBwU2lyQnNzRGVzY3JpcHRpb24tPmNoYW5uZWxJZCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5jdXJTY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5jdXJTY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9GcmVlIHRoZSByZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwSWVzICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHNraXAgb3ZlciB0aGUgQlNTIGRlc2NyaXB0aW9uIHRvIHRoZSBuZXh0IG9uZS4uLgorICAgICAgICAgICAgICAgIGNiQnNzRGVzYyA9IHBTaXJCc3NEZXNjcmlwdGlvbi0+bGVuZ3RoICsgc2l6ZW9mKCBwU2lyQnNzRGVzY3JpcHRpb24tPmxlbmd0aCApOworCisgICAgICAgICAgICAgICAgY2JQYXJzZWQgKz0gY2JCc3NEZXNjOworICAgICAgICAgICAgICAgIHBTaXJCc3NEZXNjcmlwdGlvbiA9ICh0U2lyQnNzRGVzY3JpcHRpb24gKikoKHRBTklfVTggKilwU2lyQnNzRGVzY3JpcHRpb24gKyBjYkJzc0Rlc2MgKTsKKworICAgICAgICAgICAgfSAvL3doaWxlCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICIgU2NhbnJzcCBmYWlsICgweCUwOFgpLCBsZW5ndGggPSAlZFxuIiwgcFNjYW5Sc3AtPnN0YXR1c0NvZGUsIHBTY2FuUnNwLT5sZW5ndGggKTsKKyAgICAgICAgICAgIC8vSE8gYmcgc2Nhbi9wcm9iZSBmYWlsZWQgbm8gbmVlZCB0byB0cnkgYXV0b25vbW91c2x5CisgICAgICAgICAgICBpZihlQ3NyU2NhbkJnU2NhbiA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiB8fAorICAgICAgICAgICAgICAgZUNzclNjYW5Qcm9iZUJzcyA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiB8fAorICAgICAgICAgICAgICAgZUNzclNjYW5TZXRCR1NjYW5QYXJhbSA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmUmVtb3ZlQ29tbWFuZCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfXdoaWxlKDApOworICAgIGlmICggZVNJUl9TTUVfTU9SRV9TQ0FOX1JFU1VMVFNfRk9MTE9XICE9IHBTY2FuUnNwLT5zdGF0dXNDb2RlICkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCAiIFNjYW4gcmVjZWl2ZWQgJWQgdW5pcXVlIEJTUyBzY2FuIHJlYXNvbiBpcyAlZFxuIiwgY3NyTExDb3VudCgmcE1hYy0+c2Nhbi50ZW1wU2NhblJlc3VsdHMpLCBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbik7CisgICAgICAgIGZSZW1vdmVDb21tYW5kID0gY3NyU2NhbkNvbXBsZXRlKCBwTWFjLCBwU2NhblJzcCApOworICAgICAgICBmUmV0ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgfS8vaWYgKCBlU0lSX1NNRV9NT1JFX1NDQU5fUkVTVUxUU19GT0xMT1cgIT0gcFNjYW5Sc3AtPnN0YXR1c0NvZGUgKQorICAgIGlmKHBmUmVtb3ZlQ29tbWFuZCkKKyAgICB7CisgICAgICAgICpwZlJlbW92ZUNvbW1hbmQgPSBmUmVtb3ZlQ29tbWFuZDsKKyAgICB9CisKKyNpZmRlZiBXTEFOX0FQX1NUQV9DT05DVVJSRU5DWQorICAgIGlmICghY3NyTExJc0xpc3RFbXB0eSggJnBNYWMtPnNjYW4uc2NhbkNtZFBlbmRpbmdMaXN0LCBMTF9BQ0NFU1NfTE9DSyApKQorICAgIHsKKyAgICAgICAgIHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5oVGltZXJTdGFBcENvbmNUaW1lciwgCisgICAgICAgICAgICAgICAgIENTUl9TQ0FOX1NUQUFQX0NPTkNfSU5URVJWQUwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIChmUmV0KTsKK30KKworCit0QU5JX0JPT0xFQU4gY3NyU2NhbklzV2lsZENhcmRTY2FuKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCApCit7CisgICAgdEFOSV9VOCBic3NpZFtXTklfQ0ZHX0JTU0lEX0xFTl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07CisgICAgdEFOSV9CT09MRUFOIGYgPSBwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LmJzc2lkLCAKKyAgICAgICAgYnNzaWQsIHNpemVvZih0Q3NyQnNzaWQpICk7CisKKyAgICAvL0l0IGlzIG5vdCBhIHdpbGQgY2FyZCBzY2FuIGlmIHRoZSBic3NpZCBpcyBub3QgYnJvYWRjYXN0IGFuZCB0aGUgbnVtYmVyIG9mIFNTSUQgaXMgMS4KKyAgICByZXR1cm4gKCh0QU5JX0JPT0xFQU4pKCAoZiB8fCAoMHhmZiA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuYnNzaWRbMF0pKSAmJgorICAgICAgICAocENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LlNTSURzLm51bU9mU1NJRHMgIT0gMSkgKSk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuU21lU2NhblJlc3BvbnNlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdFNtZUNtZCAqcENvbW1hbmQ7CisgICAgZUNzclNjYW5TdGF0dXMgc2NhblN0YXR1czsKKyAgICB0U2lyU21lU2NhblJzcCAqcFNjYW5Sc3AgPSAodFNpclNtZVNjYW5Sc3AgKilwTXNnQnVmOworICAgIHRTbWVHZXRTY2FuQ2huUnNwICpwU2NhbkNobkluZm87CisgICAgdEFOSV9CT09MRUFOIGZSZW1vdmVDb21tYW5kID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgZUNzclNjYW5SZWFzb24gcmVhc29uID0gZUNzclNjYW5PdGhlcjsKKworICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0sgKTsKKworICAgIGlmICggcEVudHJ5ICkKKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgIGlmICggZVNtZUNvbW1hbmRTY2FuID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgc2NhblN0YXR1cyA9IChlU0lSX1NNRV9TVUNDRVNTID09IHBTY2FuUnNwLT5zdGF0dXNDb2RlKSA/IGVDU1JfU0NBTl9TVUNDRVNTIDogZUNTUl9TQ0FOX0ZBSUxVUkU7CisgICAgICAgICAgICByZWFzb24gPSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbjsKKyAgICAgICAgICAgIHN3aXRjaChwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgZUNzclNjYW5BYm9ydEJnU2NhbjoKKyAgICAgICAgICAgIGNhc2UgZUNzclNjYW5BYm9ydE5vcm1hbFNjYW46CisgICAgICAgICAgICBjYXNlIGVDc3JTY2FuQkdTY2FuQWJvcnQ6CisgICAgICAgICAgICBjYXNlIGVDc3JTY2FuQkdTY2FuRW5hYmxlOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU2NhbkdldFNjYW5DaG5JbmZvOgorICAgICAgICAgICAgICAgIHBTY2FuQ2huSW5mbyA9ICh0U21lR2V0U2NhbkNoblJzcCAqKXBNc2dCdWY7CisgICAgICAgICAgICAgICAgY3NyU2NhbkFnZVJlc3VsdHMocE1hYywgcFNjYW5DaG5JbmZvKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNzclNjYW5Gb3JDYXBzQ2hhbmdlOgorICAgICAgICAgICAgICAgIGNzclNjYW5Qcm9jZXNzU2NhblJlc3VsdHMoIHBNYWMsIHBDb21tYW5kLCBwU2NhblJzcCwgJmZSZW1vdmVDb21tYW5kICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgY2FzZSBlQ3NyU2NhblAyUEZpbmRQZWVyOgorICAgICAgICAgICAgICBzY2FuU3RhdHVzID0gKChlU0lSX1NNRV9TVUNDRVNTID09IHBTY2FuUnNwLT5zdGF0dXNDb2RlKSAmJiAocFNjYW5Sc3AtPmxlbmd0aCA+IDUwKSkgPyBlQ1NSX1NDQU5fRk9VTkRfUEVFUiA6IGVDU1JfU0NBTl9GQUlMVVJFOworICAgICAgICAgICAgICBjc3JTY2FuUHJvY2Vzc1NjYW5SZXN1bHRzKCBwTWFjLCBwQ29tbWFuZCwgcFNjYW5Sc3AsIE5VTEwgKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIGVDc3JTY2FuU2V0QkdTY2FuUGFyYW06CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmKGNzclNjYW5Qcm9jZXNzU2NhblJlc3VsdHMoIHBNYWMsIHBDb21tYW5kLCBwU2NhblJzcCwgJmZSZW1vdmVDb21tYW5kICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL05vdCB0byBnZXQgY2hhbm5lbCBpbmZvIGlmIHRoZSBzY2FuIGlzIG5vdCBhIHdpbGRjYXJkIHNjYW4gYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAvL2l0IG1heSBjYXVzZSBzY2FuIHJlc3VsdHMgZ290IGFnZWQgb3V0IGluY29ycmVjdGx5LgorICAgICAgICAgICAgICAgICAgICBpZiggY3NyU2NhbklzV2lsZENhcmRTY2FuKCBwTWFjLCBwQ29tbWFuZCApICYmICghcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LnAycFNlYXJjaCkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0dldCB0aGUgbGlzdCBvZiBjaGFubmVscyBzY2FubmVkCisgICAgICAgICAgICAgICAgICAgICAgICBjc3JTY2FuR2V0U2NhbkNobkluZm8ocE1hYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Ly9zd2l0Y2gKKyAgICAgICAgICAgIGlmKGZSZW1vdmVDb21tYW5kKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgY3NyUmVsZWFzZVNjYW5Db21tYW5kKHBNYWMsIHBDb21tYW5kLCBzY2FuU3RhdHVzKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgc21lUHJvY2Vzc1BlbmRpbmdRdWV1ZSggcE1hYyApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiQ1NSOiBTY2FuIENvbXBsZXRpb24gY2FsbGVkIGJ1dCBTQ0FOIGNvbW1hbmQgaXMgbm90IEFDVElWRSAuLi4iICk7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIkNTUjogU2NhbiBDb21wbGV0aW9uIGNhbGxlZCBidXQgTk8gY29tbWFuZHMgYXJlIEFDVElWRSAuLi4iICk7CisgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisKKwordENzclNjYW5SZXN1bHRJbmZvICpjc3JTY2FuUmVzdWx0R2V0Rmlyc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5SZXN1bHQpCit7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdENzclNjYW5SZXN1bHQgKnBSZXN1bHQ7CisgICAgdENzclNjYW5SZXN1bHRJbmZvICpwUmV0ID0gTlVMTDsKKyAgICB0U2NhblJlc3VsdExpc3QgKnBSZXN1bHRMaXN0ID0gKHRTY2FuUmVzdWx0TGlzdCAqKWhTY2FuUmVzdWx0OworICAgIAorICAgIGlmKHBSZXN1bHRMaXN0KQorICAgIHsKKyAgICAgICAgY3NyTExMb2NrKCZwUmVzdWx0TGlzdC0+TGlzdCk7CisgICAgICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoJnBSZXN1bHRMaXN0LT5MaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgaWYocEVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBwUmVzdWx0ID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKyAgICAgICAgICAgIHBSZXQgPSAmcFJlc3VsdC0+UmVzdWx0OworICAgICAgICB9CisgICAgICAgIHBSZXN1bHRMaXN0LT5wQ3VyRW50cnkgPSBwRW50cnk7CisgICAgICAgIGNzckxMVW5sb2NrKCZwUmVzdWx0TGlzdC0+TGlzdCk7CisgICAgfQorICAgIAorICAgIHJldHVybiBwUmV0OworfQorCisKK3RDc3JTY2FuUmVzdWx0SW5mbyAqY3NyU2NhblJlc3VsdEdldE5leHQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5SZXN1bHQpCit7CisgICAgdExpc3RFbGVtICpwRW50cnkgPSBOVUxMOworICAgIHRDc3JTY2FuUmVzdWx0ICpwUmVzdWx0ID0gTlVMTDsKKyAgICB0Q3NyU2NhblJlc3VsdEluZm8gKnBSZXQgPSBOVUxMOworICAgIHRTY2FuUmVzdWx0TGlzdCAqcFJlc3VsdExpc3QgPSAodFNjYW5SZXN1bHRMaXN0ICopaFNjYW5SZXN1bHQ7CisgICAgCisgICAgaWYocFJlc3VsdExpc3QpCisgICAgeworICAgICAgICBjc3JMTExvY2soJnBSZXN1bHRMaXN0LT5MaXN0KTsKKyAgICAgICAgaWYoTlVMTCA9PSBwUmVzdWx0TGlzdC0+cEN1ckVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCZwUmVzdWx0TGlzdC0+TGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRW50cnkgPSBjc3JMTE5leHQoJnBSZXN1bHRMaXN0LT5MaXN0LCBwUmVzdWx0TGlzdC0+cEN1ckVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgfQorICAgICAgICBpZihwRW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBSZXN1bHQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzclNjYW5SZXN1bHQsIExpbmspOworICAgICAgICAgICAgcFJldCA9ICZwUmVzdWx0LT5SZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcFJlc3VsdExpc3QtPnBDdXJFbnRyeSA9IHBFbnRyeTsKKyAgICAgICAgY3NyTExVbmxvY2soJnBSZXN1bHRMaXN0LT5MaXN0KTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHBSZXQ7Cit9CisKKworLy9UaGlzIGZ1bmN0aW9uIG1vdmVzIHRoZSBmaXJzdCBCU1MgdGhhdCBtYXRjaGVzIHRoZSBic3NpZCB0byB0aGUgaGVhZCBvZiB0aGUgcmVzdWx0CitlSGFsU3RhdHVzIGNzck1vdmVCc3NUb0hlYWRGcm9tQlNTSUQodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckJzc2lkICpic3NpZCwgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5SZXN1bHQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRTY2FuUmVzdWx0TGlzdCAqcFJlc3VsdExpc3QgPSAodFNjYW5SZXN1bHRMaXN0ICopaFNjYW5SZXN1bHQ7CisgICAgdENzclNjYW5SZXN1bHQgKnBSZXN1bHQgPSBOVUxMOworICAgIHRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKyAgIAorICAgIGlmKHBSZXN1bHRMaXN0ICYmIGJzc2lkKQorICAgIHsKKyAgICAgICAgY3NyTExMb2NrKCZwUmVzdWx0TGlzdC0+TGlzdCk7CisgICAgICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoJnBSZXN1bHRMaXN0LT5MaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgd2hpbGUocEVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBwUmVzdWx0ID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rKTsKKyAgICAgICAgICAgIGlmKHBhbEVxdWFsTWVtb3J5KHBNYWMtPmhIZGQsIGJzc2lkLCBwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5ic3NJZCwgc2l6ZW9mKHRDc3JCc3NpZCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgY3NyTExSZW1vdmVFbnRyeSgmcFJlc3VsdExpc3QtPkxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyk7CisgICAgICAgICAgICAgICAgY3NyTExJbnNlcnRIZWFkKCZwUmVzdWx0TGlzdC0+TGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBFbnRyeSA9IGNzckxMTmV4dCgmcFJlc3VsdExpc3QtPkxpc3QsIHBSZXN1bHRMaXN0LT5wQ3VyRW50cnksIExMX0FDQ0VTU19OT0xPQ0spOworICAgICAgICB9CisgICAgICAgIGNzckxMVW5sb2NrKCZwUmVzdWx0TGlzdC0+TGlzdCk7CisgICAgfQorICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisvL1JlbW92ZSB0aGUgQlNTIGlmIHBvc3NpYmxlLgorLy9SZXR1cm4gLS0gVFJVRSA9PSB0aGUgQlNTIGlzIHJlbW92ZS4gRmFsc2UgPT0gRmFpbCB0byByZW1vdmUgaXQKKy8vVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBsaXN0IGxvY2sgaXMgaGVsZC4gQmUgY2F1dGlvbiB3aGF0IGZ1bmN0aW9ucyBpdCBjYW4gY2FsbC4KK3RBTklfQk9PTEVBTiBjc3JTY2FuQWdlT3V0QnNzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTY2FuUmVzdWx0ICpwUmVzdWx0KQoreworICAgIHRBTklfQk9PTEVBTiBmUmV0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHRBTklfVTMyIGk7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworICAgIGZvciggaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgaSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIGkgKTsKKyAgICAgICAgICAgIC8vTm90IHRvIHJlbW92ZSB0aGUgQlNTIHdlIGFyZSBjb25uZWN0ZWQgdG8uCisgICAgICAgICAgICBpZihjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZChwTWFjLCBpKSB8fCAoTlVMTCA9PSBwU2Vzc2lvbi0+cENvbm5lY3RCc3NEZXNjKSB8fAorICAgICAgICAgICAgICAoIWNzcklzRHVwbGljYXRlQnNzRGVzY3JpcHRpb24ocE1hYywgJnBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MsIE5VTEwpKQorICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJBZ2luZyBvdXQgQlNTICUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYIENoYW5uZWwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5ic3NJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmJzc0lkWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuYnNzSWRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5ic3NJZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLmJzc0lkWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IuYnNzSWRbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5jaGFubmVsSWQpOworICAgICAgICAgICAgICAgIC8vTm8gbmVlZCB0byBob2xkIHRoZSBzcGluIGxvY2sgYmVjYXVzZSBjYWxsZXIgc2hvdWxkIGhvbGQgdGhlIGxvY2sgZm9yIHBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QKKyAgICAgICAgICAgICAgICBpZiggY3NyTExSZW1vdmVFbnRyeSgmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgJnBSZXN1bHQtPkxpbmssIExMX0FDQ0VTU19OT0xPQ0spICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzckZyZWVTY2FuUmVzdWx0RW50cnkocE1hYywgcFJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZSZXQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvL3ZhbGlkIHNlc3Npb24KKyAgICB9IC8vZm9yCisgICAgaWYoIENTUl9ST0FNX1NFU1NJT05fTUFYID09IGkgKQorICAgIHsKKyAgICAgICAgLy9yZXNldCB0aGUgY291bnRlciBzbyB0aGlzIHdvbid0IGhhcGVlbiB0b28gc29vbgorICAgICAgICBwUmVzdWx0LT5BZ2luZ0NvdW50ID0gKHRBTklfUzMyKXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uYWdpbmdDb3VudDsKKyAgICAgICAgcFJlc3VsdC0+UmVzdWx0LkJzc0Rlc2NyaXB0b3IublJlY2VpdmVkVGltZSA9ICh0QU5JX1RJTUVTVEFNUClwYWxHZXRUaWNrQ291bnQocE1hYy0+aEhkZCk7CisgICAgfQorCisgICAgcmV0dXJuIChmUmV0KTsKK30KKworCitlSGFsU3RhdHVzIGNzclNjYW5BZ2VSZXN1bHRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVHZXRTY2FuQ2huUnNwICpwU2NhbkNobkluZm8pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRMaXN0RWxlbSAqcEVudHJ5LCAqdG1wRW50cnk7CisgICAgdENzclNjYW5SZXN1bHQgKnBSZXN1bHQ7CisgICAgdExpbVNjYW5DaG4gKnBDaG5JbmZvOworICAgIHRBTklfVTggaTsKKworICAgIGNzckxMTG9jaygmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisgICAgZm9yKGkgPSAwOyBpIDwgcFNjYW5DaG5JbmZvLT5udW1DaG47IGkrKykKKyAgICB7CisgICAgICAgIHBDaG5JbmZvID0gJnBTY2FuQ2huSW5mby0+c2NhbkNobltpXTsKKyAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsIExMX0FDQ0VTU19OT0xPQ0sgKTsKKyAgICAgICAgd2hpbGUoIHBFbnRyeSApIAorICAgICAgICB7CisgICAgICAgICAgICB0bXBFbnRyeSA9IGNzckxMTmV4dCgmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgICAgIHBSZXN1bHQgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rICk7CisgICAgICAgICAgICBpZihwUmVzdWx0LT5SZXN1bHQuQnNzRGVzY3JpcHRvci5jaGFubmVsSWQgPT0gcENobkluZm8tPmNoYW5uZWxJZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUmVzdWx0LT5BZ2luZ0NvdW50LS07CisgICAgICAgICAgICAgICAgaWYocFJlc3VsdC0+QWdpbmdDb3VudCA8PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICIgYWdlIG91dCBkdWUgdG8gcmVmIGNvdW50Iik7CisgICAgICAgICAgICAgICAgICAgIGNzclNjYW5BZ2VPdXRCc3MocE1hYywgcFJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcEVudHJ5ID0gdG1wRW50cnk7CisgICAgICAgIH0KKyAgICB9CisgICAgY3NyTExVbmxvY2soJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QpOworCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2VuZE1CU2NhblJlcSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgc2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgICAgdENzclNjYW5SZXF1ZXN0ICpwU2NhblJlcSwgdFNjYW5SZXFQYXJhbSAqcFNjYW5SZXFQYXJhbSApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTaXJTbWVTY2FuUmVxICpwTXNnOworICAgIHRBTklfVTE2IG1zZ0xlbjsKKyAgICB0QU5JX1U4IGJzc2lkW1dOSV9DRkdfQlNTSURfTEVOXSA9IHswLCAwLCAwLCAwLCAwLCAwfTsKKyAgICB0U2lyU2NhblR5cGUgc2NhblR5cGUgPSBwU2NhblJlcS0+c2NhblR5cGU7CisgICAgdEFOSV9VMzIgbWluQ2huVGltZTsgICAgLy9pbiB1bml0cyBvZiBtaWxsaXNlY29uZHMKKyAgICB0QU5JX1UzMiBtYXhDaG5UaW1lOyAgICAvL2luIHVuaXRzIG9mIG1pbGxpc2Vjb25kcworICAgIHRBTklfVTMyIGk7CisgICAgdEFOSV9VOCBzZWxmTWFjQWRkcltXTklfQ0ZHX0JTU0lEX0xFTl07CisgICAgdEFOSV9VOCAqcFNlbGZNYWMgPSBOVUxMOworCisgICAgbXNnTGVuID0gKHRBTklfVTE2KShzaXplb2YoIHRTaXJTbWVTY2FuUmVxICkgLSBzaXplb2YoIHBNc2ctPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXIgKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgKCBzaXplb2YoIHBNc2ctPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXIgKSAqIHBTY2FuUmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzICkpICsKKyAgICAgICAgICAgICAgICAgICAoIHBTY2FuUmVxLT51SUVGaWVsZExlbiApIDsKKworICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTXNnLCBtc2dMZW4pOworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTXNnLCBtc2dMZW4pOworICAgICAgICAgICAgcE1zZy0+bWVzc2FnZVR5cGUgPSBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KWVXTklfU01FX1NDQU5fUkVRKTsKKyAgICAgICAgICAgIHBNc2ctPmxlbmd0aCA9IHBhbF9jcHVfdG9fYmUxNihtc2dMZW4pOworICAgICAgICAgICAgLy9Ub0RPOiBGaWxsIGluIHNlc3Npb24gaW5mbyB3aGVuIHdlIG5lZWQgdG8gZG8gc2NhbiBiYXNlIG9uIHNlc3Npb24uCisgICAgICAgICAgICBwTXNnLT5zZXNzaW9uSWQgPSAwOworICAgICAgICAgICAgcE1zZy0+dHJhbnNhY3Rpb25JZCA9IDA7CisgICAgICAgICAgICBwTXNnLT5kb3QxMW1vZGUgPSAodEFOSV9VOCkgY3NyVHJhbnNsYXRlVG9XTklDZmdEb3QxMU1vZGUocE1hYywgY3NyRmluZEJlc3RQaHlNb2RlKCBwTWFjLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUgKSk7CisgICAgICAgICAgICBwTXNnLT5ic3NUeXBlID0gcGFsX2NwdV90b19iZTMyKGNzclRyYW5zbGF0ZUJzc3R5cGVUb01hY1R5cGUocFNjYW5SZXEtPkJTU1R5cGUpKTsKKworICAgICAgICAgICAgaWYgKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwU2VsZk1hYyA9ICh0QU5JX1U4ICopJnBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5zZWxmTWFjQWRkcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBzZXNzaW9uIGZvciB0aGUgc2Nhbm5pbmcsIHdlIGZpbmQgYSB2YWxpZCBzZXNzaW9uLiBJbiBjYXNlIHdlIGZhaWwgdG8KKyAgICAgICAgICAgICAgLy8gZG8gc28sIGdldCB0aGUgV05JX0NGR19TVEFfSUQKKyAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKysgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBpICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBTZWxmTWFjID0gKHRBTklfVTggKikmcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltpXS5zZWxmTWFjQWRkcjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiggQ1NSX1JPQU1fU0VTU0lPTl9NQVggPT0gaSApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0QU5JX1UzMiBsZW4gPSBXTklfQ0ZHX0JTU0lEX0xFTjsKKyAgICAgICAgICAgICAgICBwU2VsZk1hYyA9IHNlbGZNYWNBZGRyOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNjbUNmZ0dldFN0ciggcE1hYywgV05JX0NGR19TVEFfSUQsIHBTZWxmTWFjLCAmbGVuICk7CisgICAgICAgICAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApIHx8IAorICAgICAgICAgICAgICAgICAgICAoIGxlbiA8IFdOSV9DRkdfQlNTSURfTEVOICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBDYW4gbm90IGdldCBzZWxmIE1BQyBhZGRyZXNzIGZyb20gQ0ZHIHN0YXR1cyA9ICVkIiksIHN0YXR1cyApOworICAgICAgICAgICAgICAgICAgLy9Gb3JjZSBmYWlsZWQgc3RhdHVzCisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXBNc2ctPnNlbGZNYWNBZGRyLCBwU2VsZk1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworCisgICAgICAgICAgICAvL3NpckNvcHlNYWNBZGRyCisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKXBNc2ctPmJzc0lkLCAodEFOSV9VOCAqKSZwU2NhblJlcS0+YnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyAgICAgICAgICAgIGlmKCBwYWxFcXVhbE1lbW9yeSggcE1hYy0+aEhkZCwgcFNjYW5SZXEtPmJzc2lkLCBic3NpZCwgc2l6ZW9mKHRDc3JCc3NpZCkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsRmlsbE1lbW9yeSggcE1hYy0+aEhkZCwgcE1zZy0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkciksIDB4ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBNc2ctPmJzc0lkLCBwU2NhblJlcS0+YnNzaWQsIFdOSV9DRkdfQlNTSURfTEVOKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtaW5DaG5UaW1lID0gcFNjYW5SZXEtPm1pbkNoblRpbWU7CisgICAgICAgICAgICBtYXhDaG5UaW1lID0gcFNjYW5SZXEtPm1heENoblRpbWU7CisKKyAgICAgICAgICAgIC8vVmVyaWZ5IHRoZSBzY2FuIHR5cGUgZmlyc3QsIGlmIHRoZSBzY2FuIGlzIGFjdGl2ZSBzY2FuLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSAKKyAgICAgICAgICAgIC8vYXJlIGFsbG93ZWQgdG8gZG8gc28uCisgICAgICAgICAgICAvKiBpZiAxMWQgaXMgZW5hYmxlZCAmIHdlIGRvbid0IHNlZSBhbnkgYmVhY29uIGFyb3VuZCwgc2NhbiB0eXBlIGZhbGxzCisgICAgICAgICAgICAgICBiYWNrIHRvIHBhc3NpdmUuIEJ1dCBpbiBCVCBBTVAgU1RBIG1vZGUgd2UgbmVlZCB0byBzZW5kIG91dCBhCisgICAgICAgICAgICAgICBkaXJlY3RlZCBwcm9iZSovCisgICAgICAgICAgICBpZiggKGVTSVJfUEFTU0lWRV9TQ0FOICE9IHNjYW5UeXBlKSAmJiAoZUNTUl9TQ0FOX1AyUF9ESVNDT1ZFUlkgIT0gcFNjYW5SZXEtPnJlcXVlc3RUeXBlKQorICAgICAgICAgICAgICAgICYmIChlQ1NSX0JTU19UWVBFX1dEU19TVEEgIT0gcFNjYW5SZXEtPkJTU1R5cGUpCisgICAgICAgICAgICAgICAgJiYgKGVBTklfQk9PTEVBTl9GQUxTRSA9PSBwTWFjLT5zY2FuLmZFbmFibGVCeXBhc3MxMWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjYW5UeXBlID0gcE1hYy0+c2Nhbi5jdXJTY2FuVHlwZTsKKyAgICAgICAgICAgICAgICBpZihlU0lSX1BBU1NJVkVfU0NBTiA9PSBwTWFjLT5zY2FuLmN1clNjYW5UeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYobWluQ2huVGltZSA8IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNaW5DaG5UaW1lKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluQ2huVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNaW5DaG5UaW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKG1heENoblRpbWUgPCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5QYXNzaXZlTWF4Q2huVGltZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q2huVGltZSA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublBhc3NpdmVNYXhDaG5UaW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcE1zZy0+c2NhblR5cGUgPSBwYWxfY3B1X3RvX2JlMzIoc2NhblR5cGUpOworCisgICAgICAgIHBNc2ctPm51bVNzaWQgPSAocFNjYW5SZXEtPlNTSURzLm51bU9mU1NJRHMgPCBTSVJfU0NBTl9NQVhfTlVNX1NTSUQpID8gcFNjYW5SZXEtPlNTSURzLm51bU9mU1NJRHMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfU0NBTl9NQVhfTlVNX1NTSUQ7CisgICAgICAgICAgICBpZigocFNjYW5SZXEtPlNTSURzLm51bU9mU1NJRHMgIT0gMCkgJiYgKCBlU0lSX1BBU1NJVkVfU0NBTiAhPSBzY2FuVHlwZSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBNc2ctPm51bVNzaWQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwTXNnLT5zc0lkW2ldLCAmcFNjYW5SZXEtPlNTSURzLlNTSURMaXN0W2ldLlNTSUQsIHNpemVvZih0U2lyTWFjU1NpZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vT3RoZXJ3aXNlIHdlIHNjYW4gYWxsIFNTSUQgYW5kIGxldCB0aGUgcmVzdWx0IGZpbHRlciBsYXRlcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNJUl9TQ0FOX01BWF9OVU1fU1NJRDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBNc2ctPnNzSWRbaV0ubGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworLy9UT0RPOiBUaGlzIHByZXByb2Nlc3NvciBtYWNybyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIENTUiBmb3IgcHJvZHVjdGlvbiBkcml2ZXIKKy8vVGhpcyBpcyBhIHRlbXBlcmFyb3J5IGZpeCBmb3Igc2Nhbm5pbmcgb24gRlBHQS4KKyNpZiBkZWZpbmVkIChBTklfQ0hJUFNFVF9WSVJHTykgfHwgZGVmaW5lZCAoTElCUkFfRlBHQSl8fCBkZWZpbmVkIChWT0xBTlNfRlBHQSkKKyAgICAgICAgICAgIHBNc2ctPm1pbkNoYW5uZWxUaW1lID0gcGFsX2NwdV90b19iZTMyKG1pbkNoblRpbWUgKiA4KTsKKyAgICAgICAgICAgIHBNc2ctPm1heENoYW5uZWxUaW1lID0gcGFsX2NwdV90b19iZTMyKG1heENoblRpbWUgKiA4KTsKKyNlbGlmIGRlZmluZWQgKEFOSV9DSElQU0VUX1RBVVJVUykgfHwgZGVmaW5lZChBTklfQ0hJUFNFVF9MSUJSQSkgfHwgZGVmaW5lZChBTklfQ0hJUFNFVF9WT0xBTlMpCisgICAgICAgICAgICBwTXNnLT5taW5DaGFubmVsVGltZSA9IHBhbF9jcHVfdG9fYmUzMihtaW5DaG5UaW1lKTsKKyAgICAgICAgICAgIHBNc2ctPm1heENoYW5uZWxUaW1lID0gcGFsX2NwdV90b19iZTMyKG1heENoblRpbWUpOworI2Vsc2UKKyNlcnJvciB1bmtub3duIGNoaXBzZXQKKyNlbmRpZgorICAgICAgICAgICAgLy9oaWRkZW4gU1NJRCBvcHRpb24KKyAgICAgICAgICAgIHBNc2ctPmhpZGRlblNzaWQgPSBwU2NhblJlcVBhcmFtLT5oaWRkZW5Tc2lkOworICAgICAgICAgICAgLy9yZXN0IHRpbWUKKyAgICAgICAgICAgIC8vcE1zZy0+cmVzdFRpbWUgPSBwU2NhblJlcS0+cmVzdFRpbWU7CisgICAgICAgICAgICBwTXNnLT5yZXR1cm5BZnRlckZpcnN0TWF0Y2ggPSBwU2NhblJlcVBhcmFtLT5iUmV0dXJuQWZ0ZXIxc3RNYXRjaDsKKyAgICAgICAgICAgIC8vIEFsbCB0aGUgc2NhbiByZXN1bHRzIGNhY2hpbmcgd2lsbCBiZSBkb25lIGJ5IFJvYW1pbmcKKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IExJTSB0byBkbyBhbnkgY2FjaGluZyBvZiBzY2FuIHJlc3VsdHMsCisgICAgICAgICAgICAvLyBzbyBkZWxldGUgdGhlIExJTSBjYWNoZSBvbiBhbGwgc2NhbiByZXF1ZXN0cworICAgICAgICAgICAgcE1zZy0+cmV0dXJuRnJlc2hSZXN1bHRzID0gcFNjYW5SZXFQYXJhbS0+ZnJlc2hTY2FuOworICAgICAgICAgICAgLy9BbHdheXMgYXNrIGZvciB1bmlxdWUgcmVzdWx0CisgICAgICAgICAgICBwTXNnLT5yZXR1cm5VbmlxdWVSZXN1bHRzID0gcFNjYW5SZXFQYXJhbS0+ZlVuaXF1ZVJlc3VsdDsKKyAgICAgICAgICAgIHBNc2ctPmNoYW5uZWxMaXN0Lm51bUNoYW5uZWxzID0gKHRBTklfVTgpcFNjYW5SZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHM7CisgICAgICAgICAgICBpZihwU2NhblJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0Fzc3VtaW5nIHRoZSBjaGFubmVsTnVtYmVyIGlzIHRBTklfVTggKDEgYnl0ZSkKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBNc2ctPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXIsIHBTY2FuUmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwTXNnLT51SUVGaWVsZExlbiA9ICh0QU5JX1UxNikgcFNjYW5SZXEtPnVJRUZpZWxkTGVuOworICAgICAgICAgICAgcE1zZy0+dUlFRmllbGRPZmZzZXQgPSAodEFOSV9VMTYpKHNpemVvZiggdFNpclNtZVNjYW5SZXEgKSAtIHNpemVvZiggcE1zZy0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlciApICsgCisgICAgICAgICAgICAgICAgICAoIHNpemVvZiggcE1zZy0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlciApICogcFNjYW5SZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgKSkgOworICAgICAgICAgICAgaWYocFNjYW5SZXEtPnVJRUZpZWxkTGVuICE9IDApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTggKilwTXNnK3BNc2ctPnVJRUZpZWxkT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXEtPnBJRUZpZWxkLCBwU2NhblJlcS0+dUlFRmllbGRMZW4gKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgICAgICBwTXNnLT5wMnBTZWFyY2ggPSBwU2NhblJlcS0+cDJwU2VhcmNoOworI2VuZGlmCisKKyAgICAgICAgfXdoaWxlKDApOworICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZShwTWFjLT5oSGRkLCBwTXNnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgICAgIH0KKyAgICB9Ly9TdWNjZXNzIGFsbG9jYXRlZCBtZW1vcnkKKworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworZUhhbFN0YXR1cyBjc3JTZW5kTUJTY2FuUmVzdWx0UmVxKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2NhblJlcVBhcmFtICpwU2NhblJlcVBhcmFtICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNpclNtZVNjYW5SZXEgKnBNc2c7CisgICAgdEFOSV9VMTYgbXNnTGVuOworCisgICAgbXNnTGVuID0gKHRBTklfVTE2KShzaXplb2YoIHRTaXJTbWVTY2FuUmVxICkpOworICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTXNnLCBtc2dMZW4pOworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTXNnLCBtc2dMZW4pOworICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfU0NBTl9SRVEpOworICAgICAgICBwTXNnLT5sZW5ndGggPSBwYWxfY3B1X3RvX2JlMTYobXNnTGVuKTsKKyAgICAgICAgcE1zZy0+c2Vzc2lvbklkID0gMDsKKyAgICAgICAgcE1zZy0+cmV0dXJuRnJlc2hSZXN1bHRzID0gcFNjYW5SZXFQYXJhbS0+ZnJlc2hTY2FuOworICAgICAgICAvL0Fsd2F5cyBhc2sgZm9yIHVuaXF1ZSByZXN1bHQKKyAgICAgICAgcE1zZy0+cmV0dXJuVW5pcXVlUmVzdWx0cyA9IHBTY2FuUmVxUGFyYW0tPmZVbmlxdWVSZXN1bHQ7CisgICAgICAgIHBNc2ctPnJldHVybkFmdGVyRmlyc3RNYXRjaCA9IHBTY2FuUmVxUGFyYW0tPmJSZXR1cm5BZnRlcjFzdE1hdGNoOworICAgICAgICBzdGF0dXMgPSBwYWxTZW5kTUJNZXNzYWdlKHBNYWMtPmhIZGQsIHBNc2cpOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworCisKK2VIYWxTdGF0dXMgY3NyU2NhbkNoYW5uZWxzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRTY2FuUmVxUGFyYW0gc2NhblJlcTsKKyAgICAKKyAgICBkbworICAgIHsgICAgCisgICAgICAgIHNjYW5SZXEuZnJlc2hTY2FuID0gQ1NSX1NNRV9TQ0FOX0ZMQUdTX0RFTEVURV9DQUNIRSB8IFRSVUU7CisgICAgICAgIHNjYW5SZXEuZlVuaXF1ZVJlc3VsdCA9IFRSVUU7CisgICAgICAgIHNjYW5SZXEuaGlkZGVuU3NpZCA9IFNJUl9TQ0FOX05PX0hJRERFTl9TU0lEOworICAgICAgICBpZihlQ3NyU2NhbkZvclNzaWQgPT0gcENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjYW5SZXEuYlJldHVybkFmdGVyMXN0TWF0Y2ggPSBDU1JfU0NBTl9SRVRVUk5fQUZURVJfRklSU1RfTUFUQ0g7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBCYXNpY2FsbHkgZG8gc2NhbiBvbiBhbGwgY2hhbm5lbHMgZXZlbiBmb3IgMTFEIDFzdCBzY2FuIGNhc2UuCisgICAgICAgICAgICBzY2FuUmVxLmJSZXR1cm5BZnRlcjFzdE1hdGNoID0gQ1NSX1NDQU5fUkVUVVJOX0FGVEVSX0FMTF9DSEFOTkVMUzsKKyAgICAgICAgfQorICAgICAgICBpZigoZUNzclNjYW5CZ1NjYW4gPT0gcENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pfHwKKyAgICAgICAgICAgKGVDc3JTY2FuUHJvYmVCc3MgPT0gcENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pKQorICAgICAgICB7CisgICAgICAgICAgICBzY2FuUmVxLmhpZGRlblNzaWQgPSBTSVJfU0NBTl9ISURERU5fU1NJRF9QRV9ERUNJU0lPTjsKKyAgICAgICAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKyAgICAgICAgeworICAgICAgICAgICAgdm9zX2xvZ19zY2FuX3BrdF90eXBlICpwU2NhbkxvZyA9IE5VTEw7CisKKyAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfTE9HX0FMTE9DKHBTY2FuTG9nLCB2b3NfbG9nX3NjYW5fcGt0X3R5cGUsIExPR19XTEFOX1NDQU5fQyk7CisgICAgICAgICAgICBpZihwU2NhbkxvZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihlQ3NyU2NhbkJnU2NhbiA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiB8fCAKKyAgICAgICAgICAgICAgICAgICAgZUNzclNjYW5Qcm9iZUJzcyA9PSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTY2FuTG9nLT5ldmVudElkID0gV0xBTl9TQ0FOX0VWRU5UX0hPX1NDQU5fUkVROworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggKGVTSVJfUEFTU0lWRV9TQ0FOICE9IHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5zY2FuVHlwZSkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAoZVNJUl9QQVNTSVZFX1NDQU4gIT0gcE1hYy0+c2Nhbi5jdXJTY2FuVHlwZSkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhbkxvZy0+ZXZlbnRJZCA9IFdMQU5fU0NBTl9FVkVOVF9BQ1RJVkVfU0NBTl9SRVE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhbkxvZy0+ZXZlbnRJZCA9IFdMQU5fU0NBTl9FVkVOVF9QQVNTSVZFX1NDQU5fUkVROworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBTY2FuTG9nLT5taW5DaG5UaW1lID0gKHZfVThfdClwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QubWluQ2huVGltZTsKKyAgICAgICAgICAgICAgICBwU2NhbkxvZy0+bWF4Q2huVGltZSA9ICh2X1U4X3QpcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1heENoblRpbWU7CisgICAgICAgICAgICAgICAgcFNjYW5Mb2ctPm51bUNoYW5uZWwgPSAodl9VOF90KXBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOworICAgICAgICAgICAgICAgIGlmKHBTY2FuTG9nLT5udW1DaGFubmVsICYmIChwU2NhbkxvZy0+bnVtQ2hhbm5lbCA8IFZPU19MT0dfTUFYX05VTV9DSEFOTkVMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5Mb2ctPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NhbkxvZy0+bnVtQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFdMQU5fVk9TX0RJQUdfTE9HX1JFUE9SVChwU2NhbkxvZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvLyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCisKKyAgICAgICAgc3RhdHVzID0gY3NyU2VuZE1CU2NhblJlcShwTWFjLCBwQ29tbWFuZC0+c2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LCAmc2NhblJlcSk7CisgICAgfXdoaWxlKDApOworICAgIAorICAgIHJldHVybiggc3RhdHVzICk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuUmV0cmlldmVSZXN1bHQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdFNjYW5SZXFQYXJhbSBzY2FuUmVxOworICAgIAorICAgIGRvCisgICAgeyAgICAKKyAgICAgICAgLy9ub3QgYSBmcmVzaCBzY2FuCisgICAgICAgIHNjYW5SZXEuZnJlc2hTY2FuID0gQ1NSX1NNRV9TQ0FOX0ZMQUdTX0RFTEVURV9DQUNIRTsKKyAgICAgICAgc2NhblJlcS5mVW5pcXVlUmVzdWx0ID0gVFJVRTsKKyAgICAgICAgc2NhblJlcS5iUmV0dXJuQWZ0ZXIxc3RNYXRjaCA9IENTUl9TQ0FOX1JFVFVSTl9BRlRFUl9BTExfQ0hBTk5FTFM7CisgICAgICAgIHN0YXR1cyA9IGNzclNlbmRNQlNjYW5SZXN1bHRSZXEocE1hYywgJnNjYW5SZXEpOworICAgIH13aGlsZSgwKTsKKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworCitlSGFsU3RhdHVzIGNzclByb2Nlc3NTY2FuQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0Q3NyQ2hhbm5lbEluZm8gbmV3Q2hhbm5lbEluZm8gPSB7MCwgTlVMTH07CisgICAgaW50IGksIGo7CisgICAgdEFOSV9VOCAqcENoYW5uZWwgPSBOVUxMOworICAgIHRBTklfVTMyIGxlbiA9IDA7CisKKyAgICAvLyBUcmFuc2l0aW9uIHRvIFNjYW5uaW5nIHN0YXRlLi4uCisgICAgZm9yKCBpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKysgKQorICAgIHsKKyAgICAgICBpZihDU1JfSVNfU0VTU0lPTl9WQUxJRChwTWFjLCBpKSkKKyAgICAgICB7CisgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLmxhc3RSb2FtU3RhdGVbaV0gPSBjc3JSb2FtU3RhdGVDaGFuZ2UoIHBNYWMsIGVDU1JfUk9BTUlOR19TVEFURV9TQ0FOTklORywgaSk7CisgICAgICBzbXNMb2coIHBNYWMsIExPRzMsICJzdGFydGluZyBTQ0FOIGNvbW1hbmQgZnJvbSAlZCBzdGF0ZS4uLi4gcmVhc29uIGlzICVkXG4iLCBwQ29tbWFuZC0+dS5zY2FuQ21kLmxhc3RSb2FtU3RhdGVbaV0sIHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uICk7CisgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaChwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbikKKyAgICB7CisgICAgY2FzZSBlQ3NyU2NhbkdldFJlc3VsdDoKKyAgICBjYXNlIGVDc3JTY2FuRm9yQ2Fwc0NoYW5nZTogICAgIC8vRm9yIGNhcCBjaGFuZ2UsIExJTSBhbHJlYWR5IHNhdmUgQlNTIGRlc2NyaXB0aW9uCisgICAgICAgIHN0YXR1cyA9IGNzclNjYW5SZXRyaWV2ZVJlc3VsdChwTWFjKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ3NyU2NhblNldEJHU2NhblBhcmFtOgorICAgICAgICBzdGF0dXMgPSBjc3JQcm9jZXNzU2V0QkdTY2FuUGFyYW0ocE1hYywgcENvbW1hbmQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGVDc3JTY2FuQkdTY2FuQWJvcnQ6CisgICAgICAgIHN0YXR1cyA9IGNzclNldENmZ0JhY2tncm91bmRTY2FuUGVyaW9kKHBNYWMsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGVDc3JTY2FuQkdTY2FuRW5hYmxlOgorICAgICAgICBzdGF0dXMgPSBjc3JTZXRDZmdCYWNrZ3JvdW5kU2NhblBlcmlvZChwTWFjLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmJnU2NhbkludGVydmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ3NyU2NhbkdldFNjYW5DaG5JbmZvOgorICAgICAgICBzdGF0dXMgPSBjc3JTY2FuR2V0U2NhbkNoYW5uZWxJbmZvKHBNYWMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGVDc3JTY2FuVXNlclJlcXVlc3Q6CisgICAgICAgIGlmKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZlNjYW5Ud2ljZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9XZSBzY2FuIDIuNCBjaGFubmVsIHR3aWNlCisgICAgICAgICAgICBpZihwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyAmJgorICAgICAgICAgICAgICAgKE5VTEwgIT0gcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKyAgICAgICAgICAgICAgICAvL2FsbG9jYXRlIHR3aWNlIHRoZSBjaGFubmVsCisgICAgICAgICAgICAgICAgbmV3Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSAodEFOSV9VOCAqKXZvc19tZW1fbWFsbG9jKG5ld0NoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgKiAyKTsKKyAgICAgICAgICAgICAgICBwQ2hhbm5lbCA9IHBDb21tYW5kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2dldCB0aGUgdmFsaWQgY2hhbm5lbCBsaXN0IHRvIHNjYW4gYWxsLgorICAgICAgICAgICAgICAgIGxlbiA9IHNpemVvZihwTWFjLT5yb2FtLnZhbGlkQ2hhbm5lbExpc3QpOworCisgICAgICAgICAgICAgICAgaWYgKEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRDZmdWYWxpZENoYW5uZWxzKHBNYWMsICh0QU5JX1U4ICopcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCAmbGVuKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2FsbG9jYXRlIHR3aWNlIHRoZSBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgIG5ld0NoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gKHRBTklfVTggKil2b3NfbWVtX21hbGxvYyhsZW4gKiAyKTsKKyAgICAgICAgICAgICAgICAgICAgcENoYW5uZWwgPSBwTWFjLT5yb2FtLnZhbGlkQ2hhbm5lbExpc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoTlVMTCA9PSBuZXdDaGFubmVsSW5mby5DaGFubmVsTGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdDaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld0NoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W2orK10gPSBwQ2hhbm5lbFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoQ1NSX01BWF8yNEdIel9DSEFOTkVMX05VTUJFUiA+PSBwQ2hhbm5lbFtpXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaisrXSA9IHBDaGFubmVsW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9wQ2hhbm5lbCBwb2ludHMgdG8gdGhlIGNoYW5uZWxsaXN0IGZyb20gdGhlIGNvbW1hbmQsIGZyZWUgaXQuCisgICAgICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZShwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IGo7CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gbmV3Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy9pZihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZTY2FuVHdpY2UpCisKKyAgICAgICAgc3RhdHVzID0gY3NyU2NhbkNoYW5uZWxzKHBNYWMsIHBDb21tYW5kKTsKKworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBjc3JTY2FuQ2hhbm5lbHMocE1hYywgcENvbW1hbmQpOworICAgICAgICBicmVhazsKKyAgICB9ICAgIAorICAgIAorICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIGNzclJlbGVhc2VTY2FuQ29tbWFuZChwTWFjLCBwQ29tbWFuZCwgZUNTUl9TQ0FOX0ZBSUxVUkUpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuU2V0QkdTY2FucGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JCR1NjYW5SZXF1ZXN0ICpwU2NhblJlcSkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNtZUNtZCAqcENvbW1hbmQgPSBOVUxMOworICAgIAorICAgIGlmKHBTY2FuUmVxKQorICAgIHsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgcENvbW1hbmQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOworICAgICAgICAgICAgaWYoIXBDb21tYW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBDb21tYW5kLT51LnNjYW5DbWQsIHNpemVvZih0U2NhbkNtZCkpOworICAgICAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFNjYW47CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbiA9IGVDc3JTY2FuU2V0QkdTY2FuUGFyYW07CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLmNhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucENvbnRleHQgPSBOVUxMOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcENvbW1hbmQtPnUuc2NhbkNtZC51LmJnU2NhblJlcXVlc3QsIHBTY2FuUmVxLCBzaXplb2YodENzckJHU2NhblJlcXVlc3QpKTsKKyAgICAgICAgICAgIC8vd2UgaGF2ZSB0byBkbyB0aGUgZm9sbG93CisgICAgICAgICAgICBpZihwU2NhblJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5iZ1NjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcENvbW1hbmQtPnUuc2NhbkNtZC51LmJnU2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyk7CisgICAgICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBDb21tYW5kLT51LnNjYW5DbWQudS5iZ1NjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LCBwU2NhblJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyk7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoInJhbiBvdXQgb2YgbWVtb3J5XG4iKSk7CisgICAgICAgICAgICAgICAgICAgIGNzclJlbGVhc2VDb21tYW5kU2NhbihwTWFjLCBwQ29tbWFuZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9zY2FuIHJlcSBmb3IgU1NJRAorICAgICAgICAgICAgaWYocFNjYW5SZXEtPlNTSUQubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC51LmJnU2NhblJlcXVlc3QuU1NJRC5zc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlcS0+U1NJRC5zc0lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXEtPlNTSUQubGVuZ3RoKTsKKyAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5iZ1NjYW5SZXF1ZXN0LlNTSUQubGVuZ3RoID0gcFNjYW5SZXEtPlNTSUQubGVuZ3RoOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnUuYmdTY2FuUmVxdWVzdC5tYXhDaG5UaW1lPSBwU2NhblJlcS0+bWF4Q2huVGltZTsKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5iZ1NjYW5SZXF1ZXN0Lm1pbkNoblRpbWUgPSBwU2NhblJlcS0+bWluQ2huVGltZTsKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQudS5iZ1NjYW5SZXF1ZXN0LnNjYW5JbnRlcnZhbCA9IHBTY2FuUmVxLT5zY2FuSW50ZXJ2YWw7CisKKworICAgICAgICAgICAgc3RhdHVzID0gY3NyUXVldWVTbWVDb21tYW5kKHBNYWMsIHBDb21tYW5kLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBzZW5kIG1lc3NhZ2Ugc3RhdHVzID0gJWRcbiIpLCBzdGF0dXMgKTsKKyAgICAgICAgICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZFNjYW4oIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH13aGlsZSgwKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCitlSGFsU3RhdHVzIGNzclNjYW5CR1NjYW5BYm9ydCggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKyAgICAKKyAgICBkbworICAgIHsKKyAgICAgICAgcENvbW1hbmQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOworICAgICAgICBpZighcENvbW1hbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBDb21tYW5kLT51LnNjYW5DbWQsIHNpemVvZih0U2NhbkNtZCkpOworICAgICAgICBwQ29tbWFuZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kU2NhbjsgCisgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW5CR1NjYW5BYm9ydDsKKyAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC5jYWxsYmFjayA9IE5VTEw7CisgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQucENvbnRleHQgPSBOVUxMOworICAgICAgICBzdGF0dXMgPSBjc3JRdWV1ZVNtZUNvbW1hbmQocE1hYywgcENvbW1hbmQsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyApOworICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRTY2FuKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKy8vVGhpcyB3aWxsIGVuYWJsZSB0aGUgYmFja2dyb3VuZCBzY2FuIHdpdGggdGhlIG5vbi16ZXJvIGludGVydmFsIAorZUhhbFN0YXR1cyBjc3JTY2FuQkdTY2FuRW5hYmxlKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTbWVDbWQgKnBDb21tYW5kID0gTlVMTDsKKyAgICAKKyAgICBpZihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmJnU2NhbkludGVydmFsKQorICAgIHsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgcENvbW1hbmQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOworICAgICAgICAgICAgaWYoIXBDb21tYW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBDb21tYW5kLT51LnNjYW5DbWQsIHNpemVvZih0U2NhbkNtZCkpOworICAgICAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBlU21lQ29tbWFuZFNjYW47IAorICAgICAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24gPSBlQ3NyU2NhbkJHU2NhbkVuYWJsZTsKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQuY2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICAgcENvbW1hbmQtPnUuc2NhbkNtZC5wQ29udGV4dCA9IE5VTEw7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JRdWV1ZVNtZUNvbW1hbmQocE1hYywgcENvbW1hbmQsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyApOworICAgICAgICAgICAgICAgIGNzclJlbGVhc2VDb21tYW5kU2NhbiggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfXdoaWxlKDApOworICAgICAgICAvL0JHIHNjYW4gcmVzdWx0cyBhcmUgcmVwb3J0ZWQgYXV0b21hdGljYWxseSBieSBQRSB0byBTTUUgb25jZSB0aGUgc2NhbiBpcyBkb25lLgorICAgICAgICAvL05vIG5lZWQgdG8gZmV0Y2ggdGhlIHJlc3VsdHMgZXhwbGljaXRseS4KKyAgICAgICAgLy9jc3JTY2FuU3RhcnRHZXRSZXN1bHRUaW1lcihwTWFjKTsKKyAgICAgICAgY3NyU2NhblN0YXJ0UmVzdWx0QWdpbmdUaW1lcihwTWFjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9XZSBkb24ndCBoYXZlIEJHIHNjYW4gc28gc3RvcCB0aGUgYWdpbmcgdGltZXIKKyAgICAgICAgY3NyU2NhblN0b3BSZXN1bHRBZ2luZ1RpbWVyKHBNYWMpOworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNhbm5vdCBjb250aW51ZSBiZWNhdXNlIHRoZSBiZ3NjYW4gaW50ZXJ2YWwgaXMgMFxuIikpOworICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2NhbkNvcHlSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTY2FuUmVxdWVzdCAqcERzdFJlcSwgdENzclNjYW5SZXF1ZXN0ICpwU3JjUmVxKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiBsZW4gPSBzaXplb2YocE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0KTsKKyAgICB0QU5JX1UzMiBpbmRleCA9IDA7CisgICAgdEFOSV9VMzIgbmV3X2luZGV4ID0gMDsKKworICAgIGRvCisgICAgeworICAgICAgICBzdGF0dXMgPSBjc3JTY2FuRnJlZVJlcXVlc3QocE1hYywgcERzdFJlcSk7CisgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBEc3RSZXEsIHBTcmNSZXEsIHNpemVvZih0Q3NyU2NhblJlcXVlc3QpKTsKKyAgICAgICAgICAgIGlmKHBTcmNSZXEtPnVJRUZpZWxkTGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFJlcS0+cElFRmllbGQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRHN0UmVxLT5wSUVGaWVsZCwgcFNyY1JlcS0+dUlFRmllbGRMZW4pOworICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwRHN0UmVxLT5wSUVGaWVsZCwgcFNyY1JlcS0+cElFRmllbGQsIHBTcmNSZXEtPnVJRUZpZWxkTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcERzdFJlcS0+dUlFRmllbGRMZW4gPSBwU3JjUmVxLT51SUVGaWVsZExlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJObyBtZW1vcnkgZm9yIHNjYW5uaW5nIElFIGZpZWxkc1xuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0vL0FsbG9jYXRlIG1lbW9yeSBmb3IgSUUgZmllbGQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwU3JjUmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRHN0UmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwRHN0UmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBEc3RSZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzICogc2l6ZW9mKCpwRHN0UmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCkpOworICAgICAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RSZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJObyBtZW1vcnkgZm9yIHNjYW5uaW5nIENoYW5uZWwgTGlzdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKChwU3JjUmVxLT5zY2FuVHlwZSA9PSBlU0lSX1BBU1NJVkVfU0NBTikgJiYgKHBTcmNSZXEtPnJlcXVlc3RUeXBlID09IGVDU1JfU0NBTl9SRVFVRVNUXzExRF9TQ0FOKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgcFNyY1JlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA7IGluZGV4KysgKQorICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RSZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W25ld19pbmRleF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICBwRHN0UmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gbmV3X2luZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoSEFMX1NUQVRVU19TVUNDRVNTKGNzckdldENmZ1ZhbGlkQ2hhbm5lbHMocE1hYywgcE1hYy0+cm9hbS52YWxpZENoYW5uZWxMaXN0LCAmbGVuKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLm51bVZhbGlkQ2hhbm5lbHMgPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgcFNyY1JlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA7IGluZGV4KysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNzclJvYW1Jc1ZhbGlkQ2hhbm5lbChwTWFjLCBwU3JjUmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpbmRleF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdFJlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbbmV3X2luZGV4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19pbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RSZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSBuZXdfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIkNvdWxkbid0IGdldCB0aGUgdmFsaWQgQ2hhbm5lbCBMaXN0LCBrZWVwaW5nIHJlcXVlc3RlcidzIGxpc3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwRHN0UmVxLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCwgcFNyY1JlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgKiBzaXplb2YoKnBEc3RSZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwRHN0UmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gcFNyY1JlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vL0FsbG9jYXRlIG1lbW9yeSBmb3IgQ2hhbm5lbCBMaXN0CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwU3JjUmVxLT5TU0lEcy5udW1PZlNTSURzID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFJlcS0+U1NJRHMubnVtT2ZTU0lEcyA9IDA7CisgICAgICAgICAgICAgICAgcERzdFJlcS0+U1NJRHMuU1NJRExpc3QgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRHN0UmVxLT5TU0lEcy5TU0lETGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVxLT5TU0lEcy5udW1PZlNTSURzICogc2l6ZW9mKCpwRHN0UmVxLT5TU0lEcy5TU0lETGlzdCkpOworICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcERzdFJlcS0+U1NJRHMubnVtT2ZTU0lEcyA9IHBTcmNSZXEtPlNTSURzLm51bU9mU1NJRHM7CisgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcERzdFJlcS0+U1NJRHMuU1NJRExpc3QsIHBTcmNSZXEtPlNTSURzLlNTSURMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZXEtPlNTSURzLm51bU9mU1NJRHMgKiBzaXplb2YoKnBEc3RSZXEtPlNTSURzLlNTSURMaXN0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBEc3RSZXEtPlNTSURzLm51bU9mU1NJRHMgPSAwOworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIk5vIG1lbW9yeSBmb3Igc2Nhbm5pbmcgU1NJRCBMaXN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS8vQWxsb2NhdGUgbWVtb3J5IGZvciBTU0lEIExpc3QKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICAgICAgICBwRHN0UmVxLT5wMnBTZWFyY2ggPSBwU3JjUmVxLT5wMnBTZWFyY2g7CisjZW5kaWYKKworICAgICAgICB9CisgICAgfXdoaWxlKDApOworICAgIAorICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIGNzclNjYW5GcmVlUmVxdWVzdChwTWFjLCBwRHN0UmVxKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2NhbkZyZWVSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTY2FuUmVxdWVzdCAqcFJlcSkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgCisgICAgaWYocFJlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpCisgICAgeworICAgICAgICBzdGF0dXMgPSBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBSZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KTsKKyAgICAgICAgcFJlcS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworICAgIH0KKyAgICBwUmVxLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMDsKKyAgICBpZihwUmVxLT5wSUVGaWVsZCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFJlcS0+cElFRmllbGQpOworICAgICAgICBwUmVxLT5wSUVGaWVsZCA9IE5VTEw7CisgICAgfQorICAgIHBSZXEtPnVJRUZpZWxkTGVuID0gMDsKKyAgICBpZihwUmVxLT5TU0lEcy5TU0lETGlzdCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFJlcS0+U1NJRHMuU1NJRExpc3QpOworICAgICAgICBwUmVxLT5TU0lEcy5TU0lETGlzdCA9IE5VTEw7CisgICAgfQorICAgIHBSZXEtPlNTSURzLm51bU9mU1NJRHMgPSAwOworICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCit2b2lkIGNzclNjYW5DYWxsQ2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIGVDc3JTY2FuU3RhdHVzIHNjYW5TdGF0dXMpCit7CisgICAgaWYocENvbW1hbmQtPnUuc2NhbkNtZC5jYWxsYmFjaykKKyAgICB7CisvLyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQuY2FsbGJhY2socE1hYywgcENvbW1hbmQtPnUuc2NhbkNtZC5wQ29udGV4dCwgcENvbW1hbmQtPnUuc2NhbkNtZC5zY2FuSUQsIHNjYW5TdGF0dXMpOyAKKy8vICAgICAgICBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICIlczolZCAtIENhbGxiYWNrIE5VTEwhISFcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgIH0KK30KKworCit2b2lkIGNzclNjYW5TdG9wVGltZXJzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgY3NyU2NhblN0b3BSZXN1bHRBZ2luZ1RpbWVyKHBNYWMpOworICAgIGNzclNjYW5TdG9wSWRsZVNjYW5UaW1lcihwTWFjKTsKKyAgICBjc3JTY2FuU3RvcEdldFJlc3VsdFRpbWVyKHBNYWMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2NhblN0YXJ0R2V0UmVzdWx0VGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICAKKyAgICBpZihwTWFjLT5zY2FuLmZTY2FuRW5hYmxlKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gcGFsVGltZXJTdGFydChwTWFjLT5oSGRkLCBwTWFjLT5zY2FuLmhUaW1lckdldFJlc3VsdCwgQ1NSX1NDQU5fR0VUX1JFU1VMVF9JTlRFUlZBTCwgZUFOSV9CT09MRUFOX1RSVUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuU3RvcEdldFJlc3VsdFRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgcmV0dXJuIChwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5oVGltZXJHZXRSZXN1bHQpKTsKK30KKworCit2b2lkIGNzclNjYW5HZXRSZXN1bHRUaW1lckhhbmRsZXIodm9pZCAqcHYpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBwdiApOworICAgIAorICAgIGNzclNjYW5SZXF1ZXN0UmVzdWx0KHBNYWMpOworfQorCisjaWZkZWYgV0xBTl9BUF9TVEFfQ09OQ1VSUkVOQ1kKK3N0YXRpYyB2b2lkIGNzclN0YUFwQ29uY1RpbWVySGFuZGxlcih2b2lkICpwdikKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIHB2ICk7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdFNtZUNtZCAqcFNjYW5DbWQ7CisKKyAgICBjc3JMTExvY2soJnBNYWMtPnNjYW4uc2NhbkNtZFBlbmRpbmdMaXN0KTsKKworICAgIGlmICggTlVMTCAhPSAoIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCwgTExfQUNDRVNTX05PTE9DSykgKSApCisgICAgeyAgICAKKyAgICAgICAgdENzclNjYW5SZXF1ZXN0IHNjYW5SZXE7CisgICAgICAgIHRTbWVDbWQgKnBTZW5kU2NhbkNtZCA9IE5VTEw7CisgICAgICAgIHRBTklfVTggbnVtQ2huID0gMDsKKyAgICAgICAgdEFOSV9VOCBpOworICAgICAgICB0Q3NyQ2hhbm5lbEluZm8gKnBDaG5JbmZvID0gJnNjYW5SZXEuQ2hhbm5lbEluZm87CisgICAgICAgIHRBTklfVTggICAgY2hhbm5lbFRvU2NhbltXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVF9MRU5dOworICAgICAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICAgICAKKworICAgICAgICBwU2NhbkNtZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworICAgICAgICBudW1DaG4gPSBwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKyAgICAgICAgaWYgKG51bUNobiA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZzY2FuUmVxLCBzaXplb2YodENzclNjYW5SZXF1ZXN0KSk7CisKKyAgICAgICAgICAgICBwU2VuZFNjYW5DbWQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOyAvL29wdGltaXplIHRoaXMgdG8gdXNlIDIgY29tbWFuZCBidWZmZXIgb25seQorICAgICAgICAgICAgIGlmICghcFNlbmRTY2FuQ21kKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIEZhaWxlZCB0byBnZXQgUXVldWUgY29tbWFuZCBidWZmZXJcbiIpICk7CisgICAgICAgICAgICAgICAgIGNzckxMVW5sb2NrKCZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCk7CisgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcFNlbmRTY2FuQ21kLT5jb21tYW5kID0gcFNjYW5DbWQtPmNvbW1hbmQ7IAorICAgICAgICAgICAgIHBTZW5kU2NhbkNtZC0+c2Vzc2lvbklkID0gcFNjYW5DbWQtPnNlc3Npb25JZDsKKyAgICAgICAgICAgICBwU2VuZFNjYW5DbWQtPnUuc2NhbkNtZC5jYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICAgcFNlbmRTY2FuQ21kLT51LnNjYW5DbWQucENvbnRleHQgPSBwU2NhbkNtZC0+dS5zY2FuQ21kLnBDb250ZXh0OworICAgICAgICAgICAgIHBTZW5kU2NhbkNtZC0+dS5zY2FuQ21kLnJlYXNvbiA9IHBTY2FuQ21kLT51LnNjYW5DbWQucmVhc29uOworICAgICAgICAgICAgIHBTZW5kU2NhbkNtZC0+dS5zY2FuQ21kLnNjYW5JRCA9IHBNYWMtPnNjYW4ubmV4dFNjYW5JRCsrOyAvL2xldCBpdCB3cmFwIGFyb3VuZAorCisgICAgICAgICAgICAgcENobkluZm8tPm51bU9mQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJmNoYW5uZWxUb1NjYW5bMF0sICZwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAxICogc2l6ZW9mKHRBTklfVTgpKTsgLy9qdXN0IHNlbmQgb25lIGNoYW5uZWwKKyAgICAgICAgICAgICBwQ2huSW5mby0+Q2hhbm5lbExpc3QgPSAmY2hhbm5lbFRvU2NhblswXTsKKworICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAobnVtQ2huLTIpOyBpKyspCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaV0gPSAKKyAgICAgICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W2krMV07IC8vTW92ZSBhbGwgdGhlIGNoYW5uZWxzIG9uZSBzdGVwCisgICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gbnVtQ2huIC0xOyAvL3JlZHVjZSBvdXRzdGFuZGluZyAjIG9mIGNoYW5uZWxzIHRvIGJlIHNjYW5uZWQKKworICAgICAgICAgICAgIHNjYW5SZXEuQlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworICAgICAgICAgICAgIC8vTW9kaWZ5IGNhbGxlcnMgcGFyYW1ldGVycyBpbiBjYXNlIG9mIGNvbmN1cnJlbmN5CisgICAgICAgICAgICAgc2NhblJlcS5zY2FuVHlwZSA9IGVTSVJfQUNUSVZFX1NDQU47CisgICAgICAgICAgICAgc2NhblJlcS5tYXhDaG5UaW1lID0gQ1NSX01JTihwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QubWF4Q2huVGltZSxDU1JfQUNUSVZFX01BWF9DSEFOTkVMX1RJTUVfQ09OQyk7CisgICAgICAgICAgICAgc2NhblJlcS5taW5DaG5UaW1lID0gIENTUl9NSU4ocFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0Lm1pbkNoblRpbWUsQ1NSX0FDVElWRV9NSU5fQ0hBTk5FTF9USU1FX0NPTkMpOworCisgICAgICAgICAgICAgc3RhdHVzID0gY3NyU2NhbkNvcHlSZXF1ZXN0KHBNYWMsICZwU2VuZFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LCAmc2NhblJlcSk7CisgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIEZhaWxlZCB0byBnZXQgY29weSBjc3JTY2FuUmVxdWVzdCA9ICVkXG4iKSwgc3RhdHVzICk7CisgICAgICAgICAgICAgICAgIGNzckxMVW5sb2NrKCZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCk7CisgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICB9ICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgICAvL251bUNobiA9PTEgVGhpcyBpcyB0aGUgbGFzdCBjaGFubmVsIHRvIGJlIHNjYW5uZWQKKyAgICAgICAgICAgICAvL2xhc3QgY2hhbm5lbCByZW1haW5pbmcgdG8gc2NhbgorICAgICAgICAgICAgIHBTZW5kU2NhbkNtZCA9IHBTY2FuQ21kOworICAgICAgICAgICAgIC8vcmVtb3ZlIHRoaXMgY29tbWFuZCBmcm9tIHBlbmRpbmcgbGlzdCAKKyAgICAgICAgICAgICBpZiAoY3NyTExSZW1vdmVIZWFkKCAmcE1hYy0+c2Nhbi5zY2FuQ21kUGVuZGluZ0xpc3QsIExMX0FDQ0VTU19OT0xPQ0spID09IE5VTEwpCisgICAgICAgICAgICAgeyAvL0luIGNhc2UgYmV0d2VlbiBQZWVrSGVhZCBhbmQgaGVyZSwgdGhlIGVudHJ5IGdvdCByZW1vdmVkIGJ5IGFub3RoZXIgdGhyZWFkLgorICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgRmFpbGVkIHRvIHJlbW92ZSBlbnRyeSBmcm9tIHNjYW5DbWRQZW5kaW5nTGlzdFxuIikpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgIGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwU2VuZFNjYW5DbWQsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisKKyAgICB9CisKKyAgICBpZiAoIWNzckxMSXNMaXN0RW1wdHkoICZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCwgTExfQUNDRVNTX05PTE9DSyApKQorICAgIHsKKyAgICAgICAgIHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5oVGltZXJTdGFBcENvbmNUaW1lciwgCisgICAgICAgICAgICAgICAgIENTUl9TQ0FOX1NUQUFQX0NPTkNfSU5URVJWQUwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgfQorICAgIGNzckxMVW5sb2NrKCZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCk7CisgICAgCit9CisjZW5kaWYKKworZUhhbFN0YXR1cyBjc3JTY2FuU3RhcnRSZXN1bHRBZ2luZ1RpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgCisgICAgaWYocE1hYy0+c2Nhbi5mU2NhbkVuYWJsZSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5oVGltZXJSZXN1bHRBZ2luZywgQ1NSX1NDQU5fUkVTVUxUX0FHSU5HX0lOVEVSVkFMLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzclNjYW5TdG9wUmVzdWx0QWdpbmdUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHJldHVybiAocGFsVGltZXJTdG9wKHBNYWMtPmhIZGQsIHBNYWMtPnNjYW4uaFRpbWVyUmVzdWx0QWdpbmcpKTsKK30KKworCisvL1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWF4aW11bSB0aW1lIGEgQlNTIGlzIGFsbG93ZWQgaW4gdGhlIHNjYW4gcmVzdWx0LgorLy9UaGUgdGltZSB2YXJpZXMgYmFzZSBvbiBjb25uZWN0aW9uIGFuZCBwb3dlciBzYXZpbmcgZmFjdG9ycy4KKy8vTm90IGNvbm5lY3RlZCwgTm8gUFMKKy8vTm90IGNvbm5lY3RlZCwgd2l0aCBQUworLy9Db25uZWN0ZWQgdy9vIHRyYWZmaWMsIE5vIFBTCisvL0Nvbm5lY3RlZCB3L28gdHJhZmZpYywgd2l0aCBQUworLy9Db25uZWN0ZWQgdy8gdHJhZmZpYywgbm8gUFMgLS0gTm90IHN1cHBvcnRlZAorLy9Db25uZWN0ZWQgdy8gdHJhZmZpYywgd2l0aCBQUyAtLSBOb3Qgc3VwcG9ydGVkCisvL3RoZSByZXR1cm4gdW5pdCBpcyBpbiBzZWNvbmRzLiAKK3RBTklfVTMyIGNzclNjYW5HZXRBZ2VPdXRUaW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VMzIgblJldDsKKworICAgIGlmKHBNYWMtPnNjYW4ubkFnaW5nQ291bnREb3duKQorICAgIHsKKyAgICAgICAgLy9DYWxjdWxhdGUgd2hhdCBzaG91bGQgYmUgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIHRoaXMKKyAgICAgICAgblJldCA9IHBNYWMtPnNjYW4ubkxhc3RBZ2VUaW1lT3V0ICogcE1hYy0+c2Nhbi5uQWdpbmdDb3VudERvd247CisgICAgICAgIHBNYWMtPnNjYW4ubkFnaW5nQ291bnREb3duLS07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBjc3JJc0FsbFNlc3Npb25EaXNjb25uZWN0ZWQoIHBNYWMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBtY0lzUG93ZXJTYXZlRW5hYmxlZChwTWFjLCBlUE1DX0lETEVfTU9ERV9QT1dFUl9TQVZFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuUmV0ID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5zY2FuQWdlVGltZU5DUFM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgblJldCA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uc2NhbkFnZVRpbWVOQ05QUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBtY0lzUG93ZXJTYXZlRW5hYmxlZChwTWFjLCBlUE1DX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5SZXQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNjYW5BZ2VUaW1lQ1BTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5SZXQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnNjYW5BZ2VUaW1lQ05QUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL0lmIHN0YXRlLWNoYW5nZSBjYXVzaW5nIGFnaW5nIHRpbWUgb3V0IGNoYW5nZSwgd2Ugd2FudCB0byBkZWxheSBpdCBzb21ld2hhdCB0byBhdm9pZAorICAgICAgICAvL3VubmVjZXNzYXJ5IHJlbW92YWwgb2YgQlNTLiBUaGlzIGlzIG1vc3RseSBkdWUgdG8gdHJhbnNpdGlvbiBmcm9tIGNvbm5lY3QgdG8gZGlzY29ubmVjdC4KKyAgICAgICAgaWYocE1hYy0+c2Nhbi5uTGFzdEFnZVRpbWVPdXQgPiBuUmV0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihuUmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4ubkFnaW5nQ291bnREb3duID0gKHBNYWMtPnNjYW4ubkxhc3RBZ2VUaW1lT3V0IC8gblJldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwTWFjLT5zY2FuLm5MYXN0QWdlVGltZU91dCA9IG5SZXQ7CisgICAgICAgICAgICBuUmV0ICo9IHBNYWMtPnNjYW4ubkFnaW5nQ291bnREb3duOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+c2Nhbi5uTGFzdEFnZVRpbWVPdXQgPSBuUmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChuUmV0KTsKK30KKworCit2b2lkIGNzclNjYW5SZXN1bHRBZ2luZ1RpbWVySGFuZGxlcih2b2lkICpwdikKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIHB2ICk7CisgICAgdEFOSV9CT09MRUFOIGZEaXNjb25uZWN0ZWQgPSBjc3JJc0FsbFNlc3Npb25EaXNjb25uZWN0ZWQocE1hYyk7CisgICAgCisgICAgLy9ubyBzY2FuLCBubyBhZ2luZworICAgIGlmKHBNYWMtPnNjYW4uZlNjYW5FbmFibGUgJiYgCisgICAgICAgICgoKGVBTklfQk9PTEVBTl9GQUxTRSA9PSBmRGlzY29ubmVjdGVkKSAmJiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmJnU2NhbkludGVydmFsKSAgICAKKyAgICAgICAgfHwgKGZEaXNjb25uZWN0ZWQgJiYgKHBNYWMtPnNjYW4uZkNhbmNlbElkbGVTY2FuID09IGVBTklfQk9PTEVBTl9GQUxTRSkpKQorICAgICAgICApCisgICAgeworICAgICAgICB0TGlzdEVsZW0gKnBFbnRyeSwgKnRtcEVudHJ5OworICAgICAgICB0Q3NyU2NhblJlc3VsdCAqcFJlc3VsdDsKKyAgICAgICAgdEFOSV9USU1FU1RBTVAgYWdlT3V0VGltZSA9ICh0QU5JX1RJTUVTVEFNUCkoY3NyU2NhbkdldEFnZU91dFRpbWUocE1hYykgKiBQQUxfVElDS1NfUEVSX1NFQ09ORCk7IC8vdHVybiBpdCBpbnRvIDEwbXMgdW5pdHMKKyAgICAgICAgdEFOSV9USU1FU1RBTVAgY3VyVGltZSA9ICh0QU5JX1RJTUVTVEFNUClwYWxHZXRUaWNrQ291bnQocE1hYy0+aEhkZCk7CisKKyAgICAgICAgY3NyTExMb2NrKCZwTWFjLT5zY2FuLnNjYW5SZXN1bHRMaXN0KTsKKyAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QsIExMX0FDQ0VTU19OT0xPQ0sgKTsKKyAgICAgICAgd2hpbGUoIHBFbnRyeSApIAorICAgICAgICB7CisgICAgICAgICAgICB0bXBFbnRyeSA9IGNzckxMTmV4dCgmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgICAgIHBSZXN1bHQgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rICk7CisgICAgICAgICAgICBpZigoY3VyVGltZSAtIHBSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLm5SZWNlaXZlZFRpbWUpID4gYWdlT3V0VGltZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIiBhZ2Ugb3V0IGR1ZSB0byB0aW1lIG91dCIpOworICAgICAgICAgICAgICAgIGNzclNjYW5BZ2VPdXRCc3MocE1hYywgcFJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRW50cnkgPSB0bXBFbnRyeTsKKyAgICAgICAgfQorICAgICAgICBjc3JMTFVubG9jaygmcE1hYy0+c2Nhbi5zY2FuUmVzdWx0TGlzdCk7CisgICAgfQorfQorCisKK2VIYWxTdGF0dXMgY3NyU2NhblN0YXJ0SWRsZVNjYW5UaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBpbnRlcnZhbCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICAKKyAgICBzbXNMb2cocE1hYywgTE9HMSwgIiBjc3JTY2FuU3RhcnRJZGxlU2NhblRpbWVyIFxuICIpOworICAgIGlmKChwTWFjLT5zY2FuLmZTY2FuRW5hYmxlKSAmJiAoZUFOSV9CT09MRUFOX0ZBTFNFID09IHBNYWMtPnNjYW4uZkNhbmNlbElkbGVTY2FuKSAmJiBpbnRlcnZhbCkKKyAgICB7CisgICAgICAgIHBNYWMtPnNjYW4ubklkbGVTY2FuVGltZUdhcCArPSBpbnRlcnZhbDsKKyAgICAgICAgcGFsVGltZXJTdG9wKHBNYWMtPmhIZGQsIHBNYWMtPnNjYW4uaFRpbWVySWRsZVNjYW4pOworICAgICAgICBzdGF0dXMgPSBwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBNYWMtPnNjYW4uaFRpbWVySWRsZVNjYW4sIGludGVydmFsLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICIgIEZhaWwgdG8gc3RhcnQgSWRsZSBzY2FuIHRpbWVyLiBzdGF0dXMgPSAlZCBpbnRlcnZhbCA9ICVkXG4iLCBzdGF0dXMsIGludGVydmFsKTsKKyAgICAgICAgICAgIC8vVGhpcyBzaG91bGQgbm90IGhhcHBlbiBidXQgc2V0IHRoZSBmbGFnIHRvIHJlc3RhcnQgd2hlbiByZWFkeQorICAgICAgICAgICAgcE1hYy0+c2Nhbi5mUmVzdGFydElkbGVTY2FuID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHBNYWMtPnNjYW4uZlNjYW5FbmFibGUgJiYgKGVBTklfQk9PTEVBTl9GQUxTRSA9PSBwTWFjLT5zY2FuLmZDYW5jZWxJZGxlU2NhbikgKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5zY2FuLmZSZXN0YXJ0SWRsZVNjYW4gPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuU3RvcElkbGVTY2FuVGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICByZXR1cm4gKHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwTWFjLT5zY2FuLmhUaW1lcklkbGVTY2FuKSk7Cit9CisKKworLy9TdG9wIENTUiBmcm9tIGFza2luZyBmb3IgSU1QUywgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGRpc2FibGUgSU1QUyBmcm9tIENTUgordm9pZCBjc3JTY2FuU3VzcGVuZElNUFMoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIGNzclNjYW5DYW5jZWxJZGxlU2NhbihwTWFjKTsKK30KKworCisvL1N0YXJ0IENTUiBmcm9tIGFza2luZyBmb3IgSU1QUy4gVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHRyaWdnZXIgQ1NSIHRvIHJlcXVlc3QgZW50ZXJpbmcgSU1QUworLy9iZWNhdXNlIElNUFMgbWF5YmUgZGlzYWJsZWQuCit2b2lkIGNzclNjYW5SZXN1bWVJTVBTKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICBjc3JTY2FuU3RhcnRJZGxlU2NhbiggcE1hYyApOworfQorCisKK3ZvaWQgY3NyU2NhbklNUFNDYWxsYmFjayh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggY2FsbGJhY2tDb250ZXh0ICk7CisKKyAgICBpZihlQU5JX0JPT0xFQU5fRkFMU0UgPT0gcE1hYy0+c2Nhbi5mQ2FuY2VsSWRsZVNjYW4pCisgICAgeworICAgICAgICBpZihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzSWRsZVNjYW5FbmFibGVkKSAKKyAgICAgICAgeworICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY3NySXNBbGxTZXNzaW9uRGlzY29ubmVjdGVkKHBNYWMpICYmICFjc3JJc1JvYW1Db21tYW5kV2FpdGluZyhwTWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgic3RhcnRzIGlkbGUgbW9kZSBmdWxsIHNjYW5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgY3NyU2NhbkFsbENoYW5uZWxzKHBNYWMsIGVDU1JfU0NBTl9JRExFX01PREVfU0NBTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiY2Fubm90IHN0YXJ0IGlkbGUgbW9kZSBmdWxsIHNjYW5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgLy9ldmVuIHRob3VnaCB3ZSBhcmUgaW4gdGltZXIgaGFuZGxlLCBjYWxsaW5nIHN0b3AgdGltZXIgd2lsbCBtYWtlIHN1cmUgdGhlIHRpbWVyCisgICAgICAgICAgICAgICAgICAgIC8vZG9lc24ndCBnZXQgdG8gcmVzdGFydC4KKyAgICAgICAgICAgICAgICAgICAgY3NyU2NhblN0b3BJZGxlU2NhblRpbWVyKHBNYWMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoInNlZXMgbm90IHN1Y2Nlc3Mgc3RhdHVzICglZClcbiIpLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgey8vd2UgbWlnaHQgbmVlZCBhbm90aGVyIGZsYWcgdG8gY2hlY2sgaWYgQ1NSIG5lZWRzIHRvIHJlcXVlc3QgaW1wcyBhdCBhbGwKKyAgICAgICAKKyAgICAgICAgICAgIHRBTklfVTMyIG5UaW1lID0gMDsKKworICAgICAgICAgICAgcE1hYy0+c2Nhbi5mUmVzdGFydElkbGVTY2FuID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JTY2FuVHJpZ2dlcklkbGVTY2FuKHBNYWMsICZuVGltZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzclNjYW5TdGFydElkbGVTY2FuVGltZXIocE1hYywgblRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKy8vUGFyYW06IHBUaW1lSW50ZXJ2YWwgLS0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgaW4gcmV0dXJuLCBpZiBmYWlsZWQsIHRvIHNwZWNpZnkgdGhlIG54dCB0aW1lIGludGVydmFsIGZvciAKKy8vaWRsZSBzY2FuIHRpbWVyIGludGVydmFsCisvL1JldHVybjogTm90IHN1Y2Nlc3MgLS0gbWVhbmluZyBpdCBjYW5ub3Qgc3RhcnQgSU1QUywgY2FsbGVyIG5lZWRzIHRvIHN0YXJ0IGEgdGltZXIgZm9yIGlkbGUgc2NhbgorZUhhbFN0YXR1cyBjc3JTY2FuVHJpZ2dlcklkbGVTY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwVGltZUludGVydmFsKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfQ1NSX1dST05HX1NUQVRFOworCisgICAgLy9EbyBub3QgdHJpZ2dlciBJTVBTIGluIGNhc2Ugb2YgY29uY3VycmVuY3kKKyAgICBpZiAodm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZygpKQorICAgICAgICByZXR1cm4gKHN0YXR1cyk7CisKKyAgICBpZihwVGltZUludGVydmFsKQorICAgIHsKKyAgICAgICAgKnBUaW1lSW50ZXJ2YWwgPSAwOworICAgIH0KKworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiY2FsbGVkXG4iKSk7CisgICAgaWYoIHNtZUNvbW1hbmRQZW5kaW5nKCBwTWFjICkgKQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCBGTCgiICBDYW5ub3QgcmVxdWVzdCBJTVBTIGJlY2F1c2UgY29tbWFuZCBwZW5kaW5nXG4iKSApOworICAgICAgICAvL05vdCB0byBlbnRlciBJTVBTIGJlY2F1c2UgbW9yZSB3b3JrIHRvIGRvCisgICAgICAgIGlmKHBUaW1lSW50ZXJ2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwVGltZUludGVydmFsID0gMDsKKyAgICAgICAgfQorICAgICAgICAvL3Jlc3RhcnQgd2hlbiByZWFkeQorICAgICAgICBwTWFjLT5zY2FuLmZSZXN0YXJ0SWRsZVNjYW4gPSBlQU5JX0JPT0xFQU5fVFJVRTsKKworICAgICAgICByZXR1cm4gKHN0YXR1cyk7CisgICAgfQorCisgICAgaWYoKHBNYWMtPnNjYW4uZlNjYW5FbmFibGUpICYmIChlQU5JX0JPT0xFQU5fRkFMU0UgPT0gcE1hYy0+c2Nhbi5mQ2FuY2VsSWRsZVNjYW4pIAorICAgIC8qJiYgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pbXBzU2xlZXBUaW1lKi8pCisgICAgeworICAgICAgICAvL1N0b3AgZ2V0IHJlc3VsdCB0aW1lciBiZWNhdXNlIGlkbGUgc2NhbiBnZXRzIHNjYW4gcmVzdWx0IG91dCBvZiBQRQorICAgICAgICBjc3JTY2FuU3RvcEdldFJlc3VsdFRpbWVyKHBNYWMpOworICAgICAgICBpZihwVGltZUludGVydmFsKQorICAgICAgICB7CisgICAgICAgICAgICAqcFRpbWVJbnRlcnZhbCA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaW1wc1NsZWVwVGltZTsKKyAgICAgICAgfQorICAgICAgICAvL3BtY1JlcXVlc3RJbXBzIHRha2UgYSBwZXJpb2QgaW4gbWlsbGlzZWNvbmQgdW5pdC4KKyAgICAgICAgc3RhdHVzID0gcG1jUmVxdWVzdEltcHMocE1hYywgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5pbXBzU2xlZXBUaW1lIC8gUEFMX1RJTUVSX1RPX01TX1VOSVQsIGNzclNjYW5JTVBTQ2FsbGJhY2ssIHBNYWMpOworICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGVIQUxfU1RBVFVTX1BNQ19BTFJFQURZX0lOX0lNUFMgIT0gc3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vRG8gcmVzdGFydCB0aGUgdGltZXIgaWYgQ1NSIHRoaW5rcyBpdCBjYW5ub3QgZG8gSU1QUworICAgICAgICAgICAgICAgIGlmKCAhY3NyQ2hlY2tQU1JlYWR5KCBwTWFjICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYocFRpbWVJbnRlcnZhbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFRpbWVJbnRlcnZhbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgcmVzdGFydCBmbGFnIHRvIHRydWUgYmVjYXVzZSB0aGF0IGlkbGUgc2NhbiAKKyAgICAgICAgICAgICAgICAgICAgLy9jYW4gYmUgcmVzdGFydGVkIGV2ZW4gdGhvdWdoIHRoZSB0aW1lciB3aWxsIG5vdCBiZSBydW5uaW5nCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4uZlJlc3RhcnRJZGxlU2NhbiA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0ZvciBub3Qgbm93LCB3ZSBkbyBhIHF1aWNrZXIgcmV0cnkKKyAgICAgICAgICAgICAgICAgICAgaWYocFRpbWVJbnRlcnZhbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFRpbWVJbnRlcnZhbCA9IENTUl9JRExFX1NDQU5fV0FJVF9USU1FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoImNhbGwgcG1jUmVxdWVzdEltcHMgYW5kIGl0IHJldHVybnMgc3RhdHVzIGNvZGUgKCVkKVxuIiksIHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJhbHJlYWR5IGluIElNUFNcbiIpKTsKKyAgICAgICAgICAgICAgICAvL1NpbmNlIENTUiBpcyB0aGUgb25seSBtb2R1bGUgdG8gcmVxdWVzdCBmb3IgSU1QUy4gSWYgaXQgaXMgYWxyZWFkeSBpbiBJTVBTLCBDU1IgYXNzdW1lcworICAgICAgICAgICAgICAgIC8vdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBmdXR1cmUuIFNob3VsZCBub3QgaGFwcGVuIHRob3VnaC4KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4ubklkbGVTY2FuVGltZUdhcCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL3JlcXVlc3RlZCBzbyBsZXQncyByZXNldCB0aGUgdmFsdWUKKyAgICAgICAgICAgIHBNYWMtPnNjYW4ubklkbGVTY2FuVGltZUdhcCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuU3RhcnRJZGxlU2Nhbih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfQ1NSX1dST05HX1NUQVRFOworICAgIHRBTklfVTMyIG5UaW1lID0gMDsKKworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiY2FsbGVkXG4iKSk7CisgICAgaWYocE1hYy0+cm9hbS5jb25maWdQYXJhbS5Jc0lkbGVTY2FuRW5hYmxlZCkKKyAgICB7CisgICAgICAgIC8vc3RvcCBiZyBzY2FuIGZpcnN0CisgICAgICAgIGNzclNjYW5CR1NjYW5BYm9ydChwTWFjKTsKKyAgICAgICAgLy9TdG9wIGdldCByZXN1bHQgdGltZXIgYmVjYXVzZSBpZGxlIHNjYW4gZ2V0cyBzY2FuIHJlc3VsdCBvdXQgb2YgUEUKKyAgICAgICAgY3NyU2NhblN0b3BHZXRSZXN1bHRUaW1lcihwTWFjKTsKKyAgICAgICAgLy9FbmFibGUgYWdpbmcgdGltZXIgc2luY2UgaWRsZSBzY2FuIGlzIGdvaW5nIG9uCisgICAgICAgIGNzclNjYW5TdGFydFJlc3VsdEFnaW5nVGltZXIocE1hYyk7CisgICAgfQorICAgIHBNYWMtPnNjYW4uZkNhbmNlbElkbGVTY2FuID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHN0YXR1cyA9IGNzclNjYW5UcmlnZ2VySWRsZVNjYW4ocE1hYywgJm5UaW1lKTsKKyAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgeworICAgICAgICBjc3JTY2FuU3RhcnRJZGxlU2NhblRpbWVyKHBNYWMsIG5UaW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKwordm9pZCBjc3JTY2FuQ2FuY2VsSWRsZVNjYW4odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBpZihlQU5JX0JPT0xFQU5fRkFMU0UgPT0gcE1hYy0+c2Nhbi5mQ2FuY2VsSWRsZVNjYW4pCisgICAgeworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgaWYgKHZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsICIgIGNzclNjYW5DYW5jZWxJZGxlU2NhblxuIik7CisgICAgICAgIHBNYWMtPnNjYW4uZkNhbmNlbElkbGVTY2FuID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIC8vU2V0IHRoZSByZXN0YXJ0IGZsYWcgaW4gY2FzZSBsYXRlciBvbiBpdCBpcyB1bmNhbmNlbGxlZAorICAgICAgICBwTWFjLT5zY2FuLmZSZXN0YXJ0SWRsZVNjYW4gPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgY3NyU2NhblN0b3BJZGxlU2NhblRpbWVyKHBNYWMpOworICAgICAgICBjc3JTY2FuUmVtb3ZlTm90Um9hbWluZ1NjYW5Db21tYW5kKHBNYWMpOworICAgIH0KK30KKworCit2b2lkIGNzclNjYW5JZGxlU2NhblRpbWVySGFuZGxlcih2b2lkICpwdikKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIHB2ICk7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdEFOSV9VMzIgblRpbWUgPSAwOworCisgICAgc21zTG9nKHBNYWMsIExPR1csICIgIGNzclNjYW5JZGxlU2NhblRpbWVySGFuZGxlciBjYWxsZWQgICIpOworICAgIHN0YXR1cyA9IGNzclNjYW5UcmlnZ2VySWRsZVNjYW4ocE1hYywgJm5UaW1lKTsKKyAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgJiYgKGVBTklfQk9PTEVBTl9GQUxTRSA9PSBwTWFjLT5zY2FuLmZDYW5jZWxJZGxlU2NhbikpCisgICAgeworICAgICAgICAvL0NoZWNrIHdoZXRoZXIgaXQgaXMgdGltZSB0byBhY3R1YWxseSBkbyBhbiBpZGxlIHNjYW4KKyAgICAgICAgaWYocE1hYy0+c2Nhbi5uSWRsZVNjYW5UaW1lR2FwID49IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaW1wc1NsZWVwVGltZSkKKyAgICAgICAgeworICAgICAgICAgICAgcE1hYy0+c2Nhbi5uSWRsZVNjYW5UaW1lR2FwID0gMDsKKyAgICAgICAgICAgIGNzclNjYW5JTVBTQ2FsbGJhY2socE1hYywgZUhBTF9TVEFUVVNfU1VDQ0VTUyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjc3JTY2FuU3RhcnRJZGxlU2NhblRpbWVyKHBNYWMsIG5UaW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKKwordEFOSV9CT09MRUFOIGNzclNjYW5SZW1vdmVOb3RSb2FtaW5nU2NhbkNvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX0JPT0xFQU4gZlJldCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeSwgKnBFbnRyeVRtcDsKKyAgICB0U21lQ21kICpwQ29tbWFuZDsKKyAgICB0RGJsTGlua0xpc3QgbG9jYWxMaXN0OworCisgICAgdm9zX21lbV96ZXJvKCZsb2NhbExpc3QsIHNpemVvZih0RGJsTGlua0xpc3QpKTsKKyAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKGNzckxMT3BlbihwTWFjLT5oSGRkLCAmbG9jYWxMaXN0KSkpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBmYWlsZWQgdG8gb3BlbiBsaXN0IikpOworICAgICAgICByZXR1cm4gZlJldDsKKyAgICB9CisKKyAgICBjc3JMTExvY2soJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCk7CisgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICB3aGlsZShwRW50cnkpCisgICAgeworICAgICAgICBwRW50cnlUbXAgPSBjc3JMTE5leHQoJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFNtZUNtZCwgTGluayk7CisgICAgICAgIGlmKCBlU21lQ29tbWFuZFNjYW4gPT0gcENvbW1hbmQtPmNvbW1hbmQgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goIHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgZUNzclNjYW5JZGxlU2NhbjoKKyAgICAgICAgICAgICAgICBpZiggY3NyTExSZW1vdmVFbnRyeSgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzckxMSW5zZXJ0VGFpbCgmbG9jYWxMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmUmV0ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IC8vc3dpdGNoCisgICAgICAgIH0KKyAgICAgICAgcEVudHJ5ID0gcEVudHJ5VG1wOworICAgIH0KKworICAgIGNzckxMVW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QpOworCisgICAgd2hpbGUoIChwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoJmxvY2FsTGlzdCwgTExfQUNDRVNTX05PTE9DSykpICkKKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworICAgICAgICBjc3JSZWxlYXNlQ29tbWFuZFNjYW4oIHBNYWMsIHBDb21tYW5kICk7CisgICAgfQorCisgICAgY3NyTExDbG9zZSgmbG9jYWxMaXN0KTsKKworICAgIHJldHVybiAoZlJldCk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzclNjYW5SZW1vdmVGcmVzaFNjYW5Db21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc2Vzc2lvbklkKQoreworICAgIHRBTklfQk9PTEVBTiBmUmV0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIHRMaXN0RWxlbSAqcEVudHJ5LCAqcEVudHJ5VG1wOworICAgIHRTbWVDbWQgKnBDb21tYW5kOworICAgIHREYmxMaW5rTGlzdCBsb2NhbExpc3Q7CisKKyAgICB2b3NfbWVtX3plcm8oJmxvY2FsTGlzdCwgc2l6ZW9mKHREYmxMaW5rTGlzdCkpOworICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyTExPcGVuKHBNYWMtPmhIZGQsICZsb2NhbExpc3QpKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWxlZCB0byBvcGVuIGxpc3QiKSk7CisgICAgICAgIHJldHVybiBmUmV0OworICAgIH0KKworICAgIGNzckxMTG9jaygmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0KTsKKyAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworICAgIHdoaWxlKHBFbnRyeSkKKyAgICB7CisgICAgICAgIHBFbnRyeVRtcCA9IGNzckxMTmV4dCgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spOworICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKyAgICAgICAgaWYoIChlU21lQ29tbWFuZFNjYW4gPT0gcENvbW1hbmQtPmNvbW1hbmQpICYmIChzZXNzaW9uSWQgPT0gcENvbW1hbmQtPnNlc3Npb25JZCkgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2gocENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGVDc3JTY2FuR2V0UmVzdWx0OgorICAgICAgICAgICAgY2FzZSBlQ3NyU2NhblNldEJHU2NhblBhcmFtOgorICAgICAgICAgICAgY2FzZSBlQ3NyU2NhbkJHU2NhbkFib3J0OgorICAgICAgICAgICAgY2FzZSBlQ3NyU2NhbkJHU2NhbkVuYWJsZToKKyAgICAgICAgICAgIGNhc2UgZUNzclNjYW5HZXRTY2FuQ2huSW5mbzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgIHNtc0xvZyAocE1hYywgTE9HVywgIiVzOiAtLS0tLS0tLSBhYm9ydCBzY2FuIGNvbW1hbmQgcmVhc29uID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcENvbW1hbmQtPnUuc2NhbkNtZC5yZWFzb24pOworICAgICAgICAgICAgICAgIC8vVGhlIHJlc3QgYXJlIGZyZXNoIHNjYW4gcmVxdWVzdHMKKyAgICAgICAgICAgICAgICBpZiggY3NyTExSZW1vdmVFbnRyeSgmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNzckxMSW5zZXJ0VGFpbCgmbG9jYWxMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmUmV0ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcEVudHJ5ID0gcEVudHJ5VG1wOworICAgIH0KKworICAgIGNzckxMVW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QpOworCisgICAgd2hpbGUoIChwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoJmxvY2FsTGlzdCwgTExfQUNDRVNTX05PTE9DSykpICkKKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworICAgICAgICBpZiAocENvbW1hbmQtPnUuc2NhbkNtZC5jYWxsYmFjaykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVXNlciBzY2FuIHJlcXVlc3QgaXMgcGVuZGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlbmQgcmVzcG9uc2Ugd2l0aCBzdGF0dXMgZUNTUl9TQ0FOX0FCT1JUKi8KKyAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQuY2FsbGJhY2socE1hYywgCisgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5zY2FuQ21kLnBDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnNjYW5DbWQuc2NhbklELCAKKyAgICAgICAgICAgICAgICAgICAgIGVDU1JfU0NBTl9BQk9SVCk7CisgICAgICAgIH0KKyAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRTY2FuKCBwTWFjLCBwQ29tbWFuZCApOworICAgIH0KKyAgICBjc3JMTENsb3NlKCZsb2NhbExpc3QpOworCisgICAgcmV0dXJuIChmUmV0KTsKK30KKworCit2b2lkIGNzclJlbGVhc2VTY2FuQ29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwgZUNzclNjYW5TdGF0dXMgc2NhblN0YXR1cykKK3sKKyAgICBlQ3NyU2NhblJlYXNvbiByZWFzb24gPSBwQ29tbWFuZC0+dS5zY2FuQ21kLnJlYXNvbjsKKyAgICB0QU5JX1UzMiBpOworICAgIGZvciggaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrICkKKyAgICB7CisgICAgICAgaWYoQ1NSX0lTX1NFU1NJT05fVkFMSUQocE1hYywgaSkpCisgICAgICAgICAgIGNzclJvYW1TdGF0ZUNoYW5nZSggcE1hYywgcENvbW1hbmQtPnUuc2NhbkNtZC5sYXN0Um9hbVN0YXRlW2ldLCBpKTsKKyAgICB9CisKKyAgICAgICAgY3NyU2NhbkNhbGxDYWxsYmFjayhwTWFjLCBwQ29tbWFuZCwgc2NhblN0YXR1cyk7CisKKyAgICBzbXNMb2cocE1hYywgTE9HMywgIiAgIFJlbW92ZSBTY2FuIGNvbW1hbmQgcmVhc29uID0gJWRcbiIsIHJlYXNvbik7CisgICAgaWYoIGNzckxMUmVtb3ZlRW50cnkoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgJnBDb21tYW5kLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSyApICkKKyAgICB7CisgICAgICAgIGNzclJlbGVhc2VDb21tYW5kU2NhbiggcE1hYywgcENvbW1hbmQgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICIgKioqKioqKipjc3JSZWxlYXNlU2NhbkNvbW1hbmQgY2Fubm90IHJlbGVhc2UgY29tbWFuZCByZWFzb24gJWRcbiIsIHBDb21tYW5kLT51LnNjYW5DbWQucmVhc29uICk7CisgICAgfQorfQorCisKK2VIYWxTdGF0dXMgY3NyU2NhbkdldFBNS0lEQ2FuZGlkYXRlTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBta2lkQ2FuZGlkYXRlSW5mbyAqcFBta2lkTGlzdCwgdEFOSV9VMzIgKnBOdW1JdGVtcyApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgc21zTG9nKHBNYWMsIExPR1csICIgIHBNYWMtPnNjYW4uTnVtUG1raWRDYW5kaWRhdGUgPSAlZFxuICIsIHBTZXNzaW9uLT5OdW1QbWtpZENhbmRpZGF0ZSk7CisgICAgY3NyUmVzZXRQTUtJRENhbmRpZGF0ZUxpc3QocE1hYywgc2Vzc2lvbklkKTsKKyAgICBpZihjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpICYmIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpCisgICAgeworICAgICAgICB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXI7CisgICAgICAgIHRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQ7CisgICAgICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhCU1NMaXN0OworICAgICAgICB0QU5JX1UzMiBuSXRlbXMgPSAqcE51bUl0ZW1zOworCisgICAgICAgICpwTnVtSXRlbXMgPSAwOworICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcFNjYW5GaWx0ZXIsIHNpemVvZih0Q3NyU2NhblJlc3VsdEZpbHRlcikpOworICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisgICAgICAgICAgICAvL0hlcmUgaXMgdGhlIHByb2ZpbGUgd2UgbmVlZCB0byBjb25uZWN0IHRvCisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUHJlcGFyZUZpbHRlckZyb21Qcm9maWxlKHBNYWMsIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUsIHBTY2FuRmlsdGVyKTsKKyAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclNjYW5HZXRSZXN1bHQocE1hYywgcFNjYW5GaWx0ZXIsICZoQlNTTGlzdCk7CisgICAgICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSgoKHBTY2FuUmVzdWx0ID0gY3NyU2NhblJlc3VsdEdldE5leHQocE1hYywgaEJTU0xpc3QpKSAhPSBOVUxMKSAmJiAoIHBTZXNzaW9uLT5OdW1QbWtpZENhbmRpZGF0ZSA8IG5JdGVtcykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vTnVtUG1raWRDYW5kaWRhdGUgYWRkcyB1cCBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICBjc3JQcm9jZXNzQlNTRGVzY0ZvclBNS0lETGlzdChwTWFjLCAmcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHREb3QxMWZCZWFjb25JRXMgKikoIHBTY2FuUmVzdWx0LT5wdkllcyApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwTnVtSXRlbXMgPSBwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBQbWtpZExpc3QsIHBTZXNzaW9uLT5QbWtpZENhbmRpZGF0ZUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+TnVtUG1raWRDYW5kaWRhdGUgKiBzaXplb2YodFBta2lkQ2FuZGlkYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNzclNjYW5SZXN1bHRQdXJnZShwTWFjLCBoQlNTTGlzdCk7CisgICAgICAgICAgICAgICAgfS8vSGF2ZSBzY2FuIHJlc3VsdAorICAgICAgICAgICAgICAgIGNzckZyZWVTY2FuRmlsdGVyKHBNYWMsIHBTY2FuRmlsdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5GaWx0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCitlSGFsU3RhdHVzIGNzclNjYW5HZXRCS0lEQ2FuZGlkYXRlTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QmtpZENhbmRpZGF0ZUluZm8gKnBCa2lkTGlzdCwgdEFOSV9VMzIgKnBOdW1JdGVtcyApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgc21zTG9nKHBNYWMsIExPR1csICIgIHBNYWMtPnNjYW4uTnVtQmtpZENhbmRpZGF0ZSA9ICVkXG4gIiwgcFNlc3Npb24tPk51bUJraWRDYW5kaWRhdGUpOworICAgIGNzclJlc2V0QktJRENhbmRpZGF0ZUxpc3QocE1hYywgc2Vzc2lvbklkKTsKKyAgICBpZihjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpICYmIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpCisgICAgeworICAgICAgICB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXI7CisgICAgICAgIHRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQ7CisgICAgICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhCU1NMaXN0OworICAgICAgICB0QU5JX1UzMiBuSXRlbXMgPSAqcE51bUl0ZW1zOworICAgICAgICAqcE51bUl0ZW1zID0gMDsKKyAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5GaWx0ZXIsIHNpemVvZih0Q3NyU2NhblJlc3VsdEZpbHRlcikpOworICAgICAgICAgICAgLy9IZXJlIGlzIHRoZSBwcm9maWxlIHdlIG5lZWQgdG8gY29ubmVjdCB0bworICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbVByZXBhcmVGaWx0ZXJGcm9tUHJvZmlsZShwTWFjLCBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLCBwU2NhbkZpbHRlcik7CisgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JTY2FuR2V0UmVzdWx0KHBNYWMsIHBTY2FuRmlsdGVyLCAmaEJTU0xpc3QpOworICAgICAgICAgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoKChwU2NhblJlc3VsdCA9IGNzclNjYW5SZXN1bHRHZXROZXh0KHBNYWMsIGhCU1NMaXN0KSkgIT0gTlVMTCkgJiYgKCBwU2Vzc2lvbi0+TnVtQmtpZENhbmRpZGF0ZSA8IG5JdGVtcykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcE1hYy0+c2Nhbi5OdW1Ca2lkQ2FuZGlkYXRlIGFkZHMgdXAgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgY3NyUHJvY2Vzc0JTU0Rlc2NGb3JCS0lETGlzdChwTWFjLCAmcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodERvdDExZkJlYWNvbklFcyAqKSggcFNjYW5SZXN1bHQtPnB2SWVzICkpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYocFNlc3Npb24tPk51bUJraWRDYW5kaWRhdGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwTnVtSXRlbXMgPSBwU2Vzc2lvbi0+TnVtQmtpZENhbmRpZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcEJraWRMaXN0LCBwU2Vzc2lvbi0+QmtpZENhbmRpZGF0ZUluZm8sIHBTZXNzaW9uLT5OdW1Ca2lkQ2FuZGlkYXRlICogc2l6ZW9mKHRCa2lkQ2FuZGlkYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNzclNjYW5SZXN1bHRQdXJnZShwTWFjLCBoQlNTTGlzdCk7CisgICAgICAgICAgICAgICAgfS8vSGF2ZSBzY2FuIHJlc3VsdAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkZpbHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKworCisKKy8vVGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IHVzZWQgZm9yIEJTU3MgdGhhdCBzdXBwcmVzc2VzIFNTSUQgc28gdGhlIHByb2ZpbGUgCisvL3NoYWxsIGhhdmUgb25lIGFuZCBvbmx5IG9uZSBTU0lECitlSGFsU3RhdHVzIGNzclNjYW5Gb3JTU0lEKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdEFOSV9VMzIgcm9hbUlkKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgdFNtZUNtZCAqcFNjYW5DbWQgPSBOVUxMOworICAgIHRBTklfVTggYkFkZHJbNl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07IAorICAgIHRBTklfVTggIGluZGV4ID0gMDsKKyAgICB0QU5JX1UzMiBudW1Tc2lkID0gcFByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHM7CisKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoImNhbGxlZFxuIikpOworICAgIC8vRm9yIFdEUywgd2UgdXNlIHRoZSBpbmRleCAwLiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBpbiB0aGVyZQorICAgIGlmKCBDU1JfSVNfV0RTX1NUQSggcFByb2ZpbGUgKSAmJiBudW1Tc2lkICkKKyAgICB7CisgICAgICAgIG51bVNzaWQgPSAxOworICAgIH0KKyAgICBpZihwTWFjLT5zY2FuLmZTY2FuRW5hYmxlICYmICggbnVtU3NpZCA9PSAxICkgKQorICAgIHsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgcFNjYW5DbWQgPSBjc3JHZXRDb21tYW5kQnVmZmVyKHBNYWMpOworICAgICAgICAgICAgaWYoIXBTY2FuQ21kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiZmFpbGVkIHRvIGFsbG9jYXRlIGNvbW1hbmQgYnVmZmVyXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZwU2NhbkNtZC0+dS5zY2FuQ21kLCBzaXplb2YodFNjYW5DbWQpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwU2NhbkNtZC0+dS5zY2FuQ21kLnBUb1JvYW1Qcm9maWxlLCBzaXplb2YodENzclJvYW1Qcm9maWxlKSk7CisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtQ29weVByb2ZpbGUocE1hYywgcFNjYW5DbWQtPnUuc2NhbkNtZC5wVG9Sb2FtUHJvZmlsZSwgcFByb2ZpbGUpOworICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5yb2FtSWQgPSByb2FtSWQ7CisgICAgICAgICAgICBwU2NhbkNtZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kU2NhbjsKKyAgICAgICAgICAgIHBTY2FuQ21kLT5zZXNzaW9uSWQgPSAodEFOSV9VOClzZXNzaW9uSWQ7IAorICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5jYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICBwU2NhbkNtZC0+dS5zY2FuQ21kLnBDb250ZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQucmVhc29uID0gZUNzclNjYW5Gb3JTc2lkOworICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5zY2FuSUQgPSBwTWFjLT5zY2FuLm5leHRTY2FuSUQrKzsgLy9sZXQgaXQgd3JhcCBhcm91bmQKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdCwgc2l6ZW9mKHRDc3JTY2FuUmVxdWVzdCkpOworICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKyAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5tYXhDaG5UaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWF4Q2huVGltZTsKKyAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5taW5DaG5UaW1lID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uQWN0aXZlTWluQ2huVGltZTsKKyAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5CU1NUeXBlID0gcFByb2ZpbGUtPkJTU1R5cGU7CisgICAgICAgICAgICBwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QudUlFRmllbGRMZW4gPSAwOworICAgICAgICAgICAgaWYocFByb2ZpbGUtPkJTU0lEcy5udW1PZkJTU0lEcyA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LmJzc2lkLCBwUHJvZmlsZS0+QlNTSURzLmJzc2lkLCBzaXplb2YodENzckJzc2lkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuYnNzaWQsIGJBZGRyLCA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBQcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5DaGFubmVsTGlzdCwgc2l6ZW9mKCpwU2NhbkNtZC0+dS5zY2FuQ21kLnUuc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpICogcFByb2ZpbGUtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworICAgICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY3NyUm9hbUlzQ2hhbm5lbFZhbGlkKHBNYWMsIHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXSk7CisgICAgICAgICAgICAgICAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IHBQcm9maWxlLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOyBpbmRleCsrKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYoY3NyUm9hbUlzVmFsaWRDaGFubmVsKHBNYWMsIHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpbmRleF0pKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W3BTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzXSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcFByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzKys7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgicHJvY2VzcyBhIGNoYW5uZWwgKCVkKSB0aGF0IGlzIGludmFsaWRcbiIpLCBwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocFByb2ZpbGUtPlNTSURzLm51bU9mU1NJRHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBTY2FuQ21kLT51LnNjYW5DbWQudS5zY2FuUmVxdWVzdC5TU0lEcy5TU0lETGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlLT5TU0lEcy5udW1PZlNTSURzICogc2l6ZW9mKHRDc3JTU0lESW5mbykpOyAKKyAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LlNTSURzLm51bU9mU1NJRHMgPSAxOworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5DbWQtPnUuc2NhbkNtZC51LnNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0LCBwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Q3NyU1NJREluZm8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vU3RhcnQgcHJvY2VzcyB0aGUgY29tbWFuZAorICAgICAgICAgICAgc3RhdHVzID0gY3NyUXVldWVTbWVDb21tYW5kKHBNYWMsIHBTY2FuQ21kLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBzZW5kIG1lc3NhZ2Ugc3RhdHVzID0gJWRcbiIpLCBzdGF0dXMgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfXdoaWxlKDApOworICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBTY2FuQ21kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzclJlbGVhc2VDb21tYW5kU2NhbihwTWFjLCBwU2NhbkNtZCk7CisgICAgICAgICAgICAgICAgLy9UT0RPOmZyZWUgdGhlIG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgcm9hbUlkLCBlQ1NSX1JPQU1fRkFJTEVELCBlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgfS8vdmFsaWQKKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImNhbm5vdCBzY2FuIGJlY2F1c2Ugc2NhbkVuYWJsZSAoJWQpIG9yIG51bVNTSUQgKCVkKSBpcyBpbnZhbGlkXG4iKSwKKyAgICAgICAgICAgICAgICBwTWFjLT5zY2FuLmZTY2FuRW5hYmxlLCBwUHJvZmlsZS0+U1NJRHMubnVtT2ZTU0lEcyk7CisgICAgfQorICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisvL0lzc3VlIGEgc2NhbiBiYXNlIG9uIHRoZSBuZXcgY2FwYWJpbGl0eSBpbmZvbWF0aW9uCisvL1RoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gdGhlIGFzc29jaWF0ZWQgQVAgY2hhbmdlcyBpdHMgY2FwYWJpbGl0eS4KKy8vQWZ0ZXIgdGhpcyBzY2FuIGlzIGRvbmUsIENTUiByZXJvYW1zIGJhc2Ugb24gdGhlIG5ldyBzY2FuIHJlc3VsdHMKK2VIYWxTdGF0dXMgY3NyU2NhbkZvckNhcGFiaWxpdHlDaGFuZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclNtZUFwTmV3Q2FwcyAqcE5ld0NhcHMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB0U21lQ21kICpwU2NhbkNtZCA9IE5VTEw7CisKKyAgICBpZihwTmV3Q2FwcykKKyAgICB7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTY2FuQ21kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlcihwTWFjKTsKKyAgICAgICAgICAgIGlmKCFwU2NhbkNtZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImZhaWxlZCB0byBhbGxvY2F0ZSBjb21tYW5kIGJ1ZmZlclxuIikpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnBTY2FuQ21kLT51LnNjYW5DbWQsIHNpemVvZih0U2NhbkNtZCkpOworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQucm9hbUlkID0gMDsKKyAgICAgICAgICAgIHBTY2FuQ21kLT5jb21tYW5kID0gZVNtZUNvbW1hbmRTY2FuOyAKKyAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQuY2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICAgcFNjYW5DbWQtPnUuc2NhbkNtZC5wQ29udGV4dCA9IE5VTEw7CisgICAgICAgICAgICBwU2NhbkNtZC0+dS5zY2FuQ21kLnJlYXNvbiA9IGVDc3JTY2FuRm9yQ2Fwc0NoYW5nZTsKKyAgICAgICAgICAgIHBTY2FuQ21kLT51LnNjYW5DbWQuc2NhbklEID0gcE1hYy0+c2Nhbi5uZXh0U2NhbklEKys7IC8vbGV0IGl0IHdyYXAgYXJvdW5kCisgICAgICAgICAgICBzdGF0dXMgPSBjc3JRdWV1ZVNtZUNvbW1hbmQocE1hYywgcFNjYW5DbWQsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHNlbmQgbWVzc2FnZSBzdGF0dXMgPSAlZFxuIiksIHN0YXR1cyApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9d2hpbGUoMCk7CisgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocFNjYW5DbWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRTY2FuKHBNYWMsIHBTY2FuQ21kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworCit2b2lkIGNzckluaXRCR1NjYW5DaGFubmVsTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRBTklfVTMyIGxlbiA9IENTUl9NSU4oc2l6ZW9mKHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCksIHNpemVvZihwTWFjLT5zY2FuLmJnU2NhbkNoYW5uZWxMaXN0KSk7CisKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPnNjYW4uYmdTY2FuQ2hhbm5lbExpc3QsIGxlbik7CisgICAgcE1hYy0+c2Nhbi5udW1CR1NjYW5DaGFubmVsID0gMDsKKworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRDZmdWYWxpZENoYW5uZWxzKHBNYWMsIHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCwgJmxlbikpKQorICAgIHsKKyAgICAgICAgcE1hYy0+cm9hbS5udW1WYWxpZENoYW5uZWxzID0gbGVuOworICAgICAgICBwTWFjLT5zY2FuLm51bUJHU2NhbkNoYW5uZWwgPSAodEFOSV9VOClDU1JfTUlOKGxlbiwgV05JX0NGR19CR19TQ0FOX0NIQU5ORUxfTElTVF9MRU4pOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPnNjYW4uYmdTY2FuQ2hhbm5lbExpc3QsIHBNYWMtPnJvYW0udmFsaWRDaGFubmVsTGlzdCwgcE1hYy0+c2Nhbi5udW1CR1NjYW5DaGFubmVsKTsKKyAgICAgICAgY3NyU2V0QkdTY2FuQ2hhbm5lbExpc3QocE1hYywgcE1hYy0+c2Nhbi5iZ1NjYW5DaGFubmVsTGlzdCwgcE1hYy0+c2Nhbi5udW1CR1NjYW5DaGFubmVsKTsKKyAgICB9Cit9CisKKworLy9UaGlzIGZ1bmN0aW9uIHJldHVybiBUUlVFIGlmIGJhY2tncm91bmQgc2NhbiBjaGFubmVsIGxpc3QgaXMgYWRqdXN0ZWQuIAorLy90aGlzIGZ1bmN0aW9uIHdpbGwgb25seSBzaHJpbmsgdGhlIGJhY2tncm91bmQgc2NhbiBjaGFubmVsIGxpc3QKK3RBTklfQk9PTEVBTiBjc3JBZGp1c3RCR1NjYW5DaGFubmVsTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQ2hhbm5lbExpc3QsIHRBTklfVTggTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEFkanVzdENoYW5uZWxzLCB0QU5JX1U4ICpwTnVtQWRqdXN0Q2hhbm5lbHMpCit7CisgICAgdEFOSV9CT09MRUFOIGZSZXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdEFOSV9VOCBpLCBqLCBjb3VudCA9ICpwTnVtQWRqdXN0Q2hhbm5lbHM7CisKKyAgICBpID0gMDsKKyAgICB3aGlsZShpIDwgY291bnQpCisgICAgeworICAgICAgICBmb3IoaiA9IDA7IGogPCBOdW1DaGFubmVsczsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwQ2hhbm5lbExpc3Rbal0gPT0gcEFkanVzdENoYW5uZWxzW2ldKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKGogPT0gTnVtQ2hhbm5lbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVGhpcyBjaGFubmVsIGlzIG5vdCBpbiB0aGUgbGlzdCwgcmVtb3ZlIGl0CisgICAgICAgICAgICBmUmV0ID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgaWYoY291bnQgLSBpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBBZGp1c3RDaGFubmVsc1tpXSwgJnBBZGp1c3RDaGFubmVsc1tpKzFdLCBjb3VudCAtIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vYWxyZWFkeSByZW1vdmUgdGhlIGxhc3Qgb25lLiBEb25lLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfS8vd2hpbGUoaTxjb3VudCkKKyAgICAqcE51bUFkanVzdENoYW5uZWxzID0gY291bnQ7CisKKyAgICByZXR1cm4gKGZSZXQpOworfQorCisKKy8vR2V0IHRoZSBsaXN0IG9mIHRoZSBiYXNlIGNoYW5uZWxzIHRvIHNjYW4gZm9yIHBhc3NpdmVseSAxMWQgaW5mbworZUhhbFN0YXR1cyBjc3JTY2FuR2V0U3VwcG9ydGVkQ2hhbm5lbHMoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICBpbnQgbiA9IFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNUX0xFTjsKKworICAgIHN0YXR1cyA9IHZvc19udl9nZXRTdXBwb3J0ZWRDaGFubmVscyggcE1hYy0+c2Nhbi5iYXNlQ2hhbm5lbHMuY2hhbm5lbExpc3QsICZuLCBOVUxMLCBOVUxMICk7CisgICAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkKKyAgICB7CisgICAgICAgIHBNYWMtPnNjYW4uYmFzZUNoYW5uZWxzLm51bUNoYW5uZWxzID0gKHRBTklfVTgpbjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGZhaWxlZFxuIikgKTsKKyAgICAgICAgcE1hYy0+c2Nhbi5iYXNlQ2hhbm5lbHMubnVtQ2hhbm5lbHMgPSAwOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKCBzdGF0dXMgKTsKK30KKworLy9UaGlzIGZ1bmN0aW9uIHVzZSB0aGUgaW5wdXQgcENoYW5uZWxMaXN0IHRvIHZhbGlkYXRlIHRoZSBjdXJyZW50IHNhdmVkIGNoYW5uZWwgbGlzdAorZUhhbFN0YXR1cyBjc3JTZXRCR1NjYW5DaGFubmVsTGlzdCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcEFkanVzdENoYW5uZWxzLCB0QU5JX1U4IE51bUFkanVzdENoYW5uZWxzKQoreworICAgIHRBTklfVTMyIGRhdGFMZW4gPSBzaXplb2YoIHRBTklfVTggKSAqIE51bUFkanVzdENoYW5uZWxzOworCisgICAgcmV0dXJuIChjY21DZmdTZXRTdHIocE1hYywgV05JX0NGR19CR19TQ0FOX0NIQU5ORUxfTElTVCwgcEFkanVzdENoYW5uZWxzLCBkYXRhTGVuLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpKTsKK30KKworCit2b2lkIGNzclNldENmZ1ZhbGlkQ2hhbm5lbExpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBDaGFubmVsTGlzdCwgdEFOSV9VOCBOdW1DaGFubmVscyApCit7CisgICAgdEFOSV9VMzIgZGF0YUxlbiA9IHNpemVvZiggdEFOSV9VOCApICogTnVtQ2hhbm5lbHM7CisKKworICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX1ZBTElEX0NIQU5ORUxfTElTVCwgcENoYW5uZWxMaXN0LCBkYXRhTGVuLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworCisgICAgcmV0dXJuOworfQorCisKKworLyoKKyAqIFRoZSBUeCBwb3dlciBsaW1pdHMgYXJlIHNhdmVkIGluIHRoZSBjZmcgZm9yIGZ1dHVyZSB1c2FnZS4KKyAqLwordm9pZCBjc3JTYXZlVHhQb3dlclRvQ2ZnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0QU5JX1UzMiBjZmdJZCApCit7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdEFOSV9VMzIgY2JMZW4gPSAwLCBkYXRhTGVuOworICAgIHRDc3JDaGFubmVsUG93ZXJJbmZvICpwQ2hhbm5lbFNldDsKKyAgICB0QU5JX1UzMiBpZHg7CisgICAgdFNpck1hY0NoYW5JbmZvICpwQ2hhbm5lbFBvd2VyU2V0OworICAgIHRBTklfVTggKnBCdWYgPSBOVUxMOworCisgICAgLy9hbGxvY2F0ZSBtYXhpbXVtIHNwYWNlIGZvciBhbGwgY2hhbm5lbHMKKyAgICBkYXRhTGVuID0gV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1RfTEVOICogc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbyk7CisgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQnVmLCBkYXRhTGVuKSkpCisgICAgeworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBCdWYsIGRhdGFMZW4pOworICAgICAgICBwQ2hhbm5lbFBvd2VyU2V0ID0gKHRTaXJNYWNDaGFuSW5mbyAqKShwQnVmKTsKKworICAgICAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCBwTGlzdCwgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICAgICAgLy8gd3JpdGUgdGhlIHR1cGxlcyAoc3RhcnRDaGFuLCBudW1DaGFuLCB0eFBvd2VyKSBmb3IgZWFjaCBjaGFubmVsIGZvdW5kIGluIHRoZSBjaGFubmVsIHBvd2VyIGxpc3QuCisgICAgICAgIHdoaWxlKCBwRW50cnkgKQorICAgICAgICB7CisgICAgICAgICAgICBwQ2hhbm5lbFNldCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdENzckNoYW5uZWxQb3dlckluZm8sIGxpbmsgKTsKKyAgICAgICAgICAgIGlmICggMSAhPSBwQ2hhbm5lbFNldC0+aW50ZXJDaGFubmVsT2Zmc2V0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBrZWVwIHRoZSA1RyBjaGFubmVsIHNldHMgaW50ZXJuYWxseSB3aXRoIGFuIGludGVyY2hhbm5lbCBvZmZzZXQgb2YgNC4gIEV4cGFuZCB0aGVzZQorICAgICAgICAgICAgICAgIC8vIHRvIHRoZSByaWdodCBmb3JtYXQuLi4gKGludGVyIGNoYW5uZWwgb2Zmc2V0IG9mIDEgaXMgdGhlIG9ubHkgb3B0aW9uIGZvciB0aGUgdHJpcGxldHMKKyAgICAgICAgICAgICAgICAvLyB0aGF0IDExZCBhZHZlcnRpc2VzLgorICAgICAgICAgICAgICAgIGlmICgoY2JMZW4gKyAocENoYW5uZWxTZXQtPm51bUNoYW5uZWxzICogc2l6ZW9mKHRTaXJNYWNDaGFuSW5mbykpKSA+PSBkYXRhTGVuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwYW5kaW5nIHRoaXMgZW50cnkgd2lsbCBvdmVyZmxvdyBvdXIgYWxsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogQnVmZmVyIG92ZXJmbG93LCBzdGFydCAlZCwgbnVtICVkLCBvZmZzZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYW5uZWxTZXQtPmZpcnN0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFubmVsU2V0LT5udW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFubmVsU2V0LT5pbnRlckNoYW5uZWxPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IHBDaGFubmVsU2V0LT5udW1DaGFubmVsczsgaWR4KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcENoYW5uZWxQb3dlclNldC0+Zmlyc3RDaGFuTnVtID0gKHRTaXJNYWNDaGFuTnVtKShwQ2hhbm5lbFNldC0+Zmlyc3RDaGFubmVsICsgKCBpZHggKiBwQ2hhbm5lbFNldC0+aW50ZXJDaGFubmVsT2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HMywgIiBTZXR0aW5nIENoYW5uZWwgTnVtYmVyICVkXG4iLCBwQ2hhbm5lbFBvd2VyU2V0LT5maXJzdENoYW5OdW0pOworICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbFBvd2VyU2V0LT5udW1DaGFubmVscyAgPSAxOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgICAgICAgICAgcENoYW5uZWxQb3dlclNldC0+bWF4VHhQb3dlciA9IENTUl9ST0FNX01JTiggcENoYW5uZWxTZXQtPnR4UG93ZXIsIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublR4UG93ZXJDYXAgKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIHBDaGFubmVsUG93ZXJTZXQtPm1heFR4UG93ZXIgPSBwQ2hhbm5lbFNldC0+dHhQb3dlcjsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HMywgIiBTZXR0aW5nIE1heCBUcmFuc21pdCBQb3dlciAlZFxuIiwgcENoYW5uZWxQb3dlclNldC0+bWF4VHhQb3dlcik7CisgICAgICAgICAgICAgICAgICAgIGNiTGVuICs9IHNpemVvZiggdFNpck1hY0NoYW5JbmZvICk7CisgICAgICAgICAgICAgICAgICAgIHBDaGFubmVsUG93ZXJTZXQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNiTGVuID49IGRhdGFMZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGVudHJ5IHdpbGwgb3ZlcmZsb3cgb3VyIGFsbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJ1ZmZlciBvdmVyZmxvdywgc3RhcnQgJWQsIG51bSAlZCwgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFubmVsU2V0LT5maXJzdENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbFNldC0+bnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbFNldC0+aW50ZXJDaGFubmVsT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBDaGFubmVsUG93ZXJTZXQtPmZpcnN0Q2hhbk51bSA9IHBDaGFubmVsU2V0LT5maXJzdENoYW5uZWw7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPRzMsICIgU2V0dGluZyBDaGFubmVsIE51bWJlciAlZFxuIiwgcENoYW5uZWxQb3dlclNldC0+Zmlyc3RDaGFuTnVtKTsKKyAgICAgICAgICAgICAgICBwQ2hhbm5lbFBvd2VyU2V0LT5udW1DaGFubmVscyA9IHBDaGFubmVsU2V0LT5udW1DaGFubmVsczsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAgICAgcENoYW5uZWxQb3dlclNldC0+bWF4VHhQb3dlciA9IENTUl9ST0FNX01JTiggcENoYW5uZWxTZXQtPnR4UG93ZXIsIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublR4UG93ZXJDYXAgKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgcENoYW5uZWxQb3dlclNldC0+bWF4VHhQb3dlciA9IHBDaGFubmVsU2V0LT50eFBvd2VyOworI2VuZGlmCisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPRzMsICIgU2V0dGluZyBNYXggVHJhbnNtaXQgUG93ZXIgJWQsIG5UeFBvd2VyICVkXG4iLCBwQ2hhbm5lbFBvd2VyU2V0LT5tYXhUeFBvd2VyLHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ublR4UG93ZXJDYXAgKTsKKworCisgICAgICAgICAgICAgICAgY2JMZW4gKz0gc2l6ZW9mKCB0U2lyTWFjQ2hhbkluZm8gKTsKKyAgICAgICAgICAgICAgICBwQ2hhbm5lbFBvd2VyU2V0Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBFbnRyeSA9IGNzckxMTmV4dCggcExpc3QsIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGNiTGVuKQorICAgICAgICB7CisgICAgICAgICAgICBjY21DZmdTZXRTdHIocE1hYywgY2ZnSWQsICh0QU5JX1U4ICopcEJ1ZiwgY2JMZW4sIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7IAorICAgICAgICB9CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYgKTsKKyAgICB9Ly9BbGxvY2F0ZSBtZW1vcnkKK30KKworCit2b2lkIGNzclNldENmZ0NvdW50cnlDb2RlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpjb3VudHJ5Q29kZSApCit7CisgICAgdEFOSV9VOCBjY1tXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU5dOworICAgIC8vL3ZfUkVHRE9NQUlOX3QgRG9tYWluSWQ7CisgICAgCisgICAgc21zTG9nKCBwTWFjLCBMT0czLCAiU2V0dGluZyBDb3VudHJ5IENvZGUgaW4gQ2ZnIGZyb20gY3NyU2V0Q2ZnQ291bnRyeUNvZGUgJXNcbiIsY291bnRyeUNvZGUgKTsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBjYywgY291bnRyeUNvZGUsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiApOworCisgICAgLy8gZG9uJ3QgcHJvZ3JhbSB0aGUgYm9ndXMgY291bnRyeSBjb2RlcyB0aGF0IHdlIGNyZWF0ZWQgZm9yIEtvcmVhIGluIHRoZSBNQUMuICBpZiB3ZSBzZWUKKyAgICAvLyB0aGUgYm9ndXMgY291bnRyeSBjb2RlcywgcHJvZ3JhbSB0aGUgTUFDIHdpdGggdGhlIHJpZ2h0IGNvdW50cnkgY29kZS4KKyAgICBpZiAoICggJ0snICA9PSBjb3VudHJ5Q29kZVsgMCBdICYmICcxJyA9PSBjb3VudHJ5Q29kZVsgMSBdICApIHx8CisgICAgICAgICAoICdLJyAgPT0gY291bnRyeUNvZGVbIDAgXSAmJiAnMicgPT0gY291bnRyeUNvZGVbIDEgXSAgKSB8fAorICAgICAgICAgKCAnSycgID09IGNvdW50cnlDb2RlWyAwIF0gJiYgJzMnID09IGNvdW50cnlDb2RlWyAxIF0gICkgfHwKKyAgICAgICAgICggJ0snICA9PSBjb3VudHJ5Q29kZVsgMCBdICYmICc0JyA9PSBjb3VudHJ5Q29kZVsgMSBdICApICAgICkKKyAgICB7CisgICAgICAgIC8vIHJlcGxhY2UgdGhlIGFsdGVybmF0ZSBLb3JlYSBjb3VudHJ5IGNvZGVzLCAnSzEnLCAnSzInLCAuLiB3aXRoICdLUicgZm9yIEtvcmVhCisgICAgICAgIGNjWyAxIF0gPSAnUic7CisgICAgfQorICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX0NPVU5UUllfQ09ERSwgY2MsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKworICAgIC8vTmVlZCB0byBsZXQgSEFMUEhZIGtub3cgYWJvdXQgdGhlIGN1cnJlbnQgZG9tYWluIHNvIGl0IGNhbiBhcHBseSBzb21lIAorICAgIC8vZG9tYWluLXNwZWNpZmljIHNldHRpbmdzIChUWCBmaWx0ZXIuLi4pCisgICAgLyppZihIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UmVndWxhdG9yeURvbWFpbkZvckNvdW50cnkocE1hYywgY2MsICZEb21haW5JZCkpKQorICAgIHsKKyAgICAgICAgaGFsUGh5U2V0UmVnRG9tYWluKHBNYWMsIERvbWFpbklkKTsKKyAgICB9Ki8KK30KKworCisKK2VIYWxTdGF0dXMgY3NyR2V0Q291bnRyeUNvZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCAqcGJMZW4pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB0QU5JX1UzMiBsZW47CisKKyAgICBpZihwQnVmICYmIHBiTGVuICYmICgqcGJMZW4gPj0gV05JX0NGR19DT1VOVFJZX0NPREVfTEVOKSkKKyAgICB7CisgICAgICAgIGxlbiA9ICpwYkxlbjsKKyAgICAgICAgc3RhdHVzID0gY2NtQ2ZnR2V0U3RyKHBNYWMsIFdOSV9DRkdfQ09VTlRSWV9DT0RFLCBwQnVmLCAmbGVuKTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwYkxlbiA9ICh0QU5JX1U4KWxlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKwordm9pZCBjc3JTZXRDZmdTY2FuQ29udHJvbExpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKmNvdW50cnlDb2RlLCB0Q3NyQ2hhbm5lbCAqcENoYW5uZWxMaXN0ICApCit7ICAgCisgICAgdEFOSV9VOCBpLCBqOworICAgIHRBTklfQk9PTEVBTiBmb3VuZD1GQUxTRTsgIAorICAgIHRBTklfVTggKnBDb250cm9sTGlzdCA9IE5VTEw7CisgICAgdEFOSV9VMzIgbGVuID0gV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVF9MRU47CisKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBDb250cm9sTGlzdCwgV05JX0NGR19TQ0FOX0NPTlRST0xfTElTVF9MRU4pKSkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKilwQ29udHJvbExpc3QsIFdOSV9DRkdfU0NBTl9DT05UUk9MX0xJU1RfTEVOKTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKGNjbUNmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNULCBwQ29udHJvbExpc3QsICZsZW4pKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBDaGFubmVsTGlzdC0+bnVtQ2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqICs9IDIpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDb250cm9sTGlzdFtqXSA9PSBwQ2hhbm5lbExpc3QtPmNoYW5uZWxMaXN0W2ldKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSAgICAvLyBpbnNlcnQgYSBwYWlyKGNoYW5uZWwjLCBmbGFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKENTUl9JU19DSEFOTkVMXzVHSFoocENvbnRyb2xMaXN0W2pdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xMaXN0W2orMV0gPSBjc3JHZXRTY2FuVHlwZShwTWFjLCBwQ29udHJvbExpc3Rbal0pOyAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250cm9sTGlzdFtqKzFdICA9IGVTSVJfQUNUSVZFX1NDQU47ICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gRkFMU0U7ICAvLyByZXNldCB0aGUgZmxhZworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX1NDQU5fQ09OVFJPTF9MSVNULCBwQ29udHJvbExpc3QsIGxlbiwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgfS8vU3VjY2Vzc2Z1bGx5IGdldHRpbmcgc2NhbiBjb250cm9sIGxpc3QKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwQ29udHJvbExpc3QpOworICAgIH0vL0FsbG9jYXRlTWVtb3J5Cit9CisKKworLy9pZiBiZ1BlcmlvZCBpcyAwLCBiYWNrZ3JvdW5kIHNjYW4gaXMgZGlzYWJsZWQuIEl0IGlzIGluIG1pbGxpc2Vjb25kIHVuaXRzCitlSGFsU3RhdHVzIGNzclNldENmZ0JhY2tncm91bmRTY2FuUGVyaW9kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGJnUGVyaW9kKQoreworICAgIHJldHVybiAoY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfQkFDS0dST1VORF9TQ0FOX1BFUklPRCwgYmdQZXJpb2QsICh0Q2NtQ2ZnU2V0Q2FsbGJhY2spIGNzclNjYW5DY21DZmdTZXRDYWxsYmFjaywgZUFOSV9CT09MRUFOX0ZBTFNFKSk7Cit9CisgICAgCisKK3ZvaWQgY3NyU2NhbkNjbUNmZ1NldENhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9TMzIgcmVzdWx0KQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKyAgICB0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgCisgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyApOworICAgIGlmICggcEVudHJ5ICkKKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgIGlmICggZVNtZUNvbW1hbmRTY2FuID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgZUNzclNjYW5TdGF0dXMgc2NhblN0YXR1cyA9IChDQ01fSVNfUkVTVUxUX1NVQ0NFU1MocmVzdWx0KSkgPyBlQ1NSX1NDQU5fU1VDQ0VTUyA6IGVDU1JfU0NBTl9GQUlMVVJFOworICAgICAgICAgICAgY3NyUmVsZWFzZVNjYW5Db21tYW5kKHBNYWMsIHBDb21tYW5kLCBzY2FuU3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIkNTUjogU2NhbiBDb21wbGV0aW9uIGNhbGxlZCBidXQgU0NBTiBjb21tYW5kIGlzIG5vdCBBQ1RJVkUgLi4uXG4iICk7CisgICAgICAgIH0KKyAgICB9ICAgCisgICAgc21lUHJvY2Vzc1BlbmRpbmdRdWV1ZSggcE1hYyApOworfQorCitlSGFsU3RhdHVzIGNzclByb2Nlc3NTZXRCR1NjYW5QYXJhbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICB0Q3NyQkdTY2FuUmVxdWVzdCAqcFNjYW5SZXEgPSAmcENvbW1hbmQtPnUuc2NhbkNtZC51LmJnU2NhblJlcXVlc3Q7CisgICAgdEFOSV9VMzIgZGF0YUxlbiA9IHNpemVvZiggdEFOSV9VOCApICogcFNjYW5SZXEtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHM7CisgICAgICAgIAorICAgIC8vKioqc2V0Y2ZnIGZvciBiYWNrZ3JvdW5kIHNjYW4gY2hhbm5lbCBsaXN0CisgICAgc3RhdHVzID0gY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfQUNUSVZFX01JTklNVU1fQ0hBTk5FTF9USU1FLCBwU2NhblJlcS0+bWluQ2huVGltZSwgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICBzdGF0dXMgPSBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR19BQ1RJVkVfTUFYSU1VTV9DSEFOTkVMX1RJTUUsIHBTY2FuUmVxLT5tYXhDaG5UaW1lLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIC8vTm90IHNldCB0aGUgYmFja2dyb3VuZCBzY2FuIGludGVydmFsIGlmIG5vdCBjb25uZWN0ZWQgYmVjYXVzZSBiZCBzY2FuIHNob3VsZCBub3QgYmUgcnVuIGlmIG5vdCBjb25uZWN0ZWQKKyAgICBpZighY3NySXNBbGxTZXNzaW9uRGlzY29ubmVjdGVkKHBNYWMpKQorICAgIHsKKyAgICAgICAgLy9JZiBkaXNiYWxpbmcgQkcgc2NhbiBoZXJlLCB3ZSBuZWVkIHRvIHN0b3AgYWdpbmcgYXMgd2VsbAorICAgICAgICBpZihwU2NhblJlcS0+c2NhbkludGVydmFsID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU3RvcCBhZ2luZyBiZWNhdXNlIG5vIG5ldyByZXN1bHQgaXMgY29taW5nIGluCisgICAgICAgICAgICBjc3JTY2FuU3RvcFJlc3VsdEFnaW5nVGltZXIocE1hYyk7CisgICAgICAgIH0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19sb2dfc2Nhbl9wa3RfdHlwZSAqcFNjYW5Mb2cgPSBOVUxMOworCisgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19BTExPQyhwU2NhbkxvZywgdm9zX2xvZ19zY2FuX3BrdF90eXBlLCBMT0dfV0xBTl9TQ0FOX0MpOworICAgICAgICAgICAgaWYocFNjYW5Mb2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNjYW5Mb2ctPmV2ZW50SWQgPSBXTEFOX1NDQU5fRVZFTlRfSE9fU0NBTl9SRVE7CisgICAgICAgICAgICAgICAgcFNjYW5Mb2ctPm1pbkNoblRpbWUgPSAodl9VOF90KXBTY2FuUmVxLT5taW5DaG5UaW1lOworICAgICAgICAgICAgICAgIHBTY2FuTG9nLT5tYXhDaG5UaW1lID0gKHZfVThfdClwU2NhblJlcS0+bWF4Q2huVGltZTsKKyAgICAgICAgICAgICAgICBwU2NhbkxvZy0+dGltZUJldHdlZW5CZ1NjYW4gPSAodl9VOF90KXBTY2FuUmVxLT5zY2FuSW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgcFNjYW5Mb2ctPm51bUNoYW5uZWwgPSBwU2NhblJlcS0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsKKyAgICAgICAgICAgICAgICBpZihwU2NhbkxvZy0+bnVtQ2hhbm5lbCAmJiAocFNjYW5Mb2ctPm51bUNoYW5uZWwgPCBWT1NfTE9HX01BWF9OVU1fQ0hBTk5FTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBTY2FuTG9nLT5jaGFubmVscywgcFNjYW5SZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5Mb2ctPm51bUNoYW5uZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBXTEFOX1ZPU19ESUFHX0xPR19SRVBPUlQocFNjYW5Mb2cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLy8jaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVF9DU1IKKworICAgICAgICBzdGF0dXMgPSBjY21DZmdTZXRJbnQocE1hYywgV05JX0NGR19CQUNLR1JPVU5EX1NDQU5fUEVSSU9ELCBwU2NhblJlcS0+c2NhbkludGVydmFsLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL05vIG5lZWQgdG8gc3RvcCBhZ2luZyBiZWNhdXNlIElETEUgc2NhbiBpcyBzdGlsbCBydW5uaW5nCisgICAgICAgIHN0YXR1cyA9IGNjbUNmZ1NldEludChwTWFjLCBXTklfQ0ZHX0JBQ0tHUk9VTkRfU0NBTl9QRVJJT0QsIDAsIE5VTEwsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgfQorICAgIAorICAgIGlmKHBTY2FuUmVxLT5TU0lELmxlbmd0aCA+IFdOSV9DRkdfU1NJRF9MRU4pCisgICAgeworICAgICAgICBwU2NhblJlcS0+U1NJRC5sZW5ndGggPSBXTklfQ0ZHX1NTSURfTEVOOworICAgIH0KKyAgICAKKyAgICBzdGF0dXMgPSBjY21DZmdTZXRTdHIocE1hYywgV05JX0NGR19CR19TQ0FOX0NIQU5ORUxfTElTVCwgcFNjYW5SZXEtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LCBkYXRhTGVuLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIHN0YXR1cyA9IGNjbUNmZ1NldFN0cihwTWFjLCBXTklfQ0ZHX1NTSUQsICh0QU5JX1U4ICopcFNjYW5SZXEtPlNTSUQuc3NJZCwgcFNjYW5SZXEtPlNTSUQubGVuZ3RoLCBOVUxMLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworCisKKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIGNzclNjYW5BYm9ydE1hY1NjYW4odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdFNpck1iTXNnICpwTXNnOworICAgIHRBTklfVTE2IG1zZ0xlbjsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0U21lQ21kICpwQ29tbWFuZDsKKworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisgICAgY3NyTExMb2NrKCZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCk7CisgICAgd2hpbGUoIE5VTEwgIT0gKCBwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoICZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCwgTExfQUNDRVNTX05PTE9DSykgKSApCisgICAgeworCisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgIGNzckFib3J0Q29tbWFuZCggcE1hYywgcENvbW1hbmQsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgfQorICAgIGNzckxMVW5sb2NrKCZwTWFjLT5zY2FuLnNjYW5DbWRQZW5kaW5nTGlzdCk7CisjZW5kaWYKKworICAgIHBNYWMtPnNjYW4uZkRyb3BTY2FuQ21kID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgY3NyUmVtb3ZlQ21kRnJvbVBlbmRpbmdMaXN0KCBwTWFjLCAmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QsIGVTbWVDb21tYW5kU2Nhbik7CisgICAgY3NyUmVtb3ZlQ21kRnJvbVBlbmRpbmdMaXN0KCBwTWFjLCAmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBlU21lQ29tbWFuZFNjYW4pOworICAgIHBNYWMtPnNjYW4uZkRyb3BTY2FuQ21kID0gZUFOSV9CT09MRUFOX0ZBTFNFOworCisgICAgLy9XZSBuZWVkIHRvIGFib3J0IHNjYW4gb25seSBpZiB3ZSBhcmUgc2Nhbm5pbmcKKyAgICBpZihOVUxMICE9IChwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0spKSkKKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgIGlmKGVTbWVDb21tYW5kU2NhbiA9PSBwQ29tbWFuZC0+Y29tbWFuZCkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnTGVuID0gKHRBTklfVTE2KShzaXplb2YoIHRTaXJNYk1zZyApKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTXNnLCBtc2dMZW4pOworICAgICAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKXBNc2csIG1zZ0xlbik7CisgICAgICAgICAgICAgICAgcE1zZy0+dHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfU0NBTl9BQk9SVF9JTkQpOworICAgICAgICAgICAgICAgIHBNc2ctPm1zZ0xlbiA9IHBhbF9jcHVfdG9fYmUxNihtc2dMZW4pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorCit2b2lkIGNzclJlbW92ZUNtZEZyb21QZW5kaW5nTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RGJsTGlua0xpc3QgKnBMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNtZUNvbW1hbmRUeXBlIGNvbW1hbmRUeXBlICkKK3sKKyAgICB0RGJsTGlua0xpc3QgbG9jYWxMaXN0OworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRTbWVDbWQgICAqcENvbW1hbmQ7CisgICAgdExpc3RFbGVtICAqcEVudHJ5VG9SZW1vdmU7CisKKyAgICB2b3NfbWVtX3plcm8oJmxvY2FsTGlzdCwgc2l6ZW9mKHREYmxMaW5rTGlzdCkpOworICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyTExPcGVuKHBNYWMtPmhIZGQsICZsb2NhbExpc3QpKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWxlZCB0byBvcGVuIGxpc3QiKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjc3JMTExvY2socExpc3QpOworICAgIGlmKCAhY3NyTExJc0xpc3RFbXB0eSggcExpc3QsIExMX0FDQ0VTU19OT0xPQ0sgKSApCisgICAgeworICAgICAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCBwTGlzdCwgTExfQUNDRVNTX05PTE9DSyk7CisKKyAgICAgICAgLy8gSGF2ZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgbG9vcCBiYWNrIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCB3aGljaCB3aWxsCisgICAgICAgIC8vIGhhcHBlbiBpZiB0aGUgZW50cnkgaXMgTk9UIG9uIHRoZSBsaXN0Li4uCisgICAgICAgIHdoaWxlKCBwRW50cnkgKQorICAgICAgICB7CisgICAgICAgICAgICBwRW50cnlUb1JlbW92ZSA9IHBFbnRyeTsKKyAgICAgICAgICAgIHBFbnRyeSA9IGNzckxMTmV4dChwTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5VG9SZW1vdmUsIHRTbWVDbWQsIExpbmsgKTsKKyAgICAgICAgICAgIGlmICggcENvbW1hbmQtPmNvbW1hbmQgPT0gY29tbWFuZFR5cGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGF0IGVudHJ5IG9ubHkKKyAgICAgICAgICAgICAgICBpZihjc3JMTFJlbW92ZUVudHJ5KCBwTGlzdCwgcEVudHJ5VG9SZW1vdmUsIExMX0FDQ0VTU19OT0xPQ0spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NyTExJbnNlcnRUYWlsKCZsb2NhbExpc3QsIHBFbnRyeVRvUmVtb3ZlLCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgfQorICAgIGNzckxMVW5sb2NrKHBMaXN0KTsKKworICAgIHdoaWxlKCAocEVudHJ5ID0gY3NyTExSZW1vdmVIZWFkKCZsb2NhbExpc3QsIExMX0FDQ0VTU19OT0xPQ0spKSApCisgICAgeworICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworICAgICAgICBjc3JBYm9ydENvbW1hbmQoIHBNYWMsIHBDb21tYW5kLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgIH0KKyAgICBjc3JMTENsb3NlKCZsb2NhbExpc3QpOworCit9CisKKworZUhhbFN0YXR1cyBjc3JTY2FuQWJvcnRNYWNTY2FuTm90Rm9yQ29ubmVjdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgIGlmKCAhY3NySXNTY2FuRm9yUm9hbUNvbW1hbmRBY3RpdmUoIHBNYWMgKSApCisgICAgeworICAgICAgICAvL09ubHkgYWJvcnQgdGhlIHNjYW4gaWYgaXQgaXMgbm90IHVzZWQgZm9yIG90aGVyIHJvYW0vY29ubmVjdCBwdXJwb3NlCisgICAgICAgIHN0YXR1cyA9IGNzclNjYW5BYm9ydE1hY1NjYW4ocE1hYyk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgY3NyU2NhbkdldFNjYW5DaGFubmVsSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0U2lyTWJNc2cgKnBNc2c7CisgICAgdEFOSV9VMTYgbXNnTGVuOworCisgICAgbXNnTGVuID0gKHRBTklfVTE2KShzaXplb2YoIHRTaXJNYk1zZyApKTsKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgbXNnTGVuKTsKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1zZywgbXNnTGVuKTsKKyAgICAgICAgcE1zZy0+dHlwZSA9IGVXTklfU01FX0dFVF9TQ0FOTkVEX0NIQU5ORUxfUkVROworICAgICAgICBwTXNnLT5tc2dMZW4gPSBtc2dMZW47CisgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorCit0QU5JX0JPT0xFQU4gY3NyUm9hbUlzVmFsaWRDaGFubmVsKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGNoYW5uZWwgKQoreworICAgIHRBTklfQk9PTEVBTiBmVmFsaWQgPSBGQUxTRTsKKyAgICB0QU5JX1UzMiBpZHhWYWxpZENoYW5uZWxzOworICAgIHRBTklfVTMyIGxlbiA9IHBNYWMtPnJvYW0ubnVtVmFsaWRDaGFubmVsczsKKyAgICAKKyAgICBmb3IgKCBpZHhWYWxpZENoYW5uZWxzID0gMDsgKCBpZHhWYWxpZENoYW5uZWxzIDwgbGVuICk7IGlkeFZhbGlkQ2hhbm5lbHMrKyApCisgICAgeworICAgICAgIGlmICggY2hhbm5lbCA9PSBwTWFjLT5yb2FtLnZhbGlkQ2hhbm5lbExpc3RbIGlkeFZhbGlkQ2hhbm5lbHMgXSApCisgICAgICAgeworICAgICAgICAgIGZWYWxpZCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgcmV0dXJuIGZWYWxpZDsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvc3JjL2Nzci9jc3JDbWRQcm9jZXNzLmMgYi9DT1JFL1NNRS9zcmMvY3NyL2NzckNtZFByb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDk5Njk2Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvc3JjL2Nzci9jc3JDbWRQcm9jZXNzLmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAgCisgICAgXGZpbGUgY3NyQ21kUHJvY2Vzcy5jCisgIAorICAgIEltcGxlbWVudGF0aW9uIGZvciBwcm9jZXNzaW5nIHZhcmlvdXMgY29tbWFuZHMuCisgIAorICAgQ29weXJpZ2h0IChDKSAyMDA2IEFpcmdvIE5ldHdvcmtzLCBJbmNvcnBvcmF0ZWQKKyAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxJbnRlcm5hbC5oIiAvL0NoZWNrIGlmIHRoZSBiZWxvdyBpbmNsdWRlIG9mIGFuaUdvYmFsLmggaXMgc3VmZmljaWVudCBmb3IgVm9sYW5zIHRvby4KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInBhbEFwaS5oIgorI2luY2x1ZGUgImNzckluc2lkZUFwaS5oIgorI2luY2x1ZGUgInNtZUluc2lkZS5oIgorI2luY2x1ZGUgInNtc0RlYnVnLmgiCisKKworCisKK2VIYWxTdGF0dXMgY3NyTXNnUHJvY2Vzc29yKCB0cEFuaVNpckdsb2JhbCBwTWFjLCAgdm9pZCAqcE1zZ0J1ZiApCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRTaXJTbWVSc3AgKnBTbWVSc3AgPSAodFNpclNtZVJzcCAqKXBNc2dCdWY7CisKKyAgICBzbXNMb2coIHBNYWMsIExPRzIsICIgIE1lc3NhZ2UgJWRbMHglMDRYXSByZWNlaXZlZCBpbiBjdXJTdGF0ZSAlZCBhbmQgc3Vic3RhdGUgJWRcbiIsCisgICAgICAgICAgICAgICAgcFNtZVJzcC0+bWVzc2FnZVR5cGUsIHBTbWVSc3AtPm1lc3NhZ2VUeXBlLCAKKyAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLmN1clN0YXRlW3BTbWVSc3AtPnNlc3Npb25JZF0sCisgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS5jdXJTdWJTdGF0ZVtwU21lUnNwLT5zZXNzaW9uSWRdICk7CisKKyAgICAvLyBQcm9jZXNzIHRoZSBtZXNzYWdlIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcm9hbWluZyBzdGF0ZXMuLi4KKyAgICAKKyNpZiBkZWZpbmVkKCBBTklfUlRUX0RFQlVHICkKKyAgICBpZighcEFkYXB0ZXItPmZSdHRNb2RlRW5hYmxlZCkKKyAgICB7CisjZW5kaWYvL1JUVCAgICAKKyAgICAgICAgc3dpdGNoIChwTWFjLT5yb2FtLmN1clN0YXRlW3BTbWVSc3AtPnNlc3Npb25JZF0pCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1JTkdfU1RBVEVfU0NBTk5JTkc6IAorICAgICAgICB7CisgICAgICAgICAgICAvL0FyZSB3ZSBpbiBzY2FuIHN0YXRlCisjaWYgZGVmaW5lZCggQU5JX0VNVUxfQVNTT0MgKQorICAgICAgICAgICAgZW11bFNjYW5uaW5nU3RhdGVNc2dQcm9jZXNzb3IoIHBBZGFwdGVyLCBwTUJCdWZIZHIgKTsKKyNlbHNlCisgICAgICAgICAgICBzdGF0dXMgPSBjc3JTY2FubmluZ1N0YXRlTXNnUHJvY2Vzc29yKHBNYWMsIHBNc2dCdWYpOworI2VuZGlmICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNhc2UgZUNTUl9ST0FNSU5HX1NUQVRFX0pPSU5FRDogCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vYXJlIHdlIGluIGpvaW5lZCBzdGF0ZQorICAgICAgICAgICAgY3NyUm9hbUpvaW5lZFN0YXRlTXNnUHJvY2Vzc29yKCBwTWFjLCBwTXNnQnVmICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY2FzZSBlQ1NSX1JPQU1JTkdfU1RBVEVfSk9JTklORzoKKyAgICAgICAgeworICAgICAgICAgICAgLy9hcmUgd2UgaW4gcm9hbWluZyBzdGF0ZXMKKyNpZiBkZWZpbmVkKCBBTklfRU1VTF9BU1NPQyApCisgICAgICAgICAgICBlbXVsUm9hbWluZ1N0YXRlTXNnUHJvY2Vzc29yKCBwQWRhcHRlciwgcE1CQnVmSGRyICk7CisjZW5kaWYKKyAgICAgICAgICAgIGNzclJvYW1pbmdTdGF0ZU1zZ1Byb2Nlc3NvciggcE1hYywgcE1zZ0J1ZiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvL0ZvciBhbGwgb3RoZXIgbWVzc2FnZXMsIHdlIGlnbm9yZSBpdCAgICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qVG8gd29yay1hcm91bmQgYW4gaXNzdWUgd2hlcmUgY2hlY2tpbmcgZm9yIHNldC9yZW1vdmUga2V5IGJhc2Ugb24gY29ubmVjdGlvbiBzdGF0ZSBpcyBubyBsb25nZXIgCisgICAgICAgICAgICAqIHdvcmthYmxlIGR1ZSB0byBmYWlsdXJlIG9yIGZpbmRpbmcgdGhlIGNvbmRpdGlvbiBtZWV0cyBib3RoIFNBUCBhbmQgaW5mcmEvSUJTUyByZXF1aXJlbWVudC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiggKGVXTklfU01FX1NFVENPTlRFWFRfUlNQID09IHBTbWVSc3AtPm1lc3NhZ2VUeXBlKSB8fAorICAgICAgICAgICAgICAgIChlV05JX1NNRV9SRU1PVkVLRVlfUlNQID09IHBTbWVSc3AtPm1lc3NhZ2VUeXBlKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgaGFuZGxpbmcgbXNnIDB4JVggQ1NSIHN0YXRlIGlzICVkXG4iKSwgcFNtZVJzcC0+bWVzc2FnZVR5cGUsIHBNYWMtPnJvYW0uY3VyU3RhdGVbcFNtZVJzcC0+c2Vzc2lvbklkXSk7CisgICAgICAgICAgICAgICAgY3NyUm9hbUNoZWNrRm9yTGlua1N0YXR1c0NoYW5nZShwTWFjLCBwU21lUnNwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIiAgTWVzc2FnZSAweCUwNFggaXMgbm90IGhhbmRsZWQgYnkgQ1NSLiBDU1Igc3RhdGUgaXMgJWQgXG4iLCBwU21lUnNwLT5tZXNzYWdlVHlwZSwgcE1hYy0+cm9hbS5jdXJTdGF0ZVtwU21lUnNwLT5zZXNzaW9uSWRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9Ly9zd2l0Y2gKKyAgICAgICAgCisjaWYgZGVmaW5lZCggQU5JX1JUVF9ERUJVRyApCisgICAgfQorI2VuZGlmLy9SVFQKKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisKK3RBTklfQk9PTEVBTiBjc3JDaGVja1BTUmVhZHkodm9pZCAqcHYpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBwdiApOworCisgICAgVk9TX0FTU0VSVCggcE1hYy0+cm9hbS5zUGVuZGluZ0NvbW1hbmRzID49IDAgKTsKKyAgICByZXR1cm4gKHBNYWMtPnJvYW0uc1BlbmRpbmdDb21tYW5kcyA9PSAwKTsKK30KKworCit2b2lkIGNzckZ1bGxQb3dlckNhbGxiYWNrKHZvaWQgKnB2LCBlSGFsU3RhdHVzIHN0YXR1cykKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIHB2ICk7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdFNtZUNtZCAqcENvbW1hbmQ7CisKKyAgICAodm9pZClzdGF0dXM7CisgICAgCisgICAgd2hpbGUoIE5VTEwgIT0gKCBwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoICZwTWFjLT5yb2FtLnJvYW1DbWRQZW5kaW5nTGlzdCwgZUFOSV9CT09MRUFOX1RSVUUgKSApICkKKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgIHNtZVB1c2hDb21tYW5kKCBwTWFjLCBwQ29tbWFuZCwgZUFOSV9CT09MRUFOX0ZBTFNFICk7CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvc3JjL2Nzci9jc3JJbnNpZGVBcGkuaCBiL0NPUkUvU01FL3NyYy9jc3IvY3NySW5zaWRlQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2ZjY4MAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL3NyYy9jc3IvY3NySW5zaWRlQXBpLmgKQEAgLTAsMCArMSw5MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAgCisKKyAgCisgICAgXGZpbGUgY3NySW5zaWRlQXBpLmgKKyAgCisgICAgRGVmaW5lIGludGVyZmFjZSBvbmx5IHVzZWQgYnkgQ1NSLgorICAKKyAgCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZCAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjaWZuZGVmIENTUl9JTlNJREVfQVBJX0hfXworI2RlZmluZSBDU1JfSU5TSURFX0FQSV9IX18KKworCisjaW5jbHVkZSAiY3NyU3VwcG9ydC5oIgorI2luY2x1ZGUgInNtZUluc2lkZS5oIgorI2luY2x1ZGUgInZvc19udml0ZW0uaCIKKworI2RlZmluZSBDU1JfUEFTU0lWRV9NQVhfQ0hBTk5FTF9USU1FICAgMTEwCisjZGVmaW5lIENTUl9QQVNTSVZFX01JTl9DSEFOTkVMX1RJTUUgICA2MAorCisjZGVmaW5lIENTUl9BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRSAgICA0MAorI2RlZmluZSBDU1JfQUNUSVZFX01JTl9DSEFOTkVMX1RJTUUgICAgMjAKKworI2lmZGVmIFdMQU5fQVBfU1RBX0NPTkNVUlJFTkNZCisjZGVmaW5lIENTUl9BQ1RJVkVfTUFYX0NIQU5ORUxfVElNRV9DT05DICAgIDI3CisjZGVmaW5lIENTUl9BQ1RJVkVfTUlOX0NIQU5ORUxfVElNRV9DT05DICAgIDIwCisjZW5kaWYKKworI2RlZmluZSBDU1JfTUFYX05VTV9TVVBQT1JURURfQ0hBTk5FTFMgNTUKKworI2RlZmluZSBDU1JfTUFYX0JTU19TVVBQT1JUICAgICAgICAgICAgMTAwCisKKy8vVGhpcyBudW1iZXIgbWludXMgMSBtZWFucyB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY2hhbm5lbCBpcyBzY2FubmVkIGJlZm9yZSBhIEJTUyBpcyByZW12b2VkIGZyb20KKy8vY2FjaGUgc2NhbiByZXN1bHQKKyNkZWZpbmUgQ1NSX0FHSU5HX0NPVU5UICAgICAzICAgCisvL1RoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgdXNlZCBieSBwYWxUaW1lcgorLy9UaGlzIGlzIHVzZWQgZm9yIHBhbFRpbWVyIHdoZW4gcmVxdWVzdCB0byBpbXBzIGZhaWxzCisjZGVmaW5lIENTUl9JRExFX1NDQU5fV0FJVF9USU1FICAgICAoMSAqIFBBTF9USU1FUl9UT19TRUNfVU5JVCkgICAgIC8vMSBzZWNvbmQgCisvL1RoaXMgaXMgdXNlZCBmb3IgcGFsVGltZXIgd2hlbiBpbXBzIHBzIGlzIGRpc2FibGVkCisvL1RoaXMgbnVtYmVyIHNoYWxsIG5vdCBiZSBzbWFsbGVyIHRoYW4gNS02IHNlY29uZHMgaW4gZ2VuZXJhbCBiZWNhdXNlIGEgZnVsbCBzY2FuIG1heSB0YWtlIDMtNCBzZWNvbmRzCisjZGVmaW5lIENTUl9JRExFX1NDQU5fTk9fUFNfSU5URVJWQUwgICAgICgxMCAqIFBBTF9USU1FUl9UT19TRUNfVU5JVCkgICAgIC8vMTAgc2Vjb25kIAorI2RlZmluZSBDU1JfSURMRV9TQ0FOX05PX1BTX0lOVEVSVkFMX01JTiAoNSAqIFBBTF9USU1FUl9UT19TRUNfVU5JVCkKKyNkZWZpbmUgQ1NSX1NDQU5fR0VUX1JFU1VMVF9JTlRFUlZBTCAgICAoNSAqIFBBTF9USU1FUl9UT19TRUNfVU5JVCkgICAgIC8vNSBzZWNvbmRzCisjaWZkZWYgV0xBTl9BUF9TVEFfQ09OQ1VSUkVOQ1kKKyNkZWZpbmUgQ1NSX1NDQU5fU1RBQVBfQ09OQ19JTlRFUlZBTCAgICAoMjAgKiBQQUxfVElNRVJfVE9fTVNfVU5JVCkgICAgIC8vMjAgbWlsbGlzZWNvbmRzCisjZW5kaWYKKyNkZWZpbmUgQ1NSX01JQ19FUlJPUl9USU1FT1VUICAoNjAgKiBQQUxfVElNRVJfVE9fU0VDX1VOSVQpICAgICAvLzYwIHNlY29uZHMKKyNkZWZpbmUgQ1NSX1RLSVBfQ09VTlRFUl9NRUFTVVJFX1RJTUVPVVQgICg2MCAqIFBBTF9USU1FUl9UT19TRUNfVU5JVCkgICAgIC8vNjAgc2Vjb25kcworI2RlZmluZSBDU1JfU0NBTl9SRVNVTFRfQUdJTkdfSU5URVJWQUwgICAgKDUgKiBQQUxfVElNRVJfVE9fU0VDX1VOSVQpICAgICAvLzUgc2Vjb25kcworLy90aGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIE5PVCB1c2VkIGJ5IHBhbFRpbWVyCisjZGVmaW5lIENTUl9TQ0FOX0FHSU5HX1RJTUVfTk9UX0NPTk5FQ1RfTk9fUFMgNTAgICAgIC8vNTAgc2Vjb25kcworI2RlZmluZSBDU1JfU0NBTl9BR0lOR19USU1FX05PVF9DT05ORUNUX1dfUFMgMzAwICAgICAvLzMwMCBzZWNvbmRzCisjZGVmaW5lIENTUl9TQ0FOX0FHSU5HX1RJTUVfQ09OTkVDVF9OT19QUyAxNTAgICAgICAgIC8vMTUwIHNlY29uZHMKKyNkZWZpbmUgQ1NSX1NDQU5fQUdJTkdfVElNRV9DT05ORUNUX1dfUFMgNjAwICAgICAgICAgLy82MDAgc2Vjb25kcworI2RlZmluZSBDU1JfSk9JTl9GQUlMVVJFX1RJTUVPVVRfREVGQVVMVCAoIDMwMDAgKQorI2RlZmluZSBDU1JfSk9JTl9GQUlMVVJFX1RJTUVPVVRfTUlOICAgKDMwMCkgIC8vbWluaW1hbCB2YWx1ZQorLy9UaGVzZSBhcmUgZ29pbmcgYWdhaW5zdCB0aGUgc2lnbmVkIFJTU0kgKHRBTklfUzgpIHNvIGl0IGlzIGJldHdlZW4gLSsxMjcKKyNkZWZpbmUgQ1NSX0JFU1RfUlNTSV9WQUxVRSAgICAgICAgICgtMzApICAgLy9SU1NJID49IHRoaXMgaXMgaW4gQ0FUNAorI2RlZmluZSBDU1JfREVGQVVMVF9SU1NJX0RCX0dBUCAgICAgMzAgLy9ldmVyeSAzMCBkYm0gZm9yIG9uZSBjYXRlZ29yeQorI2RlZmluZSBDU1JfQlNTX0NBUF9WQUxVRV9OT05FICAwICAgIC8vbm90IG11Y2ggdmFsdWUKKyNkZWZpbmUgQ1NSX0JTU19DQVBfVkFMVUVfSFQgICAgMiAgICAKKyNkZWZpbmUgQ1NSX0JTU19DQVBfVkFMVUVfV01NICAgMQorI2RlZmluZSBDU1JfQlNTX0NBUF9WQUxVRV9VQVBTRCAxCisjZGVmaW5lIENTUl9ERUZBVUxUX1JPQU1JTkdfVElNRSAxMCAgIC8vMTAgc2Vjb25kcworI2RlZmluZSBDU1JfUk9BTV9NSU4oWCwgWSkgICgoWCkgPCAoWSkgPyAoWCkgOiAoWSkpCisjZGVmaW5lIENTUl9ST0FNX01BWChYLCBZKSAgKChYKSA+IChZKSA/IChYKSA6IChZKSkKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorI2RlZmluZSBDU1JfSk9JTl9NQVhfUkVUUllfQ09VTlQgICAgICAgICAgICAgMTAKKyNkZWZpbmUgQ1NSX0pPSU5fUkVUUllfVElNRU9VVF9QRVJJT0QgICAgICAgICggMSAqICBQQUxfVElNRVJfVE9fU0VDX1VOSVQgKSAgLy8gMSBzZWNvbmQKKyNlbmRpZgorCit0eXBlZGVmIGVudW0gCit7CisgICAgZUNzck5leHRTY2FuTm90aGluZywKKyAgICBlQ3NyTmV4dExvc3RMaW5rU2NhbjFTdWNjZXNzLAorICAgIGVDc3JOZXh0TG9zdExpbmtTY2FuMUZhaWxlZCwKKyAgICBlQ3NyTmV4dExvc3RMaW5rU2NhbjJTdWNjZXNzLAorICAgIGVDc3JOZXh0TG9zdExpbmtTY2FuMkZhaWxlZCwKKyAgICBlQ3NyTmV4dExvc3RMaW5rU2NhbjNTdWNjZXNzLAorICAgIGVDc3JOZXh0ZVNjYW5Gb3JTc2lkU3VjY2VzcywKKyAgICBlQ3NyTmV4dExvc3RMaW5rU2NhbjNGYWlsZWQsCisgICAgZUNzck5leHQxMWRTY2FuMUZhaWx1cmUsCisgICAgZUNzck5leHQxMWRTY2FuMVN1Y2Nlc3MsCisgICAgZUNzck5leHQxMWRTY2FuMkZhaWx1cmUsIAorICAgIGVDc3JOZXh0MTFkU2NhbjJTdWNjZXNzLAorICAgIGVDc3JOZXh0MTFkU2NhbkNvbXBsZXRlLAorICAgIGVDc3JOZXh0ZVNjYW5Gb3JTc2lkRmFpbHVyZSwKKyAgICBlQ3NyTmV4dElkbGVTY2FuQ29tcGxldGUsCisgICAgZUNzck5leHRDYXBDaGFuZ2VTY2FuQ29tcGxldGUsCisKK31lQ3NyU2NhbkNvbXBsZXRlTmV4dENvbW1hbmQ7CisKK3R5cGVkZWYgZW51bSAgCit7CisgICAgZUNzckpvaW5TdWNjZXNzLCAKKyAgICBlQ3NySm9pbkZhaWx1cmUsCisgICAgZUNzclJlYXNzb2NTdWNjZXNzLAorICAgIGVDc3JSZWFzc29jRmFpbHVyZSwgCisgICAgZUNzck5vdGhpbmdUb0pvaW4sIAorICAgIGVDc3JTdGFydEJzc1N1Y2Nlc3MsCisgICAgZUNzclN0YXJ0QnNzRmFpbHVyZSwKKyAgICBlQ3NyU2lsZW50bHlTdG9wUm9hbWluZywKKyAgICBlQ3NyU2lsZW50bHlTdG9wUm9hbWluZ1NhdmVTdGF0ZSwKKyAgICBlQ3NySm9pbldkc0ZhaWx1cmUsCisgICAgCit9ZUNzclJvYW1Db21wbGV0ZVJlc3VsdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnU2NhblJlcVBhcmFtCit7CisgICAgdEFOSV9VOCBiUmV0dXJuQWZ0ZXIxc3RNYXRjaDsKKyAgICB0QU5JX1U4IGZVbmlxdWVSZXN1bHQ7CisgICAgdEFOSV9VOCBmcmVzaFNjYW47CisgICAgdEFOSV9VOCBoaWRkZW5Tc2lkOworICAgIHRBTklfVTggcmVzZXJ2ZWQ7Cit9dFNjYW5SZXFQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ3NyU2NhblJlc3VsdAoreworICAgIHRMaXN0RWxlbSBMaW5rOworICAgIHRBTklfUzMyIEFnaW5nQ291bnQ7ICAgIC8vVGhpcyBCU1MgaXMgcmVtb3ZlZCB3aGVuIGl0IHJlYWNoZXMgMCBvciBsZXNzCisgICAgdEFOSV9VMzIgcHJlZmVyVmFsdWU7ICAgLy9UaGUgYmlnZ2VyIHRoZSBudW1iZXIsIHRoZSBiZXR0ZXIgdGhlIEJTUy4gVGhpcyB2YWx1ZSBvdmVycmlkZSBjYXBWYWx1ZQorICAgIHRBTklfVTMyIGNhcFZhbHVlOyAgLy9UaGUgYmlnZ2dlciB0aGUgYmV0dGVyLiBUaGlzIHZhbHVlIGlzIGluIHVzZSBvbmx5IGlmIHdlIGhhdmUgZXF1YWwgcHJlZmVyVmFsdWUKKyAgICAvL1RoaXMgbWVtYmVyIG11c3QgYmUgdGhlIGxhc3QgaW4gdGhlIHN0cnVjdHVyZSBiZWNhdXNlIHRoZSBlbmQgb2YgdFNpckJzc0Rlc2NyaXB0aW9uIChpbnNpZGUpIGlzIGFuCisgICAgLy8gICAgYXJyYXkgd2l0aCBub25rbm93biBzaXplIGF0IHRoaXMgdGltZQorICAgIAorICAgIGVDc3JFbmNyeXB0aW9uVHlwZSB1Y0VuY3J5cHRpb25UeXBlOyAvL1ByZWZlcnJlZCBFbmNyeXB0aW9uIHR5cGUgdGhhdCBtYXRjaGVkIHdpdGggcHJvZmlsZS4KKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgbWNFbmNyeXB0aW9uVHlwZTsgCisgICAgZUNzckF1dGhUeXBlIGF1dGhUeXBlOyAvL1ByZWZlcnJlZCBhdXRoIHR5cGUgdGhhdCBtYXRjaGVkIHdpdGggdGhlIHByb2ZpbGUuCisKKyAgICB0Q3NyU2NhblJlc3VsdEluZm8gUmVzdWx0OworfXRDc3JTY2FuUmVzdWx0OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHREYmxMaW5rTGlzdCBMaXN0OworICAgIHRMaXN0RWxlbSAqcEN1ckVudHJ5OworfXRTY2FuUmVzdWx0TGlzdDsKKworCisKKworI2RlZmluZSBDU1JfSVNfUk9BTV9SRUFTT04oIHBDbWQsIHJlYXNvbiApICggKHJlYXNvbikgPT0gKHBDbWQpLT5yb2FtQ21kLnJvYW1SZWFzb24gKQorI2RlZmluZSBDU1JfSVNfQkVUVEVSX1BSRUZFUl9WQUxVRSh2MSwgdjIpICAgKCh2MSkgPiAodjIpKQorI2RlZmluZSBDU1JfSVNfRVFVQUxfUFJFRkVSX1ZBTFVFKHYxLCB2MikgICAoKHYxKSA9PSAodjIpKQorI2RlZmluZSBDU1JfSVNfQkVUVEVSX0NBUF9WQUxVRSh2MSwgdjIpICAgICAoKHYxKSA+ICh2MikpCisjZGVmaW5lIENTUl9JU19FTkNfVFlQRV9TVEFUSUMoIGVuY1R5cGUgKSAoICggZUNTUl9FTkNSWVBUX1RZUEVfTk9ORSA9PSAoZW5jVHlwZSkgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZID09IChlbmNUeXBlKSApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZID09IChlbmNUeXBlKSApICkKKyNkZWZpbmUgQ1NSX0lTX1dBSVRfRk9SX0tFWSggcE1hYywgc2Vzc2lvbklkICkgKCBDU1JfSVNfUk9BTV9KT0lORUQoIHBNYWMsIHNlc3Npb25JZCApICYmIENTUl9JU19ST0FNX1NVQlNUQVRFX1dBSVRGT1JLRVkoIHBNYWMsIHNlc3Npb25JZCApICkKKy8vV0lGSSBoYXMgYSB0ZXN0IGNhc2UgZm9yIG5vdCB1c2luZyBIVCByYXRlcyB3aXRoIFRLSVAgYXMgZW5jcnlwdGlvbgorLy9XZSBtYXkgbmVlZCB0byBhZGQgV0VQIGJ1dCBmb3Igbm93LCBUS0lQIG9ubHkuCisKKyNkZWZpbmUgQ1NSX0lTXzExbl9BTExPV0VEKCBlbmNUeXBlICkgKCggZUNTUl9FTkNSWVBUX1RZUEVfVEtJUCAhPSAoZW5jVHlwZSkgKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZICE9IChlbmNUeXBlKSApICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZICE9IChlbmNUeXBlKSApICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MCAhPSAoZW5jVHlwZSkgKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0ICE9IChlbmNUeXBlKSApICkKKworZUNzclJvYW1TdGF0ZSBjc3JSb2FtU3RhdGVDaGFuZ2UoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVDc3JSb2FtU3RhdGUgTmV3Um9hbVN0YXRlLCB0QU5JX1U4IHNlc3Npb25JZCk7CitlSGFsU3RhdHVzIGNzclNjYW5uaW5nU3RhdGVNc2dQcm9jZXNzb3IoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYgKTsKK3ZvaWQgY3NyUm9hbWluZ1N0YXRlTXNnUHJvY2Vzc29yKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmICk7Cit2b2lkIGNzclJvYW1Kb2luZWRTdGF0ZU1zZ1Byb2Nlc3NvciggdHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqcE1zZ0J1ZiApOwordEFOSV9CT09MRUFOIGNzclNjYW5Db21wbGV0ZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpclNtZVNjYW5Sc3AgKnBTY2FuUnNwICk7Cit2b2lkIGNzclJlbGVhc2VDb21tYW5kUm9hbSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCk7Cit2b2lkIGNzclJlbGVhc2VDb21tYW5kU2Nhbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCk7Cit2b2lkIGNzclJlbGVhc2VDb21tYW5kV21TdGF0dXNDaGFuZ2UodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOworLy9wSWVzMiBjYW4gYmUgTlVMTAordEFOSV9CT09MRUFOIGNzcklzRHVwbGljYXRlQnNzRGVzY3JpcHRpb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMiwgdERvdDExZkJlYWNvbklFcyAqcEllczIgKTsKK2VIYWxTdGF0dXMgY3NyUm9hbVNhdmVDb25uZWN0ZWRCc3NEZXNjKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MgKTsKK3RBTklfQk9PTEVBTiBjc3JJc05ldHdvcmtUeXBlRXF1YWwoIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MxLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMiApOworZUhhbFN0YXR1cyBjc3JTY2FuU21lU2NhblJlc3BvbnNlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB2b2lkICpwTXNnQnVmICk7CisvKgorICAgUHJlcGFyZSBhIGZpbHRlciBiYXNlIG9uIGEgcHJvZmlsZSBmb3IgcGFyc2luZyB0aGUgc2NhbiByZXN1bHRzLgorICAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgY2FsbGVyIE1VU1QgY2FsbCBjc3JGcmVlU2NhbkZpbHRlciBvbiAKKyAgIHBTY2FuRmlsdGVyIHdoZW4gaXQgaXMgZG9uZSB3aXRoIHRoZSBmaWx0ZXIuCisqLworZUhhbFN0YXR1cyBjc3JSb2FtUHJlcGFyZUZpbHRlckZyb21Qcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwU2NhbkZpbHRlcik7CitlSGFsU3RhdHVzIGNzclJvYW1Db3B5UHJvZmlsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbVByb2ZpbGUgKnBEc3RQcm9maWxlLCB0Q3NyUm9hbVByb2ZpbGUgKnBTcmNQcm9maWxlKTsKK2VIYWxTdGF0dXMgY3NyUm9hbVN0YXJ0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBjc3JSb2FtU3RvcCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpOwordm9pZCBjc3JSb2FtU3RhcnRNSUNGYWlsdXJlVGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGNzclJvYW1TdG9wTUlDRmFpbHVyZVRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBjc3JSb2FtU3RhcnRUS0lQQ291bnRlck1lYXN1cmVUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgY3NyUm9hbVN0b3BUS0lQQ291bnRlck1lYXN1cmVUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworZUhhbFN0YXR1cyBjc3JTY2FuT3Blbih0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2VIYWxTdGF0dXMgY3NyU2NhbkNsb3NlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworZUhhbFN0YXR1cyBjc3JTY2FuUmVxdWVzdExvc3RMaW5rMSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICk7CitlSGFsU3RhdHVzIGNzclNjYW5SZXF1ZXN0TG9zdExpbmsyKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQgKTsKK2VIYWxTdGF0dXMgY3NyU2NhblJlcXVlc3RMb3N0TGluazMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApOworZUhhbFN0YXR1cyBjc3JTY2FuSGFuZGxlRmFpbGVkTG9zdGxpbmsxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCk7CitlSGFsU3RhdHVzIGNzclNjYW5IYW5kbGVGYWlsZWRMb3N0bGluazIodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKTsKK2VIYWxTdGF0dXMgY3NyU2NhbkhhbmRsZUZhaWxlZExvc3RsaW5rMyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpOwordENzclNjYW5SZXN1bHQgKmNzclNjYW5BcHBlbmRCc3NEZXNjcmlwdGlvbiggdHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpOwordm9pZCBjc3JTY2FuQ2FsbENhbGxiYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kLCBlQ3NyU2NhblN0YXR1cyBzY2FuU3RhdHVzKTsKK2VIYWxTdGF0dXMgY3NyU2NhbkNvcHlSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTY2FuUmVxdWVzdCAqcERzdFJlcSwgdENzclNjYW5SZXF1ZXN0ICpwU3JjUmVxKTsKK2VIYWxTdGF0dXMgY3NyU2NhbkZyZWVSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTY2FuUmVxdWVzdCAqcFJlcSk7CitlSGFsU3RhdHVzIGNzclNjYW5Db3B5UmVzdWx0TGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2NhblJlc3VsdEhhbmRsZSBoSW4sIHRTY2FuUmVzdWx0SGFuZGxlICpwaFJlc3VsdCk7Cit2b2lkIGNzckluaXRCR1NjYW5DaGFubmVsTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2VIYWxTdGF0dXMgY3NyU2NhbkZvclNTSUQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCB0QU5JX1UzMiByb2FtSWQpOworZUhhbFN0YXR1cyBjc3JTY2FuRm9yQ2FwYWJpbGl0eUNoYW5nZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyU21lQXBOZXdDYXBzICpwTmV3Q2Fwcyk7CitlSGFsU3RhdHVzIGNzclNjYW5TdGFydEdldFJlc3VsdFRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworZUhhbFN0YXR1cyBjc3JTY2FuU3RvcEdldFJlc3VsdFRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworZUhhbFN0YXR1cyBjc3JTY2FuU3RhcnRSZXN1bHRBZ2luZ1RpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworZUhhbFN0YXR1cyBjc3JTY2FuU3RvcFJlc3VsdEFnaW5nVGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitlSGFsU3RhdHVzIGNzclNjYW5CR1NjYW5FbmFibGUodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitlSGFsU3RhdHVzIGNzclNjYW5TdGFydElkbGVTY2FuVGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgaW50ZXJ2YWwpOworZUhhbFN0YXR1cyBjc3JTY2FuU3RvcElkbGVTY2FuVGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitlSGFsU3RhdHVzIGNzclNjYW5TdGFydElkbGVTY2FuKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworLy9QYXJhbTogcFRpbWVJbnRlcnZhbCAtLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBpbiByZXR1cm4sIGlmIGZhaWxlZCwgdG8gc3BlY2lmeSB0aGUgbnh0IHRpbWUgaW50ZXJ2YWwgZm9yIAorLy9pZGxlIHNjYW4gdGltZXIgaW50ZXJ2YWwKKy8vUmV0dXJuOiBOb3Qgc3VjY2VzcyAtLSBtZWFuaW5nIGl0IGNhbm5vdCBzdGFydCBJTVBTLCBjYWxsZXIgbmVlZHMgdG8gc3RhcnQgYSB0aW1lciBmb3IgaWRsZSBzY2FuCitlSGFsU3RhdHVzIGNzclNjYW5UcmlnZ2VySWRsZVNjYW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBUaW1lSW50ZXJ2YWwpOwordm9pZCBjc3JTY2FuQ2FuY2VsSWRsZVNjYW4odHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGNzclNjYW5TdG9wVGltZXJzKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworLy9UaGlzIGZ1bmN0aW9uIHdpbGwgcmVtb3ZlIHNjYW4gY29tbWFuZHMgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gYXNzb2NpYXRpb24gb3IgSUJTUwordEFOSV9CT09MRUFOIGNzclNjYW5SZW1vdmVOb3RSb2FtaW5nU2NhbkNvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisvL1RvIHJlbW92ZSBmcmVzaCBzY2FuIGNvbW1hbmRzIGZyb20gdGhlIHBlbmRpbmcgcXVldWUKK3RBTklfQk9PTEVBTiBjc3JTY2FuUmVtb3ZlRnJlc2hTY2FuQ29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IHNlc3Npb25JZCk7CitlSGFsU3RhdHVzIGNzclNjYW5BYm9ydE1hY1NjYW4odHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIGNzclJlbW92ZUNtZEZyb21QZW5kaW5nTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RGJsTGlua0xpc3QgKnBMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU21lQ29tbWFuZFR5cGUgY29tbWFuZFR5cGUgKTsKK2VIYWxTdGF0dXMgY3NyU2NhbkFib3J0TWFjU2Nhbk5vdEZvckNvbm5lY3QodHBBbmlTaXJHbG9iYWwgcE1hYyk7CitlSGFsU3RhdHVzIGNzclNjYW5HZXRTY2FuQ2hhbm5lbEluZm8odHBBbmlTaXJHbG9iYWwgcE1hYyk7CisvL1RvIGFnZSBvdXQgc2NhbiByZXN1bHRzIGJhc2UuIHRTbWVHZXRTY2FuQ2huUnNwIGlzIGEgcG9pbnRlciByZXR1cm5lZCBieSBMSU0gdGhhdAorLy9oYXMgdGhlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBzY2FubmVkIGNoYW5uZWxzLgorLy9UaGUgbG9naWMgaXMgdGhhdCB3aGVuZXZlciBDU1IgYWRkIGEgQlNTIHRvIHNjYW4gcmVzdWx0LCBpdCBzZXQgdGhlIGFnZSBjb3VudCB0bworLy9hIHZhbHVlLiBUaGlzIGZ1bmN0aW9uIGRlZHVjdCB0aGUgYWdlIGNvdW50IGlmIGNoYW5uZWxJZCBtYXRjaGVzIHRoZSBCU1MnIGNoYW5uZWxJZAorLy9UaGUgQlNTIGlzIHJlbW92ZSBpZiB0aGUgY291bnQgcmVhY2hlcyAwLgorZUhhbFN0YXR1cyBjc3JTY2FuQWdlUmVzdWx0cyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lR2V0U2NhbkNoblJzcCAqcFNjYW5DaG5JbmZvKTsKKworLy9JZiBmRm9yY2UgaXMgVFJVRSB3ZSB3aWxsIHNhdmUgdGhlIG5ldyBTdHJpbmcgdGhhdCBpcyBsZWFybid0LgorLy9UeXBpY2FsbHkgaXQgd2lsbCBiZSB0cnVlIGluIGNhc2Ugb2YgSm9pbiBvciB1c2VyIGluaXRpYXRlZCBpb2N0bAordEFOSV9CT09MRUFOIGNzckxlYXJuQ291bnRyeUluZm9ybWF0aW9uKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0QU5JX0JPT0xFQU4gZkZvcmNlICk7Cit2b2lkIGNzckFwcGx5Q291bnRyeUluZm9ybWF0aW9uKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX0JPT0xFQU4gZkZvcmNlICk7Cit2b2lkIGNzclNldENmZ1NjYW5Db250cm9sTGlzdCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqY291bnRyeUNvZGUsIHRDc3JDaGFubmVsICpwQ2hhbm5lbExpc3QgICk7Cit2b2lkIGNzclJlaW5pdFNjYW5DbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOwordm9pZCBjc3JGcmVlU2NhblJlc3VsdEVudHJ5KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlc3VsdCAqcFJlc3VsdCApOworCitlSGFsU3RhdHVzIGNzclJvYW1DYWxsQ2FsbGJhY2sodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgcm9hbUlkLCBlUm9hbUNtZFN0YXR1cyB1MSwgZUNzclJvYW1SZXN1bHQgdTIpOworZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVDb25uZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNjYW5SZXN1bHRIYW5kbGUgaEJTU0xpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JSb2FtUmVhc29uIHJlYXNvbiwgdEFOSV9VMzIgcm9hbUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX0JPT0xFQU4gZkltZWRpYXRlLCB0QU5JX0JPT0xFQU4gZkNsZWFyU2Nhbik7CitlSGFsU3RhdHVzIGNzclJvYW1Jc3N1ZVJlYXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqcE1vZFByb2ZpbGVGaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNzclJvYW1SZWFzb24gcmVhc29uLCB0QU5JX1UzMiByb2FtSWQsIHRBTklfQk9PTEVBTiBmSW1lZGlhdGUpOwordm9pZCBjc3JSb2FtQ29tcGxldGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVDc3JSb2FtQ29tcGxldGVSZXN1bHQgUmVzdWx0LCB2b2lkICpDb250ZXh0ICk7CitlSGFsU3RhdHVzIGNzclJvYW1Jc3N1ZVNldENvbnRleHRSZXEoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgZUNzckVuY3J5cHRpb25UeXBlIEVuY3J5cHRUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgKmJzc0lkLCB0QU5JX0JPT0xFQU4gYWRkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9CT09MRUFOIGZVbmljYXN0LCB0QW5pS2V5RGlyZWN0aW9uIGFuaUtleURpcmVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGtleUlkLCB0QU5JX1UxNiBrZXlMZW5ndGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEtleSwgdEFOSV9VOCBwYWVSb2xlICk7CitlSGFsU3RhdHVzIGNzclJvYW1Qcm9jZXNzRGlzYXNzb2NEZWF1dGgoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9CT09MRUFOIGZEaXNhc3NvYywgdEFOSV9CT09MRUFOIGZNSUNGYWlsdXJlICk7CitlSGFsU3RhdHVzIGNzclJvYW1TYXZlQ29ubmVjdGVkSW5mb21hdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcEllcyk7Cit2b2lkIGNzclJvYW1DaGVja0ZvckxpbmtTdGF0dXNDaGFuZ2UoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVSc3AgKnBTaXJNc2cgKTsKK3ZvaWQgY3NyUm9hbVN0YXRzUnNwUHJvY2Vzc29yKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVSc3AgKnBTaXJNc2cpOworZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVTdGFydEJzcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVN0YXJ0QnNzUGFyYW1zICpwUGFyYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgdEFOSV9VMzIgcm9hbUlkICk7CitlSGFsU3RhdHVzIGNzclJvYW1Jc3N1ZVN0b3BCc3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgZUNzclJvYW1TdWJTdGF0ZSBOZXdTdWJzdGF0ZSApOwordEFOSV9CT09MRUFOIGNzcklzU2FtZVByb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZTEsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUyKTsKK3RBTklfQk9PTEVBTiBjc3JJc1JvYW1Db21tYW5kV2FpdGluZyh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3RBTklfQk9PTEVBTiBjc3JJc1JvYW1Db21tYW5kV2FpdGluZ0ZvclNlc3Npb24odHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKTsKK3RBTklfQk9PTEVBTiBjc3JJc1NjYW5Gb3JSb2FtQ29tbWFuZEFjdGl2ZSggdHBBbmlTaXJHbG9iYWwgcE1hYyApOworZVJvYW1DbWRTdGF0dXMgY3NyR2V0Um9hbUNvbXBsZXRlU3RhdHVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCk7CisvL3BCYW5kIGNhbiBiZSBOVUxMIGlmIGNhbGxlciBkb2Vzbid0IG5lZWQgdG8gZ2V0IGl0CisvL2VDc3JDZmdEb3QxMU1vZGUgY3NyUm9hbUdldFBoeU1vZGVCYW5kRm9yQnNzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCBlQ3NyUGh5TW9kZSBwaHlNb2RlSW4sIHRBTklfVTggb3BlcmF0aW9uQ2huLCBlQ3NyQmFuZCAqcEJhbmQgKTsKK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlRGlzYXNzb2NpYXRlQ21kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIGVDc3JSb2FtRGlzY29ubmVjdFJlYXNvbiByZWFzb24gKTsKK2VIYWxTdGF0dXMgY3NyUm9hbURpc2Nvbm5lY3RJbnRlcm5hbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIGVDc3JSb2FtRGlzY29ubmVjdFJlYXNvbiByZWFzb24pOworLy9wQ29tbWFuZCBtYXkgYmUgTlVMTAordm9pZCBjc3JSb2FtUmVtb3ZlRHVwbGljYXRlQ29tbWFuZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRTbWVDbWQgKnBDb21tYW5kLCBlQ3NyUm9hbVJlYXNvbiBlUm9hbVJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2VIYWxTdGF0dXMgY3NyU2VuZEpvaW5SZXFNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzY3JpcHRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdERvdDExZkJlYWNvbklFcyAqcEllcyApOworZUhhbFN0YXR1cyBjc3JTZW5kTUJEaXNhc3NvY1JlcU1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0U2lyTWFjQWRkciBic3NJZCwgdEFOSV9VMTYgcmVhc29uQ29kZSApOworZUhhbFN0YXR1cyBjc3JTZW5kTUJEZWF1dGhSZXFNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdFNpck1hY0FkZHIgYnNzSWQsIHRBTklfVTE2IHJlYXNvbkNvZGUgKTsKK2VIYWxTdGF0dXMgY3NyU2VuZE1CRGlzYXNzb2NDbmZNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyU21lRGlzYXNzb2NJbmQgcERpc2Fzc29jSW5kICk7CitlSGFsU3RhdHVzIGNzclNlbmRNQkRlYXV0aENuZk1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJTbWVEZWF1dGhJbmQgcERlYXV0aEluZCApOworZUhhbFN0YXR1cyBjc3JTZW5kQXNzb2NDbmZNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRwU2lyU21lQXNzb2NJbmQgcEFzc29jSW5kLCBlSGFsU3RhdHVzIHN0YXR1cyApOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK2VIYWxTdGF0dXMgY3NyU2VuZEFzc29jSW5kVG9VcHBlckxheWVyQ25mTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFNpclNtZUFzc29jSW5kIHBBc3NvY0luZCwgZUhhbFN0YXR1cyBIYWxzdGF0dXMsIHRBTklfVTggc2Vzc2lvbklkICk7CisjZW5kaWYKK2VIYWxTdGF0dXMgY3NyU2VuZE1CU3RhcnRCc3NSZXFNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgZUNzclJvYW1Cc3NUeXBlIGJzc1R5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1TdGFydEJzc1BhcmFtcyAqcFBhcmFtLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjICk7CitlSGFsU3RhdHVzIGNzclNlbmRNQlN0b3BCc3NSZXFNc2coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApOworZUhhbFN0YXR1cyBjc3JTZW5kU21lUmVhc3NvY1JlcU1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjcmlwdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlICk7CisKK3RBTklfQk9PTEVBTiBjc3JJc01hY0FkZHJlc3NFcXVhbCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckJzc2lkICpwTWFjQWRkcjEsIHRDc3JCc3NpZCAqcE1hY0FkZHIyICk7CisvL0NhbGxlciBzaG91bGQgcHV0IHRoZSBCU1MnIHNzaWQgdG8gZmllZGwgYnNzU3NpZCB3aGVuIGNvbXBhcmluZyBTU0lEIGZvciBhIEJTUy4KK3RBTklfQk9PTEVBTiBjc3JJc1NzaWRNYXRjaCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqc3NpZDEsIHRBTklfVTggc3NpZDFMZW4sIHRBTklfVTggKmJzc1NzaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggYnNzU3NpZExlbiwgdEFOSV9CT09MRUFOIGZTc2lkUmVxdWlyZWQgKTsKK3RBTklfQk9PTEVBTiBjc3JJc1BoeU1vZGVNYXRjaCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgcGh5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyQ2ZnRG90MTFNb2RlICpwUmV0dXJuQ2ZnRG90MTFNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcyk7Cit0QU5JX0JPT0xFQU4gY3NyUm9hbUlzQ2hhbm5lbFZhbGlkKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGNoYW5uZWwgKTsKKworLy9wTnVtQ2hhbiBpcyBhIGNhbGxlciBhbGxvY2F0ZWQgc3BhY2Ugd2l0aCB0aGUgc2l6ZW9mIHBDaGFubmVscworZUhhbFN0YXR1cyBjc3JHZXRDZmdWYWxpZENoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBDaGFubmVscywgdEFOSV9VMzIgKnBOdW1DaGFuKTsKK3ZvaWQgY3NyUm9hbUNjbUNmZ1NldENhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9TMzIgcmVzdWx0KTsKK3ZvaWQgY3NyU2NhbkNjbUNmZ1NldENhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9TMzIgcmVzdWx0KTsKKworLy9UbyBmcmVlIHRoZSBsYXN0IHJvYW1pbmcgcHJvZmlsZQordm9pZCBjc3JGcmVlUm9hbVByb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKTsKK3ZvaWQgY3NyRnJlZUNvbm5lY3RCc3NEZXNjKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCk7CitlSGFsU3RhdHVzIGNzck1vdmVCc3NUb0hlYWRGcm9tQlNTSUQodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckJzc2lkICpic3NpZCwgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5SZXN1bHQpOwordEFOSV9CT09MRUFOIGNzckNoZWNrUFNSZWFkeSh2b2lkICpwdik7Cit2b2lkIGNzckZ1bGxQb3dlckNhbGxiYWNrKHZvaWQgKnB2LCBlSGFsU3RhdHVzIHN0YXR1cyk7CisvL3RvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBpbnNpZGUgdGhlIHByb2ZpbGUgc3RydWN0dXJlCit2b2lkIGNzclJlbGVhc2VQcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUpOworLy9UbyBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgaW5zaWRlIHNjYW5GaWx0ZXIKK3ZvaWQgY3NyRnJlZVNjYW5GaWx0ZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBTY2FuRmlsdGVyKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCitlQ3NyQ2ZnRG90MTFNb2RlIGNzckdldENmZ0RvdDExTW9kZUZyb21Dc3JQaHlNb2RlKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIGVDc3JQaHlNb2RlIHBoeU1vZGUsIHRBTklfQk9PTEVBTiBmUHJvcHJpZXRhcnkpOworI2Vsc2UKK2VDc3JDZmdEb3QxMU1vZGUgY3NyR2V0Q2ZnRG90MTFNb2RlRnJvbUNzclBoeU1vZGUoZUNzclBoeU1vZGUgcGh5TW9kZSwgdEFOSV9CT09MRUFOIGZQcm9wcmlldGFyeSk7CisjZW5kaWYKK3RBTklfVTMyIGNzclRyYW5zbGF0ZVRvV05JQ2ZnRG90MTFNb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVDc3JDZmdEb3QxMU1vZGUgY3NyRG90MTFNb2RlKTsKK3ZvaWQgY3NyU2F2ZUNoYW5uZWxQb3dlckZvckJhbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfQk9PTEVBTiBmUG9wdWxhdGU1R0JhbmQgKTsKK3ZvaWQgY3NyQXBwbHlDaGFubmVsUG93ZXJDb3VudHJ5SW5mbyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckNoYW5uZWwgKnBDaGFubmVsTGlzdCwgdEFOSV9VOCAqY291bnRyeUNvZGUpOwordm9pZCBjc3JBc3NpZ25Sc3NpRm9yQ2F0ZWdvcnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjYXRPZmZzZXQpOwordEFOSV9CT09MRUFOIGNzcklzTWFjQWRkcmVzc1plcm8oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JCc3NpZCAqcE1hY0FkZHIgKTsKK3RBTklfQk9PTEVBTiBjc3JJc01hY0FkZHJlc3NCcm9hZGNhc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JCc3NpZCAqcE1hY0FkZHIgKTsKK2VIYWxTdGF0dXMgY3NyUm9hbVJlbW92ZUNvbm5lY3RlZEJzc0Zyb21TY2FuQ2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwQ29ublByb2ZpbGUpOworZUhhbFN0YXR1cyBjc3JSb2FtU3RhcnRSb2FtaW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgZUNzclJvYW1pbmdSZWFzb24gcm9hbWluZ1JlYXNvbik7CisvL3JldHVybiBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciByb2FtaW5nIGNvbXBsZXRlZCBvciBjb250aW51ZS4KK3RBTklfQk9PTEVBTiBjc3JSb2FtQ29tcGxldGVSb2FtaW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfQk9PTEVBTiBmRm9yY2UsIGVDc3JSb2FtUmVzdWx0IHJvYW1SZXN1bHQpOwordm9pZCBjc3JSb2FtQ29tcGxldGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRDc3JSb2FtSW5mbyAqcFJvYW1JbmZvLCB0U21lQ21kICpwQ29tbWFuZCwgZUNzclJvYW1SZXN1bHQgcm9hbVJlc3VsdCwgdEFOSV9CT09MRUFOIGZTdWNjZXNzKTsKK3ZvaWQgY3NyUm9hbUNhbmNlbFJvYW1pbmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKTsKK3ZvaWQgY3NyUmVzZXRDb3VudHJ5SW5mb3JtYXRpb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfQk9PTEVBTiBmRm9yY2UgKTsKK3ZvaWQgY3NyUmVzZXRQTUtJRENhbmRpZGF0ZUxpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCit2b2lkIGNzclJlc2V0QktJRENhbmRpZGF0ZUxpc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCit2b2lkIGNzclNhdmVUb0NoYW5uZWxQb3dlcjJHXzVHKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiB0YWJsZVNpemUsIHRTaXJNYWNDaGFuSW5mbyAqY2hhbm5lbFRhYmxlICk7CisvL0dldCB0aGUgbGlzdCBvZiB0aGUgYmFzZSBjaGFubmVscyB0byBzY2FuIGZvciBwYXNzaXZlbHkgMTFkIGluZm8KK2VIYWxTdGF0dXMgY3NyU2NhbkdldFN1cHBvcnRlZENoYW5uZWxzKCB0cEFuaVNpckdsb2JhbCBwTWFjICk7CisvL1RvIGNoZWNrIHdoZXRoZXIgYSBjb3VudHJ5IGNvZGUgbWF0Y2hlcyB0aGUgb25lIGluIHRoZSBJRQorLy9Pbmx5IGNoZWNrIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycywgaWdub3JpbmcgaW4vb3V0ZG9vcgorLy9wQ291bnRyeSAtLSBjYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluIHRoZSBjb3VudHJ5IGNvZGUgdGhhdCBpcyBjaGVja2luZyBhZ2FpbnN0CisvL3RoZSBvbmUgaW4gcEllcy4gSXQgY2FuIGJlIE5VTEwuCisvL2NhbGxlciBtdXN0IHByb3ZpZGUgcEllcywgaXQgY2Fubm90IGJlIE5VTEwKKy8vVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIFRSVUUgaWYgMTFkIHN1cHBvcnQgaXMgbm90IHR1cm5lZCBvbi4KKy8vcEllcyBjYW5ub3QgYmUgTlVMTAordEFOSV9CT09MRUFOIGNzck1hdGNoQ291bnRyeUNvZGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBDb3VudHJ5LCB0RG90MTFmQmVhY29uSUVzICpwSWVzICk7CitlSGFsU3RhdHVzIGNzclJvYW1TZXRLZXkoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1TZXRLZXkgKnBTZXRLZXksIHRBTklfVTMyIHJvYW1JZCApOworZUhhbFN0YXR1cyBjc3JSb2FtT3BlblNlc3Npb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIGNzclJvYW1Db21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFNlbGZNYWNBZGRyLCB0QU5JX1U4ICpwYlNlc3Npb25JZCApOworLy9mU3luYzogVFJVRSBtZWFucyBjbGVhbnVwbmVlZHMgdG8gaGFuZGxlIHN5bmNocm9ub3VzbHkuCitlSGFsU3RhdHVzIGNzclJvYW1DbG9zZVNlc3Npb24oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9CT09MRUFOIGZTeW5jLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUm9hbVNlc3Npb25DbG9zZUNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ29udGV4dCApOwordm9pZCBjc3JDbGVhbnVwU2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpOworZUhhbFN0YXR1cyBjc3JSb2FtR2V0U2Vzc2lvbklkRnJvbUJTU0lEKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQnNzaWQgKmJzc2lkLCB0QU5JX1UzMiAqcFNlc3Npb25JZCApOworZUNzckNmZ0RvdDExTW9kZSBjc3JGaW5kQmVzdFBoeU1vZGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHBoeU1vZGUgKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzclNjYW5FbmFibGUKKyAgICBcYnJpZWYgRW5hYmxlIHRoZSBzY2FubmluZyBmZWF0dXJlIG9mIENTUi4gSXQgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBzY2FuIHJlcXVlc3QgY2FuIGJlIHBlcmZvcm1lZC4KKyAgICBccGFyYW0gdEhhbEhhbmRsZSAtIEhBTCBjb250ZXh0IGhhbmRsZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JTY2FuRW5hYmxlKHRwQW5pU2lyR2xvYmFsKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzclNjYW5EaXNhYmxlCisgICAgXGJyaWVmIERpc2FibGVpbmcgdGhlIHNjYW5uaW5nIGZlYXR1cmUgb2YgQ1NSLiBBZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybiBzdWNjZXNzLCBubyBzY2FuIGlzIHBlcmZvcm1lZCB1bnRpbCAKK2Egc3VjY2Vzc2Z1bGwgdG8gY3NyU2NhbkVuYWJsZQorICAgIFxwYXJhbSB0SGFsSGFuZGxlIC0gSEFMIGNvbnRleHQgaGFuZGxlCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclNjYW5EaXNhYmxlKHRwQW5pU2lyR2xvYmFsKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JTY2FuUmVxdWVzdAorICAgIFxicmllZiBSZXF1ZXN0IGEgMTFkIG9yIGZ1bGwgc2Nhbi4KKyAgICBccGFyYW0gcFNjYW5SZXF1ZXN0SUQgLSBwb2ludGVyIHRvIGFuIG9iamVjdCB0byBnZXQgYmFjayB0aGUgcmVxdWVzdCBJRAorICAgIFxwYXJhbSBjYWxsYmFjayAtIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBzY2FuIGNhbGxzIHVwb24gZmluaXNoLCB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgY3NyU2NhblJlcXVlc3QgcmV0dXJucyBlcnJvcgorICAgIFxwYXJhbSBwQ29udGV4dCAtIGEgcG9pbnRlciBwYXNzZWQgaW4gZm9yIHRoZSBjYWxsYmFjaworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JTY2FuUmVxdWVzdCh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMTYsIHRDc3JTY2FuUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwU2NhblJlcXVlc3RJRCwgY3NyU2NhbkNvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgdm9pZCAqcENvbnRleHQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyU2NhbkFib3J0CisgICAgXGJyaWVmIElmIGEgc2NhbiByZXF1ZXN0IGlzIGFib3J0LCB0aGUgc2NhbiBjb21wbGV0ZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgY3NyU2NhbkFib3J0IHJldHVybnMuCisgICAgXHBhcmFtIHBTY2FuUmVxdWVzdElEIC0gVGhlIHJlcXVlc3QgSUQgcmV0dXJuZWQgZnJvbSBjc3JTY2FuUmVxdWVzdAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JTY2FuQWJvcnQodHBBbmlTaXJHbG9iYWwsIHRBTklfVTMyIHNjYW5SZXF1ZXN0SUQpOworCitlSGFsU3RhdHVzIGNzclNjYW5TZXRCR1NjYW5wYXJhbXModHBBbmlTaXJHbG9iYWwsIHRDc3JCR1NjYW5SZXF1ZXN0ICopOworZUhhbFN0YXR1cyBjc3JTY2FuQkdTY2FuQWJvcnQodHBBbmlTaXJHbG9iYWwpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyU2NhbkdldFJlc3VsdAorICAgIFxicmllZiBSZXR1cm4gc2NhbiByZXN1bHRzLgorICAgIFxwYXJhbSBwRmlsdGVyIC0gSWYgcEZpbHRlciBpcyBOVUxMLCBhbGwgY2FjaGVkIHJlc3VsdHMgYXJlIHJldHVybmVkCisgICAgXHBhcmFtIHBoUmVzdWx0IC0gYW4gb2JqZWN0IGZvciB0aGUgcmVzdWx0LgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JTY2FuR2V0UmVzdWx0KHRwQW5pU2lyR2xvYmFsLCB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcEZpbHRlciwgdFNjYW5SZXN1bHRIYW5kbGUgKnBoUmVzdWx0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzclNjYW5GbHVzaFJlc3VsdAorICAgIFxicmllZiBDbGVhciBzY2FuIHJlc3VsdHMuCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclNjYW5GbHVzaFJlc3VsdCh0cEFuaVNpckdsb2JhbCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JTY2FuQkdTY2FuR2V0UGFyYW0KKyAgICBcYnJpZWYgUmV0dXJucyB0aGUgY3VycmVudCBiYWNrZ3JvdW5kIHNjYW4gc2V0dGluZ3MuCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclNjYW5CR1NjYW5HZXRQYXJhbSh0cEFuaVNpckdsb2JhbCwgdENzckJHU2NhblJlcXVlc3QgKik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JTY2FuUmVzdWx0R2V0Rmlyc3QKKyAgICBcYnJpZWYgUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBzY2FuIHJlc3VsdC4KKyAgICBccGFyYW0gaFNjYW5SZXN1bHQgLSByZXR1cm5lZCBmcm9tIGNzclNjYW5HZXRSZXN1bHQKKyAgICBccmV0dXJuIHRDc3JTY2FuUmVzdWx0SW5mbyAqIC0gTlVMTCBpZiBubyByZXN1bHQgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RDc3JTY2FuUmVzdWx0SW5mbyAqY3NyU2NhblJlc3VsdEdldEZpcnN0KHRwQW5pU2lyR2xvYmFsLCB0U2NhblJlc3VsdEhhbmRsZSBoU2NhblJlc3VsdCk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyU2NhblJlc3VsdEdldE5leHQKKyAgICBcYnJpZWYgUmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IG9mIHNjYW4gcmVzdWx0LiBJdCBjYW4gYmUgY2FsbGVkIHdpdGhvdXQgY2FsbGluZyBjc3JTY2FuUmVzdWx0R2V0Rmlyc3QgZmlyc3QKKyAgICBccGFyYW0gaFNjYW5SZXN1bHQgLSByZXR1cm5lZCBmcm9tIGNzclNjYW5HZXRSZXN1bHQKKyAgICBccmV0dXJuIE51bGwgaWYgbm8gcmVzdWx0IG9yIHJlYWNoIHRoZSBlbmQgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RDc3JTY2FuUmVzdWx0SW5mbyAqY3NyU2NhblJlc3VsdEdldE5leHQodHBBbmlTaXJHbG9iYWwsIHRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzckdldENvdW50cnlDb2RlCisgICAgXGJyaWVmIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSBjb3VudHJ5IGNvZGUgY3VycmVudCBiZWluZyB1c2VkCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IDMgYnl0ZXMsIHVwb24gc3VjY2VzcyByZXR1cm4sIHRoaXMgaGFzIHRoZSBjb3VudHJ5IGNvZGUKKyAgICBccGFyYW0gcGJMZW4gLSBDYWxsZXIgYWxsb2NhdGVkLCBhcyBpbnB1dCwgaXQgaW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgcEJ1Zi4gVXBvbiBzdWNjZXNzIHJldHVybiwKKyAgICB0aGlzIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gcEJ1ZgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JHZXRDb3VudHJ5Q29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4ICpwYkxlbik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JTZXRDb3VudHJ5Q29kZQorICAgIFxicmllZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHNldCB0aGUgY291bnRyeSBjb2RlIHNvIGNoYW5uZWwvcG93ZXIgc2V0dGluZyBtYXRjaGVzIHRoZSBjb3VudHJ5Y29kZSBhbmQKKyAgICB0aGUgZG9tYWluIGl0IGJlbG9uZ3MgdG8uCisgICAgXHBhcmFtIHBDb3VudHJ5IC0gQ2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgd2l0aCBhdCBsZWFzdCAzIGJ5dGVzIHNwZWNpZnlpbmcgdGhlIGNvdW50cnkgY29kZQorICAgIFxwYXJhbSBwZlJlc3RhcnROZWVkZWQgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBzcGFjZS4gVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgaXQgaW5kaWNhdGVzIHdoZXRoZXIgCisgICAgYSByZXN0YXJ0IGlzIG5lZWRlZCB0byBhcHBseSB0aGUgY2hhbmdlCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclNldENvdW50cnlDb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBDb3VudHJ5LCB0QU5JX0JPT0xFQU4gKnBmUmVzdGFydE5lZWRlZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSZXNldENvdW50cnlDb2RlSW5mb3JtYXRpb24KKyAgICBcYnJpZWYgdGhpcyBmdW5jdGlvbiBpcyB0byByZXNldCB0aGUgY291bnRyeSBjb2RlIGN1cnJlbnQgYmVpbmcgdXNlZCBiYWNrIHRvIEVFUFJPTSBkZWZhdWx0CisgICAgdGhpcyBpbmNsdWRlcyBjaGFubmVsIGxpc3QgYW5kIHBvd2VyIHNldHRpbmcuCisgICAgXHBhcmFtIHBmUmVzdGFydE5lZWRlZCAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHNwYWNlLiBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBpdCBpbmRpY2F0ZXMgd2hldGhlciAKKyAgICBhIHJlc3RhcnQgaXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBjaGFuZ2UKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyUmVzZXRDb3VudHJ5Q29kZUluZm9ybWF0aW9uKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfQk9PTEVBTiAqcGZSZXN0YXJ0TmVlZGVkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzckdldFN1cHBvcnRlZENvdW50cnlDb2RlCisgICAgXGJyaWVmIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgY291bnRyeSBjb2RlIGN1cnJlbnQgYmVpbmcgc3VwcG9ydGVkCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IDMgYnl0ZXMsIHVwb24gc3VjY2VzcyByZXR1cm4sIAorICAgIHRoaXMgaGFzIHRoZSBjb3VudHJ5IGNvZGUgbGlzdC4gMyBieXRlcyBmb3IgZWFjaCBjb3VudHJ5IGNvZGUuIFRoaXMgbWF5IGJlIE5VTEwgaWYKKyAgICBjYWxsZXIgd2FudHMgdG8ga25vdyB0aGUgbmVlZGVkIGJ5dGVzLgorICAgIFxwYXJhbSBwYkxlbiAtIENhbGxlciBhbGxvY2F0ZWQsIGFzIGlucHV0LCBpdCBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiBwQnVmLiBVcG9uIHN1Y2Nlc3MgcmV0dXJuLAorICAgIHRoaXMgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiBwQnVmCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzckdldFN1cHBvcnRlZENvdW50cnlDb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyICpwYkxlbik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JTZXRSZWd1bGF0b3J5RG9tYWluCisgICAgXGJyaWVmIHRoaXMgZnVuY3Rpb24gaXMgdG8gc2V0IHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQ0ZHIGlzIGRvd25sb2FkZWQgYW5kIGFsbCB0aGUgYmFuZC9tb2RlIHNldHRpbmcgYWxyZWFkeSBwYXNzZWQgaW50bworICAgIENTUi4KKyAgICBccGFyYW0gZG9tYWluSWQgLSBpbmRpY2F0ZSB0aGUgZG9tYWluIChkZWZpbmVkIGluIHRoZSBkcml2ZXIpIG5lZWRzIHRvIHNldCB0by4gIAorICAgIFNlZSBlUmVnRG9tYWluSWQgZm9yIGRlZmluaXRpb24KKyAgICBccGFyYW0gcGZSZXN0YXJ0TmVlZGVkIC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgc3BhY2UuIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIGl0IGluZGljYXRlcyB3aGV0aGVyIAorICAgIGEgcmVzdGFydCBpcyBuZWVkZWQgdG8gYXBwbHkgdGhlIGNoYW5nZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JTZXRSZWd1bGF0b3J5RG9tYWluKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZfUkVHRE9NQUlOX3QgZG9tYWluSWQsIHRBTklfQk9PTEVBTiAqcGZSZXN0YXJ0TmVlZGVkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzckdldEN1cnJlbnRSZWd1bGF0b3J5RG9tYWluCisgICAgXGJyaWVmIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQ0ZHIGlzIGRvd25sb2FkZWQgYW5kIGFsbCB0aGUgYmFuZC9tb2RlIHNldHRpbmcgYWxyZWFkeSBwYXNzZWQgaW50bworICAgIENTUi4KKyAgICBccmV0dXJuIGVSZWdEb21haW5JZCAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9SRUdET01BSU5fdCBjc3JHZXRDdXJyZW50UmVndWxhdG9yeURvbWFpbih0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzckdldFJlZ3VsYXRvcnlEb21haW5Gb3JDb3VudHJ5CisgICAgXGJyaWVmIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSByZWd1bGF0b3J5IGRvbWFpbiBmb3IgYSBjb3VudHJ5LgorICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQ0ZHIGlzIGRvd25sb2FkZWQgYW5kIGFsbCB0aGUgYmFuZC9tb2RlIHNldHRpbmcgYWxyZWFkeSBwYXNzZWQgaW50bworICAgIENTUi4KKyAgICBccGFyYW0gcENvdW50cnkgLSBDYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IDMgYnl0ZXMgc3BlY2lmeWluZyB0aGUgY291bnRyeSBjb2RlCisgICAgXHBhcmFtIHBEb21haW5JZCAtIENhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHRvIGdldCB0aGUgcmV0dXJuIGRvbWFpbiBJRCB1cG9uIHN1Y2Nlc3MgcmV0dXJuLiBDYW4gYmUgTlVMTC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyR2V0UmVndWxhdG9yeURvbWFpbkZvckNvdW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcENvdW50cnksIHZfUkVHRE9NQUlOX3QgKnBEb21haW5JZCk7CisKKwordEFOSV9CT09MRUFOIGNzclNhdmUxMWRDb3VudHJ5U3RyaW5nKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQ291bnRyeUNvZGUsIHRBTklfQk9PTEVBTiBmRm9yY2UgKTsKKworLy9zb21lIHN1cHBvcnQgZnVuY3Rpb25zCit0QU5JX0JPT0xFQU4gY3NySXMxMWRTdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit0QU5JX0JPT0xFQU4gY3NySXMxMWhTdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit0QU5JX0JPT0xFQU4gY3NySXMxMWVTdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit0QU5JX0JPT0xFQU4gY3NySXNXbW1TdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit0QU5JX0JPT0xFQU4gY3NySXNNQ0NTdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8vVXBwZXIgbGF5ZXIgdG8gZ2V0IHRoZSBsaXN0IG9mIHRoZSBiYXNlIGNoYW5uZWxzIHRvIHNjYW4gZm9yIHBhc3NpdmVseSAxMWQgaW5mbyBmcm9tIGNzcgorZUhhbFN0YXR1cyBjc3JTY2FuR2V0QmFzZUNoYW5uZWxzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQ2hhbm5lbEluZm8gKiBwQ2hhbm5lbEluZm8gKTsKKy8vUmV0dXJuIFNVQ0NFU1MgaXMgdGhlIGNvbW1hbmQgaXMgcXVldWVkLCBmYWlsZWQKK2VIYWxTdGF0dXMgY3NyUXVldWVTbWVDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwgdEFOSV9CT09MRUFOIGZIaWdoUHJpb3JpdHkgKTsKK3RTbWVDbWQgKmNzckdldENvbW1hbmRCdWZmZXIoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKTsKK3ZvaWQgY3NyUmVsZWFzZUNvbW1hbmQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCit0QU5JX0JPT0xFQU4gY3NySXNQcm9maWxlV2FwaSggdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUX0NTUgorCisvL1NlY3VyaXR5CisjZGVmaW5lIFdMQU5fU0VDVVJJVFlfRVZFTlRfU0VUX1BUS19SRVEgICAgIDEKKyNkZWZpbmUgV0xBTl9TRUNVUklUWV9FVkVOVF9TRVRfUFRLX1JTUCAgICAgMgorI2RlZmluZSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1NFVF9HVEtfUkVRICAgICAzCisjZGVmaW5lIFdMQU5fU0VDVVJJVFlfRVZFTlRfU0VUX0dUS19SU1AgICAgIDQKKyNkZWZpbmUgV0xBTl9TRUNVUklUWV9FVkVOVF9SRU1PVkVfS0VZX1JFUSAgNQorI2RlZmluZSBXTEFOX1NFQ1VSSVRZX0VWRU5UX1JFTU9WRV9LRVlfUlNQICA2CisjZGVmaW5lIFdMQU5fU0VDVVJJVFlfRVZFTlRfUE1LSURfQ0FORElEQVRFX0ZPVU5EICA3CisjZGVmaW5lIFdMQU5fU0VDVVJJVFlfRVZFTlRfUE1LSURfVVBEQVRFICAgIDgKKyNkZWZpbmUgV0xBTl9TRUNVUklUWV9FVkVOVF9NSUNfRVJST1IgICAgICAgOSAgIAorCisjZGVmaW5lIEFVVEhfT1BFTiAgICAgICAwCisjZGVmaW5lIEFVVEhfU0hBUkVEICAgICAxCisjZGVmaW5lIEFVVEhfV1BBX0VBUCAgICAyCisjZGVmaW5lIEFVVEhfV1BBX1BTSyAgICAzCisjZGVmaW5lIEFVVEhfV1BBMl9FQVAgICA0CisjZGVmaW5lIEFVVEhfV1BBMl9QU0sgICA1CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyNkZWZpbmUgQVVUSF9XQVBJX0NFUlQgIDYKKyNkZWZpbmUgQVVUSF9XQVBJX1BTSyAgIDcKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisjZGVmaW5lIEVOQ19NT0RFX09QRU4gICAwCisjZGVmaW5lIEVOQ19NT0RFX1dFUDQwICAxCisjZGVmaW5lIEVOQ19NT0RFX1dFUDEwNCAyCisjZGVmaW5lIEVOQ19NT0RFX1RLSVAgICAzCisjZGVmaW5lIEVOQ19NT0RFX0FFUyAgICA0CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyNkZWZpbmUgRU5DX01PREVfU01TNCAgIDUgLy9XQVBJCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKworI2RlZmluZSBOT19NQVRDSCAgICAwCisjZGVmaW5lIE1BVENIICAgICAgIDEKKworI2RlZmluZSBXTEFOX1NFQ1VSSVRZX1NUQVRVU19TVUNDRVNTICAgICAgICAwCisjZGVmaW5lIFdMQU5fU0VDVVJJVFlfU1RBVFVTX0ZBSUxVUkUgICAgICAgIDEKKworLy9TY2FuCisjZGVmaW5lIFdMQU5fU0NBTl9FVkVOVF9BQ1RJVkVfU0NBTl9SRVEgICAgIDEKKyNkZWZpbmUgV0xBTl9TQ0FOX0VWRU5UX0FDVElWRV9TQ0FOX1JTUCAgICAgMgorI2RlZmluZSBXTEFOX1NDQU5fRVZFTlRfUEFTU0lWRV9TQ0FOX1JFUSAgICAzCisjZGVmaW5lIFdMQU5fU0NBTl9FVkVOVF9QQVNTSVZFX1NDQU5fUlNQICAgIDQKKyNkZWZpbmUgV0xBTl9TQ0FOX0VWRU5UX0hPX1NDQU5fUkVRICAgICAgICAgNQorI2RlZmluZSBXTEFOX1NDQU5fRVZFTlRfSE9fU0NBTl9SU1AgICAgICAgICA2CisKKyNkZWZpbmUgV0xBTl9TQ0FOX1NUQVRVU19TVUNDRVNTICAgICAgICAwCisjZGVmaW5lIFdMQU5fU0NBTl9TVEFUVVNfRkFJTFVSRSAgICAgICAgMQorI2RlZmluZSBXTEFOX1NDQU5fU1RBVFVTX0FCT1JUICAgICAgICAgIDIKKworLy9JYnNzCisjZGVmaW5lIFdMQU5fSUJTU19FVkVOVF9TVEFSVF9JQlNTX1JFUSAgICAgIDAKKyNkZWZpbmUgV0xBTl9JQlNTX0VWRU5UX1NUQVJUX0lCU1NfUlNQICAgICAgMQorI2RlZmluZSBXTEFOX0lCU1NfRVZFTlRfSk9JTl9JQlNTX1JFUSAgICAgICAyCisjZGVmaW5lIFdMQU5fSUJTU19FVkVOVF9KT0lOX0lCU1NfUlNQICAgICAgIDMKKyNkZWZpbmUgV0xBTl9JQlNTX0VWRU5UX0NPQUxFU0NJTkcgICAgICAgICAgNAorI2RlZmluZSBXTEFOX0lCU1NfRVZFTlRfUEVFUl9KT0lOICAgICAgICAgICA1CisjZGVmaW5lIFdMQU5fSUJTU19FVkVOVF9QRUVSX0xFQVZFICAgICAgICAgIDYKKyNkZWZpbmUgV0xBTl9JQlNTX0VWRU5UX1NUT1BfUkVRICAgICAgICAgICAgNworI2RlZmluZSBXTEFOX0lCU1NfRVZFTlRfU1RPUF9SU1AgICAgICAgICAgICA4CisKKyNkZWZpbmUgQVVUT19QSUNLICAgICAgIDAKKyNkZWZpbmUgU1BFQ0lGSUVEICAgICAgIDEKKworI2RlZmluZSBXTEFOX0lCU1NfU1RBVFVTX1NVQ0NFU1MgICAgICAgIDAKKyNkZWZpbmUgV0xBTl9JQlNTX1NUQVRVU19GQUlMVVJFICAgICAgICAxCisKKy8vMTFkCisjZGVmaW5lIFdMQU5fODAyMTFEX0VWRU5UX0NPVU5UUllfU0VUICAgMAorI2RlZmluZSBXTEFOXzgwMjExRF9FVkVOVF9SRVNFVCAgICAgICAgIDEKKworI2RlZmluZSBXTEFOXzgwMjExRF9ESVNBQkxFRCAgICAgICAgIDAKKyNkZWZpbmUgV0xBTl84MDIxMURfU1VQUE9SVF9NVUxUSV9ET01BSU4gICAgIDEKKyNkZWZpbmUgV0xBTl84MDIxMURfTk9UX1NVUFBPUlRfTVVMVElfRE9NQUlOICAgICAyCisKK2ludCBkaWFnQXV0aFR5cGVGcm9tQ1NSVHlwZShlQ3NyQXV0aFR5cGUgYXV0aFR5cGUpOworaW50IGRpYWdFbmNUeXBlRnJvbUNTUlR5cGUoZUNzckVuY3J5cHRpb25UeXBlIGVuY1R5cGUpOworI2VuZGlmIC8vI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlRfQ1NSCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyU2NhblJlc3VsdFB1cmdlCisgICAgXGJyaWVmIHJlbW92ZSBhbGwgaXRlbXModENzclNjYW5SZXN1bHQpIGluIHRoZSBsaXN0IGFuZCBmcmVlIG1lbW9yeSBmb3IgZWFjaCBpdGVtCisgICAgXHBhcmFtIGhTY2FuUmVzdWx0IC0gcmV0dXJuZWQgZnJvbSBjc3JTY2FuR2V0UmVzdWx0LiBoU2NhblJlc3VsdCBpcyBjb25zaWRlcmVkIGdvbmUgYnkgCisgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFuZCBldmVuIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldXRybnMuCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclNjYW5SZXN1bHRQdXJnZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2NhblJlc3VsdEhhbmRsZSBoU2NhblJlc3VsdCk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL0NvbW1vbiBTY2FuIGVuZHMKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzclJvYW1Db25uZWN0CisgICAgXGJyaWVmIFRvIGluaXRpdGlhdGUgYW4gYXNzb2NpYXRpb24KKyAgICBccGFyYW0gcFByb2ZpbGUgLSBjYW4gYmUgTlVMTCB0byBqb2luIHRvIGFueSBvcGVuIG9uZXMKKyAgICBccGFyYW0gaEJzc0xpc3RJbiAtIGEgbGlzdCBvZiBCU1MgZGVzY3JpcHRvciB0byByb2FtIHRvLiBJdCBpcyByZXR1cm5lZCBmcm9tIGNzclNjYW5HZXRSZXN1bHQKKyAgICBccGFyYW0gcFJvYW1JZCAtIHRvIGdldCBiYWNrIHRoZSByZXF1ZXN0IElECisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclJvYW1Db25uZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhCc3NMaXN0SW4sIHRBTklfVTMyICpwUm9hbUlkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzclJvYW1SZWFzc29jCisgICAgXGJyaWVmIFRvIGluaXRpdGlhdGUgYSByZS1hc3NvY2lhdGlvbgorICAgIFxwYXJhbSBwUHJvZmlsZSAtIGNhbiBiZSBOVUxMIHRvIGpvaW4gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgQVAuIEluIHRoYXQgCisgICAgY2FzZSBtb2RQcm9maWxlRmllbGRzIHNob3VsZCBjYXJyeSB0aGUgbW9kaWZpZWQgZmllbGQocykgd2hpY2ggY291bGQgdHJpZ2dlcgorICAgIHJlYXNzb2MgIAorICAgIFxwYXJhbSBtb2RQcm9maWxlRmllbGRzIC0gZmllbGRzIHdoaWNoIGFyZSBwYXJ0IG9mIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAKKyAgICB0aGF0IG1pZ2h0IG5lZWQgbW9kaWZpY2F0aW9uIGR5bmFtaWNhbGx5IG9uY2UgU1RBIGlzIHVwICYgcnVubmluZyBhbmQgdGhpcyAKKyAgICBjb3VsZCB0cmlnZ2VyIGEgcmVhc3NvYworICAgIFxwYXJhbSBwUm9hbUlkIC0gdG8gZ2V0IGJhY2sgdGhlIHJlcXVlc3QgSUQKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyUm9hbVJlYXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgbW9kUHJvZmlsZUZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBSb2FtSWQpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtUmVjb25uZWN0CisgICAgXGJyaWVmIFRvIGRpc2Nvbm5lY3QgYW5kIHJlY29ubmVjdCB3aXRoIHRoZSBzYW1lIHByb2ZpbGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMuIEl0IHJldHVybnMgZmFpbCBpZiBjdXJyZW50bHkgbm90IGNvbm5lY3RlZCAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JSb2FtUmVjb25uZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtU2V0UE1LSURDYWNoZQorICAgIFxicmllZiByZXR1cm4gdGhlIFBNS0lEIGNhbmRpZGF0ZSBsaXN0CisgICAgXHBhcmFtIHBQTUtJRENhY2hlIC0gY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgcG9pbnQgdG8gYW4gYXJyYXkgb2YgdFBta2lkQ2FjaGVJbmZvCisgICAgXHBhcmFtIG51bUl0ZW1zIC0gYSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgbnVtYmVyIG9mIHRQbWtpZENhY2hlSW5mbyBhbGxvY2F0ZWQKKyAgICB3aGVuIHJldHJ1bmluZywgdGhpcyBpcyBlaXRoZXIgdGhlIG51bWJlciBuZWVkZWQgb3IgbnVtYmVyIG9mIGl0ZW1zIHB1dCBpbnRvIHBQTUtJRENhY2hlCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdCBiaWcgZW5vdWdoIGFuZCBwTnVtSXRlbXMKKyAgICBoYXMgdGhlIG51bWJlciBvZiB0UG1raWRDYWNoZUluZm8uCisgICAgXE5vdGU6IHBOdW1JdGVtcyBpcyBhIG51bWJlciBvZiB0UG1raWRDYWNoZUluZm8sIG5vdCBzaXplb2YodFBta2lkQ2FjaGVJbmZvKSAqIHNvbWV0aGluZworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyUm9hbVNldFBNS0lEQ2FjaGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdFBta2lkQ2FjaGVJbmZvICpwUE1LSURDYWNoZSwgdEFOSV9VMzIgbnVtSXRlbXMgKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzclJvYW1HZXRXcGFSc25SZXFJRQorICAgIFxicmllZiByZXR1cm4gdGhlIFdQQSBvciBSU04gSUUgQ1NSIHBhc3NlcyB0byBQRSB0byBKT0lOIHJlcXVlc3Qgb3IgU1RBUlRfQlNTIHJlcXVlc3QKKyAgICBccGFyYW0gcExlbiAtIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaGFzIHRoZSBsZW5ndGggb2YgcEJ1ZiBhcyBpbnB1dC4gVXBvbiByZXR1cm5lZCwgKnBMZW4gaGFzIHRoZSAKKyAgICBuZWVkZWQgb3IgSUUgbGVuZ3RoIGluIHBCdWYuCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGNvbnRhaW4gdGhlIElFIGZpZWxkLCBpZiBhbnksIHVwb24gcmV0dXJuCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdCBiaWcgZW5vdWdoCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JSb2FtR2V0V3BhUnNuUmVxSUUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0QU5JX1UzMiAqcExlbiwgdEFOSV9VOCAqcEJ1Zik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtR2V0V3BhUnNuUnNwSUUKKyAgICBcYnJpZWYgcmV0dXJuIHRoZSBXUEEgb3IgUlNOIElFIGZyb20gdGhlIGJlYWNvbiBvciBwcm9iZSByc3AgaWYgY29ubmVjdGVkCisgICAgXHBhcmFtIHBMZW4gLSBjYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGhhcyB0aGUgbGVuZ3RoIG9mIHBCdWYgYXMgaW5wdXQuIFVwb24gcmV0dXJuZWQsICpwTGVuIGhhcyB0aGUgCisgICAgbmVlZGVkIG9yIElFIGxlbmd0aCBpbiBwQnVmLgorICAgIFxwYXJhbSBwQnVmIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBjb250YWluIHRoZSBJRSBmaWVsZCwgaWYgYW55LCB1cG9uIHJldHVybgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QgYmlnIGVub3VnaAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyUm9hbUdldFdwYVJzblJzcElFKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9VMzIgKnBMZW4sIHRBTklfVTggKnBCdWYpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtR2V0TnVtUE1LSURDYWNoZQorICAgIFxicmllZiByZXR1cm4gbnVtYmVyIG9mIFBNS0lEIGNhY2hlIGVudHJpZXMKKyAgICBccmV0dXJuIHRBTklfVTMyIC0gdGhlIG51bWJlciBvZiBQTUtJRCBjYWNoZSBlbnRyaWVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9VMzIgY3NyUm9hbUdldE51bVBNS0lEQ2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzclJvYW1HZXRQTUtJRENhY2hlCisgICAgXGJyaWVmIHJldHVybiBQTUtJRCBjYWNoZSBmcm9tIENTUgorICAgIFxwYXJhbSBwTnVtIC0gY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBoYXMgdGhlIHNwYWNlIG9mIHRoZSBudW1iZXIgb2YgcEJ1ZiB0UG1raWRDYWNoZUluZm8gYXMgaW5wdXQuIFVwb24gcmV0dXJuZWQsICpwTnVtIGhhcyB0aGUgCisgICAgbmVlZGVkIG9yIGFjdHVhbGx5IG51bWJlciBpbiB0UG1raWRDYWNoZUluZm8uCisgICAgXHBhcmFtIHBQbWtpZENhY2hlIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBjb250YWlucyBQTUtJRCBjYWNoZSwgaWYgYW55LCB1cG9uIHJldHVybgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QgYmlnIGVub3VnaAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyUm9hbUdldFBNS0lEQ2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBOdW0sIHRQbWtpZENhY2hlSW5mbyAqcFBta2lkQ2FjaGUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyUm9hbUdldENvbm5lY3RQcm9maWxlCisgICAgXGJyaWVmIFRvIHJldHVybiB0aGUgY3VycmVudCBjb25uZWN0IHByb2ZpbGUuIENhbGxlciBtdXN0IGNhbGwgY3NyUm9hbUZyZWVDb25uZWN0UHJvZmlsZQorICAgICAgICAgICBhZnRlciBpdCBpcyBkb25lIGFuZCBiZWZvcmUgcmV1c2UgZm9yIGFub3RoZXIgY3NyUm9hbUdldENvbm5lY3RQcm9maWxlIGNhbGwuCisgICAgXHBhcmFtIHBQcm9maWxlIC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgc3RydWN0dXJlIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cy4gRmFpbHVyZSBpZiBub3QgY29ubmVjdGVkICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclJvYW1HZXRDb25uZWN0UHJvZmlsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtR2V0Q29ubmVjdFN0YXRlCisgICAgXGJyaWVmIFRvIHJldHVybiB0aGUgY3VycmVudCBjb25uZWN0IHN0YXRlIG9mIFJvYW1pbmcKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyUm9hbUdldENvbm5lY3RTdGF0ZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIGVDc3JDb25uZWN0U3RhdGUgKnBTdGF0ZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtRnJlZUNvbm5lY3RQcm9maWxlCisgICAgXGJyaWVmIFRvIGZyZWUgYW5kIHJlaW5pdGlhbGl6ZSB0aGUgcHJvZmlsZSByZXR1cm4gcHJldmlvdXMgYnkgY3NyUm9hbUdldENvbm5lY3RQcm9maWxlLgorICAgIFxwYXJhbSBwUHJvZmlsZSAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHN0cnVjdHVyZSB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMuICAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JSb2FtRnJlZUNvbm5lY3RQcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcFByb2ZpbGUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NySW5pdENoYW5uZWxMaXN0CisgICAgXGJyaWVmIEhERCBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgV05JX0NGR19WQUxJRF9DSEFOTkVMX0xJU1QgYmFzZSBvbiB0aGUgYmFuZC9tb2RlIHNldHRpbmdzLgorICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQ0ZHIGlzIGRvd25sb2FkZWQgYW5kIGFsbCB0aGUgYmFuZC9tb2RlIHNldHRpbmcgYWxyZWFkeSBwYXNzZWQgaW50bworICAgIENTUi4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NySW5pdENoYW5uZWxMaXN0KCB0SGFsSGFuZGxlIGhIYWwgKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzckNoYW5nZUNvbmZpZ1BhcmFtcworICAgIFxicmllZiBUaGUgQ1NSIEFQSSBleHBvc2VkIGZvciBIREQgdG8gcHJvdmlkZSBjb25maWcgcGFyYW1zIHRvIENTUiBkdXJpbmcgCisgICAgU01FcyBzdG9wIC0+IHN0YXJ0IHNlcXVlbmNlLgorICAgIElmIEhERCBjaGFuZ2VkIHRoZSBkb21haW4gdGhhdCB3aWxsIGNhdXNlIGEgcmVzZXQuIFRoaXMgZnVuY3Rpb24gd2lsbCAKKyAgICBwcm92aWRlIHRoZSBuZXcgc2V0IG9mIDExZCBpbmZvcm1hdGlvbiBmb3IgdGhlIG5ldyBkb21haW4uIEN1cnJyZW50bHkgdGhpcworICAgIEFQSSBwcm92aWRlcyBpbmZvIHJlZ2FyZGluZyAxMWQgb25seSBhdCByZXNldCBidXQgd2UgY2FuIGV4dGVuZCB0aGlzIGZvcgorICAgIG90aGVyIHBhcmFtcyAoUE1DLCBRb1MpIHdoaWNoIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGFnYWluIGF0IHJlc2V0LgorICAgIFxwYXJhbSAKKyAgICBoSGFsIC0gSGFuZGxlIHRvIHRoZSBIQUwuIFRoZSBIQUwgaGFuZGxlIGlzIHJldHVybmVkIGJ5IHRoZSBIQUwgYWZ0ZXIgaXQgaXMgCisgICAgICAgICAgIG9wZW5lZCAoYnkgY2FsbGluZyBoYWxPcGVuKS4KKyAgICBwVXBkYXRlQ29uZmlnUGFyYW0gLSBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgKHRDc3JVcGRhdGVDb25maWdQYXJhbSkgdGhhdCAKKyAgICAgICAgICAgICAgICBjdXJyZW50bHkgcHJvdmlkZXMgMTFkIHJlbGF0ZWQgaW5mb3JtYXRpb24gbGlrZSBDb3VudHJ5IGNvZGUsIAorICAgICAgICAgICAgICAgIFJlZ3VsYXRvcnkgZG9tYWluLCB2YWxpZCBjaGFubmVsIGxpc3QsIFR4IHBvd2VyIHBlciBjaGFubmVsLCBhIAorICAgICAgICAgICAgICAgIGxpc3Qgd2l0aCBhY3RpdmUvcGFzc2l2ZSBzY2FuIGFsbG93ZWQgcGVyIHZhbGlkIGNoYW5uZWwuIAorCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyQ2hhbmdlQ29uZmlnUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclVwZGF0ZUNvbmZpZ1BhcmFtICpwVXBkYXRlQ29uZmlnUGFyYW0pOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyUm9hbUNvbm5lY3RUb0xhc3RQcm9maWxlCisgICAgXGJyaWVmIFRvIGRpc2Nvbm5lY3QgYW5kIHJlY29ubmVjdCB3aXRoIHRoZSBzYW1lIHByb2ZpbGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMuIEl0IHJldHVybnMgZmFpbCBpZiBjdXJyZW50bHkgY29ubmVjdGVkICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclJvYW1Db25uZWN0VG9MYXN0UHJvZmlsZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyUm9hbURpc2Nvbm5lY3QKKyAgICBcYnJpZWYgVG8gZGlzY29ubmVjdCBmcm9tIGEgbmV0d29yaworICAgIFxwYXJhbSByZWFzb24gLS0gVG8gaW5kaWNhdGUgdGhlIHJlYXNvbiBmb3IgZGlzY29ubmVjdGluZy4gQ3VycmVudGx5LCBvbmx5IGVDU1JfRElTQ09OTkVDVF9SRUFTT05fTUlDX0VSUk9SIGlzIG1lYW5mdWwuCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzclJvYW1EaXNjb25uZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgZUNzclJvYW1EaXNjb25uZWN0UmVhc29uIHJlYXNvbik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JTY2FuR2V0UE1LSURDYW5kaWRhdGVMaXN0CisgICAgXGJyaWVmIHJldHVybiB0aGUgUE1LSUQgY2FuZGlkYXRlIGxpc3QKKyAgICBccGFyYW0gcFBta2lkTGlzdCAtIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHBvaW50IHRvIGFuIGFycmF5IG9mIHRQbWtpZENhbmRpZGF0ZUluZm8KKyAgICBccGFyYW0gcE51bUl0ZW1zIC0gcG9pbnRlciB0byBhIHZhcmlhYmxlIHRoYXQgaGFzIHRoZSBudW1iZXIgb2YgdFBta2lkQ2FuZGlkYXRlSW5mbyBhbGxvY2F0ZWQKKyAgICB3aGVuIHJldHJ1bmluZywgdGhpcyBpcyBlaXRoZXIgdGhlIG51bWJlciBuZWVkZWQgb3IgbnVtYmVyIG9mIGl0ZW1zIHB1dCBpbnRvIHBQbWtpZExpc3QKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90IGJpZyBlbm91Z2ggYW5kIHBOdW1JdGVtcworICAgIGhhcyB0aGUgbnVtYmVyIG9mIHRQbWtpZENhbmRpZGF0ZUluZm8uCisgICAgXE5vdGU6IHBOdW1JdGVtcyBpcyBhIG51bWJlciBvZiB0UG1raWRDYW5kaWRhdGVJbmZvLCBub3Qgc2l6ZW9mKHRQbWtpZENhbmRpZGF0ZUluZm8pICogc29tZXRoaW5nCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JTY2FuR2V0UE1LSURDYW5kaWRhdGVMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UG1raWRDYW5kaWRhdGVJbmZvICpwUG1raWRMaXN0LCB0QU5JX1UzMiAqcE51bUl0ZW1zICk7CisKKy8vVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0b3AgYSBCU1MuIEl0IGlzIHNpbWlsYXIgb2YgY3NyUm9hbUlzc3VlRGlzY29ubmVjdCBidXQgdGhpcyBmdW5jdGlvbgorLy9kb2Vzbid0IGhhdmUgYW55IGxvZ2ljIG90aGVyIHRoYW4gYmxpbmRseSB0cnlpbmcgdG8gc3RvcCBCU1MKK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlU3RvcEJzc0NtZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0QU5JX0JPT0xFQU4gZkhpZ2hQcmlvcml0eSApOworCit2b2lkIGNzckNhbGxSb2FtaW5nQ29tcGxldGlvbkNhbGxiYWNrKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbUluZm8gKnBSb2FtSW5mbywgdEFOSV9VMzIgcm9hbUlkLCBlQ3NyUm9hbVJlc3VsdCByb2FtUmVzdWx0KTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtSXNzdWVEaXNhc3NvY2lhdGVTdGFDbWQKKyAgICBcYnJpZWYgY3NyIGZ1bmN0aW9uIHRoYXQgSEREIGNhbGxzIHRvIGRpc2Fzc29jaWF0ZSBhIGFzc29jaWF0ZWQgc3RhdGlvbgorICAgIFxwYXJhbSBzZXNzaW9uSWQgICAgLSBzZXNzaW9uIElkIGZvciBTb2Z0IEFQCisgICAgXHBhcmFtIHBQZWVyTWFjQWRkciAtIE1BQyBvZiBhc3NvY2lhdGVkIHN0YXRpb24gdG8gZGVsZXRlCisgICAgXHBhcmFtIHJlYXNvbiAtIHJlYXNvbiBjb2RlLCBiZSBvbmUgb2YgdGhlIHRTaXJNYWNSZWFzb25Db2RlcworICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVEaXNhc3NvY2lhdGVTdGFDbWQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHJlYXNvbik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtSXNzdWVEZWF1dGhTdGEKKyAgICBcYnJpZWYgY3NyIGZ1bmN0aW9uIHRoYXQgSEREIGNhbGxzIHRvIGRlbGV0ZSBhIGFzc29jaWF0ZWQgc3RhdGlvbgorICAgIFxwYXJhbSBzZXNzaW9uSWQgICAgLSBzZXNzaW9uIElkIGZvciBTb2Z0IEFQCisgICAgXHBhcmFtIHBQZWVyTWFjQWRkciAtIE1BQyBvZiBhc3NvY2lhdGVkIHN0YXRpb24gdG8gZGVsZXRlCisgICAgXHBhcmFtIHJlYXNvbiAtIHJlYXNvbiBjb2RlLCBiZSBvbmUgb2YgdGhlIHRTaXJNYWNSZWFzb25Db2RlcworICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JSb2FtSXNzdWVEZWF1dGhTdGFDbWQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHJlYXNvbik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtSXNzdWVUa2lwQ291bnRlck1lYXN1cmVzCisgICAgXGJyaWVmIGNzciBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBzdGFydCBhbmQgc3RvcCB0a2lwIGNvdW50ZXJtZWFzdXJlcworICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uIElkIGZvciBTb2Z0IEFQCisgICAgXHBhcmFtIGJFbmFibGUgICAtIEZsYWcgdG8gc3RhcnQvc3RvcCBjb3VudGVybWVhc3VyZXMKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyUm9hbUlzc3VlVGtpcENvdW50ZXJNZWFzdXJlcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0QU5JX0JPT0xFQU4gYkVuYWJsZSk7CisKK2VIYWxTdGF0dXMgY3NyU2VuZE1CVGtpcENvdW50ZXJNZWFzdXJlc1JlcU1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2luSWQsIHRBTklfQk9PTEVBTiBiRW5hYmxlLCB0U2lyTWFjQWRkciBic3NJZCApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyUm9hbUdldEFzc29jaWF0ZWRTdGFzCisgICAgXGJyaWVmIGNzciBmdW5jdGlvbiB0aGF0IEhERCBjYWxscyB0byBnZXQgbGlzdCBvZiBhc3NvY2lhdGVkIHN0YXRpb25zIGJhc2VkIG9uIG1vZHVsZSBJRAorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uIElkIGZvciBTb2Z0IEFQCisgICAgXHBhcmFtIG1vZElkIC0gbW9kdWxlIElEIC0gUEUvSEFML1RMCisgICAgXHBhcmFtIHBVc3JDb250ZXh0IC0gT3BhcXVlIEhERCBjb250ZXh0CisgICAgXHBhcmFtIHBmblNhcEV2ZW50Q2FsbGJhY2sgLSBTYXAgZXZlbnQgY2FsbGJhY2sgaW4gSERECisgICAgXHBhcmFtIHBBc3NvY1N0YXNCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0byBiZSBmaWxsZWQgd2l0aCBhc3NvY2lhdGQgc3RhdGlvbnMgaW5mbworICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JSb2FtR2V0QXNzb2NpYXRlZFN0YXMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgVk9TX01PRFVMRV9JRCBtb2RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwVXNyQ29udGV4dCwgdm9pZCAqcGZuU2FwRXZlbnRDYWxsYmFjaywgdEFOSV9VOCAqcEFzc29jU3Rhc0J1ZiApOworCitlSGFsU3RhdHVzIGNzclNlbmRNQkdldEFzc29jaWF0ZWRTdGFzUmVxTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIFZPU19NT0RVTEVfSUQgbW9kSWQsICB0U2lyTWFjQWRkciBic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBVc3JDb250ZXh0LCB2b2lkICpwZm5TYXBFdmVudENhbGxiYWNrLCB0QU5JX1U4ICpwQXNzb2NTdGFzQnVmICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtR2V0V3BzU2Vzc2lvbk92ZXJsYXAKKyAgICBcYnJpZWYgY3NyIGZ1bmN0aW9uIHRoYXQgSEREIGNhbGxzIHRvIGdldCBXUFMgUEJDIHNlc3Npb24gb3ZlcmxhcCBpbmZvcm1hdGlvbgorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uIElkIGZvciBTb2Z0IEFQCisgICAgXHBhcmFtIHBVc3JDb250ZXh0IC0gT3BhcXVlIEhERCBjb250ZXh0CisgICAgXHBhcmFtIHBmblNhcEV2ZW50Q2FsbGJhY2sgLSBTYXAgZXZlbnQgY2FsbGJhY2sgaW4gSERECisgICAgXHBhcmFtIHBSZW1vdmVNYWMgLSBwb2ludGVyIHRvIE1BQyBhZGRyZXNzIG9mIHNlc3Npb24gdG8gYmUgcmVtb3ZlZAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JSb2FtR2V0V3BzU2Vzc2lvbk92ZXJsYXAoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFVzckNvbnRleHQsIHZvaWQgKnBmblNhcEV2ZW50Q2FsbGJhY2ssdl9NQUNBRERSX3QgcFJlbW92ZU1hYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorZUhhbFN0YXR1cyBjc3JTZW5kTUJHZXRXUFNQQkNTZXNzaW9ucyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyIGJzc0lkLCB2b2lkICpwVXNyQ29udGV4dCwgdm9pZCAqcGZuU2FwRXZlbnRDYWxsYmFjayx2X01BQ0FERFJfdCBwUmVtb3ZlTWFjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9CVEFNUF9VVF9SRgorZUhhbFN0YXR1cyBjc3JSb2FtU3RhcnRKb2luUmV0cnlUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRBTklfVTMyIGludGVydmFsKTsKK2VIYWxTdGF0dXMgY3NyUm9hbVN0b3BKb2luUmV0cnlUaW1lcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpOworI2VuZGlmCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JSb2FtRlRQcmVBdXRoUnNwUHJvY2Vzc29yCisgICAgXGJyaWVmIGNzciBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgcHJlIGF1dGggcmVzcG9uc2UgZnJvbSBMSU0gCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNzclJvYW1GVFByZUF1dGhSc3BQcm9jZXNzb3IoIHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJGVFByZUF1dGhSc3AgcEZUUHJlQXV0aFJzcCApOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCit2b2lkIGNzckNjeFNlbmRBZGphY2VudEFwUmVwTXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24pOworI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvc3JjL2Nzci9jc3JMaW5rTGlzdC5jIGIvQ09SRS9TTUUvc3JjL2Nzci9jc3JMaW5rTGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjA4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9zcmMvY3NyL2NzckxpbmtMaXN0LmMKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAgCisgICAgXGZpbGUgY3NyTGlua0xpc3QuYworICAKKyAgICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIENvbW1vbiBsaW5rIGxpc3QgaW50ZXJmYWNlcy4KKyAgCisgIAorICAgIENvcHlyaWdodCAoQykgMjAwNiBBaXJnbyBOZXR3b3JrcywgSW5jb3Jwb3JhdGVkIAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2luY2x1ZGUgInBhbEFwaS5oIgorI2luY2x1ZGUgImNzckxpbmtMaXN0LmgiCisjaW5jbHVkZSAidm9zX2xvY2suaCIKKyNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisKK0FOSV9JTkxJTkVfRlVOQ1RJT04gdm9pZCBjc3JMaXN0SW5pdCh0TGlzdEVsZW0gKnBMaXN0KQoreworICAgIHBMaXN0LT5sYXN0ID0gcExpc3QtPm5leHQgPSBwTGlzdDsKK30KKworCitBTklfSU5MSU5FX0ZVTkNUSU9OIHZvaWQgY3NyTGlzdFJlbW92ZUVudHJ5KHRMaXN0RWxlbSAqcEVudHJ5KQoreworICAgIHRMaXN0RWxlbSAqcExhc3Q7CisgICAgdExpc3RFbGVtICpwTmV4dDsKKyAgICAKKyAgICBwTGFzdCA9IHBFbnRyeS0+bGFzdDsKKyAgICBwTmV4dCA9IHBFbnRyeS0+bmV4dDsKKyAgICBwTGFzdC0+bmV4dCA9IHBOZXh0OworICAgIHBOZXh0LT5sYXN0ID0gcExhc3Q7Cit9CisKKworQU5JX0lOTElORV9GVU5DVElPTiB0TGlzdEVsZW0gKiBjc3JMaXN0UmVtb3ZlSGVhZCh0TGlzdEVsZW0gKnBIZWFkKQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRMaXN0RWxlbSAqcE5leHQ7CisgICAgCisgICAgcEVudHJ5ID0gcEhlYWQtPm5leHQ7CisgICAgcE5leHQgPSBwRW50cnktPm5leHQ7CisgICAgcEhlYWQtPm5leHQgPSBwTmV4dDsKKyAgICBwTmV4dC0+bGFzdCA9IHBIZWFkOworICAgIAorICAgIHJldHVybiAocEVudHJ5KTsKK30KKworCisKK0FOSV9JTkxJTkVfRlVOQ1RJT04gdExpc3RFbGVtICogY3NyTGlzdFJlbW92ZVRhaWwodExpc3RFbGVtICpwSGVhZCkKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0TGlzdEVsZW0gKnBMYXN0OworICAgIAorICAgIHBFbnRyeSA9IHBIZWFkLT5sYXN0OworICAgIHBMYXN0ID0gcEVudHJ5LT5sYXN0OworICAgIHBIZWFkLT5sYXN0ID0gcExhc3Q7CisgICAgcExhc3QtPm5leHQgPSBwSGVhZDsKKyAgICAKKyAgICByZXR1cm4gKHBFbnRyeSk7Cit9CisKKworQU5JX0lOTElORV9GVU5DVElPTiB2b2lkIGNzckxpc3RJbnNlcnRUYWlsKHRMaXN0RWxlbSAqcEhlYWQsIHRMaXN0RWxlbSAqcEVudHJ5KQoreworICAgIHRMaXN0RWxlbSAqcExhc3Q7CisgICAgCisgICAgcExhc3QgPSBwSGVhZC0+bGFzdDsKKyAgICBwRW50cnktPmxhc3QgPSBwTGFzdDsKKyAgICBwRW50cnktPm5leHQgPSBwSGVhZDsKKyAgICBwTGFzdC0+bmV4dCA9IHBFbnRyeTsKKyAgICBwSGVhZC0+bGFzdCA9IHBFbnRyeTsKK30KKworCitBTklfSU5MSU5FX0ZVTkNUSU9OIHZvaWQgY3NyTGlzdEluc2VydEhlYWQodExpc3RFbGVtICpwSGVhZCwgdExpc3RFbGVtICpwRW50cnkpCit7CisgICAgdExpc3RFbGVtICpwTmV4dDsKKyAgICAKKyAgICBwTmV4dCA9IHBIZWFkLT5uZXh0OworICAgIHBFbnRyeS0+bmV4dCA9IHBOZXh0OworICAgIHBFbnRyeS0+bGFzdCA9IHBIZWFkOworICAgIHBOZXh0LT5sYXN0ID0gcEVudHJ5OworICAgIHBIZWFkLT5uZXh0ID0gcEVudHJ5OworfQorCisKKy8vSW5zZXJ0IHBOZXdFbnRyeSBiZWZvcmUgcEVudHJ5Cit2b2lkIGNzckxpc3RJbnNlcnRFbnRyeSh0TGlzdEVsZW0gKnBFbnRyeSwgdExpc3RFbGVtICpwTmV3RW50cnkpCit7CisgICAgdExpc3RFbGVtICpwTGFzdDsKKyAgICBpZiggIXBFbnRyeSkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEVycm9yISEgcEVudHJ5IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47IAorICAgIH0KKyAgICAgICAKKyAgICBwTGFzdCA9IHBFbnRyeS0+bGFzdDsKKyAgICBwTGFzdC0+bmV4dCA9IHBOZXdFbnRyeTsKKyAgICBwRW50cnktPmxhc3QgPSBwTmV3RW50cnk7CisgICAgcE5ld0VudHJ5LT5uZXh0ID0gcEVudHJ5OworICAgIHBOZXdFbnRyeS0+bGFzdCA9IHBMYXN0OworfQorCit0QU5JX1UzMiBjc3JMTENvdW50KCB0RGJsTGlua0xpc3QgKnBMaXN0ICkgCit7CisgICAgdEFOSV9VMzIgYyA9IDA7IAorICAgIAorCisgICAgaWYoICFwTGlzdCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBjOyAKKyAgICB9CisKKyAgICBpZiAoIHBMaXN0ICYmICggTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcgKSApIAorICAgIHsKKyAgICAgICAgYyA9IHBMaXN0LT5Db3VudDsKKyAgICB9CisKKyAgICByZXR1cm4oIGMgKTsgCit9CisKKwordm9pZCBjc3JMTExvY2soIHREYmxMaW5rTGlzdCAqcExpc3QgKSAKK3sKKyAgICAKKworICAgIGlmKCAhcExpc3QpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOyAKKyAgICB9CisKKyAgICBpZiAoIExJU1RfRkxBR19PUEVOID09IHBMaXN0LT5GbGFnICkKKyAgICB7CisgICAgICAgIHZvc19sb2NrX2FjcXVpcmUoJnBMaXN0LT5Mb2NrKTsKKyAgICB9Cit9CisKKwordm9pZCBjc3JMTFVubG9jayggdERibExpbmtMaXN0ICpwTGlzdCApCit7CisgICAgCisgICAgaWYoICFwTGlzdCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA7IAorICAgIH0KKworICAgIGlmICggTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcgKSAKKyAgICB7CisgICAgICAgIHZvc19sb2NrX3JlbGVhc2UoJnBMaXN0LT5Mb2NrKTsKKyAgICB9Cit9CisKKwordEFOSV9CT09MRUFOIGNzckxMSXNMaXN0RW1wdHkoIHREYmxMaW5rTGlzdCAqcExpc3QsIHRBTklfQk9PTEVBTiBmSW50ZXJsb2NrZWQgKQoreworICAgIHRBTklfQk9PTEVBTiBmRW1wdHkgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKworICAgIAorICAgIGlmKCAhcExpc3QpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZkVtcHR5IDsgCisgICAgfQorCisgICAgaWYgKCBMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZyApIAorICAgIHsKKyAgICAgICAgaWYoZkludGVybG9ja2VkKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JMTExvY2socExpc3QpOworICAgICAgICB9CisKKyAgICAgICAgZkVtcHR5ID0gY3NySXNMaXN0RW1wdHkoICZwTGlzdC0+TGlzdEhlYWQgKTsKKyAgICAgICAgIAorICAgICAgICBpZihmSW50ZXJsb2NrZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzckxMVW5sb2NrKHBMaXN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oIGZFbXB0eSApOworfQorCisKKwordEFOSV9CT09MRUFOIGNzckxMRmluZEVudHJ5KCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0TGlzdEVsZW0gKnBFbnRyeVRvRmluZCApCit7CisgICAgdEFOSV9CT09MRUFOIGZGb3VuZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKworICAgIAorICAgIGlmKCAhcExpc3QpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZkZvdW5kIDsgCisgICAgfQorCisgICAgaWYgKCBMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZyApIAorICAgIHsKKyAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggcExpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworCisgICAgICAgIC8vIEhhdmUgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGxvb3AgYmFjayB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgd2hpY2ggd2lsbAorICAgICAgICAvLyBoYXBwZW4gaWYgdGhlIGVudHJ5IGlzIE5PVCBvbiB0aGUgbGlzdC4uLgorICAgIAorICAgICAgICB3aGlsZSggcEVudHJ5ICYmICggcEVudHJ5ICE9ICZwTGlzdC0+TGlzdEhlYWQgKSApIAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBFbnRyeSA9PSBwRW50cnlUb0ZpbmQgKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmRm91bmQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgcmV0dXJuKCBmRm91bmQgKTsKK30KKworCitlSGFsU3RhdHVzIGNzckxMT3BlbiggdEhkZEhhbmRsZSBoSGRkLCB0RGJsTGlua0xpc3QgKnBMaXN0ICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICAgCisgICAgaWYoICFwTGlzdCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFIDsgCisgICAgfQorICAgIAorICAgIGlmICggTElTVF9GTEFHX09QRU4gIT0gcExpc3QtPkZsYWcgKSAKKyAgICB7CisgICAgICAgIHBMaXN0LT5Db3VudCA9IDA7CisKKyAgICAgICAgdm9zU3RhdHVzID0gdm9zX2xvY2tfaW5pdCgmcExpc3QtPkxvY2spOworCisgICAgICAgIGlmKFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JMaXN0SW5pdCggJnBMaXN0LT5MaXN0SGVhZCApOworICAgICAgICAgICAgcExpc3QtPkZsYWcgPSBMSVNUX0ZMQUdfT1BFTjsKKyAgICAgICAgICAgIHBMaXN0LT5oSGRkID0gaEhkZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKK3ZvaWQgY3NyTExDbG9zZSggdERibExpbmtMaXN0ICpwTGlzdCApCit7CisgICAgaWYoICFwTGlzdCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA7IAorICAgIH0KKworICAgIGlmICggTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcgKSAKKyAgICB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGlzdCBpcyBlbXB0eS4uLgorICAgICAgICBjc3JMTFB1cmdlKCBwTGlzdCwgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICAgICAgdm9zX2xvY2tfZGVzdHJveSggJnBMaXN0LT5Mb2NrICk7CisgICAgICAgIHBMaXN0LT5GbGFnID0gTElTVF9GTEFHX0NMT1NFOworICAgIH0KK30KKwordm9pZCBjc3JMTEluc2VydFRhaWwoIHREYmxMaW5rTGlzdCAqcExpc3QsIHRMaXN0RWxlbSAqcEVudHJ5LCB0QU5JX0JPT0xFQU4gZkludGVybG9ja2VkICkKK3sgICAgCisgICAgaWYoICFwTGlzdCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsgCisgICAgfQorCisgICAgaWYgKCBMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZyApIAorICAgIHsKKyAgICAgICAgaWYoZkludGVybG9ja2VkKQorICAgICAgICB7ICAKKyAgICAgICAgICAgIGNzckxMTG9jayhwTGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgY3NyTGlzdEluc2VydFRhaWwoICZwTGlzdC0+TGlzdEhlYWQsIHBFbnRyeSApOworICAgICAgICBwTGlzdC0+Q291bnQrKzsKKyAgICAgICAgaWYoZkludGVybG9ja2VkKQorICAgICAgICB7ICAKKyAgICAgICAgICAgIGNzckxMVW5sb2NrKHBMaXN0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKK3ZvaWQgY3NyTExJbnNlcnRIZWFkKCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0TGlzdEVsZW0gKnBFbnRyeSwgdEFOSV9CT09MRUFOIGZJbnRlcmxvY2tlZCApCit7CisgICAgCisgICAgaWYoICFwTGlzdCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsgCisgICAgfQorCisgICAgaWYgKCBMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZyApIAorICAgIHsKKyAgICAgICAgaWYoZkludGVybG9ja2VkKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JMTExvY2socExpc3QpOworICAgICAgICB9CisgICAgICAgIGNzckxpc3RJbnNlcnRIZWFkKCAmcExpc3QtPkxpc3RIZWFkLCBwRW50cnkgKTsKKyAgICAgICAgcExpc3QtPkNvdW50Kys7CisgICAgICAgIGlmKGZJbnRlcmxvY2tlZCkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyTExVbmxvY2socExpc3QpOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgY3NyTExJbnNlcnRFbnRyeSggdERibExpbmtMaXN0ICpwTGlzdCwgdExpc3RFbGVtICpwRW50cnksIHRMaXN0RWxlbSAqcE5ld0VudHJ5LCB0QU5JX0JPT0xFQU4gZkludGVybG9ja2VkICkKK3sgICAgCisgICAgaWYoICFwTGlzdCkgCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEVycm9yISEgcExpc3QgaXMgTnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA7IAorICAgIH0KKworICAgIGlmICggTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcgKSAKKyAgICB7CisgICAgICAgIGlmKGZJbnRlcmxvY2tlZCkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyTExMb2NrKHBMaXN0KTsKKyAgICAgICAgfQorICAgICAgICBjc3JMaXN0SW5zZXJ0RW50cnkoIHBFbnRyeSwgcE5ld0VudHJ5ICk7CisgICAgICAgIHBMaXN0LT5Db3VudCsrOworICAgICAgICBpZihmSW50ZXJsb2NrZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzckxMVW5sb2NrKHBMaXN0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKK3RMaXN0RWxlbSAqY3NyTExSZW1vdmVUYWlsKCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0QU5JX0JPT0xFQU4gZkludGVybG9ja2VkICkKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisKKyAgICBpZiggIXBMaXN0KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogRXJyb3IhISBwTGlzdCBpcyBOdWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHBFbnRyeSA7IAorICAgIH0KKworICAgIGlmICggTElTVF9GTEFHX09QRU4gPT0gcExpc3QtPkZsYWcgKSAKKyAgICB7CisgICAgICAgIGlmICggZkludGVybG9ja2VkICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzckxMTG9jayggcExpc3QgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggIWNzcklzTGlzdEVtcHR5KCZwTGlzdC0+TGlzdEhlYWQpICkgCisgICAgICAgIHsKKworICAgICAgICAgICAgcEVudHJ5ID0gY3NyTGlzdFJlbW92ZVRhaWwoICZwTGlzdC0+TGlzdEhlYWQgKTsKKyAgICAgICAgICAgIHBMaXN0LT5Db3VudC0tOworICAgICAgICB9CisgICAgICAgIGlmICggZkludGVybG9ja2VkICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzckxMVW5sb2NrKCBwTGlzdCApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKCBwRW50cnkgKTsKK30KKworCit0TGlzdEVsZW0gKmNzckxMUGVla1RhaWwoIHREYmxMaW5rTGlzdCAqcExpc3QsIHRBTklfQk9PTEVBTiBmSW50ZXJsb2NrZWQgKQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKworICAgIAorICAgIGlmKCAhcExpc3QpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcEVudHJ5IDsgCisgICAgfQorCisgICAgaWYgKCBMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZyApIAorICAgIHsKKyAgICAgICAgaWYgKCBmSW50ZXJsb2NrZWQgKSAKKyAgICAgICAgeyAgCisgICAgICAgICAgICBjc3JMTExvY2soIHBMaXN0ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFjc3JJc0xpc3RFbXB0eSgmcExpc3QtPkxpc3RIZWFkKSApIAorICAgICAgICB7CisgICAgICAgICAgICBwRW50cnkgPSBwTGlzdC0+TGlzdEhlYWQubGFzdDsgCisgICAgICAgIH0KKyAgICAgICAgaWYgKCBmSW50ZXJsb2NrZWQgKSAKKyAgICAgICAgeworICAgICAgICAgICAgY3NyTExVbmxvY2soIHBMaXN0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oIHBFbnRyeSApOworfQorCisKKwordExpc3RFbGVtICpjc3JMTFJlbW92ZUhlYWQoIHREYmxMaW5rTGlzdCAqcExpc3QsIHRBTklfQk9PTEVBTiBmSW50ZXJsb2NrZWQgKQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKyAgICAKKworICAgIGlmKCAhcExpc3QpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcEVudHJ5IDsgCisgICAgfQorCisgICAgaWYgKCBMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZyApIAorICAgIHsKKyAgICAgICAgaWYgKCBmSW50ZXJsb2NrZWQgKSAKKyAgICAgICAgeyAgCisgICAgICAgICAgICBjc3JMTExvY2soIHBMaXN0ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFjc3JJc0xpc3RFbXB0eSgmcExpc3QtPkxpc3RIZWFkKSApIAorICAgICAgICB7CisgICAgICAgICAgICBwRW50cnkgPSBjc3JMaXN0UmVtb3ZlSGVhZCggJnBMaXN0LT5MaXN0SGVhZCApOworICAgICAgICAgICAgcExpc3QtPkNvdW50LS07CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGZJbnRlcmxvY2tlZCApIAorICAgICAgICB7CisgICAgICAgICAgICBjc3JMTFVubG9jayggcExpc3QgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiggcEVudHJ5ICk7Cit9CisKKwordExpc3RFbGVtICpjc3JMTFBlZWtIZWFkKCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0QU5JX0JPT0xFQU4gZkludGVybG9ja2VkICkKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisKKyAgICBpZiggIXBMaXN0KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogRXJyb3IhISBwTGlzdCBpcyBOdWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHBFbnRyeSA7IAorICAgIH0KKyAgICAgCisgICAgaWYgKCBMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZyApIAorICAgIHsKKyAgICAgICAgaWYgKCBmSW50ZXJsb2NrZWQgKSAKKyAgICAgICAgeyAgCisgICAgICAgICAgICBjc3JMTExvY2soIHBMaXN0ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFjc3JJc0xpc3RFbXB0eSgmcExpc3QtPkxpc3RIZWFkKSApIAorICAgICAgICB7CisgICAgICAgICAgICBwRW50cnkgPSBwTGlzdC0+TGlzdEhlYWQubmV4dDsgCisgICAgICAgIH0KKyAgICAgICAgaWYgKCBmSW50ZXJsb2NrZWQgKSAKKyAgICAgICAgeworICAgICAgICAgICAgY3NyTExVbmxvY2soIHBMaXN0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oIHBFbnRyeSApOworfQorCisKKwordm9pZCBjc3JMTFB1cmdlKCB0RGJsTGlua0xpc3QgKnBMaXN0LCB0QU5JX0JPT0xFQU4gZkludGVybG9ja2VkICkKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKworICAgIGlmKCAhcExpc3QpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBFcnJvciEhIHBMaXN0IGlzIE51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOyAKKyAgICB9CisKKyAgICBpZiAoIExJU1RfRkxBR19PUEVOID09IHBMaXN0LT5GbGFnICkgCisgICAgeworICAgICAgICBpZiAoIGZJbnRlcmxvY2tlZCApIAorICAgICAgICB7ICAKKyAgICAgICAgICAgIGNzckxMTG9jayggcExpc3QgKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSggKHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZCggcExpc3QsIExMX0FDQ0VTU19OT0xPQ0sgKSkgKSAKKyAgICAgICAgeworICAgICAgICAgICAgLy8ganVzdCByZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBsaXN0IHVudGlsIAorICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0IG9uIHRoZSBsaXN0LgorICAgICAgICB9CisgICAgICAgIGlmICggZkludGVybG9ja2VkICkgCisgICAgICAgIHsgIAorICAgICAgICAgICAgY3NyTExVbmxvY2soIHBMaXN0ICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordEFOSV9CT09MRUFOIGNzckxMUmVtb3ZlRW50cnkoIHREYmxMaW5rTGlzdCAqcExpc3QsIHRMaXN0RWxlbSAqcEVudHJ5VG9SZW1vdmUsIHRBTklfQk9PTEVBTiBmSW50ZXJsb2NrZWQgKQoreworICAgIHRBTklfQk9PTEVBTiBmRm91bmQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisKKyAgICBpZiggIXBMaXN0KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogRXJyb3IhISBwTGlzdCBpcyBOdWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZGb3VuZDsgCisgICAgfQorCisgICAgaWYgKCBMSVNUX0ZMQUdfT1BFTiA9PSBwTGlzdC0+RmxhZyApIAorICAgIHsKKyAgICAgICAgaWYgKCBmSW50ZXJsb2NrZWQgKSAKKyAgICAgICAgeworICAgICAgICAgICAgY3NyTExMb2NrKCBwTGlzdCApOworICAgICAgICB9CisKKyAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggcExpc3QsIExMX0FDQ0VTU19OT0xPQ0sgKTsKKworICAgICAgICAvLyBIYXZlIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb29wIGJhY2sgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHdoaWNoIHdpbGwKKyAgICAgICAgLy8gaGFwcGVuIGlmIHRoZSBlbnRyeSBpcyBOT1Qgb24gdGhlIGxpc3QuLi4KKyAgICAgICAgd2hpbGUoIHBFbnRyeSAmJiAoIHBFbnRyeSAhPSAmcExpc3QtPkxpc3RIZWFkICkgKSAKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwRW50cnkgPT0gcEVudHJ5VG9SZW1vdmUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzckxpc3RSZW1vdmVFbnRyeSggcEVudHJ5ICk7CisgICAgICAgICAgICAgICAgcExpc3QtPkNvdW50LS07CisKKyAgICAgICAgICAgICAgICBmRm91bmQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcEVudHJ5ID0gcEVudHJ5LT5uZXh0OyAKKyAgICAgICAgfQorICAgICAgICBpZiAoIGZJbnRlcmxvY2tlZCApIAorICAgICAgICB7CisgICAgICAgICAgICBjc3JMTFVubG9jayggcExpc3QgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiggZkZvdW5kICk7Cit9CisKKworCit0TGlzdEVsZW0gKmNzckxMTmV4dCggdERibExpbmtMaXN0ICpwTGlzdCwgdExpc3RFbGVtICpwRW50cnksIHRBTklfQk9PTEVBTiBmSW50ZXJsb2NrZWQgKQoreworICAgIHRMaXN0RWxlbSAqcE5leHRFbnRyeSA9IE5VTEw7CisKKyAgICBpZiggIXBMaXN0KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogRXJyb3IhISBwTGlzdCBpcyBOdWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHBOZXh0RW50cnkgOyAKKyAgICB9CisKKyAgICBpZiAoIExJU1RfRkxBR19PUEVOID09IHBMaXN0LT5GbGFnICkgCisgICAgeworICAgICAgICBpZiAoIGZJbnRlcmxvY2tlZCApIAorICAgICAgICB7CisgICAgICAgICAgICBjc3JMTExvY2soIHBMaXN0ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFjc3JJc0xpc3RFbXB0eSgmcExpc3QtPkxpc3RIZWFkKSAmJiBjc3JMTEZpbmRFbnRyeSggcExpc3QsIHBFbnRyeSApICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHBOZXh0RW50cnkgPSBwRW50cnktPm5leHQ7CisgICAgICAgICAgICAvL01ha2Ugc3VyZSB3ZSBkb24ndCB3YWxrIHBhc3QgdGhlIGhlYWQKKyAgICAgICAgICAgIGlmICggcE5leHRFbnRyeSA9PSAmcExpc3QtPkxpc3RIZWFkICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE5leHRFbnRyeSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGZJbnRlcmxvY2tlZCApIAorICAgICAgICB7CisgICAgICAgICAgICBjc3JMTFVubG9jayggcExpc3QgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiggcE5leHRFbnRyeSApOworfQorCisKK3RMaXN0RWxlbSAqY3NyTExQcmV2aW91cyggdERibExpbmtMaXN0ICpwTGlzdCwgdExpc3RFbGVtICpwRW50cnksIHRBTklfQk9PTEVBTiBmSW50ZXJsb2NrZWQgKQoreworICAgIHRMaXN0RWxlbSAqcE5leHRFbnRyeSA9IE5VTEw7CisKKyAgICBpZiggIXBMaXN0KSAKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogRXJyb3IhISBwTGlzdCBpcyBOdWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHBOZXh0RW50cnkgOyAKKyAgICB9CisKKyAgICBpZiAoIExJU1RfRkxBR19PUEVOID09IHBMaXN0LT5GbGFnICkgCisgICAgeworICAgICAgICBpZiAoIGZJbnRlcmxvY2tlZCApIAorICAgICAgICB7CisgICAgICAgICAgICBjc3JMTExvY2soIHBMaXN0ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFjc3JJc0xpc3RFbXB0eSgmcExpc3QtPkxpc3RIZWFkKSAmJiBjc3JMTEZpbmRFbnRyeSggcExpc3QsIHBFbnRyeSApICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHBOZXh0RW50cnkgPSBwRW50cnktPmxhc3Q7IAorICAgICAgICAgICAgLy9NYWtlIHN1cmUgd2UgZG9uJ3Qgd2FsayBwYXN0IHRoZSBoZWFkCisgICAgICAgICAgICBpZiAoIHBOZXh0RW50cnkgPT0gJnBMaXN0LT5MaXN0SGVhZCApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBOZXh0RW50cnkgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9ICAKKworICAgICAgICBpZiAoIGZJbnRlcmxvY2tlZCApIAorICAgICAgICB7CisgICAgICAgICAgICBjc3JMTFVubG9jayggcExpc3QgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiggcE5leHRFbnRyeSApOworfQorCisKKworCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9zcmMvY3NyL2NzckxvZ0R1bXAuYyBiL0NPUkUvU01FL3NyYy9jc3IvY3NyTG9nRHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZmIzZWIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9zcmMvY3NyL2NzckxvZ0R1bXAuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29weXJpZ2h0IChjKSAyMDA3IFFVQUxDT01NIEluY29ycG9yYXRlZC4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCitRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Citjc3JMb2dEdW1wLmMKK0ltcGxlbWVudHMgdGhlIGR1bXAgY29tbWFuZHMgc3BlY2lmaWMgdG8gdGhlIGNzciBtb2R1bGUuIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAiY3NyQXBpLmgiCisjaW5jbHVkZSAiYnRjQXBpLmgiCisjaW5jbHVkZSAibG9nRHVtcC5oIgorI2luY2x1ZGUgInNtc0RlYnVnLmgiCisjaW5jbHVkZSAic21lSW5zaWRlLmgiCisjaW5jbHVkZSAiY3NySW5zaWRlQXBpLmgiCisjaWYgZGVmaW5lZChBTklfTE9HRFVNUCkKK3N0YXRpYyBjaGFyICoKK2R1bXBfY3NyKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwICkKK3sKKyAgICBzdGF0aWMgdENzclJvYW1Qcm9maWxlIHg7CisgICAgc3RhdGljIHRTaXJNYWNTU2lkIHNzaWQ7ICAgLy9UbyBiZSBhbGxvY2F0ZWQgZm9yIGFycmF5IG9mIFNTSURzCisgICAgc3RhdGljIHRBTklfVTggc2Vzc2lvbklkID0gMDsgLy8gRGVmaW5lZCBmb3IgZml4ZWQgc2Vzc2lvbiBJRAorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKSZ4LCBzaXplb2YoeCkpOyAKKyAgICB4LlNTSURzLm51bU9mU1NJRHM9MSA7CisgICAgeC5TU0lEcy5TU0lETGlzdFswXS5TU0lEID0gc3NpZCA7CisgICAgc3NpZC5sZW5ndGg9NiA7CisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBzc2lkLnNzSWQsICJBbmlOZXQiLCA2KTsKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICkpKQorICAgIHsKKyAgICAgICAgKHZvaWQpY3NyUm9hbUNvbm5lY3QocE1hYywgc2Vzc2lvbklkLCAmeCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKyAgICByZXR1cm4gcDsKK30KK3N0YXRpYyBjaGFyICpkdW1wX2J0Y1NldEV2ZW50KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwICkKK3sKKyAgICB0U21lQnRFdmVudCBidEV2ZW50OworICAgIGlmKCBhcmcxIDwgQlRfRVZFTlRfVFlQRV9NQVggKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgc2lnbmFsIEJUIGV2ZW50ICglZCkgaGFuZGxlICglZCkgM3JkIHBhcmFtKCVkKVxuIiksIGFyZzEsIGFyZzIsIGFyZzMpOworICAgICAgICB2b3NfbWVtX3plcm8oJmJ0RXZlbnQsIHNpemVvZih0U21lQnRFdmVudCkpOworICAgICAgICBidEV2ZW50LmJ0RXZlbnRUeXBlID0gYXJnMTsKKyAgICAgICAgc3dpdGNoKCBhcmcxICkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJUX0VWRU5UX1NZTkNfQ09OTkVDVElPTl9DT01QTEVURToKKyAgICAgICAgY2FzZSBCVF9FVkVOVF9TWU5DX0NPTk5FQ1RJT05fVVBEQVRFRDoKKyAgICAgICAgICAgIGJ0RXZlbnQudUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5jb25uZWN0aW9uSGFuZGxlID0gKHZfVTE2X3QpYXJnMjsKKyAgICAgICAgICAgIGJ0RXZlbnQudUV2ZW50UGFyYW0uYnRTeW5jQ29ubmVjdGlvbi5zdGF0dXMgPSAodl9VOF90KWFyZzM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVF9FVkVOVF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgYnRFdmVudC51RXZlbnRQYXJhbS5idERpc2Nvbm5lY3QuY29ubmVjdGlvbkhhbmRsZSA9ICh2X1UxNl90KWFyZzI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVF9FVkVOVF9DUkVBVEVfQUNMX0NPTk5FQ1RJT046CisgICAgICAgIGNhc2UgQlRfRVZFTlRfQUNMX0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICAgICAgICBidEV2ZW50LnVFdmVudFBhcmFtLmJ0QWNsQ29ubmVjdGlvbi5jb25uZWN0aW9uSGFuZGxlID0gKHZfVTE2X3QpYXJnMjsKKyAgICAgICAgICAgIGJ0RXZlbnQudUV2ZW50UGFyYW0uYnRBY2xDb25uZWN0aW9uLnN0YXR1cyA9ICh2X1U4X3QpYXJnMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJUX0VWRU5UX01PREVfQ0hBTkdFRDoKKyAgICAgICAgICAgIGJ0RXZlbnQudUV2ZW50UGFyYW0uYnRBY2xNb2RlQ2hhbmdlLmNvbm5lY3Rpb25IYW5kbGUgPSAodl9VMTZfdClhcmcyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnRjU2lnbmFsQlRFdmVudChwTWFjLCAmYnRFdmVudCk7CisgICAgICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIGludmFsaWQgZXZlbnQgKCVkKVxuIiksIGFyZzEpOworICAgIH0KKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIHREdW1wRnVuY0VudHJ5IGNzck1lbnVEdW1wVGFibGVbXSA9IHsKKyAgICB7MCwgICAgICJDU1IgKDg1MC04NjApIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7ODUxLCAgICJDU1I6IENTUiB0ZXN0aW5nIGNvbm5lY3Rpb24gdG8gQW5pTmV0IiwgICAgICAgICAgICBkdW1wX2Nzcn0sCisgICAgezg1MiwgICAiQlRDOiBGYWtlIEJUIGV2ZW50cyAoZXZlbnQsIGhhbmRsZSkiLCAgICAgICAgICAgICAgZHVtcF9idGNTZXRFdmVudH0sCit9OworCit2b2lkIGNzckR1bXBJbml0KHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICBsb2dEdW1wUmVnaXN0ZXJUYWJsZSggKHRwQW5pU2lyR2xvYmFsKWhIYWwsICZjc3JNZW51RHVtcFRhYmxlWzBdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNzck1lbnVEdW1wVGFibGUpL3NpemVvZihjc3JNZW51RHVtcFRhYmxlWzBdKSApOworfQorCisjZW5kaWYgLy8jaWYgZGVmaW5lZChBTklfTE9HRFVNUCkKZGlmZiAtLWdpdCBhL0NPUkUvU01FL3NyYy9jc3IvY3NyTmVpZ2hib3JSb2FtLmMgYi9DT1JFL1NNRS9zcmMvY3NyL2Nzck5laWdoYm9yUm9hbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTEwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9zcmMvY3NyL2Nzck5laWdoYm9yUm9hbS5jCkBAIC0wLDAgKzEsMjg0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiAqLworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICogIAorCisgIAorICAgIFxmaWxlIGNzck5laWdoYm9yUm9hbS5jCisgIAorICAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgc2ltcGxlIHJvYW1pbmcgYWxnb3JpdGhtIGZvciA4MDIuMTFyIEZhc3QgdHJhbnNpdGlvbnMgYW5kIExlZ2FjeSByb2FtaW5nIGZvciBBbmRyb2lkIHBsYXRmb3JtLgorICAKKyAgICBDb3B5cmlnaHQgKEMpIDIwMTAgUXVhbGNvbW0sIEluY29ycG9yYXRlZAorICAKKyAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKworICB3aGVuICAgICAgICAgICB3aG8gICAgICAgICAgICAgICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tLS0gICAgICAgLS0tICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswOC8wMS8xMCAgICAgICAgICBNdXJhbGkgICAgICAgICAgICAgQ3JlYXRlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisjaW5jbHVkZSAicGFsQXBpLmgiCisjaW5jbHVkZSAiY3NySW5zaWRlQXBpLmgiCisjaW5jbHVkZSAic21zRGVidWcuaCIKKyNpbmNsdWRlICJsb2dEdW1wLmgiCisjaW5jbHVkZSAic21lUW9zSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIgorI2luY2x1ZGUgInNtZUluc2lkZS5oIgorI2luY2x1ZGUgInZvc19kaWFnX2NvcmVfZXZlbnQuaCIKKyNpbmNsdWRlICJ2b3NfZGlhZ19jb3JlX2xvZy5oIgorI2luY2x1ZGUgImNzckFwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3RsLmgiCisjaW5jbHVkZSAic21lX0FwaS5oIgorI2luY2x1ZGUgImNzck5laWdoYm9yUm9hbS5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyNpbmNsdWRlICJjc3JDY3guaCIKKyNlbmRpZgorCisjZGVmaW5lIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HX0RFQlVHIDEKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlOR19ERUJVRworI2RlZmluZSBORUlHSEJPUl9ST0FNX0RFQlVHIHNtc0xvZworI2Vsc2UKKyNkZWZpbmUgTkVJR0hCT1JfUk9BTV9ERUJVRyh4Li4uKQorI2VuZGlmCisKK1ZPU19TVEFUVVMgY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBVUENhbGxiYWNrICh2X1BWT0lEX3QgcEFkYXB0ZXIsIHZfVThfdCByc3NpTm90aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfUFZPSURfdCBwVXNlckN0eHQpOworVk9TX1NUQVRVUyBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cERPV05DYWxsYmFjayAodl9QVk9JRF90IHBBZGFwdGVyLCB2X1U4X3QgcnNzaU5vdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1BWT0lEX3QgcFVzZXJDdHh0KTsKK3ZvaWQgY3NyTmVpZ2hib3JSb2FtUlJNTmVpZ2hib3JSZXBvcnRSZXN1bHQodm9pZCAqY29udGV4dCwgVk9TX1NUQVRVUyB2b3NTdGF0dXMpOworZUhhbFN0YXR1cyBjc3JSb2FtQ29weUNvbm5lY3RlZFByb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBEc3RQcm9maWxlICk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorc3RhdGljIGVIYWxTdGF0dXMgY3NyTmVpZ2hib3JSb2FtSXNzdWVQcmVhdXRoUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworVk9TX1NUQVRVUyBjc3JOZWlnaGJvclJvYW1Jc3N1ZU5laWdoYm9yUnB0UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKyNlbmRpZgorCisvKiBTdGF0ZSBUcmFuc2l0aW9uIG1hY3JvICovCisjZGVmaW5lIENTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04obmV3U3RhdGUpXAore1wKKyAgICBwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8ucHJldk5laWdoYm9yUm9hbVN0YXRlID0gcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLm5laWdoYm9yUm9hbVN0YXRlO1wKKyAgICBwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8ubmVpZ2hib3JSb2FtU3RhdGUgPSBuZXdTdGF0ZTtcCisgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJOZWlnaGJvciBSb2FtIFRyYW5zaXRpb24gZnJvbSBzdGF0ZSAlZCA9PT4gJWQiKSwgcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLnByZXZOZWlnaGJvclJvYW1TdGF0ZSwgbmV3U3RhdGUpO1wKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtRnJlZU5laWdoYm9yUm9hbUJTU05vZGUKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIGludGVybmFsIHBvaW50ZXJzIENTUiBOZWlnaGJvclJvYW0gQlNTIEluZm8gCisgICAgICAgICAgICBhbmQgYWxzbyBmcmVlcyB0aGUgbm9kZSBpdHNlbGYKKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICAgICAgICAgIG5laWdoYm9yUm9hbUJTU05vZGUgLSBOZWlnaGJvciBSb2FtIEJTUyBOb2RlIHRvIGJlIGZyZWVkCisKKyAgICBccmV0dXJuIFZPSUQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyTmVpZ2hib3JSb2FtRnJlZU5laWdoYm9yUm9hbUJTU05vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIG5laWdoYm9yUm9hbUJTU05vZGUpCit7CisgICAgaWYgKG5laWdoYm9yUm9hbUJTU05vZGUpCisgICAgeworICAgICAgICBpZiAobmVpZ2hib3JSb2FtQlNTTm9kZS0+cEJzc0Rlc2NyaXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUobmVpZ2hib3JSb2FtQlNTTm9kZS0+cEJzc0Rlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIG5laWdoYm9yUm9hbUJTU05vZGUtPnBCc3NEZXNjcmlwdGlvbiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdm9zX21lbV9mcmVlKG5laWdoYm9yUm9hbUJTU05vZGUpOworICAgICAgICBuZWlnaGJvclJvYW1CU1NOb2RlID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbVJlbW92ZVJvYW1hYmxlQVBMaXN0RW50cnkKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIGEgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgZ2l2ZW4gbGlzdAorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgICAgICAgICAgcExpc3QgLSBUaGUgbGlzdCBmcm9tIHdoaWNoIHRoZSBlbnRyeSBzaG91bGQgYmUgcmVtb3ZlZAorICAgICAgICAgICAgcE5laWdoYm9yRW50cnkgLSBOZWlnaGJvciBSb2FtIEJTUyBOb2RlIHRvIGJlIHJlbW92ZWQKKworICAgIFxyZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsbHkgcmVtb3ZlZCwgZWxzZSBGQUxTRQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9CT09MRUFOIGNzck5laWdoYm9yUm9hbVJlbW92ZVJvYW1hYmxlQVBMaXN0RW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RGJsTGlua0xpc3QgKnBMaXN0LCB0cENzck5laWdoYm9yUm9hbUJTU0luZm8gcE5laWdoYm9yRW50cnkpCit7CisgICAgaWYocExpc3QpCisgICAgeworICAgICAgICByZXR1cm4gY3NyTExSZW1vdmVFbnRyeShwTGlzdCwgJnBOZWlnaGJvckVudHJ5LT5MaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisgICAgfQorCisgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJSZW1vdmluZyBuZWlnaGJvciBCU1Mgbm9kZSBmcm9tIGxpc3QgZmFpbGVkLiBDdXJyZW50IGNvdW50ID0gJWRcbiIpLCBjc3JMTENvdW50KHBMaXN0KSk7CisKKyAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1HZXRSb2FtYWJsZUFQTGlzdE5leHRFbnRyeQorCisgICAgXGJyaWVmICBHZXRzIHRoZSBlbnRyeSBuZXh0IHRvIHBhc3NlZCBlbnRyeS4gSWYgTlVMTCBpcyBwYXNzZWQsIHJldHVybiB0aGUgZW50cnkgaW4gdGhlIGhlYWQgb2YgdGhlIGxpc3QKKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICAgICAgICAgIHBMaXN0IC0gVGhlIGxpc3QgZnJvbSB3aGljaCB0aGUgZW50cnkgc2hvdWxkIGJlIHJldHVybmVkCisgICAgICAgICAgICBwTmVpZ2hib3JFbnRyeSAtIE5laWdoYm9yIFJvYW0gQlNTIE5vZGUgd2hvc2UgbmV4dCBlbnRyeSBzaG91bGQgYmUgcmV0dXJuZWQKKworICAgIFxyZXR1cm4gTmVpZ2hib3IgUm9hbSBCU1MgTm9kZSB0byBiZSByZXR1cm5lZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIGNzck5laWdoYm9yUm9hbUdldFJvYW1hYmxlQVBMaXN0TmV4dEVudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREYmxMaW5rTGlzdCAqcExpc3QsIHRwQ3NyTmVpZ2hib3JSb2FtQlNTSW5mbyBwTmVpZ2hib3JFbnRyeSkKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisgICAgdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIHBSZXN1bHQgPSBOVUxMOworICAgIAorICAgIGlmKHBMaXN0KQorICAgIHsKKyAgICAgICAgaWYoTlVMTCA9PSBwTmVpZ2hib3JFbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZChwTGlzdCwgTExfQUNDRVNTX0xPQ0spOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KHBMaXN0LCAmcE5laWdoYm9yRW50cnktPkxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKyAgICAgICAgfQorICAgICAgICBpZihwRW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBSZXN1bHQgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzck5laWdoYm9yUm9hbUJTU0luZm8sIExpc3QpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBwUmVzdWx0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1GcmVlUm9hbWFibGVCU1NMaXN0CisKKyAgICBcYnJpZWYgICBFbXB0aWVzIGFuZCBmcmVlcyBhbGwgdGhlIG5vZGVzIGluIHRoZSByb2FtYWJsZSBBUCBsaXN0IAorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgICAgICAgICAgcExpc3QgLSBOZWlnaGJvciBSb2FtIEJTUyBMaXN0IHRvIGJlIGVtcHRpZWQKKworICAgIFxyZXR1cm4gVk9JRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjc3JOZWlnaGJvclJvYW1GcmVlUm9hbWFibGVCU1NMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREYmxMaW5rTGlzdCAqcExpc3QpCit7CisgICAgdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIHBSZXN1bHQgPSBOVUxMOworCisgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiRW1wdHlpbmcgdGhlIEJTUyBsaXN0LiBDdXJyZW50IGNvdW50ID0gJWRcbiIpLCBjc3JMTENvdW50KHBMaXN0KSk7CisKKyAgICAvKiBQaWNrIHVwIHRoZSBoZWFkLCByZW1vdmUgYW5kIGZyZWUgdGhlIG5vZGUgdGlsbCB0aGUgbGlzdCBiZWNvbWVzIGVtcHR5ICovCisgICAgd2hpbGUgKChwUmVzdWx0ID0gY3NyTmVpZ2hib3JSb2FtR2V0Um9hbWFibGVBUExpc3ROZXh0RW50cnkocE1hYywgcExpc3QsIE5VTEwpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY3NyTmVpZ2hib3JSb2FtUmVtb3ZlUm9hbWFibGVBUExpc3RFbnRyeShwTWFjLCBwTGlzdCwgcFJlc3VsdCk7CisgICAgICAgIGNzck5laWdoYm9yUm9hbUZyZWVOZWlnaGJvclJvYW1CU1NOb2RlKHBNYWMsIHBSZXN1bHQpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbVJlYXNzb2NJbmRDYWxsYmFjaworCisgICAgXGJyaWVmIFJlYXNzb2MgY2FsbGJhY2sgaW52b2tlZCBieSBUTCBvbiBjcm9zc2luZyB0aGUgcmVnaXN0ZXJlZCByZS1hc3NvYyB0aHJlc2hvbGQuCisgICAgICAgICAgIERpcmVjdGx5IHRyaWdnZXJlIEhPIGluIGNhc2Ugb2Ygbm9uLTExciBhc3NvY2lhdGlvbgorICAgICAgICAgICBJbiBjYXNlIG9mIDExUiBhc3NvY2lhdGlvbiwgdHJpZ2dlcnMgYSBwcmUtYXV0aCBldmVudHVhbGx5IGZvbGxvd2VkIGJ5IGFjdHVhbCBITworCisgICAgXHBhcmFtICBwQWRhcHRlciAtIFZPUyBDb250ZXh0CisgICAgICAgICAgICB0cmFmZmljU3RhdHVzIC0gVVAvRE9XTiBpbmRpY2F0aW9uIGZyb20gVEwKKyAgICAgICAgICAgIHBVc2VyQ3R4dCAtIFBhcmFtZXRlciBmb3IgY2FsbGJhY2sgcmVnaXN0ZXJlZCBkdXJpbmcgY2FsbGJhY2sgcmVnaXN0cmF0aW9uLiBTaG91bGQgYmUgcE1hYworCisgICAgXHJldHVybiBWT0lECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIGNzck5laWdoYm9yUm9hbVJlYXNzb2NJbmRDYWxsYmFjayh2X1BWT0lEX3QgcEFkYXB0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCB0cmFmZmljU3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1BWT0lEX3QgcFVzZXJDdHh0KQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggcFVzZXJDdHh0ICk7CisgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyAgICBwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm87CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7ICAgCisgCisgICAgc21zTG9nKHBNYWMsIExPRzEsIEZMKCJSZWFzc29jIGluZGljYXRpb24gY2FsbGJhY2sgY2FsbGVkIikpOworCisKKyAgICAvL3Ntc0xvZyhwTWFjLCBMT0dFLCBGTCgiUmVhc3NvYyBpbmRpY2F0aW9uIGNhbGxiYWNrIGNhbGxlZCBhdCBzdGF0ZSAlZCIpLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpOworCisgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cyLCBGTCgiRGVyZWdpc3RlcmluZyBET1dOIGV2ZW50IHJlYXNzb2MgY2FsbGJhY2sgd2l0aCBUTC4gUlNTSSA9ICVkIiksIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JSZWFzc29jVGhyZXNob2xkICogKC0xKSk7CisKKworICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9EZXJlZ1JTU0lJbmRpY2F0aW9uQ0IocE1hYy0+cm9hbS5nVm9zQ29udGV4dCwgKHZfUzdfdClwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5laWdoYm9yUmVhc3NvY1RocmVzaG9sZCAqICgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9IT19USFJFU0hPTERfRE9XTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzck5laWdoYm9yUm9hbVJlYXNzb2NJbmRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01PRFVMRV9JRF9TTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgIHsKKyAgICAgICAgLy9lcnIgbXNnCisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiIENvdWxkbid0IGRlcmVnaXN0ZXIgY3NyTmVpZ2hib3JSb2FtUmVhc3NvY0luZENhbGxiYWNrIHdpdGggVEw6IFN0YXR1cyA9ICVkXG4iKSwgdm9zU3RhdHVzKTsKKyAgICB9CisgICAgCisgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cyLCBGTCgiRGVyZWdpc3RlcmluZyBVUCBldmVudCBuZWlnaGJvciBsb29rdXAgY2FsbGJhY2sgd2l0aCBUTC4gUlNTSSA9ICVkIiksIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgKiAoLTEpKTsKKyAgICAvKiBEZXJlZ2lzdGVyIHJlYXNzb2MgY2FsbGJhY2suIElnbm9yZSByZXR1cm4gc3RhdHVzICovCisgICAgdm9zU3RhdHVzID0gV0xBTlRMX0RlcmVnUlNTSUluZGljYXRpb25DQihwTWFjLT5yb2FtLmdWb3NDb250ZXh0LCAodl9TN190KXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgKiAoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfSE9fVEhSRVNIT0xEX0RPV04sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cFVQQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NT0RVTEVfSURfU01FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICB7CisgICAgICAgIC8vZXJyIG1zZworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBDb3VsZG4ndCBkZXJlZ2lzdGVyIGNzck5laWdoYm9yUm9hbVJlYXNzb2NJbmRDYWxsYmFjayB3aXRoIFRMOiBTdGF0dXMgPSAlZFxuIiksIHZvc1N0YXR1cyk7CisgICAgfQorCisgICAgLyogV2UgZG9udCBuZWVkIHRvIHJ1biB0aGlzIHRpbWVyIGFueSBtb3JlLiAqLworICAgIHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSZXN1bHRzUmVmcmVzaFRpbWVyKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgaWYgKHBOZWlnaGJvclJvYW1JbmZvLT5pczExckFzc29jKQorICAgIHsKKyAgICAgICAgaWYgKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRVBPUlRfU0NBTiA9PSBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzck5laWdoYm9yUm9hbUlzc3VlUHJlYXV0aFJlcShwTWFjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiMTFSIFJlYXNzb2MgaW5kaWNhdGlvbiByZWNlaXZlZCBpbiB1bmV4cGVjdGVkIHN0YXRlICVkIiksIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSk7CisgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+aXNDQ1hBc3NvYykKKyAgICB7CisgICAgICAgIGlmIChlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVQT1JUX1NDQU4gPT0gcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1Jc3N1ZVByZWF1dGhSZXEocE1hYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNDWCBSZWFzc29jIGluZGljYXRpb24gcmVjZWl2ZWQgaW4gdW5leHBlY3RlZCBzdGF0ZSAlZCIpLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpOworICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIGlmIChlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ0ZHX0NIQU5fTElTVF9TQ0FOID09IHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtUmVxdWVzdEhhbmRvZmYocE1hYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIk5vbi0xMVIgUmVhc3NvYyBpbmRpY2F0aW9uIHJlY2VpdmVkIGluIHVuZXhwZWN0ZWQgc3RhdGUgJWQiKSwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKTsKKyAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtUmVzZXRDb25uZWN0ZWRTdGF0ZUNvbnRyb2xJbmZvCisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCB0aGUgbmVpZ2hib3Igcm9hbSBjb250cm9sIGluZm8gZGF0YSBzdHJ1Y3R1cmVzLiAKKyAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgd2hlbmV2ZXIgd2UgbW92ZSB0byBDT05ORUNURUQgc3RhdGUgZnJvbSAKKyAgICAgICAgICAgIGFueSBzdGF0ZSBvdGhlciB0aGFuIElOSVQgc3RhdGUKKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICAgIFxyZXR1cm4gVk9JRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjc3JOZWlnaGJvclJvYW1SZXNldENvbm5lY3RlZFN0YXRlQ29udHJvbEluZm8odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvICAgIHBOZWlnaGJvclJvYW1JbmZvID0gJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mbzsKKworICAgIC8qIERvIG5vdCByZXNldCB0aGUgY3VycmVudE5laWdoYm9yTG9va3VwIFRocmVzaG9sZCBoZXJlLiBUaGUgdGhyZXNob2xkIGFuZCBtdWx0aXBsaWVyIHdpbGwgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgQVBJICovCisgICAgaWYgKChwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLklBUFBOZWlnaGJvckxpc3RSZWNlaXZlZCA9PSBGQUxTRSkgJiYKKyAgICAgICAgKHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5udW1PZkNoYW5uZWxzKSkKKyAgICB7CisgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5JbmRleCA9IENTUl9ORUlHSEJPUl9ST0FNX0lOVkFMSURfQ0hBTk5FTF9JTkRFWDsKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworCisgICAgICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3QpCisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KTsKKyAgICAKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jaGFuTGlzdFNjYW5JblByb2dyZXNzID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbkluZGV4ID0gMDsKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jaGFuTGlzdFNjYW5JblByb2dyZXNzID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgfQorCisgICAgY3NyTmVpZ2hib3JSb2FtRnJlZVJvYW1hYmxlQlNTTGlzdChwTWFjLCAmcE5laWdoYm9yUm9hbUluZm8tPnJvYW1hYmxlQVBMaXN0KTsKKworICAgIHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JTY2FuVGltZXIpOworCisgICAgLyogQWJvcnQgYW55IG9uZ29pbmcgQkcgc2NhbnMgKi8KKyAgICBpZiAoZUFOSV9CT09MRUFOX1RSVUUgPT0gcE5laWdoYm9yUm9hbUluZm8tPnNjYW5Sc3BQZW5kaW5nKQorICAgICAgICBjc3JTY2FuQWJvcnRNYWNTY2FuKHBNYWMpOworCisgICAgcE5laWdoYm9yUm9hbUluZm8tPnNjYW5Sc3BQZW5kaW5nID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIAorICAgIC8qIFdlIGRvbnQgbmVlZCB0byBydW4gdGhpcyB0aW1lciBhbnkgbW9yZS4gKi8KKyAgICBwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUmVzdWx0c1JlZnJlc2hUaW1lcik7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIC8qIERvIG5vdCBmcmVlIHVwIHRoZSBwcmVhdXRoIGRvbmUgbGlzdCBoZXJlICovCisgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8uY3VycmVudE5laWdoYm9yUnB0UmV0cnlOdW0gPSAwOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm5laWdoYm9yUnB0UGVuZGluZyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5udW1QcmVBdXRoUmV0cmllcyA9IDA7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ubnVtQnNzRnJvbU5laWdoYm9yUmVwb3J0ID0gMDsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVhdXRoUnNwUGVuZGluZyA9IDA7CisgICAgdm9zX21lbV96ZXJvKHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm5laWdoYm9SZXBvcnRCc3NJbmZvLCBzaXplb2YodENzck5laWdoYm9yUmVwb3J0QnNzSW5mbykgKiBNQVhfQlNTX0lOX05FSUdIQk9SX1JQVCk7CisgICAgcGFsVGltZXJTdG9wKHBNYWMtPmhIZGQsIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhSc3BXYWl0VGltZXIpOworI2VuZGlmCisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtUmVzZXRJbml0U3RhdGVDb250cm9sSW5mbworCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIG5laWdoYm9yIHJvYW0gY29udHJvbCBpbmZvIGRhdGEgc3RydWN0dXJlcy4gCisgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBpbnZva2VkIHdoZW5ldmVyIHdlIG1vdmUgdG8gQ09OTkVDVEVEIHN0YXRlIGZyb20gCisgICAgICAgICAgICBJTklUIHN0YXRlCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgICBccmV0dXJuIFZPSUQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyTmVpZ2hib3JSb2FtUmVzZXRJbml0U3RhdGVDb250cm9sSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgIGNzck5laWdoYm9yUm9hbVJlc2V0Q29ubmVjdGVkU3RhdGVDb250cm9sSW5mbyhwTWFjKTsKKworICAgIC8qIEluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSByZXNldHMsIHdlIHNob3VsZCBjbGVhciBvZmYgdGhlIGN1ckFQQnNzSWQvU2Vzc2lvbiBJRCBpbiB0aGUgdGltZXJzICovCisgICAgcE5laWdoYm9yUm9hbUluZm8tPmNzclNlc3Npb25JZCAgICAgICAgICAgID0gICBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworICAgIHZvc19tZW1fc2V0KHBOZWlnaGJvclJvYW1JbmZvLT5jdXJyQVBic3NpZCwgc2l6ZW9mKHRDc3JCc3NpZCksIDApOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclNjYW5UaW1lckluZm8ucE1hYyA9IHBNYWM7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yU2NhblRpbWVySW5mby5zZXNzaW9uSWQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+aXMxMXJBc3NvYyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoUnNwV2FpdFRpbWVySW5mby5wTWFjID0gcE1hYzsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoUnNwV2FpdFRpbWVySW5mby5zZXNzaW9uSWQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworICAgIGNzck5laWdoYm9yUm9hbVB1cmdlUHJlYXV0aEZhaWxlZExpc3QocE1hYyk7CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgcE5laWdoYm9yUm9hbUluZm8tPmlzQ0NYQXNzb2MgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPmlzVk9BZG1pdHRlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+TWluUUJzc0xvYWRSZXF1aXJlZCA9IDA7CisjZW5kaWYKKyAgICAKKyAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzIsIEZMKCJEZXJlZ2lzdGVyaW5nIERPV04gZXZlbnQgcmVhc3NvYyBjYWxsYmFjayB3aXRoIFRMLiBSU1NJID0gJWQiKSwgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclJlYXNzb2NUaHJlc2hvbGQgKiAoLTEpKTsKKyAgICAvKiBEZXJlZ2lzdGVyIHJlYXNzb2MgY2FsbGJhY2suIElnbm9yZSByZXR1cm4gc3RhdHVzICovCisgICAgdm9zU3RhdHVzID0gV0xBTlRMX0RlcmVnUlNTSUluZGljYXRpb25DQihwTWFjLT5yb2FtLmdWb3NDb250ZXh0LCAodl9TN190KXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JSZWFzc29jVGhyZXNob2xkICogKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0hPX1RIUkVTSE9MRF9ET1dOLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtUmVhc3NvY0luZENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTU9EVUxFX0lEX1NNRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgeworICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgQ291bGRuJ3QgZGVyZWdpc3RlciBjc3JOZWlnaGJvclJvYW1SZWFzc29jSW5kQ2FsbGJhY2sgd2l0aCBUTDogU3RhdHVzID0gJWRcbiIpLCB2b3NTdGF0dXMpOworICAgIH0KKworICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwgRkwoIkRlcmVnaXN0ZXJpbmcgRE9XTiBldmVudCBuZWlnaGJvckxvb2t1cCBjYWxsYmFjayB3aXRoIFRMLiBSU1NJID0gJWQiKSwgcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnROZWlnaGJvckxvb2t1cFRocmVzaG9sZCAqICgtMSkpOworICAgIC8qIERlcmVnaXN0ZXIgbmVpZ2hib3IgbG9va3VwIGNhbGxiYWNrLiBJZ25vcmUgcmV0dXJuIHN0YXR1cyAqLworICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9EZXJlZ1JTU0lJbmRpY2F0aW9uQ0IocE1hYy0+cm9hbS5nVm9zQ29udGV4dCwgKHZfUzdfdClwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudE5laWdoYm9yTG9va3VwVGhyZXNob2xkICogKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0hPX1RIUkVTSE9MRF9ET1dOLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBET1dOQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NT0RVTEVfSURfU01FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICB7CisgICAgICAgIC8vZXJyIG1zZworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBDb3VsZG4ndCBkZXJlZ2lzdGVyIGNzck5laWdoYm9yUm9hbU5laWdoYm9yTG9va3VwRE9XTkNhbGxiYWNrIHdpdGggVEw6IFN0YXR1cyA9ICVkXG4iKSwgdm9zU3RhdHVzKTsKKyAgICB9CisKKyAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzIsIEZMKCJEZXJlZ2lzdGVyaW5nIFVQIGV2ZW50IG5laWdoYm9yIGxvb2t1cCBjYWxsYmFjayB3aXRoIFRMLiBSU1NJID0gJWQiKSwgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvckxvb2t1cFRocmVzaG9sZCAqICgtMSkpOworICAgIC8qIERlcmVnaXN0ZXIgcmVhc3NvYyBjYWxsYmFjay4gSWdub3JlIHJldHVybiBzdGF0dXMgKi8KKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsICh2X1M3X3QpcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvckxvb2t1cFRocmVzaG9sZCAqICgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9IT19USFJFU0hPTERfVVAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cFVQQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NT0RVTEVfSURfU01FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICB7CisgICAgICAgIC8vZXJyIG1zZworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBDb3VsZG4ndCBkZXJlZ2lzdGVyIGNzck5laWdoYm9yUm9hbVJlYXNzb2NJbmRDYWxsYmFjayB3aXRoIFRMOiBTdGF0dXMgPSAlZFxuIiksIHZvc1N0YXR1cyk7CisgICAgfQorICAgIAorICAgIC8qIFJlc2V0IGN1cnJlbnROZWlnaGJvckxvb2t1cFRocmVzaG9sZCBvbmx5IGFmdGVyIGRlcmVnaXN0ZXJpbmcgRE9XTiBldmVudCBmcm9tIFRMICovCisgICAgcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnRMb29rdXBJbmNyZW1lbnRNdWx0aXBsaWVyID0gMDsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudE5laWdoYm9yTG9va3VwVGhyZXNob2xkID0gcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvckxvb2t1cFRocmVzaG9sZDsKKworICAgIHJldHVybjsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1Cc3NJZFNjYW5GaWx0ZXIKKworICAgIFxicmllZiAgVGhpcyBBUEkgaXMgdXNlZCB0byBwcmVwYXJlIGEgZmlsdGVyIHRvIG9idGFpbiBzY2FuIHJlc3VsdHMgd2hlbiAKKyAgICAgICAgICAgIHdlIGNvbXBsZXRlIHRoZSBzY2FuIGluIHRoZSBSRVBPUlRfU0NBTiBzdGF0ZSBhZnRlciByZWNlaXZpbmcgYSAKKyAgICAgICAgICAgIHZhbGlkIG5laWdoYm9yIHJlcG9ydCBmcm9tIEFQLiBUaGlzIGZpbHRlciBpbmNsdWRlcyBCU1NJRHMgcmVjZWl2ZWQgZnJvbSAKKyAgICAgICAgICAgIHRoZSBuZWlnaGJvciByZXBvcnQgZnJvbSB0aGUgQVAgaW4gYWRkaXRpb24gdG8gdGhlIG90aGVyIGZpbHRlciBwYXJhbWV0ZXJzIAorICAgICAgICAgICAgY3JlYXRlZCBmcm9tIGNvbm5lY3RlZCBwcm9maWxlCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgICAgICAgICBwU2NhbkZpbHRlciAtIFNjYW4gZmlsdGVyIHRvIGJlIGZpbGxlZCBhbmQgcmV0dXJuZWQKKworICAgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNmdWwgZmlsdGVyIGNyZWF0aW9uLCBjb3JyZXNwb25kaW5nIGVycm9yIAorICAgICAgICAgICAgY29kZSBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBlSGFsU3RhdHVzIGNzck5laWdoYm9yUm9hbUJzc0lkU2NhbkZpbHRlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXIpCit7CisgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyAgICBwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm87CisgICAgdEFOSV9VOCBpID0gMDsKKworICAgIFZPU19BU1NFUlQocFNjYW5GaWx0ZXIgIT0gTlVMTCk7CisgICAgdm9zX21lbV96ZXJvKHBTY2FuRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKworICAgIHBTY2FuRmlsdGVyLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5udW1Cc3NGcm9tTmVpZ2hib3JSZXBvcnQ7CisgICAgcFNjYW5GaWx0ZXItPkJTU0lEcy5ic3NpZCA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0U2lyTWFjQWRkcikgKiBwU2NhbkZpbHRlci0+QlNTSURzLm51bU9mQlNTSURzKTsKKyAgICBpZiAoTlVMTCA9PSBwU2NhbkZpbHRlci0+QlNTSURzLmJzc2lkKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJTY2FuIEZpbHRlciBCU1NJRCBtZW0gYWxsb2MgZmFpbGVkIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTEVEX0FMTE9DOworICAgIH0KKworICAgIHZvc19tZW1femVybyhwU2NhbkZpbHRlci0+QlNTSURzLmJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpICogcFNjYW5GaWx0ZXItPkJTU0lEcy5udW1PZkJTU0lEcyk7CisKKyAgICAvKiBQb3B1bGF0ZSB0aGUgQlNTSUQgZnJvbSBOZWlnaGJvciBCU1MgaW5mbyByZWNlaXZlZCBmcm9tIG5laWdoYm9yIHJlcG9ydCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBwU2NhbkZpbHRlci0+QlNTSURzLm51bU9mQlNTSURzOyBpKyspCisgICAgeworICAgICAgICB2b3NfbWVtX2NvcHkoJnBTY2FuRmlsdGVyLT5CU1NJRHMuYnNzaWRbaV0sIAorICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm5laWdoYm9SZXBvcnRCc3NJbmZvW2ldLm5laWdoYm9yQnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIH0KKworICAgIC8qIEZpbGwgb3RoZXIgZ2VuZXJhbCBzY2FuIGZpbHRlciBwYXJhbXMgKi8KKyAgICByZXR1cm4gY3NyTmVpZ2hib3JSb2FtUHJlcGFyZVNjYW5Qcm9maWxlRmlsdGVyKHBNYWMsIHBTY2FuRmlsdGVyKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtUHVyZ2VQcmVhdXRoRmFpbExpc3QKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBlbXB0aWVzIHRoZSBwcmVhdXRoIGZhaWwgbGlzdAorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBWT0lECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNzck5laWdoYm9yUm9hbVB1cmdlUHJlYXV0aEZhaWxMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyAgICBwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm87CisKKyAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsIEZMKCJQdXJnaW5nIHRoZSBwcmVhdXRoIGZhaWwgbGlzdCIpKTsKKyAgICB3aGlsZSAocE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0Lm51bU1BQ0FkZHJlc3MpCisgICAgeworICAgICAgICB2b3NfbWVtX3plcm8ocE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0Lm1hY0FkZHJlc3NbcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0Lm51bU1BQ0FkZHJlc3MtMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0Lm51bU1BQ0FkZHJlc3MtLTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1BZGRCc3NJZFRvUHJlYXV0aEZhaWxMaXN0CisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gYWRkcyB0aGUgZ2l2ZW4gQlNTSUQgdG8gdGhlIFByZWF1dGggZmFpbCBsaXN0CisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgICAgICAgICBic3NJZCAtIEJTU0lEIHRvIGJlIGFkZGVkIHRvIHRoZSBwcmVhdXRoIGZhaWwgbGlzdAorCisgICAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVIQUxfU1RBVFVTX0ZBSUxVUkUgb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzck5laWdoYm9yUm9hbUFkZEJzc0lkVG9QcmVhdXRoRmFpbExpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY0FkZHIgYnNzSWQpCit7CisgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyAgICBwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm87CisKKyAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsIEZMKCIgQWRkZWQgQlNTSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggdG8gUHJlYXV0aCBmYWlsZWQgbGlzdFxuIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgYnNzSWRbMF0sIGJzc0lkWzFdLCBic3NJZFsyXSwgYnNzSWRbM10sIGJzc0lkWzRdLCBic3NJZFs1XSk7CisKKworICAgIGlmICgocE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0Lm51bU1BQ0FkZHJlc3MgKyAxKSA+CisgICAgICAgICAgICBNQVhfTlVNX1BSRUFVVEhfRkFJTF9MSVNUX0FERFJFU1MpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlByZWF1dGggZmFpbCBsaXN0IGFscmVhZHkgZnVsbC4uIENhbm5vdCBhZGQgbmV3IG9uZSIpKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorICAgIHZvc19tZW1fY29weShwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRmFpbExpc3QubWFjQWRkcmVzc1twTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRmFpbExpc3QubnVtTUFDQWRkcmVzc10sCisgICAgICAgICAgICAgICAgICAgICAgICBic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0Lm51bU1BQ0FkZHJlc3MrKzsKKyAgICAKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtSXNQcmVhdXRoQ2FuZGlkYXRlCisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIE1BQyBhZGRyZXNzIGlzIGFscmVhZHkgCisgICAgICAgICAgICBwcmVzZW50IGluIHRoZSBwcmVhdXRoIGZhaWwgbGlzdCBhbmQgcmV0dXJucyBUUlVFL0ZBTFNFIGFjY29yZGluZ2x5CisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgICBccmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFIGlmIHByZWF1dGggY2FuZGlkYXRlLCBlQU5JX0JPT0xFQU5fRkFMU0Ugb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0QU5JX0JPT0xFQU4gY3NyTmVpZ2hib3JSb2FtSXNQcmVhdXRoQ2FuZGlkYXRlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNBZGRyIGJzc0lkKQoreworICAgIHRBTklfVTggaSA9IDA7CisgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyAgICBwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm87CisKKyAgICBpZiAoMCA9PSBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRmFpbExpc3QubnVtTUFDQWRkcmVzcykKKyAgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRmFpbExpc3QubnVtTUFDQWRkcmVzczsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKFZPU19UUlVFID09IHZvc19tZW1fY29tcGFyZShwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRmFpbExpc3QubWFjQWRkcmVzc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiQlNTSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggYWxyZWFkeSBwcmVzZW50IGluIHByZWF1dGggZmFpbCBsaXN0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NJZFswXSwgYnNzSWRbMV0sIGJzc0lkWzJdLCBic3NJZFszXSwgYnNzSWRbNF0sIGJzc0lkWzVdKTsKKyAgICAgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbUlzc3VlUHJlYXV0aFJlcQorCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGlzc3VlcyBwcmVhdXRoIHJlcXVlc3QgdG8gUEUgd2l0aCB0aGUgMXN0IEFQIGVudHJ5IGluIHRoZSAKKyAgICAgICAgICAgIHJvYW1hYmxlIEFQIGxpc3QKKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICAgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlSEFMX1NUQVRVU19GQUlMVVJFIG90aGVyd2lzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGVIYWxTdGF0dXMgY3NyTmVpZ2hib3JSb2FtSXNzdWVQcmVhdXRoUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyAgICBwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm87CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQlNTSW5mbyAgICBwTmVpZ2hib3JCc3NOb2RlOworICAgIAorICAgIC8qIFRoaXMgbXVzdCBub3QgYmUgdHJ1ZSBoZXJlICovCisgICAgVk9TX0FTU0VSVChwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVhdXRoUnNwUGVuZGluZyA9PSBlQU5JX0JPT0xFQU5fRkFMU0UpOworCisgICAgLyogSXNzdWUgUHJlYXV0aCByZXF1ZXN0IHRvIFBFIGhlcmUgKi8KKyAgICAvKiBOZWVkIHRvIGlzc3VlIHRoZSBwcmVhdXRoIHJlcXVlc3Qgd2l0aCB0aGUgQlNTSUQgdGhhdCBpcyB0aGVyZSBpbiB0aGUgaGVhZCBvZiB0aGUgcm9hbWFibGUgQVAgbGlzdCAqLworICAgIC8qIFBhcmFtZXRlcnMgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGFyZSBCU1NJRCwgQ2hhbm5lbCBudW1iZXIgYW5kIHRoZSBuZWlnaGJvclNjYW5QZXJpb2QocHJvYmFibHkpICovCisgICAgLyogSWYgcm9hbWFibGVBUExpc3QgZ2V0cyBlbXB0eSwgc2hvdWxkIHRyYW5zaXRpb24gdG8gUkVQT1JUX1NDQU4gc3RhdGUgKi8KKyAgICBwTmVpZ2hib3JCc3NOb2RlID0gY3NyTmVpZ2hib3JSb2FtR2V0Um9hbWFibGVBUExpc3ROZXh0RW50cnkocE1hYywgJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtYWJsZUFQTGlzdCwgTlVMTCk7CisKKyAgICBpZiAoTlVMTCA9PSBwTmVpZ2hib3JCc3NOb2RlKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsIEZMKCJSb2FtYWJsZSBBUCBsaXN0IGlzIGVtcHR5Li4gIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlRlRQcmVhdXRoUmVxKHBNYWMsIHBOZWlnaGJvclJvYW1JbmZvLT5jc3JTZXNzaW9uSWQsIHBOZWlnaGJvckJzc05vZGUtPnBCc3NEZXNjcmlwdGlvbik7IAorICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiU2VuZCBQcmVhdXRoIHJlcXVlc3QgdG8gUEUgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iKSwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlYXV0aFJzcFBlbmRpbmcgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKworICAgIC8qIEluY3JlbWVudCB0aGUgcHJlYXV0aCByZXRyeSBjb3VudCAqLworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm51bVByZUF1dGhSZXRyaWVzKys7CisgICAgCisgICAgLyogVHJhbnNpdGlvbiB0aGUgc3RhdGUgdG8gcHJlYXV0aGVudGljYXRpbmcgKi8KKyAgICBDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9QUkVBVVRIRU5USUNBVElORykKKyAgICAKKyAgICAvKiBTdGFydCB0aGUgcHJlYXV0aCByc3AgdGltZXIgKi8KKyAgICBzdGF0dXMgPSBwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhSc3BXYWl0VGltZXIsIAorICAgICAgICAgICAgICAgICAgIENTUl9ORUlHSEJPUl9ST0FNX1BSRUFVVEhfUlNQX1dBSVRfTVVMVElQTElFUiAqIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JTY2FuUGVyaW9kICogUEFMX1RJTUVSX1RPX01TX1VOSVQsCisgICAgICAgICAgICAgICAgICAgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlByZWF1dGggcmVzcG9uc2Ugd2FpdCB0aW1lciBzdGFydCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIpLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbVByZWF1dGhSc3BIYW5kbGVyCisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlIHRoZSBQcmVhdXRoIHJlc3BvbnNlIGZyb20gUEUKKyAgICAgICAgICAgIEV2ZXJ5IHByZWF1dGggaXMgYWxsb3dlZCBtYXggMyB0cmllcyBpZiBpdCBmYWlscy4gSWYgYSBic3NpZCBmYWlsZWQgCisgICAgICAgICAgICBmb3IgbW9yZSB0aGFuIE1BWF9UUklFUywgd2Ugd2lsbCByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCBhbmQgdHJ5IAorICAgICAgICAgICAgd2l0aCB0aGUgbmV4dCBub2RlIGluIHRoZSByb2FtYWJsZSBBUCBsaXN0IGFuZCBhZGQgdGhlIEJTU0lEIHRvIHByZS1hdXRoIGZhaWxlZCAKKyAgICAgICAgICAgIGxpc3QuIElmIG5vIG1vcmUgZW50cmllcyBwcmVzZW50IGluIAorICAgICAgICAgICAgcm9hbWFibGUgQVAgbGlzdCwgdHJhbnNpdGlvbiB0byBSRVBPUlRfU0NBTiBzdGF0ZQorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgICAgICAgICAgdm9zU3RhdHVzIC0gVk9TX1NUQVRVU19TVUNDRVNTL0ZBSUxVUkUvVElNRU9VVCBzdGF0dXMgZnJvbSBQRQorCisgICAgXHJldHVybiBWT0lECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNzck5laWdoYm9yUm9hbVByZWF1dGhSc3BIYW5kbGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIFZPU19TVEFUVVMgdm9zU3RhdHVzKQoreworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIGVIYWxTdGF0dXMgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdHBDc3JOZWlnaGJvclJvYW1CU1NJbmZvIHBQcmVhdXRoUnNwTm9kZSA9IE5VTEw7CisKKyAgICAvLyBXZSBjYW4gcmVjZWl2ZSBpdCBpbiB0aGVzZSAyIHN0YXRlcy4KKyAgICBWT1NfQVNTRVJUKChwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUgPT0gZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1BSRUFVVEhFTlRJQ0FUSU5HKSB8fAorICAgICAgICAocE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlID09IGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRVBPUlRfU0NBTikpOworCisgICAgaWYgKChwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUgIT0gZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1BSRUFVVEhFTlRJQ0FUSU5HKSAmJgorICAgICAgICAocE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlICE9IGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRVBPUlRfU0NBTikpCisgICAgeworICAgICAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR1csIEZMKCJQcmVhdXRoIHJlc3BvbnNlIHJlY2VpdmVkIGluIHN0YXRlICVcbiIpLCAKKyAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSk7CisgICAgfQorCisgICAgaWYgKFZPU19TVEFUVVNfRV9USU1FT1VUICE9IHZvc1N0YXR1cykKKyAgICB7CisgICAgICAgIC8qIFRoaXMgbWVhbnMgd2UgZ290IHRoZSByZXNwb25zZSBmcm9tIFBFLiBIZW5jZSBzdG9wIHRoZSB0aW1lciAqLworICAgICAgICBzdGF0dXMgPSBwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlQXV0aFJzcFdhaXRUaW1lcik7CisgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLnByZWF1dGhSc3BQZW5kaW5nID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIH0KKworICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzKQorICAgIHsKKyAgICAgICAgcFByZWF1dGhSc3BOb2RlID0gY3NyTmVpZ2hib3JSb2FtR2V0Um9hbWFibGVBUExpc3ROZXh0RW50cnkocE1hYywgJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtYWJsZUFQTGlzdCwgTlVMTCk7CisgICAgfQorICAgIGlmICgoVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cykgJiYgKE5VTEwgIT0gcFByZWF1dGhSc3BOb2RlKSkKKyAgICB7CisgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HRSwgRkwoIlByZWF1dGggY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhZnRlciAlZCB0cmllc1xuIiksIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm51bVByZUF1dGhSZXRyaWVzKTsKKworICAgICAgICAvKiBQcmVhdXRoIGNvbXBldGVyIHN1Y2Nlc3NmdWxseS4gSW5zZXJ0IHRoZSBwcmVhdXRoZW50aWNhdGVkIG5vZGUgdG8gdGFpbCBvZiBwcmVBdXRoRG9uZUxpc3QgKi8KKyAgICAgICAgY3NyTmVpZ2hib3JSb2FtUmVtb3ZlUm9hbWFibGVBUExpc3RFbnRyeShwTWFjLCAmcE5laWdoYm9yUm9hbUluZm8tPnJvYW1hYmxlQVBMaXN0LCBwUHJlYXV0aFJzcE5vZGUpOworICAgICAgICBjc3JMTEluc2VydFRhaWwoJnBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhEb25lTGlzdCwgJnBQcmVhdXRoUnNwTm9kZS0+TGlzdCwgTExfQUNDRVNTX0xPQ0spOworCisgICAgICAgIC8qIFByZS1hdXRoIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIFRyYW5zaXRpb24gdG8gUFJFQVVUSCBEb25lIHN0YXRlICovCisgICAgICAgIENTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04oZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1BSRUFVVEhfRE9ORSkKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ubnVtUHJlQXV0aFJldHJpZXMgPSAwOworCisgICAgICAgIC8qIFRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiB3b3VsZCBzdGFydCBhIHRpbWVyIGFuZCBieSB0aGUgdGltZSBpdCBleHBpcmVzLCBzdXBwbGljYW50IHNob3VsZCAKKyAgICAgICAgICAgaGF2ZSBwcm92aWRlZCB0aGUgdXBkYXRlZCBGVElFcyB0byBTTUUuIFNvLCB3aGVuIGl0IGV4cGlyZXMsIGhhbmRvZmYgd2lsbCBiZSB0cmlnZ2VyZWQgdGhlbiAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0cENzck5laWdoYm9yUm9hbUJTU0luZm8gICAgcE5laWdoYm9yQnNzTm9kZSA9IE5VTEw7CisgICAgICAgIHRMaXN0RWxlbSAgICAgICAgICAgICAgICAgICAqcEVudHJ5OworCisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiUHJlYXV0aCBmYWlsZWQgcmV0cnkgbnVtYmVyICVkLCBzdGF0dXMgPSAlZFxuIiksIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm51bVByZUF1dGhSZXRyaWVzLCB2b3NTdGF0dXMpOworICAgICAgICAKKyAgICAgICAgLyogUHJlYXV0aCBmYWlsZWQuIEFkZCB0aGUgYnNzSWQgdG8gdGhlIHByZUF1dGggZmFpbGVkIGxpc3QgTUFDIEFkZHJlc3MuIEFsc28gcmVtb3ZlIHRoZSBBUCBmcm9tIHJvYW1hYmxlIEFQIGxpc3QgKi8KKyAgICAgICAgaWYgKHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm51bVByZUF1dGhSZXRyaWVzID49ICBDU1JfTkVJR0hCT1JfUk9BTV9NQVhfTlVNX1BSRUFVVEhfUkVUUklFUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2UgYXJlIGdvaW5nIHRvIHJlbW92ZSB0aGUgbm9kZSBhcyBpdCBmYWlscyBmb3IgbW9yZSB0aGFuIE1BWCB0cmllcy4gUmVzZXQgdGhpcyBjb3VudCB0byAwICovCisgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5udW1QcmVBdXRoUmV0cmllcyA9IDA7CisKKyAgICAgICAgICAgIC8qIFRoZSBvbmUgaW4gdGhlIGhlYWQgb2YgdGhlIGxpc3Qgc2hvdWxkIGJlIG9uZSB3aXRoIHdoaWNoIHdlIGlzc3VlZCBwcmUtYXV0aCBhbmQgZmFpbGVkICovCisgICAgICAgICAgICBwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtYWJsZUFQTGlzdCwgTExfQUNDRVNTX0xPQ0spOworICAgICAgICAgICAgaWYocEVudHJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBOZWlnaGJvckJzc05vZGUgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdENzck5laWdoYm9yUm9hbUJTU0luZm8sIExpc3QpOworICAgICAgICAgICAgLyogQWRkIHRoZSBCU1NJRCB0byBwcmUtYXV0aCBmYWlsIGxpc3QgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IGNzck5laWdoYm9yUm9hbUFkZEJzc0lkVG9QcmVhdXRoRmFpbExpc3QocE1hYywgcE5laWdoYm9yQnNzTm9kZS0+cEJzc0Rlc2NyaXB0aW9uLT5ic3NJZCk7CisgICAgICAgICAgICAvKiBOb3cgd2UgY2FuIGZyZWUgdGhpcyBub2RlICovCisgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1GcmVlTmVpZ2hib3JSb2FtQlNTTm9kZShwTWFjLCBwTmVpZ2hib3JCc3NOb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElzc3VlIHByZWF1dGggcmVxdWVzdCBmb3IgdGhlIHNhbWUvbmV4dCBlbnRyeSAqLworICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBjc3JOZWlnaGJvclJvYW1Jc3N1ZVByZWF1dGhSZXEocE1hYykpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfVFJBTlNJVElPTihlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVQT1JUX1NDQU4pCisKKyAgICAgICAgLyogU3RhcnQgdGhlIG5laWdoYm9yIHJlc3VsdHMgcmVmcmVzaCB0aW1lciBhbmQgdHJhbnNpdGlvbiB0byBSRVBPUlRfU0NBTiBzdGF0ZSB0byBwZXJmb3JtIHNjYW4gYWdhaW4gKi8KKyAgICAgICAgc3RhdHVzID0gcGFsVGltZXJTdGFydChwTWFjLT5oSGRkLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSZXN1bHRzUmVmcmVzaFRpbWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JSZXN1bHRzUmVmcmVzaFBlcmlvZCAqIFBBTF9USU1FUl9UT19NU19VTklULCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJOZWlnaGJvciByZXN1bHRzIHJlZnJlc2ggdGltZXIgc3RhcnQgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iKSwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAgLyogV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtUHJlcGFyZVNjYW5Qcm9maWxlRmlsdGVyCisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHNjYW4gZmlsdGVyIGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIHByb2ZpbGUuCisgICAgICAgICAgICBCYXNlZCBvbiB0aGlzIGZpbHRlciwgc2NhbiByZXN1bHRzIGFyZSBvYnRhaW5lZAorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgICAgICAgICAgcFNjYW5GaWx0ZXIgLSBQb3B1bGF0ZWQgc2NhbiBmaWx0ZXIgYmFzZWQgb24gdGhlIGNvbm5lY3RlZCBwcm9maWxlCisKKyAgICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgZUhBTF9TVEFUVVNfRkFJTFVSRSBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyTmVpZ2hib3JSb2FtUHJlcGFyZVNjYW5Qcm9maWxlRmlsdGVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JTY2FuUmVzdWx0RmlsdGVyICpwU2NhbkZpbHRlcikKK3sKKyAgICB0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvICAgIHBOZWlnaGJvclJvYW1JbmZvID0gJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mbzsKKyAgICB0QU5JX1U4IHNlc3Npb25JZCAgID0gKHRBTklfVTgpcE5laWdoYm9yUm9hbUluZm8tPmNzclNlc3Npb25JZDsKKyAgICB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBDdXJQcm9maWxlID0gJnBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0ZWRQcm9maWxlOworICAgIHRBTklfVTggaSA9IDA7CisgICAgCisgICAgVk9TX0FTU0VSVChwU2NhbkZpbHRlciAhPSBOVUxMKTsKKworICAgIHZvc19tZW1femVybyhwU2NhbkZpbHRlciwgc2l6ZW9mKHRDc3JTY2FuUmVzdWx0RmlsdGVyKSk7CisKKyAgICAvKiBXZSBkb250IHdhbnQgdG8gc2V0IEJTU0lEIGJhc2VkIEZpbHRlciAqLworICAgIHBTY2FuRmlsdGVyLT5CU1NJRHMubnVtT2ZCU1NJRHMgPSAwOworCisgICAgLyogUG9wdWxhdGUgYWxsIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb25uZWN0ZWQgcHJvZmlsZSAqLworICAgIHBTY2FuRmlsdGVyLT5TU0lEcy5udW1PZlNTSURzID0gMTsgIAorICAgIHBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdCA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0Q3NyU1NJREluZm8pKTsKKyAgICBpZiAoTlVMTCA9PSBwU2NhbkZpbHRlci0+U1NJRHMuU1NJRExpc3QpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlNjYW4gRmlsdGVyIFNTSUQgbWVtIGFsbG9jIGZhaWxlZCIpKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQzsKKyAgICB9CisgICAgcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0LT5oYW5kb2ZmUGVybWl0dGVkID0gMTsKKyAgICBwU2NhbkZpbHRlci0+U1NJRHMuU1NJRExpc3QtPnNzaWRIaWRkZW4gPSAwOworICAgIHBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5sZW5ndGggPSAgcEN1clByb2ZpbGUtPlNTSUQubGVuZ3RoOworICAgIHZvc19tZW1fY29weSgodm9pZCAqKXBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5zc0lkLCAodm9pZCAqKXBDdXJQcm9maWxlLT5TU0lELnNzSWQsIHBDdXJQcm9maWxlLT5TU0lELmxlbmd0aCk7IAorCisgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiRmlsdGVyaW5nIGZvciBTU0lEICVzIGZyb20gc2NhbiByZXN1bHRzLi4gU1NJRCBMZW5ndGggPSAlZFxuIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0LT5TU0lELnNzSWQsIHBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdC0+U1NJRC5sZW5ndGgpOworICAgIHBTY2FuRmlsdGVyLT5hdXRoVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICBwU2NhbkZpbHRlci0+YXV0aFR5cGUuYXV0aFR5cGVbMF0gPSBwQ3VyUHJvZmlsZS0+QXV0aFR5cGU7CisKKyAgICBwU2NhbkZpbHRlci0+RW5jcnlwdGlvblR5cGUubnVtRW50cmllcyA9IDE7IC8vVGhpcyBtdXN0IGJlIDEKKyAgICBwU2NhbkZpbHRlci0+RW5jcnlwdGlvblR5cGUuZW5jcnlwdGlvblR5cGVbMF0gPSBwQ3VyUHJvZmlsZS0+RW5jcnlwdGlvblR5cGU7CisKKyAgICBwU2NhbkZpbHRlci0+bWNFbmNyeXB0aW9uVHlwZS5udW1FbnRyaWVzID0gMTsKKyAgICBwU2NhbkZpbHRlci0+bWNFbmNyeXB0aW9uVHlwZS5lbmNyeXB0aW9uVHlwZVswXSA9IHBDdXJQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlOworCisgICAgcFNjYW5GaWx0ZXItPkJTU1R5cGUgPSBwQ3VyUHJvZmlsZS0+QlNTVHlwZTsKKworICAgIC8qIFdlIGFyZSBpbnRyZXN0ZWQgb25seSBpbiB0aGUgc2NhbiByZXN1bHRzIG9uIGNoYW5uZWxzIHRoYXQgd2Ugc2Nhbm5lZCAgKi8KKyAgICBwU2NhbkZpbHRlci0+Q2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5udW1PZkNoYW5uZWxzOworICAgIHBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IHZvc19tZW1fbWFsbG9jKHBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzICogc2l6ZW9mKHRBTklfVTgpKTsKKyAgICBpZiAoTlVMTCA9PSBwU2NhbkZpbHRlci0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlNjYW4gRmlsdGVyIENoYW5uZWwgbGlzdCBtZW0gYWxsb2MgZmFpbGVkIikpOworICAgICAgICB2b3NfbWVtX2ZyZWUocFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0KTsKKyAgICAgICAgcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQzsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzOyBpKyspCisgICAgeworICAgICAgICBwU2NhbkZpbHRlci0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaV0gPSBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3RbaV07CisgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBpZiAocE5laWdoYm9yUm9hbUluZm8tPmlzMTFyQXNzb2MpCisgICAgeworICAgICAgICAvKiBNRElFIHNob3VsZCBiZSBhZGRlZCBhcyBhIHBhcnQgb2YgcHJvZmlsZS4gVGhpcyBzaG91bGQgYmUgYWRkZWQgYXMgYSBwYXJ0IG9mIGZpbHRlciBhcyB3ZWxsICAqLworICAgICAgICBwU2NhbkZpbHRlci0+TURJRC5tZGllUHJlc2VudCA9IHBDdXJQcm9maWxlLT5NRElELm1kaWVQcmVzZW50OworICAgICAgICBwU2NhbkZpbHRlci0+TURJRC5tb2JpbGl0eURvbWFpbiA9IHBDdXJQcm9maWxlLT5NRElELm1vYmlsaXR5RG9tYWluOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbVByb2Nlc3NTY2FuUmVzdWx0cworCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHNjYW4gcmVzdWx0cywgc29ydHMgb24gdGhlIGJhc2lzIG9mIG5laWdoYm9yIHNjb3JlKHRvZG8pLiAKKyAgICAgICAgICAgIEFzc3VtZWQgdGhhdCB0aGUgcmVzdWx0cyBhcmUgYWxyZWFkeSBzb3J0ZWQgYnkgUlNTSSBieSBjc3JTY2FuR2V0UmVzdWx0CisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgICAgICAgICBwU2NhblJlc3VsdExpc3QgLSBTY2FuIHJlc3VsdCByZXN1bHQgb2J0YWluZWQgZnJvbSBjc3JTY2FuR2V0UmVzdWx0KCkKKworICAgIFxyZXR1cm4gVk9JRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBjc3JOZWlnaGJvclJvYW1Qcm9jZXNzU2NhblJlc3VsdHModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNjYW5SZXN1bHRIYW5kbGUgKnBTY2FuUmVzdWx0TGlzdCkKK3sKKyAgICB0Q3NyU2NhblJlc3VsdEluZm8gKnBTY2FuUmVzdWx0OworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQlNTSW5mbyAgICBwQnNzSW5mbzsKKworICAgIC8qIEV4cGVjdGluZyB0aGUgc2NhbiByZXN1bHQgYWxyZWFkeSB0byBiZSBpbiB0aGUgc29ydGVkIG9yZGVyIGJhc2VkIG9uIHRoZSBSU1NJICovCisgICAgLyogQmFzZWQgb24gdGhlIHByZXZpb3VzIHN0YXRlIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgbGlzdCBzaG91bGQgYmUgc29ydGVkIGFnYWluIHRha2luZyBuZWlnaGJvciBzY29yZSBpbnRvIGNvbnNpZGVyYXRpb24gKi8KKyAgICAvKiBJZiBwcmV2aW91cyBzdGF0ZSBpcyBDRkdfQ0hBTl9MSVNUX1NDQU4sIHRoZXJlIHNob3VsZCBub3QgYmUgYW55IG5laWdoYm9yIHNjb3JlIGFzc29jaWF0ZWQgd2l0aCBhbnkgb2YgdGhlIEJTUy4KKyAgICAgICBJZiB0aGUgcHJldmlvdXMgc3RhdGUgaXMgUkVQT1JUX1FVRVJZLCB0aGVuIHRoZXJlIHdpbGwgYmUgbmVpZ2hib3Igc2NvcmUgZm9yIGVhY2ggb2YgdGhlIEFQcyAqLworICAgIC8qIEZvciBub3csIGxldCB1cyB0YWtlIHRoZSB0b3Agb2YgdGhlIGxpc3QgcHJvdmlkZWQgYXMgaXQgaXMgYnkgdGhlIENTUiBTY2FuIHJlc3VsdCBBUEkuIFRoaXMgbWVhbnMgaXQgaXMgYXNzdW1lZCB0aGF0IG5laWdoYm9yIHNjb3JlIAorICAgICAgIGFuZCByc3NpIHNjb3JlIGFyZSBpbiB0aGUgc2FtZSBvcmRlci4gVGhpcyB3aWxsIGJlIHRha2VuIGNhcmUgbGF0ZXIgKi8KKworICAgIHdoaWxlIChOVUxMICE9IChwU2NhblJlc3VsdCA9IGNzclNjYW5SZXN1bHRHZXROZXh0KHBNYWMsICpwU2NhblJlc3VsdExpc3QpKSkKKyAgICB7CisgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HRSwgRkwoIlNjYW4gcmVzdWx0OiBCU1NJRCA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiksIAorICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5ic3NJZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmJzc0lkWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWRbM10sCisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5ic3NJZFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmJzc0lkWzVdKTsKKworICAgICAgICBpZiAoVk9TX1RSVUUgPT0gdm9zX21lbV9jb21wYXJlKHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmJzc0lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPmN1cnJBUGJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9jdXJyZW50bHkgYXNzb2NpYXRlZCBBUC4gRG8gbm90IGhhdmUgdGhpcyBpbiB0aGUgcm9hbWFibGUgQVAgbGlzdAorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWJzKHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JSZWFzc29jVGhyZXNob2xkKSA8IGFicyhwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5yc3NpKSkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFIChWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAiJXM6IFtJTkZPTE9HXUN1cnJlbnQgcmVhc3NvYyB0aHJlc2hvbGQgJWQgbmV3IGFwIHJzc2kgd29yc2U9JWRcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclJlYXNzb2NUaHJlc2hvbGQgKiAoLTEpLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IucnNzaSAqICgtMSkgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9ICAgICAgICAKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+aXMxMXJBc3NvYykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjc3JOZWlnaGJvclJvYW1Jc1ByZWF1dGhDYW5kaWRhdGUocE1hYywgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQlNTSUQgcHJlc2VudCBpbiBwcmUtYXV0aCBmYWlsIGxpc3QuLiBJZ25vcmluZyIpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+aXNDQ1hBc3NvYykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjc3JOZWlnaGJvclJvYW1Jc1ByZWF1dGhDYW5kaWRhdGUocE1hYywgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQlNTSUQgcHJlc2VudCBpbiBwcmUtYXV0aCBmYWlsIGxpc3QuLiBJZ25vcmluZyIpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLlFCU1NMb2FkX3ByZXNlbnQpICYmCisgICAgICAgICAgICAgKHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLlFCU1NMb2FkX2F2YWlsKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBOZWlnaGJvclJvYW1JbmZvLT5pc1ZPQWRtaXR0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsIEZMKCJOZXcgQVAgaGFzICV4IEJXIGF2YWlsYWJsZVxuIiksICh1bnNpZ25lZCBpbnQpcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuUUJTU0xvYWRfYXZhaWwpOworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgiV2UgbmVlZCAleCBCVyBhdmFpbGFibGVcbiIpLCh1bnNpZ25lZCBpbnQpcE5laWdoYm9yUm9hbUluZm8tPk1pblFCc3NMb2FkUmVxdWlyZWQpOworICAgICAgICAgICAgICAgIGlmIChwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5RQlNTTG9hZF9hdmFpbCA8IHBOZWlnaGJvclJvYW1JbmZvLT5NaW5RQnNzTG9hZFJlcXVpcmVkKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSAoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJbSU5GT0xPR11CU1NJRCA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IGhhcyBubyBiYW5kd2lkdGggaWdub3JpbmcuLm5vdCBhZGRpbmcgdG8gcm9hbSBsaXN0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5ic3NJZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmJzc0lkWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWRbM10sCisgICAgICAgICAgICAgICAgICAgICAgICBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5ic3NJZFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmJzc0lkWzVdKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJObyBRQnNzICV4ICV4XG4iKSwgKHVuc2lnbmVkIGludClwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5RQlNTTG9hZF9hdmFpbCwgKHVuc2lnbmVkIGludClwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5RQlNTTG9hZF9wcmVzZW50KTsKKyAgICAgICAgICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+aXNWT0FkbWl0dGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRSAoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICAgIltJTkZPTE9HXUJTU0lEIDogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggaGFzIG5vIFFCU1NMb2FkIElFLCBpZ25vcmluZy4ubm90IGFkZGluZyB0byByb2FtIGxpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmJzc0lkWzBdLAorICAgICAgICAgICAgICAgICAgICBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5ic3NJZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWRbMl0sCisgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmJzc0lkWzNdLAorICAgICAgICAgICAgICAgICAgICBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5ic3NJZFs0XSwKKyAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWRbNV0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NDWCAqLworCisgICAgICAgIC8qIElmIHRoZSByZWNlaXZlZCB0aW1lc3RhbXAgaW4gQlNTIGRlc2NyaXB0aW9uIGlzIGVhcmxpZXIgdGhhbiB0aGUgc2NhbiByZXF1ZXN0IHRpbWVzdGFtcCwgc2tpcCAKKyAgICAgICAgICogdGhpcyByZXN1bHQgKi8KKyAgICAgICAgaWYgKHBOZWlnaGJvclJvYW1JbmZvLT5zY2FuUmVxdWVzdFRpbWVTdGFtcCA+PSBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5uUmVjZWl2ZWRUaW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIklnbm9yaW5nIEJTUyBhcyBpdCBpcyBvbGRlciB0aGFuIHRoZSBzY2FuIHJlcXVlc3QgdGltZXN0YW1wIikpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBwQnNzSW5mbyA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0Q3NyTmVpZ2hib3JSb2FtQlNTSW5mbykpOworICAgICAgICBpZiAoTlVMTCA9PSBwQnNzSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgTmVpZ2hib3IgUm9hbSBCU1MgSW5mbyBmYWlsZWQuLiBKdXN0IGlnbm9yaW5nIikpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBwQnNzSW5mby0+cEJzc0Rlc2NyaXB0aW9uID0gdm9zX21lbV9tYWxsb2MocFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IubGVuZ3RoICsgc2l6ZW9mKHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmxlbmd0aCkpOworICAgICAgICBpZiAocEJzc0luZm8tPnBCc3NEZXNjcmlwdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkocEJzc0luZm8tPnBCc3NEZXNjcmlwdGlvbiwgJnBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLCAKKyAgICAgICAgICAgICAgICAgICAgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IubGVuZ3RoICsgc2l6ZW9mKHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmxlbmd0aCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgTmVpZ2hib3IgUm9hbSBCU1MgRGVzY3JpcHRvciBmYWlsZWQuLiBKdXN0IGlnbm9yaW5nIikpOworICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBCc3NJbmZvKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgcEJzc0luZm8tPmFwUHJlZmVyZW5jZVZhbCA9IDEwOyAvL3NvbWUgdmFsdWUgZm9yIG5vdy4gTmVlZCB0byBjYWxjdWxhdGUgdGhlIGFjdHVhbCBzY29yZSBiYXNlZCBvbiBSU1NJIGFuZCBuZWlnaGJvciBBUCBzY29yZQorCisgICAgICAgIC8qIEp1c3QgYWRkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYXMgaXQgaXMgYWxyZWFkeSBzb3J0ZWQgYnkgUlNTSSAqLworICAgICAgICBjc3JMTEluc2VydFRhaWwoJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtYWJsZUFQTGlzdCwgJnBCc3NJbmZvLT5MaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisgICAgfQorCisgICAgLyogTm93IHdlIGhhdmUgYWxsIHRoZSBzY2FuIHJlc3VsdHMgaW4gb3VyIGxvY2FsIGxpc3QuIEdvb2QgdGltZSB0byBmcmVlIHVwIHRoZSB0aGUgbGlzdCB3ZSBnb3QgYXMgYSBwYXJ0IG9mIGNzckdldFNjYW5SZXN1bHQgKi8KKyAgICBjc3JTY2FuUmVzdWx0UHVyZ2UocE1hYywgKnBTY2FuUmVzdWx0TGlzdCk7CisKKyAgICByZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbUhhbmRsZUVtcHR5U2NhblJlc3VsdAorCisgICAgXGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgaW4gQ0ZHX0NIQU5fTElTVF9TQ0FOIHN0YXRlIHdoZW4gCisgICAgICAgICAgICAgICAgdGhlcmUgYXJlIG5vIHZhbGlkIEFQcyBpbiB0aGUgc2NhbiByZXN1bHQgZm9yIHJvYW1pbmcuIFRoaXMgbWVhbnMgCisgICAgICAgICAgICAgICAgb3V0IEFQIGlzIHRoZSBiZXN0IGFuZCBubyBvdGhlciBBUCBpcyBhcm91bmQuIE5vIHBvaW50IGluIHNjYW5uaW5nIAorICAgICAgICAgICAgICAgIGFnYWluIGFuZCBhZ2Fpbi4gUGVyZm9ybWluZyB0aGUgZm9sbG93aW5nIGhlcmUuCisgICAgICAgICAgICAgICAgMS4gRGVyZWdpc3RlciB0aGUgcHJlLWF1dGggY2FsbGJhY2sgZnJvbSBUTAorICAgICAgICAgICAgICAgIDIuIFN0b3AgdGhlIG5laWdoYm9yIHNjYW4gdGltZXIKKyAgICAgICAgICAgICAgICAzLiBSZS1yZWdpc3RlciB0aGUgbmVpZ2hib3IgbG9va3VwIGNhbGxiYWNrIHdpdGggaW5jcmVhc2VkIHByZS1hdXRoIHRocmVzaG9sZAorICAgICAgICAgICAgICAgIDQuIFRyYW5zaXRpb24gdGhlIHN0YXRlIHRvIENPTk5FQ1RFRCBzdGF0ZQorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlIG90aGVyd2lzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIFZPU19TVEFUVVMgY3NyTmVpZ2hib3JSb2FtSGFuZGxlRW1wdHlTY2FuUmVzdWx0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIGVIYWxTdGF0dXMgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBTdG9wIHRoZSBuZWlnaGJvciBzY2FuIHRpbWVyIG5vdyAqLworICAgIHN0YXR1cyA9IHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JTY2FuVGltZXIpOworICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiIHBhbFRpbWVyU3RvcCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIpLCBzdGF0dXMpOworICAgIH0KKworICAgIC8qIEluY3JlYXNlIHRoZSBuZWlnaGJvciBsb29rdXAgdGhyZXNob2xkIGJ5IGEgY29uc3RhbnQgZmFjdG9yIG9yIDEgKi8KKyAgICBpZiAoKHBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50TmVpZ2hib3JMb29rdXBUaHJlc2hvbGQrMykgPCBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5laWdoYm9yUmVhc3NvY1RocmVzaG9sZCkKKyAgICB7CisgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50TmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgKz0gMzsKKyAgICB9CisKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgLyogQ2xlYXIgb2ZmIHRoZSBvbGQgbmVpZ2hib3IgcmVwb3J0IGRldGFpbHMgKi8KKyAgICB2b3NfbWVtX3plcm8oJnBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm5laWdoYm9SZXBvcnRCc3NJbmZvLCBzaXplb2YodENzck5laWdoYm9yUmVwb3J0QnNzSW5mbykgKiBNQVhfQlNTX0lOX05FSUdIQk9SX1JQVCk7CisjZW5kaWYKKworICAgIC8qIFJlc2V0IGFsbCB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBiZWZvcmUgdHJhbnNpdGlvbmluZyB0byB0aGUgQ09OTkVDVEVEIHN0YXRlICovCisgICAgY3NyTmVpZ2hib3JSb2FtUmVzZXRDb25uZWN0ZWRTdGF0ZUNvbnRyb2xJbmZvKHBNYWMpOworCisgICAgLyogVHJhbnNpdGlvbiB0byBDT05ORUNURUQgc3RhdGUgKi8KKyAgICBDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DT05ORUNURUQpCisgICAgLyogUmUtcmVnaXN0ZXIgTmVpZ2hib3IgTG9va3VwIHRocmVzaG9sZCBjYWxsYmFjayB3aXRoIFRMICovCisgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cyLCBGTCgiUmVnaXN0ZXJpbmcgRE9XTiBldmVudCBuZWlnaGJvciBsb29rdXAgY2FsbGJhY2sgd2l0aCBUTCBmb3IgUlNTSSA9ICVkIiksIHBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50TmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgKiAoLTEpKTsgCisgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlZ1JTU0lJbmRpY2F0aW9uQ0IocE1hYy0+cm9hbS5nVm9zQ29udGV4dCwgKHZfUzdfdClwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudE5laWdoYm9yTG9va3VwVGhyZXNob2xkICogKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9IT19USFJFU0hPTERfRE9XTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cERPV05DYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTU9EVUxFX0lEX1NNRSwgcE1hYyk7CisgICAgCisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgIHsKKyAgICAgICAvL2VyciBtc2cKKyAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBDb3VsZG4ndCByZS1yZWdpc3RlciBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cERPV05DYWxsYmFjayB3aXRoIFRMOiBTdGF0dXMgPSAlZFxuIiksIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiB2b3NTdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbVNjYW5SZXF1ZXN0Q2FsbGJhY2sKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCBpbiBjc3JTY2FuUmVxdWVzdCgpIHRvIAorICAgICAgICAgICAgaW5kaWNhdGUgdGhlIGNvbXBsZXRpb24gb2Ygc2Nhbi4gSWYgc2NhbiBpcyBjb21wbGV0ZWQgZm9yIGFsbCB0aGUgY2hhbm5lbHMgaW4gCisgICAgICAgICAgICB0aGUgY2hhbm5lbCBsaXN0LCB0aGlzIGZ1bmN0aW9uIGdldHMgdGhlIHNjYW4gcmVzdWx0IGFuZCBzdGFydHMgdGhlIHJlZnJlc2ggcmVzdWx0cworICAgICAgICAgICAgdGltZXIgdG8gYXZvaWQgaGF2aW5nIHN0YWxlIHJlc3VsdHMuIElmIHNjYW4gaXMgbm90IGNvbXBsZXRlZCBvbiBhbGwgdGhlIGNoYW5uZWxzLAorICAgICAgICAgICAgaXQgcmVzdGFydHMgdGhlIG5laWdoYm9yIHNjYW4gdGltZXIgd2hpY2ggb24gZXhwaXJ5IGlzc3VlcyBzY2FuIG9uIHRoZSBuZXh0IAorICAgICAgICAgICAgY2hhbm5lbAorCisgICAgXHBhcmFtICBoYWxIYW5kbGUgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgICAgICAgICBwQ29udGV4dCAtIG5vdCB1c2VkCisgICAgICAgICAgICBzY2FuSWQgLSBub3QgdXNlZAorICAgICAgICAgICAgc3RhdHVzIC0gbm90IHVzZWQKKworICAgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBjb3JyZXNwb25kaW5nIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgZUhhbFN0YXR1cyBjc3JOZWlnaGJvclJvYW1TY2FuUmVxdWVzdENhbGxiYWNrKHRIYWxIYW5kbGUgaGFsSGFuZGxlLCB2b2lkICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBzY2FuSWQsIGVDc3JTY2FuU3RhdHVzIHN0YXR1cykKK3sKKyAgICB0cEFuaVNpckdsb2JhbCAgICAgICAgICAgICAgICAgIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpIGhhbEhhbmRsZTsKKyAgICB0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvICAgIHBOZWlnaGJvclJvYW1JbmZvID0gJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mbzsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDaGFuSW5kZXg7CisgICAgdENzclNjYW5SZXN1bHRGaWx0ZXIgICAgc2NhbkZpbHRlcjsKKyAgICB0U2NhblJlc3VsdEhhbmRsZSAgICAgICBzY2FuUmVzdWx0OworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgIHRlbXBWYWwgPSAwOworCisgICAgcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLnNjYW5Sc3BQZW5kaW5nID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIAorICAgIC8qIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIHJlY2VpdmUgYSBVUCBldmVudCBmcm9tIFRMIGluIGFueSBvZiB0aGUgc2NhbiBzdGF0ZXMuIFNpbGVudGx5IGlnbm9yZSBpdCAqLworICAgIGlmIChlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ09OTkVDVEVEID09IHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiUmVjZWl2ZWQgaW4gQ09OTkVDVEVEIHN0YXRlLiBNdXN0IGJlIGJlY2F1c2UgYSBVUCBldmVudCBmcm9tIFRMIGFmdGVyIGlzc3Vpbmcgc2NhbiByZXF1ZXN0LiBJZ25vcmUgaXQiKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIC8qIC0xIGlzIGRvbmUgYmVjYXVzZSB0aGUgY2hhbkluZGV4IHdvdWxkIGhhdmUgZ290IGluY3JlbWVudGVkIGFmdGVyIGlzc3VpbmcgYSBzdWNjZXNzZnVsIHNjYW4gcmVxdWVzdCAqLworICAgIGN1cnJlbnRDaGFuSW5kZXggPSAocE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbkluZGV4KSA/IChwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8ucm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFuSW5kZXggLSAxKSA6IDA7CisKKyAgICAvKiBWYWxpZGF0ZSBpbnB1dHMgKi8KKyAgICBpZiAocE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KSB7IAorICAgICAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR1csIEZMKCJjc3JOZWlnaGJvclJvYW1TY2FuUmVxdWVzdENhbGxiYWNrIHJlY2VpdmVkIGZvciBDaGFubmVsID0gJWQsIENoYW5JbmRleCA9ICVkIiksIAorICAgICAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8ucm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3RbY3VycmVudENoYW5JbmRleF0sIGN1cnJlbnRDaGFuSW5kZXgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HMSwgRkwoIlJlY2VpdmVkIGR1cmluZyBjbGVhbi11cC4gU2lsZW50bHkgaWdub3JlIHNjYW4gY29tcGxldGlvbiBldmVudC4iKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIGlmIChlQU5JX0JPT0xFQU5fRkFMU0UgPT0gcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jaGFuTGlzdFNjYW5JblByb2dyZXNzKQorICAgIHsKKyAgICAgICAgLyogU2NhbiBpcyBjb21wbGV0ZWQgaW4gdGhlICBDRkdfQ0hBTl9TQ0FOIHN0YXRlLiBXZSBjYW4gdHJhbnNpdGlvbiB0byBSRVBPUlRfU0NBTiBzdGF0ZSAKKyAgICAgICAgICAganVzdCB0byBnZXQgdGhlIHJlc3VsdHMgYW5kIHBlcmZvcm0gUFJFQVVUSCAqLworICAgICAgICAvKiBOb3cgd2UgaGF2ZSBjb21wbGV0ZWQgc2Nhbm5pbmcgdGhlIGNoYW5uZWwgbGlzdC4gV2UgaGF2ZSBnZXQgdGhlIHJlc3VsdCBieSBhcHBseWluZyBhcHByb3ByaWF0ZSBmaWx0ZXIKKyAgICAgICAgICAgc29ydCB0aGUgcmVzdWx0cyBiYXNlZCBvbiBuZWlnaGJvclNjb3JlIGFuZCBSU1NJIGFuZCBzZWxlY3QgdGhlIGJlc3QgY2FuZGlkYXRlIG91dCBvZiB0aGUgbGlzdCAqLworICAgICAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR1csIEZMKCJDaGFubmVsIGxpc3Qgc2NhbiBjb21wbGV0ZWQuIEN1cnJlbnQgY2hhbiBpbmRleCA9ICVkIiksIGN1cnJlbnRDaGFuSW5kZXgpOworICAgICAgICBWT1NfQVNTRVJUKHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5JbmRleCA9PSAwKTsKKworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICAgICAgLyogSWYgdGhlIHN0YXRlIGlzIFJFUE9SVF9TQ0FOLCB0aGVuIHRoaXMgbXVzdCBiZSB0aGUgc2NhbiBhZnRlciB0aGUgUkVQT1JUX1FVRVJZIHN0YXRlLiBTbywgd2UgCisgICAgICAgICAgIHNob3VsZCB1c2UgdGhlIEJTU0lEIGZpbHRlciBtYWRlIG91dCBvZiBuZWlnaGJvciByZXBvcnRzICovCisgICAgICAgIGlmIChlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVQT1JUX1NDQU4gPT0gcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JOZWlnaGJvclJvYW1Cc3NJZFNjYW5GaWx0ZXIocE1hYywgJnNjYW5GaWx0ZXIpOworICAgICAgICAgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dXLCBGTCgiMTFSIG9yIENDWCBBc3NvY2lhdGlvbjogUHJlcGFyZSBzY2FuIGZpbHRlciBzdGF0dXMgIHdpdGggbmVpZ2hib3IgQVAgPSAlZCIpLCBzdGF0dXMpOworICAgICAgICAgICAgdGVtcFZhbCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzck5laWdoYm9yUm9hbVByZXBhcmVTY2FuUHJvZmlsZUZpbHRlcihwTWFjLCAmc2NhbkZpbHRlcik7CisgICAgICAgICAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR1csIEZMKCIxMVIvQ0NYL090aGVyIEFzc29jaWF0aW9uOiBQcmVwYXJlIHNjYW4gdG8gZmluZCBuZWlnaGJvciBBUCBmaWx0ZXIgc3RhdHVzICA9ICVkIiksIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlNjYW4gRmlsdGVyIHByZXBhcmF0aW9uIGZhaWxlZCBmb3IgQXNzb2MgdHlwZSAlZC4uIEJhaWxpbmcgb3V0Li4iKSwgdGVtcFZhbCk7CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBjc3JTY2FuR2V0UmVzdWx0KHBNYWMsICZzY2FuRmlsdGVyLCAmc2NhblJlc3VsdCk7CisgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HRSwgRkwoIkdldCBTY2FuIFJlc3VsdCBzdGF0dXMgY29kZSAlZCIpLCBzdGF0dXMpOworICAgICAgICAvKiBQcm9jZXNzIHRoZSBzY2FuIHJlc3VsdHMgYW5kIHVwZGF0ZSByb2FtYWJsZSBBUCBsaXN0ICovCisgICAgICAgIGNzck5laWdoYm9yUm9hbVByb2Nlc3NTY2FuUmVzdWx0cyhwTWFjLCAmc2NhblJlc3VsdCk7CisKKyAgICAgICAgLyogRnJlZSB0aGUgc2NhbiBmaWx0ZXIgKi8KKyAgICAgICAgY3NyRnJlZVNjYW5GaWx0ZXIocE1hYywgJnNjYW5GaWx0ZXIpOworCisgICAgICAgIHRlbXBWYWwgPSBjc3JMTENvdW50KCZwTmVpZ2hib3JSb2FtSW5mby0+cm9hbWFibGVBUExpc3QpOworCisgICAgICAgIHN3aXRjaChwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NGR19DSEFOX0xJU1RfU0NBTjoKKyAgICAgICAgICAgICAgICBpZiAodGVtcFZhbCkKKyAgICAgICAgICAgICAgICB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhpcyBpcyBhIG5vbi0xMXIgYXNzb2NpYXRpb24sIHRoZW4gd2UgY2FuIHJlZ2lzdGVyIHRoZSByZWFzc29jIGNhbGxiYWNrIGhlcmUgYXMgd2UgaGF2ZSBzb21lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQcyBpbiB0aGUgcm9hbWFibGUgQVAgbGlzdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAocE5laWdoYm9yUm9hbUluZm8tPmlzMTFyQXNzb2MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbGlkIEFQcyBhcmUgZm91bmQgYWZ0ZXIgc2Nhbi4gTm93IHdlIGNhbiBpbml0aWF0ZSBwcmUtYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIENTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04oZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1JFUE9SVF9TQ0FOKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhpcyBpcyBhIG5vbi0xMXIgYXNzb2NpYXRpb24sIHRoZW4gd2UgY2FuIHJlZ2lzdGVyIHRoZSByZWFzc29jIGNhbGxiYWNrIGhlcmUgYXMgd2UgaGF2ZSBzb21lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQcyBpbiB0aGUgcm9hbWFibGUgQVAgbGlzdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAocE5laWdoYm9yUm9hbUluZm8tPmlzQ0NYQXNzb2MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbGlkIEFQcyBhcmUgZm91bmQgYWZ0ZXIgc2Nhbi4gTm93IHdlIGNhbiBpbml0aWF0ZSBwcmUtYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIENTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04oZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1JFUE9SVF9TQ0FOKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiQ29tcGxldGVkIHNjYW5uaW5nIG9mIENGRyBDSEFOIExJU1QgaW4gbm9uLTExciBhc3NvY2lhdGlvbi4gUmVnaXN0ZXJpbmcgcmVhc3NvYyBjYWxsYmFjayIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgbXVjaCB0byBkbyBub3cuIFdpbGwgY29udGludWUgdG8gcmVtYWluIGluIHRoaXMgc3RhdGUgaW4gY2FzZSBvZiBub24tMTFyIGFzc29jaWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9wIHRoZSB0aW1lci4gQnV0IGhvdyBsb25nIHRoZSByb2FtYWJsZSBBUCBsaXN0IHdpbGwgYmUgdmFsaWQgaW4gaGVyZS4gQXQgc29tZSBwb2ludCBvZiB0aW1lLCB3ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gcmVzdGFydCB0aGUgQ0ZHIENIQU4gbGlzdCBzY2FuIHByb2NlZHVyZSBpZiByZWFzc29jIGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkIGZyb20gVEwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gY2VydGFpbiBkdXJhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JTY2FuVGltZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HRSwgRkwoIk5vIGNhbmRpZGF0ZSBmb3VuZCBhZnRlciBzY2FubmluZyBpbiBzdGF0ZSAlZC4uICIpLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgaXQgYXBwcm9wcmlhdGVseSAqLworICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1IYW5kbGVFbXB0eVNjYW5SZXN1bHQocE1hYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVQT1JUX1NDQU46CisgICAgICAgICAgICAgICAgaWYgKCF0ZW1wVmFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJObyBjYW5kaWRhdGUgZm91bmQgYWZ0ZXIgc2Nhbm5pbmcgaW4gc3RhdGUgJWQuLiAiKSwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgLyogU3RvcCB0aGUgdGltZXIgaGVyZSBhcyB0aGUgc2FtZSB0aW1lciB3aWxsIGJlIHN0YXJ0ZWQgYWdhaW4gaW4gQ0ZHX0NIQU5fU0NBTl9TVEFURSAqLworICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1UcmFuc2l0VG9DRkdDaGFuU2NhbihwTWFjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gQ2FuIGNvbWUgb25seSBpbiBJTklUIHN0YXRlLiBXaGVyZSBpbiB3ZSBhcmUgYXNzb2NpYXRlZCwgd2Ugc2VudCBzY2FuIGFuZCB1c2VyCisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1lYW50aW1lIGRlY2lkZXMgdG8gZGlzYXNzb2MsIHdlIHdpbGwgYmUgaW4gaW5pdCBzdGF0ZSBhbmQgc3RpbGwgcmVjZWl2ZWQgY2FsbAorICAgICAgICAgICAgICAgIC8vIGJhY2sgaXNzdWVkLiBTaG91bGQgbm90IGNvbWUgaGVyZSBpbiBhbnkgb3RoZXIgc3RhdGUsIHByaW50aW5nIGp1c3QgaW4gY2FzZQorICAgICAgICAgICAgICAgIFZPU19UUkFDRSAoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogW0lORk9MT0ddIFN0YXRlICVkXG4iLCBfX2Z1bmNfXywgKHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkpOworCisgICAgICAgICAgICAgICAgLy8gTGV0cyBqdXN0IGV4aXQgb3V0IHNpbGVudGx5LgorICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRlbXBWYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgICAgICAgICAvKiBUaGlzIHRpbWVyIHNob3VsZCBiZSBzdGFydGVkIGJlZm9yZSByZWdpc3RlcmluZyB0aGUgUmVhc3NvYyBjYWxsYmFjayB3aXRoIFRMLiBUaGlzIGlzIGJlY2F1c2UsIGl0IGlzIHZlcnkgbGlrZWx5IAorICAgICAgICAgICAgKiB0aGF0IHRoZSBjYWxsYmFjayBnZXR0aW5nIGNhbGxlZCBpbW1lZGlhdGVseSBhbmQgdGhlIHRpbWVyIHdvdWxkIG5ldmVyIGJlIHN0b3BwZWQgd2hlbiBwcmUtYXV0aCBpcyBpbiBwcm9ncmVzcyAqLworICAgICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJlc3VsdHNSZWZyZXNoVGltZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kICogUEFMX1RJTUVSX1RPX01TX1VOSVQsIAorICAgICAgICAgICAgICAgICAgICAgICAgZUFOSV9CT09MRUFOX0ZBTFNFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIk5laWdoYm9yIHJlc3VsdHMgcmVmcmVzaCB0aW1lciBmYWlsZWQgdG8gc3RhcnQsIHN0YXR1cyA9ICVkIiksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdCk7CisgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwgRkwoIlJlZ2lzdGVyaW5nIERPV04gZXZlbnQgUmVhc3NvYyBjYWxsYmFjayB3aXRoIFRMLiBSU1NJID0gJWQiKSwgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclJlYXNzb2NUaHJlc2hvbGQgKiAoLTEpKTsKKyAgICAgICAgICAgIC8qIFJlZ2lzdGVyIGEgcmVhc3NvYyBJbmRpY2F0aW9uIGNhbGxiYWNrICovCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVnUlNTSUluZGljYXRpb25DQihwTWFjLT5yb2FtLmdWb3NDb250ZXh0LCAodl9TN190KXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JSZWFzc29jVGhyZXNob2xkICogKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0hPX1RIUkVTSE9MRF9ET1dOLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtUmVhc3NvY0luZENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTU9EVUxFX0lEX1NNRSwgcE1hYyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vZXJyIG1zZworICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgQ291bGRuJ3QgcmVnaXN0ZXIgY3NyTmVpZ2hib3JSb2FtUmVhc3NvY0luZENhbGxiYWNrIHdpdGggVEw6IFN0YXR1cyA9ICVkXG4iKSwgdm9zU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIC8qIFJlc3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgbmV4dCBzY2FuIHNlcXVlbmNlIGFzIHNjYW5uaW5nIGlzIG5vdCBvdmVyICovCisgICAgICAgIHN0YXR1cyA9IHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yU2NhblRpbWVyLCAKKyAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclNjYW5QZXJpb2QgKiBQQUxfVElNRVJfVE9fTVNfVU5JVCwgCisgICAgICAgICAgICAgICAgICAgIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgCisgICAgICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGltZXIgc3RhcnQgZmFpbGVkLi4gU2hvdWxkIHdlIEFTU0VSVCBoZXJlPz8/ICovCisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIk5laWdoYm9yIHNjYW4gUEFMIFRpbWVyIHN0YXJ0IGZhaWxlZCwgc3RhdHVzID0gJWQsIElnbm9yaW5nIHN0YXRlIHRyYW5zaXRpb24iKSwgc3RhdHVzKTsKKyAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3QpOworICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtSXNzdWVCZ1NjYW5SZXF1ZXN0CisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXNzdWVzIENTUiBzY2FuIHJlcXVlc3QgYWZ0ZXIgcG9wdWxhdGluZyBhbGwgdGhlIEJHIHNjYW4gcGFyYW1zIAorICAgICAgICAgICAgcGFzc2VkCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgICAgICAgICBwQmdTY2FuUGFyYW1zIC0gUGFyYW1zIHRoYXQgbmVlZCB0byBiZSBwb3B1bGF0ZWQgaW50byBjc3IgU2NhbiByZXF1ZXN0CisKKyAgICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlIG90aGVyd2lzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JOZWlnaGJvclJvYW1Jc3N1ZUJnU2NhblJlcXVlc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckJHU2NhblJlcXVlc3QgKnBCZ1NjYW5QYXJhbXMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRBTklfVTMyIHNjYW5JZDsKKyAgICB0Q3NyU2NhblJlcXVlc3Qgc2NhblJlcTsKKyAgICB0QU5JX1U4IGNoYW5uZWw7CisgICAgCisgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiY3NyTmVpZ2hib3JSb2FtSXNzdWVCZ1NjYW5SZXF1ZXN0IGZvciBDaGFubmVsID0gJWQsIENoYW5JbmRleCA9ICVkIiksIAorICAgICAgICAgICAgICAgICAgICBwQmdTY2FuUGFyYW1zLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFswXSwgcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbkluZGV4KTsKKworCisgICAgLy9zZW5kIGRvd24gdGhlIHNjYW4gcmVxIGZvciAxIGNoYW5uZWwgb24gdGhlIGFzc29jaWF0ZWQgU1NJRAorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJnNjYW5SZXEsIHNpemVvZih0Q3NyU2NhblJlcXVlc3QpKTsKKyAgICAvKiBGaWxsIGluIHRoZSBTU0lEIEluZm8gKi8KKyAgICBzY2FuUmVxLlNTSURzLm51bU9mU1NJRHMgPSAxOworICAgIHNjYW5SZXEuU1NJRHMuU1NJRExpc3QgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodENzclNTSURJbmZvKSAqIHNjYW5SZXEuU1NJRHMubnVtT2ZTU0lEcyk7CisgICAgaWYoTlVMTCA9PSBzY2FuUmVxLlNTSURzLlNTSURMaXN0KQorICAgIHsKKyAgICAgICAvL2VyciBtc2cKKyAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFNTSUQuLkZyZWVpbmcgbWVtb3J5IGFsbG9jYXRlZCBmb3IgQ2hhbm5lbCBMaXN0XG4iKSk7CisgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorICAgIHZvc19tZW1femVybyhzY2FuUmVxLlNTSURzLlNTSURMaXN0LCBzaXplb2YodENzclNTSURJbmZvKSAqIHNjYW5SZXEuU1NJRHMubnVtT2ZTU0lEcyk7CisKKyAgICBzY2FuUmVxLlNTSURzLlNTSURMaXN0WzBdLmhhbmRvZmZQZXJtaXR0ZWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICBzY2FuUmVxLlNTSURzLlNTSURMaXN0WzBdLnNzaWRIaWRkZW4gPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB2b3NfbWVtX2NvcHkoKHZvaWQgKikmc2NhblJlcS5TU0lEcy5TU0lETGlzdFswXS5TU0lELCAodm9pZCAqKSZwQmdTY2FuUGFyYW1zLT5TU0lELCBzaXplb2YocEJnU2NhblBhcmFtcy0+U1NJRCkpOworICAgIAorICAgIHNjYW5SZXEuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IHBCZ1NjYW5QYXJhbXMtPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHM7CisgICAgCisgICAgY2hhbm5lbCA9IHBCZ1NjYW5QYXJhbXMtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0WzBdOworICAgIHNjYW5SZXEuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSAmY2hhbm5lbDsgICAgCisKKyAgICBzY2FuUmVxLkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFOworICAgIHNjYW5SZXEuc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgIHNjYW5SZXEucmVxdWVzdFR5cGUgPSBlQ1NSX1NDQU5fSE9fQkdfU0NBTjsKKyAgICBzY2FuUmVxLm1heENoblRpbWUgPSBwQmdTY2FuUGFyYW1zLT5tYXhDaG5UaW1lOworICAgIHNjYW5SZXEubWluQ2huVGltZSA9IHBCZ1NjYW5QYXJhbXMtPm1pbkNoblRpbWU7CisgICAgc3RhdHVzID0gY3NyU2NhblJlcXVlc3QocE1hYywgQ1NSX1NFU1NJT05fSURfSU5WQUxJRCwgJnNjYW5SZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbklkLCBjc3JOZWlnaGJvclJvYW1TY2FuUmVxdWVzdENhbGxiYWNrLCBOVUxMKTsKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNTUiBTY2FuIFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzICVkIiksIHN0YXR1cyk7CisgICAgICAgIHZvc19tZW1fZnJlZShzY2FuUmVxLlNTSURzLlNTSURMaXN0KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLnNjYW5Sc3BQZW5kaW5nID0gZUFOSV9CT09MRUFOX1RSVUU7CisKKyAgICB2b3NfbWVtX2ZyZWUoc2NhblJlcS5TU0lEcy5TU0lETGlzdCk7CisgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiQ2hhbm5lbCBMaXN0IEFkZHJlc3MgPSAlMDh4LCBBY3R1YWwgaW5kZXggPSAlZCIpLCAKKyAgICAgICAgICAgICAgICAgICAgJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdFswXSwgCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5JbmRleCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtUGVyZm9ybUJnU2NhbgorCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgb24gZXZlcnkgZXhwaXJ5IG9mIG5laWdoYm9yU2NhblRpbWVyIHRpbGwgYWxsIAorICAgICAgICAgICAgdGhlIGNoYW5uZWxzIGluIHRoZSBjaGFubmVsIGxpc3QgYXJlIHNjYW5uZWQuIEl0IHBvcHVsYXRlcyBuZWNlc3NhcnkgCisgICAgICAgICAgICBwYXJhbWV0ZXJzIGZvciBCRyBzY2FuIGFuZCBjYWxscyBhcHByb3ByaWF0ZSBBUCB0byBpbnZva2UgdGhlIENTUiBzY2FuIAorICAgICAgICAgICAgcmVxdWVzdAorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZSBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyTmVpZ2hib3JSb2FtUGVyZm9ybUJnU2Nhbih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIHRDc3JCR1NjYW5SZXF1ZXN0ICAgYmdTY2FuUGFyYW1zOworICAgIHRBTklfVTggICAgICAgICAgICAgYnJvYWRjYXN0QnNzaWRbXSA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworICAgIHRBTklfVTggICAgICAgICAgICAgY2hhbm5lbCA9IDA7CisKKyAgICBpZiAocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KQorICAgIHsKKyAgICAgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiQ2hhbm5lbCBMaXN0IEFkZHJlc3MgPSAlMDh4IiksICZwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3RbMF0pOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiQ2hhbm5lbCBMaXN0IEVtcHR5IikpOworICAgICAgICAvLyBHbyBiYWNrIGFuZCByZXN0YXJ0LiBNb3N0bHkgdGltZXIgc3RhcnQgZmFpbHVyZSBoYXMgb2NjdXJlZC4KKyAgICAgICAgLy8gV2hlbiB0aW1lciBzdGFydCBpcyBkZWNsYXJlZCBhIGZhaWx1cmUsIHRoZW4gd2UgZGVsZXRlIHRoZSBsaXN0LgorICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbiBub3cgYXMgd2Ugc3RvcCBhbmQgdGhlbiBvbmx5IHN0YXJ0IHRoZSBzY2FuIHRpbWVyLiAKKyAgICAgICAgLy8gc3RpbGwgaGFuZGxlIHRoZSB1bmxpa2VseSBjYXNlLgorICAgICAgICBjc3JOZWlnaGJvclJvYW1IYW5kbGVFbXB0eVNjYW5SZXN1bHQocE1hYyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIC8qIE5lZWQgdG8gcGVyZm9ybSBzY2FuIGhlcmUgYmVmb3JlIGdldHRpbmcgdGhlIGxpc3QgKi8KKyAgICB2b3NfbWVtX2NvcHkoYmdTY2FuUGFyYW1zLmJzc2lkLCBicm9hZGNhc3RCc3NpZCwgc2l6ZW9mKHRDc3JCc3NpZCkpOworICAgIGJnU2NhblBhcmFtcy5TU0lELmxlbmd0aCA9IHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bcE5laWdoYm9yUm9hbUluZm8tPmNzclNlc3Npb25JZF0uY29ubmVjdGVkUHJvZmlsZS5TU0lELmxlbmd0aDsKKyAgICB2b3NfbWVtX2NvcHkoYmdTY2FuUGFyYW1zLlNTSUQuc3NJZCwgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltwTmVpZ2hib3JSb2FtSW5mby0+Y3NyU2Vzc2lvbklkXS5jb25uZWN0ZWRQcm9maWxlLlNTSUQuc3NJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3BOZWlnaGJvclJvYW1JbmZvLT5jc3JTZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGUuU1NJRC5sZW5ndGgpOworCisgICAgY2hhbm5lbCA9IHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdFtwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFuSW5kZXhdOworICAgIGJnU2NhblBhcmFtcy5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMTsKKyAgICBiZ1NjYW5QYXJhbXMuQ2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSAmY2hhbm5lbDsKKyAgIAorICAgIGJnU2NhblBhcmFtcy5taW5DaG5UaW1lID0gcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5taW5DaGFubmVsU2NhblRpbWU7CisgICAgYmdTY2FuUGFyYW1zLm1heENoblRpbWUgPSBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm1heENoYW5uZWxTY2FuVGltZTsKKworICAgIHN0YXR1cyA9IGNzck5laWdoYm9yUm9hbUlzc3VlQmdTY2FuUmVxdWVzdChwTWFjLCAmYmdTY2FuUGFyYW1zKTsKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIklzc3VlIG9mIEJHIFNjYW4gcmVxdWVzdCBmYWlsZWQ6IFN0YXR1cyA9ICVkIiksIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbkluZGV4Kys7CisgICAgaWYgKHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5JbmRleCA+PSAKKyAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5udW1PZkNoYW5uZWxzKQorICAgIHsgICAgICAKKyAgICAgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiQ29tcGxldGVkIHNjYW5uaW5nIGNoYW5uZWxzIGluIENoYW5uZWwgTGlzdDogQ3VyckNoYW5JbmRleCA9ICVkLCBOdW0gQ2hhbm5lbHMgPSAlZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFuSW5kZXgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8ubnVtT2ZDaGFubmVscyk7CisgICAgICAgIC8qIFdlIGhhdmUgY29tcGxldGVkIHNjYW5uaW5nIGFsbCB0aGUgY2hhbm5lbHMgKi8KKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbkluZGV4ID0gMDsKKyAgICAgICAgLyogV2UgYXJlIG5vIGxvbmdlciBzY2FubmluZyB0aGUgY2hhbm5lbCBsaXN0LiBOZXh0IHRpbWVyIGZpcmluZyBzaG91bGQgYmUgdXNlZCB0byBnZXQgdGhlIHNjYW4gcmVzdWx0cyAKKyAgICAgICAgICAgYW5kIHNlbGVjdCB0aGUgYmVzdCBBUCBpbiB0aGUgbGlzdCAqLworICAgICAgICBpZiAoZUFOSV9CT09MRUFOX1RSVUUgPT0gcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jaGFuTGlzdFNjYW5JblByb2dyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmNoYW5MaXN0U2NhbkluUHJvZ3Jlc3MgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1OZWlnaGJvclNjYW5UaW1lckNhbGxiYWNrCisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG5laWdoYm9yIHNjYW4gdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24uIEl0IGludm9rZXMgCisgICAgICAgICAgICB0aGUgQkcgc2NhbiByZXF1ZXN0IGJhc2VkIG9uIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdGF0ZXMKKworICAgIFxwYXJhbSAgcHYgLSBDU1IgdGltZXIgY29udGV4dCBpbmZvIHdoaWNoIGluY2x1ZGVzIHBNYWMgYW5kIHNlc3Npb24gSUQKKworICAgIFxyZXR1cm4gVk9JRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjc3JOZWlnaGJvclJvYW1OZWlnaGJvclNjYW5UaW1lckNhbGxiYWNrKHZvaWQgKnB2KQoreworICAgIHRDc3JUaW1lckluZm8gKnBJbmZvID0gKHRDc3JUaW1lckluZm8gKilwdjsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gcEluZm8tPnBNYWM7CisgICAgdEFOSV9VMzIgICAgICAgICBzZXNzaW9uSWQgPSBwSW5mby0+c2Vzc2lvbklkOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworCisgICAgLy8gY2hlY2sgaWYgYmcgc2NhbiBpcyBvbiBnb2luZywgbm8gbmVlZCB0byBzZW5kIGRvd24gdGhlIG5ldyBwYXJhbXMgaWYgdHJ1ZQorICAgIGlmKGVBTklfQk9PTEVBTl9UUlVFID09IHBOZWlnaGJvclJvYW1JbmZvLT5zY2FuUnNwUGVuZGluZykKKyAgICB7CisgICAgICAgLy9tc2cKKyAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIkFscmVhZHkgQmdTY2FuUnNwIGlzIFBlbmRpbmdcbiIpKTsKKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVk9TX0FTU0VSVChzZXNzaW9uSWQgPT0gcE5laWdoYm9yUm9hbUluZm8tPmNzclNlc3Npb25JZCk7CisKKyAgICBzd2l0Y2ggKHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkKKyAgICB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVQT1JUX1NDQU46CisgICAgICAgICAgICBzd2l0Y2gocE5laWdoYm9yUm9hbUluZm8tPnByZXZOZWlnaGJvclJvYW1TdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRVBPUlRfUVVFUlk6CisgICAgICAgICAgICAgICAgICAgIGNzck5laWdoYm9yUm9hbVBlcmZvcm1CZ1NjYW4ocE1hYyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiTmVpZ2hib3Igc2NhbiBjYWxsYmFjayByZWNlaXZlZCBpbiBzdGF0ZSAlZCwgcHJldiBzdGF0ZSA9ICVkIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlLCBwTmVpZ2hib3JSb2FtSW5mby0+cHJldk5laWdoYm9yUm9hbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworICAgICAgICBjYXNlIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DRkdfQ0hBTl9MSVNUX1NDQU46ICAgICAKKyAgICAgICAgICAgIGNzck5laWdoYm9yUm9hbVBlcmZvcm1CZ1NjYW4ocE1hYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbVJlc3VsdHNSZWZyZXNoVGltZXJDYWxsYmFjaworCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSB0aW1lciBjYWxsYmFjayBmdW5jdGlvbiBmb3IgcmVzdWx0cyByZWZyZXNoIHRpbWVyLgorICAgICAgICAgICAgV2hlbiB0aGlzIGlzIGludm9rZWQsIGl0IGlzIGFzIGdvb2QgYXMgZG93biBldmVudCByZWNlaXZlZCBmcm9tIFRMLiBTbywgCisgICAgICAgICAgICBjbGVhciBvZmYgdGhlIHJvYW1hYmxlIEFQIGxpc3QgYW5kIHN0YXJ0IHRoZSBzY2FuIHByb2NlZHVyZSBiYXNlZCBvbiAxMVIgCisgICAgICAgICAgICBvciBub24tMTFSIGFzc29jaWF0aW9uCisKKyAgICBccGFyYW0gIGNvbnRleHQgLSBDU1IgdGltZXIgY29udGV4dCBpbmZvIHdoaWNoIGluY2x1ZGVzIHBNYWMgYW5kIHNlc3Npb24gSUQKKworICAgIFxyZXR1cm4gVk9JRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjc3JOZWlnaGJvclJvYW1SZXN1bHRzUmVmcmVzaFRpbWVyQ2FsbGJhY2sodm9pZCAqY29udGV4dCkKK3sKKyAgICB0Q3NyVGltZXJJbmZvICpwSW5mbyA9ICh0Q3NyVGltZXJJbmZvICopY29udGV4dDsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gcEluZm8tPnBNYWM7CisgICAgVk9TX1NUQVRVUyAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgICAKKyAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzIsIEZMKCJEZXJlZ2lzdGVyaW5nIERPV04gZXZlbnQgcmVhc3NvYyBjYWxsYmFjayB3aXRoIFRMLiBSU1NJID0gJWQiKSwgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclJlYXNzb2NUaHJlc2hvbGQgKiAoLTEpKTsKKworICAgIC8qIERlcmVnaXN0ZXIgcmVhc3NvYyBjYWxsYmFjay4gSWdub3JlIHJldHVybiBzdGF0dXMgKi8KKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsICh2X1M3X3QpcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclJlYXNzb2NUaHJlc2hvbGQgKiAoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfSE9fVEhSRVNIT0xEX0RPV04sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1SZWFzc29jSW5kQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NT0RVTEVfSURfU01FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICB7CisgICAgICAgIC8vZXJyIG1zZworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBDb3VsZG4ndCBkZXJlZ2lzdGVyIGNzck5laWdoYm9yUm9hbVJlYXNzb2NJbmRDYWxsYmFjayB3aXRoIFRMOiBTdGF0dXMgPSAlZFxuIiksIHZvc1N0YXR1cyk7CisgICAgfQorCisgICAgLyogUmVzZXQgYWxsIHRoZSB2YXJpYWJsZXMganVzdCBhcyBubyBzY2FuIGhhZCBoYXBwZW5lZCBiZWZvcmUgKi8KKyAgICBjc3JOZWlnaGJvclJvYW1SZXNldENvbm5lY3RlZFN0YXRlQ29udHJvbEluZm8ocE1hYyk7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICYmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIGlmICgocE5laWdoYm9yUm9hbUluZm8tPmlzMTFyQXNzb2MpICYmIChwTWFjLT5ycm0ucnJtU21lQ29udGV4dC5ycm1Db25maWcucnJtRW5hYmxlZCkpCisgICAgeworICAgICAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsIEZMKCIxMVIgQXNzb2NpYXRpb246TmVpZ2hib3IgTG9va3VwIERvd24gZXZlbnQgcmVjZWl2ZWQgaW4gQ09OTkVDVEVEIHN0YXRlIikpOworICAgICAgICB2b3NTdGF0dXMgPSBjc3JOZWlnaGJvclJvYW1Jc3N1ZU5laWdoYm9yUnB0UmVxdWVzdChwTWFjKTsKKyAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiTmVpZ2hib3IgcmVwb3J0IHJlcXVlc3QgZmFpbGVkLiBzdGF0dXMgPSAlZFxuIiksIHZvc1N0YXR1cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLyogSW5jcmVtZW50IHRoZSBuZWlnaGJvciByZXBvcnQgcmV0cnkgY291bnQgYWZ0ZXIgc2VuZGluZyB0aGUgbmVpZ2hib3IgcmVxdWVzdCBzdWNjZXNzZnVsbHkgKi8KKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8uY3VycmVudE5laWdoYm9yUnB0UmV0cnlOdW0rKzsKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ubmVpZ2hib3JScHRQZW5kaW5nID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIENTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04oZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1JFUE9SVF9RVUVSWSkKKyAgICB9CisgICAgZWxzZQorI2VuZGlmICAgICAgCisgICAgeworICAgICAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsIEZMKCJOb24gMTFSIG9yIENDWCBBc3NvY2lhdGlvbjpOZWlnaGJvciBMb29rdXAgRG93biBldmVudCByZWNlaXZlZCBpbiBDT05ORUNURUQgc3RhdGUiKSk7CisgICAgICAgIHZvc1N0YXR1cyA9IGNzck5laWdoYm9yUm9hbVRyYW5zaXRUb0NGR0NoYW5TY2FuKHBNYWMpOworICAgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgJiYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1Jc3N1ZU5laWdoYm9yUnB0UmVxdWVzdAorCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2hlbiBUTCBpc3N1ZXMgYSBkb3duIGV2ZW50IGFuZCB0aGUgY3VycmVudCBhc3NvYyAKKyAgICAgICAgICAgIGlzIGEgMTFSIGFzc29jaWF0aW9uLiBJdCBpbnZva2VzIFNNRSBSUk0gQVBJIHRvIGlzc3VlIHRoZSBuZWlnaGJvciByZXF1ZXN0IHRvIAorICAgICAgICAgICAgdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIEFQIHdpdGggdGhlIGN1cnJlbnQgU1NJRAorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlIG90aGVyd2lzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBjc3JOZWlnaGJvclJvYW1Jc3N1ZU5laWdoYm9yUnB0UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRScm1OZWlnaGJvclJzcENhbGxiYWNrSW5mbyBjYWxsYmFja0luZm87CisgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyAgICBwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm87CisgICAgdFJybU5laWdoYm9yUmVxIG5laWdoYm9yUmVxOworCisKKyAgICBuZWlnaGJvclJlcS5ub19zc2lkID0gMDsKKworICAgIC8qIEZpbGwgaW4gdGhlIFNTSUQgKi8KKyAgICBuZWlnaGJvclJlcS5zc2lkLmxlbmd0aCA9IHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bcE5laWdoYm9yUm9hbUluZm8tPmNzclNlc3Npb25JZF0uY29ubmVjdGVkUHJvZmlsZS5TU0lELmxlbmd0aDsKKyAgICB2b3NfbWVtX2NvcHkobmVpZ2hib3JSZXEuc3NpZC5zc0lkLCBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3BOZWlnaGJvclJvYW1JbmZvLT5jc3JTZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGUuU1NJRC5zc0lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bcE5laWdoYm9yUm9hbUluZm8tPmNzclNlc3Npb25JZF0uY29ubmVjdGVkUHJvZmlsZS5TU0lELmxlbmd0aCk7CisgICAgCisgICAgY2FsbGJhY2tJbmZvLm5laWdoYm9yUnNwQ2FsbGJhY2sgPSBjc3JOZWlnaGJvclJvYW1SUk1OZWlnaGJvclJlcG9ydFJlc3VsdDsKKyAgICBjYWxsYmFja0luZm8ubmVpZ2hib3JSc3BDYWxsYmFja0NvbnRleHQgPSBwTWFjOworICAgIGNhbGxiYWNrSW5mby50aW1lb3V0ID0gcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ubmVpZ2hib3JSZXBvcnRUaW1lb3V0OworCisgICAgcmV0dXJuIHNtZV9OZWlnaGJvclJlcG9ydFJlcXVlc3QocE1hYywodEFOSV9VOCkgcE5laWdoYm9yUm9hbUluZm8tPmNzclNlc3Npb25JZCwgJm5laWdoYm9yUmVxLCAmY2FsbGJhY2tJbmZvKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtQ3JlYXRlQ2hhbkxpc3RGcm9tTmVpZ2hib3JSZXBvcnQKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHdoZW4gbmVpZ2hib3IgcmVwb3J0IGlzIHJlY2VpdmVkIGZvciB0aGUgCisgICAgICAgICAgICBuZWlnaGJvciByZXF1ZXN0LiBCYXNlZCBvbiB0aGUgY2hhbm5lbHMgcHJlc2VudCBpbiB0aGUgbmVpZ2hib3IgcmVwb3J0LCAKKyAgICAgICAgICAgIGl0IGdlbmVyYXRlcyBjaGFubmVsIGxpc3Qgd2hpY2ggd2lsbCBiZSB1c2VkIGluIFJFUE9SVF9TQ0FOIHN0YXRlIHRvCisgICAgICAgICAgICBzY2FuIGZvciB0aGVzZSBuZWlnaGJvciBBUHMKKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICAgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZSBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgY3NyTmVpZ2hib3JSb2FtQ3JlYXRlQ2hhbkxpc3RGcm9tTmVpZ2hib3JSZXBvcnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0cFJybU5laWdoYm9yUmVwb3J0RGVzYyBwTmVpZ2hib3JCc3NEZXNjOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIHRBTklfVTggICAgICAgICBudW1DaGFubmVscyA9IDAsIGkgPSAwLCBqPTA7CisgICAgdEFOSV9VOCAgICAgICAgIGNoYW5uZWxMaXN0W01BWF9CU1NfSU5fTkVJR0hCT1JfUlBUXTsKKworICAgIC8qIFRoaXMgc2hvdWxkIGFsd2F5cyBzdGFydCBmcm9tIDAgd2hlbmV2ZXIgd2UgY3JlYXRlIGEgY2hhbm5lbCBsaXN0IG91dCBvZiBuZWlnaGJvciBBUCBsaXN0ICovCisgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ubnVtQnNzRnJvbU5laWdoYm9yUmVwb3J0ID0gMDsKKworICAgIHBOZWlnaGJvckJzc0Rlc2MgPSBzbWVScm1HZXRGaXJzdEJzc0VudHJ5RnJvbU5laWdoYm9yQ2FjaGUocE1hYyk7CisKKyAgICB3aGlsZSAocE5laWdoYm9yQnNzRGVzYykKKyAgICB7CisgICAgICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5udW1Cc3NGcm9tTmVpZ2hib3JSZXBvcnQgPj0gTUFYX0JTU19JTl9ORUlHSEJPUl9SUFQpIGJyZWFrOworICAgICAgICAKKyAgICAgICAgLyogVXBkYXRlIHRoZSBuZWlnaGJvciBCU1MgSW5mbyBpbiB0aGUgMTFyIEZUIFJvYW0gSW5mbyAqLworICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5uZWlnaGJvUmVwb3J0QnNzSW5mb1twTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5udW1Cc3NGcm9tTmVpZ2hib3JSZXBvcnRdLmNoYW5uZWxOdW0gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvckJzc0Rlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsOworICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5uZWlnaGJvUmVwb3J0QnNzSW5mb1twTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5udW1Cc3NGcm9tTmVpZ2hib3JSZXBvcnRdLm5laWdoYm9yU2NvcmUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KXBOZWlnaGJvckJzc0Rlc2MtPnJvYW1TY29yZTsKKyAgICAgICAgdm9zX21lbV9jb3B5KHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm5laWdoYm9SZXBvcnRCc3NJbmZvW3BOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLm51bUJzc0Zyb21OZWlnaGJvclJlcG9ydF0ubmVpZ2hib3JCc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JCc3NEZXNjLT5wTmVpZ2hib3JCc3NEZXNjcmlwdGlvbi0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5udW1Cc3NGcm9tTmVpZ2hib3JSZXBvcnQrKzsKKworICAgICAgICAvKiBTYXZpbmcgdGhlIGNoYW5uZWwgbGlzdCBub24tcmVkdW5kYW50bHkgKi8KKyAgICAgICAgaWYgKG51bUNoYW5uZWxzID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBOZWlnaGJvckJzc0Rlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsID09IGNoYW5uZWxMaXN0W2ldKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGlmIChpID09IG51bUNoYW5uZWxzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE5laWdoYm9yQnNzRGVzYy0+cE5laWdoYm9yQnNzRGVzY3JpcHRpb24tPmNoYW5uZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGFkZCBvbmx5IGlmIGl0cyB0aGUgc2FtZSBiYW5kCisgICAgICAgICAgICAgICAgaWYgKChwTmVpZ2hib3JSb2FtSW5mby0+Y3VyckFQb3BlcmF0aW9uQ2hhbm5lbCA8PSAoUkZfQ0hBTl8xNCsxKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHBOZWlnaGJvckJzc0Rlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsIDw9IChSRl9DSEFOXzE0KzEpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UgKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogW0lORk9MT0ddIEFkZGluZyAlZCB0byBOZWlnaGJvciBjaGFubmVsIGxpc3RcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JCc3NEZXNjLT5wTmVpZ2hib3JCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTGlzdFtudW1DaGFubmVsc10gPSBwTmVpZ2hib3JCc3NEZXNjLT5wTmVpZ2hib3JCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwTmVpZ2hib3JSb2FtSW5mby0+Y3VyckFQb3BlcmF0aW9uQ2hhbm5lbCA+PSBSRl9DSEFOXzEyOCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHBOZWlnaGJvckJzc0Rlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsID49IFJGX0NIQU5fMTI4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UgKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogW0lORk9MT0ddIEFkZGluZyAlZCB0byBOZWlnaGJvciBjaGFubmVsIGxpc3RcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JCc3NEZXNjLT5wTmVpZ2hib3JCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTGlzdFtudW1DaGFubmVsc10gPSBwTmVpZ2hib3JCc3NEZXNjLT5wTmVpZ2hib3JCc3NEZXNjcmlwdGlvbi0+Y2hhbm5lbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgcE5laWdoYm9yQnNzRGVzYyA9IHNtZVJybUdldE5leHRCc3NFbnRyeUZyb21OZWlnaGJvckNhY2hlKHBNYWMsIHBOZWlnaGJvckJzc0Rlc2MpOworICAgIH0KKworICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3QpCisgICAgeworICAgICAgICAvLyBCZWZvcmUgd2UgZnJlZSB0aGUgZXhpc3RpbmcgY2hhbm5lbCBsaXN0IGZvciBhIHNhZmV0eSBuZXQgbWFrZSBzdXJlCisgICAgICAgIC8vIHdlIGhhdmUgYSB1bmlvbiBvZiB0aGUgSUFQUCBhbmQgdGhlIGFscmVhZHkgZXhpc3RpbmcgbGlzdC4gCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8ubnVtT2ZDaGFubmVsczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ2hhbm5lbHM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0W2ldID09IGNoYW5uZWxMaXN0W2pdKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqID09IG51bUNoYW5uZWxzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3RbaV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gYWRkIG9ubHkgaWYgaXRzIHRoZSBzYW1lIGJhbmQKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwTmVpZ2hib3JSb2FtSW5mby0+Y3VyckFQb3BlcmF0aW9uQ2hhbm5lbCA8PSAoUkZfQ0hBTl8xNCsxKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3RbaV0gPD0gKFJGX0NIQU5fMTQrMSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFIChWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBbSU5GT0xPR10gQWRkaW5nIGV4dHJhICVkIHRvIE5laWdoYm9yIGNoYW5uZWwgbGlzdFxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTGlzdFtudW1DaGFubmVsc10gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3RbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKHBOZWlnaGJvclJvYW1JbmZvLT5jdXJyQVBvcGVyYXRpb25DaGFubmVsID49IFJGX0NIQU5fMTI4KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3RbaV0gPj0gUkZfQ0hBTl8xMjgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFIChWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBbSU5GT0xPR10gQWRkaW5nIGV4dHJhICVkIHRvIE5laWdoYm9yIGNoYW5uZWwgbGlzdFxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbExpc3RbbnVtQ2hhbm5lbHNdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvc19tZW1fZnJlZShwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3QpOworICAgIH0KKworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisgICAgLyogU3RvcmUgdGhlIG9idGFpbmVkIGNoYW5uZWwgbGlzdCB0byB0aGUgTmVpZ2hib3IgQ29udHJvbCBkYXRhIHN0cnVjdHVyZSAqLworICAgIGlmIChudW1DaGFubmVscykKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0gdm9zX21lbV9tYWxsb2MoKG51bUNoYW5uZWxzKSAqIHNpemVvZih0QU5JX1U4KSk7CisgICAgaWYgKE5VTEwgPT0gcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgQ2hhbm5lbCBsaXN0IGZhaWxlZC4uIFRMIGV2ZW50IGlnbm9yZWQiKSk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTOworICAgIH0KKworICAgIHZvc19tZW1fY29weShwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTGlzdCwgKG51bUNoYW5uZWxzKSAqIHNpemVvZih0QU5JX1U4KSk7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLm51bU9mQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKKyAgICBpZiAobnVtQ2hhbm5lbHMpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HMSwgRkwoIklBUFAgTmVpZ2hib3IgbGlzdCBjYWxsYmFjayByZWNlaXZlZCBhcyBleHBlY3RlZCBpbiBzdGF0ZSAlZC4iKSwgCisgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpOworICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLklBUFBOZWlnaGJvckxpc3RSZWNlaXZlZCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIH0KKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFuSW5kZXggPSAwOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY2hhbkxpc3RTY2FuSW5Qcm9ncmVzcyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIAorICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbVJSTU5laWdoYm9yUmVwb3J0UmVzdWx0CisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG5laWdoYm9yIHJlcG9ydCBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBieSAKKyAgICAgICAgICAgIFNNRSBSUk0gb24gcmVjZWl2aW5nIGEgbmVpZ2hib3IgcmVwb3J0IG9yIG9mIG5laWdoYm9yIHJlcG9ydCBpcyBub3QgCisgICAgICAgICAgICByZWNlaXZlZCBhZnRlciB0aW1lb3V0LiBPbiByZWNlaXZpbmcgYSB2YWxpZCByZXBvcnQsIGl0IGdlbmVyYXRlcyBhIAorICAgICAgICAgICAgY2hhbm5lbCBsaXN0IGZyb20gdGhlIG5laWdoYm9yIHJlcG9ydCBhbmQgc3RhcnRzIHRoZSAKKyAgICAgICAgICAgIG5laWdoYm9yIHNjYW4gdGltZXIKKworICAgIFxwYXJhbSAgY29udGV4dCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICAgICAgICAgIHZvc1N0YXR1cyAtIFN0YXR1cyBvZiB0aGUgY2FsbGJhY2soU1VDQ0VTUy9GQUlMVVJFKQorCisgICAgXHJldHVybiBWT0lECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNzck5laWdoYm9yUm9hbVJSTU5laWdoYm9yUmVwb3J0UmVzdWx0KHZvaWQgKmNvbnRleHQsIFZPU19TVEFUVVMgdm9zU3RhdHVzKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChjb250ZXh0KTsKKyAgICB0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvICAgIHBOZWlnaGJvclJvYW1JbmZvID0gJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mbzsKKyAgICBlSGFsU3RhdHVzICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICAgc21zTG9nKHBNYWMsIExPRzEsIEZMKCJOZWlnaGJvciByZXBvcnQgcmVzdWx0IGNhbGxiYWNrIHdpdGggc3RhdHVzID0gJWRcbiIpLCB2b3NTdGF0dXMpOworICAgIHN3aXRjaCAocE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVQT1JUX1FVRVJZOgorICAgICAgICAgICAgLyogUmVzZXQgdGhlIHJlcG9ydCBwZW5kaW5nIHZhcmlhYmxlICovCisgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5uZWlnaGJvclJwdFBlbmRpbmcgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBOZWVkIHRvIGNyZWF0ZSBjaGFubmVsIGxpc3QgYmFzZWQgb24gdGhlIG5laWdoYm9yIEFQIGxpc3QgYW5kIHRyYW5zaXRpb24gdG8gUkVQT1JUX1NDQU4gc3RhdGUgKi8KKyAgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBjc3JOZWlnaGJvclJvYW1DcmVhdGVDaGFuTGlzdEZyb21OZWlnaGJvclJlcG9ydChwTWFjKTsKKyAgICAgICAgICAgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HRSwgRkwoIkNoYW5uZWwgTGlzdCBjcmVhdGVkIGZyb20gTmVpZ2hib3IgcmVwb3J0LCBUcmFuc2l0aW9uaW5nIHRvIE5FSUdIQk9SX1NDQU4gc3RhdGVcbiIpKTsgCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogV2UgYXJlIGdvbm5hIHNjYW4gbm93LiBSZW1lbWJlciB0aGUgdGltZSBzdGFtcCB0byBmaWx0ZXIgb3V0IHJlc3VsdHMgb25seSBhZnRlciB0aGlzIHRpbWVzdGFtcCAqLworICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5zY2FuUmVxdWVzdFRpbWVTdGFtcCA9ICh0QU5JX1RJTUVTVEFNUClwYWxHZXRUaWNrQ291bnQocE1hYy0+aEhkZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogTm93IHJlYWR5IGZvciBuZWlnaGJvciBzY2FuIGJhc2VkIG9uIHRoZSBjaGFubmVsIGxpc3QgY3JlYXRlZCAqLworICAgICAgICAgICAgICAgIC8qIFN0YXJ0IE5laWdoYm9yIHNjYW4gdGltZXIgbm93LiBNdWx0aXBsaWNhdGlvbiBieSBQQUxfVElNRVJfVE9fTVNfVU5JVCBpcyB0byBjb252ZXJ0IG1zIHRvIHVzIHdoaWNoIGlzIAorICAgICAgICAgICAgICAgICAgIHdoYXQgcGFsVGltZXJTdGFydCBleHBlY3RzICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsVGltZXJTdGFydChwTWFjLT5oSGRkLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JTY2FuVGltZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5laWdoYm9yU2NhblBlcmlvZCAqIFBBTF9USU1FUl9UT19NU19VTklULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBzdGFydCBmYWlsZWQuLiBTaG91bGQgd2UgQVNTRVJUIGhlcmU/Pz8gKi8KKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJQQUwgVGltZXIgc3RhcnQgZm9yIG5laWdoYm9yIHNjYW4gdGltZXIgZmFpbGVkLCBzdGF0dXMgPSAlZCwgSWdub3Jpbmcgc3RhdGUgdHJhbnNpdGlvbiIpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5jdXJyZW50TmVpZ2hib3JScHRSZXRyeU51bSA9IDA7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIE5laWdoYm9yIHNjYW4gdGltZXIgc3RhcnRlZC4gVHJhbnNpdGlvbiB0byBSRVBPUlRfU0NBTiBzdGF0ZSAqLworICAgICAgICAgICAgICAgIENTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04oZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1JFUE9SVF9TQ0FOKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE5laWdoYm9yIHJlcG9ydCB0aW1lb3V0IGhhcHBlbmVkIGluIFNNRSBSUk0uIFdlIGNhbiB0cnkgc2VuZGluZyBtb3JlIG5laWdoYm9yIHJlcXVlc3RzIHVudGlsIHdlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaCB0aGUgbWF4TmVpZ2hib3JSZXRyaWVzIG9yIHJlY2VpdmluZyBhIHN1Y2Nlc3NmdWwgbmVpZ2hib3IgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIk5laWdoYm9yIHJlcG9ydCByZXN1bHQgZmFpbGVkIGFmdGVyICVkIHJldHJpZXMsIE1BWCBSRVRSSUVTID0gJWRcbiIpLCAKKyAgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLmN1cnJlbnROZWlnaGJvclJwdFJldHJ5TnVtLCBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm1heE5laWdoYm9yUmV0cmllcyk7CisgICAgICAgICAgICAgICAgaWYgKHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLmN1cnJlbnROZWlnaGJvclJwdFJldHJ5TnVtID49IAorICAgICAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5tYXhOZWlnaGJvclJldHJpZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkJhaWxpbmcgb3V0IHRvIENGRyBDaGFubmVsIGxpc3Qgc2Nhbi4uIFxuIikpOworICAgICAgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBjc3JOZWlnaGJvclJvYW1UcmFuc2l0VG9DRkdDaGFuU2NhbihwTWFjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiVHJhbnNpdCB0byBDRkcgQ2hhbm5lbCBsaXN0IHNjYW4gc3RhdGUgZmFpbGVkIHdpdGggc3RhdHVzICVkIFxuIiksIHZvc1N0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogV2UgdHJhbnNpdGlvbmVkIHRvIGRpZmZlcmVudCBzdGF0ZSBub3cuIFJlc2V0IHRoZSBOZWlnaGJvciByZXBvcnQgcmV0cnkgY291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8uY3VycmVudE5laWdoYm9yUnB0UmV0cnlOdW0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBjc3JOZWlnaGJvclJvYW1Jc3N1ZU5laWdoYm9yUnB0UmVxdWVzdChwTWFjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiTmVpZ2hib3IgcmVwb3J0IHJlcXVlc3QgZmFpbGVkLiBzdGF0dXMgPSAlZFxuIiksIHZvc1N0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ubmVpZ2hib3JScHRQZW5kaW5nID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCB0aGUgbmVpZ2hib3IgcmVwb3J0IHJldHJ5IGNvdW50IGFmdGVyIHNlbmRpbmcgdGhlIG5laWdoYm9yIHJlcXVlc3Qgc3VjY2Vzc2Z1bGx5ICovCisgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLmN1cnJlbnROZWlnaGJvclJwdFJldHJ5TnVtKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIk5laWdoYm9yIHJlc3VsdCBjYWxsYmFjayBub3QgZXhwZWN0ZWQgaW4gc3RhdGUgJWQsIElnbm9yaW5nLi4iKSwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1UcmFuc2l0VG9DRkdDaGFuU2NhbgorCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBhIHRyYW5zaXRpb24gdG8gQ0ZHIGNoYW4gc2NhbiAKKyAgICAgICAgICAgIHN0YXRlIGZyb20gYW55IHN0YXRlLiBJdCBmcmVlcyB1cCB0aGUgY3VycmVudCBjaGFubmVsIGxpc3QgYW5kIGFsbG9jYXRlcyAKKyAgICAgICAgICAgIGEgbmV3IG1lbW9yeSBmb3IgdGhlIGNoYW5uZWxzIHJlY2VpdmVkIGZyb20gQ0ZHIGl0ZW0uIEl0IHRoZW4gc3RhcnRzIHRoZSAKKyAgICAgICAgICAgIG5laWdoYm9yIHNjYW4gdGltZXIgdG8gcGVyZm9ybSB0aGUgc2NhbiBvbiBlYWNoIGNoYW5uZWwgb25lIGJ5IG9uZQorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlIG90aGVyd2lzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBjc3JOZWlnaGJvclJvYW1UcmFuc2l0VG9DRkdDaGFuU2Nhbih0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIGVIYWxTdGF0dXMgIHN0YXR1cyAgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIGludCBpID0gMDsKKyAgICBpbnQgbnVtT2ZDaGFubmVscyA9IDA7CisgICAgdEFOSV9VOCAgIGNoYW5uZWxMaXN0W01BWF9CU1NfSU5fTkVJR0hCT1JfUlBUXTsKKworICAgIGlmICgKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICgocE5laWdoYm9yUm9hbUluZm8tPmlzQ0NYQXNzb2MpICYmIAorICAgICAgICAocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5JQVBQTmVpZ2hib3JMaXN0UmVjZWl2ZWQgPT0gZUFOSV9CT09MRUFOX0ZBTFNFKSkgfHwKKyAgICAgICAgKHBOZWlnaGJvclJvYW1JbmZvLT5pc0NDWEFzc29jID09IGVBTklfQk9PTEVBTl9GQUxTRSkgfHwgCisjZW5kaWYgLy8gQ0NYCisgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5udW1PZkNoYW5uZWxzID09IDApCisKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiRmFsbGluZyBiYWNrIHRvIENGRyBjaGFubmVsIGxpc3QiKSk7CisKKworICAgICAgICAvKiBGcmVlIHVwIHRoZSBjaGFubmVsIGxpc3QgYW5kIGFsbG9jYXRlIGEgbmV3IG1lbW9yeS4gVGhpcyBpcyBiZWNhdXNlIHdlIGRvbnQga25vdyBob3cgbXVjaCAKKyAgICAgICAgICAgIHdhcyBhbGxvY2F0ZWQgbGFzdCB0aW1lLiBJZiB3ZSBkaXJlY3RseSBjb3B5IG1vcmUgbnVtYmVyIG9mIGJ5dGVzIHRoYW4gYWxsb2NhdGVkIGVhcmxpZXIsIHRoaXMgbWlnaHQgCisgICAgICAgICAgICByZXN1bHQgaW4gbWVtb3J5IGNvcnJ1cHRpb24gKi8KKyAgICAgICAgaWYgKE5VTEwgIT0gcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KQorICAgICAgICB7CisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLy8gRmluZCB0aGUgcmlnaHQgc3Vic2V0IG9mIHRoZSBjZmcgbGlzdCBiYXNlZCBvbiB0aGUgY3VycmVudCBiYW5kIHdlIGFyZSBvbi4KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8ubnVtT2ZDaGFubmVsczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5DaGFubmVsTGlzdFtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gYWRkIG9ubHkgaWYgaXRzIHRoZSBzYW1lIGJhbmQKKyAgICAgICAgICAgICAgICBpZiAoKHBOZWlnaGJvclJvYW1JbmZvLT5jdXJyQVBvcGVyYXRpb25DaGFubmVsIDw9IChSRl9DSEFOXzE0KzEpKSAmJgorICAgICAgICAgICAgICAgICAgICAocE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5DaGFubmVsTGlzdFtpXSA8PSAoUkZfQ0hBTl8xNCsxKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFIChWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBbSU5GT0xPR10gQWRkaW5nICVkIHRvIE5laWdoYm9yIGNoYW5uZWwgbGlzdFxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbExpc3RbbnVtT2ZDaGFubmVsc10gPSBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W2ldOworICAgICAgICAgICAgICAgICAgICAgICAgbnVtT2ZDaGFubmVscysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHBOZWlnaGJvclJvYW1JbmZvLT5jdXJyQVBvcGVyYXRpb25DaGFubmVsID49IFJGX0NIQU5fMTI4KSAmJgorICAgICAgICAgICAgICAgICAgICAocE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5DaGFubmVsTGlzdFtpXSA+PSBSRl9DSEFOXzEyOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFIChWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBbSU5GT0xPR10gQWRkaW5nICVkIHRvIE5laWdoYm9yIGNoYW5uZWwgbGlzdFxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3RbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbExpc3RbbnVtT2ZDaGFubmVsc10gPSBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0W2ldOworICAgICAgICAgICAgICAgICAgICAgICAgbnVtT2ZDaGFubmVscysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5udW1PZkNoYW5uZWxzID0gbnVtT2ZDaGFubmVsczsKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsgCisgICAgICAgIGlmIChudW1PZkNoYW5uZWxzKQorICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0gdm9zX21lbV9tYWxsb2MobnVtT2ZDaGFubmVscyk7CisgICAgCisgICAgICAgIGlmIChOVUxMID09IHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgQ2hhbm5lbCBsaXN0IGZhaWxlZC4uIFRMIGV2ZW50IGlnbm9yZWQiKSk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX1JFU09VUkNFUzsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvKiBTaW5jZSB0aGlzIGlzIGEgbGVnYWN5IGNhc2UsIGNvcHkgdGhlIGNoYW5uZWwgbGlzdCBmcm9tIENGRyBoZXJlICovCisgICAgICAgIHZvc19tZW1fY29weShwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTGlzdCwgbnVtT2ZDaGFubmVscyAqIHNpemVvZih0QU5JX1U4KSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5udW1PZkNoYW5uZWxzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HRSwgIkNoYW5uZWwgTGlzdCBmcm9tIENGRyA9ICVkXG4iLCAKKyAgICAgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8uQ2hhbm5lbExpc3RbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogV2UgYXJlIGdvbm5hIHNjYW4gbm93LiBSZW1lbWJlciB0aGUgdGltZSBzdGFtcCB0byBmaWx0ZXIgb3V0IHJlc3VsdHMgb25seSBhZnRlciB0aGlzIHRpbWVzdGFtcCAqLworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5zY2FuUmVxdWVzdFRpbWVTdGFtcCA9ICh0QU5JX1RJTUVTVEFNUClwYWxHZXRUaWNrQ291bnQocE1hYy0+aEhkZCk7CisgICAgCisgICAgcGFsVGltZXJTdG9wKHBNYWMtPmhIZGQsIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclNjYW5UaW1lcik7CisgICAgLyogU3RhcnQgTmVpZ2hib3Igc2NhbiB0aW1lciBub3cuIE11bHRpcGxpY2F0aW9uIGJ5IFBBTF9USU1FUl9UT19NU19VTklUIGlzIHRvIGNvbnZlcnQgbXMgdG8gdXMgd2hpY2ggaXMgCisgICAgICAgICAgICB3aGF0IHBhbFRpbWVyU3RhcnQgZXhwZWN0cyAqLworICAgIHN0YXR1cyA9IHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yU2NhblRpbWVyLCAKKyAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclNjYW5QZXJpb2QgKiBQQUxfVElNRVJfVE9fTVNfVU5JVCwgCisgICAgICAgICAgICAgICAgICAgIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgCisgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgIHsKKyAgICAgICAgLyogVGltZXIgc3RhcnQgZmFpbGVkLi4gICovCisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiTmVpZ2hib3Igc2NhbiBQQUwgVGltZXIgc3RhcnQgZmFpbGVkLCBzdGF0dXMgPSAlZCwgSWdub3Jpbmcgc3RhdGUgdHJhbnNpdGlvbiIpLCBzdGF0dXMpOworICAgICAgICB2b3NfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KTsKKyAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKyAgICAKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFuSW5kZXggPSAwOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY2hhbkxpc3RTY2FuSW5Qcm9ncmVzcyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIAorICAgIC8qIFRyYW5zaXRpb24gdG8gQ0ZHX0NIQU5fTElTVF9TQ0FOX1NUQVRFICovCisgICAgQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfVFJBTlNJVElPTihlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ0ZHX0NIQU5fTElTVF9TQ0FOKQorCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBVcEV2ZW50CisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIHNvb24gYXMgVEwgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgQVAncyAKKyAgICAgICAgICAgIFJTU0kgaXMgYmV0dGVyIHRoYW4gdGhlIG5laWdoYm9yIGxvb2t1cCB0aHJlc2hvbGQuIEhlcmUsIHdlIHRyYW5zaXRpb24gdG8gCisgICAgICAgICAgICBDT05ORUNURUQgc3RhdGUgYW5kIHJlc2V0IGFsbCB0aGUgc2NhbiBwYXJhbWV0ZXJzCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBjb3JyZXNwb25kaW5nIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTICBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cFVwRXZlbnQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvICAgIHBOZWlnaGJvclJvYW1JbmZvID0gJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mbzsKKyAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXM7CisKKyAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzIsIEZMKCJEZXJlZ2lzdGVyaW5nIFVQIGV2ZW50IG5laWdoYm9yIGxvb2t1cCBjYWxsYmFjayB3aXRoIFRMLiBSU1NJID0gJWQsIiksIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgKiAoLTEpKTsKKyAgICAvKiBEZXJlZ2lzdGVyIHRoZSBVUCBldmVudCBub3cgKi8KKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsICh2X1M3X3QpcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvckxvb2t1cFRocmVzaG9sZCAqICgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfSE9fVEhSRVNIT0xEX1VQLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzck5laWdoYm9yUm9hbU5laWdoYm9yTG9va3VwVVBDYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTU9EVUxFX0lEX1NNRSk7CisKKyAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgeworICAgICAgIC8vZXJyIG1zZworICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiIENvdWxkbid0IERlcmVnaXN0ZXIgY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBDYWxsYmFjayBVUCBldmVudCBmcm9tIFRMOiBTdGF0dXMgPSAlZFxuIiksIHZvc1N0YXR1cyk7CisgICAgfQorCisgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cyLCBGTCgiRGVyZWdpc3RlcmluZyBET1dOIGV2ZW50IG5laWdoYm9yIGxvb2t1cCBjYWxsYmFjayB3aXRoIFRMLiBSU1NJID0gJWQsIiksIHBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50TmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgKiAoLTEpKTsKKyAgICAvKiBEZXJlZ2lzdGVyIHRoZSBVUCBldmVudCBub3cgKi8KKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsICh2X1M3X3QpcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnROZWlnaGJvckxvb2t1cFRocmVzaG9sZCAqICgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfSE9fVEhSRVNIT0xEX0RPV04sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBET1dOQ2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01PRFVMRV9JRF9TTUUpOworCisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgIHsKKyAgICAgICAvL2VyciBtc2cKKyAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBDb3VsZG4ndCBEZXJlZ2lzdGVyIGNzck5laWdoYm9yUm9hbU5laWdoYm9yTG9va3VwQ2FsbGJhY2sgVVAgZXZlbnQgZnJvbSBUTDogU3RhdHVzID0gJWRcbiIpLCB2b3NTdGF0dXMpOworICAgIH0KKworICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwgRkwoIkRlcmVnaXN0ZXJpbmcgRE9XTiBldmVudCByZWFzc29jIGNhbGxiYWNrIHdpdGggVEwuIFJTU0kgPSAlZCIpLCBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLm5laWdoYm9yUmVhc3NvY1RocmVzaG9sZCAqICgtMSkpOworICAgIC8qIERlcmVnaXN0ZXIgcmVhc3NvYyBjYWxsYmFjay4gKi8KKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsICh2X1M3X3QpcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclJlYXNzb2NUaHJlc2hvbGQgKiAoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfSE9fVEhSRVNIT0xEX0RPV04sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1SZWFzc29jSW5kQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NT0RVTEVfSURfU01FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICB7CisgICAgICAgIC8vZXJyIG1zZworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBDb3VsZG4ndCBkZXJlZ2lzdGVyIGNzck5laWdoYm9yUm9hbVJlYXNzb2NJbmRDYWxsYmFjayB3aXRoIFRMOiBTdGF0dXMgPSAlZFxuIiksIHZvc1N0YXR1cyk7CisgICAgfQorCisKKyAgICAvKiBSU1NJIGdvdCBiZXR0ZXIgdGhhbiB0aGUgQ0ZHIG5laWdoYm9yIGxvb2t1cCB0aHJlc2hvbGQuIFJlc2V0IHRoZSB0aHJlc2hvbGQgdG8gb2xkZXIgdmFsdWUgYW5kIHNldCB0aGUgaW5jcmVtZW50IG11bHRpcGxpZXIgdG8gMCAqLworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50TG9va3VwSW5jcmVtZW50TXVsdGlwbGllciA9IDA7CisKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudE5laWdoYm9yTG9va3VwVGhyZXNob2xkID0gcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvckxvb2t1cFRocmVzaG9sZDsKKyAgICAKKyAgICAvKiBSZXNldCBhbGwgdGhlIG5laWdoYm9yIHJvYW0gaW5mbyBjb250cm9sIHZhcmlhYmxlcy4gRnJlZSBhbGwgdGhlIGFsbG9jYXRlZCBtZW1vcnkuIEl0IGlzIGxpa2Ugd2UgYXJlIGp1c3QgYXNzb2NpYXRlZCBub3cgKi8KKyAgICBjc3JOZWlnaGJvclJvYW1SZXNldENvbm5lY3RlZFN0YXRlQ29udHJvbEluZm8ocE1hYyk7CisKKyAgICAvKiBSZWNoZWNrIHdoZXRoZXIgdGhlIGJlbG93IGNoZWNrIGlzIG5lZWRlZC4gKi8KKyAgICBpZiAocE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlICE9IGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DT05ORUNURUQpCisgICAgICAgIENTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04oZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NPTk5FQ1RFRCkKKyAgICAKKyAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzIsIEZMKCJSZWdpc3RlcmluZyBET1dOIGV2ZW50IG5laWdoYm9yIGxvb2t1cCBjYWxsYmFjayB3aXRoIFRMLiBSU1NJID0gJWQsIiksIHBOZWlnaGJvclJvYW1JbmZvLT5jdXJyZW50TmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgKiAoLTEpKTsKKyAgICAvKiBSZWdpc3RlciBOZWlnaGJvciBMb29rdXAgdGhyZXNob2xkIGNhbGxiYWNrIHdpdGggVEwgZm9yIERPV04gZXZlbnQgbm93ICovCisgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlZ1JTU0lJbmRpY2F0aW9uQ0IocE1hYy0+cm9hbS5nVm9zQ29udGV4dCwgKHZfUzdfdClwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudE5laWdoYm9yTG9va3VwVGhyZXNob2xkICogKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9IT19USFJFU0hPTERfRE9XTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cERPV05DYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTU9EVUxFX0lEX1NNRSwgcE1hYyk7CisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgIHsKKyAgICAgICAvL2VyciBtc2cKKyAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBDb3VsZG4ndCByZWdpc3RlciBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cENhbGxiYWNrIERPV04gZXZlbnQgd2l0aCBUTDogU3RhdHVzID0gJWRcbiIpLCB2b3NTdGF0dXMpOworICAgIH0KKworCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBEb3duRXZlbnQKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXMgc29vbiBhcyBUTCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCBBUCdzIAorICAgICAgICAgICAgUlNTSSBmYWxscyBiZWxvdyB0aGUgY3VycmVudCBlaWdoYm9yIGxvb2t1cCB0aHJlc2hvbGQuIEhlcmUsIHdlIHRyYW5zaXRpb24gdG8gCisgICAgICAgICAgICBSRVBPUlRfUVVFUlkgZm9yIDExciBhc3NvY2lhdGlvbiBhbmQgQ0ZHX0NIQU5fTElTVF9TQ0FOIHN0YXRlIGlmIHRoZSBhc3NvYyBpcyAKKyAgICAgICAgICAgIGEgbm9uLTExUiBhc3NvY2lhdGlvbi4KKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICAgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZSBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgIGNzck5laWdoYm9yUm9hbU5laWdoYm9yTG9va3VwRG93bkV2ZW50KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyAgICBwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm87CisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIGVIYWxTdGF0dXMgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBzd2l0Y2ggKHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cyLCBGTCgiRGVyZWdpc3RlcmluZyBET1dOIGV2ZW50IG5laWdoYm9yIGxvb2t1cCBjYWxsYmFjayB3aXRoIFRMLiBSU1NJID0gJWQsIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnROZWlnaGJvckxvb2t1cFRocmVzaG9sZCAqICgtMSkpOworICAgICAgICAgICAgLyogRGUtcmVnaXN0ZXIgTmVpZ2hib3IgTG9va3VwIHRocmVzaG9sZCBjYWxsYmFjayB3aXRoIFRMICovCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsICh2X1M3X3QpcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnROZWlnaGJvckxvb2t1cFRocmVzaG9sZCAqICgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9IT19USFJFU0hPTERfRE9XTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzck5laWdoYm9yUm9hbU5laWdoYm9yTG9va3VwRE9XTkNhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01PRFVMRV9JRF9TTUUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiIENvdWxkbid0IERlcmVnaXN0ZXIgY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBDYWxsYmFjayBET1dOIGV2ZW50IGZyb20gVEw6IFN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICYmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgICAgICAgICAgaWYgKChwTmVpZ2hib3JSb2FtSW5mby0+aXMxMXJBc3NvYykgJiYgKHBNYWMtPnJybS5ycm1TbWVDb250ZXh0LnJybUNvbmZpZy5ycm1FbmFibGVkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HRSwgRkwoIjExUiBBc3NvY2lhdGlvbjpOZWlnaGJvciBMb29rdXAgRG93biBldmVudCByZWNlaXZlZCBpbiBDT05ORUNURUQgc3RhdGUiKSk7CisgICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gY3NyTmVpZ2hib3JSb2FtSXNzdWVOZWlnaGJvclJwdFJlcXVlc3QocE1hYyk7CisgICAgICAgICAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIk5laWdoYm9yIHJlcG9ydCByZXF1ZXN0IGZhaWxlZC4gc3RhdHVzID0gJWRcbiIpLCB2b3NTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIG5laWdoYm9yIHJlcG9ydCByZXRyeSBjb3VudCBhZnRlciBzZW5kaW5nIHRoZSBuZWlnaGJvciByZXF1ZXN0IHN1Y2Nlc3NmdWxseSAqLworICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLmN1cnJlbnROZWlnaGJvclJwdFJldHJ5TnVtKys7CisgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ubmVpZ2hib3JScHRQZW5kaW5nID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfVFJBTlNJVElPTihlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUkVQT1JUX1FVRVJZKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmICAgICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0cyLCBGTCgiTm9uIDExUiBvciBDQ1ggQXNzb2NpYXRpb246TmVpZ2hib3IgTG9va3VwIERvd24gZXZlbnQgcmVjZWl2ZWQgaW4gQ09OTkVDVEVEIHN0YXRlIikpOworCisgICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gY3NyTmVpZ2hib3JSb2FtVHJhbnNpdFRvQ0ZHQ2hhblNjYW4ocE1hYyk7CisgICAgICAgICAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwgRkwoIlJlZ2lzdGVyaW5nIFVQIGV2ZW50IG5laWdoYm9yIGxvb2t1cCBjYWxsYmFjayB3aXRoIFRMLiBSU1NJID0gJWQsIiksIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgKiAoLTEpKTsKKyAgICAgICAgICAgIC8qIFJlZ2lzdGVyIE5laWdoYm9yIExvb2t1cCB0aHJlc2hvbGQgY2FsbGJhY2sgd2l0aCBUTCBmb3IgVVAgZXZlbnQgbm93ICovCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVnUlNTSUluZGljYXRpb25DQihwTWFjLT5yb2FtLmdWb3NDb250ZXh0LCAodl9TN190KXBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgKiAoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfSE9fVEhSRVNIT0xEX1VQLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBVUENhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01PRFVMRV9JRF9TTUUsIHBNYWMpOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLy9lcnIgbXNnCisgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiBDb3VsZG4ndCByZWdpc3RlciBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cENhbGxiYWNrIFVQIGV2ZW50IHdpdGggVEw6IFN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJET1dOIGV2ZW50IHJlY2VpdmVkIGluIGludmFsaWQgc3RhdGUgJWQuLklnbm9yaW5nLi4uIiksIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgIH0KKyAgICByZXR1cm4gdm9zU3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cFVQQ2FsbGJhY2sKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHdpdGggVEwgdG8gaW5kaWNhdGUgd2hlbmV2ZXIgdGhlIFJTU0kgCisgICAgICAgICAgICBnZXRzIGJldHRlciB0aGFuIHRoZSBuZWlnaGJvckxvb2t1cCBSU1NJIFRocmVzaG9sZAorCisgICAgXHBhcmFtICBwQWRhcHRlciAtIFZPUyBDb250ZXh0CisgICAgICAgICAgICB0cmFmZmljU3RhdHVzIC0gVVAvRE9XTiBpbmRpY2F0aW9uIGZyb20gVEwKKyAgICAgICAgICAgIHBVc2VyQ3R4dCAtIFBhcmFtZXRlciBmb3IgY2FsbGJhY2sgcmVnaXN0ZXJlZCBkdXJpbmcgY2FsbGJhY2sgcmVnaXN0cmF0aW9uLiBTaG91bGQgYmUgcE1hYworCisgICAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlIG90aGVyd2lzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBjc3JOZWlnaGJvclJvYW1OZWlnaGJvckxvb2t1cFVQQ2FsbGJhY2sgKHZfUFZPSURfdCBwQWRhcHRlciwgdl9VOF90IHJzc2lOb3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9QVk9JRF90IHBVc2VyQ3R4dCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIHBVc2VyQ3R4dCApOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsIEZMKCJOZWlnaGJvciBMb29rdXAgVVAgaW5kaWNhdGlvbiBjYWxsYmFjayBjYWxsZWQgd2l0aCBub3RpZmljYXRpb24gJWQiKSwgcnNzaU5vdGlmaWNhdGlvbik7CisKKyAgICBpZighY3NySXNDb25uU3RhdGVDb25uZWN0ZWRJbmZyYShwTWFjLCBwTmVpZ2hib3JSb2FtSW5mby0+Y3NyU2Vzc2lvbklkKSkKKyAgICB7CisgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJJZ25vcmluZyB0aGUgaW5kaWNhdGlvbiBhcyB3ZSBhcmUgbm90IGNvbm5lY3RlZFxuIik7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBWT1NfQVNTRVJUKFdMQU5UTF9IT19USFJFU0hPTERfVVAgPT0gcnNzaU5vdGlmaWNhdGlvbik7CisgICAgdm9zU3RhdHVzID0gY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBVcEV2ZW50KHBNYWMpOworICAgIHJldHVybiB2b3NTdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbU5laWdoYm9yTG9va3VwRE9XTkNhbGxiYWNrCisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIFRMIHRvIGluZGljYXRlIHdoZW5ldmVyIHRoZSBSU1NJIAorICAgICAgICAgICAgZmFsbHMgYmVsb3cgdGhlIGN1cnJlbnQgbmVpZ2hib3JMb29rdXAgUlNTSSBUaHJlc2hvbGQKKworICAgIFxwYXJhbSAgcEFkYXB0ZXIgLSBWT1MgQ29udGV4dAorICAgICAgICAgICAgdHJhZmZpY1N0YXR1cyAtIFVQL0RPV04gaW5kaWNhdGlvbiBmcm9tIFRMCisgICAgICAgICAgICBwVXNlckN0eHQgLSBQYXJhbWV0ZXIgZm9yIGNhbGxiYWNrIHJlZ2lzdGVyZWQgZHVyaW5nIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbi4gU2hvdWxkIGJlIHBNYWMKKworICAgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZSBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBET1dOQ2FsbGJhY2sgKHZfUFZPSURfdCBwQWRhcHRlciwgdl9VOF90IHJzc2lOb3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9QVk9JRF90IHBVc2VyQ3R4dCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIHBVc2VyQ3R4dCApOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsIEZMKCJOZWlnaGJvciBMb29rdXAgRE9XTiBpbmRpY2F0aW9uIGNhbGxiYWNrIGNhbGxlZCB3aXRoIG5vdGlmaWNhdGlvbiAlZCIpLCByc3NpTm90aWZpY2F0aW9uKTsKKworICAgIGlmKCFjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZEluZnJhKHBNYWMsIHBOZWlnaGJvclJvYW1JbmZvLT5jc3JTZXNzaW9uSWQpKQorICAgIHsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIklnbm9yaW5nIHRoZSBpbmRpY2F0aW9uIGFzIHdlIGFyZSBub3QgY29ubmVjdGVkXG4iKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIFZPU19BU1NFUlQoV0xBTlRMX0hPX1RIUkVTSE9MRF9ET1dOID09IHJzc2lOb3RpZmljYXRpb24pOworICAgIHZvc1N0YXR1cyA9IGNzck5laWdoYm9yUm9hbU5laWdoYm9yTG9va3VwRG93bkV2ZW50KHBNYWMpOworCisgICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworI2lmZGVmIFJTU0lfSEFDSworZXh0ZXJuIGludCBkdW1wQ21kUlNTSTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1JbmRpY2F0ZURpc2Nvbm5lY3QKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ1NSIGFzIHNvb24gYXMgdGhlIHN0YXRpb24gZGlzY29ubmVjdHMgZnJvbSAKKyAgICAgICAgICAgIHRoZSBBUC4gVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBuZWNlc3NhcnkgY2xlYW51cCBvZiBuZWlnaGJvciByb2FtIGRhdGEgCisgICAgICAgICAgICBzdHJ1Y3R1cmVzLiBOZWlnaGJvciByb2FtIHN0YXRlIHRyYW5zaXRpb25zIHRvIElOSVQgc3RhdGUgd2hlbmV2ZXIgdGhpcyAKKyAgICAgICAgICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBleGNlcHQgaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgUkVBU1NPQ0lBVElORworCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgICAgICAgICAgc2Vzc2lvbklkIC0gQ1NSIHNlc3Npb24gaWQgdGhhdCBnb3QgZGlzY29ubmVjdGVkCisKKyAgICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlIG90aGVyd2lzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JOZWlnaGJvclJvYW1JbmRpY2F0ZURpc2Nvbm5lY3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBzZXNzaW9uSWQpCit7CisgICAgdHBDc3JOZWlnaGJvclJvYW1Db250cm9sSW5mbyAgICBwTmVpZ2hib3JSb2FtSW5mbyA9ICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm87CisKKyAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkRpc2Nvbm5lY3QgaW5kaWNhdGlvbiByZWNlaXZlZCB3aXRoIHNlc3Npb24gaWQgJWQgaW4gc3RhdGUgJWQiKSwgc2Vzc2lvbklkLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpOworIAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICB7CisgICAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQpOworICAgICAgaWYgKHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmlzQ0NYQXNzb2MpCisgICAgICB7CisgICAgICAgICAgdm9zX21lbV9jb3B5KCZwU2Vzc2lvbi0+cHJldkFwU1NJRCwgJnBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLlNTSUQsIHNpemVvZih0U2lyTWFjU1NpZCkpOworICAgICAgICAgIHZvc19tZW1fY29weShwU2Vzc2lvbi0+cHJldkFwQnNzaWQsIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgICBwU2Vzc2lvbi0+cHJldk9wQ2hhbm5lbCA9IHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWw7CisgICAgICAgICAgcFNlc3Npb24tPmlzUHJldkFwSW5mb1ZhbGlkID0gVFJVRTsKKyAgICAgICAgICBwU2Vzc2lvbi0+cm9hbVRTMSA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKKworICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgCisjaWZkZWYgUlNTSV9IQUNLCisgICAgZHVtcENtZFJTU0kgPSAtNDA7CisjZW5kaWYKKyAgICBzd2l0Y2ggKHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1JFQVNTT0NJQVRJTkc6CisgICAgICAgICAgICAvLyBTdG9wIHNjYW4gYW5kIG5laWdoYm9yIHJlZnJlc2ggdGltZXJzLgorICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGluZGVlZCBub3QgcmVxdWlyZWQgd2hlbiB3ZSBhcmUgaW4gcmVhc3NvY2lhdGluZworICAgICAgICAgICAgLy8gc3RhdGUuCisgICAgICAgICAgICBwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yU2NhblRpbWVyKTsKKyAgICAgICAgICAgIHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSZXN1bHRzUmVmcmVzaFRpbWVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsIEZMKCJJZ25vcmluZyBkaXNjb25uZWN0IGV2ZW50IGluIElOSVQgc3RhdGUiKSk7CisgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1SZXNldEluaXRTdGF0ZUNvbnRyb2xJbmZvKHBNYWMpOworICAgICAgICAgICAgYnJlYWs7IAorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsIEZMKCJSZWNlaXZlZCBkaXNjb25uZWN0IGV2ZW50IGluIHN0YXRlICVkIiksIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSk7CisgICAgICAgICAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPR0UsIEZMKCJUcmFuc2l0aW9uaW5nIHRvIElOSVQgc3RhdGUiKSk7CisgICAgICAgICAgICBDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9JTklUKQorICAgIH0KKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gY3NyTmVpZ2hib3JSb2FtSW5kaWNhdGVDb25uZWN0CisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IENTUiBhcyBzb29uIGFzIHRoZSBzdGF0aW9uIGNvbm5lY3RzIHRvIGFuIEFQLgorICAgICAgICAgICAgVGhpcyBpbml0aWFsaXplcyBhbGwgdGhlIG5lY2Vzc2FyeSBkYXRhIHN0cnVjdHVyZXMgcmVsYXRlZCB0byB0aGUgCisgICAgICAgICAgICBhc3NvY2lhdGVkIEFQIGFuZCB0cmFuc2l0aW9ucyB0aGUgc3RhdGUgdG8gQ09OTkVDVEVEIHN0YXRlCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgICAgICAgICBzZXNzaW9uSWQgLSBDU1Igc2Vzc2lvbiBpZCB0aGF0IGdvdCBjb25uZWN0ZWQKKyAgICAgICAgICAgIHZvc1N0YXR1cyAtIGNvbm5lY3Qgc3RhdHVzIFNVQ0NFU1MvRkFJTFVSRQorCisgICAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZSBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyTmVpZ2hib3JSb2FtSW5kaWNhdGVDb25uZWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggc2Vzc2lvbklkLCBWT1NfU1RBVFVTIHZvc1N0YXR1cykKK3sKKyAgICB0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvICAgIHBOZWlnaGJvclJvYW1JbmZvID0gJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mbzsKKyAgICBlSGFsU3RhdHVzICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworI2lmICBkZWZpbmVkIChXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUikgfHwgZGVmaW5lZCAoRkVBVFVSRV9XTEFOX0NDWCkKKyAgICBpbnQgIGluaXRfZnRfZmxhZyA9IEZBTFNFOworI2VuZGlmCisKKyAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNvbm5lY3QgaW5kaWNhdGlvbiByZWNlaXZlZCB3aXRoIHNlc3Npb24gaWQgJWQgaW4gc3RhdGUgJWQiKSwgc2Vzc2lvbklkLCBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpOworCisgICAgc3dpdGNoIChwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSb2FtU3RhdGUpCisgICAgeworICAgICAgICBjYXNlIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRUFTU09DSUFUSU5HOgorICAgICAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSnVzdCB0cmFuc2l0aW9uIHRoZSBzdGF0ZSB0byBJTklUIHN0YXRlLiBSZXN0IG9mIHRoZSBjbGVhbiB1cCBoYXBwZW5zIHdoZW4gd2UgZ2V0IG5leHQgY29ubmVjdCBpbmRpY2F0aW9uICovCisgICAgICAgICAgICAgICAgQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfVFJBTlNJVElPTihlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfSU5JVCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCBpZiB0aGUgc3RhdHVzIGlzIFNVQ0NFU1MgKi8KKyAgICAgICAgY2FzZSBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfSU5JVDoKKyAgICAgICAgICAgIC8qIFJlc2V0IGFsbCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGhlcmUgKi8gCisgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1SZXNldEluaXRTdGF0ZUNvbnRyb2xJbmZvKHBNYWMpOworCisgICAgICAgICAgICBDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9DT05ORUNURUQpCisKKyAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jc3JTZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkocE5laWdoYm9yUm9hbUluZm8tPmN1cnJBUGJzc2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0ZWRQcm9maWxlLmJzc2lkLCBzaXplb2YodENzckJzc2lkKSk7CisgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+Y3VyckFQb3BlcmF0aW9uQ2hhbm5lbCA9IHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWw7CisgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JTY2FuVGltZXJJbmZvLnBNYWMgPSBwTWFjOworICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yU2NhblRpbWVySW5mby5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgICAgICAKKyNpZiAgZGVmaW5lZCAoV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIpIHx8IGRlZmluZWQgKEZFQVRVUkVfV0xBTl9DQ1gpCisgICAgICAgICAgICAvKiBOb3cgd2UgY2FuIGNsZWFyIHRoZSBwcmVhdXRoRG9uZSB0aGF0IHdhcyBzYXZlZCBhcyB3ZSBhcmUgY29ubmVjdGVkIGFmcmVzaCAqLworICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtRnJlZVJvYW1hYmxlQlNTTGlzdChwTWFjLCAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLkZUUm9hbUluZm8ucHJlQXV0aERvbmVMaXN0KTsKKyNlbmRpZgorICAgICAgICAgICAgCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgICAgICAgIC8vIEJhc2VkIG9uIHRoZSBhdXRoIHNjaGVtZSB0ZWxsIGlmIHdlIGFyZSAxMXIKKyAgICAgICAgICAgIGlmICggY3NySXNBdXRoVHlwZTExciggcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGUuQXV0aFR5cGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uaXNGYXN0VHJhbnNpdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgICAgIGluaXRfZnRfZmxhZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgcE5laWdoYm9yUm9hbUluZm8tPmlzMTFyQXNzb2MgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+aXMxMXJBc3NvYyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HRSwgRkwoIjExckFzc29jIGlzID0gJWQiKSwgcE5laWdoYm9yUm9hbUluZm8tPmlzMTFyQXNzb2MpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgICAvLyBCYXNlZCBvbiB0aGUgYXV0aCBzY2hlbWUgdGVsbCBpZiB3ZSBhcmUgMTFyCisgICAgICAgICAgICBpZiAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGUuaXNDQ1hBc3NvYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocE1hYy0+cm9hbS5jb25maWdQYXJhbS5pc0Zhc3RUcmFuc2l0aW9uRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgaW5pdF9mdF9mbGFnID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+aXNDQ1hBc3NvYyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5pc0NDWEFzc29jID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dFLCBGTCgiaXNDQ1hBc3NvYyBpcyA9ICVkIiksIHBOZWlnaGJvclJvYW1JbmZvLT5pc0NDWEFzc29jKTsKKyAgICAgICAgICAgIFZPU19UUkFDRSAoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAiY2N4PSVkIGZ0PSVkXG4iLCBwTmVpZ2hib3JSb2FtSW5mby0+aXNDQ1hBc3NvYywgaW5pdF9mdF9mbGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNlbmRpZgorCisjaWYgIGRlZmluZWQgKFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSKSB8fCBkZWZpbmVkIChGRUFUVVJFX1dMQU5fQ0NYKQorICAgICAgICAgICAgaWYgKCBpbml0X2Z0X2ZsYWcgPT0gVFJVRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBhbGwgdGhlIGRhdGEgc3RydWN0dXJlcyBuZWVkZWQgZm9yIHRoZSAxMXIgRlQgUHJlYXV0aCAqLworICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhSc3BXYWl0VGltZXJJbmZvLnBNYWMgPSBwTWFjOworICAgICAgICAgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhSc3BXYWl0VGltZXJJbmZvLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5jdXJyZW50TmVpZ2hib3JScHRSZXRyeU51bSA9IDA7CisgICAgICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtUHVyZ2VQcmVhdXRoRmFpbGVkTGlzdChwTWFjKTsKKworICAgICAgICAgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMiwgRkwoIlJlZ2lzdGVyaW5nIG5laWdoYm9yIGxvb2t1cCBET1dOIGV2ZW50IHdpdGggVEwsIFJTU0kgPSAlZCIpLCBwTmVpZ2hib3JSb2FtSW5mby0+Y3VycmVudE5laWdoYm9yTG9va3VwVGhyZXNob2xkKTsKKyAgICAgICAgICAgICAgICAvKiBSZWdpc3RlciBOZWlnaGJvciBMb29rdXAgdGhyZXNob2xkIGNhbGxiYWNrIHdpdGggVEwgZm9yIERPV04gZXZlbnQgb25seSAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFdMQU5UTF9SZWdSU1NJSW5kaWNhdGlvbkNCKHBNYWMtPnJvYW0uZ1Zvc0NvbnRleHQsICh2X1M3X3QpcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnROZWlnaGJvckxvb2t1cFRocmVzaG9sZCAqICgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9IT19USFJFU0hPTERfRE9XTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzck5laWdoYm9yUm9hbU5laWdoYm9yTG9va3VwRE9XTkNhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01PRFVMRV9JRF9TTUUsIHBNYWMpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgLy9lcnIgbXNnCisgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgQ291bGRuJ3QgcmVnaXN0ZXIgY3NyTmVpZ2hib3JSb2FtTmVpZ2hib3JMb29rdXBET1dOQ2FsbGJhY2sgd2l0aCBUTDogU3RhdHVzID0gJWRcbiIpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDb25uZWN0IGV2ZW50IHJlY2VpdmVkIGluIGludmFsaWQgc3RhdGUgJWQuLklnbm9yaW5nLi4uIiksIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbVByZUF1dGhSZXNwb25zZVdhaXRUaW1lckhhbmRsZXIKKworICAgIFxicmllZiAgSWYgdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkLCB0aGF0IG1lYW5zIHRoZSBwcmVhdXRoZW50aWNhdGlvbiByZXNwb25zZSAKKyAgICAgICAgICAgIGlzIHRpbWVkIG91dCBmcm9tIHRoZSBQRS4gUHJlYXV0aCByc3AgaGFuZGxlciBpcyBjYWxsZWQgd2l0aCBzdGF0dXMgYXMgCisgICAgICAgICAgICBUSU1FT1VUCisKKyAgICBccGFyYW0gIGNvbnRleHQgLSBDU1IgVGltZXIgaW5mbyB3aGljaCBob2xkcyBwTWFjIGFuZCBzZXNzaW9uIElECisKKyAgICBccmV0dXJuIFZPSUQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyTmVpZ2hib3JSb2FtUHJlQXV0aFJlc3BvbnNlV2FpdFRpbWVySGFuZGxlcih2b2lkICpjb250ZXh0KQoreworICAgIHRDc3JUaW1lckluZm8gKnBUaW1lckluZm8gPSAodENzclRpbWVySW5mbyAqKWNvbnRleHQ7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbClwVGltZXJJbmZvLT5wTWFjOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworCisgICAgcE5laWdoYm9yUm9hbUluZm8tPkZUUm9hbUluZm8ucHJlYXV0aFJzcFBlbmRpbmcgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICBjc3JOZWlnaGJvclJvYW1QcmVhdXRoUnNwSGFuZGxlcihwTWFjLCBWT1NfU1RBVFVTX0VfVElNRU9VVCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbVB1cmdlUHJlYXV0aEZhaWxlZExpc3QKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBwdXJnZXMgYWxsIHRoZSBNQUMgYWRkcmVzc2VzIGluIHRoZSBwcmUtYXV0aCBmYWlsIGxpc3QKKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICAgIFxyZXR1cm4gVk9JRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjc3JOZWlnaGJvclJvYW1QdXJnZVByZWF1dGhGYWlsZWRMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5GVFJvYW1JbmZvLnByZUF1dGhGYWlsTGlzdC5udW1NQUNBZGRyZXNzOyBpKyspCisgICAgeworICAgICAgICB2b3NfbWVtX3plcm8ocE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLkZUUm9hbUluZm8ucHJlQXV0aEZhaWxMaXN0Lm1hY0FkZHJlc3NbaV0sIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIH0KKyAgICBwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8uRlRSb2FtSW5mby5wcmVBdXRoRmFpbExpc3QubnVtTUFDQWRkcmVzcyA9IDA7CisKKyAgICByZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbUluaXQxMXJBc3NvY0luZm8KKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyAxMXIgcmVsYXRlZCBuZWlnaGJvciByb2FtIGRhdGEgc3RydWN0dXJlcworCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZSBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyTmVpZ2hib3JSb2FtSW5pdDExckFzc29jSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgIHN0YXR1czsKKyAgICB0cENzcjExckFzc29jTmVpZ2hib3JJbmZvICAgcEZUUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLkZUUm9hbUluZm87CisKKyAgICBwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8uaXMxMXJBc3NvYyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8uY2ZnUGFyYW1zLm1heE5laWdoYm9yUmV0cmllcyA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5NYXhOZWlnaGJvclJldHJpZXM7CisgICAgcEZUUm9hbUluZm8tPm5laWdoYm9yUmVwb3J0VGltZW91dCA9IENTUl9ORUlHSEJPUl9ST0FNX1JFUE9SVF9RVUVSWV9USU1FT1VUOworICAgIHBGVFJvYW1JbmZvLT5QRVByZWF1dGhSZXNwVGltZW91dCA9IENTUl9ORUlHSEJPUl9ST0FNX1BSRUFVVEhfUlNQX1dBSVRfTVVMVElQTElFUiAqIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5jZmdQYXJhbXMubmVpZ2hib3JTY2FuUGVyaW9kOworICAgIHBGVFJvYW1JbmZvLT5uZWlnaGJvclJwdFBlbmRpbmcgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgcEZUUm9hbUluZm8tPnByZWF1dGhSc3BQZW5kaW5nID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIAorICAgIHBGVFJvYW1JbmZvLT5wcmVBdXRoUnNwV2FpdFRpbWVySW5mby5wTWFjID0gcE1hYzsKKyAgICBwRlRSb2FtSW5mby0+cHJlQXV0aFJzcFdhaXRUaW1lckluZm8uc2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKyAgICBzdGF0dXMgPSBwYWxUaW1lckFsbG9jKHBNYWMtPmhIZGQsICZwRlRSb2FtSW5mby0+cHJlQXV0aFJzcFdhaXRUaW1lciwgCisgICAgICAgICAgICAgICAgICAgIGNzck5laWdoYm9yUm9hbVByZUF1dGhSZXNwb25zZVdhaXRUaW1lckhhbmRsZXIsICh2b2lkICopJnBGVFJvYW1JbmZvLT5wcmVBdXRoUnNwV2FpdFRpbWVySW5mbyk7CisKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlJlc3BvbnNlIHdhaXQgVGltZXIgYWxsb2NhdGlvbiBmYWlsZWQiKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICAgfQorICAgIAorICAgIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5GVFJvYW1JbmZvLmN1cnJlbnROZWlnaGJvclJwdFJldHJ5TnVtID0gMDsKKyAgICBwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8uRlRSb2FtSW5mby5udW1Cc3NGcm9tTmVpZ2hib3JSZXBvcnQgPSAwOworICAgIHZvc19tZW1femVybyhwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8uRlRSb2FtSW5mby5uZWlnaGJvUmVwb3J0QnNzSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRDc3JOZWlnaGJvclJlcG9ydEJzc0luZm8pICogTUFYX0JTU19JTl9ORUlHSEJPUl9SUFQpOworCisgICAgCisgICAgc3RhdHVzID0gY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwRlRSb2FtSW5mby0+cHJlQXV0aERvbmVMaXN0KTsKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkxMIE9wZW4gb2YgcHJlYXV0aCBkb25lIEFQIExpc3QgZmFpbGVkIikpOworICAgICAgICBwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcEZUUm9hbUluZm8tPnByZUF1dGhSc3BXYWl0VGltZXIpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfUkVTT1VSQ0VTOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbUluaXQKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBuZWlnaGJvciByb2FtIGRhdGEgc3RydWN0dXJlcworCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZSBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgY3NyTmVpZ2hib3JSb2FtSW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworCisgICAgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUm9hbVN0YXRlICAgICAgID0gICBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ0xPU0VEOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5wcmV2TmVpZ2hib3JSb2FtU3RhdGUgICA9ICAgZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NMT1NFRDsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+Y3NyU2Vzc2lvbklkICAgICAgICAgICAgPSAgIENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5tYXhDaGFubmVsU2NhblRpbWUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JTY2FuTWF4Q2hhblRpbWU7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5taW5DaGFubmVsU2NhblRpbWUgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JTY2FuTWluQ2hhblRpbWU7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5tYXhOZWlnaGJvclJldHJpZXMgPSAwOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JMb29rdXBUaHJlc2hvbGQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JMb29rdXBSc3NpVGhyZXNob2xkOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMubmVpZ2hib3JSZWFzc29jVGhyZXNob2xkID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yUmVhc3NvY1Jzc2lUaHJlc2hvbGQ7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclNjYW5QZXJpb2QgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLm5laWdoYm9yUm9hbUNvbmZpZy5uTmVpZ2hib3JTY2FuVGltZXJQZXJpb2Q7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5uZWlnaGJvclJlc3VsdHNSZWZyZXNoUGVyaW9kID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubk5laWdoYm9yUmVzdWx0c1JlZnJlc2hQZXJpb2Q7CisgICAgCisgICAgcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5udW1PZkNoYW5uZWxzICAgPSAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubmVpZ2hib3JTY2FuQ2hhbkxpc3QubnVtQ2hhbm5lbHM7CisKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gCisgICAgICAgICAgICAgICAgdm9zX21lbV9tYWxsb2MocE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubmVpZ2hib3JTY2FuQ2hhbkxpc3QubnVtQ2hhbm5lbHMpOworCisgICAgaWYgKE5VTEwgPT0gcE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5DaGFubmVsTGlzdCkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiTWVtb3J5IEFsbG9jYXRpb24gZm9yIENGRyBDaGFubmVsIExpc3QgZmFpbGVkIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfUkVTT1VSQ0VTOworICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgcm9hbSBnbG9iYWwgc3RydWN0dXJlIGZyb20gQ0ZHICovCisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0ubmVpZ2hib3JSb2FtQ29uZmlnLm5laWdoYm9yU2NhbkNoYW5MaXN0LmNoYW5uZWxMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS5jb25maWdQYXJhbS5uZWlnaGJvclJvYW1Db25maWcubmVpZ2hib3JTY2FuQ2hhbkxpc3QubnVtQ2hhbm5lbHMpOworCisgICAgdm9zX21lbV9zZXQocE5laWdoYm9yUm9hbUluZm8tPmN1cnJBUGJzc2lkLCBzaXplb2YodENzckJzc2lkKSwgMCk7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnROZWlnaGJvckxvb2t1cFRocmVzaG9sZCA9IHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5jZmdQYXJhbXMubmVpZ2hib3JMb29rdXBUaHJlc2hvbGQ7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPmN1cnJlbnRMb29rdXBJbmNyZW1lbnRNdWx0aXBsaWVyID0gMDsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+c2NhblJzcFBlbmRpbmcgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JTY2FuVGltZXJJbmZvLnBNYWMgPSBwTWFjOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclNjYW5UaW1lckluZm8uc2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKyAgICBzdGF0dXMgPSBwYWxUaW1lckFsbG9jKHBNYWMtPmhIZGQsICZwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JTY2FuVGltZXIsIAorICAgICAgICAgICAgICAgICAgICBjc3JOZWlnaGJvclJvYW1OZWlnaGJvclNjYW5UaW1lckNhbGxiYWNrLCAodm9pZCAqKSZwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JTY2FuVGltZXJJbmZvKTsKKworICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiUmVzcG9uc2Ugd2FpdCBUaW1lciBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKyAgICAgICAgdm9zX21lbV9mcmVlKHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpOworICAgICAgICBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwYWxUaW1lckFsbG9jKHBNYWMtPmhIZGQsICZwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JSZXN1bHRzUmVmcmVzaFRpbWVyLCAKKyAgICAgICAgICAgICAgICAgICAgY3NyTmVpZ2hib3JSb2FtUmVzdWx0c1JlZnJlc2hUaW1lckNhbGxiYWNrLCAodm9pZCAqKSZwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JTY2FuVGltZXJJbmZvKTsKKworICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiUmVzcG9uc2Ugd2FpdCBUaW1lciBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJMTCBPcGVuIG9mIHJvYW1hYmxlIEFQIExpc3QgZmFpbGVkIikpOworICAgICAgICB2b3NfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5DaGFubmVsTGlzdCk7CisgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworICAgICAgICBwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yU2NhblRpbWVyKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBjc3JMTE9wZW4ocE1hYy0+aEhkZCwgJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtYWJsZUFQTGlzdCk7CisgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJMTCBPcGVuIG9mIHJvYW1hYmxlIEFQIExpc3QgZmFpbGVkIikpOworICAgICAgICB2b3NfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5DaGFubmVsTGlzdCk7CisgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworICAgICAgICBwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yU2NhblRpbWVyKTsKKyAgICAgICAgcGFsVGltZXJGcmVlKHBNYWMtPmhIZGQsIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJlc3VsdHNSZWZyZXNoVGltZXIpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfUkVTT1VSQ0VTOworICAgIH0KKworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5JbmRleCA9IENTUl9ORUlHSEJPUl9ST0FNX0lOVkFMSURfQ0hBTk5FTF9JTkRFWDsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFubmVsTGlzdEluZm8ubnVtT2ZDaGFubmVscyA9IDA7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmNoYW5MaXN0U2NhbkluUHJvZ3Jlc3MgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5JQVBQTmVpZ2hib3JMaXN0UmVjZWl2ZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIHN0YXR1cyA9IGNzck5laWdoYm9yUm9hbUluaXQxMXJBc3NvY0luZm8ocE1hYyk7CisgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJMTCBPcGVuIG9mIHJvYW1hYmxlIEFQIExpc3QgZmFpbGVkIikpOworICAgICAgICB2b3NfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5DaGFubmVsTGlzdCk7CisgICAgICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jZmdQYXJhbXMuY2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworICAgICAgICBwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yU2NhblRpbWVyKTsKKyAgICAgICAgcGFsVGltZXJGcmVlKHBNYWMtPmhIZGQsIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJlc3VsdHNSZWZyZXNoVGltZXIpOyAgICAgICAgCisgICAgICAgIGNzckxMQ2xvc2UoJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtYWJsZUFQTGlzdCk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICAgfQorI2VuZGlmCisgICAgLyogSW5pdGlhbGl6ZSB0aGlzIHdpdGggdGhlIGN1cnJlbnQgdGljayBjb3VudCAqLworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5zY2FuUmVxdWVzdFRpbWVTdGFtcCA9ICh0QU5JX1RJTUVTVEFNUClwYWxHZXRUaWNrQ291bnQocE1hYy0+aEhkZCk7CisKKyAgICBDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9JTklUKQorICAgIAorICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1DbG9zZQorCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNsb3Nlcy9mcmVlcyBhbGwgdGhlIG5laWdoYm9yIHJvYW0gZGF0YSBzdHJ1Y3R1cmVzCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgICBccmV0dXJuIFZPSUQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyTmVpZ2hib3JSb2FtQ2xvc2UodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvICAgIHBOZWlnaGJvclJvYW1JbmZvID0gJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mbzsKKworICAgIGlmIChlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfQ0xPU0VEID09IHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclJvYW1TdGF0ZSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiTmVpZ2hib3IgUm9hbSBBbGdvcml0aG0gQWxyZWFkeSBDbG9zZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KQorICAgICAgICB2b3NfbWVtX2ZyZWUocE5laWdoYm9yUm9hbUluZm8tPmNmZ1BhcmFtcy5jaGFubmVsSW5mby5DaGFubmVsTGlzdCk7CisgICAKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+Y2ZnUGFyYW1zLmNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICAKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+bmVpZ2hib3JTY2FuVGltZXJJbmZvLnBNYWMgPSBOVUxMOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5uZWlnaGJvclNjYW5UaW1lckluZm8uc2Vzc2lvbklkID0gQ1NSX1NFU1NJT05fSURfSU5WQUxJRDsKKyAgICBwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yU2NhblRpbWVyKTsKKyAgICBwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcE5laWdoYm9yUm9hbUluZm8tPm5laWdoYm9yUmVzdWx0c1JlZnJlc2hUaW1lcik7CisKKyAgICAvKiBTaG91bGQgZnJlZSB1cCB0aGUgbm9kZXMgaW4gdGhlIGxpc3QgYmVmb3JlIGNsb3NpbmcgdGhlIGRvdWJsZSBMaW5rZWQgbGlzdCAqLworICAgIGNzck5laWdoYm9yUm9hbUZyZWVSb2FtYWJsZUJTU0xpc3QocE1hYywgJnBOZWlnaGJvclJvYW1JbmZvLT5yb2FtYWJsZUFQTGlzdCk7CisgICAgY3NyTExDbG9zZSgmcE5laWdoYm9yUm9hbUluZm8tPnJvYW1hYmxlQVBMaXN0KTsKKyAgICAKKyAgICBpZiAocE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0KQorICAgIHsKKyAgICAgICAgdm9zX21lbV9mcmVlKHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdCk7CisgICAgfQorCisgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLkNoYW5uZWxMaXN0ID0gTlVMTDsKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLmN1cnJlbnRDaGFuSW5kZXggPSBDU1JfTkVJR0hCT1JfUk9BTV9JTlZBTElEX0NIQU5ORUxfSU5ERVg7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jdXJyZW50Q2hhbm5lbExpc3RJbmZvLm51bU9mQ2hhbm5lbHMgPSAwOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5yb2FtQ2hhbm5lbEluZm8uY3VycmVudENoYW5uZWxMaXN0SW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisgICAgcE5laWdoYm9yUm9hbUluZm8tPnJvYW1DaGFubmVsSW5mby5jaGFuTGlzdFNjYW5JblByb2dyZXNzID0gZUFOSV9CT09MRUFOX0ZBTFNFOyAgICAKKyAgICBwTmVpZ2hib3JSb2FtSW5mby0+cm9hbUNoYW5uZWxJbmZvLklBUFBOZWlnaGJvckxpc3RSZWNlaXZlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKworICAgIC8qIEZyZWUgdGhlIHByb2ZpbGUuLiAqLyAKKyAgICBjc3JSZWxlYXNlUHJvZmlsZShwTWFjLCAmcE5laWdoYm9yUm9hbUluZm8tPmNzck5laWdoYm9yUm9hbVByb2ZpbGUpOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8uRlRSb2FtSW5mby5jdXJyZW50TmVpZ2hib3JScHRSZXRyeU51bSA9IDA7CisgICAgcGFsVGltZXJGcmVlKHBNYWMtPmhIZGQsIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5GVFJvYW1JbmZvLnByZUF1dGhSc3BXYWl0VGltZXIpOworICAgIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5GVFJvYW1JbmZvLnByZUF1dGhSc3BXYWl0VGltZXJJbmZvLnBNYWMgPSBOVUxMOworICAgIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5GVFJvYW1JbmZvLnByZUF1dGhSc3BXYWl0VGltZXJJbmZvLnNlc3Npb25JZCA9IENTUl9TRVNTSU9OX0lEX0lOVkFMSUQ7CisgICAgcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLkZUUm9hbUluZm8ubnVtQnNzRnJvbU5laWdoYm9yUmVwb3J0ID0gMDsKKyAgICB2b3NfbWVtX3plcm8ocE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLkZUUm9hbUluZm8ubmVpZ2hib1JlcG9ydEJzc0luZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Q3NyTmVpZ2hib3JSZXBvcnRCc3NJbmZvKSAqIE1BWF9CU1NfSU5fTkVJR0hCT1JfUlBUKTsKKyAgICBjc3JOZWlnaGJvclJvYW1GcmVlUm9hbWFibGVCU1NMaXN0KHBNYWMsICZwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8uRlRSb2FtSW5mby5wcmVBdXRoRG9uZUxpc3QpOworICAgIGNzckxMQ2xvc2UoJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5GVFJvYW1JbmZvLnByZUF1dGhEb25lTGlzdCk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworICAgIENTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1RSQU5TSVRJT04oZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX0NMT1NFRCkKKyAgICAKKyAgICByZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbVJlcXVlc3RIYW5kb2ZmCisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgYWN0dWFsIHN3aXRjaGluZyBmcm9tIG9uZSBBUCB0byB0aGUgbmV3IEFQLgorICAgICAgICAgICAgSXQgaXNzdWVzIGRpc2Fzc29jaWF0ZSB3aXRoIHJlYXNvbiBjb2RlIGFzIEhhbmRvZmYgYW5kIENTUiBhcyBhIHBhcnQgb2YgCisgICAgICAgICAgICBoYW5kbGluZyBkaXNhc3NvYyByc3AsIGlzc3VlcyByZWFzc29jaWF0ZSB0byB0aGUgbmV3IEFQCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgICBccmV0dXJuIFZPSUQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyTmVpZ2hib3JSb2FtUmVxdWVzdEhhbmRvZmYodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgIHRDc3JSb2FtSW5mbyByb2FtSW5mbzsKKyAgICB0cENzck5laWdoYm9yUm9hbUNvbnRyb2xJbmZvICAgIHBOZWlnaGJvclJvYW1JbmZvID0gJnBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mbzsKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQgPSBwTmVpZ2hib3JSb2FtSW5mby0+Y3NyU2Vzc2lvbklkOworICAgIHRDc3JOZWlnaGJvclJvYW1CU1NJbmZvICAgICBoYW5kb2ZmTm9kZTsKKyAgICBleHRlcm4gdm9pZCBjc3JSb2FtUm9hbWluZ1N0YXRlRGlzYXNzb2NSc3BQcm9jZXNzb3IoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVEaXNhc3NvY1JzcCAqcFNtZURpc2Fzc29jUnNwICk7CisgICAgdEFOSV9VMzIgcm9hbUlkID0gMDsKKworICAgIGlmIChwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8ubmVpZ2hib3JSb2FtU3RhdGUgIT0gZUNTUl9ORUlHSEJPUl9ST0FNX1NUQVRFX1BSRUFVVEhfRE9ORSkgCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlJvYW0gcmVxdWVzdGVkIHdoZW4gTmVpZ2hib3Igcm9hbSBpcyBpbiAlZCBzdGF0ZSIpLCAKKyAgICAgICAgICAgIHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5uZWlnaGJvclJvYW1TdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2b3NfbWVtX3plcm8oJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBwTmVpZ2hib3JSb2FtSW5mby0+Y3NyU2Vzc2lvbklkLCAmcm9hbUluZm8sIHJvYW1JZCwgZUNTUl9ST0FNX0ZUX1NUQVJULCAKKyAgICAgICAgICAgICAgICBlU0lSX1NNRV9TVUNDRVNTKTsKKworICAgIHZvc19tZW1femVybygmcm9hbUluZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pKTsKKyAgICBDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9UUkFOU0lUSU9OKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRUFTU09DSUFUSU5HKQorICAgIAorICAgIGNzck5laWdoYm9yUm9hbUdldEhhbmRvZmZBUEluZm8ocE1hYywgJmhhbmRvZmZOb2RlKTsKKyAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkhBTkRPRkYgQ0FORElEQVRFIEJTU0lEICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kb2ZmTm9kZS5wQnNzRGVzY3JpcHRpb24tPmJzc0lkWzBdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRvZmZOb2RlLnBCc3NEZXNjcmlwdGlvbi0+YnNzSWRbMV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZG9mZk5vZGUucEJzc0Rlc2NyaXB0aW9uLT5ic3NJZFsyXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kb2ZmTm9kZS5wQnNzRGVzY3JpcHRpb24tPmJzc0lkWzNdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRvZmZOb2RlLnBCc3NEZXNjcmlwdGlvbi0+YnNzSWRbNF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZG9mZk5vZGUucEJzc0Rlc2NyaXB0aW9uLT5ic3NJZFs1XSk7CisgICAKKyAgICAvKiBGcmVlIHRoZSBwcm9maWxlLi4gSnVzdCB0byBtYWtlIHN1cmUgd2UgZG9udCBsZWFrIG1lbW9yeSBoZXJlICovIAorICAgIGNzclJlbGVhc2VQcm9maWxlKHBNYWMsICZwTmVpZ2hib3JSb2FtSW5mby0+Y3NyTmVpZ2hib3JSb2FtUHJvZmlsZSk7CisgICAgLyogQ3JlYXRlIHRoZSBIYW5kb2ZmIEFQIHByb2ZpbGUuIENvcHkgdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgcHJvZmlsZSBhbmQgdXBkYXRlIG9ubHkgdGhlIEJTU0lEIGFuZCBjaGFubmVsIG51bWJlcgorICAgICAgICBUaGlzIHNob3VsZCBoYXBwZW4gYmVmb3JlIGlzc3VpbmcgZGlzY29ubmVjdCAqLworICAgIGNzclJvYW1Db3B5Q29ubmVjdGVkUHJvZmlsZShwTWFjLCBwTmVpZ2hib3JSb2FtSW5mby0+Y3NyU2Vzc2lvbklkLCAmcE5laWdoYm9yUm9hbUluZm8tPmNzck5laWdoYm9yUm9hbVByb2ZpbGUpOworICAgIHZvc19tZW1fY29weShwTmVpZ2hib3JSb2FtSW5mby0+Y3NyTmVpZ2hib3JSb2FtUHJvZmlsZS5CU1NJRHMuYnNzaWQsIGhhbmRvZmZOb2RlLnBCc3NEZXNjcmlwdGlvbi0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIHBOZWlnaGJvclJvYW1JbmZvLT5jc3JOZWlnaGJvclJvYW1Qcm9maWxlLkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0WzBdID0gaGFuZG9mZk5vZGUucEJzc0Rlc2NyaXB0aW9uLT5jaGFubmVsSWQ7CisgICAgCisgICAgTkVJR0hCT1JfUk9BTV9ERUJVRyhwTWFjLCBMT0dXLCAiIGNzclJvYW1IYW5kb2ZmUmVxdWVzdGVkOiBkaXNhc3NvY2lhdGluZyB3aXRoIGN1cnJlbnQgQVBcbiIpOworCisgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JSb2FtSXNzdWVEaXNhc3NvY2lhdGVDbWQocE1hYywgc2Vzc2lvbklkLCBlQ1NSX0RJU0NPTk5FQ1RfUkVBU09OX0hBTkRPRkYpKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyUm9hbUhhbmRvZmZSZXF1ZXN0ZWQ6ICBmYWlsIHRvIGlzc3VlIGRpc2Fzc29jaWF0ZVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIC8vbm90aWZ5IEhERCBmb3IgaGFuZG9mZiwgcHJvdmlkaW5nIHRoZSBCU1NJRCB0b28KKyAgICByb2FtSW5mby5yZWFzb25Db2RlID0gZUNzclJvYW1SZWFzb25CZXR0ZXJBUDsKKworICAgIHZvc19tZW1fY29weShyb2FtSW5mby5ic3NpZCwgCisgICAgICAgICAgICAgICAgIGhhbmRvZmZOb2RlLnBCc3NEZXNjcmlwdGlvbi0+YnNzSWQsIAorICAgICAgICAgICAgICAgICBzaXplb2YoIHRDc3JCc3NpZCApKTsKKworICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCAmcm9hbUluZm8sIDAsIGVDU1JfUk9BTV9ST0FNSU5HX1NUQVJULCBlQ1NSX1JPQU1fUkVTVUxUX05PTkUpOworCisKKyAgICByZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIGNzck5laWdoYm9yUm9hbUlzSGFuZG9mZkluUHJvZ3Jlc3MKKworICAgIFxicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHdoZXRoZXIgaGFuZG9mZiBpcyBpbiBwcm9ncmVzcyBvciBub3QgYmFzZWQgb24gCisgICAgICAgICAgICB0aGUgY3VycmVudCBuZWlnaGJvciByb2FtIHN0YXRlCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgICAgICAgICBpczExclJlYXNzb2MgLSBSZXR1cm4gd2hldGhlciByZWFzc29jIGlzIG9mIHR5cGUgODAyLjExciByZWFzc29jCisKKyAgICBccmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFIGlmIHJlYXNzb2MgaW4gcHJvZ3Jlc3MsIGVBTklfQk9PTEVBTl9GQUxTRSBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RBTklfQk9PTEVBTiBjc3JOZWlnaGJvclJvYW1Jc0hhbmRvZmZJblByb2dyZXNzKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgaWYgKGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9SRUFTU09DSUFUSU5HID09IHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5uZWlnaGJvclJvYW1TdGF0ZSkKKyAgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFOworCisgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9GQUxTRTsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1JczExckFzc29jCisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIGlzIGEgMTFyIGFzc29jIG9yIG5vdAorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBlQU5JX0JPT0xFQU5fVFJVRSBpZiBjdXJyZW50IGFzc29jIGlzIDExciwgZUFOSV9CT09MRUFOX0ZBTFNFIG90aGVyd2lzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9CT09MRUFOIGNzck5laWdoYm9yUm9hbUlzMTFyQXNzb2ModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICByZXR1cm4gcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvLmlzMTFyQXNzb2M7Cit9CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBjc3JOZWlnaGJvclJvYW1HZXRIYW5kb2ZmQVBJbmZvCisKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYmVzdCBwb3NzaWJsZSBBUCBmb3IgaGFuZG9mZi4gRm9yIDExUiBjYXNlLCBpdCAKKyAgICAgICAgICAgIHJldHVybnMgdGhlIDFzdCBlbnRyeSBmcm9tIHByZS1hdXRoIGRvbmUgbGlzdC4gRm9yIG5vbi0xMXIgY2FzZSwgaXQgcmV0dXJucyAKKyAgICAgICAgICAgIHRoZSAxc3QgZW50cnkgZnJvbSByb2FtYWJsZSBBUCBsaXN0CisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgICAgICAgICBwSGFuZG9mZk5vZGUgLSBBUCBub2RlIHRoYXQgaXMgdGhlIGhhbmRvZmYgY2FuZGlkYXRlIHJldHVybmVkCisKKyAgICBccmV0dXJuIFZPSUQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY3NyTmVpZ2hib3JSb2FtR2V0SGFuZG9mZkFQSW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cENzck5laWdoYm9yUm9hbUJTU0luZm8gcEhhbmRvZmZOb2RlKQoreworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQ29udHJvbEluZm8gICAgcE5laWdoYm9yUm9hbUluZm8gPSAmcE1hYy0+cm9hbS5uZWlnaGJvclJvYW1JbmZvOworICAgIHRwQ3NyTmVpZ2hib3JSb2FtQlNTSW5mbyAgICAgICAgcEJzc05vZGU7CisgICAgCisgICAgVk9TX0FTU0VSVChOVUxMICE9IHBIYW5kb2ZmTm9kZSk7IAorICAgICAgICAKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+aXMxMXJBc3NvYykKKyAgICB7CisgICAgICAgIC8qIEFsd2F5cyB0aGUgQlNTIGluZm8gaW4gdGhlIGhlYWQgaXMgdGhlIGhhbmRvZmYgY2FuZGlkYXRlICovCisgICAgICAgIHBCc3NOb2RlID0gY3NyTmVpZ2hib3JSb2FtR2V0Um9hbWFibGVBUExpc3ROZXh0RW50cnkocE1hYywgJnBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhEb25lTGlzdCwgTlVMTCk7CisgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMSwgRkwoIk51bWJlciBvZiBIYW5kb2ZmIGNhbmRpZGF0ZXMgPSAlZCIpLCBjc3JMTENvdW50KCZwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRG9uZUxpc3QpKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIGlmIChwTmVpZ2hib3JSb2FtSW5mby0+aXNDQ1hBc3NvYykKKyAgICB7CisgICAgICAgIC8qIEFsd2F5cyB0aGUgQlNTIGluZm8gaW4gdGhlIGhlYWQgaXMgdGhlIGhhbmRvZmYgY2FuZGlkYXRlICovCisgICAgICAgIHBCc3NOb2RlID0gY3NyTmVpZ2hib3JSb2FtR2V0Um9hbWFibGVBUExpc3ROZXh0RW50cnkocE1hYywgJnBOZWlnaGJvclJvYW1JbmZvLT5GVFJvYW1JbmZvLnByZUF1dGhEb25lTGlzdCwgTlVMTCk7CisgICAgICAgIE5FSUdIQk9SX1JPQU1fREVCVUcocE1hYywgTE9HMSwgRkwoIk51bWJlciBvZiBIYW5kb2ZmIGNhbmRpZGF0ZXMgPSAlZCIpLCBjc3JMTENvdW50KCZwTmVpZ2hib3JSb2FtSW5mby0+RlRSb2FtSW5mby5wcmVBdXRoRG9uZUxpc3QpKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBwQnNzTm9kZSA9IGNzck5laWdoYm9yUm9hbUdldFJvYW1hYmxlQVBMaXN0TmV4dEVudHJ5KHBNYWMsICZwTmVpZ2hib3JSb2FtSW5mby0+cm9hbWFibGVBUExpc3QsIE5VTEwpOworICAgICAgICBORUlHSEJPUl9ST0FNX0RFQlVHKHBNYWMsIExPRzEsIEZMKCJOdW1iZXIgb2YgSGFuZG9mZiBjYW5kaWRhdGVzID0gJWQiKSwgY3NyTExDb3VudCgmcE5laWdoYm9yUm9hbUluZm8tPnJvYW1hYmxlQVBMaXN0KSk7CisgICAgfQorICAgIHZvc19tZW1fY29weShwSGFuZG9mZk5vZGUsIHBCc3NOb2RlLCBzaXplb2YodENzck5laWdoYm9yUm9hbUJTU0luZm8pKTsKKworICAgIHJldHVybjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpZiBwcmVhdXRoIGlzIGNvbXBsZXRlZCAKKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICAgIFxyZXR1cm4gYm9vbGVhbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9CT09MRUFOIGNzck5laWdoYm9yUm9hbVN0YXRlUHJlYXV0aERvbmUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICByZXR1cm4gKHBNYWMtPnJvYW0ubmVpZ2hib3JSb2FtSW5mby5uZWlnaGJvclJvYW1TdGF0ZSA9PSAKKyAgICAgICAgICAgICAgIGVDU1JfTkVJR0hCT1JfUk9BTV9TVEFURV9QUkVBVVRIX0RPTkUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcYnJpZWYgIEluIHRoZSBldmVudCB0aGF0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGggQVAxIGFuZCB3ZSBoYXZlCisgICAgY29tcGxldGVkIHByZSBhdXRoIHdpdGggQVAyLiBUaGVuIHdlIHJlY2VpdmUgYSBkZWF1dGgvZGlzYXNzb2MgZnJvbQorICAgIEFQMS4gCisgICAgQXQgdGhpcyBwb2ludCBuZWlnaGJvciByb2FtIGlzIGluIHByZSBhdXRoIGRvbmUgc3RhdGUsIHByZSBhdXRoIHRpbWVyCisgICAgaXMgcnVubmluZy4gV2Ugbm93IGhhbmRsZSB0aGlzIGNhc2UgYnkgc3RvcHBpbmcgdGltZXIgYW5kIGNsZWFyaW5nCisgICAgdGhlIHByZS1hdXRoIHN0YXRlLiBXZSBiYXNpY2FsbHkgY2xlYXIgdXAgYW5kIGp1c3QgZ28gdG8gZGlzY29ubmVjdGVkCisgICAgc3RhdGUuIAorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBib29sZWFuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBjc3JOZWlnaGJvclJvYW1UcmFuaXN0aW9uUHJlYXV0aERvbmVUb0Rpc2Nvbm5lY3RlZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGlmIChwTWFjLT5yb2FtLm5laWdoYm9yUm9hbUluZm8ubmVpZ2hib3JSb2FtU3RhdGUgIT0gCisgICAgICAgICAgICAgICBlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfUFJFQVVUSF9ET05FKSByZXR1cm47CisKKyAgICAvLyBTdG9wIHRpbWVyCisgICAgcGFsVGltZXJTdG9wKHBNYWMtPmhIZGQsIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wcmVBdXRoUmVhc3NvY0ludHZsVGltZXIpOworCisgICAgLy8gVHJhbnNpdGlvbiB0byBpbml0IHN0YXRlCisgICAgQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfVFJBTlNJVElPTihlQ1NSX05FSUdIQk9SX1JPQU1fU1RBVEVfSU5JVCkKK30KKworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HICovCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9zcmMvY3NyL2NzclV0aWwuYyBiL0NPUkUvU01FL3NyYy9jc3IvY3NyVXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTAwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9zcmMvY3NyL2NzclV0aWwuYwpAQCAtMCwwICsxLDU4NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisKKworICAgIFxmaWxlIGNzclV0aWwuYworCisgICAgSW1wbGVtZW50YXRpb24gc3VwcG9ydGluZyByb3V0aW5lcyBmb3IgQ1NSLgorCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxJbnRlcm5hbC5oIiAvL0NoZWNrIGlmIHRoZSBiZWxvdyBpbmNsdWRlIG9mIGFuaUdvYmFsLmggaXMgc3VmZmljaWVudCBmb3IgVm9sYW5zIHRvby4KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInBhbEFwaS5oIgorI2luY2x1ZGUgImNzclN1cHBvcnQuaCIKKyNpbmNsdWRlICJjc3JJbnNpZGVBcGkuaCIKKyNpbmNsdWRlICJzbXNEZWJ1Zy5oIgorI2luY2x1ZGUgInNtZVFvc0ludGVybmFsLmgiCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorI2luY2x1ZGUgInZvc191dGlscy5oIgorI2luY2x1ZGUgImNzckNjeC5oIgorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KKwordEFOSV9VOCBjc3JXcGFPdWlbXVsgQ1NSX1dQQV9PVUlfU0laRSBdID0geworICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMCB9LAorICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSB9LAorICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiB9LAorICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMyB9LAorICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCB9LAorICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNSB9LAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAgfSwgLy8gQ0NLTQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1ggKi8KK307CisKK3RBTklfVTggY3NyUlNOT3VpW11bIENTUl9SU05fT1VJX1NJWkUgXSA9IHsKKyAgICB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDAgfSwgLy8gZ3JvdXAgY2lwaGVyCisgICAgeyAweDAwLCAweDBGLCAweEFDLCAweDAxIH0sIC8vIFdFUC00MCBvciBSU04KKyAgICB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDIgfSwgLy8gVEtJUCBvciBSU04tUFNLCisgICAgeyAweDAwLCAweDBGLCAweEFDLCAweDAzIH0sIC8vIFJlc2VydmVkCisgICAgeyAweDAwLCAweDBGLCAweEFDLCAweDA0IH0sIC8vIEFFUy1DQ01QCisgICAgeyAweDAwLCAweDBGLCAweEFDLCAweDA1IH0sIC8vIFdFUC0xMDQKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfMTFXCisgICAgeyAweDAwLCAweDBGLCAweEFDLCAweDA2IH0sICAvLyBCSVAoZW5jcnlwdGlvbiB0eXBlKSBvciAoUlNOLVBTSy1TSEEyNTYoYXV0aGVudGljYXRpb24gdHlwZSkKKyNlbmRpZgorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAgfSAvLyBDQ0tNCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NDWCAqLworICAgIAorfTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCit0QU5JX1U4IGNzcldhcGlPdWlbXVsgQ1NSX1dBUElfT1VJX1NJWkUgXSA9IHsKKyAgICB7IDB4MDAsIDB4MTQsIDB4NzIsIDB4MDAgfSwgLy8gUmVzZXJ2ZWQKKyAgICB7IDB4MDAsIDB4MTQsIDB4NzIsIDB4MDEgfSwgLy8gV0FJIGNlcnRpZmljYXRlIG9yIFNNUzQKKyAgICB7IDB4MDAsIDB4MTQsIDB4NzIsIDB4MDIgfSAvLyBXQUkgUFNLCit9OworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCit0QU5JX1U4IGNzcldtZUluZm9PdWlbIENTUl9XTUVfT1VJX1NJWkUgXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiB9OwordEFOSV9VOCBjc3JXbWVQYXJtT3VpWyBDU1JfV01FX09VSV9TSVpFIF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIgfTsKKworc3RhdGljIHRDc3JJRUxlbkluZm8gZ0NzcklFTGVuZ3RoVGFibGVbXSA9IHsKKy8qIDAwMCAqLyB7IFNJUl9NQUNfU1NJRF9FSURfTUlOLCBTSVJfTUFDX1NTSURfRUlEX01BWCB9LAorLyogMDAxICovIHsgU0lSX01BQ19SQVRFU0VUX0VJRF9NSU4sIFNJUl9NQUNfUkFURVNFVF9FSURfTUFYIH0sCisvKiAwMDIgKi8geyBTSVJfTUFDX0ZIX1BBUkFNX1NFVF9FSURfTUlOLCBTSVJfTUFDX0ZIX1BBUkFNX1NFVF9FSURfTUFYIH0sCisvKiAwMDMgKi8geyBTSVJfTUFDX0RTX1BBUkFNX1NFVF9FSURfTUlOLCBTSVJfTUFDX0RTX1BBUkFNX1NFVF9FSURfTUFYIH0sCisvKiAwMDQgKi8geyBTSVJfTUFDX0NGX1BBUkFNX1NFVF9FSURfTUlOLCBTSVJfTUFDX0NGX1BBUkFNX1NFVF9FSURfTUFYIH0sCisvKiAwMDUgKi8geyBTSVJfTUFDX1RJTV9FSURfTUlOLCBTSVJfTUFDX1RJTV9FSURfTUFYIH0sCisvKiAwMDYgKi8geyBTSVJfTUFDX0lCU1NfUEFSQU1fU0VUX0VJRF9NSU4sIFNJUl9NQUNfSUJTU19QQVJBTV9TRVRfRUlEX01BWCB9LAorLyogMDA3ICovIHsgU0lSX01BQ19DT1VOVFJZX0VJRF9NSU4sIFNJUl9NQUNfQ09VTlRSWV9FSURfTUFYIH0sCisvKiAwMDggKi8geyBTSVJfTUFDX0ZIX1BBUkFNU19FSURfTUlOLCBTSVJfTUFDX0ZIX1BBUkFNU19FSURfTUFYIH0sCisvKiAwMDkgKi8geyBTSVJfTUFDX0ZIX1BBVFRFUk5fRUlEX01JTiwgU0lSX01BQ19GSF9QQVRURVJOX0VJRF9NQVggfSwKKy8qIDAxMCAqLyB7IFNJUl9NQUNfUkVRVUVTVF9FSURfTUlOLCBTSVJfTUFDX1JFUVVFU1RfRUlEX01BWCB9LAorLyogMDExICovIHsgU0lSX01BQ19RQlNTX0xPQURfRUlEX01JTiwgU0lSX01BQ19RQlNTX0xPQURfRUlEX01BWCB9LAorLyogMDEyICovIHsgU0lSX01BQ19FRENBX1BBUkFNX1NFVF9FSURfTUlOLCBTSVJfTUFDX0VEQ0FfUEFSQU1fU0VUX0VJRF9NQVggfSwKKy8qIDAxMyAqLyB7IFNJUl9NQUNfVFNQRUNfRUlEX01JTiwgU0lSX01BQ19UU1BFQ19FSURfTUFYIH0sCisvKiAwMTQgKi8geyBTSVJfTUFDX1RDTEFTX0VJRF9NSU4sIFNJUl9NQUNfVENMQVNfRUlEX01BWCB9LAorLyogMDE1ICovIHsgU0lSX01BQ19RT1NfU0NIRURVTEVfRUlEX01JTiwgU0lSX01BQ19RT1NfU0NIRURVTEVfRUlEX01BWCB9LAorLyogMDE2ICovIHsgU0lSX01BQ19DSEFMTEVOR0VfVEVYVF9FSURfTUlOLCBTSVJfTUFDX0NIQUxMRU5HRV9URVhUX0VJRF9NQVggfSwKKy8qIDAxNyAqLyB7IDAsIDI1NSB9LAorLyogMDE4ICovIHsgMCwgMjU1IH0sCisvKiAwMTkgKi8geyAwLCAyNTUgfSwKKy8qIDAyMCAqLyB7IDAsIDI1NSB9LAorLyogMDIxICovIHsgMCwgMjU1IH0sCisvKiAwMjIgKi8geyAwLCAyNTUgfSwKKy8qIDAyMyAqLyB7IDAsIDI1NSB9LAorLyogMDI0ICovIHsgMCwgMjU1IH0sCisvKiAwMjUgKi8geyAwLCAyNTUgfSwKKy8qIDAyNiAqLyB7IDAsIDI1NSB9LAorLyogMDI3ICovIHsgMCwgMjU1IH0sCisvKiAwMjggKi8geyAwLCAyNTUgfSwKKy8qIDAyOSAqLyB7IDAsIDI1NSB9LAorLyogMDMwICovIHsgMCwgMjU1IH0sCisvKiAwMzEgKi8geyAwLCAyNTUgfSwKKy8qIDAzMiAqLyB7IFNJUl9NQUNfUFdSX0NPTlNUUkFJTlRfRUlEX01JTiwgU0lSX01BQ19QV1JfQ09OU1RSQUlOVF9FSURfTUFYIH0sCisvKiAwMzMgKi8geyBTSVJfTUFDX1BXUl9DQVBBQklMSVRZX0VJRF9NSU4sIFNJUl9NQUNfUFdSX0NBUEFCSUxJVFlfRUlEX01BWCB9LAorLyogMDM0ICovIHsgU0lSX01BQ19UUENfUkVRX0VJRF9NSU4sIFNJUl9NQUNfVFBDX1JFUV9FSURfTUFYIH0sCisvKiAwMzUgKi8geyBTSVJfTUFDX1RQQ19SUFRfRUlEX01JTiwgU0lSX01BQ19UUENfUlBUX0VJRF9NQVggfSwKKy8qIDAzNiAqLyB7IFNJUl9NQUNfU1BSVERfQ0hOTFNfRUlEX01JTiwgU0lSX01BQ19TUFJURF9DSE5MU19FSURfTUFYIH0sCisvKiAwMzcgKi8geyBTSVJfTUFDX0NITkxfU1dJVENIX0FOTl9FSURfTUlOLCBTSVJfTUFDX0NITkxfU1dJVENIX0FOTl9FSURfTUFYIH0sCisvKiAwMzggKi8geyBTSVJfTUFDX01FQVNfUkVRX0VJRF9NSU4sIFNJUl9NQUNfTUVBU19SRVFfRUlEX01BWCB9LAorLyogMDM5ICovIHsgU0lSX01BQ19NRUFTX1JQVF9FSURfTUlOLCBTSVJfTUFDX01FQVNfUlBUX0VJRF9NQVggfSwKKy8qIDA0MCAqLyB7IFNJUl9NQUNfUVVJRVRfRUlEX01JTiwgU0lSX01BQ19RVUlFVF9FSURfTUFYIH0sCisvKiAwNDEgKi8geyBTSVJfTUFDX0lCU1NfREZTX0VJRF9NSU4sIFNJUl9NQUNfSUJTU19ERlNfRUlEX01BWCB9LAorLyogMDQyICovIHsgU0lSX01BQ19FUlBfSU5GT19FSURfTUlOLCBTSVJfTUFDX0VSUF9JTkZPX0VJRF9NQVggfSwKKy8qIDA0MyAqLyB7IFNJUl9NQUNfVFNfREVMQVlfRUlEX01JTiwgU0lSX01BQ19UU19ERUxBWV9FSURfTUFYIH0sCisvKiAwNDQgKi8geyBTSVJfTUFDX1RDTEFTX1BST0NfRUlEX01JTiwgU0lSX01BQ19UQ0xBU19QUk9DX0VJRF9NQVggfSwKKy8qIDA0NSAqLyB7IFNJUl9NQUNfUU9TX0FDVElPTl9FSURfTUlOLCBTSVJfTUFDX1FPU19BQ1RJT05fRUlEX01BWCB9LAorLyogMDQ2ICovIHsgU0lSX01BQ19RT1NfQ0FQQUJJTElUWV9FSURfTUlOLCBTSVJfTUFDX1FPU19DQVBBQklMSVRZX0VJRF9NQVggfSwKKy8qIDA0NyAqLyB7IDAsIDI1NSB9LAorLyogMDQ4ICovIHsgU0lSX01BQ19SU05fRUlEX01JTiwgU0lSX01BQ19SU05fRUlEX01BWCB9LAorLyogMDQ5ICovIHsgMCwgMjU1IH0sCisvKiAwNTAgKi8geyBTSVJfTUFDX0VYVEVOREVEX1JBVEVfRUlEX01JTiwgU0lSX01BQ19FWFRFTkRFRF9SQVRFX0VJRF9NQVggfSwKKy8qIDA1MSAqLyB7IDAsIDI1NSB9LAorLyogMDUyICovIHsgMCwgMjU1IH0sCisvKiAwNTMgKi8geyAwLCAyNTUgfSwKKy8qIDA1NCAqLyB7IDAsIDI1NSB9LAorLyogMDU1ICovIHsgMCwgMjU1IH0sCisvKiAwNTYgKi8geyAwLCAyNTUgfSwKKy8qIDA1NyAqLyB7IDAsIDI1NSB9LAorLyogMDU4ICovIHsgMCwgMjU1IH0sCisvKiAwNTkgKi8geyAwLCAyNTUgfSwKKy8qIDA2MCAqLyB7IDAsIDI1NSB9LAorLyogMDYxICovIHsgMCwgMjU1IH0sCisvKiAwNjIgKi8geyAwLCAyNTUgfSwKKy8qIDA2MyAqLyB7IDAsIDI1NSB9LAorLyogMDY0ICovIHsgMCwgMjU1IH0sCisvKiAwNjUgKi8geyAwLCAyNTUgfSwKKy8qIDA2NiAqLyB7IDAsIDI1NSB9LAorLyogMDY3ICovIHsgMCwgMjU1IH0sCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKy8qIDA2OCAqLyB7IERPVDExRl9FSURfV0FQSSwgRE9UMTFGX0lFX1dBUElfTUFYX0xFTiB9LAorI2Vsc2UKKy8qIDA2OCAqLyB7IDAsIDI1NSB9LAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisvKiAwNjkgKi8geyAwLCAyNTUgfSwKKy8qIDA3MCAqLyB7IDAsIDI1NSB9LAorLyogMDcxICovIHsgMCwgMjU1IH0sCisvKiAwNzIgKi8geyAwLCAyNTUgfSwKKy8qIDA3MyAqLyB7IDAsIDI1NSB9LAorLyogMDc0ICovIHsgMCwgMjU1IH0sCisvKiAwNzUgKi8geyAwLCAyNTUgfSwKKy8qIDA3NiAqLyB7IDAsIDI1NSB9LAorLyogMDc3ICovIHsgMCwgMjU1IH0sCisvKiAwNzggKi8geyAwLCAyNTUgfSwKKy8qIDA3OSAqLyB7IDAsIDI1NSB9LAorLyogMDgwICovIHsgMCwgMjU1IH0sCisvKiAwODEgKi8geyAwLCAyNTUgfSwKKy8qIDA4MiAqLyB7IDAsIDI1NSB9LAorLyogMDgzICovIHsgMCwgMjU1IH0sCisvKiAwODQgKi8geyAwLCAyNTUgfSwKKy8qIDA4NSAqLyB7IDAsIDI1NSB9LAorLyogMDg2ICovIHsgMCwgMjU1IH0sCisvKiAwODcgKi8geyAwLCAyNTUgfSwKKy8qIDA4OCAqLyB7IDAsIDI1NSB9LAorLyogMDg5ICovIHsgMCwgMjU1IH0sCisvKiAwOTAgKi8geyAwLCAyNTUgfSwKKy8qIDA5MSAqLyB7IDAsIDI1NSB9LAorLyogMDkyICovIHsgMCwgMjU1IH0sCisvKiAwOTMgKi8geyAwLCAyNTUgfSwKKy8qIDA5NCAqLyB7IDAsIDI1NSB9LAorLyogMDk1ICovIHsgMCwgMjU1IH0sCisvKiAwOTYgKi8geyAwLCAyNTUgfSwKKy8qIDA5NyAqLyB7IDAsIDI1NSB9LAorLyogMDk4ICovIHsgMCwgMjU1IH0sCisvKiAwOTkgKi8geyAwLCAyNTUgfSwKKy8qIDEwMCAqLyB7IDAsIDI1NSB9LAorLyogMTAxICovIHsgMCwgMjU1IH0sCisvKiAxMDIgKi8geyAwLCAyNTUgfSwKKy8qIDEwMyAqLyB7IDAsIDI1NSB9LAorLyogMTA0ICovIHsgMCwgMjU1IH0sCisvKiAxMDUgKi8geyAwLCAyNTUgfSwKKy8qIDEwNiAqLyB7IDAsIDI1NSB9LAorLyogMTA3ICovIHsgMCwgMjU1IH0sCisvKiAxMDggKi8geyAwLCAyNTUgfSwKKy8qIDEwOSAqLyB7IDAsIDI1NSB9LAorLyogMTEwICovIHsgMCwgMjU1IH0sCisvKiAxMTEgKi8geyAwLCAyNTUgfSwKKy8qIDExMiAqLyB7IDAsIDI1NSB9LAorLyogMTEzICovIHsgMCwgMjU1IH0sCisvKiAxMTQgKi8geyAwLCAyNTUgfSwKKy8qIDExNSAqLyB7IDAsIDI1NSB9LAorLyogMTE2ICovIHsgMCwgMjU1IH0sCisvKiAxMTcgKi8geyAwLCAyNTUgfSwKKy8qIDExOCAqLyB7IDAsIDI1NSB9LAorLyogMTE5ICovIHsgMCwgMjU1IH0sCisvKiAxMjAgKi8geyAwLCAyNTUgfSwKKy8qIDEyMSAqLyB7IDAsIDI1NSB9LAorLyogMTIyICovIHsgMCwgMjU1IH0sCisvKiAxMjMgKi8geyAwLCAyNTUgfSwKKy8qIDEyNCAqLyB7IDAsIDI1NSB9LAorLyogMTI1ICovIHsgMCwgMjU1IH0sCisvKiAxMjYgKi8geyAwLCAyNTUgfSwKKy8qIDEyNyAqLyB7IDAsIDI1NSB9LAorLyogMTI4ICovIHsgMCwgMjU1IH0sCisvKiAxMjkgKi8geyAwLCAyNTUgfSwKKy8qIDEzMCAqLyB7IDAsIDI1NSB9LAorLyogMTMxICovIHsgMCwgMjU1IH0sCisvKiAxMzIgKi8geyAwLCAyNTUgfSwKKy8qIDEzMyAqLyB7IDAsIDI1NSB9LAorLyogMTM0ICovIHsgMCwgMjU1IH0sCisvKiAxMzUgKi8geyAwLCAyNTUgfSwKKy8qIDEzNiAqLyB7IDAsIDI1NSB9LAorLyogMTM3ICovIHsgMCwgMjU1IH0sCisvKiAxMzggKi8geyAwLCAyNTUgfSwKKy8qIDEzOSAqLyB7IDAsIDI1NSB9LAorLyogMTQwICovIHsgMCwgMjU1IH0sCisvKiAxNDEgKi8geyAwLCAyNTUgfSwKKy8qIDE0MiAqLyB7IDAsIDI1NSB9LAorLyogMTQzICovIHsgMCwgMjU1IH0sCisvKiAxNDQgKi8geyAwLCAyNTUgfSwKKy8qIDE0NSAqLyB7IDAsIDI1NSB9LAorLyogMTQ2ICovIHsgMCwgMjU1IH0sCisvKiAxNDcgKi8geyAwLCAyNTUgfSwKKy8qIDE0OCAqLyB7IDAsIDI1NSB9LAorLyogMTQ5ICovIHsgMCwgMjU1IH0sCisvKiAxNTAgKi8geyAwLCAyNTUgfSwKKy8qIDE1MSAqLyB7IDAsIDI1NSB9LAorLyogMTUyICovIHsgMCwgMjU1IH0sCisvKiAxNTMgKi8geyAwLCAyNTUgfSwKKy8qIDE1NCAqLyB7IDAsIDI1NSB9LAorLyogMTU1ICovIHsgMCwgMjU1IH0sCisvKiAxNTYgKi8geyAwLCAyNTUgfSwKKy8qIDE1NyAqLyB7IDAsIDI1NSB9LAorLyogMTU4ICovIHsgMCwgMjU1IH0sCisvKiAxNTkgKi8geyAwLCAyNTUgfSwKKy8qIDE2MCAqLyB7IDAsIDI1NSB9LAorLyogMTYxICovIHsgMCwgMjU1IH0sCisvKiAxNjIgKi8geyAwLCAyNTUgfSwKKy8qIDE2MyAqLyB7IDAsIDI1NSB9LAorLyogMTY0ICovIHsgMCwgMjU1IH0sCisvKiAxNjUgKi8geyAwLCAyNTUgfSwKKy8qIDE2NiAqLyB7IDAsIDI1NSB9LAorLyogMTY3ICovIHsgMCwgMjU1IH0sCisvKiAxNjggKi8geyAwLCAyNTUgfSwKKy8qIDE2OSAqLyB7IDAsIDI1NSB9LAorLyogMTcwICovIHsgMCwgMjU1IH0sCisvKiAxNzEgKi8geyAwLCAyNTUgfSwKKy8qIDE3MiAqLyB7IDAsIDI1NSB9LAorLyogMTczICovIHsgMCwgMjU1IH0sCisvKiAxNzQgKi8geyAwLCAyNTUgfSwKKy8qIDE3NSAqLyB7IDAsIDI1NSB9LAorLyogMTc2ICovIHsgMCwgMjU1IH0sCisvKiAxNzcgKi8geyAwLCAyNTUgfSwKKy8qIDE3OCAqLyB7IDAsIDI1NSB9LAorLyogMTc5ICovIHsgMCwgMjU1IH0sCisvKiAxODAgKi8geyAwLCAyNTUgfSwKKy8qIDE4MSAqLyB7IDAsIDI1NSB9LAorLyogMTgyICovIHsgMCwgMjU1IH0sCisvKiAxODMgKi8geyAwLCAyNTUgfSwKKy8qIDE4NCAqLyB7IDAsIDI1NSB9LAorLyogMTg1ICovIHsgMCwgMjU1IH0sCisvKiAxODYgKi8geyAwLCAyNTUgfSwKKy8qIDE4NyAqLyB7IDAsIDI1NSB9LAorLyogMTg4ICovIHsgMCwgMjU1IH0sCisvKiAxODkgKi8geyAwLCAyNTUgfSwKKy8qIDE5MCAqLyB7IDAsIDI1NSB9LAorLyogMTkxICovIHsgMCwgMjU1IH0sCisvKiAxOTIgKi8geyAwLCAyNTUgfSwKKy8qIDE5MyAqLyB7IDAsIDI1NSB9LAorLyogMTk0ICovIHsgMCwgMjU1IH0sCisvKiAxOTUgKi8geyAwLCAyNTUgfSwKKy8qIDE5NiAqLyB7IDAsIDI1NSB9LAorLyogMTk3ICovIHsgMCwgMjU1IH0sCisvKiAxOTggKi8geyAwLCAyNTUgfSwKKy8qIDE5OSAqLyB7IDAsIDI1NSB9LAorLyogMjAwICovIHsgMCwgMjU1IH0sCisvKiAyMDEgKi8geyAwLCAyNTUgfSwKKy8qIDIwMiAqLyB7IDAsIDI1NSB9LAorLyogMjAzICovIHsgMCwgMjU1IH0sCisvKiAyMDQgKi8geyAwLCAyNTUgfSwKKy8qIDIwNSAqLyB7IDAsIDI1NSB9LAorLyogMjA2ICovIHsgMCwgMjU1IH0sCisvKiAyMDcgKi8geyAwLCAyNTUgfSwKKy8qIDIwOCAqLyB7IDAsIDI1NSB9LAorLyogMjA5ICovIHsgMCwgMjU1IH0sCisvKiAyMTAgKi8geyAwLCAyNTUgfSwKKy8qIDIxMSAqLyB7IDAsIDI1NSB9LAorLyogMjEyICovIHsgMCwgMjU1IH0sCisvKiAyMTMgKi8geyAwLCAyNTUgfSwKKy8qIDIxNCAqLyB7IDAsIDI1NSB9LAorLyogMjE1ICovIHsgMCwgMjU1IH0sCisvKiAyMTYgKi8geyAwLCAyNTUgfSwKKy8qIDIxNyAqLyB7IDAsIDI1NSB9LAorLyogMjE4ICovIHsgMCwgMjU1IH0sCisvKiAyMTkgKi8geyAwLCAyNTUgfSwKKy8qIDIyMCAqLyB7IDAsIDI1NSB9LAorLyogMjIxICovIHsgU0lSX01BQ19XUEFfRUlEX01JTiwgU0lSX01BQ19XUEFfRUlEX01BWCB9LAorLyogMjIyICovIHsgMCwgMjU1IH0sCisvKiAyMjMgKi8geyAwLCAyNTUgfSwKKy8qIDIyNCAqLyB7IDAsIDI1NSB9LAorLyogMjI1ICovIHsgMCwgMjU1IH0sCisvKiAyMjYgKi8geyAwLCAyNTUgfSwKKy8qIDIyNyAqLyB7IDAsIDI1NSB9LAorLyogMjI4ICovIHsgMCwgMjU1IH0sCisvKiAyMjkgKi8geyAwLCAyNTUgfSwKKy8qIDIzMCAqLyB7IDAsIDI1NSB9LAorLyogMjMxICovIHsgMCwgMjU1IH0sCisvKiAyMzIgKi8geyAwLCAyNTUgfSwKKy8qIDIzMyAqLyB7IDAsIDI1NSB9LAorLyogMjM0ICovIHsgMCwgMjU1IH0sCisvKiAyMzUgKi8geyAwLCAyNTUgfSwKKy8qIDIzNiAqLyB7IDAsIDI1NSB9LAorLyogMjM3ICovIHsgMCwgMjU1IH0sCisvKiAyMzggKi8geyAwLCAyNTUgfSwKKy8qIDIzOSAqLyB7IDAsIDI1NSB9LAorLyogMjQwICovIHsgMCwgMjU1IH0sCisvKiAyNDEgKi8geyAwLCAyNTUgfSwKKy8qIDI0MiAqLyB7IDAsIDI1NSB9LAorLyogMjQzICovIHsgMCwgMjU1IH0sCisvKiAyNDQgKi8geyAwLCAyNTUgfSwKKy8qIDI0NSAqLyB7IDAsIDI1NSB9LAorLyogMjQ2ICovIHsgMCwgMjU1IH0sCisvKiAyNDcgKi8geyAwLCAyNTUgfSwKKy8qIDI0OCAqLyB7IDAsIDI1NSB9LAorLyogMjQ5ICovIHsgMCwgMjU1IH0sCisvKiAyNTAgKi8geyAwLCAyNTUgfSwKKy8qIDI1MSAqLyB7IDAsIDI1NSB9LAorLyogMjUyICovIHsgMCwgMjU1IH0sCisvKiAyNTMgKi8geyAwLCAyNTUgfSwKKy8qIDI1NCAqLyB7IDAsIDI1NSB9LAorLyogMjU1ICovIHsgU0lSX01BQ19BTklfV09SS0FST1VORF9FSURfTUlOLCBTSVJfTUFDX0FOSV9XT1JLQVJPVU5EX0VJRF9NQVggfQorfTsKKworI2lmIDAKKy8vRG9uJ3Qgbm90IGluc2VydCBlbnRyeSBpbnRvIHRoZSB0YWJsZSwgcHV0IGl0IHRvIHRoZSBlbmQuIElmIHlvdSBoYXZlIHRvIGluc2VydCwgbWFrZSBzdXJlIGl0IGlzIGFsc28KKy8vcmVmbGVjdGVkIGluIGVDc3JDb3VudHJ5SW5kZXgKK3N0YXRpYyB0Q3NyQ291bnRyeUluZm8gZ0NzckNvdW50cnlJbmZvW2VDU1JfTlVNX0NPVU5UUllfSU5ERVhdID0KK3sKKyAgICB7UkVHX0RPTUFJTl9GQ0MsIHsnVScsICdTJywgJyAnfX0sICAgICAgIC8vVVNBLyoqKioqKlRoZSAiVVMiIE1VU1QgYmUgYXQgaW5kZXggMCoqKioqKiovCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQScsICdEJywgJyAnfX0sICAgICAvL0FORE9SUkEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydBJywgJ0UnLCAnICd9fSwgICAgICAgLy9VQUUKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydBJywgJ0YnLCAnICd9fSwgICAgIC8vQUZHSEFOSVNUQU4KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydBJywgJ0cnLCAnICd9fSwgICAgIC8vQU5USUdVQSBBTkQgQkFSQlVEQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0EnLCAnSScsICcgJ319LCAgICAgLy9BTkdVSUxMQQorICAgIHtSRUdfRE9NQUlOX0hJXzVHSFosIHsnQScsICdMJywgJyAnfX0sICAgICAvL0FMQkFOSUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydBJywgJ00nLCAnICd9fSwgICAgIC8vQVJNRU5JQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0EnLCAnTicsICcgJ319LCAgICAgLy9ORVRIRVJMQU5EUyBBTlRJTExFUworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0EnLCAnTycsICcgJ319LCAgICAgLy9BTkdPTEEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydBJywgJ1EnLCAnICd9fSwgICAgIC8vQU5UQVJDVElDQQorICAgIHtSRUdfRE9NQUlOX0hJXzVHSFosIHsnQScsICdSJywgJyAnfX0sICAgIC8vQVJHRU5USU5BCisgICAge1JFR19ET01BSU5fRkNDLCB7J0EnLCAnUycsICcgJ319LCAgICAgLy9BTUVSSUNBTiBTT01PQQorICAgIHtSRUdfRE9NQUlOX0VUU0ksIHsnQScsICdUJywgJyAnfX0sICAgICAgLy9BVVNUUklBCisgICAge1JFR19ET01BSU5fRVRTSSwgeydBJywgJ1UnLCAnICd9fSwgICAgICAvL0FVU1RSQUxJQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0EnLCAnVycsICcgJ319LCAgICAgLy9BUlVCQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0EnLCAnWCcsICcgJ319LCAgICAgLy9BTEFORCBJU0xBTkRTCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQScsICdaJywgJyAnfX0sICAgICAvL0FaRVJCQUlKQU4KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydCJywgJ0EnLCAnICd9fSwgICAgIC8vQk9TTklBIEFORCBIRVJaRUdPVklOQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0InLCAnQicsICcgJ319LCAgICAgLy9CQVJCQURPUworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0InLCAnRCcsICcgJ319LCAgICAgLy9CQU5HTEFERVNICisgICAge1JFR19ET01BSU5fRVRTSSwgeydCJywgJ0UnLCAnICd9fSwgICAgICAvL0JFTEdJVU0KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydCJywgJ0YnLCAnICd9fSwgICAgIC8vQlVSS0lOQSBGQVNPCisgICAge1JFR19ET01BSU5fSElfNUdIWiwgeydCJywgJ0cnLCAnICd9fSwgICAgICAvL0JVTEdBUklBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQicsICdIJywgJyAnfX0sICAgICAvL0JBSFJBSU4KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydCJywgJ0knLCAnICd9fSwgICAgIC8vQlVSVU5ESQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0InLCAnSicsICcgJ319LCAgICAgLy9CRU5JTgorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0InLCAnTCcsICcgJ319LCAgICAgLy9TQUlOVCBCQVJUSEVMRU1ZCisgICAge1JFR19ET01BSU5fRVRTSSwgeydCJywgJ00nLCAnICd9fSwgICAgIC8vQkVSTVVEQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0InLCAnTicsICcgJ319LCAgICAgLy9CUlVORUkgREFSVVNTQUxBTQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0InLCAnTycsICcgJ319LCAgICAgLy9CT0xJVklBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQicsICdSJywgJyAnfX0sICAgICAgIC8vQlJBWklMCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQicsICdTJywgJyAnfX0sICAgICAvL0JBSEFNQVMKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydCJywgJ1QnLCAnICd9fSwgICAgIC8vQkhVVEFOCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQicsICdWJywgJyAnfX0sICAgICAvL0JPVVZFVCBJU0xBTkQKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydCJywgJ1cnLCAnICd9fSwgICAgIC8vQk9UU1dBTkEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydCJywgJ1knLCAnICd9fSwgICAgIC8vQkVMQVJVUworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0InLCAnWicsICcgJ319LCAgICAgLy9CRUxJWkUKKyAgICB7UkVHX0RPTUFJTl9GQ0MsIHsnQycsICdBJywgJyAnfX0sICAgICAgIC8vQ0FOQURBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQycsICdDJywgJyAnfX0sICAgICAvL0NPQ09TIChLRUVMSU5HKSBJU0xBTkRTCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQycsICdEJywgJyAnfX0sICAgICAvL0NPTkdPLCBUSEUgREVNT0NSQVRJQyBSRVBVQkxJQyBPRiBUSEUKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydDJywgJ0YnLCAnICd9fSwgICAgIC8vQ0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQycsICdHJywgJyAnfX0sICAgICAvL0NPTkdPCisgICAge1JFR19ET01BSU5fRVRTSSwgeydDJywgJ0gnLCAnICd9fSwgICAgICAvL1NXSVRaRVJMQU5ECisgICAge1JFR19ET01BSU5fV09STEQsIHsnQycsICdJJywgJyAnfX0sICAgICAvL0NPVEUgRCdJVk9JUkUKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydDJywgJ0snLCAnICd9fSwgICAgIC8vQ09PSyBJU0xBTkRTCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQycsICdMJywgJyAnfX0sICAgICAgIC8vQ0hJTEUKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydDJywgJ00nLCAnICd9fSwgICAgIC8vQ0FNRVJPT04KKyAgICB7UkVHX0RPTUFJTl9ISV81R0haLCB7J0MnLCAnTicsICcgJ319LCAgIC8vQ0hJTkEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydDJywgJ08nLCAnICd9fSwgICAgICAgLy9DT0xPTUJJQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0MnLCAnUicsICcgJ319LCAgICAgICAvL0NPU1RBIFJJQ0EKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydDJywgJ1UnLCAnICd9fSwgICAgIC8vQ1VCQSAgCisgICAge1JFR19ET01BSU5fV09STEQsIHsnQycsICdWJywgJyAnfX0sICAgICAvL0NBUEUgVkVSREUKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydDJywgJ1gnLCAnICd9fSwgICAgIC8vQ0hSSVNUTUFTIElTTEFORAorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0MnLCAnWScsICcgJ319LCAgICAgIC8vQ1lQUlVTCisgICAge1JFR19ET01BSU5fSElfNUdIWiwgeydDJywgJ1onLCAnICd9fSwgICAgICAvL0NaRUNIIFJFUFVCTElDCisgICAge1JFR19ET01BSU5fRVRTSSwgeydEJywgJ0UnLCAnICd9fSwgICAgICAvL0dFUk1BTlkKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydEJywgJ0onLCAnICd9fSwgICAgIC8vREpJQk9VVEkKKyAgICB7UkVHX0RPTUFJTl9FVFNJLCB7J0QnLCAnSycsICcgJ319LCAgICAgIC8vREVOTUFSSworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0QnLCAnTScsICcgJ319LCAgICAgLy9ET01JTklDQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0QnLCAnTycsICcgJ319LCAgICAgICAvL0RPTUlOSUNBTiBSRVBVQkxJQworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0QnLCAnWicsICcgJ319LCAgICAgLy9BTEdFUklBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnRScsICdDJywgJyAnfX0sICAgICAgIC8vRUNVQURPUgorICAgIHtSRUdfRE9NQUlOX0hJXzVHSFosIHsnRScsICdFJywgJyAnfX0sICAgICAgLy9FU1RPTklBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnRScsICdHJywgJyAnfX0sICAgICAvL0VHWVBUCisgICAge1JFR19ET01BSU5fV09STEQsIHsnRScsICdIJywgJyAnfX0sICAgICAvL1dFU1RFUk4gU0FIQVJBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnRScsICdSJywgJyAnfX0sICAgICAvL0VSSVRSRUEKKyAgICB7UkVHX0RPTUFJTl9FVFNJLCB7J0UnLCAnUycsICcgJ319LCAgICAgIC8vU1BBSU4KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydFJywgJ1QnLCAnICd9fSwgICAgIC8vRVRISU9QSUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydGJywgJ0knLCAnICd9fSwgICAgICAvL0ZJTkxBTkQKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydGJywgJ0onLCAnICd9fSwgICAgIC8vRklKSQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0YnLCAnSycsICcgJ319LCAgICAgLy9GQUxLTEFORCBJU0xBTkRTIChNQUxWSU5BUykKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydGJywgJ00nLCAnICd9fSwgICAgIC8vTUlDUk9ORVNJQSwgRkVERVJBVEVEIFNUQVRFUyBPRgorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0YnLCAnTycsICcgJ319LCAgICAgLy9GQVJPRSBJU0xBTkRTCisgICAge1JFR19ET01BSU5fRVRTSSwgeydGJywgJ1InLCAnICd9fSwgICAgICAvL0ZSQU5DRQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0cnLCAnQScsICcgJ319LCAgICAgLy9HQUJPTgorICAgIHtSRUdfRE9NQUlOX0VUU0ksIHsnRycsICdCJywgJyAnfX0sICAgICAgLy9VTklURUQgS0lOR0RPTQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0cnLCAnRCcsICcgJ319LCAgICAgLy9HUkVOQURBCisgICAge1JFR19ET01BSU5fSElfNUdIWiwgeydHJywgJ0UnLCAnICd9fSwgICAgIC8vR0VPUkdJQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0cnLCAnRicsICcgJ319LCAgICAgLy9GUkVOQ0ggR1VJQU5BCisgICAge1JFR19ET01BSU5fRVRTSSwgeydHJywgJ0cnLCAnICd9fSwgICAgICAvL0dVRVJOU0VZCisgICAge1JFR19ET01BSU5fV09STEQsIHsnRycsICdIJywgJyAnfX0sICAgICAvL0dIQU5BCisgICAge1JFR19ET01BSU5fV09STEQsIHsnRycsICdJJywgJyAnfX0sICAgICAgLy9HSUJSQUxUQVIKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydHJywgJ0wnLCAnICd9fSwgICAgIC8vR1JFRU5MQU5ECisgICAge1JFR19ET01BSU5fV09STEQsIHsnRycsICdNJywgJyAnfX0sICAgICAvL0dBTUJJQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0cnLCAnTicsICcgJ319LCAgICAgLy9HVUlORUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydHJywgJ1AnLCAnICd9fSwgICAgIC8vR1VBREVMT1VQRQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0cnLCAnUScsICcgJ319LCAgICAgLy9FUVVBVE9SSUFMIEdVSU5FQQorICAgIHtSRUdfRE9NQUlOX0VUU0ksIHsnRycsICdSJywgJyAnfX0sICAgICAgLy9HUkVFQ0UKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydHJywgJ1MnLCAnICd9fSwgICAgIC8vU09VVEggR0VPUkdJQSBBTkQgVEhFIFNPVVRIIFNBTkRXSUNIIElTTEFORFMKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydHJywgJ1QnLCAnICd9fSwgICAgICAgLy9HVUFURU1BTEEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydHJywgJ1UnLCAnICd9fSwgICAgIC8vR1VBTQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0cnLCAnVycsICcgJ319LCAgICAgLy9HVUlORUEtQklTU0FVCisgICAge1JFR19ET01BSU5fV09STEQsIHsnRycsICdZJywgJyAnfX0sICAgICAvL0dVWUFOQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0gnLCAnSycsICcgJ319LCAgICAgIC8vSE9OR0tPTkcKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydIJywgJ00nLCAnICd9fSwgICAgIC8vSEVBUkQgSVNMQU5EIEFORCBNQ0RPTkFMRCBJU0xBTkRTCisgICAge1JFR19ET01BSU5fV09STEQsIHsnSCcsICdOJywgJyAnfX0sICAgICAgIC8vSE9ORFVSQVMKKyAgICB7UkVHX0RPTUFJTl9ISV81R0haLCB7J0gnLCAnUicsICcgJ319LCAgICAgIC8vQ1JPQVRJQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0gnLCAnVCcsICcgJ319LCAgICAgLy9IQUlUSQorICAgIHtSRUdfRE9NQUlOX0hJXzVHSFosIHsnSCcsICdVJywgJyAnfX0sICAgICAgLy9IVU5HQVJZCisgICAge1JFR19ET01BSU5fQVBBQywgeydJJywgJ0QnLCAnICd9fSwgICAgIC8vSU5ET05FU0lBCisgICAge1JFR19ET01BSU5fRVRTSSwgeydJJywgJ0UnLCAnICd9fSwgICAgIC8vSVJFTEFORCAgICAgICAgCisgICAge1JFR19ET01BSU5fV09STEQsIHsnSScsICdMJywgJyAnfX0sICAgICAgICAvL0lTUkVBTAorICAgIHtSRUdfRE9NQUlOX0VUU0ksIHsnSScsICdNJywgJyAnfX0sICAgICAgLy9JU0xFIE9GIE1BTgorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0knLCAnTicsICcgJ319LCAgICAgIC8vSU5ESUEKKyAgICB7UkVHX0RPTUFJTl9FVFNJLCB7J0knLCAnTycsICcgJ319LCAgICAgLy9CUklUSVNIIElORElBTiBPQ0VBTiBURVJSSVRPUlkKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydJJywgJ1EnLCAnICd9fSwgICAgIC8vSVJBUQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0knLCAnUicsICcgJ319LCAgICAgLy9JUkFOLCBJU0xBTUlDIFJFUFVCTElDIE9GCisgICAge1JFR19ET01BSU5fV09STEQsIHsnSScsICdTJywgJyAnfX0sICAgICAgLy9JQ0VMQU5ECisgICAge1JFR19ET01BSU5fRVRTSSwgeydJJywgJ1QnLCAnICd9fSwgICAgICAvL0lUQUxZCisgICAge1JFR19ET01BSU5fRVRTSSwgeydKJywgJ0UnLCAnICd9fSwgICAgICAvL0pFUlNFWQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0onLCAnTScsICcgJ319LCAgICAgLy9KQU1BSUNBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnSicsICdPJywgJyAnfX0sICAgICAvL0pPUkRBTgorICAgIHtSRUdfRE9NQUlOX0pBUEFOLCB7J0onLCAnUCcsICcgJ319LCAgICAgLy9KQVBBTgorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0snLCAnRScsICcgJ319LCAgICAgLy9LRU5ZQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0snLCAnRycsICcgJ319LCAgICAgLy9LWVJHWVpTVEFOCisgICAge1JFR19ET01BSU5fV09STEQsIHsnSycsICdIJywgJyAnfX0sICAgICAvL0NBTUJPRElBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnSycsICdJJywgJyAnfX0sICAgICAvL0tJUklCQVRJCisgICAge1JFR19ET01BSU5fV09STEQsIHsnSycsICdNJywgJyAnfX0sICAgICAvL0NPTU9ST1MKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydLJywgJ04nLCAnICd9fSwgICAgIC8vU0FJTlQgS0lUVFMgQU5EIE5FVklTCisgICAge1JFR19ET01BSU5fS09SRUEsIHsnSycsICdQJywgJyAnfX0sICAgICAvL0tPUkVBLCBERU1PQ1JBVElDIFBFT1BMRSdTIFJFUFVCTElDIE9GCisgICAge1JFR19ET01BSU5fS09SRUEsIHsnSycsICdSJywgJyAnfX0sICAgICAvL0tPUkVBLCBSRVBVQkxJQyBPRiAKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydLJywgJ1cnLCAnICd9fSwgICAgIC8vS1VXQUlUCisgICAge1JFR19ET01BSU5fV09STEQsIHsnSycsICdZJywgJyAnfX0sICAgICAvL0NBWU1BTiBJU0xBTkRTCisgICAge1JFR19ET01BSU5fV09STEQsIHsnSycsICdaJywgJyAnfX0sICAgICAvL0tBWkFLSFNUQU4KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydMJywgJ0EnLCAnICd9fSwgICAgIC8vTEFPIFBFT1BMRSdTIERFTU9DUkFUSUMgUkVQVUJMSUMKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydMJywgJ0InLCAnICd9fSwgICAgIC8vTEVCQU5PTgorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0wnLCAnQycsICcgJ319LCAgICAgLy9TQUlOVCBMVUNJQQorICAgIHtSRUdfRE9NQUlOX0VUU0ksIHsnTCcsICdJJywgJyAnfX0sICAgICAgLy9MSUVDSFRFTlNURUlOCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTCcsICdLJywgJyAnfX0sICAgICAvL1NSSSBMQU5LQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J0wnLCAnUicsICcgJ319LCAgICAgLy9MSUJFUklBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTCcsICdTJywgJyAnfX0sICAgICAvL0xFU09USE8KKyAgICB7UkVHX0RPTUFJTl9ISV81R0haLCB7J0wnLCAnVCcsICcgJ319LCAgICAgIC8vTElUSFVBTklBCisgICAge1JFR19ET01BSU5fRVRTSSwgeydMJywgJ1UnLCAnICd9fSwgICAgICAvL0xVWEVNQk9VUkcKKyAgICB7UkVHX0RPTUFJTl9ISV81R0haLCB7J0wnLCAnVicsICcgJ319LCAgICAgIC8vTEFUVklBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTCcsICdZJywgJyAnfX0sICAgICAvL0xJQllBTiBBUkFCIEpBTUFISVJJWUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydNJywgJ0EnLCAnICd9fSwgICAgIC8vTU9ST0NDTworICAgIHtSRUdfRE9NQUlOX0VUU0ksIHsnTScsICdDJywgJyAnfX0sICAgICAgLy9NT05BQ08KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydNJywgJ0QnLCAnICd9fSwgICAgIC8vTU9MRE9WQSwgUkVQVUJMSUMgT0YKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydNJywgJ0UnLCAnICd9fSwgICAgIC8vTU9OVEVORUdSTworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J00nLCAnRycsICcgJ319LCAgICAgLy9NQURBR0FTQ0FSCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTScsICdIJywgJyAnfX0sICAgICAvL01BUlNIQUxMIElTTEFORFMKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydNJywgJ0snLCAnICd9fSwgICAgIC8vTUFDRURPTklBLCBUSEUgRk9STUVSIFlVR09TTEFWIFJFUFVCTElDIE9GCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTScsICdMJywgJyAnfX0sICAgICAvL01BTEkKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydNJywgJ00nLCAnICd9fSwgICAgIC8vTVlBTk1BUgorICAgIHtSRUdfRE9NQUlOX0hJXzVHSFosIHsnTScsICdOJywgJyAnfX0sICAgICAvL01PTkdPTElBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTScsICdPJywgJyAnfX0sICAgICAvL01BQ0FPCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTScsICdQJywgJyAnfX0sICAgICAvL05PUlRIRVJOIE1BUklBTkEgSVNMQU5EUworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J00nLCAnUScsICcgJ319LCAgICAgLy9NQVJUSU5JUVVFCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTScsICdSJywgJyAnfX0sICAgICAvL01BVVJJVEFOSUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydNJywgJ1MnLCAnICd9fSwgICAgIC8vTU9OVFNFUlJBVAorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J00nLCAnVCcsICcgJ319LCAgICAgIC8vTUFMVEEgICAgIAorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J00nLCAnVScsICcgJ319LCAgICAgLy9NQVVSSVRJVVMKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydNJywgJ1YnLCAnICd9fSwgICAgIC8vTUFMRElWRVMKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydNJywgJ1cnLCAnICd9fSwgICAgIC8vTUFMQVdJCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTScsICdYJywgJyAnfX0sICAgICAgIC8vTUVYSUNPCisgICAge1JFR19ET01BSU5fSElfNUdIWiwgeydNJywgJ1knLCAnICd9fSwgICAgICAgLy9NQUxBWVNJQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J00nLCAnWicsICcgJ319LCAgICAgLy9NT1pBTUJJUVVFCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTicsICdBJywgJyAnfX0sICAgICAvL05BTUlCSUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydOJywgJ0MnLCAnICd9fSwgICAgIC8vTkVXIENBTEVET05JQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J04nLCAnRScsICcgJ319LCAgICAgLy9OSUdFUgorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J04nLCAnRicsICcgJ319LCAgICAgLy9OT1JGT0xEIElTTEFORAorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J04nLCAnRycsICcgJ319LCAgICAgLy9OSUdFUklBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTicsICdJJywgJyAnfX0sICAgICAgIC8vTklDQVJBR1VBCisgICAge1JFR19ET01BSU5fRVRTSSwgeydOJywgJ0wnLCAnICd9fSwgICAgICAvL05FVEhFUkxBTkRTCisgICAge1JFR19ET01BSU5fV09STEQsIHsnTicsICdPJywgJyAnfX0sICAgICAgLy9OT1JXQVkKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydOJywgJ1AnLCAnICd9fSwgICAgIC8vTkVQQUwKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydOJywgJ1InLCAnICd9fSwgICAgIC8vTkFVUlUKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydOJywgJ1UnLCAnICd9fSwgICAgIC8vTklVRQorICAgIHtSRUdfRE9NQUlOX0VUU0ksIHsnTicsICdaJywgJyAnfX0sICAgICAgLy9ORVcgWkVBTEFORAorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J08nLCAnTScsICcgJ319LCAgICAgLy9PTUFOCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUCcsICdBJywgJyAnfX0sICAgICAgIC8vUEFOQU1BCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUCcsICdFJywgJyAnfX0sICAgICAgIC8vUEVSVQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1AnLCAnRicsICcgJ319LCAgICAgLy9GUkVOQ0ggUE9MWU5FU0lBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUCcsICdHJywgJyAnfX0sICAgICAvL1BBUFVBIE5FVyBHVUlORUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydQJywgJ0gnLCAnICd9fSwgICAgICAvL1BISUxJUFBJTkVTCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUCcsICdLJywgJyAnfX0sICAgICAvL1BBS0lTVEFOCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUCcsICdMJywgJyAnfX0sICAgICAgLy9QT0xBTkQKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydQJywgJ00nLCAnICd9fSwgICAgIC8vU0FJTlQgUElFUlJFIEFORCBNSVFVRUxPTgorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1AnLCAnTicsICcgJ319LCAgICAgLy9QSVRDQUlSTgorICAgIHtSRUdfRE9NQUlOX0ZDQywgeydQJywgJ1InLCAnICd9fSwgICAgICAgLy9QVUVSVE8gUklDTworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1AnLCAnUycsICcgJ319LCAgICAgICAgLy9QQUxFU1RJTklBTiBURVJSSVRPUlksIE9DQ1VQSUVECisgICAge1JFR19ET01BSU5fRVRTSSwgeydQJywgJ1QnLCAnICd9fSwgICAgICAvL1BPUlRVR0FMCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUCcsICdXJywgJyAnfX0sICAgICAvL1BBTEFVCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUCcsICdZJywgJyAnfX0sICAgICAvL1BBUkFHVUFZCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUScsICdBJywgJyAnfX0sICAgICAvL1FBVEFSCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUicsICdFJywgJyAnfX0sICAgICAvL1JFVU5JT04KKyAgICB7UkVHX0RPTUFJTl9ISV81R0haLCB7J1InLCAnTycsICcgJ319LCAgICAgIC8vUk9NQU5JQQorICAgIHtSRUdfRE9NQUlOX0hJXzVHSFosIHsnUicsICdTJywgJyAnfX0sICAgICAgLy9TRVJCSUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydSJywgJ1UnLCAnICd9fSwgICAgICAgLy9SVVNTSUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydSJywgJ1cnLCAnICd9fSwgICAgIC8vUldBTkRBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUycsICdBJywgJyAnfX0sICAgICAgLy9TQVVESSBBUkFCSUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydTJywgJ0InLCAnICd9fSwgICAgIC8vU09MT01PTiBJU0xBTkRTCisgICAge1JFR19ET01BSU5fRVRTSSwgeydTJywgJ0MnLCAnICd9fSwgICAgICAvL1NFWUNIRUxMRVMKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydTJywgJ0QnLCAnICd9fSwgICAgIC8vU1VEQU4KKyAgICB7UkVHX0RPTUFJTl9FVFNJLCB7J1MnLCAnRScsICcgJ319LCAgICAgIC8vU1dFREVOCisgICAge1JFR19ET01BSU5fQVBBQywgeydTJywgJ0cnLCAnICd9fSwgICAgICAvL1NJTkdBUE9SRQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1MnLCAnSCcsICcgJ319LCAgICAgLy9TQUlOVCBIRUxFTkEKKyAgICB7UkVHX0RPTUFJTl9ISV81R0haLCB7J1MnLCAnSScsICcgJ319LCAgICAgIC8vU0xPVkVOTklBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUycsICdKJywgJyAnfX0sICAgICAvL1NWQUxCQVJEIEFORCBKQU4gTUFZRU4KKyAgICB7UkVHX0RPTUFJTl9ISV81R0haLCB7J1MnLCAnSycsICcgJ319LCAgICAgIC8vU0xPVkFLSUEKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydTJywgJ0wnLCAnICd9fSwgICAgIC8vU0lFUlJBIExFT05FICAgICAgCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUycsICdNJywgJyAnfX0sICAgICAvL1NBTiBNQVJJTk8KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydTJywgJ04nLCAnICd9fSwgICAgIC8vU0VORUdBTAorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1MnLCAnTycsICcgJ319LCAgICAgLy9TT01BTElBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUycsICdSJywgJyAnfX0sICAgICAvL1NVUklOQU1FCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUycsICdUJywgJyAnfX0sICAgICAvL1NBTyBUT01FIEFORCBQUklOQ0lQRQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1MnLCAnVicsICcgJ319LCAgICAgICAvL0VMIFNBTFZBRE9SCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUycsICdZJywgJyAnfX0sICAgICAvL1NZUklBTiBBUkFCIFJFUFVCTElDCisgICAge1JFR19ET01BSU5fV09STEQsIHsnUycsICdaJywgJyAnfX0sICAgICAvL1NXQVpJTEFORAorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1QnLCAnQycsICcgJ319LCAgICAgLy9UVVJLUyBBTkQgQ0FJQ09TIElTTEFORFMKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydUJywgJ0QnLCAnICd9fSwgICAgIC8vQ0hBRAorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1QnLCAnRicsICcgJ319LCAgICAgLy9GUkVOQ0ggU09VVEhFUk4gVEVSUklUT1JJRVMKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydUJywgJ0cnLCAnICd9fSwgICAgIC8vVE9HTworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1QnLCAnSCcsICcgJ319LCAgICAgICAvL1RIQUlMQU5ECisgICAge1JFR19ET01BSU5fV09STEQsIHsnVCcsICdKJywgJyAnfX0sICAgICAvL1RBSklLSVNUQU4KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydUJywgJ0snLCAnICd9fSwgICAgIC8vVE9LRUxBVQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1QnLCAnTCcsICcgJ319LCAgICAgLy9USU1PUi1MRVNURQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1QnLCAnTScsICcgJ319LCAgICAgLy9UVVJLTUVOSVNUQU4KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydUJywgJ04nLCAnICd9fSwgICAgIC8vVFVOSVNJQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1QnLCAnTycsICcgJ319LCAgICAgLy9UT05HQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1QnLCAnUicsICcgJ319LCAgICAgIC8vVFVSS0VZCisgICAge1JFR19ET01BSU5fV09STEQsIHsnVCcsICdUJywgJyAnfX0sICAgICAvL1RSSU5JREFEIEFORCBUT0JBR08KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydUJywgJ1YnLCAnICd9fSwgICAgIC8vVFVWQUxVCisgICAge1JFR19ET01BSU5fSElfNUdIWiwgeydUJywgJ1cnLCAnICd9fSwgICAgICAgLy9UQUlXQU4sIFBST1ZJTkNFIE9GIENISU5BCisgICAge1JFR19ET01BSU5fV09STEQsIHsnVCcsICdaJywgJyAnfX0sICAgICAvL1RBTlpBTklBLCBVTklURUQgUkVQVUJMSUMgT0YKKyAgICB7UkVHX0RPTUFJTl9ISV81R0haLCB7J1UnLCAnQScsICcgJ319LCAgICAgICAvL1VLUkFJTkUKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydVJywgJ0cnLCAnICd9fSwgICAgIC8vVUdBTkRBCisgICAge1JFR19ET01BSU5fRkNDLCB7J1UnLCAnTScsICcgJ319LCAgICAgICAvL1VOSVRFRCBTVEFURVMgTUlOT1IgT1VUTFlJTkcgSVNMQU5EUworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1UnLCAnWScsICcgJ319LCAgICAgICAvL1VSVUdVQVkKKyAgICB7UkVHX0RPTUFJTl9ISV81R0haLCB7J1UnLCAnWicsICcgJ319LCAgICAgLy9VWkJFS0lTVEFOCisgICAge1JFR19ET01BSU5fRVRTSSwgeydWJywgJ0EnLCAnICd9fSwgICAgICAvL0hPTFkgU0VFIChWQVRJQ0FOIENJVFkgU1RBVEUpCisgICAge1JFR19ET01BSU5fV09STEQsIHsnVicsICdDJywgJyAnfX0sICAgICAvL1NBSU5UIFZJTkNFTlQgQU5EIFRIRSBHUkVOQURJTkVTCisgICAge1JFR19ET01BSU5fSElfNUdIWiwgeydWJywgJ0UnLCAnICd9fSwgICAgICAgLy9WRU5FWlVFTEEKKyAgICB7UkVHX0RPTUFJTl9FVFNJLCB7J1YnLCAnRycsICcgJ319LCAgICAgICAvL1ZJUkdJTiBJU0xBTkRTLCBCUklUSVNICisgICAge1JFR19ET01BSU5fRkNDLCB7J1YnLCAnSScsICcgJ319LCAgICAgICAvL1ZJUkdJTiBJU0xBTkRTLCBVUworICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1YnLCAnTicsICcgJ319LCAgICAgIC8vVklFVCBOQU0KKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydWJywgJ1UnLCAnICd9fSwgICAgIC8vVkFOVUFUVQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1cnLCAnRicsICcgJ319LCAgICAgLy9XQUxMSVMgQU5EIEZVVFVOQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1cnLCAnUycsICcgJ319LCAgICAgLy9TT01PQQorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1knLCAnRScsICcgJ319LCAgICAgLy9ZRU1FTgorICAgIHtSRUdfRE9NQUlOX1dPUkxELCB7J1knLCAnVCcsICcgJ319LCAgICAgLy9NQVlPVFRFCisgICAge1JFR19ET01BSU5fV09STEQsIHsnWicsICdBJywgJyAnfX0sICAgICAgLy9TT1VUSCBBRlJJQ0EKKyAgICB7UkVHX0RPTUFJTl9XT1JMRCwgeydaJywgJ00nLCAnICd9fSwgICAgIC8vWkFNQklBCisgICAge1JFR19ET01BSU5fV09STEQsIHsnWicsICdXJywgJyAnfX0sICAgICAvL1pJTUJBQldFCisKKyAgICB7UkVHX0RPTUFJTl9LT1JFQSwgeydLJywgJzEnLCAnICd9fSwgICAgLy9Lb3JlYSBhbHRlcm5hdGUgMQorICAgIHtSRUdfRE9NQUlOX0tPUkVBLCB7J0snLCAnMicsICcgJ319LCAgICAvL0tvcmVhIGFsdGVybmF0ZSAyCisgICAge1JFR19ET01BSU5fS09SRUEsIHsnSycsICczJywgJyAnfX0sICAgIC8vS29yZWEgYWx0ZXJuYXRlIDMKKyAgICB7UkVHX0RPTUFJTl9LT1JFQSwgeydLJywgJzQnLCAnICd9fSwgICAgLy9Lb3JlYSBhbHRlcm5hdGUgNAorfTsKKworCisvL1RoZSBjaGFubmVscyBsaXN0ZWQgaGVyZSBkb2Vzbid0IG1lYW4gdGhleSBhcmUgdmFsaWQgY2hhbm5lbHMgZm9yIGNlcnRhaW4gZG9tYWluLiBUaGV5IGFyZSBoZXJlIG9ubHkgdG8gcHJlc2VudAorLy93aGV0aGVyIHRoZXkgc2hvdWxkIGJlIHBhc3NpdmUgc2Nhbm5lZC4KK3RDc3JEb21haW5DaG5JbmZvIGdDc3JEb21haW5DaG5JbmZvW05VTV9SRUdfRE9NQUlOU10gPQoreworICAgIC8vUkVHX0RPTUFJTl9GQ0MKKyAgICB7CisgICAgICAgIFJFR19ET01BSU5fRkNDLAorICAgICAgICA0NSwgLy9OdW0gY2hhbm5lbHMKKyAgICAgICAgLy9DaGFubmVscworICAgICAgICB7CisgICAgICAgICAgICAvLzVHSHoKKyAgICAgICAgICAgIC8vNTE4MCAtIDUyNDAKKyAgICAgICAgICAgIHszNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NDAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQ0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0OCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzUyNTAgdG8gNTM1MAorICAgICAgICAgICAgezUyLCBlU0lSX1BBU1NJVkVfU0NBTn0sCisgICAgICAgICAgICB7NTYsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs2MCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezY0LCBlU0lSX1BBU1NJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzU0NzAgdG8gNTcyNQorICAgICAgICAgICAgezEwMCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezEwNCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezEwOCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezExMiwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezExNiwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezEyMCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezEyNCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezEyOCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezEzMiwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezEzNiwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezE0MCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgLy81NzQ1IC0gNTgyNQorICAgICAgICAgICAgezE0OSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTUzLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNTcsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE2MSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTY1LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vNC45R0h6CisgICAgICAgICAgICAvLzQ5MjAgLSA1MDgwCisgICAgICAgICAgICB7MjQwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyNDQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezI0OCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjUyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyMDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIxMiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjE2LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vMiw0R0h6CisgICAgICAgICAgICB7MSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7OCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7OSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezExLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTMsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgfQorICAgIH0sCisgICAgLy9SRUdfRE9NQUlOX0VUU0kKKyAgICB7CisgICAgICAgIFJFR19ET01BSU5fRVRTSSwKKyAgICAgICAgNDUsIC8vTnVtIGNoYW5uZWxzCisgICAgICAgIC8vQ2hhbm5lbHMKKyAgICAgICAgeworICAgICAgICAgICAgLy81R0h6CisgICAgICAgICAgICAvLzUxODAgLSA1MjQwCisgICAgICAgICAgICB7MzYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0NCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy81MjUwIHRvIDUzNTAKKyAgICAgICAgICAgIHs1MiwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezU2LCBlU0lSX1BBU1NJVkVfU0NBTn0sCisgICAgICAgICAgICB7NjAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs2NCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgLy81NDcwIHRvIDU3MjUKKyAgICAgICAgICAgIHsxMDAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMDQsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMDgsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMTIsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMTYsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjQsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjgsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMzIsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMzYsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNDAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vNTc0NSAtIDU4MjUKKyAgICAgICAgICAgIHsxNDksIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE1MywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTU3LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNjEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE2NSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzQuOUdIegorICAgICAgICAgICAgLy80OTIwIC0gNTA4MAorICAgICAgICAgICAgezI0MCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjQ0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyNDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezI1MiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjA4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyMTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIxNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzIsNEdIegorICAgICAgICAgICAgezEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezMsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezUsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezcsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezksIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEzLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgIH0KKyAgICB9LAorICAgIC8vUkVHX0RPTUFJTl9KQVBBTgorICAgIHsKKyAgICAgICAgUkVHX0RPTUFJTl9KQVBBTiwKKyAgICAgICAgNDUsIC8vTnVtIGNoYW5uZWxzCisgICAgICAgIC8vQ2hhbm5lbHMKKyAgICAgICAgeworICAgICAgICAgICAgLy81R0h6CisgICAgICAgICAgICAvLzUxODAgLSA1MjQwCisgICAgICAgICAgICB7MzYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0NCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy81MjUwIHRvIDUzNTAKKyAgICAgICAgICAgIHs1MiwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezU2LCBlU0lSX1BBU1NJVkVfU0NBTn0sCisgICAgICAgICAgICB7NjAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs2NCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgLy81NDcwIHRvIDU3MjUKKyAgICAgICAgICAgIHsxMDAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMDQsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMDgsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMTIsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMTYsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjQsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjgsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMzIsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMzYsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNDAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vNTc0NSAtIDU4MjUKKyAgICAgICAgICAgIHsxNDksIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE1MywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTU3LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNjEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE2NSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzQuOUdIegorICAgICAgICAgICAgLy80OTIwIC0gNTA4MAorICAgICAgICAgICAgezI0MCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjQ0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyNDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezI1MiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjA4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyMTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIxNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzIsNEdIegorICAgICAgICAgICAgezEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezMsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezUsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezcsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezksIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEzLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgIH0KKyAgICB9LAorICAgIC8vUkVHX0RPTUFJTl9XT1JMRAorICAgIHsKKyAgICAgICAgUkVHX0RPTUFJTl9XT1JMRCwKKyAgICAgICAgNDUsIC8vTnVtIGNoYW5uZWxzCisgICAgICAgIC8vQ2hhbm5lbHMKKyAgICAgICAgeworICAgICAgICAgICAgLy81R0h6CisgICAgICAgICAgICAvLzUxODAgLSA1MjQwCisgICAgICAgICAgICB7MzYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0NCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy81MjUwIHRvIDUzNTAKKyAgICAgICAgICAgIHs1MiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NTYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezYwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs2NCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzU0NzAgdG8gNTcyNQorICAgICAgICAgICAgezEwMCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTA0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezExMiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTE2LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEyNCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTI4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMzIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEzNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTQwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vNTc0NSAtIDU4MjUKKyAgICAgICAgICAgIHsxNDksIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE1MywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTU3LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNjEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE2NSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzQuOUdIegorICAgICAgICAgICAgLy80OTIwIC0gNTA4MAorICAgICAgICAgICAgezI0MCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjQ0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyNDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezI1MiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjA4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyMTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIxNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzIsNEdIegorICAgICAgICAgICAgezEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezMsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezUsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezcsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezksIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEzLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgIH0KKyAgICB9LAorICAgIC8vUkVHX0RPTUFJTl9OX0FNRVJfRVhDX0ZDQworICAgIHsKKyAgICAgICAgUkVHX0RPTUFJTl9OX0FNRVJfRVhDX0ZDQywKKyAgICAgICAgNDUsIC8vTnVtIGNoYW5uZWxzCisgICAgICAgIC8vQ2hhbm5lbHMKKyAgICAgICAgeworICAgICAgICAgICAgLy81R0h6CisgICAgICAgICAgICAvLzUxODAgLSA1MjQwCisgICAgICAgICAgICB7MzYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0NCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy81MjUwIHRvIDUzNTAKKyAgICAgICAgICAgIHs1MiwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezU2LCBlU0lSX1BBU1NJVkVfU0NBTn0sCisgICAgICAgICAgICB7NjAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs2NCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgLy81NDcwIHRvIDU3MjUKKyAgICAgICAgICAgIHsxMDAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEwNCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTA4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezExNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTIwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEyOCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTMyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMzYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE0MCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzU3NDUgLSA1ODI1CisgICAgICAgICAgICB7MTQ5LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNTMsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE1NywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTYxLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNjUsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy80LjlHSHoKKyAgICAgICAgICAgIC8vNDkyMCAtIDUwODAKKyAgICAgICAgICAgIHsyNDAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezI0NCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjQ4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyNTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIwOCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjEyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyMTYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy8yLDRHSHoKKyAgICAgICAgICAgIHsxLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHszLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs1LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs2LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs3LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs5LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICB9CisgICAgfSwKKyAgICAvL1JFR19ET01BSU5fQVBBQworICAgIHsKKyAgICAgICAgUkVHX0RPTUFJTl9BUEFDLAorICAgICAgICA0NSwgLy9OdW0gY2hhbm5lbHMKKyAgICAgICAgLy9DaGFubmVscworICAgICAgICB7CisgICAgICAgICAgICAvLzVHSHoKKyAgICAgICAgICAgIC8vNTE4MCAtIDUyNDAKKyAgICAgICAgICAgIHszNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NDAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQ0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0OCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzUyNTAgdG8gNTM1MAorICAgICAgICAgICAgezUyLCBlU0lSX1BBU1NJVkVfU0NBTn0sCisgICAgICAgICAgICB7NTYsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs2MCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezY0LCBlU0lSX1BBU1NJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzU0NzAgdG8gNTcyNQorICAgICAgICAgICAgezEwMCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTA0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezExMiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTE2LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEyNCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTI4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMzIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEzNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTQwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vNTc0NSAtIDU4MjUKKyAgICAgICAgICAgIHsxNDksIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE1MywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTU3LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNjEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE2NSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzQuOUdIegorICAgICAgICAgICAgLy80OTIwIC0gNTA4MAorICAgICAgICAgICAgezI0MCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjQ0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyNDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezI1MiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjA4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyMTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIxNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzIsNEdIegorICAgICAgICAgICAgezEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezMsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezUsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezcsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezksIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEzLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgIH0KKyAgICB9LAorICAgIC8vUkVHX0RPTUFJTl9LT1JFQQorICAgIHsKKyAgICAgICAgUkVHX0RPTUFJTl9LT1JFQSwKKyAgICAgICAgNDUsIC8vTnVtIGNoYW5uZWxzCisgICAgICAgIC8vQ2hhbm5lbHMKKyAgICAgICAgeworICAgICAgICAgICAgLy81R0h6CisgICAgICAgICAgICAvLzUxODAgLSA1MjQwCisgICAgICAgICAgICB7MzYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0NCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy81MjUwIHRvIDUzNTAKKyAgICAgICAgICAgIHs1MiwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgezU2LCBlU0lSX1BBU1NJVkVfU0NBTn0sCisgICAgICAgICAgICB7NjAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs2NCwgZVNJUl9QQVNTSVZFX1NDQU59LAorICAgICAgICAgICAgLy81NDcwIHRvIDU3MjUKKyAgICAgICAgICAgIHsxMDAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMDQsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMDgsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMTIsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMTYsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjQsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjgsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMzIsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMzYsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNDAsIGVTSVJfUEFTU0lWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vNTc0NSAtIDU4MjUKKyAgICAgICAgICAgIHsxNDksIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE1MywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTU3LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNjEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE2NSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzQuOUdIegorICAgICAgICAgICAgLy80OTIwIC0gNTA4MAorICAgICAgICAgICAgezI0MCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjQ0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyNDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezI1MiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjA4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyMTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIxNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzIsNEdIegorICAgICAgICAgICAgezEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezMsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezUsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezcsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezksIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEzLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgIH0KKyAgICB9LAorICAgIC8vUkVHX0RPTUFJTl9ISV81R0haCisgICAgeworICAgICAgICBSRUdfRE9NQUlOX0hJXzVHSFosCisgICAgICAgIDQ1LCAvL051bSBjaGFubmVscworICAgICAgICAvL0NoYW5uZWxzCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vNUdIegorICAgICAgICAgICAgLy81MTgwIC0gNTI0MAorICAgICAgICAgICAgezM2LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0MCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NDQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQ4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vNTI1MCB0byA1MzUwCisgICAgICAgICAgICB7NTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezU2LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs2MCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NjQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy81NDcwIHRvIDU3MjUKKyAgICAgICAgICAgIHsxMDAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEwNCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTA4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezExNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTIwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEyOCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTMyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMzYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE0MCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzU3NDUgLSA1ODI1CisgICAgICAgICAgICB7MTQ5LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNTMsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE1NywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTYxLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNjUsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy80LjlHSHoKKyAgICAgICAgICAgIC8vNDkyMCAtIDUwODAKKyAgICAgICAgICAgIHsyNDAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezI0NCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjQ4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyNTIsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIwOCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjEyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyMTYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy8yLDRHSHoKKyAgICAgICAgICAgIHsxLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHszLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs1LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs2LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs3LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs4LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs5LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTEsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICB9CisgICAgfSwKKyAgICAvL1JFR19ET01BSU5fTk9fNUdIWgorICAgIHsKKyAgICAgICAgUkVHX0RPTUFJTl9OT181R0haLAorICAgICAgICA0NSwgLy9OdW0gY2hhbm5lbHMKKyAgICAgICAgLy9DaGFubmVscworICAgICAgICB7CisgICAgICAgICAgICAvLzVHSHoKKyAgICAgICAgICAgIC8vNTE4MCAtIDUyNDAKKyAgICAgICAgICAgIHszNiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NDAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezQ0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs0OCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICAvLzUyNTAgdG8gNTM1MAorICAgICAgICAgICAgezUyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHs1NiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NjAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezY0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vNTQ3MCB0byA1NzI1CisgICAgICAgICAgICB7MTAwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMDQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEwOCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTEyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMTYsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEyMCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTI0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMjgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezEzMiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTM2LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNDAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgLy81NzQ1IC0gNTgyNQorICAgICAgICAgICAgezE0OSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTUzLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxNTcsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE2MSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTY1LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vNC45R0h6CisgICAgICAgICAgICAvLzQ5MjAgLSA1MDgwCisgICAgICAgICAgICB7MjQwLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyNDQsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezI0OCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjUyLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsyMDgsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezIxMiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MjE2LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIC8vMiw0R0h6CisgICAgICAgICAgICB7MSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7NywgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7OCwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7OSwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTAsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezExLCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgICAgIHsxMiwgZVNJUl9BQ1RJVkVfU0NBTn0sCisgICAgICAgICAgICB7MTMsIGVTSVJfQUNUSVZFX1NDQU59LAorICAgICAgICAgICAgezE0LCBlU0lSX0FDVElWRV9TQ0FOfSwKKyAgICAgICAgfQorICAgIH0sCit9OworI2VuZGlmCisKK2V4dGVybiBjb25zdCB0UmZDaGFubmVsUHJvcHMgcmZDaGFubmVsc1tOVU1fUkZfQ0hBTk5FTFNdOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIFx2YXIgZ1BoeVJhdGVzU3VwcHQKKyAqCisgKiBcYnJpZWYgUmF0ZSBzdXBwb3J0IGxvb2t1cCB0YWJsZQorICoKKyAqCisgKiBUaGlzIGlzIGEgIGxvb2t1cCB0YWJsZSBpbmRleGluZyByYXRlcyAmICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdG8KKyAqIHN1cHBvcnQuICBHaXZlbiBhIHJhdGUgKGluICB1bml0ZXMgb2YgMC41TXBicykgJiB0aHJlZSBib29sZWFucyAoTUlNTworICogRW5hYmxlZCwgQ2hhbm5lbCAgQm9uZGluZyBFbmFibGVkLCAmIENvbmNhdGVuYXRpb24gIEVuYWJsZWQpLCBvbmUgY2FuCisgKiBkZXRlcm1pbmUgIHdoZXRoZXIgIHRoZSBnaXZlbiAgcmF0ZSAgaXMgIHN1cHBvcnRlZCAgYnkgY29tcHV0aW5nICB0d28KKyAqIGluZGljZXMuICBUaGUgIGZpcnN0IG1hcHMgIHRoZSByYXRlIHRvICB0YWJsZSByb3cgYXMgIGluZGljYXRlZCBiZWxvdworICogKGkuZS4gZUhkZFN1cHBSYXRlXzZNYnBzIG1hcHMgdG8gIHJvdyB6ZXJvLCBlSGRkU3VwcFJhdGVfOU1icHMgdG8gcm93CisgKiAxLCBhbmQgc28gb24pLiAgSW5kZXggdHdvIGNhbiBiZSBjb21wdXRlZCBsaWtlIHNvOgorICoKKyAqIFxjb2RlCisgICBpZHgyID0gKCBmRXNmICA/IDB4NCA6IDB4MCApIHwKKyAgICAgICAgICAoIGZDYiAgID8gMHgyIDogMHgwICkgfAorICAgICAgICAgICggZk1pbW8gPyAweDEgOiAweDAgKTsKKyAqIFxlbmRjb2RlCisgKgorICoKKyAqIEdpdmVuIHRoYXQ6CisgKgorIFxjb2RlCisgICBmU3VwcG9ydGVkID0gZ1BoeVJhdGVzU3VwcHRbaWR4MV1baWR4Ml07CisgXGVuZGNvZGUKKyAqCisgKgorICogVGhpcyB0YWJsZSBpcyBiYXNlZCBvbiAgdGhlIGRvY3VtZW50ICJQSFkgU3VwcG9ydGVkIFJhdGVzLmRvYyIuICBUaGlzCisgKiB0YWJsZSBpcyAgcGVybWlzc2l2ZSBpbiB0aGF0IGEgIHJhdGUgaXMgcmVmbGVjdGVkICBhcyBiZWluZyBzdXBwb3J0ZWQKKyAqIGV2ZW4gIHdoZW4gdHVybmluZyAgb2ZmIGFuICBlbmFibGVkIGZlYXR1cmUgIHdvdWxkIGJlICByZXF1aXJlZC4gIEZvcgorICogaW5zdGFuY2UsICJQSFkgU3VwcG9ydGVkIFJhdGVzIiAgbGlzdHMgNDJNcGJzIGFzIHVuc3VwcG9ydGVkIHdoZW4gQ0IsCisgKiBFU0YsICYgIE1JTU8gYXJlIGFsbCAgb24uICBIb3dldmVyLCAgaWYgd2UgdHVybiAgb2ZmIGVpdGhlciBvZiAgQ0Igb3IKKyAqIE1JTU8sIGl0IHRoZW4gYmVjb21lcyBzdXBwb3J0ZWQuICAgVGhlcmVmb3JlLCB3ZSBtYXJrIGl0IGFzIHN1cHBvcnRlZAorICogZXZlbiBpbiBpbmRleCA3IG9mIHRoaXMgdGFibGUuCisgKgorICoKKyAqLworCitzdGF0aWMgY29uc3QgdEFOSV9CT09MRUFOIGdQaHlSYXRlc1N1cHB0WzI0XVs4XSA9IHsKKworICAgIC8vIFNTRiAgIFNTRiAgICBTU0YgICAgU1NGICAgIEVTRiAgICBFU0YgICAgRVNGICAgIEVTRgorICAgIC8vIFNJTU8gIE1JTU8gICBTSU1PICAgTUlNTyAgIFNJTU8gICBNSU1PICAgU0lNTyAgIE1JTU8KKyAgICAvLyBObyBDQiBObyBDQiAgQ0IgICAgIENCICAgICBObyBDQiAgTm8gQ0IgIENCICAgICBDQgorICAgIHsgVFJVRSwgIFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUgIH0sIC8vIDZNYnBzCisgICAgeyBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFLCAgVFJVRSAgfSwgLy8gOU1icHMKKyAgICB7IFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyAxMk1icHMKKyAgICB7IFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyAxOE1icHMKKyAgICB7IEZBTFNFLCBGQUxTRSwgVFJVRSwgIFRSVUUsICBGQUxTRSwgRkFMU0UsIFRSVUUsICBUUlVFICB9LCAvLyAyME1icHMKKyAgICB7IFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyAyNE1icHMKKyAgICB7IFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyAzNk1icHMKKyAgICB7IEZBTFNFLCBGQUxTRSwgVFJVRSwgIFRSVUUsICBGQUxTRSwgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyA0ME1icHMKKyAgICB7IEZBTFNFLCBGQUxTRSwgVFJVRSwgIFRSVUUsICBGQUxTRSwgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyA0Mk1icHMKKyAgICB7IFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyA0OE1icHMKKyAgICB7IFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFLCAgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyA1NE1icHMKKyAgICB7IEZBTFNFLCBUUlVFLCAgVFJVRSwgIFRSVUUsICBGQUxTRSwgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyA3Mk1icHMKKyAgICB7IEZBTFNFLCBGQUxTRSwgVFJVRSwgIFRSVUUsICBGQUxTRSwgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyA4ME1icHMKKyAgICB7IEZBTFNFLCBGQUxTRSwgVFJVRSwgIFRSVUUsICBGQUxTRSwgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyA4NE1icHMKKyAgICB7IEZBTFNFLCBUUlVFLCAgVFJVRSwgIFRSVUUsICBGQUxTRSwgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyA5Nk1icHMKKyAgICB7IEZBTFNFLCBUUlVFLCAgVFJVRSwgIFRSVUUsICBGQUxTRSwgVFJVRSwgIFRSVUUsICBUUlVFICB9LCAvLyAxMDhNYnBzCisgICAgeyBGQUxTRSwgRkFMU0UsIFRSVUUsICBUUlVFLCAgRkFMU0UsIFRSVUUsICBUUlVFLCAgVFJVRSAgfSwgLy8gMTIwTWJwcworICAgIHsgRkFMU0UsIEZBTFNFLCBUUlVFLCAgVFJVRSwgIEZBTFNFLCBUUlVFLCAgVFJVRSwgIFRSVUUgIH0sIC8vIDEyNk1icHMKKyAgICB7IEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFICB9LCAvLyAxNDRNYnBzCisgICAgeyBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSAgfSwgLy8gMTYwTWJwcworICAgIHsgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSwgIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUgIH0sIC8vIDE2OE1icHMKKyAgICB7IEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFICB9LCAvLyAxOTJNYnBzCisgICAgeyBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSAgfSwgLy8gMjE2TWJwcworICAgIHsgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSwgIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUgIH0sIC8vIDI0ME1icHMKKworfTsKKworI2RlZmluZSBDQVNFX1JFVFVSTl9TVFIobikgY2FzZSAobik6IHJldHVybiAoI24pCisKK2NvbnN0IGNoYXIgKgorZ2V0X2VSb2FtQ21kU3RhdHVzX3N0cihlUm9hbUNtZFN0YXR1cyB2YWwpCit7CisgICAgc3dpdGNoICh2YWwpCisgICAgeworICAgICAgICBDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX0NBTkNFTExFRCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUk9BTUlOR19TVEFSVCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUk9BTUlOR19DT01QTEVUSU9OKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSKGVDU1JfUk9BTV9BU1NPQ0lBVElPTl9TVEFSVCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fQVNTT0NJQVRJT05fQ09NUExFVElPTik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fRElTQVNTT0NJQVRFRCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fU0hPVUxEX1JPQU0pOworICAgICAgICBDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1NDQU5fRk9VTkRfTkVXX0JTUyk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fTE9TVExJTkspOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAidW5rbm93biI7CisgICAgfQorfQorCitjb25zdCBjaGFyICoKK2dldF9lQ3NyUm9hbVJlc3VsdF9zdHIoZUNzclJvYW1SZXN1bHQgdmFsKQoreworICAgIHN3aXRjaCAodmFsKQorICAgIHsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSKGVDU1JfUk9BTV9SRVNVTFRfTk9ORSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0ZBSUxVUkUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1JFU1VMVF9BU1NPQ0lBVEVEKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSKGVDU1JfUk9BTV9SRVNVTFRfTk9UX0FTU09DSUFURUQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1JFU1VMVF9NSUNfRkFJTFVSRSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0ZPUkNFRCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0RJU0FTU09DX0lORCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0RFQVVUSF9JTkQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1JFU1VMVF9DQVBfQ0hBTkdFRCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfQ09OTkVDVCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUihlQ1NSX1JPQU1fUkVTVUxUX0lCU1NfSU5BQ1RJVkUpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFIoZUNTUl9ST0FNX1JFU1VMVF9JQlNTX05FV19QRUVSKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSKGVDU1JfUk9BTV9SRVNVTFRfSUJTU19DT0FMRVNDRUQpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAidW5rbm93biI7CisgICAgfQorfQorCisKKwordEFOSV9CT09MRUFOIGNzckdldEJzc0lkQnNzRGVzYyggdEhhbEhhbmRsZSBoSGFsLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCB0Q3NyQnNzaWQgKnBCc3NJZCApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJzc0lkLCAmcFNpckJzc0Rlc2MtPmJzc0lkWyAwIF0sIHNpemVvZih0Q3NyQnNzaWQpICk7CisgICAgcmV0dXJuKCBUUlVFICk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzcklzQnNzSWRFcXVhbCggdEhhbEhhbmRsZSBoSGFsLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjMSwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzIgKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHRBTklfQk9PTEVBTiBmRXF1YWwgPSBGQUxTRTsKKyAgICB0Q3NyQnNzaWQgYnNzSWQxOworICAgIHRDc3JCc3NpZCBic3NJZDI7CisKKyAgICBkbyB7CisgICAgICAgIGlmICggIXBTaXJCc3NEZXNjMSApIGJyZWFrOworICAgICAgICBpZiAoICFwU2lyQnNzRGVzYzIgKSBicmVhazsKKworICAgICAgICBpZiAoICFjc3JHZXRCc3NJZEJzc0Rlc2MoIHBNYWMsIHBTaXJCc3NEZXNjMSwgJmJzc0lkMSApICkgYnJlYWs7CisgICAgICAgIGlmICggIWNzckdldEJzc0lkQnNzRGVzYyggcE1hYywgcFNpckJzc0Rlc2MyLCAmYnNzSWQyICkgKSBicmVhazsKKworICAgICAgICAvL3NpckNvbXBhcmVNYWNBZGRyCisgICAgICAgIGZFcXVhbCA9IGNzcklzTWFjQWRkcmVzc0VxdWFsKHBNYWMsICZic3NJZDEsICZic3NJZDIpOworCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBmRXF1YWwgKTsKK30KKwordEFOSV9CT09MRUFOIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSWJzcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICkKK3sKKyAgICByZXR1cm4oIGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JQlNTX0NPTk5FQ1RFRCA9PSBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlICk7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZElic3MoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApCit7CisgICAgcmV0dXJuKCBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfSUJTU19ESVNDT05ORUNURUQgPT0gcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RTdGF0ZSApOworfQorCit0QU5JX0JPT0xFQU4gY3NySXNDb25uU3RhdGVDb25uZWN0ZWRJbmZyYSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICkKK3sKKyAgICByZXR1cm4oIGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9JTkZSQV9BU1NPQ0lBVEVEID09IHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGUgKTsKK30KKwordEFOSV9CT09MRUFOIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQgKQoreworICAgIGlmKCBjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZElic3MoIHBNYWMsIHNlc3Npb25JZCApIHx8IGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSW5mcmEoIHBNYWMsIHNlc3Npb25JZCApIHx8IGNzcklzQ29ublN0YXRlQ29ubmVjdGVkV2RzKCBwTWFjLCBzZXNzaW9uSWQpICkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JJc0Nvbm5TdGF0ZUluZnJhKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQgKQoreworICAgIHJldHVybiggY3NySXNDb25uU3RhdGVDb25uZWN0ZWRJbmZyYSggcE1hYywgc2Vzc2lvbklkICkgKTsKK30KKwordEFOSV9CT09MRUFOIGNzcklzQ29ublN0YXRlSWJzcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICkKK3sKKyAgICByZXR1cm4oIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSWJzcyggcE1hYywgc2Vzc2lvbklkICkgfHwgY3NySXNDb25uU3RhdGVEaXNjb25uZWN0ZWRJYnNzKCBwTWFjLCBzZXNzaW9uSWQgKSApOworfQorCisKK3RBTklfQk9PTEVBTiBjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZFdkcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICkKK3sKKyAgICByZXR1cm4oIGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9XRFNfQ09OTkVDVEVEID09IHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5jb25uZWN0U3RhdGUgKTsKK30KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3RBTklfQk9PTEVBTiBjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZEluZnJhQXAoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApCit7CisgICAgcmV0dXJuKCAoZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lORlJBX0NPTk5FQ1RFRCA9PSBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlKSB8fAorICAgICAgICAoZUNTUl9BU1NPQ19TVEFURV9UWVBFX0lORlJBX0RJU0NPTk5FQ1RFRCA9PSBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlICkgKTsKK30KKyNlbmRpZgorCit0QU5JX0JPT0xFQU4gY3NySXNDb25uU3RhdGVEaXNjb25uZWN0ZWRXZHMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCApCit7CisgICAgcmV0dXJuKCBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfV0RTX0RJU0NPTk5FQ1RFRCA9PSBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdFN0YXRlICk7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JJc0Nvbm5TdGF0ZVdkcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICkKK3sKKyAgICByZXR1cm4oIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkV2RzKCBwTWFjLCBzZXNzaW9uSWQgKSB8fAorICAgICAgICBjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZFdkcyggcE1hYywgc2Vzc2lvbklkICkgKTsKK30KKwordEFOSV9CT09MRUFOIGNzcklzQW55U2Vzc2lvbkluQ29ubmVjdFN0YXRlKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICB0QU5JX1UzMiBpOworICAgIHRBTklfQk9PTEVBTiBmUmMgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKyApCisgICAgeworICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIGkgKSAmJiAKKyAgICAgICAgICAgICggY3NySXNDb25uU3RhdGVJbmZyYSggcE1hYywgaSApIHx8IGNzcklzQ29ublN0YXRlSWJzcyggcE1hYywgaSApICkgKQorICAgICAgICB7CisgICAgICAgICAgICBmUmMgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICggZlJjICk7Cit9CisKK3RBTklfUzggY3NyR2V0SW5mcmFTZXNzaW9uSWQoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIHRBTklfVTggaTsKKyAgICB0QU5JX1M4IHNlc3Npb25pZCA9IC0xOworCisgICAgZm9yKCBpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBpICkgJiYgY3NySXNDb25uU3RhdGVJbmZyYSggcE1hYywgaSApICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlc3Npb25pZCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIHNlc3Npb25pZCApOworfQorCit0QU5JX1U4IGNzckdldEluZnJhT3BlcmF0aW9uQ2hhbm5lbCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBzZXNzaW9uSWQpCit7CisgICAgdEFOSV9VOCBjaGFubmVsOworCisgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSkKKyAgICB7CisgICAgICAgIGNoYW5uZWwgPSBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjaGFubmVsID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGNoYW5uZWw7Cit9CisKKy8vVGhpcyByb3V0aW5lIHdpbGwgcmV0dXJuIG9wZXJhdGluZyBjaGFubmVsIG9uIEZJUlNUIEJTUyB0aGF0IGlzIGFjdGl2ZS9vcGVyYXRpbmcgdG8gYmUgdXNlZCBmb3IgY29uY3VycmVuY3kgbW9kZS4KKy8vSWYgb3RoZXIgQlNTIGlzIG5vdCB1cCBvciBub3QgY29ubmVjdGVkIGl0IHdpbGwgcmV0dXJuIDAgCisKK3RBTklfVTggY3NyR2V0Q29uY3VycmVudE9wZXJhdGlvbkNoYW5uZWwoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gTlVMTDsKKyAgdEFOSV9VOCBpID0gMDsKKworICBmb3IoIGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKyApCisgIHsKKyAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgaSApICkKKyAgICAgIHsKKyAgICAgICAgICBwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgaSApOworCisgICAgICAgICAgaWYgKE5VTEwgIT0gcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAoKChwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hID09IFZPU19TVEFfTU9ERSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hID09IFZPU19QMlBfQ0xJRU5UX01PREUpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAocFNlc3Npb24tPmNvbm5lY3RTdGF0ZSA9PSBlQ1NSX0FTU09DX1NUQVRFX1RZUEVfSU5GUkFfQVNTT0NJQVRFRCkpIAorICAgICAgICAgICAgICAgICAgICAgIHx8IAorICAgICAgICAgICAgICAgICAgICAgICgoKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEgPT0gVk9TX1AyUF9HT19NT0RFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEgPT0gVk9TX1NUQV9TQVBfTU9ERSkpICYmCisgICAgICAgICAgICAgICAgICAgICAgIChwU2Vzc2lvbi0+Y29ubmVjdFN0YXRlICE9IGVDU1JfQVNTT0NfU1RBVEVfVFlQRV9OT1RfQ09OTkVDVEVEKSkKKyAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIChwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsKTsKKyAgICAgICAgICB9CisKKyAgICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKwordEFOSV9CT09MRUFOIGNzcklzQWxsU2Vzc2lvbkRpc2Nvbm5lY3RlZCggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgICAgdEFOSV9VMzIgaTsKKyAgICB0QU5JX0JPT0xFQU4gZlJjID0gZUFOSV9CT09MRUFOX1RSVUU7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKyApCisgICAgeworICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIGkgKSAmJiAhY3NySXNDb25uU3RhdGVEaXNjb25uZWN0ZWQoIHBNYWMsIGkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZSYyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICggZlJjICk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzcklzSW5mcmFDb25uZWN0ZWQoIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIHRBTklfVTMyIGk7CisgICAgdEFOSV9CT09MRUFOIGZSYyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKworICAgIGZvciggaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgaSApICYmIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSW5mcmEoIHBNYWMsIGkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZSYyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKCBmUmMgKTsKK30KKwordEFOSV9CT09MRUFOIGNzcklzQ29uY3VycmVudEluZnJhQ29ubmVjdGVkKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICB0QU5JX1UzMiBpLCBub09mQ29ubmVjdGVkSW5mcmEgPSAwOworCisgICAgdEFOSV9CT09MRUFOIGZSYyA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKworICAgIGZvciggaSA9IDA7IGkgPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgaSApICYmIGNzcklzQ29ublN0YXRlQ29ubmVjdGVkSW5mcmEoIHBNYWMsIGkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICsrbm9PZkNvbm5lY3RlZEluZnJhOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTW9yZSB0aGFuIG9uZSBJbmZyYSBTdGEgQ29ubmVjdGVkCisgICAgaWYobm9PZkNvbm5lY3RlZEluZnJhID4gMSkKKyAgICB7CisgICAgICAgIGZSYyA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIH0KKworICAgIHJldHVybiAoIGZSYyApOworfQorCit0QU5JX0JPT0xFQU4gY3NySXNJQlNTU3RhcnRlZCggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgICAgdEFOSV9VMzIgaTsKKyAgICB0QU5JX0JPT0xFQU4gZlJjID0gZUFOSV9CT09MRUFOX0ZBTFNFOworCisgICAgZm9yKCBpID0gMDsgaSA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBpICkgJiYgY3NySXNDb25uU3RhdGVJYnNzKCBwTWFjLCBpICkgKQorICAgICAgICB7CisgICAgICAgICAgICBmUmMgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICggZlJjICk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzcklzQlRBTVBTdGFydGVkKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICB0QU5JX1UzMiBpOworICAgIHRBTklfQk9PTEVBTiBmUmMgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKyApCisgICAgeworICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIGkgKSAmJiBjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZFdkcyggcE1hYywgaSApICkKKyAgICAgICAgeworICAgICAgICAgICAgZlJjID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIGZSYyApOworfQorCit0QU5JX0JPT0xFQU4gY3NySXNCVEFNUCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkICkKK3sKKyAgICByZXR1cm4gKCBjc3JJc0Nvbm5TdGF0ZUNvbm5lY3RlZFdkcyggcE1hYywgc2Vzc2lvbklkICkgKTsKK30KKworCit0QU5JX0JPT0xFQU4gY3NySXNDb25uU3RhdGVEaXNjb25uZWN0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIHJldHVybiAoZUNTUl9BU1NPQ19TVEFURV9UWVBFX05PVF9DT05ORUNURUQgPT0gcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RTdGF0ZSk7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JJc1ZhbGlkTWNDb25jdXJyZW50U2Vzc2lvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IE5VTEw7CisgICAgdEFOSV9VOCBJbmRleCA9IDAsIENvbm5JZCA9IDA7CisgICAgdFZPU19DT05fTU9ERSBNb2RlW0NTUl9ST0FNX1NFU1NJT05fTUFYXTsKKworICAgIC8vQ2hlY2sgZm9yIE1DQyBzdXBwb3J0CisgICAgaWYgKCFwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZlbmFibGVNQ0NNb2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB9CisKKyAgICBmb3IoIEluZGV4ID0gMDsgSW5kZXggPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgSW5kZXgrKyApIAorICAgICAgICBNb2RlW0luZGV4XSA9IFZPU19NQVhfTk9fT0ZfTU9ERTsKKyAKKyAgICBmb3IoIEluZGV4ID0gMDsgSW5kZXggPCBDU1JfUk9BTV9TRVNTSU9OX01BWDsgSW5kZXgrKyApCisgICAgeworICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIEluZGV4ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgSW5kZXggKTsKKworICAgICAgICAgICAgaWYgKE5VTEwgIT0gcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNb2RlW0Nvbm5JZF0gPSBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hOworICAgICAgICAgICAgICAgIENvbm5JZCsrOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICB9CisKKyAgICBJbmRleCAgPSAwOworICAgIGlmIChNb2RlW0luZGV4XSA9PSBWT1NfU1RBX01PREUgJiYgQ29ubklkID4gSW5kZXgpCisgICAgeworICAgICAgICBzd2l0Y2ggKE1vZGVbSW5kZXgrMV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVk9TX1AyUF9DTElFTlRfTU9ERSA6CisgICAgICAgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIGNhc2UgVk9TX01BWF9OT19PRl9NT0RFIDoKKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChNb2RlW0luZGV4XSA9PSBWT1NfUDJQX0NMSUVOVF9NT0RFICYmIENvbm5JZCA+IEluZGV4KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChNb2RlW0luZGV4ICsxXSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBWT1NfU1RBX01PREUgOgorICAgICAgICAgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIGNhc2UgVk9TX01BWF9OT19PRl9NT0RFIDoKKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7Cit9CisKK3N0YXRpYyB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gY3NyR2V0QnNzQ2FwYWJpbGl0aWVzKCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjICkKK3sKKyAgICB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gZG90MTFDYXBzOworCisgICAgLy90U2lyTWFjQ2FwYWJpbGl0eUluZm8gaXMgMTYtYml0CisgICAgcGFsX2dldF9VMTYoICh0QU5JX1U4ICopJnBTaXJCc3NEZXNjLT5jYXBhYmlsaXR5SW5mbywgKHRBTklfVTE2ICopJmRvdDExQ2FwcyApOworCisgICAgcmV0dXJuKCBkb3QxMUNhcHMgKTsKK30KKwordEFOSV9CT09MRUFOIGNzcklzSW5mcmFCc3NEZXNjKCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjICkKK3sKKyAgICB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gZG90MTFDYXBzID0gY3NyR2V0QnNzQ2FwYWJpbGl0aWVzKCBwU2lyQnNzRGVzYyApOworCisgICAgcmV0dXJuKCAodEFOSV9CT09MRUFOKWRvdDExQ2Fwcy5lc3MgKTsKK30KKworCit0QU5JX0JPT0xFQU4gY3NySXNJYnNzQnNzRGVzYyggdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYyApCit7CisgICAgdFNpck1hY0NhcGFiaWxpdHlJbmZvIGRvdDExQ2FwcyA9IGNzckdldEJzc0NhcGFiaWxpdGllcyggcFNpckJzc0Rlc2MgKTsKKworICAgIHJldHVybiggKHRBTklfQk9PTEVBTilkb3QxMUNhcHMuaWJzcyApOworfQorCit0QU5JX0JPT0xFQU4gY3NySXNRb1NCc3NEZXNjKCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjICkKK3sKKyAgICB0U2lyTWFjQ2FwYWJpbGl0eUluZm8gZG90MTFDYXBzID0gY3NyR2V0QnNzQ2FwYWJpbGl0aWVzKCBwU2lyQnNzRGVzYyApOworCisgICAgcmV0dXJuKCAodEFOSV9CT09MRUFOKWRvdDExQ2Fwcy5xb3MgKTsKK30KKwordEFOSV9CT09MRUFOIGNzcklzUHJpdmFjeSggdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYyApCit7CisgICAgdFNpck1hY0NhcGFiaWxpdHlJbmZvIGRvdDExQ2FwcyA9IGNzckdldEJzc0NhcGFiaWxpdGllcyggcFNpckJzc0Rlc2MgKTsKKworICAgIHJldHVybiggKHRBTklfQk9PTEVBTilkb3QxMUNhcHMucHJpdmFjeSApOworfQorCisKK3RBTklfQk9PTEVBTiBjc3JJczExZFN1cHBvcnRlZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHJldHVybihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFkU3VwcG9ydEVuYWJsZWQpOworfQorCisKK3RBTklfQk9PTEVBTiBjc3JJczExaFN1cHBvcnRlZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHJldHVybihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFoU3VwcG9ydEVuYWJsZWQpOworfQorCisKK3RBTklfQk9PTEVBTiBjc3JJczExZVN1cHBvcnRlZCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHJldHVybihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFlU3VwcG9ydEVuYWJsZWQpOworfQorCit0QU5JX0JPT0xFQU4gY3NySXNNQ0NTdXBwb3J0ZWQgKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgIHJldHVybihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZlbmFibGVNQ0NNb2RlKTsKKworfQorCit0QU5JX0JPT0xFQU4gY3NySXNXbW1TdXBwb3J0ZWQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBpZihlQ3NyUm9hbVdtbU5vUW9zID09IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uV01NU3VwcG9ydE1vZGUpCisgICAgeworICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFOworICAgIH0KK30KKworCisKKworLy9wSWVzIGlzIHRoZSBJRXMgZm9yIHBTaXJCc3NEZXNjMgordEFOSV9CT09MRUFOIGNzcklzU3NpZEVxdWFsKCB0SGFsSGFuZGxlIGhIYWwsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYzIsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMyICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZkVxdWFsID0gRkFMU0U7CisgICAgdFNpck1hY1NTaWQgU3NpZDEsIFNzaWQyOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMxID0gTlVMTDsKKyAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzTG9jYWwgPSBwSWVzMjsKKworICAgIGRvIHsKKyAgICAgICAgaWYoICggTlVMTCA9PSBwU2lyQnNzRGVzYzEgKSB8fCAoIE5VTEwgPT0gcFNpckJzc0Rlc2MyICkgKSBicmVhazsKKyAgICAgICAgaWYoICFwSWVzTG9jYWwgJiYgIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRQYXJzZWRCc3NEZXNjcmlwdGlvbklFcyhwTWFjLCBwU2lyQnNzRGVzYzIsICZwSWVzTG9jYWwpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBmYWlsIHRvIHBhcnNlIElFc1xuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRQYXJzZWRCc3NEZXNjcmlwdGlvbklFcyhwTWFjLCBwU2lyQnNzRGVzYzEsICZwSWVzMSkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiggKCAhcEllczEtPlNTSUQucHJlc2VudCApIHx8ICggIXBJZXNMb2NhbC0+U1NJRC5wcmVzZW50ICkgKSBicmVhazsKKyAgICAgICAgaWYgKCBwSWVzMS0+U1NJRC5udW1fc3NpZCAhPSBwSWVzTG9jYWwtPlNTSUQubnVtX3NzaWQgKSBicmVhazsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBTc2lkMS5zc0lkLCBwSWVzMS0+U1NJRC5zc2lkLCBwSWVzMS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgU3NpZDIuc3NJZCwgcEllc0xvY2FsLT5TU0lELnNzaWQsIHBJZXNMb2NhbC0+U1NJRC5udW1fc3NpZCk7CisKKyAgICAgICAgZkVxdWFsID0gcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgU3NpZDEuc3NJZCwgU3NpZDIuc3NJZCwgcEllc0xvY2FsLT5TU0lELm51bV9zc2lkICk7CisKKyAgICB9IHdoaWxlKCAwICk7CisgICAgaWYocEllczEpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXMxKTsKKyAgICB9CisgICAgaWYoIHBJZXNMb2NhbCAmJiAhcEllczIgKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwSWVzTG9jYWwpOworICAgIH0KKworICAgIHJldHVybiggZkVxdWFsICk7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JJc0FuaVdtZVN1cHBvcnRlZCh0RG90MTFmSUVBaXJnbyAqcEllQWlyZ28pCit7CisgICAgdEFOSV9CT09MRUFOIGZSZXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICBpZihwSWVBaXJnbyAmJiBwSWVBaXJnby0+cHJlc2VudCAmJiBwSWVBaXJnby0+UHJvcENhcGFiaWxpdHkucHJlc2VudCkKKyAgICB7CisgICAgICAgIGZSZXQgPSAodEFOSV9CT09MRUFOKShQUk9QX0NBUEFCSUxJVFlfR0VUKCBXTUUsIHBJZUFpcmdvLT5Qcm9wQ2FwYWJpbGl0eS5jYXBhYmlsaXR5ICkpOworICAgIH0KKworICAgIHJldHVybiBmUmV0OworfQorCisKKworCisvL3BJZXMgY2FuIGJlIHBhc3NlZCBpbiBhcyBOVUxMIGlmIHRoZSBjYWxsZXIgZG9lc24ndCBoYXZlIG9uZSBwcmVwYXJlZAordEFOSV9CT09MRUFOIGNzcklzQnNzRGVzY3JpcHRpb25XbWUoIHRIYWxIYW5kbGUgaEhhbCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcEllcyApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgLy8gQXNzdW1lIHRoYXQgV01FIGlzIGZvdW5kLi4uCisgICAgdEFOSV9CT09MRUFOIGZXbWUgPSBUUlVFOworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXNUZW1wID0gcEllczsKKworICAgIGRvCisgICAgeworICAgICAgICBpZihwSWVzVGVtcCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRQYXJzZWRCc3NEZXNjcmlwdGlvbklFcyhwTWFjLCBwU2lyQnNzRGVzYywgJnBJZXNUZW1wKSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZXbWUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBpZiB0aGUgQWlyZ29Qcm9wcmlldGFyeSBpbmRpY2F0b3IgaXMgZm91bmQsIHRoZW4gV01FIGlzIHN1cHBvcnRlZC4uLgorICAgICAgICBpZiAoIGNzcklzQW5pV21lU3VwcG9ydGVkKCZwSWVzVGVtcC0+QWlyZ28pICkgYnJlYWs7CisgICAgICAgIC8vIGlmIHRoZSBXbWUgSW5mbyBJRSBpcyBmb3VuZCwgdGhlbiBXTUUgaXMgc3VwcG9ydGVkLi4uCisgICAgICAgIGlmICggQ1NSX0lTX1FPU19CU1MocEllc1RlbXApICkgYnJlYWs7CisgICAgICAgIC8vIGlmIG5vbmUgb2YgdGhlc2UgYXJlIGZvdW5kLCB0aGVuIFdNRSBpcyBOT1Qgc3VwcG9ydGVkLi4uCisgICAgICAgIGZXbWUgPSBGQUxTRTsKKyAgICB9IHdoaWxlKCAwICk7CisgICAgaWYoICFjc3JJc1dtbVN1cHBvcnRlZCggcE1hYyApICYmIGZXbWUpCisgICAgeworICAgICAgICBpZiggIXBJZXNUZW1wLT5IVENhcHMucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZXbWUgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiggKCBwSWVzID09IE5VTEwgKSAmJiAoIE5VTEwgIT0gcEllc1RlbXAgKSApCisgICAgeworICAgICAgICAvL3dlIGFsbG9jYXRlIG1lbW9yeSBoZXJlIHNvIGZyZWUgaXQgYmVmb3JlIHJldHVybmluZworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXNUZW1wKTsKKyAgICB9CisKKyAgICByZXR1cm4oIGZXbWUgKTsKK30KKwordEFOSV9CT09MRUFOIGNzcklzSGNmRW5hYmxlZCggdERvdDExZklFQWlyZ28gKnBJZUFpcmdvICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZkhjZlN1cHBvcnRlZCA9IEZBTFNFOworCisgICAgZkhjZlN1cHBvcnRlZCA9ICgodEFOSV9CT09MRUFOKShQUk9QX0NBUEFCSUxJVFlfR0VUKCBXTUUsIHBJZUFpcmdvLT5Qcm9wQ2FwYWJpbGl0eS5jYXBhYmlsaXR5ICkpIHx8CisgICAgICAgIChwSWVBaXJnby0+cHJlc2VudCAmJiBwSWVBaXJnby0+SENGLnByZXNlbnQgJiYgcEllQWlyZ28tPkhDRi5lbmFibGVkKSk7CisKKyAgICByZXR1cm4oIGZIY2ZTdXBwb3J0ZWQgKTsKK30KKworCitlQ3NyTWVkaWFBY2Nlc3NUeXBlIGNzckdldFFvU0Zyb21Cc3NEZXNjKCB0SGFsSGFuZGxlIGhIYWwsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcyApCit7CisgICAgZUNzck1lZGlhQWNjZXNzVHlwZSBxb3NUeXBlID0gZUNTUl9NRURJVU1fQUNDRVNTX0RDRjsKKworI2lmIGRlZmluZWQoVk9TU19FTkFCTEVEKQorICAgIFZPU19BU1NFUlQoIHBJZXMgIT0gTlVMTCApOworI2VuZGlmCisKKyAgICBkbworICAgeworICAgICAgICAvLyBpZiB3ZSBmaW5kIFdNTSBpbiB0aGUgQnNzIERlc2NyaXB0aW9uLCB0aGVuIHdlIGxldCB0aGlzCisgICAgICAgIC8vIG92ZXJyaWRlIGFuZCB1c2UgV01NLgorICAgICAgICBpZiAoIGNzcklzQnNzRGVzY3JpcHRpb25XbWUoIGhIYWwsIHBTaXJCc3NEZXNjLCBwSWVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBxb3NUeXBlID0gZUNTUl9NRURJVU1fQUNDRVNTX1dNTV9lRENGX0RTQ1A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiB0aGUgUW9TIGJpdCBpcyBvbiwgdGhlbiB0aGUgQVAgaXMgYWR2ZXJ0aXNpbmcgMTFFIFFvUy4uLgorICAgICAgICAgICAgaWYgKCBjc3JJc1FvU0Jzc0Rlc2MoIHBTaXJCc3NEZXNjICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNvdWxkIGJlIEhDRiBvciBlRENGLgorICAgICAgICAgICAgICAgICAgICBpZiAoIGNzcklzSGNmRW5hYmxlZCggJnBJZXMtPkFpcmdvICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcW9zVHlwZSA9IGVDU1JfTUVESVVNX0FDQ0VTU18xMWVfSENGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBxb3NUeXBlID0gZUNTUl9NRURJVU1fQUNDRVNTXzExZV9lRENGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBxb3NUeXBlID0gZUNTUl9NRURJVU1fQUNDRVNTX0RDRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNjYWxlIGJhY2sgYmFzZWQgb24gdGhlIHR5cGVzIHR1cm5lZCBvbiBmb3IgdGhlIGFkYXB0ZXIuLi4KKyAgICAgICAgICAgIGlmICggZUNTUl9NRURJVU1fQUNDRVNTXzExZV9lRENGID09IHFvc1R5cGUgJiYgIWNzcklzMTFlU3VwcG9ydGVkKCBoSGFsICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHFvc1R5cGUgPSBlQ1NSX01FRElVTV9BQ0NFU1NfRENGOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IHdoaWxlKDApOworCisgICAgcmV0dXJuKCBxb3NUeXBlICk7Cit9CisKKworCisKKy8vQ2FsbGVyIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHBJRVN0cnVjdAorZUhhbFN0YXR1cyBjc3JQYXJzZUJzc0Rlc2NyaXB0aW9uSUVzKHRIYWxIYW5kbGUgaEhhbCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcElFU3RydWN0KQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBpbnQgaWVMZW4gPSAoaW50KShwQnNzRGVzYy0+bGVuZ3RoICsgc2l6ZW9mKCBwQnNzRGVzYy0+bGVuZ3RoICkgLSBHRVRfRklFTERfT0ZGU0VUKCB0U2lyQnNzRGVzY3JpcHRpb24sIGllRmllbGRzICkpOworCisgICAgaWYoaWVMZW4gPiAwICYmIHBJRVN0cnVjdCkKKyAgICB7CisgICAgICAgIGlmKCFET1QxMUZfRkFJTEVEKGRvdDExZlVucGFja0JlYWNvbklFcyggcE1hYywgKHRBTklfVTggKilwQnNzRGVzYy0+aWVGaWVsZHMsIGllTGVuLCBwSUVTdHJ1Y3QgKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworLy9UaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGFyc2VkIElFcyB0byB0aGUgY2FsbGVyLiBDYWxsZXIgbXVzdCBmcmVlIHRoZSBtZW1vcnkKKy8vYWZ0ZXIgaXQgaXMgZG9uZSB3aXRoIHRoZSBkYXRhIG9ubHkgaWYgdGhpcyBmdW5jdGlvbiBzdWNjZWVkcworZUhhbFN0YXR1cyBjc3JHZXRQYXJzZWRCc3NEZXNjcmlwdGlvbklFcyh0SGFsSGFuZGxlIGhIYWwsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcEJzc0Rlc2MsIHREb3QxMWZCZWFjb25JRXMgKipwcElFU3RydWN0KQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICBpZihwQnNzRGVzYyAmJiBwcElFU3RydWN0KQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopcHBJRVN0cnVjdCwgc2l6ZW9mKHREb3QxMWZCZWFjb25JRXMpKTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikqcHBJRVN0cnVjdCwgc2l6ZW9mKHREb3QxMWZCZWFjb25JRXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclBhcnNlQnNzRGVzY3JpcHRpb25JRXMoaEhhbCwgcEJzc0Rlc2MsICpwcElFU3RydWN0KTsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICpwcElFU3RydWN0KTsKKyAgICAgICAgICAgICAgICAqcHBJRVN0cnVjdCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikgKTsKKyAgICAgICAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKworCit0QU5JX0JPT0xFQU4gY3NySXNOVUxMU1NJRCggdEFOSV9VOCAqcEJzc1NzaWQsIHRBTklfVTggbGVuICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZk51bGxTc2lkID0gRkFMU0U7CisKKyAgICB0QU5JX1UzMiBTc2lkTGVuZ3RoOworICAgIHRBTklfVTggKnBTc2lkU3RyOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGlmICggMCA9PSBsZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBmTnVsbFNzaWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvL0NvbnNpZGVyIDAgb3Igc3BhY2UgZm9yIGhpZGRlbiBTU0lECisgICAgICAgIGlmICggMCA9PSBwQnNzU3NpZFswXSApCisgICAgICAgIHsKKyAgICAgICAgICAgICBmTnVsbFNzaWQgPSBUUlVFOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgU3NpZExlbmd0aCA9IGxlbjsKKyAgICAgICAgcFNzaWRTdHIgPSBwQnNzU3NpZDsKKworICAgICAgICB3aGlsZSAoIFNzaWRMZW5ndGggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggKnBTc2lkU3RyICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgcFNzaWRTdHIrKzsKKyAgICAgICAgICAgIFNzaWRMZW5ndGgtLTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAwID09IFNzaWRMZW5ndGggKQorICAgICAgICB7CisgICAgICAgICAgICBmTnVsbFNzaWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoIDAgKTsKKworICAgIHJldHVybiBmTnVsbFNzaWQ7Cit9CisKKwordEFOSV9VMzIgY3NyR2V0RnJhZ1RocmVzaCggdEhhbEhhbmRsZSBoSGFsICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIHJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLkZyYWdtZW50YXRpb25UaHJlc2hvbGQ7Cit9CisKK3RBTklfVTMyIGNzckdldFJUU1RocmVzaCggdEhhbEhhbmRsZSBoSGFsICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIHJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLlJUU1RocmVzaG9sZDsKK30KKworZUNzclBoeU1vZGUgY3NyVHJhbnNsYXRlVG9QaHlNb2RlRnJvbUJzc0Rlc2MoIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MgKQoreworICAgIGVDc3JQaHlNb2RlIHBoeU1vZGU7CisKKyAgICBzd2l0Y2ggKCBwU2lyQnNzRGVzYy0+bndUeXBlICkKKyAgICB7CisgICAgICAgIGNhc2UgZVNJUl8xMUFfTldfVFlQRToKKyAgICAgICAgICAgIHBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFhOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlU0lSXzExQl9OV19UWVBFOgorICAgICAgICAgICAgcGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMWI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTSVJfMTFHX05XX1RZUEU6CisgICAgICAgICAgICBwaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFXzExZzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNJUl8xMU5fTldfVFlQRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFuOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuKCBwaHlNb2RlICk7Cit9CisKKwordEFOSV9VMzIgY3NyVHJhbnNsYXRlVG9XTklDZmdEb3QxMU1vZGUodHBBbmlTaXJHbG9iYWwgcE1hYywgZUNzckNmZ0RvdDExTW9kZSBjc3JEb3QxMU1vZGUpCit7CisgICAgdEFOSV9VMzIgcmV0OworCisgICAgc3dpdGNoKGNzckRvdDExTW9kZSkKKyAgICB7CisgICAgY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFX0FVVE86CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiICBXYXJuaW5nOiBzZWVzIGVDU1JfQ0ZHX0RPVDExX01PREVfQVVUTyBcbiIpKTsKKyAgICAgICAgLy9XZSBjYW5ub3QgZGVjaWRlIHVudGlsIG5vdy4KKyAgICAgICAgaWYocE1hYy0+cm9hbS5jb25maWdQYXJhbS5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFX1RBVVJVUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFX1RBVVJVUzoKKyAgICAgICAgcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFX1RBVVJVUzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQToKKyAgICAgICAgcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFXzExQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjoKKyAgICAgICAgcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFXzExQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzoKKyAgICAgICAgcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFXzExRzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTjoKKyAgICAgICAgcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFXzExTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFX1BPTEFSSVM6CisgICAgICAgIHJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV9QT0xBUklTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGVDU1JfQ0ZHX0RPVDExX01PREVfVElUQU46CisgICAgICAgIHJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV9USVRBTjsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGNhc2UgZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUdfT05MWToKKyAgICAgICByZXQgPSBXTklfQ0ZHX0RPVDExX01PREVfMTFHX09OTFk7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTl9PTkxZOgorICAgICAgIHJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMU5fT05MWTsKKyAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiZG9lc24ndCBleHBlY3QgJWQgYXMgY3NyRG8xMU1vZGVcbiIpLCBjc3JEb3QxMU1vZGUpOworICAgICAgICBpZihlQ1NSX0JBTkRfMjQgPT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5lQmFuZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gV05JX0NGR19ET1QxMV9NT0RFXzExRzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IFdOSV9DRkdfRE9UMTFfTU9ERV8xMUE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIChyZXQpOworfQorCisKKy8vVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSByZXR1cm4gdGhlIHN1cGVyIHNldCBvZiBzdXBwb3J0ZWQgbW9kZXMuIDExbiBpbXBsaWVzIDExYi9nL2Evbi4KK2VIYWxTdGF0dXMgY3NyR2V0UGh5TW9kZUZyb21Cc3ModHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpckJzc0Rlc2NyaXB0aW9uICpwQlNTRGVzY3JpcHRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyUGh5TW9kZSAqcFBoeU1vZGUsIHREb3QxMWZCZWFjb25JRXMgKnBJZXMpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIGVDc3JQaHlNb2RlIHBoeU1vZGUgPSBjc3JUcmFuc2xhdGVUb1BoeU1vZGVGcm9tQnNzRGVzYyhwQlNTRGVzY3JpcHRpb24pOworCisgICAgaWYoIHBJZXMgKQorICAgIHsKKyAgICAgICAgaWYocEllcy0+QWlyZ28ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEllcy0+QWlyZ28uUHJvcENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggUFJPUF9DQVBBQklMSVRZX0dFVCggVEFVUlVTLCBwSWVzLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5jYXBhYmlsaXR5ICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFX1RBVVJVUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYocEllcy0+SFRDYXBzLnByZXNlbnQgJiYgKGVDU1JfRE9UMTFfTU9ERV9UQVVSVVMgIT0gcGh5TW9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfMTFuOworICAgICAgICB9CisgICAgICAgICpwUGh5TW9kZSA9IHBoeU1vZGU7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworCit9CisKKworLy9UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvcnJlY3QgZUNTUl9DRkdfRE9UMTFfTU9ERSBpcyB0aGUgdHdvIHBoeU1vZGVzIG1hdGNoZXMKKy8vYnNzUGh5TW9kZSBpcyB0aGUgbW9kZSBkZXJpdmVkIGZyb20gdGhlIEJTUyBkZXNjcmlwdGlvbgorLy9mNUdoekJhbmQgaXMgZGVyaXZlZCBmcm9tIHRoZSBjaGFubmVsIGlkIG9mIEJTUyBkZXNjcmlwdGlvbgordEFOSV9CT09MRUFOIGNzckdldFBoeU1vZGVJblVzZSggZUNzclBoeU1vZGUgcGh5TW9kZUluLCBlQ3NyUGh5TW9kZSBic3NQaHlNb2RlLCB0QU5JX0JPT0xFQU4gZjVHaHpCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNzckNmZ0RvdDExTW9kZSAqcENmZ0RvdDExTW9kZVRvVXNlICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZk1hdGNoID0gRkFMU0U7CisgICAgZUNzckNmZ0RvdDExTW9kZSBjZmdEb3QxMU1vZGU7CisKKyAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTjsgLy8gdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZworCisgICAgc3dpdGNoKCBwaHlNb2RlSW4gKQorICAgIHsKKyAgICAgICAgY2FzZSBlQ1NSX0RPVDExX01PREVfYWJnOiAgIC8vMTFhIG9yIDExYiBvciAxMWcKKyAgICAgICAgICAgIGlmKCBmNUdoekJhbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZNYXRjaCA9IFRSVUU7CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBlQ1NSX0RPVDExX01PREVfMTFiID09IGJzc1BoeU1vZGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZNYXRjaCA9IFRSVUU7CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZk1hdGNoID0gVFJVRTsKKyAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYTogICAvLzExYQorICAgICAgICAgICAgaWYoIGY1R2h6QmFuZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZk1hdGNoID0gVFJVRTsKKyAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYV9PTkxZOiAgIC8vMTFhCisgICAgICAgICAgICBpZiggZUNTUl9ET1QxMV9NT0RFXzExYSA9PSBic3NQaHlNb2RlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmTWF0Y2ggPSBUUlVFOworICAgICAgICAgICAgICAgIGNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlQ1NSX0RPVDExX01PREVfMTFnOgorICAgICAgICAgICAgaWYoIWY1R2h6QmFuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggZUNTUl9ET1QxMV9NT0RFXzExYiA9PSBic3NQaHlNb2RlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZNYXRjaCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFCOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWToKKyAgICAgICAgICAgIGlmKCBlQ1NSX0RPVDExX01PREVfMTFnID09IGJzc1BoeU1vZGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZNYXRjaCA9IFRSVUU7CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWI6CisgICAgICAgICAgICBpZiggIWY1R2h6QmFuZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZk1hdGNoID0gVFJVRTsKKyAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZOgorICAgICAgICAgICAgaWYoIGVDU1JfRE9UMTFfTU9ERV8xMWIgPT0gYnNzUGh5TW9kZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZk1hdGNoID0gVFJVRTsKKyAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExbjoKKyAgICAgICAgICAgIGZNYXRjaCA9IFRSVUU7CisgICAgICAgICAgICBzd2l0Y2goYnNzUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExZzoKKyAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYjoKKyAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYToKKyAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExbjoKKyAgICAgICAgICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFX1RBVVJVUzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV8xMW5fT05MWToKKyAgICAgICAgICAgIGlmKChlQ1NSX0RPVDExX01PREVfMTFuID09IGJzc1BoeU1vZGUpIHx8IChlQ1NSX0RPVDExX01PREVfVEFVUlVTID09IGJzc1BoeU1vZGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZNYXRjaCA9IFRSVUU7CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV9UQVVSVVM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmTWF0Y2ggPSBUUlVFOworICAgICAgICAgICAgc3dpdGNoKGJzc1BoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWc6CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWI6CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV8xMWE6CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV8xMW46CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDU1JfRE9UMTFfTU9ERV9UQVVSVVM6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfVEFVUlVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisKKyAgICBpZiAoIGZNYXRjaCAmJiBwQ2ZnRG90MTFNb2RlVG9Vc2UgKQorICAgIHsKKyAgICAgICAgKnBDZmdEb3QxMU1vZGVUb1VzZSA9IGNmZ0RvdDExTW9kZTsKKyAgICB9CisKKyAgICByZXR1cm4oIGZNYXRjaCApOworfQorCisKKy8vVGhpcyBmdW5jdGlvbiBkZWNpZGVzIHdoZXRoZXIgdGhlIG9uZSBvZiB0aGUgYml0IG9mIHBoeU1vZGUgaXMgbWF0Y2hpbmcgdGhlIG1vZGUgaW4gdGhlIEJTUyBhbmQgYWxsb3dlZCBieSB0aGUgdXNlcgorLy9zZXR0aW5nLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnVDZmdEb3QxMU1vZGUuIEl0IHJldHVybnMgdGhlIG1vZGUgdGhhdCBmaXRzIHRoZSBjcml0ZXJpYS4KK3RBTklfQk9PTEVBTiBjc3JJc1BoeU1vZGVNYXRjaCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgcGh5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNzckNmZ0RvdDExTW9kZSAqcFJldHVybkNmZ0RvdDExTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcykKK3sKKyAgICB0QU5JX0JPT0xFQU4gZk1hdGNoID0gRkFMU0U7CisgICAgZUNzclBoeU1vZGUgcGh5TW9kZUluQnNzRGVzYywgcGh5TW9kZTI7CisgICAgZUNzckNmZ0RvdDExTW9kZSBjZmdEb3QxMU1vZGVUb1VzZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfVEFVUlVTOworICAgIHRBTklfVTMyIGJpdE1hc2ssIGxvb3BDb3VudDsKKworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JHZXRQaHlNb2RlRnJvbUJzcyhwTWFjLCBwU2lyQnNzRGVzYywgJnBoeU1vZGVJbkJzc0Rlc2MsIHBJZXMgKSkpCisgICAgeworICAgICAgICAvL0luIGNhc2Ugc29tZSBjaGFuZ2UgY2hhbmdlIGVDU1JfRE9UMTFfTU9ERV9UQVVSVVMgdG8gbm9uLTAKKyAgICAgICAgaWYgKCAoMCA9PSBwaHlNb2RlKSB8fCAoZUNTUl9ET1QxMV9NT0RFX0FVVE8gJiBwaHlNb2RlKSB8fCAoZUNTUl9ET1QxMV9NT0RFX1RBVVJVUyAmIHBoeU1vZGUpKQorICAgICAgICB7CisgICAgICAgICAgICAvL1RhdXJ1cyBtZWFucyBhbnl0aGluZworICAgICAgICAgICAgaWYgKCBlQ1NSX0NGR19ET1QxMV9NT0RFX0FCRyA9PSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnVDZmdEb3QxMU1vZGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBoeU1vZGUgPSBlQ1NSX0RPVDExX01PREVfYWJnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihlQ1NSX0NGR19ET1QxMV9NT0RFX0FVVE8gPT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS51Q2ZnRG90MTFNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uUHJvcHJpZXRhcnlSYXRlc0VuYWJsZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaHlNb2RlID0gZUNTUl9ET1QxMV9NT0RFX1RBVVJVUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGh5TW9kZSA9IGVDU1JfRE9UMTFfTU9ERV8xMW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vdXNlcidzIHBpY2sKKyAgICAgICAgICAgICAgICBwaHlNb2RlID0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS5waHlNb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggKDAgPT0gcGh5TW9kZSkgfHwgKGVDU1JfRE9UMTFfTU9ERV9BVVRPICYgcGh5TW9kZSkgfHwgKGVDU1JfRE9UMTFfTU9ERV9UQVVSVVMgJiBwaHlNb2RlKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKDAgIT0gcGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihlQ1NSX0RPVDExX01PREVfQVVUTyAmIHBoeU1vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaHlNb2RlMiA9IGVDU1JfRE9UMTFfTU9ERV9BVVRPICYgcGh5TW9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGh5TW9kZTIgPSBlQ1NSX0RPVDExX01PREVfVEFVUlVTICYgcGh5TW9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGh5TW9kZTIgPSBwaHlNb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZk1hdGNoID0gY3NyR2V0UGh5TW9kZUluVXNlKCBwaHlNb2RlMiwgcGh5TW9kZUluQnNzRGVzYywgQ1NSX0lTX0NIQU5ORUxfNUdIWihwU2lyQnNzRGVzYy0+Y2hhbm5lbElkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjZmdEb3QxMU1vZGVUb1VzZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYml0TWFzayA9IDE7CisgICAgICAgICAgICBsb29wQ291bnQgPSAwOworICAgICAgICAgICAgd2hpbGUobG9vcENvdW50IDwgZUNTUl9OVU1fUEhZX01PREUpICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoMCAhPSAoIHBoeU1vZGUyID0gKHBoeU1vZGUgJiAoYml0TWFzayA8PCBsb29wQ291bnQrKykpICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBjc3JHZXRQaHlNb2RlSW5Vc2UoIHBoeU1vZGUyLCBwaHlNb2RlSW5Cc3NEZXNjLCBDU1JfSVNfQ0hBTk5FTF81R0haKHBTaXJCc3NEZXNjLT5jaGFubmVsSWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjZmdEb3QxMU1vZGVUb1VzZSApOworICAgICAgICAgICAgICAgICAgICBpZihmTWF0Y2gpIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIGZNYXRjaCAmJiBwUmV0dXJuQ2ZnRG90MTFNb2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHBQcm9maWxlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJRUVFIDExbiBzcGVjICg4LjQuMyk6IEhUIFNUQSBzaGFsbCBlbGltaW5hdGUgVEtJUCBhcyBhIAorICAgICAgICAgICAgICAgICAqIGNob2ljZSBmb3IgdGhlIHBhaXJ3aXNlIGNpcGhlciBzdWl0ZSBpZiBDQ01QIGlzIGFkdmVydGlzZWQgCisgICAgICAgICAgICAgICAgICogYnkgdGhlIEFQIG9yIGlmIHRoZSBBUCBpbmNsdWRlZCBhbiBIVCBjYXBhYmlsaXRpZXMgZWxlbWVudCAKKyAgICAgICAgICAgICAgICAgKiBpbiBpdHMgQmVhY29ucyBhbmQgUHJvYmUgUmVzcG9uc2UuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoICghQ1NSX0lTXzExbl9BTExPV0VEKCBwUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKChlQ1NSX0NGR19ET1QxMV9NT0RFXzExTiA9PSBjZmdEb3QxMU1vZGVUb1VzZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgIChlQ1NSX0NGR19ET1QxMV9NT0RFX1RBVVJVUyA9PSBjZmdEb3QxMU1vZGVUb1VzZSkpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vV2UgY2Fubm90IGRvIDExbiBoZXJlCisgICAgICAgICAgICAgICAgICAgIGlmKCAhQ1NSX0lTX0NIQU5ORUxfNUdIWihwU2lyQnNzRGVzYy0+Y2hhbm5lbElkKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNmZ0RvdDExTW9kZVRvVXNlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGVUb1VzZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBSZXR1cm5DZmdEb3QxMU1vZGUgPSBjZmdEb3QxMU1vZGVUb1VzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiggZk1hdGNoICk7Cit9CisKKworZUNzckNmZ0RvdDExTW9kZSBjc3JGaW5kQmVzdFBoeU1vZGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHBoeU1vZGUgKQoreworICAgIGVDc3JDZmdEb3QxMU1vZGUgY2ZnRG90MTFNb2RlVG9Vc2U7CisgICAgZUNzckJhbmQgZUJhbmQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmVCYW5kOworCisgICAgaWYgKCAoMCA9PSBwaHlNb2RlKSB8fCAoZUNTUl9ET1QxMV9NT0RFX0FVVE8gJiBwaHlNb2RlKSB8fCAoZUNTUl9ET1QxMV9NT0RFX1RBVVJVUyAmIHBoeU1vZGUpKQorICAgIHsKKyAgICAgICAgY2ZnRG90MTFNb2RlVG9Vc2UgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoICggZUNTUl9ET1QxMV9NT0RFXzExbiB8IGVDU1JfRE9UMTFfTU9ERV8xMW5fT05MWSApICYgcGh5TW9kZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNmZ0RvdDExTW9kZVRvVXNlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMU47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIGVDU1JfRE9UMTFfTU9ERV9hYmcgJiBwaHlNb2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGVDU1JfQkFORF8yNCAhPSBlQmFuZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2ZnRG90MTFNb2RlVG9Vc2UgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZmdEb3QxMU1vZGVUb1VzZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFHOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoICggZUNTUl9ET1QxMV9NT0RFXzExYSB8IGVDU1JfRE9UMTFfTU9ERV8xMWFfT05MWSApICYgcGh5TW9kZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNmZ0RvdDExTW9kZVRvVXNlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggKCBlQ1NSX0RPVDExX01PREVfMTFnIHwgZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZICkgJiBwaHlNb2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgY2ZnRG90MTFNb2RlVG9Vc2UgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExRzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNmZ0RvdDExTW9kZVRvVXNlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKCBjZmdEb3QxMU1vZGVUb1VzZSApOworfQorCisKKworCit0QU5JX1UzMiBjc3JHZXQxMWhQb3dlckNvbnN0cmFpbnQoIHRIYWxIYW5kbGUgaEhhbCwgdERvdDExZklFUG93ZXJDb25zdHJhaW50cyAqcFBvd2VyQ29uc3RyYWludCApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdEFOSV9VMzIgbG9jYWxQb3dlckNvbnN0cmFpbnQgPSAwOworCisgICAgLy8gY2hlY2sgaWYgLjExaCBzdXBwb3J0IGlzIGVuYWJsZWQsIGlmIG5vdCwgdGhlIHBvd2VyIGNvbnN0cmFpbnQgaXMgMC4KKyAgICBpZihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFoU3VwcG9ydEVuYWJsZWQgJiYgcFBvd2VyQ29uc3RyYWludC0+cHJlc2VudCkKKyAgICB7CisgICAgICAgIGxvY2FsUG93ZXJDb25zdHJhaW50ID0gcFBvd2VyQ29uc3RyYWludC0+bG9jYWxQb3dlckNvbnN0cmFpbnRzOworICAgIH0KKworICAgIHJldHVybiggbG9jYWxQb3dlckNvbnN0cmFpbnQgKTsKK30KKworCit0QU5JX0JPT0xFQU4gY3NySXNQcm9maWxlV3BhKCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZldwYVByb2ZpbGUgPSBGQUxTRTsKKworICAgIHN3aXRjaCAoIHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEE6CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfV1BBX1BTSzoKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XUEFfTk9ORToKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfQ0NLTV9XUEE6CisjZW5kaWYKKyAgICAgICAgICAgIGZXcGFQcm9maWxlID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmV3BhUHJvZmlsZSA9IEZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCBmV3BhUHJvZmlsZSApCisgICAgeworICAgICAgICBzd2l0Y2ggKCBwUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOgorICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ6CisgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1RLSVA6CisgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX0FFUzoKKyAgICAgICAgICAgICAgICBmV3BhUHJvZmlsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZldwYVByb2ZpbGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oIGZXcGFQcm9maWxlICk7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JJc1Byb2ZpbGVSU04oIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUgKQoreworICAgIHRBTklfQk9PTEVBTiBmUlNOUHJvZmlsZSA9IEZBTFNFOworCisgICAgc3dpdGNoICggcFByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSApCisgICAgeworICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX1JTTjoKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9SU05fUFNLOgorI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfRlRfUlNOOgorICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX0ZUX1JTTl9QU0s6CisjZW5kaWYgCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICBjYXNlIGVDU1JfQVVUSF9UWVBFX0NDS01fUlNOOgorI2VuZGlmIAorICAgICAgICAgICAgZlJTTlByb2ZpbGUgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZSU05Qcm9maWxlID0gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIGZSU05Qcm9maWxlICkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoIHBQcm9maWxlLT5uZWdvdGlhdGVkVUNFbmNyeXB0aW9uVHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICEhUkVWSUVXIC0gRm9yIFdQQTIsIHVzZSBvZiBSU04gSUUgbWFuZGF0ZXMKKyAgICAgICAgICAgIC8vIHVzZSBvZiBBRVMgYXMgZW5jcnlwdGlvbi4gSGVyZSwgd2UgcXVhbGlmeQorICAgICAgICAgICAgLy8gZXZlbiBpZiBlbmNyeXB0aW9uIHR5cGUgaXMgV0VQIG9yIFRLSVAKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA6CisgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDoKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDoKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQUVTOgorICAgICAgICAgICAgICAgIGZSU05Qcm9maWxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmUlNOUHJvZmlsZSA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiggZlJTTlByb2ZpbGUgKTsKK30KKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qIEZ1bmN0aW9uIHRvIHJldHVybiBUUlVFIGlmIHRoZSBhdXRodHlwZSBpcyAxMXIgKi8KK3RBTklfQk9PTEVBTiBjc3JJc0F1dGhUeXBlMTFyKCBlQ3NyQXV0aFR5cGUgQXV0aFR5cGUgKQoreworICAgIHN3aXRjaCAoIEF1dGhUeXBlICkKKyAgICB7CisgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSzoKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9GVF9SU046CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyogRnVuY3Rpb24gdG8gcmV0dXJuIFRSVUUgaWYgdGhlIHByb2ZpbGUgaXMgMTFyICovCit0QU5JX0JPT0xFQU4gY3NySXNQcm9maWxlMTFyKCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlICkKK3sKKyAgICByZXR1cm4gY3NySXNBdXRoVHlwZTExciggcFByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSApOworfQorCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKworLyogRnVuY3Rpb24gdG8gcmV0dXJuIFRSVUUgaWYgdGhlIGF1dGh0eXBlIGlzIENDWCAqLwordEFOSV9CT09MRUFOIGNzcklzQXV0aFR5cGVDQ1goIGVDc3JBdXRoVHlwZSBBdXRoVHlwZSApCit7CisgICAgc3dpdGNoICggQXV0aFR5cGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1dQQToKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1JTTjoKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKiBGdW5jdGlvbiB0byByZXR1cm4gVFJVRSBpZiB0aGUgcHJvZmlsZSBpcyBDQ1ggKi8KK3RBTklfQk9PTEVBTiBjc3JJc1Byb2ZpbGVDQ1goIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUgKQoreworICAgIHJldHVybiAoY3NySXNBdXRoVHlwZUNDWCggcFByb2ZpbGUtPm5lZ290aWF0ZWRBdXRoVHlwZSApKTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQordEFOSV9CT09MRUFOIGNzcklzUHJvZmlsZVdhcGkoIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUgKQoreworICAgIHRBTklfQk9PTEVBTiBmV2FwaVByb2ZpbGUgPSBGQUxTRTsKKworICAgIHN3aXRjaCAoIHBQcm9maWxlLT5uZWdvdGlhdGVkQXV0aFR5cGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9DRVJUSUZJQ0FURToKKyAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9QU0s6CisgICAgICAgICAgICBmV2FwaVByb2ZpbGUgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZXYXBpUHJvZmlsZSA9IEZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCBmV2FwaVByb2ZpbGUgKQorICAgIHsKKyAgICAgICAgc3dpdGNoICggcFByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk6CisgICAgICAgICAgICAgICAgZldhcGlQcm9maWxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmV2FwaVByb2ZpbGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oIGZXYXBpUHJvZmlsZSApOworfQorCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzcklzV2FwaU91aUVxdWFsKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpPdWkxLCB0QU5JX1U4ICpPdWkyICkKK3sKKyAgICByZXR1cm4oIHBhbEVxdWFsTWVtb3J5KHBNYWMtPmhIZGQsIE91aTEsIE91aTIsIENTUl9XQVBJX09VSV9TSVpFICkgKTsKK30KKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc1dhcGlPdWlNYXRjaCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBBbGxDeXBoZXJzW11bQ1NSX1dBUElfT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbEN5cGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBDeXBoZXJbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZlllcyA9IEZBTFNFOworICAgIHRBTklfVTggaWR4OworCisgICAgZm9yICggaWR4ID0gMDsgaWR4IDwgY0FsbEN5cGhlcnM7IGlkeCsrICkKKyAgICB7CisgICAgICAgIGlmICggY3NySXNXYXBpT3VpRXF1YWwoIHBNYWMsIEFsbEN5cGhlcnNbIGlkeCBdLCBDeXBoZXIgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZZZXMgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGZZZXMgJiYgT3VpICkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIE91aSwgQWxsQ3lwaGVyc1sgaWR4IF0sIENTUl9XQVBJX09VSV9TSVpFICk7CisgICAgfQorCisgICAgcmV0dXJuKCBmWWVzICk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc1dwYU91aUVxdWFsKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpPdWkxLCB0QU5JX1U4ICpPdWkyICkKK3sKKyAgICByZXR1cm4oIHBhbEVxdWFsTWVtb3J5KHBNYWMtPmhIZGQsIE91aTEsIE91aTIsIENTUl9XUEFfT1VJX1NJWkUgKSApOworfQorCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzcklzT3VpTWF0Y2goIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsQ3lwaGVyc1tdW0NTUl9XUEFfT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbEN5cGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBDeXBoZXJbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZlllcyA9IEZBTFNFOworICAgIHRBTklfVTggaWR4OworCisgICAgZm9yICggaWR4ID0gMDsgaWR4IDwgY0FsbEN5cGhlcnM7IGlkeCsrICkKKyAgICB7CisgICAgICAgIGlmICggY3NySXNXcGFPdWlFcXVhbCggcE1hYywgQWxsQ3lwaGVyc1sgaWR4IF0sIEN5cGhlciApICkKKyAgICAgICAgeworICAgICAgICAgICAgZlllcyA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggZlllcyAmJiBPdWkgKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgT3VpLCBBbGxDeXBoZXJzWyBpZHggXSwgQ1NSX1dQQV9PVUlfU0laRSApOworICAgIH0KKworICAgIHJldHVybiggZlllcyApOworfQorCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzck1hdGNoUlNOT1VJSW5kZXgoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsQ3lwaGVyc1tdW0NTUl9SU05fT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGNBbGxDeXBoZXJzLCB0QU5JX1U4IG91aUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JSU05PdWlbb3VpSW5kZXhdLCBPdWkgKSApOworCit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorc3RhdGljIHRBTklfQk9PTEVBTiBjc3JNYXRjaFdhcGlPVUlJbmRleCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBBbGxDeXBoZXJzW11bQ1NSX1dBUElfT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGNBbGxDeXBoZXJzLCB0QU5JX1U4IG91aUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzV2FwaU91aU1hdGNoKCBwTWFjLCBBbGxDeXBoZXJzLCBjQWxsQ3lwaGVycywgY3NyV2FwaU91aVtvdWlJbmRleF0sIE91aSApICk7CisKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzck1hdGNoV1BBT1VJSW5kZXgoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsQ3lwaGVyc1tdW0NTUl9SU05fT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGNBbGxDeXBoZXJzLCB0QU5JX1U4IG91aUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JXcGFPdWlbb3VpSW5kZXhdLCBPdWkgKSApOworCit9CisKKyNpZiAwCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzcklzUlNOVW5pY2FzdE5vbmUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsQ3lwaGVyc1tdW0NTUl9SU05fT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGNBbGxDeXBoZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JSU05PdWkwMCwgT3VpICkgKTsKK30KKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc1JTTk11bHRpY2FzdFdlcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBBbGxDeXBoZXJzW11bQ1NSX1JTTl9PVUlfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjQWxsQ3lwaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZlllcyA9IEZBTFNFOworCisgICAgLy8gQ2hlY2sgV2VwIDEwNCBmaXJzdCwgaWYgZmFpbHMsIHRoZW4gY2hlY2sgV2VwNDAuCisgICAgZlllcyA9IGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JSU05PdWkwNSwgT3VpICk7CisKKyAgICBpZiAoICFmWWVzICkKKyAgICB7CisgICAgICAgIC8vIGlmIG5vdCBXZXAtMTA0LCBjaGVjayBXZXAtNDAKKyAgICAgICAgZlllcyA9IGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JSU05PdWkwMSwgT3VpICk7CisgICAgfQorCisgICAgcmV0dXJuKCBmWWVzICk7Cit9CisKKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc1JTTlVuaWNhc3RUa2lwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IEFsbEN5cGhlcnNbXVtDU1JfUlNOX09VSV9TSVpFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbEN5cGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JSU05PdWkwMiwgT3VpICkgKTsKK30KKworCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzcklzUlNOTXVsdGljYXN0VGtpcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBBbGxDeXBoZXJzW11bQ1NSX1JTTl9PVUlfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjQWxsQ3lwaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JSU05PdWkwMiwgT3VpICkgKTsKK30KKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc1JTTlVuaWNhc3RBZXMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsQ3lwaGVyc1tdW0NTUl9SU05fT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbEN5cGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBPdWlbXSApCit7CisgICAgcmV0dXJuKCBjc3JJc091aU1hdGNoKCBwTWFjLCBBbGxDeXBoZXJzLCBjQWxsQ3lwaGVycywgY3NyUlNOT3VpMDQsIE91aSApICk7Cit9CisKK3N0YXRpYyB0QU5JX0JPT0xFQU4gY3NySXNSU05NdWx0aWNhc3RBZXMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsQ3lwaGVyc1tdW0NTUl9SU05fT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbEN5cGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBPdWlbXSApCit7CisgICAgcmV0dXJuKCBjc3JJc091aU1hdGNoKCBwTWFjLCBBbGxDeXBoZXJzLCBjQWxsQ3lwaGVycywgY3NyUlNOT3VpMDQsIE91aSApICk7Cit9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc0F1dGhXYXBpQ2VydCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBBbGxTdWl0ZXNbXVtDU1JfV0FQSV9PVUlfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjQWxsU3VpdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggT3VpW10gKQoreworICAgIHJldHVybiggY3NySXNXYXBpT3VpTWF0Y2goIHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyV2FwaU91aVsxXSwgT3VpICkgKTsKK30KK3N0YXRpYyB0QU5JX0JPT0xFQU4gY3NySXNBdXRoV2FwaVBzayggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBBbGxTdWl0ZXNbXVtDU1JfV0FQSV9PVUlfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbFN1aXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBPdWlbXSApCit7CisgICAgcmV0dXJuKCBjc3JJc1dhcGlPdWlNYXRjaCggcE1hYywgQWxsU3VpdGVzLCBjQWxsU3VpdGVzLCBjc3JXYXBpT3VpWzJdLCBPdWkgKSApOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorCisvKiAKKyAqIEZ1bmN0aW9uIGZvciAxMVIgRlQgQXV0aGVudGljYXRpb24uIFdlIG1hdGNoIHRoZSBGVCBBdXRoZW50aWNhdGlvbiBDaXBoZXIgc3VpdGUKKyAqIGhlcmUuIFRoaXMgbWF0Y2hlcyBmb3IgRlQgQXV0aCB3aXRoIHRoZSA4MDIuMVggZXhjaGFuZ2UuCisgKgorICovCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzcklzRlRBdXRoUlNOKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IEFsbFN1aXRlc1tdW0NTUl9SU05fT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbFN1aXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyUlNOT3VpWzAzXSwgT3VpICkgKTsKK30KKworLyogCisgKiBGdW5jdGlvbiBmb3IgMTFSIEZUIEF1dGhlbnRpY2F0aW9uLiBXZSBtYXRjaCB0aGUgRlQgQXV0aGVudGljYXRpb24gQ2lwaGVyIHN1aXRlCisgKiBoZXJlLiBUaGlzIG1hdGNoZXMgZm9yIEZUIEF1dGggd2l0aCB0aGUgUFNLLgorICoKKyAqLworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc0ZUQXV0aFJTTlBzayggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBBbGxTdWl0ZXNbXVtDU1JfUlNOX09VSV9TSVpFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjQWxsU3VpdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyUlNOT3VpWzA0XSwgT3VpICkgKTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisKKy8qIAorICogRnVuY3Rpb24gZm9yIENDWCBDQ0tNIEFLTSBBdXRoZW50aWNhdGlvbi4gV2UgbWF0Y2ggdGhlIENDS00gQUtNIEF1dGhlbnRpY2F0aW9uIEtleSBNYW5hZ2VtZW50IHN1aXRlCisgKiBoZXJlLiBUaGlzIG1hdGNoZXMgZm9yIENDS00gQUtNIEF1dGggd2l0aCB0aGUgODAyLjFYIGV4Y2hhbmdlLgorICoKKyAqLworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc0NjeENja21BdXRoUlNOKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IEFsbFN1aXRlc1tdW0NTUl9SU05fT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbFN1aXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyUlNOT3VpWzA2XSwgT3VpICkgKTsKK30KKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc0NjeENja21BdXRoV3BhKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IEFsbFN1aXRlc1tdW0NTUl9XUEFfT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGNBbGxTdWl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggT3VpW10gKQoreworICAgIHJldHVybiggY3NySXNPdWlNYXRjaCggcE1hYywgQWxsU3VpdGVzLCBjQWxsU3VpdGVzLCBjc3JXcGFPdWlbMDZdLCBPdWkgKSApOworfQorCisjZW5kaWYKKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc0F1dGhSU04oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsU3VpdGVzW11bQ1NSX1JTTl9PVUlfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjQWxsU3VpdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggT3VpW10gKQoreworI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyUlNOT3VpWzAxXSwgT3VpICkgfHwKKyAgICAgICAgICAgIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyUlNOT3VpWzA1XSwgT3VpICkpOworI2Vsc2UKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyUlNOT3VpWzAxXSwgT3VpICkgKTsKKyNlbmRpZgorfQorc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc0F1dGhSU05Qc2soIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsU3VpdGVzW11bQ1NSX1JTTl9PVUlfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbFN1aXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBPdWlbXSApCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFXzExVworICAgIHJldHVybiggY3NySXNPdWlNYXRjaCggcE1hYywgQWxsU3VpdGVzLCBjQWxsU3VpdGVzLCBjc3JSU05PdWlbMDJdLCBPdWkgKSB8fAorICAgICAgICAgICAgY3NySXNPdWlNYXRjaCggcE1hYywgQWxsU3VpdGVzLCBjQWxsU3VpdGVzLCBjc3JSU05PdWlbMDZdLCBPdWkgKSApOworI2Vsc2UKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyUlNOT3VpWzAyXSwgT3VpICkgKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzcklzQXV0aFdwYSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBBbGxTdWl0ZXNbXVtDU1JfV1BBX09VSV9TSVpFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjQWxsU3VpdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbFN1aXRlcywgY0FsbFN1aXRlcywgY3NyV3BhT3VpWzAxXSwgT3VpICkgKTsKK30KKworI2lmZGVmIE5PVF9DVVJSRU5UTFlfVVNFRAorc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc0F1dGg4MDJfMXgoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsU3VpdGVzW11bQ1NSX1dQQV9PVUlfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbFN1aXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBPdWlbXSApCit7CisgICAgcmV0dXJuKCBjc3JJc091aU1hdGNoKCBwTWFjLCBBbGxTdWl0ZXMsIGNBbGxTdWl0ZXMsIGNzcldwYU91aVswMF0sIE91aSApICk7Cit9CisjZW5kaWYgLy8gTk9UX0NVUlJFTlRMWV9VU0VECisKK3N0YXRpYyB0QU5JX0JPT0xFQU4gY3NySXNBdXRoV3BhUHNrKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IEFsbFN1aXRlc1tdW0NTUl9XUEFfT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGNBbGxTdWl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggT3VpW10gKQoreworICAgIHJldHVybiggY3NySXNPdWlNYXRjaCggcE1hYywgQWxsU3VpdGVzLCBjQWxsU3VpdGVzLCBjc3JXcGFPdWlbMDJdLCBPdWkgKSApOworfQorI2lmIDAKK3N0YXRpYyB0QU5JX0JPT0xFQU4gY3NySXNVbmljYXN0Tm9uZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBBbGxDeXBoZXJzW11bQ1NSX1dQQV9PVUlfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbEN5cGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggT3VpW10gKQoreworICAgIHJldHVybiggY3NySXNPdWlNYXRjaCggcE1hYywgQWxsQ3lwaGVycywgY0FsbEN5cGhlcnMsIGNzcldwYU91aTAwLCBPdWkgKSApOworfQorCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzcklzVW5pY2FzdFRraXAoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsQ3lwaGVyc1tdW0NTUl9XUEFfT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGNBbGxDeXBoZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JXcGFPdWkwMiwgT3VpICkgKTsKK30KKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc1VuaWNhc3RBZXMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsQ3lwaGVyc1tdW0NTUl9XUEFfT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IGNBbGxDeXBoZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICByZXR1cm4oIGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JXcGFPdWkwNCwgT3VpICkgKTsKK30KKworCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzcklzTXVsdGljYXN0V2VwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IEFsbEN5cGhlcnNbXVtDU1JfV1BBX09VSV9TSVpFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggY0FsbEN5cGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IE91aVtdICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZlllcyA9IEZBTFNFOworCisgICAgLy8gQ2hlY2sgV2VwIDEwNCBmaXJzdCwgaWYgZmFpbHMsIHRoZW4gY2hlY2sgV2VwNDAuCisgICAgZlllcyA9IGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JXcGFPdWkwNSwgT3VpICk7CisKKyAgICBpZiAoICFmWWVzICkKKyAgICB7CisgICAgICAgIC8vIGlmIG5vdCBXZXAtMTA0LCBjaGVjayBXZXAtNDAKKyAgICAgICAgZlllcyA9IGNzcklzT3VpTWF0Y2goIHBNYWMsIEFsbEN5cGhlcnMsIGNBbGxDeXBoZXJzLCBjc3JXcGFPdWkwMSwgT3VpICk7CisgICAgfQorCisgICAgcmV0dXJuKCBmWWVzICk7Cit9CisKKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc011bHRpY2FzdFRraXAoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsQ3lwaGVyc1tdW0NTUl9XUEFfT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjQWxsQ3lwaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggT3VpW10gKQoreworICAgIHJldHVybiggY3NySXNPdWlNYXRjaCggcE1hYywgQWxsQ3lwaGVycywgY0FsbEN5cGhlcnMsIGNzcldwYU91aTAyLCBPdWkgKSApOworfQorCisKK3N0YXRpYyB0QU5JX0JPT0xFQU4gY3NySXNNdWx0aWNhc3RBZXMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggQWxsQ3lwaGVyc1tdW0NTUl9XUEFfT1VJX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjQWxsQ3lwaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggT3VpW10gKQoreworICAgIHJldHVybiggY3NySXNPdWlNYXRjaCggcE1hYywgQWxsQ3lwaGVycywgY0FsbEN5cGhlcnMsIGNzcldwYU91aTA0LCBPdWkgKSApOworfQorCisjZW5kaWYKKwordEFOSV9VOCBjc3JHZXRPVUlJbmRleEZyb21DaXBoZXIoIGVDc3JFbmNyeXB0aW9uVHlwZSBlblR5cGUgKQoreworICAgIHRBTklfVTggT1VJSW5kZXg7CisKKyAgICAgICAgc3dpdGNoICggZW5UeXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDoKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOgorICAgICAgICAgICAgICAgIE9VSUluZGV4ID0gQ1NSX09VSV9XRVA0MF9PUl8xWF9JTkRFWDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OgorICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorICAgICAgICAgICAgICAgIE9VSUluZGV4ID0gQ1NSX09VSV9XRVAxMDRfSU5ERVg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1RLSVA6CisgICAgICAgICAgICAgICAgT1VJSW5kZXggPSBDU1JfT1VJX1RLSVBfT1JfUFNLX0lOREVYOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9BRVM6CisgICAgICAgICAgICAgICAgT1VJSW5kZXggPSBDU1JfT1VJX0FFU19JTkRFWDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICBPVUlJbmRleCA9IENTUl9PVUlfVVNFX0dST1VQX0NJUEhFUl9JTkRFWDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dQSToKKyAgICAgICAgICAgICAgIE9VSUluZGV4ID0gQ1NSX09VSV9XQVBJX1dBSV9DRVJUX09SX1NNUzRfSU5ERVg7CisgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworICAgICAgICAgICAgZGVmYXVsdDogLy9IT1dUTyBoYW5kbGUgdGhpcz8KKyAgICAgICAgICAgICAgICBPVUlJbmRleCA9IENTUl9PVUlfUkVTRVJWRURfSU5ERVg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0vL3N3aXRjaAorCisgICAgICAgIHJldHVybiBPVUlJbmRleDsKK30KKwordEFOSV9CT09MRUFOIGNzckdldFJTTkluZm9ybWF0aW9uKCB0SGFsSGFuZGxlIGhIYWwsIHRDc3JBdXRoTGlzdCAqcEF1dGhUeXBlLCBlQ3NyRW5jcnlwdGlvblR5cGUgZW5UeXBlLCB0Q3NyRW5jcnlwdGlvbkxpc3QgKnBNQ0VuY3J5cHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVJTTiAqcFJTTkllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqVW5pY2FzdEN5cGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKk11bHRpY2FzdEN5cGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKkF1dGhTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSU05DYXBhYmlsaXRpZXMgKkNhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JBdXRoVHlwZSAqcE5lZ290aWF0ZWRBdXRodHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JFbmNyeXB0aW9uVHlwZSAqcE5lZ290aWF0ZWRNQ0NpcGhlciApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdEFOSV9CT09MRUFOIGZBY2NlcHRhYmxlQ3lwaGVycyA9IEZBTFNFOworICAgIHRBTklfVTggY1VuaWNhc3RDeXBoZXJzID0gMDsKKyAgICB0QU5JX1U4IGNNdWx0aWNhc3RDeXBoZXJzID0gMDsKKyAgICB0QU5JX1U4IGNBdXRoU3VpdGVzID0gMCwgaTsKKyAgICB0QU5JX1U4IFVuaWNhc3RbIENTUl9SU05fT1VJX1NJWkUgXTsKKyAgICB0QU5JX1U4IE11bHRpY2FzdFsgQ1NSX1JTTl9PVUlfU0laRSBdOworICAgIHRBTklfVTggQXV0aFN1aXRlc1sgQ1NSX1JTTl9NQVhfQVVUSF9TVUlURVMgXVsgQ1NSX1JTTl9PVUlfU0laRSBdOworICAgIHRBTklfVTggQXV0aGVudGljYXRpb25bIENTUl9SU05fT1VJX1NJWkUgXTsKKyAgICB0QU5JX1U4IE11bHRpY2FzdEN5cGhlcnNbIENTUl9SU05fTUFYX01VTFRJQ0FTVF9DWVBIRVJTIF1bIENTUl9SU05fT1VJX1NJWkUgXTsKKyAgICBlQ3NyQXV0aFR5cGUgbmVnQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworCisgICAgZG97CisgICAgICAgIGlmICggcFJTTkllLT5wcmVzZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgY011bHRpY2FzdEN5cGhlcnMrKzsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgTXVsdGljYXN0Q3lwaGVycywgcFJTTkllLT5ncF9jaXBoZXJfc3VpdGUsIENTUl9SU05fT1VJX1NJWkUpOworICAgICAgICAgICAgY1VuaWNhc3RDeXBoZXJzID0gKHRBTklfVTgpKHBSU05JZS0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIGNBdXRoU3VpdGVzID0gKHRBTklfVTgpKHBSU05JZS0+YWttX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGNBdXRoU3VpdGVzICYmIGkgPCBDU1JfUlNOX01BWF9BVVRIX1NVSVRFUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikmQXV0aFN1aXRlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBSU05JZS0+YWttX3N1aXRlc1tpXSwgQ1NSX1JTTl9PVUlfU0laRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vQ2hlY2sgLSBJcyByZXF1ZXN0ZWQgVW5pY2FzdCBDaXBoZXIgc3VwcG9ydGVkIGJ5IHRoZSBCU1MuCisgICAgICAgICAgICBmQWNjZXB0YWJsZUN5cGhlcnMgPSBjc3JNYXRjaFJTTk9VSUluZGV4KCBwTWFjLCBwUlNOSWUtPnB3aXNlX2NpcGhlcl9zdWl0ZXMsIGNVbmljYXN0Q3lwaGVycywgCisgICAgICAgICAgICAgICAgICAgIGNzckdldE9VSUluZGV4RnJvbUNpcGhlciggZW5UeXBlICksIFVuaWNhc3QgKTsgCisKKyAgICAgICAgICAgIGlmKCAhZkFjY2VwdGFibGVDeXBoZXJzICkgYnJlYWs7CisKKworICAgICAgICAgICAgLy9VbmljYXN0IGlzIHN1cHBvcnRlZC4gUGljayB0aGUgZmlyc3QgbWF0Y2hpbmcgR3JvdXAgY2lwaGVyLCBpZiBhbnkuCisgICAgICAgICAgICBmb3IoIGkgPSAwIDsgaSA8IHBNQ0VuY3J5cHRpb24tPm51bUVudHJpZXMgOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZBY2NlcHRhYmxlQ3lwaGVycyA9IGNzck1hdGNoUlNOT1VJSW5kZXgoIHBNYWMsIE11bHRpY2FzdEN5cGhlcnMsICBjTXVsdGljYXN0Q3lwaGVycywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyR2V0T1VJSW5kZXhGcm9tQ2lwaGVyKCBwTUNFbmNyeXB0aW9uLT5lbmNyeXB0aW9uVHlwZVtpXSApLCBNdWx0aWNhc3QgKTsKKyAgICAgICAgICAgICAgICBpZihmQWNjZXB0YWJsZUN5cGhlcnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIWZBY2NlcHRhYmxlQ3lwaGVycyApIGJyZWFrOworCisgICAgICAgICAgICBpZiggcE5lZ290aWF0ZWRNQ0NpcGhlciApCisgICAgICAgICAgICAgICAgKnBOZWdvdGlhdGVkTUNDaXBoZXIgPSBwTUNFbmNyeXB0aW9uLT5lbmNyeXB0aW9uVHlwZVtpXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogSW5pdGlhbGl6aW5nIHdpdGggRkFMU0UgYXMgaXQgaGFzIFRSVUUgdmFsdWUgYWxyZWFkeSAqLworICAgICAgICAgICAgZkFjY2VwdGFibGVDeXBoZXJzID0gRkFMU0U7CisgICAgICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IHBBdXRoVHlwZS0+bnVtRW50cmllczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vQ2lwaGVycyBhcmUgc3VwcG9ydGVkLCBNYXRjaCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gYW5kIHBpY2sgZmlyc3QgbWF0Y2hpbmcgYXV0aHR5cGUuCisgI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgICAgICAgICAgICAgLyogQ2hhbmdlZCB0aGUgQUtNIHN1aXRlcyBhY2NvcmRpbmcgdG8gb3JkZXIgb2YgcHJlZmVyZW5jZSAqLworICAgICAgICAgICAgICAgIGlmICggY3NySXNGVEF1dGhSU04oIHBNYWMsIEF1dGhTdWl0ZXMsIGNBdXRoU3VpdGVzLCBBdXRoZW50aWNhdGlvbiApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlQ1NSX0FVVEhfVFlQRV9GVF9SU04gPT0gcEF1dGhUeXBlLT5hdXRoVHlwZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZ0F1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfRlRfUlNOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIChuZWdBdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOKSAmJiBjc3JJc0ZUQXV0aFJTTlBzayggcE1hYywgQXV0aFN1aXRlcywgY0F1dGhTdWl0ZXMsIEF1dGhlbnRpY2F0aW9uICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVDU1JfQVVUSF9UWVBFX0ZUX1JTTl9QU0sgPT0gcEF1dGhUeXBlLT5hdXRoVHlwZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZ0F1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfRlRfUlNOX1BTSzsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgICAgICAgLyogQ0NYIG9ubHkgc3VwcG9ydHMgODAyLjFYLiAgTm8gUFNLLiAqLworICAgICAgICAgICAgICAgIGlmICggKG5lZ0F1dGhUeXBlID09IGVDU1JfQVVUSF9UWVBFX1VOS05PV04pICYmIGNzcklzQ2N4Q2NrbUF1dGhSU04oIHBNYWMsIEF1dGhTdWl0ZXMsIGNBdXRoU3VpdGVzLCBBdXRoZW50aWNhdGlvbiApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlQ1NSX0FVVEhfVFlQRV9DQ0tNX1JTTiA9PSBwQXV0aFR5cGUtPmF1dGhUeXBlW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgbmVnQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9DQ0tNX1JTTjsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoIChuZWdBdXRoVHlwZSA9PSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOKSAmJiBjc3JJc0F1dGhSU04oIHBNYWMsIEF1dGhTdWl0ZXMsIGNBdXRoU3VpdGVzLCBBdXRoZW50aWNhdGlvbiApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlQ1NSX0FVVEhfVFlQRV9SU04gPT0gcEF1dGhUeXBlLT5hdXRoVHlwZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZ0F1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfUlNOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG5lZ0F1dGhUeXBlID09IGVDU1JfQVVUSF9UWVBFX1VOS05PV04pICYmIGNzcklzQXV0aFJTTlBzayggcE1hYywgQXV0aFN1aXRlcywgY0F1dGhTdWl0ZXMsIEF1dGhlbnRpY2F0aW9uICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVDU1JfQVVUSF9UWVBFX1JTTl9QU0sgPT0gcEF1dGhUeXBlLT5hdXRoVHlwZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZ0F1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfUlNOX1BTSzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgMXN0IGF1dGggdHlwZSBpbiB0aGUgQVBzIFJTTiBJRSwgdG8gbWF0Y2ggc3RhdGlvbnMgY29ubmVjdGluZworICAgICAgICAgICAgICAgIC8vIHByb2ZpbGVzIGF1dGggdHlwZSB3aWxsIGNhdXNlIHVzIHRvIGV4aXQgdGhpcyBsb29wCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhZGRlZCBhcyBzb21lIEFQcyBhZHZlcnRpc2UgbXVsdGlwbGUgYWttcyBpbiB0aGUgUlNOIElFLgorICAgICAgICAgICAgICAgIGlmIChlQ1NSX0FVVEhfVFlQRV9VTktOT1dOICE9IG5lZ0F1dGhUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZkFjY2VwdGFibGVDeXBoZXJzID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBmb3IKKyAgICAgICAgfQorCisgICAgfXdoaWxlICgwKTsKKworICAgIGlmICggZkFjY2VwdGFibGVDeXBoZXJzICkKKyAgICB7CisgICAgICAgIGlmICggTXVsdGljYXN0Q3lwaGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgTXVsdGljYXN0Q3lwaGVyLCBNdWx0aWNhc3QsIENTUl9SU05fT1VJX1NJWkUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggVW5pY2FzdEN5cGhlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIFVuaWNhc3RDeXBoZXIsIFVuaWNhc3QsIENTUl9SU05fT1VJX1NJWkUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggQXV0aFN1aXRlICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgQXV0aFN1aXRlLCBBdXRoZW50aWNhdGlvbiwgQ1NSX1JTTl9PVUlfU0laRSApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBwTmVnb3RpYXRlZEF1dGh0eXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgKnBOZWdvdGlhdGVkQXV0aHR5cGUgPSBuZWdBdXRoVHlwZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIENhcGFiaWxpdGllcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENhcGFiaWxpdGllcy0+UHJlQXV0aFN1cHBvcnRlZCA9IHBSU05JZS0+cHJlYXV0aDsKKyAgICAgICAgICAgIENhcGFiaWxpdGllcy0+Tm9QYWlyd2lzZSA9IHBSU05JZS0+bm9fcHdpc2U7CisgICAgICAgICAgICBDYXBhYmlsaXRpZXMtPlBUS1NBUmVwbGF5Q291bnRlciA9IHBSU05JZS0+UFRLU0FfcmVwbGF5X2NvdW50ZXI7CisgICAgICAgICAgICBDYXBhYmlsaXRpZXMtPkdUS1NBUmVwbGF5Q291bnRlciA9IHBSU05JZS0+R1RLU0FfcmVwbGF5X2NvdW50ZXI7CisgICAgICAgICAgICBDYXBhYmlsaXRpZXMtPlJlc2VydmVkID0gcFJTTkllLT5yZXNlcnZlZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oIGZBY2NlcHRhYmxlQ3lwaGVycyApOworfQorCisKK3RBTklfQk9PTEVBTiBjc3JJc1JTTk1hdGNoKCB0SGFsSGFuZGxlIGhIYWwsIHRDc3JBdXRoTGlzdCAqcEF1dGhUeXBlLCBlQ3NyRW5jcnlwdGlvblR5cGUgZW5UeXBlLCB0Q3NyRW5jcnlwdGlvbkxpc3QgKnBFbk1jVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqcEllcywgZUNzckF1dGhUeXBlICpwTmVnb3RpYXRlZEF1dGhUeXBlLCBlQ3NyRW5jcnlwdGlvblR5cGUgKnBOZWdvdGlhdGVkTUNDaXBoZXIgKQoreworICAgIHRBTklfQk9PTEVBTiBmUlNOTWF0Y2ggPSBGQUxTRTsKKworICAgICAgICAvLyBTZWUgaWYgdGhlIGN5cGhlcnMgaW4gdGhlIEJzcyBkZXNjcmlwdGlvbiBtYXRjaCB3aXRoIHRoZSBzZXR0aW5ncyBpbiB0aGUgcHJvZmlsZS4KKyAgICBmUlNOTWF0Y2ggPSBjc3JHZXRSU05JbmZvcm1hdGlvbiggaEhhbCwgcEF1dGhUeXBlLCBlblR5cGUsIHBFbk1jVHlwZSwgJnBJZXMtPlJTTiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZWdvdGlhdGVkQXV0aFR5cGUsIHBOZWdvdGlhdGVkTUNDaXBoZXIgKTsKKworICAgIHJldHVybiggZlJTTk1hdGNoICk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzckxvb2t1cFBNS0lEKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRBTklfVTggKnBCU1NJZCwgdEFOSV9VOCAqcFBNS0lkICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZlJDID0gRkFMU0UsIGZNYXRjaEZvdW5kID0gRkFMU0U7CisgICAgdEFOSV9VMzIgSW5kZXg7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgZm9yKCBJbmRleD0wOyBJbmRleCA8IHBTZXNzaW9uLT5OdW1QbWtpZENhY2hlOyBJbmRleCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJtYXRjaCBQTUtJRCAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWCB0byBcbiIsCisgICAgICAgICAgICAgICAgcEJTU0lkWzBdLCBwQlNTSWRbMV0sIHBCU1NJZFsyXSwgcEJTU0lkWzNdLCBwQlNTSWRbNF0sIHBCU1NJZFs1XSk7CisgICAgICAgICAgICBpZiggcGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsIHBCU1NJZCwgcFNlc3Npb24tPlBta2lkQ2FjaGVJbmZvW0luZGV4XS5CU1NJRCwgc2l6ZW9mKHRDc3JCc3NpZCkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbWF0Y2ggZm91bmQKKyAgICAgICAgICAgICAgICBmTWF0Y2hGb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggIWZNYXRjaEZvdW5kICkgYnJlYWs7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFBNS0lkLCBwU2Vzc2lvbi0+UG1raWRDYWNoZUluZm9bSW5kZXhdLlBNS0lELCBDU1JfUlNOX1BNS0lEX1NJWkUgKTsKKworICAgICAgICBmUkMgPSBUUlVFOworICAgIH0KKyAgICB3aGlsZSggMCApOworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiY3NyTG9va3VwUE1LSUQgY2FsbGVkIHJldHVybiBtYXRjaCA9ICVkIHBNYWMtPnJvYW0uTnVtUG1raWRDYWNoZSA9ICVkIiwgCisgICAgICAgIGZSQywgcFNlc3Npb24tPk51bVBta2lkQ2FjaGUpOworCisgICAgcmV0dXJuIGZSQzsKK30KKworCit0QU5JX1U4IGNzckNvbnN0cnVjdFJTTkllKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0Q3NyUlNOSWUgKnBSU05JZSApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdEFOSV9CT09MRUFOIGZSU05NYXRjaDsKKyAgICB0QU5JX1U4IGNiUlNOSWUgPSAwOworICAgIHRBTklfVTggVW5pY2FzdEN5cGhlclsgQ1NSX1JTTl9PVUlfU0laRSBdOworICAgIHRBTklfVTggTXVsdGljYXN0Q3lwaGVyWyBDU1JfUlNOX09VSV9TSVpFIF07CisgICAgdEFOSV9VOCBBdXRoU3VpdGVbIENTUl9SU05fT1VJX1NJWkUgXTsKKyAgICB0Q3NyUlNOQXV0aEllICpwQXV0aFN1aXRlOworICAgIHRDc3JSU05DYXBhYmlsaXRpZXMgUlNOQ2FwYWJpbGl0aWVzOworICAgIHRDc3JSU05QTUtJZSAgICAgICAgKnBQTUs7CisgICAgdEFOSV9VOCBQTUtJZFtDU1JfUlNOX1BNS0lEX1NJWkVdOworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXNMb2NhbCA9IHBJZXM7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYgKCAhY3NySXNQcm9maWxlUlNOKCBwUHJvZmlsZSApICkgYnJlYWs7CisKKyAgICAgICAgaWYoICFwSWVzTG9jYWwgJiYgKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgcFNpckJzc0Rlc2MsICZwSWVzTG9jYWwpKSkgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlZSBpZiB0aGUgY3lwaGVycyBpbiB0aGUgQnNzIGRlc2NyaXB0aW9uIG1hdGNoIHdpdGggdGhlIHNldHRpbmdzIGluIHRoZSBwcm9maWxlLgorICAgICAgICBmUlNOTWF0Y2ggPSBjc3JHZXRSU05JbmZvcm1hdGlvbiggaEhhbCwgJnBQcm9maWxlLT5BdXRoVHlwZSwgcFByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlLCAmcEllc0xvY2FsLT5SU04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNhc3RDeXBoZXIsIE11bHRpY2FzdEN5cGhlciwgQXV0aFN1aXRlLCAmUlNOQ2FwYWJpbGl0aWVzLCBOVUxMLCBOVUxMICk7CisgICAgICAgIGlmICggIWZSU05NYXRjaCApIGJyZWFrOworCisgICAgICAgIHBSU05JZS0+SWVIZWFkZXIuRWxlbWVudElEID0gU0lSX01BQ19SU05fRUlEOworCisgICAgICAgIHBSU05JZS0+VmVyc2lvbiA9IENTUl9SU05fVkVSU0lPTl9TVVBQT1JURUQ7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFJTTkllLT5NdWx0aWNhc3RPdWksIE11bHRpY2FzdEN5cGhlciwgc2l6ZW9mKCBNdWx0aWNhc3RDeXBoZXIgKSApOworCisgICAgICAgIHBSU05JZS0+Y1VuaWNhc3RDeXBoZXJzID0gMTsKKworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAmcFJTTkllLT5VbmljYXN0T3VpWyAwIF0sIFVuaWNhc3RDeXBoZXIsIHNpemVvZiggVW5pY2FzdEN5cGhlciApICk7CisKKyAgICAgICAgcEF1dGhTdWl0ZSA9ICh0Q3NyUlNOQXV0aEllICopKCAmcFJTTkllLT5VbmljYXN0T3VpWyBwUlNOSWUtPmNVbmljYXN0Q3lwaGVycyBdICk7CisKKyAgICAgICAgcEF1dGhTdWl0ZS0+Y0F1dGhlbnRpY2F0aW9uU3VpdGVzID0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgJnBBdXRoU3VpdGUtPkF1dGhPdWlbIDAgXSwgQXV0aFN1aXRlLCBzaXplb2YoIEF1dGhTdWl0ZSApICk7CisKKyAgICAgICAgLy8gUlNOIGNhcGFiaWxpdGllcyBmb2xsb3dzIHRoZSBBdXRoIFN1aXRlICh0d28gb2N0ZWN0cykKKyAgICAgICAgLy8gISFSRVZJRVcgLSBXaGF0IHNob3VsZCBTVEEgcHV0IGluIFJTTiBjYXBhYmlsaXRpZXMsIGN1cnJlbnRseQorICAgICAgICAvLyBqdXN0IHB1dHRpbmcgYmFjayBBUHMgY2FwYWJpbGl0aWVzCisgICAgICAgIC8vIEZvciBvbmUsIHdlIHNob3VsZG4ndCBFVkVSIGJlIHNlbmRpbmcgb3V0ICJwcmUtYXV0aCBzdXBwb3J0ZWQiLiAgSXQgaXMgYW4gQVAgb25seSBjYXBhYmlsaXR5CisgICAgICAgIFJTTkNhcGFiaWxpdGllcy5QcmVBdXRoU3VwcG9ydGVkID0gMDsKKyAgICAgICAgKih0QU5JX1UxNiAqKSggJnBBdXRoU3VpdGUtPkF1dGhPdWlbIDEgXSApID0gKigodEFOSV9VMTYgKikoJlJTTkNhcGFiaWxpdGllcykpOworCisgICAgICAgIHBQTUsgPSAodENzclJTTlBNS0llICopKCAoKHRBTklfVTggKikoJnBBdXRoU3VpdGUtPkF1dGhPdWlbIDEgXSkpICsgc2l6ZW9mKHRBTklfVTE2KSApOworCisgICAgICAgIGlmKCBjc3JMb29rdXBQTUtJRCggcE1hYywgc2Vzc2lvbklkLCBwU2lyQnNzRGVzYy0+YnNzSWQsICYoUE1LSWRbMF0pICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwUE1LLT5jUE1LSURzID0gMTsKKworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFBNSy0+UE1LSURMaXN0WzBdLlBNS0lELCBQTUtJZCwgQ1NSX1JTTl9QTUtJRF9TSVpFICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUE1LLT5jUE1LSURzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBpbiB0aGUgZml4ZWQgZmllbGRzIHBsdXMgMSBVbmljYXN0IGN5cGhlciwgbGVzcyB0aGUgSUUgSGVhZGVyIGxlbmd0aAorICAgICAgICAvLyBBZGQgaW4gdGhlIHNpemUgb2YgdGhlIEF1dGggc3VpdGUgKGNvdW50IHBsdXMgYSBzaW5nbGUgT1VJKQorICAgICAgICAvLyBBZGQgaW4gdGhlIFJTTiBjYXBzIGZpZWxkLgorICAgICAgICAvLyBBZGQgUE1LSUQgY291bnQgYW5kIFBNS0lEIChpZiBhbnkpCisgICAgICAgIHBSU05JZS0+SWVIZWFkZXIuTGVuZ3RoID0gKHRBTklfVTgpIChzaXplb2YoICpwUlNOSWUgKSAtIHNpemVvZiAoIHBSU05JZS0+SWVIZWFkZXIgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCAqcEF1dGhTdWl0ZSApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHRDc3JSU05DYXBhYmlsaXRpZXMgKSk7CisgICAgICAgIGlmKHBQTUstPmNQTUtJRHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBSU05JZS0+SWVIZWFkZXIuTGVuZ3RoICs9ICh0QU5JX1U4KShzaXplb2YoIHRBTklfVTE2ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUE1LLT5jUE1LSURzICogQ1NSX1JTTl9QTUtJRF9TSVpFKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBJRSBoZWFkZXIgKHRvdGFsKSBjb25zdHJ1Y3RlZC4uLgorICAgICAgICBjYlJTTkllID0gcFJTTkllLT5JZUhlYWRlci5MZW5ndGggKyBzaXplb2YoIHBSU05JZS0+SWVIZWFkZXIgKTsKKworICAgIH0gd2hpbGUoIDAgKTsKKworICAgIGlmKCAhcEllcyAmJiBwSWVzTG9jYWwgKQorICAgIHsKKyAgICAgICAgLy9sb2NhbGx5IGFsbG9jYXRlZAorICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXNMb2NhbCk7CisgICAgfQorCisgICAgcmV0dXJuKCBjYlJTTkllICk7Cit9CisKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCit0QU5JX0JPT0xFQU4gY3NyR2V0V2FwaUluZm9ybWF0aW9uKCB0SGFsSGFuZGxlIGhIYWwsIHRDc3JBdXRoTGlzdCAqcEF1dGhUeXBlLCBlQ3NyRW5jcnlwdGlvblR5cGUgZW5UeXBlLCB0Q3NyRW5jcnlwdGlvbkxpc3QgKnBNQ0VuY3J5cHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdBUEkgKnBXYXBpSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpVbmljYXN0Q3lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqTXVsdGljYXN0Q3lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqQXV0aFN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNzckF1dGhUeXBlICpwTmVnb3RpYXRlZEF1dGh0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNzckVuY3J5cHRpb25UeXBlICpwTmVnb3RpYXRlZE1DQ2lwaGVyICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICB0QU5JX0JPT0xFQU4gZkFjY2VwdGFibGVDeXBoZXJzID0gRkFMU0U7CisgICAgdEFOSV9VOCBjVW5pY2FzdEN5cGhlcnMgPSAwOworICAgIHRBTklfVTggY011bHRpY2FzdEN5cGhlcnMgPSAwOworICAgIHRBTklfVTggY0F1dGhTdWl0ZXMgPSAwLCBpOworICAgIHRBTklfVTggVW5pY2FzdFsgQ1NSX1dBUElfT1VJX1NJWkUgXTsKKyAgICB0QU5JX1U4IE11bHRpY2FzdFsgQ1NSX1dBUElfT1VJX1NJWkUgXTsKKyAgICB0QU5JX1U4IEF1dGhTdWl0ZXNbIENTUl9XQVBJX01BWF9BVVRIX1NVSVRFUyBdWyBDU1JfV0FQSV9PVUlfU0laRSBdOworICAgIHRBTklfVTggQXV0aGVudGljYXRpb25bIENTUl9XQVBJX09VSV9TSVpFIF07CisgICAgdEFOSV9VOCBNdWx0aWNhc3RDeXBoZXJzWyBDU1JfV0FQSV9NQVhfTVVMVElDQVNUX0NZUEhFUlMgXVsgQ1NSX1dBUElfT1VJX1NJWkUgXTsKKyAgICBlQ3NyQXV0aFR5cGUgbmVnQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworCisgICAgZG97CisgICAgICAgIGlmICggcFdhcGlJZS0+cHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNNdWx0aWNhc3RDeXBoZXJzKys7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIE11bHRpY2FzdEN5cGhlcnMsIHBXYXBpSWUtPm11bHRpY2FzdF9jaXBoZXJfc3VpdGUsIENTUl9XQVBJX09VSV9TSVpFKTsKKyAgICAgICAgICAgIGNVbmljYXN0Q3lwaGVycyA9ICh0QU5JX1U4KShwV2FwaUllLT51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBjQXV0aFN1aXRlcyA9ICh0QU5JX1U4KShwV2FwaUllLT5ha21fc3VpdGVfY291bnQpOworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgY0F1dGhTdWl0ZXMgJiYgaSA8IENTUl9XQVBJX01BWF9BVVRIX1NVSVRFUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikmQXV0aFN1aXRlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBXYXBpSWUtPmFrbV9zdWl0ZXNbaV0sIENTUl9XQVBJX09VSV9TSVpFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9DaGVjayAtIElzIHJlcXVlc3RlZCBVbmljYXN0IENpcGhlciBzdXBwb3J0ZWQgYnkgdGhlIEJTUy4KKyAgICAgICAgICAgIGZBY2NlcHRhYmxlQ3lwaGVycyA9IGNzck1hdGNoV2FwaU9VSUluZGV4KCBwTWFjLCBwV2FwaUllLT51bmljYXN0X2NpcGhlcl9zdWl0ZXMsIGNVbmljYXN0Q3lwaGVycywgCisgICAgICAgICAgICAgICAgICAgIGNzckdldE9VSUluZGV4RnJvbUNpcGhlciggZW5UeXBlICksIFVuaWNhc3QgKTsgCisKKyAgICAgICAgICAgIGlmKCAhZkFjY2VwdGFibGVDeXBoZXJzICkgYnJlYWs7CisKKworICAgICAgICAgICAgLy9VbmljYXN0IGlzIHN1cHBvcnRlZC4gUGljayB0aGUgZmlyc3QgbWF0Y2hpbmcgR3JvdXAgY2lwaGVyLCBpZiBhbnkuCisgICAgICAgICAgICBmb3IoIGkgPSAwIDsgaSA8IHBNQ0VuY3J5cHRpb24tPm51bUVudHJpZXMgOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZBY2NlcHRhYmxlQ3lwaGVycyA9IGNzck1hdGNoV2FwaU9VSUluZGV4KCBwTWFjLCBNdWx0aWNhc3RDeXBoZXJzLCAgY011bHRpY2FzdEN5cGhlcnMsIAorICAgICAgICAgICAgICAgIGNzckdldE9VSUluZGV4RnJvbUNpcGhlciggcE1DRW5jcnlwdGlvbi0+ZW5jcnlwdGlvblR5cGVbaV0gKSwgTXVsdGljYXN0ICk7CisgICAgICAgICAgICAgICAgaWYoZkFjY2VwdGFibGVDeXBoZXJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFmQWNjZXB0YWJsZUN5cGhlcnMgKSBicmVhazsKKworICAgICAgICAgICAgaWYoIHBOZWdvdGlhdGVkTUNDaXBoZXIgKQorICAgICAgICAgICAgICAgICpwTmVnb3RpYXRlZE1DQ2lwaGVyID0gcE1DRW5jcnlwdGlvbi0+ZW5jcnlwdGlvblR5cGVbaV07CisKKyAgICAgICAgICAgIC8vQ2lwaGVycyBhcmUgc3VwcG9ydGVkLCBNYXRjaCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gYW5kIHBpY2sgZmlyc3QgbWF0Y2hpbmcgYXV0aHR5cGUuCisgICAgICAgICAgICBpZiAoIGNzcklzQXV0aFdhcGlDZXJ0KCBwTWFjLCBBdXRoU3VpdGVzLCBjQXV0aFN1aXRlcywgQXV0aGVudGljYXRpb24gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmVnQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9DRVJUSUZJQ0FURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBjc3JJc0F1dGhXYXBpUHNrKCBwTWFjLCBBdXRoU3VpdGVzLCBjQXV0aFN1aXRlcywgQXV0aGVudGljYXRpb24gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmVnQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9XQVBJX1dBSV9QU0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZkFjY2VwdGFibGVDeXBoZXJzID0gRkFMU0U7CisgICAgICAgICAgICAgICAgbmVnQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICggMCA9PSBwQXV0aFR5cGUtPm51bUVudHJpZXMgKSB8fCAoIEZBTFNFID09IGZBY2NlcHRhYmxlQ3lwaGVycyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0NhbGxlciBkb2Vzbid0IGNhcmUgYWJvdXQgYXV0aCB0eXBlLCBvciBCU1MgZG9lc24ndCBtYXRjaAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZkFjY2VwdGFibGVDeXBoZXJzID0gRkFMU0U7CisgICAgICAgICAgICBmb3IoIGkgPSAwIDsgaSA8IHBBdXRoVHlwZS0+bnVtRW50cmllczsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggcEF1dGhUeXBlLT5hdXRoVHlwZVtpXSA9PSBuZWdBdXRoVHlwZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmQWNjZXB0YWJsZUN5cGhlcnMgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9d2hpbGUgKDApOworCisgICAgaWYgKCBmQWNjZXB0YWJsZUN5cGhlcnMgKQorICAgIHsKKyAgICAgICAgaWYgKCBNdWx0aWNhc3RDeXBoZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBNdWx0aWNhc3RDeXBoZXIsIE11bHRpY2FzdCwgQ1NSX1dBUElfT1VJX1NJWkUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggVW5pY2FzdEN5cGhlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIFVuaWNhc3RDeXBoZXIsIFVuaWNhc3QsIENTUl9XQVBJX09VSV9TSVpFICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIEF1dGhTdWl0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIEF1dGhTdWl0ZSwgQXV0aGVudGljYXRpb24sIENTUl9XQVBJX09VSV9TSVpFICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBOZWdvdGlhdGVkQXV0aHR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICAqcE5lZ290aWF0ZWRBdXRodHlwZSA9IG5lZ0F1dGhUeXBlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiggZkFjY2VwdGFibGVDeXBoZXJzICk7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JJc1dhcGlNYXRjaCggdEhhbEhhbmRsZSBoSGFsLCB0Q3NyQXV0aExpc3QgKnBBdXRoVHlwZSwgZUNzckVuY3J5cHRpb25UeXBlIGVuVHlwZSwgdENzckVuY3J5cHRpb25MaXN0ICpwRW5NY1R5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIGVDc3JBdXRoVHlwZSAqcE5lZ290aWF0ZWRBdXRoVHlwZSwgZUNzckVuY3J5cHRpb25UeXBlICpwTmVnb3RpYXRlZE1DQ2lwaGVyICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZldhcGlNYXRjaCA9IEZBTFNFOworCisgICAgICAgIC8vIFNlZSBpZiB0aGUgY3lwaGVycyBpbiB0aGUgQnNzIGRlc2NyaXB0aW9uIG1hdGNoIHdpdGggdGhlIHNldHRpbmdzIGluIHRoZSBwcm9maWxlLgorICAgIGZXYXBpTWF0Y2ggPSBjc3JHZXRXYXBpSW5mb3JtYXRpb24oIGhIYWwsIHBBdXRoVHlwZSwgZW5UeXBlLCBwRW5NY1R5cGUsICZwSWVzLT5XQVBJLCBOVUxMLCBOVUxMLCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5lZ290aWF0ZWRBdXRoVHlwZSwgcE5lZ290aWF0ZWRNQ0NpcGhlciApOworCisgICAgcmV0dXJuKCBmV2FwaU1hdGNoICk7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JMb29rdXBCS0lEKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRBTklfVTggKnBCU1NJZCwgdEFOSV9VOCAqcEJLSWQgKQoreworICAgIHRBTklfQk9PTEVBTiBmUkMgPSBGQUxTRSwgZk1hdGNoRm91bmQgPSBGQUxTRTsKKyAgICB0QU5JX1UzMiBJbmRleDsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKworICAgIGRvCisgICAgeworICAgICAgICBmb3IoIEluZGV4PTA7IEluZGV4IDwgcFNlc3Npb24tPk51bUJraWRDYWNoZTsgSW5kZXgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAibWF0Y2ggQktJRCAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWCB0byBcbiIsCisgICAgICAgICAgICAgICAgcEJTU0lkWzBdLCBwQlNTSWRbMV0sIHBCU1NJZFsyXSwgcEJTU0lkWzNdLCBwQlNTSWRbNF0sIHBCU1NJZFs1XSk7CisgICAgICAgICAgICBpZiggcGFsRXF1YWxNZW1vcnkoIHBNYWMtPmhIZGQsIHBCU1NJZCwgcFNlc3Npb24tPkJraWRDYWNoZUluZm9bSW5kZXhdLkJTU0lELCBzaXplb2YodENzckJzc2lkKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBtYXRjaCBmb3VuZAorICAgICAgICAgICAgICAgIGZNYXRjaEZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhZk1hdGNoRm91bmQgKSBicmVhazsKKworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwQktJZCwgcFNlc3Npb24tPkJraWRDYWNoZUluZm9bSW5kZXhdLkJLSUQsIENTUl9XQVBJX0JLSURfU0laRSApOworCisgICAgICAgIGZSQyA9IFRSVUU7CisgICAgfQorICAgIHdoaWxlKCAwICk7CisgICAgc21zTG9nKHBNYWMsIExPR1csICJjc3JMb29rdXBCS0lEIGNhbGxlZCByZXR1cm4gbWF0Y2ggPSAlZCBwTWFjLT5yb2FtLk51bUJraWRDYWNoZSA9ICVkIiwgZlJDLCBwU2Vzc2lvbi0+TnVtQmtpZENhY2hlKTsKKworICAgIHJldHVybiBmUkM7Cit9CisKK3RBTklfVTggY3NyQ29uc3RydWN0V2FwaUllKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcEllcywgdENzcldhcGlJZSAqcFdhcGlJZSApCit7CisgICAgdEFOSV9CT09MRUFOIGZXYXBpTWF0Y2ggPSBGQUxTRTsKKyAgICB0QU5JX1U4IGNiV2FwaUllID0gMDsKKyAgICB0QU5JX1U4IFVuaWNhc3RDeXBoZXJbIENTUl9XQVBJX09VSV9TSVpFIF07CisgICAgdEFOSV9VOCBNdWx0aWNhc3RDeXBoZXJbIENTUl9XQVBJX09VSV9TSVpFIF07CisgICAgdEFOSV9VOCBBdXRoU3VpdGVbIENTUl9XQVBJX09VSV9TSVpFIF07CisgICAgdEFOSV9VOCBCS0lkW0NTUl9XQVBJX0JLSURfU0laRV07CisgICAgdEFOSV9VOCAqcFdhcGkgPSBOVUxMOworICAgIHRBTklfQk9PTEVBTiBmQktJREZvdW5kID0gRkFMU0U7CisgICAgdERvdDExZkJlYWNvbklFcyAqcEllc0xvY2FsID0gcEllczsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiAoICFjc3JJc1Byb2ZpbGVXYXBpKCBwUHJvZmlsZSApICkgYnJlYWs7CisKKyAgICAgICAgaWYoICFwSWVzTG9jYWwgJiYgKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgcFNpckJzc0Rlc2MsICZwSWVzTG9jYWwpKSkgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlZSBpZiB0aGUgY3lwaGVycyBpbiB0aGUgQnNzIGRlc2NyaXB0aW9uIG1hdGNoIHdpdGggdGhlIHNldHRpbmdzIGluIHRoZSBwcm9maWxlLgorICAgICAgICBmV2FwaU1hdGNoID0gY3NyR2V0V2FwaUluZm9ybWF0aW9uKCBwTWFjLCAmcFByb2ZpbGUtPkF1dGhUeXBlLCBwUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUsICZwSWVzTG9jYWwtPldBUEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNhc3RDeXBoZXIsIE11bHRpY2FzdEN5cGhlciwgQXV0aFN1aXRlLCBOVUxMLCBOVUxMICk7CisgICAgICAgIGlmICggIWZXYXBpTWF0Y2ggKSBicmVhazsKKworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBXYXBpSWUsIHNpemVvZih0Q3NyV2FwaUllKSk7CisKKyAgICAgICAgcFdhcGlJZS0+SWVIZWFkZXIuRWxlbWVudElEID0gRE9UMTFGX0VJRF9XQVBJOworCisgICAgICAgIHBXYXBpSWUtPlZlcnNpb24gPSBDU1JfV0FQSV9WRVJTSU9OX1NVUFBPUlRFRDsKKworICAgICAgICBwV2FwaUllLT5jQXV0aGVudGljYXRpb25TdWl0ZXMgPSAxOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAmcFdhcGlJZS0+QXV0aE91aVsgMCBdLCBBdXRoU3VpdGUsIHNpemVvZiggQXV0aFN1aXRlICkgKTsKKworICAgICAgICBwV2FwaSA9ICh0QU5JX1U4ICopICgmcFdhcGlJZS0+QXV0aE91aVsgMSBdKTsKKworICAgICAgICAqcFdhcGkgPSAodEFOSV9VMTYpMTsgLy9jVW5pY2FzdEN5cGhlcnMKKyAgICAgICAgcFdhcGkrPTI7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBXYXBpLCBVbmljYXN0Q3lwaGVyLCBzaXplb2YoIFVuaWNhc3RDeXBoZXIgKSApOworICAgICAgICBwV2FwaSArPSBzaXplb2YoIFVuaWNhc3RDeXBoZXIgKTsKKworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwV2FwaSwgTXVsdGljYXN0Q3lwaGVyLCBzaXplb2YoIE11bHRpY2FzdEN5cGhlciApICk7CisgICAgICAgIHBXYXBpICs9IHNpemVvZiggTXVsdGljYXN0Q3lwaGVyICk7CisKKworICAgICAgICAvLyBXQVBJIGNhcGFiaWxpdGllcyBmb2xsb3dzIHRoZSBBdXRoIFN1aXRlICh0d28gb2N0ZWN0cykKKyAgICAgICAgLy8gd2Ugc2hvdWxkbid0IEVWRVIgYmUgc2VuZGluZyBvdXQgInByZS1hdXRoIHN1cHBvcnRlZCIuICBJdCBpcyBhbiBBUCBvbmx5IGNhcGFiaWxpdHkKKyAgICAgICAgLy8gJiBzaW5jZSB3ZSBhbHJlYWR5IGRpZCBhIG1lbXNldCBwV2FwaUllIHRvIDAsIHNraXAgdGhlc2UgZmllbGRzCisgICAgICAgIHBXYXBpICs9MjsKKworICAgICAgICBmQktJREZvdW5kID0gY3NyTG9va3VwQktJRCggcE1hYywgc2Vzc2lvbklkLCBwU2lyQnNzRGVzYy0+YnNzSWQsICYoQktJZFswXSkgKTsKKworCisgICAgICAgIGlmKCBmQktJREZvdW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRG8gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGVuZGlhbm5lc3MgaGVyZSAqLworICAgICAgICAgICAgKnBXYXBpID0gKHRBTklfVTE2KTE7IC8vY0JLSURzCisgICAgICAgICAgICBwV2FwaSs9MjsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBXYXBpLCBCS0lkLCBDU1JfV0FQSV9CS0lEX1NJWkUgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpwV2FwaSA9IDA7CisgICAgICAgICAgICBwV2FwaSs9MTsKKyAgICAgICAgICAgICpwV2FwaSA9IDA7CisgICAgICAgICAgICBwV2FwaSs9MTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBpbiB0aGUgSUUgZmllbGRzIGV4Y2VwdCB0aGUgSUUgaGVhZGVyCisgICAgICAgIC8vIEFkZCBCS0lEIGNvdW50IGFuZCBCS0lEIChpZiBhbnkpCisgICAgICAgIHBXYXBpSWUtPkllSGVhZGVyLkxlbmd0aCA9ICh0QU5JX1U4KSAoc2l6ZW9mKCAqcFdhcGlJZSApIC0gc2l6ZW9mICggcFdhcGlJZS0+SWVIZWFkZXIgKSk7CisKKyAgICAgICAgLyoyIGJ5dGVzIGZvciBCS0lEIENvdW50IGZpZWxkKi8KKyAgICAgICAgcFdhcGlJZS0+SWVIZWFkZXIuTGVuZ3RoICs9IHNpemVvZiggdEFOSV9VMTYgKTsKKworICAgICAgICBpZihmQktJREZvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICBwV2FwaUllLT5JZUhlYWRlci5MZW5ndGggKz0gQ1NSX1dBUElfQktJRF9TSVpFOworICAgICAgICB9CisgICAgICAgIC8vIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgSUUgaGVhZGVyICh0b3RhbCkgY29uc3RydWN0ZWQuLi4KKyAgICAgICAgY2JXYXBpSWUgPSBwV2FwaUllLT5JZUhlYWRlci5MZW5ndGggKyBzaXplb2YoIHBXYXBpSWUtPkllSGVhZGVyICk7CisKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICBpZiggIXBJZXMgJiYgcEllc0xvY2FsICkKKyAgICB7CisgICAgICAgIC8vbG9jYWxseSBhbGxvY2F0ZWQKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwSWVzTG9jYWwpOworICAgIH0KKworICAgIHJldHVybiggY2JXYXBpSWUgKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCit0QU5JX0JPT0xFQU4gY3NyR2V0V3BhQ3lwaGVycyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckF1dGhMaXN0ICpwQXV0aFR5cGUsIGVDc3JFbmNyeXB0aW9uVHlwZSBlblR5cGUsIHRDc3JFbmNyeXB0aW9uTGlzdCAqcE1DRW5jcnlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXUEEgKnBXcGFJZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKlVuaWNhc3RDeXBoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpNdWx0aWNhc3RDeXBoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpBdXRoU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyQXV0aFR5cGUgKnBOZWdvdGlhdGVkQXV0aHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyRW5jcnlwdGlvblR5cGUgKnBOZWdvdGlhdGVkTUNDaXBoZXIgKQoreworICAgIHRBTklfQk9PTEVBTiBmQWNjZXB0YWJsZUN5cGhlcnMgPSBGQUxTRTsKKyAgICB0QU5JX1U4IGNVbmljYXN0Q3lwaGVycyA9IDA7CisgICAgdEFOSV9VOCBjTXVsdGljYXN0Q3lwaGVycyA9IDA7CisgICAgdEFOSV9VOCBjQXV0aFN1aXRlcyA9IDA7CisgICAgdEFOSV9VOCBVbmljYXN0WyBDU1JfV1BBX09VSV9TSVpFIF07CisgICAgdEFOSV9VOCBNdWx0aWNhc3RbIENTUl9XUEFfT1VJX1NJWkUgXTsKKyAgICB0QU5JX1U4IEF1dGhlbnRpY2F0aW9uWyBDU1JfV1BBX09VSV9TSVpFIF07CisgICAgdEFOSV9VOCBNdWx0aWNhc3RDeXBoZXJzWyAxIF1bIENTUl9XUEFfT1VJX1NJWkUgXTsKKyAgICB0QU5JX1U4IGk7CisgICAgZUNzckF1dGhUeXBlIG5lZ0F1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiAoIHBXcGFJZS0+cHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNNdWx0aWNhc3RDeXBoZXJzID0gMTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgTXVsdGljYXN0Q3lwaGVycywgcFdwYUllLT5tdWx0aWNhc3RfY2lwaGVyLCBDU1JfV1BBX09VSV9TSVpFKTsKKyAgICAgICAgICAgIGNVbmljYXN0Q3lwaGVycyA9ICh0QU5JX1U4KShwV3BhSWUtPnVuaWNhc3RfY2lwaGVyX2NvdW50KTsKKyAgICAgICAgICAgIGNBdXRoU3VpdGVzID0gKHRBTklfVTgpKHBXcGFJZS0+YXV0aF9zdWl0ZV9jb3VudCk7CisKKyAgICAgICAgICAgIC8vQ2hlY2sgLSBJcyByZXF1ZXN0ZWQgVW5pY2FzdCBDaXBoZXIgc3VwcG9ydGVkIGJ5IHRoZSBCU1MuCisgICAgICAgICAgICBmQWNjZXB0YWJsZUN5cGhlcnMgPSBjc3JNYXRjaFdQQU9VSUluZGV4KCBwTWFjLCBwV3BhSWUtPnVuaWNhc3RfY2lwaGVycywgY1VuaWNhc3RDeXBoZXJzLCAKKyAgICAgICAgICAgICAgICAgICAgY3NyR2V0T1VJSW5kZXhGcm9tQ2lwaGVyKCBlblR5cGUgKSwgVW5pY2FzdCApOworCisgICAgICAgICAgICBpZiggIWZBY2NlcHRhYmxlQ3lwaGVycyApIGJyZWFrOworCisKKyAgICAgICAgICAgIC8vVW5pY2FzdCBpcyBzdXBwb3J0ZWQuIFBpY2sgdGhlIGZpcnN0IG1hdGNoaW5nIEdyb3VwIGNpcGhlciwgaWYgYW55LgorICAgICAgICAgICAgZm9yKCBpID0gMCA7IGkgPCBwTUNFbmNyeXB0aW9uLT5udW1FbnRyaWVzIDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmQWNjZXB0YWJsZUN5cGhlcnMgPSBjc3JNYXRjaFdQQU9VSUluZGV4KCBwTWFjLCBNdWx0aWNhc3RDeXBoZXJzLCAgY011bHRpY2FzdEN5cGhlcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzckdldE9VSUluZGV4RnJvbUNpcGhlciggcE1DRW5jcnlwdGlvbi0+ZW5jcnlwdGlvblR5cGVbaV0pLCBNdWx0aWNhc3QgKTsKKyAgICAgICAgICAgICAgICBpZihmQWNjZXB0YWJsZUN5cGhlcnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIWZBY2NlcHRhYmxlQ3lwaGVycyApIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggcE5lZ290aWF0ZWRNQ0NpcGhlciApCisgICAgICAgICAgICAgICAgKnBOZWdvdGlhdGVkTUNDaXBoZXIgPSBwTUNFbmNyeXB0aW9uLT5lbmNyeXB0aW9uVHlwZVtpXTsKKworICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemluZyB3aXRoIEZBTFNFIGFzIGl0IGhhcyBUUlVFIHZhbHVlIGFscmVhZHkgKi8KKyAgICAgICAgICAgIGZBY2NlcHRhYmxlQ3lwaGVycyA9IEZBTFNFOworICAgICAgICAgICAgZm9yIChpID0gMCA7IGkgPCBwQXV0aFR5cGUtPm51bUVudHJpZXM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vQ2lwaGVycyBhcmUgc3VwcG9ydGVkLCBNYXRjaCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gYW5kIHBpY2sgZmlyc3QgbWF0Y2hpbmcgYXV0aHR5cGUuCisgICAgICAgICAgICAgICAgaWYgKCBjc3JJc0F1dGhXcGEoIHBNYWMsIHBXcGFJZS0+YXV0aF9zdWl0ZXMsIGNBdXRoU3VpdGVzLCBBdXRoZW50aWNhdGlvbiApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlQ1NSX0FVVEhfVFlQRV9XUEEgPT0gcEF1dGhUeXBlLT5hdXRoVHlwZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgbmVnQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9XUEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggKG5lZ0F1dGhUeXBlID09IGVDU1JfQVVUSF9UWVBFX1VOS05PV04pICYmIGNzcklzQXV0aFdwYVBzayggcE1hYywgcFdwYUllLT5hdXRoX3N1aXRlcywgY0F1dGhTdWl0ZXMsIEF1dGhlbnRpY2F0aW9uICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVDU1JfQVVUSF9UWVBFX1dQQV9QU0sgPT0gcEF1dGhUeXBlLT5hdXRoVHlwZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgbmVnQXV0aFR5cGUgPSBlQ1NSX0FVVEhfVFlQRV9XUEFfUFNLOworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgICAgICAgICAgICAgaWYgKCAobmVnQXV0aFR5cGUgPT0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTikgJiYgY3NySXNDY3hDY2ttQXV0aFdwYSggcE1hYywgcFdwYUllLT5hdXRoX3N1aXRlcywgY0F1dGhTdWl0ZXMsIEF1dGhlbnRpY2F0aW9uICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVDU1JfQVVUSF9UWVBFX0NDS01fV1BBID09IHBBdXRoVHlwZS0+YXV0aFR5cGVbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICBuZWdBdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX0NDS01fV1BBOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fQ0NYICovCisKKyAgICAgICAgICAgICAgICAvLyBUaGUgMXN0IGF1dGggdHlwZSBpbiB0aGUgQVBzIFdQQSBJRSwgdG8gbWF0Y2ggc3RhdGlvbnMgY29ubmVjdGluZworICAgICAgICAgICAgICAgIC8vIHByb2ZpbGVzIGF1dGggdHlwZSB3aWxsIGNhdXNlIHVzIHRvIGV4aXQgdGhpcyBsb29wCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhZGRlZCBhcyBzb21lIEFQcyBhZHZlcnRpc2UgbXVsdGlwbGUgYWttcyBpbiB0aGUgV1BBIElFLgorICAgICAgICAgICAgICAgIGlmIChlQ1NSX0FVVEhfVFlQRV9VTktOT1dOICE9IG5lZ0F1dGhUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZBY2NlcHRhYmxlQ3lwaGVycyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBmb3IKKyAgICAgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisKKyAgICBpZiAoIGZBY2NlcHRhYmxlQ3lwaGVycyApCisgICAgeworICAgICAgICBpZiAoIE11bHRpY2FzdEN5cGhlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICoqKU11bHRpY2FzdEN5cGhlciwgTXVsdGljYXN0LCBDU1JfV1BBX09VSV9TSVpFICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIFVuaWNhc3RDeXBoZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAodEFOSV9VOCAqKilVbmljYXN0Q3lwaGVyLCBVbmljYXN0LCBDU1JfV1BBX09VSV9TSVpFICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIEF1dGhTdWl0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICoqKUF1dGhTdWl0ZSwgQXV0aGVudGljYXRpb24sIENTUl9XUEFfT1VJX1NJWkUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBwTmVnb3RpYXRlZEF1dGh0eXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgKnBOZWdvdGlhdGVkQXV0aHR5cGUgPSBuZWdBdXRoVHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiggZkFjY2VwdGFibGVDeXBoZXJzICk7Cit9CisKKworCit0QU5JX0JPT0xFQU4gY3NySXNXcGFFbmNyeXB0aW9uTWF0Y2goIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JBdXRoTGlzdCAqcEF1dGhUeXBlLCBlQ3NyRW5jcnlwdGlvblR5cGUgZW5UeXBlLCB0Q3NyRW5jcnlwdGlvbkxpc3QgKnBFbk1jVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLCBlQ3NyQXV0aFR5cGUgKnBOZWdvdGlhdGVkQXV0aHR5cGUsIGVDc3JFbmNyeXB0aW9uVHlwZSAqcE5lZ290aWF0ZWRNQ0NpcGhlciApCit7CisgICAgdEFOSV9CT09MRUFOIGZXcGFNYXRjaCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKworICAgICAgICAvLyBTZWUgaWYgdGhlIGN5cGhlcnMgaW4gdGhlIEJzcyBkZXNjcmlwdGlvbiBtYXRjaCB3aXRoIHRoZSBzZXR0aW5ncyBpbiB0aGUgcHJvZmlsZS4KKyAgICBmV3BhTWF0Y2ggPSBjc3JHZXRXcGFDeXBoZXJzKCBwTWFjLCBwQXV0aFR5cGUsIGVuVHlwZSwgcEVuTWNUeXBlLCAmcEllcy0+V1BBLCBOVUxMLCBOVUxMLCBOVUxMLCBwTmVnb3RpYXRlZEF1dGh0eXBlLCBwTmVnb3RpYXRlZE1DQ2lwaGVyICk7CisKKyAgICByZXR1cm4oIGZXcGFNYXRjaCApOworfQorCisKK3RBTklfVTggY3NyQ29uc3RydWN0V3BhSWUoIHRIYWxIYW5kbGUgaEhhbCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0Q3NyV3BhSWUgKnBXcGFJZSApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdEFOSV9CT09MRUFOIGZXcGFNYXRjaDsKKyAgICB0QU5JX1U4IGNiV3BhSWUgPSAwOworICAgIHRBTklfVTggVW5pY2FzdEN5cGhlclsgQ1NSX1dQQV9PVUlfU0laRSBdOworICAgIHRBTklfVTggTXVsdGljYXN0Q3lwaGVyWyBDU1JfV1BBX09VSV9TSVpFIF07CisgICAgdEFOSV9VOCBBdXRoU3VpdGVbIENTUl9XUEFfT1VJX1NJWkUgXTsKKyAgICB0Q3NyV3BhQXV0aEllICpwQXV0aFN1aXRlOworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXNMb2NhbCA9IHBJZXM7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYgKCAhY3NySXNQcm9maWxlV3BhKCBwUHJvZmlsZSApICkgYnJlYWs7CisKKyAgICAgICAgaWYoICFwSWVzTG9jYWwgJiYgKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgcFNpckJzc0Rlc2MsICZwSWVzTG9jYWwpKSkgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBTZWUgaWYgdGhlIGN5cGhlcnMgaW4gdGhlIEJzcyBkZXNjcmlwdGlvbiBtYXRjaCB3aXRoIHRoZSBzZXR0aW5ncyBpbiB0aGUgcHJvZmlsZS4KKyAgICAgICAgZldwYU1hdGNoID0gY3NyR2V0V3BhQ3lwaGVycyggaEhhbCwgJnBQcm9maWxlLT5BdXRoVHlwZSwgcFByb2ZpbGUtPm5lZ290aWF0ZWRVQ0VuY3J5cHRpb25UeXBlLCAmcFByb2ZpbGUtPm1jRW5jcnlwdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSWVzTG9jYWwtPldQQSwgVW5pY2FzdEN5cGhlciwgTXVsdGljYXN0Q3lwaGVyLCBBdXRoU3VpdGUsIE5VTEwsIE5VTEwgKTsKKyAgICAgICAgaWYgKCAhZldwYU1hdGNoICkgYnJlYWs7CisKKyAgICAgICAgcFdwYUllLT5JZUhlYWRlci5FbGVtZW50SUQgPSBTSVJfTUFDX1dQQV9FSUQ7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFdwYUllLT5PdWksIGNzcldwYU91aVswMV0sIHNpemVvZiggcFdwYUllLT5PdWkgKSApOworCisgICAgICAgIHBXcGFJZS0+VmVyc2lvbiA9IENTUl9XUEFfVkVSU0lPTl9TVVBQT1JURUQ7CisKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcFdwYUllLT5NdWx0aWNhc3RPdWksIE11bHRpY2FzdEN5cGhlciwgc2l6ZW9mKCBNdWx0aWNhc3RDeXBoZXIgKSApOworCisgICAgICAgIHBXcGFJZS0+Y1VuaWNhc3RDeXBoZXJzID0gMTsKKworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAmcFdwYUllLT5VbmljYXN0T3VpWyAwIF0sIFVuaWNhc3RDeXBoZXIsIHNpemVvZiggVW5pY2FzdEN5cGhlciApICk7CisKKyAgICAgICAgcEF1dGhTdWl0ZSA9ICh0Q3NyV3BhQXV0aEllICopKCAmcFdwYUllLT5VbmljYXN0T3VpWyBwV3BhSWUtPmNVbmljYXN0Q3lwaGVycyBdICk7CisKKyAgICAgICAgcEF1dGhTdWl0ZS0+Y0F1dGhlbnRpY2F0aW9uU3VpdGVzID0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgJnBBdXRoU3VpdGUtPkF1dGhPdWlbIDAgXSwgQXV0aFN1aXRlLCBzaXplb2YoIEF1dGhTdWl0ZSApICk7CisKKyAgICAgICAgLy8gVGhlIFdQQSBjYXBhYmlsaXRpZXMgZm9sbG93cyB0aGUgQXV0aCBTdWl0ZSAodHdvIG9jdGVjdHMpLS0KKyAgICAgICAgLy8gdGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYW5kIHdlIGFsd2F5cyAic2VuZCIgemVybywgc28ganVzdAorICAgICAgICAvLyByZW1vdmUgaXQuICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBvdXIgYXNzdW1wdGlvbnMgaW4gdGhlCisgICAgICAgIC8vIGZyYW1lcyBjb21waWxlcjsgYy5mLiBidWcgMTUyMzQ6CisgICAgICAgIC8vIGh0dHA6Ly9nb2xkLndvb2RzaWRlbmV0LmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTUyMzQKKworICAgICAgICAvLyBBZGQgaW4gdGhlIGZpeGVkIGZpZWxkcyBwbHVzIDEgVW5pY2FzdCBjeXBoZXIsIGxlc3MgdGhlIElFIEhlYWRlciBsZW5ndGgKKyAgICAgICAgLy8gQWRkIGluIHRoZSBzaXplIG9mIHRoZSBBdXRoIHN1aXRlIChjb3VudCBwbHVzIGEgc2luZ2xlIE9VSSkKKyAgICAgICAgcFdwYUllLT5JZUhlYWRlci5MZW5ndGggPSBzaXplb2YoICpwV3BhSWUgKSAtIHNpemVvZiAoIHBXcGFJZS0+SWVIZWFkZXIgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCAqcEF1dGhTdWl0ZSApOworCisgICAgICAgIC8vIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgSUUgaGVhZGVyICh0b3RhbCkgY29uc3RydWN0ZWQuLi4KKyAgICAgICAgY2JXcGFJZSA9IHBXcGFJZS0+SWVIZWFkZXIuTGVuZ3RoICsgc2l6ZW9mKCBwV3BhSWUtPkllSGVhZGVyICk7CisKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICBpZiggIXBJZXMgJiYgcEllc0xvY2FsICkKKyAgICB7CisgICAgICAgIC8vbG9jYWxseSBhbGxvY2F0ZWQKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwSWVzTG9jYWwpOworICAgIH0KKworICAgIHJldHVybiggY2JXcGFJZSApOworfQorCisKK3RBTklfQk9PTEVBTiBjc3JHZXRXcGFSc25JZSggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4ICpwSWVzLCB0QU5JX1UzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBXcGFJZSwgdEFOSV9VOCAqcGNiV3BhSWUsIHRBTklfVTggKnBSU05JZSwgdEFOSV9VOCAqcGNiUlNOSWUpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdERvdDExSUVIZWFkZXIgKnBJRUhlYWRlcjsKKyAgICB0U2lyTWFjUHJvcElFICpwU2lyTWFjUHJvcElFOworICAgIHRBTklfVTMyIGNiUGFyc2VkOworICAgIHRBTklfVTMyIGNiSUU7CisgICAgaW50IGNFeHBlY3RlZElFcyA9IDA7CisgICAgaW50IGNGb3VuZElFcyA9IDA7CisgICAgaW50IGNiUHJvcElFVG90YWw7CisKKyAgICBwSUVIZWFkZXIgPSAodERvdDExSUVIZWFkZXIgKilwSWVzOworICAgIGlmKHBXcGFJZSkgY0V4cGVjdGVkSUVzKys7CisgICAgaWYocFJTTkllKSBjRXhwZWN0ZWRJRXMrKzsKKworICAgIC8vIGJzcyBkZXNjcmlwdGlvbiBsZW5ndGggaW5jbHVkZXMgYWxsIGZpZWxkcyBvdGhlciB0aGFuIHRoZSBsZW5ndGggaXRzZWxmCisgICAgY2JQYXJzZWQgID0gMDsKKworICAgIC8vIExvb3AgYXMgbG9uZyBhcyB0aGVyZSBpcyBkYXRhIGxlZnQgaW4gdGhlIElFIG9mIHRoZSBCc3MgRGVzY3JpcHRpb24KKyAgICAvLyBhbmQgdGhlIG51bWJlciBvZiBFeHBlY3RlZCBJRXMgaXMgTk9UIGZvdW5kIHlldC4KKyAgICB3aGlsZSggKCAoY2JQYXJzZWQgKyBzaXplb2YoICpwSUVIZWFkZXIgKSkgPD0gbGVuICkgJiYgKCBjRm91bmRJRXMgPCBjRXhwZWN0ZWRJRXMgICkgKQorICAgIHsKKyAgICAgICAgY2JJRSA9IHNpemVvZiggKnBJRUhlYWRlciApICsgcElFSGVhZGVyLT5MZW5ndGg7CisKKyAgICAgICAgaWYgKCAoIGNiSUUgKyBjYlBhcnNlZCApID4gbGVuICkgYnJlYWs7CisKKyAgICAgICAgaWYgKCAoIHBJRUhlYWRlci0+TGVuZ3RoID49IGdDc3JJRUxlbmd0aFRhYmxlWyBwSUVIZWFkZXItPkVsZW1lbnRJRCBdLm1pbiApICYmCisgICAgICAgICAgICAgKCBwSUVIZWFkZXItPkxlbmd0aCA8PSBnQ3NySUVMZW5ndGhUYWJsZVsgcElFSGVhZGVyLT5FbGVtZW50SUQgXS5tYXggKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCggcElFSGVhZGVyLT5FbGVtZW50SUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSAyMjEgKDB4ZGQpIFByb3ByaWV0YXJ5IElFcyBoZXJlLi4uCisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSAyMjEgSUUgaXMgb3ZlcmxvYWRlZCwgY29udGFpbmluZyB0aGUgV1BBIElFLCBXTU0vV01FIElFLCBhbmQgdGhlCisgICAgICAgICAgICAgICAgLy8gQWlyZ28gcHJvcHJpZXRhcnkgSUUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgY2FzZSBTSVJfTUFDX1dQQV9FSUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBhbmlPVUk7CisgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBPdWkgPSAodEFOSV9VOCAqKSZhbmlPVUk7CisKKyAgICAgICAgICAgICAgICAgICAgcE91aSsrOworICAgICAgICAgICAgICAgICAgICBhbmlPVUkgPSBBTklfT1VJOworICAgICAgICAgICAgICAgICAgICBhbmlPVUkgPSBpX250b2hsKCBhbmlPVUkgKTsKKworICAgICAgICAgICAgICAgICAgICBwU2lyTWFjUHJvcElFID0gKCB0U2lyTWFjUHJvcElFICopcElFSGVhZGVyOworICAgICAgICAgICAgICAgICAgICBjYlByb3BJRVRvdGFsID0gcFNpck1hY1Byb3BJRS0+bGVuZ3RoOworCisgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBBTkkgT1VJIGlzIGluIHRoZSBPVUkgZmllbGQgaW4gdGhlIHByb3ByaWV0YXJ5IElFLi4uCisgICAgICAgICAgICAgICAgICAgIGlmICggKCBwU2lyTWFjUHJvcElFLT5sZW5ndGggPj0gV05JX0NGR19NQU5VRkFDVFVSRVJfT1VJX0xFTiApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdWlbIDAgXSA9PSBwU2lyTWFjUHJvcElFLT5vdWlbIDAgXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICBwT3VpWyAxIF0gPT0gcFNpck1hY1Byb3BJRS0+b3VpWyAxIF0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcE91aVsgMiBdID09IHBTaXJNYWNQcm9wSUUtPm91aVsgMiBdICApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JXcGFJZSAgICAgKnBJZSAgICAgICAgPSAoIHRDc3JXcGFJZSAqICAgIClwSUVIZWFkZXI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwV3BhSWUgfHwgIXBjYldwYUllKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBXUEEgSUUuICBUaGVuIGNoZWNrIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXUEEgT1VJIGlzIGluIHBsYWNlIGFuZCB0aGUgdmVyc2lvbiBpcyBvbmUgdGhhdCB3ZSBzdXBwb3J0LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIHBJZS0+SWVIZWFkZXIuTGVuZ3RoID49IFNJUl9NQUNfV1BBX0lFX01JTl9MRU5HVEggKSAgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgcEllLT5PdWksICh2b2lkICopY3NyV3BhT3VpWzFdLCBzaXplb2YoIHBJZS0+T3VpICkgKSApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggcEllLT5WZXJzaW9uIDw9IENTUl9XUEFfVkVSU0lPTl9TVVBQT1JURUQgKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwV3BhSWUsIHBJZSwgcEllLT5JZUhlYWRlci5MZW5ndGggKyBzaXplb2YoIHBJZS0+SWVIZWFkZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwY2JXcGFJZSA9IHBJZS0+SWVIZWFkZXIuTGVuZ3RoICsgc2l6ZW9mKCBwSWUtPkllSGVhZGVyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY0ZvdW5kSUVzKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgU0lSX01BQ19SU05fRUlEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdENzclJTTkllICpwSWU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIXBjYlJTTkllIHx8ICFwUlNOSWUpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBwSWUgPSAodENzclJTTkllICopcElFSGVhZGVyOworCisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBsZW5ndGggb2YgdGhlIFJTTiBJZSB0byBhc3N1cmUgaXQgaXMgdmFsaWQuICBUaGVuIGNoZWNrIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gaXMgb25lIHRoYXQgd2Ugc3VwcG9ydC4KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHBJZS0+SWVIZWFkZXIuTGVuZ3RoIDwgU0lSX01BQ19SU05fSUVfTUlOX0xFTkdUSCApIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoIHBJZS0+VmVyc2lvbiA+IENTUl9SU05fVkVSU0lPTl9TVVBQT1JURUQgKSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjRm91bmRJRXMrKzsKKworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiB0aGUgV3BhSUUgcGFzc2VkIGluLCB0aGVuIGNvcHkgdGhlIFdwYSBJRSBpbnRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBidWZmZXIgcGFzc2VkIGluLgorICAgICAgICAgICAgICAgICAgICBpZiAoICpwY2JSU05JZSA8IHBJZS0+SWVIZWFkZXIuTGVuZ3RoICsgc2l6ZW9mKCBwSWUtPkllSGVhZGVyICkgKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwUlNOSWUsIHBJZSwgcEllLT5JZUhlYWRlci5MZW5ndGggKyBzaXplb2YoIHBJZS0+SWVIZWFkZXIgKSApOworICAgICAgICAgICAgICAgICAgICAqcGNiUlNOSWUgPSBwSWUtPkllSGVhZGVyLkxlbmd0aCArIHNpemVvZiggcEllLT5JZUhlYWRlciApOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFkZCBzdXBwb3J0IGZvciBvdGhlciBJRSBoZXJlLi4uCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjYlBhcnNlZCArPSBjYklFOworCisgICAgICAgIHBJRUhlYWRlciA9ICh0RG90MTFJRUhlYWRlciAqKSggKCh0QU5JX1U4ICopcElFSGVhZGVyKSArIGNiSUUgKTsKKworICAgIH0KKworICAgIC8vIHJldHVybiBhIEJPT0wgdGhhdCB0ZWxscyBpZiBhbGwgb2YgdGhlIElFcyBhc2tlZCBmb3Igd2VyZSBmb3VuZC4uLgorICAgIHJldHVybiggY0ZvdW5kSUVzID09IGNFeHBlY3RlZElFcyApOworfQorCisKKy8vSWYgYSBXUEFJRSBleGlzdHMgaW4gdGhlIHByb2ZpbGUsIGp1c3QgdXNlIGl0LiBPciBlbHNlIGNvbnN0cnVjdCBvbmUgZnJvbSB0aGUgQlNTCisvL0NhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IGZvciBwV3BhSWUgYW5kIGd1YXJyYW50ZWUgaXQgY2FuIGNvbnRhaW4gYSBtYXggbGVuZ3RoIFdQQSBJRQordEFOSV9VOCBjc3JSZXRyaWV2ZVdwYUllKCB0SGFsSGFuZGxlIGhIYWwsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0Q3NyV3BhSWUgKnBXcGFJZSApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdEFOSV9VOCBjYldwYUllID0gMDsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiAoICFjc3JJc1Byb2ZpbGVXcGEoIHBQcm9maWxlICkgKSBicmVhazsKKyAgICAgICAgaWYocFByb2ZpbGUtPm5XUEFSZXFJRUxlbmd0aCAmJiBwUHJvZmlsZS0+cFdQQVJlcUlFKQorICAgICAgICB7CisgICAgICAgICAgICBpZihTSVJfTUFDX1dQQV9JRV9NQVhfTEVOR1RIID49IHBQcm9maWxlLT5uV1BBUmVxSUVMZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2JXcGFJZSA9ICh0QU5JX1U4KXBQcm9maWxlLT5uV1BBUmVxSUVMZW5ndGg7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwV3BhSWUsIHBQcm9maWxlLT5wV1BBUmVxSUUsIGNiV3BhSWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiICBjc3JSZXRyaWV2ZVdwYUllIGRldGVjdCBpbnZhbGlkIFdQQSBJRSBsZW5ndGggKCVkKSBcbiIsIHBQcm9maWxlLT5uV1BBUmVxSUVMZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY2JXcGFJZSA9IGNzckNvbnN0cnVjdFdwYUllKHBNYWMsIHBQcm9maWxlLCBwU2lyQnNzRGVzYywgcEllcywgcFdwYUllKTsKKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKworICAgIHJldHVybiAoY2JXcGFJZSk7Cit9CisKKworLy9JZiBhIFJTTklFIGV4aXN0cyBpbiB0aGUgcHJvZmlsZSwganVzdCB1c2UgaXQuIE9yIGVsc2UgY29uc3RydWN0IG9uZSBmcm9tIHRoZSBCU1MKKy8vQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBXcGFJZSBhbmQgZ3VhcnJhbnRlZSBpdCBjYW4gY29udGFpbiBhIG1heCBsZW5ndGggV1BBIElFCit0QU5JX1U4IGNzclJldHJpZXZlUnNuSWUoIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzLCB0Q3NyUlNOSWUgKnBSc25JZSApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdEFOSV9VOCBjYlJzbkllID0gMDsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiAoICFjc3JJc1Byb2ZpbGVSU04oIHBQcm9maWxlICkgKSBicmVhazsKKyAgICAgICAgaWYocFByb2ZpbGUtPm5SU05SZXFJRUxlbmd0aCAmJiBwUHJvZmlsZS0+cFJTTlJlcUlFKQorICAgICAgICB7CisgICAgICAgICAgICBpZihTSVJfTUFDX1dQQV9JRV9NQVhfTEVOR1RIID49IHBQcm9maWxlLT5uUlNOUmVxSUVMZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2JSc25JZSA9ICh0QU5JX1U4KXBQcm9maWxlLT5uUlNOUmVxSUVMZW5ndGg7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwUnNuSWUsIHBQcm9maWxlLT5wUlNOUmVxSUUsIGNiUnNuSWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiICBjc3JSZXRyaWV2ZVJzbkllIGRldGVjdCBpbnZhbGlkIFJTTiBJRSBsZW5ndGggKCVkKSBcbiIsIHBQcm9maWxlLT5uUlNOUmVxSUVMZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY2JSc25JZSA9IGNzckNvbnN0cnVjdFJTTkllKHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUsIHBTaXJCc3NEZXNjLCBwSWVzLCBwUnNuSWUpOworICAgICAgICB9CisgICAgfXdoaWxlKDApOworCisgICAgcmV0dXJuIChjYlJzbkllKTsKK30KKworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKy8vSWYgYSBXQVBJIElFIGV4aXN0cyBpbiB0aGUgcHJvZmlsZSwganVzdCB1c2UgaXQuIE9yIGVsc2UgY29uc3RydWN0IG9uZSBmcm9tIHRoZSBCU1MKKy8vQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBXYXBpSWUgYW5kIGd1YXJyYW50ZWUgaXQgY2FuIGNvbnRhaW4gYSBtYXggbGVuZ3RoIFdBUEkgSUUKK3RBTklfVTggY3NyUmV0cmlldmVXYXBpSWUoIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgc2Vzc2lvbklkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMsIHRDc3JXYXBpSWUgKnBXYXBpSWUgKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHRBTklfVTggY2JXYXBpSWUgPSAwOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGlmICggIWNzcklzUHJvZmlsZVdhcGkoIHBQcm9maWxlICkgKSBicmVhazsKKyAgICAgICAgaWYocFByb2ZpbGUtPm5XQVBJUmVxSUVMZW5ndGggJiYgcFByb2ZpbGUtPnBXQVBJUmVxSUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKERPVDExRl9JRV9XQVBJX01BWF9MRU4gPj0gcFByb2ZpbGUtPm5XQVBJUmVxSUVMZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2JXYXBpSWUgPSAodEFOSV9VOClwUHJvZmlsZS0+bldBUElSZXFJRUxlbmd0aDsKKyAgICAgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBXYXBpSWUsIHBQcm9maWxlLT5wV0FQSVJlcUlFLCBjYldhcGlJZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICIgIGNzclJldHJpZXZlV2FwaUllIGRldGVjdCBpbnZhbGlkIFdBUEkgSUUgbGVuZ3RoICglZCkgXG4iLCBwUHJvZmlsZS0+bldBUElSZXFJRUxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjYldhcGlJZSA9IGNzckNvbnN0cnVjdFdhcGlJZShwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCBwU2lyQnNzRGVzYywgcEllcywgcFdhcGlJZSk7CisgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisKKyAgICByZXR1cm4gKGNiV2FwaUllKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCit0QU5JX0JPT0xFQU4gY3NyU2VhcmNoQ2hhbm5lbExpc3RGb3JUeFBvd2VyKHRIYWxIYW5kbGUgaEhhbCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzY3JpcHRpb24sIHRDc3JDaGFubmVsU2V0ICpyZXR1cm5DaGFubmVsR3JvdXApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdEFOSV9VMTYgaTsKKyAgICB0QU5JX1UxNiBzdGFydGluZ0NoYW5uZWw7CisgICAgdEFOSV9CT09MRUFOIGZvdW5kID0gRkFMU0U7CisgICAgdENzckNoYW5uZWxTZXQgKnBDaGFubmVsR3JvdXA7CisKKyAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+cm9hbS5jaGFubmVsTGlzdDVHLCBMTF9BQ0NFU1NfTE9DSyApOworCisgICAgd2hpbGUgKCBwRW50cnkgKQorICAgIHsKKyAgICAgICAgcENoYW5uZWxHcm91cCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdENzckNoYW5uZWxTZXQsIGNoYW5uZWxMaXN0TGluayApOworICAgICAgICBzdGFydGluZ0NoYW5uZWwgPSBwQ2hhbm5lbEdyb3VwLT5maXJzdENoYW5uZWw7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcENoYW5uZWxHcm91cC0+bnVtQ2hhbm5lbHM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhcnRpbmdDaGFubmVsICsgaSAqIHBDaGFubmVsR3JvdXAtPmludGVyQ2hhbm5lbE9mZnNldCA9PSBwQnNzRGVzY3JpcHRpb24tPmNoYW5uZWxJZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBmb3VuZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcmV0dXJuQ2hhbm5lbEdyb3VwLCBwQ2hhbm5lbEdyb3VwLCBzaXplb2YodENzckNoYW5uZWxTZXQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCAmcE1hYy0+cm9hbS5jaGFubmVsTGlzdDVHLCBwRW50cnksIExMX0FDQ0VTU19MT0NLICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oIGZvdW5kICk7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JSYXRlc0lzRG90MTFSYXRlMTFiU3VwcG9ydGVkUmF0ZSggdEFOSV9VOCBkb3QxMVJhdGUgKQoreworICAgIHRBTklfQk9PTEVBTiBmU3VwcG9ydGVkID0gRkFMU0U7CisgICAgdEFOSV9VMTYgbm9uQmFzaWNSYXRlID0gKHRBTklfVTE2KSggQklUU19PRkYoIGRvdDExUmF0ZSwgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSyApICk7CisKKyAgICBzd2l0Y2ggKCBub25CYXNpY1JhdGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMU1icHM6CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzJNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV81XzVNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8xMU1icHM6CisgICAgICAgICAgICBmU3VwcG9ydGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4oIGZTdXBwb3J0ZWQgKTsKK30KKwordEFOSV9CT09MRUFOIGNzclJhdGVzSXNEb3QxMVJhdGUxMWFTdXBwb3J0ZWRSYXRlKCB0QU5JX1U4IGRvdDExUmF0ZSApCit7CisgICAgdEFOSV9CT09MRUFOIGZTdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICB0QU5JX1UxNiBub25CYXNpY1JhdGUgPSAodEFOSV9VMTYpKCBCSVRTX09GRiggZG90MTFSYXRlLCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLICkgKTsKKworICAgIHN3aXRjaCAoIG5vbkJhc2ljUmF0ZSApCisgICAgeworICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV82TWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfOU1icHM6CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzEyTWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMThNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8yNE1icHM6CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzM2TWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNDhNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV81NE1icHM6CisgICAgICAgICAgICBmU3VwcG9ydGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4oIGZTdXBwb3J0ZWQgKTsKK30KKworCisKK3RBbmlFZFR5cGUgY3NyVHJhbnNsYXRlRW5jcnlwdFR5cGVUb0VkVHlwZSggZUNzckVuY3J5cHRpb25UeXBlIEVuY3J5cHRUeXBlICkKK3sKKyAgICB0QW5pRWRUeXBlIGVkVHlwZTsKKworICAgIHN3aXRjaCAoIEVuY3J5cHRUeXBlICkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfTk9ORToKKyAgICAgICAgICAgIGVkVHlwZSA9IGVTSVJfRURfTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOgorICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwOgorICAgICAgICAgICAgZWRUeXBlID0gZVNJUl9FRF9XRVA0MDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0X1NUQVRJQ0tFWToKKyAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ6CisgICAgICAgICAgICBlZFR5cGUgPSBlU0lSX0VEX1dFUDEwNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDoKKyAgICAgICAgICAgIGVkVHlwZSA9IGVTSVJfRURfVEtJUDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQUVTOgorICAgICAgICAgICAgZWRUeXBlID0gZVNJUl9FRF9DQ01QOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk6CisgICAgICAgICAgICBlZFR5cGUgPSBlU0lSX0VEX1dQSTsKKyNlbmRpZgorI2lmZGVmIFdMQU5fRkVBVFVSRV8xMVcKKyAgICAgICAgLy8xMXcgQklQCisgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQUVTX0NNQUM6CisgICAgICAgICAgICBlZFR5cGUgPSBlU0lSX0VEX0FFU18xMjhfQ01BQzsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuKCBlZFR5cGUgKTsKK30KKworCisvL3BJZXMgY2FuIGJlIE5VTEwKK3RBTklfQk9PTEVBTiBjc3JWYWxpZGF0ZVdlcCggdHBBbmlTaXJHbG9iYWwgcE1hYywgZUNzckVuY3J5cHRpb25UeXBlIHVjRW5jcnlwdGlvblR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyQXV0aExpc3QgKnBBdXRoTGlzdCwgdENzckVuY3J5cHRpb25MaXN0ICpwTUNFbmNyeXB0aW9uTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JBdXRoVHlwZSAqcE5lZ290aWF0ZWRBdXRoVHlwZSwgZUNzckVuY3J5cHRpb25UeXBlICpwTmVnb3RpYXRlZE1DRW5jcnlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcEllcyApCit7CisgICAgdEFOSV9VMzIgaWR4OworICAgIHRBTklfQk9PTEVBTiBmTWF0Y2ggPSBGQUxTRTsKKyAgICBlQ3NyQXV0aFR5cGUgbmVnb3RpYXRlZEF1dGggPSBlQ1NSX0FVVEhfVFlQRV9PUEVOX1NZU1RFTTsKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgbmVnb3RpYXRlZE1DQ2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfVU5LTk9XTjsKKworICAgIC8vVGhpcyBmdW5jdGlvbiBqdXN0IGNoZWNrcyB3aGV0aGVyIEhERCBpcyBnaXZpbmcgY29ycmVjdCB2YWx1ZXMgZm9yIE11bHRpY2FzdCBjaXBoZXIgYW5kIEF1dGguCisgICAgCisgICAgZG8KKyAgICB7CisgICAgICAgIC8vSWYgcHJpdmFjeSBiaXQgaXMgbm90IHNldCwgY29uc2lkZXIgbm8gbWF0Y2gKKyAgICAgICAgaWYgKCAhY3NySXNQcml2YWN5KCBwU2lyQnNzRGVzYyApICkgYnJlYWs7CisKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBwTUNFbmNyeXB0aW9uTGlzdC0+bnVtRW50cmllczsgaWR4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goIHBNQ0VuY3J5cHRpb25MaXN0LT5lbmNyeXB0aW9uVHlwZVtpZHhdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWToKKyAgICAgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk6CisgICAgICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDoKKyAgICAgICAgICAgICAgICAgICAgLyogTXVsdGljYXN0IGxpc3QgbWF5IGNvbnRhaW4gV0VQNDAvV0VQMTA0LiBDaGVjayB3aGV0aGVyIGl0IG1hdGNoZXMgVUMuCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmKCB1Y0VuY3J5cHRpb25UeXBlID09IHBNQ0VuY3J5cHRpb25MaXN0LT5lbmNyeXB0aW9uVHlwZVtpZHhdICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZk1hdGNoID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZ290aWF0ZWRNQ0NpcGhlciA9IHBNQ0VuY3J5cHRpb25MaXN0LT5lbmNyeXB0aW9uVHlwZVtpZHhdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGZNYXRjaCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGZNYXRjaCkgYnJlYWs7IAorICAgICAgICB9CisKKyAgICAgICAgaWYoIWZNYXRjaCkgYnJlYWs7CisKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBwQXV0aExpc3QtPm51bUVudHJpZXM7IGlkeCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKCBwQXV0aExpc3QtPmF1dGhUeXBlW2lkeF0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU06CisgICAgICAgICAgICAgICAgY2FzZSBlQ1NSX0FVVEhfVFlQRV9TSEFSRURfS0VZOgorICAgICAgICAgICAgICAgIGNhc2UgZUNTUl9BVVRIX1RZUEVfQVVUT1NXSVRDSDoKKyAgICAgICAgICAgICAgICAgICAgZk1hdGNoID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgbmVnb3RpYXRlZEF1dGggPSBwQXV0aExpc3QtPmF1dGhUeXBlW2lkeF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGZNYXRjaCA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZNYXRjaCkgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZighZk1hdGNoKSBicmVhazsKKyAgICAgICAgLy9JbiBjYXNlIG9mIFdQQSAvIFdQQTIsIGNoZWNrIHdoZXRoZXIgaXQgc3VwcG9ydHMgV0VQIGFzIHdlbGwKKyAgICAgICAgaWYocEllcykKKyAgICAgICAgeworICAgICAgICAgICAgLy9QcmVwYXJlIHRoZSBlbmNyeXB0aW9uIHR5cGUgZm9yIFdQQS9XUEEyIGZ1bmN0aW9ucworICAgICAgICAgICAgaWYoIGVDU1JfRU5DUllQVF9UWVBFX1dFUDQwX1NUQVRJQ0tFWSA9PSB1Y0VuY3J5cHRpb25UeXBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y0VuY3J5cHRpb25UeXBlID0gZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQgPT0gdWNFbmNyeXB0aW9uVHlwZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNFbmNyeXB0aW9uVHlwZSA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZWxzZSB3ZSBjYW4gdXNlIHRoZSBlbmNyeXB0aW9uIHR5cGUgZGlyZWN0bHkKKyAgICAgICAgICAgIGlmKCBwSWVzLT5XUEEucHJlc2VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZk1hdGNoID0gcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgcEllcy0+V1BBLm11bHRpY2FzdF9jaXBoZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcldwYU91aVtjc3JHZXRPVUlJbmRleEZyb21DaXBoZXIoIHVjRW5jcnlwdGlvblR5cGUgKV0sIENTUl9XUEFfT1VJX1NJWkUgKTsKKyAgICAgICAgICAgICAgICBpZiggZk1hdGNoICkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggcEllcy0+UlNOLnByZXNlbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZNYXRjaCA9IHBhbEVxdWFsTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXMtPlJTTi5ncF9jaXBoZXJfc3VpdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzclJTTk91aVtjc3JHZXRPVUlJbmRleEZyb21DaXBoZXIoIHVjRW5jcnlwdGlvblR5cGUgKV0sIENTUl9SU05fT1VJX1NJWkUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfXdoaWxlKDApOworCisgICAgaWYoIGZNYXRjaCApCisgICAgeworICAgICAgICBpZiggcE5lZ290aWF0ZWRBdXRoVHlwZSApCisgICAgICAgICAgICAqcE5lZ290aWF0ZWRBdXRoVHlwZSA9IG5lZ290aWF0ZWRBdXRoOworCisgICAgICAgIGlmKCBwTmVnb3RpYXRlZE1DRW5jcnlwdGlvbiApCisgICAgICAgICAgICAqcE5lZ290aWF0ZWRNQ0VuY3J5cHRpb24gPSBuZWdvdGlhdGVkTUNDaXBoZXI7CisgICAgfSAgICAKKworCisgICAgcmV0dXJuIGZNYXRjaDsKK30KKworCisvL3BJZXMgc2hhbGwgY29udGFpbiBJRXMgZnJvbSBwU2lyQnNzRGVzYy4gSXQgc2hhbGwgYmUgcmV0dXJuZWQgZnJvbSBmdW5jdGlvbiBjc3JHZXRQYXJzZWRCc3NEZXNjcmlwdGlvbklFcwordEFOSV9CT09MRUFOIGNzcklzU2VjdXJpdHlNYXRjaCggdEhhbEhhbmRsZSBoSGFsLCB0Q3NyQXV0aExpc3QgKmF1dGhUeXBlLCB0Q3NyRW5jcnlwdGlvbkxpc3QgKnBVQ0VuY3J5cHRpb25UeXBlLCB0Q3NyRW5jcnlwdGlvbkxpc3QgKnBNQ0VuY3J5cHRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcEllcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ3NyQXV0aFR5cGUgKm5lZ290aWF0ZWRBdXRodHlwZSwgZUNzckVuY3J5cHRpb25UeXBlICpuZWdvdGlhdGVkVUNDaXBoZXIsIGVDc3JFbmNyeXB0aW9uVHlwZSAqbmVnb3RpYXRlZE1DQ2lwaGVyICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICB0QU5JX0JPT0xFQU4gZk1hdGNoID0gRkFMU0U7CisgICAgdEFOSV9VOCBpLGlkeDsKKyAgICBlQ3NyRW5jcnlwdGlvblR5cGUgbWNDaXBoZXIgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9VTktOT1dOLCB1Y0NpcGhlciA9IGVDU1JfRU5DUllQVF9UWVBFX1VOS05PV047CisgICAgZUNzckF1dGhUeXBlIG5lZ0F1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfVU5LTk9XTjsKKworICAgIGZvciggaSA9IDAgOyAoKGkgPCBwVUNFbmNyeXB0aW9uVHlwZS0+bnVtRW50cmllcykgJiYgKCFmTWF0Y2gpKSA7IGkrKyApCisgICAgeworICAgICAgICB1Y0NpcGhlciA9IHBVQ0VuY3J5cHRpb25UeXBlLT5lbmNyeXB0aW9uVHlwZVtpXTsKKyAgICAgICAgLy8gSWYgdGhlIEJzcyBkZXNjcmlwdGlvbiBzaG93cyB0aGUgUHJpdmFjeSBiaXQgaXMgb24sIHRoZW4gd2UgbXVzdCBoYXZlIHNvbWUgc29ydCBvZiBlbmNyeXB0aW9uIGNvbmZpZ3VyZWQKKyAgICAgICAgLy8gZm9yIHRoZSBwcm9maWxlIHRvIHdvcmsuICBEb24ndCBhdHRlbXB0IHRvIGpvaW4gbmV0d29ya3Mgd2l0aCBQcml2YWN5IGJpdCBzZXQgd2hlbiBwcm9maWxlcyBzYXkgTk9ORSBmb3IKKyAgICAgICAgLy8gZW5jcnlwdGlvbiB0eXBlLgorICAgICAgICBzd2l0Y2ggKCB1Y0NpcGhlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBOTyBlbmNyeXB0aW9uLCBpZiB0aGUgQnNzIGRlc2NyaXB0aW9uIGhhcyB0aGUgUHJpdmFjeSBiaXQgdHVybmVkIG9uLCB0aGVuIGVuY3J5cHRpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQgc28gd2UgaGF2ZSB0byByZWplY3QgdGhpcyBCc3MuCisgICAgICAgICAgICAgICAgICAgIGlmICggY3NySXNQcml2YWN5KCBwU2lyQnNzRGVzYyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZk1hdGNoID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBmTWF0Y2ggKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgTXVsdGljYXN0IGNpcGhlciByZXF1ZXN0ZWQgYW5kIEF1dGggdHlwZSByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGlkeCA9IDAgOyBpZHggPCBwTUNFbmNyeXB0aW9uVHlwZS0+bnVtRW50cmllcyA7IGlkeCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZUNTUl9FTkNSWVBUX1RZUEVfTk9ORSA9PSBwTUNFbmNyeXB0aW9uVHlwZS0+ZW5jcnlwdGlvblR5cGVbaWR4XSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBUUlVFOyAvL011bHRpY2FzdCBjYW4gb25seSBiZSBub25lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY0NpcGhlciA9IHBNQ0VuY3J5cHRpb25UeXBlLT5lbmNyeXB0aW9uVHlwZVtpZHhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZNYXRjaCkgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZNYXRjaCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgLy9DaGVjayBBdXRoIGxpc3QuIEl0IHNob3VsZCBjb250YWluIEF1dGhPcGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpZHggPSAwIDsgaWR4IDwgYXV0aFR5cGUtPm51bUVudHJpZXMgOyBpZHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNID09IGF1dGhUeXBlLT5hdXRoVHlwZVtpZHhdICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk1hdGNoID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdBdXRoVHlwZSA9IGVDU1JfQVVUSF9UWVBFX09QRU5fU1lTVEVNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZNYXRjaCkgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQNDBfU1RBVElDS0VZOgorICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOgorICAgICAgICAgICAgICAgIC8vICEhIG1pZ2h0IHdhbnQgdG8gY2hlY2sgZm9yIFdFUCBrZXlzIHNldCBpbiB0aGUgUHJvZmlsZS4uLi4gPworICAgICAgICAgICAgICAgIC8vICEhIGRvbid0IG5lZWQgdG8gaGF2ZSB0aGUgcHJpdmFjeSBiaXQgaW4gdGhlIEJzcyBkZXNjcmlwdGlvbi4gIE1hbnkgQVAgcG9saWNpZXMgbWFrZSBsZWdhY3kKKyAgICAgICAgICAgICAgICAvLyBlbmNyeXB0aW9uICdvcHRpb25hbCcgc28gd2UgZG9uJ3Qga25vdyBpZiB3ZSBjYW4gYXNzb2NpYXRlIG9yIG5vdC4gIFRoZSBBUCB3aWxsIHJlamVjdCBpZgorICAgICAgICAgICAgICAgIC8vIGVuY3J5cHRpb24gaXMgbm90IGFsbG93ZWQgd2l0aG91dCB0aGUgUHJpdmFjeSBiaXQgdHVybmVkIG9uLgorICAgICAgICAgICAgICAgIGZNYXRjaCA9IGNzclZhbGlkYXRlV2VwKCBwTWFjLCB1Y0NpcGhlciwgYXV0aFR5cGUsIHBNQ0VuY3J5cHRpb25UeXBlLCAmbmVnQXV0aFR5cGUsICZtY0NpcGhlciwgcFNpckJzc0Rlc2MsIHBJZXMpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyB0aGVzZSBhcmUgYWxsIG9mIHRoZSBXUEEgZW5jcnlwdGlvbiB0eXBlcy4uLgorICAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDoKKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0OgorICAgICAgICAgICAgICAgIGZNYXRjaCA9IGNzclZhbGlkYXRlV2VwKCBwTWFjLCB1Y0NpcGhlciwgYXV0aFR5cGUsIHBNQ0VuY3J5cHRpb25UeXBlLCAmbmVnQXV0aFR5cGUsICZtY0NpcGhlciwgcFNpckJzc0Rlc2MsIHBJZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX1RLSVA6CisgICAgICAgICAgICBjYXNlIGVDU1JfRU5DUllQVF9UWVBFX0FFUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHBJZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZXJlIGlzIGEgUlNOIG1hdGNoCisgICAgICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBjc3JJc1JTTk1hdGNoKCBwTWFjLCBhdXRoVHlwZSwgdWNDaXBoZXIsIHBNQ0VuY3J5cHRpb25UeXBlLCBwSWVzLCAmbmVnQXV0aFR5cGUsICZtY0NpcGhlciApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFmTWF0Y2ggKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCBSU04sIHRoZW4gY2hlY2sgaWYgdGhlcmUgaXMgYSBXUEEgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBjc3JJc1dwYUVuY3J5cHRpb25NYXRjaCggcE1hYywgYXV0aFR5cGUsIHVjQ2lwaGVyLCBwTUNFbmNyeXB0aW9uVHlwZSwgcEllcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZWdBdXRoVHlwZSwgJm1jQ2lwaGVyICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICAgICAgICAgY2FzZSBlQ1NSX0VOQ1JZUFRfVFlQRV9XUEk6Ly9XQVBJCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgaWYocEllcykKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGZNYXRjaCA9IGNzcklzV2FwaU1hdGNoKCBoSGFsLCBhdXRoVHlwZSwgdWNDaXBoZXIsIHBNQ0VuY3J5cHRpb25UeXBlLCBwSWVzLCAmbmVnQXV0aFR5cGUsICZtY0NpcGhlciApOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKyAgICAgICAgICAgIGNhc2UgZUNTUl9FTkNSWVBUX1RZUEVfQU5ZOiAKKyAgICAgICAgICAgIGRlZmF1bHQ6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRBTklfQk9PTEVBTiBmTWF0Y2hBbnkgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICAgICAgICAgICAgICBmTWF0Y2ggPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICAvL0l0IGlzIGFsbG93ZWQgdG8gbWF0Y2ggYW55dGhpbmcuIFRyeSB0aGUgbW9yZSBzZWN1cmVkIG9uZXMgZmlyc3QuCisgICAgICAgICAgICAgICAgaWYocEllcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgQUVTIGZpcnN0CisgICAgICAgICAgICAgICAgICAgIHVjQ2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfQUVTOworICAgICAgICAgICAgICAgICAgICBmTWF0Y2hBbnkgPSBjc3JJc1JTTk1hdGNoKCBoSGFsLCBhdXRoVHlwZSwgdWNDaXBoZXIsIHBNQ0VuY3J5cHRpb25UeXBlLCBwSWVzLCAmbmVnQXV0aFR5cGUsICZtY0NpcGhlciApOworICAgICAgICAgICAgICAgICAgICBpZighZk1hdGNoQW55KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIFRLSVAKKyAgICAgICAgICAgICAgICAgICAgICAgIHVjQ2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZNYXRjaEFueSA9IGNzcklzUlNOTWF0Y2goIGhIYWwsIGF1dGhUeXBlLCB1Y0NpcGhlciwgcE1DRW5jcnlwdGlvblR5cGUsIHBJZXMsICZuZWdBdXRoVHlwZSwgJm1jQ2lwaGVyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgICAgICAgICAgICAgICAgICBpZighZk1hdGNoQW55KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIFdBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVjQ2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfV1BJOworICAgICAgICAgICAgICAgICAgICAgICAgZk1hdGNoQW55ID0gY3NySXNXYXBpTWF0Y2goIGhIYWwsIGF1dGhUeXBlLCB1Y0NpcGhlciwgcE1DRW5jcnlwdGlvblR5cGUsIHBJZXMsICZuZWdBdXRoVHlwZSwgJm1jQ2lwaGVyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZighZk1hdGNoQW55KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWNDaXBoZXIgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCFjc3JWYWxpZGF0ZVdlcCggcE1hYywgdWNDaXBoZXIsIGF1dGhUeXBlLCBwTUNFbmNyeXB0aW9uVHlwZSwgJm5lZ0F1dGhUeXBlLCAmbWNDaXBoZXIsIHBTaXJCc3NEZXNjLCBwSWVzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdWNDaXBoZXIgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjc3JWYWxpZGF0ZVdlcCggcE1hYywgdWNDaXBoZXIsIGF1dGhUeXBlLCBwTUNFbmNyeXB0aW9uVHlwZSwgJm5lZ0F1dGhUeXBlLCAmbWNDaXBoZXIsIHBTaXJCc3NEZXNjLCBwSWVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0NpcGhlciA9IGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWNzclZhbGlkYXRlV2VwKCBwTWFjLCB1Y0NpcGhlciwgYXV0aFR5cGUsIHBNQ0VuY3J5cHRpb25UeXBlLCAmbmVnQXV0aFR5cGUsICZtY0NpcGhlciwgcFNpckJzc0Rlc2MsIHBJZXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNDaXBoZXIgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjc3JWYWxpZGF0ZVdlcCggcE1hYywgdWNDaXBoZXIsIGF1dGhUeXBlLCBwTUNFbmNyeXB0aW9uVHlwZSwgJm5lZ0F1dGhUeXBlLCAmbWNDaXBoZXIsIHBTaXJCc3NEZXNjLCBwSWVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JdCBtdXN0IGJlIG9wZW4gYW5kIG5vIGVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY3NySXNQcml2YWN5KCBwU2lyQnNzRGVzYyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoaXMgaXMgbm90IHJpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk1hdGNoID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ0F1dGhUeXBlID0gZUNTUl9BVVRIX1RZUEVfT1BFTl9TWVNURU07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNDaXBoZXIgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQ2lwaGVyID0gZUNTUl9FTkNSWVBUX1RZUEVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYoIGZNYXRjaCApIAorICAgIHsKKyAgICAgICAgaWYoIG5lZ290aWF0ZWRVQ0NpcGhlciApCisgICAgICAgICAgICAqbmVnb3RpYXRlZFVDQ2lwaGVyID0gdWNDaXBoZXI7CisgICAKKyAgICAgICAgaWYoIG5lZ290aWF0ZWRNQ0NpcGhlciApCisgICAgICAgICAgICAqbmVnb3RpYXRlZE1DQ2lwaGVyID0gbWNDaXBoZXI7CisgICAKKyAgICAgICAgaWYoIG5lZ290aWF0ZWRBdXRodHlwZSApCisgICAgICAgICAgICAqbmVnb3RpYXRlZEF1dGh0eXBlID0gbmVnQXV0aFR5cGU7CisgICAgfQorCisgICAgcmV0dXJuKCBmTWF0Y2ggKTsKK30KKworCit0QU5JX0JPT0xFQU4gY3NySXNTc2lkTWF0Y2goIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnNzaWQxLCB0QU5JX1U4IHNzaWQxTGVuLCB0QU5JX1U4ICpic3NTc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggYnNzU3NpZExlbiwgdEFOSV9CT09MRUFOIGZTc2lkUmVxdWlyZWQgKQoreworICAgIHRBTklfQk9PTEVBTiBmTWF0Y2ggPSBGQUxTRTsKKworICAgIGRvIHsKKworICAgICAgICAvLyBUaGVyZSBhcmUgYSBmZXcgc3BlY2lhbCBjYXNlcy4gIElmIHRoZSBCc3MgZGVzY3JpcHRpb24gaGFzIGEgQnJvYWRjYXN0IFNTSUQsCisgICAgICAgIC8vIHRoZW4gb3VyIFByb2ZpbGUgbXVzdCBoYXZlIGEgc2luZ2xlIFNTSUQgd2l0aG91dCBXaWxkY2FyZHMgc28gd2UgY2FuIHByb2dyYW0KKyAgICAgICAgLy8gdGhlIFNTSUQuCisgICAgICAgIC8vIFNTSUQgY291bGQgYmUgc3VwcHJlc3NlZCBpbiBiZWFjb25zLiBJbiB0aGF0IGNhc2UgU1NJRCBJRSBoYXMgdmFsaWQgbGVuZ3RoCisgICAgICAgIC8vIGJ1dCB0aGUgU1NJRCB2YWx1ZSBpcyBhbGwgTlVMTCBjaGFyYWN0ZXJzLiBUaGF0IGNvbmRpdGlvbiBpcyB0cmF0ZWQgc2FtZQorICAgICAgICAvLyBhcyBOVUxMIFNTSUQKKyAgICAgICAgaWYgKCBjc3JJc05VTExTU0lEKCBic3NTc2lkLCBic3NTc2lkTGVuICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGVBTklfQk9PTEVBTl9GQUxTRSA9PSBmU3NpZFJlcXVpcmVkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmTWF0Y2ggPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBmb3IgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIEJyb2FkY2FzdCBTU0lEIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuCisgICAgICAgIC8vIElmIHNwZWNpZmllZCwgdGhlbiBhbGwgU1NJRHMgYXJlIG1hdGNoZXMgKGJyb2FkY2FzdCBTU0lEIG1lYW5zIGFjY2VwdCBhbGwgU1NJRHMpLgorICAgICAgICBpZiAoIHNzaWQxTGVuID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmTWF0Y2ggPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZihzc2lkMUxlbiAhPSBic3NTc2lkTGVuKSBicmVhazsKKyAgICAgICAgaWYocGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgYnNzU3NpZCwgc3NpZDEsIGJzc1NzaWRMZW4pKQorICAgICAgICB7CisgICAgICAgICAgICBmTWF0Y2ggPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0gd2hpbGUoIDAgKTsKKworICAgIHJldHVybiggZk1hdGNoICk7Cit9CisKKworLy9OdWxsIHNzaWQgbWVhbnMgbWF0Y2gKK3RBTklfQk9PTEVBTiBjc3JJc1NzaWRJbkxpc3QoIHRIYWxIYW5kbGUgaEhhbCwgdFNpck1hY1NTaWQgKnBTc2lkLCB0Q3NyU1NJRHMgKnBTc2lkTGlzdCApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdEFOSV9CT09MRUFOIGZNYXRjaCA9IEZBTFNFOworICAgIHRBTklfVTMyIGk7CisKKyAgICBpZiAoIHBTc2lkTGlzdCAmJiBwU3NpZCApCisgICAgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCBwU3NpZExpc3QtPm51bU9mU1NJRHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3NySXNOVUxMU1NJRChwU3NpZExpc3QtPlNTSURMaXN0W2ldLlNTSUQuc3NJZCwgcFNzaWRMaXN0LT5TU0lETGlzdFtpXS5TU0lELmxlbmd0aCkgfHwKKyAgICAgICAgICAgICAgICAoKHBTc2lkTGlzdC0+U1NJRExpc3RbaV0uU1NJRC5sZW5ndGggPT0gcFNzaWQtPmxlbmd0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgcFNzaWQtPnNzSWQsIHBTc2lkTGlzdC0+U1NJRExpc3RbaV0uU1NJRC5zc0lkLCBwU3NpZC0+bGVuZ3RoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZk1hdGNoID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoZk1hdGNoKTsKK30KKworLy9saWtlIHRvIHVzZSBzaXJDb21wYXJlTWFjQWRkcgordEFOSV9CT09MRUFOIGNzcklzTWFjQWRkcmVzc1plcm8oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JCc3NpZCAqcE1hY0FkZHIgKQoreworICAgIHRBTklfVTggYnNzaWRbV05JX0NGR19CU1NJRF9MRU5dID0gezAsIDAsIDAsIDAsIDAsIDB9OworCisgICAgcmV0dXJuKCBwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCBic3NpZCwgcE1hY0FkZHIsIFdOSV9DRkdfQlNTSURfTEVOKSk7Cit9CisKKy8vbGlrZSB0byB1c2Ugc2lyQ29tcGFyZU1hY0FkZHIKK3RBTklfQk9PTEVBTiBjc3JJc01hY0FkZHJlc3NCcm9hZGNhc3QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JCc3NpZCAqcE1hY0FkZHIgKQoreworICAgIHRBTklfVTggYnNzaWRbV05JX0NGR19CU1NJRF9MRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCisgICAgcmV0dXJuKCBwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCBic3NpZCwgcE1hY0FkZHIsIFdOSV9DRkdfQlNTSURfTEVOKSk7Cit9CisKKworLy9saWtlIHRvIHVzZSBzaXJDb21wYXJlTWFjQWRkcgordEFOSV9CT09MRUFOIGNzcklzTWFjQWRkcmVzc0VxdWFsKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQnNzaWQgKnBNYWNBZGRyMSwgdENzckJzc2lkICpwTWFjQWRkcjIgKQoreworICAgIHJldHVybiggcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgcE1hY0FkZHIxLCBwTWFjQWRkcjIsIHNpemVvZih0Q3NyQnNzaWQpKSApOworfQorCisKK3RBTklfQk9PTEVBTiBjc3JJc0Jzc2lkTWF0Y2goIHRIYWxIYW5kbGUgaEhhbCwgdENzckJzc2lkICpwUHJvZkJzc2lkLCB0Q3NyQnNzaWQgKkJzc0Jzc2lkICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZk1hdGNoID0gRkFMU0U7CisgICAgdENzckJzc2lkIFByb2ZpbGVCc3NpZDsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIC8vIGZvciBlZmZpY2llbmN5IG9mIHRoZSBNQUNfQUREUkVTUyBmdW5jdGlvbnMsIG1vdmUgdGhlCisgICAgLy8gQnNzaWQncyBpbnRvIE1BQ19BRERSRVNTIHN0cnVjdHMuCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgJlByb2ZpbGVCc3NpZCwgcFByb2ZCc3NpZCwgc2l6ZW9mKHRDc3JCc3NpZCkgKTsKKworICAgIGRvIHsKKworICAgICAgICAvLyBHaXZlIHRoZSBwcm9maWxlIHRoZSBiZW5lZml0IG9mIHRoZSBkb3VidC4uLiBhY2NlcHQgZWl0aGVyIGFsbCAwIG9yCisgICAgICAgIC8vIHRoZSByZWFsIGJyb2FkY2FzdCBCc3NpZCAoYWxsIDB4ZmYpIGFzIGJyb2FkY2FzdCBCc3NpZHMgKG1lYW5pbmcgdG8KKyAgICAgICAgLy8gbWF0Y2ggYW55IEJzc2lkcykuCisgICAgICAgIGlmICggY3NySXNNYWNBZGRyZXNzWmVybyggcE1hYywgJlByb2ZpbGVCc3NpZCApIHx8CisgICAgICAgICAgICAgY3NySXNNYWNBZGRyZXNzQnJvYWRjYXN0KCBwTWFjLCAmUHJvZmlsZUJzc2lkICkgKQorICAgICAgICB7CisgICAgICAgICAgICAgZk1hdGNoID0gVFJVRTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggY3NySXNNYWNBZGRyZXNzRXF1YWwoIHBNYWMsIEJzc0Jzc2lkLCAmUHJvZmlsZUJzc2lkICkgKQorICAgICAgICB7CisgICAgICAgICAgICBmTWF0Y2ggPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0gd2hpbGUoIDAgKTsKKworICAgIHJldHVybiggZk1hdGNoICk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzcklzQlNTVHlwZU1hdGNoKGVDc3JSb2FtQnNzVHlwZSBic3NUeXBlMSwgZUNzclJvYW1Cc3NUeXBlIGJzc1R5cGUyKQoreworICAgIGlmKChlQ1NSX0JTU19UWVBFX0FOWSAhPSBic3NUeXBlMSAmJiBlQ1NSX0JTU19UWVBFX0FOWSAhPSBic3NUeXBlMikgJiYgKGJzc1R5cGUxICE9IGJzc1R5cGUyKSkKKyAgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fVFJVRTsKK30KKworCit0QU5JX0JPT0xFQU4gY3NySXNCc3NUeXBlSUJTUyhlQ3NyUm9hbUJzc1R5cGUgYnNzVHlwZSkKK3sKKyAgICByZXR1cm4oKHRBTklfQk9PTEVBTikoZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTID09IGJzc1R5cGUgfHwgZUNTUl9CU1NfVFlQRV9JQlNTID09IGJzc1R5cGUpKTsKK30KKwordEFOSV9CT09MRUFOIGNzcklzQnNzVHlwZVdEUyhlQ3NyUm9hbUJzc1R5cGUgYnNzVHlwZSkKK3sKKyAgICByZXR1cm4oKHRBTklfQk9PTEVBTikoZUNTUl9CU1NfVFlQRV9XRFNfU1RBID09IGJzc1R5cGUgfHwgZUNTUl9CU1NfVFlQRV9XRFNfQVAgPT0gYnNzVHlwZSkpOworfQorCit0QU5JX0JPT0xFQU4gY3NySXNCU1NUeXBlQ2Fwc01hdGNoKCBlQ3NyUm9hbUJzc1R5cGUgYnNzVHlwZSwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYyApCit7CisgICAgdEFOSV9CT09MRUFOIGZNYXRjaCA9IFRSVUU7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgc3dpdGNoKCBic3NUeXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBlQ1NSX0JTU19UWVBFX0FOWToKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBlQ1NSX0JTU19UWVBFX0lORlJBU1RSVUNUVVJFOgorICAgICAgICAgICAgY2FzZSBlQ1NSX0JTU19UWVBFX1dEU19TVEE6CisgICAgICAgICAgICAgICAgaWYoICFjc3JJc0luZnJhQnNzRGVzYyggcFNpckJzc0Rlc2MgKSApCisgICAgICAgICAgICAgICAgICAgIGZNYXRjaCA9IEZBTFNFOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgZUNTUl9CU1NfVFlQRV9JQlNTOgorICAgICAgICAgICAgY2FzZSBlQ1NSX0JTU19UWVBFX1NUQVJUX0lCU1M6CisgICAgICAgICAgICAgICAgaWYoICFjc3JJc0lic3NCc3NEZXNjKCBwU2lyQnNzRGVzYyApICkKKyAgICAgICAgICAgICAgICAgICAgZk1hdGNoID0gRkFMU0U7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBlQ1NSX0JTU19UWVBFX1dEU19BUDogLy9Gb3IgV0RTIEFQLCBubyBuZWVkIHRvIG1hdGNoIGFueXRoaW5nCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGZNYXRjaCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlKCAwICk7CisKKworICAgIHJldHVybiggZk1hdGNoICk7Cit9CisKK3N0YXRpYyB0QU5JX0JPT0xFQU4gY3NySXNDYXBhYmlsaXRpZXNNYXRjaCggdHBBbmlTaXJHbG9iYWwgcE1hYywgZUNzclJvYW1Cc3NUeXBlIGJzc1R5cGUsIHRTaXJCc3NEZXNjcmlwdGlvbiAqcFNpckJzc0Rlc2MgKQoreworICByZXR1cm4oIGNzcklzQlNTVHlwZUNhcHNNYXRjaCggYnNzVHlwZSwgcFNpckJzc0Rlc2MgKSApOworfQorCisKKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc1NwZWNpZmljQ2hhbm5lbE1hdGNoKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBTaXJCc3NEZXNjLCB0QU5JX1U4IENoYW5uZWwgKQoreworICAgIHRBTklfQk9PTEVBTiBmTWF0Y2ggPSBUUlVFOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8vIGlmIHRoZSBjaGFubmVsIGlzIEFOWSwgdGhlbiBhbHdheXMgbWF0Y2guLi4KKyAgICAgICAgaWYgKCBlQ1NSX09QRVJBVElOR19DSEFOTkVMX0FOWSA9PSBDaGFubmVsICkgYnJlYWs7CisgICAgICAgIGlmICggQ2hhbm5lbCA9PSBwU2lyQnNzRGVzYy0+Y2hhbm5lbElkICkgYnJlYWs7CisKKyAgICAgICAgLy8gZGlkbid0IG1hdGNoIGFueXRoaW5nLi4gc28gcmV0dXJuIE5PIG1hdGNoCisgICAgICAgIGZNYXRjaCA9IEZBTFNFOworCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBmTWF0Y2ggKTsKK30KKworCit0QU5JX0JPT0xFQU4gY3NySXNDaGFubmVsQmFuZE1hdGNoKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGNoYW5uZWxJZCwgdFNpckJzc0Rlc2NyaXB0aW9uICpwU2lyQnNzRGVzYyApCit7CisgICAgdEFOSV9CT09MRUFOIGZNYXRjaCA9IFRSVUU7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLy8gaWYgdGhlIHByb2ZpbGUgc2F5cyBBbnkgY2hhbm5lbCBBTkQgdGhlIGdsb2JhbCBzZXR0aW5ncyBzYXlzIEFOWSBjaGFubmVsLCB0aGVuIHdlCisgICAgICAgIC8vIGFsd2F5cyBtYXRjaC4uLgorICAgICAgICBpZiAoIGVDU1JfT1BFUkFUSU5HX0NIQU5ORUxfQU5ZID09IGNoYW5uZWxJZCApIGJyZWFrOworCisgICAgICAgIGlmICggZUNTUl9PUEVSQVRJTkdfQ0hBTk5FTF9BTlkgIT0gY2hhbm5lbElkICkKKyAgICAgICAgeworICAgICAgICAgICAgZk1hdGNoID0gY3NySXNTcGVjaWZpY0NoYW5uZWxNYXRjaCggcE1hYywgcFNpckJzc0Rlc2MsIGNoYW5uZWxJZCApOworICAgICAgICB9CisKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICByZXR1cm4oIGZNYXRjaCApOworfQorCisKKy8qKgorICogXGJyaWVmIEVucXVpcmUgYXMgdG8gd2hldGhlciBhIGdpdmVuIHJhdGUgaXMgc3VwcG9ydGVkIGJ5IHRoZQorICogYWRhcHRlciBhcyBjdXJyZW50bHkgY29uZmlndXJlZAorICoKKyAqCisgKiBccGFyYW0gblJhdGUgQSByYXRlIGluIHVuaXRzIG9mIDUwMGticHMKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgIHRoZSBhZGFwdGVyIGlzIGN1cnJlbnRseSBjYXBhYmxlICBvZiBzdXBwb3J0aW5nIHRoaXMKKyAqIHJhdGUsIEZBTFNFIGVsc2UKKyAqCisgKgorICogVGhlIHJhdGUgZW5jb2RpbmcgIGlzIGp1c3QgYXMgaW4gODAyLjExICBJbmZvcm1hdGlvbiBFbGVtZW50cywgZXhjZXB0CisgKiB0aGF0IHRoZSBoaWdoIGJpdCBpcyBcZW0gIG5vdCBpbnRlcnByZXRlZCBhcyBpbmRpY2F0aW5nIGEgQmFzaWMgUmF0ZSwKKyAqIGFuZCBwcm9wcmlldGFyeSByYXRlcyBhcmUgYWxsb3dlZCwgdG9vLgorICoKKyAqIE5vdGUgIHRoYXQgaWYgdGhlICBhZGFwdGVyJ3MgZG90MTFNb2RlICBpcyBnLCAgd2UgZG9uJ3QgIHJlc3RyaWN0IHRoZQorICogcmF0ZXMuICBBY2NvcmRpbmcgdG8gaHdSZWFkRWVwcm9tUGFyYW1ldGVycywgdGhpcyB3aWxsIGhhcHBlbiB3aGVuOgorICoKKyAqICAgLi4uIHRoZSAgY2FyZCBpcyAgY29uZmlndXJlZCBmb3IgQUxMICBiYW5kcyB0aHJvdWdoICB0aGUgcHJvcGVydHkKKyAqICAgcGFnZS4gIElmIHRoaXMgb2NjdXJzLCBhbmQgdGhlIGNhcmQgaXMgbm90IGFuIEFCRyBjYXJkICx0aGVuIHRoaXMKKyAqICAgY29kZSAgaXMgIHNldHRpbmcgdGhlICBkb3QxMU1vZGUgIHRvICBhc3N1bWUgIHRoZSBtb2RlICB0aGF0ICB0aGUKKyAqICAgaGFyZHdhcmUgY2FuIHN1cHBvcnQuICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBjYXJkICBpcyBhbiAxMUJHIGNhcmQKKyAqICAgYW5kIHdlICBhcmUgY29uZmlndXJlZCB0byBzdXBwb3J0ICBBTEwgYmFuZHMsIHRoZW4gIHdlIGNoYW5nZSB0aGUKKyAqICAgZG90MTFNb2RlICB0byAxMWcgIGJlY2F1c2UgIEFMTCBpbiAgdGhpcyAgY2FzZSBpcyAgb25seSB3aGF0ICB0aGUKKyAqICAgaGFyZHdhcmUgY2FuIHN1cHBvcnQuCisgKgorICoKKyAqLworCitzdGF0aWMgdEFOSV9CT09MRUFOIGNzcklzQWdncmVnYXRlUmF0ZVN1cHBvcnRlZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgcmF0ZSApCit7CisgICAgdEFOSV9CT09MRUFOIGZTdXBwb3J0ZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdEFOSV9VMTYgaWR4LCBuZXdSYXRlOworCisgICAgLy9JbiBjYXNlIGJhc2ljIHJhdGUgZmxhZyBpcyBzZXQKKyAgICBuZXdSYXRlID0gQklUU19PRkYocmF0ZSwgQ1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSyk7CisgICAgaWYgKCBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQSA9PSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnVDZmdEb3QxMU1vZGUgKQorICAgIHsKKyAgICAgICAgc3dpdGNoICggbmV3UmF0ZSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNk1icHM6CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzlNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8xMk1icHM6CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzE4TWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMjRNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8zNk1icHM6CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzQ4TWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNTRNYnBzOgorICAgICAgICAgICAgZlN1cHBvcnRlZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZSBpZiggZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUIgPT0gcE1hYy0+cm9hbS5jb25maWdQYXJhbS51Q2ZnRG90MTFNb2RlICkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoIG5ld1JhdGUgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzFNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8yTWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNV81TWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMTFNYnBzOgorICAgICAgICAgICAgZlN1cHBvcnRlZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCAhcE1hYy0+cm9hbS5jb25maWdQYXJhbS5Qcm9wcmlldGFyeVJhdGVzRW5hYmxlZCApCisgICAgeworCisgICAgICAgIHN3aXRjaCAoIG5ld1JhdGUgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzFNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8yTWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNV81TWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNk1icHM6CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzlNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8xMU1icHM6CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzEyTWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMThNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8yNE1icHM6CisgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzM2TWJwczoKKyAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNDhNYnBzOgorICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV81NE1icHM6CisgICAgICAgICAgICBmU3VwcG9ydGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZlN1cHBvcnRlZCA9IEZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICBpZiAoIGVDc3JTdXBwUmF0ZV8xTWJwcyAgID09IG5ld1JhdGUgfHwKKyAgICAgICAgICAgICBlQ3NyU3VwcFJhdGVfMk1icHMgICA9PSBuZXdSYXRlIHx8CisgICAgICAgICAgICAgZUNzclN1cHBSYXRlXzVfNU1icHMgPT0gbmV3UmF0ZSB8fAorICAgICAgICAgICAgIGVDc3JTdXBwUmF0ZV8xMU1icHMgID09IG5ld1JhdGUgKQorICAgICAgICB7CisgICAgICAgICAgICBmU3VwcG9ydGVkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlkeCA9IDB4MTsKKworICAgICAgICAgICAgc3dpdGNoICggbmV3UmF0ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV82TWJwczoKKyAgICAgICAgICAgICAgICBmU3VwcG9ydGVkID0gZ1BoeVJhdGVzU3VwcHRbMF1baWR4XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzlNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFsxXVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMTJNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFsyXVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMThNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFszXVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMjBNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFs0XVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMjRNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFs1XVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMzZNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFs2XVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNDBNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFs3XVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNDJNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFs4XVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNDhNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFs5XVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfNTRNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFsxMF1baWR4XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzcyTWJwczoKKyAgICAgICAgICAgICAgICBmU3VwcG9ydGVkID0gZ1BoeVJhdGVzU3VwcHRbMTFdW2lkeF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV84ME1icHM6CisgICAgICAgICAgICAgICAgZlN1cHBvcnRlZCA9IGdQaHlSYXRlc1N1cHB0WzEyXVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfODRNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFsxM11baWR4XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzk2TWJwczoKKyAgICAgICAgICAgICAgICBmU3VwcG9ydGVkID0gZ1BoeVJhdGVzU3VwcHRbMTRdW2lkeF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8xMDhNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFsxNV1baWR4XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzEyME1icHM6CisgICAgICAgICAgICAgICAgZlN1cHBvcnRlZCA9IGdQaHlSYXRlc1N1cHB0WzE2XVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMTI2TWJwczoKKyAgICAgICAgICAgICAgICBmU3VwcG9ydGVkID0gZ1BoeVJhdGVzU3VwcHRbMTddW2lkeF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8xNDRNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFsxOF1baWR4XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzE2ME1icHM6CisgICAgICAgICAgICAgICAgZlN1cHBvcnRlZCA9IGdQaHlSYXRlc1N1cHB0WzE5XVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMTY4TWJwczoKKyAgICAgICAgICAgICAgICBmU3VwcG9ydGVkID0gZ1BoeVJhdGVzU3VwcHRbMjBdW2lkeF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGVDc3JTdXBwUmF0ZV8xOTJNYnBzOgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBnUGh5UmF0ZXNTdXBwdFsyMV1baWR4XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgZUNzclN1cHBSYXRlXzIxNk1icHM6CisgICAgICAgICAgICAgICAgZlN1cHBvcnRlZCA9IGdQaHlSYXRlc1N1cHB0WzIyXVtpZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlQ3NyU3VwcFJhdGVfMjQwTWJwczoKKyAgICAgICAgICAgICAgICBmU3VwcG9ydGVkID0gZ1BoeVJhdGVzU3VwcHRbMjNdW2lkeF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGZTdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmU3VwcG9ydGVkOworfQorCisKKworc3RhdGljIHRBTklfQk9PTEVBTiBjc3JJc1JhdGVTZXRNYXRjaCggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTdXBwUmF0ZXMgKnBCc3NTdXBwUmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICpwQnNzRXh0U3VwcFJhdGVzICkKK3sKKyAgICB0QU5JX0JPT0xFQU4gZk1hdGNoID0gVFJVRTsKKyAgICB0QU5JX1UzMiBpOworCisKKyAgICAvLyBWYWxpZGF0ZSB0aGF0IGFsbCBvZiB0aGUgQmFzaWMgcmF0ZXMgYWR2ZXJ0aXNlZCBpbiB0aGUgQnNzIGRlc2NyaXB0aW9uIGFyZSBzdXBwb3J0ZWQuCisgICAgaWYgKCBwQnNzU3VwcFJhdGVzICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBwQnNzU3VwcFJhdGVzLT5udW1fcmF0ZXM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggQ1NSX0lTX0JBU0lDX1JBVEUoIHBCc3NTdXBwUmF0ZXMtPnJhdGVzWyBpIF0gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAhY3NySXNBZ2dyZWdhdGVSYXRlU3VwcG9ydGVkKCBwTWFjLCBwQnNzU3VwcFJhdGVzLT5yYXRlc1sgaSBdICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZk1hdGNoID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggZk1hdGNoICYmIHBCc3NFeHRTdXBwUmF0ZXMgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHBCc3NFeHRTdXBwUmF0ZXMtPm51bV9yYXRlczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBDU1JfSVNfQkFTSUNfUkFURSggcEJzc0V4dFN1cHBSYXRlcy0+cmF0ZXNbIGkgXSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoICFjc3JJc0FnZ3JlZ2F0ZVJhdGVTdXBwb3J0ZWQoIHBNYWMsIHBCc3NFeHRTdXBwUmF0ZXMtPnJhdGVzWyBpIF0gKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmTWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKCBmTWF0Y2ggKTsKKworfQorCisKKy8vcHBJZXMgY2FuIGJlIE5VTEwuIElmIGNhbGxlciB3YW50IHRvIGdldCB0aGUgKnBwSWVzIGFsbG9jYXRlZCBieSB0aGlzIGZ1bmN0aW9uLCBwYXNzIGluICpwcEllcyA9IE5VTEwKK3RBTklfQk9PTEVBTiBjc3JNYXRjaEJTUyggdEhhbEhhbmRsZSBoSGFsLCB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcEZpbHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVDc3JBdXRoVHlwZSAqcE5lZ0F1dGgsIGVDc3JFbmNyeXB0aW9uVHlwZSAqcE5lZ1VjLCBlQ3NyRW5jcnlwdGlvblR5cGUgKnBOZWdNYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkJlYWNvbklFcyAqKnBwSWVzKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHRBTklfQk9PTEVBTiBmUkMgPSBlQU5JX0JPT0xFQU5fRkFMU0UsIGZDaGVjazsKKyAgICB0QU5JX1UzMiBpOworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXMgPSBOVUxMOworICAgIHRBTklfVTggKnBiOworCisgICAgZG8geworICAgICAgICBpZiggKCBOVUxMID09IHBwSWVzICkgfHwgKCAqcHBJZXMgKSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9JZiBubyBJRXMgcGFzc2VkIGluLCBnZXQgb3VyIG93bi4KKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgcEJzc0Rlc2MsICZwSWVzKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL1NhdmUgdGhlIG9uZSBwYXNzIGluIGZvciBsb2NhbCB1c2UKKyAgICAgICAgICAgIHBJZXMgPSAqcHBJZXM7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vQ2hlY2sgaWYgY2FsbGVyIHdhbnRzIFAyUAorICAgICAgICBmQ2hlY2sgPSAoIXBGaWx0ZXItPnAycFJlc3VsdCB8fCBwSWVzLT5QMlBCZWFjb25Qcm9iZVJlcy5wcmVzZW50KTsKKyAgICAgICAgaWYoIWZDaGVjaykgYnJlYWs7CisKKyAgICAgICAgaWYocEllcy0+U1NJRC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBwRmlsdGVyLT5TU0lEcy5udW1PZlNTSURzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZkNoZWNrID0gY3NySXNTc2lkTWF0Y2goIHBNYWMsIHBGaWx0ZXItPlNTSURzLlNTSURMaXN0W2ldLlNTSUQuc3NJZCwgcEZpbHRlci0+U1NJRHMuU1NJRExpc3RbaV0uU1NJRC5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllcy0+U1NJRC5zc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZXMtPlNTSUQubnVtX3NzaWQsIGVBTklfQk9PTEVBTl9UUlVFICk7CisgICAgICAgICAgICAgICAgaWYgKCBmQ2hlY2sgKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFmQ2hlY2spIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZDaGVjayA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBwRmlsdGVyLT5CU1NJRHMubnVtT2ZCU1NJRHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZkNoZWNrID0gY3NySXNCc3NpZE1hdGNoKCBwTWFjLCAodENzckJzc2lkICopJnBGaWx0ZXItPkJTU0lEcy5ic3NpZFtpXSwgKHRDc3JCc3NpZCAqKXBCc3NEZXNjLT5ic3NJZCApOworICAgICAgICAgICAgaWYgKCBmQ2hlY2sgKSBicmVhazsKKworICAgICAgICAgICAgaWYgKHBGaWx0ZXItPnAycFJlc3VsdCAmJiBwSWVzLT5QMlBCZWFjb25Qcm9iZVJlcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZkNoZWNrID0gY3NySXNCc3NpZE1hdGNoKCBwTWFjLCAodENzckJzc2lkICopJnBGaWx0ZXItPkJTU0lEcy5ic3NpZFtpXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodENzckJzc2lkICopcEllcy0+UDJQQmVhY29uUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5QMlBEZXZpY2VBZGRyZXNzICk7CisKKyAgICAgICAgICAgICAgIGlmICggZkNoZWNrICkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoIWZDaGVjaykgYnJlYWs7CisKKyAgICAgICAgZkNoZWNrID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgIGZvcihpID0gMDsgaSA8IHBGaWx0ZXItPkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZkNoZWNrID0gY3NySXNDaGFubmVsQmFuZE1hdGNoKCBwTWFjLCBwRmlsdGVyLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdFtpXSwgcEJzc0Rlc2MgKTsKKyAgICAgICAgICAgIGlmICggZkNoZWNrICkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYoIWZDaGVjaykKKyAgICAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgICAgICAvKiBJZiB0aGlzIGlzIGZvciBtZWFzdXJlbWVudCBmaWx0ZXJpbmcgKi8KKyAgICAgICAgaWYoIHBGaWx0ZXItPmZNZWFzdXJlbWVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgZlJDID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKCAhY3NySXNQaHlNb2RlTWF0Y2goIHBNYWMsIHBGaWx0ZXItPnBoeU1vZGUsIHBCc3NEZXNjLCBOVUxMLCBOVUxMLCBwSWVzICkgKSBicmVhazsKKyAgICAgICAgaWYgKCAoIXBGaWx0ZXItPmJXUFNBc3NvY2lhdGlvbikgJiYKKyAgICAgICAgICAgICAhY3NySXNTZWN1cml0eU1hdGNoKCBwTWFjLCAmcEZpbHRlci0+YXV0aFR5cGUsICZwRmlsdGVyLT5FbmNyeXB0aW9uVHlwZSwgJnBGaWx0ZXItPm1jRW5jcnlwdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzRGVzYywgcEllcywgcE5lZ0F1dGgsIHBOZWdVYywgcE5lZ01jICkgKSBicmVhazsKKyAgICAgICAgaWYgKCAhY3NySXNDYXBhYmlsaXRpZXNNYXRjaCggcE1hYywgcEZpbHRlci0+QlNTVHlwZSwgcEJzc0Rlc2MgKSApIGJyZWFrOworICAgICAgICBpZiAoICFjc3JJc1JhdGVTZXRNYXRjaCggcE1hYywgJnBJZXMtPlN1cHBSYXRlcywgJnBJZXMtPkV4dFN1cHBSYXRlcyApICkgYnJlYWs7CisgICAgICAgIC8vVHVzaC1Rb1M6IHZhbGlkYXRlIGZpcnN0IGlmIGFza2VkIGZvciBBUFNEIG9yIFdNTSBhc3NvY2lhdGlvbgorICAgICAgICBpZiAoIChlQ3NyUm9hbVdtbVFic3NPbmx5ID09IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uV01NU3VwcG9ydE1vZGUpICYmCisgICAgICAgICAgICAgIUNTUl9JU19RT1NfQlNTKHBJZXMpICkKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy9DaGVjayBjb3VudHJ5LiBjaGVjayBldmVuIHdoZW4gcGIgaXMgTlVMTCBiZWNhdXNlIHdlIG1heSB3YW50IHRvIG1ha2Ugc3VyZQorICAgICAgICAvL0FQIGhhcyBhIGNvdW50cnkgY29kZSBpbiBpdCBpZiBmRW5mb3JjZUNvdW50cnlDb2RlTWF0Y2ggaXMgc2V0LgorICAgICAgICBwYiA9ICggcEZpbHRlci0+Y291bnRyeUNvZGVbMF0gKSA/ICggcEZpbHRlci0+Y291bnRyeUNvZGUpIDogTlVMTDsKKworICAgICAgICBmQ2hlY2sgPSBjc3JNYXRjaENvdW50cnlDb2RlKCBwTWFjLCBwYiwgcEllcyApOworICAgICAgICBpZighZkNoZWNrKQorICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICBpZiAocEZpbHRlci0+TURJRC5tZGllUHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBCc3NEZXNjLT5tZGllUHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEZpbHRlci0+TURJRC5tb2JpbGl0eURvbWFpbiAhPSAocEJzc0Rlc2MtPm1kaWVbMV0gPDwgOCB8IHBCc3NEZXNjLT5tZGllWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBmUkMgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKworICAgIH0gd2hpbGUoIDAgKTsKKyAgICBpZiggcHBJZXMgKQorICAgIHsKKyAgICAgICAgKnBwSWVzID0gcEllczsKKyAgICB9CisgICAgZWxzZSBpZiggcEllcyApCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXMpOworICAgIH0KKworICAgIHJldHVybiggZlJDICk7Cit9CisKK3RBTklfQk9PTEVBTiBjc3JNYXRjaENvbm5lY3RlZEJTU1NlY3VyaXR5KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBQcm9maWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQnNzRGVzY3JpcHRpb24gKnBCc3NEZXNjLCB0RG90MTFmQmVhY29uSUVzICpwSWVzKQoreworICAgIHRDc3JFbmNyeXB0aW9uTGlzdCB1Y0VuY3J5cHRpb25MaXN0LCBtY0VuY3J5cHRpb25MaXN0OworICAgIHRDc3JBdXRoTGlzdCBhdXRoTGlzdDsKKworICAgIHVjRW5jcnlwdGlvbkxpc3QubnVtRW50cmllcyA9IDE7CisgICAgdWNFbmNyeXB0aW9uTGlzdC5lbmNyeXB0aW9uVHlwZVswXSA9IHBQcm9maWxlLT5FbmNyeXB0aW9uVHlwZTsKKworICAgIG1jRW5jcnlwdGlvbkxpc3QubnVtRW50cmllcyA9IDE7CisgICAgbWNFbmNyeXB0aW9uTGlzdC5lbmNyeXB0aW9uVHlwZVswXSA9IHBQcm9maWxlLT5tY0VuY3J5cHRpb25UeXBlOworCisgICAgYXV0aExpc3QubnVtRW50cmllcyA9IDE7CisgICAgYXV0aExpc3QuYXV0aFR5cGVbMF0gPSBwUHJvZmlsZS0+QXV0aFR5cGU7CisKKyAgICByZXR1cm4oIGNzcklzU2VjdXJpdHlNYXRjaCggcE1hYywgJmF1dGhMaXN0LCAmdWNFbmNyeXB0aW9uTGlzdCwgJm1jRW5jcnlwdGlvbkxpc3QsIHBCc3NEZXNjLCBwSWVzLCBOVUxMLCBOVUxMLCBOVUxMICkpOworCit9CisKKwordEFOSV9CT09MRUFOIGNzck1hdGNoQlNTVG9Db25uZWN0UHJvZmlsZSggdEhhbEhhbmRsZSBoSGFsLCB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUgKnBQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpckJzc0Rlc2NyaXB0aW9uICpwQnNzRGVzYywgdERvdDExZkJlYWNvbklFcyAqcEllcyApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdEFOSV9CT09MRUFOIGZSQyA9IGVBTklfQk9PTEVBTl9GQUxTRSwgZkNoZWNrOworICAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXNMb2NhbCA9IHBJZXM7CisKKyAgICBkbyB7CisgICAgICAgIGlmKCAhcEllcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgcEJzc0Rlc2MsICZwSWVzTG9jYWwpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmQ2hlY2sgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgaWYocEllc0xvY2FsLT5TU0lELnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfQk9PTEVBTiBmQ2hlY2tTc2lkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgaWYocFByb2ZpbGUtPlNTSUQubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZDaGVja1NzaWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZDaGVjayA9IGNzcklzU3NpZE1hdGNoKCBwTWFjLCBwUHJvZmlsZS0+U1NJRC5zc0lkLCBwUHJvZmlsZS0+U1NJRC5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllc0xvY2FsLT5TU0lELnNzaWQsIHBJZXNMb2NhbC0+U1NJRC5udW1fc3NpZCwgZkNoZWNrU3NpZCApOworICAgICAgICAgICAgaWYoIWZDaGVjaykgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhY3NyTWF0Y2hDb25uZWN0ZWRCU1NTZWN1cml0eSggcE1hYywgcFByb2ZpbGUsIHBCc3NEZXNjLCBwSWVzTG9jYWwpICkgYnJlYWs7CisgICAgICAgIGlmICggIWNzcklzQ2FwYWJpbGl0aWVzTWF0Y2goIHBNYWMsIHBQcm9maWxlLT5CU1NUeXBlLCBwQnNzRGVzYyApICkgYnJlYWs7CisgICAgICAgIGlmICggIWNzcklzUmF0ZVNldE1hdGNoKCBwTWFjLCAmcEllc0xvY2FsLT5TdXBwUmF0ZXMsICZwSWVzTG9jYWwtPkV4dFN1cHBSYXRlcyApICkgYnJlYWs7CisgICAgICAgIGZDaGVjayA9IGNzcklzQ2hhbm5lbEJhbmRNYXRjaCggcE1hYywgcFByb2ZpbGUtPm9wZXJhdGlvbkNoYW5uZWwsIHBCc3NEZXNjICk7CisgICAgICAgIGlmKCFmQ2hlY2spCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBmUkMgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKworICAgIH0gd2hpbGUoIDAgKTsKKworICAgIGlmKCAhcEllcyAmJiBwSWVzTG9jYWwgKQorICAgIHsKKyAgICAgICAgLy9sb2NhbGx5IGFsbG9jYXRlZAorICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXNMb2NhbCk7CisgICAgfQorCisgICAgcmV0dXJuKCBmUkMgKTsKK30KKworCisKK3RBTklfQk9PTEVBTiBjc3JSYXRlc0lzRG90MTFSYXRlU3VwcG9ydGVkKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggcmF0ZSApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdEFOSV9VMTYgbiA9IEJJVFNfT0ZGKCByYXRlLCBDU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLICk7CisKKyAgICByZXR1cm4gY3NySXNBZ2dyZWdhdGVSYXRlU3VwcG9ydGVkKCBwTWFjLCBuICk7Cit9CisKKwordEFOSV9VMTYgY3NyUmF0ZXNNYWNQcm9wVG9Eb3QxMSggdEFOSV9VMTYgUmF0ZSApCit7CisgICAgdEFOSV9VMTYgQ29udmVydGVkUmF0ZSA9IFJhdGU7CisKKyAgICBzd2l0Y2goIFJhdGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfMToKKyAgICAgICAgICAgIENvbnZlcnRlZFJhdGUgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX01BQ19SQVRFXzI6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJUl9NQUNfUkFURV81XzU6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gMTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfMTE6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gMjI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJUl9NQUNfUkFURV82OgorICAgICAgICAgICAgQ29udmVydGVkUmF0ZSA9IDEyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX01BQ19SQVRFXzk6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gMTg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfMTI6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gMjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfMTg6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gMzY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfMjQ6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gNDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfMzY6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gNzI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfNDI6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gODQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfNDg6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gOTY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfNTQ6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gMTA4OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfNzI6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gMTQ0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX01BQ19SQVRFXzg0OgorICAgICAgICAgICAgQ29udmVydGVkUmF0ZSA9IDE2ODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJUl9NQUNfUkFURV85NjoKKyAgICAgICAgICAgIENvbnZlcnRlZFJhdGUgPSAxOTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfMTA4OgorICAgICAgICAgICAgQ29udmVydGVkUmF0ZSA9IDIxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJUl9NQUNfUkFURV8xMjY6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gMjUyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX01BQ19SQVRFXzE0NDoKKyAgICAgICAgICAgIENvbnZlcnRlZFJhdGUgPSAyODg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfMTY4OgorICAgICAgICAgICAgQ29udmVydGVkUmF0ZSA9IDMzNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJUl9NQUNfUkFURV8xOTI6CisgICAgICAgICAgICBDb252ZXJ0ZWRSYXRlID0gMzg0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX01BQ19SQVRFXzIxNjoKKyAgICAgICAgICAgIENvbnZlcnRlZFJhdGUgPSA0MzI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX1JBVEVfMjQwOgorICAgICAgICAgICAgQ29udmVydGVkUmF0ZSA9IDQ4MDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHhmZjoKKyAgICAgICAgICAgIENvbnZlcnRlZFJhdGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIENvbnZlcnRlZFJhdGU7Cit9CisKKwordEFOSV9VMTYgY3NyUmF0ZXNGaW5kQmVzdFJhdGUoIHRTaXJNYWNSYXRlU2V0ICpwU3VwcFJhdGVzLCB0U2lyTWFjUmF0ZVNldCAqcEV4dFJhdGVzLCB0U2lyTWFjUHJvcFJhdGVTZXQgKnBQcm9wUmF0ZXMgKQoreworICAgIHRBTklfVTggaTsKKyAgICB0QU5JX1UxNiBuQmVzdDsKKworICAgIG5CZXN0ID0gcFN1cHBSYXRlcy0+cmF0ZVsgMCBdICYgKCB+Q1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSyApOworCisgICAgaWYocFN1cHBSYXRlcy0+bnVtUmF0ZXMgPiBTSVJfTUFDX1JBVEVTRVRfRUlEX01BWCkKKyAgICB7CisgICAgICAgIHBTdXBwUmF0ZXMtPm51bVJhdGVzID0gU0lSX01BQ19SQVRFU0VUX0VJRF9NQVg7CisgICAgfQorCisgICAgZm9yICggaSA9IDFVOyBpIDwgcFN1cHBSYXRlcy0+bnVtUmF0ZXM7ICsraSApCisgICAgeworICAgICAgICBuQmVzdCA9ICh0QU5JX1UxNilDU1JfTUFYKCBuQmVzdCwgcFN1cHBSYXRlcy0+cmF0ZVsgaSBdICYgKCB+Q1NSX0RPVDExX0JBU0lDX1JBVEVfTUFTSyApICk7CisgICAgfQorCisgICAgaWYgKCBOVUxMICE9IHBFeHRSYXRlcyApCisgICAgeworICAgICAgICBmb3IgKCBpID0gMFU7IGkgPCBwRXh0UmF0ZXMtPm51bVJhdGVzOyArK2kgKQorICAgICAgICB7CisgICAgICAgICAgICBuQmVzdCA9ICh0QU5JX1UxNilDU1JfTUFYKCBuQmVzdCwgcEV4dFJhdGVzLT5yYXRlWyBpIF0gJiAoIH5DU1JfRE9UMTFfQkFTSUNfUkFURV9NQVNLICkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggTlVMTCAhPSBwUHJvcFJhdGVzICkKKyAgICB7CisgICAgICAgIGZvciAoIGkgPSAwVTsgaSA8IHBQcm9wUmF0ZXMtPm51bVByb3BSYXRlczsgKytpICkKKyAgICAgICAgeworICAgICAgICAgICAgbkJlc3QgPSAodEFOSV9VMTYpQ1NSX01BWCggbkJlc3QsICBjc3JSYXRlc01hY1Byb3BUb0RvdDExKCBwUHJvcFJhdGVzLT5wcm9wUmF0ZVsgaSBdICkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuQmVzdDsKK30KKworCit2b2lkIGNzclJlbGVhc2VQcm9maWxlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUpCit7CisgICAgaWYocFByb2ZpbGUpCisgICAgeworICAgICAgICBpZihwUHJvZmlsZS0+QlNTSURzLmJzc2lkKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBQcm9maWxlLT5CU1NJRHMuYnNzaWQpOworICAgICAgICAgICAgcFByb2ZpbGUtPkJTU0lEcy5ic3NpZCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYocFByb2ZpbGUtPlNTSURzLlNTSURMaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBQcm9maWxlLT5TU0lEcy5TU0lETGlzdCk7CisgICAgICAgICAgICBwUHJvZmlsZS0+U1NJRHMuU1NJRExpc3QgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmKHBQcm9maWxlLT5wV1BBUmVxSUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFByb2ZpbGUtPnBXUEFSZXFJRSk7CisgICAgICAgICAgICBwUHJvZmlsZS0+cFdQQVJlcUlFID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZihwUHJvZmlsZS0+cFJTTlJlcUlFKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBQcm9maWxlLT5wUlNOUmVxSUUpOworICAgICAgICAgICAgcFByb2ZpbGUtPnBSU05SZXFJRSA9IE5VTEw7CisgICAgICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgICAgICBpZihwUHJvZmlsZS0+cFdBUElSZXFJRSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwUHJvZmlsZS0+cFdBUElSZXFJRSk7CisgICAgICAgICAgICBwUHJvZmlsZS0+cFdBUElSZXFJRSA9IE5VTEw7CisgICAgICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisgICAgICAgIGlmKHBQcm9maWxlLT5wQWRkSUVTY2FuKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBQcm9maWxlLT5wQWRkSUVTY2FuKTsKKyAgICAgICAgICAgIHBQcm9maWxlLT5wQWRkSUVTY2FuID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBQcm9maWxlLT5wQWRkSUVBc3NvYykKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwUHJvZmlsZS0+cEFkZElFQXNzb2MpOworICAgICAgICAgICAgcFByb2ZpbGUtPnBBZGRJRUFzc29jID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBQcm9maWxlLT5wQWRkSUVBc3NvYyk7CisgICAgICAgICAgICBwUHJvZmlsZS0+cEFkZElFQXNzb2MgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYocFByb2ZpbGUtPkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBQcm9maWxlLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCk7CisgICAgICAgICAgICBwUHJvZmlsZS0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QgPSBOVUxMOworICAgICAgICB9CisKKyAgICAKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwUHJvZmlsZSwgc2l6ZW9mKHRDc3JSb2FtUHJvZmlsZSkpOworICAgIH0KK30KKwordm9pZCBjc3JGcmVlU2NhbkZpbHRlcih0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcFNjYW5GaWx0ZXIpCit7CisgICAgaWYocFNjYW5GaWx0ZXItPkJTU0lEcy5ic3NpZCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5GaWx0ZXItPkJTU0lEcy5ic3NpZCk7CisgICAgICAgIHBTY2FuRmlsdGVyLT5CU1NJRHMuYnNzaWQgPSBOVUxMOworICAgIH0KKyAgICBpZihwU2NhbkZpbHRlci0+Q2hhbm5lbEluZm8uQ2hhbm5lbExpc3QpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCk7CisgICAgICAgIHBTY2FuRmlsdGVyLT5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IE5VTEw7CisgICAgfQorICAgIGlmKHBTY2FuRmlsdGVyLT5TU0lEcy5TU0lETGlzdCkKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0KTsKKyAgICAgICAgcFNjYW5GaWx0ZXItPlNTSURzLlNTSURMaXN0ID0gTlVMTDsKKyAgICB9Cit9CisKKwordm9pZCBjc3JGcmVlUm9hbVByb2ZpbGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSAmcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdOworCisgICAgaWYocFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZSkKKyAgICB7CisgICAgICAgIGNzclJlbGVhc2VQcm9maWxlKHBNYWMsIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpOworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUpOworICAgICAgICBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlID0gTlVMTDsKKyAgICB9Cit9CisKKwordm9pZCBjc3JGcmVlQ29ubmVjdEJzc0Rlc2ModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSAmcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdOworCisgICAgaWYocFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYykKKyAgICB7CisgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFNlc3Npb24tPnBDb25uZWN0QnNzRGVzYyk7CisgICAgICAgIHBTZXNzaW9uLT5wQ29ubmVjdEJzc0Rlc2MgPSBOVUxMOworICAgIH0KK30KKworCisKK3RTaXJSZXN1bHRDb2RlcyBjc3JHZXREaXNhc3NvY1JzcFN0YXR1c0NvZGUoIHRTaXJTbWVEaXNhc3NvY1JzcCAqcFNtZURpc2Fzc29jUnNwICkKK3sKKyAgICB0QU5JX1U4ICpwQnVmZmVyID0gKHRBTklfVTggKilwU21lRGlzYXNzb2NSc3A7CisgICAgdEFOSV9VMzIgcmV0OworCisgICAgcEJ1ZmZlciArPSAoc2l6ZW9mKHRBTklfVTE2KSArIHNpemVvZih0QU5JX1UxNikgKyBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAvL3RTaXJSZXN1bHRDb2RlcyBpcyBhbiBlbnVtLCBhc3N1bWluZyBpcyAzMmJpdAorICAgIC8vSWYgd2UgY2Fubm90IG1ha2UgdGhpcyBhc3N1bXB0aW9uLCB1c2UgY29weW1lbW9yeQorICAgIHBhbF9nZXRfVTMyKCBwQnVmZmVyLCAmcmV0ICk7CisKKyAgICByZXR1cm4oICggdFNpclJlc3VsdENvZGVzIClyZXQgKTsKK30KKworCit0U2lyUmVzdWx0Q29kZXMgY3NyR2V0RGVBdXRoUnNwU3RhdHVzQ29kZSggdFNpclNtZURlYXV0aFJzcCAqcFNtZVJzcCApCit7CisgICAgdEFOSV9VOCAqcEJ1ZmZlciA9ICh0QU5JX1U4ICopcFNtZVJzcDsKKyAgICB0QU5JX1UzMiByZXQ7CisKKyAgICBwQnVmZmVyICs9IChzaXplb2YodEFOSV9VMTYpICsgc2l6ZW9mKHRBTklfVTE2KSArIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIC8vdFNpclJlc3VsdENvZGVzIGlzIGFuIGVudW0sIGFzc3VtaW5nIGlzIDMyYml0CisgICAgLy9JZiB3ZSBjYW5ub3QgbWFrZSB0aGlzIGFzc3VtcHRpb24sIHVzZSBjb3B5bWVtb3J5CisgICAgcGFsX2dldF9VMzIoIHBCdWZmZXIsICZyZXQgKTsKKworICAgIHJldHVybiggKCB0U2lyUmVzdWx0Q29kZXMgKXJldCApOworfQorCisjaWYgMAordFNpclNjYW5UeXBlIGNzckdldFNjYW5UeXBlKHRBTklfVTggY2huSWQsIGVSZWdEb21haW5JZCBkb21haW5JZCwgdEFOSV9VOCAqY291bnRyeUNvZGUpCit7CisgICAgdFNpclNjYW5UeXBlIHNjYW5UeXBlID0gZVNJUl9QQVNTSVZFX1NDQU47CisgICAgdEFOSV9VOCBjYyA9IDA7CisKKyAgICB3aGlsZSAoY2MrKyA8IGdDc3JEb21haW5DaG5JbmZvW2RvbWFpbklkXS5udW1DaGFubmVscykKKyAgICB7CisgICAgICAgIGlmKGNobklkID09IGdDc3JEb21haW5DaG5JbmZvW2RvbWFpbklkXS5jaG5JbmZvW2NjXS5jaG5JZCkKKyAgICAgICAgeworICAgICAgICAgICAgc2NhblR5cGUgPSBnQ3NyRG9tYWluQ2huSW5mb1tkb21haW5JZF0uY2huSW5mb1tjY10uc2NhblR5cGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc2NhblR5cGUpOworfQorI2VuZGlmCisKK3RTaXJTY2FuVHlwZSBjc3JHZXRTY2FuVHlwZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGNobklkKQoreworICAgIHRTaXJTY2FuVHlwZSBzY2FuVHlwZSA9IGVTSVJfUEFTU0lWRV9TQ0FOOworICAgIGVOVkNoYW5uZWxFbmFibGVkVHlwZSBjaGFubmVsRW5hYmxlZFR5cGU7CisKKyAgICBjaGFubmVsRW5hYmxlZFR5cGUgPSB2b3NfbnZfZ2V0Q2hhbm5lbEVuYWJsZWRTdGF0ZShjaG5JZCk7CisgICAgaWYoIE5WX0NIQU5ORUxfRU5BQkxFID09ICBjaGFubmVsRW5hYmxlZFR5cGUpCisgICAgeworICAgICAgICAgc2NhblR5cGUgPSBlU0lSX0FDVElWRV9TQ0FOOworICAgIH0KKyAgICByZXR1cm4gKHNjYW5UeXBlKTsKK30KKworCit0QU5JX1U4IGNzclRvVXBwZXIoIHRBTklfVTggY2ggKQoreworICAgIHRBTklfVTggY2hPdXQ7CisKKyAgICBpZiAoIGNoID49ICdhJyAmJiBjaCA8PSAneicgKQorICAgIHsKKyAgICAgICAgY2hPdXQgPSBjaCAtICdhJyArICdBJzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2hPdXQgPSBjaDsKKyAgICB9CisgICAgcmV0dXJuKCBjaE91dCApOworfQorCisKK3RTaXJCc3NUeXBlIGNzclRyYW5zbGF0ZUJzc3R5cGVUb01hY1R5cGUoZUNzclJvYW1Cc3NUeXBlIGNzcnR5cGUpCit7CisgICAgdFNpckJzc1R5cGUgcmV0OworCisgICAgc3dpdGNoKGNzcnR5cGUpCisgICAgeworICAgIGNhc2UgZUNTUl9CU1NfVFlQRV9JTkZSQVNUUlVDVFVSRToKKyAgICAgICAgcmV0ID0gZVNJUl9JTkZSQVNUUlVDVFVSRV9NT0RFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGVDU1JfQlNTX1RZUEVfSUJTUzoKKyAgICBjYXNlIGVDU1JfQlNTX1RZUEVfU1RBUlRfSUJTUzoKKyAgICAgICAgcmV0ID0gZVNJUl9JQlNTX01PREU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNTUl9CU1NfVFlQRV9XRFNfQVA6CisgICAgICAgIHJldCA9IGVTSVJfQlRBTVBfQVBfTU9ERTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ1NSX0JTU19UWVBFX1dEU19TVEE6CisgICAgICAgIHJldCA9IGVTSVJfQlRBTVBfU1RBX01PREU7CisgICAgICAgIGJyZWFrOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBjYXNlIGVDU1JfQlNTX1RZUEVfSU5GUkFfQVA6CisgICAgICAgIHJldCA9IGVTSVJfSU5GUkFfQVBfTU9ERTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIGVDU1JfQlNTX1RZUEVfQU5ZOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGVTSVJfQVVUT19NT0RFOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gKHJldCk7Cit9CisKKworLy9UaGlzIGZ1bmN0aW9uIHVzZSB0aGUgcGFyYW1ldGVycyB0byBkZWNpZGUgdGhlIENGRyB2YWx1ZS4KKy8vQ1NSIG5ldmVyIHNldHMgV05JX0NGR19ET1QxMV9NT0RFX0FMTCB0byB0aGUgQ0ZHCisvL1NvIFBFIHNob3VsZCBub3Qgc2VlIFdOSV9DRkdfRE9UMTFfTU9ERV9BTEwgd2hlbiBpdCBnZXRzIHRoZSBDRkcgdmFsdWUKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCitlQ3NyQ2ZnRG90MTFNb2RlIGNzckdldENmZ0RvdDExTW9kZUZyb21Dc3JQaHlNb2RlKHRDc3JSb2FtUHJvZmlsZSAqcFByb2ZpbGUsIGVDc3JQaHlNb2RlIHBoeU1vZGUsIHRBTklfQk9PTEVBTiBmUHJvcHJpZXRhcnkpCisjZWxzZQorZUNzckNmZ0RvdDExTW9kZSBjc3JHZXRDZmdEb3QxMU1vZGVGcm9tQ3NyUGh5TW9kZShlQ3NyUGh5TW9kZSBwaHlNb2RlLCB0QU5JX0JPT0xFQU4gZlByb3ByaWV0YXJ5KQorI2VuZGlmCit7CisgICAgdEFOSV9VMzIgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV9BQkc7CisKKyAgICBzd2l0Y2gocGh5TW9kZSkKKyAgICB7CisgICAgY2FzZSBlQ1NSX0RPVDExX01PREVfMTFhOgorICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYV9PTkxZOgorICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ1NSX0RPVDExX01PREVfMTFiOgorICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExYl9PTkxZOgorICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlQ1NSX0RPVDExX01PREVfMTFnOgorICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExZ19PTkxZOgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgaWYocFByb2ZpbGUgJiYgKENTUl9JU19JTkZSQV9BUChwUHJvZmlsZSkpICYmIChwaHlNb2RlID09IGVDU1JfRE9UMTFfTU9ERV8xMWdfT05MWSkpCisgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExR19PTkxZOworICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV8xMUc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExbjoKKyAgICAgICAgaWYoZlByb3ByaWV0YXJ5KQorICAgICAgICB7CisgICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFX1RBVVJVUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFXzExbl9PTkxZOgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICBpZihwUHJvZmlsZSAmJiBDU1JfSVNfSU5GUkFfQVAocFByb2ZpbGUpKQorICAgICAgICAgICBjZmdEb3QxMU1vZGUgPSBlQ1NSX0NGR19ET1QxMV9NT0RFXzExTl9PTkxZOworICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgIGNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfMTFOOworICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFX1RBVVJVUzoKKyAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV9UQVVSVVM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFX2FiZzoKKyAgICAgICAgY2ZnRG90MTFNb2RlID0gZUNTUl9DRkdfRE9UMTFfTU9ERV9BQkc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZUNTUl9ET1QxMV9NT0RFX0FVVE86CisgICAgICAgIGNmZ0RvdDExTW9kZSA9IGVDU1JfQ0ZHX0RPVDExX01PREVfQVVUTzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLy9ObyBuZWVkIHRvIGFzc2lnbiBhbnl0aGluZyBoZXJlCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAoY2ZnRG90MTFNb2RlKTsKK30KKworCitlSGFsU3RhdHVzIGNzclNldFJlZ3VsYXRvcnlEb21haW4odHBBbmlTaXJHbG9iYWwgcE1hYywgdl9SRUdET01BSU5fdCBkb21haW5JZCwgdEFOSV9CT09MRUFOICpwZlJlc3RhcnROZWVkZWQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRBTklfQk9PTEVBTiBmUmVzdGFydDsKKworICAgIGlmKHBNYWMtPnNjYW4uZG9tYWluSWRDdXJyZW50ID09IGRvbWFpbklkKQorICAgIHsKKyAgICAgICAgLy9ubyBjaGFuZ2UKKyAgICAgICAgZlJlc3RhcnQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorICAgIGVsc2UgaWYoICFwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZFbmZvcmNlRGVmYXVsdERvbWFpbiApCisgICAgeworICAgICAgICBwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCA9IGRvbWFpbklkOworICAgICAgICBmUmVzdGFydCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL1dlIGNhbm5vdCBjaGFuZ2UgdGhlIGRvbWFpbgorICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19DU1JfV1JPTkdfU1RBVEU7CisgICAgICAgIGZSZXN0YXJ0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIH0KKyAgICBpZihwZlJlc3RhcnROZWVkZWQpCisgICAgeworICAgICAgICAqcGZSZXN0YXJ0TmVlZGVkID0gZlJlc3RhcnQ7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK3ZfUkVHRE9NQUlOX3QgY3NyR2V0Q3VycmVudFJlZ3VsYXRvcnlEb21haW4odHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICByZXR1cm4gKHBNYWMtPnNjYW4uZG9tYWluSWRDdXJyZW50KTsKK30KKworI2lmIDAKK2VIYWxTdGF0dXMgY3NyR2V0UmVndWxhdG9yeURvbWFpbkZvckNvdW50cnkodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCAqcENvdW50cnksIGVSZWdEb21haW5JZCAqcERvbWFpbklkKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiBpLCBjb3VudCA9IHNpemVvZiggZ0NzckNvdW50cnlJbmZvICkgLyBzaXplb2YoIGdDc3JDb3VudHJ5SW5mb1swXSApOworCisgICAgaWYocENvdW50cnkpCisgICAgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwYWxFcXVhbE1lbW9yeShwTWFjLT5oSGRkLCBnQ3NyQ291bnRyeUluZm9baV0uY291bnRyeUNvZGUsIHBDb3VudHJ5LCAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggcERvbWFpbklkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwRG9tYWluSWQgPSBnQ3NyQ291bnRyeUluZm9baV0uZG9tYWluSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGkgPT0gY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiICBkb2Vzbid0IG1hdGNoIGNvdW50cnkgJWMlY1xuIiksIHBDb3VudHJ5WzBdLCBwQ291bnRyeVsxXSk7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKyNlbmRpZgorCitlSGFsU3RhdHVzIGNzckdldFJlZ3VsYXRvcnlEb21haW5Gb3JDb3VudHJ5KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBDb3VudHJ5LCB2X1JFR0RPTUFJTl90ICpwRG9tYWluSWQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyAgICB2X0NPVU5UUllDT0RFX3QgY291bnRyeUNvZGU7CisgICAgdl9SRUdET01BSU5fdCBkb21haW5JZDsKKworICAgIGlmKHBDb3VudHJ5KQorICAgIHsKKyAgICAgICAgY291bnRyeUNvZGVbMF0gPSBwQ291bnRyeVswXTsKKyAgICAgICAgY291bnRyeUNvZGVbMV0gPSBwQ291bnRyeVsxXTsKKyAgICAgICAgdm9zU3RhdHVzID0gdm9zX252X2dldFJlZ0RvbWFpbkZyb21Db3VudHJ5Q29kZSggJmRvbWFpbklkLCBjb3VudHJ5Q29kZSApOworICAgICAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcERvbWFpbklkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcERvbWFpbklkID0gZG9tYWluSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgIGRvZXNuJ3QgbWF0Y2ggY291bnRyeSAlYyVjXG4iKSwgcENvdW50cnlbMF0sIHBDb3VudHJ5WzFdKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvL1RvIGNoZWNrIHdoZXRoZXIgYSBjb3VudHJ5IGNvZGUgbWF0Y2hlcyB0aGUgb25lIGluIHRoZSBJRQorLy9Pbmx5IGNoZWNrIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycywgaWdub3JpbmcgaW4vb3V0ZG9vcgorLy9wQ291bnRyeSAtLSBjYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluIHRoZSBjb3VudHJ5IGNvZGUgdGhhdCBpcyBjaGVja2luZyBhZ2FpbnN0CisvL3RoZSBvbmUgaW4gcEllcy4gSXQgY2FuIGJlIE5VTEwuCisvL2NhbGxlciBtdXN0IHByb3ZpZGUgcEllcywgaXQgY2Fubm90IGJlIE5VTEwKKy8vVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIFRSVUUgaWYgMTFkIHN1cHBvcnQgaXMgbm90IHR1cm5lZCBvbi4KK3RBTklfQk9PTEVBTiBjc3JNYXRjaENvdW50cnlDb2RlKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQ291bnRyeSwgdERvdDExZkJlYWNvbklFcyAqcEllcyApCit7CisgICAgdEFOSV9CT09MRUFOIGZSZXQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICB2X1JFR0RPTUFJTl90IGRvbWFpbklkID0gTlVNX1JFR19ET01BSU5TOyAgIC8vVGhpcyBpcyBpbml0IHRvIGludmFsaWQgdmFsdWUKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiggIWNzcklzMTFkU3VwcG9ydGVkKCBwTWFjKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKCAhcEllcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBObyBJRXNcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vTWFrZSBzdXJlIHRoaXMgY291bnRyeSBpcyByZWNvZ25pemFibGUKKyAgICAgICAgaWYoIHBJZXMtPkNvdW50cnkucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzckdldFJlZ3VsYXRvcnlEb21haW5Gb3JDb3VudHJ5KCBwTWFjLCBwSWVzLT5Db3VudHJ5LmNvdW50cnksKHZfUkVHRE9NQUlOX3QgKikgJmRvbWFpbklkICk7CisgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZSZXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9jaGVjayB3aGV0aGVyIGl0IGlzIG5lZWRlZCB0byBlbmZvcmNlIHRvIHRoZSBkZWZhdWx0IHJlZ3VsYXRvcnkgZG9tYWluIGZpcnN0CisgICAgICAgIGlmKCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZFbmZvcmNlRGVmYXVsdERvbWFpbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkb21haW5JZCAhPSBwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZlJldCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mRW5mb3JjZUNvdW50cnlDb2RlTWF0Y2ggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggZG9tYWluSWQgPj0gTlVNX1JFR19ET01BSU5TICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmUmV0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCBwQ291bnRyeSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTMyIGk7CisKKyAgICAgICAgICAgIGlmKCAhcEllcy0+Q291bnRyeS5wcmVzZW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmUmV0ID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgQ291bnRyeUNvZGUgY2hhcmFjdGVycyB0byB1cHBlcgorICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4gLSAxOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDb3VudHJ5W2ldID0gY3NyVG9VcHBlciggcENvdW50cnlbaV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhcGFsRXF1YWxNZW1vcnkocE1hYy0+aEhkZCwgcEllcy0+Q291bnRyeS5jb3VudHJ5LCBwQ291bnRyeSwgV05JX0NGR19DT1VOVFJZX0NPREVfTEVOIC0gMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZSZXQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlKDApOworCisgICAgcmV0dXJuIChmUmV0KTsKK30KKworI2lmIDAKK2VIYWxTdGF0dXMgY3NyU2V0Q291bnRyeURvbWFpbk1hcHBpbmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdENzckNvdW50cnlEb21haW5NYXBwaW5nICpwQ291bnRyeURvbWFpbk1hcHBpbmcpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB0QU5JX1UzMiBpLCBqOworICAgIHRBTklfQk9PTEVBTiBmRG9tYWluQ2hhbmdlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB0QU5JX1U4IGNvdW50cnlDb2RlW1dOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTl07CisKKyAgICBpID0gV05JX0NGR19DT1VOVFJZX0NPREVfTEVOOworICAgIC8vR2V0IHRoZSBjdXJyZW50bHkgdXNlZCBjb3VudHJ5IGNvZGUKKyAgICBzdGF0dXMgPSBjY21DZmdHZXRTdHIocE1hYywgV05JX0NGR19DT1VOVFJZX0NPREUsIGNvdW50cnlDb2RlLCAmaSk7CisgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgeworICAgICAgICBpZihwQ291bnRyeURvbWFpbk1hcHBpbmcgJiYgcENvdW50cnlEb21haW5NYXBwaW5nLT5udW1FbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcENvdW50cnlEb21haW5NYXBwaW5nLT5udW1FbnRyeTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IGVDU1JfTlVNX0NPVU5UUllfSU5ERVg7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHBhbEVxdWFsTWVtb3J5KHBNYWMtPmhIZGQsIGdDc3JDb3VudHJ5SW5mb1tqXS5jb3VudHJ5Q29kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRyeURvbWFpbk1hcHBpbmctPnBDb3VudHJ5SW5mb1tpXS5jb3VudHJ5Q29kZSwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGdDc3JDb3VudHJ5SW5mb1tqXS5kb21haW5JZCAhPSBwQ291bnRyeURvbWFpbk1hcHBpbmctPnBDb3VudHJ5SW5mb1tpXS5kb21haW5JZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnQ3NyQ291bnRyeUluZm9bal0uZG9tYWluSWQgPSBwQ291bnRyeURvbWFpbk1hcHBpbmctPnBDb3VudHJ5SW5mb1tpXS5kb21haW5JZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIHdoZXRoZXIgaXQgbWF0Y2hlcyB0aGUgY3VycmVudGx5IHVzZWQgY291bnRyeSBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBtYXRjaGluZywgbmVlZCB0byB1cGRhdGUgYmFzZSBvbiB0aGUgbmV3IGRvbWFpbiBzZXR0aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhbEVxdWFsTWVtb3J5KHBNYWMtPmhIZGQsIGNvdW50cnlDb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ291bnRyeURvbWFpbk1hcHBpbmctPnBDb3VudHJ5SW5mb1tpXS5jb3VudHJ5Q29kZSwgMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRG9tYWluQ2hhbmdlZCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIGlmKGZEb21haW5DaGFuZ2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRDc3JDaGFubmVsICpwQ2hhbm5lbExpc3Q7CisKKyAgICAgICAgICAgICAgICBpZihwTWFjLT5zY2FuLmYxMWRJbmZvQXBwbGllZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vMTFkIGluZm8gYWxyZWFkeSBhcHBsaWVkLiBMZXQncyByZWFwcGx5IHdpdGggdGhlIG5ldyBkb21haW4gc2V0dGluZworICAgICAgICAgICAgICAgICAgICBpZihwTWFjLT5zY2FuLmNoYW5uZWxzMTFkLm51bUNoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbExpc3QgPSAmcE1hYy0+c2Nhbi5jaGFubmVsczExZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFubmVsTGlzdCA9ICZwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vbm8gMTFkIHNvIHdlIHVzZSB0aGUgYmFzZSBjaGFubmVsaXN0IGZyb20gRUVQUk9NCisgICAgICAgICAgICAgICAgICAgIHBDaGFubmVsTGlzdCA9ICZwTWFjLT5zY2FuLmJhc2UyME1IekNoYW5uZWxzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL3NldCB0aGUgbmV3IGRvbWFpbidzIHNjYW4gcmVxdWlyZW1lbnQgdG8gQ0ZHCisgICAgICAgICAgICAgICAgY3NyU2V0Q2ZnU2NhbkNvbnRyb2xMaXN0KHBNYWMsIGNvdW50cnlDb2RlLCBwQ2hhbm5lbExpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCitlSGFsU3RhdHVzIGNzclNldERvbWFpblNjYW5TZXR0aW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRDc3JEb21haW5GcmVxSW5mbyAqcERvbWFpbkZyZXFJbmZvKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgdEFOSV9VMzIgaSwgajsKKyAgICB0QU5JX1UxNiBmcmVxOworCisgICAgaWYocERvbWFpbkZyZXFJbmZvICYmIHBEb21haW5GcmVxSW5mby0+bnVtRW50cnkgJiYgKHBEb21haW5GcmVxSW5mby0+ZG9tYWluSWQgPCBOVU1fUkVHX0RPTUFJTlMpKQorICAgIHsKKyAgICAgICAgdENzckRvbWFpbkNobkluZm8gKnBEb21haW5DaG5JbmZvID0gJmdDc3JEb21haW5DaG5JbmZvW3BEb21haW5GcmVxSW5mby0+ZG9tYWluSWRdOworCisgICAgICAgIGZvcihqID0gMDsgaiA8IHBEb21haW5DaG5JbmZvLT5udW1DaGFubmVsczsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MoaGFsUGh5Q2hJZFRvRnJlcUNvbnZlcnNpb24ocERvbWFpbkNobkluZm8tPmNobkluZm9bal0uY2huSWQsICZmcmVxKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcERvbWFpbkZyZXFJbmZvLT5udW1FbnRyeTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHBEb21haW5GcmVxSW5mby0+cENzclNjYW5GcmVxSW5mb1tpXS5uU3RhcnRGcmVxIDw9IGZyZXEpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoZnJlcSA8PSBwRG9tYWluRnJlcUluZm8tPnBDc3JTY2FuRnJlcUluZm9baV0ubkVuZEZyZXEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwRG9tYWluQ2huSW5mby0+Y2huSW5mb1tqXS5zY2FuVHlwZSA9IHBEb21haW5GcmVxSW5mby0+cENzclNjYW5GcmVxSW5mb1tpXS5zY2FuVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiICAgRmFpbGVkIHRvIGdldCBmcmVxdWVuY3kgb2YgY2hhbm5lbCAlZCIsIHBEb21haW5DaG5JbmZvLT5jaG5JbmZvW2pdLmNobklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKyNlbmRpZgorCitlSGFsU3RhdHVzIGNzckdldE1vZGlmeVByb2ZpbGVGaWVsZHModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtTW9kaWZ5UHJvZmlsZUZpZWxkcyAqcE1vZGlmeVByb2ZpbGVGaWVsZHMpCit7CisKKyAgIGlmKCFwTW9kaWZ5UHJvZmlsZUZpZWxkcykKKyAgIHsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTW9kaWZ5UHJvZmlsZUZpZWxkcywgCisgICAgICAgICAgICAgICAgICAmcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGUubW9kaWZ5UHJvZmlsZUZpZWxkcywgCisgICAgICAgICAgICAgICAgICBzaXplb2YodENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzKSApOworCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworZUhhbFN0YXR1cyBjc3JTZXRNb2RpZnlQcm9maWxlRmllbGRzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgKnBNb2RpZnlQcm9maWxlRmllbGRzKQoreworICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisKKyAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5tb2RpZnlQcm9maWxlRmllbGRzLAorICAgICAgICAgICAgICAgICAgcE1vZGlmeVByb2ZpbGVGaWVsZHMsCisgICAgICAgICAgICAgICAgICBzaXplb2YodENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzKSApOworCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisjaWYgMAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIGNzckdldFN1cHBvcnRlZENvdW50cnlDb2RlCisgICAgXGJyaWVmIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgY291bnRyeSBjb2RlIGN1cnJlbnQgYmVpbmcgc3VwcG9ydGVkCisgICAgXHBhcmFtIHBCdWYgLSBDYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IDMgYnl0ZXMsIHVwb24gc3VjY2VzcyByZXR1cm4sIAorICAgIHRoaXMgaGFzIHRoZSBjb3VudHJ5IGNvZGUgbGlzdC4gMyBieXRlcyBmb3IgZWFjaCBjb3VudHJ5IGNvZGUuIFRoaXMgbWF5IGJlIE5VTEwgaWYKKyAgICBjYWxsZXIgd2FudHMgdG8ga25vdyB0aGUgbmVlZGVkIGJ5dGVzLgorICAgIFxwYXJhbSBwYkxlbiAtIENhbGxlciBhbGxvY2F0ZWQsIGFzIGlucHV0LCBpdCBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiBwQnVmLiBVcG9uIHN1Y2Nlc3MgcmV0dXJuLAorICAgIHRoaXMgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiBwQnVmCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIGNzckdldFN1cHBvcnRlZENvdW50cnlDb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyICpwYkxlbikKK3sKKyAgICB0QU5JX1UzMiBudW1PZkNvdW50cnkgPSBzaXplb2YoIGdDc3JDb3VudHJ5SW5mbyApIC8gc2l6ZW9mKCBnQ3NyQ291bnRyeUluZm9bMF0gKTsKKyAgICB0QU5JX1UzMiBudW1CeXRlcyA9IDA7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKworICAgIGlmKCBwYkxlbiApCisgICAgeworICAgICAgICBudW1CeXRlcyA9ICpwYkxlbjsKKyAgICAgICAgLy9Db25zaWRlciBpdCBvaywgYXQgbGVhc3Qgd2UgY2FuIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZDsKKyAgICAgICAgKnBiTGVuID0gbnVtT2ZDb3VudHJ5ICogV05JX0NGR19DT1VOVFJZX0NPREVfTEVOOworICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICBpZiggcEJ1ZiAmJiAoIG51bUJ5dGVzID49ICpwYkxlbiApICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9UaGUgdWdseSBwYXJ0IHN0YXJ0cy4KKyAgICAgICAgICAgIC8vV2UgbWF5IG5lZWQgdG8gYWx0ZXIgdGhlIGRhdGEgc3RydWN0dXJlIGFuZCBmaW5kIGEgd2F5IHRvIG1ha2UgdGhpcyBmYXN0ZXIuCisgICAgICAgICAgICB0QU5JX1UzMiBpOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnVtT2ZDb3VudHJ5OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBCdWYgKyAoIGkgKiBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4gKSwKKyAgICAgICAgICAgICAgICAgICAgZ0NzckNvdW50cnlJbmZvW2ldLmNvdW50cnlDb2RlLCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIHN0YXR1cyApOworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBjc3JHZXRTdXBwb3J0ZWRDb3VudHJ5Q29kZQorICAgIFxicmllZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGdldCBhIGxpc3Qgb2YgdGhlIGNvdW50cnkgY29kZSBjdXJyZW50IGJlaW5nIHN1cHBvcnRlZAorICAgIFxwYXJhbSBwQnVmIC0gQ2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgd2l0aCBhdCBsZWFzdCAzIGJ5dGVzLCB1cG9uIHN1Y2Nlc3MgcmV0dXJuLCAKKyAgICB0aGlzIGhhcyB0aGUgY291bnRyeSBjb2RlIGxpc3QuIDMgYnl0ZXMgZm9yIGVhY2ggY291bnRyeSBjb2RlLiBUaGlzIG1heSBiZSBOVUxMIGlmCisgICAgY2FsbGVyIHdhbnRzIHRvIGtub3cgdGhlIG5lZWRlZCBieXRlcy4KKyAgICBccGFyYW0gcGJMZW4gLSBDYWxsZXIgYWxsb2NhdGVkLCBhcyBpbnB1dCwgaXQgaW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgcEJ1Zi4gVXBvbiBzdWNjZXNzIHJldHVybiwKKyAgICB0aGlzIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gcEJ1ZgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBjc3JHZXRTdXBwb3J0ZWRDb3VudHJ5Q29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiAqcGJMZW4pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgIHZfU0laRV90IHNpemUgPSAodl9TSVpFX3QpKnBiTGVuOworCisgICAgdm9zU3RhdHVzID0gdm9zX252X2dldFN1cHBvcnRlZENvdW50cnlDb2RlKCBwQnVmLCAmc2l6ZSwgMSApOworICAgIC8vZWl0ZXIgd2F5LCByZXR1cm4gdGhlIHZhbHVlIGJhY2sKKyAgICAqcGJMZW4gPSAodEFOSV9VMzIpc2l6ZTsKKworICAgIC8vSWYgcEJ1ZiBpcyBOVUxMLCBjYWxsZXIganVzdCB3YW50IHRvIGdldCB0aGUgc2l6ZSwgY29uc2lkZXIgaXQgc3VjY2VzcworICAgIGlmKHBCdWYpCisgICAgeworICAgICAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRBTklfVTMyIGksIG4gPSAqcGJMZW4gLyAzOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnVmW2kqMyArIDJdID0gJyAnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisKKy8vVXBwZXIgbGF5ZXIgdG8gZ2V0IHRoZSBsaXN0IG9mIHRoZSBiYXNlIGNoYW5uZWxzIHRvIHNjYW4gZm9yIHBhc3NpdmVseSAxMWQgaW5mbyBmcm9tIGNzcgorZUhhbFN0YXR1cyBjc3JTY2FuR2V0QmFzZUNoYW5uZWxzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyQ2hhbm5lbEluZm8gKiBwQ2hhbm5lbEluZm8gKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgIGRvCisgICAgeworICAgIAorICAgICAgIGlmKCFwTWFjLT5zY2FuLmJhc2VDaGFubmVscy5udW1DaGFubmVscyB8fCAhcENoYW5uZWxJbmZvKQorICAgICAgIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwQ2hhbm5lbEluZm8tPkNoYW5uZWxMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+c2Nhbi5iYXNlQ2hhbm5lbHMubnVtQ2hhbm5lbHMgKTsKKyAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgIHsKKyAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCJjc3JTY2FuR2V0QmFzZUNoYW5uZWxzOiBmYWlsIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikgKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICAgc3RhdHVzID0gcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcENoYW5uZWxJbmZvLT5DaGFubmVsTGlzdCwgcE1hYy0+c2Nhbi5iYXNlQ2hhbm5lbHMuY2hhbm5lbExpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnNjYW4uYmFzZUNoYW5uZWxzLm51bUNoYW5uZWxzICk7CisgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgIHBDaGFubmVsSW5mby0+bnVtT2ZDaGFubmVscyA9IHBNYWMtPnNjYW4uYmFzZUNoYW5uZWxzLm51bUNoYW5uZWxzOworCisgICAgfXdoaWxlKDApOworCisgICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKKwordEFOSV9CT09MRUFOIGNzcklzU2V0S2V5QWxsb3dlZCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICAgdEFOSV9CT09MRUFOIGZSZXQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworICAgIHBTZXNzaW9uID1DU1JfR0VUX1NFU1NJT04ocE1hYywgc2Vzc2lvbklkKTsKKworICAgIC8qVGhpcyBjb25kaXRpb24gaXMgbm90IHdvcmtpbmcgZm9yIGluZnJhIHN0YXRlLiBXaGVuIGluZnJhIGlzIGluIG5vdC1jb25uZWN0ZWQgc3RhdGUKKyAgICAqIHRoZSBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlIGlzIE5VTEwuIEFuZCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSwgdGhhdCBpcyBpbmNvcnJlY3QuCisgICAgKiBTaW5jZSBTQVAgcmVxdWlyZXMgdG8gc2V0IGtleSB3aXRob3V0IGFueSBCU1Mgc3RhcnRlZCwgaXQgbmVlZHMgdGhpcyBjb25kaXRpb24gdG8gYmUgbWV0LgorICAgICogSW4gb3RoZXIgd29yZHMsIHRoaXMgZnVuY3Rpb24gaXMgdXNlbGVzcy4KKyAgICAqIFRoZSBjdXJyZW50IHdvcmstYXJvdW5kIGlzIHRvIHByb2Nlc3Mgc2V0Y29udGV4dF9yc3AgYW5kIHJlbW92ZWtleV9yc3Agbm8gbWF0dGVyIHdoYXQgdGhlIAorICAgICogc3RhdGUgaXMuCisgICAgKi8KKyAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgaXMgbm90IHdoYXQgaXQgaW50ZW5kcyB0by4gTXVzdCBiZSByZXZpc2l0IG9yIHJlbW92ZWRcbiIpICk7CisgICAgaWYoIChOVUxMID09IHBTZXNzaW9uKSB8fCAKKyAgICAgICAgKCBjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZCggcE1hYywgc2Vzc2lvbklkICkgJiYgCisgICAgICAgIChwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlICE9IE5VTEwpICYmCisgICAgICAgICghKENTUl9JU19JTkZSQV9BUChwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlKSkpICkKKyAgICAgICAgKQorICAgIHsKKyAgICAgICAgZlJldCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB9CisjZWxzZQorICAgIGZSZXQgPSAhKCBjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZCggcE1hYywgc2Vzc2lvbklkICkgKTsKKyNlbmRpZgorCisgICAgcmV0dXJuICggZlJldCApOworfQorCisvL25vIG5lZWQgdG8gYWNxdWlyZSBsb2NrIGZvciB0aGlzIGJhc2ljIGZ1bmN0aW9uCit0QU5JX1UxNiBzbWVfQ2huVG9GcmVxKHRBTklfVTggY2hhbk51bSkKK3sKKyAgIGludCBpOworCisgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX0NIQU5ORUxTOyBpKyspIAorICAgeworICAgICAgaWYgKHJmQ2hhbm5lbHNbaV0uY2hhbm5lbE51bSA9PSBjaGFuTnVtKSAKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiByZkNoYW5uZWxzW2ldLnRhcmdldEZyZXE7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiAoMCk7Cit9CisKKy8qIERpc2Nvbm5lY3QgYWxsIGFjdGl2ZSBzZXNzaW9ucyBieSBzZW5kaW5nIGRpc2Fzc29jLiBUaGlzIGlzIG1haW5seSB1c2VkIHRvIGRpc2Nvbm5lY3QgdGhlIHJlbWFpbmluZyBzZXNzaW9uIHdoZW4gd2UgCisgKiB0cmFuc2l0aW9uIGZyb20gY29uY3VycmVudCBzZXNzaW9ucyB0byBhIHNpbmdsZSBzZXNzaW9uLiBUaGUgdXNlIGNhc2UgaXMgSW5mcmEgU1RBIGFuZCB3aWZpIGRpcmVjdCBtdWx0aXBsZSBzZXNzaW9ucyBhcmUgdXAgYW5kIAorICogUDJQIHNlc3Npb24gaXMgcmVtb3ZlZC4gVGhlIEluZnJhIFNUQSBzZXNzaW9uIHJlbWFpbnMgYW5kIHNob3VsZCByZXN1bWUgQk1QUyBpZiBCTVBTIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gSG93ZXZlciwgdGhlcmUKKyAqIGFyZSBzb21lIGlzc3VlcyBzZWVuIHdpdGggQk1QUyByZXN1bWUgZHVyaW5nIHRoaXMgdHJhbnNpdGlvbiBhbmQgdGhpcyBpcyBhIHdvcmthcm91bmQgd2hpY2ggd2lsbCBhbGxvdyB0aGUgSW5mcmEgU1RBIHNlc3Npb24gdG8KKyAqIGRpc2Nvbm5lY3QgYW5kIGF1dG8gY29ubmVjdCBiYWNrIGFuZCBlbnRlciBCTVBTIHRoaXMgZ2l2aW5nIHRoZSBzYW1lIGVmZmVjdCBhcyByZXN1bWluZyBCTVBTCisgKi8KK3ZvaWQgY3NyRGlzY29ubmVjdEFsbEFjdGl2ZVNlc3Npb25zKHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCBpOworCisgICAgLyogRGlzY29ubmVjdCBhbGwgdGhlIGFjdGl2ZSBzZXNzaW9ucyAqLworICAgIGZvciAoaT0wOyBpPENTUl9ST0FNX1NFU1NJT05fTUFYOyBpKyspCisgICAgeworICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIGkgKSAmJiAhY3NySXNDb25uU3RhdGVEaXNjb25uZWN0ZWQoIHBNYWMsIGkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzclJvYW1EaXNjb25uZWN0SW50ZXJuYWwocE1hYywgaSwgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9VTlNQRUNJRklFRCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9DT1JFL1NNRS9zcmMvbWVhcy9tZWFzQXBpLmMgYi9DT1JFL1NNRS9zcmMvbWVhcy9tZWFzQXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5YjAyOQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU01FL3NyYy9tZWFzL21lYXNBcGkuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvc3JjL3AycC9wMnBfQXBpLmMgYi9DT1JFL1NNRS9zcmMvcDJwL3AycF9BcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTdmMDEzCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvc3JjL3AycC9wMnBfQXBpLmMKQEAgLTAsMCArMSwyMjQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5IAorICovCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9QMlAKKworI2luY2x1ZGUgInNtZV9BcGkuaCIKKyNpbmNsdWRlICJzbXNEZWJ1Zy5oIgorI2luY2x1ZGUgImNzckluc2lkZUFwaS5oIgorI2luY2x1ZGUgInNtZUluc2lkZS5oIgorI2luY2x1ZGUgInAycF9BcGkuaCIKKyNpbmNsdWRlICJsaW1BcGkuaCIKKyNpbmNsdWRlICJjZmdBcGkuaCIKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfSU5URVJOQUwKKyNpbmNsdWRlICJwMnBfaWUuaCIKKyNpbmNsdWRlICJwMnBGc20uaCIKKworZXh0ZXJuIHRwMnBpZSBnUDJQSWU7CisKK3N0YXRpYyBlSGFsU3RhdHVzIHAycFNlbmRBY3Rpb25GcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IFNlc3Npb25JRCwgZVAyUEZyYW1lVHlwZSBhY3Rpb25GcmFtZVR5cGUpOworc3RhdGljIGVIYWxTdGF0dXMgcDJwTGlzdGVuU3RhdGVEaXNjb3ZlcmFibGVDYWxsYmFjayh0SGFsSGFuZGxlIGhhbEhhbmRsZSwgdm9pZCAqcENvbnRleHQsIGVIYWxTdGF0dXMgcmV0U3RhdHVzKTsKK3N0YXRpYyBlSGFsU3RhdHVzIHAycFJlbWFpbk9uQ2hhbm5lbFJlYWR5Q2FsbGJhY2sodEhhbEhhbmRsZSBoYWxIYW5kbGUsIHZvaWQgKnBDb250ZXh0LCBlSGFsU3RhdHVzIHNjYW5fc3RhdHVzKTsKK3N0YXRpYyB0QU5JX0JPT0xFQU4gcDJwSXNHT3BvcnRFbmFibGVkKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworI2VuZGlmCisKK2VIYWxTdGF0dXMgcDJwUHJvY2Vzc05vQVJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwTm9BQ21kKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogaGFuZGxlIFNNRSByZW1haW4gb24gY2hhbm5lbCByZXF1ZXN0LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZUhhbFN0YXR1cyBwMnBQcm9jZXNzUmVtYWluT25DaGFubmVsQ21kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnAycFJlbWFpbm9uQ2huKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0U2lyUmVtYWluT25DaG5SZXEqIHBNc2c7CisgICAgdEFOSV9VMTYgbGVuOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHAycFJlbWFpbm9uQ2huLT5zZXNzaW9uSWQgKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisgICAgdEFOSV9VOCBQMlBzZXNzaW9uSWQgPSBnZXRQMlBTZXNzaW9uSWRGcm9tU01FU2Vzc2lvbklkKHBNYWMsIHAycFJlbWFpbm9uQ2huLT5zZXNzaW9uSWQpOworICAgIHRwMnBDb250ZXh0ICpwMnBDb250ZXh0ID0gJnBNYWMtPnAycENvbnRleHRbUDJQc2Vzc2lvbklkXTsKKyAgICB0QU5JX1UzMiBpZUxlbiA9IDA7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfSU5URVJOQUwKKyAgICBpZiggIXBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlIHx8IChDU1JfU0VTU0lPTl9JRF9JTlZBTElEID09IFAyUHNlc3Npb25JZCkpIAorICAgIHsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCAoUDJQIHNlc3Npb24gJWQpIGlzIGludmFsaWQgb3IgbGlzdGVuIGlzIGRpc2FibGVkICIpLCAKKyAgICAgICAgICAgIHAycFJlbWFpbm9uQ2huLT5zZXNzaW9uSWQsIFAyUHNlc3Npb25JZCk7CisgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorI2Vsc2UKKyAgICBpZighcFNlc3Npb24tPnNlc3Npb25BY3RpdmUpIAorICAgIHsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiAgc2Vzc2lvbiAlZCBpcyBpbnZhbGlkIG9yIGxpc3RlbiBpcyBkaXNhYmxlZCAiKSwgCisgICAgICAgICAgICBwMnBSZW1haW5vbkNobi0+c2Vzc2lvbklkKTsKKyAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisgICAgUDJQX0dldElFKHAycENvbnRleHQsIAorICAgICAgICAgICAgICBwMnBDb250ZXh0LT5zZXNzaW9uSWQsIGVQMlBfUFJPQkVfUlNQLCAKKyAgICAgICAgICAgICAgJnAycENvbnRleHQtPnByb2JlUnNwSWUsICZpZUxlbik7CisgICAgcDJwQ29udGV4dC0+cHJvYmVSc3BJZUxlbmd0aCA9IGllTGVuOworICAgIGxlbiA9IHNpemVvZih0U2lyUmVtYWluT25DaG5SZXEpICsgaWVMZW47CisjZWxzZQorICAgIGxlbiA9IHNpemVvZih0U2lyUmVtYWluT25DaG5SZXEpICsgcE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllTGVuZ3RoOworI2VuZGlmCisKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCoqKSZwTXNnLCBsZW4gKTsKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyBjYWxsXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2csIHNpemVvZih0U2lyUmVtYWluT25DaG5SZXEpKTsKKyAgICAgICAgcE1zZy0+bWVzc2FnZVR5cGUgPSBlV05JX1NNRV9SRU1BSU5fT05fQ0hBTk5FTF9SRVE7CisgICAgICAgIHBNc2ctPmxlbmd0aCA9IGxlbjsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYywgcE1zZy0+c2VsZk1hY0FkZHIsIHBTZXNzaW9uLT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOyAKKyAgICAgICAgcE1zZy0+Y2huTnVtID0gcDJwUmVtYWlub25DaG4tPnUucmVtYWluQ2hsQ21kLmNobjsKKyAgICAgICAgcE1zZy0+cGh5TW9kZSA9IHAycFJlbWFpbm9uQ2huLT51LnJlbWFpbkNobENtZC5waHlNb2RlOworICAgICAgICBwTXNnLT5kdXJhdGlvbiA9IHAycFJlbWFpbm9uQ2huLT51LnJlbWFpbkNobENtZC5kdXJhdGlvbjsKKyAgICAgICAgcE1zZy0+c2Vzc2lvbklkID0gcDJwUmVtYWlub25DaG4tPnNlc3Npb25JZDsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisgICAgICAgIHBNc2ctPnNlc3Npb25JZCA9IHBTZXNzaW9uLT5zZXNzaW9uSWQ7CisgICAgICAgIGlmKCBwMnBDb250ZXh0LT5wcm9iZVJzcEllTGVuZ3RoICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKXBNc2ctPnByb2JlUnNwSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwMnBDb250ZXh0LT5wcm9iZVJzcEllLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwMnBDb250ZXh0LT5wcm9iZVJzcEllTGVuZ3RoKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYoIHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZUxlbmd0aCApCisgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKilwTXNnLT5wcm9iZVJzcEllLCAodm9pZCAqKXBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSwgcE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllTGVuZ3RoKTsKKyNlbmRpZgorICAgICAgICBzdGF0dXMgPSBwYWxTZW5kTUJNZXNzYWdlKHBNYWMtPmhIZGQsIHBNc2cpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogaGFuZGxlIExJTSByZW1haW4gb24gY2hhbm5lbCByc3A6IFN1Y2Nlc3MvZmFpbHVyZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2VIYWxTdGF0dXMgc21lX3JlbWFpbk9uQ2huUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwTXNnKQoreworICAgIGVIYWxTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0TGlzdEVsZW0gICAgICAgICAgICAgICAgICAgICAgICAgICpwRW50cnkgPSBOVUxMOworICAgIHRTbWVDbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDb21tYW5kID0gTlVMTDsKKworICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisgICAgaWYoIHBFbnRyeSApCisgICAgeworICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKyAgICAgICAgaWYoIGVTbWVDb21tYW5kUmVtYWluT25DaGFubmVsID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2sgPSBwQ29tbWFuZC0+dS5yZW1haW5DaGxDbWQuY2FsbGJhY2s7CisgICAgICAgICAgICAvKiBwcm9jZXNzIHRoZSBtc2cgKi8KKyAgICAgICAgICAgIGlmKCBjYWxsYmFjayApCisgICAgICAgICAgICAgICAgY2FsbGJhY2socE1hYywgcENvbW1hbmQtPnUucmVtYWluQ2hsQ21kLmNhbGxiYWNrQ3R4LCAwKTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsIHBFbnRyeSwgTExfQUNDRVNTX0xPQ0sgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9Ob3cgcHV0IHRoaXMgY29tbWFuZCBiYWNrIG9uIHRoZSBhdmlsYWJsZSBjb21tYW5kIGxpc3QKKyAgICAgICAgICAgICAgICBzbWVSZWxlYXNlQ29tbWFuZChwTWFjLCBwQ29tbWFuZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbWVQcm9jZXNzUGVuZGluZ1F1ZXVlKCBwTWFjICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEhhbmRsZSB0aGUgTWdtdCBmcm0gaW5kIGZyb20gTElNIGFuZCBmb3J3YXJkIHRvIEhERC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2VIYWxTdGF0dXMgc21lX21nbXRGcm1JbmQoIHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJTbWVNZ210RnJhbWVJbmQgcFNtZU1nbXRGcm0pCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgZUhhbFN0YXR1cyAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0Q3NyUm9hbUluZm8gcFJvYW1JbmZvID0gezB9OworI2lmbmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisgICAgdEFOSV9VMzIgU2Vzc2lvbklkID0gcFNtZU1nbXRGcm0tPnNlc3Npb25JZDsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAorICAgIHRBTklfVTggaTsKKworICAgIC8vRm9yIG5vdywgb25seSBhY3Rpb24gZnJhbWVzIGFyZSBuZWVkZWQuCisgICAgaWYoU0lSX01BQ19NR01UX0FDVElPTiA9PSBwU21lTWdtdEZybS0+ZnJhbWVUeXBlKQorICAgIHsKKyAgICAgICBwUm9hbUluZm8ubkZyYW1lTGVuZ3RoID0gcFNtZU1nbXRGcm0tPm1lc2dMZW4gLSBzaXplb2YodFNpclNtZU1nbXRGcmFtZUluZCk7CisgICAgICAgcFJvYW1JbmZvLnBiRnJhbWVzID0gcFNtZU1nbXRGcm0tPmZyYW1lQnVmOworICAgICAgIHBSb2FtSW5mby5mcmFtZVR5cGUgPSBwU21lTWdtdEZybS0+ZnJhbWVUeXBlOworICAgICAgIHBSb2FtSW5mby5yeENoYW4gICA9IHBTbWVNZ210RnJtLT5yeENoYW47CisKKyAgICAgICAvL1NvbWVob3cgd2UgZG9uJ3QgZ2V0IHRoZSByaWdodCBzZXNzaW9uSWQuCisgICAgICAgZm9yKGkgPSAwOyBpIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVg7IGkrKykKKyAgICAgICB7CisgICAgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBpICkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgLyogZm9yd2FyZCB0aGUgbWdtdCBmcmFtZSB0byBhbGwgYWN0aXZlIHNlc3Npb25zKi8KKyAgICAgICAgICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBpLCAmcFJvYW1JbmZvLCAwLCBlQ1NSX1JPQU1fSU5ESUNBVEVfTUdNVF9GUkFNRSwgMCk7CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIHBSb2FtSW5mby5uRnJhbWVMZW5ndGggPSBwU21lTWdtdEZybS0+bWVzZ0xlbiAtIHNpemVvZih0U2lyU21lTWdtdEZyYW1lSW5kKTsKKyAgICBwUm9hbUluZm8ucGJGcmFtZXMgPSBwU21lTWdtdEZybS0+ZnJhbWVCdWY7CisgICAgcFJvYW1JbmZvLmZyYW1lVHlwZSA9IHBTbWVNZ210RnJtLT5mcmFtZVR5cGU7CisgICAgcFJvYW1JbmZvLnJ4Q2hhbiAgID0gcFNtZU1nbXRGcm0tPnJ4Q2hhbjsKKworICAgIC8qIGZvcndhcmQgdGhlIG1nbXQgZnJhbWUgdG8gSEREICovCisgICAgY3NyUm9hbUNhbGxDYWxsYmFjayhwTWFjLCBTZXNzaW9uSWQsICZwUm9hbUluZm8sIDAsIGVDU1JfUk9BTV9JTkRJQ0FURV9NR01UX0ZSQU1FLCAwKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEhhbmRsZSB0aGUgcmVtYWluIG9uIGNoYW5uZWwgcmVhZHkgaW5kaWNhdGlvbiBmcm9tIFBFCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitlSGFsU3RhdHVzIHNtZV9yZW1haW5PbkNoblJlYWR5KCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTgqIHBNc2cpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgZUhhbFN0YXR1cyAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeSA9IE5VTEw7CisgICAgdFNtZUNtZCAqcENvbW1hbmQgPSBOVUxMOworICAgIHRDc3JSb2FtSW5mbyBSb2FtSW5mbzsgCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAorICAgIHRTaXJTbWVSc3AgKnBSc3AgPSAodFNpclNtZVJzcCAqKXBNc2c7CisgICAgLy9wUnNwLT5zZXNzaW9uSWQgaXMgU01FJ3Mgc2Vzc2lvbiBpbmRleAorICAgIHRBTklfVTggIFAyUFNlc3Npb25JRCA9IGdldFAyUFNlc3Npb25JZEZyb21TTUVTZXNzaW9uSWQocE1hYywgcFJzcC0+c2Vzc2lvbklkKTsKKworICAgIGlmKENTUl9TRVNTSU9OX0lEX0lOVkFMSUQgPT0gUDJQU2Vzc2lvbklEKQorICAgIHsKKyAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisjZW5kaWYKKworICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisgICAgaWYoIHBFbnRyeSApCisgICAgeworICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0U21lQ21kLCBMaW5rKTsKKyAgICAgICAgaWYoIGVTbWVDb21tYW5kUmVtYWluT25DaGFubmVsID09IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAorICAgICAgICAgICAgaWYgKHBNYWMtPnAycENvbnRleHRbUDJQU2Vzc2lvbklEXS5QZWVyRm91bmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcDJwUmVtYWluT25DaGFubmVsUmVhZHlDYWxsYmFjayhwTWFjLCAmcE1hYy0+cDJwQ29udGV4dFtQMlBTZXNzaW9uSURdLCBlSEFMX1NUQVRVU19TVUNDRVNTKTsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAvKiBmb3J3YXJkIHRoZSBpbmRpY2F0aW9uIHRvIEhERCAqLworICAgICAgICAgICAgUm9hbUluZm8ucFJlbWFpbkN0eCA9IHBDb21tYW5kLT51LnJlbWFpbkNobENtZC5jYWxsYmFja0N0eDsKKyAgICAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgKCh0U2lyU21lUnNwKilwTXNnKS0+c2Vzc2lvbklkLCAmUm9hbUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBlQ1NSX1JPQU1fUkVNQUlOX0NIQU5fUkVBRFksIDApOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworZUhhbFN0YXR1cyBzbWVfc2VuZEFjdGlvbkNuZiggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4KiBwTXNnKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICBlSGFsU3RhdHVzICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdENzclJvYW1JbmZvIFJvYW1JbmZvOworICAgdFNpclNtZVJzcCogcFNtZVJzcCA9ICh0U2lyU21lUnNwKilwTXNnOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAorICAgdFNpclJlc3VsdENvZGVzIHJzcFN0YXR1cyA9IHBTbWVSc3AtPnN0YXR1c0NvZGU7CisgICB0QU5JX1U4IEhERHNlc3Npb25JZCA9IGdldFAyUFNlc3Npb25JZEZyb21TTUVTZXNzaW9uSWQocE1hYywgcFNtZVJzcC0+c2Vzc2lvbklkKTsKKyAgIHRBTklfVTggKnBCdWYgPSBOVUxMOworICAgdHAycENvbnRleHQgKnBQMnBDb250ZXh0OworCisgICBpZihDU1JfU0VTU0lPTl9JRF9JTlZBTElEID09IEhERHNlc3Npb25JZCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiAlcyBmYWlsIHRvIGdldCBIREQgc2Vzc2lvbklEIChTTUVTZXNzaW9uSUQgJWQpIiwgX19GVU5DVElPTl9fLCBwU21lUnNwLT5zZXNzaW9uSWQpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgfQorCisgICBwUDJwQ29udGV4dCA9ICZwTWFjLT5wMnBDb250ZXh0W0hERHNlc3Npb25JZF07CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyBzdGF0dXMgJWQgQWN0aW9uIEZyYW1lICVkIGFjdGlvbkZyYW1lVGltZW91dCAlZFxuIiwgCisgICAgICAgICBfX0ZVTkNUSU9OX18sIHBTbWVSc3AtPnN0YXR1c0NvZGUsIHBQMnBDb250ZXh0LT5hY3Rpb25GcmFtZVR5cGUKKyAgICAgICAgICwgcFAycENvbnRleHQtPmFjdGlvbkZyYW1lVGltZW91dCk7CisgICB2b3NfbWVtX3plcm8oJlJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisKKyAgIGlmIChwU21lUnNwLT5zdGF0dXNDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MgJiYgIXBQMnBDb250ZXh0LT5hY3Rpb25GcmFtZVRpbWVvdXQKKyAgICAgICAgICYmIHBQMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIEFjdGlvbiBmcmFtZTpBY2sgbm90IHJlY2VpdmVkLiBSZXRyYW5zbWl0dGluZ1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgaWYoTlVMTCA9PSBwUDJwQ29udGV4dC0+cE5leHRBY3Rpb25Gcm0pCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBQMnBDb250ZXh0LT5yZXRyeUFjdGlvbkZyYW1lVGltZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0ZSQU1FX1JFVFJZX1RJTUVPVVQgKiBQQUxfVElNRVJfVE9fTVNfVU5JVCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiAlcyBmYWlsIHRvIHN0YXJ0IHJldHJ5QWN0aW9uRnJhbWVUaW1lckhhbmRsZXJcbiIsIAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwUDJwQ29udGV4dC0+TmV4dEFjdGlvbkZyYW1lVHlwZSk7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgfQorICAgICAgLy9JbiBjYXNlIGlmIHRoZXJlIGlzIG5ldyBmcmFtZSB0byBzZW5kLCBmaW5pc2ggdGhlIGN1cnJlbnQgZnJhbWUKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiICVzIHNlbmQgbmV4dCBhY3Rpb24gZnJhbWUgdHlwZSAlZCBMYXN0IGZyYW1lIHN0YXR1cyAoJWQpIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcnNwU3RhdHVzKTsKKyAgICAgICAgIC8vRm9yY2UgaXQgdG8gYmUgc3VjY2VzcworICAgICAgICAgcnNwU3RhdHVzID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHBQMnBDb250ZXh0LT5hY3Rpb25GcmFtZVRpbWVyKQorICAgeworICAgICAgc3RhdHVzID0gcGFsVGltZXJTdG9wKHBNYWMsIHBQMnBDb250ZXh0LT5hY3Rpb25GcmFtZVRpbWVyKTsKKyAgIH0KKworICAgaWYgKHBQMnBDb250ZXh0LT5yZXRyeUFjdGlvbkZyYW1lVGltZXIpCisgICB7CisgICAgICBzdGF0dXMgPSBwYWxUaW1lclN0b3AocE1hYywgcFAycENvbnRleHQtPnJldHJ5QWN0aW9uRnJhbWVUaW1lcik7CisgICB9CisKKyAgIGlmKHBQMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lKQorICAgeworICAgICAgY3NyUm9hbUNhbGxDYWxsYmFjaygodHBBbmlTaXJHbG9iYWwpcFAycENvbnRleHQtPmhIYWwsIAorICAgICAgICAgICAgICAgICAgICAgcFAycENvbnRleHQtPlNNRXNlc3Npb25JZCwgJlJvYW1JbmZvLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9TRU5EX0FDVElPTl9DTkYsIAorICAgICAgICAgICAgICAgICAgICAgKChyc3BTdGF0dXMgPT0gZVNJUl9TTUVfU1VDQ0VTUykgPyAKKyAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfTk9ORTogZUNTUl9ST0FNX1JFU1VMVF9TRU5EX0FDVElPTl9GQUlMKSk7CisgICB9CisKKyAgIGlmKFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3Nfc3Bpbl9sb2NrX2FjcXVpcmUoJnBQMnBDb250ZXh0LT5sU3RhdGUpKSkKKyAgIHsKKyAgICAgIGlmKHBQMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lKQorICAgICAgeworICAgICAgICAgcEJ1ZiA9IHBQMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lOworICAgICAgICAgcFAycENvbnRleHQtPnBTZW50QWN0aW9uRnJhbWUgPSBOVUxMOworICAgICAgfQorICAgICAgdm9zX3NwaW5fbG9ja19yZWxlYXNlKCZwUDJwQ29udGV4dC0+bFN0YXRlKTsKKworICAgICAgaWYoTlVMTCAhPSBwQnVmKQorICAgICAgeworICAgICAgICAgdm9zX21lbV9mcmVlKHBCdWYpOworICAgICAgICAgcEJ1ZiA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9XQVJOLCAiJXMgcFNlbnRBY3Rpb25GcmFtZSBpcyBudWxsIFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIH0KKyAgICAgIGlmKHBQMnBDb250ZXh0LT5wTmV4dEFjdGlvbkZybSkKKyAgICAgIHsKKyAgICAgICAgIC8vbmVlZCB0byBzZW5kIHRoZSBuZXh0IGFjdGlvbiBmcmFtZQorICAgICAgICAgcFAycENvbnRleHQtPnBTZW50QWN0aW9uRnJhbWUgPSBwUDJwQ29udGV4dC0+cE5leHRBY3Rpb25Gcm07CisgICAgICAgICBwUDJwQ29udGV4dC0+QWN0aW9uRnJhbWVMZW4gPSBwUDJwQ29udGV4dC0+bk5leHRGcm1MZW47CisgICAgICAgICBwUDJwQ29udGV4dC0+YWN0aW9uRnJhbWVUeXBlID0gcFAycENvbnRleHQtPk5leHRBY3Rpb25GcmFtZVR5cGU7CisgICAgICAgICBwUDJwQ29udGV4dC0+cE5leHRBY3Rpb25Gcm0gPSBOVUxMOworICAgICAgICAgcFAycENvbnRleHQtPkFjdGlvbkZyYW1lU2VuZFRpbWVvdXQgPSBwUDJwQ29udGV4dC0+bk5leHRGcmFtZVRpbWVPdXQ7CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIGNhbm5vdCBnZXQgbG9jazEiLCBfX0ZVTkNUSU9OX18pOworICAgfQorCisgICBpZihOVUxMICE9IHBQMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiBzZW5kaW5nIG5leHQgZnJhbWUgJWQgdHlwZVxuIiwgCisgICAgICAgICAgICAgICAgICBwUDJwQ29udGV4dC0+TmV4dEFjdGlvbkZyYW1lVHlwZSk7CisgICAgICBzdGF0dXMgPSBwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBQMnBDb250ZXh0LT5hY3Rpb25GcmFtZVRpbWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQMnBDb250ZXh0LT5BY3Rpb25GcmFtZVNlbmRUaW1lb3V0ICogUEFMX1RJTUVSX1RPX01TX1VOSVQsIGVBTklfQk9PTEVBTl9GQUxTRSk7CisgICAgICBpZiAoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgeworICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgJXMgZmFpbCB0byBzdGFydCB0aW1lciBzdGF0dXMgJWQiKSwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworICAgICAgICAgLy9XaXRob3V0IHRoZSB0aW1lciB3ZSBjYW5ub3QgY29udGludWUKKyAgICAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2soKHRwQW5pU2lyR2xvYmFsKXBQMnBDb250ZXh0LT5oSGFsLCAKKyAgICAgICAgICAgICAgICAgICAgIHBQMnBDb250ZXh0LT5TTUVzZXNzaW9uSWQsICZSb2FtSW5mbywgMCwgCisgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fU0VORF9BQ1RJT05fQ05GLCAKKyAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfU0VORF9BQ1RJT05fRkFJTCk7CisgICAgICAgICB2b3Nfc3Bpbl9sb2NrX2FjcXVpcmUoJnBQMnBDb250ZXh0LT5sU3RhdGUpOworICAgICAgICAgcEJ1ZiA9IHBQMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lOworICAgICAgICAgcFAycENvbnRleHQtPnBTZW50QWN0aW9uRnJhbWUgPSBOVUxMOworICAgICAgICAgdm9zX3NwaW5fbG9ja19yZWxlYXNlKCZwUDJwQ29udGV4dC0+bFN0YXRlKTsKKyAgICAgICAgIHZvc19tZW1fZnJlZShwQnVmKTsKKyAgICAgICAgIHBCdWYgPSBOVUxMOworICAgICAgICAgcDJwRnNtKHBQMnBDb250ZXh0LCBlUDJQX1RSSUdHRVJfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisgICAgICBzdGF0dXMgPSBwMnBTZW5kQWN0aW9uRnJhbWUocE1hYywgcFAycENvbnRleHQtPnNlc3Npb25JZCwgcFAycENvbnRleHQtPmFjdGlvbkZyYW1lVHlwZSk7CisgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiBzZW5kaW5nIG5leHQgZnJhbWUgJWQgdHlwZVxuIiwgCisgICAgICAgICAgICAgICAgICBwUDJwQ29udGV4dC0+TmV4dEFjdGlvbkZyYW1lVHlwZSk7CisgICAgICAgICBzdGF0dXMgPSBwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBQMnBDb250ZXh0LT5yZXRyeUFjdGlvbkZyYW1lVGltZXIsIAorICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0ZSQU1FX1JFVFJZX1RJTUVPVVQgKiBQQUxfVElNRVJfVE9fTVNfVU5JVCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiAlcyBmYWlsIHRvIHN0YXJ0IHJldHJ5QWN0aW9uRnJhbWVUaW1lckhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwMnBGc20ocFAycENvbnRleHQsIGVQMlBfVFJJR0dFUl9ESVNDT05ORUNURUQpOworICAgfQorICAgIAorI2Vsc2UgIAorICAgIC8qIGZvcndhcmQgdGhlIGluZGljYXRpb24gdG8gSEREICovCisgICAgLy9Sb2FtSW5mbyBjYW4gYmUgcGFzc2VkIGFzIE5VTEwuLi4udG9kbworICAgIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgcFNtZVJzcC0+c2Vzc2lvbklkLCAmUm9hbUluZm8sIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1NFTkRfQUNUSU9OX0NORiwgCisgICAgICAgICAgICAgICAgICAgICAgIChwU21lUnNwLT5zdGF0dXNDb2RlID09IGVTSVJfU01FX1NVQ0NFU1MpID8gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfU0VORF9BQ1RJT05fRkFJTCk7CisjZW5kaWYgICAgCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAordm9pZCBwMnBSZXNldENvbnRleHQodHAycENvbnRleHQgKnBQMnBDb250ZXh0KQoreworICAgaWYoTlVMTCAhPSBwUDJwQ29udGV4dCkKKyAgIHsKKyAgICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChwUDJwQ29udGV4dC0+aEhhbCk7CisgICAgICBpbnQgaTsKKworICAgICAgLy9XaGVuIGl0IGlzIHJlc2V0dGluZyBhIEdPIG9yIGNsaWVudCBzZXNzaW9uLCB3ZQorICAgICAgLy9uZWVkIHRvIHJlc2V0IHRoZSBncm91cCBjYXBhYmlsaXR5IGJhY2sgdG8gdGhlIG9yaWdpbmFsIG9uZQorICAgICAgaWYoIChPUEVSQVRJT05fTU9ERV9QMlBfR1JPVVBfT1dORVIgPT0gcFAycENvbnRleHQtPm9wZXJhdGluZ21vZGUpIHx8CisgICAgICAgICAoT1BFUkFUSU9OX01PREVfUDJQX0NMSUVOVCA9PSBwUDJwQ29udGV4dC0+b3BlcmF0aW5nbW9kZSkgKQorICAgICAgeworICAgICAgICAgZm9yKCBpID0gMDsgaSA8IE1BWF9OT19PRl9QMlBfU0VTU0lPTlM7IGkrKyApCisgICAgICAgICB7CisgICAgICAgICAgICBpZihPUEVSQVRJT05fTU9ERV9QMlBfREVWSUNFID09IHBNYWMtPnAycENvbnRleHRbaV0ub3BlcmF0aW5nbW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGdQMlBJZVtpXS5wMnBDYXBhYmlsaXR5QXR0cmliLmdyb3VwQ2FwYWJpbGl0eSA9IHBNYWMtPnAycENvbnRleHRbaV0uT3JpZ2luYWxHcm91cENhcGFiaWxpdHk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHBQMnBDb250ZXh0LT5zdGF0ZSA9IGVQMlBfU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgcFAycENvbnRleHQtPmN1cnJlbnRTZWFyY2hJbmRleCA9IDA7CisgICAgICBwUDJwQ29udGV4dC0+bGlzdGVuSW5kZXggPSAxOworCisgICAgICBwUDJwQ29udGV4dC0+YWN0aW9uRnJhbWVUeXBlID0gZVAyUF9JTlZBTElEX0ZSTTsKKworICAgICAgcFAycENvbnRleHQtPmRpYWxvZ1Rva2VuID0gMDsKKyAgICAgIHBQMnBDb250ZXh0LT5QZWVyRm91bmQgPSBGQUxTRTsKKyAgICAgIHBQMnBDb250ZXh0LT5Hcm91cEZvcm1hdGlvblBlbmRpbmcgPSBGQUxTRTsKKyAgICAgIHBQMnBDb250ZXh0LT5kaXJlY3RlZERpc2NvdmVyeSA9IEZBTFNFOworICAgICAgcFAycENvbnRleHQtPmxpc3RlbkRpc2NvdmVyYWJsZVN0YXRlID0gZVN0YXRlRGlzYWJsZWQ7CisKKworICAgICAgaWYocFAycENvbnRleHQtPnBTZW50QWN0aW9uRnJhbWUpCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUocFAycENvbnRleHQtPnBTZW50QWN0aW9uRnJhbWUpOworICAgICAgICAgcFAycENvbnRleHQtPnBTZW50QWN0aW9uRnJhbWUgPSBOVUxMOworICAgICAgfQorICAgICAgaWYocFAycENvbnRleHQtPnBOZXh0QWN0aW9uRnJtKQorICAgICAgeworICAgICAgICAgdm9zX21lbV9mcmVlKHBQMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lKTsKKyAgICAgICAgIHBQMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lID0gTlVMTDsKKyAgICAgIH0gICAgICAKKyAgICAgIGlmKCBwUDJwQ29udGV4dC0+cHJvYmVSc3BJZSApCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUoIHBQMnBDb250ZXh0LT5wcm9iZVJzcEllICk7CisgICAgICAgICBwUDJwQ29udGV4dC0+cHJvYmVSc3BJZSA9IE5VTEw7CisgICAgICAgICBwUDJwQ29udGV4dC0+cHJvYmVSc3BJZUxlbmd0aCA9IDA7CisgICAgICB9CisKKyAgICAgIGlmKCBwUDJwQ29udGV4dC0+RGlzY292ZXJSZXFJZUZpZWxkICkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZShwUDJwQ29udGV4dC0+RGlzY292ZXJSZXFJZUZpZWxkICk7CisgICAgICAgICBwUDJwQ29udGV4dC0+RGlzY292ZXJSZXFJZUZpZWxkID0gTlVMTDsKKyAgICAgICAgIHBQMnBDb250ZXh0LT5EaXNjb3ZlclJlcUllTGVuZ3RoID0gMDsKKyAgICAgIH0KKworICAgICAgaWYoIHBQMnBDb250ZXh0LT5Hb05lZ29DbmZJZUZpZWxkICkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZSggcFAycENvbnRleHQtPkdvTmVnb0NuZkllRmllbGQpOworICAgICAgICAgcFAycENvbnRleHQtPkdvTmVnb0NuZkllRmllbGQgPSBOVUxMOworICAgICAgICAgcFAycENvbnRleHQtPkdvTmVnb0NuZkllTGVuZ3RoID0gMDsKKyAgICAgIH0KKworICAgICAgaWYoIHBQMnBDb250ZXh0LT5Hb05lZ29SZXFJZUZpZWxkICkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZSggcFAycENvbnRleHQtPkdvTmVnb1JlcUllRmllbGQgKTsKKyAgICAgICAgIHBQMnBDb250ZXh0LT5Hb05lZ29SZXFJZUZpZWxkID0gTlVMTDsKKyAgICAgICAgIHBQMnBDb250ZXh0LT5Hb05lZ29SZXFJZUxlbmd0aCA9IDA7CisgICAgICB9CisKKyAgICAgIGlmKCBwUDJwQ29udGV4dC0+R29OZWdvUmVzSWVGaWVsZCApCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUoIHBQMnBDb250ZXh0LT5Hb05lZ29SZXNJZUZpZWxkICk7CisgICAgICAgICBwUDJwQ29udGV4dC0+R29OZWdvUmVzSWVGaWVsZCA9IE5VTEw7CisgICAgICAgICBwUDJwQ29udGV4dC0+R29OZWdvUmVzSWVMZW5ndGggPSAwOworICAgICAgfQorCisgICAgICBpZiggcFAycENvbnRleHQtPlByb3ZEaXNjUmVxSWVGaWVsZCApCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUoIHBQMnBDb250ZXh0LT5Qcm92RGlzY1JlcUllRmllbGQgKTsKKyAgICAgICAgIHBQMnBDb250ZXh0LT5Qcm92RGlzY1JlcUllRmllbGQgPSBOVUxMOworICAgICAgICAgcFAycENvbnRleHQtPlByb3ZEaXNjUmVxSWVMZW5ndGggPSAwOworICAgICAgfQorCisgICAgICBpZiggcFAycENvbnRleHQtPlByb3ZEaXNjUmVzSWVGaWVsZCApCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUoIHBQMnBDb250ZXh0LT5Qcm92RGlzY1Jlc0llRmllbGQgKTsKKyAgICAgICAgIHBQMnBDb250ZXh0LT5Qcm92RGlzY1Jlc0llTGVuZ3RoID0gMDsKKyAgICAgICAgIHBQMnBDb250ZXh0LT5Qcm92RGlzY1Jlc0llRmllbGQgPSBOVUxMOworICAgICAgfQorCisgICAgICBpZiAocFAycENvbnRleHQtPmFjdGlvbkZyYW1lVGltZXIpCisgICAgICB7CisgICAgICAgICBwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcFAycENvbnRleHQtPmFjdGlvbkZyYW1lVGltZXIpOworICAgICAgfQorCisgICAgICBpZiAocFAycENvbnRleHQtPmRpc2NvdmVyVGltZXIpCisgICAgICB7CisgICAgICAgICBwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcFAycENvbnRleHQtPmRpc2NvdmVyVGltZXIpOworICAgICAgfQorCisgICAgICBpZiAocFAycENvbnRleHQtPmxpc3RlblRpbWVySGFuZGxlcikKKyAgICAgIHsKKyAgICAgICAgIHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwUDJwQ29udGV4dC0+bGlzdGVuVGltZXJIYW5kbGVyKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBQMnBDb250ZXh0LT5XUFNSZWdpc3RyYXJDaGVja1RpbWVySGFuZGxlcikKKyAgICAgIHsKKyAgICAgICAgIHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwUDJwQ29udGV4dC0+V1BTUmVnaXN0cmFyQ2hlY2tUaW1lckhhbmRsZXIpOworICAgICAgfQorCisgICAgICBpZiAocFAycENvbnRleHQtPmRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyKQorICAgICAgeworICAgICAgICAgcFAycENvbnRleHQtPnVOdW1EZXZpY2VGaWx0ZXJBbGxvY2F0ZWQgPSAwOworICAgICAgICAgdm9zX21lbV9mcmVlKHBQMnBDb250ZXh0LT5kaXJlY3RlZERpc2NvdmVyeUZpbHRlcik7CisgICAgICAgICBwUDJwQ29udGV4dC0+ZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXIgPSBOVUxMOworICAgICAgfQorCisgICAgICB2b3NfbWVtX3plcm8ocFAycENvbnRleHQtPnBlZXJNYWNBZGRyZXNzLCBQMlBfTUFDX0FERFJFU1NfTEVOKTsKKyAgIH0KK30KKyNlbmRpZiAgICAKKworCitlSGFsU3RhdHVzIHNtZV9wMnBPcGVuKCB0SGFsSGFuZGxlIGhIYWwgKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUF9JTlRFUk5BTAorICAgaW50IGk7CisgICB0cDJwQ29udGV4dCAqcFAycENvbnRleHQ7CisKKyAgIGZvciAoIGk9MDsgaSA8IE1BWF9OT19PRl9QMlBfU0VTU0lPTlM7IGkrKyApIAorICAgeworICAgICAgcFAycENvbnRleHQgPSAmcE1hYy0+cDJwQ29udGV4dFtpXTsKKyAgICAgIHBQMnBDb250ZXh0LT5oSGFsID0gaEhhbDsKKworICAgICAgcFAycENvbnRleHQtPnNvY2lhbENoYW5uZWxbMF0gPSAxOworICAgICAgcFAycENvbnRleHQtPnNvY2lhbENoYW5uZWxbMV0gPSA2OworICAgICAgcFAycENvbnRleHQtPnNvY2lhbENoYW5uZWxbMl0gPSAxMTsKKworICAgICAgdm9zX3NwaW5fbG9ja19pbml0KCZwUDJwQ29udGV4dC0+bFN0YXRlKTsKKworICAgICAgcDJwUmVzZXRDb250ZXh0KHBQMnBDb250ZXh0KTsKKworICAgICAgc3RhdHVzID0gcGFsVGltZXJBbGxvYyhwTWFjLT5oSGRkLCAmcFAycENvbnRleHQtPmFjdGlvbkZyYW1lVGltZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJwQWN0aW9uRnJhbWVUaW1lckhhbmRsZXIsIHBQMnBDb250ZXh0KTsKKyAgICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICB7CisgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiAlcyBmYWlsIHRvIGFsbG9jIGFjdGlvbkZyYW1lIHRpbWVyIGZvciBzZXNzaW9uICVkXG4iLCBfX0ZVTkNUSU9OX18sIGkpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBzdGF0dXMgPSBwYWxUaW1lckFsbG9jKHBNYWMtPmhIZGQsICZwUDJwQ29udGV4dC0+bGlzdGVuVGltZXJIYW5kbGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAycExpc3RlbkRpc2NvdmVyVGltZXJIYW5kbGVyLCBwUDJwQ29udGV4dCk7CisgICAgICBpZiAoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgeworICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICIgJXMgZmFpbCB0byBhbGxvYyBsaXN0ZW4gdGltZXIgZm9yIHNlc3Npb24gJWRcbiIsIF9fRlVOQ1RJT05fXywgaSk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0gCisgICAgICBzdGF0dXMgPSBwYWxUaW1lckFsbG9jKHBNYWMtPmhIZGQsICZwUDJwQ29udGV4dC0+ZGlzY292ZXJUaW1lciwgcDJwRGlzY292ZXJUaW1lckhhbmRsZXIsIHBQMnBDb250ZXh0KTsKKyAgICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICB7CisgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiAlcyBmYWlsIHRvIGFsbG9jIGRpc2NvdmVyIHRpbWVyIGZvciBzZXNzaW9uICVkXG4iLCBfX0ZVTkNUSU9OX18sIGkpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHN0YXR1cyA9IHBhbFRpbWVyQWxsb2MocE1hYy0+aEhkZCwgJnBQMnBDb250ZXh0LT5yZXRyeUFjdGlvbkZyYW1lVGltZXIsIAorICAgICAgICAgICAgICAgICAgICAgcDJwUmV0cnlBY3Rpb25GcmFtZVRpbWVySGFuZGxlciwgcFAycENvbnRleHQpOworICAgICAgaWYgKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiICVzIGZhaWwgdG8gYWxsb2MgcmV0cnlBY3Rpb25GcmFtZVRpbWVySGFuZGxlciB0aW1lciBmb3Igc2Vzc2lvbiAlZFxuIiwgX19GVU5DVElPTl9fLCBpKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwMnBDcmVhdGVEZWZhdWx0SUVzKGhIYWwsIGkpOworICAgfQorI2Vsc2UKKyAgIC8vSWYgc3RhdGljIHN0cnVjdHVyZSBpcyB0b28gYmlnLCBOZWVkIHRvIGNoYW5nZSB0aGlzIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBkeW5hbWljYWxseQorICAgdm9zX21lbV96ZXJvKCAmcE1hYy0+cDJwQ29udGV4dCwgc2l6ZW9mKCB0cDJwQ29udGV4dCApICk7CisjZW5kaWYKKworICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgc21lX3AycENsb3NlKGhIYWwpOworICAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworCitlSGFsU3RhdHVzIHAycFN0b3AoIHRIYWxIYW5kbGUgaEhhbCApCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisgICBpbnQgaTsKKworICAgZm9yICggaSA9IDA7IGkgPCBNQVhfTk9fT0ZfUDJQX1NFU1NJT05TOyBpKysgKSAKKyAgIHsKKyAgICAgIHAycENsb3NlU2Vzc2lvbihwTWFjLCBpKTsKKyAgIH0KKyNlbHNlICAKKyAgIGlmKCBwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWUgKQorICAgeworICAgICAgdm9zX21lbV9mcmVlKCBwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWUgKTsKKyAgICAgIHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSA9IE5VTEw7CisgICB9CisgIAorICAgcE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllTGVuZ3RoID0gMDsKKyNlbmRpZgorCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCitlSGFsU3RhdHVzIHNtZV9wMnBDbG9zZSggdEhhbEhhbmRsZSBoSGFsICkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfSU5URVJOQUwKKyAgIHRwMnBDb250ZXh0ICpwQ29udGV4dDsKKyAgIGludCBpOworCisgICBwMnBTdG9wKGhIYWwpOworCisgICBmb3IgKCBpID0gMDsgaSA8IE1BWF9OT19PRl9QMlBfU0VTU0lPTlM7IGkrKyApIAorICAgeworICAgICAgcDJwQ2xvc2VTZXNzaW9uKHBNYWMsIGkpOworICAgICAgcENvbnRleHQgPSAmcE1hYy0+cDJwQ29udGV4dFtpXTsKKyAgICAgIGlmIChwQ29udGV4dC0+YWN0aW9uRnJhbWVUaW1lcikKKyAgICAgIHsKKyAgICAgICAgIHBhbFRpbWVyRnJlZShoSGFsLCBwQ29udGV4dC0+YWN0aW9uRnJhbWVUaW1lcik7CisgICAgICAgICBwQ29udGV4dC0+YWN0aW9uRnJhbWVUaW1lciA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGlmIChwQ29udGV4dC0+ZGlzY292ZXJUaW1lcikKKyAgICAgIHsKKyAgICAgICAgIHBhbFRpbWVyRnJlZShoSGFsLCBwQ29udGV4dC0+ZGlzY292ZXJUaW1lcik7CisgICAgICAgICBwQ29udGV4dC0+ZGlzY292ZXJUaW1lciA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGlmIChwQ29udGV4dC0+bGlzdGVuVGltZXJIYW5kbGVyKQorICAgICAgeworICAgICAgICAgcGFsVGltZXJGcmVlKGhIYWwsIHBDb250ZXh0LT5saXN0ZW5UaW1lckhhbmRsZXIpOworICAgICAgICAgcENvbnRleHQtPmxpc3RlblRpbWVySGFuZGxlciA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGlmIChwQ29udGV4dC0+V1BTUmVnaXN0cmFyQ2hlY2tUaW1lckhhbmRsZXIpCisgICAgICB7CisgICAgICAgICBwYWxUaW1lckZyZWUoaEhhbCwgcENvbnRleHQtPldQU1JlZ2lzdHJhckNoZWNrVGltZXJIYW5kbGVyKTsKKyAgICAgICAgIHBDb250ZXh0LT5XUFNSZWdpc3RyYXJDaGVja1RpbWVySGFuZGxlciA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIHZvc19zcGluX2xvY2tfZGVzdHJveSgmcENvbnRleHQtPmxTdGF0ZSk7CisgICB9CisjZWxzZSAgCisgICAgaWYoIHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSApCisgICAgeworICAgICAgICB2b3NfbWVtX2ZyZWUoIHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSApOworICAgICAgICBwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWUgPSBOVUxMOworICAgIH0KKyAgCisgICAgcE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllTGVuZ3RoID0gMDsKKyNlbmRpZgorCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCit0U2lyUkZCYW5kIEdldFJGQmFuZCh0QU5JX1U4IGNoYW5uZWwpCit7CisgICAgaWYgKChjaGFubmVsID49IFNJUl8xMUFfQ0hBTk5FTF9CRUdJTikgJiYKKyAgICAgICAgKGNoYW5uZWwgPD0gU0lSXzExQV9DSEFOTkVMX0VORCkpCisgICAgICAgIHJldHVybiBTSVJfQkFORF81X0dIWjsKKworICAgIGlmICgoY2hhbm5lbCA+PSBTSVJfMTFCX0NIQU5ORUxfQkVHSU4pICYmCisgICAgICAgIChjaGFubmVsIDw9IFNJUl8xMUJfQ0hBTk5FTF9FTkQpKQorICAgICAgICByZXR1cm4gU0lSX0JBTkRfMl80X0dIWjsKKworICAgIHJldHVybiBTSVJfQkFORF9VTktOT1dOOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBwMnBSZW1haW5PbkNoYW5uZWwKKyAgICBcYnJpZWYgIEFQSSB0byBwb3N0IHRoZSByZW1haW4gb24gY2hhbm5lbCBjb21tYW5kLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHNlc3NpbklkIC0gSEREIHNlc3Npb24gSUQuCisgICAgXHBhcmFtICBjaGFubmVsIC0gQ2hhbm5lbCB0byByZW1haW4gb24gY2hhbm5lbC4KKyAgICBccGFyYW0gIGR1cmF0aW9uIC0gRHVyYXRpb24gZm9yIHdoaWNoIHdlIHNob3VsZCByZW1haW4gb24gY2hhbm5lbAorICAgIFxwYXJhbSAgY2FsbGJhY2sgLSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICBccGFyYW0gIHBDb250ZXh0IC0gYXJndW1lbnQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHAycFJlbWFpbk9uQ2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgdEFOSV9VOCBjaGFubmVsLCB0QU5JX1UzMiBkdXJhdGlvbiwKKyAgICAgICAgcmVtYWluT25DaGFuQ2FsbGJhY2sgY2FsbGJhY2ssIAorICAgICAgICB2b2lkICpwQ29udGV4dAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfSU5URVJOQUwKKyAgICAgICAgLCBlUDJQUmVtYWluT25DaG5SZWFzb24gcmVhc29uCisjZW5kaWYKKyAgICAgICAgKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdFNtZUNtZCAqcFJlbWFpbkNobENtZCA9IE5VTEw7CisgICAgdEFOSV9VMzIgcGh5TW9kZTsKKyAgCisgICAgcFJlbWFpbkNobENtZCA9IHNtZUdldENvbW1hbmRCdWZmZXIocE1hYyk7CisgICAgaWYocFJlbWFpbkNobENtZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgCisgICAgaWYgKFNJUl9CQU5EXzVfR0haID09IEdldFJGQmFuZChjaGFubmVsKSkKKyAgICB7CisgICAgICAgcGh5TW9kZSA9IFdOSV9DRkdfUEhZX01PREVfMTFBOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHBoeU1vZGUgPSBXTklfQ0ZHX1BIWV9NT0RFXzExRzsKKyAgICB9CisgICAgCisgICAgY2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfUEhZX01PREUsIHBoeU1vZGUpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGNhbGwgc2V0IGluIGNvbnRleHQgKi8KKyAgICAgICAgcFJlbWFpbkNobENtZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kUmVtYWluT25DaGFubmVsOworICAgICAgICBwUmVtYWluQ2hsQ21kLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgIHBSZW1haW5DaGxDbWQtPnUucmVtYWluQ2hsQ21kLmNobiA9IGNoYW5uZWw7CisgICAgICAgIHBSZW1haW5DaGxDbWQtPnUucmVtYWluQ2hsQ21kLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIHBSZW1haW5DaGxDbWQtPnUucmVtYWluQ2hsQ21kLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIHBSZW1haW5DaGxDbWQtPnUucmVtYWluQ2hsQ21kLmNhbGxiYWNrQ3R4ID0gcENvbnRleHQ7CisgICAgCisgICAgICAgIC8vUHV0IGl0IGF0IHRoZSBoZWFkIG9mIHRoZSBRIGlmIHdlIGp1c3QgZmluaXNoIGZpbmRpbmcgdGhlIHBlZXIgYW5kIHJlYWR5IHRvIHNlbmQgYSBmcmFtZQorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlBfSU5URVJOQUwKKyAgICAgICAgc21lUHVzaENvbW1hbmQocE1hYywgcFJlbWFpbkNobENtZCwgKGVQMlBSZW1haW5PbkNoblJlYXNvblNlbmRGcmFtZSA9PSByZWFzb24pKTsKKyNlbHNlCisgICAgICAgIGNzclF1ZXVlU21lQ29tbWFuZChwTWFjLCBwUmVtYWluQ2hsQ21kLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworI2VuZGlmCisgICAgfSB3aGlsZSgwKTsKKyAgCisgICAgc21zTG9nKHBNYWMsIExPR1csICJleGl0aW5nIGZ1bmN0aW9uICVzXG4iLCBfX0ZVTkNUSU9OX18pOworICAKKyAgICByZXR1cm4oc3RhdHVzKTsKK30KKworZUhhbFN0YXR1cyBwMnBTZW5kQWN0aW9uKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICBjb25zdCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBsZW4pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICB0U2lyTWJNc2dQMnAgKnBNc2c7CisgICAgdEFOSV9VMTYgbXNnTGVuOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgIiAlcyBzZW5kcyBhY3Rpb24gZnJhbWUiLCBfX0ZVTkNUSU9OX18pOworICAgIG1zZ0xlbiA9ICh0QU5JX1UxNikoKHNpemVvZiggdFNpck1iTXNnICkpICsgbGVuKTsKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgbXNnTGVuKTsKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKilwTXNnLCBtc2dMZW4pOworICAgICAgICBwTXNnLT50eXBlID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNillV05JX1NNRV9TRU5EX0FDVElPTl9GUkFNRV9JTkQpOworICAgICAgICBwTXNnLT5tc2dMZW4gPSBwYWxfY3B1X3RvX2JlMTYobXNnTGVuKTsKKyAgICAgICAgcE1zZy0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTXNnLT5kYXRhLCBwQnVmLCBsZW4gKTsgCisgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorCitlSGFsU3RhdHVzIHAycENhbmNlbFJlbWFpbk9uQ2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdFNpck1iTXNnICpwTXNnOworICAgIHRBTklfVTE2IG1zZ0xlbjsKKworICAgIC8vTmVlZCB0byBjaGVjayBzZXNzaW9uIElEIHRvIHN1cHBvcnQgY29uY3VycmVuY3kKKworICAgIG1zZ0xlbiA9ICh0QU5JX1UxNikoc2l6ZW9mKCB0U2lyTWJNc2cgKSk7CisgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIG1zZ0xlbik7CisgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgeworICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopcE1zZywgbXNnTGVuKTsKKyAgICAgICAgcE1zZy0+dHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfQUJPUlRfUkVNQUlOX09OX0NIQU5fSU5EKTsKKyAgICAgICAgcE1zZy0+bXNnTGVuID0gcGFsX2NwdV90b19iZTE2KG1zZ0xlbik7CisgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorCitlSGFsU3RhdHVzIHAycFNldFBzKHRIYWxIYW5kbGUgaEhhbCwgdFAycFBzQ29uZmlnICpwTm9BKQoreworICAgIHRwUDJwUHNDb25maWcgcE5vQVBhcmFtOworICAgIHRTaXJNc2dRIG1zZzsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCoqKSZwTm9BUGFyYW0sIHNpemVvZih0UDJwUHNDb25maWcpKTsKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE5vQVBhcmFtLCBzaXplb2YodFAycFBzQ29uZmlnKSk7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE5vQVBhcmFtLCBwTm9BLCBzaXplb2YodFAycFBzQ29uZmlnKSk7IAorICAgICAgICBtc2cudHlwZSA9IGVXTklfU01FX1VQREFURV9OT0E7CisgICAgICAgIG1zZy5ib2R5dmFsID0gMDsKKyAgICAgICAgbXNnLmJvZHlwdHIgPSBwTm9BUGFyYW07CisgICAgICAgIGxpbVBvc3RNc2dBcGkocE1hYywgJm1zZyk7CisgICAgfSAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCitlSGFsU3RhdHVzIHAycEdldENvbmZpZ1BhcmFtKHRIYWxIYW5kbGUgaEhhbCwgdFAyUENvbmZpZ1BhcmFtICpwUGFyYW0pCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICBpZihwUGFyYW0pCisgICB7CisgICAgICBwUGFyYW0tPlAyUExpc3RlbkNoYW5uZWwgPSBwTWFjLT5wMnBDb250ZXh0WzBdLlAyUExpc3RlbkNoYW5uZWw7CisgICAgICBwUGFyYW0tPlAyUE9wZXJhdGluZ0NoYW5uZWwgPSBwTWFjLT5wMnBDb250ZXh0WzBdLlAyUE9wZXJhdGluZ0NoYW5uZWw7CisgICAgICBwUGFyYW0tPlAyUE9wUFNDVFdpbmRvdyA9IHBNYWMtPnAycENvbnRleHRbMF0ucE5vQS5jdFdpbmRvdzsKKyAgICAgIHBQYXJhbS0+UDJQUFNTZWxlY3Rpb24gPSBwTWFjLT5wMnBDb250ZXh0WzBdLnBOb0EucHNTZWxlY3Rpb247CisgICAgICBwUGFyYW0tPlAyUE9wUFNDVFdpbmRvdyA9IHBNYWMtPnAycENvbnRleHRbMF0ucE5vQS5jdFdpbmRvdzsKKyAgICAgIHBQYXJhbS0+UDJQTm9BRHVyYXRpb24gPSBwTWFjLT5wMnBDb250ZXh0WzBdLnBOb0EuZHVyYXRpb247CisgICAgICBwUGFyYW0tPlAyUE5vQUNvdW50ID0gcE1hYy0+cDJwQ29udGV4dFswXS5wTm9BLmNvdW50OworICAgICAgcFBhcmFtLT5QMlBOb0FJbnRlcnZhbCA9IHBNYWMtPnAycENvbnRleHRbMF0ucE5vQS5pbnRlcnZhbDsKKworICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCitlSGFsU3RhdHVzIHAycENoYW5nZURlZmF1bHRDb25maWdQYXJhbSh0SGFsSGFuZGxlIGhIYWwsIHRQMlBDb25maWdQYXJhbSAqcFBhcmFtKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKyAgIGludCBpOworICAgdEFOSV9VOCBwQnVmW1AyUF9DT1VOVFJZX0NPREVfTEVOXTsKKyAgIHRBTklfVTggdUJ1ZkxlbiA9IFAyUF9DT1VOVFJZX0NPREVfTEVOOworICAgdFAyUF9PcGVyYXRpbmdDaGFubmVsIHAycENoYW5uZWw7CisKKyAgIHN0YXR1cyA9IHNtZV9HZXRDb3VudHJ5Q29kZSggcE1hYywgcEJ1ZiwgJnVCdWZMZW4gKTsKKyAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgQ2Fubm90IGdldCB0aGUgY291bnRyeSBjb2RlXG4iLCBfX0ZVTkNUSU9OX18pOworICAgfQorCisgICB2b3NfbWVtX2NvcHkocDJwQ2hhbm5lbC5jb3VudHJ5U3RyaW5nLCBwQnVmLCBzaXplb2YocEJ1ZikpOworICAgcDJwQ2hhbm5lbC5yZWd1bGF0b3J5Q2xhc3MgPSAweDUxOworCisgICBpZihwUGFyYW0pCisgICB7CisgICAgICBmb3IgKCBpPTA7IGkgPCBNQVhfTk9fT0ZfUDJQX1NFU1NJT05TOyBpKysgKSAKKyAgICAgIHsKKyAgICAgICAgIGlmIChwUGFyYW0tPlAyUExpc3RlbkNoYW5uZWwgPT0gMSB8fCBwUGFyYW0tPlAyUExpc3RlbkNoYW5uZWwgPT0gNiAKKyAgICAgICAgICAgICAgIHx8IHBQYXJhbS0+UDJQTGlzdGVuQ2hhbm5lbCA9PSAxMSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnAycENvbnRleHRbaV0uUDJQTGlzdGVuQ2hhbm5lbCA9IHBQYXJhbS0+UDJQTGlzdGVuQ2hhbm5lbDsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnAycENvbnRleHRbaV0uUDJQTGlzdGVuQ2hhbm5lbCA9IFAyUF9PUEVSQVRJTkdfQ0hBTk5FTDsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgICAiSW52YWxpZCBQMlAgTGlzdGVuIENoYW5uZWwgaW4gY29uZmlnLiBTd2l0Y2ggdG8gZGVmYXVsdCBMaXN0ZW4gQ2hhbm5lbCAlZFxuIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgUDJQX09QRVJBVElOR19DSEFOTkVMKTsKKyAgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgaWYoY3NyUm9hbUlzQ2hhbm5lbFZhbGlkKHBNYWMsIHBQYXJhbS0+UDJQT3BlcmF0aW5nQ2hhbm5lbCkpCisgICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5wMnBDb250ZXh0W2ldLlAyUE9wZXJhdGluZ0NoYW5uZWwgPSBwUGFyYW0tPlAyUE9wZXJhdGluZ0NoYW5uZWw7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5wMnBDb250ZXh0W2ldLlAyUE9wZXJhdGluZ0NoYW5uZWwgPSBQMlBfT1BFUkFUSU5HX0NIQU5ORUw7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgIkludmFsaWQgUDJQIE9wZXJhdGluZyBDaGFubmVsIGluIGNvbmZpZy4gU3dpdGNoIHRvIGRlZmF1bHQgQ2hhbm5lbCAlZFxuIiwgCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFAyUF9PUEVSQVRJTkdfQ0hBTk5FTCk7CisgICAgICAgICB9CisgICAgICAgICBwTWFjLT5wMnBDb250ZXh0W2ldLnBOb0EuY3RXaW5kb3cgPSBwUGFyYW0tPlAyUE9wUFNDVFdpbmRvdzsKKyAgICAgICAgIHBNYWMtPnAycENvbnRleHRbaV0ucE5vQS5wc1NlbGVjdGlvbiA9IHBQYXJhbS0+UDJQUFNTZWxlY3Rpb247CisgICAgICAgICBwTWFjLT5wMnBDb250ZXh0W2ldLnBOb0EuY3RXaW5kb3cgPSBwUGFyYW0tPlAyUE9wUFNDVFdpbmRvdzsKKyAgICAgICAgIHBNYWMtPnAycENvbnRleHRbaV0ucE5vQS5kdXJhdGlvbiA9IHBQYXJhbS0+UDJQTm9BRHVyYXRpb247CisgICAgICAgICBwTWFjLT5wMnBDb250ZXh0W2ldLnBOb0EuY291bnQgPSBwUGFyYW0tPlAyUE5vQUNvdW50OworICAgICAgICAgcE1hYy0+cDJwQ29udGV4dFtpXS5wTm9BLmludGVydmFsID0gcFBhcmFtLT5QMlBOb0FJbnRlcnZhbDsKKworICAgICAgICAgcDJwQ2hhbm5lbC5jaGFubmVsID0gcE1hYy0+cDJwQ29udGV4dFtpXS5QMlBPcGVyYXRpbmdDaGFubmVsOworICAgICAgICAgUDJQX1VwZGF0ZUlFKHBNYWMsIGksIGVXRkRfT1BFUkFUSU5HX0NIQU5ORUwsICZwMnBDaGFubmVsLCAxKTsKKyAgICAgICAgIHAycENoYW5uZWwuY2hhbm5lbCA9IHBNYWMtPnAycENvbnRleHRbaV0uUDJQTGlzdGVuQ2hhbm5lbDsKKyAgICAgICAgIFAyUF9VcGRhdGVJRShwTWFjLCBpLCBlV0ZEX0xJU1RFTl9DSEFOTkVMLCAmcDJwQ2hhbm5lbCwgMSk7CisgICAgICB9CisgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitlSGFsU3RhdHVzIHAycFBTKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICB0UDJwUHNDb25maWcgcE5vQTsKKworICAgLyogY2FsbCBzZXQgaW4gY29udGV4dCAqLworICAgcE5vQS5wc1NlbGVjdGlvbiA9IHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5wTm9BLnBzU2VsZWN0aW9uOworICAgcE5vQS5zZXNzaW9uaWQgPSBzZXNzaW9uSWQ7CisKKyAgIGlmIChwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0ucE5vQS5wc1NlbGVjdGlvbiA9PSBQMlBfQ0xFQVJfUE9XRVJTQVZFKQorICAgeworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgaWYgKHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5wTm9BLnBzU2VsZWN0aW9uID09IFAyUF9PUFBPUlRVTklTVElDX1BTKQorICAgeworICAgICAgcE5vQS5vcHBfcHMgPSBUUlVFOworICAgICAgcE5vQS5jdFdpbmRvdyA9IHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5wTm9BLmN0V2luZG93OworICAgICAgcE5vQS5jb3VudCA9IDA7CisgICAgICBwTm9BLmR1cmF0aW9uID0gMDsKKyAgICAgIHBOb0EuaW50ZXJ2YWwgPSAwOyAKKyAgICAgIHBOb0Euc2luZ2xlX25vYV9kdXJhdGlvbiA9IDA7CisgICB9CisgICBlbHNlIGlmIChwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0ucE5vQS5wc1NlbGVjdGlvbiA9PSBQMlBfUEVSSU9ESUNfTk9BKQorICAgeworICAgICAgcE5vQS5vcHBfcHMgPSAwOworICAgICAgcE5vQS5jdFdpbmRvdyA9IDA7CisgICAgICBwTm9BLmNvdW50ID0gcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLnBOb0EuY291bnQ7CisgICAgICBwTm9BLmR1cmF0aW9uID0gcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLnBOb0EuZHVyYXRpb247CisgICAgICBwTm9BLmludGVydmFsID0gcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLnBOb0EuaW50ZXJ2YWw7IAorICAgICAgcE5vQS5zaW5nbGVfbm9hX2R1cmF0aW9uID0gMDsKKyAgIH0gCisgICBlbHNlIGlmKHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5wTm9BLnBzU2VsZWN0aW9uID09IFAyUF9TSU5HTEVfTk9BKQorICAgeworICAgICAgcE5vQS5vcHBfcHMgPSAwOworICAgICAgcE5vQS5jdFdpbmRvdyA9IDA7CisgICAgICBwTm9BLmNvdW50ID0gMDsKKyAgICAgIHBOb0EuZHVyYXRpb24gPSAwOworICAgICAgcE5vQS5pbnRlcnZhbCA9IDA7IAorICAgICAgcE5vQS5zaW5nbGVfbm9hX2R1cmF0aW9uID0gcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLnBOb0EuZHVyYXRpb247CisgICB9CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAKKyAgICAgICIgJXMgSEREU2Vzc2lvbiAlZCBzZXQgTm9BIHBhcmFtZXRlcnMuIFNlbGVjdGlvbiAlZCwgb3BwX3BzICVkLCBjdFdpbmRvdyAlZCwgY291bnQgJWQsICIKKyAgICAgICJkdXJhdGlvbiAlZCwgaW50ZXJ2YWwgJWQgc2luZ2xlIE5vQSBkdXJhdGlvbiAlZCIsCisgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb25JZCwgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLnBOb0EucHNTZWxlY3Rpb24sCisgICAgICBwTm9BLm9wcF9wcywgcE5vQS5jdFdpbmRvdywgcE5vQS5jb3VudCwgcE5vQS5kdXJhdGlvbiwgCisgICAgICBwTm9BLmludGVydmFsLCBwTm9BLnNpbmdsZV9ub2FfZHVyYXRpb24gKTsKKworICAgc3RhdHVzID0gc21lX3AycFNldFBzKHBNYWMsICZwTm9BKTsKKyAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIHNtZV9wMnBTZXRQcyBmYWlsIHdpdGggc3RhdHVzICVkIiksIHN0YXR1cyk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIFAyUF9VcGRhdGVNYWNIZHIodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IFNlc3Npb25JRCwgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgIHRTaXJNYWNNZ210SGRyICptYWNIZHIgPSAodFNpck1hY01nbXRIZHIgKilwQnVmOworCisgICBtYWNIZHItPmZjLnByb3RWZXIgPSAwOworICAgbWFjSGRyLT5mYy50eXBlID0gMDsKKyAgIG1hY0hkci0+ZmMuc3ViVHlwZSA9IDEzOworICAgbWFjSGRyLT5kdXJhdGlvbkxvID0gMDsKKyAgIG1hY0hkci0+ZHVyYXRpb25IaSA9IDA7CisgICB2b3NfbWVtX2NvcHkobWFjSGRyLT5kYSwgcE1hYy0+cDJwQ29udGV4dFtTZXNzaW9uSURdLnBlZXJNYWNBZGRyZXNzLCBQMlBfTUFDX0FERFJFU1NfTEVOKTsKKyAgIHZvc19tZW1fY29weShtYWNIZHItPnNhLCBwTWFjLT5wMnBDb250ZXh0W1Nlc3Npb25JRF0uc2VsZk1hY0FkZHJlc3MsIFAyUF9NQUNfQUREUkVTU19MRU4pOworICAgdm9zX21lbV9jb3B5KG1hY0hkci0+YnNzSWQsIHBNYWMtPnAycENvbnRleHRbU2Vzc2lvbklEXS5wZWVyTWFjQWRkcmVzcywgUDJQX01BQ19BRERSRVNTX0xFTik7CisKKyAgIHJldHVybjsKK30KKworc3RhdGljIGVIYWxTdGF0dXMgcDJwUmVtYWluT25DaGFubmVsUmVhZHlDYWxsYmFjayh0SGFsSGFuZGxlIGhhbEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgZUhhbFN0YXR1cyBzY2FuX3N0YXR1cykKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHRwMnBDb250ZXh0ICpwMnBDb250ZXh0ID0gKHRwMnBDb250ZXh0KikgcENvbnRleHQ7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyBHcm91cEZvcm1hdGlvblBlbmRpbmcgJWQgIFBlZXJGb3VuZCAlZFxuIiwgCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHAycENvbnRleHQtPkdyb3VwRm9ybWF0aW9uUGVuZGluZywgcDJwQ29udGV4dC0+UGVlckZvdW5kKTsKKworICAgaWYgKHAycENvbnRleHQtPlBlZXJGb3VuZCkKKyAgIHsKKyAgICAgIHAycENvbnRleHQtPlBlZXJGb3VuZCA9IEZBTFNFOworCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXMgU2VuZGluZyBhY3Rpb25mcmFtZVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIGlmIChwMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBjYWxsaW5nIHAycFNlbmRBY3Rpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICBwMnBTZW5kQWN0aW9uKGhhbEhhbmRsZSwgcDJwQ29udGV4dC0+U01Fc2Vzc2lvbklkLCAodEFOSV9VOCAqKXAycENvbnRleHQtPnBTZW50QWN0aW9uRnJhbWUsIHAycENvbnRleHQtPkFjdGlvbkZyYW1lTGVuKTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworZUhhbFN0YXR1cyBwMnBHcnBGb3JtYXRpb25SZW1haW5PbkNoYW5Sc3BDYWxsYmFjayh0SGFsSGFuZGxlIGhhbEhhbmRsZSwgdm9pZCAqcENvbnRleHQsIHRBTklfVTMyIHNjYW5JZCwgZUNzclNjYW5TdGF0dXMgc2Nhbl9zdGF0dXMpCit7CisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKwordEFOSV9VOCBwMnBHZXREaWFsb2dUb2tlbih0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggU2Vzc2lvbklELCBlUDJQRnJhbWVUeXBlIGFjdGlvbkZyYW1lVHlwZSkKK3sKKyAgIHRBTklfVTggZGlhbG9nVG9rZW4gPSAwOworCisgICBkaWFsb2dUb2tlbiA9ICh0QU5JX1U4KSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpOworCisgICByZXR1cm4oZGlhbG9nVG9rZW4pOworfQorCit2b2lkIHAycFJldHJ5QWN0aW9uRnJhbWVUaW1lckhhbmRsZXIodm9pZCAqcENvbnRleHQpCit7CisgICB0cDJwQ29udGV4dCAqcDJwQ29udGV4dCA9ICh0cDJwQ29udGV4dCopIHBDb250ZXh0OworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBwMnBDb250ZXh0LT5oSGFsICk7CisKKyAgIHAycENvbnRleHQtPlBlZXJGb3VuZCA9IFRSVUU7CisgICBzbXNMb2coIHBNYWMsIExPR0UsICIlcyBDYWxsaW5nIHJlbWFpbiBvbiBjaGFubmVsIFxuIiwgX19GVU5DVElPTl9fKTsKKyAgIHN0YXR1cyA9IHAycFJlbWFpbk9uQ2hhbm5lbCggcE1hYywgcDJwQ29udGV4dC0+U01Fc2Vzc2lvbklkLCBwMnBDb250ZXh0LT5QMlBMaXN0ZW5DaGFubmVsLypwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5jaGFubmVsSWQqLywgUDJQX1JFTUFJTl9PTl9DSEFOX1RJTUVPVVRfTE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgZVAyUFJlbWFpbk9uQ2huUmVhc29uU2VuZEZyYW1lKTsKKyAgIGlmKHN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiJXMgcmVtYWluIG9uIGNoYW5uZWwgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgfQorCisgICByZXR1cm47Cit9CisKK3ZvaWQgcDJwQWN0aW9uRnJhbWVUaW1lckhhbmRsZXIodm9pZCAqcENvbnRleHQpCit7CisgICB0cDJwQ29udGV4dCAqcDJwQ29udGV4dCA9ICh0cDJwQ29udGV4dCopIHBDb250ZXh0OworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdEFOSV9VOCAqcEJ1ZiA9IE5VTEwsICpwTmV4dEJ1ZiA9IE5VTEw7CisgICB0Q3NyUm9hbUluZm8gcm9hbUluZm87CisKKworICAgaWYocDJwQ29udGV4dC0+cFNlbnRBY3Rpb25GcmFtZSkKKyAgIHsKKyAgICAgIHZvc19tZW1femVybygmcm9hbUluZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pKTsKKyAgICAgIGNzclJvYW1DYWxsQ2FsbGJhY2soKHRwQW5pU2lyR2xvYmFsKXAycENvbnRleHQtPmhIYWwsIHAycENvbnRleHQtPlNNRXNlc3Npb25JZCwgJnJvYW1JbmZvLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1NFTkRfQUNUSU9OX0NORiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9SRVNVTFRfU0VORF9BQ1RJT05fRkFJTCk7CisgICB9CisKKyAgIGlmKFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3Nfc3Bpbl9sb2NrX2FjcXVpcmUoJnAycENvbnRleHQtPmxTdGF0ZSkpKQorICAgeworICAgICAgaWYocDJwQ29udGV4dC0+cFNlbnRBY3Rpb25GcmFtZSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAiICVzIGFjdGlvbmZyYW1lIHRpbWVvdXQgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgcDJwQ29udGV4dC0+YWN0aW9uRnJhbWVUeXBlKTsKKyAgICAgICAgIHBCdWYgPSBwMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lOworICAgICAgICAgcDJwQ29udGV4dC0+cFNlbnRBY3Rpb25GcmFtZSA9IE5VTEw7CisgICAgICB9CisgICAgICBpZihwMnBDb250ZXh0LT5wTmV4dEFjdGlvbkZybSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAiICVzIG5leHQgYWN0aW9uZnJhbWUgdGltZW91dCB0eXBlICVkIiwgX19GVU5DVElPTl9fLCBwMnBDb250ZXh0LT5OZXh0QWN0aW9uRnJhbWVUeXBlKTsKKyAgICAgICAgIHBOZXh0QnVmID0gcDJwQ29udGV4dC0+cE5leHRBY3Rpb25Gcm07CisgICAgICAgICBwMnBDb250ZXh0LT5wTmV4dEFjdGlvbkZybSA9IE5VTEw7CisgICAgICB9CisgICAgICB2b3Nfc3Bpbl9sb2NrX3JlbGVhc2UoJnAycENvbnRleHQtPmxTdGF0ZSk7CisKKyAgICAgIGlmKHBCdWYpCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUocEJ1Zik7CisgICAgICB9CisgICAgICBpZihwTmV4dEJ1ZikKKyAgICAgIHsKKyAgICAgICAgIC8vSW5mb3JtIHRoZSBmYWlsdXJlIG9mIHRoZSBuZXh0IGZyYW1lLgorICAgICAgICAgcDJwQ29udGV4dC0+cFNlbnRBY3Rpb25GcmFtZSA9IHBOZXh0QnVmOworICAgICAgICAgcDJwQ29udGV4dC0+QWN0aW9uRnJhbWVMZW4gPSBwMnBDb250ZXh0LT5uTmV4dEZybUxlbjsKKyAgICAgICAgIHAycENvbnRleHQtPmFjdGlvbkZyYW1lVHlwZSA9IHAycENvbnRleHQtPk5leHRBY3Rpb25GcmFtZVR5cGU7CisgICAgICAgICB2b3NfbWVtX3plcm8oJnJvYW1JbmZvLCBzaXplb2YodENzclJvYW1JbmZvKSk7CisgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKCh0cEFuaVNpckdsb2JhbClwMnBDb250ZXh0LT5oSGFsLCBwMnBDb250ZXh0LT5TTUVzZXNzaW9uSWQsICZyb2FtSW5mbywgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVDU1JfUk9BTV9TRU5EX0FDVElPTl9DTkYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fUkVTVUxUX1NFTkRfQUNUSU9OX0ZBSUwpOworICAgICAgICAgcDJwQ29udGV4dC0+cFNlbnRBY3Rpb25GcmFtZSA9IE5VTEw7CisgICAgICAgICB2b3NfbWVtX2ZyZWUocE5leHRCdWYpOworICAgICAgfQorICAgfQorICAgc3RhdHVzID0gcDJwRnNtKHAycENvbnRleHQsIGVQMlBfVFJJR0dFUl9ESVNDT05ORUNURUQpOworICAgcDJwQ29udGV4dC0+YWN0aW9uRnJhbWVUaW1lb3V0ID0gVFJVRTsKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyB0aW1lZG91dFxuIiwgX19GVU5DVElPTl9fKTsKKworICAgcmV0dXJuOworfQorCisKK2VIYWxTdGF0dXMgcDJwQ3JlYXRlQWN0aW9uRnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBTZXNzaW9uSUQsIHZvaWQgKnAycGFjdGlvbmZyYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVQMlBGcmFtZVR5cGUgYWN0aW9uRnJhbWVUeXBlLCB0QU5JX1U4ICoqcHBGcm0pCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0QU5JX1UzMiBsZW4gPSAwOworICAgdEFOSV9VMzIgbkFjdGlvbkZybWxlbiA9IDAsIHBlbmRpbmdGcmFtZUxlbjsKKyAgIHRBTklfVTggKnBBY3Rpb25Gcm0gPSBOVUxMOworICAgdEFOSV9VOCAqcEJ1ZiA9IE5VTEwsICpwTG9jYWwgPSBOVUxMOworICAgZVAyUEZyYW1lVHlwZSBwZW5kaW5nQWN0aW9uRnJhbWVUeXBlOworICAgdHAycENvbnRleHQgKnBQMnBDb250ZXh0ID0gJnBNYWMtPnAycENvbnRleHRbU2Vzc2lvbklEXTsKKworICAgaWYoTlVMTCA9PSBwcEZybSkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBpbnZhbGlkIHBhcmFtZXRlcnMiKSk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgY3NyU2NhbkFib3J0TWFjU2NhbihwTWFjKTsKKworICAgc3dpdGNoIChhY3Rpb25GcmFtZVR5cGUpCisgICB7CisgICBjYXNlIGVQMlBfR09ORUdPX1JFUToKKyAgICAgIHN0YXR1cyA9IFAyUF9VcGRhdGVJRShwTWFjLCBTZXNzaW9uSUQsIGVXRkRfU0VORF9HT19ORUdPVElBVElPTl9SRVFVRVNULCBwMnBhY3Rpb25mcmFtZSwgbGVuKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGVQMlBfR09ORUdPX1JFUzoKKyAgICAgIHN0YXR1cyA9IFAyUF9VcGRhdGVJRShwTWFjLCBTZXNzaW9uSUQsIGVXRkRfU0VORF9HT19ORUdPVElBVElPTl9SRVNQT05TRSwgcDJwYWN0aW9uZnJhbWUsIGxlbik7CisgICAgICBicmVhazsKKworICAgY2FzZSBlUDJQX0dPTkVHT19DTkY6CisgICAgICBzdGF0dXMgPSBQMlBfVXBkYXRlSUUocE1hYywgU2Vzc2lvbklELCBlV0ZEX1NFTkRfR09fTkVHT1RJQVRJT05fQ09ORklSTUFUSU9OLCBwMnBhY3Rpb25mcmFtZSwgbGVuKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGVQMlBfUFJPVklTSU9OX0RJU0NPVkVSWV9SRVFVRVNUOgorICAgICAgc3RhdHVzID0gUDJQX1VwZGF0ZUlFKHBNYWMsIFNlc3Npb25JRCwgZVdGRF9TRU5EX1BST1ZJU0lPTl9ESVNDT1ZFUllfUkVRVUVTVCwgcDJwYWN0aW9uZnJhbWUsIGxlbik7CisgICAgICBicmVhazsKKworICAgY2FzZSBlUDJQX1BST1ZJU0lPTl9ESVNDT1ZFUllfUkVTUE9OU0U6CisgICAgICBzdGF0dXMgPSBQMlBfVXBkYXRlSUUocE1hYywgU2Vzc2lvbklELCBlV0ZEX1NFTkRfUFJPVklTSU9OX0RJU0NPVkVSWV9SRVNQT05TRSwgcDJwYWN0aW9uZnJhbWUsIGxlbik7CisgICAgICBicmVhazsKKworICAgY2FzZSBlUDJQX0lOVklUQVRJT05fUkVROgorICAgICAgc3RhdHVzID0gUDJQX1VwZGF0ZUlFKHBNYWMsIFNlc3Npb25JRCwgZVdGRF9TRU5EX0lOVklUQVRJT05fUkVRVUVTVCwgcDJwYWN0aW9uZnJhbWUsIGxlbik7CisgICAgICBicmVhazsKKworICAgY2FzZSBlUDJQX0lOVklUQVRJT05fUlNQOgorICAgICAgc3RhdHVzID0gUDJQX1VwZGF0ZUlFKHBNYWMsIFNlc3Npb25JRCwgZVdGRF9TRU5EX0lOVklUQVRJT05fUkVTUE9OU0UsIHAycGFjdGlvbmZyYW1lLCBsZW4pOworICAgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgc3RhdHVzID0gUDJQX0dldEFjdGlvbkZyYW1lKHBNYWMsIFNlc3Npb25JRCwgYWN0aW9uRnJhbWVUeXBlLCAmcEFjdGlvbkZybSwgJm5BY3Rpb25Gcm1sZW4pOworICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgUDJQX0dldEFjdGlvbkZyYW1lIGZhaWwgd2l0aCBzdGF0dXMgJWQiKSwgc3RhdHVzKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisKKyAgIFAyUF9VcGRhdGVNYWNIZHIocE1hYywgU2Vzc2lvbklELCBwQWN0aW9uRnJtKTsKKworICAgcEJ1ZiA9ICh0QU5JX1U4ICopdm9zX21lbV9tYWxsb2MoIG5BY3Rpb25Gcm1sZW4pOworICAgaWYoTlVMTCA9PSBwQnVmKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgIGZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IikpOworICAgICAgaWYgKHBBY3Rpb25Gcm0pIAorICAgICAgICAgdm9zX21lbV9mcmVlKHBBY3Rpb25Gcm0pOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIHZvc19tZW1fY29weShwQnVmLCBwQWN0aW9uRnJtLCBuQWN0aW9uRnJtbGVuKTsKKyAgIHZvc19tZW1fZnJlZShwQWN0aW9uRnJtKTsKKworICAgaWYoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX3NwaW5fbG9ja19hY3F1aXJlKCZwUDJwQ29udGV4dC0+bFN0YXRlKSkpCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiAgZmFpbCB0byBhY3F1aXJlIHNwaW5sb2NrIikpOworICAgICAgdm9zX21lbV9mcmVlKHBCdWYpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIGlmKE5VTEwgIT0gcFAycENvbnRleHQtPnBTZW50QWN0aW9uRnJhbWUpCisgICB7CisgICAgICAvL0lmIHRoZXJlIGlzIG9uZSBwZW5kaW5nIGZyYW1lIGFscmVhZHkuIERyb3AgdGhhdCBvbmUgYW5kIHNhdmUgdGhlIG5ldyBvbmUKKyAgICAgIHBMb2NhbCA9IHBQMnBDb250ZXh0LT5wTmV4dEFjdGlvbkZybTsKKyAgICAgIHBlbmRpbmdBY3Rpb25GcmFtZVR5cGUgPSBwUDJwQ29udGV4dC0+TmV4dEFjdGlvbkZyYW1lVHlwZTsKKyAgICAgIHBlbmRpbmdGcmFtZUxlbiA9IHBQMnBDb250ZXh0LT5uTmV4dEZybUxlbjsKKyAgICAgIHBQMnBDb250ZXh0LT5wTmV4dEFjdGlvbkZybSA9IHBCdWY7CisgICAgICBwUDJwQ29udGV4dC0+bk5leHRGcm1MZW4gPSBuQWN0aW9uRnJtbGVuOworICAgICAgcFAycENvbnRleHQtPk5leHRBY3Rpb25GcmFtZVR5cGUgPSBhY3Rpb25GcmFtZVR5cGU7CisgICAgICAqcHBGcm0gPSBOVUxMOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcFAycENvbnRleHQtPnBTZW50QWN0aW9uRnJhbWUgPSBwQnVmOworICAgICAgcFAycENvbnRleHQtPkFjdGlvbkZyYW1lTGVuID0gbkFjdGlvbkZybWxlbjsKKyAgICAgIHBQMnBDb250ZXh0LT5hY3Rpb25GcmFtZVR5cGUgPSBhY3Rpb25GcmFtZVR5cGU7CisgICAgICAqcHBGcm0gPSBwQnVmOworICAgfQorICAgdm9zX3NwaW5fbG9ja19yZWxlYXNlKCZwUDJwQ29udGV4dC0+bFN0YXRlKTsKKworICAgaWYoTlVMTCAhPSBwTG9jYWwpCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBEcm9wIGEgd2FpdGluZyBhY3Rpb24gZnJhbWUgMHgleCwgdHlwZSAlZCBsZW50aCAlZCIpLCAKKyAgICAgICAgIHBMb2NhbCwgcGVuZGluZ0FjdGlvbkZyYW1lVHlwZSwgcGVuZGluZ0ZyYW1lTGVuKTsKKyAgICAgIHZvc19tZW1fZnJlZShwTG9jYWwpOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCisKK2V4dGVybiBlSGFsU3RhdHVzIHAycEdldFNTSUQodEFOSV9VOCAqc3NJZCwgdEFOSV9VMzIgKnNzSWRMZW4sIHRBTklfVTggU2Vzc2lvbklEKTsKKworc3RhdGljIGVIYWxTdGF0dXMgcDJwU2VuZEFjdGlvbkZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggSEREU2Vzc2lvbklELCBlUDJQRnJhbWVUeXBlIGFjdGlvbkZyYW1lVHlwZSkKK3sKKyAgIHRDc3JTY2FuUmVzdWx0RmlsdGVyIGZpbHRlcjsKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0ID0gTlVMTDsKKyAgIHRDc3JTY2FuUmVzdWx0SW5mbyAgICpwU2NhblJlc3VsdCAgID0gTlVMTDsKKyAgIHRBTklfVTggc3NJZFtTSVJfTUFDX01BWF9TU0lEX0xFTkdUSF07CisgICB0QU5JX1UzMiBzc0lkTGVuID0gMDsKKyAgIHRwMnBDb250ZXh0ICpwUDJwQ29udGV4dCA9ICZwTWFjLT5wMnBDb250ZXh0W0hERFNlc3Npb25JRF07CisKKyAgIHBQMnBDb250ZXh0LT5Hcm91cEZvcm1hdGlvblBlbmRpbmcgPSBUUlVFOworICAgaWYgKGFjdGlvbkZyYW1lVHlwZSA9PSBlUDJQX0dPTkVHT19SRVEgfHwgYWN0aW9uRnJhbWVUeXBlID09IGVQMlBfUFJPVklTSU9OX0RJU0NPVkVSWV9SRVFVRVNUIAorICAgICAgfHwgYWN0aW9uRnJhbWVUeXBlID09IGVQMlBfSU5WSVRBVElPTl9SRVEpCisgICB7CisgICAgICB2b3NfbWVtX3plcm8oJmZpbHRlciwgc2l6ZW9mKGZpbHRlcikpOworICAgICAgZmlsdGVyLkJTU0lEcy5udW1PZkJTU0lEcyA9IDE7CisgICAgICBmaWx0ZXIuQlNTSURzLmJzc2lkID0gJnBQMnBDb250ZXh0LT5wZWVyTWFjQWRkcmVzczsKKyAgICAgIGZpbHRlci5iV1BTQXNzb2NpYXRpb24gPSBUUlVFOworICAgICAgZmlsdGVyLkJTU1R5cGUgPSBlQ1NSX0JTU19UWVBFX0FOWTsKKworICAgICAgc3RhdHVzID0gY3NyU2NhbkdldFJlc3VsdChwTWFjLCAmZmlsdGVyLCAmaFNjYW5SZXN1bHQpOworCisgICAgICBpZiAoaFNjYW5SZXN1bHQpCisgICAgICB7CisgICAgICAgICBwU2NhblJlc3VsdCA9IGNzclNjYW5SZXN1bHRHZXRGaXJzdChwTWFjLCBoU2NhblJlc3VsdCApOworICAgICAgICAgaWYocFNjYW5SZXN1bHQpCisgICAgICAgICB7CisKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAiJXMgZm91bmQgbWF0Y2ggb24gY2hhbm5lbCAlZCIsIAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5jaGFubmVsSWQpOworICAgICAgICAgICAgcFAycENvbnRleHQtPmZvcm1hdGlvblJlcS50YXJnZXRMaXN0ZW5DaGFubmVsID0gcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkOworICAgICAgICAgICAgaWYocFAycENvbnRleHQtPlAyUExpc3RlbkNoYW5uZWwgIT0gcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsIAorICAgICAgICAgICAgICAgICAgIiVzIGFkYXB0IGxpc3RlbiBjaGFubmVsIHRvICVkIiwgCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCk7CisgICAgICAgICAgICAgICBwMnBTZXRMaXN0ZW5DaGFubmVsKHBNYWMsIHBQMnBDb250ZXh0LT5zZXNzaW9uSWQsIHBTY2FuUmVzdWx0LT5Cc3NEZXNjcmlwdG9yLmNoYW5uZWxJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkocFAycENvbnRleHQtPmZvcm1hdGlvblJlcS5kZXZpY2VBZGRyZXNzLCBwU2NhblJlc3VsdC0+QnNzRGVzY3JpcHRvci5ic3NJZCwgUDJQX01BQ19BRERSRVNTX0xFTik7CisgICAgICAgICB9CisgICAgICAgICBjc3JTY2FuUmVzdWx0UHVyZ2UocE1hYywgaFNjYW5SZXN1bHQpOworICAgICAgfSAKKyAgICAgIGVsc2UgCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX3plcm8oJmZpbHRlciwgc2l6ZW9mKGZpbHRlcikpOworICAgICAgICAgZmlsdGVyLmJXUFNBc3NvY2lhdGlvbiA9IFRSVUU7CisgICAgICAgICBmaWx0ZXIuQlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworICAgICAgICAgZmlsdGVyLlNTSURzLlNTSURMaXN0ID0oIHRDc3JTU0lESW5mbyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0Q3NyU1NJREluZm8pKTsKKyAgICAgICAgIGlmKCBmaWx0ZXIuU1NJRHMuU1NJRExpc3QgPT0gTlVMTCApCisgICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1AsIEZMKCJ2b3NfbWVtX21hbGxvYyBmYWlsZWQ6IikgKTsKKyAgICAgICAgICAgIHBQMnBDb250ZXh0LT5Hcm91cEZvcm1hdGlvblBlbmRpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgfQorICAgICAgICAgdm9zX21lbV96ZXJvKCBmaWx0ZXIuU1NJRHMuU1NJRExpc3QsIHNpemVvZih0Q3NyU1NJREluZm8pICk7CisgICAgICAgICBwMnBHZXRTU0lEKHNzSWQsICZzc0lkTGVuLCBIRERTZXNzaW9uSUQpOworCisgICAgICAgICBpZiAoc3NJZExlbikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZpbHRlci5TU0lEcy5TU0lETGlzdC0+U1NJRC5sZW5ndGggPSBzc0lkTGVuOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCZmaWx0ZXIuU1NJRHMuU1NJRExpc3RbMF0uU1NJRC5zc0lkLCAmc3NJZCwgc3NJZExlbik7CisgICAgICAgICAgICBmaWx0ZXIuU1NJRHMubnVtT2ZTU0lEcyA9IDE7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JTY2FuR2V0UmVzdWx0KHBNYWMsICZmaWx0ZXIsICZoU2NhblJlc3VsdCk7CisgICAgICAgICAgICBpZiAoaFNjYW5SZXN1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwU2NhblJlc3VsdCA9IGNzclNjYW5SZXN1bHRHZXRGaXJzdChwTWFjLCBoU2NhblJlc3VsdCApOworICAgICAgICAgICAgICAgcFAycENvbnRleHQtPmZvcm1hdGlvblJlcS50YXJnZXRMaXN0ZW5DaGFubmVsID0gcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuY2hhbm5lbElkOworICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBQMnBDb250ZXh0LT5mb3JtYXRpb25SZXEuZGV2aWNlQWRkcmVzcywgcFNjYW5SZXN1bHQtPkJzc0Rlc2NyaXB0b3IuYnNzSWQsIFAyUF9NQUNfQUREUkVTU19MRU4pOworICAgICAgICAgICAgICAgY3NyU2NhblJlc3VsdFB1cmdlKHBNYWMsIGhTY2FuUmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyBub3QgZm91bmQgbWF0Y2hcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICBwUDJwQ29udGV4dC0+Zm9ybWF0aW9uUmVxLnRhcmdldExpc3RlbkNoYW5uZWwgPSAwOworICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBQMnBDb250ZXh0LT5mb3JtYXRpb25SZXEuZGV2aWNlQWRkcmVzcywgcFAycENvbnRleHQtPnBlZXJNYWNBZGRyZXNzLCBQMlBfTUFDX0FERFJFU1NfTEVOKTsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUoZmlsdGVyLlNTSURzLlNTSURMaXN0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyBub3QgZm91bmQgbWF0Y2hcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBwUDJwQ29udGV4dC0+Zm9ybWF0aW9uUmVxLnRhcmdldExpc3RlbkNoYW5uZWwgPSAwOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KHBQMnBDb250ZXh0LT5mb3JtYXRpb25SZXEuZGV2aWNlQWRkcmVzcywgcFAycENvbnRleHQtPnBlZXJNYWNBZGRyZXNzLCBQMlBfTUFDX0FERFJFU1NfTEVOKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICB9ICAgIAorICAgICAgfQorICAgICAgc21lX0NhbmNlbFJlbWFpbk9uQ2hhbm5lbChwTWFjLCBwUDJwQ29udGV4dC0+U01Fc2Vzc2lvbklkICk7CisgICAgICBwMnBGc20ocFAycENvbnRleHQsIGVQMlBfVFJJR0dFUl9HUk9VUF9GT1JNQVRJT04pOyAgICAgCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiICVzIHNlbmQgYWN0aW9uIGZyYW1lICVkIHRpbWVvdXQgJWRcbiIsIAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhY3Rpb25GcmFtZVR5cGUsIHBQMnBDb250ZXh0LT5BY3Rpb25GcmFtZVNlbmRUaW1lb3V0KTsKKyAgIH0gCisgICBlbHNlCisgICB7CisgICAgICBwUDJwQ29udGV4dC0+UGVlckZvdW5kID0gVFJVRTsKKworICAgICAgc3RhdHVzID0gcDJwU2VuZEFjdGlvbihwTWFjLCBwUDJwQ29udGV4dC0+U01Fc2Vzc2lvbklkLCAodEFOSV9VOCAqKXBQMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQMnBDb250ZXh0LT5BY3Rpb25GcmFtZUxlbik7CisgICAgICBpZihzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAgCisgICAgICAgICAgICAiJXMgcDJwU2VuZEFjdGlvbiBmYWlsZWQgdG8gc2VuZCBmcmFtZSB0eXBlICVkXG4iLCBfX0ZVTkNUSU9OX18sIGFjdGlvbkZyYW1lVHlwZSk7CisgICAgICAgICBwUDJwQ29udGV4dC0+R3JvdXBGb3JtYXRpb25QZW5kaW5nID0gRkFMU0U7CisgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgfQorCisgICAgICBpZiAoIGFjdGlvbkZyYW1lVHlwZSA9PSBlUDJQX0dPTkVHT19SRVMgKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIENhbGxpbmcgcDJwUmVtYWluT25DaGFubmVsIHdpdGggZHVyYXRpb24iCisgICAgICAgICAgICAiJWQgb24gY2hhbm5lbCAlZFxuIiwgX19GVU5DVElPTl9fLCBQMlBfUkVNQUlOX09OX0NIQU5fVElNRU9VVCwgcFAycENvbnRleHQtPlAyUExpc3RlbkNoYW5uZWwpOworCisgICAgICAgICBpZihwMnBSZW1haW5PbkNoYW5uZWwoIHBNYWMsIHBQMnBDb250ZXh0LT5TTUVzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUDJwQ29udGV4dC0+UDJQTGlzdGVuQ2hhbm5lbCwgUDJQX1JFTUFJTl9PTl9DSEFOX1RJTUVPVVRfTE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBlUDJQUmVtYWluT25DaG5SZWFzb25TZW5kRnJhbWUpKQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICAiJXMgcmVtYWluIG9uIGNoYW5uZWwgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICByZXR1cm4oc3RhdHVzKTsKK30KKworCisjZGVmaW5lIFdMQU5fUDJQX0RFRl9BQ1RJT05fRlJNX1RJTUVPVVRfVkFMVUUgMTAwMCAgLy8xcworCitlSGFsU3RhdHVzIHAycENyZWF0ZVNlbmRBY3Rpb25GcmFtZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggSEREU2Vzc2lvbklELCAKKyAgIHZvaWQgKnAycGFjdGlvbmZyYW1lLCBlUDJQRnJhbWVUeXBlIGFjdGlvbkZyYW1lVHlwZSwgdEFOSV9VMzIgdGltZW91dCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgIHRBTklfVTggKnBCdWYgPSBOVUxMOworICAgdHAycENvbnRleHQgKnBQMnBDb250ZXh0ID0gJnBNYWMtPnAycENvbnRleHRbSEREU2Vzc2lvbklEXTsKKyAgIAorICAgc3RhdHVzID0gcDJwQ3JlYXRlQWN0aW9uRnJhbWUocE1hYywgSEREU2Vzc2lvbklELCBwMnBhY3Rpb25mcmFtZSwgYWN0aW9uRnJhbWVUeXBlLCAmcEJ1Zik7CisgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiAgZmFpbCB0byBjcmVhdGUgYWN0aW9uIGZyYW1lIikpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKyAgICAgIAorICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiAlcyBzZW5kIGFjdGlvbiBmcmFtZSAlZCB0aW1lb3V0ICVkXG4iLCAKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWN0aW9uRnJhbWVUeXBlLCB0aW1lb3V0KTsKKworICAgaWYoTlVMTCAhPSBwQnVmKQorICAgeworICAgICAgaWYgKHRpbWVvdXQpCisgICAgICB7CisgICAgICAgICBwUDJwQ29udGV4dC0+QWN0aW9uRnJhbWVTZW5kVGltZW91dCA9IHRpbWVvdXQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBwUDJwQ29udGV4dC0+QWN0aW9uRnJhbWVTZW5kVGltZW91dCA9IFdMQU5fUDJQX0RFRl9BQ1RJT05fRlJNX1RJTUVPVVRfVkFMVUU7CisgICAgICB9CisKKyAgICAgIHN0YXR1cyA9IHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcFAycENvbnRleHQtPmFjdGlvbkZyYW1lVGltZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgcFAycENvbnRleHQtPkFjdGlvbkZyYW1lU2VuZFRpbWVvdXQgKiBQQUxfVElNRVJfVE9fTVNfVU5JVCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKyAgICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICB7CisgICAgICAgICB0Q3NyUm9hbUluZm8gUm9hbUluZm87CisKKyAgICAgICAgIHZvc19tZW1femVybygmUm9hbUluZm8sIHNpemVvZih0Q3NyUm9hbUluZm8pKTsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICVzIGZhaWwgdG8gc3RhcnQgdGltZXIgc3RhdHVzICVkIiksIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAgICAgICAgIC8vV2l0aG91dCB0aGUgdGltZXIgd2UgY2Fubm90IGNvbnRpbnVlCisgICAgICAgICBjc3JSb2FtQ2FsbENhbGxiYWNrKCh0cEFuaVNpckdsb2JhbClwUDJwQ29udGV4dC0+aEhhbCwgCisgICAgICAgICAgICAgICAgICAgICBwUDJwQ29udGV4dC0+U01Fc2Vzc2lvbklkLCAmUm9hbUluZm8sIDAsIAorICAgICAgICAgICAgICAgICAgICAgZUNTUl9ST0FNX1NFTkRfQUNUSU9OX0NORiwgCisgICAgICAgICAgICAgICAgICAgICBlQ1NSX1JPQU1fUkVTVUxUX1NFTkRfQUNUSU9OX0ZBSUwpOworICAgICAgICAgdm9zX3NwaW5fbG9ja19hY3F1aXJlKCZwUDJwQ29udGV4dC0+bFN0YXRlKTsKKyAgICAgICAgIHBCdWYgPSBwUDJwQ29udGV4dC0+cFNlbnRBY3Rpb25GcmFtZTsKKyAgICAgICAgIHBQMnBDb250ZXh0LT5wU2VudEFjdGlvbkZyYW1lID0gTlVMTDsKKyAgICAgICAgIHZvc19zcGluX2xvY2tfcmVsZWFzZSgmcFAycENvbnRleHQtPmxTdGF0ZSk7CisgICAgICAgICB2b3NfbWVtX2ZyZWUocEJ1Zik7CisgICAgICAgICBwQnVmID0gTlVMTDsKKyAgICAgICAgIHAycEZzbShwUDJwQ29udGV4dCwgZVAyUF9UUklHR0VSX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgfQorICAgICAgLy9XZSBjYW4gc2VuZCB0aGlzIGZyYW1lIG5vdworICAgICAgc3RhdHVzID0gcDJwU2VuZEFjdGlvbkZyYW1lKHBNYWMsIEhERFNlc3Npb25JRCwgYWN0aW9uRnJhbWVUeXBlKTsKKyAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBmYWlsIHRvIHNlbmQgYWN0aW9uIGZyYW1lIHN0YXR1cyAlZCIpLCBzdGF0dXMpOworICAgICAgfQorICAgICAgLy9MZXQgdGhlbSByZXRyeQorICAgICAgcFAycENvbnRleHQtPmFjdGlvbkZyYW1lVGltZW91dCA9IEZBTFNFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy9BbiBhY3Rpb24gZnJhbWUgaXMgcGVkbmluZyBhdCBsb3dlciBsYXllcgorICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCIgIEFuIGFjdGlvbiBmcmFtZSBpcyBwZW5kaW5nIHdoaWxlIHRyeWluZyB0byBzZW5kIGZyYW1ldHlwZSAlZCIpLCBhY3Rpb25GcmFtZVR5cGUpOworICAgICAgaWYgKHRpbWVvdXQpCisgICAgICB7CisgICAgICAgICBwUDJwQ29udGV4dC0+bk5leHRGcmFtZVRpbWVPdXQgPSB0aW1lb3V0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgcFAycENvbnRleHQtPm5OZXh0RnJhbWVUaW1lT3V0ID0gV0xBTl9QMlBfREVGX0FDVElPTl9GUk1fVElNRU9VVF9WQUxVRTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIHAycExpc3RlbkRpc2NvdmVyVGltZXJIYW5kbGVyQ0Iodm9pZCAqcENvbnRleHQpCit7Cit9CisKK3ZvaWQgcDJwTGlzdGVuRGlzY292ZXJUaW1lckhhbmRsZXIodm9pZCAqcENvbnRleHQpCit7CisgICB0cDJwQ29udGV4dCAqcDJwQ29udGV4dCA9ICh0cDJwQ29udGV4dCopIHBDb250ZXh0OworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICBpZiggKGVQMlBfU1RBVEVfRElTQ09OTkVDVEVEID09IHAycENvbnRleHQtPnN0YXRlKSAmJiAKKyAgICAgICAoZVN0YXRlRGlzYWJsZWQgIT0gcDJwQ29udGV4dC0+bGlzdGVuRGlzY292ZXJhYmxlU3RhdGUpICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyBDYWxsaW5nIFJlbWFpbk9uQ2hhbm5lbCB3aXRoIGR1cmF0aW9uICVkIG9uIGNoYW5uZWwgJWRcbiIsIAorICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcDJwQ29udGV4dC0+bGlzdGVuRHVyYXRpb24sIHAycENvbnRleHQtPlAyUExpc3RlbkNoYW5uZWwpOworICAgICAgc3RhdHVzID0gcDJwUmVtYWluT25DaGFubmVsKCBwMnBDb250ZXh0LT5oSGFsLCBwMnBDb250ZXh0LT5TTUVzZXNzaW9uSWQsIHAycENvbnRleHQtPlAyUExpc3RlbkNoYW5uZWwsIHAycENvbnRleHQtPmxpc3RlbkR1cmF0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAycExpc3RlblN0YXRlRGlzY292ZXJhYmxlQ2FsbGJhY2ssIHAycENvbnRleHQsIGVQMlBSZW1haW5PbkNoblJlYXNvbkxpc3Rlbik7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzbXNMb2coKCh0cEFuaVNpckdsb2JhbClwMnBDb250ZXh0LT5oSGFsKSwgTE9HVywgRkwoIiBjYW5ub3QgY2FsbCBwMnBSZW1haW5PbkNoYW5uZWwgc3RhdGUgJWRcbiIpLCBwMnBDb250ZXh0LT5zdGF0ZSk7CisgICB9CisKKyAgIHJldHVybjsKK30KKworCitzdGF0aWMgZUhhbFN0YXR1cyBwMnBMaXN0ZW5TdGF0ZURpc2NvdmVyYWJsZUNhbGxiYWNrKHRIYWxIYW5kbGUgaGFsSGFuZGxlLCB2b2lkICpwQ29udGV4dCwgZUhhbFN0YXR1cyByZXRTdGF0dXMpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaGFsSGFuZGxlKTsKKyAgIHRwMnBDb250ZXh0ICpwMnBDb250ZXh0ID0gKHRwMnBDb250ZXh0KikgcENvbnRleHQ7CisKKyAgIGlmKCAoZVAyUF9TVEFURV9ESVNDT05ORUNURUQgPT0gcDJwQ29udGV4dC0+c3RhdGUpICYmIAorICAgICAgIChlU3RhdGVEaXNhYmxlZCAhPSBwMnBDb250ZXh0LT5saXN0ZW5EaXNjb3ZlcmFibGVTdGF0ZSkgJiYgCisgICAgICAgKE5VTEwgPT0gcDJwQ29udGV4dC0+cDJwRGlzY292ZXJDQkZ1bmMpICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyByZXN0YXJ0IGxpc3RlbiB0aW1lciBleHBpcmUgdGltZSAlZFxuIiwgCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHAycENvbnRleHQtPmV4cGlyZV90aW1lKTsKKyAgICAgIC8vV2UgY2FuIHJlc3RhcnQgdGhlIGxpc3RlbmluZworICAgICAgc3RhdHVzID0gcGFsVGltZXJTdGFydChwTWFjLT5oSGRkLCBwMnBDb250ZXh0LT5saXN0ZW5UaW1lckhhbmRsZXIsIHAycENvbnRleHQtPmV4cGlyZV90aW1lLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgVk9TX0FTU0VSVChzdGF0dXMpOworICAgICAgfQorICAgfQorICAgZWxzZQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIG5vdCByZXN0YXJ0IGxpc3RlbiB0aW1lciAgc3RhdGUgKCVkKVxuIiwgCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHAycENvbnRleHQtPnN0YXRlKTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworCitlSGFsU3RhdHVzIFAyUF9MaXN0ZW5TdGF0ZURpc2NvdmVyYWJsZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXAycExpc3RlblN0YXRlRGlzY292ZXJhYmlsaXR5IGxpc3RlblN0YXRlKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICBzd2l0Y2ggKGxpc3RlblN0YXRlKSAKKyAgIHsKKyAgIGNhc2UgUDJQX0RFVklDRV9OT1RfRElTQ09WRVJBQkxFOgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIFAyUF9OT1RfRElTQ09WRVJBQkxFXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLmxpc3RlbkRpc2NvdmVyYWJsZVN0YXRlID0gZVN0YXRlRGlzYWJsZWQ7CisgICAgICBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0uRGlzY292ZXJhYmxlQ2ZnID0gbGlzdGVuU3RhdGU7CisgICAgICBpZiAocE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLnN0YXRlID09IGVQMlBfU1RBVEVfRElTQ09OTkVDVEVEKQorICAgICAgeworICAgICAgICAgc21lX0NhbmNlbFJlbWFpbk9uQ2hhbm5lbChoSGFsLCBzZXNzaW9uSWQgKTsKKworICAgICAgICAgaWYgKHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5saXN0ZW5UaW1lckhhbmRsZXIpCisgICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLmxpc3RlblRpbWVySGFuZGxlcik7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXMgVGltZXIgU3RvcCBzdGF0dXMgJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsICIlcyBQMlBfTk9UX0RJU0NPVkVSQUJMRSBub3QgaW4gcmlnaHQgc3RhdGUgKCVkKSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5zdGF0ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgY2FzZSBQMlBfREVWSUNFX0FVVE9fQVZBSUxBQklMSVRZOgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIFAyUF9BVVRPX0FWQUlMQUJJTElUWVxuIixfX0ZVTkNUSU9OX18pOworICAgICAgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLmxpc3RlbkRpc2NvdmVyYWJsZVN0YXRlID0gZVN0YXRlRW5hYmxlZDsKKyAgICAgIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5EaXNjb3ZlcmFibGVDZmcgPSBsaXN0ZW5TdGF0ZTsKKyAgICAgIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5leHBpcmVfdGltZSA9IFAyUF9MSVNURU5fVElNRU9VVF9BVVRPICogUEFMX1RJTUVSX1RPX01TX1VOSVQ7CisgICAgICBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0ubGlzdGVuRHVyYXRpb24gPSBQMlBfTElTVEVOX1RJTUVPVVQ7CisgICAgICBpZiAocE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLnN0YXRlID09IGVQMlBfU1RBVEVfRElTQ09OTkVDVEVEKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIENhbGxpbmcgUmVtYWluT25DaGFubmVsIHdpdGggZGlyYXRpb24gJWQgb24gY2hhbm5lbCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLmxpc3RlbkR1cmF0aW9uLCBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0uUDJQTGlzdGVuQ2hhbm5lbCk7CisgICAgICAgICBwMnBSZW1haW5PbkNoYW5uZWwoIHBNYWMsIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5TTUVzZXNzaW9uSWQsIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5QMlBMaXN0ZW5DaGFubmVsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5saXN0ZW5EdXJhdGlvbiwgcDJwTGlzdGVuU3RhdGVEaXNjb3ZlcmFibGVDYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLCBlUDJQUmVtYWluT25DaG5SZWFzb25MaXN0ZW4pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsICIlcyBQMlBfQVVUT19ESVNDT1ZFUkFCTEUgbm90IGluIHJpZ2h0IHN0YXRlICglZCkiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0uc3RhdGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGNhc2UgUDJQX0RFVklDRV9ISUdIX0FWQUlMQUJJTElUWToKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyBQMlBfSElHSF9BVkFJTEFCSUxJVFlcbiIsX19GVU5DVElPTl9fKTsKKyAgICAgIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5saXN0ZW5EaXNjb3ZlcmFibGVTdGF0ZSA9IGVTdGF0ZUVuYWJsZWQ7CisgICAgICBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0uRGlzY292ZXJhYmxlQ2ZnID0gbGlzdGVuU3RhdGU7CisgICAgICBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0uZXhwaXJlX3RpbWUgPSBQMlBfUkVNQUlOX09OX0NIQU5fVElNRU9VVF9MT1cgKiBQQUxfVElNRVJfVE9fTVNfVU5JVDsKKyAgICAgIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5saXN0ZW5EdXJhdGlvbiA9IFAyUF9MSVNURU5fVElNRU9VVF9ISUdIOworICAgICAgaWYgKHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5zdGF0ZSA9PSBlUDJQX1NUQVRFX0RJU0NPTk5FQ1RFRCkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyBDYWxsaW5nIFJlbWFpbk9uQ2hhbm5lbCB3aXRoIGRpcmF0aW9uICVkIG9uIGNoYW5uZWwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5saXN0ZW5EdXJhdGlvbiwgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLlAyUExpc3RlbkNoYW5uZWwpOworICAgICAgICAgcDJwUmVtYWluT25DaGFubmVsKCBwTWFjLCBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0uU01Fc2Vzc2lvbklkLCBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0uUDJQTGlzdGVuQ2hhbm5lbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0ubGlzdGVuRHVyYXRpb24sIHAycExpc3RlblN0YXRlRGlzY292ZXJhYmxlQ2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXSwgZVAyUFJlbWFpbk9uQ2huUmVhc29uTGlzdGVuKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAiJXMgUDJQX0hJR0hfRElTQ09WRVJBQkxFIG5vdCBpbiByaWdodCBzdGF0ZSAoJWQpIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLnN0YXRlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICBjYXNlIDIzNDogLy9Ob3QgdG8gdXNlIHRoaXMgYXMgaXQgZW5hYmxpbmcgR08gdG8gYmUgY29uY3VycmVudCB3aXRoIFAyUCBkZXZpY2UgUDJQX0RFVklDRV9ISUdIX0FWQUlMQUJJTElUWToKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlcyBQMlBfSElHSF9BVkFJTEFCSUxJVFlcbiIsX19GVU5DVElPTl9fKTsKKyAgICAgIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5saXN0ZW5EaXNjb3ZlcmFibGVTdGF0ZSA9IGVTdGF0ZUVuYWJsZWQ7CisgICAgICBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0uRGlzY292ZXJhYmxlQ2ZnID0gbGlzdGVuU3RhdGU7CisKKyAgICAgIGlmICgocE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLlAyUE9wZXJhdGluZ0NoYW5uZWwgIT0gcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLlAyUExpc3RlbkNoYW5uZWwpCisgICAgICAgICAgICYmIHAycElzR09wb3J0RW5hYmxlZChwTWFjKSkKKyAgICAgIHsKKyAgICAgICAgIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5leHBpcmVfdGltZSA9IFAyUF9MSVNURU5fVElNRU9VVF9ISUdIICogUEFMX1RJTUVSX1RPX01TX1VOSVQgKiA1OworICAgICAgICAgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLmxpc3RlbkR1cmF0aW9uID0gUDJQX1JFTUFJTl9PTl9DSEFOX1RJTUVPVVRfTE9XOworICAgICAgfSAKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5leHBpcmVfdGltZSA9IFAyUF9MSVNURU5fVElNRU9VVF9ISUdIICogUEFMX1RJTUVSX1RPX01TX1VOSVQ7CisgICAgICAgICBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0ubGlzdGVuRHVyYXRpb24gPSBQMlBfTElTVEVOX1RJTUVPVVQ7CisgICAgICB9CisKKyAgICAgIGlmIChwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0uc3RhdGUgPT0gZVAyUF9TVEFURV9ESVNDT05ORUNURUQpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXMgQ2FsbGluZyBSZW1haW5PbkNoYW5uZWwgd2l0aCBkaXJhdGlvbiAlZCBvbiBjaGFubmVsICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0ubGlzdGVuRHVyYXRpb24sIHBNYWMtPnAycENvbnRleHRbc2Vzc2lvbklkXS5QMlBMaXN0ZW5DaGFubmVsKTsKKyAgICAgICAgIHAycFJlbWFpbk9uQ2hhbm5lbCggcE1hYywgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLlNNRXNlc3Npb25JZCwgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLlAyUExpc3RlbkNoYW5uZWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cDJwQ29udGV4dFtzZXNzaW9uSWRdLmxpc3RlbkR1cmF0aW9uLCBwMnBMaXN0ZW5TdGF0ZURpc2NvdmVyYWJsZUNhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTWFjLT5wMnBDb250ZXh0W3Nlc3Npb25JZF0sIGVQMlBSZW1haW5PbkNoblJlYXNvbkxpc3Rlbik7CisgICAgICB9CisgICAgICAKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgIiVzIFVua25vd24gbGlzdGVuIHNldHRpbmciLF9fRlVOQ1RJT05fXywgbGlzdGVuU3RhdGUpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgICByZXR1cm4oIHN0YXR1cyApOworfQorCisKK3ZvaWQgcDJwQ2FsbERpc2NvdmVyQ2FsbGJhY2sodHAycENvbnRleHQgKnAycENvbnRleHQsIGVQMlBEaXNjb3ZlclN0YXR1cyBzdGF0dXNDb2RlKQoreworICAgaWYgKHAycENvbnRleHQtPnAycERpc2NvdmVyQ0JGdW5jKQorICAgeworICAgICAgcDJwRGlzY292ZXJDb21wbGV0ZUNhbGxiYWNrIHBjYWxsYmFjayA9IHAycENvbnRleHQtPnAycERpc2NvdmVyQ0JGdW5jOworICAgICAgcDJwQ29udGV4dC0+cDJwRGlzY292ZXJDQkZ1bmMgPSBOVUxMOworICAgICAgcGNhbGxiYWNrKHAycENvbnRleHQtPmhIYWwsIHAycENvbnRleHQtPnBDb250ZXh0LCBzdGF0dXNDb2RlKTsKKyAgIH0KKyAgIHAycENvbnRleHQtPmRpcmVjdGVkRGlzY292ZXJ5ID0gRkFMU0U7Cit9CisKKwordm9pZCBwMnBEaXNjb3ZlclRpbWVySGFuZGxlcih2b2lkICpwQ29udGV4dCkKK3sKKyAgIHRwMnBDb250ZXh0ICpwMnBDb250ZXh0ID0gKHRwMnBDb250ZXh0KikgcENvbnRleHQ7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAiJXMgZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgcDJwQ2FsbERpc2NvdmVyQ2FsbGJhY2socDJwQ29udGV4dCwgCisgICAgICAgICAocDJwQ29udGV4dC0+ZGlyZWN0ZWREaXNjb3ZlcnkpID8gZVAyUF9ESVJFQ1RFRF9ESVNDT1ZFUiA6IGVQMlBfRElTQ09WRVJfU1VDQ0VTUyk7CisKKyAgIHN0YXR1cyA9IHAycEZzbShwMnBDb250ZXh0LCBlUDJQX1RSSUdHRVJfRElTQ09OTkVDVEVEKTsKKworICAgcmV0dXJuOworfQorCisKKworZUhhbFN0YXR1cyBwMnBHZXRSZXN1bHRGaWx0ZXIodHAycENvbnRleHQgKnBQMnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclNjYW5SZXN1bHRGaWx0ZXIgKnBGaWx0ZXIpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB2X1UzMl90IHVOdW1EZXZpY2VGaWx0ZXJzOworICAgdHAycERpc2NvdmVyRGV2aWNlRmlsdGVyICpkaXJlY3RlZERpc2NvdmVyeUZpbHRlcjsKKyAgIGludCBpOworICAgdENzckJzc2lkICpic3NpZCA9IE5VTEw7CisKKyAgIGRvCisgICB7CisgICAgICBpZiggKE5VTEwgIT0gcFAycENvbnRleHQpICYmIChOVUxMICE9IHBGaWx0ZXIpICkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1femVybyhwRmlsdGVyLCBzaXplb2YodENzclNjYW5SZXN1bHRGaWx0ZXIpKTsKKyAgICAgICAgIHVOdW1EZXZpY2VGaWx0ZXJzID0gcFAycENvbnRleHQtPnVOdW1EZXZpY2VGaWx0ZXJzOworICAgICAgICAgZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXIgPSBwUDJwQ29udGV4dC0+ZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXI7CisgICAgICAgICBmb3IoaSA9IDA7IGkgPCB1TnVtRGV2aWNlRmlsdGVyczsgaSsrKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyLT51Y0JpdG1hc2sgJiBESVNDT1ZFUllfRklMVEVSX0JJVE1BU0tfREVWSUNFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcEZpbHRlci0+QlNTSURzLm51bU9mQlNTSURzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgoZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXItPnVjQml0bWFzayAhPSBRQ1dMQU5fUDJQX0RJU0NPVkVSX0FOWSkgCisgICAgICAgICAgICAgICAmJiAoZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXItPnVjQml0bWFzayAmIERJU0NPVkVSWV9GSUxURVJfQklUTUFTS19HTykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL01hdGNoaW5nIERldmljZSBJRCBhbmQgR3JvdXBTU0lECisgICAgICAgICAgICAgICBwRmlsdGVyLT5CU1NJRHMubnVtT2ZCU1NJRHMrKzsKKyAgICAgICAgICAgICAgIGlmKGRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyLT5Hcm91cFNTSUQubGVuZ3RoKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcEZpbHRlci0+U1NJRHMubnVtT2ZTU0lEcysrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXIgKz0gc2l6ZW9mKHRwMnBEaXNjb3ZlckRldmljZUZpbHRlcik7CisgICAgICAgICB9CisKKyAgICAgICAgIGRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyID0gcFAycENvbnRleHQtPmRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyOworICAgICAgICAgaWYgKHBGaWx0ZXItPkJTU0lEcy5udW1PZkJTU0lEcykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGJzc2lkID0gKCB0Q3NyQnNzaWQgKikgdm9zX21lbV9tYWxsb2MoIHNpemVvZiggdENzckJzc2lkICkgKiBwRmlsdGVyLT5CU1NJRHMubnVtT2ZCU1NJRHMgKTsKKyAgICAgICAgICAgIGlmKE5VTEwgPT0gYnNzaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAiICVzIGZhaWwgdG8gYWxsb2NhdGUgYnNzaWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfUkVTT1VSQ0VTOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBGaWx0ZXItPkJTU0lEcy5ic3NpZCA9IGJzc2lkOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdU51bURldmljZUZpbHRlcnM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHZvc19tZW1fY29weShic3NpZCwgZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXItPkRldmljZUlELCBQMlBfTUFDX0FERFJFU1NfTEVOKTsKKyAgICAgICAgICAgICAgIGJzc2lkICs9IHNpemVvZih0Q3NyQnNzaWQpOworICAgICAgICAgICAgICAgZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXIgKz0gc2l6ZW9mKHRwMnBEaXNjb3ZlckRldmljZUZpbHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyID0gcFAycENvbnRleHQtPmRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyOworICAgICAgICAgaWYgKHBGaWx0ZXItPlNTSURzLm51bU9mU1NJRHMpCisgICAgICAgICB7CisgICAgICAgICAgICBwRmlsdGVyLT5TU0lEcy5TU0lETGlzdCA9ICh0Q3NyU1NJREluZm8gKil2b3NfbWVtX21hbGxvYyggc2l6ZW9mKCAqcEZpbHRlci0+U1NJRHMuU1NJRExpc3QgKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsdGVyLT5TU0lEcy5udW1PZlNTSURzICk7CisgICAgICAgICAgICBpZihOVUxMID09IHBGaWx0ZXItPlNTSURzLlNTSURMaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgIiAlcyBmYWlsIHRvIGFsbG9jYXRlIGJzc2lkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHBGaWx0ZXItPlNTSURzLlNTSURMaXN0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgdU51bURldmljZUZpbHRlcnM7IGkrKyApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXItPnVjQml0bWFzayA9PSBESVNDT1ZFUllfRklMVEVSX0JJVE1BU0tfR08pCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZihkaXJlY3RlZERpc2NvdmVyeUZpbHRlci0+R3JvdXBTU0lELmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBGaWx0ZXItPlNTSURzLlNTSURMaXN0W2ldLlNTSUQubGVuZ3RoID0gZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXItPkdyb3VwU1NJRC5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB2b3NfbWVtX2NvcHkoIHBGaWx0ZXItPlNTSURzLlNTSURMaXN0W2ldLlNTSUQuc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyLT5Hcm91cFNTSUQuc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyLT5Hcm91cFNTSUQubGVuZ3RoICk7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBkaXJlY3RlZERpc2NvdmVyeUZpbHRlciArPSBzaXplb2YodHAycERpc2NvdmVyRGV2aWNlRmlsdGVyKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcEZpbHRlci0+cDJwUmVzdWx0ID0gVFJVRTsKKyAgICAgIHBGaWx0ZXItPmJXUFNBc3NvY2lhdGlvbiA9IFRSVUU7CisgICAgICBwRmlsdGVyLT5CU1NUeXBlID0gZUNTUl9CU1NfVFlQRV9BTlk7CisgICB9IHdoaWxlKDApOworCisgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICBpZihwRmlsdGVyLT5TU0lEcy5TU0lETGlzdCkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZShwRmlsdGVyLT5TU0lEcy5TU0lETGlzdCk7CisgICAgICAgICBwRmlsdGVyLT5TU0lEcy5TU0lETGlzdCA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiggcEZpbHRlci0+QlNTSURzLmJzc2lkICkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZShwRmlsdGVyLT5CU1NJRHMuYnNzaWQpOworICAgICAgICAgcEZpbHRlci0+QlNTSURzLmJzc2lkID0gTlVMTDsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICBAYnJlaWYgRnVuY3Rpb24gY2FsbHMgUDJQX0ZzbSBmdW5jdGlvbiB0byBpbml0aWF0ZSB0aGUgUDJQIERpc2NvdmVyIHByb2Nlc3MKKworICBAcGFyYW1baW5dIGhIYWwgLSBIYW5kbGUgdG8gTUFDIHN0cnVjdHVyZS4KKyAgICAgICAgW2luXSBzZXNzaW9uSUQgLSBTZXNzaW9uIElEIHJldHVybmVkIGJ5IHNtZV9PcGVuU2Vzc2lvbgorICAgICAgICBbaW5dIHBEaXNjb3ZlclJlcXVlc3QgLSBwb2ludGVyIHRvIHRoZSB0cDJwRGlzY292ZXJSZXF1ZXN0IHN0cnVjdHVyZQorICAgICAgICAgICAgIHdob3NlIHBhcmFtZXRlcnMgYXJlIGZpbGxlZCBpbiB0aGUgSERELgorICAgICAgICBbaW5dIGNhbGxiYWNrIC0gSEREIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIERpc2NvdmVyCisgICAgICAgICAgICAgaXMgY29tcGxldGUKKyAgICAgICAgW2luXSBwQ29udGV4dCAtIGEgcG9pbnRlciBwYXNzZWQgaW4gZm9yIHRoZSBjYWxsYmFjaworCisgIEByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRSAtIElmIHN1Y2Nlc3MuCisgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIElmIGZhaWx1cmUuCisqLworZUhhbFN0YXR1cyBQMlBfRGlzY292ZXJSZXF1ZXN0KHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICB0QU5JX1U4IFNlc3Npb25JRCwKKyAgICAgICAgICAgICAgICB0UDJQRGlzY292ZXJSZXF1ZXN0ICpwRGlzY292ZXJSZXF1ZXN0LAorICAgICAgICAgICAgICAgIHAycERpc2NvdmVyQ29tcGxldGVDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICB2b2lkICpwQ29udGV4dCkKK3sKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCAgICAgICBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICB0U2NhblJlc3VsdEhhbmRsZSAgICBoU2NhblJlc3VsdCA9IE5VTEw7CisgICB0Q3NyU2NhblJlc3VsdEZpbHRlciBmaWx0ZXI7CisgICB0QU5JX1UzMiB1TnVtRGV2aWNlRmlsdGVyczsKKyAgIHRwMnBEaXNjb3ZlckRldmljZUZpbHRlciAqcERldmljZUZpbHRlcnM7CisgICB0QU5JX1UzMiBpID0gMDsKKyAgIHRwMnBDb250ZXh0ICpwUDJwQ29udGV4dCA9ICZwTWFjLT5wMnBDb250ZXh0W1Nlc3Npb25JRF07CisgICB0Q3NyQnNzaWQgKmJzc2lkID0gTlVMTDsKKyAgIHRwMnBEaXNjb3ZlckRldmljZUZpbHRlciBkaXNjb3ZlckZpbHRlcjsKKyAgIHRBTklfQk9PTEVBTiBmRGlyZWN0ID0gRkFMU0U7CisKKyAgIGlmIChwRGlzY292ZXJSZXF1ZXN0ID09IE5VTEwpCisgICB7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBwUDJwQ29udGV4dC0+ZGlzY292ZXJUeXBlICAgICAgPSBwRGlzY292ZXJSZXF1ZXN0LT5kaXNjb3ZlclR5cGU7CisgICBwUDJwQ29udGV4dC0+c2NhblR5cGUgICAgICAgICAgPSBwRGlzY292ZXJSZXF1ZXN0LT5zY2FuVHlwZTsKKyAgIHBQMnBDb250ZXh0LT51RGlzY292ZXJUaW1lb3V0ICA9IHBEaXNjb3ZlclJlcXVlc3QtPnVEaXNjb3ZlclRpbWVvdXQ7CisKKyAgIGlmIChwUDJwQ29udGV4dC0+RGlzY292ZXJSZXFJZUZpZWxkKQorICAgeworICAgICAgdm9zX21lbV9mcmVlKHBQMnBDb250ZXh0LT5EaXNjb3ZlclJlcUllRmllbGQpOworICAgICAgcFAycENvbnRleHQtPkRpc2NvdmVyUmVxSWVMZW5ndGggPSAwOworICAgICAgcFAycENvbnRleHQtPkRpc2NvdmVyUmVxSWVGaWVsZCA9IE5VTEw7CisgICB9CisKKyAgIGlmIChwRGlzY292ZXJSZXF1ZXN0LT51SUVMZW4pCisgICB7CisgICAgICBwUDJwQ29udGV4dC0+RGlzY292ZXJSZXFJZUZpZWxkID0gKHRBTklfVTggKil2b3NfbWVtX21hbGxvYyhwRGlzY292ZXJSZXF1ZXN0LT51SUVMZW4pOworICAgICAgdm9zX21lbV9jb3B5KCh0QU5JX1U4ICopcFAycENvbnRleHQtPkRpc2NvdmVyUmVxSWVGaWVsZCwgcERpc2NvdmVyUmVxdWVzdC0+cElFRmllbGQsIHBEaXNjb3ZlclJlcXVlc3QtPnVJRUxlbik7CisgICAgICBwUDJwQ29udGV4dC0+RGlzY292ZXJSZXFJZUxlbmd0aCA9IHBEaXNjb3ZlclJlcXVlc3QtPnVJRUxlbjsKKyAgIH0gCisgICBlbHNlCisgICB7CisgICAgICBwUDJwQ29udGV4dC0+RGlzY292ZXJSZXFJZUxlbmd0aCA9IDA7CisgICB9CisKKyAgIHZvc19tZW1femVybygmZmlsdGVyLCBzaXplb2YoZmlsdGVyKSk7CisKKyAgIGRvCisgICB7CisgICAgICBpZiAocERpc2NvdmVyUmVxdWVzdC0+dU51bURldmljZUZpbHRlcnMpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXMgZGlyZWN0ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICBmRGlyZWN0ID0gVFJVRTsKKyAgICAgICAgIHVOdW1EZXZpY2VGaWx0ZXJzID0gcERpc2NvdmVyUmVxdWVzdC0+dU51bURldmljZUZpbHRlcnM7CisKKyAgICAgICAgIHBQMnBDb250ZXh0LT51RGlzY292ZXJUaW1lb3V0ID0gcFAycENvbnRleHQtPnVEaXNjb3ZlclRpbWVvdXQ7CisgICAgICAgICBwUDJwQ29udGV4dC0+dU51bURldmljZUZpbHRlcnMgPSBwRGlzY292ZXJSZXF1ZXN0LT51TnVtRGV2aWNlRmlsdGVyczsKKyAgICAgICAgIGlmKHBQMnBDb250ZXh0LT51TnVtRGV2aWNlRmlsdGVyQWxsb2NhdGVkIDwgcERpc2NvdmVyUmVxdWVzdC0+dU51bURldmljZUZpbHRlcnMpCisgICAgICAgICB7CisgICAgICAgICAgICBpZihwUDJwQ29udGV4dC0+ZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwUDJwQ29udGV4dC0+dU51bURldmljZUZpbHRlckFsbG9jYXRlZCA9IDA7CisgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocFAycENvbnRleHQtPmRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyKTsKKyAgICAgICAgICAgICAgIHBQMnBDb250ZXh0LT5kaXJlY3RlZERpc2NvdmVyeUZpbHRlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwUDJwQ29udGV4dC0+ZGlyZWN0ZWREaXNjb3ZlcnlGaWx0ZXIgPSAodHAycERpc2NvdmVyRGV2aWNlRmlsdGVyICopCisgICAgICAgICAgICAgICAgICB2b3NfbWVtX21hbGxvYyhzaXplb2YodHAycERpc2NvdmVyRGV2aWNlRmlsdGVyKSAqIHVOdW1EZXZpY2VGaWx0ZXJzKTsKKyAgICAgICAgICAgIGlmKE5VTEwgPT0gcFAycENvbnRleHQtPmRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgIiVzIGZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkaXNjb3ZlckZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBQMnBDb250ZXh0LT51TnVtRGV2aWNlRmlsdGVyQWxsb2NhdGVkID0gdU51bURldmljZUZpbHRlcnM7CisgICAgICAgICB9CisKKyAgICAgICAgIHBEZXZpY2VGaWx0ZXJzID0gcERpc2NvdmVyUmVxdWVzdC0+cERldmljZUZpbHRlcnM7CisgICAgICAgICBpZihOVUxMICE9IHBEZXZpY2VGaWx0ZXJzKQorICAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV9jb3B5ICggcFAycENvbnRleHQtPmRpcmVjdGVkRGlzY292ZXJ5RmlsdGVyLCBwRGV2aWNlRmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cDJwRGlzY292ZXJEZXZpY2VGaWx0ZXIpICogdU51bURldmljZUZpbHRlcnMpOworCisgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cyA9IHAycEdldFJlc3VsdEZpbHRlcihwUDJwQ29udGV4dCwgJmZpbHRlcikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgIiVzIGZhaWwgdG8gY3JlYXRlIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0vL2lmKE5VTEwgIT0gcERldmljZUZpbHRlcnMpCisKKyAgICAgICAgIHN0YXR1cyA9IGNzclNjYW5HZXRSZXN1bHQocE1hYywgJmZpbHRlciwgJmhTY2FuUmVzdWx0KTsKKyAgICAgICAgIGlmIChoU2NhblJlc3VsdCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICIlcyBjYWxsaW5nIHAycERpc2NvdmVyQ29tcGxldGVDYWxsYmFja1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGlmIChjYWxsYmFjaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhbGxiYWNrKGhIYWwsIHBDb250ZXh0LCBlUDJQX0RJUkVDVEVEX0RJU0NPVkVSKTsKKworICAgICAgICAgICAgfSAgICAgICAKKyAgICAgICAgICAgIHN0YXR1cyA9ICBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAiJXMgRGlyZWN0ZWQgZmluZCBkaWQgbm90IGZpbmQgQlNTSUQgaW4gY2FjaGVcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBwUDJwQ29udGV4dC0+Zm9ybWF0aW9uUmVxLnRhcmdldExpc3RlbkNoYW5uZWwgPSAwOworICAgICAgICAgICAgaWYgKHBEaXNjb3ZlclJlcXVlc3QtPnVOdW1EZXZpY2VGaWx0ZXJzID09IDEgJiYgZmlsdGVyLkJTU0lEcy5udW1PZkJTU0lEcyA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdm9zX21lbV9jb3B5KCZwUDJwQ29udGV4dC0+Zm9ybWF0aW9uUmVxLmRldmljZUFkZHJlc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpc2NvdmVyUmVxdWVzdC0+cERldmljZUZpbHRlcnMtPkRldmljZUlELCBQMlBfTUFDX0FERFJFU1NfTEVOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcFAycENvbnRleHQtPnAycERpc2NvdmVyQ0JGdW5jID0gY2FsbGJhY2s7CisgICAgICBwUDJwQ29udGV4dC0+cENvbnRleHQgICAgICAgICAgPSBwQ29udGV4dDsKKyAgICAgIHBQMnBDb250ZXh0LT5kaXJlY3RlZERpc2NvdmVyeSA9IGZEaXJlY3Q7CisgICAgICBpZighcFAycENvbnRleHQtPkdyb3VwRm9ybWF0aW9uUGVuZGluZykKKyAgICAgIHsKKyAgICAgICAgIHAycEZzbSgmcE1hYy0+cDJwQ29udGV4dFtTZXNzaW9uSURdLCBlUDJQX1RSSUdHRVJfREVWSUNFX01PREVfREVWSUNFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELCAKKyAgICAgICAgICAgICAgICIlcyB3aGlsZSBncm91cCBmb3JtYXRpb24iLCBfX0ZVTkNUSU9OX18pOworICAgICAgfQorCisgICAgICBwUDJwQ29udGV4dC0+dURpc2NvdmVyVGltZW91dCA9IHBEaXNjb3ZlclJlcXVlc3QtPnVEaXNjb3ZlclRpbWVvdXQ7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwgIiVzIFN0YXJ0IGRpc2NvdmVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHN0YXR1cyA9IHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcFAycENvbnRleHQtPmRpc2NvdmVyVGltZXIsIAorICAgICAgICAgICAgICAgICAgICAgcFAycENvbnRleHQtPnVEaXNjb3ZlclRpbWVvdXQgKiAxMDAwLCBlQU5JX0JPT0xFQU5fRkFMU0UpOworICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIiVzIGZhaWx0IHRvIHN0YXJ0IGRpc2NvdmVyIHRpbWVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHBQMnBDb250ZXh0LT5wMnBEaXNjb3ZlckNCRnVuYyA9IE5VTEw7CisgICAgICAgICAgICBwUDJwQ29udGV4dC0+cENvbnRleHQgICAgICAgICAgPSBOVUxMOworICAgICAgICAgICAgaWYoY2FsbGJhY2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYWxsYmFjayhwTWFjLCBwQ29udGV4dCwgZVAyUF9ESVNDT1ZFUl9GQUlMVVJFKTsKKyAgICAgICAgICAgIH0KKyAgICAgIH0KKyAgIH13aGlsZSgwKTsKKworICAgaWYoZmlsdGVyLlNTSURzLlNTSURMaXN0KQorICAgeworICAgICAgdm9zX21lbV9mcmVlKGZpbHRlci5TU0lEcy5TU0lETGlzdCk7CisgICB9CisgICBpZiggaFNjYW5SZXN1bHQgKQorICAgeworICAgICAgc21lX1NjYW5SZXN1bHRQdXJnZSggcE1hYywgaFNjYW5SZXN1bHQgKTsKKyAgIH0KKyAgIGlmKCBmaWx0ZXIuQlNTSURzLmJzc2lkICkKKyAgIHsKKyAgICAgIHZvc19tZW1fZnJlZShmaWx0ZXIuQlNTSURzLmJzc2lkKTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworZUhhbFN0YXR1cyBwMnBTY2FuUmVxdWVzdCh0cDJwQ29udGV4dCAqcDJwQ29udGV4dCwgcDJwRGlzY292ZXJDb21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwQ29udGV4dCkKK3sKKyAgIHRDc3JTY2FuUmVxdWVzdCBzY2FuUmVxdWVzdDsKKyAgIHZfVTMyX3Qgc2NhbklkID0gMDsKKyAgIHRBTklfVTMyIGxlbiA9IDA7CisgICB0Q3NyU1NJREluZm8gd2NTU0lEID0geyB7UDJQX1dJTERDQVJEX1NTSURfTEVOLCBQMlBfV0lMRENBUkRfU1NJRH0sIDAsIDAgfTsKKyAgIHRBTklfVTggQ2hhbm5lbDsgCisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0UDJQX09wZXJhdGluZ0NoYW5uZWwgcDJwT3BlcmF0aW5nQ2hhbm5lbDsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChwMnBDb250ZXh0LT5oSGFsKTsKKyAgIHRBTklfVTggKnAycEllID0gTlVMTDsKKyAgIHRBTklfVTMyIHAycEllTGVuOworCisgICB2b3NfbWVtX3plcm8oICZzY2FuUmVxdWVzdCwgc2l6ZW9mKHNjYW5SZXF1ZXN0KSk7CisKKyAgIFAyUF9HZXRPcGVyYXRpbmdDaGFubmVsKHAycENvbnRleHQtPmhIYWwsIHAycENvbnRleHQtPnNlc3Npb25JZCwgJnAycE9wZXJhdGluZ0NoYW5uZWwpOworICAgQ2hhbm5lbCA9IHAycE9wZXJhdGluZ0NoYW5uZWwuY2hhbm5lbDsKKyAgIAorICAgaWYgKENoYW5uZWwpCisgICB7CisgICAgICBzY2FuUmVxdWVzdC5DaGFubmVsSW5mby5udW1PZkNoYW5uZWxzID0gMTsgICAgICAKKyAgICAgIHNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gJkNoYW5uZWw7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIFNjYW4gb24gY2hhbm5lbCAlZCBwMnBDb250ZXh0LT5zZXNzaW9uSWQgJWRcbiIsIAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBDaGFubmVsLCBwMnBDb250ZXh0LT5zZXNzaW9uSWQpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgIGdldENoYW5uZWxJbmZvKHAycENvbnRleHQsICZzY2FuUmVxdWVzdC5DaGFubmVsSW5mbywgV0ZEX0RJU0NPVkVSX1RZUEVfQVVUTyk7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBTY2FuIG9uIGFsbCBjaGFubmVsc1xuIiwgCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgfQorCisgICAvKiBzZXQgdGhlIHNjYW4gdHlwZSB0byBhY3RpdmUgKi8KKyAgIHNjYW5SZXF1ZXN0LnNjYW5UeXBlID0gZVNJUl9BQ1RJVkVfU0NBTjsKKworICAgdm9zX21lbV9zZXQoIHNjYW5SZXF1ZXN0LmJzc2lkLCBzaXplb2YoIHRDc3JCc3NpZCApLCAweGZmICk7CisKKyAgIHNjYW5SZXF1ZXN0LnJlcXVlc3RUeXBlID0gZUNTUl9TQ0FOX1AyUF9GSU5EX1BFRVI7CisgICAvKiBzZXQgbWluIGFuZCBtYXggY2hhbm5lbCB0aW1lIHRvIHplcm8gKi8KKyAgIHNjYW5SZXF1ZXN0Lm1pbkNoblRpbWUgPSAzMDsKKyAgIHNjYW5SZXF1ZXN0Lm1heENoblRpbWUgPSAxMDA7CisKKyAgIC8qIHNldCBCU1NUeXBlIHRvIGRlZmF1bHQgdHlwZSAqLworICAgc2NhblJlcXVlc3QuQlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworCisgICBzY2FuUmVxdWVzdC5TU0lEcy5udW1PZlNTSURzID0gMTsKKyAgIHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0ID0gJndjU1NJRDsKKyAgIHNjYW5SZXF1ZXN0LnAycFNlYXJjaCA9IFZPU19GQUxTRTsKKyAgICAgICAKKyAgIFAyUF9HZXRJRShwMnBDb250ZXh0LCBwMnBDb250ZXh0LT5zZXNzaW9uSWQsIGVQMlBfR1JPVVBfSUQsICZwMnBJZSwgJnAycEllTGVuKTsKKyAgIHZvc19tZW1fY29weShzY2FuUmVxdWVzdC5ic3NpZCwgKCh0UDJQR3JvdXBJZCAqKXAycEllKS0+ZGV2aWNlQWRkcmVzcywgUDJQX01BQ19BRERSRVNTX0xFTik7CisKKyAgIFAyUF9HZXRJRShwMnBDb250ZXh0LCBwMnBDb250ZXh0LT5zZXNzaW9uSWQsIGVQMlBfUFJPQkVfUkVRLCAgJnNjYW5SZXF1ZXN0LnBJRUZpZWxkLCAmbGVuKTsKKworICAgc2NhblJlcXVlc3QudUlFRmllbGRMZW4gPSBsZW47CisKKyAgIHN0YXR1cyA9IGNzclNjYW5SZXF1ZXN0KCBwMnBDb250ZXh0LT5oSGFsLCBwMnBDb250ZXh0LT5TTUVzZXNzaW9uSWQsICZzY2FuUmVxdWVzdCwgJnNjYW5JZCwgY2FsbGJhY2ssIHBDb250ZXh0ICk7CisKKyAgIGlmKHNjYW5SZXF1ZXN0LnBJRUZpZWxkKQorICAgeworICAgICAgdm9zX21lbV9mcmVlKHNjYW5SZXF1ZXN0LnBJRUZpZWxkKTsKKyAgIH0KKworICAgaWYocDJwSWUpCisgICB7CisgICAgICB2b3NfbWVtX2ZyZWUocDJwSWUpOworICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKwordEFOSV9VOCBnZXRQMlBTZXNzaW9uSWRGcm9tU01FU2Vzc2lvbklkKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBTZXNzaW9uSUQpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICB0QU5JX1U4IG51bV9zZXNzaW9uOworCisgICBmb3IgKG51bV9zZXNzaW9uID0gMDsgbnVtX3Nlc3Npb24gPCBNQVhfTk9fT0ZfUDJQX1NFU1NJT05TOyBudW1fc2Vzc2lvbisrKQorICAgeworICAgICAgaWYoU2Vzc2lvbklEID09IHBNYWMtPnAycENvbnRleHRbbnVtX3Nlc3Npb25dLlNNRXNlc3Npb25JZCkKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBwTWFjLT5wMnBDb250ZXh0W251bV9zZXNzaW9uXS5zZXNzaW9uSWQ7CisgICAgICB9CisgICB9CisgICAKKyAgIHJldHVybiBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworfQorCisKKy8qIFNlc3Npb25JRCBpcyBIREQgc2Vzc2lvbiBpZCwgbm90IFNNRSBzZXNzaW9uSWQqLworZUhhbFN0YXR1cyBwMnBDbG9zZVNlc3Npb24odEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IFNlc3Npb25JRCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgIHRwMnBDb250ZXh0ICpwQ29udGV4dCA9ICZwTWFjLT5wMnBDb250ZXh0W1Nlc3Npb25JRF07CisKKyAgIHBDb250ZXh0LT5TTUVzZXNzaW9uSWQgPSBDU1JfU0VTU0lPTl9JRF9JTlZBTElEOworICAgcDJwUmVzZXRDb250ZXh0KHBDb250ZXh0KTsKKworICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworZUhhbFN0YXR1cyBwMnBTZXRTZXNzaW9uSWQodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IFNlc3Npb25JRCwgdEFOSV9VOCBTbWVTZXNzaW9uSWQpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKyAgIHBNYWMtPnAycENvbnRleHRbU2Vzc2lvbklEXS5zZXNzaW9uSWQgPSBTZXNzaW9uSUQ7CisgICBwTWFjLT5wMnBDb250ZXh0W1Nlc3Npb25JRF0uU01Fc2Vzc2lvbklkID0gU21lU2Vzc2lvbklkOworCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIHRBTklfQk9PTEVBTiBwMnBJc0dPcG9ydEVuYWJsZWQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgdEFOSV9VOCBudW1fc2Vzc2lvbiA9IDA7CisKKyAgIGZvciAobnVtX3Nlc3Npb24gPSAwOyBudW1fc2Vzc2lvbiA8IE1BWF9OT19PRl9QMlBfU0VTU0lPTlMgOyBudW1fc2Vzc2lvbisrKQorICAgeworICAgICAgaWYgKHBNYWMtPnAycENvbnRleHRbbnVtX3Nlc3Npb25dLm9wZXJhdGluZ21vZGUgPT0gT1BFUkFUSU9OX01PREVfUDJQX0dST1VQX09XTkVSKQorICAgICAgeworICAgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworfQorCit0QU5JX0JPT0xFQU4gcDJwSXNPcGVyYXRpbmdDaGFubkVxdWFsTGlzdGVuQ2hhbm4odEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IFNlc3Npb25JRCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICAgaWYocE1hYy0+cDJwQ29udGV4dFtTZXNzaW9uSURdLlAyUE9wZXJhdGluZ0NoYW5uZWwgPT0gcE1hYy0+cDJwQ29udGV4dFtTZXNzaW9uSURdLlAyUExpc3RlbkNoYW5uZWwpCisgICB7CisgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUU7CisgICB9CisKKyAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7Cit9CisKK2VIYWxTdGF0dXMgcDJwR2V0TGlzdGVuQ2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggU2Vzc2lvbklELCB0QU5JX1U4ICpjaGFubmVsKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAqY2hhbm5lbCA9IHBNYWMtPnAycENvbnRleHRbU2Vzc2lvbklEXS5QMlBMaXN0ZW5DaGFubmVsOworICAKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCitlSGFsU3RhdHVzIHAycFNldExpc3RlbkNoYW5uZWwodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IFNlc3Npb25JRCwgdEFOSV9VOCBjaGFubmVsKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgdFAyUF9PcGVyYXRpbmdDaGFubmVsIHAycExpc3RlbkNoYW5uZWw7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIGlmKGNzclJvYW1Jc0NoYW5uZWxWYWxpZChwTWFjLCBjaGFubmVsKSkKKyAgIHsKKyAgICAgIHBNYWMtPnAycENvbnRleHRbU2Vzc2lvbklEXS5QMlBMaXN0ZW5DaGFubmVsID0gY2hhbm5lbDsKKyAgICAgIHAycEdldExpc3RlbkNoYW5uZWxBdHRyaWIocE1hYywgcE1hYy0+cDJwQ29udGV4dFtTZXNzaW9uSURdLnNlc3Npb25JZCwgJnAycExpc3RlbkNoYW5uZWwpOworICAgICAgcDJwTGlzdGVuQ2hhbm5lbC5jaGFubmVsID0gY2hhbm5lbDsKKyAgICAgIHAycFVwZGF0ZUxpc3RlbkNoYW5uZWxBdHRyaWIocE1hYywgcE1hYy0+cDJwQ29udGV4dFtTZXNzaW9uSURdLnNlc3Npb25JZCwgJnAycExpc3RlbkNoYW5uZWwpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgIiAlcyBmYWlsIHdpdGggaW52YWxpZCBjaGFubmVsICVkIiwgX19GVU5DVElPTl9fLCBjaGFubmVsKTsKKyAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgfQorICAKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKworCitlSGFsU3RhdHVzIHAycFN0b3BEaXNjb3ZlcnkodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IFNlc3Npb25JRCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgc3RhdHVzID0gcGFsVGltZXJTdG9wKHBNYWMtPmhIZGQsIHBNYWMtPnAycENvbnRleHRbU2Vzc2lvbklEXS5kaXNjb3ZlclRpbWVyKTsKKyAgIGlmIChzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgVGltZXIgU3RvcCBzdGF0dXMgJWRcbiIsICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXMgVGltZXIgU3RvcCBzdGF0dXMgJWRcbiIsICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisgICBwMnBDYWxsRGlzY292ZXJDYWxsYmFjaygmcE1hYy0+cDJwQ29udGV4dFtTZXNzaW9uSURdLCAgZVAyUF9ESVJFQ1RFRF9ESVNDT1ZFUik7CisKKyAgIHN0YXR1cyA9IHAycEZzbSggJnBNYWMtPnAycENvbnRleHRbU2Vzc2lvbklEXSwgZVAyUF9UUklHR0VSX0RJU0NPTk5FQ1RFRCApOworCisgICByZXR1cm4gc3RhdHVzOworfQorCisvL1B1cmdlIFAyUCBkZXZpY2UvR08gZnJvbSB0aGUgbGlzdAorZUhhbFN0YXR1cyBwMnBQdXJnZURldmljZUxpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdERibExpbmtMaXN0ICpwTGlzdCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIHRMaXN0RWxlbSAqcEVudHJ5LCAqcE5leHQ7CisgICB0Q3NyU2NhblJlc3VsdCAqcEJzc1Jlc3VsdDsKKyAgIHREb3QxMWZCZWFjb25JRXMgKnBJZXM7CisgICAgCisgICBjc3JMTExvY2socExpc3QpOworICAgCisgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKHBMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgIHdoaWxlKCBOVUxMICE9IHBFbnRyeSApCisgICB7CisgICAgICBwTmV4dCA9IGNzckxMTmV4dChwTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKTsKKyAgICAgIHBCc3NSZXN1bHQgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRDc3JTY2FuUmVzdWx0LCBMaW5rICk7CisgICAgICBwSWVzID0gTlVMTDsKKyAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyR2V0UGFyc2VkQnNzRGVzY3JpcHRpb25JRXMocE1hYywgJnBCc3NSZXN1bHQtPlJlc3VsdC5Cc3NEZXNjcmlwdG9yLCAmcEllcykpKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiICVzIGZhaWwgdG8gcGFyc2UgSUVzLiBwRW50cnkgKDB4JVgpIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcEVudHJ5KTsKKyAgICAgICAgIHBFbnRyeSA9IHBOZXh0OworICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiggcEllcy0+UDJQQmVhY29uUHJvYmVSZXMucHJlc2VudCApCisgICAgICB7CisgICAgICAgICAvL0ZvdW5kIGEgUDJQIEJTUworICAgICAgICAgaWYoY3NyTExSZW1vdmVFbnRyeShwTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTk9MT0NLKSApCisgICAgICAgICB7CisgICAgICAgICAgICBjc3JGcmVlU2NhblJlc3VsdEVudHJ5KCBwTWFjLCBwQnNzUmVzdWx0ICk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBJZXMpOworICAgICAgcEVudHJ5ID0gcE5leHQ7CisgICB9CisKKyAgIGNzckxMVW5sb2NrKHBMaXN0KTsKKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgc21lX3AycEZsdXNoRGV2aWNlTGlzdCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggSEREU2Vzc2lvbklkKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiZW50ZXIiKSk7CisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICBzdGF0dXMgPSBwMnBQdXJnZURldmljZUxpc3QocE1hYywgJnBNYWMtPnNjYW4uc2NhblJlc3VsdExpc3QpOworICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIHNtZV9wMnBSZXNldFNlc3Npb24odEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IEhERFNlc3Npb25JZCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoImVudGVyIikpOworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgaWYoTUFYX05PX09GX1AyUF9TRVNTSU9OUyA+IEhERFNlc3Npb25JZCkKKyAgICAgIHsKKyAgICAgICAgIHAycFJlc2V0Q29udGV4dCgmcE1hYy0+cDJwQ29udGV4dFtIRERTZXNzaW9uSWRdKTsKKyAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICB9CisgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKworZUhhbFN0YXR1cyBzbWVfcDJwR2V0UmVzdWx0RmlsdGVyKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBIRERTZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcEZpbHRlcikKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICBpZihNQVhfTk9fT0ZfUDJQX1NFU1NJT05TID4gSEREU2Vzc2lvbklkKQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gcDJwR2V0UmVzdWx0RmlsdGVyKCZwTWFjLT5wMnBDb250ZXh0W0hERFNlc3Npb25JZF0sIHBGaWx0ZXIpOworICAgICAgfQorICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKworCisjZW5kaWYgLy9XTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisKK2VIYWxTdGF0dXMgcDJwUHJvY2Vzc05vQVJlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwTm9BQ21kKQoreworICAgIHRwUDJwUHNDb25maWcgcE5vQTsKKyAgICB0U2lyTXNnUSBtc2c7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQqKikmcE5vQSwgc2l6ZW9mKHRQMnBQc0NvbmZpZykpOworICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgIHsKKyAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTm9BLCBzaXplb2YodFAycFBzQ29uZmlnKSk7CisgICAgICAgIHBOb0EtPm9wcF9wcyA9IHBOb0FDbWQtPnUuTm9BQ21kLk5vQS5vcHBfcHM7CisgICAgICAgIHBOb0EtPmN0V2luZG93ID0gcE5vQUNtZC0+dS5Ob0FDbWQuTm9BLmN0V2luZG93OworICAgICAgICBwTm9BLT5kdXJhdGlvbiA9IHBOb0FDbWQtPnUuTm9BQ21kLk5vQS5kdXJhdGlvbjsKKyAgICAgICAgcE5vQS0+aW50ZXJ2YWwgPSBwTm9BQ21kLT51Lk5vQUNtZC5Ob0EuaW50ZXJ2YWw7CisgICAgICAgIHBOb0EtPmNvdW50ID0gcE5vQUNtZC0+dS5Ob0FDbWQuTm9BLmNvdW50OworICAgICAgICBwTm9BLT5zaW5nbGVfbm9hX2R1cmF0aW9uID0gcE5vQUNtZC0+dS5Ob0FDbWQuTm9BLnNpbmdsZV9ub2FfZHVyYXRpb247CisgICAgICAgIHBOb0EtPnBzU2VsZWN0aW9uID0gcE5vQUNtZC0+dS5Ob0FDbWQuTm9BLnBzU2VsZWN0aW9uOworICAgICAgICBwTm9BLT5zZXNzaW9uaWQgPSBwTm9BQ21kLT51Lk5vQUNtZC5Ob0Euc2Vzc2lvbmlkOworICAgICAgICBtc2cudHlwZSA9IGVXTklfU01FX1VQREFURV9OT0E7CisgICAgICAgIG1zZy5ib2R5dmFsID0gMDsKKyAgICAgICAgbXNnLmJvZHlwdHIgPSBwTm9BOworICAgICAgICBsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpOworICAgIH0gICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKworCisjZW5kaWYgLy9XTEFOX0ZFQVRVUkVfUDJQCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9zcmMvcG1jL3BtYy5jIGIvQ09SRS9TTUUvc3JjL3BtYy9wbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWZjMGRiCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvc3JjL3BtYy9wbWMuYwpAQCAtMCwwICsxLDI1ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWMuYworKgorKiBEZXNjcmlwdGlvbjogCisgICAgICBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgKFBNQykgcHJvY2Vzc2luZyByb3V0aW5lcy4KKyoKKyogQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJjc3JMaW5rTGlzdC5oIgorI2luY2x1ZGUgImNzckFwaS5oIgorI2luY2x1ZGUgInNtZUluc2lkZS5oIgorI2luY2x1ZGUgInNtZV9BcGkuaCIKKyNpbmNsdWRlICJzbXNEZWJ1Zy5oIgorI2luY2x1ZGUgInBtYy5oIgorI2luY2x1ZGUgIndsYW5fcHNfd293X2RpYWcuaCIKKyNpbmNsdWRlIDx2b3NfcG93ZXIuaD4KKyNpbmNsdWRlICJjc3JJbnNpZGVBcGkuaCIKKworc3RhdGljIHZvaWQgcG1jUHJvY2Vzc0RlZmVycmVkTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY0VudGVyTG93UG93ZXJTdGF0ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSGF2ZSB0aGUgZGV2aWNlIGVudGVyIExvdyBQb3dlciBTdGF0ZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gY2hhbmdpbmcgc3RhdGUgc3VjY2Vzc2Z1bAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gY2hhbmdpbmcgc3RhdGUgbm90IHN1Y2Nlc3NmdWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jRW50ZXJMb3dQb3dlclN0YXRlICh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNFbnRlckxvd1Bvd2VyU3RhdGVcbiIpKTsKKworICAgIC8qIElmIGFscmVhZHkgaW4gTG93IFBvd2VyIFN0YXRlLCBqdXN0IHJldHVybi4gKi8KKyAgICBpZiAocE1hYy0+cG1jLnBtY1N0YXRlID09IExPV19QT1dFUikKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBDYW5jZWwgYW55IHJ1bm5pbmcgdGltZXJzLiAqLworICAgIGlmIChwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE1hYy0+cG1jLmhJbXBzVGltZXIpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBjYW5jZWwgSU1QUyB0aW1lclxuIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwbWNTdG9wVHJhZmZpY1RpbWVyKGhIYWwpOworCisgICAgaWYgKHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwTWFjLT5wbWMuaEV4aXRQb3dlclNhdmVUaW1lcikgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGNhbmNlbCBleGl0IHBvd2VyIHNhdmUgbW9kZSB0aW1lclxuIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBEbyBhbGwgdGhlIGNhbGxiYWNrcy4gKi8KKyAgICBwbWNEb0NhbGxiYWNrcyhoSGFsLCBlSEFMX1NUQVRVU19GQUlMVVJFKTsKKworICAgIC8qIENoYW5nZSBzdGF0ZS4gKi8KKyAgICBwTWFjLT5wbWMucG1jU3RhdGUgPSBMT1dfUE9XRVI7CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNFeGl0TG93UG93ZXJTdGF0ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSGF2ZSB0aGUgZGV2aWNlIGV4aXQgdGhlIExvdyBQb3dlciBTdGF0ZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gY2hhbmdpbmcgc3RhdGUgc3VjY2Vzc2Z1bAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gY2hhbmdpbmcgc3RhdGUgbm90IHN1Y2Nlc3NmdWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jRXhpdExvd1Bvd2VyU3RhdGUgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY0V4aXRMb3dQb3dlclN0YXRlXG4iKSk7CisKKyAgICAvKiBNdXN0IGJlIGluIExvdyBQb3dlciBTdGF0ZSBpZiB3ZSBhcmUgZ29pbmcgdG8gZXhpdCB0aGF0IHN0YXRlLiAqLworICAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgIT0gTE9XX1BPV0VSKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgZXhpdCBMb3cgUG93ZXIgU3RhdGUgaWYgbm90IGluIHRoYXQgc3RhdGVcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogQm90aCBXTEFOIHN3aXRjaGVzIG11Y2ggYmUgb24gdG8gZXhpdCBMb3cgUG93ZXIgU3RhdGUuICovCisgICAgaWYgKChwTWFjLT5wbWMuaHdXbGFuU3dpdGNoU3RhdGUgPT0gZVBNQ19TV0lUQ0hfT0ZGKSB8fCAocE1hYy0+cG1jLnN3V2xhblN3aXRjaFN0YXRlID09IGVQTUNfU1dJVENIX09GRikpCisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICAgLyogQ2hhbmdlIHN0YXRlLiAqLworICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IEZVTExfUE9XRVI7CisgICAgaWYocG1jU2hvdWxkQm1wc1RpbWVyUnVuKHBNYWMpKQorICAgIHsKKyAgICAgICAgaWYgKHBtY1N0YXJ0VHJhZmZpY1RpbWVyKGhIYWwsIHBNYWMtPnBtYy5ibXBzQ29uZmlnLnRyYWZmaWNNZWFzdXJlUGVyaW9kKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jRW50ZXJGdWxsUG93ZXJTdGF0ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSGF2ZSB0aGUgZGV2aWNlIGVudGVyIHRoZSBGdWxsIFBvd2VyIFN0YXRlLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBjaGFuZ2luZyBzdGF0ZSBzdWNjZXNzZnVsCisqICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBjaGFuZ2luZyBzdGF0ZSBub3Qgc3VjY2Vzc2Z1bAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNFbnRlckZ1bGxQb3dlclN0YXRlICh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNFbnRlckZ1bGxQb3dlclN0YXRlXG4iKSk7CisKKyAgICAvKiBUYWtlIGFjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZS4gKi8KKyAgICBzd2l0Y2ggKHBNYWMtPnBtYy5wbWNTdGF0ZSkKKyAgICB7CisKKyAgICAvKiBBbHJlYWR5IGluIEZ1bGwgUG93ZXIgU3RhdGUuICovCisgICAgY2FzZSBGVUxMX1BPV0VSOgorICAgICAgICBicmVhazsKKworICAgIC8qIE5vdGlmeSBldmVyeW9uZSB0aGF0IHdlIGFyZSBnb2luZyB0byBmdWxsIHBvd2VyLgorICAgICAgIENoYW5nZSB0byBGdWxsIFBvd2VyIFN0YXRlLiAqLworICAgIGNhc2UgUkVRVUVTVF9GVUxMX1BPV0VSOgorICAgIGNhc2UgUkVRVUVTVF9JTVBTOgorICAgIGNhc2UgUkVRVUVTVF9CTVBTOgorICAgIGNhc2UgUkVRVUVTVF9TVEFOREJZOgorCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZS4gKi8KKyAgICAgICAgcE1hYy0+cG1jLnBtY1N0YXRlID0gRlVMTF9QT1dFUjsKKyAgICAgICAgcE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJQZW5kaW5nID0gRkFMU0U7CisKKyAgICAgICAgaWYocG1jU2hvdWxkQm1wc1RpbWVyUnVuKHBNYWMpKQorICAgICAgICAgICAgKHZvaWQpcG1jU3RhcnRUcmFmZmljVGltZXIoaEhhbCwgcE1hYy0+cG1jLmJtcHNDb25maWcudHJhZmZpY01lYXN1cmVQZXJpb2QpOworCisgICAgICAgIHBtY1Byb2Nlc3NEZWZlcnJlZE1zZyggcE1hYyApOworICAgICAgICAvKiBEbyBhbGwgdGhlIGNhbGxiYWNrcy4gKi8KKyAgICAgICAgcG1jRG9DYWxsYmFja3MoaEhhbCwgZUhBTF9TVEFUVVNfU1VDQ0VTUyk7CisKKyAgICAgICAgLyogVXBkYXRlIHJlZ2lzdGVyZCBtb2R1bGVzIHRoYXQgd2UgYXJlIGVudGVyaW5nIEZ1bGwgUG93ZXIuIFRoaXMgaXMKKyAgICAgICAgICAgb25seSB3YXkgdG8gaW5mb3JtIG1vZHVsZXMgaWYgUE1DIGV4aXRlZCBhIHBvd2VyIHNhdmUgbW9kZSBiZWNhdXNlCisgICAgICAgICAgIG9mIGVycm9yIGNvbmRpdGlvbnMgb3IgaWYgc29tIG90aGVyIG1vZHVsZSByZXF1ZXN0ZWQgZnVsbCBwb3dlciAqLworICAgICAgICBwbWNEb0RldmljZVN0YXRlVXBkYXRlQ2FsbGJhY2tzKGhIYWwsIEZVTExfUE9XRVIpOworICAgICAgICBicmVhazsKKworICAgIC8qIENhbm5vdCBnbyBkaXJlY3RseSB0byBGdWxsIFBvd2VyIFN0YXRlIGZyb20gdGhlc2Ugc3RhdGVzLiAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiVHJ5aW5nIHRvIGVudGVyIEZ1bGwgUG93ZXIgU3RhdGUgZnJvbSBzdGF0ZSAlZFxuIiksIHBNYWMtPnBtYy5wbWNTdGF0ZSk7CisgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgc21zTG9nKHBNYWMsIExPR1csICJQTUM6IEVudGVyIGZ1bGwgcG93ZXIgZG9uZTogQ2FuY2VsIFhPIENvcmUgT04gdm90ZVxuIik7CisgICAgaWYgKHZvc19jaGlwVm90ZVhPQ29yZShOVUxMLCBOVUxMLCBOVUxMLCBWT1NfRkFMU0UpICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiQ291bGQgbm90IGNhbmNlbCBYTyBDb3JlIE9OIHZvdGUuIE5vdCByZXR1cm5pbmcgZmFpbHVyZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXIgY29uc3VtZWQgd2lsbCBiZSBoaWdoXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNFbnRlclJlcXVlc3RGdWxsUG93ZXJTdGF0ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSGF2ZSB0aGUgZGV2aWNlIGVudGVyIHRoZSBSZXF1ZXN0IEZ1bGwgUG93ZXIgU3RhdGUuCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyogICAgZnVsbFBvd2VyUmVhc29uIC0gUmVhc29uIGNvZGUgZm9yIHJlcXVlc3RpbmcgZnVsbCBwb3dlcgorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gY2hhbmdpbmcgc3RhdGUgc3VjY2Vzc2Z1bAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gY2hhbmdpbmcgc3RhdGUgbm90IHN1Y2Nlc3NmdWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jRW50ZXJSZXF1ZXN0RnVsbFBvd2VyU3RhdGUgKHRIYWxIYW5kbGUgaEhhbCwgdFJlcXVlc3RGdWxsUG93ZXJSZWFzb24gZnVsbFBvd2VyUmVhc29uKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICB2b3NfY2FsbF9zdGF0dXNfdHlwZSBjYWxsVHlwZTsKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiRW50ZXJpbmcgcG1jRW50ZXJSZXF1ZXN0RnVsbFBvd2VyU3RhdGVcbiIpKTsKKworICAgIC8qIFRha2UgYWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZXZpY2UuICovCisgICAgc3dpdGNoIChwTWFjLT5wbWMucG1jU3RhdGUpCisgICAgeworCisgICAgLyogU2hvdWxkIG5vdCByZXF1ZXN0IGZ1bGwgcG93ZXIgaWYgYWxyZWFkeSB0aGVyZS4gKi8KKyAgICBjYXNlIEZVTExfUE9XRVI6CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiUmVxdWVzdGluZyBGdWxsIFBvd2VyIFN0YXRlIHdoZW4gYWxyZWFkeSB0aGVyZVxuIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgIC8qIE9ubHkgcG93ZXIgZXZlbnRzIGNhbiB0YWtlIGRldmljZSBvdXQgb2YgTG93IFBvd2VyIFN0YXRlLiAqLworICAgIGNhc2UgTE9XX1BPV0VSOgorICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCByZXF1ZXN0IGV4aXQgZnJvbSBMb3cgUG93ZXIgU3RhdGVcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisKKyAgICAvKiBDYW5ub3QgZ28gZGlyZWN0bHkgdG8gUmVxdWVzdCBGdWxsIFBvd2VyIHN0YXRlIGZyb20gdGhlc2Ugc3RhdGVzLgorICAgICAgIFJlY29yZCB0aGF0IHRoaXMgaXMgcGVuZGluZyBhbmQgdGFrZSBjYXJlIG9mIGl0IGxhdGVyLiAqLworICAgIGNhc2UgUkVRVUVTVF9JTVBTOgorICAgIGNhc2UgUkVRVUVTVF9TVEFSVF9VQVBTRDoKKyAgICBjYXNlIFJFUVVFU1RfU1RPUF9VQVBTRDoKKyAgICBjYXNlIFJFUVVFU1RfU1RBTkRCWToKKyAgICBjYXNlIFJFUVVFU1RfQk1QUzoKKyAgICBjYXNlIFJFUVVFU1RfRU5URVJfV09XTDoKKyAgICBjYXNlIFJFUVVFU1RfRVhJVF9XT1dMOgorICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIlJlcXVlc3QgZm9yIGZ1bGwgcG93ZXIgaXMgYmVpbmcgYnVmZmVyZWQuICIKKyAgICAgICAgICAgICJDdXJyZW50IHN0YXRlIGlzICVkXG4iKSwgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgICAgLy9JZ25vcmUgdGhlIG5ldyByZWFzb24gaWYgcmVxdWVzdCBmb3IgZnVsbCBwb3dlciBpcyBhbHJlYWR5IHBlbmRpbmcKKyAgICAgICAgaWYoICFwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlclBlbmRpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlclBlbmRpbmcgPSBUUlVFOworICAgICAgICAgICAgcE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJSZWFzb24gPSBmdWxsUG93ZXJSZWFzb247CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBUZWxsIE1BQyB0byBoYXZlIGRldmljZSBlbnRlciBmdWxsIHBvd2VyIG1vZGUuICovCisgICAgY2FzZSBJTVBTOgorICAgICAgICBpZiAoIHBNYWMtPnBtYy5yZlN1cHBsaWVzVm90ZWRPZmYgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSB2b3NfY2hpcFZvdGVPblJGU3VwcGx5KCZjYWxsVHlwZSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHZvc19jaGlwVm90ZU9uWE9CdWZmZXIoJmNhbGxUeXBlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKTsKKworICAgICAgICAgICAgcE1hYy0+cG1jLnJmU3VwcGxpZXNWb3RlZE9mZiA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBtY0lzc3VlQ29tbWFuZCggcE1hYywgZVNtZUNvbW1hbmRFeGl0SW1wcywgTlVMTCwgMCwgRkFMU0UgKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgIC8qIFRlbGwgTUFDIHRvIGhhdmUgZGV2aWNlIGVudGVyIGZ1bGwgcG93ZXIgbW9kZS4gKi8KKyAgICBjYXNlIEJNUFM6CisgICAgeworICAgICAgICB0RXhpdEJtcHNJbmZvIGV4aXRCbXBzSW5mbzsKKyAgICAgICAgZXhpdEJtcHNJbmZvLmV4aXRCbXBzUmVhc29uID0gZnVsbFBvd2VyUmVhc29uOworCisgICAgICAgIGlmIChwbWNJc3N1ZUNvbW1hbmQoaEhhbCwgZVNtZUNvbW1hbmRFeGl0Qm1wcywgJmV4aXRCbXBzSW5mbywgc2l6ZW9mKHRFeGl0Qm1wc0luZm8pLCBGQUxTRSkKKyAgICAgICAgICAgICAgICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIH0KKyAgICAvKiBBbHJlYWR5IGluIFJlcXVlc3QgRnVsbCBQb3dlciBTdGF0ZS4gKi8KKyAgICBjYXNlIFJFUVVFU1RfRlVMTF9QT1dFUjoKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBUZWxsIE1BQyB0byBoYXZlIGRldmljZSBlbnRlciBmdWxsIHBvd2VyIG1vZGUuICovCisgICAgY2FzZSBTVEFOREJZOgorICAgICAgICBpZiAoIHBNYWMtPnBtYy5yZlN1cHBsaWVzVm90ZWRPZmYgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSB2b3NfY2hpcFZvdGVPblhPQnVmZmVyKCZjYWxsVHlwZSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gdm9zX2NoaXBWb3RlT25SRlN1cHBseSgmY2FsbFR5cGUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcE1hYy0+cG1jLnJmU3VwcGxpZXNWb3RlZE9mZiA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBtY0lzc3VlQ29tbWFuZChoSGFsLCBlU21lQ29tbWFuZEV4aXRJbXBzLCBOVUxMLCAwLCBGQUxTRSkgIT0KKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBmYWlsdXJlIHRvIHNlbmQgbWVzc2FnZSAiCisgICAgICAgICAgICAiZVdOSV9QTUNfRVhJVF9JTVBTX1JFUVxuIik7CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBUZWxsIE1BQyB0byBoYXZlIGRldmljZSBleGl0IFVBUFNEIG1vZGUgZmlyc3QgKi8KKyAgICBjYXNlIFVBUFNEOgorICAgICAgICAvL05lZWQgdG8gc2F2ZSB0aGUgcmVhc29uIGNvZGUgaGVyZSBpbiBjYXNlIGxhdGVyIG9uIHdlIG5lZWQgdG8gZXhpdCBCTVBTIGFzIHdlbGwKKyAgICAgICAgaWYgKHBtY0lzc3VlQ29tbWFuZChoSGFsLCBlU21lQ29tbWFuZEV4aXRVYXBzZCwgJmZ1bGxQb3dlclJlYXNvbiwgc2l6ZW9mKHRSZXF1ZXN0RnVsbFBvd2VyUmVhc29uKSwgRkFMU0UpICE9CisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogZmFpbHVyZSB0byBzZW5kIG1lc3NhZ2UgIgorICAgICAgICAgICAgImVXTklfUE1DX0VYSVRfVUFQU0RfUkVRXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICAgLyogVGVsbCBNQUMgdG8gaGF2ZSBkZXZpY2UgZXhpdCBXT1dMIG1vZGUgZmlyc3QgKi8KKyAgICBjYXNlIFdPV0w6CisgICAgICAgIGlmIChwbWNJc3N1ZUNvbW1hbmQoaEhhbCwgZVNtZUNvbW1hbmRFeGl0V293bCwgJmZ1bGxQb3dlclJlYXNvbiwgc2l6ZW9mKHRSZXF1ZXN0RnVsbFBvd2VyUmVhc29uKSwgRkFMU0UpICE9CisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HUCwgIlBNQzogZmFpbHVyZSB0byBzZW5kIG1lc3NhZ2UgIgorICAgICAgICAgICAgImVXTklfUE1DX0VYSVRfV09XTF9SRVFcbiIpOworICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBDYW5ub3QgZ28gZGlyZWN0bHkgdG8gUmVxdWVzdCBGdWxsIFBvd2VyIFN0YXRlIGZyb20gdGhlc2Ugc3RhdGVzLiAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiVHJ5aW5nIHRvIGVudGVyIFJlcXVlc3QgRnVsbCBQb3dlciBTdGF0ZSBmcm9tIHN0YXRlICVkXG4iKSwgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgICAgUE1DX0FCT1JUOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jRW50ZXJSZXF1ZXN0SW1wc1N0YXRlCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBIYXZlIHRoZSBkZXZpY2UgZW50ZXIgdGhlIFJlcXVlc3QgSU1QUyBTdGF0ZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gY2hhbmdpbmcgc3RhdGUgc3VjY2Vzc2Z1bAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gY2hhbmdpbmcgc3RhdGUgbm90IHN1Y2Nlc3NmdWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jRW50ZXJSZXF1ZXN0SW1wc1N0YXRlICh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNFbnRlclJlcXVlc3RJbXBzU3RhdGVcbiIpKTsKKworICAgIC8qIENhbiBlbnRlciBSZXF1ZXN0IElNUFMgU3RhdGUgb25seSBmcm9tIEZ1bGwgUG93ZXIgU3RhdGUuICovCisgICAgaWYgKHBNYWMtPnBtYy5wbWNTdGF0ZSAhPSBGVUxMX1BPV0VSKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJUcnlpbmcgdG8gZW50ZXIgUmVxdWVzdCBJTVBTIFN0YXRlIGZyb20gc3RhdGUgJWRcbiIpLCBwTWFjLT5wbWMucG1jU3RhdGUpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdHJhZmZpYyB0aW1lciB0aGF0IHRyaWdnZXJzIGJtcHMgZW50cnkgaXMgbm90IHJ1bm5pbmcgKi8KKyAgICBwbWNTdG9wVHJhZmZpY1RpbWVyKGhIYWwpOworCisgICAgLyogVGVsbCBNQUMgdG8gaGF2ZSBkZXZpY2UgZW50ZXIgSU1QUyBtb2RlLiAqLworICAgIGlmIChwbWNJc3N1ZUNvbW1hbmQoaEhhbCwgZVNtZUNvbW1hbmRFbnRlckltcHMsIE5VTEwsIDAsIEZBTFNFKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IGZhaWx1cmUgdG8gc2VuZCBtZXNzYWdlIGVXTklfUE1DX0VOVEVSX0lNUFNfUkVRXG4iKTsKKyAgICAgICAgcE1hYy0+cG1jLnBtY1N0YXRlID0gRlVMTF9QT1dFUjsKKyAgICAgICAgaWYocG1jU2hvdWxkQm1wc1RpbWVyUnVuKHBNYWMpKQorICAgICAgICAgICAgKHZvaWQpcG1jU3RhcnRUcmFmZmljVGltZXIoaEhhbCwgcE1hYy0+cG1jLmJtcHNDb25maWcudHJhZmZpY01lYXN1cmVQZXJpb2QpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgfQorCisgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJlV05JX1BNQ19FTlRFUl9JTVBTX1JFUSBzZW50IHRvIFBFXG4iKSk7CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNFbnRlckltcHNTdGF0ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSGF2ZSB0aGUgZGV2aWNlIGVudGVyIHRoZSBJTVBTIFN0YXRlLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBjaGFuZ2luZyBzdGF0ZSBzdWNjZXNzZnVsCisqICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBjaGFuZ2luZyBzdGF0ZSBub3Qgc3VjY2Vzc2Z1bAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNFbnRlckltcHNTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICB2b3NfY2FsbF9zdGF0dXNfdHlwZSBjYWxsVHlwZTsKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY0VudGVySW1wc1N0YXRlXG4iKSk7CisKKyAgICAvKiBDYW4gZW50ZXIgSU1QUyBTdGF0ZSBvbmx5IGZyb20gUmVxdWVzdCBJTVBTIFN0YXRlLiAqLworICAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgIT0gUkVRVUVTVF9JTVBTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJUcnlpbmcgdG8gZW50ZXIgSU1QUyBTdGF0ZSBmcm9tIHN0YXRlICVkXG4iKSwgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogQ2hhbmdlIHN0YXRlLiAqLworICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IElNUFM7CisKKyAgICAvKiBJZiB3ZSBoYXZlIGEgcmVxZXVzdCBmb3IgZnVsbCBwb3dlciBwZW5kaW5nIHRoZW4gd2UgaGF2ZSB0byBnbworICAgICAgIGRpcmVjdGx5IGludG8gZnVsbCBwb3dlci4gKi8KKyAgICBpZiAocE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJQZW5kaW5nKQorICAgIHsKKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfV0lORE9XUykgJiYgIWRlZmluZWQoR0VONl9PTldBUkRTKQorICAgICAgICAvKiBJbiBXaW5kb3dzIHdlIGNhbm5vdCBkbyB0aGlzIG5vdyBzaW5jZSB3ZSBhcmUgaW4gRFBDIGNvbnRleHQgYW5kIHRoZSBtZXNzYWdlIHRvIHRoZQorICAgICAgICAgICBTb2Z0TUFDIHRvIHB1dCB0aGUgZGV2aWNlIGludG8gSU1QUyB3aWxsIGJlIHNlbnQgYXQgdGhlIGVuZCBvZiBEUEMgcHJvY2Vzc2luZy4gIEluc3RlYWQKKyAgICAgICAgICAgd2Ugc2V0IGEgc2hvcnQgdGltZXIgYW5kIHN0YXJ0IHRoZSBJTVBTIGV4aXQgc2VxdWVuY2Ugd2hlbiB0aGUgdGltZXIgZmlyZXMuICovCisgICAgICAgIGlmIChwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBNYWMtPnBtYy5oRXhpdFBvd2VyU2F2ZVRpbWVyLCAxMDAwLCBGQUxTRSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3Qgc3RhcnQgZXhpdCBwb3dlciBzYXZlIG1vZGUgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworCisjZWxzZQorICAgICAgICAvKiBTdGFydCBleGl0IElNUFMgc2VxdWVuY2Ugbm93LiAqLworICAgICAgICByZXR1cm4gcG1jRW50ZXJSZXF1ZXN0RnVsbFBvd2VyU3RhdGUoaEhhbCwgcE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJSZWFzb24pOworI2VuZGlmCisgICAgfQorCisgICAgLyogU2V0IHRpbWVyIHRvIGNvbWUgb3V0IG9mIElNUFMub25seSBpZiBpbXBzUGVyaW9kIGlzIG5vbi1aZXJvKi8KKyAgICBpZigwICE9IHBNYWMtPnBtYy5pbXBzUGVyaW9kKQorICAgIHsKKyAgICAgICAgaWYgKHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcE1hYy0+cG1jLmhJbXBzVGltZXIsIHBNYWMtPnBtYy5pbXBzUGVyaW9kICogMTAwMCwgRkFMU0UpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IHN0YXJ0IElNUFMgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgICAgIHBtY0VudGVyUmVxdWVzdEZ1bGxQb3dlclN0YXRlKGhIYWwsIGVTTUVfUkVBU09OX09USEVSKTsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgfQorCisgICAgLy9Wb3RlIG9mZiBSRiBzdXBwbGllcy4gTm90ZSBSRiBzdXBsbGllcyBhcmUgbm90IHZvdGVkIG9mZiBpZiB0aGVyZSBpcyBhIAorICAgIC8vcGVuZGluZyByZXF1ZXN0IGZvciBmdWxsIHBvd2VyIGFscmVhZHkKKyAgICBzdGF0dXMgPSB2b3NfY2hpcFZvdGVPZmZSRlN1cHBseSgmY2FsbFR5cGUsIE5VTEwsIE5VTEwpOworICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKTsKKworICAgIHN0YXR1cyA9IHZvc19jaGlwVm90ZU9mZlhPQnVmZmVyKCZjYWxsVHlwZSwgTlVMTCwgTlVMTCk7CisgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApOworCisgICAgcE1hYy0+cG1jLnJmU3VwcGxpZXNWb3RlZE9mZj0gVFJVRTsKKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY0VudGVyUmVxdWVzdEJtcHNTdGF0ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSGF2ZSB0aGUgZGV2aWNlIGVudGVyIHRoZSBSZXF1ZXN0IEJNUFMgU3RhdGUuCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyoKKyogUmV0dXJuczoKKyogICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIGNoYW5naW5nIHN0YXRlIHN1Y2Nlc3NmdWwKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIGNoYW5naW5nIHN0YXRlIG5vdCBzdWNjZXNzZnVsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlSGFsU3RhdHVzIHBtY0VudGVyUmVxdWVzdEJtcHNTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICAKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY0VudGVyUmVxdWVzdEJtcHNTdGF0ZVxuIikpOworCisgICAgLyogQ2FuIGVudGVyIFJlcXVlc3QgQk1QUyBTdGF0ZSBvbmx5IGZyb20gRnVsbCBQb3dlciBTdGF0ZS4gKi8KKyAgICBpZiAocE1hYy0+cG1jLnBtY1N0YXRlICE9IEZVTExfUE9XRVIpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlRyeWluZyB0byBlbnRlciBSZXF1ZXN0IEJNUFMgU3RhdGUgZnJvbSBzdGF0ZSAlZFxuIiksIHBNYWMtPnBtYy5wbWNTdGF0ZSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIC8qIFN0b3AgVHJhZmZpYyB0aW1lciBpZiBydW5uaW5nLiBOb3RlOiB0aW1lciBjb3VsZCBoYXZlIGV4cGlyZWQgYmVjYXVzZSBvZiBwb3NzaWJsZQorICAgICAgIHJhY2UgY29uZGl0aW9ucy4gU28gbm8gbmVlZCB0byBjaGVjayBmb3IgZXJyb3JzLiBKdXN0IG1ha2Ugc3VyZSB0aW1lciBpcyBub3QgcnVubmluZyAqLworICAgIHBtY1N0b3BUcmFmZmljVGltZXIoaEhhbCk7CisKKyAgICAvKiBUZWxsIE1BQyB0byBoYXZlIGRldmljZSBlbnRlciBCTVBTIG1vZGUuICovCisgICAgaWYgKCAhcE1hYy0+cG1jLmJtcHNSZXF1ZXN0UXVldWVkICkKKyAgICB7CisgICAgICAgIHBNYWMtPnBtYy5ibXBzUmVxdWVzdFF1ZXVlZCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICBpZihwbWNJc3N1ZUNvbW1hbmQoaEhhbCwgZVNtZUNvbW1hbmRFbnRlckJtcHMsIE5VTEwsIDAsIEZBTFNFKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogZmFpbHVyZSB0byBzZW5kIG1lc3NhZ2UgZVdOSV9QTUNfRU5URVJfQk1QU19SRVFcbiIpOworICAgICAgICAgICAgcE1hYy0+cG1jLmJtcHNSZXF1ZXN0UXVldWVkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgcE1hYy0+cG1jLnBtY1N0YXRlID0gRlVMTF9QT1dFUjsKKyAgICAgICAgICAgIGlmKHBtY1Nob3VsZEJtcHNUaW1lclJ1bihwTWFjKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAodm9pZClwbWNTdGFydFRyYWZmaWNUaW1lcihoSGFsLCBwTWFjLT5wbWMuYm1wc0NvbmZpZy50cmFmZmljTWVhc3VyZVBlcmlvZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogZW50ZXIgQk1QUyBjb21tYW5kIGFscmVhZHkgcXVldWVkXG4iKTsKKyAgICAgICAgLy9yZXN0YXJ0IHRoZSB0aW1lciBpZiBuZWVkZWQKKyAgICAgICAgaWYocG1jU2hvdWxkQm1wc1RpbWVyUnVuKHBNYWMpKQorICAgICAgICB7CisgICAgICAgICAgICAodm9pZClwbWNTdGFydFRyYWZmaWNUaW1lcihoSGFsLCBwTWFjLT5wbWMuYm1wc0NvbmZpZy50cmFmZmljTWVhc3VyZVBlcmlvZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJlV05JX1BNQ19FTlRFUl9CTVBTX1JFUSBzZW50IHRvIFBFXG4iKSk7CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNFbnRlckJtcHNTdGF0ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSGF2ZSB0aGUgZGV2aWNlIGVudGVyIHRoZSBCTVBTIFN0YXRlLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBjaGFuZ2luZyBzdGF0ZSBzdWNjZXNzZnVsCisqICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBjaGFuZ2luZyBzdGF0ZSBub3Qgc3VjY2Vzc2Z1bAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNFbnRlckJtcHNTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiRW50ZXJpbmcgcG1jRW50ZXJCbXBzU3RhdGVcbiIpKTsKKworICAgIC8qIENhbiBlbnRlciBCTVBTIFN0YXRlIG9ubHkgZnJvbSA1IHN0YXRlcy4gKi8KKyAgICBpZiAocE1hYy0+cG1jLnBtY1N0YXRlICE9IFJFUVVFU1RfQk1QUyAmJgorICAgICAgICBwTWFjLT5wbWMucG1jU3RhdGUgIT0gUkVRVUVTVF9TVEFSVF9VQVBTRCAmJgorICAgICAgICBwTWFjLT5wbWMucG1jU3RhdGUgIT0gUkVRVUVTVF9TVE9QX1VBUFNEICYmCisgICAgICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSAhPSBSRVFVRVNUX0VOVEVSX1dPV0wgJiYKKyAgICAgICAgcE1hYy0+cG1jLnBtY1N0YXRlICE9IFJFUVVFU1RfRVhJVF9XT1dMKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJUcnlpbmcgdG8gZW50ZXIgQk1QUyBTdGF0ZSBmcm9tIHN0YXRlICVkXG4iKSwgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogQ2hhbmdlIHN0YXRlLiAqLworICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IEJNUFM7CisKKyAgIC8qIFVwZGF0ZSByZWdpc3RlcmQgbW9kdWxlcyB0aGF0IHdlIGFyZSBlbnRlcmluZyBCTVBTLiBUaGlzIGlzCisgICAgICBvbmx5IHdheSB0byBpbmZvcm0gbW9kdWxlcyBpZiBQTUMgZW50ZXJlZCBCTVBTIHBvd2VyIHNhdmUgbW9kZQorICAgICAgb24gaXRzIG93biBiZWNhdXNlIG9mIHRyYWZmaWMgdGltZXIgKi8KKyAgICBwbWNEb0RldmljZVN0YXRlVXBkYXRlQ2FsbGJhY2tzKGhIYWwsIEJNUFMpOworCisgICAgLyogSWYgd2UgaGF2ZSBhIHJlcWV1c3QgZm9yIGZ1bGwgcG93ZXIgcGVuZGluZyB0aGVuIHdlIGhhdmUgdG8gZ28gZGlyZWN0bHkgaW50byBmdWxsIHBvd2VyLiAqLworICAgIGlmIChwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlclBlbmRpbmcpCisgICAgeworCisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9XSU5ET1dTKSAmJiAhZGVmaW5lZChHRU42X09OV0FSRFMpCisgICAgICAgIC8qIEluIFdpbmRvd3MsIHdlIGNhbm5vdCBkbyB0aGlzIG5vdyBzaW5jZSB3ZSBhcmUgaW4gRFBDIGNvbnRleHQgYW5kIHRoZSBtZXNzYWdlIHRvIHRoZQorICAgICAgICAgICBTb2Z0TUFDIHRvIHB1dCB0aGUgZGV2aWNlIGludG8gQk1QUyB3aWxsIGJlIHNlbnQgYXQgdGhlIGVuZCBvZiBEUEMgcHJvY2Vzc2luZy4gIEluc3RlYWQKKyAgICAgICAgICAgd2Ugc2V0IGEgc2hvcnQgdGltZXIgYW5kIHN0YXJ0IHRoZSBCTVBTIGV4aXQgc2VxdWVuY2Ugd2hlbiB0aGUgdGltZXIgZmlyZXMuICovCisgICAgICAgIGlmIChwYWxUaW1lclN0YXJ0KHBNYWMtPmhIZGQsIHBNYWMtPnBtYy5oRXhpdFBvd2VyU2F2ZVRpbWVyLCAxMDAwLCBGQUxTRSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3Qgc3RhcnQgZXhpdCBwb3dlciBzYXZlIG1vZGUgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworCisjZWxzZQorICAgICAgICAvKiBTdGFydCBleGl0IEJNUFMgc2VxdWVuY2Ugbm93LiAqLworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIlBlbmRpbmcgRnVsbCBQb3dlciByZXF1ZXN0IGZvdW5kIG9uIGVudGVyaW5nIEJNUFMgbW9kZS4gIgorICAgICAgICAgICAgICAgICAgIlN0YXJ0IGV4aXQgQk1QUyBleGl0IHNlcXVlbmNlXG4iKSk7CisgICAgICAgIC8vTm90ZTogUmVhc29uIG11c3QgaGF2ZSBiZWVuIHNldCB3aGVuIHJlcXVlc3RGdWxsUG93ZXJQZW5kaW5nIGZsYWcgd2FzIHNldC4KKyAgICAgICAgcG1jRW50ZXJSZXF1ZXN0RnVsbFBvd2VyU3RhdGUoaEhhbCwgcE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJSZWFzb24pOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyNlbmRpZgorICAgIH0KKworICAgIC8qVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGlkZWFsbHkuIFdPV0wgYW5kIFVBUFNEIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLworICAgIGlmIChwTWFjLT5wbWMud293bE1vZGVSZXF1aXJlZCAmJiBwTWFjLT5wbWMudWFwc2RTZXNzaW9uUmVxdWlyZWQpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIkJvdGggVUFQU0QgYW5kIFdPV0wgaXMgcmVxdWlyZWQgb24gZW50ZXJpbmcgQk1QUyBtb2RlLiAiCisgICAgICAgICAgICAgICAiVUFQU0Qgd2lsbCBiZSBwcmlvcml0aXplZCBvdmVyIFdPV0xcbiIpKTsKKyAgICB9CisKKyAgICAvKiBEbyB3ZSBuZWVkIFVhcHNkPyovCisgICAgaWYgKHBNYWMtPnBtYy51YXBzZFNlc3Npb25SZXF1aXJlZCkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiVUFQU0Qgc2Vzc2lvbiBpcyByZXF1aXJlZCBvbiBlbnRlcmluZyBCTVBTIG1vZGUuICIKKyAgICAgICAgICAgICAgICAgICJTdGFydCBVQVBTRCBlbnRyeSBzZXF1ZW5jZVxuIikpOworICAgICAgICBwbWNFbnRlclJlcXVlc3RTdGFydFVhcHNkU3RhdGUoaEhhbCk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIC8qIERvIHdlIG5lZWQgV09XTD8qLworICAgIGlmIChwTWFjLT5wbWMud293bE1vZGVSZXF1aXJlZCkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiV09XTCBpcyByZXF1aXJlZCBvbiBlbnRlcmluZyBCTVBTIG1vZGUuICIKKyAgICAgICAgICAgICAgICAgICJTdGFydCBXT1dMIGVudHJ5IHNlcXVlbmNlXG4iKSk7CisgICAgICAgIHBtY1JlcXVlc3RFbnRlcldvd2xTdGF0ZShoSGFsLCAmKHBNYWMtPnBtYy53b3dsRW50ZXJQYXJhbXMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNQb3dlclNhdmVDaGVjaworKgorKiBEZXNjcmlwdGlvbjoKKyogICAgQ2hlY2sgaWYgZGV2aWNlIGlzIGFsbG93ZWQgdG8gZW50ZXIgYSBwb3dlciBzYXZlIG1vZGUuCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyoKKyogUmV0dXJuczoKKyogICAgVFJVRSAtIGVudHJ5IGlzIGFsbG93ZWQKKyogICAgRkFMU0UgLSBlbnRyeSBpcyBub3QgYWxsb3dlZCBhdCB0aGlzIHRpbWUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3RBTklfQk9PTEVBTiBwbWNQb3dlclNhdmVDaGVjayAodEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0cFBvd2VyU2F2ZUNoZWNrRW50cnkgcFBvd2VyU2F2ZUNoZWNrRW50cnk7CisgICAgdEFOSV9CT09MRUFOICgqY2hlY2tSb3V0aW5lKSAodm9pZCAqY2hlY2tDb250ZXh0KTsKKyAgICB0QU5JX0JPT0xFQU4gYlJlc3VsdD1GQUxTRTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiRW50ZXJpbmcgcG1jUG93ZXJTYXZlQ2hlY2tcbiIpKTsKKworICAgIC8qIENhbGwgdGhlIHJvdXRpbmVzIGluIHRoZSBwb3dlciBzYXZlIGNoZWNrIHJvdXRpbmUgbGlzdC4gIElmIGFueQorICAgICAgIHJldHVybiBGQUxTRSwgdGhlbiB3ZSBjYW5ub3QgZ28gaW50byBwb3dlciBzYXZlIG1vZGUuICovCisgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCgmcE1hYy0+cG1jLnBvd2VyU2F2ZUNoZWNrTGlzdCwgRkFMU0UpOworICAgIHdoaWxlIChwRW50cnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBQb3dlclNhdmVDaGVja0VudHJ5ID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRQb3dlclNhdmVDaGVja0VudHJ5LCBsaW5rKTsKKyAgICAgICAgY2hlY2tSb3V0aW5lID0gcFBvd2VyU2F2ZUNoZWNrRW50cnktPmNoZWNrUm91dGluZTsKKworICAgICAgICAvKiBJZiB0aGUgY2hlY2tSb3V0aW5lIGlzIE5VTEwgZm9yIGEgcGFyaWN1bGFyIGVudHJ5LCBwcm9jZWVkIHdpdGggb3RoZXIgZW50cmllcworICAgICAgICAgKiBpbiB0aGUgbGlzdCAqLworICAgICAgICBpZiAoTlVMTCAhPSBjaGVja1JvdXRpbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY2hlY2tSb3V0aW5lKHBQb3dlclNhdmVDaGVja0VudHJ5LT5jaGVja0NvbnRleHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgicG1jUG93ZXJTYXZlQ2hlY2sgZmFpbCFcbiIpKTsKKyAgICAgICAgICAgICAgICBiUmVzdWx0ID0gRkFMU0U7IAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJSZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBFbnRyeSA9IGNzckxMTmV4dCgmcE1hYy0+cG1jLnBvd2VyU2F2ZUNoZWNrTGlzdCwgcEVudHJ5LCBGQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIGJSZXN1bHQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jU2VuZFBvd2VyU2F2ZUNvbmZpZ01lc3NhZ2UKKyoKKyogRGVzY3JpcHRpb246CisqICAgIFNlbmQgYSBtZXNzYWdlIHRvIFBFL01BQyB0byBjb25maWd1cmUgdGhlIHBvd2VyIHNhdmluZyBtb2Rlcy4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gbWVzc2FnZSBzdWNjZXNzZnVseSBzZW50CisqICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBlcnJvciB3aGlsZSBzZW5kaW5nIG1lc3NhZ2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jU2VuZFBvd2VyU2F2ZUNvbmZpZ01lc3NhZ2UgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdFNpclBvd2VyU2F2ZUNmZyBwb3dlclNhdmVDb25maWc7CisKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY1NlbmRQb3dlclNhdmVDb25maWdNZXNzYWdlXG4iKSk7CisgICAgCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmKHBvd2VyU2F2ZUNvbmZpZyksIHNpemVvZih0U2lyUG93ZXJTYXZlQ2ZnKSk7CisKKyAgICBzd2l0Y2ggKHBNYWMtPnBtYy5ibXBzQ29uZmlnLmZvcndhcmRCZWFjb25zKQorICAgIHsKKyAgICBjYXNlIGVQTUNfTk9fQkVBQ09OUzoKKyAgICAgICAgcG93ZXJTYXZlQ29uZmlnLmJlYWNvbkZ3ZCA9IGVQTV9CRUFDT05fRldEX05PTkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZVBNQ19CRUFDT05TX1dJVEhfVElNX1NFVDoKKyAgICAgICAgcG93ZXJTYXZlQ29uZmlnLmJlYWNvbkZ3ZCA9IGVQTV9CRUFDT05fRldEX1RJTTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlUE1DX0JFQUNPTlNfV0lUSF9EVElNX1NFVDoKKyAgICAgICAgcG93ZXJTYXZlQ29uZmlnLmJlYWNvbkZ3ZCA9IGVQTV9CRUFDT05fRldEX0RUSU07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZVBNQ19OVEhfQkVBQ09OOgorICAgICAgICBwb3dlclNhdmVDb25maWcuYmVhY29uRndkID0gZVBNX0JFQUNPTl9GV0RfTlRIOworICAgICAgICBwb3dlclNhdmVDb25maWcubnRoQmVhY29uRndkID0gKHRBTklfVTE2KXBNYWMtPnBtYy5ibXBzQ29uZmlnLnZhbHVlT2ZOOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGVQTUNfQUxMX0JFQUNPTlM6CisgICAgICAgIHBvd2VyU2F2ZUNvbmZpZy5iZWFjb25Gd2QgPSBlUE1fQkVBQ09OX0ZXRF9OVEg7CisgICAgICAgIHBvd2VyU2F2ZUNvbmZpZy5udGhCZWFjb25Gd2QgPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcG93ZXJTYXZlQ29uZmlnLmZFbmFibGVQd3JTYXZlSW1tZWRpYXRlbHkgPSBwTWFjLT5wbWMuYm1wc0NvbmZpZy5zZXRQbU9uTGFzdEZyYW1lOworICAgIHBvd2VyU2F2ZUNvbmZpZy5mUFNQb2xsID0gcE1hYy0+cG1jLmJtcHNDb25maWcudXNlUHNQb2xsOworICAgIHBvd2VyU2F2ZUNvbmZpZy5mRW5hYmxlQmVhY29uRWFybHlUZXJtaW5hdGlvbiA9IAorICAgICAgICBwTWFjLT5wbWMuYm1wc0NvbmZpZy5lbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uOworICAgIHBvd2VyU2F2ZUNvbmZpZy5iY25FYXJseVRlcm1XYWtlSW50ZXJ2YWwgPSAKKyAgICAgICAgcE1hYy0+cG1jLmJtcHNDb25maWcuYmNuRWFybHlUZXJtV2FrZUludGVydmFsOworCisgICAgLyogc2V0Y2ZnIGZvciBsaXN0ZW5JbnRlcnZhbC4gTWFrZSBzdXJlIENGRyBpcyB1cGRhdGVkIGJlY2F1c2UgUEUgcmVhZHMgdGhpcyAKKyAgICAgICBmcm9tIENGRyBhdCB0aGUgdGltZSBvZiBhc3NvYyBvciByZWFzc29jICovCisgICAgY2NtQ2ZnU2V0SW50KHBNYWMsIFdOSV9DRkdfTElTVEVOX0lOVEVSVkFMLCBwTWFjLT5wbWMuYm1wc0NvbmZpZy5ibXBzUGVyaW9kLCAKKyAgICAgICAgTlVMTCwgZUFOSV9CT09MRUFOX0ZBTFNFKTsKKworICAgIGlmKCBwTWFjLT5wbWMucG1jU3RhdGUgPT0gSU1QUyB8fCBwTWFjLT5wbWMucG1jU3RhdGUgPT0gUkVRVUVTVF9JTVBTICkKKyAgICB7CisgICAgICAgIC8vV2FrZSB1cCB0aGUgY2hpcCBmaXJzdAorICAgICAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IHBtY0RlZmVyTXNnKCBwTWFjLCBlV05JX1BNQ19QV1JfU0FWRV9DRkcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvd2VyU2F2ZUNvbmZpZywgc2l6ZW9mKHRTaXJQb3dlclNhdmVDZmcpICk7CisKKyAgICAgICAgaWYoIGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HID09IHN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vZWl0aGVyIGZhaWwgb3IgYWxyZWFkeSBpbiBmdWxsIHBvd2VyCisgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoIHN0YXR1cyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9lbHNlIGxldCBpdCB0aHJvdWdoIGJlY2F1c2UgaXQgaXMgaW4gZnVsbCBwb3dlciBzdGF0ZQorICAgICAgICB9CisgICAgfQorICAgIC8qIFNlbmQgYSBtZXNzYWdlIHNvIHRoYXQgRlcgU3lzdGVtIGNvbmZpZyBpcyBhbHNvIHVwZGF0ZWQgYW5kIGlzIGluIHN5bmMgd2l0aAorICAgICAgIHRoZSBDRkcuKi8KKyAgICBpZiAocG1jU2VuZE1lc3NhZ2UoaEhhbCwgZVdOSV9QTUNfUFdSX1NBVkVfQ0ZHLCAmcG93ZXJTYXZlQ29uZmlnLCBzaXplb2YodFNpclBvd2VyU2F2ZUNmZykpIAorICAgICAgICAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJTZW5kIG9mIGVXTklfUE1DX1BXUl9TQVZFX0NGRyB0byBQRSBmYWlsZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorICAgCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jU2VuZE1lc3NhZ2UKKyoKKyogRGVzY3JpcHRpb246CisqICAgIFNlbmQgYSBtZXNzYWdlIHRvIFBFL01BQy4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKiAgICBtZXNzYWdlVHlwZSAtIG1lc3NhZ2UgdHlwZSB0byBzZW5kCisqICAgIHBNZXNzYWdlRGF0YSAtIHBvaW50ZXIgdG8gbWVzc2FnZSBkYXRhCisqICAgIG1lc3NhZ2VTaXplIC0gU2l6ZSBvZiB0aGUgbWVzc2FnZSBkYXRhCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBtZXNzYWdlIHN1Y2Nlc3NmdWx5IHNlbnQKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIGVycm9yIHdoaWxlIHNlbmRpbmcgbWVzc2FnZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNTZW5kTWVzc2FnZSAodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgbWVzc2FnZVR5cGUsIHZvaWQgKnBNZXNzYWdlRGF0YSwgdEFOSV9VMzIgbWVzc2FnZVNpemUpCit7CisgICAgdFNpck1iTXNnICpwTXNnOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNTZW5kTWVzc2FnZSwgbWVzc2FnZSB0eXBlICVkXG4iKSwgbWVzc2FnZVR5cGUpOworCisgICAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gbWVzc2FnZS4gKi8KKyAgICBpZiAocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIFdOSV9DRkdfTUJfSERSX0xFTiArIG1lc3NhZ2VTaXplKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBtZXNzYWdlXG4iKSk7CisgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorICAgIHBNc2ctPnR5cGUgPSBtZXNzYWdlVHlwZTsKKyAgICBwTXNnLT5tc2dMZW4gPSAodEFOSV9VMTYpIChXTklfQ0ZHX01CX0hEUl9MRU4gKyBtZXNzYWdlU2l6ZSk7CisgICAgaWYgKG1lc3NhZ2VTaXplID4gMCkKKyAgICB7CisgICAgICAgIGlmIChwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBNc2ctPmRhdGEsIHBNZXNzYWdlRGF0YSwgbWVzc2FnZVNpemUpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGNvcHkgbWVzc2FnZSBkYXRhXG4iKSk7CisgICAgICAgICAgICBQTUNfQUJPUlQ7CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNlbmQgbWVzc2FnZS4gKi8KKyAgICBpZiAocGFsU2VuZE1CTWVzc2FnZShwTWFjLT5oSGRkLCBwTXNnKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3Qgc2VuZCBtZXNzYWdlXG4iKSk7CisgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jRG9DYWxsYmFja3MKKyoKKyogRGVzY3JpcHRpb246CisqICAgIENhbGwgdGhlIElNUFMgY2FsbGJhY2sgcm91dGluZSBhbmQgdGhlIHJvdXRpbmVzIGluIHRoZSByZXF1ZXN0IGZ1bGwKKyogICAgcG93ZXIgY2FsbGJhY2sgcm91dGluZSBsaXN0LgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIGNhbGxiYWNrU3RhdHVzIC0gc3RhdHVzIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIHJvdXRpbmVzCisqCisqIFJldHVybnM6CisqICAgIG5vdGhpbmcKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcG1jRG9DYWxsYmFja3MgKHRIYWxIYW5kbGUgaEhhbCwgZUhhbFN0YXR1cyBjYWxsYmFja1N0YXR1cykKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdHBSZXF1ZXN0RnVsbFBvd2VyRW50cnkgcFJlcXVlc3RGdWxsUG93ZXJFbnRyeTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiRW50ZXJpbmcgcG1jRG9DYWxsYmFja3NcbiIpKTsKKworICAgIC8qIENhbGwgSU1QUyBjYWxsYmFjayByb3V0aW5lLiAqLworICAgIGlmIChwTWFjLT5wbWMuaW1wc0NhbGxiYWNrUm91dGluZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcE1hYy0+cG1jLmltcHNDYWxsYmFja1JvdXRpbmUocE1hYy0+cG1jLmltcHNDYWxsYmFja0NvbnRleHQsIGNhbGxiYWNrU3RhdHVzKTsKKyAgICAgICAgcE1hYy0+cG1jLmltcHNDYWxsYmFja1JvdXRpbmUgPSBOVUxMOworICAgIH0KKworICAgIC8qIENhbGwgdGhlIHJvdXRpbmVzIGluIHRoZSByZXF1ZXN0IGZ1bGwgcG93ZXIgY2FsbGJhY2sgcm91dGluZSBsaXN0LiAqLworICAgIHdoaWxlIChOVUxMICE9IChwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoJnBNYWMtPnBtYy5yZXF1ZXN0RnVsbFBvd2VyTGlzdCwgVFJVRSkpKQorICAgIHsKKyAgICAgICAgcFJlcXVlc3RGdWxsUG93ZXJFbnRyeSA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0UmVxdWVzdEZ1bGxQb3dlckVudHJ5LCBsaW5rKTsKKyAgICAgICAgaWYgKHBSZXF1ZXN0RnVsbFBvd2VyRW50cnktPmNhbGxiYWNrUm91dGluZSkKKyAgICAgICAgICAgcFJlcXVlc3RGdWxsUG93ZXJFbnRyeS0+Y2FsbGJhY2tSb3V0aW5lKHBSZXF1ZXN0RnVsbFBvd2VyRW50cnktPmNhbGxiYWNrQ29udGV4dCwgY2FsbGJhY2tTdGF0dXMpOworICAgICAgICBpZiAocGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwUmVxdWVzdEZ1bGxQb3dlckVudHJ5KSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBmcmVlIHJlcXVlc3QgZnVsbCBwb3dlciByb3V0aW5lIGxpc3QgZW50cnlcbiIpKTsKKyAgICAgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgfQorICAgIH0KKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY1N0YXJ0VHJhZmZpY1RpbWVyCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBTdGFydCB0aGUgdGltZXIgdXNlZCBpbiBGdWxsIFBvd2VyIFN0YXRlIHRvIG1lYXN1cmUgdHJhZmZpYworKiAgICBsZXZlbHMgYW5kIGRldGVybWluZSB3aGVuIHRvIGVudGVyIEJNUFMuCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyoKKyogUmV0dXJuczoKKyogICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIHRpbWVyIHN1Y2Nlc3NmdWx5IHN0YXJ0ZWQKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIGVycm9yIHdoaWxlIHN0YXJ0aW5nIHRpbWVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlSGFsU3RhdHVzIHBtY1N0YXJ0VHJhZmZpY1RpbWVyICh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIGV4cGlyYXRpb25UaW1lKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiRW50ZXJpbmcgcG1jU3RhcnRUcmFmZmljVGltZXJcbiIpKTsKKworICAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9zdGFydCgmcE1hYy0+cG1jLmhUcmFmZmljVGltZXIsIGV4cGlyYXRpb25UaW1lKTsKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCisgICAgeworICAgICAgICBpZiggVk9TX1NUQVRVU19FX0FMUkVBRFkgPT0gdm9zU3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9Db25zaWRlciB0aGlzIG9rIHNpbmNlIHRoZSB0aW1lciBpcyBhbHJlYWR5IHN0YXJ0ZWQuCisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIiAgdHJhZmZpYyB0aW1lciBpcyBhbHJlYWR5IHN0YXJ0ZWRcbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dQLCBGTCgiQ2Fubm90IHN0YXJ0IHRyYWZmaWMgdGltZXJcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jU3RvcFRyYWZmaWNUaW1lcgorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgQ2FuY2VscyB0aGUgdGltZXIgKGlmIHJ1bm5pbmcpIHVzZWQgaW4gRnVsbCBQb3dlciBTdGF0ZSB0byBtZWFzdXJlIHRyYWZmaWMKKyogICAgbGV2ZWxzIGFuZCBkZXRlcm1pbmUgd2hlbiB0byBlbnRlciBCTVBTLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBtY1N0b3BUcmFmZmljVGltZXIgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNTdG9wVHJhZmZpY1RpbWVyXG4iKSk7CisgICAgdm9zX3RpbWVyX3N0b3AoJnBNYWMtPnBtYy5oVHJhZmZpY1RpbWVyKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNJbXBzVGltZXJFeHBpcmVkCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBDYWxsZWQgd2hlbiBJTVBTIHRpbWVyIGV4cGlyZXMuCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyoKKyogUmV0dXJuczoKKyogICAgbm90aGluZworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwbWNJbXBzVGltZXJFeHBpcmVkICh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNJbXBzVGltZXJFeHBpcmVkXG4iKSk7CisKKyAgICAvKiBJZiB0aW1lciBleHBpcmVzIGFuZCB3ZSBhcmUgaW4gYSBzdGF0ZSBvdGhlciB0aGFuIElNUFMgU3RhdGUgdGhlbiBzb21ldGhpbmcgaXMgd3JvbmcuICovCisgICAgaWYgKHBNYWMtPnBtYy5wbWNTdGF0ZSAhPSBJTVBTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJHb3QgSU1QUyB0aW1lciBleHBpcmF0aW9uIGluIHN0YXRlICVkXG4iKSwgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgICAgUE1DX0FCT1JUOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogU3RhcnQgb24gdGhlIHBhdGggb2YgZ29pbmcgYmFjayB0byBmdWxsIHBvd2VyLiAqLworICAgIHBtY0VudGVyUmVxdWVzdEZ1bGxQb3dlclN0YXRlKGhIYWwsIGVTTUVfUkVBU09OX09USEVSKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNUcmFmZmljVGltZXJFeHBpcmVkCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBDYWxsZWQgd2hlbiB0cmFmZmljIG1lYXN1cmVtZW50IHRpbWVyIGV4cGlyZXMuCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyoKKyogUmV0dXJuczoKKyogICAgbm90aGluZworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwbWNUcmFmZmljVGltZXJFeHBpcmVkICh0SGFsSGFuZGxlIGhIYWwpCit7CisKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisKKyAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIkJNUFMgVHJhZmZpYyB0aW1lciBleHBpcmVkIikpOworCisgICAgLyogSWYgdGltZXIgZXhwaXJlcyBhbmQgd2UgYXJlIGluIGEgc3RhdGUgb3RoZXIgdGhhbiBGdWxsIFBvd2VyIFN0YXRlIHRoZW4gc29tZXRoaW5nIGlzIHdyb25nLiAqLworICAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgIT0gRlVMTF9QT1dFUikKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiR290IHRyYWZmaWMgdGltZXIgZXhwaXJhdGlvbiBpbiBzdGF0ZSAlZCIpLCBwTWFjLT5wbWMucG1jU3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogVW50aWxsIERIQ1AgaXMgbm90IGNvbXBsZXRlZCByZW1haW4gaW4gcG93ZXIgYWN0aXZlICovCisgICAgaWYocE1hYy0+cG1jLnJlbWFpbkluUG93ZXJBY3RpdmVUaWxsREhDUCkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQk1QUyBUcmFmZmljIFRpbWVyIGV4cGlyZWQgYmVmb3JlIERIQ1AgY29tcGxldGlvbiBpZ25vcmUgZW50ZXIgQk1QU1xuIikpOworICAgICAgICBwTWFjLT5wbWMucmVtYWluSW5Qb3dlckFjdGl2ZVRocmVzaG9sZCsrOworICAgICAgICBpZiggcE1hYy0+cG1jLnJlbWFpbkluUG93ZXJBY3RpdmVUaHJlc2hvbGQgPj0gREhDUF9SRU1BSU5fUE9XRVJfQUNUSVZFX1RIUkVTSE9MRCkKKyAgICAgICAgeworICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlJlbWFpbiBpbiBwb3dlciBhY3RpdmUgREhDUCB0aHJlc2hvbGQgcmVhY2hlZCBGQUxMQkFDSyB0byBlbmFibGUgZW50ZXIgQk1QU1xuIikpOworICAgICAgICAgICAvKkZBTExCQUNLOiByZXNldCB0aGUgZmxhZyB0byBtYWtlIEJNUFMgZW50cnkgcG9zc2libGUqLworICAgICAgICAgICBwTWFjLT5wbWMucmVtYWluSW5Qb3dlckFjdGl2ZVRpbGxESENQID0gRkFMU0U7CisgICAgICAgICAgIHBNYWMtPnBtYy5yZW1haW5JblBvd2VyQWN0aXZlVGhyZXNob2xkID0gMDsKKyAgICAgICAgfQorICAgICAgICAvL0FjdGl2YXRlIHRoZSBUcmFmZmljIFRpbWVyIGFnYWluIGZvciBlbnRlcmluZyBpbnRvIEJNUFMKKyAgICAgICAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX3N0YXJ0KCZwTWFjLT5wbWMuaFRyYWZmaWNUaW1lciwgcE1hYy0+cG1jLmJtcHNDb25maWcudHJhZmZpY01lYXN1cmVQZXJpb2QpOworICAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSAmJiAoVk9TX1NUQVRVU19FX0FMUkVBRFkgIT0gdm9zU3RhdHVzKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dQLCBGTCgiQ2Fubm90IHJlLXN0YXJ0IHRyYWZmaWMgdGltZXJcbiIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQ2xlYXIgcmVtYWluIGluIHBvd2VyIGFjdGl2ZSB0aHJlc2hvbGQgKi8KKyAgICBwTWFjLT5wbWMucmVtYWluSW5Qb3dlckFjdGl2ZVRocmVzaG9sZCA9IDA7CisKKyAgICAvKiBDaGVjayBpZiB0aGUgdGltZXIgc2hvdWxkIGJlIHJ1bm5pbmcgKi8KKyAgICBpZiAoIXBtY1Nob3VsZEJtcHNUaW1lclJ1bihwTWFjKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQk1QUyB0aW1lciBzaG91bGQgbm90IGJlIHJ1bm5pbmciKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocG1jUG93ZXJTYXZlQ2hlY2soaEhhbCkpIAorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJCTVBTIGVudHJ5IGNyaXRlcmlhIHNhdGlzZmllZC4gUmVxdWVzdGluZyBCTVBTIHN0YXRlIikpOworICAgICAgICAodm9pZClwbWNFbnRlclJlcXVlc3RCbXBzU3RhdGUoaEhhbCk7ICAgIAorICAgIH0gCisgICAgZWxzZSAKKyAgICB7CisgICAgICAgIC8qU29tZSBtb2R1bGUgdm90ZWQgYWdhaW5zdCBQb3dlciBTYXZlLiBTbyB0aW1lciBzaG91bGQgYmUgcmVzdGFydGVkIGFnYWluIHRvIHJldHJ5IEJNUFMgKi8KKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJQb3dlciBTYXZlIGNoZWNrIGZhaWxlZC4gUmV0cnkgQk1QUyBhZ2FpbiBsYXRlciIpKTsKKyAgICAgICAgLy9TaW5jZSBoVHJhZmZpY1RpbWVyIGlzIGEgdm9zX3RpbWVyIG5vdywgd2UgbmVlZCB0byByZXN0YXJ0IHRoZSB0aW1lciBoZXJlCisgICAgICAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9zdGFydCgmcE1hYy0+cG1jLmhUcmFmZmljVGltZXIsIHBNYWMtPnBtYy5ibXBzQ29uZmlnLnRyYWZmaWNNZWFzdXJlUGVyaW9kKTsKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgJiYgKFZPU19TVEFUVVNfRV9BTFJFQURZICE9IHZvc1N0YXR1cykgKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HUCwgRkwoIkNhbm5vdCBzdGFydCB0cmFmZmljIHRpbWVyXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jRXhpdFBvd2VyU2F2ZVRpbWVyRXhwaXJlZAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgQ2FsbGVkIHdoZW4gdGltZXIgdXNlZCB0byBzY2hlZHVsZSBhIGRlZmVycmVkIHBvd2VyIHNhdmUgbW9kZSBleGl0IGV4cGlyZXMuCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyoKKyogUmV0dXJuczoKKyogICAgbm90aGluZworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwbWNFeGl0UG93ZXJTYXZlVGltZXJFeHBpcmVkICh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNFeGl0UG93ZXJTYXZlVGltZXJFeHBpcmVkXG4iKSk7CisKKyAgICAvKiBNYWtlIHN1cmUgcHJvY2VzcyBvZiBleGl0aW5nIHBvd2VyIHNhdmUgbW9kZSBtaWdodCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQgZHVlIHRvIGFub3RoZXIgdHJpZ2dlci4gKi8KKyAgICBpZiAocE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJQZW5kaW5nKQorCisgICAgICAgIC8qIFN0YXJ0IG9uIHRoZSBwYXRoIG9mIGdvaW5nIGJhY2sgdG8gZnVsbCBwb3dlci4gKi8KKyAgICAgICAgcG1jRW50ZXJSZXF1ZXN0RnVsbFBvd2VyU3RhdGUoaEhhbCwgcE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJSZWFzb24pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNEb0JtcHNDYWxsYmFja3MKKyoKKyogRGVzY3JpcHRpb246CisqICAgIENhbGwgdGhlIHJlZ2lzdGVyZWQgQk1QUyBjYWxsYmFjayByb3V0aW5lcyBiZWNhdXNlIGRldmljZSBpcyB1bmFibGUgdG8KKyogICAgZW50ZXIgQk1QUyBzdGF0ZQorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIGNhbGxiYWNrU3RhdHVzIC0gU3VjY2VzcyBvciBGYWlsdXJlLgorKgorKiBSZXR1cm5zOgorKiAgICBub3RoaW5nCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBtY0RvQm1wc0NhbGxiYWNrcyAodEhhbEhhbmRsZSBoSGFsLCBlSGFsU3RhdHVzIGNhbGxiYWNrU3RhdHVzKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgdExpc3RFbGVtICpwRW50cnk7CisgICB0cFJlcXVlc3RCbXBzRW50cnkgcFJlcXVlc3RCbXBzRW50cnk7CisKKyAgIHNtc0xvZyhwTWFjLCBMT0cyLCAiUE1DOiBlbnRlcmluZyBwbWNEb0JtcHNDYWxsYmFja3NcbiIpOworCisgICAvKiBDYWxsIHRoZSByb3V0aW5lcyBpbiB0aGUgcmVxdWVzdCBCTVBTIGNhbGxiYWNrIHJvdXRpbmUgbGlzdC4gKi8KKyAgIHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZCgmcE1hYy0+cG1jLnJlcXVlc3RCbXBzTGlzdCwgRkFMU0UpOworICAgd2hpbGUgKHBFbnRyeSAhPSBOVUxMKQorICAgeworICAgICAgcFJlcXVlc3RCbXBzRW50cnkgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFJlcXVlc3RCbXBzRW50cnksIGxpbmspOworICAgICAgaWYgKHBSZXF1ZXN0Qm1wc0VudHJ5LT5jYWxsYmFja1JvdXRpbmUpCisgICAgICAgICBwUmVxdWVzdEJtcHNFbnRyeS0+Y2FsbGJhY2tSb3V0aW5lKHBSZXF1ZXN0Qm1wc0VudHJ5LT5jYWxsYmFja0NvbnRleHQsCisgICAgICAgICBjYWxsYmFja1N0YXR1cyk7CisgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBSZXF1ZXN0Qm1wc0VudHJ5KTsKKyAgICAgIHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZCgmcE1hYy0+cG1jLnJlcXVlc3RCbXBzTGlzdCwgRkFMU0UpOworICAgfQorfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNEb1N0YXJ0VWFwc2RDYWxsYmFja3MKKyoKKyogRGVzY3JpcHRpb246CisqICAgIENhbGwgdGhlIHJlZ2lzdGVyZWQgVUFQU0QgY2FsbGJhY2sgcm91dGluZXMgYmVjYXVzZSBkZXZpY2UgaXMgdW5hYmxlIHRvCisqICAgIHN0YXJ0IFVBUFNEIHN0YXRlCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyogICAgY2FsbGJhY2tTdGF0dXMgLSBTdWNjZXNzIG9yIEZhaWx1cmUuIAorKgorKiBSZXR1cm5zOgorKiAgICBub3RoaW5nCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBtY0RvU3RhcnRVYXBzZENhbGxiYWNrcyAodEhhbEhhbmRsZSBoSGFsLCBlSGFsU3RhdHVzIGNhbGxiYWNrU3RhdHVzKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgdExpc3RFbGVtICpwRW50cnk7CisgICB0cFN0YXJ0VWFwc2RFbnRyeSBwU3RhcnRVYXBzZEVudHJ5OworCisgICBzbXNMb2cocE1hYywgTE9HMiwgIlBNQzogZW50ZXJpbmcgcG1jRG9TdGFydFVhcHNkQ2FsbGJhY2tzXG4iKTsKKworICAgLyogQ2FsbCB0aGUgcm91dGluZXMgaW4gdGhlIHJlcXVlc3Qgc3RhcnQgVUFQU0QgY2FsbGJhY2sgcm91dGluZSBsaXN0LiAqLworICAgcEVudHJ5ID0gY3NyTExSZW1vdmVIZWFkKCZwTWFjLT5wbWMucmVxdWVzdFN0YXJ0VWFwc2RMaXN0LCBGQUxTRSk7CisgICB3aGlsZSAocEVudHJ5ICE9IE5VTEwpCisgICB7CisgICAgICBwU3RhcnRVYXBzZEVudHJ5ID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTdGFydFVhcHNkRW50cnksIGxpbmspOworICAgICAgcFN0YXJ0VWFwc2RFbnRyeS0+Y2FsbGJhY2tSb3V0aW5lKHBTdGFydFVhcHNkRW50cnktPmNhbGxiYWNrQ29udGV4dCwKKyAgICAgICAgIGNhbGxiYWNrU3RhdHVzKTsKKyAgICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFN0YXJ0VWFwc2RFbnRyeSk7CisgICAgICBwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoJnBNYWMtPnBtYy5yZXF1ZXN0U3RhcnRVYXBzZExpc3QsIEZBTFNFKTsKKyAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jRW50ZXJSZXF1ZXN0U3RhcnRVYXBzZFN0YXRlCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBIYXZlIHRoZSBkZXZpY2UgZW50ZXIgdGhlIFVBUFNEIFN0YXRlLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBjaGFuZ2luZyBzdGF0ZSBzdWNjZXNzZnVsCisqICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBjaGFuZ2luZyBzdGF0ZSBub3Qgc3VjY2Vzc2Z1bAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNFbnRlclJlcXVlc3RTdGFydFVhcHNkU3RhdGUgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgIHZfQk9PTF90IGZGdWxsUG93ZXIgPSBWT1NfRkFMU0U7ICAgICAvL25lZWQgdG8gZ2V0IGJhY2sgdG8gZnVsbCBwb3dlciBzdGF0ZQorCisgICBzbXNMb2cocE1hYywgTE9HMiwgIlBNQzogZW50ZXJpbmcgcG1jRW50ZXJSZXF1ZXN0U3RhcnRVYXBzZFN0YXRlXG4iKTsKKworICAgLyogQ2FuIGVudGVyIFVBUFNEIFN0YXRlIG9ubHkgZnJvbSBGVUxMX1BPV0VSIG9yIEJNUFMgU3RhdGUuICovCisgICBzd2l0Y2ggKHBNYWMtPnBtYy5wbWNTdGF0ZSkKKyAgIHsKKyAgICAgIGNhc2UgRlVMTF9QT1dFUjoKKyAgICAgICAgIC8qIENoZWNrIHRoYXQgZW50cnkgaW50byBhIHBvd2VyIHNhdmUgbW9kZSBpcyBhbGxvd2VkIGF0IHRoaXMgdGltZS4gKi8KKyAgICAgICAgIGlmICghcG1jUG93ZXJTYXZlQ2hlY2soaEhhbCkpCisgICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgIlBNQzogUG93ZXIgc2F2ZSBjaGVjayBmYWlsZWQuIFVBUFNEIHJlcXVlc3QgIgorICAgICAgICAgICAgICAgICAgICAgICJ3aWxsIGJlIGFjY2VwdGVkIGFuZCBidWZmZXJlZFxuIik7CisgICAgICAgICAgICAvKiBVQVBTRCBtb2RlIHdpbGwgYmUgYXR0ZW1wdGVkIHdoZW4gd2UgZW50ZXIgQk1QUyBsYXRlciAqLworICAgICAgICAgICAgcE1hYy0+cG1jLnVhcHNkU2Vzc2lvblJlcXVpcmVkID0gVFJVRTsKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgQk1QUyByZXRyeSB0aW1lciBpcyBydW5uaW5nICovCisgICAgICAgICAgICBpZihwbWNTaG91bGRCbXBzVGltZXJSdW4ocE1hYykpCisgICAgICAgICAgICAgICAodm9pZClwbWNTdGFydFRyYWZmaWNUaW1lcihoSGFsLCBwTWFjLT5wbWMuYm1wc0NvbmZpZy50cmFmZmljTWVhc3VyZVBlcmlvZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnBtYy51YXBzZFNlc3Npb25SZXF1aXJlZCA9IFRSVUU7CisgICAgICAgICAgICAvL0NoZWNrIEJUQyBzdGF0ZQorI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgICAgICAgICAgIGlmKCBidGNJc1JlYWR5Rm9yVWFwc2QoIHBNYWMgKSApCisjZW5kaWYgLyogV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIFB1dCBkZXZpY2UgaW4gQk1QUyBtb2RlIGZpcnN0LiBUaGlzIHN0ZXAgc2hvdWxkIE5FVkVSIGZhaWwuCisgICAgICAgICAgICAgICAgICBUaGF0IGlzIHdoeSBubyBuZWVkIHRvIGJ1ZmZlciB0aGUgVUFQU0QgcmVxdWVzdCovCisgICAgICAgICAgICAgICBpZihwbWNFbnRlclJlcXVlc3RCbXBzU3RhdGUoaEhhbCkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogRGV2aWNlIGluIEZ1bGwgUG93ZXIuIEVudGVyIFJlcXVlc3QgQm1wcyBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVUFQU0QgcmVxdWVzdCB3aWxsIGJlIGRyb3BwZWQgXG4iKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICh2b2lkKXBtY1N0YXJ0VHJhZmZpY1RpbWVyKGhIYWwsIHBNYWMtPnBtYy5ibXBzQ29uZmlnLnRyYWZmaWNNZWFzdXJlUGVyaW9kKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQqLworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQk1QUzoKKyAgICAgICAgIC8vSXQgaXMgYWxyZWFkeSBpbiBCTVBTIG1vZGUsIGNoZWNrIEJUQyBzdGF0ZQorI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgICAgICAgIGlmKCBidGNJc1JlYWR5Rm9yVWFwc2QocE1hYykgKQorI2VuZGlmIC8qIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVCovCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUZWxsIE1BQyB0byBoYXZlIGRldmljZSBlbnRlciBVQVBTRCBtb2RlLiAqLworICAgICAgICAgICAgaWYgKHBtY0lzc3VlQ29tbWFuZChoSGFsLCBlU21lQ29tbWFuZEVudGVyVWFwc2QsIE5VTEwsIDAsIEZBTFNFKSAhPQorICAgICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBmYWlsdXJlIHRvIHNlbmQgbWVzc2FnZSAiCisgICAgICAgICAgICAgICAgICAiZVdOSV9QTUNfRU5URVJfQk1QU19SRVFcbiIpOworICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLy9Ob3QgcmVhZHkgZm9yIFVBUFNEIGF0IHRoaXMgdGltZSwgc2F2ZSBpdCBmaXJzdCBhbmQgd2FrZSB1cCB0aGUgY2hpcAorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICIgUE1DIHN0YXRlID0gJWRcbiIscE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgICAgICAgIHBNYWMtPnBtYy51YXBzZFNlc3Npb25SZXF1aXJlZCA9IFRSVUU7CisgICAgICAgICAgICAvKiBXaGlsZSBCVEMgdHJhZmZpYyBpcyBnb2luZyBvbiwgU1RBIGNhbiBiZSBpbiBCTVBTIAorICAgICAgICAgICAgICogYW5kIG5lZWQgbm90IGdvIHRvIEZ1bGwgUG93ZXIgKi8KKyAgICAgICAgICAgIC8vZkZ1bGxQb3dlciA9IFZPU19UUlVFOyAKKyAgICAgICAgIH0KKyNlbmRpZiAvKiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQqLworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUkVRVUVTVF9TVEFSVF9VQVBTRDoKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgICAgICBpZiggIWJ0Y0lzUmVhZHlGb3JVYXBzZChwTWFjKSApCisgICAgICAgICB7CisgICAgICAgICAgICAvL0JUQyByZWplY3RzIFVBUFNELCBicmluZyBpdCBiYWNrIHRvIGZ1bGwgcG93ZXIKKyAgICAgICAgICAgIGZGdWxsUG93ZXIgPSBWT1NfVFJVRTsKKyAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUkVRVUVTVF9CTVBTOgorICAgICAgICAvKiBCdWZmZXIgcmVxdWVzdCBmb3IgVUFQU0QgbW9kZS4gKi8KKyAgICAgICAgcE1hYy0+cG1jLnVhcHNkU2Vzc2lvblJlcXVpcmVkID0gVFJVRTsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgICAgIGlmKCAhYnRjSXNSZWFkeUZvclVhcHNkKHBNYWMpICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vQlRDIHJlamVjdHMgVUFQU0QsIGJyaW5nIGl0IGJhY2sgdG8gZnVsbCBwb3dlcgorICAgICAgICAgICAgZkZ1bGxQb3dlciA9IFZPU19UUlVFOworICAgICAgICAgfQorI2VuZGlmIC8qIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVCovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IHRyeWluZyB0byBlbnRlciBVQVBTRCBTdGF0ZSBmcm9tIHN0YXRlICVkXG4iLAorICAgICAgICAgICAgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICBpZihmRnVsbFBvd2VyKQorICAgeworICAgICAgaWYoIGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HICE9IHBtY1JlcXVlc3RGdWxsUG93ZXIoIHBNYWMsIE5VTEwsIE5VTEwsIGVTTUVfUkVBU09OX09USEVSICkgKQorICAgICAgeworICAgICAgICAgLy9UaGlzIGlzIGFuIGVycm9yCisgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIiBmYWlsIHRvIHJlcXVlc3QgZnVsbCBwb3dlciBiZWNhdXNlIEJUQ1xuIikpOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jRW50ZXJVYXBzZFN0YXRlCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBIYXZlIHRoZSBkZXZpY2UgZW50ZXIgdGhlIFVBUFNEIFN0YXRlLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBjaGFuZ2luZyBzdGF0ZSBzdWNjZXNzZnVsCisqICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBjaGFuZ2luZyBzdGF0ZSBub3Qgc3VjY2Vzc2Z1bAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNFbnRlclVhcHNkU3RhdGUgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICAgc21zTG9nKHBNYWMsIExPRzIsICJQTUM6IGVudGVyaW5nIHBtY0VudGVyVWFwc2RTdGF0ZVxuIik7CisKKyAgIC8qIENhbiBlbnRlciBVQVBTRCBTdGF0ZSBvbmx5IGZyb20gUmVxdWVzdCBVQVBTRCBTdGF0ZS4gKi8KKyAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgIT0gUkVRVUVTVF9TVEFSVF9VQVBTRCApCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogdHJ5aW5nIHRvIGVudGVyIFVBUFNEIFN0YXRlIGZyb20gc3RhdGUgJWRcbiIsCisgICAgICBwTWFjLT5wbWMucG1jU3RhdGUpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIENoYW5nZSBzdGF0ZS4gKi8KKyAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IFVBUFNEOworCisgICAvKiBVcGRhdGUgcmVnaXN0ZXJkIG1vZHVsZXMgdGhhdCB3ZSBhcmUgZW50ZXJpbmcgVUFQU0QuIFRoaXMgaXMKKyAgICAgIG9ubHkgd2F5IHRvIGluZm9ybSBtb2R1bGVzIGlmIFBNQyByZXN1bWVkIFVBUFNEIHBvd2VyIHNhdmUgbW9kZQorICAgICAgb24gaXRzIG93biBhZnRlciBmdWxsIHBvd2VyIG1vZGUgKi8KKyAgIHBtY0RvRGV2aWNlU3RhdGVVcGRhdGVDYWxsYmFja3MoaEhhbCwgVUFQU0QpOworICAgCisgICAvKiBJZiB3ZSBoYXZlIGEgcmVxZXVzdCBmb3IgZnVsbCBwb3dlciBwZW5kaW5nIHRoZW4gd2UgaGF2ZSB0byBnbworICAgZGlyZWN0bHkgaW50byBmdWxsIHBvd2VyLiAqLworICAgaWYgKHBNYWMtPnBtYy5yZXF1ZXN0RnVsbFBvd2VyUGVuZGluZykKKyAgIHsKKyAgICAgIC8qIFN0YXJ0IGV4aXQgVUFQU0Qgc2VxdWVuY2Ugbm93LiAqLworICAgICAgcmV0dXJuIHBtY0VudGVyUmVxdWVzdEZ1bGxQb3dlclN0YXRlKGhIYWwsIHBNYWMtPnBtYy5yZXF1ZXN0RnVsbFBvd2VyUmVhc29uKTsKKyAgIH0KKworICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jRW50ZXJSZXF1ZXN0U3RvcFVhcHNkU3RhdGUKKyoKKyogRGVzY3JpcHRpb246CisqICAgIEhhdmUgdGhlIGRldmljZSBTdG9wIHRoZSBVQVBTRCBTdGF0ZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gY2hhbmdpbmcgc3RhdGUgc3VjY2Vzc2Z1bAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gY2hhbmdpbmcgc3RhdGUgbm90IHN1Y2Nlc3NmdWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jRW50ZXJSZXF1ZXN0U3RvcFVhcHNkU3RhdGUgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICAgc21zTG9nKHBNYWMsIExPRzIsICJQTUM6IGVudGVyaW5nIHBtY0VudGVyUmVxdWVzdFN0b3BVYXBzZFN0YXRlXG4iKTsKKworICAgLyogSWYgYWxyZWFkeSBpbiBSRVFVRVNUX1NUT1BfVUFQU0QsIHNpbXBseSByZXR1cm4gKi8KKyAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgPT0gUkVRVUVTVF9TVE9QX1VBUFNEKQorICAgeworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIC8qIENhbiBlbnRlciBSZXF1ZXN0IFN0b3AgVUFQU0QgU3RhdGUgb25seSBmcm9tIFVBUFNEICovCisgICBpZiAocE1hYy0+cG1jLnBtY1N0YXRlICE9IFVBUFNEKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IHRyeWluZyB0byBlbnRlciBSZXF1ZXN0IFN0b3AgVUFQU0QgU3RhdGUgZnJvbSAiCisgICAgICAgICAic3RhdGUgJWRcbiIsIHBNYWMtPnBtYy5wbWNTdGF0ZSk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgLyogVGVsbCBNQUMgdG8gaGF2ZSBkZXZpY2UgZXhpdCBVQVBTRCBtb2RlLiAqLworICAgaWYgKHBtY0lzc3VlQ29tbWFuZChoSGFsLCBlU21lQ29tbWFuZEV4aXRVYXBzZCwgTlVMTCwgMCwgRkFMU0UpICE9CisgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IGZhaWx1cmUgdG8gc2VuZCBtZXNzYWdlICIKKyAgICAgICAgICJlV05JX1BNQ19FWElUX1VBUFNEX1JFUVxuIik7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY0VudGVyUmVxdWVzdFN0YW5kYnlTdGF0ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSGF2ZSB0aGUgZGV2aWNlIGVudGVyIHRoZSBSZXF1ZXN0IFNUQU5EQlkgU3RhdGUuCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyoKKyogUmV0dXJuczoKKyogICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIGNoYW5naW5nIHN0YXRlIHN1Y2Nlc3NmdWwKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIGNoYW5naW5nIHN0YXRlIG5vdCBzdWNjZXNzZnVsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlSGFsU3RhdHVzIHBtY0VudGVyUmVxdWVzdFN0YW5kYnlTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICBzbXNMb2cocE1hYywgTE9HMiwgIlBNQzogZW50ZXJpbmcgcG1jRW50ZXJSZXF1ZXN0U3RhbmRieVN0YXRlXG4iKTsKKworICAgLyogQ2FuIGVudGVyIFN0YW5kYnkgU3RhdGUgb25seSBmcm9tIEZ1bGwgUG93ZXIgU3RhdGUuICovCisgICBpZiAocE1hYy0+cG1jLnBtY1N0YXRlICE9IEZVTExfUE9XRVIpCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogdHJ5aW5nIHRvIGVudGVyIFN0YW5kYnkgU3RhdGUgZnJvbSAiCisgICAgICAgICAic3RhdGUgJWRcbiIsIHBNYWMtPnBtYy5wbWNTdGF0ZSk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgLy8gU3RvcCB0cmFmZmljIHRpbWVyLiBKdXN0IG1ha2luZyBzdXJlIHRpbWVyIGlzIG5vdCBydW5uaW5nCisgICBwbWNTdG9wVHJhZmZpY1RpbWVyKGhIYWwpOworCisgICAvKiBUZWxsIE1BQyB0byBoYXZlIGRldmljZSBlbnRlciBTVEFOREJZIG1vZGUuIFdlIGFyZSB1c2luZyB0aGUgc2FtZSBtZXNzYWdlCisgICAgICBhcyBJTVBTIG1vZGUgdG8gYXZvaWQgY29kZSBjaGFuZ2VzIGluIGxheWVyIGJlbG93IChQRS9IQUwpKi8KKyAgIGlmIChwbWNJc3N1ZUNvbW1hbmQoaEhhbCwgZVNtZUNvbW1hbmRFbnRlclN0YW5kYnksIE5VTEwsIDAsIEZBTFNFKSAhPQorICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBmYWlsdXJlIHRvIHNlbmQgbWVzc2FnZSAiCisgICAgICAgICAiZVdOSV9QTUNfRU5URVJfSU1QU19SRVFcbiIpOworICAgICAgcE1hYy0+cG1jLnBtY1N0YXRlID0gRlVMTF9QT1dFUjsKKworICAgICAgaWYocG1jU2hvdWxkQm1wc1RpbWVyUnVuKHBNYWMpKQorICAgICAgICAgICh2b2lkKXBtY1N0YXJ0VHJhZmZpY1RpbWVyKGhIYWwsIHBNYWMtPnBtYy5ibXBzQ29uZmlnLnRyYWZmaWNNZWFzdXJlUGVyaW9kKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jRW50ZXJTdGFuZGJ5U3RhdGUKKyoKKyogRGVzY3JpcHRpb246CisqICAgIEhhdmUgdGhlIGRldmljZSBlbnRlciB0aGUgU1RBTkRCWSBTdGF0ZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gY2hhbmdpbmcgc3RhdGUgc3VjY2Vzc2Z1bAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gY2hhbmdpbmcgc3RhdGUgbm90IHN1Y2Nlc3NmdWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jRW50ZXJTdGFuZGJ5U3RhdGUgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgIHZvc19jYWxsX3N0YXR1c190eXBlIGNhbGxUeXBlOworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisKKyAgIHNtc0xvZyhwTWFjLCBMT0cyLCAiUE1DOiBlbnRlcmluZyBwbWNFbnRlclN0YW5kYnlTdGF0ZVxuIik7CisKKyAgIC8qIENhbiBlbnRlciBTVEFOREJZIFN0YXRlIG9ubHkgZnJvbSBSRVFVRVNUX1NUQU5EQlkgU3RhdGUuICovCisgICBpZiAocE1hYy0+cG1jLnBtY1N0YXRlICE9IFJFUVVFU1RfU1RBTkRCWSkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiB0cnlpbmcgdG8gZW50ZXIgU1RBTkRCWSBTdGF0ZSBmcm9tIHN0YXRlICVkXG4iLAorICAgICAgICAgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICAvKiBDaGFuZ2Ugc3RhdGUuICovCisgICBwTWFjLT5wbWMucG1jU3RhdGUgPSBTVEFOREJZOworCisgICAvKiBJZiB3ZSBoYXZlIGEgcmVxZXVzdCBmb3IgZnVsbCBwb3dlciBwZW5kaW5nIHRoZW4gd2UgaGF2ZSB0byBnbworICAgICAgZGlyZWN0bHkgaW50byBmdWxsIHBvd2VyLiAqLworICAgaWYgKHBNYWMtPnBtYy5yZXF1ZXN0RnVsbFBvd2VyUGVuZGluZykKKyAgIHsKKyAgICAgIC8qIFN0YXJ0IGV4aXQgU1RBTkRCWSBzZXF1ZW5jZSBub3cuICovCisgICAgICByZXR1cm4gcG1jRW50ZXJSZXF1ZXN0RnVsbFBvd2VyU3RhdGUoaEhhbCwgcE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJSZWFzb24pOworICAgfQorCisgICAvL05vdGUgdGhhdCBSRiBzdXBwbGllcyBhcmUgbm90IHZvdGVkIG9mZiBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcGVuZGluZyByZXF1ZXN0CisgICAvL2ZvciBmdWxsIHBvd2VyCisgICBzdGF0dXMgPSB2b3NfY2hpcFZvdGVPZmZSRlN1cHBseSgmY2FsbFR5cGUsIE5VTEwsIE5VTEwpOworICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApOworCisgICBzdGF0dXMgPSB2b3NfY2hpcFZvdGVPZmZYT0J1ZmZlcigmY2FsbFR5cGUsIE5VTEwsIE5VTEwpOworICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApOworCisgICBwTWFjLT5wbWMucmZTdXBwbGllc1ZvdGVkT2ZmPSBUUlVFOworCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jRG9TdGFuZGJ5Q2FsbGJhY2tzCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBDYWxsIHRoZSByZWdpc3RlcmVkIFN0YW5kYnkgY2FsbGJhY2sgcm91dGluZXMgCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyogICAgY2FsbGJhY2tTdGF0dXMgLSBTdWNjZXNzIG9yIEZhaWx1cmUuCisqCisqIFJldHVybnM6CisqICAgIG5vdGhpbmcKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcG1jRG9TdGFuZGJ5Q2FsbGJhY2tzICh0SGFsSGFuZGxlIGhIYWwsIGVIYWxTdGF0dXMgY2FsbGJhY2tTdGF0dXMpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgCisgICBzbXNMb2cocE1hYywgTE9HMiwgIlBNQzogZW50ZXJpbmcgcG1jRG9TdGFuZGJ5Q2FsbGJhY2tzXG4iKTsKKworICAgLyogQ2FsbCBTdGFuZGJ5IGNhbGxiYWNrIHJvdXRpbmUuICovCisgICBpZiAocE1hYy0+cG1jLnN0YW5kYnlDYWxsYmFja1JvdXRpbmUgIT0gTlVMTCkKKyAgICAgIHBNYWMtPnBtYy5zdGFuZGJ5Q2FsbGJhY2tSb3V0aW5lKHBNYWMtPnBtYy5zdGFuZGJ5Q2FsbGJhY2tDb250ZXh0LCBjYWxsYmFja1N0YXR1cyk7CisgICBwTWFjLT5wbWMuc3RhbmRieUNhbGxiYWNrUm91dGluZSA9IE5VTEw7CisgICBwTWFjLT5wbWMuc3RhbmRieUNhbGxiYWNrQ29udGV4dCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY0dldFBtY1N0YXRlCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBSZXR1cm4gdGhlIFBNQyBzdGF0ZQorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqCisqIFJldHVybnM6CisqICAgIHRQbWNTdGF0ZSAob25lIG9mIElNUFMsIFJFUVVFU1RfSU1QUywgQk1QUywgUkVRVUVTVF9CTVBTIGV0YykKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3RQbWNTdGF0ZSBwbWNHZXRQbWNTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICByZXR1cm4gcE1hYy0+cG1jLnBtY1N0YXRlOyAKK30KKworY29uc3QgY2hhciogcG1jR2V0UG1jU3RhdGVTdHIodFBtY1N0YXRlIHN0YXRlKQoreworICAgIHN3aXRjaChzdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgU1RPUFBFRDoKKyAgICAgICAgICAgIHJldHVybiAiU1RPUFBFRCI7CisgICAgICAgIGNhc2UgRlVMTF9QT1dFUjoKKyAgICAgICAgICAgIHJldHVybiAiRlVMTF9QT1dFUiI7CisgICAgICAgIGNhc2UgTE9XX1BPV0VSOgorICAgICAgICAgICAgcmV0dXJuICJMT1dfUE9XRVIiOworICAgICAgICBjYXNlIElNUFM6CisgICAgICAgICAgICByZXR1cm4gIklNUFMiOworICAgICAgICBjYXNlIEJNUFM6CisgICAgICAgICAgICByZXR1cm4gIkJNUFMiOworICAgICAgICBjYXNlIFVBUFNEOgorICAgICAgICAgICAgcmV0dXJuICJVQVBTRCI7CisgICAgICAgIGNhc2UgU1RBTkRCWToKKyAgICAgICAgICAgIHJldHVybiAiU1RBTkRCWSI7CisgICAgICAgIGNhc2UgUkVRVUVTVF9JTVBTOgorICAgICAgICAgICAgcmV0dXJuICJSRVFVRVNUX0lNUFMiOworICAgICAgICBjYXNlIFJFUVVFU1RfQk1QUzoKKyAgICAgICAgICAgIHJldHVybiAiUkVRVUVTVF9CTVBTIjsKKyAgICAgICAgY2FzZSBSRVFVRVNUX1NUQVJUX1VBUFNEOgorICAgICAgICAgICAgcmV0dXJuICJSRVFVRVNUX1NUQVJUX1VBUFNEIjsKKyAgICAgICAgY2FzZSBSRVFVRVNUX1NUT1BfVUFQU0Q6CisgICAgICAgICAgICByZXR1cm4gIlJFUVVFU1RfU1RPUF9VQVBTRCI7CisgICAgICAgIGNhc2UgUkVRVUVTVF9GVUxMX1BPV0VSOgorICAgICAgICAgICAgcmV0dXJuICJSRVFVRVNUX0ZVTExfUE9XRVIiOworICAgICAgICBjYXNlIFJFUVVFU1RfU1RBTkRCWToKKyAgICAgICAgICAgIHJldHVybiAiUkVRVUVTVF9TVEFOREJZIjsKKyAgICAgICAgY2FzZSBSRVFVRVNUX0VOVEVSX1dPV0w6CisgICAgICAgICAgICByZXR1cm4gIlJFUVVFU1RfRU5URVJfV09XTCI7CisgICAgICAgIGNhc2UgUkVRVUVTVF9FWElUX1dPV0w6CisgICAgICAgICAgICByZXR1cm4gIlJFUVVFU1RfRVhJVF9XT1dMIjsKKyAgICAgICAgY2FzZSBXT1dMOgorICAgICAgICAgICAgcmV0dXJuICJXT1dMIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKK3ZvaWQgcG1jRG9EZXZpY2VTdGF0ZVVwZGF0ZUNhbGxiYWNrcyAodEhhbEhhbmRsZSBoSGFsLCB0UG1jU3RhdGUgc3RhdGUpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRwRGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeSBwRGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeTsKKyAgICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCB0UG1jU3RhdGUgcG1jU3RhdGUpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJQTUMgLSBVcGRhdGUgcmVnaXN0ZXJlZCBtb2R1bGVzIG9mIG5ldyBkZXZpY2UgIgorICAgICAgICAgICAic3RhdGU6ICVzXG4iKSwgcG1jR2V0UG1jU3RhdGVTdHIoc3RhdGUpKTsKKworICAgIC8qIENhbGwgdGhlIHJvdXRpbmVzIGluIHRoZSB1cGRhdGUgZGV2aWNlIHN0YXRlIHJvdXRpbmUgbGlzdC4gKi8KKyAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCZwTWFjLT5wbWMuZGV2aWNlU3RhdGVVcGRhdGVJbmRMaXN0LCBGQUxTRSk7CisgICAgd2hpbGUgKHBFbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcERldmljZVN0YXRlVXBkYXRlSW5kRW50cnkgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdERldmljZVN0YXRlVXBkYXRlSW5kRW50cnksIGxpbmspOworICAgICAgICBjYWxsYmFja1JvdXRpbmUgPSBwRGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeS0+Y2FsbGJhY2tSb3V0aW5lOworICAgICAgICBjYWxsYmFja1JvdXRpbmUocERldmljZVN0YXRlVXBkYXRlSW5kRW50cnktPmNhbGxiYWNrQ29udGV4dCwgc3RhdGUpOworICAgICAgICBwRW50cnkgPSBjc3JMTE5leHQoJnBNYWMtPnBtYy5kZXZpY2VTdGF0ZVVwZGF0ZUluZExpc3QsIHBFbnRyeSwgRkFMU0UpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jUmVxdWVzdEVudGVyV293bFN0YXRlCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBIYXZlIHRoZSBkZXZpY2UgZW50ZXIgdGhlIFdPV0wgU3RhdGUuCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyoKKyogUmV0dXJuczoKKyogICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFdPV0wgbW9kZSB3aWxsIGJlIGVudGVyZWQKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIFdPV0wgbW9kZSBjYW5ub3QgYmUgZW50ZXJlZAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNSZXF1ZXN0RW50ZXJXb3dsU3RhdGUodEhhbEhhbmRsZSBoSGFsLCB0cFNpclNtZVdvd2xFbnRlclBhcmFtcyB3b3dsRW50ZXJQYXJhbXMpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICBzbXNMb2cocE1hYywgTE9HMiwgIlBNQzogZW50ZXJpbmcgcG1jUmVxdWVzdEVudGVyV293bFN0YXRlXG4iKTsKKworICAgc3dpdGNoIChwTWFjLT5wbWMucG1jU3RhdGUpCisgICB7CisgICAgICBjYXNlIEZVTExfUE9XRVI6CisgICAgICAgICAvKiBQdXQgZGV2aWNlIGluIEJNUFMgbW9kZSBmaXJzdC4gVGhpcyBzdGVwIHNob3VsZCBORVZFUiBmYWlsLiAqLworICAgICAgICAgaWYocG1jRW50ZXJSZXF1ZXN0Qm1wc1N0YXRlKGhIYWwpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogRGV2aWNlIGluIEZ1bGwgUG93ZXIuIHBtY0VudGVyUmVxdWVzdEJtcHNTdGF0ZSBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBlbnRlciBXT1dMXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUkVRVUVTVF9CTVBTOgorICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJQTUM6IEJNUFMgdHJhbnNhY3Rpb24gZ29pbmcgb24uIFdPV0wgcmVxdWVzdCAiCisgICAgICAgICAgICAgICAgICAgICJ3aWxsIGJlIGJ1ZmZlcmVkXG4iKTsgICAgICAgICAKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEJNUFM6CisgICAgICBjYXNlIFdPV0w6CisgICAgICAgICAvKiBUZWxsIE1BQyB0byBoYXZlIGRldmljZSBlbnRlciBXT1dMIG1vZGUuIE5vdGU6IFdlIGFjY2VwdCBXT1dMIHJlcXVlc3QKKyAgICAgICAgICAgIHdoZW4gd2UgYXJlIGluIFdPV0wgbW9kZS4gVGhpcyBhbGxvd3MgSEREIHRvIGNoYW5nZSBXT1dMIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIGV4aXQgV09XTCBtb2RlICovCisgICAgICAgICBpZiAocG1jSXNzdWVDb21tYW5kKGhIYWwsIGVTbWVDb21tYW5kRW50ZXJXb3dsLCB3b3dsRW50ZXJQYXJhbXMsIHNpemVvZih0U2lyU21lV293bEVudGVyUGFyYW1zKSwgRkFMU0UpICE9CisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IGZhaWx1cmUgdG8gc2VuZCBtZXNzYWdlIGVXTklfUE1DX0VOVEVSX1dPV0xfUkVRXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUkVRVUVTVF9FTlRFUl9XT1dMOgorICAgICAgICAgLy9NdWx0aXBsZSBlbnRlciBXT1dMIHJlcXVlc3RzIGF0IHRoZSBzYW1lIHRpbWUgYXJlIG5vdCBhY2NlcHRlZAorICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IEVudGVyIFdPV0wgdHJhbnNhY3Rpb24gYWxyZWFkeSBnb2luZyBvbi4gTmV3IFdPV0wgcmVxdWVzdCAiCisgICAgICAgICAgICAgICAgICAgICJ3aWxsIGJlIHJlamVjdGVkXG4iKTsKKyAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworCisgICAgICBjYXNlIFJFUVVFU1RfRVhJVF9XT1dMOgorICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJQTUM6IEV4aXQgV09XTCB0cmFuc2FjdGlvbiBnb2luZyBvbi4gTmV3IFdPV0wgcmVxdWVzdCAiCisgICAgICAgICAgICAgICAgICAgIndpbGwgYmUgYnVmZmVyZWRcbiIpOyAgICAgICAgIAorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogVHJ5aW5nIHRvIGVudGVyIFdPV0wgU3RhdGUgZnJvbSBzdGF0ZSAlc1xuIiwKKyAgICAgICAgICAgIHBtY0dldFBtY1N0YXRlU3RyKHBNYWMtPnBtYy5wbWNTdGF0ZSkpOworICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNFbnRlcldvd2xTdGF0ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSGF2ZSB0aGUgZGV2aWNlIGVudGVyIHRoZSBXT1dMIFN0YXRlLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBjaGFuZ2luZyBzdGF0ZSBzdWNjZXNzZnVsCisqICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBjaGFuZ2luZyBzdGF0ZSBub3Qgc3VjY2Vzc2Z1bAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNFbnRlcldvd2xTdGF0ZSAodEhhbEhhbmRsZSBoSGFsKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICBzbXNMb2cocE1hYywgTE9HMiwgIlBNQzogZW50ZXJpbmcgcG1jRW50ZXJXb3dsU3RhdGVcbiIpOworCisgICAvKiBDYW4gZW50ZXIgV09XTCBTdGF0ZSBvbmx5IGZyb20gUmVxdWVzdCBXT1dMIFN0YXRlLiAqLworICAgaWYgKHBNYWMtPnBtYy5wbWNTdGF0ZSAhPSBSRVFVRVNUX0VOVEVSX1dPV0wgKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR1AsICJQTUM6IHRyeWluZyB0byBlbnRlciBXT1dMIFN0YXRlIGZyb20gc3RhdGUgJWRcbiIsCisgICAgICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSk7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgLyogQ2hhbmdlIHN0YXRlLiAqLworICAgcE1hYy0+cG1jLnBtY1N0YXRlID0gV09XTDsKKworICAgLyogQ2xlYXIgdGhlIGJ1ZmZlcmVkIGNvbW1hbmQgZm9yIFdPV0wgKi8KKyAgIHBNYWMtPnBtYy53b3dsTW9kZVJlcXVpcmVkID0gRkFMU0U7CisKKyAgIC8qIElmIHdlIGhhdmUgYSByZXFldXN0IGZvciBmdWxsIHBvd2VyIHBlbmRpbmcgdGhlbiB3ZSBoYXZlIHRvIGdvCisgICBkaXJlY3RseSBpbnRvIGZ1bGwgcG93ZXIuICovCisgICBpZiAocE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJQZW5kaW5nKQorICAgeworICAgICAgLyogU3RhcnQgZXhpdCBXb3dsIHNlcXVlbmNlIG5vdy4gKi8KKyAgICAgIHJldHVybiBwbWNFbnRlclJlcXVlc3RGdWxsUG93ZXJTdGF0ZShoSGFsLCBwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlclJlYXNvbik7CisgICB9CisKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNSZXF1ZXN0RXhpdFdvd2xTdGF0ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSGF2ZSB0aGUgZGV2aWNlIGV4aXQgV09XTCBTdGF0ZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gRXhpdCBXT1dMIHN1Y2Nlc3NmdWwKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIEV4aXQgV09XTCB1bnN1Y2Nlc3NmdWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jUmVxdWVzdEV4aXRXb3dsU3RhdGUodEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCAiUE1DOiBlbnRlcmluZyBwbWNSZXF1ZXN0RXhpdFdvd2xTdGF0ZVxuIik7CisKKyAgICBzd2l0Y2ggKHBNYWMtPnBtYy5wbWNTdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgV09XTDoKKyAgICAgICAgICAgIC8qIFRlbGwgTUFDIHRvIGhhdmUgZGV2aWNlIGV4aXQgV09XTCBtb2RlLiAqLworICAgICAgICAgICAgaWYgKHBtY0lzc3VlQ29tbWFuZChoSGFsLCBlU21lQ29tbWFuZEV4aXRXb3dsLCBOVUxMLCAwLCBGQUxTRSkgIT0KKyAgICAgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dQLCAiUE1DOiBmYWlsdXJlIHRvIHNlbmQgbWVzc2FnZSBlV05JX1BNQ19FWElUX1dPV0xfUkVRXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUkVRVUVTVF9FTlRFUl9XT1dMOgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1AsICJQTUM6IFJjdmQgZXhpdCBXT1dMIGV2ZW4gYmVmb3JlIGVudGVyIFdPV0wgd2FzIGNvbXBsZXRlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsgICAKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJQTUM6IEdvdCBleGl0IFdPV0wgaW4gc3RhdGUgJXMuIE5vdGhpbmcgdG8gZG8gYXMgYWxyZWFkeSBvdXQgb2YgV09XTFxuIiwKKyAgICAgICAgICAgIHBtY0dldFBtY1N0YXRlU3RyKHBNYWMtPnBtYy5wbWNTdGF0ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY0RvRW50ZXJXb3dsQ2FsbGJhY2tzCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBJbnZva2UgRW50ZXIgV09XTCBjYWxsYmFja3MKKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOiBOb25lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBtY0RvRW50ZXJXb3dsQ2FsbGJhY2tzICh0SGFsSGFuZGxlIGhIYWwsIGVIYWxTdGF0dXMgY2FsbGJhY2tTdGF0dXMpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgCisgICBzbXNMb2cocE1hYywgTE9HMiwgIlBNQzogZW50ZXJpbmcgcG1jRG9Xb3dsQ2FsbGJhY2tzXG4iKTsKKworICAgLyogQ2FsbCBXb3dsIGNhbGxiYWNrIHJvdXRpbmUuICovCisgICBpZiAocE1hYy0+cG1jLmVudGVyV293bENhbGxiYWNrUm91dGluZSAhPSBOVUxMKQorICAgICAgcE1hYy0+cG1jLmVudGVyV293bENhbGxiYWNrUm91dGluZShwTWFjLT5wbWMuZW50ZXJXb3dsQ2FsbGJhY2tDb250ZXh0LCBjYWxsYmFja1N0YXR1cyk7CisKKyAgIHBNYWMtPnBtYy5lbnRlcldvd2xDYWxsYmFja1JvdXRpbmUgPSBOVUxMOworICAgcE1hYy0+cG1jLmVudGVyV293bENhbGxiYWNrQ29udGV4dCA9IE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgcG1jUHJvY2Vzc0RlZmVycmVkTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICB0UG1jRGVmZXJyZWRNc2cgKnBEZWZlcnJlZE1zZzsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKworICAgIHdoaWxlKCBOVUxMICE9ICggcEVudHJ5ID0gY3NyTExSZW1vdmVIZWFkKCAmcE1hYy0+cG1jLmRlZmVycmVkTXNnTGlzdCwgZUFOSV9CT09MRUFOX1RSVUUgKSApICkKKyAgICB7CisgICAgICAgIHBEZWZlcnJlZE1zZyA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFBtY0RlZmVycmVkTXNnLCBsaW5rICk7CisgICAgICAgIHN3aXRjaCAocERlZmVycmVkTXNnLT5tZXNzYWdlVHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVXTklfUE1DX1dPV0xfQUREX0JDQVNUX1BUUk46CisgICAgICAgICAgICBWT1NfQVNTRVJUKCBwRGVmZXJyZWRNc2ctPnNpemUgPT0gc2l6ZW9mKHRTaXJXb3dsQWRkQmNhc3RQdHJuKSApOworICAgICAgICAgICAgaWYgKHBtY1NlbmRNZXNzYWdlKHBNYWMsIGVXTklfUE1DX1dPV0xfQUREX0JDQVNUX1BUUk4sIAorICAgICAgICAgICAgICAgICAgICAmcERlZmVycmVkTXNnLT51Lndvd2xBZGRQYXR0ZXJuLCBzaXplb2YodFNpcldvd2xBZGRCY2FzdFB0cm4pKQorICAgICAgICAgICAgICAgICAgICAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiU2VuZCBvZiBlV05JX1BNQ19XT1dMX0FERF9CQ0FTVF9QVFJOIHRvIFBFIGZhaWxlZFxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlV05JX1BNQ19XT1dMX0RFTF9CQ0FTVF9QVFJOOgorICAgICAgICAgICAgVk9TX0FTU0VSVCggcERlZmVycmVkTXNnLT5zaXplID09IHNpemVvZih0U2lyV293bERlbEJjYXN0UHRybikgKTsKKyAgICAgICAgICAgIGlmIChwbWNTZW5kTWVzc2FnZShwTWFjLCBlV05JX1BNQ19XT1dMX0RFTF9CQ0FTVF9QVFJOLCAKKyAgICAgICAgICAgICAgICAgICAgJnBEZWZlcnJlZE1zZy0+dS53b3dsRGVsUGF0dGVybiwgc2l6ZW9mKHRTaXJXb3dsRGVsQmNhc3RQdHJuKSkKKyAgICAgICAgICAgICAgICAgICAgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlNlbmQgb2YgZVdOSV9QTUNfV09XTF9BRERfQkNBU1RfUFRSTiB0byBQRSBmYWlsZWRcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVdOSV9QTUNfUFdSX1NBVkVfQ0ZHOgorICAgICAgICAgICAgVk9TX0FTU0VSVCggcERlZmVycmVkTXNnLT5zaXplID09IHNpemVvZih0U2lyUG93ZXJTYXZlQ2ZnKSApOworICAgICAgICAgICAgaWYgKHBtY1NlbmRNZXNzYWdlKHBNYWMsIGVXTklfUE1DX1BXUl9TQVZFX0NGRywgCisgICAgICAgICAgICAgICAgICAgICZwRGVmZXJyZWRNc2ctPnUucG93ZXJTYXZlQ29uZmlnLCBzaXplb2YodFNpclBvd2VyU2F2ZUNmZykpIAorICAgICAgICAgICAgICAgICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJTZW5kIG9mIGVXTklfUE1DX1BXUl9TQVZFX0NGRyB0byBQRSBmYWlsZWRcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoInVua25vd24gbWVzc2FnZSAoJWQpXG4iKSwgcERlZmVycmVkTXNnLT5tZXNzYWdlVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvL05lZWQgdG8gZnJlZSB0aGUgbWVtb3J5IGhlcmUKKyAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcERlZmVycmVkTXNnICk7CisgICAgfSAvL3doaWxlCit9CisKKworZUhhbFN0YXR1cyBwbWNEZWZlck1zZyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgbWVzc2FnZVR5cGUsIHZvaWQgKnBEYXRhLCB0QU5JX1UzMiBzaXplKQoreworICAgIHRQbWNEZWZlcnJlZE1zZyAqcERlZmVycmVkTXNnOworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCisgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcERlZmVycmVkTXNnLCBzaXplb2YodFBtY0RlZmVycmVkTXNnKSApICkgKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjYWxsYmFjayBjb250ZXh0XG4iKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19SRVNPVVJDRVM7CisgICAgfQorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsIHBEZWZlcnJlZE1zZywgc2l6ZW9mKHRQbWNEZWZlcnJlZE1zZykgKTsKKyAgICBwRGVmZXJyZWRNc2ctPm1lc3NhZ2VUeXBlID0gbWVzc2FnZVR5cGU7CisgICAgcERlZmVycmVkTXNnLT5zaXplID0gKHRBTklfVTE2KXNpemU7CisgICAgaWYoIHBEYXRhICkKKyAgICB7CisgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAmcERlZmVycmVkTXNnLT51LmRhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEsIHNpemUgKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgY29weSBwYXR0ZXJuIGZvciBjYWxsYmFjayBjb250ZXh0XG4iKSk7CisgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwRGVmZXJyZWRNc2cgKTsKKyAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGNzckxMSW5zZXJ0VGFpbCggJnBNYWMtPnBtYy5kZWZlcnJlZE1zZ0xpc3QsICZwRGVmZXJyZWRNc2ctPmxpbmssIGVBTklfQk9PTEVBTl9UUlVFICk7CisgICAgLy9ObyBjYWxsYmFjayBpcyBuZWVkZWQuIFRoZSBtZXNzYWdlcyBhcmUgcHV0IGludG8gZGVmZXJyZWQgcXVldWUgYW5kIGJlIHByb2Nlc3NlZCBmaXJzdCAKKyAgICAvL3doZW4gZW50ZXIgZnVsbCBwb3dlciBpcyBjb21wbGV0ZS4KKyAgICBzdGF0dXMgPSBwbWNSZXF1ZXN0RnVsbFBvd2VyKCBwTWFjLCBOVUxMLCBOVUxMLCBlU01FX1JFQVNPTl9PVEhFUiApOworICAgIGlmKCBlSEFMX1NUQVRVU19QTUNfUEVORElORyAhPSBzdGF0dXMgKQorICAgIHsKKyAgICAgICAgLy9laXRoZXIgZmFpbCBvciBhbHJlYWR5IGluIGZ1bGwgcG93ZXIKKyAgICAgICAgaWYoIGNzckxMUmVtb3ZlRW50cnkoICZwTWFjLT5wbWMuZGVmZXJyZWRNc2dMaXN0LCAmcERlZmVycmVkTXNnLT5saW5rLCBlQU5JX0JPT0xFQU5fVFJVRSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcERlZmVycmVkTXNnICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJmYWlsZWQgdG8gcmVxdWVzdCBmdWxsIHBvd2VyIHN0YXR1cyA9ICVkXG4iKSwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKwordm9pZCBwbWNSZWxlYXNlQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQgKQoreworICAgIGlmKCFwQ29tbWFuZC0+dS5wbWNDbWQuZlJlbGVhc2VXaGVuRG9uZSkKKyAgICB7CisgICAgICAgIC8vVGhpcyBpcyBhIG5vcm1hbCBjb21tYW5kLCBwdXQgaXQgYmFjayB0byB0aGUgZnJlZSBsc2l0CisgICAgICAgIHBDb21tYW5kLT51LnBtY0NtZC5zaXplID0gMDsKKyAgICAgICAgc21lUmVsZWFzZUNvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vdGhpcyBpcyBhIHNwZWNpYWxseSBhbGxvY2F0ZWQgY29tYW1uZCBkdWUgdG8gb3V0IG9mIGNvbW1hbmQgYnVmZmVyLiBmcmVlIGl0LgorICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBDb21tYW5kKTsKKyAgICB9Cit9CisKKworLy90aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWJvcnQgYSBjb21tYW5kIHdoZXJlIHRoZSBub3JtYWwgcHJvY2Vzc2luZyBvZiB0aGUgY29tbWFuZAorLy9pcyB0ZXJtaW5hdGVkIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgbm9ybWFsIHBhdGguIGl0IGlzIGhlcmUgdG8gdGFrZSBjYXJlIG9mIGNhbGxiYWNrcyBmb3IKKy8vdGhlIGNvbW1hbmQsIGlmIGFwcGxpY2FibGUuCit2b2lkIHBtY0Fib3J0Q29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQsIHRBTklfQk9PTEVBTiBmU3RvcHBpbmcgKQoreworICAgIGlmKCBlU21lUG1jQ29tbWFuZE1hc2sgJiBwQ29tbWFuZC0+Y29tbWFuZCApCisgICAgeworICAgICAgICBpZiggIWZTdG9wcGluZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCggcENvbW1hbmQtPmNvbW1hbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZEVudGVySW1wczoKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImFib3J0aW5nIHJlcXVlc3QgdG8gZW50ZXIgSU1QU1xuIikpOworICAgICAgICAgICAgICAgIHBtY0VudGVyRnVsbFBvd2VyU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFeGl0SW1wczoKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImFib3J0aW5nIHJlcXVlc3QgdG8gZXhpdCBJTVBTIFxuIikpOworICAgICAgICAgICAgICAgIHBtY0VudGVyRnVsbFBvd2VyU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFbnRlckJtcHM6CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJhYm9ydGluZyByZXF1ZXN0IHRvIGVudGVyIEJNUFMgXG4iKSk7CisgICAgICAgICAgICAgICAgcE1hYy0+cG1jLmJtcHNSZXF1ZXN0UXVldWVkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgIHBtY0VudGVyRnVsbFBvd2VyU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICAgcG1jRG9CbXBzQ2FsbGJhY2tzKHBNYWMsIGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGVTbWVDb21tYW5kRXhpdEJtcHM6CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJhYm9ydGluZyByZXF1ZXN0IHRvIGV4aXQgQk1QUyBcbiIpKTsKKyAgICAgICAgICAgICAgICBwbWNFbnRlckZ1bGxQb3dlclN0YXRlKHBNYWMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGVTbWVDb21tYW5kRW50ZXJVYXBzZDoKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImFib3J0aW5nIHJlcXVlc3QgdG8gZW50ZXIgVUFQU0QgXG4iKSk7CisgICAgICAgICAgICAgICAgLy9TaW5jZSB0aGVyZSBpcyBubyByZXRyeSBmb3IgVUFQU0QsIHRlbGwgdGhlIHJlcXVlc3RlciBoZXJlIHdlIGFyZSBkb25lIHdpdGggZmFpbHVyZQorICAgICAgICAgICAgICAgIHBNYWMtPnBtYy51YXBzZFNlc3Npb25SZXF1aXJlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBtY0RvU3RhcnRVYXBzZENhbGxiYWNrcyhwTWFjLCBlSEFMX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZEV4aXRVYXBzZDoKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImFib3J0aW5nIHJlcXVlc3QgdG8gZXhpdCBVQVBTRCBcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZEVudGVyV293bDoKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImFib3J0aW5nIHJlcXVlc3QgdG8gZW50ZXIgV09XTCBcbiIpKTsKKyAgICAgICAgICAgICAgICBwbWNEb0VudGVyV293bENhbGxiYWNrcyhwTWFjLCBlSEFMX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZEV4aXRXb3dsOgorICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiYWJvcnRpbmcgcmVxdWVzdCB0byBleGl0IFdPV0wgXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFbnRlclN0YW5kYnk6CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJhYm9ydGluZyByZXF1ZXN0IHRvIGVudGVyIFN0YW5kYnkgXG4iKSk7CisgICAgICAgICAgICAgICAgcG1jRG9TdGFuZGJ5Q2FsbGJhY2tzKHBNYWMsIGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiUmVxdWVzdCBmb3IgUE1DIGNvbW1hbmQgKCVkKSBpcyBkcm9wcGVkXG4iKSwgcENvbW1hbmQtPmNvbW1hbmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Ly8gIXN0b3BwaW5nCisgICAgICAgIHBtY1JlbGVhc2VDb21tYW5kKCBwTWFjLCBwQ29tbWFuZCApOworICAgIH0KK30KKworCisKKy8vVGhlc2UgY29tbWFuZHMgYXJlIG5vdCBzdXBwb3NlZCB0byBmYWlsIGR1ZSB0byBvdXQgb2YgY29tbWFuZCBidWZmZXIsCisvL290aGVyd2lzZSBvdGhlciBjb21tYW5kcyBhcmUgbm90IGV4ZWN1dGVkIGFuZCBubyBjb21tYW5kIGlzIHJlbGVhc2VkLiBJdCB3aWxsIGJlIGRlYWRsb2NrLiAKKyNkZWZpbmUgUE1DX0lTX0NPTU1BTkRfQ0FOTk9UX0ZBSUwoY21kVHlwZSlcCisgICAgKCAoZVNtZUNvbW1hbmRFbnRlclN0YW5kYnkgPT0gKGNtZFR5cGUgKSkgfHxcCisgICAgICAoZVNtZUNvbW1hbmRFeGl0SW1wcyA9PSAoY21kVHlwZSApKSB8fFwKKyAgICAgIChlU21lQ29tbWFuZEV4aXRCbXBzID09IChjbWRUeXBlICkpIHx8XAorICAgICAgKGVTbWVDb21tYW5kRXhpdFVhcHNkID09IChjbWRUeXBlICkpIHx8XAorICAgICAgKGVTbWVDb21tYW5kRXhpdFdvd2wgPT0gKGNtZFR5cGUgKSkgKQorCitlSGFsU3RhdHVzIHBtY1ByZXBhcmVDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCBlU21lQ29tbWFuZFR5cGUgY21kVHlwZSwgdm9pZCAqcHZQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgc2l6ZSwgdFNtZUNtZCAqKnBwQ21kICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICB0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisKKyAgICBWT1NfQVNTRVJUKCBwcENtZCApOworICAgIGRvCisgICAgeworICAgICAgICBwQ29tbWFuZCA9IHNtZUdldENvbW1hbmRCdWZmZXIoIHBNYWMgKTsKKyAgICAgICAgaWYgKCBwQ29tbWFuZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vTWFrZSBzdXJlIGl0IHdpbGwgYmUgcHV0IGJhY2sgdG8gdGhlIGxpc3QKKyAgICAgICAgICAgIHBDb21tYW5kLT51LnBtY0NtZC5mUmVsZWFzZVdoZW5Eb25lID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgZmFpbCB0byBnZXQgY29tbWFuZCBidWZmZXIgZm9yIGNvbW1hbmQgMHglWCBjdXJTdGF0ZSA9ICVkIiksIGNtZFR5cGUsIHBNYWMtPnBtYy5wbWNTdGF0ZSApOworICAgICAgICAgICAgLy9Gb3IgY2VydGFpbiBQTUMgY29tbWFuZCwgd2UgY2Fubm90IGZhaWwKKyAgICAgICAgICAgIGlmKCBQTUNfSVNfQ09NTUFORF9DQU5OT1RfRkFJTChjbWRUeXBlKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGNvbW1hbmQgMHglWCAgY2Fubm90IGZhaWwgdHJ5IGFsbG9jYXRpbmcgbWVtb3J5IGZvciBpdCIpLCBjbWRUeXBlICk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBDb21tYW5kLCBzaXplb2YodFNtZUNtZCkpOworICAgICAgICAgICAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXMgZmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbW1hbmQgKDB4JVgpIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNtZFR5cGUpOworICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBDb21tYW5kLCBzaXplb2YodFNtZUNtZCkpOworICAgICAgICAgICAgICAgIC8vTWFrZSBzdXJlIGl0IHdpbGwgYmUgZnJlZSB3aGVuIGl0IGlzIGRvbmUKKyAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5wbWNDbWQuZlJlbGVhc2VXaGVuRG9uZSA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcENvbW1hbmQtPmNvbW1hbmQgPSBjbWRUeXBlOworICAgICAgICBwQ29tbWFuZC0+dS5wbWNDbWQuc2l6ZSA9IHNpemU7CisgICAgICAgIC8vSW5pdGlhbGl6ZSB0aGUgcmVhc29uIGNvZGUgaGVyZS4gSXQgbWF5IGJlIG92ZXJ3cml0dGVuIGxhdGVyIHdoZW4KKyAgICAgICAgLy9hIHBhcnRpY3VsYXIgcmVhc29uIGlzIG5lZWRlZC4KKyAgICAgICAgcENvbW1hbmQtPnUucG1jQ21kLmZ1bGxQb3dlclJlYXNvbiA9IGVTTUVfUkVBU09OX09USEVSOworICAgICAgICBzd2l0Y2ggKCBjbWRUeXBlICkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVTbWVDb21tYW5kRW50ZXJJbXBzOgorICAgICAgICBjYXNlIGVTbWVDb21tYW5kRXhpdEltcHM6CisgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFbnRlckJtcHM6CisgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFbnRlclVhcHNkOgorICAgICAgICBjYXNlIGVTbWVDb21tYW5kRW50ZXJTdGFuZGJ5OgorICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFeGl0VWFwc2Q6CisgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFeGl0V293bDoKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICBpZiggcHZQYXJhbSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucG1jQ21kLmZ1bGxQb3dlclJlYXNvbiA9ICooICh0UmVxdWVzdEZ1bGxQb3dlclJlYXNvbiAqKXB2UGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFeGl0Qm1wczoKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICBpZiggcHZQYXJhbSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucG1jQ21kLnUuZXhpdEJtcHNJbmZvID0gKiggKHRFeGl0Qm1wc0luZm8gKilwdlBhcmFtICk7CisgICAgICAgICAgICAgICAgcENvbW1hbmQtPnUucG1jQ21kLmZ1bGxQb3dlclJlYXNvbiA9IHBDb21tYW5kLT51LnBtY0NtZC51LmV4aXRCbXBzSW5mby5leGl0Qm1wc1JlYXNvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICgiIGV4aXQgQk1QUyBtdXN0IGhhdmUgYSByZWFzb24gY29kZVxuIikgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFbnRlcldvd2w6CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgaWYoIHB2UGFyYW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDb21tYW5kLT51LnBtY0NtZC51LmVudGVyV293bEluZm8gPSAqKCAoIHRTaXJTbWVXb3dsRW50ZXJQYXJhbXMgKiApcHZQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiAgaW52YWxpZCBjb21tYW5kIHR5cGUgJWRcbiIpLCBjbWRUeXBlICk7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSAmJiBwQ29tbWFuZCApCisgICAgeworICAgICAgICAqcHBDbWQgPSBwQ29tbWFuZDsKKyAgICB9CisgICAgZWxzZSBpZiggcENvbW1hbmQgKQorICAgIHsKKyAgICAgICAgcG1jUmVsZWFzZUNvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK2VIYWxTdGF0dXMgcG1jSXNzdWVDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCBlU21lQ29tbWFuZFR5cGUgY21kVHlwZSwgdm9pZCAqcHZQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgc2l6ZSwgdEFOSV9CT09MRUFOIGZQdXRUb0xpc3RIZWFkICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1JFU09VUkNFUzsKKyAgICB0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisKKyAgICBzdGF0dXMgPSBwbWNQcmVwYXJlQ29tbWFuZCggcE1hYywgY21kVHlwZSwgcHZQYXJhbSwgc2l6ZSwgJnBDb21tYW5kICk7CisgICAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgJiYgcENvbW1hbmQgKQorICAgIHsKKyAgICAgICAgc21lUHVzaENvbW1hbmQoIHBNYWMsIHBDb21tYW5kLCBmUHV0VG9MaXN0SGVhZCApOworICAgIH0KKworICAgIHJldHVybiggc3RhdHVzICk7Cit9CisKKworCit0QU5JX0JPT0xFQU4gcG1jUHJvY2Vzc0NvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdEFOSV9CT09MRUFOIGZSZW1vdmVDbWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKworICAgIGRvCisgICAgeworICAgICAgICBzd2l0Y2ggKCBwQ29tbWFuZC0+Y29tbWFuZCApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlU21lQ29tbWFuZEVudGVySW1wczoKKyAgICAgICAgICAgIGlmKCBGVUxMX1BPV0VSID09IHBNYWMtPnBtYy5wbWNTdGF0ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcG1jRW50ZXJJbXBzQ2hlY2soIHBNYWMgKTsKKyAgICAgICAgICAgICAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUuICovCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IFJFUVVFU1RfSU1QUzsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcG1jU2VuZE1lc3NhZ2UocE1hYywgZVdOSV9QTUNfRU5URVJfSU1QU19SRVEsIE5VTEwsIDApOworICAgICAgICAgICAgICAgICAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGFscmVhZHkgd2VudCBiYWNrIEZ1bGwgUG93ZXIgU3RhdGUgKG1lYW5pbmcgdGhhdCByZXF1ZXN0IGRpZCBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBhcyBmYXIgYXMgdGhlIGRldmljZSkgdGhlbiB3ZSBhcmUgbm90IHN1Y2Nlc3NmdWxsLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBGVUxMX1BPV0VSICE9IHBNYWMtPnBtYy5wbWNTdGF0ZSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlbW92ZUNtZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IGZhaWx1cmUgdG8gc2VuZCBtZXNzYWdlIGVXTklfUE1DX0VOVEVSX0lNUFNfUkVRIG9yIHBtY0VudGVySW1wc0NoZWNrIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHBtY0VudGVyRnVsbFBvd2VyU3RhdGUoIHBNYWMgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocG1jU2hvdWxkQm1wc1RpbWVyUnVuKHBNYWMpKQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcG1jU3RhcnRUcmFmZmljVGltZXIocE1hYywgcE1hYy0+cG1jLmJtcHNDb25maWcudHJhZmZpY01lYXN1cmVQZXJpb2QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0vL2Z1bGxfcG93ZXIKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFeGl0SW1wczoKKyAgICAgICAgICAgIHBNYWMtPnBtYy5yZXF1ZXN0RnVsbFBvd2VyUGVuZGluZyA9IEZBTFNFOworICAgICAgICAgICAgaWYoICggSU1QUyA9PSBwTWFjLT5wbWMucG1jU3RhdGUgKSB8fCAoIFNUQU5EQlkgPT0gcE1hYy0+cG1jLnBtY1N0YXRlICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vQ2hlY2sgc3RhdGUgYmVmb3JlIHNlbmRpbmcgbWVzc2FnZS4gVGhlIHN0YXRlIG1heSBjaGFuZ2UgYWZ0ZXIgdGhhdAorICAgICAgICAgICAgICAgIGlmKCBTVEFOREJZID09IHBNYWMtPnBtYy5wbWNTdGF0ZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0VuYWJsZSBJZGxlIHNjYW4gaW4gQ1NSCisgICAgICAgICAgICAgICAgICAgIGNzclNjYW5SZXN1bWVJTVBTKHBNYWMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBtY1NlbmRNZXNzYWdlKHBNYWMsIGVXTklfUE1DX0VYSVRfSU1QU19SRVEsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwTWFjLT5wbWMucG1jU3RhdGUgPSBSRVFVRVNUX0ZVTExfUE9XRVI7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiZVdOSV9QTUNfRVhJVF9JTVBTX1JFUSBzZW50IHRvIFBFXG4iKSk7IAorICAgICAgICAgICAgICAgICAgICBmUmVtb3ZlQ21kID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImVXTklfUE1DX0VYSVRfSU1QU19SRVEgZmFpbCB0byBiZSBzZW50IHRvIFBFIHN0YXR1cyAlZFxuIiksIHN0YXR1cyk7IAorICAgICAgICAgICAgICAgICAgICAvL0NhbGxiYWNrcyBhcmUgY2FsbGVkIHdpdGggc3VjY2VzcyBzcmFydXMsIGRvIHdlIG5lZWQgdG8gcGFzcyBpbiByZWFsIHN0YXR1cz8/CisgICAgICAgICAgICAgICAgICAgIHBtY0VudGVyRnVsbFBvd2VyU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlU21lQ29tbWFuZEVudGVyQm1wczoKKyAgICAgICAgICAgIGlmKCBGVUxMX1BPV0VSID09IHBNYWMtPnBtYy5wbWNTdGF0ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9UaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHJldHVybiBzdWNjZXNzIGJlY2F1c2UgdGhlIHBtYyBzdGF0ZSBpcyBub3QgQk1QUworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBtY0VudGVyQm1wc0NoZWNrKCBwTWFjICk7CisgICAgICAgICAgICAgICAgaWYoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ2hhbmdlIFBNQyBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBwTWFjLT5wbWMucG1jU3RhdGUgPSBSRVFVRVNUX0JNUFM7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiUE1DOiBFbnRlciBCTVBTIHJlcSBkb25lOiBGb3JjZSBYTyBDb3JlIE9OXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdm9zX2NoaXBWb3RlWE9Db3JlKE5VTEwsIE5VTEwsIE5VTEwsIFZPU19UUlVFKTsgCisgICAgICAgICAgICAgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJDb3VsZCBub3QgdHVybiBYTyBDb3JlIE9OLiBDYW4ndCBnbyB0byBCTVBTXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIFhPIENvcmUgdHVybiBPTiB3YXMgc3VjY2Vzc2Z1bCAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRlbGwgTUFDIHRvIGhhdmUgZGV2aWNlIGVudGVyIEJNUFMgbW9kZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcG1jU2VuZE1lc3NhZ2UocE1hYywgZVdOSV9QTUNfRU5URVJfQk1QU19SRVEsIE5VTEwsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmUmVtb3ZlQ21kID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJGYWlsIHRvIHNlbmQgZW50ZXIgQk1QUyBtc2cgdG8gUEVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbmNlbCB0aGUgdm90ZSBmb3IgWE8gQ29yZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiSW4gbW9kdWxlIGluaXQ6IENhbmNlbCB0aGUgdm90ZSBmb3IgWE8gQ09SRSBPTiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbmNlIHNlbmQgZW50ZXIgYm1wcyBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b3NfY2hpcFZvdGVYT0NvcmUoTlVMTCwgTlVMTCwgTlVMTCwgVk9TX0ZBTFNFKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIkNvdWxkIG5vdCBjYW5jZWwgWE8gQ29yZSBPTiB2b3RlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgcmV0dXJuaW5nIGZhaWx1cmUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyIGNvbnN1bWVkIHdpbGwgYmUgaGlnaFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBmYWlsdXJlIHRvIHNlbmQgbWVzc2FnZSBlV05JX1BNQ19FTlRFUl9CTVBTX1JFUSBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnBtYy5ibXBzUmVxdWVzdFF1ZXVlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcG1jRW50ZXJGdWxsUG93ZXJTdGF0ZShwTWFjKTsKKyAgICAgICAgICAgICAgICAgICAgLy9EbyBub3QgY2FsbCBVQVBTRCBjYWxsYmFjayBoZXJlIHNpbmNlIGl0IG1heSBiZSByZXRyaWVkCisgICAgICAgICAgICAgICAgICAgIHBtY0RvQm1wc0NhbGxiYWNrcyhwTWFjLCBlSEFMX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocG1jU2hvdWxkQm1wc1RpbWVyUnVuKHBNYWMpKQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcG1jU3RhcnRUcmFmZmljVGltZXIocE1hYywgcE1hYy0+cG1jLmJtcHNDb25maWcudHJhZmZpY01lYXN1cmVQZXJpb2QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFeGl0Qm1wczoKKyAgICAgICAgICAgIGlmKCBCTVBTID09IHBNYWMtPnBtYy5wbWNTdGF0ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJQZW5kaW5nID0gRkFMU0U7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwbWNTZW5kTWVzc2FnZSggcE1hYywgZVdOSV9QTUNfRVhJVF9CTVBTX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb21tYW5kLT51LnBtY0NtZC51LmV4aXRCbXBzSW5mbywgc2l6ZW9mKHRFeGl0Qm1wc0luZm8pICk7CisgICAgICAgICAgICAgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IFJFUVVFU1RfRlVMTF9QT1dFUjsKKyAgICAgICAgICAgICAgICAgICAgZlJlbW92ZUNtZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJlV05JX1BNQ19FWElUX0JNUFNfUkVRIHNlbnQgdG8gUEVcbiIpKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImVXTklfUE1DX0VYSVRfQk1QU19SRVEgZmFpbCB0byBiZSBzZW50IHRvIFBFIHN0YXR1cyAlZFxuIiksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHBtY0VudGVyRnVsbFBvd2VyU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlU21lQ29tbWFuZEVudGVyVWFwc2Q6CisgICAgICAgICAgICBpZiggQk1QUyA9PSBwTWFjLT5wbWMucG1jU3RhdGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBNYWMtPnBtYy51YXBzZFNlc3Npb25SZXF1aXJlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcG1jU2VuZE1lc3NhZ2UocE1hYywgZVdOSV9QTUNfRU5URVJfVUFQU0RfUkVRLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE1hYy0+cG1jLnBtY1N0YXRlID0gUkVRVUVTVF9TVEFSVF9VQVBTRDsKKyAgICAgICAgICAgICAgICAgICAgZlJlbW92ZUNtZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IGZhaWx1cmUgdG8gc2VuZCBtZXNzYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImVXTklfUE1DX0VOVEVSX0JNUFNfUkVRXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgLy90aGVyZSBpcyBubyByZXRyeSBmb3IgcmUtZW50ZXJpbmcgVUFQU0Qgc28gdGVsbCB0aGUgcmVxdWVzdGVyIHdlIGFyZSBkb25lIHdpdGdoIGZhaWx1cmUuCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnBtYy51YXBzZFNlc3Npb25SZXF1aXJlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBwbWNEb1N0YXJ0VWFwc2RDYWxsYmFja3MocE1hYywgZUhBTF9TVEFUVVNfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlU21lQ29tbWFuZEV4aXRVYXBzZDoKKyAgICAgICAgICAgaWYoIFVBUFNEID09IHBNYWMtPnBtYy5wbWNTdGF0ZSApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBNYWMtPnBtYy5yZXF1ZXN0RnVsbFBvd2VyUGVuZGluZyA9IEZBTFNFOworICAgICAgICAgICAgICAgIC8qIElmIGFscmVhZHkgaW4gUkVRVUVTVF9TVE9QX1VBUFNELCBzaW1wbHkgcmV0dXJuICovCisgICAgICAgICAgICAgICBpZiAocE1hYy0+cG1jLnBtY1N0YXRlID09IFJFUVVFU1RfU1RPUF9VQVBTRCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLyogVGVsbCBNQUMgdG8gaGF2ZSBkZXZpY2UgZXhpdCBVQVBTRCBtb2RlLiAqLworICAgICAgICAgICAgICAgc3RhdHVzID0gcG1jU2VuZE1lc3NhZ2UocE1hYywgZVdOSV9QTUNfRVhJVF9VQVBTRF9SRVEsIE5VTEwsIDApOworICAgICAgICAgICAgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUuIE5vdGUgdGhhdCBkZXZpY2Ugd2lsbCBiZSBwdXQgaW4gQk1QUyBzdGF0ZSBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBlbmQgb2YgUkVRVUVTVF9TVE9QX1VBUFNEIHN0YXRlIGV2ZW4gaWYgcmVzcG9uc2UgaXMgYSBmYWlsdXJlKi8KKyAgICAgICAgICAgICAgICAgICBwTWFjLT5wbWMucG1jU3RhdGUgPSBSRVFVRVNUX1NUT1BfVUFQU0Q7CisgICAgICAgICAgICAgICAgICAgcE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJQZW5kaW5nID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICBwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlclJlYXNvbiA9IHBDb21tYW5kLT51LnBtY0NtZC5mdWxsUG93ZXJSZWFzb247CisgICAgICAgICAgICAgICAgICAgZlJlbW92ZUNtZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogZmFpbHVyZSB0byBzZW5kIG1lc3NhZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICJlV05JX1BNQ19FWElUX1VBUFNEX1JFUVxuIik7CisgICAgICAgICAgICAgICAgICAgcG1jRW50ZXJCbXBzU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKworICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTbWVDb21tYW5kRW50ZXJXb3dsOgorICAgICAgICAgICAgaWYoICggQk1QUyA9PSBwTWFjLT5wbWMucG1jU3RhdGUgKSB8fCAoIFdPV0wgPT0gcE1hYy0+cG1jLnBtY1N0YXRlICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBtY1NlbmRNZXNzYWdlKHBNYWMsIGVXTklfUE1DX0VOVEVSX1dPV0xfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICZwQ29tbWFuZC0+dS5wbWNDbWQudS5lbnRlcldvd2xJbmZvLCBzaXplb2YodFNpclNtZVdvd2xFbnRlclBhcmFtcykpOworICAgICAgICAgICAgICAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwTWFjLT5wbWMucG1jU3RhdGUgPSBSRVFVRVNUX0VOVEVSX1dPV0w7CisgICAgICAgICAgICAgICAgICAgIGZSZW1vdmVDbWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBmYWlsdXJlIHRvIHNlbmQgbWVzc2FnZSBlV05JX1BNQ19FTlRFUl9XT1dMX1JFUVxuIik7CisgICAgICAgICAgICAgICAgICAgIHBtY0RvRW50ZXJXb3dsQ2FsbGJhY2tzKHBNYWMsIGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmUmVtb3ZlQ21kID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTbWVDb21tYW5kRXhpdFdvd2w6CisgICAgICAgICAgICBpZiggV09XTCA9PSBwTWFjLT5wbWMucG1jU3RhdGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBNYWMtPnBtYy5yZXF1ZXN0RnVsbFBvd2VyUGVuZGluZyA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IFJFUVVFU1RfRVhJVF9XT1dMOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBtY1NlbmRNZXNzYWdlKHBNYWMsIGVXTklfUE1DX0VYSVRfV09XTF9SRVEsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmUmVtb3ZlQ21kID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlclBlbmRpbmcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlclJlYXNvbiA9IHBDb21tYW5kLT51LnBtY0NtZC5mdWxsUG93ZXJSZWFzb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dQLCAiUE1DOiBmYWlsdXJlIHRvIHNlbmQgbWVzc2FnZSBlV05JX1BNQ19FWElUX1dPV0xfUkVRXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcG1jRW50ZXJCbXBzU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlU21lQ29tbWFuZEVudGVyU3RhbmRieToKKyAgICAgICAgICAgIGlmKCBGVUxMX1BPV0VSID09IHBNYWMtPnBtYy5wbWNTdGF0ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvL0Rpc2FsbG93IHN0YW5kYnkgaWYgY29uY3VycmVudCBzZXNzaW9ucyBhcmUgcHJlc2VudC4gTm90ZSB0aGF0IENTUiB3b3VsZCBoYXZlCisgICAgICAgICAgICAgICAvL2NhdXNlZCB0aGUgU1RBIHRvIGRpc2Nvbm5lY3QgdGhlIEluZnJhIHNlc3Npb24gKGlmIG5vdCBhbHJlYWR5IGRpc2Nvbm5lY3RlZCkgYmVjYXVzZSBvZiAKKyAgICAgICAgICAgICAgIC8vc3RhbmRieSByZXF1ZXN0LiBCdXQgd2UgYXJlIG5vdyBmYWlsaW5nIHRoZSBzdGFuZGJ5IHJlcXVlc3QgYmVjYXVzZSBvZiBjb25jdXJyZW50IHNlc3Npb24uCisgICAgICAgICAgICAgICAvL1NvIHdhcyB0aGUgdGVhcmluZyBvZiBpbmZyYSBzZXNzaW9uIHdhc3RlZnVsIGlmIHdlIHdlcmUgZ29pbmcgdG8gZmFpbCB0aGUgc3RhbmRieSByZXF1ZXN0ID8gCisgICAgICAgICAgICAgICAvL05vdCByZWFsbHkuIFRoaXMgaXMgYmVhY3VzZSBpZiBhbmQgd2hlbiBCVC1BTVAgZXRjIHNlc3Npb25zIGFyZSB0b3JuIGRvd24gd2Ugd2lsbCB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAvL3RvIElNUFMvc3RhbmRieSBhbmQgc3RpbGwgc2F2ZSBwb3dlci4KKyAgICAgICAgICAgICAgIGlmIChjc3JJc0lCU1NTdGFydGVkKHBNYWMpIHx8IGNzcklzQlRBTVBTdGFydGVkKHBNYWMpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIAorICAgICAgICAgICAgICAgICAgICAgICJXTEFOOiBJQlNTIG9yIEJULUFNUCBzZXNzaW9uIHByZXNlbnQuIENhbm5vdCBob25vciBzdGFuZGJ5IHJlcXVlc3QiKTsKKworICAgICAgICAgICAgICAgICAgcG1jRG9TdGFuZGJ5Q2FsbGJhY2tzKHBNYWMsIGVIQUxfU1RBVFVTX1BNQ19OT1RfTk9XKTsKKyAgICAgICAgICAgICAgICAgIGlmKHBtY1Nob3VsZEJtcHNUaW1lclJ1bihwTWFjKSkKKyAgICAgICAgICAgICAgICAgICAgICAodm9pZClwbWNTdGFydFRyYWZmaWNUaW1lcihwTWFjLCBwTWFjLT5wbWMuYm1wc0NvbmZpZy50cmFmZmljTWVhc3VyZVBlcmlvZCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAKKyAgICAgICAgICAgICAgICAvLyBTdG9wIHRyYWZmaWMgdGltZXIuIEp1c3QgbWFraW5nIHN1cmUgdGltZXIgaXMgbm90IHJ1bm5pbmcKKyAgICAgICAgICAgICAgICBwbWNTdG9wVHJhZmZpY1RpbWVyKHBNYWMpOworCisgICAgICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlLiAqLworICAgICAgICAgICAgICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IFJFUVVFU1RfU1RBTkRCWTsKKworICAgICAgICAgICAgICAgIC8qIFRlbGwgTUFDIHRvIGhhdmUgZGV2aWNlIGVudGVyIFNUQU5EQlkgbW9kZS4gV2UgYXJlIHVzaW5nIHRoZSBzYW1lIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgIGFzIElNUFMgbW9kZSB0byBhdm9pZCBjb2RlIGNoYW5nZXMgaW4gbGF5ZXIgYmVsb3cgKFBFL0hBTCkqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBtY1NlbmRNZXNzYWdlKHBNYWMsIGVXTklfUE1DX0VOVEVSX0lNUFNfUkVRLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9EaXNhYmxlIElkbGUgc2NhbiBpbiBDU1IKKyAgICAgICAgICAgICAgICAgICAgY3NyU2NhblN1c3BlbmRJTVBTKHBNYWMpOworICAgICAgICAgICAgICAgICAgICBmUmVtb3ZlQ21kID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogZmFpbHVyZSB0byBzZW5kIG1lc3NhZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgImVXTklfUE1DX0VOVEVSX0lNUFNfUkVRXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcG1jRW50ZXJGdWxsUG93ZXJTdGF0ZShwTWFjKTsKKyAgICAgICAgICAgICAgICAgICAgcG1jRG9TdGFuZGJ5Q2FsbGJhY2tzKHBNYWMsIGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCB0aGUgdGltZXIgb25seSBpZiBBdXRvIEJNUFMgZmVhdHVyZSBpcyBlbmFibGVkIG9yIGFuIFVBUFNEIHNlc3Npb24gaXMKKyAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkICovCisgICAgICAgICAgICAgICAgICAgIGlmKHBtY1Nob3VsZEJtcHNUaW1lclJ1bihwTWFjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXBtY1N0YXJ0VHJhZmZpY1RpbWVyKHBNYWMsIHBNYWMtPnBtYy5ibXBzQ29uZmlnLnRyYWZmaWNNZWFzdXJlUGVyaW9kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiICBpbnZhbGlkIGNvbW1hbmQgdHlwZSAlZFxuIiksIHBDb21tYW5kLT5jb21tYW5kICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSggMCApOworCisgICAgcmV0dXJuKCBmUmVtb3ZlQ21kICk7Cit9CisKK2VIYWxTdGF0dXMgcG1jRW50ZXJJbXBzQ2hlY2soIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworCisgICAgaWYoICFQTUNfSVNfUkVBRFkocE1hYykgKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJSZXF1ZXN0aW5nIElNUFMgd2hlbiBQTUMgbm90IHJlYWR5XG4iKSk7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgicG1jUmVhZHkgPSAlZCBwbWNTdGF0ZSA9ICVzXG4iKSwgCisgICAgICAgICAgICBwTWFjLT5wbWMucG1jUmVhZHksIHBtY0dldFBtY1N0YXRlU3RyKHBNYWMtPnBtYy5wbWNTdGF0ZSkpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBJTVBTIGlzIGVuYWJsZWQuICovCisgICAgaWYgKCFwTWFjLT5wbWMuaW1wc0VuYWJsZWQpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIklNUFMgaXMgZGlzYWJsZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1BNQ19ESVNBQkxFRDsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBJTVBTIGVuYWJsZWQgZm9yIGN1cnJlbnQgcG93ZXIgc291cmNlLiAqLworICAgIGlmICgocE1hYy0+cG1jLnBvd2VyU291cmNlID09IEFDX1BPV0VSKSAmJiAhcE1hYy0+cG1jLmltcHNDb25maWcuZW50ZXJPbkFjKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJJTVBTIGlzIGRpc2FibGVkIHdoZW4gb3BlcmF0aW5nIG9uIEFDIHBvd2VyXG4iKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19QTUNfQUNfUE9XRVI7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhhdCBlbnRyeSBpbnRvIGEgcG93ZXIgc2F2ZSBtb2RlIGlzIGFsbG93ZWQgYXQgdGhpcyB0aW1lLiAqLworICAgIGlmICghcG1jUG93ZXJTYXZlQ2hlY2socE1hYykpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIklNUFMgY2Fubm90IGJlIGVudGVyZWQgbm93XG4iKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19QTUNfTk9UX05PVzsKKyAgICB9CisKKyAgICAvKiBDaGVjayB0aGF0IGVudHJ5IGludG8gYSBwb3dlciBzYXZlIG1vZGUgaXMgYWxsb3dlZCBhdCB0aGlzIHRpbWUgaWYgYWxsCisgICAgICAgcnVubmluZyBzZXNzaW9ucyBhZ3JlZS4gKi8KKyAgICBpZiAoIXBtY0FsbG93SW1wcyhwTWFjKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiSU1QUyBjYW5ub3QgYmUgZW50ZXJlZCBub3dcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1BNQ19OT1RfTk9XOworICAgIH0KKyAgICAKKyAgICAvKiBDaGVjayBpZiBhbHJlYWR5IGluIElNUFMuICovCisgICAgaWYgKChwTWFjLT5wbWMucG1jU3RhdGUgPT0gUkVRVUVTVF9JTVBTKSB8fCAocE1hYy0+cG1jLnBtY1N0YXRlID09IElNUFMpIHx8CisgICAgICAgIChwTWFjLT5wbWMucG1jU3RhdGUgPT0gUkVRVUVTVF9GVUxMX1BPV0VSKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiQWxyZWFkeSBpbiBJTVBTXG4iKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19QTUNfQUxSRUFEWV9JTl9JTVBTOworICAgIH0KKworICAgIHJldHVybiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKworLyogVGhpcyBBUEkgZGV0cm1pbmVzIGlmIGl0IGlzIG9rIHRvIHByb2NlZWQgd2l0aCBhIEVudGVyIEJNUFMgUmVxdWVzdCBvciBub3QgLiBOb3RlIHdoZW4KKyAgIGRldmljZSBpcyBpbiBCTVBTL1VBUFNEIHN0YXRlcywgdGhpcyBBUEkgcmV0dXJucyBmYWlsdXJlIGJlY2F1c2UgaXQgaXMgbm90IG9rIHRvIGlzc3VlCisgICBhIEJNUFMgcmVxdWVzdCAqLworZUhhbFN0YXR1cyBwbWNFbnRlckJtcHNDaGVjayggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisKKyAgIC8qIENoZWNrIGlmIEJNUFMgaXMgZW5hYmxlZC4gKi8KKyAgIGlmICghcE1hYy0+cG1jLmJtcHNFbmFibGVkKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IENhbm5vdCBpbml0aWF0ZSBCTVBTLiBCTVBTIGlzIGRpc2FibGVkXG4iKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19QTUNfRElTQUJMRUQ7CisgICB9CisKKyAgIGlmKCAhUE1DX0lTX1JFQURZKHBNYWMpICkKKyAgIHsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlJlcXVlc3RpbmcgQk1QUyB3aGVuIFBNQyBub3QgcmVhZHlcbiIpKTsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoInBtY1JlYWR5ID0gJWQgcG1jU3RhdGUgPSAlc1xuIiksIAorICAgICAgICAgICBwTWFjLT5wbWMucG1jUmVhZHksIHBtY0dldFBtY1N0YXRlU3RyKHBNYWMtPnBtYy5wbWNTdGF0ZSkpOworICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICAvKiBDaGVjayB0aGF0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgYWN0aXZlIHNlc3Npb24uICovCisgICBpZiAoIXBtY1ZhbGlkYXRlQ29ubmVjdFN0YXRlKCBwTWFjICkpCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogU1RBIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gQVAgd2l0aCBzaW5nbGUgYWN0aXZlIHNlc3Npb24uIEJNUFMgY2Fubm90IGJlIGVudGVyZWRcbiIpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIEJNUFMgY2FuIG9ubHkgYmUgcmVxdWVzdGVkIHdoZW4gZGV2aWNlIGlzIGluIEZ1bGwgUG93ZXIgKi8KKyAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgIT0gRlVMTF9QT1dFUikKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBEZXZpY2Ugbm90IGluIGZ1bGwgcG93ZXIuIENhbm5vdCByZXF1ZXN0IEJNUFMuIHBtY1N0YXRlICVkXG4iLCBwTWFjLT5wbWMucG1jU3RhdGUpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICAvKiBDaGVjayB0aGF0IGVudHJ5IGludG8gYSBwb3dlciBzYXZlIG1vZGUgaXMgYWxsb3dlZCBhdCB0aGlzIHRpbWUuICovCisgICBpZiAoIXBtY1Bvd2VyU2F2ZUNoZWNrKHBNYWMpKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IFBvd2VyIHNhdmUgY2hlY2sgZmFpbGVkLiBCTVBTIGNhbm5vdCBiZSBlbnRlcmVkIG5vd1xuIik7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfUE1DX05PVF9OT1c7CisgICB9CisKKyAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgiY29uY3VycmVuY3kgZW5hYmxlZCAldVxuIiksIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY29uY3VycmVuY3lFbmFibGVkKTsKKyAgIGlmIChwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNvbmN1cnJlbmN5RW5hYmxlZCkKKyAgIHsKKyAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uY29uY3VycmVuY3lFbmFibGVkID0gMDsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgicmVzZXQgY29uY3VycmVuY3kgdG8gZGlzYWJsZWQgJXVcbiIpLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmNvbmN1cnJlbmN5RW5hYmxlZCk7CisgICAgICBjc3JEaXNjb25uZWN0QWxsQWN0aXZlU2Vzc2lvbnMocE1hYyk7CisgICB9CisgICByZXR1cm4gKCBlSEFMX1NUQVRVU19TVUNDRVNTICk7Cit9CisKK3RBTklfQk9PTEVBTiBwbWNTaG91bGRCbXBzVGltZXJSdW4oIHRwQW5pU2lyR2xvYmFsIHBNYWMgKQoreworICAgIC8qIENoZWNrIGlmIEJNUFMgaXMgZW5hYmxlZCBhbmQgaWYgQXV0byBCTVBTIEZlYXR1cmUgaXMgc3RpbGwgZW5hYmxlZCAKKyAgICAgKiBvciB0aGVyZSBpcyBhIHBlbmRpbmcgVWFwc2QgcmVxdWVzdCBvciBIREQgcmVxdWVzdGVkIEJNUFMgb3IgdGhlcmUKKyAgICAgKiBpcyBhIHBlbmRpbmcgcmVxdWVzdCBmb3IgV29XTC4gSW4gYWxsIHRoZXNlIGNhc2VzIEJNUFMgaXMgcmVxdWlyZWQuIAorICAgICAqIE90aGVyd2lzZSBqdXN0IHN0b3AgdGhlIHRpbWVyIGFuZCByZXR1cm4uCisgICAgICovCisgICAgaWYgKCEocE1hYy0+cG1jLmJtcHNFbmFibGVkICYmIChwTWFjLT5wbWMuYXV0b0JtcHNFbnRyeUVuYWJsZWQgfHwgCisgICAgICAgICAgcE1hYy0+cG1jLnVhcHNkU2Vzc2lvblJlcXVpcmVkIHx8IHBNYWMtPnBtYy5ibXBzUmVxdWVzdGVkQnlIZGQgfHwKKyAgICAgICAgICBwTWFjLT5wbWMud293bE1vZGVSZXF1aXJlZCApKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgiQk1QUyBpcyBub3QgZW5hYmxlZCBvciBub3QgcmVxdWlyZWQiKSk7CisgICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gSW5mcmEgc2Vzc2lvbi4gQk1QUyBpcyBwb3NzaWJsZSBvbmx5IGlmIHRoZXJlIGlzIAorICAgICAqIGFuIEluZnJhIHNlc3Npb24gKi8KKyAgICBpZiAoIWNzcklzSW5mcmFDb25uZWN0ZWQocE1hYykpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HMSwgRkwoIk5vIEluZnJhIFNlc3Npb24gb3IgbXVsdGlwbGUgc2Vzc2lvbnMuIEJNUFMgc2hvdWxkIG5vdCBiZSBzdGFydGVkIikpOworICAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIH0KKyAgICByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUU7Cit9CisKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgCisKKyNkZWZpbmUgUE1DX0RJQUdfRVZUX1RJTUVSX0lOVEVSVkFMICggNTAwMCApCisKK3ZvaWQgcG1jRGlhZ0V2dFRpbWVyRXhwaXJlZCAodEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX0RFRihwc1JlcXVlc3QsIHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpOworCisgICAgdm9zX21lbV96ZXJvKCZwc1JlcXVlc3QsIHNpemVvZih2b3NfZXZlbnRfd2xhbl9wb3dlcnNhdmVfcGF5bG9hZF90eXBlKSk7CisgICAgcHNSZXF1ZXN0LmV2ZW50X3N1YnR5cGUgPSBXTEFOX1BNQ19DVVJSRU5UX1NUQVRFOworICAgIHBzUmVxdWVzdC5wbWNfY3VycmVudF9zdGF0ZSA9IHBNYWMtPnBtYy5wbWNTdGF0ZTsKKworICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZwc1JlcXVlc3QsIEVWRU5UX1dMQU5fUE9XRVJTQVZFX0dFTkVSSUMpOworCisgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJESUFHIGV2ZW50IHRpbWVyIGV4cGlyZWRcbiIpKTsKKworICAgIC8qIHJlLWFybSB0aW1lciAqLworICAgIGlmIChwbWNTdGFydERpYWdFdnRUaW1lcihoSGFsKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1AsIEZMKCJDYW5ub3QgcmUtYXJtIERJQUcgZXZ0IHRpbWVyXG4iKSk7CisgICAgfQorfQorCitlSGFsU3RhdHVzIHBtY1N0YXJ0RGlhZ0V2dFRpbWVyICh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNTdGFydERpYWdFdnRUaW1lclxuIikpOworCisgICAgaWYgKHBhbFRpbWVyU3RhcnQocE1hYy0+aEhkZCwgcE1hYy0+cG1jLmhEaWFnRXZ0VGltZXIsIFBNQ19ESUFHX0VWVF9USU1FUl9JTlRFUlZBTCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAsIFRSVUUpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgIHNtc0xvZyhwTWFjLCBMT0dQLCBGTCgiQ2Fubm90IHN0YXJ0IERJQUcgZXZ0IHRpbWVyXG4iKSk7CisgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgcG1jU3RvcERpYWdFdnRUaW1lciAodEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY1N0b3BEaWFnRXZ0VGltZXJcbiIpKTsKKyAgICAodm9pZClwYWxUaW1lclN0b3AocE1hYy0+aEhkZCwgcE1hYy0+cG1jLmhEaWFnRXZ0VGltZXIpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9zcmMvcG1jL3BtY0FwaS5jIGIvQ09SRS9TTUUvc3JjL3BtYy9wbWNBcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzRhNzNlCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvc3JjL3BtYy9wbWNBcGkuYwpAQCAtMCwwICsxLDMxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNBcGkuYworKgorKiBEZXNjcmlwdGlvbjogUm91dGluZXMgdGhhdCBtYWtlIHVwIHRoZSBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgKFBNQykgQVBJLgorKgorKiBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIAorKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJwYWxUaW1lci5oIgorI2luY2x1ZGUgImNzckxpbmtMaXN0LmgiCisjaW5jbHVkZSAic21zRGVidWcuaCIKKyNpbmNsdWRlICJwbWNBcGkuaCIKKyNpbmNsdWRlICJwbWMuaCIKKyNpbmNsdWRlICJjZmdBcGkuaCIKKyNpbmNsdWRlICJzbWVJbnNpZGUuaCIKKyNpbmNsdWRlICJjc3JJbnNpZGVBcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3BzX3dvd19kaWFnLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisjaW5jbHVkZSAibGltU2Vzc2lvblV0aWxzLmgiCisjaW5jbHVkZSAiY3NySW5zaWRlQXBpLmgiCisKK2V4dGVybiB2b2lkIHBtY1JlbGVhc2VDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCApOworCit2b2lkIHBtY0Nsb3NlRGVmZXJyZWRNc2dMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBwbWNDbG9zZURldmljZVN0YXRlVXBkYXRlTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK3ZvaWQgcG1jQ2xvc2VSZXF1ZXN0U3RhcnRVYXBzZExpc3QodHBBbmlTaXJHbG9iYWwgcE1hYyk7Cit2b2lkIHBtY0Nsb3NlUmVxdWVzdEJtcHNMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBwbWNDbG9zZVJlcXVlc3RGdWxsUG93ZXJMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOwordm9pZCBwbWNDbG9zZVBvd2VyU2F2ZUNoZWNrTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jT3BlbgorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgRG9lcyBhIFBNQyBvcGVuIG9wZXJhdGlvbiBvbiB0aGUgZGV2aWNlLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBvcGVuIHN1Y2Nlc3NmdWwKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIG9wZW4gbm90IHN1Y2Nlc3NmdWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jT3BlbiAodEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiRW50ZXJpbmcgcG1jT3BlblxuIikpOworCisgICAgLyogSW5pdGlhbGl6ZSBiYXNpYyBQTUMgaW5mb3JtYXRpb24gYWJvdXQgZGV2aWNlLiAqLworICAgIHBNYWMtPnBtYy5wb3dlclNvdXJjZSA9IEJBVFRFUllfUE9XRVI7CisgICAgcE1hYy0+cG1jLnBtY1N0YXRlID0gU1RPUFBFRDsKKyAgICBwTWFjLT5wbWMucG1jUmVhZHkgPSBGQUxTRTsKKworICAgIC8qIEluaXRpYWxpemUgUG93ZXIgU2F2ZSBNb2RlcyAqLworICAgIHBNYWMtPnBtYy5pbXBzRW5hYmxlZCA9IEZBTFNFOworICAgIHBNYWMtPnBtYy5hdXRvQm1wc0VudHJ5RW5hYmxlZCA9IEZBTFNFOworICAgIHBNYWMtPnBtYy5zbXBzRW5hYmxlZCA9IEZBTFNFOworICAgIHBNYWMtPnBtYy51YXBzZEVuYWJsZWQgPSBUUlVFOworICAgIHBNYWMtPnBtYy5ibXBzRW5hYmxlZCA9IFRSVUU7CisgICAgcE1hYy0+cG1jLnN0YW5kYnlFbmFibGVkID0gVFJVRTsKKyAgICBwTWFjLT5wbWMud293bEVuYWJsZWQgPSBUUlVFOworICAgIHBNYWMtPnBtYy5yZlN1cHBsaWVzVm90ZWRPZmY9IEZBTFNFOworCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmKHBNYWMtPnBtYy5ibXBzQ29uZmlnKSwgc2l6ZW9mKHRQbWNCbXBzQ29uZmlnUGFyYW1zKSk7CisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmKHBNYWMtPnBtYy5pbXBzQ29uZmlnKSwgc2l6ZW9mKHRQbWNJbXBzQ29uZmlnUGFyYW1zKSk7CisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmKHBNYWMtPnBtYy5zbXBzQ29uZmlnKSwgc2l6ZW9mKHRQbWNTbXBzQ29uZmlnUGFyYW1zKSk7CisKKyAgICAvKiBBbGxvY2F0ZSBhIHRpbWVyIHRvIHVzZSB3aXRoIElNUFMuICovCisgICAgaWYgKHBhbFRpbWVyQWxsb2MocE1hYy0+aEhkZCwgJnBNYWMtPnBtYy5oSW1wc1RpbWVyLCBwbWNJbXBzVGltZXJFeHBpcmVkLCBoSGFsKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgYWxsb2NhdGUgdGltZXIgZm9yIElNUFNcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYSB0aW1lciB1c2VkIGluIEZ1bGwgUG93ZXIgU3RhdGUgdG8gbWVhc3VyZSB0cmFmZmljCisgICAgICAgbGV2ZWxzIGFuZCBkZXRlcm1pbmUgd2hlbiB0byBlbnRlciBCTVBTLiAqLworICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc190aW1lcl9pbml0KCZwTWFjLT5wbWMuaFRyYWZmaWNUaW1lciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19USU1FUl9UWVBFX1NXLCBwbWNUcmFmZmljVGltZXJFeHBpcmVkLCBoSGFsKSkpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBhbGxvY2F0ZSB0aW1lciBmb3IgdHJhZmZpYyBtZWFzdXJlbWVudFxuIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICAgIAorICAgIC8qIEFsbG9jYXRlIGEgdGltZXIgdXNlZCB0byByZXBvcnQgY3VycmVudCBQTUMgc3RhdGUgdGhyb3VnaCBwZXJpb2RpYyBESUFHIGV2ZW50ICovCisgICAgaWYgKHBhbFRpbWVyQWxsb2MocE1hYy0+aEhkZCwgJnBNYWMtPnBtYy5oRGlhZ0V2dFRpbWVyLCBwbWNEaWFnRXZ0VGltZXJFeHBpcmVkLCBoSGFsKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgYWxsb2NhdGUgdGltZXIgZm9yIGRpYWcgZXZlbnQgcmVwb3J0aW5nXG4iKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKyNlbmRpZgorCisgICAgLy9Jbml0aWFsaXplIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBCbXBzIHJlbGF0ZWQgY29uZmlnLiAKKyAgICBwTWFjLT5wbWMuYm1wc0NvbmZpZy50cmFmZmljTWVhc3VyZVBlcmlvZCA9IEJNUFNfVFJBRkZJQ19USU1FUl9ERUZBVUxUOworICAgIHBNYWMtPnBtYy5ibXBzQ29uZmlnLmJtcHNQZXJpb2QgPSBXTklfQ0ZHX0xJU1RFTl9JTlRFUlZBTF9TVEFERUY7CisKKyAgICAvKiBBbGxvY2F0ZSBhIHRpbWVyIHVzZWQgdG8gc2NoZWR1bGUgYSBkZWZlcnJlZCBwb3dlciBzYXZlIG1vZGUgZXhpdC4gKi8KKyAgICBpZiAocGFsVGltZXJBbGxvYyhwTWFjLT5oSGRkLCAmcE1hYy0+cG1jLmhFeGl0UG93ZXJTYXZlVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgcG1jRXhpdFBvd2VyU2F2ZVRpbWVyRXhwaXJlZCwgaEhhbCkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGFsbG9jYXRlIGV4aXQgcG93ZXIgc2F2ZSBtb2RlIHRpbWVyXG4iKSk7CisgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorICAgIAorICAgIC8qIEluaXRpYWxpemUgbGlzdHMgZm9yIHBvd2VyIHNhdmUgY2hlY2sgcm91dGluZXMgYW5kIHJlcXVlc3QgZnVsbCBwb3dlciBjYWxsYmFjayByb3V0aW5lcy4gKi8KKyAgICBpZiAoY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5wbWMucG93ZXJTYXZlQ2hlY2tMaXN0KSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgaW5pdGlhbGl6ZSBwb3dlciBzYXZlIGNoZWNrIHJvdXRpbmUgbGlzdFxuIikpOworICAgICAgICBQTUNfQUJPUlQ7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKyAgICBpZiAoY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlckxpc3QpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBpbml0aWFsaXplIHJlcXVlc3QgZnVsbCBwb3dlciBjYWxsYmFjayByb3V0aW5lIGxpc3RcbiIpKTsKKyAgICAgICAgUE1DX0FCT1JUOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGxpc3RzIGZvciByZXF1ZXN0IEJNUFMgY2FsbGJhY2sgcm91dGluZXMuICovCisgICAgaWYgKGNzckxMT3BlbihwTWFjLT5oSGRkLCAmcE1hYy0+cG1jLnJlcXVlc3RCbXBzTGlzdCkgIT0KKyAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogY2Fubm90IGluaXRpYWxpemUgcmVxdWVzdCBCTVBTIGNhbGxiYWNrIHJvdXRpbmUgbGlzdFxuIik7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgbGlzdHMgZm9yIHJlcXVlc3Qgc3RhcnQgVUFQU0QgY2FsbGJhY2sgcm91dGluZXMuICovCisgICAgaWYgKGNzckxMT3BlbihwTWFjLT5oSGRkLCAmcE1hYy0+cG1jLnJlcXVlc3RTdGFydFVhcHNkTGlzdCkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBjYW5ub3QgaW5pdGlhbGl6ZSByZXF1ZXN0IHN0YXJ0IFVBUFNEIGNhbGxiYWNrIHJvdXRpbmUgbGlzdFxuIik7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgbGlzdHMgZm9yIGRldmljZSBzdGF0ZSB1cGRhdGUgaW5kaWNhdGlvbiBjYWxsYmFjayByb3V0aW5lcy4gKi8KKyAgICBpZiAoY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5wbWMuZGV2aWNlU3RhdGVVcGRhdGVJbmRMaXN0KSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IGNhbm5vdCBpbml0aWFsaXplIGRldmljZSBzdGF0ZSB1cGRhdGUgaW5kaWNhdGlvbiBjYWxsYmFjayBsaXN0XG4iKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKGNzckxMT3BlbihwTWFjLT5oSGRkLCAmcE1hYy0+cG1jLmRlZmVycmVkTXNnTGlzdCkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGluaXRpYWxpemUgZGVmZXJyZWQgbXNnIGxpc3RcbiIpKTsKKyAgICAgICAgUE1DX0FCT1JUOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNTdGFydAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgRG9lcyBhIFBNQyBzdGFydCBvcGVyYXRpb24gb24gdGhlIGRldmljZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gc3RhcnQgc3VjY2Vzc2Z1bAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gc3RhcnQgbm90IHN1Y2Nlc3NmdWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jU3RhcnQgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlICBodE1pbW9Qb3dlclNhdmVTdGF0ZTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiRW50ZXJpbmcgcG1jU3RhcnRcbiIpKTsKKworICAgIC8qIEluaXRpYWxpemUgYmFzaWMgUE1DIGluZm9ybWF0aW9uIGFib3V0IGRldmljZS4gKi8KKyAgICBwTWFjLT5wbWMucG1jU3RhdGUgPSBGVUxMX1BPV0VSOworICAgIHBNYWMtPnBtYy5yZXF1ZXN0RnVsbFBvd2VyUGVuZGluZyA9IEZBTFNFOworICAgIHBNYWMtPnBtYy51YXBzZFNlc3Npb25SZXF1aXJlZCA9IEZBTFNFOworICAgIHBNYWMtPnBtYy53b3dsTW9kZVJlcXVpcmVkID0gRkFMU0U7CisgICAgcE1hYy0+cG1jLmJtcHNSZXF1ZXN0ZWRCeUhkZCA9IEZBTFNFOworICAgIHBNYWMtPnBtYy5yZW1haW5JblBvd2VyQWN0aXZlVGlsbERIQ1AgPSBGQUxTRTsKKyAgICBwTWFjLT5wbWMucmVtYWluSW5Qb3dlckFjdGl2ZVRocmVzaG9sZCA9IDA7CisKKyAgICAvKiBXTEFOIFN3aXRjaCBpbml0aWFsIHN0YXRlcy4gKi8KKyAgICBwTWFjLT5wbWMuaHdXbGFuU3dpdGNoU3RhdGUgPSBlUE1DX1NXSVRDSF9PTjsKKyAgICBwTWFjLT5wbWMuc3dXbGFuU3dpdGNoU3RhdGUgPSBlUE1DX1NXSVRDSF9PTjsKKworICAgIC8qIE5vIElNUFMgY2FsbGJhY2sgcm91dGluZSB5ZXQuICovCisgICAgcE1hYy0+cG1jLmltcHNDYWxsYmFja1JvdXRpbmUgPSBOVUxMOworCisgICAgLyogTm8gU1RBTkRCWSBjYWxsYmFjayByb3V0aW5lIHlldC4gKi8KKyAgICBwTWFjLT5wbWMuc3RhbmRieUNhbGxiYWNrUm91dGluZSA9IE5VTEw7CisKKyAgICAvKiBObyBXT1dMIGNhbGxiYWNrIHJvdXRpbmUgeWV0LiAqLworICAgIHBNYWMtPnBtYy5lbnRlcldvd2xDYWxsYmFja1JvdXRpbmUgPSBOVUxMOworCisgICAgLyogSW5pdGlhbGl6ZSBCTVBTIHRyYWZmaWMgY291bnRzLiAqLworICAgIHBNYWMtPnBtYy5jTGFzdFR4VW5pY2FzdEZyYW1lcyA9IDA7CisgICAgcE1hYy0+cG1jLmNMYXN0UnhVbmljYXN0RnJhbWVzID0gMDsKKworICAgIC8qIENvbmZpZ3VyZSBTTVBTLiAqLworICAgIGlmIChwTWFjLT5wbWMuc21wc0VuYWJsZWQgJiYgKHBNYWMtPnBtYy5wb3dlclNvdXJjZSAhPSBBQ19QT1dFUiB8fCBwTWFjLT5wbWMuc21wc0NvbmZpZy5lbnRlck9uQWMpKQorICAgIHsKKyAgICAgICAgaWYgKHBNYWMtPnBtYy5zbXBzQ29uZmlnLm1vZGUgPT0gZVBNQ19EWU5BTUlDX1NNUFMpCisgICAgICAgICAgICBodE1pbW9Qb3dlclNhdmVTdGF0ZSA9IGVTSVJfSFRfTUlNT19QU19EWU5BTUlDOworICAgICAgICBpZiAocE1hYy0+cG1jLnNtcHNDb25maWcubW9kZSA9PSBlUE1DX1NUQVRJQ19TTVBTKQorICAgICAgICAgICAgaHRNaW1vUG93ZXJTYXZlU3RhdGUgPSBlU0lSX0hUX01JTU9fUFNfU1RBVElDOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGh0TWltb1Bvd2VyU2F2ZVN0YXRlID0gZVNJUl9IVF9NSU1PX1BTX05PX0xJTUlUOworICAgIAorICAgIGlmIChwbWNTZW5kTWVzc2FnZShoSGFsLCBlV05JX1BNQ19TTVBTX1NUQVRFX0lORCwgJmh0TWltb1Bvd2VyU2F2ZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlKSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUIAorICAgIGlmIChwbWNTdGFydERpYWdFdnRUaW1lcihoSGFsKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQU5JX0xPR0RVTVApCisgICAgcG1jRHVtcEluaXQoaEhhbCk7CisjZW5kaWYKKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY1N0b3AKKyoKKyogRGVzY3JpcHRpb246CisqICAgIERvZXMgYSBQTUMgc3RvcCBvcGVyYXRpb24gb24gdGhlIGRldmljZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gc3RvcCBzdWNjZXNzZnVsCisqICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBzdG9wIG5vdCBzdWNjZXNzZnVsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlSGFsU3RhdHVzIHBtY1N0b3AgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdFBtY0RlZmVycmVkTXNnICpwRGVmZXJyZWRNc2c7CisKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY1N0b3BcbiIpKTsKKworICAgIC8qIENhbmNlbCBhbnkgcnVubmluZyB0aW1lcnMuICovCisgICAgaWYgKHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwTWFjLT5wbWMuaEltcHNUaW1lcikgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGNhbmNlbCBJTVBTIHRpbWVyXG4iKSk7CisgICAgfQorCisgICAgcG1jU3RvcFRyYWZmaWNUaW1lcihoSGFsKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICAgcG1jU3RvcERpYWdFdnRUaW1lcihoSGFsKTsKKyNlbmRpZgorCisgICAgaWYgKHBhbFRpbWVyU3RvcChwTWFjLT5oSGRkLCBwTWFjLT5wbWMuaEV4aXRQb3dlclNhdmVUaW1lcikgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGNhbmNlbCBleGl0IHBvd2VyIHNhdmUgbW9kZSB0aW1lclxuIikpOworICAgIH0KKworICAgIC8qIERvIGFsbCB0aGUgY2FsbGJhY2tzLiAqLworICAgIHBtY0RvQ2FsbGJhY2tzKGhIYWwsIGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgIHBtY0RvQm1wc0NhbGxiYWNrcyhoSGFsLCBlSEFMX1NUQVRVU19GQUlMVVJFKTsKKyAgICBwTWFjLT5wbWMudWFwc2RTZXNzaW9uUmVxdWlyZWQgPSBGQUxTRTsKKyAgICBwbWNEb1N0YXJ0VWFwc2RDYWxsYmFja3MoaEhhbCwgZUhBTF9TVEFUVVNfRkFJTFVSRSk7CisgICAgcG1jRG9TdGFuZGJ5Q2FsbGJhY2tzKGhIYWwsIGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworCisgICAgLy9wdXJnZSB0aGUgZGVmZXJyZWQgbXNnIGxpc3QKKyAgICBjc3JMTExvY2soICZwTWFjLT5wbWMuZGVmZXJyZWRNc2dMaXN0ICk7CisgICAgd2hpbGUoIE5VTEwgIT0gKCBwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoICZwTWFjLT5wbWMuZGVmZXJyZWRNc2dMaXN0LCBlQU5JX0JPT0xFQU5fRkFMU0UgKSApICkKKyAgICB7CisgICAgICAgIHBEZWZlcnJlZE1zZyA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFBtY0RlZmVycmVkTXNnLCBsaW5rICk7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoIHBNYWMtPmhIZGQsIHBEZWZlcnJlZE1zZyApOworICAgIH0KKyAgICBjc3JMTFVubG9jayggJnBNYWMtPnBtYy5kZWZlcnJlZE1zZ0xpc3QgKTsKKworICAgIC8qIFBNQyBpcyBzdG9wcGVkLiAqLworICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IFNUT1BQRUQ7CisgICAgcE1hYy0+cG1jLnBtY1JlYWR5ID0gRkFMU0U7CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNDbG9zZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgRG9lcyBhIFBNQyBjbG9zZSBvcGVyYXRpb24gb24gdGhlIGRldmljZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gY2xvc2Ugc3VjY2Vzc2Z1bAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gY2xvc2Ugbm90IHN1Y2Nlc3NmdWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jQ2xvc2UgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY0Nsb3NlXG4iKSk7CisKKyAgICAvKiBGcmVlIHVwIGFsbG9jYXRlZCByZXNvdXJjZXMuICovCisgICAgaWYgKHBhbFRpbWVyRnJlZShwTWFjLT5oSGRkLCBwTWFjLT5wbWMuaEltcHNUaW1lcikgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGRlYWxsb2NhdGUgSU1QUyB0aW1lclxuIikpOworICAgIH0KKyAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfdGltZXJfZGVzdHJveSgmcE1hYy0+cG1jLmhUcmFmZmljVGltZXIpKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGRlYWxsb2NhdGUgdHJhZmZpYyB0aW1lclxuIikpOworICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICAgIAorICAgIGlmIChwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcE1hYy0+cG1jLmhEaWFnRXZ0VGltZXIpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBkZWFsbG9jYXRlIHRpbWVyIGZvciBkaWFnIGV2ZW50IHJlcG9ydGluZ1xuIikpOworICAgIH0KKyNlbmRpZgorICAgIGlmIChwYWxUaW1lckZyZWUocE1hYy0+aEhkZCwgcE1hYy0+cG1jLmhFeGl0UG93ZXJTYXZlVGltZXIpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBkZWFsbG9jYXRlIGV4aXQgcG93ZXIgc2F2ZSBtb2RlIHRpbWVyXG4iKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgICAgVGhlIGZvbGxvd2luZyBsaXN0J3MgZW50cmllcyBhcmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHNvIHRoZXkgbmVlZCB0aGVpciBvd24gCisgICAgICAgIGNsZWFudXAgZnVuY3Rpb24KKyAgICAqLworICAgIHBtY0Nsb3NlUG93ZXJTYXZlQ2hlY2tMaXN0KHBNYWMpOworICAgIHBtY0Nsb3NlUmVxdWVzdEZ1bGxQb3dlckxpc3QocE1hYyk7CisgICAgcG1jQ2xvc2VSZXF1ZXN0Qm1wc0xpc3QocE1hYyk7CisgICAgcG1jQ2xvc2VSZXF1ZXN0U3RhcnRVYXBzZExpc3QocE1hYyk7CisgICAgcG1jQ2xvc2VEZXZpY2VTdGF0ZVVwZGF0ZUxpc3QocE1hYyk7CisgICAgcG1jQ2xvc2VEZWZlcnJlZE1zZ0xpc3QocE1hYyk7CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNTaWduYWxQb3dlckV2ZW50CisqCisqIERlc2NyaXB0aW9uOgorKiAgICBTaWduYWxzIHRvIFBNQyB0aGF0IGEgcG93ZXIgZXZlbnQgaGFzIG9jY3VycmVkLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIGV2ZW50IC0gdGhlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBzaWduYWxpbmcgc3VjY2Vzc2Z1bAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gc2lnbmFsaW5nIG5vdCBzdWNjZXNzZnVsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlSGFsU3RhdHVzIHBtY1NpZ25hbFBvd2VyRXZlbnQgKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyRXZlbnQgZXZlbnQpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworI2lmbmRlZiBHRU42X09OV0FSRFMKKyAgICB0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUgIGh0TWltb1Bvd2VyU2F2ZVN0YXRlOworI2VuZGlmCisKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY1NpZ25hbFBvd2VyRXZlbnQsIGV2ZW50ICVkXG4iKSwgZXZlbnQpOworCisgICAgLyogVGFrZSBhY3Rpb24gYmFzZWQgb24gdGhlIGV2ZW50IGJlaW5nIHNpZ25hbGVkLiAqLworICAgIHN3aXRjaCAoZXZlbnQpCisgICAgeworI2lmbmRlZiBHRU42X09OV0FSRFMKKyAgICBjYXNlIGVQTUNfU1lTVEVNX0hJQkVSTkFURToKKyAgICAgICAgcmV0dXJuIHBtY0VudGVyTG93UG93ZXJTdGF0ZShoSGFsKTsKKworICAgIGNhc2UgZVBNQ19TWVNURU1fUkVTVU1FOgorICAgICAgICByZXR1cm4gcG1jRXhpdExvd1Bvd2VyU3RhdGUoaEhhbCk7CisKKyAgICBjYXNlIGVQTUNfSFdfV0xBTl9TV0lUQ0hfT0ZGOgorICAgICAgICBwTWFjLT5wbWMuaHdXbGFuU3dpdGNoU3RhdGUgPSBlUE1DX1NXSVRDSF9PRkY7CisgICAgICAgIHJldHVybiBwbWNFbnRlckxvd1Bvd2VyU3RhdGUoaEhhbCk7CisKKyAgICBjYXNlIGVQTUNfSFdfV0xBTl9TV0lUQ0hfT046CisgICAgICAgIHBNYWMtPnBtYy5od1dsYW5Td2l0Y2hTdGF0ZSA9IGVQTUNfU1dJVENIX09OOworICAgICAgICByZXR1cm4gcG1jRXhpdExvd1Bvd2VyU3RhdGUoaEhhbCk7CisKKyAgICBjYXNlIGVQTUNfU1dfV0xBTl9TV0lUQ0hfT0ZGOgorICAgICAgICBwTWFjLT5wbWMuc3dXbGFuU3dpdGNoU3RhdGUgPSBlUE1DX1NXSVRDSF9PRkY7CisgICAgICAgIHJldHVybiBwbWNFbnRlckxvd1Bvd2VyU3RhdGUoaEhhbCk7CisKKyAgICBjYXNlIGVQTUNfU1dfV0xBTl9TV0lUQ0hfT046CisgICAgICAgIHBNYWMtPnBtYy5zd1dsYW5Td2l0Y2hTdGF0ZSA9IGVQTUNfU1dJVENIX09OOworICAgICAgICByZXR1cm4gcG1jRXhpdExvd1Bvd2VyU3RhdGUoaEhhbCk7CisKKyAgICBjYXNlIGVQTUNfQkFUVEVSWV9PUEVSQVRJT046CisgICAgICAgIHBNYWMtPnBtYy5wb3dlclNvdXJjZSA9IEJBVFRFUllfUE9XRVI7CisKKyAgICAgICAgLyogVHVybiBvbiBTTVBTLiAqLworICAgICAgICBpZiAocE1hYy0+cG1jLnNtcHNFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1hYy0+cG1jLnNtcHNDb25maWcubW9kZSA9PSBlUE1DX0RZTkFNSUNfU01QUykKKyAgICAgICAgICAgICAgICBodE1pbW9Qb3dlclNhdmVTdGF0ZSA9IGVTSVJfSFRfTUlNT19QU19EWU5BTUlDOworICAgICAgICAgICAgaWYgKHBNYWMtPnBtYy5zbXBzQ29uZmlnLm1vZGUgPT0gZVBNQ19TVEFUSUNfU01QUykKKyAgICAgICAgICAgICAgICBodE1pbW9Qb3dlclNhdmVTdGF0ZSA9IGVTSVJfSFRfTUlNT19QU19TVEFUSUM7CisgICAgICAgICAgICBpZiAocG1jU2VuZE1lc3NhZ2UoaEhhbCwgZVdOSV9QTUNfU01QU19TVEFURV9JTkQsICZodE1pbW9Qb3dlclNhdmVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlKSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgIGNhc2UgZVBNQ19BQ19PUEVSQVRJT046CisgICAgICAgIHBNYWMtPnBtYy5wb3dlclNvdXJjZSA9IEFDX1BPV0VSOworCisgICAgICAgIC8qIFR1cm4gb2ZmIFNNUFMuICovCisgICAgICAgIGlmICghcE1hYy0+cG1jLnNtcHNDb25maWcuZW50ZXJPbkFjKQorICAgICAgICB7CisgICAgICAgICAgICBodE1pbW9Qb3dlclNhdmVTdGF0ZSA9IGVTSVJfSFRfTUlNT19QU19OT19MSU1JVDsKKyAgICAgICAgICAgIGlmIChwbWNTZW5kTWVzc2FnZShoSGFsLCBlV05JX1BNQ19TTVBTX1NUQVRFX0lORCwgJmh0TWltb1Bvd2VyU2F2ZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworI2VuZGlmIC8vR0VONl9PTldBUkRTCisgICAgZGVmYXVsdDoKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIGV2ZW50ICVkXG4iKSwgZXZlbnQpOworICAgICAgICBQTUNfQUJPUlQ7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNTZXRDb25maWdQb3dlclNhdmUKKyoKKyogRGVzY3JpcHRpb246CisqICAgIENvbmZpZ3VyZXMgb25lIG9mIHRoZSBwb3dlciBzYXZpbmcgbW9kZXMuCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyogICAgcHNNb2RlIC0gdGhlIHBvd2VyIHNhdmluZyBtb2RlIHRvIGNvbmZpZ3VyZQorKiAgICBwQ29uZmlnUGFyYW1zIC0gcG9pbnRlciB0byBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gdGhlCisqICAgICAgICAgICAgICAgICAgICBwb3dlciBzYXZpbmcgbW9kZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gY29uZmlndXJhdGlvbiBzdWNjZXNzZnVsCisqICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBjb25maWd1cmF0aW9uIG5vdCBzdWNjZXNzZnVsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlSGFsU3RhdHVzIHBtY1NldENvbmZpZ1Bvd2VyU2F2ZSAodEhhbEhhbmRsZSBoSGFsLCB0UG1jUG93ZXJTYXZpbmdNb2RlIHBzTW9kZSwgdm9pZCAqcENvbmZpZ1BhcmFtcykKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYocHNSZXF1ZXN0LCB2b3NfZXZlbnRfd2xhbl9wb3dlcnNhdmVfcGF5bG9hZF90eXBlKTsKKyNlbmRpZgorCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNTZXRDb25maWdQb3dlclNhdmUsIHBvd2VyIHNhdmUgbW9kZSAlZFxuIiksIHBzTW9kZSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIHNwZWNpZmllZCBwb3dlciBzYXZpbmcgbW9kZS4gKi8KKyAgICBzd2l0Y2ggKHBzTW9kZSkKKyAgICB7CisgICAgCisgICAgY2FzZSBlUE1DX0lETEVfTU9ERV9QT1dFUl9TQVZFOgorICAgICAgICBwTWFjLT5wbWMuaW1wc0NvbmZpZyA9ICoodHBQbWNJbXBzQ29uZmlnUGFyYW1zKXBDb25maWdQYXJhbXM7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0czLCBGTCgiSU1QUyBjb25maWd1cmF0aW9uIikpOworICAgICAgICBzbXNMb2cocE1hYywgTE9HMywgIiAgICAgICAgICBlbnRlciBvbiBBQzogJWRcbiIsCisgICAgICAgICAgICAgICBwTWFjLT5wbWMuaW1wc0NvbmZpZy5lbnRlck9uQWMpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgZVBNQ19CRUFDT05fTU9ERV9QT1dFUl9TQVZFOgorICAgICAgICBwTWFjLT5wbWMuYm1wc0NvbmZpZyA9ICoodHBQbWNCbXBzQ29uZmlnUGFyYW1zKXBDb25maWdQYXJhbXM7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0czLCBGTCgiQk1QUyBjb25maWd1cmF0aW9uIikpOworICAgICAgICBzbXNMb2cocE1hYywgTE9HMywgIiAgICAgICAgICBlbnRlciBvbiBBQzogJWRcbiIsCisgICAgICAgICAgICAgICBwTWFjLT5wbWMuYm1wc0NvbmZpZy5lbnRlck9uQWMpOworICAgICAgICBzbXNMb2cocE1hYywgTE9HMywgIiAgICAgICAgICBUWCB0aHJlc2hvbGQ6ICVkXG4iLAorICAgICAgICAgICAgICAgcE1hYy0+cG1jLmJtcHNDb25maWcudHhUaHJlc2hvbGQpOworICAgICAgICBzbXNMb2cocE1hYywgTE9HMywgIiAgICAgICAgICBSWCB0aHJlc2hvbGQ6ICVkXG4iLAorICAgICAgICAgICAgICAgcE1hYy0+cG1jLmJtcHNDb25maWcucnhUaHJlc2hvbGQpOworICAgICAgICBzbXNMb2cocE1hYywgTE9HMywgIiAgICAgICAgICB0cmFmZmljIG1lYXN1cmVtZW50IHBlcmlvZCAobXMpOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHBNYWMtPnBtYy5ibXBzQ29uZmlnLnRyYWZmaWNNZWFzdXJlUGVyaW9kKTsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPRzMsICIgICAgICAgICAgQk1QUyBwZXJpb2Q6ICVkXG4iLAorICAgICAgICAgICAgICAgcE1hYy0+cG1jLmJtcHNDb25maWcuYm1wc1BlcmlvZCk7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0czLCAiICAgICAgICAgIGJlYWNvbnMgdG8gZm9yd2FyZCBjb2RlOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHBNYWMtPnBtYy5ibXBzQ29uZmlnLmZvcndhcmRCZWFjb25zKTsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPRzMsICIgICAgICAgICAgdmFsdWUgb2YgTjogJWRcbiIsCisgICAgICAgICAgICAgICBwTWFjLT5wbWMuYm1wc0NvbmZpZy52YWx1ZU9mTik7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0czLCAiICAgICAgICAgIHVzZSBQUyBwb2xsOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHBNYWMtPnBtYy5ibXBzQ29uZmlnLnVzZVBzUG9sbCk7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0czLCAiICAgICAgICAgIHNldCBQTSBvbiBsYXN0IGZyYW1lOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHBNYWMtPnBtYy5ibXBzQ29uZmlnLnNldFBtT25MYXN0RnJhbWUpOworICAgICAgICBzbXNMb2cocE1hYywgTE9HMywgIiAgICAgICAgICB2YWx1ZSBvZiBlbmFibGVCZWFjb25FYXJseVRlcm1pbmF0aW9uOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHBNYWMtPnBtYy5ibXBzQ29uZmlnLmVuYWJsZUJlYWNvbkVhcmx5VGVybWluYXRpb24pOworICAgICAgICBzbXNMb2cocE1hYywgTE9HMywgIiAgICAgICAgICB2YWx1ZSBvZiBiY25FYXJseVRlcm1XYWtlSW50ZXJ2YWw6ICVkXG4iLAorICAgICAgICAgICAgICAgcE1hYy0+cG1jLmJtcHNDb25maWcuYmNuRWFybHlUZXJtV2FrZUludGVydmFsKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICAgICAgIHZvc19tZW1femVybygmcHNSZXF1ZXN0LCBzaXplb2Yodm9zX2V2ZW50X3dsYW5fcG93ZXJzYXZlX3BheWxvYWRfdHlwZSkpOworICAgICAgICBwc1JlcXVlc3QuZXZlbnRfc3VidHlwZSA9IFdMQU5fQk1QU19TRVRfQ09ORklHOworICAgICAgICAvKiBwb3NzaWJsZSBsb3NzIG9mIGRhdGEgZHVlIHRvIG1pc21hdGNoIGJ1dCBleHBlY3RhdGlvbiBpcyB0aGF0CisgICAgICAgIHZhbHVlcyBjYW4gcmVhc29uYWJseSBiZSBleHBlY3RlZCB0byBmaXQgaW4gdGFyZ2V0IHdpZHRocyAqLworICAgICAgICBwc1JlcXVlc3QuYm1wc19hdXRvX3RpbWVyX2R1cmF0aW9uID0gKHZfVTE2X3QpcE1hYy0+cG1jLmJtcHNDb25maWcudHJhZmZpY01lYXN1cmVQZXJpb2Q7CisgICAgICAgIHBzUmVxdWVzdC5ibXBzX3BlcmlvZCA9ICh2X1UxNl90KXBNYWMtPnBtYy5ibXBzQ29uZmlnLmJtcHNQZXJpb2Q7IAorCisgICAgICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZwc1JlcXVlc3QsIEVWRU5UX1dMQU5fUE9XRVJTQVZFX0dFTkVSSUMpOworI2VuZGlmCisKKworICAgICAgICBicmVhazsKKworICAgIGNhc2UgZVBNQ19TUEFUSUFMX01VTFRJUExFWF9QT1dFUl9TQVZFOgorICAgICAgICBwTWFjLT5wbWMuc21wc0NvbmZpZyA9ICoodHBQbWNTbXBzQ29uZmlnUGFyYW1zKXBDb25maWdQYXJhbXM7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0czLCBGTCgiU01QUyBjb25maWd1cmF0aW9uIikpOworICAgICAgICBzbXNMb2cocE1hYywgTE9HMywgIiAgICAgICAgICBtb2RlOiAlZFxuIiwgcE1hYy0+cG1jLnNtcHNDb25maWcubW9kZSk7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0czLCAiICAgICAgICAgIGVudGVyIG9uIEFDOiAlZFxuIiwKKyAgICAgICAgICAgICAgIHBNYWMtPnBtYy5zbXBzQ29uZmlnLmVudGVyT25BYyk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJJbnZhbGlkIHBvd2VyIHNhdmUgbW9kZSAlZFxuIiksIHBzTW9kZSk7CisgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy9TZW5kIHRoZSBwb3dlciBzYXZlIGNvbmZpZyBkb3duIHRvIFBFL0hBTC9GVyBpZiBCTVBTIG1vZGUgaXMgYmVpbmcgY29uZmlndXJlZAorICAgIC8vYW5kIHBtY1JlYWR5IGhhcyBiZWVuIGludm9rZWQKKyAgICBpZihQTUNfSVNfUkVBRFkocE1hYykgJiYgcHNNb2RlID09IGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRSkKKyAgICB7CisgICAgICAgaWYgKHBtY1NlbmRQb3dlclNhdmVDb25maWdNZXNzYWdlKGhIYWwpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNHZXRDb25maWdQb3dlclNhdmUKKyoKKyogRGVzY3JpcHRpb246CisqICAgIEdldCB0aGUgY29uZmlnIGZvciB0aGUgc3BlY2lmaWVkIHBvd2VyIHNhdmUgbW9kZQorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIHBzTW9kZSAtIHRoZSBwb3dlciBzYXZpbmcgbW9kZSB0byBjb25maWd1cmUKKyogICAgcENvbmZpZ1BhcmFtcyAtIHBvaW50ZXIgdG8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIHRoZQorKiAgICAgICAgICAgICAgICAgICAgcG93ZXIgc2F2aW5nIG1vZGUKKyoKKyogUmV0dXJuczoKKyogICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIGNvbmZpZ3VyYXRpb24gc3VjY2Vzc2Z1bAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gY29uZmlndXJhdGlvbiBub3Qgc3VjY2Vzc2Z1bAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNHZXRDb25maWdQb3dlclNhdmUgKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUsIHZvaWQgKnBDb25maWdQYXJhbXMpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNHZXRDb25maWdQb3dlclNhdmUsIHBvd2VyIHNhdmUgbW9kZSAlZFxuIiksIHBzTW9kZSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIHNwZWNpZmllZCBwb3dlciBzYXZpbmcgbW9kZS4gKi8KKyAgICBzd2l0Y2ggKHBzTW9kZSkKKyAgICB7CisgICAgCisgICAgY2FzZSBlUE1DX0lETEVfTU9ERV9QT1dFUl9TQVZFOgorICAgICAgICAqKHRwUG1jSW1wc0NvbmZpZ1BhcmFtcylwQ29uZmlnUGFyYW1zID0gcE1hYy0+cG1jLmltcHNDb25maWc7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBlUE1DX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkU6CisgICAgICAgICoodHBQbWNCbXBzQ29uZmlnUGFyYW1zKXBDb25maWdQYXJhbXMgPSBwTWFjLT5wbWMuYm1wc0NvbmZpZzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVQTUNfU1BBVElBTF9NVUxUSVBMRVhfUE9XRVJfU0FWRToKKyAgICAgICAgKih0cFBtY1NtcHNDb25maWdQYXJhbXMpcENvbmZpZ1BhcmFtcyA9IHBNYWMtPnBtYy5zbXBzQ29uZmlnOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBwb3dlciBzYXZlIG1vZGUgJWRcbiIpLCBwc01vZGUpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY0VuYWJsZVBvd2VyU2F2ZQorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgRW5hYmxlcyBvbmUgb2YgdGhlIHBvd2VyIHNhdmluZyBtb2Rlcy4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKiAgICBwc01vZGUgLSB0aGUgcG93ZXIgc2F2aW5nIG1vZGUgdG8gZW5hYmxlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzZnVsbHkgZW5hYmxlZAorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gbm90IHN1Y2Nlc3NmdWxseSBlbmFibGVkCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlSGFsU3RhdHVzIHBtY0VuYWJsZVBvd2VyU2F2ZSAodEhhbEhhbmRsZSBoSGFsLCB0UG1jUG93ZXJTYXZpbmdNb2RlIHBzTW9kZSkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlICBodE1pbW9Qb3dlclNhdmVTdGF0ZTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYocHNSZXF1ZXN0LCB2b3NfZXZlbnRfd2xhbl9wb3dlcnNhdmVfcGF5bG9hZF90eXBlKTsKKworICAgIHZvc19tZW1femVybygmcHNSZXF1ZXN0LCBzaXplb2Yodm9zX2V2ZW50X3dsYW5fcG93ZXJzYXZlX3BheWxvYWRfdHlwZSkpOworICAgIHBzUmVxdWVzdC5ldmVudF9zdWJ0eXBlID0gV0xBTl9QU19NT0RFX0VOQUJMRV9SRVE7CisgICAgcHNSZXF1ZXN0LmVuYWJsZV9kaXNhYmxlX3Bvd2Vyc2F2ZV9tb2RlID0gcHNNb2RlOworCisgICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnBzUmVxdWVzdCwgRVZFTlRfV0xBTl9QT1dFUlNBVkVfR0VORVJJQyk7CisjZW5kaWYKKyAgICAKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY0VuYWJsZVBvd2VyU2F2ZSwgcG93ZXIgc2F2ZSBtb2RlICVkXG4iKSwgcHNNb2RlKTsKKworICAgIC8qIEVuYWJsZSB0aGUgc3BlY2lmaWVkIHBvd2VyIHNhdmluZyBtb2RlLiAqLworICAgIHN3aXRjaCAocHNNb2RlKQorICAgIHsKKworICAgIGNhc2UgZVBNQ19JRExFX01PREVfUE9XRVJfU0FWRToKKyAgICAgICAgcE1hYy0+cG1jLmltcHNFbmFibGVkID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRToKKyAgICAgICAgcE1hYy0+cG1jLmJtcHNFbmFibGVkID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVQTUNfU1BBVElBTF9NVUxUSVBMRVhfUE9XRVJfU0FWRToKKyAgICAgICAgcE1hYy0+cG1jLnNtcHNFbmFibGVkID0gVFJVRTsKKworICAgICAgICAvKiBJZiBQTUMgYWxyZWFkeSBzdGFydGVkLCB0aGVuIHR1cm4gb24gU01QUy4gKi8KKyAgICAgICAgaWYgKHBNYWMtPnBtYy5wbWNTdGF0ZSAhPSBTVE9QUEVEKQorICAgICAgICAgICAgaWYgKHBNYWMtPnBtYy5wb3dlclNvdXJjZSAhPSBBQ19QT1dFUiB8fAorICAgICAgICAgICAgICAgIHBNYWMtPnBtYy5zbXBzQ29uZmlnLmVudGVyT25BYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocE1hYy0+cG1jLnNtcHNDb25maWcubW9kZSA9PSBlUE1DX0RZTkFNSUNfU01QUykKKyAgICAgICAgICAgICAgICAgICAgaHRNaW1vUG93ZXJTYXZlU3RhdGUgPSBlU0lSX0hUX01JTU9fUFNfRFlOQU1JQzsKKyAgICAgICAgICAgICAgICBpZiAocE1hYy0+cG1jLnNtcHNDb25maWcubW9kZSA9PSBlUE1DX1NUQVRJQ19TTVBTKQorICAgICAgICAgICAgICAgICAgICBodE1pbW9Qb3dlclNhdmVTdGF0ZSA9IGVTSVJfSFRfTUlNT19QU19TVEFUSUM7CisgICAgICAgICAgICAgICAgaWYgKHBtY1NlbmRNZXNzYWdlKGhIYWwsIGVXTklfUE1DX1NNUFNfU1RBVEVfSU5ELCAmaHRNaW1vUG93ZXJTYXZlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVQTUNfVUFQU0RfTU9ERV9QT1dFUl9TQVZFOgorICAgICAgICBwTWFjLT5wbWMudWFwc2RFbmFibGVkID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVQTUNfU1RBTkRCWV9NT0RFX1BPV0VSX1NBVkU6CisgICAgICAgIHBNYWMtPnBtYy5zdGFuZGJ5RW5hYmxlZCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBlUE1DX1dPV0xfTU9ERV9QT1dFUl9TQVZFOgorICAgICAgICBwTWFjLT5wbWMud293bEVuYWJsZWQgPSBUUlVFOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBwb3dlciBzYXZlIG1vZGUgJWRcbiIpLCBwc01vZGUpOworICAgICAgICBQTUNfQUJPUlQ7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHBtY1N0YXJ0QXV0b0JtcHNUaW1lcgorICAgIFxicmllZiAgU3RhcnRzIGEgdGltZXIgdGhhdCBwZXJpb2RpY2FsbHkgcG9sbHMgYWxsIHRoZSByZWdpc3RlcmVkCisgICAgICAgICAgICBtb2R1bGUgZm9yIGVudHJ5IGludG8gQm1wcyBtb2RlLiBUaGlzIHRpbWVyIGlzIHN0YXJ0ZWQgb25seSBpZiBCTVBTIGlzCisgICAgICAgICAgICBlbmFibGVkIGFuZCB3aGVuZXZlciB0aGUgZGV2aWNlIGlzIGluIGZ1bGwgcG93ZXIuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBtY1N0YXJ0QXV0b0JtcHNUaW1lciAodEhhbEhhbmRsZSBoSGFsKSAKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICBXTEFOX1ZPU19ESUFHX0VWRU5UX0RFRihwc1JlcXVlc3QsIHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpOworCisgICB2b3NfbWVtX3plcm8oJnBzUmVxdWVzdCwgc2l6ZW9mKHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpKTsKKyAgIHBzUmVxdWVzdC5ldmVudF9zdWJ0eXBlID0gV0xBTl9TVEFSVF9CTVBTX0FVVE9fVElNRVJfUkVROworCisgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmcHNSZXF1ZXN0LCBFVkVOVF9XTEFOX1BPV0VSU0FWRV9HRU5FUklDKTsKKyNlbmRpZgorCisgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY1N0YXJ0QXV0b0JtcHNUaW1lclxuIikpOworCisgICAvKiBDaGVjayBpZiBCTVBTIGlzIGVuYWJsZWQuICovCisgICBpZiAoIXBNYWMtPnBtYy5ibXBzRW5hYmxlZCkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBDYW5ub3QgZW5hYmxlIEJNUFMgdGltZXIuIEJNUFMgaXMgZGlzYWJsZWRcbiIpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIHBNYWMtPnBtYy5hdXRvQm1wc0VudHJ5RW5hYmxlZCA9IFRSVUU7CisKKyAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGFuIEluZnJhIHNlc3Npb24uIElmIHRoZXJlIGlzIG5vIEluZnJhIHNlc3Npb24sIHRpbWVyIHdpbGwgYmUgc3RhcnRlZCAKKyAgICAgICAgIHdoZW4gU1RBIGFzc29jaWF0ZXMgdG8gQVAgKi8KKworICAgaWYgKHBtY1Nob3VsZEJtcHNUaW1lclJ1bihwTWFjKSkKKyAgIHsKKyAgICAgIGlmIChwbWNTdGFydFRyYWZmaWNUaW1lcihoSGFsLCBwTWFjLT5wbWMuYm1wc0NvbmZpZy50cmFmZmljTWVhc3VyZVBlcmlvZCkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisKKworICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBwbWNTdG9wQXV0b0JtcHNUaW1lcgorICAgIFxicmllZiAgU3RvcHMgdGhlIEF1dG8gQk1QUyBUaW1lciB0aGF0IHdhcyBzdGFydGVkIHVzaW5nIHNtZV9zdGFydEF1dG9CbXBzVGltZXIKKyAgICAgICAgICAgIFN0b3BwaW5nIHRoZSB0aW1lciBkb2VzIG5vdCBjYXVzZSBhIGRldmljZSBzdGF0ZSBjaGFuZ2UuIE9ubHkgdGhlIHRpbWVyCisgICAgICAgICAgICBpcyBzdG9wcGVkLiBJZiAiRnVsbCBQb3dlciIgaXMgZGVzaXJlZCwgdXNlIHRoZSBwbWNSZXF1ZXN0RnVsbFBvd2VyIEFQSQorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBwbWNTdG9wQXV0b0JtcHNUaW1lciAodEhhbEhhbmRsZSBoSGFsKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAgICAKKyAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfREVGKHBzUmVxdWVzdCwgdm9zX2V2ZW50X3dsYW5fcG93ZXJzYXZlX3BheWxvYWRfdHlwZSk7CisKKyAgIHZvc19tZW1femVybygmcHNSZXF1ZXN0LCBzaXplb2Yodm9zX2V2ZW50X3dsYW5fcG93ZXJzYXZlX3BheWxvYWRfdHlwZSkpOworICAgcHNSZXF1ZXN0LmV2ZW50X3N1YnR5cGUgPSBXTEFOX1NUT1BfQk1QU19BVVRPX1RJTUVSX1JFUTsKKworICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnBzUmVxdWVzdCwgRVZFTlRfV0xBTl9QT1dFUlNBVkVfR0VORVJJQyk7CisjZW5kaWYKKworICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNTdG9wQXV0b0JtcHNUaW1lclxuIikpOworCisgICBwTWFjLT5wbWMuYXV0b0JtcHNFbnRyeUVuYWJsZWQgPSBGQUxTRTsKKyAgIC8qIElmIHVhcHNkIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkIG9yIEhERCBoYXMgbm90IHJlcXVlc3RlZCBCTVBTLCBzdG9wIHRoZSBhdXRvIGJtcHMgdGltZXIuKi8KKyAgIGlmICghcE1hYy0+cG1jLnVhcHNkU2Vzc2lvblJlcXVpcmVkICYmICFwTWFjLT5wbWMuYm1wc1JlcXVlc3RlZEJ5SGRkKQorICAgICAgcG1jU3RvcFRyYWZmaWNUaW1lcihoSGFsKTsKKworICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY0Rpc2FibGVQb3dlclNhdmUKKyoKKyogRGVzY3JpcHRpb246CisqICAgIERpc2FibGVzIG9uZSBvZiB0aGUgcG93ZXIgc2F2aW5nIG1vZGVzLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIHBzTW9kZSAtIHRoZSBwb3dlciBzYXZpbmcgbW9kZSB0byBkaXNhYmxlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzZnVsbHkgZGlzYWJsZWQKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIG5vdCBzdWNjZXNzZnVsbHkgZGlzYWJsZWQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jRGlzYWJsZVBvd2VyU2F2ZSAodEhhbEhhbmRsZSBoSGFsLCB0UG1jUG93ZXJTYXZpbmdNb2RlIHBzTW9kZSkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlICBodE1pbW9Qb3dlclNhdmVTdGF0ZTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYocHNSZXF1ZXN0LCB2b3NfZXZlbnRfd2xhbl9wb3dlcnNhdmVfcGF5bG9hZF90eXBlKTsKKworICAgIHZvc19tZW1femVybygmcHNSZXF1ZXN0LCBzaXplb2Yodm9zX2V2ZW50X3dsYW5fcG93ZXJzYXZlX3BheWxvYWRfdHlwZSkpOworICAgIHBzUmVxdWVzdC5ldmVudF9zdWJ0eXBlID0gV0xBTl9QU19NT0RFX0RJU0FCTEVfUkVROworICAgIHBzUmVxdWVzdC5lbmFibGVfZGlzYWJsZV9wb3dlcnNhdmVfbW9kZSA9IHBzTW9kZTsKKworICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZwc1JlcXVlc3QsIEVWRU5UX1dMQU5fUE9XRVJTQVZFX0dFTkVSSUMpOworI2VuZGlmCisKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY0Rpc2FibGVQb3dlclNhdmUsIHBvd2VyIHNhdmUgbW9kZSAlZFxuIiksIHBzTW9kZSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgcG93ZXIgc2F2aW5nIG1vZGUuICovCisgICAgc3dpdGNoIChwc01vZGUpCisgICAgeworCisgICAgY2FzZSBlUE1DX0lETEVfTU9ERV9QT1dFUl9TQVZFOgorICAgICAgICBwTWFjLT5wbWMuaW1wc0VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRToKKyAgICAgICAgcE1hYy0+cG1jLmJtcHNFbmFibGVkID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBlUE1DX1NQQVRJQUxfTVVMVElQTEVYX1BPV0VSX1NBVkU6CisgICAgICAgIHBNYWMtPnBtYy5zbXBzRW5hYmxlZCA9IEZBTFNFOworCisgICAgICAgIC8qIFR1cm4gb2ZmIFNNUFMuICovCisgICAgICAgIGh0TWltb1Bvd2VyU2F2ZVN0YXRlID0gZVNJUl9IVF9NSU1PX1BTX05PX0xJTUlUOworICAgICAgICBpZiAocG1jU2VuZE1lc3NhZ2UoaEhhbCwgZVdOSV9QTUNfU01QU19TVEFURV9JTkQsICZodE1pbW9Qb3dlclNhdmVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjSFRNSU1PUG93ZXJTYXZlU3RhdGUpKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBlUE1DX1VBUFNEX01PREVfUE9XRVJfU0FWRToKKyAgICAgICAgcE1hYy0+cG1jLnVhcHNkRW5hYmxlZCA9IEZBTFNFOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgZVBNQ19TVEFOREJZX01PREVfUE9XRVJfU0FWRToKKyAgICAgICAgcE1hYy0+cG1jLnN0YW5kYnlFbmFibGVkID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBlUE1DX1dPV0xfTU9ERV9QT1dFUl9TQVZFOgorICAgICAgICBwTWFjLT5wbWMud293bEVuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgcG93ZXIgc2F2ZSBtb2RlICVkXG4iKSwgcHNNb2RlKTsKKyAgICAgICAgUE1DX0FCT1JUOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNRdWVyeVBvd2VyU3RhdGUKKyoKKyogRGVzY3JpcHRpb246CisqICAgIFJldHVybnMgdGhlIGN1cnJlbnQgcG93ZXIgc3RhdGUgb2YgdGhlIGRldmljZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKiAgICBwUG93ZXJTdGF0ZSAtIHBvaW50ZXIgdG8gbG9jYXRpb24gdG8gcmV0dXJuIHBvd2VyIHN0YXRlCisqICAgIHBId1dsYW5Td2l0Y2hTdGF0ZSAtIHBvaW50ZXIgdG8gbG9jYXRpb24gdG8gcmV0dXJuIEhhcmR3YXJlIFdMQU4KKyogICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoIHN0YXRlCisqICAgIHBTd1dsYW5Td2l0Y2hTdGF0ZSAtIHBvaW50ZXIgdG8gbG9jYXRpb24gdG8gcmV0dXJuIFNvZnR3YXJlIFdMQU4KKyogICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoIHN0YXRlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBwb3dlciBzdGF0ZSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIHBvd2VyIHN0YXRlIG5vdCBzdWNjZXNzZnVsbHkgcmV0dXJuZWQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jUXVlcnlQb3dlclN0YXRlICh0SGFsSGFuZGxlIGhIYWwsIHRQbWNQb3dlclN0YXRlICpwUG93ZXJTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UG1jU3dpdGNoU3RhdGUgKnBId1dsYW5Td2l0Y2hTdGF0ZSwgdFBtY1N3aXRjaFN0YXRlICpwU3dXbGFuU3dpdGNoU3RhdGUpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNRdWVyeVBvd2VyU3RhdGVcbiIpKTsKKworICAgIC8qIFJldHVybiBjdXJyZW50IHBvd2VyIHN0YXRlIGJhc2VkIG9uIFBNQyBzdGF0ZS4gKi8KKyAgICBpZihwUG93ZXJTdGF0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogUmV0dXJuIGN1cnJlbnQgcG93ZXIgc3RhdGUgYmFzZWQgb24gUE1DIHN0YXRlLiAqLworICAgICAgICBzd2l0Y2ggKHBNYWMtPnBtYy5wbWNTdGF0ZSkKKyAgICAgICAgeworICAgIAorICAgICAgICBjYXNlIEZVTExfUE9XRVI6CisgICAgICAgICAgICAqcFBvd2VyU3RhdGUgPSBlUE1DX0ZVTExfUE9XRVI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgKnBQb3dlclN0YXRlID0gZVBNQ19MT1dfUE9XRVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJldHVybiBjdXJyZW50IHN3aXRjaCBzZXR0aW5ncy4gKi8KKyAgICBpZihwSHdXbGFuU3dpdGNoU3RhdGUgIT0gTlVMTCkKKyAgICAgICAqcEh3V2xhblN3aXRjaFN0YXRlID0gcE1hYy0+cG1jLmh3V2xhblN3aXRjaFN0YXRlOworICAgIGlmKHBTd1dsYW5Td2l0Y2hTdGF0ZSAhPSBOVUxMKQorICAgICAgICpwU3dXbGFuU3dpdGNoU3RhdGUgPSBwTWFjLT5wbWMuc3dXbGFuU3dpdGNoU3RhdGU7CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNJc1Bvd2VyU2F2ZUVuYWJsZWQKKyoKKyogRGVzY3JpcHRpb246CisqICAgIENoZWNrcyBpZiB0aGUgZGV2aWNlIGlzIGFibGUgdG8gZW50ZXIgb25lIG9mIHRoZSBwb3dlciBzYXZlIG1vZGVzLgorKiAgICAiQWJsZSB0byBlbnRlciIgbWVhbnMgdGhlIHBvd2VyIHNhdmUgbW9kZSBpcyBlbmFibGVkIGZvciB0aGUgZGV2aWNlCisqICAgIGFuZCB0aGUgaG9zdCBpcyB1c2luZyB0aGUgY29ycmVjdCBwb3dlciBzb3VyY2UgZm9yIGVudHJ5IGludG8gdGhlCisqICAgIHBvd2VyIHNhdmUgbW9kZS4gIFRoaXMgcm91dGluZSBkb2VzIG5vdCBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBkZXZpY2UKKyogICAgaXMgYWN0dWFsbHkgaW4gdGhlIHBvd2VyIHNhdmUgbW9kZSBhdCBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKiAgICBwc01vZGUgLSB0aGUgcG93ZXIgc2F2aW5nIG1vZGUKKyoKKyogUmV0dXJuczoKKyogICAgVFJVRSBpZiBkZXZpY2UgaXMgYWJsZSB0byBlbnRlciB0aGUgcG93ZXIgc2F2ZSBtb2RlLCBGQUxTRSBvdGhlcndpc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3RBTklfQk9PTEVBTiBwbWNJc1Bvd2VyU2F2ZUVuYWJsZWQgKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNJc1Bvd2VyU2F2ZUVuYWJsZWQsIHBvd2VyIHNhdmUgbW9kZSAlZFxuIiksIHBzTW9kZSk7CisKKyAgICAvKiBDaGVjayBhYmlsaXR5IHRvIGVudGVyIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcG93ZXIgc2F2aW5nIG1vZGUuICovCisgICAgc3dpdGNoIChwc01vZGUpCisgICAgeworICAgIAorICAgIGNhc2UgZVBNQ19JRExFX01PREVfUE9XRVJfU0FWRToKKyAgICAgICAgcmV0dXJuIHBNYWMtPnBtYy5pbXBzRW5hYmxlZCAmJiAocE1hYy0+cG1jLnBvd2VyU291cmNlICE9IEFDX1BPV0VSIHx8IHBNYWMtPnBtYy5pbXBzQ29uZmlnLmVudGVyT25BYyk7CisKKyAgICBjYXNlIGVQTUNfQkVBQ09OX01PREVfUE9XRVJfU0FWRToKKyAgICAgICAgcmV0dXJuIHBNYWMtPnBtYy5ibXBzRW5hYmxlZDsKKworICAgIGNhc2UgZVBNQ19TUEFUSUFMX01VTFRJUExFWF9QT1dFUl9TQVZFOgorICAgICAgICByZXR1cm4gcE1hYy0+cG1jLnNtcHNFbmFibGVkICYmIChwTWFjLT5wbWMucG93ZXJTb3VyY2UgIT0gQUNfUE9XRVIgfHwgcE1hYy0+cG1jLnNtcHNDb25maWcuZW50ZXJPbkFjKTsKKworICAgIGNhc2UgZVBNQ19VQVBTRF9NT0RFX1BPV0VSX1NBVkU6CisgICAgICAgIHJldHVybiBwTWFjLT5wbWMudWFwc2RFbmFibGVkOworCisgICAgY2FzZSBlUE1DX1NUQU5EQllfTU9ERV9QT1dFUl9TQVZFOgorICAgICAgICByZXR1cm4gcE1hYy0+cG1jLnN0YW5kYnlFbmFibGVkOworCisgICAgY2FzZSBlUE1DX1dPV0xfTU9ERV9QT1dFUl9TQVZFOgorICAgICAgICByZXR1cm4gcE1hYy0+cG1jLndvd2xFbmFibGVkOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiSW52YWxpZCBwb3dlciBzYXZlIG1vZGUgJWRcbiIpLCBwc01vZGUpOworICAgICAgICBQTUNfQUJPUlQ7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jUmVxdWVzdEZ1bGxQb3dlcgorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgUmVxdWVzdCB0aGF0IHRoZSBkZXZpY2UgYmUgYnJvdWdodCB0byBmdWxsIHBvd2VyIHN0YXRlLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIGNhbGxiYWNrUm91dGluZSAtIHJvdXRpbmUgdG8gY2FsbCB3aGVuIGRldmljZSBhY3R1YWxseSBhY2hpZXZlcyBmdWxsCisqICAgICAgICAgICAgICAgICAgICAgIHBvd2VyIHN0YXRlIGlmICJlSEFMX1NUQVRVU19QTUNfUEVORElORyIgaXMgcmV0dXJuZWQKKyogICAgY2FsbGJhY2tDb250ZXh0IC0gdmFsdWUgdG8gYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byByb3V0aW5lIHNwZWNpZmllZAorKiAgICAgICAgICAgICAgICAgICAgICBhYm92ZQorKiAgICBmdWxsUG93ZXJSZWFzb24gLSAgUmVhc29uIGZvciByZXF1ZXN0aW5nIGZ1bGwgcG93ZXIgbW9kZS4gVGhpcyBpcyB1c2VkCisqICAgICAgICAgICAgICAgICAgICAgICBieSBQRSB0byBkZWNpZGUgd2hldGhlciBkYXRhIG51bGwgc2hvdWxkIGJlIHNlbnQgdG8KKyogICAgICAgICAgICAgICAgICAgICAgIEFQIHdoZW4gZXhpdGluZyBCTVBTIG1vZGUuIENhbGxlciBzaG91bGQgdXNlIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgZVNNRV9MSU5LX0RJU0NPTk5FQ1RFRCByZWFzb24gaWYgbGluayBpcyBkaXNjb25uZWN0ZWQKKyogICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvIHRlbGwgdGhlIEFQIHRoYXQgd2UgYXJlIGdvaW5nCisqICAgICAgICAgICAgICAgICAgICAgICBvdXQgb2YgcG93ZXIgc2F2ZS4KKyoKKyogUmV0dXJuczoKKyogICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIGRldmljZSBicm91Z2h0IHRvIGZ1bGwgcG93ZXIgc3RhdGUKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIGRldmljZSBjYW5ub3QgYmUgYnJvdWdodCB0byBmdWxsIHBvd2VyIHN0YXRlCisqICAgIGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HIC0gZGV2aWNlIGlzIGJlaW5nIGJyb3VnaHQgdG8gZnVsbCBwb3dlciBzdGF0ZSwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1JvdXRpbmUgd2lsbCBiZSBjYWxsZWQgd2hlbiBjb21wbGV0ZWQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jUmVxdWVzdEZ1bGxQb3dlciAodEhhbEhhbmRsZSBoSGFsLCB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgdFJlcXVlc3RGdWxsUG93ZXJSZWFzb24gZnVsbFBvd2VyUmVhc29uKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICB0cFJlcXVlc3RGdWxsUG93ZXJFbnRyeSBwRW50cnk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICAgIAorICAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfREVGKHBzUmVxdWVzdCwgdm9zX2V2ZW50X3dsYW5fcG93ZXJzYXZlX3BheWxvYWRfdHlwZSk7CisKKyAgICB2b3NfbWVtX3plcm8oJnBzUmVxdWVzdCwgc2l6ZW9mKHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpKTsKKyAgICBwc1JlcXVlc3QuZXZlbnRfc3VidHlwZSA9IFdMQU5fRU5URVJfRlVMTF9QT1dFUl9SRVE7CisgICAgcHNSZXF1ZXN0LmZ1bGxfcG93ZXJfcmVxdWVzdF9yZWFzb24gPSBmdWxsUG93ZXJSZWFzb247CisgCisgICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnBzUmVxdWVzdCwgRVZFTlRfV0xBTl9QT1dFUlNBVkVfR0VORVJJQyk7CisjZW5kaWYKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiRW50ZXJpbmcgcG1jUmVxdWVzdEZ1bGxQb3dlciIpKTsKKworICAgIGlmKCAhUE1DX0lTX1JFQURZKHBNYWMpICkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiUmVxdWVzdGluZyBGdWxsIFBvd2VyIHdoZW4gUE1DIG5vdCByZWFkeVxuIikpOworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoInBtY1JlYWR5ID0gJWQgcG1jU3RhdGUgPSAlc1xuIiksIAorICAgICAgICAgICAgcE1hYy0+cG1jLnBtY1JlYWR5LCBwbWNHZXRQbWNTdGF0ZVN0cihwTWFjLT5wbWMucG1jU3RhdGUpKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogSWYgSEREIGlzIHJlcXVlc3RpbmcgZnVsbCBwb3dlciwgY2xlYXIgYW55IGJ1ZmZlcmVkIHJlcXVlc3RzIGZvciBXT1dMIGFuZCBCTVBTIHRoYXQgd2VyZQorICAgICAgIHJlcXVlc3RlZCBieSBIREQgcHJldmlvdXNseSAqLworICAgIGlmKFNJUl9JU19GVUxMX1BPV0VSX05FRURFRF9CWV9IREQoZnVsbFBvd2VyUmVhc29uKSkKKyAgICB7CisgICAgICAgIHBNYWMtPnBtYy5ibXBzUmVxdWVzdGVkQnlIZGQgPSBGQUxTRTsKKyAgICAgICAgcE1hYy0+cG1jLndvd2xNb2RlUmVxdWlyZWQgPSBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBJZiBhbHJlYWR5IGluIGZ1bGwgcG93ZXIsIGp1c3QgcmV0dXJuLiAqLworICAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgPT0gRlVMTF9QT1dFUikKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAvKiBJZiBpbiBJTVBTIFN0YXRlLCB0aGVuIGNhbmNlbCB0aGUgdGltZXIuICovCisgICAgaWYgKHBNYWMtPnBtYy5wbWNTdGF0ZSA9PSBJTVBTKQorICAgICAgICBpZiAocGFsVGltZXJTdG9wKHBNYWMtPmhIZGQsIHBNYWMtPnBtYy5oSW1wc1RpbWVyKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBjYW5jZWwgSU1QUyB0aW1lclxuIikpOworICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKworICAgIC8qIEVudGVyIFJlcXVlc3QgRnVsbCBQb3dlciBTdGF0ZS4gKi8KKyAgICBpZiAocG1jRW50ZXJSZXF1ZXN0RnVsbFBvd2VyU3RhdGUoaEhhbCwgZnVsbFBvd2VyUmVhc29uKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgIC8qIElmIGFibGUgdG8gZW50ZXIgUmVxdWVzdCBGdWxsIFBvd2VyIFN0YXRlLCB0aGVuIHJlcXVlc3QgaXMgcGVuZGluZy4KKyAgICAgICBBbGxvY2F0ZSBlbnRyeSBmb3IgcmVxdWVzdCBmdWxsIHBvd2VyIGNhbGxiYWNrIHJvdXRpbmUgbGlzdC4gKi8KKyAgICAvL0lmIGNhbGxlciBkb2Vzbid0IG5lZWQgYSBjYWxsYmFjaywgc2ltcGx5IHdhaXRzIHVwIHRoZSBjaGlwLgorICAgIGlmKCBjYWxsYmFja1JvdXRpbmUgKQorICAgIHsKKyAgICAgICAgaWYgKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRW50cnksIHNpemVvZih0UmVxdWVzdEZ1bGxQb3dlckVudHJ5KSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZXF1ZXN0IGZ1bGwgcG93ZXIgcm91dGluZSBsaXN0IGVudHJ5XG4iKSk7CisgICAgICAgICAgICBQTUNfQUJPUlQ7CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFN0b3JlIHJvdXRpbmUgYW5kIGNvbnRleHQgaW4gZW50cnkuICovCisgICAgICAgIHBFbnRyeS0+Y2FsbGJhY2tSb3V0aW5lID0gY2FsbGJhY2tSb3V0aW5lOworICAgICAgICBwRW50cnktPmNhbGxiYWNrQ29udGV4dCA9IGNhbGxiYWNrQ29udGV4dDsKKworICAgICAgICAvKiBBZGQgZW50cnkgdG8gbGlzdC4gKi8KKyAgICAgICAgY3NyTExJbnNlcnRUYWlsKCZwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlckxpc3QsICZwRW50cnktPmxpbmssIFRSVUUpOworICAgIH0KKworICAgIHJldHVybiBlSEFMX1NUQVRVU19QTUNfUEVORElORzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6ICBwbWNSZXF1ZXN0SW1wcworKgorKiBEZXNjcmlwdGlvbjoKKyogICAgUmVxdWVzdCB0aGF0IHRoZSBkZXZpY2UgYmUgcGxhY2VkIGluIElkbGUgTW9kZSBQb3dlciBTYXZlIChJTVBTKS4KKyogICAgVGhlIENvbW1vbiBTY2FuL1JvYW0gTW9kdWxlIG1ha2VzIHRoaXMgcmVxdWVzdC4gIFRoZSBkZXZpY2Ugd2lsbCBiZQorKiAgICBwbGFjZWQgaW50byBJTVBTIGZvciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLCBhbmQgdGhlbiByZXR1cm5lZAorKiAgICB0byBmdWxsIHBvd2VyLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIGltcHNQZXJpb2QgLSBhbW91bnQgb2YgdGltZSB0byByZW1haW4gaW4gSU1QUyAobWlsbGlzZWNvbmRzKQorKiAgICBjYWxsYmFja1JvdXRpbmUgLSByb3V0aW5lIHRvIGNhbGwgd2hlbiBJTVBTIHBlcmlvZCBoYXMgZmluaXNoZWQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgIHRoZSBkZXZpY2UgaGFzIGJlZW4gYnJvdWdodCB0byBmdWxsIHBvd2VyCisqICAgIGNhbGxiYWNrQ29udGV4dCAtIHZhbHVlIHRvIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8gcm91dGluZSBzcGVjaWZpZWQKKyogICAgICAgICAgICAgICAgICAgICAgYWJvdmUKKyoKKyogUmV0dXJuczoKKyogICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIGRldmljZSB3aWxsIGVudGVyIElNUFMKKyogICAgZUhBTF9TVEFUVVNfUE1DX0RJU0FCTEVEIC0gSU1QUyBpcyBkaXNhYmxlZAorKiAgICBlSEFMX1NUQVRVU19QTUNfTk9UX05PVyAtIGFub3RoZXIgbW9kdWxlIGlzIHByb2hpYml0aW5nIGVudGVyaW5nIElNUFMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB0aGlzIHRpbWUKKyogICAgZUhBTF9TVEFUVVNfUE1DX0FDX1BPV0VSIC0gSU1QUyBpcyBkaXNhYmxlZCB3aGVuIGhvc3Qgb3BlcmF0aW5nIGZyb20KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUMgcG93ZXIKKyogICAgZUhBTF9TVEFUVVNfUE1DX0FMUkVBRFlfSU5fSU1QUyAtIGRldmljZSBpcyBhbHJlYWR5IGluIElNUFMKKyogICAgZUhBTF9TVEFUVVNfUE1DX1NZU19FUlJPUiAtIHN5c3RlbSBlcnJvciB0aGF0IHByb2hpYml0cyBlbnRlcmluZyBJTVBTCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlSGFsU3RhdHVzIHBtY1JlcXVlc3RJbXBzICh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIGltcHNQZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja0NvbnRleHQpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAgICAKKyAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX0RFRihwc1JlcXVlc3QsIHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpOworCisgICAgdm9zX21lbV96ZXJvKCZwc1JlcXVlc3QsIHNpemVvZih2b3NfZXZlbnRfd2xhbl9wb3dlcnNhdmVfcGF5bG9hZF90eXBlKSk7CisgICAgcHNSZXF1ZXN0LmV2ZW50X3N1YnR5cGUgPSBXTEFOX0lNUFNfRU5URVJfUkVROworICAgIHBzUmVxdWVzdC5pbXBzX3BlcmlvZCA9IGltcHNQZXJpb2Q7CisKKyAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmcHNSZXF1ZXN0LCBFVkVOVF9XTEFOX1BPV0VSU0FWRV9HRU5FUklDKTsKKyNlbmRpZgorCisKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY1JlcXVlc3RJbXBzIikpOworCisgICAgc3RhdHVzID0gcG1jRW50ZXJJbXBzQ2hlY2soIHBNYWMgKTsKKyAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgeworICAgICAgICAvKiBFbnRlciBSZXF1ZXN0IElNUFMgU3RhdGUuICovCisgICAgICAgIHN0YXR1cyA9IHBtY0VudGVyUmVxdWVzdEltcHNTdGF0ZSggaEhhbCApOworICAgICAgICBpZiAoSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSkKKyAgICB7CisgICAgICAgICAgICAvKiBTYXZlIHRoZSBwZXJpb2QgYW5kIGNhbGxiYWNrIHJvdXRpbmUgZm9yIHdoZW4gd2UgbmVlZCBpdC4gKi8KKyAgICAgICAgICAgIHBNYWMtPnBtYy5pbXBzUGVyaW9kID0gaW1wc1BlcmlvZDsKKyAgICAgICAgICAgIHBNYWMtPnBtYy5pbXBzQ2FsbGJhY2tSb3V0aW5lID0gY2FsbGJhY2tSb3V0aW5lOworICAgICAgICAgICAgcE1hYy0+cG1jLmltcHNDYWxsYmFja0NvbnRleHQgPSBjYWxsYmFja0NvbnRleHQ7CisKKyAgICB9CisgICAgICAgIGVsc2UKKyAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19QTUNfU1lTX0VSUk9SOworICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY1JlZ2lzdGVyUG93ZXJTYXZlQ2hlY2sKKyoKKyogRGVzY3JpcHRpb246CisqICAgIEFsbG93cyBhIHJvdXRpbmUgdG8gYmUgcmVnaXN0ZXJlZCBzbyB0aGF0IHRoZSByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlcgorKiAgICB0aGUgZGV2aWNlIGlzIGFib3V0IHRvIGVudGVyIG9uZSBvZiB0aGUgcG93ZXIgc2F2ZSBtb2Rlcy4gIFRoaXMgcm91dGluZQorKiAgICB3aWxsIHNheSB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgYWxsb3dlZCB0byBlbnRlciB0aGUgcG93ZXIgc2F2ZSBtb2RlIGF0CisqICAgIHRoZSB0aW1lIG9mIHRoZSBjYWxsLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIGNoZWNrUm91dGluZSAtIHJvdXRpbmUgdG8gY2FsbCBiZWZvcmUgZW50ZXJpbmcgYSBwb3dlciBzYXZlIG1vZGUsIHNob3VsZAorKiAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRSBpZiB0aGUgZGV2aWNlIGlzIGFsbG93ZWQgdG8gZW50ZXIgdGhlIHBvd2VyCisqICAgICAgICAgICAgICAgICAgIHNhdmUgbW9kZSwgRkFMU0Ugb3RoZXJ3aXNlCisqICAgIGNoZWNrQ29udGV4dCAtIHZhbHVlIHRvIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8gcm91dGluZSBzcGVjaWZpZWQgYWJvdmUKKyoKKyogUmV0dXJuczoKKyogICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkCisqICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBub3Qgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VIYWxTdGF0dXMgcG1jUmVnaXN0ZXJQb3dlclNhdmVDaGVjayAodEhhbEhhbmRsZSBoSGFsLCB0QU5JX0JPT0xFQU4gKCpjaGVja1JvdXRpbmUpICh2b2lkICpjaGVja0NvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjaGVja0NvbnRleHQpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgIHRwUG93ZXJTYXZlQ2hlY2tFbnRyeSBwRW50cnk7CisKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY1JlZ2lzdGVyUG93ZXJTYXZlQ2hlY2siKSk7CisKKyAgICAvKiBBbGxvY2F0ZSBlbnRyeSBmb3IgcG93ZXIgc2F2ZSBjaGVjayByb3V0aW5lIGxpc3QuICovCisgICAgaWYgKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRW50cnksIHNpemVvZih0UG93ZXJTYXZlQ2hlY2tFbnRyeSkpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBvd2VyIHNhdmUgY2hlY2sgcm91dGluZSBsaXN0IGVudHJ5XG4iKSk7CisgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogU3RvcmUgcm91dGluZSBhbmQgY29udGV4dCBpbiBlbnRyeS4gKi8KKyAgICBwRW50cnktPmNoZWNrUm91dGluZSA9IGNoZWNrUm91dGluZTsKKyAgICBwRW50cnktPmNoZWNrQ29udGV4dCA9IGNoZWNrQ29udGV4dDsKKworICAgIC8qIEFkZCBlbnRyeSB0byBsaXN0LiAqLworICAgIGNzckxMSW5zZXJ0VGFpbCgmcE1hYy0+cG1jLnBvd2VyU2F2ZUNoZWNrTGlzdCwgJnBFbnRyeS0+bGluaywgRkFMU0UpOworCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jRGVyZWdpc3RlclBvd2VyU2F2ZUNoZWNrCisqCisqIERlc2NyaXB0aW9uOgorKiAgICBSZXJlZ2lzdGVycyBhIHJvdXRpbmUgdGhhdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGgKKyogICAgcG1jUmVnaXN0ZXJQb3dlclNhdmVDaGVjay4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKiAgICBjaGVja1JvdXRpbmUgLSByb3V0aW5lIHRvIGRlcmVnaXN0ZXIKKyoKKyogUmV0dXJuczoKKyogICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3NmdWxseSBkZXJlZ2lzdGVyZWQKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIG5vdCBzdWNjZXNzZnVsbHkgZGVyZWdpc3RlcmVkCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlSGFsU3RhdHVzIHBtY0RlcmVnaXN0ZXJQb3dlclNhdmVDaGVjayAodEhhbEhhbmRsZSBoSGFsLCB0QU5JX0JPT0xFQU4gKCpjaGVja1JvdXRpbmUpICh2b2lkICpjaGVja0NvbnRleHQpKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0cFBvd2VyU2F2ZUNoZWNrRW50cnkgcFBvd2VyU2F2ZUNoZWNrRW50cnk7CisKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoIkVudGVyaW5nIHBtY0RlcmVnaXN0ZXJQb3dlclNhdmVDaGVjayIpKTsKKworICAgIC8qIEZpbmQgZW50cnkgaW4gdGhlIHBvd2VyIHNhdmUgY2hlY2sgcm91dGluZSBsaXN0IHRoYXQgbWF0Y2hlcworICAgICAgIHRoZSBzcGVjaWZpZWQgcm91dGluZSBhbmQgcmVtb3ZlIGl0LiAqLworICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoJnBNYWMtPnBtYy5wb3dlclNhdmVDaGVja0xpc3QsIEZBTFNFKTsKKyAgICB3aGlsZSAocEVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgICBwUG93ZXJTYXZlQ2hlY2tFbnRyeSA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0UG93ZXJTYXZlQ2hlY2tFbnRyeSwgbGluayk7CisgICAgICAgIGlmIChwUG93ZXJTYXZlQ2hlY2tFbnRyeS0+Y2hlY2tSb3V0aW5lID09IGNoZWNrUm91dGluZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNzckxMUmVtb3ZlRW50cnkoJnBNYWMtPnBtYy5wb3dlclNhdmVDaGVja0xpc3QsIHBFbnRyeSwgRkFMU0UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBQb3dlclNhdmVDaGVja0VudHJ5KSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgZnJlZSBtZW1vcnkgZm9yIHBvd2VyIHNhdmUgY2hlY2sgcm91dGluZSBsaXN0IGVudHJ5XG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IHJlbW92ZSBwb3dlciBzYXZlIGNoZWNrIHJvdXRpbmUgbGlzdCBlbnRyeVxuIikpOworICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCZwTWFjLT5wbWMucG93ZXJTYXZlQ2hlY2tMaXN0LCBwRW50cnksIEZBTFNFKTsKKyAgICB9CisKKyAgICAvKiBDb3VsZCBub3QgZmluZCBtYXRjaGluZyBlbnRyeS4gKi8KKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKK30KKworCitzdGF0aWMgdm9pZCBwbWNQcm9jZXNzUmVzcG9uc2UoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJTbWVSc3AgKnBNc2cgKQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5ID0gTlVMTDsKKyAgICB0U21lQ21kICpwQ29tbWFuZCA9IE5VTEw7CisgICAgdEFOSV9CT09MRUFOIGZSZW1vdmVDb21tYW5kID0gZUFOSV9CT09MRUFOX1RSVUU7CisKKyAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0spOworICAgIGlmKHBFbnRyeSkKKyAgICB7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRTbWVDbWQsIExpbmspOworCisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgicHJvY2VzcyBtZXNzYWdlID0gJWRcbiIpLCBwTXNnLT5tZXNzYWdlVHlwZSk7CisKKyAgICAvKiBQcm9jZXNzIGVhY2ggZGlmZmVyZW50IHR5cGUgb2YgbWVzc2FnZS4gKi8KKyAgICBzd2l0Y2ggKHBNc2ctPm1lc3NhZ2VUeXBlKQorICAgIHsKKworICAgIC8qIFdlIGdvdCBhIHJlc3BvbnNlIHRvIG91ciBJTVBTIHJlcXVlc3QuICAqLworICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfSU1QU19SU1A6CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiUmN2ZCBlV05JX1BNQ19FTlRFUl9JTVBTX1JTUCB3aXRoIHN0YXR1cyA9ICVkXG4iKSwgcE1zZy0+c3RhdHVzQ29kZSk7CisgICAgICAgICAgICBpZiggKGVTbWVDb21tYW5kRW50ZXJJbXBzICE9IHBDb21tYW5kLT5jb21tYW5kKSAmJiAoZVNtZUNvbW1hbmRFbnRlclN0YW5kYnkgIT0gcENvbW1hbmQtPmNvbW1hbmQpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIlJjdmQgZVdOSV9QTUNfRU5URVJfSU1QU19SU1Agd2l0aG91dCByZXF1ZXN0XG4iKSk7CisgICAgICAgICAgICAgICAgZlJlbW92ZUNvbW1hbmQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmKHBNYWMtPnBtYy5wbWNTdGF0ZSA9PSBSRVFVRVNUX0lNUFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVudGVyIElNUFMgU3RhdGUgaWYgcmVzcG9uc2UgaW5kaWNhdGVzIHN1Y2Nlc3MuICovCisgICAgICAgICAgICBpZiAocE1zZy0+c3RhdHVzQ29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbWNFbnRlckltcHNTdGF0ZShwTWFjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgcmVzcG9uc2UgaXMgZmFpbHVyZSwgdGhlbiB3ZSBzdGF5IGluIEZ1bGwgUG93ZXIgU3RhdGUgYW5kIHRlbGwgZXZlcnlvbmUgdGhhdCB3ZSBhcmVuJ3QgZ29pbmcgaW50byBJTVBTLiAqLworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJSZXNwb25zZSBtZXNzYWdlIHRvIHJlcXVlc3QgdG8gZW50ZXIgSU1QUyBpbmRpY2F0ZXMgZmFpbHVyZSwgc3RhdHVzICV4XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcE1zZy0+c3RhdHVzQ29kZSk7CisgICAgICAgICAgICAgICAgICAgIHBtY0VudGVyRnVsbFBvd2VyU3RhdGUocE1hYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocE1hYy0+cG1jLnBtY1N0YXRlID09IFJFUVVFU1RfU1RBTkRCWSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW50ZXIgU1RBTkRCWSBTdGF0ZSBpZiByZXNwb25zZSBpbmRpY2F0ZXMgc3VjY2Vzcy4gKi8KKyAgICAgICAgICAgIGlmIChwTXNnLT5zdGF0dXNDb2RlID09IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtY0VudGVyU3RhbmRieVN0YXRlKHBNYWMpOworICAgICAgICAgICAgICAgICAgICBwbWNEb1N0YW5kYnlDYWxsYmFja3MocE1hYywgZUhBTF9TVEFUVVNfU1VDQ0VTUyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIHJlc3BvbnNlIGlzIGZhaWx1cmUsIHRoZW4gd2Ugc3RheSBpbiBGdWxsIFBvd2VyIFN0YXRlCisgICAgICAgICAgICAgICBhbmQgdGVsbCBldmVyeW9uZSB0aGF0IHdlIGFyZW4ndCBnb2luZyBpbnRvIFNUQU5EQlkuICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IHJlc3BvbnNlIG1lc3NhZ2UgdG8gcmVxdWVzdCB0byBlbnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICJzdGFuZGJ5IGluZGljYXRlcyBmYWlsdXJlLCBzdGF0dXMgJXhcbiIsIHBNc2ctPnN0YXR1c0NvZGUpOworICAgICAgICAgICAgICAgICAgICBwbWNFbnRlckZ1bGxQb3dlclN0YXRlKHBNYWMpOworICAgICAgICAgICAgICAgICAgICBwbWNEb1N0YW5kYnlDYWxsYmFja3MocE1hYywgZUhBTF9TVEFUVVNfRkFJTFVSRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogRW50ZXIgSU1QUyByc3AgcmN2ZCB3aGVuIGRldmljZSBpcyAiCisgICAgICAgICAgICAgICAiaW4gJWQgc3RhdGVcbiIsIHBNYWMtPnBtYy5wbWNTdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAvKiBXZSBnb3QgYSByZXNwb25zZSB0byBvdXIgd2FrZSBmcm9tIElNUFMgcmVxdWVzdC4gKi8KKyAgICBjYXNlIGVXTklfUE1DX0VYSVRfSU1QU19SU1A6CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIlJjdmQgZVdOSV9QTUNfRVhJVF9JTVBTX1JTUCB3aXRoIHN0YXR1cyA9ICVkXG4iKSwgcE1zZy0+c3RhdHVzQ29kZSk7CisgICAgICAgICAgICBpZiggZVNtZUNvbW1hbmRFeGl0SW1wcyAhPSBwQ29tbWFuZC0+Y29tbWFuZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJSY3ZkIGVXTklfUE1DX0VYSVRfSU1QU19SU1Agd2l0aG91dCByZXF1ZXN0XG4iKSk7CisgICAgICAgICAgICAgICAgZlJlbW92ZUNvbW1hbmQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDaGVjayB0aGF0IHdlIGFyZSBpbiB0aGUgY29ycmVjdCBzdGF0ZSBmb3IgdGhpcyBtZXNzYWdlLiAqLworICAgICAgICAgICAgaWYgKHBNYWMtPnBtYy5wbWNTdGF0ZSAhPSBSRVFVRVNUX0ZVTExfUE9XRVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJHb3QgRXhpdCBJTVBTIFJlc3BvbnNlIE1lc3NhZ2Ugd2hpbGUgaW4gc3RhdGUgJWRcbiIpLCBwTWFjLT5wbWMucG1jU3RhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBFbnRlciBGdWxsIFBvd2VyIFN0YXRlLiAqLworICAgICAgICAgICAgaWYgKHBNc2ctPnN0YXR1c0NvZGUgIT0gZVNJUl9TTUVfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HUCwgRkwoIlJlc3BvbnNlIG1lc3NhZ2UgdG8gcmVxdWVzdCB0byBleGl0IElNUFMgaW5kaWNhdGVzIGZhaWx1cmUsIHN0YXR1cyAleFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBNc2ctPnN0YXR1c0NvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG1jRW50ZXJGdWxsUG93ZXJTdGF0ZShwTWFjKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAvKiBXZSBnb3QgYSByZXNwb25zZSB0byBvdXIgQk1QUyByZXF1ZXN0LiAgKi8KKyAgICBjYXNlIGVXTklfUE1DX0VOVEVSX0JNUFNfUlNQOgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJSY3ZkIGVXTklfUE1DX0VOVEVSX0JNUFNfUlNQIHdpdGggc3RhdHVzID0gJWRcbiIpLCBwTXNnLT5zdGF0dXNDb2RlKTsKKyAgICAgICAgICAgIGlmKCBlU21lQ29tbWFuZEVudGVyQm1wcyAhPSBwQ29tbWFuZC0+Y29tbWFuZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJSY3ZkIGVXTklfUE1DX0VOVEVSX0JNUFNfUlNQIHdpdGhvdXQgcmVxdWVzdFxuIikpOworICAgICAgICAgICAgICAgIGZSZW1vdmVDb21tYW5kID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE1hYy0+cG1jLmJtcHNSZXF1ZXN0UXVldWVkID0gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCB3ZSBhcmUgaW4gdGhlIGNvcnJlY3Qgc3RhdGUgZm9yIHRoaXMgbWVzc2FnZS4gKi8KKyAgICAgICAgICAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgIT0gUkVRVUVTVF9CTVBTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiR290IEVudGVyIEJNUFMgUmVzcG9uc2UgTWVzc2FnZSB3aGlsZSBpbiBzdGF0ZSAlZFxuIiksIHBNYWMtPnBtYy5wbWNTdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyogRW50ZXIgQk1QUyBTdGF0ZSBpZiByZXNwb25zZSBpbmRpY2F0ZXMgc3VjY2Vzcy4gKi8KKyAgICAgICAgaWYgKHBNc2ctPnN0YXR1c0NvZGUgPT0gZVNJUl9TTUVfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHBtY0VudGVyQm1wc1N0YXRlKHBNYWMpOworICAgICAgICAgICAgLyogTm90ZTogSWYgQk1QUyB3YXMgcmVxdWVzdGVkIGJlY2F1c2Ugb2Ygc3RhcnQgVUFQU0QsCisgICAgICAgICAgICAgICB0aGVyZSB3aWxsIG5vIGVudHJpZXMgZm9yIEJNUFMgY2FsbGJhY2sgcm91dGluZXMgYW5kCisgICAgICAgICAgICAgICBwbWNEb0JtcHNDYWxsYmFja3Mgd2lsbCBiZSBhIE5vLU9wKi8KKyAgICAgICAgICAgICAgICBwbWNEb0JtcHNDYWxsYmFja3MocE1hYywgZUhBTF9TVEFUVVNfU1VDQ0VTUyk7CisgICAgICAgICB9CisgICAgICAgIC8qIElmIHJlc3BvbnNlIGlzIGZhaWx1cmUsIHRoZW4gd2Ugc3RheSBpbiBGdWxsIFBvd2VyIFN0YXRlIGFuZCB0ZWxsIGV2ZXJ5b25lIHRoYXQgd2UgYXJlbid0IGdvaW5nIGludG8gQk1QUy4gKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJSZXNwb25zZSBtZXNzYWdlIHRvIHJlcXVlc3QgdG8gZW50ZXIgQk1QUyBpbmRpY2F0ZXMgZmFpbHVyZSwgc3RhdHVzICV4XG4iKSwKKyAgICAgICAgICAgICAgICAgICBwTXNnLT5zdGF0dXNDb2RlKTsKKyAgICAgICAgICAgICAgICBwbWNFbnRlckZ1bGxQb3dlclN0YXRlKHBNYWMpOworICAgICAgICAgICAgICAgIC8vRG8gbm90IGNhbGwgVUFQU0QgY2FsbGJhY2sgaGVyZSBzaW5jZSBpdCBtYXkgYmUgcmUtZW50ZXJlZAorICAgICAgICAgICAgICAgIHBtY0RvQm1wc0NhbGxiYWNrcyhwTWFjLCBlSEFMX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIC8qIFdlIGdvdCBhIHJlc3BvbnNlIHRvIG91ciB3YWtlIGZyb20gQk1QUyByZXF1ZXN0LiAqLworICAgIGNhc2UgZVdOSV9QTUNfRVhJVF9CTVBTX1JTUDoKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiUmN2ZCBlV05JX1BNQ19FWElUX0JNUFNfUlNQIHdpdGggc3RhdHVzID0gJWRcbiIpLCBwTXNnLT5zdGF0dXNDb2RlKTsKKyAgICAgICAgICAgIGlmKCBlU21lQ29tbWFuZEV4aXRCbXBzICE9IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIlJjdmQgZVdOSV9QTUNfRVhJVF9CTVBTX1JTUCB3aXRob3V0IHJlcXVlc3RcbiIpKTsKKyAgICAgICAgICAgICAgICBmUmVtb3ZlQ29tbWFuZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgd2UgYXJlIGluIHRoZSBjb3JyZWN0IHN0YXRlIGZvciB0aGlzIG1lc3NhZ2UuICovCisgICAgICAgICAgICBpZiAocE1hYy0+cG1jLnBtY1N0YXRlICE9IFJFUVVFU1RfRlVMTF9QT1dFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkdvdCBFeGl0IEJNUFMgUmVzcG9uc2UgTWVzc2FnZSB3aGlsZSBpbiBzdGF0ZSAlZFxuIiksIHBNYWMtPnBtYy5wbWNTdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEVudGVyIEZ1bGwgUG93ZXIgU3RhdGUuICovCisgICAgICAgICAgICBpZiAocE1zZy0+c3RhdHVzQ29kZSAhPSBlU0lSX1NNRV9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dQLCBGTCgiUmVzcG9uc2UgbWVzc2FnZSB0byByZXF1ZXN0IHRvIGV4aXQgQk1QUyBpbmRpY2F0ZXMgZmFpbHVyZSwgc3RhdHVzICV4XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcE1zZy0+c3RhdHVzQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbWNFbnRlckZ1bGxQb3dlclN0YXRlKHBNYWMpOworICAgICAgICBicmVhazsKKworICAgICAgICAvKiBXZSBnb3QgYSByZXNwb25zZSB0byBvdXIgU3RhcnQgVUFQU0QgcmVxdWVzdC4gICovCisgICAgICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfVUFQU0RfUlNQOgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJSY3ZkIGVXTklfUE1DX0VOVEVSX1VBUFNEX1JTUCB3aXRoIHN0YXR1cyA9ICVkXG4iKSwgcE1zZy0+c3RhdHVzQ29kZSk7CisgICAgICAgICAgICBpZiggZVNtZUNvbW1hbmRFbnRlclVhcHNkICE9IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiUmN2ZCBlV05JX1BNQ19FTlRFUl9VQVBTRF9SU1Agd2l0aG91dCByZXF1ZXN0XG4iKSk7CisgICAgICAgICAgICAgICAgZlJlbW92ZUNvbW1hbmQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDaGVjayB0aGF0IHdlIGFyZSBpbiB0aGUgY29ycmVjdCBzdGF0ZSBmb3IgdGhpcyBtZXNzYWdlLiAqLworICAgICAgICAgICAgaWYgKHBNYWMtPnBtYy5wbWNTdGF0ZSAhPSBSRVFVRVNUX1NUQVJUX1VBUFNEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiR290IEVudGVyIFVhcHNkIHJzcCBNZXNzYWdlIHdoaWxlIGluIHN0YXRlICVkXG4iKSwgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgLyogRW50ZXIgVUFQU0QgU3RhdGUgaWYgcmVzcG9uc2UgaW5kaWNhdGVzIHN1Y2Nlc3MuICovCisgICAgICAgICAgICBpZiAocE1zZy0+c3RhdHVzQ29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbWNFbnRlclVhcHNkU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICAgcG1jRG9TdGFydFVhcHNkQ2FsbGJhY2tzKHBNYWMsIGVIQUxfU1RBVFVTX1NVQ0NFU1MpOworICAgICAgICAgfQorICAgICAgICAgLyogSWYgcmVzcG9uc2UgaXMgZmFpbHVyZSwgdGhlbiB3ZSB0cnkgdG8gcHV0IHRoZSBjaGlwIGJhY2sgaW4KKyAgICAgICAgICAgIEJNUFMgbW9kZSovCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogcmVzcG9uc2UgbWVzc2FnZSB0byByZXF1ZXN0IHRvIGVudGVyICIKKyAgICAgICAgICAgICAgICAgICAiVUFQU0QgaW5kaWNhdGVzIGZhaWx1cmUsIHN0YXR1cyAleFxuIiwgcE1zZy0+c3RhdHVzQ29kZSk7CisgICAgICAgICAgICAgICAgLy9OZWVkIHRvIHJlc2V0IHRoZSBVQVBTRCBmbGFnIHNvIHBtY0VudGVyQm1wc1N0YXRlIHdvbid0IHRyeSB0byBlbnRlciBVQVBTRC4KKyAgICAgICAgICAgICAgICBwTWFjLT5wbWMudWFwc2RTZXNzaW9uUmVxdWlyZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwbWNFbnRlckJtcHNTdGF0ZShwTWFjKTsKKyAgICAgICAgICAgICAgICAvL1VBUFNEIHdpbGwgbm90IGJlIHJldGllZCBpbiB0aGlzIGNhc2Ugc28gdGVsbCByZXF1ZXN0ZXIgd2UgYXJlIGRvbmUgd2l0aCBmYWlsdXJlCisgICAgICAgICAgICAgICAgcG1jRG9TdGFydFVhcHNkQ2FsbGJhY2tzKHBNYWMsIGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFdlIGdvdCBhIHJlc3BvbnNlIHRvIG91ciBTdG9wIFVBUFNEIHJlcXVlc3QuICAqLworICAgICAgY2FzZSBlV05JX1BNQ19FWElUX1VBUFNEX1JTUDoKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiUmN2ZCBlV05JX1BNQ19FWElUX1VBUFNEX1JTUCB3aXRoIHN0YXR1cyA9ICVkXG4iKSwgcE1zZy0+c3RhdHVzQ29kZSk7CisgICAgICAgICAgICBpZiggZVNtZUNvbW1hbmRFeGl0VWFwc2QgIT0gcENvbW1hbmQtPmNvbW1hbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiUmN2ZCBlV05JX1BNQ19FWElUX1VBUFNEX1JTUCB3aXRob3V0IHJlcXVlc3RcbiIpKTsKKyAgICAgICAgICAgICAgICBmUmVtb3ZlQ29tbWFuZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgd2UgYXJlIGluIHRoZSBjb3JyZWN0IHN0YXRlIGZvciB0aGlzIG1lc3NhZ2UuICovCisgICAgICAgICAgICBpZiAocE1hYy0+cG1jLnBtY1N0YXRlICE9IFJFUVVFU1RfU1RPUF9VQVBTRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkdvdCBFeGl0IFVhcHNkIHJzcCBNZXNzYWdlIHdoaWxlIGluIHN0YXRlICVkXG4iKSwgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgLyogRW50ZXIgQk1QUyBTdGF0ZSAqLworICAgICAgICAgaWYgKHBNc2ctPnN0YXR1c0NvZGUgIT0gZVNJUl9TTUVfU1VDQ0VTUykgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR1AsICJQTUM6IHJlc3BvbnNlIG1lc3NhZ2UgdG8gcmVxdWVzdCB0byBleGl0ICIKKyAgICAgICAgICAgICAgICJVQVBTRCBpbmRpY2F0ZXMgZmFpbHVyZSwgc3RhdHVzICV4XG4iLCBwTXNnLT5zdGF0dXNDb2RlKTsKKyAgICAgICAgIH0KKyAgICAgICAgICAgIHBtY0VudGVyQm1wc1N0YXRlKHBNYWMpOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFdlIGdvdCBhIHJlc3BvbnNlIHRvIG91ciBlbnRlciBXT1dMIHJlcXVlc3QuICAqLworICAgICAgY2FzZSBlV05JX1BNQ19FTlRFUl9XT1dMX1JTUDoKKworICAgICAgICAgICAgaWYoIGVTbWVDb21tYW5kRW50ZXJXb3dsICE9IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIlJjdmQgZVdOSV9QTUNfRU5URVJfV09XTF9SU1Agd2l0aG91dCByZXF1ZXN0XG4iKSk7CisgICAgICAgICAgICAgICAgZlJlbW92ZUNvbW1hbmQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDaGVjayB0aGF0IHdlIGFyZSBpbiB0aGUgY29ycmVjdCBzdGF0ZSBmb3IgdGhpcyBtZXNzYWdlLiAqLworICAgICAgICAgICAgaWYgKHBNYWMtPnBtYy5wbWNTdGF0ZSAhPSBSRVFVRVNUX0VOVEVSX1dPV0wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJHb3QgZVdOSV9QTUNfRU5URVJfV09XTF9SU1Agd2hpbGUgaW4gc3RhdGUgJXNcbiIpLCAKKyAgICAgICAgICAgICAgICAgICAgcG1jR2V0UG1jU3RhdGVTdHIocE1hYy0+cG1jLnBtY1N0YXRlKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIC8qIEVudGVyIFdPV0wgU3RhdGUgaWYgcmVzcG9uc2UgaW5kaWNhdGVzIHN1Y2Nlc3MuICovCisgICAgICAgICBpZiAocE1zZy0+c3RhdHVzQ29kZSA9PSBlU0lSX1NNRV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcG1jRW50ZXJXb3dsU3RhdGUocE1hYyk7CisgICAgICAgICAgICAgICAgcG1jRG9FbnRlcldvd2xDYWxsYmFja3MocE1hYywgZUhBTF9TVEFUVVNfU1VDQ0VTUyk7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIElmIHJlc3BvbnNlIGlzIGZhaWx1cmUsIHRoZW4gd2UgdHJ5IHRvIHB1dCB0aGUgY2hpcCBiYWNrIGluCisgICAgICAgICAgICBCTVBTIG1vZGUqLworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogcmVzcG9uc2UgbWVzc2FnZSB0byByZXF1ZXN0IHRvIGVudGVyICIKKyAgICAgICAgICAgICAgICJXT1dMIGluZGljYXRlcyBmYWlsdXJlLCBzdGF0dXMgJXhcbiIsIHBNc2ctPnN0YXR1c0NvZGUpOworICAgICAgICAgICAgICAgIHBtY0VudGVyQm1wc1N0YXRlKHBNYWMpOworICAgICAgICAgICAgICAgIHBtY0RvRW50ZXJXb3dsQ2FsbGJhY2tzKHBNYWMsIGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFdlIGdvdCBhIHJlc3BvbnNlIHRvIG91ciBleGl0IFdPV0wgcmVxdWVzdC4gICovCisgICAgICBjYXNlIGVXTklfUE1DX0VYSVRfV09XTF9SU1A6CisKKyAgICAgICAgICAgIGlmKCBlU21lQ29tbWFuZEV4aXRXb3dsICE9IHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIlJjdmQgZVdOSV9QTUNfRVhJVF9XT1dMX1JTUCB3aXRob3V0IHJlcXVlc3RcbiIpKTsKKyAgICAgICAgICAgICAgICBmUmVtb3ZlQ29tbWFuZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgd2UgYXJlIGluIHRoZSBjb3JyZWN0IHN0YXRlIGZvciB0aGlzIG1lc3NhZ2UuICovCisgICAgICAgICAgICBpZiAocE1hYy0+cG1jLnBtY1N0YXRlICE9IFJFUVVFU1RfRVhJVF9XT1dMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiR290IEV4aXQgV09XTCByc3AgTWVzc2FnZSB3aGlsZSBpbiBzdGF0ZSAlZFxuIiksIHBNYWMtPnBtYy5wbWNTdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIC8qIEVudGVyIEJNUFMgU3RhdGUgKi8KKyAgICAgICAgIGlmIChwTXNnLT5zdGF0dXNDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dQLCAiUE1DOiByZXNwb25zZSBtZXNzYWdlIHRvIHJlcXVlc3QgdG8gZXhpdCAiCisgICAgICAgICAgICAgICAiV09XTCBpbmRpY2F0ZXMgZmFpbHVyZSwgc3RhdHVzICV4XG4iLCBwTXNnLT5zdGF0dXNDb2RlKTsKKyAgICAgICAgIH0KKyAgICAgICAgICAgIHBtY0VudGVyQm1wc1N0YXRlKHBNYWMpOworICAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkludmFsaWQgbWVzc2FnZSB0eXBlICVkIHJlY2VpdmVkXG4iKSwgcE1zZy0+bWVzc2FnZVR5cGUpOworICAgICAgICBQTUNfQUJPUlQ7CisgICAgICAgIGJyZWFrOworICAgICAgICB9Ly9zd2l0Y2gKKworICAgICAgICBpZiggZlJlbW92ZUNvbW1hbmQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY3NyTExSZW1vdmVFbnRyeSggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBwRW50cnksIExMX0FDQ0VTU19MT0NLICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtY1JlbGVhc2VDb21tYW5kKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICAgICAgICAgIHNtZVByb2Nlc3NQZW5kaW5nUXVldWUoIHBNYWMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIm1lc3NhZ2UgdHlwZSAlZCByZWNlaXZlZCBidXQgbm8gcmVxdWVzdCBpcyBmb3VuZFxuIiksIHBNc2ctPm1lc3NhZ2VUeXBlKTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jTWVzc2FnZVByb2Nlc3NvcgorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgUHJvY2VzcyBhIG1lc3NhZ2UgcmVjZWl2ZWQgYnkgUE1DLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIHBNc2cgLSBwb2ludGVyIHRvIHJlY2VpdmVkIG1lc3NhZ2UKKyoKKyogUmV0dXJuczoKKyogICAgbm90aGluZworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwbWNNZXNzYWdlUHJvY2Vzc29yICh0SGFsSGFuZGxlIGhIYWwsIHRTaXJTbWVSc3AgKnBNc2cpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNNZXNzYWdlUHJvY2Vzc29yLCBtZXNzYWdlIHR5cGUgJWRcbiIpLCBwTXNnLT5tZXNzYWdlVHlwZSk7CisKKyAgICBzd2l0Y2goIHBNc2ctPm1lc3NhZ2VUeXBlICkKKyAgICB7CisgICAgY2FzZSBlV05JX1BNQ19FWElUX0JNUFNfSU5EOgorICAgIC8vV2hlbiBQTUMgbmVlZHMgdG8gaGFuZGxlIG1vcmUgaW5kaWNhdGlvbiBmcm9tIFBFLCB0aGV5IG5lZWQgdG8gYmUgYWRkZWQgaGVyZS4KKyAgICB7CisgICAgICAgIC8qIERldmljZSBsZWZ0IEJNUFMgb24gaXRzIG93bi4gKi8KKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1csIEZMKCJSY3ZkIGVXTklfUE1DX0VYSVRfQk1QU19JTkQgd2l0aCBzdGF0dXMgPSAlZFxuIiksIHBNc2ctPnN0YXR1c0NvZGUpOworICAgICAgICAvKiBDaGVjayB0aGF0IHdlIGFyZSBpbiB0aGUgY29ycmVjdCBzdGF0ZSBmb3IgdGhpcyBtZXNzYWdlLiAqLworICAgICAgICBzd2l0Y2gocE1hYy0+cG1jLnBtY1N0YXRlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQk1QUzoKKyAgICAgICAgY2FzZSBSRVFVRVNUX1NUQVJUX1VBUFNEOgorICAgICAgICBjYXNlIFVBUFNEOgorICAgICAgICBjYXNlIFJFUVVFU1RfU1RPUF9VQVBTRDoKKyAgICAgICAgY2FzZSBSRVFVRVNUX0VOVEVSX1dPV0w6CisgICAgICAgIGNhc2UgV09XTDoKKyAgICAgICAgY2FzZSBSRVFVRVNUX0VYSVRfV09XTDoKKyAgICAgICAgY2FzZSBSRVFVRVNUX0ZVTExfUE9XRVI6CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIkdvdCBlV05JX1BNQ19FWElUX0JNUFNfSU5EIHdoaWxlIGluIHN0YXRlICVkXG4iKSwgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJHb3QgZVdOSV9QTUNfRVhJVF9CTVBTX0lORCB3aGlsZSBpbiBzdGF0ZSAlZFxuIiksIHBNYWMtPnBtYy5wbWNTdGF0ZSk7CisgICAgICAgICAgICBQTUNfQUJPUlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVudGVyIEZ1bGwgUG93ZXIgU3RhdGUuICovCisgICAgICAgIGlmIChwTXNnLT5zdGF0dXNDb2RlICE9IGVTSVJfU01FX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dQLCBGTCgiRXhpdCBCTVBTIGluZGljYXRpb24gaW5kaWNhdGVzIGZhaWx1cmUsIHN0YXR1cyAleFxuIiksIHBNc2ctPnN0YXR1c0NvZGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdHBTaXJTbWVFeGl0Qm1wc0luZCBwRXhpdEJtcHNJbmQgPSAodHBTaXJTbWVFeGl0Qm1wc0luZClwTXNnOworICAgICAgICAgICAgcG1jRW50ZXJSZXF1ZXN0RnVsbFBvd2VyU3RhdGUoaEhhbCwgcEV4aXRCbXBzSW5kLT5leGl0Qm1wc1JlYXNvbik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgcG1jUHJvY2Vzc1Jlc3BvbnNlKCBwTWFjLCBwTXNnICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworfQorCisKK3RBTklfQk9PTEVBTiBwbWNWYWxpZGF0ZUNvbm5lY3RTdGF0ZSggdEhhbEhhbmRsZSBoSGFsICkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICAgaWYgKCAhY3NySXNJbmZyYUNvbm5lY3RlZCggcE1hYyApICkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiUE1DOiBTVEEgbm90IGFzc29jaWF0ZWQuIEJNUFMgY2Fubm90IGJlIGVudGVyZWRcbiIpOworICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgIH0KKworICAgLy9DYW5ub3QgaGF2ZSBvdGhlciBzZXNzaW9uCisgICBpZiAoIGNzcklzSUJTU1N0YXJ0ZWQoIHBNYWMgKSApCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HVywgIlBNQzogSUJTUyBzdGFydGVkLiBCTVBTIGNhbm5vdCBiZSBlbnRlcmVkXG4iKTsKKyAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICB9CisgICBpZiAoIGNzcklzQlRBTVBTdGFydGVkKCBwTWFjICkgKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR1csICJQTUM6IEJULUFNUCBleGlzdHMuIEJNUFMgY2Fubm90IGJlIGVudGVyZWRcbiIpOworICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgIH0KKyAgIGlmICgodm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZygpKSAmJiAKKyAgICAgICAgY3NySXNDb25jdXJyZW50SW5mcmFDb25uZWN0ZWQoIHBNYWMgKSkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiUE1DOiBNdWx0aXBsZSBhY3RpdmUgc2Vzc2lvbnMgZXhpc3RzLiBCTVBTIGNhbm5vdCBiZSBlbnRlcmVkXG4iKTsKKyAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICB9CisgICByZXR1cm4gZUFOSV9CT09MRUFOX1RSVUU7Cit9CisKK3RBTklfQk9PTEVBTiBwbWNBbGxvd0ltcHMoIHRIYWxIYW5kbGUgaEhhbCApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgLy9DYW5ub3QgaGF2ZSBvdGhlciBzZXNzaW9uIGxpa2UgSUJTUyBvciBCVCBBTVAgcnVubmluZworICAgIGlmICggY3NySXNJQlNTU3RhcnRlZCggcE1hYyApICkKKyAgICB7CisgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJQTUM6IElCU1Mgc3RhcnRlZC4gSU1QUyBjYW5ub3QgYmUgZW50ZXJlZFxuIik7CisgICAgICAgcmV0dXJuIGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCBjc3JJc0JUQU1QU3RhcnRlZCggcE1hYyApICkKKyAgICB7CisgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJQTUM6IEJULUFNUCBleGlzdHMuIElNUFMgY2Fubm90IGJlIGVudGVyZWRcbiIpOworICAgICAgIHJldHVybiBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgfQorCisgICAgLy9BbGwgc2Vzc2lvbnMgbXVzdCBiZSBkaXNjb25uZWN0ZWQgdG8gYWxsb3cgSU1QUworICAgIGlmICggIWNzcklzQWxsU2Vzc2lvbkRpc2Nvbm5lY3RlZCggcE1hYyApICkKKyAgICB7CisgICAgICAgc21zTG9nKHBNYWMsIExPR1csICJQTUM6IEF0bGVhc3Qgb25lIGNvbm5lY3RlZCBzZXNzaW9uLiBJTVBTIGNhbm5vdCBiZSBlbnRlcmVkXG4iKTsKKyAgICAgICByZXR1cm4gZUFOSV9CT09MRUFOX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBlQU5JX0JPT0xFQU5fVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jUmVxdWVzdEJtcHMKKyoKKyogRGVzY3JpcHRpb246CisqICAgIFJlcXVlc3QgdGhhdCB0aGUgZGV2aWNlIGJlIHB1dCBpbiBCTVBTIHN0YXRlLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIGNhbGxiYWNrUm91dGluZSAtIENhbGxiYWNrIHJvdXRpbmUgaW52b2tlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MvZmFpbHVyZQorKiAgICBjYWxsYmFja0NvbnRleHQgLSB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHJvdXRpbmUgc3BlY2lmaWVkCisqICAgICAgICAgICAgICAgICAgICAgIGFib3ZlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBkZXZpY2UgaXMgaW4gQk1QUyBzdGF0ZQorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gZGV2aWNlIGNhbm5vdCBiZSBicm91Z2h0IHRvIEJNUFMgc3RhdGUKKyogICAgZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgLSBkZXZpY2UgaXMgYmVpbmcgYnJvdWdodCB0byBCTVBTIHN0YXRlLAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNSZXF1ZXN0Qm1wcyAoCisgICAgdEhhbEhhbmRsZSBoSGFsLAorICAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKSwKKyAgICB2b2lkICpjYWxsYmFja0NvbnRleHQpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICB0cFJlcXVlc3RCbXBzRW50cnkgcEVudHJ5OworICAgZUhhbFN0YXR1cyBzdGF0dXM7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICAgIAorICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYocHNSZXF1ZXN0LCB2b3NfZXZlbnRfd2xhbl9wb3dlcnNhdmVfcGF5bG9hZF90eXBlKTsKKworICAgdm9zX21lbV96ZXJvKCZwc1JlcXVlc3QsIHNpemVvZih2b3NfZXZlbnRfd2xhbl9wb3dlcnNhdmVfcGF5bG9hZF90eXBlKSk7CisgICBwc1JlcXVlc3QuZXZlbnRfc3VidHlwZSA9IFdMQU5fQk1QU19FTlRFUl9SRVE7CisKKyAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZwc1JlcXVlc3QsIEVWRU5UX1dMQU5fUE9XRVJTQVZFX0dFTkVSSUMpOworI2VuZGlmCisKKyAgIHNtc0xvZyhwTWFjLCBMT0cyLCAiUE1DOiBlbnRlcmluZyBwbWNSZXF1ZXN0Qm1wcyIpOworCisgICAvKiBJZiBhbHJlYWR5IGluIEJNUFMsIGp1c3QgcmV0dXJuLiAqLworICAgaWYgKHBNYWMtPnBtYy5wbWNTdGF0ZSA9PSBCTVBTIHx8IFJFUVVFU1RfU1RBUlRfVUFQU0QgPT0gcE1hYy0+cG1jLnBtY1N0YXRlIHx8IFVBUFNEID09IHBNYWMtPnBtYy5wbWNTdGF0ZSkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0cyLCAiUE1DOiBEZXZpY2UgYWxyZWFkeSBpbiBCTVBTIHBtY1N0YXRlICVkIiwgcE1hYy0+cG1jLnBtY1N0YXRlKTsKKyAgICAgIHBNYWMtPnBtYy5ibXBzUmVxdWVzdGVkQnlIZGQgPSBUUlVFOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisgICAKKyAgIHN0YXR1cyA9IHBtY0VudGVyQm1wc0NoZWNrKCBwTWFjICk7CisgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApKQorICAgeworICAgICAgc3RhdHVzID0gcG1jRW50ZXJSZXF1ZXN0Qm1wc1N0YXRlKGhIYWwpOworICAgICAgLyogRW50ZXIgUmVxdWVzdCBCTVBTIFN0YXRlLiAqLworICAgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgIHsKKyAgICAgICAgIC8qIFJlbWVtYmVyIHRoYXQgSEREIHJlcXVlc3RlZCBCTVBTLiBUaGlzIGZsYWcgd2lsbCBiZSB1c2VkIHRvIHB1dCB0aGUKKyAgICAgICAgICAgIGRldmljZSBiYWNrIGludG8gQk1QUyBpZiBhbnkgbW9kdWxlIG90aGVyIHRoYW4gSEREIChlLmcuIENTUiwgUW9TLCBvciBCQVApCisgICAgICAgICAgICByZXF1ZXN0cyBmdWxsIHBvd2VyIGZvciBhbnkgcmVhc29uICovCisgICAgICAgICBwTWFjLT5wbWMuYm1wc1JlcXVlc3RlZEJ5SGRkID0gVFJVRTsKKworICAgICAgICAgLyogSWYgYWJsZSB0byBlbnRlciBSZXF1ZXN0IEJNUFMgU3RhdGUsIHRoZW4gcmVxdWVzdCBpcyBwZW5kaW5nLgorICAgICAgICAgICAgQWxsb2NhdGUgZW50cnkgZm9yIHJlcXVlc3QgQk1QUyBjYWxsYmFjayByb3V0aW5lIGxpc3QuICovCisgICAgICAgICBpZiAocGFsQWxsb2NhdGVNZW1vcnkoCisgICAgICAgICAgICAgICBwTWFjLT5oSGRkLCAodm9pZCAqKikmcEVudHJ5LAorICAgICAgICAgICAgICAgc2l6ZW9mKHRSZXF1ZXN0Qm1wc0VudHJ5KSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZXF1ZXN0ICIKKyAgICAgICAgICAgICAgICAgICJCTVBTIHJvdXRpbmUgbGlzdCBlbnRyeVxuIik7CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogU3RvcmUgcm91dGluZSBhbmQgY29udGV4dCBpbiBlbnRyeS4gKi8KKyAgICAgICAgIHBFbnRyeS0+Y2FsbGJhY2tSb3V0aW5lID0gY2FsbGJhY2tSb3V0aW5lOworICAgICAgICAgcEVudHJ5LT5jYWxsYmFja0NvbnRleHQgPSBjYWxsYmFja0NvbnRleHQ7CisKKyAgICAgICAgIC8qIEFkZCBlbnRyeSB0byBsaXN0LiAqLworICAgICAgICAgY3NyTExJbnNlcnRUYWlsKCZwTWFjLT5wbWMucmVxdWVzdEJtcHNMaXN0LCAmcEVudHJ5LT5saW5rLCBGQUxTRSk7CisKKyAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBOYW1lOiAgcG1jU3RhcnRVYXBzZAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgUmVxdWVzdCB0aGF0IHRoZSBkZXZpY2UgYmUgcHV0IGluIFVBUFNEIHN0YXRlLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIGNhbGxiYWNrUm91dGluZSAtIENhbGxiYWNrIHJvdXRpbmUgaW52b2tlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MvZmFpbHVyZQorKiAgICBjYWxsYmFja0NvbnRleHQgLSB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHJvdXRpbmUgc3BlY2lmaWVkCisqICAgICAgICAgICAgICAgICAgICAgIGFib3ZlCisqCisqIFJldHVybnM6CisqICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBkZXZpY2UgaXMgaW4gVUFQU0Qgc3RhdGUKKyogICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIGRldmljZSBjYW5ub3QgYmUgYnJvdWdodCB0byBVQVBTRCBzdGF0ZQorKiAgICBlSEFMX1NUQVRVU19QTUNfUEVORElORyAtIGRldmljZSBpcyBiZWluZyBicm91Z2h0IHRvIFVBUFNEIHN0YXRlCisqICAgIGVIQUxfU1RBVFVTX1BNQ19ESVNBQkxFRCAtIFVBUFNEIGlzIGRpc2FibGVkIG9yIEJNUFMgbW9kZSBpcyBkaXNhYmxlZAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNTdGFydFVhcHNkICgKKyAgICB0SGFsSGFuZGxlIGhIYWwsCisgICAgdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgZUhhbFN0YXR1cyBzdGF0dXMpLAorICAgIHZvaWQgKmNhbGxiYWNrQ29udGV4dCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgIHRwU3RhcnRVYXBzZEVudHJ5IHBFbnRyeTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICBXTEFOX1ZPU19ESUFHX0VWRU5UX0RFRihwc1JlcXVlc3QsIHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpOworCisgICB2b3NfbWVtX3plcm8oJnBzUmVxdWVzdCwgc2l6ZW9mKHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpKTsKKyAgIHBzUmVxdWVzdC5ldmVudF9zdWJ0eXBlID0gV0xBTl9VQVBTRF9TVEFSVF9SRVE7CisKKyAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZwc1JlcXVlc3QsIEVWRU5UX1dMQU5fUE9XRVJTQVZFX0dFTkVSSUMpOworI2VuZGlmCisKKyAgIHNtc0xvZyhwTWFjLCBMT0cyLCAiUE1DOiBlbnRlcmluZyBwbWNTdGFydFVhcHNkIik7CisKKyAgIGlmKCAhUE1DX0lTX1JFQURZKHBNYWMpICkKKyAgIHsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlJlcXVlc3RpbmcgVUFQU0Qgd2hlbiBQTUMgbm90IHJlYWR5XG4iKSk7CisgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJwbWNSZWFkeSA9ICVkIHBtY1N0YXRlID0gJXNcbiIpLCAKKyAgICAgICAgICAgcE1hYy0+cG1jLnBtY1JlYWR5LCBwbWNHZXRQbWNTdGF0ZVN0cihwTWFjLT5wbWMucG1jU3RhdGUpKTsKKyAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgLyogQ2hlY2sgaWYgQk1QUyBpcyBlbmFibGVkLiAqLworICAgaWYgKCFwTWFjLT5wbWMuYm1wc0VuYWJsZWQpCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogQ2Fubm90IGVudGVyIFVBUFNELiBCTVBTIGlzIGRpc2FibGVkXG4iKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19QTUNfRElTQUJMRUQ7CisgICB9CisKKyAgIC8qIENoZWNrIGlmIFVBUFNEIGlzIGVuYWJsZWQuICovCisgICBpZiAoIXBNYWMtPnBtYy51YXBzZEVuYWJsZWQpCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogQ2Fubm90IGVudGVyIFVBUFNELiBVQVBTRCBpcyBkaXNhYmxlZFxuIik7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfUE1DX0RJU0FCTEVEOworICAgfQorCisgICAvKiBJZiBhbHJlYWR5IGluIFVBUFNELCBqdXN0IHJldHVybi4gKi8KKyAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgPT0gVUFQU0QpCisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgLyogQ2hlY2sgdGhhdCB3ZSBhcmUgYXNzb2NpYXRlZC4gKi8KKyAgIGlmICghcG1jVmFsaWRhdGVDb25uZWN0U3RhdGUoIHBNYWMgKSkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBTVEEgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBBUC4gVUFQU0QgY2Fubm90IGJlIGVudGVyZWRcbiIpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIEVudGVyIFJFUVVFU1RfU1RBUlRfVUFQU0QgU3RhdGUuICovCisgICBpZiAocG1jRW50ZXJSZXF1ZXN0U3RhcnRVYXBzZFN0YXRlKGhIYWwpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgaWYoIE5VTEwgIT0gY2FsbGJhY2tSb3V0aW5lICkKKyAgIHsKKyAgICAgIC8qIElmIHN1Y2Nlc3MgdGhlbiByZXF1ZXN0IGlzIHBlbmRpbmcuIEFsbG9jYXRlIGVudHJ5IGZvciBjYWxsYmFjayByb3V0aW5lIGxpc3QuICovCisgICAgICBpZiAocGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBFbnRyeSwKKyAgICAgICAgICAgIHNpemVvZih0U3RhcnRVYXBzZEVudHJ5KSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZXF1ZXN0ICIKKyAgICAgICAgICAgICJzdGFydCBVQVBTRCByb3V0aW5lIGxpc3QgZW50cnlcbiIpOworICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICB9CisKKyAgICAgIC8qIFN0b3JlIHJvdXRpbmUgYW5kIGNvbnRleHQgaW4gZW50cnkuICovCisgICAgICBwRW50cnktPmNhbGxiYWNrUm91dGluZSA9IGNhbGxiYWNrUm91dGluZTsKKyAgICAgIHBFbnRyeS0+Y2FsbGJhY2tDb250ZXh0ID0gY2FsbGJhY2tDb250ZXh0OworCisgICAgICAvKiBBZGQgZW50cnkgdG8gbGlzdC4gKi8KKyAgICAgIGNzckxMSW5zZXJ0VGFpbCgmcE1hYy0+cG1jLnJlcXVlc3RTdGFydFVhcHNkTGlzdCwgJnBFbnRyeS0+bGluaywgRkFMU0UpOworICAgfQorCisgICByZXR1cm4gZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY1N0b3BVYXBzZAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgUmVxdWVzdCB0aGF0IHRoZSBkZXZpY2UgYmUgcHV0IG91dCBvZiBVQVBTRCBzdGF0ZS4KKyoKKyogUGFyYW1ldGVyczoKKyogICAgaEhhbCAtIEhBTCBoYW5kbGUgZm9yIGRldmljZQorKgorKiBSZXR1cm5zOgorKiAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gZGV2aWNlIGlzIHB1dCBvdXQgb2YgVUFQU0QgYW5kIGJhY2sgaW4gQk1QUyBzdGF0ZQorKiAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gZGV2aWNlIGNhbm5vdCBiZSBicm91Z2h0IG91dCBvZiBVQVBTRCBzdGF0ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBwbWNTdG9wVWFwc2QgKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICBXTEFOX1ZPU19ESUFHX0VWRU5UX0RFRihwc1JlcXVlc3QsIHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpOworCisgICB2b3NfbWVtX3plcm8oJnBzUmVxdWVzdCwgc2l6ZW9mKHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpKTsKKyAgIHBzUmVxdWVzdC5ldmVudF9zdWJ0eXBlID0gV0xBTl9VQVBTRF9TVE9QX1JFUTsKKworICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnBzUmVxdWVzdCwgRVZFTlRfV0xBTl9QT1dFUlNBVkVfR0VORVJJQyk7CisjZW5kaWYKKworICAgc21zTG9nKHBNYWMsIExPRzIsICJQTUM6IGVudGVyaW5nIHBtY1N0b3BVYXBzZCIpOworCisgICAvKiBDbGVhciBhbnkgYnVmZmVyZWQgY29tbWFuZCBmb3IgZW50ZXJpbmcgVUFQU0QgKi8KKyAgIHBNYWMtPnBtYy51YXBzZFNlc3Npb25SZXF1aXJlZCA9IEZBTFNFOworCisgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUgaWYgd2UgYXJlIGFscmVhZHkgb3V0IG9mIFVBUFNELiBUaGlzIGNhbiBoYXBwZW4gaWYKKyAgICAgIHNvbWUgb3RoZXIgbW9kdWxlIChIREQsIEJULUFNUCkgcmVxdWVzdGVkIEZ1bGwgUG93ZXIuKi8KKyAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgIT0gVUFQU0QgJiYgcE1hYy0+cG1jLnBtY1N0YXRlICE9IFJFUVVFU1RfU1RPUF9VQVBTRCkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiUE1DOiBEZXZpY2UgaXMgYWxyZWFkeSBvdXQgb2YgVUFQU0QgIgorICAgICAgICAgInN0YXRlLiBDdXJyZW50IHN0YXRlIGlzICVkXG4iLCBwTWFjLT5wbWMucG1jU3RhdGUpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIC8qIEVudGVyIFJFUVVFU1RfU1RPUF9VQVBTRCBTdGF0ZSovCisgICBpZiAocG1jRW50ZXJSZXF1ZXN0U3RvcFVhcHNkU3RhdGUoaEhhbCkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHBtY1JlcXVlc3RTdGFuZGJ5CisgICAgXGJyaWVmICBSZXF1ZXN0IHRoYXQgdGhlIGRldmljZSBiZSBwdXQgaW4gc3RhbmRieS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBjYWxsYmFja1JvdXRpbmUgLSBDYWxsYmFjayByb3V0aW5lIGludm9rZWQgaW4gY2FzZSBvZiBzdWNjZXNzL2ZhaWx1cmUKKyAgICBccGFyYW0gIGNhbGxiYWNrQ29udGV4dCAtIHZhbHVlIHRvIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8gY2FsbGJhY2sKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgIAorICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIGRldmljZSBpcyBpbiBTdGFuZGJ5IG1vZGUKKyAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBkZXZpY2UgY2Fubm90IGJlIHB1dCBpbiBzdGFuZGJ5IG1vZGUKKyAgICAgIGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HIC0gZGV2aWNlIGlzIGJlaW5nIHB1dCBpbiBzdGFuZGJ5IG1vZGUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBlSGFsU3RhdHVzIHBtY1JlcXVlc3RTdGFuZGJ5ICgKKyAgIHRIYWxIYW5kbGUgaEhhbCwKKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKSwKKyAgIHZvaWQgKmNhbGxiYWNrQ29udGV4dCkKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICBXTEFOX1ZPU19ESUFHX0VWRU5UX0RFRihwc1JlcXVlc3QsIHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpOworCisgICB2b3NfbWVtX3plcm8oJnBzUmVxdWVzdCwgc2l6ZW9mKHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV9wYXlsb2FkX3R5cGUpKTsKKyAgIHBzUmVxdWVzdC5ldmVudF9zdWJ0eXBlID0gV0xBTl9FTlRFUl9TVEFOREJZX1JFUTsKKworICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJnBzUmVxdWVzdCwgRVZFTlRfV0xBTl9QT1dFUlNBVkVfR0VORVJJQyk7CisjZW5kaWYKKworICAgc21zTG9nKHBNYWMsIExPRzIsICJQTUM6IGVudGVyaW5nIHBtY1JlcXVlc3RTdGFuZGJ5Iik7CisKKyAgIC8qIENoZWNrIGlmIHN0YW5kYnkgaXMgZW5hYmxlZC4gKi8KKyAgIGlmICghcE1hYy0+cG1jLnN0YW5kYnlFbmFibGVkKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJQTUM6IENhbm5vdCBlbnRlciBzdGFuZGJ5LiBTdGFuZGJ5IGlzIGRpc2FibGVkXG4iKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19QTUNfRElTQUJMRUQ7CisgICB9CisKKyAgIGlmKCAhUE1DX0lTX1JFQURZKHBNYWMpICkKKyAgIHsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlJlcXVlc3Rpbmcgc3RhbmRieSB3aGVuIFBNQyBub3QgcmVhZHlcbiIpKTsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoInBtY1JlYWR5ID0gJWQgcG1jU3RhdGUgPSAlc1xuIiksIAorICAgICAgICAgICBwTWFjLT5wbWMucG1jUmVhZHksIHBtY0dldFBtY1N0YXRlU3RyKHBNYWMtPnBtYy5wbWNTdGF0ZSkpOworICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICAvKiBJZiBhbHJlYWR5IGluIFNUQU5EQlksIGp1c3QgcmV0dXJuLiAqLworICAgaWYgKHBNYWMtPnBtYy5wbWNTdGF0ZSA9PSBTVEFOREJZKQorICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIAorICAgaWYgKGNzcklzSUJTU1N0YXJ0ZWQocE1hYykgfHwgY3NySXNCVEFNUFN0YXJ0ZWQocE1hYykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgCisgICAgICAgICAgIldMQU46IElCU1Mgb3IgQlQtQU1QIHNlc3Npb24gcHJlc2VudC4gQ2Fubm90IGhvbm9yIHN0YW5kYnkgcmVxdWVzdCIpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1BNQ19OT1RfTk9XOworICAgfQorCisgICAvKiBFbnRlciBSZXF1ZXN0IFN0YW5kYnkgU3RhdGUuICovCisgICBpZiAocG1jRW50ZXJSZXF1ZXN0U3RhbmRieVN0YXRlKGhIYWwpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgLyogU2F2ZSB0aGUgY2FsbGJhY2sgcm91dGluZSBmb3Igd2hlbiB3ZSBuZWVkIGl0LiAqLworICAgcE1hYy0+cG1jLnN0YW5kYnlDYWxsYmFja1JvdXRpbmUgPSBjYWxsYmFja1JvdXRpbmU7CisgICBwTWFjLT5wbWMuc3RhbmRieUNhbGxiYWNrQ29udGV4dCA9IGNhbGxiYWNrQ29udGV4dDsKKworICAgcmV0dXJuIGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gcG1jUmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZAorICAgIFxicmllZiAgUmVnaXN0ZXIgYSBjYWxsYmFjayByb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyCisgICAgICAgICAgICB0aGUgZGV2aWNlIGVudGVycyBhIG5ldyBkZXZpY2Ugc3RhdGUgKEZ1bGwgUG93ZXIsIEJNUFMsIFVBUFNEKQorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGNhbGxiYWNrUm91dGluZSAtICBDYWxsYmFjayByb3V0aW5lIHRvIGJlIHJlZ2lzdGVyZWQKKyAgICBccGFyYW0gIGNhbGxiYWNrQ29udGV4dCAtICBDb29raWUgdG8gYmUgcGFzc2VkIGJhY2sgZHVyaW5nIGNhbGxiYWNrCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBub3Qgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jUmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCAodEhhbEhhbmRsZSBoSGFsLCAKKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIHRQbWNTdGF0ZSBwbWNTdGF0ZSksCisgICB2b2lkICpjYWxsYmFja0NvbnRleHQpCit7CisKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdHBEZXZpY2VTdGF0ZVVwZGF0ZUluZEVudHJ5IHBFbnRyeTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiRW50ZXJpbmcgcG1jUmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCIpKTsKKworICAgIC8qIEFsbG9jYXRlIGVudHJ5IGZvciBkZXZpY2UgcG93ZXIgc3RhdGUgdXBkYXRlIGluZGljYXRpb24uICovCisgICAgaWYgKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICoqKSZwRW50cnksIHNpemVvZih0RGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeSkpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZSBwb3dlciBzdGF0ZSB1cGRhdGUgaW5kaWNhdGlvblxuIikpOworICAgICAgICBQTUNfQUJPUlQ7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIC8qIFN0b3JlIHJvdXRpbmUgaW4gZW50cnkuICovCisgICAgcEVudHJ5LT5jYWxsYmFja1JvdXRpbmUgPSBjYWxsYmFja1JvdXRpbmU7CisgICAgcEVudHJ5LT5jYWxsYmFja0NvbnRleHQgPSBjYWxsYmFja0NvbnRleHQ7CisKKyAgICAvKiBBZGQgZW50cnkgdG8gbGlzdC4gKi8KKyAgICBjc3JMTEluc2VydFRhaWwoJnBNYWMtPnBtYy5kZXZpY2VTdGF0ZVVwZGF0ZUluZExpc3QsICZwRW50cnktPmxpbmssIEZBTFNFKTsKKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gcG1jRGVyZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kCisgICAgXGJyaWVmICBEZXJlZ2lzdGVyIGEgcm91dGluZSB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBkZXZpY2Ugc3RhdGUgY2hhbmdlcworICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGNhbGxiYWNrUm91dGluZSAtICBDYWxsYmFjayByb3V0aW5lIHRvIGJlIGRlcmVnaXN0ZXJlZAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3NmdWxseSBkZXJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBub3Qgc3VjY2Vzc2Z1bGx5IGRlcmVnaXN0ZXJlZCAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBtY0RlcmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCAodEhhbEhhbmRsZSBoSGFsLCAKKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIHRQbWNTdGF0ZSBwbWNTdGF0ZSkpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRwRGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeSBwRGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiRW50ZXJpbmcgcG1jRGVyZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kIikpOworCisgICAgLyogRmluZCBlbnRyeSBpbiB0aGUgcG93ZXIgc2F2ZSB1cGRhdGUgcm91dGluZSBsaXN0IHRoYXQgbWF0Y2hlcworICAgICAgIHRoZSBzcGVjaWZpZWQgcm91dGluZSBhbmQgcmVtb3ZlIGl0LiAqLworICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoJnBNYWMtPnBtYy5kZXZpY2VTdGF0ZVVwZGF0ZUluZExpc3QsIEZBTFNFKTsKKyAgICB3aGlsZSAocEVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgICBwRGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeSA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0RGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeSwgbGluayk7CisgICAgICAgIGlmIChwRGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeS0+Y2FsbGJhY2tSb3V0aW5lID09IGNhbGxiYWNrUm91dGluZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjc3JMTFJlbW92ZUVudHJ5KCZwTWFjLT5wbWMuZGV2aWNlU3RhdGVVcGRhdGVJbmRMaXN0LCBwRW50cnksIEZBTFNFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCByZW1vdmUgZGV2aWNlIHN0YXRlIHVwZGF0ZSBpbmQgZW50cnkgZnJvbSBsaXN0XG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFsRnJlZU1lbW9yeShwTWFjLT5oSGRkLCBwRGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBmcmVlIG1lbW9yeSBmb3IgZGV2aWNlIHN0YXRlIHVwZGF0ZSBpbmQgcm91dGluZSBsaXN0IGVudHJ5XG4iKSk7CisgICAgICAgICAgICAgICAgUE1DX0FCT1JUOworICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgcEVudHJ5ID0gY3NyTExOZXh0KCZwTWFjLT5wbWMuZGV2aWNlU3RhdGVVcGRhdGVJbmRMaXN0LCBwRW50cnksIEZBTFNFKTsKKyAgICB9CisKKyAgICAvKiBDb3VsZCBub3QgZmluZCBtYXRjaGluZyBlbnRyeS4gKi8KKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHBtY1JlYWR5CisgICAgXGJyaWVmICBmbiB0byBpbmZvcm0gUE1DIHRoYXQgZVdOSV9TTUVfU1lTX1JFQURZX0lORCBoYXMgYmVlbiBzZW50IHRvIFBFLgorICAgICAgICAgICAgVGhpcyBhY3RzIGFzIGEgdHJpZ2dlciB0byBzZW5kIGEgbWVzc2FnZSB0byBQRSB0byB1cGRhdGUgdGhlIHBvd2VyCisgICAgICAgICAgICBzYXZlIHJlbGF0ZWQgY29uaWcgdG8gRlcuIE5vdGUgdGhhdCBpZiBIREQgY29uZmlndXJlcyBhbnkgcG93ZXIgc2F2ZQorICAgICAgICAgICAgcmVsYXRlZCBzdHVmZiBiZWZvcmUgdGhpcyBBUEkgaXMgaW52b2tlZCwgUE1DIHdpbGwgYnVmZmVyIGFsbCB0aGUgCisgICAgICAgICAgICBjb25maWd1dGFpb24uCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBwbWNSZWFkeSh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJFbnRlcmluZyBwbWNSZWFkeSIpKTsKKworICAgIGlmKHBNYWMtPnBtYy5wbWNTdGF0ZSA9PSBTVE9QUEVEKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR1AsIEZMKCJwbWNSZWFkeSBpcyBpbnZva2VkIGV2ZW4gYmVmb3JlIHBtY1N0YXJ0IikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwTWFjLT5wbWMucG1jUmVhZHkgPSBUUlVFOworICAgIGlmIChwbWNTZW5kUG93ZXJTYXZlQ29uZmlnTWVzc2FnZShoSGFsKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBwbWNXb3dsQWRkQmNhc3RQYXR0ZXJuCisgICAgXGJyaWVmICBBZGQgYSBwYXR0ZXJuIGZvciBQYXR0ZXJuIEJ5dGUgTWF0Y2hpbmcgaW4gV293bCBtb2RlLiBGaXJtd2FyZSB3aWxsCisgICAgICAgICAgICBkbyBhIHBhdHRlcm4gbWF0Y2ggb24gdGhlc2UgcGF0dGVybnMgd2hlbiBXb3dsIGlzIGVuYWJsZWQgZHVyaW5nIEJNUFMKKyAgICAgICAgICAgIG1vZGUuIE5vdGUgdGhhdCBGaXJtd2FyZSBwZXJmb3JtcyB0aGUgcGF0dGVybiBtYXRjaGluZyBvbmx5IG9uIAorICAgICAgICAgICAgYnJvYWRjYXN0IGZyYW1lcyBhbmQgd2hpbGUgTGlicmEgaXMgaW4gQk1QUyBtb2RlLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBhdHRlcm4gLSAgUG9pbnRlciB0byB0aGUgcGF0dGVybiB0byBiZSBhZGRlZAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAgICAgICAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAgQ2Fubm90IGFkZCBwYXR0ZXJuCisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTICBSZXF1ZXN0IGFjY2VwdGVkLiAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgcG1jV293bEFkZEJjYXN0UGF0dGVybiAoCisgICAgdEhhbEhhbmRsZSBoSGFsLCAKKyAgICB0cFNpcldvd2xBZGRCY2FzdFB0cm4gcGF0dGVybikKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisgICAgdm9zX2xvZ19wb3dlcnNhdmVfd293X2FkZF9wdHJuX3BrdF90eXBlICpsb2dfcHRyID0gTlVMTDsKKyAgICBXTEFOX1ZPU19ESUFHX0xPR19BTExPQyhsb2dfcHRyLCB2b3NfbG9nX3Bvd2Vyc2F2ZV93b3dfYWRkX3B0cm5fcGt0X3R5cGUsIExPR19XTEFOX1BPV0VSU0FWRV9XT1dfQUREX1BUUk5fQyk7CisjZW5kaWYgLy8jaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorCisgICAgc21zTG9nKHBNYWMsIExPRzIsICJQTUM6IGVudGVyaW5nIHBtY1dvd2xBZGRCY2FzdFBhdHRlcm4iKTsKKworICAgIGlmKHBhdHRlcm4gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiTnVsbCBicm9hZGNhc3QgcGF0dGVybiBiZWluZyBwYXNzZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAorICAgIGlmKCBsb2dfcHRyICkKKyAgICB7CisgICAgICAgbG9nX3B0ci0+cGF0dGVybl9pZCA9IHBhdHRlcm4tPnVjUGF0dGVybklkOworICAgICAgIGxvZ19wdHItPnBhdHRlcm5fYnl0ZV9vZmZzZXQgPSBwYXR0ZXJuLT51Y1BhdHRlcm5CeXRlT2Zmc2V0OworICAgICAgIGxvZ19wdHItPnBhdHRlcm5fc2l6ZSA9IHBhdHRlcm4tPnVjUGF0dGVyblNpemU7CisgICAgICAgbG9nX3B0ci0+cGF0dGVybl9tYXNrX3NpemUgPSBwYXR0ZXJuLT51Y1BhdHRlcm5NYXNrU2l6ZTsKKworICAgICAgIHZvc19tZW1fY29weShsb2dfcHRyLT5wYXR0ZXJuLCBwYXR0ZXJuLT51Y1BhdHRlcm4sIFNJUl9XT1dMX0JDQVNUX1BBVFRFUk5fTUFYX1NJWkUpOworICAgICAgIC8qIDEgYml0IGluIHRoZSBwYXR0ZXJuIG1hc2sgZGVub3RlcyAxIGJ5dGUgb2YgcGF0dGVybiBoZW5jZSBwYXR0ZXJuIG1hc2sgc2l6ZSBpcyAxLzggKi8KKyAgICAgICB2b3NfbWVtX2NvcHkobG9nX3B0ci0+cGF0dGVybl9tYXNrLCBwYXR0ZXJuLT51Y1BhdHRlcm5NYXNrLCBTSVJfV09XTF9CQ0FTVF9QQVRURVJOX01BWF9TSVpFID4+IDMpOworICAgIH0KKworICAgIFdMQU5fVk9TX0RJQUdfTE9HX1JFUE9SVChsb2dfcHRyKTsKKyNlbmRpZgorCisKKyAgICBpZihwYXR0ZXJuLT51Y1BhdHRlcm5JZCA+PSBTSVJfV09XTF9CQ0FTVF9NQVhfTlVNX1BBVFRFUk5TICkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiUGF0dGVybiBJZCBtdXN0IHJhbmdlIGZyb20gMCB0byAlZFxuIiksIFNJUl9XT1dMX0JDQVNUX01BWF9OVU1fUEFUVEVSTlMtMSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIGlmKCBwTWFjLT5wbWMucG1jU3RhdGUgPT0gU1RBTkRCWSB8fCBwTWFjLT5wbWMucG1jU3RhdGUgPT0gUkVRVUVTVF9TVEFOREJZICkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGFkZCBXb1dMIFBhdHRlcm4gYXMgY2hpcCBpcyBpbiAlcyBzdGF0ZVxuIiksCisgICAgICAgICAgIHBtY0dldFBtY1N0YXRlU3RyKHBNYWMtPnBtYy5wbWNTdGF0ZSkpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisgICAgaWYoIHBNYWMtPnBtYy5wbWNTdGF0ZSA9PSBJTVBTIHx8IHBNYWMtPnBtYy5wbWNTdGF0ZSA9PSBSRVFVRVNUX0lNUFMgKQorICAgIHsKKyAgICAgICAgLy9XYWtlIHVwIHRoZSBjaGlwIGZpcnN0CisgICAgICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gcG1jRGVmZXJNc2coIHBNYWMsIGVXTklfUE1DX1dPV0xfQUREX0JDQVNUX1BUUk4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgc2l6ZW9mKHRTaXJXb3dsQWRkQmNhc3RQdHJuKSApOworCisgICAgICAgIGlmKCBlSEFMX1NUQVRVU19QTUNfUEVORElORyA9PSBzdGF0dXMgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICAvL2VpdGhlciBmYWlsIG9yIGFscmVhZHkgaW4gZnVsbCBwb3dlcgorICAgICAgICAgICAgaWYoICFIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCBzdGF0dXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZWxzZSBsZXQgaXQgdGhyb3VnaCBiZWNhdXNlIGl0IGlzIGluIGZ1bGwgcG93ZXIgc3RhdGUKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwbWNTZW5kTWVzc2FnZShoSGFsLCBlV05JX1BNQ19XT1dMX0FERF9CQ0FTVF9QVFJOLCBwYXR0ZXJuLCBzaXplb2YodFNpcldvd2xBZGRCY2FzdFB0cm4pKQorICAgICAgICAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJTZW5kIG9mIGVXTklfUE1DX1dPV0xfQUREX0JDQVNUX1BUUk4gdG8gUEUgZmFpbGVkXG4iKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gcG1jV293bERlbEJjYXN0UGF0dGVybgorICAgIFxicmllZiAgRGVsZXRlIGEgcGF0dGVybiB0aGF0IHdhcyBhZGRlZCBmb3IgUGF0dGVybiBCeXRlIE1hdGNoaW5nLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBhdHRlcm4gLSAgUGF0dGVybiB0byBiZSBkZWxldGVkCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFICBDYW5ub3QgZGVsZXRlIHBhdHRlcm4KKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIFJlcXVlc3QgYWNjZXB0ZWQuIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBwbWNXb3dsRGVsQmNhc3RQYXR0ZXJuICgKKyAgICB0SGFsSGFuZGxlIGhIYWwsIAorICAgIHRwU2lyV293bERlbEJjYXN0UHRybiBwYXR0ZXJuKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYod293UmVxdWVzdCwgdm9zX2V2ZW50X3dsYW5fcG93ZXJzYXZlX3dvd19wYXlsb2FkX3R5cGUpOworCisgICAgdm9zX21lbV96ZXJvKCZ3b3dSZXF1ZXN0LCBzaXplb2Yodm9zX2V2ZW50X3dsYW5fcG93ZXJzYXZlX3dvd19wYXlsb2FkX3R5cGUpKTsKKyAgICB3b3dSZXF1ZXN0LmV2ZW50X3N1YnR5cGUgPSBXTEFOX1dPV19ERUxfUFRSTl9SRVE7CisgICAgd293UmVxdWVzdC53b3dfZGVsX3B0cm5faWQgPSBwYXR0ZXJuLT51Y1BhdHRlcm5JZDsgCisKKyAgICBXTEFOX1ZPU19ESUFHX0VWRU5UX1JFUE9SVCgmd293UmVxdWVzdCwgRVZFTlRfV0xBTl9QT1dFUlNBVkVfV09XKTsKKyNlbmRpZgorCisgICAgc21zTG9nKHBNYWMsIExPRzIsICJQTUM6IGVudGVyaW5nIHBtY1dvd2xEZWxCY2FzdFBhdHRlcm4iKTsKKworICAgIGlmKHBhdHRlcm4tPnVjUGF0dGVybklkID49IFNJUl9XT1dMX0JDQVNUX01BWF9OVU1fUEFUVEVSTlMgKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJQYXR0ZXJuIElkIG11c3QgcmFuZ2UgZnJvbSAwIHRvICVkXG4iKSwgCisgICAgICAgICAgICBTSVJfV09XTF9CQ0FTVF9NQVhfTlVNX1BBVFRFUk5TLTEpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZihwTWFjLT5wbWMucG1jU3RhdGUgPT0gU1RBTkRCWSB8fCBwTWFjLT5wbWMucG1jU3RhdGUgPT0gUkVRVUVTVF9TVEFOREJZKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgZGVsZXRlIFdvV0wgUGF0dGVybiBhcyBjaGlwIGlzIGluICVzIHN0YXRlXG4iKSwKKyAgICAgICAgICAgcG1jR2V0UG1jU3RhdGVTdHIocE1hYy0+cG1jLnBtY1N0YXRlKSk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIGlmKCBwTWFjLT5wbWMucG1jU3RhdGUgPT0gSU1QUyB8fCBwTWFjLT5wbWMucG1jU3RhdGUgPT0gUkVRVUVTVF9JTVBTICkKKyAgICB7CisgICAgICAgIC8vV2FrZSB1cCB0aGUgY2hpcCBmaXJzdAorICAgICAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IHBtY0RlZmVyTXNnKCBwTWFjLCBlV05JX1BNQ19XT1dMX0RFTF9CQ0FTVF9QVFJOLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIHNpemVvZih0U2lyV293bERlbEJjYXN0UHRybikgKTsKKworICAgICAgICBpZiggZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgPT0gc3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICAgLy9laXRoZXIgZmFpbCBvciBhbHJlYWR5IGluIGZ1bGwgcG93ZXIKKyAgICAgICAgICAgIGlmKCAhSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICggc3RhdHVzICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2Vsc2UgbGV0IGl0IHRocm91Z2ggYmVjYXVzZSBpdCBpcyBpbiBmdWxsIHBvd2VyIHN0YXRlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocG1jU2VuZE1lc3NhZ2UoaEhhbCwgZVdOSV9QTUNfV09XTF9ERUxfQkNBU1RfUFRSTiwgcGF0dGVybiwgc2l6ZW9mKHRTaXJXb3dsRGVsQmNhc3RQdHJuKSkKKyAgICAgICAgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiU2VuZCBvZiBlV05JX1BNQ19XT1dMX0RFTF9CQ0FTVF9QVFJOIHRvIFBFIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHBtY0VudGVyV293bAorICAgIFxicmllZiAgUmVxdWVzdCB0aGF0IHRoZSBkZXZpY2UgYmUgYnJvdWdodCB0byBmdWxsIHBvd2VyIHN0YXRlLgorICAgICAgICAgICAgTm90ZSAxOiBJZiAiZnVsbFBvd2VyUmVhc29uIiBzcGVjaWZpY2llZCBpbiB0aGlzIEFQSSBpcyBzZXQgdG8KKyAgICAgICAgICAgIGVTTUVfRlVMTF9QV1JfTkVFREVEX0JZX0hERCwgUE1DIHdpbGwgY2xlYXIgYW55ICJidWZmZXJlZCB3b3dsIiByZXF1ZXN0cworICAgICAgICAgICAgYW5kIGFsc28gY2xlYXIgYW55ICJidWZmZXJlZCBCTVBTIHJlcXVlc3RzIGJ5IEhERCIuIEFzc3VtcHRpb24gaXMgdGhhdCBzaW5jZQorICAgICAgICAgICAgSEREIGlzIHJlcXVlc3RpbmcgZnVsbCBwb3dlciwgd2UgbmVlZCB0byB1bmRvIGFueSBwcmV2aW91cyBIREQgcmVxdWVzdHMgZm9yIAorICAgICAgICAgICAgQk1QUyAodXNpbmcgc21lX1JlcXVlc3RCbXBzKSBvciBXb1dMICh1c2luZyBzbWVfRW50ZXJXb1dMKS4gSWYgdGhlIHJlYXNvbiBpcworICAgICAgICAgICAgc3BlY2lmaWVkIGFueXRoaW5nIG90aGVyIHRoYW4gYWJvdmUsIHRoZSBidWZmZXJlZCByZXF1ZXN0cyBmb3IgQk1QUyBhbmQgV29XTAorICAgICAgICAgICAgd2lsbCBub3QgYmUgY2xlYXJlZC4KKyAgICAgICAgICAgIE5vdGUgMjogUmVxdWVzdGluZyBmdWxsIHBvd2VyIChubyBtYXR0ZXIgd2hhdCB0aGUgZnVsbFBvd2VyUmVhc29uIGlzKSBkb2Vzbid0CisgICAgICAgICAgICBkaXNhYmxlIHRoZSAiYXV0byBibXBzIHRpbWVyIiAoaWYgaXQgaXMgZW5hYmxlZCkgb3IgY2xlYXIgYW55ICJidWZmZXJlZCB1YXBzZAorICAgICAgICAgICAgcmVxdWVzdCIuCisgICAgICAgICAgICBOb3RlIDM6IFdoZW4gdGhlIGRldmljZSBmaW5hbGx5IGVudGVycyBGdWxsIFBvd2VyIFBNQyB3aWxsIHN0YXJ0IGEgdGltZXIgCisgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBob2xkcyB0cnVlOgorICAgICAgICAgICAgLSBBdXRvIEJNUFMgbW9kZSBpcyBlbmFibGVkCisgICAgICAgICAgICAtIFVhcHNkIHJlcXVlc3QgaXMgcGVuZGluZworICAgICAgICAgICAgLSBIREQncyByZXF1ZXN0IGZvciBCTVBTIGlzIHBlbmRpbmcKKyAgICAgICAgICAgIC0gSEREJ3MgcmVxdWVzdCBmb3IgV29XTCBpcyBwZW5kaW5nCisgICAgICAgICAgICBPbiB0aW1lciBleHBpcnkgUE1DIHdpbGwgYXR0ZW1wdCB0byBwdXQgdGhlIGRldmljZSBpbiBCTVBTIG1vZGUgaWYgZm9sbG93aW5nIAorICAgICAgICAgICAgKGluIGFkZGl0aW9uIHRvIHRob3NlIGxpc3RlZCBhYm92ZSkgaG9sZHMgdHJ1ZToKKyAgICAgICAgICAgIC0gUG9sbGluZyBvZiBhbGwgbW9kdWxlcyB0aHJvdWdoIHRoZSBQb3dlciBTYXZlIENoZWNrIHJvdXRpbmUgcGFzc2VzCisgICAgICAgICAgICAtIFNUQSBpcyBhc3NvY2lhdGVkIHRvIGFuIGFjY2VzcyBwb2ludAorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIC0gZW50ZXJXb3dsQ2FsbGJhY2tSb3V0aW5lIENhbGxiYWNrIHJvdXRpbmUgaW52b2tlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MvZmFpbHVyZQorICAgIFxwYXJhbSAgLSBlbnRlcldvd2xDYWxsYmFja0NvbnRleHQgLSAgQ29va2llIHRvIGJlIHBhc3NlZCBiYWNrIGR1cmluZyBjYWxsYmFjaworICAgIFxwYXJhbSAgLSB3YWtlUmVhc29uSW5kQ0IgQ2FsbGJhY2sgcm91dGluZSBpbnZva2VkIGZvciBXYWtlIFJlYXNvbiBJbmRpY2F0aW9uCisgICAgXHBhcmFtICAtIHdha2VSZWFzb25JbmRDQkNvbnRleHQgLSAgQ29va2llIHRvIGJlIHBhc3NlZCBiYWNrIGR1cmluZyBjYWxsYmFjaworICAgIFxwYXJhbSAgLSBmdWxsUG93ZXJSZWFzb24gLSBSZWFzb24gd2h5IHRoaXMgQVBJIGlzIGJlaW5nIGludm9rZWQuIFNNRSBuZWVkcyB0bworICAgICAgICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIEJBUCBhbmQgSEREIHJlcXVlc3RzCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gc3RhdHVzIAorICAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gZGV2aWNlIGJyb3VnaHQgdG8gZnVsbCBwb3dlciBzdGF0ZQorICAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gZGV2aWNlIGNhbm5vdCBiZSBicm91Z2h0IHRvIGZ1bGwgcG93ZXIgc3RhdGUKKyAgICAgZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgLSBkZXZpY2UgaXMgYmVpbmcgYnJvdWdodCB0byBmdWxsIHBvd2VyIHN0YXRlLAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBwbWNFbnRlcldvd2wgKCAKKyAgICB0SGFsSGFuZGxlIGhIYWwsIAorICAgIHZvaWQgKCplbnRlcldvd2xDYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKSwKKyAgICB2b2lkICplbnRlcldvd2xDYWxsYmFja0NvbnRleHQsCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisgICAgdm9pZCAoKndha2VSZWFzb25JbmRDQikgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgdHBTaXJXYWtlUmVhc29uSW5kIHBXYWtlUmVhc29uSW5kKSwKKyAgICB2b2lkICp3YWtlUmVhc29uSW5kQ0JDb250ZXh0LAorI2VuZGlmIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworICAgIHRwU2lyU21lV293bEVudGVyUGFyYW1zIHdvd2xFbnRlclBhcmFtcykKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgICAgCisgICBXTEFOX1ZPU19ESUFHX0VWRU5UX0RFRih3b3dSZXF1ZXN0LCB2b3NfZXZlbnRfd2xhbl9wb3dlcnNhdmVfd293X3BheWxvYWRfdHlwZSk7CisKKyAgIHZvc19tZW1femVybygmd293UmVxdWVzdCwgc2l6ZW9mKHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV93b3dfcGF5bG9hZF90eXBlKSk7CisgICB3b3dSZXF1ZXN0LmV2ZW50X3N1YnR5cGUgPSBXTEFOX1dPV19FTlRFUl9SRVE7CisgICB3b3dSZXF1ZXN0Lndvd190eXBlID0gMDsKKworICAgaWYod293bEVudGVyUGFyYW1zLT51Y01hZ2ljUGt0RW5hYmxlKQorICAgeworICAgICAgIHdvd1JlcXVlc3Qud293X3R5cGUgfD0gMTsKKyAgICAgICB2b3NfbWVtX2NvcHkod293UmVxdWVzdC53b3dfbWFnaWNfcGF0dGVybiwgKHRBTklfVTggKil3b3dsRW50ZXJQYXJhbXMtPm1hZ2ljUHRybiwgNik7CisgICB9CisKKyAgIGlmKHdvd2xFbnRlclBhcmFtcy0+dWNQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlKQorICAgeworICAgICAgIHdvd1JlcXVlc3Qud293X3R5cGUgfD0gMjsKKyAgIH0KKworICAgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoJndvd1JlcXVlc3QsIEVWRU5UX1dMQU5fUE9XRVJTQVZFX1dPVyk7CisjZW5kaWYKKworICAgc21zTG9nKHBNYWMsIExPRzIsICJQTUM6IGVudGVyaW5nIHBtY0VudGVyV293bFxuIik7CisKKyAgIGlmKCAhUE1DX0lTX1JFQURZKHBNYWMpICkKKyAgIHsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlJlcXVlc3RpbmcgV29XTCB3aGVuIFBNQyBub3QgcmVhZHlcbiIpKTsKKyAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoInBtY1JlYWR5ID0gJWQgcG1jU3RhdGUgPSAlc1xuIiksIAorICAgICAgICAgICBwTWFjLT5wbWMucG1jUmVhZHksIHBtY0dldFBtY1N0YXRlU3RyKHBNYWMtPnBtYy5wbWNTdGF0ZSkpOworICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICAvKiBDaGVjayBpZiBCTVBTIGlzIGVuYWJsZWQuICovCisgICBpZiAoIXBNYWMtPnBtYy5ibXBzRW5hYmxlZCkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBDYW5ub3QgZW50ZXIgV29XTC4gQk1QUyBpcyBkaXNhYmxlZFxuIik7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfUE1DX0RJU0FCTEVEOworICAgfQorCisgICAvKiBDaGVjayBpZiBXb1dMIGlzIGVuYWJsZWQuICovCisgICBpZiAoIXBNYWMtPnBtYy53b3dsRW5hYmxlZCkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBDYW5ub3QgZW50ZXIgV29XTC4gV29XTCBpcyBkaXNhYmxlZFxuIik7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfUE1DX0RJU0FCTEVEOworICAgfQorCisgICAvKiBDaGVjayB0aGF0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGggc2luZ2xlIFNlc3Npb24uICovCisgICBpZiAoIXBtY1ZhbGlkYXRlQ29ubmVjdFN0YXRlKCBwTWFjICkpCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogQ2Fubm90IGVuYWJsZSBXT1dMLiBTVEEgbm90IGFzc29jaWF0ZWQgIgorICAgICAgICAgICAgICJ3aXRoIGFuIEFjY2VzcyBQb2ludCBpbiBJbmZyYSBNb2RlIHdpdGggc2luZ2xlIGFjdGl2ZSBzZXNzaW9uXG4iKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICAvKiBJcyB0aGVyZSBhIHBlbmRpbmcgVUFQU0QgcmVxdWVzdD8gSEREIHNob3VsZCBoYXZlIHRyaWdnZXJlZCBRb1MKKyAgICAgIG1vZHVsZSB0byBkbyB0aGUgbmVjZXNzYXJ5IGNsZWFudXAgYmVmb3JlIHRyaWdncmluZyBXT1dMKi8KKyAgIGlmKHBNYWMtPnBtYy51YXBzZFNlc3Npb25SZXF1aXJlZCkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiUE1DOiBDYW5ub3QgcmVxdWVzdCBXT1dMLiBQZW5kaW5nIFVBUFNEIHJlcXVlc3RcbiIpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIENoZWNrIHRoYXQgZW50cnkgaW50byBhIHBvd2VyIHNhdmUgbW9kZSBpcyBhbGxvd2VkIGF0IHRoaXMgdGltZS4gKi8KKyAgIGlmIChwTWFjLT5wbWMucG1jU3RhdGUgPT0gRlVMTF9QT1dFUiAmJiAhcG1jUG93ZXJTYXZlQ2hlY2soaEhhbCkpCisgICB7CisgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlBNQzogUG93ZXIgc2F2ZSBjaGVjayBmYWlsZWQuIFdPV0wgcmVxdWVzdCAiCisgICAgICAgICAgICAgIndpbGwgbm90IGJlIGFjY2VwdGVkXG4iKTsKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorCisgICAvLyBUbyBhdm9pZCByYWNlIGNvbmRpdGlvbiwgc2V0IGNhbGxiYWNrIHJvdXRpbmVzIGJlZm9yZSBzZW5kaW5nIG1lc3NhZ2UuCisgICAvKiBjYWNoZSB0aGUgV09XTCBpbmZvcm1hdGlvbiAqLworICAgcE1hYy0+cG1jLndvd2xFbnRlclBhcmFtcyA9ICp3b3dsRW50ZXJQYXJhbXM7CisgICBwTWFjLT5wbWMuZW50ZXJXb3dsQ2FsbGJhY2tSb3V0aW5lID0gZW50ZXJXb3dsQ2FsbGJhY2tSb3V0aW5lOworICAgcE1hYy0+cG1jLmVudGVyV293bENhbGxiYWNrQ29udGV4dCA9IGVudGVyV293bENhbGxiYWNrQ29udGV4dDsKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgIC8qIENhY2hlIHRoZSBXYWtlIFJlYXNvbiBJbmRpY2F0aW9uIGNhbGxiYWNrIGluZm9ybWF0aW9uICovCisgICBwTWFjLT5wbWMud2FrZVJlYXNvbkluZENCID0gd2FrZVJlYXNvbkluZENCOworICAgcE1hYy0+cG1jLndha2VSZWFzb25JbmRDQkNvbnRleHQgPSB3YWtlUmVhc29uSW5kQ0JDb250ZXh0OworI2VuZGlmIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworCisgICAvKiBFbnRlciBSZXF1ZXN0IFdPV0wgU3RhdGUuICovCisgICBpZiAocG1jUmVxdWVzdEVudGVyV293bFN0YXRlKGhIYWwsIHdvd2xFbnRlclBhcmFtcykgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworCisgICBwTWFjLT5wbWMud293bE1vZGVSZXF1aXJlZCA9IFRSVUU7CisKKyAgIHJldHVybiBlSEFMX1NUQVRVU19QTUNfUEVORElORzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHBtY0V4aXRXb3dsCisgICAgXGJyaWVmICBUaGlzIGlzIHRoZSBTTUUgQVBJIGV4cG9zZWQgdG8gSEREIHRvIHJlcXVlc3QgZXhpdCBmcm9tIFdvV0xBTiBtb2RlLiAKKyAgICAgICAgICAgIFNNRSB3aWxsIGluaXRpYXRlIGV4aXQgZnJvbSBXb1dMQU4gbW9kZSBhbmQgZGV2aWNlIHdpbGwgYmUgcHV0IGluIEJNUFMgCisgICAgICAgICAgICBtb2RlLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgIERldmljZSBjYW5ub3QgZXhpdCBXb1dMQU4gbW9kZS4KKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIFJlcXVlc3QgYWNjZXB0ZWQgdG8gZXhpdCBXb1dMQU4gbW9kZS4gCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBtY0V4aXRXb3dsICh0SGFsSGFuZGxlIGhIYWwpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICAgIAorICAgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYod293UmVxdWVzdCwgdm9zX2V2ZW50X3dsYW5fcG93ZXJzYXZlX3dvd19wYXlsb2FkX3R5cGUpOworCisgICB2b3NfbWVtX3plcm8oJndvd1JlcXVlc3QsIHNpemVvZih2b3NfZXZlbnRfd2xhbl9wb3dlcnNhdmVfd293X3BheWxvYWRfdHlwZSkpOworICAgd293UmVxdWVzdC5ldmVudF9zdWJ0eXBlID0gV0xBTl9XT1dfRVhJVF9SRVE7CisKKyAgIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCZ3b3dSZXF1ZXN0LCBFVkVOVF9XTEFOX1BPV0VSU0FWRV9XT1cpOworI2VuZGlmCisKKyAgIHNtc0xvZyhwTWFjLCBMT0cyLCAiUE1DOiBlbnRlcmluZyBwbWNFeGl0V293bCIpOworCisgICAvKiBDbGVhciBhbnkgYnVmZmVyZWQgY29tbWFuZCBmb3IgZW50ZXJpbmcgV09XTCAqLworICAgcE1hYy0+cG1jLndvd2xNb2RlUmVxdWlyZWQgPSBGQUxTRTsKKworICAgLyogRW50ZXIgUkVRVUVTVF9FWElUX1dPV0wgU3RhdGUqLworICAgaWYgKHBtY1JlcXVlc3RFeGl0V293bFN0YXRlKGhIYWwpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgLyogQ2xlYXIgdGhlIGNhbGxiYWNrIHJvdXRpbmVzICovCisgICBwTWFjLT5wbWMuZW50ZXJXb3dsQ2FsbGJhY2tSb3V0aW5lID0gTlVMTDsKKyAgIHBNYWMtPnBtYy5lbnRlcldvd2xDYWxsYmFja0NvbnRleHQgPSBOVUxMOworCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBwbWNTZXRIb3N0T2ZmbG9hZAorICAgIFxicmllZiAgU2V0IHRoZSBob3N0IG9mZmxvYWQgZmVhdHVyZS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwUmVxdWVzdCAtIFBvaW50ZXIgdG8gdGhlIG9mZmxvYWQgcmVxdWVzdC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgIENhbm5vdCBzZXQgdGhlIG9mZmxvYWQuCisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTICBSZXF1ZXN0IGFjY2VwdGVkLiAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgcG1jU2V0SG9zdE9mZmxvYWQgKHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJIb3N0T2ZmbG9hZFJlcSBwUmVxdWVzdCkKK3sKKyAgICB0cFNpckhvc3RPZmZsb2FkUmVxIHBSZXF1ZXN0QnVmOworICAgIHZvc19tc2dfdCBtc2c7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBJUCBhZGRyZXNzID0gJWQuJWQuJWQuJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjRBZGRyWzBdLCBwUmVxdWVzdC0+cGFyYW1zLmhvc3RJcHY0QWRkclsxXSwKKyAgICAgICAgcFJlcXVlc3QtPnBhcmFtcy5ob3N0SXB2NEFkZHJbMl0sIHBSZXF1ZXN0LT5wYXJhbXMuaG9zdElwdjRBZGRyWzNdKTsKKworICAgIHBSZXF1ZXN0QnVmID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJIb3N0T2ZmbG9hZFJlcSkpOworICAgIGlmIChOVUxMID09IHBSZXF1ZXN0QnVmKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBob3N0IG9mZmxvYWQgcmVxdWVzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMRURfQUxMT0M7CisgICAgfQorICAgIHZvc19tZW1fY29weShwUmVxdWVzdEJ1ZiwgcFJlcXVlc3QsIHNpemVvZih0U2lySG9zdE9mZmxvYWRSZXEpKTsKKworICAgIG1zZy50eXBlID0gV0RBX1NFVF9IT1NUX09GRkxPQUQ7CisgICAgbXNnLnJlc2VydmVkID0gMDsKKyAgICBtc2cuYm9keXB0ciA9IHBSZXF1ZXN0QnVmOworICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NT0RVTEVfSURfV0RBLCAmbXNnKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV0RBX1NFVF9IT1NUX09GRkxPQUQgbWVzc2FnZSB0byBXREEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB2b3NfbWVtX2ZyZWUocFJlcXVlc3RCdWYpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHBtY1NldEtlZXBBbGl2ZQorICAgIFxicmllZiAgU2V0IHRoZSBLZWVwIEFsaXZlIGZlYXR1cmUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJlcXVlc3QgLSBQb2ludGVyIHRvIHRoZSBLZWVwIEFsaXZlLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAgICAgICAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAgQ2Fubm90IHNldCB0aGUga2VlcGFsaXZlLgorICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAgUmVxdWVzdCBhY2NlcHRlZC4gCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBtY1NldEtlZXBBbGl2ZSAodEhhbEhhbmRsZSBoSGFsLCB0cFNpcktlZXBBbGl2ZVJlcSBwUmVxdWVzdCkKK3sKKyAgICB0cFNpcktlZXBBbGl2ZVJlcSBwUmVxdWVzdEJ1ZjsKKyAgICB2b3NfbXNnX3QgbXNnOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csICIlczogIgorICAgICAgICAgICAgICAgICAgIldEQV9TRVRfS0VFUF9BTElWRSBtZXNzYWdlIiwgX19GVU5DVElPTl9fKTsKKworICAgIHBSZXF1ZXN0QnVmID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJLZWVwQWxpdmVSZXEpKTsKKyAgICBpZiAoTlVMTCA9PSBwUmVxdWVzdEJ1ZikKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6ICIKKyAgICAgICAgICAgICAgICAgICJOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGtlZXAgYWxpdmUgcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTEVEX0FMTE9DOworICAgIH0KKyAgICB2b3NfbWVtX2NvcHkocFJlcXVlc3RCdWYsIHBSZXF1ZXN0LCBzaXplb2YodFNpcktlZXBBbGl2ZVJlcSkpOworICAgIAorICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCAiYnVmZiBUUCAlZCAiCisgICAgICAgICAgICAgICJpbnB1dCBUUCAlZCAiLCBwUmVxdWVzdEJ1Zi0+dGltZVBlcmlvZCwgcFJlcXVlc3QtPnRpbWVQZXJpb2QpOworCisgICAgbXNnLnR5cGUgPSBXREFfU0VUX0tFRVBfQUxJVkU7CisgICAgbXNnLnJlc2VydmVkID0gMDsKKyAgICBtc2cuYm9keXB0ciA9IHBSZXF1ZXN0QnVmOworICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NT0RVTEVfSURfV0RBLCAmbXNnKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6ICIKKyAgICAgICAgICAgICAgICAgICJOb3QgYWJsZSB0byBwb3N0IFdEQV9TRVRfS0VFUF9BTElWRSBtZXNzYWdlIHRvIFdEQSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICB2b3NfbWVtX2ZyZWUocFJlcXVlc3RCdWYpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisjaWZkZWYgV0xBTl9OU19PRkZMT0FECisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBwbWNTZXROU09mZmxvYWQKKyAgICBcYnJpZWYgIFNldCB0aGUgaG9zdCBvZmZsb2FkIGZlYXR1cmUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJlcXVlc3QgLSBQb2ludGVyIHRvIHRoZSBvZmZsb2FkIHJlcXVlc3QuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFICBDYW5ub3Qgc2V0IHRoZSBvZmZsb2FkLgorICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAgUmVxdWVzdCBhY2NlcHRlZC4gCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBtY1NldE5TT2ZmbG9hZCAodEhhbEhhbmRsZSBoSGFsLCB0cFNpckhvc3RPZmZsb2FkUmVxIHBSZXF1ZXN0KQoreworICAgIHRwU2lySG9zdE9mZmxvYWRSZXEgcFJlcXVlc3RCdWY7CisgICAgdm9zX21zZ190IG1zZzsKKyAgICBpbnQgaTsKKworICAgIHBSZXF1ZXN0QnVmID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJIb3N0T2ZmbG9hZFJlcSkpOworICAgIGlmIChOVUxMID09IHBSZXF1ZXN0QnVmKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBOUyBvZmZsb2FkIHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTEVEX0FMTE9DOworICAgIH0KKyAgICB2b3NfbWVtX2NvcHkocFJlcXVlc3RCdWYsIHBSZXF1ZXN0LCBzaXplb2YodFNpckhvc3RPZmZsb2FkUmVxKSk7CisKKyAgICBtc2cudHlwZSA9IFdEQV9TRVRfTlNfT0ZGTE9BRDsKKyAgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgIG1zZy5ib2R5cHRyID0gcFJlcXVlc3RCdWY7CisgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01PRFVMRV9JRF9XREEsICZtc2cpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gcG9zdCBTSVJfSEFMX1NFVF9IT1NUX09GRkxPQUQgbWVzc2FnZSB0byBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB2b3NfbWVtX2ZyZWUocFJlcXVlc3RCdWYpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworI2VuZGlmIC8vV0xBTl9OU19PRkZMT0FECisKKwordm9pZCBwbWNDbG9zZVBvd2VyU2F2ZUNoZWNrTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRwUG93ZXJTYXZlQ2hlY2tFbnRyeSBwUG93ZXJTYXZlQ2hlY2tFbnRyeTsKKworICAgIGNzckxMTG9jaygmcE1hYy0+cG1jLnBvd2VyU2F2ZUNoZWNrTGlzdCk7CisgICAgd2hpbGUgKCAocEVudHJ5ID0gY3NyTExSZW1vdmVIZWFkKCZwTWFjLT5wbWMucG93ZXJTYXZlQ2hlY2tMaXN0LCBGQUxTRSkpICkKKyAgICB7CisgICAgICAgIHBQb3dlclNhdmVDaGVja0VudHJ5ID0gR0VUX0JBU0VfQUREUihwRW50cnksIHRQb3dlclNhdmVDaGVja0VudHJ5LCBsaW5rKTsKKyAgICAgICAgaWYgKHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFBvd2VyU2F2ZUNoZWNrRW50cnkpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGZyZWUgbWVtb3J5IFxuIikpOworICAgICAgICAgICAgUE1DX0FCT1JUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgY3NyTExVbmxvY2soJnBNYWMtPnBtYy5wb3dlclNhdmVDaGVja0xpc3QpOworICAgIGNzckxMQ2xvc2UoJnBNYWMtPnBtYy5wb3dlclNhdmVDaGVja0xpc3QpOworfQorCisKK3ZvaWQgcG1jQ2xvc2VSZXF1ZXN0RnVsbFBvd2VyTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRwUmVxdWVzdEZ1bGxQb3dlckVudHJ5IHBSZXF1ZXN0RnVsbFBvd2VyRW50cnk7CisKKyAgICBjc3JMTExvY2soJnBNYWMtPnBtYy5yZXF1ZXN0RnVsbFBvd2VyTGlzdCk7CisgICAgd2hpbGUgKCAocEVudHJ5ID0gY3NyTExSZW1vdmVIZWFkKCZwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlckxpc3QsIEZBTFNFKSkgKQorICAgIHsKKyAgICAgICAgcFJlcXVlc3RGdWxsUG93ZXJFbnRyeSA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0UmVxdWVzdEZ1bGxQb3dlckVudHJ5LCBsaW5rKTsKKyAgICAgICAgaWYgKHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcFJlcXVlc3RGdWxsUG93ZXJFbnRyeSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJDYW5ub3QgZnJlZSBtZW1vcnkgXG4iKSk7CisgICAgICAgICAgICBQTUNfQUJPUlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBjc3JMTFVubG9jaygmcE1hYy0+cG1jLnJlcXVlc3RGdWxsUG93ZXJMaXN0KTsKKyAgICBjc3JMTENsb3NlKCZwTWFjLT5wbWMucmVxdWVzdEZ1bGxQb3dlckxpc3QpOworfQorCisKK3ZvaWQgcG1jQ2xvc2VSZXF1ZXN0Qm1wc0xpc3QodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0cFJlcXVlc3RCbXBzRW50cnkgcFJlcXVlc3RCbXBzRW50cnk7CisKKyAgICBjc3JMTExvY2soJnBNYWMtPnBtYy5yZXF1ZXN0Qm1wc0xpc3QpOworICAgIHdoaWxlICggKHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZCgmcE1hYy0+cG1jLnJlcXVlc3RCbXBzTGlzdCwgRkFMU0UpKSApCisgICAgeworICAgICAgICBwUmVxdWVzdEJtcHNFbnRyeSA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0UmVxdWVzdEJtcHNFbnRyeSwgbGluayk7CisgICAgICAgIGlmIChwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBSZXF1ZXN0Qm1wc0VudHJ5KSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBmcmVlIG1lbW9yeSBcbiIpKTsKKyAgICAgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGNzckxMVW5sb2NrKCZwTWFjLT5wbWMucmVxdWVzdEJtcHNMaXN0KTsKKyAgICBjc3JMTENsb3NlKCZwTWFjLT5wbWMucmVxdWVzdEJtcHNMaXN0KTsKK30KKworCit2b2lkIHBtY0Nsb3NlUmVxdWVzdFN0YXJ0VWFwc2RMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdHBTdGFydFVhcHNkRW50cnkgcFN0YXJ0VWFwc2RFbnRyeTsKKworICAgIGNzckxMTG9jaygmcE1hYy0+cG1jLnJlcXVlc3RTdGFydFVhcHNkTGlzdCk7CisgICAgd2hpbGUgKCAocEVudHJ5ID0gY3NyTExSZW1vdmVIZWFkKCZwTWFjLT5wbWMucmVxdWVzdFN0YXJ0VWFwc2RMaXN0LCBGQUxTRSkpICkKKyAgICB7CisgICAgICAgIHBTdGFydFVhcHNkRW50cnkgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFN0YXJ0VWFwc2RFbnRyeSwgbGluayk7CisgICAgICAgIGlmIChwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBTdGFydFVhcHNkRW50cnkpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQ2Fubm90IGZyZWUgbWVtb3J5IFxuIikpOworICAgICAgICAgICAgUE1DX0FCT1JUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgY3NyTExVbmxvY2soJnBNYWMtPnBtYy5yZXF1ZXN0U3RhcnRVYXBzZExpc3QpOworICAgIGNzckxMQ2xvc2UoJnBNYWMtPnBtYy5yZXF1ZXN0U3RhcnRVYXBzZExpc3QpOworfQorCisKK3ZvaWQgcG1jQ2xvc2VEZXZpY2VTdGF0ZVVwZGF0ZUxpc3QodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0cERldmljZVN0YXRlVXBkYXRlSW5kRW50cnkgcERldmljZVN0YXRlVXBkYXRlSW5kRW50cnk7CisKKyAgICBjc3JMTExvY2soJnBNYWMtPnBtYy5kZXZpY2VTdGF0ZVVwZGF0ZUluZExpc3QpOworICAgIHdoaWxlICggKHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZCgmcE1hYy0+cG1jLmRldmljZVN0YXRlVXBkYXRlSW5kTGlzdCwgRkFMU0UpKSApCisgICAgeworICAgICAgICBwRGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeSA9IEdFVF9CQVNFX0FERFIocEVudHJ5LCB0RGV2aWNlU3RhdGVVcGRhdGVJbmRFbnRyeSwgbGluayk7CisgICAgICAgIGlmIChwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBEZXZpY2VTdGF0ZVVwZGF0ZUluZEVudHJ5KSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBmcmVlIG1lbW9yeSBcbiIpKTsKKyAgICAgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGNzckxMVW5sb2NrKCZwTWFjLT5wbWMuZGV2aWNlU3RhdGVVcGRhdGVJbmRMaXN0KTsKKyAgICBjc3JMTENsb3NlKCZwTWFjLT5wbWMuZGV2aWNlU3RhdGVVcGRhdGVJbmRMaXN0KTsKK30KKworCit2b2lkIHBtY0Nsb3NlRGVmZXJyZWRNc2dMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdFBtY0RlZmVycmVkTXNnICpwRGVmZXJyZWRNc2c7CisKKyAgICBjc3JMTExvY2soJnBNYWMtPnBtYy5kZWZlcnJlZE1zZ0xpc3QpOworICAgIHdoaWxlICggKHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZCgmcE1hYy0+cG1jLmRlZmVycmVkTXNnTGlzdCwgRkFMU0UpKSApCisgICAgeworICAgICAgICBwRGVmZXJyZWRNc2cgPSBHRVRfQkFTRV9BRERSKHBFbnRyeSwgdFBtY0RlZmVycmVkTXNnLCBsaW5rKTsKKyAgICAgICAgaWYgKHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcERlZmVycmVkTXNnKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIkNhbm5vdCBmcmVlIG1lbW9yeSBcbiIpKTsKKyAgICAgICAgICAgIFBNQ19BQk9SVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGNzckxMVW5sb2NrKCZwTWFjLT5wbWMuZGVmZXJyZWRNc2dMaXN0KTsKKyAgICBjc3JMTENsb3NlKCZwTWFjLT5wbWMuZGVmZXJyZWRNc2dMaXN0KTsKK30KKworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisKK3N0YXRpYyB0U2lyUmV0U3RhdHVzIAorcG1jUG9wdWxhdGVNYWNIZWFkZXIoIHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCogcEJELAorICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IHN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgcGVlckFkZHIgLAorICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyKQoreworICAgIHRTaXJSZXRTdGF0dXMgICBzdGF0dXNDb2RlID0gZVNJUl9TVUNDRVNTOworICAgIHRwU2lyTWFjTWdtdEhkciBwTWFjSGRyOworICAgIAorICAgIC8vLyBQcmVwYXJlIE1BQyBtYW5hZ2VtZW50IGhlYWRlcgorICAgIHBNYWNIZHIgPSAodHBTaXJNYWNNZ210SGRyKSAocEJEKTsKKworICAgIC8vIFByZXBhcmUgRkMKKyAgICBwTWFjSGRyLT5mYy5wcm90VmVyID0gU0lSX01BQ19QUk9UT0NPTF9WRVJTSU9OOworICAgIHBNYWNIZHItPmZjLnR5cGUgICAgPSB0eXBlOworICAgIHBNYWNIZHItPmZjLnN1YlR5cGUgPSBzdWJUeXBlOworCisgICAgLy8gUHJlcGFyZSBBZGRyZXNzIDEKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLAorICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBNYWNIZHItPmRhLAorICAgICAgICAgICAgICAgICAgICh0QU5JX1U4ICopIHBlZXJBZGRyLAorICAgICAgICAgICAgICAgICAgIHNpemVvZiggdFNpck1hY0FkZHIgKSk7CisKKyAgICBzaXJDb3B5TWFjQWRkcihwTWFjSGRyLT5zYSxzZWxmTWFjQWRkcik7CisKKyAgICAvLyBQcmVwYXJlIEFkZHJlc3MgMworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsCisgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcE1hY0hkci0+YnNzSWQsCisgICAgICAgICAgICAgICAgICAgKHRBTklfVTggKikgcGVlckFkZHIsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0U2lyTWFjQWRkciApKTsKKyAgICByZXR1cm4gc3RhdHVzQ29kZTsKK30gLyoqKiBwbWNQb3B1bGF0ZU1hY0hlYWRlcigpICoqKi8KKworCitzdGF0aWMgdFNpclJldFN0YXR1cworcG1jUHJlcGFyZVByb2JlUmVxVGVtcGxhdGUodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICAgICAgIG5DaGFubmVsTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgZG90MTFtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgICAgc2VsZk1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAqcEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgICAgICAgKnB1c0xlbikKK3sKKyAgICB0RG90MTFmUHJvYmVSZXF1ZXN0IHByOworICAgIHRBTklfVTMyICAgICAgICAgICAgblN0YXR1cywgbkJ5dGVzLCBuUGF5bG9hZDsKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgIG5TaXJTdGF0dXM7CisgICAgLypCY2FzdCB0eCovCisgICAgdFNpck1hY0FkZHIgICAgICAgICBic3NJZCA9IHsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAgLy8gVGhlIHNjaGVtZSBoZXJlIGlzIHRvIGZpbGwgb3V0IGEgJ3REb3QxMWZQcm9iZVJlcXVlc3QnIHN0cnVjdHVyZQorICAgIC8vIGFuZCB0aGVuIGhhbmQgaXQgb2ZmIHRvICdkb3QxMWZQYWNrUHJvYmVSZXF1ZXN0JyAoZm9yCisgICAgLy8gc2VyaWFsaXphdGlvbikuICBXZSBzdGFydCBieSB6ZXJvLWluaXRpYWxpemluZyB0aGUgc3RydWN0dXJlOgorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZwciwgc2l6ZW9mKCBwciApICk7CisKKyAgICBQb3B1bGF0ZURvdDExZlN1cHBSYXRlcyggcE1hYywgbkNoYW5uZWxOdW0sICZwci5TdXBwUmF0ZXMsTlVMTCk7CisKKyAgICBpZiAoIFdOSV9DRkdfRE9UMTFfTU9ERV8xMUIgIT0gZG90MTFtb2RlICkKKyAgICB7CisgICAgICAgIFBvcHVsYXRlRG90MTFmRXh0U3VwcFJhdGVzMSggcE1hYywgbkNoYW5uZWxOdW0sICZwci5FeHRTdXBwUmF0ZXMgKTsKKyAgICB9CisKKyAgICAKKyAgICBpZiAoSVNfRE9UMTFfTU9ERV9IVChkb3QxMW1vZGUpKQorICAgIHsKKyAgICAgICBQb3B1bGF0ZURvdDExZkhUQ2FwcyggcE1hYywgJnByLkhUQ2FwcyApOworICAgIH0KKyAgICAKKyAgICAvLyBUaGF0J3MgaXQtLSBub3cgd2UgcGFjayBpdC4gIEZpcnN0LCBob3cgbXVjaCBzcGFjZSBhcmUgd2UgZ29pbmcgdG8KKyAgICAvLyBuZWVkPworICAgIG5TdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRQcm9iZVJlcXVlc3RTaXplKCBwTWFjLCAmcHIsICZuUGF5bG9hZCApOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggblN0YXR1cyApICkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjYWxjdWxhdGUgdGhlIHBhY2tlZCBzaXplIGYiCisgICAgICAgICAgICAgICAgICAib3IgYSBQcm9iZSBSZXF1ZXN0ICgweCUwOHgpLlxuIiwgblN0YXR1cyApOworCisgICAgICAgIC8vIFdlJ2xsIGZhbGwgYmFjayBvbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbzoKKyAgICAgICAgblBheWxvYWQgPSBzaXplb2YoIHREb3QxMWZQcm9iZVJlcXVlc3QgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIG5TdGF0dXMgKSApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGNhbGN1bGF0aW5nIgorICAgICAgICAgICAgICAgICAgInRoZSBwYWNrZWQgc2l6ZSBmb3IgYSBQcm9iZSBSZXF1ZXN0ICgiCisgICAgICAgICAgICAgICAgICAiMHglMDh4KS5cbiIsIG5TdGF0dXMgKTsKKyAgICB9CisKKyAgICBuQnl0ZXMgPSBuUGF5bG9hZCArIHNpemVvZiggdFNpck1hY01nbXRIZHIgKTsKKyAgCisgICAgLyogUHJlcGFyZSBvdXRnb2luZyBmcmFtZSovCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgcEZyYW1lLCBuQnl0ZXMgKTsKKworICAgIC8vIE5leHQsIHdlIGZpbGwgb3V0IHRoZSBidWZmZXIgZGVzY3JpcHRvcjoKKyAgICBuU2lyU3RhdHVzID0gcG1jUG9wdWxhdGVNYWNIZWFkZXIoIHBNYWMsIHBGcmFtZSwgU0lSX01BQ19NR01UX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01HTVRfUFJPQkVfUkVRLCBic3NJZCAsc2VsZk1hY0FkZHIpOworCisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gblNpclN0YXR1cyApCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgIkZhaWxlZCB0byBwb3B1bGF0ZSB0aGUgYnVmZmVyIGRlc2NyaXB0b3IgZm9yIGEgUHJvYmUgUmVxdWVzdCAoJWQpLlxuIiwKKyAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIHJldHVybiBuU2lyU3RhdHVzOyAgICAgIC8vIGFsbG9jYXRlZCEKKyAgICB9CisKKyAgICAvLyBUaGF0IGRvbmUsIHBhY2sgdGhlIFByb2JlIFJlcXVlc3Q6CisgICAgblN0YXR1cyA9IGRvdDExZlBhY2tQcm9iZVJlcXVlc3QoIHBNYWMsICZwciwgcEZyYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0U2lyTWFjTWdtdEhkciApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF5bG9hZCwgJm5QYXlsb2FkICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHBhY2sgYSBQcm9iZSBSZXF1ZXN0ICgweCUwOHgpLlxuIiwgblN0YXR1cyApOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOyAgICAvLyBhbGxvY2F0ZWQhCisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBuU3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgcGFja2luZyBhIFByb2JlIFJlcXVlc3QgKDB4JTA4eCkuXG4iICk7CisgICAgfQorCisgICAgKnB1c0xlbiA9IG5QYXlsb2FkICsgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKTsgCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLy8gRW5kIHBtY1ByZXBhcmVQcm9iZVJlcVRlbXBsYXRlLgorCisKK2VIYWxTdGF0dXMgcG1jU2V0UHJlZmVycmVkTmV0d29ya0xpc3QKKygKKyAgICB0SGFsSGFuZGxlIGhIYWwsIAorICAgIHRwU2lyUE5PU2NhblJlcSBwUmVxdWVzdCwgCisgICAgdEFOSV9VOCBzZXNzaW9uSWQsIAorICAgIHByZWZlcnJlZE5ldHdvcmtGb3VuZEluZENhbGxiYWNrIGNhbGxiYWNrUm91dGluZSwgCisgICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0CispCit7CisgICAgdHBTaXJQTk9TY2FuUmVxIHBSZXF1ZXN0QnVmOworICAgIHZvc19tc2dfdCBtc2c7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgIHRBTklfVTggdWNEb3QxMU1vZGU7IAorCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogU1NJRCA9ICVzLCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcFJlcXVlc3QtPmFOZXR3b3Jrc1swXS5zc0lkLnNzSWQsIHBSZXF1ZXN0LT5hTmV0d29ya3NbMV0uc3NJZC5zc0lkKTsKKworICAgIHBSZXF1ZXN0QnVmID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJQTk9TY2FuUmVxKSk7CisgICAgaWYgKE5VTEwgPT0gcFJlcXVlc3RCdWYpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFBOTyByZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQzsKKyAgICB9CisKKyAgICB2b3NfbWVtX2NvcHkocFJlcXVlc3RCdWYsIHBSZXF1ZXN0LCBzaXplb2YodFNpclBOT1NjYW5SZXEpKTsKKworICAgIC8qTXVzdCB0cmFuc2xhdGUgdGhlIG1vZGUgZmlyc3QqLworICAgIHVjRG90MTFNb2RlID0gKHRBTklfVTgpIGNzclRyYW5zbGF0ZVRvV05JQ2ZnRG90MTFNb2RlKHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyRmluZEJlc3RQaHlNb2RlKCBwTWFjLCBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGUgKSk7CisKKyAgICAvKlByZXBhcmUgYSBwcm9iZSByZXF1ZXN0IGZvciAyLjRHSHogYmFuZCBhbmQgb25lIGZvciA1R0h6IGJhbmQqLworICAgIHBtY1ByZXBhcmVQcm9iZVJlcVRlbXBsYXRlKHBNYWMsU0lSX1BOT18yNEdfREVGQVVMVF9DSCwgdWNEb3QxMU1vZGUsIHBTZXNzaW9uLT5zZWxmTWFjQWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlcXVlc3RCdWYtPnAyNEdQcm9iZVRlbXBsYXRlLCAmcFJlcXVlc3RCdWYtPnVzMjRHUHJvYmVUZW1wbGF0ZUxlbik7IAorCisgICAgcG1jUHJlcGFyZVByb2JlUmVxVGVtcGxhdGUocE1hYyxTSVJfUE5PXzVHX0RFRkFVTFRfQ0gsIHVjRG90MTFNb2RlLCBwU2Vzc2lvbi0+c2VsZk1hY0FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXF1ZXN0QnVmLT5wNUdQcm9iZVRlbXBsYXRlLCAmcFJlcXVlc3RCdWYtPnVzNUdQcm9iZVRlbXBsYXRlTGVuKTsgCisKKworICAgIG1zZy50eXBlICAgICA9IFdEQV9TRVRfUE5PX1JFUTsKKyAgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgIG1zZy5ib2R5cHRyICA9IHBSZXF1ZXN0QnVmOworICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01PRFVMRV9JRF9XREEsICZtc2cpKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV0RBX1NFVF9QTk9fUkVRIG1lc3NhZ2UgdG8gV0RBIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgdm9zX21lbV9mcmVlKHBSZXF1ZXN0QnVmKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogQ2FjaGUgdGhlIFByZWZlcnJlZCBOZXR3b3JrIEZvdW5kIEluZGljYXRpb24gY2FsbGJhY2sgaW5mb3JtYXRpb24gKi8KKyAgICBwTWFjLT5wbWMucHJlZk5ldHdGb3VuZENCID0gY2FsbGJhY2tSb3V0aW5lOworICAgIHBNYWMtPnBtYy5wcmVmZXJyZWROZXR3b3JrRm91bmRJbmRDYWxsYmFja0NvbnRleHQgPSBjYWxsYmFja0NvbnRleHQ7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIi0lcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworZUhhbFN0YXR1cyBwbWNTZXRSc3NpRmlsdGVyKHRIYWxIYW5kbGUgaEhhbCwgICB2X1U4X3QgICAgICAgIHJzc2lUaHJlc2hvbGQpCit7CisgICAgdHBTaXJTZXRSU1NJRmlsdGVyUmVxIHBSZXF1ZXN0QnVmOworICAgIHZvc19tc2dfdCBtc2c7CisKKworICAgIHBSZXF1ZXN0QnVmID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRwU2lyU2V0UlNTSUZpbHRlclJlcSkpOworICAgIGlmIChOVUxMID09IHBSZXF1ZXN0QnVmKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBQTk8gcmVxdWVzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMRURfQUxMT0M7CisgICAgfQorCisKKyAgICBwUmVxdWVzdEJ1Zi0+cnNzaVRocmVzaG9sZCA9IHJzc2lUaHJlc2hvbGQ7IAorCisgICAgbXNnLnR5cGUgPSBXREFfU0VUX1JTU0lfRklMVEVSX1JFUTsKKyAgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgIG1zZy5ib2R5cHRyID0gcFJlcXVlc3RCdWY7CisgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTU9EVUxFX0lEX1dEQSwgJm1zZykpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gcG9zdCBXREFfU0VUX1BOT19SRVEgbWVzc2FnZSB0byBXREEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB2b3NfbWVtX2ZyZWUocFJlcXVlc3RCdWYpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCitlSGFsU3RhdHVzIHBtY1VwZGF0ZVNjYW5QYXJhbXModEhhbEhhbmRsZSBoSGFsLCB0Q3NyQ29uZmlnICpwUmVxdWVzdCwgdENzckNoYW5uZWwgKnBDaGFubmVsTGlzdCwgdEFOSV9VOCBiMTFkUmVzb2x2ZWQpCit7CisgICAgdHBTaXJVcGRhdGVTY2FuUGFyYW1zIHBSZXF1ZXN0QnVmOworICAgIHZvc19tc2dfdCBtc2c7CisgICAgaW50IGk7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzIHN0YXJ0ZWQiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcFJlcXVlc3RCdWYgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodFNpclVwZGF0ZVNjYW5QYXJhbXMpKTsKKyAgICBpZiAoTlVMTCA9PSBwUmVxdWVzdEJ1ZikKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgVXBkYXRlU2NhblBhcmFtcyByZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQzsKKyAgICB9CisKKyAgICAvLyAKKyAgICAvLyBGaWxsIHBSZXF1ZXN0QnVmIHN0cnVjdHVyZSBmcm9tIHBSZXF1ZXN0CisgICAgLy8KKyAgICBwUmVxdWVzdEJ1Zi0+YjExZEVuYWJsZWQgICAgPSBwUmVxdWVzdC0+SXMxMWVTdXBwb3J0RW5hYmxlZDsKKyAgICBwUmVxdWVzdEJ1Zi0+YjExZFJlc29sdmVkICAgPSBiMTFkUmVzb2x2ZWQ7CisgICAgcFJlcXVlc3RCdWYtPnVjQ2hhbm5lbENvdW50ID0gCisgICAgICAgICggcENoYW5uZWxMaXN0LT5udW1DaGFubmVscyA8IFNJUl9QTk9fTUFYX05FVFdfQ0hBTk5FTFMgKT8KKyAgICAgICAgcENoYW5uZWxMaXN0LT5udW1DaGFubmVsczpTSVJfUE5PX01BWF9ORVRXX0NIQU5ORUxTOworCisgICAgZm9yIChpPTA7IGkgPCBwQ2hhbm5lbExpc3QtPm51bUNoYW5uZWxzOyBpKyspCisgICAgeyAgICAKKyAgICAgICAgcFJlcXVlc3RCdWYtPmFDaGFubmVsc1tpXSA9IHBDaGFubmVsTGlzdC0+Y2hhbm5lbExpc3RbaV07CisgICAgfQorICAgIHBSZXF1ZXN0QnVmLT51c1Bhc3NpdmVNaW5DaFRpbWUgPSBwUmVxdWVzdC0+blBhc3NpdmVNaW5DaG5UaW1lOworICAgIHBSZXF1ZXN0QnVmLT51c1Bhc3NpdmVNYXhDaFRpbWUgPSBwUmVxdWVzdC0+blBhc3NpdmVNYXhDaG5UaW1lOworICAgIHBSZXF1ZXN0QnVmLT51c0FjdGl2ZU1pbkNoVGltZSAgPSBwUmVxdWVzdC0+bkFjdGl2ZU1pbkNoblRpbWU7CisgICAgcFJlcXVlc3RCdWYtPnVzQWN0aXZlTWF4Q2hUaW1lICA9IHBSZXF1ZXN0LT5uQWN0aXZlTWF4Q2huVGltZTsgCisgICAgcFJlcXVlc3RCdWYtPnVjQ0JTdGF0ZSAgICAgICAgICA9IFBIWV9TSU5HTEVfQ0hBTk5FTF9DRU5URVJFRDsKKworICAgIG1zZy50eXBlID0gV0RBX1VQREFURV9TQ0FOX1BBUkFNU19SRVE7CisgICAgbXNnLnJlc2VydmVkID0gMDsKKyAgICBtc2cuYm9keXB0ciA9IHBSZXF1ZXN0QnVmOworICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01PRFVMRV9JRF9XREEsICZtc2cpKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV0RBX1VQREFURV9TQ0FOX1BBUkFNUyBtZXNzYWdlIHRvIFdEQSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHZvc19tZW1fZnJlZShwUmVxdWVzdEJ1Zik7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCitlSGFsU3RhdHVzIHBtY1NldFBvd2VyUGFyYW1zKHRIYWxIYW5kbGUgaEhhbCwgICB0U2lyU2V0UG93ZXJQYXJhbXNSZXEqICBwd1BhcmFtcykKK3sKKyAgICB0U2lyU2V0UG93ZXJQYXJhbXNSZXEqIHBSZXF1ZXN0QnVmOworICAgIHZvc19tc2dfdCBtc2c7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgIHRwUEVTZXNzaW9uICAgICBwc2Vzc2lvbkVudHJ5OworCisgICAgaWYoKHBzZXNzaW9uRW50cnkgPSBwZUdldFZhbGlkUG93ZXJTYXZlU2Vzc2lvbihwTWFjKSk9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX05PVF9JTklUSUFMSVpFRDsKKyAgICB9CisKKyAgICBwUmVxdWVzdEJ1ZiA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0U2lyU2V0UG93ZXJQYXJhbXNSZXEpKTsKKyAgICBpZiAoTlVMTCA9PSBwUmVxdWVzdEJ1ZikKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgUG93ZXIgUGFyYW1yZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQzsKKyAgICB9CisKKworICAgIHZvc19tZW1fY29weShwUmVxdWVzdEJ1ZiwgcHdQYXJhbXMsIHNpemVvZigqcFJlcXVlc3RCdWYpKTsgCisKKworICAgIG1zZy50eXBlID0gV0RBX1NFVF9QT1dFUl9QQVJBTVNfUkVROworICAgIG1zZy5yZXNlcnZlZCA9IDA7CisgICAgbXNnLmJvZHlwdHIgPSBwUmVxdWVzdEJ1ZjsKKworICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NT0RVTEVfSURfV0RBLCAmbXNnKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV0RBX1NFVF9QT1dFUl9QQVJBTVNfUkVRIG1lc3NhZ2UgdG8gV0RBIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgdm9zX21lbV9mcmVlKHBSZXF1ZXN0QnVmKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworZUhhbFN0YXR1cyBwbWNHZXRGaWx0ZXJNYXRjaENvdW50CisoCisgICAgdEhhbEhhbmRsZSBoSGFsLCAKKyAgICBGaWx0ZXJNYXRjaENvdW50Q2FsbGJhY2sgY2FsbGJhY2tSb3V0aW5lLCAKKyAgICB2b2lkICpjYWxsYmFja0NvbnRleHQKKykKK3sKKyAgICB0cFNpclJjdkZsdFBrdE1hdGNoUnNwICBwUmVxdWVzdEJ1ZjsKKyAgICB2b3NfbXNnX3QgICAgICAgICAgICAgICBtc2c7CisgICAgdHBBbmlTaXJHbG9iYWwgICAgICAgICAgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAiJXM6IGZpbHRlcklkID0gJWQiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcFJlcXVlc3RCdWYgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodFNpclJjdkZsdFBrdE1hdGNoUnNwKSk7CisgICAgaWYgKE5VTEwgPT0gcFJlcXVlc3RCdWYpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAiJXM6IE5vdCBhYmxlIHRvIGFsbG9jYXRlICIKKyAgICAgICAgICAgICAgICAgICJtZW1vcnkgZm9yIEdldCBQQyBGaWx0ZXIgTWF0Y2ggQ291bnQgcmVxdWVzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMRURfQUxMT0M7CisgICAgfQorCisgICAgbXNnLnR5cGUgPSBXREFfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JFUTsKKyAgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgIG1zZy5ib2R5cHRyID0gcFJlcXVlc3RCdWY7CisKKyAgICAvKiBDYWNoZSB0aGUgUGFja2V0IENvYWxlc2NpbmcgRmlsdGVyIE1hdGNoIENvdW50IGNhbGxiYWNrIGluZm9ybWF0aW9uICovCisgICAgaWYgKE5VTEwgIT0gcE1hYy0+cG1jLkZpbHRlck1hdGNoQ291bnRDQikKKyAgICB7CisgICAgICAgIC8vIERvIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNhbGxiYWNrIGlzIGluIHVzZT8gCisgICAgICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG5vdCBzZW5kaW5nIHRoZSBzYW1lIG1lc3NhZ2UgYWdhaW4gd2hlbiBpdCBpcyBwZW5kaW5nLAorICAgICAgICAvLyB0aGUgb25seSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5vdCBOVUxMIGlzIHRoYXQgdGhlIHByZXZpb3VzIG1lc3NhZ2UgCisgICAgICAgIC8vd2FzIHRpbWVkIG91dCBvciBmYWlsZWQuCisgICAgICAgIC8vIFNvLCBpdCB3aWxsIGJlIHNhZmUgdG8gc2V0IHRoZSBjYWxsYmFjayBpbiB0aGlzIGNhc2UuCisgICAgfQorCisgICAgcE1hYy0+cG1jLkZpbHRlck1hdGNoQ291bnRDQiA9IGNhbGxiYWNrUm91dGluZTsKKyAgICBwTWFjLT5wbWMuRmlsdGVyTWF0Y2hDb3VudENCQ29udGV4dCA9IGNhbGxiYWNrQ29udGV4dDsKKworICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NT0RVTEVfSURfV0RBLCAmbXNnKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICIlczogTm90IGFibGUgdG8gcG9zdCBXREFfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JFUSAiCisgICAgICAgICAgICAibWVzc2FnZSB0byBXREEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gcG1jU2V0R1RLT2ZmbG9hZAorICAgIFxicmllZiAgU2V0IEdUSyBvZmZsb2FkIGZlYXR1cmUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcEd0a09mZmxvYWQgLSBQb2ludGVyIHRvIHRoZSBHVEsgb2ZmbG9hZCByZXF1ZXN0LgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAgICAgICAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAgQ2Fubm90IHNldCB0aGUgb2ZmbG9hZC4KKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIFJlcXVlc3QgYWNjZXB0ZWQuIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBwbWNTZXRHVEtPZmZsb2FkICh0SGFsSGFuZGxlIGhIYWwsIHRwU2lyR3RrT2ZmbG9hZFBhcmFtcyBwR3RrT2ZmbG9hZCkKK3sKKyAgICB0cFNpckd0a09mZmxvYWRQYXJhbXMgcFJlcXVlc3RCdWY7CisgICAgdm9zX21zZ190IG1zZzsKKyAgICBpbnQgaTsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiJXM6IEtleVJlcGxheUNvdW50ZXI6ICVkIiwgCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwR3RrT2ZmbG9hZC0+dWxsS2V5UmVwbGF5Q291bnRlcik7CisKKyAgICBwUmVxdWVzdEJ1ZiA9ICh0cFNpckd0a09mZmxvYWRQYXJhbXMpdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJHdGtPZmZsb2FkUGFyYW1zKSk7CisgICAgaWYgKE5VTEwgPT0gcFJlcXVlc3RCdWYpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAgICAgICAibWVtb3J5IGZvciBHVEsgb2ZmbG9hZCByZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQzsKKyAgICB9CisKKyAgICB2b3NfbWVtX2NvcHkocFJlcXVlc3RCdWYsIHBHdGtPZmZsb2FkLCBzaXplb2YodFNpckd0a09mZmxvYWRQYXJhbXMpKTsKKyAgICAgICAgCisgICAgbXNnLnR5cGUgPSBXREFfR1RLX09GRkxPQURfUkVROworICAgIG1zZy5yZXNlcnZlZCA9IDA7CisgICAgbXNnLmJvZHlwdHIgPSBwUmVxdWVzdEJ1ZjsKKyAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NT0RVTEVfSURfV0RBLCAmbXNnKSkpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBOb3QgYWJsZSB0byBwb3N0ICIKKyAgICAgICAgICAgICAgICAgICJTSVJfSEFMX1NFVF9HVEtfT0ZGTE9BRCBtZXNzYWdlIHRvIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHZvc19tZW1fZnJlZShwUmVxdWVzdEJ1Zik7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gcG1jR2V0R1RLT2ZmbG9hZAorICAgIFxicmllZiAgR2V0IEdUSyBvZmZsb2FkIGluZm9ybWF0aW9uLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGNhbGxiYWNrUm91dGluZSAtIFBvaW50ZXIgdG8gdGhlIEdUSyBPZmZsb2FkIEdldCBJbmZvIHJlc3BvbnNlIGNhbGxiYWNrIHJvdXRpbmUuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFICBDYW5ub3Qgc2V0IHRoZSBvZmZsb2FkLgorICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAgUmVxdWVzdCBhY2NlcHRlZC4gCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBtY0dldEdUS09mZmxvYWQodEhhbEhhbmRsZSBoSGFsLCBHVEtPZmZsb2FkR2V0SW5mb0NhbGxiYWNrIGNhbGxiYWNrUm91dGluZSwgdm9pZCAqY2FsbGJhY2tDb250ZXh0KQoreworICAgIHRwU2lyR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXMgIHBSZXF1ZXN0QnVmOworICAgIHZvc19tc2dfdCAgICAgICAgICAgICAgIG1zZzsKKyAgICB0cEFuaVNpckdsb2JhbCAgICAgICAgICBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBmaWx0ZXJJZCA9ICVkIiwgCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgIHBSZXF1ZXN0QnVmID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJHdGtPZmZsb2FkR2V0SW5mb1JzcFBhcmFtcykpOworICAgIGlmIChOVUxMID09IHBSZXF1ZXN0QnVmKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgIgorICAgICAgICAgICAgICAgICAgIm1lbW9yeSBmb3IgR2V0IEdUSyBPZmZsb2FkIHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTEVEX0FMTE9DOworICAgIH0KKworICAgIG1zZy50eXBlID0gV0RBX0dUS19PRkZMT0FEX0dFVElORk9fUkVROworICAgIG1zZy5yZXNlcnZlZCA9IDA7CisgICAgbXNnLmJvZHlwdHIgPSBwUmVxdWVzdEJ1ZjsKKworICAgIC8qIENhY2hlIHRoZSBHZXQgR1RLIE9mZmxvYWQgY2FsbGJhY2sgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoTlVMTCAhPSBwTWFjLT5wbWMuR3RrT2ZmbG9hZEdldEluZm9DQikKKyAgICB7CisgICAgICAgIC8vIERvIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNhbGxiYWNrIGlzIGluIHVzZT8gCisgICAgICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG5vdCBzZW5kaW5nIHRoZSBzYW1lIG1lc3NhZ2UgYWdhaW4gd2hlbiBpdCBpcyBwZW5kaW5nLAorICAgICAgICAvLyB0aGUgb25seSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5vdCBOVUxMIGlzIHRoYXQgdGhlIHByZXZpb3VzIG1lc3NhZ2Ugd2FzIHRpbWVkIG91dCBvciBmYWlsZWQuCisgICAgICAgIC8vIFNvLCBpdCB3aWxsIGJlIHNhZmUgdG8gc2V0IHRoZSBjYWxsYmFjayBpbiB0aGlzIGNhc2UuCisgICAgfQorCisgICAgcE1hYy0+cG1jLkd0a09mZmxvYWRHZXRJbmZvQ0IgPSBjYWxsYmFja1JvdXRpbmU7CisgICAgcE1hYy0+cG1jLkd0a09mZmxvYWRHZXRJbmZvQ0JDb250ZXh0ID0gY2FsbGJhY2tDb250ZXh0OworCisgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTU9EVUxFX0lEX1dEQSwgJm1zZykpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gcG9zdCBXREFfR1RLX09GRkxPQURfR0VUSU5GT19SRVEgbWVzc2FnZSB0byBXREEiLCAKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgdm9zX21lbV9mcmVlKHBSZXF1ZXN0QnVmKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECmRpZmYgLS1naXQgYS9DT1JFL1NNRS9zcmMvcG1jL3BtY0xvZ0R1bXAuYyBiL0NPUkUvU01FL3NyYy9wbWMvcG1jTG9nRHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2M2VhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9zcmMvcG1jL3BtY0xvZ0R1bXAuYwpAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogIHBtY0xvZ0R1bXAuYworKgorKiBEZXNjcmlwdGlvbjogSW1wbGVtZW50cyB0aGUgZHVtcCBjb21tYW5kcyBzcGVjaWZpYyB0byBQTUMgbW9kdWxlCisqCisqIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLgorKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJwbWNBcGkuaCIKKyNpbmNsdWRlICJwbWMuaCIKKyNpbmNsdWRlICJsb2dEdW1wLmgiCisjaW5jbHVkZSAic21zRGVidWcuaCIKKyNpbmNsdWRlICJzbWVfQXBpLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisKKyNpZiBkZWZpbmVkKEFOSV9MT0dEVU1QKQorCit2b2lkIGR1bXBfcG1jX2NhbGxiYWNrUm91dGluZSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cykKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKWNhbGxiYWNrQ29udGV4dDsKKyAgICBzbXNMb2cocE1hYywgTE9HVywgIioqKioqKioqKlJlY2VpdmVkIGNhbGxiYWNrIGZyb20gUE1DIHdpdGggc3RhdHVzID0gJWRcbioqKioqKioqKiIsc3RhdHVzKTsKK30KKworI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUwordm9pZCBkdW1wX3BtY19jYWxsYmFja1JvdXRpbmUyICh2b2lkICpjYWxsYmFja0NvbnRleHQsIHRwU2lyV2FrZVJlYXNvbkluZCBwV2FrZVJlYXNvbkluZCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKWNhbGxiYWNrQ29udGV4dDsKKyAgICBzbXNMb2cocE1hYywgTE9HVywgIioqKioqKioqKlJlY2VpdmVkIGNhbGxiYWNrIGZyb20gUE1DIHdpdGggcmVhc29uID0gJWRcbioqKioqKioqKiIscFdha2VSZWFzb25JbmQtPnVsUmVhc29uKTsKK30KKyNlbmRpZiAvLyBXTEFOX1dBS0VVUF9FVkVOVFMKKwordm9pZCBkdW1wX3BtY19kZXZpY2VVcGRhdGVSb3V0aW5lICh2b2lkICpjYWxsYmFja0NvbnRleHQsIHRQbWNTdGF0ZSBwbWNTdGF0ZSkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKWNhbGxiYWNrQ29udGV4dDsKKyAgICBzbXNMb2cocE1hYywgTE9HVywgIioqKioqKioqKlJlY2VpdmVkIG1zZyBmcm9tIFBNQzogRGV2aWNlIGlzIGluICVzIHN0YXRlXG4qKioqKioqKioiLCBwbWNHZXRQbWNTdGF0ZVN0cihwbWNTdGF0ZSkpOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX3BtY19zdGF0ZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICBjaGFyICpwdHIgPSBwOworCisgICAgKHZvaWQpIGFyZzE7ICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICIqKioqKioqKiAgUE1DIFN0YXRlICYgQ29uZmlndXJhdGlvbiAqKioqKioqKiBcbiIpOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiBQTUM6IElNUFMgRW5hYmxlZD8gJWRcbiIsIHBNYWMtPnBtYy5pbXBzRW5hYmxlZCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiIFBNQzogQXV0byBCTVBTIFRpbWVyIEVuYWJsZWQ/ICVkXG4iLCBwTWFjLT5wbWMuYXV0b0JtcHNFbnRyeUVuYWJsZWQpOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiBQTUM6IEJNUFMgRW5hYmxlZD8gJWRcbiIsIHBNYWMtPnBtYy5ibXBzRW5hYmxlZCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiIFBNQzogVUFQU0QgRW5hYmxlZD8gJWRcbiIsIHBNYWMtPnBtYy51YXBzZEVuYWJsZWQpOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiBQTUM6IFdvV0wgRW5hYmxlZD8gJWRcbiIsIHBNYWMtPnBtYy53b3dsRW5hYmxlZCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiIFBNQzogU3RhbmRieSBFbmFibGVkPyAlZFxuIiwgcE1hYy0+cG1jLnN0YW5kYnlFbmFibGVkKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICIgUE1DOiBBdXRvIEJNUFMgdGltZXIgcGVyaW9kIChtcyk6ICVkXG4iLCBwTWFjLT5wbWMuYm1wc0NvbmZpZy50cmFmZmljTWVhc3VyZVBlcmlvZCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiIFBNQzogQk1QUyBMaXN0ZW4gSW50ZXJ2YWwgKEJlYWNvbiBpbnRlcnZhbHMpOiAlZFxuIiwgcE1hYy0+cG1jLmJtcHNDb25maWcuYm1wc1BlcmlvZCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiIFBNQzogRGV2aWNlIFN0YXRlID0gJXNcbiIsIHBtY0dldFBtY1N0YXRlU3RyKHBNYWMtPnBtYy5wbWNTdGF0ZSkpOworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIiBQTUM6IFJlcXVlc3RGdWxsUG93ZXJQZW5kaW5nID0gJWRcbiIsIHBNYWMtPnBtYy5yZXF1ZXN0RnVsbFBvd2VyUGVuZGluZyk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYyxwLCAiIFBNQzogVWFwc2RTZXNzaW9uUmVxdWlyZWQgPSAlZFxuIiwgcE1hYy0+cG1jLnVhcHNkU2Vzc2lvblJlcXVpcmVkKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICIgUE1DOiB3b3dsTW9kZVJlcXVpcmVkID0gJWRcblxuIiwgcE1hYy0+cG1jLndvd2xNb2RlUmVxdWlyZWQpOworCisgICAgc21zTG9nKHBNYWMsIExPR1csICJcbiVzIiwgcHRyKTsKKworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX3BtY19lbmFibGVfaW1wcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICAodm9pZCkgYXJnMTsgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKyAgICAodm9pZClwbWNFbmFibGVQb3dlclNhdmUocE1hYywgZVBNQ19JRExFX01PREVfUE9XRVJfU0FWRSk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfcG1jX2Rpc2FibGVfaW1wcyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICAodm9pZCkgYXJnMTsgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKyAgICAodm9pZClwbWNEaXNhYmxlUG93ZXJTYXZlKHBNYWMsIGVQTUNfSURMRV9NT0RFX1BPV0VSX1NBVkUpOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX3BtY19yZXF1ZXN0X2ltcHMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKyAgICBwTWFjLT5wbWMuaW1wc0VuYWJsZWQgPSBUUlVFOworICAgICh2b2lkKXBtY1JlcXVlc3RJbXBzKHBNYWMsIGFyZzEsIGR1bXBfcG1jX2NhbGxiYWNrUm91dGluZSwgcE1hYyk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfcG1jX3N0YXJ0X2F1dG9fYm1wc190aW1lciggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICAodm9pZCkgYXJnMTsgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKyAgICBwTWFjLT5wbWMuYm1wc0VuYWJsZWQgPSBUUlVFOworICAgICh2b2lkKXBtY1N0YXJ0QXV0b0JtcHNUaW1lcihwTWFjKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9wbWNfc3RvcF9hdXRvX2JtcHNfdGltZXIoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzE7ICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgKHZvaWQpcG1jU3RvcEF1dG9CbXBzVGltZXIocE1hYyk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfcG1jX2VuYWJsZV9ibXBzKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgICh2b2lkKXBtY0VuYWJsZVBvd2VyU2F2ZShwTWFjLCBlUE1DX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkUpOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX3BtY19kaXNhYmxlX2JtcHMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzE7ICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgKHZvaWQpcG1jRGlzYWJsZVBvd2VyU2F2ZShwTWFjLCBlUE1DX0JFQUNPTl9NT0RFX1BPV0VSX1NBVkUpOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX3BtY19yZXF1ZXN0X2JtcHMoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzE7ICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgcE1hYy0+cG1jLmJtcHNFbmFibGVkID0gVFJVRTsKKyAgICAodm9pZClzbWVfUmVxdWVzdEJtcHMocE1hYywgZHVtcF9wbWNfY2FsbGJhY2tSb3V0aW5lLCBwTWFjKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9wbWNfZW5hYmxlX3VhcHNkKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgICh2b2lkKXBtY0VuYWJsZVBvd2VyU2F2ZShwTWFjLCBlUE1DX1VBUFNEX01PREVfUE9XRVJfU0FWRSk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfcG1jX2Rpc2FibGVfdWFwc2QoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzE7ICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgKHZvaWQpcG1jRGlzYWJsZVBvd2VyU2F2ZShwTWFjLCBlUE1DX1VBUFNEX01PREVfUE9XRVJfU0FWRSk7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK2R1bXBfcG1jX3N0YXJ0X3VhcHNkKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgIHBNYWMtPnBtYy5ibXBzRW5hYmxlZCA9IFRSVUU7CisgICAgcE1hYy0+cG1jLnVhcHNkRW5hYmxlZCA9IFRSVUU7CisgICAgKHZvaWQpcG1jU3RhcnRVYXBzZChwTWFjLCBkdW1wX3BtY19jYWxsYmFja1JvdXRpbmUsIHBNYWMpOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitkdW1wX3BtY19zdG9wX3VhcHNkKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgICh2b2lkKXBtY1N0b3BVYXBzZChwTWFjKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9wbWNfcmVxdWVzdF9zdGFuZGJ5KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgIHBNYWMtPnBtYy5zdGFuZGJ5RW5hYmxlZCA9IFRSVUU7CisgICAgKHZvaWQpcG1jUmVxdWVzdFN0YW5kYnkocE1hYywgZHVtcF9wbWNfY2FsbGJhY2tSb3V0aW5lLCBwTWFjKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9wbWNfcmVxdWVzdF9mdWxsX3Bvd2VyKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgICh2b2lkKXNtZV9SZXF1ZXN0RnVsbFBvd2VyKHBNYWMsIGR1bXBfcG1jX2NhbGxiYWNrUm91dGluZSwgcE1hYywgZVNNRV9GVUxMX1BXUl9ORUVERURfQllfSEREKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9wbWNfZW50ZXJfd293bCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICB0U2lyU21lV293bEVudGVyUGFyYW1zIHdvd2xFbnRlclBhcmFtczsKKyAgICB0U2lyUmV0U3RhdHVzIHN0YXR1czsKKyAgICB0QU5JX1UzMiBsZW5ndGg7CisgICAgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgIAorICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgJndvd2xFbnRlclBhcmFtcywgc2l6ZW9mKHRTaXJTbWVXb3dsRW50ZXJQYXJhbXMpKTsKKworICAgIGlmIChhcmcxID09IDAgJiYgYXJnMiA9PSAwKQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJSZXF1ZXN0aW5nIFdvV0wgYnV0IG5laXRoZXIgbWFnaWMgcGt0IGFuZCBwdHJuIGJ5dGUgbWF0Y2hpbmcgaXMgYmVpbmcgZW5hYmxlZFxuIik7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKyAgICBpZihhcmcxID09IDEpCisgICAgeworICAgICAgICB3b3dsRW50ZXJQYXJhbXMudWNNYWdpY1BrdEVuYWJsZSA9IDE7CisgICAgICAgIC8qIG1hZ2ljIHBhY2tldCAqLworICAgICAgICBsZW5ndGggPSBTSVJfTUFDX0FERFJfTEVOR1RIOworICAgICAgICBzdGF0dXMgPSB3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX1NUQV9JRCwgKHRBTklfVTggKil3b3dsRW50ZXJQYXJhbXMubWFnaWNQdHJuLCAmbGVuZ3RoKTsgCisgICAgICAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIlJlYWRpbmcgb2YgV05JX0NGR19TVEFfSUQgZnJvbSBDRkcgZmFpbGVkLiBVc2luZyBoYXJkY29kZWQgU1RBIE1BQyBBZGRyXG4iKTsKKyAgICAgICAgICAgIHdvd2xFbnRlclBhcmFtcy5tYWdpY1B0cm5bMF0gPSAweDAwOworICAgICAgICAgICAgd293bEVudGVyUGFyYW1zLm1hZ2ljUHRyblsxXSA9IDB4MGE7CisgICAgICAgICAgICB3b3dsRW50ZXJQYXJhbXMubWFnaWNQdHJuWzJdID0gMHhmNTsKKyAgICAgICAgICAgIHdvd2xFbnRlclBhcmFtcy5tYWdpY1B0cm5bM10gPSAweDA0OworICAgICAgICAgICAgd293bEVudGVyUGFyYW1zLm1hZ2ljUHRybls0XSA9IDB4MDU7CisgICAgICAgICAgICB3b3dsRW50ZXJQYXJhbXMubWFnaWNQdHJuWzVdID0gMHgwNjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihhcmcyID09IDEpCisgICAgeworICAgICAgd293bEVudGVyUGFyYW1zLnVjUGF0dGVybkZpbHRlcmluZ0VuYWJsZSA9IDE7CisgICAgfQorCisgICAgcE1hYy0+cG1jLmJtcHNFbmFibGVkID0gVFJVRTsKKyAgICBwTWFjLT5wbWMud293bEVuYWJsZWQgPSBUUlVFOworI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUworICAgICh2b2lkKXNtZV9FbnRlcldvd2wocE1hYywgZHVtcF9wbWNfY2FsbGJhY2tSb3V0aW5lLCBwTWFjLCBkdW1wX3BtY19jYWxsYmFja1JvdXRpbmUyLCBwTWFjLCAmd293bEVudGVyUGFyYW1zKTsKKyNlbHNlIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworICAgICh2b2lkKXNtZV9FbnRlcldvd2wocE1hYywgZHVtcF9wbWNfY2FsbGJhY2tSb3V0aW5lLCBwTWFjLCAmd293bEVudGVyUGFyYW1zKTsKKyNlbmRpZiAvLyBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9wbWNfZXhpdF93b3dsKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcxOyAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgICh2b2lkKXNtZV9FeGl0V293bChwTWFjKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9wbWNfcmVtb3ZlX3B0cm4oIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgdFNpcldvd2xEZWxCY2FzdFB0cm4gZGVsUGF0dGVybjsKKyAgICAodm9pZCkgYXJnMjsgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworCisgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCAmZGVsUGF0dGVybiwgc2l6ZW9mKHRTaXJXb3dsRGVsQmNhc3RQdHJuKSk7CisKKyAgICBpZihhcmcxIDw9IDcpCisgICAgeworICAgICAgICBkZWxQYXR0ZXJuLnVjUGF0dGVybklkID0gKHRBTklfVTgpYXJnMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJkdW1wX3BtY19yZW1vdmVfcHRybjogSW52YWxpZCBwYXR0ZXJuIElkICVkXG4iLGFyZzEpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICAodm9pZClwbWNXb3dsRGVsQmNhc3RQYXR0ZXJuKHBNYWMsICZkZWxQYXR0ZXJuKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9wbWNfdGVzdF91YXBzZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICB0U2lyU21lUnNwIHNtZVJzcDsKKyAgICBzbWVSc3Auc3RhdHVzQ29kZSA9IGVTSVJfU01FX1NVQ0NFU1M7CisKKyAgICAodm9pZCkgYXJnMTsgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKworICAgIHBNYWMtPnBtYy51YXBzZEVuYWJsZWQgPSBUUlVFOworICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IEJNUFM7CisKKyAgICBwbWNSZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kKHBNYWMsIGR1bXBfcG1jX2RldmljZVVwZGF0ZVJvdXRpbmUsIHBNYWMpOworCisgICAgcG1jU3RhcnRVYXBzZChwTWFjLCBkdW1wX3BtY19jYWxsYmFja1JvdXRpbmUsIHBNYWMpOworICAgIHNtZVJzcC5tZXNzYWdlVHlwZSA9IGVXTklfUE1DX0VOVEVSX1VBUFNEX1JTUDsKKyAgICBwbWNNZXNzYWdlUHJvY2Vzc29yKHBNYWMsICZzbWVSc3ApOworICAgIHBtY1N0b3BVYXBzZChwTWFjKTsKKyAgICBzbWVSc3AubWVzc2FnZVR5cGUgPSBlV05JX1BNQ19FWElUX1VBUFNEX1JTUDsKKyAgICBwbWNNZXNzYWdlUHJvY2Vzc29yKHBNYWMsICZzbWVSc3ApOworICAgIHBtY0RlcmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZChwTWFjLCBkdW1wX3BtY19kZXZpY2VVcGRhdGVSb3V0aW5lKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKgorZHVtcF9wbWNfdGVzdF9Xb3dsKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgIHRTaXJTbWVSc3Agc21lUnNwOworICAgIHRTaXJXb3dsQWRkQmNhc3RQdHJuIGFkZFBhdHRlcm47CisgICAgdFNpcldvd2xEZWxCY2FzdFB0cm4gZGVsUGF0dGVybjsKKyAgICB0U2lyU21lV293bEVudGVyUGFyYW1zIHdvd2xFbnRlclBhcmFtczsKKworICAgIHNtZVJzcC5zdGF0dXNDb2RlID0gZVNJUl9TTUVfU1VDQ0VTUzsKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZhZGRQYXR0ZXJuLCBzaXplb2YodFNpcldvd2xBZGRCY2FzdFB0cm4pKTsKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZkZWxQYXR0ZXJuLCBzaXplb2YodFNpcldvd2xEZWxCY2FzdFB0cm4pKTsKKyAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsICZ3b3dsRW50ZXJQYXJhbXMsIHNpemVvZih0U2lyU21lV293bEVudGVyUGFyYW1zKSk7CisKKyAgICAodm9pZCkgYXJnMTsgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKworICAgIC8vQWRkIHBhdHRlcm4KKyAgICBzbWVfV293bEFkZEJjYXN0UGF0dGVybihwTWFjLCAmYWRkUGF0dGVybik7CisKKyAgICAvL0RlbGV0ZSBwYXR0ZXJuCisgICAgc21lX1dvd2xEZWxCY2FzdFBhdHRlcm4ocE1hYywgJmRlbFBhdHRlcm4pOworCisgICAgLy9Gb3JjZSB0aGUgZGV2aWNlIGludG8gQk1QUworICAgIHBNYWMtPnBtYy5wbWNTdGF0ZSA9IEJNUFM7CisKKyAgICAvL0VudGVyIFdvd2wKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgICBzbWVfRW50ZXJXb3dsKHBNYWMsIGR1bXBfcG1jX2NhbGxiYWNrUm91dGluZSwgcE1hYywgZHVtcF9wbWNfY2FsbGJhY2tSb3V0aW5lMiwgcE1hYywgJndvd2xFbnRlclBhcmFtcyk7CisjZWxzZSAvLyBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgICBzbWVfRW50ZXJXb3dsKHBNYWMsIGR1bXBfcG1jX2NhbGxiYWNrUm91dGluZSwgcE1hYywgJndvd2xFbnRlclBhcmFtcyk7CisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisgICAgc21lUnNwLm1lc3NhZ2VUeXBlID0gZVdOSV9QTUNfRU5URVJfV09XTF9SU1A7CisgICAgcG1jTWVzc2FnZVByb2Nlc3NvcihwTWFjLCAmc21lUnNwKTsKKworICAgIC8vRXhpdCBXb3dsCisgICAgc21lX0V4aXRXb3dsKHBNYWMpOworICAgIHNtZVJzcC5tZXNzYWdlVHlwZSA9IGVXTklfUE1DX0VYSVRfV09XTF9SU1A7CisgICAgcG1jTWVzc2FnZVByb2Nlc3NvcihwTWFjLCAmc21lUnNwKTsKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIHREdW1wRnVuY0VudHJ5IHBtY01lbnVEdW1wVGFibGVbXSA9IHsKKyAgICB7MCwgICAgICJQTUMgKDkwMC05MjUpIiwgICAgICAgICAgIE5VTEx9LAorICAgIC8vIEdlbmVyYWwKKyAgICB7OTAwLCAgICJQTUM6IER1bXAgU3RhdGUgKyBjb25maWciLCBkdW1wX3BtY19zdGF0ZX0sCisgICAgLy8gSU1QUyBSZWxhdGVkCisgICAgezkwMSwgICAiUE1DOiBFbmFibGUgSU1QUyIsICAgICAgICAgZHVtcF9wbWNfZW5hYmxlX2ltcHN9LAorICAgIHs5MDIsICAgIlBNQzogRGlzYWJsZSBJTVBTIiwgICAgICAgIGR1bXBfcG1jX2Rpc2FibGVfaW1wc30sCisgICAgezkwMywgICAiUE1DOiBSZXF1ZXN0IElNUFM6IFN5bnRheDogZHVtcCA5MDMgPGltcHNfcGVyaW9kX21zPiIsIGR1bXBfcG1jX3JlcXVlc3RfaW1wc30sCisgICAgLy8gQk1QUyBSZWxhdGVkCisgICAgezkwNCwgICAiUE1DOiBTdGFydCBBdXRvIEJNUFMgVGltZXIiLCAgZHVtcF9wbWNfc3RhcnRfYXV0b19ibXBzX3RpbWVyfSwKKyAgICB7OTA1LCAgICJQTUM6IFN0b3AgQXV0byBCTVBTIFRpbWVyIiwgZHVtcF9wbWNfc3RvcF9hdXRvX2JtcHNfdGltZXJ9LAorICAgIHs5MDYsICAgIlBNQzogUmVxdWVzdCBCTVBTIiwgICAgICAgIGR1bXBfcG1jX3JlcXVlc3RfYm1wc30sCisgICAgLy8gVUFQU0QgUmVsYXRlZAorICAgIHs5MDcsICAgIlBNQzogRW5hYmxlIFVBUFNEIiwgICAgICAgIGR1bXBfcG1jX2VuYWJsZV91YXBzZH0sCisgICAgezkwOCwgICAiUE1DOiBEaXNhYmxlIFVBUFNEIiwgICAgICAgZHVtcF9wbWNfZGlzYWJsZV91YXBzZH0sCisgICAgezkwOSwgICAiUE1DOiBTdGFydCBVQVBTRCIsICAgICAgICAgZHVtcF9wbWNfc3RhcnRfdWFwc2R9LAorICAgIHs5MTAsICAgIlBNQzogU3RvcCBVQVBTRCIsICAgICAgICAgIGR1bXBfcG1jX3N0b3BfdWFwc2R9LAorICAgIC8vIFN0YW5kYnkgUmVsYXRlZAorICAgIHs5MTEsICAgIlBNQzogUmVxdWVzdCBTdGFuZGJ5IiwgICAgIGR1bXBfcG1jX3JlcXVlc3Rfc3RhbmRieX0sCisgICAgLy8gRnVsbCBQb3dlciBSZWxhdGVkCisgICAgezkxMiwgICAiUE1DOiBSZXF1ZXN0IEZ1bGwgUG93ZXIiLCAgZHVtcF9wbWNfcmVxdWVzdF9mdWxsX3Bvd2VyfSwKKyAgICAvL1VuaXQgVGVzdCBSZWxhdGVkCisgICAgezkxMywgICAiUE1DOiBUZXN0IFVBUFNEIiwgICAgICAgICAgZHVtcF9wbWNfdGVzdF91YXBzZH0sCisgICAgezkxNCwgICAiUE1DOiBUZXN0IFdPV0wiLCAgICAgICAgICAgZHVtcF9wbWNfdGVzdF9Xb3dsfSwKKyAgICAvLyBXb1dMIFJlbGF0ZWQKKyAgICB7OTE1LCAgICJQTUM6IEVudGVyIFdvV0w6IFN5bnRheDogZHVtcCA5MTUgPGVuYWJsZV9tYWdpY19wa3Q+IDxlbmFibGVfcHRybl9tYXRjaD4iLCAgZHVtcF9wbWNfZW50ZXJfd293bH0sCisgICAgezkxNiwgICAiUE1DOiBFeGl0IFdvV0wiLCAgZHVtcF9wbWNfZXhpdF93b3dsfSwKKyAgICB7OTE3LCAgICJQTUM6IFJlbW92ZSBhIHBhdHRlcm46IFN5bnRheDogZHVtcCA5MTcgPHBhdHRlcm5faWQoMC03KT4iLCAgZHVtcF9wbWNfcmVtb3ZlX3B0cm59LAorICAgIHs5MTgsICAgIlBNQzogRW5hYmxlIEJNUFMiLCAgICAgICAgIGR1bXBfcG1jX2VuYWJsZV9ibXBzfSwKKyAgICB7OTE5LCAgICJQTUM6IERpc2FibGUgQk1QUyIsICAgICAgICBkdW1wX3BtY19kaXNhYmxlX2JtcHN9Cit9OworCit2b2lkIHBtY0R1bXBJbml0KHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICBsb2dEdW1wUmVnaXN0ZXJUYWJsZSggKHRwQW5pU2lyR2xvYmFsKWhIYWwsICZwbWNNZW51RHVtcFRhYmxlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocG1jTWVudUR1bXBUYWJsZSkvc2l6ZW9mKHBtY01lbnVEdW1wVGFibGVbMF0pICk7Cit9CisKKyNlbmRpZiAvLyNpZiBkZWZpbmVkKEFOSV9MT0dEVU1QKQpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvc3JjL3JybS9zbWVfcnJtLmMgYi9DT1JFL1NNRS9zcmMvcnJtL3NtZV9ycm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2U5YzBmCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvc3JjL3JybS9zbWVfcnJtLmMKQEAgLTAsMCArMSwxMjk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqICovCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgc21lX1JybS5jCisgIAorICBcYnJpZWYgaW1wbGVtZW50YXRpb24gZm9yIFNNRSBSUk0gQVBJcworICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxJbnRlcm5hbC5oIgorI2VuZGlmCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAic21lSW5zaWRlLmgiCisjaW5jbHVkZSAic21lX0FwaS5oIgorI2luY2x1ZGUgInNtc0RlYnVnLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisjaW5jbHVkZSAidm9zX2RpYWdfY29yZV9ldmVudC5oIgorI2luY2x1ZGUgInZvc19kaWFnX2NvcmVfbG9nLmgiCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisjaW5jbHVkZSAiY3NySW5zaWRlQXBpLmgiCisKKyNpbmNsdWRlICJycm1HbG9iYWwuaCIKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyNpbmNsdWRlICJjc3JDY3guaCIKKyNlbmRpZgorCisvKiBSb2FtIHNjb3JlIGZvciBhIG5laWdoYm9yIEFQIHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgYmVsb3cgZGVmaW5pdGlvbnMuCisgICAgVGhlIGNhbGN1bGF0ZWQgcm9hbSBzY29yZSB3aWxsIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSByb2FtYWJsZSBjYW5kaWRhdGUgZnJvbSBuZWlnaGJvciBBUCBsaXN0ICovCisjZGVmaW5lIFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9SRUFDSEFCSUxJVFkgICAgICAgICAgICAgMCAgIC8qIFdoZW4gd2Ugc3VwcG9ydCAxMXIgb3ZlciB0aGUgRFMsIHRoaXMgc2hvdWxkIGhhdmUgYSBub24temVybyB2YWx1ZSAqLworI2RlZmluZSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfU0VDVVJJVFkgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9LRVlfU0NPUEUgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfUkVQT1JUX0NBUEFCSUxJVFlfU1BFQ1RSVU1fTUdNVCAwICAgLyogTm90IHVzZWQgKi8KKyNkZWZpbmUgUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfUkVQT1JUX0NBUEFCSUxJVFlfUU9TICAgICAgICAgICA1CisjZGVmaW5lIFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9DQVBBQklMSVRZX0FQU0QgICAgICAgICAgMworI2RlZmluZSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9SUk0gICAgICAgICAgIDgKKyNkZWZpbmUgUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfUkVQT1JUX0NBUEFCSUxJVFlfREVMQVlFRF9CQSAgICAwICAgLyogV2UgZG9udCBzdXBwb3J0IGRlbGF5ZWQgQkEgKi8KKyNkZWZpbmUgUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfUkVQT1JUX0NBUEFCSUxJVFlfSU1NRURJQVRFX0JBICAzCisjZGVmaW5lIFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9NT0JJTElUWV9ET01BSU4gICAgICAgICAgMzAKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyNkZWZpbmUgUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfSUFQUF9MSVNUICAgICAgICAgICAgICAgICAgICAgICAzMAorI2VuZGlmCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBycm1MTFB1cmdlTmVpZ2hib3JDYWNoZSgpIC0gCisgICAgVGhpcyBmdW5jdGlvbiBwdXJnZXMgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBuZWlnaGJvciBjYWNoZSBhbmQgZnJlZXMgdXAgYWxsIHRoZSBpbnRlcm5hbCBub2RlcyAgIAorCisgIFxwYXJhbSAgLSBwTWFjICAtIFBvaW50ZXIgdG8gdGhlIEhhbCBIYW5kbGUuCisgICAgICAgICAgLSBwTGlzdCAtIFBvaW50ZXIgdGhlIExpc3QgdGhhdCBzaG91bGQgYmUgcHVyZ2VkLgorICBccmV0dXJuIC0gdm9pZAorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgcnJtTExQdXJnZU5laWdoYm9yQ2FjaGUodHBBbmlTaXJHbG9iYWwgcE1hYywgdERibExpbmtMaXN0ICpwTGlzdCkKK3sKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKyAgICB0UnJtTmVpZ2hib3JSZXBvcnREZXNjICpwTmVpZ2hib3JSZXBvcnREZXNjOworICAgIAorICAgIGNzckxMTG9jayhwTGlzdCk7CisgICAgCisgICAgd2hpbGUoKHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZChwTGlzdCwgTExfQUNDRVNTX05PTE9DSykpICE9IE5VTEwpCisgICAgeworICAgICAgICBwTmVpZ2hib3JSZXBvcnREZXNjID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0UnJtTmVpZ2hib3JSZXBvcnREZXNjLCBMaXN0ICk7CisgICAgICAgIHZvc19tZW1fZnJlZShwTmVpZ2hib3JSZXBvcnREZXNjLT5wTmVpZ2hib3JCc3NEZXNjcmlwdGlvbik7CisgICAgICAgIHZvc19tZW1fZnJlZShwTmVpZ2hib3JSZXBvcnREZXNjKTsKKyAgICB9CisgICAgCisgICAgY3NyTExVbmxvY2socExpc3QpOyAgIAorICAgICAKKyAgICByZXR1cm47Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHJybUluZGljYXRlTmVpZ2hib3JSZXBvcnRSZXN1bHQoKSAtIAorICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBjYWxsYmFjayByZWdpc3RlciBieSB0aGUgY2FsbGVyIHdoaWxlIHJlcXVlc3RpbmcgZm9yIAorICAgICAgICBuZWlnaGJvciByZXBvcnQuIFRoaXMgZnVuY3Rpb24gZ2V0cyBpbnZva2VkIGlmIGEgbmVpZ2hib3IgcmVwb3J0IGlzIHJlY2VpdmVkIGZyb20gYW4gQVAKKyAgICAgICAgb3IgbmVpZ2hib3IgcmVzcG9uc2Ugd2FpdCB0aW1lciBleHBpcmVzLgorCisgIFxwYXJhbSAgLSBwTWFjIC0gUG9pbnRlciB0byB0aGUgSGFsIEhhbmRsZS4KKyAgICAgICAgICAtIHZvc1N0YXR1cyAtIFZPU19TVEFUVVNfU1VDQ0VTUy9WT1NfU1RBVFVTX0ZBSUxVUkUgYmFzZWQgb24gd2hldGhlciBhIHZhbGlkIHJlcG9ydCBpcyAKKyAgICAgICAgICAgIHJlY2VpdmVkIG9yIG5laWdoYm9yIHRpbWVyIGV4cGlyZWQKKyAgXHJldHVybiAtIHZvaWQKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgcnJtSW5kaWNhdGVOZWlnaGJvclJlcG9ydFJlc3VsdCh0cEFuaVNpckdsb2JhbCBwTWFjLCBWT1NfU1RBVFVTIHZvc1N0YXR1cykKK3sKKyAgICBOZWlnaGJvclJlcG9ydFJzcENhbGxiYWNrIGNhbGxiYWNrOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmNhbGxiYWNrQ29udGV4dDsKKworICAgIC8qIFJlc2V0IHRoZSBuZWlnaGJvciByZXNwb25zZSBwZW5kaW5nIHN0YXR1cyAqLworICAgIHBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVxQ29udHJvbEluZm8uaXNOZWlnaGJvclJzcFBlbmRpbmcgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICAvKiBTdG9wIHRoZSB0aW1lciBpZiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcuIFRoZSB0aW1lciBzaG91bGQgYmUgcnVubmluZyBvbmx5IGluIHRoZSBTVUNDRVNTIGNhc2UuICovCisgICAgaWYgKFZPU19USU1FUl9TVEFURV9SVU5OSU5HID09IHZvc190aW1lcl9nZXRDdXJyZW50U3RhdGUoJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVxQ29udHJvbEluZm8ubmVpZ2hib3JSc3BXYWl0VGltZXIpKQorICAgIHsKKyAgICAgICAgVk9TX0FTU0VSVChWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzKTsKKyAgICAgICAgdm9zX3RpbWVyX3N0b3AoJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVxQ29udHJvbEluZm8ubmVpZ2hib3JSc3BXYWl0VGltZXIpOworICAgIH0KKyAgICBjYWxsYmFjayA9IHBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVxQ29udHJvbEluZm8ubmVpZ2hib3JSc3BDYWxsYmFja0luZm8ubmVpZ2hib3JSc3BDYWxsYmFjazsKKyAgICBjYWxsYmFja0NvbnRleHQgPSBwTWFjLT5ycm0ucnJtU21lQ29udGV4dC5uZWlnaGJvclJlcUNvbnRyb2xJbmZvLm5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvLm5laWdoYm9yUnNwQ2FsbGJhY2tDb250ZXh0OworICAgIAorICAgIC8qIFJlc2V0IHRoZSBjYWxsYmFjayBhbmQgdGhlIGNhbGxiYWNrIGNvbnRleHQgYmVmb3JlIGNhbGxpbmcgdGhlIGNhbGxiYWNrLiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHRoZXJlIG1heSBiZSBhIHJlZ2lzdHJhdGlvbiBpbiAKKyAgICAgICAgICAgIGNhbGxiYWNrIGl0c2VsZi4gKi8KKyAgICBwTWFjLT5ycm0ucnJtU21lQ29udGV4dC5uZWlnaGJvclJlcUNvbnRyb2xJbmZvLm5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvLm5laWdoYm9yUnNwQ2FsbGJhY2sgPSBOVUxMOworICAgIHBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVxQ29udHJvbEluZm8ubmVpZ2hib3JSc3BDYWxsYmFja0luZm8ubmVpZ2hib3JSc3BDYWxsYmFja0NvbnRleHQgPSBOVUxMOworICAgIAorICAgIC8qIENhbGwgdGhlIGNhbGxiYWNrIHdpdGggdGhlIHN0YXR1cyByZWNlaXZlZCBmcm9tIGNhbGxlciAqLworICAgIGlmIChjYWxsYmFjaykKKyAgICAgICAgY2FsbGJhY2soY2FsbGJhY2tDb250ZXh0LCB2b3NTdGF0dXMpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAvLyBXZSBjYW1lIGhlcmUgd2l0aCBJQVBQIEFQIExpc3QKKyAgICAvLyBNYWtlIHN1cmUgd2UgaW5mb3JtIENTUiBvZiB0aGUgbmVpZ2hib3IgbGlzdAorICAgIC8vIGZvciBDQ1ggQXNzb2NpYXRpb25zLiBGaXJzdCBjbGVhciB0aGUgY2FjaGUuCisgICAgZWxzZQorICAgIGlmIChjc3JOZWlnaGJvclJvYW1Jc0NDWEFzc29jKHBNYWMpKQorICAgIHsKKyAgICAgICAgUHJvY2Vzc0lBUFBOZWlnaGJvckFQTGlzdChwTWFjKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybjsKKworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBzbWVfUnJtQmVhY29uUmVwb3J0WG1pdEluZCgpIC0gCisKKyAgIENyZWF0ZSBhbmQgc2VuZCB0aGUgYmVhY29uIHJlcG9ydCBYbWl0IGluZCBtZXNzYWdlIHRvIFBFLgorCisgIFxwYXJhbSAgLSBwTWFjIC0gUG9pbnRlciB0byB0aGUgSGFsIEhhbmRsZS4KKyAgICAgICAgICAgICAgLSBwUmVzdWx0IC0gc2NhbiByZXN1bHQuCisgICAgICAgICAgICAgIC0gbWVhc3VyZW1lbnREb25lIC0gZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZWFzdXJlbWVudCBpcyBkb25lLiAgICAgICAgCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGVIYWxTdGF0dXMgc21lX1JybVNlbmRCZWFjb25SZXBvcnRYbWl0SW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyU2NhblJlc3VsdEluZm8gKipwUmVzdWx0QXJyLCB0QU5JX1U4IG1lYXN1cmVtZW50RG9uZSApCit7CisgICB0cFNpckJzc0Rlc2NyaXB0aW9uIHBCc3NEZXNjID0gTlVMTDsKKyAgIHRwU2lyQmVhY29uUmVwb3J0WG1pdEluZCBwQmVhY29uUmVwOworICAgdEFOSV9VMTYgbGVuZ3RoLCBpZV9sZW47CisgICB0QU5JX1U4IGJzc0NvdW50ZXI9MCwgbXNnQ291bnRlcj0wOworICAgdENzclNjYW5SZXN1bHRJbmZvICpwQ3VyUmVzdWx0PU5VTEw7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cFJybVNNRUNvbnRleHQgcFNtZVJybUNvbnRleHQgPSAmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQ7CisKKworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkJlYWNvbiByZXBvcnQgeG1pdCBJbmQgdG8gUEVcbiIpOworI2VuZGlmCisKKyAgIGlmKCBOVUxMID09IHBSZXN1bHRBcnIgJiYgIW1lYXN1cmVtZW50RG9uZSApCisgICB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJCZWFjb24gcmVwb3J0IHhtaXQgSW5kIHRvIFBFIEZhaWxlZFxuIik7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgaWYgKHBSZXN1bHRBcnIpCisgICAgICAgcEN1clJlc3VsdD1wUmVzdWx0QXJyW2Jzc0NvdW50ZXJdOworCisgICBkbyAKKyAgIHsKKyAgICAgICBsZW5ndGggPSBzaXplb2YodFNpckJlYWNvblJlcG9ydFhtaXRJbmQpOworICAgICAgIHBCZWFjb25SZXAgPSB2b3NfbWVtX21hbGxvYyAoIGxlbmd0aCApOworICAgICAgIGlmICggTlVMTCA9PSBwQmVhY29uUmVwICkKKyAgICAgICB7CisgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dQLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYmVhY29uIHJlcG9ydCIpOworICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMRURfQUxMT0M7CisgICAgICAgfQorICAgICAgIHZvc19tZW1femVybyggcEJlYWNvblJlcCwgbGVuZ3RoICk7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIkFsbG9jYXRlZCBtZW1vcnkgZm9yIHBCZWFjb25SZXBcbiIpKTsKKyNlbmRpZgorICAgICAgIHBCZWFjb25SZXAtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfQkVBQ09OX1JFUE9SVF9SRVNQX1hNSVRfSU5EOworICAgICAgIHBCZWFjb25SZXAtPmxlbmd0aCA9IGxlbmd0aDsKKyAgICAgICBwQmVhY29uUmVwLT51RGlhbG9nVG9rZW4gPSBwU21lUnJtQ29udGV4dC0+dG9rZW47CisgICAgICAgcEJlYWNvblJlcC0+ZHVyYXRpb24gPSBwU21lUnJtQ29udGV4dC0+ZHVyYXRpb247CisgICAgICAgcEJlYWNvblJlcC0+cmVnQ2xhc3MgPSBwU21lUnJtQ29udGV4dC0+cmVnQ2xhc3M7CisgICAgICAgdm9zX21lbV9jb3B5KCBwQmVhY29uUmVwLT5ic3NJZCwgcFNtZVJybUNvbnRleHQtPnNlc3Npb25Cc3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworCisgICAgICAgbXNnQ291bnRlcj0wOworICAgICAgIHdoaWxlIChwQ3VyUmVzdWx0KSAKKyAgICAgICB7CisgICAgICAgICAgIHBCc3NEZXNjID0gJnBDdXJSZXN1bHQtPkJzc0Rlc2NyaXB0b3I7CisgICAgICAgICAgIGllX2xlbiA9IEdFVF9JRV9MRU5fSU5fQlNTKCBwQnNzRGVzYy0+bGVuZ3RoICk7CisgICAgICAgICAgIHBCZWFjb25SZXAtPnBCc3NEZXNjcmlwdGlvblttc2dDb3VudGVyXSA9IHZvc19tZW1fbWFsbG9jICggaWVfbGVuK3NpemVvZih0U2lyQnNzRGVzY3JpcHRpb24pICk7CisgICAgICAgICAgIHZvc19tZW1fY29weSggcEJlYWNvblJlcC0+cEJzc0Rlc2NyaXB0aW9uW21zZ0NvdW50ZXJdLCBwQnNzRGVzYywgc2l6ZW9mKHRTaXJCc3NEZXNjcmlwdGlvbikgKTsKKyAgICAgICAgICAgdm9zX21lbV9jb3B5KCAmcEJlYWNvblJlcC0+cEJzc0Rlc2NyaXB0aW9uW21zZ0NvdW50ZXJdLT5pZUZpZWxkc1swXSwgcEJzc0Rlc2MtPmllRmllbGRzLCBpZV9sZW4gICk7CisKKyAgICAgICAgICAgcEJlYWNvblJlcC0+bnVtQnNzRGVzYysrOworCisgICAgICAgICAgIGlmICgrK21zZ0NvdW50ZXIgPj0gU0lSX0JDTl9SRVBPUlRfTUFYX0JTU19ERVNDKQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgaWYgKGNzclJvYW1JczExckFzc29jKHBNYWMpKSB7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIHBDdXJSZXN1bHQgPSBwUmVzdWx0QXJyW21zZ0NvdW50ZXJdOworICAgICAgIH0KKworICAgICAgIGJzc0NvdW50ZXIrPW1zZ0NvdW50ZXI7IAorICAgICAgIGlmICghcFJlc3VsdEFyciB8fCAhcEN1clJlc3VsdCB8fCAoYnNzQ291bnRlcj49U0lSX0JDTl9SRVBPUlRfTUFYX0JTU19ERVNDKSkKKyAgICAgICAgICAgIHBDdXJSZXN1bHQgPSBOVUxMOworICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBDdXJSZXN1bHQgPSBwUmVzdWx0QXJyW2Jzc0NvdW50ZXJdOworCisgICAgICAgcEJlYWNvblJlcC0+Zk1lYXN1cmVEb25lID0gKHBDdXJSZXN1bHQpP2ZhbHNlOm1lYXN1cmVtZW50RG9uZTsKKworICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcEJlYWNvblJlcCk7CisKKyAgICAgICBzbXNMb2coIHBNYWMsIExPR1csICJTTUUgU2VudCBCY25SZXBYbWl0IHRvIFBFIG51bUJzcyAlZFxuIiwgcEJlYWNvblJlcC0+bnVtQnNzRGVzYyk7CisKKyAgIH0gd2hpbGUgKHBDdXJSZXN1bHQpOworCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiBzbWVfUnJtU2VuZFNjYW5SZXF1ZXN0KCkgLSAKKworICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSBzY2FuIHJlc3VsdCBmcm9tIENTUiBhbmQgc2VuZCB0aGUgYmVhY29uIHJlcG9ydAorICAgeG1pdCBpbmQgbWVzc2FnZSB0byBQRS4KKworICBccGFyYW0gIC0gcE1hYyAtIFBvaW50ZXIgdG8gdGhlIEhhbCBIYW5kbGUuCisgICAgICAgICAgICAgIC0gbnVtX2NoYW4gLSBudW1iZXIgb2YgY2hhbm5lbHMuCisgICAgICAgICAgICAgIC0gY2hhbm5lbCBsaXN0IC0gbGlzdCBvZiBjaGFubmVscyB0byBmZXRjaCB0aGUgcmVzdWx0IGZyb20uCisgICAgICAgICAgICAgIC0gbWVhc3VyZW1lbnREb25lIC0gZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZWFzdXJlbWVudCBpcyBkb25lLiAgICAgICAgCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGVIYWxTdGF0dXMgc21lX1JybVNlbmRTY2FuUmVzdWx0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IG51bV9jaGFuLCB0QU5JX1U4KiBjaGFuTGlzdCwgdEFOSV9VOCBtZWFzdXJlbWVudERvbmUgKQoreworICAgdENzclNjYW5SZXN1bHRGaWx0ZXIgZmlsdGVyOworICAgdFNjYW5SZXN1bHRIYW5kbGUgcFJlc3VsdDsKKyAgIHRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHQsICpwTmV4dFJlc3VsdDsKKyAgIHRDc3JTY2FuUmVzdWx0SW5mbyAqcFNjYW5SZXN1bHRzQXJyW1NJUl9CQ05fUkVQT1JUX01BWF9CU1NfREVTQ107CisgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgIHRBTklfVTggY291bnRlcj0wOworICAgdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworICAgdEFOSV9VMzIgc2Vzc2lvbklkOworCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiU2VuZCBzY2FuIHJlc3VsdCB0byBQRSBcbiIpOworI2VuZGlmCisKKyAgIHZvc19tZW1femVybyggJmZpbHRlciwgc2l6ZW9mKGZpbHRlcikgKTsKKyAgIHZvc19tZW1femVybyggcFNjYW5SZXN1bHRzQXJyLCBzaXplb2YocE5leHRSZXN1bHQpKlNJUl9CQ05fUkVQT1JUX01BWF9CU1NfREVTQyApOworCisgICBmaWx0ZXIuQlNTSURzLm51bU9mQlNTSURzID0gMTsKKyAgIGZpbHRlci5CU1NJRHMuYnNzaWQgPSAmcFNtZVJybUNvbnRleHQtPmJzc0lkOworCisgICBpZiggcFNtZVJybUNvbnRleHQtPnNzSWQubGVuZ3RoICkKKyAgIHsKKyAgICAgIGZpbHRlci5TU0lEcy5TU0lETGlzdCA9KCB0Q3NyU1NJREluZm8gKil2b3NfbWVtX21hbGxvYyhzaXplb2YodENzclNTSURJbmZvKSk7CisgICAgICBpZiggZmlsdGVyLlNTSURzLlNTSURMaXN0ID09IE5VTEwgKQorICAgICAgeworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dQLCBGTCgidm9zX21lbV9tYWxsb2MgZmFpbGVkOiIpICk7CisgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgIH0KKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCJBbGxvY2F0ZWQgbWVtb3J5IGZvciBTU0lETGlzdFxuIikpOworI2VuZGlmCisgICAgICB2b3NfbWVtX3plcm8oIGZpbHRlci5TU0lEcy5TU0lETGlzdCwgc2l6ZW9mKHRDc3JTU0lESW5mbykgKTsKKworICAgICAgZmlsdGVyLlNTSURzLlNTSURMaXN0LT5TU0lELmxlbmd0aCA9IHBTbWVScm1Db250ZXh0LT5zc0lkLmxlbmd0aDsKKyAgICAgIHZvc19tZW1fY29weShmaWx0ZXIuU1NJRHMuU1NJRExpc3QtPlNTSUQuc3NJZCwgcFNtZVJybUNvbnRleHQtPnNzSWQuc3NJZCwgcFNtZVJybUNvbnRleHQtPnNzSWQubGVuZ3RoKTsKKyAgICAgIGZpbHRlci5TU0lEcy5udW1PZlNTSURzID0gMTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGZpbHRlci5TU0lEcy5udW1PZlNTSURzID0gMDsKKyAgIH0KKworICAgZmlsdGVyLkNoYW5uZWxJbmZvLm51bU9mQ2hhbm5lbHMgPSBudW1fY2hhbjsKKyAgIGZpbHRlci5DaGFubmVsSW5mby5DaGFubmVsTGlzdCA9IGNoYW5MaXN0OyAKKworICAgZmlsdGVyLmZNZWFzdXJlbWVudCA9IFRSVUU7IAorCisgICBjc3JSb2FtR2V0U2Vzc2lvbklkRnJvbUJTU0lEKCBwTWFjLCAodENzckJzc2lkKilwU21lUnJtQ29udGV4dC0+c2Vzc2lvbkJzc0lkLCAmc2Vzc2lvbklkICk7CisgICBzdGF0dXMgPSBzbWVfU2NhbkdldFJlc3VsdChwTWFjLCAodEFOSV9VOClzZXNzaW9uSWQsICZmaWx0ZXIsICZwUmVzdWx0KTsKKworICAgaWYoIGZpbHRlci5TU0lEcy5TU0lETGlzdCApCisgICB7CisgICAgICAvL0ZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIFNTSURMaXN0LgorICAgICAgdm9zX21lbV9mcmVlKCBmaWx0ZXIuU1NJRHMuU1NJRExpc3QgKTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCJGcmVlIG1lbW9yeSBmb3IgU1NJRExpc3RcbiIpICk7CisjZW5kaWYKKyAgIH0KKworICAgaWYgKE5VTEwgPT0gcFJlc3VsdCkKKyAgIHsKKyAgICAgIC8vIG5vIHNjYW4gcmVzdWx0cworICAgICAgLy8KKyAgICAgIC8vIFNwZWMuIGRvZXNudCBzYXkgYW55dGhpbmcgYWJvdXQgc3VjaCBjb25kaXRpb24uIAorICAgICAgLy8gU2luY2Ugc2VjdGlvbiA3LjQuNi4yIChJRUVFODAyLjExay0yMDA4KSBzYXlzLXJybSByZXBvcnQgZnJhbWUgc2hvdWxkIGNvbnRhaW4KKyAgICAgIC8vIG9uZSBvciBtb3JlIHJlcG9ydCBJRXMuIEl0IHByb2JhYmx5IG1lYW5zIGRvbnQgc2VuZCBhbnkgcmVzcG9zZSBpZiBubyBtYXRjaGluZworICAgICAgLy8gQlNTIGZvdW5kLiBNb3Jlb3ZlciwgdGhlcmUgaXMgbm8gZmxhZyBvciBmaWVsZCBpbiBtZWFzdXJlbWVudCByZXBvcnQgSUUoNy4zLjIuMjIpCisgICAgICAvLyBPUiBiZWFjb24gcmVwb3J0IElFKDcuMy4yLjIyLjYpIHRoYXQgY2FuIGJlIHNldCB0byBpbmRpY2F0ZSBubyBCU1MgZm91bmQgb24gYSBnaXZlbiBjaGFubmVsLgorICAgICAgLy8KKyAgICAgIC8vIElmIHdlIGZpbmlzaGVkIG1lYXN1cmVtZW50IG9uIGFsbCB0aGUgY2hhbm5lbHMsIHdlIHN0aWxsIG5lZWQgdG8KKyAgICAgIC8vIHNlbmQgYSB4bWl0IGluZGljYXRpb24gd2l0aCBtb3JlVG9Gb2xsb3cgc2V0IHRvIE1FQVNVUk1FTlRfRE9ORQorICAgICAgLy8gc28gdGhhdCBQRSBjYW4gY2xlYW4gYW55IGNvbnRleHQgYWxsb2NhdGVkLgorICAgICAgaWYoIG1lYXN1cmVtZW50RG9uZSApCisgICAgICAgICBzdGF0dXMgPSBzbWVfUnJtU2VuZEJlYWNvblJlcG9ydFhtaXRJbmQoIHBNYWMsIE5VTEwsIG1lYXN1cmVtZW50RG9uZSApOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgcFNjYW5SZXN1bHQgPSBzbWVfU2NhblJlc3VsdEdldEZpcnN0KHBNYWMsIHBSZXN1bHQpOworCisgICBpZiggTlVMTCA9PSBwU2NhblJlc3VsdCAmJiBtZWFzdXJlbWVudERvbmUgKQorICAgICAgc3RhdHVzID0gc21lX1JybVNlbmRCZWFjb25SZXBvcnRYbWl0SW5kKCBwTWFjLCBOVUxMLCBtZWFzdXJlbWVudERvbmUgKTsKKworICAgY291bnRlcj0wOworICAgd2hpbGUgKHBTY2FuUmVzdWx0KQorICAgeworICAgICAgcE5leHRSZXN1bHQgPSBzbWVfU2NhblJlc3VsdEdldE5leHQocE1hYywgcFJlc3VsdCk7CisgICAgICBwU2NhblJlc3VsdHNBcnJbY291bnRlcisrXSA9IHBTY2FuUmVzdWx0OworICAgICAgcFNjYW5SZXN1bHQgPSBwTmV4dFJlc3VsdDsgLy9zbWVfU2NhblJlc3VsdEdldE5leHQoaEhhbCwgcFJlc3VsdCk7CisgICAgICBpZiAoY291bnRlciA+PSBTSVJfQkNOX1JFUE9SVF9NQVhfQlNTX0RFU0MpCisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgaWYgKGNvdW50ZXIpCisgICAgICAgc3RhdHVzID0gc21lX1JybVNlbmRCZWFjb25SZXBvcnRYbWl0SW5kKCBwTWFjLCBwU2NhblJlc3VsdHNBcnIsIG1lYXN1cmVtZW50RG9uZSk7CisKKyAgIHNtZV9TY2FuUmVzdWx0UHVyZ2UocE1hYywgcFJlc3VsdCk7IAorCisgICByZXR1cm4gc3RhdHVzOworfQorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgc21lX1JybVNjYW5SZXF1ZXN0Q2FsbGJhY2soKSAtIAorCisgICBUaGUgc21lIG1vZHVsZSBjYWxscyB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uIG9uY2UgaXQgZmluaXNoIHRoZSBzY2FuIHJlcXVlc3QKKyAgIGFuZCB0aGlzIGZ1bmN0aW9uIHNlbmQgdGhlIGJlYWNvbiByZXBvcnQgeG1pdCB0byBQRSBhbmQgc3RhcnRzIGEgdGltZXIgb2YKKyAgIHJhbmRvbSBpbnRlcnZhbCB0byBpc3N1ZSBuZXh0IHJlcXVlc3QuCisKKyAgXHBhcmFtICAtIGhhbEhhbmRsZSAtIFBvaW50ZXIgdG8gdGhlIEhhbCBIYW5kbGUuCisgICAgICAgICAgICAgIC0gcENvbnRleHQgLSBQb2ludGVyIHRvIHRoZSBkYXRhIGNvbnRleHQuCisgICAgICAgICAgICAgIC0gc2NhbklkIC0gU2NhbiBJRC4KKyAgICAgICAgICAgICAgLSBzdGF0dXMgLSBDU1IgU3RhdHVzLiAgICAgICAgCisgIFxyZXR1cm4gLSAwIGZvciBzdWNjZXNzLCBub24gemVybyBmb3IgZmFpbHVyZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZUhhbFN0YXR1cyBzbWVfUnJtU2NhblJlcXVlc3RDYWxsYmFjayh0SGFsSGFuZGxlIGhhbEhhbmRsZSwgdm9pZCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgc2NhbklkLCBlQ3NyU2NhblN0YXR1cyBzdGF0dXMpCit7CisKKyAgIHRBTklfVTE2IGludGVydmFsOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgaGFsSGFuZGxlOworICAgdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworICAgdEFOSV9VMzIgdGltZV90aWNrOyAKKworCisKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICBzbXNMb2coIHBNYWMsIExPR0UsICJTY2FuIFJlcXVlc3QgY2FsbGJhY2sgXG4iKTsKKyNlbmRpZgorICAgLy9pZiBhbnkgbW9yZSBjaGFubmVscyBhcmUgcGVuZGluZywgc3RhcnQgYSB0aW1lciBvZiBhIHJhbmRvbSB2YWx1ZSB3aXRoaW4gcmFuZG9taXphdGlvbiBpbnRlcnZhbC4KKyAgIC8vCisgICAvLworICAgaWYoIChwU21lUnJtQ29udGV4dC0+Y3VycmVudEluZGV4ICsgMSkgPCBwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QubnVtT2ZDaGFubmVscyApCisgICB7CisgICAgICBzbWVfUnJtU2VuZFNjYW5SZXN1bHQoIHBNYWMsIDEsICZwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QuQ2hhbm5lbExpc3RbcFNtZVJybUNvbnRleHQtPmN1cnJlbnRJbmRleF0sIGZhbHNlICk7CisKKyAgICAgIHBTbWVScm1Db250ZXh0LT5jdXJyZW50SW5kZXgrKzsgLy9BZHZhbmNlIHRoZSBjdXJyZW50IGluZGV4LgorICAgICAgLy9zdGFydCB0aGUgdGltZXIgdG8gaXNzdWUgbmV4dCByZXF1ZXN0LiAKKyAgICAgIC8vRnJvbSB0aW1lciB0aWNrIGdldCBhIHJhbmRvbSBudW1iZXIgd2l0aGluIDEwbXMgYW5kIG1heCByYW5kbWl6YXRpb24gaW50ZXJ2YWwuCisgICAgICB0aW1lX3RpY2sgPSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpOworICAgICAgaW50ZXJ2YWwgPSB0aW1lX3RpY2sgJSAocFNtZVJybUNvbnRleHQtPnJhbmRuSW50dmwgLSAxMCArIDEpICsgMTA7CisKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJTZXQgdGltZXIgZm9yIGludGVydmFsICVkIFxuIiwgaW50ZXJ2YWwpOworI2VuZGlmCisgICAgICB2b3NfdGltZXJfc3RhcnQoICZwU21lUnJtQ29udGV4dC0+SXRlck1lYXNUaW1lciwgaW50ZXJ2YWwgKTsKKworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy9Eb25lIHdpdGggdGhlIG1lYXN1cmVtZW50LiBDbGVhbiB1cCBhbGwgY29udGV4dCBhbmQgc2VuZCBhIG1lc3NhZ2UgdG8gUEUgd2l0aCBtZWFzdXJlbWVudCBkb25lIGZsYWcgc2V0LgorICAgICAgc21lX1JybVNlbmRTY2FuUmVzdWx0KCBwTWFjLCAxLCAmcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0W3BTbWVScm1Db250ZXh0LT5jdXJyZW50SW5kZXhdLCB0cnVlICk7CisgICAgICB2b3NfbWVtX2ZyZWUoIHBTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC5DaGFubmVsTGlzdCApOworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIkZyZWUgbWVtb3J5IGZvciBDaGFubmVsTGlzdFxuIikgKTsKKyNlbmRpZgorICAgfQorCisgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgc21lX1JybUlzc3VlU2NhblJlcSgpIC0gVGhpcyBpcyBjYWxsZWQgdG8gc2VuZCBhIHNjYW4gcmVxdWVzdCBhcyBwYXJ0IAorICAgICAgICAgb2YgYmVhY29uIHJlcG9ydCByZXF1ZXN0IC4KKyAgCisgIFxwYXJhbSAKKyAgCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFZhbGlkYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUnJtSXNzdWVTY2FuUmVxKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgIC8vSXNzdWUgc2NhbiByZXF1ZXN0LgorICAgdENzclNjYW5SZXF1ZXN0IHNjYW5SZXF1ZXN0OworICAgdl9VMzJfdCBzY2FuSWQgPSAwOworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworICAgdEFOSV9VMzIgc2Vzc2lvbklkOworCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiSXNzdWUgc2NhbiByZXF1ZXN0IFxuIiApOworI2VuZGlmCisKKyAgIHZvc19tZW1femVybyggJnNjYW5SZXF1ZXN0LCBzaXplb2Yoc2NhblJlcXVlc3QpKTsKKworICAgLyogc2V0IHNjYW5UeXBlLCBhY3RpdmUgb3IgcGFzc2l2ZSAqLworCisgICBzY2FuUmVxdWVzdC5zY2FuVHlwZSA9IHBTbWVScm1Db250ZXh0LT5tZWFzTW9kZTsKKworICAgdm9zX21lbV9jb3B5KHNjYW5SZXF1ZXN0LmJzc2lkLAorICAgICAgICAgcFNtZVJybUNvbnRleHQtPmJzc0lkLCBzaXplb2Yoc2NhblJlcXVlc3QuYnNzaWQpICk7CisKKyAgIGlmKCBwU21lUnJtQ29udGV4dC0+c3NJZC5sZW5ndGggKQorICAgeworICAgICAgc2NhblJlcXVlc3QuU1NJRHMubnVtT2ZTU0lEcyA9IDE7CisgICAgICBzY2FuUmVxdWVzdC5TU0lEcy5TU0lETGlzdCA9KCB0Q3NyU1NJREluZm8gKil2b3NfbWVtX21hbGxvYyhzaXplb2YodENzclNTSURJbmZvKSk7CisgICAgICBpZiggc2NhblJlcXVlc3QuU1NJRHMuU1NJRExpc3QgPT0gTlVMTCApCisgICAgICB7CisgICAgICAgICBzbXNMb2coIHBNYWMsIExPR1AsIEZMKCJ2b3NfbWVtX21hbGxvYyBmYWlsZWQ6IikgKTsKKyAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgfQorI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIkFsbG9jYXRlZCBtZW1vcnkgZm9yIHBTU0lETGlzdFxuIikpOworI2VuZGlmCisgICAgICB2b3NfbWVtX3plcm8oIHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0LCBzaXplb2YodENzclNTSURJbmZvKSApOworICAgICAgc2NhblJlcXVlc3QuU1NJRHMuU1NJRExpc3QtPlNTSUQubGVuZ3RoID0gcFNtZVJybUNvbnRleHQtPnNzSWQubGVuZ3RoOworICAgICAgdm9zX21lbV9jb3B5KHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0LT5TU0lELnNzSWQsIHBTbWVScm1Db250ZXh0LT5zc0lkLnNzSWQsIHBTbWVScm1Db250ZXh0LT5zc0lkLmxlbmd0aCk7CisgICB9CisKKyAgIC8qIHNldCBtaW4gYW5kIG1heCBjaGFubmVsIHRpbWUgKi8KKyAgIHNjYW5SZXF1ZXN0Lm1pbkNoblRpbWUgPSAwOyAvL3BTbWVScm1Db250ZXh0LT5kdXJhdGlvbjsgRG9udCB1c2UgbWluIHRpbWVvdXQuCisgICBzY2FuUmVxdWVzdC5tYXhDaG5UaW1lID0gcFNtZVJybUNvbnRleHQtPmR1cmF0aW9uOworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkZvciBEdXJhdGlvbiAlZCBcbiIsIHBTbWVScm1Db250ZXh0LT5kdXJhdGlvbiApOworI2VuZGlmCisKKyAgIC8qIHNldCBCU1NUeXBlIHRvIGRlZmF1bHQgdHlwZSAqLworICAgc2NhblJlcXVlc3QuQlNTVHlwZSA9IGVDU1JfQlNTX1RZUEVfQU5ZOworCisgICAvKlNjYW4gYWxsIHRoZSBjaGFubmVscyAqLworICAgc2NhblJlcXVlc3QuQ2hhbm5lbEluZm8ubnVtT2ZDaGFubmVscyA9IDE7CisKKyAgIHNjYW5SZXF1ZXN0LkNoYW5uZWxJbmZvLkNoYW5uZWxMaXN0ID0gJnBTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC5DaGFubmVsTGlzdFtwU21lUnJtQ29udGV4dC0+Y3VycmVudEluZGV4XTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICBzbXNMb2coIHBNYWMsIExPR0UsICJPbiBjaGFubmVsICVkIFxuIiwgcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0W3BTbWVScm1Db250ZXh0LT5jdXJyZW50SW5kZXhdICk7CisjZW5kaWYKKworICAgLyogc2V0IHJlcXVlc3RUeXBlIHRvIGZ1bGwgc2NhbiAqLworICAgc2NhblJlcXVlc3QucmVxdWVzdFR5cGUgPSBlQ1NSX1NDQU5fUkVRVUVTVF9GVUxMX1NDQU47CisKKyAgIGNzclJvYW1HZXRTZXNzaW9uSWRGcm9tQlNTSUQoIHBNYWMsICh0Q3NyQnNzaWQqKXBTbWVScm1Db250ZXh0LT5zZXNzaW9uQnNzSWQsICZzZXNzaW9uSWQgKTsKKyAgIHN0YXR1cyA9IHNtZV9TY2FuUmVxdWVzdCggcE1hYywgKHRBTklfVTgpc2Vzc2lvbklkLCAmc2NhblJlcXVlc3QsICZzY2FuSWQsICZzbWVfUnJtU2NhblJlcXVlc3RDYWxsYmFjaywgTlVMTCApOyAKKworICAgaWYgKCBwU21lUnJtQ29udGV4dC0+c3NJZC5sZW5ndGggKQorICAgeworICAgICAgdm9zX21lbV9mcmVlKHNjYW5SZXF1ZXN0LlNTSURzLlNTSURMaXN0KTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCJGcmVlIG1lbW9yeSBmb3IgU1NJRExpc3RcbiIpKTsKKyNlbmRpZgorICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUnJtUHJvY2Vzc0JlYWNvblJlcG9ydFJlcUluZCgpIC0gVGhpcyBpcyBjYWxsZWQgdG8gcHJvY2VzcyB0aGUgQmVhY29uIAorICAgICAgICAgcmVwb3J0IHJlcXVlc3QgZnJvbSBwZWVyIEFQIGZvcndhcmRlZCB0aHJvdWdoIFBFIC4KKyAgCisgIFxwYXJhbSBwTXNnQnVmIC0gYSBwb2ludGVyIHRvIGEgYnVmZmVyIHRoYXQgbWFwcyB0byB2YXJpb3VzIHN0cnVjdHVyZXMgYmFzZSAKKyAgICAgICAgICAgICAgICAgICBvbiB0aGUgbWVzc2FnZSB0eXBlLgorICAgICAgICAgICAgICAgICAgIFRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBjYW4gYWx3YXlzIG1hcCB0byB0U2lyU21lUnNwLgorICAKKyAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIC0gVmFsaWRhdGlvbiBpcyBzdWNjZXNzZnVsLgorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNtZV9Scm1Qcm9jZXNzQmVhY29uUmVwb3J0UmVxSW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpCit7CisgICB0cFNpckJlYWNvblJlcG9ydFJlcUluZCBwQmVhY29uUmVxID0gKHRwU2lyQmVhY29uUmVwb3J0UmVxSW5kKSBwTXNnQnVmOworICAgdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworICAgdEFOSV9VMzIgbGVuLGk7ICAKKworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgIHNtc0xvZyggcE1hYywgTE9HRSwgIlJlY2VpdmVkIEJlYWNvbiByZXBvcnQgcmVxdWVzdCBpbmQgQ2hhbm5lbCA9ICVkXG4iLCBwQmVhY29uUmVxLT5jaGFubmVsSW5mby5jaGFubmVsTnVtICk7CisjZW5kaWYKKyAgIC8vc2VjdGlvbiAxMS4xMC44LjEgKElFRUUgU3RkIDgwMi4xMWstMjAwOCkgCisgICAvL2NoYW5uZWwgMCBhbmQgMjU1IGhhcyBzcGVjaWFsIG1lYW5pbmcuCisgICBpZiggKHBCZWFjb25SZXEtPmNoYW5uZWxJbmZvLmNoYW5uZWxOdW0gPT0gMCkgIHx8IAorICAgICAgICgocEJlYWNvblJlcS0+Y2hhbm5lbEluZm8uY2hhbm5lbE51bSA9PSAyNTUpICYmIChwQmVhY29uUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVscyA9PSAwKSApICkgCisgICB7CisgICAgICAvL0FkZCBhbGwgdGhlIGNoYW5uZWwgaW4gdGhlIHJlZ3VsYXRvcnkgZG9tYWluLgorICAgICAgd2xhbl9jZmdHZXRTdHJMZW4oIHBNYWMsIFdOSV9DRkdfVkFMSURfQ0hBTk5FTF9MSVNULCAmbGVuICk7CisgICAgICBwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QuQ2hhbm5lbExpc3QgPSB2b3NfbWVtX21hbGxvYyggbGVuICk7CisgICAgICBpZiggcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0ID09IE5VTEwgKQorICAgICAgeworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dQLCBGTCgidm9zX21lbV9tYWxsb2MgZmFpbGVkOiIpICk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiQWxsb2NhdGVkIG1lbW9yeSBmb3IgQ2hhbm5lbExpc3RcbiIpICk7CisjZW5kaWYKKyAgICAgIGNzckdldENmZ1ZhbGlkQ2hhbm5lbHMoIHBNYWMsIHBTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC5DaGFubmVsTGlzdCwgJmxlbiApOworICAgICAgcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0Lm51bU9mQ2hhbm5lbHMgPSAodEFOSV9VOClsZW47CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiY2hhbm5lbCA9PSAwIHBlcmZvbWluZyBvbiBhbGwgY2hhbm5lbHMgXG4iKTsKKyNlbmRpZgorICAgfQorICAgZWxzZQorICAgeyAKKyAgICAgIGxlbiA9IDA7CisgICAgICBwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QubnVtT2ZDaGFubmVscyA9IDA7CisKKyAgICAgIC8vSWYgdmFsaWQgY2hhbm5lbCBpcyBwcmVzZW50LiBXZSBmaXJ0IE1lYXN1cmUgb24gdGhlIGdpdmVuIGNoYW5uZWwuIGFuZAorICAgICAgLy9pZiB0aGVyZSBhcmUgYWRkaXRpb25hbCBjaGFubmVscyBwcmVzZW50IGluIEFQY2hhbm5lbHJlcG9ydCwgbWVhc3VyZSBvbiB0aGVzZSBhbHNvLgorICAgICAgaWYgKCBwQmVhY29uUmVxLT5jaGFubmVsSW5mby5jaGFubmVsTnVtICE9IDI1NSApCisgICAgICAgICBsZW4gPSAxOworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgIGVsc2UKKyAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgImNoYW5uZWwgPT0gMjU1ICBcbiIpOworI2VuZGlmCisKKyAgICAgIGxlbiArPSBwQmVhY29uUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVsczsKKworICAgICAgcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0ID0gdm9zX21lbV9tYWxsb2MoIGxlbiApOworICAgICAgaWYoIHBTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC5DaGFubmVsTGlzdCA9PSBOVUxMICkKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HUCwgRkwoInZvc19tZW1fbWFsbG9jIGZhaWxlZCIpICk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiQWxsb2NhdGVkIG1lbW9yeSBmb3IgQ2hhbm5lbExpc3RcbiIpICk7CisjZW5kaWYKKworICAgICAgaWYgKCBwQmVhY29uUmVxLT5jaGFubmVsSW5mby5jaGFubmVsTnVtICE9IDI1NSApCisgICAgICB7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiY2hhbm5lbCA9PSAlZCAgXG4iLCBwQmVhY29uUmVxLT5jaGFubmVsSW5mby5jaGFubmVsTnVtICk7CisjZW5kaWYKKyAgICAgICAgIGlmKGNzclJvYW1Jc0NoYW5uZWxWYWxpZCggcE1hYywgcEJlYWNvblJlcS0+Y2hhbm5lbEluZm8uY2hhbm5lbE51bSApKQorICAgICAgICAgICAgcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0W3BTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC5udW1PZkNoYW5uZWxzKytdID0gcEJlYWNvblJlcS0+Y2hhbm5lbEluZm8uY2hhbm5lbE51bTsKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICAgICBlbHNlCisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJpcyBJbnZhbGlkIGNoYW5uZWwsIElnbm9yaW5nIHRoaXMgY2hhbm5lbFxuIiApOyAKKyNlbmRpZgorICAgICAgfQorCisgICAgICBmb3IgKCBpID0gMCA7IGkgPCBwQmVhY29uUmVxLT5jaGFubmVsTGlzdC5udW1DaGFubmVsczsgaSsrICkKKyAgICAgIHsKKyAgICAgICAgIGlmKGNzclJvYW1Jc0NoYW5uZWxWYWxpZCggcE1hYywgcEJlYWNvblJlcS0+Y2hhbm5lbExpc3QuY2hhbm5lbE51bWJlcltpXSApKQorICAgICAgICAgeworICAgICAgICAgICAgcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0W3BTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC5udW1PZkNoYW5uZWxzXSA9IHBCZWFjb25SZXEtPmNoYW5uZWxMaXN0LmNoYW5uZWxOdW1iZXJbaV07CisgICAgICAgICAgICBwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QubnVtT2ZDaGFubmVscysrOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvL0NvcHkgc2Vzc2lvbiBic3NpZAorICAgdm9zX21lbV9jb3B5KCBwU21lUnJtQ29udGV4dC0+c2Vzc2lvbkJzc0lkLCBwQmVhY29uUmVxLT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworCisgICAvL2NvcHkgbWVhc3VyZW1lbnQgYnNzaWQKKyAgIHZvc19tZW1fY29weSggcFNtZVJybUNvbnRleHQtPmJzc0lkLCBwQmVhY29uUmVxLT5tYWNhZGRyQnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKworICAgLy9Db3B5IHNzaWQKKyAgIHZvc19tZW1fY29weSggJnBTbWVScm1Db250ZXh0LT5zc0lkLCAmcEJlYWNvblJlcS0+c3NJZCwgc2l6ZW9mKHRBbmlTU0lEKSApOyAKKworICAgcFNtZVJybUNvbnRleHQtPnRva2VuID0gcEJlYWNvblJlcS0+dURpYWxvZ1Rva2VuOworICAgcFNtZVJybUNvbnRleHQtPnJlZ0NsYXNzID0gcEJlYWNvblJlcS0+Y2hhbm5lbEluZm8ucmVndWxhdG9yeUNsYXNzOworCisgICBzd2l0Y2goIHBCZWFjb25SZXEtPmZNZWFzdXJlbWVudHR5cGUgKQorICAgeworICAgICAgY2FzZSAwOiAvL1Bhc3NpdmUKKyAgICAgIGNhc2UgMTogLy9BY3RpdmUKKyAgICAgICAgIHBTbWVScm1Db250ZXh0LT5tZWFzTW9kZSA9IHBCZWFjb25SZXEtPmZNZWFzdXJlbWVudHR5cGU/IGVTSVJfQUNUSVZFX1NDQU4gOiBlU0lSX1BBU1NJVkVfU0NBTiA7CisgICAgICAgICBwU21lUnJtQ29udGV4dC0+ZHVyYXRpb24gPSBwQmVhY29uUmVxLT5tZWFzdXJlbWVudER1cmF0aW9uOworICAgICAgICAgcFNtZVJybUNvbnRleHQtPnJhbmRuSW50dmwgPSBWT1NfTUFYKCBwQmVhY29uUmVxLT5yYW5kb21pemF0aW9uSW50ZXJ2YWwsIHBTbWVScm1Db250ZXh0LT5ycm1Db25maWcubWF4UmFuZG5JbnRlcnZhbCApOworICAgICAgICAgcFNtZVJybUNvbnRleHQtPmN1cnJlbnRJbmRleCA9IDA7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiU2VuZCBiZWFjb24gcmVwb3J0IGFmdGVyIHNjYW4gXG4iICk7CisjZW5kaWYKKyAgICAgICAgIHNtZV9Scm1Jc3N1ZVNjYW5SZXEoIHBNYWMgKTsgCisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjogLy9UYWJsZQorICAgICAgICAgLy9HZXQgdGhlIGN1cnJlbnQgc2NhbiByZXN1bHRzIGZvciB0aGUgZ2l2ZW4gY2hhbm5lbCBhbmQgc2VuZCBpdC4KKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJTZW5kIGJlYWNvbiByZXBvcnQgZnJvbSB0YWJsZSBcbiIgKTsKKyNlbmRpZgorICAgICAgICAgc21lX1JybVNlbmRTY2FuUmVzdWx0KCBwTWFjLCBwU21lUnJtQ29udGV4dC0+Y2hhbm5lbExpc3QubnVtT2ZDaGFubmVscywgcFNtZVJybUNvbnRleHQtPmNoYW5uZWxMaXN0LkNoYW5uZWxMaXN0LCB0cnVlICk7CisgICAgICAgICB2b3NfbWVtX2ZyZWUoIHBTbWVScm1Db250ZXh0LT5jaGFubmVsTGlzdC5DaGFubmVsTGlzdCApOworI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIkZyZWUgbWVtb3J5IGZvciBDaGFubmVsTGlzdFxuIikgKTsKKyNlbmRpZgorICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorI2lmIGRlZmluZWQgV0xBTl9WT1dJRklfREVCVUcKKyAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIlVua25vd24gYmVhY29uIHJlcG9ydCByZXF1ZXN0IG1vZGVcbiIpOworI2VuZGlmCisgICAgICAgICAvKiBJbmRpY2F0ZSBtZWFzdXJlbWVudCBjb21wbGV0aW9uIHRvIFBFICovCisgICAgICAgICAvKiBJZiB0aGlzIGlzIG5vdCBkb25lLCBwQ3VycmVudFJlcSBwb2ludGVyIHdpbGwgbm90IGJlIGZyZWVkIGFuZCAKKyAgICAgICAgICAgIFBFIHdpbGwgbm90IGhhbmRsZSBzdWJzZXF1ZW50IEJlYWNvbiByZXF1ZXN0cyAqLworICAgICAgICAgc21lX1JybVNlbmRCZWFjb25SZXBvcnRYbWl0SW5kKHBNYWMsIE5VTEwsIHRydWUpOworICAgICAgICAgYnJlYWs7CisKKyAgIH0KKworICAgcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUnJtTmVpZ2hib3JSZXBvcnRSZXF1ZXN0KCkgLSBUaGlzIGlzIEFQSSBjYW4gYmUgdXNlZCB0byB0cmlnZ2VyIGEgCisgICAgICAgICBOZWlnaGJvciByZXBvcnQgZnJvbSB0aGUgcGVlci4KKyAgCisgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uIGlkZW50aWZpZXIgb24gd2hpY2ggdGhlIHJlcXVlc3Qgc2hvdWxkIGJlIG1hZGUuICAgICAgIAorICBccGFyYW0gcE5laWdoYm9yUmVxIC0gYSBwb2ludGVyIHRvIGEgbmVpZ2hib3IgcmVwb3J0IHJlcXVlc3QuCisgIAorICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBWYWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwuCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgc21lX1JybU5laWdoYm9yUmVwb3J0UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IHNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFJybU5laWdoYm9yUmVxIHBOZWlnaGJvclJlcSwgdHBScm1OZWlnaGJvclJzcENhbGxiYWNrSW5mbyBjYWxsYmFja0luZm8pCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0cFNpck5laWdoYm9yUmVwb3J0UmVxSW5kIHBNc2c7CisgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uOworCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiUmVxdWVzdCB0byBzZW5kIE5laWdoYm9yIHJlcG9ydCByZXF1ZXN0IHJlY2VpdmVkIFxuIikpOworI2VuZGlmCisgICBpZiggIUNTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICB7ICAKKyAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIkludmFsaWQgc2Vzc2lvbiAlZFxuIiksIHNlc3Npb25JZCApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKyAgIHBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKworICAgLyogSWYgYWxyZWFkeSBhIHJlcG9ydCBpcyBwZW5kaW5nLCByZXR1cm4gZmFpbHVyZSAqLworICAgaWYgKGVBTklfQk9PTEVBTl9UUlVFID09IHBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVxQ29udHJvbEluZm8uaXNOZWlnaGJvclJzcFBlbmRpbmcpCisgICB7CisgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiTmVpZ2hib3IgcmVxdWVzdCBhbHJlYWR5IHBlbmRpbmcuLiBOb3QgYWxsb3dlZCIpKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0FHQUlOOworICAgfQorICAgCisgICBwTXNnID0gdm9zX21lbV9tYWxsb2MgKCBzaXplb2YodFNpck5laWdoYm9yUmVwb3J0UmVxSW5kKSApOworICAgaWYgKCBOVUxMID09IHBNc2cgKQorICAgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgTmVpZ2hib3IgcmVxdWVzdCIpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgCisgICB2b3NfbWVtX3plcm8oIHBNc2csIHNpemVvZih0U2lyTmVpZ2hib3JSZXBvcnRSZXFJbmQpICk7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIEFsbG9jYXRlZCBtZW1vcnkgZm9yIE5laWdoYm9yIHJlcXVlc3RcbiIpICk7CisjZW5kaWYKKworICAgcnJtTExQdXJnZU5laWdoYm9yQ2FjaGUocE1hYywgJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVwb3J0Q2FjaGUpOworCisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiUHVyZ2VkIHRoZSBuZWlnaGJvciBjYWNoZSBiZWZvcmUgc2VuZGluZyBOZWlnaGJvciByZXF1ZXN0OiBTdGF0dXMgPSAlZFxuIiksIHN0YXR1cyApOworI2VuZGlmCisKKyAgIHBNc2ctPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfTkVJR0hCT1JfUkVQT1JUX1JFUV9JTkQ7CisgICBwTXNnLT5sZW5ndGggPSBzaXplb2YoIHRTaXJOZWlnaGJvclJlcG9ydFJlcUluZCApOworICAgdm9zX21lbV9jb3B5KCAmcE1zZy0+YnNzSWQsICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworICAgcE1zZy0+bm9TU0lEID0gcE5laWdoYm9yUmVxLT5ub19zc2lkOworICAgdm9zX21lbV9jb3B5KCAmcE1zZy0+dWNTU0lELCAmcE5laWdoYm9yUmVxLT5zc2lkLCBzaXplb2YodFNpck1hY1NTaWQpKTsKKworICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZShwTWFjLT5oSGRkLCBwTXNnKTsKKyAgIGlmKCBzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisKKyAgIC8qIE5laWdoYm9yIHJlcG9ydCByZXF1ZXN0IG1lc3NhZ2Ugc2VudCBzdWNjZXNzZnVsbHkgdG8gUEUuIE5vdyByZWdpc3RlciB0aGUgY2FsbGJhY2tzICovCisgICBwTWFjLT5ycm0ucnJtU21lQ29udGV4dC5uZWlnaGJvclJlcUNvbnRyb2xJbmZvLm5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvLm5laWdoYm9yUnNwQ2FsbGJhY2sgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSW5mby0+bmVpZ2hib3JSc3BDYWxsYmFjazsKKyAgIHBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVxQ29udHJvbEluZm8ubmVpZ2hib3JSc3BDYWxsYmFja0luZm8ubmVpZ2hib3JSc3BDYWxsYmFja0NvbnRleHQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSW5mby0+bmVpZ2hib3JSc3BDYWxsYmFja0NvbnRleHQ7CisgICBwTWFjLT5ycm0ucnJtU21lQ29udGV4dC5uZWlnaGJvclJlcUNvbnRyb2xJbmZvLmlzTmVpZ2hib3JSc3BQZW5kaW5nID0gZUFOSV9CT09MRUFOX1RSVUU7CisKKyAgIC8qIFN0YXJ0IG5laWdoYm9yIHJlc3BvbnNlIHdhaXQgdGltZXIgbm93ICovCisgICB2b3NfdGltZXJfc3RhcnQoJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0Lm5laWdoYm9yUmVxQ29udHJvbEluZm8ubmVpZ2hib3JSc3BXYWl0VGltZXIsIGNhbGxiYWNrSW5mby0+dGltZW91dCk7CisgICAKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHJybUNhbGN1bGF0ZU5laWdoYm9yQVBSb2FtU2NvcmUoKSAtIFRoaXMgQVBJIGlzIGNhbGxlZCB3aGlsZSBoYW5kbGluZyAKKyAgICAgICAgICAgICAgICBpbmRpdmlkdWFsIG5laWdoYm9yIHJlcG9ydHMgZnJvbSB0aGUgQVBzIG5laWdoYm9yIEFQIHJlcG9ydCB0byAKKyAgICAgICAgICAgICAgICBjYWxjdWxhdGUgdGhlIGN1bXVsYXRpdmUgcm9hbSBzY29yZSBiZWZvcmUgc3RvcmluZyBpdCBpbiBuZWlnaGJvciAKKyAgICAgICAgICAgICAgICBjYWNoZS4KKyAgCisgIFxwYXJhbSBwTmVpZ2hib3JSZXBvcnREZXNjIC0gTmVpZ2hib3IgQlNTIERlc2NyaXB0b3Igbm9kZSBmb3Igd2hpY2ggcm9hbSBzY29yZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQKKyAgCisgIFxyZXR1cm4gdm9pZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHJybUNhbGN1bGF0ZU5laWdoYm9yQVBSb2FtU2NvcmUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBScm1OZWlnaGJvclJlcG9ydERlc2MgcE5laWdoYm9yUmVwb3J0RGVzYykKK3sKKyAgICB0cFNpck5laWdoYm9yQnNzRGVzY3JpcHRvbiAgcE5laWdoYm9yQnNzRGVzYzsKKyAgICB0QU5JX1UzMiAgICByb2FtU2NvcmUgPSAwOworICAgIAorICAgIFZPU19BU1NFUlQocE5laWdoYm9yUmVwb3J0RGVzYyAhPSBOVUxMKTsKKyAgICBWT1NfQVNTRVJUKHBOZWlnaGJvclJlcG9ydERlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uICE9IE5VTEwpOworCisgICAgcE5laWdoYm9yQnNzRGVzYyA9IHBOZWlnaGJvclJlcG9ydERlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uOworCisgICAgaWYgKHBOZWlnaGJvckJzc0Rlc2MtPmJzc2lkSW5mby5ycm1JbmZvLmZNb2JpbGl0eURvbWFpbikKKyAgICB7CisgICAgICAgIHJvYW1TY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfTU9CSUxJVFlfRE9NQUlOOworICAgICAgICBpZiAocE5laWdoYm9yQnNzRGVzYy0+YnNzaWRJbmZvLnJybUluZm8uZlNhbWVTZWN1cml0eU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvYW1TY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfU0VDVVJJVFk7CisgICAgICAgICAgICBpZiAocE5laWdoYm9yQnNzRGVzYy0+YnNzaWRJbmZvLnJybUluZm8uZlNhbWVBdXRoZW50aWNhdG9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvYW1TY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfS0VZX1NDT1BFOworICAgICAgICAgICAgICAgIGlmIChwTmVpZ2hib3JCc3NEZXNjLT5ic3NpZEluZm8ucnJtSW5mby5mQ2FwUmFkaW9NZWFzdXJlbWVudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvYW1TY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9SUk07CisgICAgICAgICAgICAgICAgICAgIGlmIChwTmVpZ2hib3JCc3NEZXNjLT5ic3NpZEluZm8ucnJtSW5mby5mQ2FwU3BlY3RydW1NZWFzdXJlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1TY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9TUEVDVFJVTV9NR01UOworICAgICAgICAgICAgICAgICAgICBpZiAocE5laWdoYm9yQnNzRGVzYy0+YnNzaWRJbmZvLnJybUluZm8uZkNhcFFvcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1TY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9RT1M7CisgICAgICAgICAgICAgICAgICAgIGlmIChwTmVpZ2hib3JCc3NEZXNjLT5ic3NpZEluZm8ucnJtSW5mby5mQ2FwQXBzZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1TY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9BUFNEOworICAgICAgICAgICAgICAgICAgICBpZiAocE5laWdoYm9yQnNzRGVzYy0+YnNzaWRJbmZvLnJybUluZm8uZkNhcERlbGF5ZWRCbG9ja0FjaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvYW1TY29yZSArPSBSUk1fUk9BTV9TQ09SRV9ORUlHSEJPUl9SRVBPUlRfQ0FQQUJJTElUWV9ERUxBWUVEX0JBOworICAgICAgICAgICAgICAgICAgICBpZiAocE5laWdoYm9yQnNzRGVzYy0+YnNzaWRJbmZvLnJybUluZm8uZkNhcEltbWVkaWF0ZUJsb2NrQWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgcm9hbVNjb3JlICs9IFJSTV9ST0FNX1NDT1JFX05FSUdIQk9SX1JFUE9SVF9DQVBBQklMSVRZX0lNTUVESUFURV9CQTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBOZWlnaGJvckJzc0Rlc2MtPmJzc2lkSW5mby5ycm1JbmZvLmZBcFByZWF1dGhSZWFjaGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICByb2FtU2NvcmUgKz0gUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfUkVQT1JUX1JFQUNIQUJJTElUWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIC8vIEl0IGhhcyBjb21lIGluIHRoZSByZXBvcnQgc28gaXRzIHRoZSBiZXN0IHNjb3JlCisgICAgaWYgKGNzck5laWdoYm9yUm9hbUlzMTFyQXNzb2MocE1hYykgPT0gRkFMU0UpCisgICAgeworICAgICAgICAvLyBJQVBQIFJvdXRlIHNvIGxldHMgbWFrZSB1c2Ugb2YgdGhpcyBpbmZvCisgICAgICAgIC8vIHNhdmUgYWxsIEFQLCBhcyB0aGUgbGlzdCBkb2VzIG5vdCBjb21lIGFsbCB0aGUgdGltZQorICAgICAgICAvLyBTYXZlIGFuZCByZXVzZSB0aWxsIHRoZSBuZXh0IEFQIExpc3QgY29tZXMgdG8gdXMuCisgICAgICAgIC8vIEV2ZW4gc2F2ZSBvdXIgb3duIE1BQyBhZGRyZXNzLiBXaWxsIGJlIHVzZWZ1bCBuZXh0IHRpbWUgYXJvdW5kLgorICAgICAgICByb2FtU2NvcmUgKz0gUlJNX1JPQU1fU0NPUkVfTkVJR0hCT1JfSUFQUF9MSVNUOworICAgIH0KKyNlbmRpZgorICAgIHBOZWlnaGJvclJlcG9ydERlc2MtPnJvYW1TY29yZSA9IHJvYW1TY29yZTsKKworICAgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgcnJtU3RvcmVOZWlnaGJvclJwdEJ5Um9hbVNjb3JlKCkgLSBUaGlzIEFQSSBpcyBjYWxsZWQgdG8gc3RvcmUgYSBnaXZlbiAKKyAgICAgICAgICAgICAgICAgICAgICAgIE5laWdoYm9yIEJTUyBkZXNjcmlwdG9yIHRvIHRoZSBuZWlnaGJvciBjYWNoZS4gVGhpcyBmdW5jdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlcyB0aGUgbmVpZ2hib3IgQlNTIGRlc2NyaXB0b3JzIGluIHN1Y2ggYSB3YXkgdGhhdCBkZXNjcmlwdG9ycyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBzb3J0ZWQgYnkgcm9hbVNjb3JlIGluIGRlc2NlbmRpbmcgb3JkZXIKKworICBccGFyYW0gcE5laWdoYm9yUmVwb3J0RGVzYyAtIE5laWdoYm9yIEJTUyBEZXNjcmlwdG9yIG5vZGUgdG8gYmUgc3RvcmVkIGluIGNhY2hlCisgIAorICBccmV0dXJuIHZvaWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHJybVN0b3JlTmVpZ2hib3JScHRCeVJvYW1TY29yZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0cFJybU5laWdoYm9yUmVwb3J0RGVzYyBwTmVpZ2hib3JSZXBvcnREZXNjKQoreworICAgdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworICAgdExpc3RFbGVtICAgICAgICpwRW50cnk7CisgICB0UnJtTmVpZ2hib3JSZXBvcnREZXNjICAqcFRlbXBOZWlnaGJvclJlcG9ydERlc2M7CisKKyAgIFZPU19BU1NFUlQocE5laWdoYm9yUmVwb3J0RGVzYyAhPSBOVUxMKTsKKyAgIFZPU19BU1NFUlQocE5laWdoYm9yUmVwb3J0RGVzYy0+cE5laWdoYm9yQnNzRGVzY3JpcHRpb24gIT0gTlVMTCk7CisKKyAgIGlmIChjc3JMTElzTGlzdEVtcHR5KCZwU21lUnJtQ29udGV4dC0+bmVpZ2hib3JSZXBvcnRDYWNoZSwgTExfQUNDRVNTX0xPQ0spKQorICAgeworICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiTmVpZ2hib3IgcmVwb3J0IGNhY2hlIGlzIGVtcHR5Li4gQWRkaW5nIGEgZW50cnkgbm93XG4iKSk7CisgICAgICAgIC8qIE5laWdoYm9yIGxpc3QgY2FjaGUgaXMgZW1wdHkuIEluc2VydCB0aGlzIGVudHJ5IGluIHRoZSB0YWlsICovCisgICAgICAgY3NyTExJbnNlcnRUYWlsKCZwU21lUnJtQ29udGV4dC0+bmVpZ2hib3JSZXBvcnRDYWNoZSwgJnBOZWlnaGJvclJlcG9ydERlc2MtPkxpc3QsIExMX0FDQ0VTU19MT0NLKTsKKyAgICAgICByZXR1cm47CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgLyogU2hvdWxkIHN0b3JlIHRoZSBuZWlnaGJvciBCU1MgZGVzY3JpcHRpb24gaW4gdGhlIG9yZGVyIHNvcnRlZCBieSByb2FtU2NvcmUgaW4gZGVzY2VuZGluZworICAgICAgICAgICAgICBvcmRlci4gQVBzIHdpdGggaGlnaGVzdCByb2FtU2NvcmUgc2hvdWxkIGJlIHRoZSAxc3QgZW50cnkgaW4gdGhlIGxpc3QgKi8KKyAgICAgICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCgmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUsIExMX0FDQ0VTU19MT0NLKTsKKyAgICAgICAgd2hpbGUgKHBFbnRyeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcE5laWdoYm9yUmVwb3J0RGVzYyA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFJybU5laWdoYm9yUmVwb3J0RGVzYywgTGlzdCApOworICAgICAgICAgICAgaWYgKHBUZW1wTmVpZ2hib3JSZXBvcnREZXNjLT5yb2FtU2NvcmUgPCBwTmVpZ2hib3JSZXBvcnREZXNjLT5yb2FtU2NvcmUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwRW50cnkgPSBjc3JMTE5leHQoJnBTbWVScm1Db250ZXh0LT5uZWlnaGJvclJlcG9ydENhY2hlLCBwRW50cnksIExMX0FDQ0VTU19MT0NLKTsKKyAgICAgICAgfSAKKworICAgICAgICBpZiAocEVudHJ5KQorICAgICAgICAgICAgLyogVGhpcyBCU1Mgcm9hbXNjb3JlIGlzIGJldHRlciB0aGFuIHNvbWV0aGluZyBpbiB0aGUgbGlzdC4gSW5zZXJ0IHRoaXMgYmVmb3JlIHRoYXQgb25lICovCisgICAgICAgICAgICBjc3JMTEluc2VydEVudHJ5KCZwU21lUnJtQ29udGV4dC0+bmVpZ2hib3JSZXBvcnRDYWNoZSwgcEVudHJ5LCAmcE5laWdoYm9yUmVwb3J0RGVzYy0+TGlzdCwgTExfQUNDRVNTX0xPQ0spOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiBBbGwgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgaGFzIGEgYmV0dGVyIHJvYW0gU2NvcmUgdGhhbiB0aGlzIG9uZS4gSW5zZXJ0IHRoaXMgYXQgdGhlIGxhc3QgKi8KKyAgICAgICAgICAgIGNzckxMSW5zZXJ0VGFpbCgmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUsICZwTmVpZ2hib3JSZXBvcnREZXNjLT5MaXN0LCBMTF9BQ0NFU1NfTE9DSyk7CisgICB9CisgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHNtZV9Scm1Qcm9jZXNzTmVpZ2hib3JSZXBvcnQoKSAtIFRoaXMgaXMgY2FsbGVkIHRvIHByb2Nlc3MgdGhlIE5laWdoYm9yIAorICAgICAgICAgcmVwb3J0IHJlY2VpdmVkIGZyb20gUEUuCisgIAorICBccGFyYW0gcE1zZ0J1ZiAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IG1hcHMgdG8gdmFyaW91cyBzdHJ1Y3R1cmVzIGJhc2UgCisgICAgICAgICAgICAgICAgICAgb24gdGhlIG1lc3NhZ2UgdHlwZS4KKyAgICAgICAgICAgICAgICAgICBUaGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgY2FuIGFsd2F5cyBtYXAgdG8gdFNpclNtZVJzcC4KKyAgCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFZhbGlkYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUnJtUHJvY2Vzc05laWdoYm9yUmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHZvaWQgKnBNc2dCdWYpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0cFNpck5laWdoYm9yUmVwb3J0SW5kIHBOZWlnaGJvclJwdCA9ICh0cFNpck5laWdoYm9yUmVwb3J0SW5kKSBwTXNnQnVmOworICAgdHBScm1OZWlnaGJvclJlcG9ydERlc2MgIHBOZWlnaGJvclJlcG9ydERlc2M7CisgICB0QU5JX1U4IGkgPSAwOworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAvLyBDbGVhciB0aGUgY2FjaGUgZm9yIENDWC4KKyAgIGlmIChjc3JOZWlnaGJvclJvYW1Jc0NDWEFzc29jKHBNYWMpKQorICAgeworICAgICAgIHJybUxMUHVyZ2VOZWlnaGJvckNhY2hlKHBNYWMsIAorICAgICAgICAgICAmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQubmVpZ2hib3JSZXBvcnRDYWNoZSk7CisgICB9CisjZW5kaWYKKworICAgZm9yIChpID0gMDsgaSA8IHBOZWlnaGJvclJwdC0+bnVtTmVpZ2hib3JSZXBvcnRzOyBpKyspCisgICB7CisgICAgICAgcE5laWdoYm9yUmVwb3J0RGVzYyA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0UnJtTmVpZ2hib3JSZXBvcnREZXNjKSk7CisgICAgICAgaWYgKE5VTEwgPT0gcE5laWdoYm9yUmVwb3J0RGVzYykKKyAgICAgICB7CisgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJSTSBOZWlnaGJvciByZXBvcnQgZGVzY1xuIik7CisgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQzsKKyAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAKKyAgICAgICB9CisKKyAgICAgICB2b3NfbWVtX3plcm8ocE5laWdoYm9yUmVwb3J0RGVzYywgc2l6ZW9mKHRScm1OZWlnaGJvclJlcG9ydERlc2MpKTsKKyAgICAgICBwTmVpZ2hib3JSZXBvcnREZXNjLT5wTmVpZ2hib3JCc3NEZXNjcmlwdGlvbiA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0U2lyTmVpZ2hib3JCc3NEZXNjcmlwdGlvbikpOworICAgICAgIGlmIChOVUxMID09IHBOZWlnaGJvclJlcG9ydERlc2MtPnBOZWlnaGJvckJzc0Rlc2NyaXB0aW9uKQorICAgICAgIHsKKyAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgUlJNIE5laWdoYm9yIHJlcG9ydCBCU1MgRGVzY3JpcHRpb25cbiIpOworICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMRURfQUxMT0M7CisgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgIH0KKyAgICAgICB2b3NfbWVtX3plcm8ocE5laWdoYm9yUmVwb3J0RGVzYy0+cE5laWdoYm9yQnNzRGVzY3JpcHRpb24sIHNpemVvZih0U2lyTmVpZ2hib3JCc3NEZXNjcmlwdGlvbikpOworICAgICAgIHZvc19tZW1fY29weShwTmVpZ2hib3JSZXBvcnREZXNjLT5wTmVpZ2hib3JCc3NEZXNjcmlwdGlvbiwgJnBOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJOZWlnaGJvckJzc0Rlc2NyaXB0aW9uKSk7CisKKyNpZiBkZWZpbmVkIFdMQU5fVk9XSUZJX0RFQlVHCisgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiUmVjZWl2ZWQgbmVpZ2hib3IgcmVwb3J0IHdpdGggTmVpZ2hib3IgQlNTSUQ6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKyAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NJZFswXSwgCisgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0uYnNzSWRbMV0sIAorICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc0lkWzJdLCAKKyAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NJZFszXSwgCisgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0uYnNzSWRbNF0sIAorICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc0lkWzVdKTsKKyNlbmRpZgorCisgICAgICAgLyogQ2FsY3VsYXRlIHRoZSByb2FtIHNjb3JlIGJhc2VkIG9uIHRoZSBCU1MgQ2FwYWJpbGl0eSBpbiB0aGUgQlNTSUQgSW5mb3JtYXRpb24gYW5kIHN0b3JlIGl0IGluIE5laWdoYm9yIHJlcG9ydCBEZXNjICovCisgICAgICAgcnJtQ2FsY3VsYXRlTmVpZ2hib3JBUFJvYW1TY29yZShwTWFjLCBwTmVpZ2hib3JSZXBvcnREZXNjKTsKKworICAgICAgIC8qIFN0b3JlIHRoZSBOZWlnaGJvciByZXBvcnQgRGVzYyBpbiB0aGUgY2FjaGUgYmFzZWQgb24gdGhlIHJvYW0gc2NvcmUgKi8KKyAgICAgICBpZiAoIHBOZWlnaGJvclJlcG9ydERlc2MtPnJvYW1TY29yZSA+IDApCisgICAgICAgeworICAgICAgICAgIHJybVN0b3JlTmVpZ2hib3JScHRCeVJvYW1TY29yZShwTWFjLCBwTmVpZ2hib3JSZXBvcnREZXNjKTsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgIHsKKyAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCJSb2FtIHNjb3JlIG9mIEJTU0lEICAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBpcyAwLCBJZ25vcmluZy4uIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0uYnNzSWRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc0lkWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgcE5laWdoYm9yUnB0LT5zTmVpZ2hib3JCc3NEZXNjcmlwdGlvbltpXS5ic3NJZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZWlnaGJvclJwdC0+c05laWdoYm9yQnNzRGVzY3JpcHRpb25baV0uYnNzSWRbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBwTmVpZ2hib3JScHQtPnNOZWlnaGJvckJzc0Rlc2NyaXB0aW9uW2ldLmJzc0lkWzVdKTsKKworICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE5laWdoYm9yUmVwb3J0RGVzYy0+cE5laWdoYm9yQnNzRGVzY3JpcHRpb24pOworICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE5laWdoYm9yUmVwb3J0RGVzYyk7CisgICAgICAgfQorICAgfQorZW5kOiAgCisgICAKKyAgIGlmICghY3NyTExDb3VudCgmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQubmVpZ2hib3JSZXBvcnRDYWNoZSkpCisgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAKKyAgIC8qIFJlY2VpdmVkIGEgcmVwb3J0IGZyb20gQVAuIEluZGljYXRlIFNVQ0NFU1MgdG8gdGhlIGNhbGxlciBpZiB0aGVyZSBhcmUgc29tZSB2YWxpZCByZXBvcnRzICovCisgICBycm1JbmRpY2F0ZU5laWdoYm9yUmVwb3J0UmVzdWx0KHBNYWMsIHZvc1N0YXR1cyk7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBzbWVfUnJtTXNnUHJvY2Vzc29yKCkgLSBzbWVfUHJvY2Vzc01zZygpIGNhbGxzIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSAKKyAgbWVzc2FnZXMgdGhhdCBhcmUgaGFuZGxlZCBieSBTTUUgUlJNIG1vZHVsZS4KKyAgCisgIFxwYXJhbSBwTWFjIC0gUG9pbnRlciB0byB0aGUgZ2xvYmFsIE1BQyBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICBccGFyYW0gbXNnX3R5cGUgLSB0aGUgdHlwZSBvZiBtc2cgcGFzc2VkIGJ5IFBFIGFzIGRlZmluZWQgaW4gd25pQXBpLmgKKyAgXHBhcmFtIHBNc2dCdWYgLSBhIHBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCBtYXBzIHRvIHZhcmlvdXMgc3RydWN0dXJlcyBiYXNlIAorICAgICAgICAgICAgICAgICAgIG9uIHRoZSBtZXNzYWdlIHR5cGUuCisgICAgICAgICAgICAgICAgICAgVGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGNhbiBhbHdheXMgbWFwIHRvIHRTaXJTbWVSc3AuCisgIAorICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBWYWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwuCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JybU1zZ1Byb2Nlc3NvciggdHBBbmlTaXJHbG9iYWwgcE1hYywgIHZfVTE2X3QgbXNnX3R5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwTXNnQnVmKQoreworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgIEZMKCIgTXNnID0gJWQgZm9yIFJSTSBtZWFzdXJlbWVudFxuIikgLCBtc2dfdHlwZSApOworCisgICAvL3N3aXRjaCBvbiB0aGUgbXNnIHR5cGUgJiBtYWtlIHRoZSBzdGF0ZSB0cmFuc2l0aW9uIGFjY29yZGluZ2x5CisgICBzd2l0Y2gobXNnX3R5cGUpCisgICB7CisgICAgICBjYXNlIGVXTklfU01FX05FSUdIQk9SX1JFUE9SVF9JTkQ6CisgICAgICAgICBzbWVfUnJtUHJvY2Vzc05laWdoYm9yUmVwb3J0KCBwTWFjLCBwTXNnQnVmICk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBlV05JX1NNRV9CRUFDT05fUkVQT1JUX1JFUV9JTkQ6CisgICAgICAgICBzbWVfUnJtUHJvY2Vzc0JlYWNvblJlcG9ydFJlcUluZCggcE1hYywgcE1zZ0J1ZiApOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAvL2VyciBtc2cKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgIEZMKCJzbWVfUnJtTXNnUHJvY2Vzc29yOnVua25vd24gbXNnIHR5cGUgPSAlZFxuIiksIG1zZ190eXBlKTsKKworICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBycm1JdGVyTWVhc1RpbWVySGFuZGxlCisKKyAgICBcYnJpZWYgIFRpbWVyIGhhbmRsZXIgdG8gaGFuZGxldCB0aGUgdGltZW91dCBjb25kaXRpb24gd2hlbiBhIHNwZWNpZmljIEJUCisKKyAgICAgICAgICAgIHN0b3AgZXZlbnQgZG9lcyBub3QgY29tZSBiYWNrLCBpbiB3aGljaCBjYXNlIHRvIHJlc3RvcmUgYmFjayB0aGUKKworICAgICAgICAgICAgaGVhcnRiZWF0IHRpbWVyLgorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBWT0lECisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBycm1JdGVyTWVhc1RpbWVySGFuZGxlKCB2X1BWT0lEX3QgdXNlckRhdGEgKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgdXNlckRhdGE7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiUmFuZG9taXphdGlvbiB0aW1lciBleHBpcmVkLi4uc2VuZCBvbiBuZXh0IGNoYW5uZWwgXG4iKTsKKyNlbmRpZgorICAgIC8vSXNzdWUgYSBzY2FuIHJlcSBmb3IgbmV4dCBjaGFubmVsLgorICAgIHNtZV9Scm1Jc3N1ZVNjYW5SZXEoIHBNYWMgKTsgCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIAorICAgIFxmbiBycm1OZWlnaGJvclJzcFRpbWVvdXRIYW5kbGVyCisgICAgCisgICAgXGJyaWVmICBUaW1lciBoYW5kbGVyIHRvIGhhbmRsZSB0aGUgdGltZW91dCBjb25kaXRpb24gd2hlbiBhIG5laWdoYm9yIHJlcXVlc3QgaXMgc2VudCAKKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vIG5laWdoYm9yIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIEFQCisgICAgCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIAorICAgIFxyZXR1cm4gVk9JRAorICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAKK3ZvaWQgcnJtTmVpZ2hib3JSc3BUaW1lb3V0SGFuZGxlcgorKCB2X1BWT0lEX3QgdXNlckRhdGEgKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgdXNlckRhdGE7CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiTmVpZ2hib3IgUmVzcG9uc2UgdGltZWQgb3V0IFxuIik7CisjZW5kaWYKKyAgICBycm1JbmRpY2F0ZU5laWdoYm9yUmVwb3J0UmVzdWx0KHBNYWMsIFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICByZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHJybU9wZW4KKworICAgIFxicmllZiAgCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKworICAgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgIHN1Y2Nlc3MKKworICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICBmYWlsdXJlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVk9TX1NUQVRVUyBycm1PcGVuICh0cEFuaVNpckdsb2JhbCBwTWFjKQorCit7CisKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworICAgZUhhbFN0YXR1cyAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIHBTbWVScm1Db250ZXh0LT5ycm1Db25maWcubWF4UmFuZG5JbnRlcnZhbCA9IDUwOyAvL21zCisKKyAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9pbml0KCAmcFNtZVJybUNvbnRleHQtPkl0ZXJNZWFzVGltZXIsCisKKyAgICAgICAgICAgICAgICAgICAgICBWT1NfVElNRVJfVFlQRV9TVywKKworICAgICAgICAgICAgICAgICAgICAgIHJybUl0ZXJNZWFzVGltZXJIYW5kbGUsCisKKyAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIHBNYWMpOworCisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKSB7CisKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgInJybU9wZW46IEZhaWwgdG8gaW5pdCB0aW1lciIpOworCisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICB2b3NTdGF0dXMgPSB2b3NfdGltZXJfaW5pdCggJnBTbWVScm1Db250ZXh0LT5uZWlnaGJvclJlcUNvbnRyb2xJbmZvLm5laWdoYm9yUnNwV2FpdFRpbWVyLAorCisgICAgICAgICAgICAgICAgICAgICAgVk9TX1RJTUVSX1RZUEVfU1csCisKKyAgICAgICAgICAgICAgICAgICAgICBycm1OZWlnaGJvclJzcFRpbWVvdXRIYW5kbGVyLAorCisgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSBwTWFjKTsKKworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkgeworCisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJycm1PcGVuOiBGYWlsIHRvIGluaXQgdGltZXIiKTsKKworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVxQ29udHJvbEluZm8uaXNOZWlnaGJvclJzcFBlbmRpbmcgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgIGhhbFN0YXR1cyA9IGNzckxMT3BlbihwTWFjLT5oSGRkLCAmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUpOworICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gaGFsU3RhdHVzKQorICAgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAicnJtT3BlbjogRmFpbCB0byBvcGVuIG5laWdoYm9yIGNhY2hlIHJlc3VsdCIpOworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBycm1DbG9zZQorCisgICAgXGJyaWVmICAKKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICAgIFxyZXR1cm4gVk9TX1NUQVRVUworCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAgc3VjY2VzcworCisgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgIGZhaWx1cmUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWT1NfU1RBVFVTIHJybUNsb3NlICh0cEFuaVNpckdsb2JhbCBwTWFjKQorCit7CisKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdHBScm1TTUVDb250ZXh0IHBTbWVScm1Db250ZXh0ID0gJnBNYWMtPnJybS5ycm1TbWVDb250ZXh0OworCisgICBpZiggVk9TX1RJTUVSX1NUQVRFX1JVTk5JTkcgPT0gdm9zX3RpbWVyX2dldEN1cnJlbnRTdGF0ZSggJnBTbWVScm1Db250ZXh0LT5JdGVyTWVhc1RpbWVyICkgKQorICAgeworICAgICAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX3N0b3AoICZwU21lUnJtQ29udGV4dC0+SXRlck1lYXNUaW1lciApOworICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgICAgeyAKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiVGltZXIgc3RvcCBmYWlsIikgKTsKKyAgICAgIH0KKyAgIH0gCisKKyAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9kZXN0cm95KCAmcFNtZVJybUNvbnRleHQtPkl0ZXJNZWFzVGltZXIgKTsgCisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKSB7CisKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgRkwoIkZhaWwgdG8gZGVzdHJveSB0aW1lciIpICk7CisKKyAgIH0KKworICAgcnJtTExQdXJnZU5laWdoYm9yQ2FjaGUocE1hYywgJnBTbWVScm1Db250ZXh0LT5uZWlnaGJvclJlcG9ydENhY2hlKTsKKyAgICAgIAorICAgY3NyTExDbG9zZSgmcFNtZVJybUNvbnRleHQtPm5laWdoYm9yUmVwb3J0Q2FjaGUpOworCisgICByZXR1cm4gdm9zU3RhdHVzOworCit9CisKKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHJybVJlYWR5CisKKyAgICBcYnJpZWYgIGZuCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWT1NfU1RBVFVTIHJybVJlYWR5ICh0cEFuaVNpckdsb2JhbCBwTWFjKQorCit7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBycm1DaGFuZ2VEZWZhdWx0Q29uZmlnUGFyYW0KKyAgICBcYnJpZWYgIGZuCisKKyAgICBccGFyYW0gIHBNYWMgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwUnJtQ29uZmlnIC0gcG9pbnRlciB0byBuZXcgcnJtIGNvbmZpZ3MuCisKKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBycm1DaGFuZ2VEZWZhdWx0Q29uZmlnUGFyYW0odHBBbmlTaXJHbG9iYWwgcE1hYywgdHBScm1Db25maWdQYXJhbSBwUnJtQ29uZmlnKQoreworICAgdm9zX21lbV9jb3B5KCAmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQucnJtQ29uZmlnLCBwUnJtQ29uZmlnLCBzaXplb2YoIHRScm1Db25maWdQYXJhbSApICk7IAorCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAKKyAgICBcZm4gc21lUnJtR2V0Rmlyc3RCc3NFbnRyeUZyb21OZWlnaGJvckNhY2hlKCkKKyAgICAKKyAgICBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgZW50cnkgZnJvbSB0aGUgbmVpZ2hib3IgY2FjaGUgdG8gdGhlIGNhbGxlcgorCisgICAgXHBhcmFtICBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIAorICAgIFxyZXR1cm4gVk9JRAorICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RScm1OZWlnaGJvclJlcG9ydERlc2MqIHNtZVJybUdldEZpcnN0QnNzRW50cnlGcm9tTmVpZ2hib3JDYWNoZSggdHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgdFJybU5laWdoYm9yUmVwb3J0RGVzYyAqcFRlbXBCc3NFbnRyeSA9IE5VTEw7CisgICB0cFJybVNNRUNvbnRleHQgcFNtZVJybUNvbnRleHQgPSAmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQ7CisKKworICAgcEVudHJ5ID0gY3NyTExQZWVrSGVhZCggJnBTbWVScm1Db250ZXh0LT5uZWlnaGJvclJlcG9ydENhY2hlLCBMTF9BQ0NFU1NfTE9DSyApOworCisgICBpZighcEVudHJ5IHx8ICFjc3JMTENvdW50KCZwU21lUnJtQ29udGV4dC0+bmVpZ2hib3JSZXBvcnRDYWNoZSkpCisgICB7CisgICAgICAvL2xpc3QgZW1wdHkKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0dXLCBGTCgiTGlzdCBlbXB0eVxuIikpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIHBUZW1wQnNzRW50cnkgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRScm1OZWlnaGJvclJlcG9ydERlc2MsIExpc3QgKTsKKworICAgcmV0dXJuIHBUZW1wQnNzRW50cnk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIAorICAgIFxmbiBzbWVScm1HZXROZXh0QnNzRW50cnlGcm9tTmVpZ2hib3JDYWNoZSgpCisgICAgCisgICAgXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVudHJ5IG5leHQgdG8gdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIAorICAgICAgICAgICAgICAgIG5laWdoYm9yIGNhY2hlIHRvIHRoZSBjYWxsZXIKKworICAgIFxwYXJhbSAgcE1hYyAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICAKKyAgICBccmV0dXJuIFZPSUQKKyAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0UnJtTmVpZ2hib3JSZXBvcnREZXNjKiBzbWVScm1HZXROZXh0QnNzRW50cnlGcm9tTmVpZ2hib3JDYWNoZSggdHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUnJtTmVpZ2hib3JSZXBvcnREZXNjIHBCc3NFbnRyeSkKK3sKKyAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgdFJybU5laWdoYm9yUmVwb3J0RGVzYyAqcFRlbXBCc3NFbnRyeSA9IE5VTEw7CisKKyAgIHBFbnRyeSA9IGNzckxMTmV4dCgmcE1hYy0+cnJtLnJybVNtZUNvbnRleHQubmVpZ2hib3JSZXBvcnRDYWNoZSwgJnBCc3NFbnRyeS0+TGlzdCwgTExfQUNDRVNTX0xPQ0spOworCisgICBpZighcEVudHJ5KQorICAgeworICAgICAgLy9saXN0IGVtcHR5CisgICAgICBzbXNMb2cocE1hYywgTE9HVywgRkwoIkxpc3QgZW1wdHlcbiIpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBwVGVtcEJzc0VudHJ5ID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0UnJtTmVpZ2hib3JSZXBvcnREZXNjLCBMaXN0ICk7CisKKyAgIHJldHVybiBwVGVtcEJzc0VudHJ5OworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAordm9pZCBjc3JDY3hTZW5kQWRqYWNlbnRBcFJlcE1zZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uKQoreworICAgdHBTaXJBZGphY2VudEFwUmVwSW5kIHBBZGpSZXA7CisgICB0QU5JX1UxNiBsZW5ndGg7CisgICB0QU5JX1UzMiByb2FtVFMyOworICAgCisgICBzbXNMb2coIHBNYWMsIExPRzEsICJBZGphY2VudCBBUCBSZXBvcnQgTXNnIHRvIFBFXG4iKTsKKworICAgbGVuZ3RoID0gc2l6ZW9mKHRTaXJBZGphY2VudEFwUmVwSW5kICk7CisgICBwQWRqUmVwID0gdm9zX21lbV9tYWxsb2MgKCBsZW5ndGggKTsKKworICAgaWYgKCBOVUxMID09IHBBZGpSZXAgKQorICAgeworICAgICAgIHNtc0xvZyggcE1hYywgTE9HUCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEFkamFjZW50IEFQIHJlcG9ydCIpOworICAgICAgIHJldHVybjsKKyAgIH0KKworICAgdm9zX21lbV96ZXJvKCBwQWRqUmVwLCBsZW5ndGggKTsKKyAgIHBBZGpSZXAtPm1lc3NhZ2VUeXBlID0gZVdOSV9TTUVfQ0NYX0FESkFDRU5UX0FQX1JFUE9SVDsKKyAgIHBBZGpSZXAtPmxlbmd0aCA9IGxlbmd0aDsKKyAgIHBBZGpSZXAtPmNoYW5uZWxOdW0gPSBwU2Vzc2lvbi0+cHJldk9wQ2hhbm5lbDsKKyAgIHZvc19tZW1fY29weSggcEFkalJlcC0+YnNzaWQsICZwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5ic3NpZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSApOworICAgdm9zX21lbV9jb3B5KCBwQWRqUmVwLT5wcmV2QXBNYWNBZGRyLCAmcFNlc3Npb24tPnByZXZBcEJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpICk7CisgICB2b3NfbWVtX2NvcHkoICZwQWRqUmVwLT5wcmV2QXBTU0lELCAmcFNlc3Npb24tPnByZXZBcFNTSUQsIHNpemVvZih0U2lyTWFjU1NpZCkgKTsKKyAgIHJvYW1UUzIgPSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCk7CisgICBwQWRqUmVwLT50c21Sb2FtZGVsYXkgPSByb2FtVFMyIC0gcFNlc3Npb24tPnJvYW1UUzE7CisgICBwQWRqUmVwLT5yb2FtUmVhc29uID1TSVJfQ0NYX0FTU09DX1JFQVNPTl9VTlNQRUNJRklFRDsKKyAgIHBBZGpSZXAtPmNsaWVudERpc3NTZWNzID0ocEFkalJlcC0+dHNtUm9hbWRlbGF5LzEwMDApOworCisgICBwYWxTZW5kTUJNZXNzYWdlKHBNYWMtPmhIZGQsIHBBZGpSZXApOworCisgICByZXR1cm47Cit9CisjZW5kaWYgICAvKiBGRUFUVVJFX1dMQU5fQ0NYICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvU01FL3NyYy9zbWVfY29tbW9uL3NtZV9BcGkuYyBiL0NPUkUvU01FL3NyYy9zbWVfY29tbW9uL3NtZV9BcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDJlOGYwCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TTUUvc3JjL3NtZV9jb21tb24vc21lX0FwaS5jCkBAIC0wLDAgKzEsNjM1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBcZmlsZSAgc21lQXBpLmMKKworICBcYnJpZWYgRGVmaW5pdGlvbnMgZm9yIFNNRSBBUElzCisKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisKKyAgd2hlbiAgICAgICAgICAgd2hvICAgICAgICAgICAgICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLS0tICAgICAgIC0tLSAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDYvMDMvMTAgICAgIGpzICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCB0byBob3N0YXBkIGRyaXZlbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhdXRoL2Rpc2Fzc29jL21pYyBmYWlsdXJlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbEludGVybmFsLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNtc0RlYnVnLmgiCisjaW5jbHVkZSAic21lX0FwaS5oIgorI2luY2x1ZGUgImNzckluc2lkZUFwaS5oIgorI2luY2x1ZGUgInNtZUluc2lkZS5oIgorI2luY2x1ZGUgImNzckludGVybmFsLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisjaW5jbHVkZSAiaGFsTXNnQXBpLmgiCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjaW5jbHVkZSAic2FwQXBpLmgiCisjZW5kaWYKKworCisKKyNpZiAhZGVmaW5lZChGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DKQorZXh0ZXJuIHRTaXJSZXRTdGF0dXMgdU1hY1Bvc3RDdHJsTXNnKHZvaWQqIHBTaXJHbG9iYWwsIHRTaXJNYk1zZyogcE1iKTsKKworI2luY2x1ZGUgPHdsYW5fcWN0X3BhbF9hcGkuaD4KKyNlbmRpZgorCisvLyBUeE1CIEZ1bmN0aW9ucworZXh0ZXJuIGVIYWxTdGF0dXMgcG1jUHJlcGFyZUNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIGVTbWVDb21tYW5kVHlwZSBjbWRUeXBlLCB2b2lkICpwdlBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHNpemUsIHRTbWVDbWQgKipwcENtZCApOworZXh0ZXJuIHZvaWQgcG1jUmVsZWFzZUNvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICk7CitleHRlcm4gdm9pZCBxb3NSZWxlYXNlQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcENvbW1hbmQgKTsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9QMlAKK2V4dGVybiBlSGFsU3RhdHVzIHAycFByb2Nlc3NSZW1haW5PbkNoYW5uZWxDbWQodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNtZUNtZCAqcDJwUmVtYWlub25DaG4pOworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX3JlbWFpbk9uQ2huUnNwKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4ICpwTXNnKTsKK2V4dGVybiBlSGFsU3RhdHVzIHNtZV9tZ210RnJtSW5kKCB0SGFsSGFuZGxlIGhIYWwsIHRwU2lyU21lTWdtdEZyYW1lSW5kIHBTbWVNZ210RnJtKTsKK2V4dGVybiBlSGFsU3RhdHVzIHNtZV9yZW1haW5PbkNoblJlYWR5KCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTgqIHBNc2cpOworZXh0ZXJuIGVIYWxTdGF0dXMgc21lX3NlbmRBY3Rpb25DbmYoIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCogcE1zZyk7CitleHRlcm4gZUhhbFN0YXR1cyBwMnBQcm9jZXNzTm9BUmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBOb0FDbWQpOworI2VuZGlmCisKK3N0YXRpYyBlSGFsU3RhdHVzIGluaXRTbWVDbWRMaXN0KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworc3RhdGljIHZvaWQgc21lQWJvcnRDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwgdEFOSV9CT09MRUFOIGZTdG9wcGluZyApOworCitlQ3NyUGh5TW9kZSBzbWVfR2V0UGh5TW9kZSh0SGFsSGFuZGxlIGhIYWwpOworCitlSGFsU3RhdHVzIHNtZV9IYW5kbGVDaGFuZ2VDb3VudHJ5Q29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCAgdm9pZCAqcE1zZ0J1Zik7CisKK2VIYWxTdGF0dXMgc21lX0hhbmRsZVByZUNoYW5uZWxTd2l0Y2hJbmQodEhhbEhhbmRsZSBoSGFsKTsKKworZUhhbFN0YXR1cyBzbWVfSGFuZGxlUG9zdENoYW5uZWxTd2l0Y2hJbmQodEhhbEhhbmRsZSBoSGFsKTsKKworLy9JbnRlcm5hbCBTTUUgQVBJcworZUhhbFN0YXR1cyBzbWVfQWNxdWlyZUdsb2JhbExvY2soIHRTbWVTdHJ1Y3QgKnBzU21lKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICBpZihwc1NtZSkKKyAgICB7CisgICAgICAgIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc19sb2NrX2FjcXVpcmUoICZwc1NtZS0+bGtTbWVHbG9iYWxMb2NrKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCitlSGFsU3RhdHVzIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggdFNtZVN0cnVjdCAqcHNTbWUpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKworICAgIGlmKHBzU21lKQorICAgIHsKKyAgICAgICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zX2xvY2tfcmVsZWFzZSggJnBzU21lLT5sa1NtZUdsb2JhbExvY2spICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKworc3RhdGljIGVIYWxTdGF0dXMgaW5pdFNtZUNtZExpc3QodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICB0U21lQ21kICpwQ21kOworCisgICAgcE1hYy0+c21lLnRvdGFsU21lQ21kID0gU01FX1RPVEFMX0NPTU1BTkQ7CisgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cyA9IGNzckxMT3BlbihwTWFjLT5oSGRkLCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QpKSkKKyAgICB7CisgICAgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMgPSBjc3JMTE9wZW4ocE1hYy0+aEhkZCwgJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzID0gY3NyTExPcGVuKHBNYWMtPmhIZGQsICZwTWFjLT5zbWUuc21lQ21kRnJlZUxpc3QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcENtZCwgc2l6ZW9mKHRTbWVDbWQpICogcE1hYy0+c21lLnRvdGFsU21lQ21kKTsKKyAgICAgICAgICAgICAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIGM7CisKKyAgICAgICAgICAgICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwQ21kLCBzaXplb2YodFNtZUNtZCkgKiBwTWFjLT5zbWUudG90YWxTbWVDbWQpOworICAgICAgICAgICAgICAgICAgICBwTWFjLT5zbWUucFNtZUNtZEJ1ZkFkZHIgPSBwQ21kOworICAgICAgICAgICAgICAgICAgICBmb3IoYyA9IDA7IGMgPCBwTWFjLT5zbWUudG90YWxTbWVDbWQ7IGMrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3NyTExJbnNlcnRUYWlsKCZwTWFjLT5zbWUuc21lQ21kRnJlZUxpc3QsICZwQ21kW2NdLkxpbmssIExMX0FDQ0VTU19MT0NLKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCit2b2lkIHNtZVJlbGVhc2VDb21tYW5kKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDbWQpCit7CisgICAgcENtZC0+Y29tbWFuZCA9IGVTbWVOb0NvbW1hbmQ7CisgICAgY3NyTExJbnNlcnRUYWlsKCZwTWFjLT5zbWUuc21lQ21kRnJlZUxpc3QsICZwQ21kLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSyk7Cit9CisKKworCitzdGF0aWMgdm9pZCBzbWVSZWxlYXNlQ21kTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RGJsTGlua0xpc3QgKnBMaXN0KQoreworICAgIHRMaXN0RWxlbSAqcEVudHJ5OworICAgIHRTbWVDbWQgKnBDb21tYW5kOworCisgICAgd2hpbGUoKHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZChwTGlzdCwgTExfQUNDRVNTX0xPQ0spKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy9UT0RPOiBiYXNlIG9uIGNvbW1hbmQgdHlwZSB0byBjYWxsIHJlbGVhc2UgZnVuY3Rpb25zCisgICAgICAgIC8vcmVpbml0aWFsaXplIGRpZmZlcmVudCBjb21tYW5kIHR5cGVzIHNvIHRoZXkgY2FuIGJlIHJldXNlZAorICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworICAgICAgICBzbWVBYm9ydENvbW1hbmQocE1hYywgcENvbW1hbmQsIGVBTklfQk9PTEVBTl9UUlVFKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1cmdlU21lQ21kTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIC8vcmVsZWFzZSBhbnkgb3V0IHN0YW5kaW5nIGNvbW1hbmRzIGJhY2sgdG8gZnJlZSBjb21tYW5kIGxpc3QKKyAgICBzbWVSZWxlYXNlQ21kTGlzdChwTWFjLCAmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0KTsKKyAgICBzbWVSZWxlYXNlQ21kTGlzdChwTWFjLCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QpOworfQorCit2b2lkIHB1cmdlU21lU2Vzc2lvbkNtZExpc3QodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKQoreworICAgIC8vcmVsZWFzZSBhbnkgb3V0IHN0YW5kaW5nIGNvbW1hbmRzIGJhY2sgdG8gZnJlZSBjb21tYW5kIGxpc3QKKyAgICB0TGlzdEVsZW0gKnBFbnRyeSwgKnBOZXh0OworICAgIHRTbWVDbWQgKnBDb21tYW5kOworICAgIHREYmxMaW5rTGlzdCAqcExpc3QgPSAmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0OworICAgIHREYmxMaW5rTGlzdCBsb2NhbExpc3Q7CisKKyAgICB2b3NfbWVtX3plcm8oJmxvY2FsTGlzdCwgc2l6ZW9mKHREYmxMaW5rTGlzdCkpOworICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoY3NyTExPcGVuKHBNYWMtPmhIZGQsICZsb2NhbExpc3QpKSkKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiIGZhaWxlZCB0byBvcGVuIGxpc3QiKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjc3JMTExvY2socExpc3QpOworICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQocExpc3QsIExMX0FDQ0VTU19OT0xPQ0spOworICAgIHdoaWxlKHBFbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcE5leHQgPSBjc3JMTE5leHQocExpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyk7CisgICAgICAgIHBDb21tYW5kID0gR0VUX0JBU0VfQUREUiggcEVudHJ5LCB0U21lQ21kLCBMaW5rICk7CisgICAgICAgIGlmKHBDb21tYW5kLT5zZXNzaW9uSWQgPT0gc2Vzc2lvbklkKQorICAgICAgICB7CisgICAgICAgICAgICBpZihjc3JMTFJlbW92ZUVudHJ5KHBMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzckxMSW5zZXJ0VGFpbCgmbG9jYWxMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBFbnRyeSA9IHBOZXh0OworICAgIH0KKyAgICBjc3JMTFVubG9jayhwTGlzdCk7CisKKyAgICB3aGlsZSggKHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZCgmbG9jYWxMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLKSkgKQorICAgIHsKKyAgICAgICAgcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRTbWVDbWQsIExpbmsgKTsKKyAgICAgICAgc21lQWJvcnRDb21tYW5kKHBNYWMsIHBDb21tYW5kLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICAgfQorICAgIGNzckxMQ2xvc2UoJmxvY2FsTGlzdCk7CisKK30KKworCitzdGF0aWMgZUhhbFN0YXR1cyBmcmVlU21lQ21kTGlzdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAgIHB1cmdlU21lQ21kTGlzdChwTWFjKTsKKyAgICBjc3JMTENsb3NlKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QpOworICAgIGNzckxMQ2xvc2UoJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0KTsKKyAgICBjc3JMTENsb3NlKCZwTWFjLT5zbWUuc21lQ21kRnJlZUxpc3QpOworCisgICAgaWYoTlVMTCAhPSBwTWFjLT5zbWUucFNtZUNtZEJ1ZkFkZHIpCisgICAgeworICAgICAgICBzdGF0dXMgPSBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPnNtZS5wU21lQ21kQnVmQWRkcik7CisgICAgICAgIHBNYWMtPnNtZS5wU21lQ21kQnVmQWRkciA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKK3ZvaWQgZHVtcENzckNvbW1hbmRJbmZvKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDbWQpCit7CisjaWZkZWYgV0xBTl9ERUJVRworICAgIHN3aXRjaCggcENtZC0+Y29tbWFuZCApCisgICAgeworICAgIGNhc2UgZVNtZUNvbW1hbmRTY2FuOgorICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICIgc2NhbiBjb21tYW5kIHJlYXNvbiBpcyAlZCIsIHBDbWQtPnUuc2NhbkNtZC5yZWFzb24gKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVTbWVDb21tYW5kUm9hbToKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiIHJvYW0gY29tbWFuZCByZWFzb24gaXMgJWQiLCBwQ21kLT51LnJvYW1DbWQucm9hbVJlYXNvbiApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgZVNtZUNvbW1hbmRXbVN0YXR1c0NoYW5nZToKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiIFdNU3RhdHVzQ2hhbmdlIGNvbW1hbmQgdHlwZSBpcyAlZCIsIHBDbWQtPnUud21TdGF0dXNDaGFuZ2VDbWQuVHlwZSApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgZVNtZUNvbW1hbmRTZXRLZXk6CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIiBzZXRLZXkgY29tbWFuZCBhdXRoKCVkKSBlbmMoJWQpIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBwQ21kLT51LnNldEtleUNtZC5hdXRoVHlwZSwgcENtZC0+dS5zZXRLZXlDbWQuZW5jVHlwZSApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgZVNtZUNvbW1hbmRSZW1vdmVLZXk6CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIiByZW1vdmVLZXkgY29tbWFuZCBhdXRoKCVkKSBlbmMoJWQpIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBwQ21kLT51LnJlbW92ZUtleUNtZC5hdXRoVHlwZSwgcENtZC0+dS5yZW1vdmVLZXlDbWQuZW5jVHlwZSApOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAgLy8jaWZkZWYgV0xBTl9ERUJVRworfQorCit0U21lQ21kICpzbWVHZXRDb21tYW5kQnVmZmVyKCB0cEFuaVNpckdsb2JhbCBwTWFjICkKK3sKKyAgICB0U21lQ21kICpwUmV0Q21kID0gTlVMTCwgKnBUZW1wQ21kID0gTlVMTDsKKyAgICB0TGlzdEVsZW0gKnBFbnRyeTsKKworICAgIHBFbnRyeSA9IGNzckxMUmVtb3ZlSGVhZCggJnBNYWMtPnNtZS5zbWVDbWRGcmVlTGlzdCwgTExfQUNDRVNTX0xPQ0sgKTsKKworICAgIC8vIElmIHdlIGNhbiBnZXQgYW5vdGhlciBNUyBNc2cgYnVmZmVyLCB0aGVuIHdlIGFyZSBvay4gIEp1c3QgbGluaworICAgIC8vIHRoZSBlbnRyeSBvbnRvIHRoZSBsaW5rZWQgbGlzdC4gIChXZSBhcmUgdXNpbmcgdGhlIGxpbmtlZCBsaXN0CisgICAgLy8gdG8ga2VlcCB0cmFjayBvZiB0ZmhlIG1lc3NhZ2UgYnVmZmVycykuCisgICAgaWYgKCBwRW50cnkgKQorICAgIHsKKyAgICAgICAgcFJldENtZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50IGlkeCA9IDE7CisKKyAgICAgICAgLy9DYW5ub3QgY2hhbmdlIHBSZXRDbWQgaGVyZSBzaW5jZSBpdCBuZWVkcyB0byByZXR1cm4gbGF0ZXIuCisgICAgICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICAgICAgaWYoIHBFbnRyeSApCisgICAgICAgIHsKKyAgICAgICAgICAgcFRlbXBDbWQgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRTbWVDbWQsIExpbmsgKTsKKyAgICAgICAgfQorICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJPdXQgb2YgY29tbWFuZCBidWZmZXIuLi4uIGNvbW1hbmQgKDB4JVgpIHN0dWNrXG4iLCAKKyAgICAgICAgICAgKHBUZW1wQ21kKSA/IHBUZW1wQ21kLT5jb21tYW5kIDogZVNtZU5vQ29tbWFuZCApOworICAgICAgICBpZihwVGVtcENtZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGVTbWVDc3JDb21tYW5kTWFzayAmIHBUZW1wQ21kLT5jb21tYW5kICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0NTUiBjb21tYW5kIGlzIHN0dWNrLiBTZWUgd2hhdCB0aGUgcmVhc29uIGNvZGUgaXMgZm9yIHRoYXQgY29tbWFuZAorICAgICAgICAgICAgICAgIGR1bXBDc3JDb21tYW5kSW5mbyhwTWFjLCBwVGVtcENtZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy9pZihwVGVtcENtZCkKKworICAgICAgICAvL2R1bXAgd2hhdCBpcyBpbiB0aGUgcGVuZGluZyBxdWV1ZQorICAgICAgICBjc3JMTExvY2soJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCk7CisgICAgICAgIHBFbnRyeSA9IGNzckxMUGVla0hlYWQoICZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsIExMX0FDQ0VTU19OT0xPQ0sgKTsKKyAgICAgICAgd2hpbGUocEVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcENtZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiT3V0IG9mIGNvbW1hbmQgYnVmZmVyLi4uLiBTTUUgcGVuZGluZyBjb21tYW5kICMlZCAoMHglWClcbiIsCisgICAgICAgICAgICAgICAgICAgIGlkeCsrLCBwVGVtcENtZC0+Y29tbWFuZCApOworICAgICAgICAgICAgaWYoIGVTbWVDc3JDb21tYW5kTWFzayAmIHBUZW1wQ21kLT5jb21tYW5kICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0NTUiBjb21tYW5kIGlzIHN0dWNrLiBTZWUgd2hhdCB0aGUgcmVhc29uIGNvZGUgaXMgZm9yIHRoYXQgY29tbWFuZAorICAgICAgICAgICAgICAgIGR1bXBDc3JDb21tYW5kSW5mbyhwTWFjLCBwVGVtcENtZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRW50cnkgPSBjc3JMTE5leHQoICZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsIHBFbnRyeSwgTExfQUNDRVNTX05PTE9DSyApOworICAgICAgICB9CisgICAgICAgIGNzckxMVW5sb2NrKCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QpOworCisgICAgICAgIC8vVGhlcmUgbWF5IGJlIHNvbWUgbW9yZSBjb21tYW5kIGluIENTUidzIG93biBwZW5kaW5nIHF1ZXVlCisgICAgICAgIGNzckxMTG9jaygmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QpOworICAgICAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QsIExMX0FDQ0VTU19OT0xPQ0sgKTsKKyAgICAgICAgd2hpbGUocEVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcENtZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiT3V0IG9mIGNvbW1hbmQgYnVmZmVyLi4uLiBDU1IgcGVuZGluZyBjb21tYW5kICMlZCAoMHglWClcbiIsCisgICAgICAgICAgICAgICAgICAgIGlkeCsrLCBwVGVtcENtZC0+Y29tbWFuZCApOworICAgICAgICAgICAgZHVtcENzckNvbW1hbmRJbmZvKHBNYWMsIHBUZW1wQ21kKTsKKyAgICAgICAgICAgIHBFbnRyeSA9IGNzckxMTmV4dCggJnBNYWMtPnJvYW0ucm9hbUNtZFBlbmRpbmdMaXN0LCBwRW50cnksIExMX0FDQ0VTU19OT0xPQ0sgKTsKKyAgICAgICAgfQorICAgICAgICBjc3JMTFVubG9jaygmcE1hYy0+cm9hbS5yb2FtQ21kUGVuZGluZ0xpc3QpOworICAgIH0KKworICAgIHJldHVybiggcFJldENtZCApOworfQorCisKK3ZvaWQgc21lUHVzaENvbW1hbmQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDbWQsIHRBTklfQk9PTEVBTiBmSGlnaFByaW9yaXR5ICkKK3sKKyAgICBpZiAoIGZIaWdoUHJpb3JpdHkgKQorICAgIHsKKyAgICAgICAgY3NyTExJbnNlcnRIZWFkKCAmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCAmcENtZC0+TGluaywgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY3NyTExJbnNlcnRUYWlsKCAmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCAmcENtZC0+TGluaywgTExfQUNDRVNTX0xPQ0sgKTsKKyAgICB9CisKKyAgICAvLyBwcm9jZXNzIHRoZSBjb21tYW5kIHF1ZXVlLi4uCisgICAgc21lUHJvY2Vzc1BlbmRpbmdRdWV1ZSggcE1hYyApOworCisgICAgcmV0dXJuOworfQorCisKK3N0YXRpYyBlU21lQ29tbWFuZFR5cGUgc21lSXNGdWxsUG93ZXJOZWVkZWQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTbWVDbWQgKnBDb21tYW5kICkKK3sKKyAgICBlU21lQ29tbWFuZFR5cGUgcG1jQ29tbWFuZCA9IGVTbWVOb0NvbW1hbmQ7CisgICAgdEFOSV9CT09MRUFOIGZGdWxsUG93ZXJOZWVkZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgdFBtY1N0YXRlIHBtY1N0YXRlOworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHBtY1N0YXRlID0gcG1jR2V0UG1jU3RhdGUocE1hYyk7CisKKyAgICAgICAgc3RhdHVzID0gY3NySXNGdWxsUG93ZXJOZWVkZWQoIHBNYWMsIHBDb21tYW5kLCBOVUxMLCAmZkZ1bGxQb3dlck5lZWRlZCApOworICAgICAgICBpZiggIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9QTUMgc3RhdGUgaXMgbm90IHJpZ2h0IGZvciB0aGUgY29tbWFuZCwgZHJvcCBpdAorICAgICAgICAgICAgcmV0dXJuICggZVNtZURyb3BDb21tYW5kICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGZGdWxsUG93ZXJOZWVkZWQgICkgYnJlYWs7CisgICAgICAgIGZGdWxsUG93ZXJOZWVkZWQgPSAoICggZVNtZUNvbW1hbmRBZGRUcyA9PSBwQ29tbWFuZC0+Y29tbWFuZCApIHx8CisgICAgICAgICAgICAgICAgICAgICggZVNtZUNvbW1hbmREZWxUcyA9PSAgcENvbW1hbmQtPmNvbW1hbmQgKSApOworICAgICAgICBpZiggZkZ1bGxQb3dlck5lZWRlZCApIGJyZWFrOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgICAgZkZ1bGxQb3dlck5lZWRlZCA9IChwbWNTdGF0ZSA9PSBJTVBTICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTbWVDb21tYW5kUmVtYWluT25DaGFubmVsID09IHBDb21tYW5kLT5jb21tYW5kKTsKKyAgICAgICAgaWYoZkZ1bGxQb3dlck5lZWRlZCkgYnJlYWs7CisjZW5kaWYKKyAgICB9IHdoaWxlKDApOworCisgICAgaWYoIGZGdWxsUG93ZXJOZWVkZWQgKQorICAgIHsKKyAgICAgICAgc3dpdGNoKCBwbWNTdGF0ZSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBJTVBTOgorICAgICAgICBjYXNlIFNUQU5EQlk6CisgICAgICAgICAgICBwbWNDb21tYW5kID0gZVNtZUNvbW1hbmRFeGl0SW1wczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQk1QUzoKKyAgICAgICAgICAgIHBtY0NvbW1hbmQgPSBlU21lQ29tbWFuZEV4aXRCbXBzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBVQVBTRDoKKyAgICAgICAgICAgIHBtY0NvbW1hbmQgPSBlU21lQ29tbWFuZEV4aXRVYXBzZDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV09XTDoKKyAgICAgICAgICAgIHBtY0NvbW1hbmQgPSBlU21lQ29tbWFuZEV4aXRXb3dsOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICggcG1jQ29tbWFuZCApOworfQorCisKKy8vRm9yIGNvbW1hbmRzIHRoYXQgbmVlZCB0byBkbyBleHRyYSBjbGVhbnVwLgorc3RhdGljIHZvaWQgc21lQWJvcnRDb21tYW5kKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0U21lQ21kICpwQ29tbWFuZCwgdEFOSV9CT09MRUFOIGZTdG9wcGluZyApCit7CisgICAgaWYoIGVTbWVQbWNDb21tYW5kTWFzayAmIHBDb21tYW5kLT5jb21tYW5kICkKKyAgICB7CisgICAgICAgIHBtY0Fib3J0Q29tbWFuZCggcE1hYywgcENvbW1hbmQsIGZTdG9wcGluZyApOworICAgIH0KKyAgICBlbHNlIGlmICggZVNtZUNzckNvbW1hbmRNYXNrICYgcENvbW1hbmQtPmNvbW1hbmQgKQorICAgIHsKKyAgICAgICAgY3NyQWJvcnRDb21tYW5kKCBwTWFjLCBwQ29tbWFuZCwgZlN0b3BwaW5nICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRjaCggcENvbW1hbmQtPmNvbW1hbmQgKQorICAgICAgICB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZFJlbWFpbk9uQ2hhbm5lbDoKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBwQ29tbWFuZC0+dS5yZW1haW5DaGxDbWQuY2FsbGJhY2spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZW1haW5PbkNoYW5DYWxsYmFjayBjYWxsYmFjayA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZC0+dS5yZW1haW5DaGxDbWQuY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhlIG1zZyAqLworICAgICAgICAgICAgICAgICAgICBpZiggY2FsbGJhY2sgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhwTWFjLCBwQ29tbWFuZC0+dS5yZW1haW5DaGxDbWQuY2FsbGJhY2tDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ1NSX1NDQU5fQUJPUlQgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbWVSZWxlYXNlQ29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzbWVSZWxlYXNlQ29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKK3RBTklfQk9PTEVBTiBzbWVQcm9jZXNzQ29tbWFuZCggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgICAgdEFOSV9CT09MRUFOIGZDb250aW51ZSA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdExpc3RFbGVtICpwRW50cnk7CisgICAgdFNtZUNtZCAqcENvbW1hbmQ7CisgICAgZVNtZUNvbW1hbmRUeXBlIHBtY0NvbW1hbmQgPSBlU21lTm9Db21tYW5kOworCisgICAgLy8gaWYgdGhlIEFjdGl2ZUxpc3QgaXMgZW1wdHksIHRoZW4gbm90aGluZyBpcyBhY3RpdmUgc28gd2UgY2FuIHByb2Nlc3MgYQorICAgIC8vIHBlbmRpbmcgY29tbWFuZC4uLgorICAgIC8vYWx3YXN5IGxvY2sgYWN0aXZlIGxpc3QgYmVmb3JlIGxvY2tpbmcgcGVuZGluZyBsaXN0CisgICAgY3NyTExMb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKyAgICBpZiAoIGNzckxMSXNMaXN0RW1wdHkoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX05PTE9DSyApICkKKyAgICB7CisgICAgICAgIGlmKCFjc3JMTElzTGlzdEVtcHR5KCZwTWFjLT5zbWUuc21lQ21kUGVuZGluZ0xpc3QsIExMX0FDQ0VTU19MT0NLKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9QZWVrIHRoZSBjb21tYW5kCisgICAgICAgICAgICBwRW50cnkgPSBjc3JMTFBlZWtIZWFkKCAmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBMTF9BQ0NFU1NfTE9DSyApOworICAgICAgICAgICAgaWYoIHBFbnRyeSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbW1hbmQgPSBHRVRfQkFTRV9BRERSKCBwRW50cnksIHRTbWVDbWQsIExpbmsgKTsKKyAgICAgICAgICAgICAgICAvL1dlIGNhbm5vdCBleGVjdXRlIGFueSBjb21tYW5kIGluIHdhaXQtZm9yLWtleSBzdGF0ZSB1bnRpbCBzZXRLZXkgaXMgdGhyb3VnaC4KKyAgICAgICAgICAgICAgICBpZiggQ1NSX0lTX1dBSVRfRk9SX0tFWSggcE1hYywgcENvbW1hbmQtPnNlc3Npb25JZCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhQ1NSX0lTX1NFVF9LRVlfQ09NTUFORCggcENvbW1hbmQgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzckxMVW5sb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiICBDYW5ub3QgcHJvY2VzcyBjb21tYW5kKCVkKSB3aGlsZSB3YWl0aW5nIGZvciBrZXlcbiIsIHBDb21tYW5kLT5jb21tYW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoIGVBTklfQk9PTEVBTl9GQUxTRSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBtY0NvbW1hbmQgPSBzbWVJc0Z1bGxQb3dlck5lZWRlZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICBpZiggZVNtZURyb3BDb21tYW5kID09IHBtY0NvbW1hbmQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9UaGlzIGNvbW1hbmQgaXMgbm90IG9rIGZvciBjdXJyZW50IFBNQyBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBpZiggY3NyTExSZW1vdmVFbnRyeSggJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwgcEVudHJ5LCBMTF9BQ0NFU1NfTE9DSyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc21lQWJvcnRDb21tYW5kKCBwTWFjLCBwQ29tbWFuZCwgZUFOSV9CT09MRUFOX0ZBTFNFICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY3NyTExVbmxvY2soICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCApOworICAgICAgICAgICAgICAgICAgICAvL3RlbGwgY2FsbGVyIHRvIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUFOSV9CT09MRUFOX1RSVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBlU21lTm9Db21tYW5kICE9IHBtY0NvbW1hbmQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdEV4aXRCbXBzSW5mbyBleGl0Qm1wc0luZm87CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRTbWVDbWQgKnBQbWNDbWQgPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBlU21lQ29tbWFuZEV4aXRCbXBzID09IHBtY0NvbW1hbmQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0Qm1wc0luZm8uZXhpdEJtcHNSZWFzb24gPSBlU01FX1JFQVNPTl9PVEhFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2ID0gKHZvaWQgKikmZXhpdEJtcHNJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemVvZih0RXhpdEJtcHNJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvL3BtY0NvbW1hbmQgaGFzIHRvIGJlIG9uZSBvZiB0aGUgZXhpdCBwb3dlciBzYXZlIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcG1jUHJlcGFyZUNvbW1hbmQoIHBNYWMsIHBtY0NvbW1hbmQsIHB2LCBzaXplLCAmcFBtY0NtZCApOworICAgICAgICAgICAgICAgICAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSAmJiBwUG1jQ21kICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9Gb3JjZSB0aGlzIGNvbW1hbmQgdG8gd2FrZSB1cCB0aGUgY2hpcAorICAgICAgICAgICAgICAgICAgICAgICAgY3NyTExJbnNlcnRIZWFkKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsICZwUG1jQ21kLT5MaW5rLCBMTF9BQ0NFU1NfTk9MT0NLICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3JMTFVubG9jayggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGludWUgPSBwbWNQcm9jZXNzQ29tbWFuZCggcE1hYywgcFBtY0NtZCApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZDb250aW51ZSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGUgY29tbWFuZCBmYWlsZWQsIHJlbW92ZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsICZwUG1jQ21kLT5MaW5rLCBMTF9BQ0NFU1NfTk9MT0NLICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1jUmVsZWFzZUNvbW1hbmQoIHBNYWMsIHBQbWNDbWQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3JMTFVubG9jayggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCAgIkNhbm5vdCBpc3N1ZSBjb21tYW5kKDB4JVgpIHRvIHdha2UgdXAgdGhlIGNoaXAuIFN0YXR1cyA9ICVkXG4iKSwgcG1jQ29tbWFuZCwgc3RhdHVzICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0xldCBpdCByZXRyeQorICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRpbnVlID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZDb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCBwRW50cnksIExMX0FDQ0VTU19MT0NLICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJldXNlIHRoZSBwQ29tbWFuZAorCisgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgY29tbWFuZCBvbnRvIHRoZSBBY3RpdmVMaXN0Li4uCisgICAgICAgICAgICAgICAgICAgIGNzckxMSW5zZXJ0SGVhZCggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCAmcENvbW1hbmQtPkxpbmssIExMX0FDQ0VTU19OT0xPQ0sgKTsKKworICAgICAgICAgICAgICAgICAgICAvLyAuLi4uIGFuZCBwcm9jZXNzIHRoZSBjb21tYW5kLgorCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIHBDb21tYW5kLT5jb21tYW5kICkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTbWVDb21tYW5kU2NhbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JMTFVubG9jayggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUHJvY2Vzc1NjYW5Db21tYW5kKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTbWVDb21tYW5kUm9hbToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JMTFVubG9jayggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzICA9IGNzclJvYW1Qcm9jZXNzQ29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZFdtU3RhdHVzQ2hhbmdlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzckxMVW5sb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtUHJvY2Vzc1dtU3RhdHVzQ2hhbmdlQ29tbWFuZChwTWFjLCBwQ29tbWFuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRTZXRLZXk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTExVbmxvY2soICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Qcm9jZXNzU2V0S2V5Q29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3NyTExSZW1vdmVFbnRyeSggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb21tYW5kLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRTZXRLZXkoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRSZW1vdmVLZXk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTExVbmxvY2soICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Qcm9jZXNzUmVtb3ZlS2V5Q29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3NyTExSZW1vdmVFbnRyeSggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb21tYW5kLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyUmVsZWFzZUNvbW1hbmRSZW1vdmVLZXkoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRBZGRTdGFTZXNzaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzckxMVW5sb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JQcm9jZXNzQWRkU3RhU2Vzc2lvbkNvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTbWVDb21tYW5kRGVsU3RhU2Vzc2lvbjogICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTExVbmxvY2soICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzclByb2Nlc3NEZWxTdGFTZXNzaW9uQ29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZFJlbWFpbk9uQ2hhbm5lbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JMTFVubG9jaygmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAycFByb2Nlc3NSZW1haW5PbkNoYW5uZWxDbWQocE1hYywgcENvbW1hbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZE5vQVVwZGF0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JMTFVubG9jayggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJwUHJvY2Vzc05vQVJlcShwTWFjLHBDb21tYW5kKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZEVudGVySW1wczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFeGl0SW1wczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFbnRlckJtcHM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTbWVDb21tYW5kRXhpdEJtcHM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTbWVDb21tYW5kRW50ZXJVYXBzZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVNtZUNvbW1hbmRFeGl0VWFwc2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTbWVDb21tYW5kRW50ZXJXb3dsOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZEV4aXRXb3dsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzckxMVW5sb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGludWUgPSBwbWNQcm9jZXNzQ29tbWFuZCggcE1hYywgcENvbW1hbmQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZkNvbnRpbnVlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhlIGNvbW1hbmQgZmFpbGVkLCByZW1vdmUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNzckxMUmVtb3ZlRW50cnkoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb21tYW5kLT5MaW5rLCBMTF9BQ0NFU1NfTE9DSyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1jUmVsZWFzZUNvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVHJlYXQgc3RhbmRieSBkaWZmZXJlbnRseSBoZXJlIGJlY2F1c2UgY2FsbGVyIG1heSBub3QgYmUgYWJsZSB0byBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlIGZhaWx1cmUgc28gd2UgZG8gb3VyIGJlc3QgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZEVudGVyU3RhbmRieToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3NySXNDb25uU3RhdGVEaXNjb25uZWN0ZWQoIHBNYWMsIHBDb21tYW5kLT5zZXNzaW9uSWQgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0l0IGNhbiBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JMTFVubG9jayggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250aW51ZSA9IHBtY1Byb2Nlc3NDb21tYW5kKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZkNvbnRpbnVlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGUgY29tbWFuZCBmYWlsZWQsIHJlbW92ZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNzckxMUmVtb3ZlRW50cnkoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29tbWFuZC0+TGluaywgTExfQUNDRVNTX0xPQ0sgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1jUmVsZWFzZUNvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9OZWVkIHRvIGlzc3VlIGEgZGlzY29ubmVjdCBmaXJzdCBiZWZvcmUgcHJvY2Vzc2luZyB0aGlzIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNtZUNtZCAqcE5ld0NtZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1dlIG5lZWQgdG8gcmUtcnVuIHRoZSBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250aW51ZSA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1B1bGwgb2ZmIHRoZSBzdGFuZGJ5IGNvbW1hbmQgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNzckxMUmVtb3ZlRW50cnkoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29tbWFuZC0+TGluaywgTExfQUNDRVNTX05PTE9DSyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTExVbmxvY2soICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9OZWVkIHRvIGNhbGwgQ1NSIGZ1bmN0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZGlzY29ubmVjdCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIGhhbmRsZWQgYnkgQ1NSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV3Q21kID0gY3NyR2V0Q29tbWFuZEJ1ZmZlciggcE1hYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE5VTEwgIT0gcE5ld0NtZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QdXQgdGhlIHN0YW5kYnkgY29tbWFuZCB0byB0aGUgaGVhZCBvZiB0aGUgcGVuZGluZyBsaXN0IGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTExJbnNlcnRIZWFkKCAmcE1hYy0+c21lLnNtZUNtZFBlbmRpbmdMaXN0LCAmcENvbW1hbmQtPkxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FDQ0VTU19MT0NLICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5ld0NtZC0+Y29tbWFuZCA9IGVTbWVDb21tYW5kUm9hbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV3Q21kLT51LnJvYW1DbWQucm9hbVJlYXNvbiA9IGVDc3JGb3JjZWREaXNhc3NvYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1B1dCB0aGUgZGlzYXNzb2MgY29tbWFuZCBiZWZvcmUgdGhlIHN0YW5kYnkgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzckxMSW5zZXJ0SGVhZCggJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwgJnBOZXdDbWQtPkxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FDQ0VTU19MT0NLICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Db250aW51ZSB0aGUgY29tbWFuZCBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRpbnVlID0gcG1jUHJvY2Vzc0NvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZDb250aW51ZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoZSBjb21tYW5kIGZhaWxlZCwgcmVtb3ZlIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29tbWFuZC0+TGluaywgTExfQUNDRVNTX0xPQ0sgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtY1JlbGVhc2VDb21tYW5kKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyTExVbmxvY2soICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIGZhaWxlZCB0byByZW1vdmUgc3RhbmRieSBjb21tYW5kXG4iKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZEFkZFRzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU21lQ29tbWFuZERlbFRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzckxMVW5sb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRpbnVlID0gcW9zUHJvY2Vzc0NvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZDb250aW51ZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoZSBjb21tYW5kIGZhaWxlZCwgcmVtb3ZlIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjc3JMTFJlbW92ZUVudHJ5KCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29tbWFuZC0+TGluaywgTExfQUNDRVNTX05PTE9DSyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworLy8jaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW9zUmVsZWFzZUNvbW1hbmQoIHBNYWMsIHBDb21tYW5kICk7CisvLyNlbmRpZiAvKiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zb21ldGhpbmcgaXMgd3JvbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JlbW92ZSBpdCBmcm9tIHRoZSBhY3RpdmUgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiIGNzclByb2Nlc3NDb21tYW5kIHByb2Nlc3NlcyBhbiB1bmtub3duIGNvbW1hbmQgJWRcbiIsIHBDb21tYW5kLT5jb21tYW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW50cnkgPSBjc3JMTFJlbW92ZUhlYWQoICZwTWFjLT5zbWUuc21lQ21kQWN0aXZlTGlzdCwgTExfQUNDRVNTX05PTE9DSyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzckxMVW5sb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tbWFuZCA9IEdFVF9CQVNFX0FERFIoIHBFbnRyeSwgdFNtZUNtZCwgTGluayApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZVJlbGVhc2VDb21tYW5kKCBwTWFjLCBwQ29tbWFuZCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGludWUgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vL2lmKHBFbnRyeSkKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1RoaXMgaXMgb2RkLiBTb21lIG9uZSBlbHNlIHB1bGwgb2ZmIHRoZSBjb21tYW5kLgorICAgICAgICAgICAgICAgICAgICBjc3JMTFVubG9jayggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNzckxMVW5sb2NrKCAmcE1hYy0+c21lLnNtZUNtZEFjdGl2ZUxpc3QgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vTm8gY29tbWFuZCB3YWl0aW5nCisgICAgICAgICAgICBjc3JMTFVubG9jayggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0ICk7CisgICAgICAgICAgICAvL1RoaXMgaXMgb25seSB1c2VkIHRvIHJlc3RhcnQgYW4gaWRsZSBtb2RlIHNjYW4sIGl0IG1lYW5zIGF0IGxlYXN0IG9uZSBvdGhlciBpZGxlIHNjYW4gaGFzIGZpbmlzaGVkLgorICAgICAgICAgICAgaWYocE1hYy0+c2Nhbi5mUmVzdGFydElkbGVTY2FuICYmIGVBTklfQk9PTEVBTl9GQUxTRSA9PSBwTWFjLT5zY2FuLmZDYW5jZWxJZGxlU2NhbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0QU5JX1UzMiBuVGltZSA9IDA7CisKKyAgICAgICAgICAgICAgICBwTWFjLT5zY2FuLmZSZXN0YXJ0SWRsZVNjYW4gPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgICAgICAgICAgaWYoIUhBTF9TVEFUVVNfU1VDQ0VTUyhjc3JTY2FuVHJpZ2dlcklkbGVTY2FuKHBNYWMsICZuVGltZSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NyU2NhblN0YXJ0SWRsZVNjYW5UaW1lcihwTWFjLCBuVGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjc3JMTFVubG9jayggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0ICk7CisgICAgfQorCisgICAgcmV0dXJuICggZkNvbnRpbnVlICk7Cit9CisKK3ZvaWQgc21lUHJvY2Vzc1BlbmRpbmdRdWV1ZSggdHBBbmlTaXJHbG9iYWwgcE1hYyApCit7CisgICAgd2hpbGUoIHNtZVByb2Nlc3NDb21tYW5kKCBwTWFjICkgKTsKK30KKworCit0QU5JX0JPT0xFQU4gc21lQ29tbWFuZFBlbmRpbmcodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICByZXR1cm4gKCAhY3NyTExJc0xpc3RFbXB0eSggJnBNYWMtPnNtZS5zbWVDbWRBY3RpdmVMaXN0LCBMTF9BQ0NFU1NfTk9MT0NLICkgfHwKKyAgICAgICAgIWNzckxMSXNMaXN0RW1wdHkoJnBNYWMtPnNtZS5zbWVDbWRQZW5kaW5nTGlzdCwgTExfQUNDRVNTX05PTE9DSykgKTsKK30KKworCisKKy8vR2xvYmFsIEFQSXMKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzbWVfT3BlbigpIC0gSW5pdGlhbHplIGFsbCBTTUUgbW9kdWxlcyBhbmQgcHV0IHRoZW0gYXQgaWRsZSBzdGF0ZQorCisgIFRoZSBmdW5jdGlvbiBpbml0aWFsaXplcyBlYWNoIG1vZHVsZSBpbnNpZGUgU01FLCBQTUMsIENDTSwgQ1NSLCBldGMuIC4gVXBvbgorICBzdWNjZXNzZnVsbHkgcmV0dXJuLCBhbGwgbW9kdWxlcyBhcmUgYXQgaWRsZSBzdGF0ZSByZWFkeSB0byBzdGFydC4KKworICBzbWVPcGVuIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgU01FIEFQSXMgY2FuIGJlIGludm9sdmVkLgorICBzbWVPcGVuIG11c3QgYmUgY2FsbGVkIGFmdGVyIG1hY09wZW4uCisgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbAorICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgaXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLgorCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfT3Blbih0SGFsSGFuZGxlIGhIYWwpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgZG8geworICAgICAgcE1hYy0+c21lLnN0YXRlID0gU01FX1NUQVRFX1NUT1A7CisgICAgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zX2xvY2tfaW5pdCggJnBNYWMtPnNtZS5sa1NtZUdsb2JhbExvY2sgKSApICkKKyAgICAgIHsKKyAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJzbWVfT3BlbiBmYWlsZWQgaW5pdCBsb2NrXG4iICk7CisgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3RhdHVzID0gY2NtT3BlbihoSGFsKTsKKyAgICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAiY2NtT3BlbiBmYWlsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHdpdGggc3RhdHVzPSVkIiwgc3RhdHVzICk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3RhdHVzID0gY3NyT3BlbihwTWFjKTsKKyAgICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAiY3NyT3BlbiBmYWlsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHdpdGggc3RhdHVzPSVkIiwgc3RhdHVzICk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3RhdHVzID0gcG1jT3BlbihoSGFsKTsKKyAgICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAicG1jT3BlbiBmYWlsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHdpdGggc3RhdHVzPSVkIiwgc3RhdHVzICk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgICAgIHN0YXR1cyA9IHNtZV9Rb3NPcGVuKHBNYWMpOworICAgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICJRb3Mgb3BlbiBmYWlsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHdpdGggc3RhdHVzPSVkIiwgc3RhdHVzICk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3RhdHVzID0gYnRjT3BlbihwTWFjKTsKKyAgICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAgICAiYnRjT3BlbiBvcGVuIGZhaWxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gd2l0aCBzdGF0dXM9JWQiLCBzdGF0dXMgKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1MoKHN0YXR1cyA9IGluaXRTbWVDbWRMaXN0KHBNYWMpKSkpCisgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICB7CisgICAgICAgICB2X1BWT0lEX3QgcHZvc0dDdHggPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU0FQLCBOVUxMKTsKKyAgICAgICAgIGlmICggTlVMTCA9PSBwdm9zR0N0eCApeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiV0xBTlNBUF9PcGVuIG9wZW4gZmFpbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiIpOworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBzdGF0dXMgPSBXTEFOU0FQX09wZW4oIHB2b3NHQ3R4ICk7CisgICAgICAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApIHsKKyAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICAgICAiV0xBTlNBUF9PcGVuIG9wZW4gZmFpbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiB3aXRoIHN0YXR1cz0lZCIsIHN0YXR1cyApOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgICBzdGF0dXMgPSBycm1PcGVuKHBNYWMpOworICAgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICJycm1PcGVuIG9wZW4gZmFpbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiB3aXRoIHN0YXR1cz0lZCIsIHN0YXR1cyApOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgIHNtZV9GVE9wZW4ocE1hYyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9QMlAKKyAgICAgIHNtZV9wMnBPcGVuKHBNYWMpOworI2VuZGlmCisKKyAgIH13aGlsZSAoMCk7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHNtZV9zZXQxMWRpbmZvKCkgLSBTZXQgdGhlIDExZCBpbmZvcm1hdGlvbiBhYm91dCB2YWxpZCBjaGFubmVscworICAgYW5kIHRoZXJlIHBvd2VyIHVzaW5nIGluZm9ybWF0aW9uIGZyb20gbnZSQU0KKyAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgZm9yIEFQLgorCisgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbAorCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICBcUGFyYW0gcFNtZUNvbmZpZ1BhcmFtcyAtIGEgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mCisgIHR5cGVkZWYgc3RydWN0IF9zbWVDb25maWdQYXJhbXMuCisKKyAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIC0gU01FIHVwZGF0ZSB0aGUgY29uZmlnIHBhcmFtZXRlcnMgc3VjY2Vzc2Z1bGx5LgorCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gdXBkYXRlIHRoZSBjb25maWcgcGFyYW1ldGVycy4KKyAgXHNhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2VIYWxTdGF0dXMgc21lX3NldDExZGluZm8odEhhbEhhbmRsZSBoSGFsLCAgdHBTbWVDb25maWdQYXJhbXMgcFNtZUNvbmZpZ1BhcmFtcykKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBpZiAoTlVMTCA9PSBwU21lQ29uZmlnUGFyYW1zICkgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLAorICAgICAgICAgICAgICAiRW1wdHkgY29uZmlnIHBhcmFtIHN0cnVjdHVyZSBmb3IgU01FLCBub3RoaW5nIHRvIHVwZGF0ZSIpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgc3RhdHVzID0gY3NyU2V0Q2hhbm5lbHMoaEhhbCwgJnBTbWVDb25maWdQYXJhbXMtPmNzckNvbmZpZyApOworICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJjc3JDaGFuZ2VEZWZhdWx0Q29uZmlnUGFyYW0gZmFpbGVkIHdpdGggc3RhdHVzPSVkXG4iLAorICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHNtZV9nZXRTb2Z0QXBEb21haW4oKSAtIEdldCB0aGUgY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbiBvZiBzb2Z0QXAuCisKKyAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IEhvc3RhcGRBZGFwdGVyLgorICBcUGFyYW0gdl9SRUdET01BSU5fdCAtIFRoZSBjdXJyZW50IFJlZ3VsYXRvcnkgRG9tYWluIHJlcXVlc3RlZCBmb3IgU29mdEFwLgorCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFNNRSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoZSByZXF1ZXN0LgorCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zLCBmYWlsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorICBcc2EKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZUhhbFN0YXR1cyBzbWVfZ2V0U29mdEFwRG9tYWluKHRIYWxIYW5kbGUgaEhhbCwgIHZfUkVHRE9NQUlOX3QgKmRvbWFpbklkU29mdEFwKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIGlmIChOVUxMID09IGRvbWFpbklkU29mdEFwICkgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiVW5pbml0aWFsaXplZCBkb21haW4gSWQiKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9ICAgIAorCisgICAqZG9tYWluSWRTb2Z0QXAgPSBwTWFjLT5zY2FuLmRvbWFpbklkQ3VycmVudDsKKyAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgCisgICByZXR1cm4gc3RhdHVzOworfQorCisKK2VIYWxTdGF0dXMgc21lX3NldFJlZ0luZm8odEhhbEhhbmRsZSBoSGFsLCAgdEFOSV9VOCAqYXBDbnRyeUNvZGUpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgaWYgKE5VTEwgPT0gYXBDbnRyeUNvZGUgKSB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJFbXB0eSBDb3VudHJ5IENvZGUsIG5vdGhpbmcgdG8gdXBkYXRlIik7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBzdGF0dXMgPSBjc3JTZXRSZWdJbmZvKGhIYWwsIGFwQ250cnlDb2RlICk7CisgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApIHsKKyAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgImNzclNldFJlZ0luZm8gZmFpbGVkIHdpdGggc3RhdHVzPSVkXG4iLAorICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgc21lX1VwZGF0ZUNoYW5uZWxDb25maWcoKSAtIFVwZGF0ZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW4gUklWQS4KKyAKKyAgSXQgaXMgdXNlZCBhdCBkcml2ZXIgc3RhcnQgdXAgdG8gaW5mb3JtIFJJVkEgb2YgdGhlIGRlZmF1bHQgY2hhbm5lbCAKKyAgY29uZmlndXJhdGlvbi4gCisKKyAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIAorICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIHRoZSBjaGFubmVsIGNvbmZpZyBzdWNjZXNzZnVsbHkuCisKKyAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgdGhlIGNoYW5uZWwgY29uZmlnLgorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9VcGRhdGVDaGFubmVsQ29uZmlnKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgcG1jVXBkYXRlU2NhblBhcmFtcyggcE1hYywgJihwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtKSwgCisgICAgICAgICAgICAgICAgICAgICAgJnBNYWMtPnNjYW4uYmFzZTIwTUh6Q2hhbm5lbHMsIEZBTFNFKTsKKyAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX1NDQU5fUE5MTworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHNtZV9VcGRhdGVDb25maWcoKSAtIENoYW5nZSBjb25maWd1cmF0aW9ucyBmb3IgYWxsIFNNRSBtb2R1ZWxzCisKKyAgVGhlIGZ1bmN0aW9uIHVwZGF0ZXMgc29tZSBjb25maWd1cmF0aW9uIGZvciBtb2R1bGVzIGluIFNNRSwgQ0NNLCBDU1IsIGV0YworICBkdXJpbmcgU01FcyBjbG9zZSBvcGVuIHNlcXVlbmNlLgorCisgIE1vZHVsZXMgaW5zaWRlIFNNRSBhcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gYXQgdGhlIG5leHQgdHJhbnNhY3Rpb24uCisKKyAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIFxQYXJhbSBwU21lQ29uZmlnUGFyYW1zIC0gYSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YKKyAgdHlwZWRlZiBzdHJ1Y3QgX3NtZUNvbmZpZ1BhcmFtcy4KKworICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgdXBkYXRlIHRoZSBjb25maWcgcGFyYW1ldGVycyBzdWNjZXNzZnVsbHkuCisKKyAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byB1cGRhdGUgdGhlIGNvbmZpZyBwYXJhbWV0ZXJzLgorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9VcGRhdGVDb25maWcodEhhbEhhbmRsZSBoSGFsLCB0cFNtZUNvbmZpZ1BhcmFtcyBwU21lQ29uZmlnUGFyYW1zKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIGlmIChOVUxMID09IHBTbWVDb25maWdQYXJhbXMgKSB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICJFbXB0eSBjb25maWcgcGFyYW0gc3RydWN0dXJlIGZvciBTTUUsIG5vdGhpbmcgdG8gdXBkYXRlIik7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBzdGF0dXMgPSBjc3JDaGFuZ2VEZWZhdWx0Q29uZmlnUGFyYW0ocE1hYywgJnBTbWVDb25maWdQYXJhbXMtPmNzckNvbmZpZyk7CisKKyAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiY3NyQ2hhbmdlRGVmYXVsdENvbmZpZ1BhcmFtIGZhaWxlZCB3aXRoIHN0YXR1cz0lZFxuIiwKKyAgICAgICAgICAgICAgc3RhdHVzICk7CisgICB9CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisgICBzdGF0dXMgPSBwMnBDaGFuZ2VEZWZhdWx0Q29uZmlnUGFyYW0ocE1hYywgJnBTbWVDb25maWdQYXJhbXMtPnAycENvbmZpZyk7CisKKyAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAicDJwQ2hhbmdlRGVmYXVsdENvbmZpZ1BhcmFtIGZhaWxlZCB3aXRoIHN0YXR1cz0lZFxuIiwKKyAgICAgICAgICAgICAgc3RhdHVzICk7CisgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgIHN0YXR1cyA9IHJybUNoYW5nZURlZmF1bHRDb25maWdQYXJhbShoSGFsLCAmcFNtZUNvbmZpZ1BhcmFtcy0+cnJtQ29uZmlnKTsKKworICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJycm1DaGFuZ2VEZWZhdWx0Q29uZmlnUGFyYW0gZmFpbGVkIHdpdGggc3RhdHVzPSVkXG4iLAorICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgIH0KKyNlbmRpZgorICAgLy9Gb3IgU09DLCBDRkcgaXMgc2V0IGJlZm9yZSBzdGFydAorICAgLy9XZSBkb24ndCB3YW50IHRvIGFwcGx5IGdsb2JhbCBDRkcgaW4gY29ubmVjdCBzdGF0ZSBiZWNhdXNlIHRoYXQgbWF5IGNhdXNlIHNvbWUgc2lkZSBhZmZlY3QKKyAgIGlmKAorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICAgIC8vRm9yIHRoZSBuZXcgaW5pdCBzZXF1ZW5jZSwgQ0ZHcyBuZWVkIHRvIGFwcGx5IGJlZm9yZSB2b3Nfc3RhcnQgaXMgY2FsbAorICAgICAgLy9ObyBuZWVkIHRvIHdhaXQgZm9yIHJlYWR5IHN0YXRlLgorICAgICAgU01FX0lTX1JFQURZKHBNYWMpICYmIAorI2VuZGlmCisgICAgICBjc3JJc0FsbFNlc3Npb25EaXNjb25uZWN0ZWQoIHBNYWMpICkKKyAgIHsKKyAgICAgICBjc3JTZXRHbG9iYWxDZmdzKHBNYWMpOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0NoYW5nZUNvbmZpZ1BhcmFtcworICAgIFxicmllZiBUaGUgU01FIEFQSSBleHBvc2VkIGZvciBIREQgdG8gcHJvdmlkZSBjb25maWcgcGFyYW1zIHRvIFNNRSBkdXJpbmcKKyAgICBTTUVzIHN0b3AgLT4gc3RhcnQgc2VxdWVuY2UuCisKKyAgICBJZiBIREQgY2hhbmdlZCB0aGUgZG9tYWluIHRoYXQgd2lsbCBjYXVzZSBhIHJlc2V0LiBUaGlzIGZ1bmN0aW9uIHdpbGwKKyAgICBwcm92aWRlIHRoZSBuZXcgc2V0IG9mIDExZCBpbmZvcm1hdGlvbiBmb3IgdGhlIG5ldyBkb21haW4uIEN1cnJyZW50bHkgdGhpcworICAgIEFQSSBwcm92aWRlcyBpbmZvIHJlZ2FyZGluZyAxMWQgb25seSBhdCByZXNldCBidXQgd2UgY2FuIGV4dGVuZCB0aGlzIGZvcgorICAgIG90aGVyIHBhcmFtcyAoUE1DLCBRb1MpIHdoaWNoIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGFnYWluIGF0IHJlc2V0LgorCisgICAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisKKyAgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICAgIFxQYXJhbQorICAgIHBVcGRhdGVDb25maWdQYXJhbSAtIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSAodENzclVwZGF0ZUNvbmZpZ1BhcmFtKSB0aGF0CisgICAgICAgICAgICAgICAgY3VycmVudGx5IHByb3ZpZGVzIDExZCByZWxhdGVkIGluZm9ybWF0aW9uIGxpa2UgQ291bnRyeSBjb2RlLAorICAgICAgICAgICAgICAgIFJlZ3VsYXRvcnkgZG9tYWluLCB2YWxpZCBjaGFubmVsIGxpc3QsIFR4IHBvd2VyIHBlciBjaGFubmVsLCBhCisgICAgICAgICAgICAgICAgbGlzdCB3aXRoIGFjdGl2ZS9wYXNzaXZlIHNjYW4gYWxsb3dlZCBwZXIgdmFsaWQgY2hhbm5lbC4KKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfQ2hhbmdlQ29uZmlnUGFyYW1zKHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JVcGRhdGVDb25maWdQYXJhbSAqcFVwZGF0ZUNvbmZpZ1BhcmFtKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIGlmIChOVUxMID09IHBVcGRhdGVDb25maWdQYXJhbSApIHsKKyAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwKKyAgICAgICAgICAgICAgIkVtcHR5IGNvbmZpZyBwYXJhbSBzdHJ1Y3R1cmUgZm9yIFNNRSwgbm90aGluZyB0byByZXNldFxuIik7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBzdGF0dXMgPSBjc3JDaGFuZ2VDb25maWdQYXJhbXMocE1hYywgcFVwZGF0ZUNvbmZpZ1BhcmFtKTsKKworICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJjc3JVcGRhdGVDb25maWdQYXJhbSBmYWlsZWQgd2l0aCBzdGF0dXM9JWRcbiIsCisgICAgICAgICAgICAgIHN0YXR1cyApOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgc21lX0hERFJlYWR5SW5kKCkgLSBTTUUgc2VuZHMgZVdOSV9TTUVfU1lTX1JFQURZX0lORCB0byBQRSB0byBpbmZvcm0KKyAgdGhhdCB0aGUgTklDIGlzIHJlYWR5IHRpbyBydW4uCisKKyAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBIREQgYXQgdGhlIGVuZCBvZiBpbml0aWFsaXphdGlvbiBzdGFnZSBzbyBQRS9IQUwgY2FuCisgIGVuYWJsZSB0aGUgTklDIHRvIHJ1bm5pbmcgc3RhdGUuCisKKyAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIGVXTklfU01FX1NZU19SRUFEWV9JTkQgaXMgc2VudCB0byBQRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkuCisKKyAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGZhaWxlZCB0byBzZW5kIHRoZSBtZXNzYWdlIHRvIFBFLgorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9IRERSZWFkeUluZCh0SGFsSGFuZGxlIGhIYWwpCit7CisgICB0U2lyU21lUmVhZHlSZXEgTXNnOworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdFBtY1Bvd2VyU3RhdGUgcG93ZXJTdGF0ZTsKKyAgIHRQbWNTd2l0Y2hTdGF0ZSBod1dsYW5Td2l0Y2hTdGF0ZTsKKyAgIHRQbWNTd2l0Y2hTdGF0ZSBzd1dsYW5Td2l0Y2hTdGF0ZTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBkbworICAgeworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICAgIGNzclNldEdsb2JhbENmZ3MoIHBNYWMgKTsKKyNlbmRpZgorCisgICAgICBNc2cubWVzc2FnZVR5cGUgPSBlV05JX1NNRV9TWVNfUkVBRFlfSU5EOworICAgICAgTXNnLmxlbmd0aCAgICAgID0gc2l6ZW9mKCB0U2lyU21lUmVhZHlSZXEgKTsKKworICAgICAgaWYgKGVTSVJfRkFJTFVSRSAhPSB1TWFjUG9zdEN0cmxNc2coIGhIYWwsICh0U2lyTWJNc2cqKSZNc2cgKSkKKyAgICAgIHsKKyAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsCisgICAgICAgICAgICAgICAgICJ1TWFjUG9zdEN0cmxNc2cgZmFpbGVkIHRvIHNlbmQgZVdOSV9TTUVfU1lTX1JFQURZX0lORCIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHN0YXR1cyA9IHBtY1F1ZXJ5UG93ZXJTdGF0ZSggaEhhbCwgJnBvd2VyU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZod1dsYW5Td2l0Y2hTdGF0ZSwgJnN3V2xhblN3aXRjaFN0YXRlICk7CisgICAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICB7CisgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJwbWNRdWVyeVBvd2VyU3RhdGUgZmFpbGVkIHdpdGggc3RhdHVzPSVkXG4iLAorICAgICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoIChlUE1DX1NXSVRDSF9PRkYgIT0gaHdXbGFuU3dpdGNoU3RhdGUpICYmCisgICAgICAgICAgIChlUE1DX1NXSVRDSF9PRkYgIT0gc3dXbGFuU3dpdGNoU3RhdGUpICkKKyAgICAgIHsKKyAgICAgICAgIHN0YXR1cyA9IGNzclJlYWR5KHBNYWMpOworICAgICAgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiY3NyUmVhZHkgZmFpbGVkIHdpdGggc3RhdHVzPSVkXG4iLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgc3RhdHVzID0gcG1jUmVhZHkoaEhhbCk7CisgICAgICAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgICB7CisgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAicG1jUmVhZHkgZmFpbGVkIHdpdGggc3RhdHVzPSVkXG4iLCBzdGF0dXMgKTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gYnRjUmVhZHkoaEhhbCkpCisgICAgICAgICB7CisgICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJidGNSZWFkeSBmYWlsZWRcbiIpOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAgICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBycm1SZWFkeShoSGFsKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgInJybVJlYWR5IGZhaWxlZFxuIik7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIHBNYWMtPnNtZS5zdGF0ZSA9IFNNRV9TVEFURV9SRUFEWTsKKyAgIH0gd2hpbGUoIDAgKTsKKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzbWVfU3RhcnQoKSAtIFB1dCBhbGwgU01FIG1vZHVsZXMgYXQgcmVhZHkgc3RhdGUuCisKKyAgVGhlIGZ1bmN0aW9uIHN0YXJ0cyBlYWNoIG1vZHVsZSBpbiBTTUUsIFBNQywgQ0NNLCBDU1IsIGV0Yy4gLiBVcG9uCisgIHN1Y2Nlc3NmdWxseSByZXR1cm4sIGFsbCBtb2R1bGVzIGFyZSByZWFkeSB0byBydW4uCisgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbAorICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgaXMgcmVhZHkuCisKKyAgICAgICAgICBPdGhlciBzdGF0dXMgbWVhbnMgU01FIGlzIGZhaWxlZCB0byBzdGFydAorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TdGFydCh0SGFsSGFuZGxlIGhIYWwpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgZG8KKyAgIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DIAorICAgICAgY2NtU3RhcnQoaEhhbCk7CisjZW5kaWYKKyAgICAgIHN0YXR1cyA9IGNzclN0YXJ0KHBNYWMpOworICAgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJjc3JTdGFydCBmYWlsZWQgZHVyaW5nIHNtZVN0YXJ0IHdpdGggc3RhdHVzPSVkXG4iLAorICAgICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBzdGF0dXMgPSBwbWNTdGFydChoSGFsKTsKKyAgICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAicG1jU3RhcnQgZmFpbGVkIGR1cmluZyBzbWVTdGFydCB3aXRoIHN0YXR1cz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgc3RhdHVzICk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgIHN0YXR1cyA9IFdMQU5TQVBfU3RhcnQodm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NBUCwgTlVMTCkpOworICAgICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJXTEFOU0FQX1N0YXJ0IGZhaWxlZCBkdXJpbmcgc21lU3RhcnQgd2l0aCBzdGF0dXM9JWRcbiIsCisgICAgICAgICAgICAgICAgIHN0YXR1cyApOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYKKyAgICAgIHBNYWMtPnNtZS5zdGF0ZSA9IFNNRV9TVEFURV9TVEFSVDsKKyAgIH13aGlsZSAoMCk7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIE5hbWU6IHNtZV9QQ0ZpbHRlck1hdGNoQ291bnRSZXNwb25zZUhhbmRsZXIKKyoKKyogRGVzY3JpcHRpb246CisqICAgIEludm9rZSBQYWNrZXQgQ29hbGVzY2luZyBGaWx0ZXIgTWF0Y2ggQ291bnQgY2FsbGJhY2sgcm91dGluZQorKgorKiBQYXJhbWV0ZXJzOgorKiAgICBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisqICAgIHBNc2cgLSBQb2ludGVyIHRvIHRSY3ZGbHRQa3RNYXRjaFJzcCBzdHJ1Y3R1cmUKKyoKKyogUmV0dXJuczogZUhhbFN0YXR1cworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBzbWVfUENGaWx0ZXJNYXRjaENvdW50UmVzcG9uc2VIYW5kbGVyKHRIYWxIYW5kbGUgaEhhbCwgdm9pZCogcE1zZykKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRwU2lyUmN2Rmx0UGt0TWF0Y2hSc3AgcFJjdkZsdFBrdE1hdGNoUnNwID0gKHRwU2lyUmN2Rmx0UGt0TWF0Y2hSc3ApcE1zZzsKKworICAgIGlmIChOVUxMID09IHBNc2cpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgImluICVzIG1zZyBwdHIgaXMgTlVMTFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc21zTG9nKHBNYWMsIExPRzIsICJTTUU6IGVudGVyaW5nICIKKyAgICAgICAgICAgICJzbWVfRmlsdGVyTWF0Y2hDb3VudFJlc3BvbnNlSGFuZGxlclxuIik7CisKKyAgICAgICAgLyogQ2FsbCBQYWNrZXQgQ29hbGVzY2luZyBGaWx0ZXIgTWF0Y2ggQ291bnQgY2FsbGJhY2sgcm91dGluZS4gKi8KKyAgICAgICAgaWYgKHBNYWMtPnBtYy5GaWx0ZXJNYXRjaENvdW50Q0IgIT0gTlVMTCkKKyAgICAgICAgICAgcE1hYy0+cG1jLkZpbHRlck1hdGNoQ291bnRDQihwTWFjLT5wbWMuRmlsdGVyTWF0Y2hDb3VudENCQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSY3ZGbHRQa3RNYXRjaFJzcCk7CisKKyAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsICIlczogc3RhdHVzPTB4JXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICBwUmN2Rmx0UGt0TWF0Y2hSc3AtPnN0YXR1cyk7CisKKyAgICAgICAgcE1hYy0+cG1jLkZpbHRlck1hdGNoQ291bnRDQiA9IE5VTEw7CisgICAgICAgIHBNYWMtPnBtYy5GaWx0ZXJNYXRjaENvdW50Q0JDb250ZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4oc3RhdHVzKTsKK30KKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgc21lX1Byb2Nlc3NNc2coKSAtIFRoZSBtYWluIG1lc3NhZ2UgcHJvY2Vzc29yIGZvciBTTUUuCisKKyAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhIG1lc3NhZ2UgZGlzcGF0Y2hlciB3aGVuIHRvIHByb2Nlc3MgYSBtZXNzYWdlCisgIHRhcmdldGVkIGZvciBTTUUuCisKKyAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICBccGFyYW0gcE1zZyAtIEEgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHRTaXJNc2dRLgorCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIFNNRSBzdWNjZXNzZnVsbHkgcHJvY2VzcyB0aGUgbWVzc2FnZS4KKworICAgICAgICAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgZmFpbGVkIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UgdG8gSEFMLgorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Qcm9jZXNzTXNnKHRIYWxIYW5kbGUgaEhhbCwgdm9zX21zZ190KiBwTXNnKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIGlmIChwTXNnID09IE5VTEwpIHsKKyAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkVtcHR5IG1lc3NhZ2UgZm9yIFNNRSwgbm90aGluZyB0byBwcm9jZXNzXG4iKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGlmKCBTTUVfSVNfU1RBUlQocE1hYykgKQorICAgICAgeworICAgICAgICAgIHN3aXRjaCAocE1zZy0+dHlwZSkgeyAvLyBUT0RPOiBXaWxsIGJlIG1vZGlmaWVkIHRvIGRvIGEgcmFuZ2UgY2hlY2sgZm9yIG1zZ3MgaW5zdGVhZCBvZiBoYXZpbmcgY2FzZXMgZm9yIGVhY2ggbXNncworICAgICAgICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfQk1QU19SU1A6CisgICAgICAgICAgY2FzZSBlV05JX1BNQ19FWElUX0JNUFNfUlNQOgorICAgICAgICAgIGNhc2UgZVdOSV9QTUNfRVhJVF9CTVBTX0lORDoKKyAgICAgICAgICBjYXNlIGVXTklfUE1DX0VOVEVSX0lNUFNfUlNQOgorICAgICAgICAgIGNhc2UgZVdOSV9QTUNfRVhJVF9JTVBTX1JTUDoKKyAgICAgICAgICBjYXNlIGVXTklfUE1DX1NNUFNfU1RBVEVfSU5EOgorICAgICAgICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfVUFQU0RfUlNQOgorICAgICAgICAgIGNhc2UgZVdOSV9QTUNfRVhJVF9VQVBTRF9SU1A6CisgICAgICAgICAgY2FzZSBlV05JX1BNQ19FTlRFUl9XT1dMX1JTUDoKKyAgICAgICAgICBjYXNlIGVXTklfUE1DX0VYSVRfV09XTF9SU1A6CisgICAgICAgICAgICAgLy9QTUMKKyAgICAgICAgICAgICBpZiAocE1zZy0+Ym9keXB0cikKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1jTWVzc2FnZVByb2Nlc3NvcihoSGFsLCBwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZSggcE1zZy0+Ym9keXB0ciApOworICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiRW1wdHkgcnNwIG1lc3NhZ2UgZm9yIFBNQywgbm90aGluZyB0byBwcm9jZXNzXG4iKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFdOSV9DRkdfU0VUX0NORjoKKyAgICAgICAgICBjYXNlIFdOSV9DRkdfRE5MRF9DTkY6CisgICAgICAgICAgY2FzZSBXTklfQ0ZHX0dFVF9SU1A6CisgICAgICAgICAgY2FzZSBXTklfQ0ZHX0FERF9HUlBfQUREUl9DTkY6CisgICAgICAgICAgY2FzZSBXTklfQ0ZHX0RFTF9HUlBfQUREUl9DTkY6CisgICAgICAgICAgICAgLy9DQ00KKyAgICAgICAgICAgICBpZiAocE1zZy0+Ym9keXB0cikKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2NtQ2ZnQ25mTXNnSGFuZGxlcihoSGFsLCBwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZSggcE1zZy0+Ym9keXB0ciApOworICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiRW1wdHkgcnNwIG1lc3NhZ2UgZm9yIENDTSwgbm90aGluZyB0byBwcm9jZXNzXG4iKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIGVXTklfU01FX0FERFRTX1JTUDoKKyAgICAgICAgICBjYXNlIGVXTklfU01FX0RFTFRTX1JTUDoKKyAgICAgICAgICBjYXNlIGVXTklfU01FX0RFTFRTX0lORDoKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgICAgICAgIGNhc2UgZVdOSV9TTUVfRlRfQUdHUl9RT1NfUlNQOgorI2VuZGlmICAgICAgICAgICAgIAorICAgICAgICAgICAgIC8vUW9TCisgICAgICAgICAgICAgaWYgKHBNc2ctPmJvZHlwdHIpCisgICAgICAgICAgICAgeworI2lmbmRlZiBXTEFOX01ETV9DT0RFX1JFRFVDVElPTl9PUFQKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzbWVfUW9zTXNnUHJvY2Vzc29yKHBNYWMsIHBNc2ctPnR5cGUsIHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZSggcE1zZy0+Ym9keXB0ciApOworI2VuZGlmCisgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJFbXB0eSByc3AgbWVzc2FnZSBmb3IgUW9TLCBub3RoaW5nIHRvIHByb2Nlc3NcbiIpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICAgICAgICBjYXNlIGVXTklfU01FX05FSUdIQk9SX1JFUE9SVF9JTkQ6CisgICAgICAgICAgY2FzZSBlV05JX1NNRV9CRUFDT05fUkVQT1JUX1JFUV9JTkQ6CisjaWYgZGVmaW5lZCBXTEFOX1ZPV0lGSV9ERUJVRworICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIlJlY2VpdmVkIFJSTSBtZXNzYWdlLiBNZXNzYWdlIElkID0gJWRcbiIsIHBNc2ctPnR5cGUgKTsKKyNlbmRpZgorICAgICAgICAgICAgIGlmICggcE1zZy0+Ym9keXB0ciApCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9Scm1Nc2dQcm9jZXNzb3IoIHBNYWMsIHBNc2ctPnR5cGUsIHBNc2ctPmJvZHlwdHIgKTsKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUoIHBNc2ctPmJvZHlwdHIgKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJFbXB0eSBtZXNzYWdlIGZvciBSUk0sIG5vdGhpbmcgdG8gcHJvY2Vzc1xuIik7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKworICAgICAgICAgIGNhc2UgZVdOSV9TTUVfQUREX1NUQV9TRUxGX1JTUDoKKyAgICAgICAgICAgICAgICBpZihwTXNnLT5ib2R5cHRyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjc3JQcm9jZXNzQWRkU3RhU2Vzc2lvblJzcChwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiRW1wdHkgcnNwIG1lc3NhZ2UgZm9yIG1lYXMgKGVXTklfU01FX0FERF9TVEFfU0VMRl9SU1ApLCBub3RoaW5nIHRvIHByb2Nlc3NcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGVXTklfU01FX0RFTF9TVEFfU0VMRl9SU1A6CisgICAgICAgICAgICAgICAgaWYocE1zZy0+Ym9keXB0cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyUHJvY2Vzc0RlbFN0YVNlc3Npb25Sc3AocE1hYywgcE1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkVtcHR5IHJzcCBtZXNzYWdlIGZvciBtZWFzIChlV05JX1NNRV9ERUxfU1RBX1NFTEZfUlNQKSwgbm90aGluZyB0byBwcm9jZXNzXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgICAgIC8vSGFuZGxlIHRoZSBlV05JX1NNRV9JTk5BVl9NRUFTX1JTUDoKKyAgICAgICAgICBjYXNlIGVXTklfU01FX1JFTUFJTl9PTl9DSE5fUlNQOgorICAgICAgICAgICAgICAgIGlmKHBNc2ctPmJvZHlwdHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzbWVfcmVtYWluT25DaG5Sc3AocE1hYywgcE1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiRW1wdHkgcnNwIG1lc3NhZ2UgZm9yIG1lYXMgKGVXTklfU01FX1JFTUFJTl9PTl9DSE5fUlNQKSwgbm90aGluZyB0byBwcm9jZXNzXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBlV05JX1NNRV9SRU1BSU5fT05fQ0hOX1JEWV9JTkQ6CisgICAgICAgICAgICAgICAgaWYocE1zZy0+Ym9keXB0cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9yZW1haW5PbkNoblJlYWR5KHBNYWMsIHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkVtcHR5IHJzcCBtZXNzYWdlIGZvciBtZWFzIChlV05JX1NNRV9SRU1BSU5fT05fQ0hOX1JEWV9JTkQpLCBub3RoaW5nIHRvIHByb2Nlc3NcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSBlV05JX1NNRV9NR01UX0ZSTV9JTkQ6CisgICAgICAgICAgICAgICAgaWYocE1zZy0+Ym9keXB0cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNtZV9tZ210RnJtSW5kKHBNYWMsIHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJFbXB0eSByc3AgbWVzc2FnZSBmb3IgbWVhcyAoZVdOSV9TTUVfTUdNVF9GUk1fSU5EKSwgbm90aGluZyB0byBwcm9jZXNzXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2UgZVdOSV9TTUVfQUNUSU9OX0ZSQU1FX1NFTkRfQ05GOgorICAgICAgICAgICAgICAgIGlmKHBNc2ctPmJvZHlwdHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzbWVfc2VuZEFjdGlvbkNuZihwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJFbXB0eSByc3AgbWVzc2FnZSBmb3IgbWVhcyAoZVdOSV9TTUVfQUNUSU9OX0ZSQU1FX1NFTkRfQ05GKSwgbm90aGluZyB0byBwcm9jZXNzXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICBjYXNlIGVXTklfU01FX0NPRVhfSU5EOgorICAgICAgICAgICAgICAgIGlmKHBNc2ctPmJvZHlwdHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGJ0Y0hhbmRsZUNvZXhJbmQoKHZvaWQgKilwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJFbXB0eSByc3AgbWVzc2FnZSBmb3IgbWVhcyAoZVdOSV9TTUVfQ09FWF9JTkQpLCBub3RoaW5nIHRvIHByb2Nlc3NcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsgICAgCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKyAgICAgICAgICBjYXNlIGVXTklfU01FX1BSRUZfTkVUV09SS19GT1VORF9JTkQ6CisgICAgICAgICAgICAgICAgaWYocE1zZy0+Ym9keXB0cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX1ByZWZlcnJlZE5ldHdvcmtGb3VuZEluZCgodm9pZCAqKXBNYWMsIHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIkVtcHR5IHJzcCBtZXNzYWdlIGZvciBtZWFzIChlV05JX1NNRV9QUkVGX05FVFdPUktfRk9VTkRfSU5EKSwgbm90aGluZyB0byBwcm9jZXNzXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisgICAgICAgICAgCisgICAgICAgICAgY2FzZSBlV05JX1NNRV9UWF9QRVJfSElUX0lORDoKKyAgICAgICAgICAgICAgICBpZiAocE1hYy0+c21lLnBUeFBlckhpdENhbGxiYWNrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBwTWFjLT5zbWUucFR4UGVySGl0Q2FsbGJhY2socE1hYy0+c21lLnBUeFBlckhpdENiQ29udGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBlV05JX1NNRV9DSEFOR0VfQ09VTlRSWV9DT0RFOgorICAgICAgICAgICAgICAgIGlmKHBNc2ctPmJvZHlwdHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9IYW5kbGVDaGFuZ2VDb3VudHJ5Q29kZSgodm9pZCAqKXBNYWMsIHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIkVtcHR5IHJzcCBtZXNzYWdlIGZvciBtZWFzIChlV05JX1NNRV9DT0VYX0lORCksIG5vdGhpbmcgdG8gcHJvY2Vzc1xuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKyAgICAgICAgICBjYXNlIGVXTklfUE1DX1BBQ0tFVF9DT0FMRVNDSU5HX0ZJTFRFUl9NQVRDSF9DT1VOVF9SU1A6CisgICAgICAgICAgICAgICAgaWYocE1zZy0+Ym9keXB0cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX1BDRmlsdGVyTWF0Y2hDb3VudFJlc3BvbnNlSGFuZGxlcigodm9pZCAqKXBNYWMsIHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIkVtcHR5IHJzcCBtZXNzYWdlIGZvciBtZWFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihQQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUlNQKSwgbm90aGluZyB0byBwcm9jZXNzXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKyAgICAgICAgICBjYXNlIGVXTklfU01FX1BSRV9TV0lUQ0hfQ0hMX0lORDoKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX0hhbmRsZVByZUNoYW5uZWxTd2l0Y2hJbmQocE1hYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgIGNhc2UgZVdOSV9TTUVfUE9TVF9TV0lUQ0hfQ0hMX0lORDoKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc21lX0hhbmRsZVBvc3RDaGFubmVsU3dpdGNoSW5kKHBNYWMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KKworI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUworICAgICAgICAgIGNhc2UgZVdOSV9TTUVfV0FLRV9SRUFTT05fSU5EOgorICAgICAgICAgICAgICAgIGlmKHBNc2ctPmJvZHlwdHIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9XYWtlUmVhc29uSW5kQ2FsbGJhY2soKHZvaWQgKilwTWFjLCBwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJFbXB0eSByc3AgbWVzc2FnZSBmb3IgbWVhcyAoZVdOSV9TTUVfV0FLRV9SRUFTT05fSU5EKSwgbm90aGluZyB0byBwcm9jZXNzXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisKKyAgICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAgaWYgKCAoIHBNc2ctPnR5cGUgPj0gZVdOSV9TTUVfTVNHX1RZUEVTX0JFR0lOICkKKyAgICAgICAgICAgICAgICAgICYmICAoIHBNc2ctPnR5cGUgPD0gZVdOSV9TTUVfTVNHX1RZUEVTX0VORCApICkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9DU1IKKyAgICAgICAgICAgICAgICBpZiAocE1zZy0+Ym9keXB0cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY3NyTXNnUHJvY2Vzc29yKGhIYWwsIHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZSggcE1zZy0+Ym9keXB0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIkVtcHR5IHJzcCBtZXNzYWdlIGZvciBDU1IsIG5vdGhpbmcgdG8gcHJvY2Vzc1xuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIlVua25vd24gbWVzc2FnZSB0eXBlICVkLCBub3RoaW5nIHRvIHByb2Nlc3NcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwTXNnLT50eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAocE1zZy0+Ym9keXB0cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgdm9zX21lbV9mcmVlKCBwTXNnLT5ib2R5cHRyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICB9Ly9zd2l0Y2gKKyAgICAgIH0gLy9TTUVfSVNfU1RBUlQKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HVywgIm1lc3NhZ2UgdHlwZSAlZCBpbiBzdG9wIHN0YXRlIGlnbm9yZWRcbiIsIHBNc2ctPnR5cGUpOworICAgICAgICAgaWYgKHBNc2ctPmJvZHlwdHIpCisgICAgICAgICB7CisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUoIHBNc2ctPmJvZHlwdHIgKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorICAgZWxzZQorICAgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dXLCAiTG9ja2luZyBmYWlsZWQsIGJhaWxpbmcgb3V0XG4iKTsKKyAgICAgIGlmIChwTXNnLT5ib2R5cHRyKQorICAgICAgeworICAgICAgICAgIHZvc19tZW1fZnJlZSggcE1zZy0+Ym9keXB0ciApOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8vTm8gbmVlZCB0byBob2xkIHRoZSBnbG9iYWwgbG9jayBoZXJlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQKKy8vYWZ0ZXIgc21lX1N0b3AuCit2X1ZPSURfdCBzbWVfRnJlZU1zZyggdEhhbEhhbmRsZSBoSGFsLCB2b3NfbXNnX3QqIHBNc2cgKQoreworICAgaWYoIHBNc2cgKQorICAgeworICAgICAgaWYgKHBNc2ctPmJvZHlwdHIpCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUoIHBNc2ctPmJvZHlwdHIgKTsKKyAgICAgIH0KKyAgIH0KKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgc21lX1N0b3AoKSAtIFN0b3AgYWxsIFNNRSBtb2R1bGVzIGFuZCBwdXQgdGhlbSBhdCBpZGxlIHN0YXRlCisKKyAgVGhlIGZ1bmN0aW9uIHN0b3BzIGVhY2ggbW9kdWxlIGluIFNNRSwgUE1DLCBDQ00sIENTUiwgZXRjLiAuIFVwb24KKyAgcmV0dXJuLCBhbGwgbW9kdWxlcyBhcmUgYXQgaWRsZSBzdGF0ZSByZWFkeSB0byBzdGFydC4KKworICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4KKworICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBTTUUgaXMgc3RvcHBlZC4KKworICAgICAgICAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIHN0b3AgYnV0IGNhbGxlciBzaG91bGQgc3RpbGwKKyAgICAgICAgICBjb25zaWRlciBTTUUgaXMgc3RvcHBlZC4KKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU3RvcCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfQk9PTEVBTiBwbWNGbGFnKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgZUhhbFN0YXR1cyBmYWlsX3N0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgIHN0YXR1cyA9IFdMQU5TQVBfU3RvcCh2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU0FQLCBOVUxMKSk7CisgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApIHsKKyAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIldMQU5TQVBfU3RvcCBmYWlsZWQgZHVyaW5nIHNtZVN0b3Agd2l0aCBzdGF0dXM9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyApOworICAgICAgZmFpbF9zdGF0dXMgPSBzdGF0dXM7CisgICB9CisjZW5kaWYKKworICAgcDJwU3RvcChoSGFsKTsKKworICAgaWYocG1jRmxhZykKKyAgIHsKKyAgICAgIHN0YXR1cyA9IHBtY1N0b3AoaEhhbCk7CisgICAgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApIHsKKyAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgInBtY1N0b3AgZmFpbGVkIGR1cmluZyBzbWVTdG9wIHdpdGggc3RhdHVzPSVkXG4iLAorICAgICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgICAgICAgIGZhaWxfc3RhdHVzID0gc3RhdHVzOworICAgICAgfQorICAgfQorCisgICBzdGF0dXMgPSBjc3JTdG9wKHBNYWMpOworICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJjc3JTdG9wIGZhaWxlZCBkdXJpbmcgc21lU3RvcCB3aXRoIHN0YXR1cz0lZFxuIiwKKyAgICAgICAgICAgICAgc3RhdHVzICk7CisgICAgICBmYWlsX3N0YXR1cyA9IHN0YXR1czsKKyAgIH0KKworICAgY2NtU3RvcChoSGFsKTsKKworICAgcHVyZ2VTbWVDbWRMaXN0KHBNYWMpOworCisgICBpZiAoIUhBTF9TVEFUVVNfU1VDQ0VTUyggZmFpbF9zdGF0dXMgKSkgeworICAgICAgc3RhdHVzID0gZmFpbF9zdGF0dXM7CisgICB9CisKKyAgIHBNYWMtPnNtZS5zdGF0ZSA9IFNNRV9TVEFURV9TVE9QOworCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHNtZV9DbG9zZSgpIC0gUmVsZWFzZSBhbGwgU01FIG1vZHVsZXMgYW5kIHRoZWlyIHJlc291cmNlcy4KKworICBUaGUgZnVuY3Rpb24gcmVsZWFzZSBlYWNoIG1vZHVsZSBpbiBTTUUsIFBNQywgQ0NNLCBDU1IsIGV0Yy4gLiBVcG9uCisgIHJldHVybiwgYWxsIG1vZHVsZXMgYXJlIGF0IGNsb3NlZCBzdGF0ZS4KKworICBObyBTTUUgQVBJcyBjYW4gYmUgaW52b2x2ZWQgYWZ0ZXIgc21lQ2xvc2UgZXhjZXB0IHNtZU9wZW4uCisgIHNtZUNsb3NlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBtYWNDbG9zZS4KKyAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuCisKKyAgXHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTIC0gU01FIGlzIHN1Y2Nlc3NmdWxseSBjbG9zZS4KKworICAgICAgICAgIE90aGVyIHN0YXR1cyBtZWFucyBTTUUgaXMgZmFpbGVkIHRvIGJlIGNsb3NlZCBidXQgY2FsbGVyIHN0aWxsIGNhbm5vdAorICAgICAgICAgIGNhbGwgYW55IG90aGVyIFNNRSBmdW5jdGlvbnMgZXhjZXB0IHNtZU9wZW4uCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0Nsb3NlKHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIGVIYWxTdGF0dXMgZmFpbF9zdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IGNzckNsb3NlKHBNYWMpOworICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJjc3JDbG9zZSBmYWlsZWQgZHVyaW5nIHNtZSBjbG9zZSB3aXRoIHN0YXR1cz0lZFxuIiwKKyAgICAgICAgICAgICAgc3RhdHVzICk7CisgICAgICBmYWlsX3N0YXR1cyA9IHN0YXR1czsKKyAgIH0KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgIHN0YXR1cyA9IFdMQU5TQVBfQ2xvc2Uodm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NBUCwgTlVMTCkpOworICAgaWYgKCAhIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKSB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJXTEFOU0FQX2Nsb3NlIGZhaWxlZCBkdXJpbmcgc21lIGNsb3NlIHdpdGggc3RhdHVzPSVkXG4iLAorICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgICAgIGZhaWxfc3RhdHVzID0gc3RhdHVzOworICAgfQorI2VuZGlmCisKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICBzdGF0dXMgPSBidGNDbG9zZShoSGFsKTsKKyAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiQlRDIGNsb3NlIGZhaWxlZCBkdXJpbmcgc21lIGNsb3NlIHdpdGggc3RhdHVzPSVkXG4iLAorICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgICAgIGZhaWxfc3RhdHVzID0gc3RhdHVzOworICAgfQorCisgICBzdGF0dXMgPSBzbWVfUW9zQ2xvc2UocE1hYyk7CisgICBpZiAoICEgSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApIHsKKyAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIlFvcyBjbG9zZSBmYWlsZWQgZHVyaW5nIHNtZSBjbG9zZSB3aXRoIHN0YXR1cz0lZFxuIiwKKyAgICAgICAgICAgICAgc3RhdHVzICk7CisgICAgICBmYWlsX3N0YXR1cyA9IHN0YXR1czsKKyAgIH0KKyNlbmRpZgorCisgICBzdGF0dXMgPSBjY21DbG9zZShoSGFsKTsKKyAgICAgICAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiY2NtQ2xvc2UgZmFpbGVkIGR1cmluZyBzbWUgY2xvc2Ugd2l0aCBzdGF0dXM9JWRcbiIsCisgICAgICAgICAgICAgICAgIHN0YXR1cyApOworICAgICAgICAgICAgIGZhaWxfc3RhdHVzID0gc3RhdHVzOworICAgICAgICAgfQorCisgICBzdGF0dXMgPSBwbWNDbG9zZShoSGFsKTsKKyAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAicG1jQ2xvc2UgZmFpbGVkIGR1cmluZyBzbWUgY2xvc2Ugd2l0aCBzdGF0dXM9JWRcbiIsCisgICAgICAgICAgICAgIHN0YXR1cyApOworICAgICAgZmFpbF9zdGF0dXMgPSBzdGF0dXM7CisgICB9CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICBzdGF0dXMgPSBycm1DbG9zZShoSGFsKTsKKyAgIGlmICggISBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiUlJNIGNsb3NlIGZhaWxlZCBkdXJpbmcgc21lIGNsb3NlIHdpdGggc3RhdHVzPSVkXG4iLAorICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgICAgIGZhaWxfc3RhdHVzID0gc3RhdHVzOworICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICBzbWVfRlRDbG9zZShoSGFsKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1AyUAorICAgc21lX3AycENsb3NlKGhIYWwpOworI2VuZGlmCisKKyAgIGZyZWVTbWVDbWRMaXN0KHBNYWMpOworCisgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zX2xvY2tfZGVzdHJveSggJnBNYWMtPnNtZS5sa1NtZUdsb2JhbExvY2sgKSApICkKKyAgIHsKKyAgICAgICBmYWlsX3N0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKCBmYWlsX3N0YXR1cyApKSB7CisgICAgICBzdGF0dXMgPSBmYWlsX3N0YXR1czsKKyAgIH0KKworICAgcE1hYy0+c21lLnN0YXRlID0gU01FX1NUQVRFX1NUT1A7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2NhblJlcXVlc3QKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIFJlcXVlc3QgYSAxMWQgb3IgZnVsbCBzY2FuIGZyb20gQ1NSLgorICAgIFRoaXMgaXMgYW4gYXN5bmNocm9udW91cyBjYWxsCisgICAgXHBhcmFtIHBTY2FuUmVxdWVzdElEIC0gcG9pbnRlciB0byBhbiBvYmplY3QgdG8gZ2V0IGJhY2sgdGhlIHJlcXVlc3QgSUQKKyAgICBccGFyYW0gY2FsbGJhY2sgLSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgc2NhbiBjYWxscyB1cG9uIGZpbmlzaCwgd2lsbCBub3QKKyAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgaWYgY3NyU2NhblJlcXVlc3QgcmV0dXJucyBlcnJvcgorICAgIFxwYXJhbSBwQ29udGV4dCAtIGEgcG9pbnRlciBwYXNzZWQgaW4gZm9yIHRoZSBjYWxsYmFjaworICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2NhblJlcXVlc3QodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwgdENzclNjYW5SZXF1ZXN0ICpwc2NhblJlcSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcFNjYW5SZXF1ZXN0SUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NyU2NhbkNvbXBsZXRlQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKnBDb250ZXh0KQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiZW50ZXIiKSk7CisgICAgZG8KKyAgICB7CisgICAgICAgIGlmKHBNYWMtPnNjYW4uZlNjYW5FbmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgICAgICAgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNzclNjYW5SZXF1ZXN0KCBoSGFsLCBzZXNzaW9uSWQsIHBzY2FuUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FuUmVxdWVzdElELCBjYWxsYmFjaywgcENvbnRleHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICAgICAgICAgIH0gLy9zbWVfQWNxdWlyZUdsb2JhbExvY2sgc3VjY2VzcworICAgICAgICB9IC8vaWYocE1hYy0+c2Nhbi5mU2NhbkVuYWJsZSkKKyAgICB9IHdoaWxlKCAwICk7CisKKyAgICByZXR1cm4gKHN0YXR1cyk7CisKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NjYW5HZXRSZXN1bHQKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3Qgc2NhbiByZXN1bHRzIGZyb20gQ1NSLgorICAgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbAorICAgIFxwYXJhbSBwRmlsdGVyIC0gSWYgcEZpbHRlciBpcyBOVUxMLCBhbGwgY2FjaGVkIHJlc3VsdHMgYXJlIHJldHVybmVkCisgICAgXHBhcmFtIHBoUmVzdWx0IC0gYW4gb2JqZWN0IGZvciB0aGUgcmVzdWx0LgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2NhbkdldFJlc3VsdCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCB0Q3NyU2NhblJlc3VsdEZpbHRlciAqcEZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2NhblJlc3VsdEhhbmRsZSAqcGhSZXN1bHQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJlbnRlciIpKTsKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgICBzdGF0dXMgPSBjc3JTY2FuR2V0UmVzdWx0KCBoSGFsLCBwRmlsdGVyLCBwaFJlc3VsdCApOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJleGl0IHN0YXR1cyAlZCIpLCBzdGF0dXMpOworCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TY2FuRmx1c2hSZXN1bHQKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIGNsZWFyIHNjYW4gcmVzdWx0cy4KKyAgICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1NjYW5GbHVzaFJlc3VsdCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgICBzdGF0dXMgPSBjc3JTY2FuRmx1c2hSZXN1bHQoIGhIYWwgKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2NhblJlc3VsdEdldEZpcnN0CisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICAgICAgICAgIHNjYW4gcmVzdWx0LgorICAgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbAorICAgIFxwYXJhbSBoU2NhblJlc3VsdCAtIHJldHVybmVkIGZyb20gY3NyU2NhbkdldFJlc3VsdAorICAgIFxyZXR1cm4gdENzclNjYW5SZXN1bHRJbmZvICogLSBOVUxMIGlmIG5vIHJlc3VsdAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordENzclNjYW5SZXN1bHRJbmZvICpzbWVfU2NhblJlc3VsdEdldEZpcnN0KHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTY2FuUmVzdWx0SGFuZGxlIGhTY2FuUmVzdWx0KQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICB0Q3NyU2NhblJlc3VsdEluZm8gKnBSZXQgPSBOVUxMOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgcFJldCA9IGNzclNjYW5SZXN1bHRHZXRGaXJzdCggcE1hYywgaFNjYW5SZXN1bHQgKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChwUmV0KTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NjYW5SZXN1bHRHZXROZXh0CisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byByZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgb2YKKyAgICAgICAgICAgc2NhbiByZXN1bHQuIEl0IGNhbiBiZSBjYWxsZWQgd2l0aG91dCBjYWxsaW5nIGNzclNjYW5SZXN1bHRHZXRGaXJzdAorICAgICAgICAgICBmaXJzdAorICAgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbAorICAgIFxwYXJhbSBoU2NhblJlc3VsdCAtIHJldHVybmVkIGZyb20gY3NyU2NhbkdldFJlc3VsdAorICAgIFxyZXR1cm4gTnVsbCBpZiBubyByZXN1bHQgb3IgcmVhY2ggdGhlIGVuZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordENzclNjYW5SZXN1bHRJbmZvICpzbWVfU2NhblJlc3VsdEdldE5leHQodEhhbEhhbmRsZSBoSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNjYW5SZXN1bHRIYW5kbGUgaFNjYW5SZXN1bHQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHRDc3JTY2FuUmVzdWx0SW5mbyAqcFJldCA9IE5VTEw7CisKKyAgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgcFJldCA9IGNzclNjYW5SZXN1bHRHZXROZXh0KCBwTWFjLCBoU2NhblJlc3VsdCApOworICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHBSZXQpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2NhblNldEJHU2NhbnBhcmFtcworICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gc2V0IEJHIHNjYW4gcGFyYW1zIGluIFBFCisgICAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsCisgICAgXHBhcmFtIHBTY2FuUmVxIC0gQkcgc2NhbiByZXF1ZXN0IHN0cnVjdHVyZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2NhblNldEJHU2NhbnBhcmFtcyh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCB0Q3NyQkdTY2FuUmVxdWVzdCAqcFNjYW5SZXEpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICAgaWYoIE5VTEwgIT0gcFNjYW5SZXEgKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgICAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclNjYW5TZXRCR1NjYW5wYXJhbXMoIGhIYWwsIHBTY2FuUmVxICk7CisgICAgICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NjYW5SZXN1bHRQdXJnZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmVtb3ZlIGFsbCBpdGVtcyh0Q3NyU2NhblJlc3VsdCkKKyAgICAgICAgICAgaW4gdGhlIGxpc3QgYW5kIGZyZWUgbWVtb3J5IGZvciBlYWNoIGl0ZW0KKyAgICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwKKyAgICBccGFyYW0gaFNjYW5SZXN1bHQgLSByZXR1cm5lZCBmcm9tIGNzclNjYW5HZXRSZXN1bHQuIGhTY2FuUmVzdWx0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2lkZXJlZCBnb25lIGJ5CisgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFuZCBldmVuIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldXRybnMuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TY2FuUmVzdWx0UHVyZ2UodEhhbEhhbmRsZSBoSGFsLCB0U2NhblJlc3VsdEhhbmRsZSBoU2NhblJlc3VsdCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgc3RhdHVzID0gY3NyU2NhblJlc3VsdFB1cmdlKCBoSGFsLCBoU2NhblJlc3VsdCApOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2NhbkdldFBNS0lEQ2FuZGlkYXRlTGlzdAorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBQTUtJRCBjYW5kaWRhdGUgbGlzdAorICAgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbAorICAgIFxwYXJhbSBwUG1raWRMaXN0IC0gY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgcG9pbnQgdG8gYW4gYXJyYXkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIHRQbWtpZENhbmRpZGF0ZUluZm8KKyAgICBccGFyYW0gcE51bUl0ZW1zIC0gcG9pbnRlciB0byBhIHZhcmlhYmxlIHRoYXQgaGFzIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgdFBta2lkQ2FuZGlkYXRlSW5mbyBhbGxvY2F0ZWQgd2hlbiByZXRydW5pbmcsIHRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIHRoZSBudW1iZXIgbmVlZGVkIG9yIG51bWJlciBvZiBpdGVtcyBwdXQgaW50bworICAgICAgICAgICAgICAgICAgICAgICBwUG1raWRMaXN0CisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpZyBlbm91Z2ggYW5kIHBOdW1JdGVtcworICAgIGhhcyB0aGUgbnVtYmVyIG9mIHRQbWtpZENhbmRpZGF0ZUluZm8uCisgICAgXE5vdGU6IHBOdW1JdGVtcyBpcyBhIG51bWJlciBvZiB0UG1raWRDYW5kaWRhdGVJbmZvLAorICAgICAgICAgICBub3Qgc2l6ZW9mKHRQbWtpZENhbmRpZGF0ZUluZm8pICogc29tZXRoaW5nCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TY2FuR2V0UE1LSURDYW5kaWRhdGVMaXN0KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBta2lkQ2FuZGlkYXRlSW5mbyAqcFBta2lkTGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBOdW1JdGVtcyApCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IGNzclNjYW5HZXRQTUtJRENhbmRpZGF0ZUxpc3QoIHBNYWMsIHNlc3Npb25JZCwgcFBta2lkTGlzdCwgcE51bUl0ZW1zICk7CisgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxmbiBzbWVfUm9hbVJlZ2lzdGVyTGlua1F1YWxpdHlJbmRDYWxsYmFjaworCisgIFxicmllZgorICBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gYWxsb3cgSEREIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgaGFuZGxlciB3aXRoIENTUiBmb3IKKyAgbGluayBxdWFsaXR5IGluZGljYXRpb25zLgorCisgIE9ubHkgb25lIGNhbGxiYWNrIG1heSBiZSByZWdpc3RlcmVkIGF0IGFueSB0aW1lLgorICBJbiBvcmRlciB0byBkZXJlZ2lzdGVyIHRoZSBjYWxsYmFjaywgYSBOVUxMIGNiYWNrIG1heSBiZSBwcm92aWRlZC4KKworICBSZWdpc3RyYXRpb24gaGFwcGVucyBpbiB0aGUgdGFzayBjb250ZXh0IG9mIHRoZSBjYWxsZXIuCisKKyAgXHBhcmFtIGNhbGxiYWNrIC0gQ2FsbCBiYWNrIGJlaW5nIHJlZ2lzdGVyZWQKKyAgXHBhcmFtIHBDb250ZXh0IC0gdXNlciBkYXRhCisKKyAgREVQRU5ERU5DSUVTOiBBZnRlciBDU1Igb3BlbgorCisgIFxyZXR1cm4gZUhhbFN0YXR1cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVJlZ2lzdGVyTGlua1F1YWxpdHlJbmRDYWxsYmFjayh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3JSb2FtTGlua1F1YWxpdHlJbmRDYWxsYmFjayAgIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDb250ZXh0KQoreworICAgcmV0dXJuKGNzclJvYW1SZWdpc3RlckxpbmtRdWFsaXR5SW5kQ2FsbGJhY2soKHRwQW5pU2lyR2xvYmFsKWhIYWwsIGNhbGxiYWNrLCBwQ29udGV4dCkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1SZWdpc3RlckNhbGxiYWNrCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byBhbGxvdyBIREQgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB3aXRoIENTUi4KKyAgICAgICAgICAgVW5saWtlIHNjYW4sIHJvYW0gaGFzIG9uZSBjYWxsYmFjayBmb3IgYWxsIHRoZSByb2FtIHJlcXVlc3RzCisgICAgXHBhcmFtIGNhbGxiYWNrIC0gYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJvYW0gY2FsbHMgdXBvbiB3aGVuIHN0YXRlIGNoYW5nZXMKKyAgICBccGFyYW0gcENvbnRleHQgLSBhIHBvaW50ZXIgcGFzc2VkIGluIGZvciB0aGUgY2FsbGJhY2sKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1SZWdpc3RlckNhbGxiYWNrKHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1Db21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENvbnRleHQpCit7CisgICByZXR1cm4oY3NyUm9hbVJlZ2lzdGVyQ2FsbGJhY2soKHRwQW5pU2lyR2xvYmFsKWhIYWwsIGNhbGxiYWNrLCBwQ29udGV4dCkpOworfQorCitlQ3NyUGh5TW9kZSBzbWVfR2V0UGh5TW9kZSh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgIHJldHVybiBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLnBoeU1vZGU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbUNvbm5lY3QKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIGluaXRpdGlhdGUgYW4gYXNzb2NpYXRpb24KKyAgICBUaGlzIGlzIGFuIGFzeW5jaHJvbnVvdXMgY2FsbC4KKyAgICBccGFyYW0gc2Vzc2lvbklkIC0gdGhlIHNlc3Npb25JZCByZXR1cm5lZCBieSBzbWVfT3BlblNlc3Npb24uCisgICAgXHBhcmFtIHBQcm9maWxlIC0gZGVzY3JpcHRpb24gb2YgdGhlIG5ldHdvcmsgdG8gd2hpY2ggdG8gY29ubmVjdAorICAgIFxwYXJhbSBoQnNzTGlzdEluIC0gYSBsaXN0IG9mIEJTUyBkZXNjcmlwdG9yIHRvIHJvYW0gdG8uIEl0IGlzIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGNzclNjYW5HZXRSZXN1bHQKKyAgICBccGFyYW0gcFJvYW1JZCAtIHRvIGdldCBiYWNrIHRoZSByZXF1ZXN0IElECisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtQ29ubmVjdCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBSb2FtSWQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJlbnRlciIpKTsKKyAgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1Db25uZWN0KCBwTWFjLCBzZXNzaW9uSWQsIHBQcm9maWxlLCBOVUxMLCBwUm9hbUlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbVJlYXNzb2MKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIGluaXRpdGlhdGUgYSByZS1hc3NvY2lhdGlvbgorICAgIFxwYXJhbSBwUHJvZmlsZSAtIGNhbiBiZSBOVUxMIHRvIGpvaW4gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgQVAuIEluIHRoYXQKKyAgICBjYXNlIG1vZFByb2ZpbGVGaWVsZHMgc2hvdWxkIGNhcnJ5IHRoZSBtb2RpZmllZCBmaWVsZChzKSB3aGljaCBjb3VsZCB0cmlnZ2VyCisgICAgcmVhc3NvYworICAgIFxwYXJhbSBtb2RQcm9maWxlRmllbGRzIC0gZmllbGRzIHdoaWNoIGFyZSBwYXJ0IG9mIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZQorICAgIHRoYXQgbWlnaHQgbmVlZCBtb2RpZmljYXRpb24gZHluYW1pY2FsbHkgb25jZSBTVEEgaXMgdXAgJiBydW5uaW5nIGFuZCB0aGlzCisgICAgY291bGQgdHJpZ2dlciBhIHJlYXNzb2MKKyAgICBccGFyYW0gcFJvYW1JZCAtIHRvIGdldCBiYWNrIHRoZSByZXF1ZXN0IElECisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVJlYXNzb2ModEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwgdENzclJvYW1Qcm9maWxlICpwUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Nb2RpZnlQcm9maWxlRmllbGRzIG1vZFByb2ZpbGVGaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwUm9hbUlkKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0cyLCBGTCgiZW50ZXIiKSk7CisgICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtUmVhc3NvYyggcE1hYywgc2Vzc2lvbklkLCBwUHJvZmlsZSwgbW9kUHJvZmlsZUZpZWxkcywgcFJvYW1JZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1Db25uZWN0VG9MYXN0UHJvZmlsZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gZGlzY29ubmVjdCBhbmQgcmVjb25uZWN0IHdpdGgKKyAgICAgICAgICAgdGhlIHNhbWUgcHJvZmlsZQorICAgIFRoaXMgaXMgYW4gYXN5bmNocm9udW91cyBjYWxsLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cy4gSXQgcmV0dXJucyBmYWlsIGlmIGN1cnJlbnRseSBjb25uZWN0ZWQKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1Db25uZWN0VG9MYXN0UHJvZmlsZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUNvbm5lY3RUb0xhc3RQcm9maWxlKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbURpc2Nvbm5lY3QKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIGRpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsKKyAgICBUaGlzIGlzIGFuIGFzeW5jaHJvbnVvdXMgY2FsbC4KKyAgICBccGFyYW0gcmVhc29uIC0tIFRvIGluZGljYXRlIHRoZSByZWFzb24gZm9yIGRpc2Nvbm5lY3RpbmcuIEN1cnJlbnRseSwgb25seQorICAgICAgICAgICAgICAgICAgICAgZUNTUl9ESVNDT05ORUNUX1JFQVNPTl9NSUNfRVJST1IgaXMgbWVhbmZ1bC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1EaXNjb25uZWN0KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIGVDc3JSb2FtRGlzY29ubmVjdFJlYXNvbiByZWFzb24pCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCJlbnRlciIpKTsKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gY3NyUm9hbURpc2Nvbm5lY3QoIHBNYWMsIHNlc3Npb25JZCwgcmVhc29uICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICB9CisgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Sb2FtU3RvcEJzcworICAgIFxicmllZiBUbyBzdG9wIEJTUyBmb3IgU29mdCBBUC4gVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorICAgIFxwYXJhbSBoSGFsIC0gR2xvYmFsIHN0cnVjdHVyZQorICAgIFxwYXJhbSBzZXNzaW9uSWQgLSBzZXNzaW9uSWQgb2YgU29mdEFQCisgICAgXHJldHVybiBlSGFsU3RhdHVzICBTVUNDRVNTICBSb2FtIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHRvIGluZGljYXRlIGFjdHVhbCByZXN1bHRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVN0b3BCc3ModEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoImVudGVyIikpOworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVTdG9wQnNzQ21kKCBwTWFjLCBzZXNzaW9uSWQsIGVBTklfQk9PTEVBTl9UUlVFICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICB9CisgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1EaXNjb25uZWN0U3RhCisgICAgXGJyaWVmIFRvIGRpc2Fzc29jaWF0ZSBhIHN0YXRpb24uIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKyAgICBccGFyYW0gaEhhbCAtIEdsb2JhbCBzdHJ1Y3R1cmUKKyAgICBccGFyYW0gc2Vzc2lvbklkIC0gc2Vzc2lvbklkIG9mIFNvZnRBUAorICAgIFxwYXJhbSBwUGVlck1hY0FkZHIgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBmaWxsZWQgd2l0aCBwZWVyIE1BQyBhZGRyZXNzICg2IGJ5dGVzKQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgU1VDQ0VTUyAgUm9hbSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB0byBpbmRpY2F0ZSBhY3R1YWwgcmVzdWx0cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1EaXNjb25uZWN0U3RhKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBQZWVyTWFjQWRkcikKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBpZiAoIE5VTEwgPT0gcE1hYyApCisgICB7CisgICAgIFZPU19BU1NFUlQoMCk7CisgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlRGlzYXNzb2NpYXRlU3RhQ21kKCBwTWFjLCBzZXNzaW9uSWQsIHBQZWVyTWFjQWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfTUFDX1VOU1BFQ19GQUlMVVJFX1JFQVNPTik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbURlYXV0aFN0YQorICAgIFxicmllZiBUbyBkaXNhc3NvY2lhdGUgYSBzdGF0aW9uLiBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBBUEkuCisgICAgXHBhcmFtIGhIYWwgLSBHbG9iYWwgc3RydWN0dXJlCisgICAgXHBhcmFtIHNlc3Npb25JZCAtIHNlc3Npb25JZCBvZiBTb2Z0QVAKKyAgICBccGFyYW0gcFBlZXJNYWNBZGRyIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZmlsbGVkIHdpdGggcGVlciBNQUMgYWRkcmVzcyAoNiBieXRlcykKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgIFNVQ0NFU1MgIFJvYW0gY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgdG8gaW5kaWNhdGUgYWN0dWFsIHJlc3VsdHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtRGVhdXRoU3RhKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBQZWVyTWFjQWRkcikKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBpZiAoIE5VTEwgPT0gcE1hYyApCisgICB7CisgICAgIFZPU19BU1NFUlQoMCk7CisgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlRGVhdXRoU3RhQ21kKCBwTWFjLCBzZXNzaW9uSWQsIHBQZWVyTWFjQWRkciwgCisgICAgICAgICAgICAgICAgICAgICBlU0lSX01BQ19VTlNQRUNfRkFJTFVSRV9SRUFTT04pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICB9CisgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1US0lQQ291bnRlck1lYXN1cmVzCisgICAgXGJyaWVmIFRvIHN0YXJ0IG9yIHN0b3AgVEtJUCBjb3VudGVyIG1lYXN1cmVzLiBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBBUEkuCisgICAgXHBhcmFtIHNlc3Npb25JZCAtIHNlc3Npb25JZCBvZiBTb2Z0QVAKKyAgICBccGFyYW0gcFBlZXJNYWNBZGRyIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZmlsbGVkIHdpdGggcGVlciBNQUMgYWRkcmVzcyAoNiBieXRlcykKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtVEtJUENvdW50ZXJNZWFzdXJlcyh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfQk9PTEVBTiBiRW5hYmxlKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIGlmICggTlVMTCA9PSBwTWFjICkKKyAgIHsKKyAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUlzc3VlVGtpcENvdW50ZXJNZWFzdXJlcyggcE1hYywgc2Vzc2lvbklkLCBiRW5hYmxlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbUdldEFzc29jaWF0ZWRTdGFzCisgICAgXGJyaWVmIFRvIHByb2JlIHRoZSBsaXN0IG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgZnJvbSB2YXJpb3VzIG1vZHVsZXMgb2YgQ09SRSBzdGFjay4KKyAgICBcVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorICAgIFxwYXJhbSBzZXNzaW9uSWQgICAgLSBzZXNzaW9uSWQgb2YgU29mdEFQCisgICAgXHBhcmFtIG1vZElkICAgICAgICAtIE1vZHVsZSBmcm9tIHdob20gbGlzdCBvZiBhc3NvY2l0YXRlZCBzdGF0aW9ucyBpcyB0byBiZSBwcm9iZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGFuIGludmFsaWQgbW9kdWxlIGlzIHBhc3NlZCB0aGVuIGJ5IGRlZmF1bHQgVk9TX01PRFVMRV9JRF9QRSB3aWxsIGJlIHByb2JlZAorICAgIFxwYXJhbSBwVXNyQ29udGV4dCAgLSBPcGFxdWUgSEREIGNvbnRleHQKKyAgICBccGFyYW0gcGZuU2FwRXZlbnRDYWxsYmFjayAgLSBTYXAgZXZlbnQgY2FsbGJhY2sgaW4gSERECisgICAgXHBhcmFtIHBBc3NvY0J1ZiAgICAtIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRvIGJlIGZpbGxlZCB3aXRoIGFzc29jaWF0ZCBzdGF0aW9ucyBpbmZvCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbUdldEFzc29jaWF0ZWRTdGFzKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01PRFVMRV9JRCBtb2RJZCwgdm9pZCAqcFVzckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGZuU2FwRXZlbnRDYWxsYmFjaywgdEFOSV9VOCAqcEFzc29jU3Rhc0J1ZikKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBpZiAoIE5VTEwgPT0gcE1hYyApCisgICB7CisgICAgIFZPU19BU1NFUlQoMCk7CisgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1HZXRBc3NvY2lhdGVkU3RhcyggcE1hYywgc2Vzc2lvbklkLCBtb2RJZCwgcFVzckNvbnRleHQsIHBmblNhcEV2ZW50Q2FsbGJhY2ssIHBBc3NvY1N0YXNCdWYgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbUdldFdwc1Nlc3Npb25PdmVybGFwCisgICAgXGJyaWVmIFRvIGdldCB0aGUgV1BTIFBCQyBzZXNzaW9uIG92ZXJsYXAgaW5mb3JtYXRpb24uCisgICAgXFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKyAgICBccGFyYW0gc2Vzc2lvbklkICAgIC0gc2Vzc2lvbklkIG9mIFNvZnRBUAorICAgIFxwYXJhbSBwVXNyQ29udGV4dCAgLSBPcGFxdWUgSEREIGNvbnRleHQKKyAgICBccGFyYW0gcGZuU2FwRXZlbnRDYWxsYmFjayAgLSBTYXAgZXZlbnQgY2FsbGJhY2sgaW4gSERECisgICAgXHBSZW1vdmVNYWMgLSBwb2ludGVyIHRvIE1hYyBhZGRyZXNzIHdoaWNoIG5lZWRzIHRvIGJlIHJlbW92ZWQgZnJvbSBzZXNzaW9uCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbUdldFdwc1Nlc3Npb25PdmVybGFwKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFVzckNvbnRleHQsIHZvaWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBmblNhcEV2ZW50Q2FsbGJhY2ssIHZfTUFDQUREUl90IHBSZW1vdmVNYWMpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgaWYgKCBOVUxMID09IHBNYWMgKQorICAgeworICAgICBWT1NfQVNTRVJUKDApOworICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtR2V0V3BzU2Vzc2lvbk92ZXJsYXAoIHBNYWMsIHNlc3Npb25JZCwgcFVzckNvbnRleHQsIHBmblNhcEV2ZW50Q2FsbGJhY2ssIHBSZW1vdmVNYWMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbUdldENvbm5lY3RTdGF0ZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGNvbm5lY3Qgc3RhdGUKKyAgICAgICAgICAgb2YgUm9hbWluZworICAgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbC4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1HZXRDb25uZWN0U3RhdGUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwgZUNzckNvbm5lY3RTdGF0ZSAqcFN0YXRlKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgeworICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgIHsKKyAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtR2V0Q29ubmVjdFN0YXRlKCBwTWFjLCBzZXNzaW9uSWQsIHBTdGF0ZSApOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICB9CisgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1HZXRDb25uZWN0UHJvZmlsZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGNvbm5lY3QKKyAgICAgICAgICAgcHJvZmlsZS4gQ2FsbGVyIG11c3QgY2FsbCBjc3JSb2FtRnJlZUNvbm5lY3RQcm9maWxlIGFmdGVyIGl0IGlzIGRvbmUKKyAgICAgICAgICAgYW5kIGJlZm9yZSByZXVzZSBmb3IgYW5vdGhlciBjc3JSb2FtR2V0Q29ubmVjdFByb2ZpbGUgY2FsbC4KKyAgICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwuCisgICAgXHBhcmFtIHBQcm9maWxlIC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlCisgICAgXHJldHVybiBlSGFsU3RhdHVzLiBGYWlsdXJlIGlmIG5vdCBjb25uZWN0ZWQKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1HZXRDb25uZWN0UHJvZmlsZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc3JSb2FtQ29ubmVjdGVkUHJvZmlsZSAqcFByb2ZpbGUpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtR2V0Q29ubmVjdFByb2ZpbGUoIHBNYWMsIHNlc3Npb25JZCwgcFByb2ZpbGUgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbUZyZWVDb25uZWN0UHJvZmlsZQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gZnJlZSBhbmQgcmVpbml0aWFsaXplIHRoZQorICAgICAgICAgICBwcm9maWxlIHJldHVybmVkIHByZXZpb3VzbHkgYnkgY3NyUm9hbUdldENvbm5lY3RQcm9maWxlLgorICAgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbC4KKyAgICBccGFyYW0gcFByb2ZpbGUgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbUNvbm5lY3RlZFByb2ZpbGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtRnJlZUNvbm5lY3RQcm9maWxlKHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJvYW1Db25uZWN0ZWRQcm9maWxlICpwUHJvZmlsZSkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgc3RhdHVzID0gY3NyUm9hbUZyZWVDb25uZWN0UHJvZmlsZSggcE1hYywgcFByb2ZpbGUgKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1TZXRQTUtJRENhY2hlCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byByZXR1cm4gdGhlIFBNS0lEIGNhbmRpZGF0ZSBsaXN0CisgICAgVGhpcyBpcyBhIHN5bmNocm9udW91cyBjYWxsLgorICAgIFxwYXJhbSBwUE1LSURDYWNoZSAtIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHBvaW50IHRvIGFuIGFycmF5IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgdFBta2lkQ2FjaGVJbmZvCisgICAgXHBhcmFtIG51bUl0ZW1zIC0gYSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgbnVtYmVyIG9mIHRQbWtpZENhY2hlSW5mbworICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCB3aGVuIHJldHJ1bmluZywgdGhpcyBpcyBlaXRoZXIgdGhlIG51bWJlciBuZWVkZWQKKyAgICAgICAgICAgICAgICAgICAgICBvciBudW1iZXIgb2YgaXRlbXMgcHV0IGludG8gcFBNS0lEQ2FjaGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgYmlnIGVub3VnaCBhbmQgcE51bUl0ZW1zIGhhcyB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgdFBta2lkQ2FjaGVJbmZvLgorICAgIFxOb3RlOiBwTnVtSXRlbXMgaXMgYSBudW1iZXIgb2YgdFBta2lkQ2FjaGVJbmZvLAorICAgICAgICAgICBub3Qgc2l6ZW9mKHRQbWtpZENhY2hlSW5mbykgKiBzb21ldGhpbmcKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1TZXRQTUtJRENhY2hlKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCB0UG1raWRDYWNoZUluZm8gKnBQTUtJRENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG51bUl0ZW1zICkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICAgIHsKKyAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1TZXRQTUtJRENhY2hlKCBwTWFjLCBzZXNzaW9uSWQsIHBQTUtJRENhY2hlLCBudW1JdGVtcyApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgfQorICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Sb2FtR2V0U2VjdXJpdHlSZXFJRQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmVxdWVzdCBDU1IgdG8gcmV0dXJuIHRoZSBXUEEgb3IgUlNOIG9yIFdBUEkgSUUgQ1NSCisgICAgICAgICAgIHBhc3NlcyB0byBQRSB0byBKT0lOIHJlcXVlc3Qgb3IgU1RBUlRfQlNTIHJlcXVlc3QKKyAgICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwuCisgICAgXHBhcmFtIHBMZW4gLSBjYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGhhcyB0aGUgbGVuZ3RoIG9mIHBCdWYgYXMgaW5wdXQuCisgICAgICAgICAgICAgICAgICBVcG9uIHJldHVybmVkLCAqcExlbiBoYXMgdGhlIG5lZWRlZCBvciBJRSBsZW5ndGggaW4gcEJ1Zi4KKyAgICBccGFyYW0gcEJ1ZiAtIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgY29udGFpbiB0aGUgSUUgZmllbGQsIGlmIGFueSwKKyAgICAgICAgICAgICAgICAgIHVwb24gcmV0dXJuCisgICAgXHBhcmFtIHNlY1R5cGUgLSBTcGVjaWZpZXMgd2hldGhlciBsb29raW5nIGZvciBXUEEvV1BBMi9XQVBJIElFCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpZyBlbm91Z2gKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1HZXRTZWN1cml0eVJlcUlFKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRBTklfVTMyICpwTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsIGVDc3JTZWN1cml0eVR5cGUgc2VjVHlwZSkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgc3RhdHVzID0gY3NyUm9hbUdldFdwYVJzblJlcUlFKCBoSGFsLCBzZXNzaW9uSWQsIHBMZW4sIHBCdWYgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1HZXRTZWN1cml0eVJzcElFCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byByZXR1cm4gdGhlIFdQQSBvciBSU04gb3IgV0FQSSBJRSBmcm9tCisgICAgICAgICAgIHRoZSBiZWFjb24gb3IgcHJvYmUgcnNwIGlmIGNvbm5lY3RlZAorICAgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbC4KKyAgICBccGFyYW0gcExlbiAtIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaGFzIHRoZSBsZW5ndGggb2YgcEJ1ZiBhcyBpbnB1dC4KKyAgICAgICAgICAgICAgICAgIFVwb24gcmV0dXJuZWQsICpwTGVuIGhhcyB0aGUgbmVlZGVkIG9yIElFIGxlbmd0aCBpbiBwQnVmLgorICAgIFxwYXJhbSBwQnVmIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBjb250YWluIHRoZSBJRSBmaWVsZCwgaWYgYW55LAorICAgICAgICAgICAgICAgICAgdXBvbiByZXR1cm4KKyAgICBccGFyYW0gc2VjVHlwZSAtIFNwZWNpZmllcyB3aGV0aGVyIGxvb2tpbmcgZm9yIFdQQS9XUEEyL1dBUEkgSUUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgYmlnIGVub3VnaAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbUdldFNlY3VyaXR5UnNwSUUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwgdEFOSV9VMzIgKnBMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwgZUNzclNlY3VyaXR5VHlwZSBzZWNUeXBlKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgeworICAgICAgICBpZiggQ1NSX0lTX1NFU1NJT05fVkFMSUQoIHBNYWMsIHNlc3Npb25JZCApICkKKyAgICAgICAgeworICAgICAgICAgICBzdGF0dXMgPSBjc3JSb2FtR2V0V3BhUnNuUnNwSUUoIHBNYWMsIHNlc3Npb25JZCwgcExlbiwgcEJ1ZiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7CisKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1HZXROdW1QTUtJRENhY2hlCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0byByZXF1ZXN0IENTUiB0byByZXR1cm4gbnVtYmVyIG9mIFBNS0lEIGNhY2hlCisgICAgICAgICAgIGVudHJpZXMKKyAgICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwuCisgICAgXHJldHVybiB0QU5JX1UzMiAtIHRoZSBudW1iZXIgb2YgUE1LSUQgY2FjaGUgZW50cmllcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9VMzIgc21lX1JvYW1HZXROdW1QTUtJRENhY2hlKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHRBTklfVTMyIG51bVBta2lkQ2FjaGUgPSAwOworCisgICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGlmKCBDU1JfSVNfU0VTU0lPTl9WQUxJRCggcE1hYywgc2Vzc2lvbklkICkgKQorICAgICAgICB7CisgICAgICAgICAgIG51bVBta2lkQ2FjaGUgPSBjc3JSb2FtR2V0TnVtUE1LSURDYWNoZSggcE1hYywgc2Vzc2lvbklkICk7CisgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAobnVtUG1raWRDYWNoZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbUdldFBNS0lEQ2FjaGUKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHJlcXVlc3QgQ1NSIHRvIHJldHVybiBQTUtJRCBjYWNoZSBmcm9tIENTUgorICAgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbC4KKyAgICBccGFyYW0gcE51bSAtIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaGFzIHRoZSBzcGFjZSBvZiB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICBwQnVmIHRQbWtpZENhY2hlSW5mbyBhcyBpbnB1dC4gVXBvbiByZXR1cm5lZCwgKnBOdW0gaGFzIHRoZQorICAgICAgICAgICAgICAgICAgbmVlZGVkIG9yIGFjdHVhbGx5IG51bWJlciBpbiB0UG1raWRDYWNoZUluZm8uCisgICAgXHBhcmFtIHBQbWtpZENhY2hlIC0gQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBjb250YWlucyBQTUtJRCBjYWNoZSwgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbnksIHVwb24gcmV0dXJuCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gd2hlbiBmYWlsLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgYWxsb2NhdGVkIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpZyBlbm91Z2gKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JvYW1HZXRQTUtJRENhY2hlKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRBTklfVTMyICpwTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBta2lkQ2FjaGVJbmZvICpwUG1raWRDYWNoZSkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgICAgeworICAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1HZXRQTUtJRENhY2hlKCBwTWFjLCBzZXNzaW9uSWQsIHBOdW0sIHBQbWtpZENhY2hlICk7CisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgfQorICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9HZXRDb25maWdQYXJhbQorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBIREQgY2FsbHMgdG8gZ2V0IHRoZSBnbG9iYWwgc2V0dGluZ3MKKyAgICAgICAgICAgY3VycmVudGx5IG1haW50YWluZWQgYnkgQ1NSLgorICAgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbC4KKyAgICBccGFyYW0gcFBhcmFtIC0gY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0dldENvbmZpZ1BhcmFtKHRIYWxIYW5kbGUgaEhhbCwgdFNtZUNvbmZpZ1BhcmFtcyAqcFBhcmFtKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIHN0YXR1cyA9IGNzckdldENvbmZpZ1BhcmFtKHBNYWMsICZwUGFyYW0tPmNzckNvbmZpZyk7CisgICAgICBpZiAoc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICB7CisgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICIlcyBjc3JHZXRDb25maWdQYXJhbSBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisgICAgICBzdGF0dXMgPSBwMnBHZXRDb25maWdQYXJhbShwTWFjLCAmcFBhcmFtLT5wMnBDb25maWcpOworICAgICAgaWYgKHN0YXR1cyAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgeworICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiJXMgcDJwR2V0Q29uZmlnUGFyYW0gZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgfQorI2VuZGlmCisgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0NmZ1NldEludAorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBIREQgY2FsbHMgdG8gc2V0IHBhcmFtZXRlcnMgaW4gQ0ZHLgorICAgIFRoaXMgaXMgYSBzeW5jaHJvbnVvdXMgY2FsbC4KKyAgICBccGFyYW0gY2ZnSWQgLSBDb25maWd1cmF0aW9uIFBhcmFtZXRlciBJRCAodHlwZSkgZm9yIFNUQS4KKyAgICBccGFyYW0gY2NtVmFsdWUgLSBUaGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBDb25maWd1cmF0aW9uIFBhcmFtZXRlciBJRAorICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIG5lZWRzIHRvIGJlIHNhdmVkIGluIENGRworICAgIFxwYXJhbSBjYWxsYmFjayAtIFRvIGJlIHJlZ2lzdGVyZWQgYnkgQ1NSIHdpdGggQ0NNLiBPbmNlIHRoZSBDRkcgZG9uZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgc2F2aW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZGF0YWJhc2UsIGl0IG5vdGlmaWVzIENDTSAmCisgICAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIHRvIG5vdGlmeS4KKyAgICBccGFyYW0gdG9CZVNhdmVkIC0gVG8gc2F2ZSB0aGUgcmVxdWVzdCBmb3IgZnV0dXJlIHJlZmVyZW5jZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfQ2ZnU2V0SW50KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VMzIgY2ZnSWQsIHRBTklfVTMyIGNjbVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRDY21DZmdTZXRDYWxsYmFjayBjYWxsYmFjaywgZUFuaUJvb2xlYW4gdG9CZVNhdmVkKQoreworICAgcmV0dXJuKGNjbUNmZ1NldEludChoSGFsLCBjZmdJZCwgY2NtVmFsdWUsIGNhbGxiYWNrLCB0b0JlU2F2ZWQpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9DZmdTZXRTdHIKKyAgICBcYnJpZWYgYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgSEREIGNhbGxzIHRvIHNldCBwYXJhbWV0ZXJzIGluIENGRy4KKyAgICBUaGlzIGlzIGEgc3luY2hyb251b3VzIGNhbGwuCisgICAgXHBhcmFtIGNmZ0lkIC0gQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgSUQgKHR5cGUpIGZvciBTVEEuCisgICAgXHBhcmFtIHBTdHIgLSBQb2ludGVyIHRvIHRoZSBieXRlIGFycmF5IHdoaWNoIGNhcnJpZXMgdGhlIGluZm9ybWF0aW9uIG5lZWRzCisgICAgICAgICAgICAgICAgICB0byBiZSBzYXZlZCBpbiBDRkcKKyAgICBccGFyYW0gbGVuZ3RoIC0gTGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHNhdmVkCisgICAgXHBhcmFtIGNhbGxiYWNrIC0gVG8gYmUgcmVnaXN0ZXJlZCBieSBDU1Igd2l0aCBDQ00uIE9uY2UgdGhlIENGRyBkb25lIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICBzYXZpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZSwgaXQgbm90aWZpZXMgQ0NNICYKKyAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgdG8gbm90aWZ5LgorICAgIFxwYXJhbSB0b0JlU2F2ZWQgLSBUbyBzYXZlIHRoZSByZXF1ZXN0IGZvciBmdXR1cmUgcmVmZXJlbmNlCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9DZmdTZXRTdHIodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1UzMiBjZmdJZCwgdEFOSV9VOCAqcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBsZW5ndGgsIHRDY21DZmdTZXRDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlQW5pQm9vbGVhbiB0b0JlU2F2ZWQpCit7CisgICByZXR1cm4oY2NtQ2ZnU2V0U3RyKGhIYWwsIGNmZ0lkLCBwU3RyLCBsZW5ndGgsIGNhbGxiYWNrLCB0b0JlU2F2ZWQpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9HZXRNb2RpZnlQcm9maWxlRmllbGRzCisgICAgXGJyaWVmIEhERCBvciBTTUUgLSBRT1MgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgdmFsdWVzIG9mCisgICAgY29ubmVjdGVkIHByb2ZpbGUgZmllbGRzLCBjaGFuZ2luZyB3aGljaCBjYW4gY2F1c2UgcmVhc3NvYy4KKyAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIENGRyBpcyBkb3dubG9hZGVkIGFuZCBTVEEgaXMgaW4gY29ubmVjdGVkCisgICAgc3RhdGUuIEFsc28sIG1ha2Ugc3VyZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHByb2ZpbGUKKyAgICBmaWVsZHMgYmVmb3JlIGNhbGxpbmcgdGhlIHJlYXNzb2MuIFNvIHRoYXQgcE1vZGlmeVByb2ZpbGVGaWVsZHMgd2lsbCBoYXZlCisgICAgYWxsIHRoZSBsYXRlc3QgdmFsdWVzIHBsdXMgdGhlIG9uZShzKSBoYXMgYmVlbiB1cGRhdGVkIGFzIHBhcnQgb2YgcmVhc3NvYworICAgIHJlcXVlc3QuCisgICAgXHBhcmFtIHBNb2RpZnlQcm9maWxlRmllbGRzIC0gcG9pbnRlciB0byB0aGUgY29ubmVjdGVkIHByb2ZpbGUgZmllbGRzCisgICAgY2hhbmdpbmcgd2hpY2ggY2FuIGNhdXNlIHJlYXNzb2MKKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0dldE1vZGlmeVByb2ZpbGVGaWVsZHModEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbU1vZGlmeVByb2ZpbGVGaWVsZHMgKiBwTW9kaWZ5UHJvZmlsZUZpZWxkcykKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgaWYoIENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSApCisgICAgICAgeworICAgICAgICAgIHN0YXR1cyA9IGNzckdldE1vZGlmeVByb2ZpbGVGaWVsZHMocE1hYywgc2Vzc2lvbklkLCBwTW9kaWZ5UHJvZmlsZUZpZWxkcyk7CisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgfQorICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NldENvbmZpZ1Bvd2VyU2F2ZQorICAgIFxicmllZiAgV3JhcHBlciBmbiB0byBjaGFuZ2UgcG93ZXIgc2F2ZSBjb25maWd1cmF0aW9uIGluIFNNRSAoUE1DKSBtb2R1bGUuCisgICAgICAgICAgICBGb3IgQk1QUyByZWxhdGVkIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gYWxzbyB1cGRhdGVzIHRoZSBDRkcKKyAgICAgICAgICAgIGFuZCBzZW5kcyBhIG1lc3NhZ2UgdG8gRlcgdG8gcGljayB1cCB0aGUgbmV3IHZhbHVlcy4gTm90ZTogQ2FsbGluZworICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBvbmx5IHVwZGF0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGRvZXMgbm90IGVuYWJsZQorICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwb3dlciBzYXZlIG1vZGUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcHNNb2RlIC0gUG93ZXIgU2F2aW5nIG1vZGUgYmVpbmcgbW9kaWZpZWQKKyAgICBccGFyYW0gIHBDb25maWdQYXJhbXMgLSBhIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0eXBlCisgICAgICAgICAgICB0UG1jU21wc0NvbmZpZ1BhcmFtcyBvciB0UG1jQm1wc0NvbmZpZ1BhcmFtcyBvciB0UG1jSW1wc0NvbmZpZ1BhcmFtcworICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRDb25maWdQb3dlclNhdmUodEhhbEhhbmRsZSBoSGFsLCB0UG1jUG93ZXJTYXZpbmdNb2RlIHBzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ29uZmlnUGFyYW1zKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIGlmIChOVUxMID09IHBDb25maWdQYXJhbXMgKSB7CisgICAgICBzbXNMb2coIHBNYWMsIExPR0UsICJFbXB0eSBjb25maWcgcGFyYW0gc3RydWN0dXJlIGZvciBQTUMsICIKKyAgICAgICAgICAgICAgIm5vdGhpbmcgdG8gdXBkYXRlIik7CisgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIH0KKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY1NldENvbmZpZ1Bvd2VyU2F2ZShoSGFsLCBwc01vZGUsIHBDb25maWdQYXJhbXMpOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0dldENvbmZpZ1Bvd2VyU2F2ZQorICAgIFxicmllZiAgV3JhcHBlciBmbiB0byByZXRyaWV2ZSBwb3dlciBzYXZlIGNvbmZpZ3VyYXRpb24gaW4gU01FIChQTUMpIG1vZHVsZQorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBzTW9kZSAtIFBvd2VyIFNhdmluZyBtb2RlCisgICAgXHBhcmFtICBwQ29uZmlnUGFyYW1zIC0gYSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdHlwZQorICAgICAgICAgICAgdFBtY1NtcHNDb25maWdQYXJhbXMgb3IgdFBtY0JtcHNDb25maWdQYXJhbXMgb3IgdFBtY0ltcHNDb25maWdQYXJhbXMKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0Q29uZmlnUG93ZXJTYXZlKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENvbmZpZ1BhcmFtcykKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBpZiAoTlVMTCA9PSBwQ29uZmlnUGFyYW1zICkgeworICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiRW1wdHkgY29uZmlnIHBhcmFtIHN0cnVjdHVyZSBmb3IgUE1DLCAiCisgICAgICAgICAgICAgICJub3RoaW5nIHRvIHVwZGF0ZSIpOworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgICBzdGF0dXMgPSBwbWNHZXRDb25maWdQb3dlclNhdmUoaEhhbCwgcHNNb2RlLCBwQ29uZmlnUGFyYW1zKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NpZ25hbFBvd2VyRXZlbnQKKyAgICBcYnJpZWYgIFNpZ25hbHMgdG8gUE1DIHRoYXQgYSBwb3dlciBldmVudCBoYXMgb2NjdXJyZWQuIFVzZWQgZm9yIHB1dHRpbmcKKyAgICAgICAgICAgIHRoZSBjaGlwIGludG8gZGVlcCBzbGVlcCBtb2RlLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGV2ZW50IC0gdGhlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TaWduYWxQb3dlckV2ZW50ICh0SGFsSGFuZGxlIGhIYWwsIHRQbWNQb3dlckV2ZW50IGV2ZW50KQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgICBzdGF0dXMgPSBwbWNTaWduYWxQb3dlckV2ZW50KGhIYWwsIGV2ZW50KTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0VuYWJsZVBvd2VyU2F2ZQorICAgIFxicmllZiAgRW5hYmxlcyBvbmUgb2YgdGhlIHBvd2VyIHNhdmluZyBtb2Rlcy4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwc01vZGUgLSBUaGUgcG93ZXIgc2F2aW5nIG1vZGUgdG8gZW5hYmxlLiBJZiBCTVBTIG1vZGUgaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgd2hpbGUgdGhlIGNoaXAgaXMgb3BlcmF0aW5nIGluIEZ1bGwgUG93ZXIsIFBNQyB3aWxsIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICBhIHRpbWVyIHRoYXQgd2lsbCB0cnkgdG8gcHV0IHRoZSBjaGlwIGluIEJNUFMgbW9kZSBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgZXhwaXJ5LgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfRW5hYmxlUG93ZXJTYXZlICh0SGFsSGFuZGxlIGhIYWwsIHRQbWNQb3dlclNhdmluZ01vZGUgcHNNb2RlKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgICBzdGF0dXMgPSAgcG1jRW5hYmxlUG93ZXJTYXZlKGhIYWwsIHBzTW9kZSk7CisgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9EaXNhYmxlUG93ZXJTYXZlCisgICAgXGJyaWVmICAgRGlzYWJsZXMgb25lIG9mIHRoZSBwb3dlciBzYXZpbmcgbW9kZXMuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcHNNb2RlIC0gVGhlIHBvd2VyIHNhdmluZyBtb2RlIHRvIGRpc2FibGUuIERpc2FibGluZyBkb2VzIG5vdCBpbXBseQorICAgICAgICAgICAgICAgICAgICAgdGhhdCBkZXZpY2Ugd2lsbCBiZSBicm91Z2h0IG91dCBvZiB0aGUgY3VycmVudCBQUyBtb2RlLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICBpcyBwdXJlbHkgYSBjb25maWd1cmF0aW9uIEFQSS4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0Rpc2FibGVQb3dlclNhdmUgKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY0Rpc2FibGVQb3dlclNhdmUoaEhhbCwgcHNNb2RlKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworIH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TdGFydEF1dG9CbXBzVGltZXIKKyAgICBcYnJpZWYgIFN0YXJ0cyBhIHRpbWVyIHRoYXQgcGVyaW9kaWNhbGx5IHBvbGxzIGFsbCB0aGUgcmVnaXN0ZXJlZAorICAgICAgICAgICAgbW9kdWxlIGZvciBlbnRyeSBpbnRvIEJtcHMgbW9kZS4gVGhpcyB0aW1lciBpcyBzdGFydGVkIG9ubHkgaWYgQk1QUyBpcworICAgICAgICAgICAgZW5hYmxlZCBhbmQgd2hlbmV2ZXIgdGhlIGRldmljZSBpcyBpbiBmdWxsIHBvd2VyLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1N0YXJ0QXV0b0JtcHNUaW1lciAoIHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgc3RhdHVzID0gcG1jU3RhcnRBdXRvQm1wc1RpbWVyKGhIYWwpOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1N0b3BBdXRvQm1wc1RpbWVyCisgICAgXGJyaWVmICBTdG9wcyB0aGUgQXV0byBCTVBTIFRpbWVyIHRoYXQgd2FzIHN0YXJ0ZWQgdXNpbmcgc21lX3N0YXJ0QXV0b0JtcHNUaW1lcgorICAgICAgICAgICAgU3RvcHBpbmcgdGhlIHRpbWVyIGRvZXMgbm90IGNhdXNlIGEgZGV2aWNlIHN0YXRlIGNoYW5nZS4gT25seSB0aGUgdGltZXIKKyAgICAgICAgICAgIGlzIHN0b3BwZWQuIElmICJGdWxsIFBvd2VyIiBpcyBkZXNpcmVkLCB1c2UgdGhlIHNtZV9SZXF1ZXN0RnVsbFBvd2VyIEFQSQorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1N0b3BBdXRvQm1wc1RpbWVyICggdEhhbEhhbmRsZSBoSGFsKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgICBzdGF0dXMgPSBwbWNTdG9wQXV0b0JtcHNUaW1lcihoSGFsKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9RdWVyeVBvd2VyU3RhdGUKKyAgICBcYnJpZWYgIFJldHVybnMgdGhlIGN1cnJlbnQgcG93ZXIgc3RhdGUgb2YgdGhlIGRldmljZS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtIHBQb3dlclN0YXRlIC0gcG9pbnRlciB0byBsb2NhdGlvbiB0byByZXR1cm4gcG93ZXIgc3RhdGUgKExPVyBvciBISUdIKQorICAgIFxwYXJhbSBwU3dXbGFuU3dpdGNoU3RhdGUgLSBwdHIgdG8gbG9jYXRpb24gdG8gcmV0dXJuIFNXIFdMQU4gU3dpdGNoIHN0YXRlCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9RdWVyeVBvd2VyU3RhdGUgKAorICAgdEhhbEhhbmRsZSBoSGFsLAorICAgdFBtY1Bvd2VyU3RhdGUgKnBQb3dlclN0YXRlLAorICAgdFBtY1N3aXRjaFN0YXRlICpwU3dXbGFuU3dpdGNoU3RhdGUpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY1F1ZXJ5UG93ZXJTdGF0ZSAoaEhhbCwgcFBvd2VyU3RhdGUsIE5VTEwsIHBTd1dsYW5Td2l0Y2hTdGF0ZSk7CisgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Jc1Bvd2VyU2F2ZUVuYWJsZWQKKyAgICBcYnJpZWYgIENoZWNrcyBpZiB0aGUgZGV2aWNlIGlzIGFibGUgdG8gZW50ZXIgYSBwYXJ0aWN1bGFyIHBvd2VyIHNhdmUgbW9kZQorICAgICAgICAgICAgVGhpcyBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZSBkZXZpY2UgaXMgaW4gYSBwYXJ0aWN1bGFyIFBTIG1vZGUKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtIHBzTW9kZSAtIHRoZSBwb3dlciBzYXZpbmcgbW9kZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9CT09MRUFOIHNtZV9Jc1Bvd2VyU2F2ZUVuYWJsZWQgKHRIYWxIYW5kbGUgaEhhbCwgdFBtY1Bvd2VyU2F2aW5nTW9kZSBwc01vZGUpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgIHRBTklfQk9PTEVBTiByZXN1bHQgPSBmYWxzZTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHJlc3VsdCA9IHBtY0lzUG93ZXJTYXZlRW5hYmxlZChoSGFsLCBwc01vZGUpOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgICAgIHJldHVybiByZXN1bHQ7CisgICB9CisKKyAgIHJldHVybiBmYWxzZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9SZXF1ZXN0RnVsbFBvd2VyCisgICAgXGJyaWVmICBSZXF1ZXN0IHRoYXQgdGhlIGRldmljZSBiZSBicm91Z2h0IHRvIGZ1bGwgcG93ZXIgc3RhdGUuIFdoZW4gdGhlCisgICAgICAgICAgICBkZXZpY2UgZW50ZXJzIEZ1bGwgUG93ZXIgUE1DIHdpbGwgc3RhcnQgYSBCTVBTIHRpbWVyIGlmIEJNUFMgUFMgbW9kZQorICAgICAgICAgICAgaXMgZW5hYmxlZC4gT24gdGltZXIgZXhwaXJ5IFBNQyB3aWxsIGF0dGVtcHQgdG8gcHV0IHRoZSBkZXZpY2UgaW4KKyAgICAgICAgICAgIEJNUFMgbW9kZSBpZiBmb2xsb3dpbmcgaG9sZHMgdHJ1ZToKKyAgICAgICAgICAgIC0gQk1QUyBtb2RlIGlzIGVuYWJsZWQKKyAgICAgICAgICAgIC0gUG9sbGluZyBvZiBhbGwgbW9kdWxlcyB0aHJvdWdoIHRoZSBQb3dlciBTYXZlIENoZWNrIHJvdXRpbmUgcGFzc2VzCisgICAgICAgICAgICAtIFNUQSBpcyBhc3NvY2lhdGVkIHRvIGFuIGFjY2VzcyBwb2ludAorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIC0gY2FsbGJhY2tSb3V0aW5lIENhbGxiYWNrIHJvdXRpbmUgaW52b2tlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MvZmFpbHVyZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAtIHN0YXR1cworICAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gZGV2aWNlIGJyb3VnaHQgdG8gZnVsbCBwb3dlciBzdGF0ZQorICAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gZGV2aWNlIGNhbm5vdCBiZSBicm91Z2h0IHRvIGZ1bGwgcG93ZXIgc3RhdGUKKyAgICAgZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgLSBkZXZpY2UgaXMgYmVpbmcgYnJvdWdodCB0byBmdWxsIHBvd2VyIHN0YXRlLAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUmVxdWVzdEZ1bGxQb3dlciAoCisgICB0SGFsSGFuZGxlIGhIYWwsCisgICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyksCisgICB2b2lkICpjYWxsYmFja0NvbnRleHQsCisgICB0UmVxdWVzdEZ1bGxQb3dlclJlYXNvbiBmdWxsUG93ZXJSZWFzb24pCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY1JlcXVlc3RGdWxsUG93ZXIoaEhhbCwgY2FsbGJhY2tSb3V0aW5lLCBjYWxsYmFja0NvbnRleHQsIGZ1bGxQb3dlclJlYXNvbik7CisgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9SZXF1ZXN0Qm1wcworICAgIFxicmllZiAgUmVxdWVzdCB0aGF0IHRoZSBkZXZpY2UgYmUgcHV0IGluIEJNUFMgc3RhdGUuIFJlcXVlc3Qgd2lsbCBiZQorICAgICAgICAgICAgYWNjZXB0ZWQgb25seSBpZiBCTVBTIG1vZGUgaXMgZW5hYmxlZCBhbmQgcG93ZXIgc2F2ZSBjaGVjayByb3V0aW5lCisgICAgICAgICAgICBwYXNzZXMuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgLSBjYWxsYmFja1JvdXRpbmUgQ2FsbGJhY2sgcm91dGluZSBpbnZva2VkIGluIGNhc2Ugb2Ygc3VjY2Vzcy9mYWlsdXJlCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gZGV2aWNlIGlzIGluIEJNUFMgc3RhdGUKKyAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBkZXZpY2UgY2Fubm90IGJlIGJyb3VnaHQgdG8gQk1QUyBzdGF0ZQorICAgICAgZUhBTF9TVEFUVVNfUE1DX1BFTkRJTkcgLSBkZXZpY2UgaXMgYmVpbmcgYnJvdWdodCB0byBCTVBTIHN0YXRlCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9SZXF1ZXN0Qm1wcyAoCisgICB0SGFsSGFuZGxlIGhIYWwsCisgICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyksCisgICB2b2lkICpjYWxsYmFja0NvbnRleHQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY1JlcXVlc3RCbXBzKGhIYWwsIGNhbGxiYWNrUm91dGluZSwgY2FsbGJhY2tDb250ZXh0KTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiAgc21lX1NldERIQ1BUaWxsUG93ZXJBY3RpdmVGbGFnCisgICAgXGJyaWVmICBTZXRzL0NsZWFycyBESENQIHJlbGF0ZWQgZmxhZyBpbiBQTUMgdG8gZGlzYWJsZS9lbmFibGUgYXV0byBCTVBTIAorICAgICAgICAgICAgZW50cnkgYnkgUE1DIAorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgIHNtZV9TZXRESENQVGlsbFBvd2VyQWN0aXZlRmxhZyh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggZmxhZykKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICAvLyBTZXQvQ2xlYXIgdGhlIERIQ1AgZmxhZyB3aGljaCB3aWxsIGRpc2FibGUvZW5hYmxlIGF1dG8gQk1QUyBlbnRlcnkgYnkgUE1DCisgICBwTWFjLT5wbWMucmVtYWluSW5Qb3dlckFjdGl2ZVRpbGxESENQID0gZmxhZzsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1N0YXJ0VWFwc2QKKyAgICBcYnJpZWYgIFJlcXVlc3QgdGhhdCB0aGUgZGV2aWNlIGJlIHB1dCBpbiBVQVBTRCBzdGF0ZS4gSWYgdGhlIGRldmljZSBpcyBpbgorICAgICAgICAgICAgRnVsbCBQb3dlciBpdCB3aWxsIGJlIHB1dCBpbiBCTVBTIG1vZGUgZmlyc3QgYW5kIHRoZW4gaW50byBVQVBTRAorICAgICAgICAgICAgbW9kZS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICAtIGNhbGxiYWNrUm91dGluZSBDYWxsYmFjayByb3V0aW5lIGludm9rZWQgaW4gY2FzZSBvZiBzdWNjZXNzL2ZhaWx1cmUKKyAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBkZXZpY2UgaXMgaW4gVUFQU0Qgc3RhdGUKKyAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBkZXZpY2UgY2Fubm90IGJlIGJyb3VnaHQgdG8gVUFQU0Qgc3RhdGUKKyAgICAgIGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HIC0gZGV2aWNlIGlzIGJlaW5nIGJyb3VnaHQgdG8gVUFQU0Qgc3RhdGUKKyAgICAgIGVIQUxfU1RBVFVTX1BNQ19ESVNBQkxFRCAtIFVBUFNEIGlzIGRpc2FibGVkIG9yIEJNUFMgbW9kZSBpcyBkaXNhYmxlZAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU3RhcnRVYXBzZCAoCisgICB0SGFsSGFuZGxlIGhIYWwsCisgICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyksCisgICB2b2lkICpjYWxsYmFja0NvbnRleHQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY1N0YXJ0VWFwc2QoaEhhbCwgY2FsbGJhY2tSb3V0aW5lLCBjYWxsYmFja0NvbnRleHQpOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7CisgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1N0b3BVYXBzZAorICAgIFxicmllZiAgUmVxdWVzdCB0aGF0IHRoZSBkZXZpY2UgYmUgcHV0IG91dCBvZiBVQVBTRCBzdGF0ZS4gRGV2aWNlIHdpbGwgYmUKKyAgICAgICAgICAgIHB1dCBpbiBpbiBCTVBTIHN0YXRlIGFmdGVyIHN0b3AgVUFQU0QgY29tcGxldGVzLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBkZXZpY2UgaXMgcHV0IG91dCBvZiBVQVBTRCBhbmQgYmFjayBpbiBCTVBTIHN0YXRlCisgICAgICBlSEFMX1NUQVRVU19GQUlMVVJFIC0gZGV2aWNlIGNhbm5vdCBiZSBicm91Z2h0IG91dCBvZiBVQVBTRCBzdGF0ZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU3RvcFVhcHNkICh0SGFsSGFuZGxlIGhIYWwpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY1N0b3BVYXBzZChoSGFsKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JlcXVlc3RTdGFuZGJ5CisgICAgXGJyaWVmICBSZXF1ZXN0IHRoYXQgdGhlIGRldmljZSBiZSBwdXQgaW4gc3RhbmRieS4gSXQgaXMgSEREJ3MgcmVzcG9uc2liaWxpdHkKKyAgICAgICAgICAgIHRvIGJyaW5nIHRoZSBjaGlwIHRvIGZ1bGwgcG93ZXIgYW5kIGRvIGEgZGlzYXNzb2MgYmVmb3JlIGNhbGxpbmcKKyAgICAgICAgICAgIHRoaXMgQVBJLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIC0gY2FsbGJhY2tSb3V0aW5lIENhbGxiYWNrIHJvdXRpbmUgaW52b2tlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MvZmFpbHVyZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIGRldmljZSBpcyBpbiBTdGFuZGJ5IG1vZGUKKyAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBkZXZpY2UgY2Fubm90IGJlIHB1dCBpbiBzdGFuZGJ5IG1vZGUKKyAgICAgIGVIQUxfU1RBVFVTX1BNQ19QRU5ESU5HIC0gZGV2aWNlIGlzIGJlaW5nIHB1dCBpbiBzdGFuZGJ5IG1vZGUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JlcXVlc3RTdGFuZGJ5ICgKKyAgIHRIYWxIYW5kbGUgaEhhbCwKKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIGVIYWxTdGF0dXMgc3RhdHVzKSwKKyAgIHZvaWQgKmNhbGxiYWNrQ29udGV4dCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzbXNMb2coIHBNYWMsIExPRzEsIEZMKCIiKSApOworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY1JlcXVlc3RTdGFuZGJ5KGhIYWwsIGNhbGxiYWNrUm91dGluZSwgY2FsbGJhY2tDb250ZXh0KTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JlZ2lzdGVyUG93ZXJTYXZlQ2hlY2sKKyAgICBcYnJpZWYgIFJlZ2lzdGVyIGEgcG93ZXIgc2F2ZSBjaGVjayByb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyCisgICAgICAgICAgICB0aGUgZGV2aWNlIGlzIGFib3V0IHRvIGVudGVyIG9uZSBvZiB0aGUgcG93ZXIgc2F2ZSBtb2Rlcy4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBjaGVja1JvdXRpbmUgLSAgUG93ZXIgc2F2ZSBjaGVjayByb3V0aW5lIHRvIGJlIHJlZ2lzdGVyZWQKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZAorICAgICAgICAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIG5vdCBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUmVnaXN0ZXJQb3dlclNhdmVDaGVjayAoCisgICB0SGFsSGFuZGxlIGhIYWwsCisgICB0QU5JX0JPT0xFQU4gKCpjaGVja1JvdXRpbmUpICh2b2lkICpjaGVja0NvbnRleHQpLCB2b2lkICpjaGVja0NvbnRleHQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY1JlZ2lzdGVyUG93ZXJTYXZlQ2hlY2sgKGhIYWwsIGNoZWNrUm91dGluZSwgY2hlY2tDb250ZXh0KTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0RlcmVnaXN0ZXJQb3dlclNhdmVDaGVjaworICAgIFxicmllZiAgRGVyZWdpc3RlciBhIHBvd2VyIHNhdmUgY2hlY2sgcm91dGluZQorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGNoZWNrUm91dGluZSAtICBQb3dlciBzYXZlIGNoZWNrIHJvdXRpbmUgdG8gYmUgZGVyZWdpc3RlcmVkCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzc2Z1bGx5IGRlcmVnaXN0ZXJlZAorICAgICAgICAgICAgZUhBTF9TVEFUVVNfRkFJTFVSRSAtIG5vdCBzdWNjZXNzZnVsbHkgZGVyZWdpc3RlcmVkCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9EZXJlZ2lzdGVyUG93ZXJTYXZlQ2hlY2sgKAorICAgdEhhbEhhbmRsZSBoSGFsLAorICAgdEFOSV9CT09MRUFOICgqY2hlY2tSb3V0aW5lKSAodm9pZCAqY2hlY2tDb250ZXh0KSkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgc3RhdHVzID0gcG1jRGVyZWdpc3RlclBvd2VyU2F2ZUNoZWNrIChoSGFsLCBjaGVja1JvdXRpbmUpOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZAorICAgIFxicmllZiAgUmVnaXN0ZXIgYSBjYWxsYmFjayByb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyCisgICAgICAgICAgICB0aGUgZGV2aWNlIGVudGVycyBhIG5ldyBkZXZpY2Ugc3RhdGUgKEZ1bGwgUG93ZXIsIEJNUFMsIFVBUFNEKQorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGNhbGxiYWNrUm91dGluZSAtICBDYWxsYmFjayByb3V0aW5lIHRvIGJlIHJlZ2lzdGVyZWQKKyAgICBccGFyYW0gIGNhbGxiYWNrQ29udGV4dCAtICBDb29raWUgdG8gYmUgcGFzc2VkIGJhY2sgZHVyaW5nIGNhbGxiYWNrCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgICAgICAgICAgICBlSEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBub3Qgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1JlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQgKAorICAgdEhhbEhhbmRsZSBoSGFsLAorICAgdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCwgdFBtY1N0YXRlIHBtY1N0YXRlKSwKKyAgIHZvaWQgKmNhbGxiYWNrQ29udGV4dCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgc3RhdHVzID0gcG1jUmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCAoaEhhbCwgY2FsbGJhY2tSb3V0aW5lLCBjYWxsYmFja0NvbnRleHQpOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfRGVyZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kCisgICAgXGJyaWVmICBEZXJlZ2lzdGVyIGEgcm91dGluZSB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBkZXZpY2Ugc3RhdGUgY2hhbmdlcworICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGNhbGxiYWNrUm91dGluZSAtICBDYWxsYmFjayByb3V0aW5lIHRvIGJlIGRlcmVnaXN0ZXJlZAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3NmdWxseSBkZXJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgLSBub3Qgc3VjY2Vzc2Z1bGx5IGRlcmVnaXN0ZXJlZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfRGVyZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kICgKKyAgIHRIYWxIYW5kbGUgaEhhbCwKKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQsIHRQbWNTdGF0ZSBwbWNTdGF0ZSkpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY0RlcmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCAoaEhhbCwgY2FsbGJhY2tSb3V0aW5lKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1dvd2xBZGRCY2FzdFBhdHRlcm4KKyAgICBcYnJpZWYgIEFkZCBhIHBhdHRlcm4gZm9yIFBhdHRlcm4gQnl0ZSBNYXRjaGluZyBpbiBXb3dsIG1vZGUuIEZpcm13YXJlIHdpbGwKKyAgICAgICAgICAgIGRvIGEgcGF0dGVybiBtYXRjaCBvbiB0aGVzZSBwYXR0ZXJucyB3aGVuIFdvd2wgaXMgZW5hYmxlZCBkdXJpbmcgQk1QUworICAgICAgICAgICAgbW9kZS4gTm90ZSB0aGF0IEZpcm13YXJlIHBlcmZvcm1zIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIG9ubHkgb24KKyAgICAgICAgICAgIGJyb2FkY2FzdCBmcmFtZXMgYW5kIHdoaWxlIExpYnJhIGlzIGluIEJNUFMgbW9kZS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwYXR0ZXJuIC0gIFBhdHRlcm4gdG8gYmUgYWRkZWQKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgIENhbm5vdCBhZGQgcGF0dGVybgorICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAgUmVxdWVzdCBhY2NlcHRlZC4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1dvd2xBZGRCY2FzdFBhdHRlcm4gKAorICAgdEhhbEhhbmRsZSBoSGFsLAorICAgdHBTaXJXb3dsQWRkQmNhc3RQdHJuIHBhdHRlcm4pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgeworICAgICAgIHN0YXR1cyA9IHBtY1dvd2xBZGRCY2FzdFBhdHRlcm4gKGhIYWwsIHBhdHRlcm4pOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Xb3dsRGVsQmNhc3RQYXR0ZXJuCisgICAgXGJyaWVmICBEZWxldGUgYSBwYXR0ZXJuIHRoYXQgd2FzIGFkZGVkIGZvciBQYXR0ZXJuIEJ5dGUgTWF0Y2hpbmcuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcGF0dGVybiAtICBQYXR0ZXJuIHRvIGJlIGRlbGV0ZWQKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgIENhbm5vdCBkZWxldGUgcGF0dGVybgorICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAgUmVxdWVzdCBhY2NlcHRlZC4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1dvd2xEZWxCY2FzdFBhdHRlcm4gKAorICAgdEhhbEhhbmRsZSBoSGFsLAorICAgdHBTaXJXb3dsRGVsQmNhc3RQdHJuIHBhdHRlcm4pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgeworICAgICAgIHN0YXR1cyA9IHBtY1dvd2xEZWxCY2FzdFBhdHRlcm4gKGhIYWwsIHBhdHRlcm4pOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9FbnRlcldvd2wKKyAgICBcYnJpZWYgIFRoaXMgaXMgdGhlIFNNRSBBUEkgZXhwb3NlZCB0byBIREQgdG8gcmVxdWVzdCBlbmFibGluZyBvZiBXT1dMIG1vZGUuCisgICAgICAgICAgICBXb1dMQU4gd29ya3Mgb24gdG9wIG9mIEJNUFMgbW9kZS4gSWYgdGhlIGRldmljZSBpcyBub3QgaW4gQk1QUyBtb2RlLAorICAgICAgICAgICAgU01FIHdpbGwgd2lsbCBjYWNoZSB0aGUgaW5mb3JtYXRpb24gdGhhdCBXT1dMIGhhcyBiZWVuIGVuYWJsZWQgYW5kCisgICAgICAgICAgICBhdHRlbXB0IHRvIHB1dCB0aGUgZGV2aWNlIGluIEJNUFMuIE9uIGVudHJ5IGludG8gQk1QUywgU01FIHdpbGwKKyAgICAgICAgICAgIGVuYWJsZSB0aGUgV09XTCBtb2RlLgorICAgICAgICAgICAgTm90ZSAxOiBJZiB3ZSBleGl0IEJNUFMgbW9kZSAoc29tZW9uZSByZXF1ZXN0cyBmdWxsIHBvd2VyKSwgd2UKKyAgICAgICAgICAgIHdpbGwgTk9UIHJlc3VtZSBXT1dMIHdoZW4gd2UgZ28gYmFjayB0byBCTVBTIGFnYWluLiBSZXF1ZXN0IGZvciBmdWxsCisgICAgICAgICAgICBwb3dlciAod2hpbGUgaW4gV09XTCBtb2RlKSBtZWFucyBkaXNhYmxlIFdPV0wgYW5kIGdvIHRvIGZ1bGwgcG93ZXIuCisgICAgICAgICAgICBOb3RlIDI6IEJvdGggVUFQU0QgYW5kIFdPV0wgd29yayBvbiB0b3Agb2YgQk1QUy4gT24gZW50cnkgaW50byBCTVBTLCBTTUUKKyAgICAgICAgICAgIHdpbGwgZ2l2ZSBwcmlvcml0eSB0byBVQVBTRCBhbmQgZW5hYmxlIG9ubHkgVUFQU0QgaWYgYm90aCBVQVBTRCBhbmQgV09XTAorICAgICAgICAgICAgYXJlIHJlcXVpcmVkLiBDdXJyZW50bHkgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgb3IgdXNlIGNhc2UgdG8gc3VwcG9ydAorICAgICAgICAgICAgVUFQU0QgYW5kIFdPV0wgYXQgdGhlIHNhbWUgdGltZS4KKworICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGVudGVyV293bENhbGxiYWNrUm91dGluZSAtICBDYWxsYmFjayByb3V0aW5lIHByb3ZpZGVkIGJ5IEhERC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIGZvciBzdWNjZXNzL2ZhaWx1cmUgbm90aWZpY2F0aW9uIGJ5IFNNRQorICAgIFxwYXJhbSAgZW50ZXJXb3dsQ2FsbGJhY2tDb250ZXh0IC0gQSBjb29raWUgcGFzc2VkIGJ5IEhERCwgdGhhdCBpcyBwYXNzZWQgYmFjayB0byBIREQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSB0aW1lIG9mIGNhbGxiYWNrLgorICAgIFxwYXJhbSAgd2FrZVJlYXNvbkluZENCIC0gIENhbGxiYWNrIHJvdXRpbmUgcHJvdmlkZWQgYnkgSERELgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgZm9yIFdha2UgUmVhc29uIEluZGljYXRpb24gYnkgU01FCisgICAgXHBhcmFtICB3YWtlUmVhc29uSW5kQ0JDb250ZXh0IC0gQSBjb29raWUgcGFzc2VkIGJ5IEhERCwgdGhhdCBpcyBwYXNzZWQgYmFjayB0byBIREQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSB0aW1lIG9mIGNhbGxiYWNrLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAgICAgICAgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUyAgRGV2aWNlIGlzIGFscmVhZHkgaW4gV29XTEFOIG1vZGUKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgIERldmljZSBjYW5ub3QgZW50ZXIgV29XTEFOIG1vZGUuCisgICAgICAgICAgICBlSEFMX1NUQVRVU19QTUNfUEVORElORyAgUmVxdWVzdCBhY2NlcHRlZC4gU01FIHdpbGwgZW5hYmxlIFdPV0wgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk1QUyBtb2RlIGlzIGVudGVyZWQuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9FbnRlcldvd2wgKAorICAgIHRIYWxIYW5kbGUgaEhhbCwKKyAgICB2b2lkICgqZW50ZXJXb3dsQ2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCBlSGFsU3RhdHVzIHN0YXR1cyksCisgICAgdm9pZCAqZW50ZXJXb3dsQ2FsbGJhY2tDb250ZXh0LAorI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUworICAgIHZvaWQgKCp3YWtlSW5kaWNhdGlvbkNCKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCB0cFNpcldha2VSZWFzb25JbmQgcFdha2VSZWFzb25JbmQpLAorICAgIHZvaWQgKndha2VJbmRpY2F0aW9uQ0JDb250ZXh0LAorI2VuZGlmIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworICAgIHRwU2lyU21lV293bEVudGVyUGFyYW1zIHdvd2xFbnRlclBhcmFtcykKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgc3RhdHVzID0gcG1jRW50ZXJXb3dsIChoSGFsLCBlbnRlcldvd2xDYWxsYmFja1JvdXRpbmUsIGVudGVyV293bENhbGxiYWNrQ29udGV4dCwgCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWtlSW5kaWNhdGlvbkNCLCB3YWtlSW5kaWNhdGlvbkNCQ29udGV4dCwgCisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3dsRW50ZXJQYXJhbXMpOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfRXhpdFdvd2wKKyAgICBcYnJpZWYgIFRoaXMgaXMgdGhlIFNNRSBBUEkgZXhwb3NlZCB0byBIREQgdG8gcmVxdWVzdCBleGl0IGZyb20gV29XTEFOIG1vZGUuCisgICAgICAgICAgICBTTUUgd2lsbCBpbml0aWF0ZSBleGl0IGZyb20gV29XTEFOIG1vZGUgYW5kIGRldmljZSB3aWxsIGJlIHB1dCBpbiBCTVBTCisgICAgICAgICAgICBtb2RlLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUgIERldmljZSBjYW5ub3QgZXhpdCBXb1dMQU4gbW9kZS4KKyAgICAgICAgICAgIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIFJlcXVlc3QgYWNjZXB0ZWQgdG8gZXhpdCBXb1dMQU4gbW9kZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0V4aXRXb3dsICh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgeworICAgICAgIHN0YXR1cyA9IHBtY0V4aXRXb3dsIChoSGFsKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9Sb2FtU2V0S2V5CisKKyAgICBcYnJpZWYgVG8gc2V0IGVuY3J5cHRpb24ga2V5LiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIGNvbm5lY3RlZAorICAgIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBwU2V0S2V5SW5mbyAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0Q3NyU2V0Q29udGV4dEluZm8KKworICAgIFxwYXJhbSBwUm9hbUlkICBVcG9uIHN1Y2Nlc3MgcmV0dXJuLCB0aGlzIGlzIHRoZSBpZCBjYWxsZXIgY2FuIHVzZSB0byBpZGVudGlmeSB0aGUgcmVxdWVzdCBpbiByb2FtY2FsbGJhY2sKKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgU1VDQ0VTUyAgUm9hbSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBpbmRpY2F0ZSBhY3R1YWxseSByZXN1bHRzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFIG9yIFJFU09VUkNFUyAgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVNldEtleSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCB0Q3NyUm9hbVNldEtleSAqcFNldEtleSwgdEFOSV9VMzIgKnBSb2FtSWQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgIHRBTklfVTMyIHJvYW1JZDsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICB0QU5JX1UzMiBpOworICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IE5VTEw7CisjZW5kaWYKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgcm9hbUlkID0gR0VUX05FWFRfUk9BTV9JRCgmcE1hYy0+cm9hbSk7CisgICAgICBpZihwUm9hbUlkKQorICAgICAgeworICAgICAgICAgKnBSb2FtSWQgPSByb2FtSWQ7CisgICAgICB9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICBzbXNMb2cocE1hYywgTE9HMiwgRkwoImtleUxlbmd0aFxuIiksIHBTZXRLZXktPmtleUxlbmd0aCk7CisKKyAgICAgIGZvcihpPTA7IGk8cFNldEtleS0+a2V5TGVuZ3RoOyBpKyspCisgICAgICAgICAgc21zTG9nKHBNYWMsIExPRzIsIEZMKCIlMDJ4IiksIHBTZXRLZXktPktleVtpXSk7IAorCisgICAgICBzbXNMb2cocE1hYywgTE9HMiwgIlxuIHNlc3Npb25JZD0lZCByb2FtSWQ9JWRcbiIsIHNlc3Npb25JZCwgcm9hbUlkKTsgICAgICAgCisKKyAgICAgIHBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKHBNYWMsIHNlc3Npb25JZCk7CisKKyAgICAgIGlmKENTUl9JU19JTkZSQV9BUCgmcFNlc3Npb24tPmNvbm5lY3RlZFByb2ZpbGUpKQorICAgICAgeworICAgICAgICAgaWYocFNldEtleS0+a2V5RGlyZWN0aW9uID09IGVTSVJfVFhfREVGQVVMVCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKCBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MCA9PSBwU2V0S2V5LT5lbmNUeXBlICkgfHwKKyAgICAgICAgICAgICAgICAgKCBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVkgPT0gcFNldEtleS0+ZW5jVHlwZSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVA0MF9TVEFUSUNLRVk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoICggZUNTUl9FTkNSWVBUX1RZUEVfV0VQMTA0ID09IHBTZXRLZXktPmVuY1R5cGUgKSB8fAorICAgICAgICAgICAgICAgICAoIGVDU1JfRU5DUllQVF9UWVBFX1dFUDEwNF9TVEFUSUNLRVkgPT0gcFNldEtleS0+ZW5jVHlwZSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcFNlc3Npb24tPnBDdXJSb2FtUHJvZmlsZS0+bmVnb3RpYXRlZFVDRW5jcnlwdGlvblR5cGUgPSBlQ1NSX0VOQ1JZUFRfVFlQRV9XRVAxMDRfU1RBVElDS0VZOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisKKyAgICAgIHN0YXR1cyA9IGNzclJvYW1TZXRLZXkgKCBwTWFjLCBzZXNzaW9uSWQsIHBTZXRLZXksIHJvYW1JZCApOworICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfUm9hbVJlbW92ZUtleQorCisgICAgXGJyaWVmIFRvIHNldCBlbmNyeXB0aW9uIGtleS4gVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIHBSZW1vdmVLZXkgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdENzclJvYW1SZW1vdmVLZXkKKworICAgIFxwYXJhbSBwUm9hbUlkICBVcG9uIHN1Y2Nlc3MgcmV0dXJuLCB0aGlzIGlzIHRoZSBpZCBjYWxsZXIgY2FuIHVzZSB0byBpZGVudGlmeSB0aGUgcmVxdWVzdCBpbiByb2FtY2FsbGJhY2sKKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgU1VDQ0VTUyAgUm9hbSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBpbmRpY2F0ZSBhY3R1YWxseSByZXN1bHRzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFIG9yIFJFU09VUkNFUyAgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVJlbW92ZUtleSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbVJlbW92ZUtleSAqcFJlbW92ZUtleSwgdEFOSV9VMzIgKnBSb2FtSWQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgIHRBTklfVTMyIHJvYW1JZDsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgcm9hbUlkID0gR0VUX05FWFRfUk9BTV9JRCgmcE1hYy0+cm9hbSk7CisgICAgICBpZihwUm9hbUlkKQorICAgICAgeworICAgICAgICAgKnBSb2FtSWQgPSByb2FtSWQ7CisgICAgICB9CisgICAgICBzdGF0dXMgPSBjc3JSb2FtSXNzdWVSZW1vdmVLZXlDb21tYW5kKCBwTWFjLCBzZXNzaW9uSWQsIHBSZW1vdmVLZXksIHJvYW1JZCApOworICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9HZXRSc3NpCisgICAgXGJyaWVmIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGNsaWVudCBjYWxscyB0byByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGdldCBSU1NJCisKKyAgICBccGFyYW0gY2FsbGJhY2sgLSBTTUUgc2VuZHMgYmFjayB0aGUgcmVxdWVzdGVkIHN0YXRzIHVzaW5nIHRoZSBjYWxsYmFjaworICAgIFxwYXJhbSBzdGFJZCAtIFRoZSBzdGF0aW9uIElEIGZvciB3aGljaCB0aGUgc3RhdHMgaXMgcmVxdWVzdGVkIGZvcgorICAgIFxwYXJhbSBwQ29udGV4dCAtIHVzZXIgY29udGV4dCB0byBiZSBwYXNzZWQgYmFjayBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjaworICAgIFxwYXJhbSBwVm9zQ29udGV4dCAtIHZvcyBjb250ZXh0CisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9HZXRSc3NpKHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclJzc2lDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBzdGFJZCwgdENzckJzc2lkIGJzc0lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENvbnRleHQsIHZvaWQqIHBWb3NDb250ZXh0KQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIHN0YXR1cyA9IGNzckdldFJzc2koIHBNYWMsIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhSWQsIGJzc0lkLCBwQ29udGV4dCwgcFZvc0NvbnRleHQpOworICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfR2V0U3RhdGlzdGljcworICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBjbGllbnQgY2FsbHMgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBnZXQKKyAgICBkaWZmZXJlbnQgUEhZIGxldmVsIHN0YXRpc3RpY3MgZnJvbSBDU1IuCisKKyAgICBccGFyYW0gcmVxdWVzdGVySWQgLSBkaWZmZXJlbnQgY2xpZW50IHJlcXVlc3RpbmcgZm9yIHN0YXRpc3RpY3MsIEhERCwgVU1BL0dBTiBldGMKKyAgICBccGFyYW0gc3RhdHNNYXNrIC0gVGhlIGRpZmZlcmVudCBjYXRlZ29yeS9jYXRlZ29yaWVzIG9mIHN0YXRzIHJlcXVlc3RlciBpcyBsb29raW5nIGZvcgorICAgIFxwYXJhbSBjYWxsYmFjayAtIFNNRSBzZW5kcyBiYWNrIHRoZSByZXF1ZXN0ZWQgc3RhdHMgdXNpbmcgdGhlIGNhbGxiYWNrCisgICAgXHBhcmFtIHBlcmlvZGljaXR5IC0gSWYgcmVxdWVzdGVyIG5lZWRzIHBlcmlvZGljIHVwZGF0ZSBpbiBtaWxsaXNlYywgMCBtZWFucworICAgICAgICAgICAgICAgICAgICAgICAgIGl0J3MgYW4gb25lIHRpbWUgcmVxdWVzdAorICAgIFxwYXJhbSBjYWNoZSAtIElmIHJlcXVlc3RlciBpcyBoYXBweSB3aXRoIGNhY2hlZCBzdGF0cworICAgIFxwYXJhbSBzdGFJZCAtIFRoZSBzdGF0aW9uIElEIGZvciB3aGljaCB0aGUgc3RhdHMgaXMgcmVxdWVzdGVkIGZvcgorICAgIFxwYXJhbSBwQ29udGV4dCAtIHVzZXIgY29udGV4dCB0byBiZSBwYXNzZWQgYmFjayBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjaworICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0U3RhdGlzdGljcyh0SGFsSGFuZGxlIGhIYWwsIGVDc3JTdGF0c1JlcXVlc3RlclR5cGUgcmVxdWVzdGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHN0YXRzTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENzclN0YXRzQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHBlcmlvZGljaXR5LCB0QU5JX0JPT0xFQU4gY2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggc3RhSWQsIHZvaWQgKnBDb250ZXh0KQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIHN0YXR1cyA9IGNzckdldFN0YXRpc3RpY3MoIHBNYWMsIHJlcXVlc3RlcklkICwgc3RhdHNNYXNrLCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljaXR5LCBjYWNoZSwgc3RhSWQsIHBDb250ZXh0KTsKKyAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX0dldENvdW50cnlDb2RlCisKKyAgICBcYnJpZWYgVG8gcmV0dXJuIHRoZSBjdXJyZW50IGNvdW50cnkgY29kZS4gSWYgbm8gY291bnRyeSBjb2RlIGlzIGFwcGxpZWQsIGRlZmF1bHQgY291bnRyeSBjb2RlIGlzCisgICAgdXNlZCB0byBmaWxsIHRoZSBidWZmZXIuCisgICAgSWYgMTFkIHN1cHBvcnRlZCBpcyB0dXJuZWQgb2ZmLCBhbiBlcnJvciBpcyByZXR1cm4gYW5kIHRoZSBsYXN0IGFwcGxpZWQvZGVmYXVsdCBjb3VudHJ5IGNvZGUgaXMgdXNlZC4KKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIHBCdWYgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgZm9yIHJldHVybmVkIGNvdW50cnkgY29kZS4KKworICAgIFxwYXJhbSBwYkxlbiAgRm9yIGlucHV0LCB0aGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgaG93IGJpZyBpcyB0aGUgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgIFVwb24gcmV0dXJuLCB0aGlzIHBhcmFtZXRlciBoYXMgdGhlIG51bWJlciBvZiBieXRlcyBmb3IgY291bnRyeS4gSWYgcEJ1ZgorICAgICAgICAgICAgICAgICAgIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggc3BhY2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgICAgICAgICAgICAgICAgIGZhaWwgc3RhdHVzIGFuZCB0aGlzIHBhcmFtZXRlciBjb250YWlucyB0aGUgbnVtYmVyIHRoYXQgaXMgbmVlZGVkLgorCisgICAgXHJldHVybiBlSGFsU3RhdHVzICBTVUNDRVNTLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSBvciBSRVNPVVJDRVMgIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0dldENvdW50cnlDb2RlKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCAqcGJMZW4pCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICByZXR1cm4gKCBjc3JHZXRDb3VudHJ5Q29kZSggcE1hYywgcEJ1ZiwgcGJMZW4gKSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9TZXRDb3VudHJ5Q29kZQorCisgICAgXGJyaWVmIFRvIGNoYW5nZSB0aGUgY3VycmVudC9kZWZhdWx0IGNvdW50cnkgY29kZS4KKyAgICBJZiAxMWQgc3VwcG9ydGVkIGlzIHR1cm5lZCBvZmYsIGFuIGVycm9yIGlzIHJldHVybi4KKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIHBDb3VudHJ5IC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIGZvciB0aGUgY291bnRyeSBjb2RlLgorCisgICAgXHBhcmFtIHBmUmVzdGFydE5lZWRlZCAgQSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgbWVtb3J5LCB1cG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBpdCBpbmRpY2F0ZXMKKyAgICB3aGV0aGVyIGEgcmVzZXQgaXMgcmVxdWlyZWQuCisKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgIFNVQ0NFU1MuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFIG9yIFJFU09VUkNFUyAgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2V0Q291bnRyeUNvZGUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4ICpwQ291bnRyeSwgdEFOSV9CT09MRUFOICpwZlJlc3RhcnROZWVkZWQpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICByZXR1cm4gKCBjc3JTZXRDb3VudHJ5Q29kZSggcE1hYywgcENvdW50cnksIHBmUmVzdGFydE5lZWRlZCApICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9SZXNldENvdW50cnlDb2RlSW5mb3JtYXRpb24KKyAgICBcYnJpZWYgdGhpcyBmdW5jdGlvbiBpcyB0byByZXNldCB0aGUgY291bnRyeSBjb2RlIGN1cnJlbnQgYmVpbmcgdXNlZCBiYWNrIHRvIEVFUFJPTSBkZWZhdWx0CisgICAgdGhpcyBpbmNsdWRlcyBjaGFubmVsIGxpc3QgYW5kIHBvd2VyIHNldHRpbmcuIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBBUEkuCisgICAgXHBhcmFtIHBmUmVzdGFydE5lZWRlZCAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHNwYWNlLiBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBpdCBpbmRpY2F0ZXMgd2hldGhlcgorICAgIGEgcmVzdGFydCBpcyBuZWVkZWQgdG8gYXBwbHkgdGhlIGNoYW5nZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1Jlc2V0Q291bnRyeUNvZGVJbmZvcm1hdGlvbih0SGFsSGFuZGxlIGhIYWwsIHRBTklfQk9PTEVBTiAqcGZSZXN0YXJ0TmVlZGVkKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICAgcmV0dXJuICggY3NyUmVzZXRDb3VudHJ5Q29kZUluZm9ybWF0aW9uKCBwTWFjLCBwZlJlc3RhcnROZWVkZWQgKSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfR2V0U3VwcG9ydGVkQ291bnRyeUNvZGUKKyAgICBcYnJpZWYgdGhpcyBmdW5jdGlvbiBpcyB0byBnZXQgYSBsaXN0IG9mIHRoZSBjb3VudHJ5IGNvZGUgY3VycmVudCBiZWluZyBzdXBwb3J0ZWQKKyAgICBccGFyYW0gcEJ1ZiAtIENhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHdpdGggYXQgbGVhc3QgMyBieXRlcywgdXBvbiBzdWNjZXNzIHJldHVybiwKKyAgICB0aGlzIGhhcyB0aGUgY291bnRyeSBjb2RlIGxpc3QuIDMgYnl0ZXMgZm9yIGVhY2ggY291bnRyeSBjb2RlLiBUaGlzIG1heSBiZSBOVUxMIGlmCisgICAgY2FsbGVyIHdhbnRzIHRvIGtub3cgdGhlIG5lZWRlZCBieXRlIGNvdW50LgorICAgIFxwYXJhbSBwYkxlbiAtIENhbGxlciBhbGxvY2F0ZWQsIGFzIGlucHV0LCBpdCBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiBwQnVmLiBVcG9uIHN1Y2Nlc3MgcmV0dXJuLAorICAgIHRoaXMgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiBwQnVmLiBJZiBwYnVmIGlzIE5VTEwsIGFzIGlucHV0LCAqcGJMZW4gc2hvdWxkIGJlIDAuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0U3VwcG9ydGVkQ291bnRyeUNvZGUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiAqcGJMZW4pCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICByZXR1cm4gKCBjc3JHZXRTdXBwb3J0ZWRDb3VudHJ5Q29kZSggcE1hYywgcEJ1ZiwgcGJMZW4gKSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfR2V0Q3VycmVudFJlZ3VsYXRvcnlEb21haW4KKyAgICBcYnJpZWYgdGhpcyBmdW5jdGlvbiBpcyB0byBnZXQgdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBBUEkuCisgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBDRkcgaXMgZG93bmxvYWRlZCBhbmQgYWxsIHRoZSBiYW5kL21vZGUgc2V0dGluZyBhbHJlYWR5IHBhc3NlZCBpbnRvCisgICAgU01FLiBUaGUgZnVuY3Rpb24gZmFpbHMgaWYgMTFkIHN1cHBvcnQgaXMgdHVybmVkIG9mZi4KKyAgICBccGFyYW0gcERvbWFpbiAtIENhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHRvIHJldHVybiB0aGUgY3VycmVudCBkb21haW4uCisgICAgXHJldHVybiBlSGFsU3RhdHVzICBTVUNDRVNTLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSBvciBSRVNPVVJDRVMgIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9HZXRDdXJyZW50UmVndWxhdG9yeURvbWFpbih0SGFsSGFuZGxlIGhIYWwsIHZfUkVHRE9NQUlOX3QgKnBEb21haW4pCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKworICAgIGlmKCBwRG9tYWluICkKKyAgICB7CisgICAgICAgIGlmKCBjc3JJczExZFN1cHBvcnRlZCggcE1hYyApICkKKyAgICAgICAgeworICAgICAgICAgICAgKnBEb21haW4gPSBjc3JHZXRDdXJyZW50UmVndWxhdG9yeURvbWFpbiggcE1hYyApOworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKCBzdGF0dXMgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NldFJlZ3VsYXRvcnlEb21haW4KKyAgICBcYnJpZWYgdGhpcyBmdW5jdGlvbiBpcyB0byBzZXQgdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBDRkcgaXMgZG93bmxvYWRlZCBhbmQgYWxsIHRoZSBiYW5kL21vZGUgc2V0dGluZyBhbHJlYWR5IHBhc3NlZCBpbnRvCisgICAgU01FLiBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorICAgIFxwYXJhbSBkb21haW5JZCAtIGluZGljYXRlIHRoZSBkb21haW4gKGRlZmluZWQgaW4gdGhlIGRyaXZlcikgbmVlZHMgdG8gc2V0IHRvLgorICAgIFNlZSB2X1JFR0RPTUFJTl90IGZvciBkZWZpbml0aW9uCisgICAgXHBhcmFtIHBmUmVzdGFydE5lZWRlZCAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHNwYWNlLiBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBpdCBpbmRpY2F0ZXMgd2hldGhlcgorICAgIGEgcmVzdGFydCBpcyBuZWVkZWQgdG8gYXBwbHkgdGhlIGNoYW5nZQorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1NldFJlZ3VsYXRvcnlEb21haW4odEhhbEhhbmRsZSBoSGFsLCB2X1JFR0RPTUFJTl90IGRvbWFpbklkLCB0QU5JX0JPT0xFQU4gKnBmUmVzdGFydE5lZWRlZCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIHJldHVybiAoIGNzclNldFJlZ3VsYXRvcnlEb21haW4oIHBNYWMsIGRvbWFpbklkLCBwZlJlc3RhcnROZWVkZWQgKSApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9HZXRSZWd1bGF0b3J5RG9tYWluRm9yQ291bnRyeQorCisgICAgXGJyaWVmIFRvIHJldHVybiBhIHJlZ3VsYXRvcnkgZG9tYWluIGJhc2Ugb24gYSBjb3VudHJ5IGNvZGUuIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBBUEkuCisKKyAgICBccGFyYW0gcENvdW50cnkgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgZm9yIGlucHV0IGNvdW50cnkgY29kZS4KKworICAgIFxwYXJhbSBwRG9tYWluSWQgIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIGl0IGlzIHRoZSBkb21haW4gdGhhdCBjb3VudHJ5IGJlbG9uZ3MgdG8uCisgICAgSWYgaXQgaXMgTlVMTCwgcmV0dXJuaW5nIHN1Y2Nlc3MgbWVhbnMgdGhhdCB0aGUgY291bnRyeSBjb2RlIGlzIGtub3duLgorCisgICAgXHJldHVybiBlSGFsU3RhdHVzICBTVUNDRVNTLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSBvciBSRVNPVVJDRVMgIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0dldFJlZ3VsYXRvcnlEb21haW5Gb3JDb3VudHJ5KHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCAqcENvdW50cnksIHZfUkVHRE9NQUlOX3QgKnBEb21haW5JZCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgIHJldHVybiAoIGNzckdldFJlZ3VsYXRvcnlEb21haW5Gb3JDb3VudHJ5KCBwTWFjLCBwQ291bnRyeSwgcERvbWFpbklkICkgKTsKK30KKworCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX0dldFN1cHBvcnRlZFJlZ3VsYXRvcnlEb21haW5zCisKKyAgICBcYnJpZWYgVG8gcmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgcmVndWxhdG9yeSBkb21haW5zLiBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIHBEb21haW5zIC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIGZvciByZXR1cm5lZCByZWd1bGF0b3J5IGRvbWFpbnMuCisKKyAgICBccGFyYW0gcE51bURvbWFpbnMgIEZvciBpbnB1dCwgdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGhvd20gbWFueSBkb21haW5zIHBEb21haW5zIGNhbiBob2xkLgorICAgICAgICAgICAgICAgICAgICAgICAgIFVwb24gcmV0dXJuLCB0aGlzIHBhcmFtZXRlciBoYXMgdGhlIG51bWJlciBmb3Igc3VwcG9ydGVkIGRvbWFpbnMuIElmIHBEb21haW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc24ndCBoYXZlIGVub3VnaCBzcGFjZSBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgZG9tYWlucywgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCBzdGF0dXMgYW5kIHRoaXMgcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSBudW1iZXIgdGhhdCBpcyBuZWVkZWQuCisKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgIFNVQ0NFU1MuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFIG9yIFJFU09VUkNFUyAgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0U3VwcG9ydGVkUmVndWxhdG9yeURvbWFpbnModEhhbEhhbmRsZSBoSGFsLCB2X1JFR0RPTUFJTl90ICpwRG9tYWlucywgdEFOSV9VMzIgKnBOdW1Eb21haW5zKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICAvL1dlIHN1cHBvcnQgYWxsIGRvbWFpbnMgZm9yIG5vdworICAgIGlmKCBwTnVtRG9tYWlucyApCisgICAgeworICAgICAgICBpZiggTlVNX1JFR19ET01BSU5TIDw9ICpwTnVtRG9tYWlucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgKnBOdW1Eb21haW5zID0gTlVNX1JFR19ET01BSU5TOworICAgIH0KKyAgICBpZiggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICAgeworICAgICAgICBpZiggcERvbWFpbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBwRG9tYWluc1swXSA9IFJFR0RPTUFJTl9GQ0M7CisgICAgICAgICAgICBwRG9tYWluc1sxXSA9IFJFR0RPTUFJTl9FVFNJOworICAgICAgICAgICAgcERvbWFpbnNbMl0gPSBSRUdET01BSU5fSkFQQU47CisgICAgICAgICAgICBwRG9tYWluc1szXSA9IFJFR0RPTUFJTl9XT1JMRDsKKyAgICAgICAgICAgIHBEb21haW5zWzRdID0gUkVHRE9NQUlOX05fQU1FUl9FWENfRkNDOworICAgICAgICAgICAgcERvbWFpbnNbNV0gPSBSRUdET01BSU5fQVBBQzsKKyAgICAgICAgICAgIHBEb21haW5zWzZdID0gUkVHRE9NQUlOX0tPUkVBOworICAgICAgICAgICAgcERvbWFpbnNbN10gPSBSRUdET01BSU5fSElfNUdIWjsKKyAgICAgICAgICAgIHBEb21haW5zWzhdID0gUkVHRE9NQUlOX05PXzVHSFo7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIHN0YXR1cyApOworfQorCisKKy8vc29tZSBzdXBwb3J0IGZ1bmN0aW9ucwordEFOSV9CT09MRUFOIHNtZV9JczExZFN1cHBvcnRlZCh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICByZXR1cm4gKCBjc3JJczExZFN1cHBvcnRlZCggcE1hYyApICk7Cit9CisKKwordEFOSV9CT09MRUFOIHNtZV9JczExaFN1cHBvcnRlZCh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICByZXR1cm4gKCBjc3JJczExaFN1cHBvcnRlZCggcE1hYyApICk7Cit9CisKKwordEFOSV9CT09MRUFOIHNtZV9Jc1dtbVN1cHBvcnRlZCh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICByZXR1cm4gKCBjc3JJc1dtbVN1cHBvcnRlZCggcE1hYyApICk7Cit9CisKKy8vVXBwZXIgbGF5ZXIgdG8gZ2V0IHRoZSBsaXN0IG9mIHRoZSBiYXNlIGNoYW5uZWxzIHRvIHNjYW4gZm9yIHBhc3NpdmVseSAxMWQgaW5mbyBmcm9tIGNzcgorZUhhbFN0YXR1cyBzbWVfU2NhbkdldEJhc2VDaGFubmVscyggdEhhbEhhbmRsZSBoSGFsLCB0Q3NyQ2hhbm5lbEluZm8gKiBwQ2hhbm5lbEluZm8gKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHJldHVybihjc3JTY2FuR2V0QmFzZUNoYW5uZWxzKHBNYWMscENoYW5uZWxJbmZvKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfQ2hhbmdlQ291bnRyeUNvZGUKKworICAgIFxicmllZiBDaGFuZ2UgQ291bnRyeSBjb2RlIGZyb20gdXBwZXJsYXllciBkdXJpbmcgV0xBTiBkcml2ZXIgb3BlcmF0aW9uLgorICAgICAgICAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisKKyAgICBccGFyYW0gcENvdW50cnkgTmV3IENvdW50cnkgQ29kZSBTdHJpbmcKKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAgU1VDQ0VTUy4KKworICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUgb3IgUkVTT1VSQ0VTICBUaGUgQVBJIGZpbmlzaGVkIGFuZCBmYWlsZWQuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9DaGFuZ2VDb3VudHJ5Q29kZSggdEhhbEhhbmRsZSBoSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNtZUNoYW5nZUNvdW50cnlDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBDb3VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVm9zQ29udGV4dCApCit7CisgICBlSGFsU3RhdHVzICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCAgICAgICAgICAgIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgdm9zX21zZ190ICAgICAgICAgICAgICAgICBtc2c7CisgICB0QW5pQ2hhbmdlQ291bnRyeUNvZGVSZXEgKnBNc2c7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgiIGNhbGxlZFxuIikpOyAgICAgIAorICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNc2csIHNpemVvZih0QW5pQ2hhbmdlQ291bnRyeUNvZGVSZXEpKTsKKyAgICAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkgCisgICAgICB7CisgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiBjc3JDaGFuZ2VDb3VudHJ5Q29kZTogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbSBmb3IgcmVxIFxuIik7CisgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgfQorCisgICAgICBwTXNnLT5tc2dUeXBlID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNillV05JX1NNRV9DSEFOR0VfQ09VTlRSWV9DT0RFKTsKKyAgICAgIHBNc2ctPm1zZ0xlbiA9ICh0QU5JX1UxNilzaXplb2YodEFuaUNoYW5nZUNvdW50cnlDb2RlUmVxKTsKKyAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1zZy0+Y291bnRyeUNvZGUsIHBDb3VudHJ5LCAzKTsKKyAgICAgIHBNc2ctPmNoYW5nZUNDQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgIHBNc2ctPnBEZXZDb250ZXh0ID0gcENvbnRleHQ7CisgICAgICBwTXNnLT5wVm9zQ29udGV4dCA9IHBWb3NDb250ZXh0OworCisgICAgICBtc2cudHlwZSA9IGVXTklfU01FX0NIQU5HRV9DT1VOVFJZX0NPREU7CisgICAgICBtc2cuYm9keXB0ciA9IHBNc2c7CisgICAgICBtc2cucmVzZXJ2ZWQgPSAwOworCisgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfU01FLCAmbXNnKSkKKyAgICAgIHsKKyAgICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgIiBzbWVfQ2hhbmdlQ291bnRyeUNvZGUgZmFpbGVkIHRvIHBvc3QgbXNnIHRvIHNlbGYgXG4iKTsgICAKKyAgICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopcE1zZyk7CisgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgIH0KKyAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgiIHJldHVybmVkXG4iKSk7ICAgICAgCisgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0J0Y1NpZ25hbEJ0RXZlbnQKKyAgICBcYnJpZWYgIEFQSSB0byBzaWduYWwgQmx1ZXRvb3RoIChCVCkgZXZlbnQgdG8gdGhlIFdMQU4gZHJpdmVyLiBCYXNlZCBvbiB0aGUKKyAgICAgICAgICAgIEJUIGV2ZW50IHR5cGUgYW5kIHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIG9mIExpYnJhIChmdWxsIHBvd2VyLAorICAgICAgICAgICAgQk1QUywgVUFQU0QgZXRjKSwgYXBwcm9wcmlhdGUgQmx1ZXRvb3RoIENvZXhpc3RlbmNlIChCVEMpIHN0cmF0ZWd5CisgICAgICAgICAgICB3b3VsZCBiZSBlbXBsb3llZC4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwQnRFdmVudCAtICBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdHlwZSB0U21lQnRFdmVudAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGVyIG93bnMgdGhlIG1lbW9yeSBhbmQgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgaXQuCisgICAgXHJldHVybiBWT1NfU1RBVFVTCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAgQlQgRXZlbnQgbm90IHBhc3NlZCB0byBIQUwuIFRoaXMgY2FuIGhhcHBlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBCVEMgZXhlY3V0aW9uIG1vZGUgaXMgc2V0IHRvIEJUQ19XTEFOX09OTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgQlRDX1BUQV9PTkxZLgorICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICAgIEJUIEV2ZW50IHBhc3NlZCB0byBIQUwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgc21lX0J0Y1NpZ25hbEJ0RXZlbnQgKHRIYWxIYW5kbGUgaEhhbCwgdHBTbWVCdEV2ZW50IHBCdEV2ZW50KQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisjaWZuZGVmIFdMQU5fTURNX0NPREVfUkVEVUNUSU9OX09QVAorICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGJ0Y1NpZ25hbEJURXZlbnQgKGhIYWwsIHBCdEV2ZW50KTsKKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0J0Y1NldENvbmZpZworICAgIFxicmllZiAgQVBJIHRvIGNoYW5nZSB0aGUgY3VycmVudCBCbHVldG9vdGggQ29leGlzdGVuY2UgKEJUQykgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW52b2tlZCBvbmx5IGFmdGVyIENGRyBkb3dubG9hZCBoYXMgY29tcGxldGVkLgorICAgICAgICAgICAgQ2FsbGluZyBpdCBhZnRlciBzbWVfSEREUmVhZHlJbmQgaXMgcmVjb21tZW5kZWQuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFNtZUJ0Y0NvbmZpZyAtIFBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0eXBlIHRTbWVCdGNDb25maWcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGVyIG93bnMgdGhlIG1lbW9yeSBhbmQgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgaXQuCisgICAgXHJldHVybiBWT1NfU1RBVFVTCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAgQ29uZmlnIG5vdCBwYXNzZWQgdG8gSEFMLgorICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICBDb25maWcgcGFzc2VkIHRvIEhBTAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBzbWVfQnRjU2V0Q29uZmlnICh0SGFsSGFuZGxlIGhIYWwsIHRwU21lQnRjQ29uZmlnIHBTbWVCdGNDb25maWcpCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGJ0Y1NldENvbmZpZyAoaEhhbCwgcFNtZUJ0Y0NvbmZpZyk7CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9CdGNHZXRDb25maWcKKyAgICBcYnJpZWYgIEFQSSB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBCbHVldG9vdGggQ29leGlzdGVuY2UgKEJUQykgY29uZmlndXJhdGlvbgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBTbWVCdGNDb25maWcgLSBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTbWVCdGNDb25maWcuIENhbGxlciBvd25zIHRoZSBtZW1vcnkgYW5kIGlzIHJlc3BvbnNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZyZWVpbmcgaXQuCisgICAgXHJldHVybiBWT1NfU1RBVFVTCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIGZhaWx1cmUKKyAgICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgc3VjY2VzcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBzbWVfQnRjR2V0Q29uZmlnICh0SGFsSGFuZGxlIGhIYWwsIHRwU21lQnRjQ29uZmlnIHBTbWVCdGNDb25maWcpCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyNpZm5kZWYgV0xBTl9NRE1fQ09ERV9SRURVQ1RJT05fT1BUCisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICkgKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gYnRjR2V0Q29uZmlnIChoSGFsLCBwU21lQnRjQ29uZmlnKTsKKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TZXRDZmdQcml2YWN5CisgICAgXGJyaWVmICBBUEkgdG8gc2V0IGNvbmZpZ3VyZSBwcml2YWN5IHBhcmFtZXRlcnMKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwUHJvZmlsZSAtIFBvaW50ZXIgQ1NSIFJvYW0gcHJvZmlsZS4KKyAgICBccGFyYW0gIGZQcml2YWN5IC0gVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHN0YXR1cyBvZiBwcml2YWN5IAorCisgICAgXHJldHVybiB2b2lkCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNtZV9TZXRDZmdQcml2YWN5KCB0SGFsSGFuZGxlIGhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICB0Q3NyUm9hbVByb2ZpbGUgKnBQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9CT09MRUFOIGZQcml2YWN5CisgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkKKyAgICB7CisgICAgICAgIGNzclNldENmZ1ByaXZhY3kocE1hYywgcFByb2ZpbGUsIGZQcml2YWN5KTsKKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX05laWdoYm9yUmVwb3J0UmVxdWVzdAorICAgIFxicmllZiAgQVBJIHRvIHJlcXVlc3QgbmVpZ2hib3IgcmVwb3J0LgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBScm1OZWlnaGJvclJlcSAtIFBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFJybU5laWdoYm9yUmVxLiBDYWxsZXIgb3ducyB0aGUgbWVtb3J5IGFuZCBpcyByZXNwb25zaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmcmVlaW5nIGl0LgorICAgIFxyZXR1cm4gVk9TX1NUQVRVUworICAgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBmYWlsdXJlCisgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgIHN1Y2Nlc3MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgc21lX05laWdoYm9yUmVwb3J0UmVxdWVzdCAodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUnJtTmVpZ2hib3JSZXEgcFJybU5laWdoYm9yUmVxLCB0cFJybU5laWdoYm9yUnNwQ2FsbGJhY2tJbmZvIGNhbGxiYWNrSW5mbykKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHNtZV9Scm1OZWlnaGJvclJlcG9ydFJlcXVlc3QgKGhIYWwsIHNlc3Npb25JZCwgcFJybU5laWdoYm9yUmVxLCBjYWxsYmFja0luZm8pOworICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisjZW5kaWYKKworLy9UaGUgZm9sbG93aW5nIGFyZSBkZWJ1ZyBBUElzIHRvIHN1cHBvcnQgZGlyZWN0IHJlYWQvd3JpdGUgcmVnaXN0ZXIvbWVtb3J5CisvL1RoZXkgYXJlIHBsYWNlZCBpbiBTTUUgYmVjYXVzZSBIVyBjYW5ub3QgYmUgYWNjZXNzIHdoZW4gaW4gTE9XX1BPV0VSIHN0YXRlCisvL0FORCBub3QgY29ubmVjdGVkLiBUaGUga25vd2xlZGdlIGFuZCBzeW5jaHJvbml6YXRpb24gaXMgZG9uZSBpbiBTTUUKKworLy9zbWVfRGJnUmVhZFJlZ2lzdGVyCisvL0NhbGxlciBuZWVkcyB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgdmFsdWVzCitWT1NfU1RBVFVTIHNtZV9EYmdSZWFkUmVnaXN0ZXIodEhhbEhhbmRsZSBoSGFsLCB2X1UzMl90IHJlZ0FkZHIsIHZfVTMyX3QgKnBSZWdWYWx1ZSkKK3sKKyAgIFZPU19TVEFUVVMgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MpCisgICB0SGRkSGFuZGxlICAgICBoSGRkID0gcE1hYy0+aEhkZDsKKyNlbmRpZgorICAgdFBtY1Bvd2VyU3RhdGUgUG93ZXJTdGF0ZTsKKyAgIHRBTklfVTMyICBzZXNzaW9uSWQgPSAwOworCisgICAvKiAxKSBUbyBtYWtlIFF1YXJreSB3b3JrIGluIEZUTSBtb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICBpZihlRFJJVkVSX1RZUEVfTUZHID09IHBNYWMtPmdEcml2ZXJUeXBlKQorICAgeworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQykKKyAgICAgIGlmIChIQUxfU1RBVFVTX1NVQ0NFU1MocGFsUmVhZFJlZ2lzdGVyKGhIZGQsIHJlZ0FkZHIsIHBSZWdWYWx1ZSkpKQorI2VsaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisgICAgICBpZiAoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTID09IHdwYWxEYmdSZWFkUmVnaXN0ZXIocmVnQWRkciwgcFJlZ1ZhbHVlKSkKKyNlbmRpZgorICAgICAgeworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLyogMikgTk9OIEZUTSBtb2RlIGRyaXZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAvKiBBY3F1aXJlIFNNRSBnbG9iYWwgbG9jayAqLworICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCZwTWFjLT5zbWUpKQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MocG1jUXVlcnlQb3dlclN0YXRlKHBNYWMsICZQb3dlclN0YXRlLCBOVUxMLCBOVUxMKSkpCisgICB7CisgICAgICAvKiBBcmUgd2Ugbm90IGluIElNUFMgbW9kZT8gT3IgYXJlIHdlIGluIGNvbm5lY3RlZD8gVGhlbiB3ZSdyZSBzYWZlKi8KKyAgICAgIGlmKCFjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpIHx8IChlUE1DX0xPV19QT1dFUiAhPSBQb3dlclN0YXRlKSkKKyAgICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MpCisgICAgICAgICBpZiAoSEFMX1NUQVRVU19TVUNDRVNTKHBhbFJlYWRSZWdpc3RlcihoSGRkLCByZWdBZGRyLCBwUmVnVmFsdWUgKSkpCisjZWxpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQykKKyAgICAgICAgIGlmIChlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgPT0gd3BhbERiZ1JlYWRSZWdpc3RlcihyZWdBZGRyLCBwUmVnVmFsdWUpKQorI2VuZGlmCisgICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7ICAKKyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisgICB9CisKKyAgIC8qIFRoaXMgaXMgYSBoYWNrIGZvciBRdWFsa3kvcHR0V25pU29ja2V0CisgICAgICBDdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgYWxsb3cgcHR0V25pU29ja2V0IHRvIGluZm9ybSBRdWFsa3kgYW4gZXJyb3IgKi8KKyAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cyApCisgICB7CisgICAgICAqcFJlZ1ZhbHVlID0gMHhERUFEQkVFRjsKKyAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisgICAgICAgIAorICAgLyogUmVsZWFzZSBTTUUgZ2xvYmFsIGxvY2sgKi8KKyAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jaygmcE1hYy0+c21lKTsKKyAgICAKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisvL3NtZV9EYmdXcml0ZVJlZ2lzdGVyCisvL0NhbGxlciBuZWVkcyB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgdmFsdWVzCitWT1NfU1RBVFVTIHNtZV9EYmdXcml0ZVJlZ2lzdGVyKHRIYWxIYW5kbGUgaEhhbCwgdl9VMzJfdCByZWdBZGRyLCB2X1UzMl90IHJlZ1ZhbHVlKQoreworICAgVk9TX1NUQVRVUyAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsICBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DKQorICAgdEhkZEhhbmRsZSAgICAgIGhIZGQgPSBwTWFjLT5oSGRkOworI2VuZGlmCisgICB0UG1jUG93ZXJTdGF0ZSBQb3dlclN0YXRlOworICAgdEFOSV9VMzIgICBzZXNzaW9uSWQgPSAwOworCisgICAvKiAxKSBUbyBtYWtlIFF1YXJreSB3b3JrIGluIEZUTSBtb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICBpZihlRFJJVkVSX1RZUEVfTUZHID09IHBNYWMtPmdEcml2ZXJUeXBlKQorICAgeworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQykKKyAgICAgIGlmIChIQUxfU1RBVFVTX1NVQ0NFU1MocGFsV3JpdGVSZWdpc3RlcihoSGRkLCByZWdBZGRyLCByZWdWYWx1ZSkpKQorI2VsaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisgICAgICBpZiAoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTID09IHdwYWxEYmdXcml0ZVJlZ2lzdGVyKHJlZ0FkZHIsIHJlZ1ZhbHVlKSkKKyNlbmRpZgorICAgICAgeworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLyogMikgTk9OIEZUTSBtb2RlIGRyaXZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAvKiBBY3F1aXJlIFNNRSBnbG9iYWwgbG9jayAqLworICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCZwTWFjLT5zbWUpKQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MocG1jUXVlcnlQb3dlclN0YXRlKHBNYWMsICZQb3dlclN0YXRlLCBOVUxMLCBOVUxMKSkpCisgICB7CisgICAgICAvKiBBcmUgd2Ugbm90IGluIElNUFMgbW9kZT8gT3IgYXJlIHdlIGluIGNvbm5lY3RlZD8gVGhlbiB3ZSdyZSBzYWZlKi8KKyAgICAgIGlmKCFjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpIHx8IChlUE1DX0xPV19QT1dFUiAhPSBQb3dlclN0YXRlKSkKKyAgICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MpCisgICAgICAgICBpZiAoSEFMX1NUQVRVU19TVUNDRVNTKHBhbFdyaXRlUmVnaXN0ZXIoaEhkZCwgcmVnQWRkciwgcmVnVmFsdWUpKSkKKyNlbGlmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DKQorICAgICAgICAgaWYgKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyA9PSB3cGFsRGJnV3JpdGVSZWdpc3RlcihyZWdBZGRyLCByZWdWYWx1ZSkpCisjZW5kaWYKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisgICB9CisgICAgICAgIAorICAgLyogUmVsZWFzZSBTTUUgZ2xvYmFsIGxvY2sgKi8KKyAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jaygmcE1hYy0+c21lKTsKKyAgICAKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisKKy8vc21lX0RiZ1JlYWRNZW1vcnkKKy8vQ2FsbGVyIG5lZWRzIHRvIHZhbGlkYXRlIHRoZSBpbnB1dCB2YWx1ZXMKKy8vcEJ1ZiBjYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciBoYXMgdGhlIGxlbmd0aCBvZiBuTGVuCitWT1NfU1RBVFVTIHNtZV9EYmdSZWFkTWVtb3J5KHRIYWxIYW5kbGUgaEhhbCwgdl9VMzJfdCBtZW1BZGRyLCB2X1U4X3QgKnBCdWYsIHZfVTMyX3QgbkxlbikKK3sKKyAgIFZPU19TVEFUVVMgIHN0YXR1cyAgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQykKKyAgIHZfUFZPSURfdCAgcHZvc0dDVHggPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsICh2X1ZPSURfdCAqKWhIYWwpOworICAgdEhkZEhhbmRsZSAgICAgaEhkZCA9IHBNYWMtPmhIZGQ7CisjZW5kaWYKKyAgIHRQbWNQb3dlclN0YXRlIFBvd2VyU3RhdGU7CisgICB0QU5JX1UzMiBzZXNzaW9uSWQgID0gMDsKKworICAgLyogMSkgVG8gbWFrZSBRdWFya3kgd29yayBpbiBGVE0gbW9kZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgaWYoZURSSVZFUl9UWVBFX01GRyA9PSBwTWFjLT5nRHJpdmVyVHlwZSkKKyAgIHsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MpCisgICAgICBpZiAoSEFMX1NUQVRVU19TVUNDRVNTKHBhbFJlYWREZXZpY2VNZW1vcnkoaEhkZCwgbWVtQWRkciwgKHZvaWQgKilwQnVmLCBuTGVuKSkpCisjZWxpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQykKKyAgICAgIGlmIChlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgPT0gd3BhbERiZ1JlYWRNZW1vcnkobWVtQWRkciwgKHZvaWQgKilwQnVmLCBuTGVuKSkKKyNlbmRpZgorICAgICAgeworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLyogMikgTk9OIEZUTSBtb2RlIGRyaXZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAvKiBBY3F1aXJlIFNNRSBnbG9iYWwgbG9jayAqLworICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCZwTWFjLT5zbWUpKQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MocG1jUXVlcnlQb3dlclN0YXRlKHBNYWMsICZQb3dlclN0YXRlLCBOVUxMLCBOVUxMKSkpCisgICB7CisgICAgICAvKiBBcmUgd2Ugbm90IGluIElNUFMgbW9kZT8gT3IgYXJlIHdlIGluIGNvbm5lY3RlZD8gVGhlbiB3ZSdyZSBzYWZlKi8KKyAgICAgIGlmKCFjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpIHx8IChlUE1DX0xPV19QT1dFUiAhPSBQb3dlclN0YXRlKSkKKyAgICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MpCisgICAgICAgICBpZiAoSEFMX1NUQVRVU19TVUNDRVNTKHBhbFJlYWREZXZpY2VNZW1vcnkocHZvc0dDVHgsIG1lbUFkZHIsICh2b2lkICopcEJ1ZiwgbkxlbikpKQorI2VsaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisgICAgICAgICBpZiAoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTID09IHdwYWxEYmdSZWFkTWVtb3J5KG1lbUFkZHIsICh2b2lkICopcEJ1ZiwgbkxlbikpIAorI2VuZGlmCisgICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgfQorICAgfQorCisgICAvKiBUaGlzIGlzIGEgaGFjayBmb3IgUXVhbGt5L3B0dFduaVNvY2tldAorICAgICAgQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGFsbG93IHB0dFduaVNvY2tldCB0byBpbmZvcm0gUXVhbGt5IGFuIGVycm9yICovCisgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIHZvc19tZW1fc2V0KHBCdWYsIG5MZW4sIDB4Q0QpOworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgZmlsbGVkIHdpdGggMHhDRCBiZWNhdXNlIGl0IGNhbm5vdCBhY2Nlc3MgdGhlIGhhcmR3YXJlXG4iKSk7CisgICB9CisKKyAgIC8qIFJlbGVhc2UgU01FIGxvY2sgKi8KKyAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jaygmcE1hYy0+c21lKTsKKyAgICAKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisvL3NtZV9EYmdXcml0ZU1lbW9yeQorLy9DYWxsZXIgbmVlZHMgdG8gdmFsaWRhdGUgdGhlIGlucHV0IHZhbHVlcworVk9TX1NUQVRVUyBzbWVfRGJnV3JpdGVNZW1vcnkodEhhbEhhbmRsZSBoSGFsLCB2X1UzMl90IG1lbUFkZHIsIHZfVThfdCAqcEJ1Ziwgdl9VMzJfdCBuTGVuKQoreworICAgVk9TX1NUQVRVUyAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsICBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DKQorICAgdEhkZEhhbmRsZSAgICAgIGhIZGQgPSBwTWFjLT5oSGRkOworI2VuZGlmCisgICB0UG1jUG93ZXJTdGF0ZSBQb3dlclN0YXRlOworICAgdEFOSV9VMzIgICBzZXNzaW9uSWQgPSAwOworCisgICAvKiAxKSBUbyBtYWtlIFF1YXJreSB3b3JrIGluIEZUTSBtb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICBpZihlRFJJVkVSX1RZUEVfTUZHID09IHBNYWMtPmdEcml2ZXJUeXBlKQorICAgeworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQykKKyAgICAgIGlmIChIQUxfU1RBVFVTX1NVQ0NFU1MocGFsV3JpdGVEZXZpY2VNZW1vcnkoaEhkZCwgbWVtQWRkciwgKHZvaWQgKilwQnVmLCBuTGVuKSkpCisjZWxpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MpCisgICAgICBpZiAoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTID09IHdwYWxEYmdXcml0ZU1lbW9yeSggbWVtQWRkciwgKHZvaWQgKilwQnVmLCBuTGVuKSkKKyNlbmRpZgorICAgICAgeworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLyogMikgTk9OIEZUTSBtb2RlIGRyaXZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAvKiBBY3F1aXJlIFNNRSBnbG9iYWwgbG9jayAqLworICAgaWYgKGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCZwTWFjLT5zbWUpKQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1MocG1jUXVlcnlQb3dlclN0YXRlKHBNYWMsICZQb3dlclN0YXRlLCBOVUxMLCBOVUxMKSkpCisgICB7CisgICAgICAvKiBBcmUgd2Ugbm90IGluIElNUFMgbW9kZT8gT3IgYXJlIHdlIGluIGNvbm5lY3RlZD8gVGhlbiB3ZSdyZSBzYWZlKi8KKyAgICAgIGlmKCFjc3JJc0Nvbm5TdGF0ZURpc2Nvbm5lY3RlZChwTWFjLCBzZXNzaW9uSWQpIHx8IChlUE1DX0xPV19QT1dFUiAhPSBQb3dlclN0YXRlKSkKKyAgICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MpCisgICAgICAgICBpZiAoSEFMX1NUQVRVU19TVUNDRVNTKHBhbFdyaXRlRGV2aWNlTWVtb3J5KGhIZGQsIG1lbUFkZHIsICh2b2lkICopcEJ1ZiwgbkxlbikpKQorI2VsaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisgICAgICAgICBpZiAoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTID09IHdwYWxEYmdXcml0ZU1lbW9yeShtZW1BZGRyLCAodm9pZCAqKXBCdWYsIG5MZW4pKQorI2VuZGlmCisgICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgfQorICAgfQorCisgICAvKiBSZWxlYXNlIEdsb2JhbCBsb2NrICovCisgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soJnBNYWMtPnNtZSk7CisgICAgCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKwordm9pZCBzbXNMb2codHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHJpbmcsLi4uKSAKK3sKKyNpZmRlZiBXTEFOX0RFQlVHCisgICAgLy8gVmVyaWZ5IGFnYWluc3QgY3VycmVudCBsb2cgbGV2ZWwKKyAgICBpZiAoIGxvZ2xldmVsID4gcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW0xPR19JTkRFWF9GT1JfTU9EVUxFKCBTSVJfU01TX01PRFVMRV9JRCApXSApCisgICAgICAgIHJldHVybjsKKyAgICBlbHNlCisgICAgeworICAgICAgICB2YV9saXN0IG1hcmtlcjsKKworICAgICAgICB2YV9zdGFydCggbWFya2VyLCBwU3RyaW5nICk7ICAgICAvKiBJbml0aWFsaXplIHZhcmlhYmxlIGFyZ3VtZW50cy4gKi8KKworICAgICAgICBsb2dEZWJ1ZyhwTWFjLCBTSVJfU01TX01PRFVMRV9JRCwgbG9nbGV2ZWwsIHBTdHJpbmcsIG1hcmtlcik7CisKKyAgICAgICAgdmFfZW5kKCBtYXJrZXIgKTsgICAgICAgICAgICAgIC8qIFJlc2V0IHZhcmlhYmxlIGFyZ3VtZW50cy4gICAgICAqLworICAgIH0KKyNlbmRpZgorfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MgIAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9HZXRGd1ZlcnNpb24KKyAgICBcYnJpZWYgIFRoaXMgQVBJIHJldHVybnMgdGhlIGZpcm13YXJlIHZlcnNpb24uCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgdmVyc2lvbiAtIFBvaW50cyB0byB0aGUgRndWZXJzaW9uSW5mbyBzdHJ1Y3R1cmUuCisgICAgXHJldHVybiBWT1NfU1RBVFVTCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBmYWlsdXJlCisgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgIHN1Y2Nlc3MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgc21lX0dldEZ3VmVyc2lvbiAodEhhbEhhbmRsZSBoSGFsLEZ3VmVyc2lvbkluZm8gKnBWZXJzaW9uKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkKKyAgICB7CisgICAgICAgIGlmKCBwVmVyc2lvbiAhPSBOVUxMICkgeworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCh2X1ZPSURfdCopcFZlcnNpb24sKHZfVk9JRF90KikmcE1hYy0+aGFsLkZ3UGFyYW0uZndWZXJzaW9uLCBzaXplb2YoRndWZXJzaW9uSW5mbykpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICB9CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0dldFdjbnNzV2xhbkNvbXBpbGVkVmVyc2lvbgorICAgIFxicmllZiAgVGhpcyBBUEkgcmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgV0NOU1MgV0xBTiBBUEkgd2l0aAorICAgICAgICAgICAgd2hpY2ggdGhlIEhPU1QgZHJpdmVyIHdhcyBidWlsdAorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBWZXJzaW9uIC0gUG9pbnRzIHRvIHRoZSBWZXJzaW9uIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQKKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIGZhaWx1cmUKKyAgICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgc3VjY2VzcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBzbWVfR2V0V2Nuc3NXbGFuQ29tcGlsZWRWZXJzaW9uKHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyVmVyc2lvblR5cGUgKnBWZXJzaW9uKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHZfQ09OVEVYVF90IHZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU01FLCBOVUxMKTsKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKSApCisgICAgeworICAgICAgICBpZiggcFZlcnNpb24gIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFdEQV9HZXRXY25zc1dsYW5Db21waWxlZFZlcnNpb24odm9zQ29udGV4dCwgcFZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICB9CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0dldFdjbnNzV2xhblJlcG9ydGVkVmVyc2lvbgorICAgIFxicmllZiAgVGhpcyBBUEkgcmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgV0NOU1MgV0xBTiBBUEkgd2l0aAorICAgICAgICAgICAgd2hpY2ggdGhlIFdDTlNTIGRyaXZlciByZXBvcnRzIGl0IHdhcyBidWlsdAorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBWZXJzaW9uIC0gUG9pbnRzIHRvIHRoZSBWZXJzaW9uIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQKKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIGZhaWx1cmUKKyAgICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgc3VjY2VzcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBzbWVfR2V0V2Nuc3NXbGFuUmVwb3J0ZWRWZXJzaW9uKHRIYWxIYW5kbGUgaEhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyVmVyc2lvblR5cGUgKnBWZXJzaW9uKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHZfQ09OVEVYVF90IHZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU01FLCBOVUxMKTsKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKSApCisgICAgeworICAgICAgICBpZiggcFZlcnNpb24gIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFdEQV9HZXRXY25zc1dsYW5SZXBvcnRlZFZlcnNpb24odm9zQ29udGV4dCwgcFZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICB9CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0dldFdjbnNzU29mdHdhcmVWZXJzaW9uCisgICAgXGJyaWVmICBUaGlzIEFQSSByZXR1cm5zIHRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgV0NOU1MgZHJpdmVyCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFZlcnNpb24gLSBQb2ludHMgdG8gdGhlIFZlcnNpb24gc3RyaW5nIGJ1ZmZlciB0byBiZSBmaWxsZWQKKyAgICBccGFyYW0gIHZlcnNpb25CdWZmZXJTaXplIC0gVEhlIHNpemUgb2YgdGhlIFZlcnNpb24gc3RyaW5nIGJ1ZmZlcgorICAgIFxyZXR1cm4gVk9TX1NUQVRVUworICAgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gZmFpbHVyZQorICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICBzdWNjZXNzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHNtZV9HZXRXY25zc1NvZnR3YXJlVmVyc2lvbih0SGFsSGFuZGxlIGhIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHZlcnNpb25CdWZmZXJTaXplKQoreworICAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHZfQ09OVEVYVF90IHZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU01FLCBOVUxMKTsKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKSApCisgICAgeworICAgICAgICBpZiggcFZlcnNpb24gIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFdEQV9HZXRXY25zc1NvZnR3YXJlVmVyc2lvbih2b3NDb250ZXh0LCBwVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uQnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfR2V0V2Nuc3NIYXJkd2FyZVZlcnNpb24KKyAgICBcYnJpZWYgIFRoaXMgQVBJIHJldHVybnMgdGhlIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBXQ05TUyBoYXJkd2FyZQorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBWZXJzaW9uIC0gUG9pbnRzIHRvIHRoZSBWZXJzaW9uIHN0cmluZyBidWZmZXIgdG8gYmUgZmlsbGVkCisgICAgXHBhcmFtICB2ZXJzaW9uQnVmZmVyU2l6ZSAtIFRIZSBzaXplIG9mIHRoZSBWZXJzaW9uIHN0cmluZyBidWZmZXIKKyAgICBccmV0dXJuIFZPU19TVEFUVVMKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIGZhaWx1cmUKKyAgICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgc3VjY2VzcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBzbWVfR2V0V2Nuc3NIYXJkd2FyZVZlcnNpb24odEhhbEhhbmRsZSBoSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiB2ZXJzaW9uQnVmZmVyU2l6ZSkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICB2X0NPTlRFWFRfdCB2b3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgTlVMTCk7CisKKyAgICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICkgKQorICAgIHsKKyAgICAgICAgaWYoIHBWZXJzaW9uICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBXREFfR2V0V2Nuc3NIYXJkd2FyZVZlcnNpb24odm9zQ29udGV4dCwgcFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbkJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICB9CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUm9hbVNldEJLSURDYWNoZQorICAgIFxicmllZiBUaGUgU01FIEFQSSBleHBvc2VkIHRvIEhERCB0byBhbGxvdyBIREQgdG8gcHJvdmRlIFNNRSB0aGUgQktJRAorICAgIGNhbmRpZGF0ZSBsaXN0LgorICAgIFxwYXJhbSBoSGFsIC0gSGFuZGxlIHRvIHRoZSBIQUwuIFRoZSBIQUwgaGFuZGxlIGlzIHJldHVybmVkIGJ5IHRoZSBIQUwgYWZ0ZXIKKyAgICBpdCBpcyBvcGVuZWQgKGJ5IGNhbGxpbmcgaGFsT3BlbikuCisgICAgXHBhcmFtIHBCS0lEQ2FjaGUgLSBjYWxsZXIgYWxsb2NhdGVkIGJ1ZmZlciBwb2ludCB0byBhbiBhcnJheSBvZiB0QmtpZENhY2hlSW5mbworICAgIFxwYXJhbSBudW1JdGVtcyAtIGEgdmFyaWFibGUgdGhhdCBoYXMgdGhlIG51bWJlciBvZiB0QmtpZENhY2hlSW5mbyBhbGxvY2F0ZWQKKyAgICB3aGVuIHJldHJ1bmluZywgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHB1dCBpbnRvIHBCS0lEQ2FjaGUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90CisgICAgYmlnIGVub3VnaCBhbmQgcE51bUl0ZW1zIGhhcyB0aGUgbnVtYmVyIG9mIHRCa2lkQ2FjaGVJbmZvLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVNldEJLSURDYWNoZSggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRCa2lkQ2FjaGVJbmZvICpwQktJRENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbnVtSXRlbXMgKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgICBzdGF0dXMgPSBjc3JSb2FtU2V0QktJRENhY2hlKCBwTWFjLCBzZXNzaW9uSWQsIHBCS0lEQ2FjaGUsIG51bUl0ZW1zICk7CisgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9Sb2FtR2V0QktJRENhY2hlCisgICAgXGJyaWVmIFRoZSBTTUUgQVBJIGV4cG9zZWQgdG8gSEREIHRvIGFsbG93IEhERCB0byByZXF1ZXN0IFNNRSB0byByZXR1cm4gaXRzCisgICAgQktJRCBjYWNoZS4KKyAgICBccGFyYW0gaEhhbCAtIEhhbmRsZSB0byB0aGUgSEFMLiBUaGUgSEFMIGhhbmRsZSBpcyByZXR1cm5lZCBieSB0aGUgSEFMIGFmdGVyCisgICAgaXQgaXMgb3BlbmVkIChieSBjYWxsaW5nIGhhbE9wZW4pLgorICAgIFxwYXJhbSBwTnVtIC0gY2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgdGhhdCBoYXMgdGhlIHNwYWNlIG9mIHRoZSBudW1iZXIgb2YKKyAgICB0QmtpZENhY2hlSW5mbyBhcyBpbnB1dC4gVXBvbiByZXR1cm5lZCwgKnBOdW0gaGFzIHRoZSBuZWVkZWQgbnVtYmVyIG9mIGVudHJpZXMKKyAgICBpbiBTTUUgY2FjaGUuCisgICAgXHBhcmFtIHBCa2lkQ2FjaGUgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSB0aGF0IGNvbnRhaW5zIEJLSUQgY2FjaGUsIGlmIGFueSwKKyAgICB1cG9uIHJldHVybgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAtIHdoZW4gZmFpbCwgaXQgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBpcyBub3QKKyAgICBiaWcgZW5vdWdoLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbUdldEJLSURDYWNoZSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyICpwTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QmtpZENhY2hlSW5mbyAqcEJraWRDYWNoZSkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIgISEhISEhISEhISEhISEhISEhU2Vzc2lvbklkIGlzIGhhcmRjb2RlZFxuIikpOworICAgICAgIHN0YXR1cyA9IGNzclJvYW1HZXRCS0lEQ2FjaGUoIHBNYWMsIDAsIHBOdW0sIHBCa2lkQ2FjaGUgKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JvYW1HZXROdW1CS0lEQ2FjaGUKKyAgICBcYnJpZWYgVGhlIFNNRSBBUEkgZXhwb3NlZCB0byBIREQgdG8gYWxsb3cgSEREIHRvIHJlcXVlc3QgU01FIHRvIHJldHVybiB0aGUKKyAgICBudW1iZXIgb2YgQktJRCBjYWNoZSBlbnRyaWVzLgorICAgIFxwYXJhbSBoSGFsIC0gSGFuZGxlIHRvIHRoZSBIQUwuIFRoZSBIQUwgaGFuZGxlIGlzIHJldHVybmVkIGJ5IHRoZSBIQUwgYWZ0ZXIKKyAgICBpdCBpcyBvcGVuZWQgKGJ5IGNhbGxpbmcgaGFsT3BlbikuCisgICAgXHJldHVybiB0QU5JX1UzMiAtIHRoZSBudW1iZXIgb2YgQktJRCBjYWNoZSBlbnRyaWVzLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9VMzIgc21lX1JvYW1HZXROdW1CS0lEQ2FjaGUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1UzMiBzZXNzaW9uSWQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgIHRBTklfVTMyIG51bUJraWRDYWNoZSA9IDA7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgICBudW1Ca2lkQ2FjaGUgPSBjc3JSb2FtR2V0TnVtQktJRENhY2hlKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuIChudW1Ca2lkQ2FjaGUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NjYW5HZXRCS0lEQ2FuZGlkYXRlTGlzdAorICAgIFxicmllZiBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBCS0lEIGNhbmRpZGF0ZSBsaXN0CisgICAgXHBhcmFtIHBCa2lkTGlzdCAtIGNhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHBvaW50IHRvIGFuIGFycmF5IG9mCisgICAgICAgICAgICAgICAgICAgICAgICB0QmtpZENhbmRpZGF0ZUluZm8KKyAgICBccGFyYW0gcE51bUl0ZW1zIC0gcG9pbnRlciB0byBhIHZhcmlhYmxlIHRoYXQgaGFzIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgdEJraWRDYW5kaWRhdGVJbmZvIGFsbG9jYXRlZCB3aGVuIHJldHJ1bmluZywgdGhpcyBpcworICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIG51bWJlciBuZWVkZWQgb3IgbnVtYmVyIG9mIGl0ZW1zIHB1dCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgIHBQbWtpZExpc3QKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSB3aGVuIGZhaWwsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgYmlnIGVub3VnaCBhbmQgcE51bUl0ZW1zCisgICAgaGFzIHRoZSBudW1iZXIgb2YgdEJraWRDYW5kaWRhdGVJbmZvLgorICAgIFxOb3RlOiBwTnVtSXRlbXMgaXMgYSBudW1iZXIgb2YgdEJraWRDYW5kaWRhdGVJbmZvLAorICAgICAgICAgICBub3Qgc2l6ZW9mKHRCa2lkQ2FuZGlkYXRlSW5mbykgKiBzb21ldGhpbmcKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1NjYW5HZXRCS0lEQ2FuZGlkYXRlTGlzdCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QmtpZENhbmRpZGF0ZUluZm8gKnBCa2lkTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcE51bUl0ZW1zICkKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gY3NyU2NhbkdldEJLSURDYW5kaWRhdGVMaXN0KCBwTWFjLCBzZXNzaW9uSWQsIHBCa2lkTGlzdCwgcE51bUl0ZW1zICk7CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgc21lX09wZW5TZXNzaW9uKCkgLSBPcGVuIGEgc2Vzc2lvbiBmb3Igc2Nhbi9yb2FtIG9wZXJhdGlvbi4KKworICBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisKKyAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgIFxwYXJhbSBjYWxsYmFjayAtIEEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gY2FsbGVyIHNwZWNpZmllcyBmb3Igcm9hbS9jb25uZWN0IHN0YXR1cyBpbmRpY2F0aW9uCisgIFxwYXJhbSBwQ29udGV4dCAtIFRoZSBjb250ZXh0IHBhc3NlZCB3aXRoIGNhbGxiYWNrCisgIFxwYXJhbSBwU2VsZk1hY0FkZHIgLSBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBmaWxsZWQgd2l0aCBzZWxmIE1BQyBhZGRyZXNzICg2IGJ5dGVzKQorICBccGFyYW0gcGJTZXNzaW9uSWQgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgZm9yIHJldHVybmVkIHNlc3Npb24gSUQKKworICBccmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1MgLSBzZXNzaW9uIGlzIG9wZW5lZC4gc2Vzc2lvbklkIHJldHVybmVkLgorCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gb3BlbiB0aGUgc2Vzc2lvbi4KKyAgICAgICAgICBlSEFMX1NUQVRVU19SRVNPVVJDRVMgLSBubyBtb3JlIHNlc3Npb24gYXZhaWxhYmxlLgorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9PcGVuU2Vzc2lvbih0SGFsSGFuZGxlIGhIYWwsIGNzclJvYW1Db21wbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBTZWxmTWFjQWRkciwgdEFOSV9VOCAqcGJTZXNzaW9uSWQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBpZiggTlVMTCA9PSBwYlNlc3Npb25JZCApCisgICB7CisgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgICAgIHsKKyAgICAgICAgIHN0YXR1cyA9IGNzclJvYW1PcGVuU2Vzc2lvbiggcE1hYywgY2FsbGJhY2ssIHBDb250ZXh0LCBwU2VsZk1hY0FkZHIsIHBiU2Vzc2lvbklkICk7CisKKyAgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gKCBzdGF0dXMgKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHNtZV9DbG9zZVNlc3Npb24oKSAtIE9wZW4gYSBzZXNzaW9uIGZvciBzY2FuL3JvYW0gb3BlcmF0aW9uLgorCisgIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBBUEkuCisKKworICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKworICBccGFyYW0gc2Vzc2lvbklkIC0gQSBwcmV2aW91cyBvcGVuZWQgc2Vzc2lvbidzIElELgorCisgIFxyZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUyAtIHNlc3Npb24gaXMgY2xvc2VkLgorCisgICAgICAgICAgT3RoZXIgc3RhdHVzIG1lYW5zIFNNRSBpcyBmYWlsZWQgdG8gb3BlbiB0aGUgc2Vzc2lvbi4KKyAgICAgICAgICBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUiAtIHNlc3Npb24gaXMgbm90IG9wZW5lZC4KKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfQ2xvc2VTZXNzaW9uKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNzclJvYW1TZXNzaW9uQ2xvc2VDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqcENvbnRleHQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICBzdGF0dXMgPSBjc3JSb2FtQ2xvc2VTZXNzaW9uKCBwTWFjLCBzZXNzaW9uSWQsIEZBTFNFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwQ29udGV4dCApOworCisgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuICggc3RhdHVzICk7Cit9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfUm9hbVVwZGF0ZUFQV1BTSUUKKworICAgIFxicmllZiBUbyB1cGRhdGUgQVAncyBXUFMgSUUuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBTTUUgQVAgc2Vzc2lvbiBpcyBjcmVhdGVkCisgICAgVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIHBBUFdQU0lFUyAtIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB0U2lyQVBXUFNJRXMKKworICAgIFxyZXR1cm4gZUhhbFN0YXR1cyDCliBTVUNDRVNTIMKWCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFIG9yIFJFU09VUkNFUyDCliBUaGUgQVBJIGZpbmlzaGVkIGFuZCBmYWlsZWQuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9Sb2FtVXBkYXRlQVBXUFNJRSh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCB0U2lyQVBXUFNJRXMgKnBBUFdQU0lFUykKK3sKKworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKworICAgICAgc3RhdHVzID0gY3NyUm9hbVVwZGF0ZUFQV1BTSUUoIHBNYWMsIHNlc3Npb25JZCwgcEFQV1BTSUVTICk7CisKKyAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfUm9hbVVwZGF0ZUFQV1BBUlNOSUVzCisKKyAgICBcYnJpZWYgVG8gdXBkYXRlIEFQJ3MgV1BBL1JTTiBJRXMuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBTTUUgQVAgc2Vzc2lvbiBpcyBjcmVhdGVkCisgICAgVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIHBBUFNpclJTTmllIC0gcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHRTaXJSU05pZSB3aXRoIFdQUy9SU04gSUVzCisKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgwpYgU1VDQ0VTUyDClgorCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSBvciBSRVNPVVJDRVMgwpYgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUm9hbVVwZGF0ZUFQV1BBUlNOSUVzKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRTaXJSU05pZSAqIHBBUFNpclJTTmllKQoreworCisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworCisgICAgICBzdGF0dXMgPSBjc3JSb2FtVXBkYXRlV1BBUlNOSUVzKCBwTWFjLCBzZXNzaW9uSWQsIHBBUFNpclJTTmllKTsKKworICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoc3RhdHVzKTsKK30KKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKworICBcZm4gc21lX3NlbmRCVEFtcEV2ZW50CisKKyAgXGJyaWVmIHRvIHJlY2VpdmUgdGhlIGNvZXggcHJpb3J0eSByZXF1ZXN0IGZyb20gQlQtQU1QIFBBTAorICBhbmQgc2VuZCB0aGUgQlRfQU1QIGxpbmsgc3RhdGUgdG8gSEFMCisKKyAgXHBhcmFtIGJ0QW1wRXZlbnQgLSBidEFtcEV2ZW50CisKKyAgXHJldHVybiBlSGFsU3RhdHVzOiBTVUNFU1MgOiBCVEFtcCBldmVudCBzdWNjZXNzZnVsbHkgc2VudCB0byBIQUwKKworICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkU6IEFQSSBmYWlsZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2VIYWxTdGF0dXMgc21lX3NlbmRCVEFtcEV2ZW50KHRIYWxIYW5kbGUgaEhhbCwgdFNtZUJ0QW1wRXZlbnQgYnRBbXBFdmVudCkKK3sKKyAgdm9zX21zZ190IG1zZzsKKyAgdHBTbWVCdEFtcEV2ZW50IHB0clNtZUJ0QW1wRXZlbnQgPSBOVUxMOworICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisKKyAgcHRyU21lQnRBbXBFdmVudCA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0cFNtZUJ0QW1wRXZlbnQpKTsKKyAgaWYgKE5VTEwgPT0gcHRyU21lQnRBbXBFdmVudCkKKyAgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiAiCisgICAgICAgICAgICJOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEJUQW1wIGV2ZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICB2b3NfbWVtX2NvcHkocHRyU21lQnRBbXBFdmVudCwgKHZvaWQqKSZidEFtcEV2ZW50LCBzaXplb2YodFNtZUJ0QW1wRXZlbnQpKTsKKyAgbXNnLnR5cGUgPSBXREFfU0lHTkFMX0JUQU1QX0VWRU5UOworICBtc2cucmVzZXJ2ZWQgPSAwOworICBtc2cuYm9keXB0ciA9IHB0clNtZUJ0QW1wRXZlbnQ7CisKKyAgLy9zdGF0dXMgPSBoYWxGV19TZW5kQlRBbXBFdmVudE1lc2cocE1hYywgZXZlbnQpOworCisgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NT0RVTEVfSURfV0RBLCAmbXNnKSkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6ICIKKyAgICAgICAgICAgIk5vdCBhYmxlIHRvIHBvc3QgU0lSX0hBTF9TSUdOQUxfQlRBTVBfRVZFTlQgbWVzc2FnZSB0byBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgIHZvc19tZW1fZnJlZShwdHJTbWVCdEFtcEV2ZW50KTsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisKKyAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TZXRIb3N0T2ZmbG9hZAorICAgIFxicmllZiAgQVBJIHRvIHNldCB0aGUgaG9zdCBvZmZsb2FkIGZlYXR1cmUuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJlcXVlc3QgLSAgUG9pbnRlciB0byB0aGUgb2ZmbG9hZCByZXF1ZXN0LgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2V0SG9zdE9mZmxvYWQgKHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJIb3N0T2ZmbG9hZFJlcSBwUmVxdWVzdCkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAoIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkgKQorICAgIHsKKyNpZmRlZiBXTEFOX05TX09GRkxPQUQKKyAgICAgICAgaWYoU0lSX0lQVjZfTlNfT0ZGTE9BRCA9PSBwUmVxdWVzdC0+b2ZmbG9hZFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBtY1NldE5TT2ZmbG9hZCggaEhhbCwgcFJlcXVlc3QgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLy9XTEFOX05TX09GRkxPQUQKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gcG1jU2V0SG9zdE9mZmxvYWQgKGhIYWwsIHBSZXF1ZXN0KTsKKyAgICAgICAgfQorICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2V0R1RLT2ZmbG9hZAorICAgIFxicmllZiAgQVBJIHRvIHNldCBHVEsgb2ZmbG9hZCBpbmZvcm1hdGlvbi4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwUmVxdWVzdCAtICBQb2ludGVyIHRvIHRoZSBHVEsgb2ZmbG9hZCByZXF1ZXN0LgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfU2V0R1RLT2ZmbG9hZCAodEhhbEhhbmRsZSBoSGFsLCB0cFNpckd0a09mZmxvYWRQYXJhbXMgcFJlcXVlc3QpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisKKyAgICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gKCBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKSApICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHBtY1NldEdUS09mZmxvYWQoIGhIYWwsIHBSZXF1ZXN0ICk7CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9HZXRHVEtPZmZsb2FkCisgICAgXGJyaWVmICBBUEkgdG8gZ2V0IEdUSyBvZmZsb2FkIGluZm9ybWF0aW9uLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIHBSZXF1ZXN0IC0gIFBvaW50ZXIgdG8gdGhlIEdUSyBvZmZsb2FkIHJlc3BvbnNlLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0R1RLT2ZmbG9hZCAodEhhbEhhbmRsZSBoSGFsLCBHVEtPZmZsb2FkR2V0SW5mb0NhbGxiYWNrIGNhbGxiYWNrUm91dGluZSwgdm9pZCAqY2FsbGJhY2tDb250ZXh0ICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAoIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkgKQorICAgIHsKKyAgICAgICAgcG1jR2V0R1RLT2ZmbG9hZChoSGFsLCBjYWxsYmFja1JvdXRpbmUsIGNhbGxiYWNrQ29udGV4dCk7CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9TZXRLZWVwQWxpdmUKKyAgICBcYnJpZWYgIEFQSSB0byBzZXQgdGhlIEtlZXAgQWxpdmUgZmVhdHVyZS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwUmVxdWVzdCAtICBQb2ludGVyIHRvIHRoZSBLZWVwIEFsaXZlIHJlcXVlc3QuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRLZWVwQWxpdmUgKHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJLZWVwQWxpdmVSZXEgcFJlcXVlc3QpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiAiCisgICAgICAgICAgICJzZXR0aW5nIEtlZXAgYWxpdmUgaW4gU01FIFRQICVkIiwgX19GVU5DVElPTl9fLHBSZXF1ZXN0LT50aW1lUGVyaW9kKTsKKworCisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09ICggc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICkgKSApCisgICAgeworICAgICAgICBzdGF0dXMgPSBwbWNTZXRLZWVwQWxpdmUgKGhIYWwsIHBSZXF1ZXN0KTsKKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorCisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1NldFByZWZlcnJlZE5ldHdvcmtMaXN0CisgICAgXGJyaWVmICBBUEkgdG8gc2V0IHRoZSBQcmVmZXJyZWQgTmV0d29yayBMaXN0IE9mZmxvYWQgZmVhdHVyZS4KKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwUmVxdWVzdCAtICBQb2ludGVyIHRvIHRoZSBvZmZsb2FkIHJlcXVlc3QuCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRQcmVmZXJyZWROZXR3b3JrTGlzdCAodEhhbEhhbmRsZSBoSGFsLCB0cFNpclBOT1NjYW5SZXEgcFJlcXVlc3QsIHRBTklfVTggc2Vzc2lvbklkLCB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0LCB0U2lyUHJlZk5ldHdvcmtGb3VuZEluZCAqcFByZWZOZXR3b3JrRm91bmRJbmQpLCB2b2lkICpjYWxsYmFja0NvbnRleHQgKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09ICggc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICkgKSApCisgICAgeworICAgICAgICBwbWNTZXRQcmVmZXJyZWROZXR3b3JrTGlzdChoSGFsLCBwUmVxdWVzdCwgc2Vzc2lvbklkLCBjYWxsYmFja1JvdXRpbmUsIGNhbGxiYWNrQ29udGV4dCk7CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworZUhhbFN0YXR1cyBzbWVfU2V0UlNTSUZpbHRlcih0SGFsSGFuZGxlIGhIYWwsIHZfVThfdCByc3NpVGhyZXNob2xkKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09ICggc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICkgKSApCisgICAgeworICAgICAgICBwbWNTZXRSc3NpRmlsdGVyKGhIYWwsIHJzc2lUaHJlc2hvbGQpOworICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworZUhhbFN0YXR1cyBzbWVfU2V0UG93ZXJQYXJhbXModEhhbEhhbmRsZSBoSGFsLCB0U2lyU2V0UG93ZXJQYXJhbXNSZXEqIHB3UGFyYW1zKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09ICggc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICkgKSApCisgICAgeworICAgICAgICBwbWNTZXRQb3dlclBhcmFtcyhoSGFsLCBwd1BhcmFtcyk7CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgXGZuIHNtZV9BYm9ydE1hY1NjYW4KKyAgICBcYnJpZWYgIEFQSSB0byBjYW5jZWwgTUFDIHNjYW4uCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxyZXR1cm4gVk9TX1NUQVRVUworICAgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBmYWlsdXJlCisgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgIHN1Y2Nlc3MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0Fib3J0TWFjU2Nhbih0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICBzdGF0dXMgPSBjc3JTY2FuQWJvcnRNYWNTY2FuKHBNYWMpOworICAgIAorICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKCBzdGF0dXMgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBcZm4gc21lX0dldE9wZXJhdGlvbkNoYW5uZWwKKyAgICAgICAgXGJyaWVmIEFQSSB0byBnZXQgY3VycmVudCBjaGFubmVsIG9uIHdoaWNoIFNUQSBpcyBwYXJrZWQKKyAgICAgICAgdGhpcyBmdW5jdGlvbiBnaXZlcyBjaGFubmVsIGluZm9ybWF0aW9uIG9ubHkgb2YgaW5mcmEgc3RhdGlvbiBvciBJQlNTIHN0YXRpb24KKyAgICAgICAgXHBhcmFtIGhIYWwgYW5kIHBvaXRlciB0byBtZW1vcnkgbG9jYXRpb24KKyAgICAgICAgXHJldHVybnMgZUhBTF9TVEFUVVNfU1VDQ0VTUworICAgICAgICAgICAgICAgIGVIQUxfU1RBVFVTX0ZBSUxVUkUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfR2V0T3BlcmF0aW9uQ2hhbm5lbCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTMyICpwQ2hhbm5lbCkKK3sKKyAgICB0QU5JX1UzMiBzZXNzaW9uSWQ7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbjsKKworICAgIGZvciAoc2Vzc2lvbklkID0gMDsgc2Vzc2lvbklkIDwgQ1NSX1JPQU1fU0VTU0lPTl9NQVggOyBzZXNzaW9uSWQrKykKKyAgICB7CisgICAgICAgaWYgKENTUl9JU19TRVNTSU9OX1ZBTElEKCBwTWFjLCBzZXNzaW9uSWQgKSkKKyAgICAgICB7CisgICAgICAgICAgcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworCisgICAgICAgICAgaWYoKCBwU2Vzc2lvbi0+Y29ubmVjdGVkUHJvZmlsZS5CU1NUeXBlID09IGVDU1JfQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUgKSB8fCAKKyAgICAgICAgICAgICAoIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGUgPT0gZUNTUl9CU1NfVFlQRV9JQlNTICkgfHwKKyAgICAgICAgICAgICAoIHBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLkJTU1R5cGUgPT0gZUNTUl9CU1NfVFlQRV9TVEFSVF9JQlNTICkpCisgICAgICAgICAgeworICAgICAgICAgICAgICAqcENoYW5uZWwgPXBTZXNzaW9uLT5jb25uZWN0ZWRQcm9maWxlLm9wZXJhdGlvbkNoYW5uZWw7CisgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworfS8vIHNtZV9HZXRPcGVyYXRpb25DaGFubmVsIGVuZHMgaGVyZQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX1JlZ2lzdGVyTWd0RnJhbWUKKworICAgIFxicmllZiBUbyByZWdpc3RlciBtYW5hZ21lbnQgZnJhbWUgb2Ygc3BlY2lmaWVkIHR5cGUgYW5kIHN1YnR5cGUuIAorICAgIFxwYXJhbSBmcmFtZVR5cGUgLSB0eXBlIG9mIHRoZSBmcmFtZSB0aGF0IG5lZWRzIHRvIGJlIHBhc3NlZCB0byBIREQuCisgICAgXHBhcmFtIG1hdGNoRGF0YSAtIGRhdGEgd2hpY2ggbmVlZHMgdG8gYmUgbWF0Y2hlZCBiZWZvcmUgcGFzc2luZyBmcmFtZSAKKyAgICAgICAgICAgICAgICAgICAgICAgdG8gSERELiAKKyAgICBccGFyYW0gbWF0Y2hEYXRhTGVuIC0gTGVuZ3RoIG9mIG1hdGNoZWQgZGF0YS4KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBzbWVfUmVnaXN0ZXJNZ210RnJhbWUodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCwgCisgICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiBmcmFtZVR5cGUsIHRBTklfVTgqIG1hdGNoRGF0YSwgdEFOSV9VMTYgbWF0Y2hMZW4pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAoIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkgKQorICAgIHsKKyAgICAgICAgdFNpclJlZ2lzdGVyTWdtdEZyYW1lICpwTXNnOworICAgICAgICB0QU5JX1UxNiBsZW47CisgICAgICAgIHRDc3JSb2FtU2Vzc2lvbiAqcFNlc3Npb24gPSBDU1JfR0VUX1NFU1NJT04oIHBNYWMsIHNlc3Npb25JZCApOworICAgICAgICAKKyAgICAgICAgaWYoICFwU2Vzc2lvbi0+c2Vzc2lvbkFjdGl2ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIEludmFsaWQgU2Vzc2lvbmlkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgICAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxlbiA9IHNpemVvZih0U2lyUmVnaXN0ZXJNZ210RnJhbWUpICsgbWF0Y2hMZW47CisgICAgICAgIAorICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCoqKSZwTXNnLCBsZW4gKTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1zZywgbGVuKTsKKyAgICAgICAgICAgIHBNc2ctPm1lc3NhZ2VUeXBlICAgICA9IGVXTklfU01FX1JFR0lTVEVSX01HTVRfRlJBTUVfUkVROworICAgICAgICAgICAgcE1zZy0+bGVuZ3RoICAgICAgICAgID0gbGVuOworICAgICAgICAgICAgcE1zZy0+c2Vzc2lvbklkICAgICAgID0gc2Vzc2lvbklkOworICAgICAgICAgICAgcE1zZy0+cmVnaXN0ZXJGcmFtZSAgID0gVk9TX1RSVUU7CisgICAgICAgICAgICBwTXNnLT5mcmFtZVR5cGUgICAgICAgPSBmcmFtZVR5cGU7CisgICAgICAgICAgICBwTXNnLT5tYXRjaExlbiAgICAgICAgPSBtYXRjaExlbjsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMsIHBNc2ctPm1hdGNoRGF0YSwgbWF0Y2hEYXRhLCBtYXRjaExlbik7IAorICAgICAgICAgICAgc3RhdHVzID0gcGFsU2VuZE1CTWVzc2FnZShwTWFjLT5oSGRkLCBwTXNnKTsKKyAgICAgICAgfQorICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX0RlcmVnaXN0ZXJNZ3RGcmFtZQorCisgICAgXGJyaWVmIFRvIERlLXJlZ2lzdGVyIG1hbmFnbWVudCBmcmFtZSBvZiBzcGVjaWZpZWQgdHlwZSBhbmQgc3VidHlwZS4gCisgICAgXHBhcmFtIGZyYW1lVHlwZSAtIHR5cGUgb2YgdGhlIGZyYW1lIHRoYXQgbmVlZHMgdG8gYmUgcGFzc2VkIHRvIEhERC4KKyAgICBccGFyYW0gbWF0Y2hEYXRhIC0gZGF0YSB3aGljaCBuZWVkcyB0byBiZSBtYXRjaGVkIGJlZm9yZSBwYXNzaW5nIGZyYW1lIAorICAgICAgICAgICAgICAgICAgICAgICB0byBIREQuIAorICAgIFxwYXJhbSBtYXRjaERhdGFMZW4gLSBMZW5ndGggb2YgbWF0Y2hlZCBkYXRhLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9EZXJlZ2lzdGVyTWdtdEZyYW1lKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIAorICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgZnJhbWVUeXBlLCB0QU5JX1U4KiBtYXRjaERhdGEsIHRBTklfVTE2IG1hdGNoTGVuKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisKKyAgICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gKCBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKSApICkKKyAgICB7CisgICAgICAgIHRTaXJSZWdpc3Rlck1nbXRGcmFtZSAqcE1zZzsKKyAgICAgICAgdEFOSV9VMTYgbGVuOworICAgICAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhcFNlc3Npb24tPnNlc3Npb25BY3RpdmUgKSAKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgSW52YWxpZCBTZXNzaW9uaWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IHNpemVvZih0U2lyUmVnaXN0ZXJNZ210RnJhbWUpICsgbWF0Y2hMZW47CisgICAgICAgIAorICAgICAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCoqKSZwTXNnLCBsZW4gKTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1zZywgbGVuKTsKKyAgICAgICAgICAgIHBNc2ctPm1lc3NhZ2VUeXBlICAgICA9IGVXTklfU01FX1JFR0lTVEVSX01HTVRfRlJBTUVfUkVROworICAgICAgICAgICAgcE1zZy0+bGVuZ3RoICAgICAgICAgID0gbGVuOyAKKyAgICAgICAgICAgIHBNc2ctPnJlZ2lzdGVyRnJhbWUgICA9IFZPU19GQUxTRTsKKyAgICAgICAgICAgIHBNc2ctPmZyYW1lVHlwZSAgICAgICA9IGZyYW1lVHlwZTsKKyAgICAgICAgICAgIHBNc2ctPm1hdGNoTGVuICAgICAgICA9IG1hdGNoTGVuOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYywgcE1zZy0+bWF0Y2hEYXRhLCBtYXRjaERhdGEsIG1hdGNoTGVuKTsgCisgICAgICAgICAgICBzdGF0dXMgPSBwYWxTZW5kTUJNZXNzYWdlKHBNYWMtPmhIZGQsIHBNc2cpOworICAgICAgICB9CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX1JlbWFpbk9uQ2hhbm5lbAorICAgIFxicmllZiAgQVBJIHRvIHJlcXVlc3QgcmVtYWluIG9uIGNoYW5uZWwgZm9yICd4JyBkdXJhdGlvbi4gdXNlZCBpbiBwMnAgaW4gbGlzdGVuIHN0YXRlCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgcFJlcXVlc3QgLSAgY2hhbm5lbAorICAgIFxwYXJhbSAgZHVyYXRpb24gLSBkdXJhdGlvbiBpbiBtcworICAgIFxwYXJhbSBjYWxsYmFjayAtIEhERCByZWdpc3RlcmVkIGNhbGxiYWNrIHRvIHByb2Nlc3MgcmVhbWluT25DaGFubmVsUnNwCisgICAgXHBhcmFtIGNvbnRleHQgLSBIREQgQ2FsbGJhY2sgcGFyYW0KKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZUhhbFN0YXR1cyBzbWVfUmVtYWluT25DaGFubmVsKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBjaGFubmVsLCB0QU5JX1UzMiBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5PbkNoYW5DYWxsYmFjayBjYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENvbnRleHQpCit7CisgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAoIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkgKQorICB7CisgICAgc3RhdHVzID0gcDJwUmVtYWluT25DaGFubmVsIChoSGFsLCBzZXNzaW9uSWQsIGNoYW5uZWwsIGR1cmF0aW9uLCBjYWxsYmFjaywgcENvbnRleHQKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQX0lOVEVSTkFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZVAyUFJlbWFpbk9uQ2huUmVhc29uVW5rbm93bgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgIH0KKyAgcmV0dXJuKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUmVwb3J0UHJvYmVSZXEKKyAgICBcYnJpZWYgIEFQSSB0byBlbmFibGUvZGlzYWJsZSBmb3J3YXJkaW5nIG9mIHByb2JlUmVxIHRvIGFwcHMgaW4gcDJwLgorICAgIFxwYXJhbSAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gIGZhbGc6IHRvIHNldCB0aGUgUHJvYmUgcmVxdWVzdCBmb3JhcmRpbmcgdG8gd3BhX3N1cHBsaWNhbnQgaW4gbGlzdGVuIHN0YXRlIGluIHAycAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIFdMQU5fRkVBVFVSRV9DT05DVVJSRU5UX1AyUAorZUhhbFN0YXR1cyBzbWVfUmVwb3J0UHJvYmVSZXEodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IGZsYWcpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICAgIGRvCisgICAgeworICAgICAgICAvL2FjcXVpcmUgdGhlIGxvY2sgZm9yIHRoZSBzbWUgb2JqZWN0CisgICAgICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jaygmcE1hYy0+c21lKTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNhbGwgc2V0IGluIGNvbnRleHQgKi8KKyAgICAgICAgICAgIHBNYWMtPnAycENvbnRleHQucHJvYmVSZXFGb3J3YXJkaW5nID0gZmxhZzsKKyAgICAgICAgICAgIC8vcmVsZWFzZSB0aGUgbG9jayBmb3IgdGhlIHNtZSBvYmplY3QKKyAgICAgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgICAgICB9CisgICAgfSB3aGlsZSgwKTsKKworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiZXhpdGluZyBmdW5jdGlvbiAlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybihzdGF0dXMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3VwZGF0ZVAycEllCisgICAgXGJyaWVmICBBUEkgdG8gc2V0IHRoZSBQMnAgSWUgaW4gcDJwIGNvbnRleHQKKyAgICBccGFyYW0gIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtICBwMnBJZSAtICBQdHIgdG8gcDJwSWUgZnJvbSBIREQuCisgICAgXHBhcmFtIHAycEllTGVuZ3RoOiBsZW5ndGggb2YgcDJwSWUKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZUhhbFN0YXR1cyBzbWVfdXBkYXRlUDJwSWUodEhhbEhhbmRsZSBoSGFsLCB2b2lkICpwMnBJZSwgdEFOSV9VMzIgcDJwSWVMZW5ndGgpCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICAgIC8vYWNxdWlyZSB0aGUgbG9jayBmb3IgdGhlIHNtZSBvYmplY3QKKyAgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soJnBNYWMtPnNtZSk7CisgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgeworICAgICAgICBpZihOVUxMICE9IHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSl7CisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE1hYy0+cDJwQ29udGV4dC5wcm9iZVJzcEllKTsKKyAgICAgICAgICAgIHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZUxlbmd0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWUgPSB2b3NfbWVtX21hbGxvYyhwMnBJZUxlbmd0aCk7CisgICAgICAgIGlmIChOVUxMID09IHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSkKKyAgICAgICAgeworICAgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIFAyUCBJRSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBwTWFjLT5wMnBDb250ZXh0LnByb2JlUnNwSWVMZW5ndGggPSAwOworICAgICAgICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZUxlbmd0aCA9IHAycEllTGVuZ3RoOworCisgICAgICAgICAgICBzaXJEdW1wQnVmKCBwTWFjLCBTSVJfTElNX01PRFVMRV9JRCwgTE9HMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZUxlbmd0aCApOyAKKyAgICAgICAgICAgIHZvc19tZW1fY29weSgodEFOSV9VOCAqKXBNYWMtPnAycENvbnRleHQucHJvYmVSc3BJZSwgcDJwSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcDJwSWVMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLy9yZWxlYXNlIHRoZSBsb2NrIGZvciB0aGUgc21lIG9iamVjdAorICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICB9CisgICAKKyAgICBzbXNMb2cocE1hYywgTE9HMiwgImV4aXRpbmcgZnVuY3Rpb24gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByZXR1cm4oc3RhdHVzKTsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX3NlbmRBY3Rpb24KKyAgICBcYnJpZWYgIEFQSSB0byBzZW5kIGFjdGlvbiBmcmFtZSBmcm9tIHN1cHBsaWNhbnQuCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxyZXR1cm4gZUhhbFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitlSGFsU3RhdHVzIHNtZV9zZW5kQWN0aW9uKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRBTklfVTggKnBCdWYsIHRBTklfVTMyIGxlbikKK3sKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgICAgLy9hY3F1aXJlIHRoZSBsb2NrIGZvciB0aGUgc21lIG9iamVjdAorICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jaygmcE1hYy0+c21lKTsKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIHAycFNlbmRBY3Rpb24oaEhhbCwgc2Vzc2lvbklkLCBwQnVmLCBsZW4pOworICAgICAgICAvL3JlbGVhc2UgdGhlIGxvY2sgZm9yIHRoZSBzbWUgb2JqZWN0CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIHNtc0xvZyhwTWFjLCBMT0dXLCAiZXhpdGluZyBmdW5jdGlvbiAlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybihzdGF0dXMpOworfQorCitlSGFsU3RhdHVzIHNtZV9DYW5jZWxSZW1haW5PbkNoYW5uZWwodEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCApCit7CisgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworCisgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAoIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkgKQorICB7CisgICAgc3RhdHVzID0gcDJwQ2FuY2VsUmVtYWluT25DaGFubmVsIChoSGFsLCBzZXNzaW9uSWQpOworICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICB9CisgIHJldHVybihzdGF0dXMpOworfQorCisvL1Bvd2VyIFNhdmUgUmVsYXRlZAorZUhhbFN0YXR1cyBzbWVfcDJwU2V0UHModEhhbEhhbmRsZSBoSGFsLCB0UDJwUHNDb25maWcgKiBkYXRhKQoreworICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKworICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gKCBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKSApICkKKyAgeworICAgIHN0YXR1cyA9IHAycFNldFBzIChoSGFsLCBkYXRhKTsKKyAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgfQorICByZXR1cm4oc3RhdHVzKTsKK30KKworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxmbiAgICBzbWVfQ29uZmlndXJlUnhwRmlsdGVyCisKKyAgXGJyaWVmIAorICAgIFNNRSB3aWxsIHBhc3MgdGhpcyByZXF1ZXN0IHRvIGxvd2VyIG1hYyB0byBzZXQvcmVzZXQgdGhlIGZpbHRlciBvbiBSWFAgZm9yCisgICAgbXVsdGljYXN0ICYgYnJvYWRjYXN0IHRyYWZmaWMuCisKKyAgXHBhcmFtIAorCisgICAgaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4gCisgCisgICAgZmlsdGVyTWFzay0gQ3VycmVudGx5IHRoZSBBUEkgdGFrZXMgYSAxIG9yIDAgKHNldCBvciByZXNldCkgYXMgZmlsdGVyLgorICAgIEJhc2ljYWxseSB0byBlbmFibGUvZGlzYWJsZSB0aGUgZmlsdGVyICh0byBmaWx0ZXIgImFsbCIgbWNiYyB0cmFmZmljKSBiYXNlZAorICAgIG9uIHRoaXMgcGFyYW0uIEluIGZ1dHVyZSB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBtYXNrIHRvIHNldCB2YXJpb3VzIHR5cGVzIG9mCisgICAgZmlsdGVycyBhcyBzdWdnZXN0ZWQgYmVsb3c6CisgICAgRklMVEVSX0FMTF9NVUxUSUNBU1Q6CisgICAgRklMVEVSX0FMTF9CUk9BRENBU1Q6CisgICAgRklMVEVSX0FMTF9NVUxUSUNBU1RfQlJPQURDQVNUOgorCisgICAKKyAgXHJldHVybiBlSGFsU3RhdHVzICAgIAorICAKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2VIYWxTdGF0dXMgc21lX0NvbmZpZ3VyZVJ4cEZpbHRlciggdEhhbEhhbmRsZSBoSGFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpcldsYW5TZXRSeHBGaWx0ZXJzICB3bGFuUnhwRmlsdGVyUGFyYW0pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICB2b3NfbXNnX3QgICAgICAgdm9zTWVzc2FnZTsKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAoIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkgKQorICAgIHsKKyAgICAgICAgLyogc2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKyAgICAgICAgdm9zTWVzc2FnZS5ib2R5cHRyID0gd2xhblJ4cEZpbHRlclBhcmFtOworICAgICAgICB2b3NNZXNzYWdlLnR5cGUgICAgICAgICA9IFdEQV9DRkdfUlhQX0ZJTFRFUl9SRVE7CisgICAgICAgIHZvc1N0YXR1cyA9IHZvc19tcV9wb3N0X21lc3NhZ2UoIFZPU19NUV9JRF9XREEsICZ2b3NNZXNzYWdlICk7CisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKKyAgICAgICAgeworICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKyAgICByZXR1cm4oc3RhdHVzKTsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGZuICAgIHNtZV9Db25maWd1cmVTdXNwZW5kSW5kCisKKyAgXGJyaWVmIAorICAgIFNNRSB3aWxsIHBhc3MgdGhpcyByZXF1ZXN0IHRvIGxvd2VyIG1hYyB0byBJbmRpY2F0ZSB0aGF0IHRoZSB3bGFuIG5lZWRzIHRvIAorICAgIGJlIHN1c3BlbmRlZAorCisgIFxwYXJhbSAKKworICAgIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uIAorIAorICAgIHdsYW5TdXNwZW5kUGFyYW0tIERlcGljdHMgdGhlIHdsYW4gc3VzcGVuZCBwYXJhbXMKKworICAgCisgIFxyZXR1cm4gZUhhbFN0YXR1cyAgICAKKyAgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitlSGFsU3RhdHVzIHNtZV9Db25maWd1cmVTdXNwZW5kSW5kKCB0SGFsSGFuZGxlIGhIYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpcldsYW5TdXNwZW5kUGFyYW0gIHdsYW5TdXNwZW5kUGFyYW0pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsKKyAgICB2b3NfbXNnX3QgICAgICAgdm9zTWVzc2FnZTsKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAoIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkgKQorICAgIHsKKyAgICAgICAgLyogc2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKyAgICAgICAgdm9zTWVzc2FnZS5ib2R5cHRyID0gd2xhblN1c3BlbmRQYXJhbTsKKyAgICAgICAgdm9zTWVzc2FnZS50eXBlICAgID0gV0RBX1dMQU5fU1VTUEVORF9JTkQ7CisgICAgICAgIHZvc1N0YXR1cyA9IHZvc19tcV9wb3N0X21lc3NhZ2UoIFZPU19NUV9JRF9XREEsICZ2b3NNZXNzYWdlICk7CisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKKyAgICAgICAgeworICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKyAgICByZXR1cm4oc3RhdHVzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGZuICAgIHNtZV9Db25maWd1cmVSZXN1bWVSZXEKKworICBcYnJpZWYgCisgICAgU01FIHdpbGwgcGFzcyB0aGlzIHJlcXVlc3QgdG8gbG93ZXIgbWFjIHRvIEluZGljYXRlIHRoYXQgdGhlIHdsYW4gbmVlZHMgdG8gCisgICAgYmUgUmVzdW1lZAorCisgIFxwYXJhbSAKKworICAgIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uIAorIAorICAgIHdsYW5SZXN1bWVQYXJhbS0gRGVwaWN0cyB0aGUgd2xhbiByZXN1bWUgcGFyYW1zCisKKyAgIAorICBccmV0dXJuIGVIYWxTdGF0dXMgICAgCisgIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZUhhbFN0YXR1cyBzbWVfQ29uZmlndXJlUmVzdW1lUmVxKCB0SGFsSGFuZGxlIGhIYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpcldsYW5SZXN1bWVQYXJhbSAgd2xhblJlc3VtZVBhcmFtKQoreworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICAgdm9zX21zZ190ICAgICAgIHZvc01lc3NhZ2U7CisKKyAgICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgPT0gKCBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKSApICkKKyAgICB7CisgICAgICAgIC8qIHNlcmlhbGl6ZSB0aGUgcmVxIHRocm91Z2ggTUMgdGhyZWFkICovCisgICAgICAgIHZvc01lc3NhZ2UuYm9keXB0ciA9IHdsYW5SZXN1bWVQYXJhbTsKKyAgICAgICAgdm9zTWVzc2FnZS50eXBlICAgID0gV0RBX1dMQU5fUkVTVU1FX1JFUTsKKyAgICAgICAgdm9zU3RhdHVzID0gdm9zX21xX3Bvc3RfbWVzc2FnZSggVk9TX01RX0lEX1dEQSwgJnZvc01lc3NhZ2UgKTsKKyAgICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQorICAgICAgICB7CisgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorICAgIHJldHVybihzdGF0dXMpOworfQorCisjZW5kaWYKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9HZXRJbmZyYVNlc3Npb25JZAorCisgICAgXGJyaWVmIFRvIGdldCB0aGUgc2Vzc2lvbiBJRCBmb3IgaW5mcmEgc2Vzc2lvbiwgaWYgY29ubmVjdGVkCisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorCisgICAgXHJldHVybiBzZXNzaW9uaWQsIC0xIGlmIGluZnJhIHNlc3Npb24gaXMgbm90IGNvbm5lY3RlZAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9TOCBzbWVfR2V0SW5mcmFTZXNzaW9uSWQodEhhbEhhbmRsZSBoSGFsKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdEFOSV9TOCBzZXNzaW9uaWQgPSAtMTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgICAgICAgICAgICAgICAgIAorICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworCisgICAgICBzZXNzaW9uaWQgPSBjc3JHZXRJbmZyYVNlc3Npb25JZCggcE1hYyk7CisKKyAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHNlc3Npb25pZCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9HZXRJbmZyYU9wZXJhdGlvbkNoYW5uZWwKKworICAgIFxicmllZiBUbyBnZXQgdGhlIG9wZXJhdGluZyBjaGFubmVsIGZvciBpbmZyYSBzZXNzaW9uLCBpZiBjb25uZWN0ZWQKKyAgICBUaGlzIGlzIGEgc3luY2hyb25vdXMgQVBJLgorCisgICAgXHBhcmFtIGhIYWwgLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uCisgICAgXHBhcmFtIHNlc3Npb25JZCAtIHRoZSBzZXNzaW9uSWQgcmV0dXJuZWQgYnkgc21lX09wZW5TZXNzaW9uLgorCisgICAgXHJldHVybiBvcGVyYXRpbmcgY2hhbm5lbCwgMCBpZiBpbmZyYSBzZXNzaW9uIGlzIG5vdCBjb25uZWN0ZWQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RBTklfVTggc21lX0dldEluZnJhT3BlcmF0aW9uQ2hhbm5lbCggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4IHNlc3Npb25JZCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgdEFOSV9VOCBjaGFubmVsID0gMDsKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKworICAgICAgY2hhbm5lbCA9IGNzckdldEluZnJhT3BlcmF0aW9uQ2hhbm5lbCggcE1hYywgc2Vzc2lvbklkKTsKKworICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoY2hhbm5lbCk7Cit9CisKKy8vVGhpcyByb3V0aW5lIHdpbGwgcmV0dXJuIHBvZXJhdGluZyBjaGFubmVsIG9uIHdoaWNoIG90aGVyIEJTUyBpcyBvcGVyYXRpbmcgdG8gYmUgdXNlZCBmb3IgY29uY3VycmVuY3kgbW9kZS4KKy8vSWYgb3RoZXIgQlNTIGlzIG5vdCB1cCBvciBub3QgY29ubmVjdGVkIGl0IHdpbGwgcmV0dXJuIDAgCit0QU5JX1U4IHNtZV9HZXRDb25jdXJyZW50T3BlcmF0aW9uQ2hhbm5lbCggdEhhbEhhbmRsZSBoSGFsICkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOyAgIAorICAgdEFOSV9VOCBjaGFubmVsID0gMDsKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKworICAgICAgY2hhbm5lbCA9IGNzckdldENvbmN1cnJlbnRPcGVyYXRpb25DaGFubmVsKCBwTWFjICk7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsICIlczogIgorICAgICAgICAgICAiIE90aGVyIENvbmN1cnJlbnQgQ2hhbm5lbCA9ICVkIiwgX19GVU5DVElPTl9fLGNoYW5uZWwpOworICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisKKyAgIHJldHVybiAoY2hhbm5lbCk7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogTmFtZTogc21lX1ByZWZlcnJlZE5ldHdvcmtGb3VuZEluZAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgSW52b2tlIFByZWZlcnJlZCBOZXR3b3JrIEZvdW5kIEluZGljYXRpb24gCisqCisqIFBhcmFtZXRlcnM6CisqICAgIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKyogICAgcE1zZyAtIGZvdW5kIG5ldHdvcmsgZGVzY3JpcHRpb24KKyoKKyogUmV0dXJuczogZUhhbFN0YXR1cworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBzbWVfUHJlZmVycmVkTmV0d29ya0ZvdW5kSW5kICh0SGFsSGFuZGxlIGhIYWwsIHZvaWQqIHBNc2cpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0U2lyUHJlZk5ldHdvcmtGb3VuZEluZCAqcFByZWZOZXR3b3JrRm91bmRJbmQgPSAodFNpclByZWZOZXR3b3JrRm91bmRJbmQgKilwTXNnOworCisgICBpZiAoTlVMTCA9PSBwTXNnKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJpbiAlcyBtc2cgcHRyIGlzIE5VTExcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgaWYgKHBQcmVmTmV0d29ya0ZvdW5kSW5kLT5zc0lkLmxlbmd0aCA+IDApCisgICAgICB7CisgICAgICAgICAgc21zTG9nKHBNYWMsIExPRzEsICJQcmVmZXJyZWQgTmV0d29yayBGb3VuZCBJbmRpY2F0aW9uIGluICVzKCksIFNTSUQ9JXMiLCAKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwUHJlZk5ldHdvcmtGb3VuZEluZC0+c3NJZC5zc0lkKTsKKworCisgICAgICAgICAvKiBDYWxsIFByZWZlcnJlZCBOZXRvd3JrIEZvdW5kIEluZGljYXRpb24gY2FsbGJhY2sgcm91dGluZS4gKi8KKyAgICAgICAgIGlmIChwTWFjLT5wbWMucHJlZk5ldHdGb3VuZENCICE9IE5VTEwpCisgICAgICAgICB7ICAgIAorICAgICAgICAgICAgICAgcE1hYy0+cG1jLnByZWZOZXR3Rm91bmRDQihwTWFjLT5wbWMucHJlZmVycmVkTmV0d29ya0ZvdW5kSW5kQ2FsbGJhY2tDb250ZXh0LCBwUHJlZk5ldHdvcmtGb3VuZEluZCk7CisgICAgICAgICB9CisKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiJXM6IGNhbGxiYWNrIGZhaWxlZCAtIFNTSUQgaXMgTlVMTFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICB9CisgICB9CisKKworICAgcmV0dXJuKHN0YXR1cyk7Cit9CisKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworCitlSGFsU3RhdHVzIHNtZV9HZXRDZmdWYWxpZENoYW5uZWxzKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCAqYVZhbGlkQ2hhbm5lbHMsIHRBTklfVTMyICpsZW4pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgICAgICAgICAKKyAgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gY3NyR2V0Q2ZnVmFsaWRDaGFubmVscyhwTWFjLCBhVmFsaWRDaGFubmVscywgbGVuKTsKKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorICAgIAorICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfU2V0VHhQZXJUcmFja2luZworCisgICAgXGJyaWVmIFNldCBUeCBQRVIgdHJhY2tpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisKKyAgICBccGFyYW0gaEhhbCAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4KKyAgICBccGFyYW0gcFR4UGVyVHJhY2tpbmdDb25mIC0gVHggUEVSIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRUeFBlclRyYWNraW5nKHRIYWxIYW5kbGUgaEhhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpwQ2FsbGJhY2tmbikgKHZvaWQgKnBDYWxsYmFja0NvbnRleHQpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENhbGxiYWNrQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJUeFBlclRyYWNraW5nUGFyYW0gcFR4UGVyVHJhY2tpbmdQYXJhbSkKK3sKKyAgICB2b3NfbXNnX3QgbXNnOworICAgIHRwU2lyVHhQZXJUcmFja2luZ1BhcmFtIHBUeFBlclRyYWNraW5nUGFyYW1SZXEgPSBOVUxMOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkKKyAgICB7CisgICAgICAgIHBNYWMtPnNtZS5wVHhQZXJIaXRDYWxsYmFjayA9IHBDYWxsYmFja2ZuOworICAgICAgICBwTWFjLT5zbWUucFR4UGVySGl0Q2JDb250ZXh0ID0gcENhbGxiYWNrQ29udGV4dDsKKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorICAgIAorICAgIC8vIGZyZWUgdGhpcyBtZW1vcnkgaW4gZmFpbHVyZSBjYXNlIG9yIFdEQSByZXF1ZXN0IGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgcFR4UGVyVHJhY2tpbmdQYXJhbVJlcSA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0U2lyVHhQZXJUcmFja2luZ1BhcmFtKSk7CisgICAgaWYgKE5VTEwgPT0gcFR4UGVyVHJhY2tpbmdQYXJhbVJlcSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdFNpclR4UGVyVHJhY2tpbmdQYXJhbSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHZvc19tZW1fY29weShwVHhQZXJUcmFja2luZ1BhcmFtUmVxLCAodm9pZCopcFR4UGVyVHJhY2tpbmdQYXJhbSwgc2l6ZW9mKHRTaXJUeFBlclRyYWNraW5nUGFyYW0pKTsKKyAgICBtc2cudHlwZSA9IFdEQV9TRVRfVFhfUEVSX1RSQUNLSU5HX1JFUTsKKyAgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgIG1zZy5ib2R5cHRyID0gcFR4UGVyVHJhY2tpbmdQYXJhbVJlcTsKKworICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NT0RVTEVfSURfV0RBLCAmbXNnKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgV0RBX1NFVF9UWF9QRVJfVFJBQ0tJTkdfUkVRIG1lc3NhZ2UgdG8gV0RBIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgdm9zX21lbV9mcmVlKHBUeFBlclRyYWNraW5nUGFyYW1SZXEpOworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gc21lX0hhbmRsZUNoYW5nZUNvdW50cnlDb2RlCisKKyAgICBcYnJpZWYgQ2hhbmdlIENvdW50cnkgY29kZSwgUmVnIERvbWFpbiBhbmQgY2hhbm5lbCBsaXN0CisKKyAgICBcZGV0YWlscyBDb3VudHJ5IENvZGUgUHJpb3JpdHkKKyAgICAwID0gMTFEID4gQ29uZmlndXJlZCBDb3VudHJ5ID4gTlYKKyAgICAxID0gQ29uZmlndXJlZCBDb3VudHJ5ID4gMTFEID4gTlYKKyAgICBJZiBTdXBwbGljYW50IGNvdW50cnkgY29kZSBpcyBwcmlvcml0eSB0aGFuIDExZCBpcyBkaXNhYmxlZC4KKyAgICBJZiAxMUQgaXMgZW5hYmxlZCwgd2UgdXBkYXRlIHRoZSBjb3VudHJ5IGNvZGUgYWZ0ZXIgZXZlcnkgc2Nhbi4KKyAgICBIZW5jZSB3aGVuIFN1cHBsaWNhbnQgY291bnRyeSBjb2RlIGlzIHByaW9yaXR5LCB3ZSBkb24ndCBuZWVkIDExRCBpbmZvLgorICAgIENvdW50cnkgY29kZSBmcm9tIFN1cHBsaWNhbnQgaXMgc2V0IGFzIGN1cnJlbnQgY291cnRyeSBjb2RlLgorICAgIFVzZXIgY2FuIHNlbmQgcmVzZXQgY29tbWFuZCBYWCAoaW5zdGVhZCBvZiBjb3VudHJ5IGNvZGUpIHRvIHJlc2V0IHRoZQorICAgIGNvdW50cnkgY29kZSB0byBkZWZhdWx0IHZhbHVlcyB3aGljaCBpcyByZWFkIGZyb20gTlYuCisgICAgSW4gY2FzZSBvZiByZXNldCwgMTFEIGlzIGVuYWJsZWQgYW5kIGRlZmF1bHQgTlYgY29kZSBpcyBTZXQgYXMgY3VycmVudCBjb3VudHJ5IGNvZGUKKyAgICBJZiAxMUQgaXMgcHJpb3JpdHksCisgICAgVGhhbiBTdXBwbGljYW50IGNvdW50cnkgY29kZSBjb2RlIGlzIHNldCB0byBkZWZhdWx0IGNvZGUuIEJ1dCAxMUQgY29kZSBpcyBzZXQgYXMgY3VycmVudCBjb3VudHJ5IGNvZGUKKworICAgIFxwYXJhbSBwTWFjIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSBwTXNnQnVmIC0gTVNHIEJ1ZmZlcgorCisgICAgXHJldHVybiBlSGFsU3RhdHVzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9IYW5kbGVDaGFuZ2VDb3VudHJ5Q29kZSh0cEFuaVNpckdsb2JhbCBwTWFjLCAgdm9pZCAqcE1zZ0J1ZikKK3sKKyAgIGVIYWxTdGF0dXMgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0QW5pQ2hhbmdlQ291bnRyeUNvZGVSZXEgKnBNc2c7CisgICB2X1JFR0RPTUFJTl90IGRvbWFpbklkSW9jdGw7IAorICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICBzdGF0aWMgdU52VGFibGVzIG52VGFibGVzOworICAgcE1zZyA9ICh0QW5pQ2hhbmdlQ291bnRyeUNvZGVSZXEgKilwTXNnQnVmOworCisKKyAgIC8qIGlmIHRoZSByZXNldCBTdXBwbGljYW50IGNvdW50cnkgY29kZSBjb21tYW5kIGlzIHRyaWdnZXJlZCwgZW5hYmxlIDExRCwgcmVzZXQgdGhlIE5WIGNvdW50cnkgY29kZSBhbmQgcmV0dXJuICovCisgICBpZiggVk9TX1RSVUUgPT0gdm9zX21lbV9jb21wYXJlKHBNc2ctPmNvdW50cnlDb2RlLCBTTUVfSU5WQUxJRF9DT1VOVFJZX0NPREUsIDIpICkKKyAgIHsKKyAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFkU3VwcG9ydEVuYWJsZWQgPSBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFkU3VwcG9ydEVuYWJsZWRPcmlnaW5hbDsKKworICAgICAgIHZvc1N0YXR1cyA9IHZvc19udl9yZWFkRGVmYXVsdENvdW50cnlUYWJsZSggJm52VGFibGVzICk7CisKKyAgICAgICAvKiByZWFkIHRoZSBjb3VudHJ5IGNvZGUgZnJvbSBOViBhbmQgdXNlIGl0ICovCisgICAgICAgaWYgKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCisgICAgICAgeworICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTXNnLT5jb3VudHJ5Q29kZSAsIG52VGFibGVzLmRlZmF1bHRDb3VudHJ5VGFibGUuY291bnRyeUNvZGUsIFdOSV9DRkdfQ09VTlRSWV9DT0RFX0xFTiApOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICAvKiBpZiBTdXBwbGljYW50IGNvdW50cnkgY29kZSBoYXMgcHJpb3JpdHksIGRpc2FibGUgMTFkICovCisgICAgICAgaWYocE1hYy0+cm9hbS5jb25maWdQYXJhbS5mU3VwcGxpY2FudENvdW50cnlDb2RlSGFzUHJpb3JpdHkpCisgICAgICAgeworICAgICAgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLklzMTFkU3VwcG9ydEVuYWJsZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisgICAgICAgfQorICAgfQorCisgICAvKiBXRVhUIHNldCBjb3VudHJ5IGNvZGUgbWVhbnMKKyAgICAqIDExRCBzaG91bGQgYmUgc3VwcG9ydGVkPworICAgICogMTFEIENoYW5uZWwgc2hvdWxkIGJlIGVuZm9yY2VkPworICAgICogMTFEIENvdW50cnkgY29kZSBzaG91bGQgYmUgbWF0Y2hlZD8KKyAgICAqIDExRCBSZWcgRG9taWFuIHNob3VsZCBiZSBtYXRjaGVkPworICAgICogQ291bnRyeSBzdHJpbmcgY2hhbmdlZCAqLworICAgaWYocE1hYy0+cm9hbS5jb25maWdQYXJhbS5JczExZFN1cHBvcnRFbmFibGVkICYmCisgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZFbmZvcmNlMTFkQ2hhbm5lbHMgJiYKKyAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZkVuZm9yY2VDb3VudHJ5Q29kZU1hdGNoICYmCisgICAgICBwTWFjLT5yb2FtLmNvbmZpZ1BhcmFtLmZFbmZvcmNlRGVmYXVsdERvbWFpbiAmJgorICAgICAgIWNzclNhdmUxMWRDb3VudHJ5U3RyaW5nKHBNYWMsIHBNc2ctPmNvdW50cnlDb2RlLCBlQU5JX0JPT0xFQU5fVFJVRSkpCisgICB7CisgICAgICAvKiBBbGwgMTFEIHJlbGF0ZWQgb3B0aW9ucyBhcmUgYWxyZWFkeSBlbmFibGVkCisgICAgICAgKiBDb3VudHJ5IHN0cmluZyBpcyBub3QgY2hhbmdlZAorICAgICAgICogRG8gbm90IG5lZWQgZG8gYW55dGhpbmcgZm9yIGNvdW50cnkgY29kZSBjaGFuZ2UgcmVxdWVzdCAqLworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIC8qIFNldCBDdXJyZW50IENvdW50cnkgY29kZSBhbmQgQ3VycmVudCBSZWd1bGF0b3J5IGRvbWFpbiAqLworICAgc3RhdHVzID0gY3NyU2V0Q291bnRyeUNvZGUocE1hYywgcE1zZy0+Y291bnRyeUNvZGUsIE5VTEwpOworICAgaWYoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICAgLyogU3VwcGxpY2FudCBjb3VudHJ5IGNvZGUgZmFpbGVkLiBTbyBnaXZlIDExRCBwcmlvcml0eSAqLworICAgICAgIHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZCA9IHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uSXMxMWRTdXBwb3J0RW5hYmxlZE9yaWdpbmFsOworICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiU2V0IENvdW50cnkgQ29kZSBGYWlsICVkIiwgc3RhdHVzKTsKKyAgICAgICByZXR1cm4gc3RhdHVzOyAgCisgICB9CisKKyAgIC8qIHB1cmdlIGN1cnJlbnQgc2NhbiByZXN1bHRzCisgICAgaWYgaSBkb24ndCBkbyB0aGlzIHRoYW4gSSBzdGlsbCBnZXQgb2xkIGFwJ3MgKG9mIGRpZmZlcmVudCBjb3VudHJ5IGNvZGUpIGFzIGF2YWlsYWJsZSAoZXZlbiBpZiB0aGV5IGFyZSBwb3dlcmVkIG9mZikuIAorICAgIExvb2tzIGxpa2UgYSBidWcgaW4gY3VycmVudCBzY2FuIHNlcXVlbmNlLiAKKyAgICovCisgICBjc3JTY2FuRmx1c2hSZXN1bHQocE1hYyk7CisKKyAgIC8qIG92ZXJ3cml0ZSB0aGUgZGVmdWFsdCBjb3VudHJ5IGNvZGUgKi8KKyAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZURlZmF1bHQsIHBNYWMtPnNjYW4uY291bnRyeUNvZGVDdXJyZW50LCBXTklfQ0ZHX0NPVU5UUllfQ09ERV9MRU4pOworCisgICAvKiBHZXQgRG9tYWluIElEIGZyb20gY291bnRyeSBjb2RlICovCisgICBzdGF0dXMgPSBjc3JHZXRSZWd1bGF0b3J5RG9tYWluRm9yQ291bnRyeSggcE1hYywgcE1hYy0+c2Nhbi5jb3VudHJ5Q29kZUN1cnJlbnQsKHZfUkVHRE9NQUlOX3QgKikgJmRvbWFpbklkSW9jdGwgKTsKKyAgIGlmICggc3RhdHVzICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MgKQorICAgeworICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiAgZmFpbCB0byBnZXQgcmVnSWQgJWRcbiIpLCBkb21haW5JZElvY3RsICk7CisgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgc3RhdHVzID0gV0RBX1NldFJlZ0RvbWFpbihwTWFjLCBkb21haW5JZElvY3RsKTsKKworICAgaWYgKCBzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICB7CisgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiICBmYWlsIHRvIHNldCByZWdJZCAlZFxuIiksIGRvbWFpbklkSW9jdGwgKTsKKyAgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICAvKiBzZXQgdG8gZGVmYXVsdCBkb21haW4gSUQgKi8KKyAgIHBNYWMtPnNjYW4uZG9tYWluSWREZWZhdWx0ID0gcE1hYy0+c2Nhbi5kb21haW5JZEN1cnJlbnQ7CisKKyAgIC8qIGdldCB0aGUgY2hhbm5lbHMgYmFzZWQgb24gbmV3IGNjICovCisgICBzdGF0dXMgPSBjc3JJbml0R2V0Q2hhbm5lbHMoIHBNYWMgKTsKKworICAgaWYgKCBzdGF0dXMgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCisgICB7CisgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiICBmYWlsIHRvIGdldCBDaGFubmVscyBcbiIpKTsKKyAgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICAvKiByZXNldCBpbmZvIGJhc2VkIG9uIG5ldyBjYywgYW5kIHdlIGFyZSBkb25lICovCisgICBjc3JSZXNldENvdW50cnlJbmZvcm1hdGlvbihwTWFjLCBlQU5JX0JPT0xFQU5fVFJVRSk7CisgICBpZiggcE1zZy0+Y2hhbmdlQ0NDYWxsYmFjayApCisgICB7CisgICAgICAoKHRTbWVDaGFuZ2VDb3VudHJ5Q2FsbGJhY2spKHBNc2ctPmNoYW5nZUNDQ2FsbGJhY2spKSgodm9pZCAqKXBNc2ctPnBEZXZDb250ZXh0KTsKKyAgIH0KKworICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworZUhhbFN0YXR1cyBzbWVfODAyM011bHRpY2FzdExpc3QgKHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJSY3ZGbHRNY0FkZHJMaXN0IHBNdWx0aWNhc3RBZGRycykKK3sKKyAgICB0cFNpclJjdkZsdE1jQWRkckxpc3QgICBwUmVxdWVzdEJ1ZjsKKyAgICB2b3NfbXNnX3QgICAgICAgICAgICAgICBtc2c7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiAiCisgICAgICAgICAgICAgICAidWxNdWx0aWNhc3RBZGRyQ250PSVkLCBtdWx0aWNhc3RBZGRyWzBdPSVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgcE11bHRpY2FzdEFkZHJzLT51bE11bHRpY2FzdEFkZHJDbnQsCisgICAgICAgICAgICAgICBwTXVsdGljYXN0QWRkcnMtPm11bHRpY2FzdEFkZHJbMF0pOworICAKKyAgICBwUmVxdWVzdEJ1ZiA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0U2lyUmN2Rmx0TWNBZGRyTGlzdCkpOworICAgIGlmIChOVUxMID09IHBSZXF1ZXN0QnVmKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gIgorICAgICAgICAgICAgImFsbG9jYXRlIG1lbW9yeSBmb3IgODAyMyBNdWx0aWNhc3QgTGlzdCByZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQzsKKyAgICB9CisgICAgdm9zX21lbV9jb3B5KHBSZXF1ZXN0QnVmLCBwTXVsdGljYXN0QWRkcnMsIHNpemVvZih0U2lyUmN2Rmx0TWNBZGRyTGlzdCkpOworCisgICAgbXNnLnR5cGUgPSBXREFfODAyM19NVUxUSUNBU1RfTElTVF9SRVE7CisgICAgbXNnLnJlc2VydmVkID0gMDsKKyAgICBtc2cuYm9keXB0ciA9IHBSZXF1ZXN0QnVmOworICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NT0RVTEVfSURfV0RBLCAmbXNnKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvICIKKyAgICAgICAgICAgICJwb3N0IFdEQV84MDIzX01VTFRJQ0FTVF9MSVNUIG1lc3NhZ2UgdG8gV0RBIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgdm9zX21lbV9mcmVlKHBSZXF1ZXN0QnVmKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2VIYWxTdGF0dXMgc21lX1JlY2VpdmVGaWx0ZXJTZXRGaWx0ZXIodEhhbEhhbmRsZSBoSGFsLCB0cFNpclJjdlBrdEZpbHRlckNmZ1R5cGUgcFJjdlBrdEZpbHRlckNmZykKK3sKKyAgICB0cFNpclJjdlBrdEZpbHRlckNmZ1R5cGUgICAgcFJlcXVlc3RCdWY7CisgICAgdl9TSU5UX3QgICAgICAgICAgICAgICAgYWxsb2NTaXplOworICAgIHZvc19tc2dfdCAgICAgICAgICAgICAgIG1zZzsKKyAgICAvKnRwQW5pU2lyR2xvYmFsICAgICAgICAgIHBNYWMgPSBQTUFDX1NUUlVDVChoSGFsKTsqLworICAgIHZfVThfdCAgIGlkeD0wOworCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogZmlsdGVyVHlwZT0lZCwgIgorICAgICAgICAgICAgICAgImZpbHRlcklkID0gJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5maWx0ZXJUeXBlLCBwUmN2UGt0RmlsdGVyQ2ZnLT5maWx0ZXJJZCk7CisgIAorICAgIGFsbG9jU2l6ZSA9IHNpemVvZih0U2lyUmN2UGt0RmlsdGVyQ2ZnVHlwZSkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAoKHBSY3ZQa3RGaWx0ZXJDZmctPm51bUZpZWxkUGFyYW1zIC0gMSkgKiAKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpclJjdlBrdEZpbHRlckZpZWxkUGFyYW1zKSk7CisgICAgcFJlcXVlc3RCdWYgPSB2b3NfbWVtX21hbGxvYyhhbGxvY1NpemUpOworICAgIGlmIChOVUxMID09IHBSZXF1ZXN0QnVmKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gIgorICAgICAgICAgICAgImFsbG9jYXRlIG1lbW9yeSBmb3IgUmVjZWl2ZSBGaWx0ZXIgU2V0IEZpbHRlciByZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQzsKKyAgICB9CisgICAgdm9zX21lbV9jb3B5KHBSZXF1ZXN0QnVmLCBwUmN2UGt0RmlsdGVyQ2ZnLCBhbGxvY1NpemUpOworCisgICAgbXNnLnR5cGUgPSBXREFfUkVDRUlWRV9GSUxURVJfU0VUX0ZJTFRFUl9SRVE7CisgICAgbXNnLnJlc2VydmVkID0gMDsKKyAgICBtc2cuYm9keXB0ciA9IHBSZXF1ZXN0QnVmOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIlBrdCBGbHQgUmVxIDogIgorICAgICAgICAgICAiRlQgJWQgRklEICVkICIsIAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+ZmlsdGVyVHlwZSwgcFJlcXVlc3RCdWYtPmZpbHRlcklkKTsgICAgCisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiUGt0IEZsdCBSZXEgOiAiCisgICAgICAgICAgICJwYXJhbXMgJWQgQ1QgJWQiLCAKKyAgICAgICAgICAgcFJlcXVlc3RCdWYtPm51bUZpZWxkUGFyYW1zLCBwUmVxdWVzdEJ1Zi0+Y29hbGVzY2VUaW1lKTsgICAgCisKKyAgICBmb3IgKGlkeD0wOyBpZHg8cFJlcXVlc3RCdWYtPm51bUZpZWxkUGFyYW1zOyBpZHgrKykKKyAgICB7CisKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICJQcm90byAlZCBDb21wIEZsYWcgJWQgXG4iLAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+cGFyYW1zRGF0YVtpZHhdLnByb3RvY29sTGF5ZXIsCisgICAgICAgICAgIHBSZXF1ZXN0QnVmLT5wYXJhbXNEYXRhW2lkeF0uY21wRmxhZyk7CisKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICJEYXRhIE9mZnNldCAlZCBEYXRhIExlbiAlZFxuIiwKKyAgICAgICAgICAgcFJlcXVlc3RCdWYtPnBhcmFtc0RhdGFbaWR4XS5kYXRhT2Zmc2V0LAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+cGFyYW1zRGF0YVtpZHhdLmRhdGFMZW5ndGgpOworCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICJDRGF0YTogJWQ6JWQ6JWQ6JWQ6JWQ6JWRcbiIsCisgICAgICAgICAgIHBSZXF1ZXN0QnVmLT5wYXJhbXNEYXRhW2lkeF0uY29tcGFyZURhdGFbMF0sCisgICAgICAgICAgIHBSZXF1ZXN0QnVmLT5wYXJhbXNEYXRhW2lkeF0uY29tcGFyZURhdGFbMV0sIAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+cGFyYW1zRGF0YVtpZHhdLmNvbXBhcmVEYXRhWzJdLAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+cGFyYW1zRGF0YVtpZHhdLmNvbXBhcmVEYXRhWzNdLAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+cGFyYW1zRGF0YVtpZHhdLmNvbXBhcmVEYXRhWzRdLAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+cGFyYW1zRGF0YVtpZHhdLmNvbXBhcmVEYXRhWzVdKTsKKworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICJNRGF0YTogJWQ6JWQ6JWQ6JWQ6JWQ6JWRcbiIsCisgICAgICAgICAgIHBSZXF1ZXN0QnVmLT5wYXJhbXNEYXRhW2lkeF0uZGF0YU1hc2tbMF0sCisgICAgICAgICAgIHBSZXF1ZXN0QnVmLT5wYXJhbXNEYXRhW2lkeF0uZGF0YU1hc2tbMV0sIAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+cGFyYW1zRGF0YVtpZHhdLmRhdGFNYXNrWzJdLAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+cGFyYW1zRGF0YVtpZHhdLmRhdGFNYXNrWzNdLAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+cGFyYW1zRGF0YVtpZHhdLmRhdGFNYXNrWzRdLAorICAgICAgICAgICBwUmVxdWVzdEJ1Zi0+cGFyYW1zRGF0YVtpZHhdLmRhdGFNYXNrWzVdKTsKKworICAgIH0KKworICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NT0RVTEVfSURfV0RBLCAmbXNnKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvIHBvc3QgIgorICAgICAgICAgICAgIldEQV9SRUNFSVZFX0ZJTFRFUl9TRVRfRklMVEVSIG1lc3NhZ2UgdG8gV0RBIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgdm9zX21lbV9mcmVlKHBSZXF1ZXN0QnVmKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2VIYWxTdGF0dXMgc21lX0dldEZpbHRlck1hdGNoQ291bnQodEhhbEhhbmRsZSBoSGFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyTWF0Y2hDb3VudENhbGxiYWNrIGNhbGxiYWNrUm91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0ICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiKyVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAoIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSkpKQorICAgIHsKKyAgICAgICAgcG1jR2V0RmlsdGVyTWF0Y2hDb3VudChoSGFsLCBjYWxsYmFja1JvdXRpbmUsIGNhbGxiYWNrQ29udGV4dCk7CisgICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIH0KKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiLSVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiAoc3RhdHVzKTsKK30KKworZUhhbFN0YXR1cyBzbWVfUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyKHRIYWxIYW5kbGUgaEhhbCwgdHBTaXJSY3ZGbHRQa3RDbGVhclBhcmFtIHBSY3ZGbHRQa3RDbGVhclBhcmFtKQoreworICAgIHRwU2lyUmN2Rmx0UGt0Q2xlYXJQYXJhbSBwUmVxdWVzdEJ1ZjsKKyAgICB2b3NfbXNnX3QgICAgICAgICAgICAgICBtc2c7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBmaWx0ZXJJZCA9ICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgcFJjdkZsdFBrdENsZWFyUGFyYW0tPmZpbHRlcklkKTsKKyAgCisgICAgcFJlcXVlc3RCdWYgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodFNpclJjdkZsdFBrdENsZWFyUGFyYW0pKTsKKyAgICBpZiAoTlVMTCA9PSBwUmVxdWVzdEJ1ZikKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJlY2VpdmUgRmlsdGVyICIKKyAgICAgICAgICAgICJDbGVhciBGaWx0ZXIgcmVxdWVzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMRURfQUxMT0M7CisgICAgfQorICAgIHZvc19tZW1fY29weShwUmVxdWVzdEJ1ZiwgcFJjdkZsdFBrdENsZWFyUGFyYW0sIHNpemVvZih0U2lyUmN2Rmx0UGt0Q2xlYXJQYXJhbSkpOworCisgICAgbXNnLnR5cGUgPSBXREFfUkVDRUlWRV9GSUxURVJfQ0xFQVJfRklMVEVSX1JFUTsKKyAgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgIG1zZy5ib2R5cHRyID0gcFJlcXVlc3RCdWY7CisgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01PRFVMRV9JRF9XREEsICZtc2cpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gcG9zdCAiCisgICAgICAgICAgICAiV0RBX1JFQ0VJVkVfRklMVEVSX0NMRUFSX0ZJTFRFUiBtZXNzYWdlIHRvIFdEQSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHZvc19tZW1fZnJlZShwUmVxdWVzdEJ1Zik7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfUHJlQ2hhbm5lbFN3aXRjaEluZEZ1bGxQb3dlckNCCisgICAgXGJyaWVmICBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBQTUMgZnVsbCBwb3dlciByZXF1ZXN0IGJlY2F1c2Ugb2YgcHJlIAorICAgICAgICAgICAgIGNoYW5uZWwgc3dpdGNoLgorICAgIFxwYXJhbSBjYWxsYmFja0NvbnRleHQKKyAgICBccGFyYW0gc3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNtZV9QcmVDaGFubmVsU3dpdGNoSW5kRnVsbFBvd2VyQ0Iodm9pZCAqY2FsbGJhY2tDb250ZXh0LCAKKyAgICAgICAgICAgICAgICBlSGFsU3RhdHVzIHN0YXR1cykKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKWNhbGxiYWNrQ29udGV4dDsKKyAgICB0U2lyTWJNc2cgKnBNc2c7CisgICAgdEFOSV9VMTYgbXNnTGVuOworCisgICAgbXNnTGVuID0gKHRBTklfVTE2KShzaXplb2YoIHRTaXJNYk1zZyApKTsKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgbXNnTGVuKTsKKyAgICBpZihIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKilwTXNnLCBtc2dMZW4pOworICAgICAgICBwTXNnLT50eXBlID0gcGFsX2NwdV90b19iZTE2KCh0QU5JX1UxNillV05JX1NNRV9QUkVfQ0hBTk5FTF9TV0lUQ0hfRlVMTF9QT1dFUik7CisgICAgICAgIHBNc2ctPm1zZ0xlbiA9IHBhbF9jcHVfdG9fYmUxNihtc2dMZW4pOworICAgICAgICBzdGF0dXMgPSBwYWxTZW5kTUJNZXNzYWdlKHBNYWMtPmhIZGQsIHBNc2cpOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgcmV0dXJuOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gc21lX0hhbmRsZVByZUNoYW5uZWxTd2l0Y2hJbmQKKyAgICBcYnJpZWYgIFByb2Nlc3NlcyB0aGUgaW5kY2F0aW9uIGZyb20gUEUgZm9yIHByZS1jaGFubmVsIHN3aXRjaC4KKyAgICBccGFyYW0gaEhhbAorICAgIFwtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkgbWFjT3Blbi4gcmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0hhbmRsZVByZUNoYW5uZWxTd2l0Y2hJbmQodEhhbEhhbmRsZSBoSGFsKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAgc3RhdHVzID0gcG1jUmVxdWVzdEZ1bGxQb3dlcihoSGFsLCBzbWVfUHJlQ2hhbm5lbFN3aXRjaEluZEZ1bGxQb3dlckNCLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLCBlU01FX0ZVTExfUFdSX05FRURFRF9CWV9DSEFOTkVMX1NXSVRDSCk7IAorICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfSGFuZGxlUG9zdENoYW5uZWxTd2l0Y2hJbmQKKyAgICBcYnJpZWYgIFByb2Nlc3NlcyB0aGUgaW5kY2F0aW9uIGZyb20gUEUgZm9yIHBvc3QtY2hhbm5lbCBzd2l0Y2guCisgICAgXHBhcmFtIGhIYWwKKyAgICBcLSBUaGUgaGFuZGxlIHJldHVybmVkIGJ5IG1hY09wZW4uIHJldHVybiBlSGFsU3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9IYW5kbGVQb3N0Q2hhbm5lbFN3aXRjaEluZCh0SGFsSGFuZGxlIGhIYWwpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgIHN0YXR1cyA9IHBtY1JlcXVlc3RCbXBzKGhIYWwsIE5VTEwsIE5VTEwpOworICAgICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgfQorCisgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHNtZV9Jc0NoYW5uZWxWYWxpZAorCisgICAgXGJyaWVmIFRvIGNoZWNrIGlmIHRoZSBjaGFubmVsIGlzIHZhbGlkIGZvciBjdXJyZW50bHkgZXN0YWJsaXNoZWQgZG9tYWluCisgICAgVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSS4KKworICAgIFxwYXJhbSBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSBjaGFubmVsIC0gY2hhbm5lbCB0byB2ZXJpZnkKKworICAgIFxyZXR1cm4gVFJVRS9GQUxTRSwgVFJVRSBpZiBjaGFubmVsIGlzIHZhbGlkCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0QU5JX0JPT0xFQU4gc21lX0lzQ2hhbm5lbFZhbGlkKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBjaGFubmVsKQoreworICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdEFOSV9CT09MRUFOIHZhbGlkID0gRkFMU0U7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICAgICAgICAgICAgICAgICAKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKworICAgICAgdmFsaWQgPSBjc3JSb2FtSXNDaGFubmVsVmFsaWQoIHBNYWMsIGNoYW5uZWwpOworCisgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKworICAgcmV0dXJuICh2YWxpZCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfU2V0RnJlcUJhbmQKKyAgICBcYnJpZWYgIFVzZWQgdG8gc2V0IGZyZXF1ZW5jeSBiYW5kLgorICAgIFxwYXJhbSAgaEhhbAorICAgIFxlQmFuZCAgYmFuZCB2YWx1ZSB0byBiZSBjb25maWd1cmVkCisgICAgXC0gcmV0dXJuIGVIYWxTdGF0dXMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1NldEZyZXFCYW5kKHRIYWxIYW5kbGUgaEhhbCwgZUNzckJhbmQgZUJhbmQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICBpZiAoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkgKQorICAgeworICAgICAgc3RhdHVzID0gY3NyU2V0QmFuZChoSGFsLCBlQmFuZCk7CisgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFxmbiBzbWVfR2V0RnJlcUJhbmQKKyAgICBcYnJpZWYgIFVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IGJhbmQgc2V0dGluZ3MuCisgICAgXHBhcmFtICBoSGFsCisgICAgXHBCYW5kICBwb2ludGVyIHRvIGhvbGQgYmFuZCB2YWx1ZQorICAgIFwtIHJldHVybiBlSGFsU3RhdHVzCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9HZXRGcmVxQmFuZCh0SGFsSGFuZGxlIGhIYWwsIGVDc3JCYW5kICpwQmFuZCkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworCisgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIGlmICggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICAqcEJhbmQgPSBjc3JHZXRDdXJyZW50QmFuZCggaEhhbCApOworICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICB9CisgICByZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFxmbiBzbWVfV2FrZVJlYXNvbkluZENhbGxiYWNrCisKKyAgXGJyaWVmCisgIGEgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gU01FIHJlY2VpdmVkIGVXTklfU01FX1dBS0VfUkVBU09OX0lORCBldmVudCBmcm9tIFdEQQorCisgIFxwYXJhbSBoSGFsIC0gSEFMIGhhbmRsZSBmb3IgZGV2aWNlCisgIFxwYXJhbSBwTXNnIC0gTWVzc2FnZSBib2R5IHBhc3NlZCBmcm9tIFdEQTsgaW5jbHVkZXMgV2FrZSBSZWFzb24gSW5kaWNhdGlvbiBwYXJhbWV0ZXIKKworICBccmV0dXJuIGVIYWxTdGF0dXMgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZUhhbFN0YXR1cyBzbWVfV2FrZVJlYXNvbkluZENhbGxiYWNrICh0SGFsSGFuZGxlIGhIYWwsIHZvaWQqIHBNc2cpCit7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoaEhhbCk7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB0U2lyV2FrZVJlYXNvbkluZCAqcFdha2VSZWFzb25JbmQgPSAodFNpcldha2VSZWFzb25JbmQgKilwTXNnOworCisgICBpZiAoTlVMTCA9PSBwTXNnKQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPR0UsICJpbiAlcyBtc2cgcHRyIGlzIE5VTExcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgc21zTG9nKHBNYWMsIExPRzIsICJTTUU6IGVudGVyaW5nIHNtZV9XYWtlUmVhc29uSW5kQ2FsbGJhY2tcbiIpOworCisgICAgICAvKiBDYWxsIFdha2UgUmVhc29uIEluZGljYXRpb24gY2FsbGJhY2sgcm91dGluZS4gKi8KKyAgICAgIGlmIChwTWFjLT5wbWMud2FrZVJlYXNvbkluZENCICE9IE5VTEwpCisgICAgICAgICAgcE1hYy0+cG1jLndha2VSZWFzb25JbmRDQihwTWFjLT5wbWMud2FrZVJlYXNvbkluZENCQ29udGV4dCwgcFdha2VSZWFzb25JbmQpOworICAgICAgICAKKyAgICAgIHBNYWMtPnBtYy53YWtlUmVhc29uSW5kQ0IgPSBOVUxMOworICAgICAgcE1hYy0+cG1jLndha2VSZWFzb25JbmRDQkNvbnRleHQgPSBOVUxMOworCisgICAgICBzbXNMb2cocE1hYywgTE9HMSwgIldha2UgUmVhc29uIEluZGljYXRpb24gaW4gJXMoKSwgcmVhc29uPSVkIiwgX19GVU5DVElPTl9fLCBwV2FrZVJlYXNvbkluZC0+dWxSZWFzb24pOworICAgfQorCisgICByZXR1cm4oc3RhdHVzKTsKK30KKyNlbmRpZiAvLyBXTEFOX1dBS0VVUF9FVkVOVFMKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfU2V0TWF4VHhQb3dlcgorCisgICAgXGJyaWVmIFNldCB0aGUgTWF4aW11bSBUcmFuc21pdCBQb3dlciBkeW5hbWljYWxseS4gTm90ZTogdGhpcyBzZXR0aW5nIHdpbGwKKyAgICBub3QgcGVyc2lzdCBvdmVyIHJlYm9vdHMuCisKKyAgICBccGFyYW0gIGhIYWwKKyAgICBccGFyYW0gcEJzc2lkICBCU1NJRCB0byBzZXQgdGhlIHBvd2VyIGNhcCBmb3IKKyAgICBccGFyYW0gcEJzc2lkICBwU2VsZk1hY0FkZHJlc3Mgc2VsZiBNQUMgQWRkcmVzcworICAgIFxwYXJhbSBwQnNzaWQgIHBvd2VyIHRvIHNldCBpbiBkQgorICAgIFwtIHJldHVybiBlSGFsU3RhdHVzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9TZXRNYXhUeFBvd2VyKHRIYWxIYW5kbGUgaEhhbCwgdFNpck1hY0FkZHIgcEJzc2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgcFNlbGZNYWNBZGRyZXNzLCB2X1M3X3QgZEIpCit7CisgICAgdm9zX21zZ190IG1zZzsKKyAgICB0cE1heFR4UG93ZXJQYXJhbXMgcE1heFR4UGFyYW1zID0gTlVMTDsKKworICAgIHBNYXhUeFBhcmFtcyA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0TWF4VHhQb3dlclBhcmFtcykpOworICAgIGlmIChOVUxMID09IHBNYXhUeFBhcmFtcykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NNRSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcE1heFR4UGFyYW1zIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgdm9zX21lbV9jb3B5KHBNYXhUeFBhcmFtcy0+YnNzSWQsIHBCc3NpZCwgU0lSX01BQ19BRERSX0xFTkdUSCk7CisgICAgdm9zX21lbV9jb3B5KHBNYXhUeFBhcmFtcy0+c2VsZlN0YU1hY0FkZHIgLCBwU2VsZk1hY0FkZHJlc3MsIAorICAgICAgICAgICAgICAgICBTSVJfTUFDX0FERFJfTEVOR1RIKTsKKyAgICBwTWF4VHhQYXJhbXMtPnBvd2VyID0gZEI7CisKKyAgICBtc2cudHlwZSA9IFdEQV9TRVRfTUFYX1RYX1BPV0VSX1JFUTsKKyAgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgIG1zZy5ib2R5cHRyID0gcE1heFR4UGFyYW1zOworCisgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01PRFVMRV9JRF9XREEsICZtc2cpKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU01FLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTm90IGFibGUgdG8gcG9zdCBXREFfU0VUX01BWF9UWF9QT1dFUl9SRVEgbWVzc2FnZSB0byBXREEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB2b3NfbWVtX2ZyZWUocE1heFR4UGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfSGlkZVNTSUQKKworICAgIFxicmllZiBoaWRlL3Nob3cgU1NJRCBkeW5hbWljYWxseS4gTm90ZTogdGhpcyBzZXR0aW5nIHdpbGwKKyAgICBub3QgcGVyc2lzdCBvdmVyIHJlYm9vdHMuCisKKyAgICBccGFyYW0gaEhhbAorICAgIFxwYXJhbSBzZXNzaW9uSWQKKyAgICBccGFyYW0gc3NpZEhpZGRlbiAwIC0gQnJvYWRjYXN0IFNTSUQsIDEgLSBEaXNhYmxlIGJyb2FkY2FzdCBTU0lECisgICAgXC0gcmV0dXJuIGVIYWxTdGF0dXMKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0hpZGVTU0lEKHRIYWxIYW5kbGUgaEhhbCwgdl9VOF90IHNlc3Npb25JZCwgdl9VOF90IHNzaWRIaWRkZW4pCit7CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgICA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgIHRBTklfVTE2IGxlbjsKKworICAgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAoIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApICkgKQorICAgIHsKKyAgICAgICAgdHBTaXJVcGRhdGVQYXJhbXMgcE1zZzsKKyAgICAgICAgdENzclJvYW1TZXNzaW9uICpwU2Vzc2lvbiA9IENTUl9HRVRfU0VTU0lPTiggcE1hYywgc2Vzc2lvbklkICk7CisgICAgICAgIAorICAgICAgICBpZiggIXBTZXNzaW9uLT5zZXNzaW9uQWN0aXZlICkgCisgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworCisgICAgICAgIC8qIENyZWF0ZSB0aGUgbWVzc2FnZSBhbmQgc2VuZCB0byBsaW0gKi8KKyAgICAgICAgbGVuID0gc2l6ZW9mKHRTaXJVcGRhdGVQYXJhbXMpOyAKKyAgICAgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkoIHBNYWMtPmhIZGQsICh2b2lkICoqKSZwTXNnLCBsZW4gKTsKKyAgICAgICAgaWYoSEFMX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1zZywgc2l6ZW9mKHRTaXJVcGRhdGVQYXJhbXMpICk7CisgICAgICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSAgICAgPSBlV05JX1NNRV9ISURFX1NTSURfUkVROworICAgICAgICAgICAgcE1zZy0+bGVuZ3RoICAgICAgICAgID0gbGVuOworICAgICAgICAgICAgLyogRGF0YSBzdGFydHMgZnJvbSBoZXJlICovCisgICAgICAgICAgICBwTXNnLT5zZXNzaW9uSWQgICAgICAgPSBzZXNzaW9uSWQ7CisgICAgICAgICAgICBwTXNnLT5zc2lkSGlkZGVuICAgICAgPSBzc2lkSGlkZGVuOyAKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgICAgIH0KKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBzbWVfU2V0VG1MZXZlbAorICAgIFxicmllZiAgU2V0IFRoZXJtYWwgTWl0aWdhdGlvbiBMZXZlbCB0byBSSVZBCisgICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgorICAgIFxwYXJhbSAgbmV3VE1MZXZlbCAtIG5ldyBUaGVybWFsIE1pdGlnYXRpb24gTGV2ZWwKKyAgICBccGFyYW0gIHRtTW9kZSAtIFRoZXJtYWwgTWl0aWdhdGlvbiBoYW5kbGUgbW9kZSwgZGVmYXVsdCAwCisgICAgXHJldHVybiBlSGFsU3RhdHVzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX1NldFRtTGV2ZWwodEhhbEhhbmRsZSBoSGFsLCB2X1UxNl90IG5ld1RNTGV2ZWwsIHZfVTE2X3QgdG1Nb2RlKQoreworICAgIGVIYWxTdGF0dXMgICAgICAgICAgc3RhdHVzICAgID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMgICAgICA9IFBNQUNfU1RSVUNUKGhIYWwpOworICAgIHZvc19tc2dfdCAgICAgICAgICAgdm9zTWVzc2FnZTsKKyAgICB0QW5pU2V0VG1MZXZlbFJlcSAgKnNldFRtTGV2ZWxSZXEgPSBOVUxMOworCisgICAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTID09ICggc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICkgKSApCisgICAgeworICAgICAgICBzZXRUbUxldmVsUmVxID0gKHRBbmlTZXRUbUxldmVsUmVxICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRBbmlTZXRUbUxldmVsUmVxKSk7CisgICAgICAgIGlmKE5VTEwgPT0gc2V0VG1MZXZlbFJlcSkKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICIlczogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzbWVfU2V0VG1MZXZlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisKKyAgICAgICAgc2V0VG1MZXZlbFJlcS0+dG1Nb2RlICAgICA9IHRtTW9kZTsKKyAgICAgICAgc2V0VG1MZXZlbFJlcS0+bmV3VG1MZXZlbCA9IG5ld1RNTGV2ZWw7CisKKyAgICAgICAgLyogc2VyaWFsaXplIHRoZSByZXEgdGhyb3VnaCBNQyB0aHJlYWQgKi8KKyAgICAgICAgdm9zTWVzc2FnZS5ib2R5cHRyID0gc2V0VG1MZXZlbFJlcTsKKyAgICAgICAgdm9zTWVzc2FnZS50eXBlICAgID0gV0RBX1NFVF9UTV9MRVZFTF9SRVE7CisgICAgICAgIHZvc1N0YXR1cyA9IHZvc19tcV9wb3N0X21lc3NhZ2UoIFZPU19NUV9JRF9XREEsICZ2b3NNZXNzYWdlICk7CisgICAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TTUUsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICIlczogUG9zdCBTZXQgVE0gTGV2ZWwgTVNHIGZhaWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICB2b3NfbWVtX2ZyZWUoc2V0VG1MZXZlbFJlcSk7CisgICAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgfQorICAgIHJldHVybihzdGF0dXMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzbWVfZmVhdHVyZUNhcHNFeGNoYW5nZSgpIC0gU01FIGludGVyZmFjZSB0byBleGNoYW5nZSBjYXBhYmlsaXRpZXMgYmV0d2VlbgorICBIb3N0IGFuZCBGVy4KKworICBccGFyYW0gIGhIYWwgLSBIQUwgaGFuZGxlIGZvciBkZXZpY2UKKworICBccmV0dXJuIE5PTkUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX2ZlYXR1cmVDYXBzRXhjaGFuZ2UoIHRIYWxIYW5kbGUgaEhhbCkKK3sKKyAgICB2X0NPTlRFWFRfdCB2b3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgTlVMTCk7CisgICAgV0RBX2ZlYXR1cmVDYXBzRXhjaGFuZ2Uodm9zQ29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9DT1JFL1NNRS9zcmMvc21lX2NvbW1vbi9zbWVfRlRBcGkuYyBiL0NPUkUvU01FL3NyYy9zbWVfY29tbW9uL3NtZV9GVEFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzZiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NNRS9zcmMvc21lX2NvbW1vbi9zbWVfRlRBcGkuYwpAQCAtMCwwICsxLDQ4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFxicmllZiBEZWZpbml0aW9ucyBmb3IgU01FIEZUIEFQSXMKKworICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHNtc0RlYnVnLmg+CisjaW5jbHVkZSA8Y3NySW5zaWRlQXBpLmg+CisjaW5jbHVkZSA8Y3NyTmVpZ2hib3JSb2FtLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5pdGlhbGl6ZSB0aGUgRlQgY29udGV4dC4gCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNtZV9GVE9wZW4odEhhbEhhbmRsZSBoSGFsKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIGVIYWxTdGF0dXMgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQuYXV0aF9mdF9pZXMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llc19sZW5ndGggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXNfbGVuZ3RoID0gMDsgICAgICAgCisKKyAgICBzdGF0dXMgPSBwYWxUaW1lckFsbG9jKHBNYWMtPmhIZGQsICZwTWFjLT5mdC5mdFNtZUNvbnRleHQucHJlQXV0aFJlYXNzb2NJbnR2bFRpbWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWVfUHJlYXV0aFJlYXNzb2NJbnR2bFRpbWVyQ2FsbGJhY2ssICh2b2lkICopcE1hYyk7CisKKyAgICBpZiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICAgeworICAgICAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoIlByZWF1dGggUmVhc3NvYyBpbnRlcnZhbCBUaW1lciBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gICAgICAgICAgICAgICAgIAorCisgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQuRlRTdGF0ZSA9IGVGVF9TVEFSVF9SRUFEWTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBDbGVhbnVwIHRoZSBTTUUgRlQgR2xvYmFsIGNvbnRleHQuIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfRlRDbG9zZSh0SGFsSGFuZGxlIGhIYWwpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IFBNQUNfU1RSVUNUKCBoSGFsICk7CisKKyAgICBpZiAocE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzICE9IE5VTEwpCisgICAgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIEZyZWVpbmcgJXAgYW5kIHNldHRpbmcgdG8gTlVMTFxuIiksIAorICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzKTsKKyNlbmRpZgorICAgICAgICB2b3NfbWVtX2ZyZWUocE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzKTsKKyAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzID0gTlVMTDsKKyAgICB9CisgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzX2xlbmd0aCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBpZiAocE1hYy0+ZnQuZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzICE9IE5VTEwpCisgICAgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIEZyZWVpbmcgJXAgYW5kIHNldHRpbmcgdG8gTlVMTFxuIiksIAorICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzKTsKKyNlbmRpZgorICAgICAgICB2b3NfbWVtX2ZyZWUocE1hYy0+ZnQuZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzKTsKKyAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzX2xlbmd0aCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQuRlRTdGF0ZSA9IGVGVF9TVEFSVF9SRUFEWTsKKyAgICB2b3NfbWVtX3plcm8ocE1hYy0+ZnQuZnRTbWVDb250ZXh0LnByZUF1dGhic3NJZCwgQU5JX01BQ19BRERSX1NJWkUpOworCisgICAgaWYgKHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AgIT0gTlVMTCkKKyAgICB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIlczogRnJlZWluZyAlcCBhbmQgc2V0dGluZyB0byBOVUxMXG4iKSwgCisgICAgICAgICAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwKTsKKyNlbmRpZgorICAgICAgICB2b3NfbWVtX2ZyZWUocE1hYy0+ZnQuZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcCk7CisgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIHBhbFRpbWVyRnJlZShwTWFjLT5oSGRkLCBwTWFjLT5mdC5mdFNtZUNvbnRleHQucHJlQXV0aFJlYXNzb2NJbnR2bFRpbWVyKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEVhY2ggdGltZSB0aGUgc3VwcGxpY2FudCBzZW5kcyBkb3duIHRoZSBGVCBJRXMgdG8gdGhlIGRyaXZlci4KKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gU01FLiBUaGlzIGZ1Y250aW9uIHBhY2thZ2VzIGFuZCBzZW5kcworICB0aGUgRlQgSUVzIHRvIFBFLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBzbWVfU2V0RlRJRXMoIHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQsIHRBTklfVTggKmZ0X2llcywgCisgICAgICAgIHRBTklfVTE2IGZ0X2llc19sZW5ndGggKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIGlmICghKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApKSkgcmV0dXJuOworCisgICAgaWYgKGZ0X2llcyA9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBmdCBpZXMgaXMgTlVMTFxuIikpOworICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICAgICAgcmV0dXJuOyAKKyAgICB9CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiRlQgSUVzIFJlcSBpcyByZWNlaXZlZCBpbiBzdGF0ZSAlZFxuIiwgCisgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5GVFN0YXRlKTsKKyNlbmRpZgorCisgICAgLy8gR2xvYmFsIFN0YXRpb24gRlQgU3RhdGUKKyAgICBzd2l0Y2gocE1hYy0+ZnQuZnRTbWVDb250ZXh0LkZUU3RhdGUpCisgICAgeworICAgICAgICBjYXNlIGVGVF9TVEFSVF9SRUFEWToKKyAgICAgICAgY2FzZSBlRlRfQVVUSF9SRVFfUkVBRFk6CisgICAgICAgICAgICBpZiAoKHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llcykgJiYgCisgICAgICAgICAgICAgICAgICAgIChwTWFjLT5mdC5mdFNtZUNvbnRleHQuYXV0aF9mdF9pZXNfbGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBGcmVlIHRoZSBvbmUgd2UgcmVjZWl2ZWQgbGFzdCBmcm9tIHRoZSBzdXBwbGljYW50CisgICAgICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llcyk7CisgICAgICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzX2xlbmd0aCA9IDA7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTYXZlIHRoZSBGVCBJRXMKKyAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llcyA9IHZvc19tZW1fbWFsbG9jKGZ0X2llc19sZW5ndGgpOworICAgICAgICAgICAgaWYocE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1dGhfZnRfaWVzXG4iKSk7CisgICAgICAgICAgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llc19sZW5ndGggPSBmdF9pZXNfbGVuZ3RoOworICAgICAgICAgICAgdm9zX21lbV9jb3B5KCh0QU5JX1U4ICopcE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzLCBmdF9pZXMsCisgICAgICAgICAgICAgICAgZnRfaWVzX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQuRlRTdGF0ZSA9IGVGVF9BVVRIX1JFUV9SRUFEWTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgImZ0X2llc19sZW5ndGg9JWRcbiIsIGZ0X2llc19sZW5ndGgpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIiVkOiBOZXcgQXV0aCBmdF9pZXNfbGVuZ3RoPSUwMnglMDJ4JTAyeFxuIiwgCisgICAgICAgICAgICAgICAgY3VycmVudC0+cGlkLCBwTWFjLT5mdC5mdFNtZUNvbnRleHQuYXV0aF9mdF9pZXNbMF0sCisgICAgICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LmF1dGhfZnRfaWVzWzFdLAorICAgICAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5hdXRoX2Z0X2llc1syXSk7CisgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlRlRfQVVUSF9DT01QTEVURToKKyAgICAgICAgICAgIC8vIFdlIHdpbGwgbmVlZCB0byByZS1zdGFydCBwcmVhdXRoLiBJZiB3ZSByZWNlaXZlZCBGVCBJRXMgaW4KKyAgICAgICAgICAgIC8vIGVGVF9QUkVfQVVUSF9ET05FIHN0YXRlLCBpdCBpbXBsaWVzIHRoZXJlIHdhcyBhIHJla2V5IGluIAorICAgICAgICAgICAgLy8gb3VyIHByZS1hdXRoIHN0YXRlLiBIZW5jZSB0aGlzIGltcGxpZXMgd2UgbmVlZCBQcmUtYXV0aCBhZ2Fpbi4KKworICAgICAgICAgICAgLy8gT0sgbm93IGluZm9ybSBTTUUgd2UgaGF2ZSBubyBwcmUtYXV0aCBsaXN0LgorICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBwcmUtYXV0aCBub2RlIGxvY2FsbHkuIFNldCB5b3VyIHNlbGYgYmFjayB0byByZXN0YXJ0IHByZS1hdXRoCisgICAgICAgICAgICAvLyBUQkQKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgICAgICBzbXNMb2coIHBNYWMsIExPR0UsIAorICAgICAgICAgICAgICAgICJQcmUtYXV0aCBkb25lIGFuZCBub3cgcmVjZWl2aW5nLS0tPiBBVVRIIFJFUSA8LS0tLSBpbiBzdGF0ZSAlZFxuIiwgCisgICAgICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LkZUU3RhdGUpOworICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiVW5oYW5kbGVkIHJlY2VwdGlvbiBvZiBGVCBJRVMgaW4gc3RhdGUgJWRcbiIsIAorICAgICAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5GVFN0YXRlKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlRlRfUkVBU1NPQ19SRVFfV0FJVDoKKyAgICAgICAgICAgIC8vIFdlIGFyZSBkb25lIHdpdGggcHJlLWF1dGgsIGhlbmNlIG5vdyB3YWl0aW5nIGZvcgorICAgICAgICAgICAgLy8gcmVhc3NvYyByZXEuIFRoaXMgaXMgdGhlIG5ldyBGVCBSb2FtaW5nIGluIHBsYWNlCisKKyAgICAgICAgICAgIC8vIEF0IHRoaXMganVuY3R1cmUgd2UgYXJlIHJlYWR5IHRvIHN0YXJ0IHNlbmRpbmcgUmUtQXNzb2MgUmVxLgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIk5ldyBSZWFzc29jIFJlcT0lcCBpbiBzdGF0ZSAlZFxuIiwgCisgICAgICAgICAgICAgICAgZnRfaWVzLCBwTWFjLT5mdC5mdFNtZUNvbnRleHQuRlRTdGF0ZSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICgocE1hYy0+ZnQuZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzKSAmJiAKKyAgICAgICAgICAgICAgICAocE1hYy0+ZnQuZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzX2xlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRnJlZSB0aGUgb25lIHdlIHJlY2VpdmVkIGxhc3QgZnJvbSB0aGUgc3VwcGxpY2FudAorICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTWFjLT5mdC5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXMpOworICAgICAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llc19sZW5ndGggPSAwOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgRlQgSUVzCisgICAgICAgICAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXMgPSB2b3NfbWVtX21hbGxvYyhmdF9pZXNfbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmKHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llcyA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFzc29jX2Z0X2llc1xuIikpOworICAgICAgICAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXNfbGVuZ3RoID0gZnRfaWVzX2xlbmd0aDsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSgodEFOSV9VOCAqKXBNYWMtPmZ0LmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llcywgZnRfaWVzLAorICAgICAgICAgICAgICAgIGZ0X2llc19sZW5ndGgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LkZUU3RhdGUgPSBlRlRfU0VUX0tFWV9XQUlUOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgImZ0X2llc19sZW5ndGg9JWQgc3RhdGU9JWRcbiIsIGZ0X2llc19sZW5ndGgsCisgICAgICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LkZUU3RhdGUpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIiVkOiBOZXcgQXV0aCBmdF9pZXNfbGVuZ3RoPSUwMnglMDJ4JTAyeFxuIiwgCisgICAgICAgICAgICAgICAgY3VycmVudC0+cGlkLCBwTWFjLT5mdC5mdFNtZUNvbnRleHQucmVhc3NvY19mdF9pZXNbMF0sCisgICAgICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnJlYXNzb2NfZnRfaWVzWzFdLAorICAgICAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5yZWFzc29jX2Z0X2llc1syXSk7CisgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCBGTCgiIFVuaGFuZGxlZCBzdGF0ZT0lZFxuIiksCisgICAgICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LkZUU3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNtZV9SZWxlYXNlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworfQorICAgICAgICAgICAgCitlSGFsU3RhdHVzIHNtZV9GVFNlbmRVcGRhdGVLZXlJbmQodEhhbEhhbmRsZSBoSGFsLCB0Q3NyUm9hbVNldEtleSAqIHBGVEtleUluZm8pCit7CisgICAgdFNpckZUVXBkYXRlS2V5SW5mbyAqcE1zZzsKKyAgICB0QU5JX1UxNiBtc2dMZW47CisgICAgZUhhbFN0YXR1cyBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHRBbmlFZFR5cGUgdG1wRWRUeXBlOworICAgIHRBbmlLZXlEaXJlY3Rpb24gdG1wRGlyZWN0aW9uOworICAgIC8vdEFOSV9VOCAqcEJ1ZjsKKyAgICB0QU5JX1U4ICpwID0gTlVMTDsKKyAgICB0QW5pRWRUeXBlIGVkVHlwZTsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBzbXNMb2cocE1hYywgTE9HRSwgRkwoImtleUxlbmd0aCAlZFxuIiksIHBGVEtleUluZm8tPmtleUxlbmd0aCk7CisKKyAgICAgIGZvcihpPTA7IGk8cEZUS2V5SW5mby0+a2V5TGVuZ3RoOyBpKyspCisgICAgICAgICAgc21zTG9nKHBNYWMsIExPR0UsIEZMKCIlMDJ4IiksIHBGVEtleUluZm8tPktleVtpXSk7IAorCisgICAgbXNnTGVuICA9IHNpemVvZiggdEFOSV9VMTYpICsgc2l6ZW9mKCB0QU5JX1UxNiApICsgCisgICAgICAgc2l6ZW9mKCBwTXNnLT5rZXlNYXRlcmlhbC5sZW5ndGggKSArIHNpemVvZiggcE1zZy0+a2V5TWF0ZXJpYWwuZWRUeXBlICkgKyAKKyAgICAgICBzaXplb2YoIHBNc2ctPmtleU1hdGVyaWFsLm51bUtleXMgKSArIHNpemVvZiggcE1zZy0+a2V5TWF0ZXJpYWwua2V5ICk7CisgICAgICAgICAgICAgICAgICAgICAKKyAgICBzdGF0dXMgPSBwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgbXNnTGVuKTsKKyAgICBpZiAoICFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSApCisgICAgeworICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1zZywgbXNnTGVuKTsKKyAgICBwTXNnLT5tZXNzYWdlVHlwZSA9IHBhbF9jcHVfdG9fYmUxNigodEFOSV9VMTYpZVdOSV9TTUVfRlRfVVBEQVRFX0tFWSk7CisgICAgcE1zZy0+bGVuZ3RoID0gcGFsX2NwdV90b19iZTE2KG1zZ0xlbik7CisKKyAgICBwID0gKHRBTklfVTggKikmcE1zZy0+a2V5TWF0ZXJpYWw7CisKKyAgICAvLyBTZXQgdGhlIHBNc2ctPmtleU1hdGVyaWFsLmxlbmd0aCBmaWVsZCAodGhpcyBsZW5ndGggaXMgZGVmaW5lZCBhcyBhbGwgZGF0YSB0aGF0IGZvbGxvd3MgdGhlIGVkVHlwZSBmaWVsZAorICAgIC8vIGluIHRoZSB0U2lyS2V5TWF0ZXJpYWwga2V5TWF0ZXJpYWw7IGZpZWxkKS4KKyAgICAvLworICAgIC8vICEhTk9URTogIFRoaXMga2V5TWF0ZXJpYWwubGVuZ3RoIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgYSBNQVggc2l6ZSBrZXksIHRob3VnaCB0aGUga2V5TGVuZ3RoIGNhbiBiZSAKKyAgICAvLyBzaG9ydGVyIHRoYW4gdGhpcyBtYXggc2l6ZS4gIElzIExJTSBpbnRlcnByZXRpbmcgdGhpcyBvayA/CisgICAgcCA9IHBhbF9zZXRfVTE2KCBwLCBwYWxfY3B1X3RvX2JlMTYoKHRBTklfVTE2KSggc2l6ZW9mKCBwTXNnLT5rZXlNYXRlcmlhbC5udW1LZXlzICkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHBNc2ctPmtleU1hdGVyaWFsLm51bUtleXMgKiBzaXplb2YoIHBNc2ctPmtleU1hdGVyaWFsLmtleSApICkgKSkgKTsKKworICAgIC8vIHNldCBwTXNnLT5rZXlNYXRlcmlhbC5lZFR5cGUKKyAgICBlZFR5cGUgPSBjc3JUcmFuc2xhdGVFbmNyeXB0VHlwZVRvRWRUeXBlKCBwRlRLZXlJbmZvLT5lbmNUeXBlICk7CisgICAgdG1wRWRUeXBlID0gcGFsX2NwdV90b19iZTMyKGVkVHlwZSk7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcCwgKHRBTklfVTggKikmdG1wRWRUeXBlLCBzaXplb2YodEFuaUVkVHlwZSkgKTsKKyAgICBwICs9IHNpemVvZiggcE1zZy0+a2V5TWF0ZXJpYWwuZWRUeXBlICk7CisKKyAgICAvLyBzZXQgdGhlIHBNc2ctPmtleU1hdGVyaWFsLm51bUtleXMgZmllbGQKKyAgICAqcCA9IHBNc2ctPmtleU1hdGVyaWFsLm51bUtleXM7CisgICAgcCArPSBzaXplb2YoIHBNc2ctPmtleU1hdGVyaWFsLm51bUtleXMgKTsgICAKKworICAgIC8vIHNldCBwU2lyS2V5LT5rZXlJZCA9IGtleUlkOworICAgICpwID0gcE1zZy0+a2V5TWF0ZXJpYWwua2V5WyAwIF0ua2V5SWQ7CisgICAgcCArPSBzaXplb2YoIHBNc2ctPmtleU1hdGVyaWFsLmtleVsgMCBdLmtleUlkICk7CisKKyAgICAvLyBzZXQgcFNpcktleS0+dW5pY2FzdCA9ICh0QU5JX1U4KWZVbmljYXN0OworICAgICpwID0gKHRBTklfVTgpZUFOSV9CT09MRUFOX1RSVUU7CisgICAgcCArPSBzaXplb2YoIHBNc2ctPmtleU1hdGVyaWFsLmtleVsgMCBdLnVuaWNhc3QgKTsKKworICAgIC8vIHNldCBwU2lyS2V5LT5rZXlEaXJlY3Rpb24gPSBhbmlLZXlEaXJlY3Rpb247CisgICAgdG1wRGlyZWN0aW9uID0gcGFsX2NwdV90b19iZTMyKHBGVEtleUluZm8tPmtleURpcmVjdGlvbik7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcCwgKHRBTklfVTggKikmdG1wRGlyZWN0aW9uLCBzaXplb2YodEFuaUtleURpcmVjdGlvbikgKTsKKyAgICBwICs9IHNpemVvZih0QW5pS2V5RGlyZWN0aW9uKTsKKyAgICAvLyAgICBwU2lyS2V5LT5rZXlSc2MgPSA7OworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHAsIHBGVEtleUluZm8tPmtleVJzYywgQ1NSX01BWF9SU0NfTEVOICk7CisgICAgcCArPSBzaXplb2YoIHBNc2ctPmtleU1hdGVyaWFsLmtleVsgMCBdLmtleVJzYyApOworCisgICAgLy8gc2V0IHBTaXJLZXktPnBhZVJvbGUKKyAgICAqcCA9IHBGVEtleUluZm8tPnBhZVJvbGU7ICAgLy8gMCBpcyBTdXBwbGljYW50CisgICAgcCsrOworCisgICAgLy8gc2V0IHBTaXJLZXktPmtleUxlbmd0aCA9IGtleUxlbmd0aDsKKyAgICBwID0gcGFsX3NldF9VMTYoIHAsIHBhbF9jcHVfdG9fYmUxNihwRlRLZXlJbmZvLT5rZXlMZW5ndGgpICk7CisKKyAgICBpZiAoIHBGVEtleUluZm8tPmtleUxlbmd0aCAmJiBwRlRLZXlJbmZvLT5LZXkgKSAKKyAgICB7ICAgCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHAsIHBGVEtleUluZm8tPktleSwgcEZUS2V5SW5mby0+a2V5TGVuZ3RoICk7IAorICAgICAgICBpZihwRlRLZXlJbmZvLT5rZXlMZW5ndGggPT0gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCAiICBTTUUgU2V0IGtleUlkeCAoJWQpIGVuY1R5cGUoJWQpIGtleSA9ICUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlhcbiIsCisgICAgICAgICAgICBwRlRLZXlJbmZvLT5rZXlJZCwgZWRUeXBlLCBwRlRLZXlJbmZvLT5LZXlbMF0sIHBGVEtleUluZm8tPktleVsxXSwgcEZUS2V5SW5mby0+S2V5WzJdLCBwRlRLZXlJbmZvLT5LZXlbM10sIHBGVEtleUluZm8tPktleVs0XSwKKyAgICAgICAgICAgIHBGVEtleUluZm8tPktleVs1XSwgcEZUS2V5SW5mby0+S2V5WzZdLCBwRlRLZXlJbmZvLT5LZXlbN10sIHBGVEtleUluZm8tPktleVs4XSwKKyAgICAgICAgICAgIHBGVEtleUluZm8tPktleVs5XSwgcEZUS2V5SW5mby0+S2V5WzEwXSwgcEZUS2V5SW5mby0+S2V5WzExXSwgcEZUS2V5SW5mby0+S2V5WzEyXSwgcEZUS2V5SW5mby0+S2V5WzEzXSwgcEZUS2V5SW5mby0+S2V5WzE0XSwgcEZUS2V5SW5mby0+S2V5WzE1XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBwYWxTZW5kTUJNZXNzYWdlKHBNYWMtPmhIZGQsIHBNc2cpOworCisgICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworZUhhbFN0YXR1cyBzbWVfRlRVcGRhdGVLZXkoIHRIYWxIYW5kbGUgaEhhbCwgdENzclJvYW1TZXRLZXkgKiBwRlRLZXlJbmZvICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisKKyAgICBzdGF0dXMgPSBzbWVfQWNxdWlyZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgICBpZiAoISggSEFMX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSkpCisgICAgeworICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIGlmIChwRlRLZXlJbmZvID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAiJXM6IHBGVEtleUluZm8gaXMgTlVMTFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19GQUlMVVJFOyAKKyAgICB9CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgc21zTG9nKCBwTWFjLCBMT0dFLCAic21lX0ZUVXBkYXRlS2V5IGlzIHJlY2VpdmVkIGluIHN0YXRlICVkXG4iLCAKKyAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LkZUU3RhdGUpOworI2VuZGlmCisKKyAgICAvLyBHbG9iYWwgU3RhdGlvbiBGVCBTdGF0ZQorICAgIHN3aXRjaChwTWFjLT5mdC5mdFNtZUNvbnRleHQuRlRTdGF0ZSkKKyAgICB7CisgICAgY2FzZSBlRlRfU0VUX0tFWV9XQUlUOgorICAgICAgIHN0YXR1cyA9IHNtZV9GVFNlbmRVcGRhdGVLZXlJbmQoIGhIYWwsIHBGVEtleUluZm8gKTsKKyAgICAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQuRlRTdGF0ZSA9IGVGVF9TVEFSVF9SRUFEWTsKKyAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgIHNtc0xvZyggcE1hYywgTE9HRSwgIiVzOiBVbmhhbmRsZWQgc3RhdGU9JWRcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5GVFN0YXRlKTsKKyAgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSEREIEludGVyZmFjZSB0byBTTUUuIFNNRSBub3cgc2VuZHMgdGhlIEF1dGggMiBhbmQgUklDIElFcyB1cCB0byB0aGUgc3VwcGxpY2FudC4KKyAqIFRoZSBzdXBwbGljYW50IHdpbGwgdGhlbiBwcm9jZWVkIHRvIHNlbmQgZG93biB0aGUKKyAqIFJlYXNzb2MgUmVxLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX0dldEZUUHJlQXV0aFJlc3BvbnNlKCB0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggKmZ0X2llcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgZnRfaWVzX2lwX2xlbiwgdEFOSV9VMTYgKmZ0X2llc19sZW5ndGggKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKworICAgICpmdF9pZXNfbGVuZ3RoID0gMDsKKworICAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgIGlmICghKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApKSkgCisgICAgICAgcmV0dXJuOworCisgICAgLyogQWxsIG9yIG5vdGhpbmcgLSBwcm9jZWVkIG9ubHkgaWYgYm90aCBCU1NJRCBhbmQgRlQgSUUgZml0ICovCisgICAgaWYoKEFOSV9NQUNfQUREUl9TSVpFICsgCisgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcC0+ZnRfaWVzX2xlbmd0aCkgPiBmdF9pZXNfaXBfbGVuKSAKKyAgICB7CisgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGhkZCBuZWVkcyB0byBwYWNrIHRoZSBic3NpZCBhbHNvIGFsb25nIHdpdGggdGhlIAorICAgIC8vIGF1dGggcmVzcG9uc2UgdG8gc3VwcGxpY2FudAorICAgIHZvc19tZW1fY29weShmdF9pZXMsIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wcmVBdXRoYnNzSWQsIEFOSV9NQUNfQUREUl9TSVpFKTsKKyAgICAKKyAgICAvLyBDb3B5IHRoZSBhdXRoIHJlc3AgRlRJRXMKKyAgICB2b3NfbWVtX2NvcHkoJihmdF9pZXNbQU5JX01BQ19BRERSX1NJWkVdKSwgCisgICAgICAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AtPmZ0X2llcywgCisgICAgICAgICAgICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AtPmZ0X2llc19sZW5ndGgpOworCisgICAgKmZ0X2llc19sZW5ndGggPSBBTklfTUFDX0FERFJfU0laRSArIAorICAgICAgIHBNYWMtPmZ0LmZ0U21lQ29udGV4dC5wc2F2ZWRGVFByZUF1dGhSc3AtPmZ0X2llc19sZW5ndGg7CisKKyAgICBwTWFjLT5mdC5mdFNtZUNvbnRleHQuRlRTdGF0ZSA9IGVGVF9SRUFTU09DX1JFUV9XQUlUOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICBzbXNMb2coIHBNYWMsIExPR0UsIEZMKCIgRmlsbGVkIGF1dGggcmVzcCA9ICVkXG4iKSwgKmZ0X2llc19sZW5ndGgpOworI2VuZGlmCisgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU01FIG5vdyBzZW5kcyB0aGUgUklDIElFcyB1cCB0byB0aGUgc3VwcGxpY2FudC4KKyAqIFRoZSBzdXBwbGljYW50IHdpbGwgdGhlbiBwcm9jZWVkIHRvIHNlbmQgZG93biB0aGUKKyAqIFJlYXNzb2MgUmVxLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX0dldFJJQ0lFcyggdEhhbEhhbmRsZSBoSGFsLCB0QU5JX1U4ICpyaWNfaWVzLCB0QU5JX1UzMiByaWNfaWVzX2lwX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnJpY19pZXNfbGVuZ3RoICkKK3sKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisKKyAgICAqcmljX2llc19sZW5ndGggPSAwOworCisgICAgc3RhdHVzID0gc21lX0FjcXVpcmVHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgaWYgKCEoIEhBTF9TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkpKSAKKyAgICAgICByZXR1cm47CisKKyAgICAvKiBBbGwgb3Igbm90aGluZyAqLworICAgIGlmIChwTWFjLT5mdC5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwLT5yaWNfaWVzX2xlbmd0aCA+IAorICAgICAgICByaWNfaWVzX2lwX2xlbikKKyAgICB7CisgICAgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZvc19tZW1fY29weShyaWNfaWVzLCBwTWFjLT5mdC5mdFNtZUNvbnRleHQucHNhdmVkRlRQcmVBdXRoUnNwLT5yaWNfaWVzLCAKKyAgICAgICAgICAgICAgICAgcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcC0+cmljX2llc19sZW5ndGgpOworCisgICAgKnJpY19pZXNfbGVuZ3RoID0gcE1hYy0+ZnQuZnRTbWVDb250ZXh0LnBzYXZlZEZUUHJlQXV0aFJzcC0+cmljX2llc19sZW5ndGg7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUl9ERUJVRworICAgIHNtc0xvZyggcE1hYywgTE9HRSwgRkwoIiBGaWxsZWQgcmljIGllcyA9ICVkXG4iKSwgKnJpY19pZXNfbGVuZ3RoKTsKKyNlbmRpZgorCisgICAgc21lX1JlbGVhc2VHbG9iYWxMb2NrKCAmcE1hYy0+c21lICk7CisgICAgcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGltZXIgY2FsbGJhY2sgZm9yIHRoZSB0aW1lciB0aGF0IGlzIHN0YXJ0ZWQgYmV0d2VlbiB0aGUgcHJlYXV0aCBjb21wbGV0aW9uIGFuZCAKKyAqIHJlYXNzb2MgcmVxdWVzdCB0byB0aGUgUEUuIEluIHRoaXMgaW50ZXJ2YWwsIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHByZS1hdXRoIHJlc3BvbnNlIAorICogYW5kIFJJQyBJRXMgYXJlIHBhc3NlZCB1cCB0byB0aGUgV1BBIHN1cHBsaWNhbnQgYW5kIHJlY2VpdmVkIGJhY2sgdGhlIG5lY2Vzc2FyeSBGVElFcyAKKyAqIHJlcXVpcmVkIHRvIGJlIHNlbnQgaW4gdGhlIHJlYXNzb2MgcmVxdWVzdAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc21lX1ByZWF1dGhSZWFzc29jSW50dmxUaW1lckNhbGxiYWNrKHZvaWQgKmNvbnRleHQpCit7CisjaWZkZWYgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsICljb250ZXh0OworICAgIGNzck5laWdoYm9yUm9hbVJlcXVlc3RIYW5kb2ZmKHBNYWMpOworI2VuZGlmCisgICAgcmV0dXJuOworfQorLyogRW5kIG9mIEZpbGUgKi8KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9TVkMvZXh0ZXJuYWwvd2xhbl9ubGlua19jb21tb24uaCBiL0NPUkUvU1ZDL2V4dGVybmFsL3dsYW5fbmxpbmtfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljMDc0NQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1ZDL2V4dGVybmFsL3dsYW5fbmxpbmtfY29tbW9uLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBcZmlsZSB3bGFuX25saW5rX2NvbW1vbi5oCisgIAorICBFeHBvcnRzIGFuZCB0eXBlcyBmb3IgdGhlIE5ldGxpbmsgU2VydmljZSBpbnRlcmZhY2UuIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMKKyAgbWVzc2FnZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgdXNlciBzcGFjZSBzZXJ2aWNlCisgIChlLmcuIEJUQyBzZXJ2aWNlKSBhbmQgV0xBTiBrZXJuZWwgbW9kdWxlLgorCisgIENvcHlyaWdodCAoYykgMjAwOSBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBXTEFOX05MSU5LX0NPTU1PTl9IX18KKyNkZWZpbmUgV0xBTl9OTElOS19DT01NT05fSF9fCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBGdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0xBTl9OTF9NQVhfUEFZTE9BRCAgIDI1NiAgICAgLyogbWF4aW11bSBzaXplIGZvciBuZXRsaW5rIG1lc3NhZ2UqLworI2RlZmluZSBXTEFOX05MSU5LX1BST1RPX0ZBTUlMWSAgTkVUTElOS19VU0VSU09DSworI2RlZmluZSBXTEFOX05MSU5LX01DQVNUX0dSUF9JRCAgMHgwMSAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAKKyAqIFRoZSBmb2xsb3dpbmcgZW51bSBkZWZpbmVzIHRoZSB0YXJnZXQgc2VydmljZSB3aXRoaW4gV0xBTiBkcml2ZXIgZm9yIHdoaWNoIHRoZQorICogbWVzc2FnZSBpcyBpbnRlbmRlZCBmb3IuIEVhY2ggc2VydmljZSBhbG9uZyB3aXRoIGl0cyBjb3VudGVycGFydCAKKyAqIGluIHRoZSB1c2VyIHNwYWNlLCBkZWZpbmUgYSBzZXQgb2YgbWVzc2FnZXMgdGhleSByZWNvZ25pemUuCisgKiBFYWNoIG9mIHRoaXMgbWVzc2FnZSB3aWxsIGhhdmUgYW4gaGVhZGVyIG9mIHR5cGUgdEFuaU1zZ0hkciBkZWZpbmVkIGJlbG93LgorICogRWFjaCBOZXRsaW5rIG1lc3NhZ2UgdG8vZnJvbSBhIGtlcm5lbCBtb2R1bGUgd2lsbCBjb250YWluIG9ubHkgb25lCisgKiBtZXNzYWdlIHdoaWNoIGlzIHByZWNlZGVkIGJ5IGEgdEFuaU1zZ0hkci4gVGhlIG1heGltdW4gc2l6ZSAoaW4gYnl0ZXMpIG9mCisgKiBhIG5ldGxpbmsgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIE1BWF9QQVlMT0FEIGJ5dGVzLgorICoKKyAqICAgICAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKyAqICAgICAgICAgfE5ldGxpbmsgaGRyIHwgQWxpZ24gfHRBbmlNc2dIZHJ8IG1zZyBib2R5IHwKKyAqICAgICAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS18LS0tLS0tLS0tLSsKKyAqLworCisvLyBNZXNzYWdlIFR5cGVzIAorI2RlZmluZSBXTEFOX0JUQ19RVUVSWV9TVEFURV9SRVEgICAgMHgwMSAgLy8gQlRDICAtLT4gV0xBTgorI2RlZmluZSBXTEFOX0JUQ19CVF9FVkVOVF9JTkQgICAgICAgMHgwMiAgLy8gQlRDICAtLT4gV0xBTgorI2RlZmluZSBXTEFOX0JUQ19RVUVSWV9TVEFURV9SU1AgICAgMHgwMyAgLy8gV0xBTiAtLT4gIEJUQworI2RlZmluZSBXTEFOX01PRFVMRV9VUF9JTkQgICAgICAgICAgMHgwNCAgLy8gV0xBTiAtLT4gIEJUQworI2RlZmluZSBXTEFOX01PRFVMRV9ET1dOX0lORCAgICAgICAgMHgwNSAgLy8gV0xBTiAtLT4gIEJUQworI2RlZmluZSBXTEFOX1NUQV9BU1NPQ19ET05FX0lORCAgICAgMHgwNiAgLy8gV0xBTiAtLT4gIEJUQworI2RlZmluZSBXTEFOX1NUQV9ESVNBU1NPQ19ET05FX0lORCAgMHgwNyAgLy8gV0xBTiAtLT4gIEJUQworCisvLyBTcGVjaWFsIE1lc3NhZ2UgVHlwZSB1c2VkIGJ5IEFNUCwgaW50ZXJjZXB0ZWQgYnkgc2VuZF9idGNfbmxpbmtfbXNnKCkgYW5kCisvLyByZXBsYWNlZCBieSBXTEFOX1NUQV9BU1NPQ19ET05FX0lORCBvciBXTEFOX1NUQV9ESVNBU1NPQ19ET05FX0lORAorI2RlZmluZSBXTEFOX0FNUF9BU1NPQ19ET05FX0lORCAgICAgMHgxMAorCisvLyBTcGVjaWFsIE1lc3NhZ2UgVHlwZSB1c2VkIGJ5IFNvZnRBUCwgaW50ZXJjZXB0ZWQgYnkgc2VuZF9idGNfbmxpbmtfbXNnKCkgYW5kCisvLyByZXBsYWNlZCBieSBXTEFOX1NUQV9BU1NPQ19ET05FX0lORAorI2RlZmluZSBXTEFOX0JUQ19TT0ZUQVBfQlNTX1NUQVJUICAgICAgMHgxMQorCisKKy8vIEV2ZW50IGRhdGEgZm9yIFdMQU5fQlRDX1FVRVJZX1NUQVRFX1JTUCAmIFdMQU5fU1RBX0FTU09DX0RPTkVfSU5ECit0eXBlZGVmIHN0cnVjdAoreworICAgdW5zaWduZWQgY2hhciBjaGFubmVsOyAgLy8gMCBpbXBsaWVzIFNUQSBub3QgYXNzb2NpYXRlZCB0byBBUAorfSB0V2xhbkFzc29jRGF0YTsKKworI2RlZmluZSBBTklfTkxfTVNHX0JBU0UgICAgIDB4MTAgICAgLyogU29tZSBhcmJpdHJhcnkgYmFzZSAqLworCit0eXBlZGVmIGVudW0gZUFuaU5sTW9kdWxlVHlwZXMgeworICAgQU5JX05MX01TR19QVU1BQyA9IEFOSV9OTF9NU0dfQkFTRSArIDB4MDEsLy8gUFRUIFNvY2tldCBBcHAKKyAgIEFOSV9OTF9NU0dfUFRUICAgPSBBTklfTkxfTVNHX0JBU0UgKyAweDA3LC8vIFF1YXJreSBHVUkKKyAgIFdMQU5fTkxfTVNHX0JUQywKKyAgIEFOSV9OTF9NU0dfTUFYICAKK30gdEFuaU5sTW9kVHlwZXMsIHRXbGFuTmxNb2RUeXBlczsKKworI2RlZmluZSBXTEFOX05MX01TR19CQVNFIEFOSV9OTF9NU0dfQkFTRQorI2RlZmluZSBXTEFOX05MX01TR19NQVggIEFOSV9OTF9NU0dfTUFYCisKKy8vQWxsIE5ldGxpbmsgbWVzc2FnZXMgbXVzdCBjb250YWluIHRoaXMgaGVhZGVyCit0eXBlZGVmIHN0cnVjdCBzQW5pSGRyIHsKKyAgIHVuc2lnbmVkIHNob3J0IHR5cGU7CisgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGg7Cit9IHRBbmlIZHIsIHRBbmlNc2dIZHI7CisKKyNlbmRpZiAvL1dMQU5fTkxJTktfQ09NTU9OX0hfXwpkaWZmIC0tZ2l0IGEvQ09SRS9TVkMvaW5jL3dsYW5fYnRjX3N2Yy5oIGIvQ09SRS9TVkMvaW5jL3dsYW5fYnRjX3N2Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMGNiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NWQy9pbmMvd2xhbl9idGNfc3ZjLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdsYW5fYnRjX3N2Yy5oCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBXTEFOX0JUQ19TVkNfSAorI2RlZmluZSBXTEFOX0JUQ19TVkNfSCAKKwordm9pZCBzZW5kX2J0Y19ubGlua19tc2cgKGludCB0eXBlLCBpbnQgZGVzdF9waWQpOworaW50IGJ0Y19hY3RpdmF0ZV9zZXJ2aWNlKHZvaWQgKnBBZGFwdGVyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1NWQy9pbmMvd2xhbl9ubGlua19zcnYuaCBiL0NPUkUvU1ZDL2luYy93bGFuX25saW5rX3Nydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OGZmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NWQy9pbmMvd2xhbl9ubGlua19zcnYuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd2xhbl9ubGlua19zcnYuaAorICoKKyAqIHdsYW5fbmxpbmtfc3J2IGlzIHVzZWQgdG8gUlgvVFggTmV0bGluayBtZXNzYWdlcyBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsCisgKiBtb2R1bGVzIGFuZCB2aWNlIHZlcnNhLiBLZXJuZWwgbW9kdWxlcyBtdXN0IHJlZ2lzdGVyIGEgbWVzc2FnZSBoYW5kbGVyIGZvciBhCisgKiBtZXNzYWdlIHR5cGUgc28gdGhhdCB0aGUgd2xhbl9ubGlua19zcnYgY2FuIGludm9rZSB0aGUgY29ycmVzcG9uZGluZyBtc2cgaGFuZGxlcgorICogd2hlbmV2ZXIgYSBOZXRsaW5rIG1lc3NhZ2Ugb2YgYSBwYXJ0aWN1bGFyIHR5cGUgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSBhbgorICogYXBwbGljYXRpb24uICBJbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLCB3bGFuX25saW5rX3NydiBwcm92aWRlcyBhIG1lY2hhbmlzbSAgCisgKiB3aGljaCBrZXJuZWwgbW9kdWxlcyBjYW4gdXNlIHRvIHNlbmQgTmV0bGluayBtZXNzYWdlcyB0byBhcHBsaWNhdGlvbnMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBXTEFOX05MSU5LX1NSVl9ICisjZGVmaW5lIFdMQU5fTkxJTktfU1JWX0ggCisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8d2xhbl9ubGlua19jb21tb24uaD4KKworI2RlZmluZSBOTElOS19NQVhfQ0FMTEJBQ0tTIChXTEFOX05MX01TR19NQVggLSBXTEFOX05MX01TR19CQVNFKQorCit0eXBlZGVmIGludCAoKiBubF9zcnZfbXNnX2NhbGxiYWNrKShzdHJ1Y3Qgc2tfYnVmZiAqIHNrYik7CisKK2ludCBubF9zcnZfaW5pdCh2b2lkKTsKK3ZvaWQgbmxfc3J2X2V4aXQodm9pZCk7CitpbnQgbmxfc3J2X3JlZ2lzdGVyKHRXbGFuTmxNb2RUeXBlcyBtc2dfdHlwZSwgbmxfc3J2X21zZ19jYWxsYmFjayBtc2dfaGFuZGxlcik7CitpbnQgbmxfc3J2X3VucmVnaXN0ZXIodFdsYW5ObE1vZFR5cGVzIG1zZ190eXBlLCBubF9zcnZfbXNnX2NhbGxiYWNrIG1zZ19oYW5kbGVyKTsKK2ludCBubF9zcnZfdWNhc3Qoc3RydWN0IHNrX2J1ZmYgKiBza2IsIGludCBkc3RfcGlkKTsKK2ludCBubF9zcnZfYmNhc3Qoc3RydWN0IHNrX2J1ZmYgKiBza2IpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvU1ZDL2luYy93bGFuX3B0dF9zb2NrX3N2Yy5oIGIvQ09SRS9TVkMvaW5jL3dsYW5fcHR0X3NvY2tfc3ZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhNThkNQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1ZDL2luYy93bGFuX3B0dF9zb2NrX3N2Yy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd2xhbl9wdHRfc29ja19zdmMuYworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBUVF9TT0NLX1NWQ19ICisjZGVmaW5lIFBUVF9TT0NLX1NWQ19ICisjaW5jbHVkZSA8d2xhbl9ubGlua19zcnYuaD4KKyNpbmNsdWRlIDxoYWxUeXBlcy5oPgorI2luY2x1ZGUgPHZvc19zdGF0dXMuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHZvc190cmFjZS5oPgorI2luY2x1ZGUgPHdsYW5fbmxpbmtfY29tbW9uLmg+CisvKgorICogUXVhcmt5IE1lc3NhZ2UgRm9ybWF0OgorICogVGhlIGZvbGxvd2luZyBpcyB0aGUgbWVzc2FnaW5nIHByb3RvY29sIGJldHdlZW4gUXVhcmt5IGFuZCBQVFQgU29ja2V0IEFwcC4KKyAqIFRoZSB0b3RhbE1zZ0xlbiBpcyB0aGUgbGVuZ3RoIGZyb20gUmFkaW8gdGlsbCBtc2dCb2R5LiBUaGUgdmFsdWUgb2YgUmFkaW8KKyAqIGlzIGFsd2F5cyBkZWZhdWx0ZWQgdG8gMC4gVGhlIE1zZ0xlbiBpcyB0aGUgbGVuZ3RoIGZyb20gbXNnSWQgdGlsbCBtc2dCb2R5LgorICogVGhlIGxlbmd0aCBvZiB0aGUgbXNnQm9keSB2YXJpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBNc2dJZC4gQnVmZmVyIHNwYWNlCisgKiBmb3IgTXNnQm9keSBpcyBhbHJlYWR5IGFsbG9jYXRlZCBpbiB0aGUgcmVjZWl2ZWQgYnVmZmVyLiBTbyBpbiBjYXNlIG9mIFJFQUQKKyAqIHdlIGp1c3QgbmVlZCB0byBwb3B1bGF0ZSB0aGUgdmFsdWVzIGluIHRoZSByZWNlaXZlZCBtZXNzYWdlIGFuZCBzZW5kIGl0CisgKiBiYWNrCisgKiArLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLSsKKyAqIHxUb3RhbE1zZ0xlbiB8IFJhZGlvIHwgTXNnSWQgfCBNc2dMZW4gfFN0YXR1cyB8TXNnQm9keSAgfAorICogKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS18LS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0rCisgKiA8LS0tLS0tNC0tLS0+PC0tNC0tLT48LS0tMi0tPjwtLS0yLS0tPjwtLS00LS0+PC0tLS0tLS0tLT4KKyAqLworLy8gUFRUIFNvY2tldCBBcHAgTWVzc2FnZSBJZHMKKyNkZWZpbmUgUFRUX01TR19SRUFEX1JFR0lTVEVSICAgICAgIDB4MzA0MAorI2RlZmluZSBQVFRfTVNHX1dSSVRFX1JFR0lTVEVSICAgICAgMHgzMDQxCisjZGVmaW5lIFBUVF9NU0dfUkVBRF9NRU1PUlkgICAgICAgICAweDMwNDQKKyNkZWZpbmUgUFRUX01TR19XUklURV9NRU1PUlkgICAgICAgIDB4MzA0NQorI2RlZmluZSBQVFRfTVNHX0xPR19EVU1QX0RCRyAgICAgICAgMHgzMkExCisjaWZkZWYgQU5JX01BTkZfRElBRworI2RlZmluZSBQVFRfTVNHX0ZUTV9DTURTX1RZUEUgICAgICAgICAgIDB4NDA0MAorI2VuZGlmCisjZGVmaW5lIEFOSV9EUklWRVJfTVNHX1NUQVJUICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEFOSV9NU0dfQVBQX1JFR19SRVEgICAgICAgICAoQU5JX0RSSVZFUl9NU0dfU1RBUlQgKyAwKQorI2RlZmluZSBBTklfTVNHX0FQUF9SRUdfUlNQICAgICAgICAgKEFOSV9EUklWRVJfTVNHX1NUQVJUICsgMSkKKyNkZWZpbmUgQU5JX01BWF9SQURJT1MgICAgICAzCisjZGVmaW5lIEFOSV9OTF9NU0dfT0sgICAgICAgMAorI2RlZmluZSBBTklfTkxfTVNHX0VSUk9SICAgIC0xCisjZGVmaW5lIEFOSV9OTF9NU0dfT1ZFUkhFQUQgKE5MTVNHX1NQQUNFKHRBbmlIZHIgKyA0KSkKKy8qCisgKiBQYWNrZXQgRm9ybWF0IGZvciBSRUFEX1JFR0lTVEVSICYgV1JJVEVfUkVHSVNURVI6CisgKiBUb3RhbE1zZ0xlbiA6IDQgYnl0ZXMgIFt2YWx1ZT0yMCBieXRlc10KKyAqIFJhZGlvICAgICAgIDogNCBieXRlcworICogTXNnSWQgICAgICAgOiAyIGJ5dGVzCisgKiBNc2dMZW4gICAgICA6IDIgYnl0ZXMKKyAqIFN0YXR1cyAgICAgIDogNCBieXRlcworICogQWRkcmVzcyAgICAgOiA0IGJ5dGVzCisgKiBQYXlsb2FkICAgICA6IDQgYnl0ZXMKKyovCisvKgorICogUGFja2V0IEZvcm1hdCBmb3IgUkVBRF9NRU1PUlkgJiBXUklURV9NRU1PUlkgOgorICogVG90YWxNc2dMZW4gOiA0IGJ5dGVzIFt2YWx1ZT0gMjArTEVOX1BBWUxPQUQgYnl0ZXNdCisgKiBSYWRpbyAgICAgICA6IDQgYnl0ZXMKKyAqIE1zZ0lkICAgICAgIDogMiBieXRlcworICogTXNnTGVuICAgICAgOiAyIGJ5dGVzCisgKiBTdGF0dXMgICAgICA6IDQgYnl0ZXMKKyAqIEFkZHJlc3MgICAgIDogNCBieXRlcworICogTGVuZ3RoICAgICAgOiA0IGJ5dGVzIFtMRU5fUEFZTE9BRF0KKyAqIFBheWxvYWQgICAgIDogTEVOX1BBWUxPQUQgYnl0ZXMKKyovCitpbnQgcHR0X3NvY2tfYWN0aXZhdGVfc3ZjKHZvaWQgKnBBZGFwdGVyKTsKK2ludCBwdHRfc29ja19zZW5kX21zZ190b19hcHAodEFuaUhkciAqd21zZywgaW50IHJhZGlvLCBpbnQgc3JjX21vZCwgaW50IHBpZCk7CisKKy8qCisgKiBGb3JtYXQgb2YgbWVzc2FnZSBleGNoYW5nZWQgYmV0d2VlbiB0aGUgUFRUIFNvY2tldCBBcHAgaW4gdXNlcnNwYWNlIGFuZCB0aGUKKyAqIFdMQU4gRHJpdmVyLCBpbiBlaXRoZXIgZGlyZWN0aW9uLiBFYWNoIG1zZyB3aWxsIGJlZ2luIHdpdGggdGhpcyBoZWFkZXIgYW5kCisgKiB3aWxsIGZvbGxvd2VkIGJ5IHRoZSBRdWFya3kgbWVzc2FnZQorICovCit0eXBlZGVmIHN0cnVjdCBzQW5pTmxNc2cgeworICAgIHN0cnVjdCAgbmxtc2doZHIgbmxoOyAgICAgICAgICAgICAvLyBOZXRsaW5rIEhlYWRlcgorICAgIGludCByYWRpbzsgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bml0IG51bWJlciBvZiB0aGUgcmFkaW8KKyAgICB0QW5pSGRyIHdtc2c7ICAgICAgICAgICAgICAgICAgICAgLy8gQWlyZ28gTWVzc2FnZSBIZWFkZXIKK30gdEFuaU5sSGRyOwordHlwZWRlZiBzdHJ1Y3Qgc0FuaUFwcFJlZ1JlcSB7CisgICAgdEFuaU5sTW9kVHlwZXMgdHlwZTsgICAgICAgICAgICAgIC8vIG1vZHVsZSBpZAorICAgIGludCBwaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGlkCit9IHRBbmlObEFwcFJlZ1JlcTsKK3R5cGVkZWYgc3RydWN0IHNBbmlObEFwcFJlZ1JzcCB7CisgICAgc3RydWN0IG5sbXNnaGRyIG5saDsgICAgICAgICAgICAgIC8vIE5ldExpbmsgTXNnIEhlYWRlcgorICAgIGludCByYWRpbzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYWRpbyB1bml0CisgICAgdEFuaUhkciB3bmlIZHI7ICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyaWMgV05JIG1zZyBoZWFkZXIKKyAgICB0QW5pTmxBcHBSZWdSZXEgcmVnUmVxOyAgICAgICAgICAgLy8gVGhlIG9yaWdpbmFsIHJlcXVlc3QgbXNnCisgICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBjb2RlCit9IHRBbmlObEFwcFJlZ1JzcDsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9TVkMvc3JjL2J0Yy93bGFuX2J0Y19zdmMuYyBiL0NPUkUvU1ZDL3NyYy9idGMvd2xhbl9idGNfc3ZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0M2ZhYgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1ZDL3NyYy9idGMvd2xhbl9idGNfc3ZjLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3bGFuX2J0Y19zdmMuYworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8d2xhbl9ubGlua19zcnYuaD4KKyNpbmNsdWRlIDx3bGFuX2J0Y19zdmMuaD4KKyNpbmNsdWRlIDxoYWxUeXBlcy5oPgorI2luY2x1ZGUgPHZvc19zdGF0dXMuaD4KKyNpbmNsdWRlIDxidGNBcGkuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHZvc190cmFjZS5oPgorLy8gR2xvYmFsIHZhcmlhYmxlcworc3RhdGljIHN0cnVjdCBoZGRfY29udGV4dF9zICpwSGRkQ3R4ID0gTlVMTDsKKworc3RhdGljIGludCBnV2lGaUNoYW5uZWwgPSAwOyAgLyogV2lGaSBhc3NvY2lhdGVkIGNoYW5uZWwgMS0xMywgb3IgMCAobm9uZSkgKi8KK3N0YXRpYyBpbnQgZ0FtcENoYW5uZWwgPSAwOyAgIC8qIEFNUCBhc3NvY2lhdGVkIGNoYW5uZWwgMS0xMywgb3IgMCAobm9uZSkgKi8KK3N0YXRpYyBpbnQgZ0J0Y0RyaXZlck1vZGUgPSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OOyAgLyogRHJpdmVyIG1vZGUgaW4gQlRDICovCisKKworLy8gRm9yd2FyZCBkZWNscmFyaW9uCitzdGF0aWMgaW50IGJ0Y19tc2dfY2FsbGJhY2sgKHN0cnVjdCBza19idWZmICogc2tiKTsKKy8qCisgKiBTZW5kIGEgbmV0bGluayBtZXNzYWdlIHRvIHRoZSB1c2VyIHNwYWNlLiAKKyAqIERlc3RpbmF0aW9uIHBpZCBhcyB6ZXJvIGltcGxpZXMgYnJvYWRjYXN0CisgKi8KK3ZvaWQgc2VuZF9idGNfbmxpbmtfbXNnIChpbnQgdHlwZSwgaW50IGRlc3RfcGlkKQoreworICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgIHN0cnVjdCBubG1zZ2hkciAqbmxoOworICAgdEFuaU1zZ0hkciAqYW5pSGRyOworICAgdFdsYW5Bc3NvY0RhdGEgKmFzc29jRGF0YTsKKyAgIHNrYiA9IGFsbG9jX3NrYihOTE1TR19TUEFDRShXTEFOX05MX01BWF9QQVlMT0FEKSwgR0ZQX0tFUk5FTCk7CisgICBpZihza2IgPT0gTlVMTCkgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIkJUQzogYWxsb2Nfc2tiIGZhaWxlZFxuIik7CisgICAgICByZXR1cm47CisgICB9ICAgCisgICBubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworICAgbmxoLT5ubG1zZ19waWQgPSAwOyAgLyogZnJvbSBrZXJuZWwgKi8KKyAgIG5saC0+bmxtc2dfZmxhZ3MgPSAwOworICAgbmxoLT5ubG1zZ19zZXEgPSAwOworICAgbmxoLT5ubG1zZ190eXBlID0gV0xBTl9OTF9NU0dfQlRDOworICAgYW5pSGRyID0gTkxNU0dfREFUQShubGgpOworICAgYW5pSGRyLT50eXBlID0gdHlwZTsKKworICAvKiBTZXQgQlRDIGRyaXZlciBtb2RlIGNvcnJlY3RseSBiYXNlZCBvbiByZWNlaXZlZCBldmVudHMgdHlwZSAqLworICBpZih0eXBlID09IFdMQU5fQlRDX1NPRlRBUF9CU1NfU1RBUlQpCisgIHsKKyAgICAgLyogRXZlbnQgaXMgU29mdEFQIEJTUyBTdGFydCBzZXQgQlRDIGRyaXZlciBtb2RlIHRvIFNvZnRBUCAqLworICAgICBnQnRjRHJpdmVyTW9kZSA9IFdMQU5fSEREX1NPRlRBUDsKKyAgfQorICBpZih0eXBlID09IFdMQU5fU1RBX0FTU09DX0RPTkVfSU5EKQorICB7CisgICAgIC8qIEV2ZW50IGlzIFNUQSBBc3NvYyBkb25lIHNldCBCVEMgZHJpdmVyIG1vZGUgdG8gSU5GUkEgU1RBKi8KKyAgICAgZ0J0Y0RyaXZlck1vZGUgPSBXTEFOX0hERF9JTkZSQV9TVEFUSU9OOworICB9CisKKyAgIHN3aXRjaCggdHlwZSApCisgICB7CisgICAgICBjYXNlIFdMQU5fU1RBX0RJU0FTU09DX0RPTkVfSU5EOgorICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgICAgICAiV2lGaSB1bmFzc29jaWF0ZWQ7IGdBbXBDaGFubmVsICVkIGdXaUZpQ2hhbm5lbCAlZCIsIGdBbXBDaGFubmVsLCBnV2lGaUNoYW5uZWwpOworCisgICAgICAgICAvKiBJZiBBTVAgaXMgdXNpbmcgYSBjaGFubmVsIChub24temVybyksIG5vIG1lc3NhZ2Ugc2VudC4KKyAgICAgICAgICAgIE9yLCBpZiBXaUZpIHdhc24ndCB1c2luZyBhIGNoYW5uZWwgYmVmb3JlLCBubyBtZXNzYWdlIHNlbnQuCisgICAgICAgICAgICBMb2dpYyBwcmVzdW1lcyBzYW1lIGNoYW5uZWwgaGFzIHRvIGJlIHVzZWQgZm9yIFdpRmkgYW5kIEFNUCBpZiBib3RoIGFyZSBhY3RpdmUuCisgICAgICAgICAgICBJbiBhbnkgY2FzZSwgdHJhY2sgdGhlIFdpRmkgY2hhbm5lbCBpbiB1c2UgKG5vbmUpICovCisgICAgICAgICBpZigoZ0FtcENoYW5uZWwgIT0gMCkgfHwgKGdXaUZpQ2hhbm5lbCA9PSAwKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgICAgICAgICJObyBtc2cgZm9yIEFGSCB3aWxsIGJlIHNlbnQiKTsKKyAgICAgICAgICAgIGdXaUZpQ2hhbm5lbCA9IDA7CisgICAgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyAgICAgICAgIGdXaUZpQ2hhbm5lbCA9IDA7CisKKyAgICAgICAgIC8qIE5vIEJyZWFrOiBGYWxsIGludG8gbmV4dCBjYXNlcyAqLworCisgICAgICBjYXNlIFdMQU5fTU9EVUxFX1VQX0lORDoKKyAgICAgIGNhc2UgV0xBTl9NT0RVTEVfRE9XTl9JTkQ6CisgICAgICAgICBhbmlIZHItPmxlbmd0aCA9IDA7IAorICAgICAgICAgbmxoLT5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoKHNpemVvZih0QW5pTXNnSGRyKSkpOworICAgICAgICAgc2tiX3B1dChza2IsIE5MTVNHX1NQQUNFKHNpemVvZih0QW5pTXNnSGRyKSkpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdMQU5fQlRDX1NPRlRBUF9CU1NfU1RBUlQ6CisgICAgICBjYXNlIFdMQU5fQlRDX1FVRVJZX1NUQVRFX1JTUDoKKyAgICAgIGNhc2UgV0xBTl9TVEFfQVNTT0NfRE9ORV9JTkQ6CisgICAgICAgICBhbmlIZHItPmxlbmd0aCA9IHNpemVvZih0V2xhbkFzc29jRGF0YSk7CisgICAgICAgICBubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSCgoc2l6ZW9mKHRBbmlNc2dIZHIpICsgc2l6ZW9mKHRXbGFuQXNzb2NEYXRhKSkpOworICAgICAgICAgYXNzb2NEYXRhID0gKCB0V2xhbkFzc29jRGF0YSAqKSgoY2hhciopYW5pSGRyICsgc2l6ZW9mKHRBbmlNc2dIZHIpKTsKKyAgICAgICAgIAorICAgICAgICAgYXNzb2NEYXRhLT5jaGFubmVsID0gaGRkX2dldF9vcGVyYXRpbmdfY2hhbm5lbCggcEhkZEN0eCwgZ0J0Y0RyaXZlck1vZGUgKTsKKworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgICAgICAiTmV3IFdpRmkgY2hhbm5lbCAlZCBnQW1wQ2hhbm5lbCAlZCBnV2lGaUNoYW5uZWwgJWQiLAorICAgICAgICAgICAgICAgICAgICBhc3NvY0RhdGEtPmNoYW5uZWwsIGdBbXBDaGFubmVsLCBnV2lGaUNoYW5uZWwpOworCisgICAgICAgICAvKiBJZiBXaUZpIGhhcyBmaW5pc2hlZCBhc3NvY2lhdGluZyAqLworICAgICAgICAgaWYodHlwZSA9PSBXTEFOX1NUQV9BU1NPQ19ET05FX0lORCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgLyogSWYgQU1QIGlzIHVzaW5nIGEgY2hhbm5lbCAobm9uLXplcm8pLCBubyBtZXNzYWdlIHNlbnQuCisgICAgICAgICAgICAgIE9yLCBpZiB0aGUgV2lGaSBjaGFubmVsIGRpZCBub3QgY2hhbmdlLCBubyBtZXNzYWdlIHNlbnQuCisgICAgICAgICAgICAgIExvZ2ljIHByZXN1bWVzIHNhbWUgY2hhbm5lbCBoYXMgdG8gYmUgdXNlZCBmb3IgV2lGaSBhbmQgQU1QIGlmIGJvdGggYXJlIGFjdGl2ZS4KKyAgICAgICAgICAgICAgSW4gYW55IGNhc2UsIHRyYWNrIHRoZSBXaUZpIGNoYW5uZWwgaW4gdXNlICgxLTEzIG9yIG5vbmUsIGluIGFzc29jRGF0YS0+Y2hhbm5lbCkgKi8KKyAgICAgICAgICAgaWYoKGdBbXBDaGFubmVsICE9IDApIHx8IChhc3NvY0RhdGEtPmNoYW5uZWwgPT0gZ1dpRmlDaGFubmVsKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICJObyBtc2cgZm9yIEFGSCB3aWxsIGJlIHNlbnQiKTsKKyAgICAgICAgICAgICBnV2lGaUNoYW5uZWwgPSBhc3NvY0RhdGEtPmNoYW5uZWw7CisgICAgICAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBpZih0eXBlID09IFdMQU5fQlRDX1NPRlRBUF9CU1NfU1RBUlQpCisgICAgICAgICB7CisgICAgICAgICAgICAgLypSZXBsYWNlIFdMQU5fQlRDX1NPRlRBUF9CU1NfU1RBUlQgYnkgV0xBTl9TVEFfQVNTT0NfRE9ORV9JTkQqLworICAgICAgICAgICAgIGFuaUhkci0+dHlwZSA9IFdMQU5fU1RBX0FTU09DX0RPTkVfSU5EOworICAgICAgICAgfQorICAgICAgICAgZ1dpRmlDaGFubmVsID0gYXNzb2NEYXRhLT5jaGFubmVsOworICAgICAgICAgc2tiX3B1dChza2IsIE5MTVNHX1NQQUNFKChzaXplb2YodEFuaU1zZ0hkcikrIHNpemVvZih0V2xhbkFzc29jRGF0YSkpKSk7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBXTEFOX0FNUF9BU1NPQ19ET05FX0lORDoKKworICAgICAgICAgLyogVGhpcyBpcyBhbiBvdmVybG9hZGVkIHR5cGUuIEl0IG1lYW5zIHRoYXQgQU1QIGlzIGNvbm5lY3RlZCAoZGVzdF9waWQgaXMgY2hhbm5lbCAxLTEzKSwKKyAgICAgICAgICAgIG9yIGl0IG1lYW5zIEFNUCBpcyBub3cgZGlzY29ubmVjdGVkIChkZXN0X3BpZCBpcyAwKSAqLworCisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgICAgICJOZXcgQU1QIGNoYW5uZWwgJWQgZ0FtcENoYW5uZWwgJWQgZ1dpRmlDaGFubmVsICVkIiwgZGVzdF9waWQsIGdBbXBDaGFubmVsLCBnV2lGaUNoYW5uZWwpOworICAgICAgICAgLyogSWYgV2lGaSBpcyB1c2luZyBhIGNoYW5uZWwgKG5vbi16ZXJvKSwgbm8gbWVzc2FnZSBzZW50LgorICAgICAgICAgICAgT3IsIGlmIHRoZSBBTVAgY2hhbm5lbCBkaWQgbm90IGNoYW5nZSwgbm8gbWVzc2FnZSBzZW50LgorICAgICAgICAgICAgTG9naWMgcHJlc3VtZXMgc2FtZSBjaGFubmVsIGhhcyB0byBiZSB1c2VkIGZvciBXaUZpIGFuZCBBTVAgaWYgYm90aCBhcmUgYWN0aXZlLgorICAgICAgICAgICAgSW4gYW55IGNhc2UsIHRyYWNrIHRoZSBBTVAgY2hhbm5lbCBpbiB1c2UgKDEtMTMgb3Igbm9uZSwgaW4gZGVzdF9waWQpICovCisgICAgICAgICBpZigoZ1dpRmlDaGFubmVsICE9IDApIHx8IChkZXN0X3BpZCA9PSBnQW1wQ2hhbm5lbCkpCisgICAgICAgICB7CisgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICAgICAiTm8gbXNnIGZvciBBRkggd2lsbCBiZSBzZW50Iik7CisgICAgICAgICAgICBnQW1wQ2hhbm5lbCA9IGRlc3RfcGlkOworICAgICAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisKKyAgICAgICAgIGdBbXBDaGFubmVsID0gZGVzdF9waWQ7CisKKyAgICAgICAgIC8qIEZpeCBvdmVybG9hZGVkIHBhcmFtZXRlcnMgYW5kIGZpbmlzaCBtZXNzYWdlIGZvcm1hdHRpbmcgKi8KKyAgICAgICAgIGlmKGRlc3RfcGlkICE9IDApCisgICAgICAgICB7CisgICAgICAgICAgIGFuaUhkci0+dHlwZSA9IFdMQU5fU1RBX0FTU09DX0RPTkVfSU5EOworICAgICAgICAgICBhbmlIZHItPmxlbmd0aCA9IHNpemVvZih0V2xhbkFzc29jRGF0YSk7CisgICAgICAgICAgIG5saC0+bmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKChzaXplb2YodEFuaU1zZ0hkcikgKyBzaXplb2YodFdsYW5Bc3NvY0RhdGEpKSk7CisgICAgICAgICAgIGFzc29jRGF0YSA9ICggdFdsYW5Bc3NvY0RhdGEgKikoKGNoYXIqKWFuaUhkciArIHNpemVvZih0QW5pTXNnSGRyKSk7CisgICAgICAgICAgIGFzc29jRGF0YS0+Y2hhbm5lbCA9IGRlc3RfcGlkOworICAgICAgICAgICBza2JfcHV0KHNrYiwgTkxNU0dfU1BBQ0UoKHNpemVvZih0QW5pTXNnSGRyKSsgc2l6ZW9mKHRXbGFuQXNzb2NEYXRhKSkpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgYW5pSGRyLT50eXBlID0gV0xBTl9TVEFfRElTQVNTT0NfRE9ORV9JTkQ7CisgICAgICAgICAgIGFuaUhkci0+bGVuZ3RoID0gMDsKKyAgICAgICAgICAgbmxoLT5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoKHNpemVvZih0QW5pTXNnSGRyKSkpOworICAgICAgICAgICBza2JfcHV0KHNrYiwgTkxNU0dfU1BBQ0Uoc2l6ZW9mKHRBbmlNc2dIZHIpKSk7CisgICAgICAgICB9CisgICAgICAgICBkZXN0X3BpZCA9IDA7CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiQlRDOiBBdHRlbXB0IHRvIHNlbmQgdW5rbm93biBubGluayBtZXNzYWdlICVkXG4iLCB0eXBlKTsKKyAgICAgICAgIHJldHVybjsKKyAgIH0KKyAgIGlmKGRlc3RfcGlkID09IDApCisgICAgICAodm9pZClubF9zcnZfYmNhc3Qoc2tiKTsKKyAgIGVsc2UKKyAgICAgICh2b2lkKW5sX3Nydl91Y2FzdChza2IsIGRlc3RfcGlkKTsKK30KKy8qCisgKiBBY3RpdmF0ZSBCVEMgaGFuZGxlci4gVGhpcyB3aWxsIHJlZ2lzdGVyIGEgaGFuZGxlciB0byByZWNlaXZlCisgKiBuZXRsaW5rIG1lc3NhZ2VzIGFkZHJlc3NlZCB0byBXTEFOX05MX01TR19CVEMgZnJvbSB1c2VyIHNwYWNlCisgKi8KK2ludCBidGNfYWN0aXZhdGVfc2VydmljZSh2b2lkICpwQWRhcHRlcikKK3sKKyAgIHBIZGRDdHggPSAoc3RydWN0IGhkZF9jb250ZXh0X3MqKXBBZGFwdGVyOyAgCisKKyAgIC8vUmVnaXN0ZXIgdGhlIG1zZyBoYW5kbGVyIGZvciBtc2dzIGFkZHJlc3NlZCB0byBBTklfTkxfTVNHX0JUQworICAgbmxfc3J2X3JlZ2lzdGVyKFdMQU5fTkxfTVNHX0JUQywgYnRjX21zZ19jYWxsYmFjayk7CisgICByZXR1cm4gMDsKK30KKy8qCisgKiBDYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIGJ5IE5ldGxpbmsgc2VydmljZSBmb3IgYWxsIG5ldGxpbmsKKyAqIG1lc3NhZ2VzIChmcm9tIHVzZXIgc3BhY2UpIGFkZHJlc3NlZCB0byBXTEFOX05MX01TR19CVEMKKyAqLworaW50IGJ0Y19tc2dfY2FsbGJhY2sgKHN0cnVjdCBza19idWZmICogc2tiKQoreworICAgc3RydWN0IG5sbXNnaGRyICpubGg7CisgICB0QW5pTXNnSGRyICptc2dfaGRyOworICAgdFNtZUJ0RXZlbnQgKmJ0RXZlbnQgPSBOVUxMOworICAgbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKyAgIG1zZ19oZHIgPSBOTE1TR19EQVRBKG5saCk7CisgICAKKyAgIC8qIENvbnRpbnVlIHdpdGggcGFyc2luZyBwYXlsb2FkLiAqLworICAgc3dpdGNoKG1zZ19oZHItPnR5cGUpCisgICB7CisgICAgICBjYXNlIFdMQU5fQlRDX1FVRVJZX1NUQVRFX1JFUToKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICJCVEM6IFJlY2VpdmVkIHByb2JlIGZyb20gQlRDIFNlcnZpY2VcbiIpOworICAgICAgICAgc2VuZF9idGNfbmxpbmtfbXNnKFdMQU5fQlRDX1FVRVJZX1NUQVRFX1JTUCwgbmxoLT5ubG1zZ19waWQpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdMQU5fQlRDX0JUX0VWRU5UX0lORDoKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICJCVEM6IFJlY2VpdmVkIEJsdWV0b290aCBldmVudCBpbmRpY2F0aW9uXG4iKTsKKyAgICAgICAgIGlmKG1zZ19oZHItPmxlbmd0aCAhPSBzaXplb2YodFNtZUJ0RXZlbnQpKSB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiQlRDOiBTaXplIG1pc21hdGNoIGluIEJUIGV2ZW50IGRhdGFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBidEV2ZW50ID0gKHRTbWVCdEV2ZW50KikoKGNoYXIqKW1zZ19oZHIgKyBzaXplb2YodEFuaU1zZ0hkcikpOworICAgICAgICAgKHZvaWQpc21lX0J0Y1NpZ25hbEJ0RXZlbnQocEhkZEN0eC0+aEhhbCwgYnRFdmVudCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiQlRDOiBSZWNlaXZlZCBJbnZhbGlkIE1zZyB0eXBlIFslZF1cbiIsIG1zZ19oZHItPnR5cGUpOworICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL0NPUkUvU1ZDL3NyYy9ubGluay93bGFuX25saW5rX3Nydi5jIGIvQ09SRS9TVkMvc3JjL25saW5rL3dsYW5fbmxpbmtfc3J2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5NTFmMgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1ZDL3NyYy9ubGluay93bGFuX25saW5rX3Nydi5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB3bGFuX25saW5rX3Nydi5jCisqCisqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIHdsYW5fbmxpbmtfc3J2CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPHdsYW5fbmxpbmtfc3J2Lmg+CisjaW5jbHVkZSA8dm9zX3RyYWNlLmg+CisKKy8vR2xvYmFsIHZhcmlhYmxlcworc3RhdGljIERFRklORV9NVVRFWChubF9zcnZfc2VtKTsKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqbmxfc3J2X3NvY2sgPSBOVUxMOworc3RhdGljIG5sX3Nydl9tc2dfY2FsbGJhY2sgbmxfc3J2X21zZ19oYW5kbGVyW05MSU5LX01BWF9DQUxMQkFDS1NdOworCisvL0ZvcndhcmQgZGVjbGFyYXRpb24KK3N0YXRpYyB2b2lkIG5sX3Nydl9yY3YgKHN0cnVjdCBza19idWZmICpzayk7CitzdGF0aWMgdm9pZCBubF9zcnZfcmN2X3NrYiAoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBubF9zcnZfcmN2X21zZyAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpOworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgbmV0bGluayBzZXJ2aWNlLgorICogTmV0bGluayBzZXJ2aWNlIGlzIHVzYWJsZSBhZnRlciB0aGlzLgorICovCitpbnQgbmxfc3J2X2luaXQodm9pZCkKK3sKKyAgIGludCByZXRjb2RlID0gMDsKKyAgIG5sX3Nydl9zb2NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKCZpbml0X25ldCwgV0xBTl9OTElOS19QUk9UT19GQU1JTFksCisgICAgICBXTEFOX05MSU5LX01DQVNUX0dSUF9JRCwgbmxfc3J2X3JjdiwgTlVMTCwgVEhJU19NT0RVTEUpOworCisgICBpZiAobmxfc3J2X3NvY2sgIT0gTlVMTCkgeworICAgICAgbWVtc2V0KG5sX3Nydl9tc2dfaGFuZGxlciwgMCwgc2l6ZW9mKG5sX3Nydl9tc2dfaGFuZGxlcikpOworICAgfSBlbHNlIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJOTElOSzogbmV0bGlua19rZXJuZWxfY3JlYXRlIGZhaWxlZCIpOworICAgICAgcmV0Y29kZSA9IC1FQ09OTlJFRlVTRUQ7CisgICB9CisgICByZXR1cm4gcmV0Y29kZTsKK30KKworLyoKKyAqIERlaW5pdCB0aGUgbmV0bGluayBzZXJ2aWNlLgorICogTmV0bGluayBzZXJ2aWNlIGlzIHVudXNhYmxlIGFmdGVyIHRoaXMuCisgKi8KK3ZvaWQgbmxfc3J2X2V4aXQodm9pZCkKK3sKKyAgIG5ldGxpbmtfa2VybmVsX3JlbGVhc2Uobmxfc3J2X3NvY2spOworfQorCisvKgorICogUmVnaXN0ZXIgYSBtZXNzYWdlIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWVkIG1vZHVsZS4KKyAqIEVhY2ggbW9kdWxlIChlLmcuIFdMQU5fTkxfTVNHX0JUQyApd2lsbCByZWdpc3RlciBhCisgKiBoYW5kbGVyIHRvIGhhbmRsZSBtZXNzYWdlcyBhZGRyZXNzZWQgdG8gaXQuCisgKi8KK2ludCBubF9zcnZfcmVnaXN0ZXIodFdsYW5ObE1vZFR5cGVzIG1zZ190eXBlLCBubF9zcnZfbXNnX2NhbGxiYWNrIG1zZ19oYW5kbGVyKQoreworICAgaW50IHJldGNvZGUgPSAwOworCisgICBpZiAoKG1zZ190eXBlID49IFdMQU5fTkxfTVNHX0JBU0UpICYmIChtc2dfdHlwZSA8IFdMQU5fTkxfTVNHX01BWCkgJiYKKyAgICAgICAgbXNnX2hhbmRsZXIgIT0gTlVMTCkKKyAgIHsKKyAgICAgIG5sX3Nydl9tc2dfaGFuZGxlclttc2dfdHlwZSAtIFdMQU5fTkxfTVNHX0JBU0VdID0gbXNnX2hhbmRsZXI7CisgICB9CisgICBlbHNlIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgIk5MSU5LOiBubF9zcnZfcmVnaXN0ZXIgZmFpbGVkIGZvciBtc2dfdHlwZSAlZCIsIG1zZ190eXBlKTsKKyAgICAgIHJldGNvZGUgPSAtRUlOVkFMOworICAgfQorCisgICByZXR1cm4gcmV0Y29kZTsKK30KKy8qCisgKiBVbnJlZ2lzdGVyIHRoZSBtZXNzYWdlIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWVkIG1vZHVsZS4KKyAqLworaW50IG5sX3Nydl91bnJlZ2lzdGVyKHRXbGFuTmxNb2RUeXBlcyBtc2dfdHlwZSwgbmxfc3J2X21zZ19jYWxsYmFjayBtc2dfaGFuZGxlcikKK3sKKyAgIGludCByZXRjb2RlID0gMDsKKworICAgaWYgKChtc2dfdHlwZSA+PSBXTEFOX05MX01TR19CQVNFKSAmJiAobXNnX3R5cGUgPCBXTEFOX05MX01TR19NQVgpICYmCisgICAgICAgKG5sX3Nydl9tc2dfaGFuZGxlclttc2dfdHlwZSAtIFdMQU5fTkxfTVNHX0JBU0VdID09IG1zZ19oYW5kbGVyKSkKKyAgIHsKKyAgICAgIG5sX3Nydl9tc2dfaGFuZGxlclttc2dfdHlwZSAtIFdMQU5fTkxfTVNHX0JBU0VdID0gTlVMTDsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgIk5MSU5LOiBubF9zcnZfdW5yZWdpc3RlciBmYWlsZWQgZm9yIG1zZ190eXBlICVkIiwgbXNnX3R5cGUpOworICAgICAgcmV0Y29kZSA9IC1FSU5WQUw7CisgICB9CisKKyAgIHJldHVybiByZXRjb2RlOworfQorCisvKgorICogVW5pY2FzdCB0aGUgbWVzc2FnZSB0byB0aGUgcHJvY2VzcyBpbiB1c2VyIHNwYWNlIGlkZW50ZmllZAorICogYnkgdGhlIGRzdC1waWQKKyAqLworaW50IG5sX3Nydl91Y2FzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZHN0X3BpZCkKK3sKKyAgIGludCBlcnI7CisKKyAgIE5FVExJTktfQ0Ioc2tiKS5waWQgPSAwOyAvL3NlbmRlcidzIHBpZAorICAgTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IDA7IC8vbm90IG11bHRpY2FzdAorCisgICBlcnIgPSBuZXRsaW5rX3VuaWNhc3Qobmxfc3J2X3NvY2ssIHNrYiwgZHN0X3BpZCwgTVNHX0RPTlRXQUlUKTsKKworICAgaWYgKGVyciA8IDApCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICJOTElOSzogbmV0bGlua191bmljYXN0IHRvIHBpZFslZF0gZmFpbGVkLCByZXRbMHglWF0iLCBkc3RfcGlkLCBlcnIpOworCisgICByZXR1cm4gZXJyOworfQorCisvKgorICogIEJyb2FkY2FzdCB0aGUgbWVzc2FnZS4gQnJvYWRjYXN0IHdpbGwgcmV0dXJuIGFuIGVycm9yIGlmCisgKiAgdGhlcmUgYXJlIG5vIGxpc3RlbmVycworICovCitpbnQgbmxfc3J2X2JjYXN0KHN0cnVjdCBza19idWZmICpza2IpCit7CisgICBpbnQgZXJyOworCisgICBORVRMSU5LX0NCKHNrYikucGlkID0gMDsgLy9zZW5kZXIncyBwaWQKKyAgIE5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXAgPSBXTEFOX05MSU5LX01DQVNUX0dSUF9JRDsgLy9kZXN0aW5hdGlvbiBncm91cAorCisgICBlcnIgPSBuZXRsaW5rX2Jyb2FkY2FzdChubF9zcnZfc29jaywgc2tiLCAwLCBXTEFOX05MSU5LX01DQVNUX0dSUF9JRCwgR0ZQX0tFUk5FTCk7CisKKyAgIGlmIChlcnIgPCAwKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAiTkxJTks6IG5ldGxpbmtfYnJvYWRjYXN0IGZhaWxlZCBlcnIgPSAlZCIsIGVycik7CisgICB9CisgICByZXR1cm4gZXJyOworfQorCisvKgorICogIFByb2Nlc3NlcyB0aGUgTmV0bGluayBzb2NrZXQgaW5wdXQgcXVldWUuCisgKiAgRGVxdWV1ZSBza2IncyBmcm9tIHRoZSBzb2NrZXQgaW5wdXQgcXVldWUgYW5kIHByb2Nlc3MKKyAqICBhbGwgdGhlIG5ldGxpbmsgbWVzc2FnZXMgaW4gdGhhdCBza2IsIGJlZm9yZSBtb3ZpbmcKKyAqICB0byB0aGUgbmV4dCBza2IuCisgKi8KK3N0YXRpYyB2b2lkIG5sX3Nydl9yY3YgKHN0cnVjdCBza19idWZmICpzaykKK3sKKyAgIG11dGV4X2xvY2soJm5sX3Nydl9zZW0pOworICAgbmxfc3J2X3Jjdl9za2Ioc2spOworICAgbXV0ZXhfdW5sb2NrKCZubF9zcnZfc2VtKTsKK30KKworLyoKKyAqIEVhY2ggc2tiIGNvdWxkIGNvbnRhaW4gbXVsdGlwbGUgTmV0bGluayBtZXNzYWdlcy4gUHJvY2VzcyBhbGwgdGhlCisgKiBtZXNzYWdlcyBpbiBvbmUgc2tiIGFuZCBkaXNjYXJkIG1hbGZvcm1lZCBza2IncyBzaWxlbnRseS4KKyAqLworc3RhdGljIHZvaWQgbmxfc3J2X3Jjdl9za2IgKHN0cnVjdCBza19idWZmICpza2IpCit7CisgICBzdHJ1Y3Qgbmxtc2doZHIgKiBubGg7CisKKyAgIHdoaWxlIChza2ItPmxlbiA+PSBOTE1TR19TUEFDRSgwKSkgeworICAgICAgdTMyIHJsZW47CisKKyAgICAgIG5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisKKyAgICAgIGlmIChubGgtPm5sbXNnX2xlbiA8IHNpemVvZigqbmxoKSB8fCBza2ItPmxlbiA8IG5saC0+bmxtc2dfbGVuKSB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIk5MSU5LOiBJbnZhbGlkICIKKyAgICAgICAgICAgICJOZXRsaW5rIG1lc3NhZ2U6IHNrYlsweCVYXSwgbGVuWyVkXSwgbmxoZHJbMHglWF0sIG5sbXNnX2xlblslZF0iLAorICAgICAgICAgICAgKHUzMilza2IsIHNrYi0+bGVuLCAodTMyKW5saCwgbmxoLT5ubG1zZ19sZW4pOworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBybGVuID0gTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pOworICAgICAgaWYgKHJsZW4gPiBza2ItPmxlbikKKyAgICAgICAgIHJsZW4gPSBza2ItPmxlbjsKKyAgICAgIG5sX3Nydl9yY3ZfbXNnKHNrYiwgbmxoKTsKKyAgICAgIHNrYl9wdWxsKHNrYiwgcmxlbik7CisgICB9Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgbmV0bGluayBtZXNzYWdlLgorICogRWFjaCBuZXRsaW5rIG1lc3NhZ2Ugd2lsbCBoYXZlIGEgbWVzc2FnZSBvZiB0eXBlIHRBbmlNc2dIZHIgaW5zaWRlLgorICovCitzdGF0aWMgdm9pZCBubF9zcnZfcmN2X21zZyAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpCit7CisgICBpbnQgdHlwZTsKKworICAgLyogT25seSByZXF1ZXN0cyBhcmUgaGFuZGxlZCBieSBrZXJuZWwgbm93ICovCisgICBpZiAoIShubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfUkVRVUVTVCkpIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgIk5MSU5LOiBSZWNlaXZlZCBJbnZhbGlkIE5MIFJlcSB0eXBlIFsleF0iLCBubGgtPm5sbXNnX2ZsYWdzKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgdHlwZSA9IG5saC0+bmxtc2dfdHlwZTsKKworICAgLyogVW5rbm93biBtZXNzYWdlICovCisgICBpZiAodHlwZSA8IFdMQU5fTkxfTVNHX0JBU0UgfHwgdHlwZSA+PSBXTEFOX05MX01TR19NQVgpIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgIk5MSU5LOiBSZWNlaXZlZCBJbnZhbGlkIE5MIE1zZyB0eXBlIFsleF0iLCB0eXBlKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyoKKyAgICogQWxsIHRoZSBtZXNzYWdlcyBtdXN0IGF0IGxlYXN0IGNhcnJ5IHRoZSB0QW5pTXNnSGRyCisgICAqIERyb3AgYW55IG1lc3NhZ2Ugd2l0aCBpbnZhbGlkIGxlbmd0aAorICAgKi8KKyAgIGlmIChubGgtPm5sbXNnX2xlbiA8IE5MTVNHX0xFTkdUSChzaXplb2YodEFuaU1zZ0hkcikpKSB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICJOTElOSzogUmVjZWl2ZWQgTkwgTXNnIHdpdGggaW52YWxpZCBsZW5bJXhdIiwgbmxoLT5ubG1zZ19sZW4pOworICAgICAgcmV0dXJuOworICAgfQorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICJOTElOSzogUmVjZWl2ZWQgTkwgbXNnIHR5cGUgWyVkXSIsIHR5cGUpOworCisgICAvLyB0dXJuIHR5cGUgaW50byBkaXNwYXRjaCB0YWJsZSBvZmZzZXQKKyAgIHR5cGUgLT0gV0xBTl9OTF9NU0dfQkFTRTsKKworICAgLy8gZGlzcGF0Y2ggdG8gaGFuZGxlcgorICAgaWYgKG5sX3Nydl9tc2dfaGFuZGxlclt0eXBlXSAhPSBOVUxMKSB7CisgICAgICAobmxfc3J2X21zZ19oYW5kbGVyW3R5cGVdKShza2IpOworICAgfSBlbHNlIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IREQsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgIk5MSU5LOiBObyBoYW5kbGVyIGZvciBOZXRsaW5rIE1zZyBbMHglWF0iLCB0eXBlKTsKKyAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvQ09SRS9TVkMvc3JjL3B0dC93bGFuX3B0dF9zb2NrX3N2Yy5jIGIvQ09SRS9TVkMvc3JjL3B0dC93bGFuX3B0dF9zb2NrX3N2Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2M2Q0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NWQy9zcmMvcHR0L3dsYW5fcHR0X3NvY2tfc3ZjLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3bGFuX3B0dF9zb2NrX3N2Yy5jCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBQVFRfU09DS19TVkNfRU5BQkxFCisjaW5jbHVkZSA8d2xhbl9ubGlua19zcnYuaD4KKyNpbmNsdWRlIDxoYWxUeXBlcy5oPgorI2luY2x1ZGUgPHZvc19zdGF0dXMuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9pbmNsdWRlcy5oPgorI2luY2x1ZGUgPHZvc190cmFjZS5oPgorI2luY2x1ZGUgPHdsYW5fbmxpbmtfY29tbW9uLmg+CisjaW5jbHVkZSA8d2xhbl9wdHRfc29ja19zdmMuaD4KKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKyNpbmNsdWRlIDx2b3NfdHJhY2UuaD4KKyNpZmRlZiBBTklfTUFORl9ESUFHCisjaW5jbHVkZSA8d2xhbl9oZGRfZnRtLmg+CisjZW5kaWYKKworI2RlZmluZSBQVFRfU09DS19ERUJVRworI2lmZGVmIFBUVF9TT0NLX0RFQlVHCisjZGVmaW5lIFBUVF9UUkFDRShsZXZlbCwgYXJncy4uLikgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERCwgbGV2ZWwsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBQVFRfVFJBQ0UobGV2ZWwsIGFyZ3MuLi4pCisjZW5kaWYKKy8vIEdsb2JhbCB2YXJpYWJsZXMKK3N0YXRpYyBzdHJ1Y3QgaGRkX2NvbnRleHRfcyAqcEFkYXB0ZXJIYW5kbGUgPSBOVUxMOworLy9VdGlsaXR5IGZ1bmN0aW9uIHRvIHBlcmZvcm0gZW5kaWFuZXNzIHN3YXAKK3N0YXRpYyB2b2lkIHB0dF9zb2NrX3N3YXBfMzIodm9pZCAqcEJ1ZmZlciwgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICB2X1UzMl90ICpwQnVmMzIsIGRhdGE7CisgICAgdl9VOF90ICpwQnVmODsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBsZW4gJj0gfihzaXplb2Yodl9VMzJfdCktMSk7CisgICAgcEJ1ZjMyID0gKHZfVTMyX3QgKikgcEJ1ZmZlcjsKKyAgICBwQnVmOCA9ICh2X1U4X3QgKikgcEJ1ZmZlcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQsICsrcEJ1ZjMyLCBwQnVmOCArPSA0KSB7CisgICAgICAgIGRhdGEgPSAqcEJ1ZjMyOworICAgICAgICBwQnVmOFswXSA9ICh2X1U4X3QpICgoZGF0YSA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgcEJ1ZjhbMV0gPSAodl9VOF90KSAoKGRhdGEgPj4gMTYpICYgMHhmZik7CisgICAgICAgIHBCdWY4WzJdID0gKHZfVThfdCkgKChkYXRhID4+IDgpICYgMHhmZik7CisgICAgICAgIHBCdWY4WzNdID0gKHZfVThfdCkgKChkYXRhID4+IDApICYgMHhmZik7CisgICAgfQorfQorI2lmZGVmIFBUVF9TT0NLX0RFQlVHX1ZFUkJPU0UKKy8vVXRpbGl0eSBmdW5jdGlvbiB0byBwZXJmb3JtIGEgaGV4IGR1bXAKK3N0YXRpYyB2b2lkIHB0dF9zb2NrX2R1bXBfYnVmKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBwYnVmLCBpbnQgY250KQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjbnQgOyBpKyspIHsKKyAgICAgICAgaWYgKChpJTE2KT09MCkKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlxuJXA6IiwgcGJ1Zik7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIiAlMDJYIiwgKnBidWYpOworICAgICAgICBwYnVmKys7CisgICAgfQorICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlxuIik7Cit9CisjZW5kaWYKKy8vVXRpbGl0eSBmdW5jdGlvbiB0byBzZW5kIGEgbmV0bGluayBtZXNzYWdlIHRvIGFuIGFwcGxpY2F0aW9uIGluIHVzZXIgc3BhY2UKK2ludCBwdHRfc29ja19zZW5kX21zZ190b19hcHAodEFuaUhkciAqd21zZywgaW50IHJhZGlvLCBpbnQgc3JjX21vZCwgaW50IHBpZCkKK3sKKyAgIGludCBlcnIgPSAtMTsKKyAgIGludCBwYXlsb2FkX2xlbjsKKyAgIGludCB0b3RfbXNnX2xlbjsKKyAgIHRBbmlObEhkciAqd25sOworICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgIHN0cnVjdCBubG1zZ2hkciAqbmxoOworICAgaW50IHdtc2dfbGVuZ3RoID0gYmUxNl90b19jcHUod21zZy0+bGVuZ3RoKTsKKyAgIHN0YXRpYyBpbnQgbmxtc2dfc2VxID0gMDsKKyAgIGlmIChyYWRpbyA8IDAgfHwgcmFkaW8gPiBBTklfTUFYX1JBRElPUykgeworICAgICAgUFRUX1RSQUNFKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBpbnZhbGlkIHJhZGlvIGlkIFslZF1cbiIsCisgICAgICAgICBfX0ZVTkNUSU9OX18sIHJhZGlvKTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKyAgIHBheWxvYWRfbGVuID0gd21zZ19sZW5ndGggKyA0OyAgLy8gNCBleHRyYSBieXRlcyBmb3IgdGhlIHJhZGlvIGlkeAorICAgdG90X21zZ19sZW4gPSBOTE1TR19TUEFDRShwYXlsb2FkX2xlbik7CisgICBpZiAoKHNrYiA9IGRldl9hbGxvY19za2IodG90X21zZ19sZW4pKSA9PSBOVUxMKSB7CisgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGRldl9hbGxvY19za2IoKSBmYWlsZWQgZm9yIG1zZyBzaXplWyVkXVxuIiwKKyAgICAgICAgIF9fRlVOQ1RJT05fXywgdG90X21zZ19sZW4pOworICAgICAgcmV0dXJuIC0xOworICAgfQorICAgbmxoID0gTkxNU0dfUFVUKHNrYiwgcGlkLCBubG1zZ19zZXErKywgc3JjX21vZCwgcGF5bG9hZF9sZW4pOworICAgbmxoLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisgICB3bmwgPSAodEFuaU5sSGRyICopIG5saDsKKyAgIHdubC0+cmFkaW8gPSByYWRpbzsKKyAgIG1lbWNweSgmd25sLT53bXNnLCB3bXNnLCB3bXNnX2xlbmd0aCk7CisgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogU2VuZGluZyBNc2cgVHlwZSBbMHglWF0gdG8gcGlkWyVkXVxuIiwKKyAgICAgIF9fRlVOQ1RJT05fXywgYmUxNl90b19jcHUod21zZy0+dHlwZSksIHBpZCk7CisjaWZkZWYgUFRUX1NPQ0tfREVCVUdfVkVSQk9TRQorICAgcHR0X3NvY2tfZHVtcF9idWYoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyNlbmRpZgorICAgZXJyID0gbmxfc3J2X3VjYXN0KHNrYiwgcGlkKTsKK25sbXNnX2ZhaWx1cmU6CisgICByZXR1cm4gZXJyOworfQorLyoKKyAqIFByb2Nlc3MgdHJlZ2lzdGVyYXRpb24gcmVxdWVzdCBhbmQgc2VuZCByZWdpc3RyYXRpb24gcmVzcG9uc2UgbWVzc2FnZXMKKyAqIHRvIHRoZSBQVFQgU29ja2V0IEFwcCBpbiB1c2VyIHNwYWNlCisgKi8KK3N0YXRpYyB2b2lkIHB0dF9zb2NrX3Byb2NfcmVnX3JlcSh0QW5pSGRyICp3bXNnLCBpbnQgcmFkaW8pCit7CisgICB0QW5pTmxBcHBSZWdSZXEgKnJlZ19yZXE7CisgICB0QW5pTmxBcHBSZWdSc3AgcnNwbXNnOworICAgcmVnX3JlcSA9ICh0QW5pTmxBcHBSZWdSZXEgKikod21zZyArIDEpOworICAgbWVtc2V0KChjaGFyICopJnJzcG1zZywgMCwgc2l6ZW9mKHJzcG1zZykpOworICAgLy9zZW5kIHJlZyByZXNwb25zZSBtZXNzYWdlIHRvIHRoZSBhcHBsaWNhdGlvbgorICAgcnNwbXNnLnJldCA9IEFOSV9OTF9NU0dfT0s7CisgICByc3Btc2cucmVnUmVxLnR5cGUgPSByZWdfcmVxLT50eXBlOworICAgLypTYXZlIHRoZSBwaWQqLyAgICAKKyAgIHBBZGFwdGVySGFuZGxlLT5wdHRfcGlkID0gcmVnX3JlcS0+cGlkOyAgIAorICAgcnNwbXNnLnJlZ1JlcS5waWQ9IHJlZ19yZXEtPnBpZDsKKyAgIHJzcG1zZy53bmlIZHIudHlwZSA9IGNwdV90b19iZTE2KEFOSV9NU0dfQVBQX1JFR19SU1ApOworICAgcnNwbXNnLnduaUhkci5sZW5ndGggPSBjcHVfdG9fYmUxNihzaXplb2YocnNwbXNnKSk7CisgICBpZiAocHR0X3NvY2tfc2VuZF9tc2dfdG9fYXBwKCh0QW5pSGRyICopJnJzcG1zZy53bmlIZHIsIHJhZGlvLAorICAgICAgQU5JX05MX01TR19QVU1BQywgcmVnX3JlcS0+cGlkKSA8IDApCisgICB7CisgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEVycm9yIHNlbmRpbmcgQU5JX01TR19BUFBfUkVHX1JTUCB0byBwaWRbJWRdXG4iLAorICAgICAgICAgX19GVU5DVElPTl9fLCByZWdfcmVxLT5waWQpOworICAgfQorfQorLyoKKyAqIFByb2Nlc3MgYWxsIHRoZSBtZXNzYWdlcyBmcm9tIHRoZSBQVFQgU29ja2V0IEFwcCBpbiB1c2VyIHNwYWNlCisgKi8KK3N0YXRpYyB2b2lkIHB0dF9wcm9jX3B1bWFjX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwgdEFuaUhkciAqd21zZywgaW50IHJhZGlvKQoreworICAgdTE2IGFuaV9tc2dfdHlwZSA9IGJlMTZfdG9fY3B1KHdtc2ctPnR5cGUpOworICAgc3dpdGNoKGFuaV9tc2dfdHlwZSkKKyAgIHsKKyAgICAgIGNhc2UgQU5JX01TR19BUFBfUkVHX1JFUToKKyAgICAgICAgIFBUVF9UUkFDRShWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBSZWNlaXZlZCBBTklfTVNHX0FQUF9SRUdfUkVRIFsweCVYXVxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYW5pX21zZ190eXBlKTsKKyAgICAgICAgIHB0dF9zb2NrX3Byb2NfcmVnX3JlcSh3bXNnLCByYWRpbyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IFJlY2VpdmVkIFVua25vd24gTXNnIFR5cGVbMHglWF1cbiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFuaV9tc2dfdHlwZSk7CisgICAgICAgICBicmVhazsKKyAgIH0KK30KKy8qCisgKiBQcm9jZXNzIGFsbCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUgUXVhcmt5IENsaWVudAorICovCitzdGF0aWMgdm9pZCBwdHRfcHJvY19xdWFya3lfbXNnKHRBbmlObEhkciAqd25sLCB0QW5pSGRyICp3bXNnLCBpbnQgcmFkaW8pCit7CisgICB1MTYgYW5pX21zZ190eXBlID0gYmUxNl90b19jcHUod21zZy0+dHlwZSk7CisgICB2X1UzMl90IHJlZ19hZGRyOworICAgdl9VMzJfdCByZWdfdmFsOworICAgdl9VMzJfdCBsZW5fcGF5bG9hZDsKKyAgIHZfVThfdCogYnVmOworICAgdW5zaWduZWQgaW50IGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGNtZDsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgaWYgKHJhZGlvIDwgMCB8fCByYWRpbyA+IEFOSV9NQVhfUkFESU9TKSB7CisgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEFOSSBNc2cgWzB4JVhdIGludmFsaWQgcmFkaW8gaWQgWyVkXVxuIiwKKyAgICAgICAgIF9fRlVOQ1RJT05fXywgYW5pX21zZ190eXBlLCByYWRpbyk7CisgICAgICByZXR1cm47CisgICB9CisgICBpZihhbmlfbXNnX3R5cGUgPT0gQU5JX01TR19BUFBfUkVHX1JFUSkKKyAgIHsKKyAgICAgIHB0dF9zb2NrX3Byb2NfcmVnX3JlcSh3bXNnLCByYWRpbyk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzd2l0Y2ggKGFuaV9tc2dfdHlwZSkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgUFRUX01TR19SRUFEX1JFR0lTVEVSOgorICAgICAgICAgICAgcmVnX2FkZHIgPSAqKHZfVTMyX3QqKSAoKGNoYXIqKXdtc2cgKyA4KTsKKyAgICAgICAgICAgIFBUVF9UUkFDRShWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBQVFRfTVNHX1JFQURfUkVHSVNURVIgWzB4JTA4bFhdXG4iLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZWdfYWRkcik7CisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzbWVfRGJnUmVhZFJlZ2lzdGVyKHBBZGFwdGVySGFuZGxlLT5oSGFsLCByZWdfYWRkciwgJnJlZ192YWwpOworICAgICAgICAgICAgKih2X1UzMl90KikgKChjaGFyKil3bXNnICsgMTIpID0gcmVnX3ZhbDsKKyAgICAgICAgICAgIGlmKHZvc1N0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IFJlYWQgUmVnaXN0ZXIgWzB4JTA4bFhdIGZhaWxlZCEhXG4iLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZWdfYWRkcik7CisgICAgICAgICAgICBwdHRfc29ja19zZW5kX21zZ190b19hcHAod21zZywgMCwgQU5JX05MX01TR19QVU1BQywgd25sLT5ubGgubmxtc2dfcGlkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBQVFRfTVNHX1dSSVRFX1JFR0lTVEVSOgorICAgICAgICAgICAgcmVnX2FkZHIgPSAqKHZfVTMyX3QqKSAoKGNvbnN0IHVuc2lnbmVkIGNoYXIqKXdtc2cgKyA4KTsKKyAgICAgICAgICAgIHJlZ192YWwgPSAqKHZfVTMyX3QqKSgoY29uc3QgdW5zaWduZWQgY2hhciopd21zZyArIDEyKTsKKyAgICAgICAgICAgIFBUVF9UUkFDRShWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBQVFRfTVNHX1dSSVRFX1JFR0lTVEVSIEFkZHIgWzB4JTA4bFhdIHZhbHVlIFsweCUwOGxYXVxuIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVnX2FkZHIsIHJlZ192YWwpOworICAgICAgICAgICAgdm9zU3RhdHVzID0gc21lX0RiZ1dyaXRlUmVnaXN0ZXIocEFkYXB0ZXJIYW5kbGUtPmhIYWwsIHJlZ19hZGRyLCByZWdfdmFsKTsKKyAgICAgICAgICAgIGlmKHZvc1N0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IFdyaXRlIFJlZ2lzdGVyIFsweCUwOGxYXSB2YWx1ZSBbMHglMDhsWF0gZmFpbGVkISFcbiIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlZ19hZGRyLCByZWdfdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vc2VuZCBtZXNzYWdlIHRvIHRoZSBhcHAKKyAgICAgICAgICAgIHB0dF9zb2NrX3NlbmRfbXNnX3RvX2FwcCh3bXNnLCAwLCBBTklfTkxfTVNHX1BVTUFDLCB3bmwtPm5saC5ubG1zZ19waWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFBUVF9NU0dfUkVBRF9NRU1PUlk6CisgICAgICAgICAgICByZWdfYWRkciA9ICoodl9VMzJfdCopICgoY2hhciopd21zZyArIDgpOworICAgICAgICAgICAgbGVuX3BheWxvYWQgPSAqKHZfVTMyX3QqKSAoKGNoYXIqKXdtc2cgKyAxMik7CisgICAgICAgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogUFRUX01TR19SRUFEX01FTU9SWSBhZGRyIFsweCUwOGxYXSBieXRlcyBbMHglMDhsWF1cbiIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlZ19hZGRyLCBsZW5fcGF5bG9hZCk7CisgICAgICAgICAgICBidWYgPSAodl9VOF90Kil3bXNnICsgMTY7CisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzbWVfRGJnUmVhZE1lbW9yeShwQWRhcHRlckhhbmRsZS0+aEhhbCwgcmVnX2FkZHIsIGJ1ZiwgbGVuX3BheWxvYWQpOworICAgICAgICAgICAgaWYodm9zU3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgUFRUX1RSQUNFKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBNZW1vcnkgcmVhZCBmYWlsZWQgZm9yIFsweCUwOGxYXSEhXG4iLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZWdfYWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdHRfc29ja19zd2FwXzMyKGJ1ZiwgbGVuX3BheWxvYWQpOworICAgICAgICAgICAgLy9zZW5kIG1lc3NhZ2UgdG8gdGhlIGFwcAorICAgICAgICAgICAgcHR0X3NvY2tfc2VuZF9tc2dfdG9fYXBwKHdtc2csIDAsIEFOSV9OTF9NU0dfUFVNQUMsIHdubC0+bmxoLm5sbXNnX3BpZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgUFRUX01TR19XUklURV9NRU1PUlk6CisgICAgICAgICAgICByZWdfYWRkciA9ICoodl9VMzJfdCopICgoY2hhciopd21zZyArIDgpOworICAgICAgICAgICAgbGVuX3BheWxvYWQgPSAqKHZfVTMyX3QqKSAoKGNoYXIqKXdtc2cgKyAxMik7CisgICAgICAgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogUFRUX01TR19EQkdfV1JJVEVfTUVNT1JZIGFkZHIgWzB4JTA4bFhdIGJ5dGVzIFsweCUwOGxYXVxuIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVnX2FkZHIsIGxlbl9wYXlsb2FkKTsKKyAgICAgICAgICAgIGJ1ZiA9ICh2X1U4X3QqKXdtc2cgKyAxNjsKKyAgICAgICAgICAgIHB0dF9zb2NrX3N3YXBfMzIoYnVmLCBsZW5fcGF5bG9hZCk7CisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzbWVfRGJnV3JpdGVNZW1vcnkocEFkYXB0ZXJIYW5kbGUtPmhIYWwsIHJlZ19hZGRyLCBidWYsIGxlbl9wYXlsb2FkKTsKKyAgICAgICAgICAgIGlmKHZvc1N0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE1lbW9yeSB3cml0ZSBmYWlsZWQgZm9yIGFkZHIgWzB4JTA4bFhdISFcbiIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlZ19hZGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vc2VuZCBtZXNzYWdlIHRvIHRoZSBhcHAKKyAgICAgICAgICAgIHB0dF9zb2NrX3NlbmRfbXNnX3RvX2FwcCh3bXNnLCAwLCBBTklfTkxfTVNHX1BVTUFDLCB3bmwtPm5saC5ubG1zZ19waWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFBUVF9NU0dfTE9HX0RVTVBfREJHOgorICAgICAgICAgICAgY21kID0gKih1bnNpZ25lZCBpbnQgKikgKChjaGFyICopd21zZyArIDgpOworICAgICAgICAgICAgYXJnMSA9ICoodW5zaWduZWQgaW50ICopICgoY2hhciAqKXdtc2cgKyAxMik7CisgICAgICAgICAgICBhcmcyID0gKih1bnNpZ25lZCBpbnQgKikgKChjaGFyICopd21zZyArIDE2KTsKKyAgICAgICAgICAgIGFyZzMgPSAqKHVuc2lnbmVkIGludCAqKSAoKGNoYXIgKil3bXNnICsgMjApOworICAgICAgICAgICAgYXJnNCA9ICoodW5zaWduZWQgaW50ICopICgoY2hhciAqKXdtc2cgKyAyNCk7CisgICAgICAgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogUFRUX01TR19MT0dfRFVNUF9EQkcgJWQgYXJnMSAlZCBhcmcyICVkIGFyZzMgJWQgYXJnNCAlZFxuIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY21kLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgICAgICAgICAvLyBGSVhNRV9QUklNQSAtLSBuZWVkIGxvZ0R1bXAoKSByZXBsYWNlbWVudAorICAgICAgICAgICAgbG9nUHJpbnRmKHBBZGFwdGVySGFuZGxlLT5oSGFsLCBjbWQsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgICAgICAgICAgLy9zZW5kIG1lc3NhZ2UgdG8gdGhlIGFwcAorICAgICAgICAgICAgcHR0X3NvY2tfc2VuZF9tc2dfdG9fYXBwKHdtc2csIDAsIEFOSV9OTF9NU0dfUFVNQUMsIHdubC0+bmxoLm5sbXNnX3BpZCk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBBTklfTUFORl9ESUFHCisgICAgICAgICBjYXNlIFBUVF9NU0dfRlRNX0NNRFNfVFlQRToKKyAgICAgICAgICAgIHdsYW5faGRkX3Byb2Nlc3NfZnRtX2NtZChwQWRhcHRlckhhbmRsZSx3bmwpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IFVua25vd24gQU5JIE1zZyBbMHglWF0sIGxlbmd0aCBbMHglWF1cbiIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFuaV9tc2dfdHlwZSwgYmUxNl90b19jcHUod21zZy0+bGVuZ3RoICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9Cit9CisvKgorICogUHJvY2VzcyBhbGwgdGhlIE5ldGxpbmsgbWVzc2FnZXMgZnJvbSBQVFQgU29ja2V0IGFwcCBpbiB1c2VyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgcHR0X3NvY2tfcnhfbmxpbmtfbXNnIChzdHJ1Y3Qgc2tfYnVmZiAqIHNrYikKK3sKKyAgIHRBbmlObEhkciAqd25sOworICAgaW50IHJhZGlvOworICAgaW50IHR5cGU7CisgICB3bmwgPSAodEFuaU5sSGRyICopIHNrYi0+ZGF0YTsKKyAgIHJhZGlvID0gd25sLT5yYWRpbzsKKyAgIHR5cGUgPSB3bmwtPm5saC5ubG1zZ190eXBlOworICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIEFOSV9OTF9NU0dfUFVNQUM6ICAvL01lc3NhZ2UgZnJvbSB0aGUgUFRUIHNvY2tldCBBUFAKKyAgICAgICAgIFBUVF9UUkFDRShWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVzOiBSZWNlaXZlZCBBTklfTkxfTVNHX1BVTUFDIE1zZyBbMHglWF1cbiIsCisgICAgICAgICAgICBfX2Z1bmNfXywgdHlwZSwgcmFkaW8pOworICAgICAgICAgcHR0X3Byb2NfcHVtYWNfbXNnKHNrYiwgJndubC0+d21zZywgcmFkaW8pOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFOSV9OTF9NU0dfUFRUOiAvL01lc3NhZ2UgZnJvbSBRdWFya3kgR1VJCisgICAgICAgICBQVFRfVFJBQ0UoVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogUmVjZWl2ZWQgQU5JX05MX01TR19QVFQgTXNnIFsweCVYXVxuIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCB0eXBlLCByYWRpbyk7CisgICAgICAgICBwdHRfcHJvY19xdWFya3lfbXNnKHdubCwgJndubC0+d21zZywgcmFkaW8pOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgUFRUX1RSQUNFKFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBVbmtub3duIE5MIE1zZyBbMHglWF1cbiIsX19mdW5jX18sIHR5cGUpOworICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gMDsKK30KK2ludCBwdHRfc29ja19hY3RpdmF0ZV9zdmModm9pZCAqcEFkYXB0ZXIpCit7CisgICBwQWRhcHRlckhhbmRsZSA9IChzdHJ1Y3QgaGRkX2NvbnRleHRfcyopcEFkYXB0ZXI7CisgICBubF9zcnZfcmVnaXN0ZXIoQU5JX05MX01TR19QVU1BQywgcHR0X3NvY2tfcnhfbmxpbmtfbXNnKTsKKyAgIG5sX3Nydl9yZWdpc3RlcihBTklfTkxfTVNHX1BUVCwgcHR0X3NvY2tfcnhfbmxpbmtfbXNnKTsKKyAgIHJldHVybiAwOworfQorI2VuZGlmIC8vUFRUX1NPQ0tfU1ZDX0VOQUJMRQpkaWZmIC0tZ2l0IGEvQ09SRS9TWVMvY29tbW9uL2luYy93bGFuX3FjdF9zeXMuaCBiL0NPUkUvU1lTL2NvbW1vbi9pbmMvd2xhbl9xY3Rfc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4MDBkOQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1lTL2NvbW1vbi9pbmMvd2xhbl9xY3Rfc3lzLmgKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIFdMQU5fUUNUX1NZU19IX18gKQorI2RlZmluZSBXTEFOX1FDVF9TWVNfSF9fCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFxmaWxlICB3bGFuX3FjdF9zeXMuaAorCisgIFxicmllZiBTeXN0ZW0gbW9kdWxlIEFQSQorCisgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhFQURFUiQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBmaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKyNpbmNsdWRlIDx2b3Nfc3RhdHVzLmg+CisjaW5jbHVkZSA8dm9zX21xLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzeXNSZXNwb25zZUNiYWNrKCkgLSBTWVMgYXN5bmMgcmVzb25zZSBjYWxsYmFjaworCisgIFRoaXMgaXMgYSBwcm90eXBlIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBTWVMgbWFrZXMgdG8gdmFyaW91cworICBtb2R1bGVzIGluIHRoZSBzeXN0ZW0uCisKKyAgXHBhcmFtICBwVXNlckRhdGEgLSB1c2VyIGRhdGEgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgd2hlbiBpdCBpcyBpbnZva2VkLgorCisgIFxyZXR1cm4gTm90aGluZworCisgIFxzYSBzeXNNY1N0YXJ0KCksIHN5c01jVGhyZWFkUHJvYmUoKSwgc3lzVHhUaHJlYWRQcm9iZSgpCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2X1ZPSURfdCAoICogc3lzUmVzcG9uc2VDYmFjayApICggdl9WT0lEX3QgKnBVc2VyRGF0YSApOworCisKKwordHlwZWRlZiBlbnVtCit7CisgICBTWVNfTVNHX0lEX01DX1NUQVJULAorICAgU1lTX01TR19JRF9NQ19USFJfUFJPQkUsCisgICBTWVNfTVNHX0lEX01DX1RJTUVSLAorCisgICBTWVNfTVNHX0lEX1RYX1RIUl9QUk9CRSwKKyAgIFNZU19NU0dfSURfVFhfVElNRVIsCisKKyAgIFNZU19NU0dfSURfUlhfVElNRVIsCisKKyAgIFNZU19NU0dfSURfTUNfU1RPUCwKKworfSBTWVNfTVNHX0lEOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzeXNCdWlsZE1lc3NhZ2VIZWFkZXIoKSAtIEJ1aWxkIC8gaW5pdGlhbGl6ZSBhIFNZUyBtZXNzYWdlIGhlYWRlcgorCisgIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIHRoZSBTWVMgbWVzc2FnZSBoZWFkZXIgd2l0aCB0aGUgbWVzc2FnZSB0eXBlCisgIGFuZCBhbnkgaW50ZXJuYWwgZmllbGRzIG5lZWRlZCBmb3IgYSBuZXcgU1lTIG1lc3NhZ2UuICBUaGlzIGZ1bmN0aW9uIHNldHMKKyAgYWxsIGJ1dCB0aGUgbWVzc2FnZSBib2R5LCB3aGljaCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNldHVwIGJhc2VkIG9uIHRoZQorICBzcGVjaWZpYyBtZXNzYWdlIGJlaW5nIGJ1aWx0LgorCisgIFxub3RlIFRoZXJlIGFyZSBpbnRlcm5hbCAvIHJlc2VydmVkIGl0ZW1zIGluIGEgU1lTIG1lc3NhZ2UgdGhhdCBtdXN0IGJlCisgICAgICAgIHNldCBjb3JyZWN0bHkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJlY29nbml6ZWQgYXMgYSBTWVMgbWVzc2FnZSBieQorICAgICAgICB0aGUgU1lTIG1lc3NhZ2UgaGFuZGxlcnMuICBJdCBpcyBpbXBvcnRhbnQgZm9yIGV2ZXJ5IFNZUyBtZXNzYWdlIHRvCisgICAgICAgIGJlIHNldHVwIC8gYnVpbHQgLyBpbml0aWFsaXplZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uCisKKyAgXHBhcmFtIHN5c01zZ0lkIC0gYSB2YWxpZCBtZXNzYWdlIElEIGZvciBhIFNZUyBtZXNzYWdlLiAgU2VlIHRoZQorICAgICAgICAgU1lTX01TR19JRCBlbnVtIGZvciBhbGwgdGhlIHZhbGlkIFNZUyBtZXNzYWdlIElEcy4KKworICBccGFyYW0gcE1zZyAtIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2Ugc3RydWN0dXJlIHRvIGJlIHNldHVwLgorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHN5c0J1aWxkTWVzc2FnZUhlYWRlciggU1lTX01TR19JRCBzeXNNc2dJZCwgdm9zX21zZ190ICpwTXNnICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzeXNPcGVuKCkgLSBPcGVuIChpbml0aWFsaXplKSB0aGUgU1lTIG1vZHVsZS4KKworICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBTWVMgbW9kdWxlcy4gIEFsbCBTWVMgcmVzb3VyY2VzIGFyZSBhbGxvY2F0ZWQKKyAgYXMgYSByZXN1bHQgb2YgdGhpcyBvcGVuIGNhbGwuCisKKyAgXHBhcmFtIHBWb3NDb250ZXh0IC0gcG9pbnRlciB0byB0aGUgVk9TIENvbnRleHQgKGZyb20gd2hpY2ggYWxsIG90aGVyCisgICAgICAgICBjb250ZXh0IGVudGl0aWVzIGNhbiBiZSBkZXJpdmVkKS4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBTWVMgbW9kdWxlIGlzIG9wZW4uICBBbGwgcmVzb3VyY2VzIG5lZWRlZAorICAgICAgICAgIGZvciBvcGVyYXRpb24gb2YgdGhlIFNZUyBtb2R1bGVzIGFyZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX1JFU09VUkNFUyAtIHRoZSBTWVMgbW9kdWxlIG9wZW4gZmFpbGVkIGJlY2F1c2UgbmVlZGVkCisgICAgICAgICAgc3lzdGVtIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZS4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gdGhlIFNZUyBtb2R1bGUgb3BlbiBmYWlsZWQgZHVlIHRvIHNvbWUKKyAgICAgICAgICB1bmtub3duIHJlYXNvbi4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHN5c09wZW4oIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHN5c01jU3RhcnQoKSAtIHN0YXJ0IHRoZSBzeXN0ZW0gTWFpbiBDb250cm9sbGVyIHRocmVhZC4KKworICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUgU1lTIChNYWluIENvbnRyb2xsZXIpIG1vZHVsZS4gIFN0YXJ0aW5nIHRoaXMKKyAgbW9kdWxlIHRyaWdnZXJzIHRoZSBDRkcgZG93bmxvYWQgdG8gdGhlICdsZWdhY3knIE1BQyBzb2Z0d2FyZS4KKworICBccGFyYW0gcFZvc0NvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBWT1MgQ29udGV4dAorCisgIFxwYXJhbSB1c2VyQ2FsbGJhY2sgLSB0aGlzIGlzIGEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgU1lTCisgICAgICAgICBoYXMgY29tcGxldGVkIHRoZSAnc3RhcnQnIGZ1bmNpdG9uLgorCisgIFxwYXJhbSBwVXNlckRhdGEgLSBwb2ludGVyIHRvIHNvbWUgdXNlciBkYXRhIGVudGl0eSB0aGF0IGlzIHBhc3NlZCB0bworICAgICAgICAgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW52b2tlZC4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtCisKKyAgXHRvZG86ICBXZSBoYXZlIG5vdCAnc3RhdHVzJyBvbiB0aGUgY2FsbGJhY2suICBIb3cgZG8gd2Ugbm90aWZ5IHRoZQorICAgICAgICAgIGNhbGxiYWNrIHRoYXQgdGhlcmUgaXMgYSBmYWlsdXJlID8KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHN5c01jU3RhcnQoIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0LCBzeXNSZXNwb25zZUNiYWNrIHVzZXJDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKnBVc2VyRGF0YSApOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzeXNTdG9wKCkgLSBTdG9wIHRoZSBTWVMgbW9kdWxlLgorCisgIFRoaXMgZnVuY3Rpb24gc3RvcHMgdGhlIFNZUyBtb2R1bGUuCisKKyAgXHRvZG86IFdoYXQgZWxzZSBkbyB3ZSBuZWVkIHRvIGRvIG9uIHN5c1N0b3AoKT8KKworICBccGFyYW0gcFZvc0NvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBWT1MgQ29udGV4dAorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGhlIFNZUyBtb2R1bGUgaXMgc3RvcHBlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gdGhlIFNZUyBtb2R1bGUgb3BlbiBmYWlsZWQgdG8gc3RvcC4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHN5c1N0b3AoIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHN5c0Nsb3NlKCkgLSBDbG9zZSB0aGUgU1lTIG1vZHVsZS4KKworICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyB0aGUgU1lTIG1vZHVsZS4gIEFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGR1cmluZworICBzeXNPcGVuKCkgYXJlIGZyZWUnZCBhbmQgcmV0dXJuZWQgdG8gdGhlIHN5c3RlbS4gIFRoZSBTeXMgbW9kdWxlIGlzIHVuYWJsZQorICB0byBvcGVyYXRlIHVudGlsIG9wZW5lZCBhZ2FpbiB0aHJvdWdoIGEgY2FsbCB0byBzeXNPcGVuKCkuCisKKyAgXHBhcmFtIHBWb3NDb250ZXh0IC0gcG9pbnRlciB0byB0aGUgVk9TIENvbnRleHQKKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBTWVMgbW9kdWxlIGlzIGNsb3NlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gdGhlIFNZUyBtb2R1bGUgb3BlbiBmYWlsZWQgdG8gY2xvc2UKKworICBcc2Egc3lzT3BlbigpLCBzeXNNY1N0YXJ0KCkKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHN5c0Nsb3NlKCB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCApOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzeXNNY1RocmVhZFByb2JlKCkgLSBQcm9iZSB0aGUgU1lTIE1haW4gQ29udHJvbGxlciB0aHJlYWQKKworICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gdG8gJ3Byb2JlJyB0aGUgTWFpbiBDb250cm9sbGVyCisgIHRocmVhZC4gIFByb2JpbmcgbWVhbnMgYSBzcGVjaWZpYyBtZXNzYWdlIGlzIHBvc3RlZCB0byB0aGUgU1lTIG1vZHVsZSB0bworICBhc3N1cmUgdGhlIE1haW4gQ29udHJvbGxlciB0aHJlYWQgaXMgb3BlcmF0aW5nIGFuZCBwcm9jZXNzaW5nIG1lc3NhZ2VzCisgIGNvcnJlY3RseS4KKworICBGb2xsb3dpbmcgdGhlIHN1Y2Nlc3NmdWwgJ3Byb2JlJyBvZiB0aGUgTWFpbiBDb250cm9sbGVyIHRocmVhZCwgdGhlCisgIGNhbGxiYWNrIHNwZWNpZmllZCBvbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBub3RpZnkgYW5vdGhlciBlbnRpdHkKKyAgdGhhdCB0aGUgTWFpbiBDb250cm9sbGVyIGlzIG9wZXJhdGlvbmFsLgorCisgIFxwYXJhbSBwVm9zQ29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIFZPUyBDb250ZXh0CisKKyAgXHBhcmFtIHVzZXJDYWxsYmFjayAtIHRoaXMgaXMgYSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBTWVMKKyAgICAgICAgIGhhcyBjb21wbGV0ZWQgcHJvYmluZyB0aGUgTWFpbiBDb250cm9sbGVyIHRocmVhZC4KKworICBccGFyYW0gcFVzZXJEYXRhIC0gcG9pbnRlciB0byBzb21lIHVzZXIgZGF0YSBlbnRpdHkgdGhhdCBpcyBwYXNzZWQgdG8KKyAgICAgICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBhcyBhIHBhcmFtZXRlciB3aGVuIGludm9rZWQuCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLQorICAgICAgICAgIFx0b2RvOiBob3cgZG8gd2UgdGVsbCB0aGUgY2FsbGJhY2sgdGhlcmUgaXMgYSBmYWlsdXJlPworCisgIFxzYSBzeXNPcGVuKCksIHN5c01jU3RhcnQoKQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVk9JRF90IHN5c01jVGhyZWFkUHJvYmUoIHZfQ09OVEVYVF90IHBWb3NDb250ZXgsIHN5c1Jlc3BvbnNlQ2JhY2sgdXNlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKnBVc2VyRGF0YSApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgc3lzVHhUaHJlYWRQcm9iZSgpIC0gUHJvYmUgdGhlIFR4IHRocmVhZAorCisgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiB0byAncHJvYmUnIHRoZSBUeAorICB0aHJlYWQuICBQcm9iaW5nIG1lYW5zIGEgc3BlY2lmaWMgbWVzc2FnZSBpcyBwb3N0ZWQgdG8gdGhlIFNZUyBtb2R1bGUgdG8KKyAgYXNzdXJlIHRoZSBUeCBpcyBvcGVyYXRpbmcgYW5kIHByb2Nlc3NpbmcgbWVzc2FnZXMgY29ycmVjdGx5LgorCisgIEZvbGxvd2luZyB0aGUgc3VjY2Vzc2Z1bCAncHJvYmUnIG9mIHRoZSBUeCwgdGhlIGNhbGxiYWNrIHNwZWNpZmllZAorICBvbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBub3RpZnkgYW5vdGhlciBlbnRpdHkgdGhhdCB0aGUgVHggdGhyZWFkCisgIGlzIG9wZXJhdGlvbmFsLgorCisgIFxwYXJhbSBwVm9zQ29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIFZPUyBDb250ZXh0CisKKyAgXHBhcmFtIHVzZXJDYWxsYmFjayAtIHRoaXMgaXMgYSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBTWVMKKyAgICAgICAgIGhhcyBjb21wbGV0ZWQgcHJvYmluZyB0aGUgVHggdGhyZWFkLgorCisgIFxwYXJhbSBwVXNlckRhdGEgLSBwb2ludGVyIHRvIHNvbWUgdXNlciBkYXRhIGVudGl0eSB0aGF0IGlzIHBhc3NlZCB0bworICAgICAgICAgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW52b2tlZC4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtCisgICAgICAgICAgXHRvZG86IGhvdyBkbyB3ZSB0ZWxsIHRoZSBjYWxsYmFjayB0aGVyZSBpcyBhIGZhaWx1cmU/CisKKyAgXHNhIHN5c09wZW4oKSwgc3lzTWNTdGFydCgpCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9WT0lEX3Qgc3lzVHhUaHJlYWRQcm9iZSggdl9DT05URVhUX3QgcFZvc0NvbnRleCwgc3lzUmVzcG9uc2VDYmFjayB1c2VyQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqcFVzZXJEYXRhICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzeXNNY1Byb2Nlc3NNc2coKSAtIHByb2Nlc3MgU1lTIG1lc3NhZ2VzIG9uIHRoZSBNYWluIENvbnRyb2xsZXIgdGhyZWFkCisKKyAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgU1lTIE1lc3NhZ2VzIG9uIHRoZSBNYWluIENvbnRyb2xsZXIgdGhyZWFkLgorICBTWVMgbWVzc2FnZXMgY29uc2lzdCBvZiBhbGwgJ2xlZ2FjeScgbWVzc2FnZXMgKG1lc3NhZ2VzIGJvdW5kIGZvciBsZWdhY3kKKyAgbW9kdWxlcyBsaWtlIExJTSwgSEFMLCBQRSwgZXRjLikgYXMgd2VsbCBhcyBuZXdseSBkZWZpbmVkIFNZUyBtZXNzYWdlCisgIHR5cGVzLgorCisgIFNZUyBtZXNzYWdlcyBhcmUgaWRlbnRpZmllZCBieSB0aGVpciB0eXBlIChpbiB0aGUgU1lTX01FU1NBR0VTIGVudW0pIGFzCisgIHdlbGwgYXMgYSAnY29va2llJyB0aGF0IGlzIGluIHRoZSByZXNlcnZlZCBmaWVsZCBvZiB0aGUgbWVzc2FnZSBzdHJ1Y3R1cmUuCisgIFRoaXMgJ2Nvb2tpZScgaXMgaW50cm9kdWNlZCB0byBwcmV2ZW50IGFueSBtZXNzYWdlIHR5cGUvSUQgY29uZmxpY3RzIHdpdGgKKyAgdGhlICdsZWdhY3knIG1lc3NhZ2UgdHlwZXMuCisKKyAgQW55IG1vZHVsZSBhdHRlbXB0aW5nIHRvIHBvc3QgYSBtZXNzYWdlIHRvIHRoZSBTWVMgbW9kdWxlIG11c3Qgc2V0IHRoZQorICBtZXNzYWdlIHR5cGUgdG8gb25lIG9mIHRoZSB0eXBlcyBpbiB0aGUgU1lTX01FU1NBR0UgZW51bSAqYW5kKiBtdXN0IGFsc28KKyAgc2V0IHRoZSBSZXNlcnZlZCBmaWVsZCBpbiB0aGUgbWVzc2FnZSBib2R5IHRvIFNZU19NU0dfQ09PS0lFLgorCisgIFxwYXJhbSBwVm9zQ29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIFZPUyBDb250ZXh0CisKKyAgXHBhcmFtIHBNc2cgLSBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZC4KKworICBccmV0dXJuIC0gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGhlIG1lc3NhZ2Ugd2FzIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkuCisKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9CQURNU0cgLSBhIGJhZCAodW5rbm93biB0eXBlKSBtZXNzYWdlIHdhcyByZWNlaXZlZAorICAgICAgICAgICAgYW5kIHN1YnNlcXVlbnRseSBub3QgcHJvY2Vzc2VkLgorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHN5c01jUHJvY2Vzc01zZyggdl9DT05URVhUX3QgcFZvc0NvbnRleHQsIHZvc19tc2dfdCogcE1zZyApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgc3lzVHhQcm9jZXNzTXNnKCkgLSBwcm9jZXNzIFNZUyBtZXNzYWdlcyBvbiB0aGUgVHggdGhyZWFkCisKKyAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgU1lTIE1lc3NhZ2VzIG9uIHRoZSBUeCB0aHJlYWQuCisgIFNZUyBtZXNzYWdlcyBjb25zaXN0IG9mIGFsbCAnbGVnYWN5JyBtZXNzYWdlcyAobWVzc2FnZXMgYm91bmQgZm9yIGxlZ2FjeQorICBtb2R1bGVzIGxpa2UgTElNLCBIQUwsIFBFLCBldGMuKSBhcyB3ZWxsIGFzIG5ld2x5IGRlZmluZWQgU1lTIG1lc3NhZ2UKKyAgdHlwZXMuCisKKyAgU1lTIG1lc3NhZ2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIHR5cGUgKGluIHRoZSBTWVNfTUVTU0FHRVMgZW51bSkgYXMKKyAgd2VsbCBhcyBhICdjb29raWUnIHRoYXQgaXMgaW4gdGhlIHJlc2VydmVkIGZpZWxkIG9mIHRoZSBtZXNzYWdlIHN0cnVjdHVyZS4KKyAgVGhpcyAnY29va2llJyBpcyBpbnRyb2R1Y2VkIHRvIHByZXZlbnQgYW55IG1lc3NhZ2UgdHlwZS9JRCBjb25mbGljdHMgd2l0aAorICB0aGUgJ2xlZ2FjeScgbWVzc2FnZSB0eXBlcy4KKworICBBbnkgbW9kdWxlIGF0dGVtcHRpbmcgdG8gcG9zdCBhIG1lc3NhZ2UgdG8gdGhlIFNZUyBtb2R1bGUgbXVzdCBzZXQgdGhlCisgIG1lc3NhZ2UgdHlwZSB0byBvbmUgb2YgdGhlIHR5cGVzIGluIHRoZSBTWVNfTUVTU0FHRSBlbnVtICphbmQqIG11c3QgYWxzbworICBzZXQgdGhlIFJlc2VydmVkIGZpZWxkIGluIHRoZSBtZXNzYWdlIGJvZHkgdG8gU1lTX01TR19DT09LSUUuCisKKyAgXHBhcmFtIHBWb3NDb250ZXh0IC0gcG9pbnRlciB0byB0aGUgVk9TIENvbnRleHQKKworICBccGFyYW0gcE1zZyAtIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdG8gYmUgcHJvY2Vzc2VkLgorCisgIFxyZXR1cm4gLSBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgbWVzc2FnZSB3YXMgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseS4KKworICAgICAgICAgICAgVk9TX1NUQVRVU19FX0JBRE1TRyAtIGEgYmFkICh1bmtub3duIHR5cGUpIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkCisgICAgICAgICAgICBhbmQgc3Vic2VxdWVudGx5IG5vdCBwcm9jZXNzZWQuCisKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyBzeXNUeFByb2Nlc3NNc2coIHZfQ09OVEVYVF90IHBWQ29udGV4dCwgdm9zX21zZ190KiBwTXNnICk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiBzeXNUeFByb2Nlc3NNc2coKSAtIHByb2Nlc3MgU1lTIG1lc3NhZ2VzIG9uIHRoZSBSeCB0aHJlYWQKKworICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBTWVMgTWVzc2FnZXMgb24gdGhlIFJ4IHRocmVhZC4KKyAgU1lTIG1lc3NhZ2VzIGNvbnNpc3Qgb2YgYWxsICdsZWdhY3knIG1lc3NhZ2VzIChtZXNzYWdlcyBib3VuZCBmb3IgbGVnYWN5CisgIG1vZHVsZXMgbGlrZSBMSU0sIEhBTCwgUEUsIGV0Yy4pIGFzIHdlbGwgYXMgbmV3bHkgZGVmaW5lZCBTWVMgbWVzc2FnZQorICB0eXBlcy4KKworICBTWVMgbWVzc2FnZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgdHlwZSAoaW4gdGhlIFNZU19NRVNTQUdFUyBlbnVtKSBhcworICB3ZWxsIGFzIGEgJ2Nvb2tpZScgdGhhdCBpcyBpbiB0aGUgcmVzZXJ2ZWQgZmllbGQgb2YgdGhlIG1lc3NhZ2Ugc3RydWN0dXJlLgorICBUaGlzICdjb29raWUnIGlzIGludHJvZHVjZWQgdG8gcHJldmVudCBhbnkgbWVzc2FnZSB0eXBlL0lEIGNvbmZsaWN0cyB3aXRoCisgIHRoZSAnbGVnYWN5JyBtZXNzYWdlIHR5cGVzLgorCisgIEFueSBtb2R1bGUgYXR0ZW1wdGluZyB0byBwb3N0IGEgbWVzc2FnZSB0byB0aGUgU1lTIG1vZHVsZSBtdXN0IHNldCB0aGUKKyAgbWVzc2FnZSB0eXBlIHRvIG9uZSBvZiB0aGUgdHlwZXMgaW4gdGhlIFNZU19NRVNTQUdFIGVudW0gKmFuZCogbXVzdCBhbHNvCisgIHNldCB0aGUgUmVzZXJ2ZWQgZmllbGQgaW4gdGhlIG1lc3NhZ2UgYm9keSB0byBTWVNfTVNHX0NPT0tJRS4KKworICBccGFyYW0gcFZvc0NvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBWT1MgQ29udGV4dAorCisgIFxwYXJhbSBwTXNnIC0gcG9pbnRlciB0byB0aGUgbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQuCisKKyAgXHJldHVybiAtIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBtZXNzYWdlIHdhcyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LgorCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfQkFETVNHIC0gYSBiYWQgKHVua25vd24gdHlwZSkgbWVzc2FnZSB3YXMgcmVjZWl2ZWQKKyAgICAgICAgICAgIGFuZCBzdWJzZXF1ZW50bHkgbm90IHByb2Nlc3NlZC4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHN5c1J4UHJvY2Vzc01zZyggdl9DT05URVhUX3QgcFZDb250ZXh0LCB2b3NfbXNnX3QqIHBNc2cgKTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgc3lzTWNGcmVlTXNnKCkgLSBmcmVlIGEgbWVzc2FnZSBxdWV1ZSdkIHRvIHRoZSBNYWluIENvbnRyb2xsZXIgdGhyZWFkCisKKyAgVGhpcyBmbmN0aW9uIHdpbGwgZnJlZSBhIFNZUyBNZXNzYWdlIHRoYXQgaXMgcGVuZGluZyBpbiB0aGUgbWFpbiBjb250cm9sbGVyCisgIHRocmVhZCBxdWV1ZS4gIFRoZXNlIG1lc3NhZ2VzIGFyZSBmcmVlJ2Qgd2hlbiB0aGUgbWVzc2FnZSBxdWV1ZSBuZWVkcyB0byBiZQorICBwdXJnZWQsIGZvciBleGFtcGxlIGR1cmluZyBhIFJlc2V0IG9mIFNodXRkb3duIG9mIHRoZSBzeXN0ZW0uCisKKyAgXHBhcmFtIHBWb3NDb250ZXh0IC0gcG9pbnRlciB0byB0aGUgVk9TIENvbnRleHQKKworICBccGFyYW0gcE1zZyAtIHRoZSBtZXNzYWdlIHRvIGJlIGZyZWUnZAorCisgIFxyZXR1cm4gTm90aGluZy4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1ZPSURfdCBzeXNNY0ZyZWVNc2coIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0LCB2b3NfbXNnX3QqIHBNc2cgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHN5c1R4RnJlZU1zZygpIC0gZnJlZSBhIG1lc3NhZ2UgcXVldWUnZCB0byB0aGUgVHggdGhyZWFkCisKKyAgVGhpcyBmbmN0aW9uIHdpbGwgZnJlZSBhIFNZUyBNZXNzYWdlIHRoYXQgaXMgcGVuZGluZyBpbiB0aGUgVHgKKyAgdGhyZWFkIHF1ZXVlLiAgVGhlc2UgbWVzc2FnZXMgYXJlIGZyZWUnZCB3aGVuIHRoZSBtZXNzYWdlIHF1ZXVlIG5lZWRzIHRvIGJlCisgIHB1cmdlZCwgZm9yIGV4YW1wbGUgZHVyaW5nIGEgUmVzZXQgb2YgU2h1dGRvd24gb2YgdGhlIHN5c3RlbS4KKworICBccGFyYW0gcFZvc0NvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBWT1MgQ29udGV4dAorCisgIFxwYXJhbSBwTXNnIC0gdGhlIG1lc3NhZ2UgdG8gYmUgZnJlZSdkCisKKyAgXHJldHVybiBOb3RoaW5nLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVk9JRF90IHN5c1R4RnJlZU1zZyggdl9DT05URVhUX3QgcFZDb250ZXh0LCB2b3NfbXNnX3QqIHBNc2cgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHdsYW5fc3lzX2Z0bSgpIC0gRlRNIENtZCBSZXNwb25zZSBmcm9tIGhhbFBoeQorCisgIFRoaXMgZm5jdGlvbiBpcyBjYWxsZWQgYnkgaGFsUGh5IGFuZCBjYXJyaWVkIHRoZSBGVE0gY29tbWFuZCByZXNwb25zZS4KKyAgVGhpcyBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgU1lTIHRocmVhZCBhbmQgZmluYWxseSB0aGUgbWVzc2FnZSB3aWxsIGJlIGNvbnZ5ZWQgdG8gdXNlZCBzcGFjZQorCisKKyAgXHBhcmFtIHB0dE1zZ0J1ZmZlciAtIHBvaW50ZXIgdG8gdGhlIHB0dE1zZ0J1ZmZlcgorCisKKyAgXHJldHVybiBOb3RoaW5nLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB3bGFuX3N5c19mdG0odm9pZCAqcE1zZ1B0cik7CisKKworI2VuZGlmICAvLyBXTEFOX1FDVF9TWVNfSF9fCisKZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2NvbW1vbi9zcmMvd2xhbl9xY3Rfc3lzLmMgYi9DT1JFL1NZUy9jb21tb24vc3JjL3dsYW5fcWN0X3N5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Nzk0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NZUy9jb21tb24vc3JjL3dsYW5fcWN0X3N5cy5jCkBAIC0wLDAgKzEsMTI0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgIFcgTCBBIE4gICBTIFkgUyBUIEUgTSAgIE0gTyBEIFUgTCBFCisKKworREVTQ1JJUFRJT04KKyAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzeXN0ZW0gbW9kdWxlIHRoYXQgaW1wbGVtZW50cyB0aGUgJ2V4ZWN0dXRpb24gbW9kZWwnCisgIGluIHRoZSBHZW42IGhvc3Qgc29mdHdhcmUuCisKKworICBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKK3doZW4gICAgICAgIHdobyAgICAgICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tICAgIC0tLSAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxMi8xNS8wOCAgICBzaG8gICAgICAgICBSZXNvbHZlZCBBTVNTIGNvbXBpbGVyIGVycm9ycyBhbmQgd2FybmluZ3Mgd2hlbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBwb3J0ZWQgZnJvbSBXTQorMDcvMDIvMDggICAgbGFjICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZVdOSV9TTUVfU1RBUlRfUkVRL1JTUCBpbiBpbml0IHNlcQorMDYvMjYvMDggICAgaGJhICAgICAgICAgQWRkZWQgaW1wbGVtZW50YXRpb24gb2YgbWJSZWNlaXZlTUJNc2coKQorMDYvMjYvMDggICAgbGFjICAgICAgICAgQ3JlYXRlZCBtb2R1bGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworI2luY2x1ZGUgPHdsYW5fcWN0X3N5cy5oPgorI2luY2x1ZGUgPHZvc19hcGkuaD4KKworI2luY2x1ZGUgPHNpclR5cGVzLmg+ICAgLy8gbmVlZGVkIGZvciB0U2lyUmV0U3RhdHVzCisjaW5jbHVkZSA8c2lyUGFyYW1zLmg+ICAvLyBuZWVkZWQgZm9yIHRTaXJNYk1zZworI2luY2x1ZGUgPHNpckFwaS5oPiAgICAgLy8gbmVlZGVkIGZvciBTSVJfLi4uIG1lc3NhZ2UgdHlwZXMKKyNpbmNsdWRlIDx3bmlBcGkuaD4gICAgIC8vIG5lZWRlZCBmb3IgV05JXy4uLiBtZXNzYWdlIHR5cGVzCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgPGhhbENvbW1vbkFwaS5oPiAgLy8gbmVlZGVkIGZvciBoYWxNbWhQb3N0TXNnQXBpKCkKKyNlbmRpZgorI2luY2x1ZGUgInNtZV9BcGkuaCIKKyNpbmNsdWRlICJtYWNJbml0QXBpLmgiCisKKyNpZm5kZWYgV0xBTl9GVE1fU1RVQgorVk9TX1NUQVRVUyBXTEFORlRNX01jUHJvY2Vzc01zZyAodl9WT0lEX3QgKm1lc3NhZ2UpOworCisjZW5kaWYKKworCisvLyBDb29raWUgZm9yIFNZUyBtZXNzYWdlcy4gIE5vdGUgdGhhdCBhbnlvbmUgcG9zdGluZyBhIFNZUyBNZXNzYWdlIGhhcyB0bworLy8gd3JpdGUgdGhlIENPT0tJRSBpbiB0aGUgcmVzZXJ2ZWQgZmllbGQgb2YgdGhlIG1lc3NhZ2UuICBUaGUgU1lTIE1vZHVsZQorLy8gcmVsaWVzIG9uIHRoaXMgQ09PS0lFCisjaWZuZGVmIFdMQU5fRlRNX1NUVUIKKyNkZWZpbmUgU1lTX01TR19JRF9GVE1fUlNQICAgICAgMTEKKyNkZWZpbmUgRlRNX1NZU19NU0dfQ09PS0lFICAgICAgMHhGQUNFCisjZW5kaWYKKworI2RlZmluZSBTWVNfTVNHX0NPT0tJRSAoIDB4RkFDRSApCisKKy8vIG5lZWQgdG8gZGVmaW5lIEZJRUxEX09GRlNFVCBmb3Igbm9uLVdNIHBsYXRmb3JtcworI2lmbmRlZiBGSUVMRF9PRkZTRVQKKyNkZWZpbmUgRklFTERfT0ZGU0VUKHgseSkgb2Zmc2V0b2YoeCx5KQorI2VuZGlmCisKK1ZPU19TVEFUVVMgc3lzX1NlbmRTbWVTdGFydFJlcSggdl9DT05URVhUX3QgcFZvc0NvbnRleHQgKTsKKworLy8gYWRkIHRoaXMgdG8gdGhlIHN5cyBDb250ZXh0IGRhdGEuLi4gPwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHN5c1Jlc3BvbnNlQ2JhY2sgbWNTdGFydENCOworICAgdl9WT0lEX3QgKiAgICAgICBtY1N0YXJ0VXNlckRhdGE7CisKK30gc3lzQ29udGV4dERhdGE7CisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DICkKKy8vIGtlZXAgc29tZSBzdGF0aWMgZ2xvYmFsIHN5cyBjb250ZXh0IGZvciB0aGUgdGltZSBiZWluZy4uLiBTaG91bGQgd2UgbW92ZSB0aGlzCisvLyBpbnRvICdjb250ZXh0JyBkYXRhPyAgUHJvYmFibHkgbm90LCBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgcGVyc2lzdGVudCBleGNlcHQKKy8vIGR1cmluZyB0aGlzIG1lc3NhZ2luZyBzZXF1ZW5jZS4KK3N0YXRpYyBzeXNDb250ZXh0RGF0YSBnU3lzQ29udGV4dDsKKyNlbmRpZgorCitzdGF0aWMgdm9zX2V2ZW50X3QgZ1N0b3BFdnQ7CisKK1ZPU19TVEFUVVMgc3lzQnVpbGRNZXNzYWdlSGVhZGVyKCBTWVNfTVNHX0lEIHN5c01zZ0lkLCB2b3NfbXNnX3QgKnBNc2cgKQoreworICAgcE1zZy0+dHlwZSAgICAgPSBzeXNNc2dJZDsKKyAgIHBNc2ctPnJlc2VydmVkID0gU1lTX01TR19DT09LSUU7CisKKyAgIHJldHVybiggVk9TX1NUQVRVU19TVUNDRVNTICk7Cit9CisKKworVk9TX1NUQVRVUyBzeXNPcGVuKCB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCApCit7CisgICByZXR1cm4oIFZPU19TVEFUVVNfU1VDQ0VTUyApOworfQorCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DICkKK1ZPU19TVEFUVVMgc3lzTWNTdGFydCggdl9DT05URVhUX3QgcFZvc0NvbnRleHQsIHN5c1Jlc3BvbnNlQ2JhY2sgdXNlckNhbGxiYWNrLCB2X1ZPSURfdCAqcFVzZXJEYXRhICkKK3sKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdm9zX21zZ190IHN5c01zZzsKKworICAgc3lzQnVpbGRNZXNzYWdlSGVhZGVyKCBTWVNfTVNHX0lEX01DX1NUQVJULCAmc3lzTXNnICk7CisKKyAgIC8vIFNhdmUgdGhlIHVzZXIgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YSB0byBjYWxsYmFjayBpbiB0aGUgYm9keSBwb2ludGVyCisgICAvLyBhbmQgYm9keSBkYXRhIHBvcnRpb24gb2YgdGhlIG1lc3NhZ2UuCisgICAvLyBmaW5pc2hlZC4KKyAgIHN5c01zZy5ib2R5cHRyID0gKHZvaWQgKil1c2VyQ2FsbGJhY2s7CisgICBzeXNNc2cuYm9keXZhbCA9ICh2X1UzMl90KXBVc2VyRGF0YTsKKworICAgLy8gcG9zdCB0aGUgbWVzc2FnZS4uCisgICB2b3NTdGF0dXMgPSB2b3NfbXFfcG9zdF9tZXNzYWdlKCBWT1NfTVFfSURfU1lTLCAmc3lzTXNnICk7CisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCisgICB7CisgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfQkFETVNHOworICAgfQorCisgICByZXR1cm4oIHZvc1N0YXR1cyApOworfQorI2VuZGlmICAvKiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DICovCisKK3ZfVk9JRF90IHN5c1N0b3BDb21wbGV0ZUNiCisoCisgIHZfVk9JRF90ICpwVXNlckRhdGEKKykKK3sKKyAgdm9zX2V2ZW50X3QqIHBTdG9wRXZ0ID0gKHZvc19ldmVudF90ICopIHBVc2VyRGF0YTsKKyAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIHZvc1N0YXR1cyA9IHZvc19ldmVudF9zZXQoIHBTdG9wRXZ0ICk7CisgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyAoIHZvc1N0YXR1cyApICk7CisKK30gLyogdm9zX3N5c19zdG9wX2NvbXBsZXRlX2NiYWNrKCkgKi8KKworVk9TX1NUQVRVUyBzeXNTdG9wKCB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCApCit7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZvc19tc2dfdCBzeXNNc2c7CisgICB2X1U4X3QgZXZ0SW5kZXg7CisKKyAgIC8qIEluaXRpYWxpemUgdGhlIHN0b3AgZXZlbnQgKi8KKyAgIHZvc1N0YXR1cyA9IHZvc19ldmVudF9pbml0KCAmZ1N0b3BFdnQgKTsKKworICAgaWYoISBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApKQorICAgeworICAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgIH0KKworICAgLyogcG9zdCBhIG1lc3NhZ2UgdG8gU1lTIG1vZHVsZSBpbiBNQyB0byBzdG9wIFNNRSBhbmQgTUFDICovCisgICBzeXNCdWlsZE1lc3NhZ2VIZWFkZXIoIFNZU19NU0dfSURfTUNfU1RPUCwgJnN5c01zZyApOworCisgICAvLyBTYXZlIHRoZSB1c2VyIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEgdG8gY2FsbGJhY2sgaW4gdGhlIGJvZHkgcG9pbnRlcgorICAgLy8gYW5kIGJvZHkgZGF0YSBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlLgorICAgLy8gZmluaXNoZWQuCisgICBzeXNNc2cuYm9keXB0ciA9ICh2b2lkICopc3lzU3RvcENvbXBsZXRlQ2I7CisgICBzeXNNc2cuYm9keXZhbCA9ICh2X1UzMl90KSAmZ1N0b3BFdnQ7CisKKyAgIC8vIHBvc3QgdGhlIG1lc3NhZ2UuLgorICAgdm9zU3RhdHVzID0gdm9zX21xX3Bvc3RfbWVzc2FnZSggVk9TX01RX0lEX1NZUywgJnN5c01zZyApOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQorICAgeworICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0JBRE1TRzsKKyAgIH0KKworICAgdm9zU3RhdHVzID0gdm9zX3dhaXRfZXZlbnRzKCAmZ1N0b3BFdnQsIDEsIDAsICZldnRJbmRleCApOworICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTICggdm9zU3RhdHVzICkgKTsKKworICAgdm9zU3RhdHVzID0gdm9zX2V2ZW50X2Rlc3Ryb3koICZnU3RvcEV2dCApOworICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTICggdm9zU3RhdHVzICkgKTsKKworICAgcmV0dXJuKCB2b3NTdGF0dXMgKTsKK30KKworCitWT1NfU1RBVFVTIHN5c0Nsb3NlKCB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCApCit7CisgICByZXR1cm4oIFZPU19TVEFUVVNfU1VDQ0VTUyApOworfQorCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DICkKK3N0YXRpYyBWT1NfU1RBVFVTIHN5c19Qb3N0TWNUaHJlYWRQcm9iZU1zZyggdl9DT05URVhUX3QgcFZvc0NvbnRleHQsIHN5c1Jlc3BvbnNlQ2JhY2sgdXNlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKnBVc2VyRGF0YSwgU1lTX01TR19JRCBzeXNNc2dJZCApCit7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZvc19tc2dfdCBzeXNNc2c7CisgICB0U2lyUmV0U3RhdHVzIHNpclN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICBzeXNCdWlsZE1lc3NhZ2VIZWFkZXIoIHN5c01zZ0lkLCAmc3lzTXNnICk7CisKKworICAgLy8gU2F2ZSB0aGUgdXNlciBjYWxsYmFjayBhbmQgdXNlciBkYXRhIHRvIGNhbGxiYWNrIGluIHRoZSBib2R5IHBvaW50ZXIKKyAgIC8vIGFuZCBib2R5IGRhdGEgcG9ydGlvbiBvZiB0aGUgbWVzc2FnZS4KKyAgIHN5c01zZy5ib2R5cHRyID0gKHZvaWQgKil1c2VyQ2FsbGJhY2s7CisgICBzeXNNc2cuYm9keXZhbCA9ICh2X1UzMl90KXBVc2VyRGF0YTsKKworICAgLy8gUG9zdCB0aGUgbWVzc2FnZS4uLgorICAgdm9zU3RhdHVzID0gdm9zX21xX3Bvc3RfbWVzc2FnZSggVk9TX01RX0lEX1NZUywgJnN5c01zZyApOworCisgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBzaXJTdGF0dXMgKQorICAgeworICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0JBRE1TRzsKKyAgIH0KKworICAgcmV0dXJuKCB2b3NTdGF0dXMgKTsKK30KKworCitzdGF0aWMgVk9TX1NUQVRVUyBzeXNfUG9zdFR4VGhyZWFkUHJvYmVNc2coIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0LCBzeXNSZXNwb25zZUNiYWNrIHVzZXJDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICpwVXNlckRhdGEsIFNZU19NU0dfSUQgc3lzTXNnSWQgKQoreworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB2b3NfbXNnX3Qgc3lzTXNnOworICAgdFNpclJldFN0YXR1cyBzaXJTdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgc3lzQnVpbGRNZXNzYWdlSGVhZGVyKCBzeXNNc2dJZCwgJnN5c01zZyApOworCisKKyAgIC8vIFNhdmUgdGhlIHVzZXIgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YSB0byBjYWxsYmFjayBpbiB0aGUgYm9keSBwb2ludGVyCisgICAvLyBhbmQgYm9keSBkYXRhIHBvcnRpb24gb2YgdGhlIG1lc3NhZ2UuCisgICBzeXNNc2cuYm9keXB0ciA9ICh2b2lkICopdXNlckNhbGxiYWNrOworICAgc3lzTXNnLmJvZHl2YWwgPSAodl9VMzJfdClwVXNlckRhdGE7CisKKyAgIC8vIFBvc3QgdGhlIG1lc3NhZ2UuLi4KKyAgIHZvc1N0YXR1cyA9IHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NUV9JRF9TWVMsICZzeXNNc2cgKTsKKworICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gc2lyU3RhdHVzICkKKyAgIHsKKyAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9CQURNU0c7CisgICB9CisKKyAgIHJldHVybiggdm9zU3RhdHVzICk7Cit9CisKKwordl9WT0lEX3Qgc3lzTWNUaHJlYWRQcm9iZSggdl9DT05URVhUX3QgcFZvc0NvbnRleHQsIHN5c1Jlc3BvbnNlQ2JhY2sgdXNlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKnBVc2VyRGF0YSApCit7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKworICAgdm9zU3RhdHVzID0gc3lzX1Bvc3RNY1RocmVhZFByb2JlTXNnKCBwVm9zQ29udGV4dCwgdXNlckNhbGxiYWNrLCBwVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNfTVNHX0lEX01DX1RIUl9QUk9CRSApOworCisgICBpZiAoVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSkKKyAgIHsKKyAgICAgIC8vIHdlIGNvdWxkIGhhdmUgcGxhY2UgdGhlIGFib3ZlIGNvbmRpdGlvbiB3aXRoaW4gVk9TX0FTU0VSVCwgYnV0CisgICAgICAvLyB1bmZvcnR1bmF0ZWx5IHRoYXQgd291bGQgY2F1c2UgYSBjb21waWxlciB3YXJuaW5nCisgICAgICBWT1NfQVNTRVJUKCAxICk7CisgICB9CisgICAvLyAhISBubyB3YXkgdG8gZmFpbCA/PworfQorCisKK3ZfVk9JRF90IHN5c1R4VGhyZWFkUHJvYmUoIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0LCBzeXNSZXNwb25zZUNiYWNrIHVzZXJDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICpwVXNlckRhdGEgKQoreworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisKKyAgIHZvc1N0YXR1cyA9IHN5c19Qb3N0VHhUaHJlYWRQcm9iZU1zZyggcFZvc0NvbnRleHQsIHVzZXJDYWxsYmFjaywgcFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTX01TR19JRF9UWF9USFJfUFJPQkUgKTsKKworICAgaWYgKFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkpCisgICB7CisgICAgICAvLyB3ZSBjb3VsZCBoYXZlIHBsYWNlIHRoZSBhYm92ZSBjb25kaXRpb24gd2l0aGluIFZPU19BU1NFUlQsIGJ1dAorICAgICAgLy8gdW5mb3J0dW5hdGVseSB0aGF0IHdvdWxkIGNhdXNlIGEgY29tcGlsZXIgd2FybmluZworICAgICAgVk9TX0FTU0VSVCggMSApOworICAgfQorICAgLy8gISEgbm8gd2F5IHRvIGZhaWwgPz8KK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DICovCisKKworCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyApCitzdGF0aWMgVk9TX1NUQVRVUyBzeXNfU2VuZEhhbEluaXRTdGFydFJlcU1zZyggdl9DT05URVhUX3QgcFZvc0NvbnRleHQgKQoreworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB0U2lyTWJNc2cgbXNnOworCisgICB0U2lyUmV0U3RhdHVzIHNpclN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgIHRTaXJNYk1zZyAqcE1zZyA9ICZtc2c7CisgICB2X1ZPSURfdCAqaEhhbDsKKworICAgZG8KKyAgIHsKKyAgICAgIC8vIGdldCB0aGUgSEFMIGNvbnRleHQuLi4KKyAgICAgIGhIYWwgPSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfSEFMLCBwVm9zQ29udGV4dCApOworICAgICAgaWYgKCBOVUxMID09IGhIYWwgKSBicmVhazsKKworICAgICAvLyBmb3JtYXQgdGhlIEluaXQgc3RhcnQgcmVxdWVzdCBtZXNzYWdlLiAgVGhpcyBtZXNzYWdlIGhhcworICAgICAvLyB0aGUgaGFsIGhhbmRsZSBpbiB0aGUgJ2RhdGEnIHBvcnRpb24gb2YgdGhlIG1lc3NhZ2UuCisgICAgIHBNc2ctPnR5cGUgPSBXREFfSU5JVF9TVEFSVF9SRVE7CisgICAgIHBNc2ctPmRhdGFbMF0gPSAodEFOSV9VMzIpaEhhbDsKKworICAgICAvLyBtZXNzYWdlIGxlbmd0aCBpcyA0IGdyZWF0ZXIgdGhhbiB0aGUgY29uZmlnIGRhdGEgc2l6ZQorICAgICAvLyBuZWVkIHRvIGFkZCBpbiBhbiBleHRyYSA0IGZvciB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgIHBNc2ctPm1zZ0xlbiA9IHNpemVvZiggdEhhbEhhbmRsZSApICsgRklFTERfT0ZGU0VUKCB0U2lyTWJNc2csIGRhdGEgKTsKKworICAgICAvLyBTZW5kIHRoZSBIQUwgSW5pdCBTdGFydCBSZXF1ZXN0IG1lc3NhZ2UuLi4KKyAgICAgc2lyU3RhdHVzID0gdU1hY1Bvc3RDdHJsTXNnKCBoSGFsLCBwTXNnICk7CisgICAgIGlmICggZVNJUl9TVUNDRVNTICE9IHNpclN0YXR1cyApCisgICAgIHsKKyAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgIH0KKworICB9IHdoaWxlKCAwICk7CisKKyAgIHJldHVybiggdm9zU3RhdHVzICk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyAqLworCisjaWYgZGVmaW5lZChfX0FOSV9DT01QSUxFUl9QUkFHTUFfUEFDS19TVEFDSykKKyNwcmFnbWEgcGFjayggcHVzaCApCisjcHJhZ21hIHBhY2soIDEgKQorI2VsaWYgZGVmaW5lZChfX0FOSV9DT01QSUxFUl9QUkFHTUFfUEFDSykKKyNwcmFnbWEgcGFjayggMSApCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc1BvbEZpbGVWZXJzaW9uCit7CisgIHVuc2lnbmVkIGNoYXIgIE1ham9yVmVyc2lvbjsKKyAgdW5zaWduZWQgY2hhciAgTWlub3JWZXJzaW9uOworICB1bnNpZ25lZCBjaGFyICBTdWZmaXg7CisgIHVuc2lnbmVkIGNoYXIgIEJ1aWxkOworCit9IHRQb2xGaWxlVmVyc2lvbjsKKworCit0eXBlZGVmIHN0cnVjdCBzUG9sRmlsZUhlYWRlcgoreworICB0UG9sRmlsZVZlcnNpb24gRmlsZVZlcnNpb247CisgIHRQb2xGaWxlVmVyc2lvbiBIV0NhcGFiaWxpdGllczsKKyAgdW5zaWduZWQgbG9uZyAgIEZpbGVMZW5ndGg7CisgIHVuc2lnbmVkIGxvbmcgICBOdW1EaXJlY3RvcnlFbnRyaWVzOworCit9IHRQb2xGaWxlSGVhZGVyOworCisKK3R5cGVkZWYgZW51bSBlUG9sRmlsZURpclR5cGVzCit7CisgIGVQT0xfRElSX1RZUEVfQk9PVExPQURFUiA9IDAsCisgIGVQT0xfRElSX1RZUEVfU1RBX0ZJUk1XQVJFLAorICBlUE9MX0RJUl9UWVBFX0FQX0ZJUk1XQVJFLAorICBlUE9MX0RJUl9UWVBFX0RJQUdfRklSTVdBUkUsCisgIGVQT0xfRElSX1RZUEVfU1RBX0NPTkZJRywKKyAgZVBPTF9ESVJfVFlQRV9BUF9DT05GSUcKKworfSB0UG9sRmlsZURpclR5cGVzOworCisKK3R5cGVkZWYgc3RydWN0IHNQb2xGaWxlRGlyRW50cnkKK3sKKyAgdW5zaWduZWQgbG9uZyBEaXJFbnRyeVR5cGU7CisgIHVuc2lnbmVkIGxvbmcgRGlyRW50cnlGaWxlT2Zmc2V0OworICB1bnNpZ25lZCBsb25nIERpckVudHJ5TGVuZ3RoOworCit9IHRQb2xGaWxlRGlyRW50cnk7CisKKyNpZiBkZWZpbmVkKF9fQU5JX0NPTVBJTEVSX1BSQUdNQV9QQUNLX1NUQUNLKQorI3ByYWdtYSBwYWNrKCBwb3AgKQorI2VuZGlmCisKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvbEZpbGVDaGtTdW0oIHVuc2lnbmVkIHNob3J0ICpGaWxlRGF0YSwgdW5zaWduZWQgbG9uZyBOdW1Xb3JkcyApCit7CisgIHVuc2lnbmVkIGxvbmcgU3VtOworCisgIGZvciAoIFN1bSA9IDA7IE51bVdvcmRzID4gMDsgTnVtV29yZHMtLSApCisgIHsKKyAgICBTdW0gKz0gKkZpbGVEYXRhKys7CisgIH0KKworICBTdW0gID0gKFN1bSA+PiAxNikgKyAoU3VtICYgMHhmZmZmKTsgLy8gYWRkIGNhcnJ5CisgIFN1bSArPSAoU3VtID4+IDE2KTsgICAgICAgICAgICAgICAgICAvLyBtYXliZSBsYXN0IHVuc2lnbmVkIHNob3J0CisKKyAgcmV0dXJuKCAodW5zaWduZWQgc2hvcnQpKCB+U3VtICkgKTsKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKK3N0YXRpYyB2X0JPT0xfdCBzeXNfdmFsaWRhdGVTdGFDb25maWcoIHZvaWQgKnBJbWFnZSwgdW5zaWduZWQgbG9uZyBjYkZpbGUsCisgICB2b2lkICoqcHBTdGFDb25maWcsIHZfU0laRV90ICpwY2JTdGFDb25maWcgKQorI2Vsc2UKK3ZfQk9PTF90IHN5c192YWxpZGF0ZVN0YUNvbmZpZyggdm9pZCAqcEltYWdlLCB1bnNpZ25lZCBsb25nIGNiRmlsZSwKKyAgIHZvaWQgKipwcFN0YUNvbmZpZywgdl9TSVpFX3QgKnBjYlN0YUNvbmZpZyApCisjZW5kaWYKK3sKKyAgIHZfQk9PTF90IGZGb3VuZCA9IFZPU19GQUxTRTsKKyAgIHRQb2xGaWxlSGVhZGVyICAgKnBGaWxlSGVhZGVyID0gTlVMTDsKKyAgIHRQb2xGaWxlRGlyRW50cnkgKnBEaXJFbnRyeSA9IE5VTEw7CisgICB2X1UzMl90IGlkeDsKKworICAgZG8KKyAgIHsKKyAgICAgIC8vIENvbXB1dGUgdGhlIGNoZWNrc3VtIGJlZm9yZSBib3RoZXJpbmcgdG8gY29weS4uLgorICAgICAgaWYgKCBwb2xGaWxlQ2hrU3VtKCAoIHZfVTE2X3QgKilwSW1hZ2UsIGNiRmlsZSAvIHNpemVvZiggdl9VMTZfdCApICkgKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHZhbGlkYXRlIHRoZSBjaGVja3N1bSBmb3IgQ0ZHIGJpbmFyeSIgICk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcEZpbGVIZWFkZXIgPSAodFBvbEZpbGVIZWFkZXIgKilwSW1hZ2U7CisKKyAgICAgICpwcFN0YUNvbmZpZyA9IE5VTEw7CisgICAgICAqcGNiU3RhQ29uZmlnID0gMDsKKworICAgICAgcERpckVudHJ5ID0gKCB0UG9sRmlsZURpckVudHJ5KiApICggcEZpbGVIZWFkZXIgKyAxICk7CisKKyAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IHBGaWxlSGVhZGVyLT5OdW1EaXJlY3RvcnlFbnRyaWVzOyArK2lkeCApCisgICAgICB7CisgICAgICAgICBpZiAoIGVQT0xfRElSX1RZUEVfU1RBX0NPTkZJRyA9PSBwRGlyRW50cnlbIGlkeCBdLkRpckVudHJ5VHlwZSApCisgICAgICAgICB7CisgICAgICAgICAgICAqcHBTdGFDb25maWcgPSBwRGlyRW50cnlbIGlkeCBdLkRpckVudHJ5RmlsZU9mZnNldCArICggdl9VOF90ICogKXBGaWxlSGVhZGVyOworCisgICAgICAgICAgICAqcGNiU3RhQ29uZmlnID0gcERpckVudHJ5WyBpZHggXS5EaXJFbnRyeUxlbmd0aDsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgIH0gLy8gRW5kIGl0ZXJhdGlvbiBvdmVyIHRoZSBoZWFkZXIncyBlbnRyaWVzCisKKyAgICAgIGlmICggTlVMTCAhPSAqcHBTdGFDb25maWcgICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICAgIkZvdW5kIHRoZSBTdGF0aW9uIENGRyBpbiB0aGUgQ0ZHIGJpbmFyeSEhIiApOworCisgICAgICAgICBmRm91bmQgPSBWT1NfVFJVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmaW5kIFN0YXRpb24gQ0ZHIGluIHRoZSBDRkcgYmluYXJ5IiApOworICAgICAgfQorCisgICB9IHdoaWxlKCAwICk7CisKKyAgIFZPU19BU1NFUlQoIFZPU19UUlVFID09IGZGb3VuZCApOworCisgICByZXR1cm4oIGZGb3VuZCApOworfQorCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyApCitzdGF0aWMgdl9VOF90IF92SW1hZ2VBcnJheVsxNTAwMF07CisKK3N0YXRpYyBWT1NfU1RBVFVTIHN5c19nZXRDZmdCaW5hcnlNc2dCdWZmZXIoIHRTaXJNYk1zZyAqKnBwTXNnLCB2X1NJWkVfdCAqcGNiQ2ZnQmluYXJ5ICkKK3sKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisKKyAgIHZfVk9JRF90ICpwRmlsZUltYWdlID0gTlVMTDsKKyAgIHZfU0laRV90IGNiRmlsZUltYWdlID0gMDsKKworICAgdl9WT0lEX3QgKnBDZmdCaW5hcnkgPSBOVUxMOworICAgdl9TSVpFX3QgY2JDZmdCaW5hcnkgPSAwOworCisgICB2X0JPT0xfdCBiU3RhdHVzID0gVk9TX0ZBTFNFOworCisgICBkbworICAgeworICAgICAgLy8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIENGRyBCaW5hcnkuLi4KKyAgICAgIHZvc1N0YXR1cyA9IHZvc19nZXRfYmluYXJ5X2Jsb2IoIFZPU19CSU5BUllfSURfQ09ORklHLCBOVUxMLCAmY2JGaWxlSW1hZ2UgKTsKKyAgICAgIGlmICggVk9TX1NUQVRVU19FX05PTUVNICE9IHZvc1N0YXR1cyApCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBvYnRhaW5pbmcgYmluYXJ5IHNpemUiICk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gbWFsbG9jIGEgYnVmZmVyIHRvIHJlYWQgaW4gdGhlIENvbmZpZ3VyYXRpb24gYmluYXJ5IGZpbGUuCisgICAgICAvL3BGaWxlSW1hZ2UgPSB2b3NfbWVtX21hbGxvYyggY2JGaWxlSW1hZ2UgKTsKKyAgICAgIHBGaWxlSW1hZ2UgPSAodl9WT0lEX3QqKV92SW1hZ2VBcnJheTsKKworICAgICAgaWYgKCBOVUxMID09IHBGaWxlSW1hZ2UgKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIENGRyBiaW5hcnkgW3NpemU9ICVkIGJ5dGVzXSIsCisgICAgICAgICAgICAgICAgICAgIGNiRmlsZUltYWdlICk7CisKKyAgICAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9OT01FTTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBHZXQgdGhlIGVudGlyZSBDRkcgZmlsZSBpbWFnZS4uLgorICAgICAgdm9zU3RhdHVzID0gdm9zX2dldF9iaW5hcnlfYmxvYiggVk9TX0JJTkFSWV9JRF9DT05GSUcsIHBGaWxlSW1hZ2UsICZjYkZpbGVJbWFnZSApOworICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJFcnJvcjogQ2Fubm90IHJldHJpZXZlIENGRyBmaW5lIGltYWdlIGZyb20gdk9TUy4gW3NpemU9ICVkIGJ5dGVzXSIsCisgICAgICAgICAgICAgICAgICAgIGNiRmlsZUltYWdlICk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gVmFsaWRhdGUgdGhlIGJpbmFyeSBpbWFnZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIGFuZCBsZW5ndGgKKyAgICAgIC8vIHdoZXJlIHRoZSBDRkcgYmluYXJ5IGlzIGxvY2F0ZWQgd2l0aGluIHRoZSBiaW5hcnkgaW1hZ2UgZmlsZS4KKyAgICAgIGJTdGF0dXMgPSBzeXNfdmFsaWRhdGVTdGFDb25maWcoIHBGaWxlSW1hZ2UsIGNiRmlsZUltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENmZ0JpbmFyeSwgJmNiQ2ZnQmluYXJ5ICk7CisgICAgICBpZiAoIFZPU19GQUxTRSA9PSBiU3RhdHVzICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yOiBDYW5ub3QgZmluZCBTVEEgQ0ZHIGluIGJpbmFyeSBpbWFnZSBmaWxlemUiICk7CisgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBjYWxsZXIgd2FudHMgdG8ga25vdyB0aGUgc2l6ZSBvZiB0aGUgY2ZnIEJpbmFyeS4gIFJldHVybiBpdC4KKyAgICAgICpwY2JDZmdCaW5hcnkgPSBjYkNmZ0JpbmFyeTsKKworICAgICAgLy8gVG8gYnVpbGQgdGhlIENGRyBkb3dubG9hZCBtZXNzYWdlLCB3ZSBuZWVkIGJ1aWxkIGEgYnVmZmVyIHRoYXQgaW5jbHVkZXMgdGhlCisgICAgICAvLyB0U2lyTWJNc2cgaGVhZGVyIGZvbGxvd2VkIGJ5IHRoZSBDRkcgZGF0YS4gIFNvIGFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgdGhlCisgICAgICAvLyBDRkcgYmluYXJ5IHBsdXMgdGhlIG1lc3NhZ2UgaGVhZGVyLgorICAgICAgLy8KKyAgICAgIC8vIFRoaXMgYnVmZmVyICh0aGUgdFNpciBtZXNzYWdlKSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLi4uCisgICAgICAqcHBNc2cgPSB2b3NfbWVtX21hbGxvYyggY2JDZmdCaW5hcnkgKyBGSUVMRF9PRkZTRVQoIHRTaXJNYk1zZywgZGF0YSApICk7CisgICAgICBpZiAoIE5VTEwgPT0gKnBwTXNnICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBDRkcgZG93bmxvYWQgbWVzc2FnZSAiCisgICAgICAgICAgICAgICAgICAgICJidWZmZXIgW3NpemU9ICVkIGJ5dGVzXSIsCisgICAgICAgICAgICAgICAgICAgIGNiQ2ZnQmluYXJ5ICsgRklFTERfT0ZGU0VUKCB0U2lyTWJNc2csIGRhdGEgKSApOworCisgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gY29weSB0aGUgQ0ZHIGJpbmFyeSBkYXRhIGludG8gdGhlIENGRyBkb3dubG9hZCBtZXNzYWdlIGJ1ZmZlci4uLgorICAgICAgdm9zX21lbV9jb3B5KCAodl9WT0lEX3QgKikoICggKnBwTXNnICktPmRhdGEgKSwgcENmZ0JpbmFyeSAsIGNiQ2ZnQmluYXJ5ICk7CisKKyAgICAgIC8vIGlmIHdlIGdldCBoZXJlLCB3ZSBoYXZlIHN1Y2NlZWRlZCEKKyAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgfSB3aGlsZSggMCApOworCisgICAvLyBBbHdheXMgbmVlZCB0byBmcmVlIHRoZSBidWZmZXIgd2hlcmUgdGhlIGJpbmFyeSBpbWFnZSBmaWxlIHdhcworICAgLy8gdGVtcG9yYXJpbHkgcmVhZC4uLgorICAgaWYgKCBOVUxMID09IHBGaWxlSW1hZ2UgKQorICAgeworICAgICAvLyB2b3NfbWVtX2ZyZWUoIHBGaWxlSW1hZ2UgKTsKKyAgIH0KKworICAgLy8gSWYgZmFpbGVkIGFuZCB3ZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHRoZSBtZW1vcnkgZm9yIHRoZSBDRkcKKyAgIC8vIGJpbmFyeSBkb3dubG9hZCBtZXNzYWdlLCBuZWVkIHRvIGZyZWUgdGhhdCBtZW1vcnkuICBJZiBzdWNjZWVkZWQsCisgICAvLyB0aGUgY2FsbGVyIGlzIGdvaW5nIHRvIGZyZWUgdGhpcyBtZW1vcnkgd2hlbiBpdCBpcyBkb25lIHNlbmRpbmcKKyAgIC8vIHRoZSBtZXNzYWdlLgorICAgaWYgKCAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkgJiYgKCBOVUxMICE9ICpwcE1zZyApICkKKyAgIHsKKyAgICAgIHZvc19tZW1fZnJlZSggKnBwTXNnICk7CisgICAgICAqcHBNc2cgPSBOVUxMOworICAgICAgKnBjYkNmZ0JpbmFyeSA9IDA7CisgICB9CisKKyAgIHJldHVybiggdm9zU3RhdHVzICk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyAqLworCisKKworCisKKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MgKQorc3RhdGljIFZPU19TVEFUVVMgc3lzX1NlbmRXbmlDZmdEbmxkTXNnKCB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCApCit7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworCisgICB0U2lyUmV0U3RhdHVzIHNpclN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgIHRTaXJNYk1zZyAqcE1zZyA9IE5VTEw7CisgICB2X1ZPSURfdCAqaEhhbCAgPSBOVUxMOworCisgICB2X1NJWkVfdCBjYkNmZ0JpbmFyeSA9IDA7CisKKyAgIGRvCisgICB7CisgICAgICBoSGFsID0gdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0hBTCwgcFZvc0NvbnRleHQgKTsKKyAgICAgIGlmICggTlVMTCA9PSBoSGFsICkgYnJlYWs7CisKKyAgICAgIHZvc1N0YXR1cyA9IHN5c19nZXRDZmdCaW5hcnlNc2dCdWZmZXIoICZwTXNnLCAmY2JDZmdCaW5hcnkgKTsKKyAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKSBicmVhazsKKworICAgICAgcE1zZy0+dHlwZSA9IFdOSV9DRkdfRE5MRF9SU1A7CisKKyAgICAgIC8vIG1lc3NhZ2UgbGVuZ3RoIGlzIDQgZ3JlYXRlciB0aGFuIHRoZSBjb25maWcgZGF0YSBzaXplCisgICAgICAvLyBuZWVkIHRvIGFkZCBpbiBhbiBleHRyYSA0IGZvciB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgICBwTXNnLT5tc2dMZW4gPSAodEFOSV9VMTYpKCBjYkNmZ0JpbmFyeSArIEZJRUxEX09GRlNFVCggdFNpck1iTXNnLCBkYXRhICkgKTsKKworICAgICAgc2lyU3RhdHVzID0gaGFsTW1oRm9yd2FyZE1CbXNnKCBoSGFsLCBwTXNnICk7CisgICAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBzaXJTdGF0dXMgKQorICAgICAgeworICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisgICAgICB2b3NfbWVtX2ZyZWUocE1zZyk7CisgICB9IHdoaWxlKCAwICk7CisKKyAgIHJldHVybiggdm9zU3RhdHVzICk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyAqLworCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DICkKK1ZPU19TVEFUVVMgc3lzX1NlbmRTbWVTdGFydFJlcSggdl9DT05URVhUX3QgcFZvc0NvbnRleHQgKQoreworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB0U2lyU21lU3RhcnRSZXEgbXNnOworCisgICB0U2lyUmV0U3RhdHVzIHNpclN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgIHRTaXJTbWVTdGFydFJlcSAqcE1zZyA9ICZtc2c7CisgICB2X1ZPSURfdCAqaEhhbDsKKworICAgZG8KKyAgIHsKKyAgICAgIC8vIGdldCB0aGUgSEFMIGNvbnRleHQuLi4KKyAgICAgIGhIYWwgPSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfSEFMLCBwVm9zQ29udGV4dCApOworICAgICAgaWYgKCBOVUxMID09IGhIYWwgKSBicmVhazsKKworICAgICAgLy8gZm9ybWF0IHRoZSBTbWUgU3RhcnQgUmVxdWVzdCBtZXNzYWdlLiAgVGhpcyBtZXNzYWdlIGhhcworICAgICAgLy8gdGhlIGhhbCBoYW5kbGUgaW4gdGhlICdkYXRhJyBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlLgorICAgICAgcE1zZy0+bWVzc2FnZVR5cGUgICAgICA9IGVXTklfU01FX1NUQVJUX1JFUTsKKyAgICAgIHBNc2ctPmxlbmd0aCAgICAgICAgICAgPSBzaXplb2YoIG1zZyApOworICAgICAgcE1zZy0+cm9hbWluZ0F0UG9sYXJpcyA9IDA7CisgICAgICBwTXNnLT5zZW5kTmV3QnNzSW5kICAgID0gMDsKKworICAgICAvLyBTZW5kIHRoZSBIQUwgSW5pdCBTdGFydCBSZXF1ZXN0IG1lc3NhZ2UuLi4KKyAgICAgc2lyU3RhdHVzID0gaGFsTW1oRm9yd2FyZE1CbXNnKCBoSGFsLCAodFNpck1iTXNnICopcE1zZyApOworICAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBzaXJTdGF0dXMgKQorICAgICB7CisgICAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICB9CisKKyAgfSB3aGlsZSggMCApOworCisgICByZXR1cm4oIHZvc1N0YXR1cyApOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MgKi8KKworVk9TX1NUQVRVUyBzeXNNY1Byb2Nlc3NNc2coIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0LCB2b3NfbXNnX3QgKnBNc2cgKQoreworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB2X1ZPSURfdCAqaEhhbDsKKworICAgVk9TX0FTU0VSVCggcE1zZyApOworCisgICAvLyBBbGwgJ25ldycgU1lTIG1lc3NhZ2VzIGFyZSBpZGVudGlmaWVkIGJ5IGEgY29va2llIGluIHRoZSByZXNlcnZlZAorICAgLy8gZmllbGQgb2YgdGhlIG1lc3NhZ2UgYXMgd2VsbCBhcyB0aGUgbWVzc2FnZSB0eXBlLiAgVGhpcyBwcmV2ZW50cworICAgLy8gdGhlIHBvc3NpYmlsaXR5IG9mIG92ZXJsYXAgaW4gdGhlIG1lc3NhZ2UgdHlwZXMgZGVmaW5lZCBmb3IgbmV3CisgICAvLyBTWVMgbWVzc2FnZXMgd2l0aCB0aGUgJ2xlZ2FjeScgbWVzc2FnZSB0eXBlcy4gIFRoZSBsZWdhY3kgbWVzc2FnZXMKKyAgIC8vIHdpbGwgbm90IGhhdmUgdGhpcyBjb29raWUgaW4gdGhlIHJlc2VydmVkIGZpZWxkCisgICBpZiAoIFNZU19NU0dfQ09PS0lFID09IHBNc2ctPnJlc2VydmVkICkKKyAgIHsKKyAgICAgIC8vIFByb2Nlc3MgYWxsIHRoZSBuZXcgU1lTIG1lc3NhZ2VzLi4KKyAgICAgIHN3aXRjaCggcE1zZy0+dHlwZSApCisgICAgICB7CisgICAgICAgICBjYXNlIFNZU19NU0dfSURfTUNfU1RBUlQ6CisgICAgICAgICB7CisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyApCisgICAgICAgICAgICAvLyBzYXZlIHRoZSBjYWxsYmFjayBwb2ludGVyIGFuZCB1c2VyIGRhdGEgaW4gdGhlIGNvbnRleHQKKyAgICAgICAgICAgIC8vIGRhdGEKKyAgICAgICAgICAgIGdTeXNDb250ZXh0Lm1jU3RhcnRDQiA9IChzeXNSZXNwb25zZUNiYWNrKXBNc2ctPmJvZHlwdHI7CisgICAgICAgICAgICBnU3lzQ29udGV4dC5tY1N0YXJ0VXNlckRhdGE9ICh2X1ZPSURfdCAqKXBNc2ctPmJvZHl2YWw7CisKKyAgICAgICAgICAgIC8vIFRyaWdnZXIgdGhlIENGRyBkb3dubG9hZCBzZXF1ZW5jZSBieSBzZW5kaW5nIHRoZQorICAgICAgICAgICAgLy8gU0lSX0hBTF9JTklUX1NUQVJUX1JFUSBtZXNzYWdlIHRvIHRoZSBtYWMgbW9kdWxlLgorICAgICAgICAgICAgdm9zU3RhdHVzID0gc3lzX1NlbmRIYWxJbml0U3RhcnRSZXFNc2coIHBWb3NDb250ZXh0ICk7CisjZWxzZQorICAgICAgICAgICAgLyogSGFuZGxpbmcgZm9yIHRoaXMgbWVzc2FnZSBpcyBub3QgbmVlZGVkIG5vdyBzbyBhZGRpbmcgCisgICAgICAgICAgICAgKmRlYnVnIHByaW50IGFuZCBWT1NfQVNTRVJUKi8KKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiBSZWNlaXZlZCBTWVNfTVNHX0lEX01DX1NUQVJUIG1lc3NhZ2UgbXNnVHlwZT0gJWQgWzB4JTA4bHhdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcE1zZy0+dHlwZSwgcE1zZy0+dHlwZSApOworICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgU1lTX01TR19JRF9NQ19TVE9QOgorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzaW5nIFNZUyBNQyBTVE9QIiApOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIEhBTCBjb250ZXh0Li4uCisgICAgICAgICAgICBoSGFsID0gdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX1BFLCBwVm9zQ29udGV4dCApOworICAgICAgICAgICAgaWYgKE5VTEwgPT0gaEhhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIGhIYWwiLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IHNtZV9TdG9wKCBoSGFsLCBUUlVFICk7CisgICAgICAgICAgICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisKKyAgICAgICAgICAgICAgIHZvc1N0YXR1cyA9IG1hY1N0b3AoIGhIYWwsIEhBTF9TVE9QX1RZUEVfU1lTX0RFRVBfU0xFRVAgKTsKKyAgICAgICAgICAgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKworICAgICAgICAgICAgICAgKChzeXNSZXNwb25zZUNiYWNrKXBNc2ctPmJvZHlwdHIpKCh2X1ZPSURfdCAqKXBNc2ctPmJvZHl2YWwpOworCisgICAgICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgLy8gUHJvY2VzcyBNQyB0aHJlYWQgcHJvYmUuICBKdXN0IGNhbGxiYWNrIHRvIHRoZQorICAgICAgICAgLy8gZnVuY3Rpb24gdGhhdCBpcyBpbiB0aGUgbWVzc2FnZS4KKyAgICAgICAgIGNhc2UgU1lTX01TR19JRF9NQ19USFJfUFJPQkU6CisgICAgICAgICB7CisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyApCisgICAgICAgICAgICBzeXNSZXNwb25zZUNiYWNrIGNhbGxiYWNrOworCisgICAgICAgICAgICAvLyBNYWtlIGEgY2FsbGJhY2sgdG8gdGhlIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBpbmZvCisgICAgICAgICAgICAvLyBpbiB0aGUgbWVzc2FnZSAoY2FsbGJhY2sgaXMgaW4gYm9keXB0ciBhbmQgdXNlcgorICAgICAgICAgICAgLy8gZGF0YSBpcyBpbiBib2R5dmFsKQorICAgICAgICAgICAgY2FsbGJhY2sgPSAoc3lzUmVzcG9uc2VDYmFjaylwTXNnLT5ib2R5cHRyOworCisgICAgICAgICAgICBjYWxsYmFjayggKHZfVk9JRF90ICopcE1zZy0+Ym9keXZhbCApOworI2Vsc2UKKyAgICAgICAgICAgIC8qIEhhbmRsaW5nIGZvciB0aGlzIG1lc3NhZ2UgaXMgbm90IG5lZWRlZCBub3cgc28gYWRkaW5nIAorICAgICAgICAgICAgICpkZWJ1ZyBwcmludCBhbmQgVk9TX0FTU0VSVCovCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIgUmVjZWl2ZWQgU1lTX01TR19JRF9NQ19USFJfUFJPQkUgbWVzc2FnZSBtc2dUeXBlPSAlZCBbMHglMDhseF0iLAorICAgICAgICAgICAgICAgICAgICAgICBwTXNnLT50eXBlLCBwTXNnLT50eXBlICk7CisgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSBTWVNfTVNHX0lEX01DX1RJTUVSOgorICAgICAgICAgeworICAgICAgICAgICAgdm9zX3RpbWVyX2NhbGxiYWNrX3QgdGltZXJDQjsKKyAgICAgICAgICAgIC8vIGh1bW1tbS4uLiBub3RlIHNheXMuLi4KKyAgICAgICAgICAgIC8vIGludm9rZSB0aGUgdGltZXIgY2FsbGJhY2sgYW5kIHRoZSB1c2VyIGRhdGEgc3RpY2sKKyAgICAgICAgICAgIC8vIGludG8gdGhlIGJvZHl2YWw7IG5vIGJvZHkgdG8gZnJlZS4gICAgSSB0aGluayB0aGlzIGlzCisgICAgICAgICAgICAvLyB3aGF0IHRoYXQgbWVhbnMuCisgICAgICAgICAgICB0aW1lckNCID0gKHZvc190aW1lcl9jYWxsYmFja190KXBNc2ctPmJvZHlwdHI7CisKKyAgICAgICAgICAgIC8vIG1ha2UgdGhlIGNhbGxiYWNrIHRvIHRoZSB0aW1lciByb3V0aW5lLi4uCisgICAgICAgICAgICB0aW1lckNCKCAodl9WT0lEX3QgKilwTXNnLT5ib2R5dmFsICk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorI2lmbmRlZiBXTEFOX0ZUTV9TVFVCCisgICAgICAgICBjYXNlIFNZU19NU0dfSURfRlRNX1JTUDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBXTEFORlRNX01jUHJvY2Vzc01zZygodl9WT0lEX3QgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBtZXNzYWdlIHR5cGUgaW4gc3lzTWNQcm9jZXNzTXNnKCkgbXNnVHlwZT0gJWQgWzB4JTA4bHhdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcE1zZy0+dHlwZSwgcE1zZy0+dHlwZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgfSAgIC8vIGVuZCBzd2l0Y2ggb24gbWVzc2FnZSB0eXBlCisKKyAgIH0gICAvLyBlbmQgaWYgY29va2llIHNldAorICAgZWxzZQorICAgeworICAgICAgLy8gUHJvY2VzcyBhbGwgJ2xlZ2FjeScgbWVzc2FnZXMKKyAgICAgIHN3aXRjaCggcE1zZy0+dHlwZSApCisgICAgICB7CisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyApCisgICAgICAgICAvKiBIYW5kbGluZyBmb3IgdGhlc2UgbWVzc2FnZXMgYXJlIG5vdCBuZWVkZWQgbm93LiBJZiBhIHJlcXVlc3QgY29tZXMgZm9yIAorICAgICAgICAgICAgdGhlc2UgbWVzc2FnZXMgdGhleSB3aWxsIGdvdG8gZGVmYXVsdCBhbmQgZ2l2ZSBWT1NfQVNTRVJUKi8KKyAgICAgICAgIGNhc2UgV0RBX0FQUF9TRVRVUF9OVEY6CisgICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZSBnZXQgdGhpcyBtZXNzYWdlIGFmdGVyIHdlIHNlbmQgU0lSX0hBTF9JTklUX1NUQVJUX1JFUSBidXQKKyAgICAgICAgICAgIC8vIHdlIGhhdmUgbm90aGluZyB0byBkby4gIFRoaXMgb25lIGlzIHNhZmVseSBpZ25vcmVkLiAgRm9sbG93aW5nCisgICAgICAgICAgICAvLyB0aGlzIG1lc3NhZ2Ugd2Ugd2lsbCBnZXQgdGhlIFdOSV9DRkdfRE5MRF9SRVEgZnJvbSB3aGVyZSB3ZSBuZWVkCisgICAgICAgICAgICAvLyB0byBnaXZlIHRoZSBDb25maWd1cmF0aW9uIGRhdGEgYmFjay4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBjYXNlIFdOSV9DRkdfRE5MRF9SRVE6CisgICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByZXF1ZXN0IGZyb20gdGhlIE1BQyB0byBkb3dubG9hZCB0aGUgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy8gZGF0YS4gIEZvcm1hdCBhbmQgc2VuZCB0aGUgQ2ZnIERvd25sb2FkIHRvIHRoZSBNQUMuCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzeXNfU2VuZFduaUNmZ0RubGRNc2coIHBWb3NDb250ZXh0ICk7CisgICAgICAgICAgICBpZiAocE1zZy0+Ym9keXB0cikgCisgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgV05JX0NGR19ETkxEX0NORjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHRTaXJNYk1zZyAqcFNpck1zZyA9ICh0U2lyTWJNc2cgKilwTXNnLT5ib2R5cHRyOworCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIldOSV9DRkdfRE5MRF9DTkYgbWVzc2FnZSByZWNlaXZlZCB3aXRoIHN0YXR1cyBjb2RlPSAlZCBbMHglMDhsWF0iLAorICAgICAgICAgICAgICAgICAgICAgICBwU2lyTXNnLT5kYXRhWzBdLCBwU2lyTXNnLT5kYXRhWzBdICk7CisKKyAgICAgICAgICAgIC8vIENvbmZpZyBkb3dubG9hZCBjb25maXJtIGNvbnRhaW5zIGEgdEFOSV9VMzIgc3RhdHVzIGluIHRoZSAnZGF0YScgZmllbGQKKyAgICAgICAgICAgIC8vIG9mIHRoZSBXTkkgbWVzc2FnZS4gIE5vdCBzdXJlIHdlIGNhbiBkbyBhbnl0aGluZyB3aXRoIHRoaXMgc2luY2Ugd2UKKyAgICAgICAgICAgIC8vIGRvbid0IGhhdmUgYSB3YXkgdG8gc2VuZCBhIHN0YXR1cyB0byB0aGUgd2FpdGluZyB0aHJlYWQuCisKKyAgICAgICAgICAgIGlmICggV05JX0NGR19TVUNDRVNTID09IHBTaXJNc2ctPmRhdGFbIDAgXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIldOSV9DRkdfRE5MRF9DTkYgcmVjZWl2ZWQgd2l0aCBzdWNjZXNzZnVsIHN0YXR1cyIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8vIFdoYXQgdG8gZG8gaWYgdGhlIENGRyBEb3dubG9hZCBmYWlscz8gIFdlIGhhdmUgdGhlIE1DIHRocmVhZAorICAgICAgICAgICAgICAgLy8gYmxvY2tlZCB3YWl0aW5nIGZvciBhIGNhbGJhY2sgdG8gdW5ibG9jayBidXQgd2UgZG9uJ3QgaGF2ZQorICAgICAgICAgICAgICAgLy8gYSB3YXkgdG8gY29udmV5IHN1Y2Nlc3MgLyBmYWlsdXJlIHRvIHRoZSBNQyB0aHJlYWQ/PworICAgICAgICAgICAgICAgVk9TX0FTU0VSVCggMCApOworCisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIldOSV9DRkdfRE5MRF9DTkYgcmVjZWl2ZWQgd2l0aCBzdGF0dXM9ICVkIFsweCUwOGxYXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaXJNc2ctPmRhdGFbIDAgXSwgcFNpck1zZy0+ZGF0YVsgMCBdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocE1zZy0+Ym9keXB0cikgCisgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgV0RBX05JQ19PUEVSX05URjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAiV0RBX05JQ19PUEVSX05URiBtZXNzYWdlIHJlY2VpdmVkIiApOworCisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBOSUMgT3BlcmF0aW9uYWwgTm90aWZ5IG1lc3NhZ2UgdGhhdCBjb21lcyB0byB0aGUKKyAgICAgICAgICAgIC8vIFNZUyBtb2R1bGUgZnJvbSBIQUwgYWZ0ZXIgdGhlIENvbmZpZ3VyYXRpb24gZG93bmxvYWQgaXMgY29tcGxldGUuCisgICAgICAgICAgICAvLyBUaGlzIG1lc3NhZ2UgY29tZXMgKmFmdGVyKiB0aGUgV05JX0NGR19ETkxEX0NORiBtZXNzYWdlCisgICAgICAgICAgICAvLyBjb21lcyB0byBTWVMgZnJvbSB0aGUgQ0ZHIG1vZHVsZSwgYWxzbyBhdCB0aGUgZW5kIG9mIENGRworICAgICAgICAgICAgLy8gZG93bmxvYWQuICBJbiByZXNwb25zZSB0byB0aGlzIG1lc3NhZ2UsIFNZUyBoYXMgdG8gcmVzcG9uZCB3aXRoCisgICAgICAgICAgICAvLyByZXF1ZXN0IGZyb20gdGhlIE1BQyB0byBkb3dubG9hZCB0aGUgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy8gZGF0YS4gIEZvcm1hdCBhbmQgc2VuZCB0aGUgQ2ZnIERvd25sb2FkIHRvIHRoZSBNQUMuCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBzeXNfU2VuZFNtZVN0YXJ0UmVxKCBwVm9zQ29udGV4dCApOworICAgICAgICAgICAgaWYgKHBNc2ctPmJvZHlwdHIpIAorICAgICAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgY2FzZSBlV05JX1NNRV9TVEFSVF9SU1A6CisgICAgICAgICB7CisgICAgICAgICAgICB0U2lyU21lUnNwICpwU2lyU21lUnNwTXNnID0gKHRTaXJTbWVSc3AgKilwTXNnLT5ib2R5cHRyOworI2lmZGVmIFdMQU5fREVCVUcKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAiZVdOSV9TTUVfU1RBUlRfUlNQIHJlY2VpdmVkIHdpdGggc3RhdHVzIGNvZGU9ICVkIFsweCUwOGxYXSIsCisgICAgICAgICAgICAgICAgICAgICAgIHBTaXJTbWVSc3BNc2ctPnN0YXR1c0NvZGUsIHBTaXJTbWVSc3BNc2ctPnN0YXR1c0NvZGUgKTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gTWFrZSBhIGNhbGxiYWNrIHRvIHRoZSBNYWluIENvbnRyb2xsZXIgc3RhcnQgY2FsbGJhY2sgcm91dGluZSB3aGVuCisgICAgICAgICAgICAvLyB0aGUgQ0ZHIHNlcXVlbmNlIGlzIGZpbmlzaGVkLi4uICh0aGlzIGlzIHRoZSBjb25maXJtYXRpb24gbWVzc2FnZQorICAgICAgICAgICAgLy8gZnJvbSB0aGUgTUFDIHRoYXQgdGhlIENGRyBzZXF1ZW5jZSBpcyBjb21wbGV0ZWQpLgorICAgICAgICAgICAgaWYgKCBnU3lzQ29udGV4dC5tY1N0YXJ0Q0IgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZ1N5c0NvbnRleHQubWNTdGFydENCKCBnU3lzQ29udGV4dC5tY1N0YXJ0VXNlckRhdGEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwTXNnLT5ib2R5cHRyKSAKKyAgICAgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisjZW5kaWYgIC8qIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MgKi8KKworICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19BU1NFUlQoIDAgKTsKKworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgU1lTIG1lc3NhZ2UgY29va2llIHdpdGggdW5pZGVudGlmaWVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgIk1DIG1lc3NhZ2UgdHlwZT0gJWQgWzB4JTA4bFhdIiwgcE1zZy0+dHlwZSwgcE1zZy0+dHlwZSApOworCisgICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfQkFETVNHOworICAgICAgICAgICAgaWYgKHBNc2ctPmJvZHlwdHIpIAorICAgICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9ICAgLy8gZW5kIHN3aXRjaCBvbiBwTXNnLT50eXBlCisgICB9ICAgLy8gZW5kIGVsc2UKKworICAgcmV0dXJuKCB2b3NTdGF0dXMgKTsKK30KKworCisKKworVk9TX1NUQVRVUyBzeXNUeFByb2Nlc3NNc2coIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0LCB2b3NfbXNnX3QgKnBNc2cgKQoreworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIFZPU19BU1NFUlQoIHBNc2cgKTsKKworICAgLy8gQWxsICduZXcnIFNZUyBtZXNzYWdlcyBhcmUgaWRlbnRpZmllZCBieSBhIGNvb2tpZSBpbiB0aGUgcmVzZXJ2ZWQKKyAgIC8vIGZpZWxkIG9mIHRoZSBtZXNzYWdlIGFzIHdlbGwgYXMgdGhlIG1lc3NhZ2UgdHlwZS4gIFRoaXMgcHJldmVudHMKKyAgIC8vIHRoZSBwb3NzaWJpbGl0eSBvZiBvdmVybGFwIGluIHRoZSBtZXNzYWdlIHR5cGVzIGRlZmluZWQgZm9yIG5ldworICAgLy8gU1lTIG1lc3NhZ2VzIHdpdGggdGhlICdsZWdhY3knIG1lc3NhZ2UgdHlwZXMuICBUaGUgbGVnYWN5IG1lc3NhZ2VzCisgICAvLyB3aWxsIG5vdCBoYXZlIHRoaXMgY29va2llIGluIHRoZSByZXNlcnZlZCBmaWVsZAorICAgaWYgKCBTWVNfTVNHX0NPT0tJRSA9PSBwTXNnLT5yZXNlcnZlZCApCisgICB7CisgICAgICAvLyBQcm9jZXNzIGFsbCB0aGUgbmV3IFNZUyBtZXNzYWdlcy4uCisgICAgICBzd2l0Y2goIHBNc2ctPnR5cGUgKQorICAgICAgeworICAgICAgICAgLy8gUHJvY2VzcyBUWCB0aHJlYWQgcHJvYmUuICBKdXN0IGNhbGxiYWNrIHRvIHRoZQorICAgICAgICAgLy8gZnVuY3Rpb24gdGhhdCBpcyBpbiB0aGUgbWVzc2FnZS4KKyAgICAgICAgIGNhc2UgU1lTX01TR19JRF9UWF9USFJfUFJPQkU6CisgICAgICAgICB7CisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyApCisgICAgICAgICAgICBzeXNSZXNwb25zZUNiYWNrIGNhbGxiYWNrOworCisgICAgICAgICAgICAvLyBNYWtlIGEgY2FsbGJhY2sgdG8gdGhlIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBpbmZvCisgICAgICAgICAgICAvLyBpbiB0aGUgbWVzc2FnZSAoY2FsbGJhY2sgaXMgaW4gYm9keXB0ciBhbmQgdXNlcgorICAgICAgICAgICAgLy8gZGF0YSBpcyBpbiBib2R5dmFsKQorICAgICAgICAgICAgY2FsbGJhY2sgPSAoc3lzUmVzcG9uc2VDYmFjaylwTXNnLT5ib2R5cHRyOworCisgICAgICAgICAgICBjYWxsYmFjayggKHZfVk9JRF90ICopcE1zZy0+Ym9keXZhbCApOworI2Vsc2UKKyAgICAgICAgICAgLyogSGFuZGxpbmcgZm9yIHRoaXMgbWVzc2FnZSBpcyBub3QgbmVlZGVkIG5vdyBzbyBhZGRpbmcgCisgICAgICAgICAgICAqIGRlYnVnIHByaW50IGFuZCBWT1NfQVNTRVJUKi8KKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiBSZWNlaXZlZCBTWVNfTVNHX0lEX1RYX1RIUl9QUk9CRSBtZXNzYWdlIG1zZ1R5cGU9ICVkIFsweCUwOGx4XSIsCisgICAgICAgICAgICAgICAgICAgICAgIHBNc2ctPnR5cGUsIHBNc2ctPnR5cGUgKTsKKyAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIGNhc2UgU1lTX01TR19JRF9UWF9USU1FUjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHZvc190aW1lcl9jYWxsYmFja190IHRpbWVyQ0I7CisKKyAgICAgICAgICAgIC8vIGh1bW1tbS4uLiBub3RlIHNheXMuLi4KKyAgICAgICAgICAgIC8vIGludm9rZSB0aGUgdGltZXIgY2FsbGJhY2sgYW5kIHRoZSB1c2VyIGRhdGEgc3RpY2sKKyAgICAgICAgICAgIC8vIGludG8gdGhlIGJvZHl2YWw7IG5vIGJvZHkgdG8gZnJlZS4gICAgSSB0aGluayB0aGlzIGlzCisgICAgICAgICAgICAvLyB3aGF0IHRoYXQgbWVhbnMuCisgICAgICAgICAgICB0aW1lckNCID0gKHZvc190aW1lcl9jYWxsYmFja190KXBNc2ctPmJvZHlwdHI7CisKKyAgICAgICAgICAgIC8vIG1ha2UgdGhlIGNhbGxiYWNrIHRvIHRoZSB0aW1lciByb3V0aW5lLi4uCisgICAgICAgICAgICB0aW1lckNCKCAodl9WT0lEX3QgKilwTXNnLT5ib2R5dmFsICk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBtZXNzYWdlIHR5cGUgaW4gc3lzVHhQcm9jZXNzTXNnKCkgbXNnVHlwZT0gJWQgWzB4JTA4bHhdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcE1zZy0+dHlwZSwgcE1zZy0+dHlwZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgfSAgIC8vIGVuZCBzd2l0Y2ggb24gbWVzc2FnZSB0eXBlCisgICB9ICAgLy8gZW5kIGlmIGNvb2tpZSBzZXQKKyAgIGVsc2UKKyAgIHsKKyAgICAgIFZPU19BU1NFUlQoIDAgKTsKKworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgU1lTIG1lc3NhZ2UgY29va2llIHdpdGggdW5pZGVudGlmaWVkIFRYIG1lc3NhZ2UgIgorICAgICAgICAgICAgICAgICAiIHR5cGU9ICVkIFsweCUwOGxYXSIsIHBNc2ctPnR5cGUsIHBNc2ctPnR5cGUgKTsKKworICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0JBRE1TRzsKKyAgIH0gICAvLyBlbmQgZWxzZQorCisgICByZXR1cm4oIHZvc1N0YXR1cyApOworfQorCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKK1ZPU19TVEFUVVMgc3lzUnhQcm9jZXNzTXNnKCB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCwgdm9zX21zZ190ICpwTXNnICkKK3sKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICBWT1NfQVNTRVJUKCBwTXNnICk7CisKKyAgIC8vIEFsbCAnbmV3JyBTWVMgbWVzc2FnZXMgYXJlIGlkZW50aWZpZWQgYnkgYSBjb29raWUgaW4gdGhlIHJlc2VydmVkCisgICAvLyBmaWVsZCBvZiB0aGUgbWVzc2FnZSBhcyB3ZWxsIGFzIHRoZSBtZXNzYWdlIHR5cGUuICBUaGlzIHByZXZlbnRzCisgICAvLyB0aGUgcG9zc2liaWxpdHkgb2Ygb3ZlcmxhcCBpbiB0aGUgbWVzc2FnZSB0eXBlcyBkZWZpbmVkIGZvciBuZXcKKyAgIC8vIFNZUyBtZXNzYWdlcyB3aXRoIHRoZSAnbGVnYWN5JyBtZXNzYWdlIHR5cGVzLiAgVGhlIGxlZ2FjeSBtZXNzYWdlcworICAgLy8gd2lsbCBub3QgaGF2ZSB0aGlzIGNvb2tpZSBpbiB0aGUgcmVzZXJ2ZWQgZmllbGQKKyAgIGlmICggU1lTX01TR19DT09LSUUgPT0gcE1zZy0+cmVzZXJ2ZWQgKQorICAgeworICAgICAgLy8gUHJvY2VzcyBhbGwgdGhlIG5ldyBTWVMgbWVzc2FnZXMuLgorICAgICAgc3dpdGNoKCBwTXNnLT50eXBlICkKKyAgICAgIHsKKyAgICAgICAgIGNhc2UgU1lTX01TR19JRF9SWF9USU1FUjoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHZvc190aW1lcl9jYWxsYmFja190IHRpbWVyQ0I7CisKKyAgICAgICAgICAgIC8vIGh1bW1tbS4uLiBub3RlIHNheXMuLi4KKyAgICAgICAgICAgIC8vIGludm9rZSB0aGUgdGltZXIgY2FsbGJhY2sgYW5kIHRoZSB1c2VyIGRhdGEgc3RpY2sKKyAgICAgICAgICAgIC8vIGludG8gdGhlIGJvZHl2YWw7IG5vIGJvZHkgdG8gZnJlZS4gICAgSSB0aGluayB0aGlzIGlzCisgICAgICAgICAgICAvLyB3aGF0IHRoYXQgbWVhbnMuCisgICAgICAgICAgICB0aW1lckNCID0gKHZvc190aW1lcl9jYWxsYmFja190KXBNc2ctPmJvZHlwdHI7CisKKyAgICAgICAgICAgIC8vIG1ha2UgdGhlIGNhbGxiYWNrIHRvIHRoZSB0aW1lciByb3V0aW5lLi4uCisgICAgICAgICAgICB0aW1lckNCKCAodl9WT0lEX3QgKilwTXNnLT5ib2R5dmFsICk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBtZXNzYWdlIHR5cGUgaW4gc3lzUnhQcm9jZXNzTXNnKCkgbXNnVHlwZT0gJWQgWzB4JTA4bHhdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcE1zZy0+dHlwZSwgcE1zZy0+dHlwZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgfSAgIC8vIGVuZCBzd2l0Y2ggb24gbWVzc2FnZSB0eXBlCisgICB9ICAgLy8gZW5kIGlmIGNvb2tpZSBzZXQKKyAgIGVsc2UKKyAgIHsKKyAgICAgIFZPU19BU1NFUlQoIDAgKTsKKworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgU1lTIG1lc3NhZ2UgY29va2llIHdpdGggdW5pZGVudGlmaWVkIFJYIG1lc3NhZ2UgIgorICAgICAgICAgICAgICAgICAiIHR5cGU9ICVkIFsweCUwOGxYXSIsIHBNc2ctPnR5cGUsIHBNc2ctPnR5cGUgKTsKKworICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0JBRE1TRzsKKyAgIH0gICAvLyBlbmQgZWxzZQorCisgICByZXR1cm4oIHZvc1N0YXR1cyApOworfQorCisjZW5kaWYKKwordl9WT0lEX3Qgc3lzTWNGcmVlTXNnKCB2X0NPTlRFWFRfdCBwVkNvbnRleHQsIHZvc19tc2dfdCogcE1zZyApCit7CisgICByZXR1cm47Cit9CisKKwordl9WT0lEX3Qgc3lzVHhGcmVlTXNnKCB2X0NPTlRFWFRfdCBwVkNvbnRleHQsIHZvc19tc2dfdCogcE1zZyApCit7CisgICByZXR1cm47Cit9CisKKwordm9pZAorU3lzUHJvY2Vzc01taE1zZworKAorICB0cEFuaVNpckdsb2JhbCBwTWFjLAorICB0U2lyTXNnUSogcE1zZworKQoreworICBWT1NfTVFfSUQgICB0YXJnZXRNUSA9IFZPU19NUV9JRF9TWVM7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKgorICAqKiBUaGUgYm9keSBvZiB0aGlzIHBNc2cgaXMgYSB0U2lyTWJNc2cKKyAgKiogQ29udHJhcnkgdG8gR2VuNCwgd2UgY2Fubm90IGZyZWUgaXQgaGVyZSEKKyAgKiogSXQgaXMgdXAgdG8gdGhlIGNhbGxlZSB0byBmcmVlIGl0CisgICovCisKKyAgVk9TX0FTU0VSVChOVUxMICE9IHBNc2cpOworCisKKyAgc3dpdGNoIChwTXNnLT50eXBlKQorICB7CisgICAgLyoKKyAgICAqKiBGb2xsb3dpbmcgbWVzc2FnZXMgYXJlIHJvdXRlZCB0byBTWVMKKyAgICAqLworICAgIGNhc2UgV05JX0NGR19ETkxEX1JFUToKKyAgICBjYXNlIFdOSV9DRkdfRE5MRF9DTkY6CisgICAgY2FzZSBXREFfQVBQX1NFVFVQX05URjoKKyAgICBjYXNlIFdEQV9OSUNfT1BFUl9OVEY6CisgICAgY2FzZSBXREFfUkVTRVRfUkVROgorICAgIGNhc2UgZVdOSV9TTUVfU1RBUlRfUlNQOgorICAgIHsKKyAgICAgIC8qIEZvcndhcmQgdGhpcyBtZXNzYWdlIHRvIHRoZSBTWVMgbW9kdWxlICovCisgICAgICB0YXJnZXRNUSA9IFZPU19NUV9JRF9TWVM7CisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiSGFuZGxpbmcgZm9yIHRoZSBNZXNzYWdlIElEICVkIGlzIHJlbW92ZWQgaW4gU1lTXHJcbiIsCisgICAgICAgICAgICAgICAgIHBNc2ctPnR5cGUpOworCisgICAgICBWT1NfQVNTRVJUKDApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICAvKgorICAgICoqIEZvbGxvd2luZyBtZXNzYWdlcyBhcmUgcm91dGVkIHRvIEhBTAorICAgICovCisgICAgY2FzZSBXTklfQ0ZHX0ROTERfUlNQOgorICAgIGNhc2UgV0RBX0lOSVRfU1RBUlRfUkVROgorICAgIHsKKyAgICAgIC8qIEZvcndhcmQgdGhpcyBtZXNzYWdlIHRvIHRoZSBIQUwgbW9kdWxlICovCisgICAgICB0YXJnZXRNUSA9IFZPU19NUV9JRF9XREE7CisKKyNpZiBkZWZpbmVkICggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkhhbmRsaW5nIGZvciB0aGUgTWVzc2FnZSBJRCAlZCBpcyByZW1vdmVkIGFzIHRoZXJlIGlzIG5vIEhBTCBcclxuIiwKKyAgICAgICAgICAgICAgICAgcE1zZy0+dHlwZSk7CisKKyAgICAgIFZPU19BU1NFUlQoMCk7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIGVXTklfU01FX1NUQVJUX1JFUToKKyAgICBjYXNlIFdOSV9DRkdfR0VUX1JFUToKKyAgICBjYXNlIFdOSV9DRkdfU0VUX1JFUToKKyAgICBjYXNlIFdOSV9DRkdfU0VUX1JFUV9OT19SU1A6CisgICAgY2FzZSBlV05JX1NNRV9TWVNfUkVBRFlfSU5EOgorICAgIHsKKyAgICAgICAvKiBGb3J3YXJkIHRoaXMgbWVzc2FnZSB0byB0aGUgUEUgbW9kdWxlICovCisgICAgICB0YXJnZXRNUSA9IFZPU19NUV9JRF9QRTsKKyAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgY2FzZSBXTklfQ0ZHX0dFVF9SU1A6CisgICAgY2FzZSBXTklfQ0ZHX1NFVF9DTkY6CisvKiAgIGNhc2UgZVdOSV9TTUVfRElTQVNTT0NfUlNQOgorICAgIGNhc2UgZVdOSV9TTUVfU1RBX1NUQVRfUlNQOgorICAgIGNhc2UgZVdOSV9TTUVfQUdHUl9TVEFUX1JTUDoKKyAgICBjYXNlIGVXTklfU01FX0dMT0JBTF9TVEFUX1JTUDoKKyAgICBjYXNlIGVXTklfU01FX1NUQVRfU1VNTV9SU1A6CisgICAgY2FzZSBlV05JX1BNQ19FTlRFUl9CTVBTX1JTUDoKKyAgICBjYXNlIGVXTklfUE1DX0VYSVRfQk1QU19SU1A6CisgICAgY2FzZSBlV05JX1BNQ19FWElUX0JNUFNfSU5EOgorICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfSU1QU19SU1A6CisgICAgY2FzZSBlV05JX1BNQ19FWElUX0lNUFNfUlNQOgorICAgIGNhc2UgZVdOSV9QTUNfRU5URVJfVUFQU0RfUlNQOgorICAgIGNhc2UgZVdOSV9QTUNfRVhJVF9VQVBTRF9SU1A6CisgICAgY2FzZSBlV05JX1BNQ19FTlRFUl9XT1dMX1JTUDoKKyAgICBjYXNlIGVXTklfUE1DX0VYSVRfV09XTF9SU1A6CisgICAgY2FzZSBlV05JX1NNRV9TV0lUQ0hfQ0hMX1JFUTogKi8gLy9UYWtlbiBjYXJlIGJ5IHRoZSBjaGVjayBpbiBkZWZhdWx0IGNhc2UKKyAgICB7CisgICAgICAgLyogRm9yd2FyZCB0aGlzIG1lc3NhZ2UgdG8gdGhlIFNNRSBtb2R1bGUgKi8KKyAgICAgIHRhcmdldE1RID0gVk9TX01RX0lEX1NNRTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgeworCisgICAgICBpZiAoICggcE1zZy0+dHlwZSA+PSBlV05JX1NNRV9NU0dfVFlQRVNfQkVHSU4gKSAgJiYgICggcE1zZy0+dHlwZSA8PSBlV05JX1NNRV9NU0dfVFlQRVNfRU5EICkgKQorICAgICAgeworICAgICAgICAgdGFyZ2V0TVEgPSBWT1NfTVFfSURfU01FOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIk1lc3NhZ2Ugb2YgSUQgJWQgaXMgbm90IHlldCBoYW5kbGVkIGJ5IFNZU1xyXG4iLAorICAgICAgICAgICAgICAgICBwTXNnLT50eXBlKTsKKworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICB9CisKKyAgfQorCisKKyAgLyoKKyAgKiogUG9zdCBub3cgdGhlIG1lc3NhZ2UgdG8gdGhlIGFwcHJvcHJpYXRlIG1vZHVsZSBmb3IgaGFuZGxpbmcKKyAgKi8KKyAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19tcV9wb3N0X21lc3NhZ2UodGFyZ2V0TVEsICh2b3NfbXNnX3QqKXBNc2cpKQorICB7CisgICAgLy9DYWxsZXIgZG9lc24ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwTXNnLiBJdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJvZHlwdHIKKyAgICAvKiBmcmVlIHRoZSBtZW0gYW5kIHJldHVybiAqLworICAgIGlmKHBNc2ctPmJvZHlwdHIpCisgICAgeworICAgICAgcGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgcE1zZy0+Ym9keXB0cik7CisgICAgfQorICB9CisKK30gLyogU3lzUHJvY2Vzc01taE1zZygpICovCisKKyNpZm5kZWYgV0xBTl9GVE1fU1RVQgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOX0ZUTV9TWVNfRlRNCisKKyAgREVTQ1JJUFRJT04KKyAgICBDYWxsZWQgYnkgVk9TUyB0byBmcmVlIGEgZ2l2ZW4gRlRNIG1lc3NhZ2Ugb24gdGhlIE1haW4gdGhyZWFkIHdoZW4gdGhlcmUKKyAgICBhcmUgbWVzc2FnZXMgcGVuZGluZyBpbiB0aGUgcXVldWUgd2hlbiB0aGUgd2hvbGUgc3lzdGVtIGlzIGJlZW4gcmVzZXQuCisKKyAgREVQRU5ERU5DSUVTCisgICAgIEZUTSAgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gRlRNJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQorCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzoKKworICBTSURFIEVGRkVDVFMKKyAgICAgIE5PTkUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIHdsYW5fc3lzX2Z0bSh2b2lkICpwTXNnUHRyKQoreworICAgIHZvc19tc2dfdCAgdm9zTWVzc2FnZTsKKworCisKKyAgICB2b3NNZXNzYWdlLnJlc2VydmVkID0gRlRNX1NZU19NU0dfQ09PS0lFOworICAgIHZvc01lc3NhZ2UudHlwZSAgICAgPSBTWVNfTVNHX0lEX0ZUTV9SU1A7CisgICAgdm9zTWVzc2FnZS5ib2R5cHRyICA9IHBNc2dQdHI7CisKKyAgICB2b3NfbXFfcG9zdF9tZXNzYWdlKFZPU19NUV9JRF9TWVMsICZ2b3NNZXNzYWdlKTsKKworICAgIHJldHVybjsKK30KKworI2VuZGlmIC8qIEFOSV9NQU5GX0RJQUcgKi8KKworCmRpZmYgLS1naXQgYS9DT1JFL1NZUy9sZWdhY3kvc3JjL3BhbC9pbmMvcGFsQXBpLmggYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3BhbC9pbmMvcGFsQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlNGVkZgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvcGFsL2luYy9wYWxBcGkuaApAQCAtMCwwICsxLDc1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqICAKKworICAKKyAgICBcZmlsZSBwYWxBcGkuaAorICAKKyAgICBcYnJpZWYgRXhwb3J0cyBhbmQgdHlwZXMgZm9yIHRoZSBQbGF0Zm9ybSBBYnN0cmFjdGlvbiBMYXllciBpbnRlcmZhY2VzLgorICAKKyAgICAkSWQkIAorICAKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZAorICAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGludGVyZmFjZXMgZm9yIHRoZ2UgUGxhdGZvcm0gQWJzdHJhdGlvbiBMYXllcgorICAgIGZ1bmN0aW9ucy4gIEl0IGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGluIGFsbCBtb2R1bGVzIHRoYXQgYXJlIHVzaW5nIAorICAgIHRoZSBQQUwgaW50ZXJmYWNlcy4KKyAgCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBQQUxBUElfSF9fCisjZGVmaW5lIFBBTEFQSV9IX18KKworI2luY2x1ZGUgImhhbFR5cGVzLmgiCisjaW5jbHVkZSAicGFsUGlwZXMuaCIKKy8vI2luY2x1ZGUgInBhbEVycklzci5oIgorLy8jaW5jbHVkZSAiaGFsRnJhbWVJbmZvLmgiCisKKy8qKgorICAgIFxtYWlucGFnZSBQbGF0Zm9ybSBBYnN0cmFjdGlvbiBMYXllciAoUEFMKQorICAgIAorICAgIFxzZWN0aW9uIGludHJvIEludHJvZHVjdGlvbgorICAgIAorICAgIHBhbEFwaSBpcyB0aGUgUGxhdGZvcm0gQWJzdHJhdGlvbiBMYXllci4KKyAgICAKKyAgICBUaGlzIGlzIHRoZSBsYXRlc3QgYXR0ZW1wdCB0byBhYnN0cmFjdCB0aGUgZW50aXJlIFBsYXRmb3JtLCBpbmNsdWRpbmcgdGhlIAorICAgIGhhcmR3YXJlLCBjaGlwLCBPUyBhbmQgQnVzIGludG8gYSBnZW5lcmljIEFQSS4gIFdlIGFyZSBkb2luZyB0aGlzIHRvIGdpdmUgCisgICAgdGhlIE1BQyB0aGUgYWJpbGl0eSB0byBjYWxsCisgICAgZ2VuZXJpYyBBUElzIHRoYXQgd2lsbCBhbGxvdyB0aGUgTUFDIHRvIGZ1bmN0aW9uIGluIGFuIGFic3RyYWN0IG1hbm5lciAKKyAgICB3aXRoIGFueSBBaXJnbyBjaGlwc2V0LCBvbiBhbnkgc3VwcG9ydGVkIE9TIChXaW5kb3dzIGFuZCBMaW51eCBmb3Igbm93KQorICAgIGFjcm9zcyBhbnkgc3lzdGVtIGJ1cyBpbnRlcmZhY2UgKFBDSSwgUENJZSwgQ2FyZGJ1cywgVVNCLCBldGMuKS4KKyAgICAKKyAgICBcdG9kbworICAgIC0gcGFsUmVhZFJlZ2lzdGVyOiAgcmVnaXN0ZXIgcmVhZCAKKyAgICAgICAgLSMgYWRkIGFuIE9wZW4vQ2xvc2UgYWJzdHJhY3Rpb24gdG8gYWNjb21vZGF0ZSB0aGUgUEFMIGJlZm9yZSB0aGUgZW50aXJlIE1BQyBpcyBsb2FkZWQuCisgICAgICAgIC0jIFJldmlldyB3aXRoIExpbnV4IGZvbGtzIHRvIHNlZSB0aGlzIGJhc2ljIHNjcnVjdHVyZSB3b3JrcyBmb3IgdGhlbS4KKyAgICAgICAgLSMgRmlndXJlIG91dCBob3cgdG8gb3JnYW5pemUgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKKyAgICAtIHBhbE1lbW9yeTogbWVtb3J5IHJlYWQvd3JpdGUKKyAgICAtIGluY2x1ZGUgYXN5bmMgdmVyc2lvbnMgb2YgcmVhZC93cml0ZSByZWdpc3RlcgorICAgIC0gcGFsVHg6IGFuIGFic3RyYWN0aW9uIGZvciB0cmFuc21pdCBmcmFtZXMgdGhhdCBtYW5hZ2VzIHRoZSBUZCBhbmQgVG0gcmluZ3MKKyAgICAtIHBhbFJ4OiBhbiBhYnN0cmFjaW9uIGZvciByZWNlaXZpbmcgZnJhbWVzIGZyb20gYSBjaGlwIGFjcm9zcyBhbnkgb2YgdGhlIHN1cHBvcnRlZCBidXNlcworICAgIC0gcGFsSW50ZXJydXB0OiBhYnN0cmFjdCB0aGUgaW50ZXJydXB0cyBpbnRvIHRoZSBIQUwKKyAgICAKKyAgICAKKyAgICBcc2VjdGlvbiBpbXBsX25vdGVzIEltcGxlbWVudGF0aW9uIE5vdGVzCisgICAgCisgICAgXHN1YnNlY3Rpb24gc3Vic2VjdGlvbl9jb2RlU3RydWN0dXJlIENvZGUgc3RydWN1cmUKKworICovCisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHBhbFJlYWRSZWdpc3RlcgorCisgICAgXGJyaWVmIGNoaXAgYW5kIGJ1cyBhZ25vc3RpYyBmdW50aW9uIHRvIHJlYWQgYSByZWdpc3RlciB2YWx1ZQorICAgIAorICAgIFxwYXJhbSBoSGRkIC0gSEREIGNvbnRleHQgaGFuZGxlCisgICAgCisgICAgXHBhcmFtIHJlZ0FkZHJlc3MgLSBhZGRyZXNzIChvZmZzZXQpIG9mIHRoZSByZWdpc3RlciB0byBiZSByZWFkIGZyb20gdGhlIHN0YXJ0CisgICAgb2YgcmVnaXN0ZXIgc3BhY2UuCisgICAgCisgICAgXHBhcmFtIHBSZWdWYWx1ZSAtIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSB3aGVyZSB0aGUgcmVnaXN0ZXIgY29udGVudHMgYXJlIHdyaXR0ZW4KKyAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSBzdGF0dXMgb2YgdGhlIHJlZ2lzdGVyIHJlYWQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiAKKyAgICBjYW4gZmFpbC4gIEluIHBhcnRpY3VsYXIsIHdoZW4gdGhlIGNhcmQgaXMgcmVtb3ZlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAKKyAgICBhIGZhaWx1cmUuCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBwYWxSZWFkUmVnaXN0ZXIoIHRIZGRIYW5kbGUgaEhkZCwgdEFOSV9VMzIgcmVnQWRkcmVzcywgdEFOSV9VMzIgKnBSZWdWYWx1ZSApOworCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBwYWxXcml0ZVJlZ2lzdGVyCisKKyAgICBcYnJpZWYgY2hpcCBhbmQgYnVzIGFnbm9zdGljIGZ1bnRpb24gdG8gd3JpdGUgYSByZWdpc3RlciB2YWx1ZQorICAgIAorICAgIFxwYXJhbSBoSGRkIC0gSEREIGNvbnRleHQgaGFuZGxlCisgICAgCisgICAgXHBhcmFtIHJlZ0FkZHJlc3MgLSBhZGRyZXNzIChvZmZzZXQpIG9mIHRoZSByZWdpc3RlciB0byBiZSByZWFkIGZyb20gdGhlIHN0YXJ0CisgICAgb2YgcmVnaXN0ZXIgc3BhY2UuCisgICAgCisgICAgXHBhcmFtIHBSZWdWYWx1ZSAtIHBvaW50ZXIgdG8gdGhlIHZhbHVlIGJlaW5nIHdyaXR0ZW4gaW50byB0aGUgcmVnaXN0ZXIKKyAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSBzdGF0dXMgb2YgdGhlIHJlZ2lzdGVyIHJlYWQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiAKKyAgICBjYW4gZmFpbC4gIEluIHBhcnRpY3VsYXIsIHdoZW4gdGhlIGNhcmQgaXMgcmVtb3ZlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAKKyAgICBhIGZhaWx1cmUuCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBwYWxXcml0ZVJlZ2lzdGVyKCB0SGRkSGFuZGxlIGhIZGQsIHRBTklfVTMyIHJlZ0FkZHJlc3MsIHRBTklfVTMyIHJlZ1ZhbHVlICk7CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBwYWxBc3luY1dyaXRlUmVnaXN0ZXIKKworICAgIFxicmllZiBjaGlwIGFuZCBidXMgYWdub3N0aWMgYXN5bmMgZnVudGlvbiB0byB3cml0ZSBhIHJlZ2lzdGVyIHZhbHVlCisgICAgCisgICAgXHBhcmFtIGhIZGQgLSBIREQgY29udGV4dCBoYW5kbGUKKyAgICAKKyAgICBccGFyYW0gcmVnQWRkcmVzcyAtIGFkZHJlc3MgKG9mZnNldCkgb2YgdGhlIHJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4gZnJvbSB0aGUgc3RhcnQKKyAgICBvZiByZWdpc3RlciBzcGFjZS4KKyAgICAKKyAgICBccGFyYW0gcmVnVmFsdWUgLSB2YWx1ZSBiZWluZyB3cml0dGVuIGludG8gdGhlIHJlZ2lzdGVyCisgICAgCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gc3RhdHVzIG9mIHRoZSByZWdpc3RlciB3cml0ZS4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIAorICAgIGNhbiBmYWlsLiAgSW4gcGFydGljdWxhciwgd2hlbiB0aGUgY2FyZCBpcyByZW1vdmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIAorICAgIGEgZmFpbHVyZS4KKyAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2VIYWxTdGF0dXMgcGFsQXN5bmNXcml0ZVJlZ2lzdGVyKCB0SGRkSGFuZGxlIGhIZGQsIHRBTklfVTMyIHJlZ0FkZHJlc3MsIHRBTklfVTMyIHJlZ1ZhbHVlICk7CisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHBhbFJlYWREZXZpY2VNZW1vcnkKKworICAgIFxicmllZiBjaGlwIGFuZCBidXMgYWdub3N0aWMgZnVudGlvbiB0byByZWFkIG1lbW9yeSBmcm9tIHRoZSBjaGlwCisgICAgCisgICAgXHBhcmFtIGhIZGQgLSBIREQgY29udGV4dCBoYW5kbGUKKyAgICAKKyAgICBccGFyYW0gbWVtT2Zmc2V0IC0gYWRkcmVzcyAob2Zmc2V0KSBvZiB0aGUgbWVtb3J5IGZyb20gdGhlIHRvcCBvZiB0aGUgCisgICAgbWVtb3J5IG1hcCAoYXMgZXhwb3NlZCB0byB0aGUgaG9zdCkgd2hlcmUgdGhlIG1lbW9yeSB3aWxsIGJlIHJlYWQgZnJvbS4KKyAgICAKKyAgICBccGFyYW0gcEJ1ZmZlciAtIHBvaW50ZXIgdG8gYSBidWZmZXIgd2hlcmUgdGhlIG1lbW9yeSB3aWxsIGJlIHBsYWNlZCBpbiBob3N0CisgICAgbWVtb3J5IHNwYWNlIGFmdGVyIHJldHJlaXZlZCBmcm9tIHRoZSBjaGlwLgorICAgIAorICAgIFxwYXJhbSBudW1CeXRlcyAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KKyAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSBzdGF0dXMgb2YgdGhlIG1lbW9yeSByZWFkLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gCisgICAgY2FuIGZhaWwuICBJbiBwYXJ0aWN1bGFyLCB3aGVuIHRoZSBjYXJkIGlzIHJlbW92ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gCisgICAgYSBmYWlsdXJlLgorICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgcGFsUmVhZERldmljZU1lbW9yeSggdEhkZEhhbmRsZSBoSGRkLCB0QU5JX1UzMiBtZW1PZmZzZXQsIHRBTklfVTggKnBCdWZmZXIsIHRBTklfVTMyIG51bUJ5dGVzICk7CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBwYWxXcml0ZURldmljZU1lbW9yeQorCisgICAgXGJyaWVmIGNoaXAgYW5kIGJ1cyBhZ25vc3RpYyBmdW50aW9uIHRvIHdyaXRlIG1lbW9yeSB0byB0aGUgY2hpcAorICAgIAorICAgIFxwYXJhbSBoSGRkIC0gSEREIGNvbnRleHQgaGFuZGxlCisgICAgCisgICAgXHBhcmFtIG1lbU9mZnNldCAtIGFkZHJlc3MgKG9mZnNldCkgb2YgdGhlIG1lbW9yeSBmcm9tIHRoZSB0b3Agb2YgdGhlIG9uLWNoaXAgCisgICAgbWVtb3J5IHRoYXQgd2lsbCBiZSB3cml0dGVuLgorICAgIAorICAgIFxwYXJhbSBwQnVmZmVyIC0gcG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IGhhcyB0aGUgc291cmNlIGRhdGEgdGhhdCB3aWxsIGJlIAorICAgIHdyaXR0ZW4gdG8gdGhlIGNoaXAuCisgICAgCisgICAgXHBhcmFtIG51bUJ5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuLgorICAgIAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAtIHN0YXR1cyBvZiB0aGUgbWVtb3J5IHJlYWQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiAKKyAgICBjYW4gZmFpbC4gIEluIHBhcnRpY3VsYXIsIHdoZW4gdGhlIGNhcmQgaXMgcmVtb3ZlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAKKyAgICBhIGZhaWx1cmUuCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBwYWxXcml0ZURldmljZU1lbW9yeSggdEhkZEhhbmRsZSBoSGRkLCB0QU5JX1UzMiBtZW1PZmZzZXQsIHRBTklfVTggKnBCdWZmZXIsIHRBTklfVTMyIG51bUJ5dGVzICk7ICAKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gcGFsQWxsb2NhdGVNZW1vcnkKKworICAgIFxicmllZiBPUyBhZ25vc3RpYyBmdW50aW9uIHRvIGFsbG9jYXRlIGhvc3QgbWVtb3J5LiAgIAorICAgIAorICAgIFxub3RlICBIb3N0IG1lbW9yeSB0aGF0IG5lZWRzIHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBob3N0IGFuZCB0aGUgCisgICAgZGV2aWNlIG5lZWRzIHRvIGJlIGFsbG9jYXRlZCB3aXRoIHRoZSBwYWxBbGxvY2F0ZVNoYXJlZE1lbW9yeSgpCisgICAgYW5kIGZyZWUnZCB3aXRoIHBhbEZyZWVTaGFyZWRNZW1vcnkoKSBmdW5jdGlvbnMuCisgICAgICAgIAorICAgIFxwYXJhbSBoSGRkIC0gSEREIGNvbnRleHQgaGFuZGxlCisgICAgCisgICAgXHBhcmFtIHBwTWVtb3J5IC0gcG9pbnRlciB0byBhIHZvaWQgcG9pbnRlciB3aGVyZSB0aGUgYWRkcmVzcyBvZiB0aGUgCisgICAgbWVtb3J5IGFsbG9jYXRlZCB3aWxsIGJlIHBsYWNlZCB1cG9uIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24uCisgICAgCisgICAgXHBhcmFtIG51bUJ5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZS4KKyAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSBzdGF0dXMgb2YgdGhlIHJlZ2lzdGVyIHJlYWQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiAKKyAgICBjYW4gZmFpbC4gIEluIHRoZSBjYXNlIG9mIGEgZmFpbHVyZSwgYSBub24tc3VjY2Vzc2Z1bCByZXR1cm4gY29kZSB3aWxsIGJlIAorICAgIHJldHVybmVkIGFuZCBubyBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQgKHRoZSAqcHBNZW1vcnkgd2lsbCBiZSBOVUxMIHNvIGRvbid0CisgICAgdHJ5IHRvIHVzZSBpdCB1bmxlc3MgdGhlIHN0YXR1cyByZXR1cm5zIHN1Y2Nlc3MpLgorICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBNRU1PUllfREVCVUcKKyNkZWZpbmUgcGFsQWxsb2NhdGVNZW1vcnkoaEhkZCwgcHBNZW1vcnksIG51bUJ5dGVzKSBwYWxBbGxvY2F0ZU1lbW9yeV9kZWJ1ZyhoSGRkLCBwcE1lbW9yeSwgbnVtQnl0ZXMsIF9fRklMRV9fLCBfX0xJTkVfXykKK2VIYWxTdGF0dXMgcGFsQWxsb2NhdGVNZW1vcnlfZGVidWcoIHRIZGRIYW5kbGUgaEhkZCwgdm9pZCAqKnBwTWVtb3J5LCB0QU5JX1UzMiBudW1CeXRlcywgY2hhciogZmlsZU5hbWUsIHRBTklfVTMyIGxpbmVOdW0gKTsKKyNlbHNlCitlSGFsU3RhdHVzIHBhbEFsbG9jYXRlTWVtb3J5KCB0SGRkSGFuZGxlIGhIZGQsIHZvaWQgKipwcE1lbW9yeSwgdEFOSV9VMzIgbnVtQnl0ZXMgKTsKKyNlbmRpZgorCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBwYWxGcmVlTWVtb3J5CisKKyAgICBcYnJpZWYgT1MgYWdub3N0aWMgZnVudGlvbiB0byBmcmVlIGhvc3QgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCB3aXRoIAorICAgIHBhbEFsbGNvYXRlTWVtb3J5KCkgY2FsbHMuCisgICAgCisgICAgXG5vdGUgIEhvc3QgbWVtb3J5IHRoYXQgbmVlZHMgdG8gYmUgc2hhcmVkIGJldHdlZW4gdGhlIGhvc3QgYW5kIHRoZSAKKyAgICBkZXZpY2UgbmVlZHMgdG8gYmUgYWxsb2NhdGVkIHdpdGggdGhlIHBhbEFsbG9jYXRlU2hhcmVkTWVtb3J5KCkKKyAgICBhbmQgZnJlZSdkIHdpdGggcGFsRnJlZVNoYXJlZE1lbW9yeSgpIGZ1bmN0aW9ucy4KKyAgICAgICAgCisgICAgXHBhcmFtIGhIZGQgLSBIREQgY29udGV4dCBoYW5kbGUKKyAgICAKKyAgICBccGFyYW0gcE1lbW9yeSAtIHBvaW50ZXIgdG8gbWVtb3J5IHRoYXQgd2lsbCBiZSBmcmVlJ2QuCisgICAgCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gc3RhdHVzIG9mIHRoZSByZWdpc3RlciByZWFkLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gCisgICAgY2FuIGZhaWwuICBJbiB0aGUgY2FzZSBvZiBhIGZhaWx1cmUsIGEgbm9uLXN1Y2Nlc3NmdWwgcmV0dXJuIGNvZGUgd2lsbCBiZSAKKyAgICByZXR1cm5lZCBhbmQgbm8gbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkICh0aGUgKnBwTWVtb3J5IHdpbGwgYmUgTlVMTCBzbyBkb24ndAorICAgIHRyeSB0byB1c2UgaXQgdW5sZXNzIHRoZSBzdGF0dXMgcmV0dXJucyBzdWNjZXNzKS4KKyAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBhbEZyZWVNZW1vcnkoIHRIZGRIYW5kbGUgaEhkZCwgdm9pZCAqcE1lbW9yeSApOworCisKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHBhbEZpbGxNZW1vcnkKKworICAgIFxicmllZiBPUyBhZ25vc3RpYyBmdW50aW9uIHRvIGZpbGwgaG9zdCBtZW1vcnkgd2l0aCBhIHNwZWNpZmllZCBieXRlIHZhbHVlCisgICAgCisgICAgXHBhcmFtIGhIZGQgLSBIREQgY29udGV4dCBoYW5kbGUKKyAgICAKKyAgICBccGFyYW0gcE1lbW9yeSAtIHBvaW50ZXIgdG8gbWVtb3J5IHRoYXQgd2lsbCBiZSBmaWxsZWQuCisgICAgCisgICAgXHBhcmFtIG51bUJ5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBmaWxsZWQuCisgICAgCisgICAgXHBhcmFtIGZpbGxWYWx1ZSAtIHRoZSBieXRlIHRvIGJlIHdyaXR0ZW4gdG8gZmlsbCB0aGUgbWVtb3J5IHdpdGguCisgICAgCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gc3RhdHVzIG9mIHRoZSByZWdpc3RlciByZWFkLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gCisgICAgY2FuIGZhaWwuICBJbiB0aGUgY2FzZSBvZiBhIGZhaWx1cmUsIGEgbm9uLXN1Y2Nlc3NmdWwgcmV0dXJuIGNvZGUgd2lsbCBiZSAKKyAgICByZXR1cm5lZCBhbmQgbm8gbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkICh0aGUgKnBwTWVtb3J5IHdpbGwgYmUgTlVMTCBzbyBkb24ndAorICAgIHRyeSB0byB1c2UgaXQgdW5sZXNzIHRoZSBzdGF0dXMgcmV0dXJucyBzdWNjZXNzKS4KKyAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBhbEZpbGxNZW1vcnkoIHRIZGRIYW5kbGUgaEhkZCwgdm9pZCAqcE1lbW9yeSwgdEFOSV9VMzIgbnVtQnl0ZXMsIHRBTklfQllURSBmaWxsVmFsdWUgKTsKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHBhbENvcHlNZW1vcnkKKworICAgIFxicmllZiBPUyBhZ25vc3RpYyBmdW50aW9uIHRvIGNvcHkgaG9zdCBtZW1vcnkgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5vdGhlcgorICAgIAorICAgIFxwYXJhbSBoSGRkIC0gSEREIGNvbnRleHQgaGFuZGxlCisgICAgCisgICAgXHBhcmFtIHBTcmMgLSBwb2ludGVyIHRvIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHRvIGNvcHkgZnJvbSkKKworICAgIFxwYXJhbSBwU3JjIC0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBtZW1vcnkgbG9jYXRpb24gKHRvIGNvcHkgdG8pCisgICAgCisgICAgXHBhcmFtIG51bUJ5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBiZSBjb3BpZWQuCisgICAgCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gc3RhdHVzIG9mIHRoZSBtZW1vcnkgY29weSAKKyAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBhbENvcHlNZW1vcnkoIHRIZGRIYW5kbGUgaEhkZCwgdm9pZCAqcERzdCwgY29uc3Qgdm9pZCAqcFNyYywgdEFOSV9VMzIgbnVtQnl0ZXMgKTsKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHBhbEZpbGxNZW1vcnkKKworICAgIFxicmllZiBPUyBhZ25vc3RpYyBmdW50aW9uIHRvIGZpbGwgaG9zdCBtZW1vcnkgd2l0aCBhIHNwZWNpZmllZCBieXRlIHZhbHVlCisgICAgCisgICAgXHBhcmFtIGhIZGQgLSBIREQgY29udGV4dCBoYW5kbGUKKyAgICAKKyAgICBccGFyYW0gcE1lbW9yeSAtIHBvaW50ZXIgdG8gbWVtb3J5IHRoYXQgd2lsbCBiZSBmaWxsZWQuCisgICAgCisgICAgXHBhcmFtIG51bUJ5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBmaWxsZWQuCisgICAgCisgICAgXHBhcmFtIGZpbGxWYWx1ZSAtIHRoZSBieXRlIHRvIGJlIHdyaXR0ZW4gdG8gZmlsbCB0aGUgbWVtb3J5IHdpdGguCisgICAgCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gc3RhdHVzIG9mIHRoZSByZWdpc3RlciByZWFkLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gCisgICAgY2FuIGZhaWwuICBJbiB0aGUgY2FzZSBvZiBhIGZhaWx1cmUsIGEgbm9uLXN1Y2Nlc3NmdWwgcmV0dXJuIGNvZGUgd2lsbCBiZSAKKyAgICByZXR1cm5lZCBhbmQgbm8gbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkICh0aGUgKnBwTWVtb3J5IHdpbGwgYmUgTlVMTCBzbyBkb24ndAorICAgIHRyeSB0byB1c2UgaXQgdW5sZXNzIHRoZSBzdGF0dXMgcmV0dXJucyBzdWNjZXNzKS4KKyAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitBTklfSU5MSU5FX0ZVTkNUSU9OCitlSGFsU3RhdHVzIHBhbFplcm9NZW1vcnkoIHRIZGRIYW5kbGUgaEhkZCwgdm9pZCAqcE1lbW9yeSwgdEFOSV9VMzIgbnVtQnl0ZXMgKQoreworICAgIHJldHVybiggcGFsRmlsbE1lbW9yeSggaEhkZCwgcE1lbW9yeSwgbnVtQnl0ZXMsIDAgKSApOworfSAKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gcGFsRXF1YWxNZW1vcnkKKworICAgIFxicmllZiBPUyBhZ25vc3RpYyBmdW50aW9uIHRvIGNvbXBhcmUgdHdvIHBpZWNlcyBvZiBtZW1vcnksIHNpbWlsYXIgdG8gCisgICAgbWVtY21wIGZ1bmN0aW9uIGluIHN0YW5kYXJkIEMuCisgICAgICAgIAorICAgIFxwYXJhbSBoSGRkIC0gSEREIGNvbnRleHQgaGFuZGxlCisgICAgCisgICAgXHBhcmFtIHBNZW1vcnkxIC0gcG9pbnRlciB0byBvbmUgbG9jYXRpb24gaW4gbWVtb3J5IHRvIGNvbXBhcmUuCisKKyAgICBccGFyYW0gcE1lbW9yeTIgLSBwb2ludGVyIHRvIHNlY29uZCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gY29tcGFyZS4KKyAgICAKKyAgICBccGFyYW0gbnVtQnl0ZXMgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUuCisgICAgCisgICAgXHJldHVybiB0QU5JX0JPT0xFQU4gLSByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSB0aGF0IHRlbGxzIGlmIHRoZSBtZW1vcnkKKyAgICBsb2NhdGlvbnMgYXJlIGVxdWFsIG9yIG5vdyBlcXVhbC4gCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordEFOSV9CT09MRUFOIHBhbEVxdWFsTWVtb3J5KCB0SGRkSGFuZGxlIGhIZGQsIHZvaWQgKnBNZW1vcnkxLCB2b2lkICpwTWVtb3J5MiwgdEFOSV9VMzIgbnVtQnl0ZXMgKTsgCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBwYWxGaWxsRGV2aWNlTWVtb3J5CisKKyAgICBcYnJpZWYgT1MgYWdub3N0aWMgZnVudGlvbiB0byBmaWxsIGRldmljZSBtZW1vcnkgd2l0aCBhIHNwZWNpZmllZCAKKyAgICAzMmJpdCB2YWx1ZQorICAgIAorICAgIFxwYXJhbSBoSGRkIC0gSEREIGNvbnRleHQgaGFuZGxlCisgICAgCisgICAgXHBhcmFtIG1lbU9mZnNldCAtIG9mZnNldCBvZiB0aGUgbWVtb3J5IG9uIHRoZSBkZXZpY2UgdG8gZmlsbC4KKyAgICAKKyAgICBccGFyYW0gbnVtQnl0ZXMgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGZpbGxlZC4KKyAgICAKKyAgICBccGFyYW0gZmlsbFZhbHVlIC0gdGhlIGJ5dGUgcGF0dGVybiB0byBmaWxsIGludG8gbWVtb3J5IG9uIHRoZSBkZXZpY2UKKyAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSBzdGF0dXMgb2YgdGhlIHJlZ2lzdGVyIHJlYWQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiAKKyAgICBjYW4gZmFpbC4gCisgICAgCisgICAgZUhBTF9TVEFUVVNfREVWSUNFX01FTU9SWV9MRU5HVEhfRVJST1IgLSBsZW5ndGggb2YgdGhlIGRldmljZSBtZW1vcnkgaXMgbm90IAorICAgIGEgbXVsdGlwbGUgb2YgNCBieXRlcy4KKyAgICAKKyAgICBlSEFMX1NUQVRVU19ERVZJQ0VfTUVNT1JZX01JU0FMSUdORUQgLSBtZW1vcnkgYWRkcmVzcyBpcyBub3QgYWxpZ25lZCBvbiBhIAorICAgIDQgYnl0ZSBib3VuZGFyeS4KKyAgICAKKyAgICBcbm90ZSByZXR1cm4gZmFpbHVyZSBpZiB0aGUgbWVtT2Zmc2V0IGlzIG5vdCAzMmJpdCBhbGlnbmVkIGFuZCBub3QgYSAKKyAgICBtdWx0aXBsZSBvZiA0IGJ5dGVzICh0aGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgYW55dGhpbmcgZWxzZSkuCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBwYWxGaWxsRGV2aWNlTWVtb3J5KCB0SGRkSGFuZGxlIGhIZGQsIHRBTklfVTMyIG1lbU9mZnNldCwgdEFOSV9VMzIgbnVtQnl0ZXMsIHRBTklfQllURSBmaWxsVmFsdWUgKTsKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gcGFsWmVyb0RldmljZU1lbW9yeQorCisgICAgXGJyaWVmIE9TIGFnbm9zdGljIGZ1bnRpb24gdG8gZmlsbCBkZXZpY2UgbWVtb3J5IHdpdGggYSBzcGVjaWZpZWQgYnl0ZSB2YWx1ZQorICAgIAorICAgIFxwYXJhbSBoSGRkIC0gSEREIGNvbnRleHQgaGFuZGxlCisgICAgCisgICAgXHBhcmFtIG1lbU9mZnNldCAtIG9mZnNldCBvZiB0aGUgbWVtb3J5IG9uIHRoZSBkZXZpY2UgdG8gZmlsbC4KKyAgICAKKyAgICBccGFyYW0gbnVtQnl0ZXMgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGZpbGxlZC4KKyAgICAKKyAgICBccGFyYW0gZmlsbFZhbHVlIC0gdGhlIDMyYml0IHBhdHRlcm4gdG8gZmlsbCB0aGUgbWVtb3J5IHdpdGguCisgICAgCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gc3RhdHVzIG9mIHRoZSByZWdpc3RlciByZWFkLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gCisgICAgY2FuIGZhaWwuIAorICAgIAorICAgIGVIQUxfU1RBVFVTX0RFVklDRV9NRU1PUllfTEVOR1RIX0VSUk9SIC0gbGVuZ3RoIG9mIHRoZSBkZXZpY2UgbWVtb3J5IGlzIG5vdCAKKyAgICBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuCisgICAgCisgICAgZUhBTF9TVEFUVVNfREVWSUNFX01FTU9SWV9NSVNBTElHTkVEIC0gbWVtb3J5IGFkZHJlc3MgaXMgbm90IGFsaWduZWQgb24gYSAKKyAgICA0IGJ5dGUgYm91bmRhcnkuCisgICAgCisgICAgXG5vdGUgcmV0dXJuIGZhaWx1cmUgaWYgdGhlIG1lbU9mZnNldCBpcyBub3QgMzJiaXQgYWxpZ25lZCBhbmQgbm90IGEgCisgICAgbXVsdGlwbGUgb2YgNCBieXRlcyAodGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGFueXRoaW5nIGVsc2UpLgorICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0FOSV9JTkxJTkVfRlVOQ1RJT04KK2VIYWxTdGF0dXMgcGFsWmVyb0RldmljZU1lbW9yeSggdEhkZEhhbmRsZSBoSGRkLCB0QU5JX1UzMiBtZW1PZmZzZXQsIHRBTklfVTMyIG51bUJ5dGVzICkKK3sKKyAgICByZXR1cm4oIHBhbEZpbGxEZXZpY2VNZW1vcnkoIGhIZGQsIG1lbU9mZnNldCwgbnVtQnl0ZXMsIDAgKSApOworfSAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBBbGxvY2F0ZSBhIHBhY2tldCBmb3Igc2VuZGluZyB0aHJvdWdoIHRoZSBUeCBBUElzLgorCisgICAgXHBhcmFtIGhIZGQgLSBIREQgY29udGV4dCBoYW5kbGUKKyAgICAKKyAgICBccGFyYW0gZnJtVHlwZSAtIEZyYW1lIHR5cGUKKyAgICAKKyAgICBccGFyYW0gc2l6ZQorCisgICAgXHBhcmFtIGRhdGEgLQorCisgICAgXHBhcmFtIHBwUGFja2V0ICAtIAorCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBhbFBrdEFsbG9jKHRIZGRIYW5kbGUgaEhkZCwgZUZyYW1lVHlwZSBmcm1UeXBlLCB0QU5JX1UxNiBzaXplLCB2b2lkICoqZGF0YSwgdm9pZCAqKnBwUGFja2V0KSA7CisKKworLy8gVGhpcyBzaG91bGQgcmV0dXJuIFNzb21lIHNvcnQgb2Ygc3RhdHVzLi4uLi4KK3ZvaWQgcGFsUGt0RnJlZSggdEhkZEhhbmRsZSBoSGRkLCBlRnJhbWVUeXBlIGZybVR5cGUsIHZvaWQqIGJ1Ziwgdm9pZCAqcFBhY2tldCk7CisKKworCisvL1BBTCBsb2NrIGZ1bmN0aW9ucworLy9wSGFuZGxlIC0tIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHRQYWxTcGluTG9ja0hhbmRsZSBvYmplY3QKK2VIYWxTdGF0dXMgcGFsU3BpbkxvY2tBbGxvYyggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU3BpbkxvY2tIYW5kbGUgKnBIYW5kbGUgKTsKKy8vaFNwaW5Mb2NrIC0tIGEgaGFuZGxlIHJldHVybmVkIGJ5IHBhbFNwaW5Mb2NrQWxsb2MKK2VIYWxTdGF0dXMgcGFsU3BpbkxvY2tGcmVlKCB0SGRkSGFuZGxlIGhIZGQsIHRQYWxTcGluTG9ja0hhbmRsZSBoU3BpbkxvY2sgKTsKKy8vaFNwaW5Mb2NrIC0tIGEgaGFuZGxlIHJldHVybmVkIGJ5IHBhbFNwaW5Mb2NrQWxsb2MKK2VIYWxTdGF0dXMgcGFsU3BpbkxvY2tUYWtlKCB0SGRkSGFuZGxlIGhIZGQsIHRQYWxTcGluTG9ja0hhbmRsZSBoU3BpbkxvY2sgKTsKKy8vaFNwaW5Mb2NrIC0tIGEgaGFuZGxlIHJldHVybmVkIGJ5IHBhbFNwaW5Mb2NrQWxsb2MKK2VIYWxTdGF0dXMgcGFsU3BpbkxvY2tHaXZlKCB0SGRkSGFuZGxlIGhIZGQsIHRQYWxTcGluTG9ja0hhbmRsZSBoU3BpbkxvY2sgKTsKKy8vUEFMIGxvY2sgZnVuY3Rpb25zIGVuZAorCisKKy8vVGhpcyBmdW5jdGlvbiBzZW5kIGEgbWVzc2FnZSB0byBNQUMsIAorLy9wTXNnQnVmIGlzIGEgYnVmZmVyIGFsbG9jYXRlZCBieSBjYWxsZXIuIFRoZSBhY3R1YWwgc3RydWN0dXJlIHZhcmllcyBiYXNlIG9uIG1lc3NhZ2UgdHlwZQorLy9UaGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgY2FuIGFsd2F5cyBtYXAgdG8gdFNpck1iTXNnCisvL1RoaXMgZnVuY3Rpb24gbXVzdCB0YWtlIGNhcmUgb2YgcGFkZGluZyBpZiBpdCBpcyByZXF1aXJlZCBmb3IgdGhlIE9TCitlSGFsU3RhdHVzIHBhbFNlbmRNQk1lc3NhZ2UodEhkZEhhbmRsZSBoSGRkLCB2b2lkICpwQnVmKTsKKworZXh0ZXJuIHZvaWQgcGFsR2V0VW5pY2FzdFN0YXRzKHRIZGRIYW5kbGUgaEhkZCwgdEFOSV9VMzIgKnR4LCB0QU5JX1UzMiAqcngpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHRoaXMgZnVuY3Rpb24gaXMgdG8gcmV0dXJuIGEgdGljayBjb3VudCAob25lIHRpY2sgPSB+MTBtcykuIEl0IGlzIHVzZWQgdG8gY2FsY3VsYXRlCisgICAgdGltZSBkaWZmZXJlbmNlLgorCisgICAgXHBhcmFtIGhIZGQgLSBIREQgY29udGV4dCBoYW5kbGUKKyAgICAKKyAgICBccmV0dXJuIHRpY2sgY291bnQuIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0QU5JX1UzMiBwYWxHZXRUaWNrQ291bnQodEhkZEhhbmRsZSBoSGRkKTsKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHBhbFJlYWRSZWdNZW1vcnkKKworICAgIFxicmllZiBjaGlwIGFuZCBidXMgYWdub3N0aWMgZnVuY3Rpb24gdG8gcmVhZCBtZW1vcnkgZnJvbSB0aGUgUEhZIHJlZ2lzdGVyIHNwYWNlIGFzIG1lbW9yeQorICAgIGkuZS4gdG8gcmVhZCBtb3JlIHRoYW4gNCBieXRlcyBmcm9tIHRoZSBjb250aWd1b3VzIHJlZ2lzdGVyIHNwYWNlCisgICAgCisgICAgXHBhcmFtIGhIZGQgLSBIREQgY29udGV4dCBoYW5kbGUKKyAgICAKKyAgICBccGFyYW0gbWVtT2Zmc2V0IC0gYWRkcmVzcyAob2Zmc2V0KSBvZiB0aGUgbWVtb3J5IGZyb20gdGhlIHRvcCBvZiB0aGUgCisgICAgbWVtb3J5IG1hcCAoYXMgZXhwb3NlZCB0byB0aGUgaG9zdCkgd2hlcmUgdGhlIG1lbW9yeSB3aWxsIGJlIHJlYWQgZnJvbS4KKyAgICAKKyAgICBccGFyYW0gcEJ1ZmZlciAtIHBvaW50ZXIgdG8gYSBidWZmZXIgd2hlcmUgdGhlIG1lbW9yeSB3aWxsIGJlIHBsYWNlZCBpbiBob3N0CisgICAgbWVtb3J5IHNwYWNlIGFmdGVyIHJldHJlaXZlZCBmcm9tIHRoZSBjaGlwLgorICAgIAorICAgIFxwYXJhbSBudW1CeXRlcyAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KKyAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSBzdGF0dXMgb2YgdGhlIG1lbW9yeSByZWFkLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gCisgICAgY2FuIGZhaWwuICBJbiBwYXJ0aWN1bGFyLCB3aGVuIHRoZSBjYXJkIGlzIHJlbW92ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gCisgICAgYSBmYWlsdXJlLgorICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgcGFsUmVhZFJlZ01lbW9yeSggdEhkZEhhbmRsZSBoSGRkLCB0QU5JX1UzMiBtZW1PZmZzZXQsIHRBTklfVTggKnBCdWZmZXIsIHRBTklfVTMyIG51bUJ5dGVzICk7CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFxmbiBwYWxBc3luY1dyaXRlUmVnTWVtb3J5CisKKyAgICBcYnJpZWYgY2hpcCBhbmQgYnVzIGFnbm9zdGljIGZ1bmN0aW9uIHRvIHdyaXRlIG1lbW9yeSB0byB0aGUgUEhZIHJlZ2lzdGVyIHNwYWNlIGFzIG1lbW9yeQorICAgIGkuZS4gdG8gd3JpdGUgbW9yZSB0aGFuIDQgYnl0ZXMgZnJvbSB0aGUgY29udGlndW91cyByZWdpc3RlciBzcGFjZS4gSW4gVVNCIGludGVyZmFjZSwgdGhpcworICAgIEFQSSBkb2VzIHRoZSB3cml0ZSBhc3luY2hyb25vdXNseS4KKworICAgIFxwYXJhbSBoSGRkIC0gSEREIGNvbnRleHQgaGFuZGxlCisgICAgCisgICAgXHBhcmFtIG1lbU9mZnNldCAtIGFkZHJlc3MgKG9mZnNldCkgb2YgdGhlIG1lbW9yeSBmcm9tIHRoZSB0b3Agb2YgdGhlIG9uLWNoaXAgCisgICAgbWVtb3J5IHRoYXQgd2lsbCBiZSB3cml0dGVuLgorICAgIAorICAgIFxwYXJhbSBwQnVmZmVyIC0gcG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IGhhcyB0aGUgc291cmNlIGRhdGEgdGhhdCB3aWxsIGJlIAorICAgIHdyaXR0ZW4gdG8gdGhlIGNoaXAuCisgICAgCisgICAgXHBhcmFtIG51bUJ5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuLgorICAgIAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyAtIHN0YXR1cyBvZiB0aGUgbWVtb3J5IHJlYWQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiAKKyAgICBjYW4gZmFpbC4gIEluIHBhcnRpY3VsYXIsIHdoZW4gdGhlIGNhcmQgaXMgcmVtb3ZlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAKKyAgICBhIGZhaWx1cmUuCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZUhhbFN0YXR1cyBwYWxBc3luY1dyaXRlUmVnTWVtb3J5KCB0SGRkSGFuZGxlIGhIZGQsIHRBTklfVTMyIG1lbU9mZnNldCwgdEFOSV9VOCAqcEJ1ZmZlciwgdEFOSV9VMzIgbnVtQnl0ZXMgKTsKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHBhbFdyaXRlUmVnTWVtb3J5CisgICAgXGJyaWVmIGNoaXAgYW5kIGJ1cyBhZ25vc3RpYyBmdW5jdGlvbiB0byB3cml0ZSBtZW1vcnkgdG8gdGhlIFBIWSByZWdpc3RlciBzcGFjZSBhcyBtZW1vcnkKKyAgICBpLmUuIHRvIHdyaXRlIG1vcmUgdGhhbiA0IGJ5dGVzIGZyb20gdGhlIGNvbnRpZ3VvdXMgcmVnaXN0ZXIgc3BhY2UuIFRoZSBkaWZmZXJlbmNlIGZyb20gdGhlCisgICAgYWJvdmUgcm91dGluZSBpcywgaW4gVVNCIGludGVyZmFjZSwgdGhpcyByb3V0aW5lIHBlcmZvcm1zIHRoZSB3cml0ZSBzeW5jaHJvbm91c2x5IHdoZXJlIGFzIAorICAgIHRoZSBhYm92ZSByb3V0aW5lIHBlcmZvcm1zIGl0IGFzeW5jaHJvbm91c2x5LgorCisgICAgXHBhcmFtIGhIZGQgLSBIREQgY29udGV4dCBoYW5kbGUKKyAgICAKKyAgICBccGFyYW0gbWVtT2Zmc2V0IC0gYWRkcmVzcyAob2Zmc2V0KSBvZiB0aGUgbWVtb3J5IGZyb20gdGhlIHRvcCBvZiB0aGUgb24tY2hpcCAKKyAgICBtZW1vcnkgdGhhdCB3aWxsIGJlIHdyaXR0ZW4uCisgICAgCisgICAgXHBhcmFtIHBCdWZmZXIgLSBwb2ludGVyIHRvIGEgYnVmZmVyIHRoYXQgaGFzIHRoZSBzb3VyY2UgZGF0YSB0aGF0IHdpbGwgYmUgCisgICAgd3JpdHRlbiB0byB0aGUgY2hpcC4KKyAgICAKKyAgICBccGFyYW0gbnVtQnl0ZXMgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCisgICAgCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gc3RhdHVzIG9mIHRoZSBtZW1vcnkgcmVhZC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIAorICAgIGNhbiBmYWlsLiAgSW4gcGFydGljdWxhciwgd2hlbiB0aGUgY2FyZCBpcyByZW1vdmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIAorICAgIGEgZmFpbHVyZS4KKyAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBhbFdyaXRlUmVnTWVtb3J5KCB0SGRkSGFuZGxlIGhIZGQsIHRBTklfVTMyIG1lbU9mZnNldCwgdEFOSV9VOCAqcEJ1ZmZlciwgdEFOSV9VMzIgbnVtQnl0ZXMgKTsKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gcGFsV2FpdFJlZ1ZhbAorCisgICAgXGJyaWVmIGlzIGEgYmxvY2tpbmcgZnVuY3Rpb24gd2hpY2ggcmVhZHMgdGhlIHJlZ2lzdGVyIGFuZCB3YWl0cyBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBpdGVyYXRpb25zIAorICAgIHVudGlsIHRoZSByZWFkIHZhbHVlIG1hdGNoZXMgdGhlIHdhaXRSZWdWYWwuIFRoZSBkZWxheSBiZXR3ZWVuIGlzIHBlckl0ZXJXYWl0SW5OYW5vU2VjKGluIG5hbm9zZWNvbmRzKQorICAgIAorICAgIFxwYXJhbSBoSGRkIC0gSEREIGNvbnRleHQgaGFuZGxlCisgICAgCisgICAgXHBhcmFtIHJlZyAtIGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgICAKKyAgICBccGFyYW0gbWFzayAtIG1hc2sgdG8gYmUgYXBwbGllZCBmb3IgdGhlIHJlYWQgdmFsdWUKKyAgICAKKyAgICBccGFyYW0gd2FpdFJlZ1ZhbCAtIGV4cGVjdGVkIHZhbHVlIGZyb20gdGhlIHJlZ2lzdGVyIGFmdGVyIGFwcGx5aW5nIHRoZSBtYXNrLgorCisgICAgXHBhcmFtIHBlckl0ZXJXYWl0SW5OYW5vU2VjIC0gZGVsYXkgYmV0d2VlbiB0aGUgdHdvIGl0ZXJhdGlvbnMgaW4gbmFub3NlY29uZHMKKworICAgIFxwYXJhbSBudW1JdGVyIC0gbWF4IG51bWJlciBvZiByZWFkcyBiZWZvcmUgdGhlIHRpbWVvdXQKKworICAgIFxwYXJhbSBwUmVhZFJlZ1ZhbCAtIHRoZSB2YWx1ZSByZWFkIGZyb20gdGhlIHJlZ2lzdGVyCisgICAgCisgICAgXHJldHVybiBlSGFsU3RhdHVzIC0gc3RhdHVzIG9mIHRoZSBtZW1vcnkgcmVhZC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIAorICAgIGNhbiBmYWlsLiAgSW4gcGFydGljdWxhciwgd2hlbiB0aGUgY2FyZCBpcyByZW1vdmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIAorICAgIGEgZmFpbHVyZS4KKyAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHBhbFdhaXRSZWdWYWwoIHRIZGRIYW5kbGUgaEhkZCwgdEFOSV9VMzIgcmVnLCB0QU5JX1UzMiBtYXNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgd2FpdFJlZ1ZhbCwgdEFOSV9VMzIgcGVySXRlcldhaXRJbk5hbm9TZWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBudW1JdGVyLCB0QU5JX1UzMiAqcFJlYWRSZWdWYWwgKTsKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHBhbFJlYWRNb2RpZnlXcml0ZVJlZworCisgICAgXGJyaWVmIGNoaXAgYW5kIGJ1cyBhZ25vc3RpYyBmdW5jdGlvbiB0byByZWFkIGEgUEhZIHJlZ2lzdGVyIGFwcGx5IHRoZSBnaXZlbiBtYXNrcyhBTkQgYW5kIE9SIG1hc2tzKQorICAgIGFuZCB3cml0ZXMgYmFjayB0aGUgbmV3IHZhbHVlIHRvIHRoZSByZWdpc3RlcgorCisgICAgXHBhcmFtIGhIZGQgLSBIREQgY29udGV4dCBoYW5kbGUKKyAgICAKKyAgICBccGFyYW0gcmVnIC0gYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgbW9kaWZpZWQuCisgICAgCisgICAgXHBhcmFtIGFuZE1hc2sgLSBUaGUgdmFsdWUgcmVhZCB3aWxsIGJlIEFORGVkIHdpdGggdGhpcyBtYXNrCisKKyAgICBccGFybWEgb3JNYXNrIC0gVGhlIHZhbHVlIGFmdGVyIGFwcGx5aW5nIHRoZSBhbmRNYXNrIHdpbGwgYmUgT1JlZCB3aXRoIHRoaXMgdmFsdWUKKyAgICAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgLSBzdGF0dXMgb2YgdGhlIG1lbW9yeSByZWFkLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gCisgICAgY2FuIGZhaWwuICBJbiBwYXJ0aWN1bGFyLCB3aGVuIHRoZSBjYXJkIGlzIHJlbW92ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gCisgICAgYSBmYWlsdXJlLgorICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgcGFsUmVhZE1vZGlmeVdyaXRlUmVnKCB0SGRkSGFuZGxlIGhIZGQsIHRBTklfVTMyIHJlZywgdEFOSV9VMzIgYW5kTWFzaywgdEFOSV9VMzIgb3JNYXNrICk7CisKKy8vUEFMIHNlbWFwaG9yZSBmdW5jdGlvbnMKK2VIYWxTdGF0dXMgcGFsU2VtYXBob3JlQWxsb2MoIHRIZGRIYW5kbGUgaEhkZCwgdFBhbFNlbWFwaG9yZUhhbmRsZSAqcEhhbmRsZSwgdEFOSV9TMzIgY291bnQgKTsKK2VIYWxTdGF0dXMgcGFsU2VtYXBob3JlRnJlZSggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU2VtYXBob3JlSGFuZGxlIGhTZW1hcGhvcmUgKTsKK2VIYWxTdGF0dXMgcGFsU2VtYXBob3JlVGFrZSggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU2VtYXBob3JlSGFuZGxlIGhTZW1hcGhvcmUgKTsKK2VIYWxTdGF0dXMgcGFsU2VtYXBob3JlR2l2ZSggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU2VtYXBob3JlSGFuZGxlIGhTZW1hcGhvcmUgKTsKK2VIYWxTdGF0dXMgcGFsTXV0ZXhBbGxvYyggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU2VtYXBob3JlSGFuZGxlICpwSGFuZGxlKSA7CitlSGFsU3RhdHVzIHBhbE11dGV4QWxsb2NMb2NrZWQoIHRIZGRIYW5kbGUgaEhkZCwgdFBhbFNlbWFwaG9yZUhhbmRsZSAqcEhhbmRsZSkgOworCisvL1BBTCBpcnEvc29mdGlycQorZUFuaUJvb2xlYW4gcGFsX2luX2ludGVycnVwdCh2b2lkKSA7Cit2b2lkIHBhbF9sb2NhbF9iaF9kaXNhYmxlKHZvaWQpIDsKK3ZvaWQgcGFsX2xvY2FsX2JoX2VuYWJsZSh2b2lkKSA7CisKKy8vUEFMIGJ5dGUgc3dhcAordEFOSV9VMzIgcGFsX2JlMzJfdG9fY3B1KHRBTklfVTMyIHgpIDsKK3RBTklfVTMyIHBhbF9jcHVfdG9fYmUzMih0QU5JX1UzMiB4KSA7Cit0QU5JX1UxNiBwYWxfYmUxNl90b19jcHUodEFOSV9VMTYgeCkgOwordEFOSV9VMTYgcGFsX2NwdV90b19iZTE2KHRBTklfVTE2IHgpIDsKKworCisjaWYgZGVmaW5lZCggQU5JX0xJVFRMRV9CWVRFX0VORElBTiApCisKKy8vIE5lZWQgdG8gZWxpbWluYXRlIHRoZXNlIGFuZCB1c2UgdGhlIGFuaV9jcHVfdG9fbGUsIGV0Yy4gbWFjcm9zLi4uLgorQU5JX0lOTElORV9GVU5DVElPTiB1bnNpZ25lZCBsb25nIGlfaHRvbmwoIHVuc2lnbmVkIGxvbmcgdWwgKSAKK3sKKyAgcmV0dXJuKCAoICggdWwgJiAweDAwMDAwMGZmICkgPDwgMjQgKSB8CisgICAgICAgICAgKCAoIHVsICYgMHgwMDAwZmYwMCApIDw8ICA4ICkgfAorICAgICAgICAgICggKCB1bCAmIDB4MDBmZjAwMDAgKSA+PiAgOCApIHwKKyAgICAgICAgICAoICggdWwgJiAweGZmMDAwMDAwICkgPj4gMjQgKSAgICk7Cit9CisKK0FOSV9JTkxJTkVfRlVOQ1RJT04gdW5zaWduZWQgc2hvcnQgaV9odG9ucyggdW5zaWduZWQgc2hvcnQgdXMgKQoreworICByZXR1cm4oICggKCB1cyA+PiA4ICkgJiAweDAwZmYgKSArICggKCB1cyA8PCA4ICkgJiAweGZmMDAgKSApOworfQorCitBTklfSU5MSU5FX0ZVTkNUSU9OIHVuc2lnbmVkIHNob3J0IGlfbnRvaHMoIHVuc2lnbmVkIHNob3J0IHVzICkKK3sKKyAgcmV0dXJuKCBpX2h0b25zKCB1cyApICk7Cit9CisKK0FOSV9JTkxJTkVfRlVOQ1RJT04gdW5zaWduZWQgbG9uZyBpX250b2hsKCB1bnNpZ25lZCBsb25nIHVsICkKK3sKKyAgcmV0dXJuKCBpX2h0b25sKCB1bCApICk7Cit9CisKKyNlbmRpZiAvLyNpZiBkZWZpbmVkKCBBTklfTElUVExFX0JZVEVfRU5ESUFOICkKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gcGFsX3NldF9VMzIKKworICAgIFxicmllZiBBc3NpZ24gMzItYml0IHVuc2lnbmVkIHZhbHVlIHRvIGEgYnl0ZSBhcnJheSBiYXNlIG9uIENQVSdzIGVuZGlhbm5lc3MuCisKKyAgICBcbm90ZSBDYWxsZXIgbXVzdCB2YWxpZGF0ZSB0aGUgYnl0ZSBhcnJheSBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQgdGhlIHZsYXVlCisgICAgICAgIAorICAgIFxwYXJhbSBwdHIgLSBTdGFydGluZyBhZGRyZXNzIG9mIGEgYnl0ZSBhcnJheQorICAgIAorICAgIFxwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIGJ5dGUgYXJyYXkKKyAgICAKKyAgICBccmV0dXJuIC0gVGhlIGFkZHJlc3MgdG8gdGhlIGJ5dGUgYWZ0ZXIgdGhlIGFzc2lnbm1lbnQuIFRoaXMgbWF5IG9yIG1heSBub3QgCisgICAgYmUgdmFsaWQuIENhbGxlciB0byB2ZXJpZnkuCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQU5JX0lOTElORV9GVU5DVElPTiB0QU5JX1U4ICogcGFsX3NldF9VMzIodEFOSV9VOCAqcHRyLCB0QU5JX1UzMiB2YWx1ZSkKK3sKKyNpZiBkZWZpbmVkKCBBTklfQklHX0JZVEVfRU5ESUFOICkKKyAgICAgKihwdHIpID0gKCB0QU5JX1U4ICkoIHZhbHVlID4+IDI0ICk7CisgICAgICoocHRyICsgMSkgPSAoIHRBTklfVTggKSggdmFsdWUgPj4gMTYgKTsKKyAgICAgKihwdHIgKyAyKSA9ICggdEFOSV9VOCApKCB2YWx1ZSA+PiA4ICk7CisgICAgICoocHRyICsgMykgPSAoIHRBTklfVTggKSggdmFsdWUgKTsKKyNlbHNlCisgICAgKihwdHIgKyAzKSA9ICggdEFOSV9VOCApKCB2YWx1ZSA+PiAyNCApOworICAgICoocHRyICsgMikgPSAoIHRBTklfVTggKSggdmFsdWUgPj4gMTYgKTsKKyAgICAqKHB0ciArIDEpID0gKCB0QU5JX1U4ICkoIHZhbHVlID4+IDggKTsKKyAgICAqKHB0cikgPSAoIHRBTklfVTggKSggdmFsdWUgKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIChwdHIgKyA0KTsKK30KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gcGFsX3NldF9VMTYKKworICAgIFxicmllZiBBc3NpZ24gMTYtYml0IHVuc2lnbmVkIHZhbHVlIHRvIGEgYnl0ZSBhcnJheSBiYXNlIG9uIENQVSdzIGVuZGlhbm5lc3MuCisKKyAgICBcbm90ZSBDYWxsZXIgbXVzdCB2YWxpZGF0ZSB0aGUgYnl0ZSBhcnJheSBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQgdGhlIHZsYXVlCisgICAgICAgIAorICAgIFxwYXJhbSBwdHIgLSBTdGFydGluZyBhZGRyZXNzIG9mIGEgYnl0ZSBhcnJheQorICAgIAorICAgIFxwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIGJ5dGUgYXJyYXkKKyAgICAKKyAgICBccmV0dXJuIC0gVGhlIGFkZHJlc3MgdG8gdGhlIGJ5dGUgYWZ0ZXIgdGhlIGFzc2lnbm1lbnQuIFRoaXMgbWF5IG9yIG1heSBub3QgCisgICAgYmUgdmFsaWQuIENhbGxlciB0byB2ZXJpZnkuCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQU5JX0lOTElORV9GVU5DVElPTiB0QU5JX1U4ICogcGFsX3NldF9VMTYodEFOSV9VOCAqcHRyLCB0QU5JX1UxNiB2YWx1ZSkKK3sKKyNpZiBkZWZpbmVkKCBBTklfQklHX0JZVEVfRU5ESUFOICkKKyAgICAgKihwdHIpID0gKCB0QU5JX1U4ICkoIHZhbHVlID4+IDggKTsKKyAgICAgKihwdHIgKyAxKSA9ICggdEFOSV9VOCApKCB2YWx1ZSApOworI2Vsc2UKKyAgICAqKHB0ciArIDEpID0gKCB0QU5JX1U4ICkoIHZhbHVlID4+IDggKTsKKyAgICAqKHB0cikgPSAoIHRBTklfVTggKSggdmFsdWUgKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIChwdHIgKyAyKTsKK30KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gcGFsX2dldF9VMTYKKworICAgIFxicmllZiBSZXRyaWV2ZSBhIDE2LWJpdCB1bnNpZ25lZCB2YWx1ZSBmcm9tIGEgYnl0ZSBhcnJheSBiYXNlIG9uIENQVSdzIGVuZGlhbm5lc3MuCisKKyAgICBcbm90ZSBDYWxsZXIgbXVzdCB2YWxpZGF0ZSB0aGUgYnl0ZSBhcnJheSBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQgdGhlIHZsYXVlCisgICAgICAgIAorICAgIFxwYXJhbSBwdHIgLSBTdGFydGluZyBhZGRyZXNzIG9mIGEgYnl0ZSBhcnJheQorICAgIAorICAgIFxwYXJhbSBwVmFsdWUgLSBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgZm9yIDE2IGJpdCB2YWx1ZS4gVmFsdWUgaXMgdG8gYXNzaWduIAorICAgIHRvIHRoaXMgbG9jYXRpb24uCisgICAgCisgICAgXHJldHVybiAtIFRoZSBhZGRyZXNzIHRvIHRoZSBieXRlIGFmdGVyIHRoZSBhc3NpZ25tZW50LiBUaGlzIG1heSBvciBtYXkgbm90IAorICAgIGJlIHZhbGlkLiBDYWxsZXIgdG8gdmVyaWZ5LgorICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0FOSV9JTkxJTkVfRlVOQ1RJT04gdEFOSV9VOCAqIHBhbF9nZXRfVTE2KHRBTklfVTggKnB0ciwgdEFOSV9VMTYgKnBWYWx1ZSkKK3sKKyNpZiBkZWZpbmVkKCBBTklfQklHX0JZVEVfRU5ESUFOICkKKyAgICAqcFZhbHVlID0gKCgodEFOSV9VMTYpICgqcHRyIDw8IDgpKSB8CisgICAgICAgICAgICAoKHRBTklfVTE2KSAoKihwdHIrMSkpKSk7CisjZWxzZQorICAgICpwVmFsdWUgPSAoKCh0QU5JX1UxNikgKCoocHRyKzEpIDw8IDgpKSB8CisgICAgICAgICAgICAoKHRBTklfVTE2KSAoKnB0cikpKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIChwdHIgKyAyKTsKK30KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gcGFsX2dldF9VMzIKKworICAgIFxicmllZiBSZXRyaWV2ZSBhIDMyLWJpdCB1bnNpZ25lZCB2YWx1ZSBmcm9tIGEgYnl0ZSBhcnJheSBiYXNlIG9uIENQVSdzIGVuZGlhbm5lc3MuCisKKyAgICBcbm90ZSBDYWxsZXIgbXVzdCB2YWxpZGF0ZSB0aGUgYnl0ZSBhcnJheSBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQgdGhlIHZsYXVlCisgICAgICAgIAorICAgIFxwYXJhbSBwdHIgLSBTdGFydGluZyBhZGRyZXNzIG9mIGEgYnl0ZSBhcnJheQorICAgIAorICAgIFxwYXJhbSBwVmFsdWUgLSBQb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgZm9yIDMyIGJpdCB2YWx1ZS4gVmFsdWUgaXMgdG8gYXNzaWduIAorICAgIHRvIHRoaXMgbG9jYXRpb24uCisgICAgCisgICAgXHJldHVybiAtIFRoZSBhZGRyZXNzIHRvIHRoZSBieXRlIGFmdGVyIHRoZSBhc3NpZ25tZW50LiBUaGlzIG1heSBvciBtYXkgbm90IAorICAgIGJlIHZhbGlkLiBDYWxsZXIgdG8gdmVyaWZ5LgorICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0FOSV9JTkxJTkVfRlVOQ1RJT04gdEFOSV9VOCAqIHBhbF9nZXRfVTMyKHRBTklfVTggKnB0ciwgdEFOSV9VMzIgKnBWYWx1ZSkKK3sKKyNpZiBkZWZpbmVkKCBBTklfQklHX0JZVEVfRU5ESUFOICkKKyAgICAqcFZhbHVlID0gKCAodEFOSV9VMzIpKCoocHRyKSA8PCAyNCkgfAorICAgICAgICAgICAgICh0QU5JX1UzMikoKihwdHIrMSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAodEFOSV9VMzIpKCoocHRyKzIpIDw8IDgpIHwKKyAgICAgICAgICAgICAodEFOSV9VMzIpKCoocHRyKzMpKSApOworI2Vsc2UKKyAgICAqcFZhbHVlID0gKCAodEFOSV9VMzIpKCoocHRyKzMpIDw8IDI0KSB8CisgICAgICAgICAgICAgKHRBTklfVTMyKSgqKHB0cisyKSA8PCAxNikgfAorICAgICAgICAgICAgICh0QU5JX1UzMikoKihwdHIrMSkgPDwgOCkgfAorICAgICAgICAgICAgICh0QU5JX1UzMikoKihwdHIpKSApOworI2VuZGlmCisKKyAgICByZXR1cm4gKHB0ciArIDQpOworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9TWVMvbGVnYWN5L3NyYy9wYWwvaW5jL3BhbFBpcGVzLmggYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3BhbC9pbmMvcGFsUGlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjNkOWIyCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy9wYWwvaW5jL3BhbFBpcGVzLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisKKworICAgIFxmaWxlIHBhbFBpcGVzLmgKKworICAgIFxicmllZiBEZWZpbmVzIFBhbCBwaXBlcyB0byB0cmFuc2ZlciBmcmFtZXMvbWVtb3J5IHRvL2Zyb20gdGhlIGRldmljZQorCisgICAgJElkJAorCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZAorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZuZGVmIFBBTFBJUEVTX0gKKyNkZWZpbmUgUEFMUElQRVNfSAorCisjaW5jbHVkZSAiaGFsVHlwZXMuaCIKKworCit0eXBlZGVmIGVudW0KK3sKKyAgICBDU1JfUElQRSA9ICAwLCAgLy9DU1IgRW5kcG9pbnQgZm9yIFVTQiBhbmQgbm9uLURYRSB0cmFuc2ZlciBmb3IgUENJL1BDSWUKKworICAgIFBJUEVfVFhfMSA9IDEsICAvL2xvd2VzdCBwcmlvcml0eQorICAgIFBJUEVfVFhfMiA9IDIsCisgICAgUElQRV9UWF8zID0gMywKKyAgICBQSVBFX1RYXzQgPSA0LAorICAgIFBJUEVfVFhfNSA9IDUsCisgICAgUElQRV9UWF82ID0gNiwKKyAgICBQSVBFX1RYXzcgPSA3LAorCisgICAgUElQRV9SWF8xID0gOCwgIC8vbG93ZXN0IHByaW9yaXR5CisgICAgUElQRV9SWF8yID0gOSwKKyAgICBQSVBFX1JYXzMgPSAxMCwKKyAgICBQSVBFX1JYXzQgPSAxMSwKKyAgICBQSVBFX1JYXzUgPSAxMiwKKyAgICBQSVBFX1JYXzYgPSAxMywKKyAgICBQSVBFX1JYXzcgPSAxNCwKKworICAgIE1BWF9QSVBFID0gUElQRV9SWF83LAorICAgIEFOWV9QSVBFCit9ZVBpcGVzOworCisKKy8qIHNIZGRNZW1TZWdtZW50IGRlZmluZXMgdGhlIHN0cnVjdHVyZSB0aGF0IHRoZSBIREQgd2lsbCB1c2UgdG8gdHJhbnNmZXIgZnJhbWVzCisgICAgZG93biB0aHJvdWdoIHRoZSBoYWwgdG8gdGhlIHBhbCBsYXllci4KKyovCit0eXBlZGVmIHN0cnVjdCB0YWdIZGRNZW1TZWdtZW50Cit7CisgICAgc3RydWN0IHRhZ0hkZE1lbVNlZ21lbnQgKm5leHQ7ICAgICAgLy9saW5rZWQgbGlzdCwgTlVMTD1ubyBtb3JlIHNlZ21lbnRzIGxpbmtlZAorICAgIHZvaWQgKmhkZENvbnRleHQ7ICAgICAgICAgICAgICAgICAgIC8vcHJvdmlkZXMgYSBwbGFjZSBmb3IgdGhlIEhERCBsYXllciB0byByZWNvcmQgaW5mb3JtYXRpb24KKyAgICB2b2lkICphZGRyOyAgICAgICAgICAgICAgICAgICAgICAgICAvL2VpdGhlciB2aXJ0dWFsIG9yIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzLiBQQ0kgd2lsbCBsaWtlbHkgYmUgcGh5c2ljYWwgYWRkcmVzc2VzLCBVU0Igd2lsbCBiZSB2aXJ0dWFsIGFkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcGFsIGxheWVyIHdpbGwgY29udmVydCB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgdG8gcGh5c2ljYWwgZm9yIHRyYW5zZmVyIHdpdGggRFhFLgorICAgIHRBTklfVTMyIGxlbmd0aDsgICAgICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGJ5dGVzIGNvbnRhaW5lZCBpbiBzZWdtZW50IGZvciB0cmFuc2Zlci4KK31zSGRkTWVtU2VnbWVudDsKKworCisKKy8qIHNUeEZyYW1lVHJhbnNmZXIgZGVmaW5lcyB0aGUgc3RydWN0dXJlIHRoYXQgSGFsJ3MgdHJhbnNtaXQgcXVldWVpbmcgd2lsbCB1c2UgdG8KKyAgICBrZWVwIGZyYW1lcyBpbiBxdWV1ZXMsIHJlYWR5IGZvciB0cmFuc2ZlciB0byB0aGUgcGFsIGxheWVyLgorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ1R4RnJhbWVUcmFuc2ZlcgoreworICAgIHN0cnVjdCB0YWdUeEZyYW1lVHJhbnNmZXIgKm5leHQ7ICAgLy91c2VkIGJ5IGhhbCB0byBxdWV1ZSB0cmFuc21pdCBmcmFtZXMsIFBhbCBkb2VzIG5vdGhpbmcgd2l0aCB0aGlzCisgICAgc0hkZE1lbVNlZ21lbnQgKmJkOyAgICAgICAgICAgICAgICAvL2lmIE5VTEwsIHRoZSBCRCBzaG91bGQgYmUgY3JlYXRlZCBkdXJpbmcgRFhFIHRyYW5zZmVyIHRvIGFzaWMKKyAgICBzSGRkTWVtU2VnbWVudCAqc2VnbWVudDsgICAgICAgICAgIC8vYWxsIHNlZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbmlkaXZpZHVhbCBmcmFtZQorICAgIHRBTklfVTMyIGRlc2NDb3VudDsgICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGRlc2NyaXB0b3JzIG5lZWRlZCB0byB0cmFuc2ZlcgorfXNUeEZyYW1lVHJhbnNmZXI7CisKKworCisKKyNkZWZpbmUgUEFMX1JYX0JVRkZFUl9TSVpFICAoMTYgKiAxMDI0KQordHlwZWRlZiB0QU5JX1U4ICp0UnhCdWZmZXI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdEFOSV9VMzIgbkJ5dGVzOyAgICAgICAgICAgICAgICAgICAgLy9udW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgdG8gdGhlIGJ1ZmZlcgorICAgIHRSeEJ1ZmZlciBwQmJ1ZmZlcjsgICAgICAgICAgICAgICAgIC8vcnhCdWZmZXIgdmlydHVhbCBwb2ludGVyCisgICAgdEFOSV9CVUZGRVJfQUREUiBwaHlzQWRkcjsgICAgICAgICAgICAgICAvL3J4QnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2l0IGlzIGFzc3VtZWQgdGhhdCB0aGUgQkQgaXMgcHJlc2VudCBhbmQgd2Uga25vdyBob3cgdG8gaW50ZXJwcmV0IHRoZSB3aG9sZSBidWZmZXIKK31zUnhGcmFtZTsKKworCisKKy8qIHNSeEZyYW1lVHJhbnNmZXIgZGVmaW5lcyB0aGUgc3RydWN0dXJlIHRoYXQgSGFsJ3MgcmVjZWl2ZSBxdWV1aW5nIHdpbGwgdXNlIHRvCisgICAga2VlcCBmcmFtZXMgaW4gcmVjZWl2ZSBxdWV1ZXMuCisqLwordHlwZWRlZiBzdHJ1Y3QgdGFnUnhGcmFtZVRyYW5zZmVyCit7CisgICAgc3RydWN0IHRhZ1J4RnJhbWVUcmFuc2ZlciAqbmV4dDsgICAgLy91c2VkIGJ5IGhhbCB0byBxdWV1ZSB0cmFuc21pdCBmcmFtZXMsIFBhbCBkb2VzIG5vdGhpbmcgd2l0aCB0aGlzCisgICAgZVBpcGVzIHBpcGU7ICAgICAgICAgICAgICAgICAgICAgICAgLy9waXBlIHRoZSBmcmFtZSB3YXMgcmVjZWl2ZWQgb24gLSBuZWVkIHRvIGZyZWUgdGhlIGNvcnJlY3QgcmVzb3VyY2VzIHF1aWNrbHkKKyAgICBzUnhGcmFtZSAqcnhGcmFtZTsgICAgICAgICAgICAgICAgICAvL3ZpcnR1YWwgbWVtb3J5IHBvaW50ZXIgdG8gcmF3IGZyYW1lIGRhdGEKK31zUnhGcmFtZVRyYW5zZmVyOworCisKKwordHlwZWRlZiB1bmlvbgoreworICAgIHNUeEZyYW1lVHJhbnNmZXIgdHhGcmFtZTsKKyAgICBzUnhGcmFtZVRyYW5zZmVyIHJ4RnJhbWU7Cit9dUZyYW1lVHJhbnNmZXI7CisKKwordHlwZWRlZiBlSGFsU3RhdHVzICgqcGFsWGZyQ29tcGxldGVGUHRyKSh0SGFsSGFuZGxlIGhIYWwsIGVQaXBlcyBwaXBlLCB1RnJhbWVUcmFuc2ZlciAqZnJhbWUpOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdEFOSV9VMzIgbkRlc2NzOyAgICAgICAgICAgICAgICAgICAgLy9udW1iZXIgb2YgVVJCcyBmb3IgVVNCIG9yIGRlc2NyaXB0b3JzIGZvciBEWEUgdGhhdCBjYW4gYmUgcXVldWVkIGZvciB0cmFuc2ZlciBhdCBvbmUgdGltZQorICAgIHRBTklfVTMyIG5SeEJ1ZmZlcnM7ICAgICAgICAgICAgICAgIC8vbWF4aW11bSBudW1iZXIgb2YgcmVjZWl2ZSBidWZmZXJzIGZyb20gcGh5c2ljYWwgbWVtb3J5IHRvIHVzZSBmb3IgdGhpcyBwaXBlCisgICAgdEFOSV9CT09MRUFOIHByZWZlckNpcmN1bGFyOyAgICAgICAgLy8xID0gdXNlIGNpcmN1bGFyIGRlc2NyaXB0b3IgaGFuZGxpbmcgaWYgYXZhaWxhYmxlLCBsaW5lYXIgb3RoZXJ3aXNlCisgICAgdEFOSV9CT09MRUFOIGJkUHJlc2VudDsgICAgICAgICAgICAgLy8xID0gQkQgYXR0YWNoZWQgdG8gZnJhbWVzIGZvciB0aGlzIHBpcGUKKyAgICBwYWxYZnJDb21wbGV0ZUZQdHIgY2FsbGJhY2s7ICAgICAgICAvL2NhbGxiYWNrIHdoZW4gdHJhbnNmZXIgaXMgY29tcGxldGUsIGlmIG5vdCBOVUxMCisgICAgcGFsWGZyQ29tcGxldGVGUHRyIHJ4Q2FsbGJhY2s7ICAgICAgLy9SeCBjYWxsYmFjayB3aGVuIHRyYW5zZmVyIHR5cGUgaXMgSDJILCBpZiBub3QgTlVMTAorICAgIHRBTklfVTMyIHJlZldROyAgICAgICAgICAgICAvLyBSZWZlcmVuY2UgV1EgLSBmb3IgSDJCIGFuZCBCMkggb25seQorICAgIHRBTklfVTMyIHhmclR5cGU7ICAgICAgICAgICAvLyBIMkIoVHgpLCBCMkgoUngpLCBIMkgoU1JBTTwtPkhvc3RNZW0gUi9XKQorICAgIHRBTklfVTMyIGNoUHJpb3JpdHk7ICAgICAgICAvLyBDaGFubmVsIFByaW9yaXR5IDcoSGlnaGVzdCkgLSAwKExvd2VzdCkKKyAgICB0QU5JX0JPT0xFQU4gYkNmZ2VkOyAgICAgICAgLy93aGV0aGVyIHRoZSBwaXBlIGhhcyBiZWVuIGNvbmZpZ3VyZWQKKyAgICB0QU5JX1UzMiBpbmRleEVQOyAgICAgLy9UaGlzIGlzIGZvciBVU0Igb25seSwgaXQgaXMgdGhlIGluZGV4IG9mIFRYL1JYIGVuZHBvaW50LCBUWF9EQVRBX1BJUEVfT1VULi4uCisgICAgdEFOSV9VMzIgYm11VGhyZXNob2xkOyAvL0JNVSB0aHJlc2hvbGQgCisgICAgLy8gRm9yIFBBTCdzIGludGVybmFsIHVzZQorICAgIHZvaWQgKnBSZXNlcnZlZDE7CisgICAgdm9pZCAqcFJlc2VydmVkMjsKKworICAgIHRBTklfQk9PTEVBTiB1c2VfbG93ZXJfNGc7ICAvKio8IEFkZGVkIGZvciBHZW41IFByZWZldGNoICovCisgICAgdEFOSV9CT09MRUFOIHVzZV9zaG9ydF9kZXNjX2ZtdDsKK31zUGlwZUNmZzsKKworCisKKworI2RlZmluZSBQSVBFX01FTV9YRlJfTElNSVQgICgxNiAqIDEwMjQpICAgLy9tYXhpbXVtIHNpbmdsZSB0cmFuc2ZlciBzaXplCisKKworCisKKy8vIHBhbFBpcGVzIEZ1bmN0aW9ucy4uLi4KKyNkZWZpbmUgcGFsSXNQaXBlQ2ZnKGhIZGQsIHBpcGVOdW0pICgoaEhkZCktPlBpcGVDZmdJbmZvWyhwaXBlTnVtKV0uYkNmZ2VkKQorZUhhbFN0YXR1cyBwYWxQaXBlQ2ZnKHRIZGRIYW5kbGUsIGVQaXBlcyBwaXBlLCBzUGlwZUNmZyAqcFBpcGVDZmcpOworZUhhbFN0YXR1cyBwYWxXcml0ZUZyYW1lKHRIZGRIYW5kbGUsIGVQaXBlcyBwaXBlLCBzVHhGcmFtZVRyYW5zZmVyICpmcmFtZSk7CitlSGFsU3RhdHVzIHBhbEZyZWVSeEZyYW1lKHRIZGRIYW5kbGUsIHNSeEZyYW1lVHJhbnNmZXIgKmZyYW1lKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxJbnRlcnJ1cHRzLmgiCitlSGFsU3RhdHVzIHBhbFR4UGlwZUlzcih0SGFsSGFuZGxlIGhIYWwsIGVIYWxJbnRTb3VyY2VzIGludFNvdXJjZSk7CitlSGFsU3RhdHVzIHBhbFJ4UGlwZUlzcih0SGFsSGFuZGxlIGhIYWwsIGVIYWxJbnRTb3VyY2VzIGludFNvdXJjZSk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1NZUy9sZWdhY3kvc3JjL3BhbC9pbmMvcGFsVGltZXIuaCBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvcGFsL2luYy9wYWxUaW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDY4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3BhbC9pbmMvcGFsVGltZXIuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAgCisKKyAgCisgICAgXGZpbGUgcGFsVGltZXIuaAorICAKKyAgICBcYnJpZWYgRGVmaW5lIGRhdGEgc3RydWN0dXJlIGFuZCBwdG90b3R5cGUgZm9yIFBBTCB0aW1lci4KKyAgCisgICAgJElkJCAKKyAgCisgIAorICAgIENvcHlyaWdodCAoQykgMjAwNiBBaXJnbyBOZXR3b3JrcywgSW5jb3Jwb3JhdGVkCisgICAgLi4uIGRlc2NyaXB0aW9uLi4uCisgIAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmICFkZWZpbmVkKCBQQUxUSU1FUl9IX18gKQorI2RlZmluZSBQQUxUSU1FUl9IX18KKworCisvKgorUEFMIFRJTUVSCisgIFRoaXMgdGltZXIgY2FuIGJlIHVzZWQgZm9yIGV2ZXJ5IG1vZHVsZSBpbiBXaW5kb3dzIHNpZGUuIAorICBPbiBMaW51cyBzaWRlLCB0aGlzIGNhbiBvbmx5IGJlIHVzZWQgYnkgdGltZXIgZm9yIEhERC4gTm90IGZvciB0aW1lcnMgdXNlZCBpbiBydGxpYiwgaGVuY2UgaXQgZG9lc24ndCByZXBsYWNlIFRYX1RJTUVSCisqLworCit0eXBlZGVmIHZvaWQgKiB0UGFsVGltZXJIYW5kbGU7CisKKyNkZWZpbmUgUEFMX0lOVkFMSURfVElNRVJfSEFORExFIChOVUxMKQorCit0eXBlZGVmIHZvaWQgKCpwYWxUaW1lckNhbGxiYWNrKSh2b2lkICopOworCisjZGVmaW5lIFBBTF9USU1FUl9UT19NU19VTklUICAgICAgMTAwMAorI2RlZmluZSBQQUxfVElNRVJfVE9fU0VDX1VOSVQgICAgIDEwMDAwMDAKKworCisvL1BBTCB0aW1lciBmdW5jdGlvbnMKKy8vcFBhbFRpbWVyIGlzIGEgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgdFBhbFRpbWVyIG9iamVjdAorLy9wQ29udGV4dCBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgaW4gd2hlbiBjYWxsYmFjayBpcyBjYWxsZWQKKy8vZlJlc3RhcnQgdG8gc2V0IHdoZXRoZXIgdGhlIHRpbWVyIGlzIHJlc3RhcnQgYWZ0ZXIgY2FsbGJhY2sgcmV0dXJucworI2lmZGVmIFRJTUVSX01BTkFHRVIKKyNkZWZpbmUgcGFsVGltZXJBbGxvYyhoSGRkLCBwaFBhbFRpbWVyLCBwQ2FsbGJhY2ssIHBDb250ZXh0KSBcCisgICAgICAgICAgICAgIHBhbFRpbWVyQWxsb2NfZGVidWcoaEhkZCwgcGhQYWxUaW1lciwgcENhbGxiYWNrLCBwQ29udGV4dCwgX19GSUxFX18sIF9fTElORV9fKQorZUhhbFN0YXR1cyBwYWxUaW1lckFsbG9jX2RlYnVnKCB0SGRkSGFuZGxlIGhIZGQsIHRQYWxUaW1lckhhbmRsZSAqcGhQYWxUaW1lciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbFRpbWVyQ2FsbGJhY2sgcENhbGxiYWNrLCB2b2lkICpwQ29udGV4dCwgY2hhciogZmlsZU5hbWUsIHZfVTMyX3QgbGluZU51bSAgKTsgICAgICAgICAgICAgIAorI2Vsc2UKK2VIYWxTdGF0dXMgcGFsVGltZXJBbGxvYyh0SGRkSGFuZGxlIGhIZGQsIHRQYWxUaW1lckhhbmRsZSAqcGhQYWxUaW1lciwgcGFsVGltZXJDYWxsYmFjayBwQ2FsbGJhY2ssIHZvaWQgKnBDb250ZXh0KTsKKyNlbmRpZgorLy9UaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSB0aGUgdGltZXIKKy8vT24gV2luZG93cyBwbGF0Zm9ybSwgaXQgY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gZGV2aWNlIGlzIHVubG9hZGluZy4KK2VIYWxTdGF0dXMgcGFsVGltZXJGcmVlKHRIZGRIYW5kbGUsIHRQYWxUaW1lckhhbmRsZSk7CisvL1RvIHN0YXJ0IGEgdGltZXIKKy8vdUV4cGlyZVRpbWUgaXMgdGhlIHRpbWVyIGxhcHNlIGJlZm9yZSB0aW1lciBmaXJlcy4gSWYgdGhlIHRpbWVyIGlzIGluIHJ1bm5pbmcgc3RhdGUgYW5kIHRoZSBmUmVzdGFydCBpcyB0cnVlLAorLy91RXhwaXJlVGltZSBpcyBzZXQgc28gdGhhdCBpdCBpcyB0aGUgbmV3IGludGVydmFsLCBpbiB1bml0cyBvZiBtaWNyb3NlY29uZHMKK2VIYWxTdGF0dXMgcGFsVGltZXJTdGFydCh0SGRkSGFuZGxlLCB0UGFsVGltZXJIYW5kbGUsIHRBTklfVTMyIHVFeHBpcmVUaW1lLCB0QU5JX0JPT0xFQU4gZlJlc3RhcnQpOworLy9wYWxUaW1lclN0b3Agd2lsbCBjYW5jZWwgdGhlIHRpbWVyIGJ1dCBkb2Vzbid0IGd1YXJyYW50ZWUgdGhlIGNhbGxiYWNrIHdpbGwgbm90IGNhbGxlZCBhZnRlcndhcmRzCisvL0ZvciBXaW5kb3dzLCBpZiB0aGUgZHJpdmVyIGlzIGhhbHRpbmcsIHRoZSBjYWxsYmFjayBpcyBub3QgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4gCitlSGFsU3RhdHVzIHBhbFRpbWVyU3RvcCh0SGRkSGFuZGxlLCB0UGFsVGltZXJIYW5kbGUpOyAKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvcGFsL3NyYy9wYWxBcGlDb21tLmMgYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3BhbC9zcmMvcGFsQXBpQ29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMjFlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3BhbC9zcmMvcGFsQXBpQ29tbS5jCkBAIC0wLDAgKzEsNDAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHBhbEFwaS5oPgorI2luY2x1ZGUgPHNpclR5cGVzLmg+ICAgLy8gbmVlZGVkIGZvciB0U2lyUmV0U3RhdHVzCisjaW5jbHVkZSA8dm9zX2FwaS5oPgorCisjaW5jbHVkZSA8c2lyUGFyYW1zLmg+ICAvLyBuZWVkZWQgZm9yIHRTaXJNYk1zZworI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIgorCisKKy8vIGl0cyBub3Qgd29ydGggdGhlIHRpbWUgdHJ5aW5nIHRvIGdldCBhbGwgdGhlIGluY2x1ZGVzIGluIHBsYWNlIHRvIGdldCB0bworLy8gaGFsTW1oRm9yd2FyZE1CbXNnLiAgaWYgSSBpbmx1ZGUgaGFsTW50LmgsIEkgZ2V0IGFsbCBraWRzIG9mIGNvbXBpbGUgZXJycm9zCisvLyBmb3IgdGhpbmdzIG1pc3NpbmcgZnJvbSBwYWxQaXBlcy5oIChhc2ljRHhlLmggaXMgbG9va2luZyBmb3IgdGhlc2UpLiAgcGFsUGlwZXMKKy8vIGlzIHVzZWQgb25seSBpbiBHZW40IERWVCBjb2RlIHNvIHdoeSB3ZSB3b3VsZCBoYXZlIGl0IG9yIG5lZWQgaXQgaXMgcHV6emxpbmcuCisvLyNpbmNsdWRlIDxoYWxNbnQuaD4KKworCisKKyNpZmRlZiBNRU1PUllfREVCVUcKK2VIYWxTdGF0dXMgcGFsQWxsb2NhdGVNZW1vcnlfZGVidWcoIHRIZGRIYW5kbGUgaEhkZCwgdm9pZCAqKnBwTWVtb3J5LCB0QU5JX1UzMiBudW1CeXRlcywgY2hhciogZmlsZU5hbWUsIHRBTklfVTMyIGxpbmVOdW0gKQoreworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgCisgICAqcHBNZW1vcnkgPSB2b3NfbWVtX21hbGxvY19kZWJ1ZyggbnVtQnl0ZXMsIGZpbGVOYW1lLCBsaW5lTnVtICk7CisgICAKKyAgIGlmICggTlVMTCA9PSAqcHBNZW1vcnkgKSAKKyAgIHsKKyAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICAKKyAgIHJldHVybiggaGFsU3RhdHVzICk7Cit9CisjZWxzZQorZUhhbFN0YXR1cyBwYWxBbGxvY2F0ZU1lbW9yeSggdEhkZEhhbmRsZSBoSGRkLCB2b2lkICoqcHBNZW1vcnksIHRBTklfVTMyIG51bUJ5dGVzICkKK3sKKyAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIAorICAgKnBwTWVtb3J5ID0gdm9zX21lbV9tYWxsb2MoIG51bUJ5dGVzICk7CisgICAKKyAgIGlmICggTlVMTCA9PSAqcHBNZW1vcnkgKSAKKyAgIHsKKyAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB9CisgICAKKyAgIHJldHVybiggaGFsU3RhdHVzICk7Cit9CisjZW5kaWYKKworCitlSGFsU3RhdHVzIHBhbEZyZWVNZW1vcnkoIHRIZGRIYW5kbGUgaEhkZCwgdm9pZCAqcE1lbW9yeSApCit7CisgICB2b3NfbWVtX2ZyZWUoIHBNZW1vcnkgKTsKKyAgIAorICAgcmV0dXJuKCBlSEFMX1NUQVRVU19TVUNDRVNTICk7Cit9CisKK2VIYWxTdGF0dXMgcGFsRmlsbE1lbW9yeSggdEhkZEhhbmRsZSBoSGRkLCB2b2lkICpwTWVtb3J5LCB0QU5JX1UzMiBudW1CeXRlcywgdEFOSV9CWVRFIGZpbGxWYWx1ZSApCit7CisgICB2b3NfbWVtX3NldCggcE1lbW9yeSwgbnVtQnl0ZXMsIGZpbGxWYWx1ZSApOworICAgCisgICByZXR1cm4oIGVIQUxfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKworCitlSGFsU3RhdHVzIHBhbENvcHlNZW1vcnkoIHRIZGRIYW5kbGUgaEhkZCwgdm9pZCAqcERzdCwgY29uc3Qgdm9pZCAqcFNyYywgdEFOSV9VMzIgbnVtQnl0ZXMgKQoreworICAgdm9zX21lbV9jb3B5KCBwRHN0LCBwU3JjLCBudW1CeXRlcyApOworICAgCisgICByZXR1cm4oIGVIQUxfU1RBVFVTX1NVQ0NFU1MgKTsKK30KKworCisKK3RBTklfQk9PTEVBTiBwYWxFcXVhbE1lbW9yeSggdEhkZEhhbmRsZSBoSGRkLCB2b2lkICpwTWVtb3J5MSwgdm9pZCAqcE1lbW9yeTIsIHRBTklfVTMyIG51bUJ5dGVzICkKK3sKKyAgIHJldHVybiggdm9zX21lbV9jb21wYXJlKCBwTWVtb3J5MSwgcE1lbW9yeTIsIG51bUJ5dGVzICkgKTsKK30gICAKKworCitlSGFsU3RhdHVzIHBhbFBrdEFsbG9jKHRIZGRIYW5kbGUgaEhkZCwgZUZyYW1lVHlwZSBmcm1UeXBlLCB0QU5JX1UxNiBzaXplLCB2b2lkICoqZGF0YSwgdm9pZCAqKnBwUGFja2V0KQoreworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICAKKyAgIHZvc19wa3RfdCAqcFZvc1BhY2tldDsKKyAgIAorICAgZG8gCisgICB7CisgICAgICAvLyB3ZSBhcmUgb25seSBoYW5kbGluZyB0aGUgODAyXzExX01HTVQgZnJhbWUgdHlwZSBmb3IgUEUvTElNLiAgQWxsIG90aGVyIGZyYW1lIHR5cGVzIHNob3VsZCBiZSAKKyAgICAgIC8vIHBvcnRlZCB0byB1c2UgdGhlIFZPU1MgQVBJcyBkaXJlY3RseSBhbmQgc2hvdWxkIG5vdCBiZSB1c2luZyB0aGlzIHBhbFBrdEFsbG9jIEFQSS4KKyAgICAgIFZPU19BU1NFUlQoIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCA9PSBmcm1UeXBlICk7CisgICAgCisgICAgICBpZiAoIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCAhPSBmcm1UeXBlICkgYnJlYWs7CisgICAKKyAgICAgIC8vIGFsbG9jYXRlIG9uZSA4MDJfMTFfTUdNVCBWT1MgcGFja2V0LCB6ZXJvIHRoZSBwYWNrZXQgYW5kIGZhaWwgdGhlIGNhbGwgaWYgbm90aGluZyBpcyBhdmFpbGFibGUuCisgICAgICAvLyBpZiB3ZSBjYW5ub3QgZ2V0IHRoaXMgdm9zIHBhY2tldCwgZmFpbC4KKyAgICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfZ2V0X3BhY2tldCggJnBWb3NQYWNrZXQsIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCwgc2l6ZSwgMSwgVk9TX1RSVUUsIE5VTEwsIE5VTEwgKTsKKyAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKSBicmVhazsKKyAgICAgIAorICAgICAgLy8gUmVzZXJ2ZSB0aGUgc3BhY2UgYXQgdGhlIGhlYWQgb2YgdGhlIHBhY2tldCBmb3IgdGhlIGNhbGxlci4gIElmIHdlIGNhbm5vdCByZXNlcnZlIHRoZSBzcGFjZQorICAgICAgLy8gdGhlbiB3ZSBoYXZlIHRvIGZhaWwgKHJldHVybiB0aGUgcGFja2V0IHRvIHZvc3MgZmlyc3QhKQorICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHBWb3NQYWNrZXQsIGRhdGEsIHNpemUgKTsKKyAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKSAKKyAgICAgIHsKKyAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFZvc1BhY2tldCApOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIEV2ZXJ5dGhpbmcgd2VudCB3ZWxsIGlmIHdlIGdldCBoZXJlLiAgUmV0dXJuIHRoZSBwYWNrZXQgcG9pbnRlciB0byB0aGUgY2FsbGVyIGFuZCBpbmRpY2F0ZQorICAgICAgLy8gc3VjY2VzcyB0byB0aGUgY2FsbGVyLgorICAgICAgKnBwUGFja2V0ID0gKHZvaWQgKilwVm9zUGFja2V0OworICAgICAgCisgICAgICBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgCisgICB9IHdoaWxlKCAwICk7CisgICAKKyAgIHJldHVybiggaGFsU3RhdHVzICk7Cit9CisKKworCit2b2lkIHBhbFBrdEZyZWUoIHRIZGRIYW5kbGUgaEhkZCwgZUZyYW1lVHlwZSBmcm1UeXBlLCB2b2lkKiBidWYsIHZvaWQgKnBQYWNrZXQpCit7CisgICB2b3NfcGt0X3QgKnBWb3NQYWNrZXQgPSAodm9zX3BrdF90ICopcFBhY2tldDsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgICAgCisgICBkbyAKKyAgIHsKKyAgICAgIFZPU19BU1NFUlQoIHBWb3NQYWNrZXQgKTsKKyAgICAgIAorICAgICAgaWYgKCAhcFZvc1BhY2tldCApIGJyZWFrOworICAgICAgCisgICAgICAvLyB3ZSBhcmUgb25seSBoYW5kbGluZyB0aGUgODAyXzExX01HTVQgZnJhbWUgdHlwZSBmb3IgUEUvTElNLiAgQWxsIG90aGVyIGZyYW1lIHR5cGVzIHNob3VsZCBiZSAKKyAgICAgIC8vIHBvcnRlZCB0byB1c2UgdGhlIFZPU1MgQVBJcyBkaXJlY3RseSBhbmQgc2hvdWxkIG5vdCBiZSB1c2luZyB0aGlzIHBhbFBrdEFsbG9jIEFQSS4KKyAgICAgIFZPU19BU1NFUlQoIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCA9PSBmcm1UeXBlICk7CisgICAgICBpZiAoIEhBTF9UWFJYX0ZSTV84MDJfMTFfTUdNVCAhPSBmcm1UeXBlICkgYnJlYWs7CisgICAgICAKKyAgICAgIC8vIHJldHVybiB0aGUgdm9zIHBhY2tldCB0byBWb3NzLiAgTm90aGluZyB0byBkbyBpZiB0aGlzIGZhaWxzIHNpbmNlIHRoZSBwYWxQa3RGcmVlIGRvZXMgbm90IAorICAgICAgLy8gaGF2ZSBhIHJldHVybiBjb2RlLgorICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwVm9zUGFja2V0ICk7CisgICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgICAgICAKKyAgIH0gd2hpbGUoIDAgKTsKKyAgIAorICAgcmV0dXJuOworfQorICAgCisKKwordEFOSV9VMzIgcGFsR2V0VGlja0NvdW50KHRIZGRIYW5kbGUgaEhkZCkKK3sKKyAgIHJldHVybiggdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKSApOworfQorCisKK3RBTklfVTMyIHBhbF9iZTMyX3RvX2NwdSh0QU5JX1UzMiB4KQoreworICAgcmV0dXJuKCB4ICk7Cit9CisKK3RBTklfVTMyIHBhbF9jcHVfdG9fYmUzMih0QU5JX1UzMiB4KQoreworICAgcmV0dXJuKCggeCApICk7Cit9ICAgCisKK3RBTklfVTE2IHBhbF9iZTE2X3RvX2NwdSh0QU5JX1UxNiB4KQoreworICAgcmV0dXJuKCAoIHggKSApOworfSAgIAorICAgCit0QU5JX1UxNiBwYWxfY3B1X3RvX2JlMTYodEFOSV9VMTYgeCkKK3sKKyAgIHJldHVybiggKCB4ICkgKTsKK30gICAKKworCisKK2VIYWxTdGF0dXMgcGFsU3BpbkxvY2tBbGxvYyggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU3BpbkxvY2tIYW5kbGUgKnBIYW5kbGUgKQoreworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICB2b3NfbG9ja190ICpwTG9jazsKKyAgIAorICAgZG8KKyAgIHsKKyAgICAgIHBMb2NrID0gdm9zX21lbV9tYWxsb2MoIHNpemVvZiggdm9zX2xvY2tfdCApICk7CisgICAKKyAgICAgIGlmICggTlVMTCA9PSBwTG9jayApIGJyZWFrOworICAgICAgCisgICAgICB2b3NTdGF0dXMgPSB2b3NfbG9ja19pbml0KCBwTG9jayApOworICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUoIHBMb2NrICk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgKnBIYW5kbGUgPSAodFBhbFNwaW5Mb2NrSGFuZGxlKXBMb2NrOworICAgICAgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIAorICAgfSB3aGlsZSggMCApOworICAgCisgICByZXR1cm4oIGhhbFN0YXR1cyApOyAgIAorfQorCisKK2VIYWxTdGF0dXMgcGFsU3BpbkxvY2tGcmVlKCB0SGRkSGFuZGxlIGhIZGQsIHRQYWxTcGluTG9ja0hhbmRsZSBoU3BpbkxvY2sgKQoreworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdm9zX2xvY2tfdCAqcExvY2sgPSAodm9zX2xvY2tfdCAqKWhTcGluTG9jazsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgCisgICB2b3NTdGF0dXMgPSB2b3NfbG9ja19kZXN0cm95KCBwTG9jayApOworICAgaWYgKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgIHsKKyAgICAgIC8vIGlmIHdlIHN1Y2Nlc3NmdWxseSBkZXN0cm95IHRoZSBsb2NrLCBmcmVlCisgICAgICAvLyB0aGUgbWVtb3J5IGFuZCBpbmRpY2F0ZSBzdWNjZXNzIHRvIHRoZSBjYWxsZXIuCisgICAgICB2b3NfbWVtX2ZyZWUoIHBMb2NrICk7CisgICAgICAKKyAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisgICByZXR1cm4oIGhhbFN0YXR1cyApOworfQorCisKK2VIYWxTdGF0dXMgcGFsU3BpbkxvY2tUYWtlKCB0SGRkSGFuZGxlIGhIZGQsIHRQYWxTcGluTG9ja0hhbmRsZSBoU3BpbkxvY2sgKQoreworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdm9zX2xvY2tfdCAqcExvY2sgPSAodm9zX2xvY2tfdCAqKWhTcGluTG9jazsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgCisgICB2b3NTdGF0dXMgPSB2b3NfbG9ja19hY3F1aXJlKCBwTG9jayApOworICAgaWYgKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgIHsKKyAgICAgIC8vIGlmIHN1Y2Nlc3NmdWxseSBhY3F1aXJlIHRoZSBsb2NrLCBpbmRpY2F0ZSBzdWNjZXNzCisgICAgICAvLyB0byB0aGUgY2FsbGVyLgorICAgICAgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKyAgIAorICAgcmV0dXJuKCBoYWxTdGF0dXMgKTsKK30gICAKKyAgIAorCisKKworCitlSGFsU3RhdHVzIHBhbFNwaW5Mb2NrR2l2ZSggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU3BpbkxvY2tIYW5kbGUgaFNwaW5Mb2NrICkKK3sKKyAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHZvc19sb2NrX3QgKnBMb2NrID0gKHZvc19sb2NrX3QgKiloU3BpbkxvY2s7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyAgIAorICAgdm9zU3RhdHVzID0gdm9zX2xvY2tfcmVsZWFzZSggcExvY2sgKTsKKyAgIGlmICggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICB7CisgICAgICAvLyBpZiBzdWNjZXNzZnVsbHkgYWNxdWlyZSB0aGUgbG9jaywgaW5kaWNhdGUgc3VjY2VzcworICAgICAgLy8gdG8gdGhlIGNhbGxlci4KKyAgICAgIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIHJldHVybiggaGFsU3RhdHVzICk7Cit9IAorCisKKy8vIENhbGxlciBvZiB0aGlzIGZ1bmN0aW9uIE1VU1QgZHluYW1pY2FsbHkgYWxsb2NhdGUgbWVtb3J5IGZvciBwQnVmCisvLyBiZWNhdXNlIHRoaXMgZnVuY2l0b24gd2lsbCBmcmVlIHRoZSBtZW1vcnkuCitlSGFsU3RhdHVzIHBhbFNlbmRNQk1lc3NhZ2UodEhkZEhhbmRsZSBoSGRkLCB2b2lkICpwQnVmKQoreworICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgdFNpclJldFN0YXR1cyBzaXJTdGF0dXM7CisgICB2X0NPTlRFWFRfdCB2b3NDb250ZXh0OworICAgdl9WT0lEX3QgKmhIYWw7CisKKyAgIHZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX0hERCwgaEhkZCApOworICAgaWYgKE5VTEwgPT0gdm9zQ29udGV4dCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogaW52YWxpZCB2b3NDb250ZXh0IiwgX19GVU5DVElPTl9fKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIGhIYWwgPSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfU01FLCB2b3NDb250ZXh0ICk7CisgICAgICBpZiAoTlVMTCA9PSBoSGFsKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBpbnZhbGlkIGhIYWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgc2lyU3RhdHVzID0gdU1hY1Bvc3RDdHJsTXNnKCBoSGFsLCBwQnVmICk7CisgICAgICAgICBpZiAoIGVTSVJfU1VDQ0VTUyA9PSBzaXJTdGF0dXMgKQorICAgICAgICAgeworICAgICAgICAgICAgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgcGFsRnJlZU1lbW9yeSggaEhkZCwgcEJ1ZiApOworCisgICByZXR1cm4oIGhhbFN0YXR1cyApOworfQorICAKKworCisvL0FsbCBzZW1vcGhvcmUgZnVuY3Rpb25zIGFyZSBuby1vcCBoZXJlCisvL1BBTCBzZW1hcGhvcmUgZnVuY3Rpb25zCisvL0FsbCBmdW5jdGlvbnMgTVVTVCByZXR1cm4gc3VjY2Vzcy4gSWYgY2hhbmdlIG5lZWRzIHRvIGJlIG1hZGUsIHBsZWFzZSBjaGVjayBhbGwgY2FsbGVycycgbG9naWMKK2VIYWxTdGF0dXMgcGFsU2VtYXBob3JlQWxsb2MoIHRIZGRIYW5kbGUgaEhkZCwgdFBhbFNlbWFwaG9yZUhhbmRsZSAqcEhhbmRsZSwgdEFOSV9TMzIgY291bnQgKQoreworICAgICh2b2lkKWhIZGQ7CisgICAgKHZvaWQpcEhhbmRsZTsKKyAgICAodm9pZCljb3VudDsKKyAgICBpZihwSGFuZGxlKQorICAgIHsKKyAgICAgICAgKnBIYW5kbGUgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK2VIYWxTdGF0dXMgcGFsU2VtYXBob3JlRnJlZSggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU2VtYXBob3JlSGFuZGxlIGhTZW1hcGhvcmUgKQoreworICAgICh2b2lkKWhIZGQ7CisgICAgKHZvaWQpaFNlbWFwaG9yZTsKKworICAgIHJldHVybiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK2VIYWxTdGF0dXMgcGFsU2VtYXBob3JlVGFrZSggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU2VtYXBob3JlSGFuZGxlIGhTZW1hcGhvcmUgKQoreworICAgICh2b2lkKWhIZGQ7CisgICAgKHZvaWQpaFNlbWFwaG9yZTsKKworICAgIHJldHVybiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK2VIYWxTdGF0dXMgcGFsU2VtYXBob3JlR2l2ZSggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU2VtYXBob3JlSGFuZGxlIGhTZW1hcGhvcmUgKQoreworICAgICh2b2lkKWhIZGQ7CisgICAgKHZvaWQpaFNlbWFwaG9yZTsKKworICAgIHJldHVybiAoZUhBTF9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK2VIYWxTdGF0dXMgcGFsTXV0ZXhBbGxvYyggdEhkZEhhbmRsZSBoSGRkLCB0UGFsU2VtYXBob3JlSGFuZGxlICpwSGFuZGxlKSAKK3sKKyAgICAodm9pZCloSGRkOworICAgICh2b2lkKXBIYW5kbGU7CisKKyAgICBpZihwSGFuZGxlKQorICAgIHsKKyAgICAgICAgKnBIYW5kbGUgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKGVIQUxfU1RBVFVTX1NVQ0NFU1MpOworfQorCitlSGFsU3RhdHVzIHBhbE11dGV4QWxsb2NMb2NrZWQoIHRIZGRIYW5kbGUgaEhkZCwgdFBhbFNlbWFwaG9yZUhhbmRsZSAqcEhhbmRsZSkKK3sKKyAgICAodm9pZCloSGRkOworICAgICh2b2lkKXBIYW5kbGU7CisKKyAgICBpZihwSGFuZGxlKQorICAgIHsKKyAgICAgICAgKnBIYW5kbGUgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKGVIQUxfU1RBVFVTX1NVQ0NFU1MpOworfQorCisKK2VBbmlCb29sZWFuIHBhbF9pbl9pbnRlcnJ1cHQodm9pZCkKK3sKKyAgICByZXR1cm4gKGVBTklfQk9PTEVBTl9GQUxTRSk7Cit9CisKK3ZvaWQgcGFsX2xvY2FsX2JoX2Rpc2FibGUodm9pZCkKK3sKK30KKwordm9pZCBwYWxfbG9jYWxfYmhfZW5hYmxlKHZvaWQpCit7Cit9CisKZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvcGFsL3NyYy9wYWxUaW1lci5jIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy9wYWwvc3JjL3BhbFRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiYjA4NAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvcGFsL3NyYy9wYWxUaW1lci5jCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqIAorICAKKyAgICBcZmlsZSBwYWxUaW1lci5jCisgIAorICAgIFxicmllZiBJbXBsZW1lbmF0aW9uIG9mIHRoZSBQbGF0Zm9ybSBBYnN0cmFjaW9uIExheWVyIHRpbWVyIGZ1bmN0aW9ucworICAKKyAgICAkSWQkIAorICAKKyAgCisgICAgQ29weXJpZ2h0IChDKSAyMDA2IEFpcmdvIE5ldHdvcmtzLCBJbmNvcnBvcmF0ZWQKKyAgCisgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIFBsYXRmb3JtIEFic3RyYXRpb24gTGF5ZXIuICAgIAorICAKKyAqLworCisjaW5jbHVkZSA8aGFsVHlwZXMuaD4KKyNpbmNsdWRlIDxwYWxUaW1lci5oPgorI2luY2x1ZGUgPHZvc190aW1lci5oPgorI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgPHZvc19tZW1vcnkuaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzUGFsVGltZXIKK3sgICAKKyAgICBwYWxUaW1lckNhbGxiYWNrIHRpbWVyQ2FsbGJhY2s7CisgICAgdm9pZCAqcENvbnRleHQ7CisgICAgdEhkZEhhbmRsZSBoSGRkOyAgICAgICAgIC8vIG5vdCByZWFsbHkgbmVlZGVkIHdoZW4gbWFwcGluZyB0byB2b3MgdGltZXJzICAgCisgICAgdEFOSV9VMzIgdVRpbWVySW50ZXJ2YWw7IC8vbWVhbmluZ2Z1bCBvbmx5IGlzIGZSZXN0YXJ0IGlzIHRydWUKKyAgICB0QU5JX0JPT0xFQU4gZlJlc3RhcnQ7CisgICAgCisgICAgdm9zX3RpbWVyX3Qgdm9zVGltZXI7CisgICAgCit9IHRQYWxUaW1lciwgKnRwUGFsVGltZXI7CisKKworCit2X1ZPSURfdCBpbnRlcm5hbFRpbWVyQ2FsbGJhY2soIHZfUFZPSURfdCB1c2VyRGF0YSApCit7CisgICAgdFBhbFRpbWVyICpwUGFsVGltZXIgPSAodFBhbFRpbWVyICopdXNlckRhdGE7CisgICAgCisgICAgaWYgKCBwUGFsVGltZXIgKQorICAgIHsKKyAgICAgICAgaWYgKCBwUGFsVGltZXItPnRpbWVyQ2FsbGJhY2sgKQorICAgICAgICB7CisgICAgICAgICAgICBwUGFsVGltZXItPnRpbWVyQ2FsbGJhY2soIHBQYWxUaW1lci0+cENvbnRleHQgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCBwUGFsVGltZXItPmZSZXN0YXJ0ICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsVGltZXJTdGFydCggcFBhbFRpbWVyLT5oSGRkLCBwUGFsVGltZXIsIHBQYWxUaW1lci0+dVRpbWVySW50ZXJ2YWwsIGVBTklfQk9PTEVBTl9UUlVFICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZmRlZiBUSU1FUl9NQU5BR0VSCitlSGFsU3RhdHVzIHBhbFRpbWVyQWxsb2NfZGVidWcoIHRIZGRIYW5kbGUgaEhkZCwgdFBhbFRpbWVySGFuZGxlICpwaFBhbFRpbWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsVGltZXJDYWxsYmFjayBwQ2FsbGJhY2ssIHZvaWQgKnBDb250ZXh0LCBjaGFyKiBmaWxlTmFtZSwgdl9VMzJfdCBsaW5lTnVtICApCit7CisgICBlSGFsU3RhdHVzIGhhbFN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0UGFsVGltZXIgKnBQYWxUaW1lciA9IE5VTEw7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyAgICAKKyAgIGRvCisgICB7CisgICAgICAvLyBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgdGltZXIgc3RydWN0dXJlLgorICAgICAgcFBhbFRpbWVyID0gdm9zX21lbV9tYWxsb2MoIHNpemVvZiggdFBhbFRpbWVyICkgKTsKKyAgICAgIGlmICggTlVMTCA9PSBwUGFsVGltZXIgKSBicmVhazsKKyAgICAgICAKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlIHZvcyBUaW1lciB0aGF0IHVuZGVybGllcyB0aGUgcGFsIFRpbWVyLgorICAgICAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX2luaXRfZGVidWcoICZwUGFsVGltZXItPnZvc1RpbWVyLCBWT1NfVElNRVJfVFlQRV9TVywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsVGltZXJDYWxsYmFjaywgcFBhbFRpbWVyLCBmaWxlTmFtZSwgbGluZU51bSApOworICAgICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICAgICB7CisgICAgICAgICAvLyBpZiBmYWlsIHRvIGluaXQgdGhlIHZvcyB0aW1lciwgZnJlZSB0aGUgbWVtb3J5IGFuZCBiYWlsIG91dC4KKyAgICAgICAgIHZvc19tZW1fZnJlZSggcFBhbFRpbWVyICk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgaW5mbyBpbiB0aGUgaW50ZXJuYWwgcGFsVGltZXIgc3RydWN0IHNvIHdlIGNhbiAKKyAgICAgIHBQYWxUaW1lci0+dGltZXJDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIHBQYWxUaW1lci0+cENvbnRleHQgICAgICA9IHBDb250ZXh0OworICAgICAgcFBhbFRpbWVyLT5oSGRkICAgICAgICAgID0gaEhkZDsKKyAgICAgIAorICAgICAgLy8gcmV0dXJuIGEgJ2hhbmRsZScgdG8gdGhlIGNhbGxlci4KKyAgICAgICpwaFBhbFRpbWVyID0gcFBhbFRpbWVyOworICAgICAgCisgICAgICBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgCisgICB9IHdoaWxlKCAwICk7ICAgCisgICAgICAgCisgICAgcmV0dXJuKCBoYWxTdGF0dXMgKTsKK30KKyNlbHNlCitlSGFsU3RhdHVzIHBhbFRpbWVyQWxsb2MoIHRIZGRIYW5kbGUgaEhkZCwgdFBhbFRpbWVySGFuZGxlICpwaFBhbFRpbWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsVGltZXJDYWxsYmFjayBwQ2FsbGJhY2ssIHZvaWQgKnBDb250ZXh0ICkKK3sKKyAgIGVIYWxTdGF0dXMgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgIHRQYWxUaW1lciAqcFBhbFRpbWVyID0gTlVMTDsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgIAorICAgZG8KKyAgIHsKKyAgICAgIC8vIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCB0aW1lciBzdHJ1Y3R1cmUuCisgICAgICBwUGFsVGltZXIgPSB2b3NfbWVtX21hbGxvYyggc2l6ZW9mKCB0UGFsVGltZXIgKSApOworICAgICAgaWYgKCBOVUxMID09IHBQYWxUaW1lciApIGJyZWFrOworICAgICAgIAorICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgdm9zIFRpbWVyIHRoYXQgdW5kZXJsaWVzIHRoZSBwYWwgVGltZXIuCisgICAgICB2b3NTdGF0dXMgPSB2b3NfdGltZXJfaW5pdCggJnBQYWxUaW1lci0+dm9zVGltZXIsIFZPU19USU1FUl9UWVBFX1NXLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxUaW1lckNhbGxiYWNrLCBwUGFsVGltZXIgKTsKKyAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKQorICAgICAgeworICAgICAgICAgLy8gaWYgZmFpbCB0byBpbml0IHRoZSB2b3MgdGltZXIsIGZyZWUgdGhlIG1lbW9yeSBhbmQgYmFpbCBvdXQuCisgICAgICAgICB2b3NfbWVtX2ZyZWUoIHBQYWxUaW1lciApOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlIGluZm8gaW4gdGhlIGludGVybmFsIHBhbFRpbWVyIHN0cnVjdCBzbyB3ZSBjYW4gCisgICAgICBwUGFsVGltZXItPnRpbWVyQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBwUGFsVGltZXItPnBDb250ZXh0ICAgICAgPSBwQ29udGV4dDsKKyAgICAgIHBQYWxUaW1lci0+aEhkZCAgICAgICAgICA9IGhIZGQ7CisgICAgICAKKyAgICAgIC8vIHJldHVybiBhICdoYW5kbGUnIHRvIHRoZSBjYWxsZXIuCisgICAgICAqcGhQYWxUaW1lciA9IHBQYWxUaW1lcjsKKyAgICAgIAorICAgICAgaGFsU3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIAorICAgfSB3aGlsZSggMCApOyAgIAorICAgICAgIAorICAgIHJldHVybiggaGFsU3RhdHVzICk7Cit9CisjZW5kaWYKKworCitlSGFsU3RhdHVzIHBhbFRpbWVyRnJlZSggdEhkZEhhbmRsZSBoSGRkLCB0UGFsVGltZXJIYW5kbGUgaFBhbFRpbWVyICkKK3sKKyAgIGVIYWxTdGF0dXMgc3RhdHVzID0gZUhBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyAgIHRQYWxUaW1lciAqcFBhbFRpbWVyID0gKHRQYWxUaW1lciAqKWhQYWxUaW1lcjsKKyAgICAKKyAgIGRvCisgICB7CisgICAgICBpZiAoIE5VTEwgPT0gcFBhbFRpbWVyICkgYnJlYWs7CisgICAKKyAgICAgIC8vIERlc3Ryb3kgdGhlIHZvcyB0aW1lci4uLiAgICAgIAorICAgICAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX2Rlc3Ryb3koICZwUGFsVGltZXItPnZvc1RpbWVyICk7CisgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkgYnJlYWs7CisgICAgICAKKyAgICAgIC8vIEZyZWUgdGhlIG1lbW9yeSBmb3IgdGhlIGludHJuYWwgdGltZXIgc3RydWN0Li4uCisgICAgICB2b3NfbWVtX2ZyZWUoIHBQYWxUaW1lciApOworICAgICAgCisgICAgICBzdGF0dXMgPSBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgCisgICB9IHdoaWxlKCAwICk7CisgICAgCisgICByZXR1cm4oIHN0YXR1cyApOworfQorCisKK2VIYWxTdGF0dXMgcGFsVGltZXJTdGFydCh0SGRkSGFuZGxlIGhIZGQsIHRQYWxUaW1lckhhbmRsZSBoUGFsVGltZXIsIHRBTklfVTMyIHVFeHBpcmVUaW1lLCB0QU5JX0JPT0xFQU4gZlJlc3RhcnQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgICB0QU5JX1UzMiBleHBpcmVUaW1lSW5NUyA9IDA7CisgICAKKyAgIHRQYWxUaW1lciAqcFBhbFRpbWVyID0gKHRQYWxUaW1lciAqKWhQYWxUaW1lcjsKKyAgICAKKyAgIGRvIAorICAgeworICAgICAgaWYgKCBOVUxMID09IHBQYWxUaW1lciApIGJyZWFrOworICAgICAgIAorICAgICAgcFBhbFRpbWVyLT5mUmVzdGFydCA9IGZSZXN0YXJ0OworICAgICAgcFBhbFRpbWVyLT51VGltZXJJbnRlcnZhbCA9IHVFeHBpcmVUaW1lOworICAgICAgCisgICAgICAvLyB2b3MgVGltZXIgdGFrZXMgZXhwaXJhdGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcy4gIHBhbFRpbWVyU3RhcnQgYW5kIAorICAgICAgLy8gdGhlIHVUaW1lckludGVydmwgaW4gdFBhbFRpbWVyIHN0cnVjdCBoYXZlIGV4cGlyYXRpb24gdGllbSBpbgorICAgICAgLy8gbWljcm9zZWNvbmRzLiAgTWFrZSBhbmQgYWRqdXN0bWVudCBmcm9tIG1pY3Jvc2Vjb25kcyB0byBtaWxsaXNlY29uZHMKKyAgICAgIC8vIGJlZm9yZSBjYWxsaW5nIHRoZSB2b3NfdGltZXJfc3RhcnQoKS4KKyAgICAgIGV4cGlyZVRpbWVJbk1TID0gdUV4cGlyZVRpbWUgLyAxMDAwOworICAgICAgdm9zU3RhdHVzID0gdm9zX3RpbWVyX3N0YXJ0KCAmcFBhbFRpbWVyLT52b3NUaW1lciwgZXhwaXJlVGltZUluTVMgKTsKKyAgICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKSAKKyAgICAgIHsKKyAgICAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc3RhdHVzID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsgICAKKyAgICAgIAorICAgfSB3aGlsZSggMCApOworICAgIAorICAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKworCitlSGFsU3RhdHVzIHBhbFRpbWVyU3RvcCh0SGRkSGFuZGxlIGhIZGQsIHRQYWxUaW1lckhhbmRsZSBoUGFsVGltZXIpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgCisgICB0UGFsVGltZXIgKnBQYWxUaW1lciA9ICh0UGFsVGltZXIgKiloUGFsVGltZXI7CisgICAgCisgICBkbyAKKyAgIHsKKyAgICAgIGlmICggTlVMTCA9PSBwUGFsVGltZXIgKSBicmVhazsKKworICAgICAgdm9zX3RpbWVyX3N0b3AoICZwUGFsVGltZXItPnZvc1RpbWVyICk7CisgICAgIAorICAgICAgLy8gbWFrZSBzdXJlIHRoZSB0aW1lciBpcyBub3QgcmUtc3RhcnRlZC4KKyAgICAgIHBQYWxUaW1lci0+ZlJlc3RhcnQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICAgIHN0YXR1cyA9IGVIQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIH0gd2hpbGUoIDAgKTsgICAKKyAgIAorICAgcmV0dXJuKCBzdGF0dXMgKTsKK30gICAKKworCisKKworCisKZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvcGxhdGZvcm0vaW5jL1Zvc3NXcmFwcGVyLmggYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3BsYXRmb3JtL2luYy9Wb3NzV3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZWY1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3BsYXRmb3JtL2luYy9Wb3NzV3JhcHBlci5oCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX1ZPU1NfV1JBUFBFUl9ICisjZGVmaW5lIF9fVk9TU19XUkFQUEVSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAZmlsZSBWb3NzV3JhcHBlci5oCisKKyAgQGJyaWVmIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIHZhcmlvdXMgc3RydWN0dXJlIGRlZmluaXRpb25zIGFuZCAKKyAgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIFJUT1MgYWJzdHJhY3Rpb24gbGF5ZXIsIGltcGxlbWVudGVkIGZvciBWT1NTCisKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRSAKKyAgIAorICAgCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLiAKKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4gCisgICAKKyAgIAorICAkSGVhZGVyOiQgJERhdGVUaW1lOiAkICRBdXRob3I6ICQgCisgICAKKyAgIAorICB3aGVuICAgICAgICB3aG8gICAgd2hhdCwgd2hlcmUsIHdoeSAKKyAgLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDEyLzE1LzA4ICAgIHNobyAgICBSZXNvbHZlZCB3YXJuaW5ncyBhbmQgZXJyb3JzIGZyb20gQU1TUyBjb21waWxlciB3aGVuCisgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHBvcnRlZCB0byBXTQorICAxMS8yMC8wOCAgICBzaG8gICAgUmVuYW1lZCB0aGlzIHRvIFZvc3NXcmFwcGVyLmg7IHJlbW92ZSBhbGwgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICBvbiBXTSBwbGF0Zm9ybSBhbmQgYWxsb3cgdGhpcyB0byB3b3JrIG9uIGFsbCBWT1NTIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtcworICAwNi8yNC8wOCAgICB0YmggICAgTW9kaWZpZWQgdGhlIGZpbGUgdG8gcmVtb3ZlIHRoZSBkZXBlbmRlY3kgb24gSEREIGZpbGVzIGFzIAorICAgICAgICAgICAgICAgICAgICAgcGFydCBvZiBHZW42IGJyaW5nIHVwIHByb2Nlc3MuIAorICAxMC8yOS8wMiBOZWVsYXkgRGFzIENyZWF0ZWQgZmlsZS4gCisgICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8gCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAic2lyVHlwZXMuaCIKKyNpbmNsdWRlICJzaXJQYXJhbXMuaCIKKyNpbmNsdWRlICJzeXNEZWYuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsRGF0YVN0cnVjdC5oIgorI2VuZGlmCisjaW5jbHVkZSAiYW5pRGJnVGVzdC5oIgorI2luY2x1ZGUgInZvc190aW1lci5oIgorI2luY2x1ZGUgInBhbEFwaS5oIgorI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgInZvc190cmFjZS5oIgorI2luY2x1ZGUgInZvc19tZW1vcnkuaCIKKyNlbmRpZgorCisvKiBJbnRlcmxvY2tlZCBDb21wYXJlIEV4Y2hhbmdlIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KKworCisKKy8qIERlZmluZSBiYXNpYyBjb25zdGFudHMgZm9yIHRoZSBUaHJlYWRYIGtlcm5lbC4gICovCisKKyNkZWZpbmUgVFhfTk9fV0FJVCAgICAgICAgICAwCisjZGVmaW5lIFRYX1dBSVRfRk9SRVZFUiAgICAgMHhGRkZGRkZGRlVMCisjZGVmaW5lIFRYX0FVVE9fQUNUSVZBVEUgICAgMQorI2RlZmluZSBUWF9OT19BQ1RJVkFURSAgICAgIDAKKworCisKKy8qIEFQSSByZXR1cm4gdmFsdWVzLiAgKi8KKyNkZWZpbmUgVFhfU1VDQ0VTUyAgICAgICAgICAweDAwCisjZGVmaW5lIFRYX1FVRVVFX0ZVTEwgICAgMHgwMQorLy8gLi4uCisjZGVmaW5lIFRYX05PX0lOU1RBTkNFICAgICAgMHgwRAorLy8gLi4uCisjZGVmaW5lIFRYX1RJTUVSX0VSUk9SICAgICAgMHgxNQorI2RlZmluZSBUWF9USUNLX0VSUk9SICAgICAgIDB4MTYKKy8vIC4uLgorCisKKyNpZm5kZWYgdHJ1ZQorI2RlZmluZSB0cnVlICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjaWZuZGVmIGZhbHNlCisjZGVmaW5lIGZhbHNlICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qIEZvbGxvd2luZyBtYWNybyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgd2hpY2ggY29uc3RpdHV0ZSAxIFRocmVhZFggdGltZXIgdGljay4gVXNlZAorICAgZm9yIG1pbWlja2luZyB0aGUgVGhyZWFkWCB0aW1lciBiZWhhdmlvdXIgb24gVk9TUy4gKi8KKy8vIFVzZSB0aGUgc2FtZSBNQUNSTyB1c2VkIGJ5IGZpcm13YXJlIG1vZHVsZXMgdG8gY2FsY3VsYXRlIFRJQ0tzIGZyb20gbVNlYworLy8gTWlzbWF0Y2ggd291bGQgY2F1c2Ugd29ybmcgdGltZXIgdmFsdWUgdG8gYmUgcHJvZ3JhbW1lZAorI2RlZmluZSBUWF9NU0VDU19JTl8xX1RJQ0sgIFNZU19USUNLX0RVUl9NUworCisvLyBTaWduYXR1cmUgd2l0aCB3aGljaCB0aGUgVFhfVElNRVIgc3RydWN0IGlzIGluaXRpYWxpemVkLCB3aGVuIHRoZSB0aW1lciBpcyBjcmVhdGVkCisjZGVmaW5lIFRYX0FJUkdPX1RNUl9TSUdOQVRVUkUgICAweERFQURCRUVGCisKKworLyogSnVzdCAjZGVmaW5lIG91dCB0aGUgdGhyZWFkIGFuZCBxdWV1ZSBzcGVjaWZpYyB0aHJlYWRYIGNhbGxzLCBzaW5jZSB0aGUgcGxhbiBpcyB0byBrZWVwCisgICB0aGUgV2luZG93cyBwb3J0IG9mIHRoZSBNQUMgbm9uLXRocmVhZGVkICovCisKKyNkZWZpbmUgIHR4X3RocmVhZF9jcmVhdGUoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKKyNkZWZpbmUgIHR4X3RocmVhZF9kZWxldGUoYSkKKyNkZWZpbmUgIHR4X3RocmVhZF9yZXN1bWUoYSkKKworLy8gUGxlYXNlIG5vdGUgdGhhdCBmb3IgdGhlIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgcm91dGluZSB0aGUgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGVybXMgb2YKKy8vIG1pY3Jvc2Vjb25kcyBhbmQgbm90IHRpbWVyIHRpY2tzLiBBbHNvLCB0aGUgRERLIHJlY29tbWVuZHMgdGhhdCB0aGlzIHJvdXRpbmUgc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aAorLy8gc2xlZXAgZHVyYXRpb25zIG9mIG1vcmUgdGhhbiA1MCB1c2Vjcy4KKyNkZWZpbmUgIHR4X3RocmVhZF9zbGVlcCh1U2VjcykKKworI2RlZmluZSAgdHhfdGhyZWFkX3N1c3BlbmQoYSkKKyNkZWZpbmUgIHR4X3RocmVhZF90ZXJtaW5hdGUoYSkKKyNkZWZpbmUgIHR4X3RocmVhZF9pZGVudGlmeSgpIE5VTEwKKworI2RlZmluZSAgdHhfcXVldWVfY3JlYXRlKGEsIGIsIGMsIGQsIGUpIFRYX1NVQ0NFU1MKKyNkZWZpbmUgIHR4X3F1ZXVlX2RlbGV0ZShhKSBUWF9TVUNDRVNTCisjZGVmaW5lICB0eF9xdWV1ZV9nZXRfcHRyKGEpICAgIFRYX1NVQ0NFU1MKKyNkZWZpbmUgIHR4X3F1ZXVlX2ZsdXNoKGEpICBUWF9TVUNDRVNTCisjZGVmaW5lICB0eF9xdWV1ZV9yZWNlaXZlKGEsIGIsIGMpICBUWF9TVUNDRVNTCisjZGVmaW5lICB0eF9xdWV1ZV9zZW5kKGEsIGIsIGMpIFRYX1NVQ0NFU1MKKworI2RlZmluZSAgdHhfZGlzYWJsZV9pbnRyKCkKKyNkZWZpbmUgIHR4X2VuYWJsZV9pbnRyKCkgCisKKworI2RlZmluZSBUWF9ESVNBQkxFX0lOVFIgdHhfZGlzYWJsZV9pbnRyKCkKKyNkZWZpbmUgVFhfRU5BQkxFX0lOVFIgIHR4X2VuYWJsZV9pbnRyKCkKKworI2lmZGVmIFRJTUVSX01BTkFHRVIKKyNkZWZpbmUgIHR4X3RpbWVyX2NyZWF0ZShhLCBiLCBjLCBkLCBlLCBmLCBnKSAgIHR4X3RpbWVyX2NyZWF0ZV9pbnRlcm5fZGVidWcoKHZfUFZPSURfdClwTWFjLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZWxzZQorI2RlZmluZSAgdHhfdGltZXJfY3JlYXRlKGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgdHhfdGltZXJfY3JlYXRlX2ludGVybigodl9QVk9JRF90KXBNYWMsIGEsIGIsIGMsIGQsIGUsIGYsIGcpCisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogIFRocmVhZFggc3RydWN0dXJlcyBhcmUgbm90IG1hcHBlZCB0byBXaW5kb3dzIHN0cnVjdHVyZXMgZm9yIHRoZSAgICAgICAgKi8KKy8qICBmb2xsb3dpbmcgcmVhc29uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gV2luZG93cyBzdHJ1Y3R1cmVzIGFyZSB3cml0dGVuIGluIEMgYW5kIHRoZXkgYXJlIG5vdCBDKysgYXdhcmUuICAqLworLyogICAgICAtIFRoZXJlIHNob3VsZCBub3QgYmUgYW55IGRlcGVuZGVuY3kgYmV0d2VlbiBNQUMgRlcgaW5jbHVkZSB0cmVlICAgKi8KKy8qICAgICAgICBhbmQgV2luZG93cyBpbmNsdWRlIHRyZWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluc3RlYWQsIFRocmVhZFggc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBoZXJlIGFzIHZvaWQqLiAgVGhpcyB3aWxsIGJlICAgKi8KKy8qICB1c2VkIGJ5IHRoZSB3cmFwcGVyIGZ1bmN0aW9ucyB0byBzYXZlIHRoZSBwb2ludGVyIG9mIHRoZSBhY3R1YWwgV2luZG93cyovCisvKiAgc3RydWN0dXJlLiAgV2luZG93cyBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGluID8gICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiB2X1BWT0lEX3QgVFhfVEhSRUFEOwordHlwZWRlZiB2X1BWT0lEX3QgVFhfUVVFVUU7Cit0eXBlZGVmIHZfUFZPSURfdCBUWF9NVVRFWDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBTZW1hcGhvcmUgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWltaWMgdGhlIGJpbmFyeSBzZW1hcGhvcmUgZnVuY3Rpb25hbGl0eSAqLworLyogYXZhaWxhYmxlIG9uIFRocmVhZFguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdl9TTE9OR190IFRYX1NFTUFQSE9SRTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBUaW1lciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaW1wbGVtZW50IFRocmVhZFggdGltZXIgZmFjaWxpdHkuICBKdXN0ICAqLworLyogbGlrZSBUaHJlYWRYLCB0aW1lciBleHBpcmF0aW9uIGhhbmRsZXIgZXhlY3V0ZXMgYXQgdGhlIGhpZ2hlc3QgICAgICovCisvKiBwb3NzaWJsZSBwcmlvcml0eSBsZXZlbCwgaS5lLiBESVNQQVRDSF9MRVZFTC4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgVFhfVElNRVJfU1RSVUNUCit7CisjaWZkZWYgV0xBTl9ERUJVRworI2RlZmluZSBUSU1FUl9NQVhfTkFNRV9MRU4gNTAKKyAgICBjaGFyIHRpbWVyTmFtZVtUSU1FUl9NQVhfTkFNRV9MRU5dOworI2VuZGlmCisgICAgdl9VTE9OR190ICB0bXJTaWduYXR1cmU7CisgICAgdl9WT0lEX3QgICAoKnBFeHBpcmVGdW5jKSh2X1BWT0lEX3QsIHRBTklfVTMyKTsKKyAgICB0QU5JX1UzMiAgIGV4cGlyZUlucHV0OworICAgIHZfVUxPTkdfdCAgaW5pdFNjaGVkdWxlVGltZUluTXNlY3M7CisgICAgdl9VTE9OR190ICByZXNjaGVkdWxlVGltZUluTXNlY3M7CisgICAgdm9zX3RpbWVyX3Qgdm9zVGltZXI7CisKKyAgICAvLyBQb2ludGVyIHRvIHRoZSBNQUMgZ2xvYmFsIHN0cnVjdHVyZSwgd2hpY2ggc3RvcmVzIHRoZSBjb250ZXh0IGZvciB0aGUgTklDLAorICAgIC8vIGZvciB3aGljaCB0aGlzIHRpbWVyIGlzIHN1cHBvc2VkIHRvIG9wZXJhdGUuCisgICAgdl9QVk9JRF90ICBwTWFjOworICAgIHRBTklfVTggc2Vzc2lvbklkOworCit9IFRYX1RJTUVSOworCisjZGVmaW5lIFRYX1RJTUVSX1ZBTElEKHRpbWVyKSAodGltZXIucE1hYyAhPSAwKQorCit0eXBlZGVmIHN0cnVjdCBzQW5pU2lyVHhXcmFwcGVyCit7CisgICAgLy8gQmFjayBwb2ludGVyIHRvIHRoZSBwQWRhcHRlciBzdHJ1Y3R1cmUsIG5lZWRlZCBmb3Igc29tZSBvZiB0aGUgaW50ZXJuYWwgcm91dGluZXMKKyAgICB2X1BWT0lEX3QgIHBBZGFwdGVyOworCit9IHRBbmlTaXJUeFdyYXBwZXIsICp0cEFuaVNpclR4V3JhcHBlcjsKKworCisKK2V4dGVybiB2X1VMT05HX3QgdHhfdGltZV9nZXQodl9WT0lEX3QpOworZXh0ZXJuIHZfVUlOVF90ICB0eF90aW1lcl9hY3RpdmF0ZShUWF9USU1FUiopOworZXh0ZXJuIHZfVUlOVF90ICB0eF90aW1lcl9jaGFuZ2UoVFhfVElNRVIqLCB2X1VMT05HX3QsIHZfVUxPTkdfdCk7CitleHRlcm4gdl9VSU5UX3QgIHR4X3RpbWVyX2NoYW5nZV9jb250ZXh0KFRYX1RJTUVSKiwgdEFOSV9VMzIpOworI2lmZGVmIFRJTUVSX01BTkFHRVIKK2V4dGVybiB2X1VJTlRfdCAgdHhfdGltZXJfY3JlYXRlX2ludGVybl9kZWJ1Zyh2X1BWT0lEX3QsIFRYX1RJTUVSKiwgY2hhciAqLCB2X1ZPSURfdCgqKSh2X1BWT0lEX3QsIHRBTklfVTMyKSwgCisgICAgICAgICAgICAgICB0QU5JX1UzMiwgdl9VTE9OR190LCB2X1VMT05HX3QsIHZfVUxPTkdfdCwgY2hhciogZmlsZU5hbWUsIHZfVTMyX3QgbGluZU51bSApOworI2Vsc2UKK2V4dGVybiB2X1VJTlRfdCAgdHhfdGltZXJfY3JlYXRlX2ludGVybih2X1BWT0lEX3QsIFRYX1RJTUVSKiwgY2hhciAqLCB2X1ZPSURfdCgqKSh2X1BWT0lEX3QsIHRBTklfVTMyKSwgdEFOSV9VMzIsIHZfVUxPTkdfdCwgdl9VTE9OR190LCB2X1VMT05HX3QpOworI2VuZGlmCitleHRlcm4gdl9VSU5UX3QgIHR4X3RpbWVyX2RlYWN0aXZhdGUoVFhfVElNRVIqKTsKK2V4dGVybiB2X1VJTlRfdCAgdHhfdGltZXJfZGVsZXRlKFRYX1RJTUVSKik7CitleHRlcm4gdl9CT09MX3QgIHR4X3RpbWVyX3J1bm5pbmcoVFhfVElNRVIqKTsKKworCisKKy8vIFJvdXRpbmVzIG5lZWRlZCB0byBpbml0aWFsaXplIGFuZCBjbGVhbnVwIHRoZSBXaW5kb3dzIHdyYXBwZXIKK2V4dGVybiB2X1ZPSURfdCB0eF92b3NzX3dyYXBwZXJfaW5pdCh2X1BWT0lEX3QsIHZfUFZPSURfdCk7CisKKyNkZWZpbmUgc2NoQWRkRHBoQWN0aXZpdHlRdWV1ZVdpbiggYSwgYiwgYyApCisKKy8vIERlYnVnIGRpc3BsYXkgcmVsYXRlZCBnbG9iYWxzCitleHRlcm4gdl9VTE9OR190IGdEYmdMZXZlbDsKK2V4dGVybiB2X1VMT05HX3QgZ0RiZ01hc2s7CitleHRlcm4gaW50IGdIYWxCdWZDbnQ7CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gRnJvbSBIRERVdGlsLmggdXNlZCBieSBzb21lIGludGVybmFsIGZpbGVzICovCisKK2V4dGVybiB2X1U2NF90IHV0aWxHZXRDdXJyZW50VGltZSh2b2lkKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvQ09SRS9TWVMvbGVnYWN5L3NyYy9wbGF0Zm9ybS9zcmMvVm9zc1dyYXBwZXIuYyBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvcGxhdGZvcm0vc3JjL1Zvc3NXcmFwcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhNmQ0NAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvcGxhdGZvcm0vc3JjL1Zvc3NXcmFwcGVyLmMKQEAgLTAsMCArMSw1NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBAZmlsZSBWb3NzV3JhcHBlci5jCisKKyAgQGJyaWVmIFRoaXMgc291cmNlIGZpbGUgY29udGFpbnMgdGhlIHZhcmlvdXMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIHRoZSAKKyAgUlRPUyBhYnN0cmFjdGlvbiBsYXllciwgaW1wbGVtZW50ZWQgZm9yIFZPU1MKKworICBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFIAorICAgCisgICAKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuICAgIAorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLiAKKyAgIAorICAgCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJCAKKyAgIAorICAgCisgIHdoZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5IAorICAtLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMDMvMzEvMDkgICAgc2hvICAgIFJlbW92ZSB0aGUgdXNlIG9mIHZvc1RpbWVySXNBY3RpdmUgZmxhZyBhcyBpdCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1zYWZlCisgIDAyLzE3LzA4ICAgIHNobyAgICBGaXggdGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHdvcmsgd2hlbiBpdCBpcyBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSB0aW1lciBoYXMgc3RvcHBlZCBkdWUgdG8gYSByYWNlIGNvbmRpdGlvbi4KKyAgMDIvMTAvMDggICAgc2hvICAgIFJlZmFjdG9yIHRoZSBUWCB0aW1lciB0byB1c2UgVk9TIHRpbWVyIGRpcmVjdGx5IGluc3RlYWQKKyAgICAgICAgICAgICAgICAgICAgIG9mIHVzaW5nIFZPUyB1dGlsaXR5IHRpbWVyCisgIDEyLzE1LzA4ICAgIHNobyAgICBSZXNvbHZlZCBlcnJvcnMgYW5kIHdhcm5pbmdzIGZyb20gdGhlIEFNU1MgY29tcGlsZXIgd2hlbgorICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBwb3J0ZWQgZnJvbSBXTQorICAxMS8yMC8wOCAgICBzaG8gICAgUmVuYW1lZCB0aGlzIHRvIFZvc1dyYXBwZXIuYzsgcmVtb3ZlIGFsbCBkZXBlbmRlbmNpZXMgb24KKyAgICAgICAgICAgICAgICAgICAgIFdNIHBsYXRmb3JtIGFuZCBhbGxvdyB0aGlzIHRvIHdvcmsgb24gYWxsIFZPU1MgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0KKyAgMDYvMjQvMDggICAgdGJoICAgIE1vZGlmaWVkIHRoZSBmaWxlIHRvIHJlbW92ZSB0aGUgZGVwZW5kZWN5IG9uIEhERCBmaWxlcyBhcyAKKyAgICAgICAgICAgICAgICAgICAgIHBhcnQgb2YgR2VuNiBicmluZyB1cCBwcm9jZXNzLiAKKyAgMTAvMjkvMDIgTmVlbGF5IERhcyBDcmVhdGVkIGZpbGUuIAorICAgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJWb3NzV3JhcHBlci5oIgorCisjaWZkZWYgV0xBTl9ERUJVRworI2RlZmluZSBUSU1FUl9OQU1FIHRpbWVyX3B0ci0+dGltZXJOYW1lIAorI2Vsc2UKKyNkZWZpbmUgVElNRVJfTkFNRSAiTi9BIgorI2VuZGlmCisKKy8vIFJvdXRpbmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgV2lud3JhcHBlciBjb250ZXh0IHBvaW50ZXIgZnJvbSB0aGUgcE1hYyBzdHJ1Y3R1cmUKK2V4dGVybiB0cEFuaVNpclR4V3JhcHBlciBzeXNHZXRUeFdyYXBwZXJDb250ZXh0KHZfUFZPSURfdCBwTWFjKTsKKworCisgCisgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB0eF92b3NzX3dyYXBwZXJfaW5pdCgpIAorICoKKyAqIEZVTkNUSU9OOiAgSW5pdGlhbGl6ZSB0aGUgVk9TUyB3cmFwcGVyIAorICoKKyAqIExPR0lDOgorICogICAgICAgLSBKdXN0IGFsbG9jYXRlIHRoZSBzcGlubG9jayB1c2VkIGZvciBjcml0aWNhbCBzZWN0aW9uIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEFTU1VNUFRJT05TOgorICogICAgICAgIC0gTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgTm9uZS4KKyAqCisgKiBAcmV0dXJuIE5vbmUuCisgKgorICovCit2X1ZPSURfdCB0eF92b3NzX3dyYXBwZXJfaW5pdCh2X1BWT0lEX3QgcE1hY0dsb2JhbCwgdl9QVk9JRF90IHBBZGFwdGVyKQoreworICAgIHRwQW5pU2lyVHhXcmFwcGVyIHBUeFdyYXBwZXIgPSBzeXNHZXRUeFdyYXBwZXJDb250ZXh0KHBNYWNHbG9iYWwpOworCisgICAgLy8gaWYgYWxyZWFkeSBhbGxvY2F0ZWQsIHRoZW4gZG9uJ3QgYWxsY29hdGUgYWdhaW4uLi4KKyAgICBpZiAoICFwVHhXcmFwcGVyLT5wQWRhcHRlciApCisgICAgeworICAgICAgICAvLyBTdG9yZSB0aGUgcG9pbnRlciB0byB0aGUgTUFDIGdsb2JhbHMgc3RydWN0dXJlLCBpbiB0aGUgVHggd3JhcHBlciBjb250ZXh0CisgICAgICAgIHBUeFdyYXBwZXItPnBBZGFwdGVyID0gcEFkYXB0ZXI7CisKKyAgICB9Cit9CisKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHR4X3RpbWVfZ2V0KCkgCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIAorICoKKyAqIEByZXR1cm4gY3VycmVudCBzeXN0ZW0gdGltZSBpbiB1bml0cyBvZiBtaWxpc2Vjb25kcworICoKKyAqLyAKK3ZfVUxPTkdfdCB0eF90aW1lX2dldCggdm9pZCApCit7CisgICByZXR1cm4odm9zX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKSk7CisKK30gLy8qIHR4X3RpbWVfZ2V0KCkKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHR4X3RpbWVyX2FjdGl2YXRlKCkgCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIAorICoKKyAqIEByZXR1cm4gVFhfU1VDQ0VTUy4KKyAqCisgKi8KK3ZfVUlOVF90IHR4X3RpbWVyX2FjdGl2YXRlKFRYX1RJTUVSICp0aW1lcl9wdHIpCit7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgCisgICAgLy8gVW5jb21tZW50IHRoZSBhc3NlcnRzLCBpZiB0aGUgaW50ZW50aW9uIGlzIHRvIGRlYnVnIHRoZSBvY2N1cmVuY2Ugb2YgdGhlCisgICAgLy8gZm9sbG93aW5nIGFub21hbG91cyBjbmRpdGlvbnMuCisKKyAgICAvLyBBc3NlcnQgdGhhdCB0aGUgdGltZXIgc3RydWN0dXJlIHBvaW50ZXIgcGFzc2VkLCBpcyBub3QgTlVMTAorICAgIC8vZGJnQXNzZXJ0KE5VTEwgIT0gdGltZXJfcHRyKTsKKworICAgIC8vIElmIHRoZSBOSUMgaXMgaGFsdGluZyBqdXN0IHNwb29mIGEgc3VjY2Vzc2Z1bCB0aW1lciBhY3RpdmF0aW9uLCBzbyB0aGF0IGFsbAorICAgIC8vIHRoZSB0aW1lcnMgY2FuIGJlIGNsZWFuZWQgdXAuCisKKyAgICBpZihOVUxMID09IHRpbWVyX3B0cikKKyAgICAgICAgcmV0dXJuIFRYX1RJTUVSX0VSUk9SOworCisgICAgLy8gUHV0IGEgY2hlY2sgZm9yIHRoZSBmcmVlIGJ1aWxkcworICAgIGlmIChUWF9BSVJHT19UTVJfU0lHTkFUVVJFICE9IHRpbWVyX3B0ci0+dG1yU2lnbmF0dXJlKSB7CisgICAgICAgIFZPU19BU1NFUlQoIHRpbWVyX3B0ci0+dG1yU2lnbmF0dXJlID09IDAgKTsKKworICAgICAgICByZXR1cm4gVFhfVElNRVJfRVJST1I7CisKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgYW4gdW5pbml0aWFsaXplZCB0aW1lcgorICAgIFZPU19BU1NFUlQoMCAhPSBzdHJsZW4oVElNRVJfTkFNRSkpOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAiVGltZXIgJXMgYmVpbmcgYWN0aXZhdGVkXG4iLCBUSU1FUl9OQU1FKTsKKworICAgIHN0YXR1cyA9IHZvc190aW1lcl9zdGFydCggJnRpbWVyX3B0ci0+dm9zVGltZXIsIAorICAgICAgICAgdGltZXJfcHRyLT5pbml0U2NoZWR1bGVUaW1lSW5Nc2VjcyApOworCisgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgIlRpbWVyICVzIG5vdyBhY3RpdmF0ZWRcbiIsIFRJTUVSX05BTUUpOworICAgICAgcmV0dXJuIFRYX1NVQ0NFU1M7CisgICB9CisgICBlbHNlIGlmIChWT1NfU1RBVFVTX0VfQUxSRUFEWSA9PSBzdGF0dXMpCisgICB7CisgICAgICAvLyBzdGFydGluZyB0aW1lciBmYWlscyBiZWNhdXNlIHRpbWVyIGlzIGFscmVhZHkgc3RhcnRlZDsgdGhpcyBpcyBva2F5CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICJUaW1lciAlcyBpcyBhbHJlYWR5IHJ1bm5pbmdcbiIsIFRJTUVSX05BTUUpOworICAgICAgcmV0dXJuIFRYX1NVQ0NFU1M7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiVGltZXIgJXMgZmFpbHMgdG8gYWN0aXZhdGVcbiIsIFRJTUVSX05BTUUpOworICAgICAgcmV0dXJuIFRYX1RJTUVSX0VSUk9SOworICAgfQorfSAvKioqIHR4X3RpbWVyX2FjdGl2YXRlKCkgKioqLworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdHhfdGltZXJfY2hhbmdlKCkgCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIAorICoKKyAqIEByZXR1cm4gVFhfU1VDQ0VTUy4KKyAqCisgKi8KK3ZfVUlOVF90IHR4X3RpbWVyX2NoYW5nZShUWF9USU1FUiAqdGltZXJfcHRyLCAKKyAgICAgIHZfVUxPTkdfdCBpbml0U2NoZWR1bGVUaW1lSW5UaWNrcywgdl9VTE9OR190IHJlc2NoZWR1bGVUaW1lSW5UaWNrcykKK3sKKyAgIC8vIFB1dCBhIGNoZWNrIGZvciB0aGUgZnJlZSBidWlsZHMKKyAgIGlmIChUWF9BSVJHT19UTVJfU0lHTkFUVVJFICE9IHRpbWVyX3B0ci0+dG1yU2lnbmF0dXJlKSB7CisgICAgICAgVk9TX0FTU0VSVCggdGltZXJfcHRyLT50bXJTaWduYXR1cmUgPT0gMCApOworCisgICAgICAgcmV0dXJuIFRYX1RJTUVSX0VSUk9SOyAgICAgIAorICAgfQorCisgICAgLy8gY2hhbmdlcyBjYW5ub3QgYmUgYXBwbGllZCB1bnRpbCB0aW1lciBzdG9wcyBydW5uaW5nCisgICAgaWYgKFZPU19USU1FUl9TVEFURV9TVE9QUEVEID09IHZvc190aW1lcl9nZXRDdXJyZW50U3RhdGUoJnRpbWVyX3B0ci0+dm9zVGltZXIpKQorICAgIHsKKyAgICAgICB0aW1lcl9wdHItPmluaXRTY2hlZHVsZVRpbWVJbk1zZWNzID0gVFhfTVNFQ1NfSU5fMV9USUNLICogaW5pdFNjaGVkdWxlVGltZUluVGlja3M7CisgICAgICAgdGltZXJfcHRyLT5yZXNjaGVkdWxlVGltZUluTXNlY3MgPSBUWF9NU0VDU19JTl8xX1RJQ0sgKiByZXNjaGVkdWxlVGltZUluVGlja3M7CisgICAgICAgcmV0dXJuIFRYX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIFRYX1RJTUVSX0VSUk9SOworICAgIH0KK30gLyoqKiB0eF90aW1lcl9jaGFuZ2UoKSAqKiovCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdHhfdGltZXJfY2hhbmdlX2NvbnRleHQoKSAKKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgCisgKgorICogQHJldHVybiBUWF9TVUNDRVNTLgorICoKKyAqLwordl9VSU5UX3QgdHhfdGltZXJfY2hhbmdlX2NvbnRleHQoVFhfVElNRVIgKnRpbWVyX3B0ciwgdEFOSV9VMzIgZXhwaXJhdGlvbl9pbnB1dCkKK3sKKworICAgIC8vIFB1dCBhIGNoZWNrIGZvciB0aGUgZnJlZSBidWlsZHMKKyAgICBpZiAoVFhfQUlSR09fVE1SX1NJR05BVFVSRSAhPSB0aW1lcl9wdHItPnRtclNpZ25hdHVyZSkgeworICAgICAgIFZPU19BU1NFUlQoIHRpbWVyX3B0ci0+dG1yU2lnbmF0dXJlID09IDAgKTsKKworICAgICAgIHJldHVybiBUWF9USU1FUl9FUlJPUjsgICAgICAKKyAgICB9CisKKyAgICAvLyBjaGFuZ2VzIGNhbm5vdCBiZSBhcHBsaWVkIHVudGlsIHRpbWVyIHN0b3BzIHJ1bm5pbmcKKyAgICBpZiAoVk9TX1RJTUVSX1NUQVRFX1NUT1BQRUQgPT0gdm9zX3RpbWVyX2dldEN1cnJlbnRTdGF0ZSgmdGltZXJfcHRyLT52b3NUaW1lcikpCisgICAgeworICAgICAgIHRpbWVyX3B0ci0+ZXhwaXJlSW5wdXQgPSBleHBpcmF0aW9uX2lucHV0OworICAgICAgIHJldHVybiBUWF9TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHJldHVybiBUWF9USU1FUl9FUlJPUjsKKyAgICB9Cit9IC8qKiogdHhfdGltZXJfY2hhbmdlKCkgKioqLworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdHhfbWFpbl90aW1lcl9mdW5jKCkgCisgKgorICogRlVOQ1RJT046CisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gIAorICoKKyAqIEByZXR1cm4gTm9uZS4KKyAqCisgKi8KK3N0YXRpYyB2X1ZPSURfdCB0eF9tYWluX3RpbWVyX2Z1bmMoIHZfUFZPSURfdCBmdW5jdGlvbkNvbnRleHQgKQoreworICAgVFhfVElNRVIgKnRpbWVyX3B0ciA9IChUWF9USU1FUiAqKWZ1bmN0aW9uQ29udGV4dDsKKworICAgVk9TX0FTU0VSVChOVUxMICE9IHRpbWVyX3B0cik7CisKKyAgIFZPU19BU1NFUlQoTlVMTCAhPSB0aW1lcl9wdHItPnBFeHBpcmVGdW5jKTsKKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgIlRpbWVyICVzIHRyaWdnZXJlZFxuIiwgVElNRVJfTkFNRSk7CisKKyAgIC8vIE5vdyBjYWxsIHRoZSBhY3R1YWwgdGltZXIgZnVuY3Rpb24sIHRha2luZyB0aGUgZnVuY3Rpb24gcG9pbnRlciwKKyAgIC8vIGZyb20gdGhlIHRpbWVyIHN0cnVjdHVyZS4KKyAgICgqIHRpbWVyX3B0ci0+cEV4cGlyZUZ1bmMpKCB0aW1lcl9wdHItPnBNYWMsIHRpbWVyX3B0ci0+ZXhwaXJlSW5wdXQgKTsKKworICAgLy8gY2hlY2sgaWYgdGhpcyBuZWVkcyB0byBiZSByZXNjaGVkdWxlZAorICAgaWYgKDAgIT0gdGltZXJfcHRyLT5yZXNjaGVkdWxlVGltZUluTXNlY3MpCisgICB7CisgICAgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgICAgIHN0YXR1cyA9IHZvc190aW1lcl9zdGFydCggJnRpbWVyX3B0ci0+dm9zVGltZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl9wdHItPnJlc2NoZWR1bGVUaW1lSW5Nc2VjcyApOworICAgICAgdGltZXJfcHRyLT5yZXNjaGVkdWxlVGltZUluTXNlY3MgPSAwOworCisgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX1dBUk4sIAorICAgICAgICAgICAgICJVbmFibGUgdG8gcmVzY2hlZHVsZSB0aW1lciAlczsgc3RhdHVzPSVkXG4iLCBUSU1FUl9OQU1FLCBzdGF0dXMpOworICAgICAgfQorICAgfQorfSAvKioqIHR4X3RpbWVyX2NoYW5nZSgpICoqKi8KKworI2lmZGVmIFRJTUVSX01BTkFHRVIKK3ZfVUlOVF90IHR4X3RpbWVyX2NyZWF0ZV9pbnRlcm5fZGVidWcoIHZfUFZPSURfdCBwTWFjR2xvYmFsLCBUWF9USU1FUiAqdGltZXJfcHRyLAorICAgY2hhciAqbmFtZV9wdHIsIAorICAgdl9WT0lEX3QgKCAqZXhwaXJhdGlvbl9mdW5jdGlvbiApKCB2X1BWT0lEX3QsIHRBTklfVTMyICksCisgICB0QU5JX1UzMiBleHBpcmF0aW9uX2lucHV0LCB2X1VMT05HX3QgaW5pdFNjaGVkdWxlVGltZUluVGlja3MsIAorICAgdl9VTE9OR190IHJlc2NoZWR1bGVUaW1lSW5UaWNrcywgdl9VTE9OR190IGF1dG9fYWN0aXZhdGUsIAorICAgY2hhciogZmlsZU5hbWUsIHZfVTMyX3QgbGluZU51bSkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgIFZPU19BU1NFUlQoKE5VTEwgIT0gZXhwaXJhdGlvbl9mdW5jdGlvbikgJiYgKE5VTEwgIT0gbmFtZV9wdHIpKTsKKworICAgIGlmICghaW5pdFNjaGVkdWxlVGltZUluVGlja3MpCisgICAgICAgIHJldHVybiBUWF9USUNLX0VSUk9SOworCisgICAgaWYgKCF0aW1lcl9wdHIpCisgICAgICAgIHJldHVybiBUWF9USU1FUl9FUlJPUjsKKworICAgIC8vIEluaXRpYWxpemUgdGltZXIgc3RydWN0dXJlCisgICAgdGltZXJfcHRyLT5wRXhwaXJlRnVuYyA9IGV4cGlyYXRpb25fZnVuY3Rpb247CisgICAgdGltZXJfcHRyLT5leHBpcmVJbnB1dCA9IGV4cGlyYXRpb25faW5wdXQ7CisgICAgdGltZXJfcHRyLT5pbml0U2NoZWR1bGVUaW1lSW5Nc2VjcyA9CisgICAgICAgIFRYX01TRUNTX0lOXzFfVElDSyAqIGluaXRTY2hlZHVsZVRpbWVJblRpY2tzOworICAgIHRpbWVyX3B0ci0+cmVzY2hlZHVsZVRpbWVJbk1zZWNzID0KKyAgICAgICAgVFhfTVNFQ1NfSU5fMV9USUNLICogcmVzY2hlZHVsZVRpbWVJblRpY2tzOworICAgIHRpbWVyX3B0ci0+cE1hYyA9IHBNYWNHbG9iYWw7CisKKyAgICAvLyBTZXQgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSB0aW1lciB3YXMgY3JlYXRlZAorICAgIHRpbWVyX3B0ci0+dG1yU2lnbmF0dXJlID0gVFhfQUlSR09fVE1SX1NJR05BVFVSRTsKKworI2lmZGVmIFdMQU5fREVCVUcKKyAgICAvLyBTdG9yZSB0aGUgdGltZXIgbmFtZQorICAgIHN0cmxjcHkodGltZXJfcHRyLT50aW1lck5hbWUsIG5hbWVfcHRyLCBzaXplb2YodGltZXJfcHRyLT50aW1lck5hbWUpKTsKKyNlbmRpZiAvLyBTdG9yZSB0aGUgdGltZXIgbmFtZSwgZm9yIERlYnVnIGJ1aWxkIG9ubHkKKworICAgIHN0YXR1cyA9IHZvc190aW1lcl9pbml0X2RlYnVnKCAmdGltZXJfcHRyLT52b3NUaW1lciwgVk9TX1RJTUVSX1RZUEVfU1csIAorICAgICAgICAgIHR4X21haW5fdGltZXJfZnVuYywgKHZfUFZPSURfdCl0aW1lcl9wdHIsIGZpbGVOYW1lLCBsaW5lTnVtKTsKKyAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgdGltZXIgZm9yICVzXG4iLCBUSU1FUl9OQU1FKTsKKyAgICAgICByZXR1cm4gVFhfVElNRVJfRVJST1I7CisgICAgfQorCisgICAgaWYoMCAhPSByZXNjaGVkdWxlVGltZUluVGlja3MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICJDcmVhdGluZyBwZXJpb2RpYyB0aW1lciBmb3IgJXNcbiIsIFRJTUVSX05BTUUpOworICAgIH0KKworICAgIC8vIEFjdGl2YXRlIHRoaXMgdGltZXIgaWYgcmVxdWlyZWQKKyAgICBpZiAoYXV0b19hY3RpdmF0ZSkKKyAgICB7CisgICAgICAgIHR4X3RpbWVyX2FjdGl2YXRlKHRpbWVyX3B0cik7CisgICAgfQorCisgICAgcmV0dXJuIFRYX1NVQ0NFU1M7CisKK30gLy8qKiB0eF90aW1lcl9jcmVhdGUoKSAqKiovCisjZWxzZQordl9VSU5UX3QgdHhfdGltZXJfY3JlYXRlX2ludGVybiggdl9QVk9JRF90IHBNYWNHbG9iYWwsIFRYX1RJTUVSICp0aW1lcl9wdHIsCisgICBjaGFyICpuYW1lX3B0ciwgCisgICB2X1ZPSURfdCAoICpleHBpcmF0aW9uX2Z1bmN0aW9uICkoIHZfUFZPSURfdCwgdEFOSV9VMzIgKSwKKyAgIHRBTklfVTMyIGV4cGlyYXRpb25faW5wdXQsIHZfVUxPTkdfdCBpbml0U2NoZWR1bGVUaW1lSW5UaWNrcywgCisgICB2X1VMT05HX3QgcmVzY2hlZHVsZVRpbWVJblRpY2tzLCB2X1VMT05HX3QgYXV0b19hY3RpdmF0ZSApCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXM7CisKKyAgICBWT1NfQVNTRVJUKChOVUxMICE9IGV4cGlyYXRpb25fZnVuY3Rpb24pICYmIChOVUxMICE9IG5hbWVfcHRyKSk7CisgICAgaWYoKE5VTEwgPT0gbmFtZV9wdHIpIHx8IChOVUxMID09IGV4cGlyYXRpb25fZnVuY3Rpb24pKQorICAgICAgICByZXR1cm4gVFhfVElNRVJfRVJST1I7CisKKyAgICBpZiAoIWluaXRTY2hlZHVsZVRpbWVJblRpY2tzKQorICAgICAgICByZXR1cm4gVFhfVElDS19FUlJPUjsKKworICAgIGlmICghdGltZXJfcHRyKQorICAgICAgICByZXR1cm4gVFhfVElNRVJfRVJST1I7CisKKyAgICAvLyBJbml0aWFsaXplIHRpbWVyIHN0cnVjdHVyZQorICAgIHRpbWVyX3B0ci0+cEV4cGlyZUZ1bmMgPSBleHBpcmF0aW9uX2Z1bmN0aW9uOworICAgIHRpbWVyX3B0ci0+ZXhwaXJlSW5wdXQgPSBleHBpcmF0aW9uX2lucHV0OworICAgIHRpbWVyX3B0ci0+aW5pdFNjaGVkdWxlVGltZUluTXNlY3MgPQorICAgICAgICBUWF9NU0VDU19JTl8xX1RJQ0sgKiBpbml0U2NoZWR1bGVUaW1lSW5UaWNrczsKKyAgICB0aW1lcl9wdHItPnJlc2NoZWR1bGVUaW1lSW5Nc2VjcyA9CisgICAgICAgIFRYX01TRUNTX0lOXzFfVElDSyAqIHJlc2NoZWR1bGVUaW1lSW5UaWNrczsKKyAgICB0aW1lcl9wdHItPnBNYWMgPSBwTWFjR2xvYmFsOworCisgICAgLy8gU2V0IHRoZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgdGltZXIgd2FzIGNyZWF0ZWQKKyAgICB0aW1lcl9wdHItPnRtclNpZ25hdHVyZSA9IFRYX0FJUkdPX1RNUl9TSUdOQVRVUkU7CisKKyNpZmRlZiBXTEFOX0RFQlVHCisgICAgLy8gU3RvcmUgdGhlIHRpbWVyIG5hbWUKKyAgICB2b3NfbWVtX2NvcHkodGltZXJfcHRyLT50aW1lck5hbWUsIG5hbWVfcHRyLCBzaXplb2YodGltZXJfcHRyLT50aW1lck5hbWUpKTsKKyNlbmRpZiAvLyBTdG9yZSB0aGUgdGltZXIgbmFtZSwgZm9yIERlYnVnIGJ1aWxkIG9ubHkKKworICAgIHN0YXR1cyA9IHZvc190aW1lcl9pbml0KCAmdGltZXJfcHRyLT52b3NUaW1lciwgVk9TX1RJTUVSX1RZUEVfU1csIAorICAgICAgICAgIHR4X21haW5fdGltZXJfZnVuYywgKHZfUFZPSURfdCl0aW1lcl9wdHIgKTsKKyAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgdGltZXIgZm9yICVzXG4iLCBUSU1FUl9OQU1FKTsKKyAgICAgICByZXR1cm4gVFhfVElNRVJfRVJST1I7CisgICAgfQorCisgICAgaWYoMCAhPSByZXNjaGVkdWxlVGltZUluVGlja3MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICJDcmVhdGluZyBwZXJpb2RpYyB0aW1lciBmb3IgJXNcbiIsIFRJTUVSX05BTUUpOworICAgIH0KKworICAgIC8vIEFjdGl2YXRlIHRoaXMgdGltZXIgaWYgcmVxdWlyZWQKKyAgICBpZiAoYXV0b19hY3RpdmF0ZSkKKyAgICB7CisgICAgICAgIHR4X3RpbWVyX2FjdGl2YXRlKHRpbWVyX3B0cik7CisgICAgfQorCisgICAgcmV0dXJuIFRYX1NVQ0NFU1M7CisKK30gLy8qKiB0eF90aW1lcl9jcmVhdGUoKSAqKiovCisjZW5kaWYKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHR4X3RpbWVyX2RlYWN0aXZhdGUoKSAKKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgCisgKgorICogQHJldHVybiBUWF9TVUNDRVNTLgorICoKKyAqLwordl9VSU5UX3QgdHhfdGltZXJfZGVhY3RpdmF0ZShUWF9USU1FUiAqdGltZXJfcHRyKQoreworICAgVk9TX1NUQVRVUyB2U3RhdHVzOworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgInR4X3RpbWVyX2RlYWN0aXZhdGUoKSBjYWxsZWQgZm9yIHRpbWVyICVzXG4iLCBUSU1FUl9OQU1FKTsKKworICAgLy8gUHV0IGEgY2hlY2sgZm9yIHRoZSBmcmVlIGJ1aWxkcworICAgaWYgKFRYX0FJUkdPX1RNUl9TSUdOQVRVUkUgIT0gdGltZXJfcHRyLT50bXJTaWduYXR1cmUpCisgICB7CisgICAgICByZXR1cm4gVFhfVElNRVJfRVJST1I7ICAgICAgCisgICB9CisKKyAgIC8vIGlmIHRoZSB0aW1lciBpcyBub3QgcnVubmluZyB0aGVuIHdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUKKyAgIHZTdGF0dXMgPSB2b3NfdGltZXJfc3RvcCggJnRpbWVyX3B0ci0+dm9zVGltZXIgKTsKKyAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdlN0YXR1cykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX1dBUk4sIAorICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc3RvcCB0aW1lciAlczsgc3RhdHVzID0lZFxuIiwgCisgICAgICAgICAgICAgICAgVElNRVJfTkFNRSwgdlN0YXR1cyk7CisgICB9CisKKyAgIHJldHVybiBUWF9TVUNDRVNTOworCit9IC8qKiogdHhfdGltZXJfZGVhY3RpdmF0ZSgpICoqKi8KKwordl9VSU5UX3QgdHhfdGltZXJfZGVsZXRlKCBUWF9USU1FUiAqdGltZXJfcHRyICkKK3sKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICJ0eF90aW1lcl9kZWxldGUoKSBjYWxsZWQgZm9yIHRpbWVyICVzXG4iLCBUSU1FUl9OQU1FKTsKKworICAgLy8gUHV0IGEgY2hlY2sgZm9yIHRoZSBmcmVlIGJ1aWxkcworICAgaWYgKFRYX0FJUkdPX1RNUl9TSUdOQVRVUkUgIT0gdGltZXJfcHRyLT50bXJTaWduYXR1cmUpCisgICB7CisgICAgICByZXR1cm4gVFhfVElNRVJfRVJST1I7ICAgICAgCisgICB9CisKKyAgIHZvc190aW1lcl9kZXN0cm95KCAmdGltZXJfcHRyLT52b3NUaW1lciApOworICAgcmV0dXJuIFRYX1NVQ0NFU1M7ICAgICAKK30gLyoqKiB0eF90aW1lcl9kZWxldGUoKSAqKiovCisKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHR4X3RpbWVyX3J1bm5pbmcoKSAKKyAqCisgKiBGVU5DVElPTjoKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSAgCisgKgorICogQHJldHVybiBUWF9TVUNDRVNTLgorICoKKyAqLwordl9CT09MX3QgdHhfdGltZXJfcnVubmluZyhUWF9USU1FUiAqdGltZXJfcHRyKQoreworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgInR4X3RpbWVyX3J1bm5pbmcoKSBjYWxsZWQgZm9yIHRpbWVyICVzXG4iLCBUSU1FUl9OQU1FKTsKKworICAgLy8gUHV0IGEgY2hlY2sgZm9yIHRoZSBmcmVlIGJ1aWxkcworICAgaWYgKFRYX0FJUkdPX1RNUl9TSUdOQVRVUkUgIT0gdGltZXJfcHRyLT50bXJTaWduYXR1cmUpCisgICAgICByZXR1cm4gVk9TX0ZBTFNFOyAgICAgIAorCisgICBpZiAoVk9TX1RJTUVSX1NUQVRFX1JVTk5JTkcgPT0gCisgICAgICAgdm9zX3RpbWVyX2dldEN1cnJlbnRTdGF0ZSggJnRpbWVyX3B0ci0+dm9zVGltZXIgKSkKKyAgIHsKKyAgICAgICByZXR1cm4gVk9TX1RSVUU7CisgICB9CisgICByZXR1cm4gVk9TX0ZBTFNFOworCit9IC8qKiogdHhfdGltZXJfcnVubmluZygpICoqKi8KZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNEZWJ1Zy5oIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy9zeXN0ZW0vaW5jL3N5c0RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjNzE0MwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNEZWJ1Zy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgc3lzR2xvYmFsLmggY29udGFpbnMgdGhlIGxvZ0R1bXAgdXRpbGl0eSBmb3Igc3lzdGVtIG1vZHVsZS4KKyAqIEF1dGhvcjogICAgICBWLiBLLiBLYW5kYXJwYQorICogRGF0ZTogICAgICAgIDAxLzI0LzIwMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfX1NZU19ERUJVR19IX18KKyNkZWZpbmUgX19TWVNfREVCVUdfSF9fCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyMgaW5jbHVkZSAidXRpbHNBcGkuaCIKKyMgaW5jbHVkZSAic2lyRGVidWcuaCIKKyMgaW5jbHVkZSAic2lyUGFyYW1zLmgiCisKK3ZvaWQgc3lzTG9nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGxvZ2xldmVsLCBjb25zdCBjaGFyICpwU3RyaW5nLC4uLik7CisKKyNlbmRpZiAvLyBfX1NZU19ERUJVR19IX18KZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNEZWYuaCBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNEZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGI5YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy9zeXN0ZW0vaW5jL3N5c0RlZi5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHN5c0RlZi5oIGNvbnRhaW5zIHRoZSBjb21tb24gZGVmaW5pdGlvbnMgdXNlZCB0byBicmluZyB1cAorICogU2lyaXVzIHN5c3RlbS4KKyAqIEF1dGhvcjogICAgICBWLiBLLiBLYW5kYXJwYQorICogRGF0ZTogICAgICAgIDA0LzEzLzIwMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fU1lTREVGX0gKKyNkZWZpbmUgX19TWVNERUZfSAorCisvLy8gU2lyaXVzIHN5c3RlbSBsZXZlbCBkZWZpdGlvbnMKKy8vIE5PVEU6IERvIG5vdCBwcm9ncmFtIHN5c3RlbSB0aW1lciB0aWNrIGR1cmF0aW9uIHRvIGxlc3MgdGhhbiAxbXNlYworCisvLy8gU3lzdGVtIHRpbWVyIHRpY2sgZHVyYXRpb24gaW4gbmFub3NlY29uZHMKKyNpZiBkZWZpbmVkIEFOSV9PU19UWVBFX0xJTlVYCisjaWZkZWYgQU5JX0FQX1NESworI2RlZmluZSBTWVNfVElDS19EVVJfTlMgICAgIDEwMDAwMDAwICAgIC8vIDEwbXMKKyNkZWZpbmUgU1lTX1RJQ0tfVE9fTUlDUk9fU0VDT05EICAgMTAwMDAKKyNlbHNlCisjZGVmaW5lIFNZU19USUNLX0RVUl9OUyAgICAgMTAwMDAwMCAgICAvLyAxbXMKKyNkZWZpbmUgU1lTX1RJQ0tfVE9fTUlDUk9fU0VDT05EICAgMTAwMAorI2VuZGlmCisjZWxpZiBkZWZpbmVkIEFOSV9PU19UWVBFX09TWAorI2RlZmluZSBTWVNfVElDS19EVVJfTlMgICAgIDEwMDAwMDAwICAgIC8vIDEwbXMKKyNkZWZpbmUgU1lTX1RJQ0tfVE9fTUlDUk9fU0VDT05EICAgMTAwMDAKKyNlbGlmIGRlZmluZWQgQU5JX09TX1RZUEVfV0lORE9XUworI2RlZmluZSBTWVNfVElDS19EVVJfTlMgICAgIDIwMDAwMDAwICAgIC8vIDIwbXMKKyNkZWZpbmUgU1lTX1RJQ0tfVE9fTUlDUk9fU0VDT05EICAgMjAwMDAKKyNlbHNlCisjZGVmaW5lIFNZU19USUNLX0RVUl9OUyAgICAgMTAwMDAwMDAgICAgLy8gMTBtcworI2RlZmluZSBTWVNfVElDS19UT19NSUNST19TRUNPTkQgICAxMDAwMAorI2VuZGlmCisKKy8vLyBTeXN0ZW0gdGltZXIgdGljayBkdXJhdGlvbiBpbiBtaWxpc2Vjb25kcworI2RlZmluZSBTWVNfVElDS19EVVJfTVMgICAgIChTWVNfVElDS19EVVJfTlMvMTAwMDAwMCkKKworLy8vIENsb2NrcyBpbiBhIG1pbGlzZWNvbmQKKyNkZWZpbmUgU1lTX0NMT0NLU19QRVJfTVMgICAxMjAwMDAgLy8gMTIwIE1IeiAKKworLy8gSW4gTWlsbGlzZWNvbmRzCisjZGVmaW5lIFNZU19BRERfQkFfUlNQX0RVUiAgIDEwMDAKKworLy8vIFN5c3RlbSB0aW1lciB0aWNrIGR1cmF0aW9uIGluIGNsb2NrcworI2RlZmluZSBTWVNfVElDS19EVVJfQ0xLICAgIChTWVNfVElDS19EVVJfTVMgKiBTWVNfQ0xPQ0tTX1BFUl9NUykKKworLy8vIE51bWJlciBvZiB0aW1lciB0aWNrcyBpbiBhIHNlY29uZAorI2RlZmluZSBTWVNfVElDS1NfUEVSX1NFQ09ORCAoMTAwMC9TWVNfVElDS19EVVJfTVMpCisKKy8vLyBNYWNybyB0byBjb252ZXJ0IE1TIHRvIFRpY2tzCisjZGVmaW5lIFNZU19NU19UT19USUNLUyh4KSAgICgoeCkgLyBTWVNfVElDS19EVVJfTVMpCisKKy8vLyBNYWNybyB0byBjb252ZXJ0IFNlY29uZHMgdG8gVGlja3MKKyNkZWZpbmUgU1lTX1NFQ19UT19USUNLUyh4KSAgKCh4KSAqIFNZU19USUNLU19QRVJfU0VDT05EKQorCisvLy8gTWFjcm8gdG8gY29udmVydCBNaW51dGVzIHRvIFRpY2tzCisjZGVmaW5lIFNZU19NSU5fVE9fVElDS1MoeCkgICgoKHgpICogNjApICogU1lTX1RJQ0tTX1BFUl9TRUNPTkQpCisKKy8vLyBNTlQgdGFzayBwcm9jZXNzaW5nIGludGVydmFsIGluIHNlY29uZHMKKyNkZWZpbmUgU1lTX01OVF9JTlRFUlZBTCAgICAgNjAKKworLy8vIE1TIHRvIFRpbWUgVW5pdHMKKyNkZWZpbmUgU1lTX01TX1RPX1RVKHgpICAgICAgKHggKiAxMDAwKSA+PiAxMDsKKworLy8vIFRVIHRvIE1TCisjZGVmaW5lIFNZU19UVV9UT19NUyh4KSAgICAgICgoeCA8PCAxMCkgLyAxMDAwKQorCisvLyAtLS0tLS0tLS0gIEVuZCBvZiBXaW5kb3dzICYgUlRBSSAtLS0tLS0tLS0tLQorCisvLy8gTWVzc2FnZSBxdWV1ZSBkZWZpbml0aW9ucworCisvLy8gZ0hhbE1zZ1EKKyMgZGVmaW5lIFNZU19IQUxfUV9TSVpFICAgICAyMDAgICAgICAgIC8vIEhvbGRzIHVwIHRvIDI1IG1lc3NhZ2VzCisKKy8vLyBnTU1IaGlQcmlvcml0eU1zZ1EKKyMgZGVmaW5lIFNZU19NTUhfSElfUFJJX1FfU0laRSAgICAgIDIwMCAgICAgICAgLy8gSG9sZHMgdXAgdG8gMjUgbWVzc2FnZXMKKworLy8vIGdNTUhwcm90b2NvbE1zZ1EKKyMgZGVmaW5lIFNZU19NTUhfUFJPVF9RX1NJWkUgICAgIDQwMCAgICAgICAgICAvLyBIb2xkcyB1cCB0byA1MCBtZXNzYWdlcworCisvLy8gZ01NSGRlYnVnTXNnUQorIyBkZWZpbmUgU1lTX01NSF9ERUJVR19RX1NJWkUgICAgODAwICAgICAgICAgIC8vIEhvbGRzIHVwIHRvIDEwMCBtZXNzYWdlcworCisvLy8gZ01BSU5UbXNnUQorIyBkZWZpbmUgU1lTX01OVF9RX1NJWkUgICAgICAgICAgMjAwICAgICAgICAgIC8vIEhvbGRzIHVwIHRvIDI1IG1lc3NhZ2VzCisKKy8vLyBMSU0gTWVzc2FnZSBRdWV1ZQorIyBkZWZpbmUgU1lTX0xJTV9RX1NJWkUgICAgICAgICAgNDAwICAgICAgICAgIC8vIEhvbGRzIHVwIHRvIDUwIG1lc3NhZ2VzCisKKy8vLyBTY2hlZHVsZXIgTWVzc2FnZSBRdWV1ZQorIyBkZWZpbmUgU1lTX1NDSF9RX1NJWkUgICAgICAgICAgODAwICAgICAgICAgIC8vIEhvbGRzIHVwIHRvIDI1IG1lc3NhZ2VzCisKKy8vLyBQTU0gTWVzc2FnZSBRdWV1ZQorIyBkZWZpbmUgU1lTX1BNTV9RX1NJWkUgICAgICAgICAgODAwICAgICAgICAgIC8vIEhvbGRzIHVwIHRvIDEwMCBtZXNzYWdlcworCisvLy8gVFggTWVzc2FnZSBRdWV1ZQorIyBkZWZpbmUgU1lTX1RYX1FfU0laRSAgICAgICAgICAgMjA0OCAgICAvLyBIb2xkcyB1cCB0byA0MDAgbWVzc2FnZXMKKworLy8vIFJYIE1lc3NhZ2UgUXVldWUKKyMgZGVmaW5lIFNZU19SWF9RX1NJWkUgICAgICAgICAgIDIwNDggICAvLyBIb2xkcyB1cCB0byA0MDAgbWVzc2FnZXMKKworLy8vIFBUVCAgTWVzc2FnZSBRdWV1ZQorIyBkZWZpbmUgU1lTX05JTV9QVFRfUV9TSVpFICAgMjAwICAgICAgICAgICAgIC8vIEhvbGRzIHVwIHRvIDI1IG1lc3NhZ2VzCisKKy8vLyBTZW1hcGhvcmUgZGVmaW5pdGlvbnMKKy8vIERhdGEgU2VtYXBob3JlCisKKyMgZGVmaW5lIFNZU19EUEhfU0VNX0lOSVRJQUxfQ05UIDAKKworLy8gVHJhbnNwb3J0IFNlbWFwaG9yZQorCisjIGRlZmluZSBTWVNfQkJUX1NFTV9JTklUSUFMX0NOVCAwCisKKy8vLyBUaHJlYWQgZGVmaW5pdGlvbnMKKy8vIHRIQUwKKworIyBkZWZpbmUgU1lTX0hBTF9USFJFQURfRU5UUllfRlVOQ1RJT04gaGFsRW50cnkKKyMgZGVmaW5lIFNZU19IQUxfU1RBQ0tfU0laRSAgICAgICAgICAgIDgxOTIKKyMgZGVmaW5lIFNZU19IQUxfVEhSRUFEX1BSSU9SSVRZICAgICAgIDIKKworLy8gdERQSAorCisjIGRlZmluZSBTWVNfRFBIX1RIUkVBRF9FTlRSWV9GVU5DVElPTiBkcGhFbnRyeQorIyBkZWZpbmUgU1lTX0RQSF9TVEFDS19TSVpFICAgICAgICAgICAgODE5MgorIyBkZWZpbmUgU1lTX0RQSF9USFJFQURfUFJJT1JJVFkgICAgICAgMTUKKworLy8gdEJCVAorCisjIGRlZmluZSBTWVNfQkJUX1RIUkVBRF9FTlRSWV9GVU5DVElPTiBiYnRFbnRyeQorIyBkZWZpbmUgU1lTX0JCVF9TVEFDS19TSVpFICAgICAgICAgICAgODE5MgorIyBkZWZpbmUgU1lTX0JCVF9USFJFQURfUFJJT1JJVFkgICAgICAgMTYKKworLy8gdFNDSAorCisjIGRlZmluZSBTWVNfU0NIX1NUQUNLX1NJWkUgICAgICAgICAgICA4MTkyCisjIGRlZmluZSBTWVNfU0NIX1RIUkVBRF9QUklPUklUWSAgICAgICAxNworCisvLyB0UE1NCisKKyMgZGVmaW5lIFNZU19QTU1fU1RBQ0tfU0laRSAgICAgICAgICAgIDgxOTIKKyMgZGVmaW5lIFNZU19QTU1fVEhSRUFEX1BSSU9SSVRZICAgICAgIDE3CisKKy8vIHRMSU0KKworIyBkZWZpbmUgU1lTX0xJTV9USFJFQURfRU5UUllfRlVOQ1RJT04gbGltRW50cnkKKyMgZGVmaW5lIFNZU19MSU1fU1RBQ0tfU0laRSAgICAgICAgICAgIDgxOTIKKyMgZGVmaW5lIFNZU19MSU1fVEhSRUFEX1BSSU9SSVRZICAgICAgIDE4CisKKy8vIHRNQUlOVAorCisjIGRlZmluZSBTWVNfTU5UX1RIUkVBRF9FTlRSWV9GVU5DVElPTiBtbnRFbnRyeQorIyBkZWZpbmUgU1lTX01OVF9TVEFDS19TSVpFICAgICAgICAgICAgODE5MgorIyBkZWZpbmUgU1lTX01OVF9USFJFQURfUFJJT1JJVFkgICAgICAgMjUKKworLy8gdE1NSAorCisjIGRlZmluZSBTWVNfTU1IX1RIUkVBRF9FTlRSWV9GVU5DVElPTiBtbWhFbnRyeQorIyBkZWZpbmUgU1lTX01NSF9TVEFDS19TSVpFICAgICAgICAgICAgODE5MgorIyBkZWZpbmUgU1lTX01NSF9USFJFQURfUFJJT1JJVFkgICAgICAgIDEwCisKKy8vIHROSU1fTU5UX1BLVF9HRU4KKworIyBkZWZpbmUgU1lTX05JTV9QVFRfVEhSRUFEX1NUQUNLX1NJWkUgODE5MgorIyBkZWZpbmUgU1lTX05JTV9QVFRfVEhSRUFEX1BSSU9SSVRZICAgMjgKKworI2VuZGlmIC8vIF9fU1lTREVGX0gKZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNFbnRyeUZ1bmMuaCBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNFbnRyeUZ1bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWQxMGVjCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy9zeXN0ZW0vaW5jL3N5c0VudHJ5RnVuYy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgc3lzRW50cnlGdW5jLmggY29udGFpbnMgbW9kdWxlIGVudHJ5IGZ1bmN0aW9ucyBkZWZpbml0aW9ucworICogQXV0aG9yOiAgICAgIFYuIEsuIEthbmRhcnBhCisgKiBEYXRlOiAgICAgICAgMDQvMTMvMjAwMgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9fU1lTX0VOVFJZX0ZVTkNfSAorI2RlZmluZSBfX1NZU19FTlRSWV9GVU5DX0gKKworI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorCitleHRlcm4gdFNpclJldFN0YXR1cyBzeXNJbml0R2xvYmFscyh0cEFuaVNpckdsb2JhbCk7CitleHRlcm4gdm9pZCBzeXNCYnRFbnRyeSh0QU5JX1UzMiBkdW1teSk7CitleHRlcm4gdm9pZCBzeXNTY2hFbnRyeSh0QU5JX1UzMiBkdW1teSk7CitleHRlcm4gdm9pZCBzeXNQbW1FbnRyeSh0QU5JX1UzMiBkdW1teSk7CitleHRlcm4gdm9pZCBzeXNEcGhFbnRyeSh0QU5JX1UzMiBkdW1teSk7CitleHRlcm4gdm9pZCBzeXNMaW1FbnRyeSh0QU5JX1UzMiBkdW1teSk7CitleHRlcm4gdm9pZCBzeXNNbWhFbnRyeSh0QU5JX1UzMiBkdW1teSk7CitleHRlcm4gdm9pZCBzeXNNbnRFbnRyeSh0QU5JX1UzMiBkdW1teSk7CitleHRlcm4gdm9pZCBzeXNIYWxFbnRyeSh0QU5JX1UzMiBkdW1teSk7CitleHRlcm4gdm9pZCBzeXNOaW1QdHRFbnRyeSh0QU5JX1UzMiBkdW1teSk7CisKKyNlbmRpZiAvLyBfX1NZU19FTlRSWV9GVU5DX0gKZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvc3lzdGVtL2luYy9zeXNTdGFydHVwLmggYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3N5c3RlbS9pbmMvc3lzU3RhcnR1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTU1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3N5c3RlbS9pbmMvc3lzU3RhcnR1cC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisKKy8qCisgKgorICogV29vZHNpZGUgTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZAorICogc3lzU3RhcnR1cC5oOiBTeXN0ZW0gc3RhcnR1cCBoZWFkZXIgZmlsZS4KKyAqIEF1dGhvcjogIFYuIEsuIEthbmRhcnBhCisgKiBEYXRlOiAgICAwMS8yOS8yMDAyCisgKgorICogSGlzdG9yeTotCisgKiBEYXRlICAgICBNb2RpZmllZCBieSAgICAgICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworIyBpZm5kZWYgX19TWVNTVEFSVFVQX0gKKyMgZGVmaW5lIF9fU1lTU1RBUlRVUF9ICisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsRGF0YVN0cnVjdC5oIgorI2VuZGlmCisjaW5jbHVkZSAic2lyUGFyYW1zLmgiCisKKy8qIERlZmluZXMgKi8KKworLyogRnVuY3Rpb24gKi8KKworZXh0ZXJuIHZvaWQgc3lzTUFDQ2xlYW51cCh2b2lkICopOworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKK2V4dGVybiB2b2lkIHN5c0JidFByb2Nlc3NNZXNzYWdlKCB0SGFsSGFuZGxlIGhIYWwsIHRwSGFsQnVmRGVzYyBwQkQgKTsKKyNlbmRpZgorZXh0ZXJuIHRTaXJSZXRTdGF0dXMgc3lzQmJ0UHJvY2Vzc01lc3NhZ2VDb3JlKHN0cnVjdCBzQW5pU2lyR2xvYmFsICosIHRwU2lyTXNnUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIsIHRBTklfVTMyKTsKKworCisjIGVuZGlmIC8qIF9fU1lTU1RBUlRVUF9IICovCmRpZmYgLS1naXQgYS9DT1JFL1NZUy9sZWdhY3kvc3JjL3N5c3RlbS9zcmMvbWFjSW5pdEFwaS5jIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy9zeXN0ZW0vc3JjL21hY0luaXRBcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE2NDhhCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy9zeXN0ZW0vc3JjL21hY0luaXRBcGkuYwpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIG1hY0luaXRBcGkuYyAtIFRoaXMgZmlsZSBoYXMgYWxsIHRoZSBtYWMgbGV2ZWwgaW5pdCBmdW5jdGlvbnMKKyAqICAgICAgICAgICAgICAgICAgIGZvciBhbGwgdGhlIGRlZmluZWQgdGhyZWFkcyBhdCBzeXN0ZW0gbGV2ZWwuCisgKiBBdXRob3I6ICAgIERpbmVzaCBVcGFkaHlheQorICogRGF0ZTogICAgICAwNC8yMy8yMDA3CisgKiBIaXN0b3J5Oi0KKyAqIERhdGU6IDA0LzA4LzIwMDggICAgICAgTW9kaWZpZWQgYnk6IFNhbnRvc2ggTWFuZGlnYW5hbAorICogTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uOiBDb2RlIHRvIGFsbG9jYXRlIGFuZCBmcmVlIHRoZSAgbWVtb3J5IGZvciBEdW1wVGFibGUgZW50cnkuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworLyogU3RhbmRhcmQgaW5jbHVkZSBmaWxlcyAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKworLyogQXBwbGljYXRpb24gU3BlY2lmaWMgaW5jbHVkZSBmaWxlcyAqLworI2luY2x1ZGUgImhhbEludGVybmFsLmgiCisjaW5jbHVkZSAiaGFsSGRkQXBpcy5oIgorI2luY2x1ZGUgImhhbERlYnVnLmgiCisjaW5jbHVkZSAiaGFsTVRVLmgiCisjaW5jbHVkZSAiaGFsUnhwLmgiCisjaW5jbHVkZSAiaGFsUGh5QXBpLmgiCisKKy8vI2lmZGVmIEFOSV9PU19UWVBFX0xJTlVYCisjaW5jbHVkZSAiaGFsQ29tbW9uQXBpLmgiICAgLy8gaGFsQ2xlYW51cAorI2VuZGlmCisjaW5jbHVkZSAiY2ZnQXBpLmgiICAgICAgICAgLy8gY2ZnQ2xlYW51cAorI2luY2x1ZGUgImxpbUFwaS5oIiAgICAgICAgIC8vIGxpbUNsZWFudXAKKyNpbmNsdWRlICJzaXJUeXBlcy5oIgorI2luY2x1ZGUgInN5c0RlYnVnLmgiCisjaW5jbHVkZSAic3lzRW50cnlGdW5jLmgiCisjaW5jbHVkZSAibWFjSW5pdEFwaS5oIgorI2lmIGRlZmluZWQoQU5JX0xPR0RVTVApCisjaW5jbHVkZSAibG9nRHVtcC5oIgorI2VuZGlmIC8vI2lmIGRlZmluZWQoQU5JX0xPR0RVTVApCisKKyNpZmRlZiBUUkFDRV9SRUNPUkQKKyNpbmNsdWRlICJtYWNUcmFjZS5oIgorI2VuZGlmCisKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGhhbERvQ2ZnSW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKTsKK2V4dGVybiB0U2lyUmV0U3RhdHVzIGhhbFByb2Nlc3NTdGFydEV2ZW50KHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisKKworCit0U2lyUmV0U3RhdHVzIG1hY1Jlc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHJjKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQwordFNpclJldFN0YXR1cyBtYWNQcmVTdGFydCh0SGFsSGFuZGxlIGhIYWwpCit7CisgICB0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgIHRBTklfQk9PTEVBTiBtZW1BbGxvY0ZhaWxlZCA9IGVBTklfQk9PTEVBTl9GQUxTRTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpIGhIYWw7CisgICB0QU5JX1U4IGk7CisKKyAgIGZvcihpPTA7IGk8TUFYX0RVTVBfVEFCTEVfRU5UUlk7IGkrKykKKyAgIHsKKyAgICAgIGlmKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICgodm9pZCAqKSZwTWFjLT5kdW1wVGFibGVFbnRyeVtpXSksIHNpemVvZih0RHVtcE1vZHVsZUVudHJ5KSkKKyAgICAgICAgICAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgeworICAgICAgICAgbWVtQWxsb2NGYWlsZWQgPSBlQU5JX0JPT0xFQU5fVFJVRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5kdW1wVGFibGVFbnRyeVtpXSwgc2l6ZW9mKHRTaXJNYk1zZykpOworICAgICAgfQorICAgfQorICAgaWYoIG1lbUFsbG9jRmFpbGVkICkKKyAgIHsKKyAgICAgIHdoaWxlKGk+MCkKKyAgICAgIHsKKyAgICAgICAgIGktLTsKKyAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYywgcE1hYy0+ZHVtcFRhYmxlRW50cnlbaV0pOworICAgICAgfQorICAgICAgc3lzTG9nKHBNYWMsIExPR0UsIEZMKCJwTWFjLT5kdW1wVGFibGVFbnRyeSBpcyBOVUxMXG4iKSk7CisgICAgICBzdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisgICB9CisKKyNpZiBkZWZpbmVkKEFOSV9MT0dEVU1QKQorICAgLy9sb2dEdW1wSW5pdCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG1vZHVsZSBzdGFydHMKKyAgIGxvZ0R1bXBJbml0KHBNYWMpOworI2VuZGlmIC8vI2lmIGRlZmluZWQoQU5JX0xPR0RVTVApCisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKK3RTaXJSZXRTdGF0dXMgbWFjU3RhcnQodEhhbEhhbmRsZSBoSGFsLCB2b2lkKiBwSGFsTWFjU3RhcnRQYXJhbXMpCit7CisgICB0U2lyUmV0U3RhdHVzIHN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpIGhIYWw7CisKKyAgIGlmIChOVUxMID09IHBNYWMpCisgICB7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgc3RhdHVzID0gZVNJUl9GQUlMVVJFOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgcE1hYy0+Z0RyaXZlclR5cGUgPSAoKHRIYWxNYWNTdGFydFBhcmFtZXRlcnMqKXBIYWxNYWNTdGFydFBhcmFtcyktPmRyaXZlclR5cGU7CisKKyAgIHN5c0xvZyhwTWFjLCBMT0cyLCBGTCgiY2FsbGVkXG4iKSk7CisKKyAgIGRvCisgICB7CisKKyNpZiBkZWZpbmVkKFRSQUNFX1JFQ09SRCkKKyAgICAgIC8vRW5hYmxlIFRyYWNpbmcKKyAgICAgIG1hY1RyYWNlSW5pdChwTWFjKTsKKyNlbmRpZgorCisgICAgICBpZiAoIUhBTF9TVEFUVVNfU1VDQ0VTUyhwYWxBbGxvY2F0ZU1lbW9yeShwTWFjLT5oSGRkLCAoKHZvaWQgKikmcE1hYy0+cFJlc2V0TXNnKSwgc2l6ZW9mKHRTaXJNYk1zZykpKSkKKyAgICAgIHsKKyAgICAgICAgIHN5c0xvZyhwTWFjLCBMT0dFLCBGTCgicE1hYy0+cFJlc2V0TXNnIGlzIE5VTExcbiIpKTsKKyAgICAgICAgIHN0YXR1cyA9IGVTSVJfRkFJTFVSRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgcGFsWmVyb01lbW9yeShwTWFjLT5oSGRkLCBwTWFjLT5wUmVzZXRNc2csIHNpemVvZih0U2lyTWJNc2cpKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBNYWMtPmdEcml2ZXJUeXBlICE9IGVEUklWRVJfVFlQRV9NRkcpCisgICAgICB7CisgICAgICAgICBzdGF0dXMgPSBwZVN0YXJ0KHBNYWMpOworICAgICAgfQorCisgICB9IHdoaWxlKDApOworICAgcE1hYy0+c3lzLmFib3J0ID0gZmFsc2U7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbHNlIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLwordFNpclJldFN0YXR1cyBtYWNTdGFydCh0SGFsSGFuZGxlIGhIYWwsIHZvaWQqIHBIYWxNYWNTdGFydFBhcmFtcykKK3sKKyAgICB0QU5JX1U4IGk7CisgICAgdFNpclJldFN0YXR1cyBzdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisgICAgZUhhbFN0YXR1cyAgICAgICAgICAgICBoYWxTdGF0dXM7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgaEhhbDsKKyAgICB0QU5JX0JPT0xFQU4gbWVtQWxsb2NGYWlsZWQgPSBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICBpZihOVUxMID09IHBNYWMpCisgICAgeworICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICBzdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcE1hYy0+Z0RyaXZlclR5cGUgPSAoKHRIYWxNYWNTdGFydFBhcmFtZXRlcnMgKilwSGFsTWFjU3RhcnRQYXJhbXMpLT5kcml2ZXJUeXBlOworCisgICAgc3lzTG9nKHBNYWMsIExPRzIsIEZMKCJjYWxsZWRcbiIpKTsKKworICAgIGRvCisgICAgeworICAgICAgICBmb3IoaT0wOyBpPE1BWF9EVU1QX1RBQkxFX0VOVFJZOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICgodm9pZCAqKikmcE1hYy0+ZHVtcFRhYmxlRW50cnlbaV0pLCBzaXplb2YodER1bXBNb2R1bGVFbnRyeSkpCisgICAgICAgICAgICAgICAgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1BbGxvY0ZhaWxlZCA9IGVBTklfQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgcE1hYy0+ZHVtcFRhYmxlRW50cnlbaV0sIHNpemVvZih0U2lyTWJNc2cpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggbWVtQWxsb2NGYWlsZWQgKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZShpPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYywgcE1hYy0+ZHVtcFRhYmxlRW50cnlbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3lzTG9nKHBNYWMsIExPR0UsIEZMKCJwTWFjLT5kdW1wVGFibGVFbnRyeSBpcyBOVUxMXG4iKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZiBkZWZpbmVkKEFOSV9MT0dEVU1QKQorICAgICAgICAgICAgbG9nRHVtcEluaXQocE1hYyk7CisjZW5kaWYgLy8jaWYgZGVmaW5lZChBTklfTE9HRFVNUCkKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChUUkFDRV9SRUNPUkQpCisgICAgICAgIC8vRW5hYmxlIFRyYWNpbmcKKyAgICAgICAgbWFjVHJhY2VJbml0KHBNYWMpOworI2VuZGlmCisgICAgICAgIGlmICghSEFMX1NUQVRVU19TVUNDRVNTKHBhbEFsbG9jYXRlTWVtb3J5KHBNYWMtPmhIZGQsICgodm9pZCAqKikmcE1hYy0+cFJlc2V0TXNnKSwgc2l6ZW9mKHRTaXJNYk1zZykpKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3lzTG9nKHBNYWMsIExPR0UsIEZMKCJwTWFjLT5wUmVzZXRNc2cgaXMgTlVMTFxuIikpOworICAgICAgICAgICAgc3RhdHVzID0gZVNJUl9GQUlMVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPnBSZXNldE1zZywgc2l6ZW9mKHRTaXJNYk1zZykpOworICAgICAgICB9CisKKyAgICAgICAgaGFsU3RhdHVzID0gaGFsU3RhcnQoaEhhbCwgKHRIYWxNYWNTdGFydFBhcmFtZXRlcnMqKXBIYWxNYWNTdGFydFBhcmFtcyApOworCisgICAgICAgIGlmICggIUhBTF9TVEFUVVNfU1VDQ0VTUyhoYWxTdGF0dXMpICkKKyAgICAgICAgeworICAgICAgICAgICAgc3lzTG9nKHBNYWMsTE9HRSwgRkwoImhhbFN0YXJ0IGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgPSAlZFxuIiksIGhhbFN0YXR1cyk7CisgICAgICAgICAgICBzdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihwTWFjLT5nRHJpdmVyVHlwZSAhPSBlRFJJVkVSX1RZUEVfTUZHKQorICAgICAgICB7CisgICAgICAgICAgICBwZVN0YXJ0KHBNYWMpOworICAgICAgICB9CisKKyAgICB9d2hpbGUoMCk7CisgICAgcE1hYy0+c3lzLmFib3J0ID0gZmFsc2U7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIG1hY1N0b3AKK1xicmllZiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZyb20gSEREIHRvIHN0b3AgTUFDLiBUaGlzIGZ1bmN0aW9uIHdpbGwgc3RvcCBhbGwgdGhlIG1hYyBtb2R1bGVzLgorXCAgICAgICBtZW1vcnkgd2l0aCBnbG9iYWwgY29udGV4dCB3aWxsIG9ubHkgYmUgaW5pdGlhbGl6ZWQgbm90IGZyZWVkIGhlcmUuCitccGFyYW0gICB0SGFsSGFuZGxlIGhIYWwKK1xwYXJhbSB0SGFsU3RvcFR5cGUKK1xyZXR1cm4gdFNpclJldFN0YXR1cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordFNpclJldFN0YXR1cyBtYWNTdG9wKHRIYWxIYW5kbGUgaEhhbCwgdEhhbFN0b3BUeXBlIHN0b3BUeXBlKQoreworICAgIHRBTklfVTggaTsKKyAgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKSBoSGFsOworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICBoYWxTdG9wKGhIYWwsIHN0b3BUeXBlKTsKKyNlbmRpZgorICAgIHBlU3RvcChwTWFjKTsKKyAgICBjZmdDbGVhbnVwKCBwTWFjICk7CisgICAgLy8gbmVlZCB0byBmcmVlIG1lbW9yeSBpZiBub3QgY2FsbGVkIGluIHJlc2V0IGNvbnRleHQuCisgICAgLy8gaW4gcmVzZXQgY29udGV4dCB0aGlzIG1lbW9yeSB3aWxsIGJlIGZyZWVkIGJ5IEhERC4KKyAgICBpZihmYWxzZSA9PSBwTWFjLT5zeXMuYWJvcnQpCisgICAgeworICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBNYWMtPnBSZXNldE1zZyk7CisgICAgICAgIHBNYWMtPnBSZXNldE1zZyA9IE5VTEw7CisgICAgfQorICAgIC8qIEZyZWUgdGhlIER1bXBUYWJsZUVudHJ5ICovCisgICAgZm9yKGk9MDsgaTxNQVhfRFVNUF9UQUJMRV9FTlRSWTsgaSsrKQorICAgIHsKKyAgICAgICAgcGFsRnJlZU1lbW9yeShwTWFjLCBwTWFjLT5kdW1wVGFibGVFbnRyeVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xmbiBtYWNPcGVuCitcYnJpZWYgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgaW5pdC4gVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlIHRvIGFsbG9jYXRlIGFsbCB0aGUKK1wgICAgICAgbWVtb3J5IHdpdGggdGhlIGdsb2JhbCBjb250ZXh0IHdpbGwgYmUgYWxsb2NhdGVkIGhlcmUuCitccGFyYW0gICB0SGFsSGFuZGxlIHBIYWxIYW5kbGUKK1xwYXJhbSAgIHRIZGRIYW5kbGUgaEhkZAorXHBhcmFtICAgdEhhbE9wZW5QYXJhbWV0ZXJzKiBwSGFsT3BlblBhcmFtcworXHJldHVybiB0U2lyUmV0U3RhdHVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzIG1hY09wZW4odEhhbEhhbmRsZSAqcEhhbEhhbmRsZSwgdEhkZEhhbmRsZSBoSGRkLCB0TWFjT3BlblBhcmFtZXRlcnMgKnBNYWNPcGVuUGFybXMpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9IE5VTEw7CisKKyAgICBpZihwSGFsSGFuZGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvKgorICAgICAqIE1ha2Ugc3VyZSB0aGlzIGFkYXB0ZXIgaXMgbm90IGFscmVhZHkgb3BlbmVkLiAoQ29tcGFyZSBwQWRhcHRvciBwb2ludGVyIGluIGFscmVhZHkKKyAgICAgKiBhbGxvY2F0ZWQgcE1hYyBzdHJ1Y3R1cmVzLikKKyAgICAgKiBJZiBpdCBpcyBvcGVuZWQganVzdCByZXR1cm4gcG9pbnRlciB0byBwcmV2aW91c2x5IGFsbG9jYXRlZCBwTWFjIHBvaW50ZXIuCisgICAgICogT3Igc2hvdWxkIHRoaXMgcmVzdWx0IGluIGVycm9yPworICAgICAqLworCisgICAgLyogQWxsb2NhdGUgcE1hYyAqLworICAgIGlmIChwYWxBbGxvY2F0ZU1lbW9yeShoSGRkLCAoKHZvaWQgKiopJnBNYWMpLCBzaXplb2YodEFuaVNpckdsb2JhbCkpICE9IGVIQUxfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBwTWFjIHN0cnVjdHVyZSAqLworICAgIHBhbFplcm9NZW1vcnkoaEhkZCwgcE1hYywgc2l6ZW9mKHRBbmlTaXJHbG9iYWwpKTsKKworICAgIC8qKiBTdG9yZSB0aGUgRHJpdmVyIHR5cGUgaW4gcE1hYyBHbG9iYWwuKi8KKyAgICAvL3BNYWMtPmdEcml2ZXJUeXBlID0gcE1hY09wZW5QYXJtcy0+ZHJpdmVyVHlwZTsKKworI2lmbmRlZiBHRU42X09OV0FSRFMKKyNpZmRlZiBSVEw4NjUyCisgICAgeworICAgICAgICAvL0xldmVyYWdlIDg2NTFjJ3Mgb24tY2hpcCBkYXRhIHNjcmF0Y2hwYWQgbWVtb3J5IHRvIGxvY2sgYWxsIEhBTCBEeEUgZGF0YSB0aGVyZQorICAgICAgICBleHRlcm4gdm9pZCAqIHJ0bGdsdWVfYWxsb2NfZGF0YV9zY3JhdGNocGFkX21lbW9yeSh1bnNpZ25lZCBpbnQgc2l6ZSwgY2hhciAqKTsKKyAgICAgICAgcE1hYy0+aGFsLnBIYWxEeGUgPSAodHBBbmlIYWxEeGUpIHJ0bGdsdWVfYWxsb2NfZGF0YV9zY3JhdGNocGFkX21lbW9yeShzaXplb2YodEFuaUhhbER4ZSksICAiaGFsRHhlIik7CisgICAgfQorICAgIGlmKHBNYWMtPmhhbC5wSGFsRHhlKXsKKyAgICAgICAgOworICAgIH1lbHNlCisjZW5kaWYKKyAgICAvKiBBbGxvY2F0ZSBIYWxEeGUgKi8KKyAgICBpZiAocGFsQWxsb2NhdGVNZW1vcnkoaEhkZCwgKCh2b2lkICoqKSZwTWFjLT5oYWwucEhhbER4ZSksIHNpemVvZih0QW5pSGFsRHhlKSkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyl7CisgICAgICAgIHBhbEZyZWVNZW1vcnkoaEhkZCwgcE1hYyk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIC8qIEluaXRpYWxpemUgdGhlIEhhbER4ZSBzdHJ1Y3R1cmUgKi8KKyAgICBwYWxaZXJvTWVtb3J5KGhIZGQsIHBNYWMtPmhhbC5wSGFsRHhlLCBzaXplb2YodEFuaUhhbER4ZSkpOworI2VuZGlmIC8vR0VONl9PTldBUkRTCisKKyAgICAvKgorICAgICAqIFNldCB2YXJpb3VzIGdsb2JhbCBmaWVsZHMgb2YgcE1hYyBoZXJlCisgICAgICogKENvdWxkIGJlIHBsYXRmb3JtIGRlcGVuZGFudCBhcyBzb21lIHZhcmlhYmxlcyBpbiBwTWFjIGFyZSBwbGF0Zm9ybQorICAgICAqIGRlcGVuZGFudCkKKyAgICAgKi8KKyAgICBwTWFjLT5oSGRkICAgICAgPSBoSGRkOworICAgIHBNYWMtPnBBZGFwdGVyICA9IGhIZGQ7IC8vVGhpcyBsaW5lIHdpbCBiZSByZW1vdmVkCisgICAgKnBIYWxIYW5kbGUgICAgID0gKHRIYWxIYW5kbGUpcE1hYzsKKworICAgIHsKKyAgICAgICAgLyogQ2FsbCB2YXJpb3VzIFBFIChhbmQgb3RoZXIgbGF5ZXIgaW5pdCBoZXJlKSAqLworICAgICAgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBsb2dJbml0KHBNYWMpKQorICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICAgICAgCisgICAgICAgIC8qIENhbGwgcm91dGluZSB0byBpbml0aWFsaXplIENGRyBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSBjZmdJbml0KHBNYWMpICkKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisKKyAgICAgICAgc3lzSW5pdEdsb2JhbHMocE1hYyk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgICAgIC8vIFRoaXMgZGVjaWRlcyB3aGV0aGVyIEhXIG5lZWRzIHRvIHRyYW5zbGF0ZSB0aGUgODAyLjMgZnJhbWVzCisgICAgICAgIC8vIGZyb20gdGhlIGhvc3QgT1MgdG8gdGhlIDgwMi4xMSBmcmFtZXMuIFdoZW4gc2V0IEhXIGRvZXMgdGhlCisgICAgICAgIC8vIHRyYW5zbGF0aW9uIGZyb20gODAyLjMgdG8gODAyLjExIGFuZCB2aWNlIHZlcnNhCisgICAgICAgIGlmKHBNYWNPcGVuUGFybXMtPmZyYW1lVHJhbnNSZXF1aXJlZCkgeworICAgICAgICAgICAgcE1hYy0+aGFsLmhhbE1hYy5mcmFtZVRyYW5zRW5hYmxlZCA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwTWFjLT5oYWwuaGFsTWFjLmZyYW1lVHJhbnNFbmFibGVkID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLy9OZWVkIHRvIGRvIGl0IGhlcmUgaW4gY2FzZSBoYWxPcGVuIGZhaWxzIGxhdGVyIG9uLgorI2lmIGRlZmluZWQoIFZPU1NfRU5BQkxFRCApCisgICAgICAgIHR4X3Zvc3Nfd3JhcHBlcl9pbml0KHBNYWMsIGhIZGQpOworI2VuZGlmCisgICAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgIGlmIChlSEFMX1NUQVRVU19TVUNDRVNTICE9IGhhbE9wZW4ocE1hYywgcEhhbEhhbmRsZSwgaEhkZCwgcE1hY09wZW5QYXJtcykpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisjZW5kaWYKKworICAgIHJldHVybiBwZU9wZW4ocE1hYywgcE1hY09wZW5QYXJtcyk7Cit9CisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZm4gbWFjQ2xvc2UKK1xicmllZiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluIHNodXRkb3duIHNlcXVlbmNlIGZyb20gSERELiBBbGwgdGhlCitcICAgICAgIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCBnbG9iYWwgY29udGV4dCB3aWxsIGJlIGZyZWVkIGhlcmUuCitccGFyYW0gICB0cEFuaVNpckdsb2JhbCBwTWFjCitccmV0dXJuIG5vbmUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3RTaXJSZXRTdGF0dXMgbWFjQ2xvc2UodEhhbEhhbmRsZSBoSGFsKQoreworCisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCkgaEhhbDsKKworI2lmbmRlZiBHRU42X09OV0FSRFMKKyAgICBpZihwTWFjLT5oYWwucEhhbER4ZSl7CisjaWZkZWYgUlRMODY1MgorICAgICAgICBleHRlcm4gdm9pZCAqIHJ0bGdsdWVfaXNfZGF0YV9zY3JhdGNocGFkX21lbW9yeSh2b2lkICopOworICAgICAgICBpZihydGxnbHVlX2lzX2RhdGFfc2NyYXRjaHBhZF9tZW1vcnkocE1hYy0+aGFsLnBIYWxEeGUpKQorICAgICAgICAgICAgOworICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHBhbEZyZWVNZW1vcnkocE1hYywgcE1hYy0+aGFsLnBIYWxEeGUpOworICAgIH0KKyNlbmRpZiAvL0dFTjZfT05XQVJEUworCisgICAgcGVDbG9zZShwTWFjKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgaGFsQ2xvc2UoaEhhbCk7CisjZW5kaWYKKworICAgIC8qIENhbGwgcm91dGluZSB0byBmcmVlLXVwIGFsbCBDRkcgZGF0YSBzdHJ1Y3R1cmVzICovCisgICAgY2ZnRGVJbml0KHBNYWMpOworCisgICAgbG9nRGVpbml0KHBNYWMpOworCisgICAgLy8gRmluYWxseSwgZGUtYWxsb2NhdGUgdGhlIGdsb2JhbCBNQUMgZGF0YXN0cnVjdHVyZToKKyAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCBwTWFjICk7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZuIG1hY1Jlc2V0CitcYnJpZWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBSZXNldCBtZXNzYWdlIHRvIEhERC4gVGhlbiBIREQgd2lsbCBzdGFydCB0aGUgcmVzZXQgcHJvY2Vzcy4KK1xwYXJhbSAgIHRwQW5pU2lyR2xvYmFsIHBNYWMKK1xwYXJhbSAgIHRBTklfVTMyIHJjCitccmV0dXJuICAgIHRTaXJSZXRTdGF0dXMuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0U2lyUmV0U3RhdHVzIG1hY1Jlc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHJjKQoreworICAgIHRTaXJSZXRTdGF0dXMgc3RhdHVzID0gZVNJUl9TVUNDRVNTOworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICBpZihlSEFMX1NUQVRVU19TVUNDRVNTICE9IGhhbFJlc2V0KCh0SGFsSGFuZGxlKXBNYWMsIHJjKSkKKyAgICAgICAgICBzdGF0dXMgPSBlU0lSX0ZBSUxVUkU7CisjZWxzZQorICAgIHN5c0xvZyhwTWFjLCBMT0dFLCBGTCgiKioqKioqKioqKioqKk5vLW9wLiBOZWVkIHRvIGNhbGwgV0RBIHJlc2V0IGZ1bmN0aW9uIFxuIikpOworI2VuZGlmCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBtYWNTeXNSZXNldFJlcQorICoKKyAqIEZVTkNUSU9OOgorICogICBBbGwgTUFDIG1vZHVsZXMgdXNlIHRoaXMgaW50ZXJmYWNlIGluIGNhc2Ugb2YgYW4gZXhjZXB0aW9uLgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSB0cEFuaVNpckdsb2JhbCBNQUMgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSB0QU5JX1UzMiByZXNldCByZWFzb24gY29kZQorICogQHJldHVybiB0QU5JX1UxNiAtIHJldHVycyB0aGUgc3RhdHVzLgorICovCisKK3ZvaWQKK21hY1N5c1Jlc2V0UmVxKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHJjKQoreworICAgIHN5c0xvZyhwTWFjLCBMT0dFLCBGTCgiUmVhc29uIENvZGUgPSAweCVYXG4iKSxyYyk7CisKKyAgICBzd2l0Y2ggKHJjKQorICAgIHsKKyAgICAgICAgY2FzZSBlU0lSX1NUT1BfQlNTOgorICAgICAgICBjYXNlIGVTSVJfU01FX0JTU19SRVNUQVJUOgorICAgICAgICBjYXNlIGVTSVJfUkFESU9fSFdfU1dJVENIX1NUQVRVU19JU19PRkY6CisgICAgICAgIGNhc2UgZVNJUl9DRkJfRkxBR19TVFVDS19FWENFUFRJT046CisgICAgICAgICAgICAgICAgLy8gRklYTUUKKyAgICAgICAgICAgICAgICAvL21hY1Jlc2V0KHBNYWMsIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVTSVJfRU9GX1NPRl9FWENFUFRJT046CisgICAgICAgIGNhc2UgZVNJUl9CTVVfRVhDRVBUSU9OOgorICAgICAgICBjYXNlIGVTSVJfQ1BfRVhDRVBUSU9OOgorICAgICAgICBjYXNlIGVTSVJfTE9XX1BEVV9FWENFUFRJT046CisgICAgICAgIGNhc2UgZVNJUl9VU0VSX1RSSUdfUkVTRVQ6CisgICAgICAgIGNhc2UgZVNJUl9BSEJfSEFOR19FWENFUFRJT046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgbWFjUmVzZXQocE1hYywgcmMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogbWFjU3lzUmVzZXRSZXFGcm9tSERECisgKgorICogRlVOQ1RJT046CisgKiAgIFRoaXMgcmVzZXQgZnVuY3Rpb24gZ2V0cyBpbnZva2VkIGZyb20gdGhlIEhERCB0byByZXF1ZXN0IGEgcmVzZXQuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHRwQW5pU2lyR2xvYmFsIE1BQyBwYXJhbWV0ZXJzIHN0cnVjdHVyZQorICogQHJldHVybiB0QU5JX1UxNiAtIHJldHVycyB0aGUgc3RhdHVzLgorICovCisKK3ZvaWQKK21hY1N5c1Jlc2V0UmVxRnJvbUhERCh2b2lkICpwTWFjLCB0QU5JX1UzMiByYykKK3sKKyAgICBtYWNTeXNSZXNldFJlcSggKHRwQW5pU2lyR2xvYmFsKXBNYWMsIHJjICk7Cit9CisKZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvc3lzdGVtL3NyYy9zeXNFbnRyeUZ1bmMuYyBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvc3lzdGVtL3NyYy9zeXNFbnRyeUZ1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTIxNWUyCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy9zeXN0ZW0vc3JjL3N5c0VudHJ5RnVuYy5jCkBAIC0wLDAgKzEsNzMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHN5c0VudHJ5RnVuYy5jYyAtIFRoaXMgZmlsZSBoYXMgYWxsIHRoZSBzeXN0ZW0gbGV2ZWwgZW50cnkgZnVuY3Rpb25zCisgKiAgICAgICAgICAgICAgICAgICBmb3IgYWxsIHRoZSBkZWZpbmVkIHRocmVhZHMgYXQgc3lzdGVtIGxldmVsLgorICogQXV0aG9yOiAgICBWLiBLLiBLYW5kYXJwYQorICogRGF0ZTogICAgICAwMS8xNi8yMDAyCisgKiBIaXN0b3J5Oi0KKyAqIERhdGUgICAgICAgTW9kaWZpZWQgYnkgICAgICAgICAgICBNb2RpZmljYXRpb24gSW5mb3JtYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisvKiBTdGFuZGFyZCBpbmNsdWRlIGZpbGVzICovCisKKy8qIEFwcGxpY2F0aW9uIFNwZWNpZmljIGluY2x1ZGUgZmlsZXMgKi8KKyNpbmNsdWRlICJzaXJDb21tb24uaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKworCisjaW5jbHVkZSAibGltQXBpLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJwbW1BcGkuaCIKKworI2luY2x1ZGUgInN5c0RlYnVnLmgiCisjaW5jbHVkZSAic3lzRGVmLmgiCisjaW5jbHVkZSAic3lzRW50cnlGdW5jLmgiCisjaW5jbHVkZSAic3lzU3RhcnR1cC5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxNYWNTZWN1cml0eUFwaS5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltVHJhY2UuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGEuaCIKKworI2lmbmRlZiBXTEFOX0ZUTV9TVFVCCit0U2lyUmV0U3RhdHVzCitwb3N0UFRUTXNnQXBpKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKTsKKyNlbmRpZgorCisjaWZkZWYgVk9TU19FTkFCTEVECisjaW5jbHVkZSAidm9zX3R5cGVzLmgiCisjaW5jbHVkZSAidm9zX3BhY2tldC5oIgorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzeXNJbml0R2xvYmFscworICoKKyAqIEZVTkNUSU9OOgorICogICAgSW5pdGlhbGl6ZXMgc3lzdGVtIGxldmVsIGdsb2JhbCBwYXJhbWV0ZXJzCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gdHBBbmlTaXJHbG9iYWwgU2lyaXVzIHNvZnR3YXJlIHBhcmFtZXRlciBzdHJ1Y3QgcG9pbnRlcgorICogQHJldHVybiBOb25lCisgKi8KKwordFNpclJldFN0YXR1cworc3lzSW5pdEdsb2JhbHModHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKworICAgIHBhbFplcm9NZW1vcnkocE1hYy0+aEhkZCwgKHRBTklfVTggKikgJnBNYWMtPnN5cywgc2l6ZW9mKHBNYWMtPnN5cykpOworCisjaWYgZGVmaW5lZChBTklfREVCVUcpCisgICAgLy9GSVhNRSA6IHJpZ2h0IG5vdyB3ZSB3YW50IHRoZSByZXNldCB0byBoYXBwZW4gZXZlbiBpbiBkaWFnIGRlYnVnIGJ1aWxkLgorICAgIC8vIGxhdGVyIG9uIHdlIG5lZWQgdG8gc2V0IHRoaXMgdG8gdHJ1ZS4KKyAgICAvL3BNYWMtPnN5cy5kZWJ1Z09uUmVzZXQgPSB0cnVlOworICAgIHBNYWMtPnN5cy5kZWJ1Z09uUmVzZXQgPSBmYWxzZTsKKyNlbHNlCisgICAgcE1hYy0+c3lzLmRlYnVnT25SZXNldCA9IGZhbHNlOworI2VuZGlmCisKKyAgICBwTWFjLT5zeXMuZ1N5c0VuYWJsZVNjYW5Nb2RlICAgICAgICA9IDE7CisgICAgcE1hYy0+c3lzLmdTeXNFbmFibGVMaW5rTW9uaXRvck1vZGUgPSAwOworICAgIHBNYWMtPnN5cy5mVGVzdFJhZGFyICAgICAgICAgICAgICAgID0gZmFsc2U7CisgICAgcE1hYy0+c3lzLnJhZGFyRGV0ZWN0ZWQgICAgICAgICAgICAgPSBmYWxzZTsKKyAgICBwTWFjLT5zeXMuZ1N5c2Ryb3BMaW1Qa3RzICAgICAgICAgICA9IGZhbHNlOworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICBpZihlSEFMX1NUQVRVU19TVUNDRVNTICE9IGhhbEdsb2JhbEluaXQocE1hYykpCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisjZW5kaWYKKyAgICBzY2hJbml0R2xvYmFscyhwTWFjKTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHN5c0lzTGVhcm5TY2FuTW9kZUZyYW1lCisgKgorICogRlVOQ1RJT046CisgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgcmVjZWl2ZWQgZnJhbWUgd2FzIHJlY2VpdmVkIGluIGxlYXJuL3NjYW4gbW9kZQorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBGcmFtZQorICogQHJldHVybiB0cnVlIGlmIGZyYW1lIHdhcyByZWNlaXZlZCBpbiBsZWFybi9zY2FuIG1vZGUKKyAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGlubGluZSB0QU5JX1U4CitzeXNJc0xlYXJuU2Nhbk1vZGVGcmFtZSh0cEhhbEJ1ZkRlc2MgcEJkKQoreworICAgIGlmKCBTSVJfTUFDX0JEX1RPX1NDQU5fTEVBUk4ocEJkKSApCisgICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorI2VuZGlmCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc3lzQmJ0UHJvY2Vzc01lc3NhZ2VDb3JlCisgKgorICogRlVOQ1RJT046CisgKiBQcm9jZXNzIEJCVCBtZXNzYWdlcworICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHRwQW5pU2lyR2xvYmFsIEEgcG9pbnRlciB0byBNQUMgcGFyYW1zIGluc3RhbmNlCisgKiBAcGFyYW0gcE1zZyBtZXNzYWdlIHBvaW50ZXIKKyAqIEBwYXJhbSB0QU5JX1UzMiB0eXBlCisgKiBAcGFyYW0gdEFOSV9VMzIgc3ViIHR5cGUKKyAqIEByZXR1cm4gTm9uZQorICovCit0U2lyUmV0U3RhdHVzCitzeXNCYnRQcm9jZXNzTWVzc2FnZUNvcmUodHBBbmlTaXJHbG9iYWwgcE1hYywgdHBTaXJNc2dRIHBNc2csIHRBTklfVTMyIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgc3ViVHlwZSkKK3sKKyAgICB0U2lyUmV0U3RhdHVzIHJldDsKKyAgICB2b2lkKiAgICAgICAgIHBCZDsKKyAgICB0TWdtdEZybURyb3BSZWFzb24gZHJvcFJlYXNvbjsKKyAgICB2b3NfcGt0X3QgICpwVm9zUGt0ID0gKHZvc19wa3RfdCAqKXBNc2ctPmJvZHlwdHI7CisgICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0KKyAgICAgICAgICAgICAgV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHBWb3NQa3QsICh2X1BWT0lEX3QgKikmcEJkLCBWT1NfRkFMU0UgKTsKKyAgICBwTWFjLT5zeXMuZ1N5c0JidFJlY2VpdmVkKys7CisKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCisgICAgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgUEVMT0dXKHN5c0xvZyhwTWFjLCBMT0dXLCBGTCgiUnggTWdtdCBGcmFtZSBTdWJ0eXBlOiAlZFxuIiksIHN1YlR5cGUpOworICAgIHNpckR1bXBCdWYocE1hYywgU0lSX1NZU19NT0RVTEVfSUQsIExPR1csICh0QU5JX1U4ICopV0RBX0dFVF9SWF9NQUNfSEVBREVSKHBCZCksIFdEQV9HRVRfUlhfTVBEVV9MRU4ocEJkKSk7CisgICAgc2lyRHVtcEJ1ZihwTWFjLCBTSVJfU1lTX01PRFVMRV9JRCwgTE9HVywgV0RBX0dFVF9SWF9NUERVX0RBVEEocEJkKSwgV0RBX0dFVF9SWF9QQVlMT0FEX0xFTihwQmQpKTspCisKKyAgICBwTWFjLT5zeXMuZ1N5c0ZyYW1lQ291bnRbdHlwZV1bc3ViVHlwZV0rKzsKKworICAgIGlmKHR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKQorICAgIHsKKworICAgICAgICAgICAgaWYoIChkcm9wUmVhc29uID0gbGltSXNQa3RDYW5kaWRhdGVGb3JEcm9wKHBNYWMsIHBCZCwgc3ViVHlwZSkpICE9IGVNR01UX0RST1BfTk9fRFJPUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQRUxPRzEoc3lzTG9nKHBNYWMsIExPRzEsIEZMKCJNZ210IEZyYW1lICVkIGJlaW5nIGRyb3BwZWQsIHJlYXNvbjogJWRcbiIpLCBzdWJUeXBlLCBkcm9wUmVhc29uKTspCisgICAgICAgICAgICAgICAgTVRSQUNFKG1hY1RyYWNlKHBNYWMsICAgVFJBQ0VfQ09ERV9SWF9NR01UX0RST1AsIDAsIGRyb3BSZWFzb24pOykKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1Bvc3QgdGhlIG1lc3NhZ2UgdG8gUEUgUXVldWUKKyAgICAgICAgICAgIHJldCA9ICh0U2lyUmV0U3RhdHVzKSBsaW1Qb3N0TXNnQXBpKHBNYWMsIHBNc2cpOworICAgICAgICAgICAgaWYgKHJldCAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEVMT0dFKHN5c0xvZyhwTWFjLCBMT0dFLCBGTCgicG9zdGluZyB0byBMSU0yIGZhaWxlZCwgcmV0ICVkXG4iKSwgcmV0KTspCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE1hYy0+c3lzLmdTeXNCYnRQb3N0ZWRUb0xpbSsrOworICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisgICAgZWxzZSBpZiAodHlwZSA9PSBTSVJfTUFDX0RBVEFfRlJBTUUpCisgICAgeworICAgICAgICBQRUxPR1coc3lzTG9nKHBNYWMsIExPR1csIEZMKCJJQVBQIEZyYW1lLi4uXG4iKSk7KTsKKyAgICAgICAgLy9Qb3N0IHRoZSBtZXNzYWdlIHRvIFBFIFF1ZXVlCisgICAgICAgIHJldCA9ICh0U2lyUmV0U3RhdHVzKSBsaW1Qb3N0TXNnQXBpKHBNYWMsIHBNc2cpOworICAgICAgICBpZiAocmV0ICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgUEVMT0dFKHN5c0xvZyhwTWFjLCBMT0dFLCBGTCgicG9zdGluZyB0byBMSU0yIGZhaWxlZCwgcmV0ICVkXG4iKSwgcmV0KTspCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgcE1hYy0+c3lzLmdTeXNCYnRQb3N0ZWRUb0xpbSsrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBFTE9HRShzeXNMb2cocE1hYywgTE9HRSwgIkJCVCByZWNlaXZlZCBJbnZhbGlkIHR5cGUgJWQgc3ViVHlwZSAlZCAiCisgICAgICAgICAgICAgICAgICAgIkxJTSBzdGF0ZSAlWC4gQkQgZHVtcCBpczpcbiIsCisgICAgICAgICAgICAgICAgICAgdHlwZSwgc3ViVHlwZSwgbGltR2V0U21lU3RhdGUocE1hYykpOworICAgICAgICBzaXJEdW1wQnVmKHBNYWMsIFNJUl9TWVNfTU9EVUxFX0lELCBMT0dFLAorICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCAqKSBwQmQsIFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUpOykKKworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworZmFpbDoKKworICAgIHBNYWMtPnN5cy5nU3lzQmJ0RHJvcHBlZCsrOworICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7Cit9CisKKwordm9pZCBzeXNMb2codHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHJpbmcsLi4uKQoreworICAgIC8vIFZlcmlmeSBhZ2FpbnN0IGN1cnJlbnQgbG9nIGxldmVsCisgICAgaWYgKCBsb2dsZXZlbCA+IHBNYWMtPnV0aWxzLmdMb2dEYmdMZXZlbFtMT0dfSU5ERVhfRk9SX01PRFVMRSggU0lSX1NZU19NT0RVTEVfSUQgKV0gKQorICAgICAgICByZXR1cm47CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmFfbGlzdCBtYXJrZXI7CisKKyAgICAgICAgdmFfc3RhcnQoIG1hcmtlciwgcFN0cmluZyApOyAgICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZSBhcmd1bWVudHMuICovCisKKyAgICAgICAgbG9nRGVidWcocE1hYywgU0lSX1NZU19NT0RVTEVfSUQsIGxvZ2xldmVsLCBwU3RyaW5nLCBtYXJrZXIpOworCisgICAgICAgIHZhX2VuZCggbWFya2VyICk7ICAgICAgICAgICAgICAvKiBSZXNldCB2YXJpYWJsZSBhcmd1bWVudHMuICAgICAgKi8KKyAgICB9Cit9CisKKworCisjaWYgZGVmaW5lZCggQU5JX09TX1RZUEVfV0lORE9XUyApCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc3lzQmJ0UHJvY2Vzc01lc3NhZ2UKKyAqCisgKiBGVU5DVElPTjoKKyAqICAgIFByb2Nlc3MgQkJUIG1lc3NhZ2VzCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICogTk9URToKKyAqCisgKiBAcGFyYW0gcEJEIEJ1ZmZlciBkZXNjcmlwdG9yIHBvaW50ZXIKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIHN5c0JidFByb2Nlc3NNZXNzYWdlKCB0SGFsSGFuZGxlIGhIYWwsIHZvaWQgKnBCRCApCit7CisgICAgdHBBbmlTaXJHbG9iYWwgIHBNYWMgPSBQTUFDX1NUUlVDVCggaEhhbCApOworICAgIHRwU2lyTWFjTWdtdEhkciBtSGRyOworICAgIHRTaXJNc2dRICAgICAgICBtc2c7CisKKyAgICAvLworICAgIC8vICBUaGUgTVBEVSBoZWFkZXIgaXMgbm93IHByZXNlbnQgYXQgYSBjZXJ0YWluICJvZmZzZXQiIGluCisgICAgLy8gdGhlIEJEIGFuZCBpcyBzcGVjaWZpZWQgaW4gdGhlIEJEIGl0c2VsZgorICAgIC8vCisgICAgbUhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihwQkQpOworCisgICAgLy8gRHVtcCByZWNlaXZlZCBwYWNrZXQKKyAgICAvKgorICAgIGlmKHBCRC0+c3dCZFR5cGUgIT0gU01BQ19TV0JEX1RZUEVfQ1RMTVNHKQorICAgICAgICBzeXNMb2coIHBNYWMsIExPRzMsCisgICAgICAgICAgICBGTCggIiVzOiBSWCBNZXNnIFR5cGUgJWQsIHN1YlR5cGUgJWQsIE1QRFUgTGVuICVkLCBSWFAgRmxhZ3MgMHgleFxuIiApLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgbUhkci0+ZmMudHlwZSwKKyAgICAgICAgICAgIG1IZHItPmZjLnN1YlR5cGUsCisgICAgICAgICAgICBwQkQtPm1wZHVMZW5ndGgsCisgICAgICAgICAgICBwQkQtPnJ4cEZsYWdzICk7CisgICAgKi8KKyAgICAvL3NpckR1bXBCdWYocE1hYywgU0lSX1NZU19NT0RVTEVfSUQsIExPR1csIFNJUl9NQUNfQkRfVE9fTVBEVURBVEEocEJEKSwgU0lSX01BQ19CRF9UT19QQVlMT0FEX0xFTihwQkQpKTsKKworICAgIC8vIEZvcndhcmQgdG8gTUFDIHZpYSBtZXNnID0gU0lSX0JCX1hQT1JUX01HTVRfTVNHCisgICAgbXNnLnR5cGUgPSBTSVJfQkJfWFBPUlRfTUdNVF9NU0c7CisgICAgbXNnLmJvZHlwdHIgPSBwQkQ7CisgICAgbXNnLmJvZHl2YWwgPSAwOworCisgICAgaWYoIGVTSVJfU1VDQ0VTUyAhPSBzeXNCYnRQcm9jZXNzTWVzc2FnZUNvcmUoIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZHItPmZjLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZHItPmZjLnN1YlR5cGUgKSkKKyAgICB7CisgICAgICAgIHN5c0xvZyggcE1hYywgTE9HVywKKyAgICAgICAgICAgICAgICBGTCAoICJzeXNCYnRQcm9jZXNzTWVzc2FnZUNvcmUgZmFpbGVkIHRvIHByb2Nlc3MgU0lSX0JCX1hQT1JUX01HTVRfTVNHXG4iICkpOworCisgICAgICAgIC8vIFRPRE8gLSBXaWxsIHRoZSBjYWxsZXIgKEhERCkgZnJlZSB0aGUgcmVjZWl2ZWQgcGFja2V0PworICAgIH0KK30KKyNlbmRpZiAvLyAjaWYgZGVmaW5lZCggQU5JX09TX1RZUEVfV0lORE9XUyApCisKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX1JUQUlfTElOVVgpCisjaWZuZGVmIFdMQU5fRlRNX1NUVUIKKyNpbmNsdWRlICJwdHRNb2R1bGVBcGkuaCIKKyNlbmRpZiAvLyBlRFJJVkVSX1RZUEVfTUZHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzeXNNbWhFbnRyeQorICoKKyAqIEZVTkNUSU9OOgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGR1bW15IER1bW15IHBhcmFtZXRlcgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK3N5c01taEVudHJ5KHRBTklfVTMyIGR1bW15KQoreworICAgIHRTaXJNYk1zZyAgKnBNYk1zZzsKKyAgICB0U2lyTXNnUSAgICBtc2c7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKKworICAgIHBNYWMgPSBnZXRQTWFjKCk7CisKKyAgICBzeXNMb2cocE1hYywgTE9HNCwgIk1NSCB0YXNrIHN0YXJ0ZWRcbiIpOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICAvLyBCbG9ja3Mgd2FpdGluZyBmb3IgbWVzc2FnZXMgZnJvbSBIREQKKworICAgICAgICB0eF9xdWV1ZV9yZWNlaXZlKCZwTWFjLT5zeXMuZ1NpclR4TXNnUSwgKHZvaWQqKSZwTWJNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgVFhfV0FJVF9GT1JFVkVSKTsKKyAgICAgICAgLy8gQ29tcG9zZSBpbnRlci1tb2R1bGUgbWVzc2FnZSBhbmQgc2VuZCBpdCBvZmYgdG8gdGhlIHJlY2VpdmVyCisgICAgICAgIG1zZy50eXBlID0gc2lyUmVhZFUxNk4oKHRBTklfVTgqKSYocE1iTXNnLT50eXBlKSk7CisgICAgICAgIG1zZy5ib2R5cHRyID0gcE1iTXNnOworICAgICAgICBtc2cuYm9keXZhbCA9IDA7CisgICAgICAgIHN5c0xvZyhwTWFjLCBMT0c0LCAiPE1NSD4gSEREIG1lc3NhZ2UgcmVjZWl2ZWQgaWQ9MHgleFxuIiwgbXNnLnR5cGUpOworICAgICAgICBpZiAocE1hYy0+c3lzLmFib3J0PT0xKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobXNnLnR5cGU9PWVXTklfU01FX1NUT1BfQlNTX1JFUSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXJTdG9yZVUxNk4oKHRBTklfVTgqKSgmKHBNYk1zZy0+dHlwZSkpLCBlV05JX1NNRV9TVE9QX0JTU19SU1ApOworICAgICAgICAgICAgICAgIHBNYk1zZy0+ZGF0YVswXSA9IDA7CisgICAgICAgICAgICAgICAgaGFsTW1oUG9zdE1zZ0FwaShwTWFjLCAmbXNnLCAgZVBST1QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBmcmVlIGJ1ZmZlciwgYnV0IG9ubHkgaWYgaXQgaXMgYW4gc2tidWZmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobXNnLnR5cGUgJiAweEZGMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU0lSX0hBTF9NU0dfVFlQRVNfQkVHSU46CisgICAgICAgICAgICAgICAgaWYgKGhhbFBvc3RNc2dBcGkocE1hYywgJm1zZykgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICBzeXNMb2cocE1hYywgTE9HUCwgInN5c01taEVudHJ5OiBoYWxQb3N0TXNnQXBpIEZhaWxlZCFcbiIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5c0xvZyhwTWFjLCBMT0c0LCAiPE1NSD4gTWVzc2FnZSBmb3J3YXJkZWQgdG8gSEFMXG4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTSVJfTElNX01TR19UWVBFU19CRUdJTjoKKyAgICAgICAgICAgICAgICBsaW1Qb3N0TXNnQXBpKHBNYWMsICZtc2cpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNJUl9NTlRfTVNHX1RZUEVTX0JFR0lOOgorCisgICAgICAgICAgICAgICAgaWYgKGhhbE1udFBvc3RNc2dBcGkocE1hYywgJm1zZykgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICBzeXNMb2cocE1hYywgTE9HUCwgInN5c01taEVudHJ5OiBoYWxNbnRQb3N0TXNnQXBpIEZhaWxlZCFcbiIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5c0xvZyhwTWFjLCBMT0c0LCAiPE1NSD4gTWVzc2FnZSBmb3J3YXJkZWQgdG8gTU5UIHR5cGUgKCVYKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy50eXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTSVJfUE1NX01TR19UWVBFU19CRUdJTjoKKworICAgICAgICAgICAgICAgIC8vIFNoYWxsIGhhdmUgaXRzIEFQSSBjYWxsIGhlcmU7IE9uY2UgQVBJIGlzIGFkZGVkLCByZW1vdmUgdGhlCisgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIHJlbGVhc2UgbWVtb3J5IGNhbGwuCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU0lSX0NGR19NU0dfVFlQRVNfQkVHSU46CisKKyAgICAgICAgICAgICAgICBpZiAoaGFsTW50UG9zdE1zZ0FwaShwTWFjLCAmbXNnKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHN5c0xvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c01taEVudHJ5OiBjZmcgbXNnOiBoYWxNbnRQb3N0TXNnQXBpIEZhaWxlZCFcbiIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5c0xvZyhwTWFjLCBMT0c0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c01taEVudHJ5OiBjZmcgbXNnOiBoYWxNbnRQb3N0TXNnQXBpIVxuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZm5kZWYgV0xBTl9GVE1fU1RVQgorICAgICAgICAgICAgY2FzZSBQVFRfTVNHX1RZUEVTX0JFR0lOXzMwOiAvKlBUVF9NU0dfVFlQRVNfQkVHSU46Ki8KKyAgICAgICAgICAgIGNhc2UgUFRUX01TR19UWVBFU19CRUdJTl8zMToKKyAgICAgICAgICAgIGNhc2UgUFRUX01TR19UWVBFU19CRUdJTl8zMjoKKyAgICAgICAgICAgICAgICBpZiAocG9zdFBUVE1zZ0FwaShwTWFjLCAmbXNnKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHN5c0xvZyhwTWFjLCBMT0dQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c01taEVudHJ5OiBSRCBtc2c6IHBvc3RQVFRNc2dBcGkgRmFpbGVkIVxuIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3lzTG9nKHBNYWMsIExPRzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzTW1oRW50cnk6IFJEIG1zZzogcG9zdFBUVE1zZ0FwaSFcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN5c0xvZyhwTWFjLCBMT0dXLCAic3lzTW1oRW50cnkgVW5rbm93biBkZXN0aW5hdGlvbiBcbiIpOworICAgICAgICAgICAgICAgIC8vIFVua25vd24gZGVzdGluYXRpb24uICBKdXN0IGRyb3AgaXQKKyAgICAgICAgICAgICAgICBwYWxGcmVlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCopcE1iTXNnKTsKKyAgICAgICAgfQorICAgIH0KKworfSAvKioqIHN5c01taEVudHJ5KCkgKioqLworCisjZW5kaWYgLy8gI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfUlRBSV9MSU5VWCkKKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfTElOVVgpIHx8IGRlZmluZWQoQU5JX09TX1RZUEVfT1NYKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc3lzU2NoRW50cnkKKyAqCisgKiBGVU5DVElPTjoKKyAqICAgICAgICAgU0NIIHRocmVhZCBlbnRyeSBmdW5jdGlvbi4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBkdW1teSBBdCBwcmVzZW50IHRoZXJlIGlzIG5vIG5lZWQgb2YgYW55IGVudHJ5IGlucHV0LiBEZWZhdWx0PTAKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitzeXNTY2hFbnRyeSh0QU5JX1UzMiBpKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWM7CisgICAgcE1hYyA9IGdldFBNYWMoKTsKKyAgICB3aGlsZSAoMSkKK3sKKyAgICAgICAgc2NoUHJvY2Vzc01lc3NhZ2VRdWV1ZShwTWFjKTsKKyAgICB9Cit9IC8vIHN5c1NjaEVudHJ5KCkKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc3lzUG1tRW50cnkKKyAqCisgKiBGVU5DVElPTjoKKyAqICAgICAgICAgUE1NIHRocmVhZCBlbnRyeSBmdW5jdGlvbi4KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBkdW1teSBBdCBwcmVzZW50IHRoZXJlIGlzIG5vIG5lZWQgb2YgYW55IGVudHJ5IGlucHV0LiBEZWZhdWx0PTAKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkCitzeXNQbW1FbnRyeSh0QU5JX1UzMiBpKQoreworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWM7CisgICAgcE1hYyA9IGdldFBNYWMoKTsKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIHBtbVByb2Nlc3NNZXNzYWdlUXVldWUocE1hYyk7CisgICAgfQorfSAvLyBzeXNQbW1FbnRyeSgpCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHN5c0xpbUVudHJ5CisgKgorICogRlVOQ1RJT046CisgKiAgIExJTSB0aHJlYWQgZW50cnkgcG9pbnQKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGR1bW15IER1bW15IHBhcmFtZXRlcgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorc3lzTGltRW50cnkodEFOSV9VMzIgZHVtbXkpCit7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKKyAgICBwTWFjID0gZ2V0UE1hYygpOworICAgIGxpbUluaXRpYWxpemUocE1hYyk7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGxpbVByb2Nlc3NNZXNzYWdlUXVldWUocE1hYyk7CisgICAgfSAvLyB3aGlsZSgxKQorfSAvLyBsaW1FbnRyeSgpCisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc3lzTW50RW50cnkKKyAqCisgKiBGVU5DVElPTjoKKyAqICAgIE1OVCB0aHJlYWQgZW50cnkgcG9pbnQKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIGR1bW15IER1bW15IHBhcmFtZXRlcgorICogQHJldHVybiBOb25lCisgKi8KKwordm9pZAorc3lzTW50RW50cnkodEFOSV9VMzIgZHVtbXkpCit7CisgICAgdEFOSV9VMzIgICAgICBzdGF0dXM7CisgICAgdFNpck1zZ1EgbXNnOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWM7CisgICAgcE1hYyA9IGdldFBNYWMoKTsKKyAgICBzeXNMb2cocE1hYywgTE9HNCwgIjxNTlQ+IE1OVCB0YXNrIHN0YXJ0ZWRcbiIpOworCisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9SVEFJX0xJTlVYKQorICAgIHRBTklfVTMyICAgICAgaW50ZXJ2YWw7CisgICAgaW50ZXJ2YWwgPSBTWVNfTU5UX0lOVEVSVkFMICogU1lTX1RJQ0tTX1BFUl9TRUNPTkQ7CisjZW5kaWYKKworICAgIHdoaWxlICgxKQorICAgIHsKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX1JUQUlfTElOVVgpCisgICAgICAgIHN0YXR1cyA9IHR4X3F1ZXVlX3JlY2VpdmUoJnBNYWMtPnN5cy5nU2lyTW50TXNnUSwgJm1zZywgaW50ZXJ2YWwpOworI2Vsc2UKKyAgICAgICAgc3RhdHVzID0gdHhfcXVldWVfcmVjZWl2ZSgmcE1hYy0+c3lzLmdTaXJNbnRNc2dRLCAmbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX1dBSVRfRk9SRVZFUik7CisjZW5kaWYKKworICAgICAgICAvLyB0aGlzIHJvdXRpbmUgb25seSBkZXF1ZXVlcyB0aGUgbWVzc2FnZSBmcm9tIHF1ZXVlCisgICAgICAgIC8vIHByb2Nlc3NpbmcgaXMgZG9uZSBieSBzeXNNbnRQcm9jZXNzTXNnCisgICAgICAgIGlmIChzdGF0dXMgPT0gVFhfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhhbE1udFByb2Nlc3NNc2dzKHBNYWMsICZtc2cpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeXNMb2cocE1hYywgTE9HUCwgInN5c01udEVudHJ5OiBoYWxNbnRQcm9jZXNzTXNncyBjYWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCFcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSAvLyBzeXNNbnRFbnRyeSgpCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBzeXNIYWxFbnRyeQorICoKKyAqIEZVTkNUSU9OOgorICogICBIQUwgdGhyZWFkIGVudHJ5IHBvaW50CisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSBkdW1teSBEdW1teSBwYXJhbWV0ZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKK3ZvaWQKK3N5c0hhbEVudHJ5KHRBTklfVTMyIGR1bW15KQoreworICAgIHRBTklfVTMyIHN0YXR1czsKKyAgICB0U2lyTXNnUSBtc2c7CisgICAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKKworICAgIHBNYWMgPSBnZXRQTWFjKCk7CisgICAgc3lzTG9nKHBNYWMsIExPRzQsICI8SEFMPiBIQUwgdGFzayBzdGFydGVkXG4iKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKworICAgICAgICBzdGF0dXMgPSB0eF9xdWV1ZV9yZWNlaXZlKCZwTWFjLT5zeXMuZ1NpckhhbE1zZ1EsICZtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfV0FJVF9GT1JFVkVSKTsKKyAgICAgICAgLy8gdGhpcyByb3V0aW5lIG9ubHkgZGVxdWV1ZXMgdGhlIG1lc3NhZ2UgZnJvbSBxdWV1ZQorICAgICAgICBpZiAoc3RhdHVzID09IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoYWxQcm9jZXNzTXNnKHBNYWMsICZtc2cpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeXNMb2cocE1hYywgTE9HUCwgInN5c0hhbEVudHJ5OiBoYWxQcm9jZXNzTXNnUSBjYWxsIGZhaWxlZCFcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvLyB3aGlsZSgxKQorfSAvLyBzeXNIYWxFbnRyeQorCisjaWZuZGVmIFdMQU5fRlRNX1NUVUIKKyNpbmNsdWRlICJwdHRNb2R1bGVBcGkuaCIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAgKiBzeXNOaW1QdHRFbnRyeQorICAqCisgICogRlVOQ1RJT046CisgICogICBOSU0gUFRUIHRocmVhZCBlbnRyeSBwb2ludAorICAqIExPR0lDOgorICAqCisgICogQVNTVU1QVElPTlM6CisgICoKKyAgKiBOT1RFOgorICAqCisgICogQHBhcmFtIGR1bW15IER1bW15IHBhcmFtZXRlcgorICAqIEByZXR1cm4gTm9uZQorICAqLworCit2b2lkCitzeXNOaW1QdHRFbnRyeSh0QU5JX1UzMiBkdW1teSkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXM7CisgICAgdFNpck1zZ1EgbXNnOworICAgIHRwQW5pU2lyR2xvYmFsIHBNYWM7CisgICAgcE1hYyA9IGdldFBNYWMoKTsKKworICAgIHN5c0xvZyhwTWFjLCBMT0dXLCAiPE5JTT4gUFRUIHRhc2sgc3RhcnRlZFxuIik7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHR4X3F1ZXVlX3JlY2VpdmUoJnBNYWMtPnN5cy5nU2lyTmltUkRNc2dRLCAmbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX1dBSVRfRk9SRVZFUik7CisKKyAgICAgICAgLy8gdGhpcyByb3V0aW5lIG9ubHkgZGVxdWV1ZXMgdGhlIG1lc3NhZ2UgZnJvbSBxdWV1ZQorICAgICAgICBpZiAoc3RhdHVzID09IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0dFByb2Nlc3NNc2cocE1hYywgKHRQdHRNc2didWZmZXIgKiltc2cuYm9keXB0cik7CisgICAgICAgICAgICAvL1RPRE86IHRoZSByZXNvbnNlIGlzIG5vdyBwYWNrYWdlZCBpbiAoKHRQdHRNc2didWZmZXIgKikmbXNnLT5ib2R5KS0+bXNnUmVzcG9uc2UgYW5kIG5lZWRzIHRvIGJlIHNlbnQgYmFjayB0byB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgfQorICAgICB9IC8vIHdoaWxlKDEpCit9IC8vIHN5c05pbVB0dEVudHJ5CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIHBvc3RQVFRNc2dBcGkKKyAqCisgKiBGVU5DVElPTjoKKyAqICAgICBQb3N0cyBOSU0gbWVzc2FnZXMgdG8gZ05JTSB0aHJlYWQKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzpwbAorICoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSB0cEFuaVNpckdsb2JhbCBNQUMgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnIHBvaW50ZXIgd2l0aCBtZXNzYWdlCisgKiBAcmV0dXJuIFN1Y2Nlc3Mgb3IgRmFpbHVyZQorICovCisKK3RTaXJSZXRTdGF0dXMKK3Bvc3RQVFRNc2dBcGkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKnBNc2cpCit7CisgICAgdFNpclJldFN0YXR1cyByYyA9IGVTSVJfU1VDQ0VTUzsKKyAgICB0UHR0TXNnYnVmZmVyICpwUHR0TXNnOworICAgIGVQdHRNc2dJZCBtc2dJZDsKKyAgICB1UHR0TXNncyAqbXNnQm9keTsKKyAgICB0QU5JX1U4ICpwUmVxID0gKHRBTklfVTgqKSBwTXNnLT5ib2R5cHRyOworCisgICAgcFB0dE1zZyA9ICh0UHR0TXNnYnVmZmVyICopcFJlcTsKKyNpZiAoZGVmaW5lZChBTklfT1NfVFlQRV9SVEFJX0xJTlVYKSAmJiBkZWZpbmVkKEFOSV9MSVRUTEVfQllURV9FTkRJQU4pKQorICAgIHBQdHRNc2ctPm1zZ0lkID0gc2lyUmVhZFUxNk4oKHRBTklfVTggKikmKHBQdHRNc2ctPm1zZ0lkKSk7CisjZW5kaWYKKyAgICBtc2dJZCA9IChlUHR0TXNnSWQpKHBQdHRNc2ctPm1zZ0lkKTsKKyAgICBtc2dCb2R5ID0gKHVQdHRNc2dzICopJihwUHR0TXNnLT5tc2dCb2R5KTsKKyAgICBkbworICAgIHsKKyNpZiBkZWZpbmVkIEFOSV9PU19UWVBFX0xJTlVYIHx8IGRlZmluZWQgQU5JX09TX1RZUEVfT1NYCisgICAgICAgIC8vIFBvc3RzIG1lc3NhZ2UgdG8gdGhlIHF1ZXVlCisgICAgICAgIGlmICh0eF9xdWV1ZV9zZW5kKCZwTWFjLT5zeXMuZ1NpckhhbE1zZ1EsIHBNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX05PX1dBSVQpICE9IFRYX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gZVNJUl9GQUlMVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIC8vIEZvciBXaW5kb3dzIGJhc2VkIE1BQywgaW5zdGVhZCBvZiBwb3N0aW5nIG1lc3NhZ2UgdG8gZGlmZmVyZW50CisgICAgICAgIC8vIHF1ZXVlcywgd2Ugd2lsbCBjYWxsIHRoZSBoYW5kbGVyIHJvdXRpbmVzIGRpcmVjdGx5CisKKyAgICAgICAgLy9wdHRQcm9jZXNzTXNnKHBNYWMsIHBNc2cpOworICAgICAgICByYyA9IGVTSVJfU1VDQ0VTUzsKKyNlbmRpZgorICAgIH0KKyAgICB3aGlsZSAoMCk7CisKKyAgICByZXR1cm4gcmM7Cit9IC8vIHBvc3RQVFRNc2dBcGkoKQorCisKKyNlbmRpZiAvLyBlRFJJVkVSX1RZUEVfTUZHCisKKyNlbmRpZiAvLyAjaWYgZGVmaW5lZCBBTklfT1NfVFlQRV9MSU5VWCB8fCBkZWZpbmVkIEFOSV9PU19UWVBFX09TWAorCmRpZmYgLS1naXQgYS9DT1JFL1NZUy9sZWdhY3kvc3JjL3N5c3RlbS9zcmMvc3lzV2luU3RhcnR1cC5jIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy9zeXN0ZW0vc3JjL3N5c1dpblN0YXJ0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QxNGI4Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy9zeXN0ZW0vc3JjL3N5c1dpblN0YXJ0dXAuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworCisvKgorICoKKyAqIEFpcmdvIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBzeXNXaW5TdGFydHVwLmNwcDogU3lzdGVtIHN0YXJ0dXAgZmlsZSBmb3IgV2luZG93cyBwbGF0Zm9ybS4KKyAqIEF1dGhvcjogICAgICAgICBSYWplc2ggQmhhZ3dhdAorICogRGF0ZTogICAgICAgICAgIDExLzAxLzAyCisgKiBIaXN0b3J5Oi0KKyAqIDExLzAxLzAyICAgICAgICBDcmVhdGVkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2luY2x1ZGUgImxpbUFwaS5oIgorCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKyNpbmNsdWRlICJzeXNFbnRyeUZ1bmMuaCIKKyNpbmNsdWRlICJzeXNTdGFydHVwLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisKKy8vIFJvdXRpbmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgV2lud3JhcHBlciBjb250ZXh0IHBvaW50ZXIgZnJvbSB0aGUgcE1hYyBzdHJ1Y3R1cmUKK2V4dGVybiB0cEFuaVNpclR4V3JhcHBlciBzeXNHZXRUeFdyYXBwZXJDb250ZXh0KHZvaWQgKik7CisKKwordHBBbmlTaXJUeFdyYXBwZXIKK3N5c0dldFR4V3JhcHBlckNvbnRleHQodm9pZCAqcE1hYykKK3sKKyAgICByZXR1cm4gJigodHBBbmlTaXJHbG9iYWwpKHBNYWMpKS0+dHhXcmFwcGVyOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9pbmMvZG90MTFmZGVmcy5oIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9pbmMvZG90MTFmZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NWM5NjcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3V0aWxzL2luYy9kb3QxMWZkZWZzLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgRE9UMTFGREVGU19IXzgyQTdCNzJFX0MzNkNfNDY1RF84MkE3XzEzOUVBNTMyMjU4MgorI2RlZmluZSBET1QxMUZERUZTX0hfODJBN0I3MkVfQzM2Q180NjVEXzgyQTdfMTM5RUE1MzIyNTgyCisvKioKKyAqIFxmaWxlIGRvdDExZmRlZnMuaAorICoKKyAqIFxicmllZiBDIGRlZmluZXMgY3VzdG9taXppbmcgb3VyIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUKKyAqCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBaXJnbyBOZXR3b3JrcywgSW5jb3Jwb3JhdGVkCisgKgorICogJ2ZyYW1lc2MnIGdlbmVyYXRlcyBjb2RlIHdyaXR0ZW4gaW4gdGVybXMgb2YgYSBudW1iZXIgb2YgbWFjcm9zCisgKiBpbnRlbmRlZCBmb3IgY3VzdG9taXphdGlvbi4KKyAqCisgKgorICovCisKKyNpbmNsdWRlICJwYXJzZXJBcGkuaCIKKworLy8gVGhpcyBjb250cm9scyBob3cgdGhlICJkb3QxMWYiIGNvZGUgY29waWVzIG1lbW9yeQorI2RlZmluZSBET1QxMUZfTUVNQ1BZKGN0eCwgZHN0LCBzcmMsIGxlbikgXAorICAgIHBhbENvcHlNZW1vcnkoICggY3R4ICktPmhIZGQsICggdEFOSV9VOCogKSggZHN0ICksICggdEFOSV9VOCogKSggc3JjICksICggbGVuICkgKQorCisvLyBUaGlzIGNvbnRyb2xzIGhvdyB0aGUgImRvdDExZiIgY29kZSBjb21wYXJlcyBtZW1vcnkKKyNkZWZpbmUgRE9UMTFGX01FTUNNUChjdHgsIGxocywgcmhzLCBsZW4pIFwKKyAgICAoICEgcGFsRXF1YWxNZW1vcnkoICggY3R4ICktPmhIZGQsICggdEFOSV9VOCogKSggbGhzICksICggdEFOSV9VOCogKSggcmhzICksICggbGVuICkgKSApCisKKyMgICBpZiBkZWZpbmVkICggREJHICkgJiYgKCBEQkcgIT0gMCApCisKKyMgICAgICAgLy9kZWZpbmUgRE9UMTFGX0VOQUJMRV9MT0dHSU5HCisjICAgICAgIC8vZGVmaW5lIERPVDExRl9EVU1QX0ZSQU1FUworIyAgICAgICBkZWZpbmUgRE9UMTFGX0xPR19HQVRFICggNCApCisjICAgICAgIGRlZmluZSBGUkFNRVNfU0VWX0ZPUl9GUkFNRShjdHgsIHNpZykgXAorICAgICAgICAgICAgKCBET1QxMUZfQVNTT0NSRVFVRVNUID09IChzaWcpID8gMyA6IDUgKQorCisgICAgICAgICNpZiBkZWZpbmVkKCBET1QxMUZfRU5BQkxFX0xPR0dJTkcgKQorCisjICAgICAgIGRlZmluZSBET1QxMUZfSEFWRV9MT0dfTUFDUk9TCisKKyMgICAgICAgZGVmaW5lIEZSQU1FU19MT0cwKGN0eCwgc2V2LCBmbXQpIFwKKyAgICAgICAgICAgIGRvdDExZkxvZygoY3R4KSwgKHNldiksIChmbXQpKTsKKworIyAgICAgICBkZWZpbmUgRlJBTUVTX0xPRzEoY3R4LCBzZXYsIGZtdCwgcDEpIFwKKyAgICAgICAgICAgIGRvdDExZkxvZygoY3R4KSwgKHNldiksIChmbXQpLCAocDEpKTsKKworIyAgICAgICBkZWZpbmUgRlJBTUVTX0xPRzIoY3R4LCBzZXYsIGZtdCwgcDEsIHAyKSBcCisgICAgICAgICAgICBkb3QxMWZMb2coKGN0eCksIChzZXYpLCAoZm10KSwgKHAxKSwgKHAyKSk7CisKKyMgICAgICAgZGVmaW5lIEZSQU1FU19MT0czKGN0eCwgc2V2LCBmbXQsIHAxLCBwMiwgcDMpIFwKKyAgICAgICAgICAgIGRvdDExZkxvZygoY3R4KSwgKHNldiksIChmbXQpLCAocDEpLCAocDIpLCAocDMpKTsKKworIyAgICAgICBkZWZpbmUgRlJBTUVTX0RVTVAoY3R4LCBzZXYsIHAsIG4pIFwKKyAgICAgICAgICAgIHNpckR1bXBCdWYoKHBDdHgpLCBTSVJfREJHX01PRFVMRV9JRCwgKHNldiksIChwKSwgKG4pKTsKKworICAgICAgICAjZW5kaWYgLy8jaWYgZGVmaW5lZCggRE9UMTFGX0VOQUJMRV9MT0dHSU5HICkKKworIyAgIGVsc2UKKworIyAgICAgICB1bmRlZiBET1QxMUZfRU5BQkxFX0xPR0dJTkcKKyMgICAgICAgdW5kZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisjICAgICAgIGRlZmluZSBET1QxMUZfTE9HX0dBVEUgKCAxICkKKworIyAgIGVuZGlmCisKKworLy8gI2RlZmluZSBET1QxMUZfRU5BQkxFX0RCR19CUkVBSyAoIDEgKQorCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBmaWxsLWNvbHVtbjogNzIKKy8vIGluZGVudC10YWJzLW1vZGU6IG5pbAorLy8gc2hvdy10cmFpbGluZy13aGl0ZXNwYWNlOiB0CisvLyBFbmQ6CisKKyNlbmRpZiAvLyBET1QxMUZERUZTX0hfODJBN0I3MkVfQzM2Q180NjVEXzgyQTdfMTM5RUE1MzIyNTgyCmRpZmYgLS1naXQgYS9DT1JFL1NZUy9sZWdhY3kvc3JjL3V0aWxzL2luYy91dGlsc1BhcnNlci5oIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9pbmMvdXRpbHNQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWMyOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9pbmMvdXRpbHNQYXJzZXIuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHV0aWxzUGFyc2VyLmggY29udGFpbnMgdGhlIHV0aWxpdHkgZnVuY3Rpb24gcHJvdG9zCisgKiB1c2VkIGludGVybmFsbHkgYnkgdGhlIHBhcnNlcgorICogQXV0aG9yOiAgICAgICAgQ2hhbmRyYSBNb2R1bXVkaQorICogRGF0ZTogICAgICAgICAgMDIvMTEvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2lmbmRlZiBfX1VUSUxTX1BBUlNFX0hfXworI2RlZmluZSBfX1VUSUxTX1BBUlNFX0hfXworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAiZG90MTFmLmgiCisjaW5jbHVkZSAidXRpbHNBcGkuaCIKKwordm9pZCAgICAgICAgICBDb252ZXJ0U1NJRCAgICAgICAgICAgKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjU1NpZCosICAgICAgICAgICAgICAgdERvdDExZklFU1NJRCopOwordm9pZCAgICAgICAgICBDb252ZXJ0U3VwcFJhdGVzICAgICAgKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjUmF0ZVNldCosICAgICAgICAgICAgdERvdDExZklFU3VwcFJhdGVzKik7Cit2b2lkICAgICAgICAgIENvbnZlcnRFeHRTdXBwUmF0ZXMgICAodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNSYXRlU2V0KiwgICAgICAgICAgICB0RG90MTFmSUVFeHRTdXBwUmF0ZXMqKTsKK3ZvaWQgICAgICAgICAgQ29udmVydFFPU0NhcHMgICAgICAgICh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1Fvc0NhcGFiaWxpdHlJRSosICAgIHREb3QxMWZJRVFPU0NhcHNBcCopOwordm9pZCAgICAgICAgICBDb252ZXJ0UU9TQ2Fwc1N0YXRpb24gKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjUW9zQ2FwYWJpbGl0eVN0YUlFKiwgdERvdDExZklFUU9TQ2Fwc1N0YXRpb24qKTsKK3RTaXJSZXRTdGF0dXMgQ29udmVydFdQQSAgICAgICAgICAgICh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1dwYUluZm8qLCAgICAgICAgICAgIHREb3QxMWZJRVdQQSopOwordFNpclJldFN0YXR1cyBDb252ZXJ0V1BBT3BhcXVlICAgICAgKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjV3BhSW5mbyosICAgICAgICAgICAgdERvdDExZklFV1BBT3BhcXVlKik7Cit0U2lyUmV0U3RhdHVzIENvbnZlcnRSU04gICAgICAgICAgICAodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNSc25JbmZvKiwgICAgICAgICAgICB0RG90MTFmSUVSU04qKTsKK3RTaXJSZXRTdGF0dXMgQ29udmVydFJTTk9wYXF1ZSAgICAgICh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1JzbkluZm8qLCAgICAgICAgICAgIHREb3QxMWZJRVJTTk9wYXF1ZSopOwordm9pZCAgICAgICAgICBDb252ZXJ0UG93ZXJDYXBzICAgICAgKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjUG93ZXJDYXBhYmlsaXR5SUUqLCAgdERvdDExZklFUG93ZXJDYXBzKik7Cit2b2lkICAgICAgICAgIENvbnZlcnRTdXBwQ2hhbm5lbHMgICAodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNTdXBwb3J0ZWRDaGFubmVsSUUqLCB0RG90MTFmSUVTdXBwQ2hhbm5lbHMqKTsKK3ZvaWQgICAgICAgICAgQ29udmVydENGUGFyYW1zICAgICAgICh0cEFuaVNpckdsb2JhbCwgdFNpck1hY0NmUGFyYW1TZXQqLCAgICAgICAgIHREb3QxMWZJRUNGUGFyYW1zKik7Cit2b2lkICAgICAgICAgIENvbnZlcnRUSU0gICAgICAgICAgICAodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNUaW0qLCAgICAgICAgICAgICAgICB0RG90MTFmSUVUSU0qKTsKK3ZvaWQgICAgICAgICAgQ29udmVydENvdW50cnkgICAgICAgICh0cEFuaVNpckdsb2JhbCwgdFNpckNvdW50cnlJbmZvcm1hdGlvbiosICAgIHREb3QxMWZJRUNvdW50cnkqKTsKK3ZvaWQgICAgICAgICAgQ29udmVydFdNTVBhcmFtcyAgICAgICh0cEFuaVNpckdsb2JhbCwgdFNpck1hY0VkY2FQYXJhbVNldElFKiwgICAgIHREb3QxMWZJRVdNTVBhcmFtcyopOwordm9pZCAgICAgICAgICBDb252ZXJ0RVJQSW5mbyAgICAgICAgKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjRXJwSW5mbyosICAgICAgICAgICAgdERvdDExZklFRVJQSW5mbyopOwordm9pZCAgICAgICAgICBDb252ZXJ0RURDQVBhcmFtICAgICAgKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjRWRjYVBhcmFtU2V0SUUqLCAgICAgdERvdDExZklFRURDQVBhcmFtU2V0Kik7Cit2b2lkICAgICAgICAgIENvbnZlcnRUU1BFQyAgICAgICAgICAodHBBbmlTaXJHbG9iYWwsIHRTaXJNYWNUc3BlY0lFKiwgICAgICAgICAgICB0RG90MTFmSUVUU1BFQyopOwordFNpclJldFN0YXR1cyBDb252ZXJ0VENMQVMgICAgICAgICAgKHRwQW5pU2lyR2xvYmFsLCB0U2lyVGNsYXNJbmZvKiwgICAgICAgICAgICAgdERvdDExZklFVENMQVMqKTsKK3ZvaWQgICAgICAgICAgQ29udmVydFdNTVRTUEVDICAgICAgICh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1RzcGVjSUUqLCAgICAgICAgICAgIHREb3QxMWZJRVdNTVRTUEVDKik7Cit0U2lyUmV0U3RhdHVzIENvbnZlcnRXTU1UQ0xBUyAgICAgICAodHBBbmlTaXJHbG9iYWwsIHRTaXJUY2xhc0luZm8qLCAgICAgICAgICAgICB0RG90MTFmSUVXTU1UQ0xBUyopOwordm9pZCAgICAgICAgICBDb252ZXJ0VFNEZWxheSAgICAgICAgKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjVHNEZWxheUlFKiwgICAgICAgICAgdERvdDExZklFVFNEZWxheSopOwordm9pZCAgICAgICAgICBDb252ZXJ0U2NoZWR1bGUgICAgICAgKHRwQW5pU2lyR2xvYmFsLCB0U2lyTWFjU2NoZWR1bGVJRSosICAgICAgICAgdERvdDExZklFU2NoZWR1bGUqKTsKK3ZvaWQgICAgICAgICAgQ29udmVydFdNTVNjaGVkdWxlICAgICh0cEFuaVNpckdsb2JhbCwgdFNpck1hY1NjaGVkdWxlSUUqLCAgICAgICAgIHREb3QxMWZJRVdNTVNjaGVkdWxlKik7Cit0U2lyUmV0U3RhdHVzIENvbnZlcnRXc2NPcGFxdWUgICAgICAodHBBbmlTaXJHbG9iYWwsIHRTaXJBZGRpZSosICAgICAgICAgICAgICAgICB0RG90MTFmSUVXc2NJRU9wYXF1ZSopOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKK3RTaXJSZXRTdGF0dXMgQ29udmVydFAyUE9wYXF1ZSAgICAgICh0cEFuaVNpckdsb2JhbCwgdFNpckFkZGllKiwgICAgICAgICAgICAgICAgIHREb3QxMWZJRVAyUElFT3BhcXVlKik7CisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvdXRpbHMvc3JjL2RvdDExZi5jIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9zcmMvZG90MTFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxODYyNgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvdXRpbHMvc3JjL2RvdDExZi5jCkBAIC0wLDAgKzEsMzg2NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAgKi8KKworLyoqCisgICogXGZpbGUgZG90MTFmLmMKKyAgKgorICAqIFxicmllZiBTdHJ1Y3R1cmVzLCBmdW5jdGlvbnMgJiBkZWZpbml0aW9ucyBmb3IKKyAgKiB3b3JraW5nIHdpdGggODAyLjExIEZyYW1lcworICAqCisgICoKKyAgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZC4KKyAgKgorICAqCisgICogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSAnZnJhbWVzYycKKyAgKiBUdWUgTWF5IDE1IDEzOjEyOjAxIDIwMTIgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGUocyk6CisgICoKKyAgKiBkb3QxMWYuZnJtcworICAqIAorICAqIFBMRUFTRSBET04nVCBFRElUIFRISVMgRklMRSBCWSBIQU5EIQorICAqCisgICoKKyAgKi8KKworI2lmICFkZWZpbmVkICBBTklfT1NfVFlQRV9PU1ggJiYgIWRlZmluZWQgQU5JX09TX1RZUEVfTElOVVggJiYgIWRlZmluZWQgQU5JX09TX1RZUEVfQU5EUk9JRAorI2luY2x1ZGUgPG1lbW9yeS5oPiAvKiBGb3IgbWVtY3B5ICovCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIEZvciBfdnNucHJpbnRmICovCisjaW5jbHVkZSA8c3RkZGVmLmg+IC8qIEZvciBvZmZzZXRvZiAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxhbmlHbG9iYWwuaD4KKyNpbmNsdWRlIDx1dGlsc0FwaS5oPgorI2luY2x1ZGUgImRvdDExZmRlZnMuaCIKKyNpbmNsdWRlICJkb3QxMWYuaCIKKworI2lmIGRlZmluZWQgKCBfTVNDX1ZFUiApCisjICAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQyNDQpCisjICAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQ1MDUpCisjICAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQ3MDIpCisjICAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQ5OTYpIC8qIC4uLiB3YXMgZGVjbGFyZWQgZGVwcmVjYXRlZCAqLworI2VuZGlmIC8qIE1pY3Jvc29mdCBDL0MrKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdEZSQU1FU19CT09MOwordHlwZWRlZiB2b2lkICgqcGZuR2VuZXJpY190KSh2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0ZGRGVmbiB7CisgICAgY29uc3QgY2hhciAgKm5hbWU7CisgICAgdEFOSV9VMzIgb2Zmc2V0OworICAgIHRBTklfVTE2IHNpZzsKKyAgICB0QU5JX1U4ICBzaXplOworfSB0RkZEZWZuOworCit0eXBlZGVmIHN0cnVjdCBzSUVEZWZuIHsKKyAgICB0QU5JX1UzMiAgb2Zmc2V0OworICAgIHRBTklfVTMyICBwcmVzZW5jZU9mZnNldDsKKyAgICB0QU5JX1UzMiAgY291bnRPZmZzZXQ7CisgICAgY29uc3QgY2hhciAgICpuYW1lOworICAgIHRBTklfVTE2ICBhcnJheWJvdW5kOworICAgIHRBTklfVTE2ICBtaW5TaXplOworICAgIHRBTklfVTE2ICBtYXhTaXplOworICAgIHRBTklfVTE2ICBzaWc7CisgICAgdW5zaWduZWQgY2hhciBvdWlbNV07CisgICAgdW5zaWduZWQgY2hhciBub3VpOworICAgIHRBTklfVTggICBlaWQ7CisgICAgdEZSQU1FU19CT09MICBmTWFuZGF0b3J5OworfSB0SUVEZWZuOworCisjaWYgIWRlZmluZWQoY291bnRvZikKKyNkZWZpbmUgY291bnRvZih4KSAoIHNpemVvZiggKHgpICkgLyBzaXplb2YoICh4KVswXSApICkKKyNlbmRpZgorCisjaWYgISBkZWZpbmVkKERPVDExRl9NRU1DUFkpCisjICAgZGVmaW5lIERPVDExRl9NRU1DUFkoY3R4LCBkc3QsIHNyYywgbGVuKSBcCisgICAgICAgIG1lbWNweSggKGRzdCksIChzcmMpLCAobGVuKSApICAgICAgICBcCisKKyNlbmRpZgorCisjaWYgISBkZWZpbmVkKERPVDExRl9NRU1DTVApCisjICAgZGVmaW5lIERPVDExRl9NRU1DTVAoY3R4LCBsaHMsIHJocywgbGVuKSBcCisgICAgICAgIG1lbWNtcCggKGxocyksIChyaHMpLCAobGVuKSApICAgICAgICBcCisKKyNlbmRpZgorCisjaWZuZGVmIERPVDExRl9IQVZFX0xPR19TRVZFUklUSUVTCisjICAgZGVmaW5lIEZSTE9HX09GRiAoIDAgKQorIyAgIGRlZmluZSBGUkxPR1AgICAgKCAxICkKKyMgICBkZWZpbmUgRlJMT0dFICAgICggMiApCisjICAgZGVmaW5lIEZSTE9HVyAgICAoIDMgKQorIyAgIGRlZmluZSBGUkxPRzEgICAgKCA0ICkKKyMgICBkZWZpbmUgRlJMT0cyICAgICggNSApCisjICAgZGVmaW5lIEZSTE9HMyAgICAoIDYgKQorIyAgIGRlZmluZSBGUkxPRzQgICAgKCA3ICkKKyNlbmRpZgorCisjZGVmaW5lIEZSRkwoeCkgeAorCisjaWZkZWYgRE9UMTFGX0VOQUJMRV9MT0dHSU5HCisKKyNpZm5kZWYgRE9UMTFGX0hBVkVfTE9HX01BQ1JPUworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmbmRlZiBET1QxMUZfTE9HX0dBVEUKKyMgICBkZWZpbmUgRE9UMTFGX0xPR19HQVRFIEZSTE9HVworI2VuZGlmIC8vIERPVDExRl9MT0dfR0FURQorCisjaWZkZWYgV0lOMzIKKworI2lmIGRlZmluZWQgKCBfQ09OU09MRSApIHx8IGRlZmluZWQgKCBfV0lORE9XUyApIHx8IGRlZmluZWQgKCBfRExMICkgfHwgZGVmaW5lZCAoIF9MSUIgKQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNkZWZpbmUgREJHUFJJTlQgT3V0cHV0RGVidWdTdHJpbmdBCisjZWxzZSAgLyogTm90IFVzZXIgbW9kZSAqLworI2RlZmluZSBEQkdQUklOVCBEYmdQcmludAorI2VuZGlmIC8qIFVzZXIgbW9kZSAqLworCitzdGF0aWMgdm9pZCBmcmFtZXNMb2codHBBbmlTaXJHbG9iYWwgcEN0eCwgaW50IG5TZXYsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbHBzekZvcm1hdCwgLi4uKQoreworI2lmZGVmIFdMQU5fREVCVUcKKyAgICB2YV9saXN0IHZhbDsKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICAodm9pZClwQ3R4OworICAgIGlmICggblNldiA8PSBET1QxMUZfTE9HX0dBVEUgKQorICAgIHsKKyAgICAgICAgdmFfc3RhcnQodmFsLCBscHN6Rm9ybWF0KTsKKyAgICAgICAgX3ZzbnByaW50ZihidWZmZXIsIDEwMjQsIGxwc3pGb3JtYXQsIHZhbCk7CisgICAgICAgIHZhX2VuZCh2YWwpOworICAgICAgICBEQkdQUklOVChidWZmZXIpOworICAgIH0KKyNlbmRpZgorfQorc3RhdGljIHZvaWQgZnJhbWVzRHVtcCh0cEFuaVNpckdsb2JhbCBwQ3R4LCBpbnQgblNldiwgdEFOSV9VOCAqcEJ1ZiwgaW50IG5CdWYpCit7CisjaWZkZWYgV0xBTl9ERUJVRworICAgIGNoYXIgYnVmZmVyWzM1XTsKKyAgICBpbnQgaSwgb2Zmc2V0OworICAgIHBDdHg7CisgICAgb2Zmc2V0ID0gMDsKKyAgICBpZiAoIG5TZXYgPiBET1QxMUZfTE9HX0dBVEUgKSByZXR1cm47CisgICAgZm9yIChpID0gMDsgaSA8IG5CdWYvODsgKytpKQorICAgIHsKKyAgICAgICAgX3NucHJpbnRmKGJ1ZmZlciwgMzUsICIlMDh4OiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIG9mZnNldCwgKnBCdWYsICoocEJ1ZiArIDEpLCAqKHBCdWYgKyAyKSwgKihwQnVmICsgMyksICoocEJ1ZiArIDQpLCAqKHBCdWYgKyA1KSwgKihwQnVmICsgNiksICoocEJ1ZiArIDcpKTsKKyAgICAgICAgcEJ1ZiArPSA4OyBvZmZzZXQgKz0gODsKKyAgICAgICAgREJHUFJJTlQoYnVmZmVyKTsKKyAgICB9CisgICAgX3NucHJpbnRmKGJ1ZmZlciwgMzUsICIlMDh4OiAiLCBvZmZzZXQpOworICAgIERCR1BSSU5UKGJ1ZmZlcik7CisgICAgZm9yIChpID0gMDsgaSA8IG5CdWYgJSA4OyArK2kpCisgICAgeworICAgICAgICBfc25wcmludGYoYnVmZmVyLCAzNSwgIiUwMnggIiwgKnBCdWYpOworICAgICAgICArK3BCdWY7CisgICAgICAgIERCR1BSSU5UKGJ1ZmZlcik7CisgICAgfQorICAgIERCR1BSSU5UKCJcbiIpOworI2VuZGlmCit9CisKKyNlbGlmIGRlZmluZWQgT1NfWCAvKiBOb3QgV0lOMzIgKi8KK3N0YXRpYyB2b2lkIGZyYW1lc0xvZyh0cEFuaVNpckdsb2JhbCBwQ3R4LCBpbnQgblNldiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpscHN6Rm9ybWF0LCAuLi4pCit7Ly8gVG8gZmlsbCBpbiB3aGVuIG5lZWRlZCB1c2luZyBJT0xvZworCit9CisKK3N0YXRpYyB2b2lkIGZyYW1lc0R1bXAodHBBbmlTaXJHbG9iYWwgcEN0eCwgaW50IG5TZXYsIHRBTklfVTggKnBCdWYsIGludCBuQnVmKQoreworfQorCisjZWxpZiBkZWZpbmVkIExJTlVYCisKK3N0YXRpYyB2b2lkIGZyYW1lc0xvZyh0cEFuaVNpckdsb2JhbCBwQ3R4LCBpbnQgblNldiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpscHN6Rm9ybWF0LCAuLi4pCit7CisjaWZkZWYgV0xBTl9ERUJVRworICAgIHZhX2xpc3QgbWFya2VyOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKCBuU2V2IDw9IERPVDExRl9MT0dfR0FURSApCisgICAgeworICAgICAgICB2YV9zdGFydCggbWFya2VyLCBscHN6Rm9ybWF0ICk7CisgICAgICAgIHZwcmludGYobHBzekZvcm1hdCwgbWFya2VyKTsKKyAgICAgICAgdmFfZW5kKCBtYXJrZXIgKTsKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZnJhbWVzRHVtcCh0cEFuaVNpckdsb2JhbCBwQ3R4LCBpbnQgblNldiwgdEFOSV9VOCAqcEJ1ZiwgaW50IG5CdWYpCit7CisjaWZkZWYgV0xBTl9ERUJVRworICAgIGNoYXIgYnVmZmVyWzM1XTsKKyAgICBpbnQgaSwgb2Zmc2V0OworICAgICh2b2lkKXBDdHg7CisgICAgb2Zmc2V0ID0gMDsKKyAgICBpZiAoIG5TZXYgPiBET1QxMUZfTE9HX0dBVEUgKSByZXR1cm47CisgICAgZm9yIChpID0gMDsgaSA8IG5CdWYvODsgKytpKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCIlMDh4OiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIG9mZnNldCwgKnBCdWYsICoocEJ1ZiArIDEpLCAqKHBCdWYgKyAyKSwgKihwQnVmICsgMyksICoocEJ1ZiArIDQpLCAqKHBCdWYgKyA1KSwgKihwQnVmICsgNiksICoocEJ1ZiArIDcpKTsKKyAgICAgICAgcEJ1ZiArPSA4OyBvZmZzZXQgKz0gODsKKyAgICB9CisgICAgcHJpbnRmKCIlMDh4OiAiLCBvZmZzZXQpOworICAgIGZvciAoaSA9IDA7IGkgPCBuQnVmICUgODsgKytpKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCIlMDJ4ICIsICpwQnVmKTsKKyAgICAgICAgKytwQnVmOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisjZW5kaWYKK30KKworI2VuZGlmIC8qIFdJTjMyICovCisKKyNkZWZpbmUgRlJBTUVTX0xPRzAoY3R4LCBzZXYsIGZtdCkgXAorICAgICBmcmFtZXNMb2coKGN0eCksIChzZXYpLCAoZm10KSk7CisjZGVmaW5lIEZSQU1FU19MT0cxKGN0eCwgc2V2LCBmbXQsIHAxKSBcCisgICAgIGZyYW1lc0xvZygoY3R4KSwgKHNldiksIChmbXQpLCAocDEpKTsKKyNkZWZpbmUgRlJBTUVTX0xPRzIoY3R4LCBzZXYsIGZtdCwgcDEsIHAyKSBcCisgICAgIGZyYW1lc0xvZygoY3R4KSwgKHNldiksIChmbXQpLCAocDEpLCAocDIpKTsKKyNkZWZpbmUgRlJBTUVTX0xPRzMoY3R4LCBzZXYsIGZtdCwgcDEsIHAyLCBwMykgXAorICAgICBmcmFtZXNMb2coKGN0eCksIChzZXYpLCAoZm10KSwgKHAxKSwgKHAyKSwgKHAzKSk7CisjZGVmaW5lIEZSQU1FU19EVU1QKGN0eCwgc2V2LCBwLCBuKSBcCisgICAgIGZyYW1lc0R1bXAoKGN0eCksIChzZXYpLCAocCksIChuKSk7CisjaWZuZGVmIEZSQU1FU19TRVZfRk9SX0ZSQU1FCisjICAgZGVmaW5lIEZSQU1FU19TRVZfRk9SX0ZSQU1FKGN0eCwgc2lnKSBGUkxPRzMKKyNlbmRpZgorCisjZW5kaWYgLyogRW5kIERPVDExRl9IQVZFX0xPR19NQUNST1MgKi8KKworI2Vsc2UgIC8vICEgRE9UMTFGX0VOQUJMRV9MT0dHSU5HCisjICAgZGVmaW5lIEZSQU1FU19MT0cwKGN0eCwgc2V2LCBmbXQpCisjICAgZGVmaW5lIEZSQU1FU19MT0cxKGN0eCwgc2V2LCBmbXQsIHAxKQorIyAgIGRlZmluZSBGUkFNRVNfTE9HMihjdHgsIHNldiwgZm10LCBwMSwgcDIpCisjICAgZGVmaW5lIEZSQU1FU19MT0czKGN0eCwgc2V2LCBmbXQsIHAxLCBwMiwgcDMpCisjICAgZGVmaW5lIEZSQU1FU19EVU1QKGN0eCwgc2V2LCBwLCBuKQorIyAgIGlmbmRlZiBGUkFNRVNfU0VWX0ZPUl9GUkFNRQorIyAgICAgICBkZWZpbmUgRlJBTUVTX1NFVl9GT1JfRlJBTUUoY3R4LCBzaWcpIEZSTE9HMworIyAgIGVuZGlmCisjZW5kaWYgLy8gRE9UMTFGX0VOQUJMRV9MT0dHSU5HCisKKyNpZiBkZWZpbmVkKCBET1QxMUZfRU5BQkxFX0RCR19CUkVBSyApICYmIGRlZmluZWQgKCBXSU4zMiApCisjICAgZGVmaW5lIEZSQU1FU19EQkdfQlJFQUsoKSB7IF9hc20gaW50IDMgfQorI2Vsc2UKKyMgICBkZWZpbmUgRlJBTUVTX0RCR19CUkVBSygpCisjZW5kaWYKKworI2lmICEgZGVmaW5lZChET1QxMUZfUEFSQU1FVEVSX0NIRUNLKQorIyAgIGlmIGRlZmluZWQgKERPVDExRl9IQVZFX1dJTjMyX0FQSSkKKworIyAgICAgICBkZWZpbmUgRE9UMTFGX1BBUkFNRVRFUl9DSEVDSyhwQnVmLCBuQnVmLCBwRnJtLCBuRnJtKSBcCisgICAgICAgIGlmICghcEJ1ZiB8fCBJc0JhZFJlYWRQdHIocEJ1ZiwgbkJ1ZikpIHJldHVybiBET1QxMUZfQkFEX0lOUFVUX0JVRkZFUjsgXAorICAgICAgICBpZiAoIXBGcm0gfHwgSXNCYWRXcml0ZVB0cihwRnJtLCBuRnJtKSkgcmV0dXJuIERPVDExRl9CQURfT1VUUFVUX0JVRkZFUiBcCisKKyMgICAgICAgZGVmaW5lIERPVDExRl9QQVJBTUVURVJfQ0hFQ0syKHBTcmMsIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQpIFwKKyAgICAgICAgaWYgKCFwU3JjIHx8IElzQmFkUmVhZFB0cihwU3JjLCA0KSkgcmV0dXJuIERPVDExRl9CQURfSU5QVVRfQlVGRkVSOyBcCisgICAgICAgIGlmICghcEJ1ZiB8fCBJc0JhZFdyaXRlUHRyKHBCdWYsIG5CdWYpKSByZXR1cm4gRE9UMTFGX0JBRF9PVVRQVVRfQlVGRkVSOyBcCisgICAgICAgIGlmICghbkJ1ZikgcmV0dXJuIERPVDExRl9CQURfT1VUUFVUX0JVRkZFUjsgXAorICAgICAgICBpZiAoSXNCYWRXcml0ZVB0cihwbkNvbnN1bWVkLCA0KSkgcmV0dXJuIERPVDExRl9CQURfT1VUUFVUX0JVRkZFUiBcCisKKyMgICBlbHNlCisKKyMgICAgICAgZGVmaW5lIERPVDExRl9QQVJBTUVURVJfQ0hFQ0socEJ1ZiwgbkJ1ZiwgcEZybSwgbkZybSkgXAorICAgICAgICBpZiAoIXBCdWYpIHJldHVybiBET1QxMUZfQkFEX0lOUFVUX0JVRkZFUjsgXAorICAgICAgICBpZiAoIXBGcm0pIHJldHVybiBET1QxMUZfQkFEX09VVFBVVF9CVUZGRVIgXAorCisjICAgICAgIGRlZmluZSBET1QxMUZfUEFSQU1FVEVSX0NIRUNLMihwU3JjLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkKSBcCisgICAgICAgIGlmICghcFNyYykgcmV0dXJuIERPVDExRl9CQURfSU5QVVRfQlVGRkVSOyBcCisgICAgICAgIGlmICghcEJ1ZikgcmV0dXJuIERPVDExRl9CQURfT1VUUFVUX0JVRkZFUjsgXAorICAgICAgICBpZiAoIW5CdWYpIHJldHVybiBET1QxMUZfQkFEX09VVFBVVF9CVUZGRVI7IFwKKyAgICAgICAgaWYgKCFwbkNvbnN1bWVkKSByZXR1cm4gRE9UMTFGX0JBRF9PVVRQVVRfQlVGRkVSIFwKKworIyAgIGVuZGlmCisjZW5kaWYKKworc3RhdGljIHZvaWQgZnJhbWVzbnRvaHModHBBbmlTaXJHbG9iYWwgICAgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2ICpwT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgKnBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRGUkFNRVNfQk9PTCAgZk1zYikKK3sKKyAgICAodm9pZClwQ3R4OworIyAgIGlmIGRlZmluZWQgKCBET1QxMUZfTElUVExFX0VORElBTl9IT1NUICkKKyAgICBpZiAoICFmTXNiICkKKyAgICB7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgKCB0QU5JX1UxNiogKXBPdXQsIHBJbiwgMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwT3V0ID0gKCB0QU5JX1UxNiApKCAqcEluIDw8IDggKSB8ICooIHBJbiArIDEgKTsKKyAgICB9CisjICAgZWxzZQorICAgIGlmICggIWZNc2IgKQorICAgIHsKKyAgICAgICAgKnBPdXQgPSAoIHRBTklfVTE2ICkoICpwSW4gfCAoICooIHBJbiArIDEgKSA8PCA4ICkgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCAoIHRBTklfVTE2KiApcE91dCwgcEluLCAyKTsKKyAgICB9CisjICAgZW5kaWYKK30KKworc3RhdGljIHZvaWQgZnJhbWVzbnRvaGwodHBBbmlTaXJHbG9iYWwgICAgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgKnBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRGUkFNRVNfQk9PTCAgZk1zYikKK3sKKyAgICAodm9pZClwQ3R4OworIyAgIGlmIGRlZmluZWQgKCBET1QxMUZfTElUVExFX0VORElBTl9IT1NUICkKKyAgICBpZiAoICFmTXNiICkKKyAgICB7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgKCB0QU5JX1UzMiogKXBPdXQsIHBJbiwgNCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwT3V0ID0gKCB0QU5JX1UzMiApKCAqcEluICAgICAgICAgPDwgMjQgKSB8CisgICAgICAgICAgICAgICAgKCAqKCBwSW4gKyAxICkgPDwgMTYgKSB8CisgICAgICAgICAgICAgICAgKCAqKCBwSW4gKyAyICkgPDwgIDggKSB8CisgICAgICAgICAgICAgICAgKCAqKCBwSW4gKyAzICkgKTsKKyAgICB9CisjICAgZWxzZQorICAgIGlmICggIWZNc2IgKQorICAgIHsKKyAgICAgICAgKnBPdXQgPSAoIHRBTklfVTMyICkoICooIHBJbiArIDMgKSA8PCAyNCApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAqKCBwSW4gKyAyICkgPDwgMTYgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKiggcEluICsgMSApIDw8ICA4ICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICooIHBJbiApICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwT3V0ID0gKiAoIHRBTklfVTMyKiApcEluOworICAgIH0KKyMgICBlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmcmFtZXNudG9ocSh0cEFuaVNpckdsb2JhbCAgICBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdERPVDExRl9VNjQgKnBPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAqcEluLAorICAgICAgICAgICAgICAgICAgICAgICAgdEZSQU1FU19CT09MICBmTXNiKQoreworIyAgIGlmIGRlZmluZWQgKCBET1QxMUZfTElUVExFX0VORElBTl9IT1NUICkKKyAgICBmcmFtZXNudG9obCggcEN0eCwgJigoKnBPdXQpWzBdKSwgcEluLCBmTXNiKTsKKyAgICBmcmFtZXNudG9obCggcEN0eCwgJigoKnBPdXQpWzFdKSwgcEluICsgNCwgZk1zYik7CisjICAgZWxzZQorICAgIGZyYW1lc250b2hsKCBwQ3R4LCAmKCgqcE91dClbMV0pLCBwSW4sIGZNc2IpOworICAgIGZyYW1lc250b2hsKCBwQ3R4LCAmKCgqcE91dClbMF0pLCBwSW4gKyA0LCBmTXNiKTsKKyMgICBlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmcmFtZXNodG9ucyh0cEFuaVNpckdsb2JhbCAgICBwQ3R4CissICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgKnBPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiAgcEluLAorICAgICAgICAgICAgICAgICAgICAgICAgdEZSQU1FU19CT09MICBmTXNiKQoreworICAgICh2b2lkKXBDdHg7CisjICAgaWYgZGVmaW5lZCAoIERPVDExRl9MSVRUTEVfRU5ESUFOX0hPU1QgKQorICAgIGlmICggIWZNc2IgKQorICAgIHsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwT3V0LCAmcEluLCAyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBPdXQgICAgICAgICA9ICggcEluICYgMHhmZjAwICkgPj4gODsKKyAgICAgICAgKiggcE91dCArIDEgKSA9IHBJbiAmIDB4ZmY7CisgICAgfQorIyAgIGVsc2UKKyAgICBpZiAoICFmTXNiICkKKyAgICB7CisgICAgICAgICpwT3V0ICAgICAgICAgPSBwSW4gJiAweGZmOworICAgICAgICAqKCBwT3V0ICsgMSApID0gKCBwSW4gJiAweGZmMDAgKSA+PiA4OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBPdXQsICZwSW4sIDIpOworICAgIH0KKyMgICBlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmcmFtZXNodG9ubCh0cEFuaVNpckdsb2JhbCAgICBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgKnBPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgcEluLAorICAgICAgICAgICAgICAgICAgICAgICAgdEZSQU1FU19CT09MICBmTXNiKQoreworICAgICh2b2lkKXBDdHg7CisjICAgaWYgZGVmaW5lZCAoIERPVDExRl9MSVRUTEVfRU5ESUFOX0hPU1QgKQorICAgIGlmICggIWZNc2IgKQorICAgIHsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwT3V0LCAmcEluLCA0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBPdXQgICAgICAgICA9ICggcEluICYgMHhmZjAwMDAwMCApID4+IDI0OworICAgICAgICAqKCBwT3V0ICsgMSApID0gKCBwSW4gJiAweDAwZmYwMDAwICkgPj4gMTY7CisgICAgICAgICooIHBPdXQgKyAyICkgPSAoIHBJbiAmIDB4MDAwMGZmMDAgKSA+PiAgODsKKyAgICAgICAgKiggcE91dCArIDMgKSA9ICggcEluICYgMHgwMDAwMDBmZiApOworICAgIH0KKyMgICBlbHNlCisgICAgaWYgKCAhZk1zYiApCisgICAgeworICAgICAgICAqKCBwT3V0ICAgICApID0gKCBwSW4gJiAweDAwMDAwMGZmICk7CisgICAgICAgICooIHBPdXQgKyAxICkgPSAoIHBJbiAmIDB4MDAwMGZmMDAgKSA+PiAgODsKKyAgICAgICAgKiggcE91dCArIDIgKSA9ICggcEluICYgMHgwMGZmMDAwMCApID4+IDE2OworICAgICAgICAqKCBwT3V0ICsgMyApID0gKCBwSW4gJiAweGZmMDAwMDAwICkgPj4gMjQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcE91dCwgJnBJbiwgNCk7CisgICAgfQorIyAgIGVuZGlmCit9CisKK3N0YXRpYyB2b2lkIGZyYW1lc2h0b25xKHRwQW5pU2lyR2xvYmFsICAgIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAqcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRET1QxMUZfVTY0ICBwSW4sCisgICAgICAgICAgICAgICAgICAgICAgICB0RlJBTUVTX0JPT0wgIGZNc2IpCit7CisjICAgaWYgZGVmaW5lZCAoIERPVDExRl9MSVRUTEVfRU5ESUFOX0hPU1QgKQorICAgIGZyYW1lc2h0b25sKCBwQ3R4LCBwT3V0LCBwSW5bMF0sIGZNc2IpOworICAgIGZyYW1lc2h0b25sKCBwQ3R4LCBwT3V0ICsgNCwgcEluWzFdLCBmTXNiKTsKKyMgICBlbHNlCisgICAgZnJhbWVzaHRvbmwoIHBDdHgsIHBPdXQgKyA0LCBwSW5bMV0sIGZNc2IpOworICAgIGZyYW1lc2h0b25sKCBwQ3R4LCBwT3V0LCBwSW5bMF0sIGZNc2IpOworIyAgIGVuZGlmCit9CitzdGF0aWMgY29uc3QgdElFRGVmbiogRmluZElFRGVmbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0SUVEZWZuICBJRXNbXSkKK3sKKyAgICBjb25zdCB0SUVEZWZuICpwSWU7CisKKyAgICAodm9pZClwQ3R4OworCisgICAgcEllID0gJihJRXNbMF0pOworICAgIHdoaWxlICgweGZmICE9IHBJZS0+ZWlkKQorICAgIHsKKyAgICAgICAgaWYgKCpwQnVmID09IHBJZS0+ZWlkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoMCA9PSBwSWUtPm5vdWkpIHJldHVybiBwSWU7CisKKyAgICAgICAgICAgIGlmICggKCBuQnVmID4gKHRBTklfVTMyKShwSWUtPm5vdWkgKyAyKSApICYmCisgICAgICAgICAgICAgICAgICggIURPVDExRl9NRU1DTVAocEN0eCwgcEJ1ZiArIDIsIHBJZS0+b3VpLCBwSWUtPm5vdWkpICkgKQorICAgICAgICAgICAgICAgIHJldHVybiBwSWU7CisgICAgICAgIH0KKworICAgICAgICArK3BJZTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHRBTklfVTMyIEdldENvbnRhaW5lckllc0xlbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcG5Db25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdElFRGVmbiAgSUVzW10pCit7CisgICAgY29uc3QgdElFRGVmbiAqcEllLCAqcEllRmlyc3Q7CisgICAgdEFOSV9VOCAqcEJ1ZlJlbWFpbmluZyA9IHBCdWY7CisgICAgdEFOSV9VOCBsZW4gPSAwOworCisgICAgKHZvaWQpcEN0eDsKKworICAgIHBJZUZpcnN0ID0gJihJRXNbMF0pOworCisgICAgaWYoICpwQnVmUmVtYWluaW5nICE9IHBJZUZpcnN0LT5laWQgKQorICAgICAgICAgcmV0dXJuIERPVDExRl9JTlRFUk5BTF9FUlJPUjsKKyAgICBsZW4gKz0gKihwQnVmUmVtYWluaW5nKzEpOworICAgIHBCdWZSZW1haW5pbmcgKz0gbGVuICsgMjsKKyAgICB3aGlsZSAoIGxlbiA8IG5CdWYgKQorICAgIHsKKyAgICAgICAgaWYoIE5VTEwgPT0gKHBJZSA9ICBGaW5kSUVEZWZuKHBDdHgsIHBCdWZSZW1haW5pbmcsIG5CdWYgKyBsZW4sIElFcykpKQorICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiggcEllLT5laWQgPT0gcEllRmlyc3QtPmVpZCApCisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxlbiArPSAqKHBCdWZSZW1haW5pbmcgKyAxKSArIDI7CisgICAgICAgIHBCdWZSZW1haW5pbmcgKz0gKihwQnVmUmVtYWluaW5nICsgMSkgKyAyOworICAgIH0KKworICAgICpwbkNvbnN1bWVkID0gbGVuOworICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgIAorfQorCisKKworc3RhdGljIHRBTklfVTMyIFVucGFja0NvcmUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEZGRGVmbiAgRkZzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0SUVEZWZuICBJRXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBGcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICBuRnJtKTsKK3N0YXRpYyB0QU5JX1UzMiBQYWNrQ29yZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRGRkRlZm4gIEZGc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0SUVEZWZuICBJRXNbXSk7CitzdGF0aWMgdEFOSV9VMzIgR2V0UGFja2VkU2l6ZUNvcmUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuTmVlZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0SUVEZWZuICBJRXNbXSk7CisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2Q29tbW9uRnVuYyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UxNiB0bHZsZW4sIHRBTklfVTggKnBEc3RQcmVzZW50LCB0QU5JX1U4ICpwRHN0RmllbGQpCit7CisgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKworICAgICpwRHN0UHJlc2VudCA9IDE7CisgICAgKnBEc3RGaWVsZCA9ICpwQnVmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMuICovCisKK3RBTklfVTMyIGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMyKHRwQW5pU2lyR2xvYmFsICBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UxNiB0bHZsZW4sIHRBTklfVTggKnBEc3RQcmVzZW50LCB0QU5JX1UxNiAqcERzdFN0YXRlKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXRsdmxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworCisgICAgKnBEc3RQcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCBwRHN0U3RhdGUsIHBCdWYsIDEpOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrVGx2Q29tbW9uRnVuYzIuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit2b2lkIGRvdDExZlVucGFja0ZmQ29tbW9uRnVuYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsIHRBTklfVTE2ICpwRHN0RmllbGQpCit7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgcERzdEZpZWxkLCBwQnVmLCAwKTsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmVW5wYWNrRmZDb21tb25GdW5jLiAqLworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUNvbW1vbkZ1bmModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcERzdFByZXNlbnQgLCB0QU5JX1U4ICpwRHN0RmllbGQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpaWVsZW47CisgICAgKHZvaWQpcEJ1ZjsgCisgICAgaWYgKCgqcERzdFByZXNlbnQpKSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgICpwRHN0UHJlc2VudCA9IDE7CisgICAgKnBEc3RGaWVsZCA9ICpwQnVmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llQ29tb25GdW5jLiAqLwordHlwZWRlZiBzdHJ1Y3Qgc1RMVkRlZm4geworICAgIHRBTklfVTMyICAgb2Zmc2V0OworICAgIHRBTklfVTMyICAgcHJlc2VuY2VPZmZzZXQ7CisgICAgY29uc3QgY2hhciAqICAgbmFtZTsKKyAgICB0QU5JX1UxNiAgIHNpZzsKKyAgICB0QU5JX1UzMiAgIGlkOworICAgIHRBTklfVTMyICAgcGVjOworICAgIHRBTklfVTMyICAgbWluU2l6ZTsKKyAgICB0QU5JX1UzMiAgIG1heFNpemU7CisgICAgdEFOSV9VOCAgICBmTWFuZGF0b3J5OworICAgIHRBTklfVTggICAgc1R5cGU7CisgICAgdEFOSV9VOCAgICBzTGVuOworICAgIHRBTklfVTggICAgZk1zYjsKK30gdFRMVkRlZm47CisKK3N0YXRpYyBjb25zdCB0VExWRGVmbiogRmluZFRMVkRlZm4oIHRwQW5pU2lyR2xvYmFsICAgIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdFRMVkRlZm4gICAgICBUTFZzWyBdICkKK3sKKyAgICBjb25zdCB0VExWRGVmbiAqcFRsdjsKKyAgICB0QU5JX1UzMiAgIHBlYzsKKyAgICB0QU5JX1UxNiAgIGlkOworCisgICAgcFRsdiA9ICYoIFRMVnNbIDAgXSApOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKCBwVGx2LT5zVHlwZSA9PSAyICkKKyAgICAgICBmcmFtZXNudG9ocyggcEN0eCwgJmlkLCBwQnVmLCAxICk7CisgICAgZWxzZQorICAgICAgIGlkID0gKnBCdWY7CisKKyAgICB3aGlsZSAoIDB4ZmZmZiAhPSBwVGx2LT5pZCApCisgICAgeworICAgICAgICBpZiAoIGlkID09IHBUbHYtPmlkICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAwID09IHBUbHYtPnBlYyApIHJldHVybiBwVGx2OworCisgICAgICAgICAgICBpZiggbkJ1ZiA+IDUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBlYyA9ICAoICggKiAoIHBCdWYgKyA0ICkgKSA8PCAxNiApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKCAoICogKCBwQnVmICsgNSApICkgPDwgIDggKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqICggcEJ1ZiArIDYgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHBlYyA9PSBwVGx2LT5wZWMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBUbHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKytwVGx2OworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdEFOSV9VMzIgVW5wYWNrVGx2Q29yZSggdHBBbmlTaXJHbG9iYWwgICBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0VExWRGVmbiAgICAgVExWc1sgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBuRnJtICk7CitzdGF0aWMgdEFOSV9VMzIgUGFja1RsdkNvcmUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0VExWRGVmbiAgVExWc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcGlkeCk7CitzdGF0aWMgdEFOSV9VMzIgR2V0UGFja2VkU2l6ZVRsdkNvcmUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuTmVlZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0VExWRGVmbiAgVExWc1tdKTsKKworI2RlZmluZSBTaWdGZkFJRCAoIDB4MDAwMSApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZBY3Rpb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmQWN0aW9uICpwRHN0KQoreworICAgIHBEc3QtPmFjdGlvbiA9ICpwQnVmOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tGZkFjdGlvbi4gKi8KKworI2RlZmluZSBTaWdGZkFjdGlvbiAoIDB4MDAwMiApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZBZGRCQVBhcmFtZXRlclNldCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmQWRkQkFQYXJhbWV0ZXJTZXQgKnBEc3QpCit7CisgICAgdEFOSV9VMTYgdG1wMF9fOworICAgIGZyYW1lc250b2hzKHBDdHgsICZ0bXAwX18sIHBCdWYsIDApOworICAgIHBEc3QtPmFtc2R1U3VwcG9ydGVkID0gdG1wMF9fID4+IDAgJiAweDE7CisgICAgcERzdC0+cG9saWN5ID0gdG1wMF9fID4+IDEgJiAweDE7CisgICAgcERzdC0+dGlkID0gdG1wMF9fID4+IDIgJiAweGY7CisgICAgcERzdC0+YnVmZmVyU2l6ZSA9IHRtcDBfXyA+PiA2ICYgMHgzZmY7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlVucGFja0ZmQWRkQkFQYXJhbWV0ZXJTZXQuICovCisKKyNkZWZpbmUgU2lnRmZBZGRCQVBhcmFtZXRlclNldCAoIDB4MDAwMyApCisKKyNkZWZpbmUgU2lnRmZBdXRoQWxnbyAoIDB4MDAwNCApCisKKyNkZWZpbmUgU2lnRmZBdXRoU2VxTm8gKCAweDAwMDUgKQorCit2b2lkIGRvdDExZlVucGFja0ZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZkJBU3RhcnRpbmdTZXF1ZW5jZUNvbnRyb2wgKnBEc3QpCit7CisgICAgdEFOSV9VMTYgdG1wMV9fOworICAgIGZyYW1lc250b2hzKHBDdHgsICZ0bXAxX18sIHBCdWYsIDApOworICAgIHBEc3QtPmZyYWdOdW1iZXIgPSB0bXAxX18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5zc24gPSB0bXAxX18gPj4gNCAmIDB4ZmZmOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tGZkJBU3RhcnRpbmdTZXF1ZW5jZUNvbnRyb2wuICovCisKKyNkZWZpbmUgU2lnRmZCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sICggMHgwMDA2ICkKKworI2RlZmluZSBTaWdGZkJBVGltZW91dCAoIDB4MDAwNyApCisKKyNkZWZpbmUgU2lnRmZCZWFjb25JbnRlcnZhbCAoIDB4MDAwOCApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZDYXBhYmlsaXRpZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmQ2FwYWJpbGl0aWVzICpwRHN0KQoreworICAgIHRBTklfVTE2IHRtcDJfXzsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmdG1wMl9fLCBwQnVmLCAwKTsKKyAgICBwRHN0LT5lc3MgPSB0bXAyX18gPj4gMCAmIDB4MTsKKyAgICBwRHN0LT5pYnNzID0gdG1wMl9fID4+IDEgJiAweDE7CisgICAgcERzdC0+Y2ZQb2xsYWJsZSA9IHRtcDJfXyA+PiAyICYgMHgxOworICAgIHBEc3QtPmNmUG9sbFJlcSA9IHRtcDJfXyA+PiAzICYgMHgxOworICAgIHBEc3QtPnByaXZhY3kgPSB0bXAyX18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5zaG9ydFByZWFtYmxlID0gdG1wMl9fID4+IDUgJiAweDE7CisgICAgcERzdC0+cGJjYyA9IHRtcDJfXyA+PiA2ICYgMHgxOworICAgIHBEc3QtPmNoYW5uZWxBZ2lsaXR5ID0gdG1wMl9fID4+IDcgJiAweDE7CisgICAgcERzdC0+c3BlY3RydW1NZ3QgPSB0bXAyX18gPj4gOCAmIDB4MTsKKyAgICBwRHN0LT5xb3MgPSB0bXAyX18gPj4gOSAmIDB4MTsKKyAgICBwRHN0LT5zaG9ydFNsb3RUaW1lID0gdG1wMl9fID4+IDEwICYgMHgxOworICAgIHBEc3QtPmFwc2QgPSB0bXAyX18gPj4gMTEgJiAweDE7CisgICAgcERzdC0+cnJtID0gdG1wMl9fID4+IDEyICYgMHgxOworICAgIHBEc3QtPmRzc3NPZmRtID0gdG1wMl9fID4+IDEzICYgMHgxOworICAgIHBEc3QtPmRlbGF5ZWRCQSA9IHRtcDJfXyA+PiAxNCAmIDB4MTsKKyAgICBwRHN0LT5pbW1lZGlhdGVCQSA9IHRtcDJfXyA+PiAxNSAmIDB4MTsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmVW5wYWNrRmZDYXBhYmlsaXRpZXMuICovCisKKyNkZWZpbmUgU2lnRmZDYXBhYmlsaXRpZXMgKCAweDAwMDkgKQorCit2b2lkIGRvdDExZlVucGFja0ZmQ2F0ZWdvcnkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZkNhdGVnb3J5ICpwRHN0KQoreworICAgIHBEc3QtPmNhdGVnb3J5ID0gKnBCdWY7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlVucGFja0ZmQ2F0ZWdvcnkuICovCisKKyNkZWZpbmUgU2lnRmZDYXRlZ29yeSAoIDB4MDAwYSApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZDdXJyZW50QVBBZGRyZXNzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmQ3VycmVudEFQQWRkcmVzcyAqcERzdCkKK3sKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPm1hYywgcEJ1ZiwgNik7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlVucGFja0ZmQ3VycmVudEFQQWRkcmVzcy4gKi8KKworI2RlZmluZSBTaWdGZkN1cnJlbnRBUEFkZHJlc3MgKCAweDAwMGIgKQorCit2b2lkIGRvdDExZlVucGFja0ZmRGVsQkFQYXJhbWV0ZXJTZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZkRlbEJBUGFyYW1ldGVyU2V0ICpwRHN0KQoreworICAgIHRBTklfVTE2IHRtcDNfXzsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmdG1wM19fLCBwQnVmLCAwKTsKKyAgICBwRHN0LT5yZXNlcnZlZCA9IHRtcDNfXyA+PiAwICYgMHg3ZmY7CisgICAgcERzdC0+aW5pdGlhdG9yID0gdG1wM19fID4+IDExICYgMHgxOworICAgIHBEc3QtPnRpZCA9IHRtcDNfXyA+PiAxMiAmIDB4ZjsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmVW5wYWNrRmZEZWxCQVBhcmFtZXRlclNldC4gKi8KKworI2RlZmluZSBTaWdGZkRlbEJBUGFyYW1ldGVyU2V0ICggMHgwMDBjICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZkRpYWxvZ1Rva2VuKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAqcERzdCkKK3sKKyAgICBwRHN0LT50b2tlbiA9ICpwQnVmOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tGZkRpYWxvZ1Rva2VuLiAqLworCisjZGVmaW5lIFNpZ0ZmRGlhbG9nVG9rZW4gKCAweDAwMGQgKQorCit2b2lkIGRvdDExZlVucGFja0ZmTGlua01hcmdpbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZkxpbmtNYXJnaW4gKnBEc3QpCit7CisgICAgcERzdC0+bGlua01hcmdpbiA9ICpwQnVmOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tGZkxpbmtNYXJnaW4uICovCisKKyNkZWZpbmUgU2lnRmZMaW5rTWFyZ2luICggMHgwMDBlICkKKworI2RlZmluZSBTaWdGZkxpc3RlbkludGVydmFsICggMHgwMDBmICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZk1heFR4UG93ZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZNYXhUeFBvd2VyICpwRHN0KQoreworICAgIHBEc3QtPm1heFR4UG93ZXIgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmVW5wYWNrRmZNYXhUeFBvd2VyLiAqLworCisjZGVmaW5lIFNpZ0ZmTWF4VHhQb3dlciAoIDB4MDAxMCApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZOdW1PZlJlcGV0aXRpb25zKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmTnVtT2ZSZXBldGl0aW9ucyAqcERzdCkKK3sKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+cmVwZXRpdGlvbnMsIHBCdWYsIDApOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tGZk51bU9mUmVwZXRpdGlvbnMuICovCisKKyNkZWZpbmUgU2lnRmZOdW1PZlJlcGV0aXRpb25zICggMHgwMDExICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlAyUE9VSSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZQMlBPVUkgKnBEc3QpCit7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm91aSwgcEJ1ZiwgMCk7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlVucGFja0ZmUDJQT1VJLiAqLworCisjZGVmaW5lIFNpZ0ZmUDJQT1VJICggMHgwMDEyICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlAyUE9VSVN1YlR5cGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZQMlBPVUlTdWJUeXBlICpwRHN0KQoreworICAgIHBEc3QtPm91aVN1YnR5cGUgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmVW5wYWNrRmZQMlBPVUlTdWJUeXBlLiAqLworCisjZGVmaW5lIFNpZ0ZmUDJQT1VJU3ViVHlwZSAoIDB4MDAxMyApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZSQ1BJKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmUkNQSSAqcERzdCkKK3sKKyAgICBwRHN0LT5yY3BpID0gKnBCdWY7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlVucGFja0ZmUkNQSS4gKi8KKworI2RlZmluZSBTaWdGZlJDUEkgKCAweDAwMTQgKQorCit2b2lkIGRvdDExZlVucGFja0ZmUlNOSSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZlJTTkkgKnBEc3QpCit7CisgICAgcERzdC0+cnNuaSA9ICpwQnVmOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tGZlJTTkkuICovCisKKyNkZWZpbmUgU2lnRmZSU05JICggMHgwMDE1ICkKKworI2RlZmluZSBTaWdGZlJlYXNvbiAoIDB4MDAxNiApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZSeEFudGVubmFJZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmUnhBbnRlbm5hSWQgKnBEc3QpCit7CisgICAgcERzdC0+YW50ZW5uYUlkID0gKnBCdWY7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlVucGFja0ZmUnhBbnRlbm5hSWQuICovCisKKyNkZWZpbmUgU2lnRmZSeEFudGVubmFJZCAoIDB4MDAxNyApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZTTVBvd2VyTW9kZVNldCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmU01Qb3dlck1vZGVTZXQgKnBEc3QpCit7CisgICAgdEFOSV9VOCB0bXA0X187CisgICAgdG1wNF9fID0gKnBCdWY7CisgICAgcERzdC0+UG93ZXJTYXZlX0VuID0gdG1wNF9fID4+IDAgJiAweDE7CisgICAgcERzdC0+TW9kZSA9IHRtcDRfXyA+PiAxICYgMHgxOworICAgIHBEc3QtPnJlc2VydmVkID0gdG1wNF9fID4+IDIgJiAweDNmOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tGZlNNUG93ZXJNb2RlU2V0LiAqLworCisjZGVmaW5lIFNpZ0ZmU01Qb3dlck1vZGVTZXQgKCAweDAwMTggKQorCisjZGVmaW5lIFNpZ0ZmU3RhdHVzICggMHgwMDE5ICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlN0YXR1c0NvZGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZTdGF0dXNDb2RlICpwRHN0KQoreworICAgIHBEc3QtPnN0YXR1c0NvZGUgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmVW5wYWNrRmZTdGF0dXNDb2RlLiAqLworCisjZGVmaW5lIFNpZ0ZmU3RhdHVzQ29kZSAoIDB4MDAxYSApCisKK3ZvaWQgZG90MTFmVW5wYWNrRmZUUENFbGVJRCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmVFBDRWxlSUQgKnBEc3QpCit7CisgICAgcERzdC0+VFBDSWQgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmVW5wYWNrRmZUUENFbGVJRC4gKi8KKworI2RlZmluZSBTaWdGZlRQQ0VsZUlEICggMHgwMDFiICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlRQQ0VsZUxlbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZUUENFbGVMZW4gKnBEc3QpCit7CisgICAgcERzdC0+VFBDTGVuID0gKnBCdWY7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlVucGFja0ZmVFBDRWxlTGVuLiAqLworCisjZGVmaW5lIFNpZ0ZmVFBDRWxlTGVuICggMHgwMDFjICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlRTSW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZUU0luZm8gKnBEc3QpCit7CisgICAgdEFOSV9VMzIgdG1wNV9fOworICAgIGZyYW1lc250b2hsKHBDdHgsICZ0bXA1X18sIHBCdWYsIDApOworICAgIHBEc3QtPnRyYWZmaWNfdHlwZSA9IHRtcDVfXyA+PiAwICYgMHgxOworICAgIHBEc3QtPnRzaWQgPSB0bXA1X18gPj4gMSAmIDB4ZjsKKyAgICBwRHN0LT5kaXJlY3Rpb24gPSB0bXA1X18gPj4gNSAmIDB4MzsKKyAgICBwRHN0LT5hY2Nlc3NfcG9saWN5ID0gdG1wNV9fID4+IDcgJiAweDM7CisgICAgcERzdC0+YWdncmVnYXRpb24gPSB0bXA1X18gPj4gOSAmIDB4MTsKKyAgICBwRHN0LT5wc2IgPSB0bXA1X18gPj4gMTAgJiAweDE7CisgICAgcERzdC0+dXNlcl9wcmlvcml0eSA9IHRtcDVfXyA+PiAxMSAmIDB4NzsKKyAgICBwRHN0LT50c2luZm9fYWNrX3BvbCA9IHRtcDVfXyA+PiAxNCAmIDB4MzsKKyAgICBwRHN0LT5zY2hlZHVsZSA9IHRtcDVfXyA+PiAxNiAmIDB4MTsKKyAgICBwRHN0LT51bnVzZWQgPSB0bXA1X18gPj4gMTcgJiAweDdmZmY7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlVucGFja0ZmVFNJbmZvLiAqLworCisjZGVmaW5lIFNpZ0ZmVFNJbmZvICggMHgwMDFkICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlRpbWVTdGFtcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZUaW1lU3RhbXAgKnBEc3QpCit7CisgICAgZnJhbWVzbnRvaHEocEN0eCwgJnBEc3QtPnRpbWVzdGFtcCwgcEJ1ZiwgMCk7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlVucGFja0ZmVGltZVN0YW1wLiAqLworCisjZGVmaW5lIFNpZ0ZmVGltZVN0YW1wICggMHgwMDFlICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlR4QW50ZW5uYUlkKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZUeEFudGVubmFJZCAqcERzdCkKK3sKKyAgICBwRHN0LT5hbnRlbm5hSWQgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmVW5wYWNrRmZUeEFudGVubmFJZC4gKi8KKworI2RlZmluZSBTaWdGZlR4QW50ZW5uYUlkICggMHgwMDFmICkKKwordm9pZCBkb3QxMWZVbnBhY2tGZlR4UG93ZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZUeFBvd2VyICpwRHN0KQoreworICAgIHBEc3QtPnR4UG93ZXIgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmVW5wYWNrRmZUeFBvd2VyLiAqLworCisjZGVmaW5lIFNpZ0ZmVHhQb3dlciAoIDB4MDAyMCApCisKK3RBTklfVTMyIGRvdDExZlVucGFja1RsdkF1dGhvcml6ZWRNQUNzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVkF1dGhvcml6ZWRNQUNzICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+bWFjLCBwQnVmLCA2KTsKKyAgICBwQnVmICs9IDY7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTY7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrVGx2QXV0aG9yaXplZE1BQ3MuICovCisKKyNkZWZpbmUgU2lnVGx2QXV0aG9yaXplZE1BQ3MgKCAweDAwMDEgKQorCisKKyNkZWZpbmUgU2lnVGx2UmVxdWVzdFRvRW5yb2xsICggMHgwMDAyICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZWZXJzaW9uMih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UxNiB0bHZsZW4sIHREb3QxMWZUTFZWZXJzaW9uMiAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1U4IHRtcDZfXzsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICB0bXA2X18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09IDE7CisgICAgcERzdC0+bWlub3IgPSB0bXA2X18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5tYWpvciA9IHRtcDZfXyA+PiA0ICYgMHhmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja1RsdlZlcnNpb24yLiAqLworCisjZGVmaW5lIFNpZ1RsdlZlcnNpb24yICggMHgwMDAzICkKKworCisjZGVmaW5lIFNpZ1RsdkFQU2V0dXBMb2NrZWQgKCAweDAwMDQgKQorCisKKyNkZWZpbmUgU2lnVGx2QXNzb2NpYXRpb25TdGF0ZSAoIDB4MDAwNSApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2Q2hhbm5lbExpc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMTYgdGx2bGVuLCB0RG90MTFmVExWQ2hhbm5lbExpc3QgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5jb3VudHJ5U3RyaW5nLCBwQnVmLCAzKTsKKyAgICBwQnVmICs9IDM7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTM7CisgICAgcERzdC0+bnVtX2NoYW5uZWxMaXN0ID0gKHRBTklfVTgpKCB0bHZsZW4gKTsKKyAgICBpZiAodGx2bGVuID4gMjUxKXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5jaGFubmVsTGlzdCwgcEJ1ZiwgKCB0bHZsZW4gKSApOworICAgIHBCdWYgKz0gKCB0bHZsZW4gKTsKKyAgICB0bHZsZW4gLT0gKCB0bHZsZW4gKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZDaGFubmVsTGlzdC4gKi8KKworI2RlZmluZSBTaWdUbHZDaGFubmVsTGlzdCAoIDB4MDAwNiApCisKKworI2RlZmluZSBTaWdUbHZDb25maWdNZXRob2RzICggMHgwMDA3ICkKKworCisjZGVmaW5lIFNpZ1RsdkNvbmZpZ3VyYXRpb25FcnJvciAoIDB4MDAwOCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2Q29uZmlndXJhdGlvblRpbWVvdXQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMTYgdGx2bGVuLCB0RG90MTFmVExWQ29uZmlndXJhdGlvblRpbWVvdXQgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+R09Db25maWdUaW1lb3V0ID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPkNMQ29uZmlnVGltZW91dCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZDb25maWd1cmF0aW9uVGltZW91dC4gKi8KKworI2RlZmluZSBTaWdUbHZDb25maWd1cmF0aW9uVGltZW91dCAoIDB4MDAwOSApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2RGV2aWNlTmFtZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UxNiB0bHZsZW4sIHREb3QxMWZUTFZEZXZpY2VOYW1lICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPm51bV90ZXh0ID0gKHRBTklfVTgpKCB0bHZsZW4gKTsKKyAgICBpZiAodGx2bGVuID4gMzIpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnRleHQsIHBCdWYsICggdGx2bGVuICkgKTsKKyAgICBwQnVmICs9ICggdGx2bGVuICk7CisgICAgdGx2bGVuIC09ICggdGx2bGVuICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrVGx2RGV2aWNlTmFtZS4gKi8KKworI2RlZmluZSBTaWdUbHZEZXZpY2VOYW1lICggMHgwMDBhICkKKworCisjZGVmaW5lIFNpZ1RsdkRldmljZVBhc3N3b3JkSUQgKCAweDAwMGIgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5hdmFpbGliaWxpdHlQZXJpb2QsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YXZhaWxpYmlsaXR5SW50ZXJ2YWwsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZFeHRlbmRlZExpc3RlblRpbWluZy4gKi8KKworI2RlZmluZSBTaWdUbHZFeHRlbmRlZExpc3RlblRpbWluZyAoIDB4MDAwYyApCisKKworI2RlZmluZSBTaWdUbHZHT0ludGVudCAoIDB4MDAwZCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2SW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPlAyUEludGVyZmFjZUFkZHJlc3MsIHBCdWYsIDYpOworICAgIHBCdWYgKz0gNjsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpNjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MuICovCisKKyNkZWZpbmUgU2lnVGx2SW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzICggMHgwMDBlICkKKworCisjZGVmaW5lIFNpZ1Rsdkludml0YXRpb25GbGFncyAoIDB4MDAwZiApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2TGlzdGVuQ2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UxNiB0bHZsZW4sIHREb3QxMWZUTFZMaXN0ZW5DaGFubmVsICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+Y291bnRyeVN0cmluZywgcEJ1ZiwgMyk7CisgICAgcEJ1ZiArPSAzOworICAgIHRsdmxlbiAtPSAodEFOSV9VOCkzOworICAgIHBEc3QtPnJlZ3VsYXRvcnlDbGFzcyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5jaGFubmVsID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodEFOSV9VOCkxOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja1Rsdkxpc3RlbkNoYW5uZWwuICovCisKKyNkZWZpbmUgU2lnVGx2TGlzdGVuQ2hhbm5lbCAoIDB4MDAxMCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2TWFudWZhY3R1cmVyKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVk1hbnVmYWN0dXJlciAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5udW1fbmFtZSA9ICh0QU5JX1U4KSggdGx2bGVuICk7CisgICAgaWYgKHRsdmxlbiA+IDY0KXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5uYW1lLCBwQnVmLCAoIHRsdmxlbiApICk7CisgICAgcEJ1ZiArPSAoIHRsdmxlbiApOworICAgIHRsdmxlbiAtPSAoIHRsdmxlbiApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja1Rsdk1hbnVmYWN0dXJlci4gKi8KKworI2RlZmluZSBTaWdUbHZNYW51ZmFjdHVyZXIgKCAweDAwMTEgKQorCisKKyNkZWZpbmUgU2lnVGx2TWlub3JSZWFzb25Db2RlICggMHgwMDEyICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZNb2RlbE5hbWUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMTYgdGx2bGVuLCB0RG90MTFmVExWTW9kZWxOYW1lICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPm51bV90ZXh0ID0gKHRBTklfVTgpKCB0bHZsZW4gKTsKKyAgICBpZiAodGx2bGVuID4gMzIpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnRleHQsIHBCdWYsICggdGx2bGVuICkgKTsKKyAgICBwQnVmICs9ICggdGx2bGVuICk7CisgICAgdGx2bGVuIC09ICggdGx2bGVuICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrVGx2TW9kZWxOYW1lLiAqLworCisjZGVmaW5lIFNpZ1Rsdk1vZGVsTmFtZSAoIDB4MDAxMyApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2TW9kZWxOdW1iZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMTYgdGx2bGVuLCB0RG90MTFmVExWTW9kZWxOdW1iZXIgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+bnVtX3RleHQgPSAodEFOSV9VOCkoIHRsdmxlbiApOworICAgIGlmICh0bHZsZW4gPiAzMil7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+dGV4dCwgcEJ1ZiwgKCB0bHZsZW4gKSApOworICAgIHBCdWYgKz0gKCB0bHZsZW4gKTsKKyAgICB0bHZsZW4gLT0gKCB0bHZsZW4gKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZNb2RlbE51bWJlci4gKi8KKworI2RlZmluZSBTaWdUbHZNb2RlbE51bWJlciAoIDB4MDAxNCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2Tm90aWNlT2ZBYnNlbmNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5pbmRleCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5DVFNXaW5kb3dPcHBQUyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5udW1fTm9BRGVzYyA9ICh0QU5JX1U4KSggdGx2bGVuICk7CisgICAgaWYgKHRsdmxlbiA+IDM2KXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5Ob0FEZXNjLCBwQnVmLCAoIHRsdmxlbiApICk7CisgICAgcEJ1ZiArPSAoIHRsdmxlbiApOworICAgIHRsdmxlbiAtPSAoIHRsdmxlbiApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja1Rsdk5vdGljZU9mQWJzZW5jZS4gKi8KKworI2RlZmluZSBTaWdUbHZOb3RpY2VPZkFic2VuY2UgKCAweDAwMTUgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja1Rsdk9wZXJhdGluZ0NoYW5uZWwodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMTYgdGx2bGVuLCB0RG90MTFmVExWT3BlcmF0aW5nQ2hhbm5lbCAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmNvdW50cnlTdHJpbmcsIHBCdWYsIDMpOworICAgIHBCdWYgKz0gMzsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMzsKKyAgICBwRHN0LT5yZWd1bGF0b3J5Q2xhc3MgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+Y2hhbm5lbCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZPcGVyYXRpbmdDaGFubmVsLiAqLworCisjZGVmaW5lIFNpZ1Rsdk9wZXJhdGluZ0NoYW5uZWwgKCAweDAwMTYgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlAyUENhcGFiaWxpdHkodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMTYgdGx2bGVuLCB0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5kZXZpY2VDYXBhYmlsaXR5ID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPmdyb3VwQ2FwYWJpbGl0eSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZQMlBDYXBhYmlsaXR5LiAqLworCisjZGVmaW5lIFNpZ1RsdlAyUENhcGFiaWxpdHkgKCAweDAwMTcgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlAyUERldmljZUlkKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVlAyUERldmljZUlkICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+UDJQRGV2aWNlQWRkcmVzcywgcEJ1ZiwgNik7CisgICAgcEJ1ZiArPSA2OworICAgIHRsdmxlbiAtPSAodEFOSV9VOCk2OworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja1RsdlAyUERldmljZUlkLiAqLworCisjZGVmaW5lIFNpZ1RsdlAyUERldmljZUlkICggMHgwMDE4ICkKKworCisgICAgc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfUDJQRGV2aWNlSW5mb1tdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZlRMVlAyUERldmljZUluZm8sIERldmljZU5hbWUpLCBvZmZzZXRvZih0RG90MTFmVExWRGV2aWNlTmFtZSwgcHJlc2VudCksICJEZXZpY2VOYW1lIiwgU2lnVGx2RGV2aWNlTmFtZSwgRE9UMTFGX1RMVl9ERVZJQ0VOQU1FLCAwLCA0LCAzNiwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2UDJQRGV2aWNlSW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UxNiB0bHZsZW4sIHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+UDJQRGV2aWNlQWRkcmVzcywgcEJ1ZiwgNik7CisgICAgcEJ1ZiArPSA2OworICAgIHRsdmxlbiAtPSAodEFOSV9VOCk2OworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5jb25maWdNZXRob2QsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMjsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnByaW1hcnlEZXZpY2VUeXBlLCBwQnVmLCA4KTsKKyAgICBwQnVmICs9IDg7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTg7CisgICAgKHZvaWQpcEN0eDsKKyAgICBzdGF0dXMgfD0gVW5wYWNrVGx2Q29yZShwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRsdmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRMVlNfUDJQRGV2aWNlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VOCogKXBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnBEc3QpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrVGx2UDJQRGV2aWNlSW5mby4gKi8KKworI2RlZmluZSBTaWdUbHZQMlBEZXZpY2VJbmZvICggMHgwMDE5ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZQMlBHcm91cEJzc2lkKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVlAyUEdyb3VwQnNzaWQgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5QMlBHcm91cEJzc2lkLCBwQnVmLCA2KTsKKyAgICBwQnVmICs9IDY7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTY7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrVGx2UDJQR3JvdXBCc3NpZC4gKi8KKworI2RlZmluZSBTaWdUbHZQMlBHcm91cEJzc2lkICggMHgwMDFhICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZQMlBHcm91cElkKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVlAyUEdyb3VwSWQgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5kZXZpY2VBZGRyZXNzLCBwQnVmLCA2KTsKKyAgICBwQnVmICs9IDY7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTY7CisgICAgcERzdC0+bnVtX3NzaWQgPSAodEFOSV9VOCkoIHRsdmxlbiApOworICAgIGlmICh0bHZsZW4gPiAzMil7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+c3NpZCwgcEJ1ZiwgKCB0bHZsZW4gKSApOworICAgIHBCdWYgKz0gKCB0bHZsZW4gKTsKKyAgICB0bHZsZW4gLT0gKCB0bHZsZW4gKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZQMlBHcm91cElkLiAqLworCisjZGVmaW5lIFNpZ1RsdlAyUEdyb3VwSWQgKCAweDAwMWIgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlAyUEdyb3VwSW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UxNiB0bHZsZW4sIHREb3QxMWZUTFZQMlBHcm91cEluZm8gKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+bnVtX1AyUENsaWVudEluZm9EZXNjID0gKHRBTklfVTgpKCB0bHZsZW4gKTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPlAyUENsaWVudEluZm9EZXNjLCBwQnVmLCAoIHRsdmxlbiApICk7CisgICAgcEJ1ZiArPSAoIHRsdmxlbiApOworICAgIHRsdmxlbiAtPSAoIHRsdmxlbiApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja1RsdlAyUEdyb3VwSW5mby4gKi8KKworI2RlZmluZSBTaWdUbHZQMlBHcm91cEluZm8gKCAweDAwMWMgKQorCisKKyNkZWZpbmUgU2lnVGx2UDJQU3RhdHVzICggMHgwMDFkICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZQcmltYXJ5RGV2aWNlVHlwZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UxNiB0bHZsZW4sIHREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZCl0bHZsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+cHJpbWFyeV9jYXRlZ29yeSwgcEJ1ZiwgMSk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodEFOSV9VOCkyOworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+b3VpLCBwQnVmLCA0KTsKKyAgICBwQnVmICs9IDQ7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnN1Yl9jYXRlZ29yeSwgcEJ1ZiwgMSk7CisgICAgcEJ1ZiArPSAyOworICAgIHRsdmxlbiAtPSAodEFOSV9VOCkyOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja1RsdlByaW1hcnlEZXZpY2VUeXBlLiAqLworCisjZGVmaW5lIFNpZ1RsdlByaW1hcnlEZXZpY2VUeXBlICggMHgwMDFlICkKKworCisjZGVmaW5lIFNpZ1RsdlJGQmFuZHMgKCAweDAwMWYgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlJlcXVlc3REZXZpY2VUeXBlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5wcmltYXJ5X2NhdGVnb3J5LCBwQnVmLCAxKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTI7CisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5vdWksIHBCdWYsIDQpOworICAgIHBCdWYgKz0gNDsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpNDsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+c3ViX2NhdGVnb3J5LCBwQnVmLCAxKTsKKyAgICBwQnVmICs9IDI7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTI7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrVGx2UmVxdWVzdERldmljZVR5cGUuICovCisKKyNkZWZpbmUgU2lnVGx2UmVxdWVzdERldmljZVR5cGUgKCAweDAwMjAgKQorCisKKyNkZWZpbmUgU2lnVGx2UmVxdWVzdFR5cGUgKCAweDAwMjEgKQorCisKKyNkZWZpbmUgU2lnVGx2UmVzcG9uc2VUeXBlICggMHgwMDIyICkKKworCisjZGVmaW5lIFNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyICggMHgwMDIzICkKKworCisjZGVmaW5lIFNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyAoIDB4MDAyNCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2U2VyaWFsTnVtYmVyKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVlNlcmlhbE51bWJlciAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5udW1fdGV4dCA9ICh0QU5JX1U4KSggdGx2bGVuICk7CisgICAgaWYgKHRsdmxlbiA+IDMyKXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT50ZXh0LCBwQnVmLCAoIHRsdmxlbiApICk7CisgICAgcEJ1ZiArPSAoIHRsdmxlbiApOworICAgIHRsdmxlbiAtPSAoIHRsdmxlbiApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja1RsdlNlcmlhbE51bWJlci4gKi8KKworI2RlZmluZSBTaWdUbHZTZXJpYWxOdW1iZXIgKCAweDAwMjUgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlVVSURfRSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UxNiB0bHZsZW4sIHREb3QxMWZUTFZVVUlEX0UgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT51dWlkLCBwQnVmLCAxNik7CisgICAgcEJ1ZiArPSAxNjsKKyAgICB0bHZsZW4gLT0gKHRBTklfVTgpMTY7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrVGx2VVVJRF9FLiAqLworCisjZGVmaW5lIFNpZ1RsdlVVSURfRSAoIDB4MDAyNiApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2VVVJRF9SKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVlVVSURfUiAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnV1aWQsIHBCdWYsIDE2KTsKKyAgICBwQnVmICs9IDE2OworICAgIHRsdmxlbiAtPSAodEFOSV9VOCkxNjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZVVUlEX1IuICovCisKKyNkZWZpbmUgU2lnVGx2VVVJRF9SICggMHgwMDI3ICkKKworCisgICAgc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfVmVuZG9yRXh0ZW5zaW9uW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uLCBWZXJzaW9uMiksIG9mZnNldG9mKHREb3QxMWZUTFZWZXJzaW9uMiwgcHJlc2VudCksICJWZXJzaW9uMiIsIFNpZ1RsdlZlcnNpb24yLCBET1QxMUZfVExWX1ZFUlNJT04yLCAwLCAzLCAzLCAwLCAxLCAxLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiwgQXV0aG9yaXplZE1BQ3MpLCBvZmZzZXRvZih0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MsIHByZXNlbnQpLCAiQXV0aG9yaXplZE1BQ3MiLCBTaWdUbHZBdXRob3JpemVkTUFDcywgRE9UMTFGX1RMVl9BVVRIT1JJWkVETUFDUywgMCwgOCwgOCwgMCwgMSwgMSwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24sIFJlcXVlc3RUb0Vucm9sbCksIG9mZnNldG9mKHREb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwsIHByZXNlbnQpLCAiUmVxdWVzdFRvRW5yb2xsIiwgU2lnVGx2UmVxdWVzdFRvRW5yb2xsLCBET1QxMUZfVExWX1JFUVVFU1RUT0VOUk9MTCwgMCwgMywgMywgMCwgMSwgMSwgMSwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVGx2VmVuZG9yRXh0ZW5zaW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnZlbmRvcklkLCBwQnVmLCAzKTsKKyAgICBwQnVmICs9IDM7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTM7CisgICAgKHZvaWQpcEN0eDsKKyAgICBzdGF0dXMgfD0gVW5wYWNrVGx2Q29yZShwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRsdmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRMVlNfVmVuZG9yRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgKCB0QU5JX1U4KiApcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZWZW5kb3JFeHRlbnNpb24uICovCisKKyNkZWZpbmUgU2lnVGx2VmVuZG9yRXh0ZW5zaW9uICggMHgwMDI4ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tUbHZWZXJzaW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTE2IHRsdmxlbiwgdERvdDExZlRMVlZlcnNpb24gKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VOCB0bXA3X187CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgdG1wN19fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIHRsdmxlbiAtPSAxOworICAgIHBEc3QtPm1pbm9yID0gdG1wN19fID4+IDAgJiAweGY7CisgICAgcERzdC0+bWFqb3IgPSB0bXA3X18gPj4gNCAmIDB4ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUbHZWZXJzaW9uLiAqLworCisjZGVmaW5lIFNpZ1RsdlZlcnNpb24gKCAweDAwMjkgKQorCisKKyNkZWZpbmUgU2lnVGx2V1BTU3RhdGUgKCAweDAwMmEgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja1RsdlAyUEludGVyZmFjZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UxNiB0bHZsZW4sIHREb3QxMWZUTFZQMlBJbnRlcmZhY2UgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5QMlBEZXZpY2VBZGRyZXNzLCBwQnVmLCA2KTsKKyAgICBwQnVmICs9IDY7CisgICAgdGx2bGVuIC09ICh0QU5JX1U4KTY7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrVGx2UDJQSW50ZXJmYWNlLiAqLworCisjZGVmaW5lIFNpZ1RsdlAyUEludGVyZmFjZSAoIDB4MDAyYiApCisKKworI2RlZmluZSBTaWdUbHZQMlBNYW5hZ2VhYmlsaXR5ICggMHgwMDJjICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUFQTmFtZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVBUE5hbWUgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+bnVtX25hbWUgPSAodEFOSV9VOCkoIGllbGVuICk7CisgICAgaWYgKGllbGVuID4gMzIpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPm5hbWUsIHBCdWYsICggaWVsZW4gKSApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llQVBOYW1lLiAqLworCisjZGVmaW5lIFNpZ0llQVBOYW1lICggMHgwMDAxICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUJQSW5kaWNhdG9yKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUJQSW5kaWNhdG9yICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPmluZGljYXRvciA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPnR5cGUgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZUJQSW5kaWNhdG9yLiAqLworCisjZGVmaW5lIFNpZ0llQlBJbmRpY2F0b3IgKCAweDAwMDIgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llQ29uZGVuc2VkQ291bnRyeVN0cih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+Y291bnRyeVN0ciwgcEJ1ZiwgMik7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVDb25kZW5zZWRDb3VudHJ5U3RyLiAqLworCisjZGVmaW5lIFNpZ0llQ29uZGVuc2VkQ291bnRyeVN0ciAoIDB4MDAwMyApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVHVEsodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFR1RLICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTE2IHRtcDhfXzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmdG1wOF9fLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gMjsKKyAgICBwRHN0LT5rZXlJZCA9IHRtcDhfXyA+PiAwICYgMHgzOworICAgIHBEc3QtPnJlc2VydmVkID0gdG1wOF9fID4+IDIgJiAweDNmZWI7CisgICAgcERzdC0+a2V5TGVuZ3RoID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5SU0MsIHBCdWYsIDgpOworICAgIHBCdWYgKz0gODsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk4OworICAgIHBEc3QtPm51bV9rZXkgPSAodEFOSV9VOCkoIGllbGVuICk7CisgICAgaWYgKGllbGVuID4gMzIpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmtleSwgcEJ1ZiwgKCBpZWxlbiApICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVHVEsuICovCisKKyNkZWZpbmUgU2lnSWVHVEsgKCAweDAwMDQgKQorCisKKyNkZWZpbmUgU2lnSWVIQ0YgKCAweDAwMDUgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llTExBdHRyKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUxMQXR0ciAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+ZGVmZXJfdGhyZXNob2xkLCBwQnVmLCAxKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZUxMQXR0ci4gKi8KKworI2RlZmluZSBTaWdJZUxMQXR0ciAoIDB4MDAwNiApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVMb2FkQmFsYW5jZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVMb2FkQmFsYW5jZSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmJzc2lkLCBwQnVmLCA2KTsKKyAgICBwQnVmICs9IDY7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpNjsKKyAgICBwRHN0LT5jaGFubmVsID0gKnBCdWY7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVMb2FkQmFsYW5jZS4gKi8KKworI2RlZmluZSBTaWdJZUxvYWRCYWxhbmNlICggMHgwMDA3ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUxvYWRJbmZvKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUxvYWRJbmZvICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5udW1fc3RhcywgcEJ1ZiwgMSk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmNoYW5uZWxfdXRpbCwgcEJ1ZiwgMSk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVMb2FkSW5mby4gKi8KKworI2RlZmluZSBTaWdJZUxvYWRJbmZvICggMHgwMDA4ICkKKworCisjZGVmaW5lIFNpZ0llUHJvcEFzc29jVHlwZSAoIDB4MDAwOSApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQcm9wQ2FwYWJpbGl0eSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQcm9wQ2FwYWJpbGl0eSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y2FwYWJpbGl0eSwgcEJ1ZiwgMCk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVQcm9wQ2FwYWJpbGl0eS4gKi8KKworI2RlZmluZSBTaWdJZVByb3BDYXBhYmlsaXR5ICggMHgwMDBhICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVByb3BDaGFublN3aXRjaEFubih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQcm9wQ2hhbm5Td2l0Y2hBbm4gKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+bW9kZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPnByaW1hcnlfY2hhbm5lbCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPnN1Yl9iYW5kID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+Y2hhbm5lbF9zd2l0Y2hfY291bnQgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVByb3BDaGFublN3aXRjaEFubi4gKi8KKworI2RlZmluZSBTaWdJZVByb3BDaGFublN3aXRjaEFubiAoIDB4MDAwYiApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQcm9wRURDQVBhcmFtcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQcm9wRURDQVBhcmFtcyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1U4IHRtcDlfXzsKKyAgICB0QU5JX1U4IHRtcDEwX187CisgICAgdEFOSV9VOCB0bXAxMV9fOworICAgIHRBTklfVTggdG1wMTJfXzsKKyAgICB0QU5JX1U4IHRtcDEzX187CisgICAgdEFOSV9VOCB0bXAxNF9fOworICAgIHRBTklfVTggdG1wMTVfXzsKKyAgICB0QU5JX1U4IHRtcDE2X187CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+cW9zID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+cmVzZXJ2ZWQgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICB0bXA5X18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5hY2JlX2FpZnNuID0gdG1wOV9fID4+IDAgJiAweGY7CisgICAgcERzdC0+YWNiZV9hY20gPSB0bXA5X18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5hY2JlX2FjaSA9IHRtcDlfXyA+PiA1ICYgMHgzOworICAgIHBEc3QtPnVudXNlZDEgPSB0bXA5X18gPj4gNyAmIDB4MTsKKyAgICB0bXAxMF9fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+YWNiZV9taW4gPSB0bXAxMF9fID4+IDAgJiAweGY7CisgICAgcERzdC0+YWNiZV9tYXggPSB0bXAxMF9fID4+IDQgJiAweGY7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmFjYmVfdHhvcGxpbWl0LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICB0bXAxMV9fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+YWNia19haWZzbiA9IHRtcDExX18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5hY2JrX2FjbSA9IHRtcDExX18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5hY2JrX2FjaSA9IHRtcDExX18gPj4gNSAmIDB4MzsKKyAgICBwRHN0LT51bnVzZWQyID0gdG1wMTFfXyA+PiA3ICYgMHgxOworICAgIHRtcDEyX18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5hY2JrX21pbiA9IHRtcDEyX18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5hY2JrX21heCA9IHRtcDEyX18gPj4gNCAmIDB4ZjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YWNia190eG9wbGltaXQsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgIHRtcDEzX18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5hY3ZpX2FpZnNuID0gdG1wMTNfXyA+PiAwICYgMHhmOworICAgIHBEc3QtPmFjdmlfYWNtID0gdG1wMTNfXyA+PiA0ICYgMHgxOworICAgIHBEc3QtPmFjdmlfYWNpID0gdG1wMTNfXyA+PiA1ICYgMHgzOworICAgIHBEc3QtPnVudXNlZDMgPSB0bXAxM19fID4+IDcgJiAweDE7CisgICAgdG1wMTRfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPmFjdmlfbWluID0gdG1wMTRfXyA+PiAwICYgMHhmOworICAgIHBEc3QtPmFjdmlfbWF4ID0gdG1wMTRfXyA+PiA0ICYgMHhmOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5hY3ZpX3R4b3BsaW1pdCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgdG1wMTVfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPmFjdm9fYWlmc24gPSB0bXAxNV9fID4+IDAgJiAweGY7CisgICAgcERzdC0+YWN2b19hY20gPSB0bXAxNV9fID4+IDQgJiAweDE7CisgICAgcERzdC0+YWN2b19hY2kgPSB0bXAxNV9fID4+IDUgJiAweDM7CisgICAgcERzdC0+dW51c2VkNCA9IHRtcDE1X18gPj4gNyAmIDB4MTsKKyAgICB0bXAxNl9fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+YWN2b19taW4gPSB0bXAxNl9fID4+IDAgJiAweGY7CisgICAgcERzdC0+YWN2b19tYXggPSB0bXAxNl9fID4+IDQgJiAweGY7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmFjdm9fdHhvcGxpbWl0LCBwQnVmLCAwKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVByb3BFRENBUGFyYW1zLiAqLworCisjZGVmaW5lIFNpZ0llUHJvcEVEQ0FQYXJhbXMgKCAweDAwMGMgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUHJvcFF1aWV0QlNTKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVByb3BRdWlldEJTUyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5xdWlldF9jb3VudCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPnF1aWV0X3BlcmlvZCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5xdWlldF9kdXJhdGlvbiwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnF1aWV0X29mZnNldCwgcEJ1ZiwgMCk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVQcm9wUXVpZXRCU1MuICovCisKKyNkZWZpbmUgU2lnSWVQcm9wUXVpZXRCU1MgKCAweDAwMGQgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUHJvcFN1cHBSYXRlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQcm9wU3VwcFJhdGVzICpwRHN0KQoreworICAgIHRBTklfVTggaTsKKyAgICB0QU5JX1U4IHJhdGVfaW5keCA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IGllbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKChET1QxMUZfSVNfQkdfUkFURShwQnVmW2ldICYgMHg3RikpICYmIAorICAgICAgICAgICAgKHJhdGVfaW5keCA8IDEyKSkgeworICAgICAgICAgICAgcERzdC0+cmF0ZXNbcmF0ZV9pbmR4KytdID0gcEJ1ZltpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHJhdGVfaW5keCA9PSAwKSB7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIHBEc3QtPm51bV9yYXRlcyA9IHJhdGVfaW5keDsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVByb3BTdXBwUmF0ZXMuICovCisKKyNkZWZpbmUgU2lnSWVQcm9wU3VwcFJhdGVzICggMHgwMDBlICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVIwS0hfSUQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUjBLSF9JRCAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5udW1fUE1LX1IwX0lEID0gKHRBTklfVTgpKCBpZWxlbiApOworICAgIGlmIChpZWxlbiA+IDQ4KXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5QTUtfUjBfSUQsIHBCdWYsICggaWVsZW4gKSApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUjBLSF9JRC4gKi8KKworI2RlZmluZSBTaWdJZVIwS0hfSUQgKCAweDAwMGYgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUjFLSF9JRCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVSMUtIX0lEICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+UE1LX1IxX0lELCBwQnVmLCA2KTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVIxS0hfSUQuICovCisKKyNkZWZpbmUgU2lnSWVSMUtIX0lEICggMHgwMDEwICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVRTRkluZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFVFNGSW5mbyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+VHNmT2Zmc2V0LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+QmVhY29uSW50dmwsIHBCdWYsIDApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llVFNGSW5mby4gKi8KKworI2RlZmluZSBTaWdJZVRTRkluZm8gKCAweDAwMTEgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llVGF1cnVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVRhdXJ1cyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1UxNiB0bXAxN19fOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5iYVRJREJpdG1hcCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmJhUG9saWN5LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmdG1wMTdfXywgcEJ1ZiwgMCk7CisgICAgcERzdC0+YmFCdWZmZXJTaXplID0gdG1wMTdfXyA+PiAwICYgMHhmZmY7CisgICAgcERzdC0+cnN2ZCA9IHRtcDE3X18gPj4gMTIgJiAweGY7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVUYXVydXMuICovCisKKyNkZWZpbmUgU2lnSWVUYXVydXMgKCAweDAwMTIgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llVGl0YW4odHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFVGl0YW4gKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+Y29uY2F0X3RjaWRfYml0bWFwID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+Y29tcHJlc3Npb25fdGNpZF9iaXRtYXAgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5jYl9zdGF0ZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPnJldl9mY3Nfc3RhdGUgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVRpdGFuLiAqLworCisjZGVmaW5lIFNpZ0llVGl0YW4gKCAweDAwMTMgKQorCisKKyNkZWZpbmUgU2lnSWVUcmlnZ2VyU3RhQmdTY2FuICggMHgwMDE0ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVZlcnNpb24odHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFVmVyc2lvbiAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+Y2hpcF9yZXYsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIHBEc3QtPmNhcmRfdHlwZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPm51bV9idWlsZF92ZXJzaW9uID0gKHRBTklfVTgpKCBpZWxlbiApOworICAgIGlmIChpZWxlbiA+IDIwKXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5idWlsZF92ZXJzaW9uLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVZlcnNpb24uICovCisKKyNkZWZpbmUgU2lnSWVWZXJzaW9uICggMHgwMDE1ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdEUyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVXRFMgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+bnVtX3dkc0RhdGEgPSAodEFOSV9VOCkoIGllbGVuICk7CisgICAgaWYgKGllbGVuID4gNjQpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPndkc0RhdGEsIHBCdWYsICggaWVsZW4gKSApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llV0RTLiAqLworCisjZGVmaW5lIFNpZ0llV0RTICggMHgwMDE2ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUFQQ2hhbm5lbFJlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+cmVndWxhdG9yeUNsYXNzID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+bnVtX2NoYW5uZWxMaXN0ID0gKHRBTklfVTgpKCBpZWxlbiApOworICAgIGlmIChpZWxlbiA+IDUwKXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5jaGFubmVsTGlzdCwgcEJ1ZiwgKCBpZWxlbiApICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVBUENoYW5uZWxSZXBvcnQuICovCisKKyNkZWZpbmUgU2lnSWVBUENoYW5uZWxSZXBvcnQgKCAweDAwMTcgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llQmNuUmVwb3J0aW5nRGV0YWlsKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUJjblJlcG9ydGluZ0RldGFpbCAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5yZXBvcnRpbmdEZXRhaWwgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZUJjblJlcG9ydGluZ0RldGFpbC4gKi8KKworI2RlZmluZSBTaWdJZUJjblJlcG9ydGluZ0RldGFpbCAoIDB4MDAxOCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVCZWFjb25SZXBvcnRGcm1Cb2R5KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUJlYWNvblJlcG9ydEZybUJvZHkgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+bnVtX3JlcG9ydGVkRmllbGRzID0gKHRBTklfVTgpKCBpZWxlbiApOworICAgIGlmIChpZWxlbiA+IDIyNCl7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+cmVwb3J0ZWRGaWVsZHMsIHBCdWYsICggaWVsZW4gKSApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llQmVhY29uUmVwb3J0RnJtQm9keS4gKi8KKworI2RlZmluZSBTaWdJZUJlYWNvblJlcG9ydEZybUJvZHkgKCAweDAwMTkgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llQmVhY29uUmVwb3J0aW5nKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUJlYWNvblJlcG9ydGluZyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5yZXBvcnRpbmdDb25kaXRpb24gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT50aHJlc2hvbGQgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZUJlYWNvblJlcG9ydGluZy4gKi8KKworI2RlZmluZSBTaWdJZUJlYWNvblJlcG9ydGluZyAoIDB4MDAxYSApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVNZWFzdXJlbWVudFBpbG90KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+bWVhc3VyZW1lbnRQaWxvdCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPm51bV92ZW5kb3JTcGVjaWZpYyA9ICh0QU5JX1U4KSggaWVsZW4gKTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnZlbmRvclNwZWNpZmljLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZU1lYXN1cmVtZW50UGlsb3QuICovCisKKyNkZWZpbmUgU2lnSWVNZWFzdXJlbWVudFBpbG90ICggMHgwMDFiICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZU11bHRpQnNzaWQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFTXVsdGlCc3NpZCAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5tYXhCU1NJREluZGljYXRvciA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPm51bV92ZW5kb3JTcGVjaWZpYyA9ICh0QU5JX1U4KSggaWVsZW4gKTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnZlbmRvclNwZWNpZmljLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZU11bHRpQnNzaWQuICovCisKKyNkZWZpbmUgU2lnSWVNdWx0aUJzc2lkICggMHgwMDFjICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVJJQ0RhdGEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUklDRGF0YSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5JZGVudGlmaWVyID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+cmVzb3VyY2VEZXNjQ291bnQgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+c3RhdHVzQ29kZSwgcEJ1ZiwgMCk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVSSUNEYXRhLiAqLworCisjZGVmaW5lIFNpZ0llUklDRGF0YSAoIDB4MDAxZCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVSSUNEZXNjcmlwdG9yKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+cmVzb3VyY2VUeXBlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+bnVtX3ZhcmlhYmxlRGF0YSA9ICh0QU5JX1U4KSggaWVsZW4gKTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnZhcmlhYmxlRGF0YSwgcEJ1ZiwgKCBpZWxlbiApICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVSSUNEZXNjcmlwdG9yLiAqLworCisjZGVmaW5lIFNpZ0llUklDRGVzY3JpcHRvciAoIDB4MDAxZSApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVSUk1FbmFibGVkQ2FwKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVJSTUVuYWJsZWRDYXAgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VOCB0bXAxOF9fOworICAgIHRBTklfVTggdG1wMTlfXzsKKyAgICB0QU5JX1U4IHRtcDIwX187CisgICAgdEFOSV9VOCB0bXAyMV9fOworICAgIHRBTklfVTggdG1wMjJfXzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICB0bXAxOF9fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+TGlua01lYXN1cmVtZW50ID0gdG1wMThfXyA+PiAwICYgMHgxOworICAgIHBEc3QtPk5laWdoYm9yUnB0ID0gdG1wMThfXyA+PiAxICYgMHgxOworICAgIHBEc3QtPnBhcmFsbGVsID0gdG1wMThfXyA+PiAyICYgMHgxOworICAgIHBEc3QtPnJlcGVhdGVkID0gdG1wMThfXyA+PiAzICYgMHgxOworICAgIHBEc3QtPkJlYWNvblBhc3NpdmUgPSB0bXAxOF9fID4+IDQgJiAweDE7CisgICAgcERzdC0+QmVhY29uQWN0aXZlID0gdG1wMThfXyA+PiA1ICYgMHgxOworICAgIHBEc3QtPkJlYWNvblRhYmxlID0gdG1wMThfXyA+PiA2ICYgMHgxOworICAgIHBEc3QtPkJlYWNvblJlcENvbmQgPSB0bXAxOF9fID4+IDcgJiAweDE7CisgICAgdG1wMTlfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPkZyYW1lTWVhc3VyZW1lbnQgPSB0bXAxOV9fID4+IDAgJiAweDE7CisgICAgcERzdC0+Q2hhbm5lbExvYWQgPSB0bXAxOV9fID4+IDEgJiAweDE7CisgICAgcERzdC0+Tm9pc2VIaXN0b2dyYW0gPSB0bXAxOV9fID4+IDIgJiAweDE7CisgICAgcERzdC0+c3RhdGlzdGljcyA9IHRtcDE5X18gPj4gMyAmIDB4MTsKKyAgICBwRHN0LT5MQ0lNZWFzdXJlbWVudCA9IHRtcDE5X18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5MQ0lBemltdXRoID0gdG1wMTlfXyA+PiA1ICYgMHgxOworICAgIHBEc3QtPlRDTUNhcGFiaWxpdHkgPSB0bXAxOV9fID4+IDYgJiAweDE7CisgICAgcERzdC0+dHJpZ2dlcmVkVENNID0gdG1wMTlfXyA+PiA3ICYgMHgxOworICAgIHRtcDIwX18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5BUENoYW5SZXBvcnQgPSB0bXAyMF9fID4+IDAgJiAweDE7CisgICAgcERzdC0+UlJNTUlCRW5hYmxlZCA9IHRtcDIwX18gPj4gMSAmIDB4MTsKKyAgICBwRHN0LT5vcGVyYXRpbmdDaGFuTWF4ID0gdG1wMjBfXyA+PiAyICYgMHg3OworICAgIHBEc3QtPm5vbk9wZXJhdGluQ2hhbk1heCA9IHRtcDIwX18gPj4gNSAmIDB4NzsKKyAgICB0bXAyMV9fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+TWVhc3VyZW1lbnRQaWxvdCA9IHRtcDIxX18gPj4gMCAmIDB4NzsKKyAgICBwRHN0LT5NZWFzdXJlbWVudFBpbG90RW5hYmxlZCA9IHRtcDIxX18gPj4gMyAmIDB4MTsKKyAgICBwRHN0LT5OZWlnaGJvclRTRk9mZnNldCA9IHRtcDIxX18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5SQ1BJTWVhc3VyZW1lbnQgPSB0bXAyMV9fID4+IDUgJiAweDE7CisgICAgcERzdC0+UlNOSU1lYXN1cmVtZW50ID0gdG1wMjFfXyA+PiA2ICYgMHgxOworICAgIHBEc3QtPkJzc0F2Z0FjY2Vzc0RlbGF5ID0gdG1wMjFfXyA+PiA3ICYgMHgxOworICAgIHRtcDIyX18gPSAqcEJ1ZjsKKyAgICBwRHN0LT5CU1NBdmFpbEFkbWlzc2lvbiA9IHRtcDIyX18gPj4gMCAmIDB4MTsKKyAgICBwRHN0LT5BbnRlbm5hSW5mb3JtYXRpb24gPSB0bXAyMl9fID4+IDEgJiAweDE7CisgICAgcERzdC0+cmVzZXJ2ZWQgPSB0bXAyMl9fID4+IDIgJiAweDNmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUlJNRW5hYmxlZENhcC4gKi8KKworI2RlZmluZSBTaWdJZVJSTUVuYWJsZWRDYXAgKCAweDAwMWYgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUmVxdWVzdGVkSW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVSZXF1ZXN0ZWRJbmZvICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPm51bV9yZXF1ZXN0ZWRfZWlkcyA9ICh0QU5JX1U4KSggaWVsZW4gKTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnJlcXVlc3RlZF9laWRzLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVJlcXVlc3RlZEluZm8uICovCisKKyNkZWZpbmUgU2lnSWVSZXF1ZXN0ZWRJbmZvICggMHgwMDIwICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVNTSUQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFU1NJRCAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPm51bV9zc2lkID0gKHRBTklfVTgpKCBpZWxlbiApOworICAgIGlmIChpZWxlbiA+IDMyKXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5zc2lkLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVNTSUQuICovCisKKyNkZWZpbmUgU2lnSWVTU0lEICggMHgwMDIxICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVNjaGVkdWxlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVNjaGVkdWxlICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTE2IHRtcDIzX187CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnRtcDIzX18sIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICBpZWxlbiAtPSAyOworICAgIHBEc3QtPmFnZ3JlZ2F0aW9uID0gdG1wMjNfXyA+PiAwICYgMHgxOworICAgIHBEc3QtPnRzaWQgPSB0bXAyM19fID4+IDEgJiAweGY7CisgICAgcERzdC0+ZGlyZWN0aW9uID0gdG1wMjNfXyA+PiA1ICYgMHgzOworICAgIHBEc3QtPnJlc2VydmVkID0gdG1wMjNfXyA+PiA3ICYgMHgxZmY7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPnNlcnZpY2Vfc3RhcnRfdGltZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPnNlcnZpY2VfaW50ZXJ2YWwsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5tYXhfc2VydmljZV9kdXIsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5zcGVjX2ludGVydmFsLCBwQnVmLCAwKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVNjaGVkdWxlLiAqLworCisjZGVmaW5lIFNpZ0llU2NoZWR1bGUgKCAweDAwMjIgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llVENMQVModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFVENMQVMgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+dXNlcl9wcmlvcml0eSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPmNsYXNzaWZpZXJfdHlwZSA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPmNsYXNzaWZpZXJfbWFzayA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHN3aXRjaCAocERzdC0+Y2xhc3NpZmllcl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIHBCdWYsIDYpOworICAgICAgICAgICAgcEJ1ZiArPSA2OworICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpNjsKKyAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+aW5mby5FdGhQYXJhbXMuZGVzdCwgcEJ1ZiwgNik7CisgICAgICAgICAgICBwQnVmICs9IDY7CisgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCk2OworICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmluZm8uRXRoUGFyYW1zLnR5cGUsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHBEc3QtPmluZm8uSXBQYXJhbXMudmVyc2lvbiA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgIHN3aXRjaCAocERzdC0+aW5mby5JcFBhcmFtcy52ZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNvdXJjZSwgcEJ1ZiwgNCk7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpNDsKKyAgICAgICAgICAgICAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIHBCdWYsIDQpOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCBwQnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgICAgICAgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIHBCdWYsIDApOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgICAgICAgICAgICAgICAgIHBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuRFNDUCA9ICpwQnVmOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgICAgICAgICAgICAgICAgIHBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucHJvdG8gPSAqcEJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgICAgICAgICBwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnJlc2VydmVkID0gKnBCdWY7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIHBCdWYsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTY7CisgICAgICAgICAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCBwQnVmLCAxNik7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTE2OworICAgICAgICAgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydCwgcEJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCBwQnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgcEJ1ZiwgMyk7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVUQ0xBUy4gKi8KKworI2RlZmluZSBTaWdJZVRDTEFTICggMHgwMDIzICkKKworCisjZGVmaW5lIFNpZ0llVENMQVNTUFJPQyAoIDB4MDAyNCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVUU0RlbGF5KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVRTRGVsYXkgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmRlbGF5LCBwQnVmLCAwKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVRTRGVsYXkuICovCisKKyNkZWZpbmUgU2lnSWVUU0RlbGF5ICggMHgwMDI1ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVRTUEVDKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVRTUEVDICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTE2IHRtcDI0X187CisgICAgdEFOSV9VOCB0bXAyNV9fOworICAgIHRBTklfVTE2IHRtcDI2X187CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnRtcDI0X18sIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICBpZWxlbiAtPSAyOworICAgIHBEc3QtPnRyYWZmaWNfdHlwZSA9IHRtcDI0X18gPj4gMCAmIDB4MTsKKyAgICBwRHN0LT50c2lkID0gdG1wMjRfXyA+PiAxICYgMHhmOworICAgIHBEc3QtPmRpcmVjdGlvbiA9IHRtcDI0X18gPj4gNSAmIDB4MzsKKyAgICBwRHN0LT5hY2Nlc3NfcG9saWN5ID0gdG1wMjRfXyA+PiA3ICYgMHgzOworICAgIHBEc3QtPmFnZ3JlZ2F0aW9uID0gdG1wMjRfXyA+PiA5ICYgMHgxOworICAgIHBEc3QtPnBzYiA9IHRtcDI0X18gPj4gMTAgJiAweDE7CisgICAgcERzdC0+dXNlcl9wcmlvcml0eSA9IHRtcDI0X18gPj4gMTEgJiAweDc7CisgICAgcERzdC0+dHNpbmZvX2Fja19wb2wgPSB0bXAyNF9fID4+IDE0ICYgMHgzOworICAgIHRtcDI1X18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5zY2hlZHVsZSA9IHRtcDI1X18gPj4gMCAmIDB4MTsKKyAgICBwRHN0LT51bnVzZWQgPSB0bXAyNV9fID4+IDEgJiAweDdmOworICAgIGZyYW1lc250b2hzKHBDdHgsICZ0bXAyNl9fLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gMjsKKyAgICBwRHN0LT5zaXplID0gdG1wMjZfXyA+PiAwICYgMHg3ZmZmOworICAgIHBEc3QtPmZpeGVkID0gdG1wMjZfXyA+PiAxNSAmIDB4MTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWF4X21zZHVfc2l6ZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm1pbl9zZXJ2aWNlX2ludCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm1heF9zZXJ2aWNlX2ludCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmluYWN0aXZpdHlfaW50LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDQ7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpNDsKKyAgICBmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+c3VzcGVuc2lvbl9pbnQsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5zZXJ2aWNlX3N0YXJ0X3RpbWUsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5taW5fZGF0YV9yYXRlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDQ7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpNDsKKyAgICBmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+bWVhbl9kYXRhX3JhdGUsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5wZWFrX2RhdGFfcmF0ZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmJ1cnN0X3NpemUsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5kZWxheV9ib3VuZCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm1pbl9waHlfcmF0ZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnN1cnBsdXNfYndfYWxsb3dhbmNlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWVkaXVtX3RpbWUsIHBCdWYsIDApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llVFNQRUMuICovCisKKyNkZWZpbmUgU2lnSWVUU1BFQyAoIDB4MDAyNiApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXTU1TY2hlZHVsZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVXTU1TY2hlZHVsZSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1UxNiB0bXAyN19fOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnZlcnNpb24gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBpZiAocERzdC0+dmVyc2lvbiAhPSAweDEpCisgICAgeworICAgICAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gKCBzdGF0dXMgfCBET1QxMUZfQkFEX0ZJWEVEX1ZBTFVFICk7CisgICAgfQorICAgIGZyYW1lc250b2hzKHBDdHgsICZ0bXAyN19fLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gMjsKKyAgICBwRHN0LT5hZ2dyZWdhdGlvbiA9IHRtcDI3X18gPj4gMCAmIDB4MTsKKyAgICBwRHN0LT50c2lkID0gdG1wMjdfXyA+PiAxICYgMHhmOworICAgIHBEc3QtPmRpcmVjdGlvbiA9IHRtcDI3X18gPj4gNSAmIDB4MzsKKyAgICBwRHN0LT5yZXNlcnZlZCA9IHRtcDI3X18gPj4gNyAmIDB4MWZmOworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5zZXJ2aWNlX3N0YXJ0X3RpbWUsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5zZXJ2aWNlX2ludGVydmFsLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDQ7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpNDsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWF4X3NlcnZpY2VfZHVyLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+c3BlY19pbnRlcnZhbCwgcEJ1ZiwgMCk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVXTU1TY2hlZHVsZS4gKi8KKworI2RlZmluZSBTaWdJZVdNTVNjaGVkdWxlICggMHgwMDI3ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdNTVRDTEFTKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVdNTVRDTEFTICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnZlcnNpb24gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBpZiAocERzdC0+dmVyc2lvbiAhPSAweDEpCisgICAgeworICAgICAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gKCBzdGF0dXMgfCBET1QxMUZfQkFEX0ZJWEVEX1ZBTFVFICk7CisgICAgfQorICAgIHBEc3QtPnVzZXJfcHJpb3JpdHkgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5jbGFzc2lmaWVyX3R5cGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5jbGFzc2lmaWVyX21hc2sgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBzd2l0Y2ggKHBEc3QtPmNsYXNzaWZpZXJfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+aW5mby5FdGhQYXJhbXMuc291cmNlLCBwQnVmLCA2KTsKKyAgICAgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTY7CisgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmluZm8uRXRoUGFyYW1zLmRlc3QsIHBCdWYsIDYpOworICAgICAgICAgICAgcEJ1ZiArPSA2OworICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpNjsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5pbmZvLkV0aFBhcmFtcy50eXBlLCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBwRHN0LT5pbmZvLklwUGFyYW1zLnZlcnNpb24gPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgICAgICAgICBzd2l0Y2ggKHBEc3QtPmluZm8uSXBQYXJhbXMudmVyc2lvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIHBCdWYsIDQpOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgICAgICAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCBwQnVmLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgICAgICAgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCwgcEJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCBwQnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgICAgICAgICAgICAgICAgICBwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AgPSAqcEJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgICAgICAgICBwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvID0gKnBCdWY7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgICAgICAgICAgcERzdC0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCA9ICpwQnVmOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc291cmNlLCBwQnVmLCAxNik7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTE2OworICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdCwgcEJ1ZiwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE2OworICAgICAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxNjsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIHBCdWYsIDApOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgcEJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICAgICAgICAgICAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmZsb3dfbGFiZWwsIHBCdWYsIDMpOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDM7CisgICAgICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+aW5mby5QYXJhbXM4MDIxZHEudGFnX3R5cGUsIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llV01NVENMQVMuICovCisKKyNkZWZpbmUgU2lnSWVXTU1UQ0xBUyAoIDB4MDAyOCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXTU1UQ0xBU1BST0ModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFV01NVENMQVNQUk9DICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnZlcnNpb24gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBpZiAocERzdC0+dmVyc2lvbiAhPSAweDEpCisgICAgeworICAgICAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gKCBzdGF0dXMgfCBET1QxMUZfQkFEX0ZJWEVEX1ZBTFVFICk7CisgICAgfQorICAgIHBEc3QtPnByb2Nlc3NpbmcgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVdNTVRDTEFTUFJPQy4gKi8KKworI2RlZmluZSBTaWdJZVdNTVRDTEFTUFJPQyAoIDB4MDAyOSApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXTU1UU0RlbGF5KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVdNTVRTRGVsYXkgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+dmVyc2lvbiA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIGlmIChwRHN0LT52ZXJzaW9uICE9IDB4MSkKKyAgICB7CisgICAgICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgICAgIHJldHVybiAoIHN0YXR1cyB8IERPVDExRl9CQURfRklYRURfVkFMVUUgKTsKKyAgICB9CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmRlbGF5LCBwQnVmLCAwKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVdNTVRTRGVsYXkuICovCisKKyNkZWZpbmUgU2lnSWVXTU1UU0RlbGF5ICggMHgwMDJhICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdNTVRTUEVDKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVdNTVRTUEVDICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTE2IHRtcDI4X187CisgICAgdEFOSV9VOCB0bXAyOV9fOworICAgIHRBTklfVTE2IHRtcDMwX187CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+dmVyc2lvbiA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIGlmIChwRHN0LT52ZXJzaW9uICE9IDB4MSkKKyAgICB7CisgICAgICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgICAgIHJldHVybiAoIHN0YXR1cyB8IERPVDExRl9CQURfRklYRURfVkFMVUUgKTsKKyAgICB9CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnRtcDI4X18sIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICBpZWxlbiAtPSAyOworICAgIHBEc3QtPnRyYWZmaWNfdHlwZSA9IHRtcDI4X18gPj4gMCAmIDB4MTsKKyAgICBwRHN0LT50c2lkID0gdG1wMjhfXyA+PiAxICYgMHhmOworICAgIHBEc3QtPmRpcmVjdGlvbiA9IHRtcDI4X18gPj4gNSAmIDB4MzsKKyAgICBwRHN0LT5hY2Nlc3NfcG9saWN5ID0gdG1wMjhfXyA+PiA3ICYgMHgzOworICAgIHBEc3QtPmFnZ3JlZ2F0aW9uID0gdG1wMjhfXyA+PiA5ICYgMHgxOworICAgIHBEc3QtPnBzYiA9IHRtcDI4X18gPj4gMTAgJiAweDE7CisgICAgcERzdC0+dXNlcl9wcmlvcml0eSA9IHRtcDI4X18gPj4gMTEgJiAweDc7CisgICAgcERzdC0+dHNpbmZvX2Fja19wb2wgPSB0bXAyOF9fID4+IDE0ICYgMHgzOworICAgIHRtcDI5X18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT50c2luZm9fcnN2ZCA9IHRtcDI5X18gPj4gMCAmIDB4N2Y7CisgICAgcERzdC0+YnVyc3Rfc2l6ZV9kZWZuID0gdG1wMjlfXyA+PiA3ICYgMHgxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZ0bXAzMF9fLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gMjsKKyAgICBwRHN0LT5zaXplID0gdG1wMzBfXyA+PiAwICYgMHg3ZmZmOworICAgIHBEc3QtPmZpeGVkID0gdG1wMzBfXyA+PiAxNSAmIDB4MTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWF4X21zZHVfc2l6ZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm1pbl9zZXJ2aWNlX2ludCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm1heF9zZXJ2aWNlX2ludCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmluYWN0aXZpdHlfaW50LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDQ7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpNDsKKyAgICBmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+c3VzcGVuc2lvbl9pbnQsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5zZXJ2aWNlX3N0YXJ0X3RpbWUsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5taW5fZGF0YV9yYXRlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDQ7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpNDsKKyAgICBmcmFtZXNudG9obChwQ3R4LCAmcERzdC0+bWVhbl9kYXRhX3JhdGUsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5wZWFrX2RhdGFfcmF0ZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPmJ1cnN0X3NpemUsIHBCdWYsIDApOworICAgIHBCdWYgKz0gNDsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk0OworICAgIGZyYW1lc250b2hsKHBDdHgsICZwRHN0LT5kZWxheV9ib3VuZCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPm1pbl9waHlfcmF0ZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnN1cnBsdXNfYndfYWxsb3dhbmNlLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWVkaXVtX3RpbWUsIHBCdWYsIDApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llV01NVFNQRUMuICovCisKKyNkZWZpbmUgU2lnSWVXTU1UU1BFQyAoIDB4MDAyYiApCisKKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19BaXJnb1sgXSA9IHsKKyAgICAgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19BaXJnb1sgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRUFpcmdvLCBQcm9wU3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFUHJvcFN1cHBSYXRlcywgcHJlc2VudCksIDAsICJQcm9wU3VwcFJhdGVzIiAsIDAsIDMsIDE0LCBTaWdJZVByb3BTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9QUk9QU1VQUFJBVEVTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFQWlyZ28sIEFQTmFtZSksIG9mZnNldG9mKHREb3QxMWZJRUFQTmFtZSwgcHJlc2VudCksIDAsICJBUE5hbWUiICwgMCwgMywgMzQsIFNpZ0llQVBOYW1lLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQVBOQU1FLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFQWlyZ28sIEhDRiksIG9mZnNldG9mKHREb3QxMWZJRUhDRiwgcHJlc2VudCksIDAsICJIQ0YiICwgMCwgMywgMywgU2lnSWVIQ0YsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9IQ0YsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgV0RTKSwgb2Zmc2V0b2YodERvdDExZklFV0RTLCBwcmVzZW50KSwgMCwgIldEUyIgLCAwLCAyLCA2NiwgU2lnSWVXRFMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9XRFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgQlBJbmRpY2F0b3IpLCBvZmZzZXRvZih0RG90MTFmSUVCUEluZGljYXRvciwgcHJlc2VudCksIDAsICJCUEluZGljYXRvciIgLCAwLCA0LCA0LCBTaWdJZUJQSW5kaWNhdG9yLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQlBJTkRJQ0FUT1IsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgTG9hZEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVMb2FkSW5mbywgcHJlc2VudCksIDAsICJMb2FkSW5mbyIgLCAwLCA2LCA2LCBTaWdJZUxvYWRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfTE9BRElORk8sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgTG9hZEJhbGFuY2UpLCBvZmZzZXRvZih0RG90MTFmSUVMb2FkQmFsYW5jZSwgcHJlc2VudCksIDAsICJMb2FkQmFsYW5jZSIgLCAwLCA5LCA5LCBTaWdJZUxvYWRCYWxhbmNlLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfTE9BREJBTEFOQ0UsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgUHJvcEFzc29jVHlwZSksIG9mZnNldG9mKHREb3QxMWZJRVByb3BBc3NvY1R5cGUsIHByZXNlbnQpLCAwLCAiUHJvcEFzc29jVHlwZSIgLCAwLCAzLCAzLCBTaWdJZVByb3BBc3NvY1R5cGUsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9QUk9QQVNTT0NUWVBFLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFQWlyZ28sIExMQXR0ciksIG9mZnNldG9mKHREb3QxMWZJRUxMQXR0ciwgcHJlc2VudCksIDAsICJMTEF0dHIiICwgMCwgNiwgNiwgU2lnSWVMTEF0dHIsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9MTEFUVFIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgUHJvcENhcGFiaWxpdHkpLCBvZmZzZXRvZih0RG90MTFmSUVQcm9wQ2FwYWJpbGl0eSwgcHJlc2VudCksIDAsICJQcm9wQ2FwYWJpbGl0eSIgLCAwLCA0LCA0LCBTaWdJZVByb3BDYXBhYmlsaXR5LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUFJPUENBUEFCSUxJVFksIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgVmVyc2lvbiksIG9mZnNldG9mKHREb3QxMWZJRVZlcnNpb24sIHByZXNlbnQpLCAwLCAiVmVyc2lvbiIgLCAwLCA3LCAyNywgU2lnSWVWZXJzaW9uLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVkVSU0lPTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRUFpcmdvLCBQcm9wRURDQVBhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRVByb3BFRENBUGFyYW1zLCBwcmVzZW50KSwgMCwgIlByb3BFRENBUGFyYW1zIiAsIDAsIDIwLCAyMCwgU2lnSWVQcm9wRURDQVBhcmFtcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1BST1BFRENBUEFSQU1TLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFQWlyZ28sIFRpdGFuKSwgb2Zmc2V0b2YodERvdDExZklFVGl0YW4sIHByZXNlbnQpLCAwLCAiVGl0YW4iICwgMCwgNiwgNiwgU2lnSWVUaXRhbiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1RJVEFOLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFQWlyZ28sIFByb3BDaGFublN3aXRjaEFubiksIG9mZnNldG9mKHREb3QxMWZJRVByb3BDaGFublN3aXRjaEFubiwgcHJlc2VudCksIDAsICJQcm9wQ2hhbm5Td2l0Y2hBbm4iICwgMCwgNiwgNiwgU2lnSWVQcm9wQ2hhbm5Td2l0Y2hBbm4sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9QUk9QQ0hBTk5TV0lUQ0hBTk4sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgUHJvcFF1aWV0QlNTKSwgb2Zmc2V0b2YodERvdDExZklFUHJvcFF1aWV0QlNTLCBwcmVzZW50KSwgMCwgIlByb3BRdWlldEJTUyIgLCAwLCA4LCA4LCBTaWdJZVByb3BRdWlldEJTUywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1BST1BRVUlFVEJTUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRUFpcmdvLCBUcmlnZ2VyU3RhQmdTY2FuKSwgb2Zmc2V0b2YodERvdDExZklFVHJpZ2dlclN0YUJnU2NhbiwgcHJlc2VudCksIDAsICJUcmlnZ2VyU3RhQmdTY2FuIiAsIDAsIDMsIDMsIFNpZ0llVHJpZ2dlclN0YUJnU2NhbiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1RSSUdHRVJTVEFCR1NDQU4sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgVGF1cnVzKSwgb2Zmc2V0b2YodERvdDExZklFVGF1cnVzLCBwcmVzZW50KSwgMCwgIlRhdXJ1cyIgLCAwLCA4LCA4LCBTaWdJZVRhdXJ1cywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1RBVVJVUywgMCwgfSwKKyAgICAgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwKKyAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUFpcmdvKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUFpcmdvICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgICh2b2lkKXBDdHg7CisgICAgc3RhdHVzIHw9IFVucGFja0NvcmUocEN0eCwKKyAgICAgICAgICAgICAgICAgICAgIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICBpZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgIEZGU19BaXJnbywKKyAgICAgICAgICAgICAgICAgICAgIElFU19BaXJnbywKKyAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VOCogKXBEc3QsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnBEc3QpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVBaXJnby4gKi8KKworI2RlZmluZSBTaWdJZUFpcmdvICggMHgwMDJjICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUNDWENja21PcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFQ0NYQ2NrbU9wYXF1ZSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5udW1fZGF0YSA9ICh0QU5JX1U4KSggaWVsZW4gKTsKKyAgICBpZiAoaWVsZW4gPiAyMCl7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+ZGF0YSwgcEJ1ZiwgKCBpZWxlbiApICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVDQ1hDY2ttT3BhcXVlLiAqLworCisjZGVmaW5lIFNpZ0llQ0NYQ2NrbU9wYXF1ZSAoIDB4MDAyZCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVDQ1hSYWRNZ210Q2FwKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUNDWFJhZE1nbXRDYXAgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VOCB0bXAzMV9fOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPm1nbXRfc3RhdGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICB0bXAzMV9fID0gKnBCdWY7CisgICAgcERzdC0+bWJzc2lkX21hc2sgPSB0bXAzMV9fID4+IDAgJiAweDc7CisgICAgcERzdC0+cmVzZXJ2ZWQgPSB0bXAzMV9fID4+IDMgJiAweDFmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llQ0NYUmFkTWdtdENhcC4gKi8KKworI2RlZmluZSBTaWdJZUNDWFJhZE1nbXRDYXAgKCAweDAwMmUgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llQ0NYVHJhZlN0cm1NZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFQ0NYVHJhZlN0cm1NZXQgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+dHNpZCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPnN0YXRlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm1zbXRfaW50ZXJ2YWwsIHBCdWYsIDApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llQ0NYVHJhZlN0cm1NZXQuICovCisKKyNkZWZpbmUgU2lnSWVDQ1hUcmFmU3RybU1ldCAoIDB4MDAyZiApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVDQ1hUcmFmU3RybVJhdGVTZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFQ0NYVHJhZlN0cm1SYXRlU2V0ICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnRzaWQgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5udW1fdHNyYXRlcyA9ICh0QU5JX1U4KSggaWVsZW4gKTsKKyAgICBpZiAoaWVsZW4gPiA4KXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT50c3JhdGVzLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZUNDWFRyYWZTdHJtUmF0ZVNldC4gKi8KKworI2RlZmluZSBTaWdJZUNDWFRyYWZTdHJtUmF0ZVNldCAoIDB4MDAzMCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVDQ1hUeG1pdFBvd2VyKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUNDWFR4bWl0UG93ZXIgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+cG93ZXJfbGltaXQgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5yZXNlcnZlZCA9ICpwQnVmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llQ0NYVHhtaXRQb3dlci4gKi8KKworI2RlZmluZSBTaWdJZUNDWFR4bWl0UG93ZXIgKCAweDAwMzEgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llQ0NYVmVyc2lvbih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVDQ1hWZXJzaW9uICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnZlcnNpb24gPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZUNDWFZlcnNpb24uICovCisKKyNkZWZpbmUgU2lnSWVDQ1hWZXJzaW9uICggMHgwMDMyICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUNGUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUNGUGFyYW1zICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPmNmcF9jb3VudCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPmNmcF9wZXJpb2QgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y2ZwX21heGR1cmF0aW9uLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y2ZwX2R1cnJlbWFpbmluZywgcEJ1ZiwgMCk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVDRlBhcmFtcy4gKi8KKworI2RlZmluZSBTaWdJZUNGUGFyYW1zICggMHgwMDMzICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUNoYWxsZW5nZVRleHQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFQ2hhbGxlbmdlVGV4dCAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5udW1fdGV4dCA9ICh0QU5JX1U4KSggaWVsZW4gKTsKKyAgICBpZiAoaWVsZW4gPiAyNTMpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnRleHQsIHBCdWYsICggaWVsZW4gKSApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llQ2hhbGxlbmdlVGV4dC4gKi8KKworI2RlZmluZSBTaWdJZUNoYWxsZW5nZVRleHQgKCAweDAwMzQgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llQ2hhblN3aXRjaEFubih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVDaGFuU3dpdGNoQW5uICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnN3aXRjaE1vZGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5uZXdDaGFubmVsID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+c3dpdGNoQ291bnQgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZUNoYW5Td2l0Y2hBbm4uICovCisKKyNkZWZpbmUgU2lnSWVDaGFuU3dpdGNoQW5uICggMHgwMDM1ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUNvdW50cnkodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFQ291bnRyeSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmNvdW50cnksIHBCdWYsIDMpOworICAgIHBCdWYgKz0gMzsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkzOworICAgIGlmICggISBpZWxlbiApCisgICAgeworICAgICAgICBwRHN0LT5udW1fdHJpcGxldHMgPSAwVTsKKyAgICAgICAgcmV0dXJuIDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRHN0LT5udW1fdHJpcGxldHMgPSAodEFOSV9VOCkoIGllbGVuIC8gMyApOworICAgICAgICBpZiAoaWVsZW4gLyAzID4gODQpeworICAgICAgICAgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgICAgIH0KKworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnRyaXBsZXRzLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVDb3VudHJ5LiAqLworCisjZGVmaW5lIFNpZ0llQ291bnRyeSAoIDB4MDAzNiApCisKKworI2RlZmluZSBTaWdJZURTUGFyYW1zICggMHgwMDM3ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUVEQ0FQYXJhbVNldCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVFRENBUGFyYW1TZXQgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VOCB0bXAzMl9fOworICAgIHRBTklfVTggdG1wMzNfXzsKKyAgICB0QU5JX1U4IHRtcDM0X187CisgICAgdEFOSV9VOCB0bXAzNV9fOworICAgIHRBTklfVTggdG1wMzZfXzsKKyAgICB0QU5JX1U4IHRtcDM3X187CisgICAgdEFOSV9VOCB0bXAzOF9fOworICAgIHRBTklfVTggdG1wMzlfXzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5xb3MgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5yZXNlcnZlZCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHRtcDMyX18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5hY2JlX2FpZnNuID0gdG1wMzJfXyA+PiAwICYgMHhmOworICAgIHBEc3QtPmFjYmVfYWNtID0gdG1wMzJfXyA+PiA0ICYgMHgxOworICAgIHBEc3QtPmFjYmVfYWNpID0gdG1wMzJfXyA+PiA1ICYgMHgzOworICAgIHBEc3QtPnVudXNlZDEgPSB0bXAzMl9fID4+IDcgJiAweDE7CisgICAgdG1wMzNfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPmFjYmVfYWN3bWluID0gdG1wMzNfXyA+PiAwICYgMHhmOworICAgIHBEc3QtPmFjYmVfYWN3bWF4ID0gdG1wMzNfXyA+PiA0ICYgMHhmOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5hY2JlX3R4b3BsaW1pdCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgdG1wMzRfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPmFjYmtfYWlmc24gPSB0bXAzNF9fID4+IDAgJiAweGY7CisgICAgcERzdC0+YWNia19hY20gPSB0bXAzNF9fID4+IDQgJiAweDE7CisgICAgcERzdC0+YWNia19hY2kgPSB0bXAzNF9fID4+IDUgJiAweDM7CisgICAgcERzdC0+dW51c2VkMiA9IHRtcDM0X18gPj4gNyAmIDB4MTsKKyAgICB0bXAzNV9fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+YWNia19hY3dtaW4gPSB0bXAzNV9fID4+IDAgJiAweGY7CisgICAgcERzdC0+YWNia19hY3dtYXggPSB0bXAzNV9fID4+IDQgJiAweGY7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmFjYmtfdHhvcGxpbWl0LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICB0bXAzNl9fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+YWN2aV9haWZzbiA9IHRtcDM2X18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5hY3ZpX2FjbSA9IHRtcDM2X18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5hY3ZpX2FjaSA9IHRtcDM2X18gPj4gNSAmIDB4MzsKKyAgICBwRHN0LT51bnVzZWQzID0gdG1wMzZfXyA+PiA3ICYgMHgxOworICAgIHRtcDM3X18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5hY3ZpX2Fjd21pbiA9IHRtcDM3X18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5hY3ZpX2Fjd21heCA9IHRtcDM3X18gPj4gNCAmIDB4ZjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YWN2aV90eG9wbGltaXQsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgIHRtcDM4X18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5hY3ZvX2FpZnNuID0gdG1wMzhfXyA+PiAwICYgMHhmOworICAgIHBEc3QtPmFjdm9fYWNtID0gdG1wMzhfXyA+PiA0ICYgMHgxOworICAgIHBEc3QtPmFjdm9fYWNpID0gdG1wMzhfXyA+PiA1ICYgMHgzOworICAgIHBEc3QtPnVudXNlZDQgPSB0bXAzOF9fID4+IDcgJiAweDE7CisgICAgdG1wMzlfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPmFjdm9fYWN3bWluID0gdG1wMzlfXyA+PiAwICYgMHhmOworICAgIHBEc3QtPmFjdm9fYWN3bWF4ID0gdG1wMzlfXyA+PiA0ICYgMHhmOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5hY3ZvX3R4b3BsaW1pdCwgcEJ1ZiwgMCk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVFRENBUGFyYW1TZXQuICovCisKKyNkZWZpbmUgU2lnSWVFRENBUGFyYW1TZXQgKCAweDAwMzggKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llRVJQSW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVFUlBJbmZvICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTggdG1wNDBfXzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICB0bXA0MF9fID0gKnBCdWY7CisgICAgcERzdC0+bm9uX2VycF9wcmVzZW50ID0gdG1wNDBfXyA+PiAwICYgMHgxOworICAgIHBEc3QtPnVzZV9wcm90ID0gdG1wNDBfXyA+PiAxICYgMHgxOworICAgIHBEc3QtPmJhcmtlcl9wcmVhbWJsZSA9IHRtcDQwX18gPj4gMiAmIDB4MTsKKyAgICBwRHN0LT51bnVzZWQgPSB0bXA0MF9fID4+IDMgJiAweDFmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llRVJQSW5mby4gKi8KKworI2RlZmluZSBTaWdJZUVSUEluZm8gKCAweDAwMzkgKQorCisKKyNkZWZpbmUgU2lnSWVFeHRDaGFuU3dpdGNoQW5uICggMHgwMDNhICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUV4dFN1cHBSYXRlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKnBEc3QpCit7CisgICAgdEFOSV9VOCBpOworICAgIHRBTklfVTggcmF0ZV9pbmR4ID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWVsZW47IGkrKykgeworICAgICAgICBpZiAoKERPVDExRl9JU19CR19SQVRFKHBCdWZbaV0gJiAweDdGKSkgJiYgCisgICAgICAgICAgICAocmF0ZV9pbmR4IDwgMTIpKSB7CisgICAgICAgICAgICBwRHN0LT5yYXRlc1tyYXRlX2luZHgrK10gPSBwQnVmW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocmF0ZV9pbmR4ID09IDApIHsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgcERzdC0+bnVtX3JhdGVzID0gcmF0ZV9pbmR4OworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llRXh0U3VwcFJhdGVzLiAqLworCisjZGVmaW5lIFNpZ0llRXh0U3VwcFJhdGVzICggMHgwMDNiICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUZIUGFyYW1TZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFRkhQYXJhbVNldCAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+ZHdlbGxfdGltZSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgcERzdC0+aG9wX3NldCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPmhvcF9wYXR0ZXJuID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+aG9wX2luZGV4ID0gKnBCdWY7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVGSFBhcmFtU2V0LiAqLworCisjZGVmaW5lIFNpZ0llRkhQYXJhbVNldCAoIDB4MDAzYyApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVGSFBhcmFtcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVGSFBhcmFtcyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5yYWRpeCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPm5jaGFubmVscyA9ICpwQnVmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llRkhQYXJhbXMuICovCisKKyNkZWZpbmUgU2lnSWVGSFBhcmFtcyAoIDB4MDAzZCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVGSFBhdHRUYWJsZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVGSFBhdHRUYWJsZSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5mbGFnID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+bnNldHMgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5tb2R1bHVzID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+b2Zmc2V0ID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+bnVtX3JhbmR0YWJsZSA9ICh0QU5JX1U4KSggaWVsZW4gKTsKKyAgICBpZiAoaWVsZW4gPiAyNTEpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnJhbmR0YWJsZSwgcEJ1ZiwgKCBpZWxlbiApICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVGSFBhdHRUYWJsZS4gKi8KKworI2RlZmluZSBTaWdJZUZIUGF0dFRhYmxlICggMHgwMDNlICkKKworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0ZUSW5mb1sgXSA9IHsKKyAgICAgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19GVEluZm9bIF0gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sIFIxS0hfSUQpLCBvZmZzZXRvZih0RG90MTFmSUVSMUtIX0lELCBwcmVzZW50KSwgMCwgIlIxS0hfSUQiICwgMCwgOCwgOCwgU2lnSWVSMUtIX0lELCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUjFLSF9JRCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRUZUSW5mbywgR1RLKSwgb2Zmc2V0b2YodERvdDExZklFR1RLLCBwcmVzZW50KSwgMCwgIkdUSyIgLCAwLCAxOCwgNDUsIFNpZ0llR1RLLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfR1RLLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFRlRJbmZvLCBSMEtIX0lEKSwgb2Zmc2V0b2YodERvdDExZklFUjBLSF9JRCwgcHJlc2VudCksIDAsICJSMEtIX0lEIiAsIDAsIDMsIDUwLCBTaWdJZVIwS0hfSUQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SMEtIX0lELCAwLCB9LAorICAgICAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llRlRJbmZvKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUZUSW5mbyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1UxNiB0bXA0MV9fOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZ0bXA0MV9fLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gMjsKKyAgICBwRHN0LT5yZXNlcnZlZCA9IHRtcDQxX18gPj4gMCAmIDB4ZmY7CisgICAgcERzdC0+SUVDb3VudCA9IHRtcDQxX18gPj4gOCAmIDB4ZmY7CisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5NSUMsIHBCdWYsIDE2KTsKKyAgICBwQnVmICs9IDE2OworICAgIGllbGVuIC09ICh0QU5JX1U4KTE2OworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+QW5vbmNlLCBwQnVmLCAzMik7CisgICAgcEJ1ZiArPSAzMjsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkzMjsKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPlNub25jZSwgcEJ1ZiwgMzIpOworICAgIHBCdWYgKz0gMzI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMzI7CisgICAgKHZvaWQpcEN0eDsKKyAgICBzdGF0dXMgfD0gVW5wYWNrQ29yZShwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGllbGVuLAorICAgICAgICAgICAgICAgICAgICAgRkZTX0ZUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgIElFU19GVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTgqIClwRHN0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llRlRJbmZvLiAqLworCisjZGVmaW5lIFNpZ0llRlRJbmZvICggMHgwMDNmICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUZUVGltZW91dEludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUZUVGltZW91dEludGVydmFsICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnRpbWVvdXRUeXBlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPnRpbWVvdXRWYWx1ZSwgcEJ1ZiwgMCk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVGVFRpbWVvdXRJbnRlcnZhbC4gKi8KKworI2RlZmluZSBTaWdJZUZUVGltZW91dEludGVydmFsICggMHgwMDQwICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZUhUQ2Fwcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVIVENhcHMgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMTYgdG1wNDJfXzsKKyAgICB0QU5JX1U4IHRtcDQzX187CisgICAgdEFOSV9VMTYgdG1wNDRfXzsKKyAgICB0QU5JX1UzMiB0bXA0NV9fOworICAgIHRBTklfVTggdG1wNDZfXzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmdG1wNDJfXywgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09IDI7CisgICAgcERzdC0+YWR2Q29kaW5nQ2FwID0gdG1wNDJfXyA+PiAwICYgMHgxOworICAgIHBEc3QtPnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCA9IHRtcDQyX18gPj4gMSAmIDB4MTsKKyAgICBwRHN0LT5taW1vUG93ZXJTYXZlID0gdG1wNDJfXyA+PiAyICYgMHgzOworICAgIHBEc3QtPmdyZWVuRmllbGQgPSB0bXA0Ml9fID4+IDQgJiAweDE7CisgICAgcERzdC0+c2hvcnRHSTIwTUh6ID0gdG1wNDJfXyA+PiA1ICYgMHgxOworICAgIHBEc3QtPnNob3J0R0k0ME1IeiA9IHRtcDQyX18gPj4gNiAmIDB4MTsKKyAgICBwRHN0LT50eFNUQkMgPSB0bXA0Ml9fID4+IDcgJiAweDE7CisgICAgcERzdC0+cnhTVEJDID0gdG1wNDJfXyA+PiA4ICYgMHgzOworICAgIHBEc3QtPmRlbGF5ZWRCQSA9IHRtcDQyX18gPj4gMTAgJiAweDE7CisgICAgcERzdC0+bWF4aW1hbEFNU0RVc2l6ZSA9IHRtcDQyX18gPj4gMTEgJiAweDE7CisgICAgcERzdC0+ZHNzc0Nja01vZGU0ME1IeiA9IHRtcDQyX18gPj4gMTIgJiAweDE7CisgICAgcERzdC0+cHNtcCA9IHRtcDQyX18gPj4gMTMgJiAweDE7CisgICAgcERzdC0+c3RiY0NvbnRyb2xGcmFtZSA9IHRtcDQyX18gPj4gMTQgJiAweDE7CisgICAgcERzdC0+bHNpZ1RYT1BQcm90ZWN0aW9uID0gdG1wNDJfXyA+PiAxNSAmIDB4MTsKKyAgICB0bXA0M19fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+bWF4UnhBTVBEVUZhY3RvciA9IHRtcDQzX18gPj4gMCAmIDB4MzsKKyAgICBwRHN0LT5tcGR1RGVuc2l0eSA9IHRtcDQzX18gPj4gMiAmIDB4NzsKKyAgICBwRHN0LT5yZXNlcnZlZDEgPSB0bXA0M19fID4+IDUgJiAweDc7CisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5zdXBwb3J0ZWRNQ1NTZXQsIHBCdWYsIDE2KTsKKyAgICBwQnVmICs9IDE2OworICAgIGllbGVuIC09ICh0QU5JX1U4KTE2OworICAgIGZyYW1lc250b2hzKHBDdHgsICZ0bXA0NF9fLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gMjsKKyAgICBwRHN0LT5wY28gPSB0bXA0NF9fID4+IDAgJiAweDE7CisgICAgcERzdC0+dHJhbnNpdGlvblRpbWUgPSB0bXA0NF9fID4+IDEgJiAweDM7CisgICAgcERzdC0+cmVzZXJ2ZWQyID0gdG1wNDRfXyA+PiAzICYgMHgxZjsKKyAgICBwRHN0LT5tY3NGZWVkYmFjayA9IHRtcDQ0X18gPj4gOCAmIDB4MzsKKyAgICBwRHN0LT5yZXNlcnZlZDMgPSB0bXA0NF9fID4+IDEwICYgMHgzZjsKKyAgICBmcmFtZXNudG9obChwQ3R4LCAmdG1wNDVfXywgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09IDQ7CisgICAgcERzdC0+dHhCRiA9IHRtcDQ1X18gPj4gMCAmIDB4MTsKKyAgICBwRHN0LT5yeFN0YWdnZXJlZFNvdW5kaW5nID0gdG1wNDVfXyA+PiAxICYgMHgxOworICAgIHBEc3QtPnR4U3RhZ2dlcmVkU291bmRpbmcgPSB0bXA0NV9fID4+IDIgJiAweDE7CisgICAgcERzdC0+cnhaTEYgPSB0bXA0NV9fID4+IDMgJiAweDE7CisgICAgcERzdC0+dHhaTEYgPSB0bXA0NV9fID4+IDQgJiAweDE7CisgICAgcERzdC0+aW1wbGljaXRUeEJGID0gdG1wNDVfXyA+PiA1ICYgMHgxOworICAgIHBEc3QtPmNhbGlicmF0aW9uID0gdG1wNDVfXyA+PiA2ICYgMHgzOworICAgIHBEc3QtPmV4cGxpY2l0Q1NJVHhCRiA9IHRtcDQ1X18gPj4gOCAmIDB4MTsKKyAgICBwRHN0LT5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4ID0gdG1wNDVfXyA+PiA5ICYgMHgxOworICAgIHBEc3QtPmV4cGxpY2l0QkZDU0lGZWVkYmFjayA9IHRtcDQ1X18gPj4gMTAgJiAweDc7CisgICAgcERzdC0+ZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrID0gdG1wNDVfXyA+PiAxMyAmIDB4NzsKKyAgICBwRHN0LT5leHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrID0gdG1wNDVfXyA+PiAxNiAmIDB4NzsKKyAgICBwRHN0LT5jc2lOdW1CRkFudGVubmFlID0gdG1wNDVfXyA+PiAxOSAmIDB4MzsKKyAgICBwRHN0LT51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgPSB0bXA0NV9fID4+IDIxICYgMHgzOworICAgIHBEc3QtPmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgPSB0bXA0NV9fID4+IDIzICYgMHgzOworICAgIHBEc3QtPnJlc2VydmVkNCA9IHRtcDQ1X18gPj4gMjUgJiAweDdmOworICAgIHRtcDQ2X18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5hbnRlbm5hU2VsZWN0aW9uID0gdG1wNDZfXyA+PiAwICYgMHgxOworICAgIHBEc3QtPmV4cGxpY2l0Q1NJRmVlZGJhY2tUeCA9IHRtcDQ2X18gPj4gMSAmIDB4MTsKKyAgICBwRHN0LT5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHggPSB0bXA0Nl9fID4+IDIgJiAweDE7CisgICAgcERzdC0+ZXhwbGljaXRDU0lGZWVkYmFjayA9IHRtcDQ2X18gPj4gMyAmIDB4MTsKKyAgICBwRHN0LT5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrID0gdG1wNDZfXyA+PiA0ICYgMHgxOworICAgIHBEc3QtPnJ4QVMgPSB0bXA0Nl9fID4+IDUgJiAweDE7CisgICAgcERzdC0+dHhTb3VuZGluZ1BQRFVzID0gdG1wNDZfXyA+PiA2ICYgMHgxOworICAgIHBEc3QtPnJlc2VydmVkNSA9IHRtcDQ2X18gPj4gNyAmIDB4MTsKKyAgICBwRHN0LT5udW1fcnN2ZCA9ICh0QU5JX1U4KSggaWVsZW4gKTsKKyAgICBpZiAoaWVsZW4gPiAzMil7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+cnN2ZCwgcEJ1ZiwgKCBpZWxlbiApICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVIVENhcHMuICovCisKKyNkZWZpbmUgU2lnSWVIVENhcHMgKCAweDAwNDEgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llSFRJbmZvKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUhUSW5mbyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1U4IHRtcDQ3X187CisgICAgdEFOSV9VMTYgdG1wNDhfXzsKKyAgICB0QU5JX1UxNiB0bXA0OV9fOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnByaW1hcnlDaGFubmVsID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgdG1wNDdfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPnNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSB0bXA0N19fID4+IDAgJiAweDM7CisgICAgcERzdC0+cmVjb21tZW5kZWRUeFdpZHRoU2V0ID0gdG1wNDdfXyA+PiAyICYgMHgxOworICAgIHBEc3QtPnJpZnNNb2RlID0gdG1wNDdfXyA+PiAzICYgMHgxOworICAgIHBEc3QtPmNvbnRyb2xsZWRBY2Nlc3NPbmx5ID0gdG1wNDdfXyA+PiA0ICYgMHgxOworICAgIHBEc3QtPnNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ID0gdG1wNDdfXyA+PiA1ICYgMHg3OworICAgIGZyYW1lc250b2hzKHBDdHgsICZ0bXA0OF9fLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gMjsKKyAgICBwRHN0LT5vcE1vZGUgPSB0bXA0OF9fID4+IDAgJiAweDM7CisgICAgcERzdC0+bm9uR0ZEZXZpY2VzUHJlc2VudCA9IHRtcDQ4X18gPj4gMiAmIDB4MTsKKyAgICBwRHN0LT50cmFuc21pdEJ1cnN0TGltaXQgPSB0bXA0OF9fID4+IDMgJiAweDE7CisgICAgcERzdC0+b2Jzc05vbkhUU3RhUHJlc2VudCA9IHRtcDQ4X18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5yZXNlcnZlZCA9IHRtcDQ4X18gPj4gNSAmIDB4N2ZmOworICAgIGZyYW1lc250b2hzKHBDdHgsICZ0bXA0OV9fLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gMjsKKyAgICBwRHN0LT5iYXNpY1NUQkNNQ1MgPSB0bXA0OV9fID4+IDAgJiAweDdmOworICAgIHBEc3QtPmR1YWxDVFNQcm90ZWN0aW9uID0gdG1wNDlfXyA+PiA3ICYgMHgxOworICAgIHBEc3QtPnNlY29uZGFyeUJlYWNvbiA9IHRtcDQ5X18gPj4gOCAmIDB4MTsKKyAgICBwRHN0LT5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9IHRtcDQ5X18gPj4gOSAmIDB4MTsKKyAgICBwRHN0LT5wY29BY3RpdmUgPSB0bXA0OV9fID4+IDEwICYgMHgxOworICAgIHBEc3QtPnBjb1BoYXNlID0gdG1wNDlfXyA+PiAxMSAmIDB4MTsKKyAgICBwRHN0LT5yZXNlcnZlZDIgPSB0bXA0OV9fID4+IDEyICYgMHhmOworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+YmFzaWNNQ1NTZXQsIHBCdWYsIDE2KTsKKyAgICBwQnVmICs9IDE2OworICAgIGllbGVuIC09ICh0QU5JX1U4KTE2OworICAgIHBEc3QtPm51bV9yc3ZkID0gKHRBTklfVTgpKCBpZWxlbiApOworICAgIGlmIChpZWxlbiA+IDMyKXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5yc3ZkLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZUhUSW5mby4gKi8KKworI2RlZmluZSBTaWdJZUhUSW5mbyAoIDB4MDA0MiApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVJQlNTUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRUlCU1NQYXJhbXMgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmF0aW0sIHBCdWYsIDApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llSUJTU1BhcmFtcy4gKi8KKworI2RlZmluZSBTaWdJZUlCU1NQYXJhbXMgKCAweDAwNDMgKQorCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19yZXBvcnRCZWFjb25bIF0gPSB7Cit7IE5VTEwsIDAsIDAsIDAsfSwKK307CisKK3N0YXRpYyBjb25zdCB0SUVEZWZuIElFU19yZXBvcnRCZWFjb25bIF0gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCwgcmVwb3J0LkJlYWNvbi5CZWFjb25SZXBvcnRGcm1Cb2R5KSwgb2Zmc2V0b2YodERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSwgcHJlc2VudCksIDAsICJCZWFjb25SZXBvcnRGcm1Cb2R5IiAsIDAsIDIsIDIyNiwgU2lnSWVCZWFjb25SZXBvcnRGcm1Cb2R5LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQkVBQ09OUkVQT1JURlJNQk9EWSwgMCwgfSwKK3swLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sCit9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZU1lYXN1cmVtZW50UmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTggdG1wNTBfXzsKKyAgICB0QU5JX1U4IHRtcDUxX187CisgICAgdEFOSV9VOCB0bXA1Ml9fOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnRva2VuID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgdG1wNTBfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPmxhdGUgPSB0bXA1MF9fID4+IDAgJiAweDE7CisgICAgcERzdC0+aW5jYXBhYmxlID0gdG1wNTBfXyA+PiAxICYgMHgxOworICAgIHBEc3QtPnJlZnVzZWQgPSB0bXA1MF9fID4+IDIgJiAweDE7CisgICAgcERzdC0+dW51c2VkID0gdG1wNTBfXyA+PiAzICYgMHgxZjsKKyAgICBwRHN0LT50eXBlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgaWYgKCAhIGllbGVuICkKKyAgICB7CisgICAgICAgIHJldHVybiAwVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwRHN0LT50eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcERzdC0+cmVwb3J0LkJhc2ljLmNoYW5uZWwgPSAqcEJ1ZjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgICAgICBmcmFtZXNudG9ocShwQ3R4LCAmcERzdC0+cmVwb3J0LkJhc2ljLm1lYXNfc3RhcnRfdGltZSwgcEJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSA4OworICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTg7CisgICAgICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnJlcG9ydC5CYXNpYy5tZWFzX2R1cmF0aW9uLCBwQnVmLCAwKTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICAgICAgICAgICAgICB0bXA1MV9fID0gKnBCdWY7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIGllbGVuIC09IDE7CisgICAgICAgICAgICAgICAgcERzdC0+cmVwb3J0LkJhc2ljLmJzcyA9IHRtcDUxX18gPj4gMCAmIDB4MTsKKyAgICAgICAgICAgICAgICBwRHN0LT5yZXBvcnQuQmFzaWMub2ZkbV9wcmVhbWJsZSA9IHRtcDUxX18gPj4gMSAmIDB4MTsKKyAgICAgICAgICAgICAgICBwRHN0LT5yZXBvcnQuQmFzaWMudW5pZF9zaWduYWwgPSB0bXA1MV9fID4+IDIgJiAweDE7CisgICAgICAgICAgICAgICAgcERzdC0+cmVwb3J0LkJhc2ljLnJhZGVyID0gdG1wNTFfXyA+PiAzICYgMHgxOworICAgICAgICAgICAgICAgIHBEc3QtPnJlcG9ydC5CYXNpYy51bm1lYXN1cmVkID0gdG1wNTFfXyA+PiA0ICYgMHgxOworICAgICAgICAgICAgICAgIHBEc3QtPnJlcG9ydC5CYXNpYy51bnVzZWQgPSB0bXA1MV9fID4+IDUgJiAweDc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBwRHN0LT5yZXBvcnQuQ0NBLmNoYW5uZWwgPSAqcEJ1ZjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgICAgICBmcmFtZXNudG9ocShwQ3R4LCAmcERzdC0+cmVwb3J0LkNDQS5tZWFzX3N0YXJ0X3RpbWUsIHBCdWYsIDApOworICAgICAgICAgICAgICAgIHBCdWYgKz0gODsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCk4OworICAgICAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5yZXBvcnQuQ0NBLm1lYXNfZHVyYXRpb24sIHBCdWYsIDApOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgICAgICAgICAgICAgIHBEc3QtPnJlcG9ydC5DQ0EuY2NhX2J1c3lfZnJhY3Rpb24gPSAqcEJ1ZjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHBEc3QtPnJlcG9ydC5SUElIaXN0b2dyYW0uY2hhbm5lbCA9ICpwQnVmOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgICAgIGZyYW1lc250b2hxKHBDdHgsICZwRHN0LT5yZXBvcnQuUlBJSGlzdG9ncmFtLm1lYXNfc3RhcnRfdGltZSwgcEJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSA4OworICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTg7CisgICAgICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnJlcG9ydC5SUElIaXN0b2dyYW0ubWVhc19kdXJhdGlvbiwgcEJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgICAgICAgICAgICAgcERzdC0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkwX2RlbnNpdHkgPSAqcEJ1ZjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgICAgICBwRHN0LT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTFfZGVuc2l0eSA9ICpwQnVmOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgICAgIHBEc3QtPnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpMl9kZW5zaXR5ID0gKnBCdWY7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgICAgICAgICAgICAgcERzdC0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkzX2RlbnNpdHkgPSAqcEJ1ZjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgICAgICBwRHN0LT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTRfZGVuc2l0eSA9ICpwQnVmOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgICAgIHBEc3QtPnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpNV9kZW5zaXR5ID0gKnBCdWY7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgICAgICAgICAgICAgcERzdC0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk2X2RlbnNpdHkgPSAqcEJ1ZjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgICAgICBwRHN0LT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTdfZGVuc2l0eSA9ICpwQnVmOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgcERzdC0+cmVwb3J0LkJlYWNvbi5yZWdDbGFzcyA9ICpwQnVmOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgICAgIHBEc3QtPnJlcG9ydC5CZWFjb24uY2hhbm5lbCA9ICpwQnVmOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgICAgIGZyYW1lc250b2hxKHBDdHgsICZwRHN0LT5yZXBvcnQuQmVhY29uLm1lYXNfc3RhcnRfdGltZSwgcEJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSA4OworICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTg7CisgICAgICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnJlcG9ydC5CZWFjb24ubWVhc19kdXJhdGlvbiwgcEJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgICAgICAgICAgICAgdG1wNTJfXyA9ICpwQnVmOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAxOworICAgICAgICAgICAgICAgIHBEc3QtPnJlcG9ydC5CZWFjb24uY29uZGVuc2VkX1BIWSA9IHRtcDUyX18gPj4gMCAmIDB4N2Y7CisgICAgICAgICAgICAgICAgcERzdC0+cmVwb3J0LkJlYWNvbi5yZXBvcnRlZF9mcmFtZV90eXBlID0gdG1wNTJfXyA+PiA3ICYgMHgxOworICAgICAgICAgICAgICAgIHBEc3QtPnJlcG9ydC5CZWFjb24uUkNQSSA9ICpwQnVmOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgICAgIHBEc3QtPnJlcG9ydC5CZWFjb24uUlNOSSA9ICpwQnVmOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+cmVwb3J0LkJlYWNvbi5CU1NJRCwgcEJ1ZiwgNik7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSA2OworICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTY7CisgICAgICAgICAgICAgICAgcERzdC0+cmVwb3J0LkJlYWNvbi5hbnRlbm5hX2lkID0gKnBCdWY7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgICAgICAgICAgICAgZnJhbWVzbnRvaGwocEN0eCwgJnBEc3QtPnJlcG9ydC5CZWFjb24ucGFyZW50X1RTRiwgcEJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgICAgICAgICBzdGF0dXMgfD0gVW5wYWNrQ29yZShwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGllbGVuLAorICAgICAgICAgICAgICAgICAgICAgRkZTX3JlcG9ydEJlYWNvbiwKKyAgICAgICAgICAgICAgICAgICAgIElFU19yZXBvcnRCZWFjb24sCisgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTgqIClwRHN0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwRHN0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZU1lYXN1cmVtZW50UmVwb3J0LiAqLworCisjZGVmaW5lIFNpZ0llTWVhc3VyZW1lbnRSZXBvcnQgKCAweDAwNDQgKQorCisKK3N0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19tZWFzdXJlbWVudF9yZXF1ZXN0QmVhY29uWyBdID0geworeyBOVUxMLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfbWVhc3VyZW1lbnRfcmVxdWVzdEJlYWNvblsgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwgbWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uU1NJRCksIG9mZnNldG9mKHREb3QxMWZJRVNTSUQsIHByZXNlbnQpLCAwLCAiU1NJRCIgLCAwLCAyLCAzNCwgU2lnSWVTU0lELCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfU1NJRCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwgbWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQmVhY29uUmVwb3J0aW5nKSwgb2Zmc2V0b2YodERvdDExZklFQmVhY29uUmVwb3J0aW5nLCBwcmVzZW50KSwgMCwgIkJlYWNvblJlcG9ydGluZyIgLCAwLCA0LCA0LCBTaWdJZUJlYWNvblJlcG9ydGluZywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0JFQUNPTlJFUE9SVElORywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwgbWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQmNuUmVwb3J0aW5nRGV0YWlsKSwgb2Zmc2V0b2YodERvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsLCBwcmVzZW50KSwgMCwgIkJjblJlcG9ydGluZ0RldGFpbCIgLCAwLCAzLCAzLCBTaWdJZUJjblJlcG9ydGluZ0RldGFpbCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0JDTlJFUE9SVElOR0RFVEFJTCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwgbWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uUmVxdWVzdGVkSW5mbyksIG9mZnNldG9mKHREb3QxMWZJRVJlcXVlc3RlZEluZm8sIHByZXNlbnQpLCAwLCAiUmVxdWVzdGVkSW5mbyIgLCAwLCAyLCAyNTcsIFNpZ0llUmVxdWVzdGVkSW5mbywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JFUVVFU1RFRElORk8sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QsIG1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLkFQQ2hhbm5lbFJlcG9ydCksIG9mZnNldG9mKHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCwgcHJlc2VudCksIG9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwgbWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubnVtX0FQQ2hhbm5lbFJlcG9ydCksICJBUENoYW5uZWxSZXBvcnQiICwgMiwgMywgNTMsIFNpZ0llQVBDaGFubmVsUmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQVBDSEFOTkVMUkVQT1JULCAwLCB9LAorezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwKK307CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llTWVhc3VyZW1lbnRSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1U4IHRtcDUzX187CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+bWVhc3VyZW1lbnRfdG9rZW4gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICB0bXA1M19fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+cGFyYWxsZWwgPSB0bXA1M19fID4+IDAgJiAweDE7CisgICAgcERzdC0+ZW5hYmxlID0gdG1wNTNfXyA+PiAxICYgMHgxOworICAgIHBEc3QtPnJlcXVlc3QgPSB0bXA1M19fID4+IDIgJiAweDE7CisgICAgcERzdC0+cmVwb3J0ID0gdG1wNTNfXyA+PiAzICYgMHgxOworICAgIHBEc3QtPmR1cmF0aW9uTWFuZGF0b3J5ID0gdG1wNTNfXyA+PiA0ICYgMHgxOworICAgIHBEc3QtPnVudXNlZCA9IHRtcDUzX18gPj4gNSAmIDB4NzsKKyAgICBwRHN0LT5tZWFzdXJlbWVudF90eXBlID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgc3dpdGNoIChwRHN0LT5tZWFzdXJlbWVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcERzdC0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CYXNpYy5jaGFubmVsX25vID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJhc2ljLm1lYXNfc3RhcnRfdGltZSwgcEJ1ZiwgOCk7CisgICAgICAgICAgICBwQnVmICs9IDg7CisgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCk4OworICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmFzaWMubWVhc19kdXJhdGlvbiwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcERzdC0+bWVhc3VyZW1lbnRfcmVxdWVzdC5DQ0EuY2hhbm5lbF9ubyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+bWVhc3VyZW1lbnRfcmVxdWVzdC5DQ0EubWVhc19zdGFydF90aW1lLCBwQnVmLCA4KTsKKyAgICAgICAgICAgIHBCdWYgKz0gODsKKyAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTg7CisgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWVhc3VyZW1lbnRfcmVxdWVzdC5DQ0EubWVhc19kdXJhdGlvbiwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcERzdC0+bWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0uY2hhbm5lbF9ubyA9ICpwQnVmOworICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+bWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0ubWVhc19zdGFydF90aW1lLCBwQnVmLCA4KTsKKyAgICAgICAgICAgIHBCdWYgKz0gODsKKyAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTg7CisgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+bWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0ubWVhc19kdXJhdGlvbiwgcEJ1ZiwgMCk7CisgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgcERzdC0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ucmVnQ2xhc3MgPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgICAgICAgICBwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5jaGFubmVsID0gKnBCdWY7CisgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLnJhbmRvbWl6YXRpb24sIHBCdWYsIDApOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICAgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5tZWFzX2R1cmF0aW9uLCBwQnVmLCAwKTsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgICAgICAgICBwRHN0LT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5tZWFzX21vZGUgPSAqcEJ1ZjsKKyAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLkJTU0lELCBwQnVmLCA2KTsKKyAgICAgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTY7CisgICAgICAgIHN0YXR1cyB8PSBVbnBhY2tDb3JlKHBDdHgsCisgICAgICAgICAgICAgICAgICAgICBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgaWVsZW4sCisgICAgICAgICAgICAgICAgICAgICBGRlNfbWVhc3VyZW1lbnRfcmVxdWVzdEJlYWNvbiwKKyAgICAgICAgICAgICAgICAgICAgIElFU19tZWFzdXJlbWVudF9yZXF1ZXN0QmVhY29uLAorICAgICAgICAgICAgICAgICAgICAgKCB0QU5JX1U4KiApcERzdCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcERzdCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVNZWFzdXJlbWVudFJlcXVlc3QuICovCisKKyNkZWZpbmUgU2lnSWVNZWFzdXJlbWVudFJlcXVlc3QgKCAweDAwNDUgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llTW9iaWxpdHlEb21haW4odHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFTW9iaWxpdHlEb21haW4gKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VOCB0bXA1NF9fOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5NRElELCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICB0bXA1NF9fID0gKnBCdWY7CisgICAgcERzdC0+b3ZlckRTQ2FwID0gdG1wNTRfXyA+PiAwICYgMHgxOworICAgIHBEc3QtPnJlc291cmNlUmVxQ2FwID0gdG1wNTRfXyA+PiAxICYgMHgxOworICAgIHBEc3QtPnJlc2VydmVkID0gdG1wNTRfXyA+PiAyICYgMHgzZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZU1vYmlsaXR5RG9tYWluLiAqLworCisjZGVmaW5lIFNpZ0llTW9iaWxpdHlEb21haW4gKCAweDAwNDYgKQorCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfTmVpZ2hib3JSZXBvcnRbIF0gPSB7CisgICAgICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfTmVpZ2hib3JSZXBvcnRbIF0gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVOZWlnaGJvclJlcG9ydCwgVFNGSW5mbyksIG9mZnNldG9mKHREb3QxMWZJRVRTRkluZm8sIHByZXNlbnQpLCAwLCAiVFNGSW5mbyIgLCAwLCA2LCA2LCBTaWdJZVRTRkluZm8sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9UU0ZJTkZPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFTmVpZ2hib3JSZXBvcnQsIENvbmRlbnNlZENvdW50cnlTdHIpLCBvZmZzZXRvZih0RG90MTFmSUVDb25kZW5zZWRDb3VudHJ5U3RyLCBwcmVzZW50KSwgMCwgIkNvbmRlbnNlZENvdW50cnlTdHIiICwgMCwgNCwgNCwgU2lnSWVDb25kZW5zZWRDb3VudHJ5U3RyLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQ09OREVOU0VEQ09VTlRSWVNUUiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRU5laWdoYm9yUmVwb3J0LCBNZWFzdXJlbWVudFBpbG90KSwgb2Zmc2V0b2YodERvdDExZklFTWVhc3VyZW1lbnRQaWxvdCwgcHJlc2VudCksIDAsICJNZWFzdXJlbWVudFBpbG90IiAsIDAsIDMsIDI1OCwgU2lnSWVNZWFzdXJlbWVudFBpbG90LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfTUVBU1VSRU1FTlRQSUxPVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRU5laWdoYm9yUmVwb3J0LCBSUk1FbmFibGVkQ2FwKSwgb2Zmc2V0b2YodERvdDExZklFUlJNRW5hYmxlZENhcCwgcHJlc2VudCksIDAsICJSUk1FbmFibGVkQ2FwIiAsIDAsIDcsIDcsIFNpZ0llUlJNRW5hYmxlZENhcCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JSTUVOQUJMRURDQVAsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVOZWlnaGJvclJlcG9ydCwgTXVsdGlCc3NpZCksIG9mZnNldG9mKHREb3QxMWZJRU11bHRpQnNzaWQsIHByZXNlbnQpLCAwLCAiTXVsdGlCc3NpZCIgLCAwLCAzLCAyNTgsIFNpZ0llTXVsdGlCc3NpZCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX01VTFRJQlNTSUQsIDAsIH0sCisgICAgICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVOZWlnaGJvclJlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVOZWlnaGJvclJlcG9ydCAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1U4IHRtcDU1X187CisgICAgdEFOSV9VOCB0bXA1Nl9fOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+YnNzaWQsIHBCdWYsIDYpOworICAgIHBCdWYgKz0gNjsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCk2OworICAgIHRtcDU1X18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5BUFJlYWNoYWJpbGl0eSA9IHRtcDU1X18gPj4gMCAmIDB4MzsKKyAgICBwRHN0LT5TZWN1cml0eSA9IHRtcDU1X18gPj4gMiAmIDB4MTsKKyAgICBwRHN0LT5LZXlTY29wZSA9IHRtcDU1X18gPj4gMyAmIDB4MTsKKyAgICBwRHN0LT5TcGVjTWdtdENhcCA9IHRtcDU1X18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5Rb3NDYXAgPSB0bXA1NV9fID4+IDUgJiAweDE7CisgICAgcERzdC0+YXBzZCA9IHRtcDU1X18gPj4gNiAmIDB4MTsKKyAgICBwRHN0LT5ycm0gPSB0bXA1NV9fID4+IDcgJiAweDE7CisgICAgdG1wNTZfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPkRlbGF5ZWRCQSA9IHRtcDU2X18gPj4gMCAmIDB4MTsKKyAgICBwRHN0LT5JbW1CQSA9IHRtcDU2X18gPj4gMSAmIDB4MTsKKyAgICBwRHN0LT5Nb2JpbGl0eURvbWFpbiA9IHRtcDU2X18gPj4gMiAmIDB4MTsKKyAgICBwRHN0LT5yZXNlcnZlZCA9IHRtcDU2X18gPj4gMyAmIDB4MWY7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnJlc2VydmVkMSwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgcERzdC0+cmVndWxhdG9yeUNsYXNzID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+Y2hhbm5lbCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPlBoeVR5cGUgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICAodm9pZClwQ3R4OworICAgIHN0YXR1cyB8PSBVbnBhY2tDb3JlKHBDdHgsCisgICAgICAgICAgICAgICAgICAgICBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgaWVsZW4sCisgICAgICAgICAgICAgICAgICAgICBGRlNfTmVpZ2hib3JSZXBvcnQsCisgICAgICAgICAgICAgICAgICAgICBJRVNfTmVpZ2hib3JSZXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTgqIClwRHN0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llTmVpZ2hib3JSZXBvcnQuICovCisKKyNkZWZpbmUgU2lnSWVOZWlnaGJvclJlcG9ydCAoIDB4MDA0NyApCisKKworICAgIHN0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1AyUEFzc29jUmVxWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQQXNzb2NSZXEsIFAyUENhcGFiaWxpdHkpLCBvZmZzZXRvZih0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSwgcHJlc2VudCksICJQMlBDYXBhYmlsaXR5IiwgU2lnVGx2UDJQQ2FwYWJpbGl0eSwgRE9UMTFGX1RMVl9QMlBDQVBBQklMSVRZLCAwLCA1LCA1LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQQXNzb2NSZXEsIEV4dGVuZGVkTGlzdGVuVGltaW5nKSwgb2Zmc2V0b2YodERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nLCBwcmVzZW50KSwgIkV4dGVuZGVkTGlzdGVuVGltaW5nIiwgU2lnVGx2RXh0ZW5kZWRMaXN0ZW5UaW1pbmcsIERPVDExRl9UTFZfRVhURU5ERURMSVNURU5USU1JTkcsIDAsIDcsIDcsIDAsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBBc3NvY1JlcSwgUDJQRGV2aWNlSW5mbyksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvLCBwcmVzZW50KSwgIlAyUERldmljZUluZm8iLCBTaWdUbHZQMlBEZXZpY2VJbmZvLCBET1QxMUZfVExWX1AyUERFVklDRUlORk8sIDAsIDE5LCA1NSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBBc3NvY1JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQMlBBc3NvY1JlcSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHN0YXR1cyA9IFVucGFja1RsdkNvcmUocEN0eCxwQnVmLGllbGVuLFRMVlNfUDJQQXNzb2NSZXEsKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUDJQQXNzb2NSZXEuICovCisKKyNkZWZpbmUgU2lnSWVQMlBBc3NvY1JlcSAoIDB4MDA0OCApCisKKworICAgIHN0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1AyUEFzc29jUmVzWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQQXNzb2NSZXMsIFAyUFN0YXR1cyksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBTdGF0dXMsIHByZXNlbnQpLCAiUDJQU3RhdHVzIiwgU2lnVGx2UDJQU3RhdHVzLCBET1QxMUZfVExWX1AyUFNUQVRVUywgMCwgNCwgNCwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEFzc29jUmVzLCBFeHRlbmRlZExpc3RlblRpbWluZyksIG9mZnNldG9mKHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZywgcHJlc2VudCksICJFeHRlbmRlZExpc3RlblRpbWluZyIsIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nLCBET1QxMUZfVExWX0VYVEVOREVETElTVEVOVElNSU5HLCAwLCA3LCA3LCAwLCAxLCAyLCAwLCB9LAorICAgICAgICB7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUEFzc29jUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVAyUEFzc29jUmVzICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgc3RhdHVzID0gVW5wYWNrVGx2Q29yZShwQ3R4LHBCdWYsaWVsZW4sVExWU19QMlBBc3NvY1JlcywodEFOSV9VOCopcERzdCxzaXplb2YoKnBEc3QpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVQMlBBc3NvY1Jlcy4gKi8KKworI2RlZmluZSBTaWdJZVAyUEFzc29jUmVzICggMHgwMDQ5ICkKKworCisgICAgc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfUDJQQmVhY29uWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQQmVhY29uLCBQMlBDYXBhYmlsaXR5KSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUENhcGFiaWxpdHksIHByZXNlbnQpLCAiUDJQQ2FwYWJpbGl0eSIsIFNpZ1RsdlAyUENhcGFiaWxpdHksIERPVDExRl9UTFZfUDJQQ0FQQUJJTElUWSwgMCwgNSwgNSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEJlYWNvbiwgUDJQRGV2aWNlSWQpLCBvZmZzZXRvZih0RG90MTFmVExWUDJQRGV2aWNlSWQsIHByZXNlbnQpLCAiUDJQRGV2aWNlSWQiLCBTaWdUbHZQMlBEZXZpY2VJZCwgRE9UMTFGX1RMVl9QMlBERVZJQ0VJRCwgMCwgOSwgOSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEJlYWNvbiwgTm90aWNlT2ZBYnNlbmNlKSwgb2Zmc2V0b2YodERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSwgcHJlc2VudCksICJOb3RpY2VPZkFic2VuY2UiLCBTaWdUbHZOb3RpY2VPZkFic2VuY2UsIERPVDExRl9UTFZfTk9USUNFT0ZBQlNFTkNFLCAwLCA1LCA0MSwgMCwgMSwgMiwgMCwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBCZWFjb24odHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUDJQQmVhY29uICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgc3RhdHVzID0gVW5wYWNrVGx2Q29yZShwQ3R4LHBCdWYsaWVsZW4sVExWU19QMlBCZWFjb24sKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUDJQQmVhY29uLiAqLworCisjZGVmaW5lIFNpZ0llUDJQQmVhY29uICggMHgwMDRhICkKKworCisgICAgc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfUDJQQmVhY29uUHJvYmVSZXNbIF0gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcywgUDJQQ2FwYWJpbGl0eSksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5LCBwcmVzZW50KSwgIlAyUENhcGFiaWxpdHkiLCBTaWdUbHZQMlBDYXBhYmlsaXR5LCBET1QxMUZfVExWX1AyUENBUEFCSUxJVFksIDAsIDUsIDUsIDAsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcywgUDJQRGV2aWNlSWQpLCBvZmZzZXRvZih0RG90MTFmVExWUDJQRGV2aWNlSWQsIHByZXNlbnQpLCAiUDJQRGV2aWNlSWQiLCBTaWdUbHZQMlBEZXZpY2VJZCwgRE9UMTFGX1RMVl9QMlBERVZJQ0VJRCwgMCwgOSwgOSwgMCwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzLCBFeHRlbmRlZExpc3RlblRpbWluZyksIG9mZnNldG9mKHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZywgcHJlc2VudCksICJFeHRlbmRlZExpc3RlblRpbWluZyIsIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nLCBET1QxMUZfVExWX0VYVEVOREVETElTVEVOVElNSU5HLCAwLCA3LCA3LCAwLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQQmVhY29uUHJvYmVSZXMsIE5vdGljZU9mQWJzZW5jZSksIG9mZnNldG9mKHREb3QxMWZUTFZOb3RpY2VPZkFic2VuY2UsIHByZXNlbnQpLCAiTm90aWNlT2ZBYnNlbmNlIiwgU2lnVGx2Tm90aWNlT2ZBYnNlbmNlLCBET1QxMUZfVExWX05PVElDRU9GQUJTRU5DRSwgMCwgNSwgNDEsIDAsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcywgUDJQRGV2aWNlSW5mbyksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvLCBwcmVzZW50KSwgIlAyUERldmljZUluZm8iLCBTaWdUbHZQMlBEZXZpY2VJbmZvLCBET1QxMUZfVExWX1AyUERFVklDRUlORk8sIDAsIDE5LCA1NSwgMCwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzLCBQMlBHcm91cEluZm8pLCBvZmZzZXRvZih0RG90MTFmVExWUDJQR3JvdXBJbmZvLCBwcmVzZW50KSwgIlAyUEdyb3VwSW5mbyIsIFNpZ1RsdlAyUEdyb3VwSW5mbywgRE9UMTFGX1RMVl9QMlBHUk9VUElORk8sIDAsIDMsIDEwMjcsIDAsIDEsIDIsIDAsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQQmVhY29uUHJvYmVSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUDJQQmVhY29uUHJvYmVSZXMgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1AyUEJlYWNvblByb2JlUmVzLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVAyUEJlYWNvblByb2JlUmVzLiAqLworCisjZGVmaW5lIFNpZ0llUDJQQmVhY29uUHJvYmVSZXMgKCAweDAwNGIgKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBEZUF1dGhbIF0gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBEZUF1dGgsIE1pbm9yUmVhc29uQ29kZSksIG9mZnNldG9mKHREb3QxMWZUTFZNaW5vclJlYXNvbkNvZGUsIHByZXNlbnQpLCAiTWlub3JSZWFzb25Db2RlIiwgU2lnVGx2TWlub3JSZWFzb25Db2RlLCBET1QxMUZfVExWX01JTk9SUkVBU09OQ09ERSwgMCwgNCwgNCwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBEZUF1dGgodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUDJQRGVBdXRoICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgc3RhdHVzID0gVW5wYWNrVGx2Q29yZShwQ3R4LHBCdWYsaWVsZW4sVExWU19QMlBEZUF1dGgsKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUDJQRGVBdXRoLiAqLworCisjZGVmaW5lIFNpZ0llUDJQRGVBdXRoICggMHgwMDRjICkKKworCisgICAgc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxLCBQMlBEZXZpY2VJZCksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBEZXZpY2VJZCwgcHJlc2VudCksICJQMlBEZXZpY2VJZCIsIFNpZ1RsdlAyUERldmljZUlkLCBET1QxMUZfVExWX1AyUERFVklDRUlELCAwLCA5LCA5LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxLCBQMlBHcm91cElkKSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUEdyb3VwSWQsIHByZXNlbnQpLCAiUDJQR3JvdXBJZCIsIFNpZ1RsdlAyUEdyb3VwSWQsIERPVDExRl9UTFZfUDJQR1JPVVBJRCwgMCwgOSwgNDEsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHN0YXR1cyA9IFVucGFja1RsdkNvcmUocEN0eCxwQnVmLGllbGVuLFRMVlNfUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcS4gKi8KKworI2RlZmluZSBTaWdJZVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSAoIDB4MDA0ZCApCisKKworICAgIHN0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1AyUERldmljZURpc2NvdmVyYWJpbGl0eVJlc1sgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcywgUDJQU3RhdHVzKSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUFN0YXR1cywgcHJlc2VudCksICJQMlBTdGF0dXMiLCBTaWdUbHZQMlBTdGF0dXMsIERPVDExRl9UTFZfUDJQU1RBVFVTLCAwLCA0LCA0LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1AyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcywodEFOSV9VOCopcERzdCxzaXplb2YoKnBEc3QpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMuICovCisKKyNkZWZpbmUgU2lnSWVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMgKCAweDAwNGUgKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBEaXNBc3NvY1sgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUERpc0Fzc29jLCBNaW5vclJlYXNvbkNvZGUpLCBvZmZzZXRvZih0RG90MTFmVExWTWlub3JSZWFzb25Db2RlLCBwcmVzZW50KSwgIk1pbm9yUmVhc29uQ29kZSIsIFNpZ1Rsdk1pbm9yUmVhc29uQ29kZSwgRE9UMTFGX1RMVl9NSU5PUlJFQVNPTkNPREUsIDAsIDQsIDQsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQRGlzQXNzb2ModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUDJQRGlzQXNzb2MgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1AyUERpc0Fzc29jLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVAyUERpc0Fzc29jLiAqLworCisjZGVmaW5lIFNpZ0llUDJQRGlzQXNzb2MgKCAweDAwNGYgKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBHT05lZ0NuZlsgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEdPTmVnQ25mLCBQMlBTdGF0dXMpLCBvZmZzZXRvZih0RG90MTFmVExWUDJQU3RhdHVzLCBwcmVzZW50KSwgIlAyUFN0YXR1cyIsIFNpZ1RsdlAyUFN0YXR1cywgRE9UMTFGX1RMVl9QMlBTVEFUVVMsIDAsIDQsIDQsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBHT05lZ0NuZiwgUDJQQ2FwYWJpbGl0eSksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5LCBwcmVzZW50KSwgIlAyUENhcGFiaWxpdHkiLCBTaWdUbHZQMlBDYXBhYmlsaXR5LCBET1QxMUZfVExWX1AyUENBUEFCSUxJVFksIDAsIDUsIDUsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBHT05lZ0NuZiwgT3BlcmF0aW5nQ2hhbm5lbCksIG9mZnNldG9mKHREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsLCBwcmVzZW50KSwgIk9wZXJhdGluZ0NoYW5uZWwiLCBTaWdUbHZPcGVyYXRpbmdDaGFubmVsLCBET1QxMUZfVExWX09QRVJBVElOR0NIQU5ORUwsIDAsIDgsIDgsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBHT05lZ0NuZiwgQ2hhbm5lbExpc3QpLCBvZmZzZXRvZih0RG90MTFmVExWQ2hhbm5lbExpc3QsIHByZXNlbnQpLCAiQ2hhbm5lbExpc3QiLCBTaWdUbHZDaGFubmVsTGlzdCwgRE9UMTFGX1RMVl9DSEFOTkVMTElTVCwgMCwgNiwgMjU3LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdDbmYsIFAyUEdyb3VwSWQpLCBvZmZzZXRvZih0RG90MTFmVExWUDJQR3JvdXBJZCwgcHJlc2VudCksICJQMlBHcm91cElkIiwgU2lnVGx2UDJQR3JvdXBJZCwgRE9UMTFGX1RMVl9QMlBHUk9VUElELCAwLCA5LCA0MSwgMCwgMSwgMiwgMCwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBHT05lZ0NuZih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQMlBHT05lZ0NuZiAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHN0YXR1cyA9IFVucGFja1RsdkNvcmUocEN0eCxwQnVmLGllbGVuLFRMVlNfUDJQR09OZWdDbmYsKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUDJQR09OZWdDbmYuICovCisKKyNkZWZpbmUgU2lnSWVQMlBHT05lZ0NuZiAoIDB4MDA1MCApCisKKworICAgIHN0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1AyUEdPTmVnUmVxWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdSZXEsIFAyUENhcGFiaWxpdHkpLCBvZmZzZXRvZih0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSwgcHJlc2VudCksICJQMlBDYXBhYmlsaXR5IiwgU2lnVGx2UDJQQ2FwYWJpbGl0eSwgRE9UMTFGX1RMVl9QMlBDQVBBQklMSVRZLCAwLCA1LCA1LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdSZXEsIEdPSW50ZW50KSwgb2Zmc2V0b2YodERvdDExZlRMVkdPSW50ZW50LCBwcmVzZW50KSwgIkdPSW50ZW50IiwgU2lnVGx2R09JbnRlbnQsIERPVDExRl9UTFZfR09JTlRFTlQsIDAsIDQsIDQsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBHT05lZ1JlcSwgQ29uZmlndXJhdGlvblRpbWVvdXQpLCBvZmZzZXRvZih0RG90MTFmVExWQ29uZmlndXJhdGlvblRpbWVvdXQsIHByZXNlbnQpLCAiQ29uZmlndXJhdGlvblRpbWVvdXQiLCBTaWdUbHZDb25maWd1cmF0aW9uVGltZW91dCwgRE9UMTFGX1RMVl9DT05GSUdVUkFUSU9OVElNRU9VVCwgMCwgNSwgNSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEdPTmVnUmVxLCBMaXN0ZW5DaGFubmVsKSwgb2Zmc2V0b2YodERvdDExZlRMVkxpc3RlbkNoYW5uZWwsIHByZXNlbnQpLCAiTGlzdGVuQ2hhbm5lbCIsIFNpZ1Rsdkxpc3RlbkNoYW5uZWwsIERPVDExRl9UTFZfTElTVEVOQ0hBTk5FTCwgMCwgOCwgOCwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEdPTmVnUmVxLCBFeHRlbmRlZExpc3RlblRpbWluZyksIG9mZnNldG9mKHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZywgcHJlc2VudCksICJFeHRlbmRlZExpc3RlblRpbWluZyIsIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nLCBET1QxMUZfVExWX0VYVEVOREVETElTVEVOVElNSU5HLCAwLCA3LCA3LCAwLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdSZXEsIEludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcyksIG9mZnNldG9mKHREb3QxMWZUTFZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MsIHByZXNlbnQpLCAiSW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzIiwgU2lnVGx2SW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzLCBET1QxMUZfVExWX0lOVEVOREVEUDJQSU5URVJGQUNFQUREUkVTUywgMCwgOSwgOSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEdPTmVnUmVxLCBDaGFubmVsTGlzdCksIG9mZnNldG9mKHREb3QxMWZUTFZDaGFubmVsTGlzdCwgcHJlc2VudCksICJDaGFubmVsTGlzdCIsIFNpZ1RsdkNoYW5uZWxMaXN0LCBET1QxMUZfVExWX0NIQU5ORUxMSVNULCAwLCA2LCAyNTcsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBHT05lZ1JlcSwgUDJQRGV2aWNlSW5mbyksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvLCBwcmVzZW50KSwgIlAyUERldmljZUluZm8iLCBTaWdUbHZQMlBEZXZpY2VJbmZvLCBET1QxMUZfVExWX1AyUERFVklDRUlORk8sIDAsIDE5LCA1NSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEdPTmVnUmVxLCBPcGVyYXRpbmdDaGFubmVsKSwgb2Zmc2V0b2YodERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwsIHByZXNlbnQpLCAiT3BlcmF0aW5nQ2hhbm5lbCIsIFNpZ1Rsdk9wZXJhdGluZ0NoYW5uZWwsIERPVDExRl9UTFZfT1BFUkFUSU5HQ0hBTk5FTCwgMCwgOCwgOCwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBHT05lZ1JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQMlBHT05lZ1JlcSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHN0YXR1cyA9IFVucGFja1RsdkNvcmUocEN0eCxwQnVmLGllbGVuLFRMVlNfUDJQR09OZWdSZXEsKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUDJQR09OZWdSZXEuICovCisKKyNkZWZpbmUgU2lnSWVQMlBHT05lZ1JlcSAoIDB4MDA1MSApCisKKworICAgIHN0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1AyUEdPTmVnUmVzWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdSZXMsIFAyUFN0YXR1cyksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBTdGF0dXMsIHByZXNlbnQpLCAiUDJQU3RhdHVzIiwgU2lnVGx2UDJQU3RhdHVzLCBET1QxMUZfVExWX1AyUFNUQVRVUywgMCwgNCwgNCwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEdPTmVnUmVzLCBQMlBDYXBhYmlsaXR5KSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUENhcGFiaWxpdHksIHByZXNlbnQpLCAiUDJQQ2FwYWJpbGl0eSIsIFNpZ1RsdlAyUENhcGFiaWxpdHksIERPVDExRl9UTFZfUDJQQ0FQQUJJTElUWSwgMCwgNSwgNSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEdPTmVnUmVzLCBHT0ludGVudCksIG9mZnNldG9mKHREb3QxMWZUTFZHT0ludGVudCwgcHJlc2VudCksICJHT0ludGVudCIsIFNpZ1RsdkdPSW50ZW50LCBET1QxMUZfVExWX0dPSU5URU5ULCAwLCA0LCA0LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdSZXMsIENvbmZpZ3VyYXRpb25UaW1lb3V0KSwgb2Zmc2V0b2YodERvdDExZlRMVkNvbmZpZ3VyYXRpb25UaW1lb3V0LCBwcmVzZW50KSwgIkNvbmZpZ3VyYXRpb25UaW1lb3V0IiwgU2lnVGx2Q29uZmlndXJhdGlvblRpbWVvdXQsIERPVDExRl9UTFZfQ09ORklHVVJBVElPTlRJTUVPVVQsIDAsIDUsIDUsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBHT05lZ1JlcywgT3BlcmF0aW5nQ2hhbm5lbCksIG9mZnNldG9mKHREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsLCBwcmVzZW50KSwgIk9wZXJhdGluZ0NoYW5uZWwiLCBTaWdUbHZPcGVyYXRpbmdDaGFubmVsLCBET1QxMUZfVExWX09QRVJBVElOR0NIQU5ORUwsIDAsIDgsIDgsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBHT05lZ1JlcywgSW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzKSwgb2Zmc2V0b2YodERvdDExZlRMVkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcywgcHJlc2VudCksICJJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MiLCBTaWdUbHZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MsIERPVDExRl9UTFZfSU5URU5ERURQMlBJTlRFUkZBQ0VBRERSRVNTLCAwLCA5LCA5LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdSZXMsIENoYW5uZWxMaXN0KSwgb2Zmc2V0b2YodERvdDExZlRMVkNoYW5uZWxMaXN0LCBwcmVzZW50KSwgIkNoYW5uZWxMaXN0IiwgU2lnVGx2Q2hhbm5lbExpc3QsIERPVDExRl9UTFZfQ0hBTk5FTExJU1QsIDAsIDYsIDI1NywgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEdPTmVnUmVzLCBQMlBEZXZpY2VJbmZvKSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUERldmljZUluZm8sIHByZXNlbnQpLCAiUDJQRGV2aWNlSW5mbyIsIFNpZ1RsdlAyUERldmljZUluZm8sIERPVDExRl9UTFZfUDJQREVWSUNFSU5GTywgMCwgMTksIDU1LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdSZXMsIFAyUEdyb3VwSWQpLCBvZmZzZXRvZih0RG90MTFmVExWUDJQR3JvdXBJZCwgcHJlc2VudCksICJQMlBHcm91cElkIiwgU2lnVGx2UDJQR3JvdXBJZCwgRE9UMTFGX1RMVl9QMlBHUk9VUElELCAwLCA5LCA0MSwgMCwgMSwgMiwgMCwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBHT05lZ1Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQMlBHT05lZ1JlcyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHN0YXR1cyA9IFVucGFja1RsdkNvcmUocEN0eCxwQnVmLGllbGVuLFRMVlNfUDJQR09OZWdSZXMsKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUDJQR09OZWdSZXMuICovCisKKyNkZWZpbmUgU2lnSWVQMlBHT05lZ1JlcyAoIDB4MDA1MiApCisKKworICAgIHN0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1AyUEdPTmVnV1BTWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdXUFMsIFZlcnNpb24pLCBvZmZzZXRvZih0RG90MTFmVExWVmVyc2lvbiwgcHJlc2VudCksICJWZXJzaW9uIiwgU2lnVGx2VmVyc2lvbiwgRE9UMTFGX1RMVl9WRVJTSU9OLCAwLCA1LCA1LCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdXUFMsIERldmljZVBhc3N3b3JkSUQpLCBvZmZzZXRvZih0RG90MTFmVExWRGV2aWNlUGFzc3dvcmRJRCwgcHJlc2VudCksICJEZXZpY2VQYXNzd29yZElEIiwgU2lnVGx2RGV2aWNlUGFzc3dvcmRJRCwgRE9UMTFGX1RMVl9ERVZJQ0VQQVNTV09SRElELCAwLCA2LCA2LCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUEdPTmVnV1BTKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVAyUEdPTmVnV1BTICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgc3RhdHVzID0gVW5wYWNrVGx2Q29yZShwQ3R4LHBCdWYsaWVsZW4sVExWU19QMlBHT05lZ1dQUywodEFOSV9VOCopcERzdCxzaXplb2YoKnBEc3QpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVQMlBHT05lZ1dQUy4gKi8KKworI2RlZmluZSBTaWdJZVAyUEdPTmVnV1BTICggMHgwMDUzICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUElFT3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVAyUElFT3BhcXVlICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPm51bV9kYXRhID0gKHRBTklfVTgpKCBpZWxlbiApOworICAgIGlmIChpZWxlbiA+IDI0OSl7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+ZGF0YSwgcEJ1ZiwgKCBpZWxlbiApICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVQMlBJRU9wYXF1ZS4gKi8KKworI2RlZmluZSBTaWdJZVAyUElFT3BhcXVlICggMHgwMDU0ICkKKworCisgICAgc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfUDJQSW52aXRhdGlvblJlcVsgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEludml0YXRpb25SZXEsIENvbmZpZ3VyYXRpb25UaW1lb3V0KSwgb2Zmc2V0b2YodERvdDExZlRMVkNvbmZpZ3VyYXRpb25UaW1lb3V0LCBwcmVzZW50KSwgIkNvbmZpZ3VyYXRpb25UaW1lb3V0IiwgU2lnVGx2Q29uZmlndXJhdGlvblRpbWVvdXQsIERPVDExRl9UTFZfQ09ORklHVVJBVElPTlRJTUVPVVQsIDAsIDUsIDUsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVxLCBJbnZpdGF0aW9uRmxhZ3MpLCBvZmZzZXRvZih0RG90MTFmVExWSW52aXRhdGlvbkZsYWdzLCBwcmVzZW50KSwgIkludml0YXRpb25GbGFncyIsIFNpZ1Rsdkludml0YXRpb25GbGFncywgRE9UMTFGX1RMVl9JTlZJVEFUSU9ORkxBR1MsIDAsIDQsIDQsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVxLCBPcGVyYXRpbmdDaGFubmVsKSwgb2Zmc2V0b2YodERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwsIHByZXNlbnQpLCAiT3BlcmF0aW5nQ2hhbm5lbCIsIFNpZ1Rsdk9wZXJhdGluZ0NoYW5uZWwsIERPVDExRl9UTFZfT1BFUkFUSU5HQ0hBTk5FTCwgMCwgOCwgOCwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEludml0YXRpb25SZXEsIFAyUEdyb3VwQnNzaWQpLCBvZmZzZXRvZih0RG90MTFmVExWUDJQR3JvdXBCc3NpZCwgcHJlc2VudCksICJQMlBHcm91cEJzc2lkIiwgU2lnVGx2UDJQR3JvdXBCc3NpZCwgRE9UMTFGX1RMVl9QMlBHUk9VUEJTU0lELCAwLCA5LCA5LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQSW52aXRhdGlvblJlcSwgQ2hhbm5lbExpc3QpLCBvZmZzZXRvZih0RG90MTFmVExWQ2hhbm5lbExpc3QsIHByZXNlbnQpLCAiQ2hhbm5lbExpc3QiLCBTaWdUbHZDaGFubmVsTGlzdCwgRE9UMTFGX1RMVl9DSEFOTkVMTElTVCwgMCwgNiwgMjU3LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQSW52aXRhdGlvblJlcSwgUDJQR3JvdXBJZCksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBHcm91cElkLCBwcmVzZW50KSwgIlAyUEdyb3VwSWQiLCBTaWdUbHZQMlBHcm91cElkLCBET1QxMUZfVExWX1AyUEdST1VQSUQsIDAsIDksIDQxLCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQSW52aXRhdGlvblJlcSwgUDJQRGV2aWNlSW5mbyksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvLCBwcmVzZW50KSwgIlAyUERldmljZUluZm8iLCBTaWdUbHZQMlBEZXZpY2VJbmZvLCBET1QxMUZfVExWX1AyUERFVklDRUlORk8sIDAsIDE5LCA1NSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBJbnZpdGF0aW9uUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVAyUEludml0YXRpb25SZXEgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1AyUEludml0YXRpb25SZXEsKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUDJQSW52aXRhdGlvblJlcS4gKi8KKworI2RlZmluZSBTaWdJZVAyUEludml0YXRpb25SZXEgKCAweDAwNTUgKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBJbnZpdGF0aW9uUmVzWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQSW52aXRhdGlvblJlcywgUDJQU3RhdHVzKSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUFN0YXR1cywgcHJlc2VudCksICJQMlBTdGF0dXMiLCBTaWdUbHZQMlBTdGF0dXMsIERPVDExRl9UTFZfUDJQU1RBVFVTLCAwLCA0LCA0LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQSW52aXRhdGlvblJlcywgQ29uZmlndXJhdGlvblRpbWVvdXQpLCBvZmZzZXRvZih0RG90MTFmVExWQ29uZmlndXJhdGlvblRpbWVvdXQsIHByZXNlbnQpLCAiQ29uZmlndXJhdGlvblRpbWVvdXQiLCBTaWdUbHZDb25maWd1cmF0aW9uVGltZW91dCwgRE9UMTFGX1RMVl9DT05GSUdVUkFUSU9OVElNRU9VVCwgMCwgNSwgNSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUEludml0YXRpb25SZXMsIE9wZXJhdGluZ0NoYW5uZWwpLCBvZmZzZXRvZih0RG90MTFmVExWT3BlcmF0aW5nQ2hhbm5lbCwgcHJlc2VudCksICJPcGVyYXRpbmdDaGFubmVsIiwgU2lnVGx2T3BlcmF0aW5nQ2hhbm5lbCwgRE9UMTFGX1RMVl9PUEVSQVRJTkdDSEFOTkVMLCAwLCA4LCA4LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQSW52aXRhdGlvblJlcywgUDJQR3JvdXBCc3NpZCksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBHcm91cEJzc2lkLCBwcmVzZW50KSwgIlAyUEdyb3VwQnNzaWQiLCBTaWdUbHZQMlBHcm91cEJzc2lkLCBET1QxMUZfVExWX1AyUEdST1VQQlNTSUQsIDAsIDksIDksIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVzLCBDaGFubmVsTGlzdCksIG9mZnNldG9mKHREb3QxMWZUTFZDaGFubmVsTGlzdCwgcHJlc2VudCksICJDaGFubmVsTGlzdCIsIFNpZ1RsdkNoYW5uZWxMaXN0LCBET1QxMUZfVExWX0NIQU5ORUxMSVNULCAwLCA2LCAyNTcsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQSW52aXRhdGlvblJlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVzICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgc3RhdHVzID0gVW5wYWNrVGx2Q29yZShwQ3R4LHBCdWYsaWVsZW4sVExWU19QMlBJbnZpdGF0aW9uUmVzLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVAyUEludml0YXRpb25SZXMuICovCisKKyNkZWZpbmUgU2lnSWVQMlBJbnZpdGF0aW9uUmVzICggMHgwMDU2ICkKKworCisgICAgc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfUDJQTm90aWNlT2ZBYnNlbmNlWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQTm90aWNlT2ZBYnNlbmNlLCBOb3RpY2VPZkFic2VuY2UpLCBvZmZzZXRvZih0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlLCBwcmVzZW50KSwgIk5vdGljZU9mQWJzZW5jZSIsIFNpZ1Rsdk5vdGljZU9mQWJzZW5jZSwgRE9UMTFGX1RMVl9OT1RJQ0VPRkFCU0VOQ0UsIDAsIDUsIDQxLCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVAyUE5vdGljZU9mQWJzZW5jZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQMlBOb3RpY2VPZkFic2VuY2UgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1AyUE5vdGljZU9mQWJzZW5jZSwodEFOSV9VOCopcERzdCxzaXplb2YoKnBEc3QpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVQMlBOb3RpY2VPZkFic2VuY2UuICovCisKKyNkZWZpbmUgU2lnSWVQMlBOb3RpY2VPZkFic2VuY2UgKCAweDAwNTcgKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBQcmVzZW5jZVJlc3BvbnNlWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQUHJlc2VuY2VSZXNwb25zZSwgUDJQU3RhdHVzKSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUFN0YXR1cywgcHJlc2VudCksICJQMlBTdGF0dXMiLCBTaWdUbHZQMlBTdGF0dXMsIERPVDExRl9UTFZfUDJQU1RBVFVTLCAwLCA0LCA0LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQUHJlc2VuY2VSZXNwb25zZSwgTm90aWNlT2ZBYnNlbmNlKSwgb2Zmc2V0b2YodERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSwgcHJlc2VudCksICJOb3RpY2VPZkFic2VuY2UiLCBTaWdUbHZOb3RpY2VPZkFic2VuY2UsIERPVDExRl9UTFZfTk9USUNFT0ZBQlNFTkNFLCAwLCA1LCA0MSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQMlBQcmVzZW5jZVJlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVAyUFByZXNlbmNlUmVzcG9uc2UgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1AyUFByZXNlbmNlUmVzcG9uc2UsKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUDJQUHJlc2VuY2VSZXNwb25zZS4gKi8KKworI2RlZmluZSBTaWdJZVAyUFByZXNlbmNlUmVzcG9uc2UgKCAweDAwNTggKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBQcm9iZVJlcVsgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUFByb2JlUmVxLCBQMlBDYXBhYmlsaXR5KSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUENhcGFiaWxpdHksIHByZXNlbnQpLCAiUDJQQ2FwYWJpbGl0eSIsIFNpZ1RsdlAyUENhcGFiaWxpdHksIERPVDExRl9UTFZfUDJQQ0FQQUJJTElUWSwgMCwgNSwgNSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUFByb2JlUmVxLCBQMlBEZXZpY2VJZCksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBEZXZpY2VJZCwgcHJlc2VudCksICJQMlBEZXZpY2VJZCIsIFNpZ1RsdlAyUERldmljZUlkLCBET1QxMUZfVExWX1AyUERFVklDRUlELCAwLCA5LCA5LCAwLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQUHJvYmVSZXEsIExpc3RlbkNoYW5uZWwpLCBvZmZzZXRvZih0RG90MTFmVExWTGlzdGVuQ2hhbm5lbCwgcHJlc2VudCksICJMaXN0ZW5DaGFubmVsIiwgU2lnVGx2TGlzdGVuQ2hhbm5lbCwgRE9UMTFGX1RMVl9MSVNURU5DSEFOTkVMLCAwLCA4LCA4LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQUHJvYmVSZXEsIEV4dGVuZGVkTGlzdGVuVGltaW5nKSwgb2Zmc2V0b2YodERvdDExZlRMVkV4dGVuZGVkTGlzdGVuVGltaW5nLCBwcmVzZW50KSwgIkV4dGVuZGVkTGlzdGVuVGltaW5nIiwgU2lnVGx2RXh0ZW5kZWRMaXN0ZW5UaW1pbmcsIERPVDExRl9UTFZfRVhURU5ERURMSVNURU5USU1JTkcsIDAsIDcsIDcsIDAsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBQcm9iZVJlcSwgT3BlcmF0aW5nQ2hhbm5lbCksIG9mZnNldG9mKHREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsLCBwcmVzZW50KSwgIk9wZXJhdGluZ0NoYW5uZWwiLCBTaWdUbHZPcGVyYXRpbmdDaGFubmVsLCBET1QxMUZfVExWX09QRVJBVElOR0NIQU5ORUwsIDAsIDgsIDgsIDAsIDEsIDIsIDAsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQUHJvYmVSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUDJQUHJvYmVSZXEgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1AyUFByb2JlUmVxLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVAyUFByb2JlUmVxLiAqLworCisjZGVmaW5lIFNpZ0llUDJQUHJvYmVSZXEgKCAweDAwNTkgKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBQcm9iZVJlc1sgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUFByb2JlUmVzLCBQMlBDYXBhYmlsaXR5KSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUENhcGFiaWxpdHksIHByZXNlbnQpLCAiUDJQQ2FwYWJpbGl0eSIsIFNpZ1RsdlAyUENhcGFiaWxpdHksIERPVDExRl9UTFZfUDJQQ0FQQUJJTElUWSwgMCwgNSwgNSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUFByb2JlUmVzLCBFeHRlbmRlZExpc3RlblRpbWluZyksIG9mZnNldG9mKHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZywgcHJlc2VudCksICJFeHRlbmRlZExpc3RlblRpbWluZyIsIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nLCBET1QxMUZfVExWX0VYVEVOREVETElTVEVOVElNSU5HLCAwLCA3LCA3LCAwLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQUHJvYmVSZXMsIE5vdGljZU9mQWJzZW5jZSksIG9mZnNldG9mKHREb3QxMWZUTFZOb3RpY2VPZkFic2VuY2UsIHByZXNlbnQpLCAiTm90aWNlT2ZBYnNlbmNlIiwgU2lnVGx2Tm90aWNlT2ZBYnNlbmNlLCBET1QxMUZfVExWX05PVElDRU9GQUJTRU5DRSwgMCwgNSwgNDEsIDAsIDEsIDIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBQcm9iZVJlcywgUDJQRGV2aWNlSW5mbyksIG9mZnNldG9mKHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvLCBwcmVzZW50KSwgIlAyUERldmljZUluZm8iLCBTaWdUbHZQMlBEZXZpY2VJbmZvLCBET1QxMUZfVExWX1AyUERFVklDRUlORk8sIDAsIDE5LCA1NSwgMSwgMSwgMiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUFByb2JlUmVzLCBQMlBHcm91cEluZm8pLCBvZmZzZXRvZih0RG90MTFmVExWUDJQR3JvdXBJbmZvLCBwcmVzZW50KSwgIlAyUEdyb3VwSW5mbyIsIFNpZ1RsdlAyUEdyb3VwSW5mbywgRE9UMTFGX1RMVl9QMlBHUk9VUElORk8sIDAsIDMsIDEwMjcsIDAsIDEsIDIsIDAsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQUHJvYmVSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUDJQUHJvYmVSZXMgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1AyUFByb2JlUmVzLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVAyUFByb2JlUmVzLiAqLworCisjZGVmaW5lIFNpZ0llUDJQUHJvYmVSZXMgKCAweDAwNWEgKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXFbIF0gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEsIFAyUENhcGFiaWxpdHkpLCBvZmZzZXRvZih0RG90MTFmVExWUDJQQ2FwYWJpbGl0eSwgcHJlc2VudCksICJQMlBDYXBhYmlsaXR5IiwgU2lnVGx2UDJQQ2FwYWJpbGl0eSwgRE9UMTFGX1RMVl9QMlBDQVBBQklMSVRZLCAwLCA1LCA1LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLCBQMlBEZXZpY2VJbmZvKSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUERldmljZUluZm8sIHByZXNlbnQpLCAiUDJQRGV2aWNlSW5mbyIsIFNpZ1RsdlAyUERldmljZUluZm8sIERPVDExRl9UTFZfUDJQREVWSUNFSU5GTywgMCwgMTksIDU1LCAxLCAxLCAyLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLCBQMlBHcm91cElkKSwgb2Zmc2V0b2YodERvdDExZlRMVlAyUEdyb3VwSWQsIHByZXNlbnQpLCAiUDJQR3JvdXBJZCIsIFNpZ1RsdlAyUEdyb3VwSWQsIERPVDExRl9UTFZfUDJQR1JPVVBJRCwgMCwgOSwgNDEsIDEsIDEsIDIsIDAsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHN0YXR1cyA9IFVucGFja1RsdkNvcmUocEN0eCxwQnVmLGllbGVuLFRMVlNfUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS4gKi8KKworI2RlZmluZSBTaWdJZVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSAoIDB4MDA1YiApCisKKworICAgIHN0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1AyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlc1sgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcywgQ29uZmlnTWV0aG9kcyksIG9mZnNldG9mKHREb3QxMWZUTFZDb25maWdNZXRob2RzLCBwcmVzZW50KSwgIkNvbmZpZ01ldGhvZHMiLCBTaWdUbHZDb25maWdNZXRob2RzLCBET1QxMUZfVExWX0NPTkZJR01FVEhPRFMsIDAsIDYsIDYsIDEsIDIsIDIsIDEsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHN0YXR1cyA9IFVucGFja1RsdkNvcmUocEN0eCxwQnVmLGllbGVuLFRMVlNfUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcy4gKi8KKworI2RlZmluZSBTaWdJZVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcyAoIDB4MDA1YyApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVQb3dlckNhcHModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUG93ZXJDYXBzICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPm1pblR4UG93ZXIgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5tYXhUeFBvd2VyID0gKnBCdWY7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVQb3dlckNhcHMuICovCisKKyNkZWZpbmUgU2lnSWVQb3dlckNhcHMgKCAweDAwNWQgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUG93ZXJDb25zdHJhaW50cyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPmxvY2FsUG93ZXJDb25zdHJhaW50cyA9ICpwQnVmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUG93ZXJDb25zdHJhaW50cy4gKi8KKworI2RlZmluZSBTaWdJZVBvd2VyQ29uc3RyYWludHMgKCAweDAwNWUgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUUJTU0xvYWQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUUJTU0xvYWQgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnN0YWNvdW50LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICBwRHN0LT5jaGF1dGlsID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmF2YWlsLCBwQnVmLCAwKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVFCU1NMb2FkLiAqLworCisjZGVmaW5lIFNpZ0llUUJTU0xvYWQgKCAweDAwNWYgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUU9TQ2Fwc0FwKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVFPU0NhcHNBcCAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1U4IHRtcDU3X187CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgdG1wNTdfXyA9ICpwQnVmOworICAgIHBEc3QtPnJlc2VydmVkID0gdG1wNTdfXyA+PiAwICYgMHgxOworICAgIHBEc3QtPnR4b3ByZXEgPSB0bXA1N19fID4+IDEgJiAweDE7CisgICAgcERzdC0+cXJlcSA9IHRtcDU3X18gPj4gMiAmIDB4MTsKKyAgICBwRHN0LT5xYWNrID0gdG1wNTdfXyA+PiAzICYgMHgxOworICAgIHBEc3QtPmNvdW50ID0gdG1wNTdfXyA+PiA0ICYgMHhmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUU9TQ2Fwc0FwLiAqLworCisjZGVmaW5lIFNpZ0llUU9TQ2Fwc0FwICggMHgwMDYwICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVFPU0NhcHNTdGF0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTggdG1wNThfXzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICB0bXA1OF9fID0gKnBCdWY7CisgICAgcERzdC0+bW9yZV9kYXRhX2FjayA9IHRtcDU4X18gPj4gMCAmIDB4MTsKKyAgICBwRHN0LT5tYXhfc3BfbGVuZ3RoID0gdG1wNThfXyA+PiAxICYgMHgzOworICAgIHBEc3QtPnFhY2sgPSB0bXA1OF9fID4+IDMgJiAweDE7CisgICAgcERzdC0+YWNiZV91YXBzZCA9IHRtcDU4X18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5hY2JrX3VhcHNkID0gdG1wNThfXyA+PiA1ICYgMHgxOworICAgIHBEc3QtPmFjdmlfdWFwc2QgPSB0bXA1OF9fID4+IDYgJiAweDE7CisgICAgcERzdC0+YWN2b191YXBzZCA9IHRtcDU4X18gPj4gNyAmIDB4MTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVFPU0NhcHNTdGF0aW9uLiAqLworCisjZGVmaW5lIFNpZ0llUU9TQ2Fwc1N0YXRpb24gKCAweDAwNjEgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llUXVpZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUXVpZXQgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+Y291bnQgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5wZXJpb2QgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+ZHVyYXRpb24sIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5vZmZzZXQsIHBCdWYsIDApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llUXVpZXQuICovCisKKyNkZWZpbmUgU2lnSWVRdWlldCAoIDB4MDA2MiApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVSQ1BJSUUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUkNQSUlFICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnJjcGkgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVJDUElJRS4gKi8KKworI2RlZmluZSBTaWdJZVJDUElJRSAoIDB4MDA2MyApCisKKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19SSUNEYXRhRGVzY1sgXSA9IHsKKyAgICAgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19SSUNEYXRhRGVzY1sgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBSSUNEYXRhKSwgb2Zmc2V0b2YodERvdDExZklFUklDRGF0YSwgcHJlc2VudCksIDAsICJSSUNEYXRhIiAsIDAsIDYsIDYsIFNpZ0llUklDRGF0YSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JJQ0RBVEEsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgUklDRGVzY3JpcHRvciksIG9mZnNldG9mKHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IsIHByZXNlbnQpLCAwLCAiUklDRGVzY3JpcHRvciIgLCAwLCAzLCAyNTgsIFNpZ0llUklDRGVzY3JpcHRvciwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JJQ0RFU0NSSVBUT1IsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgVFNQRUMpLCBvZmZzZXRvZih0RG90MTFmSUVUU1BFQywgcHJlc2VudCksIDAsICJUU1BFQyIgLCAwLCA1NywgNTcsIFNpZ0llVFNQRUMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9UU1BFQywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBUQ0xBUyksIG9mZnNldG9mKHREb3QxMWZJRVRDTEFTLCBwcmVzZW50KSwgb2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIG51bV9UQ0xBUyksICJUQ0xBUyIgLCAyLCA3LCA0NSwgU2lnSWVUQ0xBUywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1RDTEFTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIFRDTEFTU1BST0MpLCBvZmZzZXRvZih0RG90MTFmSUVUQ0xBU1NQUk9DLCBwcmVzZW50KSwgMCwgIlRDTEFTU1BST0MiICwgMCwgMywgMywgU2lnSWVUQ0xBU1NQUk9DLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVENMQVNTUFJPQywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBUU0RlbGF5KSwgb2Zmc2V0b2YodERvdDExZklFVFNEZWxheSwgcHJlc2VudCksIDAsICJUU0RlbGF5IiAsIDAsIDYsIDYsIFNpZ0llVFNEZWxheSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1RTREVMQVksIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgU2NoZWR1bGUpLCBvZmZzZXRvZih0RG90MTFmSUVTY2hlZHVsZSwgcHJlc2VudCksIDAsICJTY2hlZHVsZSIgLCAwLCAxNiwgMTYsIFNpZ0llU2NoZWR1bGUsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TQ0hFRFVMRSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBXTU1UU1BFQyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVRTUEVDLCBwcmVzZW50KSwgMCwgIldNTVRTUEVDIiAsIDAsIDYzLCA2MywgU2lnSWVXTU1UU1BFQywgezAsIDgwLCAyNDIsIDIsIDJ9LCA1LCBET1QxMUZfRUlEX1dNTVRTUEVDLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIFdNTVRDTEFTKSwgb2Zmc2V0b2YodERvdDExZklFV01NVENMQVMsIHByZXNlbnQpLCBvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgbnVtX1dNTVRDTEFTKSwgIldNTVRDTEFTIiAsIDIsIDEzLCA1MSwgU2lnSWVXTU1UQ0xBUywgezAsIDgwLCAyNDIsIDIsIDZ9LCA1LCBET1QxMUZfRUlEX1dNTVRDTEFTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIFdNTVRDTEFTUFJPQyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVRDTEFTUFJPQywgcHJlc2VudCksIDAsICJXTU1UQ0xBU1BST0MiICwgMCwgOSwgOSwgU2lnSWVXTU1UQ0xBU1BST0MsIHswLCA4MCwgMjQyLCAyLCA3fSwgNSwgRE9UMTFGX0VJRF9XTU1UQ0xBU1BST0MsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgV01NVFNEZWxheSksIG9mZnNldG9mKHREb3QxMWZJRVdNTVRTRGVsYXksIHByZXNlbnQpLCAwLCAiV01NVFNEZWxheSIgLCAwLCAxMiwgMTIsIFNpZ0llV01NVFNEZWxheSwgezAsIDgwLCAyNDIsIDIsIDh9LCA1LCBET1QxMUZfRUlEX1dNTVRTREVMQVksIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgV01NU2NoZWR1bGUpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1TY2hlZHVsZSwgcHJlc2VudCksIDAsICJXTU1TY2hlZHVsZSIgLCAwLCAyMiwgMjIsIFNpZ0llV01NU2NoZWR1bGUsIHswLCA4MCwgMjQyLCAyLCA5fSwgNSwgRE9UMTFGX0VJRF9XTU1TQ0hFRFVMRSwgMCwgfSwKKyAgICAgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwKKyAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVJJQ0RhdGFEZXNjKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVJJQ0RhdGFEZXNjICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgICh2b2lkKXBDdHg7CisgICAgc3RhdHVzIHw9IFVucGFja0NvcmUocEN0eCwKKyAgICAgICAgICAgICAgICAgICAgIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICBpZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgIEZGU19SSUNEYXRhRGVzYywKKyAgICAgICAgICAgICAgICAgICAgIElFU19SSUNEYXRhRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VOCogKXBEc3QsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnBEc3QpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVSSUNEYXRhRGVzYy4gKi8KKworI2RlZmluZSBTaWdJZVJJQ0RhdGFEZXNjICggMHgwMDY0ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVJTTih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVSU04gKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMTYgdG1wNTlfXzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+dmVyc2lvbiwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgaWYgKHBEc3QtPnZlcnNpb24gIT0gMHgxKQorICAgIHsKKyAgICAgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICAgICAgcmV0dXJuICggc3RhdHVzIHwgRE9UMTFGX0JBRF9GSVhFRF9WQUxVRSApOworICAgIH0KKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmdwX2NpcGhlcl9zdWl0ZSwgcEJ1ZiwgNCk7CisgICAgcEJ1ZiArPSA0OworICAgIGllbGVuIC09ICh0QU5JX1U4KTQ7CisgICAgaWYgKCAhIGllbGVuICkKKyAgICB7CisgICAgICAgIHBEc3QtPnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCA9IDBVOworICAgICAgICBwRHN0LT5ha21fc3VpdGVfY291bnQgPSAwVTsKKyAgICAgICAgcERzdC0+cG1raWRfY291bnQgPSAwVTsKKyAgICAgICAgcmV0dXJuIDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50LCBwQnVmLCAwKTsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgIH0KKyAgICBpZiAocERzdC0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ID4gNCl7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+cHdpc2VfY2lwaGVyX3N1aXRlcywgcEJ1ZiwgKCBwRHN0LT5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKiA0ICkgKTsKKyAgICBwQnVmICs9ICggcERzdC0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ICogNCApOworICAgIGllbGVuIC09ICggcERzdC0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ICogNCApOworICAgIGlmICggISBpZWxlbiApCisgICAgeworICAgICAgICBwRHN0LT5ha21fc3VpdGVfY291bnQgPSAwVTsKKyAgICAgICAgcERzdC0+cG1raWRfY291bnQgPSAwVTsKKyAgICAgICAgcmV0dXJuIDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YWttX3N1aXRlX2NvdW50LCBwQnVmLCAwKTsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgIH0KKyAgICBpZiAocERzdC0+YWttX3N1aXRlX2NvdW50ID4gNCl7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+YWttX3N1aXRlcywgcEJ1ZiwgKCBwRHN0LT5ha21fc3VpdGVfY291bnQgKiA0ICkgKTsKKyAgICBwQnVmICs9ICggcERzdC0+YWttX3N1aXRlX2NvdW50ICogNCApOworICAgIGllbGVuIC09ICggcERzdC0+YWttX3N1aXRlX2NvdW50ICogNCApOworICAgIGZyYW1lc250b2hzKHBDdHgsICZ0bXA1OV9fLCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gMjsKKyAgICBwRHN0LT5wcmVhdXRoID0gdG1wNTlfXyA+PiAwICYgMHgxOworICAgIHBEc3QtPm5vX3B3aXNlID0gdG1wNTlfXyA+PiAxICYgMHgxOworICAgIHBEc3QtPlBUS1NBX3JlcGxheV9jb3VudGVyID0gdG1wNTlfXyA+PiAyICYgMHgzOworICAgIHBEc3QtPkdUS1NBX3JlcGxheV9jb3VudGVyID0gdG1wNTlfXyA+PiA0ICYgMHgzOworICAgIHBEc3QtPnJlc2VydmVkID0gdG1wNTlfXyA+PiA2ICYgMHgzZmY7CisgICAgaWYgKCAhIGllbGVuICkKKyAgICB7CisgICAgICAgIHBEc3QtPnBta2lkX2NvdW50ID0gMFU7CisgICAgICAgIHJldHVybiAwVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnBta2lkX2NvdW50LCBwQnVmLCAwKTsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgIH0KKyAgICBpZiAocERzdC0+cG1raWRfY291bnQgPiA0KXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5wbWtpZCwgcEJ1ZiwgKCBwRHN0LT5wbWtpZF9jb3VudCAqIDE2ICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVJTTi4gKi8KKworI2RlZmluZSBTaWdJZVJTTiAoIDB4MDA2NSApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVSU05JSUUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUlNOSUlFICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnJzbmkgPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVJTTklJRS4gKi8KKworI2RlZmluZSBTaWdJZVJTTklJRSAoIDB4MDA2NiApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVSU05PcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFUlNOT3BhcXVlICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPm51bV9kYXRhID0gKHRBTklfVTgpKCBpZWxlbiApOworICAgIGlmIChpZWxlbiA+IDI1Myl7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+ZGF0YSwgcEJ1ZiwgKCBpZWxlbiApICk7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVSU05PcGFxdWUuICovCisKKyNkZWZpbmUgU2lnSWVSU05PcGFxdWUgKCAweDAwNjcgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llU3VwcENoYW5uZWxzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVN1cHBDaGFubmVscyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5udW1fYmFuZHMgPSAodEFOSV9VOCkoIGllbGVuIC8gMiApOworICAgIGlmIChpZWxlbiAvIDIgPiA0OCl7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+YmFuZHMsIHBCdWYsICggaWVsZW4gKSApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llU3VwcENoYW5uZWxzLiAqLworCisjZGVmaW5lIFNpZ0llU3VwcENoYW5uZWxzICggMHgwMDY4ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVN1cHBSYXRlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVTdXBwUmF0ZXMgKnBEc3QpCit7CisgICAgdEFOSV9VOCBpOworICAgIHRBTklfVTggcmF0ZV9pbmR4ID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWVsZW47IGkrKykgeworICAgICAgICBpZiAoKERPVDExRl9JU19CR19SQVRFKHBCdWZbaV0gJiAweDdGKSkgJiYgCisgICAgICAgICAgICAocmF0ZV9pbmR4IDwgMTIpKSB7CisgICAgICAgICAgICBwRHN0LT5yYXRlc1tyYXRlX2luZHgrK10gPSBwQnVmW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocmF0ZV9pbmR4ID09IDApIHsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgcERzdC0+bnVtX3JhdGVzID0gcmF0ZV9pbmR4OworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llU3VwcFJhdGVzLiAqLworCisjZGVmaW5lIFNpZ0llU3VwcFJhdGVzICggMHgwMDY5ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVRJTSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVUSU0gKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+ZHRpbV9jb3VudCA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHBEc3QtPmR0aW1fcGVyaW9kID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+Ym1wY3RsID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+bnVtX3ZibXAgPSAodEFOSV9VOCkoIGllbGVuICk7CisgICAgaWYgKGllbGVuID4gMjUxKXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT52Ym1wLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVRJTS4gKi8KKworI2RlZmluZSBTaWdJZVRJTSAoIDB4MDA2YSApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVUUENSZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFVFBDUmVwb3J0ICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnR4X3Bvd2VyID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+bGlua19tYXJnaW4gPSAqcEJ1ZjsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVRQQ1JlcG9ydC4gKi8KKworI2RlZmluZSBTaWdJZVRQQ1JlcG9ydCAoIDB4MDA2YiApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVUUENSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVRQQ1JlcXVlc3QgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVUUENSZXF1ZXN0LiAqLworCisjZGVmaW5lIFNpZ0llVFBDUmVxdWVzdCAoIDB4MDA2YyApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXQVBJKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVdBUEkgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMTYgdG1wNjBfXzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+dmVyc2lvbiwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgaWYgKHBEc3QtPnZlcnNpb24gIT0gMHgxKQorICAgIHsKKyAgICAgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICAgICAgcmV0dXJuICggc3RhdHVzIHwgRE9UMTFGX0JBRF9GSVhFRF9WQUxVRSApOworICAgIH0KKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YWttX3N1aXRlX2NvdW50LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICBpZiAocERzdC0+YWttX3N1aXRlX2NvdW50ID4gNCl7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+YWttX3N1aXRlcywgcEJ1ZiwgKCBwRHN0LT5ha21fc3VpdGVfY291bnQgKiA0ICkgKTsKKyAgICBwQnVmICs9ICggcERzdC0+YWttX3N1aXRlX2NvdW50ICogNCApOworICAgIGllbGVuIC09ICggcERzdC0+YWttX3N1aXRlX2NvdW50ICogNCApOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgaWYgKHBEc3QtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50ID4gNCl7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+dW5pY2FzdF9jaXBoZXJfc3VpdGVzLCBwQnVmLCAoIHBEc3QtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50ICogNCApICk7CisgICAgcEJ1ZiArPSAoIHBEc3QtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50ICogNCApOworICAgIGllbGVuIC09ICggcERzdC0+dW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQgKiA0ICk7CisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5tdWx0aWNhc3RfY2lwaGVyX3N1aXRlLCBwQnVmLCA0KTsKKyAgICBwQnVmICs9IDQ7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpNDsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmdG1wNjBfXywgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09IDI7CisgICAgcERzdC0+cHJlYXV0aCA9IHRtcDYwX18gPj4gMCAmIDB4MTsKKyAgICBwRHN0LT5yZXNlcnZlZCA9IHRtcDYwX18gPj4gMSAmIDB4N2ZmZjsKKyAgICBpZiAoICEgaWVsZW4gKQorICAgIHsKKyAgICAgICAgcERzdC0+YmtpZF9jb3VudCA9IDBVOworICAgICAgICByZXR1cm4gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5ia2lkX2NvdW50LCBwQnVmLCAwKTsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgIH0KKyAgICBpZiAocERzdC0+YmtpZF9jb3VudCA+IDQpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmJraWQsIHBCdWYsICggcERzdC0+YmtpZF9jb3VudCAqIDE2ICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVdBUEkuICovCisKKyNkZWZpbmUgU2lnSWVXQVBJICggMHgwMDZkICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdBUElPcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFV0FQSU9wYXF1ZSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT5udW1fZGF0YSA9ICh0QU5JX1U4KSggaWVsZW4gKTsKKyAgICBpZiAoaWVsZW4gPiAyNTMpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPmRhdGEsIHBCdWYsICggaWVsZW4gKSApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llV0FQSU9wYXF1ZS4gKi8KKworI2RlZmluZSBTaWdJZVdBUElPcGFxdWUgKCAweDAwNmUgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llV0ZBVFBDKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVdGQVRQQyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT50eFBvd2VyID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgcERzdC0+bGlua01hcmdpbiA9ICpwQnVmOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llV0ZBVFBDLiAqLworCisjZGVmaW5lIFNpZ0llV0ZBVFBDICggMHgwMDZmICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdNTUNhcHModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFV01NQ2FwcyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1U4IHRtcDYxX187CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+dmVyc2lvbiA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIGlmIChwRHN0LT52ZXJzaW9uICE9IDB4MSkKKyAgICB7CisgICAgICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgICAgIHJldHVybiAoIHN0YXR1cyB8IERPVDExRl9CQURfRklYRURfVkFMVUUgKTsKKyAgICB9CisgICAgdG1wNjFfXyA9ICpwQnVmOworICAgIHBEc3QtPnJlc2VydmVkID0gdG1wNjFfXyA+PiAwICYgMHhmOworICAgIHBEc3QtPnFhY2sgPSB0bXA2MV9fID4+IDQgJiAweDE7CisgICAgcERzdC0+cXVldWVfcmVxdWVzdCA9IHRtcDYxX18gPj4gNSAmIDB4MTsKKyAgICBwRHN0LT50eG9wX3JlcXVlc3QgPSB0bXA2MV9fID4+IDYgJiAweDE7CisgICAgcERzdC0+bW9yZV9hY2sgPSB0bXA2MV9fID4+IDcgJiAweDE7CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVXTU1DYXBzLiAqLworCisjZGVmaW5lIFNpZ0llV01NQ2FwcyAoIDB4MDA3MCApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXTU1JbmZvQXAodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFV01NSW5mb0FwICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTggdG1wNjJfXzsKKyAgICAodm9pZCkgcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBpZiAocERzdC0+cHJlc2VudCkgc3RhdHVzID0gRE9UMTFGX0RVUExJQ0FURV9JRTsKKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBwRHN0LT52ZXJzaW9uID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09ICh0QU5JX1U4KTE7CisgICAgdG1wNjJfXyA9ICpwQnVmOworICAgIHBEc3QtPnBhcmFtX3NldF9jb3VudCA9IHRtcDYyX18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5yZXNlcnZlZCA9IHRtcDYyX18gPj4gNCAmIDB4NzsKKyAgICBwRHN0LT51YXBzZCA9IHRtcDYyX18gPj4gNyAmIDB4MTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVdNTUluZm9BcC4gKi8KKworI2RlZmluZSBTaWdJZVdNTUluZm9BcCAoIDB4MDA3MSApCisKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXTU1JbmZvU3RhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1U4IHRtcDYzX187CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+dmVyc2lvbiA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkxOworICAgIHRtcDYzX18gPSAqcEJ1ZjsKKyAgICBwRHN0LT5hY3ZvX3VhcHNkID0gdG1wNjNfXyA+PiAwICYgMHgxOworICAgIHBEc3QtPmFjdmlfdWFwc2QgPSB0bXA2M19fID4+IDEgJiAweDE7CisgICAgcERzdC0+YWNia191YXBzZCA9IHRtcDYzX18gPj4gMiAmIDB4MTsKKyAgICBwRHN0LT5hY2JlX3VhcHNkID0gdG1wNjNfXyA+PiAzICYgMHgxOworICAgIHBEc3QtPnJlc2VydmVkMSA9IHRtcDYzX18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5tYXhfc3BfbGVuZ3RoID0gdG1wNjNfXyA+PiA1ICYgMHgzOworICAgIHBEc3QtPnJlc2VydmVkMiA9IHRtcDYzX18gPj4gNyAmIDB4MTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVdNTUluZm9TdGF0aW9uLiAqLworCisjZGVmaW5lIFNpZ0llV01NSW5mb1N0YXRpb24gKCAweDAwNzIgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llV01NUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVdNTVBhcmFtcyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1U4IHRtcDY0X187CisgICAgdEFOSV9VOCB0bXA2NV9fOworICAgIHRBTklfVTggdG1wNjZfXzsKKyAgICB0QU5JX1U4IHRtcDY3X187CisgICAgdEFOSV9VOCB0bXA2OF9fOworICAgIHRBTklfVTggdG1wNjlfXzsKKyAgICB0QU5JX1U4IHRtcDcwX187CisgICAgdEFOSV9VOCB0bXA3MV9fOworICAgICh2b2lkKSBwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIGlmIChwRHN0LT5wcmVzZW50KSBzdGF0dXMgPSBET1QxMUZfRFVQTElDQVRFX0lFOworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHBEc3QtPnZlcnNpb24gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBpZiAocERzdC0+dmVyc2lvbiAhPSAweDEpCisgICAgeworICAgICAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gKCBzdGF0dXMgfCBET1QxMUZfQkFEX0ZJWEVEX1ZBTFVFICk7CisgICAgfQorICAgIHBEc3QtPnFvc0luZm8gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICBwRHN0LT5yZXNlcnZlZDIgPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMTsKKyAgICB0bXA2NF9fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+YWNiZV9haWZzbiA9IHRtcDY0X18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5hY2JlX2FjbSA9IHRtcDY0X18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5hY2JlX2FjaSA9IHRtcDY0X18gPj4gNSAmIDB4MzsKKyAgICBwRHN0LT51bnVzZWQxID0gdG1wNjRfXyA+PiA3ICYgMHgxOworICAgIHRtcDY1X18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5hY2JlX2Fjd21pbiA9IHRtcDY1X18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5hY2JlX2Fjd21heCA9IHRtcDY1X18gPj4gNCAmIDB4ZjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YWNiZV90eG9wbGltaXQsIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgIHRtcDY2X18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5hY2JrX2FpZnNuID0gdG1wNjZfXyA+PiAwICYgMHhmOworICAgIHBEc3QtPmFjYmtfYWNtID0gdG1wNjZfXyA+PiA0ICYgMHgxOworICAgIHBEc3QtPmFjYmtfYWNpID0gdG1wNjZfXyA+PiA1ICYgMHgzOworICAgIHBEc3QtPnVudXNlZDIgPSB0bXA2Nl9fID4+IDcgJiAweDE7CisgICAgdG1wNjdfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPmFjYmtfYWN3bWluID0gdG1wNjdfXyA+PiAwICYgMHhmOworICAgIHBEc3QtPmFjYmtfYWN3bWF4ID0gdG1wNjdfXyA+PiA0ICYgMHhmOworICAgIGZyYW1lc250b2hzKHBDdHgsICZwRHN0LT5hY2JrX3R4b3BsaW1pdCwgcEJ1ZiwgMCk7CisgICAgcEJ1ZiArPSAyOworICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgdG1wNjhfXyA9ICpwQnVmOworICAgIHBCdWYgKz0gMTsKKyAgICBpZWxlbiAtPSAxOworICAgIHBEc3QtPmFjdmlfYWlmc24gPSB0bXA2OF9fID4+IDAgJiAweGY7CisgICAgcERzdC0+YWN2aV9hY20gPSB0bXA2OF9fID4+IDQgJiAweDE7CisgICAgcERzdC0+YWN2aV9hY2kgPSB0bXA2OF9fID4+IDUgJiAweDM7CisgICAgcERzdC0+dW51c2VkMyA9IHRtcDY4X18gPj4gNyAmIDB4MTsKKyAgICB0bXA2OV9fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+YWN2aV9hY3dtaW4gPSB0bXA2OV9fID4+IDAgJiAweGY7CisgICAgcERzdC0+YWN2aV9hY3dtYXggPSB0bXA2OV9fID4+IDQgJiAweGY7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmFjdmlfdHhvcGxpbWl0LCBwQnVmLCAwKTsKKyAgICBwQnVmICs9IDI7CisgICAgaWVsZW4gLT0gKHRBTklfVTgpMjsKKyAgICB0bXA3MF9fID0gKnBCdWY7CisgICAgcEJ1ZiArPSAxOworICAgIGllbGVuIC09IDE7CisgICAgcERzdC0+YWN2b19haWZzbiA9IHRtcDcwX18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5hY3ZvX2FjbSA9IHRtcDcwX18gPj4gNCAmIDB4MTsKKyAgICBwRHN0LT5hY3ZvX2FjaSA9IHRtcDcwX18gPj4gNSAmIDB4MzsKKyAgICBwRHN0LT51bnVzZWQ0ID0gdG1wNzBfXyA+PiA3ICYgMHgxOworICAgIHRtcDcxX18gPSAqcEJ1ZjsKKyAgICBwQnVmICs9IDE7CisgICAgaWVsZW4gLT0gMTsKKyAgICBwRHN0LT5hY3ZvX2Fjd21pbiA9IHRtcDcxX18gPj4gMCAmIDB4ZjsKKyAgICBwRHN0LT5hY3ZvX2Fjd21heCA9IHRtcDcxX18gPj4gNCAmIDB4ZjsKKyAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+YWN2b190eG9wbGltaXQsIHBCdWYsIDApOworICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llV01NUGFyYW1zLiAqLworCisjZGVmaW5lIFNpZ0llV01NUGFyYW1zICggMHgwMDczICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdQQSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVXUEEgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPnZlcnNpb24sIHBCdWYsIDApOworICAgIHBCdWYgKz0gMjsKKyAgICBpZWxlbiAtPSAodEFOSV9VOCkyOworICAgIGlmIChwRHN0LT52ZXJzaW9uICE9IDB4MSkKKyAgICB7CisgICAgICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgICAgIHJldHVybiAoIHN0YXR1cyB8IERPVDExRl9CQURfRklYRURfVkFMVUUgKTsKKyAgICB9CisgICAgaWYgKCAhIGllbGVuICkKKyAgICB7CisgICAgICAgIHBEc3QtPm11bHRpY2FzdF9jaXBoZXJfcHJlc2VudCA9IDBVOworICAgICAgICBwRHN0LT51bmljYXN0X2NpcGhlcl9jb3VudCA9IDBVOworICAgICAgICBwRHN0LT5hdXRoX3N1aXRlX2NvdW50ID0gMFU7CisgICAgICAgIHJldHVybiAwVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcERzdC0+bXVsdGljYXN0X2NpcGhlcl9wcmVzZW50ID0gMVU7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+bXVsdGljYXN0X2NpcGhlciwgcEJ1ZiwgNCk7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgaWVsZW4gLT0gKHRBTklfVTgpNDsKKyAgICB9CisgICAgaWYgKCAhIGllbGVuICkKKyAgICB7CisgICAgICAgIHBEc3QtPnVuaWNhc3RfY2lwaGVyX2NvdW50ID0gMFU7CisgICAgICAgIHBEc3QtPmF1dGhfc3VpdGVfY291bnQgPSAwVTsKKyAgICAgICAgcmV0dXJuIDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+dW5pY2FzdF9jaXBoZXJfY291bnQsIHBCdWYsIDApOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgfQorICAgIGlmIChwRHN0LT51bmljYXN0X2NpcGhlcl9jb3VudCA+IDQpeworICAgICAgICBwRHN0LT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIERPVDExRl9TS0lQUEVEX0JBRF9JRTsKKyAgICB9CisKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBEc3QtPnVuaWNhc3RfY2lwaGVycywgcEJ1ZiwgKCBwRHN0LT51bmljYXN0X2NpcGhlcl9jb3VudCAqIDQgKSApOworICAgIHBCdWYgKz0gKCBwRHN0LT51bmljYXN0X2NpcGhlcl9jb3VudCAqIDQgKTsKKyAgICBpZWxlbiAtPSAoIHBEc3QtPnVuaWNhc3RfY2lwaGVyX2NvdW50ICogNCApOworICAgIGlmICggISBpZWxlbiApCisgICAgeworICAgICAgICBwRHN0LT5hdXRoX3N1aXRlX2NvdW50ID0gMFU7CisgICAgICAgIHJldHVybiAwVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJnBEc3QtPmF1dGhfc3VpdGVfY291bnQsIHBCdWYsIDApOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIGllbGVuIC09ICh0QU5JX1U4KTI7CisgICAgfQorICAgIGlmIChwRHN0LT5hdXRoX3N1aXRlX2NvdW50ID4gNCl7CisgICAgICAgIHBEc3QtPnByZXNlbnQgPSAwOworICAgICAgICByZXR1cm4gRE9UMTFGX1NLSVBQRURfQkFEX0lFOworICAgIH0KKworICAgIERPVDExRl9NRU1DUFkocEN0eCwgcERzdC0+YXV0aF9zdWl0ZXMsIHBCdWYsICggcERzdC0+YXV0aF9zdWl0ZV9jb3VudCAqIDQgKSApOworICAgIHBCdWYgKz0gKCBwRHN0LT5hdXRoX3N1aXRlX2NvdW50ICogNCApOworICAgIGllbGVuIC09ICggcERzdC0+YXV0aF9zdWl0ZV9jb3VudCAqIDQgKTsKKyAgICBpZiAoICEgaWVsZW4gKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmcERzdC0+Y2FwcywgcEJ1ZiwgMCk7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llV1BBLiAqLworCisjZGVmaW5lIFNpZ0llV1BBICggMHgwMDc0ICkKKworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdQQU9wYXF1ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVXUEFPcGFxdWUgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+bnVtX2RhdGEgPSAodEFOSV9VOCkoIGllbGVuICk7CisgICAgaWYgKGllbGVuID4gMjQ5KXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5kYXRhLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVdQQU9wYXF1ZS4gKi8KKworI2RlZmluZSBTaWdJZVdQQU9wYXF1ZSAoIDB4MDA3NSApCisKKworICAgIHN0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1dTQ1sgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdTQywgVmVyc2lvbiksIG9mZnNldG9mKHREb3QxMWZUTFZWZXJzaW9uLCBwcmVzZW50KSwgIlZlcnNpb24iLCBTaWdUbHZWZXJzaW9uLCBET1QxMUZfVExWX1ZFUlNJT04sIDAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXU0MsIFdQU1N0YXRlKSwgb2Zmc2V0b2YodERvdDExZlRMVldQU1N0YXRlLCBwcmVzZW50KSwgIldQU1N0YXRlIiwgU2lnVGx2V1BTU3RhdGUsIERPVDExRl9UTFZfV1BTU1RBVEUsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXU0MsIEFQU2V0dXBMb2NrZWQpLCBvZmZzZXRvZih0RG90MTFmVExWQVBTZXR1cExvY2tlZCwgcHJlc2VudCksICJBUFNldHVwTG9ja2VkIiwgU2lnVGx2QVBTZXR1cExvY2tlZCwgRE9UMTFGX1RMVl9BUFNFVFVQTE9DS0VELCAwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV1NDLCBTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMpLCBvZmZzZXRvZih0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLCBwcmVzZW50KSwgIlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyIsIFNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcywgRE9UMTFGX1RMVl9TRUxFQ1RFRFJFR0lTVFJBUkNPTkZJR01FVEhPRFMsIDAsIDYsIDYsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXU0MsIFVVSURfRSksIG9mZnNldG9mKHREb3QxMWZUTFZVVUlEX0UsIHByZXNlbnQpLCAiVVVJRF9FIiwgU2lnVGx2VVVJRF9FLCBET1QxMUZfVExWX1VVSURfRSwgMCwgMjAsIDIwLCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV1NDLCBVVUlEX1IpLCBvZmZzZXRvZih0RG90MTFmVExWVVVJRF9SLCBwcmVzZW50KSwgIlVVSURfUiIsIFNpZ1RsdlVVSURfUiwgRE9UMTFGX1RMVl9VVUlEX1IsIDAsIDIwLCAyMCwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdTQywgUkZCYW5kcyksIG9mZnNldG9mKHREb3QxMWZUTFZSRkJhbmRzLCBwcmVzZW50KSwgIlJGQmFuZHMiLCBTaWdUbHZSRkJhbmRzLCBET1QxMUZfVExWX1JGQkFORFMsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXU0MsIFNlbGVjdGVkUmVnaXN0cmFyKSwgb2Zmc2V0b2YodERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyLCBwcmVzZW50KSwgIlNlbGVjdGVkUmVnaXN0cmFyIiwgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXIsIERPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVIsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXU0MsIENvbmZpZ01ldGhvZHMpLCBvZmZzZXRvZih0RG90MTFmVExWQ29uZmlnTWV0aG9kcywgcHJlc2VudCksICJDb25maWdNZXRob2RzIiwgU2lnVGx2Q29uZmlnTWV0aG9kcywgRE9UMTFGX1RMVl9DT05GSUdNRVRIT0RTLCAwLCA2LCA2LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV1NDLCBBc3NvY2lhdGlvblN0YXRlKSwgb2Zmc2V0b2YodERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUsIHByZXNlbnQpLCAiQXNzb2NpYXRpb25TdGF0ZSIsIFNpZ1RsdkFzc29jaWF0aW9uU3RhdGUsIERPVDExRl9UTFZfQVNTT0NJQVRJT05TVEFURSwgMCwgNiwgNiwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdTQywgQ29uZmlndXJhdGlvbkVycm9yKSwgb2Zmc2V0b2YodERvdDExZlRMVkNvbmZpZ3VyYXRpb25FcnJvciwgcHJlc2VudCksICJDb25maWd1cmF0aW9uRXJyb3IiLCBTaWdUbHZDb25maWd1cmF0aW9uRXJyb3IsIERPVDExRl9UTFZfQ09ORklHVVJBVElPTkVSUk9SLCAwLCA2LCA2LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV1NDLCBNYW51ZmFjdHVyZXIpLCBvZmZzZXRvZih0RG90MTFmVExWTWFudWZhY3R1cmVyLCBwcmVzZW50KSwgIk1hbnVmYWN0dXJlciIsIFNpZ1Rsdk1hbnVmYWN0dXJlciwgRE9UMTFGX1RMVl9NQU5VRkFDVFVSRVIsIDAsIDQsIDY4LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV1NDLCBNb2RlbE5hbWUpLCBvZmZzZXRvZih0RG90MTFmVExWTW9kZWxOYW1lLCBwcmVzZW50KSwgIk1vZGVsTmFtZSIsIFNpZ1Rsdk1vZGVsTmFtZSwgRE9UMTFGX1RMVl9NT0RFTE5BTUUsIDAsIDQsIDM2LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV1NDLCBNb2RlbE51bWJlciksIG9mZnNldG9mKHREb3QxMWZUTFZNb2RlbE51bWJlciwgcHJlc2VudCksICJNb2RlbE51bWJlciIsIFNpZ1Rsdk1vZGVsTnVtYmVyLCBET1QxMUZfVExWX01PREVMTlVNQkVSLCAwLCA0LCAzNiwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdTQywgU2VyaWFsTnVtYmVyKSwgb2Zmc2V0b2YodERvdDExZlRMVlNlcmlhbE51bWJlciwgcHJlc2VudCksICJTZXJpYWxOdW1iZXIiLCBTaWdUbHZTZXJpYWxOdW1iZXIsIERPVDExRl9UTFZfU0VSSUFMTlVNQkVSLCAwLCA0LCAzNiwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdTQywgRGV2aWNlTmFtZSksIG9mZnNldG9mKHREb3QxMWZUTFZEZXZpY2VOYW1lLCBwcmVzZW50KSwgIkRldmljZU5hbWUiLCBTaWdUbHZEZXZpY2VOYW1lLCBET1QxMUZfVExWX0RFVklDRU5BTUUsIDAsIDQsIDM2LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV1NDLCBEZXZpY2VQYXNzd29yZElEKSwgb2Zmc2V0b2YodERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQsIHByZXNlbnQpLCAiRGV2aWNlUGFzc3dvcmRJRCIsIFNpZ1RsdkRldmljZVBhc3N3b3JkSUQsIERPVDExRl9UTFZfREVWSUNFUEFTU1dPUkRJRCwgMCwgNiwgNiwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdTQywgUHJpbWFyeURldmljZVR5cGUpLCBvZmZzZXRvZih0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGUsIHByZXNlbnQpLCAiUHJpbWFyeURldmljZVR5cGUiLCBTaWdUbHZQcmltYXJ5RGV2aWNlVHlwZSwgRE9UMTFGX1RMVl9QUklNQVJZREVWSUNFVFlQRSwgMCwgMTIsIDEyLCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV1NDLCBSZXF1ZXN0VHlwZSksIG9mZnNldG9mKHREb3QxMWZUTFZSZXF1ZXN0VHlwZSwgcHJlc2VudCksICJSZXF1ZXN0VHlwZSIsIFNpZ1RsdlJlcXVlc3RUeXBlLCBET1QxMUZfVExWX1JFUVVFU1RUWVBFLCAwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV1NDLCBSZXNwb25zZVR5cGUpLCBvZmZzZXRvZih0RG90MTFmVExWUmVzcG9uc2VUeXBlLCBwcmVzZW50KSwgIlJlc3BvbnNlVHlwZSIsIFNpZ1RsdlJlc3BvbnNlVHlwZSwgRE9UMTFGX1RMVl9SRVNQT05TRVRZUEUsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXU0MsIFZlbmRvckV4dGVuc2lvbiksIG9mZnNldG9mKHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24sIHByZXNlbnQpLCAiVmVuZG9yRXh0ZW5zaW9uIiwgU2lnVGx2VmVuZG9yRXh0ZW5zaW9uLCBET1QxMUZfVExWX1ZFTkRPUkVYVEVOU0lPTiwgMCwgNywgMjEsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXU0MsIFJlcXVlc3REZXZpY2VUeXBlKSwgb2Zmc2V0b2YodERvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlLCBwcmVzZW50KSwgIlJlcXVlc3REZXZpY2VUeXBlIiwgU2lnVGx2UmVxdWVzdERldmljZVR5cGUsIERPVDExRl9UTFZfUkVRVUVTVERFVklDRVRZUEUsIDAsIDEyLCAxMiwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXU0ModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFV1NDICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgc3RhdHVzID0gVW5wYWNrVGx2Q29yZShwQ3R4LHBCdWYsaWVsZW4sVExWU19XU0MsKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llV1NDLiAqLworCisjZGVmaW5lIFNpZ0llV1NDICggMHgwMDc2ICkKKworCisgICAgc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfV3NjQXNzb2NSZXFbIF0gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NBc3NvY1JlcSwgVmVyc2lvbiksIG9mZnNldG9mKHREb3QxMWZUTFZWZXJzaW9uLCBwcmVzZW50KSwgIlZlcnNpb24iLCBTaWdUbHZWZXJzaW9uLCBET1QxMUZfVExWX1ZFUlNJT04sIDAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NBc3NvY1JlcSwgUmVxdWVzdFR5cGUpLCBvZmZzZXRvZih0RG90MTFmVExWUmVxdWVzdFR5cGUsIHByZXNlbnQpLCAiUmVxdWVzdFR5cGUiLCBTaWdUbHZSZXF1ZXN0VHlwZSwgRE9UMTFGX1RMVl9SRVFVRVNUVFlQRSwgMCwgNSwgNSwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY0Fzc29jUmVxLCBWZW5kb3JFeHRlbnNpb24pLCBvZmZzZXRvZih0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uLCBwcmVzZW50KSwgIlZlbmRvckV4dGVuc2lvbiIsIFNpZ1RsdlZlbmRvckV4dGVuc2lvbiwgRE9UMTFGX1RMVl9WRU5ET1JFWFRFTlNJT04sIDAsIDcsIDIxLCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdzY0Fzc29jUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTggaWVsZW4sIHREb3QxMWZJRVdzY0Fzc29jUmVxICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgc3RhdHVzID0gVW5wYWNrVGx2Q29yZShwQ3R4LHBCdWYsaWVsZW4sVExWU19Xc2NBc3NvY1JlcSwodEFOSV9VOCopcERzdCxzaXplb2YoKnBEc3QpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVXc2NBc3NvY1JlcS4gKi8KKworI2RlZmluZSBTaWdJZVdzY0Fzc29jUmVxICggMHgwMDc3ICkKKworCisgICAgc3RhdGljIGNvbnN0IHRUTFZEZWZuIFRMVlNfV3NjQXNzb2NSZXNbIF0gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NBc3NvY1JlcywgVmVyc2lvbiksIG9mZnNldG9mKHREb3QxMWZUTFZWZXJzaW9uLCBwcmVzZW50KSwgIlZlcnNpb24iLCBTaWdUbHZWZXJzaW9uLCBET1QxMUZfVExWX1ZFUlNJT04sIDAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NBc3NvY1JlcywgUmVzcG9uc2VUeXBlKSwgb2Zmc2V0b2YodERvdDExZlRMVlJlc3BvbnNlVHlwZSwgcHJlc2VudCksICJSZXNwb25zZVR5cGUiLCBTaWdUbHZSZXNwb25zZVR5cGUsIERPVDExRl9UTFZfUkVTUE9OU0VUWVBFLCAwLCA1LCA1LCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQXNzb2NSZXMsIFZlbmRvckV4dGVuc2lvbiksIG9mZnNldG9mKHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24sIHByZXNlbnQpLCAiVmVuZG9yRXh0ZW5zaW9uIiwgU2lnVGx2VmVuZG9yRXh0ZW5zaW9uLCBET1QxMUZfVExWX1ZFTkRPUkVYVEVOU0lPTiwgMCwgNywgMjEsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llV3NjQXNzb2NSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFV3NjQXNzb2NSZXMgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1dzY0Fzc29jUmVzLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVdzY0Fzc29jUmVzLiAqLworCisjZGVmaW5lIFNpZ0llV3NjQXNzb2NSZXMgKCAweDAwNzggKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19Xc2NCZWFjb25bIF0gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb24sIFZlcnNpb24pLCBvZmZzZXRvZih0RG90MTFmVExWVmVyc2lvbiwgcHJlc2VudCksICJWZXJzaW9uIiwgU2lnVGx2VmVyc2lvbiwgRE9UMTFGX1RMVl9WRVJTSU9OLCAwLCA1LCA1LCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uLCBXUFNTdGF0ZSksIG9mZnNldG9mKHREb3QxMWZUTFZXUFNTdGF0ZSwgcHJlc2VudCksICJXUFNTdGF0ZSIsIFNpZ1RsdldQU1N0YXRlLCBET1QxMUZfVExWX1dQU1NUQVRFLCAwLCA1LCA1LCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uLCBBUFNldHVwTG9ja2VkKSwgb2Zmc2V0b2YodERvdDExZlRMVkFQU2V0dXBMb2NrZWQsIHByZXNlbnQpLCAiQVBTZXR1cExvY2tlZCIsIFNpZ1RsdkFQU2V0dXBMb2NrZWQsIERPVDExRl9UTFZfQVBTRVRVUExPQ0tFRCwgMCwgNSwgNSwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvbiwgU2VsZWN0ZWRSZWdpc3RyYXIpLCBvZmZzZXRvZih0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIsIHByZXNlbnQpLCAiU2VsZWN0ZWRSZWdpc3RyYXIiLCBTaWdUbHZTZWxlY3RlZFJlZ2lzdHJhciwgRE9UMTFGX1RMVl9TRUxFQ1RFRFJFR0lTVFJBUiwgMCwgNSwgNSwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvbiwgRGV2aWNlUGFzc3dvcmRJRCksIG9mZnNldG9mKHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElELCBwcmVzZW50KSwgIkRldmljZVBhc3N3b3JkSUQiLCBTaWdUbHZEZXZpY2VQYXNzd29yZElELCBET1QxMUZfVExWX0RFVklDRVBBU1NXT1JESUQsIDAsIDYsIDYsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb24sIFNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyksIG9mZnNldG9mKHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMsIHByZXNlbnQpLCAiU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzIiwgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLCBET1QxMUZfVExWX1NFTEVDVEVEUkVHSVNUUkFSQ09ORklHTUVUSE9EUywgMCwgNiwgNiwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvbiwgVVVJRF9FKSwgb2Zmc2V0b2YodERvdDExZlRMVlVVSURfRSwgcHJlc2VudCksICJVVUlEX0UiLCBTaWdUbHZVVUlEX0UsIERPVDExRl9UTFZfVVVJRF9FLCAwLCAyMCwgMjAsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb24sIFJGQmFuZHMpLCBvZmZzZXRvZih0RG90MTFmVExWUkZCYW5kcywgcHJlc2VudCksICJSRkJhbmRzIiwgU2lnVGx2UkZCYW5kcywgRE9UMTFGX1RMVl9SRkJBTkRTLCAwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uLCBWZW5kb3JFeHRlbnNpb24pLCBvZmZzZXRvZih0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uLCBwcmVzZW50KSwgIlZlbmRvckV4dGVuc2lvbiIsIFNpZ1RsdlZlbmRvckV4dGVuc2lvbiwgRE9UMTFGX1RMVl9WRU5ET1JFWFRFTlNJT04sIDAsIDcsIDIxLCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7MCwgMCwgTlVMTCwgMCwgMHhmZmZmLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJZVdzY0JlYWNvbih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVXc2NCZWFjb24gKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1dzY0JlYWNvbiwodEFOSV9VOCopcERzdCxzaXplb2YoKnBEc3QpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmVW5wYWNrSWVXc2NCZWFjb24uICovCisKKyNkZWZpbmUgU2lnSWVXc2NCZWFjb24gKCAweDAwNzkgKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19Xc2NCZWFjb25Qcm9iZVJlc1sgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzLCBWZXJzaW9uKSwgb2Zmc2V0b2YodERvdDExZlRMVlZlcnNpb24sIHByZXNlbnQpLCAiVmVyc2lvbiIsIFNpZ1RsdlZlcnNpb24sIERPVDExRl9UTFZfVkVSU0lPTiwgMCwgNSwgNSwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzLCBXUFNTdGF0ZSksIG9mZnNldG9mKHREb3QxMWZUTFZXUFNTdGF0ZSwgcHJlc2VudCksICJXUFNTdGF0ZSIsIFNpZ1RsdldQU1N0YXRlLCBET1QxMUZfVExWX1dQU1NUQVRFLCAwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIEFQU2V0dXBMb2NrZWQpLCBvZmZzZXRvZih0RG90MTFmVExWQVBTZXR1cExvY2tlZCwgcHJlc2VudCksICJBUFNldHVwTG9ja2VkIiwgU2lnVGx2QVBTZXR1cExvY2tlZCwgRE9UMTFGX1RMVl9BUFNFVFVQTE9DS0VELCAwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIFNlbGVjdGVkUmVnaXN0cmFyKSwgb2Zmc2V0b2YodERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyLCBwcmVzZW50KSwgIlNlbGVjdGVkUmVnaXN0cmFyIiwgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXIsIERPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVIsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgRGV2aWNlUGFzc3dvcmRJRCksIG9mZnNldG9mKHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElELCBwcmVzZW50KSwgIkRldmljZVBhc3N3b3JkSUQiLCBTaWdUbHZEZXZpY2VQYXNzd29yZElELCBET1QxMUZfVExWX0RFVklDRVBBU1NXT1JESUQsIDAsIDYsIDYsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzKSwgb2Zmc2V0b2YodERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcywgcHJlc2VudCksICJTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMiLCBTaWdUbHZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMsIERPVDExRl9UTFZfU0VMRUNURURSRUdJU1RSQVJDT05GSUdNRVRIT0RTLCAwLCA2LCA2LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIFJlc3BvbnNlVHlwZSksIG9mZnNldG9mKHREb3QxMWZUTFZSZXNwb25zZVR5cGUsIHByZXNlbnQpLCAiUmVzcG9uc2VUeXBlIiwgU2lnVGx2UmVzcG9uc2VUeXBlLCBET1QxMUZfVExWX1JFU1BPTlNFVFlQRSwgMCwgNSwgNSwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzLCBVVUlEX0UpLCBvZmZzZXRvZih0RG90MTFmVExWVVVJRF9FLCBwcmVzZW50KSwgIlVVSURfRSIsIFNpZ1RsdlVVSURfRSwgRE9UMTFGX1RMVl9VVUlEX0UsIDAsIDIwLCAyMCwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzLCBNYW51ZmFjdHVyZXIpLCBvZmZzZXRvZih0RG90MTFmVExWTWFudWZhY3R1cmVyLCBwcmVzZW50KSwgIk1hbnVmYWN0dXJlciIsIFNpZ1Rsdk1hbnVmYWN0dXJlciwgRE9UMTFGX1RMVl9NQU5VRkFDVFVSRVIsIDAsIDQsIDY4LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIE1vZGVsTmFtZSksIG9mZnNldG9mKHREb3QxMWZUTFZNb2RlbE5hbWUsIHByZXNlbnQpLCAiTW9kZWxOYW1lIiwgU2lnVGx2TW9kZWxOYW1lLCBET1QxMUZfVExWX01PREVMTkFNRSwgMCwgNCwgMzYsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgTW9kZWxOdW1iZXIpLCBvZmZzZXRvZih0RG90MTFmVExWTW9kZWxOdW1iZXIsIHByZXNlbnQpLCAiTW9kZWxOdW1iZXIiLCBTaWdUbHZNb2RlbE51bWJlciwgRE9UMTFGX1RMVl9NT0RFTE5VTUJFUiwgMCwgNCwgMzYsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgU2VyaWFsTnVtYmVyKSwgb2Zmc2V0b2YodERvdDExZlRMVlNlcmlhbE51bWJlciwgcHJlc2VudCksICJTZXJpYWxOdW1iZXIiLCBTaWdUbHZTZXJpYWxOdW1iZXIsIERPVDExRl9UTFZfU0VSSUFMTlVNQkVSLCAwLCA0LCAzNiwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzLCBQcmltYXJ5RGV2aWNlVHlwZSksIG9mZnNldG9mKHREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSwgcHJlc2VudCksICJQcmltYXJ5RGV2aWNlVHlwZSIsIFNpZ1RsdlByaW1hcnlEZXZpY2VUeXBlLCBET1QxMUZfVExWX1BSSU1BUllERVZJQ0VUWVBFLCAwLCAxMiwgMTIsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb25Qcm9iZVJlcywgRGV2aWNlTmFtZSksIG9mZnNldG9mKHREb3QxMWZUTFZEZXZpY2VOYW1lLCBwcmVzZW50KSwgIkRldmljZU5hbWUiLCBTaWdUbHZEZXZpY2VOYW1lLCBET1QxMUZfVExWX0RFVklDRU5BTUUsIDAsIDQsIDM2LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIENvbmZpZ01ldGhvZHMpLCBvZmZzZXRvZih0RG90MTFmVExWQ29uZmlnTWV0aG9kcywgcHJlc2VudCksICJDb25maWdNZXRob2RzIiwgU2lnVGx2Q29uZmlnTWV0aG9kcywgRE9UMTFGX1RMVl9DT05GSUdNRVRIT0RTLCAwLCA2LCA2LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIFJGQmFuZHMpLCBvZmZzZXRvZih0RG90MTFmVExWUkZCYW5kcywgcHJlc2VudCksICJSRkJhbmRzIiwgU2lnVGx2UkZCYW5kcywgRE9UMTFGX1RMVl9SRkJBTkRTLCAwLCA1LCA1LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMsIFZlbmRvckV4dGVuc2lvbiksIG9mZnNldG9mKHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24sIHByZXNlbnQpLCAiVmVuZG9yRXh0ZW5zaW9uIiwgU2lnVGx2VmVuZG9yRXh0ZW5zaW9uLCBET1QxMUZfVExWX1ZFTkRPUkVYVEVOU0lPTiwgMCwgNywgMjEsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llV3NjQmVhY29uUHJvYmVSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEJ1ZjsgKHZvaWQpaWVsZW47IC8qIFNodXR1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBwRHN0LT5wcmVzZW50ID0gMTsKKyAgICBzdGF0dXMgPSBVbnBhY2tUbHZDb3JlKHBDdHgscEJ1ZixpZWxlbixUTFZTX1dzY0JlYWNvblByb2JlUmVzLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVdzY0JlYWNvblByb2JlUmVzLiAqLworCisjZGVmaW5lIFNpZ0llV3NjQmVhY29uUHJvYmVSZXMgKCAweDAwN2EgKQorCisKK3RBTklfVTMyIGRvdDExZlVucGFja0llV3NjSUVPcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VOCBpZWxlbiwgdERvdDExZklFV3NjSUVPcGFxdWUgKnBEc3QpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpIHBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgaWYgKHBEc3QtPnByZXNlbnQpIHN0YXR1cyA9IERPVDExRl9EVVBMSUNBVEVfSUU7CisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgcERzdC0+bnVtX2RhdGEgPSAodEFOSV9VOCkoIGllbGVuICk7CisgICAgaWYgKGllbGVuID4gMjQ5KXsKKyAgICAgICAgcERzdC0+cHJlc2VudCA9IDA7CisgICAgICAgIHJldHVybiBET1QxMUZfU0tJUFBFRF9CQURfSUU7CisgICAgfQorCisgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwRHN0LT5kYXRhLCBwQnVmLCAoIGllbGVuICkgKTsKKyAgICAodm9pZClwQ3R4OworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVdzY0lFT3BhcXVlLiAqLworCisjZGVmaW5lIFNpZ0llV3NjSUVPcGFxdWUgKCAweDAwN2IgKQorCisKKyAgICBzdGF0aWMgY29uc3QgdFRMVkRlZm4gVExWU19Xc2NQcm9iZVJlcVsgXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBWZXJzaW9uKSwgb2Zmc2V0b2YodERvdDExZlRMVlZlcnNpb24sIHByZXNlbnQpLCAiVmVyc2lvbiIsIFNpZ1RsdlZlcnNpb24sIERPVDExRl9UTFZfVkVSU0lPTiwgMCwgNSwgNSwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBSZXF1ZXN0VHlwZSksIG9mZnNldG9mKHREb3QxMWZUTFZSZXF1ZXN0VHlwZSwgcHJlc2VudCksICJSZXF1ZXN0VHlwZSIsIFNpZ1RsdlJlcXVlc3RUeXBlLCBET1QxMUZfVExWX1JFUVVFU1RUWVBFLCAwLCA1LCA1LCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIENvbmZpZ01ldGhvZHMpLCBvZmZzZXRvZih0RG90MTFmVExWQ29uZmlnTWV0aG9kcywgcHJlc2VudCksICJDb25maWdNZXRob2RzIiwgU2lnVGx2Q29uZmlnTWV0aG9kcywgRE9UMTFGX1RMVl9DT05GSUdNRVRIT0RTLCAwLCA2LCA2LCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIFVVSURfRSksIG9mZnNldG9mKHREb3QxMWZUTFZVVUlEX0UsIHByZXNlbnQpLCAiVVVJRF9FIiwgU2lnVGx2VVVJRF9FLCBET1QxMUZfVExWX1VVSURfRSwgMCwgMjAsIDIwLCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIFByaW1hcnlEZXZpY2VUeXBlKSwgb2Zmc2V0b2YodERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlLCBwcmVzZW50KSwgIlByaW1hcnlEZXZpY2VUeXBlIiwgU2lnVGx2UHJpbWFyeURldmljZVR5cGUsIERPVDExRl9UTFZfUFJJTUFSWURFVklDRVRZUEUsIDAsIDEyLCAxMiwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBSRkJhbmRzKSwgb2Zmc2V0b2YodERvdDExZlRMVlJGQmFuZHMsIHByZXNlbnQpLCAiUkZCYW5kcyIsIFNpZ1RsdlJGQmFuZHMsIERPVDExRl9UTFZfUkZCQU5EUywgMCwgNSwgNSwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBBc3NvY2lhdGlvblN0YXRlKSwgb2Zmc2V0b2YodERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUsIHByZXNlbnQpLCAiQXNzb2NpYXRpb25TdGF0ZSIsIFNpZ1RsdkFzc29jaWF0aW9uU3RhdGUsIERPVDExRl9UTFZfQVNTT0NJQVRJT05TVEFURSwgMCwgNiwgNiwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBDb25maWd1cmF0aW9uRXJyb3IpLCBvZmZzZXRvZih0RG90MTFmVExWQ29uZmlndXJhdGlvbkVycm9yLCBwcmVzZW50KSwgIkNvbmZpZ3VyYXRpb25FcnJvciIsIFNpZ1RsdkNvbmZpZ3VyYXRpb25FcnJvciwgRE9UMTFGX1RMVl9DT05GSUdVUkFUSU9ORVJST1IsIDAsIDYsIDYsIDEsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcSwgRGV2aWNlUGFzc3dvcmRJRCksIG9mZnNldG9mKHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElELCBwcmVzZW50KSwgIkRldmljZVBhc3N3b3JkSUQiLCBTaWdUbHZEZXZpY2VQYXNzd29yZElELCBET1QxMUZfVExWX0RFVklDRVBBU1NXT1JESUQsIDAsIDYsIDYsIDEsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcSwgTWFudWZhY3R1cmVyKSwgb2Zmc2V0b2YodERvdDExZlRMVk1hbnVmYWN0dXJlciwgcHJlc2VudCksICJNYW51ZmFjdHVyZXIiLCBTaWdUbHZNYW51ZmFjdHVyZXIsIERPVDExRl9UTFZfTUFOVUZBQ1RVUkVSLCAwLCA0LCA2OCwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBNb2RlbE5hbWUpLCBvZmZzZXRvZih0RG90MTFmVExWTW9kZWxOYW1lLCBwcmVzZW50KSwgIk1vZGVsTmFtZSIsIFNpZ1Rsdk1vZGVsTmFtZSwgRE9UMTFGX1RMVl9NT0RFTE5BTUUsIDAsIDQsIDM2LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIE1vZGVsTnVtYmVyKSwgb2Zmc2V0b2YodERvdDExZlRMVk1vZGVsTnVtYmVyLCBwcmVzZW50KSwgIk1vZGVsTnVtYmVyIiwgU2lnVGx2TW9kZWxOdW1iZXIsIERPVDExRl9UTFZfTU9ERUxOVU1CRVIsIDAsIDQsIDM2LCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIERldmljZU5hbWUpLCBvZmZzZXRvZih0RG90MTFmVExWRGV2aWNlTmFtZSwgcHJlc2VudCksICJEZXZpY2VOYW1lIiwgU2lnVGx2RGV2aWNlTmFtZSwgRE9UMTFGX1RMVl9ERVZJQ0VOQU1FLCAwLCA0LCAzNiwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVxLCBWZW5kb3JFeHRlbnNpb24pLCBvZmZzZXRvZih0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uLCBwcmVzZW50KSwgIlZlbmRvckV4dGVuc2lvbiIsIFNpZ1RsdlZlbmRvckV4dGVuc2lvbiwgRE9UMTFGX1RMVl9WRU5ET1JFWFRFTlNJT04sIDAsIDcsIDIxLCAwLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIFJlcXVlc3REZXZpY2VUeXBlKSwgb2Zmc2V0b2YodERvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlLCBwcmVzZW50KSwgIlJlcXVlc3REZXZpY2VUeXBlIiwgU2lnVGx2UmVxdWVzdERldmljZVR5cGUsIERPVDExRl9UTFZfUkVRVUVTVERFVklDRVRZUEUsIDAsIDEyLCAxMiwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXc2NQcm9iZVJlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVXc2NQcm9iZVJlcSAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHN0YXR1cyA9IFVucGFja1RsdkNvcmUocEN0eCxwQnVmLGllbGVuLFRMVlNfV3NjUHJvYmVSZXEsKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llV3NjUHJvYmVSZXEuICovCisKKyNkZWZpbmUgU2lnSWVXc2NQcm9iZVJlcSAoIDB4MDA3YyApCisKKworICAgIHN0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1dzY1Byb2JlUmVzWyBdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIFZlcnNpb24pLCBvZmZzZXRvZih0RG90MTFmVExWVmVyc2lvbiwgcHJlc2VudCksICJWZXJzaW9uIiwgU2lnVGx2VmVyc2lvbiwgRE9UMTFGX1RMVl9WRVJTSU9OLCAwLCA1LCA1LCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIFdQU1N0YXRlKSwgb2Zmc2V0b2YodERvdDExZlRMVldQU1N0YXRlLCBwcmVzZW50KSwgIldQU1N0YXRlIiwgU2lnVGx2V1BTU3RhdGUsIERPVDExRl9UTFZfV1BTU1RBVEUsIDAsIDUsIDUsIDEsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgQVBTZXR1cExvY2tlZCksIG9mZnNldG9mKHREb3QxMWZUTFZBUFNldHVwTG9ja2VkLCBwcmVzZW50KSwgIkFQU2V0dXBMb2NrZWQiLCBTaWdUbHZBUFNldHVwTG9ja2VkLCBET1QxMUZfVExWX0FQU0VUVVBMT0NLRUQsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgU2VsZWN0ZWRSZWdpc3RyYXIpLCBvZmZzZXRvZih0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIsIHByZXNlbnQpLCAiU2VsZWN0ZWRSZWdpc3RyYXIiLCBTaWdUbHZTZWxlY3RlZFJlZ2lzdHJhciwgRE9UMTFGX1RMVl9TRUxFQ1RFRFJFR0lTVFJBUiwgMCwgNSwgNSwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVzLCBEZXZpY2VQYXNzd29yZElEKSwgb2Zmc2V0b2YodERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQsIHByZXNlbnQpLCAiRGV2aWNlUGFzc3dvcmRJRCIsIFNpZ1RsdkRldmljZVBhc3N3b3JkSUQsIERPVDExRl9UTFZfREVWSUNFUEFTU1dPUkRJRCwgMCwgNiwgNiwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVzLCBTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMpLCBvZmZzZXRvZih0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLCBwcmVzZW50KSwgIlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyIsIFNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcywgRE9UMTFGX1RMVl9TRUxFQ1RFRFJFR0lTVFJBUkNPTkZJR01FVEhPRFMsIDAsIDYsIDYsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgUmVzcG9uc2VUeXBlKSwgb2Zmc2V0b2YodERvdDExZlRMVlJlc3BvbnNlVHlwZSwgcHJlc2VudCksICJSZXNwb25zZVR5cGUiLCBTaWdUbHZSZXNwb25zZVR5cGUsIERPVDExRl9UTFZfUkVTUE9OU0VUWVBFLCAwLCA1LCA1LCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIFVVSURfRSksIG9mZnNldG9mKHREb3QxMWZUTFZVVUlEX0UsIHByZXNlbnQpLCAiVVVJRF9FIiwgU2lnVGx2VVVJRF9FLCBET1QxMUZfVExWX1VVSURfRSwgMCwgMjAsIDIwLCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIE1hbnVmYWN0dXJlciksIG9mZnNldG9mKHREb3QxMWZUTFZNYW51ZmFjdHVyZXIsIHByZXNlbnQpLCAiTWFudWZhY3R1cmVyIiwgU2lnVGx2TWFudWZhY3R1cmVyLCBET1QxMUZfVExWX01BTlVGQUNUVVJFUiwgMCwgNCwgNjgsIDEsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgTW9kZWxOYW1lKSwgb2Zmc2V0b2YodERvdDExZlRMVk1vZGVsTmFtZSwgcHJlc2VudCksICJNb2RlbE5hbWUiLCBTaWdUbHZNb2RlbE5hbWUsIERPVDExRl9UTFZfTU9ERUxOQU1FLCAwLCA0LCAzNiwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVzLCBNb2RlbE51bWJlciksIG9mZnNldG9mKHREb3QxMWZUTFZNb2RlbE51bWJlciwgcHJlc2VudCksICJNb2RlbE51bWJlciIsIFNpZ1Rsdk1vZGVsTnVtYmVyLCBET1QxMUZfVExWX01PREVMTlVNQkVSLCAwLCA0LCAzNiwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVzLCBTZXJpYWxOdW1iZXIpLCBvZmZzZXRvZih0RG90MTFmVExWU2VyaWFsTnVtYmVyLCBwcmVzZW50KSwgIlNlcmlhbE51bWJlciIsIFNpZ1RsdlNlcmlhbE51bWJlciwgRE9UMTFGX1RMVl9TRVJJQUxOVU1CRVIsIDAsIDQsIDM2LCAxLCAyLCAyLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIFByaW1hcnlEZXZpY2VUeXBlKSwgb2Zmc2V0b2YodERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlLCBwcmVzZW50KSwgIlByaW1hcnlEZXZpY2VUeXBlIiwgU2lnVGx2UHJpbWFyeURldmljZVR5cGUsIERPVDExRl9UTFZfUFJJTUFSWURFVklDRVRZUEUsIDAsIDEyLCAxMiwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1Byb2JlUmVzLCBEZXZpY2VOYW1lKSwgb2Zmc2V0b2YodERvdDExZlRMVkRldmljZU5hbWUsIHByZXNlbnQpLCAiRGV2aWNlTmFtZSIsIFNpZ1RsdkRldmljZU5hbWUsIERPVDExRl9UTFZfREVWSUNFTkFNRSwgMCwgNCwgMzYsIDEsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgQ29uZmlnTWV0aG9kcyksIG9mZnNldG9mKHREb3QxMWZUTFZDb25maWdNZXRob2RzLCBwcmVzZW50KSwgIkNvbmZpZ01ldGhvZHMiLCBTaWdUbHZDb25maWdNZXRob2RzLCBET1QxMUZfVExWX0NPTkZJR01FVEhPRFMsIDAsIDYsIDYsIDEsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgUkZCYW5kcyksIG9mZnNldG9mKHREb3QxMWZUTFZSRkJhbmRzLCBwcmVzZW50KSwgIlJGQmFuZHMiLCBTaWdUbHZSRkJhbmRzLCBET1QxMUZfVExWX1JGQkFORFMsIDAsIDUsIDUsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NQcm9iZVJlcywgVmVuZG9yRXh0ZW5zaW9uKSwgb2Zmc2V0b2YodERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiwgcHJlc2VudCksICJWZW5kb3JFeHRlbnNpb24iLCBTaWdUbHZWZW5kb3JFeHRlbnNpb24sIERPVDExRl9UTFZfVkVORE9SRVhURU5TSU9OLCAwLCA3LCAyMSwgMCwgMiwgMiwgMSwgfSwKKyAgICAgICAgezAsIDAsIE5VTEwsIDAsIDB4ZmZmZiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrSWVXc2NQcm9iZVJlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVXc2NQcm9iZVJlcyAqcERzdCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQnVmOyAodm9pZClpZWxlbjsgLyogU2h1dHVwIHRoZSBjb21waWxlciAqLworICAgIHBEc3QtPnByZXNlbnQgPSAxOworICAgIHN0YXR1cyA9IFVucGFja1RsdkNvcmUocEN0eCxwQnVmLGllbGVuLFRMVlNfV3NjUHJvYmVSZXMsKHRBTklfVTgqKXBEc3Qsc2l6ZW9mKCpwRHN0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlVucGFja0llV3NjUHJvYmVSZXMuICovCisKKyNkZWZpbmUgU2lnSWVXc2NQcm9iZVJlcyAoIDB4MDA3ZCApCisKKworICAgIHN0YXRpYyBjb25zdCB0VExWRGVmbiBUTFZTX1dzY1JlYXNzb2NSZXNbIF0gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSUVXc2NSZWFzc29jUmVzLCBWZXJzaW9uKSwgb2Zmc2V0b2YodERvdDExZlRMVlZlcnNpb24sIHByZXNlbnQpLCAiVmVyc2lvbiIsIFNpZ1RsdlZlcnNpb24sIERPVDExRl9UTFZfVkVSU0lPTiwgMCwgNSwgNSwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1JlYXNzb2NSZXMsIFJlc3BvbnNlVHlwZSksIG9mZnNldG9mKHREb3QxMWZUTFZSZXNwb25zZVR5cGUsIHByZXNlbnQpLCAiUmVzcG9uc2VUeXBlIiwgU2lnVGx2UmVzcG9uc2VUeXBlLCBET1QxMUZfVExWX1JFU1BPTlNFVFlQRSwgMCwgNSwgNSwgMSwgMiwgMiwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZJRVdzY1JlYXNzb2NSZXMsIFZlbmRvckV4dGVuc2lvbiksIG9mZnNldG9mKHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24sIHByZXNlbnQpLCAiVmVuZG9yRXh0ZW5zaW9uIiwgU2lnVGx2VmVuZG9yRXh0ZW5zaW9uLCBET1QxMUZfVExWX1ZFTkRPUkVYVEVOU0lPTiwgMCwgNywgMjEsIDAsIDIsIDIsIDEsIH0sCisgICAgICAgIHswLCAwLCBOVUxMLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0llV3NjUmVhc3NvY1Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1U4IGllbGVuLCB0RG90MTFmSUVXc2NSZWFzc29jUmVzICpwRHN0KQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBCdWY7ICh2b2lkKWllbGVuOyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyICovCisgICAgcERzdC0+cHJlc2VudCA9IDE7CisgICAgc3RhdHVzID0gVW5wYWNrVGx2Q29yZShwQ3R4LHBCdWYsaWVsZW4sVExWU19Xc2NSZWFzc29jUmVzLCh0QU5JX1U4KilwRHN0LHNpemVvZigqcERzdCkpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJZVdzY1JlYXNzb2NSZXMuICovCisKKyNkZWZpbmUgU2lnSWVXc2NSZWFzc29jUmVzICggMHgwMDdlICkKKworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0FkZEJBUmVxW10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZkFkZEJBUmVxLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmQWRkQkFSZXEsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uICwgRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisgICAgICAgIHsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZkFkZEJBUmVxLCBEaWFsb2dUb2tlbiksIFNpZ0ZmRGlhbG9nVG9rZW4gLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorICAgICAgICB7ICJBZGRCQVBhcmFtZXRlclNldCIsIG9mZnNldG9mKHREb3QxMWZBZGRCQVJlcSwgQWRkQkFQYXJhbWV0ZXJTZXQpLCBTaWdGZkFkZEJBUGFyYW1ldGVyU2V0ICwgRE9UMTFGX0ZGX0FEREJBUEFSQU1FVEVSU0VUX0xFTiwgfSwKKyAgICAgICAgeyAiQkFUaW1lb3V0Iiwgb2Zmc2V0b2YodERvdDExZkFkZEJBUmVxLCBCQVRpbWVvdXQpLCBTaWdGZkJBVGltZW91dCAsIERPVDExRl9GRl9CQVRJTUVPVVRfTEVOLCB9LAorICAgICAgICB7ICJCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sIiwgb2Zmc2V0b2YodERvdDExZkFkZEJBUmVxLCBCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sKSwgU2lnRmZCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sICwgRE9UMTFGX0ZGX0JBU1RBUlRJTkdTRVFVRU5DRUNPTlRST0xfTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfQWRkQkFSZXFbXSA9IHsKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tBZGRCQVJlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQWRkQkFSZXEgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19BZGRCQVJlcSwgSUVTX0FkZEJBUmVxLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSRVEpLCBGUkZMKCJVbnBhY2tlZCB0aGUgQWRkQkFSZXE6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSRVEpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSRVEpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgiQWRkQkFQYXJhbWV0ZXJTZXQ6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksIEZSRkwoImFtc2R1U3VwcG9ydGVkICgxKTogJWRcbiIpLCBwRnJtLT5BZGRCQVBhcmFtZXRlclNldC5hbXNkdVN1cHBvcnRlZCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksIEZSRkwoInBvbGljeSAoMSk6ICVkXG4iKSwgcEZybS0+QWRkQkFQYXJhbWV0ZXJTZXQucG9saWN5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgidGlkICg0KTogJWRcbiIpLCBwRnJtLT5BZGRCQVBhcmFtZXRlclNldC50aWQpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSRVEpLCBGUkZMKCJidWZmZXJTaXplICgxMCk6ICVkXG4iKSwgcEZybS0+QWRkQkFQYXJhbWV0ZXJTZXQuYnVmZmVyU2l6ZSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksIEZSRkwoIkJBVGltZW91dDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkJBVGltZW91dC50aW1lb3V0LCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgiQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgiZnJhZ051bWJlciAoNCk6ICVkXG4iKSwgcEZybS0+QkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbC5mcmFnTnVtYmVyKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgic3NuICgxMik6ICVkXG4iKSwgcEZybS0+QkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbC5zc24pOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tBZGRCQVJlcS4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19BZGRCQVJzcFtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZBZGRCQVJzcCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZkFkZEJBUnNwLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiAsIERPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorICAgICAgICB7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZBZGRCQVJzcCwgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICAgICAgeyAiU3RhdHVzIiwgb2Zmc2V0b2YodERvdDExZkFkZEJBUnNwLCBTdGF0dXMpLCBTaWdGZlN0YXR1cyAsIERPVDExRl9GRl9TVEFUVVNfTEVOLCB9LAorICAgICAgICB7ICJBZGRCQVBhcmFtZXRlclNldCIsIG9mZnNldG9mKHREb3QxMWZBZGRCQVJzcCwgQWRkQkFQYXJhbWV0ZXJTZXQpLCBTaWdGZkFkZEJBUGFyYW1ldGVyU2V0ICwgRE9UMTFGX0ZGX0FEREJBUEFSQU1FVEVSU0VUX0xFTiwgfSwKKyAgICAgICAgeyAiQkFUaW1lb3V0Iiwgb2Zmc2V0b2YodERvdDExZkFkZEJBUnNwLCBCQVRpbWVvdXQpLCBTaWdGZkJBVGltZW91dCAsIERPVDExRl9GRl9CQVRJTUVPVVRfTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfQWRkQkFSc3BbXSA9IHsKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tBZGRCQVJzcCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQWRkQkFSc3AgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19BZGRCQVJzcCwgSUVTX0FkZEJBUnNwLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCBGUkZMKCJVbnBhY2tlZCB0aGUgQWRkQkFSc3A6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgRlJGTCgiU3RhdHVzOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCAoIHRBTklfVTgqICkmcEZybS0+U3RhdHVzLnN0YXR1cywgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksIEZSRkwoIkFkZEJBUGFyYW1ldGVyU2V0OlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCBGUkZMKCJhbXNkdVN1cHBvcnRlZCAoMSk6ICVkXG4iKSwgcEZybS0+QWRkQkFQYXJhbWV0ZXJTZXQuYW1zZHVTdXBwb3J0ZWQpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCBGUkZMKCJwb2xpY3kgKDEpOiAlZFxuIiksIHBGcm0tPkFkZEJBUGFyYW1ldGVyU2V0LnBvbGljeSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksIEZSRkwoInRpZCAoNCk6ICVkXG4iKSwgcEZybS0+QWRkQkFQYXJhbWV0ZXJTZXQudGlkKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgRlJGTCgiYnVmZmVyU2l6ZSAoMTApOiAlZFxuIiksIHBGcm0tPkFkZEJBUGFyYW1ldGVyU2V0LmJ1ZmZlclNpemUpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCBGUkZMKCJCQVRpbWVvdXQ6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksICggdEFOSV9VOCogKSZwRnJtLT5CQVRpbWVvdXQudGltZW91dCwgMik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0FkZEJBUnNwLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0FkZFRTUmVxdWVzdFtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSAsIERPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisgICAgICAgIHsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uICwgRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisgICAgICAgIHsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVxdWVzdCwgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0FkZFRTUmVxdWVzdFtdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFkZFRTUmVxdWVzdCwgVFNQRUMpLCBvZmZzZXRvZih0RG90MTFmSUVUU1BFQywgcHJlc2VudCksIDAsICJUU1BFQyIgLCAwLCA1NywgNTcsIFNpZ0llVFNQRUMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9UU1BFQywgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIFRDTEFTKSwgb2Zmc2V0b2YodERvdDExZklFVENMQVMsIHByZXNlbnQpLCBvZmZzZXRvZih0RG90MTFmQWRkVFNSZXF1ZXN0LCBudW1fVENMQVMpLCAiVENMQVMiICwgMiwgNywgNDUsIFNpZ0llVENMQVMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9UQ0xBUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIFRDTEFTU1BST0MpLCBvZmZzZXRvZih0RG90MTFmSUVUQ0xBU1NQUk9DLCBwcmVzZW50KSwgMCwgIlRDTEFTU1BST0MiICwgMCwgMywgMywgU2lnSWVUQ0xBU1NQUk9DLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVENMQVNTUFJPQywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIFdNTVRTUEVDKSwgb2Zmc2V0b2YodERvdDExZklFV01NVFNQRUMsIHByZXNlbnQpLCAwLCAiV01NVFNQRUMiICwgMCwgNjMsIDYzLCBTaWdJZVdNTVRTUEVDLCB7MCwgODAsIDI0MiwgMiwgMn0sIDUsIERPVDExRl9FSURfV01NVFNQRUMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQWRkVFNSZXF1ZXN0LCBXTU1UQ0xBUyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVRDTEFTLCBwcmVzZW50KSwgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVxdWVzdCwgbnVtX1dNTVRDTEFTKSwgIldNTVRDTEFTIiAsIDIsIDEzLCA1MSwgU2lnSWVXTU1UQ0xBUywgezAsIDgwLCAyNDIsIDIsIDZ9LCA1LCBET1QxMUZfRUlEX1dNTVRDTEFTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFkZFRTUmVxdWVzdCwgV01NVENMQVNQUk9DKSwgb2Zmc2V0b2YodERvdDExZklFV01NVENMQVNQUk9DLCBwcmVzZW50KSwgMCwgIldNTVRDTEFTUFJPQyIgLCAwLCA5LCA5LCBTaWdJZVdNTVRDTEFTUFJPQywgezAsIDgwLCAyNDIsIDIsIDd9LCA1LCBET1QxMUZfRUlEX1dNTVRDTEFTUFJPQywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBZGRUU1JlcXVlc3QsIENDWFRyYWZTdHJtUmF0ZVNldCksIG9mZnNldG9mKHREb3QxMWZJRUNDWFRyYWZTdHJtUmF0ZVNldCwgcHJlc2VudCksIDAsICJDQ1hUcmFmU3RybVJhdGVTZXQiICwgMCwgNywgMTUsIFNpZ0llQ0NYVHJhZlN0cm1SYXRlU2V0LCB7MCwgNjQsIDE1MCwgOCwgMH0sIDQsIERPVDExRl9FSURfQ0NYVFJBRlNUUk1SQVRFU0VULCAwLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0FkZFRTUmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQWRkVFNSZXF1ZXN0ICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfQWRkVFNSZXF1ZXN0LCBJRVNfQWRkVFNSZXF1ZXN0LCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiVW5wYWNrZWQgdGhlIEFkZFRTUmVxdWVzdDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJUU1BFQzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5UU1BFQy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnRzaWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+VFNQRUMuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+VFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+VFNQRUMucHNiKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+VFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInNjaGVkdWxlICgxKTogJWRcbiIpLCBwRnJtLT5UU1BFQy5zY2hlZHVsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgidW51c2VkICg3KTogJWRcbiIpLCBwRnJtLT5UU1BFQy51bnVzZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5UU1BFQy5zaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+VFNQRUMuZml4ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9UQ0xBUzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiVENMQVNbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5UQ0xBU1tpXS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLnVzZXJfcHJpb3JpdHksIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uY2xhc3NpZmllcl90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmNsYXNzaWZpZXJfbWFzaywgMSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLmRlc3QsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy50eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNvdXJjZSwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5QYXJhbXM4MDIxZHEudGFnX3R5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIlRDTEFTU1BST0M6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VENMQVNTUFJPQy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTU1BST0MucHJvY2Vzc2luZywgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIldNTVRTUEVDOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTVRTUEVDLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRzaWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMucHNiKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInRzaW5mb19yc3ZkICg3KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2luZm9fcnN2ZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiYnVyc3Rfc2l6ZV9kZWZuICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5idXJzdF9zaXplX2RlZm4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5zaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuZml4ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9XTU1UQ0xBUzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiV01NVENMQVNbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5XTU1UQ0xBU1tpXS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0udXNlcl9wcmlvcml0eSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uY2xhc3NpZmllcl9tYXNrLCAxKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuZGVzdCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnR5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucHJvdG8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmZsb3dfbGFiZWwsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiV01NVENMQVNQUk9DOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTVRDTEFTUFJPQy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTUFJPQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNQUk9DLnByb2Nlc3NpbmcsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJDQ1hUcmFmU3RybVJhdGVTZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0LnRzaWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIm51bV90c3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQubnVtX3RzcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQudHNyYXRlcywgcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0Lm51bV90c3JhdGVzKTsKKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tBZGRUU1JlcXVlc3QuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfQWRkVFNSZXNwb25zZVtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICAgICAgeyAiU3RhdHVzIiwgb2Zmc2V0b2YodERvdDExZkFkZFRTUmVzcG9uc2UsIFN0YXR1cyksIFNpZ0ZmU3RhdHVzICwgRE9UMTFGX0ZGX1NUQVRVU19MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19BZGRUU1Jlc3BvbnNlW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgVFNEZWxheSksIG9mZnNldG9mKHREb3QxMWZJRVRTRGVsYXksIHByZXNlbnQpLCAwLCAiVFNEZWxheSIgLCAwLCA2LCA2LCBTaWdJZVRTRGVsYXksIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9UU0RFTEFZLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFkZFRTUmVzcG9uc2UsIFRTUEVDKSwgb2Zmc2V0b2YodERvdDExZklFVFNQRUMsIHByZXNlbnQpLCAwLCAiVFNQRUMiICwgMCwgNTcsIDU3LCBTaWdJZVRTUEVDLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVFNQRUMsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgVENMQVMpLCBvZmZzZXRvZih0RG90MTFmSUVUQ0xBUywgcHJlc2VudCksIG9mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBudW1fVENMQVMpLCAiVENMQVMiICwgMiwgNywgNDUsIFNpZ0llVENMQVMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9UQ0xBUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBUQ0xBU1NQUk9DKSwgb2Zmc2V0b2YodERvdDExZklFVENMQVNTUFJPQywgcHJlc2VudCksIDAsICJUQ0xBU1NQUk9DIiAsIDAsIDMsIDMsIFNpZ0llVENMQVNTUFJPQywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1RDTEFTU1BST0MsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgU2NoZWR1bGUpLCBvZmZzZXRvZih0RG90MTFmSUVTY2hlZHVsZSwgcHJlc2VudCksIDAsICJTY2hlZHVsZSIgLCAwLCAxNiwgMTYsIFNpZ0llU2NoZWR1bGUsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TQ0hFRFVMRSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBXTU1UU0RlbGF5KSwgb2Zmc2V0b2YodERvdDExZklFV01NVFNEZWxheSwgcHJlc2VudCksIDAsICJXTU1UU0RlbGF5IiAsIDAsIDEyLCAxMiwgU2lnSWVXTU1UU0RlbGF5LCB7MCwgODAsIDI0MiwgMiwgOH0sIDUsIERPVDExRl9FSURfV01NVFNERUxBWSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBXTU1TY2hlZHVsZSksIG9mZnNldG9mKHREb3QxMWZJRVdNTVNjaGVkdWxlLCBwcmVzZW50KSwgMCwgIldNTVNjaGVkdWxlIiAsIDAsIDIyLCAyMiwgU2lnSWVXTU1TY2hlZHVsZSwgezAsIDgwLCAyNDIsIDIsIDl9LCA1LCBET1QxMUZfRUlEX1dNTVNDSEVEVUxFLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFkZFRTUmVzcG9uc2UsIFdNTVRTUEVDKSwgb2Zmc2V0b2YodERvdDExZklFV01NVFNQRUMsIHByZXNlbnQpLCAwLCAiV01NVFNQRUMiICwgMCwgNjMsIDYzLCBTaWdJZVdNTVRTUEVDLCB7MCwgODAsIDI0MiwgMiwgMn0sIDUsIERPVDExRl9FSURfV01NVFNQRUMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgV01NVENMQVMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1UQ0xBUywgcHJlc2VudCksIG9mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBudW1fV01NVENMQVMpLCAiV01NVENMQVMiICwgMiwgMTMsIDUxLCBTaWdJZVdNTVRDTEFTLCB7MCwgODAsIDI0MiwgMiwgNn0sIDUsIERPVDExRl9FSURfV01NVENMQVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQWRkVFNSZXNwb25zZSwgV01NVENMQVNQUk9DKSwgb2Zmc2V0b2YodERvdDExZklFV01NVENMQVNQUk9DLCBwcmVzZW50KSwgMCwgIldNTVRDTEFTUFJPQyIgLCAwLCA5LCA5LCBTaWdJZVdNTVRDTEFTUFJPQywgezAsIDgwLCAyNDIsIDIsIDd9LCA1LCBET1QxMUZfRUlEX1dNTVRDTEFTUFJPQywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBZGRUU1Jlc3BvbnNlLCBDQ1hUcmFmU3RybU1ldCksIG9mZnNldG9mKHREb3QxMWZJRUNDWFRyYWZTdHJtTWV0LCBwcmVzZW50KSwgMCwgIkNDWFRyYWZTdHJtTWV0IiAsIDAsIDEwLCAxMCwgU2lnSWVDQ1hUcmFmU3RybU1ldCwgezAsIDY0LCAxNTAsIDcsIDB9LCA0LCBET1QxMUZfRUlEX0NDWFRSQUZTVFJNTUVULCAwLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0FkZFRTUmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkFkZFRTUmVzcG9uc2UgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19BZGRUU1Jlc3BvbnNlLCBJRVNfQWRkVFNSZXNwb25zZSwgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJVbnBhY2tlZCB0aGUgQWRkVFNSZXNwb25zZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiRGlhbG9nVG9rZW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJTdGF0dXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlN0YXR1cy5zdGF0dXMsIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIlRTRGVsYXk6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VFNEZWxheS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNEZWxheS5kZWxheSwgNCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJUU1BFQzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5UU1BFQy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnRzaWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlRTUEVDLmRpcmVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPlRTUEVDLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+VFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnBzYik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+VFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJzY2hlZHVsZSAoMSk6ICVkXG4iKSwgcEZybS0+VFNQRUMuc2NoZWR1bGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQgKDcpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnVudXNlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5UU1BFQy5zaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlRTUEVDLmZpeGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9UQ0xBUzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIlRDTEFTWyVkXTpcbiIpLCBpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+VENMQVNbaV0ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLnVzZXJfcHJpb3JpdHksIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uY2xhc3NpZmllcl9tYXNrLCAxKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnR5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiVENMQVNTUFJPQzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5UQ0xBU1NQUk9DLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1NQUk9DLnByb2Nlc3NpbmcsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiU2NoZWR1bGU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U2NoZWR1bGUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlNjaGVkdWxlLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+U2NoZWR1bGUudHNpZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+U2NoZWR1bGUuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDkpOiAlZFxuIiksIHBGcm0tPlNjaGVkdWxlLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlNjaGVkdWxlLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5TY2hlZHVsZS5zZXJ2aWNlX2ludGVydmFsLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlNjaGVkdWxlLm1heF9zZXJ2aWNlX2R1ciwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5TY2hlZHVsZS5zcGVjX2ludGVydmFsLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIldNTVRTRGVsYXk6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NVFNEZWxheS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNEZWxheS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTRGVsYXkuZGVsYXksIDQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiV01NU2NoZWR1bGU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NU2NoZWR1bGUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVNjaGVkdWxlLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NU2NoZWR1bGUuYWdncmVnYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1TY2hlZHVsZS50c2lkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5XTU1TY2hlZHVsZS5kaXJlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoOSk6ICVkXG4iKSwgcEZybS0+V01NU2NoZWR1bGUucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NU2NoZWR1bGUuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVNjaGVkdWxlLnNlcnZpY2VfaW50ZXJ2YWwsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NU2NoZWR1bGUubWF4X3NlcnZpY2VfZHVyLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVNjaGVkdWxlLnNwZWNfaW50ZXJ2YWwsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiV01NVFNQRUM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NVFNQRUMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRzaWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmRpcmVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnBzYik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fcnN2ZCAoNyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHNpbmZvX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJidXJzdF9zaXplX2RlZm4gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmJ1cnN0X3NpemVfZGVmbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5zaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmZpeGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9XTU1UQ0xBUzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIldNTVRDTEFTWyVkXTpcbiIpLCBpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V01NVENMQVNbaV0ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLnVzZXJfcHJpb3JpdHksIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uY2xhc3NpZmllcl9tYXNrLCAxKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnR5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiV01NVENMQVNQUk9DOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTVRDTEFTUFJPQy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNQUk9DLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNQUk9DLnByb2Nlc3NpbmcsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiQ0NYVHJhZlN0cm1NZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVHJhZlN0cm1NZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnRzaWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQuc3RhdGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQubXNtdF9pbnRlcnZhbCwgMik7CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrQWRkVFNSZXNwb25zZS4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19Bc3NvY1JlcXVlc3RbXSA9IHsKKyAgICAgICAgeyAiQ2FwYWJpbGl0aWVzIiwgb2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgQ2FwYWJpbGl0aWVzKSwgU2lnRmZDYXBhYmlsaXRpZXMgLCBET1QxMUZfRkZfQ0FQQUJJTElUSUVTX0xFTiwgfSwKKyAgICAgICAgeyAiTGlzdGVuSW50ZXJ2YWwiLCBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBMaXN0ZW5JbnRlcnZhbCksIFNpZ0ZmTGlzdGVuSW50ZXJ2YWwgLCBET1QxMUZfRkZfTElTVEVOSU5URVJWQUxfTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfQXNzb2NSZXF1ZXN0W10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBTU0lEKSwgb2Zmc2V0b2YodERvdDExZklFU1NJRCwgcHJlc2VudCksIDAsICJTU0lEIiAsIDAsIDIsIDM0LCBTaWdJZVNTSUQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TU0lELCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgU3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFU3VwcFJhdGVzLCBwcmVzZW50KSwgMCwgIlN1cHBSYXRlcyIgLCAwLCAyLCAxNCwgU2lnSWVTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TVVBQUkFURVMsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBFeHRTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiAsIDAsIDMsIDE0LCBTaWdJZUV4dFN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFBvd2VyQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVBvd2VyQ2FwcywgcHJlc2VudCksIDAsICJQb3dlckNhcHMiICwgMCwgNCwgNCwgU2lnSWVQb3dlckNhcHMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9QT1dFUkNBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBTdXBwQ2hhbm5lbHMpLCBvZmZzZXRvZih0RG90MTFmSUVTdXBwQ2hhbm5lbHMsIHByZXNlbnQpLCAwLCAiU3VwcENoYW5uZWxzIiAsIDAsIDQsIDk4LCBTaWdJZVN1cHBDaGFubmVscywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NVUFBDSEFOTkVMUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFJTTk9wYXF1ZSksIG9mZnNldG9mKHREb3QxMWZJRVJTTk9wYXF1ZSwgcHJlc2VudCksIDAsICJSU05PcGFxdWUiICwgMCwgOCwgMjU1LCBTaWdJZVJTTk9wYXF1ZSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JTTk9QQVFVRSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIFFPU0NhcHNTdGF0aW9uKSwgb2Zmc2V0b2YodERvdDExZklFUU9TQ2Fwc1N0YXRpb24sIHByZXNlbnQpLCAwLCAiUU9TQ2Fwc1N0YXRpb24iICwgMCwgMywgMywgU2lnSWVRT1NDYXBzU3RhdGlvbiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1FPU0NBUFNTVEFUSU9OLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgUlJNRW5hYmxlZENhcCksIG9mZnNldG9mKHREb3QxMWZJRVJSTUVuYWJsZWRDYXAsIHByZXNlbnQpLCAwLCAiUlJNRW5hYmxlZENhcCIgLCAwLCA3LCA3LCBTaWdJZVJSTUVuYWJsZWRDYXAsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SUk1FTkFCTEVEQ0FQLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgTW9iaWxpdHlEb21haW4pLCBvZmZzZXRvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbiwgcHJlc2VudCksIDAsICJNb2JpbGl0eURvbWFpbiIgLCAwLCA1LCA1LCBTaWdJZU1vYmlsaXR5RG9tYWluLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfTU9CSUxJVFlET01BSU4sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBXUEFPcGFxdWUpLCBvZmZzZXRvZih0RG90MTFmSUVXUEFPcGFxdWUsIHByZXNlbnQpLCAwLCAiV1BBT3BhcXVlIiAsIDAsIDgsIDI1NSwgU2lnSWVXUEFPcGFxdWUsIHswLCA4MCwgMjQyLCAxLCAwfSwgNCwgRE9UMTFGX0VJRF9XUEFPUEFRVUUsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVIVENhcHMsIHByZXNlbnQpLCAwLCAiSFRDYXBzIiAsIDAsIDI4LCA2MCwgU2lnSWVIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9IVENBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBXTU1DYXBzKSwgb2Zmc2V0b2YodERvdDExZklFV01NQ2FwcywgcHJlc2VudCksIDAsICJXTU1DYXBzIiAsIDAsIDksIDksIFNpZ0llV01NQ2FwcywgezAsIDgwLCAyNDIsIDIsIDV9LCA1LCBET1QxMUZfRUlEX1dNTUNBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBXTU1JbmZvU3RhdGlvbiksIG9mZnNldG9mKHREb3QxMWZJRVdNTUluZm9TdGF0aW9uLCBwcmVzZW50KSwgMCwgIldNTUluZm9TdGF0aW9uIiAsIDAsIDksIDksIFNpZ0llV01NSW5mb1N0YXRpb24sIHswLCA4MCwgMjQyLCAyLCAwfSwgNSwgRE9UMTFGX0VJRF9XTU1JTkZPU1RBVElPTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1JlcXVlc3QsIEFpcmdvKSwgb2Zmc2V0b2YodERvdDExZklFQWlyZ28sIHByZXNlbnQpLCAwLCAiQWlyZ28iICwgMCwgNSwgMjMyLCBTaWdJZUFpcmdvLCB7MCwgMTAsIDI0NSwgMCwgMH0sIDMsIERPVDExRl9FSURfQUlSR08sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBXc2NJRU9wYXF1ZSksIG9mZnNldG9mKHREb3QxMWZJRVdzY0lFT3BhcXVlLCBwcmVzZW50KSwgMCwgIldzY0lFT3BhcXVlIiAsIDAsIDgsIDI1NSwgU2lnSWVXc2NJRU9wYXF1ZSwgezAsIDgwLCAyNDIsIDQsIDB9LCA0LCBET1QxMUZfRUlEX1dTQ0lFT1BBUVVFLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFzc29jUmVxdWVzdCwgV0FQSU9wYXF1ZSksIG9mZnNldG9mKHREb3QxMWZJRVdBUElPcGFxdWUsIHByZXNlbnQpLCAwLCAiV0FQSU9wYXF1ZSIgLCAwLCA4LCAyNTUsIFNpZ0llV0FQSU9wYXF1ZSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1dBUElPUEFRVUUsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBDQ1hSYWRNZ210Q2FwKSwgb2Zmc2V0b2YodERvdDExZklFQ0NYUmFkTWdtdENhcCwgcHJlc2VudCksIDAsICJDQ1hSYWRNZ210Q2FwIiAsIDAsIDgsIDgsIFNpZ0llQ0NYUmFkTWdtdENhcCwgezAsIDY0LCAxNTAsIDEsIDB9LCA0LCBET1QxMUZfRUlEX0NDWFJBRE1HTVRDQVAsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBDQ1hWZXJzaW9uKSwgb2Zmc2V0b2YodERvdDExZklFQ0NYVmVyc2lvbiwgcHJlc2VudCksIDAsICJDQ1hWZXJzaW9uIiAsIDAsIDcsIDcsIFNpZ0llQ0NYVmVyc2lvbiwgezAsIDY0LCAxNTAsIDMsIDB9LCA0LCBET1QxMUZfRUlEX0NDWFZFUlNJT04sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXF1ZXN0LCBQMlBJRU9wYXF1ZSksIG9mZnNldG9mKHREb3QxMWZJRVAyUElFT3BhcXVlLCBwcmVzZW50KSwgMCwgIlAyUElFT3BhcXVlIiAsIDAsIDgsIDI1NSwgU2lnSWVQMlBJRU9wYXF1ZSwgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQSUVPUEFRVUUsIDAsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrQXNzb2NSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZBc3NvY1JlcXVlc3QgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19Bc3NvY1JlcXVlc3QsIElFU19Bc3NvY1JlcXVlc3QsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJVbnBhY2tlZCB0aGUgQXNzb2NSZXF1ZXN0OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkNhcGFiaWxpdGllczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImVzcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmVzcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJpYnNzICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaWJzcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJjZlBvbGxhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsYWJsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJjZlBvbGxSZXEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jZlBvbGxSZXEpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicHJpdmFjeSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnByaXZhY3kpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgic2hvcnRQcmVhbWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicGJjYyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnBiY2MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiY2hhbm5lbEFnaWxpdHkgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jaGFubmVsQWdpbGl0eSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJzcGVjdHJ1bU1ndCAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInFvcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnFvcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJzaG9ydFNsb3RUaW1lICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc2hvcnRTbG90VGltZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuYXBzZCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJycm0gKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5ycm0pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiZHNzc09mZG0gKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5kc3NzT2ZkbSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5kZWxheWVkQkEpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiaW1tZWRpYXRlQkEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5pbW1lZGlhdGVCQSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJMaXN0ZW5JbnRlcnZhbDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5MaXN0ZW5JbnRlcnZhbC5pbnRlcnZhbCwgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJTU0lEOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlNTSUQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm51bV9zc2lkOiAlZC5cbiIpLCBwRnJtLT5TU0lELm51bV9zc2lkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+U1NJRC5zc2lkLCBwRnJtLT5TU0lELm51bV9zc2lkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiU3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiRXh0U3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+RXh0U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiUG93ZXJDYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlBvd2VyQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlBvd2VyQ2Fwcy5taW5UeFBvd2VyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UG93ZXJDYXBzLm1heFR4UG93ZXIsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJTdXBwQ2hhbm5lbHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U3VwcENoYW5uZWxzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fYmFuZHM6ICVkLlxuIiksIHBGcm0tPlN1cHBDaGFubmVscy5udW1fYmFuZHMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5TdXBwQ2hhbm5lbHMuYmFuZHMsIDIgKiBwRnJtLT5TdXBwQ2hhbm5lbHMubnVtX2JhbmRzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiUlNOT3BhcXVlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJTTk9wYXF1ZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2RhdGE6ICVkLlxuIiksIHBGcm0tPlJTTk9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTk9wYXF1ZS5kYXRhLCBwRnJtLT5SU05PcGFxdWUubnVtX2RhdGEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJRT1NDYXBzU3RhdGlvbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5RT1NDYXBzU3RhdGlvbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibW9yZV9kYXRhX2FjayAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24ubW9yZV9kYXRhX2Fjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibWF4X3NwX2xlbmd0aCAoMik6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24ubWF4X3NwX2xlbmd0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicWFjayAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24ucWFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNiZV91YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24uYWNiZV91YXBzZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNia191YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24uYWNia191YXBzZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2aV91YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24uYWN2aV91YXBzZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2b191YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24uYWN2b191YXBzZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlJSTUVuYWJsZWRDYXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlJNRW5hYmxlZENhcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTGlua01lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxpbmtNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTmVpZ2hib3JScHQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JScHQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInBhcmFsbGVsICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnBhcmFsbGVsKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXBlYXRlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXBlYXRlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiQmVhY29uUGFzc2l2ZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25QYXNzaXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJCZWFjb25BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJCZWFjb25UYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25UYWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiQmVhY29uUmVwQ29uZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25SZXBDb25kKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJGcmFtZU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkZyYW1lTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkNoYW5uZWxMb2FkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkNoYW5uZWxMb2FkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb2lzZUhpc3RvZ3JhbSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5Ob2lzZUhpc3RvZ3JhbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgic3RhdGlzdGljcyAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5zdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJMQ0lNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTENJQXppbXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lBemltdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJUQ01DYXBhYmlsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlRDTUNhcGFiaWxpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInRyaWdnZXJlZFRDTSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC50cmlnZ2VyZWRUQ00pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkFQQ2hhblJlcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BUENoYW5SZXBvcnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlJSTU1JQkVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlJNTUlCRW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgib3BlcmF0aW5nQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5vcGVyYXRpbmdDaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJub25PcGVyYXRpbkNoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAubm9uT3BlcmF0aW5DaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk1lYXN1cmVtZW50UGlsb3RFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3RFbmFibGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOZWlnaGJvclRTRk9mZnNldCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5OZWlnaGJvclRTRk9mZnNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiUkNQSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJDUElNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiUlNOSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJTTklNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiQnNzQXZnQWNjZXNzRGVsYXkgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQnNzQXZnQWNjZXNzRGVsYXkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkJTU0F2YWlsQWRtaXNzaW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJTU0F2YWlsQWRtaXNzaW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJBbnRlbm5hSW5mb3JtYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQW50ZW5uYUluZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk1vYmlsaXR5RG9tYWluOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPk1vYmlsaXR5RG9tYWluLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TW9iaWxpdHlEb21haW4uTURJRCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgib3ZlckRTQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5vdmVyRFNDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJlc291cmNlUmVxQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNvdXJjZVJlcUNhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiV1BBT3BhcXVlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldQQU9wYXF1ZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2RhdGE6ICVkLlxuIiksIHBGcm0tPldQQU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPldQQU9wYXF1ZS5kYXRhLCBwRnJtLT5XUEFPcGFxdWUubnVtX2RhdGEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJIVENhcHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+SFRDYXBzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhZHZDb2RpbmdDYXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hZHZDb2RpbmdDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibWltb1Bvd2VyU2F2ZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1pbW9Qb3dlclNhdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImdyZWVuRmllbGQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5ncmVlbkZpZWxkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJzaG9ydEdJMjBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zaG9ydEdJMjBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInNob3J0R0k0ME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnNob3J0R0k0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgidHhTVEJDICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyeFNUQkMgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFNUQkMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImRlbGF5ZWRCQSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmRlbGF5ZWRCQSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibWF4aW1hbEFNU0RVc2l6ZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1heGltYWxBTVNEVXNpemUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImRzc3NDY2tNb2RlNDBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5kc3NzQ2NrTW9kZTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJwc21wICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucHNtcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgic3RiY0NvbnRyb2xGcmFtZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnN0YmNDb250cm9sRnJhbWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImxzaWdUWE9QUHJvdGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmxzaWdUWE9QUHJvdGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibWF4UnhBTVBEVUZhY3RvciAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3IpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm1wZHVEZW5zaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubXBkdURlbnNpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJwY28gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wY28pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInRyYW5zaXRpb25UaW1lICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHJhbnNpdGlvblRpbWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMiAoNSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibWNzRmVlZGJhY2sgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tY3NGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQzICg2KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0eEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicnhTdGFnZ2VyZWRTb3VuZGluZyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4U3RhZ2dlcmVkU291bmRpbmcpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInR4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyeFpMRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4WkxGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0eFpMRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4WkxGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJpbXBsaWNpdFR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5pbXBsaWNpdFR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImNhbGlicmF0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY2FsaWJyYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0Q1NJVHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJVHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0QkZDU0lGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0QkZDU0lGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiY3NpTnVtQkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNzaU51bUJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkNCAoNyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYW50ZW5uYVNlbGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFTZWxlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0Q1NJRmVlZGJhY2tUeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2tUeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYW50ZW5uYUluZGljZXNGZWVkYmFja1R4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYUluZGljZXNGZWVkYmFja1R4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYW50ZW5uYUluZGljZXNGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFJbmRpY2VzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJ4QVMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeEFTKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0eFNvdW5kaW5nUFBEVXMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFNvdW5kaW5nUFBEVXMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkNSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkNSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3JzdmQ6ICVkLlxuIiksIHBGcm0tPkhUQ2Fwcy5udW1fcnN2ZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPkhUQ2Fwcy5yc3ZkLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJXTU1DYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTUNhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1DYXBzLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJxYWNrICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnFhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInF1ZXVlX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucXVldWVfcmVxdWVzdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgidHhvcF9yZXF1ZXN0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnR4b3BfcmVxdWVzdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibW9yZV9hY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMubW9yZV9hY2spOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJXTU1JbmZvU3RhdGlvbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1JbmZvU3RhdGlvbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTUluZm9TdGF0aW9uLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdm9fdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9TdGF0aW9uLmFjdm9fdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9TdGF0aW9uLmFjdmlfdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9TdGF0aW9uLmFjYmtfdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmVfdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9TdGF0aW9uLmFjYmVfdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMSAoMSk6ICVkXG4iKSwgcEZybS0+V01NSW5mb1N0YXRpb24ucmVzZXJ2ZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJtYXhfc3BfbGVuZ3RoICgyKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5tYXhfc3BfbGVuZ3RoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDIgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9TdGF0aW9uLnJlc2VydmVkMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkFpcmdvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJQcm9wU3VwcFJhdGVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJBUE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkFQTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX25hbWU6ICVkLlxuIiksIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5BUE5hbWUubmFtZSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJIQ0Y6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkhDRi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkhDRi5lbmFibGVkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJXRFM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLldEUy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3dkc0RhdGE6ICVkLlxuIiksIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5XRFMud2RzRGF0YSwgcEZybS0+QWlyZ28uV0RTLm51bV93ZHNEYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJCUEluZGljYXRvcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci5pbmRpY2F0b3IsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTG9hZEluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8ubnVtX3N0YXMsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8uY2hhbm5lbF91dGlsLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJMb2FkQmFsYW5jZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJQcm9wQXNzb2NUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEFzc29jVHlwZS50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJMTEF0dHI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxMQXR0ci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxMQXR0ci5kZWZlcl90aHJlc2hvbGQsIDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlByb3BDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LmNhcGFiaWxpdHksIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5WZXJzaW9uLmNoaXBfcmV2LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2FyZF90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2J1aWxkX3ZlcnNpb246ICVkLlxuIiksIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uVmVyc2lvbi5idWlsZF92ZXJzaW9uLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJQcm9wRURDQVBhcmFtczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5xb3MsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmVfbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmVfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNia19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNia19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZpX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZpX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdm9fbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdm9fbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiVGl0YW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRpdGFuLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29uY2F0X3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbXByZXNzaW9uX3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNiX3N0YXRlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLnJldl9mY3Nfc3RhdGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlByb3BDaGFublN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLm1vZGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnByaW1hcnlfY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4uc3ViX2JhbmQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLmNoYW5uZWxfc3dpdGNoX2NvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJQcm9wUXVpZXRCU1M6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfcGVyaW9kLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfb2Zmc2V0LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJUcmlnZ2VyU3RhQmdTY2FuOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UcmlnZ2VyU3RhQmdTY2FuLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5lbmFibGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlRhdXJ1czpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGF1cnVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhVElEQml0bWFwLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVBvbGljeSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImJhQnVmZmVyU2l6ZSAoMTIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlRhdXJ1cy5iYUJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyc3ZkICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMucnN2ZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIldzY0lFT3BhcXVlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldzY0lFT3BhcXVlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fZGF0YTogJWQuXG4iKSwgcEZybS0+V3NjSUVPcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NJRU9wYXF1ZS5kYXRhLCBwRnJtLT5Xc2NJRU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIldBUElPcGFxdWU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V0FQSU9wYXF1ZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2RhdGE6ICVkLlxuIiksIHBGcm0tPldBUElPcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5XQVBJT3BhcXVlLmRhdGEsIHBGcm0tPldBUElPcGFxdWUubnVtX2RhdGEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJDQ1hSYWRNZ210Q2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFJhZE1nbXRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hSYWRNZ210Q2FwLm1nbXRfc3RhdGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm1ic3NpZF9tYXNrICgzKTogJWRcbiIpLCBwRnJtLT5DQ1hSYWRNZ210Q2FwLm1ic3NpZF9tYXNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZCAoNSk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkNDWFZlcnNpb246XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVmVyc2lvbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFZlcnNpb24udmVyc2lvbiwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlAyUElFT3BhcXVlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUElFT3BhcXVlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fZGF0YTogJWQuXG4iKSwgcEZybS0+UDJQSUVPcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5QMlBJRU9wYXF1ZS5kYXRhLCBwRnJtLT5QMlBJRU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrQXNzb2NSZXF1ZXN0LiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0Fzc29jUmVzcG9uc2VbXSA9IHsKKyAgICAgICAgeyAiQ2FwYWJpbGl0aWVzIiwgb2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIENhcGFiaWxpdGllcyksIFNpZ0ZmQ2FwYWJpbGl0aWVzICwgRE9UMTFGX0ZGX0NBUEFCSUxJVElFU19MRU4sIH0sCisgICAgICAgIHsgIlN0YXR1cyIsIG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBTdGF0dXMpLCBTaWdGZlN0YXR1cyAsIERPVDExRl9GRl9TVEFUVVNfTEVOLCB9LAorICAgICAgICB7ICJBSUQiLCBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgQUlEKSwgU2lnRmZBSUQgLCBET1QxMUZfRkZfQUlEX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0Fzc29jUmVzcG9uc2VbXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiU3VwcFJhdGVzIiAsIDAsIDIsIDE0LCBTaWdJZVN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NVUFBSQVRFUywgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBFeHRTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiAsIDAsIDMsIDE0LCBTaWdJZUV4dFN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBFRENBUGFyYW1TZXQpLCBvZmZzZXRvZih0RG90MTFmSUVFRENBUGFyYW1TZXQsIHByZXNlbnQpLCAwLCAiRURDQVBhcmFtU2V0IiAsIDAsIDIwLCAyMCwgU2lnSWVFRENBUGFyYW1TZXQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9FRENBUEFSQU1TRVQsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgUkNQSUlFKSwgb2Zmc2V0b2YodERvdDExZklFUkNQSUlFLCBwcmVzZW50KSwgMCwgIlJDUElJRSIgLCAwLCAzLCAzLCBTaWdJZVJDUElJRSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JDUElJRSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBSU05JSUUpLCBvZmZzZXRvZih0RG90MTFmSUVSU05JSUUsIHByZXNlbnQpLCAwLCAiUlNOSUlFIiAsIDAsIDMsIDMsIFNpZ0llUlNOSUlFLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUlNOSUlFLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIFJSTUVuYWJsZWRDYXApLCBvZmZzZXRvZih0RG90MTFmSUVSUk1FbmFibGVkQ2FwLCBwcmVzZW50KSwgMCwgIlJSTUVuYWJsZWRDYXAiICwgMCwgNywgNywgU2lnSWVSUk1FbmFibGVkQ2FwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUlJNRU5BQkxFRENBUCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBNb2JpbGl0eURvbWFpbiksIG9mZnNldG9mKHREb3QxMWZJRU1vYmlsaXR5RG9tYWluLCBwcmVzZW50KSwgMCwgIk1vYmlsaXR5RG9tYWluIiAsIDAsIDUsIDUsIFNpZ0llTW9iaWxpdHlEb21haW4sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9NT0JJTElUWURPTUFJTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBGVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sIHByZXNlbnQpLCAwLCAiRlRJbmZvIiAsIDAsIDg0LCAxODcsIFNpZ0llRlRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRlRJTkZPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIFJJQ0RhdGFEZXNjKSwgb2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIHByZXNlbnQpLCBvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgbnVtX1JJQ0RhdGFEZXNjKSwgIlJJQ0RhdGFEZXNjIiAsIDIsIDIsIDU1MCwgU2lnSWVSSUNEYXRhRGVzYywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JJQ0RBVEFERVNDLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIFdQQSksIG9mZnNldG9mKHREb3QxMWZJRVdQQSwgcHJlc2VudCksIDAsICJXUEEiICwgMCwgOCwgNTAsIFNpZ0llV1BBLCB7MCwgODAsIDI0MiwgMSwgMH0sIDQsIERPVDExRl9FSURfV1BBLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIEhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRUhUQ2FwcywgcHJlc2VudCksIDAsICJIVENhcHMiICwgMCwgMjgsIDYwLCBTaWdJZUhUQ2FwcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0hUQ0FQUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBIVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVIVEluZm8sIHByZXNlbnQpLCAwLCAiSFRJbmZvIiAsIDAsIDI0LCA1NiwgU2lnSWVIVEluZm8sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9IVElORk8sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgV01NUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFV01NUGFyYW1zLCBwcmVzZW50KSwgMCwgIldNTVBhcmFtcyIgLCAwLCAyNiwgMjYsIFNpZ0llV01NUGFyYW1zLCB7MCwgODAsIDI0MiwgMiwgMX0sIDUsIERPVDExRl9FSURfV01NUEFSQU1TLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkFzc29jUmVzcG9uc2UsIFdNTUNhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1DYXBzLCBwcmVzZW50KSwgMCwgIldNTUNhcHMiICwgMCwgOSwgOSwgU2lnSWVXTU1DYXBzLCB7MCwgODAsIDI0MiwgMiwgNX0sIDUsIERPVDExRl9FSURfV01NQ0FQUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBDQ1hSYWRNZ210Q2FwKSwgb2Zmc2V0b2YodERvdDExZklFQ0NYUmFkTWdtdENhcCwgcHJlc2VudCksIDAsICJDQ1hSYWRNZ210Q2FwIiAsIDAsIDgsIDgsIFNpZ0llQ0NYUmFkTWdtdENhcCwgezAsIDY0LCAxNTAsIDEsIDB9LCA0LCBET1QxMUZfRUlEX0NDWFJBRE1HTVRDQVAsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgQ0NYVHJhZlN0cm1NZXQpLCBvZmZzZXRvZih0RG90MTFmSUVDQ1hUcmFmU3RybU1ldCwgcHJlc2VudCksIDAsICJDQ1hUcmFmU3RybU1ldCIgLCAwLCAxMCwgMTAsIFNpZ0llQ0NYVHJhZlN0cm1NZXQsIHswLCA2NCwgMTUwLCA3LCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hUUkFGU1RSTU1FVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBDQ1hUeG1pdFBvd2VyKSwgb2Zmc2V0b2YodERvdDExZklFQ0NYVHhtaXRQb3dlciwgcHJlc2VudCksIDAsICJDQ1hUeG1pdFBvd2VyIiAsIDAsIDgsIDgsIFNpZ0llQ0NYVHhtaXRQb3dlciwgezAsIDY0LCAxNTAsIDAsIDB9LCA0LCBET1QxMUZfRUlEX0NDWFRYTUlUUE9XRVIsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgV01NVFNQRUMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1UU1BFQywgcHJlc2VudCksIG9mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBudW1fV01NVFNQRUMpLCAiV01NVFNQRUMiICwgNCwgNjMsIDYzLCBTaWdJZVdNTVRTUEVDLCB7MCwgODAsIDI0MiwgMiwgMn0sIDUsIERPVDExRl9FSURfV01NVFNQRUMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgQWlyZ28pLCBvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgcHJlc2VudCksIDAsICJBaXJnbyIgLCAwLCA1LCAyMzIsIFNpZ0llQWlyZ28sIHswLCAxMCwgMjQ1LCAwLCAwfSwgMywgRE9UMTFGX0VJRF9BSVJHTywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBc3NvY1Jlc3BvbnNlLCBXc2NBc3NvY1JlcyksIG9mZnNldG9mKHREb3QxMWZJRVdzY0Fzc29jUmVzLCBwcmVzZW50KSwgMCwgIldzY0Fzc29jUmVzIiAsIDAsIDYsIDM3LCBTaWdJZVdzY0Fzc29jUmVzLCB7MCwgODAsIDI0MiwgNCwgMH0sIDQsIERPVDExRl9FSURfV1NDQVNTT0NSRVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXNzb2NSZXNwb25zZSwgUDJQQXNzb2NSZXMpLCBvZmZzZXRvZih0RG90MTFmSUVQMlBBc3NvY1JlcywgcHJlc2VudCksIDAsICJQMlBBc3NvY1JlcyIgLCAwLCA2LCAxNywgU2lnSWVQMlBBc3NvY1JlcywgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQQVNTT0NSRVMsIDAsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrQXNzb2NSZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQXNzb2NSZXNwb25zZSAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX0Fzc29jUmVzcG9uc2UsIElFU19Bc3NvY1Jlc3BvbnNlLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlVucGFja2VkIHRoZSBBc3NvY1Jlc3BvbnNlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkNhcGFiaWxpdGllczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJlc3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5lc3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImlic3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5pYnNzKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJjZlBvbGxhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsYWJsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiY2ZQb2xsUmVxICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsUmVxKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJwcml2YWN5ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucHJpdmFjeSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2hvcnRQcmVhbWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInBiY2MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wYmNjKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJjaGFubmVsQWdpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNoYW5uZWxBZ2lsaXR5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzcGVjdHJ1bU1ndCAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJxb3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5xb3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInNob3J0U2xvdFRpbWUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zaG9ydFNsb3RUaW1lKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuYXBzZCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnJtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucnJtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJkc3NzT2ZkbSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmRzc3NPZmRtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5kZWxheWVkQkEpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImltbWVkaWF0ZUJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaW1tZWRpYXRlQkEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlN0YXR1czpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+U3RhdHVzLnN0YXR1cywgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQUlEOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BSUQuYXNzb2NpZCwgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiU3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkV4dFN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FeHRTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkV4dFN1cHBSYXRlcy5yYXRlcywgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJFRENBUGFyYW1TZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RURDQVBhcmFtU2V0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQucW9zLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQxICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQzICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQ0ICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJSQ1BJSUU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UkNQSUlFLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SQ1BJSUUucmNwaSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJSU05JSUU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlNOSUlFLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SU05JSUUucnNuaSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJSUk1FbmFibGVkQ2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJSTUVuYWJsZWRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTGlua01lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxpbmtNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5laWdoYm9yUnB0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5laWdoYm9yUnB0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicGFyYWxsZWwgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucGFyYWxsZWwpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXBlYXRlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXBlYXRlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkJlYWNvblBhc3NpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUGFzc2l2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkJlYWNvbkFjdGl2ZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25BY3RpdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJCZWFjb25UYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25UYWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkJlYWNvblJlcENvbmQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUmVwQ29uZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkZyYW1lTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuRnJhbWVNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkNoYW5uZWxMb2FkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkNoYW5uZWxMb2FkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm9pc2VIaXN0b2dyYW0gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTm9pc2VIaXN0b2dyYW0pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzdGF0aXN0aWNzICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnN0YXRpc3RpY3MpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJMQ0lNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkxDSUF6aW11dGggKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJQXppbXV0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlRDTUNhcGFiaWxpdHkgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuVENNQ2FwYWJpbGl0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRyaWdnZXJlZFRDTSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC50cmlnZ2VyZWRUQ00pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJBUENoYW5SZXBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQVBDaGFuUmVwb3J0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUlJNTUlCRW5hYmxlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SUk1NSUJFbmFibGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgib3BlcmF0aW5nQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5vcGVyYXRpbmdDaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibm9uT3BlcmF0aW5DaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLm5vbk9wZXJhdGluQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk1lYXN1cmVtZW50UGlsb3QgKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTWVhc3VyZW1lbnRQaWxvdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk1lYXN1cmVtZW50UGlsb3RFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3RFbmFibGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTmVpZ2hib3JUU0ZPZmZzZXQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JUU0ZPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJSQ1BJTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUkNQSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUlNOSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJTTklNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkJzc0F2Z0FjY2Vzc0RlbGF5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJzc0F2Z0FjY2Vzc0RlbGF5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQlNTQXZhaWxBZG1pc3Npb24gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQlNTQXZhaWxBZG1pc3Npb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJBbnRlbm5hSW5mb3JtYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQW50ZW5uYUluZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTW9iaWxpdHlEb21haW46XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+TW9iaWxpdHlEb21haW4ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1vYmlsaXR5RG9tYWluLk1ESUQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJvdmVyRFNDYXAgKDEpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLm92ZXJEU0NhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc291cmNlUmVxQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNvdXJjZVJlcUNhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJGVEluZm86XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RlRJbmZvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg4KTogJWRcbiIpLCBwRnJtLT5GVEluZm8ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJJRUNvdW50ICg4KTogJWRcbiIpLCBwRnJtLT5GVEluZm8uSUVDb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uTUlDLCAxNik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uQW5vbmNlLCAzMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uU25vbmNlLCAzMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlIxS0hfSUQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5SMUtIX0lELnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uUjFLSF9JRC5QTUtfUjFfSUQsIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJHVEs6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5HVEsucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgia2V5SWQgKDIpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5HVEsua2V5SWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDE0KTogJWRcbiIpLCBwRnJtLT5GVEluZm8uR1RLLnJlc2VydmVkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uR1RLLmtleUxlbmd0aCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLkdUSy5SU0MsIDgpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX2tleTogJWQuXG4iKSwgcEZybS0+RlRJbmZvLkdUSy5udW1fa2V5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5GVEluZm8uR1RLLmtleSwgcEZybS0+RlRJbmZvLkdUSy5udW1fa2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUjBLSF9JRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+RlRJbmZvLlIwS0hfSUQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX1BNS19SMF9JRDogJWQuXG4iKSwgcEZybS0+RlRJbmZvLlIwS0hfSUQubnVtX1BNS19SMF9JRCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+RlRJbmZvLlIwS0hfSUQuUE1LX1IwX0lELCBwRnJtLT5GVEluZm8uUjBLSF9JRC5udW1fUE1LX1IwX0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+bnVtX1JJQ0RhdGFEZXNjOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUklDRGF0YURlc2NbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJSSUNEYXRhOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5JZGVudGlmaWVyLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5yZXNvdXJjZURlc2NDb3VudCwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEuc3RhdHVzQ29kZSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUklDRGVzY3JpcHRvcjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IucmVzb3VyY2VUeXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fdmFyaWFibGVEYXRhOiAlZC5cbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLm51bV92YXJpYWJsZURhdGEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLnZhcmlhYmxlRGF0YSwgcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5udW1fdmFyaWFibGVEYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJUU1BFQzpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMudHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnBzYik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMudXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzY2hlZHVsZSAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc2NoZWR1bGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZCAoNyk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMudW51c2VkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmZpeGVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+UklDRGF0YURlc2NbaV0ubnVtX1RDTEFTOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlRDTEFTWyVkXTpcbiIpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5wcmVzZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0udXNlcl9wcmlvcml0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uY2xhc3NpZmllcl9tYXNrLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uY2xhc3NpZmllcl90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuZGVzdCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnR5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNvdXJjZSwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc291cmNlLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5QYXJhbXM4MDIxZHEudGFnX3R5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVENMQVNTUFJPQzpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTU1BST0MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTU1BST0MucHJvY2Vzc2luZywgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVFNEZWxheTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTRGVsYXkucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTRGVsYXkuZGVsYXksIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlNjaGVkdWxlOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDkpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnJlc2VydmVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuc2VydmljZV9pbnRlcnZhbCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLm1heF9zZXJ2aWNlX2R1ciwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnNwZWNfaW50ZXJ2YWwsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVRTUEVDOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnBzYik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fcnN2ZCAoNyk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHNpbmZvX3JzdmQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImJ1cnN0X3NpemVfZGVmbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYnVyc3Rfc2l6ZV9kZWZuKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmZpeGVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+UklDRGF0YURlc2NbaV0ubnVtX1dNTVRDTEFTOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVRDTEFTWyVkXTpcbiIpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5wcmVzZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0udmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS51c2VyX3ByaW9yaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5jbGFzc2lmaWVyX21hc2ssIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5FdGhQYXJhbXMudHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucHJvdG8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJXTU1UQ0xBU1BST0M6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1BST0MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTUFJPQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNQUk9DLnByb2Nlc3NpbmcsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVRTRGVsYXk6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU0RlbGF5LnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU0RlbGF5LnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU0RlbGF5LmRlbGF5LCA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJXTU1TY2hlZHVsZTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoOSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUucmVzZXJ2ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5zZXJ2aWNlX2ludGVydmFsLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUubWF4X3NlcnZpY2VfZHVyLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuc3BlY19pbnRlcnZhbCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV1BBOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldQQS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLnZlcnNpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLm11bHRpY2FzdF9jaXBoZXIsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPldQQS51bmljYXN0X2NpcGhlcnMsIDQgKiBwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+V1BBLmF1dGhfc3VpdGVzLCA0ICogcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLmNhcHMsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiSFRDYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhZHZDb2RpbmdDYXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hZHZDb2RpbmdDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJtaW1vUG93ZXJTYXZlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWltb1Bvd2VyU2F2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImdyZWVuRmllbGQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5ncmVlbkZpZWxkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2hvcnRHSTIwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTIwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2hvcnRHSTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHhTVEJDICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnhTVEJDICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZGVsYXllZEJBKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibWF4aW1hbEFNU0RVc2l6ZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1heGltYWxBTVNEVXNpemUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJkc3NzQ2NrTW9kZTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZHNzc0Nja01vZGU0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInBzbXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wc21wKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgic3RiY0NvbnRyb2xGcmFtZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnN0YmNDb250cm9sRnJhbWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJtYXhSeEFNUERVRmFjdG9yICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4UnhBTVBEVUZhY3Rvcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm1wZHVEZW5zaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubXBkdURlbnNpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDEgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+SFRDYXBzLnN1cHBvcnRlZE1DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJwY28gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wY28pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0cmFuc2l0aW9uVGltZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnRyYW5zaXRpb25UaW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQyICg1KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibWNzRmVlZGJhY2sgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tY3NGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkMyAoNik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnhTdGFnZ2VyZWRTb3VuZGluZyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4U3RhZ2dlcmVkU291bmRpbmcpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0eFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJ4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0eFpMRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4WkxGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiaW1wbGljaXRUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuaW1wbGljaXRUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiY2FsaWJyYXRpb24gKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jYWxpYnJhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0Q1NJVHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJVHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRCRkNTSUZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRCRkNTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJjc2lOdW1CRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY3NpTnVtQkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQ0ICg3KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYW50ZW5uYVNlbGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFTZWxlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnhBUyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4QVMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0eFNvdW5kaW5nUFBEVXMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFNvdW5kaW5nUFBEVXMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkhUQ2Fwcy5yc3ZkLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiSFRJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+SFRJbmZvLnByaW1hcnlDaGFubmVsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAoMik6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZWNvbW1lbmRlZFR4V2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyaWZzTW9kZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJpZnNNb2RlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiY29udHJvbGxlZEFjY2Vzc09ubHkgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5jb250cm9sbGVkQWNjZXNzT25seSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2VydmljZUludGVydmFsR3JhbnVsYXJpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJvcE1vZGUgKDIpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5vcE1vZGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJub25HRkRldmljZXNQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ubm9uR0ZEZXZpY2VzUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRyYW5zbWl0QnVyc3RMaW1pdCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnRyYW5zbWl0QnVyc3RMaW1pdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm9ic3NOb25IVFN0YVByZXNlbnQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5vYnNzTm9uSFRTdGFQcmVzZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDExKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJiYXNpY1NUQkNNQ1MgKDcpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5iYXNpY1NUQkNNQ1MpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJkdWFsQ1RTUHJvdGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmR1YWxDVFNQcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2Vjb25kYXJ5QmVhY29uICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2Vjb25kYXJ5QmVhY29uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInBjb0FjdGl2ZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnBjb0FjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInBjb1BoYXNlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucGNvUGhhc2UpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDIgKDQpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+SFRJbmZvLmJhc2ljTUNTU2V0LCAxNik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVEluZm8ubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+SFRJbmZvLnJzdmQsIHBGcm0tPkhUSW5mby5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJXTU1QYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucW9zSW5mbywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucmVzZXJ2ZWQyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTUNhcHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NQ2Fwcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJxYWNrICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnFhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJxdWV1ZV9yZXF1ZXN0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnF1ZXVlX3JlcXVlc3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0eG9wX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMudHhvcF9yZXF1ZXN0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibW9yZV9hY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMubW9yZV9hY2spOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQ0NYUmFkTWdtdENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hSYWRNZ210Q2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hSYWRNZ210Q2FwLm1nbXRfc3RhdGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJtYnNzaWRfbWFzayAoMyk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5tYnNzaWRfbWFzayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg1KTogJWRcbiIpLCBwRnJtLT5DQ1hSYWRNZ210Q2FwLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkNDWFRyYWZTdHJtTWV0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFRyYWZTdHJtTWV0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC50c2lkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnN0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0Lm1zbXRfaW50ZXJ2YWwsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQ0NYVHhtaXRQb3dlcjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUeG1pdFBvd2VyLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnBvd2VyX2xpbWl0LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFR4bWl0UG93ZXIucmVzZXJ2ZWQsIDEpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5udW1fV01NVFNQRUM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJXTU1UU1BFQ1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldNTVRTUEVDW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnRzaWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5wc2IpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpbmZvX3JzdmQgKDcpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnRzaW5mb19yc3ZkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImJ1cnN0X3NpemVfZGVmbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uYnVyc3Rfc2l6ZV9kZWZuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5maXhlZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0uc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5tZWRpdW1fdGltZSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJBaXJnbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJQcm9wU3VwcFJhdGVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQVBOYW1lOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5BUE5hbWUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX25hbWU6ICVkLlxuIiksIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uQVBOYW1lLm5hbWUsIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkhDRjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uSENGLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5IQ0YuZW5hYmxlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIldEUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uV0RTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV93ZHNEYXRhOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLldEUy53ZHNEYXRhLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJCUEluZGljYXRvcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLmluZGljYXRvciwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkxvYWRJbmZvOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8ubnVtX3N0YXMsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRJbmZvLmNoYW5uZWxfdXRpbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkxvYWRCYWxhbmNlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuYnNzaWQsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJQcm9wQXNzb2NUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnR5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJMTEF0dHI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxMQXR0ci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTExBdHRyLmRlZmVyX3RocmVzaG9sZCwgNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlByb3BDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENhcGFiaWxpdHkuY2FwYWJpbGl0eSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2hpcF9yZXYsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2FyZF90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9idWlsZF92ZXJzaW9uOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5WZXJzaW9uLmJ1aWxkX3ZlcnNpb24sIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJQcm9wRURDQVBhcmFtczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnFvcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJUaXRhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGl0YW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbmNhdF90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29tcHJlc3Npb25fdGNpZF9iaXRtYXAsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNiX3N0YXRlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5yZXZfZmNzX3N0YXRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUHJvcENoYW5uU3dpdGNoQW5uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5tb2RlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJpbWFyeV9jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4uc3ViX2JhbmQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5jaGFubmVsX3N3aXRjaF9jb3VudCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlByb3BRdWlldEJTUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfY291bnQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9wZXJpb2QsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X29mZnNldCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlRyaWdnZXJTdGFCZ1NjYW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4uZW5hYmxlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVGF1cnVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UYXVydXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVRJREJpdG1hcCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhUG9saWN5LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImJhQnVmZmVyU2l6ZSAoMTIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlRhdXJ1cy5iYUJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnN2ZCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLnJzdmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV3NjQXNzb2NSZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V3NjQXNzb2NSZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQXNzb2NSZXMuVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQXNzb2NSZXMuVmVyc2lvbi5taW5vcik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJtYWpvciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQXNzb2NSZXMuVmVyc2lvbi5tYWpvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlJlc3BvbnNlVHlwZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQXNzb2NSZXMuUmVzcG9uc2VUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NBc3NvY1Jlcy5SZXNwb25zZVR5cGUucmVzVHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlZlbmRvckV4dGVuc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQXNzb2NSZXMuVmVuZG9yRXh0ZW5zaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NBc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24udmVuZG9ySWQsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVmVyc2lvbjI6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NBc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibWlub3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY0Fzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5taW5vcik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibWFqb3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY0Fzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5tYWpvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQXV0aG9yaXplZE1BQ3M6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NBc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0Fzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5BdXRob3JpemVkTUFDcy5tYWMsIDYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlJlcXVlc3RUb0Vucm9sbDpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0Fzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5SZXF1ZXN0VG9FbnJvbGwucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0Fzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5SZXF1ZXN0VG9FbnJvbGwucmVxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJQMlBBc3NvY1JlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBBc3NvY1Jlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJQMlBTdGF0dXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEFzc29jUmVzLlAyUFN0YXR1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQXNzb2NSZXMuUDJQU3RhdHVzLnN0YXR1cywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkV4dGVuZGVkTGlzdGVuVGltaW5nOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBBc3NvY1Jlcy5FeHRlbmRlZExpc3RlblRpbWluZy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQXNzb2NSZXMuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcuYXZhaWxpYmlsaXR5UGVyaW9kLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBBc3NvY1Jlcy5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlJbnRlcnZhbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrQXNzb2NSZXNwb25zZS4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19BdXRoZW50aWNhdGlvbltdID0geworICAgICAgICB7ICJBdXRoQWxnbyIsIG9mZnNldG9mKHREb3QxMWZBdXRoZW50aWNhdGlvbiwgQXV0aEFsZ28pLCBTaWdGZkF1dGhBbGdvICwgRE9UMTFGX0ZGX0FVVEhBTEdPX0xFTiwgfSwKKyAgICAgICAgeyAiQXV0aFNlcU5vIiwgb2Zmc2V0b2YodERvdDExZkF1dGhlbnRpY2F0aW9uLCBBdXRoU2VxTm8pLCBTaWdGZkF1dGhTZXFObyAsIERPVDExRl9GRl9BVVRIU0VRTk9fTEVOLCB9LAorICAgICAgICB7ICJTdGF0dXMiLCBvZmZzZXRvZih0RG90MTFmQXV0aGVudGljYXRpb24sIFN0YXR1cyksIFNpZ0ZmU3RhdHVzICwgRE9UMTFGX0ZGX1NUQVRVU19MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19BdXRoZW50aWNhdGlvbltdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZkF1dGhlbnRpY2F0aW9uLCBDaGFsbGVuZ2VUZXh0KSwgb2Zmc2V0b2YodERvdDExZklFQ2hhbGxlbmdlVGV4dCwgcHJlc2VudCksIDAsICJDaGFsbGVuZ2VUZXh0IiAsIDAsIDMsIDI1NSwgU2lnSWVDaGFsbGVuZ2VUZXh0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQ0hBTExFTkdFVEVYVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBdXRoZW50aWNhdGlvbiwgUlNOT3BhcXVlKSwgb2Zmc2V0b2YodERvdDExZklFUlNOT3BhcXVlLCBwcmVzZW50KSwgMCwgIlJTTk9wYXF1ZSIgLCAwLCA4LCAyNTUsIFNpZ0llUlNOT3BhcXVlLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUlNOT1BBUVVFLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkF1dGhlbnRpY2F0aW9uLCBNb2JpbGl0eURvbWFpbiksIG9mZnNldG9mKHREb3QxMWZJRU1vYmlsaXR5RG9tYWluLCBwcmVzZW50KSwgMCwgIk1vYmlsaXR5RG9tYWluIiAsIDAsIDUsIDUsIFNpZ0llTW9iaWxpdHlEb21haW4sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9NT0JJTElUWURPTUFJTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBdXRoZW50aWNhdGlvbiwgRlRJbmZvKSwgb2Zmc2V0b2YodERvdDExZklFRlRJbmZvLCBwcmVzZW50KSwgMCwgIkZUSW5mbyIgLCAwLCA4NCwgMTg3LCBTaWdJZUZUSW5mbywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0ZUSU5GTywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZBdXRoZW50aWNhdGlvbiwgRlRUaW1lb3V0SW50ZXJ2YWwpLCBvZmZzZXRvZih0RG90MTFmSUVGVFRpbWVvdXRJbnRlcnZhbCwgcHJlc2VudCksIDAsICJGVFRpbWVvdXRJbnRlcnZhbCIgLCAwLCA3LCA3LCBTaWdJZUZUVGltZW91dEludGVydmFsLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRlRUSU1FT1VUSU5URVJWQUwsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQXV0aGVudGljYXRpb24sIFJJQ0RhdGFEZXNjKSwgb2Zmc2V0b2YodERvdDExZklFUklDRGF0YURlc2MsIHByZXNlbnQpLCBvZmZzZXRvZih0RG90MTFmQXV0aGVudGljYXRpb24sIG51bV9SSUNEYXRhRGVzYyksICJSSUNEYXRhRGVzYyIgLCAyLCAyLCA1NTAsIFNpZ0llUklDRGF0YURlc2MsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SSUNEQVRBREVTQywgMCwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tBdXRoZW50aWNhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQXV0aGVudGljYXRpb24gKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19BdXRoZW50aWNhdGlvbiwgSUVTX0F1dGhlbnRpY2F0aW9uLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJVbnBhY2tlZCB0aGUgQXV0aGVudGljYXRpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiQXV0aEFsZ286XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5BdXRoQWxnby5hbGdvLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiQXV0aFNlcU5vOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+QXV0aFNlcU5vLm5vLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiU3RhdHVzOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+U3RhdHVzLnN0YXR1cywgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIkNoYWxsZW5nZVRleHQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q2hhbGxlbmdlVGV4dC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5DaGFsbGVuZ2VUZXh0Lm51bV90ZXh0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSBwRnJtLT5DaGFsbGVuZ2VUZXh0LnRleHQsIHBGcm0tPkNoYWxsZW5nZVRleHQubnVtX3RleHQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIlJTTk9wYXF1ZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SU05PcGFxdWUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJudW1fZGF0YTogJWQuXG4iKSwgcEZybS0+UlNOT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSBwRnJtLT5SU05PcGFxdWUuZGF0YSwgcEZybS0+UlNOT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJNb2JpbGl0eURvbWFpbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5Nb2JpbGl0eURvbWFpbi5NRElELCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIm92ZXJEU0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ub3ZlckRTQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInJlc291cmNlUmVxQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNvdXJjZVJlcUNhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIkZUSW5mbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5GVEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJyZXNlcnZlZCAoOCk6ICVkXG4iKSwgcEZybS0+RlRJbmZvLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIklFQ291bnQgKDgpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5JRUNvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uTUlDLCAxNik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLkFub25jZSwgMzIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5Tbm9uY2UsIDMyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIlIxS0hfSUQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5SMUtIX0lELnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5SMUtIX0lELlBNS19SMV9JRCwgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJHVEs6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5HVEsucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJrZXlJZCAoMik6ICVkXG4iKSwgcEZybS0+RlRJbmZvLkdUSy5rZXlJZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgicmVzZXJ2ZWQgKDE0KTogJWRcbiIpLCBwRnJtLT5GVEluZm8uR1RLLnJlc2VydmVkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLkdUSy5rZXlMZW5ndGgsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uR1RLLlJTQywgOCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgibnVtX2tleTogJWQuXG4iKSwgcEZybS0+RlRJbmZvLkdUSy5udW1fa2V5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkgcEZybS0+RlRJbmZvLkdUSy5rZXksIHBGcm0tPkZUSW5mby5HVEsubnVtX2tleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJSMEtIX0lEOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5GVEluZm8uUjBLSF9JRC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIm51bV9QTUtfUjBfSUQ6ICVkLlxuIiksIHBGcm0tPkZUSW5mby5SMEtIX0lELm51bV9QTUtfUjBfSUQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSBwRnJtLT5GVEluZm8uUjBLSF9JRC5QTUtfUjBfSUQsIHBGcm0tPkZUSW5mby5SMEtIX0lELm51bV9QTUtfUjBfSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIkZUVGltZW91dEludGVydmFsOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkZUVGltZW91dEludGVydmFsLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUVGltZW91dEludGVydmFsLnRpbWVvdXRUeXBlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5GVFRpbWVvdXRJbnRlcnZhbC50aW1lb3V0VmFsdWUsIDQpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5udW1fUklDRGF0YURlc2M7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiUklDRGF0YURlc2NbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIlJJQ0RhdGE6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEYXRhLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEuSWRlbnRpZmllciwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEYXRhLnJlc291cmNlRGVzY0NvdW50LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEuc3RhdHVzQ29kZSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIlJJQ0Rlc2NyaXB0b3I6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IucmVzb3VyY2VUeXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgibnVtX3ZhcmlhYmxlRGF0YTogJWQuXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5udW1fdmFyaWFibGVEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IudmFyaWFibGVEYXRhLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLm51bV92YXJpYWJsZURhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJUU1BFQzpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5wc2IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgic2NoZWR1bGUgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnNjaGVkdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgidW51c2VkICg3KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy51bnVzZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5maXhlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+UklDRGF0YURlc2NbaV0ubnVtX1RDTEFTOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJUQ0xBU1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0ucHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0udXNlcl9wcmlvcml0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uY2xhc3NpZmllcl90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5jbGFzc2lmaWVyX21hc2ssIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLmRlc3QsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5FdGhQYXJhbXMudHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJUQ0xBU1NQUk9DOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNTUFJPQy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1NQUk9DLnByb2Nlc3NpbmcsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJUU0RlbGF5OlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVFNEZWxheS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU0RlbGF5LmRlbGF5LCA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiU2NoZWR1bGU6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInJlc2VydmVkICg5KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5yZXNlcnZlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuc2VydmljZV9pbnRlcnZhbCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5tYXhfc2VydmljZV9kdXIsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuc3BlY19pbnRlcnZhbCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIldNTVRTUEVDOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHNpZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMucHNiKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInRzaW5mb19hY2tfcG9sICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50c2luZm9fYWNrX3BvbCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInRzaW5mb19yc3ZkICg3KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50c2luZm9fcnN2ZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoImJ1cnN0X3NpemVfZGVmbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYnVyc3Rfc2l6ZV9kZWZuKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgic2l6ZSAoMTUpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnNpemUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuZml4ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5taW5fc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnN1c3BlbnNpb25faW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1lYW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuZGVsYXlfYm91bmQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1lZGl1bV90aW1lLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPlJJQ0RhdGFEZXNjW2ldLm51bV9XTU1UQ0xBUzsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiV01NVENMQVNbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLnByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLnVzZXJfcHJpb3JpdHksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uY2xhc3NpZmllcl9tYXNrLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uY2xhc3NpZmllcl90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnR5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc291cmNlLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmZsb3dfbGFiZWwsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiV01NVENMQVNQUk9DOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNQUk9DLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTUFJPQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTUFJPQy5wcm9jZXNzaW5nLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiV01NVFNEZWxheTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTRGVsYXkucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNEZWxheS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTRGVsYXkuZGVsYXksIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJXTU1TY2hlZHVsZTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJyZXNlcnZlZCAoOSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUucmVzZXJ2ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnNlcnZpY2VfaW50ZXJ2YWwsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUubWF4X3NlcnZpY2VfZHVyLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnNwZWNfaW50ZXJ2YWwsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tBdXRoZW50aWNhdGlvbi4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19CZWFjb25bXSA9IHsKKyAgICAgICAgeyAiVGltZVN0YW1wIiwgb2Zmc2V0b2YodERvdDExZkJlYWNvbiwgVGltZVN0YW1wKSwgU2lnRmZUaW1lU3RhbXAgLCBET1QxMUZfRkZfVElNRVNUQU1QX0xFTiwgfSwKKyAgICAgICAgeyAiQmVhY29uSW50ZXJ2YWwiLCBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBCZWFjb25JbnRlcnZhbCksIFNpZ0ZmQmVhY29uSW50ZXJ2YWwgLCBET1QxMUZfRkZfQkVBQ09OSU5URVJWQUxfTEVOLCB9LAorICAgICAgICB7ICJDYXBhYmlsaXRpZXMiLCBvZmZzZXRvZih0RG90MTFmQmVhY29uLCBDYXBhYmlsaXRpZXMpLCBTaWdGZkNhcGFiaWxpdGllcyAsIERPVDExRl9GRl9DQVBBQklMSVRJRVNfTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfQmVhY29uW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBTU0lEKSwgb2Zmc2V0b2YodERvdDExZklFU1NJRCwgcHJlc2VudCksIDAsICJTU0lEIiAsIDAsIDIsIDM0LCBTaWdJZVNTSUQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TU0lELCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgU3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFU3VwcFJhdGVzLCBwcmVzZW50KSwgMCwgIlN1cHBSYXRlcyIgLCAwLCAyLCAxNCwgU2lnSWVTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TVVBQUkFURVMsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBGSFBhcmFtU2V0KSwgb2Zmc2V0b2YodERvdDExZklFRkhQYXJhbVNldCwgcHJlc2VudCksIDAsICJGSFBhcmFtU2V0IiAsIDAsIDcsIDcsIFNpZ0llRkhQYXJhbVNldCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0ZIUEFSQU1TRVQsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBEU1BhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRURTUGFyYW1zLCBwcmVzZW50KSwgMCwgIkRTUGFyYW1zIiAsIDAsIDMsIDMsIFNpZ0llRFNQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9EU1BBUkFNUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIENGUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFQ0ZQYXJhbXMsIHByZXNlbnQpLCAwLCAiQ0ZQYXJhbXMiICwgMCwgOCwgOCwgU2lnSWVDRlBhcmFtcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0NGUEFSQU1TLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgSUJTU1BhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRUlCU1NQYXJhbXMsIHByZXNlbnQpLCAwLCAiSUJTU1BhcmFtcyIgLCAwLCA0LCA0LCBTaWdJZUlCU1NQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9JQlNTUEFSQU1TLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgVElNKSwgb2Zmc2V0b2YodERvdDExZklFVElNLCBwcmVzZW50KSwgMCwgIlRJTSIgLCAwLCA2LCAyNTYsIFNpZ0llVElNLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVElNLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgQ291bnRyeSksIG9mZnNldG9mKHREb3QxMWZJRUNvdW50cnksIHByZXNlbnQpLCAwLCAiQ291bnRyeSIgLCAwLCA1LCAyNTcsIFNpZ0llQ291bnRyeSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0NPVU5UUlksIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBGSFBhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRUZIUGFyYW1zLCBwcmVzZW50KSwgMCwgIkZIUGFyYW1zIiAsIDAsIDQsIDQsIFNpZ0llRkhQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9GSFBBUkFNUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIEZIUGF0dFRhYmxlKSwgb2Zmc2V0b2YodERvdDExZklFRkhQYXR0VGFibGUsIHByZXNlbnQpLCAwLCAiRkhQYXR0VGFibGUiICwgMCwgNiwgMjU3LCBTaWdJZUZIUGF0dFRhYmxlLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRkhQQVRUVEFCTEUsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBQb3dlckNvbnN0cmFpbnRzKSwgb2Zmc2V0b2YodERvdDExZklFUG93ZXJDb25zdHJhaW50cywgcHJlc2VudCksIDAsICJQb3dlckNvbnN0cmFpbnRzIiAsIDAsIDMsIDMsIFNpZ0llUG93ZXJDb25zdHJhaW50cywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1BPV0VSQ09OU1RSQUlOVFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBDaGFuU3dpdGNoQW5uKSwgb2Zmc2V0b2YodERvdDExZklFQ2hhblN3aXRjaEFubiwgcHJlc2VudCksIDAsICJDaGFuU3dpdGNoQW5uIiAsIDAsIDUsIDUsIFNpZ0llQ2hhblN3aXRjaEFubiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0NIQU5TV0lUQ0hBTk4sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBRdWlldCksIG9mZnNldG9mKHREb3QxMWZJRVF1aWV0LCBwcmVzZW50KSwgMCwgIlF1aWV0IiAsIDAsIDgsIDgsIFNpZ0llUXVpZXQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9RVUlFVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIFRQQ1JlcG9ydCksIG9mZnNldG9mKHREb3QxMWZJRVRQQ1JlcG9ydCwgcHJlc2VudCksIDAsICJUUENSZXBvcnQiICwgMCwgNCwgNCwgU2lnSWVUUENSZXBvcnQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9UUENSRVBPUlQsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBFUlBJbmZvKSwgb2Zmc2V0b2YodERvdDExZklFRVJQSW5mbywgcHJlc2VudCksIDAsICJFUlBJbmZvIiAsIDAsIDMsIDMsIFNpZ0llRVJQSW5mbywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0VSUElORk8sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBFeHRTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiAsIDAsIDMsIDE0LCBTaWdJZUV4dFN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIFJTTiksIG9mZnNldG9mKHREb3QxMWZJRVJTTiwgcHJlc2VudCksIDAsICJSU04iICwgMCwgOCwgMTEyLCBTaWdJZVJTTiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JTTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIFFCU1NMb2FkKSwgb2Zmc2V0b2YodERvdDExZklFUUJTU0xvYWQsIHByZXNlbnQpLCAwLCAiUUJTU0xvYWQiICwgMCwgNywgNywgU2lnSWVRQlNTTG9hZCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1FCU1NMT0FELCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgRURDQVBhcmFtU2V0KSwgb2Zmc2V0b2YodERvdDExZklFRURDQVBhcmFtU2V0LCBwcmVzZW50KSwgMCwgIkVEQ0FQYXJhbVNldCIgLCAwLCAyMCwgMjAsIFNpZ0llRURDQVBhcmFtU2V0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRURDQVBBUkFNU0VULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgUU9TQ2Fwc0FwKSwgb2Zmc2V0b2YodERvdDExZklFUU9TQ2Fwc0FwLCBwcmVzZW50KSwgMCwgIlFPU0NhcHNBcCIgLCAwLCAzLCAzLCBTaWdJZVFPU0NhcHNBcCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1FPU0NBUFNBUCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIEFQQ2hhbm5lbFJlcG9ydCksIG9mZnNldG9mKHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCwgcHJlc2VudCksIDAsICJBUENoYW5uZWxSZXBvcnQiICwgMCwgMywgNTMsIFNpZ0llQVBDaGFubmVsUmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQVBDSEFOTkVMUkVQT1JULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgUlJNRW5hYmxlZENhcCksIG9mZnNldG9mKHREb3QxMWZJRVJSTUVuYWJsZWRDYXAsIHByZXNlbnQpLCAwLCAiUlJNRW5hYmxlZENhcCIgLCAwLCA3LCA3LCBTaWdJZVJSTUVuYWJsZWRDYXAsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SUk1FTkFCTEVEQ0FQLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgTW9iaWxpdHlEb21haW4pLCBvZmZzZXRvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbiwgcHJlc2VudCksIDAsICJNb2JpbGl0eURvbWFpbiIgLCAwLCA1LCA1LCBTaWdJZU1vYmlsaXR5RG9tYWluLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfTU9CSUxJVFlET01BSU4sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBXUEEpLCBvZmZzZXRvZih0RG90MTFmSUVXUEEsIHByZXNlbnQpLCAwLCAiV1BBIiAsIDAsIDgsIDUwLCBTaWdJZVdQQSwgezAsIDgwLCAyNDIsIDEsIDB9LCA0LCBET1QxMUZfRUlEX1dQQSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIEhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRUhUQ2FwcywgcHJlc2VudCksIDAsICJIVENhcHMiICwgMCwgMjgsIDYwLCBTaWdJZUhUQ2FwcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0hUQ0FQUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIEhUSW5mbyksIG9mZnNldG9mKHREb3QxMWZJRUhUSW5mbywgcHJlc2VudCksIDAsICJIVEluZm8iICwgMCwgMjQsIDU2LCBTaWdJZUhUSW5mbywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0hUSU5GTywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIEV4dENoYW5Td2l0Y2hBbm4pLCBvZmZzZXRvZih0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uLCBwcmVzZW50KSwgMCwgIkV4dENoYW5Td2l0Y2hBbm4iICwgMCwgMywgMywgU2lnSWVFeHRDaGFuU3dpdGNoQW5uLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRVhUQ0hBTlNXSVRDSEFOTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIFdNTUluZm9BcCksIG9mZnNldG9mKHREb3QxMWZJRVdNTUluZm9BcCwgcHJlc2VudCksIDAsICJXTU1JbmZvQXAiICwgMCwgOSwgOSwgU2lnSWVXTU1JbmZvQXAsIHswLCA4MCwgMjQyLCAyLCAwfSwgNSwgRE9UMTFGX0VJRF9XTU1JTkZPQVAsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBXTU1QYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1QYXJhbXMsIHByZXNlbnQpLCAwLCAiV01NUGFyYW1zIiAsIDAsIDI2LCAyNiwgU2lnSWVXTU1QYXJhbXMsIHswLCA4MCwgMjQyLCAyLCAxfSwgNSwgRE9UMTFGX0VJRF9XTU1QQVJBTVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBXTU1DYXBzKSwgb2Zmc2V0b2YodERvdDExZklFV01NQ2FwcywgcHJlc2VudCksIDAsICJXTU1DYXBzIiAsIDAsIDksIDksIFNpZ0llV01NQ2FwcywgezAsIDgwLCAyNDIsIDIsIDV9LCA1LCBET1QxMUZfRUlEX1dNTUNBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBXQVBJKSwgb2Zmc2V0b2YodERvdDExZklFV0FQSSwgcHJlc2VudCksIDAsICJXQVBJIiAsIDAsIDE0LCAxMTIsIFNpZ0llV0FQSSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1dBUEksIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBDQ1hSYWRNZ210Q2FwKSwgb2Zmc2V0b2YodERvdDExZklFQ0NYUmFkTWdtdENhcCwgcHJlc2VudCksIDAsICJDQ1hSYWRNZ210Q2FwIiAsIDAsIDgsIDgsIFNpZ0llQ0NYUmFkTWdtdENhcCwgezAsIDY0LCAxNTAsIDEsIDB9LCA0LCBET1QxMUZfRUlEX0NDWFJBRE1HTVRDQVAsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uLCBDQ1hUcmFmU3RybU1ldCksIG9mZnNldG9mKHREb3QxMWZJRUNDWFRyYWZTdHJtTWV0LCBwcmVzZW50KSwgMCwgIkNDWFRyYWZTdHJtTWV0IiAsIDAsIDEwLCAxMCwgU2lnSWVDQ1hUcmFmU3RybU1ldCwgezAsIDY0LCAxNTAsIDcsIDB9LCA0LCBET1QxMUZfRUlEX0NDWFRSQUZTVFJNTUVULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgQ0NYVHhtaXRQb3dlciksIG9mZnNldG9mKHREb3QxMWZJRUNDWFR4bWl0UG93ZXIsIHByZXNlbnQpLCAwLCAiQ0NYVHhtaXRQb3dlciIgLCAwLCA4LCA4LCBTaWdJZUNDWFR4bWl0UG93ZXIsIHswLCA2NCwgMTUwLCAwLCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hUWE1JVFBPV0VSLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgQWlyZ28pLCBvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgcHJlc2VudCksIDAsICJBaXJnbyIgLCAwLCA1LCAyMzIsIFNpZ0llQWlyZ28sIHswLCAxMCwgMjQ1LCAwLCAwfSwgMywgRE9UMTFGX0VJRF9BSVJHTywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24sIFdzY0JlYWNvbiksIG9mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvbiwgcHJlc2VudCksIDAsICJXc2NCZWFjb24iICwgMCwgNiwgODQsIFNpZ0llV3NjQmVhY29uLCB7MCwgODAsIDI0MiwgNCwgMH0sIDQsIERPVDExRl9FSURfV1NDQkVBQ09OLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbiwgUDJQQmVhY29uKSwgb2Zmc2V0b2YodERvdDExZklFUDJQQmVhY29uLCBwcmVzZW50KSwgMCwgIlAyUEJlYWNvbiIgLCAwLCA2LCA2MSwgU2lnSWVQMlBCZWFjb24sIHs4MCwgMTExLCAxNTQsIDksIDB9LCA0LCBET1QxMUZfRUlEX1AyUEJFQUNPTiwgMCwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tCZWFjb24odHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkJlYWNvbiAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX0JlYWNvbiwgSUVTX0JlYWNvbiwgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlVucGFja2VkIHRoZSBCZWFjb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiVGltZVN0YW1wOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRpbWVTdGFtcC50aW1lc3RhbXAsIDgpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQmVhY29uSW50ZXJ2YWw6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QmVhY29uSW50ZXJ2YWwuaW50ZXJ2YWwsIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQ2FwYWJpbGl0aWVzOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZXNzICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZXNzKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImlic3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5pYnNzKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImNmUG9sbGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jZlBvbGxhYmxlKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImNmUG9sbFJlcSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNmUG9sbFJlcSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJwcml2YWN5ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucHJpdmFjeSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJzaG9ydFByZWFtYmxlICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc2hvcnRQcmVhbWJsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJwYmNjICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucGJjYyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJjaGFubmVsQWdpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNoYW5uZWxBZ2lsaXR5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInNwZWN0cnVtTWd0ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc3BlY3RydW1NZ3QpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicW9zICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucW9zKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInNob3J0U2xvdFRpbWUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zaG9ydFNsb3RUaW1lKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5hcHNkKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJybSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnJybSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJkc3NzT2ZkbSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmRzc3NPZmRtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImRlbGF5ZWRCQSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmRlbGF5ZWRCQSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJpbW1lZGlhdGVCQSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmltbWVkaWF0ZUJBKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlNTSUQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U1NJRC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5TU0lELnNzaWQsIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5TdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJGSFBhcmFtU2V0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkZIUGFyYW1TZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtU2V0LmR3ZWxsX3RpbWUsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtU2V0LmhvcF9zZXQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtU2V0LmhvcF9wYXR0ZXJuLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXJhbVNldC5ob3BfaW5kZXgsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJEU1BhcmFtczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5EU1BhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRTUGFyYW1zLmN1cnJfY2hhbm5lbCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkNGUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNGUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q0ZQYXJhbXMuY2ZwX2NvdW50LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q0ZQYXJhbXMuY2ZwX3BlcmlvZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNGUGFyYW1zLmNmcF9tYXhkdXJhdGlvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNGUGFyYW1zLmNmcF9kdXJyZW1haW5pbmcsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJJQlNTUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPklCU1NQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5JQlNTUGFyYW1zLmF0aW0sIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJUSU06XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VElNLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+VElNLmR0aW1fY291bnQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5USU0uZHRpbV9wZXJpb2QsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5USU0uYm1wY3RsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fdmJtcDogJWQuXG4iKSwgcEZybS0+VElNLm51bV92Ym1wKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+VElNLnZibXAsIHBGcm0tPlRJTS5udW1fdmJtcCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkNvdW50cnk6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q291bnRyeS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNvdW50cnkuY291bnRyeSwgMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibnVtX3RyaXBsZXRzOiAlZC5cbiIpLCBwRnJtLT5Db3VudHJ5Lm51bV90cmlwbGV0cyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPkNvdW50cnkudHJpcGxldHMsIDMgKiBwRnJtLT5Db3VudHJ5Lm51bV90cmlwbGV0cyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkZIUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkZIUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXJhbXMucmFkaXgsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtcy5uY2hhbm5lbHMsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJGSFBhdHRUYWJsZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5GSFBhdHRUYWJsZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGF0dFRhYmxlLmZsYWcsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhdHRUYWJsZS5uc2V0cywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGF0dFRhYmxlLm1vZHVsdXMsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhdHRUYWJsZS5vZmZzZXQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm51bV9yYW5kdGFibGU6ICVkLlxuIiksIHBGcm0tPkZIUGF0dFRhYmxlLm51bV9yYW5kdGFibGUpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5GSFBhdHRUYWJsZS5yYW5kdGFibGUsIHBGcm0tPkZIUGF0dFRhYmxlLm51bV9yYW5kdGFibGUpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJQb3dlckNvbnN0cmFpbnRzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlBvd2VyQ29uc3RyYWludHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5Qb3dlckNvbnN0cmFpbnRzLmxvY2FsUG93ZXJDb25zdHJhaW50cywgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkNoYW5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q2hhblN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4uc3dpdGNoTW9kZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4ubmV3Q2hhbm5lbCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4uc3dpdGNoQ291bnQsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJRdWlldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5RdWlldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0LmNvdW50LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UXVpZXQucGVyaW9kLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UXVpZXQuZHVyYXRpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5RdWlldC5vZmZzZXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJUUENSZXBvcnQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VFBDUmVwb3J0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LnR4X3Bvd2VyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LmxpbmtfbWFyZ2luLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiRVJQSW5mbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FUlBJbmZvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJub25fZXJwX3ByZXNlbnQgKDEpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8ubm9uX2VycF9wcmVzZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1c2VfcHJvdCAoMSk6ICVkXG4iKSwgcEZybS0+RVJQSW5mby51c2VfcHJvdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYmFya2VyX3ByZWFtYmxlICgxKTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLmJhcmtlcl9wcmVhbWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW51c2VkICg1KTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLnVudXNlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkV4dFN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FeHRTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPkV4dFN1cHBSYXRlcy5yYXRlcywgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlJTTjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SU04ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5SU04udmVyc2lvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi5ncF9jaXBoZXJfc3VpdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+UlNOLnB3aXNlX2NpcGhlcl9zdWl0ZXMsIDQgKiBwRnJtLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLmFrbV9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTi5ha21fc3VpdGVzLCA0ICogcEZybS0+UlNOLmFrbV9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicHJlYXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+UlNOLnByZWF1dGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm5vX3B3aXNlICgxKTogJWRcbiIpLCBwRnJtLT5SU04ubm9fcHdpc2UpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlBUS1NBX3JlcGxheV9jb3VudGVyICgyKTogJWRcbiIpLCBwRnJtLT5SU04uUFRLU0FfcmVwbGF5X2NvdW50ZXIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkdUS1NBX3JlcGxheV9jb3VudGVyICgyKTogJWRcbiIpLCBwRnJtLT5SU04uR1RLU0FfcmVwbGF5X2NvdW50ZXIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJlc2VydmVkICgxMCk6ICVkXG4iKSwgcEZybS0+UlNOLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLnBta2lkX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+UlNOLnBta2lkLCAxNiAqIHBGcm0tPlJTTi5wbWtpZF9jb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlFCU1NMb2FkOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlFCU1NMb2FkLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UUJTU0xvYWQuc3RhY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5RQlNTTG9hZC5jaGF1dGlsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UUJTU0xvYWQuYXZhaWwsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJFRENBUGFyYW1TZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RURDQVBhcmFtU2V0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LnFvcywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmVfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JlX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JlX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNia19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmtfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmtfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1bnVzZWQzICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2aV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2aV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdm9fYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZvX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZvX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiUU9TQ2Fwc0FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlFPU0NhcHNBcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNBcC5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidHhvcHJlcSAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc0FwLnR4b3ByZXEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInFyZXEgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNBcC5xcmVxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJxYWNrICgxKTogJWRcbiIpLCBwRnJtLT5RT1NDYXBzQXAucWFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiY291bnQgKDQpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNBcC5jb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkFQQ2hhbm5lbFJlcG9ydDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5BUENoYW5uZWxSZXBvcnQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BUENoYW5uZWxSZXBvcnQucmVndWxhdG9yeUNsYXNzLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fY2hhbm5lbExpc3Q6ICVkLlxuIiksIHBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5BUENoYW5uZWxSZXBvcnQuY2hhbm5lbExpc3QsIHBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJSUk1FbmFibGVkQ2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJSTUVuYWJsZWRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkxpbmtNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MaW5rTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5laWdoYm9yUnB0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5laWdoYm9yUnB0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJwYXJhbGxlbCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5wYXJhbGxlbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVwZWF0ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVwZWF0ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkJlYWNvblBhc3NpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUGFzc2l2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQmVhY29uQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvbkFjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQmVhY29uVGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uVGFibGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkJlYWNvblJlcENvbmQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUmVwQ29uZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiRnJhbWVNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5GcmFtZU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJDaGFubmVsTG9hZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5DaGFubmVsTG9hZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm9pc2VIaXN0b2dyYW0gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTm9pc2VIaXN0b2dyYW0pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInN0YXRpc3RpY3MgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuc3RhdGlzdGljcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTENJTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkxDSUF6aW11dGggKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJQXppbXV0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiVENNQ2FwYWJpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5UQ01DYXBhYmlsaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ0cmlnZ2VyZWRUQ00gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAudHJpZ2dlcmVkVENNKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJBUENoYW5SZXBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQVBDaGFuUmVwb3J0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJSUk1NSUJFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJSTU1JQkVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm9wZXJhdGluZ0NoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAub3BlcmF0aW5nQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibm9uT3BlcmF0aW5DaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLm5vbk9wZXJhdGluQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90RW5hYmxlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90RW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTmVpZ2hib3JUU0ZPZmZzZXQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JUU0ZPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlJDUElNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SQ1BJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlJTTklNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SU05JTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkJzc0F2Z0FjY2Vzc0RlbGF5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJzc0F2Z0FjY2Vzc0RlbGF5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJCU1NBdmFpbEFkbWlzc2lvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CU1NBdmFpbEFkbWlzc2lvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQW50ZW5uYUluZm9ybWF0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkFudGVubmFJbmZvcm1hdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJNb2JpbGl0eURvbWFpbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1vYmlsaXR5RG9tYWluLk1ESUQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm92ZXJEU0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ub3ZlckRTQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNvdXJjZVJlcUNhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ucmVzb3VyY2VSZXFDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIldQQTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XUEEucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XUEEudmVyc2lvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5tdWx0aWNhc3RfY2lwaGVyLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVycywgNCAqIHBGcm0tPldQQS51bmljYXN0X2NpcGhlcl9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5hdXRoX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+V1BBLmF1dGhfc3VpdGVzLCA0ICogcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XUEEuY2FwcywgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkhUQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5IVENhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFkdkNvZGluZ0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFkdkNvZGluZ0NhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgic3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtaW1vUG93ZXJTYXZlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWltb1Bvd2VyU2F2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZ3JlZW5GaWVsZCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmdyZWVuRmllbGQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInNob3J0R0kyME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnNob3J0R0kyME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgic2hvcnRHSTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ0eFNUQkMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFNUQkMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJ4U1RCQyAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZGVsYXllZEJBKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtYXhpbWFsQU1TRFVzaXplICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4aW1hbEFNU0RVc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZHNzc0Nja01vZGU0ME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmRzc3NDY2tNb2RlNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInBzbXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wc21wKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJzdGJjQ29udHJvbEZyYW1lICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc3RiY0NvbnRyb2xGcmFtZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubHNpZ1RYT1BQcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtYXhSeEFNUERVRmFjdG9yICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4UnhBTVBEVUZhY3Rvcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibXBkdURlbnNpdHkgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tcGR1RGVuc2l0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQxICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+SFRDYXBzLnN1cHBvcnRlZE1DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInBjbyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBjbyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidHJhbnNpdGlvblRpbWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50cmFuc2l0aW9uVGltZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQyICg1KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtY3NGZWVkYmFjayAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1jc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZDMgKDYpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyeFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidHhTdGFnZ2VyZWRTb3VuZGluZyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U3RhZ2dlcmVkU291bmRpbmcpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJ4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInR4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImltcGxpY2l0VHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmltcGxpY2l0VHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiY2FsaWJyYXRpb24gKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jYWxpYnJhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZXhwbGljaXRDU0lUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZXhwbGljaXRCRkNTSUZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRCRkNTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJjc2lOdW1CRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY3NpTnVtQkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJjb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQ0ICg3KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhbnRlbm5hU2VsZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYVNlbGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFja1R4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lGZWVkYmFja1R4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImV4cGxpY2l0Q1NJRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYUluZGljZXNGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicnhBUyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4QVMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInR4U291bmRpbmdQUERVcyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U291bmRpbmdQUERVcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQ1ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ1KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+SFRDYXBzLnJzdmQsIHBGcm0tPkhUQ2Fwcy5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkhUSW5mbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5IVEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5IVEluZm8ucHJpbWFyeUNoYW5uZWwsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInNlY29uZGFyeUNoYW5uZWxPZmZzZXQgKDIpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZWNvbW1lbmRlZFR4V2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJpZnNNb2RlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmlmc01vZGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImNvbnRyb2xsZWRBY2Nlc3NPbmx5ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uY29udHJvbGxlZEFjY2Vzc09ubHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2VydmljZUludGVydmFsR3JhbnVsYXJpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm9wTW9kZSAoMik6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm9wTW9kZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibm9uR0ZEZXZpY2VzUHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm5vbkdGRGV2aWNlc1ByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInRyYW5zbWl0QnVyc3RMaW1pdCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnRyYW5zbWl0QnVyc3RMaW1pdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgib2Jzc05vbkhUU3RhUHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm9ic3NOb25IVFN0YVByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJlc2VydmVkICgxMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJiYXNpY1NUQkNNQ1MgKDcpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5iYXNpY1NUQkNNQ1MpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImR1YWxDVFNQcm90ZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uZHVhbENUU1Byb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInNlY29uZGFyeUJlYWNvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUJlYWNvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicGNvQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucGNvQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJwY29QaGFzZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnBjb1BoYXNlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZDIgKDQpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5IVEluZm8uYmFzaWNNQ1NTZXQsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRJbmZvLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+SFRJbmZvLnJzdmQsIHBGcm0tPkhUSW5mby5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkV4dENoYW5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RXh0Q2hhblN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkV4dENoYW5Td2l0Y2hBbm4uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIldNTUluZm9BcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1JbmZvQXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1JbmZvQXAudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicGFyYW1fc2V0X2NvdW50ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvQXAucGFyYW1fc2V0X2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZCAoMyk6ICVkXG4iKSwgcEZybS0+V01NSW5mb0FwLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NSW5mb0FwLnVhcHNkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiV01NUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTVBhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLnFvc0luZm8sIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucmVzZXJ2ZWQyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmVfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMudW51c2VkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZpX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdm9fYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJXTU1DYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTUNhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1DYXBzLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJlc2VydmVkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJxYWNrICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnFhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInF1ZXVlX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucXVldWVfcmVxdWVzdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidHhvcF9yZXF1ZXN0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnR4b3BfcmVxdWVzdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibW9yZV9hY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMubW9yZV9hY2spOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJXQVBJOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldBUEkucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLnZlcnNpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLmFrbV9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUEkuYWttX3N1aXRlcywgNCAqIHBGcm0tPldBUEkuYWttX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUEkudW5pY2FzdF9jaXBoZXJfc3VpdGVzLCA0ICogcEZybS0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkubXVsdGljYXN0X2NpcGhlcl9zdWl0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicHJlYXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+V0FQSS5wcmVhdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZCAoMTUpOiAlZFxuIiksIHBGcm0tPldBUEkucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLmJraWRfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5XQVBJLmJraWQsIDE2ICogcEZybS0+V0FQSS5ia2lkX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQ0NYUmFkTWdtdENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hSYWRNZ210Q2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYUmFkTWdtdENhcC5tZ210X3N0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtYnNzaWRfbWFzayAoMyk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5tYnNzaWRfbWFzayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQgKDUpOiAlZFxuIiksIHBGcm0tPkNDWFJhZE1nbXRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJDQ1hUcmFmU3RybU1ldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUcmFmU3RybU1ldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnRzaWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC5zdGF0ZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0Lm1zbXRfaW50ZXJ2YWwsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJDQ1hUeG1pdFBvd2VyOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFR4bWl0UG93ZXIucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnBvd2VyX2xpbWl0LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHhtaXRQb3dlci5yZXNlcnZlZCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkFpcmdvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJQcm9wU3VwcFJhdGVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJBUE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkFQTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibnVtX25hbWU6ICVkLlxuIiksIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5BUE5hbWUubmFtZSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJIQ0Y6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkhDRi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkhDRi5lbmFibGVkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJXRFM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLldEUy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibnVtX3dkc0RhdGE6ICVkLlxuIiksIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5XRFMud2RzRGF0YSwgcEZybS0+QWlyZ28uV0RTLm51bV93ZHNEYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJCUEluZGljYXRvcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci5pbmRpY2F0b3IsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTG9hZEluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8ubnVtX3N0YXMsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8uY2hhbm5lbF91dGlsLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJMb2FkQmFsYW5jZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJQcm9wQXNzb2NUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEFzc29jVHlwZS50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJMTEF0dHI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxMQXR0ci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxMQXR0ci5kZWZlcl90aHJlc2hvbGQsIDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlByb3BDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LmNhcGFiaWxpdHksIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5WZXJzaW9uLmNoaXBfcmV2LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2FyZF90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibnVtX2J1aWxkX3ZlcnNpb246ICVkLlxuIiksIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uVmVyc2lvbi5idWlsZF92ZXJzaW9uLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJQcm9wRURDQVBhcmFtczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5xb3MsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmVfbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmVfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNia19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNia19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZpX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZpX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdm9fbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdm9fbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiVGl0YW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRpdGFuLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29uY2F0X3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbXByZXNzaW9uX3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNiX3N0YXRlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLnJldl9mY3Nfc3RhdGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlByb3BDaGFublN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLm1vZGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnByaW1hcnlfY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4uc3ViX2JhbmQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLmNoYW5uZWxfc3dpdGNoX2NvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJQcm9wUXVpZXRCU1M6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfcGVyaW9kLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfb2Zmc2V0LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJUcmlnZ2VyU3RhQmdTY2FuOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UcmlnZ2VyU3RhQmdTY2FuLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5lbmFibGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlRhdXJ1czpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGF1cnVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhVElEQml0bWFwLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVBvbGljeSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImJhQnVmZmVyU2l6ZSAoMTIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlRhdXJ1cy5iYUJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyc3ZkICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMucnN2ZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIldzY0JlYWNvbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5WZXJzaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQmVhY29uLlZlcnNpb24ubWlub3IpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtYWpvciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQmVhY29uLlZlcnNpb24ubWFqb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIldQU1N0YXRlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uV1BTU3RhdGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uV1BTU3RhdGUuc3RhdGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkFQU2V0dXBMb2NrZWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5BUFNldHVwTG9ja2VkLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLkFQU2V0dXBMb2NrZWQuZkxvY2tlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiU2VsZWN0ZWRSZWdpc3RyYXI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5TZWxlY3RlZFJlZ2lzdHJhci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5TZWxlY3RlZFJlZ2lzdHJhci5zZWxlY3RlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiRGV2aWNlUGFzc3dvcmRJRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLkRldmljZVBhc3N3b3JkSUQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uRGV2aWNlUGFzc3dvcmRJRC5pZCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5tZXRob2RzLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJVVUlEX0U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5VVUlEX0UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uVVVJRF9FLnV1aWQsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJSRkJhbmRzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uUkZCYW5kcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5SRkJhbmRzLmJhbmRzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJWZW5kb3JFeHRlbnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uVmVuZG9yRXh0ZW5zaW9uLnZlbmRvcklkLCAzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiVmVyc2lvbjI6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5taW5vcik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtYWpvciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5tYWpvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJBdXRob3JpemVkTUFDczpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uVmVuZG9yRXh0ZW5zaW9uLkF1dGhvcml6ZWRNQUNzLm1hYywgNik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJSZXF1ZXN0VG9FbnJvbGw6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uVmVuZG9yRXh0ZW5zaW9uLlJlcXVlc3RUb0Vucm9sbC5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnJlcSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJQMlBCZWFjb246XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQQmVhY29uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJQMlBDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb24uUDJQQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvbi5QMlBDYXBhYmlsaXR5LmRldmljZUNhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLlAyUENhcGFiaWxpdHkuZ3JvdXBDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJQMlBEZXZpY2VJZDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQQmVhY29uLlAyUERldmljZUlkLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLlAyUERldmljZUlkLlAyUERldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdGljZU9mQWJzZW5jZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQQmVhY29uLk5vdGljZU9mQWJzZW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UuaW5kZXgsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLk5vdGljZU9mQWJzZW5jZS5DVFNXaW5kb3dPcHBQUywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm51bV9Ob0FEZXNjOiAlZC5cbiIpLCBwRnJtLT5QMlBCZWFjb24uTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UuTm9BRGVzYywgcEZybS0+UDJQQmVhY29uLk5vdGljZU9mQWJzZW5jZS5udW1fTm9BRGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrQmVhY29uLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0JlYWNvbjFbXSA9IHsKKyAgICAgICAgeyAiVGltZVN0YW1wIiwgb2Zmc2V0b2YodERvdDExZkJlYWNvbjEsIFRpbWVTdGFtcCksIFNpZ0ZmVGltZVN0YW1wICwgRE9UMTFGX0ZGX1RJTUVTVEFNUF9MRU4sIH0sCisgICAgICAgIHsgIkJlYWNvbkludGVydmFsIiwgb2Zmc2V0b2YodERvdDExZkJlYWNvbjEsIEJlYWNvbkludGVydmFsKSwgU2lnRmZCZWFjb25JbnRlcnZhbCAsIERPVDExRl9GRl9CRUFDT05JTlRFUlZBTF9MRU4sIH0sCisgICAgICAgIHsgIkNhcGFiaWxpdGllcyIsIG9mZnNldG9mKHREb3QxMWZCZWFjb24xLCBDYXBhYmlsaXRpZXMpLCBTaWdGZkNhcGFiaWxpdGllcyAsIERPVDExRl9GRl9DQVBBQklMSVRJRVNfTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfQmVhY29uMVtdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbjEsIFNTSUQpLCBvZmZzZXRvZih0RG90MTFmSUVTU0lELCBwcmVzZW50KSwgMCwgIlNTSUQiICwgMCwgMiwgMzQsIFNpZ0llU1NJRCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NTSUQsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uMSwgU3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFU3VwcFJhdGVzLCBwcmVzZW50KSwgMCwgIlN1cHBSYXRlcyIgLCAwLCAyLCAxNCwgU2lnSWVTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TVVBQUkFURVMsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uMSwgRFNQYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVEU1BhcmFtcywgcHJlc2VudCksIDAsICJEU1BhcmFtcyIgLCAwLCAzLCAzLCBTaWdJZURTUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRFNQQVJBTVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uMSwgSUJTU1BhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRUlCU1NQYXJhbXMsIHByZXNlbnQpLCAwLCAiSUJTU1BhcmFtcyIgLCAwLCA0LCA0LCBTaWdJZUlCU1NQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9JQlNTUEFSQU1TLCAwLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0JlYWNvbjEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkJlYWNvbjEgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19CZWFjb24xLCBJRVNfQmVhY29uMSwgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJVbnBhY2tlZCB0aGUgQmVhY29uMTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJUaW1lU3RhbXA6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRpbWVTdGFtcC50aW1lc3RhbXAsIDgpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoIkJlYWNvbkludGVydmFsOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksICggdEFOSV9VOCogKSZwRnJtLT5CZWFjb25JbnRlcnZhbC5pbnRlcnZhbCwgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiQ2FwYWJpbGl0aWVzOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoImVzcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmVzcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiaWJzcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmlic3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoImNmUG9sbGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jZlBvbGxhYmxlKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJjZlBvbGxSZXEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jZlBvbGxSZXEpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoInByaXZhY3kgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wcml2YWN5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJzaG9ydFByZWFtYmxlICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc2hvcnRQcmVhbWJsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgicGJjYyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnBiY2MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoImNoYW5uZWxBZ2lsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2hhbm5lbEFnaWxpdHkpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoInNwZWN0cnVtTWd0ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc3BlY3RydW1NZ3QpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoInFvcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnFvcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgic2hvcnRTbG90VGltZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0U2xvdFRpbWUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoImFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5hcHNkKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJycm0gKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5ycm0pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoImRzc3NPZmRtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZHNzc09mZG0pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoImRlbGF5ZWRCQSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmRlbGF5ZWRCQSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiaW1tZWRpYXRlQkEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5pbW1lZGlhdGVCQSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiU1NJRDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TU0lELnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoIm51bV9zc2lkOiAlZC5cbiIpLCBwRnJtLT5TU0lELm51bV9zc2lkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgKCB0QU5JX1U4KiApIHBGcm0tPlNTSUQuc3NpZCwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksICggdEFOSV9VOCogKSBwRnJtLT5TdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiRFNQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RFNQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRTUGFyYW1zLmN1cnJfY2hhbm5lbCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJJQlNTUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPklCU1NQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgKCB0QU5JX1U4KiApJnBGcm0tPklCU1NQYXJhbXMuYXRpbSwgMik7CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrQmVhY29uMS4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19CZWFjb24yW10gPSB7CisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19CZWFjb24yW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgQ291bnRyeSksIG9mZnNldG9mKHREb3QxMWZJRUNvdW50cnksIHByZXNlbnQpLCAwLCAiQ291bnRyeSIgLCAwLCA1LCAyNTcsIFNpZ0llQ291bnRyeSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0NPVU5UUlksIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgUG93ZXJDb25zdHJhaW50cyksIG9mZnNldG9mKHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMsIHByZXNlbnQpLCAwLCAiUG93ZXJDb25zdHJhaW50cyIgLCAwLCAzLCAzLCBTaWdJZVBvd2VyQ29uc3RyYWludHMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9QT1dFUkNPTlNUUkFJTlRTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIENoYW5Td2l0Y2hBbm4pLCBvZmZzZXRvZih0RG90MTFmSUVDaGFuU3dpdGNoQW5uLCBwcmVzZW50KSwgMCwgIkNoYW5Td2l0Y2hBbm4iICwgMCwgNSwgNSwgU2lnSWVDaGFuU3dpdGNoQW5uLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQ0hBTlNXSVRDSEFOTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBRdWlldCksIG9mZnNldG9mKHREb3QxMWZJRVF1aWV0LCBwcmVzZW50KSwgMCwgIlF1aWV0IiAsIDAsIDgsIDgsIFNpZ0llUXVpZXQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9RVUlFVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBUUENSZXBvcnQpLCBvZmZzZXRvZih0RG90MTFmSUVUUENSZXBvcnQsIHByZXNlbnQpLCAwLCAiVFBDUmVwb3J0IiAsIDAsIDQsIDQsIFNpZ0llVFBDUmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVFBDUkVQT1JULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIEVSUEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVFUlBJbmZvLCBwcmVzZW50KSwgMCwgIkVSUEluZm8iICwgMCwgMywgMywgU2lnSWVFUlBJbmZvLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRVJQSU5GTywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBFeHRTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiAsIDAsIDMsIDE0LCBTaWdJZUV4dFN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBSU04pLCBvZmZzZXRvZih0RG90MTFmSUVSU04sIHByZXNlbnQpLCAwLCAiUlNOIiAsIDAsIDgsIDExMiwgU2lnSWVSU04sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SU04sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgRURDQVBhcmFtU2V0KSwgb2Zmc2V0b2YodERvdDExZklFRURDQVBhcmFtU2V0LCBwcmVzZW50KSwgMCwgIkVEQ0FQYXJhbVNldCIgLCAwLCAyMCwgMjAsIFNpZ0llRURDQVBhcmFtU2V0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRURDQVBBUkFNU0VULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIEFQQ2hhbm5lbFJlcG9ydCksIG9mZnNldG9mKHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCwgcHJlc2VudCksIDAsICJBUENoYW5uZWxSZXBvcnQiICwgMCwgMywgNTMsIFNpZ0llQVBDaGFubmVsUmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQVBDSEFOTkVMUkVQT1JULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIFJSTUVuYWJsZWRDYXApLCBvZmZzZXRvZih0RG90MTFmSUVSUk1FbmFibGVkQ2FwLCBwcmVzZW50KSwgMCwgIlJSTUVuYWJsZWRDYXAiICwgMCwgNywgNywgU2lnSWVSUk1FbmFibGVkQ2FwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUlJNRU5BQkxFRENBUCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBNb2JpbGl0eURvbWFpbiksIG9mZnNldG9mKHREb3QxMWZJRU1vYmlsaXR5RG9tYWluLCBwcmVzZW50KSwgMCwgIk1vYmlsaXR5RG9tYWluIiAsIDAsIDUsIDUsIFNpZ0llTW9iaWxpdHlEb21haW4sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9NT0JJTElUWURPTUFJTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBXUEEpLCBvZmZzZXRvZih0RG90MTFmSUVXUEEsIHByZXNlbnQpLCAwLCAiV1BBIiAsIDAsIDgsIDUwLCBTaWdJZVdQQSwgezAsIDgwLCAyNDIsIDEsIDB9LCA0LCBET1QxMUZfRUlEX1dQQSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVIVENhcHMsIHByZXNlbnQpLCAwLCAiSFRDYXBzIiAsIDAsIDI4LCA2MCwgU2lnSWVIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9IVENBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgSFRJbmZvKSwgb2Zmc2V0b2YodERvdDExZklFSFRJbmZvLCBwcmVzZW50KSwgMCwgIkhUSW5mbyIgLCAwLCAyNCwgNTYsIFNpZ0llSFRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfSFRJTkZPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIEV4dENoYW5Td2l0Y2hBbm4pLCBvZmZzZXRvZih0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uLCBwcmVzZW50KSwgMCwgIkV4dENoYW5Td2l0Y2hBbm4iICwgMCwgMywgMywgU2lnSWVFeHRDaGFuU3dpdGNoQW5uLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRVhUQ0hBTlNXSVRDSEFOTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBXTU1JbmZvQXApLCBvZmZzZXRvZih0RG90MTFmSUVXTU1JbmZvQXAsIHByZXNlbnQpLCAwLCAiV01NSW5mb0FwIiAsIDAsIDksIDksIFNpZ0llV01NSW5mb0FwLCB7MCwgODAsIDI0MiwgMiwgMH0sIDUsIERPVDExRl9FSURfV01NSU5GT0FQLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIFdNTVBhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVBhcmFtcywgcHJlc2VudCksIDAsICJXTU1QYXJhbXMiICwgMCwgMjYsIDI2LCBTaWdJZVdNTVBhcmFtcywgezAsIDgwLCAyNDIsIDIsIDF9LCA1LCBET1QxMUZfRUlEX1dNTVBBUkFNUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBXTU1DYXBzKSwgb2Zmc2V0b2YodERvdDExZklFV01NQ2FwcywgcHJlc2VudCksIDAsICJXTU1DYXBzIiAsIDAsIDksIDksIFNpZ0llV01NQ2FwcywgezAsIDgwLCAyNDIsIDIsIDV9LCA1LCBET1QxMUZfRUlEX1dNTUNBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgQWlyZ28pLCBvZmZzZXRvZih0RG90MTFmSUVBaXJnbywgcHJlc2VudCksIDAsICJBaXJnbyIgLCAwLCA1LCAyMzIsIFNpZ0llQWlyZ28sIHswLCAxMCwgMjQ1LCAwLCAwfSwgMywgRE9UMTFGX0VJRF9BSVJHTywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBXc2NCZWFjb24pLCBvZmZzZXRvZih0RG90MTFmSUVXc2NCZWFjb24sIHByZXNlbnQpLCAwLCAiV3NjQmVhY29uIiAsIDAsIDYsIDg0LCBTaWdJZVdzY0JlYWNvbiwgezAsIDgwLCAyNDIsIDQsIDB9LCA0LCBET1QxMUZfRUlEX1dTQ0JFQUNPTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb24yLCBXQVBJKSwgb2Zmc2V0b2YodERvdDExZklFV0FQSSwgcHJlc2VudCksIDAsICJXQVBJIiAsIDAsIDE0LCAxMTIsIFNpZ0llV0FQSSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1dBUEksIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgQ0NYUmFkTWdtdENhcCksIG9mZnNldG9mKHREb3QxMWZJRUNDWFJhZE1nbXRDYXAsIHByZXNlbnQpLCAwLCAiQ0NYUmFkTWdtdENhcCIgLCAwLCA4LCA4LCBTaWdJZUNDWFJhZE1nbXRDYXAsIHswLCA2NCwgMTUwLCAxLCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hSQURNR01UQ0FQLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIENDWFRyYWZTdHJtTWV0KSwgb2Zmc2V0b2YodERvdDExZklFQ0NYVHJhZlN0cm1NZXQsIHByZXNlbnQpLCAwLCAiQ0NYVHJhZlN0cm1NZXQiICwgMCwgMTAsIDEwLCBTaWdJZUNDWFRyYWZTdHJtTWV0LCB7MCwgNjQsIDE1MCwgNywgMH0sIDQsIERPVDExRl9FSURfQ0NYVFJBRlNUUk1NRVQsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uMiwgQ0NYVHhtaXRQb3dlciksIG9mZnNldG9mKHREb3QxMWZJRUNDWFR4bWl0UG93ZXIsIHByZXNlbnQpLCAwLCAiQ0NYVHhtaXRQb3dlciIgLCAwLCA4LCA4LCBTaWdJZUNDWFR4bWl0UG93ZXIsIHswLCA2NCwgMTUwLCAwLCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hUWE1JVFBPV0VSLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbjIsIFAyUEJlYWNvbiksIG9mZnNldG9mKHREb3QxMWZJRVAyUEJlYWNvbiwgcHJlc2VudCksIDAsICJQMlBCZWFjb24iICwgMCwgNiwgNjEsIFNpZ0llUDJQQmVhY29uLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwgNCwgRE9UMTFGX0VJRF9QMlBCRUFDT04sIDAsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrQmVhY29uMih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmQmVhY29uMiAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX0JlYWNvbjIsIElFU19CZWFjb24yLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlVucGFja2VkIHRoZSBCZWFjb24yOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkNvdW50cnk6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q291bnRyeS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+Q291bnRyeS5jb3VudHJ5LCAzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibnVtX3RyaXBsZXRzOiAlZC5cbiIpLCBwRnJtLT5Db3VudHJ5Lm51bV90cmlwbGV0cyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSBwRnJtLT5Db3VudHJ5LnRyaXBsZXRzLCAzICogcEZybS0+Q291bnRyeS5udW1fdHJpcGxldHMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUG93ZXJDb25zdHJhaW50czpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Qb3dlckNvbnN0cmFpbnRzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5Qb3dlckNvbnN0cmFpbnRzLmxvY2FsUG93ZXJDb25zdHJhaW50cywgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJDaGFuU3dpdGNoQW5uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNoYW5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4uc3dpdGNoTW9kZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5DaGFuU3dpdGNoQW5uLm5ld0NoYW5uZWwsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5zd2l0Y2hDb3VudCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJRdWlldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5RdWlldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UXVpZXQuY291bnQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UXVpZXQucGVyaW9kLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0LmR1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0Lm9mZnNldCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJUUENSZXBvcnQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VFBDUmVwb3J0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5UUENSZXBvcnQudHhfcG93ZXIsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LmxpbmtfbWFyZ2luLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkVSUEluZm86XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RVJQSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJub25fZXJwX3ByZXNlbnQgKDEpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8ubm9uX2VycF9wcmVzZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidXNlX3Byb3QgKDEpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8udXNlX3Byb3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJiYXJrZXJfcHJlYW1ibGUgKDEpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8uYmFya2VyX3ByZWFtYmxlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkICg1KTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLnVudXNlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJFeHRTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RXh0U3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSBwRnJtLT5FeHRTdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUlNOOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJTTi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLnZlcnNpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLmdwX2NpcGhlcl9zdWl0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTi5wd2lzZV9jaXBoZXJfc3VpdGVzLCA0ICogcEZybS0+UlNOLnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5SU04uYWttX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTi5ha21fc3VpdGVzLCA0ICogcEZybS0+UlNOLmFrbV9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInByZWF1dGggKDEpOiAlZFxuIiksIHBGcm0tPlJTTi5wcmVhdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibm9fcHdpc2UgKDEpOiAlZFxuIiksIHBGcm0tPlJTTi5ub19wd2lzZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlBUS1NBX3JlcGxheV9jb3VudGVyICgyKTogJWRcbiIpLCBwRnJtLT5SU04uUFRLU0FfcmVwbGF5X2NvdW50ZXIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJHVEtTQV9yZXBsYXlfY291bnRlciAoMik6ICVkXG4iKSwgcEZybS0+UlNOLkdUS1NBX3JlcGxheV9jb3VudGVyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicmVzZXJ2ZWQgKDEwKTogJWRcbiIpLCBwRnJtLT5SU04ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLnBta2lkX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTi5wbWtpZCwgMTYgKiBwRnJtLT5SU04ucG1raWRfY291bnQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiRURDQVBhcmFtU2V0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkVEQ0FQYXJhbVNldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LnFvcywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNiZV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2aV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2b19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQVBDaGFubmVsUmVwb3J0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QVBDaGFubmVsUmVwb3J0LnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV9jaGFubmVsTGlzdDogJWQuXG4iKSwgcEZybS0+QVBDaGFubmVsUmVwb3J0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSBwRnJtLT5BUENoYW5uZWxSZXBvcnQuY2hhbm5lbExpc3QsIHBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUlJNRW5hYmxlZENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SUk1FbmFibGVkQ2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkxpbmtNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MaW5rTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOZWlnaGJvclJwdCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5OZWlnaGJvclJwdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInBhcmFsbGVsICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnBhcmFsbGVsKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicmVwZWF0ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVwZWF0ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJCZWFjb25QYXNzaXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvblBhc3NpdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJCZWFjb25BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQmVhY29uVGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uVGFibGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJCZWFjb25SZXBDb25kICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvblJlcENvbmQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJGcmFtZU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkZyYW1lTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJDaGFubmVsTG9hZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5DaGFubmVsTG9hZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vaXNlSGlzdG9ncmFtICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5vaXNlSGlzdG9ncmFtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic3RhdGlzdGljcyAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5zdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTENJTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJMQ0lBemltdXRoICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxDSUF6aW11dGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJUQ01DYXBhYmlsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlRDTUNhcGFiaWxpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0cmlnZ2VyZWRUQ00gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAudHJpZ2dlcmVkVENNKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQVBDaGFuUmVwb3J0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkFQQ2hhblJlcG9ydCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlJSTU1JQkVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlJNTUlCRW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm9wZXJhdGluZ0NoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAub3BlcmF0aW5nQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm5vbk9wZXJhdGluQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5ub25PcGVyYXRpbkNoYW5NYXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90RW5hYmxlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90RW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5laWdoYm9yVFNGT2Zmc2V0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5laWdoYm9yVFNGT2Zmc2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUkNQSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJDUElNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlJTTklNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SU05JTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJCc3NBdmdBY2Nlc3NEZWxheSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5Cc3NBdmdBY2Nlc3NEZWxheSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkJTU0F2YWlsQWRtaXNzaW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJTU0F2YWlsQWRtaXNzaW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQW50ZW5uYUluZm9ybWF0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkFudGVubmFJbmZvcm1hdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk1vYmlsaXR5RG9tYWluOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPk1vYmlsaXR5RG9tYWluLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5Nb2JpbGl0eURvbWFpbi5NRElELCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgib3ZlckRTQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5vdmVyRFNDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNvdXJjZVJlcUNhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ucmVzb3VyY2VSZXFDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiV1BBOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldQQS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLnZlcnNpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLm11bHRpY2FzdF9jaXBoZXIsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPldQQS51bmljYXN0X2NpcGhlcnMsIDQgKiBwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkgcEZybS0+V1BBLmF1dGhfc3VpdGVzLCA0ICogcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLmNhcHMsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiSFRDYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhZHZDb2RpbmdDYXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hZHZDb2RpbmdDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJtaW1vUG93ZXJTYXZlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWltb1Bvd2VyU2F2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImdyZWVuRmllbGQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5ncmVlbkZpZWxkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic2hvcnRHSTIwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTIwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic2hvcnRHSTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidHhTVEJDICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicnhTVEJDICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZGVsYXllZEJBKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibWF4aW1hbEFNU0RVc2l6ZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1heGltYWxBTVNEVXNpemUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJkc3NzQ2NrTW9kZTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZHNzc0Nja01vZGU0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInBzbXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wc21wKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic3RiY0NvbnRyb2xGcmFtZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnN0YmNDb250cm9sRnJhbWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJtYXhSeEFNUERVRmFjdG9yICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4UnhBTVBEVUZhY3Rvcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm1wZHVEZW5zaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubXBkdURlbnNpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZDEgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+SFRDYXBzLnN1cHBvcnRlZE1DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJwY28gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wY28pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0cmFuc2l0aW9uVGltZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnRyYW5zaXRpb25UaW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicmVzZXJ2ZWQyICg1KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibWNzRmVlZGJhY2sgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tY3NGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInJlc2VydmVkMyAoNik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicnhTdGFnZ2VyZWRTb3VuZGluZyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4U3RhZ2dlcmVkU291bmRpbmcpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0eFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInJ4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0eFpMRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4WkxGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiaW1wbGljaXRUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuaW1wbGljaXRUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiY2FsaWJyYXRpb24gKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jYWxpYnJhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImV4cGxpY2l0Q1NJVHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJVHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiZXhwbGljaXRCRkNTSUZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRCRkNTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJjc2lOdW1CRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY3NpTnVtQkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicmVzZXJ2ZWQ0ICg3KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYW50ZW5uYVNlbGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFTZWxlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicnhBUyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4QVMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0eFNvdW5kaW5nUFBEVXMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFNvdW5kaW5nUFBEVXMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZDUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPkhUQ2Fwcy5yc3ZkLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiSFRJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+SFRJbmZvLnByaW1hcnlDaGFubmVsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAoMik6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZWNvbW1lbmRlZFR4V2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyaWZzTW9kZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJpZnNNb2RlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiY29udHJvbGxlZEFjY2Vzc09ubHkgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5jb250cm9sbGVkQWNjZXNzT25seSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2VydmljZUludGVydmFsR3JhbnVsYXJpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJvcE1vZGUgKDIpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5vcE1vZGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJub25HRkRldmljZXNQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ubm9uR0ZEZXZpY2VzUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInRyYW5zbWl0QnVyc3RMaW1pdCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnRyYW5zbWl0QnVyc3RMaW1pdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm9ic3NOb25IVFN0YVByZXNlbnQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5vYnNzTm9uSFRTdGFQcmVzZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicmVzZXJ2ZWQgKDExKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJiYXNpY1NUQkNNQ1MgKDcpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5iYXNpY1NUQkNNQ1MpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJkdWFsQ1RTUHJvdGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmR1YWxDVFNQcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic2Vjb25kYXJ5QmVhY29uICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2Vjb25kYXJ5QmVhY29uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInBjb0FjdGl2ZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnBjb0FjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInBjb1BoYXNlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucGNvUGhhc2UpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZDIgKDQpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+SFRJbmZvLmJhc2ljTUNTU2V0LCAxNik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVEluZm8ubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkgcEZybS0+SFRJbmZvLnJzdmQsIHBGcm0tPkhUSW5mby5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJFeHRDaGFuU3dpdGNoQW5uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dENoYW5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkV4dENoYW5Td2l0Y2hBbm4uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJXTU1JbmZvQXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NSW5mb0FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1JbmZvQXAudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInBhcmFtX3NldF9jb3VudCAoNCk6ICVkXG4iKSwgcEZybS0+V01NSW5mb0FwLnBhcmFtX3NldF9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInJlc2VydmVkICgzKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvQXAucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ1YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NSW5mb0FwLnVhcHNkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIldNTVBhcmFtczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1QYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5xb3NJbmZvLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5yZXNlcnZlZDIsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNiZV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2aV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2b19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiV01NQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1DYXBzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1DYXBzLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZCAoNCk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInFhY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucWFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInF1ZXVlX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucXVldWVfcmVxdWVzdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInR4b3BfcmVxdWVzdCAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy50eG9wX3JlcXVlc3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJtb3JlX2FjayAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5tb3JlX2Fjayk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJBaXJnbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJQcm9wU3VwcFJhdGVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQVBOYW1lOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5BUE5hbWUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibnVtX25hbWU6ICVkLlxuIiksIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uQVBOYW1lLm5hbWUsIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkhDRjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uSENGLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5IQ0YuZW5hYmxlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIldEUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uV0RTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV93ZHNEYXRhOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLldEUy53ZHNEYXRhLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJCUEluZGljYXRvcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLmluZGljYXRvciwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkxvYWRJbmZvOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8ubnVtX3N0YXMsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRJbmZvLmNoYW5uZWxfdXRpbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkxvYWRCYWxhbmNlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuYnNzaWQsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJQcm9wQXNzb2NUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnR5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJMTEF0dHI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxMQXR0ci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTExBdHRyLmRlZmVyX3RocmVzaG9sZCwgNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlByb3BDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENhcGFiaWxpdHkuY2FwYWJpbGl0eSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2hpcF9yZXYsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2FyZF90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV9idWlsZF92ZXJzaW9uOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5WZXJzaW9uLmJ1aWxkX3ZlcnNpb24sIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJQcm9wRURDQVBhcmFtczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnFvcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNiZV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmVfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNia19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmtfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2aV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdmlfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2b19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdm9fbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJUaXRhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGl0YW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbmNhdF90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29tcHJlc3Npb25fdGNpZF9iaXRtYXAsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNiX3N0YXRlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5yZXZfZmNzX3N0YXRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUHJvcENoYW5uU3dpdGNoQW5uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5tb2RlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJpbWFyeV9jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4uc3ViX2JhbmQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5jaGFubmVsX3N3aXRjaF9jb3VudCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlByb3BRdWlldEJTUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfY291bnQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9wZXJpb2QsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X29mZnNldCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlRyaWdnZXJTdGFCZ1NjYW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4uZW5hYmxlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiVGF1cnVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UYXVydXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVRJREJpdG1hcCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhUG9saWN5LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImJhQnVmZmVyU2l6ZSAoMTIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlRhdXJ1cy5iYUJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicnN2ZCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLnJzdmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiV3NjQmVhY29uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJWZXJzaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQmVhY29uLlZlcnNpb24ubWlub3IpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibWFqb3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY0JlYWNvbi5WZXJzaW9uLm1ham9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiV1BTU3RhdGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5XUFNTdGF0ZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLldQU1N0YXRlLnN0YXRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQVBTZXR1cExvY2tlZDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLkFQU2V0dXBMb2NrZWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5BUFNldHVwTG9ja2VkLmZMb2NrZWQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJTZWxlY3RlZFJlZ2lzdHJhcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlNlbGVjdGVkUmVnaXN0cmFyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uU2VsZWN0ZWRSZWdpc3RyYXIuc2VsZWN0ZWQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJEZXZpY2VQYXNzd29yZElEOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uRGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLkRldmljZVBhc3N3b3JkSUQuaWQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMubWV0aG9kcywgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlVVSURfRTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlVVSURfRS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLlVVSURfRS51dWlkLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlJGQmFuZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5SRkJhbmRzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uUkZCYW5kcy5iYW5kcywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlZlbmRvckV4dGVuc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi52ZW5kb3JJZCwgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJWZXJzaW9uMjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibWlub3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWlub3IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NCZWFjb24uVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1ham9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJBdXRob3JpemVkTUFDczpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MubWFjLCA2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJSZXF1ZXN0VG9FbnJvbGw6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uVmVuZG9yRXh0ZW5zaW9uLlJlcXVlc3RUb0Vucm9sbC5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi5SZXF1ZXN0VG9FbnJvbGwucmVxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJXQVBJOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldBUEkucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkudmVyc2lvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLmFrbV9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSBwRnJtLT5XQVBJLmFrbV9zdWl0ZXMsIDQgKiBwRnJtLT5XQVBJLmFrbV9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUEkudW5pY2FzdF9jaXBoZXJfc3VpdGVzLCA0ICogcEZybS0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLm11bHRpY2FzdF9jaXBoZXJfc3VpdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJwcmVhdXRoICgxKTogJWRcbiIpLCBwRnJtLT5XQVBJLnByZWF1dGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZCAoMTUpOiAlZFxuIiksIHBGcm0tPldBUEkucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS5ia2lkX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUEkuYmtpZCwgMTYgKiBwRnJtLT5XQVBJLmJraWRfY291bnQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQ0NYUmFkTWdtdENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hSYWRNZ210Q2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hSYWRNZ210Q2FwLm1nbXRfc3RhdGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJtYnNzaWRfbWFzayAoMyk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5tYnNzaWRfbWFzayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInJlc2VydmVkICg1KTogJWRcbiIpLCBwRnJtLT5DQ1hSYWRNZ210Q2FwLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkNDWFRyYWZTdHJtTWV0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFRyYWZTdHJtTWV0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC50c2lkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnN0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0Lm1zbXRfaW50ZXJ2YWwsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQ0NYVHhtaXRQb3dlcjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUeG1pdFBvd2VyLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnBvd2VyX2xpbWl0LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFR4bWl0UG93ZXIucmVzZXJ2ZWQsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUDJQQmVhY29uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJQMlBDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb24uUDJQQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLlAyUENhcGFiaWxpdHkuZGV2aWNlQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLlAyUENhcGFiaWxpdHkuZ3JvdXBDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUDJQRGV2aWNlSWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvbi5QMlBEZXZpY2VJZC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLlAyUERldmljZUlkLlAyUERldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3RpY2VPZkFic2VuY2U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UuaW5kZXgsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UuQ1RTV2luZG93T3BwUFMsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibnVtX05vQURlc2M6ICVkLlxuIiksIHBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UubnVtX05vQURlc2MpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UuTm9BRGVzYywgcEZybS0+UDJQQmVhY29uLk5vdGljZU9mQWJzZW5jZS5udW1fTm9BRGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrQmVhY29uMi4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19CZWFjb25JRXNbXSA9IHsKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0JlYWNvbklFc1tdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgU1NJRCksIG9mZnNldG9mKHREb3QxMWZJRVNTSUQsIHByZXNlbnQpLCAwLCAiU1NJRCIgLCAwLCAyLCAzNCwgU2lnSWVTU0lELCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfU1NJRCwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFN1cHBSYXRlcyksIG9mZnNldG9mKHREb3QxMWZJRVN1cHBSYXRlcywgcHJlc2VudCksIDAsICJTdXBwUmF0ZXMiICwgMCwgMiwgMTQsIFNpZ0llU3VwcFJhdGVzLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfU1VQUFJBVEVTLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgRkhQYXJhbVNldCksIG9mZnNldG9mKHREb3QxMWZJRUZIUGFyYW1TZXQsIHByZXNlbnQpLCAwLCAiRkhQYXJhbVNldCIgLCAwLCA3LCA3LCBTaWdJZUZIUGFyYW1TZXQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9GSFBBUkFNU0VULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgRFNQYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVEU1BhcmFtcywgcHJlc2VudCksIDAsICJEU1BhcmFtcyIgLCAwLCAzLCAzLCBTaWdJZURTUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRFNQQVJBTVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBDRlBhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRUNGUGFyYW1zLCBwcmVzZW50KSwgMCwgIkNGUGFyYW1zIiAsIDAsIDgsIDgsIFNpZ0llQ0ZQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9DRlBBUkFNUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIElCU1NQYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVJQlNTUGFyYW1zLCBwcmVzZW50KSwgMCwgIklCU1NQYXJhbXMiICwgMCwgNCwgNCwgU2lnSWVJQlNTUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfSUJTU1BBUkFNUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFRJTSksIG9mZnNldG9mKHREb3QxMWZJRVRJTSwgcHJlc2VudCksIDAsICJUSU0iICwgMCwgNiwgMjU2LCBTaWdJZVRJTSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1RJTSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIENvdW50cnkpLCBvZmZzZXRvZih0RG90MTFmSUVDb3VudHJ5LCBwcmVzZW50KSwgMCwgIkNvdW50cnkiICwgMCwgNSwgMjU3LCBTaWdJZUNvdW50cnksIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9DT1VOVFJZLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgRkhQYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVGSFBhcmFtcywgcHJlc2VudCksIDAsICJGSFBhcmFtcyIgLCAwLCA0LCA0LCBTaWdJZUZIUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRkhQQVJBTVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBGSFBhdHRUYWJsZSksIG9mZnNldG9mKHREb3QxMWZJRUZIUGF0dFRhYmxlLCBwcmVzZW50KSwgMCwgIkZIUGF0dFRhYmxlIiAsIDAsIDYsIDI1NywgU2lnSWVGSFBhdHRUYWJsZSwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0ZIUEFUVFRBQkxFLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgUG93ZXJDb25zdHJhaW50cyksIG9mZnNldG9mKHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMsIHByZXNlbnQpLCAwLCAiUG93ZXJDb25zdHJhaW50cyIgLCAwLCAzLCAzLCBTaWdJZVBvd2VyQ29uc3RyYWludHMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9QT1dFUkNPTlNUUkFJTlRTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgQ2hhblN3aXRjaEFubiksIG9mZnNldG9mKHREb3QxMWZJRUNoYW5Td2l0Y2hBbm4sIHByZXNlbnQpLCAwLCAiQ2hhblN3aXRjaEFubiIgLCAwLCA1LCA1LCBTaWdJZUNoYW5Td2l0Y2hBbm4sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9DSEFOU1dJVENIQU5OLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgUXVpZXQpLCBvZmZzZXRvZih0RG90MTFmSUVRdWlldCwgcHJlc2VudCksIDAsICJRdWlldCIgLCAwLCA4LCA4LCBTaWdJZVF1aWV0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUVVJRVQsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBUUENSZXBvcnQpLCBvZmZzZXRvZih0RG90MTFmSUVUUENSZXBvcnQsIHByZXNlbnQpLCAwLCAiVFBDUmVwb3J0IiAsIDAsIDQsIDQsIFNpZ0llVFBDUmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVFBDUkVQT1JULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgRVJQSW5mbyksIG9mZnNldG9mKHREb3QxMWZJRUVSUEluZm8sIHByZXNlbnQpLCAwLCAiRVJQSW5mbyIgLCAwLCAzLCAzLCBTaWdJZUVSUEluZm8sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9FUlBJTkZPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgRXh0U3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFRXh0U3VwcFJhdGVzLCBwcmVzZW50KSwgMCwgIkV4dFN1cHBSYXRlcyIgLCAwLCAzLCAxNCwgU2lnSWVFeHRTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9FWFRTVVBQUkFURVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBSU04pLCBvZmZzZXRvZih0RG90MTFmSUVSU04sIHByZXNlbnQpLCAwLCAiUlNOIiAsIDAsIDgsIDExMiwgU2lnSWVSU04sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SU04sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBRQlNTTG9hZCksIG9mZnNldG9mKHREb3QxMWZJRVFCU1NMb2FkLCBwcmVzZW50KSwgMCwgIlFCU1NMb2FkIiAsIDAsIDcsIDcsIFNpZ0llUUJTU0xvYWQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9RQlNTTE9BRCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIEVEQ0FQYXJhbVNldCksIG9mZnNldG9mKHREb3QxMWZJRUVEQ0FQYXJhbVNldCwgcHJlc2VudCksIDAsICJFRENBUGFyYW1TZXQiICwgMCwgMjAsIDIwLCBTaWdJZUVEQ0FQYXJhbVNldCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0VEQ0FQQVJBTVNFVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFFPU0NhcHNBcCksIG9mZnNldG9mKHREb3QxMWZJRVFPU0NhcHNBcCwgcHJlc2VudCksIDAsICJRT1NDYXBzQXAiICwgMCwgMywgMywgU2lnSWVRT1NDYXBzQXAsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9RT1NDQVBTQVAsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBBUENoYW5uZWxSZXBvcnQpLCBvZmZzZXRvZih0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQsIHByZXNlbnQpLCAwLCAiQVBDaGFubmVsUmVwb3J0IiAsIDAsIDMsIDUzLCBTaWdJZUFQQ2hhbm5lbFJlcG9ydCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0FQQ0hBTk5FTFJFUE9SVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIFJSTUVuYWJsZWRDYXApLCBvZmZzZXRvZih0RG90MTFmSUVSUk1FbmFibGVkQ2FwLCBwcmVzZW50KSwgMCwgIlJSTUVuYWJsZWRDYXAiICwgMCwgNywgNywgU2lnSWVSUk1FbmFibGVkQ2FwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUlJNRU5BQkxFRENBUCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIE1vYmlsaXR5RG9tYWluKSwgb2Zmc2V0b2YodERvdDExZklFTW9iaWxpdHlEb21haW4sIHByZXNlbnQpLCAwLCAiTW9iaWxpdHlEb21haW4iICwgMCwgNSwgNSwgU2lnSWVNb2JpbGl0eURvbWFpbiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX01PQklMSVRZRE9NQUlOLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgV1BBKSwgb2Zmc2V0b2YodERvdDExZklFV1BBLCBwcmVzZW50KSwgMCwgIldQQSIgLCAwLCA4LCA1MCwgU2lnSWVXUEEsIHswLCA4MCwgMjQyLCAxLCAwfSwgNCwgRE9UMTFGX0VJRF9XUEEsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVIVENhcHMsIHByZXNlbnQpLCAwLCAiSFRDYXBzIiAsIDAsIDI4LCA2MCwgU2lnSWVIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9IVENBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBIVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVIVEluZm8sIHByZXNlbnQpLCAwLCAiSFRJbmZvIiAsIDAsIDI0LCA1NiwgU2lnSWVIVEluZm8sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9IVElORk8sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBFeHRDaGFuU3dpdGNoQW5uKSwgb2Zmc2V0b2YodERvdDExZklFRXh0Q2hhblN3aXRjaEFubiwgcHJlc2VudCksIDAsICJFeHRDaGFuU3dpdGNoQW5uIiAsIDAsIDMsIDMsIFNpZ0llRXh0Q2hhblN3aXRjaEFubiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0VYVENIQU5TV0lUQ0hBTk4sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBXTU1JbmZvQXApLCBvZmZzZXRvZih0RG90MTFmSUVXTU1JbmZvQXAsIHByZXNlbnQpLCAwLCAiV01NSW5mb0FwIiAsIDAsIDksIDksIFNpZ0llV01NSW5mb0FwLCB7MCwgODAsIDI0MiwgMiwgMH0sIDUsIERPVDExRl9FSURfV01NSU5GT0FQLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgV01NUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFV01NUGFyYW1zLCBwcmVzZW50KSwgMCwgIldNTVBhcmFtcyIgLCAwLCAyNiwgMjYsIFNpZ0llV01NUGFyYW1zLCB7MCwgODAsIDI0MiwgMiwgMX0sIDUsIERPVDExRl9FSURfV01NUEFSQU1TLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgV01NQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVdNTUNhcHMsIHByZXNlbnQpLCAwLCAiV01NQ2FwcyIgLCAwLCA5LCA5LCBTaWdJZVdNTUNhcHMsIHswLCA4MCwgMjQyLCAyLCA1fSwgNSwgRE9UMTFGX0VJRF9XTU1DQVBTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgV0FQSSksIG9mZnNldG9mKHREb3QxMWZJRVdBUEksIHByZXNlbnQpLCAwLCAiV0FQSSIgLCAwLCAxNCwgMTEyLCBTaWdJZVdBUEksIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9XQVBJLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgQ0NYVmVyc2lvbiksIG9mZnNldG9mKHREb3QxMWZJRUNDWFZlcnNpb24sIHByZXNlbnQpLCAwLCAiQ0NYVmVyc2lvbiIgLCAwLCA3LCA3LCBTaWdJZUNDWFZlcnNpb24sIHswLCA2NCwgMTUwLCAzLCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hWRVJTSU9OLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgQ0NYUmFkTWdtdENhcCksIG9mZnNldG9mKHREb3QxMWZJRUNDWFJhZE1nbXRDYXAsIHByZXNlbnQpLCAwLCAiQ0NYUmFkTWdtdENhcCIgLCAwLCA4LCA4LCBTaWdJZUNDWFJhZE1nbXRDYXAsIHswLCA2NCwgMTUwLCAxLCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hSQURNR01UQ0FQLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgQ0NYVHJhZlN0cm1NZXQpLCBvZmZzZXRvZih0RG90MTFmSUVDQ1hUcmFmU3RybU1ldCwgcHJlc2VudCksIDAsICJDQ1hUcmFmU3RybU1ldCIgLCAwLCAxMCwgMTAsIFNpZ0llQ0NYVHJhZlN0cm1NZXQsIHswLCA2NCwgMTUwLCA3LCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hUUkFGU1RSTU1FVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIENDWFR4bWl0UG93ZXIpLCBvZmZzZXRvZih0RG90MTFmSUVDQ1hUeG1pdFBvd2VyLCBwcmVzZW50KSwgMCwgIkNDWFR4bWl0UG93ZXIiICwgMCwgOCwgOCwgU2lnSWVDQ1hUeG1pdFBvd2VyLCB7MCwgNjQsIDE1MCwgMCwgMH0sIDQsIERPVDExRl9FSURfQ0NYVFhNSVRQT1dFUiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZCZWFjb25JRXMsIEFpcmdvKSwgb2Zmc2V0b2YodERvdDExZklFQWlyZ28sIHByZXNlbnQpLCAwLCAiQWlyZ28iICwgMCwgNSwgMjMyLCBTaWdJZUFpcmdvLCB7MCwgMTAsIDI0NSwgMCwgMH0sIDMsIERPVDExRl9FSURfQUlSR08sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQmVhY29uSUVzLCBXc2NCZWFjb25Qcm9iZVJlcyksIG9mZnNldG9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzLCBwcmVzZW50KSwgMCwgIldzY0JlYWNvblByb2JlUmVzIiAsIDAsIDYsIDMxOSwgU2lnSWVXc2NCZWFjb25Qcm9iZVJlcywgezAsIDgwLCAyNDIsIDQsIDB9LCA0LCBET1QxMUZfRUlEX1dTQ0JFQUNPTlBST0JFUkVTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkJlYWNvbklFcywgUDJQQmVhY29uUHJvYmVSZXMpLCBvZmZzZXRvZih0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcywgcHJlc2VudCksIDAsICJQMlBCZWFjb25Qcm9iZVJlcyIgLCAwLCA2LCAxMTUwLCBTaWdJZVAyUEJlYWNvblByb2JlUmVzLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwgNCwgRE9UMTFGX0VJRF9QMlBCRUFDT05QUk9CRVJFUywgMCwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tCZWFjb25JRXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkJlYWNvbklFcyAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX0JlYWNvbklFcywgSUVTX0JlYWNvbklFcywgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlVucGFja2VkIHRoZSBCZWFjb25JRXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiU1NJRDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TU0lELnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlNTSUQuc3NpZCwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlN1cHBSYXRlcy5yYXRlcywgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkZIUGFyYW1TZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RkhQYXJhbVNldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1TZXQuZHdlbGxfdGltZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1TZXQuaG9wX3NldCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1TZXQuaG9wX3BhdHRlcm4sIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtU2V0LmhvcF9pbmRleCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkRTUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkRTUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RFNQYXJhbXMuY3Vycl9jaGFubmVsLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQ0ZQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0ZQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5DRlBhcmFtcy5jZnBfY291bnQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5DRlBhcmFtcy5jZnBfcGVyaW9kLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q0ZQYXJhbXMuY2ZwX21heGR1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q0ZQYXJhbXMuY2ZwX2R1cnJlbWFpbmluZywgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIklCU1NQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+SUJTU1BhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPklCU1NQYXJhbXMuYXRpbSwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlRJTTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5USU0ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5USU0uZHRpbV9jb3VudCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRJTS5kdGltX3BlcmlvZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRJTS5ibXBjdGwsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV92Ym1wOiAlZC5cbiIpLCBwRnJtLT5USU0ubnVtX3ZibXApOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5USU0udmJtcCwgcEZybS0+VElNLm51bV92Ym1wKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQ291bnRyeTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Db3VudHJ5LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q291bnRyeS5jb3VudHJ5LCAzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fdHJpcGxldHM6ICVkLlxuIiksIHBGcm0tPkNvdW50cnkubnVtX3RyaXBsZXRzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+Q291bnRyeS50cmlwbGV0cywgMyAqIHBGcm0tPkNvdW50cnkubnVtX3RyaXBsZXRzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiRkhQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RkhQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtcy5yYWRpeCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1zLm5jaGFubmVscywgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkZIUGF0dFRhYmxlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkZIUGF0dFRhYmxlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXR0VGFibGUuZmxhZywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGF0dFRhYmxlLm5zZXRzLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXR0VGFibGUubW9kdWx1cywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGF0dFRhYmxlLm9mZnNldCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX3JhbmR0YWJsZTogJWQuXG4iKSwgcEZybS0+RkhQYXR0VGFibGUubnVtX3JhbmR0YWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPkZIUGF0dFRhYmxlLnJhbmR0YWJsZSwgcEZybS0+RkhQYXR0VGFibGUubnVtX3JhbmR0YWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlBvd2VyQ29uc3RyYWludHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UG93ZXJDb25zdHJhaW50cy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlBvd2VyQ29uc3RyYWludHMubG9jYWxQb3dlckNvbnN0cmFpbnRzLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQ2hhblN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DaGFuU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5zd2l0Y2hNb2RlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5uZXdDaGFubmVsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5zd2l0Y2hDb3VudCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlF1aWV0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlF1aWV0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UXVpZXQuY291bnQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5RdWlldC5wZXJpb2QsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5RdWlldC5kdXJhdGlvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0Lm9mZnNldCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlRQQ1JlcG9ydDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5UUENSZXBvcnQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5UUENSZXBvcnQudHhfcG93ZXIsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5UUENSZXBvcnQubGlua19tYXJnaW4sIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJFUlBJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkVSUEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm5vbl9lcnBfcHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+RVJQSW5mby5ub25fZXJwX3ByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInVzZV9wcm90ICgxKTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLnVzZV9wcm90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJiYXJrZXJfcHJlYW1ibGUgKDEpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8uYmFya2VyX3ByZWFtYmxlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1bnVzZWQgKDUpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8udW51c2VkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiRXh0U3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+RXh0U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUlNOOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJTTi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi52ZXJzaW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLmdwX2NpcGhlcl9zdWl0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlcywgNCAqIHBGcm0tPlJTTi5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5SU04uYWttX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+UlNOLmFrbV9zdWl0ZXMsIDQgKiBwRnJtLT5SU04uYWttX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJwcmVhdXRoICgxKTogJWRcbiIpLCBwRnJtLT5SU04ucHJlYXV0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibm9fcHdpc2UgKDEpOiAlZFxuIiksIHBGcm0tPlJTTi5ub19wd2lzZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUFRLU0FfcmVwbGF5X2NvdW50ZXIgKDIpOiAlZFxuIiksIHBGcm0tPlJTTi5QVEtTQV9yZXBsYXlfY291bnRlcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiR1RLU0FfcmVwbGF5X2NvdW50ZXIgKDIpOiAlZFxuIiksIHBGcm0tPlJTTi5HVEtTQV9yZXBsYXlfY291bnRlcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQgKDEwKTogJWRcbiIpLCBwRnJtLT5SU04ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5SU04ucG1raWRfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5SU04ucG1raWQsIDE2ICogcEZybS0+UlNOLnBta2lkX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUUJTU0xvYWQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UUJTU0xvYWQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5RQlNTTG9hZC5zdGFjb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlFCU1NMb2FkLmNoYXV0aWwsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5RQlNTTG9hZC5hdmFpbCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkVEQ0FQYXJhbVNldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FRENBUGFyYW1TZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQucW9zLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmVfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZpX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdm9fYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJRT1NDYXBzQXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UU9TQ2Fwc0FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZCAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc0FwLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ0eG9wcmVxICgxKTogJWRcbiIpLCBwRnJtLT5RT1NDYXBzQXAudHhvcHJlcSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicXJlcSAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc0FwLnFyZXEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInFhY2sgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNBcC5xYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJjb3VudCAoNCk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc0FwLmNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQVBDaGFubmVsUmVwb3J0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5yZWd1bGF0b3J5Q2xhc3MsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV9jaGFubmVsTGlzdDogJWQuXG4iKSwgcEZybS0+QVBDaGFubmVsUmVwb3J0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5jaGFubmVsTGlzdCwgcEZybS0+QVBDaGFubmVsUmVwb3J0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlJSTUVuYWJsZWRDYXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlJNRW5hYmxlZENhcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTGlua01lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxpbmtNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTmVpZ2hib3JScHQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JScHQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInBhcmFsbGVsICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnBhcmFsbGVsKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXBlYXRlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXBlYXRlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQmVhY29uUGFzc2l2ZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25QYXNzaXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJCZWFjb25BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJCZWFjb25UYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25UYWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQmVhY29uUmVwQ29uZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25SZXBDb25kKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJGcmFtZU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkZyYW1lTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkNoYW5uZWxMb2FkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkNoYW5uZWxMb2FkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb2lzZUhpc3RvZ3JhbSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5Ob2lzZUhpc3RvZ3JhbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgic3RhdGlzdGljcyAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5zdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJMQ0lNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTENJQXppbXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lBemltdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJUQ01DYXBhYmlsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlRDTUNhcGFiaWxpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInRyaWdnZXJlZFRDTSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC50cmlnZ2VyZWRUQ00pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkFQQ2hhblJlcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BUENoYW5SZXBvcnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlJSTU1JQkVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlJNTUlCRW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgib3BlcmF0aW5nQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5vcGVyYXRpbmdDaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJub25PcGVyYXRpbkNoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAubm9uT3BlcmF0aW5DaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk1lYXN1cmVtZW50UGlsb3RFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3RFbmFibGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOZWlnaGJvclRTRk9mZnNldCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5OZWlnaGJvclRTRk9mZnNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUkNQSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJDUElNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUlNOSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJTTklNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQnNzQXZnQWNjZXNzRGVsYXkgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQnNzQXZnQWNjZXNzRGVsYXkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkJTU0F2YWlsQWRtaXNzaW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJTU0F2YWlsQWRtaXNzaW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJBbnRlbm5hSW5mb3JtYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQW50ZW5uYUluZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk1vYmlsaXR5RG9tYWluOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPk1vYmlsaXR5RG9tYWluLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+TW9iaWxpdHlEb21haW4uTURJRCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgib3ZlckRTQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5vdmVyRFNDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJlc291cmNlUmVxQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNvdXJjZVJlcUNhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiV1BBOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldQQS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS52ZXJzaW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLm11bHRpY2FzdF9jaXBoZXIsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJzLCA0ICogcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5XUEEuYXV0aF9zdWl0ZXMsIDQgKiBwRnJtLT5XUEEuYXV0aF9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5jYXBzLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiSFRDYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWR2Q29kaW5nQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYWR2Q29kaW5nQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm1pbW9Qb3dlclNhdmUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5taW1vUG93ZXJTYXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJncmVlbkZpZWxkICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZ3JlZW5GaWVsZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgic2hvcnRHSTIwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTIwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJzaG9ydEdJNDBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zaG9ydEdJNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInR4U1RCQyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicnhTVEJDICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5kZWxheWVkQkEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm1heGltYWxBTVNEVXNpemUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJkc3NzQ2NrTW9kZTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZHNzc0Nja01vZGU0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicHNtcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBzbXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInN0YmNDb250cm9sRnJhbWUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdGJjQ29udHJvbEZyYW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm1heFJ4QU1QRFVGYWN0b3IgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJtcGR1RGVuc2l0eSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1wZHVEZW5zaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZDEgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5IVENhcHMuc3VwcG9ydGVkTUNTU2V0LCAxNik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicGNvICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucGNvKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ0cmFuc2l0aW9uVGltZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnRyYW5zaXRpb25UaW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZDIgKDUpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm1jc0ZlZWRiYWNrICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWNzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJlc2VydmVkMyAoNik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJ4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ0eFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicnhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidHhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiaW1wbGljaXRUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuaW1wbGljaXRUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJjYWxpYnJhdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNhbGlicmF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJleHBsaWNpdENTSVR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSVR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJleHBsaWNpdEJGQ1NJRmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdEJGQ1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImNzaU51bUJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jc2lOdW1CRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZDQgKDcpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFudGVubmFTZWxlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hU2VsZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyeEFTICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhBUyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidHhTb3VuZGluZ1BQRFVzICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTb3VuZGluZ1BQRFVzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZDUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5IVENhcHMucnN2ZCwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiSFRJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUSW5mby5wcmltYXJ5Q2hhbm5lbCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgic2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAoMik6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJlY29tbWVuZGVkVHhXaWR0aFNldCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlY29tbWVuZGVkVHhXaWR0aFNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmlmc01vZGUgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yaWZzTW9kZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiY29udHJvbGxlZEFjY2Vzc09ubHkgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5jb250cm9sbGVkQWNjZXNzT25seSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgic2VydmljZUludGVydmFsR3JhbnVsYXJpdHkgKDMpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5zZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgib3BNb2RlICgyKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ub3BNb2RlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJub25HRkRldmljZXNQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ubm9uR0ZEZXZpY2VzUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidHJhbnNtaXRCdXJzdExpbWl0ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8udHJhbnNtaXRCdXJzdExpbWl0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJvYnNzTm9uSFRTdGFQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ub2Jzc05vbkhUU3RhUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQgKDExKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImJhc2ljU1RCQ01DUyAoNyk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmJhc2ljU1RCQ01DUyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiZHVhbENUU1Byb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5kdWFsQ1RTUHJvdGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgic2Vjb25kYXJ5QmVhY29uICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2Vjb25kYXJ5QmVhY29uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJwY29BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5wY29BY3RpdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInBjb1BoYXNlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucGNvUGhhc2UpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJlc2VydmVkMiAoNCk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlc2VydmVkMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUSW5mby5iYXNpY01DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVEluZm8ubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5IVEluZm8ucnN2ZCwgcEZybS0+SFRJbmZvLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiRXh0Q2hhblN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FeHRDaGFuU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RXh0Q2hhblN3aXRjaEFubi5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0LCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiV01NSW5mb0FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTUluZm9BcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTUluZm9BcC52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJwYXJhbV9zZXRfY291bnQgKDQpOiAlZFxuIiksIHBGcm0tPldNTUluZm9BcC5wYXJhbV9zZXRfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJlc2VydmVkICgzKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvQXAucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInVhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvQXAudWFwc2QpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJXTU1QYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucW9zSW5mbywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5yZXNlcnZlZDIsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmVfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1bnVzZWQxICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMudW51c2VkMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmtfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2aV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdm9fYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1bnVzZWQ0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMudW51c2VkNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIldNTUNhcHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTUNhcHMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInFhY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucWFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicXVldWVfcmVxdWVzdCAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5xdWV1ZV9yZXF1ZXN0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ0eG9wX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMudHhvcF9yZXF1ZXN0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJtb3JlX2FjayAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5tb3JlX2Fjayk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIldBUEk6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V0FQSS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkudmVyc2lvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkuYWttX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+V0FQSS5ha21fc3VpdGVzLCA0ICogcEZybS0+V0FQSS5ha21fc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZXMsIDQgKiBwRnJtLT5XQVBJLnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS5tdWx0aWNhc3RfY2lwaGVyX3N1aXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJwcmVhdXRoICgxKTogJWRcbiIpLCBwRnJtLT5XQVBJLnByZWF1dGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJlc2VydmVkICgxNSk6ICVkXG4iKSwgcEZybS0+V0FQSS5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkuYmtpZF9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUEkuYmtpZCwgMTYgKiBwRnJtLT5XQVBJLmJraWRfY291bnQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJDQ1hWZXJzaW9uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hWZXJzaW9uLnZlcnNpb24sIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJDQ1hSYWRNZ210Q2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFJhZE1nbXRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hSYWRNZ210Q2FwLm1nbXRfc3RhdGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm1ic3NpZF9tYXNrICgzKTogJWRcbiIpLCBwRnJtLT5DQ1hSYWRNZ210Q2FwLm1ic3NpZF9tYXNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZCAoNSk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkNDWFRyYWZTdHJtTWV0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFRyYWZTdHJtTWV0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQudHNpZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnN0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQubXNtdF9pbnRlcnZhbCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkNDWFR4bWl0UG93ZXI6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVHhtaXRQb3dlci5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFR4bWl0UG93ZXIucG93ZXJfbGltaXQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnJlc2VydmVkLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQWlyZ286XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+QWlyZ28ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlByb3BTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5yYXRlcywgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkFQTmFtZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uQVBOYW1lLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fbmFtZTogJWQuXG4iKSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLkFQTmFtZS5uYW1lLCBwRnJtLT5BaXJnby5BUE5hbWUubnVtX25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkhDRjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uSENGLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uSENGLmVuYWJsZWQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIldEUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uV0RTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fd2RzRGF0YTogJWQuXG4iKSwgcEZybS0+QWlyZ28uV0RTLm51bV93ZHNEYXRhKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLldEUy53ZHNEYXRhLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkJQSW5kaWNhdG9yOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5CUEluZGljYXRvci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLmluZGljYXRvciwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJMb2FkSW5mbzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTG9hZEluZm8ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkSW5mby5udW1fc3RhcywgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkSW5mby5jaGFubmVsX3V0aWwsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkxvYWRCYWxhbmNlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLmJzc2lkLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlByb3BBc3NvY1R5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnR5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkxMQXR0cjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTExBdHRyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTExBdHRyLmRlZmVyX3RocmVzaG9sZCwgNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUHJvcENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENhcGFiaWxpdHkuY2FwYWJpbGl0eSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2hpcF9yZXYsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jYXJkX3R5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fYnVpbGRfdmVyc2lvbjogJWQuXG4iKSwgcEZybS0+QWlyZ28uVmVyc2lvbi5udW1fYnVpbGRfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5WZXJzaW9uLmJ1aWxkX3ZlcnNpb24sIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlByb3BFRENBUGFyYW1zOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnFvcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmVfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1bnVzZWQxICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmtfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2aV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdm9fYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1bnVzZWQ0ICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQ0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJUaXRhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGl0YW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5jb25jYXRfdGNpZF9iaXRtYXAsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29tcHJlc3Npb25fdGNpZF9iaXRtYXAsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY2Jfc3RhdGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4ucmV2X2Zjc19zdGF0ZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUHJvcENoYW5uU3dpdGNoQW5uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ubW9kZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJpbWFyeV9jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5zdWJfYmFuZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4uY2hhbm5lbF9zd2l0Y2hfY291bnQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlByb3BRdWlldEJTUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X2NvdW50LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9wZXJpb2QsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9vZmZzZXQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlRyaWdnZXJTdGFCZ1NjYW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UcmlnZ2VyU3RhQmdTY2FuLmVuYWJsZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiVGF1cnVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UYXVydXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UYXVydXMuYmFUSURCaXRtYXAsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhUG9saWN5LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYmFCdWZmZXJTaXplICgxMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLmJhQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJzdmQgKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlRhdXJ1cy5yc3ZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiV3NjQmVhY29uUHJvYmVSZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5WZXJzaW9uLm1pbm9yKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibWFqb3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY0JlYWNvblByb2JlUmVzLlZlcnNpb24ubWFqb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIldQU1N0YXRlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5XUFNTdGF0ZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvblByb2JlUmVzLldQU1N0YXRlLnN0YXRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJBUFNldHVwTG9ja2VkOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5BUFNldHVwTG9ja2VkLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuQVBTZXR1cExvY2tlZC5mTG9ja2VkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJTZWxlY3RlZFJlZ2lzdHJhcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuU2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5TZWxlY3RlZFJlZ2lzdHJhci5zZWxlY3RlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiRGV2aWNlUGFzc3dvcmRJRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuRGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvblByb2JlUmVzLkRldmljZVBhc3N3b3JkSUQuaWQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLm1ldGhvZHMsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlJlc3BvbnNlVHlwZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuUmVzcG9uc2VUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuUmVzcG9uc2VUeXBlLnJlc1R5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlVVSURfRTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuVVVJRF9FLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuVVVJRF9FLnV1aWQsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJNYW51ZmFjdHVyZXI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLk1hbnVmYWN0dXJlci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX25hbWU6ICVkLlxuIiksIHBGcm0tPldzY0JlYWNvblByb2JlUmVzLk1hbnVmYWN0dXJlci5udW1fbmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5NYW51ZmFjdHVyZXIubmFtZSwgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuTWFudWZhY3R1cmVyLm51bV9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJNb2RlbE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLk1vZGVsTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPldzY0JlYWNvblByb2JlUmVzLk1vZGVsTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5Nb2RlbE5hbWUudGV4dCwgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuTW9kZWxOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJNb2RlbE51bWJlcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuTW9kZWxOdW1iZXIucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5Nb2RlbE51bWJlci5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5Nb2RlbE51bWJlci50ZXh0LCBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5Nb2RlbE51bWJlci5udW1fdGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiU2VyaWFsTnVtYmVyOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5TZXJpYWxOdW1iZXIucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5TZXJpYWxOdW1iZXIubnVtX3RleHQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuU2VyaWFsTnVtYmVyLnRleHQsIHBGcm0tPldzY0JlYWNvblByb2JlUmVzLlNlcmlhbE51bWJlci5udW1fdGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUHJpbWFyeURldmljZVR5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLlByaW1hcnlEZXZpY2VUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuUHJpbWFyeURldmljZVR5cGUucHJpbWFyeV9jYXRlZ29yeSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5QcmltYXJ5RGV2aWNlVHlwZS5vdWksIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuUHJpbWFyeURldmljZVR5cGUuc3ViX2NhdGVnb3J5LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJEZXZpY2VOYW1lOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5EZXZpY2VOYW1lLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuRGV2aWNlTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5EZXZpY2VOYW1lLnRleHQsIHBGcm0tPldzY0JlYWNvblByb2JlUmVzLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkNvbmZpZ01ldGhvZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLkNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5Db25maWdNZXRob2RzLm1ldGhvZHMsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlJGQmFuZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLlJGQmFuZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5SRkJhbmRzLmJhbmRzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJWZW5kb3JFeHRlbnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLlZlbmRvckV4dGVuc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvblByb2JlUmVzLlZlbmRvckV4dGVuc2lvbi52ZW5kb3JJZCwgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlZlcnNpb24yOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1pbm9yKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWFqb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQXV0aG9yaXplZE1BQ3M6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MubWFjLCA2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlJlcXVlc3RUb0Vucm9sbDpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLlZlbmRvckV4dGVuc2lvbi5SZXF1ZXN0VG9FbnJvbGwucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnJlcSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJQMlBCZWFjb25Qcm9iZVJlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUDJQQ2FwYWJpbGl0eTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUENhcGFiaWxpdHkuZGV2aWNlQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBDYXBhYmlsaXR5Lmdyb3VwQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUDJQRGV2aWNlSWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUERldmljZUlkLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQRGV2aWNlSWQuUDJQRGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiRXh0ZW5kZWRMaXN0ZW5UaW1pbmc6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvblByb2JlUmVzLkV4dGVuZGVkTGlzdGVuVGltaW5nLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcuYXZhaWxpYmlsaXR5UGVyaW9kLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvblByb2JlUmVzLkV4dGVuZGVkTGlzdGVuVGltaW5nLmF2YWlsaWJpbGl0eUludGVydmFsLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3RpY2VPZkFic2VuY2U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvblByb2JlUmVzLk5vdGljZU9mQWJzZW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvblByb2JlUmVzLk5vdGljZU9mQWJzZW5jZS5pbmRleCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UuQ1RTV2luZG93T3BwUFMsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fTm9BRGVzYzogJWQuXG4iKSwgcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEJlYWNvblByb2JlUmVzLk5vdGljZU9mQWJzZW5jZS5Ob0FEZXNjLCBwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UubnVtX05vQURlc2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlAyUERldmljZUluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUERldmljZUluZm8ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBEZXZpY2VJbmZvLlAyUERldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5jb25maWdNZXRob2QsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5wcmltYXJ5RGV2aWNlVHlwZSwgOCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkRldmljZU5hbWU6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS50ZXh0LCBwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJQMlBHcm91cEluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUEdyb3VwSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX1AyUENsaWVudEluZm9EZXNjOiAlZC5cbiIpLCBwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBHcm91cEluZm8ubnVtX1AyUENsaWVudEluZm9EZXNjKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUEdyb3VwSW5mby5QMlBDbGllbnRJbmZvRGVzYywgcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQR3JvdXBJbmZvLm51bV9QMlBDbGllbnRJbmZvRGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrQmVhY29uSUVzLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0NoYW5uZWxTd2l0Y2hbXSA9IHsKKyAgICAgICAgeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmQ2hhbm5lbFN3aXRjaCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZkNoYW5uZWxTd2l0Y2gsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uICwgRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19DaGFubmVsU3dpdGNoW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmQ2hhbm5lbFN3aXRjaCwgQ2hhblN3aXRjaEFubiksIG9mZnNldG9mKHREb3QxMWZJRUNoYW5Td2l0Y2hBbm4sIHByZXNlbnQpLCAwLCAiQ2hhblN3aXRjaEFubiIgLCAwLCA1LCA1LCBTaWdJZUNoYW5Td2l0Y2hBbm4sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9DSEFOU1dJVENIQU5OLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkNoYW5uZWxTd2l0Y2gsIEV4dENoYW5Td2l0Y2hBbm4pLCBvZmZzZXRvZih0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uLCBwcmVzZW50KSwgMCwgIkV4dENoYW5Td2l0Y2hBbm4iICwgMCwgMywgMywgU2lnSWVFeHRDaGFuU3dpdGNoQW5uLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRVhUQ0hBTlNXSVRDSEFOTiwgMCwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tDaGFubmVsU3dpdGNoKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZDaGFubmVsU3dpdGNoICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfQ2hhbm5lbFN3aXRjaCwgSUVTX0NoYW5uZWxTd2l0Y2gsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgRlJGTCgiVW5wYWNrZWQgdGhlIENoYW5uZWxTd2l0Y2g6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0NIQU5ORUxTV0lUQ0gpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksIEZSRkwoIkNoYW5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q2hhblN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0NIQU5ORUxTV0lUQ0gpLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5zd2l0Y2hNb2RlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4ubmV3Q2hhbm5lbCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksICggdEFOSV9VOCogKSZwRnJtLT5DaGFuU3dpdGNoQW5uLnN3aXRjaENvdW50LCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksIEZSRkwoIkV4dENoYW5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RXh0Q2hhblN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0NIQU5ORUxTV0lUQ0gpLCAoIHRBTklfVTgqICkmcEZybS0+RXh0Q2hhblN3aXRjaEFubi5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0LCAxKTsKKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tDaGFubmVsU3dpdGNoLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0RlQXV0aFtdID0geworICAgICAgICB7ICJSZWFzb24iLCBvZmZzZXRvZih0RG90MTFmRGVBdXRoLCBSZWFzb24pLCBTaWdGZlJlYXNvbiAsIERPVDExRl9GRl9SRUFTT05fTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfRGVBdXRoW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmRGVBdXRoLCBQMlBEZUF1dGgpLCBvZmZzZXRvZih0RG90MTFmSUVQMlBEZUF1dGgsIHByZXNlbnQpLCAwLCAiUDJQRGVBdXRoIiAsIDAsIDYsIDEwLCBTaWdJZVAyUERlQXV0aCwgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQREVBVVRILCAwLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0RlQXV0aCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmRGVBdXRoICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfRGVBdXRoLCBJRVNfRGVBdXRoLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVBVVRIKSwgRlJGTCgiVW5wYWNrZWQgdGhlIERlQXV0aDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFQVVUSCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVBVVRIKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUFVVEgpLCBGUkZMKCJSZWFzb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUFVVEgpLCAoIHRBTklfVTgqICkmcEZybS0+UmVhc29uLmNvZGUsIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVBVVRIKSwgRlJGTCgiUDJQRGVBdXRoOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUERlQXV0aC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVBVVRIKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVBVVRIKSwgRlJGTCgiTWlub3JSZWFzb25Db2RlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBEZUF1dGguTWlub3JSZWFzb25Db2RlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFQVVUSCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUFVVEgpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQRGVBdXRoLk1pbm9yUmVhc29uQ29kZS5taW5vclJlYXNvbkNvZGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0RlQXV0aC4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19EZWxCQUluZFtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZEZWxCQUluZCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZkRlbEJBSW5kLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiAsIERPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorICAgICAgICB7ICJEZWxCQVBhcmFtZXRlclNldCIsIG9mZnNldG9mKHREb3QxMWZEZWxCQUluZCwgRGVsQkFQYXJhbWV0ZXJTZXQpLCBTaWdGZkRlbEJBUGFyYW1ldGVyU2V0ICwgRE9UMTFGX0ZGX0RFTEJBUEFSQU1FVEVSU0VUX0xFTiwgfSwKKyAgICAgICAgeyAiUmVhc29uIiwgb2Zmc2V0b2YodERvdDExZkRlbEJBSW5kLCBSZWFzb24pLCBTaWdGZlJlYXNvbiAsIERPVDExRl9GRl9SRUFTT05fTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfRGVsQkFJbmRbXSA9IHsKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tEZWxCQUluZCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmRGVsQkFJbmQgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19EZWxCQUluZCwgSUVTX0RlbEJBSW5kLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMQkFJTkQpLCBGUkZMKCJVbnBhY2tlZCB0aGUgRGVsQkFJbmQ6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxCQUlORCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMQkFJTkQpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTEJBSU5EKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxCQUlORCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxCQUlORCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTEJBSU5EKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMQkFJTkQpLCBGUkZMKCJEZWxCQVBhcmFtZXRlclNldDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTEJBSU5EKSwgRlJGTCgicmVzZXJ2ZWQgKDExKTogJWRcbiIpLCBwRnJtLT5EZWxCQVBhcmFtZXRlclNldC5yZXNlcnZlZCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxCQUlORCksIEZSRkwoImluaXRpYXRvciAoMSk6ICVkXG4iKSwgcEZybS0+RGVsQkFQYXJhbWV0ZXJTZXQuaW5pdGlhdG9yKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTEJBSU5EKSwgRlJGTCgidGlkICg0KTogJWRcbiIpLCBwRnJtLT5EZWxCQVBhcmFtZXRlclNldC50aWQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMQkFJTkQpLCBGUkZMKCJSZWFzb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxCQUlORCksICggdEFOSV9VOCogKSZwRnJtLT5SZWFzb24uY29kZSwgMik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0RlbEJBSW5kLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0RlbFRTW10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZkRlbFRTLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmRGVsVFMsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uICwgRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisgICAgICAgIHsgIlRTSW5mbyIsIG9mZnNldG9mKHREb3QxMWZEZWxUUywgVFNJbmZvKSwgU2lnRmZUU0luZm8gLCBET1QxMUZfRkZfVFNJTkZPX0xFTiwgfSwKKyAgICAgICAgeyAiUmVhc29uIiwgb2Zmc2V0b2YodERvdDExZkRlbFRTLCBSZWFzb24pLCBTaWdGZlJlYXNvbiAsIERPVDExRl9GRl9SRUFTT05fTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfRGVsVFNbXSA9IHsKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tEZWxUUyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmRGVsVFMgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19EZWxUUywgSUVTX0RlbFRTLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBGUkZMKCJVbnBhY2tlZCB0aGUgRGVsVFM6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBGUkZMKCJUU0luZm86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+VFNJbmZvLnRyYWZmaWNfdHlwZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlRTSW5mby50c2lkKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5UU0luZm8uZGlyZWN0aW9uKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+VFNJbmZvLmFjY2Vzc19wb2xpY3kpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+VFNJbmZvLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5UU0luZm8ucHNiKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+VFNJbmZvLnVzZXJfcHJpb3JpdHkpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+VFNJbmZvLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgic2NoZWR1bGUgKDEpOiAlZFxuIiksIHBGcm0tPlRTSW5mby5zY2hlZHVsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksIEZSRkwoInVudXNlZCAoMTUpOiAlZFxuIiksIHBGcm0tPlRTSW5mby51bnVzZWQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBGUkZMKCJSZWFzb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5SZWFzb24uY29kZSwgMik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0RlbFRTLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0RldmljZURpc2NvdmVyYWJpbGl0eVJlcVtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSAsIERPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisgICAgICAgIHsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uICwgRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSSIsIG9mZnNldG9mKHREb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEsIFAyUE9VSSksIFNpZ0ZmUDJQT1VJICwgRE9UMTFGX0ZGX1AyUE9VSV9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSVN1YlR5cGUiLCBvZmZzZXRvZih0RG90MTFmRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxLCBQMlBPVUlTdWJUeXBlKSwgU2lnRmZQMlBPVUlTdWJUeXBlICwgRE9UMTFGX0ZGX1AyUE9VSVNVQlRZUEVfTEVOLCB9LAorICAgICAgICB7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEsIERpYWxvZ1Rva2VuKSwgU2lnRmZEaWFsb2dUb2tlbiAsIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19EZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXFbXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEsIFAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSksIG9mZnNldG9mKHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSwgcHJlc2VudCksIDAsICJQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEiICwgMCwgNiwgNTYsIFNpZ0llUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwgNCwgRE9UMTFGX0VJRF9QMlBERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEsIDEsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19EZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEsIElFU19EZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJVbnBhY2tlZCB0aGUgRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIlAyUE9VSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUkub3VpLCA0KTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIlAyUE9VSVN1YlR5cGU6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJU3ViVHlwZS5vdWlTdWJ0eXBlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIlAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIlAyUERldmljZUlkOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEuUDJQRGV2aWNlSWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEuUDJQRGV2aWNlSWQuUDJQRGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgRlJGTCgiUDJQR3JvdXBJZDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxLlAyUEdyb3VwSWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEuUDJQR3JvdXBJZC5kZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcS5QMlBHcm91cElkLm51bV9zc2lkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcS5QMlBHcm91cElkLnNzaWQsIHBGcm0tPlAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcS5QMlBHcm91cElkLm51bV9zc2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzW10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcywgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcywgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiUDJQT1VJIiwgb2Zmc2V0b2YodERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcywgUDJQT1VJKSwgU2lnRmZQMlBPVUkgLCBET1QxMUZfRkZfUDJQT1VJX0xFTiwgfSwKKyAgICAgICAgeyAiUDJQT1VJU3ViVHlwZSIsIG9mZnNldG9mKHREb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMsIFAyUE9VSVN1YlR5cGUpLCBTaWdGZlAyUE9VSVN1YlR5cGUgLCBET1QxMUZfRkZfUDJQT1VJU1VCVFlQRV9MRU4sIH0sCisgICAgICAgIHsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcywgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0RldmljZURpc2NvdmVyYWJpbGl0eVJlc1tdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcywgUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzKSwgb2Zmc2V0b2YodERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzLCBwcmVzZW50KSwgMCwgIlAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyIgLCAwLCA2LCAxMCwgU2lnSWVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMsIHs4MCwgMTExLCAxNTQsIDksIDB9LCA0LCBET1QxMUZfRUlEX1AyUERFVklDRURJU0NPVkVSQUJJTElUWVJFUywgMSwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcyAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX0RldmljZURpc2NvdmVyYWJpbGl0eVJlcywgSUVTX0RldmljZURpc2NvdmVyYWJpbGl0eVJlcywgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoIlVucGFja2VkIHRoZSBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVMpLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSS5vdWksIDQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgRlJGTCgiRGlhbG9nVG9rZW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgRlJGTCgiUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgRlJGTCgiUDJQU3RhdHVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMuUDJQU3RhdHVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzLlAyUFN0YXR1cy5zdGF0dXMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0RldmljZURpc2NvdmVyYWJpbGl0eVJlcy4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19EaXNhc3NvY2lhdGlvbltdID0geworICAgICAgICB7ICJSZWFzb24iLCBvZmZzZXRvZih0RG90MTFmRGlzYXNzb2NpYXRpb24sIFJlYXNvbiksIFNpZ0ZmUmVhc29uICwgRE9UMTFGX0ZGX1JFQVNPTl9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19EaXNhc3NvY2lhdGlvbltdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZkRpc2Fzc29jaWF0aW9uLCBQMlBEaXNBc3NvYyksIG9mZnNldG9mKHREb3QxMWZJRVAyUERpc0Fzc29jLCBwcmVzZW50KSwgMCwgIlAyUERpc0Fzc29jIiAsIDAsIDYsIDEwLCBTaWdJZVAyUERpc0Fzc29jLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwgNCwgRE9UMTFGX0VJRF9QMlBESVNBU1NPQywgMCwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tEaXNhc3NvY2lhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmRGlzYXNzb2NpYXRpb24gKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19EaXNhc3NvY2lhdGlvbiwgSUVTX0Rpc2Fzc29jaWF0aW9uLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfRElTQVNTT0NJQVRJT04pLCBGUkZMKCJVbnBhY2tlZCB0aGUgRGlzYXNzb2NpYXRpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ESVNBU1NPQ0lBVElPTiksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfRElTQVNTT0NJQVRJT04pLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RJU0FTU09DSUFUSU9OKSwgRlJGTCgiUmVhc29uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfRElTQVNTT0NJQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UmVhc29uLmNvZGUsIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfRElTQVNTT0NJQVRJT04pLCBGUkZMKCJQMlBEaXNBc3NvYzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBEaXNBc3NvYy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfRElTQVNTT0NJQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ESVNBU1NPQ0lBVElPTiksIEZSRkwoIk1pbm9yUmVhc29uQ29kZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQRGlzQXNzb2MuTWlub3JSZWFzb25Db2RlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RJU0FTU09DSUFUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RJU0FTU09DSUFUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUERpc0Fzc29jLk1pbm9yUmVhc29uQ29kZS5taW5vclJlYXNvbkNvZGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0Rpc2Fzc29jaWF0aW9uLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0dPRGlzY292ZXJhYmlsaXR5UmVxW10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZkdPRGlzY292ZXJhYmlsaXR5UmVxLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJQMlBPVUkiLCBvZmZzZXRvZih0RG90MTFmR09EaXNjb3ZlcmFiaWxpdHlSZXEsIFAyUE9VSSksIFNpZ0ZmUDJQT1VJICwgRE9UMTFGX0ZGX1AyUE9VSV9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSVN1YlR5cGUiLCBvZmZzZXRvZih0RG90MTFmR09EaXNjb3ZlcmFiaWxpdHlSZXEsIFAyUE9VSVN1YlR5cGUpLCBTaWdGZlAyUE9VSVN1YlR5cGUgLCBET1QxMUZfRkZfUDJQT1VJU1VCVFlQRV9MRU4sIH0sCisgICAgICAgIHsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZkdPRGlzY292ZXJhYmlsaXR5UmVxLCBEaWFsb2dUb2tlbiksIFNpZ0ZmRGlhbG9nVG9rZW4gLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfR09EaXNjb3ZlcmFiaWxpdHlSZXFbXSA9IHsKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tHT0Rpc2NvdmVyYWJpbGl0eVJlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmR09EaXNjb3ZlcmFiaWxpdHlSZXEgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19HT0Rpc2NvdmVyYWJpbGl0eVJlcSwgSUVTX0dPRGlzY292ZXJhYmlsaXR5UmVxLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJVbnBhY2tlZCB0aGUgR09EaXNjb3ZlcmFiaWxpdHlSZXE6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT0RJU0NPVkVSQUJJTElUWVJFUSksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPRElTQ09WRVJBQklMSVRZUkVRKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT0RJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT0RJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIlAyUE9VSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPRElTQ09WRVJBQklMSVRZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSS5vdWksIDQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJQMlBPVUlTdWJUeXBlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ESVNDT1ZFUkFCSUxJVFlSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJU3ViVHlwZS5vdWlTdWJ0eXBlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPRElTQ09WRVJBQklMSVRZUkVRKSwgRlJGTCgiRGlhbG9nVG9rZW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT0RJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0dPRGlzY292ZXJhYmlsaXR5UmVxLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0dPTmVnQ25mW10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZkdPTmVnQ25mLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmR09OZWdDbmYsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uICwgRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSSIsIG9mZnNldG9mKHREb3QxMWZHT05lZ0NuZiwgUDJQT1VJKSwgU2lnRmZQMlBPVUkgLCBET1QxMUZfRkZfUDJQT1VJX0xFTiwgfSwKKyAgICAgICAgeyAiUDJQT1VJU3ViVHlwZSIsIG9mZnNldG9mKHREb3QxMWZHT05lZ0NuZiwgUDJQT1VJU3ViVHlwZSksIFNpZ0ZmUDJQT1VJU3ViVHlwZSAsIERPVDExRl9GRl9QMlBPVUlTVUJUWVBFX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmR09OZWdDbmYsIERpYWxvZ1Rva2VuKSwgU2lnRmZEaWFsb2dUb2tlbiAsIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19HT05lZ0NuZltdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZkdPTmVnQ25mLCBQMlBHT05lZ0NuZiksIG9mZnNldG9mKHREb3QxMWZJRVAyUEdPTmVnQ25mLCBwcmVzZW50KSwgMCwgIlAyUEdPTmVnQ25mIiAsIDAsIDYsIDMyMSwgU2lnSWVQMlBHT05lZ0NuZiwgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQR09ORUdDTkYsIDEsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrR09OZWdDbmYodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkdPTmVnQ25mICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfR09OZWdDbmYsIElFU19HT05lZ0NuZiwgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgiVW5wYWNrZWQgdGhlIEdPTmVnQ25mOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIlAyUE9VSVN1YlR5cGU6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgiUDJQR09OZWdDbmY6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdDbmYucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJQMlBTdGF0dXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnQ25mLlAyUFN0YXR1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ0NuZi5QMlBTdGF0dXMuc3RhdHVzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIlAyUENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnQ25mLlAyUENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdDbmYuUDJQQ2FwYWJpbGl0eS5kZXZpY2VDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdDbmYuUDJQQ2FwYWJpbGl0eS5ncm91cENhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgiT3BlcmF0aW5nQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdDbmYuT3BlcmF0aW5nQ2hhbm5lbC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ0NuZi5PcGVyYXRpbmdDaGFubmVsLmNvdW50cnlTdHJpbmcsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ0NuZi5PcGVyYXRpbmdDaGFubmVsLnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnQ25mLk9wZXJhdGluZ0NoYW5uZWwuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJDaGFubmVsTGlzdDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdDbmYuQ2hhbm5lbExpc3QucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdDbmYuQ2hhbm5lbExpc3QuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgibnVtX2NoYW5uZWxMaXN0OiAlZC5cbiIpLCBwRnJtLT5QMlBHT05lZ0NuZi5DaGFubmVsTGlzdC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSBwRnJtLT5QMlBHT05lZ0NuZi5DaGFubmVsTGlzdC5jaGFubmVsTGlzdCwgcEZybS0+UDJQR09OZWdDbmYuQ2hhbm5lbExpc3QubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIlAyUEdyb3VwSWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnQ25mLlAyUEdyb3VwSWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdDbmYuUDJQR3JvdXBJZC5kZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+UDJQR09OZWdDbmYuUDJQR3JvdXBJZC5udW1fc3NpZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEdPTmVnQ25mLlAyUEdyb3VwSWQuc3NpZCwgcEZybS0+UDJQR09OZWdDbmYuUDJQR3JvdXBJZC5udW1fc3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrR09OZWdDbmYuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfR09OZWdSZXFbXSA9IHsKKyAgICAgICAgeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmR09OZWdSZXEsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSAsIERPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisgICAgICAgIHsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZHT05lZ1JlcSwgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiUDJQT1VJIiwgb2Zmc2V0b2YodERvdDExZkdPTmVnUmVxLCBQMlBPVUkpLCBTaWdGZlAyUE9VSSAsIERPVDExRl9GRl9QMlBPVUlfTEVOLCB9LAorICAgICAgICB7ICJQMlBPVUlTdWJUeXBlIiwgb2Zmc2V0b2YodERvdDExZkdPTmVnUmVxLCBQMlBPVUlTdWJUeXBlKSwgU2lnRmZQMlBPVUlTdWJUeXBlICwgRE9UMTFGX0ZGX1AyUE9VSVNVQlRZUEVfTEVOLCB9LAorICAgICAgICB7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZHT05lZ1JlcSwgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX0dPTmVnUmVxW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmR09OZWdSZXEsIFAyUEdPTmVnV1BTKSwgb2Zmc2V0b2YodERvdDExZklFUDJQR09OZWdXUFMsIHByZXNlbnQpLCAwLCAiUDJQR09OZWdXUFMiICwgMCwgNiwgMTcsIFNpZ0llUDJQR09OZWdXUFMsIHswLCA4MCwgMjQyLCA0LCAwfSwgNCwgRE9UMTFGX0VJRF9QMlBHT05FR1dQUywgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZHT05lZ1JlcSwgUDJQR09OZWdSZXEpLCBvZmZzZXRvZih0RG90MTFmSUVQMlBHT05lZ1JlcSwgcHJlc2VudCksIDAsICJQMlBHT05lZ1JlcSIgLCAwLCA2LCAzNjQsIFNpZ0llUDJQR09OZWdSZXEsIHs4MCwgMTExLCAxNTQsIDksIDB9LCA0LCBET1QxMUZfRUlEX1AyUEdPTkVHUkVRLCAxLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja0dPTmVnUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZHT05lZ1JlcSAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX0dPTmVnUmVxLCBJRVNfR09OZWdSZXEsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIlVucGFja2VkIHRoZSBHT05lZ1JlcTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIlAyUE9VSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSS5vdWksIDQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJQMlBPVUlTdWJUeXBlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJU3ViVHlwZS5vdWlTdWJ0eXBlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiRGlhbG9nVG9rZW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIlAyUEdPTmVnV1BTOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnV1BTLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdXUFMuVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5QMlBHT05lZ1dQUy5WZXJzaW9uLm1pbm9yKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJtYWpvciAoNCk6ICVkXG4iKSwgcEZybS0+UDJQR09OZWdXUFMuVmVyc2lvbi5tYWpvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJEZXZpY2VQYXNzd29yZElEOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1dQUy5EZXZpY2VQYXNzd29yZElELnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnV1BTLkRldmljZVBhc3N3b3JkSUQuaWQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIlAyUEdPTmVnUmVxOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVxLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiUDJQQ2FwYWJpbGl0eTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXEuUDJQQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5QMlBDYXBhYmlsaXR5LmRldmljZUNhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5QMlBDYXBhYmlsaXR5Lmdyb3VwQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJHT0ludGVudDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXEuR09JbnRlbnQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuR09JbnRlbnQuR09JbnRlbnQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiQ29uZmlndXJhdGlvblRpbWVvdXQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVxLkNvbmZpZ3VyYXRpb25UaW1lb3V0LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLkNvbmZpZ3VyYXRpb25UaW1lb3V0LkdPQ29uZmlnVGltZW91dCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLkNvbmZpZ3VyYXRpb25UaW1lb3V0LkNMQ29uZmlnVGltZW91dCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJMaXN0ZW5DaGFubmVsOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1JlcS5MaXN0ZW5DaGFubmVsLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLkxpc3RlbkNoYW5uZWwuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLkxpc3RlbkNoYW5uZWwucmVndWxhdG9yeUNsYXNzLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuTGlzdGVuQ2hhbm5lbC5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIkV4dGVuZGVkTGlzdGVuVGltaW5nOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1JlcS5FeHRlbmRlZExpc3RlblRpbWluZy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlQZXJpb2QsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlJbnRlcnZhbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3M6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVxLkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5JbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MuUDJQSW50ZXJmYWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJDaGFubmVsTGlzdDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXEuQ2hhbm5lbExpc3QucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuQ2hhbm5lbExpc3QuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgibnVtX2NoYW5uZWxMaXN0OiAlZC5cbiIpLCBwRnJtLT5QMlBHT05lZ1JlcS5DaGFubmVsTGlzdC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBHT05lZ1JlcS5DaGFubmVsTGlzdC5jaGFubmVsTGlzdCwgcEZybS0+UDJQR09OZWdSZXEuQ2hhbm5lbExpc3QubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIlAyUERldmljZUluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVxLlAyUERldmljZUluZm8ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuUDJQRGV2aWNlSW5mby5QMlBEZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuUDJQRGV2aWNlSW5mby5jb25maWdNZXRob2QsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5QMlBEZXZpY2VJbmZvLnByaW1hcnlEZXZpY2VUeXBlLCA4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJEZXZpY2VOYW1lOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXEuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPlAyUEdPTmVnUmVxLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBHT05lZ1JlcS5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUudGV4dCwgcEZybS0+UDJQR09OZWdSZXEuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJPcGVyYXRpbmdDaGFubmVsOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1JlcS5PcGVyYXRpbmdDaGFubmVsLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLk9wZXJhdGluZ0NoYW5uZWwuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLk9wZXJhdGluZ0NoYW5uZWwucmVndWxhdG9yeUNsYXNzLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuT3BlcmF0aW5nQ2hhbm5lbC5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tHT05lZ1JlcS4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19HT05lZ1Jlc1tdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZHT05lZ1JlcywgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZkdPTmVnUmVzLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiAsIERPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorICAgICAgICB7ICJQMlBPVUkiLCBvZmZzZXRvZih0RG90MTFmR09OZWdSZXMsIFAyUE9VSSksIFNpZ0ZmUDJQT1VJICwgRE9UMTFGX0ZGX1AyUE9VSV9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSVN1YlR5cGUiLCBvZmZzZXRvZih0RG90MTFmR09OZWdSZXMsIFAyUE9VSVN1YlR5cGUpLCBTaWdGZlAyUE9VSVN1YlR5cGUgLCBET1QxMUZfRkZfUDJQT1VJU1VCVFlQRV9MRU4sIH0sCisgICAgICAgIHsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZkdPTmVnUmVzLCBEaWFsb2dUb2tlbiksIFNpZ0ZmRGlhbG9nVG9rZW4gLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfR09OZWdSZXNbXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZHT05lZ1JlcywgUDJQR09OZWdXUFMpLCBvZmZzZXRvZih0RG90MTFmSUVQMlBHT05lZ1dQUywgcHJlc2VudCksIDAsICJQMlBHT05lZ1dQUyIgLCAwLCA2LCAxNywgU2lnSWVQMlBHT05lZ1dQUywgezAsIDgwLCAyNDIsIDQsIDB9LCA0LCBET1QxMUZfRUlEX1AyUEdPTkVHV1BTLCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZkdPTmVnUmVzLCBQMlBHT05lZ1JlcyksIG9mZnNldG9mKHREb3QxMWZJRVAyUEdPTmVnUmVzLCBwcmVzZW50KSwgMCwgIlAyUEdPTmVnUmVzIiAsIDAsIDYsIDM5NCwgU2lnSWVQMlBHT05lZ1JlcywgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQR09ORUdSRVMsIDEsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrR09OZWdSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZkdPTmVnUmVzICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfR09OZWdSZXMsIElFU19HT05lZ1JlcywgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiVW5wYWNrZWQgdGhlIEdPTmVnUmVzOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIlAyUE9VSVN1YlR5cGU6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiUDJQR09OZWdXUFM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdXUFMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJWZXJzaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1dQUy5WZXJzaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgibWlub3IgKDQpOiAlZFxuIiksIHBGcm0tPlAyUEdPTmVnV1BTLlZlcnNpb24ubWlub3IpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5QMlBHT05lZ1dQUy5WZXJzaW9uLm1ham9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIkRldmljZVBhc3N3b3JkSUQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnV1BTLkRldmljZVBhc3N3b3JkSUQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdXUFMuRGV2aWNlUGFzc3dvcmRJRC5pZCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiUDJQR09OZWdSZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJQMlBTdGF0dXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVzLlAyUFN0YXR1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5QMlBTdGF0dXMuc3RhdHVzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIlAyUENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVzLlAyUENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXMuUDJQQ2FwYWJpbGl0eS5kZXZpY2VDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXMuUDJQQ2FwYWJpbGl0eS5ncm91cENhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiR09JbnRlbnQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVzLkdPSW50ZW50LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVzLkdPSW50ZW50LkdPSW50ZW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIkNvbmZpZ3VyYXRpb25UaW1lb3V0OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1Jlcy5Db25maWd1cmF0aW9uVGltZW91dC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5Db25maWd1cmF0aW9uVGltZW91dC5HT0NvbmZpZ1RpbWVvdXQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5Db25maWd1cmF0aW9uVGltZW91dC5DTENvbmZpZ1RpbWVvdXQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiT3BlcmF0aW5nQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXMuT3BlcmF0aW5nQ2hhbm5lbC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5PcGVyYXRpbmdDaGFubmVsLmNvdW50cnlTdHJpbmcsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5PcGVyYXRpbmdDaGFubmVsLnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVzLk9wZXJhdGluZ0NoYW5uZWwuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3M6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVzLkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5JbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MuUDJQSW50ZXJmYWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJDaGFubmVsTGlzdDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXMuQ2hhbm5lbExpc3QucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXMuQ2hhbm5lbExpc3QuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgibnVtX2NoYW5uZWxMaXN0OiAlZC5cbiIpLCBwRnJtLT5QMlBHT05lZ1Jlcy5DaGFubmVsTGlzdC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSBwRnJtLT5QMlBHT05lZ1Jlcy5DaGFubmVsTGlzdC5jaGFubmVsTGlzdCwgcEZybS0+UDJQR09OZWdSZXMuQ2hhbm5lbExpc3QubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIlAyUERldmljZUluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVzLlAyUERldmljZUluZm8ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXMuUDJQRGV2aWNlSW5mby5QMlBEZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXMuUDJQRGV2aWNlSW5mby5jb25maWdNZXRob2QsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5QMlBEZXZpY2VJbmZvLnByaW1hcnlEZXZpY2VUeXBlLCA4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJEZXZpY2VOYW1lOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXMuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPlAyUEdPTmVnUmVzLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSBwRnJtLT5QMlBHT05lZ1Jlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUudGV4dCwgcEZybS0+UDJQR09OZWdSZXMuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJQMlBHcm91cElkOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1Jlcy5QMlBHcm91cElkLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVzLlAyUEdyb3VwSWQuZGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlAyUEdPTmVnUmVzLlAyUEdyb3VwSWQubnVtX3NzaWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSBwRnJtLT5QMlBHT05lZ1Jlcy5QMlBHcm91cElkLnNzaWQsIHBGcm0tPlAyUEdPTmVnUmVzLlAyUEdyb3VwSWQubnVtX3NzaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0dPTmVnUmVzLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0ludml0YXRpb25SZXFbXSA9IHsKKyAgICAgICAgeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmSW52aXRhdGlvblJlcSwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZkludml0YXRpb25SZXEsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uICwgRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSSIsIG9mZnNldG9mKHREb3QxMWZJbnZpdGF0aW9uUmVxLCBQMlBPVUkpLCBTaWdGZlAyUE9VSSAsIERPVDExRl9GRl9QMlBPVUlfTEVOLCB9LAorICAgICAgICB7ICJQMlBPVUlTdWJUeXBlIiwgb2Zmc2V0b2YodERvdDExZkludml0YXRpb25SZXEsIFAyUE9VSVN1YlR5cGUpLCBTaWdGZlAyUE9VSVN1YlR5cGUgLCBET1QxMUZfRkZfUDJQT1VJU1VCVFlQRV9MRU4sIH0sCisgICAgICAgIHsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZkludml0YXRpb25SZXEsIERpYWxvZ1Rva2VuKSwgU2lnRmZEaWFsb2dUb2tlbiAsIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19JbnZpdGF0aW9uUmVxW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSW52aXRhdGlvblJlcSwgUDJQSW52aXRhdGlvblJlcSksIG9mZnNldG9mKHREb3QxMWZJRVAyUEludml0YXRpb25SZXEsIHByZXNlbnQpLCAwLCAiUDJQSW52aXRhdGlvblJlcSIgLCAwLCA2LCAzODUsIFNpZ0llUDJQSW52aXRhdGlvblJlcSwgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQSU5WSVRBVElPTlJFUSwgMSwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJbnZpdGF0aW9uUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZJbnZpdGF0aW9uUmVxICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfSW52aXRhdGlvblJlcSwgSUVTX0ludml0YXRpb25SZXEsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiVW5wYWNrZWQgdGhlIEludml0YXRpb25SZXE6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIlAyUE9VSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJU3ViVHlwZS5vdWlTdWJ0eXBlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIlAyUEludml0YXRpb25SZXE6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJDb25maWd1cmF0aW9uVGltZW91dDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcS5Db25maWd1cmF0aW9uVGltZW91dC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5Db25maWd1cmF0aW9uVGltZW91dC5HT0NvbmZpZ1RpbWVvdXQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXEuQ29uZmlndXJhdGlvblRpbWVvdXQuQ0xDb25maWdUaW1lb3V0LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiSW52aXRhdGlvbkZsYWdzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLkludml0YXRpb25GbGFncy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5JbnZpdGF0aW9uRmxhZ3MuaW52aXRhdGlvbkZsYWdzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiT3BlcmF0aW5nQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcS5PcGVyYXRpbmdDaGFubmVsLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLk9wZXJhdGluZ0NoYW5uZWwuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5PcGVyYXRpbmdDaGFubmVsLnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5PcGVyYXRpbmdDaGFubmVsLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJQMlBHcm91cEJzc2lkOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLlAyUEdyb3VwQnNzaWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXEuUDJQR3JvdXBCc3NpZC5QMlBHcm91cEJzc2lkLCA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiQ2hhbm5lbExpc3Q6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEludml0YXRpb25SZXEuQ2hhbm5lbExpc3QucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXEuQ2hhbm5lbExpc3QuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJudW1fY2hhbm5lbExpc3Q6ICVkLlxuIiksIHBGcm0tPlAyUEludml0YXRpb25SZXEuQ2hhbm5lbExpc3QubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLkNoYW5uZWxMaXN0LmNoYW5uZWxMaXN0LCBwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLkNoYW5uZWxMaXN0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIlAyUEdyb3VwSWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEludml0YXRpb25SZXEuUDJQR3JvdXBJZC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBHcm91cElkLmRldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlAyUEludml0YXRpb25SZXEuUDJQR3JvdXBJZC5udW1fc3NpZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBHcm91cElkLnNzaWQsIHBGcm0tPlAyUEludml0YXRpb25SZXEuUDJQR3JvdXBJZC5udW1fc3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIlAyUERldmljZUluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEludml0YXRpb25SZXEuUDJQRGV2aWNlSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBEZXZpY2VJbmZvLlAyUERldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXEuUDJQRGV2aWNlSW5mby5jb25maWdNZXRob2QsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXEuUDJQRGV2aWNlSW5mby5wcmltYXJ5RGV2aWNlVHlwZSwgOCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJEZXZpY2VOYW1lOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPlAyUEludml0YXRpb25SZXEuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUudGV4dCwgcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tJbnZpdGF0aW9uUmVxLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX0ludml0YXRpb25SZXNbXSA9IHsKKyAgICAgICAgeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmSW52aXRhdGlvblJlcywgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZkludml0YXRpb25SZXMsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uICwgRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSSIsIG9mZnNldG9mKHREb3QxMWZJbnZpdGF0aW9uUmVzLCBQMlBPVUkpLCBTaWdGZlAyUE9VSSAsIERPVDExRl9GRl9QMlBPVUlfTEVOLCB9LAorICAgICAgICB7ICJQMlBPVUlTdWJUeXBlIiwgb2Zmc2V0b2YodERvdDExZkludml0YXRpb25SZXMsIFAyUE9VSVN1YlR5cGUpLCBTaWdGZlAyUE9VSVN1YlR5cGUgLCBET1QxMUZfRkZfUDJQT1VJU1VCVFlQRV9MRU4sIH0sCisgICAgICAgIHsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZkludml0YXRpb25SZXMsIERpYWxvZ1Rva2VuKSwgU2lnRmZEaWFsb2dUb2tlbiAsIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19JbnZpdGF0aW9uUmVzW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmSW52aXRhdGlvblJlcywgUDJQSW52aXRhdGlvblJlcyksIG9mZnNldG9mKHREb3QxMWZJRVAyUEludml0YXRpb25SZXMsIHByZXNlbnQpLCAwLCAiUDJQSW52aXRhdGlvblJlcyIgLCAwLCA2LCAyODksIFNpZ0llUDJQSW52aXRhdGlvblJlcywgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQSU5WSVRBVElPTlJFUywgMSwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tJbnZpdGF0aW9uUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZJbnZpdGF0aW9uUmVzICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfSW52aXRhdGlvblJlcywgSUVTX0ludml0YXRpb25SZXMsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiVW5wYWNrZWQgdGhlIEludml0YXRpb25SZXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksIEZSRkwoIlAyUE9VSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJU3ViVHlwZS5vdWlTdWJ0eXBlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksIEZSRkwoIlAyUEludml0YXRpb25SZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJQMlBTdGF0dXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEludml0YXRpb25SZXMuUDJQU3RhdHVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVzLlAyUFN0YXR1cy5zdGF0dXMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJDb25maWd1cmF0aW9uVGltZW91dDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcy5Db25maWd1cmF0aW9uVGltZW91dC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcy5Db25maWd1cmF0aW9uVGltZW91dC5HT0NvbmZpZ1RpbWVvdXQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXMuQ29uZmlndXJhdGlvblRpbWVvdXQuQ0xDb25maWdUaW1lb3V0LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiT3BlcmF0aW5nQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcy5PcGVyYXRpbmdDaGFubmVsLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVzLk9wZXJhdGluZ0NoYW5uZWwuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcy5PcGVyYXRpbmdDaGFubmVsLnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcy5PcGVyYXRpbmdDaGFubmVsLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJQMlBHcm91cEJzc2lkOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBJbnZpdGF0aW9uUmVzLlAyUEdyb3VwQnNzaWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXMuUDJQR3JvdXBCc3NpZC5QMlBHcm91cEJzc2lkLCA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiQ2hhbm5lbExpc3Q6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEludml0YXRpb25SZXMuQ2hhbm5lbExpc3QucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXMuQ2hhbm5lbExpc3QuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJudW1fY2hhbm5lbExpc3Q6ICVkLlxuIiksIHBGcm0tPlAyUEludml0YXRpb25SZXMuQ2hhbm5lbExpc3QubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksICggdEFOSV9VOCogKSBwRnJtLT5QMlBJbnZpdGF0aW9uUmVzLkNoYW5uZWxMaXN0LmNoYW5uZWxMaXN0LCBwRnJtLT5QMlBJbnZpdGF0aW9uUmVzLkNoYW5uZWxMaXN0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrSW52aXRhdGlvblJlcy4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19MaW5rTWVhc3VyZW1lbnRSZXBvcnRbXSA9IHsKKyAgICAgICAgeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0LCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0LCBBY3Rpb24pLCBTaWdGZkFjdGlvbiAsIERPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorICAgICAgICB7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQsIERpYWxvZ1Rva2VuKSwgU2lnRmZEaWFsb2dUb2tlbiAsIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisgICAgICAgIHsgIlRQQ0VsZUlEIiwgb2Zmc2V0b2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCwgVFBDRWxlSUQpLCBTaWdGZlRQQ0VsZUlEICwgRE9UMTFGX0ZGX1RQQ0VMRUlEX0xFTiwgfSwKKyAgICAgICAgeyAiVFBDRWxlTGVuIiwgb2Zmc2V0b2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCwgVFBDRWxlTGVuKSwgU2lnRmZUUENFbGVMZW4gLCBET1QxMUZfRkZfVFBDRUxFTEVOX0xFTiwgfSwKKyAgICAgICAgeyAiVHhQb3dlciIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQsIFR4UG93ZXIpLCBTaWdGZlR4UG93ZXIgLCBET1QxMUZfRkZfVFhQT1dFUl9MRU4sIH0sCisgICAgICAgIHsgIkxpbmtNYXJnaW4iLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0LCBMaW5rTWFyZ2luKSwgU2lnRmZMaW5rTWFyZ2luICwgRE9UMTFGX0ZGX0xJTktNQVJHSU5fTEVOLCB9LAorICAgICAgICB7ICJSeEFudGVubmFJZCIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQsIFJ4QW50ZW5uYUlkKSwgU2lnRmZSeEFudGVubmFJZCAsIERPVDExRl9GRl9SWEFOVEVOTkFJRF9MRU4sIH0sCisgICAgICAgIHsgIlR4QW50ZW5uYUlkIiwgb2Zmc2V0b2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcG9ydCwgVHhBbnRlbm5hSWQpLCBTaWdGZlR4QW50ZW5uYUlkICwgRE9UMTFGX0ZGX1RYQU5URU5OQUlEX0xFTiwgfSwKKyAgICAgICAgeyAiUkNQSSIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQsIFJDUEkpLCBTaWdGZlJDUEkgLCBET1QxMUZfRkZfUkNQSV9MRU4sIH0sCisgICAgICAgIHsgIlJTTkkiLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0LCBSU05JKSwgU2lnRmZSU05JICwgRE9UMTFGX0ZGX1JTTklfTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfTGlua01lYXN1cmVtZW50UmVwb3J0W10gPSB7CisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrTGlua01lYXN1cmVtZW50UmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19MaW5rTWVhc3VyZW1lbnRSZXBvcnQsIElFU19MaW5rTWVhc3VyZW1lbnRSZXBvcnQsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJVbnBhY2tlZCB0aGUgTGlua01lYXN1cmVtZW50UmVwb3J0OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIlRQQ0VsZUlEOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRQQ0VsZUlELlRQQ0lkLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIlRQQ0VsZUxlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5UUENFbGVMZW4uVFBDTGVuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIlR4UG93ZXI6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+VHhQb3dlci50eFBvd2VyLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkxpbmtNYXJnaW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TGlua01hcmdpbi5saW5rTWFyZ2luLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIlJ4QW50ZW5uYUlkOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJ4QW50ZW5uYUlkLmFudGVubmFJZCwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJUeEFudGVubmFJZDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5UeEFudGVubmFJZC5hbnRlbm5hSWQsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiUkNQSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5SQ1BJLnJjcGksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiUlNOSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5SU05JLnJzbmksIDEpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tMaW5rTWVhc3VyZW1lbnRSZXBvcnQuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfTGlua01lYXN1cmVtZW50UmVxdWVzdFtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0LCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCwgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICAgICAgeyAiVHhQb3dlciIsIG9mZnNldG9mKHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0LCBUeFBvd2VyKSwgU2lnRmZUeFBvd2VyICwgRE9UMTFGX0ZGX1RYUE9XRVJfTEVOLCB9LAorICAgICAgICB7ICJNYXhUeFBvd2VyIiwgb2Zmc2V0b2YodERvdDExZkxpbmtNZWFzdXJlbWVudFJlcXVlc3QsIE1heFR4UG93ZXIpLCBTaWdGZk1heFR4UG93ZXIgLCBET1QxMUZfRkZfTUFYVFhQT1dFUl9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19MaW5rTWVhc3VyZW1lbnRSZXF1ZXN0W10gPSB7CisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrTGlua01lYXN1cmVtZW50UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX0xpbmtNZWFzdXJlbWVudFJlcXVlc3QsIElFU19MaW5rTWVhc3VyZW1lbnRSZXF1ZXN0LCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIlVucGFja2VkIHRoZSBMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIlR4UG93ZXI6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlR4UG93ZXIudHhQb3dlciwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiTWF4VHhQb3dlcjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWF4VHhQb3dlci5tYXhUeFBvd2VyLCAxKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrTGlua01lYXN1cmVtZW50UmVxdWVzdC4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19NZWFzdXJlbWVudFJlcG9ydFtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZNZWFzdXJlbWVudFJlcG9ydCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZk1lYXN1cmVtZW50UmVwb3J0LCBBY3Rpb24pLCBTaWdGZkFjdGlvbiAsIERPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorICAgICAgICB7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZNZWFzdXJlbWVudFJlcG9ydCwgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX01lYXN1cmVtZW50UmVwb3J0W10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmTWVhc3VyZW1lbnRSZXBvcnQsIE1lYXN1cmVtZW50UmVwb3J0KSwgb2Zmc2V0b2YodERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQsIHByZXNlbnQpLCAwLCAiTWVhc3VyZW1lbnRSZXBvcnQiICwgMCwgNSwgMzEsIFNpZ0llTWVhc3VyZW1lbnRSZXBvcnQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9NRUFTVVJFTUVOVFJFUE9SVCwgMSwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tNZWFzdXJlbWVudFJlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19NZWFzdXJlbWVudFJlcG9ydCwgSUVTX01lYXN1cmVtZW50UmVwb3J0LCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJVbnBhY2tlZCB0aGUgTWVhc3VyZW1lbnRSZXBvcnQ6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiTWVhc3VyZW1lbnRSZXBvcnQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQudG9rZW4sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgibGF0ZSAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQubGF0ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJpbmNhcGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LmluY2FwYWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJyZWZ1c2VkICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZWZ1c2VkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInVudXNlZCAoNSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQudW51c2VkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC50eXBlLCAxKTsKKyAgICAgICAgICAgIHN3aXRjaCAocEZybS0+TWVhc3VyZW1lbnRSZXBvcnQudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQmFzaWMuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQmFzaWMubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CYXNpYy5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiYnNzICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQmFzaWMuYnNzKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgib2ZkbV9wcmVhbWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkJhc2ljLm9mZG1fcHJlYW1ibGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJ1bmlkX3NpZ25hbCAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkJhc2ljLnVuaWRfc2lnbmFsKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgicmFkZXIgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CYXNpYy5yYWRlcik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInVubWVhc3VyZWQgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CYXNpYy51bm1lYXN1cmVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgidW51c2VkICgzKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQmFzaWMudW51c2VkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQ0NBLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkNDQS5tZWFzX3N0YXJ0X3RpbWUsIDgpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkNDQS5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5DQ0EuY2NhX2J1c3lfZnJhY3Rpb24sIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5SUElIaXN0b2dyYW0uY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuUlBJSGlzdG9ncmFtLm1lYXNfc3RhcnRfdGltZSwgOCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuUlBJSGlzdG9ncmFtLm1lYXNfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkwX2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkxX2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkyX2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkzX2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk0X2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk1X2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk2X2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk3X2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24ucmVnQ2xhc3MsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkJlYWNvbi5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24ubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24ubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoImNvbmRlbnNlZF9QSFkgKDcpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24uY29uZGVuc2VkX1BIWSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInJlcG9ydGVkX2ZyYW1lX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24ucmVwb3J0ZWRfZnJhbWVfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQmVhY29uLlJDUEksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkJlYWNvbi5SU05JLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24uQlNTSUQsIDYpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkJlYWNvbi5hbnRlbm5hX2lkLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24ucGFyZW50X1RTRiwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrTWVhc3VyZW1lbnRSZXBvcnQuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfTWVhc3VyZW1lbnRSZXF1ZXN0W10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZk1lYXN1cmVtZW50UmVxdWVzdCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZk1lYXN1cmVtZW50UmVxdWVzdCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0LCBEaWFsb2dUb2tlbiksIFNpZ0ZmRGlhbG9nVG9rZW4gLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfTWVhc3VyZW1lbnRSZXF1ZXN0W10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0LCBNZWFzdXJlbWVudFJlcXVlc3QpLCBvZmZzZXRvZih0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QsIHByZXNlbnQpLCBvZmZzZXRvZih0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0LCBudW1fTWVhc3VyZW1lbnRSZXF1ZXN0KSwgIk1lYXN1cmVtZW50UmVxdWVzdCIgLCA0LCAxNiwgMTgsIFNpZ0llTWVhc3VyZW1lbnRSZXF1ZXN0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfTUVBU1VSRU1FTlRSRVFVRVNULCAxLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja01lYXN1cmVtZW50UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfTWVhc3VyZW1lbnRSZXF1ZXN0LCBJRVNfTWVhc3VyZW1lbnRSZXF1ZXN0LCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiVW5wYWNrZWQgdGhlIE1lYXN1cmVtZW50UmVxdWVzdDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5udW1fTWVhc3VyZW1lbnRSZXF1ZXN0OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJNZWFzdXJlbWVudFJlcXVlc3RbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfdG9rZW4sIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJwYXJhbGxlbCAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLnBhcmFsbGVsKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiZW5hYmxlICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0uZW5hYmxlKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgicmVxdWVzdCAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLnJlcXVlc3QpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJyZXBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5yZXBvcnQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJkdXJhdGlvbk1hbmRhdG9yeSAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLmR1cmF0aW9uTWFuZGF0b3J5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgidW51c2VkICgzKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0udW51c2VkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF90eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CYXNpYy5jaGFubmVsX25vLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmFzaWMubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmFzaWMubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkNDQS5jaGFubmVsX25vLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQ0NBLm1lYXNfc3RhcnRfdGltZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkNDQS5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuUlBJSGlzdG9ncmFtLmNoYW5uZWxfbm8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0ubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuUlBJSGlzdG9ncmFtLm1lYXNfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ucmVnQ2xhc3MsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5yYW5kb21pemF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLm1lYXNfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubWVhc19tb2RlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLkJTU0lELCA2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja01lYXN1cmVtZW50UmVxdWVzdC4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19OZWlnaGJvclJlcG9ydFJlcXVlc3RbXSA9IHsKKyAgICAgICAgeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0LCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0LCBBY3Rpb24pLCBTaWdGZkFjdGlvbiAsIERPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorICAgICAgICB7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZOZWlnaGJvclJlcG9ydFJlcXVlc3QsIERpYWxvZ1Rva2VuKSwgU2lnRmZEaWFsb2dUb2tlbiAsIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19OZWlnaGJvclJlcG9ydFJlcXVlc3RbXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZOZWlnaGJvclJlcG9ydFJlcXVlc3QsIFNTSUQpLCBvZmZzZXRvZih0RG90MTFmSUVTU0lELCBwcmVzZW50KSwgMCwgIlNTSUQiICwgMCwgMiwgMzQsIFNpZ0llU1NJRCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NTSUQsIDAsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrTmVpZ2hib3JSZXBvcnRSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZOZWlnaGJvclJlcG9ydFJlcXVlc3QgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19OZWlnaGJvclJlcG9ydFJlcXVlc3QsIElFU19OZWlnaGJvclJlcG9ydFJlcXVlc3QsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFUVVFU1QpLCBGUkZMKCJVbnBhY2tlZCB0aGUgTmVpZ2hib3JSZXBvcnRSZXF1ZXN0OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVFVRVNUKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFUVVFU1QpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksIEZSRkwoIlNTSUQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U1NJRC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVFVRVNUKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5TU0lELnNzaWQsIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja05laWdoYm9yUmVwb3J0UmVxdWVzdC4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19OZWlnaGJvclJlcG9ydFJlc3BvbnNlW10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2UsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSAsIERPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisgICAgICAgIHsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiAsIERPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorICAgICAgICB7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlLCBEaWFsb2dUb2tlbiksIFNpZ0ZmRGlhbG9nVG9rZW4gLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfTmVpZ2hib3JSZXBvcnRSZXNwb25zZVtdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2UsIE5laWdoYm9yUmVwb3J0KSwgb2Zmc2V0b2YodERvdDExZklFTmVpZ2hib3JSZXBvcnQsIHByZXNlbnQpLCBvZmZzZXRvZih0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXNwb25zZSwgbnVtX05laWdoYm9yUmVwb3J0KSwgIk5laWdoYm9yUmVwb3J0IiAsIDQsIDE1LCA1NDgsIFNpZ0llTmVpZ2hib3JSZXBvcnQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9ORUlHSEJPUlJFUE9SVCwgMCwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tOZWlnaGJvclJlcG9ydFJlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfTmVpZ2hib3JSZXBvcnRSZXNwb25zZSwgSUVTX05laWdoYm9yUmVwb3J0UmVzcG9uc2UsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiVW5wYWNrZWQgdGhlIE5laWdoYm9yUmVwb3J0UmVzcG9uc2U6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5udW1fTmVpZ2hib3JSZXBvcnQ7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJOZWlnaGJvclJlcG9ydFslZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJBUFJlYWNoYWJpbGl0eSAoMik6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uQVBSZWFjaGFiaWxpdHkpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiU2VjdXJpdHkgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlNlY3VyaXR5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIktleVNjb3BlICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5LZXlTY29wZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJTcGVjTWdtdENhcCAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uU3BlY01nbXRDYXApOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiUW9zQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5Rb3NDYXApOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiYXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uYXBzZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJycm0gKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLnJybSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJEZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLkRlbGF5ZWRCQSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJJbW1CQSAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uSW1tQkEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTW9iaWxpdHlEb21haW4gKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk1vYmlsaXR5RG9tYWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg1KTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5yZXNlcnZlZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0ucmVzZXJ2ZWQxLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5yZWd1bGF0b3J5Q2xhc3MsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlBoeVR5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiVFNGSW5mbzpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlRTRkluZm8ucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlRTRkluZm8uVHNmT2Zmc2V0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uVFNGSW5mby5CZWFjb25JbnR2bCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiQ29uZGVuc2VkQ291bnRyeVN0cjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLkNvbmRlbnNlZENvdW50cnlTdHIucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLkNvbmRlbnNlZENvdW50cnlTdHIuY291bnRyeVN0ciwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdDpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk1lYXN1cmVtZW50UGlsb3QucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk1lYXN1cmVtZW50UGlsb3QubWVhc3VyZW1lbnRQaWxvdCwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgibnVtX3ZlbmRvclNwZWNpZmljOiAlZC5cbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5NZWFzdXJlbWVudFBpbG90Lm51bV92ZW5kb3JTcGVjaWZpYyk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk1lYXN1cmVtZW50UGlsb3QudmVuZG9yU3BlY2lmaWMsIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk1lYXN1cmVtZW50UGlsb3QubnVtX3ZlbmRvclNwZWNpZmljKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJSUk1FbmFibGVkQ2FwOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJMaW5rTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuTGlua01lYXN1cmVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJOZWlnaGJvclJwdCAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5OZWlnaGJvclJwdCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgicGFyYWxsZWwgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAucGFyYWxsZWwpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoInJlcGVhdGVkICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLnJlcGVhdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJCZWFjb25QYXNzaXZlICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkJlYWNvblBhc3NpdmUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkJlYWNvbkFjdGl2ZSAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5CZWFjb25BY3RpdmUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkJlYWNvblRhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkJlYWNvblRhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJCZWFjb25SZXBDb25kICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkJlYWNvblJlcENvbmQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkZyYW1lTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuRnJhbWVNZWFzdXJlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiQ2hhbm5lbExvYWQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuQ2hhbm5lbExvYWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIk5vaXNlSGlzdG9ncmFtICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLk5vaXNlSGlzdG9ncmFtKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJzdGF0aXN0aWNzICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLnN0YXRpc3RpY3MpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkxDSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkxDSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJMQ0lBemltdXRoICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkxDSUF6aW11dGgpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIlRDTUNhcGFiaWxpdHkgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuVENNQ2FwYWJpbGl0eSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgidHJpZ2dlcmVkVENNICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLnRyaWdnZXJlZFRDTSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiQVBDaGFuUmVwb3J0ICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkFQQ2hhblJlcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiUlJNTUlCRW5hYmxlZCAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5SUk1NSUJFbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJvcGVyYXRpbmdDaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLm9wZXJhdGluZ0NoYW5NYXgpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIm5vbk9wZXJhdGluQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5ub25PcGVyYXRpbkNoYW5NYXgpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIk1lYXN1cmVtZW50UGlsb3QgKDMpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuTWVhc3VyZW1lbnRQaWxvdCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIk5laWdoYm9yVFNGT2Zmc2V0ICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLk5laWdoYm9yVFNGT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJSQ1BJTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuUkNQSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJSU05JTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuUlNOSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJCc3NBdmdBY2Nlc3NEZWxheSAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5Cc3NBdmdBY2Nlc3NEZWxheSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiQlNTQXZhaWxBZG1pc3Npb24gKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuQlNTQXZhaWxBZG1pc3Npb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkFudGVubmFJbmZvcm1hdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5BbnRlbm5hSW5mb3JtYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLnJlc2VydmVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJNdWx0aUJzc2lkOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uTXVsdGlCc3NpZC5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uTXVsdGlCc3NpZC5tYXhCU1NJREluZGljYXRvciwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgibnVtX3ZlbmRvclNwZWNpZmljOiAlZC5cbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5NdWx0aUJzc2lkLm51bV92ZW5kb3JTcGVjaWZpYyk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk11bHRpQnNzaWQudmVuZG9yU3BlY2lmaWMsIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk11bHRpQnNzaWQubnVtX3ZlbmRvclNwZWNpZmljKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrTmVpZ2hib3JSZXBvcnRSZXNwb25zZS4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19Ob3RpY2VPZkFic1tdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZOb3RpY2VPZkFicywgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiUDJQT1VJIiwgb2Zmc2V0b2YodERvdDExZk5vdGljZU9mQWJzLCBQMlBPVUkpLCBTaWdGZlAyUE9VSSAsIERPVDExRl9GRl9QMlBPVUlfTEVOLCB9LAorICAgICAgICB7ICJQMlBPVUlTdWJUeXBlIiwgb2Zmc2V0b2YodERvdDExZk5vdGljZU9mQWJzLCBQMlBPVUlTdWJUeXBlKSwgU2lnRmZQMlBPVUlTdWJUeXBlICwgRE9UMTFGX0ZGX1AyUE9VSVNVQlRZUEVfTEVOLCB9LAorICAgICAgICB7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZOb3RpY2VPZkFicywgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX05vdGljZU9mQWJzW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmTm90aWNlT2ZBYnMsIFAyUE5vdGljZU9mQWJzZW5jZSksIG9mZnNldG9mKHREb3QxMWZJRVAyUE5vdGljZU9mQWJzZW5jZSwgcHJlc2VudCksIDAsICJQMlBOb3RpY2VPZkFic2VuY2UiICwgMCwgNiwgNDcsIFNpZ0llUDJQTm90aWNlT2ZBYnNlbmNlLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwgNCwgRE9UMTFGX0VJRF9QMlBOT1RJQ0VPRkFCU0VOQ0UsIDEsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrTm90aWNlT2ZBYnModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZk5vdGljZU9mQWJzICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfTm90aWNlT2ZBYnMsIElFU19Ob3RpY2VPZkFicywgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgRlJGTCgiVW5wYWNrZWQgdGhlIE5vdGljZU9mQWJzOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9OT1RJQ0VPRkFCUyksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCBGUkZMKCJQMlBPVUk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9OT1RJQ0VPRkFCUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUkub3VpLCA0KTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSVN1YlR5cGUub3VpU3VidHlwZSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9OT1RJQ0VPRkFCUyksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCBGUkZMKCJQMlBOb3RpY2VPZkFic2VuY2U6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQTm90aWNlT2ZBYnNlbmNlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9OT1RJQ0VPRkFCUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgRlJGTCgiTm90aWNlT2ZBYnNlbmNlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBOb3RpY2VPZkFic2VuY2UuTm90aWNlT2ZBYnNlbmNlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE5vdGljZU9mQWJzZW5jZS5Ob3RpY2VPZkFic2VuY2UuaW5kZXgsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9OT1RJQ0VPRkFCUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBOb3RpY2VPZkFic2VuY2UuTm90aWNlT2ZBYnNlbmNlLkNUU1dpbmRvd09wcFBTLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCBGUkZMKCJudW1fTm9BRGVzYzogJWQuXG4iKSwgcEZybS0+UDJQTm90aWNlT2ZBYnNlbmNlLk5vdGljZU9mQWJzZW5jZS5udW1fTm9BRGVzYyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUE5vdGljZU9mQWJzZW5jZS5Ob3RpY2VPZkFic2VuY2UuTm9BRGVzYywgcEZybS0+UDJQTm90aWNlT2ZBYnNlbmNlLk5vdGljZU9mQWJzZW5jZS5udW1fTm9BRGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrTm90aWNlT2ZBYnMuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfUHJlc2VuY2VSZXFbXSA9IHsKKyAgICAgICAgeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmUHJlc2VuY2VSZXEsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSAsIERPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSSIsIG9mZnNldG9mKHREb3QxMWZQcmVzZW5jZVJlcSwgUDJQT1VJKSwgU2lnRmZQMlBPVUkgLCBET1QxMUZfRkZfUDJQT1VJX0xFTiwgfSwKKyAgICAgICAgeyAiUDJQT1VJU3ViVHlwZSIsIG9mZnNldG9mKHREb3QxMWZQcmVzZW5jZVJlcSwgUDJQT1VJU3ViVHlwZSksIFNpZ0ZmUDJQT1VJU3ViVHlwZSAsIERPVDExRl9GRl9QMlBPVUlTVUJUWVBFX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmUHJlc2VuY2VSZXEsIERpYWxvZ1Rva2VuKSwgU2lnRmZEaWFsb2dUb2tlbiAsIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19QcmVzZW5jZVJlcVtdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByZXNlbmNlUmVxLCBQMlBOb3RpY2VPZkFic2VuY2UpLCBvZmZzZXRvZih0RG90MTFmSUVQMlBOb3RpY2VPZkFic2VuY2UsIHByZXNlbnQpLCAwLCAiUDJQTm90aWNlT2ZBYnNlbmNlIiAsIDAsIDYsIDQ3LCBTaWdJZVAyUE5vdGljZU9mQWJzZW5jZSwgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQTk9USUNFT0ZBQlNFTkNFLCAxLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja1ByZXNlbmNlUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZQcmVzZW5jZVJlcSAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX1ByZXNlbmNlUmVxLCBJRVNfUHJlc2VuY2VSZXEsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksIEZSRkwoIlVucGFja2VkIHRoZSBQcmVzZW5jZVJlcTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksIEZSRkwoIlAyUE9VSVN1YlR5cGU6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgRlJGTCgiUDJQTm90aWNlT2ZBYnNlbmNlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUE5vdGljZU9mQWJzZW5jZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksIEZSRkwoIk5vdGljZU9mQWJzZW5jZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQTm90aWNlT2ZBYnNlbmNlLk5vdGljZU9mQWJzZW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBOb3RpY2VPZkFic2VuY2UuTm90aWNlT2ZBYnNlbmNlLmluZGV4LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQTm90aWNlT2ZBYnNlbmNlLk5vdGljZU9mQWJzZW5jZS5DVFNXaW5kb3dPcHBQUywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgRlJGTCgibnVtX05vQURlc2M6ICVkLlxuIiksIHBGcm0tPlAyUE5vdGljZU9mQWJzZW5jZS5Ob3RpY2VPZkFic2VuY2UubnVtX05vQURlc2MpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBOb3RpY2VPZkFic2VuY2UuTm90aWNlT2ZBYnNlbmNlLk5vQURlc2MsIHBGcm0tPlAyUE5vdGljZU9mQWJzZW5jZS5Ob3RpY2VPZkFic2VuY2UubnVtX05vQURlc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja1ByZXNlbmNlUmVxLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1ByZXNlbmNlUmVzW10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZlByZXNlbmNlUmVzLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJQMlBPVUkiLCBvZmZzZXRvZih0RG90MTFmUHJlc2VuY2VSZXMsIFAyUE9VSSksIFNpZ0ZmUDJQT1VJICwgRE9UMTFGX0ZGX1AyUE9VSV9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSVN1YlR5cGUiLCBvZmZzZXRvZih0RG90MTFmUHJlc2VuY2VSZXMsIFAyUE9VSVN1YlR5cGUpLCBTaWdGZlAyUE9VSVN1YlR5cGUgLCBET1QxMUZfRkZfUDJQT1VJU1VCVFlQRV9MRU4sIH0sCisgICAgICAgIHsgIkRpYWxvZ1Rva2VuIiwgb2Zmc2V0b2YodERvdDExZlByZXNlbmNlUmVzLCBEaWFsb2dUb2tlbiksIFNpZ0ZmRGlhbG9nVG9rZW4gLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfUHJlc2VuY2VSZXNbXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcmVzZW5jZVJlcywgUDJQUHJlc2VuY2VSZXNwb25zZSksIG9mZnNldG9mKHREb3QxMWZJRVAyUFByZXNlbmNlUmVzcG9uc2UsIHByZXNlbnQpLCAwLCAiUDJQUHJlc2VuY2VSZXNwb25zZSIgLCAwLCA2LCA1MSwgU2lnSWVQMlBQcmVzZW5jZVJlc3BvbnNlLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwgNCwgRE9UMTFGX0VJRF9QMlBQUkVTRU5DRVJFU1BPTlNFLCAxLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja1ByZXNlbmNlUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZQcmVzZW5jZVJlcyAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX1ByZXNlbmNlUmVzLCBJRVNfUHJlc2VuY2VSZXMsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksIEZSRkwoIlVucGFja2VkIHRoZSBQcmVzZW5jZVJlczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksIEZSRkwoIlAyUE9VSVN1YlR5cGU6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgRlJGTCgiUDJQUHJlc2VuY2VSZXNwb25zZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBQcmVzZW5jZVJlc3BvbnNlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgRlJGTCgiUDJQU3RhdHVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBQcmVzZW5jZVJlc3BvbnNlLlAyUFN0YXR1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcmVzZW5jZVJlc3BvbnNlLlAyUFN0YXR1cy5zdGF0dXMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgRlJGTCgiTm90aWNlT2ZBYnNlbmNlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBQcmVzZW5jZVJlc3BvbnNlLk5vdGljZU9mQWJzZW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcmVzZW5jZVJlc3BvbnNlLk5vdGljZU9mQWJzZW5jZS5pbmRleCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByZXNlbmNlUmVzcG9uc2UuTm90aWNlT2ZBYnNlbmNlLkNUU1dpbmRvd09wcFBTLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCBGUkZMKCJudW1fTm9BRGVzYzogJWQuXG4iKSwgcEZybS0+UDJQUHJlc2VuY2VSZXNwb25zZS5Ob3RpY2VPZkFic2VuY2UubnVtX05vQURlc2MpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksICggdEFOSV9VOCogKSBwRnJtLT5QMlBQcmVzZW5jZVJlc3BvbnNlLk5vdGljZU9mQWJzZW5jZS5Ob0FEZXNjLCBwRnJtLT5QMlBQcmVzZW5jZVJlc3BvbnNlLk5vdGljZU9mQWJzZW5jZS5udW1fTm9BRGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrUHJlc2VuY2VSZXMuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfUHJvYmVSZXF1ZXN0W10gPSB7CisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19Qcm9iZVJlcXVlc3RbXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlcXVlc3QsIFNTSUQpLCBvZmZzZXRvZih0RG90MTFmSUVTU0lELCBwcmVzZW50KSwgMCwgIlNTSUQiICwgMCwgMiwgMzQsIFNpZ0llU1NJRCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NTSUQsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXF1ZXN0LCBTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiU3VwcFJhdGVzIiAsIDAsIDIsIDE0LCBTaWdJZVN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NVUFBSQVRFUywgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlcXVlc3QsIFJlcXVlc3RlZEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVSZXF1ZXN0ZWRJbmZvLCBwcmVzZW50KSwgMCwgIlJlcXVlc3RlZEluZm8iICwgMCwgMiwgMjU3LCBTaWdJZVJlcXVlc3RlZEluZm8sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SRVFVRVNURURJTkZPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVxdWVzdCwgRXh0U3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFRXh0U3VwcFJhdGVzLCBwcmVzZW50KSwgMCwgIkV4dFN1cHBSYXRlcyIgLCAwLCAzLCAxNCwgU2lnSWVFeHRTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9FWFRTVVBQUkFURVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXF1ZXN0LCBEU1BhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRURTUGFyYW1zLCBwcmVzZW50KSwgMCwgIkRTUGFyYW1zIiAsIDAsIDMsIDMsIFNpZ0llRFNQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9EU1BBUkFNUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlcXVlc3QsIEhUQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRUhUQ2FwcywgcHJlc2VudCksIDAsICJIVENhcHMiICwgMCwgMjgsIDYwLCBTaWdJZUhUQ2FwcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0hUQ0FQUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlcXVlc3QsIFdzY1Byb2JlUmVxKSwgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXEsIHByZXNlbnQpLCAwLCAiV3NjUHJvYmVSZXEiICwgMCwgNiwgMjg2LCBTaWdJZVdzY1Byb2JlUmVxLCB7MCwgODAsIDI0MiwgNCwgMH0sIDQsIERPVDExRl9FSURfV1NDUFJPQkVSRVEsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXF1ZXN0LCBXRkFUUEMpLCBvZmZzZXRvZih0RG90MTFmSUVXRkFUUEMsIHByZXNlbnQpLCAwLCAiV0ZBVFBDIiAsIDAsIDksIDksIFNpZ0llV0ZBVFBDLCB7MCwgODAsIDI0MiwgOCwgMH0sIDUsIERPVDExRl9FSURfV0ZBVFBDLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVxdWVzdCwgUDJQUHJvYmVSZXEpLCBvZmZzZXRvZih0RG90MTFmSUVQMlBQcm9iZVJlcSwgcHJlc2VudCksIDAsICJQMlBQcm9iZVJlcSIgLCAwLCA2LCA0MywgU2lnSWVQMlBQcm9iZVJlcSwgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQUFJPQkVSRVEsIDAsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrUHJvYmVSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZQcm9iZVJlcXVlc3QgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19Qcm9iZVJlcXVlc3QsIElFU19Qcm9iZVJlcXVlc3QsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJVbnBhY2tlZCB0aGUgUHJvYmVSZXF1ZXN0OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlNTSUQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U1NJRC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5TU0lELnNzaWQsIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5TdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJSZXF1ZXN0ZWRJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJlcXVlc3RlZEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm51bV9yZXF1ZXN0ZWRfZWlkczogJWQuXG4iKSwgcEZybS0+UmVxdWVzdGVkSW5mby5udW1fcmVxdWVzdGVkX2VpZHMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5SZXF1ZXN0ZWRJbmZvLnJlcXVlc3RlZF9laWRzLCBwRnJtLT5SZXF1ZXN0ZWRJbmZvLm51bV9yZXF1ZXN0ZWRfZWlkcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIkV4dFN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FeHRTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPkV4dFN1cHBSYXRlcy5yYXRlcywgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIkRTUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkRTUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+RFNQYXJhbXMuY3Vycl9jaGFubmVsLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiSFRDYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiYWR2Q29kaW5nQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYWR2Q29kaW5nQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm1pbW9Qb3dlclNhdmUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5taW1vUG93ZXJTYXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJncmVlbkZpZWxkICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZ3JlZW5GaWVsZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgic2hvcnRHSTIwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTIwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJzaG9ydEdJNDBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zaG9ydEdJNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInR4U1RCQyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgicnhTVEJDICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5kZWxheWVkQkEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm1heGltYWxBTVNEVXNpemUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJkc3NzQ2NrTW9kZTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZHNzc0Nja01vZGU0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgicHNtcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBzbXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInN0YmNDb250cm9sRnJhbWUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdGJjQ29udHJvbEZyYW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm1heFJ4QU1QRFVGYWN0b3IgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJtcGR1RGVuc2l0eSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1wZHVEZW5zaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDEgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5IVENhcHMuc3VwcG9ydGVkTUNTU2V0LCAxNik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgicGNvICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucGNvKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJ0cmFuc2l0aW9uVGltZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnRyYW5zaXRpb25UaW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDIgKDUpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm1jc0ZlZWRiYWNrICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWNzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMyAoNik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgidHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInJ4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJ0eFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgicnhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgidHhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiaW1wbGljaXRUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuaW1wbGljaXRUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJjYWxpYnJhdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNhbGlicmF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENTSVR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSVR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJleHBsaWNpdEJGQ1NJRmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdEJGQ1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImNzaU51bUJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jc2lOdW1CRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJ1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDQgKDcpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImFudGVubmFTZWxlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hU2VsZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJyeEFTICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhBUyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgidHhTb3VuZGluZ1BQRFVzICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTb3VuZGluZ1BQRFVzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5IVENhcHMucnN2ZCwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiV3NjUHJvYmVSZXE6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcS5WZXJzaW9uLm1pbm9yKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibWFqb3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY1Byb2JlUmVxLlZlcnNpb24ubWFqb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlJlcXVlc3RUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5SZXF1ZXN0VHlwZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLlJlcXVlc3RUeXBlLnJlcVR5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIkNvbmZpZ01ldGhvZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLkNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5Db25maWdNZXRob2RzLm1ldGhvZHMsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlVVSURfRTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuVVVJRF9FLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXEuVVVJRF9FLnV1aWQsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJQcmltYXJ5RGV2aWNlVHlwZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuUHJpbWFyeURldmljZVR5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5QcmltYXJ5RGV2aWNlVHlwZS5wcmltYXJ5X2NhdGVnb3J5LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLlByaW1hcnlEZXZpY2VUeXBlLm91aSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5QcmltYXJ5RGV2aWNlVHlwZS5zdWJfY2F0ZWdvcnksIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlJGQmFuZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLlJGQmFuZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5SRkJhbmRzLmJhbmRzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJBc3NvY2lhdGlvblN0YXRlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5Bc3NvY2lhdGlvblN0YXRlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXEuQXNzb2NpYXRpb25TdGF0ZS5zdGF0ZSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiQ29uZmlndXJhdGlvbkVycm9yOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5Db25maWd1cmF0aW9uRXJyb3IucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5Db25maWd1cmF0aW9uRXJyb3IuZXJyb3IsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIkRldmljZVBhc3N3b3JkSUQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLkRldmljZVBhc3N3b3JkSUQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5EZXZpY2VQYXNzd29yZElELmlkLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJNYW51ZmFjdHVyZXI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLk1hbnVmYWN0dXJlci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibnVtX25hbWU6ICVkLlxuIiksIHBGcm0tPldzY1Byb2JlUmVxLk1hbnVmYWN0dXJlci5udW1fbmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NQcm9iZVJlcS5NYW51ZmFjdHVyZXIubmFtZSwgcEZybS0+V3NjUHJvYmVSZXEuTWFudWZhY3R1cmVyLm51bV9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJNb2RlbE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLk1vZGVsTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPldzY1Byb2JlUmVxLk1vZGVsTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NQcm9iZVJlcS5Nb2RlbE5hbWUudGV4dCwgcEZybS0+V3NjUHJvYmVSZXEuTW9kZWxOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJNb2RlbE51bWJlcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuTW9kZWxOdW1iZXIucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcS5Nb2RlbE51bWJlci5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NQcm9iZVJlcS5Nb2RlbE51bWJlci50ZXh0LCBwRnJtLT5Xc2NQcm9iZVJlcS5Nb2RlbE51bWJlci5udW1fdGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiRGV2aWNlTmFtZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuRGV2aWNlTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPldzY1Byb2JlUmVxLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+V3NjUHJvYmVSZXEuRGV2aWNlTmFtZS50ZXh0LCBwRnJtLT5Xc2NQcm9iZVJlcS5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJWZW5kb3JFeHRlbnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLlZlbmRvckV4dGVuc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLlZlbmRvckV4dGVuc2lvbi52ZW5kb3JJZCwgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlZlcnNpb24yOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjUHJvYmVSZXEuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1pbm9yKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcS5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWFqb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiQXV0aG9yaXplZE1BQ3M6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MubWFjLCA2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlJlcXVlc3RUb0Vucm9sbDpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLlZlbmRvckV4dGVuc2lvbi5SZXF1ZXN0VG9FbnJvbGwucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnJlcSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlJlcXVlc3REZXZpY2VUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5SZXF1ZXN0RGV2aWNlVHlwZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLlJlcXVlc3REZXZpY2VUeXBlLnByaW1hcnlfY2F0ZWdvcnksIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXEuUmVxdWVzdERldmljZVR5cGUub3VpLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLlJlcXVlc3REZXZpY2VUeXBlLnN1Yl9jYXRlZ29yeSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIldGQVRQQzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XRkFUUEMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XRkFUUEMudHhQb3dlciwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldGQVRQQy5saW5rTWFyZ2luLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiUDJQUHJvYmVSZXE6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXEucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlAyUENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUFByb2JlUmVxLlAyUENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcS5QMlBDYXBhYmlsaXR5LmRldmljZUNhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXEuUDJQQ2FwYWJpbGl0eS5ncm91cENhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlAyUERldmljZUlkOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBQcm9iZVJlcS5QMlBEZXZpY2VJZC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb2JlUmVxLlAyUERldmljZUlkLlAyUERldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIkxpc3RlbkNoYW5uZWw6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUFByb2JlUmVxLkxpc3RlbkNoYW5uZWwucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcS5MaXN0ZW5DaGFubmVsLmNvdW50cnlTdHJpbmcsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXEuTGlzdGVuQ2hhbm5lbC5yZWd1bGF0b3J5Q2xhc3MsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXEuTGlzdGVuQ2hhbm5lbC5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJFeHRlbmRlZExpc3RlblRpbWluZzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXEuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcS5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlQZXJpb2QsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXEuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcuYXZhaWxpYmlsaXR5SW50ZXJ2YWwsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk9wZXJhdGluZ0NoYW5uZWw6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUFByb2JlUmVxLk9wZXJhdGluZ0NoYW5uZWwucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcS5PcGVyYXRpbmdDaGFubmVsLmNvdW50cnlTdHJpbmcsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXEuT3BlcmF0aW5nQ2hhbm5lbC5yZWd1bGF0b3J5Q2xhc3MsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXEuT3BlcmF0aW5nQ2hhbm5lbC5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tQcm9iZVJlcXVlc3QuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfUHJvYmVSZXNwb25zZVtdID0geworICAgICAgICB7ICJUaW1lU3RhbXAiLCBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgVGltZVN0YW1wKSwgU2lnRmZUaW1lU3RhbXAgLCBET1QxMUZfRkZfVElNRVNUQU1QX0xFTiwgfSwKKyAgICAgICAgeyAiQmVhY29uSW50ZXJ2YWwiLCBvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgQmVhY29uSW50ZXJ2YWwpLCBTaWdGZkJlYWNvbkludGVydmFsICwgRE9UMTFGX0ZGX0JFQUNPTklOVEVSVkFMX0xFTiwgfSwKKyAgICAgICAgeyAiQ2FwYWJpbGl0aWVzIiwgb2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIENhcGFiaWxpdGllcyksIFNpZ0ZmQ2FwYWJpbGl0aWVzICwgRE9UMTFGX0ZGX0NBUEFCSUxJVElFU19MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19Qcm9iZVJlc3BvbnNlW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgU1NJRCksIG9mZnNldG9mKHREb3QxMWZJRVNTSUQsIHByZXNlbnQpLCAwLCAiU1NJRCIgLCAwLCAyLCAzNCwgU2lnSWVTU0lELCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfU1NJRCwgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiU3VwcFJhdGVzIiAsIDAsIDIsIDE0LCBTaWdJZVN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NVUFBSQVRFUywgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBGSFBhcmFtU2V0KSwgb2Zmc2V0b2YodERvdDExZklFRkhQYXJhbVNldCwgcHJlc2VudCksIDAsICJGSFBhcmFtU2V0IiAsIDAsIDcsIDcsIFNpZ0llRkhQYXJhbVNldCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0ZIUEFSQU1TRVQsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgRFNQYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVEU1BhcmFtcywgcHJlc2VudCksIDAsICJEU1BhcmFtcyIgLCAwLCAzLCAzLCBTaWdJZURTUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRFNQQVJBTVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgQ0ZQYXJhbXMpLCBvZmZzZXRvZih0RG90MTFmSUVDRlBhcmFtcywgcHJlc2VudCksIDAsICJDRlBhcmFtcyIgLCAwLCA4LCA4LCBTaWdJZUNGUGFyYW1zLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQ0ZQQVJBTVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgSUJTU1BhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRUlCU1NQYXJhbXMsIHByZXNlbnQpLCAwLCAiSUJTU1BhcmFtcyIgLCAwLCA0LCA0LCBTaWdJZUlCU1NQYXJhbXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9JQlNTUEFSQU1TLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIENvdW50cnkpLCBvZmZzZXRvZih0RG90MTFmSUVDb3VudHJ5LCBwcmVzZW50KSwgMCwgIkNvdW50cnkiICwgMCwgNSwgMjU3LCBTaWdJZUNvdW50cnksIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9DT1VOVFJZLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIEZIUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFRkhQYXJhbXMsIHByZXNlbnQpLCAwLCAiRkhQYXJhbXMiICwgMCwgNCwgNCwgU2lnSWVGSFBhcmFtcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0ZIUEFSQU1TLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIEZIUGF0dFRhYmxlKSwgb2Zmc2V0b2YodERvdDExZklFRkhQYXR0VGFibGUsIHByZXNlbnQpLCAwLCAiRkhQYXR0VGFibGUiICwgMCwgNiwgMjU3LCBTaWdJZUZIUGF0dFRhYmxlLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRkhQQVRUVEFCTEUsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgUG93ZXJDb25zdHJhaW50cyksIG9mZnNldG9mKHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMsIHByZXNlbnQpLCAwLCAiUG93ZXJDb25zdHJhaW50cyIgLCAwLCAzLCAzLCBTaWdJZVBvd2VyQ29uc3RyYWludHMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9QT1dFUkNPTlNUUkFJTlRTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIENoYW5Td2l0Y2hBbm4pLCBvZmZzZXRvZih0RG90MTFmSUVDaGFuU3dpdGNoQW5uLCBwcmVzZW50KSwgMCwgIkNoYW5Td2l0Y2hBbm4iICwgMCwgNSwgNSwgU2lnSWVDaGFuU3dpdGNoQW5uLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfQ0hBTlNXSVRDSEFOTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBRdWlldCksIG9mZnNldG9mKHREb3QxMWZJRVF1aWV0LCBwcmVzZW50KSwgMCwgIlF1aWV0IiAsIDAsIDgsIDgsIFNpZ0llUXVpZXQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9RVUlFVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBUUENSZXBvcnQpLCBvZmZzZXRvZih0RG90MTFmSUVUUENSZXBvcnQsIHByZXNlbnQpLCAwLCAiVFBDUmVwb3J0IiAsIDAsIDQsIDQsIFNpZ0llVFBDUmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVFBDUkVQT1JULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIEVSUEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVFUlBJbmZvLCBwcmVzZW50KSwgMCwgIkVSUEluZm8iICwgMCwgMywgMywgU2lnSWVFUlBJbmZvLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRVJQSU5GTywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBFeHRTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiAsIDAsIDMsIDE0LCBTaWdJZUV4dFN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBSU04pLCBvZmZzZXRvZih0RG90MTFmSUVSU04sIHByZXNlbnQpLCAwLCAiUlNOIiAsIDAsIDgsIDExMiwgU2lnSWVSU04sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SU04sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgUUJTU0xvYWQpLCBvZmZzZXRvZih0RG90MTFmSUVRQlNTTG9hZCwgcHJlc2VudCksIDAsICJRQlNTTG9hZCIgLCAwLCA3LCA3LCBTaWdJZVFCU1NMb2FkLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUUJTU0xPQUQsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgRURDQVBhcmFtU2V0KSwgb2Zmc2V0b2YodERvdDExZklFRURDQVBhcmFtU2V0LCBwcmVzZW50KSwgMCwgIkVEQ0FQYXJhbVNldCIgLCAwLCAyMCwgMjAsIFNpZ0llRURDQVBhcmFtU2V0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRURDQVBBUkFNU0VULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIFJSTUVuYWJsZWRDYXApLCBvZmZzZXRvZih0RG90MTFmSUVSUk1FbmFibGVkQ2FwLCBwcmVzZW50KSwgMCwgIlJSTUVuYWJsZWRDYXAiICwgMCwgNywgNywgU2lnSWVSUk1FbmFibGVkQ2FwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUlJNRU5BQkxFRENBUCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBBUENoYW5uZWxSZXBvcnQpLCBvZmZzZXRvZih0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQsIHByZXNlbnQpLCAwLCAiQVBDaGFubmVsUmVwb3J0IiAsIDAsIDMsIDUzLCBTaWdJZUFQQ2hhbm5lbFJlcG9ydCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0FQQ0hBTk5FTFJFUE9SVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBNb2JpbGl0eURvbWFpbiksIG9mZnNldG9mKHREb3QxMWZJRU1vYmlsaXR5RG9tYWluLCBwcmVzZW50KSwgMCwgIk1vYmlsaXR5RG9tYWluIiAsIDAsIDUsIDUsIFNpZ0llTW9iaWxpdHlEb21haW4sIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9NT0JJTElUWURPTUFJTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBXUEEpLCBvZmZzZXRvZih0RG90MTFmSUVXUEEsIHByZXNlbnQpLCAwLCAiV1BBIiAsIDAsIDgsIDUwLCBTaWdJZVdQQSwgezAsIDgwLCAyNDIsIDEsIDB9LCA0LCBET1QxMUZfRUlEX1dQQSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBIVENhcHMpLCBvZmZzZXRvZih0RG90MTFmSUVIVENhcHMsIHByZXNlbnQpLCAwLCAiSFRDYXBzIiAsIDAsIDI4LCA2MCwgU2lnSWVIVENhcHMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9IVENBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgSFRJbmZvKSwgb2Zmc2V0b2YodERvdDExZklFSFRJbmZvLCBwcmVzZW50KSwgMCwgIkhUSW5mbyIgLCAwLCAyNCwgNTYsIFNpZ0llSFRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfSFRJTkZPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIEV4dENoYW5Td2l0Y2hBbm4pLCBvZmZzZXRvZih0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uLCBwcmVzZW50KSwgMCwgIkV4dENoYW5Td2l0Y2hBbm4iICwgMCwgMywgMywgU2lnSWVFeHRDaGFuU3dpdGNoQW5uLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRVhUQ0hBTlNXSVRDSEFOTiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBXTU1JbmZvQXApLCBvZmZzZXRvZih0RG90MTFmSUVXTU1JbmZvQXAsIHByZXNlbnQpLCAwLCAiV01NSW5mb0FwIiAsIDAsIDksIDksIFNpZ0llV01NSW5mb0FwLCB7MCwgODAsIDI0MiwgMiwgMH0sIDUsIERPVDExRl9FSURfV01NSU5GT0FQLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIFdNTVBhcmFtcyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVBhcmFtcywgcHJlc2VudCksIDAsICJXTU1QYXJhbXMiICwgMCwgMjYsIDI2LCBTaWdJZVdNTVBhcmFtcywgezAsIDgwLCAyNDIsIDIsIDF9LCA1LCBET1QxMUZfRUlEX1dNTVBBUkFNUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBXTU1DYXBzKSwgb2Zmc2V0b2YodERvdDExZklFV01NQ2FwcywgcHJlc2VudCksIDAsICJXTU1DYXBzIiAsIDAsIDksIDksIFNpZ0llV01NQ2FwcywgezAsIDgwLCAyNDIsIDIsIDV9LCA1LCBET1QxMUZfRUlEX1dNTUNBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgV0FQSSksIG9mZnNldG9mKHREb3QxMWZJRVdBUEksIHByZXNlbnQpLCAwLCAiV0FQSSIgLCAwLCAxNCwgMTEyLCBTaWdJZVdBUEksIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9XQVBJLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIENDWFJhZE1nbXRDYXApLCBvZmZzZXRvZih0RG90MTFmSUVDQ1hSYWRNZ210Q2FwLCBwcmVzZW50KSwgMCwgIkNDWFJhZE1nbXRDYXAiICwgMCwgOCwgOCwgU2lnSWVDQ1hSYWRNZ210Q2FwLCB7MCwgNjQsIDE1MCwgMSwgMH0sIDQsIERPVDExRl9FSURfQ0NYUkFETUdNVENBUCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBDQ1hUcmFmU3RybU1ldCksIG9mZnNldG9mKHREb3QxMWZJRUNDWFRyYWZTdHJtTWV0LCBwcmVzZW50KSwgMCwgIkNDWFRyYWZTdHJtTWV0IiAsIDAsIDEwLCAxMCwgU2lnSWVDQ1hUcmFmU3RybU1ldCwgezAsIDY0LCAxNTAsIDcsIDB9LCA0LCBET1QxMUZfRUlEX0NDWFRSQUZTVFJNTUVULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIENDWFR4bWl0UG93ZXIpLCBvZmZzZXRvZih0RG90MTFmSUVDQ1hUeG1pdFBvd2VyLCBwcmVzZW50KSwgMCwgIkNDWFR4bWl0UG93ZXIiICwgMCwgOCwgOCwgU2lnSWVDQ1hUeG1pdFBvd2VyLCB7MCwgNjQsIDE1MCwgMCwgMH0sIDQsIERPVDExRl9FSURfQ0NYVFhNSVRQT1dFUiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm9iZVJlc3BvbnNlLCBBaXJnbyksIG9mZnNldG9mKHREb3QxMWZJRUFpcmdvLCBwcmVzZW50KSwgMCwgIkFpcmdvIiAsIDAsIDUsIDIzMiwgU2lnSWVBaXJnbywgezAsIDEwLCAyNDUsIDAsIDB9LCAzLCBET1QxMUZfRUlEX0FJUkdPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlByb2JlUmVzcG9uc2UsIFdzY1Byb2JlUmVzKSwgb2Zmc2V0b2YodERvdDExZklFV3NjUHJvYmVSZXMsIHByZXNlbnQpLCAwLCAiV3NjUHJvYmVSZXMiICwgMCwgNiwgMzE5LCBTaWdJZVdzY1Byb2JlUmVzLCB7MCwgODAsIDI0MiwgNCwgMH0sIDQsIERPVDExRl9FSURfV1NDUFJPQkVSRVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvYmVSZXNwb25zZSwgUDJQUHJvYmVSZXMpLCBvZmZzZXRvZih0RG90MTFmSUVQMlBQcm9iZVJlcywgcHJlc2VudCksIDAsICJQMlBQcm9iZVJlcyIgLCAwLCA2LCAxMTQxLCBTaWdJZVAyUFByb2JlUmVzLCB7ODAsIDExMSwgMTU0LCA5LCAwfSwgNCwgRE9UMTFGX0VJRF9QMlBQUk9CRVJFUywgMCwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tQcm9iZVJlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZQcm9iZVJlc3BvbnNlICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfUHJvYmVSZXNwb25zZSwgSUVTX1Byb2JlUmVzcG9uc2UsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVW5wYWNrZWQgdGhlIFByb2JlUmVzcG9uc2U6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVGltZVN0YW1wOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UaW1lU3RhbXAudGltZXN0YW1wLCA4KTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJCZWFjb25JbnRlcnZhbDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QmVhY29uSW50ZXJ2YWwuaW50ZXJ2YWwsIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkNhcGFiaWxpdGllczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJlc3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5lc3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImlic3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5pYnNzKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJjZlBvbGxhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsYWJsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiY2ZQb2xsUmVxICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsUmVxKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwcml2YWN5ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucHJpdmFjeSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgic2hvcnRQcmVhbWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInBiY2MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wYmNjKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJjaGFubmVsQWdpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNoYW5uZWxBZ2lsaXR5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJzcGVjdHJ1bU1ndCAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJxb3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5xb3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInNob3J0U2xvdFRpbWUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zaG9ydFNsb3RUaW1lKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuYXBzZCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicnJtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucnJtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJkc3NzT2ZkbSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmRzc3NPZmRtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5kZWxheWVkQkEpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImltbWVkaWF0ZUJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaW1tZWRpYXRlQkEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlNTSUQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U1NJRC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5TU0lELnNzaWQsIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiU3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkZIUGFyYW1TZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RkhQYXJhbVNldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXJhbVNldC5kd2VsbF90aW1lLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1TZXQuaG9wX3NldCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtU2V0LmhvcF9wYXR0ZXJuLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1TZXQuaG9wX2luZGV4LCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkRTUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkRTUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5EU1BhcmFtcy5jdXJyX2NoYW5uZWwsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQ0ZQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0ZQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNGUGFyYW1zLmNmcF9jb3VudCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DRlBhcmFtcy5jZnBfcGVyaW9kLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNGUGFyYW1zLmNmcF9tYXhkdXJhdGlvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DRlBhcmFtcy5jZnBfZHVycmVtYWluaW5nLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIklCU1NQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+SUJTU1BhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+SUJTU1BhcmFtcy5hdGltLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkNvdW50cnk6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q291bnRyeS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q291bnRyeS5jb3VudHJ5LCAzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX3RyaXBsZXRzOiAlZC5cbiIpLCBwRnJtLT5Db3VudHJ5Lm51bV90cmlwbGV0cyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5Db3VudHJ5LnRyaXBsZXRzLCAzICogcEZybS0+Q291bnRyeS5udW1fdHJpcGxldHMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiRkhQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RkhQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1zLnJhZGl4LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1zLm5jaGFubmVscywgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJGSFBhdHRUYWJsZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5GSFBhdHRUYWJsZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXR0VGFibGUuZmxhZywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhdHRUYWJsZS5uc2V0cywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhdHRUYWJsZS5tb2R1bHVzLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGF0dFRhYmxlLm9mZnNldCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm51bV9yYW5kdGFibGU6ICVkLlxuIiksIHBGcm0tPkZIUGF0dFRhYmxlLm51bV9yYW5kdGFibGUpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+RkhQYXR0VGFibGUucmFuZHRhYmxlLCBwRnJtLT5GSFBhdHRUYWJsZS5udW1fcmFuZHRhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlBvd2VyQ29uc3RyYWludHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UG93ZXJDb25zdHJhaW50cy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UG93ZXJDb25zdHJhaW50cy5sb2NhbFBvd2VyQ29uc3RyYWludHMsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQ2hhblN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DaGFuU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DaGFuU3dpdGNoQW5uLnN3aXRjaE1vZGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5uZXdDaGFubmVsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4uc3dpdGNoQ291bnQsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUXVpZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UXVpZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0LmNvdW50LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0LnBlcmlvZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5RdWlldC5kdXJhdGlvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5RdWlldC5vZmZzZXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVFBDUmVwb3J0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlRQQ1JlcG9ydC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LnR4X3Bvd2VyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRQQ1JlcG9ydC5saW5rX21hcmdpbiwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJFUlBJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkVSUEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibm9uX2VycF9wcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLm5vbl9lcnBfcHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVzZV9wcm90ICgxKTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLnVzZV9wcm90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYmFya2VyX3ByZWFtYmxlICgxKTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLmJhcmtlcl9wcmVhbWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZCAoNSk6ICVkXG4iKSwgcEZybS0+RVJQSW5mby51bnVzZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiRXh0U3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+RXh0U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlJTTjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SU04ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi52ZXJzaW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi5ncF9jaXBoZXJfc3VpdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlcywgNCAqIHBGcm0tPlJTTi5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLmFrbV9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5SU04uYWttX3N1aXRlcywgNCAqIHBGcm0tPlJTTi5ha21fc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwcmVhdXRoICgxKTogJWRcbiIpLCBwRnJtLT5SU04ucHJlYXV0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm5vX3B3aXNlICgxKTogJWRcbiIpLCBwRnJtLT5SU04ubm9fcHdpc2UpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJQVEtTQV9yZXBsYXlfY291bnRlciAoMik6ICVkXG4iKSwgcEZybS0+UlNOLlBUS1NBX3JlcGxheV9jb3VudGVyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiR1RLU0FfcmVwbGF5X2NvdW50ZXIgKDIpOiAlZFxuIiksIHBGcm0tPlJTTi5HVEtTQV9yZXBsYXlfY291bnRlcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICgxMCk6ICVkXG4iKSwgcEZybS0+UlNOLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi5wbWtpZF9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5SU04ucG1raWQsIDE2ICogcEZybS0+UlNOLnBta2lkX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlFCU1NMb2FkOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlFCU1NMb2FkLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5RQlNTTG9hZC5zdGFjb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5RQlNTTG9hZC5jaGF1dGlsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlFCU1NMb2FkLmF2YWlsLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkVEQ0FQYXJhbVNldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FRENBUGFyYW1TZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5xb3MsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmtfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdmlfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlJSTUVuYWJsZWRDYXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlJNRW5hYmxlZENhcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJMaW5rTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTGlua01lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTmVpZ2hib3JScHQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JScHQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwYXJhbGxlbCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5wYXJhbGxlbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJlcGVhdGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnJlcGVhdGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQmVhY29uUGFzc2l2ZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25QYXNzaXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQmVhY29uQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvbkFjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkJlYWNvblRhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvblRhYmxlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQmVhY29uUmVwQ29uZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25SZXBDb25kKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiRnJhbWVNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5GcmFtZU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQ2hhbm5lbExvYWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQ2hhbm5lbExvYWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb2lzZUhpc3RvZ3JhbSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5Ob2lzZUhpc3RvZ3JhbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInN0YXRpc3RpY3MgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuc3RhdGlzdGljcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkxDSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxDSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTENJQXppbXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lBemltdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVENNQ2FwYWJpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5UQ01DYXBhYmlsaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidHJpZ2dlcmVkVENNICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnRyaWdnZXJlZFRDTSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkFQQ2hhblJlcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BUENoYW5SZXBvcnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJSUk1NSUJFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJSTU1JQkVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJvcGVyYXRpbmdDaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLm9wZXJhdGluZ0NoYW5NYXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJub25PcGVyYXRpbkNoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAubm9uT3BlcmF0aW5DaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOZWlnaGJvclRTRk9mZnNldCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5OZWlnaGJvclRTRk9mZnNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlJDUElNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SQ1BJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJSU05JTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlNOSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQnNzQXZnQWNjZXNzRGVsYXkgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQnNzQXZnQWNjZXNzRGVsYXkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJCU1NBdmFpbEFkbWlzc2lvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CU1NBdmFpbEFkbWlzc2lvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkFudGVubmFJbmZvcm1hdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BbnRlbm5hSW5mb3JtYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJBUENoYW5uZWxSZXBvcnQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+QVBDaGFubmVsUmVwb3J0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BUENoYW5uZWxSZXBvcnQucmVndWxhdG9yeUNsYXNzLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX2NoYW5uZWxMaXN0OiAlZC5cbiIpLCBwRnJtLT5BUENoYW5uZWxSZXBvcnQubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5jaGFubmVsTGlzdCwgcEZybS0+QVBDaGFubmVsUmVwb3J0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJNb2JpbGl0eURvbWFpbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+TW9iaWxpdHlEb21haW4uTURJRCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm92ZXJEU0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ub3ZlckRTQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzb3VyY2VSZXFDYXAgKDEpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc291cmNlUmVxQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIldQQTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XUEEucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS52ZXJzaW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5tdWx0aWNhc3RfY2lwaGVyLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS51bmljYXN0X2NpcGhlcl9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJzLCA0ICogcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5hdXRoX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPldQQS5hdXRoX3N1aXRlcywgNCAqIHBGcm0tPldQQS5hdXRoX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5jYXBzLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkhUQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5IVENhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWR2Q29kaW5nQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYWR2Q29kaW5nQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgic3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibWltb1Bvd2VyU2F2ZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1pbW9Qb3dlclNhdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJncmVlbkZpZWxkICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZ3JlZW5GaWVsZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInNob3J0R0kyME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnNob3J0R0kyME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInNob3J0R0k0ME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnNob3J0R0k0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInR4U1RCQyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJ4U1RCQyAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImRlbGF5ZWRCQSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmRlbGF5ZWRCQSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1heGltYWxBTVNEVXNpemUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiZHNzc0Nja01vZGU0ME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmRzc3NDY2tNb2RlNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwc21wICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucHNtcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInN0YmNDb250cm9sRnJhbWUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdGJjQ29udHJvbEZyYW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubHNpZ1RYT1BQcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibWF4UnhBTVBEVUZhY3RvciAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3IpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJtcGR1RGVuc2l0eSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1wZHVEZW5zaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQxICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicGNvICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucGNvKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidHJhbnNpdGlvblRpbWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50cmFuc2l0aW9uVGltZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJlc2VydmVkMiAoNSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1jc0ZlZWRiYWNrICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWNzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDMgKDYpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJ0eEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJ4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidHhTdGFnZ2VyZWRTb3VuZGluZyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U3RhZ2dlcmVkU291bmRpbmcpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyeFpMRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4WkxGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidHhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImltcGxpY2l0VHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmltcGxpY2l0VHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImNhbGlicmF0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY2FsaWJyYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdENTSVR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSVR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0QkZDU0lGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0QkZDU0lGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiY3NpTnVtQkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNzaU51bUJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJ1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJjb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJlc2VydmVkNCAoNyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFudGVubmFTZWxlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hU2VsZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFja1R4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lGZWVkYmFja1R4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYW50ZW5uYUluZGljZXNGZWVkYmFja1R4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYUluZGljZXNGZWVkYmFja1R4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYUluZGljZXNGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJ4QVMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeEFTKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidHhTb3VuZGluZ1BQRFVzICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTb3VuZGluZ1BQRFVzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQ1ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ1KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX3JzdmQ6ICVkLlxuIiksIHBGcm0tPkhUQ2Fwcy5udW1fcnN2ZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5IVENhcHMucnN2ZCwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkhUSW5mbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5IVEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUSW5mby5wcmltYXJ5Q2hhbm5lbCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInNlY29uZGFyeUNoYW5uZWxPZmZzZXQgKDIpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVjb21tZW5kZWRUeFdpZHRoU2V0ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmVjb21tZW5kZWRUeFdpZHRoU2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmlmc01vZGUgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yaWZzTW9kZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImNvbnRyb2xsZWRBY2Nlc3NPbmx5ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uY29udHJvbGxlZEFjY2Vzc09ubHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJzZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgib3BNb2RlICgyKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ub3BNb2RlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibm9uR0ZEZXZpY2VzUHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm5vbkdGRGV2aWNlc1ByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJ0cmFuc21pdEJ1cnN0TGltaXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby50cmFuc21pdEJ1cnN0TGltaXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJvYnNzTm9uSFRTdGFQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ub2Jzc05vbkhUU3RhUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICgxMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYmFzaWNTVEJDTUNTICg3KTogJWRcbiIpLCBwRnJtLT5IVEluZm8uYmFzaWNTVEJDTUNTKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiZHVhbENUU1Byb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5kdWFsQ1RTUHJvdGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInNlY29uZGFyeUJlYWNvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUJlYWNvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ubHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwY29BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5wY29BY3RpdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwY29QaGFzZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnBjb1BoYXNlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQyICg0KTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmVzZXJ2ZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUSW5mby5iYXNpY01DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRJbmZvLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkhUSW5mby5yc3ZkLCBwRnJtLT5IVEluZm8ubnVtX3JzdmQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiRXh0Q2hhblN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FeHRDaGFuU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5FeHRDaGFuU3dpdGNoQW5uLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiV01NSW5mb0FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTUluZm9BcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NSW5mb0FwLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwYXJhbV9zZXRfY291bnQgKDQpOiAlZFxuIiksIHBGcm0tPldNTUluZm9BcC5wYXJhbV9zZXRfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoMyk6ICVkXG4iKSwgcEZybS0+V01NSW5mb0FwLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9BcC51YXBzZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJXTU1QYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucW9zSW5mbywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucmVzZXJ2ZWQyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmtfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdmlfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIldNTUNhcHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NQ2Fwcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJxYWNrICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnFhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJxdWV1ZV9yZXF1ZXN0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnF1ZXVlX3JlcXVlc3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJ0eG9wX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMudHhvcF9yZXF1ZXN0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibW9yZV9hY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMubW9yZV9hY2spOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiV0FQSTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XQVBJLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLnZlcnNpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS5ha21fc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+V0FQSS5ha21fc3VpdGVzLCA0ICogcEZybS0+V0FQSS5ha21fc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5XQVBJLnVuaWNhc3RfY2lwaGVyX3N1aXRlcywgNCAqIHBGcm0tPldBUEkudW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS5tdWx0aWNhc3RfY2lwaGVyX3N1aXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicHJlYXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+V0FQSS5wcmVhdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDE1KTogJWRcbiIpLCBwRnJtLT5XQVBJLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkuYmtpZF9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5XQVBJLmJraWQsIDE2ICogcEZybS0+V0FQSS5ia2lkX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkNDWFJhZE1nbXRDYXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYUmFkTWdtdENhcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYUmFkTWdtdENhcC5tZ210X3N0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibWJzc2lkX21hc2sgKDMpOiAlZFxuIiksIHBGcm0tPkNDWFJhZE1nbXRDYXAubWJzc2lkX21hc2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoNSk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJDQ1hUcmFmU3RybU1ldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUcmFmU3RybU1ldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQudHNpZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC5zdGF0ZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC5tc210X2ludGVydmFsLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkNDWFR4bWl0UG93ZXI6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVHhtaXRQb3dlci5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHhtaXRQb3dlci5wb3dlcl9saW1pdCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnJlc2VydmVkLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkFpcmdvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlByb3BTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5yYXRlcywgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJBUE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkFQTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fbmFtZTogJWQuXG4iKSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5BUE5hbWUubmFtZSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiSENGOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5IQ0YucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkhDRi5lbmFibGVkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiV0RTOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5XRFMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX3dkc0RhdGE6ICVkLlxuIiksIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uV0RTLndkc0RhdGEsIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkJQSW5kaWNhdG9yOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5CUEluZGljYXRvci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IuaW5kaWNhdG9yLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTG9hZEluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkSW5mby5udW1fc3RhcywgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8uY2hhbm5lbF91dGlsLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTG9hZEJhbGFuY2U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlByb3BBc3NvY1R5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkxMQXR0cjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTExBdHRyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5MTEF0dHIuZGVmZXJfdGhyZXNob2xkLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUHJvcENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jaGlwX3JldiwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jYXJkX3R5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX2J1aWxkX3ZlcnNpb246ICVkLlxuIiksIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlZlcnNpb24uYnVpbGRfdmVyc2lvbiwgcEZybS0+QWlyZ28uVmVyc2lvbi5udW1fYnVpbGRfdmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlByb3BFRENBUGFyYW1zOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucW9zLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JlX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JrX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlRpdGFuOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UaXRhbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29uY2F0X3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5jb21wcmVzc2lvbl90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY2Jfc3RhdGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLnJldl9mY3Nfc3RhdGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJQcm9wQ2hhbm5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLm1vZGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5wcmltYXJ5X2NoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5zdWJfYmFuZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLmNoYW5uZWxfc3dpdGNoX2NvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUHJvcFF1aWV0QlNTOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X3BlcmlvZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfb2Zmc2V0LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVHJpZ2dlclN0YUJnU2NhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5lbmFibGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJUYXVydXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRhdXJ1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhVElEQml0bWFwLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UYXVydXMuYmFQb2xpY3ksIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYmFCdWZmZXJTaXplICgxMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLmJhQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyc3ZkICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMucnN2ZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJXc2NQcm9iZVJlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJWZXJzaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5WZXJzaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5WZXJzaW9uLm1pbm9yKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5WZXJzaW9uLm1ham9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiV1BTU3RhdGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLldQU1N0YXRlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5XUFNTdGF0ZS5zdGF0ZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkFQU2V0dXBMb2NrZWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLkFQU2V0dXBMb2NrZWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLkFQU2V0dXBMb2NrZWQuZkxvY2tlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlNlbGVjdGVkUmVnaXN0cmFyOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5TZWxlY3RlZFJlZ2lzdHJhci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXMuU2VsZWN0ZWRSZWdpc3RyYXIuc2VsZWN0ZWQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJEZXZpY2VQYXNzd29yZElEOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5EZXZpY2VQYXNzd29yZElELnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5EZXZpY2VQYXNzd29yZElELmlkLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5tZXRob2RzLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUmVzcG9uc2VUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5SZXNwb25zZVR5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLlJlc3BvbnNlVHlwZS5yZXNUeXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVVVJRF9FOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5VVUlEX0UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLlVVSURfRS51dWlkLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk1hbnVmYWN0dXJlcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXMuTWFudWZhY3R1cmVyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm51bV9uYW1lOiAlZC5cbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5NYW51ZmFjdHVyZXIubnVtX25hbWUpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPldzY1Byb2JlUmVzLk1hbnVmYWN0dXJlci5uYW1lLCBwRnJtLT5Xc2NQcm9iZVJlcy5NYW51ZmFjdHVyZXIubnVtX25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJNb2RlbE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLk1vZGVsTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+V3NjUHJvYmVSZXMuTW9kZWxOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NQcm9iZVJlcy5Nb2RlbE5hbWUudGV4dCwgcEZybS0+V3NjUHJvYmVSZXMuTW9kZWxOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTW9kZWxOdW1iZXI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLk1vZGVsTnVtYmVyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5Nb2RlbE51bWJlci5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+V3NjUHJvYmVSZXMuTW9kZWxOdW1iZXIudGV4dCwgcEZybS0+V3NjUHJvYmVSZXMuTW9kZWxOdW1iZXIubnVtX3RleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJTZXJpYWxOdW1iZXI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLlNlcmlhbE51bWJlci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+V3NjUHJvYmVSZXMuU2VyaWFsTnVtYmVyLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NQcm9iZVJlcy5TZXJpYWxOdW1iZXIudGV4dCwgcEZybS0+V3NjUHJvYmVSZXMuU2VyaWFsTnVtYmVyLm51bV90ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUHJpbWFyeURldmljZVR5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLlByaW1hcnlEZXZpY2VUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5QcmltYXJ5RGV2aWNlVHlwZS5wcmltYXJ5X2NhdGVnb3J5LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5QcmltYXJ5RGV2aWNlVHlwZS5vdWksIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLlByaW1hcnlEZXZpY2VUeXBlLnN1Yl9jYXRlZ29yeSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkRldmljZU5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLkRldmljZU5hbWUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPldzY1Byb2JlUmVzLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPldzY1Byb2JlUmVzLkRldmljZU5hbWUudGV4dCwgcEZybS0+V3NjUHJvYmVSZXMuRGV2aWNlTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkNvbmZpZ01ldGhvZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLkNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLkNvbmZpZ01ldGhvZHMubWV0aG9kcywgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlJGQmFuZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLlJGQmFuZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLlJGQmFuZHMuYmFuZHMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJWZW5kb3JFeHRlbnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLlZlbmRvckV4dGVuc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLnZlbmRvcklkLCAzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlZlcnNpb24yOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWlub3IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWFqb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkF1dGhvcml6ZWRNQUNzOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLkF1dGhvcml6ZWRNQUNzLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MubWFjLCA2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJSZXF1ZXN0VG9FbnJvbGw6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnJlcSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUDJQUHJvYmVSZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUDJQQ2FwYWJpbGl0eTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMuUDJQQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXMuUDJQQ2FwYWJpbGl0eS5kZXZpY2VDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcy5QMlBDYXBhYmlsaXR5Lmdyb3VwQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkV4dGVuZGVkTGlzdGVuVGltaW5nOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBQcm9iZVJlcy5FeHRlbmRlZExpc3RlblRpbWluZy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXMuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcuYXZhaWxpYmlsaXR5UGVyaW9kLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcy5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlJbnRlcnZhbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdGljZU9mQWJzZW5jZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UuaW5kZXgsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb2JlUmVzLk5vdGljZU9mQWJzZW5jZS5DVFNXaW5kb3dPcHBQUywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fTm9BRGVzYzogJWQuXG4iKSwgcEZybS0+UDJQUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBQcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UuTm9BRGVzYywgcEZybS0+UDJQUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUDJQRGV2aWNlSW5mbzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5QMlBEZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcy5QMlBEZXZpY2VJbmZvLmNvbmZpZ01ldGhvZCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5wcmltYXJ5RGV2aWNlVHlwZSwgOCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJEZXZpY2VOYW1lOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5QMlBQcm9iZVJlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBQcm9iZVJlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUudGV4dCwgcEZybS0+UDJQUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlAyUEdyb3VwSW5mbzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMuUDJQR3JvdXBJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm51bV9QMlBDbGllbnRJbmZvRGVzYzogJWQuXG4iKSwgcEZybS0+UDJQUHJvYmVSZXMuUDJQR3JvdXBJbmZvLm51bV9QMlBDbGllbnRJbmZvRGVzYyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQUHJvYmVSZXMuUDJQR3JvdXBJbmZvLlAyUENsaWVudEluZm9EZXNjLCBwRnJtLT5QMlBQcm9iZVJlcy5QMlBHcm91cEluZm8ubnVtX1AyUENsaWVudEluZm9EZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tQcm9iZVJlc3BvbnNlLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1Byb3Zpc2lvbkRpc2NvdmVyeVJlcVtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZQcm92aXNpb25EaXNjb3ZlcnlSZXEsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSAsIERPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisgICAgICAgIHsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZQcm92aXNpb25EaXNjb3ZlcnlSZXEsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uICwgRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSSIsIG9mZnNldG9mKHREb3QxMWZQcm92aXNpb25EaXNjb3ZlcnlSZXEsIFAyUE9VSSksIFNpZ0ZmUDJQT1VJICwgRE9UMTFGX0ZGX1AyUE9VSV9MRU4sIH0sCisgICAgICAgIHsgIlAyUE9VSVN1YlR5cGUiLCBvZmZzZXRvZih0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVxLCBQMlBPVUlTdWJUeXBlKSwgU2lnRmZQMlBPVUlTdWJUeXBlICwgRE9UMTFGX0ZGX1AyUE9VSVNVQlRZUEVfTEVOLCB9LAorICAgICAgICB7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZQcm92aXNpb25EaXNjb3ZlcnlSZXEsIERpYWxvZ1Rva2VuKSwgU2lnRmZEaWFsb2dUb2tlbiAsIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19Qcm92aXNpb25EaXNjb3ZlcnlSZXFbXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZQcm92aXNpb25EaXNjb3ZlcnlSZXEsIFAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSksIG9mZnNldG9mKHREb3QxMWZJRVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSwgcHJlc2VudCksIDAsICJQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEiICwgMCwgNiwgMTA3LCBTaWdJZVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSwgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQUFJPVklTSU9ORElTQ09WRVJZUkVRLCAxLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja1Byb3Zpc2lvbkRpc2NvdmVyeVJlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVxICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfUHJvdmlzaW9uRGlzY292ZXJ5UmVxLCBJRVNfUHJvdmlzaW9uRGlzY292ZXJ5UmVxLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiVW5wYWNrZWQgdGhlIFByb3Zpc2lvbkRpc2NvdmVyeVJlcTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJQMlBPVUk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJQMlBPVUlTdWJUeXBlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSVN1YlR5cGUub3VpU3VidHlwZSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXE6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJQMlBDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBDYXBhYmlsaXR5LmRldmljZUNhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLlAyUENhcGFiaWxpdHkuZ3JvdXBDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJQMlBEZXZpY2VJbmZvOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQRGV2aWNlSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBEZXZpY2VJbmZvLlAyUERldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLlAyUERldmljZUluZm8uY29uZmlnTWV0aG9kLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBEZXZpY2VJbmZvLnByaW1hcnlEZXZpY2VUeXBlLCA4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiRGV2aWNlTmFtZTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLnRleHQsIHBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJQMlBHcm91cElkOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQR3JvdXBJZC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBHcm91cElkLmRldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLlAyUEdyb3VwSWQubnVtX3NzaWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLlAyUEdyb3VwSWQuc3NpZCwgcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLlAyUEdyb3VwSWQubnVtX3NzaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja1Byb3Zpc2lvbkRpc2NvdmVyeVJlcS4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19Qcm92aXNpb25EaXNjb3ZlcnlSZXNbXSA9IHsKKyAgICAgICAgeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVzLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVzLCBBY3Rpb24pLCBTaWdGZkFjdGlvbiAsIERPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorICAgICAgICB7ICJQMlBPVUkiLCBvZmZzZXRvZih0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVzLCBQMlBPVUkpLCBTaWdGZlAyUE9VSSAsIERPVDExRl9GRl9QMlBPVUlfTEVOLCB9LAorICAgICAgICB7ICJQMlBPVUlTdWJUeXBlIiwgb2Zmc2V0b2YodERvdDExZlByb3Zpc2lvbkRpc2NvdmVyeVJlcywgUDJQT1VJU3ViVHlwZSksIFNpZ0ZmUDJQT1VJU3ViVHlwZSAsIERPVDExRl9GRl9QMlBPVUlTVUJUWVBFX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVzLCBEaWFsb2dUb2tlbiksIFNpZ0ZmRGlhbG9nVG9rZW4gLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfUHJvdmlzaW9uRGlzY292ZXJ5UmVzW10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVzLCBQMlBXU0NQcm92aXNpb25EaXNjb3ZlcnlSZXMpLCBvZmZzZXRvZih0RG90MTFmSUVQMlBXU0NQcm92aXNpb25EaXNjb3ZlcnlSZXMsIHByZXNlbnQpLCAwLCAiUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzIiAsIDAsIDYsIDEyLCBTaWdJZVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcywgezAsIDgwLCAyNDIsIDQsIDB9LCA0LCBET1QxMUZfRUlEX1AyUFdTQ1BST1ZJU0lPTkRJU0NPVkVSWVJFUywgMSwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tQcm92aXNpb25EaXNjb3ZlcnlSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZlByb3Zpc2lvbkRpc2NvdmVyeVJlcyAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX1Byb3Zpc2lvbkRpc2NvdmVyeVJlcywgSUVTX1Byb3Zpc2lvbkRpc2NvdmVyeVJlcywgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUyksIEZSRkwoIlVucGFja2VkIHRoZSBQcm92aXNpb25EaXNjb3ZlcnlSZXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVMpLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUyksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSS5vdWksIDQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiRGlhbG9nVG9rZW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiQ29uZmlnTWV0aG9kczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzLkNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBXU0NQcm92aXNpb25EaXNjb3ZlcnlSZXMuQ29uZmlnTWV0aG9kcy5tZXRob2RzLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tQcm92aXNpb25EaXNjb3ZlcnlSZXMuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfUmFkaW9NZWFzdXJlbWVudFJlcG9ydFtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVwb3J0LCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydCwgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1JhZGlvTWVhc3VyZW1lbnRSZXBvcnRbXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVwb3J0LCBNZWFzdXJlbWVudFJlcG9ydCksIG9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0LCBwcmVzZW50KSwgb2Zmc2V0b2YodERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXBvcnQsIG51bV9NZWFzdXJlbWVudFJlcG9ydCksICJNZWFzdXJlbWVudFJlcG9ydCIgLCA0LCA1LCAzMSwgU2lnSWVNZWFzdXJlbWVudFJlcG9ydCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX01FQVNVUkVNRU5UUkVQT1JULCAxLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja1JhZGlvTWVhc3VyZW1lbnRSZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19SYWRpb01lYXN1cmVtZW50UmVwb3J0LCBJRVNfUmFkaW9NZWFzdXJlbWVudFJlcG9ydCwgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJVbnBhY2tlZCB0aGUgUmFkaW9NZWFzdXJlbWVudFJlcG9ydDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiRGlhbG9nVG9rZW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9NZWFzdXJlbWVudFJlcG9ydDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIk1lYXN1cmVtZW50UmVwb3J0WyVkXTpcbiIpLCBpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnRva2VuLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoImxhdGUgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLmxhdGUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiaW5jYXBhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5pbmNhcGFibGUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgicmVmdXNlZCAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVmdXNlZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJ1bnVzZWQgKDUpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnVudXNlZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0udHlwZSwgMSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS50eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkJhc2ljLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkJhc2ljLm1lYXNfc3RhcnRfdGltZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmFzaWMubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoImJzcyAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkJhc2ljLmJzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIm9mZG1fcHJlYW1ibGUgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CYXNpYy5vZmRtX3ByZWFtYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgidW5pZF9zaWduYWwgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CYXNpYy51bmlkX3NpZ25hbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInJhZGVyICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmFzaWMucmFkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJ1bm1lYXN1cmVkICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmFzaWMudW5tZWFzdXJlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInVudXNlZCAoMyk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkJhc2ljLnVudXNlZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQ0NBLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkNDQS5tZWFzX3N0YXJ0X3RpbWUsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkNDQS5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5DQ0EuY2NhX2J1c3lfZnJhY3Rpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LlJQSUhpc3RvZ3JhbS5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5SUElIaXN0b2dyYW0ubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5SUElIaXN0b2dyYW0ubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTBfZGVuc2l0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTFfZGVuc2l0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTJfZGVuc2l0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTNfZGVuc2l0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTRfZGVuc2l0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTVfZGVuc2l0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTZfZGVuc2l0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTdfZGVuc2l0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmVhY29uLnJlZ0NsYXNzLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CZWFjb24uY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmVhY29uLm1lYXNfc3RhcnRfdGltZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmVhY29uLm1lYXNfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJjb25kZW5zZWRfUEhZICg3KTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmVhY29uLmNvbmRlbnNlZF9QSFkpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJyZXBvcnRlZF9mcmFtZV90eXBlICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmVhY29uLnJlcG9ydGVkX2ZyYW1lX3R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkJlYWNvbi5SQ1BJLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CZWFjb24uUlNOSSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmVhY29uLkJTU0lELCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CZWFjb24uYW50ZW5uYV9pZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmVhY29uLnBhcmVudF9UU0YsIDQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrUmFkaW9NZWFzdXJlbWVudFJlcG9ydC4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19SYWRpb01lYXN1cmVtZW50UmVxdWVzdFtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0LCBBY3Rpb24pLCBTaWdGZkFjdGlvbiAsIERPVDExRl9GRl9BQ1RJT05fTEVOLCB9LAorICAgICAgICB7ICJEaWFsb2dUb2tlbiIsIG9mZnNldG9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCwgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICAgICAgeyAiTnVtT2ZSZXBldGl0aW9ucyIsIG9mZnNldG9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCwgTnVtT2ZSZXBldGl0aW9ucyksIFNpZ0ZmTnVtT2ZSZXBldGl0aW9ucyAsIERPVDExRl9GRl9OVU1PRlJFUEVUSVRJT05TX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0W10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QsIE1lYXN1cmVtZW50UmVxdWVzdCksIG9mZnNldG9mKHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCwgcHJlc2VudCksIG9mZnNldG9mKHREb3QxMWZSYWRpb01lYXN1cmVtZW50UmVxdWVzdCwgbnVtX01lYXN1cmVtZW50UmVxdWVzdCksICJNZWFzdXJlbWVudFJlcXVlc3QiICwgMiwgMTYsIDE4LCBTaWdJZU1lYXN1cmVtZW50UmVxdWVzdCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX01FQVNVUkVNRU5UUkVRVUVTVCwgMSwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tSYWRpb01lYXN1cmVtZW50UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19SYWRpb01lYXN1cmVtZW50UmVxdWVzdCwgSUVTX1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0LCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJVbnBhY2tlZCB0aGUgUmFkaW9NZWFzdXJlbWVudFJlcXVlc3Q6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiTnVtT2ZSZXBldGl0aW9uczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk51bU9mUmVwZXRpdGlvbnMucmVwZXRpdGlvbnMsIDIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+bnVtX01lYXN1cmVtZW50UmVxdWVzdDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJNZWFzdXJlbWVudFJlcXVlc3RbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3Rva2VuLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJwYXJhbGxlbCAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLnBhcmFsbGVsKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJlbmFibGUgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5lbmFibGUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoInJlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5yZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJyZXBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5yZXBvcnQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoImR1cmF0aW9uTWFuZGF0b3J5ICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0uZHVyYXRpb25NYW5kYXRvcnkpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoInVudXNlZCAoMyk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLnVudXNlZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF90eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkJhc2ljLmNoYW5uZWxfbm8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkJhc2ljLm1lYXNfc3RhcnRfdGltZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmFzaWMubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQ0NBLmNoYW5uZWxfbm8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkNDQS5tZWFzX3N0YXJ0X3RpbWUsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkNDQS5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0uY2hhbm5lbF9ubywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuUlBJSGlzdG9ncmFtLm1lYXNfc3RhcnRfdGltZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuUlBJSGlzdG9ncmFtLm1lYXNfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5yZWdDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5yYW5kb21pemF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLm1lYXNfbW9kZSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLkJTU0lELCA2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0LiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1JlQXNzb2NSZXF1ZXN0W10gPSB7CisgICAgICAgIHsgIkNhcGFiaWxpdGllcyIsIG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgQ2FwYWJpbGl0aWVzKSwgU2lnRmZDYXBhYmlsaXRpZXMgLCBET1QxMUZfRkZfQ0FQQUJJTElUSUVTX0xFTiwgfSwKKyAgICAgICAgeyAiTGlzdGVuSW50ZXJ2YWwiLCBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIExpc3RlbkludGVydmFsKSwgU2lnRmZMaXN0ZW5JbnRlcnZhbCAsIERPVDExRl9GRl9MSVNURU5JTlRFUlZBTF9MRU4sIH0sCisgICAgICAgIHsgIkN1cnJlbnRBUEFkZHJlc3MiLCBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIEN1cnJlbnRBUEFkZHJlc3MpLCBTaWdGZkN1cnJlbnRBUEFkZHJlc3MgLCBET1QxMUZfRkZfQ1VSUkVOVEFQQUREUkVTU19MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19SZUFzc29jUmVxdWVzdFtdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBTU0lEKSwgb2Zmc2V0b2YodERvdDExZklFU1NJRCwgcHJlc2VudCksIDAsICJTU0lEIiAsIDAsIDIsIDM0LCBTaWdJZVNTSUQsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TU0lELCAxLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiU3VwcFJhdGVzIiAsIDAsIDIsIDE0LCBTaWdJZVN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1NVUFBSQVRFUywgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgRXh0U3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFRXh0U3VwcFJhdGVzLCBwcmVzZW50KSwgMCwgIkV4dFN1cHBSYXRlcyIgLCAwLCAzLCAxNCwgU2lnSWVFeHRTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9FWFRTVVBQUkFURVMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFBvd2VyQ2FwcyksIG9mZnNldG9mKHREb3QxMWZJRVBvd2VyQ2FwcywgcHJlc2VudCksIDAsICJQb3dlckNhcHMiICwgMCwgNCwgNCwgU2lnSWVQb3dlckNhcHMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9QT1dFUkNBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFN1cHBDaGFubmVscyksIG9mZnNldG9mKHREb3QxMWZJRVN1cHBDaGFubmVscywgcHJlc2VudCksIDAsICJTdXBwQ2hhbm5lbHMiICwgMCwgNCwgOTgsIFNpZ0llU3VwcENoYW5uZWxzLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfU1VQUENIQU5ORUxTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBSU05PcGFxdWUpLCBvZmZzZXRvZih0RG90MTFmSUVSU05PcGFxdWUsIHByZXNlbnQpLCAwLCAiUlNOT3BhcXVlIiAsIDAsIDgsIDI1NSwgU2lnSWVSU05PcGFxdWUsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SU05PUEFRVUUsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFFPU0NhcHNTdGF0aW9uKSwgb2Zmc2V0b2YodERvdDExZklFUU9TQ2Fwc1N0YXRpb24sIHByZXNlbnQpLCAwLCAiUU9TQ2Fwc1N0YXRpb24iICwgMCwgMywgMywgU2lnSWVRT1NDYXBzU3RhdGlvbiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1FPU0NBUFNTVEFUSU9OLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBSUk1FbmFibGVkQ2FwKSwgb2Zmc2V0b2YodERvdDExZklFUlJNRW5hYmxlZENhcCwgcHJlc2VudCksIDAsICJSUk1FbmFibGVkQ2FwIiAsIDAsIDcsIDcsIFNpZ0llUlJNRW5hYmxlZENhcCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1JSTUVOQUJMRURDQVAsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIE1vYmlsaXR5RG9tYWluKSwgb2Zmc2V0b2YodERvdDExZklFTW9iaWxpdHlEb21haW4sIHByZXNlbnQpLCAwLCAiTW9iaWxpdHlEb21haW4iICwgMCwgNSwgNSwgU2lnSWVNb2JpbGl0eURvbWFpbiwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX01PQklMSVRZRE9NQUlOLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBGVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sIHByZXNlbnQpLCAwLCAiRlRJbmZvIiAsIDAsIDg0LCAxODcsIFNpZ0llRlRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRlRJTkZPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBSSUNEYXRhRGVzYyksIG9mZnNldG9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjLCBwcmVzZW50KSwgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBudW1fUklDRGF0YURlc2MpLCAiUklDRGF0YURlc2MiICwgMiwgMiwgNTUwLCBTaWdJZVJJQ0RhdGFEZXNjLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUklDREFUQURFU0MsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFdQQU9wYXF1ZSksIG9mZnNldG9mKHREb3QxMWZJRVdQQU9wYXF1ZSwgcHJlc2VudCksIDAsICJXUEFPcGFxdWUiICwgMCwgOCwgMjU1LCBTaWdJZVdQQU9wYXF1ZSwgezAsIDgwLCAyNDIsIDEsIDB9LCA0LCBET1QxMUZfRUlEX1dQQU9QQVFVRSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgSFRDYXBzKSwgb2Zmc2V0b2YodERvdDExZklFSFRDYXBzLCBwcmVzZW50KSwgMCwgIkhUQ2FwcyIgLCAwLCAyOCwgNjAsIFNpZ0llSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfSFRDQVBTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBXTU1DYXBzKSwgb2Zmc2V0b2YodERvdDExZklFV01NQ2FwcywgcHJlc2VudCksIDAsICJXTU1DYXBzIiAsIDAsIDksIDksIFNpZ0llV01NQ2FwcywgezAsIDgwLCAyNDIsIDIsIDV9LCA1LCBET1QxMUZfRUlEX1dNTUNBUFMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIFdNTUluZm9TdGF0aW9uKSwgb2Zmc2V0b2YodERvdDExZklFV01NSW5mb1N0YXRpb24sIHByZXNlbnQpLCAwLCAiV01NSW5mb1N0YXRpb24iICwgMCwgOSwgOSwgU2lnSWVXTU1JbmZvU3RhdGlvbiwgezAsIDgwLCAyNDIsIDIsIDB9LCA1LCBET1QxMUZfRUlEX1dNTUlORk9TVEFUSU9OLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBBaXJnbyksIG9mZnNldG9mKHREb3QxMWZJRUFpcmdvLCBwcmVzZW50KSwgMCwgIkFpcmdvIiAsIDAsIDUsIDIzMiwgU2lnSWVBaXJnbywgezAsIDEwLCAyNDUsIDAsIDB9LCAzLCBET1QxMUZfRUlEX0FJUkdPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBXc2NJRU9wYXF1ZSksIG9mZnNldG9mKHREb3QxMWZJRVdzY0lFT3BhcXVlLCBwcmVzZW50KSwgMCwgIldzY0lFT3BhcXVlIiAsIDAsIDgsIDI1NSwgU2lnSWVXc2NJRU9wYXF1ZSwgezAsIDgwLCAyNDIsIDQsIDB9LCA0LCBET1QxMUZfRUlEX1dTQ0lFT1BBUVVFLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBXQVBJT3BhcXVlKSwgb2Zmc2V0b2YodERvdDExZklFV0FQSU9wYXF1ZSwgcHJlc2VudCksIDAsICJXQVBJT3BhcXVlIiAsIDAsIDgsIDI1NSwgU2lnSWVXQVBJT3BhcXVlLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfV0FQSU9QQVFVRSwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZSZUFzc29jUmVxdWVzdCwgQ0NYUmFkTWdtdENhcCksIG9mZnNldG9mKHREb3QxMWZJRUNDWFJhZE1nbXRDYXAsIHByZXNlbnQpLCAwLCAiQ0NYUmFkTWdtdENhcCIgLCAwLCA4LCA4LCBTaWdJZUNDWFJhZE1nbXRDYXAsIHswLCA2NCwgMTUwLCAxLCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hSQURNR01UQ0FQLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBDQ1hWZXJzaW9uKSwgb2Zmc2V0b2YodERvdDExZklFQ0NYVmVyc2lvbiwgcHJlc2VudCksIDAsICJDQ1hWZXJzaW9uIiAsIDAsIDcsIDcsIFNpZ0llQ0NYVmVyc2lvbiwgezAsIDY0LCAxNTAsIDMsIDB9LCA0LCBET1QxMUZfRUlEX0NDWFZFUlNJT04sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIENDWENja21PcGFxdWUpLCBvZmZzZXRvZih0RG90MTFmSUVDQ1hDY2ttT3BhcXVlLCBwcmVzZW50KSwgMCwgIkNDWENja21PcGFxdWUiICwgMCwgMTIsIDI2LCBTaWdJZUNDWENja21PcGFxdWUsIHswLCA2NCwgMTUwLCAwLCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hDQ0tNT1BBUVVFLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBXTU1UU1BFQyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVRTUEVDLCBwcmVzZW50KSwgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBudW1fV01NVFNQRUMpLCAiV01NVFNQRUMiICwgNCwgNjMsIDYzLCBTaWdJZVdNTVRTUEVDLCB7MCwgODAsIDI0MiwgMiwgMn0sIDUsIERPVDExRl9FSURfV01NVFNQRUMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1JlcXVlc3QsIENDWFRyYWZTdHJtUmF0ZVNldCksIG9mZnNldG9mKHREb3QxMWZJRUNDWFRyYWZTdHJtUmF0ZVNldCwgcHJlc2VudCksIDAsICJDQ1hUcmFmU3RybVJhdGVTZXQiICwgMCwgNywgMTUsIFNpZ0llQ0NYVHJhZlN0cm1SYXRlU2V0LCB7MCwgNjQsIDE1MCwgOCwgMH0sIDQsIERPVDExRl9FSURfQ0NYVFJBRlNUUk1SQVRFU0VULCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXF1ZXN0LCBQMlBJRU9wYXF1ZSksIG9mZnNldG9mKHREb3QxMWZJRVAyUElFT3BhcXVlLCBwcmVzZW50KSwgMCwgIlAyUElFT3BhcXVlIiAsIDAsIDgsIDI1NSwgU2lnSWVQMlBJRU9wYXF1ZSwgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQSUVPUEFRVUUsIDAsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrUmVBc3NvY1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdERvdDExZlJlQXNzb2NSZXF1ZXN0ICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfUmVBc3NvY1JlcXVlc3QsIElFU19SZUFzc29jUmVxdWVzdCwgKCB0QU5JX1U4KiApcEZybSwgc2l6ZW9mKCpwRnJtKSk7CisKKyAgICAodm9pZClpOworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiVW5wYWNrZWQgdGhlIFJlQXNzb2NSZXF1ZXN0OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkNhcGFiaWxpdGllczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZXNzICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZXNzKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiaWJzcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmlic3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJjZlBvbGxhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsYWJsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImNmUG9sbFJlcSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNmUG9sbFJlcSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInByaXZhY3kgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wcml2YWN5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgic2hvcnRQcmVhbWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJwYmNjICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucGJjYyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImNoYW5uZWxBZ2lsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2hhbm5lbEFnaWxpdHkpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJzcGVjdHJ1bU1ndCAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicW9zICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucW9zKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgic2hvcnRTbG90VGltZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0U2xvdFRpbWUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuYXBzZCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJybSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnJybSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImRzc3NPZmRtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZHNzc09mZG0pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5kZWxheWVkQkEpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJpbW1lZGlhdGVCQSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmltbWVkaWF0ZUJBKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTGlzdGVuSW50ZXJ2YWw6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5MaXN0ZW5JbnRlcnZhbC5pbnRlcnZhbCwgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkN1cnJlbnRBUEFkZHJlc3M6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DdXJyZW50QVBBZGRyZXNzLm1hYywgNik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlNTSUQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U1NJRC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV9zc2lkOiAlZC5cbiIpLCBwRnJtLT5TU0lELm51bV9zc2lkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5TU0lELnNzaWQsIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlN1cHBSYXRlcy5yYXRlcywgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiRXh0U3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+RXh0U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJQb3dlckNhcHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UG93ZXJDYXBzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlBvd2VyQ2Fwcy5taW5UeFBvd2VyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Qb3dlckNhcHMubWF4VHhQb3dlciwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiU3VwcENoYW5uZWxzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlN1cHBDaGFubmVscy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV9iYW5kczogJWQuXG4iKSwgcEZybS0+U3VwcENoYW5uZWxzLm51bV9iYW5kcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+U3VwcENoYW5uZWxzLmJhbmRzLCAyICogcEZybS0+U3VwcENoYW5uZWxzLm51bV9iYW5kcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUlNOT3BhcXVlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJTTk9wYXF1ZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV9kYXRhOiAlZC5cbiIpLCBwRnJtLT5SU05PcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTk9wYXF1ZS5kYXRhLCBwRnJtLT5SU05PcGFxdWUubnVtX2RhdGEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlFPU0NhcHNTdGF0aW9uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlFPU0NhcHNTdGF0aW9uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibW9yZV9kYXRhX2FjayAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24ubW9yZV9kYXRhX2Fjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJtYXhfc3BfbGVuZ3RoICgyKTogJWRcbiIpLCBwRnJtLT5RT1NDYXBzU3RhdGlvbi5tYXhfc3BfbGVuZ3RoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInFhY2sgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLnFhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNiZV91YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24uYWNiZV91YXBzZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JrX3VhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5RT1NDYXBzU3RhdGlvbi5hY2JrX3VhcHNkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLmFjdmlfdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2b191YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24uYWN2b191YXBzZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUlJNRW5hYmxlZENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SUk1FbmFibGVkQ2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTGlua01lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxpbmtNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOZWlnaGJvclJwdCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5OZWlnaGJvclJwdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJwYXJhbGxlbCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5wYXJhbGxlbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXBlYXRlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXBlYXRlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJCZWFjb25QYXNzaXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvblBhc3NpdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQmVhY29uQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvbkFjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJCZWFjb25UYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25UYWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJCZWFjb25SZXBDb25kICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvblJlcENvbmQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiRnJhbWVNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5GcmFtZU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkNoYW5uZWxMb2FkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkNoYW5uZWxMb2FkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vaXNlSGlzdG9ncmFtICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5vaXNlSGlzdG9ncmFtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInN0YXRpc3RpY3MgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuc3RhdGlzdGljcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJMQ0lNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJMQ0lBemltdXRoICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxDSUF6aW11dGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiVENNQ2FwYWJpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5UQ01DYXBhYmlsaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRyaWdnZXJlZFRDTSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC50cmlnZ2VyZWRUQ00pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQVBDaGFuUmVwb3J0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkFQQ2hhblJlcG9ydCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJSUk1NSUJFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJSTU1JQkVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgib3BlcmF0aW5nQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5vcGVyYXRpbmdDaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm5vbk9wZXJhdGluQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5ub25PcGVyYXRpbkNoYW5NYXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk1lYXN1cmVtZW50UGlsb3RFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3RFbmFibGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5laWdoYm9yVFNGT2Zmc2V0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5laWdoYm9yVFNGT2Zmc2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlJDUElNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SQ1BJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUlNOSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJTTklNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJCc3NBdmdBY2Nlc3NEZWxheSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5Cc3NBdmdBY2Nlc3NEZWxheSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJCU1NBdmFpbEFkbWlzc2lvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CU1NBdmFpbEFkbWlzc2lvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJBbnRlbm5hSW5mb3JtYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQW50ZW5uYUluZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJNb2JpbGl0eURvbWFpbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Nb2JpbGl0eURvbWFpbi5NRElELCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm92ZXJEU0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ub3ZlckRTQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc291cmNlUmVxQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNvdXJjZVJlcUNhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkZUSW5mbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5GVEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZCAoOCk6ICVkXG4iKSwgcEZybS0+RlRJbmZvLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIklFQ291bnQgKDgpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5JRUNvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uTUlDLCAxNik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLkFub25jZSwgMzIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5Tbm9uY2UsIDMyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlIxS0hfSUQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5SMUtIX0lELnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5SMUtIX0lELlBNS19SMV9JRCwgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJHVEs6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5HVEsucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJrZXlJZCAoMik6ICVkXG4iKSwgcEZybS0+RlRJbmZvLkdUSy5rZXlJZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQgKDE0KTogJWRcbiIpLCBwRnJtLT5GVEluZm8uR1RLLnJlc2VydmVkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLkdUSy5rZXlMZW5ndGgsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uR1RLLlJTQywgOCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2tleTogJWQuXG4iKSwgcEZybS0+RlRJbmZvLkdUSy5udW1fa2V5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+RlRJbmZvLkdUSy5rZXksIHBGcm0tPkZUSW5mby5HVEsubnVtX2tleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJSMEtIX0lEOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5GVEluZm8uUjBLSF9JRC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV9QTUtfUjBfSUQ6ICVkLlxuIiksIHBGcm0tPkZUSW5mby5SMEtIX0lELm51bV9QTUtfUjBfSUQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5GVEluZm8uUjBLSF9JRC5QTUtfUjBfSUQsIHBGcm0tPkZUSW5mby5SMEtIX0lELm51bV9QTUtfUjBfSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5udW1fUklDRGF0YURlc2M7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUklDRGF0YURlc2NbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlJJQ0RhdGE6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEYXRhLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEuSWRlbnRpZmllciwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEYXRhLnJlc291cmNlRGVzY0NvdW50LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEuc3RhdHVzQ29kZSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlJJQ0Rlc2NyaXB0b3I6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IucmVzb3VyY2VUeXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3ZhcmlhYmxlRGF0YTogJWQuXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5udW1fdmFyaWFibGVEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IudmFyaWFibGVEYXRhLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLm51bV92YXJpYWJsZURhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJUU1BFQzpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5wc2IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgic2NoZWR1bGUgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnNjaGVkdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidW51c2VkICg3KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy51bnVzZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5maXhlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+UklDRGF0YURlc2NbaV0ubnVtX1RDTEFTOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJUQ0xBU1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0ucHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0udXNlcl9wcmlvcml0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uY2xhc3NpZmllcl90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5jbGFzc2lmaWVyX21hc2ssIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLmRlc3QsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5FdGhQYXJhbXMudHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJUQ0xBU1NQUk9DOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNTUFJPQy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1NQUk9DLnByb2Nlc3NpbmcsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJUU0RlbGF5OlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVFNEZWxheS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU0RlbGF5LmRlbGF5LCA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiU2NoZWR1bGU6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkICg5KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5yZXNlcnZlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuc2VydmljZV9pbnRlcnZhbCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5tYXhfc2VydmljZV9kdXIsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuc3BlY19pbnRlcnZhbCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIldNTVRTUEVDOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHNpZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMucHNiKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRzaW5mb19hY2tfcG9sICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50c2luZm9fYWNrX3BvbCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRzaW5mb19yc3ZkICg3KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50c2luZm9fcnN2ZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImJ1cnN0X3NpemVfZGVmbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYnVyc3Rfc2l6ZV9kZWZuKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgic2l6ZSAoMTUpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnNpemUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuZml4ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5taW5fc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnN1c3BlbnNpb25faW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1lYW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuZGVsYXlfYm91bmQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1lZGl1bV90aW1lLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPlJJQ0RhdGFEZXNjW2ldLm51bV9XTU1UQ0xBUzsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiV01NVENMQVNbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLnByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLnVzZXJfcHJpb3JpdHksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uY2xhc3NpZmllcl9tYXNrLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uY2xhc3NpZmllcl90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnR5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc291cmNlLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmZsb3dfbGFiZWwsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiV01NVENMQVNQUk9DOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNQUk9DLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTUFJPQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTUFJPQy5wcm9jZXNzaW5nLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiV01NVFNEZWxheTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTRGVsYXkucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNEZWxheS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTRGVsYXkuZGVsYXksIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJXTU1TY2hlZHVsZTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZCAoOSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUucmVzZXJ2ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnNlcnZpY2VfaW50ZXJ2YWwsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUubWF4X3NlcnZpY2VfZHVyLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnNwZWNfaW50ZXJ2YWwsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJXUEFPcGFxdWU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V1BBT3BhcXVlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2RhdGE6ICVkLlxuIiksIHBGcm0tPldQQU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+V1BBT3BhcXVlLmRhdGEsIHBGcm0tPldQQU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiSFRDYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFkdkNvZGluZ0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFkdkNvZGluZ0NhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibWltb1Bvd2VyU2F2ZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1pbW9Qb3dlclNhdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZ3JlZW5GaWVsZCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmdyZWVuRmllbGQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgic2hvcnRHSTIwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTIwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInNob3J0R0k0ME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnNob3J0R0k0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0eFNUQkMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFNUQkMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicnhTVEJDICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImRlbGF5ZWRCQSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmRlbGF5ZWRCQSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJtYXhpbWFsQU1TRFVzaXplICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4aW1hbEFNU0RVc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJkc3NzQ2NrTW9kZTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZHNzc0Nja01vZGU0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJwc21wICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucHNtcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJzdGJjQ29udHJvbEZyYW1lICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc3RiY0NvbnRyb2xGcmFtZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibWF4UnhBTVBEVUZhY3RvciAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3IpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibXBkdURlbnNpdHkgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tcGR1RGVuc2l0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDEgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInBjbyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBjbyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0cmFuc2l0aW9uVGltZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnRyYW5zaXRpb25UaW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMiAoNSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJtY3NGZWVkYmFjayAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1jc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMyAoNik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0eEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyeFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0eFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyeFpMRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4WkxGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInR4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiaW1wbGljaXRUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuaW1wbGljaXRUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImNhbGlicmF0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY2FsaWJyYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRDU0lUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0QkZDU0lGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0QkZDU0lGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiY3NpTnVtQkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNzaU51bUJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkNCAoNyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhbnRlbm5hU2VsZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYVNlbGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYW50ZW5uYUluZGljZXNGZWVkYmFja1R4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYUluZGljZXNGZWVkYmFja1R4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0Q1NJRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJ4QVMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeEFTKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInR4U291bmRpbmdQUERVcyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U291bmRpbmdQUERVcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3JzdmQ6ICVkLlxuIiksIHBGcm0tPkhUQ2Fwcy5udW1fcnN2ZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+SFRDYXBzLnJzdmQsIHBGcm0tPkhUQ2Fwcy5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiV01NQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1DYXBzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTUNhcHMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZCAoNCk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJxYWNrICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnFhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicXVldWVfcmVxdWVzdCAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5xdWV1ZV9yZXF1ZXN0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInR4b3BfcmVxdWVzdCAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy50eG9wX3JlcXVlc3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibW9yZV9hY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMubW9yZV9hY2spOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIldNTUluZm9TdGF0aW9uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTUluZm9TdGF0aW9uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTUluZm9TdGF0aW9uLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2b191YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NSW5mb1N0YXRpb24uYWN2b191YXBzZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZpX3VhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5hY3ZpX3VhcHNkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9TdGF0aW9uLmFjYmtfdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNiZV91YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NSW5mb1N0YXRpb24uYWNiZV91YXBzZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDEgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9TdGF0aW9uLnJlc2VydmVkMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJtYXhfc3BfbGVuZ3RoICgyKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5tYXhfc3BfbGVuZ3RoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMiAoMSk6ICVkXG4iKSwgcEZybS0+V01NSW5mb1N0YXRpb24ucmVzZXJ2ZWQyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJBaXJnbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlByb3BTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5yYXRlcywgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQVBOYW1lOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5BUE5hbWUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fbmFtZTogJWQuXG4iKSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uQVBOYW1lLm5hbWUsIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJIQ0Y6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkhDRi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5IQ0YuZW5hYmxlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJXRFM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLldEUy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV93ZHNEYXRhOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5XRFMud2RzRGF0YSwgcEZybS0+QWlyZ28uV0RTLm51bV93ZHNEYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkJQSW5kaWNhdG9yOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5CUEluZGljYXRvci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci5pbmRpY2F0b3IsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkxvYWRJbmZvOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkSW5mby5udW1fc3RhcywgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRJbmZvLmNoYW5uZWxfdXRpbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJMb2FkQmFsYW5jZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuYnNzaWQsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlByb3BBc3NvY1R5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEFzc29jVHlwZS50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkxMQXR0cjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTExBdHRyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxMQXR0ci5kZWZlcl90aHJlc2hvbGQsIDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUHJvcENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LmNhcGFiaWxpdHksIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5WZXJzaW9uLmNoaXBfcmV2LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jYXJkX3R5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV9idWlsZF92ZXJzaW9uOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uVmVyc2lvbi5idWlsZF92ZXJzaW9uLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlByb3BFRENBUGFyYW1zOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5xb3MsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjYmVfbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNiZV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JrX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2aV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZpX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjdm9fbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2b19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiVGl0YW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRpdGFuLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbmNhdF90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbXByZXNzaW9uX3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY2Jfc3RhdGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5yZXZfZmNzX3N0YXRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlByb3BDaGFublN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5tb2RlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnByaW1hcnlfY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5zdWJfYmFuZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5jaGFubmVsX3N3aXRjaF9jb3VudCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJQcm9wUXVpZXRCU1M6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfY291bnQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfcGVyaW9kLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X29mZnNldCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJUcmlnZ2VyU3RhQmdTY2FuOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UcmlnZ2VyU3RhQmdTY2FuLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4uZW5hYmxlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlRhdXJ1czpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGF1cnVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVRJREJpdG1hcCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVBvbGljeSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYmFCdWZmZXJTaXplICgxMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLmJhQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicnN2ZCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLnJzdmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIldzY0lFT3BhcXVlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldzY0lFT3BhcXVlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2RhdGE6ICVkLlxuIiksIHBGcm0tPldzY0lFT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NJRU9wYXF1ZS5kYXRhLCBwRnJtLT5Xc2NJRU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiV0FQSU9wYXF1ZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XQVBJT3BhcXVlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2RhdGE6ICVkLlxuIiksIHBGcm0tPldBUElPcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUElPcGFxdWUuZGF0YSwgcEZybS0+V0FQSU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQ0NYUmFkTWdtdENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hSYWRNZ210Q2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFJhZE1nbXRDYXAubWdtdF9zdGF0ZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJtYnNzaWRfbWFzayAoMyk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5tYnNzaWRfbWFzayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZCAoNSk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQ0NYVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hWZXJzaW9uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFZlcnNpb24udmVyc2lvbiwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQ0NYQ2NrbU9wYXF1ZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hDY2ttT3BhcXVlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2RhdGE6ICVkLlxuIiksIHBGcm0tPkNDWENja21PcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPkNDWENja21PcGFxdWUuZGF0YSwgcEZybS0+Q0NYQ2NrbU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9XTU1UU1BFQzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJXTU1UU1BFQ1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldNTVRTUEVDW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS50c2lkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnBzYik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0c2luZm9fcnN2ZCAoNyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHNpbmZvX3JzdmQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImJ1cnN0X3NpemVfZGVmbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uYnVyc3Rfc2l6ZV9kZWZuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLmZpeGVkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0uc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWVkaXVtX3RpbWUsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkNDWFRyYWZTdHJtUmF0ZVNldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0LnRzaWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3RzcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkNDWFRyYWZTdHJtUmF0ZVNldC5udW1fdHNyYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0LnRzcmF0ZXMsIHBGcm0tPkNDWFRyYWZTdHJtUmF0ZVNldC5udW1fdHNyYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUDJQSUVPcGFxdWU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQSUVPcGFxdWUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fZGF0YTogJWQuXG4iKSwgcEZybS0+UDJQSUVPcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUElFT3BhcXVlLmRhdGEsIHBGcm0tPlAyUElFT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tSZUFzc29jUmVxdWVzdC4gKi8KKworICAgIHN0YXRpYyBjb25zdCB0RkZEZWZuIEZGU19SZUFzc29jUmVzcG9uc2VbXSA9IHsKKyAgICAgICAgeyAiQ2FwYWJpbGl0aWVzIiwgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgQ2FwYWJpbGl0aWVzKSwgU2lnRmZDYXBhYmlsaXRpZXMgLCBET1QxMUZfRkZfQ0FQQUJJTElUSUVTX0xFTiwgfSwKKyAgICAgICAgeyAiU3RhdHVzIiwgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgU3RhdHVzKSwgU2lnRmZTdGF0dXMgLCBET1QxMUZfRkZfU1RBVFVTX0xFTiwgfSwKKyAgICAgICAgeyAiQUlEIiwgb2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgQUlEKSwgU2lnRmZBSUQgLCBET1QxMUZfRkZfQUlEX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1JlQXNzb2NSZXNwb25zZVtdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgU3VwcFJhdGVzKSwgb2Zmc2V0b2YodERvdDExZklFU3VwcFJhdGVzLCBwcmVzZW50KSwgMCwgIlN1cHBSYXRlcyIgLCAwLCAyLCAxNCwgU2lnSWVTdXBwUmF0ZXMsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9TVVBQUkFURVMsIDEsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBFeHRTdXBwUmF0ZXMpLCBvZmZzZXRvZih0RG90MTFmSUVFeHRTdXBwUmF0ZXMsIHByZXNlbnQpLCAwLCAiRXh0U3VwcFJhdGVzIiAsIDAsIDMsIDE0LCBTaWdJZUV4dFN1cHBSYXRlcywgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0VYVFNVUFBSQVRFUywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIEVEQ0FQYXJhbVNldCksIG9mZnNldG9mKHREb3QxMWZJRUVEQ0FQYXJhbVNldCwgcHJlc2VudCksIDAsICJFRENBUGFyYW1TZXQiICwgMCwgMjAsIDIwLCBTaWdJZUVEQ0FQYXJhbVNldCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX0VEQ0FQQVJBTVNFVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIFJDUElJRSksIG9mZnNldG9mKHREb3QxMWZJRVJDUElJRSwgcHJlc2VudCksIDAsICJSQ1BJSUUiICwgMCwgMywgMywgU2lnSWVSQ1BJSUUsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SQ1BJSUUsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBSU05JSUUpLCBvZmZzZXRvZih0RG90MTFmSUVSU05JSUUsIHByZXNlbnQpLCAwLCAiUlNOSUlFIiAsIDAsIDMsIDMsIFNpZ0llUlNOSUlFLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUlNOSUlFLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgUlJNRW5hYmxlZENhcCksIG9mZnNldG9mKHREb3QxMWZJRVJSTUVuYWJsZWRDYXAsIHByZXNlbnQpLCAwLCAiUlJNRW5hYmxlZENhcCIgLCAwLCA3LCA3LCBTaWdJZVJSTUVuYWJsZWRDYXAsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SUk1FTkFCTEVEQ0FQLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgUlNOT3BhcXVlKSwgb2Zmc2V0b2YodERvdDExZklFUlNOT3BhcXVlLCBwcmVzZW50KSwgMCwgIlJTTk9wYXF1ZSIgLCAwLCA4LCAyNTUsIFNpZ0llUlNOT3BhcXVlLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfUlNOT1BBUVVFLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgTW9iaWxpdHlEb21haW4pLCBvZmZzZXRvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbiwgcHJlc2VudCksIDAsICJNb2JpbGl0eURvbWFpbiIgLCAwLCA1LCA1LCBTaWdJZU1vYmlsaXR5RG9tYWluLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfTU9CSUxJVFlET01BSU4sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBGVEluZm8pLCBvZmZzZXRvZih0RG90MTFmSUVGVEluZm8sIHByZXNlbnQpLCAwLCAiRlRJbmZvIiAsIDAsIDg0LCAxODcsIFNpZ0llRlRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfRlRJTkZPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgUklDRGF0YURlc2MpLCBvZmZzZXRvZih0RG90MTFmSUVSSUNEYXRhRGVzYywgcHJlc2VudCksIG9mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIG51bV9SSUNEYXRhRGVzYyksICJSSUNEYXRhRGVzYyIgLCAyLCAyLCA1NTAsIFNpZ0llUklDRGF0YURlc2MsIHswLCAwLCAwLCAwLCAwfSwgMCwgRE9UMTFGX0VJRF9SSUNEQVRBREVTQywgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIFdQQSksIG9mZnNldG9mKHREb3QxMWZJRVdQQSwgcHJlc2VudCksIDAsICJXUEEiICwgMCwgOCwgNTAsIFNpZ0llV1BBLCB7MCwgODAsIDI0MiwgMSwgMH0sIDQsIERPVDExRl9FSURfV1BBLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgSFRDYXBzKSwgb2Zmc2V0b2YodERvdDExZklFSFRDYXBzLCBwcmVzZW50KSwgMCwgIkhUQ2FwcyIgLCAwLCAyOCwgNjAsIFNpZ0llSFRDYXBzLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfSFRDQVBTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgSFRJbmZvKSwgb2Zmc2V0b2YodERvdDExZklFSFRJbmZvLCBwcmVzZW50KSwgMCwgIkhUSW5mbyIgLCAwLCAyNCwgNTYsIFNpZ0llSFRJbmZvLCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfSFRJTkZPLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgV01NUGFyYW1zKSwgb2Zmc2V0b2YodERvdDExZklFV01NUGFyYW1zLCBwcmVzZW50KSwgMCwgIldNTVBhcmFtcyIgLCAwLCAyNiwgMjYsIFNpZ0llV01NUGFyYW1zLCB7MCwgODAsIDI0MiwgMiwgMX0sIDUsIERPVDExRl9FSURfV01NUEFSQU1TLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgQ0NYUmFkTWdtdENhcCksIG9mZnNldG9mKHREb3QxMWZJRUNDWFJhZE1nbXRDYXAsIHByZXNlbnQpLCAwLCAiQ0NYUmFkTWdtdENhcCIgLCAwLCA4LCA4LCBTaWdJZUNDWFJhZE1nbXRDYXAsIHswLCA2NCwgMTUwLCAxLCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hSQURNR01UQ0FQLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgQ0NYVHJhZlN0cm1NZXQpLCBvZmZzZXRvZih0RG90MTFmSUVDQ1hUcmFmU3RybU1ldCwgcHJlc2VudCksIDAsICJDQ1hUcmFmU3RybU1ldCIgLCAwLCAxMCwgMTAsIFNpZ0llQ0NYVHJhZlN0cm1NZXQsIHswLCA2NCwgMTUwLCA3LCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hUUkFGU1RSTU1FVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIENDWFR4bWl0UG93ZXIpLCBvZmZzZXRvZih0RG90MTFmSUVDQ1hUeG1pdFBvd2VyLCBwcmVzZW50KSwgMCwgIkNDWFR4bWl0UG93ZXIiICwgMCwgOCwgOCwgU2lnSWVDQ1hUeG1pdFBvd2VyLCB7MCwgNjQsIDE1MCwgMCwgMH0sIDQsIERPVDExRl9FSURfQ0NYVFhNSVRQT1dFUiwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIFdNTVRTUEVDKSwgb2Zmc2V0b2YodERvdDExZklFV01NVFNQRUMsIHByZXNlbnQpLCBvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBudW1fV01NVFNQRUMpLCAiV01NVFNQRUMiICwgNCwgNjMsIDYzLCBTaWdJZVdNTVRTUEVDLCB7MCwgODAsIDI0MiwgMiwgMn0sIDUsIERPVDExRl9FSURfV01NVFNQRUMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBDQ1hUcmFmU3RybVJhdGVTZXQpLCBvZmZzZXRvZih0RG90MTFmSUVDQ1hUcmFmU3RybVJhdGVTZXQsIHByZXNlbnQpLCAwLCAiQ0NYVHJhZlN0cm1SYXRlU2V0IiAsIDAsIDcsIDE1LCBTaWdJZUNDWFRyYWZTdHJtUmF0ZVNldCwgezAsIDY0LCAxNTAsIDgsIDB9LCA0LCBET1QxMUZfRUlEX0NDWFRSQUZTVFJNUkFURVNFVCwgMCwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZSZUFzc29jUmVzcG9uc2UsIEFpcmdvKSwgb2Zmc2V0b2YodERvdDExZklFQWlyZ28sIHByZXNlbnQpLCAwLCAiQWlyZ28iICwgMCwgNSwgMjMyLCBTaWdJZUFpcmdvLCB7MCwgMTAsIDI0NSwgMCwgMH0sIDMsIERPVDExRl9FSURfQUlSR08sIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmUmVBc3NvY1Jlc3BvbnNlLCBXc2NSZWFzc29jUmVzKSwgb2Zmc2V0b2YodERvdDExZklFV3NjUmVhc3NvY1JlcywgcHJlc2VudCksIDAsICJXc2NSZWFzc29jUmVzIiAsIDAsIDYsIDM3LCBTaWdJZVdzY1JlYXNzb2NSZXMsIHswLCA4MCwgMjQyLCA0LCAwfSwgNCwgRE9UMTFGX0VJRF9XU0NSRUFTU09DUkVTLCAwLCB9LAorICAgICAgICB7b2Zmc2V0b2YodERvdDExZlJlQXNzb2NSZXNwb25zZSwgUDJQQXNzb2NSZXMpLCBvZmZzZXRvZih0RG90MTFmSUVQMlBBc3NvY1JlcywgcHJlc2VudCksIDAsICJQMlBBc3NvY1JlcyIgLCAwLCA2LCAxNywgU2lnSWVQMlBBc3NvY1JlcywgezgwLCAxMTEsIDE1NCwgOSwgMH0sIDQsIERPVDExRl9FSURfUDJQQVNTT0NSRVMsIDAsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrUmVBc3NvY1Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZSZUFzc29jUmVzcG9uc2UgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19SZUFzc29jUmVzcG9uc2UsIElFU19SZUFzc29jUmVzcG9uc2UsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJVbnBhY2tlZCB0aGUgUmVBc3NvY1Jlc3BvbnNlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkNhcGFiaWxpdGllczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImVzcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmVzcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJpYnNzICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaWJzcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJjZlBvbGxhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsYWJsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJjZlBvbGxSZXEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jZlBvbGxSZXEpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicHJpdmFjeSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnByaXZhY3kpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2hvcnRQcmVhbWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicGJjYyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnBiY2MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiY2hhbm5lbEFnaWxpdHkgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jaGFubmVsQWdpbGl0eSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJzcGVjdHJ1bU1ndCAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInFvcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnFvcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJzaG9ydFNsb3RUaW1lICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc2hvcnRTbG90VGltZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuYXBzZCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJycm0gKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5ycm0pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZHNzc09mZG0gKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5kc3NzT2ZkbSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5kZWxheWVkQkEpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiaW1tZWRpYXRlQkEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5pbW1lZGlhdGVCQSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJTdGF0dXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+U3RhdHVzLnN0YXR1cywgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJBSUQ6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QUlELmFzc29jaWQsIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiU3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiRXh0U3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+RXh0U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiRURDQVBhcmFtU2V0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkVEQ0FQYXJhbVNldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5xb3MsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQxICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQ0ICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlJDUElJRTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SQ1BJSUUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SQ1BJSUUucmNwaSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlJTTklJRTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SU05JSUUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SU05JSUUucnNuaSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlJSTUVuYWJsZWRDYXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlJNRW5hYmxlZENhcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTGlua01lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxpbmtNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTmVpZ2hib3JScHQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JScHQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInBhcmFsbGVsICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnBhcmFsbGVsKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXBlYXRlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXBlYXRlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQmVhY29uUGFzc2l2ZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25QYXNzaXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJCZWFjb25BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJCZWFjb25UYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25UYWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQmVhY29uUmVwQ29uZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25SZXBDb25kKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJGcmFtZU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkZyYW1lTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkNoYW5uZWxMb2FkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkNoYW5uZWxMb2FkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb2lzZUhpc3RvZ3JhbSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5Ob2lzZUhpc3RvZ3JhbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic3RhdGlzdGljcyAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5zdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJMQ0lNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTENJQXppbXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lBemltdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJUQ01DYXBhYmlsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlRDTUNhcGFiaWxpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRyaWdnZXJlZFRDTSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC50cmlnZ2VyZWRUQ00pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkFQQ2hhblJlcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BUENoYW5SZXBvcnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlJSTU1JQkVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlJNTUlCRW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgib3BlcmF0aW5nQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5vcGVyYXRpbmdDaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJub25PcGVyYXRpbkNoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAubm9uT3BlcmF0aW5DaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk1lYXN1cmVtZW50UGlsb3RFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3RFbmFibGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOZWlnaGJvclRTRk9mZnNldCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5OZWlnaGJvclRTRk9mZnNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUkNQSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJDUElNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUlNOSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJTTklNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQnNzQXZnQWNjZXNzRGVsYXkgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQnNzQXZnQWNjZXNzRGVsYXkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkJTU0F2YWlsQWRtaXNzaW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJTU0F2YWlsQWRtaXNzaW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJBbnRlbm5hSW5mb3JtYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQW50ZW5uYUluZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlJTTk9wYXF1ZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SU05PcGFxdWUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9kYXRhOiAlZC5cbiIpLCBwRnJtLT5SU05PcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5SU05PcGFxdWUuZGF0YSwgcEZybS0+UlNOT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTW9iaWxpdHlEb21haW46XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+TW9iaWxpdHlEb21haW4ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Nb2JpbGl0eURvbWFpbi5NRElELCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJvdmVyRFNDYXAgKDEpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLm92ZXJEU0NhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzb3VyY2VSZXFDYXAgKDEpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc291cmNlUmVxQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJGVEluZm86XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RlRJbmZvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoOCk6ICVkXG4iKSwgcEZybS0+RlRJbmZvLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJJRUNvdW50ICg4KTogJWRcbiIpLCBwRnJtLT5GVEluZm8uSUVDb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5NSUMsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLkFub25jZSwgMzIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uU25vbmNlLCAzMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUjFLSF9JRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+RlRJbmZvLlIxS0hfSUQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uUjFLSF9JRC5QTUtfUjFfSUQsIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkdUSzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+RlRJbmZvLkdUSy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgia2V5SWQgKDIpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5HVEsua2V5SWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoMTQpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5HVEsucmVzZXJ2ZWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLkdUSy5rZXlMZW5ndGgsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLkdUSy5SU0MsIDgpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fa2V5OiAlZC5cbiIpLCBwRnJtLT5GVEluZm8uR1RLLm51bV9rZXkpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+RlRJbmZvLkdUSy5rZXksIHBGcm0tPkZUSW5mby5HVEsubnVtX2tleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUjBLSF9JRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+RlRJbmZvLlIwS0hfSUQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9QTUtfUjBfSUQ6ICVkLlxuIiksIHBGcm0tPkZUSW5mby5SMEtIX0lELm51bV9QTUtfUjBfSUQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+RlRJbmZvLlIwS0hfSUQuUE1LX1IwX0lELCBwRnJtLT5GVEluZm8uUjBLSF9JRC5udW1fUE1LX1IwX0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+bnVtX1JJQ0RhdGFEZXNjOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJSSUNEYXRhRGVzY1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJSSUNEYXRhOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEuSWRlbnRpZmllciwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5yZXNvdXJjZURlc2NDb3VudCwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5zdGF0dXNDb2RlLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlJJQ0Rlc2NyaXB0b3I6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5yZXNvdXJjZVR5cGUsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX3ZhcmlhYmxlRGF0YTogJWQuXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5udW1fdmFyaWFibGVEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLnZhcmlhYmxlRGF0YSwgcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5udW1fdmFyaWFibGVEYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlRTUEVDOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMudHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5wc2IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMudXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2NoZWR1bGUgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnNjaGVkdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZCAoNyk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMudW51c2VkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5maXhlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5udW1fVENMQVM7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJUQ0xBU1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0ucHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS51c2VyX3ByaW9yaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uY2xhc3NpZmllcl90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uY2xhc3NpZmllcl9tYXNrLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uY2xhc3NpZmllcl90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLmRlc3QsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnR5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucHJvdG8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc291cmNlLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVENMQVNTUFJPQzpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTU1BST0MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1NQUk9DLnByb2Nlc3NpbmcsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVFNEZWxheTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTRGVsYXkucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU0RlbGF5LmRlbGF5LCA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlNjaGVkdWxlOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg5KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5yZXNlcnZlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5zZXJ2aWNlX2ludGVydmFsLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5tYXhfc2VydmljZV9kdXIsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnNwZWNfaW50ZXJ2YWwsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV01NVFNQRUM6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHNpZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnBzYik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaW5mb19hY2tfcG9sICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50c2luZm9fYWNrX3BvbCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fcnN2ZCAoNyk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHNpbmZvX3JzdmQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYnVyc3Rfc2l6ZV9kZWZuICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5idXJzdF9zaXplX2RlZm4pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2l6ZSAoMTUpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnNpemUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmZpeGVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5taW5fc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnN1c3BlbnNpb25faW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1lYW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuZGVsYXlfYm91bmQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1lZGl1bV90aW1lLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPlJJQ0RhdGFEZXNjW2ldLm51bV9XTU1UQ0xBUzsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVRDTEFTWyVkXTpcbiIpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5wcmVzZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS51c2VyX3ByaW9yaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uY2xhc3NpZmllcl90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uY2xhc3NpZmllcl9tYXNrLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uY2xhc3NpZmllcl90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLmRlc3QsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnR5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucHJvdG8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc291cmNlLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV01NVENMQVNQUk9DOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNQUk9DLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNQUk9DLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTUFJPQy5wcm9jZXNzaW5nLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVRTRGVsYXk6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU0RlbGF5LnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNEZWxheS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU0RlbGF5LmRlbGF5LCA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVNjaGVkdWxlOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg5KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5yZXNlcnZlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5zZXJ2aWNlX2ludGVydmFsLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5tYXhfc2VydmljZV9kdXIsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnNwZWNfaW50ZXJ2YWwsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV1BBOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldQQS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS52ZXJzaW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLm11bHRpY2FzdF9jaXBoZXIsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJzLCA0ICogcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5XUEEuYXV0aF9zdWl0ZXMsIDQgKiBwRnJtLT5XUEEuYXV0aF9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5jYXBzLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiSFRDYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWR2Q29kaW5nQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYWR2Q29kaW5nQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm1pbW9Qb3dlclNhdmUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5taW1vUG93ZXJTYXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJncmVlbkZpZWxkICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZ3JlZW5GaWVsZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2hvcnRHSTIwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTIwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJzaG9ydEdJNDBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zaG9ydEdJNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInR4U1RCQyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnhTVEJDICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5kZWxheWVkQkEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm1heGltYWxBTVNEVXNpemUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJkc3NzQ2NrTW9kZTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZHNzc0Nja01vZGU0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicHNtcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBzbXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInN0YmNDb250cm9sRnJhbWUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdGJjQ29udHJvbEZyYW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm1heFJ4QU1QRFVGYWN0b3IgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJtcGR1RGVuc2l0eSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1wZHVEZW5zaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDEgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5IVENhcHMuc3VwcG9ydGVkTUNTU2V0LCAxNik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicGNvICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucGNvKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0cmFuc2l0aW9uVGltZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnRyYW5zaXRpb25UaW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDIgKDUpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm1jc0ZlZWRiYWNrICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWNzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkMyAoNik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJ4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0eFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiaW1wbGljaXRUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuaW1wbGljaXRUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJjYWxpYnJhdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNhbGlicmF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdENTSVR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSVR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdEJGQ1NJRmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdEJGQ1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImNzaU51bUJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jc2lOdW1CRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDQgKDcpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFudGVubmFTZWxlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hU2VsZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyeEFTICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhBUyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHhTb3VuZGluZ1BQRFVzICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTb3VuZGluZ1BQRFVzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5IVENhcHMucnN2ZCwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiSFRJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUSW5mby5wcmltYXJ5Q2hhbm5lbCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAoMik6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJlY29tbWVuZGVkVHhXaWR0aFNldCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlY29tbWVuZGVkVHhXaWR0aFNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmlmc01vZGUgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yaWZzTW9kZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiY29udHJvbGxlZEFjY2Vzc09ubHkgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5jb250cm9sbGVkQWNjZXNzT25seSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2VydmljZUludGVydmFsR3JhbnVsYXJpdHkgKDMpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5zZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgib3BNb2RlICgyKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ub3BNb2RlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJub25HRkRldmljZXNQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ubm9uR0ZEZXZpY2VzUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHJhbnNtaXRCdXJzdExpbWl0ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8udHJhbnNtaXRCdXJzdExpbWl0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJvYnNzTm9uSFRTdGFQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ub2Jzc05vbkhUU3RhUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDExKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImJhc2ljU1RCQ01DUyAoNyk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmJhc2ljU1RCQ01DUyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZHVhbENUU1Byb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5kdWFsQ1RTUHJvdGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2Vjb25kYXJ5QmVhY29uICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2Vjb25kYXJ5QmVhY29uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJwY29BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5wY29BY3RpdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInBjb1BoYXNlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucGNvUGhhc2UpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkMiAoNCk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlc2VydmVkMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUSW5mby5iYXNpY01DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVEluZm8ubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5IVEluZm8ucnN2ZCwgcEZybS0+SFRJbmZvLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV01NUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTVBhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLnFvc0luZm8sIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucmVzZXJ2ZWQyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMudW51c2VkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJDQ1hSYWRNZ210Q2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFJhZE1nbXRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hSYWRNZ210Q2FwLm1nbXRfc3RhdGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm1ic3NpZF9tYXNrICgzKTogJWRcbiIpLCBwRnJtLT5DQ1hSYWRNZ210Q2FwLm1ic3NpZF9tYXNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoNSk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkNDWFRyYWZTdHJtTWV0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFRyYWZTdHJtTWV0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQudHNpZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnN0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQubXNtdF9pbnRlcnZhbCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkNDWFR4bWl0UG93ZXI6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVHhtaXRQb3dlci5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFR4bWl0UG93ZXIucG93ZXJfbGltaXQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnJlc2VydmVkLCAxKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+bnVtX1dNTVRTUEVDOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJXTU1UU1BFQ1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldNTVRTUEVDW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0udmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHNpZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0ucHNiKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaW5mb19hY2tfcG9sICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS50c2luZm9fYWNrX3BvbCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaW5mb19yc3ZkICg3KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS50c2luZm9fcnN2ZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImJ1cnN0X3NpemVfZGVmbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uYnVyc3Rfc2l6ZV9kZWZuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2l6ZSAoMTUpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnNpemUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uZml4ZWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5taW5fc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnN1c3BlbnNpb25faW50LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1lYW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0uZGVsYXlfYm91bmQsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1lZGl1bV90aW1lLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQ0NYVHJhZlN0cm1SYXRlU2V0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFRyYWZTdHJtUmF0ZVNldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtUmF0ZVNldC50c2lkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fdHNyYXRlczogJWQuXG4iKSwgcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0Lm51bV90c3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0LnRzcmF0ZXMsIHBGcm0tPkNDWFRyYWZTdHJtUmF0ZVNldC5udW1fdHNyYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkFpcmdvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJQcm9wU3VwcFJhdGVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJBUE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkFQTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX25hbWU6ICVkLlxuIiksIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5BUE5hbWUubmFtZSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJIQ0Y6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkhDRi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkhDRi5lbmFibGVkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJXRFM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLldEUy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX3dkc0RhdGE6ICVkLlxuIiksIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5XRFMud2RzRGF0YSwgcEZybS0+QWlyZ28uV0RTLm51bV93ZHNEYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJCUEluZGljYXRvcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci5pbmRpY2F0b3IsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTG9hZEluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8ubnVtX3N0YXMsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8uY2hhbm5lbF91dGlsLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJMb2FkQmFsYW5jZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJQcm9wQXNzb2NUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEFzc29jVHlwZS50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJMTEF0dHI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxMQXR0ci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxMQXR0ci5kZWZlcl90aHJlc2hvbGQsIDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlByb3BDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LmNhcGFiaWxpdHksIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5WZXJzaW9uLmNoaXBfcmV2LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2FyZF90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX2J1aWxkX3ZlcnNpb246ICVkLlxuIiksIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uVmVyc2lvbi5idWlsZF92ZXJzaW9uLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJQcm9wRURDQVBhcmFtczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5xb3MsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVGl0YW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRpdGFuLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29uY2F0X3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbXByZXNzaW9uX3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNiX3N0YXRlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLnJldl9mY3Nfc3RhdGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlByb3BDaGFublN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLm1vZGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnByaW1hcnlfY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4uc3ViX2JhbmQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLmNoYW5uZWxfc3dpdGNoX2NvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJQcm9wUXVpZXRCU1M6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfcGVyaW9kLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfb2Zmc2V0LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJUcmlnZ2VyU3RhQmdTY2FuOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UcmlnZ2VyU3RhQmdTY2FuLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5lbmFibGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlRhdXJ1czpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGF1cnVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhVElEQml0bWFwLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVBvbGljeSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImJhQnVmZmVyU2l6ZSAoMTIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlRhdXJ1cy5iYUJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyc3ZkICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMucnN2ZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIldzY1JlYXNzb2NSZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V3NjUmVhc3NvY1Jlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUmVhc3NvY1Jlcy5WZXJzaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjUmVhc3NvY1Jlcy5WZXJzaW9uLm1pbm9yKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibWFqb3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY1JlYXNzb2NSZXMuVmVyc2lvbi5tYWpvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUmVzcG9uc2VUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NSZWFzc29jUmVzLlJlc3BvbnNlVHlwZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1JlYXNzb2NSZXMuUmVzcG9uc2VUeXBlLnJlc1R5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlZlbmRvckV4dGVuc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUmVhc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NSZWFzc29jUmVzLlZlbmRvckV4dGVuc2lvbi52ZW5kb3JJZCwgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlZlcnNpb24yOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjUmVhc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NSZWFzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5taW5vcik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJtYWpvciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjUmVhc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWFqb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQXV0aG9yaXplZE1BQ3M6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NSZWFzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5BdXRob3JpemVkTUFDcy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1JlYXNzb2NSZXMuVmVuZG9yRXh0ZW5zaW9uLkF1dGhvcml6ZWRNQUNzLm1hYywgNik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJSZXF1ZXN0VG9FbnJvbGw6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NSZWFzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5SZXF1ZXN0VG9FbnJvbGwucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NSZWFzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5SZXF1ZXN0VG9FbnJvbGwucmVxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlAyUEFzc29jUmVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUEFzc29jUmVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJQMlBTdGF0dXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEFzc29jUmVzLlAyUFN0YXR1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEFzc29jUmVzLlAyUFN0YXR1cy5zdGF0dXMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkV4dGVuZGVkTGlzdGVuVGltaW5nOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBBc3NvY1Jlcy5FeHRlbmRlZExpc3RlblRpbWluZy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEFzc29jUmVzLkV4dGVuZGVkTGlzdGVuVGltaW5nLmF2YWlsaWJpbGl0eVBlcmlvZCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBBc3NvY1Jlcy5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlJbnRlcnZhbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrUmVBc3NvY1Jlc3BvbnNlLiAqLworCisgICAgc3RhdGljIGNvbnN0IHRGRkRlZm4gRkZTX1NNUG93ZXJTYXZlW10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZlNNUG93ZXJTYXZlLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmU01Qb3dlclNhdmUsIEFjdGlvbiksIFNpZ0ZmQWN0aW9uICwgRE9UMTFGX0ZGX0FDVElPTl9MRU4sIH0sCisgICAgICAgIHsgIlNNUG93ZXJNb2RlU2V0Iiwgb2Zmc2V0b2YodERvdDExZlNNUG93ZXJTYXZlLCBTTVBvd2VyTW9kZVNldCksIFNpZ0ZmU01Qb3dlck1vZGVTZXQgLCBET1QxMUZfRkZfU01QT1dFUk1PREVTRVRfTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfU01Qb3dlclNhdmVbXSA9IHsKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tTTVBvd2VyU2F2ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmU01Qb3dlclNhdmUgKnBGcm0pCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICBzdGF0dXMgPSBVbnBhY2tDb3JlKHBDdHgsIHBCdWYsIG5CdWYsIEZGU19TTVBvd2VyU2F2ZSwgSUVTX1NNUG93ZXJTYXZlLCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfU01QT1dFUlNBVkUpLCBGUkZMKCJVbnBhY2tlZCB0aGUgU01Qb3dlclNhdmU6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9TTVBPV0VSU0FWRSksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfU01QT1dFUlNBVkUpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1NNUE9XRVJTQVZFKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9TTVBPV0VSU0FWRSksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9TTVBPV0VSU0FWRSksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1NNUE9XRVJTQVZFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfU01QT1dFUlNBVkUpLCBGUkZMKCJTTVBvd2VyTW9kZVNldDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1NNUE9XRVJTQVZFKSwgRlJGTCgiUG93ZXJTYXZlX0VuICgxKTogJWRcbiIpLCBwRnJtLT5TTVBvd2VyTW9kZVNldC5Qb3dlclNhdmVfRW4pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfU01QT1dFUlNBVkUpLCBGUkZMKCJNb2RlICgxKTogJWRcbiIpLCBwRnJtLT5TTVBvd2VyTW9kZVNldC5Nb2RlKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1NNUE9XRVJTQVZFKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPlNNUG93ZXJNb2RlU2V0LnJlc2VydmVkKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrU01Qb3dlclNhdmUuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfVFBDUmVwb3J0W10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZlRQQ1JlcG9ydCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZlRQQ1JlcG9ydCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmVFBDUmVwb3J0LCBEaWFsb2dUb2tlbiksIFNpZ0ZmRGlhbG9nVG9rZW4gLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfVFBDUmVwb3J0W10gPSB7CisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmVFBDUmVwb3J0LCBUUENSZXBvcnQpLCBvZmZzZXRvZih0RG90MTFmSUVUUENSZXBvcnQsIHByZXNlbnQpLCAwLCAiVFBDUmVwb3J0IiAsIDAsIDQsIDQsIFNpZ0llVFBDUmVwb3J0LCB7MCwgMCwgMCwgMCwgMH0sIDAsIERPVDExRl9FSURfVFBDUkVQT1JULCAxLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja1RQQ1JlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmVFBDUmVwb3J0ICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfVFBDUmVwb3J0LCBJRVNfVFBDUmVwb3J0LCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVQT1JUKSwgRlJGTCgiVW5wYWNrZWQgdGhlIFRQQ1JlcG9ydDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1RQQ1JFUE9SVCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVQT1JUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1RQQ1JFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1RQQ1JFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBGUkZMKCJUUENSZXBvcnQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VFBDUmVwb3J0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LnR4X3Bvd2VyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LmxpbmtfbWFyZ2luLCAxKTsKKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tUUENSZXBvcnQuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfVFBDUmVxdWVzdFtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZUUENSZXF1ZXN0LCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmVFBDUmVxdWVzdCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmVFBDUmVxdWVzdCwgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1RQQ1JlcXVlc3RbXSA9IHsKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZUUENSZXF1ZXN0LCBUUENSZXF1ZXN0KSwgb2Zmc2V0b2YodERvdDExZklFVFBDUmVxdWVzdCwgcHJlc2VudCksIDAsICJUUENSZXF1ZXN0IiAsIDAsIDIsIDIsIFNpZ0llVFBDUmVxdWVzdCwgezAsIDAsIDAsIDAsIDB9LCAwLCBET1QxMUZfRUlEX1RQQ1JFUVVFU1QsIDEsIH0sCisgICAgezAsIDAsIDAsIE5VTEwsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwLCAwfSwgMCwgMHhmZiwgMCwgfSwgICAgfTsKKwordEFOSV9VMzIgZG90MTFmVW5wYWNrVFBDUmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmVFBDUmVxdWVzdCAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX1RQQ1JlcXVlc3QsIElFU19UUENSZXF1ZXN0LCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksIEZSRkwoIlVucGFja2VkIHRoZSBUUENSZXF1ZXN0OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVFVRVNUKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1RQQ1JFUVVFU1QpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1RQQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksIEZSRkwoIlRQQ1JlcXVlc3Q6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VFBDUmVxdWVzdC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja1RQQ1JlcXVlc3QuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfV01NQWRkVFNSZXF1ZXN0W10gPSB7CisgICAgICAgIHsgIkNhdGVnb3J5Iiwgb2Zmc2V0b2YodERvdDExZldNTUFkZFRTUmVxdWVzdCwgQ2F0ZWdvcnkpLCBTaWdGZkNhdGVnb3J5ICwgRE9UMTFGX0ZGX0NBVEVHT1JZX0xFTiwgfSwKKyAgICAgICAgeyAiQWN0aW9uIiwgb2Zmc2V0b2YodERvdDExZldNTUFkZFRTUmVxdWVzdCwgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmV01NQWRkVFNSZXF1ZXN0LCBEaWFsb2dUb2tlbiksIFNpZ0ZmRGlhbG9nVG9rZW4gLCBET1QxMUZfRkZfRElBTE9HVE9LRU5fTEVOLCB9LAorICAgICAgICB7ICJTdGF0dXNDb2RlIiwgb2Zmc2V0b2YodERvdDExZldNTUFkZFRTUmVxdWVzdCwgU3RhdHVzQ29kZSksIFNpZ0ZmU3RhdHVzQ29kZSAsIERPVDExRl9GRl9TVEFUVVNDT0RFX0xFTiwgfSwKKyAgICB7IE5VTEwsIDAsIDAsIDAsfSwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHRJRURlZm4gSUVTX1dNTUFkZFRTUmVxdWVzdFtdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZldNTUFkZFRTUmVxdWVzdCwgV01NVFNQRUMpLCBvZmZzZXRvZih0RG90MTFmSUVXTU1UU1BFQywgcHJlc2VudCksIDAsICJXTU1UU1BFQyIgLCAwLCA2MywgNjMsIFNpZ0llV01NVFNQRUMsIHswLCA4MCwgMjQyLCAyLCAyfSwgNSwgRE9UMTFGX0VJRF9XTU1UU1BFQywgMSwgfSwKKyAgICAgICAge29mZnNldG9mKHREb3QxMWZXTU1BZGRUU1JlcXVlc3QsIENDWFRyYWZTdHJtUmF0ZVNldCksIG9mZnNldG9mKHREb3QxMWZJRUNDWFRyYWZTdHJtUmF0ZVNldCwgcHJlc2VudCksIDAsICJDQ1hUcmFmU3RybVJhdGVTZXQiICwgMCwgNywgMTUsIFNpZ0llQ0NYVHJhZlN0cm1SYXRlU2V0LCB7MCwgNjQsIDE1MCwgOCwgMH0sIDQsIERPVDExRl9FSURfQ0NYVFJBRlNUUk1SQVRFU0VULCAwLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja1dNTUFkZFRTUmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0RG90MTFmV01NQWRkVFNSZXF1ZXN0ICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfV01NQWRkVFNSZXF1ZXN0LCBJRVNfV01NQWRkVFNSZXF1ZXN0LCAoIHRBTklfVTgqIClwRnJtLCBzaXplb2YoKnBGcm0pKTsKKworICAgICh2b2lkKWk7CisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgiVW5wYWNrZWQgdGhlIFdNTUFkZFRTUmVxdWVzdDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJTdGF0dXNDb2RlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlN0YXR1c0NvZGUuc3RhdHVzQ29kZSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJXTU1UU1BFQzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1UU1BFQy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2lkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmRpcmVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnBzYik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJ0c2luZm9fcnN2ZCAoNyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHNpbmZvX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksIEZSRkwoImJ1cnN0X3NpemVfZGVmbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuYnVyc3Rfc2l6ZV9kZWZuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmZpeGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJDQ1hUcmFmU3RybVJhdGVTZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0LnRzaWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksIEZSRkwoIm51bV90c3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQubnVtX3RzcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQudHNyYXRlcywgcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0Lm51bV90c3JhdGVzKTsKKyAgICAgICAgfQorICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tXTU1BZGRUU1JlcXVlc3QuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfV01NQWRkVFNSZXNwb25zZVtdID0geworICAgICAgICB7ICJDYXRlZ29yeSIsIG9mZnNldG9mKHREb3QxMWZXTU1BZGRUU1Jlc3BvbnNlLCBDYXRlZ29yeSksIFNpZ0ZmQ2F0ZWdvcnkgLCBET1QxMUZfRkZfQ0FURUdPUllfTEVOLCB9LAorICAgICAgICB7ICJBY3Rpb24iLCBvZmZzZXRvZih0RG90MTFmV01NQWRkVFNSZXNwb25zZSwgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmV01NQWRkVFNSZXNwb25zZSwgRGlhbG9nVG9rZW4pLCBTaWdGZkRpYWxvZ1Rva2VuICwgRE9UMTFGX0ZGX0RJQUxPR1RPS0VOX0xFTiwgfSwKKyAgICAgICAgeyAiU3RhdHVzQ29kZSIsIG9mZnNldG9mKHREb3QxMWZXTU1BZGRUU1Jlc3BvbnNlLCBTdGF0dXNDb2RlKSwgU2lnRmZTdGF0dXNDb2RlICwgRE9UMTFGX0ZGX1NUQVRVU0NPREVfTEVOLCB9LAorICAgIHsgTlVMTCwgMCwgMCwgMCx9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgdElFRGVmbiBJRVNfV01NQWRkVFNSZXNwb25zZVtdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZldNTUFkZFRTUmVzcG9uc2UsIFdNTVRTUEVDKSwgb2Zmc2V0b2YodERvdDExZklFV01NVFNQRUMsIHByZXNlbnQpLCAwLCAiV01NVFNQRUMiICwgMCwgNjMsIDYzLCBTaWdJZVdNTVRTUEVDLCB7MCwgODAsIDI0MiwgMiwgMn0sIDUsIERPVDExRl9FSURfV01NVFNQRUMsIDAsIH0sCisgICAgICAgIHtvZmZzZXRvZih0RG90MTFmV01NQWRkVFNSZXNwb25zZSwgQ0NYVHJhZlN0cm1NZXQpLCBvZmZzZXRvZih0RG90MTFmSUVDQ1hUcmFmU3RybU1ldCwgcHJlc2VudCksIDAsICJDQ1hUcmFmU3RybU1ldCIgLCAwLCAxMCwgMTAsIFNpZ0llQ0NYVHJhZlN0cm1NZXQsIHswLCA2NCwgMTUwLCA3LCAwfSwgNCwgRE9UMTFGX0VJRF9DQ1hUUkFGU1RSTU1FVCwgMCwgfSwKKyAgICB7MCwgMCwgMCwgTlVMTCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDAsIDB9LCAwLCAweGZmLCAwLCB9LCAgICB9OworCit0QU5JX1UzMiBkb3QxMWZVbnBhY2tXTU1BZGRUU1Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZXTU1BZGRUU1Jlc3BvbnNlICpwRnJtKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgc3RhdHVzID0gVW5wYWNrQ29yZShwQ3R4LCBwQnVmLCBuQnVmLCBGRlNfV01NQWRkVFNSZXNwb25zZSwgSUVTX1dNTUFkZFRTUmVzcG9uc2UsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgiVW5wYWNrZWQgdGhlIFdNTUFkZFRTUmVzcG9uc2U6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgiU3RhdHVzQ29kZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+U3RhdHVzQ29kZS5zdGF0dXNDb2RlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJXTU1UU1BFQzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1UU1BFQy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHNpZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMucHNiKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoInRzaW5mb19hY2tfcG9sICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2luZm9fYWNrX3BvbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoInRzaW5mb19yc3ZkICg3KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2luZm9fcnN2ZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoImJ1cnN0X3NpemVfZGVmbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuYnVyc3Rfc2l6ZV9kZWZuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgic2l6ZSAoMTUpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnNpemUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuZml4ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5taW5fc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnN1c3BlbnNpb25faW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1lYW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuZGVsYXlfYm91bmQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1lZGl1bV90aW1lLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoIkNDWFRyYWZTdHJtTWV0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFRyYWZTdHJtTWV0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC50c2lkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnN0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0Lm1zbXRfaW50ZXJ2YWwsIDIpOworICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja1dNTUFkZFRTUmVzcG9uc2UuICovCisKKyAgICBzdGF0aWMgY29uc3QgdEZGRGVmbiBGRlNfV01NRGVsVFNbXSA9IHsKKyAgICAgICAgeyAiQ2F0ZWdvcnkiLCBvZmZzZXRvZih0RG90MTFmV01NRGVsVFMsIENhdGVnb3J5KSwgU2lnRmZDYXRlZ29yeSAsIERPVDExRl9GRl9DQVRFR09SWV9MRU4sIH0sCisgICAgICAgIHsgIkFjdGlvbiIsIG9mZnNldG9mKHREb3QxMWZXTU1EZWxUUywgQWN0aW9uKSwgU2lnRmZBY3Rpb24gLCBET1QxMUZfRkZfQUNUSU9OX0xFTiwgfSwKKyAgICAgICAgeyAiRGlhbG9nVG9rZW4iLCBvZmZzZXRvZih0RG90MTFmV01NRGVsVFMsIERpYWxvZ1Rva2VuKSwgU2lnRmZEaWFsb2dUb2tlbiAsIERPVDExRl9GRl9ESUFMT0dUT0tFTl9MRU4sIH0sCisgICAgICAgIHsgIlN0YXR1c0NvZGUiLCBvZmZzZXRvZih0RG90MTFmV01NRGVsVFMsIFN0YXR1c0NvZGUpLCBTaWdGZlN0YXR1c0NvZGUgLCBET1QxMUZfRkZfU1RBVFVTQ09ERV9MRU4sIH0sCisgICAgeyBOVUxMLCAwLCAwLCAwLH0sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB0SUVEZWZuIElFU19XTU1EZWxUU1tdID0geworICAgICAgICB7b2Zmc2V0b2YodERvdDExZldNTURlbFRTLCBXTU1UU1BFQyksIG9mZnNldG9mKHREb3QxMWZJRVdNTVRTUEVDLCBwcmVzZW50KSwgMCwgIldNTVRTUEVDIiAsIDAsIDYzLCA2MywgU2lnSWVXTU1UU1BFQywgezAsIDgwLCAyNDIsIDIsIDJ9LCA1LCBET1QxMUZfRUlEX1dNTVRTUEVDLCAxLCB9LAorICAgIHswLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCAwLCB7MCwgMCwgMCwgMCwgMH0sIDAsIDB4ZmYsIDAsIH0sICAgIH07CisKK3RBTklfVTMyIGRvdDExZlVucGFja1dNTURlbFRTKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHREb3QxMWZXTU1EZWxUUyAqcEZybSkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgIHN0YXR1cyA9IFVucGFja0NvcmUocEN0eCwgcEJ1ZiwgbkJ1ZiwgRkZTX1dNTURlbFRTLCBJRVNfV01NRGVsVFMsICggdEFOSV9VOCogKXBGcm0sIHNpemVvZigqcEZybSkpOworCisgICAgKHZvaWQpaTsKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoIlVucGFja2VkIHRoZSBXTU1EZWxUUzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJTdGF0dXNDb2RlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+U3RhdHVzQ29kZS5zdGF0dXNDb2RlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgRlJGTCgiV01NVFNQRUM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NVFNQRUMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2lkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMucHNiKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoInRzaW5mb19yc3ZkICg3KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2luZm9fcnN2ZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJidXJzdF9zaXplX2RlZm4gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmJ1cnN0X3NpemVfZGVmbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuZml4ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICB9CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja1dNTURlbFRTLiAqLworCitzdGF0aWMgdEFOSV9VMzIgVW5wYWNrQ29yZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0RkZEZWZuICBGRnNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRJRURlZm4gIElFc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgIG5Gcm0pCit7CisgICAgY29uc3QgdEZGRGVmbiAqcEZmOworICAgIGNvbnN0IHRJRURlZm4gKnBJZTsKKyAgICB0QU5JX1U4ICAgKnBCdWZSZW1haW5pbmc7CisgICAgdEFOSV9VMzIgIG5CdWZSZW1haW5pbmcsIHN0YXR1czsKKyAgICB0QU5JX1U4ICAgZWlkLCBsZW47CisgICAgdEZSQU1FU19CT09MICAqcGZGb3VuZDsKKyAgICB0QU5JX1UzMiAgY291bnRPZmZzZXQgPSAwOworCisgICAgRE9UMTFGX1BBUkFNRVRFUl9DSEVDSyhwQnVmLCBuQnVmLCBwRnJtLCBuRnJtKTsKKyAgICAodm9pZCluRnJtOworCisgICAgKHZvaWQpcEN0eDsKKyAgICBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwQnVmUmVtYWluaW5nID0gcEJ1ZjsKKyAgICBuQnVmUmVtYWluaW5nID0gbkJ1ZjsKKworICAgIHBJZSA9ICZJRXNbMF07CisgICAgd2hpbGUgKDB4ZmYgIT0gcEllLT5laWQpCisgICAgeworICAgICAgICBwZkZvdW5kID0gKHRGUkFNRVNfQk9PTCopKHBGcm0gKyBwSWUtPm9mZnNldCArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZS0+cHJlc2VuY2VPZmZzZXQpOworICAgICAgICAqcGZGb3VuZCA9IDBVOworICAgICAgICBpZiAocEllLT5jb3VudE9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgKiggdEFOSV9VMTYqICkocEZybSArIHBJZS0+Y291bnRPZmZzZXQpID0gMFU7CisgICAgICAgIH0KKyAgICAgICAgKytwSWU7CisgICAgfQorCisgICAgcEZmID0gJkZGc1swXTsKKyAgICB3aGlsZSAocEZmLT5zaXplKQorICAgIHsKKyAgICAgICAgaWYgKHBGZi0+c2l6ZSA+IG5CdWZSZW1haW5pbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0czKHBDdHgsIEZSTE9HRSwgRlJGTCgiRml4ZWQgZmllbGQgJXMgaXMgJWQgYiIKKyAgICAgICAgICAgICAgICAieXRlcyBpbiBzaXplLCBidXQgdGhlcmUgYXJlIG9ubHkgJWQgYnl0ZXMgbGVmdCBpIgorICAgICAgICAgICAgICAgICJuIHRoaXMgZnJhbWUuXG4iKSwgcEZmLT5uYW1lLCBwRmYtPnNpemUsCisgICAgICAgICAgICAgICAgIG5CdWZSZW1haW5pbmcpOworICAgICAgICAgICAgRlJBTUVTX0RCR19CUkVBSygpOworICAgICAgICAgICAgcmV0dXJuIERPVDExRl9NSVNTSU5HX0ZJWEVEX0ZJRUxEOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChwRmYtPnNpZykKKyAgICAgICAgeworCisgICAgICAgIGNhc2UgU2lnRmZBSUQ6CisgICAgICAgICAgICBkb3QxMWZVbnBhY2tGZkNvbW1vbkZ1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgKHRBTklfVTE2KikmKCgoIHREb3QxMWZGZkFJRCogKShwRnJtICsgcEZmLT5vZmZzZXQgKSktPmFzc29jaWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpZ0ZmQWN0aW9uOgorICAgICAgICAgICAgZG90MTFmVW5wYWNrRmZBY3Rpb24ocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZBY3Rpb24qICkocEZybSArIHBGZi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZBZGRCQVBhcmFtZXRlclNldDoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmQWRkQkFQYXJhbWV0ZXJTZXQocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZBZGRCQVBhcmFtZXRlclNldCogKShwRnJtICsgcEZmLT5vZmZzZXQgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTaWdGZkF1dGhBbGdvOgorICAgICAgICAgICAgZG90MTFmVW5wYWNrRmZDb21tb25GdW5jKHBDdHgsIHBCdWZSZW1haW5pbmcsICh0QU5JX1UxNiopJigoKCB0RG90MTFmRmZBdXRoQWxnbyogKShwRnJtICsgcEZmLT5vZmZzZXQgKSktPmFsZ28pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpZ0ZmQXV0aFNlcU5vOgorICAgICAgICAgICAgZG90MTFmVW5wYWNrRmZDb21tb25GdW5jKHBDdHgsIHBCdWZSZW1haW5pbmcsICh0QU5JX1UxNiopJigoKCB0RG90MTFmRmZBdXRoU2VxTm8qICkocEZybSArIHBGZi0+b2Zmc2V0ICkpLT5ubykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sOgorICAgICAgICAgICAgZG90MTFmVW5wYWNrRmZCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sKHBDdHgsIHBCdWZSZW1haW5pbmcsICggdERvdDExZkZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbCogKShwRnJtICsgcEZmLT5vZmZzZXQgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTaWdGZkJBVGltZW91dDoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmQ29tbW9uRnVuYyhwQ3R4LCBwQnVmUmVtYWluaW5nLCAodEFOSV9VMTYqKSYoKCggdERvdDExZkZmQkFUaW1lb3V0KiApKHBGcm0gKyBwRmYtPm9mZnNldCApKS0+dGltZW91dCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZCZWFjb25JbnRlcnZhbDoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmQ29tbW9uRnVuYyhwQ3R4LCBwQnVmUmVtYWluaW5nLCAodEFOSV9VMTYqKSYoKCggdERvdDExZkZmQmVhY29uSW50ZXJ2YWwqICkocEZybSArIHBGZi0+b2Zmc2V0ICkpLT5pbnRlcnZhbCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZDYXBhYmlsaXRpZXM6CisgICAgICAgICAgICBkb3QxMWZVbnBhY2tGZkNhcGFiaWxpdGllcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCAoIHREb3QxMWZGZkNhcGFiaWxpdGllcyogKShwRnJtICsgcEZmLT5vZmZzZXQgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTaWdGZkNhdGVnb3J5OgorICAgICAgICAgICAgZG90MTFmVW5wYWNrRmZDYXRlZ29yeShwQ3R4LCBwQnVmUmVtYWluaW5nLCAoIHREb3QxMWZGZkNhdGVnb3J5KiApKHBGcm0gKyBwRmYtPm9mZnNldCApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpZ0ZmQ3VycmVudEFQQWRkcmVzczoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmQ3VycmVudEFQQWRkcmVzcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCAoIHREb3QxMWZGZkN1cnJlbnRBUEFkZHJlc3MqICkocEZybSArIHBGZi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZEZWxCQVBhcmFtZXRlclNldDoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmRGVsQkFQYXJhbWV0ZXJTZXQocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZEZWxCQVBhcmFtZXRlclNldCogKShwRnJtICsgcEZmLT5vZmZzZXQgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTaWdGZkRpYWxvZ1Rva2VuOgorICAgICAgICAgICAgZG90MTFmVW5wYWNrRmZEaWFsb2dUb2tlbihwQ3R4LCBwQnVmUmVtYWluaW5nLCAoIHREb3QxMWZGZkRpYWxvZ1Rva2VuKiApKHBGcm0gKyBwRmYtPm9mZnNldCApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpZ0ZmTGlua01hcmdpbjoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmTGlua01hcmdpbihwQ3R4LCBwQnVmUmVtYWluaW5nLCAoIHREb3QxMWZGZkxpbmtNYXJnaW4qICkocEZybSArIHBGZi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZMaXN0ZW5JbnRlcnZhbDoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmQ29tbW9uRnVuYyhwQ3R4LCBwQnVmUmVtYWluaW5nLCAodEFOSV9VMTYqKSYoKCggdERvdDExZkZmTGlzdGVuSW50ZXJ2YWwqICkocEZybSArIHBGZi0+b2Zmc2V0ICkpLT5pbnRlcnZhbCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZNYXhUeFBvd2VyOgorICAgICAgICAgICAgZG90MTFmVW5wYWNrRmZNYXhUeFBvd2VyKHBDdHgsIHBCdWZSZW1haW5pbmcsICggdERvdDExZkZmTWF4VHhQb3dlciogKShwRnJtICsgcEZmLT5vZmZzZXQgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTaWdGZk51bU9mUmVwZXRpdGlvbnM6CisgICAgICAgICAgICBkb3QxMWZVbnBhY2tGZk51bU9mUmVwZXRpdGlvbnMocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZOdW1PZlJlcGV0aXRpb25zKiApKHBGcm0gKyBwRmYtPm9mZnNldCApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpZ0ZmUDJQT1VJOgorICAgICAgICAgICAgZG90MTFmVW5wYWNrRmZQMlBPVUkocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZQMlBPVUkqICkocEZybSArIHBGZi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZQMlBPVUlTdWJUeXBlOgorICAgICAgICAgICAgZG90MTFmVW5wYWNrRmZQMlBPVUlTdWJUeXBlKHBDdHgsIHBCdWZSZW1haW5pbmcsICggdERvdDExZkZmUDJQT1VJU3ViVHlwZSogKShwRnJtICsgcEZmLT5vZmZzZXQgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTaWdGZlJDUEk6CisgICAgICAgICAgICBkb3QxMWZVbnBhY2tGZlJDUEkocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZSQ1BJKiApKHBGcm0gKyBwRmYtPm9mZnNldCApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpZ0ZmUlNOSToKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmUlNOSShwQ3R4LCBwQnVmUmVtYWluaW5nLCAoIHREb3QxMWZGZlJTTkkqICkocEZybSArIHBGZi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZSZWFzb246CisgICAgICAgICAgICBkb3QxMWZVbnBhY2tGZkNvbW1vbkZ1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgKHRBTklfVTE2KikmKCgoIHREb3QxMWZGZlJlYXNvbiogKShwRnJtICsgcEZmLT5vZmZzZXQgKSktPmNvZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpZ0ZmUnhBbnRlbm5hSWQ6CisgICAgICAgICAgICBkb3QxMWZVbnBhY2tGZlJ4QW50ZW5uYUlkKHBDdHgsIHBCdWZSZW1haW5pbmcsICggdERvdDExZkZmUnhBbnRlbm5hSWQqICkocEZybSArIHBGZi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZTTVBvd2VyTW9kZVNldDoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmU01Qb3dlck1vZGVTZXQocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZTTVBvd2VyTW9kZVNldCogKShwRnJtICsgcEZmLT5vZmZzZXQgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTaWdGZlN0YXR1czoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmQ29tbW9uRnVuYyhwQ3R4LCBwQnVmUmVtYWluaW5nLCAodEFOSV9VMTYqKSYoKCggdERvdDExZkZmU3RhdHVzKiApKHBGcm0gKyBwRmYtPm9mZnNldCApKS0+c3RhdHVzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTaWdGZlN0YXR1c0NvZGU6CisgICAgICAgICAgICBkb3QxMWZVbnBhY2tGZlN0YXR1c0NvZGUocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZTdGF0dXNDb2RlKiApKHBGcm0gKyBwRmYtPm9mZnNldCApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpZ0ZmVFBDRWxlSUQ6CisgICAgICAgICAgICBkb3QxMWZVbnBhY2tGZlRQQ0VsZUlEKHBDdHgsIHBCdWZSZW1haW5pbmcsICggdERvdDExZkZmVFBDRWxlSUQqICkocEZybSArIHBGZi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZUUENFbGVMZW46CisgICAgICAgICAgICBkb3QxMWZVbnBhY2tGZlRQQ0VsZUxlbihwQ3R4LCBwQnVmUmVtYWluaW5nLCAoIHREb3QxMWZGZlRQQ0VsZUxlbiogKShwRnJtICsgcEZmLT5vZmZzZXQgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTaWdGZlRTSW5mbzoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmVFNJbmZvKHBDdHgsIHBCdWZSZW1haW5pbmcsICggdERvdDExZkZmVFNJbmZvKiApKHBGcm0gKyBwRmYtPm9mZnNldCApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpZ0ZmVGltZVN0YW1wOgorICAgICAgICAgICAgZG90MTFmVW5wYWNrRmZUaW1lU3RhbXAocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZUaW1lU3RhbXAqICkocEZybSArIHBGZi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2lnRmZUeEFudGVubmFJZDoKKyAgICAgICAgICAgIGRvdDExZlVucGFja0ZmVHhBbnRlbm5hSWQocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZUeEFudGVubmFJZCogKShwRnJtICsgcEZmLT5vZmZzZXQgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTaWdGZlR4UG93ZXI6CisgICAgICAgICAgICBkb3QxMWZVbnBhY2tGZlR4UG93ZXIocEN0eCwgcEJ1ZlJlbWFpbmluZywgKCB0RG90MTFmRmZUeFBvd2VyKiApKHBGcm0gKyBwRmYtPm9mZnNldCApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJMT0dFLCBGUkZMKCJJTlRFUk5BTCBFUlJPUjogSSBkb24nIgorICAgICAgICAgICAgICAgICJ0IGtub3cgYWJvdXQgdGhlIEZGIHNpZ25hdHVyZSAlZC0tIHRoaXMgaXMgbW9zdCAiCisgICAgICAgICAgICAgICAgImxpa2VseSBhICdmcmFtZXNjJyBidWcuXG4iKSwgcEZmLT5zaWcpOworICAgICAgICAgICAgcmV0dXJuIERPVDExRl9JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHBCdWZSZW1haW5pbmcgKz0gcEZmLT5zaXplOworICAgICAgICBuQnVmUmVtYWluaW5nIC09IHBGZi0+c2l6ZTsKKyAgICAgICAgKytwRmY7CisgICAgfQorCisgICAgd2hpbGUgKG5CdWZSZW1haW5pbmcpCisgICAgeworICAgICAgICBpZiAoMSA9PSBuQnVmUmVtYWluaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkxPR0UsIEZSRkwoIlRoaXMgZnJhbWUgcmVwb3J0cyAiCisgICAgICAgICAgICAgICAgIm9ubHkgb25lIGJ5dGUgcmVtYWluaW5nIGFmdGVyIGl0J3MgZml4ZWQgZmllbGRzLlxuIikpOworICAgICAgICAgICAgc3RhdHVzIHw9IERPVDExRl9JTkNPTVBMRVRFX0lFOworICAgICAgICAgICAgRlJBTUVTX0RCR19CUkVBSygpOworICAgICAgICAgICAgZ290byBNYW5kYXRvcnlDaGVjazsKKyAgICAgICAgfQorCisgICAgICAgIHBJZSA9IEZpbmRJRURlZm4ocEN0eCwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgSUVzKTsKKworICAgICAgICBlaWQgPSAqcEJ1ZlJlbWFpbmluZysrOyAtLW5CdWZSZW1haW5pbmc7CisgICAgICAgIGxlbiA9ICpwQnVmUmVtYWluaW5nKys7IC0tbkJ1ZlJlbWFpbmluZzsKKworICAgICAgICBpZiAocEllICYmIHBJZS0+bm91aSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBJZS0+bm91aSA+IG5CdWZSZW1haW5pbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzMocEN0eCwgRlJMT0dXLCBGUkZMKCJJRSAlZCByZXBvcnRzICIKKyAgICAgICAgICAgICAgICAgICAgImxlbmd0aCAlZCwgYnV0IGl0IGhhcyBhbiBPVUkgb2YgJWQgYnl0ZXMuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgZWlkLCBsZW4sIHBJZS0+bm91aSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJMT0cxLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMihwQ3R4LCBGUkxPRzEsIEZSRkwoIldlJ3ZlIHBhcnNlZCAlZCBieSIKKyAgICAgICAgICAgICAgICAgICAgInRlcyBvZiB0aGlzIGJ1ZmZlciwgYW5kIHNob3cgJWQgbGVmdC5cbiIpLCAgICAgICAgICAgICAgICAgICAgcEJ1ZlJlbWFpbmluZyAtIHBCdWYsIG5CdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBET1QxMUZfSU5DT01QTEVURV9JRTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfREJHX0JSRUFLKCk7CisgICAgICAgICAgICAgICAgZ290byBNYW5kYXRvcnlDaGVjazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBCdWZSZW1haW5pbmcgKz0gcEllLT5ub3VpOworICAgICAgICAgICAgbkJ1ZlJlbWFpbmluZyAtPSBwSWUtPm5vdWk7CisgICAgICAgICAgICBsZW4gICAgICAgICAgIC09IHBJZS0+bm91aTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPiBuQnVmUmVtYWluaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMyhwQ3R4LCBGUkxPR1csIEZSRkwoIklFICVkIHJlcG9ydHMgbGVuZ3RoICUiCisgICAgICAgICAgICAgICAgImQsIGJ1dCB0aGVyZSBhcmUgb25seSAlZCBieXRlcyByZW1haW5pbmcgaW4gdGhpcyIKKyAgICAgICAgICAgICAgICAiIGZyYW1lLlxuIiksIGVpZCwgbGVuLCBuQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSTE9HMSwgcEJ1ZiwgbkJ1Zik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMihwQ3R4LCBGUkxPRzEsIEZSRkwoIldlJ3ZlIHBhcnNlZCAlZCBieSIKKyAgICAgICAgICAgICAgICAidGVzIG9mIHRoaXMgYnVmZmVyLCBhbmQgc2hvdyAlZCBsZWZ0LlxuIiksICAgICAgICAgICAgICAgIHBCdWZSZW1haW5pbmcgLSBwQnVmLCBuQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgIHN0YXR1cyB8PSBET1QxMUZfSU5DT01QTEVURV9JRTsKKyAgICAgICAgICAgIEZSQU1FU19EQkdfQlJFQUsoKTsKKyAgICAgICAgICAgIGdvdG8gTWFuZGF0b3J5Q2hlY2s7CisgICAgICAgIH0KKworICAgICAgICBpZiAocEllKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobkJ1ZlJlbWFpbmluZyA8IHBJZS0+bWluU2l6ZSAtIHBJZS0+bm91aSAtIDJVKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0czKHBDdHgsIEZSTE9HVywgRlJGTCgiVGhlIElFICVzIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAiYXQgbGVhc3QgJWQgYnl0ZXMgaW4gc2l6ZSwgYnV0IHRoZXJlIGFyZSBvbmwiCisgICAgICAgICAgICAgICAgICAgICJ5ICVkIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGlzIGZyYW1lLlxuIiksCisgICAgICAgICAgICAgICAgICAgIHBJZS0+bmFtZSwgcEllLT5taW5TaXplLCBuQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkxPRzEsIHBCdWYsIG5CdWYpOworICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBET1QxMUZfSU5DT01QTEVURV9JRTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfREJHX0JSRUFLKCk7CisgICAgICAgICAgICAgICAgZ290byBNYW5kYXRvcnlDaGVjazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gcEllLT5tYXhTaXplIC0gcEllLT5ub3VpIC0gMlUpeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSTE9HVywgRlJGTCgiVGhlIElFICVzIHJlcG9ydHMgIgorICAgICAgICAgICAgICAgICAgICAiYW4gdW5leHBlY3RlZGx5IGxhcmdlIHNpemU7IGl0IGlzIHByZXN1bWFibHkgIgorICAgICAgICAgICAgICAgICAgICAibW9yZSB1cC10by1kYXRlIHRoYW4gdGhpcyBwYXJzZXIsIGJ1dCB0aGlzIHdhIgorICAgICAgICAgICAgICAgICAgICAicm5pbmcgbWF5IGFsc28gaW5kaWNhdGUgYSBjb3JydXB0IGZyYW1lLlxuIiksCisgICAgICAgICAgICAgICAgICAgIHBJZS0+bmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJMT0cxLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgY291bnRPZmZzZXQgPSAoICgwICE9IHBJZS0+YXJyYXlib3VuZCkgKiAoICoodEFOSV9VMTYqICkocEZybSArIHBJZS0+Y291bnRPZmZzZXQpKSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwSWUtPnNpZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUFQTmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUFQTmFtZShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFQVBOYW1lKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVBUE5hbWUpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVCUEluZGljYXRvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUJQSW5kaWNhdG9yKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVCUEluZGljYXRvciogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQlBJbmRpY2F0b3IpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVDb25kZW5zZWRDb3VudHJ5U3RyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llQ29uZGVuc2VkQ291bnRyeVN0cihwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFQ29uZGVuc2VkQ291bnRyeVN0ciogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQ29uZGVuc2VkQ291bnRyeVN0cikqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUdUSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUdUSyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFR1RLKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVHVEspKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVIQ0Y6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVDb21tb25GdW5jKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KikgJigoKCAgdERvdDExZklFSENGKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZiggdERvdDExZklFSENGKSpjb3VudE9mZnNldCApICktPnByZXNlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTgqKSAmKCgoIHREb3QxMWZJRUhDRiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFSENGKSpjb3VudE9mZnNldCApICktPmVuYWJsZWQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUxMQXR0cjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUxMQXR0cihwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFTExBdHRyKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVMTEF0dHIpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVMb2FkQmFsYW5jZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUxvYWRCYWxhbmNlKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVMb2FkQmFsYW5jZSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFTG9hZEJhbGFuY2UpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVMb2FkSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUxvYWRJbmZvKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVMb2FkSW5mbyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFTG9hZEluZm8pKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQcm9wQXNzb2NUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llQ29tbW9uRnVuYyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCopICYoKCggIHREb3QxMWZJRVByb3BBc3NvY1R5cGUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKCB0RG90MTFmSUVQcm9wQXNzb2NUeXBlKSpjb3VudE9mZnNldCApICktPnByZXNlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTgqKSAmKCgoIHREb3QxMWZJRVByb3BBc3NvY1R5cGUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVByb3BBc3NvY1R5cGUpKmNvdW50T2Zmc2V0ICkgKS0+dHlwZSkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUHJvcENhcGFiaWxpdHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVQcm9wQ2FwYWJpbGl0eShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUHJvcENhcGFiaWxpdHkqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVByb3BDYXBhYmlsaXR5KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUHJvcENoYW5uU3dpdGNoQW5uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUHJvcENoYW5uU3dpdGNoQW5uKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVQcm9wQ2hhbm5Td2l0Y2hBbm4qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVByb3BDaGFublN3aXRjaEFubikqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVByb3BFRENBUGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUHJvcEVEQ0FQYXJhbXMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVByb3BFRENBUGFyYW1zKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQcm9wRURDQVBhcmFtcykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVByb3BRdWlldEJTUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVByb3BRdWlldEJTUyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUHJvcFF1aWV0QlNTKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQcm9wUXVpZXRCU1MpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQcm9wU3VwcFJhdGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUHJvcFN1cHBSYXRlcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUHJvcFN1cHBSYXRlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUHJvcFN1cHBSYXRlcykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVIwS0hfSUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVSMEtIX0lEKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVSMEtIX0lEKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSMEtIX0lEKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUjFLSF9JRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVIxS0hfSUQocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVIxS0hfSUQqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVIxS0hfSUQpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVUU0ZJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llVFNGSW5mbyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFVFNGSW5mbyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVFNGSW5mbykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRhdXJ1czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVRhdXJ1cyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFVGF1cnVzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVUYXVydXMpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVUaXRhbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVRpdGFuKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVUaXRhbiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVGl0YW4pKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVUcmlnZ2VyU3RhQmdTY2FuOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llQ29tbW9uRnVuYyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCopICYoKCggIHREb3QxMWZJRVRyaWdnZXJTdGFCZ1NjYW4qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKCB0RG90MTFmSUVUcmlnZ2VyU3RhQmdTY2FuKSpjb3VudE9mZnNldCApICktPnByZXNlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTgqKSAmKCgoIHREb3QxMWZJRVRyaWdnZXJTdGFCZ1NjYW4qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVRyaWdnZXJTdGFCZ1NjYW4pKmNvdW50T2Zmc2V0ICkgKS0+ZW5hYmxlKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVWZXJzaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llVmVyc2lvbihwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFVmVyc2lvbiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVmVyc2lvbikqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdEUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVdEUyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV0RTKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXRFMpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVBUENoYW5uZWxSZXBvcnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVBUENoYW5uZWxSZXBvcnQocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQVBDaGFubmVsUmVwb3J0KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQmNuUmVwb3J0aW5nRGV0YWlsOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llQmNuUmVwb3J0aW5nRGV0YWlsKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWwqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUJjblJlcG9ydGluZ0RldGFpbCkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUJlYWNvblJlcG9ydEZybUJvZHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVCZWFjb25SZXBvcnRGcm1Cb2R5KHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQmVhY29uUmVwb3J0aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llQmVhY29uUmVwb3J0aW5nKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVCZWFjb25SZXBvcnRpbmcqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUJlYWNvblJlcG9ydGluZykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZU1lYXN1cmVtZW50UGlsb3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVNZWFzdXJlbWVudFBpbG90KHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llTXVsdGlCc3NpZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZU11bHRpQnNzaWQocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRU11bHRpQnNzaWQqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRU11bHRpQnNzaWQpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSSUNEYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUklDRGF0YShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUklDRGF0YSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUklDRGF0YSkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVJJQ0Rlc2NyaXB0b3I6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVSSUNEZXNjcmlwdG9yKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVSSUNEZXNjcmlwdG9yKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSSUNEZXNjcmlwdG9yKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUlJNRW5hYmxlZENhcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVJSTUVuYWJsZWRDYXAocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVJSTUVuYWJsZWRDYXAqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVJSTUVuYWJsZWRDYXApKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSZXF1ZXN0ZWRJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUmVxdWVzdGVkSW5mbyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUmVxdWVzdGVkSW5mbyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUmVxdWVzdGVkSW5mbykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVNTSUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVTU0lEKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVTU0lEKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVTU0lEKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llU2NoZWR1bGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVTY2hlZHVsZShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFU2NoZWR1bGUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVNjaGVkdWxlKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVENMQVM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVUQ0xBUyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFVENMQVMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVRDTEFTKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVENMQVNTUFJPQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUNvbW1vbkZ1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTgqKSAmKCgoICB0RG90MTFmSUVUQ0xBU1NQUk9DKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZiggdERvdDExZklFVENMQVNTUFJPQykqY291bnRPZmZzZXQgKSApLT5wcmVzZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KikgJigoKCB0RG90MTFmSUVUQ0xBU1NQUk9DKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVUQ0xBU1NQUk9DKSpjb3VudE9mZnNldCApICktPnByb2Nlc3NpbmcpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRTRGVsYXk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVUU0RlbGF5KHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVUU0RlbGF5KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVUU0RlbGF5KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVFNQRUM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVUU1BFQyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFVFNQRUMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVRTUEVDKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV01NU2NoZWR1bGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXTU1TY2hlZHVsZShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV01NU2NoZWR1bGUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdNTVNjaGVkdWxlKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV01NVENMQVM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXTU1UQ0xBUyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV01NVENMQVMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdNTVRDTEFTKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV01NVENMQVNQUk9DOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llV01NVENMQVNQUk9DKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVXTU1UQ0xBU1BST0MqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdNTVRDTEFTUFJPQykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTVRTRGVsYXk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXTU1UU0RlbGF5KHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVXTU1UU0RlbGF5KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXTU1UU0RlbGF5KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV01NVFNQRUM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXTU1UU1BFQyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV01NVFNQRUMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdNTVRTUEVDKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQWlyZ286CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVBaXJnbyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFQWlyZ28qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUFpcmdvKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ0NYQ2NrbU9wYXF1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUNDWENja21PcGFxdWUocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRUNDWENja21PcGFxdWUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUNDWENja21PcGFxdWUpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVDQ1hSYWRNZ210Q2FwOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llQ0NYUmFkTWdtdENhcChwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFQ0NYUmFkTWdtdENhcCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQ0NYUmFkTWdtdENhcCkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNDWFRyYWZTdHJtTWV0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llQ0NYVHJhZlN0cm1NZXQocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRUNDWFRyYWZTdHJtTWV0KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDQ1hUcmFmU3RybU1ldCkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNDWFRyYWZTdHJtUmF0ZVNldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUNDWFRyYWZTdHJtUmF0ZVNldChwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFQ0NYVHJhZlN0cm1SYXRlU2V0KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDQ1hUcmFmU3RybVJhdGVTZXQpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVDQ1hUeG1pdFBvd2VyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llQ0NYVHhtaXRQb3dlcihwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFQ0NYVHhtaXRQb3dlciogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQ0NYVHhtaXRQb3dlcikqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNDWFZlcnNpb246CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVDQ1hWZXJzaW9uKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVDQ1hWZXJzaW9uKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDQ1hWZXJzaW9uKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ0ZQYXJhbXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVDRlBhcmFtcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFQ0ZQYXJhbXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUNGUGFyYW1zKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ2hhbGxlbmdlVGV4dDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUNoYWxsZW5nZVRleHQocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRUNoYWxsZW5nZVRleHQqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUNoYWxsZW5nZVRleHQpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVDaGFuU3dpdGNoQW5uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llQ2hhblN3aXRjaEFubihwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFQ2hhblN3aXRjaEFubiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQ2hhblN3aXRjaEFubikqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNvdW50cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVDb3VudHJ5KHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVDb3VudHJ5KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDb3VudHJ5KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRFNQYXJhbXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVDb21tb25GdW5jKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KikgJigoKCAgdERvdDExZklFRFNQYXJhbXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKCB0RG90MTFmSUVEU1BhcmFtcykqY291bnRPZmZzZXQgKSApLT5wcmVzZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QU5JX1U4KikgJigoKCB0RG90MTFmSUVEU1BhcmFtcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFRFNQYXJhbXMpKmNvdW50T2Zmc2V0ICkgKS0+Y3Vycl9jaGFubmVsKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVFRENBUGFyYW1TZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVFRENBUGFyYW1TZXQocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRUVEQ0FQYXJhbVNldCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFRURDQVBhcmFtU2V0KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRVJQSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUVSUEluZm8ocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRUVSUEluZm8qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUVSUEluZm8pKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVFeHRDaGFuU3dpdGNoQW5uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llQ29tbW9uRnVuYyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFOSV9VOCopICYoKCggIHREb3QxMWZJRUV4dENoYW5Td2l0Y2hBbm4qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKCB0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uKSpjb3VudE9mZnNldCApICktPnByZXNlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRBTklfVTgqKSAmKCgoIHREb3QxMWZJRUV4dENoYW5Td2l0Y2hBbm4qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUV4dENoYW5Td2l0Y2hBbm4pKmNvdW50T2Zmc2V0ICkgKS0+c2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRXh0U3VwcFJhdGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llRXh0U3VwcFJhdGVzKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVFeHRTdXBwUmF0ZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUV4dFN1cHBSYXRlcykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUZIUGFyYW1TZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVGSFBhcmFtU2V0KHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVGSFBhcmFtU2V0KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVGSFBhcmFtU2V0KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRkhQYXJhbXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVGSFBhcmFtcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFRkhQYXJhbXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUZIUGFyYW1zKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRkhQYXR0VGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVGSFBhdHRUYWJsZShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFRkhQYXR0VGFibGUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUZIUGF0dFRhYmxlKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRlRJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llRlRJbmZvKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVGVEluZm8qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUZUSW5mbykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUZUVGltZW91dEludGVydmFsOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llRlRUaW1lb3V0SW50ZXJ2YWwocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRUZUVGltZW91dEludGVydmFsKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVGVFRpbWVvdXRJbnRlcnZhbCkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUhUQ2FwczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUhUQ2FwcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFSFRDYXBzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVIVENhcHMpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVIVEluZm86CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVIVEluZm8ocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRUhUSW5mbyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFSFRJbmZvKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llSUJTU1BhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZUlCU1NQYXJhbXMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRUlCU1NQYXJhbXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUlCU1NQYXJhbXMpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVNZWFzdXJlbWVudFJlcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZU1lYXN1cmVtZW50UmVwb3J0KHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVNZWFzdXJlbWVudFJlcXVlc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVNZWFzdXJlbWVudFJlcXVlc3QocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llTW9iaWxpdHlEb21haW46CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVNb2JpbGl0eURvbWFpbihwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFTW9iaWxpdHlEb21haW4qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRU1vYmlsaXR5RG9tYWluKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llTmVpZ2hib3JSZXBvcnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVOZWlnaGJvclJlcG9ydChwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFTmVpZ2hib3JSZXBvcnQqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRU5laWdoYm9yUmVwb3J0KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQQXNzb2NSZXE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVQMlBBc3NvY1JlcShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUDJQQXNzb2NSZXEqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUEFzc29jUmVxKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQQXNzb2NSZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVQMlBBc3NvY1JlcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUDJQQXNzb2NSZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUEFzc29jUmVzKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQQmVhY29uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUDJQQmVhY29uKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVQMlBCZWFjb24qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUEJlYWNvbikqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEJlYWNvblByb2JlUmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUDJQQmVhY29uUHJvYmVSZXMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUERlQXV0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVAyUERlQXV0aChwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUDJQRGVBdXRoKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBEZUF1dGgpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUERpc0Fzc29jOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUDJQRGlzQXNzb2MocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUERpc0Fzc29jKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBEaXNBc3NvYykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEdPTmVnQ25mOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUDJQR09OZWdDbmYocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUEdPTmVnQ25mKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBHT05lZ0NuZikqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEdPTmVnUmVxOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUDJQR09OZWdSZXEocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUEdPTmVnUmVxKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBHT05lZ1JlcSkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEdPTmVnUmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUDJQR09OZWdSZXMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUEdPTmVnUmVzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBHT05lZ1JlcykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEdPTmVnV1BTOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUDJQR09OZWdXUFMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUEdPTmVnV1BTKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBHT05lZ1dQUykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUElFT3BhcXVlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUDJQSUVPcGFxdWUocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUElFT3BhcXVlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBJRU9wYXF1ZSkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEludml0YXRpb25SZXE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVQMlBJbnZpdGF0aW9uUmVxKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVxKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVxKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQSW52aXRhdGlvblJlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVAyUEludml0YXRpb25SZXMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUEludml0YXRpb25SZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUEludml0YXRpb25SZXMpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBOb3RpY2VPZkFic2VuY2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVQMlBOb3RpY2VPZkFic2VuY2UocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUE5vdGljZU9mQWJzZW5jZSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQTm90aWNlT2ZBYnNlbmNlKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQUHJlc2VuY2VSZXNwb25zZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVAyUFByZXNlbmNlUmVzcG9uc2UocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUFByZXNlbmNlUmVzcG9uc2UqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUFByZXNlbmNlUmVzcG9uc2UpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBQcm9iZVJlcToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVAyUFByb2JlUmVxKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVQMlBQcm9iZVJlcSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQUHJvYmVSZXEpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBQcm9iZVJlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVAyUFByb2JlUmVzKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVQMlBQcm9iZVJlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQUHJvYmVSZXMpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVQMlBXU0NQcm92aXNpb25EaXNjb3ZlcnlSZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVBvd2VyQ2FwczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVBvd2VyQ2FwcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUG93ZXJDYXBzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQb3dlckNhcHMpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQb3dlckNvbnN0cmFpbnRzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUG93ZXJDb25zdHJhaW50cyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUG93ZXJDb25zdHJhaW50cyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUG93ZXJDb25zdHJhaW50cykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVFCU1NMb2FkOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUUJTU0xvYWQocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVFCU1NMb2FkKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVRQlNTTG9hZCkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVFPU0NhcHNBcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVFPU0NhcHNBcChwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUU9TQ2Fwc0FwKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVRT1NDYXBzQXApKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVRT1NDYXBzU3RhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVFPU0NhcHNTdGF0aW9uKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUU9TQ2Fwc1N0YXRpb24pKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVRdWlldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVF1aWV0KHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVRdWlldCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUXVpZXQpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSQ1BJSUU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVSQ1BJSUUocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVJDUElJRSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUkNQSUlFKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUklDRGF0YURlc2M6CisgICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc2V0IHRoZSBwb2ludGVycyBiYWNrIHNpbmNlIHRoaXMgaXMgYSBjb250YWluZXIgSUUgYW5kIGl0IGRvZXNudCBoYXZlIGl0cyBvd24gRUlEIGFuZCBMZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAqcEJ1ZlJlbWFpbmluZyAtPSAyOyBuQnVmUmVtYWluaW5nICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBJZSAmJiBwSWUtPm5vdWkgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmUmVtYWluaW5nIC09IHBJZS0+bm91aTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ1ZlJlbWFpbmluZyArPSBwSWUtPm5vdWk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSBwSWUtPm5vdWk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBHZXRDb250YWluZXJJZXNMZW4ocEN0eCwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbiwgSUVTX1JJQ0RhdGFEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gRE9UMTFGX1BBUlNFX1NVQ0NFU1MgKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVJJQ0RhdGFEZXNjKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVSSUNEYXRhRGVzYyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUklDRGF0YURlc2MpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSU046CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVSU04ocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVJTTiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUlNOKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUlNOSUlFOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llUlNOSUlFKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVSU05JSUUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVJTTklJRSkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVJTTk9wYXF1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVJTTk9wYXF1ZShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFUlNOT3BhcXVlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSU05PcGFxdWUpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVTdXBwQ2hhbm5lbHM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVTdXBwQ2hhbm5lbHMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVN1cHBDaGFubmVscyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFU3VwcENoYW5uZWxzKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llU3VwcFJhdGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llU3VwcFJhdGVzKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVTdXBwUmF0ZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVN1cHBSYXRlcykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRJTToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVRJTShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFVElNKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVUSU0pKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVUUENSZXBvcnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVUUENSZXBvcnQocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVRQQ1JlcG9ydCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVFBDUmVwb3J0KSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVFBDUmVxdWVzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVRQQ1JlcXVlc3QocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVRQQ1JlcXVlc3QqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVRQQ1JlcXVlc3QpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXQVBJOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llV0FQSShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV0FQSSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV0FQSSkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdBUElPcGFxdWU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXQVBJT3BhcXVlKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVXQVBJT3BhcXVlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXQVBJT3BhcXVlKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV0ZBVFBDOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llV0ZBVFBDKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVXRkFUUEMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdGQVRQQykqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTUNhcHM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXTU1DYXBzKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVXTU1DYXBzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXTU1DYXBzKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV01NSW5mb0FwOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llV01NSW5mb0FwKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVXTU1JbmZvQXAqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdNTUluZm9BcCkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTUluZm9TdGF0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llV01NSW5mb1N0YXRpb24ocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVdNTUluZm9TdGF0aW9uKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXTU1JbmZvU3RhdGlvbikqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTVBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVdNTVBhcmFtcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV01NUGFyYW1zKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXTU1QYXJhbXMpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXUEE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXUEEocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVdQQSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV1BBKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV1BBT3BhcXVlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja0llV1BBT3BhcXVlKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVXUEFPcGFxdWUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdQQU9wYXF1ZSkqY291bnRPZmZzZXQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdTQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVdTQyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV1NDKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXU0MpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXc2NBc3NvY1JlcToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVdzY0Fzc29jUmVxKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVXc2NBc3NvY1JlcSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV3NjQXNzb2NSZXEpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXc2NBc3NvY1JlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVdzY0Fzc29jUmVzKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmSUVXc2NBc3NvY1JlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV3NjQXNzb2NSZXMpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXc2NCZWFjb246CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXc2NCZWFjb24ocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVdzY0JlYWNvbiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV3NjQmVhY29uKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV3NjQmVhY29uUHJvYmVSZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXc2NCZWFjb25Qcm9iZVJlcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV3NjSUVPcGFxdWU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXc2NJRU9wYXF1ZShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV3NjSUVPcGFxdWUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdzY0lFT3BhcXVlKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV3NjUHJvYmVSZXE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXc2NQcm9iZVJlcShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV3NjUHJvYmVSZXEqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdzY1Byb2JlUmVxKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV3NjUHJvYmVSZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrSWVXc2NQcm9iZVJlcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZklFV3NjUHJvYmVSZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdzY1Byb2JlUmVzKSpjb3VudE9mZnNldCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV3NjUmVhc3NvY1JlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tJZVdzY1JlYXNzb2NSZXMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZJRVdzY1JlYXNzb2NSZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdzY1JlYXNzb2NSZXMpKmNvdW50T2Zmc2V0KSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSTE9HRSwgRlJGTCgiSU5URVJOQUwgRVJST1IiCisgICAgICAgICAgICAgICAgICAgICAgICAiOiBJIGRvbid0IGtub3cgYWJvdXQgdGhlIElFIHNpZ25hdHVyZSAlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICItLSB0aGlzIGlzIG1vc3QgbGlrZWx5IGEgJ2ZyYW1lc2MnIGJ1Zy5cbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcEllLT5zaWcpOworICAgICAgICAgICAgICAgIEZSQU1FU19EQkdfQlJFQUsoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERPVDExRl9JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocEllLT5hcnJheWJvdW5kKSAoKysoICoodEFOSV9VMTYqKShwRnJtICsgcEllLT5jb3VudE9mZnNldCkgKSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzIocEN0eCwgRlJMT0czLCBGUkZMKCJTa2lwcGluZyB1bmtub3duIElFICVkIgorICAgICAgICAgICAgICAgICIgKGxlbmd0aCAlZClcbiIpLCBlaWQsIGxlbik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkxPRzMsIHBCdWZSZW1haW5pbmcgLSAyLCBsZW4pOworICAgICAgICAgICAgc3RhdHVzIHw9IERPVDExRl9VTktOT1dOX0lFUzsKKyAgICAgICAgfQorCisgICAgICAgIHBCdWZSZW1haW5pbmcgKz0gbGVuOworCisgICAgICAgICBpZiAobGVuID4gbkJ1ZlJlbWFpbmluZykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkxPR1csIEZSRkwoIlRoaXMgSUUgZXh0ZW5kcyBwYXN0ICIKKyAgICAgICAgICAgICAgICAgInRoZSBidWZmZXIgYXMgaXQgd2FzIGRlZmluZWQgdG8gdXMuICBUaGlzIGNvdWxkIgorICAgICAgICAgICAgICAgICAibWVhbiBhIGNvcnJ1cHQgZnJhbWUsIG9yIGp1c3QgYW4gaW5jb3JyZWN0IGxlbmciCisgICAgICAgICAgICAgICAgICJ0aCBwYXJhbWV0ZXIuXG4iKSk7CisgICAgICAgICAgICAgRlJBTUVTX0RCR19CUkVBSygpOworICAgICAgICAgICAgIHN0YXR1cyB8PSBET1QxMUZfTEFTVF9JRV9UT09fTE9ORzsKKyAgICAgICAgICAgICBnb3RvIE1hbmRhdG9yeUNoZWNrOworICAgICAgICAgfQorCisgICAgICAgIG5CdWZSZW1haW5pbmcgLT0gbGVuOworCisgICAgfQorCitNYW5kYXRvcnlDaGVjazoKKyAgICBwSWUgPSAmSUVzWzBdOworICAgIHdoaWxlICgweGZmICE9IHBJZS0+ZWlkKQorICAgIHsKKyAgICAgICAgaWYgKHBJZS0+Zk1hbmRhdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgcGZGb3VuZCA9ICh0RlJBTUVTX0JPT0wqKShwRnJtICsgcEllLT5vZmZzZXQgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllLT5wcmVzZW5jZU9mZnNldCk7CisgICAgICAgICAgICBpZiAoISpwZkZvdW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSTE9HVywgRlJGTCgiRVJST1I6IFRoZSBtYW5kYXRvIgorICAgICAgICAgICAgICAgICAgICAicnkgSUUgJXMgd2Fzbid0IHNlZW4uXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgcEllLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfREJHX0JSRUFLKCk7CisgICAgICAgICAgICAgICAgc3RhdHVzIHw9IERPVDExRl9NQU5EQVRPUllfSUVfTUlTU0lORzsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICsrcEllOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBVbnBhY2tDb3JlLiAqLworCitzdGF0aWMgdEFOSV9VMzIgVW5wYWNrVGx2Q29yZSggdHBBbmlTaXJHbG9iYWwgICBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0VExWRGVmbiAgICAgVExWc1sgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwRnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBuRnJtICkKK3sKKyAgICBjb25zdCB0VExWRGVmbiAqcFRsdjsKKyAgICB0QU5JX1UzMiAgICAgIG5CdWZSZW1haW5pbmcsIHN0YXR1cywgbnBlYzsKKyAgICB0QU5JX1UxNiAgICAgIGlkLCBsZW47CisgICAgdEFOSV9VOCAgICAgICpwQnVmUmVtYWluaW5nLCAqcGZGb3VuZDsKKworICAgICh2b2lkKXBDdHg7ICAgICAgICAgICAgICAgICAvLyBTaHV0dXAgdGhlIGNvbXBpbGVyCisgICAgKHZvaWQpbkZybTsKKyAgICBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwQnVmUmVtYWluaW5nID0gcEJ1ZjsKKyAgICBuQnVmUmVtYWluaW5nID0gbkJ1ZjsKKworICAgIC8vIFdoaWxlIHdlIGhhdmUgZGF0YS4uLgorICAgIHdoaWxlICggbkJ1ZlJlbWFpbmluZyApCisgICAgeworICAgICAgICBpZiAoIDMgPiBuQnVmUmVtYWluaW5nICkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAoIHBDdHgsIEZSTE9HRSwgRlJGTCggIlRoaXMgZnJhbWUgcmVwb3J0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZld2VyIHRocmVlIGJ5dGUocykgcmVtYWluaW5nLlxuIiApICk7CisgICAgICAgICAgICBzdGF0dXMgfD0gRE9UMTFGX0lOQ09NUExFVEVfVExWOworICAgICAgICAgICAgRlJBTUVTX0RCR19CUkVBSygpOworICAgICAgICAgICAgZ290byBNYW5kYXRvcnlDaGVjazsKKyAgICAgICAgfQorCisgICAgICAgIG5wZWMgPSAwVTsKKworICAgICAgICAvLyBMb29rIGZvciBhIG1hdGNoaW5nIFRMViBkZWZpbml0aW9uLAorICAgICAgICBwVGx2ID0gRmluZFRMVkRlZm4oIHBDdHgsIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsIFRMVnMgKTsKKyAgICAgICAgLy8gY29uc3VtZSB0aGUgdHlwZSwKKyAgICAgICAgaWYgKCBwVGx2ICkgCisgICAgICAgIHsgCisgICAgICAgICAgIGlmICggcFRsdi0+c1R5cGUgPT0gMikKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmaWQsIHBCdWZSZW1haW5pbmcsIHBUbHYtPmZNc2IpOworICAgICAgICAgICAgICBwQnVmUmVtYWluaW5nICs9IDI7CisgICAgICAgICAgICAgIG5CdWZSZW1haW5pbmcgLT0gMjsKKyAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBpZCA9ICpwQnVmUmVtYWluaW5nOworICAgICAgICAgICAgICBwQnVmUmVtYWluaW5nICs9IDE7CisgICAgICAgICAgICAgIG5CdWZSZW1haW5pbmcgLT0gMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICAvLyAmIGxlbmd0aCwKKyAgICAgICAgICAgaWYgKCBwVGx2LT5zTGVuID09IDIpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnJhbWVzbnRvaHMocEN0eCwgJmxlbiwgcEJ1ZlJlbWFpbmluZywgcFRsdi0+Zk1zYik7CisgICAgICAgICAgICAgIHBCdWZSZW1haW5pbmcgKz0gMjsKKyAgICAgICAgICAgICAgbkJ1ZlJlbWFpbmluZyAtPSAyOworICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIGxlbiA9ICpwQnVmUmVtYWluaW5nOworICAgICAgICAgICAgICBwQnVmUmVtYWluaW5nICs9IDE7CisgICAgICAgICAgICAgIG5CdWZSZW1haW5pbmcgLT0gMTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgCisgICAgICAgIHsgCisgICAgICAgICAgIHBCdWZSZW1haW5pbmcgKz0gVExWc1swXS5zVHlwZTsKKyAgICAgICAgICAgbkJ1ZlJlbWFpbmluZyAtPSBUTFZzWzBdLnNUeXBlOworICAgICAgICAgICBmcmFtZXNudG9ocyhwQ3R4LCAmbGVuLCBwQnVmUmVtYWluaW5nLCAoVExWc1swXS5zVHlwZSA9PSAyKSk7CisgICAgICAgICAgIHBCdWZSZW1haW5pbmcgKz0gMjsKKyAgICAgICAgICAgbkJ1ZlJlbWFpbmluZyAtPSAyOworICAgICAgICB9IAorCisgICAgICAgIGlmICggcFRsdiAmJiBwVGx2LT5wZWMgKQorICAgICAgICB7CisgICAgICAgICAgICBucGVjID0gM1U7CisgICAgICAgICAgICBpZiAoIDMgPiBuQnVmUmVtYWluaW5nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMihwQ3R4LCBGUkxPR1csIEZSRkwoIlRMViAlZCByZXBvcnRzIGxlbmd0aCIKKyAgICAgICAgICAgICAgICAgICAgIiVkLCBidXQgaXQgaGFzIGEgUHJpdmF0ZSBFbnRlcnByaXNlIENvZGUgKDMgYnl0ZSIKKyAgICAgICAgICAgICAgICAgICAgInMuXG4iKSwgaWQsIGxlbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJMT0cxLCBwQnVmLCBuQnVmKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMihwQ3R4LCBGUkxPRzEsIEZSRkwoIldlJ3ZlIHBhcnNlZCAlZCBieXRlcyIKKyAgICAgICAgICAgICAgICAgICAgIm9mIHRoaXMgYnVmZmVyLCBhbmQgc2hvdyAlZCBsZWZ0LlxuIiksCisgICAgICAgICAgICAgICAgcEJ1ZlJlbWFpbmluZyAtIHBCdWYsIG5CdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBET1QxMUZfSU5DT01QTEVURV9UTFY7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RCR19CUkVBSygpOworICAgICAgICAgICAgICAgIGdvdG8gTWFuZGF0b3J5Q2hlY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQnVmUmVtYWluaW5nICs9IDM7CisgICAgICAgICAgICBuQnVmUmVtYWluaW5nIC09IDM7CisgICAgICAgICAgICBsZW4gICAgICAgICAgIC09IDM7CisgICAgICAgIH0KKworICAgICAgICAvLyBXaGV0aGVyIHdlIGZvdW5kIGEgaGl0IG9yIG5vdCwgd2UgY2FuIHZhbGlkYXRlIHRoZSByZXBvcnRlZAorICAgICAgICAvLyBsZW5ndGggb2YgdGhpcyBUTFY6CisgICAgICAgIGlmICggbGVuID4gbkJ1ZlJlbWFpbmluZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0czKHBDdHgsIEZSTE9HVywgRlJGTCgiVExWICVkIHJlcG9ydHMgbGVuZ3RoICUiCisgICAgICAgICAgICAgICAgImQsIGJ1dCB0aGVyZSBhcmUgb25seSAlZCBieXRlcyByZW1haW5pbmcgaW4gdGhpcyBmIgorICAgICAgICAgICAgICAgICJyYW1lLlxuIiksIGlkLCBsZW4sIG5CdWZSZW1haW5pbmcgKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKCBwQ3R4LCBGUkxPRzEsIHBCdWYsIG5CdWYgKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cyKCBwQ3R4LCBGUkxPRzEsIEZSRkwoICJXZSd2ZSBwYXJzZWQgJWQgYnl0ZXMiCisgICAgICAgICAgICAgICAgIiBvZiB0aGlzIGJ1ZmZlciwgYW5kIHNob3cgJWQgbGVmdC5cbiIpLAorICAgICAgICAgICAgICAgIHBCdWZSZW1haW5pbmcgLSBwQnVmLCBuQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgIHN0YXR1cyB8PSBET1QxMUZfSU5DT01QTEVURV9UTFY7CisgICAgICAgICAgICBGUkFNRVNfREJHX0JSRUFLKCk7CisgICAgICAgICAgICBnb3RvIE1hbmRhdG9yeUNoZWNrOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93LCAqaWYqIHdlIGZvdW5kIGEgaGl0Li4uCisgICAgICAgIGlmICggcFRsdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggbkJ1ZlJlbWFpbmluZyA8IHBUbHYtPm1pblNpemUgLSBucGVjIC0gKHBUbHYtPnNUeXBlICsgcFRsdi0+c0xlbikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0czKCBwQ3R4LCBGUkxPR1csIEZSRkwoIlRoZSBJRSAlcyBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgImF0IGxlYXN0ICVkIGJ5dGVzIGluIHNpemUsIGJ1dCB0aGVyZSBhcmUgb25seSAiCisgICAgICAgICAgICAgICAgICAgICIlZCBieXRlcyByZW1haW5pbmcgaW4gdGhpcyBmcmFtZS5cbiIpLAorICAgICAgICAgICAgICAgICAgICAgcFRsdi0+bmFtZSwgcFRsdi0+bWluU2l6ZSwgbkJ1ZlJlbWFpbmluZyApOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKCBwQ3R4LCBGUkxPRzEsIHBCdWYsIG5CdWYgKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgfD0gRE9UMTFGX0lOQ09NUExFVEVfVExWOworICAgICAgICAgICAgICAgIEZSQU1FU19EQkdfQlJFQUsoICk7CisgICAgICAgICAgICAgICAgZ290byBNYW5kYXRvcnlDaGVjazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBsZW4gPiBwVGx2LT5tYXhTaXplIC0gbnBlYyAtIChwVGx2LT5zVHlwZSArIHBUbHYtPnNMZW4pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMSggcEN0eCwgRlJMT0dXLCBGUkZMKCJUaGUgVExWICVzIHJlcG9ydHMgIgorICAgICAgICAgICAgICAgICAgICAiYW4gaWxsZWdhbGx5IGxhcmdlIHNpemU7IHRoaXMgVExWIGlzIHByZXN1bWFibHkiCisgICAgICAgICAgICAgICAgICAgICJjb3JydXB0IG9yIG90aGVyd2lzZSBpbnZhbGlkICYgd2lsbCBiZSBza2lwcGVkICIKKyAgICAgICAgICAgICAgICAgICAgImlwcGVkLlxuIiksIHBUbHYtPm5hbWUgKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUCggcEN0eCwgRlJMT0cxLCBwQnVmLCBuQnVmICk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzIoIHBDdHgsIEZSTE9HMSwgRlJGTCgiV2UndmUgcGFyc2VkICVkIGJ5IgorICAgICAgICAgICAgICAgICAgICAidGVzIG9mIHRoaXMgYnVmZmVyLCBhbmQgc2hvdyAlZCBsZWZ0LlxuIiksCisgICAgICAgICAgICAgICAgICAgIHBCdWZSZW1haW5pbmcgLSBwQnVmLCBuQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfREJHX0JSRUFLKCk7CisgICAgICAgICAgICAgICAgc3RhdHVzIHw9IERPVDExRl9TS0lQUEVEX0JBRF9UTFY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwVGx2LT5zaWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2QXV0aG9yaXplZE1BQ3M6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2QXV0aG9yaXplZE1BQ3MocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZUTFZBdXRob3JpemVkTUFDcyogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlJlcXVlc3RUb0Vucm9sbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZDb21tb25GdW5jKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVlJlcXVlc3RUb0Vucm9sbCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5wcmVzZW50KSwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVlJlcXVlc3RUb0Vucm9sbCopKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPnJlcSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlZlcnNpb24yOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdlZlcnNpb24yKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmVExWVmVyc2lvbjIqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZBUFNldHVwTG9ja2VkOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWQVBTZXR1cExvY2tlZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5wcmVzZW50KSwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVkFQU2V0dXBMb2NrZWQqKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5mTG9ja2VkKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2QXNzb2NpYXRpb25TdGF0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZDb21tb25GdW5jMihwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICh0QU5JX1U4KikmKCgoIHREb3QxMWZUTFZBc3NvY2lhdGlvblN0YXRlKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPnByZXNlbnQpLCAodEFOSV9VMTYqKSYoKCggdERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUqKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5zdGF0ZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkNoYW5uZWxMaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNoYW5uZWxMaXN0KHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmVExWQ2hhbm5lbExpc3QqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZDb25maWdNZXRob2RzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMyKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVkNvbmZpZ01ldGhvZHMqICkocEZybSArIHBUbHYtPm9mZnNldCApKS0+cHJlc2VudCksICh0QU5JX1UxNiopJigoKCB0RG90MTFmVExWQ29uZmlnTWV0aG9kcyopKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPm1ldGhvZHMpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZDb25maWd1cmF0aW9uRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2Q29tbW9uRnVuYzIocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWQ29uZmlndXJhdGlvbkVycm9yKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPnByZXNlbnQpLCAodEFOSV9VMTYqKSYoKCggdERvdDExZlRMVkNvbmZpZ3VyYXRpb25FcnJvciopKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPmVycm9yKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2Q29uZmlndXJhdGlvblRpbWVvdXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2Q29uZmlndXJhdGlvblRpbWVvdXQocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZUTFZDb25maWd1cmF0aW9uVGltZW91dCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkRldmljZU5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2RGV2aWNlTmFtZShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVkRldmljZU5hbWUqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZEZXZpY2VQYXNzd29yZElEOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMyKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQqICkocEZybSArIHBUbHYtPm9mZnNldCApKS0+cHJlc2VudCksICh0QU5JX1UxNiopJigoKCB0RG90MTFmVExWRGV2aWNlUGFzc3dvcmRJRCopKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPmlkKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2RXh0ZW5kZWRMaXN0ZW5UaW1pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2RXh0ZW5kZWRMaXN0ZW5UaW1pbmcocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZyogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkdPSW50ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWR09JbnRlbnQqICkocEZybSArIHBUbHYtPm9mZnNldCApKS0+cHJlc2VudCksICh0QU5JX1U4KikmKCgoIHREb3QxMWZUTFZHT0ludGVudCopKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPkdPSW50ZW50KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2SW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcyogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1Rsdkludml0YXRpb25GbGFnczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZDb21tb25GdW5jKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVkludml0YXRpb25GbGFncyogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5wcmVzZW50KSwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVkludml0YXRpb25GbGFncyopKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPmludml0YXRpb25GbGFncykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1Rsdkxpc3RlbkNoYW5uZWw6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2TGlzdGVuQ2hhbm5lbChwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVkxpc3RlbkNoYW5uZWwqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZNYW51ZmFjdHVyZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2TWFudWZhY3R1cmVyKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmVExWTWFudWZhY3R1cmVyKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2TWlub3JSZWFzb25Db2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWTWlub3JSZWFzb25Db2RlKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPnByZXNlbnQpLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWTWlub3JSZWFzb25Db2RlKikocEZybSArIHBUbHYtPm9mZnNldCApKS0+bWlub3JSZWFzb25Db2RlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2TW9kZWxOYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1Rsdk1vZGVsTmFtZShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVk1vZGVsTmFtZSogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1Rsdk1vZGVsTnVtYmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1Rsdk1vZGVsTnVtYmVyKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmVExWTW9kZWxOdW1iZXIqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZOb3RpY2VPZkFic2VuY2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2Tm90aWNlT2ZBYnNlbmNlKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmVExWTm90aWNlT2ZBYnNlbmNlKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2T3BlcmF0aW5nQ2hhbm5lbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZPcGVyYXRpbmdDaGFubmVsKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmVExWT3BlcmF0aW5nQ2hhbm5lbCogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlAyUENhcGFiaWxpdHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2UDJQQ2FwYWJpbGl0eShwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVlAyUENhcGFiaWxpdHkqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZQMlBEZXZpY2VJZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZQMlBEZXZpY2VJZChwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVlAyUERldmljZUlkKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UDJQRGV2aWNlSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZQMlBEZXZpY2VJbmZvKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmVExWUDJQRGV2aWNlSW5mbyogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlAyUEdyb3VwQnNzaWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2UDJQR3JvdXBCc3NpZChwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVlAyUEdyb3VwQnNzaWQqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZQMlBHcm91cElkOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdlAyUEdyb3VwSWQocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZUTFZQMlBHcm91cElkKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UDJQR3JvdXBJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdlAyUEdyb3VwSW5mbyhwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVlAyUEdyb3VwSW5mbyogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlAyUFN0YXR1czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZDb21tb25GdW5jKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVlAyUFN0YXR1cyogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5wcmVzZW50KSwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVlAyUFN0YXR1cyopKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPnN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlByaW1hcnlEZXZpY2VUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdlByaW1hcnlEZXZpY2VUeXBlKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmVExWUHJpbWFyeURldmljZVR5cGUqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZSRkJhbmRzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWUkZCYW5kcyogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5wcmVzZW50KSwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVlJGQmFuZHMqKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5iYW5kcykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlJlcXVlc3REZXZpY2VUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdlJlcXVlc3REZXZpY2VUeXBlKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZSZXF1ZXN0VHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZDb21tb25GdW5jKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVlJlcXVlc3RUeXBlKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPnByZXNlbnQpLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWUmVxdWVzdFR5cGUqKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5yZXFUeXBlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UmVzcG9uc2VUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWUmVzcG9uc2VUeXBlKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPnByZXNlbnQpLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWUmVzcG9uc2VUeXBlKikocEZybSArIHBUbHYtPm9mZnNldCApKS0+cmVzVHlwZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIqICkocEZybSArIHBUbHYtPm9mZnNldCApKS0+cHJlc2VudCksICh0QU5JX1U4KikmKCgoIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhciopKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPnNlbGVjdGVkKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMyKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5wcmVzZW50KSwgKHRBTklfVTE2KikmKCgoIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMqKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5tZXRob2RzKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2U2VyaWFsTnVtYmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdlNlcmlhbE51bWJlcihwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVlNlcmlhbE51bWJlciogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlVVSURfRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZVVUlEX0UocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZUTFZVVUlEX0UqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZVVUlEX1I6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2VVVJRF9SKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKCB0RG90MTFmVExWVVVJRF9SKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2VmVuZG9yRXh0ZW5zaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdlZlbmRvckV4dGVuc2lvbihwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlZlcnNpb246CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmVW5wYWNrVGx2VmVyc2lvbihwQ3R4LCBwQnVmUmVtYWluaW5nLCBsZW4sICggdERvdDExZlRMVlZlcnNpb24qICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZXUFNTdGF0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZDb21tb25GdW5jKHBDdHgsIHBCdWZSZW1haW5pbmcsIGxlbiwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVldQU1N0YXRlKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQgKSktPnByZXNlbnQpLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWV1BTU3RhdGUqKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5zdGF0ZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlAyUEludGVyZmFjZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZVbnBhY2tUbHZQMlBJbnRlcmZhY2UocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAoIHREb3QxMWZUTFZQMlBJbnRlcmZhY2UqICkocEZybSArIHBUbHYtPm9mZnNldCApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZQMlBNYW5hZ2VhYmlsaXR5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlVucGFja1RsdkNvbW1vbkZ1bmMocEN0eCwgcEJ1ZlJlbWFpbmluZywgbGVuLCAodEFOSV9VOCopJigoKCB0RG90MTFmVExWUDJQTWFuYWdlYWJpbGl0eSogKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5wcmVzZW50KSwgKHRBTklfVTgqKSYoKCggdERvdDExZlRMVlAyUE1hbmFnZWFiaWxpdHkqKShwRnJtICsgcFRsdi0+b2Zmc2V0ICkpLT5tYW5hZ2VhYmlsaXR5KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSTE9HRSwgRlJGTCgiSU5URVJOQUwgRVJST1I6IEkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvbid0IGtub3cgYWJvdXQgdGhlIFRMViBzaWduYXR1cmUgJWQtLSB0aGkiCisgICAgICAgICAgICAgICAgICAgICAgICAicyBpcyBtb3N0IGxpa2VseSBhICdmcmFtZXNjJyBidWcuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHYtPnNpZyk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EQkdfQlJFQUsoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERPVDExRl9JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9IC8vIEVuZCBzd2l0Y2ggb24gc2lnLgorICAgICAgICAgICAgfSAvLyBFbmQgaWYgb24gbGVuZ3RoIGNoZWNrLgorCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMihwQ3R4LCBGUkxPRzMsIEZSRkwoIlNraXBwaW5nIHVua25vd24gVExWICVkICgiCisgICAgICAgICAgICAgICAgImxlbmd0aCAlZClcbiIpLCBpZCwgbGVuKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSTE9HMywgcEJ1ZlJlbWFpbmluZyAtIChwVGx2LT5zVHlwZSArIHBUbHYtPnNMZW4pLCBsZW4pOworICAgICAgICAgICAgc3RhdHVzIHw9IERPVDExRl9VTktOT1dOX1RMVlM7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IFRMVgorICAgICAgICBwQnVmUmVtYWluaW5nICs9IGxlbjsKKworICAgICAgICBpZiAobGVuID4gbkJ1ZlJlbWFpbmluZykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkxPR1csIEZSRkwoIlRoaXMgVExWIGV4dGVuZHMgcGFzdCB0aCIKKyAgICAgICAgICAgICAgICAgImUgYnVmZmVyIGFzIGl0IHdhcyBkZWZpbmVkIHRvIHVzLiAgVGhpcyBjb3VsZCBtZWFuICIKKyAgICAgICAgICAgICAgICAgImEgY29ycnVwdCBmcmFtZSwgb3IganVzdCBhbiBpbmNvcnJlY3QgbGVuZ3RoIHBhcmFtZSIKKyAgICAgICAgICAgICAgICAgInRlci5cbiIpKTsKKyAgICAgICAgICAgICBGUkFNRVNfREJHX0JSRUFLKCk7CisgICAgICAgICAgICAgc3RhdHVzIHw9IERPVDExRl9MQVNUX1RMVl9UT09fTE9ORzsKKyAgICAgICAgICAgICBnb3RvIE1hbmRhdG9yeUNoZWNrOworICAgICAgICAgfQorCisgICAgICAgIG5CdWZSZW1haW5pbmcgLT0gbGVuOworCisgICAgfSAvLyBFbmQgaXRlcmF0aW9uIG92ZXIgVExWcy4KKworTWFuZGF0b3J5Q2hlY2s6CisgICAgcFRsdiA9ICZUTFZzWzBdOworICAgIHdoaWxlICgweGZmZmYgIT0gcFRsdi0+aWQpCisgICAgeworICAgICAgICBpZiAocFRsdi0+Zk1hbmRhdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgcGZGb3VuZCA9ICh0QU5JX1U4KikocEZybSArIHBUbHYtPm9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbHYtPnByZXNlbmNlT2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICghKnBmRm91bmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJMT0dXLCBGUkZMKCJFUlJPUjogVGhlIG1hbmRhdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICJUTFYgJXMgd2Fzbid0IHNlZW4uXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgcFRsdi0+bmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RCR19CUkVBSygpOworICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBET1QxMUZfTUFOREFUT1JZX1RMVl9NSVNTSU5HOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgKytwVGx2OworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBVbnBhY1RsdmtDb3JlLiAqLwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVUQ0xBUyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVUQ0xBUyAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBzd2l0Y2ggKHBJZS0+Y2xhc3NpZmllcl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDY7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDY7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJZS0+aW5mby5JcFBhcmFtcy52ZXJzaW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVRDTEFTLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVdNTVRDTEFTKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVdNTVRDTEFTICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBzd2l0Y2ggKHBJZS0+Y2xhc3NpZmllcl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDY7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDY7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJZS0+aW5mby5JcFBhcmFtcy52ZXJzaW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVdNTVRDTEFTLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRUFpcmdvKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRUFpcmdvICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBJZSwgcG5OZWVkZWQsIElFU19BaXJnbyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVBaXJnby4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVDb3VudHJ5KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRUNvdW50cnkgKnBJZSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7CisgICAgd2hpbGUgKCBwSWUtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBuTmVlZGVkICs9IDM7CisgICAgICAgIGlmICggcEllLT5udW1fdHJpcGxldHMgKQorICAgICAgICB7CisgICAgICAgICAgICAqcG5OZWVkZWQgKz0gKCBwSWUtPm51bV90cmlwbGV0cyAqIDMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGJyZWFrOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFQ291bnRyeS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVGVEluZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFRlRJbmZvICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAqcG5OZWVkZWQgKz0gMTY7CisgICAgICAgICpwbk5lZWRlZCArPSAzMjsKKyAgICAgICAgKnBuTmVlZGVkICs9IDMyOworICAgICAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwSWUsIHBuTmVlZGVkLCBJRVNfRlRJbmZvKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRUZUSW5mby4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVNZWFzdXJlbWVudFJlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBpZiAoIHBJZS0+dHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAocEllLT50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSA4OworICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDg7CisgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDg7CisgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSA0OworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBJZSwgcG5OZWVkZWQsIElFU19yZXBvcnRCZWFjb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVNZWFzdXJlbWVudFJlcG9ydC4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVNZWFzdXJlbWVudFJlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0ICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgIHN3aXRjaCAocEllLT5tZWFzdXJlbWVudF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDg7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gODsKKyAgICAgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSA4OworICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDY7CisgICAgICAgICAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwSWUsIHBuTmVlZGVkLCBJRVNfbWVhc3VyZW1lbnRfcmVxdWVzdEJlYWNvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFTWVhc3VyZW1lbnRSZXF1ZXN0LiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRU5laWdoYm9yUmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRU5laWdoYm9yUmVwb3J0ICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSA2OworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAqcG5OZWVkZWQgKz0gMTsKKyAgICAgICAgKnBuTmVlZGVkICs9IDE7CisgICAgICAgICpwbk5lZWRlZCArPSAxOworICAgICAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwSWUsIHBuTmVlZGVkLCBJRVNfTmVpZ2hib3JSZXBvcnQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFTmVpZ2hib3JSZXBvcnQuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQQXNzb2NSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFUDJQQXNzb2NSZXEgKnBJZSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7CisgICAgd2hpbGUgKCBwSWUtPnByZXNlbnQgKQorICAgIHsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwSWUscG5OZWVkZWQsVExWU19QMlBBc3NvY1JlcSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVQMlBBc3NvY1JlcS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBBc3NvY1Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVQMlBBc3NvY1JlcyAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1AyUEFzc29jUmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVAyUEFzc29jUmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUEJlYWNvbih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVQMlBCZWFjb24gKnBJZSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7CisgICAgd2hpbGUgKCBwSWUtPnByZXNlbnQgKQorICAgIHsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwSWUscG5OZWVkZWQsVExWU19QMlBCZWFjb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFUDJQQmVhY29uLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUEJlYWNvblByb2JlUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZVRsdkNvcmUocEN0eCwodEFOSV9VOCopcEllLHBuTmVlZGVkLFRMVlNfUDJQQmVhY29uUHJvYmVSZXMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFUDJQQmVhY29uUHJvYmVSZXMuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQRGVBdXRoKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVAyUERlQXV0aCAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1AyUERlQXV0aCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVQMlBEZUF1dGguICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1AyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1AyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQRGlzQXNzb2ModHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFUDJQRGlzQXNzb2MgKnBJZSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7CisgICAgd2hpbGUgKCBwSWUtPnByZXNlbnQgKQorICAgIHsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwSWUscG5OZWVkZWQsVExWU19QMlBEaXNBc3NvYyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVQMlBEaXNBc3NvYy4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBHT05lZ0NuZih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVQMlBHT05lZ0NuZiAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1AyUEdPTmVnQ25mKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVAyUEdPTmVnQ25mLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUEdPTmVnUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVAyUEdPTmVnUmVxICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZVRsdkNvcmUocEN0eCwodEFOSV9VOCopcEllLHBuTmVlZGVkLFRMVlNfUDJQR09OZWdSZXEpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFUDJQR09OZWdSZXEuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQR09OZWdSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFUDJQR09OZWdSZXMgKnBJZSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7CisgICAgd2hpbGUgKCBwSWUtPnByZXNlbnQgKQorICAgIHsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwSWUscG5OZWVkZWQsVExWU19QMlBHT05lZ1Jlcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVQMlBHT05lZ1Jlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBHT05lZ1dQUyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVQMlBHT05lZ1dQUyAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1AyUEdPTmVnV1BTKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVAyUEdPTmVnV1BTLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUEludml0YXRpb25SZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFUDJQSW52aXRhdGlvblJlcSAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1AyUEludml0YXRpb25SZXEpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFUDJQSW52aXRhdGlvblJlcS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBJbnZpdGF0aW9uUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVAyUEludml0YXRpb25SZXMgKnBJZSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7CisgICAgd2hpbGUgKCBwSWUtPnByZXNlbnQgKQorICAgIHsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwSWUscG5OZWVkZWQsVExWU19QMlBJbnZpdGF0aW9uUmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVAyUEludml0YXRpb25SZXMuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQTm90aWNlT2ZBYnNlbmNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVAyUE5vdGljZU9mQWJzZW5jZSAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1AyUE5vdGljZU9mQWJzZW5jZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVQMlBOb3RpY2VPZkFic2VuY2UuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQUHJlc2VuY2VSZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVQMlBQcmVzZW5jZVJlc3BvbnNlICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZVRsdkNvcmUocEN0eCwodEFOSV9VOCopcEllLHBuTmVlZGVkLFRMVlNfUDJQUHJlc2VuY2VSZXNwb25zZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVQMlBQcmVzZW5jZVJlc3BvbnNlLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVAyUFByb2JlUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVAyUFByb2JlUmVxICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZVRsdkNvcmUocEN0eCwodEFOSV9VOCopcEllLHBuTmVlZGVkLFRMVlNfUDJQUHJvYmVSZXEpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFUDJQUHJvYmVSZXEuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUDJQUHJvYmVSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFUDJQUHJvYmVSZXMgKnBJZSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7CisgICAgd2hpbGUgKCBwSWUtPnByZXNlbnQgKQorICAgIHsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwSWUscG5OZWVkZWQsVExWU19QMlBQcm9iZVJlcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVQMlBQcm9iZVJlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZVRsdkNvcmUocEN0eCwodEFOSV9VOCopcEllLHBuTmVlZGVkLFRMVlNfUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVQMlBXU0NQcm92aXNpb25EaXNjb3ZlcnlSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZVRsdkNvcmUocEN0eCwodEFOSV9VOCopcEllLHBuTmVlZGVkLFRMVlNfUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVSSUNEYXRhRGVzYyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVSSUNEYXRhRGVzYyAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgICAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwSWUsIHBuTmVlZGVkLCBJRVNfUklDRGF0YURlc2MpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFUklDRGF0YURlc2MuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFUlNOKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVJTTiAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgKnBuTmVlZGVkICs9IDQ7CisgICAgICAgIGlmICggcEllLT5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQgKQorICAgICAgICB7CisgICAgICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGJyZWFrOworICAgICAgICAqcG5OZWVkZWQgKz0gKCBwSWUtPnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQgKTsKKyAgICAgICAgaWYgKCBwSWUtPmFrbV9zdWl0ZV9jb3VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgICpwbk5lZWRlZCArPSAoIHBJZS0+YWttX3N1aXRlX2NvdW50ICogNCApOworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgaWYgKCBwSWUtPnBta2lkX2NvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBicmVhazsKKyAgICAgICAgKnBuTmVlZGVkICs9ICggcEllLT5wbWtpZF9jb3VudCAqIDE2ICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVSU04uICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV0FQSSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVXQVBJICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgKnBuTmVlZGVkICs9ICggcEllLT5ha21fc3VpdGVfY291bnQgKiA0ICk7CisgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICAqcG5OZWVkZWQgKz0gKCBwSWUtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50ICogNCApOworICAgICAgICAqcG5OZWVkZWQgKz0gNDsKKyAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgIGlmICggcEllLT5ia2lkX2NvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBicmVhazsKKyAgICAgICAgKnBuTmVlZGVkICs9ICggcEllLT5ia2lkX2NvdW50ICogMTYgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVdBUEkuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV1BBKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVdQQSAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcG5OZWVkZWQgKz0gMjsKKyAgICAgICAgaWYgKCBwSWUtPm11bHRpY2FzdF9jaXBoZXJfcHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwbk5lZWRlZCArPSA0OworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGlmICggcEllLT51bmljYXN0X2NpcGhlcl9jb3VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgICpwbk5lZWRlZCArPSAoIHBJZS0+dW5pY2FzdF9jaXBoZXJfY291bnQgKiA0ICk7CisgICAgICAgIGlmICggcEllLT5hdXRoX3N1aXRlX2NvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgKnBuTmVlZGVkICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBicmVhazsKKyAgICAgICAgKnBuTmVlZGVkICs9ICggcEllLT5hdXRoX3N1aXRlX2NvdW50ICogNCApOworICAgICAgICBpZiAoIHBJZS0+Y2FwcyApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwbk5lZWRlZCArPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVXUEEuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV1NDKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVdTQyAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1dTQyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVXU0MuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV3NjQXNzb2NSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFV3NjQXNzb2NSZXEgKnBJZSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7CisgICAgd2hpbGUgKCBwSWUtPnByZXNlbnQgKQorICAgIHsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwSWUscG5OZWVkZWQsVExWU19Xc2NBc3NvY1JlcSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVXc2NBc3NvY1JlcS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXc2NBc3NvY1Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVXc2NBc3NvY1JlcyAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1dzY0Fzc29jUmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVdzY0Fzc29jUmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVdzY0JlYWNvbih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVXc2NCZWFjb24gKnBJZSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7CisgICAgd2hpbGUgKCBwSWUtPnByZXNlbnQgKQorICAgIHsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwSWUscG5OZWVkZWQsVExWU19Xc2NCZWFjb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFV3NjQmVhY29uLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVdzY0JlYWNvblByb2JlUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzICpwSWUsIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICAodm9pZClwQ3R4OworICAgIHdoaWxlICggcEllLT5wcmVzZW50ICkKKyAgICB7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZVRsdkNvcmUocEN0eCwodEFOSV9VOCopcEllLHBuTmVlZGVkLFRMVlNfV3NjQmVhY29uUHJvYmVSZXMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFV3NjQmVhY29uUHJvYmVSZXMuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZElFV3NjUHJvYmVSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFV3NjUHJvYmVSZXEgKnBJZSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgICh2b2lkKXBDdHg7CisgICAgd2hpbGUgKCBwSWUtPnByZXNlbnQgKQorICAgIHsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwSWUscG5OZWVkZWQsVExWU19Xc2NQcm9iZVJlcSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSUVXc2NQcm9iZVJlcS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSUVXc2NQcm9iZVJlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmSUVXc2NQcm9iZVJlcyAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1dzY1Byb2JlUmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRJRVdzY1Byb2JlUmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRJRVdzY1JlYXNzb2NSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZklFV3NjUmVhc3NvY1JlcyAqcEllLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgKHZvaWQpcEN0eDsKKyAgICB3aGlsZSAoIHBJZS0+cHJlc2VudCApCisgICAgeworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBJZSxwbk5lZWRlZCxUTFZTX1dzY1JlYXNzb2NSZXMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZElFV3NjUmVhc3NvY1Jlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQWRkQkFSZXFTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBZGRCQVJlcSAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gOTsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX0FkZEJBUmVxKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkQWRkQkFSZXFTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRBZGRCQVJzcFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkFkZEJBUnNwICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSA5OworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfQWRkQkFSc3ApOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRBZGRCQVJzcFNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZEFkZFRTUmVxdWVzdFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkFkZFRTUmVxdWVzdCAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gMzsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX0FkZFRTUmVxdWVzdCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZEFkZFRTUmVxdWVzdFNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZEFkZFRTUmVzcG9uc2VTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBZGRUU1Jlc3BvbnNlICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSA1OworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfQWRkVFNSZXNwb25zZSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZEFkZFRTUmVzcG9uc2VTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRBc3NvY1JlcXVlc3RTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBc3NvY1JlcXVlc3QgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDQ7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19Bc3NvY1JlcXVlc3QpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRBc3NvY1JlcXVlc3RTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRBc3NvY1Jlc3BvbnNlU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQXNzb2NSZXNwb25zZSAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gNjsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX0Fzc29jUmVzcG9uc2UpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRBc3NvY1Jlc3BvbnNlU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQXV0aGVudGljYXRpb25TaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBdXRoZW50aWNhdGlvbiAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gNjsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX0F1dGhlbnRpY2F0aW9uKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkQXV0aGVudGljYXRpb25TaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRCZWFjb25TaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZCZWFjb24gKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDEyOworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfQmVhY29uKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkQmVhY29uU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQmVhY29uMVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkJlYWNvbjEgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDEyOworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfQmVhY29uMSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZEJlYWNvbjFTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRCZWFjb24yU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQmVhY29uMiAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gMDsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX0JlYWNvbjIpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRCZWFjb24yU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQmVhY29uSUVzU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQmVhY29uSUVzICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSAwOworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfQmVhY29uSUVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkQmVhY29uSUVzU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkQ2hhbm5lbFN3aXRjaFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkNoYW5uZWxTd2l0Y2ggKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDI7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19DaGFubmVsU3dpdGNoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkQ2hhbm5lbFN3aXRjaFNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZERlQXV0aFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkRlQXV0aCAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gMjsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX0RlQXV0aCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZERlQXV0aFNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZERlbEJBSW5kU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmRGVsQkFJbmQgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDY7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19EZWxCQUluZCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZERlbEJBSW5kU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkRGVsVFNTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZEZWxUUyAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gNzsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX0RlbFRTKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkRGVsVFNTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWREZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXFTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDg7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19EZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWREZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXFTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWREZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXNTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDg7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19EZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWREZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXNTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWREaXNhc3NvY2lhdGlvblNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkRpc2Fzc29jaWF0aW9uICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSAyOworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfRGlzYXNzb2NpYXRpb24pOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWREaXNhc3NvY2lhdGlvblNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZEdPRGlzY292ZXJhYmlsaXR5UmVxU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmR09EaXNjb3ZlcmFiaWxpdHlSZXEgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDc7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19HT0Rpc2NvdmVyYWJpbGl0eVJlcSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZEdPRGlzY292ZXJhYmlsaXR5UmVxU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkR09OZWdDbmZTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZHT05lZ0NuZiAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gODsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX0dPTmVnQ25mKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkR09OZWdDbmZTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRHT05lZ1JlcVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkdPTmVnUmVxICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSA4OworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfR09OZWdSZXEpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRHT05lZ1JlcVNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZEdPTmVnUmVzU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmR09OZWdSZXMgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDg7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19HT05lZ1Jlcyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZEdPTmVnUmVzU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkSW52aXRhdGlvblJlcVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkludml0YXRpb25SZXEgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDg7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19JbnZpdGF0aW9uUmVxKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkSW52aXRhdGlvblJlcVNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZEludml0YXRpb25SZXNTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJbnZpdGF0aW9uUmVzICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSA4OworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfSW52aXRhdGlvblJlcyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZEludml0YXRpb25SZXNTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRMaW5rTWVhc3VyZW1lbnRSZXBvcnRTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZMaW5rTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDExOworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfTGlua01lYXN1cmVtZW50UmVwb3J0KTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkTGlua01lYXN1cmVtZW50UmVwb3J0U2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkTGlua01lYXN1cmVtZW50UmVxdWVzdFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkxpbmtNZWFzdXJlbWVudFJlcXVlc3QgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDU7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19MaW5rTWVhc3VyZW1lbnRSZXF1ZXN0KTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkTGlua01lYXN1cmVtZW50UmVxdWVzdFNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZE1lYXN1cmVtZW50UmVwb3J0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDM7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19NZWFzdXJlbWVudFJlcG9ydCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZE1lYXN1cmVtZW50UmVwb3J0U2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkTWVhc3VyZW1lbnRSZXF1ZXN0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSAzOworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfTWVhc3VyZW1lbnRSZXF1ZXN0KTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkTWVhc3VyZW1lbnRSZXF1ZXN0U2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkTmVpZ2hib3JSZXBvcnRSZXF1ZXN0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0ICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSAzOworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfTmVpZ2hib3JSZXBvcnRSZXF1ZXN0KTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkTmVpZ2hib3JSZXBvcnRSZXF1ZXN0U2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkTmVpZ2hib3JSZXBvcnRSZXNwb25zZVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZk5laWdoYm9yUmVwb3J0UmVzcG9uc2UgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDM7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19OZWlnaGJvclJlcG9ydFJlc3BvbnNlKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkTmVpZ2hib3JSZXBvcnRSZXNwb25zZVNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZE5vdGljZU9mQWJzU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTm90aWNlT2ZBYnMgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDc7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19Ob3RpY2VPZkFicyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZE5vdGljZU9mQWJzU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUHJlc2VuY2VSZXFTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZQcmVzZW5jZVJlcSAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gNzsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX1ByZXNlbmNlUmVxKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkUHJlc2VuY2VSZXFTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRQcmVzZW5jZVJlc1NpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlByZXNlbmNlUmVzICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSA3OworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfUHJlc2VuY2VSZXMpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRQcmVzZW5jZVJlc1NpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFByb2JlUmVxdWVzdFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlByb2JlUmVxdWVzdCAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gMDsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX1Byb2JlUmVxdWVzdCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZFByb2JlUmVxdWVzdFNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFByb2JlUmVzcG9uc2VTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZQcm9iZVJlc3BvbnNlICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSAxMjsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX1Byb2JlUmVzcG9uc2UpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRQcm9iZVJlc3BvbnNlU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUHJvdmlzaW9uRGlzY292ZXJ5UmVxU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVxICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSA4OworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfUHJvdmlzaW9uRGlzY292ZXJ5UmVxKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkUHJvdmlzaW9uRGlzY292ZXJ5UmVxU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUHJvdmlzaW9uRGlzY292ZXJ5UmVzU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUHJvdmlzaW9uRGlzY292ZXJ5UmVzICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSA4OworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfUHJvdmlzaW9uRGlzY292ZXJ5UmVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkUHJvdmlzaW9uRGlzY292ZXJ5UmVzU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUmFkaW9NZWFzdXJlbWVudFJlcG9ydFNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXBvcnQgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDM7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19SYWRpb01lYXN1cmVtZW50UmVwb3J0KTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkUmFkaW9NZWFzdXJlbWVudFJlcG9ydFNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDU7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19SYWRpb01lYXN1cmVtZW50UmVxdWVzdCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZFJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0U2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUmVBc3NvY1JlcXVlc3RTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZSZUFzc29jUmVxdWVzdCAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gMTA7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19SZUFzc29jUmVxdWVzdCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZFJlQXNzb2NSZXF1ZXN0U2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkUmVBc3NvY1Jlc3BvbnNlU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUmVBc3NvY1Jlc3BvbnNlICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSA2OworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfUmVBc3NvY1Jlc3BvbnNlKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkUmVBc3NvY1Jlc3BvbnNlU2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkU01Qb3dlclNhdmVTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZTTVBvd2VyU2F2ZSAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gMzsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX1NNUG93ZXJTYXZlKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkU01Qb3dlclNhdmVTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUUENSZXBvcnRTaXplKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZUUENSZXBvcnQgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDM7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19UUENSZXBvcnQpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRUUENSZXBvcnRTaXplLiAqLworCit0QU5JX1UzMiBkb3QxMWZHZXRQYWNrZWRUUENSZXF1ZXN0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmVFBDUmVxdWVzdCAqcEZybSwgdEFOSV9VMzIgKnBuTmVlZGVkKQoreworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKnBuTmVlZGVkID0gMzsKKyAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplQ29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtLCBwbk5lZWRlZCwgSUVTX1RQQ1JlcXVlc3QpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZHZXRQYWNrZWRUUENSZXF1ZXN0U2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkV01NQWRkVFNSZXF1ZXN0U2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmV01NQWRkVFNSZXF1ZXN0ICpwRnJtLCB0QU5JX1UzMiAqcG5OZWVkZWQpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAqcG5OZWVkZWQgPSA0OworICAgIHN0YXR1cyA9IEdldFBhY2tlZFNpemVDb3JlKHBDdHgsICggdEFOSV9VOCogKXBGcm0sIHBuTmVlZGVkLCBJRVNfV01NQWRkVFNSZXF1ZXN0KTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkV01NQWRkVFNSZXF1ZXN0U2l6ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmR2V0UGFja2VkV01NQWRkVFNSZXNwb25zZVNpemUodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZldNTUFkZFRTUmVzcG9uc2UgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDQ7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19XTU1BZGRUU1Jlc3BvbnNlKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmR2V0UGFja2VkV01NQWRkVFNSZXNwb25zZVNpemUuICovCisKK3RBTklfVTMyIGRvdDExZkdldFBhY2tlZFdNTURlbFRTU2l6ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmV01NRGVsVFMgKnBGcm0sIHRBTklfVTMyICpwbk5lZWRlZCkKK3sKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICpwbk5lZWRlZCA9IDQ7CisgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZUNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSwgcG5OZWVkZWQsIElFU19XTU1EZWxUUyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZkdldFBhY2tlZFdNTURlbFRTU2l6ZS4gKi8KKworc3RhdGljIHRBTklfVTMyIEdldFBhY2tlZFNpemVDb3JlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBGcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbk5lZWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdElFRGVmbiAgSUVzW10pCit7CisgICAgY29uc3QgdElFRGVmbiAqcEllOworICAgIHRBTklfVTE2ICBpLCBuOworICAgIHRBTklfVTMyICBzdGF0dXM7CisgICAgdEZSQU1FU19CT09MICpwZkZvdW5kOworICAgIHRBTklfVTMyIGNvdW50T2Zmc2V0ID0gMDsKKyAgICB0QU5JX1UzMiBieXRlQ291bnQgPSAwOworICAgIHRBTklfVTggIHBJZVByZXNlbnQgPSAwOworICAgIHRBTklfVTMyIG9mZnNldCA9IDA7CisgICAgCisgICAgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisKKyAgICAodm9pZClwQ3R4OyAvKiBTaHV0dXAgdGhlIGNvbXBpbGVyIGlmIHdlIGhhdmUgbm8gRkZzIG5vciBJRXMuLi4gKi8KKyAgICBpPTA7IG49MDsKKyAgICBwSWUgPSAmKCBJRXNbMF0gKTsKKyAgICB3aGlsZSAoIDB4ZmYgIT0gcEllLT5laWQgKQorICAgIHsKKyAgICAgICAgcGZGb3VuZCA9ICh0RlJBTUVTX0JPT0wqKShwRnJtICsgcEllLT5vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZS0+cHJlc2VuY2VPZmZzZXQpOworICAgICAgICBpZiAoICpwZkZvdW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgY291bnRPZmZzZXQgPSAoKDAgPT0gcEllLT5hcnJheWJvdW5kKSA/IDEgOiAoKiggdEFOSV9VMTYqICkocEZybSArIHBJZS0+Y291bnRPZmZzZXQpKSApOworICAgICAgICAgICAgZm9yIChpID0gMFU7IGkgPCBjb3VudE9mZnNldDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IDJVICsgcEllLT5ub3VpOworICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgIHN3aXRjaCAocEllLT5zaWcpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUFQTmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFQVBOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAoKHREb3QxMWZJRUFQTmFtZSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQVBOYW1lKSAqIGkgKSktPm51bV9uYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVBUE5hbWUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUJQSW5kaWNhdG9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVCUEluZGljYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFQlBJbmRpY2F0b3IqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNvbmRlbnNlZENvdW50cnlTdHI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUdUSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFR1RLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAoKHREb3QxMWZJRUdUSyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFR1RLKSAqIGkgKSktPm51bV9rZXkgKyAxMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFR1RLKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVIQ0Y6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUhDRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFSENGKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVMTEF0dHI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUxMQXR0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFTExBdHRyKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVMb2FkQmFsYW5jZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFTG9hZEJhbGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRUxvYWRCYWxhbmNlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVMb2FkSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFTG9hZEluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRUxvYWRJbmZvKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQcm9wQXNzb2NUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQcm9wQXNzb2NUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVQcm9wQXNzb2NUeXBlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQcm9wQ2FwYWJpbGl0eToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUHJvcENhcGFiaWxpdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVByb3BDYXBhYmlsaXR5KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQcm9wQ2hhbm5Td2l0Y2hBbm46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVByb3BDaGFublN3aXRjaEFubik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFUHJvcENoYW5uU3dpdGNoQW5uKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQcm9wRURDQVBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUHJvcEVEQ0FQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDE4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVQcm9wRURDQVBhcmFtcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUHJvcFF1aWV0QlNTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQcm9wUXVpZXRCU1MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVByb3BRdWlldEJTUyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUHJvcFN1cHBSYXRlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUHJvcFN1cHBSYXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVQcm9wU3VwcFJhdGVzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQcm9wU3VwcFJhdGVzKSAqIGkgKSktPm51bV9yYXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFUHJvcFN1cHBSYXRlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUjBLSF9JRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUjBLSF9JRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVSMEtIX0lEKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSMEtIX0lEKSAqIGkgKSktPm51bV9QTUtfUjBfSUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVIwS0hfSUQqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVIxS0hfSUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVIxS0hfSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVIxS0hfSUQqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRTRkluZm86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVRTRkluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVRTRkluZm8qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRhdXJ1czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFVGF1cnVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVUYXVydXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRpdGFuOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVUaXRhbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFVGl0YW4qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRyaWdnZXJTdGFCZ1NjYW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVRyaWdnZXJTdGFCZ1NjYW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVRyaWdnZXJTdGFCZ1NjYW4qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVZlcnNpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFVmVyc2lvbiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVmVyc2lvbikgKiBpICkpLT5udW1fYnVpbGRfdmVyc2lvbiArIDU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVZlcnNpb24qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdEUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFV0RTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAoKHREb3QxMWZJRVdEUyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV0RTKSAqIGkgKSktPm51bV93ZHNEYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVXRFMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUFQQ2hhbm5lbFJlcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFQVBDaGFubmVsUmVwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAoKHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQVBDaGFubmVsUmVwb3J0KSAqIGkgKSktPm51bV9jaGFubmVsTGlzdCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRUFQQ2hhbm5lbFJlcG9ydCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQmNuUmVwb3J0aW5nRGV0YWlsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRUJjblJlcG9ydGluZ0RldGFpbCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQmVhY29uUmVwb3J0RnJtQm9keToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5KSAqIGkgKSktPm51bV9yZXBvcnRlZEZpZWxkczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQmVhY29uUmVwb3J0aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVCZWFjb25SZXBvcnRpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRUJlYWNvblJlcG9ydGluZyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llTWVhc3VyZW1lbnRQaWxvdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFTWVhc3VyZW1lbnRQaWxvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90KSAqIGkgKSktPm51bV92ZW5kb3JTcGVjaWZpYyArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRU1lYXN1cmVtZW50UGlsb3QqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZU11bHRpQnNzaWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRU11bHRpQnNzaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFTXVsdGlCc3NpZCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFTXVsdGlCc3NpZCkgKiBpICkpLT5udW1fdmVuZG9yU3BlY2lmaWMgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVNdWx0aUJzc2lkKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSSUNEYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVSSUNEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVSSUNEYXRhKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSSUNEZXNjcmlwdG9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVSSUNEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAoKHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IpICogaSApKS0+bnVtX3ZhcmlhYmxlRGF0YSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVJJQ0Rlc2NyaXB0b3IqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVJSTUVuYWJsZWRDYXA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVJSTUVuYWJsZWRDYXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVJSTUVuYWJsZWRDYXAqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVJlcXVlc3RlZEluZm86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVJlcXVlc3RlZEluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFUmVxdWVzdGVkSW5mbyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUmVxdWVzdGVkSW5mbykgKiBpICkpLT5udW1fcmVxdWVzdGVkX2VpZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVJlcXVlc3RlZEluZm8qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVNTSUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVNTSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFU1NJRCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFU1NJRCkgKiBpICkpLT5udW1fc3NpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFU1NJRCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llU2NoZWR1bGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVNjaGVkdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFU2NoZWR1bGUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRDTEFTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVUQ0xBUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFVENMQVMocEN0eCwgKCB0RG90MTFmSUVUQ0xBUyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVENMQVNTUFJPQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFVENMQVNTUFJPQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFVENMQVNTUFJPQyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVFNEZWxheToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFVFNEZWxheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFVFNEZWxheSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVFNQRUM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVRTUEVDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA1NTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFVFNQRUMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTVNjaGVkdWxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXTU1TY2hlZHVsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVdNTVNjaGVkdWxlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXTU1UQ0xBUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFV01NVENMQVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVdNTVRDTEFTKHBDdHgsICggdERvdDExZklFV01NVENMQVMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTVRDTEFTUFJPQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFV01NVENMQVNQUk9DKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVXTU1UQ0xBU1BST0MqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTVRTRGVsYXk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdNTVRTRGVsYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVdNTVRTRGVsYXkqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTVRTUEVDOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXTU1UU1BFQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVdNTVRTUEVDKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVBaXJnbzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFQWlyZ28pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRUFpcmdvKHBDdHgsICggdERvdDExZklFQWlyZ28qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNDWENja21PcGFxdWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUNDWENja21PcGFxdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFQ0NYQ2NrbU9wYXF1ZSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQ0NYQ2NrbU9wYXF1ZSkgKiBpICkpLT5udW1fZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFQ0NYQ2NrbU9wYXF1ZSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ0NYUmFkTWdtdENhcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFQ0NYUmFkTWdtdENhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFQ0NYUmFkTWdtdENhcCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ0NYVHJhZlN0cm1NZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUNDWFRyYWZTdHJtTWV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVDQ1hUcmFmU3RybU1ldCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ0NYVHJhZlN0cm1SYXRlU2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVDQ1hUcmFmU3RybVJhdGVTZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFQ0NYVHJhZlN0cm1SYXRlU2V0KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDQ1hUcmFmU3RybVJhdGVTZXQpICogaSApKS0+bnVtX3RzcmF0ZXMgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVDQ1hUcmFmU3RybVJhdGVTZXQqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNDWFR4bWl0UG93ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUNDWFR4bWl0UG93ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRUNDWFR4bWl0UG93ZXIqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNDWFZlcnNpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUNDWFZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRUNDWFZlcnNpb24qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNGUGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVDRlBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFQ0ZQYXJhbXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNoYWxsZW5nZVRleHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUNoYWxsZW5nZVRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFQ2hhbGxlbmdlVGV4dCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQ2hhbGxlbmdlVGV4dCkgKiBpICkpLT5udW1fdGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFQ2hhbGxlbmdlVGV4dCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ2hhblN3aXRjaEFubjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFQ2hhblN3aXRjaEFubik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFQ2hhblN3aXRjaEFubiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ291bnRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFQ291bnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFQ291bnRyeShwQ3R4LCAoIHREb3QxMWZJRUNvdW50cnkqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZURTUGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVEU1BhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFRFNQYXJhbXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUVEQ0FQYXJhbVNldDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFRURDQVBhcmFtU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFRURDQVBhcmFtU2V0KiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVFUlBJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVFUlBJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVFUlBJbmZvKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVFeHRDaGFuU3dpdGNoQW5uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVFeHRTdXBwUmF0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUV4dFN1cHBSYXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVFeHRTdXBwUmF0ZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUV4dFN1cHBSYXRlcykgKiBpICkpLT5udW1fcmF0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRUV4dFN1cHBSYXRlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRkhQYXJhbVNldDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFRkhQYXJhbVNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFRkhQYXJhbVNldCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRkhQYXJhbXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUZIUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVGSFBhcmFtcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRkhQYXR0VGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRUZIUGF0dFRhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAoKHREb3QxMWZJRUZIUGF0dFRhYmxlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVGSFBhdHRUYWJsZSkgKiBpICkpLT5udW1fcmFuZHRhYmxlICsgNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFRkhQYXR0VGFibGUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUZUSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFRlRJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmR2V0UGFja2VkSUVGVEluZm8ocEN0eCwgKCB0RG90MTFmSUVGVEluZm8qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUZUVGltZW91dEludGVydmFsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVGVFRpbWVvdXRJbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFRlRUaW1lb3V0SW50ZXJ2YWwqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUhUQ2FwczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFSFRDYXBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAoKHREb3QxMWZJRUhUQ2FwcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFSFRDYXBzKSAqIGkgKSktPm51bV9yc3ZkICsgMjY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRUhUQ2FwcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llSFRJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVIVEluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFSFRJbmZvKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVIVEluZm8pICogaSApKS0+bnVtX3JzdmQgKyAyMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFSFRJbmZvKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVJQlNTUGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVJQlNTUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVJQlNTUGFyYW1zKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVNZWFzdXJlbWVudFJlcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRU1lYXN1cmVtZW50UmVwb3J0KHBDdHgsICggdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZU1lYXN1cmVtZW50UmVxdWVzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmR2V0UGFja2VkSUVNZWFzdXJlbWVudFJlcXVlc3QocEN0eCwgKCB0RG90MTFmSUVNZWFzdXJlbWVudFJlcXVlc3QqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZU1vYmlsaXR5RG9tYWluOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFTW9iaWxpdHlEb21haW4qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZU5laWdoYm9yUmVwb3J0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVOZWlnaGJvclJlcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFTmVpZ2hib3JSZXBvcnQocEN0eCwgKCB0RG90MTFmSUVOZWlnaGJvclJlcG9ydCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQQXNzb2NSZXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVAyUEFzc29jUmVxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmR2V0UGFja2VkSUVQMlBBc3NvY1JlcShwQ3R4LCAoIHREb3QxMWZJRVAyUEFzc29jUmVxKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgKSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBBc3NvY1JlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQQXNzb2NSZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVAyUEFzc29jUmVzKHBDdHgsICggdERvdDExZklFUDJQQXNzb2NSZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEJlYWNvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQQmVhY29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmR2V0UGFja2VkSUVQMlBCZWFjb24ocEN0eCwgKCB0RG90MTFmSUVQMlBCZWFjb24qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEJlYWNvblByb2JlUmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFUDJQQmVhY29uUHJvYmVSZXMocEN0eCwgKCB0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQRGVBdXRoOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBEZUF1dGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVAyUERlQXV0aChwQ3R4LCAoIHREb3QxMWZJRVAyUERlQXV0aCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcShwQ3R4LCAoIHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyhwQ3R4LCAoIHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQRGlzQXNzb2M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVAyUERpc0Fzc29jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmR2V0UGFja2VkSUVQMlBEaXNBc3NvYyhwQ3R4LCAoIHREb3QxMWZJRVAyUERpc0Fzc29jKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgKSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBHT05lZ0NuZjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQR09OZWdDbmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVAyUEdPTmVnQ25mKHBDdHgsICggdERvdDExZklFUDJQR09OZWdDbmYqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEdPTmVnUmVxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBHT05lZ1JlcSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFUDJQR09OZWdSZXEocEN0eCwgKCB0RG90MTFmSUVQMlBHT05lZ1JlcSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQR09OZWdSZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVAyUEdPTmVnUmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmR2V0UGFja2VkSUVQMlBHT05lZ1JlcyhwQ3R4LCAoIHREb3QxMWZJRVAyUEdPTmVnUmVzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgKSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBHT05lZ1dQUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQR09OZWdXUFMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVAyUEdPTmVnV1BTKHBDdHgsICggdERvdDExZklFUDJQR09OZWdXUFMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUElFT3BhcXVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBJRU9wYXF1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVQMlBJRU9wYXF1ZSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQSUVPcGFxdWUpICogaSApKS0+bnVtX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVAyUElFT3BhcXVlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBJbnZpdGF0aW9uUmVxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmR2V0UGFja2VkSUVQMlBJbnZpdGF0aW9uUmVxKHBDdHgsICggdERvdDExZklFUDJQSW52aXRhdGlvblJlcSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQSW52aXRhdGlvblJlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQSW52aXRhdGlvblJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFUDJQSW52aXRhdGlvblJlcyhwQ3R4LCAoIHREb3QxMWZJRVAyUEludml0YXRpb25SZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUE5vdGljZU9mQWJzZW5jZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQTm90aWNlT2ZBYnNlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmR2V0UGFja2VkSUVQMlBOb3RpY2VPZkFic2VuY2UocEN0eCwgKCB0RG90MTFmSUVQMlBOb3RpY2VPZkFic2VuY2UqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUFByZXNlbmNlUmVzcG9uc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVAyUFByZXNlbmNlUmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVAyUFByZXNlbmNlUmVzcG9uc2UocEN0eCwgKCB0RG90MTFmSUVQMlBQcmVzZW5jZVJlc3BvbnNlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgKSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBQcm9iZVJlcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUDJQUHJvYmVSZXEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVAyUFByb2JlUmVxKHBDdHgsICggdERvdDExZklFUDJQUHJvYmVSZXEqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUFByb2JlUmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBQcm9iZVJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFUDJQUHJvYmVSZXMocEN0eCwgKCB0RG90MTFmSUVQMlBQcm9iZVJlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcShwQ3R4LCAoIHREb3QxMWZJRVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQMlBXU0NQcm92aXNpb25EaXNjb3ZlcnlSZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcyhwQ3R4LCAoIHREb3QxMWZJRVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUG93ZXJDYXBzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVQb3dlckNhcHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVBvd2VyQ2FwcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUG93ZXJDb25zdHJhaW50czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFUG93ZXJDb25zdHJhaW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFUG93ZXJDb25zdHJhaW50cyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUUJTU0xvYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVFCU1NMb2FkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVRQlNTTG9hZCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUU9TQ2Fwc0FwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVRT1NDYXBzQXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVFPU0NhcHNBcCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUU9TQ2Fwc1N0YXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUXVpZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVF1aWV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVRdWlldCogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUkNQSUlFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVSQ1BJSUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVJDUElJRSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUklDRGF0YURlc2M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVJJQ0RhdGFEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbk5lZWRlZCAtPSAyICA7IC8vU3VidHJhY3QgdGhlIGxlbmd0aCBhbmQgT3VpIGFzIHRoaXMgaXMgb3VyIGNvbnRhaW5lciBJRSB0byBncm91cCBJZXMgYW5kIGl0IGRvZXNudCBoYXZlIGl0cyBvd24gbGVuZ3RoIGFuZCBPVUkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFUklDRGF0YURlc2MocEN0eCwgKCB0RG90MTFmSUVSSUNEYXRhRGVzYyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVSU04pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVJTTihwQ3R4LCAoIHREb3QxMWZJRVJTTiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUlNOSUlFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVSU05JSUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVJTTklJRSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUlNOT3BhcXVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVSU05PcGFxdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFUlNOT3BhcXVlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSU05PcGFxdWUpICogaSApKS0+bnVtX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVJTTk9wYXF1ZSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llU3VwcENoYW5uZWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVTdXBwQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFU3VwcENoYW5uZWxzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVTdXBwQ2hhbm5lbHMpICogaSApKS0+bnVtX2JhbmRzICogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFU3VwcENoYW5uZWxzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVTdXBwUmF0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVN1cHBSYXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVTdXBwUmF0ZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVN1cHBSYXRlcykgKiBpICkpLT5udW1fcmF0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVN1cHBSYXRlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVElNOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVUSU0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFVElNKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVUSU0pICogaSApKS0+bnVtX3ZibXAgKyAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVUSU0qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRQQ1JlcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFVFBDUmVwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVUUENSZXBvcnQqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRQQ1JlcXVlc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVRQQ1JlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVRQQ1JlcXVlc3QqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdBUEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdBUEkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVdBUEkocEN0eCwgKCB0RG90MTFmSUVXQVBJKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgKSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXQVBJT3BhcXVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXQVBJT3BhcXVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAoKHREb3QxMWZJRVdBUElPcGFxdWUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdBUElPcGFxdWUpICogaSApKS0+bnVtX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVdBUElPcGFxdWUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdGQVRQQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFV0ZBVFBDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVXRkFUUEMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTUNhcHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdNTUNhcHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEllUHJlc2VudCA9ICggKHREb3QxMWZJRVdNTUNhcHMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTUluZm9BcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFV01NSW5mb0FwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVXTU1JbmZvQXAqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTUluZm9TdGF0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXTU1JbmZvU3RhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFV01NSW5mb1N0YXRpb24qICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSAgKSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTVBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFV01NUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxOTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFV01NUGFyYW1zKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXUEE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdQQSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFV1BBKHBDdHgsICggdERvdDExZklFV1BBKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgKSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXUEFPcGFxdWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdQQU9wYXF1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmSUVXUEFPcGFxdWUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdQQU9wYXF1ZSkgKiBpICkpLT5udW1fZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWVQcmVzZW50ID0gKCAodERvdDExZklFV1BBT3BhcXVlKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgICkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXU0M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdTQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFV1NDKHBDdHgsICggdERvdDExZklFV1NDKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgKSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXc2NBc3NvY1JlcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFV3NjQXNzb2NSZXEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVdzY0Fzc29jUmVxKHBDdHgsICggdERvdDExZklFV3NjQXNzb2NSZXEqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdzY0Fzc29jUmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXc2NBc3NvY1Jlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZkdldFBhY2tlZElFV3NjQXNzb2NSZXMocEN0eCwgKCB0RG90MTFmSUVXc2NBc3NvY1JlcyogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV3NjQmVhY29uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZih0RG90MTFmSUVXc2NCZWFjb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVdzY0JlYWNvbihwQ3R4LCAoIHREb3QxMWZJRVdzY0JlYWNvbiogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICksIHBuTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV3NjQmVhY29uUHJvYmVSZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmR2V0UGFja2VkSUVXc2NCZWFjb25Qcm9iZVJlcyhwQ3R4LCAoIHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgKSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXc2NJRU9wYXF1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFV3NjSUVPcGFxdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZklFV3NjSUVPcGFxdWUqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdzY0lFT3BhcXVlKSAqIGkgKSktPm51bV9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZVByZXNlbnQgPSAoICh0RG90MTFmSUVXc2NJRU9wYXF1ZSogKShwRnJtICsgcEllLT5vZmZzZXQgKyBvZmZzZXQgKiBpICApKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV3NjUHJvYmVSZXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdzY1Byb2JlUmVxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmR2V0UGFja2VkSUVXc2NQcm9iZVJlcShwQ3R4LCAoIHREb3QxMWZJRVdzY1Byb2JlUmVxKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgKSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXc2NQcm9iZVJlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YodERvdDExZklFV3NjUHJvYmVSZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVdzY1Byb2JlUmVzKHBDdHgsICggdERvdDExZklFV3NjUHJvYmVSZXMqICkocEZybSArIHBJZS0+b2Zmc2V0ICsgb2Zmc2V0ICogaSApLCBwbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdzY1JlYXNzb2NSZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKHREb3QxMWZJRVdzY1JlYXNzb2NSZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZHZXRQYWNrZWRJRVdzY1JlYXNzb2NSZXMocEN0eCwgKCB0RG90MTFmSUVXc2NSZWFzc29jUmVzKiApKHBGcm0gKyBwSWUtPm9mZnNldCArIG9mZnNldCAqIGkgKSwgcG5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkxPR0UsIEZSRkwoIklOVEVSTkFMIEVSUk9SLS0gSSBkb24iCisgICAgICAgICAgICAgICAgICAgICAgICIndCBrbm93IGFib3V0IHRoZSBJRSBzaWduYXR1cmUgJWQ7IHRoaXMgaXMgbW9zdCBsIgorICAgICAgICAgICAgICAgICAgICAgICAiaWtlbHkgYSBidWcgaW4gJ2ZyYW1lc2MnLlxuIiksIHBJZS0+c2lnKTsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gRE9UMTFGX0lOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgfS8qRW5kIG9mIHN3aXRjaCBDYXNlKi8KKyAgICAgICAgICAgICAgIGlmKCBieXRlQ291bnQgJiYgcEllUHJlc2VudCApCisgICAgICAgICAgICAgICAgICpwbk5lZWRlZCArPSBieXRlQ291bnQ7CisgICAgICAgICAgIH0gLypFbmQgb2YgZm9yIGxvb3AqLworICAgICAgICB9CisgICAgICAgICsrcEllOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworCit9CisKK3N0YXRpYyB0QU5JX1UzMiBHZXRQYWNrZWRTaXplVGx2Q29yZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEZybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbk5lZWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRUTFZEZWZuICBUTFZzW10pCit7CisgICAgY29uc3QgdFRMVkRlZm4gKnBUbHY7CisgICAgdEFOSV9VMzIgICBzdGF0dXM7CisgICAgdEZSQU1FU19CT09MICAgKnBmRm91bmQ7CisgICAgdEFOSV9VMzIgICBieXRlQ291bnQgPSAwOworICAgIHRBTklfVTggICAgcFRsdlByZXNlbnQgPSAwOworCisgICAgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisKKyAgICBwVGx2ID0gJiggVExWc1swXSApOworICAgIHdoaWxlICggMHhmZmZmICE9IHBUbHYtPmlkICkKKyAgICB7CisgICAgICAgIHBmRm91bmQgPSAodEZSQU1FU19CT09MKikocEZybSArIHBUbHYtPm9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRsdi0+cHJlc2VuY2VPZmZzZXQpOworICAgICAgICBpZiAoICpwZkZvdW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgKnBuTmVlZGVkICs9IChwVGx2LT5zVHlwZSArIHBUbHYtPnNMZW4pOworICAgICAgICAgICAgaWYgKCBwVGx2LT5wZWMgKSAqcG5OZWVkZWQgKz0gM1U7CisgICAgICAgICAgICBzd2l0Y2ggKHBUbHYtPnNpZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkF1dGhvcml6ZWRNQUNzOgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA2OworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWQXV0aG9yaXplZE1BQ3MqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlJlcXVlc3RUb0Vucm9sbDoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVlJlcXVlc3RUb0Vucm9sbCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2VmVyc2lvbjI6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZWZXJzaW9uMiogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2QVBTZXR1cExvY2tlZDoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVkFQU2V0dXBMb2NrZWQqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkFzc29jaWF0aW9uU3RhdGU6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZBc3NvY2lhdGlvblN0YXRlKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZDaGFubmVsTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmVExWQ2hhbm5lbExpc3QqKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPm51bV9jaGFubmVsTGlzdCszOworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWQ2hhbm5lbExpc3QqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkNvbmZpZ01ldGhvZHM6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZDb25maWdNZXRob2RzKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZDb25maWd1cmF0aW9uRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZDb25maWd1cmF0aW9uRXJyb3IqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkNvbmZpZ3VyYXRpb25UaW1lb3V0OgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWQ29uZmlndXJhdGlvblRpbWVvdXQqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkRldmljZU5hbWU6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZlRMVkRldmljZU5hbWUqKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPm51bV90ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWRGV2aWNlTmFtZSogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2RGV2aWNlUGFzc3dvcmRJRDoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nOgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmcqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkdPSW50ZW50OgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWR09JbnRlbnQqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzczoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcyogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2SW52aXRhdGlvbkZsYWdzOgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWSW52aXRhdGlvbkZsYWdzKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZMaXN0ZW5DaGFubmVsOgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWTGlzdGVuQ2hhbm5lbCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2TWFudWZhY3R1cmVyOgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAoKHREb3QxMWZUTFZNYW51ZmFjdHVyZXIqKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPm51bV9uYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWTWFudWZhY3R1cmVyKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZNaW5vclJlYXNvbkNvZGU6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZNaW5vclJlYXNvbkNvZGUqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1Rsdk1vZGVsTmFtZToKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmVExWTW9kZWxOYW1lKikocEZybSArIHBUbHYtPm9mZnNldCkpLT5udW1fdGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVk1vZGVsTmFtZSogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2TW9kZWxOdW1iZXI6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZlRMVk1vZGVsTnVtYmVyKikocEZybSArIHBUbHYtPm9mZnNldCkpLT5udW1fdGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVk1vZGVsTnVtYmVyKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZOb3RpY2VPZkFic2VuY2U6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSopKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+bnVtX05vQURlc2MrMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2T3BlcmF0aW5nQ2hhbm5lbDoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVk9wZXJhdGluZ0NoYW5uZWwqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlAyUENhcGFiaWxpdHk6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5KiApKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZQMlBEZXZpY2VJZDoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVlAyUERldmljZUlkKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZQMlBEZXZpY2VJbmZvOgorICAgICAgICBzdGF0dXMgPSBHZXRQYWNrZWRTaXplVGx2Q29yZShwQ3R4LCAoIHRBTklfVTgqIClwRnJtICsgcFRsdi0+b2Zmc2V0LCBwbk5lZWRlZCwgVExWU19QMlBEZXZpY2VJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZQMlBHcm91cEJzc2lkOgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA2OworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWUDJQR3JvdXBCc3NpZCogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UDJQR3JvdXBJZDoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmVExWUDJQR3JvdXBJZCopKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+bnVtX3NzaWQrNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVlAyUEdyb3VwSWQqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlAyUEdyb3VwSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gKCh0RG90MTFmVExWUDJQR3JvdXBJbmZvKikocEZybSArIHBUbHYtPm9mZnNldCkpLT5udW1fUDJQQ2xpZW50SW5mb0Rlc2M7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZQMlBHcm91cEluZm8qICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlAyUFN0YXR1czoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVlAyUFN0YXR1cyogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UHJpbWFyeURldmljZVR5cGU6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UkZCYW5kczoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVlJGQmFuZHMqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlJlcXVlc3REZXZpY2VUeXBlOgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlJlcXVlc3RUeXBlOgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWUmVxdWVzdFR5cGUqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlJlc3BvbnNlVHlwZToKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVlJlc3BvbnNlVHlwZSogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXI6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhciogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzKiApKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+cHJlc2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZTZXJpYWxOdW1iZXI6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9ICgodERvdDExZlRMVlNlcmlhbE51bWJlciopKHBGcm0gKyBwVGx2LT5vZmZzZXQpKS0+bnVtX3RleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZTZXJpYWxOdW1iZXIqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlVVSURfRToKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZVVUlEX0UqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlVVSURfUjoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICBwVGx2UHJlc2VudCA9ICgoIHREb3QxMWZUTFZVVUlEX1IqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlZlbmRvckV4dGVuc2lvbjoKKyAgICAgICAgc3RhdHVzID0gR2V0UGFja2VkU2l6ZVRsdkNvcmUocEN0eCwgKCB0QU5JX1U4KiApcEZybSArIHBUbHYtPm9mZnNldCwgcG5OZWVkZWQsIFRMVlNfVmVuZG9yRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVlZlbmRvckV4dGVuc2lvbiogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2VmVyc2lvbjoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVlZlcnNpb24qICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdldQU1N0YXRlOgorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcFRsdlByZXNlbnQgPSAoKCB0RG90MTFmVExWV1BTU3RhdGUqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlAyUEludGVyZmFjZToKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVlAyUEludGVyZmFjZSogKShwRnJtICsgcFRsdi0+b2Zmc2V0KSktPnByZXNlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UDJQTWFuYWdlYWJpbGl0eToKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUbHZQcmVzZW50ID0gKCggdERvdDExZlRMVlAyUE1hbmFnZWFiaWxpdHkqICkocEZybSArIHBUbHYtPm9mZnNldCkpLT5wcmVzZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJMT0dFLCBGUkZMKCJJTlRFUk5BTCBFUlJPUi0tIEkgZG9uIgorICAgICAgICAgICAgICAgICAgICAiJ3Qga25vdyBhYm91dCB0aGUgVExWIHNpZ25hdHVyZSAlZDsgdGhpcyBpcyBtb3N0IGwiCisgICAgICAgICAgICAgICAgICAgICJpa2VseSBhIGJ1ZyBpbiAnZnJhbWVzYycuXG4iKSwgcFRsdi0+c2lnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRE9UMTFGX0lOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocFRsdlByZXNlbnQpIHsKKyAgICAgICAgICAgICAgKnBuTmVlZGVkICs9IGJ5dGVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICArK3BUbHY7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9Cit2b2lkIGRvdDExZlBhY2tGZkFJRCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmQUlEICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hc3NvY2lkLCAwKTsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmQUlELiAqLworCit2b2lkIGRvdDExZlBhY2tGZkFjdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmQWN0aW9uICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICAqcEJ1ZiA9IHBTcmMtPmFjdGlvbjsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmQWN0aW9uLiAqLworCit2b2lkIGRvdDExZlBhY2tGZkFkZEJBUGFyYW1ldGVyU2V0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZkFkZEJBUGFyYW1ldGVyU2V0ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmKQoreworICAgIHRBTklfVTE2IHRtcDcyX187CisgICAgdG1wNzJfXyA9IDBVOworICAgIHRtcDcyX18gfD0gKCBwU3JjLT5hbXNkdVN1cHBvcnRlZCA8PCAwICk7CisgICAgdG1wNzJfXyB8PSAoIHBTcmMtPnBvbGljeSA8PCAxICk7CisgICAgdG1wNzJfXyB8PSAoIHBTcmMtPnRpZCA8PCAyICk7CisgICAgdG1wNzJfXyB8PSAoIHBTcmMtPmJ1ZmZlclNpemUgPDwgNiApOworICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDcyX18sIDApOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZBZGRCQVBhcmFtZXRlclNldC4gKi8KKwordm9pZCBkb3QxMWZQYWNrRmZBdXRoQWxnbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZBdXRoQWxnbyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hbGdvLCAwKTsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmQXV0aEFsZ28uICovCisKK3ZvaWQgZG90MTFmUGFja0ZmQXV0aFNlcU5vKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZBdXRoU2VxTm8gKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmKQoreworICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm5vLCAwKTsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmQXV0aFNlcU5vLiAqLworCit2b2lkIGRvdDExZlBhY2tGZkJBU3RhcnRpbmdTZXF1ZW5jZUNvbnRyb2wodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9VMTYgdG1wNzNfXzsKKyAgICB0bXA3M19fID0gMFU7CisgICAgdG1wNzNfXyB8PSAoIHBTcmMtPmZyYWdOdW1iZXIgPDwgMCApOworICAgIHRtcDczX18gfD0gKCBwU3JjLT5zc24gPDwgNCApOworICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDczX18sIDApOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sLiAqLworCit2b2lkIGRvdDExZlBhY2tGZkJBVGltZW91dCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmQkFUaW1lb3V0ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT50aW1lb3V0LCAwKTsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmQkFUaW1lb3V0LiAqLworCit2b2lkIGRvdDExZlBhY2tGZkJlYWNvbkludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZkJlYWNvbkludGVydmFsICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmKQoreworICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmludGVydmFsLCAwKTsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmQmVhY29uSW50ZXJ2YWwuICovCisKK3ZvaWQgZG90MTFmUGFja0ZmQ2FwYWJpbGl0aWVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZDYXBhYmlsaXRpZXMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmKQoreworICAgIHRBTklfVTE2IHRtcDc0X187CisgICAgdG1wNzRfXyA9IDBVOworICAgIHRtcDc0X18gfD0gKCBwU3JjLT5lc3MgPDwgMCApOworICAgIHRtcDc0X18gfD0gKCBwU3JjLT5pYnNzIDw8IDEgKTsKKyAgICB0bXA3NF9fIHw9ICggcFNyYy0+Y2ZQb2xsYWJsZSA8PCAyICk7CisgICAgdG1wNzRfXyB8PSAoIHBTcmMtPmNmUG9sbFJlcSA8PCAzICk7CisgICAgdG1wNzRfXyB8PSAoIHBTcmMtPnByaXZhY3kgPDwgNCApOworICAgIHRtcDc0X18gfD0gKCBwU3JjLT5zaG9ydFByZWFtYmxlIDw8IDUgKTsKKyAgICB0bXA3NF9fIHw9ICggcFNyYy0+cGJjYyA8PCA2ICk7CisgICAgdG1wNzRfXyB8PSAoIHBTcmMtPmNoYW5uZWxBZ2lsaXR5IDw8IDcgKTsKKyAgICB0bXA3NF9fIHw9ICggcFNyYy0+c3BlY3RydW1NZ3QgPDwgOCApOworICAgIHRtcDc0X18gfD0gKCBwU3JjLT5xb3MgPDwgOSApOworICAgIHRtcDc0X18gfD0gKCBwU3JjLT5zaG9ydFNsb3RUaW1lIDw8IDEwICk7CisgICAgdG1wNzRfXyB8PSAoIHBTcmMtPmFwc2QgPDwgMTEgKTsKKyAgICB0bXA3NF9fIHw9ICggcFNyYy0+cnJtIDw8IDEyICk7CisgICAgdG1wNzRfXyB8PSAoIHBTcmMtPmRzc3NPZmRtIDw8IDEzICk7CisgICAgdG1wNzRfXyB8PSAoIHBTcmMtPmRlbGF5ZWRCQSA8PCAxNCApOworICAgIHRtcDc0X18gfD0gKCBwU3JjLT5pbW1lZGlhdGVCQSA8PCAxNSApOworICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDc0X18sIDApOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZDYXBhYmlsaXRpZXMuICovCisKK3ZvaWQgZG90MTFmUGFja0ZmQ2F0ZWdvcnkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmQ2F0ZWdvcnkgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYpCit7CisgICAgKnBCdWYgPSBwU3JjLT5jYXRlZ29yeTsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmQ2F0ZWdvcnkuICovCisKK3ZvaWQgZG90MTFmUGFja0ZmQ3VycmVudEFQQWRkcmVzcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZkN1cnJlbnRBUEFkZHJlc3MgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPm1hYywgNik7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlBhY2tGZkN1cnJlbnRBUEFkZHJlc3MuICovCisKK3ZvaWQgZG90MTFmUGFja0ZmRGVsQkFQYXJhbWV0ZXJTZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmRGVsQkFQYXJhbWV0ZXJTZXQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYpCit7CisgICAgdEFOSV9VMTYgdG1wNzVfXzsKKyAgICB0bXA3NV9fID0gMFU7CisgICAgdG1wNzVfXyB8PSAoIHBTcmMtPnJlc2VydmVkIDw8IDAgKTsKKyAgICB0bXA3NV9fIHw9ICggcFNyYy0+aW5pdGlhdG9yIDw8IDExICk7CisgICAgdG1wNzVfXyB8PSAoIHBTcmMtPnRpZCA8PCAxMiApOworICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDc1X18sIDApOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZEZWxCQVBhcmFtZXRlclNldC4gKi8KKwordm9pZCBkb3QxMWZQYWNrRmZEaWFsb2dUb2tlbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZEaWFsb2dUb2tlbiAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICAqcEJ1ZiA9IHBTcmMtPnRva2VuOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZEaWFsb2dUb2tlbi4gKi8KKwordm9pZCBkb3QxMWZQYWNrRmZMaW5rTWFyZ2luKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmTGlua01hcmdpbiAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmKQoreworICAgICpwQnVmID0gcFNyYy0+bGlua01hcmdpbjsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmTGlua01hcmdpbi4gKi8KKwordm9pZCBkb3QxMWZQYWNrRmZMaXN0ZW5JbnRlcnZhbCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZMaXN0ZW5JbnRlcnZhbCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5pbnRlcnZhbCwgMCk7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlBhY2tGZkxpc3RlbkludGVydmFsLiAqLworCit2b2lkIGRvdDExZlBhY2tGZk1heFR4UG93ZXIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZNYXhUeFBvd2VyICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYpCit7CisgICAgKnBCdWYgPSBwU3JjLT5tYXhUeFBvd2VyOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZNYXhUeFBvd2VyLiAqLworCit2b2lkIGRvdDExZlBhY2tGZk51bU9mUmVwZXRpdGlvbnModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZOdW1PZlJlcGV0aXRpb25zICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYpCit7CisgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+cmVwZXRpdGlvbnMsIDApOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZOdW1PZlJlcGV0aXRpb25zLiAqLworCit2b2lkIGRvdDExZlBhY2tGZlAyUE9VSSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmUDJQT1VJICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5vdWksIDApOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZQMlBPVUkuICovCisKK3ZvaWQgZG90MTFmUGFja0ZmUDJQT1VJU3ViVHlwZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZlAyUE9VSVN1YlR5cGUgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICAqcEJ1ZiA9IHBTcmMtPm91aVN1YnR5cGU7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlBhY2tGZlAyUE9VSVN1YlR5cGUuICovCisKK3ZvaWQgZG90MTFmUGFja0ZmUkNQSSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZlJDUEkgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICAqcEJ1ZiA9IHBTcmMtPnJjcGk7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlBhY2tGZlJDUEkuICovCisKK3ZvaWQgZG90MTFmUGFja0ZmUlNOSSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZlJTTkkgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICAqcEJ1ZiA9IHBTcmMtPnJzbmk7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlBhY2tGZlJTTkkuICovCisKK3ZvaWQgZG90MTFmUGFja0ZmUmVhc29uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZSZWFzb24gKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmKQoreworICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNvZGUsIDApOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZSZWFzb24uICovCisKK3ZvaWQgZG90MTFmUGFja0ZmUnhBbnRlbm5hSWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmUnhBbnRlbm5hSWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYpCit7CisgICAgKnBCdWYgPSBwU3JjLT5hbnRlbm5hSWQ7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlBhY2tGZlJ4QW50ZW5uYUlkLiAqLworCit2b2lkIGRvdDExZlBhY2tGZlNNUG93ZXJNb2RlU2V0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZlNNUG93ZXJNb2RlU2V0ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmKQoreworICAgIHRBTklfVTggdG1wNzZfXzsKKyAgICB0bXA3Nl9fID0gMFU7CisgICAgdG1wNzZfXyB8PSAoIHBTcmMtPlBvd2VyU2F2ZV9FbiA8PCAwICk7CisgICAgdG1wNzZfXyB8PSAoIHBTcmMtPk1vZGUgPDwgMSApOworICAgIHRtcDc2X18gfD0gKCBwU3JjLT5yZXNlcnZlZCA8PCAyICk7CisgICAgKnBCdWYgPSB0bXA3Nl9fOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZTTVBvd2VyTW9kZVNldC4gKi8KKwordm9pZCBkb3QxMWZQYWNrRmZTdGF0dXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZlN0YXR1cyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYpCit7CisgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+c3RhdHVzLCAwKTsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmU3RhdHVzLiAqLworCit2b2lkIGRvdDExZlBhY2tGZlN0YXR1c0NvZGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZTdGF0dXNDb2RlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYpCit7CisgICAgKnBCdWYgPSBwU3JjLT5zdGF0dXNDb2RlOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZTdGF0dXNDb2RlLiAqLworCit2b2lkIGRvdDExZlBhY2tGZlRQQ0VsZUlEKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZlRQQ0VsZUlEICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmKQoreworICAgICpwQnVmID0gcFNyYy0+VFBDSWQ7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlBhY2tGZlRQQ0VsZUlELiAqLworCit2b2lkIGRvdDExZlBhY2tGZlRQQ0VsZUxlbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmVFBDRWxlTGVuICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICAqcEJ1ZiA9IHBTcmMtPlRQQ0xlbjsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmVFBDRWxlTGVuLiAqLworCit2b2lkIGRvdDExZlBhY2tGZlRTSW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmVFNJbmZvICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICB0QU5JX1UzMiB0bXA3N19fOworICAgIHRtcDc3X18gPSAwVTsKKyAgICB0bXA3N19fIHw9ICggcFNyYy0+dHJhZmZpY190eXBlIDw8IDAgKTsKKyAgICB0bXA3N19fIHw9ICggcFNyYy0+dHNpZCA8PCAxICk7CisgICAgdG1wNzdfXyB8PSAoIHBTcmMtPmRpcmVjdGlvbiA8PCA1ICk7CisgICAgdG1wNzdfXyB8PSAoIHBTcmMtPmFjY2Vzc19wb2xpY3kgPDwgNyApOworICAgIHRtcDc3X18gfD0gKCBwU3JjLT5hZ2dyZWdhdGlvbiA8PCA5ICk7CisgICAgdG1wNzdfXyB8PSAoIHBTcmMtPnBzYiA8PCAxMCApOworICAgIHRtcDc3X18gfD0gKCBwU3JjLT51c2VyX3ByaW9yaXR5IDw8IDExICk7CisgICAgdG1wNzdfXyB8PSAoIHBTcmMtPnRzaW5mb19hY2tfcG9sIDw8IDE0ICk7CisgICAgdG1wNzdfXyB8PSAoIHBTcmMtPnNjaGVkdWxlIDw8IDE2ICk7CisgICAgdG1wNzdfXyB8PSAoIHBTcmMtPnVudXNlZCA8PCAxNyApOworICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHRtcDc3X18sIDApOworICAgICh2b2lkKXBDdHg7Cit9IC8qIEVuZCBkb3QxMWZQYWNrRmZUU0luZm8uICovCisKK3ZvaWQgZG90MTFmUGFja0ZmVGltZVN0YW1wKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZUaW1lU3RhbXAgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmKQoreworICAgIGZyYW1lc2h0b25xKHBDdHgsIHBCdWYsIHBTcmMtPnRpbWVzdGFtcCwgMCk7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlBhY2tGZlRpbWVTdGFtcC4gKi8KKwordm9pZCBkb3QxMWZQYWNrRmZUeEFudGVubmFJZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZUeEFudGVubmFJZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICAqcEJ1ZiA9IHBTcmMtPmFudGVubmFJZDsKKyAgICAodm9pZClwQ3R4OworfSAvKiBFbmQgZG90MTFmUGFja0ZmVHhBbnRlbm5hSWQuICovCisKK3ZvaWQgZG90MTFmUGFja0ZmVHhQb3dlcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZlR4UG93ZXIgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZikKK3sKKyAgICAqcEJ1ZiA9IHBTcmMtPnR4UG93ZXI7CisgICAgKHZvaWQpcEN0eDsKK30gLyogRW5kIGRvdDExZlBhY2tGZlR4UG93ZXIuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZBdXRob3JpemVkTUFDcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZBdXRob3JpemVkTUFDcyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcFRsdkxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICs9IDg7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcEJ1ZiA9IDE7CisgICAgICAgIHBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5tYWMsIDYpOworICAgICAgICAqcG5Db25zdW1lZCArPSA2OworICAgICAgICBwQnVmICs9IDY7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgKnBUbHZMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2QXV0aG9yaXplZE1BQ3MuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZSZXF1ZXN0VG9FbnJvbGwodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVlJlcXVlc3RUb0Vucm9sbCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcFRsdkxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICs9IDM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcEJ1ZiA9IDM7CisgICAgICAgIHBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXE7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICAqcFRsdkxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZSZXF1ZXN0VG9FbnJvbGwuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZWZXJzaW9uMih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZWZXJzaW9uMiAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcFRsdkxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICB0QU5JX1U4IHRtcDc4X187CisgICAgbk5lZWRlZCArPSAzOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBCdWYgPSAwOworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHRtcDc4X18gPSAwVTsKKyAgICAgICAgdG1wNzhfXyB8PSAoIHBTcmMtPm1pbm9yIDw8IDAgKTsKKyAgICAgICAgdG1wNzhfXyB8PSAoIHBTcmMtPm1ham9yIDw8IDQgKTsKKyAgICAgICAgKnBCdWYgPSB0bXA3OF9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgICpwVGx2TGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1RsdlZlcnNpb24yLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2QVBTZXR1cExvY2tlZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVkFQU2V0dXBMb2NrZWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSA1OworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDQxODMsIDEpOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICpwQnVmID0gcFNyYy0+ZkxvY2tlZDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1RsdkFQU2V0dXBMb2NrZWQuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZBc3NvY2lhdGlvblN0YXRlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWQXNzb2NpYXRpb25TdGF0ZSAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcFRsdkxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICs9IDY7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNDA5OCwgMSk7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+c3RhdGUsIDEpOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2QXNzb2NpYXRpb25TdGF0ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdkNoYW5uZWxMaXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVkNoYW5uZWxMaXN0ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gKCBwU3JjLT5udW1fY2hhbm5lbExpc3QgKyA2KSA7CisKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwQnVmID0gMTE7CisgICAgICAgIHBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5jb3VudHJ5U3RyaW5nLCAzKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMzsKKyAgICAgICAgcEJ1ZiArPSAzOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPmNoYW5uZWxMaXN0ICksIHBTcmMtPm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9jaGFubmVsTGlzdDsKKyAgICAgICAgcEJ1ZiArPSBwU3JjLT5udW1fY2hhbm5lbExpc3Q7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDMsIDApOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2Q2hhbm5lbExpc3QuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZDb25maWdNZXRob2RzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWQ29uZmlnTWV0aG9kcyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcFRsdkxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICs9IDY7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNDEwNCwgMSk7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bWV0aG9kcywgMSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZDb25maWdNZXRob2RzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2Q29uZmlndXJhdGlvbkVycm9yKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZDb25maWd1cmF0aW9uRXJyb3IgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSA2OworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDQxMDUsIDEpOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmVycm9yLCAxKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1RsdkNvbmZpZ3VyYXRpb25FcnJvci4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdkNvbmZpZ3VyYXRpb25UaW1lb3V0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVkNvbmZpZ3VyYXRpb25UaW1lb3V0ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gNTsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwQnVmID0gNTsKKyAgICAgICAgcEJ1ZiArPSAxOyAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPkdPQ29uZmlnVGltZW91dDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPkNMQ29uZmlnVGltZW91dDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1RsdkNvbmZpZ3VyYXRpb25UaW1lb3V0LiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2RGV2aWNlTmFtZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVkRldmljZU5hbWUgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSAoIHBTcmMtPm51bV90ZXh0ICsgNCkgOworCisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNDExMywgMSk7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT50ZXh0ICksIHBTcmMtPm51bV90ZXh0KTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3RleHQ7CisgICAgICAgIHBCdWYgKz0gcFNyYy0+bnVtX3RleHQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2RGV2aWNlTmFtZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdkRldmljZVBhc3N3b3JkSUQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZEZXZpY2VQYXNzd29yZElEICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gNjsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA0MTE0LCAxKTsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5pZCwgMSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZEZXZpY2VQYXNzd29yZElELiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2RXh0ZW5kZWRMaXN0ZW5UaW1pbmcodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWRXh0ZW5kZWRMaXN0ZW5UaW1pbmcgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSA3OworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBCdWYgPSA4OworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmF2YWlsaWJpbGl0eVBlcmlvZCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YXZhaWxpYmlsaXR5SW50ZXJ2YWwsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDMsIDApOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2RXh0ZW5kZWRMaXN0ZW5UaW1pbmcuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZHT0ludGVudCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZHT0ludGVudCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcFRsdkxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICs9IDQ7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcEJ1ZiA9IDQ7CisgICAgICAgIHBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5HT0ludGVudDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1RsdkdPSW50ZW50LiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2SW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSA5OworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBCdWYgPSA5OworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+UDJQSW50ZXJmYWNlQWRkcmVzcywgNik7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDY7CisgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMywgMCk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZJbnZpdGF0aW9uRmxhZ3ModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVkludml0YXRpb25GbGFncyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcFRsdkxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICs9IDQ7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcEJ1ZiA9IDE4OworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICpwQnVmID0gcFNyYy0+aW52aXRhdGlvbkZsYWdzOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDMsIDApOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2SW52aXRhdGlvbkZsYWdzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2TGlzdGVuQ2hhbm5lbCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVkxpc3RlbkNoYW5uZWwgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSA4OworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBCdWYgPSA2OworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+Y291bnRyeVN0cmluZywgMyk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDM7CisgICAgICAgIHBCdWYgKz0gMzsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5yZWd1bGF0b3J5Q2xhc3M7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5jaGFubmVsOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDMsIDApOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2TGlzdGVuQ2hhbm5lbC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1Rsdk1hbnVmYWN0dXJlcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWTWFudWZhY3R1cmVyICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gKCBwU3JjLT5udW1fbmFtZSArIDQpIDsKKworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDQxMjksIDEpOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+bmFtZSApLCBwU3JjLT5udW1fbmFtZSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9uYW1lOworICAgICAgICBwQnVmICs9IHBTcmMtPm51bV9uYW1lOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1Rsdk1hbnVmYWN0dXJlci4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1Rsdk1pbm9yUmVhc29uQ29kZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWTWlub3JSZWFzb25Db2RlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gNDsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwQnVmID0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOyAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPm1pbm9yUmVhc29uQ29kZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1Rsdk1pbm9yUmVhc29uQ29kZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1Rsdk1vZGVsTmFtZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWTW9kZWxOYW1lICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gKCBwU3JjLT5udW1fdGV4dCArIDQpIDsKKworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDQxMzEsIDEpOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+dGV4dCApLCBwU3JjLT5udW1fdGV4dCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV90ZXh0OworICAgICAgICBwQnVmICs9IHBTcmMtPm51bV90ZXh0OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1Rsdk1vZGVsTmFtZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1Rsdk1vZGVsTnVtYmVyKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVk1vZGVsTnVtYmVyICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gKCBwU3JjLT5udW1fdGV4dCArIDQpIDsKKworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDQxMzIsIDEpOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+dGV4dCApLCBwU3JjLT5udW1fdGV4dCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV90ZXh0OworICAgICAgICBwQnVmICs9IHBTcmMtPm51bV90ZXh0OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1Rsdk1vZGVsTnVtYmVyLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2Tm90aWNlT2ZBYnNlbmNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZOb3RpY2VPZkFic2VuY2UgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSAoIHBTcmMtPm51bV9Ob0FEZXNjICsgNSkgOworCisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcEJ1ZiA9IDEyOworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICpwQnVmID0gcFNyYy0+aW5kZXg7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5DVFNXaW5kb3dPcHBQUzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPk5vQURlc2MgKSwgcFNyYy0+bnVtX05vQURlc2MpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fTm9BRGVzYzsKKyAgICAgICAgcEJ1ZiArPSBwU3JjLT5udW1fTm9BRGVzYzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMywgMCk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZOb3RpY2VPZkFic2VuY2UuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZPcGVyYXRpbmdDaGFubmVsKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWT3BlcmF0aW5nQ2hhbm5lbCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcFRsdkxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICs9IDg7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcEJ1ZiA9IDE3OworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+Y291bnRyeVN0cmluZywgMyk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDM7CisgICAgICAgIHBCdWYgKz0gMzsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5yZWd1bGF0b3J5Q2xhc3M7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5jaGFubmVsOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDMsIDApOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2T3BlcmF0aW5nQ2hhbm5lbC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlAyUENhcGFiaWxpdHkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZQMlBDYXBhYmlsaXR5ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gNTsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwQnVmID0gMjsKKyAgICAgICAgcEJ1ZiArPSAxOyAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmRldmljZUNhcGFiaWxpdHk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5ncm91cENhcGFiaWxpdHk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMywgMCk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZQMlBDYXBhYmlsaXR5LiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2UDJQRGV2aWNlSWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWUDJQRGV2aWNlSWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSA5OworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBCdWYgPSAzOworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+UDJQRGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDY7CisgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMywgMCk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZQMlBEZXZpY2VJZC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlAyUERldmljZUluZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTMyIGlkeCA9IDA7CisgICAgbk5lZWRlZCArPSAxOTsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwQnVmID0gMTM7CisgICAgICAgIHBCdWYgKz0gMTsgbkJ1ZiAtPSAxOyAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyBuQnVmIC09IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+UDJQRGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDY7CisgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y29uZmlnTWV0aG9kLCAxKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPnByaW1hcnlEZXZpY2VUeXBlLCA4KTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gODsKKyAgICAgICAgcEJ1ZiArPSA4OworICAgICAgICBzdGF0dXMgfD0gUGFja1RsdkNvcmUocEN0eCwKKyAgICAgICAgICAodEFOSV9VOCopcFNyYywKKyAgICAgICAgICBwQnVmLAorICAgICAgICAgIG5CdWYsCisgICAgICAgICAgcG5Db25zdW1lZCwKKyAgICAgICAgICBUTFZTX1AyUERldmljZUluZm8sICZpZHgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZQMlBEZXZpY2VJbmZvLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2UDJQR3JvdXBCc3NpZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVlAyUEdyb3VwQnNzaWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSA5OworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgKnBCdWYgPSA3OworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+UDJQR3JvdXBCc3NpZCwgNik7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDY7CisgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMywgMCk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZQMlBHcm91cEJzc2lkLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2UDJQR3JvdXBJZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVlAyUEdyb3VwSWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSAoIHBTcmMtPm51bV9zc2lkICsgOSkgOworCisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICAqcEJ1ZiA9IDE1OworICAgICAgICBwQnVmICs9IDE7ICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+ZGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDY7CisgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT5zc2lkICksIHBTcmMtPm51bV9zc2lkKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3NzaWQ7CisgICAgICAgIHBCdWYgKz0gcFNyYy0+bnVtX3NzaWQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDMsIDApOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2UDJQR3JvdXBJZC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlAyUEdyb3VwSW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWUDJQR3JvdXBJbmZvICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gKCBwU3JjLT5udW1fUDJQQ2xpZW50SW5mb0Rlc2MgKyAzKSA7CisKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwQnVmID0gMTQ7CisgICAgICAgIHBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT5QMlBDbGllbnRJbmZvRGVzYyApLCBwU3JjLT5udW1fUDJQQ2xpZW50SW5mb0Rlc2MpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fUDJQQ2xpZW50SW5mb0Rlc2M7CisgICAgICAgIHBCdWYgKz0gcFNyYy0+bnVtX1AyUENsaWVudEluZm9EZXNjOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1RsdlAyUEdyb3VwSW5mby4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlAyUFN0YXR1cyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWUDJQU3RhdHVzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gNDsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwQnVmID0gMDsKKyAgICAgICAgcEJ1ZiArPSAxOyAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnN0YXR1czsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1RsdlAyUFN0YXR1cy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlByaW1hcnlEZXZpY2VUeXBlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVlByaW1hcnlEZXZpY2VUeXBlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gMTI7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNDE4MCwgMSk7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+cHJpbWFyeV9jYXRlZ29yeSwgMSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5vdWksIDQpOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnN1Yl9jYXRlZ29yeSwgMSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZQcmltYXJ5RGV2aWNlVHlwZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlJGQmFuZHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZSRkJhbmRzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gNTsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA0MTU2LCAxKTsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmJhbmRzOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2UkZCYW5kcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlJlcXVlc3REZXZpY2VUeXBlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVlJlcXVlc3REZXZpY2VUeXBlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gMTI7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNDIwMiwgMSk7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+cHJpbWFyeV9jYXRlZ29yeSwgMSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5vdWksIDQpOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnN1Yl9jYXRlZ29yeSwgMSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZSZXF1ZXN0RGV2aWNlVHlwZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlJlcXVlc3RUeXBlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVlJlcXVlc3RUeXBlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gNTsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA0MTU0LCAxKTsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJlcVR5cGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZSZXF1ZXN0VHlwZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlJlc3BvbnNlVHlwZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWUmVzcG9uc2VUeXBlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gNTsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA0MTU1LCAxKTsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJlc1R5cGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZSZXNwb25zZVR5cGUuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tUbHZTZWxlY3RlZFJlZ2lzdHJhcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhciAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcFRsdkxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICs9IDU7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNDE2MSwgMSk7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5zZWxlY3RlZDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSA0LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1RsdlNlbGVjdGVkUmVnaXN0cmFyLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSA2OworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDQxNzksIDEpOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm1ldGhvZHMsIDEpOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2U2VyaWFsTnVtYmVyKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZTZXJpYWxOdW1iZXIgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSAoIHBTcmMtPm51bV90ZXh0ICsgNCkgOworCisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNDE2MiwgMSk7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT50ZXh0ICksIHBTcmMtPm51bV90ZXh0KTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3RleHQ7CisgICAgICAgIHBCdWYgKz0gcFNyYy0+bnVtX3RleHQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2U2VyaWFsTnVtYmVyLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2VVVJRF9FKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZVVUlEX0UgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSAyMDsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA0MTY3LCAxKTsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPnV1aWQsIDE2KTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTY7CisgICAgICAgIHBCdWYgKz0gMTY7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2VVVJRF9FLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2VVVJRF9SKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZVVUlEX1IgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSAyMDsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA0MTY4LCAxKTsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPnV1aWQsIDE2KTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTY7CisgICAgICAgIHBCdWYgKz0gMTY7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDQsIDEpOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2VVVJRF9SLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2VmVuZG9yRXh0ZW5zaW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZWZW5kb3JFeHRlbnNpb24gKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VMzIgaWR4ID0gMDsKKyAgICBuTmVlZGVkICs9IDc7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcEJ1ZiwgNDE2OSwgMSk7CisgICAgICAgIHBCdWYgKz0gMjsgbkJ1ZiAtPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyBuQnVmIC09IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+dmVuZG9ySWQsIDMpOworICAgICAgICAqcG5Db25zdW1lZCArPSAzOworICAgICAgICBwQnVmICs9IDM7CisgICAgICAgIHN0YXR1cyB8PSBQYWNrVGx2Q29yZShwQ3R4LAorICAgICAgICAgICh0QU5JX1U4KilwU3JjLAorICAgICAgICAgIHBCdWYsCisgICAgICAgICAgbkJ1ZiwKKyAgICAgICAgICBwbkNvbnN1bWVkLAorICAgICAgICAgIFRMVlNfVmVuZG9yRXh0ZW5zaW9uLCAmaWR4KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2VmVuZG9yRXh0ZW5zaW9uLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2VmVyc2lvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZlRMVlZlcnNpb24gKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VOCB0bXA3OV9fOworICAgIG5OZWVkZWQgKz0gNTsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwQnVmLCA0MTcwLCAxKTsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwVGx2TGVuID0gcEJ1ZjsKKyAgICAgICAgcEJ1ZiArPSAyOyAqcG5Db25zdW1lZCArPSAyOworICAgICAgICB0bXA3OV9fID0gMFU7CisgICAgICAgIHRtcDc5X18gfD0gKCBwU3JjLT5taW5vciA8PCAwICk7CisgICAgICAgIHRtcDc5X18gfD0gKCBwU3JjLT5tYWpvciA8PCA0ICk7CisgICAgICAgICpwQnVmID0gdG1wNzlfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZWZXJzaW9uLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVGx2V1BTU3RhdGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWV1BTU3RhdGUgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBUbHZMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCArPSA1OworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBCdWYsIDQxNjQsIDEpOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBUbHZMZW4gPSBwQnVmOworICAgICAgICBwQnVmICs9IDI7ICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICpwQnVmID0gcFNyYy0+c3RhdGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBUbHZMZW4pCisgICAgeworICAgICAgICBmcmFtZXNodG9ucyggcEN0eCwgcFRsdkxlbiwgKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gNCwgMSk7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tUbHZXUFNTdGF0ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlAyUEludGVyZmFjZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmVExWUDJQSW50ZXJmYWNlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gOTsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwQnVmID0gMTY7CisgICAgICAgIHBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5QMlBEZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNjsKKyAgICAgICAgcEJ1ZiArPSA2OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFRsdkxlbikKKyAgICB7CisgICAgICAgIGZyYW1lc2h0b25zKCBwQ3R4LCBwVGx2TGVuLCAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAzLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja1RsdlAyUEludGVyZmFjZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1RsdlAyUE1hbmFnZWFiaWxpdHkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZUTFZQMlBNYW5hZ2VhYmlsaXR5ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwVGx2TGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgKz0gNDsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgICpwQnVmID0gMTA7CisgICAgICAgIHBCdWYgKz0gMTsgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcFRsdkxlbiA9IHBCdWY7CisgICAgICAgIHBCdWYgKz0gMjsgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5tYW5hZ2VhYmlsaXR5OworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwVGx2TGVuKQorICAgIHsKKyAgICAgICAgZnJhbWVzaHRvbnMoIHBDdHgsIHBUbHZMZW4sICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDMsIDApOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrVGx2UDJQTWFuYWdlYWJpbGl0eS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llQVBOYW1lKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFQVBOYW1lICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9uYW1lOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPm5hbWUgKSwgcFNyYy0+bnVtX25hbWUpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fbmFtZTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llQVBOYW1lLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVCUEluZGljYXRvcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFQlBJbmRpY2F0b3IgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAyOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmluZGljYXRvcjsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnR5cGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZUJQSW5kaWNhdG9yLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVDb25kZW5zZWRDb3VudHJ5U3RyKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAyOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmNvdW50cnlTdHIsIDIpOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVDb25kZW5zZWRDb3VudHJ5U3RyLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVHVEsodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVHVEsgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICB0QU5JX1UxNiB0bXA4MF9fOworICAgIG5OZWVkZWQgICs9ICAocFNyYy0+bnVtX2tleSArIDExKTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgdG1wODBfXyA9IDBVOworICAgICAgICB0bXA4MF9fIHw9ICggcFNyYy0+a2V5SWQgPDwgMCApOworICAgICAgICB0bXA4MF9fIHw9ICggcFNyYy0+cmVzZXJ2ZWQgPDwgMiApOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXA4MF9fLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09ICAyIDsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5rZXlMZW5ndGg7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5SU0MsIDgpOworICAgICAgICAqcG5Db25zdW1lZCArPSA4OworICAgICAgICBwQnVmICs9IDg7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+a2V5ICksIHBTcmMtPm51bV9rZXkpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fa2V5OworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVHVEsuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUhDRih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUhDRiAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDE7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+ZW5hYmxlZDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llSENGLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVMTEF0dHIodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVMTEF0dHIgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSA0OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gOTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5kZWZlcl90aHJlc2hvbGQsIDEpOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVMTEF0dHIuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUxvYWRCYWxhbmNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVMb2FkQmFsYW5jZSAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDc7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA4OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+YnNzaWQsIDYpOworICAgICAgICAqcG5Db25zdW1lZCArPSA2OworICAgICAgICBwQnVmICs9IDY7CisgICAgICAgICpwQnVmID0gcFNyYy0+Y2hhbm5lbDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llTG9hZEJhbGFuY2UuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUxvYWRJbmZvKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVMb2FkSW5mbyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDQ7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA2OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm51bV9zdGFzLCAxKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jaGFubmVsX3V0aWwsIDEpOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVMb2FkSW5mby4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUHJvcEFzc29jVHlwZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQcm9wQXNzb2NUeXBlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDc7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT50eXBlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVQcm9wQXNzb2NUeXBlLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQcm9wQ2FwYWJpbGl0eSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUHJvcENhcGFiaWxpdHkgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAyOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+Y2FwYWJpbGl0eSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVByb3BDYXBhYmlsaXR5LiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQcm9wQ2hhbm5Td2l0Y2hBbm4odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQcm9wQ2hhbm5Td2l0Y2hBbm4gKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSA0OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTU7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5tb2RlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+cHJpbWFyeV9jaGFubmVsOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+c3ViX2JhbmQ7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5jaGFubmVsX3N3aXRjaF9jb3VudDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llUHJvcENoYW5uU3dpdGNoQW5uLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQcm9wRURDQVBhcmFtcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUHJvcEVEQ0FQYXJhbXMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICB0QU5JX1U4IHRtcDgxX187CisgICAgdEFOSV9VOCB0bXA4Ml9fOworICAgIHRBTklfVTggdG1wODNfXzsKKyAgICB0QU5JX1U4IHRtcDg0X187CisgICAgdEFOSV9VOCB0bXA4NV9fOworICAgIHRBTklfVTggdG1wODZfXzsKKyAgICB0QU5JX1U4IHRtcDg3X187CisgICAgdEFOSV9VOCB0bXA4OF9fOworICAgIG5OZWVkZWQgICs9IDE4OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5xb3M7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXNlcnZlZDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICB0bXA4MV9fID0gMFU7CisgICAgICAgIHRtcDgxX18gfD0gKCBwU3JjLT5hY2JlX2FpZnNuIDw8IDAgKTsKKyAgICAgICAgdG1wODFfXyB8PSAoIHBTcmMtPmFjYmVfYWNtIDw8IDQgKTsKKyAgICAgICAgdG1wODFfXyB8PSAoIHBTcmMtPmFjYmVfYWNpIDw8IDUgKTsKKyAgICAgICAgdG1wODFfXyB8PSAoIHBTcmMtPnVudXNlZDEgPDwgNyApOworICAgICAgICAqcEJ1ZiA9IHRtcDgxX187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIHRtcDgyX18gPSAwVTsKKyAgICAgICAgdG1wODJfXyB8PSAoIHBTcmMtPmFjYmVfbWluIDw8IDAgKTsKKyAgICAgICAgdG1wODJfXyB8PSAoIHBTcmMtPmFjYmVfbWF4IDw8IDQgKTsKKyAgICAgICAgKnBCdWYgPSB0bXA4Ml9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hY2JlX3R4b3BsaW1pdCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgdG1wODNfXyA9IDBVOworICAgICAgICB0bXA4M19fIHw9ICggcFNyYy0+YWNia19haWZzbiA8PCAwICk7CisgICAgICAgIHRtcDgzX18gfD0gKCBwU3JjLT5hY2JrX2FjbSA8PCA0ICk7CisgICAgICAgIHRtcDgzX18gfD0gKCBwU3JjLT5hY2JrX2FjaSA8PCA1ICk7CisgICAgICAgIHRtcDgzX18gfD0gKCBwU3JjLT51bnVzZWQyIDw8IDcgKTsKKyAgICAgICAgKnBCdWYgPSB0bXA4M19fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICB0bXA4NF9fID0gMFU7CisgICAgICAgIHRtcDg0X18gfD0gKCBwU3JjLT5hY2JrX21pbiA8PCAwICk7CisgICAgICAgIHRtcDg0X18gfD0gKCBwU3JjLT5hY2JrX21heCA8PCA0ICk7CisgICAgICAgICpwQnVmID0gdG1wODRfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YWNia190eG9wbGltaXQsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIHRtcDg1X18gPSAwVTsKKyAgICAgICAgdG1wODVfXyB8PSAoIHBTcmMtPmFjdmlfYWlmc24gPDwgMCApOworICAgICAgICB0bXA4NV9fIHw9ICggcFNyYy0+YWN2aV9hY20gPDwgNCApOworICAgICAgICB0bXA4NV9fIHw9ICggcFNyYy0+YWN2aV9hY2kgPDwgNSApOworICAgICAgICB0bXA4NV9fIHw9ICggcFNyYy0+dW51c2VkMyA8PCA3ICk7CisgICAgICAgICpwQnVmID0gdG1wODVfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgdG1wODZfXyA9IDBVOworICAgICAgICB0bXA4Nl9fIHw9ICggcFNyYy0+YWN2aV9taW4gPDwgMCApOworICAgICAgICB0bXA4Nl9fIHw9ICggcFNyYy0+YWN2aV9tYXggPDwgNCApOworICAgICAgICAqcEJ1ZiA9IHRtcDg2X187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmFjdmlfdHhvcGxpbWl0LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICB0bXA4N19fID0gMFU7CisgICAgICAgIHRtcDg3X18gfD0gKCBwU3JjLT5hY3ZvX2FpZnNuIDw8IDAgKTsKKyAgICAgICAgdG1wODdfXyB8PSAoIHBTcmMtPmFjdm9fYWNtIDw8IDQgKTsKKyAgICAgICAgdG1wODdfXyB8PSAoIHBTcmMtPmFjdm9fYWNpIDw8IDUgKTsKKyAgICAgICAgdG1wODdfXyB8PSAoIHBTcmMtPnVudXNlZDQgPDwgNyApOworICAgICAgICAqcEJ1ZiA9IHRtcDg3X187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIHRtcDg4X18gPSAwVTsKKyAgICAgICAgdG1wODhfXyB8PSAoIHBTcmMtPmFjdm9fbWluIDw8IDAgKTsKKyAgICAgICAgdG1wODhfXyB8PSAoIHBTcmMtPmFjdm9fbWF4IDw8IDQgKTsKKyAgICAgICAgKnBCdWYgPSB0bXA4OF9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hY3ZvX3R4b3BsaW1pdCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVByb3BFRENBUGFyYW1zLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQcm9wUXVpZXRCU1ModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQcm9wUXVpZXRCU1MgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSA2OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5xdWlldF9jb3VudDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnF1aWV0X3BlcmlvZDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5xdWlldF9kdXJhdGlvbiwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+cXVpZXRfb2Zmc2V0LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llUHJvcFF1aWV0QlNTLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQcm9wU3VwcFJhdGVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVByb3BTdXBwUmF0ZXMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAgcFNyYy0+bnVtX3JhdGVzOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPnJhdGVzICksIHBTcmMtPm51bV9yYXRlcyk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9yYXRlczsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llUHJvcFN1cHBSYXRlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUjBLSF9JRCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVSMEtIX0lEICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9QTUtfUjBfSUQ7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAzOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+UE1LX1IwX0lEICksIHBTcmMtPm51bV9QTUtfUjBfSUQpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fUE1LX1IwX0lEOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVSMEtIX0lELiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVSMUtIX0lEKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVIxS0hfSUQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSA2OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPlBNS19SMV9JRCwgNik7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDY7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVIxS0hfSUQuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVRTRkluZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFVFNGSW5mbyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDQ7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPlRzZk9mZnNldCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+QmVhY29uSW50dmwsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVUU0ZJbmZvLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVUYXVydXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUYXVydXMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICB0QU5JX1UxNiB0bXA4OV9fOworICAgIG5OZWVkZWQgICs9IDY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAxODsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5iYVRJREJpdG1hcCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YmFQb2xpY3ksIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIHRtcDg5X18gPSAwVTsKKyAgICAgICAgdG1wODlfXyB8PSAoIHBTcmMtPmJhQnVmZmVyU2l6ZSA8PCAwICk7CisgICAgICAgIHRtcDg5X18gfD0gKCBwU3JjLT5yc3ZkIDw8IDEyICk7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDg5X18sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnICA9IDEgCisgICAgICAgIG5CdWYgLT0gIDIgOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVRhdXJ1cy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llVGl0YW4odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVRpdGFuICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gNDsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDE0OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+Y29uY2F0X3RjaWRfYml0bWFwOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+Y29tcHJlc3Npb25fdGNpZF9iaXRtYXA7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5jYl9zdGF0ZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJldl9mY3Nfc3RhdGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVRpdGFuLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVUcmlnZ2VyU3RhQmdTY2FuKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVRyaWdnZXJTdGFCZ1NjYW4gKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAxOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTc7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5lbmFibGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVRyaWdnZXJTdGFCZ1NjYW4uICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVZlcnNpb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFVmVyc2lvbiAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9ICAocFNyYy0+bnVtX2J1aWxkX3ZlcnNpb24gKyA1KTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDExOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmNoaXBfcmV2LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmNhcmRfdHlwZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPmJ1aWxkX3ZlcnNpb24gKSwgcFNyYy0+bnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fYnVpbGRfdmVyc2lvbjsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llVmVyc2lvbi4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV0RTKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV0RTICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIHBTcmMtPm51bV93ZHNEYXRhOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMzsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPndkc0RhdGEgKSwgcFNyYy0+bnVtX3dkc0RhdGEpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fd2RzRGF0YTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llV0RTLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVBUENoYW5uZWxSZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAgKHBTcmMtPm51bV9jaGFubmVsTGlzdCArIDEpOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNTE7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5yZWd1bGF0b3J5Q2xhc3M7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT5jaGFubmVsTGlzdCApLCBwU3JjLT5udW1fY2hhbm5lbExpc3QpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fY2hhbm5lbExpc3Q7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZUFQQ2hhbm5lbFJlcG9ydC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llQmNuUmVwb3J0aW5nRGV0YWlsKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFQmNuUmVwb3J0aW5nRGV0YWlsICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXBvcnRpbmdEZXRhaWw7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZUJjblJlcG9ydGluZ0RldGFpbC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llQmVhY29uUmVwb3J0RnJtQm9keSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVCZWFjb25SZXBvcnRGcm1Cb2R5ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9yZXBvcnRlZEZpZWxkczsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDE7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT5yZXBvcnRlZEZpZWxkcyApLCBwU3JjLT5udW1fcmVwb3J0ZWRGaWVsZHMpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fcmVwb3J0ZWRGaWVsZHM7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZUJlYWNvblJlcG9ydEZybUJvZHkuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUJlYWNvblJlcG9ydGluZyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUJlYWNvblJlcG9ydGluZyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDI7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+cmVwb3J0aW5nQ29uZGl0aW9uOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+dGhyZXNob2xkOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVCZWFjb25SZXBvcnRpbmcuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZU1lYXN1cmVtZW50UGlsb3QodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFTWVhc3VyZW1lbnRQaWxvdCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9ICAocFNyYy0+bnVtX3ZlbmRvclNwZWNpZmljICsgMSk7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA2NjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPm1lYXN1cmVtZW50UGlsb3Q7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT52ZW5kb3JTcGVjaWZpYyApLCBwU3JjLT5udW1fdmVuZG9yU3BlY2lmaWMpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fdmVuZG9yU3BlY2lmaWM7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZU1lYXN1cmVtZW50UGlsb3QuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZU11bHRpQnNzaWQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFTXVsdGlCc3NpZCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9ICAocFNyYy0+bnVtX3ZlbmRvclNwZWNpZmljICsgMSk7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA3MTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPm1heEJTU0lESW5kaWNhdG9yOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+dmVuZG9yU3BlY2lmaWMgKSwgcFNyYy0+bnVtX3ZlbmRvclNwZWNpZmljKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3ZlbmRvclNwZWNpZmljOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVNdWx0aUJzc2lkLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVSSUNEYXRhKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVJJQ0RhdGEgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSA0OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNTc7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5JZGVudGlmaWVyOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+cmVzb3VyY2VEZXNjQ291bnQ7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+c3RhdHVzQ29kZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVJJQ0RhdGEuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVJJQ0Rlc2NyaXB0b3IodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUklDRGVzY3JpcHRvciAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9ICAocFNyYy0+bnVtX3ZhcmlhYmxlRGF0YSArIDEpOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNzU7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXNvdXJjZVR5cGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT52YXJpYWJsZURhdGEgKSwgcFNyYy0+bnVtX3ZhcmlhYmxlRGF0YSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV92YXJpYWJsZURhdGE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVJJQ0Rlc2NyaXB0b3IuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVJSTUVuYWJsZWRDYXAodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUlJNRW5hYmxlZENhcCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTggdG1wOTBfXzsKKyAgICB0QU5JX1U4IHRtcDkxX187CisgICAgdEFOSV9VOCB0bXA5Ml9fOworICAgIHRBTklfVTggdG1wOTNfXzsKKyAgICB0QU5JX1U4IHRtcDk0X187CisgICAgbk5lZWRlZCAgKz0gNTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDcwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHRtcDkwX18gPSAwVTsKKyAgICAgICAgdG1wOTBfXyB8PSAoIHBTcmMtPkxpbmtNZWFzdXJlbWVudCA8PCAwICk7CisgICAgICAgIHRtcDkwX18gfD0gKCBwU3JjLT5OZWlnaGJvclJwdCA8PCAxICk7CisgICAgICAgIHRtcDkwX18gfD0gKCBwU3JjLT5wYXJhbGxlbCA8PCAyICk7CisgICAgICAgIHRtcDkwX18gfD0gKCBwU3JjLT5yZXBlYXRlZCA8PCAzICk7CisgICAgICAgIHRtcDkwX18gfD0gKCBwU3JjLT5CZWFjb25QYXNzaXZlIDw8IDQgKTsKKyAgICAgICAgdG1wOTBfXyB8PSAoIHBTcmMtPkJlYWNvbkFjdGl2ZSA8PCA1ICk7CisgICAgICAgIHRtcDkwX18gfD0gKCBwU3JjLT5CZWFjb25UYWJsZSA8PCA2ICk7CisgICAgICAgIHRtcDkwX18gfD0gKCBwU3JjLT5CZWFjb25SZXBDb25kIDw8IDcgKTsKKyAgICAgICAgKnBCdWYgPSB0bXA5MF9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICB0bXA5MV9fID0gMFU7CisgICAgICAgIHRtcDkxX18gfD0gKCBwU3JjLT5GcmFtZU1lYXN1cmVtZW50IDw8IDAgKTsKKyAgICAgICAgdG1wOTFfXyB8PSAoIHBTcmMtPkNoYW5uZWxMb2FkIDw8IDEgKTsKKyAgICAgICAgdG1wOTFfXyB8PSAoIHBTcmMtPk5vaXNlSGlzdG9ncmFtIDw8IDIgKTsKKyAgICAgICAgdG1wOTFfXyB8PSAoIHBTcmMtPnN0YXRpc3RpY3MgPDwgMyApOworICAgICAgICB0bXA5MV9fIHw9ICggcFNyYy0+TENJTWVhc3VyZW1lbnQgPDwgNCApOworICAgICAgICB0bXA5MV9fIHw9ICggcFNyYy0+TENJQXppbXV0aCA8PCA1ICk7CisgICAgICAgIHRtcDkxX18gfD0gKCBwU3JjLT5UQ01DYXBhYmlsaXR5IDw8IDYgKTsKKyAgICAgICAgdG1wOTFfXyB8PSAoIHBTcmMtPnRyaWdnZXJlZFRDTSA8PCA3ICk7CisgICAgICAgICpwQnVmID0gdG1wOTFfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgdG1wOTJfXyA9IDBVOworICAgICAgICB0bXA5Ml9fIHw9ICggcFNyYy0+QVBDaGFuUmVwb3J0IDw8IDAgKTsKKyAgICAgICAgdG1wOTJfXyB8PSAoIHBTcmMtPlJSTU1JQkVuYWJsZWQgPDwgMSApOworICAgICAgICB0bXA5Ml9fIHw9ICggcFNyYy0+b3BlcmF0aW5nQ2hhbk1heCA8PCAyICk7CisgICAgICAgIHRtcDkyX18gfD0gKCBwU3JjLT5ub25PcGVyYXRpbkNoYW5NYXggPDwgNSApOworICAgICAgICAqcEJ1ZiA9IHRtcDkyX187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIHRtcDkzX18gPSAwVTsKKyAgICAgICAgdG1wOTNfXyB8PSAoIHBTcmMtPk1lYXN1cmVtZW50UGlsb3QgPDwgMCApOworICAgICAgICB0bXA5M19fIHw9ICggcFNyYy0+TWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQgPDwgMyApOworICAgICAgICB0bXA5M19fIHw9ICggcFNyYy0+TmVpZ2hib3JUU0ZPZmZzZXQgPDwgNCApOworICAgICAgICB0bXA5M19fIHw9ICggcFNyYy0+UkNQSU1lYXN1cmVtZW50IDw8IDUgKTsKKyAgICAgICAgdG1wOTNfXyB8PSAoIHBTcmMtPlJTTklNZWFzdXJlbWVudCA8PCA2ICk7CisgICAgICAgIHRtcDkzX18gfD0gKCBwU3JjLT5Cc3NBdmdBY2Nlc3NEZWxheSA8PCA3ICk7CisgICAgICAgICpwQnVmID0gdG1wOTNfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgdG1wOTRfXyA9IDBVOworICAgICAgICB0bXA5NF9fIHw9ICggcFNyYy0+QlNTQXZhaWxBZG1pc3Npb24gPDwgMCApOworICAgICAgICB0bXA5NF9fIHw9ICggcFNyYy0+QW50ZW5uYUluZm9ybWF0aW9uIDw8IDEgKTsKKyAgICAgICAgdG1wOTRfXyB8PSAoIHBTcmMtPnJlc2VydmVkIDw8IDIgKTsKKyAgICAgICAgKnBCdWYgPSB0bXA5NF9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnICA9IDEgCisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVJSTUVuYWJsZWRDYXAuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVJlcXVlc3RlZEluZm8odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUmVxdWVzdGVkSW5mbyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9ICBwU3JjLT5udW1fcmVxdWVzdGVkX2VpZHM7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAxMDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPnJlcXVlc3RlZF9laWRzICksIHBTcmMtPm51bV9yZXF1ZXN0ZWRfZWlkcyk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9yZXF1ZXN0ZWRfZWlkczsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llUmVxdWVzdGVkSW5mby4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llU1NJRCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTU0lEICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9zc2lkOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPnNzaWQgKSwgcFNyYy0+bnVtX3NzaWQpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fc3NpZDsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llU1NJRC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llU2NoZWR1bGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVNjaGVkdWxlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VMTYgdG1wOTVfXzsKKyAgICBuTmVlZGVkICArPSAxNDsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDE1OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHRtcDk1X18gPSAwVTsKKyAgICAgICAgdG1wOTVfXyB8PSAoIHBTcmMtPmFnZ3JlZ2F0aW9uIDw8IDAgKTsKKyAgICAgICAgdG1wOTVfXyB8PSAoIHBTcmMtPnRzaWQgPDwgMSApOworICAgICAgICB0bXA5NV9fIHw9ICggcFNyYy0+ZGlyZWN0aW9uIDw8IDUgKTsKKyAgICAgICAgdG1wOTVfXyB8PSAoIHBTcmMtPnJlc2VydmVkIDw8IDcgKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgdG1wOTVfXywgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAgMiA7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPnNlcnZpY2Vfc3RhcnRfdGltZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+c2VydmljZV9pbnRlcnZhbCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bWF4X3NlcnZpY2VfZHVyLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5zcGVjX2ludGVydmFsLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llU2NoZWR1bGUuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVRDTEFTKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUQ0xBUyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFVENMQVMocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAxNDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnVzZXJfcHJpb3JpdHk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5jbGFzc2lmaWVyX3R5cGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5jbGFzc2lmaWVyX21hc2s7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgc3dpdGNoIChwU3JjLT5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgNik7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gNjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDY7CisgICAgICAgICAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA2OworICAgICAgICAgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLkV0aFBhcmFtcy50eXBlLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5pbmZvLklwUGFyYW1zLnZlcnNpb247CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwU3JjLT5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bzsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc291cmNlLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5QYXJhbXM4MDIxZHEudGFnX3R5cGUsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVUQ0xBUy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llVENMQVNTUFJPQyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUQ0xBU1NQUk9DICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDQ0OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+cHJvY2Vzc2luZzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llVENMQVNTUFJPQy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llVFNEZWxheSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUU0RlbGF5ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gNDsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDQzOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmRlbGF5LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llVFNEZWxheS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llVFNQRUModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVRTUEVDICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VMTYgdG1wOTZfXzsKKyAgICB0QU5JX1U4IHRtcDk3X187CisgICAgdEFOSV9VMTYgdG1wOThfXzsKKyAgICBuTmVlZGVkICArPSA1NTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDEzOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHRtcDk2X18gPSAwVTsKKyAgICAgICAgdG1wOTZfXyB8PSAoIHBTcmMtPnRyYWZmaWNfdHlwZSA8PCAwICk7CisgICAgICAgIHRtcDk2X18gfD0gKCBwU3JjLT50c2lkIDw8IDEgKTsKKyAgICAgICAgdG1wOTZfXyB8PSAoIHBTcmMtPmRpcmVjdGlvbiA8PCA1ICk7CisgICAgICAgIHRtcDk2X18gfD0gKCBwU3JjLT5hY2Nlc3NfcG9saWN5IDw8IDcgKTsKKyAgICAgICAgdG1wOTZfXyB8PSAoIHBTcmMtPmFnZ3JlZ2F0aW9uIDw8IDkgKTsKKyAgICAgICAgdG1wOTZfXyB8PSAoIHBTcmMtPnBzYiA8PCAxMCApOworICAgICAgICB0bXA5Nl9fIHw9ICggcFNyYy0+dXNlcl9wcmlvcml0eSA8PCAxMSApOworICAgICAgICB0bXA5Nl9fIHw9ICggcFNyYy0+dHNpbmZvX2Fja19wb2wgPDwgMTQgKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgdG1wOTZfXywgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAgMiA7CisgICAgICAgIHRtcDk3X18gPSAwVTsKKyAgICAgICAgdG1wOTdfXyB8PSAoIHBTcmMtPnNjaGVkdWxlIDw8IDAgKTsKKyAgICAgICAgdG1wOTdfXyB8PSAoIHBTcmMtPnVudXNlZCA8PCAxICk7CisgICAgICAgICpwQnVmID0gdG1wOTdfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgdG1wOThfXyA9IDBVOworICAgICAgICB0bXA5OF9fIHw9ICggcFNyYy0+c2l6ZSA8PCAwICk7CisgICAgICAgIHRtcDk4X18gfD0gKCBwU3JjLT5maXhlZCA8PCAxNSApOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXA5OF9fLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09ICAyIDsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bWF4X21zZHVfc2l6ZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+bWluX3NlcnZpY2VfaW50LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5tYXhfc2VydmljZV9pbnQsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmluYWN0aXZpdHlfaW50LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5zdXNwZW5zaW9uX2ludCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+c2VydmljZV9zdGFydF90aW1lLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5taW5fZGF0YV9yYXRlLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5tZWFuX2RhdGFfcmF0ZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+cGVha19kYXRhX3JhdGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmJ1cnN0X3NpemUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmRlbGF5X2JvdW5kLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5taW5fcGh5X3JhdGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnN1cnBsdXNfYndfYWxsb3dhbmNlLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tZWRpdW1fdGltZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVRTUEVDLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXTU1TY2hlZHVsZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NU2NoZWR1bGUgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICB0QU5JX1UxNiB0bXA5OV9fOworICAgIG5OZWVkZWQgICs9IDE1OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweGYyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4OTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+dmVyc2lvbjsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICB0bXA5OV9fID0gMFU7CisgICAgICAgIHRtcDk5X18gfD0gKCBwU3JjLT5hZ2dyZWdhdGlvbiA8PCAwICk7CisgICAgICAgIHRtcDk5X18gfD0gKCBwU3JjLT50c2lkIDw8IDEgKTsKKyAgICAgICAgdG1wOTlfXyB8PSAoIHBTcmMtPmRpcmVjdGlvbiA8PCA1ICk7CisgICAgICAgIHRtcDk5X18gfD0gKCBwU3JjLT5yZXNlcnZlZCA8PCA3ICk7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDk5X18sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gIDIgOworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPnNlcnZpY2VfaW50ZXJ2YWwsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm1heF9zZXJ2aWNlX2R1ciwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+c3BlY19pbnRlcnZhbCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVdNTVNjaGVkdWxlLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXTU1UQ0xBUyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NVENMQVMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVdNTVRDTEFTKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweGYyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4NjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+dmVyc2lvbjsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnVzZXJfcHJpb3JpdHk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5jbGFzc2lmaWVyX3R5cGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5jbGFzc2lmaWVyX21hc2s7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgc3dpdGNoIChwU3JjLT5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgNik7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gNjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDY7CisgICAgICAgICAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA2OworICAgICAgICAgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5pbmZvLkV0aFBhcmFtcy50eXBlLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5pbmZvLklwUGFyYW1zLnZlcnNpb247CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwU3JjLT5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bzsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc291cmNlLCAxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdCwgMTApOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+aW5mby5QYXJhbXM4MDIxZHEudGFnX3R5cGUsIDApOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVXTU1UQ0xBUy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV01NVENMQVNQUk9DKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NVENMQVNQUk9DICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHhmMjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDc7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnZlcnNpb247CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5wcm9jZXNzaW5nOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVXTU1UQ0xBU1BST0MuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdNTVRTRGVsYXkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NVFNEZWxheSAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDU7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4ZjI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4MjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg4OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT52ZXJzaW9uOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPmRlbGF5LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llV01NVFNEZWxheS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV01NVFNQRUModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdNTVRTUEVDICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VMTYgdG1wMTAwX187CisgICAgdEFOSV9VOCB0bXAxMDFfXzsKKyAgICB0QU5JX1UxNiB0bXAxMDJfXzsKKyAgICBuTmVlZGVkICArPSAzODsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHhmMjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnZlcnNpb247CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgdG1wMTAwX18gPSAwVTsKKyAgICAgICAgdG1wMTAwX18gfD0gKCBwU3JjLT50cmFmZmljX3R5cGUgPDwgMCApOworICAgICAgICB0bXAxMDBfXyB8PSAoIHBTcmMtPnRzaWQgPDwgMSApOworICAgICAgICB0bXAxMDBfXyB8PSAoIHBTcmMtPmRpcmVjdGlvbiA8PCA1ICk7CisgICAgICAgIHRtcDEwMF9fIHw9ICggcFNyYy0+YWNjZXNzX3BvbGljeSA8PCA3ICk7CisgICAgICAgIHRtcDEwMF9fIHw9ICggcFNyYy0+YWdncmVnYXRpb24gPDwgOSApOworICAgICAgICB0bXAxMDBfXyB8PSAoIHBTcmMtPnBzYiA8PCAxMCApOworICAgICAgICB0bXAxMDBfXyB8PSAoIHBTcmMtPnVzZXJfcHJpb3JpdHkgPDwgMTEgKTsKKyAgICAgICAgdG1wMTAwX18gfD0gKCBwU3JjLT50c2luZm9fYWNrX3BvbCA8PCAxNCApOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXAxMDBfXywgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAgMiA7CisgICAgICAgIHRtcDEwMV9fID0gMFU7CisgICAgICAgIHRtcDEwMV9fIHw9ICggcFNyYy0+dHNpbmZvX3JzdmQgPDwgMCApOworICAgICAgICB0bXAxMDFfXyB8PSAoIHBTcmMtPmJ1cnN0X3NpemVfZGVmbiA8PCA3ICk7CisgICAgICAgICpwQnVmID0gdG1wMTAxX187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIHRtcDEwMl9fID0gMFU7CisgICAgICAgIHRtcDEwMl9fIHw9ICggcFNyYy0+c2l6ZSA8PCAwICk7CisgICAgICAgIHRtcDEwMl9fIHw9ICggcFNyYy0+Zml4ZWQgPDwgMTUgKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgdG1wMTAyX18sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gIDIgOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tYXhfbXNkdV9zaXplLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5taW5fc2VydmljZV9pbnQsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPm1heF9zZXJ2aWNlX2ludCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+aW5hY3Rpdml0eV9pbnQsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPnN1c3BlbnNpb25faW50LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPm1pbl9kYXRhX3JhdGUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPm1lYW5fZGF0YV9yYXRlLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT5wZWFrX2RhdGFfcmF0ZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+YnVyc3Rfc2l6ZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+ZGVsYXlfYm91bmQsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGZyYW1lc2h0b25sKHBDdHgsIHBCdWYsIHBTcmMtPm1pbl9waHlfcmF0ZSwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+c3VycGx1c19id19hbGxvd2FuY2UsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm1lZGl1bV90aW1lLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llV01NVFNQRUMuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUFpcmdvKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVBaXJnbyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFQWlyZ28ocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4YTsKKyAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweGY1OworICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LAorICAgICAgICAgICh0QU5JX1U4KilwU3JjLAorICAgICAgICAgIHBCdWYsCisgICAgICAgICAgbkJ1ZiwKKyAgICAgICAgICBwbkNvbnN1bWVkLAorICAgICAgICAgIEZGU19BaXJnbywKKyAgICAgICAgICBJRVNfQWlyZ28pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVBaXJnby4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llQ0NYQ2NrbU9wYXF1ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDQ1hDY2ttT3BhcXVlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9kYXRhOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTU2OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDQwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDk2OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPmRhdGEgKSwgcFNyYy0+bnVtX2RhdGEpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fZGF0YTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llQ0NYQ2NrbU9wYXF1ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llQ0NYUmFkTWdtdENhcCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDQ1hSYWRNZ210Q2FwICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VOCB0bXAxMDNfXzsKKyAgICBuTmVlZGVkICArPSAyOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDQwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDk2OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDE7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPm1nbXRfc3RhdGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgdG1wMTAzX18gPSAwVTsKKyAgICAgICAgdG1wMTAzX18gfD0gKCBwU3JjLT5tYnNzaWRfbWFzayA8PCAwICk7CisgICAgICAgIHRtcDEwM19fIHw9ICggcFNyYy0+cmVzZXJ2ZWQgPDwgMyApOworICAgICAgICAqcEJ1ZiA9IHRtcDEwM19fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnICA9IDEgCisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZUNDWFJhZE1nbXRDYXAuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUNDWFRyYWZTdHJtTWV0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDQ1hUcmFmU3RybU1ldCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDQ7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4NDA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4OTY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4NzsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+dHNpZDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnN0YXRlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPm1zbXRfaW50ZXJ2YWwsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVDQ1hUcmFmU3RybU1ldC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llQ0NYVHJhZlN0cm1SYXRlU2V0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFQ0NYVHJhZlN0cm1SYXRlU2V0ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIChwU3JjLT5udW1fdHNyYXRlcyArIDEpOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDQwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDk2OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDg7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnRzaWQ7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT50c3JhdGVzICksIHBTcmMtPm51bV90c3JhdGVzKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3RzcmF0ZXM7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZUNDWFRyYWZTdHJtUmF0ZVNldC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llQ0NYVHhtaXRQb3dlcih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDQ1hUeG1pdFBvd2VyICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDE1MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg0MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg5NjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5wb3dlcl9saW1pdDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJlc2VydmVkOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVDQ1hUeG1pdFBvd2VyLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVDQ1hWZXJzaW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUNDWFZlcnNpb24gKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAxOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDQwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDk2OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDM7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnZlcnNpb247CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZUNDWFZlcnNpb24uICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUNGUGFyYW1zKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDRlBhcmFtcyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDY7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA0OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+Y2ZwX2NvdW50OworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+Y2ZwX3BlcmlvZDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5jZnBfbWF4ZHVyYXRpb24sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNmcF9kdXJyZW1haW5pbmcsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVDRlBhcmFtcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llQ2hhbGxlbmdlVGV4dCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDaGFsbGVuZ2VUZXh0ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIHBTcmMtPm51bV90ZXh0OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT50ZXh0ICksIHBTcmMtPm51bV90ZXh0KTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3RleHQ7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZUNoYWxsZW5nZVRleHQuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUNoYW5Td2l0Y2hBbm4odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFQ2hhblN3aXRjaEFubiAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDM7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAzNzsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnN3aXRjaE1vZGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5uZXdDaGFubmVsOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+c3dpdGNoQ291bnQ7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZUNoYW5Td2l0Y2hBbm4uICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUNvdW50cnkodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFQ291bnRyeSAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFQ291bnRyeShwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDc7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5jb3VudHJ5LCAzKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMzsKKyAgICAgICAgcEJ1ZiArPSAzOworICAgICAgICBpZiAoIHBTcmMtPm51bV90cmlwbGV0cyApICAgICAgICB7CisgICAgICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPnRyaXBsZXRzICksICggcFNyYy0+bnVtX3RyaXBsZXRzICogMyApKTsKKyAgICAgICAgICAgICpwbkNvbnN1bWVkICs9ICggcFNyYy0+bnVtX3RyaXBsZXRzICogMyApOworICAgICAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBicmVhazsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llQ291bnRyeS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llRFNQYXJhbXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRURTUGFyYW1zICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDM7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5jdXJyX2NoYW5uZWw7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZURTUGFyYW1zLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVFRENBUGFyYW1TZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVFRENBUGFyYW1TZXQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICB0QU5JX1U4IHRtcDEwNF9fOworICAgIHRBTklfVTggdG1wMTA1X187CisgICAgdEFOSV9VOCB0bXAxMDZfXzsKKyAgICB0QU5JX1U4IHRtcDEwN19fOworICAgIHRBTklfVTggdG1wMTA4X187CisgICAgdEFOSV9VOCB0bXAxMDlfXzsKKyAgICB0QU5JX1U4IHRtcDExMF9fOworICAgIHRBTklfVTggdG1wMTExX187CisgICAgbk5lZWRlZCAgKz0gMTg7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAxMjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnFvczsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJlc2VydmVkOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIHRtcDEwNF9fID0gMFU7CisgICAgICAgIHRtcDEwNF9fIHw9ICggcFNyYy0+YWNiZV9haWZzbiA8PCAwICk7CisgICAgICAgIHRtcDEwNF9fIHw9ICggcFNyYy0+YWNiZV9hY20gPDwgNCApOworICAgICAgICB0bXAxMDRfXyB8PSAoIHBTcmMtPmFjYmVfYWNpIDw8IDUgKTsKKyAgICAgICAgdG1wMTA0X18gfD0gKCBwU3JjLT51bnVzZWQxIDw8IDcgKTsKKyAgICAgICAgKnBCdWYgPSB0bXAxMDRfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgdG1wMTA1X18gPSAwVTsKKyAgICAgICAgdG1wMTA1X18gfD0gKCBwU3JjLT5hY2JlX2Fjd21pbiA8PCAwICk7CisgICAgICAgIHRtcDEwNV9fIHw9ICggcFNyYy0+YWNiZV9hY3dtYXggPDwgNCApOworICAgICAgICAqcEJ1ZiA9IHRtcDEwNV9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hY2JlX3R4b3BsaW1pdCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgdG1wMTA2X18gPSAwVTsKKyAgICAgICAgdG1wMTA2X18gfD0gKCBwU3JjLT5hY2JrX2FpZnNuIDw8IDAgKTsKKyAgICAgICAgdG1wMTA2X18gfD0gKCBwU3JjLT5hY2JrX2FjbSA8PCA0ICk7CisgICAgICAgIHRtcDEwNl9fIHw9ICggcFNyYy0+YWNia19hY2kgPDwgNSApOworICAgICAgICB0bXAxMDZfXyB8PSAoIHBTcmMtPnVudXNlZDIgPDwgNyApOworICAgICAgICAqcEJ1ZiA9IHRtcDEwNl9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICB0bXAxMDdfXyA9IDBVOworICAgICAgICB0bXAxMDdfXyB8PSAoIHBTcmMtPmFjYmtfYWN3bWluIDw8IDAgKTsKKyAgICAgICAgdG1wMTA3X18gfD0gKCBwU3JjLT5hY2JrX2Fjd21heCA8PCA0ICk7CisgICAgICAgICpwQnVmID0gdG1wMTA3X187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmFjYmtfdHhvcGxpbWl0LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICB0bXAxMDhfXyA9IDBVOworICAgICAgICB0bXAxMDhfXyB8PSAoIHBTcmMtPmFjdmlfYWlmc24gPDwgMCApOworICAgICAgICB0bXAxMDhfXyB8PSAoIHBTcmMtPmFjdmlfYWNtIDw8IDQgKTsKKyAgICAgICAgdG1wMTA4X18gfD0gKCBwU3JjLT5hY3ZpX2FjaSA8PCA1ICk7CisgICAgICAgIHRtcDEwOF9fIHw9ICggcFNyYy0+dW51c2VkMyA8PCA3ICk7CisgICAgICAgICpwQnVmID0gdG1wMTA4X187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIHRtcDEwOV9fID0gMFU7CisgICAgICAgIHRtcDEwOV9fIHw9ICggcFNyYy0+YWN2aV9hY3dtaW4gPDwgMCApOworICAgICAgICB0bXAxMDlfXyB8PSAoIHBTcmMtPmFjdmlfYWN3bWF4IDw8IDQgKTsKKyAgICAgICAgKnBCdWYgPSB0bXAxMDlfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YWN2aV90eG9wbGltaXQsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIHRtcDExMF9fID0gMFU7CisgICAgICAgIHRtcDExMF9fIHw9ICggcFNyYy0+YWN2b19haWZzbiA8PCAwICk7CisgICAgICAgIHRtcDExMF9fIHw9ICggcFNyYy0+YWN2b19hY20gPDwgNCApOworICAgICAgICB0bXAxMTBfXyB8PSAoIHBTcmMtPmFjdm9fYWNpIDw8IDUgKTsKKyAgICAgICAgdG1wMTEwX18gfD0gKCBwU3JjLT51bnVzZWQ0IDw8IDcgKTsKKyAgICAgICAgKnBCdWYgPSB0bXAxMTBfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgdG1wMTExX18gPSAwVTsKKyAgICAgICAgdG1wMTExX18gfD0gKCBwU3JjLT5hY3ZvX2Fjd21pbiA8PCAwICk7CisgICAgICAgIHRtcDExMV9fIHw9ICggcFNyYy0+YWN2b19hY3dtYXggPDwgNCApOworICAgICAgICAqcEJ1ZiA9IHRtcDExMV9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hY3ZvX3R4b3BsaW1pdCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZUVEQ0FQYXJhbVNldC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llRVJQSW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVFUlBJbmZvICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VOCB0bXAxMTJfXzsKKyAgICBuTmVlZGVkICArPSAxOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNDI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgdG1wMTEyX18gPSAwVTsKKyAgICAgICAgdG1wMTEyX18gfD0gKCBwU3JjLT5ub25fZXJwX3ByZXNlbnQgPDwgMCApOworICAgICAgICB0bXAxMTJfXyB8PSAoIHBTcmMtPnVzZV9wcm90IDw8IDEgKTsKKyAgICAgICAgdG1wMTEyX18gfD0gKCBwU3JjLT5iYXJrZXJfcHJlYW1ibGUgPDwgMiApOworICAgICAgICB0bXAxMTJfXyB8PSAoIHBTcmMtPnVudXNlZCA8PCAzICk7CisgICAgICAgICpwQnVmID0gdG1wMTEyX187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgID0gMSAKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llRVJQSW5mby4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llRXh0Q2hhblN3aXRjaEFubih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVFeHRDaGFuU3dpdGNoQW5uICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDYyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+c2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llRXh0Q2hhblN3aXRjaEFubi4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llRXh0U3VwcFJhdGVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9yYXRlczsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDUwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+cmF0ZXMgKSwgcFNyYy0+bnVtX3JhdGVzKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3JhdGVzOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVFeHRTdXBwUmF0ZXMuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUZIUGFyYW1TZXQodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRkhQYXJhbVNldCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDU7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmR3ZWxsX3RpbWUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICpwQnVmID0gcFNyYy0+aG9wX3NldDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmhvcF9wYXR0ZXJuOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+aG9wX2luZGV4OworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVGSFBhcmFtU2V0LiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVGSFBhcmFtcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRkhQYXJhbXMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAyOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gODsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJhZGl4OworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+bmNoYW5uZWxzOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVGSFBhcmFtcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llRkhQYXR0VGFibGUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUZIUGF0dFRhYmxlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIChwU3JjLT5udW1fcmFuZHRhYmxlICsgNCk7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA5OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+ZmxhZzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPm5zZXRzOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+bW9kdWx1czsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPm9mZnNldDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPnJhbmR0YWJsZSApLCBwU3JjLT5udW1fcmFuZHRhYmxlKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX3JhbmR0YWJsZTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llRkhQYXR0VGFibGUuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUZUSW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUZUSW5mbyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTE2IHRtcDExM19fOworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFRlRJbmZvKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNTU7CisgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHRtcDExM19fID0gMFU7CisgICAgICAgIHRtcDExM19fIHw9ICggcFNyYy0+cmVzZXJ2ZWQgPDwgMCApOworICAgICAgICB0bXAxMTNfXyB8PSAoIHBTcmMtPklFQ291bnQgPDwgOCApOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXAxMTNfXywgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAgMiA7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+TUlDLCAxNik7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE2OworICAgICAgICBwQnVmICs9IDE2OworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPkFub25jZSwgMzIpOworICAgICAgICAqcG5Db25zdW1lZCArPSAzMjsKKyAgICAgICAgcEJ1ZiArPSAzMjsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5Tbm9uY2UsIDMyKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMzI7CisgICAgICAgIHBCdWYgKz0gMzI7CisgICAgICAgIHN0YXR1cyA9IFBhY2tDb3JlKHBDdHgsCisgICAgICAgICAgKHRBTklfVTgqKXBTcmMsCisgICAgICAgICAgcEJ1ZiwKKyAgICAgICAgICBuQnVmLAorICAgICAgICAgIHBuQ29uc3VtZWQsCisgICAgICAgICAgRkZTX0ZUSW5mbywKKyAgICAgICAgICBJRVNfRlRJbmZvKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llRlRJbmZvLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVGVFRpbWVvdXRJbnRlcnZhbCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRlRUaW1lb3V0SW50ZXJ2YWwgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSA1OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNTY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT50aW1lb3V0VHlwZTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBmcmFtZXNodG9ubChwQ3R4LCBwQnVmLCBwU3JjLT50aW1lb3V0VmFsdWUsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVGVFRpbWVvdXRJbnRlcnZhbC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llSFRDYXBzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFSFRDYXBzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VMTYgdG1wMTE0X187CisgICAgdEFOSV9VOCB0bXAxMTVfXzsKKyAgICB0QU5JX1UxNiB0bXAxMTZfXzsKKyAgICB0QU5JX1UzMiB0bXAxMTdfXzsKKyAgICB0QU5JX1U4IHRtcDExOF9fOworICAgIG5OZWVkZWQgICs9ICAocFNyYy0+bnVtX3JzdmQgKyAyNik7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA0NTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICB0bXAxMTRfXyA9IDBVOworICAgICAgICB0bXAxMTRfXyB8PSAoIHBTcmMtPmFkdkNvZGluZ0NhcCA8PCAwICk7CisgICAgICAgIHRtcDExNF9fIHw9ICggcFNyYy0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0IDw8IDEgKTsKKyAgICAgICAgdG1wMTE0X18gfD0gKCBwU3JjLT5taW1vUG93ZXJTYXZlIDw8IDIgKTsKKyAgICAgICAgdG1wMTE0X18gfD0gKCBwU3JjLT5ncmVlbkZpZWxkIDw8IDQgKTsKKyAgICAgICAgdG1wMTE0X18gfD0gKCBwU3JjLT5zaG9ydEdJMjBNSHogPDwgNSApOworICAgICAgICB0bXAxMTRfXyB8PSAoIHBTcmMtPnNob3J0R0k0ME1IeiA8PCA2ICk7CisgICAgICAgIHRtcDExNF9fIHw9ICggcFNyYy0+dHhTVEJDIDw8IDcgKTsKKyAgICAgICAgdG1wMTE0X18gfD0gKCBwU3JjLT5yeFNUQkMgPDwgOCApOworICAgICAgICB0bXAxMTRfXyB8PSAoIHBTcmMtPmRlbGF5ZWRCQSA8PCAxMCApOworICAgICAgICB0bXAxMTRfXyB8PSAoIHBTcmMtPm1heGltYWxBTVNEVXNpemUgPDwgMTEgKTsKKyAgICAgICAgdG1wMTE0X18gfD0gKCBwU3JjLT5kc3NzQ2NrTW9kZTQwTUh6IDw8IDEyICk7CisgICAgICAgIHRtcDExNF9fIHw9ICggcFNyYy0+cHNtcCA8PCAxMyApOworICAgICAgICB0bXAxMTRfXyB8PSAoIHBTcmMtPnN0YmNDb250cm9sRnJhbWUgPDwgMTQgKTsKKyAgICAgICAgdG1wMTE0X18gfD0gKCBwU3JjLT5sc2lnVFhPUFByb3RlY3Rpb24gPDwgMTUgKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgdG1wMTE0X18sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gIDIgOworICAgICAgICB0bXAxMTVfXyA9IDBVOworICAgICAgICB0bXAxMTVfXyB8PSAoIHBTcmMtPm1heFJ4QU1QRFVGYWN0b3IgPDwgMCApOworICAgICAgICB0bXAxMTVfXyB8PSAoIHBTcmMtPm1wZHVEZW5zaXR5IDw8IDIgKTsKKyAgICAgICAgdG1wMTE1X18gfD0gKCBwU3JjLT5yZXNlcnZlZDEgPDwgNSApOworICAgICAgICAqcEJ1ZiA9IHRtcDExNV9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsIHBTcmMtPnN1cHBvcnRlZE1DU1NldCwgMTYpOworICAgICAgICAqcG5Db25zdW1lZCArPSAxNjsKKyAgICAgICAgcEJ1ZiArPSAxNjsKKyAgICAgICAgdG1wMTE2X18gPSAwVTsKKyAgICAgICAgdG1wMTE2X18gfD0gKCBwU3JjLT5wY28gPDwgMCApOworICAgICAgICB0bXAxMTZfXyB8PSAoIHBTcmMtPnRyYW5zaXRpb25UaW1lIDw8IDEgKTsKKyAgICAgICAgdG1wMTE2X18gfD0gKCBwU3JjLT5yZXNlcnZlZDIgPDwgMyApOworICAgICAgICB0bXAxMTZfXyB8PSAoIHBTcmMtPm1jc0ZlZWRiYWNrIDw8IDggKTsKKyAgICAgICAgdG1wMTE2X18gfD0gKCBwU3JjLT5yZXNlcnZlZDMgPDwgMTAgKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgdG1wMTE2X18sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIG5CdWYgLT0gIDIgOworICAgICAgICB0bXAxMTdfXyA9IDBVOworICAgICAgICB0bXAxMTdfXyB8PSAoIHBTcmMtPnR4QkYgPDwgMCApOworICAgICAgICB0bXAxMTdfXyB8PSAoIHBTcmMtPnJ4U3RhZ2dlcmVkU291bmRpbmcgPDwgMSApOworICAgICAgICB0bXAxMTdfXyB8PSAoIHBTcmMtPnR4U3RhZ2dlcmVkU291bmRpbmcgPDwgMiApOworICAgICAgICB0bXAxMTdfXyB8PSAoIHBTcmMtPnJ4WkxGIDw8IDMgKTsKKyAgICAgICAgdG1wMTE3X18gfD0gKCBwU3JjLT50eFpMRiA8PCA0ICk7CisgICAgICAgIHRtcDExN19fIHw9ICggcFNyYy0+aW1wbGljaXRUeEJGIDw8IDUgKTsKKyAgICAgICAgdG1wMTE3X18gfD0gKCBwU3JjLT5jYWxpYnJhdGlvbiA8PCA2ICk7CisgICAgICAgIHRtcDExN19fIHw9ICggcFNyYy0+ZXhwbGljaXRDU0lUeEJGIDw8IDggKTsKKyAgICAgICAgdG1wMTE3X18gfD0gKCBwU3JjLT5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4IDw8IDkgKTsKKyAgICAgICAgdG1wMTE3X18gfD0gKCBwU3JjLT5leHBsaWNpdEJGQ1NJRmVlZGJhY2sgPDwgMTAgKTsKKyAgICAgICAgdG1wMTE3X18gfD0gKCBwU3JjLT5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgPDwgMTMgKTsKKyAgICAgICAgdG1wMTE3X18gfD0gKCBwU3JjLT5leHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrIDw8IDE2ICk7CisgICAgICAgIHRtcDExN19fIHw9ICggcFNyYy0+Y3NpTnVtQkZBbnRlbm5hZSA8PCAxOSApOworICAgICAgICB0bXAxMTdfXyB8PSAoIHBTcmMtPnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSA8PCAyMSApOworICAgICAgICB0bXAxMTdfXyB8PSAoIHBTcmMtPmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgPDwgMjMgKTsKKyAgICAgICAgdG1wMTE3X18gfD0gKCBwU3JjLT5yZXNlcnZlZDQgPDwgMjUgKTsKKyAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgdG1wMTE3X18sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIG5CdWYgLT0gIDQgOworICAgICAgICB0bXAxMThfXyA9IDBVOworICAgICAgICB0bXAxMThfXyB8PSAoIHBTcmMtPmFudGVubmFTZWxlY3Rpb24gPDwgMCApOworICAgICAgICB0bXAxMThfXyB8PSAoIHBTcmMtPmV4cGxpY2l0Q1NJRmVlZGJhY2tUeCA8PCAxICk7CisgICAgICAgIHRtcDExOF9fIHw9ICggcFNyYy0+YW50ZW5uYUluZGljZXNGZWVkYmFja1R4IDw8IDIgKTsKKyAgICAgICAgdG1wMTE4X18gfD0gKCBwU3JjLT5leHBsaWNpdENTSUZlZWRiYWNrIDw8IDMgKTsKKyAgICAgICAgdG1wMTE4X18gfD0gKCBwU3JjLT5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrIDw8IDQgKTsKKyAgICAgICAgdG1wMTE4X18gfD0gKCBwU3JjLT5yeEFTIDw8IDUgKTsKKyAgICAgICAgdG1wMTE4X18gfD0gKCBwU3JjLT50eFNvdW5kaW5nUFBEVXMgPDwgNiApOworICAgICAgICB0bXAxMThfXyB8PSAoIHBTcmMtPnJlc2VydmVkNSA8PCA3ICk7CisgICAgICAgICpwQnVmID0gdG1wMTE4X187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+cnN2ZCApLCBwU3JjLT5udW1fcnN2ZCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9yc3ZkOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVIVENhcHMuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUhUSW5mbyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUhUSW5mbyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTggdG1wMTE5X187CisgICAgdEFOSV9VMTYgdG1wMTIwX187CisgICAgdEFOSV9VMTYgdG1wMTIxX187CisgICAgbk5lZWRlZCAgKz0gIChwU3JjLT5udW1fcnN2ZCArIDIyKTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDYxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+cHJpbWFyeUNoYW5uZWw7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgdG1wMTE5X18gPSAwVTsKKyAgICAgICAgdG1wMTE5X18gfD0gKCBwU3JjLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0IDw8IDAgKTsKKyAgICAgICAgdG1wMTE5X18gfD0gKCBwU3JjLT5yZWNvbW1lbmRlZFR4V2lkdGhTZXQgPDwgMiApOworICAgICAgICB0bXAxMTlfXyB8PSAoIHBTcmMtPnJpZnNNb2RlIDw8IDMgKTsKKyAgICAgICAgdG1wMTE5X18gfD0gKCBwU3JjLT5jb250cm9sbGVkQWNjZXNzT25seSA8PCA0ICk7CisgICAgICAgIHRtcDExOV9fIHw9ICggcFNyYy0+c2VydmljZUludGVydmFsR3JhbnVsYXJpdHkgPDwgNSApOworICAgICAgICAqcEJ1ZiA9IHRtcDExOV9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICB0bXAxMjBfXyA9IDBVOworICAgICAgICB0bXAxMjBfXyB8PSAoIHBTcmMtPm9wTW9kZSA8PCAwICk7CisgICAgICAgIHRtcDEyMF9fIHw9ICggcFNyYy0+bm9uR0ZEZXZpY2VzUHJlc2VudCA8PCAyICk7CisgICAgICAgIHRtcDEyMF9fIHw9ICggcFNyYy0+dHJhbnNtaXRCdXJzdExpbWl0IDw8IDMgKTsKKyAgICAgICAgdG1wMTIwX18gfD0gKCBwU3JjLT5vYnNzTm9uSFRTdGFQcmVzZW50IDw8IDQgKTsKKyAgICAgICAgdG1wMTIwX18gfD0gKCBwU3JjLT5yZXNlcnZlZCA8PCA1ICk7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDEyMF9fLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09ICAyIDsKKyAgICAgICAgdG1wMTIxX18gPSAwVTsKKyAgICAgICAgdG1wMTIxX18gfD0gKCBwU3JjLT5iYXNpY1NUQkNNQ1MgPDwgMCApOworICAgICAgICB0bXAxMjFfXyB8PSAoIHBTcmMtPmR1YWxDVFNQcm90ZWN0aW9uIDw8IDcgKTsKKyAgICAgICAgdG1wMTIxX18gfD0gKCBwU3JjLT5zZWNvbmRhcnlCZWFjb24gPDwgOCApOworICAgICAgICB0bXAxMjFfXyB8PSAoIHBTcmMtPmxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0IDw8IDkgKTsKKyAgICAgICAgdG1wMTIxX18gfD0gKCBwU3JjLT5wY29BY3RpdmUgPDwgMTAgKTsKKyAgICAgICAgdG1wMTIxX18gfD0gKCBwU3JjLT5wY29QaGFzZSA8PCAxMSApOworICAgICAgICB0bXAxMjFfXyB8PSAoIHBTcmMtPnJlc2VydmVkMiA8PCAxMiApOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCB0bXAxMjFfXywgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgbkJ1ZiAtPSAgMiA7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+YmFzaWNNQ1NTZXQsIDE2KTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTY7CisgICAgICAgIHBCdWYgKz0gMTY7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+cnN2ZCApLCBwU3JjLT5udW1fcnN2ZCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9yc3ZkOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVIVEluZm8uICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZUlCU1NQYXJhbXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFSUJTU1BhcmFtcyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDI7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA2OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmF0aW0sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVJQlNTUGFyYW1zLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVNZWFzdXJlbWVudFJlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFTWVhc3VyZW1lbnRSZXBvcnQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICB0QU5JX1U4IHRtcDEyMl9fOworICAgIHRBTklfVTggdG1wMTIzX187CisgICAgdEFOSV9VOCB0bXAxMjRfXzsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRU1lYXN1cmVtZW50UmVwb3J0KHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMzk7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT50b2tlbjsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICB0bXAxMjJfXyA9IDBVOworICAgICAgICB0bXAxMjJfXyB8PSAoIHBTcmMtPmxhdGUgPDwgMCApOworICAgICAgICB0bXAxMjJfXyB8PSAoIHBTcmMtPmluY2FwYWJsZSA8PCAxICk7CisgICAgICAgIHRtcDEyMl9fIHw9ICggcFNyYy0+cmVmdXNlZCA8PCAyICk7CisgICAgICAgIHRtcDEyMl9fIHw9ICggcFNyYy0+dW51c2VkIDw8IDMgKTsKKyAgICAgICAgKnBCdWYgPSB0bXAxMjJfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT50eXBlOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIGlmICggcFNyYy0+dHlwZSApICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHBTcmMtPnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJlcG9ydC5CYXNpYy5jaGFubmVsOworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc2h0b25xKHBDdHgsIHBCdWYsIHBTcmMtPnJlcG9ydC5CYXNpYy5tZWFzX3N0YXJ0X3RpbWUsIDApOworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA4OworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDg7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnJlcG9ydC5CYXNpYy5tZWFzX2R1cmF0aW9uLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICAgICAgICAgICAgICB0bXAxMjNfXyA9IDBVOworICAgICAgICAgICAgICAgICAgICB0bXAxMjNfXyB8PSAoIHBTcmMtPnJlcG9ydC5CYXNpYy5ic3MgPDwgMCApOworICAgICAgICAgICAgICAgICAgICB0bXAxMjNfXyB8PSAoIHBTcmMtPnJlcG9ydC5CYXNpYy5vZmRtX3ByZWFtYmxlIDw8IDEgKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTIzX18gfD0gKCBwU3JjLT5yZXBvcnQuQmFzaWMudW5pZF9zaWduYWwgPDwgMiApOworICAgICAgICAgICAgICAgICAgICB0bXAxMjNfXyB8PSAoIHBTcmMtPnJlcG9ydC5CYXNpYy5yYWRlciA8PCAzICk7CisgICAgICAgICAgICAgICAgICAgIHRtcDEyM19fIHw9ICggcFNyYy0+cmVwb3J0LkJhc2ljLnVubWVhc3VyZWQgPDwgNCApOworICAgICAgICAgICAgICAgICAgICB0bXAxMjNfXyB8PSAoIHBTcmMtPnJlcG9ydC5CYXNpYy51bnVzZWQgPDwgNSApOworICAgICAgICAgICAgICAgICAgICAqcEJ1ZiA9IHRtcDEyM19fOworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZHNFbmRGbGFnICA9IDEgCisgICAgICAgICAgICAgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXBvcnQuQ0NBLmNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnEocEN0eCwgcEJ1ZiwgcFNyYy0+cmVwb3J0LkNDQS5tZWFzX3N0YXJ0X3RpbWUsIDApOworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA4OworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDg7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnJlcG9ydC5DQ0EubWVhc19kdXJhdGlvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXBvcnQuQ0NBLmNjYV9idXN5X2ZyYWN0aW9uOworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5jaGFubmVsOworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc2h0b25xKHBDdHgsIHBCdWYsIHBTcmMtPnJlcG9ydC5SUElIaXN0b2dyYW0ubWVhc19zdGFydF90aW1lLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSA4OworICAgICAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5yZXBvcnQuUlBJSGlzdG9ncmFtLm1lYXNfZHVyYXRpb24sIDApOworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkwX2RlbnNpdHk7CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTFfZGVuc2l0eTsKKyAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpMl9kZW5zaXR5OworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkzX2RlbnNpdHk7CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTRfZGVuc2l0eTsKKyAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpNV9kZW5zaXR5OworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+cmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk2X2RlbnNpdHk7CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXBvcnQuUlBJSGlzdG9ncmFtLnJwaTdfZGVuc2l0eTsKKyAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJlcG9ydC5CZWFjb24ucmVnQ2xhc3M7CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXBvcnQuQmVhY29uLmNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnEocEN0eCwgcEJ1ZiwgcFNyYy0+cmVwb3J0LkJlYWNvbi5tZWFzX3N0YXJ0X3RpbWUsIDApOworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA4OworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDg7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnJlcG9ydC5CZWFjb24ubWVhc19kdXJhdGlvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTI0X18gPSAwVTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMTI0X18gfD0gKCBwU3JjLT5yZXBvcnQuQmVhY29uLmNvbmRlbnNlZF9QSFkgPDwgMCApOworICAgICAgICAgICAgICAgICAgICB0bXAxMjRfXyB8PSAoIHBTcmMtPnJlcG9ydC5CZWFjb24ucmVwb3J0ZWRfZnJhbWVfdHlwZSA8PCA3ICk7CisgICAgICAgICAgICAgICAgICAgICpwQnVmID0gdG1wMTI0X187CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+cmVwb3J0LkJlYWNvbi5SQ1BJOworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgICAgICpwQnVmID0gcFNyYy0+cmVwb3J0LkJlYWNvbi5SU05JOworICAgICAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+cmVwb3J0LkJlYWNvbi5CU1NJRCwgNik7CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDY7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5yZXBvcnQuQmVhY29uLmFudGVubmFfaWQ7CisgICAgICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzaHRvbmwocEN0eCwgcEJ1ZiwgcFNyYy0+cmVwb3J0LkJlYWNvbi5wYXJlbnRfVFNGLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tDb3JlKHBDdHgsCisgICAgICAgICAgKHRBTklfVTgqKXBTcmMsCisgICAgICAgICAgcEJ1ZiwKKyAgICAgICAgICBuQnVmLAorICAgICAgICAgIHBuQ29uc3VtZWQsCisgICAgICAgICAgRkZTX3JlcG9ydEJlYWNvbiwKKyAgICAgICAgICBJRVNfcmVwb3J0QmVhY29uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGJyZWFrOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVNZWFzdXJlbWVudFJlcG9ydC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llTWVhc3VyZW1lbnRSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VOCB0bXAxMjVfXzsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRU1lYXN1cmVtZW50UmVxdWVzdChwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDM4OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+bWVhc3VyZW1lbnRfdG9rZW47CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgdG1wMTI1X18gPSAwVTsKKyAgICAgICAgdG1wMTI1X18gfD0gKCBwU3JjLT5wYXJhbGxlbCA8PCAwICk7CisgICAgICAgIHRtcDEyNV9fIHw9ICggcFNyYy0+ZW5hYmxlIDw8IDEgKTsKKyAgICAgICAgdG1wMTI1X18gfD0gKCBwU3JjLT5yZXF1ZXN0IDw8IDIgKTsKKyAgICAgICAgdG1wMTI1X18gfD0gKCBwU3JjLT5yZXBvcnQgPDwgMyApOworICAgICAgICB0bXAxMjVfXyB8PSAoIHBTcmMtPmR1cmF0aW9uTWFuZGF0b3J5IDw8IDQgKTsKKyAgICAgICAgdG1wMTI1X18gfD0gKCBwU3JjLT51bnVzZWQgPDwgNSApOworICAgICAgICAqcEJ1ZiA9IHRtcDEyNV9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPm1lYXN1cmVtZW50X3R5cGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgc3dpdGNoIChwU3JjLT5tZWFzdXJlbWVudF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJhc2ljLmNoYW5uZWxfbm87CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJhc2ljLm1lYXNfc3RhcnRfdGltZSwgOCk7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gODsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDg7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CYXNpYy5tZWFzX2R1cmF0aW9uLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkNDQS5jaGFubmVsX25vOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5DQ0EubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA4OworICAgICAgICAgICAgICAgIHBCdWYgKz0gODsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkNDQS5tZWFzX2R1cmF0aW9uLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LlJQSUhpc3RvZ3JhbS5jaGFubmVsX25vOworICAgICAgICAgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgICAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0ubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA4OworICAgICAgICAgICAgICAgIHBCdWYgKz0gODsKKyAgICAgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LlJQSUhpc3RvZ3JhbS5tZWFzX2R1cmF0aW9uLCAwKTsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5yZWdDbGFzczsKKyAgICAgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgICAgICAgICAqcEJ1ZiA9IHBTcmMtPm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLmNoYW5uZWw7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ucmFuZG9taXphdGlvbiwgMCk7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+bWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubWVhc19kdXJhdGlvbiwgMCk7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICAgICAgICAgKnBCdWYgPSBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5tZWFzX21vZGU7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5CU1NJRCwgNik7CisgICAgICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gNjsKKyAgICAgICAgICAgICAgICBwQnVmICs9IDY7CisgICAgICAgICAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LAorICAgICAgICAgICh0QU5JX1U4KilwU3JjLAorICAgICAgICAgIHBCdWYsCisgICAgICAgICAgbkJ1ZiwKKyAgICAgICAgICBwbkNvbnN1bWVkLAorICAgICAgICAgIEZGU19tZWFzdXJlbWVudF9yZXF1ZXN0QmVhY29uLAorICAgICAgICAgIElFU19tZWFzdXJlbWVudF9yZXF1ZXN0QmVhY29uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZU1lYXN1cmVtZW50UmVxdWVzdC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llTW9iaWxpdHlEb21haW4odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VOCB0bXAxMjZfXzsKKyAgICBuTmVlZGVkICArPSAzOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNTQ7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+TURJRCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgdG1wMTI2X18gPSAwVTsKKyAgICAgICAgdG1wMTI2X18gfD0gKCBwU3JjLT5vdmVyRFNDYXAgPDwgMCApOworICAgICAgICB0bXAxMjZfXyB8PSAoIHBTcmMtPnJlc291cmNlUmVxQ2FwIDw8IDEgKTsKKyAgICAgICAgdG1wMTI2X18gfD0gKCBwU3JjLT5yZXNlcnZlZCA8PCAyICk7CisgICAgICAgICpwQnVmID0gdG1wMTI2X187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgID0gMSAKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llTW9iaWxpdHlEb21haW4uICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZU5laWdoYm9yUmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVOZWlnaGJvclJlcG9ydCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTggdG1wMTI3X187CisgICAgdEFOSV9VOCB0bXAxMjhfXzsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRU5laWdoYm9yUmVwb3J0KHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNTI7CisgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+YnNzaWQsIDYpOworICAgICAgICAqcG5Db25zdW1lZCArPSA2OworICAgICAgICBwQnVmICs9IDY7CisgICAgICAgIHRtcDEyN19fID0gMFU7CisgICAgICAgIHRtcDEyN19fIHw9ICggcFNyYy0+QVBSZWFjaGFiaWxpdHkgPDwgMCApOworICAgICAgICB0bXAxMjdfXyB8PSAoIHBTcmMtPlNlY3VyaXR5IDw8IDIgKTsKKyAgICAgICAgdG1wMTI3X18gfD0gKCBwU3JjLT5LZXlTY29wZSA8PCAzICk7CisgICAgICAgIHRtcDEyN19fIHw9ICggcFNyYy0+U3BlY01nbXRDYXAgPDwgNCApOworICAgICAgICB0bXAxMjdfXyB8PSAoIHBTcmMtPlFvc0NhcCA8PCA1ICk7CisgICAgICAgIHRtcDEyN19fIHw9ICggcFNyYy0+YXBzZCA8PCA2ICk7CisgICAgICAgIHRtcDEyN19fIHw9ICggcFNyYy0+cnJtIDw8IDcgKTsKKyAgICAgICAgKnBCdWYgPSB0bXAxMjdfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgdG1wMTI4X18gPSAwVTsKKyAgICAgICAgdG1wMTI4X18gfD0gKCBwU3JjLT5EZWxheWVkQkEgPDwgMCApOworICAgICAgICB0bXAxMjhfXyB8PSAoIHBTcmMtPkltbUJBIDw8IDEgKTsKKyAgICAgICAgdG1wMTI4X18gfD0gKCBwU3JjLT5Nb2JpbGl0eURvbWFpbiA8PCAyICk7CisgICAgICAgIHRtcDEyOF9fIHw9ICggcFNyYy0+cmVzZXJ2ZWQgPDwgMyApOworICAgICAgICAqcEJ1ZiA9IHRtcDEyOF9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5yZXNlcnZlZDEsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICpwQnVmID0gcFNyYy0+cmVndWxhdG9yeUNsYXNzOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+Y2hhbm5lbDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPlBoeVR5cGU7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwKKyAgICAgICAgICAodEFOSV9VOCopcFNyYywKKyAgICAgICAgICBwQnVmLAorICAgICAgICAgIG5CdWYsCisgICAgICAgICAgcG5Db25zdW1lZCwKKyAgICAgICAgICBGRlNfTmVpZ2hib3JSZXBvcnQsCisgICAgICAgICAgSUVTX05laWdoYm9yUmVwb3J0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llTmVpZ2hib3JSZXBvcnQuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUEFzc29jUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQMlBBc3NvY1JlcSAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuLCBpZHggPSAwLGlkeGxhc3Q7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkU29GYXIsIG5Db25zdW1lZE5vdzsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgc3RhdHVzID0gZG90MTFmR2V0UGFja2VkSUVQMlBBc3NvY1JlcShwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFNyYy0+cHJlc2VudCkgeworICAgICAgICBkbyB7CisgICAgICAgIG5Db25zdW1lZFNvRmFyPSpwbkNvbnN1bWVkOworICAgICAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDZmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5YTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1AyUEFzc29jUmVxK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVAyUEFzc29jUmVxLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBBc3NvY1Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUDJQQXNzb2NSZXMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFUDJQQXNzb2NSZXMocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBTcmMtPnByZXNlbnQpIHsKKyAgICAgICAgZG8geworICAgICAgICBuQ29uc3VtZWRTb0Zhcj0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg2ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OWE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDk7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19QMlBBc3NvY1JlcytpZHgsJmlkeCk7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQtbkNvbnN1bWVkTm93OworICAgICAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworICAgICAgICAgICAgcEJ1Zis9bkNvbnN1bWVkTm93OworICAgICAgICAgICAgbkJ1Zi09bkNvbnN1bWVkTm93OworICAgICAgICB9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVQMlBBc3NvY1Jlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQQmVhY29uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUDJQQmVhY29uICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG4sIGlkeCA9IDAsaWR4bGFzdDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVAyUEJlYWNvbihwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFNyYy0+cHJlc2VudCkgeworICAgICAgICBkbyB7CisgICAgICAgIG5Db25zdW1lZFNvRmFyPSpwbkNvbnN1bWVkOworICAgICAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDZmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5YTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1AyUEJlYWNvbitpZHgsJmlkeCk7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQtbkNvbnN1bWVkTm93OworICAgICAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworICAgICAgICAgICAgcEJ1Zis9bkNvbnN1bWVkTm93OworICAgICAgICAgICAgbkJ1Zi09bkNvbnN1bWVkTm93OworICAgICAgICB9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVQMlBCZWFjb24uICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUEJlYWNvblByb2JlUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuLCBpZHggPSAwLGlkeGxhc3Q7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkU29GYXIsIG5Db25zdW1lZE5vdzsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgc3RhdHVzID0gZG90MTFmR2V0UGFja2VkSUVQMlBCZWFjb25Qcm9iZVJlcyhwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFNyYy0+cHJlc2VudCkgeworICAgICAgICBkbyB7CisgICAgICAgIG5Db25zdW1lZFNvRmFyPSpwbkNvbnN1bWVkOworICAgICAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDZmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5YTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1AyUEJlYWNvblByb2JlUmVzK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVAyUEJlYWNvblByb2JlUmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBEZUF1dGgodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQMlBEZUF1dGggKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFUDJQRGVBdXRoKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwU3JjLT5wcmVzZW50KSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgbkNvbnN1bWVkU29GYXI9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NmY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDlhOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5OworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIG4gPSAoIDI1NSAtIDQpIDwgbkJ1ZiA/ICggMjU1IC0gNCkgOiBuQnVmOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkOworICAgICAgICAgICAgaWR4bGFzdD1pZHg7CisgICAgICAgICAgICBzdGF0dXMgPSBQYWNrVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwU3JjLHBCdWYsbixwbkNvbnN1bWVkLFRMVlNfUDJQRGVBdXRoK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVAyUERlQXV0aC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG4sIGlkeCA9IDAsaWR4bGFzdDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcShwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFNyYy0+cHJlc2VudCkgeworICAgICAgICBkbyB7CisgICAgICAgIG5Db25zdW1lZFNvRmFyPSpwbkNvbnN1bWVkOworICAgICAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDZmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5YTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1AyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcStpZHgsJmlkeCk7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQtbkNvbnN1bWVkTm93OworICAgICAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworICAgICAgICAgICAgcEJ1Zis9bkNvbnN1bWVkTm93OworICAgICAgICAgICAgbkJ1Zi09bkNvbnN1bWVkTm93OworICAgICAgICB9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuLCBpZHggPSAwLGlkeGxhc3Q7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkU29GYXIsIG5Db25zdW1lZE5vdzsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgc3RhdHVzID0gZG90MTFmR2V0UGFja2VkSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBTcmMtPnByZXNlbnQpIHsKKyAgICAgICAgZG8geworICAgICAgICBuQ29uc3VtZWRTb0Zhcj0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg2ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OWE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDk7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19QMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMraWR4LCZpZHgpOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkLW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKyAgICAgICAgICAgIHBCdWYrPW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgIG5CdWYtPW5Db25zdW1lZE5vdzsKKyAgICAgICAgfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBEaXNBc3NvYyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUDJQRGlzQXNzb2MgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFUDJQRGlzQXNzb2MocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBTcmMtPnByZXNlbnQpIHsKKyAgICAgICAgZG8geworICAgICAgICBuQ29uc3VtZWRTb0Zhcj0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg2ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OWE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDk7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19QMlBEaXNBc3NvYytpZHgsJmlkeCk7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQtbkNvbnN1bWVkTm93OworICAgICAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworICAgICAgICAgICAgcEJ1Zis9bkNvbnN1bWVkTm93OworICAgICAgICAgICAgbkJ1Zi09bkNvbnN1bWVkTm93OworICAgICAgICB9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVQMlBEaXNBc3NvYy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQR09OZWdDbmYodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVAyUEdPTmVnQ25mICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG4sIGlkeCA9IDAsaWR4bGFzdDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVAyUEdPTmVnQ25mKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwU3JjLT5wcmVzZW50KSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgbkNvbnN1bWVkU29GYXI9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NmY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDlhOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5OworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIG4gPSAoIDI1NSAtIDQpIDwgbkJ1ZiA/ICggMjU1IC0gNCkgOiBuQnVmOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkOworICAgICAgICAgICAgaWR4bGFzdD1pZHg7CisgICAgICAgICAgICBzdGF0dXMgPSBQYWNrVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwU3JjLHBCdWYsbixwbkNvbnN1bWVkLFRMVlNfUDJQR09OZWdDbmYraWR4LCZpZHgpOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkLW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKyAgICAgICAgICAgIHBCdWYrPW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgIG5CdWYtPW5Db25zdW1lZE5vdzsKKyAgICAgICAgfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llUDJQR09OZWdDbmYuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUEdPTmVnUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQMlBHT05lZ1JlcSAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuLCBpZHggPSAwLGlkeGxhc3Q7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkU29GYXIsIG5Db25zdW1lZE5vdzsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgc3RhdHVzID0gZG90MTFmR2V0UGFja2VkSUVQMlBHT05lZ1JlcShwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFNyYy0+cHJlc2VudCkgeworICAgICAgICBkbyB7CisgICAgICAgIG5Db25zdW1lZFNvRmFyPSpwbkNvbnN1bWVkOworICAgICAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDZmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5YTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1AyUEdPTmVnUmVxK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVAyUEdPTmVnUmVxLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBHT05lZ1Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUDJQR09OZWdSZXMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFUDJQR09OZWdSZXMocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBTcmMtPnByZXNlbnQpIHsKKyAgICAgICAgZG8geworICAgICAgICBuQ29uc3VtZWRTb0Zhcj0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg2ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OWE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDk7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19QMlBHT05lZ1JlcytpZHgsJmlkeCk7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQtbkNvbnN1bWVkTm93OworICAgICAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworICAgICAgICAgICAgcEJ1Zis9bkNvbnN1bWVkTm93OworICAgICAgICAgICAgbkJ1Zi09bkNvbnN1bWVkTm93OworICAgICAgICB9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVQMlBHT05lZ1Jlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQR09OZWdXUFModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVAyUEdPTmVnV1BTICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG4sIGlkeCA9IDAsaWR4bGFzdDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVAyUEdPTmVnV1BTKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwU3JjLT5wcmVzZW50KSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgbkNvbnN1bWVkU29GYXI9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4ZjI7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDQ7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19QMlBHT05lZ1dQUytpZHgsJmlkeCk7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQtbkNvbnN1bWVkTm93OworICAgICAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworICAgICAgICAgICAgcEJ1Zis9bkNvbnN1bWVkTm93OworICAgICAgICAgICAgbkJ1Zi09bkNvbnN1bWVkTm93OworICAgICAgICB9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVQMlBHT05lZ1dQUy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQSUVPcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVAyUElFT3BhcXVlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9kYXRhOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg2ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg5YTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg5OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCAmKCBwU3JjLT5kYXRhICksIHBTcmMtPm51bV9kYXRhKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gcFNyYy0+bnVtX2RhdGE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVAyUElFT3BhcXVlLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBJbnZpdGF0aW9uUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVAyUEludml0YXRpb25SZXEgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFUDJQSW52aXRhdGlvblJlcShwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFNyYy0+cHJlc2VudCkgeworICAgICAgICBkbyB7CisgICAgICAgIG5Db25zdW1lZFNvRmFyPSpwbkNvbnN1bWVkOworICAgICAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDZmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5YTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1AyUEludml0YXRpb25SZXEraWR4LCZpZHgpOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkLW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKyAgICAgICAgICAgIHBCdWYrPW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgIG5CdWYtPW5Db25zdW1lZE5vdzsKKyAgICAgICAgfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llUDJQSW52aXRhdGlvblJlcS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQSW52aXRhdGlvblJlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQMlBJbnZpdGF0aW9uUmVzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG4sIGlkeCA9IDAsaWR4bGFzdDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVAyUEludml0YXRpb25SZXMocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBTcmMtPnByZXNlbnQpIHsKKyAgICAgICAgZG8geworICAgICAgICBuQ29uc3VtZWRTb0Zhcj0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg2ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OWE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDk7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19QMlBJbnZpdGF0aW9uUmVzK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVAyUEludml0YXRpb25SZXMuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUE5vdGljZU9mQWJzZW5jZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVAyUE5vdGljZU9mQWJzZW5jZSAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuLCBpZHggPSAwLGlkeGxhc3Q7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkU29GYXIsIG5Db25zdW1lZE5vdzsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgc3RhdHVzID0gZG90MTFmR2V0UGFja2VkSUVQMlBOb3RpY2VPZkFic2VuY2UocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBTcmMtPnByZXNlbnQpIHsKKyAgICAgICAgZG8geworICAgICAgICBuQ29uc3VtZWRTb0Zhcj0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg2ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OWE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDk7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19QMlBOb3RpY2VPZkFic2VuY2UraWR4LCZpZHgpOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkLW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKyAgICAgICAgICAgIHBCdWYrPW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgIG5CdWYtPW5Db25zdW1lZE5vdzsKKyAgICAgICAgfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llUDJQTm90aWNlT2ZBYnNlbmNlLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBQcmVzZW5jZVJlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVAyUFByZXNlbmNlUmVzcG9uc2UgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFUDJQUHJlc2VuY2VSZXNwb25zZShwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFNyYy0+cHJlc2VudCkgeworICAgICAgICBkbyB7CisgICAgICAgIG5Db25zdW1lZFNvRmFyPSpwbkNvbnN1bWVkOworICAgICAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDZmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5YTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1AyUFByZXNlbmNlUmVzcG9uc2UraWR4LCZpZHgpOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkLW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKyAgICAgICAgICAgIHBCdWYrPW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgIG5CdWYtPW5Db25zdW1lZE5vdzsKKyAgICAgICAgfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llUDJQUHJlc2VuY2VSZXNwb25zZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQUHJvYmVSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVAyUFByb2JlUmVxICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG4sIGlkeCA9IDAsaWR4bGFzdDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVAyUFByb2JlUmVxKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwU3JjLT5wcmVzZW50KSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgbkNvbnN1bWVkU29GYXI9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NmY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDlhOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5OworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIG4gPSAoIDI1NSAtIDQpIDwgbkJ1ZiA/ICggMjU1IC0gNCkgOiBuQnVmOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkOworICAgICAgICAgICAgaWR4bGFzdD1pZHg7CisgICAgICAgICAgICBzdGF0dXMgPSBQYWNrVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwU3JjLHBCdWYsbixwbkNvbnN1bWVkLFRMVlNfUDJQUHJvYmVSZXEraWR4LCZpZHgpOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkLW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKyAgICAgICAgICAgIHBCdWYrPW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgIG5CdWYtPW5Db25zdW1lZE5vdzsKKyAgICAgICAgfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llUDJQUHJvYmVSZXEuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVAyUFByb2JlUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQMlBQcm9iZVJlcyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuLCBpZHggPSAwLGlkeGxhc3Q7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkU29GYXIsIG5Db25zdW1lZE5vdzsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgc3RhdHVzID0gZG90MTFmR2V0UGFja2VkSUVQMlBQcm9iZVJlcyhwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFNyYy0+cHJlc2VudCkgeworICAgICAgICBkbyB7CisgICAgICAgIG5Db25zdW1lZFNvRmFyPSpwbkNvbnN1bWVkOworICAgICAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDZmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5YTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4OTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1AyUFByb2JlUmVzK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVAyUFByb2JlUmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwU3JjLT5wcmVzZW50KSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgbkNvbnN1bWVkU29GYXI9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NmY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDlhOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg5OworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIG4gPSAoIDI1NSAtIDQpIDwgbkJ1ZiA/ICggMjU1IC0gNCkgOiBuQnVmOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkOworICAgICAgICAgICAgaWR4bGFzdD1pZHg7CisgICAgICAgICAgICBzdGF0dXMgPSBQYWNrVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwU3JjLHBCdWYsbixwbkNvbnN1bWVkLFRMVlNfUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG4sIGlkeCA9IDAsaWR4bGFzdDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcyhwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocFNyYy0+cHJlc2VudCkgeworICAgICAgICBkbyB7CisgICAgICAgIG5Db25zdW1lZFNvRmFyPSpwbkNvbnN1bWVkOworICAgICAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4MDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweGYyOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg0OworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIG4gPSAoIDI1NSAtIDQpIDwgbkJ1ZiA/ICggMjU1IC0gNCkgOiBuQnVmOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkOworICAgICAgICAgICAgaWR4bGFzdD1pZHg7CisgICAgICAgICAgICBzdGF0dXMgPSBQYWNrVGx2Q29yZShwQ3R4LCh0QU5JX1U4KilwU3JjLHBCdWYsbixwbkNvbnN1bWVkLFRMVlNfUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUG93ZXJDYXBzKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUG93ZXJDYXBzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDMzOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+bWluVHhQb3dlcjsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPm1heFR4UG93ZXI7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVBvd2VyQ2Fwcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUG93ZXJDb25zdHJhaW50cyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDMyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+bG9jYWxQb3dlckNvbnN0cmFpbnRzOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVQb3dlckNvbnN0cmFpbnRzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVRQlNTTG9hZCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUUJTU0xvYWQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSA1OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTE7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+c3RhY291bnQsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgICpwQnVmID0gcFNyYy0+Y2hhdXRpbDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hdmFpbCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVFCU1NMb2FkLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVRT1NDYXBzQXAodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVRT1NDYXBzQXAgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICB0QU5JX1U4IHRtcDEyOV9fOworICAgIG5OZWVkZWQgICs9IDE7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA0NjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICB0bXAxMjlfXyA9IDBVOworICAgICAgICB0bXAxMjlfXyB8PSAoIHBTcmMtPnJlc2VydmVkIDw8IDAgKTsKKyAgICAgICAgdG1wMTI5X18gfD0gKCBwU3JjLT50eG9wcmVxIDw8IDEgKTsKKyAgICAgICAgdG1wMTI5X18gfD0gKCBwU3JjLT5xcmVxIDw8IDIgKTsKKyAgICAgICAgdG1wMTI5X18gfD0gKCBwU3JjLT5xYWNrIDw8IDMgKTsKKyAgICAgICAgdG1wMTI5X18gfD0gKCBwU3JjLT5jb3VudCA8PCA0ICk7CisgICAgICAgICpwQnVmID0gdG1wMTI5X187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgID0gMSAKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llUU9TQ2Fwc0FwLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVRT1NDYXBzU3RhdGlvbih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUU9TQ2Fwc1N0YXRpb24gKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICB0QU5JX1U4IHRtcDEzMF9fOworICAgIG5OZWVkZWQgICs9IDE7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA0NjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICB0bXAxMzBfXyA9IDBVOworICAgICAgICB0bXAxMzBfXyB8PSAoIHBTcmMtPm1vcmVfZGF0YV9hY2sgPDwgMCApOworICAgICAgICB0bXAxMzBfXyB8PSAoIHBTcmMtPm1heF9zcF9sZW5ndGggPDwgMSApOworICAgICAgICB0bXAxMzBfXyB8PSAoIHBTcmMtPnFhY2sgPDwgMyApOworICAgICAgICB0bXAxMzBfXyB8PSAoIHBTcmMtPmFjYmVfdWFwc2QgPDwgNCApOworICAgICAgICB0bXAxMzBfXyB8PSAoIHBTcmMtPmFjYmtfdWFwc2QgPDwgNSApOworICAgICAgICB0bXAxMzBfXyB8PSAoIHBTcmMtPmFjdmlfdWFwc2QgPDwgNiApOworICAgICAgICB0bXAxMzBfXyB8PSAoIHBTcmMtPmFjdm9fdWFwc2QgPDwgNyApOworICAgICAgICAqcEJ1ZiA9IHRtcDEzMF9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnICA9IDEgCisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVFPU0NhcHNTdGF0aW9uLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVRdWlldCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUXVpZXQgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSA2OworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNDA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5jb3VudDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnBlcmlvZDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5kdXJhdGlvbiwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+b2Zmc2V0LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llUXVpZXQuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVJDUElJRSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVJDUElJRSAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDE7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA1MzsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnJjcGk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVJDUElJRS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUklDRGF0YURlc2ModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVJJQ0RhdGFEZXNjICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgc3RhdHVzID0gZG90MTFmR2V0UGFja2VkSUVSSUNEYXRhRGVzYyhwQ3R4LCBwU3JjLCAmbk5lZWRlZCk7CisgICAgaWYgKCAhIERPVDExRl9TVUNDRUVERUQoIHN0YXR1cyApICkgcmV0dXJuIHN0YXR1czsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LAorICAgICAgICAgICh0QU5JX1U4KilwU3JjLAorICAgICAgICAgIHBCdWYsCisgICAgICAgICAgbkJ1ZiwKKyAgICAgICAgICBwbkNvbnN1bWVkLAorICAgICAgICAgIEZGU19SSUNEYXRhRGVzYywKKyAgICAgICAgICBJRVNfUklDRGF0YURlc2MpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llUklDRGF0YURlc2MuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVJTTih0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVJTTiAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTE2IHRtcDEzMV9fOworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFUlNOKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNDg7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+dmVyc2lvbiwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgRE9UMTFGX01FTUNQWShwQ3R4LCBwQnVmLCBwU3JjLT5ncF9jaXBoZXJfc3VpdGUsIDQpOworICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICBwQnVmICs9IDQ7CisgICAgICAgIGlmICggcFNyYy0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ICkgICAgICAgIHsKKyAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCwgMCk7CisgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+cHdpc2VfY2lwaGVyX3N1aXRlcyApLCAoIHBTcmMtPnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCAqIDQgKSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9ICggcFNyYy0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ICogNCApOworICAgICAgICBwQnVmICs9ICggcFNyYy0+cHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50ICogNCApOworICAgICAgICBpZiAoIHBTcmMtPmFrbV9zdWl0ZV9jb3VudCApICAgICAgICB7CisgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5ha21fc3VpdGVfY291bnQsIDApOworICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGJyZWFrOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPmFrbV9zdWl0ZXMgKSwgKCBwU3JjLT5ha21fc3VpdGVfY291bnQgKiA0ICkpOworICAgICAgICAqcG5Db25zdW1lZCArPSAoIHBTcmMtPmFrbV9zdWl0ZV9jb3VudCAqIDQgKTsKKyAgICAgICAgcEJ1ZiArPSAoIHBTcmMtPmFrbV9zdWl0ZV9jb3VudCAqIDQgKTsKKyAgICAgICAgdG1wMTMxX18gPSAwVTsKKyAgICAgICAgdG1wMTMxX18gfD0gKCBwU3JjLT5wcmVhdXRoIDw8IDAgKTsKKyAgICAgICAgdG1wMTMxX18gfD0gKCBwU3JjLT5ub19wd2lzZSA8PCAxICk7CisgICAgICAgIHRtcDEzMV9fIHw9ICggcFNyYy0+UFRLU0FfcmVwbGF5X2NvdW50ZXIgPDwgMiApOworICAgICAgICB0bXAxMzFfXyB8PSAoIHBTcmMtPkdUS1NBX3JlcGxheV9jb3VudGVyIDw8IDQgKTsKKyAgICAgICAgdG1wMTMxX18gfD0gKCBwU3JjLT5yZXNlcnZlZCA8PCA2ICk7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDEzMV9fLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09ICAyIDsKKyAgICAgICAgaWYgKCBwU3JjLT5wbWtpZF9jb3VudCApICAgICAgICB7CisgICAgICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5wbWtpZF9jb3VudCwgMCk7CisgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+cG1raWQgKSwgKCBwU3JjLT5wbWtpZF9jb3VudCAqIDE2ICkpOworICAgICAgICAqcG5Db25zdW1lZCArPSAoIHBTcmMtPnBta2lkX2NvdW50ICogMTYgKTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVJTTi4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llUlNOSUlFKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUlNOSUlFICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDY1OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+cnNuaTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llUlNOSUlFLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVSU05PcGFxdWUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVSU05PcGFxdWUgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAgcFNyYy0+bnVtX2RhdGE7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA0ODsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPmRhdGEgKSwgcFNyYy0+bnVtX2RhdGEpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fZGF0YTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llUlNOT3BhcXVlLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVTdXBwQ2hhbm5lbHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTdXBwQ2hhbm5lbHMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAgcFNyYy0+bnVtX2JhbmRzICogMjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDM2OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+YmFuZHMgKSwgKCBwU3JjLT5udW1fYmFuZHMgKiAyICkpOworICAgICAgICAqcG5Db25zdW1lZCArPSAoIHBTcmMtPm51bV9iYW5kcyAqIDIgKTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llU3VwcENoYW5uZWxzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVTdXBwUmF0ZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTdXBwUmF0ZXMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAgcFNyYy0+bnVtX3JhdGVzOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPnJhdGVzICksIHBTcmMtPm51bV9yYXRlcyk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9yYXRlczsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llU3VwcFJhdGVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVUSU0odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUSU0gKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAgKHBTcmMtPm51bV92Ym1wICsgMyk7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA1OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+ZHRpbV9jb3VudDsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPmR0aW1fcGVyaW9kOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+Ym1wY3RsOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+dmJtcCApLCBwU3JjLT5udW1fdmJtcCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV92Ym1wOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVUSU0uICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVRQQ1JlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVRQQ1JlcG9ydCAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIG5OZWVkZWQgICs9IDI7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAzNTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnR4X3Bvd2VyOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+bGlua19tYXJnaW47CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVRQQ1JlcG9ydC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llVFBDUmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUUENSZXF1ZXN0ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMDsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDM0OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llVFBDUmVxdWVzdC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV0FQSSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXQVBJICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VMTYgdG1wMTMyX187CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgc3RhdHVzID0gZG90MTFmR2V0UGFja2VkSUVXQVBJKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gNjg7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+dmVyc2lvbiwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YWttX3N1aXRlX2NvdW50LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPmFrbV9zdWl0ZXMgKSwgKCBwU3JjLT5ha21fc3VpdGVfY291bnQgKiA0ICkpOworICAgICAgICAqcG5Db25zdW1lZCArPSAoIHBTcmMtPmFrbV9zdWl0ZV9jb3VudCAqIDQgKTsKKyAgICAgICAgcEJ1ZiArPSAoIHBTcmMtPmFrbV9zdWl0ZV9jb3VudCAqIDQgKTsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+dW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+dW5pY2FzdF9jaXBoZXJfc3VpdGVzICksICggcFNyYy0+dW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQgKiA0ICkpOworICAgICAgICAqcG5Db25zdW1lZCArPSAoIHBTcmMtPnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50ICogNCApOworICAgICAgICBwQnVmICs9ICggcFNyYy0+dW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQgKiA0ICk7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+bXVsdGljYXN0X2NpcGhlcl9zdWl0ZSwgNCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDQ7CisgICAgICAgIHBCdWYgKz0gNDsKKyAgICAgICAgdG1wMTMyX18gPSAwVTsKKyAgICAgICAgdG1wMTMyX18gfD0gKCBwU3JjLT5wcmVhdXRoIDw8IDAgKTsKKyAgICAgICAgdG1wMTMyX18gfD0gKCBwU3JjLT5yZXNlcnZlZCA8PCAxICk7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHRtcDEzMl9fLCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICBuQnVmIC09ICAyIDsKKyAgICAgICAgaWYgKCBwU3JjLT5ia2lkX2NvdW50ICkgICAgICAgIHsKKyAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmJraWRfY291bnQsIDApOworICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGJyZWFrOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPmJraWQgKSwgKCBwU3JjLT5ia2lkX2NvdW50ICogMTYgKSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9ICggcFNyYy0+YmtpZF9jb3VudCAqIDE2ICk7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVXQVBJLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXQVBJT3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdBUElPcGFxdWUgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAgcFNyYy0+bnVtX2RhdGE7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSA2ODsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPmRhdGEgKSwgcFNyYy0+bnVtX2RhdGEpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fZGF0YTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llV0FQSU9wYXF1ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV0ZBVFBDKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV0ZBVFBDICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gMjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHhmMjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg4OworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnR4UG93ZXI7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5saW5rTWFyZ2luOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVXRkFUUEMuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdNTUNhcHModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NQ2FwcyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTggdG1wMTMzX187CisgICAgbk5lZWRlZCAgKz0gMjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHhmMjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDU7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnZlcnNpb247CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgdG1wMTMzX18gPSAwVTsKKyAgICAgICAgdG1wMTMzX18gfD0gKCBwU3JjLT5yZXNlcnZlZCA8PCAwICk7CisgICAgICAgIHRtcDEzM19fIHw9ICggcFNyYy0+cWFjayA8PCA0ICk7CisgICAgICAgIHRtcDEzM19fIHw9ICggcFNyYy0+cXVldWVfcmVxdWVzdCA8PCA1ICk7CisgICAgICAgIHRtcDEzM19fIHw9ICggcFNyYy0+dHhvcF9yZXF1ZXN0IDw8IDYgKTsKKyAgICAgICAgdG1wMTMzX18gfD0gKCBwU3JjLT5tb3JlX2FjayA8PCA3ICk7CisgICAgICAgICpwQnVmID0gdG1wMTMzX187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgID0gMSAKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llV01NQ2Fwcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV01NSW5mb0FwKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NSW5mb0FwICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VOCB0bXAxMzRfXzsKKyAgICBuTmVlZGVkICArPSAyOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweGYyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gcFNyYy0+dmVyc2lvbjsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICB0bXAxMzRfXyA9IDBVOworICAgICAgICB0bXAxMzRfXyB8PSAoIHBTcmMtPnBhcmFtX3NldF9jb3VudCA8PCAwICk7CisgICAgICAgIHRtcDEzNF9fIHw9ICggcFNyYy0+cmVzZXJ2ZWQgPDwgNCApOworICAgICAgICB0bXAxMzRfXyB8PSAoIHBTcmMtPnVhcHNkIDw8IDcgKTsKKyAgICAgICAgKnBCdWYgPSB0bXAxMzRfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyAgPSAxIAorICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVXTU1JbmZvQXAuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdNTUluZm9TdGF0aW9uKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTggdG1wMTM1X187CisgICAgbk5lZWRlZCAgKz0gMjsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHhmMjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnZlcnNpb247CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgdG1wMTM1X18gPSAwVTsKKyAgICAgICAgdG1wMTM1X18gfD0gKCBwU3JjLT5hY3ZvX3VhcHNkIDw8IDAgKTsKKyAgICAgICAgdG1wMTM1X18gfD0gKCBwU3JjLT5hY3ZpX3VhcHNkIDw8IDEgKTsKKyAgICAgICAgdG1wMTM1X18gfD0gKCBwU3JjLT5hY2JrX3VhcHNkIDw8IDIgKTsKKyAgICAgICAgdG1wMTM1X18gfD0gKCBwU3JjLT5hY2JlX3VhcHNkIDw8IDMgKTsKKyAgICAgICAgdG1wMTM1X18gfD0gKCBwU3JjLT5yZXNlcnZlZDEgPDwgNCApOworICAgICAgICB0bXAxMzVfXyB8PSAoIHBTcmMtPm1heF9zcF9sZW5ndGggPDwgNSApOworICAgICAgICB0bXAxMzVfXyB8PSAoIHBTcmMtPnJlc2VydmVkMiA8PCA3ICk7CisgICAgICAgICpwQnVmID0gdG1wMTM1X187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgID0gMSAKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llV01NSW5mb1N0YXRpb24uICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJZVdNTVBhcmFtcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdNTVBhcmFtcyAqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VOCogcEllTGVuID0gMDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRPbkVudHJ5ID0gKnBuQ29uc3VtZWQ7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHRBTklfVTggdG1wMTM2X187CisgICAgdEFOSV9VOCB0bXAxMzdfXzsKKyAgICB0QU5JX1U4IHRtcDEzOF9fOworICAgIHRBTklfVTggdG1wMTM5X187CisgICAgdEFOSV9VOCB0bXAxNDBfXzsKKyAgICB0QU5JX1U4IHRtcDE0MV9fOworICAgIHRBTklfVTggdG1wMTQyX187CisgICAgdEFOSV9VOCB0bXAxNDNfXzsKKyAgICBuTmVlZGVkICArPSAxOTsKKyAgICB3aGlsZSAoIHBTcmMtPnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHhmMjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDE7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IHBTcmMtPnZlcnNpb247CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgKnBCdWYgPSBwU3JjLT5xb3NJbmZvOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgICpwQnVmID0gcFNyYy0+cmVzZXJ2ZWQyOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIHRtcDEzNl9fID0gMFU7CisgICAgICAgIHRtcDEzNl9fIHw9ICggcFNyYy0+YWNiZV9haWZzbiA8PCAwICk7CisgICAgICAgIHRtcDEzNl9fIHw9ICggcFNyYy0+YWNiZV9hY20gPDwgNCApOworICAgICAgICB0bXAxMzZfXyB8PSAoIHBTcmMtPmFjYmVfYWNpIDw8IDUgKTsKKyAgICAgICAgdG1wMTM2X18gfD0gKCBwU3JjLT51bnVzZWQxIDw8IDcgKTsKKyAgICAgICAgKnBCdWYgPSB0bXAxMzZfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgdG1wMTM3X18gPSAwVTsKKyAgICAgICAgdG1wMTM3X18gfD0gKCBwU3JjLT5hY2JlX2Fjd21pbiA8PCAwICk7CisgICAgICAgIHRtcDEzN19fIHw9ICggcFNyYy0+YWNiZV9hY3dtYXggPDwgNCApOworICAgICAgICAqcEJ1ZiA9IHRtcDEzN19fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hY2JlX3R4b3BsaW1pdCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgdG1wMTM4X18gPSAwVTsKKyAgICAgICAgdG1wMTM4X18gfD0gKCBwU3JjLT5hY2JrX2FpZnNuIDw8IDAgKTsKKyAgICAgICAgdG1wMTM4X18gfD0gKCBwU3JjLT5hY2JrX2FjbSA8PCA0ICk7CisgICAgICAgIHRtcDEzOF9fIHw9ICggcFNyYy0+YWNia19hY2kgPDwgNSApOworICAgICAgICB0bXAxMzhfXyB8PSAoIHBTcmMtPnVudXNlZDIgPDwgNyApOworICAgICAgICAqcEJ1ZiA9IHRtcDEzOF9fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICB0bXAxMzlfXyA9IDBVOworICAgICAgICB0bXAxMzlfXyB8PSAoIHBTcmMtPmFjYmtfYWN3bWluIDw8IDAgKTsKKyAgICAgICAgdG1wMTM5X18gfD0gKCBwU3JjLT5hY2JrX2Fjd21heCA8PCA0ICk7CisgICAgICAgICpwQnVmID0gdG1wMTM5X187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmFjYmtfdHhvcGxpbWl0LCAwKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICB0bXAxNDBfXyA9IDBVOworICAgICAgICB0bXAxNDBfXyB8PSAoIHBTcmMtPmFjdmlfYWlmc24gPDwgMCApOworICAgICAgICB0bXAxNDBfXyB8PSAoIHBTcmMtPmFjdmlfYWNtIDw8IDQgKTsKKyAgICAgICAgdG1wMTQwX18gfD0gKCBwU3JjLT5hY3ZpX2FjaSA8PCA1ICk7CisgICAgICAgIHRtcDE0MF9fIHw9ICggcFNyYy0+dW51c2VkMyA8PCA3ICk7CisgICAgICAgICpwQnVmID0gdG1wMTQwX187CisgICAgICAgICpwbkNvbnN1bWVkICs9IDE7CisgICAgICAgIHBCdWYgKz0gMTsKKyAgICAgICAgbkJ1ZiAtPSAgMSA7CisgICAgICAgIHRtcDE0MV9fID0gMFU7CisgICAgICAgIHRtcDE0MV9fIHw9ICggcFNyYy0+YWN2aV9hY3dtaW4gPDwgMCApOworICAgICAgICB0bXAxNDFfXyB8PSAoIHBTcmMtPmFjdmlfYWN3bWF4IDw8IDQgKTsKKyAgICAgICAgKnBCdWYgPSB0bXAxNDFfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YWN2aV90eG9wbGltaXQsIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIHRtcDE0Ml9fID0gMFU7CisgICAgICAgIHRtcDE0Ml9fIHw9ICggcFNyYy0+YWN2b19haWZzbiA8PCAwICk7CisgICAgICAgIHRtcDE0Ml9fIHw9ICggcFNyYy0+YWN2b19hY20gPDwgNCApOworICAgICAgICB0bXAxNDJfXyB8PSAoIHBTcmMtPmFjdm9fYWNpIDw8IDUgKTsKKyAgICAgICAgdG1wMTQyX18gfD0gKCBwU3JjLT51bnVzZWQ0IDw8IDcgKTsKKyAgICAgICAgKnBCdWYgPSB0bXAxNDJfXzsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gMTsKKyAgICAgICAgcEJ1ZiArPSAxOworICAgICAgICBuQnVmIC09ICAxIDsKKyAgICAgICAgdG1wMTQzX18gPSAwVTsKKyAgICAgICAgdG1wMTQzX18gfD0gKCBwU3JjLT5hY3ZvX2Fjd21pbiA8PCAwICk7CisgICAgICAgIHRtcDE0M19fIHw9ICggcFNyYy0+YWN2b19hY3dtYXggPDwgNCApOworICAgICAgICAqcEJ1ZiA9IHRtcDE0M19fOworICAgICAgICAqcG5Db25zdW1lZCArPSAxOworICAgICAgICBwQnVmICs9IDE7CisgICAgICAgIG5CdWYgLT0gIDEgOworICAgICAgICBmcmFtZXNodG9ucyhwQ3R4LCBwQnVmLCBwU3JjLT5hY3ZvX3R4b3BsaW1pdCwgMCk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IDI7CisgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpcEN0eDsKKyAgICBpZiAocEllTGVuKQorICAgIHsKKyAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkT25FbnRyeSAtIDI7CisgICAgfQorICAgIHJldHVybiBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKK30gLyogRW5kIGRvdDExZlBhY2tJZVdNTVBhcmFtcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV1BBKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV1BBICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgc3RhdHVzID0gZG90MTFmR2V0UGFja2VkSUVXUEEocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4ZjI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4MTsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPnZlcnNpb24sIDApOworICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICBwQnVmICs9IDI7CisgICAgICAgIGlmICggcFNyYy0+bXVsdGljYXN0X2NpcGhlcl9wcmVzZW50ICkgICAgICAgIHsKKyAgICAgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgcFNyYy0+bXVsdGljYXN0X2NpcGhlciwgNCk7CisgICAgICAgICAgICAqcG5Db25zdW1lZCArPSA0OworICAgICAgICAgICAgcEJ1ZiArPSA0OworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGlmICggcFNyYy0+dW5pY2FzdF9jaXBoZXJfY291bnQgKSAgICAgICAgeworICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+dW5pY2FzdF9jaXBoZXJfY291bnQsIDApOworICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgIHBCdWYgKz0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGJyZWFrOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPnVuaWNhc3RfY2lwaGVycyApLCAoIHBTcmMtPnVuaWNhc3RfY2lwaGVyX2NvdW50ICogNCApKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gKCBwU3JjLT51bmljYXN0X2NpcGhlcl9jb3VudCAqIDQgKTsKKyAgICAgICAgcEJ1ZiArPSAoIHBTcmMtPnVuaWNhc3RfY2lwaGVyX2NvdW50ICogNCApOworICAgICAgICBpZiAoIHBTcmMtPmF1dGhfc3VpdGVfY291bnQgKSAgICAgICAgeworICAgICAgICAgICAgZnJhbWVzaHRvbnMocEN0eCwgcEJ1ZiwgcFNyYy0+YXV0aF9zdWl0ZV9jb3VudCwgMCk7CisgICAgICAgICAgICAqcG5Db25zdW1lZCArPSAyOworICAgICAgICAgICAgcEJ1ZiArPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+YXV0aF9zdWl0ZXMgKSwgKCBwU3JjLT5hdXRoX3N1aXRlX2NvdW50ICogNCApKTsKKyAgICAgICAgKnBuQ29uc3VtZWQgKz0gKCBwU3JjLT5hdXRoX3N1aXRlX2NvdW50ICogNCApOworICAgICAgICBwQnVmICs9ICggcFNyYy0+YXV0aF9zdWl0ZV9jb3VudCAqIDQgKTsKKyAgICAgICAgaWYgKCBwU3JjLT5jYXBzICkgICAgICAgIHsKKyAgICAgICAgICAgIGZyYW1lc2h0b25zKHBDdHgsIHBCdWYsIHBTcmMtPmNhcHMsIDApOworICAgICAgICAgICAgKnBuQ29uc3VtZWQgKz0gMjsKKyAgICAgICAgICAgIC8vIGZpZWxkc0VuZEZsYWcgPSAxIAorICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVdQQS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV1BBT3BhcXVlKHRwQW5pU2lyR2xvYmFsIHBDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV1BBT3BhcXVlICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG5Db25zdW1lZE9uRW50cnkgPSAqcG5Db25zdW1lZDsKKyAgICB0QU5JX1UzMiBuTmVlZGVkID0gMFU7CisgICAgbk5lZWRlZCAgKz0gIHBTcmMtPm51bV9kYXRhOworICAgIHdoaWxlICggcFNyYy0+cHJlc2VudCApCisgICAgeworICAgICAgICBpZiAoIG5OZWVkZWQgPiBuQnVmICkgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgcEllTGVuID0gcEJ1ZjsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweGYyOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDE7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBET1QxMUZfTUVNQ1BZKHBDdHgsIHBCdWYsICYoIHBTcmMtPmRhdGEgKSwgcFNyYy0+bnVtX2RhdGEpOworICAgICAgICAqcG5Db25zdW1lZCArPSBwU3JjLT5udW1fZGF0YTsKKyAgICAgICAgLy8gZmllbGRzRW5kRmxhZyA9IDEgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwSWVMZW4pCisgICAgeworICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRPbkVudHJ5IC0gMjsKKyAgICB9CisgICAgcmV0dXJuIERPVDExRl9QQVJTRV9TVUNDRVNTOworfSAvKiBFbmQgZG90MTFmUGFja0llV1BBT3BhcXVlLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXU0ModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXU0MgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFV1NDKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwU3JjLT5wcmVzZW50KSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgbkNvbnN1bWVkU29GYXI9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4ZjI7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDQ7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19XU0MraWR4LCZpZHgpOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkLW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKyAgICAgICAgICAgIHBCdWYrPW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgIG5CdWYtPW5Db25zdW1lZE5vdzsKKyAgICAgICAgfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llV1NDLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXc2NBc3NvY1JlcSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV3NjQXNzb2NSZXEgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFV3NjQXNzb2NSZXEocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBTcmMtPnByZXNlbnQpIHsKKyAgICAgICAgZG8geworICAgICAgICBuQ29uc3VtZWRTb0Zhcj0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHhmMjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1dzY0Fzc29jUmVxK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVdzY0Fzc29jUmVxLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXc2NBc3NvY1Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV3NjQXNzb2NSZXMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFV3NjQXNzb2NSZXMocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBTcmMtPnByZXNlbnQpIHsKKyAgICAgICAgZG8geworICAgICAgICBuQ29uc3VtZWRTb0Zhcj0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHhmMjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1dzY0Fzc29jUmVzK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVdzY0Fzc29jUmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXc2NCZWFjb24odHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXc2NCZWFjb24gKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFV3NjQmVhY29uKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwU3JjLT5wcmVzZW50KSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgbkNvbnN1bWVkU29GYXI9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4ZjI7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDQ7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19Xc2NCZWFjb24raWR4LCZpZHgpOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkLW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKyAgICAgICAgICAgIHBCdWYrPW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgIG5CdWYtPW5Db25zdW1lZE5vdzsKKyAgICAgICAgfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llV3NjQmVhY29uLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXc2NCZWFjb25Qcm9iZVJlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbiwgaWR4ID0gMCxpZHhsYXN0OworICAgIHRBTklfVTMyIG5Db25zdW1lZFNvRmFyLCBuQ29uc3VtZWROb3c7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgdEFOSV9VMzIgbk5lZWRlZCA9IDBVOworICAgIHN0YXR1cyA9IGRvdDExZkdldFBhY2tlZElFV3NjQmVhY29uUHJvYmVSZXMocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBTcmMtPnByZXNlbnQpIHsKKyAgICAgICAgZG8geworICAgICAgICBuQ29uc3VtZWRTb0Zhcj0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHhmMjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1dzY0JlYWNvblByb2JlUmVzK2lkeCwmaWR4KTsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZC1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICAqcEllTGVuID0gKnBuQ29uc3VtZWQgLSBuQ29uc3VtZWRTb0ZhciAtIDI7CisgICAgICAgICAgICBwQnVmKz1uQ29uc3VtZWROb3c7CisgICAgICAgICAgICBuQnVmLT1uQ29uc3VtZWROb3c7CisgICAgICAgIH0gd2hpbGUgKERPVDExRl9CVUZGRVJfT1ZFUkZMT1cgPT0gc3RhdHVzICYmIGlkeGxhc3QgIT0gaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogRW5kIGRvdDExZlBhY2tJZVdzY0JlYWNvblByb2JlUmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrSWVXc2NJRU9wYXF1ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV3NjSUVPcGFxdWUgKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTgqIHBJZUxlbiA9IDA7CisgICAgdEFOSV9VMzIgbkNvbnN1bWVkT25FbnRyeSA9ICpwbkNvbnN1bWVkOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBuTmVlZGVkICArPSAgcFNyYy0+bnVtX2RhdGE7CisgICAgd2hpbGUgKCBwU3JjLT5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgKnBCdWYgPSAyMjE7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICArK3BCdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4NTA7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4ZjI7CisgICAgICAgICsrcEJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAqcEJ1ZiA9IDB4NDsKKyAgICAgICAgKytwQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgIERPVDExRl9NRU1DUFkocEN0eCwgcEJ1ZiwgJiggcFNyYy0+ZGF0YSApLCBwU3JjLT5udW1fZGF0YSk7CisgICAgICAgICpwbkNvbnN1bWVkICs9IHBTcmMtPm51bV9kYXRhOworICAgICAgICAvLyBmaWVsZHNFbmRGbGFnID0gMSAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBJZUxlbikKKyAgICB7CisgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZE9uRW50cnkgLSAyOworICAgIH0KKyAgICByZXR1cm4gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVXc2NJRU9wYXF1ZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV3NjUHJvYmVSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdzY1Byb2JlUmVxICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG4sIGlkeCA9IDAsaWR4bGFzdDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVdzY1Byb2JlUmVxKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwU3JjLT5wcmVzZW50KSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgbkNvbnN1bWVkU29GYXI9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4ZjI7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDQ7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19Xc2NQcm9iZVJlcStpZHgsJmlkeCk7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQtbkNvbnN1bWVkTm93OworICAgICAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworICAgICAgICAgICAgcEJ1Zis9bkNvbnN1bWVkTm93OworICAgICAgICAgICAgbkJ1Zi09bkNvbnN1bWVkTm93OworICAgICAgICB9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVXc2NQcm9iZVJlcS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV3NjUHJvYmVSZXModHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdzY1Byb2JlUmVzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG4sIGlkeCA9IDAsaWR4bGFzdDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVdzY1Byb2JlUmVzKHBDdHgsIHBTcmMsICZuTmVlZGVkKTsKKyAgICBpZiAoICEgRE9UMTFGX1NVQ0NFRURFRCggc3RhdHVzICkgKSByZXR1cm4gc3RhdHVzOworICAgIGlmICggbk5lZWRlZCA+IG5CdWYgKSByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAodm9pZClwQ3R4OworICAgIGlmIChwU3JjLT5wcmVzZW50KSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgbkNvbnN1bWVkU29GYXI9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICAqcEJ1ZiA9IDIyMTsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBwSWVMZW4gPSBwQnVmOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHgwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHg1MDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4ZjI7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDQ7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgbiA9ICggMjU1IC0gNCkgPCBuQnVmID8gKCAyNTUgLSA0KSA6IG5CdWY7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQ7CisgICAgICAgICAgICBpZHhsYXN0PWlkeDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBhY2tUbHZDb3JlKHBDdHgsKHRBTklfVTgqKXBTcmMscEJ1ZixuLHBuQ29uc3VtZWQsVExWU19Xc2NQcm9iZVJlcytpZHgsJmlkeCk7CisgICAgICAgICAgICBuQ29uc3VtZWROb3c9KnBuQ29uc3VtZWQtbkNvbnN1bWVkTm93OworICAgICAgICAgICAgKnBJZUxlbiA9ICpwbkNvbnN1bWVkIC0gbkNvbnN1bWVkU29GYXIgLSAyOworICAgICAgICAgICAgcEJ1Zis9bkNvbnN1bWVkTm93OworICAgICAgICAgICAgbkJ1Zi09bkNvbnN1bWVkTm93OworICAgICAgICB9IHdoaWxlIChET1QxMUZfQlVGRkVSX09WRVJGTE9XID09IHN0YXR1cyAmJiBpZHhsYXN0ICE9IGlkeCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIEVuZCBkb3QxMWZQYWNrSWVXc2NQcm9iZVJlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0llV3NjUmVhc3NvY1Jlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXc2NSZWFzc29jUmVzICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiBuQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1U4KiBwSWVMZW4gPSAwOworICAgIHRBTklfVTMyIG4sIGlkeCA9IDAsaWR4bGFzdDsKKyAgICB0QU5JX1UzMiBuQ29uc3VtZWRTb0ZhciwgbkNvbnN1bWVkTm93OworICAgIHRBTklfVTMyIHN0YXR1cyA9IERPVDExRl9QQVJTRV9TVUNDRVNTOworICAgIHRBTklfVTMyIG5OZWVkZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBkb3QxMWZHZXRQYWNrZWRJRVdzY1JlYXNzb2NSZXMocEN0eCwgcFNyYywgJm5OZWVkZWQpOworICAgIGlmICggISBET1QxMUZfU1VDQ0VFREVEKCBzdGF0dXMgKSApIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCBuTmVlZGVkID4gbkJ1ZiApIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICh2b2lkKXBDdHg7CisgICAgaWYgKHBTcmMtPnByZXNlbnQpIHsKKyAgICAgICAgZG8geworICAgICAgICBuQ29uc3VtZWRTb0Zhcj0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgICpwQnVmID0gMjIxOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgIHBJZUxlbiA9IHBCdWY7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDA7CisgICAgICAgICAgICArK3BCdWY7IC0tbkJ1ZjsgKysoKnBuQ29uc3VtZWQpOworICAgICAgICAgICAgKnBCdWYgPSAweDUwOworICAgICAgICAgICAgKytwQnVmOyAtLW5CdWY7ICsrKCpwbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICpwQnVmID0gMHhmMjsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICAqcEJ1ZiA9IDB4NDsKKyAgICAgICAgICAgICsrcEJ1ZjsgLS1uQnVmOyArKygqcG5Db25zdW1lZCk7CisgICAgICAgICAgICBuID0gKCAyNTUgLSA0KSA8IG5CdWYgPyAoIDI1NSAtIDQpIDogbkJ1ZjsKKyAgICAgICAgICAgIG5Db25zdW1lZE5vdz0qcG5Db25zdW1lZDsKKyAgICAgICAgICAgIGlkeGxhc3Q9aWR4OworICAgICAgICAgICAgc3RhdHVzID0gUGFja1RsdkNvcmUocEN0eCwodEFOSV9VOCopcFNyYyxwQnVmLG4scG5Db25zdW1lZCxUTFZTX1dzY1JlYXNzb2NSZXMraWR4LCZpZHgpOworICAgICAgICAgICAgbkNvbnN1bWVkTm93PSpwbkNvbnN1bWVkLW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgICpwSWVMZW4gPSAqcG5Db25zdW1lZCAtIG5Db25zdW1lZFNvRmFyIC0gMjsKKyAgICAgICAgICAgIHBCdWYrPW5Db25zdW1lZE5vdzsKKyAgICAgICAgICAgIG5CdWYtPW5Db25zdW1lZE5vdzsKKyAgICAgICAgfSB3aGlsZSAoRE9UMTFGX0JVRkZFUl9PVkVSRkxPVyA9PSBzdGF0dXMgJiYgaWR4bGFzdCAhPSBpZHgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBFbmQgZG90MTFmUGFja0llV3NjUmVhc3NvY1Jlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0FkZEJBUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBZGRCQVJlcSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19BZGRCQVJlcSwgSUVTX0FkZEJBUmVxKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgiUGFja2VkIHRoZSBBZGRCQVJlcTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSRVEpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgiQWRkQkFQYXJhbWV0ZXJTZXQ6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksIEZSRkwoImFtc2R1U3VwcG9ydGVkICgxKTogJWRcbiIpLCBwRnJtLT5BZGRCQVBhcmFtZXRlclNldC5hbXNkdVN1cHBvcnRlZCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksIEZSRkwoInBvbGljeSAoMSk6ICVkXG4iKSwgcEZybS0+QWRkQkFQYXJhbWV0ZXJTZXQucG9saWN5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgidGlkICg0KTogJWRcbiIpLCBwRnJtLT5BZGRCQVBhcmFtZXRlclNldC50aWQpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSRVEpLCBGUkZMKCJidWZmZXJTaXplICgxMCk6ICVkXG4iKSwgcEZybS0+QWRkQkFQYXJhbWV0ZXJTZXQuYnVmZmVyU2l6ZSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJFUSksIEZSRkwoIkJBVGltZW91dDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkJBVGltZW91dC50aW1lb3V0LCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgiQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgiZnJhZ051bWJlciAoNCk6ICVkXG4iKSwgcEZybS0+QkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbC5mcmFnTnVtYmVyKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgRlJGTCgic3NuICgxMik6ICVkXG4iKSwgcEZybS0+QkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbC5zc24pOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSRVEpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUkVRKSwgcEJ1ZiwgbkJ1Zik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0FkZEJBUmVxLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrQWRkQkFSc3AodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkFkZEJBUnNwICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0FkZEJBUnNwLCBJRVNfQWRkQkFSc3ApOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCBGUkZMKCJQYWNrZWQgdGhlIEFkZEJBUnNwOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCBGUkZMKCJTdGF0dXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksICggdEFOSV9VOCogKSZwRnJtLT5TdGF0dXMuc3RhdHVzLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgRlJGTCgiQWRkQkFQYXJhbWV0ZXJTZXQ6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksIEZSRkwoImFtc2R1U3VwcG9ydGVkICgxKTogJWRcbiIpLCBwRnJtLT5BZGRCQVBhcmFtZXRlclNldC5hbXNkdVN1cHBvcnRlZCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksIEZSRkwoInBvbGljeSAoMSk6ICVkXG4iKSwgcEZybS0+QWRkQkFQYXJhbWV0ZXJTZXQucG9saWN5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgRlJGTCgidGlkICg0KTogJWRcbiIpLCBwRnJtLT5BZGRCQVBhcmFtZXRlclNldC50aWQpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREQkFSU1ApLCBGUkZMKCJidWZmZXJTaXplICgxMCk6ICVkXG4iKSwgcEZybS0+QWRkQkFQYXJhbWV0ZXJTZXQuYnVmZmVyU2l6ZSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksIEZSRkwoIkJBVGltZW91dDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgKCB0QU5JX1U4KiApJnBGcm0tPkJBVGltZW91dC50aW1lb3V0LCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FEREJBUlNQKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERCQVJTUCksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tBZGRCQVJzcC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0FkZFRTUmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQWRkVFNSZXF1ZXN0ICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0FkZFRTUmVxdWVzdCwgSUVTX0FkZFRTUmVxdWVzdCk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJQYWNrZWQgdGhlIEFkZFRTUmVxdWVzdDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIlRTUEVDOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlRTUEVDLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+VFNQRUMudHNpZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5UU1BFQy5kaXJlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPlRTUEVDLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5UU1BFQy5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5UU1BFQy5wc2IpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInRzaW5mb19hY2tfcG9sICgyKTogJWRcbiIpLCBwRnJtLT5UU1BFQy50c2luZm9fYWNrX3BvbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgic2NoZWR1bGUgKDEpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnNjaGVkdWxlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJ1bnVzZWQgKDcpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnVudXNlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgic2l6ZSAoMTUpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnNpemUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5UU1BFQy5maXhlZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5taW5fc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLnN1c3BlbnNpb25faW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLm1lYW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMuZGVsYXlfYm91bmQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLm1lZGl1bV90aW1lLCAyKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+bnVtX1RDTEFTOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJUQ0xBU1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlRDTEFTW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0udXNlcl9wcmlvcml0eSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uY2xhc3NpZmllcl9tYXNrLCAxKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5FdGhQYXJhbXMuZGVzdCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnR5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucHJvdG8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmZsb3dfbGFiZWwsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiVENMQVNTUFJPQzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5UQ0xBU1NQUk9DLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNTUFJPQy5wcm9jZXNzaW5nLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiV01NVFNQRUM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NVFNQRUMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHNpZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5kaXJlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5wc2IpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoInRzaW5mb19hY2tfcG9sICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2luZm9fYWNrX3BvbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgidHNpbmZvX3JzdmQgKDcpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRzaW5mb19yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJidXJzdF9zaXplX2RlZm4gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmJ1cnN0X3NpemVfZGVmbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgic2l6ZSAoMTUpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnNpemUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5maXhlZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5taW5fc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnN1c3BlbnNpb25faW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1lYW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuZGVsYXlfYm91bmQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1lZGl1bV90aW1lLCAyKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+bnVtX1dNTVRDTEFTOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJXTU1UQ0xBU1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldNTVRDTEFTW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0udmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS51c2VyX3ByaW9yaXR5LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5jbGFzc2lmaWVyX21hc2ssIDEpOworICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+V01NVENMQVNbaV0uY2xhc3NpZmllcl90eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5FdGhQYXJhbXMudHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuRFNDUCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc291cmNlLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJXTU1UQ0xBU1BST0M6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NVENMQVNQUk9DLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNQUk9DLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1BST0MucHJvY2Vzc2luZywgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIkNDWFRyYWZTdHJtUmF0ZVNldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQudHNpZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgRlJGTCgibnVtX3RzcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkNDWFRyYWZTdHJtUmF0ZVNldC5udW1fdHNyYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPkNDWFRyYWZTdHJtUmF0ZVNldC50c3JhdGVzLCBwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQubnVtX3RzcmF0ZXMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFUVVFU1QpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tBZGRUU1JlcXVlc3QuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tBZGRUU1Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBZGRUU1Jlc3BvbnNlICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0FkZFRTUmVzcG9uc2UsIElFU19BZGRUU1Jlc3BvbnNlKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJQYWNrZWQgdGhlIEFkZFRTUmVzcG9uc2U6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiU3RhdHVzOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5TdGF0dXMuc3RhdHVzLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJUU0RlbGF5OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlRTRGVsYXkucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTRGVsYXkuZGVsYXksIDQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiVFNQRUM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VFNQRUMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5UU1BFQy50c2lkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5UU1BFQy5kaXJlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5UU1BFQy5wc2IpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgic2NoZWR1bGUgKDEpOiAlZFxuIiksIHBGcm0tPlRTUEVDLnNjaGVkdWxlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgidW51c2VkICg3KTogJWRcbiIpLCBwRnJtLT5UU1BFQy51bnVzZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+VFNQRUMuc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5UU1BFQy5maXhlZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UU1BFQy5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5udW1fVENMQVM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJUQ0xBU1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlRDTEFTW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS51c2VyX3ByaW9yaXR5LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmNsYXNzaWZpZXJfbWFzaywgMSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5FdGhQYXJhbXMuZGVzdCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy50eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UQ0xBU1tpXS5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIlRDTEFTU1BST0M6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VENMQVNTUFJPQy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VENMQVNTUFJPQy5wcm9jZXNzaW5nLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIlNjaGVkdWxlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlNjaGVkdWxlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5TY2hlZHVsZS5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlNjaGVkdWxlLnRzaWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlNjaGVkdWxlLmRpcmVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg5KTogJWRcbiIpLCBwRnJtLT5TY2hlZHVsZS5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5TY2hlZHVsZS5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+U2NoZWR1bGUuc2VydmljZV9pbnRlcnZhbCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5TY2hlZHVsZS5tYXhfc2VydmljZV9kdXIsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+U2NoZWR1bGUuc3BlY19pbnRlcnZhbCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJXTU1UU0RlbGF5OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTVRTRGVsYXkucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTRGVsYXkudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU0RlbGF5LmRlbGF5LCA0KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIldNTVNjaGVkdWxlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTVNjaGVkdWxlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1TY2hlZHVsZS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPldNTVNjaGVkdWxlLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+V01NU2NoZWR1bGUudHNpZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+V01NU2NoZWR1bGUuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDkpOiAlZFxuIiksIHBGcm0tPldNTVNjaGVkdWxlLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVNjaGVkdWxlLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1TY2hlZHVsZS5zZXJ2aWNlX2ludGVydmFsLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVNjaGVkdWxlLm1heF9zZXJ2aWNlX2R1ciwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1TY2hlZHVsZS5zcGVjX2ludGVydmFsLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIldNTVRTUEVDOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTVRTUEVDLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2lkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5kaXJlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5wc2IpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgidHNpbmZvX3JzdmQgKDcpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRzaW5mb19yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiYnVyc3Rfc2l6ZV9kZWZuICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5idXJzdF9zaXplX2RlZm4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5maXhlZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5udW1fV01NVENMQVM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJXTU1UQ0xBU1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldNTVRDTEFTW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS51c2VyX3ByaW9yaXR5LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfbWFzaywgMSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5XTU1UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuZGVzdCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy50eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5EU0NQLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UQ0xBU1tpXS5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIldNTVRDTEFTUFJPQzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1UQ0xBU1BST0MucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTUFJPQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRDTEFTUFJPQy5wcm9jZXNzaW5nLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksIEZSRkwoIkNDWFRyYWZTdHJtTWV0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFRyYWZTdHJtTWV0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC50c2lkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnN0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0Lm1zbXRfaW50ZXJ2YWwsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BRERUU1JFU1BPTlNFKSwgcEJ1ZiwgbkJ1Zik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0FkZFRTUmVzcG9uc2UuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tBc3NvY1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkFzc29jUmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19Bc3NvY1JlcXVlc3QsIElFU19Bc3NvY1JlcXVlc3QpOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiUGFja2VkIHRoZSBBc3NvY1JlcXVlc3Q6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJDYXBhYmlsaXRpZXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJlc3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5lc3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiaWJzcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmlic3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiY2ZQb2xsYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNmUG9sbGFibGUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiY2ZQb2xsUmVxICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsUmVxKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInByaXZhY3kgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wcml2YWN5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInNob3J0UHJlYW1ibGUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zaG9ydFByZWFtYmxlKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInBiY2MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wYmNjKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImNoYW5uZWxBZ2lsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2hhbm5lbEFnaWxpdHkpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgic3BlY3RydW1NZ3QgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zcGVjdHJ1bU1ndCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJxb3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5xb3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgic2hvcnRTbG90VGltZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0U2xvdFRpbWUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmFwc2QpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicnJtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucnJtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImRzc3NPZmRtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZHNzc09mZG0pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZGVsYXllZEJBKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImltbWVkaWF0ZUJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaW1tZWRpYXRlQkEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTGlzdGVuSW50ZXJ2YWw6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TGlzdGVuSW50ZXJ2YWwuaW50ZXJ2YWwsIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiU1NJRDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TU0lELnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlNTSUQuc3NpZCwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlN1cHBSYXRlcy5yYXRlcywgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkV4dFN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FeHRTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPkV4dFN1cHBSYXRlcy5yYXRlcywgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlBvd2VyQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Qb3dlckNhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Qb3dlckNhcHMubWluVHhQb3dlciwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlBvd2VyQ2Fwcy5tYXhUeFBvd2VyLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiU3VwcENoYW5uZWxzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlN1cHBDaGFubmVscy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2JhbmRzOiAlZC5cbiIpLCBwRnJtLT5TdXBwQ2hhbm5lbHMubnVtX2JhbmRzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+U3VwcENoYW5uZWxzLmJhbmRzLCAyICogcEZybS0+U3VwcENoYW5uZWxzLm51bV9iYW5kcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlJTTk9wYXF1ZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SU05PcGFxdWUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm51bV9kYXRhOiAlZC5cbiIpLCBwRnJtLT5SU05PcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5SU05PcGFxdWUuZGF0YSwgcEZybS0+UlNOT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiUU9TQ2Fwc1N0YXRpb246XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UU9TQ2Fwc1N0YXRpb24ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm1vcmVfZGF0YV9hY2sgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLm1vcmVfZGF0YV9hY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm1heF9zcF9sZW5ndGggKDIpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLm1heF9zcF9sZW5ndGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInFhY2sgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLnFhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmVfdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLmFjYmVfdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLmFjYmtfdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLmFjdmlfdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdm9fdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLmFjdm9fdWFwc2QpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJSUk1FbmFibGVkQ2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJSTUVuYWJsZWRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkxpbmtNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MaW5rTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5laWdoYm9yUnB0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5laWdoYm9yUnB0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJwYXJhbGxlbCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5wYXJhbGxlbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVwZWF0ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVwZWF0ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkJlYWNvblBhc3NpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUGFzc2l2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiQmVhY29uQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvbkFjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiQmVhY29uVGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uVGFibGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkJlYWNvblJlcENvbmQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUmVwQ29uZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiRnJhbWVNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5GcmFtZU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJDaGFubmVsTG9hZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5DaGFubmVsTG9hZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm9pc2VIaXN0b2dyYW0gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTm9pc2VIaXN0b2dyYW0pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInN0YXRpc3RpY3MgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuc3RhdGlzdGljcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTENJTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkxDSUF6aW11dGggKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJQXppbXV0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiVENNQ2FwYWJpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5UQ01DYXBhYmlsaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0cmlnZ2VyZWRUQ00gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAudHJpZ2dlcmVkVENNKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJBUENoYW5SZXBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQVBDaGFuUmVwb3J0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJSUk1NSUJFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJSTU1JQkVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm9wZXJhdGluZ0NoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAub3BlcmF0aW5nQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibm9uT3BlcmF0aW5DaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLm5vbk9wZXJhdGluQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90RW5hYmxlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90RW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTmVpZ2hib3JUU0ZPZmZzZXQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JUU0ZPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlJDUElNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SQ1BJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlJTTklNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SU05JTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkJzc0F2Z0FjY2Vzc0RlbGF5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJzc0F2Z0FjY2Vzc0RlbGF5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJCU1NBdmFpbEFkbWlzc2lvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CU1NBdmFpbEFkbWlzc2lvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiQW50ZW5uYUluZm9ybWF0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkFudGVubmFJbmZvcm1hdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJNb2JpbGl0eURvbWFpbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1vYmlsaXR5RG9tYWluLk1ESUQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm92ZXJEU0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ub3ZlckRTQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNvdXJjZVJlcUNhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ucmVzb3VyY2VSZXFDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIldQQU9wYXF1ZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XUEFPcGFxdWUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm51bV9kYXRhOiAlZC5cbiIpLCBwRnJtLT5XUEFPcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5XUEFPcGFxdWUuZGF0YSwgcEZybS0+V1BBT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiSFRDYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWR2Q29kaW5nQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYWR2Q29kaW5nQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm1pbW9Qb3dlclNhdmUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5taW1vUG93ZXJTYXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJncmVlbkZpZWxkICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZ3JlZW5GaWVsZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgic2hvcnRHSTIwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTIwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJzaG9ydEdJNDBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zaG9ydEdJNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInR4U1RCQyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicnhTVEJDICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5kZWxheWVkQkEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm1heGltYWxBTVNEVXNpemUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJkc3NzQ2NrTW9kZTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZHNzc0Nja01vZGU0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicHNtcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBzbXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInN0YmNDb250cm9sRnJhbWUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdGJjQ29udHJvbEZyYW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm1heFJ4QU1QRFVGYWN0b3IgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJtcGR1RGVuc2l0eSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1wZHVEZW5zaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDEgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5IVENhcHMuc3VwcG9ydGVkTUNTU2V0LCAxNik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicGNvICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucGNvKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0cmFuc2l0aW9uVGltZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnRyYW5zaXRpb25UaW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDIgKDUpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm1jc0ZlZWRiYWNrICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWNzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMyAoNik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgidHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInJ4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0eFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicnhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgidHhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiaW1wbGljaXRUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuaW1wbGljaXRUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJjYWxpYnJhdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNhbGlicmF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENTSVR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSVR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJleHBsaWNpdEJGQ1NJRmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdEJGQ1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImNzaU51bUJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jc2lOdW1CRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDQgKDcpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFudGVubmFTZWxlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hU2VsZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyeEFTICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhBUyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgidHhTb3VuZGluZ1BQRFVzICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTb3VuZGluZ1BQRFVzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5IVENhcHMucnN2ZCwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiV01NQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1DYXBzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NQ2Fwcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZCAoNCk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicWFjayAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5xYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJxdWV1ZV9yZXF1ZXN0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnF1ZXVlX3JlcXVlc3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInR4b3BfcmVxdWVzdCAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy50eG9wX3JlcXVlc3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm1vcmVfYWNrICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLm1vcmVfYWNrKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiV01NSW5mb1N0YXRpb246XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NSW5mb1N0YXRpb24ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1JbmZvU3RhdGlvbi52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZvX3VhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5hY3ZvX3VhcHNkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZpX3VhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5hY3ZpX3VhcHNkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JrX3VhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5hY2JrX3VhcHNkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JlX3VhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5hY2JlX3VhcHNkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZDEgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9TdGF0aW9uLnJlc2VydmVkMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibWF4X3NwX2xlbmd0aCAoMik6ICVkXG4iKSwgcEZybS0+V01NSW5mb1N0YXRpb24ubWF4X3NwX2xlbmd0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQyICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5yZXNlcnZlZDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJBaXJnbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiUHJvcFN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiQVBOYW1lOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5BUE5hbWUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm51bV9uYW1lOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5BUE5hbWUubnVtX25hbWUpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uQVBOYW1lLm5hbWUsIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiSENGOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5IQ0YucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5IQ0YuZW5hYmxlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiV0RTOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5XRFMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm51bV93ZHNEYXRhOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uV0RTLndkc0RhdGEsIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiQlBJbmRpY2F0b3I6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IuaW5kaWNhdG9yLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLnR5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIkxvYWRJbmZvOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRJbmZvLm51bV9zdGFzLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRJbmZvLmNoYW5uZWxfdXRpbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTG9hZEJhbGFuY2U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuYnNzaWQsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiUHJvcEFzc29jVHlwZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcEFzc29jVHlwZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTExBdHRyOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5MTEF0dHIucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5MTEF0dHIuZGVmZXJfdGhyZXNob2xkLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJQcm9wQ2FwYWJpbGl0eTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJWZXJzaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5WZXJzaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jaGlwX3JldiwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5WZXJzaW9uLmNhcmRfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm51bV9idWlsZF92ZXJzaW9uOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlZlcnNpb24uYnVpbGRfdmVyc2lvbiwgcEZybS0+QWlyZ28uVmVyc2lvbi5udW1fYnVpbGRfdmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiUHJvcEVEQ0FQYXJhbXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucW9zLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmVfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JlX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JlX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNia19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ1bnVzZWQzICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2aV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2aV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoImFjdm9fYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZvX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZvX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIlRpdGFuOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UaXRhbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbmNhdF90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5jb21wcmVzc2lvbl90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5jYl9zdGF0ZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5yZXZfZmNzX3N0YXRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJQcm9wQ2hhbm5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5tb2RlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5wcmltYXJ5X2NoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnN1Yl9iYW5kLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5jaGFubmVsX3N3aXRjaF9jb3VudCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiUHJvcFF1aWV0QlNTOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfY291bnQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X3BlcmlvZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X29mZnNldCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiVHJpZ2dlclN0YUJnU2NhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4uZW5hYmxlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJUYXVydXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRhdXJ1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVRJREJpdG1hcCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UYXVydXMuYmFQb2xpY3ksIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJiYUJ1ZmZlclNpemUgKDEyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMuYmFCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicnN2ZCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLnJzdmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJXc2NJRU9wYXF1ZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Xc2NJRU9wYXF1ZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2RhdGE6ICVkLlxuIiksIHBGcm0tPldzY0lFT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+V3NjSUVPcGFxdWUuZGF0YSwgcEZybS0+V3NjSUVPcGFxdWUubnVtX2RhdGEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJXQVBJT3BhcXVlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldBUElPcGFxdWUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIm51bV9kYXRhOiAlZC5cbiIpLCBwRnJtLT5XQVBJT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+V0FQSU9wYXF1ZS5kYXRhLCBwRnJtLT5XQVBJT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiQ0NYUmFkTWdtdENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hSYWRNZ210Q2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYUmFkTWdtdENhcC5tZ210X3N0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJtYnNzaWRfbWFzayAoMyk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5tYnNzaWRfbWFzayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQgKDUpOiAlZFxuIiksIHBGcm0tPkNDWFJhZE1nbXRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJDQ1hWZXJzaW9uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hWZXJzaW9uLnZlcnNpb24sIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJQMlBJRU9wYXF1ZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBJRU9wYXF1ZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2RhdGE6ICVkLlxuIiksIHBGcm0tPlAyUElFT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQSUVPcGFxdWUuZGF0YSwgcEZybS0+UDJQSUVPcGFxdWUubnVtX2RhdGEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tBc3NvY1JlcXVlc3QuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tBc3NvY1Jlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZBc3NvY1Jlc3BvbnNlICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0Fzc29jUmVzcG9uc2UsIElFU19Bc3NvY1Jlc3BvbnNlKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJQYWNrZWQgdGhlIEFzc29jUmVzcG9uc2U6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQ2FwYWJpbGl0aWVzOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImVzcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmVzcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiaWJzcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmlic3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImNmUG9sbGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jZlBvbGxhYmxlKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJjZlBvbGxSZXEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jZlBvbGxSZXEpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInByaXZhY3kgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wcml2YWN5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzaG9ydFByZWFtYmxlICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc2hvcnRQcmVhbWJsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicGJjYyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnBiY2MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImNoYW5uZWxBZ2lsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2hhbm5lbEFnaWxpdHkpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInNwZWN0cnVtTWd0ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc3BlY3RydW1NZ3QpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInFvcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnFvcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2hvcnRTbG90VGltZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0U2xvdFRpbWUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5hcHNkKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJycm0gKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5ycm0pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImRzc3NPZmRtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZHNzc09mZG0pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImRlbGF5ZWRCQSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmRlbGF5ZWRCQSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiaW1tZWRpYXRlQkEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5pbW1lZGlhdGVCQSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiU3RhdHVzOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5TdGF0dXMuc3RhdHVzLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJBSUQ6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFJRC5hc3NvY2lkLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5TdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiRXh0U3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+RXh0U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkVEQ0FQYXJhbVNldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FRENBUGFyYW1TZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5xb3MsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlJDUElJRTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SQ1BJSUUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJDUElJRS5yY3BpLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlJTTklJRTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SU05JSUUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTklJRS5yc25pLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlJSTUVuYWJsZWRDYXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlJNRW5hYmxlZENhcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJMaW5rTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTGlua01lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTmVpZ2hib3JScHQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JScHQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJwYXJhbGxlbCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5wYXJhbGxlbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlcGVhdGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnJlcGVhdGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQmVhY29uUGFzc2l2ZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25QYXNzaXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQmVhY29uQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvbkFjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkJlYWNvblRhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvblRhYmxlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQmVhY29uUmVwQ29uZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25SZXBDb25kKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiRnJhbWVNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5GcmFtZU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQ2hhbm5lbExvYWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQ2hhbm5lbExvYWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb2lzZUhpc3RvZ3JhbSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5Ob2lzZUhpc3RvZ3JhbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInN0YXRpc3RpY3MgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuc3RhdGlzdGljcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkxDSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxDSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTENJQXppbXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lBemltdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVENNQ2FwYWJpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5UQ01DYXBhYmlsaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHJpZ2dlcmVkVENNICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnRyaWdnZXJlZFRDTSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkFQQ2hhblJlcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BUENoYW5SZXBvcnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJSUk1NSUJFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJSTU1JQkVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJvcGVyYXRpbmdDaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLm9wZXJhdGluZ0NoYW5NYXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJub25PcGVyYXRpbkNoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAubm9uT3BlcmF0aW5DaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOZWlnaGJvclRTRk9mZnNldCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5OZWlnaGJvclRTRk9mZnNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlJDUElNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SQ1BJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJSU05JTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlNOSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQnNzQXZnQWNjZXNzRGVsYXkgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQnNzQXZnQWNjZXNzRGVsYXkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJCU1NBdmFpbEFkbWlzc2lvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CU1NBdmFpbEFkbWlzc2lvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkFudGVubmFJbmZvcm1hdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BbnRlbm5hSW5mb3JtYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJNb2JpbGl0eURvbWFpbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+TW9iaWxpdHlEb21haW4uTURJRCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm92ZXJEU0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ub3ZlckRTQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzb3VyY2VSZXFDYXAgKDEpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc291cmNlUmVxQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkZUSW5mbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5GVEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDgpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIklFQ291bnQgKDgpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5JRUNvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5NSUMsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5Bbm9uY2UsIDMyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5Tbm9uY2UsIDMyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUjFLSF9JRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+RlRJbmZvLlIxS0hfSUQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5SMUtIX0lELlBNS19SMV9JRCwgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkdUSzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+RlRJbmZvLkdUSy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJrZXlJZCAoMik6ICVkXG4iKSwgcEZybS0+RlRJbmZvLkdUSy5rZXlJZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoMTQpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5HVEsucmVzZXJ2ZWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5HVEsua2V5TGVuZ3RoLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uR1RLLlJTQywgOCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fa2V5OiAlZC5cbiIpLCBwRnJtLT5GVEluZm8uR1RLLm51bV9rZXkpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkZUSW5mby5HVEsua2V5LCBwRnJtLT5GVEluZm8uR1RLLm51bV9rZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJSMEtIX0lEOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5GVEluZm8uUjBLSF9JRC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fUE1LX1IwX0lEOiAlZC5cbiIpLCBwRnJtLT5GVEluZm8uUjBLSF9JRC5udW1fUE1LX1IwX0lEKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5GVEluZm8uUjBLSF9JRC5QTUtfUjBfSUQsIHBGcm0tPkZUSW5mby5SMEtIX0lELm51bV9QTUtfUjBfSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5udW1fUklDRGF0YURlc2M7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJSSUNEYXRhRGVzY1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlJJQ0RhdGE6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEYXRhLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEYXRhLklkZW50aWZpZXIsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEYXRhLnJlc291cmNlRGVzY0NvdW50LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5zdGF0dXNDb2RlLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJSSUNEZXNjcmlwdG9yOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5yZXNvdXJjZVR5cGUsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV92YXJpYWJsZURhdGE6ICVkLlxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IubnVtX3ZhcmlhYmxlRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IudmFyaWFibGVEYXRhLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLm51bV92YXJpYWJsZURhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlRTUEVDOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMucHNiKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInNjaGVkdWxlICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zY2hlZHVsZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkICg3KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy51bnVzZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuZml4ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5udW1fVENMQVM7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVENMQVNbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLnByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS51c2VyX3ByaW9yaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5jbGFzc2lmaWVyX21hc2ssIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5FdGhQYXJhbXMudHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucHJvdG8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJUQ0xBU1NQUk9DOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNTUFJPQy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNTUFJPQy5wcm9jZXNzaW5nLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJUU0RlbGF5OlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVFNEZWxheS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNEZWxheS5kZWxheSwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiU2NoZWR1bGU6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoOSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUucmVzZXJ2ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5zZXJ2aWNlX2ludGVydmFsLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUubWF4X3NlcnZpY2VfZHVyLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuc3BlY19pbnRlcnZhbCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV01NVFNQRUM6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMucHNiKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaW5mb19yc3ZkICg3KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50c2luZm9fcnN2ZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYnVyc3Rfc2l6ZV9kZWZuICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5idXJzdF9zaXplX2RlZm4pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuZml4ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5udW1fV01NVENMQVM7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV01NVENMQVNbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLnByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLnVzZXJfcHJpb3JpdHksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uY2xhc3NpZmllcl90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfbWFzaywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLnNvdXJjZSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLmRlc3QsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy50eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuRFNDUCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmZsb3dfbGFiZWwsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVRDTEFTUFJPQzpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTUFJPQy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNQUk9DLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1BST0MucHJvY2Vzc2luZywgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV01NVFNEZWxheTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTRGVsYXkucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTRGVsYXkudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTRGVsYXkuZGVsYXksIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVNjaGVkdWxlOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUudHNpZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg5KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5yZXNlcnZlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnNlcnZpY2VfaW50ZXJ2YWwsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5tYXhfc2VydmljZV9kdXIsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5zcGVjX2ludGVydmFsLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJXUEE6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V1BBLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XUEEudmVyc2lvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XUEEubXVsdGljYXN0X2NpcGhlciwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVycywgNCAqIHBGcm0tPldQQS51bmljYXN0X2NpcGhlcl9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XUEEuYXV0aF9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5XUEEuYXV0aF9zdWl0ZXMsIDQgKiBwRnJtLT5XUEEuYXV0aF9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XUEEuY2FwcywgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJIVENhcHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+SFRDYXBzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFkdkNvZGluZ0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFkdkNvZGluZ0NhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm1pbW9Qb3dlclNhdmUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5taW1vUG93ZXJTYXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZ3JlZW5GaWVsZCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmdyZWVuRmllbGQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzaG9ydEdJMjBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zaG9ydEdJMjBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzaG9ydEdJNDBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zaG9ydEdJNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0eFNUQkMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFNUQkMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyeFNUQkMgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFNUQkMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5kZWxheWVkQkEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJtYXhpbWFsQU1TRFVzaXplICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4aW1hbEFNU0RVc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImRzc3NDY2tNb2RlNDBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5kc3NzQ2NrTW9kZTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicHNtcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBzbXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzdGJjQ29udHJvbEZyYW1lICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc3RiY0NvbnRyb2xGcmFtZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImxzaWdUWE9QUHJvdGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmxzaWdUWE9QUHJvdGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm1heFJ4QU1QRFVGYWN0b3IgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibXBkdURlbnNpdHkgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tcGR1RGVuc2l0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkMSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5IVENhcHMuc3VwcG9ydGVkTUNTU2V0LCAxNik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInBjbyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBjbyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRyYW5zaXRpb25UaW1lICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHJhbnNpdGlvblRpbWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDIgKDUpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJtY3NGZWVkYmFjayAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1jc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQzICg2KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyeFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInR4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInR4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJpbXBsaWNpdFR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5pbXBsaWNpdFR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJjYWxpYnJhdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNhbGlicmF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRDU0lUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdEJGQ1NJRmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdEJGQ1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImNzaU51bUJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jc2lOdW1CRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDQgKDcpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhbnRlbm5hU2VsZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYVNlbGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0Q1NJRmVlZGJhY2tUeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2tUeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0Q1NJRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYW50ZW5uYUluZGljZXNGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFJbmRpY2VzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyeEFTICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhBUyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInR4U291bmRpbmdQUERVcyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U291bmRpbmdQUERVcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkNSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkNSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+SFRDYXBzLnJzdmQsIHBGcm0tPkhUQ2Fwcy5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJIVEluZm86XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+SFRJbmZvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5IVEluZm8ucHJpbWFyeUNoYW5uZWwsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzZWNvbmRhcnlDaGFubmVsT2Zmc2V0ICgyKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlY29tbWVuZGVkVHhXaWR0aFNldCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlY29tbWVuZGVkVHhXaWR0aFNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJpZnNNb2RlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmlmc01vZGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJjb250cm9sbGVkQWNjZXNzT25seSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmNvbnRyb2xsZWRBY2Nlc3NPbmx5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2VydmljZUludGVydmFsR3JhbnVsYXJpdHkgKDMpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5zZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm9wTW9kZSAoMik6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm9wTW9kZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm5vbkdGRGV2aWNlc1ByZXNlbnQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5ub25HRkRldmljZXNQcmVzZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHJhbnNtaXRCdXJzdExpbWl0ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8udHJhbnNtaXRCdXJzdExpbWl0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgib2Jzc05vbkhUU3RhUHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm9ic3NOb25IVFN0YVByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoMTEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImJhc2ljU1RCQ01DUyAoNyk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmJhc2ljU1RCQ01DUyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImR1YWxDVFNQcm90ZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uZHVhbENUU1Byb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJzZWNvbmRhcnlCZWFjb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5zZWNvbmRhcnlCZWFjb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicGNvQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucGNvQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicGNvUGhhc2UgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5wY29QaGFzZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkMiAoNCk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlc2VydmVkMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5IVEluZm8uYmFzaWNNQ1NTZXQsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX3JzdmQ6ICVkLlxuIiksIHBGcm0tPkhUSW5mby5udW1fcnN2ZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5IVEluZm8ucnN2ZCwgcEZybS0+SFRJbmZvLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVBhcmFtczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1QYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5xb3NJbmZvLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5yZXNlcnZlZDIsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV01NQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1DYXBzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1DYXBzLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoNCk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInFhY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucWFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInF1ZXVlX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucXVldWVfcmVxdWVzdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInR4b3BfcmVxdWVzdCAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy50eG9wX3JlcXVlc3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJtb3JlX2FjayAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5tb3JlX2Fjayk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJDQ1hSYWRNZ210Q2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFJhZE1nbXRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFJhZE1nbXRDYXAubWdtdF9zdGF0ZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm1ic3NpZF9tYXNrICgzKTogJWRcbiIpLCBwRnJtLT5DQ1hSYWRNZ210Q2FwLm1ic3NpZF9tYXNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDUpOiAlZFxuIiksIHBGcm0tPkNDWFJhZE1nbXRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQ0NYVHJhZlN0cm1NZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVHJhZlN0cm1NZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnRzaWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQuc3RhdGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQubXNtdF9pbnRlcnZhbCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJDQ1hUeG1pdFBvd2VyOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFR4bWl0UG93ZXIucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFR4bWl0UG93ZXIucG93ZXJfbGltaXQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHhtaXRQb3dlci5yZXNlcnZlZCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9XTU1UU1BFQzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVRTUEVDWyVkXTpcbiIpLCBpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V01NVFNQRUNbaV0ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHNpZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnBzYik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaW5mb19hY2tfcG9sICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS50c2luZm9fYWNrX3BvbCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fcnN2ZCAoNyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHNpbmZvX3JzdmQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYnVyc3Rfc2l6ZV9kZWZuICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5idXJzdF9zaXplX2RlZm4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2l6ZSAoMTUpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnNpemUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLmZpeGVkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5taW5fc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0uaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnN1c3BlbnNpb25faW50LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1lYW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0uYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0uZGVsYXlfYm91bmQsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0uc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1lZGl1bV90aW1lLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkFpcmdvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlByb3BTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5yYXRlcywgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJBUE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkFQTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fbmFtZTogJWQuXG4iKSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5BUE5hbWUubmFtZSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiSENGOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5IQ0YucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkhDRi5lbmFibGVkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV0RTOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5XRFMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX3dkc0RhdGE6ICVkLlxuIiksIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uV0RTLndkc0RhdGEsIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkJQSW5kaWNhdG9yOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5CUEluZGljYXRvci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IuaW5kaWNhdG9yLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTG9hZEluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkSW5mby5udW1fc3RhcywgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8uY2hhbm5lbF91dGlsLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTG9hZEJhbGFuY2U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlByb3BBc3NvY1R5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIkxMQXR0cjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTExBdHRyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5MTEF0dHIuZGVmZXJfdGhyZXNob2xkLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUHJvcENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jaGlwX3JldiwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jYXJkX3R5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX2J1aWxkX3ZlcnNpb246ICVkLlxuIiksIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlZlcnNpb24uYnVpbGRfdmVyc2lvbiwgcEZybS0+QWlyZ28uVmVyc2lvbi5udW1fYnVpbGRfdmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlByb3BFRENBUGFyYW1zOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucW9zLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlRpdGFuOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UaXRhbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29uY2F0X3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5jb21wcmVzc2lvbl90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY2Jfc3RhdGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLnJldl9mY3Nfc3RhdGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJQcm9wQ2hhbm5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLm1vZGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5wcmltYXJ5X2NoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5zdWJfYmFuZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLmNoYW5uZWxfc3dpdGNoX2NvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUHJvcFF1aWV0QlNTOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X3BlcmlvZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfb2Zmc2V0LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVHJpZ2dlclN0YUJnU2NhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5lbmFibGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJUYXVydXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRhdXJ1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhVElEQml0bWFwLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UYXVydXMuYmFQb2xpY3ksIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYmFCdWZmZXJTaXplICgxMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLmJhQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJyc3ZkICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMucnN2ZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJXc2NBc3NvY1JlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Xc2NBc3NvY1Jlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJWZXJzaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NBc3NvY1Jlcy5WZXJzaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NBc3NvY1Jlcy5WZXJzaW9uLm1pbm9yKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NBc3NvY1Jlcy5WZXJzaW9uLm1ham9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUmVzcG9uc2VUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NBc3NvY1Jlcy5SZXNwb25zZVR5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0Fzc29jUmVzLlJlc3BvbnNlVHlwZS5yZXNUeXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVmVuZG9yRXh0ZW5zaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NBc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0Fzc29jUmVzLlZlbmRvckV4dGVuc2lvbi52ZW5kb3JJZCwgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJWZXJzaW9uMjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0Fzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQXNzb2NSZXMuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1pbm9yKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJtYWpvciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQXNzb2NSZXMuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1ham9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJBdXRob3JpemVkTUFDczpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0Fzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5BdXRob3JpemVkTUFDcy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQXNzb2NSZXMuVmVuZG9yRXh0ZW5zaW9uLkF1dGhvcml6ZWRNQUNzLm1hYywgNik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUmVxdWVzdFRvRW5yb2xsOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjQXNzb2NSZXMuVmVuZG9yRXh0ZW5zaW9uLlJlcXVlc3RUb0Vucm9sbC5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQXNzb2NSZXMuVmVuZG9yRXh0ZW5zaW9uLlJlcXVlc3RUb0Vucm9sbC5yZXEsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlAyUEFzc29jUmVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUEFzc29jUmVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoIlAyUFN0YXR1czpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQQXNzb2NSZXMuUDJQU3RhdHVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBBc3NvY1Jlcy5QMlBTdGF0dXMuc3RhdHVzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgRlJGTCgiRXh0ZW5kZWRMaXN0ZW5UaW1pbmc6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEFzc29jUmVzLkV4dGVuZGVkTGlzdGVuVGltaW5nLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBBc3NvY1Jlcy5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlQZXJpb2QsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEFzc29jUmVzLkV4dGVuZGVkTGlzdGVuVGltaW5nLmF2YWlsaWJpbGl0eUludGVydmFsLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVNTT0NSRVNQT05TRSksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tBc3NvY1Jlc3BvbnNlLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrQXV0aGVudGljYXRpb24odHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkF1dGhlbnRpY2F0aW9uICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0F1dGhlbnRpY2F0aW9uLCBJRVNfQXV0aGVudGljYXRpb24pOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJQYWNrZWQgdGhlIEF1dGhlbnRpY2F0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJBdXRoQWxnbzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkF1dGhBbGdvLmFsZ28sIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJBdXRoU2VxTm86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5BdXRoU2VxTm8ubm8sIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJTdGF0dXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5TdGF0dXMuc3RhdHVzLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiQ2hhbGxlbmdlVGV4dDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DaGFsbGVuZ2VUZXh0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPkNoYWxsZW5nZVRleHQubnVtX3RleHQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApIHBGcm0tPkNoYWxsZW5nZVRleHQudGV4dCwgcEZybS0+Q2hhbGxlbmdlVGV4dC5udW1fdGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiUlNOT3BhcXVlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJTTk9wYXF1ZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIm51bV9kYXRhOiAlZC5cbiIpLCBwRnJtLT5SU05PcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTk9wYXF1ZS5kYXRhLCBwRnJtLT5SU05PcGFxdWUubnVtX2RhdGEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk1vYmlsaXR5RG9tYWluOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPk1vYmlsaXR5RG9tYWluLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1vYmlsaXR5RG9tYWluLk1ESUQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgib3ZlckRTQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5vdmVyRFNDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgicmVzb3VyY2VSZXFDYXAgKDEpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc291cmNlUmVxQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiRlRJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInJlc2VydmVkICg4KTogJWRcbiIpLCBwRnJtLT5GVEluZm8ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiSUVDb3VudCAoOCk6ICVkXG4iKSwgcEZybS0+RlRJbmZvLklFQ291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5NSUMsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uQW5vbmNlLCAzMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLlNub25jZSwgMzIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiUjFLSF9JRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+RlRJbmZvLlIxS0hfSUQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLlIxS0hfSUQuUE1LX1IxX0lELCA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIkdUSzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+RlRJbmZvLkdUSy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoImtleUlkICgyKTogJWRcbiIpLCBwRnJtLT5GVEluZm8uR1RLLmtleUlkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJyZXNlcnZlZCAoMTQpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5HVEsucmVzZXJ2ZWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uR1RLLmtleUxlbmd0aCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5HVEsuUlNDLCA4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJudW1fa2V5OiAlZC5cbiIpLCBwRnJtLT5GVEluZm8uR1RLLm51bV9rZXkpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSBwRnJtLT5GVEluZm8uR1RLLmtleSwgcEZybS0+RlRJbmZvLkdUSy5udW1fa2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIlIwS0hfSUQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5SMEtIX0lELnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgibnVtX1BNS19SMF9JRDogJWQuXG4iKSwgcEZybS0+RlRJbmZvLlIwS0hfSUQubnVtX1BNS19SMF9JRCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApIHBGcm0tPkZUSW5mby5SMEtIX0lELlBNS19SMF9JRCwgcEZybS0+RlRJbmZvLlIwS0hfSUQubnVtX1BNS19SMF9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiRlRUaW1lb3V0SW50ZXJ2YWw6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RlRUaW1lb3V0SW50ZXJ2YWwucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+RlRUaW1lb3V0SW50ZXJ2YWwudGltZW91dFR5cGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUVGltZW91dEludGVydmFsLnRpbWVvdXRWYWx1ZSwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9SSUNEYXRhRGVzYzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJSSUNEYXRhRGVzY1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiUklDRGF0YTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5JZGVudGlmaWVyLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEucmVzb3VyY2VEZXNjQ291bnQsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5zdGF0dXNDb2RlLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiUklDRGVzY3JpcHRvcjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5yZXNvdXJjZVR5cGUsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJudW1fdmFyaWFibGVEYXRhOiAlZC5cbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLm51bV92YXJpYWJsZURhdGEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkgcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci52YXJpYWJsZURhdGEsIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IubnVtX3ZhcmlhYmxlRGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIlRTUEVDOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnBzYik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJzY2hlZHVsZSAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc2NoZWR1bGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJ1bnVzZWQgKDcpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnVudXNlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmZpeGVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5udW1fVENMQVM7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIlRDTEFTWyVkXTpcbiIpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5wcmVzZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS51c2VyX3ByaW9yaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmNsYXNzaWZpZXJfbWFzaywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuZGVzdCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy50eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNvdXJjZSwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuRFNDUCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucHJvdG8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5QYXJhbXM4MDIxZHEudGFnX3R5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIlRDTEFTU1BST0M6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1NQUk9DLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTU1BST0MucHJvY2Vzc2luZywgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIlRTRGVsYXk6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU0RlbGF5LnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTRGVsYXkuZGVsYXksIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJTY2hlZHVsZTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUudHNpZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgicmVzZXJ2ZWQgKDkpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnJlc2VydmVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5zZXJ2aWNlX2ludGVydmFsLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLm1heF9zZXJ2aWNlX2R1ciwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5zcGVjX2ludGVydmFsLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiV01NVFNQRUM6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5wc2IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgidHNpbmZvX3JzdmQgKDcpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnRzaW5mb19yc3ZkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiYnVyc3Rfc2l6ZV9kZWZuICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5idXJzdF9zaXplX2RlZm4pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5maXhlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+UklDRGF0YURlc2NbaV0ubnVtX1dNTVRDTEFTOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJXTU1UQ0xBU1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0ucHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0udmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0udXNlcl9wcmlvcml0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uY2xhc3NpZmllcl90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5jbGFzc2lmaWVyX21hc2ssIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLmRlc3QsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5FdGhQYXJhbXMudHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJXTU1UQ0xBU1BST0M6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1BST0MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNQUk9DLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNQUk9DLnByb2Nlc3NpbmcsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJXTU1UU0RlbGF5OlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNEZWxheS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0FVVEhFTlRJQ0FUSU9OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU0RlbGF5LnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNEZWxheS5kZWxheSwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIldNTVNjaGVkdWxlOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInJlc2VydmVkICg5KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5yZXNlcnZlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuc2VydmljZV9pbnRlcnZhbCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5tYXhfc2VydmljZV9kdXIsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuc3BlY19pbnRlcnZhbCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9BVVRIRU5USUNBVElPTiksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQVVUSEVOVElDQVRJT04pLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrQXV0aGVudGljYXRpb24uICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tCZWFjb24odHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkJlYWNvbiAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19CZWFjb24sIElFU19CZWFjb24pOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiUGFja2VkIHRoZSBCZWFjb246XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJUaW1lU3RhbXA6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+VGltZVN0YW1wLnRpbWVzdGFtcCwgOCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJCZWFjb25JbnRlcnZhbDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5CZWFjb25JbnRlcnZhbC5pbnRlcnZhbCwgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJDYXBhYmlsaXRpZXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJlc3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5lc3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiaWJzcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmlic3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiY2ZQb2xsYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNmUG9sbGFibGUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiY2ZQb2xsUmVxICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsUmVxKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInByaXZhY3kgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wcml2YWN5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInNob3J0UHJlYW1ibGUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zaG9ydFByZWFtYmxlKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInBiY2MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wYmNjKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImNoYW5uZWxBZ2lsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2hhbm5lbEFnaWxpdHkpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgic3BlY3RydW1NZ3QgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zcGVjdHJ1bU1ndCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJxb3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5xb3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgic2hvcnRTbG90VGltZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0U2xvdFRpbWUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmFwc2QpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicnJtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucnJtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImRzc3NPZmRtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZHNzc09mZG0pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZGVsYXllZEJBKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImltbWVkaWF0ZUJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaW1tZWRpYXRlQkEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiU1NJRDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TU0lELnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPlNTSUQuc3NpZCwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPlN1cHBSYXRlcy5yYXRlcywgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkZIUGFyYW1TZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RkhQYXJhbVNldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1TZXQuZHdlbGxfdGltZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1TZXQuaG9wX3NldCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1TZXQuaG9wX3BhdHRlcm4sIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtU2V0LmhvcF9pbmRleCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkRTUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkRTUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RFNQYXJhbXMuY3Vycl9jaGFubmVsLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQ0ZQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0ZQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5DRlBhcmFtcy5jZnBfY291bnQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5DRlBhcmFtcy5jZnBfcGVyaW9kLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q0ZQYXJhbXMuY2ZwX21heGR1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q0ZQYXJhbXMuY2ZwX2R1cnJlbWFpbmluZywgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIklCU1NQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+SUJTU1BhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPklCU1NQYXJhbXMuYXRpbSwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlRJTTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5USU0ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5USU0uZHRpbV9jb3VudCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRJTS5kdGltX3BlcmlvZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRJTS5ibXBjdGwsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm51bV92Ym1wOiAlZC5cbiIpLCBwRnJtLT5USU0ubnVtX3ZibXApOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5USU0udmJtcCwgcEZybS0+VElNLm51bV92Ym1wKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQ291bnRyeTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Db3VudHJ5LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q291bnRyeS5jb3VudHJ5LCAzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fdHJpcGxldHM6ICVkLlxuIiksIHBGcm0tPkNvdW50cnkubnVtX3RyaXBsZXRzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+Q291bnRyeS50cmlwbGV0cywgMyAqIHBGcm0tPkNvdW50cnkubnVtX3RyaXBsZXRzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiRkhQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RkhQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtcy5yYWRpeCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1zLm5jaGFubmVscywgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkZIUGF0dFRhYmxlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkZIUGF0dFRhYmxlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXR0VGFibGUuZmxhZywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGF0dFRhYmxlLm5zZXRzLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXR0VGFibGUubW9kdWx1cywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGF0dFRhYmxlLm9mZnNldCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibnVtX3JhbmR0YWJsZTogJWQuXG4iKSwgcEZybS0+RkhQYXR0VGFibGUubnVtX3JhbmR0YWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPkZIUGF0dFRhYmxlLnJhbmR0YWJsZSwgcEZybS0+RkhQYXR0VGFibGUubnVtX3JhbmR0YWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlBvd2VyQ29uc3RyYWludHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UG93ZXJDb25zdHJhaW50cy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlBvd2VyQ29uc3RyYWludHMubG9jYWxQb3dlckNvbnN0cmFpbnRzLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQ2hhblN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DaGFuU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5zd2l0Y2hNb2RlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5uZXdDaGFubmVsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5zd2l0Y2hDb3VudCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlF1aWV0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlF1aWV0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UXVpZXQuY291bnQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5RdWlldC5wZXJpb2QsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5RdWlldC5kdXJhdGlvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0Lm9mZnNldCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlRQQ1JlcG9ydDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5UUENSZXBvcnQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5UUENSZXBvcnQudHhfcG93ZXIsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5UUENSZXBvcnQubGlua19tYXJnaW4sIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJFUlBJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkVSUEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm5vbl9lcnBfcHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+RVJQSW5mby5ub25fZXJwX3ByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInVzZV9wcm90ICgxKTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLnVzZV9wcm90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJiYXJrZXJfcHJlYW1ibGUgKDEpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8uYmFya2VyX3ByZWFtYmxlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1bnVzZWQgKDUpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8udW51c2VkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiRXh0U3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+RXh0U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiUlNOOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJTTi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi52ZXJzaW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLmdwX2NpcGhlcl9zdWl0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlcywgNCAqIHBGcm0tPlJTTi5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5SU04uYWttX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+UlNOLmFrbV9zdWl0ZXMsIDQgKiBwRnJtLT5SU04uYWttX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJwcmVhdXRoICgxKTogJWRcbiIpLCBwRnJtLT5SU04ucHJlYXV0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibm9fcHdpc2UgKDEpOiAlZFxuIiksIHBGcm0tPlJTTi5ub19wd2lzZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiUFRLU0FfcmVwbGF5X2NvdW50ZXIgKDIpOiAlZFxuIiksIHBGcm0tPlJTTi5QVEtTQV9yZXBsYXlfY291bnRlcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiR1RLU0FfcmVwbGF5X2NvdW50ZXIgKDIpOiAlZFxuIiksIHBGcm0tPlJTTi5HVEtTQV9yZXBsYXlfY291bnRlcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQgKDEwKTogJWRcbiIpLCBwRnJtLT5SU04ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5SU04ucG1raWRfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5SU04ucG1raWQsIDE2ICogcEZybS0+UlNOLnBta2lkX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiUUJTU0xvYWQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UUJTU0xvYWQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5RQlNTTG9hZC5zdGFjb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPlFCU1NMb2FkLmNoYXV0aWwsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5RQlNTTG9hZC5hdmFpbCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkVEQ0FQYXJhbVNldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FRENBUGFyYW1TZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQucW9zLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmVfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZpX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdm9fYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJRT1NDYXBzQXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UU9TQ2Fwc0FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZCAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc0FwLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ0eG9wcmVxICgxKTogJWRcbiIpLCBwRnJtLT5RT1NDYXBzQXAudHhvcHJlcSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicXJlcSAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc0FwLnFyZXEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInFhY2sgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNBcC5xYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJjb3VudCAoNCk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc0FwLmNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQVBDaGFubmVsUmVwb3J0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5yZWd1bGF0b3J5Q2xhc3MsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm51bV9jaGFubmVsTGlzdDogJWQuXG4iKSwgcEZybS0+QVBDaGFubmVsUmVwb3J0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5jaGFubmVsTGlzdCwgcEZybS0+QVBDaGFubmVsUmVwb3J0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlJSTUVuYWJsZWRDYXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlJNRW5hYmxlZENhcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTGlua01lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxpbmtNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTmVpZ2hib3JScHQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JScHQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInBhcmFsbGVsICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnBhcmFsbGVsKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXBlYXRlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXBlYXRlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQmVhY29uUGFzc2l2ZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25QYXNzaXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJCZWFjb25BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJCZWFjb25UYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25UYWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQmVhY29uUmVwQ29uZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25SZXBDb25kKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJGcmFtZU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkZyYW1lTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkNoYW5uZWxMb2FkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkNoYW5uZWxMb2FkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb2lzZUhpc3RvZ3JhbSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5Ob2lzZUhpc3RvZ3JhbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgic3RhdGlzdGljcyAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5zdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJMQ0lNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTENJQXppbXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lBemltdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJUQ01DYXBhYmlsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlRDTUNhcGFiaWxpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInRyaWdnZXJlZFRDTSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC50cmlnZ2VyZWRUQ00pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkFQQ2hhblJlcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BUENoYW5SZXBvcnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlJSTU1JQkVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlJNTUlCRW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgib3BlcmF0aW5nQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5vcGVyYXRpbmdDaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJub25PcGVyYXRpbkNoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAubm9uT3BlcmF0aW5DaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk1lYXN1cmVtZW50UGlsb3RFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3RFbmFibGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOZWlnaGJvclRTRk9mZnNldCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5OZWlnaGJvclRTRk9mZnNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiUkNQSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJDUElNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiUlNOSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJTTklNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQnNzQXZnQWNjZXNzRGVsYXkgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQnNzQXZnQWNjZXNzRGVsYXkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkJTU0F2YWlsQWRtaXNzaW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJTU0F2YWlsQWRtaXNzaW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJBbnRlbm5hSW5mb3JtYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQW50ZW5uYUluZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk1vYmlsaXR5RG9tYWluOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPk1vYmlsaXR5RG9tYWluLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+TW9iaWxpdHlEb21haW4uTURJRCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgib3ZlckRTQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5vdmVyRFNDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJlc291cmNlUmVxQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNvdXJjZVJlcUNhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiV1BBOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldQQS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS52ZXJzaW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLm11bHRpY2FzdF9jaXBoZXIsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJzLCA0ICogcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5XUEEuYXV0aF9zdWl0ZXMsIDQgKiBwRnJtLT5XUEEuYXV0aF9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5jYXBzLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiSFRDYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWR2Q29kaW5nQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYWR2Q29kaW5nQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm1pbW9Qb3dlclNhdmUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5taW1vUG93ZXJTYXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJncmVlbkZpZWxkICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZ3JlZW5GaWVsZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgic2hvcnRHSTIwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTIwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJzaG9ydEdJNDBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zaG9ydEdJNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInR4U1RCQyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicnhTVEJDICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5kZWxheWVkQkEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm1heGltYWxBTVNEVXNpemUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJkc3NzQ2NrTW9kZTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZHNzc0Nja01vZGU0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicHNtcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBzbXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInN0YmNDb250cm9sRnJhbWUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdGJjQ29udHJvbEZyYW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm1heFJ4QU1QRFVGYWN0b3IgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhSeEFNUERVRmFjdG9yKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtcGR1RGVuc2l0eSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1wZHVEZW5zaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZDEgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5IVENhcHMuc3VwcG9ydGVkTUNTU2V0LCAxNik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicGNvICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucGNvKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ0cmFuc2l0aW9uVGltZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnRyYW5zaXRpb25UaW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZDIgKDUpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm1jc0ZlZWRiYWNrICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWNzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJlc2VydmVkMyAoNik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJ4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ0eFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicnhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidHhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiaW1wbGljaXRUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuaW1wbGljaXRUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJjYWxpYnJhdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNhbGlicmF0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJleHBsaWNpdENTSVR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSVR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJleHBsaWNpdEJGQ1NJRmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdEJGQ1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImNzaU51bUJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jc2lOdW1CRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZDQgKDcpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFudGVubmFTZWxlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hU2VsZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyeEFTICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhBUyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidHhTb3VuZGluZ1BQRFVzICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTb3VuZGluZ1BQRFVzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZDUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5IVENhcHMucnN2ZCwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiSFRJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUSW5mby5wcmltYXJ5Q2hhbm5lbCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgic2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAoMik6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJlY29tbWVuZGVkVHhXaWR0aFNldCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlY29tbWVuZGVkVHhXaWR0aFNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmlmc01vZGUgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yaWZzTW9kZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiY29udHJvbGxlZEFjY2Vzc09ubHkgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5jb250cm9sbGVkQWNjZXNzT25seSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgic2VydmljZUludGVydmFsR3JhbnVsYXJpdHkgKDMpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5zZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgib3BNb2RlICgyKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ub3BNb2RlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJub25HRkRldmljZXNQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ubm9uR0ZEZXZpY2VzUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidHJhbnNtaXRCdXJzdExpbWl0ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8udHJhbnNtaXRCdXJzdExpbWl0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJvYnNzTm9uSFRTdGFQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ub2Jzc05vbkhUU3RhUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQgKDExKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImJhc2ljU1RCQ01DUyAoNyk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmJhc2ljU1RCQ01DUyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiZHVhbENUU1Byb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5kdWFsQ1RTUHJvdGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgic2Vjb25kYXJ5QmVhY29uICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2Vjb25kYXJ5QmVhY29uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJwY29BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5wY29BY3RpdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInBjb1BoYXNlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucGNvUGhhc2UpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJlc2VydmVkMiAoNCk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlc2VydmVkMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUSW5mby5iYXNpY01DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVEluZm8ubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5IVEluZm8ucnN2ZCwgcEZybS0+SFRJbmZvLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiRXh0Q2hhblN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FeHRDaGFuU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+RXh0Q2hhblN3aXRjaEFubi5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0LCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiV01NSW5mb0FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTUluZm9BcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTUluZm9BcC52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJwYXJhbV9zZXRfY291bnQgKDQpOiAlZFxuIiksIHBGcm0tPldNTUluZm9BcC5wYXJhbV9zZXRfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJlc2VydmVkICgzKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvQXAucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInVhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvQXAudWFwc2QpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJXTU1QYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucW9zSW5mbywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5yZXNlcnZlZDIsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmVfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1bnVzZWQxICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMudW51c2VkMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmtfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2aV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdm9fYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1bnVzZWQ0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMudW51c2VkNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIldNTUNhcHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTUNhcHMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicmVzZXJ2ZWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInFhY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucWFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgicXVldWVfcmVxdWVzdCAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5xdWV1ZV9yZXF1ZXN0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ0eG9wX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMudHhvcF9yZXF1ZXN0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJtb3JlX2FjayAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5tb3JlX2Fjayk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIldBUEk6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V0FQSS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkudmVyc2lvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkuYWttX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+V0FQSS5ha21fc3VpdGVzLCA0ICogcEZybS0+V0FQSS5ha21fc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZXMsIDQgKiBwRnJtLT5XQVBJLnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS5tdWx0aWNhc3RfY2lwaGVyX3N1aXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJwcmVhdXRoICgxKTogJWRcbiIpLCBwRnJtLT5XQVBJLnByZWF1dGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJlc2VydmVkICgxNSk6ICVkXG4iKSwgcEZybS0+V0FQSS5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkuYmtpZF9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUEkuYmtpZCwgMTYgKiBwRnJtLT5XQVBJLmJraWRfY291bnQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJDQ1hSYWRNZ210Q2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFJhZE1nbXRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hSYWRNZ210Q2FwLm1nbXRfc3RhdGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm1ic3NpZF9tYXNrICgzKTogJWRcbiIpLCBwRnJtLT5DQ1hSYWRNZ210Q2FwLm1ic3NpZF9tYXNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJyZXNlcnZlZCAoNSk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkNDWFRyYWZTdHJtTWV0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFRyYWZTdHJtTWV0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQudHNpZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnN0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQubXNtdF9pbnRlcnZhbCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkNDWFR4bWl0UG93ZXI6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVHhtaXRQb3dlci5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFR4bWl0UG93ZXIucG93ZXJfbGltaXQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnJlc2VydmVkLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQWlyZ286XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+QWlyZ28ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlByb3BTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5yYXRlcywgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkFQTmFtZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uQVBOYW1lLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fbmFtZTogJWQuXG4iKSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLkFQTmFtZS5uYW1lLCBwRnJtLT5BaXJnby5BUE5hbWUubnVtX25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkhDRjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uSENGLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uSENGLmVuYWJsZWQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIldEUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uV0RTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fd2RzRGF0YTogJWQuXG4iKSwgcEZybS0+QWlyZ28uV0RTLm51bV93ZHNEYXRhKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLldEUy53ZHNEYXRhLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkJQSW5kaWNhdG9yOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5CUEluZGljYXRvci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLmluZGljYXRvciwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJMb2FkSW5mbzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTG9hZEluZm8ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkSW5mby5udW1fc3RhcywgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkSW5mby5jaGFubmVsX3V0aWwsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkxvYWRCYWxhbmNlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLmJzc2lkLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlByb3BBc3NvY1R5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnR5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkxMQXR0cjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTExBdHRyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTExBdHRyLmRlZmVyX3RocmVzaG9sZCwgNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiUHJvcENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENhcGFiaWxpdHkuY2FwYWJpbGl0eSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2hpcF9yZXYsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jYXJkX3R5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJudW1fYnVpbGRfdmVyc2lvbjogJWQuXG4iKSwgcEZybS0+QWlyZ28uVmVyc2lvbi5udW1fYnVpbGRfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5WZXJzaW9uLmJ1aWxkX3ZlcnNpb24sIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlByb3BFRENBUGFyYW1zOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnFvcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmVfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1bnVzZWQxICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNiZV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjYmtfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY2JrX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2aV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdmlfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoImFjdm9fYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJ1bnVzZWQ0ICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQ0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYWN2b19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJUaXRhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGl0YW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5jb25jYXRfdGNpZF9iaXRtYXAsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29tcHJlc3Npb25fdGNpZF9iaXRtYXAsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY2Jfc3RhdGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4ucmV2X2Zjc19zdGF0ZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiUHJvcENoYW5uU3dpdGNoQW5uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ubW9kZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJpbWFyeV9jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5zdWJfYmFuZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4uY2hhbm5lbF9zd2l0Y2hfY291bnQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlByb3BRdWlldEJTUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X2NvdW50LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9wZXJpb2QsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9vZmZzZXQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlRyaWdnZXJTdGFCZ1NjYW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UcmlnZ2VyU3RhQmdTY2FuLmVuYWJsZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiVGF1cnVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UYXVydXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UYXVydXMuYmFUSURCaXRtYXAsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhUG9saWN5LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiYmFCdWZmZXJTaXplICgxMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLmJhQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoInJzdmQgKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlRhdXJ1cy5yc3ZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiV3NjQmVhY29uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NCZWFjb24uVmVyc2lvbi5taW5vcik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NCZWFjb24uVmVyc2lvbi5tYWpvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiV1BTU3RhdGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5XUFNTdGF0ZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5XUFNTdGF0ZS5zdGF0ZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiQVBTZXR1cExvY2tlZDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLkFQU2V0dXBMb2NrZWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uQVBTZXR1cExvY2tlZC5mTG9ja2VkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJTZWxlY3RlZFJlZ2lzdHJhcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlNlbGVjdGVkUmVnaXN0cmFyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLlNlbGVjdGVkUmVnaXN0cmFyLnNlbGVjdGVkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJEZXZpY2VQYXNzd29yZElEOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uRGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5EZXZpY2VQYXNzd29yZElELmlkLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLm1ldGhvZHMsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlVVSURfRTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlVVSURfRS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5VVUlEX0UudXVpZCwgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlJGQmFuZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5SRkJhbmRzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLlJGQmFuZHMuYmFuZHMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlZlbmRvckV4dGVuc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24udmVuZG9ySWQsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJWZXJzaW9uMjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NCZWFjb24uVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1pbm9yKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NCZWFjb24uVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1ham9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIkF1dGhvcml6ZWRNQUNzOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi5BdXRob3JpemVkTUFDcy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MubWFjLCA2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlJlcXVlc3RUb0Vucm9sbDpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi5SZXF1ZXN0VG9FbnJvbGwucmVxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlAyUEJlYWNvbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb24ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlAyUENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvbi5QMlBDYXBhYmlsaXR5LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLlAyUENhcGFiaWxpdHkuZGV2aWNlQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBCZWFjb24uUDJQQ2FwYWJpbGl0eS5ncm91cENhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIlAyUERldmljZUlkOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb24uUDJQRGV2aWNlSWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBCZWFjb24uUDJQRGV2aWNlSWQuUDJQRGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgiTm90aWNlT2ZBYnNlbmNlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb24uTm90aWNlT2ZBYnNlbmNlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLk5vdGljZU9mQWJzZW5jZS5pbmRleCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBCZWFjb24uTm90aWNlT2ZBYnNlbmNlLkNUU1dpbmRvd09wcFBTLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgibnVtX05vQURlc2M6ICVkLlxuIiksIHBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UubnVtX05vQURlc2MpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCAoIHRBTklfVTgqICkgcEZybS0+UDJQQmVhY29uLk5vdGljZU9mQWJzZW5jZS5Ob0FEZXNjLCBwRnJtLT5QMlBCZWFjb24uTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04pLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrQmVhY29uLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrQmVhY29uMSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQmVhY29uMSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19CZWFjb24xLCBJRVNfQmVhY29uMSk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiUGFja2VkIHRoZSBCZWFjb24xOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoIlRpbWVTdGFtcDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCAoIHRBTklfVTgqICkmcEZybS0+VGltZVN0YW1wLnRpbWVzdGFtcCwgOCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiQmVhY29uSW50ZXJ2YWw6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgKCB0QU5JX1U4KiApJnBGcm0tPkJlYWNvbkludGVydmFsLmludGVydmFsLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJDYXBhYmlsaXRpZXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiZXNzICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZXNzKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJpYnNzICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaWJzcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiY2ZQb2xsYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNmUG9sbGFibGUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoImNmUG9sbFJlcSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNmUG9sbFJlcSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgicHJpdmFjeSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnByaXZhY3kpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoInNob3J0UHJlYW1ibGUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zaG9ydFByZWFtYmxlKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJwYmNjICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucGJjYyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiY2hhbm5lbEFnaWxpdHkgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jaGFubmVsQWdpbGl0eSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgic3BlY3RydW1NZ3QgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zcGVjdHJ1bU1ndCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgicW9zICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucW9zKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJzaG9ydFNsb3RUaW1lICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc2hvcnRTbG90VGltZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiYXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmFwc2QpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoInJybSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnJybSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiZHNzc09mZG0gKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5kc3NzT2ZkbSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZGVsYXllZEJBKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJpbW1lZGlhdGVCQSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmltbWVkaWF0ZUJBKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJTU0lEOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlNTSUQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCAoIHRBTklfVTgqICkgcEZybS0+U1NJRC5zc2lkLCBwRnJtLT5TU0lELm51bV9zc2lkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoIlN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04xKSwgKCB0QU5JX1U4KiApIHBGcm0tPlN1cHBSYXRlcy5yYXRlcywgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCBGUkZMKCJEU1BhcmFtczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5EU1BhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCAoIHRBTklfVTgqICkmcEZybS0+RFNQYXJhbXMuY3Vycl9jaGFubmVsLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoIklCU1NQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+SUJTU1BhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjEpLCAoIHRBTklfVTgqICkmcEZybS0+SUJTU1BhcmFtcy5hdGltLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMSksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tCZWFjb24xLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrQmVhY29uMih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQmVhY29uMiAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19CZWFjb24yLCBJRVNfQmVhY29uMik7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUGFja2VkIHRoZSBCZWFjb24yOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkNvdW50cnk6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q291bnRyeS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+Q291bnRyeS5jb3VudHJ5LCAzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibnVtX3RyaXBsZXRzOiAlZC5cbiIpLCBwRnJtLT5Db3VudHJ5Lm51bV90cmlwbGV0cyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSBwRnJtLT5Db3VudHJ5LnRyaXBsZXRzLCAzICogcEZybS0+Q291bnRyeS5udW1fdHJpcGxldHMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUG93ZXJDb25zdHJhaW50czpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Qb3dlckNvbnN0cmFpbnRzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5Qb3dlckNvbnN0cmFpbnRzLmxvY2FsUG93ZXJDb25zdHJhaW50cywgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJDaGFuU3dpdGNoQW5uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNoYW5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4uc3dpdGNoTW9kZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5DaGFuU3dpdGNoQW5uLm5ld0NoYW5uZWwsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5zd2l0Y2hDb3VudCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJRdWlldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5RdWlldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UXVpZXQuY291bnQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UXVpZXQucGVyaW9kLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0LmR1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0Lm9mZnNldCwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJUUENSZXBvcnQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VFBDUmVwb3J0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5UUENSZXBvcnQudHhfcG93ZXIsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LmxpbmtfbWFyZ2luLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkVSUEluZm86XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RVJQSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJub25fZXJwX3ByZXNlbnQgKDEpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8ubm9uX2VycF9wcmVzZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidXNlX3Byb3QgKDEpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8udXNlX3Byb3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJiYXJrZXJfcHJlYW1ibGUgKDEpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8uYmFya2VyX3ByZWFtYmxlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkICg1KTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLnVudXNlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJFeHRTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RXh0U3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSBwRnJtLT5FeHRTdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUlNOOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJTTi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLnZlcnNpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLmdwX2NpcGhlcl9zdWl0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTi5wd2lzZV9jaXBoZXJfc3VpdGVzLCA0ICogcEZybS0+UlNOLnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5SU04uYWttX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTi5ha21fc3VpdGVzLCA0ICogcEZybS0+UlNOLmFrbV9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInByZWF1dGggKDEpOiAlZFxuIiksIHBGcm0tPlJTTi5wcmVhdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibm9fcHdpc2UgKDEpOiAlZFxuIiksIHBGcm0tPlJTTi5ub19wd2lzZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlBUS1NBX3JlcGxheV9jb3VudGVyICgyKTogJWRcbiIpLCBwRnJtLT5SU04uUFRLU0FfcmVwbGF5X2NvdW50ZXIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJHVEtTQV9yZXBsYXlfY291bnRlciAoMik6ICVkXG4iKSwgcEZybS0+UlNOLkdUS1NBX3JlcGxheV9jb3VudGVyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicmVzZXJ2ZWQgKDEwKTogJWRcbiIpLCBwRnJtLT5SU04ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLnBta2lkX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTi5wbWtpZCwgMTYgKiBwRnJtLT5SU04ucG1raWRfY291bnQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiRURDQVBhcmFtU2V0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkVEQ0FQYXJhbVNldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LnFvcywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNiZV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2aV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2b19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQVBDaGFubmVsUmVwb3J0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QVBDaGFubmVsUmVwb3J0LnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV9jaGFubmVsTGlzdDogJWQuXG4iKSwgcEZybS0+QVBDaGFubmVsUmVwb3J0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSBwRnJtLT5BUENoYW5uZWxSZXBvcnQuY2hhbm5lbExpc3QsIHBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUlJNRW5hYmxlZENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SUk1FbmFibGVkQ2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkxpbmtNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MaW5rTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOZWlnaGJvclJwdCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5OZWlnaGJvclJwdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInBhcmFsbGVsICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnBhcmFsbGVsKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicmVwZWF0ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVwZWF0ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJCZWFjb25QYXNzaXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvblBhc3NpdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJCZWFjb25BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQmVhY29uVGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uVGFibGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJCZWFjb25SZXBDb25kICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvblJlcENvbmQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJGcmFtZU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkZyYW1lTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJDaGFubmVsTG9hZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5DaGFubmVsTG9hZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vaXNlSGlzdG9ncmFtICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5vaXNlSGlzdG9ncmFtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic3RhdGlzdGljcyAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5zdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTENJTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJMQ0lBemltdXRoICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxDSUF6aW11dGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJUQ01DYXBhYmlsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlRDTUNhcGFiaWxpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0cmlnZ2VyZWRUQ00gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAudHJpZ2dlcmVkVENNKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQVBDaGFuUmVwb3J0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkFQQ2hhblJlcG9ydCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlJSTU1JQkVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlJNTUlCRW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm9wZXJhdGluZ0NoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAub3BlcmF0aW5nQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm5vbk9wZXJhdGluQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5ub25PcGVyYXRpbkNoYW5NYXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90RW5hYmxlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90RW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5laWdoYm9yVFNGT2Zmc2V0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5laWdoYm9yVFNGT2Zmc2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUkNQSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJDUElNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlJTTklNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SU05JTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJCc3NBdmdBY2Nlc3NEZWxheSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5Cc3NBdmdBY2Nlc3NEZWxheSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkJTU0F2YWlsQWRtaXNzaW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJTU0F2YWlsQWRtaXNzaW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQW50ZW5uYUluZm9ybWF0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkFudGVubmFJbmZvcm1hdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk1vYmlsaXR5RG9tYWluOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPk1vYmlsaXR5RG9tYWluLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5Nb2JpbGl0eURvbWFpbi5NRElELCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgib3ZlckRTQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5vdmVyRFNDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNvdXJjZVJlcUNhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ucmVzb3VyY2VSZXFDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiV1BBOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldQQS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLnZlcnNpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLm11bHRpY2FzdF9jaXBoZXIsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPldQQS51bmljYXN0X2NpcGhlcnMsIDQgKiBwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkgcEZybS0+V1BBLmF1dGhfc3VpdGVzLCA0ICogcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLmNhcHMsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiSFRDYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhZHZDb2RpbmdDYXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hZHZDb2RpbmdDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJzdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJtaW1vUG93ZXJTYXZlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWltb1Bvd2VyU2F2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImdyZWVuRmllbGQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5ncmVlbkZpZWxkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic2hvcnRHSTIwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTIwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic2hvcnRHSTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidHhTVEJDICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicnhTVEJDICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZGVsYXllZEJBKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibWF4aW1hbEFNU0RVc2l6ZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1heGltYWxBTVNEVXNpemUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJkc3NzQ2NrTW9kZTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZHNzc0Nja01vZGU0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInBzbXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wc21wKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic3RiY0NvbnRyb2xGcmFtZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnN0YmNDb250cm9sRnJhbWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJsc2lnVFhPUFByb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5sc2lnVFhPUFByb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJtYXhSeEFNUERVRmFjdG9yICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4UnhBTVBEVUZhY3Rvcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm1wZHVEZW5zaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubXBkdURlbnNpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZDEgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+SFRDYXBzLnN1cHBvcnRlZE1DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJwY28gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wY28pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0cmFuc2l0aW9uVGltZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnRyYW5zaXRpb25UaW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicmVzZXJ2ZWQyICg1KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibWNzRmVlZGJhY2sgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tY3NGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInJlc2VydmVkMyAoNik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicnhTdGFnZ2VyZWRTb3VuZGluZyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4U3RhZ2dlcmVkU291bmRpbmcpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0eFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInJ4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0eFpMRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4WkxGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiaW1wbGljaXRUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuaW1wbGljaXRUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiY2FsaWJyYXRpb24gKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jYWxpYnJhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImV4cGxpY2l0Q1NJVHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJVHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiZXhwbGljaXRCRkNTSUZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRCRkNTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJjc2lOdW1CRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY3NpTnVtQkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicmVzZXJ2ZWQ0ICg3KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYW50ZW5uYVNlbGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFTZWxlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFudGVubmFJbmRpY2VzRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicnhBUyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4QVMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0eFNvdW5kaW5nUFBEVXMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFNvdW5kaW5nUFBEVXMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZDUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPkhUQ2Fwcy5yc3ZkLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiSFRJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkhUSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+SFRJbmZvLnByaW1hcnlDaGFubmVsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAoMik6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZWNvbW1lbmRlZFR4V2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyaWZzTW9kZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJpZnNNb2RlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiY29udHJvbGxlZEFjY2Vzc09ubHkgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5jb250cm9sbGVkQWNjZXNzT25seSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2VydmljZUludGVydmFsR3JhbnVsYXJpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJvcE1vZGUgKDIpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5vcE1vZGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJub25HRkRldmljZXNQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ubm9uR0ZEZXZpY2VzUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInRyYW5zbWl0QnVyc3RMaW1pdCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnRyYW5zbWl0QnVyc3RMaW1pdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm9ic3NOb25IVFN0YVByZXNlbnQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5vYnNzTm9uSFRTdGFQcmVzZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicmVzZXJ2ZWQgKDExKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJiYXNpY1NUQkNNQ1MgKDcpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5iYXNpY1NUQkNNQ1MpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJkdWFsQ1RTUHJvdGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLmR1YWxDVFNQcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgic2Vjb25kYXJ5QmVhY29uICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2Vjb25kYXJ5QmVhY29uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInBjb0FjdGl2ZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnBjb0FjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInBjb1BoYXNlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucGNvUGhhc2UpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZDIgKDQpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+SFRJbmZvLmJhc2ljTUNTU2V0LCAxNik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV9yc3ZkOiAlZC5cbiIpLCBwRnJtLT5IVEluZm8ubnVtX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkgcEZybS0+SFRJbmZvLnJzdmQsIHBGcm0tPkhUSW5mby5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJFeHRDaGFuU3dpdGNoQW5uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dENoYW5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkV4dENoYW5Td2l0Y2hBbm4uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJXTU1JbmZvQXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NSW5mb0FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1JbmZvQXAudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInBhcmFtX3NldF9jb3VudCAoNCk6ICVkXG4iKSwgcEZybS0+V01NSW5mb0FwLnBhcmFtX3NldF9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInJlc2VydmVkICgzKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvQXAucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ1YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NSW5mb0FwLnVhcHNkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIldNTVBhcmFtczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1QYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5xb3NJbmZvLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5yZXNlcnZlZDIsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNiZV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2aV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2b19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiV01NQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1DYXBzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XTU1DYXBzLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZCAoNCk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInFhY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucWFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInF1ZXVlX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucXVldWVfcmVxdWVzdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInR4b3BfcmVxdWVzdCAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy50eG9wX3JlcXVlc3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJtb3JlX2FjayAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5tb3JlX2Fjayk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJBaXJnbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJQcm9wU3VwcFJhdGVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQVBOYW1lOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5BUE5hbWUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibnVtX25hbWU6ICVkLlxuIiksIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uQVBOYW1lLm5hbWUsIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkhDRjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uSENGLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5IQ0YuZW5hYmxlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIldEUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uV0RTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV93ZHNEYXRhOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLldEUy53ZHNEYXRhLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJCUEluZGljYXRvcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLmluZGljYXRvciwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkxvYWRJbmZvOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8ubnVtX3N0YXMsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRJbmZvLmNoYW5uZWxfdXRpbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkxvYWRCYWxhbmNlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuYnNzaWQsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJQcm9wQXNzb2NUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnR5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJMTEF0dHI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxMQXR0ci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTExBdHRyLmRlZmVyX3RocmVzaG9sZCwgNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlByb3BDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENhcGFiaWxpdHkuY2FwYWJpbGl0eSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2hpcF9yZXYsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2FyZF90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm51bV9idWlsZF92ZXJzaW9uOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5WZXJzaW9uLmJ1aWxkX3ZlcnNpb24sIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJQcm9wRURDQVBhcmFtczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnFvcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNiZV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmVfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWNia19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjYmtfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2aV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdmlfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiYWN2b19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImFjdm9fbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJUaXRhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGl0YW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbmNhdF90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29tcHJlc3Npb25fdGNpZF9iaXRtYXAsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNiX3N0YXRlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5yZXZfZmNzX3N0YXRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUHJvcENoYW5uU3dpdGNoQW5uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5tb2RlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJpbWFyeV9jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4uc3ViX2JhbmQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5jaGFubmVsX3N3aXRjaF9jb3VudCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlByb3BRdWlldEJTUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfY291bnQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9wZXJpb2QsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X29mZnNldCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlRyaWdnZXJTdGFCZ1NjYW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4uZW5hYmxlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiVGF1cnVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UYXVydXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVRJREJpdG1hcCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhUG9saWN5LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoImJhQnVmZmVyU2l6ZSAoMTIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlRhdXJ1cy5iYUJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgicnN2ZCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLnJzdmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiV3NjQmVhY29uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJWZXJzaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQmVhY29uLlZlcnNpb24ubWlub3IpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibWFqb3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY0JlYWNvbi5WZXJzaW9uLm1ham9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiV1BTU3RhdGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5XUFNTdGF0ZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLldQU1N0YXRlLnN0YXRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQVBTZXR1cExvY2tlZDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLkFQU2V0dXBMb2NrZWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5BUFNldHVwTG9ja2VkLmZMb2NrZWQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJTZWxlY3RlZFJlZ2lzdHJhcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlNlbGVjdGVkUmVnaXN0cmFyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uU2VsZWN0ZWRSZWdpc3RyYXIuc2VsZWN0ZWQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJEZXZpY2VQYXNzd29yZElEOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uRGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLkRldmljZVBhc3N3b3JkSUQuaWQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMubWV0aG9kcywgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlVVSURfRTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlVVSURfRS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLlVVSURfRS51dWlkLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlJGQmFuZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5SRkJhbmRzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb24uUkZCYW5kcy5iYW5kcywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIlZlbmRvckV4dGVuc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi52ZW5kb3JJZCwgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJWZXJzaW9uMjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibWlub3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWlub3IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NCZWFjb24uVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1ham9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJBdXRob3JpemVkTUFDczpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvbi5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MubWFjLCA2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJSZXF1ZXN0VG9FbnJvbGw6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb24uVmVuZG9yRXh0ZW5zaW9uLlJlcXVlc3RUb0Vucm9sbC5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uLlZlbmRvckV4dGVuc2lvbi5SZXF1ZXN0VG9FbnJvbGwucmVxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJXQVBJOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldBUEkucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkudmVyc2lvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLmFrbV9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSBwRnJtLT5XQVBJLmFrbV9zdWl0ZXMsIDQgKiBwRnJtLT5XQVBJLmFrbV9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLnVuaWNhc3RfY2lwaGVyX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUEkudW5pY2FzdF9jaXBoZXJfc3VpdGVzLCA0ICogcEZybS0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLm11bHRpY2FzdF9jaXBoZXJfc3VpdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJwcmVhdXRoICgxKTogJWRcbiIpLCBwRnJtLT5XQVBJLnByZWF1dGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJyZXNlcnZlZCAoMTUpOiAlZFxuIiksIHBGcm0tPldBUEkucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS5ia2lkX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUEkuYmtpZCwgMTYgKiBwRnJtLT5XQVBJLmJraWRfY291bnQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQ0NYUmFkTWdtdENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hSYWRNZ210Q2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hSYWRNZ210Q2FwLm1nbXRfc3RhdGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJtYnNzaWRfbWFzayAoMyk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5tYnNzaWRfbWFzayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoInJlc2VydmVkICg1KTogJWRcbiIpLCBwRnJtLT5DQ1hSYWRNZ210Q2FwLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIkNDWFRyYWZTdHJtTWV0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFRyYWZTdHJtTWV0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC50c2lkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnN0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0Lm1zbXRfaW50ZXJ2YWwsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiQ0NYVHhtaXRQb3dlcjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUeG1pdFBvd2VyLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnBvd2VyX2xpbWl0LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFR4bWl0UG93ZXIucmVzZXJ2ZWQsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUDJQQmVhY29uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJQMlBDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb24uUDJQQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLlAyUENhcGFiaWxpdHkuZGV2aWNlQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLlAyUENhcGFiaWxpdHkuZ3JvdXBDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiUDJQRGV2aWNlSWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvbi5QMlBEZXZpY2VJZC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uLlAyUERldmljZUlkLlAyUERldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJOb3RpY2VPZkFic2VuY2U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OMiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UuaW5kZXgsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UuQ1RTV2luZG93T3BwUFMsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgRlJGTCgibnVtX05vQURlc2M6ICVkLlxuIiksIHBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UubnVtX05vQURlc2MpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT04yKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEJlYWNvbi5Ob3RpY2VPZkFic2VuY2UuTm9BRGVzYywgcEZybS0+UDJQQmVhY29uLk5vdGljZU9mQWJzZW5jZS5udW1fTm9BRGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTjIpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrQmVhY29uMi4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0JlYWNvbklFcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmQmVhY29uSUVzICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0JlYWNvbklFcywgSUVTX0JlYWNvbklFcyk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJQYWNrZWQgdGhlIEJlYWNvbklFczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlNTSUQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U1NJRC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5TU0lELnNzaWQsIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5TdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJGSFBhcmFtU2V0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkZIUGFyYW1TZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtU2V0LmR3ZWxsX3RpbWUsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtU2V0LmhvcF9zZXQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtU2V0LmhvcF9wYXR0ZXJuLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXJhbVNldC5ob3BfaW5kZXgsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJEU1BhcmFtczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5EU1BhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRTUGFyYW1zLmN1cnJfY2hhbm5lbCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkNGUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNGUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q0ZQYXJhbXMuY2ZwX2NvdW50LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q0ZQYXJhbXMuY2ZwX3BlcmlvZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNGUGFyYW1zLmNmcF9tYXhkdXJhdGlvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNGUGFyYW1zLmNmcF9kdXJyZW1haW5pbmcsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJJQlNTUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPklCU1NQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5JQlNTUGFyYW1zLmF0aW0sIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJUSU06XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VElNLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+VElNLmR0aW1fY291bnQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5USU0uZHRpbV9wZXJpb2QsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5USU0uYm1wY3RsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fdmJtcDogJWQuXG4iKSwgcEZybS0+VElNLm51bV92Ym1wKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+VElNLnZibXAsIHBGcm0tPlRJTS5udW1fdmJtcCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkNvdW50cnk6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q291bnRyeS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNvdW50cnkuY291bnRyeSwgMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX3RyaXBsZXRzOiAlZC5cbiIpLCBwRnJtLT5Db3VudHJ5Lm51bV90cmlwbGV0cyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPkNvdW50cnkudHJpcGxldHMsIDMgKiBwRnJtLT5Db3VudHJ5Lm51bV90cmlwbGV0cyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkZIUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkZIUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXJhbXMucmFkaXgsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtcy5uY2hhbm5lbHMsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJGSFBhdHRUYWJsZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5GSFBhdHRUYWJsZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGF0dFRhYmxlLmZsYWcsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhdHRUYWJsZS5uc2V0cywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGF0dFRhYmxlLm1vZHVsdXMsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhdHRUYWJsZS5vZmZzZXQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV9yYW5kdGFibGU6ICVkLlxuIiksIHBGcm0tPkZIUGF0dFRhYmxlLm51bV9yYW5kdGFibGUpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5GSFBhdHRUYWJsZS5yYW5kdGFibGUsIHBGcm0tPkZIUGF0dFRhYmxlLm51bV9yYW5kdGFibGUpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJQb3dlckNvbnN0cmFpbnRzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlBvd2VyQ29uc3RyYWludHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5Qb3dlckNvbnN0cmFpbnRzLmxvY2FsUG93ZXJDb25zdHJhaW50cywgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkNoYW5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q2hhblN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4uc3dpdGNoTW9kZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4ubmV3Q2hhbm5lbCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4uc3dpdGNoQ291bnQsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJRdWlldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5RdWlldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0LmNvdW50LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UXVpZXQucGVyaW9kLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UXVpZXQuZHVyYXRpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5RdWlldC5vZmZzZXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJUUENSZXBvcnQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VFBDUmVwb3J0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LnR4X3Bvd2VyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LmxpbmtfbWFyZ2luLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiRVJQSW5mbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FUlBJbmZvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJub25fZXJwX3ByZXNlbnQgKDEpOiAlZFxuIiksIHBGcm0tPkVSUEluZm8ubm9uX2VycF9wcmVzZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1c2VfcHJvdCAoMSk6ICVkXG4iKSwgcEZybS0+RVJQSW5mby51c2VfcHJvdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYmFya2VyX3ByZWFtYmxlICgxKTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLmJhcmtlcl9wcmVhbWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW51c2VkICg1KTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLnVudXNlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkV4dFN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FeHRTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPkV4dFN1cHBSYXRlcy5yYXRlcywgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlJTTjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SU04ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5SU04udmVyc2lvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi5ncF9jaXBoZXJfc3VpdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+UlNOLnB3aXNlX2NpcGhlcl9zdWl0ZXMsIDQgKiBwRnJtLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLmFrbV9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJTTi5ha21fc3VpdGVzLCA0ICogcEZybS0+UlNOLmFrbV9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicHJlYXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+UlNOLnByZWF1dGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm5vX3B3aXNlICgxKTogJWRcbiIpLCBwRnJtLT5SU04ubm9fcHdpc2UpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlBUS1NBX3JlcGxheV9jb3VudGVyICgyKTogJWRcbiIpLCBwRnJtLT5SU04uUFRLU0FfcmVwbGF5X2NvdW50ZXIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkdUS1NBX3JlcGxheV9jb3VudGVyICgyKTogJWRcbiIpLCBwRnJtLT5SU04uR1RLU0FfcmVwbGF5X2NvdW50ZXIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJlc2VydmVkICgxMCk6ICVkXG4iKSwgcEZybS0+UlNOLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLnBta2lkX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+UlNOLnBta2lkLCAxNiAqIHBGcm0tPlJTTi5wbWtpZF9jb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlFCU1NMb2FkOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlFCU1NMb2FkLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UUJTU0xvYWQuc3RhY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5RQlNTTG9hZC5jaGF1dGlsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UUJTU0xvYWQuYXZhaWwsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJFRENBUGFyYW1TZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RURDQVBhcmFtU2V0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LnFvcywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmVfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JlX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JlX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNia19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmtfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmtfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1bnVzZWQzICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2aV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2aV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdm9fYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZvX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZvX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUU9TQ2Fwc0FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlFPU0NhcHNBcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNBcC5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidHhvcHJlcSAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc0FwLnR4b3ByZXEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInFyZXEgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNBcC5xcmVxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJxYWNrICgxKTogJWRcbiIpLCBwRnJtLT5RT1NDYXBzQXAucWFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiY291bnQgKDQpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNBcC5jb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkFQQ2hhbm5lbFJlcG9ydDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5BUENoYW5uZWxSZXBvcnQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BUENoYW5uZWxSZXBvcnQucmVndWxhdG9yeUNsYXNzLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fY2hhbm5lbExpc3Q6ICVkLlxuIiksIHBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5BUENoYW5uZWxSZXBvcnQuY2hhbm5lbExpc3QsIHBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJSUk1FbmFibGVkQ2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJSTUVuYWJsZWRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkxpbmtNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MaW5rTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5laWdoYm9yUnB0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5laWdoYm9yUnB0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJwYXJhbGxlbCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5wYXJhbGxlbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVwZWF0ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVwZWF0ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkJlYWNvblBhc3NpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUGFzc2l2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQmVhY29uQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvbkFjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQmVhY29uVGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uVGFibGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkJlYWNvblJlcENvbmQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUmVwQ29uZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiRnJhbWVNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5GcmFtZU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJDaGFubmVsTG9hZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5DaGFubmVsTG9hZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm9pc2VIaXN0b2dyYW0gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTm9pc2VIaXN0b2dyYW0pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInN0YXRpc3RpY3MgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuc3RhdGlzdGljcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTENJTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkxDSUF6aW11dGggKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJQXppbXV0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiVENNQ2FwYWJpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5UQ01DYXBhYmlsaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ0cmlnZ2VyZWRUQ00gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAudHJpZ2dlcmVkVENNKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJBUENoYW5SZXBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQVBDaGFuUmVwb3J0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJSUk1NSUJFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJSTU1JQkVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm9wZXJhdGluZ0NoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAub3BlcmF0aW5nQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibm9uT3BlcmF0aW5DaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLm5vbk9wZXJhdGluQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90RW5hYmxlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90RW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTmVpZ2hib3JUU0ZPZmZzZXQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JUU0ZPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlJDUElNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SQ1BJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlJTTklNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SU05JTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkJzc0F2Z0FjY2Vzc0RlbGF5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJzc0F2Z0FjY2Vzc0RlbGF5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJCU1NBdmFpbEFkbWlzc2lvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CU1NBdmFpbEFkbWlzc2lvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQW50ZW5uYUluZm9ybWF0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkFudGVubmFJbmZvcm1hdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJNb2JpbGl0eURvbWFpbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1vYmlsaXR5RG9tYWluLk1ESUQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm92ZXJEU0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ub3ZlckRTQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNvdXJjZVJlcUNhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ucmVzb3VyY2VSZXFDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIldQQTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XUEEucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XUEEudmVyc2lvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5tdWx0aWNhc3RfY2lwaGVyLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVycywgNCAqIHBGcm0tPldQQS51bmljYXN0X2NpcGhlcl9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5hdXRoX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+V1BBLmF1dGhfc3VpdGVzLCA0ICogcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XUEEuY2FwcywgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkhUQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5IVENhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFkdkNvZGluZ0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFkdkNvZGluZ0NhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgic3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJtaW1vUG93ZXJTYXZlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWltb1Bvd2VyU2F2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiZ3JlZW5GaWVsZCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmdyZWVuRmllbGQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInNob3J0R0kyME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnNob3J0R0kyME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgic2hvcnRHSTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ0eFNUQkMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFNUQkMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJ4U1RCQyAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZGVsYXllZEJBKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJtYXhpbWFsQU1TRFVzaXplICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4aW1hbEFNU0RVc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiZHNzc0Nja01vZGU0ME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmRzc3NDY2tNb2RlNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInBzbXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wc21wKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJzdGJjQ29udHJvbEZyYW1lICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc3RiY0NvbnRyb2xGcmFtZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubHNpZ1RYT1BQcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJtYXhSeEFNUERVRmFjdG9yICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4UnhBTVBEVUZhY3Rvcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibXBkdURlbnNpdHkgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tcGR1RGVuc2l0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQxICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+SFRDYXBzLnN1cHBvcnRlZE1DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInBjbyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBjbyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidHJhbnNpdGlvblRpbWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50cmFuc2l0aW9uVGltZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQyICg1KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJtY3NGZWVkYmFjayAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1jc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZDMgKDYpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyeFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidHhTdGFnZ2VyZWRTb3VuZGluZyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U3RhZ2dlcmVkU291bmRpbmcpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJ4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInR4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImltcGxpY2l0VHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmltcGxpY2l0VHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiY2FsaWJyYXRpb24gKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jYWxpYnJhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiZXhwbGljaXRDU0lUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiZXhwbGljaXRCRkNTSUZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRCRkNTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJjc2lOdW1CRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY3NpTnVtQkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJjb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQ0ICg3KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhbnRlbm5hU2VsZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYVNlbGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFja1R4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lGZWVkYmFja1R4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImV4cGxpY2l0Q1NJRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYUluZGljZXNGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicnhBUyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4QVMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInR4U291bmRpbmdQUERVcyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U291bmRpbmdQUERVcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQ1ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ1KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+SFRDYXBzLnJzdmQsIHBGcm0tPkhUQ2Fwcy5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkhUSW5mbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5IVEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5IVEluZm8ucHJpbWFyeUNoYW5uZWwsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInNlY29uZGFyeUNoYW5uZWxPZmZzZXQgKDIpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZWNvbW1lbmRlZFR4V2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJpZnNNb2RlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmlmc01vZGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImNvbnRyb2xsZWRBY2Nlc3NPbmx5ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uY29udHJvbGxlZEFjY2Vzc09ubHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2VydmljZUludGVydmFsR3JhbnVsYXJpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm9wTW9kZSAoMik6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm9wTW9kZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibm9uR0ZEZXZpY2VzUHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm5vbkdGRGV2aWNlc1ByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInRyYW5zbWl0QnVyc3RMaW1pdCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnRyYW5zbWl0QnVyc3RMaW1pdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgib2Jzc05vbkhUU3RhUHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm9ic3NOb25IVFN0YVByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJlc2VydmVkICgxMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJiYXNpY1NUQkNNQ1MgKDcpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5iYXNpY1NUQkNNQ1MpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImR1YWxDVFNQcm90ZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uZHVhbENUU1Byb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInNlY29uZGFyeUJlYWNvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUJlYWNvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicGNvQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucGNvQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJwY29QaGFzZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnBjb1BoYXNlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZDIgKDQpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5IVEluZm8uYmFzaWNNQ1NTZXQsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRJbmZvLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+SFRJbmZvLnJzdmQsIHBGcm0tPkhUSW5mby5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkV4dENoYW5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RXh0Q2hhblN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkV4dENoYW5Td2l0Y2hBbm4uc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIldNTUluZm9BcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1JbmZvQXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1JbmZvQXAudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicGFyYW1fc2V0X2NvdW50ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvQXAucGFyYW1fc2V0X2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZCAoMyk6ICVkXG4iKSwgcEZybS0+V01NSW5mb0FwLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NSW5mb0FwLnVhcHNkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiV01NUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTVBhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLnFvc0luZm8sIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucmVzZXJ2ZWQyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmVfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMudW51c2VkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZpX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdm9fYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJXTU1DYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTUNhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1DYXBzLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInJlc2VydmVkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJxYWNrICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnFhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInF1ZXVlX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucXVldWVfcmVxdWVzdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidHhvcF9yZXF1ZXN0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnR4b3BfcmVxdWVzdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibW9yZV9hY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMubW9yZV9hY2spOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJXQVBJOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldBUEkucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLnZlcnNpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLmFrbV9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUEkuYWttX3N1aXRlcywgNCAqIHBGcm0tPldBUEkuYWttX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPldBUEkudW5pY2FzdF9jaXBoZXJfc3VpdGVzLCA0ICogcEZybS0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkubXVsdGljYXN0X2NpcGhlcl9zdWl0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicHJlYXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+V0FQSS5wcmVhdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyZXNlcnZlZCAoMTUpOiAlZFxuIiksIHBGcm0tPldBUEkucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLmJraWRfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5XQVBJLmJraWQsIDE2ICogcEZybS0+V0FQSS5ia2lkX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQ0NYVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hWZXJzaW9uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVmVyc2lvbi52ZXJzaW9uLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQ0NYUmFkTWdtdENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hSYWRNZ210Q2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYUmFkTWdtdENhcC5tZ210X3N0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJtYnNzaWRfbWFzayAoMyk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5tYnNzaWRfbWFzayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgicmVzZXJ2ZWQgKDUpOiAlZFxuIiksIHBGcm0tPkNDWFJhZE1nbXRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJDQ1hUcmFmU3RybU1ldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUcmFmU3RybU1ldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnRzaWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC5zdGF0ZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0Lm1zbXRfaW50ZXJ2YWwsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJDQ1hUeG1pdFBvd2VyOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFR4bWl0UG93ZXIucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnBvd2VyX2xpbWl0LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHhtaXRQb3dlci5yZXNlcnZlZCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkFpcmdvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJQcm9wU3VwcFJhdGVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJBUE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkFQTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX25hbWU6ICVkLlxuIiksIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5BUE5hbWUubmFtZSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJIQ0Y6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkhDRi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkhDRi5lbmFibGVkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJXRFM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLldEUy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX3dkc0RhdGE6ICVkLlxuIiksIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5XRFMud2RzRGF0YSwgcEZybS0+QWlyZ28uV0RTLm51bV93ZHNEYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJCUEluZGljYXRvcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci5pbmRpY2F0b3IsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTG9hZEluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8ubnVtX3N0YXMsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8uY2hhbm5lbF91dGlsLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJMb2FkQmFsYW5jZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJQcm9wQXNzb2NUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEFzc29jVHlwZS50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJMTEF0dHI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxMQXR0ci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxMQXR0ci5kZWZlcl90aHJlc2hvbGQsIDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlByb3BDYXBhYmlsaXR5OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LmNhcGFiaWxpdHksIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5WZXJzaW9uLmNoaXBfcmV2LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2FyZF90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX2J1aWxkX3ZlcnNpb246ICVkLlxuIiksIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uVmVyc2lvbi5idWlsZF92ZXJzaW9uLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJQcm9wRURDQVBhcmFtczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5xb3MsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmVfbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmVfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNia19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWNia19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZpX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZpX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdm9fbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImFjdm9fbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiVGl0YW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRpdGFuLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29uY2F0X3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbXByZXNzaW9uX3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNiX3N0YXRlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLnJldl9mY3Nfc3RhdGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlByb3BDaGFublN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLm1vZGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnByaW1hcnlfY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4uc3ViX2JhbmQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLmNoYW5uZWxfc3dpdGNoX2NvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJQcm9wUXVpZXRCU1M6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfcGVyaW9kLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfb2Zmc2V0LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJUcmlnZ2VyU3RhQmdTY2FuOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UcmlnZ2VyU3RhQmdTY2FuLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5lbmFibGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlRhdXJ1czpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGF1cnVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhVElEQml0bWFwLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVBvbGljeSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoImJhQnVmZmVyU2l6ZSAoMTIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlRhdXJ1cy5iYUJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJyc3ZkICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMucnN2ZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIldzY0JlYWNvblByb2JlUmVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJWZXJzaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5WZXJzaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuVmVyc2lvbi5taW5vcik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5WZXJzaW9uLm1ham9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJXUFNTdGF0ZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuV1BTU3RhdGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5XUFNTdGF0ZS5zdGF0ZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiQVBTZXR1cExvY2tlZDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuQVBTZXR1cExvY2tlZC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvblByb2JlUmVzLkFQU2V0dXBMb2NrZWQuZkxvY2tlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiU2VsZWN0ZWRSZWdpc3RyYXI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLlNlbGVjdGVkUmVnaXN0cmFyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuU2VsZWN0ZWRSZWdpc3RyYXIuc2VsZWN0ZWQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkRldmljZVBhc3N3b3JkSUQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLkRldmljZVBhc3N3b3JkSUQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5EZXZpY2VQYXNzd29yZElELmlkLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJTZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvblByb2JlUmVzLlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5tZXRob2RzLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJSZXNwb25zZVR5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLlJlc3BvbnNlVHlwZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvblByb2JlUmVzLlJlc3BvbnNlVHlwZS5yZXNUeXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJVVUlEX0U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLlVVSURfRS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvblByb2JlUmVzLlVVSURfRS51dWlkLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTWFudWZhY3R1cmVyOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5NYW51ZmFjdHVyZXIucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV9uYW1lOiAlZC5cbiIpLCBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5NYW51ZmFjdHVyZXIubnVtX25hbWUpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuTWFudWZhY3R1cmVyLm5hbWUsIHBGcm0tPldzY0JlYWNvblByb2JlUmVzLk1hbnVmYWN0dXJlci5udW1fbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTW9kZWxOYW1lOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5Nb2RlbE5hbWUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5Nb2RlbE5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuTW9kZWxOYW1lLnRleHQsIHBGcm0tPldzY0JlYWNvblByb2JlUmVzLk1vZGVsTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTW9kZWxOdW1iZXI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLk1vZGVsTnVtYmVyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuTW9kZWxOdW1iZXIubnVtX3RleHQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuTW9kZWxOdW1iZXIudGV4dCwgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuTW9kZWxOdW1iZXIubnVtX3RleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlNlcmlhbE51bWJlcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuU2VyaWFsTnVtYmVyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuU2VyaWFsTnVtYmVyLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPldzY0JlYWNvblByb2JlUmVzLlNlcmlhbE51bWJlci50ZXh0LCBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5TZXJpYWxOdW1iZXIubnVtX3RleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlByaW1hcnlEZXZpY2VUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5QcmltYXJ5RGV2aWNlVHlwZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvblByb2JlUmVzLlByaW1hcnlEZXZpY2VUeXBlLnByaW1hcnlfY2F0ZWdvcnksIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuUHJpbWFyeURldmljZVR5cGUub3VpLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY0JlYWNvblByb2JlUmVzLlByaW1hcnlEZXZpY2VUeXBlLnN1Yl9jYXRlZ29yeSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiRGV2aWNlTmFtZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuRGV2aWNlTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPldzY0JlYWNvblByb2JlUmVzLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuRGV2aWNlTmFtZS50ZXh0LCBwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJDb25maWdNZXRob2RzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5Db25maWdNZXRob2RzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuQ29uZmlnTWV0aG9kcy5tZXRob2RzLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJSRkJhbmRzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5SRkJhbmRzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuUkZCYW5kcy5iYW5kcywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiVmVuZG9yRXh0ZW5zaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24udmVuZG9ySWQsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJWZXJzaW9uMjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY0JlYWNvblByb2JlUmVzLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibWlub3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY0JlYWNvblByb2JlUmVzLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5taW5vcik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJtYWpvciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1ham9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkF1dGhvcml6ZWRNQUNzOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLkF1dGhvcml6ZWRNQUNzLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLkF1dGhvcml6ZWRNQUNzLm1hYywgNik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJSZXF1ZXN0VG9FbnJvbGw6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NCZWFjb25Qcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjQmVhY29uUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLlJlcXVlc3RUb0Vucm9sbC5yZXEsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUDJQQmVhY29uUHJvYmVSZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQQmVhY29uUHJvYmVSZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlAyUENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBDYXBhYmlsaXR5LmRldmljZUNhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQQ2FwYWJpbGl0eS5ncm91cENhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIlAyUERldmljZUlkOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBEZXZpY2VJZC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUERldmljZUlkLlAyUERldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIkV4dGVuZGVkTGlzdGVuVGltaW5nOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5FeHRlbmRlZExpc3RlblRpbWluZy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvblByb2JlUmVzLkV4dGVuZGVkTGlzdGVuVGltaW5nLmF2YWlsaWJpbGl0eVBlcmlvZCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlJbnRlcnZhbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90aWNlT2ZBYnNlbmNlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UuaW5kZXgsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLkNUU1dpbmRvd09wcFBTLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgibnVtX05vQURlc2M6ICVkLlxuIiksIHBGcm0tPlAyUEJlYWNvblByb2JlUmVzLk5vdGljZU9mQWJzZW5jZS5udW1fTm9BRGVzYyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UuTm9BRGVzYywgcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJQMlBEZXZpY2VJbmZvOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBEZXZpY2VJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5QMlBEZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUERldmljZUluZm8uY29uZmlnTWV0aG9kLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUERldmljZUluZm8ucHJpbWFyeURldmljZVR5cGUsIDgpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJEZXZpY2VOYW1lOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUudGV4dCwgcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiUDJQR3JvdXBJbmZvOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBHcm91cEluZm8ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQkVBQ09OSUVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIEZSRkwoIm51bV9QMlBDbGllbnRJbmZvRGVzYzogJWQuXG4iKSwgcEZybS0+UDJQQmVhY29uUHJvYmVSZXMuUDJQR3JvdXBJbmZvLm51bV9QMlBDbGllbnRJbmZvRGVzYyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksICggdEFOSV9VOCogKSBwRnJtLT5QMlBCZWFjb25Qcm9iZVJlcy5QMlBHcm91cEluZm8uUDJQQ2xpZW50SW5mb0Rlc2MsIHBGcm0tPlAyUEJlYWNvblByb2JlUmVzLlAyUEdyb3VwSW5mby5udW1fUDJQQ2xpZW50SW5mb0Rlc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9CRUFDT05JRVMpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0JFQUNPTklFUyksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tCZWFjb25JRXMuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tDaGFubmVsU3dpdGNoKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZDaGFubmVsU3dpdGNoICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0NoYW5uZWxTd2l0Y2gsIElFU19DaGFubmVsU3dpdGNoKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0NIQU5ORUxTV0lUQ0gpLCBGUkZMKCJQYWNrZWQgdGhlIENoYW5uZWxTd2l0Y2g6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0NIQU5ORUxTV0lUQ0gpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksIEZSRkwoIkNoYW5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q2hhblN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0NIQU5ORUxTV0lUQ0gpLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5zd2l0Y2hNb2RlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9DSEFOTkVMU1dJVENIKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4ubmV3Q2hhbm5lbCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksICggdEFOSV9VOCogKSZwRnJtLT5DaGFuU3dpdGNoQW5uLnN3aXRjaENvdW50LCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksIEZSRkwoIkV4dENoYW5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RXh0Q2hhblN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0NIQU5ORUxTV0lUQ0gpLCAoIHRBTklfVTgqICkmcEZybS0+RXh0Q2hhblN3aXRjaEFubi5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0LCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfQ0hBTk5FTFNXSVRDSCksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tDaGFubmVsU3dpdGNoLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrRGVBdXRoKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZEZUF1dGggKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKHZvaWQpaTsKKyAgICAqcG5Db25zdW1lZCA9IDBVOworICAgIHN0YXR1cyA9IFBhY2tDb3JlKHBDdHgsICh0QU5JX1U4KilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLCBGRlNfRGVBdXRoLCBJRVNfRGVBdXRoKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFQVVUSCksIEZSRkwoIlBhY2tlZCB0aGUgRGVBdXRoOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVBVVRIKSwgRlJGTCgiUmVhc29uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVBVVRIKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJlYXNvbi5jb2RlLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFQVVUSCksIEZSRkwoIlAyUERlQXV0aDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBEZUF1dGgucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFQVVUSCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFQVVUSCksIEZSRkwoIk1pbm9yUmVhc29uQ29kZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQRGVBdXRoLk1pbm9yUmVhc29uQ29kZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUFVVEgpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVBVVRIKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUERlQXV0aC5NaW5vclJlYXNvbkNvZGUubWlub3JSZWFzb25Db2RlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVBVVRIKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUFVVEgpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrRGVBdXRoLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrRGVsQkFJbmQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkRlbEJBSW5kICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0RlbEJBSW5kLCBJRVNfRGVsQkFJbmQpOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMQkFJTkQpLCBGUkZMKCJQYWNrZWQgdGhlIERlbEJBSW5kOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMQkFJTkQpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTEJBSU5EKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTEJBSU5EKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMQkFJTkQpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxCQUlORCksIEZSRkwoIkRlbEJBUGFyYW1ldGVyU2V0OlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMQkFJTkQpLCBGUkZMKCJyZXNlcnZlZCAoMTEpOiAlZFxuIiksIHBGcm0tPkRlbEJBUGFyYW1ldGVyU2V0LnJlc2VydmVkKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTEJBSU5EKSwgRlJGTCgiaW5pdGlhdG9yICgxKTogJWRcbiIpLCBwRnJtLT5EZWxCQVBhcmFtZXRlclNldC5pbml0aWF0b3IpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMQkFJTkQpLCBGUkZMKCJ0aWQgKDQpOiAlZFxuIiksIHBGcm0tPkRlbEJBUGFyYW1ldGVyU2V0LnRpZCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxCQUlORCksIEZSRkwoIlJlYXNvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTEJBSU5EKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJlYXNvbi5jb2RlLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTEJBSU5EKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxCQUlORCksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tEZWxCQUluZC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0RlbFRTKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZEZWxUUyAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19EZWxUUywgSUVTX0RlbFRTKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgiUGFja2VkIHRoZSBEZWxUUzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBGUkZMKCJUU0luZm86XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+VFNJbmZvLnRyYWZmaWNfdHlwZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlRTSW5mby50c2lkKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5UU0luZm8uZGlyZWN0aW9uKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+VFNJbmZvLmFjY2Vzc19wb2xpY3kpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+VFNJbmZvLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5UU0luZm8ucHNiKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+VFNJbmZvLnVzZXJfcHJpb3JpdHkpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+VFNJbmZvLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFTFRTKSwgRlJGTCgic2NoZWR1bGUgKDEpOiAlZFxuIiksIHBGcm0tPlRTSW5mby5zY2hlZHVsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksIEZSRkwoInVudXNlZCAoMTUpOiAlZFxuIiksIHBGcm0tPlRTSW5mby51bnVzZWQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBGUkZMKCJSZWFzb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5SZWFzb24uY29kZSwgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERUxUUyksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVMVFMpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrRGVsVFMuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkRldmljZURpc2NvdmVyYWJpbGl0eVJlcSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19EZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEsIElFU19EZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEpOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgRlJGTCgiUGFja2VkIHRoZSBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXE6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJQMlBPVUk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJQMlBPVUlTdWJUeXBlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSVN1YlR5cGUub3VpU3VidHlwZSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXE6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJQMlBEZXZpY2VJZDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxLlAyUERldmljZUlkLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxLlAyUERldmljZUlkLlAyUERldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIlAyUEdyb3VwSWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcS5QMlBHcm91cElkLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxLlAyUEdyb3VwSWQuZGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIm51bV9zc2lkOiAlZC5cbiIpLCBwRnJtLT5QMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEuUDJQR3JvdXBJZC5udW1fc3NpZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEuUDJQR3JvdXBJZC5zc2lkLCBwRnJtLT5QMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEuUDJQR3JvdXBJZC5udW1fc3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVRKSwgcEJ1ZiwgbkJ1Zik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0RldmljZURpc2NvdmVyYWJpbGl0eVJlcS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0RldmljZURpc2NvdmVyYWJpbGl0eVJlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0RldmljZURpc2NvdmVyYWJpbGl0eVJlcywgSUVTX0RldmljZURpc2NvdmVyYWJpbGl0eVJlcyk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVMpLCBGUkZMKCJQYWNrZWQgdGhlIERldmljZURpc2NvdmVyYWJpbGl0eVJlczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoIlAyUE9VSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUkub3VpLCA0KTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoIlAyUE9VSVN1YlR5cGU6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJU3ViVHlwZS5vdWlTdWJ0eXBlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoIlAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RFVklDRURJU0NPVkVSQUJJTElUWVJFUyksIEZSRkwoIlAyUFN0YXR1czpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzLlAyUFN0YXR1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcy5QMlBTdGF0dXMuc3RhdHVzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfREVWSUNFRElTQ09WRVJBQklMSVRZUkVTKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ERVZJQ0VESVNDT1ZFUkFCSUxJVFlSRVMpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrRGlzYXNzb2NpYXRpb24odHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkRpc2Fzc29jaWF0aW9uICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0Rpc2Fzc29jaWF0aW9uLCBJRVNfRGlzYXNzb2NpYXRpb24pOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfRElTQVNTT0NJQVRJT04pLCBGUkZMKCJQYWNrZWQgdGhlIERpc2Fzc29jaWF0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfRElTQVNTT0NJQVRJT04pLCBGUkZMKCJSZWFzb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ESVNBU1NPQ0lBVElPTiksICggdEFOSV9VOCogKSZwRnJtLT5SZWFzb24uY29kZSwgMik7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ESVNBU1NPQ0lBVElPTiksIEZSRkwoIlAyUERpc0Fzc29jOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUERpc0Fzc29jLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ESVNBU1NPQ0lBVElPTiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RJU0FTU09DSUFUSU9OKSwgRlJGTCgiTWlub3JSZWFzb25Db2RlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBEaXNBc3NvYy5NaW5vclJlYXNvbkNvZGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfRElTQVNTT0NJQVRJT04pLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfRElTQVNTT0NJQVRJT04pLCAoIHRBTklfVTgqICkmcEZybS0+UDJQRGlzQXNzb2MuTWlub3JSZWFzb25Db2RlLm1pbm9yUmVhc29uQ29kZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0RJU0FTU09DSUFUSU9OKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ESVNBU1NPQ0lBVElPTiksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tEaXNhc3NvY2lhdGlvbi4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0dPRGlzY292ZXJhYmlsaXR5UmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZHT0Rpc2NvdmVyYWJpbGl0eVJlcSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19HT0Rpc2NvdmVyYWJpbGl0eVJlcSwgSUVTX0dPRGlzY292ZXJhYmlsaXR5UmVxKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPRElTQ09WRVJBQklMSVRZUkVRKSwgRlJGTCgiUGFja2VkIHRoZSBHT0Rpc2NvdmVyYWJpbGl0eVJlcTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPRElTQ09WRVJBQklMSVRZUkVRKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT0RJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT0RJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoIlAyUE9VSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPRElTQ09WRVJBQklMSVRZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSS5vdWksIDQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ESVNDT1ZFUkFCSUxJVFlSRVEpLCBGUkZMKCJQMlBPVUlTdWJUeXBlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ESVNDT1ZFUkFCSUxJVFlSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJU3ViVHlwZS5vdWlTdWJ0eXBlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPRElTQ09WRVJBQklMSVRZUkVRKSwgRlJGTCgiRGlhbG9nVG9rZW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT0RJU0NPVkVSQUJJTElUWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT0RJU0NPVkVSQUJJTElUWVJFUSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ESVNDT1ZFUkFCSUxJVFlSRVEpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrR09EaXNjb3ZlcmFiaWxpdHlSZXEuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tHT05lZ0NuZih0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmR09OZWdDbmYgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKHZvaWQpaTsKKyAgICAqcG5Db25zdW1lZCA9IDBVOworICAgIHN0YXR1cyA9IFBhY2tDb3JlKHBDdHgsICh0QU5JX1U4KilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLCBGRlNfR09OZWdDbmYsIElFU19HT05lZ0NuZik7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIlBhY2tlZCB0aGUgR09OZWdDbmY6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIlAyUE9VSVN1YlR5cGU6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgiUDJQR09OZWdDbmY6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdDbmYucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJQMlBTdGF0dXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnQ25mLlAyUFN0YXR1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ0NuZi5QMlBTdGF0dXMuc3RhdHVzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIlAyUENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnQ25mLlAyUENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdDbmYuUDJQQ2FwYWJpbGl0eS5kZXZpY2VDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdDbmYuUDJQQ2FwYWJpbGl0eS5ncm91cENhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgiT3BlcmF0aW5nQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdDbmYuT3BlcmF0aW5nQ2hhbm5lbC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ0NuZi5PcGVyYXRpbmdDaGFubmVsLmNvdW50cnlTdHJpbmcsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ0NuZi5PcGVyYXRpbmdDaGFubmVsLnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnQ25mLk9wZXJhdGluZ0NoYW5uZWwuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJDaGFubmVsTGlzdDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdDbmYuQ2hhbm5lbExpc3QucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdDbmYuQ2hhbm5lbExpc3QuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgibnVtX2NoYW5uZWxMaXN0OiAlZC5cbiIpLCBwRnJtLT5QMlBHT05lZ0NuZi5DaGFubmVsTGlzdC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksICggdEFOSV9VOCogKSBwRnJtLT5QMlBHT05lZ0NuZi5DaGFubmVsTGlzdC5jaGFubmVsTGlzdCwgcEZybS0+UDJQR09OZWdDbmYuQ2hhbm5lbExpc3QubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIEZSRkwoIlAyUEdyb3VwSWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnQ25mLlAyUEdyb3VwSWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdDbmYuUDJQR3JvdXBJZC5kZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdDTkYpLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+UDJQR09OZWdDbmYuUDJQR3JvdXBJZC5udW1fc3NpZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEdPTmVnQ25mLlAyUEdyb3VwSWQuc3NpZCwgcEZybS0+UDJQR09OZWdDbmYuUDJQR3JvdXBJZC5udW1fc3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHQ05GKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR0NORiksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tHT05lZ0NuZi4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0dPTmVnUmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZHT05lZ1JlcSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19HT05lZ1JlcSwgSUVTX0dPTmVnUmVxKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiUGFja2VkIHRoZSBHT05lZ1JlcTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJQMlBPVUk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUkub3VpLCA0KTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSVN1YlR5cGUub3VpU3VidHlwZSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJQMlBHT05lZ1dQUzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1dQUy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnV1BTLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+UDJQR09OZWdXUFMuVmVyc2lvbi5taW5vcik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgibWFqb3IgKDQpOiAlZFxuIiksIHBGcm0tPlAyUEdPTmVnV1BTLlZlcnNpb24ubWFqb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiRGV2aWNlUGFzc3dvcmRJRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdXUFMuRGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1dQUy5EZXZpY2VQYXNzd29yZElELmlkLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJQMlBHT05lZ1JlcTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1JlcS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIlAyUENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVxLlAyUENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuUDJQQ2FwYWJpbGl0eS5kZXZpY2VDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuUDJQQ2FwYWJpbGl0eS5ncm91cENhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiR09JbnRlbnQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVxLkdPSW50ZW50LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLkdPSW50ZW50LkdPSW50ZW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIkNvbmZpZ3VyYXRpb25UaW1lb3V0OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1JlcS5Db25maWd1cmF0aW9uVGltZW91dC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5Db25maWd1cmF0aW9uVGltZW91dC5HT0NvbmZpZ1RpbWVvdXQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5Db25maWd1cmF0aW9uVGltZW91dC5DTENvbmZpZ1RpbWVvdXQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiTGlzdGVuQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXEuTGlzdGVuQ2hhbm5lbC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5MaXN0ZW5DaGFubmVsLmNvdW50cnlTdHJpbmcsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5MaXN0ZW5DaGFubmVsLnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLkxpc3RlbkNoYW5uZWwuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJFeHRlbmRlZExpc3RlblRpbWluZzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXEuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcuYXZhaWxpYmlsaXR5UGVyaW9kLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcuYXZhaWxpYmlsaXR5SW50ZXJ2YWwsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiSW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1JlcS5JbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuSW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzLlAyUEludGVyZmFjZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiQ2hhbm5lbExpc3Q6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVxLkNoYW5uZWxMaXN0LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLkNoYW5uZWxMaXN0LmNvdW50cnlTdHJpbmcsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIm51bV9jaGFubmVsTGlzdDogJWQuXG4iKSwgcEZybS0+UDJQR09OZWdSZXEuQ2hhbm5lbExpc3QubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQR09OZWdSZXEuQ2hhbm5lbExpc3QuY2hhbm5lbExpc3QsIHBGcm0tPlAyUEdPTmVnUmVxLkNoYW5uZWxMaXN0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCBGUkZMKCJQMlBEZXZpY2VJbmZvOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1JlcS5QMlBEZXZpY2VJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLlAyUERldmljZUluZm8uUDJQRGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLlAyUERldmljZUluZm8uY29uZmlnTWV0aG9kLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXEuUDJQRGV2aWNlSW5mby5wcmltYXJ5RGV2aWNlVHlwZSwgOCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiRGV2aWNlTmFtZTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVxLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5QMlBHT05lZ1JlcS5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVEpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQR09OZWdSZXEuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLnRleHQsIHBGcm0tPlAyUEdPTmVnUmVxLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgiT3BlcmF0aW5nQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXEuT3BlcmF0aW5nQ2hhbm5lbC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5PcGVyYXRpbmdDaGFubmVsLmNvdW50cnlTdHJpbmcsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1JlcS5PcGVyYXRpbmdDaGFubmVsLnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVxLk9wZXJhdGluZ0NoYW5uZWwuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVRKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUSksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tHT05lZ1JlcS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0dPTmVnUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZHT05lZ1JlcyAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19HT05lZ1JlcywgSUVTX0dPTmVnUmVzKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiUGFja2VkIHRoZSBHT05lZ1JlczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJQMlBPVUk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUkub3VpLCA0KTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSVN1YlR5cGUub3VpU3VidHlwZSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJQMlBHT05lZ1dQUzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1dQUy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnV1BTLlZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+UDJQR09OZWdXUFMuVmVyc2lvbi5taW5vcik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgibWFqb3IgKDQpOiAlZFxuIiksIHBGcm0tPlAyUEdPTmVnV1BTLlZlcnNpb24ubWFqb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiRGV2aWNlUGFzc3dvcmRJRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdXUFMuRGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1dQUy5EZXZpY2VQYXNzd29yZElELmlkLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJQMlBHT05lZ1JlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1Jlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIlAyUFN0YXR1czpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXMuUDJQU3RhdHVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVzLlAyUFN0YXR1cy5zdGF0dXMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiUDJQQ2FwYWJpbGl0eTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXMuUDJQQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5QMlBDYXBhYmlsaXR5LmRldmljZUNhcGFiaWxpdHksIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5QMlBDYXBhYmlsaXR5Lmdyb3VwQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJHT0ludGVudDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXMuR09JbnRlbnQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXMuR09JbnRlbnQuR09JbnRlbnQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiQ29uZmlndXJhdGlvblRpbWVvdXQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVzLkNvbmZpZ3VyYXRpb25UaW1lb3V0LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVzLkNvbmZpZ3VyYXRpb25UaW1lb3V0LkdPQ29uZmlnVGltZW91dCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVzLkNvbmZpZ3VyYXRpb25UaW1lb3V0LkNMQ29uZmlnVGltZW91dCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJPcGVyYXRpbmdDaGFubmVsOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1Jlcy5PcGVyYXRpbmdDaGFubmVsLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVzLk9wZXJhdGluZ0NoYW5uZWwuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVzLk9wZXJhdGluZ0NoYW5uZWwucmVndWxhdG9yeUNsYXNzLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXMuT3BlcmF0aW5nQ2hhbm5lbC5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXMuSW50ZW5kZWRQMlBJbnRlcmZhY2VBZGRyZXNzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVzLkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcy5QMlBJbnRlcmZhY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIkNoYW5uZWxMaXN0OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1Jlcy5DaGFubmVsTGlzdC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5DaGFubmVsTGlzdC5jb3VudHJ5U3RyaW5nLCAzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJudW1fY2hhbm5lbExpc3Q6ICVkLlxuIiksIHBGcm0tPlAyUEdPTmVnUmVzLkNoYW5uZWxMaXN0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEdPTmVnUmVzLkNoYW5uZWxMaXN0LmNoYW5uZWxMaXN0LCBwRnJtLT5QMlBHT05lZ1Jlcy5DaGFubmVsTGlzdC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgiUDJQRGV2aWNlSW5mbzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQR09OZWdSZXMuUDJQRGV2aWNlSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5QMlBEZXZpY2VJbmZvLlAyUERldmljZUFkZHJlc3MsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBHT05lZ1Jlcy5QMlBEZXZpY2VJbmZvLmNvbmZpZ01ldGhvZCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEdPTmVnUmVzLlAyUERldmljZUluZm8ucHJpbWFyeURldmljZVR5cGUsIDgpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIkRldmljZU5hbWU6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBHT05lZ1Jlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+UDJQR09OZWdSZXMuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEdPTmVnUmVzLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS50ZXh0LCBwRnJtLT5QMlBHT05lZ1Jlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIEZSRkwoIlAyUEdyb3VwSWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEdPTmVnUmVzLlAyUEdyb3VwSWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQR09OZWdSZXMuUDJQR3JvdXBJZC5kZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfR09ORUdSRVMpLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+UDJQR09OZWdSZXMuUDJQR3JvdXBJZC5udW1fc3NpZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEdPTmVnUmVzLlAyUEdyb3VwSWQuc3NpZCwgcEZybS0+UDJQR09OZWdSZXMuUDJQR3JvdXBJZC5udW1fc3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0dPTkVHUkVTKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9HT05FR1JFUyksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tHT05lZ1Jlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0ludml0YXRpb25SZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZkludml0YXRpb25SZXEgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKHZvaWQpaTsKKyAgICAqcG5Db25zdW1lZCA9IDBVOworICAgIHN0YXR1cyA9IFBhY2tDb3JlKHBDdHgsICh0QU5JX1U4KilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLCBGRlNfSW52aXRhdGlvblJlcSwgSUVTX0ludml0YXRpb25SZXEpOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIlBhY2tlZCB0aGUgSW52aXRhdGlvblJlcTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUkub3VpLCA0KTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJQMlBPVUlTdWJUeXBlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiUDJQSW52aXRhdGlvblJlcTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIkNvbmZpZ3VyYXRpb25UaW1lb3V0OlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLkNvbmZpZ3VyYXRpb25UaW1lb3V0LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLkNvbmZpZ3VyYXRpb25UaW1lb3V0LkdPQ29uZmlnVGltZW91dCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5Db25maWd1cmF0aW9uVGltZW91dC5DTENvbmZpZ1RpbWVvdXQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJJbnZpdGF0aW9uRmxhZ3M6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEludml0YXRpb25SZXEuSW52aXRhdGlvbkZsYWdzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLkludml0YXRpb25GbGFncy5pbnZpdGF0aW9uRmxhZ3MsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJPcGVyYXRpbmdDaGFubmVsOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLk9wZXJhdGluZ0NoYW5uZWwucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXEuT3BlcmF0aW5nQ2hhbm5lbC5jb3VudHJ5U3RyaW5nLCAzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLk9wZXJhdGluZ0NoYW5uZWwucmVndWxhdG9yeUNsYXNzLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLk9wZXJhdGluZ0NoYW5uZWwuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIlAyUEdyb3VwQnNzaWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEludml0YXRpb25SZXEuUDJQR3JvdXBCc3NpZC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBHcm91cEJzc2lkLlAyUEdyb3VwQnNzaWQsIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJDaGFubmVsTGlzdDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcS5DaGFubmVsTGlzdC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5DaGFubmVsTGlzdC5jb3VudHJ5U3RyaW5nLCAzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIm51bV9jaGFubmVsTGlzdDogJWQuXG4iKSwgcEZybS0+UDJQSW52aXRhdGlvblJlcS5DaGFubmVsTGlzdC5udW1fY2hhbm5lbExpc3QpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUEludml0YXRpb25SZXEuQ2hhbm5lbExpc3QuY2hhbm5lbExpc3QsIHBGcm0tPlAyUEludml0YXRpb25SZXEuQ2hhbm5lbExpc3QubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiUDJQR3JvdXBJZDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBHcm91cElkLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLlAyUEdyb3VwSWQuZGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBHcm91cElkLm51bV9zc2lkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLlAyUEdyb3VwSWQuc3NpZCwgcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBHcm91cElkLm51bV9zc2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgiUDJQRGV2aWNlSW5mbzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBEZXZpY2VJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLlAyUERldmljZUluZm8uUDJQRGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBEZXZpY2VJbmZvLmNvbmZpZ01ldGhvZCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBEZXZpY2VJbmZvLnByaW1hcnlEZXZpY2VUeXBlLCA4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksIEZSRkwoIkRldmljZU5hbWU6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVEpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+UDJQSW52aXRhdGlvblJlcS5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS50ZXh0LCBwRnJtLT5QMlBJbnZpdGF0aW9uUmVxLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVRKSwgcEJ1ZiwgbkJ1Zik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja0ludml0YXRpb25SZXEuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tJbnZpdGF0aW9uUmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZJbnZpdGF0aW9uUmVzICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0ludml0YXRpb25SZXMsIElFU19JbnZpdGF0aW9uUmVzKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJQYWNrZWQgdGhlIEludml0YXRpb25SZXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksIEZSRkwoIlAyUE9VSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJU3ViVHlwZS5vdWlTdWJ0eXBlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksIEZSRkwoIlAyUEludml0YXRpb25SZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJQMlBTdGF0dXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEludml0YXRpb25SZXMuUDJQU3RhdHVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVzLlAyUFN0YXR1cy5zdGF0dXMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJDb25maWd1cmF0aW9uVGltZW91dDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcy5Db25maWd1cmF0aW9uVGltZW91dC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcy5Db25maWd1cmF0aW9uVGltZW91dC5HT0NvbmZpZ1RpbWVvdXQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXMuQ29uZmlndXJhdGlvblRpbWVvdXQuQ0xDb25maWdUaW1lb3V0LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiT3BlcmF0aW5nQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQSW52aXRhdGlvblJlcy5PcGVyYXRpbmdDaGFubmVsLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBJbnZpdGF0aW9uUmVzLk9wZXJhdGluZ0NoYW5uZWwuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcy5PcGVyYXRpbmdDaGFubmVsLnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQSW52aXRhdGlvblJlcy5PcGVyYXRpbmdDaGFubmVsLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJQMlBHcm91cEJzc2lkOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBJbnZpdGF0aW9uUmVzLlAyUEdyb3VwQnNzaWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXMuUDJQR3JvdXBCc3NpZC5QMlBHcm91cEJzc2lkLCA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgRlJGTCgiQ2hhbm5lbExpc3Q6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUEludml0YXRpb25SZXMuQ2hhbm5lbExpc3QucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9JTlZJVEFUSU9OUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUEludml0YXRpb25SZXMuQ2hhbm5lbExpc3QuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJudW1fY2hhbm5lbExpc3Q6ICVkLlxuIiksIHBGcm0tPlAyUEludml0YXRpb25SZXMuQ2hhbm5lbExpc3QubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfSU5WSVRBVElPTlJFUyksICggdEFOSV9VOCogKSBwRnJtLT5QMlBJbnZpdGF0aW9uUmVzLkNoYW5uZWxMaXN0LmNoYW5uZWxMaXN0LCBwRnJtLT5QMlBJbnZpdGF0aW9uUmVzLkNoYW5uZWxMaXN0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0lOVklUQVRJT05SRVMpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrSW52aXRhdGlvblJlcy4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja0xpbmtNZWFzdXJlbWVudFJlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTGlua01lYXN1cmVtZW50UmVwb3J0ICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX0xpbmtNZWFzdXJlbWVudFJlcG9ydCwgSUVTX0xpbmtNZWFzdXJlbWVudFJlcG9ydCk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJQYWNrZWQgdGhlIExpbmtNZWFzdXJlbWVudFJlcG9ydDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIlRQQ0VsZUlEOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRQQ0VsZUlELlRQQ0lkLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIlRQQ0VsZUxlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5UUENFbGVMZW4uVFBDTGVuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIlR4UG93ZXI6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+VHhQb3dlci50eFBvd2VyLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkxpbmtNYXJnaW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TGlua01hcmdpbi5saW5rTWFyZ2luLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIlJ4QW50ZW5uYUlkOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJ4QW50ZW5uYUlkLmFudGVubmFJZCwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJUeEFudGVubmFJZDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5UeEFudGVubmFJZC5hbnRlbm5hSWQsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiUkNQSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5SQ1BJLnJjcGksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiUlNOSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5SU05JLnJzbmksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVBPUlQpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrTGlua01lYXN1cmVtZW50UmVwb3J0LiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrTGlua01lYXN1cmVtZW50UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTGlua01lYXN1cmVtZW50UmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19MaW5rTWVhc3VyZW1lbnRSZXF1ZXN0LCBJRVNfTGlua01lYXN1cmVtZW50UmVxdWVzdCk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiUGFja2VkIHRoZSBMaW5rTWVhc3VyZW1lbnRSZXF1ZXN0OlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTElOS01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIlR4UG93ZXI6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlR4UG93ZXIudHhQb3dlciwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9MSU5LTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiTWF4VHhQb3dlcjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWF4VHhQb3dlci5tYXhUeFBvd2VyLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX0xJTktNRUFTVVJFTUVOVFJFUVVFU1QpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrTGlua01lYXN1cmVtZW50UmVxdWVzdC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja01lYXN1cmVtZW50UmVwb3J0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZNZWFzdXJlbWVudFJlcG9ydCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19NZWFzdXJlbWVudFJlcG9ydCwgSUVTX01lYXN1cmVtZW50UmVwb3J0KTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiUGFja2VkIHRoZSBNZWFzdXJlbWVudFJlcG9ydDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiTWVhc3VyZW1lbnRSZXBvcnQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQudG9rZW4sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgibGF0ZSAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQubGF0ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJpbmNhcGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LmluY2FwYWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJyZWZ1c2VkICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZWZ1c2VkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInVudXNlZCAoNSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQudW51c2VkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC50eXBlLCAxKTsKKyAgICAgICAgICAgIHN3aXRjaCAocEZybS0+TWVhc3VyZW1lbnRSZXBvcnQudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQmFzaWMuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQmFzaWMubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CYXNpYy5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiYnNzICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQmFzaWMuYnNzKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgib2ZkbV9wcmVhbWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkJhc2ljLm9mZG1fcHJlYW1ibGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJ1bmlkX3NpZ25hbCAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkJhc2ljLnVuaWRfc2lnbmFsKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgicmFkZXIgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CYXNpYy5yYWRlcik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInVubWVhc3VyZWQgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CYXNpYy51bm1lYXN1cmVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgidW51c2VkICgzKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQmFzaWMudW51c2VkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQ0NBLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkNDQS5tZWFzX3N0YXJ0X3RpbWUsIDgpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkNDQS5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5DQ0EuY2NhX2J1c3lfZnJhY3Rpb24sIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5SUElIaXN0b2dyYW0uY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuUlBJSGlzdG9ncmFtLm1lYXNfc3RhcnRfdGltZSwgOCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuUlBJSGlzdG9ncmFtLm1lYXNfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkwX2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkxX2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkyX2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGkzX2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk0X2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk1X2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk2X2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LlJQSUhpc3RvZ3JhbS5ycGk3X2RlbnNpdHksIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24ucmVnQ2xhc3MsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkJlYWNvbi5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24ubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24ubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoImNvbmRlbnNlZF9QSFkgKDcpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24uY29uZGVuc2VkX1BIWSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInJlcG9ydGVkX2ZyYW1lX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24ucmVwb3J0ZWRfZnJhbWVfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydC5yZXBvcnQuQmVhY29uLlJDUEksIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkJlYWNvbi5SU05JLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24uQlNTSUQsIDYpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnQucmVwb3J0LkJlYWNvbi5hbnRlbm5hX2lkLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0LnJlcG9ydC5CZWFjb24ucGFyZW50X1RTRiwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUE9SVCksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tNZWFzdXJlbWVudFJlcG9ydC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja01lYXN1cmVtZW50UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX01lYXN1cmVtZW50UmVxdWVzdCwgSUVTX01lYXN1cmVtZW50UmVxdWVzdCk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJQYWNrZWQgdGhlIE1lYXN1cmVtZW50UmVxdWVzdDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9NZWFzdXJlbWVudFJlcXVlc3Q7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIk1lYXN1cmVtZW50UmVxdWVzdFslZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF90b2tlbiwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoInBhcmFsbGVsICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ucGFyYWxsZWwpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJlbmFibGUgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5lbmFibGUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJyZXF1ZXN0ICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ucmVxdWVzdCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoInJlcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLnJlcG9ydCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoImR1cmF0aW9uTWFuZGF0b3J5ICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0uZHVyYXRpb25NYW5kYXRvcnkpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJ1bnVzZWQgKDMpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS51bnVzZWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3R5cGUsIDEpOworICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3R5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkJhc2ljLmNoYW5uZWxfbm8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CYXNpYy5tZWFzX3N0YXJ0X3RpbWUsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CYXNpYy5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQ0NBLmNoYW5uZWxfbm8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5DQ0EubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQ0NBLm1lYXNfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0uY2hhbm5lbF9ubywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LlJQSUhpc3RvZ3JhbS5tZWFzX3N0YXJ0X3RpbWUsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0ubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5yZWdDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLnJhbmRvbWl6YXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5tZWFzX21vZGUsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQlNTSUQsIDYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTUVBU1VSRU1FTlRSRVFVRVNUKSwgcEJ1ZiwgbkJ1Zik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja01lYXN1cmVtZW50UmVxdWVzdC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja05laWdoYm9yUmVwb3J0UmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmTmVpZ2hib3JSZXBvcnRSZXF1ZXN0ICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX05laWdoYm9yUmVwb3J0UmVxdWVzdCwgSUVTX05laWdoYm9yUmVwb3J0UmVxdWVzdCk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFUVVFU1QpLCBGUkZMKCJQYWNrZWQgdGhlIE5laWdoYm9yUmVwb3J0UmVxdWVzdDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksIEZSRkwoIkFjdGlvbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksIEZSRkwoIlNTSUQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U1NJRC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVFVRVNUKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5TU0lELnNzaWQsIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFUVVFU1QpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tOZWlnaGJvclJlcG9ydFJlcXVlc3QuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tOZWlnaGJvclJlcG9ydFJlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZOZWlnaGJvclJlcG9ydFJlc3BvbnNlICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX05laWdoYm9yUmVwb3J0UmVzcG9uc2UsIElFU19OZWlnaGJvclJlcG9ydFJlc3BvbnNlKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJQYWNrZWQgdGhlIE5laWdoYm9yUmVwb3J0UmVzcG9uc2U6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5udW1fTmVpZ2hib3JSZXBvcnQ7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJOZWlnaGJvclJlcG9ydFslZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJBUFJlYWNoYWJpbGl0eSAoMik6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uQVBSZWFjaGFiaWxpdHkpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiU2VjdXJpdHkgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlNlY3VyaXR5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIktleVNjb3BlICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5LZXlTY29wZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJTcGVjTWdtdENhcCAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uU3BlY01nbXRDYXApOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiUW9zQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5Rb3NDYXApOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiYXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uYXBzZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJycm0gKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLnJybSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJEZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLkRlbGF5ZWRCQSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJJbW1CQSAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uSW1tQkEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTW9iaWxpdHlEb21haW4gKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk1vYmlsaXR5RG9tYWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg1KTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5yZXNlcnZlZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0ucmVzZXJ2ZWQxLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5yZWd1bGF0b3J5Q2xhc3MsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlBoeVR5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiVFNGSW5mbzpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlRTRkluZm8ucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlRTRkluZm8uVHNmT2Zmc2V0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uVFNGSW5mby5CZWFjb25JbnR2bCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiQ29uZGVuc2VkQ291bnRyeVN0cjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLkNvbmRlbnNlZENvdW50cnlTdHIucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLkNvbmRlbnNlZENvdW50cnlTdHIuY291bnRyeVN0ciwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdDpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk1lYXN1cmVtZW50UGlsb3QucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk1lYXN1cmVtZW50UGlsb3QubWVhc3VyZW1lbnRQaWxvdCwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgibnVtX3ZlbmRvclNwZWNpZmljOiAlZC5cbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5NZWFzdXJlbWVudFBpbG90Lm51bV92ZW5kb3JTcGVjaWZpYyk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk1lYXN1cmVtZW50UGlsb3QudmVuZG9yU3BlY2lmaWMsIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk1lYXN1cmVtZW50UGlsb3QubnVtX3ZlbmRvclNwZWNpZmljKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJSUk1FbmFibGVkQ2FwOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJMaW5rTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuTGlua01lYXN1cmVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJOZWlnaGJvclJwdCAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5OZWlnaGJvclJwdCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgicGFyYWxsZWwgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAucGFyYWxsZWwpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoInJlcGVhdGVkICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLnJlcGVhdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJCZWFjb25QYXNzaXZlICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkJlYWNvblBhc3NpdmUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkJlYWNvbkFjdGl2ZSAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5CZWFjb25BY3RpdmUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkJlYWNvblRhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkJlYWNvblRhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJCZWFjb25SZXBDb25kICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkJlYWNvblJlcENvbmQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkZyYW1lTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuRnJhbWVNZWFzdXJlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiQ2hhbm5lbExvYWQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuQ2hhbm5lbExvYWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIk5vaXNlSGlzdG9ncmFtICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLk5vaXNlSGlzdG9ncmFtKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJzdGF0aXN0aWNzICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLnN0YXRpc3RpY3MpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkxDSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkxDSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJMQ0lBemltdXRoICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkxDSUF6aW11dGgpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIlRDTUNhcGFiaWxpdHkgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuVENNQ2FwYWJpbGl0eSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgidHJpZ2dlcmVkVENNICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLnRyaWdnZXJlZFRDTSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiQVBDaGFuUmVwb3J0ICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLkFQQ2hhblJlcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiUlJNTUlCRW5hYmxlZCAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5SUk1NSUJFbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJvcGVyYXRpbmdDaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLm9wZXJhdGluZ0NoYW5NYXgpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIm5vbk9wZXJhdGluQ2hhbk1heCAoMyk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5ub25PcGVyYXRpbkNoYW5NYXgpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIk1lYXN1cmVtZW50UGlsb3QgKDMpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuTWVhc3VyZW1lbnRQaWxvdCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIk5laWdoYm9yVFNGT2Zmc2V0ICgxKTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLk5laWdoYm9yVFNGT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJSQ1BJTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuUkNQSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJSU05JTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuUlNOSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJCc3NBdmdBY2Nlc3NEZWxheSAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5Cc3NBdmdBY2Nlc3NEZWxheSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgiQlNTQXZhaWxBZG1pc3Npb24gKDEpOiAlZFxuIiksIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLlJSTUVuYWJsZWRDYXAuQlNTQXZhaWxBZG1pc3Npb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoIkFudGVubmFJbmZvcm1hdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uUlJNRW5hYmxlZENhcC5BbnRlbm5hSW5mb3JtYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTkVJR0hCT1JSRVBPUlRSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5SUk1FbmFibGVkQ2FwLnJlc2VydmVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJNdWx0aUJzc2lkOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uTXVsdGlCc3NpZC5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+TmVpZ2hib3JSZXBvcnRbaV0uTXVsdGlCc3NpZC5tYXhCU1NJREluZGljYXRvciwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgRlJGTCgibnVtX3ZlbmRvclNwZWNpZmljOiAlZC5cbiIpLCBwRnJtLT5OZWlnaGJvclJlcG9ydFtpXS5NdWx0aUJzc2lkLm51bV92ZW5kb3JTcGVjaWZpYyk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9ORUlHSEJPUlJFUE9SVFJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk11bHRpQnNzaWQudmVuZG9yU3BlY2lmaWMsIHBGcm0tPk5laWdoYm9yUmVwb3J0W2ldLk11bHRpQnNzaWQubnVtX3ZlbmRvclNwZWNpZmljKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05FSUdIQk9SUkVQT1JUUkVTUE9OU0UpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrTmVpZ2hib3JSZXBvcnRSZXNwb25zZS4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja05vdGljZU9mQWJzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZOb3RpY2VPZkFicyAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19Ob3RpY2VPZkFicywgSUVTX05vdGljZU9mQWJzKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgRlJGTCgiUGFja2VkIHRoZSBOb3RpY2VPZkFiczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9OT1RJQ0VPRkFCUyksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9OT1RJQ0VPRkFCUyksIEZSRkwoIlAyUE9VSTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSS5vdWksIDQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCBGUkZMKCJQMlBPVUlTdWJUeXBlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJU3ViVHlwZS5vdWlTdWJ0eXBlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgRlJGTCgiRGlhbG9nVG9rZW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9OT1RJQ0VPRkFCUyksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9OT1RJQ0VPRkFCUyksIEZSRkwoIlAyUE5vdGljZU9mQWJzZW5jZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBOb3RpY2VPZkFic2VuY2UucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCBGUkZMKCJOb3RpY2VPZkFic2VuY2U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUE5vdGljZU9mQWJzZW5jZS5Ob3RpY2VPZkFic2VuY2UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQTm90aWNlT2ZBYnNlbmNlLk5vdGljZU9mQWJzZW5jZS5pbmRleCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE5vdGljZU9mQWJzZW5jZS5Ob3RpY2VPZkFic2VuY2UuQ1RTV2luZG93T3BwUFMsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9OT1RJQ0VPRkFCUyksIEZSRkwoIm51bV9Ob0FEZXNjOiAlZC5cbiIpLCBwRnJtLT5QMlBOb3RpY2VPZkFic2VuY2UuTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQTm90aWNlT2ZBYnNlbmNlLk5vdGljZU9mQWJzZW5jZS5Ob0FEZXNjLCBwRnJtLT5QMlBOb3RpY2VPZkFic2VuY2UuTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfTk9USUNFT0ZBQlMpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX05PVElDRU9GQUJTKSwgcEJ1ZiwgbkJ1Zik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja05vdGljZU9mQWJzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrUHJlc2VuY2VSZXEodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlByZXNlbmNlUmVxICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX1ByZXNlbmNlUmVxLCBJRVNfUHJlc2VuY2VSZXEpOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCBGUkZMKCJQYWNrZWQgdGhlIFByZXNlbmNlUmVxOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQT1VJLm91aSwgNCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksIEZSRkwoIlAyUE9VSVN1YlR5cGU6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkRpYWxvZ1Rva2VuLnRva2VuLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgRlJGTCgiUDJQTm90aWNlT2ZBYnNlbmNlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUE5vdGljZU9mQWJzZW5jZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksIEZSRkwoIk5vdGljZU9mQWJzZW5jZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQTm90aWNlT2ZBYnNlbmNlLk5vdGljZU9mQWJzZW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBOb3RpY2VPZkFic2VuY2UuTm90aWNlT2ZBYnNlbmNlLmluZGV4LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQTm90aWNlT2ZBYnNlbmNlLk5vdGljZU9mQWJzZW5jZS5DVFNXaW5kb3dPcHBQUywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVRKSwgRlJGTCgibnVtX05vQURlc2M6ICVkLlxuIiksIHBGcm0tPlAyUE5vdGljZU9mQWJzZW5jZS5Ob3RpY2VPZkFic2VuY2UubnVtX05vQURlc2MpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBOb3RpY2VPZkFic2VuY2UuTm90aWNlT2ZBYnNlbmNlLk5vQURlc2MsIHBGcm0tPlAyUE5vdGljZU9mQWJzZW5jZS5Ob3RpY2VPZkFic2VuY2UubnVtX05vQURlc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVEpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrUHJlc2VuY2VSZXEuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tQcmVzZW5jZVJlcyh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUHJlc2VuY2VSZXMgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKHZvaWQpaTsKKyAgICAqcG5Db25zdW1lZCA9IDBVOworICAgIHN0YXR1cyA9IFBhY2tDb3JlKHBDdHgsICh0QU5JX1U4KilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLCBGRlNfUHJlc2VuY2VSZXMsIElFU19QcmVzZW5jZVJlcyk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksIEZSRkwoIlBhY2tlZCB0aGUgUHJlc2VuY2VSZXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCBGUkZMKCJQMlBPVUk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUkub3VpLCA0KTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSVN1YlR5cGUub3VpU3VidHlwZSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCBGUkZMKCJQMlBQcmVzZW5jZVJlc3BvbnNlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUFByZXNlbmNlUmVzcG9uc2UucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCBGUkZMKCJQMlBTdGF0dXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUFByZXNlbmNlUmVzcG9uc2UuUDJQU3RhdHVzLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByZXNlbmNlUmVzcG9uc2UuUDJQU3RhdHVzLnN0YXR1cywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCBGUkZMKCJOb3RpY2VPZkFic2VuY2U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUFByZXNlbmNlUmVzcG9uc2UuTm90aWNlT2ZBYnNlbmNlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByZXNlbmNlUmVzcG9uc2UuTm90aWNlT2ZBYnNlbmNlLmluZGV4LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJlc2VuY2VSZXNwb25zZS5Ob3RpY2VPZkFic2VuY2UuQ1RTV2luZG93T3BwUFMsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUkVTRU5DRVJFUyksIEZSRkwoIm51bV9Ob0FEZXNjOiAlZC5cbiIpLCBwRnJtLT5QMlBQcmVzZW5jZVJlc3BvbnNlLk5vdGljZU9mQWJzZW5jZS5udW1fTm9BRGVzYyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUFByZXNlbmNlUmVzcG9uc2UuTm90aWNlT2ZBYnNlbmNlLk5vQURlc2MsIHBGcm0tPlAyUFByZXNlbmNlUmVzcG9uc2UuTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJFU0VOQ0VSRVMpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BSRVNFTkNFUkVTKSwgcEJ1ZiwgbkJ1Zik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja1ByZXNlbmNlUmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrUHJvYmVSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZQcm9iZVJlcXVlc3QgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKHZvaWQpaTsKKyAgICAqcG5Db25zdW1lZCA9IDBVOworICAgIHN0YXR1cyA9IFBhY2tDb3JlKHBDdHgsICh0QU5JX1U4KilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLCBGRlNfUHJvYmVSZXF1ZXN0LCBJRVNfUHJvYmVSZXF1ZXN0KTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlBhY2tlZCB0aGUgUHJvYmVSZXF1ZXN0OlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiU1NJRDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TU0lELnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlNTSUQuc3NpZCwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlN1cHBSYXRlcy5yYXRlcywgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlJlcXVlc3RlZEluZm86XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UmVxdWVzdGVkSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibnVtX3JlcXVlc3RlZF9laWRzOiAlZC5cbiIpLCBwRnJtLT5SZXF1ZXN0ZWRJbmZvLm51bV9yZXF1ZXN0ZWRfZWlkcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlJlcXVlc3RlZEluZm8ucmVxdWVzdGVkX2VpZHMsIHBGcm0tPlJlcXVlc3RlZEluZm8ubnVtX3JlcXVlc3RlZF9laWRzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiRXh0U3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+RXh0U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiRFNQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RFNQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5EU1BhcmFtcy5jdXJyX2NoYW5uZWwsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJIVENhcHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+SFRDYXBzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJhZHZDb2RpbmdDYXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hZHZDb2RpbmdDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibWltb1Bvd2VyU2F2ZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1pbW9Qb3dlclNhdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImdyZWVuRmllbGQgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5ncmVlbkZpZWxkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJzaG9ydEdJMjBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zaG9ydEdJMjBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInNob3J0R0k0ME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnNob3J0R0k0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgidHhTVEJDICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTVEJDKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJyeFNUQkMgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFNUQkMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImRlbGF5ZWRCQSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmRlbGF5ZWRCQSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibWF4aW1hbEFNU0RVc2l6ZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1heGltYWxBTVNEVXNpemUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImRzc3NDY2tNb2RlNDBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5kc3NzQ2NrTW9kZTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJwc21wICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucHNtcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgic3RiY0NvbnRyb2xGcmFtZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnN0YmNDb250cm9sRnJhbWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImxzaWdUWE9QUHJvdGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmxzaWdUWE9QUHJvdGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibWF4UnhBTVBEVUZhY3RvciAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3IpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm1wZHVEZW5zaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubXBkdURlbnNpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJwY28gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wY28pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInRyYW5zaXRpb25UaW1lICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHJhbnNpdGlvblRpbWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMiAoNSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibWNzRmVlZGJhY2sgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tY3NGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQzICg2KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJ0eEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgicnhTdGFnZ2VyZWRTb3VuZGluZyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4U3RhZ2dlcmVkU291bmRpbmcpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInR4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJyeFpMRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4WkxGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJ0eFpMRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4WkxGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJpbXBsaWNpdFR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5pbXBsaWNpdFR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImNhbGlicmF0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY2FsaWJyYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0Q1NJVHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJVHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0QkZDU0lGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0QkZDU0lGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiY3NpTnVtQkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNzaU51bUJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInJlc2VydmVkNCAoNyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiYW50ZW5uYVNlbGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFTZWxlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0Q1NJRmVlZGJhY2tUeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2tUeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiYW50ZW5uYUluZGljZXNGZWVkYmFja1R4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYUluZGljZXNGZWVkYmFja1R4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENTSUZlZWRiYWNrICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiYW50ZW5uYUluZGljZXNGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFJbmRpY2VzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInJ4QVMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeEFTKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJ0eFNvdW5kaW5nUFBEVXMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFNvdW5kaW5nUFBEVXMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoInJlc2VydmVkNSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkNSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibnVtX3JzdmQ6ICVkLlxuIiksIHBGcm0tPkhUQ2Fwcy5udW1fcnN2ZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPkhUQ2Fwcy5yc3ZkLCBwRnJtLT5IVENhcHMubnVtX3JzdmQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJXc2NQcm9iZVJlcTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibWlub3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY1Byb2JlUmVxLlZlcnNpb24ubWlub3IpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJtYWpvciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjUHJvYmVSZXEuVmVyc2lvbi5tYWpvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiUmVxdWVzdFR5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLlJlcXVlc3RUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXEuUmVxdWVzdFR5cGUucmVxVHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiQ29uZmlnTWV0aG9kczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuQ29uZmlnTWV0aG9kcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLkNvbmZpZ01ldGhvZHMubWV0aG9kcywgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiVVVJRF9FOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5VVUlEX0UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5VVUlEX0UudXVpZCwgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlByaW1hcnlEZXZpY2VUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5QcmltYXJ5RGV2aWNlVHlwZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLlByaW1hcnlEZXZpY2VUeXBlLnByaW1hcnlfY2F0ZWdvcnksIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXEuUHJpbWFyeURldmljZVR5cGUub3VpLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLlByaW1hcnlEZXZpY2VUeXBlLnN1Yl9jYXRlZ29yeSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiUkZCYW5kczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuUkZCYW5kcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLlJGQmFuZHMuYmFuZHMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIkFzc29jaWF0aW9uU3RhdGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLkFzc29jaWF0aW9uU3RhdGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5Bc3NvY2lhdGlvblN0YXRlLnN0YXRlLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJDb25maWd1cmF0aW9uRXJyb3I6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLkNvbmZpZ3VyYXRpb25FcnJvci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLkNvbmZpZ3VyYXRpb25FcnJvci5lcnJvciwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiRGV2aWNlUGFzc3dvcmRJRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuRGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLkRldmljZVBhc3N3b3JkSUQuaWQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk1hbnVmYWN0dXJlcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuTWFudWZhY3R1cmVyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJudW1fbmFtZTogJWQuXG4iKSwgcEZybS0+V3NjUHJvYmVSZXEuTWFudWZhY3R1cmVyLm51bV9uYW1lKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPldzY1Byb2JlUmVxLk1hbnVmYWN0dXJlci5uYW1lLCBwRnJtLT5Xc2NQcm9iZVJlcS5NYW51ZmFjdHVyZXIubnVtX25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk1vZGVsTmFtZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuTW9kZWxOYW1lLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+V3NjUHJvYmVSZXEuTW9kZWxOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPldzY1Byb2JlUmVxLk1vZGVsTmFtZS50ZXh0LCBwRnJtLT5Xc2NQcm9iZVJlcS5Nb2RlbE5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk1vZGVsTnVtYmVyOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5Nb2RlbE51bWJlci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPldzY1Byb2JlUmVxLk1vZGVsTnVtYmVyLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPldzY1Byb2JlUmVxLk1vZGVsTnVtYmVyLnRleHQsIHBGcm0tPldzY1Byb2JlUmVxLk1vZGVsTnVtYmVyLm51bV90ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJEZXZpY2VOYW1lOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5EZXZpY2VOYW1lLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+V3NjUHJvYmVSZXEuRGV2aWNlTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NQcm9iZVJlcS5EZXZpY2VOYW1lLnRleHQsIHBGcm0tPldzY1Byb2JlUmVxLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIlZlbmRvckV4dGVuc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuVmVuZG9yRXh0ZW5zaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXEuVmVuZG9yRXh0ZW5zaW9uLnZlbmRvcklkLCAzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiVmVyc2lvbjI6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcS5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcS5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWlub3IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgibWFqb3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY1Byb2JlUmVxLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5tYWpvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJBdXRob3JpemVkTUFDczpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLlZlbmRvckV4dGVuc2lvbi5BdXRob3JpemVkTUFDcy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLlZlbmRvckV4dGVuc2lvbi5BdXRob3JpemVkTUFDcy5tYWMsIDYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiUmVxdWVzdFRvRW5yb2xsOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXEuVmVuZG9yRXh0ZW5zaW9uLlJlcXVlc3RUb0Vucm9sbC5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVxLlZlbmRvckV4dGVuc2lvbi5SZXF1ZXN0VG9FbnJvbGwucmVxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiUmVxdWVzdERldmljZVR5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVxLlJlcXVlc3REZXZpY2VUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXEuUmVxdWVzdERldmljZVR5cGUucHJpbWFyeV9jYXRlZ29yeSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcS5SZXF1ZXN0RGV2aWNlVHlwZS5vdWksIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXEuUmVxdWVzdERldmljZVR5cGUuc3ViX2NhdGVnb3J5LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiV0ZBVFBDOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldGQVRQQy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldGQVRQQy50eFBvd2VyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V0ZBVFBDLmxpbmtNYXJnaW4sIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJQMlBQcm9iZVJlcTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBQcm9iZVJlcS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiUDJQQ2FwYWJpbGl0eTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXEuUDJQQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb2JlUmVxLlAyUENhcGFiaWxpdHkuZGV2aWNlQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcS5QMlBDYXBhYmlsaXR5Lmdyb3VwQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiUDJQRGV2aWNlSWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlAyUFByb2JlUmVxLlAyUERldmljZUlkLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXEuUDJQRGV2aWNlSWQuUDJQRGV2aWNlQWRkcmVzcywgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiTGlzdGVuQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXEuTGlzdGVuQ2hhbm5lbC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb2JlUmVxLkxpc3RlbkNoYW5uZWwuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcS5MaXN0ZW5DaGFubmVsLnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcS5MaXN0ZW5DaGFubmVsLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIEZSRkwoIkV4dGVuZGVkTGlzdGVuVGltaW5nOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBQcm9iZVJlcS5FeHRlbmRlZExpc3RlblRpbWluZy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb2JlUmVxLkV4dGVuZGVkTGlzdGVuVGltaW5nLmF2YWlsaWJpbGl0eVBlcmlvZCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcS5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlJbnRlcnZhbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgRlJGTCgiT3BlcmF0aW5nQ2hhbm5lbDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXEuT3BlcmF0aW5nQ2hhbm5lbC5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb2JlUmVxLk9wZXJhdGluZ0NoYW5uZWwuY291bnRyeVN0cmluZywgMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcS5PcGVyYXRpbmdDaGFubmVsLnJlZ3VsYXRvcnlDbGFzcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcS5PcGVyYXRpbmdDaGFubmVsLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFUVVFU1QpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tQcm9iZVJlcXVlc3QuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tQcm9iZVJlc3BvbnNlKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZQcm9iZVJlc3BvbnNlICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX1Byb2JlUmVzcG9uc2UsIElFU19Qcm9iZVJlc3BvbnNlKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJQYWNrZWQgdGhlIFByb2JlUmVzcG9uc2U6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVGltZVN0YW1wOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5UaW1lU3RhbXAudGltZXN0YW1wLCA4KTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJCZWFjb25JbnRlcnZhbDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QmVhY29uSW50ZXJ2YWwuaW50ZXJ2YWwsIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkNhcGFiaWxpdGllczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJlc3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5lc3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImlic3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5pYnNzKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJjZlBvbGxhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsYWJsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiY2ZQb2xsUmVxICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsUmVxKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwcml2YWN5ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucHJpdmFjeSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgic2hvcnRQcmVhbWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInBiY2MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wYmNjKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJjaGFubmVsQWdpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNoYW5uZWxBZ2lsaXR5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJzcGVjdHJ1bU1ndCAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJxb3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5xb3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInNob3J0U2xvdFRpbWUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zaG9ydFNsb3RUaW1lKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuYXBzZCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicnJtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucnJtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJkc3NzT2ZkbSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmRzc3NPZmRtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJkZWxheWVkQkEgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5kZWxheWVkQkEpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImltbWVkaWF0ZUJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaW1tZWRpYXRlQkEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlNTSUQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U1NJRC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fc3NpZDogJWQuXG4iKSwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5TU0lELnNzaWQsIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiU3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPlN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkZIUGFyYW1TZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RkhQYXJhbVNldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXJhbVNldC5kd2VsbF90aW1lLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1TZXQuaG9wX3NldCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhcmFtU2V0LmhvcF9wYXR0ZXJuLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1TZXQuaG9wX2luZGV4LCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkRTUGFyYW1zOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkRTUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5EU1BhcmFtcy5jdXJyX2NoYW5uZWwsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQ0ZQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0ZQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNGUGFyYW1zLmNmcF9jb3VudCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DRlBhcmFtcy5jZnBfcGVyaW9kLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNGUGFyYW1zLmNmcF9tYXhkdXJhdGlvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DRlBhcmFtcy5jZnBfZHVycmVtYWluaW5nLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIklCU1NQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+SUJTU1BhcmFtcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+SUJTU1BhcmFtcy5hdGltLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkNvdW50cnk6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q291bnRyeS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q291bnRyeS5jb3VudHJ5LCAzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX3RyaXBsZXRzOiAlZC5cbiIpLCBwRnJtLT5Db3VudHJ5Lm51bV90cmlwbGV0cyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5Db3VudHJ5LnRyaXBsZXRzLCAzICogcEZybS0+Q291bnRyeS5udW1fdHJpcGxldHMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiRkhQYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RkhQYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1zLnJhZGl4LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGFyYW1zLm5jaGFubmVscywgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJGSFBhdHRUYWJsZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5GSFBhdHRUYWJsZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RkhQYXR0VGFibGUuZmxhZywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhdHRUYWJsZS5uc2V0cywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GSFBhdHRUYWJsZS5tb2R1bHVzLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZIUGF0dFRhYmxlLm9mZnNldCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm51bV9yYW5kdGFibGU6ICVkLlxuIiksIHBGcm0tPkZIUGF0dFRhYmxlLm51bV9yYW5kdGFibGUpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+RkhQYXR0VGFibGUucmFuZHRhYmxlLCBwRnJtLT5GSFBhdHRUYWJsZS5udW1fcmFuZHRhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlBvd2VyQ29uc3RyYWludHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UG93ZXJDb25zdHJhaW50cy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UG93ZXJDb25zdHJhaW50cy5sb2NhbFBvd2VyQ29uc3RyYWludHMsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQ2hhblN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DaGFuU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DaGFuU3dpdGNoQW5uLnN3aXRjaE1vZGUsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q2hhblN3aXRjaEFubi5uZXdDaGFubmVsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNoYW5Td2l0Y2hBbm4uc3dpdGNoQ291bnQsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUXVpZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UXVpZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0LmNvdW50LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlF1aWV0LnBlcmlvZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5RdWlldC5kdXJhdGlvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5RdWlldC5vZmZzZXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVFBDUmVwb3J0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlRQQ1JlcG9ydC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LnR4X3Bvd2VyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlRQQ1JlcG9ydC5saW5rX21hcmdpbiwgMSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJFUlBJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkVSUEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibm9uX2VycF9wcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLm5vbl9lcnBfcHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVzZV9wcm90ICgxKTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLnVzZV9wcm90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYmFya2VyX3ByZWFtYmxlICgxKTogJWRcbiIpLCBwRnJtLT5FUlBJbmZvLmJhcmtlcl9wcmVhbWJsZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZCAoNSk6ICVkXG4iKSwgcEZybS0+RVJQSW5mby51bnVzZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiRXh0U3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkV4dFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+RXh0U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlJTTjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5SU04ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi52ZXJzaW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi5ncF9jaXBoZXJfc3VpdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLnB3aXNlX2NpcGhlcl9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5SU04ucHdpc2VfY2lwaGVyX3N1aXRlcywgNCAqIHBGcm0tPlJTTi5wd2lzZV9jaXBoZXJfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOLmFrbV9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5SU04uYWttX3N1aXRlcywgNCAqIHBGcm0tPlJTTi5ha21fc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwcmVhdXRoICgxKTogJWRcbiIpLCBwRnJtLT5SU04ucHJlYXV0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm5vX3B3aXNlICgxKTogJWRcbiIpLCBwRnJtLT5SU04ubm9fcHdpc2UpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJQVEtTQV9yZXBsYXlfY291bnRlciAoMik6ICVkXG4iKSwgcEZybS0+UlNOLlBUS1NBX3JlcGxheV9jb3VudGVyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiR1RLU0FfcmVwbGF5X2NvdW50ZXIgKDIpOiAlZFxuIiksIHBGcm0tPlJTTi5HVEtTQV9yZXBsYXlfY291bnRlcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICgxMCk6ICVkXG4iKSwgcEZybS0+UlNOLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJTTi5wbWtpZF9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5SU04ucG1raWQsIDE2ICogcEZybS0+UlNOLnBta2lkX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlFCU1NMb2FkOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlFCU1NMb2FkLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5RQlNTTG9hZC5zdGFjb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5RQlNTTG9hZC5jaGF1dGlsLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlFCU1NMb2FkLmF2YWlsLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkVEQ0FQYXJhbVNldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FRENBUGFyYW1TZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5xb3MsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmtfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNia19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZpX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdmlfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlJSTUVuYWJsZWRDYXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlJNRW5hYmxlZENhcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJMaW5rTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTGlua01lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTmVpZ2hib3JScHQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JScHQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwYXJhbGxlbCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5wYXJhbGxlbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJlcGVhdGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnJlcGVhdGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQmVhY29uUGFzc2l2ZSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25QYXNzaXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQmVhY29uQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvbkFjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkJlYWNvblRhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvblRhYmxlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQmVhY29uUmVwQ29uZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CZWFjb25SZXBDb25kKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiRnJhbWVNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5GcmFtZU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQ2hhbm5lbExvYWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQ2hhbm5lbExvYWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb2lzZUhpc3RvZ3JhbSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5Ob2lzZUhpc3RvZ3JhbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInN0YXRpc3RpY3MgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuc3RhdGlzdGljcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkxDSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxDSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTENJQXppbXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MQ0lBemltdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVENNQ2FwYWJpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5UQ01DYXBhYmlsaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidHJpZ2dlcmVkVENNICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnRyaWdnZXJlZFRDTSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkFQQ2hhblJlcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BUENoYW5SZXBvcnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJSUk1NSUJFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJSTU1JQkVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJvcGVyYXRpbmdDaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLm9wZXJhdGluZ0NoYW5NYXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJub25PcGVyYXRpbkNoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAubm9uT3BlcmF0aW5DaGFuTWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOZWlnaGJvclRTRk9mZnNldCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5OZWlnaGJvclRTRk9mZnNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlJDUElNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SQ1BJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJSU05JTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlNOSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiQnNzQXZnQWNjZXNzRGVsYXkgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQnNzQXZnQWNjZXNzRGVsYXkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJCU1NBdmFpbEFkbWlzc2lvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CU1NBdmFpbEFkbWlzc2lvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkFudGVubmFJbmZvcm1hdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BbnRlbm5hSW5mb3JtYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoNik6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJBUENoYW5uZWxSZXBvcnQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+QVBDaGFubmVsUmVwb3J0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BUENoYW5uZWxSZXBvcnQucmVndWxhdG9yeUNsYXNzLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX2NoYW5uZWxMaXN0OiAlZC5cbiIpLCBwRnJtLT5BUENoYW5uZWxSZXBvcnQubnVtX2NoYW5uZWxMaXN0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFQQ2hhbm5lbFJlcG9ydC5jaGFubmVsTGlzdCwgcEZybS0+QVBDaGFubmVsUmVwb3J0Lm51bV9jaGFubmVsTGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJNb2JpbGl0eURvbWFpbjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+TW9iaWxpdHlEb21haW4uTURJRCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm92ZXJEU0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+TW9iaWxpdHlEb21haW4ub3ZlckRTQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzb3VyY2VSZXFDYXAgKDEpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc291cmNlUmVxQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIldQQTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XUEEucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS52ZXJzaW9uLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5tdWx0aWNhc3RfY2lwaGVyLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS51bmljYXN0X2NpcGhlcl9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5XUEEudW5pY2FzdF9jaXBoZXJzLCA0ICogcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5hdXRoX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPldQQS5hdXRoX3N1aXRlcywgNCAqIHBGcm0tPldQQS5hdXRoX3N1aXRlX2NvdW50KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5jYXBzLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkhUQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5IVENhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWR2Q29kaW5nQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYWR2Q29kaW5nQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgic3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibWltb1Bvd2VyU2F2ZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1pbW9Qb3dlclNhdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJncmVlbkZpZWxkICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZ3JlZW5GaWVsZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInNob3J0R0kyME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnNob3J0R0kyME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInNob3J0R0k0ME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnNob3J0R0k0ME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInR4U1RCQyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJ4U1RCQyAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImRlbGF5ZWRCQSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmRlbGF5ZWRCQSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1heGltYWxBTVNEVXNpemUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiZHNzc0Nja01vZGU0ME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmRzc3NDY2tNb2RlNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwc21wICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucHNtcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInN0YmNDb250cm9sRnJhbWUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdGJjQ29udHJvbEZyYW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubHNpZ1RYT1BQcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibWF4UnhBTVBEVUZhY3RvciAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1heFJ4QU1QRFVGYWN0b3IpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJtcGR1RGVuc2l0eSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1wZHVEZW5zaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQxICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUQ2Fwcy5zdXBwb3J0ZWRNQ1NTZXQsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicGNvICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucGNvKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidHJhbnNpdGlvblRpbWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50cmFuc2l0aW9uVGltZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJlc2VydmVkMiAoNSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1jc0ZlZWRiYWNrICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWNzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDMgKDYpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJ0eEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJ4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidHhTdGFnZ2VyZWRTb3VuZGluZyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U3RhZ2dlcmVkU291bmRpbmcpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyeFpMRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4WkxGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidHhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImltcGxpY2l0VHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmltcGxpY2l0VHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImNhbGlicmF0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY2FsaWJyYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdENTSVR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSVR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0QkZDU0lGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0QkZDU0lGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiY3NpTnVtQkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNzaU51bUJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJ1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJjb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJlc2VydmVkNCAoNyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkNCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFudGVubmFTZWxlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hU2VsZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFja1R4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lGZWVkYmFja1R4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYW50ZW5uYUluZGljZXNGZWVkYmFja1R4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYUluZGljZXNGZWVkYmFja1R4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYUluZGljZXNGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJ4QVMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeEFTKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidHhTb3VuZGluZ1BQRFVzICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTb3VuZGluZ1BQRFVzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQ1ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ1KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX3JzdmQ6ICVkLlxuIiksIHBGcm0tPkhUQ2Fwcy5udW1fcnN2ZCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5IVENhcHMucnN2ZCwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkhUSW5mbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5IVEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUSW5mby5wcmltYXJ5Q2hhbm5lbCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInNlY29uZGFyeUNoYW5uZWxPZmZzZXQgKDIpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVjb21tZW5kZWRUeFdpZHRoU2V0ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmVjb21tZW5kZWRUeFdpZHRoU2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmlmc01vZGUgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yaWZzTW9kZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImNvbnRyb2xsZWRBY2Nlc3NPbmx5ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uY29udHJvbGxlZEFjY2Vzc09ubHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJzZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgib3BNb2RlICgyKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ub3BNb2RlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibm9uR0ZEZXZpY2VzUHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm5vbkdGRGV2aWNlc1ByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJ0cmFuc21pdEJ1cnN0TGltaXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby50cmFuc21pdEJ1cnN0TGltaXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJvYnNzTm9uSFRTdGFQcmVzZW50ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ub2Jzc05vbkhUU3RhUHJlc2VudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICgxMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYmFzaWNTVEJDTUNTICg3KTogJWRcbiIpLCBwRnJtLT5IVEluZm8uYmFzaWNTVEJDTUNTKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiZHVhbENUU1Byb3RlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5kdWFsQ1RTUHJvdGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInNlY29uZGFyeUJlYWNvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUJlYWNvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ubHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwY29BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5wY29BY3RpdmUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwY29QaGFzZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnBjb1BoYXNlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQyICg0KTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmVzZXJ2ZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkhUSW5mby5iYXNpY01DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRJbmZvLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkhUSW5mby5yc3ZkLCBwRnJtLT5IVEluZm8ubnVtX3JzdmQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiRXh0Q2hhblN3aXRjaEFubjpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FeHRDaGFuU3dpdGNoQW5uLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5FeHRDaGFuU3dpdGNoQW5uLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQsIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiV01NSW5mb0FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTUluZm9BcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NSW5mb0FwLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJwYXJhbV9zZXRfY291bnQgKDQpOiAlZFxuIiksIHBGcm0tPldNTUluZm9BcC5wYXJhbV9zZXRfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoMyk6ICVkXG4iKSwgcEZybS0+V01NSW5mb0FwLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9BcC51YXBzZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJXTU1QYXJhbXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NUGFyYW1zLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucW9zSW5mbywgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMucmVzZXJ2ZWQyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JlX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmtfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjYmtfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdmlfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2aV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZvX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIldNTUNhcHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NQ2Fwcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NQ2Fwcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJxYWNrICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnFhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJxdWV1ZV9yZXF1ZXN0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnF1ZXVlX3JlcXVlc3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJ0eG9wX3JlcXVlc3QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMudHhvcF9yZXF1ZXN0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibW9yZV9hY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMubW9yZV9hY2spOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiV0FQSTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XQVBJLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XQVBJLnZlcnNpb24sIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS5ha21fc3VpdGVfY291bnQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+V0FQSS5ha21fc3VpdGVzLCA0ICogcEZybS0+V0FQSS5ha21fc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS51bmljYXN0X2NpcGhlcl9zdWl0ZV9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5XQVBJLnVuaWNhc3RfY2lwaGVyX3N1aXRlcywgNCAqIHBGcm0tPldBUEkudW5pY2FzdF9jaXBoZXJfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V0FQSS5tdWx0aWNhc3RfY2lwaGVyX3N1aXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicHJlYXV0aCAoMSk6ICVkXG4iKSwgcEZybS0+V0FQSS5wcmVhdXRoKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDE1KTogJWRcbiIpLCBwRnJtLT5XQVBJLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldBUEkuYmtpZF9jb3VudCwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5XQVBJLmJraWQsIDE2ICogcEZybS0+V0FQSS5ia2lkX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkNDWFJhZE1nbXRDYXA6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYUmFkTWdtdENhcC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYUmFkTWdtdENhcC5tZ210X3N0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibWJzc2lkX21hc2sgKDMpOiAlZFxuIiksIHBGcm0tPkNDWFJhZE1nbXRDYXAubWJzc2lkX21hc2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoNSk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJDQ1hUcmFmU3RybU1ldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUcmFmU3RybU1ldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQudHNpZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC5zdGF0ZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC5tc210X2ludGVydmFsLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkNDWFR4bWl0UG93ZXI6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVHhtaXRQb3dlci5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHhtaXRQb3dlci5wb3dlcl9saW1pdCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnJlc2VydmVkLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkFpcmdvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlByb3BTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5yYXRlcywgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJBUE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkFQTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fbmFtZTogJWQuXG4iKSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5BUE5hbWUubmFtZSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiSENGOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5IQ0YucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkhDRi5lbmFibGVkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiV0RTOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5XRFMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX3dkc0RhdGE6ICVkLlxuIiksIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uV0RTLndkc0RhdGEsIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkJQSW5kaWNhdG9yOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5CUEluZGljYXRvci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IuaW5kaWNhdG9yLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5CUEluZGljYXRvci50eXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTG9hZEluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkSW5mby5udW1fc3RhcywgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8uY2hhbm5lbF91dGlsLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTG9hZEJhbGFuY2U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlByb3BBc3NvY1R5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkxMQXR0cjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uTExBdHRyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5MTEF0dHIuZGVmZXJfdGhyZXNob2xkLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUHJvcENhcGFiaWxpdHk6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDYXBhYmlsaXR5LnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVmVyc2lvbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jaGlwX3JldiwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jYXJkX3R5cGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX2J1aWxkX3ZlcnNpb246ICVkLlxuIiksIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlZlcnNpb24uYnVpbGRfdmVyc2lvbiwgcEZybS0+QWlyZ28uVmVyc2lvbi5udW1fYnVpbGRfdmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlByb3BFRENBUGFyYW1zOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucW9zLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JlX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNiZV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjYmtfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY2JrX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWNia19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidW51c2VkMyAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2aV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYWN2b19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlRpdGFuOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UaXRhbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29uY2F0X3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5jb21wcmVzc2lvbl90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY2Jfc3RhdGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLnJldl9mY3Nfc3RhdGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJQcm9wQ2hhbm5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLm1vZGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5wcmltYXJ5X2NoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5zdWJfYmFuZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLmNoYW5uZWxfc3dpdGNoX2NvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUHJvcFF1aWV0QlNTOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X3BlcmlvZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfb2Zmc2V0LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVHJpZ2dlclN0YUJnU2NhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5lbmFibGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJUYXVydXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRhdXJ1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhVElEQml0bWFwLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UYXVydXMuYmFQb2xpY3ksIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiYmFCdWZmZXJTaXplICgxMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLmJhQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJyc3ZkICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMucnN2ZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJXc2NQcm9iZVJlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJWZXJzaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5WZXJzaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5WZXJzaW9uLm1pbm9yKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5WZXJzaW9uLm1ham9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiV1BTU3RhdGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLldQU1N0YXRlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5XUFNTdGF0ZS5zdGF0ZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkFQU2V0dXBMb2NrZWQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLkFQU2V0dXBMb2NrZWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLkFQU2V0dXBMb2NrZWQuZkxvY2tlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlNlbGVjdGVkUmVnaXN0cmFyOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5TZWxlY3RlZFJlZ2lzdHJhci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXMuU2VsZWN0ZWRSZWdpc3RyYXIuc2VsZWN0ZWQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJEZXZpY2VQYXNzd29yZElEOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5EZXZpY2VQYXNzd29yZElELnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5EZXZpY2VQYXNzd29yZElELmlkLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiU2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5tZXRob2RzLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUmVzcG9uc2VUeXBlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5SZXNwb25zZVR5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLlJlc3BvbnNlVHlwZS5yZXNUeXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiVVVJRF9FOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5VVUlEX0UucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLlVVSURfRS51dWlkLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk1hbnVmYWN0dXJlcjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXMuTWFudWZhY3R1cmVyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm51bV9uYW1lOiAlZC5cbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5NYW51ZmFjdHVyZXIubnVtX25hbWUpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPldzY1Byb2JlUmVzLk1hbnVmYWN0dXJlci5uYW1lLCBwRnJtLT5Xc2NQcm9iZVJlcy5NYW51ZmFjdHVyZXIubnVtX25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJNb2RlbE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLk1vZGVsTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+V3NjUHJvYmVSZXMuTW9kZWxOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NQcm9iZVJlcy5Nb2RlbE5hbWUudGV4dCwgcEZybS0+V3NjUHJvYmVSZXMuTW9kZWxOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTW9kZWxOdW1iZXI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLk1vZGVsTnVtYmVyLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5Nb2RlbE51bWJlci5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+V3NjUHJvYmVSZXMuTW9kZWxOdW1iZXIudGV4dCwgcEZybS0+V3NjUHJvYmVSZXMuTW9kZWxOdW1iZXIubnVtX3RleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJTZXJpYWxOdW1iZXI6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLlNlcmlhbE51bWJlci5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+V3NjUHJvYmVSZXMuU2VyaWFsTnVtYmVyLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5Xc2NQcm9iZVJlcy5TZXJpYWxOdW1iZXIudGV4dCwgcEZybS0+V3NjUHJvYmVSZXMuU2VyaWFsTnVtYmVyLm51bV90ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUHJpbWFyeURldmljZVR5cGU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLlByaW1hcnlEZXZpY2VUeXBlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5QcmltYXJ5RGV2aWNlVHlwZS5wcmltYXJ5X2NhdGVnb3J5LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5QcmltYXJ5RGV2aWNlVHlwZS5vdWksIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLlByaW1hcnlEZXZpY2VUeXBlLnN1Yl9jYXRlZ29yeSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkRldmljZU5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLkRldmljZU5hbWUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgibnVtX3RleHQ6ICVkLlxuIiksIHBGcm0tPldzY1Byb2JlUmVzLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPldzY1Byb2JlUmVzLkRldmljZU5hbWUudGV4dCwgcEZybS0+V3NjUHJvYmVSZXMuRGV2aWNlTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkNvbmZpZ01ldGhvZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLkNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLkNvbmZpZ01ldGhvZHMubWV0aG9kcywgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlJGQmFuZHM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLlJGQmFuZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldzY1Byb2JlUmVzLlJGQmFuZHMuYmFuZHMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJWZW5kb3JFeHRlbnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1Byb2JlUmVzLlZlbmRvckV4dGVuc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLnZlbmRvcklkLCAzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlZlcnNpb24yOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1pbm9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWlub3IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NQcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWFqb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkF1dGhvcml6ZWRNQUNzOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjUHJvYmVSZXMuVmVuZG9yRXh0ZW5zaW9uLkF1dGhvcml6ZWRNQUNzLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MubWFjLCA2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJSZXF1ZXN0VG9FbnJvbGw6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5Xc2NQcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NQcm9iZVJlcy5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnJlcSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUDJQUHJvYmVSZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUDJQQ2FwYWJpbGl0eTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMuUDJQQ2FwYWJpbGl0eS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXMuUDJQQ2FwYWJpbGl0eS5kZXZpY2VDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcy5QMlBDYXBhYmlsaXR5Lmdyb3VwQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIkV4dGVuZGVkTGlzdGVuVGltaW5nOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBQcm9iZVJlcy5FeHRlbmRlZExpc3RlblRpbWluZy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXMuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcuYXZhaWxpYmlsaXR5UGVyaW9kLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcy5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlJbnRlcnZhbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdGljZU9mQWJzZW5jZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UuaW5kZXgsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb2JlUmVzLk5vdGljZU9mQWJzZW5jZS5DVFNXaW5kb3dPcHBQUywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJudW1fTm9BRGVzYzogJWQuXG4iKSwgcEZybS0+UDJQUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBQcm9iZVJlcy5Ob3RpY2VPZkFic2VuY2UuTm9BRGVzYywgcEZybS0+UDJQUHJvYmVSZXMuTm90aWNlT2ZBYnNlbmNlLm51bV9Ob0FEZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiUDJQRGV2aWNlSW5mbzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9CRVJFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5QMlBEZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm9iZVJlcy5QMlBEZXZpY2VJbmZvLmNvbmZpZ01ldGhvZCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5wcmltYXJ5RGV2aWNlVHlwZSwgOCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJEZXZpY2VOYW1lOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm51bV90ZXh0OiAlZC5cbiIpLCBwRnJtLT5QMlBQcm9iZVJlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUubnVtX3RleHQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5QMlBQcm9iZVJlcy5QMlBEZXZpY2VJbmZvLkRldmljZU5hbWUudGV4dCwgcEZybS0+UDJQUHJvYmVSZXMuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIlAyUEdyb3VwSW5mbzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvYmVSZXMuUDJQR3JvdXBJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoIm51bV9QMlBDbGllbnRJbmZvRGVzYzogJWQuXG4iKSwgcEZybS0+UDJQUHJvYmVSZXMuUDJQR3JvdXBJbmZvLm51bV9QMlBDbGllbnRJbmZvRGVzYyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST0JFUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQUHJvYmVSZXMuUDJQR3JvdXBJbmZvLlAyUENsaWVudEluZm9EZXNjLCBwRnJtLT5QMlBQcm9iZVJlcy5QMlBHcm91cEluZm8ubnVtX1AyUENsaWVudEluZm9EZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPQkVSRVNQT05TRSksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tQcm9iZVJlc3BvbnNlLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrUHJvdmlzaW9uRGlzY292ZXJ5UmVxKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZQcm92aXNpb25EaXNjb3ZlcnlSZXEgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKHZvaWQpaTsKKyAgICAqcG5Db25zdW1lZCA9IDBVOworICAgIHN0YXR1cyA9IFBhY2tDb3JlKHBDdHgsICh0QU5JX1U4KilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLCBGRlNfUHJvdmlzaW9uRGlzY292ZXJ5UmVxLCBJRVNfUHJvdmlzaW9uRGlzY292ZXJ5UmVxKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksIEZSRkwoIlBhY2tlZCB0aGUgUHJvdmlzaW9uRGlzY292ZXJ5UmVxOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSS5vdWksIDQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiRGlhbG9nVG9rZW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiUDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiUDJQQ2FwYWJpbGl0eTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLlAyUENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQQ2FwYWJpbGl0eS5kZXZpY2VDYXBhYmlsaXR5LCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBDYXBhYmlsaXR5Lmdyb3VwQ2FwYWJpbGl0eSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiUDJQRGV2aWNlSW5mbzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLlAyUERldmljZUluZm8ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQRGV2aWNlSW5mby5QMlBEZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBEZXZpY2VJbmZvLmNvbmZpZ01ldGhvZCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQRGV2aWNlSW5mby5wcmltYXJ5RGV2aWNlVHlwZSwgOCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksIEZSRkwoIkRldmljZU5hbWU6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBGUkZMKCJudW1fdGV4dDogJWQuXG4iKSwgcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS5udW1fdGV4dCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLlAyUERldmljZUluZm8uRGV2aWNlTmFtZS50ZXh0LCBwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQRGV2aWNlSW5mby5EZXZpY2VOYW1lLm51bV90ZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiUDJQR3JvdXBJZDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQUHJvdmlzaW9uRGlzY292ZXJ5UmVxLlAyUEdyb3VwSWQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEuUDJQR3JvdXBJZC5kZXZpY2VBZGRyZXNzLCA2KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBHcm91cElkLm51bV9zc2lkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgKCB0QU5JX1U4KiApIHBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBHcm91cElkLnNzaWQsIHBGcm0tPlAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcS5QMlBHcm91cElkLm51bV9zc2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVRKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVEpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrUHJvdmlzaW9uRGlzY292ZXJ5UmVxLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrUHJvdmlzaW9uRGlzY292ZXJ5UmVzKHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZQcm92aXNpb25EaXNjb3ZlcnlSZXMgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKHZvaWQpaTsKKyAgICAqcG5Db25zdW1lZCA9IDBVOworICAgIHN0YXR1cyA9IFBhY2tDb3JlKHBDdHgsICh0QU5JX1U4KilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLCBGRlNfUHJvdmlzaW9uRGlzY292ZXJ5UmVzLCBJRVNfUHJvdmlzaW9uRGlzY292ZXJ5UmVzKTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUyksIEZSRkwoIlBhY2tlZCB0aGUgUHJvdmlzaW9uRGlzY292ZXJ5UmVzOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiQ2F0ZWdvcnk6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFjdGlvbi5hY3Rpb24sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiUDJQT1VJOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgKCB0QU5JX1U4KiApJnBGcm0tPlAyUE9VSS5vdWksIDQpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiUDJQT1VJU3ViVHlwZTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBPVUlTdWJUeXBlLm91aVN1YnR5cGUsIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiRGlhbG9nVG9rZW46XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVMpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiQ29uZmlnTWV0aG9kczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzLkNvbmZpZ01ldGhvZHMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1BST1ZJU0lPTkRJU0NPVkVSWVJFUyksICggdEFOSV9VOCogKSZwRnJtLT5QMlBXU0NQcm92aXNpb25EaXNjb3ZlcnlSZXMuQ29uZmlnTWV0aG9kcy5tZXRob2RzLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUFJPVklTSU9ORElTQ09WRVJZUkVTKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9QUk9WSVNJT05ESVNDT1ZFUllSRVMpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrUHJvdmlzaW9uRGlzY292ZXJ5UmVzLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrUmFkaW9NZWFzdXJlbWVudFJlcG9ydCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmUmFkaW9NZWFzdXJlbWVudFJlcG9ydCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19SYWRpb01lYXN1cmVtZW50UmVwb3J0LCBJRVNfUmFkaW9NZWFzdXJlbWVudFJlcG9ydCk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiUGFja2VkIHRoZSBSYWRpb01lYXN1cmVtZW50UmVwb3J0OlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+bnVtX01lYXN1cmVtZW50UmVwb3J0OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiTWVhc3VyZW1lbnRSZXBvcnRbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0udG9rZW4sIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgibGF0ZSAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ubGF0ZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJpbmNhcGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLmluY2FwYWJsZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJyZWZ1c2VkICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZWZ1c2VkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInVudXNlZCAoNSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0udW51c2VkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS50eXBlLCAxKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmFzaWMuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmFzaWMubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CYXNpYy5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgiYnNzICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmFzaWMuYnNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgib2ZkbV9wcmVhbWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkJhc2ljLm9mZG1fcHJlYW1ibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCBGUkZMKCJ1bmlkX3NpZ25hbCAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkJhc2ljLnVuaWRfc2lnbmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgicmFkZXIgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CYXNpYy5yYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInVubWVhc3VyZWQgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CYXNpYy51bm1lYXN1cmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgRlJGTCgidW51c2VkICgzKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmFzaWMudW51c2VkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5DQ0EuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQ0NBLm1lYXNfc3RhcnRfdGltZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQ0NBLm1lYXNfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkNDQS5jY2FfYnVzeV9mcmFjdGlvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuUlBJSGlzdG9ncmFtLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LlJQSUhpc3RvZ3JhbS5tZWFzX3N0YXJ0X3RpbWUsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LlJQSUhpc3RvZ3JhbS5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpMF9kZW5zaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpMV9kZW5zaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpMl9kZW5zaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpM19kZW5zaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpNF9kZW5zaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpNV9kZW5zaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpNl9kZW5zaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5SUElIaXN0b2dyYW0ucnBpN19kZW5zaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CZWFjb24ucmVnQ2xhc3MsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkJlYWNvbi5jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CZWFjb24ubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CZWFjb24ubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoImNvbmRlbnNlZF9QSFkgKDcpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CZWFjb24uY29uZGVuc2VkX1BIWSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInJlcG9ydGVkX2ZyYW1lX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CZWFjb24ucmVwb3J0ZWRfZnJhbWVfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcG9ydFtpXS5yZXBvcnQuQmVhY29uLlJDUEksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkJlYWNvbi5SU05JLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CZWFjb24uQlNTSUQsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXBvcnRbaV0ucmVwb3J0LkJlYWNvbi5hbnRlbm5hX2lkLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVQT1JUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVwb3J0W2ldLnJlcG9ydC5CZWFjb24ucGFyZW50X1RTRiwgNCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUE9SVCksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tSYWRpb01lYXN1cmVtZW50UmVwb3J0LiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0ICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX1JhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0LCBJRVNfUmFkaW9NZWFzdXJlbWVudFJlcXVlc3QpOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJQYWNrZWQgdGhlIFJhZGlvTWVhc3VyZW1lbnRSZXF1ZXN0OlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCBGUkZMKCJOdW1PZlJlcGV0aXRpb25zOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TnVtT2ZSZXBldGl0aW9ucy5yZXBldGl0aW9ucywgMik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5udW1fTWVhc3VyZW1lbnRSZXF1ZXN0OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIk1lYXN1cmVtZW50UmVxdWVzdFslZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfdG9rZW4sIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoInBhcmFsbGVsICgxKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ucGFyYWxsZWwpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoImVuYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLmVuYWJsZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgicmVxdWVzdCAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLnJlcXVlc3QpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIEZSRkwoInJlcG9ydCAoMSk6ICVkXG4iKSwgcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLnJlcG9ydCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgiZHVyYXRpb25NYW5kYXRvcnkgKDEpOiAlZFxuIiksIHBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5kdXJhdGlvbk1hbmRhdG9yeSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgidW51c2VkICgzKTogJWRcbiIpLCBwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0udW51c2VkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3R5cGUsIDEpOworICAgICAgICAgICAgICAgIHN3aXRjaCAocEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3R5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmFzaWMuY2hhbm5lbF9ubywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmFzaWMubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CYXNpYy5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5DQ0EuY2hhbm5lbF9ubywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQ0NBLm1lYXNfc3RhcnRfdGltZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQ0NBLm1lYXNfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LlJQSUhpc3RvZ3JhbS5jaGFubmVsX25vLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0ubWVhc19zdGFydF90aW1lLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5SUElIaXN0b2dyYW0ubWVhc19kdXJhdGlvbiwgMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLnJlZ0NsYXNzLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uY2hhbm5lbCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkFESU9NRUFTVVJFTUVOVFJFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+TWVhc3VyZW1lbnRSZXF1ZXN0W2ldLm1lYXN1cmVtZW50X3JlcXVlc3QuQmVhY29uLnJhbmRvbWl6YXRpb24sIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1lYXN1cmVtZW50UmVxdWVzdFtpXS5tZWFzdXJlbWVudF9yZXF1ZXN0LkJlYWNvbi5tZWFzX2R1cmF0aW9uLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24ubWVhc19tb2RlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5NZWFzdXJlbWVudFJlcXVlc3RbaV0ubWVhc3VyZW1lbnRfcmVxdWVzdC5CZWFjb24uQlNTSUQsIDYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JBRElPTUVBU1VSRU1FTlRSRVFVRVNUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SQURJT01FQVNVUkVNRU5UUkVRVUVTVCksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tSYWRpb01lYXN1cmVtZW50UmVxdWVzdC4gKi8KKwordEFOSV9VMzIgZG90MTFmUGFja1JlQXNzb2NSZXF1ZXN0KHRwQW5pU2lyR2xvYmFsIHBDdHgsIHREb3QxMWZSZUFzc29jUmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19SZUFzc29jUmVxdWVzdCwgSUVTX1JlQXNzb2NSZXF1ZXN0KTsKKworIyAgIGlmZGVmIERPVDExRl9EVU1QX0ZSQU1FUworICAgIGlmICghRE9UMTFGX0ZBSUxFRChzdGF0dXMpKQorICAgIHsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUGFja2VkIHRoZSBSZUFzc29jUmVxdWVzdDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQ2FwYWJpbGl0aWVzOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJlc3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5lc3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJpYnNzICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaWJzcyk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImNmUG9sbGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jZlBvbGxhYmxlKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiY2ZQb2xsUmVxICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsUmVxKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicHJpdmFjeSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnByaXZhY3kpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJzaG9ydFByZWFtYmxlICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc2hvcnRQcmVhbWJsZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInBiY2MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wYmNjKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiY2hhbm5lbEFnaWxpdHkgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5jaGFubmVsQWdpbGl0eSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInNwZWN0cnVtTWd0ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc3BlY3RydW1NZ3QpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJxb3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5xb3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJzaG9ydFNsb3RUaW1lICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuc2hvcnRTbG90VGltZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5hcHNkKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicnJtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucnJtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZHNzc09mZG0gKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5kc3NzT2ZkbSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImRlbGF5ZWRCQSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmRlbGF5ZWRCQSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImltbWVkaWF0ZUJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaW1tZWRpYXRlQkEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJMaXN0ZW5JbnRlcnZhbDpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkxpc3RlbkludGVydmFsLmludGVydmFsLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQ3VycmVudEFQQWRkcmVzczpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkN1cnJlbnRBUEFkZHJlc3MubWFjLCA2KTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiU1NJRDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TU0lELnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3NzaWQ6ICVkLlxuIiksIHBGcm0tPlNTSUQubnVtX3NzaWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPlNTSUQuc3NpZCwgcEZybS0+U1NJRC5udW1fc3NpZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiU3VwcFJhdGVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+U3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5TdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJFeHRTdXBwUmF0ZXM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+RXh0U3VwcFJhdGVzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5FeHRTdXBwUmF0ZXMubnVtX3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5FeHRTdXBwUmF0ZXMucmF0ZXMsIHBGcm0tPkV4dFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlBvd2VyQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5Qb3dlckNhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UG93ZXJDYXBzLm1pblR4UG93ZXIsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlBvd2VyQ2Fwcy5tYXhUeFBvd2VyLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJTdXBwQ2hhbm5lbHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+U3VwcENoYW5uZWxzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2JhbmRzOiAlZC5cbiIpLCBwRnJtLT5TdXBwQ2hhbm5lbHMubnVtX2JhbmRzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5TdXBwQ2hhbm5lbHMuYmFuZHMsIDIgKiBwRnJtLT5TdXBwQ2hhbm5lbHMubnVtX2JhbmRzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJSU05PcGFxdWU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlNOT3BhcXVlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2RhdGE6ICVkLlxuIiksIHBGcm0tPlJTTk9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+UlNOT3BhcXVlLmRhdGEsIHBGcm0tPlJTTk9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUU9TQ2Fwc1N0YXRpb246XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UU9TQ2Fwc1N0YXRpb24ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJtb3JlX2RhdGFfYWNrICgxKTogJWRcbiIpLCBwRnJtLT5RT1NDYXBzU3RhdGlvbi5tb3JlX2RhdGFfYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm1heF9zcF9sZW5ndGggKDIpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLm1heF9zcF9sZW5ndGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicWFjayAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24ucWFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JlX3VhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5RT1NDYXBzU3RhdGlvbi5hY2JlX3VhcHNkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPlFPU0NhcHNTdGF0aW9uLmFjYmtfdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2aV91YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+UU9TQ2Fwc1N0YXRpb24uYWN2aV91YXBzZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZvX3VhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5RT1NDYXBzU3RhdGlvbi5hY3ZvX3VhcHNkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJSUk1FbmFibGVkQ2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJSTUVuYWJsZWRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJMaW5rTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTGlua01lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5laWdoYm9yUnB0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5laWdoYm9yUnB0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInBhcmFsbGVsICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnBhcmFsbGVsKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlcGVhdGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnJlcGVhdGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkJlYWNvblBhc3NpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUGFzc2l2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJCZWFjb25BY3RpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkJlYWNvblRhYmxlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvblRhYmxlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkJlYWNvblJlcENvbmQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUmVwQ29uZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJGcmFtZU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkZyYW1lTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQ2hhbm5lbExvYWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQ2hhbm5lbExvYWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm9pc2VIaXN0b2dyYW0gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTm9pc2VIaXN0b2dyYW0pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgic3RhdGlzdGljcyAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5zdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkxDSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkxDSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkxDSUF6aW11dGggKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJQXppbXV0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJUQ01DYXBhYmlsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlRDTUNhcGFiaWxpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHJpZ2dlcmVkVENNICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLnRyaWdnZXJlZFRDTSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJBUENoYW5SZXBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQVBDaGFuUmVwb3J0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlJSTU1JQkVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlJNTUlCRW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJvcGVyYXRpbmdDaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLm9wZXJhdGluZ0NoYW5NYXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibm9uT3BlcmF0aW5DaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLm5vbk9wZXJhdGluQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk1lYXN1cmVtZW50UGlsb3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTWVhc3VyZW1lbnRQaWxvdEVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTmVpZ2hib3JUU0ZPZmZzZXQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JUU0ZPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUkNQSU1lYXN1cmVtZW50ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJDUElNZWFzdXJlbWVudCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJSU05JTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuUlNOSU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkJzc0F2Z0FjY2Vzc0RlbGF5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJzc0F2Z0FjY2Vzc0RlbGF5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkJTU0F2YWlsQWRtaXNzaW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJTU0F2YWlsQWRtaXNzaW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkFudGVubmFJbmZvcm1hdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5BbnRlbm5hSW5mb3JtYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk1vYmlsaXR5RG9tYWluOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPk1vYmlsaXR5RG9tYWluLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPk1vYmlsaXR5RG9tYWluLk1ESUQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgib3ZlckRTQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5vdmVyRFNDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzb3VyY2VSZXFDYXAgKDEpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc291cmNlUmVxQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNlcnZlZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiRlRJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkICg4KTogJWRcbiIpLCBwRnJtLT5GVEluZm8ucmVzZXJ2ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiSUVDb3VudCAoOCk6ICVkXG4iKSwgcEZybS0+RlRJbmZvLklFQ291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5NSUMsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uQW5vbmNlLCAzMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLlNub25jZSwgMzIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUjFLSF9JRDpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+RlRJbmZvLlIxS0hfSUQucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLlIxS0hfSUQuUE1LX1IxX0lELCA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkdUSzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+RlRJbmZvLkdUSy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImtleUlkICgyKTogJWRcbiIpLCBwRnJtLT5GVEluZm8uR1RLLmtleUlkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyZXNlcnZlZCAoMTQpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5HVEsucmVzZXJ2ZWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uR1RLLmtleUxlbmd0aCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5HVEsuUlNDLCA4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fa2V5OiAlZC5cbiIpLCBwRnJtLT5GVEluZm8uR1RLLm51bV9rZXkpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5GVEluZm8uR1RLLmtleSwgcEZybS0+RlRJbmZvLkdUSy5udW1fa2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlIwS0hfSUQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5SMEtIX0lELnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX1BNS19SMF9JRDogJWQuXG4iKSwgcEZybS0+RlRJbmZvLlIwS0hfSUQubnVtX1BNS19SMF9JRCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPkZUSW5mby5SMEtIX0lELlBNS19SMF9JRCwgcEZybS0+RlRJbmZvLlIwS0hfSUQubnVtX1BNS19SMF9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9SSUNEYXRhRGVzYzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJSSUNEYXRhRGVzY1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUklDRGF0YTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5JZGVudGlmaWVyLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEucmVzb3VyY2VEZXNjQ291bnQsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGF0YS5zdGF0dXNDb2RlLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUklDRGVzY3JpcHRvcjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5yZXNvdXJjZVR5cGUsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fdmFyaWFibGVEYXRhOiAlZC5cbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEZXNjcmlwdG9yLm51bV92YXJpYWJsZURhdGEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci52YXJpYWJsZURhdGEsIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IubnVtX3ZhcmlhYmxlRGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlRTUEVDOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnBzYik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJzY2hlZHVsZSAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc2NoZWR1bGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ1bnVzZWQgKDcpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnVudXNlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmZpeGVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5udW1fVENMQVM7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlRDTEFTWyVkXTpcbiIpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5wcmVzZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS51c2VyX3ByaW9yaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmNsYXNzaWZpZXJfbWFzaywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuZGVzdCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy50eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNvdXJjZSwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuRFNDUCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucHJvdG8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5QYXJhbXM4MDIxZHEudGFnX3R5cGUsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlRDTEFTU1BST0M6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1NQUk9DLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTU1BST0MucHJvY2Vzc2luZywgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlRTRGVsYXk6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU0RlbGF5LnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTRGVsYXkuZGVsYXksIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJTY2hlZHVsZTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUudHNpZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQgKDkpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnJlc2VydmVkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5zZXJ2aWNlX2ludGVydmFsLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLm1heF9zZXJ2aWNlX2R1ciwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5zcGVjX2ludGVydmFsLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiV01NVFNQRUM6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5wc2IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHNpbmZvX3JzdmQgKDcpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnRzaW5mb19yc3ZkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYnVyc3Rfc2l6ZV9kZWZuICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5idXJzdF9zaXplX2RlZm4pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5maXhlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+UklDRGF0YURlc2NbaV0ubnVtX1dNTVRDTEFTOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJXTU1UQ0xBU1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0ucHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0udmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0udXNlcl9wcmlvcml0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uY2xhc3NpZmllcl90eXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5jbGFzc2lmaWVyX21hc2ssIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5jbGFzc2lmaWVyX3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uRXRoUGFyYW1zLmRlc3QsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5FdGhQYXJhbXMudHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJXTU1UQ0xBU1BST0M6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1BST0MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNQUk9DLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNQUk9DLnByb2Nlc3NpbmcsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJXTU1UU0RlbGF5OlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNEZWxheS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU0RlbGF5LnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNEZWxheS5kZWxheSwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIldNTVNjaGVkdWxlOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFnZ3JlZ2F0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5hZ2dyZWdhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkICg5KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5yZXNlcnZlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuc2VydmljZV9pbnRlcnZhbCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5tYXhfc2VydmljZV9kdXIsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuc3BlY19pbnRlcnZhbCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIldQQU9wYXF1ZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XUEFPcGFxdWUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fZGF0YTogJWQuXG4iKSwgcEZybS0+V1BBT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5XUEFPcGFxdWUuZGF0YSwgcEZybS0+V1BBT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJIVENhcHM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+SFRDYXBzLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWR2Q29kaW5nQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYWR2Q29kaW5nQ2FwKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJtaW1vUG93ZXJTYXZlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWltb1Bvd2VyU2F2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJncmVlbkZpZWxkICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZ3JlZW5GaWVsZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJzaG9ydEdJMjBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zaG9ydEdJMjBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgic2hvcnRHSTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInR4U1RCQyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyeFNUQkMgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFNUQkMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZGVsYXllZEJBKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm1heGltYWxBTVNEVXNpemUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tYXhpbWFsQU1TRFVzaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImRzc3NDY2tNb2RlNDBNSHogKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5kc3NzQ2NrTW9kZTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInBzbXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wc21wKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInN0YmNDb250cm9sRnJhbWUgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5zdGJjQ29udHJvbEZyYW1lKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImxzaWdUWE9QUHJvdGVjdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmxzaWdUWE9QUHJvdGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJtYXhSeEFNUERVRmFjdG9yICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4UnhBTVBEVUZhY3Rvcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJtcGR1RGVuc2l0eSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1wZHVEZW5zaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMSAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+SFRDYXBzLnN1cHBvcnRlZE1DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicGNvICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucGNvKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRyYW5zaXRpb25UaW1lICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHJhbnNpdGlvblRpbWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQyICg1KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm1jc0ZlZWRiYWNrICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWNzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQzICg2KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJ4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yeFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInR4U3RhZ2dlcmVkU291bmRpbmcgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFN0YWdnZXJlZFNvdW5kaW5nKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJ4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHhaTEYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFpMRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJpbXBsaWNpdFR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5pbXBsaWNpdFR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiY2FsaWJyYXRpb24gKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jYWxpYnJhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENTSVR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSVR4QkYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRCRkNTSUZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRCRkNTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayAoMyk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0VW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJleHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJjc2lOdW1CRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY3NpTnVtQkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ1bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQ0ICg3KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFudGVubmFTZWxlY3Rpb24gKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hU2VsZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImV4cGxpY2l0Q1NJRmVlZGJhY2tUeCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2tUeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmV4cGxpY2l0Q1NJRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYW50ZW5uYUluZGljZXNGZWVkYmFjayAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFudGVubmFJbmRpY2VzRmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicnhBUyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4QVMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHhTb3VuZGluZ1BQRFVzICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhTb3VuZGluZ1BQRFVzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkNSAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJlc2VydmVkNSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5IVENhcHMucnN2ZCwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJXTU1DYXBzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldNTUNhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NQ2Fwcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInFhY2sgKDEpOiAlZFxuIiksIHBGcm0tPldNTUNhcHMucWFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJxdWV1ZV9yZXF1ZXN0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnF1ZXVlX3JlcXVlc3QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHhvcF9yZXF1ZXN0ICgxKTogJWRcbiIpLCBwRnJtLT5XTU1DYXBzLnR4b3BfcmVxdWVzdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJtb3JlX2FjayAoMSk6ICVkXG4iKSwgcEZybS0+V01NQ2Fwcy5tb3JlX2Fjayk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiV01NSW5mb1N0YXRpb246XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NSW5mb1N0YXRpb24ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NSW5mb1N0YXRpb24udmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZvX3VhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5hY3ZvX3VhcHNkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfdWFwc2QgKDEpOiAlZFxuIiksIHBGcm0tPldNTUluZm9TdGF0aW9uLmFjdmlfdWFwc2QpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNia191YXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NSW5mb1N0YXRpb24uYWNia191YXBzZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JlX3VhcHNkICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5hY2JlX3VhcHNkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkMSAoMSk6ICVkXG4iKSwgcEZybS0+V01NSW5mb1N0YXRpb24ucmVzZXJ2ZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm1heF9zcF9sZW5ndGggKDIpOiAlZFxuIiksIHBGcm0tPldNTUluZm9TdGF0aW9uLm1heF9zcF9sZW5ndGgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgicmVzZXJ2ZWQyICgxKTogJWRcbiIpLCBwRnJtLT5XTU1JbmZvU3RhdGlvbi5yZXNlcnZlZDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkFpcmdvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUHJvcFN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5udW1fcmF0ZXMpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJBUE5hbWU6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkFQTmFtZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV9uYW1lOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5BUE5hbWUubnVtX25hbWUpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5BUE5hbWUubmFtZSwgcEZybS0+QWlyZ28uQVBOYW1lLm51bV9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkhDRjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uSENGLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkhDRi5lbmFibGVkLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIldEUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uV0RTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX3dkc0RhdGE6ICVkLlxuIiksIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLldEUy53ZHNEYXRhLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQlBJbmRpY2F0b3I6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLmluZGljYXRvciwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLnR5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTG9hZEluZm86XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRJbmZvLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRJbmZvLm51bV9zdGFzLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEluZm8uY2hhbm5lbF91dGlsLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIkxvYWRCYWxhbmNlOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Mb2FkQmFsYW5jZS5ic3NpZCwgNik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLmNoYW5uZWwsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUHJvcEFzc29jVHlwZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcEFzc29jVHlwZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQXNzb2NUeXBlLnR5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTExBdHRyOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5MTEF0dHIucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTExBdHRyLmRlZmVyX3RocmVzaG9sZCwgNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJQcm9wQ2FwYWJpbGl0eTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENhcGFiaWxpdHkuY2FwYWJpbGl0eSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJWZXJzaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5WZXJzaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlZlcnNpb24uY2hpcF9yZXYsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5WZXJzaW9uLmNhcmRfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgibnVtX2J1aWxkX3ZlcnNpb246ICVkLlxuIiksIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5WZXJzaW9uLmJ1aWxkX3ZlcnNpb24sIHBGcm0tPkFpcmdvLlZlcnNpb24ubnVtX2J1aWxkX3ZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUHJvcEVEQ0FQYXJhbXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnFvcywgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JlX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjYmVfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNiZV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmVfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JlX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNia19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNia19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia19hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInVudXNlZDIgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjYmtfbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWNia19tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2aV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ1bnVzZWQzICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZpX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjdmlfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZpX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZvX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImFjdm9fYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYWN2b19taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdm9fbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY3ZvX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJUaXRhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVGl0YW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29uY2F0X3RjaWRfYml0bWFwLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGl0YW4uY29tcHJlc3Npb25fdGNpZF9iaXRtYXAsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5jYl9zdGF0ZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLnJldl9mY3Nfc3RhdGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiUHJvcENoYW5uU3dpdGNoQW5uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLm1vZGUsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2hhbm5Td2l0Y2hBbm4ucHJpbWFyeV9jaGFubmVsLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnN1Yl9iYW5kLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLmNoYW5uZWxfc3dpdGNoX2NvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlByb3BRdWlldEJTUzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BRdWlldEJTUy5xdWlldF9wZXJpb2QsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfb2Zmc2V0LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIlRyaWdnZXJTdGFCZ1NjYW46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5lbmFibGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiVGF1cnVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UYXVydXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhVElEQml0bWFwLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVGF1cnVzLmJhUG9saWN5LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJiYUJ1ZmZlclNpemUgKDEyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMuYmFCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJyc3ZkICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMucnN2ZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiV3NjSUVPcGFxdWU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V3NjSUVPcGFxdWUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fZGF0YTogJWQuXG4iKSwgcEZybS0+V3NjSUVPcGFxdWUubnVtX2RhdGEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApIHBGcm0tPldzY0lFT3BhcXVlLmRhdGEsIHBGcm0tPldzY0lFT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJXQVBJT3BhcXVlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldBUElPcGFxdWUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fZGF0YTogJWQuXG4iKSwgcEZybS0+V0FQSU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+V0FQSU9wYXF1ZS5kYXRhLCBwRnJtLT5XQVBJT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJDQ1hSYWRNZ210Q2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFJhZE1nbXRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYUmFkTWdtdENhcC5tZ210X3N0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm1ic3NpZF9tYXNrICgzKTogJWRcbiIpLCBwRnJtLT5DQ1hSYWRNZ210Q2FwLm1ic3NpZF9tYXNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInJlc2VydmVkICg1KTogJWRcbiIpLCBwRnJtLT5DQ1hSYWRNZ210Q2FwLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJDQ1hWZXJzaW9uOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFZlcnNpb24ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVmVyc2lvbi52ZXJzaW9uLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJDQ1hDY2ttT3BhcXVlOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWENja21PcGFxdWUucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fZGF0YTogJWQuXG4iKSwgcEZybS0+Q0NYQ2NrbU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+Q0NYQ2NrbU9wYXF1ZS5kYXRhLCBwRnJtLT5DQ1hDY2ttT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+bnVtX1dNTVRTUEVDOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIldNTVRTUEVDWyVkXTpcbiIpLCBpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V01NVFNQRUNbaV0ucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0udmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgidHJhZmZpY190eXBlICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS50cmFmZmljX3R5cGUpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnRzaWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhY2Nlc3NfcG9saWN5ICgyKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5hY2Nlc3NfcG9saWN5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0ucHNiKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ1c2VyX3ByaW9yaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS51c2VyX3ByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRzaW5mb19yc3ZkICg3KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS50c2luZm9fcnN2ZCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiYnVyc3Rfc2l6ZV9kZWZuICgxKTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5idXJzdF9zaXplX2RlZm4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uZml4ZWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5tYXhfbXNkdV9zaXplLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0uaW5hY3Rpdml0eV9pbnQsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1pbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0uYnVyc3Rfc2l6ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0uc3VycGx1c19id19hbGxvd2FuY2UsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5tZWRpdW1fdGltZSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVFVRVNUKSwgRlJGTCgiQ0NYVHJhZlN0cm1SYXRlU2V0OlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFRyYWZTdHJtUmF0ZVNldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQudHNpZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJudW1fdHNyYXRlczogJWQuXG4iKSwgcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0Lm51bV90c3JhdGVzKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQudHNyYXRlcywgcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0Lm51bV90c3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJQMlBJRU9wYXF1ZTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBJRU9wYXF1ZS5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoIm51bV9kYXRhOiAlZC5cbiIpLCBwRnJtLT5QMlBJRU9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkgcEZybS0+UDJQSUVPcGFxdWUuZGF0YSwgcEZybS0+UDJQSUVPcGFxdWUubnVtX2RhdGEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVRVUVTVCksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFUVVFU1QpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrUmVBc3NvY1JlcXVlc3QuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tSZUFzc29jUmVzcG9uc2UodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlJlQXNzb2NSZXNwb25zZSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19SZUFzc29jUmVzcG9uc2UsIElFU19SZUFzc29jUmVzcG9uc2UpOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUGFja2VkIHRoZSBSZUFzc29jUmVzcG9uc2U6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJDYXBhYmlsaXRpZXM6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJlc3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5lc3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiaWJzcyAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmlic3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiY2ZQb2xsYWJsZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmNmUG9sbGFibGUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiY2ZQb2xsUmVxICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2ZQb2xsUmVxKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInByaXZhY3kgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wcml2YWN5KTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInNob3J0UHJlYW1ibGUgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zaG9ydFByZWFtYmxlKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInBiY2MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5wYmNjKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImNoYW5uZWxBZ2lsaXR5ICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuY2hhbm5lbEFnaWxpdHkpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic3BlY3RydW1NZ3QgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5zcGVjdHJ1bU1ndCk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJxb3MgKDEpOiAlZFxuIiksIHBGcm0tPkNhcGFiaWxpdGllcy5xb3MpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2hvcnRTbG90VGltZSAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLnNob3J0U2xvdFRpbWUpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYXBzZCAoMSk6ICVkXG4iKSwgcEZybS0+Q2FwYWJpbGl0aWVzLmFwc2QpOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnJtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMucnJtKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImRzc3NPZmRtICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZHNzc09mZG0pOworICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuZGVsYXllZEJBKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImltbWVkaWF0ZUJBICgxKTogJWRcbiIpLCBwRnJtLT5DYXBhYmlsaXRpZXMuaW1tZWRpYXRlQkEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiU3RhdHVzOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlN0YXR1cy5zdGF0dXMsIDIpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQUlEOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFJRC5hc3NvY2lkLCAyKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5TdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPlN1cHBSYXRlcy5yYXRlcywgcEZybS0+U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkV4dFN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FeHRTdXBwUmF0ZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9yYXRlczogJWQuXG4iKSwgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkV4dFN1cHBSYXRlcy5yYXRlcywgcEZybS0+RXh0U3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkVEQ0FQYXJhbVNldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5FRENBUGFyYW1TZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQucW9zLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JlX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV9hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjYmtfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQyICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQudW51c2VkMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkVEQ0FQYXJhbVNldC5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2aV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDMgKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC51bnVzZWQzKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RURDQVBhcmFtU2V0LmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkVEQ0FQYXJhbVNldC5hY3ZvX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkNCAoMSk6ICVkXG4iKSwgcEZybS0+RURDQVBhcmFtU2V0LnVudXNlZDQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5FRENBUGFyYW1TZXQuYWN2b19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5FRENBUGFyYW1TZXQuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJSQ1BJSUU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UkNQSUlFLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UkNQSUlFLnJjcGksIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJSU05JSUU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlNOSUlFLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UlNOSUlFLnJzbmksIDEpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJSUk1FbmFibGVkQ2FwOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPlJSTUVuYWJsZWRDYXAucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkxpbmtNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5MaW5rTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5laWdoYm9yUnB0ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLk5laWdoYm9yUnB0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJwYXJhbGxlbCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5wYXJhbGxlbCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVwZWF0ZWQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVwZWF0ZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkJlYWNvblBhc3NpdmUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUGFzc2l2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQmVhY29uQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJlYWNvbkFjdGl2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQmVhY29uVGFibGUgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uVGFibGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkJlYWNvblJlcENvbmQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQmVhY29uUmVwQ29uZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiRnJhbWVNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5GcmFtZU1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJDaGFubmVsTG9hZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5DaGFubmVsTG9hZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm9pc2VIaXN0b2dyYW0gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTm9pc2VIaXN0b2dyYW0pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInN0YXRpc3RpY3MgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuc3RhdGlzdGljcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTENJTWVhc3VyZW1lbnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkxDSUF6aW11dGggKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTENJQXppbXV0aCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVENNQ2FwYWJpbGl0eSAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5UQ01DYXBhYmlsaXR5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0cmlnZ2VyZWRUQ00gKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAudHJpZ2dlcmVkVENNKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJBUENoYW5SZXBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuQVBDaGFuUmVwb3J0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJSUk1NSUJFbmFibGVkICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLlJSTU1JQkVuYWJsZWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm9wZXJhdGluZ0NoYW5NYXggKDMpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAub3BlcmF0aW5nQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibm9uT3BlcmF0aW5DaGFuTWF4ICgzKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLm5vbk9wZXJhdGluQ2hhbk1heCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTWVhc3VyZW1lbnRQaWxvdCAoMyk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJNZWFzdXJlbWVudFBpbG90RW5hYmxlZCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5NZWFzdXJlbWVudFBpbG90RW5hYmxlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTmVpZ2hib3JUU0ZPZmZzZXQgKDEpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAuTmVpZ2hib3JUU0ZPZmZzZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlJDUElNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SQ1BJTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlJTTklNZWFzdXJlbWVudCAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5SU05JTWVhc3VyZW1lbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkJzc0F2Z0FjY2Vzc0RlbGF5ICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkJzc0F2Z0FjY2Vzc0RlbGF5KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJCU1NBdmFpbEFkbWlzc2lvbiAoMSk6ICVkXG4iKSwgcEZybS0+UlJNRW5hYmxlZENhcC5CU1NBdmFpbEFkbWlzc2lvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQW50ZW5uYUluZm9ybWF0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5SUk1FbmFibGVkQ2FwLkFudGVubmFJbmZvcm1hdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPlJSTUVuYWJsZWRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJSU05PcGFxdWU6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+UlNOT3BhcXVlLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fZGF0YTogJWQuXG4iKSwgcEZybS0+UlNOT3BhcXVlLm51bV9kYXRhKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+UlNOT3BhcXVlLmRhdGEsIHBGcm0tPlJTTk9wYXF1ZS5udW1fZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk1vYmlsaXR5RG9tYWluOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPk1vYmlsaXR5RG9tYWluLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+TW9iaWxpdHlEb21haW4uTURJRCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgib3ZlckRTQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5vdmVyRFNDYXApOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc291cmNlUmVxQ2FwICgxKTogJWRcbiIpLCBwRnJtLT5Nb2JpbGl0eURvbWFpbi5yZXNvdXJjZVJlcUNhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDYpOiAlZFxuIiksIHBGcm0tPk1vYmlsaXR5RG9tYWluLnJlc2VydmVkKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiRlRJbmZvOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDgpOiAlZFxuIiksIHBGcm0tPkZUSW5mby5yZXNlcnZlZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiSUVDb3VudCAoOCk6ICVkXG4iKSwgcEZybS0+RlRJbmZvLklFQ291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5GVEluZm8uTUlDLCAxNik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5Bbm9uY2UsIDMyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLlNub25jZSwgMzIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlIxS0hfSUQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5SMUtIX0lELnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RlRJbmZvLlIxS0hfSUQuUE1LX1IxX0lELCA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJHVEs6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5HVEsucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImtleUlkICgyKTogJWRcbiIpLCBwRnJtLT5GVEluZm8uR1RLLmtleUlkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDE0KTogJWRcbiIpLCBwRnJtLT5GVEluZm8uR1RLLnJlc2VydmVkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5HVEsua2V5TGVuZ3RoLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkZUSW5mby5HVEsuUlNDLCA4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX2tleTogJWQuXG4iKSwgcEZybS0+RlRJbmZvLkdUSy5udW1fa2V5KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkZUSW5mby5HVEsua2V5LCBwRnJtLT5GVEluZm8uR1RLLm51bV9rZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlIwS0hfSUQ6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkZUSW5mby5SMEtIX0lELnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fUE1LX1IwX0lEOiAlZC5cbiIpLCBwRnJtLT5GVEluZm8uUjBLSF9JRC5udW1fUE1LX1IwX0lEKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkZUSW5mby5SMEtIX0lELlBNS19SMF9JRCwgcEZybS0+RlRJbmZvLlIwS0hfSUQubnVtX1BNS19SMF9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9SSUNEYXRhRGVzYzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUklDRGF0YURlc2NbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUklDRGF0YTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5SSUNEYXRhLklkZW50aWZpZXIsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEucmVzb3VyY2VEZXNjQ291bnQsIDEpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0RhdGEuc3RhdHVzQ29kZSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJSSUNEZXNjcmlwdG9yOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IucmVzb3VyY2VUeXBlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV92YXJpYWJsZURhdGE6ICVkLlxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IubnVtX3ZhcmlhYmxlRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+UklDRGF0YURlc2NbaV0uUklDRGVzY3JpcHRvci52YXJpYWJsZURhdGEsIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlJJQ0Rlc2NyaXB0b3IubnVtX3ZhcmlhYmxlRGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJUU1BFQzpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy50c2lkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMucHNiKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInNjaGVkdWxlICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zY2hlZHVsZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQgKDcpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnVudXNlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuZml4ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRTUEVDLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEZybS0+UklDRGF0YURlc2NbaV0ubnVtX1RDTEFTOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVENMQVNbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLnByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0udXNlcl9wcmlvcml0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmNsYXNzaWZpZXJfbWFzaywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy50eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuRFNDUCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1tpXS5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlRDTEFTU1BST0M6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5UQ0xBU1NQUk9DLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVENMQVNTUFJPQy5wcm9jZXNzaW5nLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlRTRGVsYXk6XG4iKSk7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJtLT5SSUNEYXRhRGVzY1tpXS5UU0RlbGF5LnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uVFNEZWxheS5kZWxheSwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJTY2hlZHVsZTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUudHNpZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoOSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUucmVzZXJ2ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLlNjaGVkdWxlLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUuc2VydmljZV9pbnRlcnZhbCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uU2NoZWR1bGUubWF4X3NlcnZpY2VfZHVyLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5TY2hlZHVsZS5zcGVjX2ludGVydmFsLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVRTUEVDOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnRzaWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZGlyZWN0aW9uICgyKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5kaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicHNiICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5wc2IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpbmZvX3JzdmQgKDcpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnRzaW5mb19yc3ZkKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImJ1cnN0X3NpemVfZGVmbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuYnVyc3Rfc2l6ZV9kZWZuKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImZpeGVkICgxKTogJWRcbiIpLCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5maXhlZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tYXhfc2VydmljZV9pbnQsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMuc2VydmljZV9zdGFydF90aW1lLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNQRUMucGVha19kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5taW5fcGh5X3JhdGUsIDQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTUEVDLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRnJtLT5SSUNEYXRhRGVzY1tpXS5udW1fV01NVENMQVM7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJXTU1UQ0xBU1slZF06XG4iKSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0ucHJlc2VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0udXNlcl9wcmlvcml0eSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfbWFzaywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmNsYXNzaWZpZXJfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5FdGhQYXJhbXMuc291cmNlLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLkV0aFBhcmFtcy50eXBlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc291cmNlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuRFNDUCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVENMQVNbaV0uaW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTW2ldLmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZmxvd19sYWJlbCwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1tpXS5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVRDTEFTUFJPQzpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTUFJPQy5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRDTEFTUFJPQy52ZXJzaW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1UQ0xBU1BST0MucHJvY2Vzc2luZywgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJXTU1UU0RlbGF5OlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNEZWxheS5wcmVzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVRTRGVsYXkudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NVFNEZWxheS5kZWxheSwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJXTU1TY2hlZHVsZTpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUudmVyc2lvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHNpZCAoNCk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUudHNpZCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZCAoOSk6ICVkXG4iKSwgcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUucmVzZXJ2ZWQpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlJJQ0RhdGFEZXNjW2ldLldNTVNjaGVkdWxlLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUuc2VydmljZV9pbnRlcnZhbCwgNCk7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UklDRGF0YURlc2NbaV0uV01NU2NoZWR1bGUubWF4X3NlcnZpY2VfZHVyLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5SSUNEYXRhRGVzY1tpXS5XTU1TY2hlZHVsZS5zcGVjX2ludGVydmFsLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIldQQTpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XUEEucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XUEEudmVyc2lvbiwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5tdWx0aWNhc3RfY2lwaGVyLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVyX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+V1BBLnVuaWNhc3RfY2lwaGVycywgNCAqIHBGcm0tPldQQS51bmljYXN0X2NpcGhlcl9jb3VudCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldQQS5hdXRoX3N1aXRlX2NvdW50LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+V1BBLmF1dGhfc3VpdGVzLCA0ICogcEZybS0+V1BBLmF1dGhfc3VpdGVfY291bnQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XUEEuY2FwcywgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkhUQ2FwczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5IVENhcHMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFkdkNvZGluZ0NhcCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmFkdkNvZGluZ0NhcCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJtaW1vUG93ZXJTYXZlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWltb1Bvd2VyU2F2ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZ3JlZW5GaWVsZCAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmdyZWVuRmllbGQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInNob3J0R0kyME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnNob3J0R0kyME1Ieik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgic2hvcnRHSTQwTUh6ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc2hvcnRHSTQwTUh6KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0eFNUQkMgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eFNUQkMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJ4U1RCQyAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4U1RCQyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZGVsYXllZEJBICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZGVsYXllZEJBKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJtYXhpbWFsQU1TRFVzaXplICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4aW1hbEFNU0RVc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZHNzc0Nja01vZGU0ME1IeiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmRzc3NDY2tNb2RlNDBNSHopOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInBzbXAgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5wc21wKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJzdGJjQ29udHJvbEZyYW1lICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuc3RiY0NvbnRyb2xGcmFtZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubHNpZ1RYT1BQcm90ZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJtYXhSeEFNUERVRmFjdG9yICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMubWF4UnhBTVBEVUZhY3Rvcik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibXBkdURlbnNpdHkgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5tcGR1RGVuc2l0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQxICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+SFRDYXBzLnN1cHBvcnRlZE1DU1NldCwgMTYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInBjbyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnBjbyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHJhbnNpdGlvblRpbWUgKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50cmFuc2l0aW9uVGltZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQyICg1KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJtY3NGZWVkYmFjayAoMik6ICVkXG4iKSwgcEZybS0+SFRDYXBzLm1jc0ZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDMgKDYpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5yZXNlcnZlZDMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInR4QkYgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy50eEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyeFN0YWdnZXJlZFNvdW5kaW5nICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhTdGFnZ2VyZWRTb3VuZGluZyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidHhTdGFnZ2VyZWRTb3VuZGluZyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U3RhZ2dlcmVkU291bmRpbmcpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJ4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucnhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInR4WkxGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudHhaTEYpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImltcGxpY2l0VHhCRiAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLmltcGxpY2l0VHhCRik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiY2FsaWJyYXRpb24gKDIpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5jYWxpYnJhdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRDU0lUeEJGICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lUeEJGKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRCRkNTSUZlZWRiYWNrICgzKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRCRkNTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJleHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdFVuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2spOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgKDMpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJjc2lOdW1CRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY3NpTnVtQkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMudW5jb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJjb21wcmVzc2VkU3RlZXJpbmdNYXRyaXhCRkFudGVubmFlICgyKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuY29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQ0ICg3KTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhbnRlbm5hU2VsZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYVNlbGVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZXhwbGljaXRDU0lGZWVkYmFja1R4ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuZXhwbGljaXRDU0lGZWVkYmFja1R4KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHggKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrVHgpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImV4cGxpY2l0Q1NJRmVlZGJhY2sgKDEpOiAlZFxuIiksIHBGcm0tPkhUQ2Fwcy5leHBsaWNpdENTSUZlZWRiYWNrKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhbnRlbm5hSW5kaWNlc0ZlZWRiYWNrICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMuYW50ZW5uYUluZGljZXNGZWVkYmFjayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnhBUyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnJ4QVMpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInR4U291bmRpbmdQUERVcyAoMSk6ICVkXG4iKSwgcEZybS0+SFRDYXBzLnR4U291bmRpbmdQUERVcyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQ1ICgxKTogJWRcbiIpLCBwRnJtLT5IVENhcHMucmVzZXJ2ZWQ1KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRDYXBzLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+SFRDYXBzLnJzdmQsIHBGcm0tPkhUQ2Fwcy5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkhUSW5mbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5IVEluZm8ucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5IVEluZm8ucHJpbWFyeUNoYW5uZWwsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInNlY29uZGFyeUNoYW5uZWxPZmZzZXQgKDIpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZWNvbW1lbmRlZFR4V2lkdGhTZXQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZWNvbW1lbmRlZFR4V2lkdGhTZXQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJpZnNNb2RlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucmlmc01vZGUpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImNvbnRyb2xsZWRBY2Nlc3NPbmx5ICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uY29udHJvbGxlZEFjY2Vzc09ubHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5ICgzKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uc2VydmljZUludGVydmFsR3JhbnVsYXJpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm9wTW9kZSAoMik6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm9wTW9kZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibm9uR0ZEZXZpY2VzUHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm5vbkdGRGV2aWNlc1ByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRyYW5zbWl0QnVyc3RMaW1pdCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnRyYW5zbWl0QnVyc3RMaW1pdCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgib2Jzc05vbkhUU3RhUHJlc2VudCAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLm9ic3NOb25IVFN0YVByZXNlbnQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInJlc2VydmVkICgxMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnJlc2VydmVkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJiYXNpY1NUQkNNQ1MgKDcpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5iYXNpY1NUQkNNQ1MpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImR1YWxDVFNQcm90ZWN0aW9uICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8uZHVhbENUU1Byb3RlY3Rpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInNlY29uZGFyeUJlYWNvbiAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnNlY29uZGFyeUJlYWNvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgKDEpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicGNvQWN0aXZlICgxKTogJWRcbiIpLCBwRnJtLT5IVEluZm8ucGNvQWN0aXZlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJwY29QaGFzZSAoMSk6ICVkXG4iKSwgcEZybS0+SFRJbmZvLnBjb1BoYXNlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJyZXNlcnZlZDIgKDQpOiAlZFxuIiksIHBGcm0tPkhUSW5mby5yZXNlcnZlZDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5IVEluZm8uYmFzaWNNQ1NTZXQsIDE2KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJudW1fcnN2ZDogJWQuXG4iKSwgcEZybS0+SFRJbmZvLm51bV9yc3ZkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+SFRJbmZvLnJzdmQsIHBGcm0tPkhUSW5mby5udW1fcnN2ZCk7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIldNTVBhcmFtczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1QYXJhbXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5xb3NJbmZvLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLnJlc2VydmVkMiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNiZV9hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjYmVfYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjYmVfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19haWZzbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY20gKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2FjbSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY2JrX2FjaSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLnVudXNlZDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWN3bWluICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY3dtaW4pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfYWN3bWF4ICg0KTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWNia19hY3dtYXgpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1QYXJhbXMuYWNia190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2FpZnNuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWNtKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdmlfYWNpKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQzICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMudW51c2VkMyk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY3dtaW4gKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2Fjd21pbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9hY3dtYXggKDQpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy5hY3ZpX2Fjd21heCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVBhcmFtcy5hY3ZpX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWlmc24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY20pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWNpICgyKTogJWRcbiIpLCBwRnJtLT5XTU1QYXJhbXMuYWN2b19hY2kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVBhcmFtcy51bnVzZWQ0KTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2Fjd21pbiAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWN3bWluKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX2Fjd21heCAoNCk6ICVkXG4iKSwgcEZybS0+V01NUGFyYW1zLmFjdm9fYWN3bWF4KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NUGFyYW1zLmFjdm9fdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQ0NYUmFkTWdtdENhcDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hSYWRNZ210Q2FwLnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYUmFkTWdtdENhcC5tZ210X3N0YXRlLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJtYnNzaWRfbWFzayAoMyk6ICVkXG4iKSwgcEZybS0+Q0NYUmFkTWdtdENhcC5tYnNzaWRfbWFzayk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicmVzZXJ2ZWQgKDUpOiAlZFxuIiksIHBGcm0tPkNDWFJhZE1nbXRDYXAucmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJDQ1hUcmFmU3RybU1ldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUcmFmU3RybU1ldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0LnRzaWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC5zdGF0ZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNDWFRyYWZTdHJtTWV0Lm1zbXRfaW50ZXJ2YWwsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJDQ1hUeG1pdFBvd2VyOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPkNDWFR4bWl0UG93ZXIucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUeG1pdFBvd2VyLnBvd2VyX2xpbWl0LCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHhtaXRQb3dlci5yZXNlcnZlZCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBGcm0tPm51bV9XTU1UU1BFQzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV01NVFNQRUNbJWRdOlxuIiksIGkpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5XTU1UU1BFQ1tpXS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLnZlcnNpb24sIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnRzaWQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0uYWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnBzYik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fcnN2ZCAoNyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUNbaV0udHNpbmZvX3JzdmQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJidXJzdF9zaXplX2RlZm4gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLmJ1cnN0X3NpemVfZGVmbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQ1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDW2ldLmZpeGVkKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUNbaV0ubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDW2ldLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQ1tpXS5tZWRpdW1fdGltZSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkNDWFRyYWZTdHJtUmF0ZVNldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQudHNpZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX3RzcmF0ZXM6ICVkLlxuIiksIHBGcm0tPkNDWFRyYWZTdHJtUmF0ZVNldC5udW1fdHNyYXRlcyk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkNDWFRyYWZTdHJtUmF0ZVNldC50c3JhdGVzLCBwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQubnVtX3RzcmF0ZXMpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJBaXJnbzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUHJvcFN1cHBSYXRlczpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcFN1cHBSYXRlcy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibnVtX3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLnJhdGVzLCBwRnJtLT5BaXJnby5Qcm9wU3VwcFJhdGVzLm51bV9yYXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQVBOYW1lOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5BUE5hbWUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9uYW1lOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5BUE5hbWUubnVtX25hbWUpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uQVBOYW1lLm5hbWUsIHBGcm0tPkFpcmdvLkFQTmFtZS5udW1fbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiSENGOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5IQ0YucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5IQ0YuZW5hYmxlZCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiV0RTOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5XRFMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV93ZHNEYXRhOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5XRFMubnVtX3dkc0RhdGEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkgcEZybS0+QWlyZ28uV0RTLndkc0RhdGEsIHBGcm0tPkFpcmdvLldEUy5udW1fd2RzRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiQlBJbmRpY2F0b3I6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uQlBJbmRpY2F0b3IuaW5kaWNhdG9yLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkJQSW5kaWNhdG9yLnR5cGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkxvYWRJbmZvOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Mb2FkSW5mby5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRJbmZvLm51bV9zdGFzLCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLkxvYWRJbmZvLmNoYW5uZWxfdXRpbCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTG9hZEJhbGFuY2U6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLkxvYWRCYWxhbmNlLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuYnNzaWQsIDYpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uTG9hZEJhbGFuY2UuY2hhbm5lbCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUHJvcEFzc29jVHlwZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcEFzc29jVHlwZS5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BBc3NvY1R5cGUudHlwZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTExBdHRyOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5MTEF0dHIucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5MTEF0dHIuZGVmZXJfdGhyZXNob2xkLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJQcm9wQ2FwYWJpbGl0eTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uUHJvcENhcGFiaWxpdHkucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJWZXJzaW9uOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5WZXJzaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uVmVyc2lvbi5jaGlwX3JldiwgNCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5WZXJzaW9uLmNhcmRfdHlwZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm51bV9idWlsZF92ZXJzaW9uOiAlZC5cbiIpLCBwRnJtLT5BaXJnby5WZXJzaW9uLm51bV9idWlsZF92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApIHBGcm0tPkFpcmdvLlZlcnNpb24uYnVpbGRfdmVyc2lvbiwgcEZybS0+QWlyZ28uVmVyc2lvbi5udW1fYnVpbGRfdmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUHJvcEVEQ0FQYXJhbXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMucW9zLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnJlc2VydmVkLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNiZV9haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmVfYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JlX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDEgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JlX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV9tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWNiZV90eG9wbGltaXQsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY2JrX2FpZnNuICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX2FpZnNuKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY20gKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWNtKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWNia19hY2kgKDIpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjYmtfYWNpKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgidW51c2VkMiAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMudW51c2VkMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfbWluICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX21pbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjYmtfbWF4ICg0KTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX21heCk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY2JrX3R4b3BsaW1pdCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdmlfYWlmc24gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfYWlmc24pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjbSAoMSk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY20pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZpX2FjaSAoMik6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2aV9hY2kpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ1bnVzZWQzICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy51bnVzZWQzKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9taW4gKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWluKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2aV9tYXggKDQpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfbWF4KTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLmFjdmlfdHhvcGxpbWl0LCAyKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiYWN2b19haWZzbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19haWZzbik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWNtICgxKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FjbSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoImFjdm9fYWNpICgyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5Qcm9wRURDQVBhcmFtcy5hY3ZvX2FjaSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoInVudXNlZDQgKDEpOiAlZFxuIiksIHBGcm0tPkFpcmdvLlByb3BFRENBUGFyYW1zLnVudXNlZDQpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX21pbiAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19taW4pOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJhY3ZvX21heCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b19tYXgpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcEVEQ0FQYXJhbXMuYWN2b190eG9wbGltaXQsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlRpdGFuOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5UaXRhbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRpdGFuLmNvbmNhdF90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5jb21wcmVzc2lvbl90Y2lkX2JpdG1hcCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5jYl9zdGF0ZSwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UaXRhbi5yZXZfZmNzX3N0YXRlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJQcm9wQ2hhbm5Td2l0Y2hBbm46XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5tb2RlLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5wcmltYXJ5X2NoYW5uZWwsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcENoYW5uU3dpdGNoQW5uLnN1Yl9iYW5kLCAxKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlByb3BDaGFublN3aXRjaEFubi5jaGFubmVsX3N3aXRjaF9jb3VudCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUHJvcFF1aWV0QlNTOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfY291bnQsIDEpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X3BlcmlvZCwgMSk7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5Qcm9wUXVpZXRCU1MucXVpZXRfZHVyYXRpb24sIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+QWlyZ28uUHJvcFF1aWV0QlNTLnF1aWV0X29mZnNldCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiVHJpZ2dlclN0YUJnU2NhbjpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+QWlyZ28uVHJpZ2dlclN0YUJnU2Nhbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRyaWdnZXJTdGFCZ1NjYW4uZW5hYmxlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJUYXVydXM6XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPkFpcmdvLlRhdXJ1cy5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPkFpcmdvLlRhdXJ1cy5iYVRJREJpdG1hcCwgMik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BaXJnby5UYXVydXMuYmFQb2xpY3ksIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJiYUJ1ZmZlclNpemUgKDEyKTogJWRcbiIpLCBwRnJtLT5BaXJnby5UYXVydXMuYmFCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgicnN2ZCAoNCk6ICVkXG4iKSwgcEZybS0+QWlyZ28uVGF1cnVzLnJzdmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJXc2NSZWFzc29jUmVzOlxuIikpOworICAgICAgICBpZiAoIXBGcm0tPldzY1JlYXNzb2NSZXMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlZlcnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1JlYXNzb2NSZXMuVmVyc2lvbi5wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibWlub3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY1JlYXNzb2NSZXMuVmVyc2lvbi5taW5vcik7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIm1ham9yICg0KTogJWRcbiIpLCBwRnJtLT5Xc2NSZWFzc29jUmVzLlZlcnNpb24ubWFqb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIlJlc3BvbnNlVHlwZTpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+V3NjUmVhc3NvY1Jlcy5SZXNwb25zZVR5cGUucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NSZWFzc29jUmVzLlJlc3BvbnNlVHlwZS5yZXNUeXBlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJWZW5kb3JFeHRlbnNpb246XG4iKSk7CisgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1JlYXNzb2NSZXMuVmVuZG9yRXh0ZW5zaW9uLnByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUmVhc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24udmVuZG9ySWQsIDMpOworICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJWZXJzaW9uMjpcbiIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBGcm0tPldzY1JlYXNzb2NSZXMuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJtaW5vciAoNCk6ICVkXG4iKSwgcEZybS0+V3NjUmVhc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24uVmVyc2lvbjIubWlub3IpOworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgibWFqb3IgKDQpOiAlZFxuIiksIHBGcm0tPldzY1JlYXNzb2NSZXMuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLm1ham9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIEZSRkwoIkF1dGhvcml6ZWRNQUNzOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjUmVhc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24uQXV0aG9yaXplZE1BQ3MucHJlc2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5Xc2NSZWFzc29jUmVzLlZlbmRvckV4dGVuc2lvbi5BdXRob3JpemVkTUFDcy5tYWMsIDYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUmVxdWVzdFRvRW5yb2xsOlxuIikpOworICAgICAgICAgICAgICAgIGlmICghcEZybS0+V3NjUmVhc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnByZXNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V3NjUmVhc3NvY1Jlcy5WZW5kb3JFeHRlbnNpb24uUmVxdWVzdFRvRW5yb2xsLnJlcSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJQMlBBc3NvY1JlczpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5QMlBBc3NvY1Jlcy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiUDJQU3RhdHVzOlxuIikpOworICAgICAgICAgICAgaWYgKCFwRnJtLT5QMlBBc3NvY1Jlcy5QMlBTdGF0dXMucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBBc3NvY1Jlcy5QMlBTdGF0dXMuc3RhdHVzLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJFeHRlbmRlZExpc3RlblRpbWluZzpcbiIpKTsKKyAgICAgICAgICAgIGlmICghcEZybS0+UDJQQXNzb2NSZXMuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcucHJlc2VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfUkVBU1NPQ1JFU1BPTlNFKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5QMlBBc3NvY1Jlcy5FeHRlbmRlZExpc3RlblRpbWluZy5hdmFpbGliaWxpdHlQZXJpb2QsIDIpOworICAgICAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+UDJQQXNzb2NSZXMuRXh0ZW5kZWRMaXN0ZW5UaW1pbmcuYXZhaWxpYmlsaXR5SW50ZXJ2YWwsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9SRUFTU09DUkVTUE9OU0UpLCBGUkZMKCJ0bzpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1JFQVNTT0NSRVNQT05TRSksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tSZUFzc29jUmVzcG9uc2UuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tTTVBvd2VyU2F2ZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmU01Qb3dlclNhdmUgKnBGcm0sIHRBTklfVTggKnBCdWYsIHRBTklfVTMyIG5CdWYsIHRBTklfVTMyICpwbkNvbnN1bWVkKQoreworICAgIHRBTklfVTMyIGkgPSAwOworICAgIHRBTklfVTMyIHN0YXR1cyA9IDA7CisgICAgKHZvaWQpaTsKKyAgICAqcG5Db25zdW1lZCA9IDBVOworICAgIHN0YXR1cyA9IFBhY2tDb3JlKHBDdHgsICh0QU5JX1U4KilwRnJtLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkLCBGRlNfU01Qb3dlclNhdmUsIElFU19TTVBvd2VyU2F2ZSk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9TTVBPV0VSU0FWRSksIEZSRkwoIlBhY2tlZCB0aGUgU01Qb3dlclNhdmU6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9TTVBPV0VSU0FWRSksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfU01QT1dFUlNBVkUpLCAoIHRBTklfVTgqICkmcEZybS0+Q2F0ZWdvcnkuY2F0ZWdvcnksIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfU01QT1dFUlNBVkUpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9TTVBPV0VSU0FWRSksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1NNUE9XRVJTQVZFKSwgRlJGTCgiU01Qb3dlck1vZGVTZXQ6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9TTVBPV0VSU0FWRSksIEZSRkwoIlBvd2VyU2F2ZV9FbiAoMSk6ICVkXG4iKSwgcEZybS0+U01Qb3dlck1vZGVTZXQuUG93ZXJTYXZlX0VuKTsKKyAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1NNUE9XRVJTQVZFKSwgRlJGTCgiTW9kZSAoMSk6ICVkXG4iKSwgcEZybS0+U01Qb3dlck1vZGVTZXQuTW9kZSk7CisgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9TTVBPV0VSU0FWRSksIEZSRkwoInJlc2VydmVkICg2KTogJWRcbiIpLCBwRnJtLT5TTVBvd2VyTW9kZVNldC5yZXNlcnZlZCk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9TTVBPV0VSU0FWRSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfU01QT1dFUlNBVkUpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrU01Qb3dlclNhdmUuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tUUENSZXBvcnQodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZlRQQ1JlcG9ydCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19UUENSZXBvcnQsIElFU19UUENSZXBvcnQpOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVQT1JUKSwgRlJGTCgiUGFja2VkIHRoZSBUUENSZXBvcnQ6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1RQQ1JFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1RQQ1JFUE9SVCksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBGUkZMKCJUUENSZXBvcnQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VFBDUmVwb3J0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LnR4X3Bvd2VyLCAxKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCAoIHRBTklfVTgqICkmcEZybS0+VFBDUmVwb3J0LmxpbmtfbWFyZ2luLCAxKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVQT1JUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVBPUlQpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrVFBDUmVwb3J0LiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrVFBDUmVxdWVzdCh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmVFBDUmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19UUENSZXF1ZXN0LCBJRVNfVFBDUmVxdWVzdCk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVFVRVNUKSwgRlJGTCgiUGFja2VkIHRoZSBUUENSZXF1ZXN0OlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVFVRVNUKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1RQQ1JFUVVFU1QpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1RQQ1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksIEZSRkwoIlRQQ1JlcXVlc3Q6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+VFBDUmVxdWVzdC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfVFBDUkVRVUVTVCksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVFVRVNUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9UUENSRVFVRVNUKSwgcEJ1ZiwgbkJ1Zik7CisgICAgfQorIyAgIGVuZGlmIC8vIERPVDExRl9EVU1QX0ZSQU1FUworICAgIHJldHVybiBzdGF0dXM7CisKK30gLyogRW5kIGRvdDExZlVucGFja1RQQ1JlcXVlc3QuICovCisKK3RBTklfVTMyIGRvdDExZlBhY2tXTU1BZGRUU1JlcXVlc3QodHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZldNTUFkZFRTUmVxdWVzdCAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19XTU1BZGRUU1JlcXVlc3QsIElFU19XTU1BZGRUU1JlcXVlc3QpOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgiUGFja2VkIHRoZSBXTU1BZGRUU1JlcXVlc3Q6XG4iKSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJBY3Rpb246XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5EaWFsb2dUb2tlbi50b2tlbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJTdGF0dXNDb2RlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPlN0YXR1c0NvZGUuc3RhdHVzQ29kZSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJXTU1UU1BFQzpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5XTU1UU1BFQy5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksIEZSRkwoInRyYWZmaWNfdHlwZSAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHJhZmZpY190eXBlKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2lkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmRpcmVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgiYWNjZXNzX3BvbGljeSAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuYWNjZXNzX3BvbGljeSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnBzYik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgidXNlcl9wcmlvcml0eSAoMyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudXNlcl9wcmlvcml0eSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJ0c2luZm9fcnN2ZCAoNyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHNpbmZvX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksIEZSRkwoImJ1cnN0X3NpemVfZGVmbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuYnVyc3Rfc2l6ZV9kZWZuKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmZpeGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWF4X21zZHVfc2l6ZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLmluYWN0aXZpdHlfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5taW5fZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLmJ1cnN0X3NpemUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnN1cnBsdXNfYndfYWxsb3dhbmNlLCAyKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJDQ1hUcmFmU3RybVJhdGVTZXQ6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0LnByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0LnRzaWQsIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksIEZSRkwoIm51bV90c3JhdGVzOiAlZC5cbiIpLCBwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQubnVtX3RzcmF0ZXMpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVRVUVTVCksICggdEFOSV9VOCogKSBwRnJtLT5DQ1hUcmFmU3RybVJhdGVTZXQudHNyYXRlcywgcEZybS0+Q0NYVHJhZlN0cm1SYXRlU2V0Lm51bV90c3JhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVFVRVNUKSwgRlJGTCgidG86XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFUVVFU1QpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrV01NQWRkVFNSZXF1ZXN0LiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrV01NQWRkVFNSZXNwb25zZSh0cEFuaVNpckdsb2JhbCBwQ3R4LCB0RG90MTFmV01NQWRkVFNSZXNwb25zZSAqcEZybSwgdEFOSV9VOCAqcEJ1ZiwgdEFOSV9VMzIgbkJ1ZiwgdEFOSV9VMzIgKnBuQ29uc3VtZWQpCit7CisgICAgdEFOSV9VMzIgaSA9IDA7CisgICAgdEFOSV9VMzIgc3RhdHVzID0gMDsKKyAgICAodm9pZClpOworICAgICpwbkNvbnN1bWVkID0gMFU7CisgICAgc3RhdHVzID0gUGFja0NvcmUocEN0eCwgKHRBTklfVTgqKXBGcm0sIHBCdWYsIG5CdWYsIHBuQ29uc3VtZWQsIEZGU19XTU1BZGRUU1Jlc3BvbnNlLCBJRVNfV01NQWRkVFNSZXNwb25zZSk7CisKKyMgICBpZmRlZiBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICBpZiAoIURPVDExRl9GQUlMRUQoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgiUGFja2VkIHRoZSBXTU1BZGRUU1Jlc3BvbnNlOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoIkNhdGVnb3J5OlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DYXRlZ29yeS5jYXRlZ29yeSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5BY3Rpb24uYWN0aW9uLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJEaWFsb2dUb2tlbjpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoIlN0YXR1c0NvZGU6XG4iKSk7CisgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPlN0YXR1c0NvZGUuc3RhdHVzQ29kZSwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgiV01NVFNQRUM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NVFNQRUMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJOb3QgcHJlc2VudC5cbiIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnZlcnNpb24sIDEpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoInRzaWQgKDQpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRzaWQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJkaXJlY3Rpb24gKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmRpcmVjdGlvbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJhZ2dyZWdhdGlvbiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuYWdncmVnYXRpb24pOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJwc2IgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnBzYik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fYWNrX3BvbCAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHNpbmZvX2Fja19wb2wpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJ0c2luZm9fcnN2ZCAoNyk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMudHNpbmZvX3JzdmQpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJidXJzdF9zaXplX2RlZm4gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmJ1cnN0X3NpemVfZGVmbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoInNpemUgKDE1KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy5zaXplKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgRlJGTCgiZml4ZWQgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmZpeGVkKTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1heF9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zdXNwZW5zaW9uX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zZXJ2aWNlX3N0YXJ0X3RpbWUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5tZWFuX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5wZWFrX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLmRlbGF5X2JvdW5kLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1BRERUU1JFU1BPTlNFKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9waHlfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5tZWRpdW1fdGltZSwgMik7CisgICAgICAgIH0KKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCBGUkZMKCJDQ1hUcmFmU3RybU1ldDpcbiIpKTsKKyAgICAgICAgaWYgKCFwRnJtLT5DQ1hUcmFmU3RybU1ldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoIk5vdCBwcmVzZW50LlxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTUFERFRTUkVTUE9OU0UpLCAoIHRBTklfVTgqICkmcEZybS0+Q0NYVHJhZlN0cm1NZXQudHNpZCwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC5zdGF0ZSwgMSk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksICggdEFOSV9VOCogKSZwRnJtLT5DQ1hUcmFmU3RybU1ldC5tc210X2ludGVydmFsLCAyKTsKKyAgICAgICAgfQorICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NQUREVFNSRVNQT05TRSksIHBCdWYsIG5CdWYpOworICAgIH0KKyMgICBlbmRpZiAvLyBET1QxMUZfRFVNUF9GUkFNRVMKKyAgICByZXR1cm4gc3RhdHVzOworCit9IC8qIEVuZCBkb3QxMWZVbnBhY2tXTU1BZGRUU1Jlc3BvbnNlLiAqLworCit0QU5JX1UzMiBkb3QxMWZQYWNrV01NRGVsVFModHBBbmlTaXJHbG9iYWwgcEN0eCwgdERvdDExZldNTURlbFRTICpwRnJtLCB0QU5JX1U4ICpwQnVmLCB0QU5JX1UzMiBuQnVmLCB0QU5JX1UzMiAqcG5Db25zdW1lZCkKK3sKKyAgICB0QU5JX1UzMiBpID0gMDsKKyAgICB0QU5JX1UzMiBzdGF0dXMgPSAwOworICAgICh2b2lkKWk7CisgICAgKnBuQ29uc3VtZWQgPSAwVTsKKyAgICBzdGF0dXMgPSBQYWNrQ29yZShwQ3R4LCAodEFOSV9VOCopcEZybSwgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCwgRkZTX1dNTURlbFRTLCBJRVNfV01NRGVsVFMpOworCisjICAgaWZkZWYgRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgaWYgKCFET1QxMUZfRkFJTEVEKHN0YXR1cykpCisgICAgeworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJQYWNrZWQgdGhlIFdNTURlbFRTOlxuIikpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJDYXRlZ29yeTpcbiIpKTsKKyAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPkNhdGVnb3J5LmNhdGVnb3J5LCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgRlJGTCgiQWN0aW9uOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+QWN0aW9uLmFjdGlvbiwgMSk7CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoIkRpYWxvZ1Rva2VuOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+RGlhbG9nVG9rZW4udG9rZW4sIDEpOworICAgICAgICBGUkFNRVNfTE9HMChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJTdGF0dXNDb2RlOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+U3RhdHVzQ29kZS5zdGF0dXNDb2RlLCAxKTsKKyAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgRlJGTCgiV01NVFNQRUM6XG4iKSk7CisgICAgICAgIGlmICghcEZybS0+V01NVFNQRUMucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgRlJGTCgiTm90IHByZXNlbnQuXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMudmVyc2lvbiwgMSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJ0cmFmZmljX3R5cGUgKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRyYWZmaWNfdHlwZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJ0c2lkICg0KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2lkKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoImRpcmVjdGlvbiAoMik6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoImFjY2Vzc19wb2xpY3kgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmFjY2Vzc19wb2xpY3kpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgRlJGTCgiYWdncmVnYXRpb24gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmFnZ3JlZ2F0aW9uKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoInBzYiAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMucHNiKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoInVzZXJfcHJpb3JpdHkgKDMpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnVzZXJfcHJpb3JpdHkpOworICAgICAgICAgICAgRlJBTUVTX0xPRzEocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgRlJGTCgidHNpbmZvX2Fja19wb2wgKDIpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLnRzaW5mb19hY2tfcG9sKTsKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoInRzaW5mb19yc3ZkICg3KTogJWRcbiIpLCBwRnJtLT5XTU1UU1BFQy50c2luZm9fcnN2ZCk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJidXJzdF9zaXplX2RlZm4gKDEpOiAlZFxuIiksIHBGcm0tPldNTVRTUEVDLmJ1cnN0X3NpemVfZGVmbik7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJzaXplICgxNSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuc2l6ZSk7CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBGUkZMKCJmaXhlZCAoMSk6ICVkXG4iKSwgcEZybS0+V01NVFNQRUMuZml4ZWQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1heF9tc2R1X3NpemUsIDIpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLm1pbl9zZXJ2aWNlX2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWF4X3NlcnZpY2VfaW50LCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5pbmFjdGl2aXR5X2ludCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMuc3VzcGVuc2lvbl9pbnQsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnNlcnZpY2Vfc3RhcnRfdGltZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX2RhdGFfcmF0ZSwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWVhbl9kYXRhX3JhdGUsIDQpOworICAgICAgICAgICAgRlJBTUVTX0RVTVAocEN0eCwgRlJBTUVTX1NFVl9GT1JfRlJBTUUocEN0eCwgRE9UMTFGX1dNTURFTFRTKSwgKCB0QU5JX1U4KiApJnBGcm0tPldNTVRTUEVDLnBlYWtfZGF0YV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5idXJzdF9zaXplLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5kZWxheV9ib3VuZCwgNCk7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWluX3BoeV9yYXRlLCA0KTsKKyAgICAgICAgICAgIEZSQU1FU19EVU1QKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksICggdEFOSV9VOCogKSZwRnJtLT5XTU1UU1BFQy5zdXJwbHVzX2J3X2FsbG93YW5jZSwgMik7CisgICAgICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCAoIHRBTklfVTgqICkmcEZybS0+V01NVFNQRUMubWVkaXVtX3RpbWUsIDIpOworICAgICAgICB9CisgICAgICAgIEZSQU1FU19MT0cwKHBDdHgsIEZSQU1FU19TRVZfRk9SX0ZSQU1FKHBDdHgsIERPVDExRl9XTU1ERUxUUyksIEZSRkwoInRvOlxuIikpOworICAgICAgICBGUkFNRVNfRFVNUChwQ3R4LCBGUkFNRVNfU0VWX0ZPUl9GUkFNRShwQ3R4LCBET1QxMUZfV01NREVMVFMpLCBwQnVmLCBuQnVmKTsKKyAgICB9CisjICAgZW5kaWYgLy8gRE9UMTFGX0RVTVBfRlJBTUVTCisgICAgcmV0dXJuIHN0YXR1czsKKworfSAvKiBFbmQgZG90MTFmVW5wYWNrV01NRGVsVFMuICovCisKK3N0YXRpYyB0QU5JX1UzMiBQYWNrQ29yZSh0cEFuaVNpckdsb2JhbCBwQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgKnBuQ29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRGRkRlZm4gIEZGc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0SUVEZWZuICBJRXNbXSkKK3sKKyAgICBjb25zdCB0RkZEZWZuICpwRmY7CisgICAgY29uc3QgdElFRGVmbiAqcEllOworICAgIHRGUkFNRVNfQk9PTCAgKnBmRm91bmQ7CisgICAgdEFOSV9VOCAgICpwQnVmUmVtYWluaW5nOworICAgIHRBTklfVTE2ICBpOworICAgIHRBTklfVTMyICBuQnVmUmVtYWluaW5nLCBzdGF0dXMsIGxlbjsKKyAgICB0QU5JX1UzMiAgY291bnRPZmZzZXQgPSAwOworCisgICAgKHZvaWQpcEN0eDsgLyogU2h1dHVwIHRoZSBjb21waWxlciBpZiB3ZSBoYXZlIG5vIEZGcyBub3IgSUVzLi4uICovCisgICAgaT0wOworCisgICAgRE9UMTFGX1BBUkFNRVRFUl9DSEVDSzIocFNyYywgcEJ1ZiwgbkJ1ZiwgcG5Db25zdW1lZCk7CisKKyAgICBzdGF0dXMgPSBET1QxMUZfUEFSU0VfU1VDQ0VTUzsKKyAgICBwQnVmUmVtYWluaW5nID0gcEJ1ZjsKKyAgICBuQnVmUmVtYWluaW5nID0gbkJ1ZjsKKworICAgIHBGZiA9ICYoIEZGc1swXSApOworICAgIHdoaWxlICggcEZmLT5zaXplICkKKyAgICB7CisgICAgICAgIGlmICggcEZmLT5zaXplID4gbkJ1ZlJlbWFpbmluZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSQU1FU19MT0czKHBDdHgsIEZSTE9HRSwgRlJGTCgiVGhlIEZpeGVkIEZpZWxkICVzIHJlcSIKKyAgICAgICAgICAgICAgICAidWlyZXMgJWQgYnl0ZXMsIGJ1dCB0aGVyZSBhcmUgb25seSAlZCByZW1haW5pbmcuXG4iKSwKKyAgICAgICAgICAgICAgICBwRmYtPm5hbWUsIHBGZi0+c2l6ZSwgbkJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICByZXR1cm4gRE9UMTFGX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoIHBGZi0+c2lnICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTaWdGZkFJRDoKKyAgICAgICAgICAgICAgICBkb3QxMWZQYWNrRmZBSUQocEN0eCwgKHREb3QxMWZGZkFJRCogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZBY3Rpb246CisgICAgICAgICAgICAgICAgZG90MTFmUGFja0ZmQWN0aW9uKHBDdHgsICh0RG90MTFmRmZBY3Rpb24qICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpZ0ZmQWRkQkFQYXJhbWV0ZXJTZXQ6CisgICAgICAgICAgICAgICAgZG90MTFmUGFja0ZmQWRkQkFQYXJhbWV0ZXJTZXQocEN0eCwgKHREb3QxMWZGZkFkZEJBUGFyYW1ldGVyU2V0KiApKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaWdGZkF1dGhBbGdvOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZkF1dGhBbGdvKHBDdHgsICh0RG90MTFmRmZBdXRoQWxnbyogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZBdXRoU2VxTm86CisgICAgICAgICAgICAgICAgZG90MTFmUGFja0ZmQXV0aFNlcU5vKHBDdHgsICh0RG90MTFmRmZBdXRoU2VxTm8qICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpZ0ZmQkFTdGFydGluZ1NlcXVlbmNlQ29udHJvbDoKKyAgICAgICAgICAgICAgICBkb3QxMWZQYWNrRmZCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sKHBDdHgsICh0RG90MTFmRmZCQVN0YXJ0aW5nU2VxdWVuY2VDb250cm9sKiApKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaWdGZkJBVGltZW91dDoKKyAgICAgICAgICAgICAgICBkb3QxMWZQYWNrRmZCQVRpbWVvdXQocEN0eCwgKHREb3QxMWZGZkJBVGltZW91dCogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZCZWFjb25JbnRlcnZhbDoKKyAgICAgICAgICAgICAgICBkb3QxMWZQYWNrRmZCZWFjb25JbnRlcnZhbChwQ3R4LCAodERvdDExZkZmQmVhY29uSW50ZXJ2YWwqICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpZ0ZmQ2FwYWJpbGl0aWVzOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZkNhcGFiaWxpdGllcyhwQ3R4LCAodERvdDExZkZmQ2FwYWJpbGl0aWVzKiApKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaWdGZkNhdGVnb3J5OgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZkNhdGVnb3J5KHBDdHgsICh0RG90MTFmRmZDYXRlZ29yeSogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZDdXJyZW50QVBBZGRyZXNzOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZkN1cnJlbnRBUEFkZHJlc3MocEN0eCwgKHREb3QxMWZGZkN1cnJlbnRBUEFkZHJlc3MqICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpZ0ZmRGVsQkFQYXJhbWV0ZXJTZXQ6CisgICAgICAgICAgICAgICAgZG90MTFmUGFja0ZmRGVsQkFQYXJhbWV0ZXJTZXQocEN0eCwgKHREb3QxMWZGZkRlbEJBUGFyYW1ldGVyU2V0KiApKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaWdGZkRpYWxvZ1Rva2VuOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZkRpYWxvZ1Rva2VuKHBDdHgsICh0RG90MTFmRmZEaWFsb2dUb2tlbiogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZMaW5rTWFyZ2luOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZkxpbmtNYXJnaW4ocEN0eCwgKHREb3QxMWZGZkxpbmtNYXJnaW4qICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpZ0ZmTGlzdGVuSW50ZXJ2YWw6CisgICAgICAgICAgICAgICAgZG90MTFmUGFja0ZmTGlzdGVuSW50ZXJ2YWwocEN0eCwgKHREb3QxMWZGZkxpc3RlbkludGVydmFsKiApKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaWdGZk1heFR4UG93ZXI6CisgICAgICAgICAgICAgICAgZG90MTFmUGFja0ZmTWF4VHhQb3dlcihwQ3R4LCAodERvdDExZkZmTWF4VHhQb3dlciogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZOdW1PZlJlcGV0aXRpb25zOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZk51bU9mUmVwZXRpdGlvbnMocEN0eCwgKHREb3QxMWZGZk51bU9mUmVwZXRpdGlvbnMqICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpZ0ZmUDJQT1VJOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZlAyUE9VSShwQ3R4LCAodERvdDExZkZmUDJQT1VJKiApKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaWdGZlAyUE9VSVN1YlR5cGU6CisgICAgICAgICAgICAgICAgZG90MTFmUGFja0ZmUDJQT1VJU3ViVHlwZShwQ3R4LCAodERvdDExZkZmUDJQT1VJU3ViVHlwZSogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZSQ1BJOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZlJDUEkocEN0eCwgKHREb3QxMWZGZlJDUEkqICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpZ0ZmUlNOSToKKyAgICAgICAgICAgICAgICBkb3QxMWZQYWNrRmZSU05JKHBDdHgsICh0RG90MTFmRmZSU05JKiApKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaWdGZlJlYXNvbjoKKyAgICAgICAgICAgICAgICBkb3QxMWZQYWNrRmZSZWFzb24ocEN0eCwgKHREb3QxMWZGZlJlYXNvbiogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZSeEFudGVubmFJZDoKKyAgICAgICAgICAgICAgICBkb3QxMWZQYWNrRmZSeEFudGVubmFJZChwQ3R4LCAodERvdDExZkZmUnhBbnRlbm5hSWQqICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpZ0ZmU01Qb3dlck1vZGVTZXQ6CisgICAgICAgICAgICAgICAgZG90MTFmUGFja0ZmU01Qb3dlck1vZGVTZXQocEN0eCwgKHREb3QxMWZGZlNNUG93ZXJNb2RlU2V0KiApKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaWdGZlN0YXR1czoKKyAgICAgICAgICAgICAgICBkb3QxMWZQYWNrRmZTdGF0dXMocEN0eCwgKHREb3QxMWZGZlN0YXR1cyogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZTdGF0dXNDb2RlOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZlN0YXR1c0NvZGUocEN0eCwgKHREb3QxMWZGZlN0YXR1c0NvZGUqICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpZ0ZmVFBDRWxlSUQ6CisgICAgICAgICAgICAgICAgZG90MTFmUGFja0ZmVFBDRWxlSUQocEN0eCwgKHREb3QxMWZGZlRQQ0VsZUlEKiApKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaWdGZlRQQ0VsZUxlbjoKKyAgICAgICAgICAgICAgICBkb3QxMWZQYWNrRmZUUENFbGVMZW4ocEN0eCwgKHREb3QxMWZGZlRQQ0VsZUxlbiogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZUU0luZm86CisgICAgICAgICAgICAgICAgZG90MTFmUGFja0ZmVFNJbmZvKHBDdHgsICh0RG90MTFmRmZUU0luZm8qICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNpZ0ZmVGltZVN0YW1wOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZlRpbWVTdGFtcChwQ3R4LCAodERvdDExZkZmVGltZVN0YW1wKiApKHBTcmMgKyBwRmYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTaWdGZlR4QW50ZW5uYUlkOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZlR4QW50ZW5uYUlkKHBDdHgsICh0RG90MTFmRmZUeEFudGVubmFJZCogKShwU3JjICsgcEZmLT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2lnRmZUeFBvd2VyOgorICAgICAgICAgICAgICAgIGRvdDExZlBhY2tGZlR4UG93ZXIocEN0eCwgKHREb3QxMWZGZlR4UG93ZXIqICkocFNyYyArIHBGZi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBGUkFNRVNfTE9HMShwQ3R4LCBGUkxPR0UsIEZSRkwoIklOVEVSTkFMIEVSUk9SLS0gSSBkb24iCisgICAgICAgICAgICAgICAgIid0IGtub3cgYWJvdXQgdGhlIEZpeGVkIEZpZWxkICVkOyB0aGlzIGlzIG1vc3QgbCIKKyAgICAgICAgICAgICAgICAiaWtlbHkgYSBidWcgaW4gJ2ZyYW1lc2cnLlxuIiksIHBGZi0+c2lnKTsKKyAgICAgICAgICAgIHJldHVybiBET1QxMUZfSU5URVJOQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBwQnVmUmVtYWluaW5nICs9IHBGZi0+c2l6ZTsKKyAgICAgICAgbkJ1ZlJlbWFpbmluZyAtPSBwRmYtPnNpemU7CisgICAgICAgICpwbkNvbnN1bWVkICAgKz0gcEZmLT5zaXplOworICAgICAgICArK3BGZjsKKworICAgIH0KKworICAgIHBJZSA9ICYoIElFc1swXSApOworICAgIHdoaWxlICggMHhmZiAhPSBwSWUtPmVpZCApCisgICAgeworICAgICAgICBwZkZvdW5kID0gKHRGUkFNRVNfQk9PTCopKHBTcmMgKyBwSWUtPm9mZnNldCArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJZS0+cHJlc2VuY2VPZmZzZXQpOworICAgICAgICBpZiAoICpwZkZvdW5kICYmIHBJZS0+bWluU2l6ZSA+IG5CdWZSZW1haW5pbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBGUkFNRVNfTE9HMyhwQ3R4LCBGUkxPR0UsIEZSRkwoIlRoZSBJRSAlcyB0YWtlcyBhdCBsZSIKKyAgICAgICAgICAgICAgICAiYXN0ICVkIGJ5dGVzLCBidXQgdGhlcmUgYXJlIG9ubHkgJWQgbGVmdCBpbiB0aGUgYiIKKyAgICAgICAgICAgICAgICAidWZmZXIuXG4iKSwgcEllLT5uYW1lLCBwSWUtPm1pblNpemUsIG5CdWZSZW1haW5pbmcpOworICAgICAgICAgICAgcmV0dXJuIERPVDExRl9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgIH0KKworCisgICAgICAgIGNvdW50T2Zmc2V0ID0gKCAoMCA9PSBwSWUtPmFycmF5Ym91bmQpID8gIDE6ICoodEFOSV9VMTYqICkocFNyYyArIHBJZS0+Y291bnRPZmZzZXQpICk7CisgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudE9mZnNldDsgKytpKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBsZW4gPSAwVTsKKyAgICAgICAgICAgICAgIHN3aXRjaCAoIHBJZS0+c2lnICkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUFQTmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVBUE5hbWUocEN0eCwgKCB0RG90MTFmSUVBUE5hbWUqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUFQTmFtZSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQlBJbmRpY2F0b3I6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llQlBJbmRpY2F0b3IocEN0eCwgKCB0RG90MTFmSUVCUEluZGljYXRvciogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQlBJbmRpY2F0b3IpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUNvbmRlbnNlZENvdW50cnlTdHI6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llQ29uZGVuc2VkQ291bnRyeVN0cihwQ3R4LCAoIHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUNvbmRlbnNlZENvdW50cnlTdHIpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUdUSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVHVEsocEN0eCwgKCB0RG90MTFmSUVHVEsqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUdUSykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llSENGOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUhDRihwQ3R4LCAoIHREb3QxMWZJRUhDRiogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFSENGKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVMTEF0dHI6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llTExBdHRyKHBDdHgsICggdERvdDExZklFTExBdHRyKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVMTEF0dHIpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUxvYWRCYWxhbmNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUxvYWRCYWxhbmNlKHBDdHgsICggdERvdDExZklFTG9hZEJhbGFuY2UqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUxvYWRCYWxhbmNlKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVMb2FkSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVMb2FkSW5mbyhwQ3R4LCAoIHREb3QxMWZJRUxvYWRJbmZvKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVMb2FkSW5mbykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUHJvcEFzc29jVHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQcm9wQXNzb2NUeXBlKHBDdHgsICggdERvdDExZklFUHJvcEFzc29jVHlwZSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUHJvcEFzc29jVHlwZSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUHJvcENhcGFiaWxpdHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llUHJvcENhcGFiaWxpdHkocEN0eCwgKCB0RG90MTFmSUVQcm9wQ2FwYWJpbGl0eSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUHJvcENhcGFiaWxpdHkpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVByb3BDaGFublN3aXRjaEFubjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQcm9wQ2hhbm5Td2l0Y2hBbm4ocEN0eCwgKCB0RG90MTFmSUVQcm9wQ2hhbm5Td2l0Y2hBbm4qICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVByb3BDaGFublN3aXRjaEFubikgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUHJvcEVEQ0FQYXJhbXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llUHJvcEVEQ0FQYXJhbXMocEN0eCwgKCB0RG90MTFmSUVQcm9wRURDQVBhcmFtcyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUHJvcEVEQ0FQYXJhbXMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVByb3BRdWlldEJTUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQcm9wUXVpZXRCU1MocEN0eCwgKCB0RG90MTFmSUVQcm9wUXVpZXRCU1MqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVByb3BRdWlldEJTUykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUHJvcFN1cHBSYXRlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQcm9wU3VwcFJhdGVzKHBDdHgsICggdERvdDExZklFUHJvcFN1cHBSYXRlcyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUHJvcFN1cHBSYXRlcykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUjBLSF9JRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVSMEtIX0lEKHBDdHgsICggdERvdDExZklFUjBLSF9JRCogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUjBLSF9JRCkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUjFLSF9JRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVSMUtIX0lEKHBDdHgsICggdERvdDExZklFUjFLSF9JRCogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUjFLSF9JRCkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVFNGSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVUU0ZJbmZvKHBDdHgsICggdERvdDExZklFVFNGSW5mbyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVFNGSW5mbykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVGF1cnVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVRhdXJ1cyhwQ3R4LCAoIHREb3QxMWZJRVRhdXJ1cyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVGF1cnVzKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVUaXRhbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVUaXRhbihwQ3R4LCAoIHREb3QxMWZJRVRpdGFuKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVUaXRhbikgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVHJpZ2dlclN0YUJnU2NhbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVUcmlnZ2VyU3RhQmdTY2FuKHBDdHgsICggdERvdDExZklFVHJpZ2dlclN0YUJnU2NhbiogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVHJpZ2dlclN0YUJnU2NhbikgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVmVyc2lvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVWZXJzaW9uKHBDdHgsICggdERvdDExZklFVmVyc2lvbiogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVmVyc2lvbikgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV0RTOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVdEUyhwQ3R4LCAoIHREb3QxMWZJRVdEUyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV0RTKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVBUENoYW5uZWxSZXBvcnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llQVBDaGFubmVsUmVwb3J0KHBDdHgsICggdERvdDExZklFQVBDaGFubmVsUmVwb3J0KiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVBUENoYW5uZWxSZXBvcnQpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUJjblJlcG9ydGluZ0RldGFpbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVCY25SZXBvcnRpbmdEZXRhaWwocEN0eCwgKCB0RG90MTFmSUVCY25SZXBvcnRpbmdEZXRhaWwqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUJjblJlcG9ydGluZ0RldGFpbCkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQmVhY29uUmVwb3J0RnJtQm9keToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVCZWFjb25SZXBvcnRGcm1Cb2R5KHBDdHgsICggdERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQmVhY29uUmVwb3J0RnJtQm9keSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQmVhY29uUmVwb3J0aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUJlYWNvblJlcG9ydGluZyhwQ3R4LCAoIHREb3QxMWZJRUJlYWNvblJlcG9ydGluZyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQmVhY29uUmVwb3J0aW5nKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVNZWFzdXJlbWVudFBpbG90OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZU1lYXN1cmVtZW50UGlsb3QocEN0eCwgKCB0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90KiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVNZWFzdXJlbWVudFBpbG90KSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVNdWx0aUJzc2lkOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZU11bHRpQnNzaWQocEN0eCwgKCB0RG90MTFmSUVNdWx0aUJzc2lkKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVNdWx0aUJzc2lkKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSSUNEYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVJJQ0RhdGEocEN0eCwgKCB0RG90MTFmSUVSSUNEYXRhKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSSUNEYXRhKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSSUNEZXNjcmlwdG9yOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVJJQ0Rlc2NyaXB0b3IocEN0eCwgKCB0RG90MTFmSUVSSUNEZXNjcmlwdG9yKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSSUNEZXNjcmlwdG9yKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSUk1FbmFibGVkQ2FwOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVJSTUVuYWJsZWRDYXAocEN0eCwgKCB0RG90MTFmSUVSUk1FbmFibGVkQ2FwKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSUk1FbmFibGVkQ2FwKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSZXF1ZXN0ZWRJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVJlcXVlc3RlZEluZm8ocEN0eCwgKCB0RG90MTFmSUVSZXF1ZXN0ZWRJbmZvKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSZXF1ZXN0ZWRJbmZvKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVTU0lEOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVNTSUQocEN0eCwgKCB0RG90MTFmSUVTU0lEKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVTU0lEKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVTY2hlZHVsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVTY2hlZHVsZShwQ3R4LCAoIHREb3QxMWZJRVNjaGVkdWxlKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVTY2hlZHVsZSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVENMQVM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llVENMQVMocEN0eCwgKCB0RG90MTFmSUVUQ0xBUyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVENMQVMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRDTEFTU1BST0M6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llVENMQVNTUFJPQyhwQ3R4LCAoIHREb3QxMWZJRVRDTEFTU1BST0MqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVRDTEFTU1BST0MpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRTRGVsYXk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llVFNEZWxheShwQ3R4LCAoIHREb3QxMWZJRVRTRGVsYXkqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVRTRGVsYXkpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRTUEVDOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVRTUEVDKHBDdHgsICggdERvdDExZklFVFNQRUMqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVRTUEVDKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXTU1TY2hlZHVsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVXTU1TY2hlZHVsZShwQ3R4LCAoIHREb3QxMWZJRVdNTVNjaGVkdWxlKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXTU1TY2hlZHVsZSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV01NVENMQVM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llV01NVENMQVMocEN0eCwgKCB0RG90MTFmSUVXTU1UQ0xBUyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV01NVENMQVMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTVRDTEFTUFJPQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVXTU1UQ0xBU1BST0MocEN0eCwgKCB0RG90MTFmSUVXTU1UQ0xBU1BST0MqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdNTVRDTEFTUFJPQykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV01NVFNEZWxheToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVXTU1UU0RlbGF5KHBDdHgsICggdERvdDExZklFV01NVFNEZWxheSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV01NVFNEZWxheSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV01NVFNQRUM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llV01NVFNQRUMocEN0eCwgKCB0RG90MTFmSUVXTU1UU1BFQyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV01NVFNQRUMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUFpcmdvOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUFpcmdvKHBDdHgsICggdERvdDExZklFQWlyZ28qICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUFpcmdvKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVDQ1hDY2ttT3BhcXVlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUNDWENja21PcGFxdWUocEN0eCwgKCB0RG90MTFmSUVDQ1hDY2ttT3BhcXVlKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDQ1hDY2ttT3BhcXVlKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVDQ1hSYWRNZ210Q2FwOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUNDWFJhZE1nbXRDYXAocEN0eCwgKCB0RG90MTFmSUVDQ1hSYWRNZ210Q2FwKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDQ1hSYWRNZ210Q2FwKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVDQ1hUcmFmU3RybU1ldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVDQ1hUcmFmU3RybU1ldChwQ3R4LCAoIHREb3QxMWZJRUNDWFRyYWZTdHJtTWV0KiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDQ1hUcmFmU3RybU1ldCkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ0NYVHJhZlN0cm1SYXRlU2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUNDWFRyYWZTdHJtUmF0ZVNldChwQ3R4LCAoIHREb3QxMWZJRUNDWFRyYWZTdHJtUmF0ZVNldCogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQ0NYVHJhZlN0cm1SYXRlU2V0KSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVDQ1hUeG1pdFBvd2VyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUNDWFR4bWl0UG93ZXIocEN0eCwgKCB0RG90MTFmSUVDQ1hUeG1pdFBvd2VyKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDQ1hUeG1pdFBvd2VyKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVDQ1hWZXJzaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUNDWFZlcnNpb24ocEN0eCwgKCB0RG90MTFmSUVDQ1hWZXJzaW9uKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDQ1hWZXJzaW9uKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVDRlBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVDRlBhcmFtcyhwQ3R4LCAoIHREb3QxMWZJRUNGUGFyYW1zKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVDRlBhcmFtcykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ2hhbGxlbmdlVGV4dDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVDaGFsbGVuZ2VUZXh0KHBDdHgsICggdERvdDExZklFQ2hhbGxlbmdlVGV4dCogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQ2hhbGxlbmdlVGV4dCkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ2hhblN3aXRjaEFubjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVDaGFuU3dpdGNoQW5uKHBDdHgsICggdERvdDExZklFQ2hhblN3aXRjaEFubiogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQ2hhblN3aXRjaEFubikgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llQ291bnRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVDb3VudHJ5KHBDdHgsICggdERvdDExZklFQ291bnRyeSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFQ291bnRyeSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRFNQYXJhbXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llRFNQYXJhbXMocEN0eCwgKCB0RG90MTFmSUVEU1BhcmFtcyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFRFNQYXJhbXMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUVEQ0FQYXJhbVNldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVFRENBUGFyYW1TZXQocEN0eCwgKCB0RG90MTFmSUVFRENBUGFyYW1TZXQqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUVEQ0FQYXJhbVNldCkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRVJQSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVFUlBJbmZvKHBDdHgsICggdERvdDExZklFRVJQSW5mbyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFRVJQSW5mbykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRXh0Q2hhblN3aXRjaEFubjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVFeHRDaGFuU3dpdGNoQW5uKHBDdHgsICggdERvdDExZklFRXh0Q2hhblN3aXRjaEFubiogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFRXh0Q2hhblN3aXRjaEFubikgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRXh0U3VwcFJhdGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUV4dFN1cHBSYXRlcyhwQ3R4LCAoIHREb3QxMWZJRUV4dFN1cHBSYXRlcyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFRXh0U3VwcFJhdGVzKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVGSFBhcmFtU2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUZIUGFyYW1TZXQocEN0eCwgKCB0RG90MTFmSUVGSFBhcmFtU2V0KiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVGSFBhcmFtU2V0KSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVGSFBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVGSFBhcmFtcyhwQ3R4LCAoIHREb3QxMWZJRUZIUGFyYW1zKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVGSFBhcmFtcykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRkhQYXR0VGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llRkhQYXR0VGFibGUocEN0eCwgKCB0RG90MTFmSUVGSFBhdHRUYWJsZSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFRkhQYXR0VGFibGUpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUZUSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVGVEluZm8ocEN0eCwgKCB0RG90MTFmSUVGVEluZm8qICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUZUSW5mbykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llRlRUaW1lb3V0SW50ZXJ2YWw6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llRlRUaW1lb3V0SW50ZXJ2YWwocEN0eCwgKCB0RG90MTFmSUVGVFRpbWVvdXRJbnRlcnZhbCogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFRlRUaW1lb3V0SW50ZXJ2YWwpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZUhUQ2FwczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVIVENhcHMocEN0eCwgKCB0RG90MTFmSUVIVENhcHMqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRUhUQ2FwcykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llSFRJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUhUSW5mbyhwQ3R4LCAoIHREb3QxMWZJRUhUSW5mbyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFSFRJbmZvKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVJQlNTUGFyYW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZUlCU1NQYXJhbXMocEN0eCwgKCB0RG90MTFmSUVJQlNTUGFyYW1zKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVJQlNTUGFyYW1zKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVNZWFzdXJlbWVudFJlcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVNZWFzdXJlbWVudFJlcG9ydChwQ3R4LCAoIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0KiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llTWVhc3VyZW1lbnRSZXF1ZXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZU1lYXN1cmVtZW50UmVxdWVzdChwQ3R4LCAoIHREb3QxMWZJRU1lYXN1cmVtZW50UmVxdWVzdCogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFTWVhc3VyZW1lbnRSZXF1ZXN0KSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVNb2JpbGl0eURvbWFpbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVNb2JpbGl0eURvbWFpbihwQ3R4LCAoIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVNb2JpbGl0eURvbWFpbikgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llTmVpZ2hib3JSZXBvcnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llTmVpZ2hib3JSZXBvcnQocEN0eCwgKCB0RG90MTFmSUVOZWlnaGJvclJlcG9ydCogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFTmVpZ2hib3JSZXBvcnQpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEFzc29jUmVxOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVAyUEFzc29jUmVxKHBDdHgsICggdERvdDExZklFUDJQQXNzb2NSZXEqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUEFzc29jUmVxKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBBc3NvY1JlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQMlBBc3NvY1JlcyhwQ3R4LCAoIHREb3QxMWZJRVAyUEFzc29jUmVzKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBBc3NvY1JlcykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQQmVhY29uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVAyUEJlYWNvbihwQ3R4LCAoIHREb3QxMWZJRVAyUEJlYWNvbiogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQQmVhY29uKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBCZWFjb25Qcm9iZVJlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQMlBCZWFjb25Qcm9iZVJlcyhwQ3R4LCAoIHREb3QxMWZJRVAyUEJlYWNvblByb2JlUmVzKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBCZWFjb25Qcm9iZVJlcykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQRGVBdXRoOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVAyUERlQXV0aChwQ3R4LCAoIHREb3QxMWZJRVAyUERlQXV0aCogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQRGVBdXRoKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxKHBDdHgsICggdERvdDExZklFUDJQRGV2aWNlRGlzY292ZXJhYmlsaXR5UmVxKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXEpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMocEN0eCwgKCB0RG90MTFmSUVQMlBEZXZpY2VEaXNjb3ZlcmFiaWxpdHlSZXMqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUERldmljZURpc2NvdmVyYWJpbGl0eVJlcykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQRGlzQXNzb2M6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llUDJQRGlzQXNzb2MocEN0eCwgKCB0RG90MTFmSUVQMlBEaXNBc3NvYyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQRGlzQXNzb2MpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEdPTmVnQ25mOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVAyUEdPTmVnQ25mKHBDdHgsICggdERvdDExZklFUDJQR09OZWdDbmYqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUEdPTmVnQ25mKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBHT05lZ1JlcToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQMlBHT05lZ1JlcShwQ3R4LCAoIHREb3QxMWZJRVAyUEdPTmVnUmVxKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBHT05lZ1JlcSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQR09OZWdSZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llUDJQR09OZWdSZXMocEN0eCwgKCB0RG90MTFmSUVQMlBHT05lZ1JlcyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQR09OZWdSZXMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUEdPTmVnV1BTOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVAyUEdPTmVnV1BTKHBDdHgsICggdERvdDExZklFUDJQR09OZWdXUFMqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUEdPTmVnV1BTKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBJRU9wYXF1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQMlBJRU9wYXF1ZShwQ3R4LCAoIHREb3QxMWZJRVAyUElFT3BhcXVlKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBJRU9wYXF1ZSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQSW52aXRhdGlvblJlcToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQMlBJbnZpdGF0aW9uUmVxKHBDdHgsICggdERvdDExZklFUDJQSW52aXRhdGlvblJlcSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQSW52aXRhdGlvblJlcSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQSW52aXRhdGlvblJlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQMlBJbnZpdGF0aW9uUmVzKHBDdHgsICggdERvdDExZklFUDJQSW52aXRhdGlvblJlcyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQSW52aXRhdGlvblJlcykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQTm90aWNlT2ZBYnNlbmNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVAyUE5vdGljZU9mQWJzZW5jZShwQ3R4LCAoIHREb3QxMWZJRVAyUE5vdGljZU9mQWJzZW5jZSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQTm90aWNlT2ZBYnNlbmNlKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBQcmVzZW5jZVJlc3BvbnNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVAyUFByZXNlbmNlUmVzcG9uc2UocEN0eCwgKCB0RG90MTFmSUVQMlBQcmVzZW5jZVJlc3BvbnNlKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBQcmVzZW5jZVJlc3BvbnNlKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQMlBQcm9iZVJlcToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQMlBQcm9iZVJlcShwQ3R4LCAoIHREb3QxMWZJRVAyUFByb2JlUmVxKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQMlBQcm9iZVJlcSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQUHJvYmVSZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llUDJQUHJvYmVSZXMocEN0eCwgKCB0RG90MTFmSUVQMlBQcm9iZVJlcyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQUHJvYmVSZXMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEocEN0eCwgKCB0RG90MTFmSUVQMlBQcm92aXNpb25EaXNjb3ZlcnlSZXEqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVAyUFByb3Zpc2lvbkRpc2NvdmVyeVJlcSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcyhwQ3R4LCAoIHREb3QxMWZJRVAyUFdTQ1Byb3Zpc2lvbkRpc2NvdmVyeVJlcyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUDJQV1NDUHJvdmlzaW9uRGlzY292ZXJ5UmVzKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVQb3dlckNhcHM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llUG93ZXJDYXBzKHBDdHgsICggdERvdDExZklFUG93ZXJDYXBzKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVQb3dlckNhcHMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVBvd2VyQ29uc3RyYWludHM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llUG93ZXJDb25zdHJhaW50cyhwQ3R4LCAoIHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVFCU1NMb2FkOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVFCU1NMb2FkKHBDdHgsICggdERvdDExZklFUUJTU0xvYWQqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVFCU1NMb2FkKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVRT1NDYXBzQXA6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llUU9TQ2Fwc0FwKHBDdHgsICggdERvdDExZklFUU9TQ2Fwc0FwKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVRT1NDYXBzQXApICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVFPU0NhcHNTdGF0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVFPU0NhcHNTdGF0aW9uKHBDdHgsICggdERvdDExZklFUU9TQ2Fwc1N0YXRpb24qICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVRdWlldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVRdWlldChwQ3R4LCAoIHREb3QxMWZJRVF1aWV0KiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVRdWlldCkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUkNQSUlFOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVJDUElJRShwQ3R4LCAoIHREb3QxMWZJRVJDUElJRSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUkNQSUlFKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSSUNEYXRhRGVzYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVSSUNEYXRhRGVzYyhwQ3R4LCAoIHREb3QxMWZJRVJJQ0RhdGFEZXNjKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSSUNEYXRhRGVzYykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llUlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVJTTihwQ3R4LCAoIHREb3QxMWZJRVJTTiogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFUlNOKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVSU05JSUU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llUlNOSUlFKHBDdHgsICggdERvdDExZklFUlNOSUlFKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVSU05JSUUpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVJTTk9wYXF1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVSU05PcGFxdWUocEN0eCwgKCB0RG90MTFmSUVSU05PcGFxdWUqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVJTTk9wYXF1ZSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llU3VwcENoYW5uZWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVN1cHBDaGFubmVscyhwQ3R4LCAoIHREb3QxMWZJRVN1cHBDaGFubmVscyogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFU3VwcENoYW5uZWxzKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVTdXBwUmF0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llU3VwcFJhdGVzKHBDdHgsICggdERvdDExZklFU3VwcFJhdGVzKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVTdXBwUmF0ZXMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVRJTToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVUSU0ocEN0eCwgKCB0RG90MTFmSUVUSU0qICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVRJTSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llVFBDUmVwb3J0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVRQQ1JlcG9ydChwQ3R4LCAoIHREb3QxMWZJRVRQQ1JlcG9ydCogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFVFBDUmVwb3J0KSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVUUENSZXF1ZXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVRQQ1JlcXVlc3QocEN0eCwgKCB0RG90MTFmSUVUUENSZXF1ZXN0KiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVUUENSZXF1ZXN0KSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXQVBJOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVdBUEkocEN0eCwgKCB0RG90MTFmSUVXQVBJKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXQVBJKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXQVBJT3BhcXVlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVdBUElPcGFxdWUocEN0eCwgKCB0RG90MTFmSUVXQVBJT3BhcXVlKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXQVBJT3BhcXVlKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXRkFUUEM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llV0ZBVFBDKHBDdHgsICggdERvdDExZklFV0ZBVFBDKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXRkFUUEMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTUNhcHM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llV01NQ2FwcyhwQ3R4LCAoIHREb3QxMWZJRVdNTUNhcHMqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdNTUNhcHMpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTUluZm9BcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVXTU1JbmZvQXAocEN0eCwgKCB0RG90MTFmSUVXTU1JbmZvQXAqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdNTUluZm9BcCkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV01NSW5mb1N0YXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llV01NSW5mb1N0YXRpb24ocEN0eCwgKCB0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV01NSW5mb1N0YXRpb24pICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdNTVBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVXTU1QYXJhbXMocEN0eCwgKCB0RG90MTFmSUVXTU1QYXJhbXMqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdNTVBhcmFtcykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV1BBOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVdQQShwQ3R4LCAoIHREb3QxMWZJRVdQQSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV1BBKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXUEFPcGFxdWU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llV1BBT3BhcXVlKHBDdHgsICggdERvdDExZklFV1BBT3BhcXVlKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXUEFPcGFxdWUpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdTQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVXU0MocEN0eCwgKCB0RG90MTFmSUVXU0MqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdTQykgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV3NjQXNzb2NSZXE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llV3NjQXNzb2NSZXEocEN0eCwgKCB0RG90MTFmSUVXc2NBc3NvY1JlcSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV3NjQXNzb2NSZXEpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdzY0Fzc29jUmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVdzY0Fzc29jUmVzKHBDdHgsICggdERvdDExZklFV3NjQXNzb2NSZXMqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdzY0Fzc29jUmVzKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXc2NCZWFjb246CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llV3NjQmVhY29uKHBDdHgsICggdERvdDExZklFV3NjQmVhY29uKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXc2NCZWFjb24pICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdzY0JlYWNvblByb2JlUmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVdzY0JlYWNvblByb2JlUmVzKHBDdHgsICggdERvdDExZklFV3NjQmVhY29uUHJvYmVSZXMqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdzY0JlYWNvblByb2JlUmVzKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXc2NJRU9wYXF1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrSWVXc2NJRU9wYXF1ZShwQ3R4LCAoIHREb3QxMWZJRVdzY0lFT3BhcXVlKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXc2NJRU9wYXF1ZSkgKiBpICksICBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZ0llV3NjUHJvYmVSZXE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja0llV3NjUHJvYmVSZXEocEN0eCwgKCB0RG90MTFmSUVXc2NQcm9iZVJlcSogKShwU3JjICsgcEllLT5vZmZzZXQgKyBzaXplb2YodERvdDExZklFV3NjUHJvYmVSZXEpICogaSApLCAgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTaWdJZVdzY1Byb2JlUmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVdzY1Byb2JlUmVzKHBDdHgsICggdERvdDExZklFV3NjUHJvYmVSZXMqICkocFNyYyArIHBJZS0+b2Zmc2V0ICsgc2l6ZW9mKHREb3QxMWZJRVdzY1Byb2JlUmVzKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2lnSWVXc2NSZWFzc29jUmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tJZVdzY1JlYXNzb2NSZXMocEN0eCwgKCB0RG90MTFmSUVXc2NSZWFzc29jUmVzKiApKHBTcmMgKyBwSWUtPm9mZnNldCArIHNpemVvZih0RG90MTFmSUVXc2NSZWFzc29jUmVzKSAqIGkgKSwgIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSTE9HRSwgRlJGTCgiSU5URVJOQUwgRVJST1ItLSBJIGRvbiIKKyAgICAgICAgICAgICAgICAgICAiJ3Qga25vdyBhYm91dCB0aGUgSUUgJWQ7IHRoaXMgaXMgbW9zdCBsaWtlbHkgYSBiIgorICAgICAgICAgICAgICAgICAgICJ1ZyBpbiAnZnJhbWVzYycuXG4iKSwgcEZmLT5zaWcpOworICAgICAgICAgICAgICAgICAgIHJldHVybiBET1QxMUZfSU5URVJOQUxfRVJST1I7CisgICAgICAgICAgIH0KKworICAgICAgICBwQnVmUmVtYWluaW5nICs9IGxlbjsKKyAgICAgICAgbkJ1ZlJlbWFpbmluZyAtPSBsZW47CisgICAgICAgICpwbkNvbnN1bWVkICAgKz0gbGVuOworICAgIH0KKworICAgICsrcEllOworCisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKKworfQorCitzdGF0aWMgdEFOSV9VMzIgUGFja1RsdkNvcmUodHBBbmlTaXJHbG9iYWwgcEN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgIG5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcG5Db25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRUTFZEZWZuICBUTFZzW10sCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAqcGlkeCkKK3sKKyAgICBjb25zdCB0VExWRGVmbiAqcFRsdjsKKyAgICB0RlJBTUVTX0JPT0wgICAqcGZGb3VuZDsKKyAgICB0QU5JX1U4ICAgICpwQnVmUmVtYWluaW5nOworICAgIHRBTklfVTMyICAgbkJ1ZlJlbWFpbmluZywgc3RhdHVzLCBsZW47CisKKyAgICBET1QxMUZfUEFSQU1FVEVSX0NIRUNLMihwU3JjLCBwQnVmLCBuQnVmLCBwbkNvbnN1bWVkKTsKKworICAgICh2b2lkKXBDdHg7CisgICAgc3RhdHVzID0gRE9UMTFGX1BBUlNFX1NVQ0NFU1M7CisgICAgcEJ1ZlJlbWFpbmluZyA9IHBCdWY7CisgICAgbkJ1ZlJlbWFpbmluZyA9IG5CdWY7CisKKyAgICBwVGx2ID0gJiggVExWc1swXSApOworICAgIHdoaWxlICggMHhmZmZmICE9IHBUbHYtPmlkICkKKyAgICB7CisgICAgICAgIHBmRm91bmQgPSAodEZSQU1FU19CT09MKikocFNyYyArIHBUbHYtPm9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRsdi0+cHJlc2VuY2VPZmZzZXQpOworICAgICAgICBpZiAoICpwZkZvdW5kICYmIHBUbHYtPm1pblNpemUgPiBuQnVmUmVtYWluaW5nICkKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUVTX0xPRzMocEN0eCwgRlJMT0dFLCBGUkZMKCJUaGUgVExWICVzIHRha2VzIGF0IGxlYXN0IgorICAgICAgICAgICAgICAgICIgJWQgYnl0ZXMsIGJ1dCB0aGVyZSBhcmUgb25seSAlZCBsZWZ0IGluIHRoZSBidWZmZXIuIgorICAgICAgICAgICAgICAgICJcbiIpLCBwVGx2LT5uYW1lLCBwVGx2LT5taW5TaXplLCBuQnVmUmVtYWluaW5nKTsKKyAgICAgICAgICAgIHJldHVybiBET1QxMUZfQlVGRkVSX09WRVJGTE9XOworICAgICAgICB9CisKKyAgICAgICAgbGVuID0gMFU7CisKKyAgICAgICAgaWYgKCAqcGZGb3VuZCApIHsKKyAgICAgICAgc3dpdGNoICggcFRsdi0+c2lnICkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2QXV0aG9yaXplZE1BQ3M6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja1RsdkF1dGhvcml6ZWRNQUNzKHBDdHgsICggdERvdDExZlRMVkF1dGhvcml6ZWRNQUNzKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZSZXF1ZXN0VG9FbnJvbGw6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja1RsdlJlcXVlc3RUb0Vucm9sbChwQ3R4LCAoIHREb3QxMWZUTFZSZXF1ZXN0VG9FbnJvbGwqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlZlcnNpb24yOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZWZXJzaW9uMihwQ3R4LCAoIHREb3QxMWZUTFZWZXJzaW9uMiogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2QVBTZXR1cExvY2tlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2QVBTZXR1cExvY2tlZChwQ3R4LCAoIHREb3QxMWZUTFZBUFNldHVwTG9ja2VkKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZBc3NvY2lhdGlvblN0YXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZBc3NvY2lhdGlvblN0YXRlKHBDdHgsICggdERvdDExZlRMVkFzc29jaWF0aW9uU3RhdGUqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkNoYW5uZWxMaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZDaGFubmVsTGlzdChwQ3R4LCAoIHREb3QxMWZUTFZDaGFubmVsTGlzdCogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2Q29uZmlnTWV0aG9kczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2Q29uZmlnTWV0aG9kcyhwQ3R4LCAoIHREb3QxMWZUTFZDb25maWdNZXRob2RzKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZDb25maWd1cmF0aW9uRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja1RsdkNvbmZpZ3VyYXRpb25FcnJvcihwQ3R4LCAoIHREb3QxMWZUTFZDb25maWd1cmF0aW9uRXJyb3IqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkNvbmZpZ3VyYXRpb25UaW1lb3V0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZDb25maWd1cmF0aW9uVGltZW91dChwQ3R4LCAoIHREb3QxMWZUTFZDb25maWd1cmF0aW9uVGltZW91dCogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2RGV2aWNlTmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2RGV2aWNlTmFtZShwQ3R4LCAoIHREb3QxMWZUTFZEZXZpY2VOYW1lKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZEZXZpY2VQYXNzd29yZElEOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZEZXZpY2VQYXNzd29yZElEKHBDdHgsICggdERvdDExZlRMVkRldmljZVBhc3N3b3JkSUQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdkV4dGVuZGVkTGlzdGVuVGltaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZFeHRlbmRlZExpc3RlblRpbWluZyhwQ3R4LCAoIHREb3QxMWZUTFZFeHRlbmRlZExpc3RlblRpbWluZyogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2R09JbnRlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja1RsdkdPSW50ZW50KHBDdHgsICggdERvdDExZlRMVkdPSW50ZW50KiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3M6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja1RsdkludGVuZGVkUDJQSW50ZXJmYWNlQWRkcmVzcyhwQ3R4LCAoIHREb3QxMWZUTFZJbnRlbmRlZFAyUEludGVyZmFjZUFkZHJlc3MqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1Rsdkludml0YXRpb25GbGFnczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2SW52aXRhdGlvbkZsYWdzKHBDdHgsICggdERvdDExZlRMVkludml0YXRpb25GbGFncyogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2TGlzdGVuQ2hhbm5lbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2TGlzdGVuQ2hhbm5lbChwQ3R4LCAoIHREb3QxMWZUTFZMaXN0ZW5DaGFubmVsKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZNYW51ZmFjdHVyZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja1Rsdk1hbnVmYWN0dXJlcihwQ3R4LCAoIHREb3QxMWZUTFZNYW51ZmFjdHVyZXIqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1Rsdk1pbm9yUmVhc29uQ29kZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2TWlub3JSZWFzb25Db2RlKHBDdHgsICggdERvdDExZlRMVk1pbm9yUmVhc29uQ29kZSogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2TW9kZWxOYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZNb2RlbE5hbWUocEN0eCwgKCB0RG90MTFmVExWTW9kZWxOYW1lKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZNb2RlbE51bWJlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2TW9kZWxOdW1iZXIocEN0eCwgKCB0RG90MTFmVExWTW9kZWxOdW1iZXIqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1Rsdk5vdGljZU9mQWJzZW5jZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2Tm90aWNlT2ZBYnNlbmNlKHBDdHgsICggdERvdDExZlRMVk5vdGljZU9mQWJzZW5jZSogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2T3BlcmF0aW5nQ2hhbm5lbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2T3BlcmF0aW5nQ2hhbm5lbChwQ3R4LCAoIHREb3QxMWZUTFZPcGVyYXRpbmdDaGFubmVsKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZQMlBDYXBhYmlsaXR5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZQMlBDYXBhYmlsaXR5KHBDdHgsICggdERvdDExZlRMVlAyUENhcGFiaWxpdHkqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlAyUERldmljZUlkOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZQMlBEZXZpY2VJZChwQ3R4LCAoIHREb3QxMWZUTFZQMlBEZXZpY2VJZCogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UDJQRGV2aWNlSW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2UDJQRGV2aWNlSW5mbyhwQ3R4LCAoIHREb3QxMWZUTFZQMlBEZXZpY2VJbmZvKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZQMlBHcm91cEJzc2lkOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZQMlBHcm91cEJzc2lkKHBDdHgsICggdERvdDExZlRMVlAyUEdyb3VwQnNzaWQqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlAyUEdyb3VwSWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja1RsdlAyUEdyb3VwSWQocEN0eCwgKCB0RG90MTFmVExWUDJQR3JvdXBJZCogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UDJQR3JvdXBJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZQMlBHcm91cEluZm8ocEN0eCwgKCB0RG90MTFmVExWUDJQR3JvdXBJbmZvKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZQMlBTdGF0dXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja1RsdlAyUFN0YXR1cyhwQ3R4LCAoIHREb3QxMWZUTFZQMlBTdGF0dXMqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlByaW1hcnlEZXZpY2VUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZQcmltYXJ5RGV2aWNlVHlwZShwQ3R4LCAoIHREb3QxMWZUTFZQcmltYXJ5RGV2aWNlVHlwZSogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UkZCYW5kczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2UkZCYW5kcyhwQ3R4LCAoIHREb3QxMWZUTFZSRkJhbmRzKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZSZXF1ZXN0RGV2aWNlVHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2UmVxdWVzdERldmljZVR5cGUocEN0eCwgKCB0RG90MTFmVExWUmVxdWVzdERldmljZVR5cGUqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlJlcXVlc3RUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZSZXF1ZXN0VHlwZShwQ3R4LCAoIHREb3QxMWZUTFZSZXF1ZXN0VHlwZSogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UmVzcG9uc2VUeXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZSZXNwb25zZVR5cGUocEN0eCwgKCB0RG90MTFmVExWUmVzcG9uc2VUeXBlKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZTZWxlY3RlZFJlZ2lzdHJhcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2U2VsZWN0ZWRSZWdpc3RyYXIocEN0eCwgKCB0RG90MTFmVExWU2VsZWN0ZWRSZWdpc3RyYXIqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzKHBDdHgsICggdERvdDExZlRMVlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcyogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2U2VyaWFsTnVtYmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZTZXJpYWxOdW1iZXIocEN0eCwgKCB0RG90MTFmVExWU2VyaWFsTnVtYmVyKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZVVUlEX0U6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgfD0gZG90MTFmUGFja1RsdlVVSURfRShwQ3R4LCAoIHREb3QxMWZUTFZVVUlEX0UqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdlVVSURfUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyB8PSBkb3QxMWZQYWNrVGx2VVVJRF9SKHBDdHgsICggdERvdDExZlRMVlVVSURfUiogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2VmVuZG9yRXh0ZW5zaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZWZW5kb3JFeHRlbnNpb24ocEN0eCwgKCB0RG90MTFmVExWVmVuZG9yRXh0ZW5zaW9uKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZWZXJzaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZWZXJzaW9uKHBDdHgsICggdERvdDExZlRMVlZlcnNpb24qICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNpZ1RsdldQU1N0YXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZXUFNTdGF0ZShwQ3R4LCAoIHREb3QxMWZUTFZXUFNTdGF0ZSogKShwU3JjICsgcFRsdi0+b2Zmc2V0KSwgcEJ1ZlJlbWFpbmluZywgbkJ1ZlJlbWFpbmluZywgJmxlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2lnVGx2UDJQSW50ZXJmYWNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZQMlBJbnRlcmZhY2UocEN0eCwgKCB0RG90MTFmVExWUDJQSW50ZXJmYWNlKiApKHBTcmMgKyBwVGx2LT5vZmZzZXQpLCBwQnVmUmVtYWluaW5nLCBuQnVmUmVtYWluaW5nLCAmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTaWdUbHZQMlBNYW5hZ2VhYmlsaXR5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIHw9IGRvdDExZlBhY2tUbHZQMlBNYW5hZ2VhYmlsaXR5KHBDdHgsICggdERvdDExZlRMVlAyUE1hbmFnZWFiaWxpdHkqICkocFNyYyArIHBUbHYtPm9mZnNldCksIHBCdWZSZW1haW5pbmcsIG5CdWZSZW1haW5pbmcsICZsZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEZSQU1FU19MT0cxKHBDdHgsIEZSTE9HRSwgRlJGTCgiSU5URVJOQUwgRVJST1ItLSBJIGRvbid0ICIKKyAgICAgICAgICAgICAgICAia25vdyBhYm91dCB0aGUgVExWICVkOyB0aGlzIGlzIG1vc3QgbGlrZWx5IGEgYnVnIGluICIKKyAgICAgICAgICAgICAgICAiJ2ZyYW1lc2MnLlxuIiksIHBUbHYtPnNpZyk7CisgICAgICAgICAgICByZXR1cm4gRE9UMTFGX0lOVEVSTkFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgfSAvKiBFbmQgaWYgb24gKnBmRm91bmQgKi8KKyAgICAgICAgcEJ1ZlJlbWFpbmluZyArPSBsZW47CisgICAgICAgIG5CdWZSZW1haW5pbmcgLT0gbGVuOworICAgICAgICAqcG5Db25zdW1lZCAgICs9IGxlbjsKKyAgICAgICAgKytwVGx2OworICAgICAgICBpZihsZW4pICsrKnBpZHg7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKKworfQpkaWZmIC0tZ2l0IGEvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9zcmMvbG9nQXBpLmMgYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3V0aWxzL3NyYy9sb2dBcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGU5ZmQzCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9zcmMvbG9nQXBpLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIGxvZ0FwaS5jYyAtIEhhbmRsZXMgbG9nIG1lc3NhZ2VzIGZvciBhbGwgdGhlIG1vZHVsZXMuCisgKiBBdXRob3I6ICAgICAgICBLZXZpbiBOZ3V5ZW4gICAgCisgKiBEYXRlOiAgICAgICAgICAwMi8yNy8wMgorICogSGlzdG9yeTotCisgKiAwMi8xMS8wMiAgICAgICBDcmVhdGVkLgorICogMDMvMTIvMDIgICAgICAgUmVhcnJhbmdlIGxvZ0RlYnVnIHBhcmFtZXRlciBsaXN0IGFuZCBhZGQgbW9yZSBwYXJhbXMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKi8KKyNkZWZpbmUgV05JX1BSSU5UX0RFQlVHCisKKyNpbmNsdWRlIDxzaXJDb21tb24uaD4KKyNpbmNsdWRlIDxzaXJEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzQXBpLmg+CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DKQorI2luY2x1ZGUgPGhhbENvbW1vbkFwaS5oPgorI2VuZGlmCisjaW5jbHVkZSA8d2xhbl9xY3Rfd2RhLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJzaXJXcmFwcGVyLmgiCisjaW5jbHVkZSAidXRpbHNHbG9iYWwuaCIKKyNpbmNsdWRlICJtYWNJbml0QXBpLmgiCisjaW5jbHVkZSAicGFsQXBpLmgiCisKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKworI2lmZGVmIEFOSV9PU19UWVBFX0FORFJPSUQKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNlbmRpZgorCisKKy8vVGhpcyBpcyBub3QgcmlnaHQgaGVyZS4gTmVlZCB0byBmaW5kIGEgYmV0dGVyIHBsYWNlLiAKKy8vX3ZzbnByaW50ZiBpcyBhIGZ1bmN0aW9uIGluIFdpbmRvd3MKKy8vVGVtcG9yYXJ5IHdvcmthcm91bmQuCisjaWZuZGVmIEFOSV9PU19UWVBFX1dJTkRPV1MKKyNpZm5kZWYgX3ZzbnByaW50ZgorI2RlZmluZSBfdnNucHJpbnRmIHZzbnByaW50ZgorI2VuZGlmCisjZW5kaWYgLy8gbm90IFdpbmRvd3MKKworI2RlZmluZSBkYmdUcmFjZUluZm8oX01hc2ssIF9JblBhcmFtcykgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLZFByaW50IChfSW5QYXJhbXMpIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSB1dGlsTG9nTG9nRGVidWdNZXNzYWdlKEhkZEFkYXB0ZXIsIF9Mb2dCdWZmZXIpICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sICAgXAorICAgICAgICAgICAgICBfTG9nQnVmZmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisgIAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogbG9nSW5pdCgpIAorICoKKyAqIEZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJlcGFyZSB0aGUgbG9nZ2luZyB1dGlsaXR5LgorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOgorICogTm9uZS4KKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSB0cEFuaVNpckdsb2JhbCBTaXJpdXMgc29mdHdhcmUgcGFyYW1ldGVyIHN0cnVjdXRyZSBwb2ludGVyCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordFNpclJldFN0YXR1cyAKK2xvZ0luaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICB0QU5JX1UzMiAgICBpOworCisgICAgLy8gQWRkIGNvZGUgdG8gaW5pdGlhbGl6ZSBkZWJ1ZyBsZXZlbCBmcm9tIENGRyBtb2R1bGUKKyAgICAvLyBGb3Igbm93LCBlbmFibGUgYWxsIGxvZ2dpbmcKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9HX0VOVFJZX05VTTsgaSsrKQorICAgIHsKKyNpZmRlZiBTSVJfREVCVUcKKyAgICAgICAgcE1hYy0+dXRpbHMuZ0xvZ0V2dExldmVsW2ldID0gcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW2ldID0gTE9HMTsKKyNlbHNlCisjaWZkZWYgTFg1MjgwCisgICAgICAgIHBNYWMtPnV0aWxzLmdMb2dFdnRMZXZlbFtpXSA9IHBNYWMtPnV0aWxzLmdMb2dEYmdMZXZlbFtpXSA9IExPR0U7CisjZWxzZQorICAgICAgICBwTWFjLT51dGlscy5nTG9nRXZ0TGV2ZWxbaV0gPSBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbaV0gPSBMT0dXOworI2VuZGlmCisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvKioqIGxvZ0luaXQoKSAqKiovCisKK3ZvaWQKK2xvZ0RlaW5pdCh0cEFuaVNpckdsb2JhbCBwTWFjKQoreworICAgIHJldHVybjsKK30KKworLyoqCisgKiBsb2dEYmcoKSAKKyAqCisgKkZVTkNUSU9OOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gbG9nIGEgZGVidWcgbWVzc2FnZS4KKyAqCisgKlBBUkFNUzoKKyAqCisgKkxPR0lDOgorICoKKyAqQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqTk9URToKKyAqCisgKiBAcGFyYW0gdHBBbmlTaXJHbG9iYWwgU2lyaXVzIHNvZnR3YXJlIHBhcmFtZXRlciBzdHJ1Y3V0cmUgcG9pbnRlcgorICogQHBhcmFtIE1vZElkICAgICAgICA4LWJpdCBtb2RJRAorICogQHBhcmFtIGRlYnVnTGV2ZWwgICBkZWJ1Z2dpbmcgbGV2ZWwgZm9yIHRoaXMgbWVzc2FnZQorICogQHBhcmFtIHBTdHIgICAgICAgICBzdHJpbmcgcGFyYW1ldGVyIHBvaW50ZXIKKyAqIEByZXR1cm4gTm9uZQorICovCisKKyNpZiBkZWZpbmVkKEFOSV9PU19UWVBFX09TWCkKKyNpZiBkZWZpbmVkIEFOSV9GSVJFV0lSRV9MT0cKKyNpbmNsdWRlIDxJT0tpdC9maXJld2lyZS9GaXJlTG9nLmg+CisjZGVmaW5lIHByaW50ayAgICAgICAgICBGaXJlTG9nCisjZWxzZQorI2RlZmluZSBwcmludGsgICAgICAgICAgcHJpbnRmCisjZW5kaWYKKyNkZWZpbmUgdHhfdGltZV9nZXQoKSAgICgwKQorI2VuZGlmCisKK3ZvaWQgbG9nRGJnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggbW9kSWQsIHRBTklfVTMyIGRlYnVnTGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHIsLi4uKQoreworI2lmZGVmIFdMQU5fREVCVUcKKyAgICBpZiAoIGRlYnVnTGV2ZWwgPiBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbTE9HX0lOREVYX0ZPUl9NT0RVTEUoIG1vZElkICldICkKKyAgICAgICAgcmV0dXJuOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZhX2xpc3QgbWFya2VyOworCisgICAgICAgIHZhX3N0YXJ0KCBtYXJrZXIsIHBTdHIgKTsgICAgIC8qIEluaXRpYWxpemUgdmFyaWFibGUgYXJndW1lbnRzLiAqLworCisgICAgICAgIGxvZ0RlYnVnKHBNYWMsIG1vZElkLCBkZWJ1Z0xldmVsLCBwU3RyLCBtYXJrZXIpOworICAgICAgICAKKyAgICAgICAgdmFfZW5kKCBtYXJrZXIgKTsgICAgICAgICAgICAgIC8qIFJlc2V0IHZhcmlhYmxlIGFyZ3VtZW50cy4gICAgICAqLworICAgIH0gICAgICAKKyNlbmRpZgorfQorCisjaWZkZWYgVk9TU19FTkFCTEVECitzdGF0aWMgaW5saW5lIFZPU19UUkFDRV9MRVZFTCBnZXRWb3NEZWJ1Z0xldmVsKHRBTklfVTMyIGRlYnVnTGV2ZWwpCit7ICAgCisgICAgc3dpdGNoKGRlYnVnTGV2ZWwpCisgICAgeworICAgICAgICBjYXNlIExPR1A6CisgICAgICAgICAgICByZXR1cm4gVk9TX1RSQUNFX0xFVkVMX0ZBVEFMOworICAgICAgICBjYXNlIExPR0U6CisgICAgICAgICAgICByZXR1cm4gVk9TX1RSQUNFX0xFVkVMX0VSUk9SOworICAgICAgICBjYXNlIExPR1c6CisgICAgICAgICAgICByZXR1cm4gVk9TX1RSQUNFX0xFVkVMX1dBUk47CisgICAgICAgIGNhc2UgTE9HNDoKKyAgICAgICAgICAgIHJldHVybiBWT1NfVFJBQ0VfTEVWRUxfSU5GTzsKKyAgICAgICAgY2FzZSBMT0czOgorICAgICAgICAgICAgcmV0dXJuIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0g7CisgICAgICAgIGNhc2UgTE9HMjoKKyAgICAgICAgICAgIHJldHVybiBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQ7CisgICAgICAgIGNhc2UgTE9HMToKKyAgICAgICAgICAgIHJldHVybiBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1c7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBWT1NfTU9EVUxFX0lEIGdldFZvc01vZHVsZUlkKHRBTklfVTggbW9kSWQpCit7CisgICAgc3dpdGNoKG1vZElkKQorICAgIHsKKyAgICAgICAgY2FzZSBTSVJfSEFMX01PRFVMRV9JRDoKKyAgICAgICAgY2FzZSBTSVJfUEhZX01PRFVMRV9JRDoKKyAgICAgICAgICAgIHJldHVybiBWT1NfTU9EVUxFX0lEX1dEQTsKKworICAgICAgICBjYXNlIFNJUl9MSU1fTU9EVUxFX0lEOgorICAgICAgICBjYXNlIFNJUl9TQ0hfTU9EVUxFX0lEOgorICAgICAgICBjYXNlIFNJUl9QTU1fTU9EVUxFX0lEOgorICAgICAgICBjYXNlIFNJUl9DRkdfTU9EVUxFX0lEOgorICAgICAgICBjYXNlIFNJUl9NTlRfTU9EVUxFX0lEOgorICAgICAgICBjYXNlIFNJUl9EUEhfTU9EVUxFX0lEOgorICAgICAgICBjYXNlIFNJUl9EQkdfTU9EVUxFX0lEOgorICAgICAgICAgICAgcmV0dXJuIFZPU19NT0RVTEVfSURfUEU7CisKKyAgICAgICAgY2FzZSBTSVJfU1lTX01PRFVMRV9JRDoKKyAgICAgICAgICAgIHJldHVybiBWT1NfTU9EVUxFX0lEX1NZUzsKKyAgICAKKyAgICAgICAgY2FzZSBTSVJfU01TX01PRFVMRV9JRDoKKyAgICAgICAgICAgIHJldHVybiBWT1NfTU9EVUxFX0lEX1NNRTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFZPU19NT0RVTEVfSURfU1lTOworICAgIH0KK30KKyNlbmRpZiAvLyBWT1NTX0VOQUJMRUQKKworI2RlZmluZSBMT0dfU0laRSAyNTYKK3ZvaWQgbG9nRGVidWcodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBtb2RJZCwgdEFOSV9VMzIgZGVidWdMZXZlbCwgY29uc3QgY2hhciAqcFN0ciwgdmFfbGlzdCBtYXJrZXIpCit7CisgICAgVk9TX1RSQUNFX0xFVkVMICB2b3NEZWJ1Z0xldmVsOworICAgIFZPU19NT0RVTEVfSUQgICAgdm9zTW9kdWxlSWQ7CisgICAgY2hhciAgICAgICAgICAgICBsb2dCdWZmZXJbTE9HX1NJWkVdOworCisgICAgdm9zRGVidWdMZXZlbCA9IGdldFZvc0RlYnVnTGV2ZWwoZGVidWdMZXZlbCk7CisgICAgdm9zTW9kdWxlSWQgPSBnZXRWb3NNb2R1bGVJZChtb2RJZCk7CisKKyNpZmRlZiBBTklfT1NfVFlQRV9BTkRST0lECisgICAgdnNucHJpbnRmKGxvZ0J1ZmZlciwgTE9HX1NJWkUgLSAxLCBwU3RyLCBtYXJrZXIpOworI2Vsc2UKKworI2lmZGVmIFdJTkRPV1NfRFQKKyAgICBSdGxTdHJpbmdDYlZQcmludGZBKCAmbG9nQnVmZmVyWyAwIF0sIExPR19TSVpFIC0gMSwgcFN0ciwgbWFya2VyICk7CisjZWxzZQorICAgIF92c25wcmludGYobG9nQnVmZmVyLCBMT0dfU0laRSAtIDEsIChjaGFyICopcFN0ciwgbWFya2VyKTsKKyNlbmRpZgorCisjZW5kaWYKKyAgICBWT1NfVFJBQ0Uodm9zTW9kdWxlSWQsIHZvc0RlYnVnTGV2ZWwsICIlcyIsIGxvZ0J1ZmZlcik7CisKKyAgICAvLyBUaGUgY2FsbGVyIG11c3QgY2hlY2sgbG9nbGV2ZWwKKyAgICBWT1NfQVNTRVJUKCAoIGRlYnVnTGV2ZWwgPD0gcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW0xPR19JTkRFWF9GT1JfTU9EVUxFKCBtb2RJZCApXSApICYmICggTE9HUCAhPSBkZWJ1Z0xldmVsICkgKTsKK30gLyoqKiBlbmQgbG9nRGVidWcoKSAqKiovCmRpZmYgLS1naXQgYS9DT1JFL1NZUy9sZWdhY3kvc3JjL3V0aWxzL3NyYy9sb2dEdW1wLmMgYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3V0aWxzL3NyYy9sb2dEdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxMDk0NAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvdXRpbHMvc3JjL2xvZ0R1bXAuYwpAQCAtMCwwICsxLDczMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29weXJpZ2h0IChjKSAyMDA3IFFVQUxDT01NIEluY29ycG9yYXRlZC4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCitRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5CisKK2xvZ0R1bXAuYworKi8KKworLyoKKyAqIFdvb2RzaWRlIE5ldHdvcmtzLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGR1bXAgdmFyaW91cworICogTUFDIHN0YXRlcyBhbmQgdG8gZW5hYmxlL2Rpc2FibGUgY2VydGFpbiBmZWF0dXJlcyBkdXJpbmcKKyAqIGRlYnVnZ2luZy4KKyAqIEF1dGhvcjogICAgICAgIFNhbmRlc2ggR29lbAorICogRGF0ZTogICAgICAgICAgMDIvMjcvMDIKKyAqIEhpc3Rvcnk6LQorICogMDIvMTEvMDIgICAgICAgQ3JlYXRlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKy8qIAorICogQG5vdGUgOiBCeXRlcyBpcyB0byBwcmludCBvdmVyZmxvdyBtZXNzYWdlIGluZm9ybWF0aW9uLgorICovCisKKyNpbmNsdWRlICJwYWxUeXBlcy5oIgorCisjaWZkZWYgQU5JX0xPR0RVTVAKKworI2RlZmluZSBNQVhfT1ZFUkZMT1dfTVNHICAgIDQwMAorI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfV0lORE9XUykKKyNkZWZpbmUgTUFYX0xPR0RVTVBfU0laRSAgICAoKDQqMTAyNCkgLSBNQVhfT1ZFUkZMT1dfTVNHKQorI2Vsc2UKKyNkZWZpbmUgTUFYX0xPR0RVTVBfU0laRSAgICAoKDQqMTAyNCkgLSBNQVhfT1ZFUkZMT1dfTVNHKQorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAiaGFsRGVidWcuaCIKKyNpbmNsdWRlICJoYWxJbnRlcnJ1cHRzLmgiCisjZW5kaWYKKyNpZiBkZWZpbmVkIChBTklfT1NfVFlQRV9MSU5VWCkKKworI2luY2x1ZGUgPHN5c0RlYnVnLmg+CisKKyNlbGlmIGRlZmluZWQoQU5JX09TX1RZUEVfV0lORE9XUykKKworI2luY2x1ZGUgInN0ZGFyZy5oIgorI2luY2x1ZGUgInNpclR5cGVzLmgiCisKKworI2lmZGVmIEFOSV9EVlRfREVCVUcKKyNpbmNsdWRlICJkdnRNb2R1bGVBcGkuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicG1tQXBpLmgiCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbEludGVybmFsLmgiCisjZW5kaWYKKyNpbmNsdWRlICJjc3JBcGkuaCIKKworI2VsaWYgZGVmaW5lZChBTklfT1NfVFlQRV9PU1gpCisKKyNpbmNsdWRlICJzdGRhcmcuaCIKKworI2VsaWYgZGVmaW5lZChBTklfT1NfVFlQRV9BTVNTKQorCisjaW5jbHVkZSAiY29tZGVmLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisKKyNpbmNsdWRlICJBRUVzdGQuaCIKKworI2luY2x1ZGUgInNpclR5cGVzLmgiCisjaW5jbHVkZSAiaGFsSW50ZXJydXB0cy5oIgorCisjaW5jbHVkZSAicG1tQXBpLmgiCisjaW5jbHVkZSAiaGFsSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjc3JBcGkuaCIKKworI2VsaWYgZGVmaW5lZChBTklfT1NfVFlQRV9BTkRST0lEKQorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNlbmRpZgorCisKKyNpbmNsdWRlICJwYWxBcGkuaCIKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKyNpbmNsdWRlICJzaXJDb21tb24uaCIKKyNpbmNsdWRlIDxzaXJEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzQXBpLmg+CisKKyNpbmNsdWRlIDxsaW1BcGkuaD4KKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSA8aGFsQ29tbW9uQXBpLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjZmdBcGkuaD4KKyNpbmNsdWRlIDx1dGlsc0dsb2JhbC5oPgorI2luY2x1ZGUgPGRwaEdsb2JhbC5oPgorI2luY2x1ZGUgPGxpbUdsb2JhbC5oPgorI2luY2x1ZGUgImxpbVV0aWxzLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiCisKKyNpbmNsdWRlICJwbW1BcGkuaCIKKyNpbmNsdWRlICJsaW1TZXJEZXNVdGlscy5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxMb2dEdW1wLmgiCisvLyNpbmNsdWRlICJ0ZXN0SGFsTXNnQXBpLmgiCisjaW5jbHVkZSAiaGFsTWFpbGJveC5oIgorI2luY2x1ZGUgImhhbFJ4cC5oIgorI2luY2x1ZGUgImhhbE1UVS5oIgorI2luY2x1ZGUgImhhbFBoeUFwaS5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltQXNzb2NVdGlscy5oIgorI2luY2x1ZGUgImxpbVNlbmRNZXNzYWdlcy5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxVdGlscy5oIgorI2VuZGlmCisjaW5jbHVkZSAibGltU2VjdXJpdHlVdGlscy5oIgorLy8jaW5jbHVkZSAiaGFsUmFkYXIuaCIKKyNpbmNsdWRlICJsb2dEdW1wLmgiCisjaW5jbHVkZSAic3lzRGVidWcuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGEuaCIKKworI2RlZmluZSBIQUxfTE9HX0RVTVBfQ01EX1NUQVJUIDAKKyNkZWZpbmUgSEFMX0xPR19EVU1QX0NNRF9FTkQgMjk5CisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworCisgICAgdm9pZAorbG9nUHJpbnRmKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGNtZCwgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCkKK3sKKyAgICBzdGF0aWMgdEFOSV9VOCBidWZbTUFYX0xPR0RVTVBfU0laRSArIE1BWF9PVkVSRkxPV19NU0ddOworICAgIHRBTklfVTE2IGJ1ZkxlbjsKKyAgICBwTWFjLT5nQ3VycmVudExvZ1NpemUgPSAwOworCisgICAgYnVmTGVuID0gKHRBTklfVTE2KWxvZ1J0YWlEdW1wKHBNYWMsIGNtZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYnVmKTsKK30KKworLyoqCisgIEBicmllZjogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIEFnZ3JlZ2F0ZSB0aGUgZm9ybWF0ZWQgYnVmZmVyLCB0aGlzCisgIGFsc28gY2hlY2sgdGhlIG92ZXJmbG93IGNvbmRpdGlvbiBhbmQgYWRkcyB0aGUgb3ZlcmZsb3cgbWVzc2FnZQorICB0byB0aGUgZW5kIG9mIHRoZSBsb2cgRHVtcCBidWZmZXIgcmVzZXJ2ZWQgb2YgTUFYX09WRVJGTE9XX01TRyBzaXplLgorICBAcGFyYW06IHRwQW5pU2lyR2xvYmFsIHBNYWMKKyAgQHBhcmFtOiBjaGFyICpwQnVmCisgIEBwYXJhbTogdmFyaWFibGUgYXJndW1lbnRzLi4uCisgIEByZXR1cm46IFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhZGRlZCB0byB0aGUgYnVmZmVyLgorICBSZXR1cm5zIDAgaW5jYXNlIG9mIG92ZXJmbG93LgorCisgIEBub3RlOiBDdXJyZW50bHkgaW4gd2luZG93cyB3ZSBkbyBub3QgcHJpbnQgdGhlIEFnZ3JlZ2F0ZWQgYnVmZmVyIGFzIHRoZXJlCisgIGlzIGEgbGltaXRhdGlvbiBvbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIGRpc3BsYXllZCBieSBEYmdQcmludAorICBTbyB3ZSBwcmludCB0aGUgYnVmZmVyIGltbWVkaWF0ZWx5IGFuZCB3ZSB3b3VsZCBhbHNvIGFnZ3JlZ2F0ZSB3aGVyZQorICB0aGUgVGVzdERiZyBtaWdodCB1c2UgdGhpcyBidWZmZXIgdG8gcHJpbnQgb3V0IGF0IHRoZSBhcHBsaWNhdGlvbiBsZXZlbC4KKyAgKi8KK2ludCBsb2dfc3ByaW50Zih0cEFuaVNpckdsb2JhbCBwTWFjLCBjaGFyICpwQnVmLCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB0QU5JX1MzMiByZXQgPSAwOworI2lmZGVmIFdMQU5fREVCVUcKKworI2lmIGRlZmluZWQoQU5JX09TX1RZUEVfQU1TUykKKyAgICBBRUVWYUxpc3QgYXJnczsKKyAgICBBRUVWQV9TVEFSVChhcmdzLCBmbXQpOworI2Vsc2UKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyNlbmRpZgorCisgICAgaWYgKHBNYWMtPmdDdXJyZW50TG9nU2l6ZSA+PSBNQVhfTE9HRFVNUF9TSVpFKQorICAgICAgICByZXR1cm4gMDsKKworI2lmIGRlZmluZWQgKEFOSV9PU19UWVBFX1dJTkRPV1MpCisgICAgcmV0ID0gX3ZzbnByaW50ZihwQnVmLCAoTUFYX0xPR0RVTVBfU0laRSAtIHBNYWMtPmdDdXJyZW50TG9nU2l6ZSksIGZtdCwgYXJncyk7CisjZWxpZiAoZGVmaW5lZCAoQU5JX09TX1RZUEVfTElOVVgpIHx8IGRlZmluZWQgKEFOSV9PU19UWVBFX0FORFJPSUQpKQorICAgIHJldCA9IHZzbnByaW50ZihwQnVmLCAoTUFYX0xPR0RVTVBfU0laRSAtIHBNYWMtPmdDdXJyZW50TG9nU2l6ZSksIGZtdCwgYXJncyk7CisjZWxpZiBkZWZpbmVkIChBTklfT1NfVFlQRV9PU1gpCisgICAgcmV0ID0gdnNucHJpbnRmKHBCdWYsIChNQVhfTE9HRFVNUF9TSVpFIC0gcE1hYy0+Z0N1cnJlbnRMb2dTaXplKSwgZm10LCBhcmdzKTsKKyAgICAvKiBCU0Qga2VybmVsIGhhcyBhIGJ1ZyB0aGF0IHZzbnByaW50ZigpIGFsd2F5cyByZXR1cm4gMC4KKyAgICAgKiBTZWUgYnNkL2tlcm4vc3Vicl9wcmYuYyAKKyAgICAgKiBOZWVkIHRvIHZlcmlmeSAuLi4KKyAgICAgKi8KKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIHJldCA9IHN0cmxlbihwQnVmKTsKKyNlbGlmIGRlZmluZWQgKEFOSV9PU19UWVBFX0FNU1MpCisgICAgcmV0ID0gc3RkX3ZzdHJscHJpbnRmKHBCdWYsIChNQVhfTE9HRFVNUF9TSVpFIC0gcE1hYy0+Z0N1cnJlbnRMb2dTaXplKSwgZm10LCBhcmdzKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChBTklfT1NfVFlQRV9BTVNTKQorICAgIEFFRVZBX0VORChhcmdzKTsKKyNlbHNlCisgICAgdmFfZW5kKGFyZ3MpOworI2VuZGlmCisKKyAgICAvKiBJZiBhbiBvdXRwdXQgZXJyb3IgaXMgZW5jb3VudGVyZWQsIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQgYnkgdnNucHJpbnRmICovCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiAwOworCisKKyAgICBpZiAoKHRBTklfVTMyKSByZXQgPiAoTUFYX0xPR0RVTVBfU0laRSAtIHBNYWMtPmdDdXJyZW50TG9nU2l6ZSkpIHsKKyAgICAgICAgcEJ1ZiArPSAoTUFYX0xPR0RVTVBfU0laRSAtIHBNYWMtPmdDdXJyZW50TG9nU2l6ZSk7CisgICAgICAgIHBNYWMtPmdDdXJyZW50TG9nU2l6ZSA9IE1BWF9MT0dEVU1QX1NJWkU7CisKKyNpZiBkZWZpbmVkIChBTklfT1NfVFlQRV9XSU5ET1dTKQorICAgICAgICByZXQgPSBfc25wcmludGYocEJ1ZiwgTUFYX09WRVJGTE9XX01TRywgIlxuLT4gKioqKioqKioqKioiCisgICAgICAgICAgICAgICAgIlxuT3V0cHV0IEV4Y2VlZGVkIHRoZSBCdWZmZXIgU2l6ZSwgbWVzc2FnZSB0cnVuY2F0ZWQhIVxuPC0gKioqKioqKioqKipcbiIpOworI2VsaWYgKGRlZmluZWQgKEFOSV9PU19UWVBFX0xJTlVYKSB8fCBkZWZpbmVkIChBTklfT1NfVFlQRV9BTkRST0lEKSkKKyAgICAgICAgcmV0ID0gc25wcmludGYocEJ1ZiwgTUFYX09WRVJGTE9XX01TRywgIlxuLT4gKioqKioqKioqKioiCisgICAgICAgICAgICAgICAgIlxuT3V0cHV0IEV4Y2VlZGVkIHRoZSBCdWZmZXIgU2l6ZSwgbWVzc2FnZSB0cnVuY2F0ZWQhIVxuPC0gKioqKioqKioqKipcbiIpOworI2VsaWYgZGVmaW5lZCAoQU5JX09TX1RZUEVfT1NYKQorICAgICAgICByZXQgPSBzbnByaW50ZihwQnVmLCBNQVhfT1ZFUkZMT1dfTVNHLCAiXG4tPiAqKioqKioqKioqKiIKKyAgICAgICAgICAgICAgICAiXG5PdXRwdXQgRXhjZWVkZWQgdGhlIEJ1ZmZlciBTaXplLCBtZXNzYWdlIHRydW5jYXRlZCEhXG48LSAqKioqKioqKioqKlxuIik7CisgICAgICAgIC8qIEJTRCBrZXJuZWwgaGFzIGEgYnVnIHRoYXQgc25wcmludGYoKSBhbHdheXMgcmV0dXJuIDAuCisgICAgICAgICAqIFNlZSBic2Qva2Vybi9zdWJyX3ByZi5jIAorICAgICAgICAgKiBidXQgTkVFRCBUTyBWRVJJRlkgLi4uCisgICAgICAgICAqLworICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICByZXQgPSBzdHJsZW4ocEJ1Zik7CisjZWxpZiBkZWZpbmVkIChBTklfT1NfVFlQRV9BTVNTKQorICAgICAgICByZXQgPSBzbnByaW50ZihwQnVmLCBNQVhfT1ZFUkZMT1dfTVNHLCAiXG4tPiAqKioqKioqKioqKiIKKyAgICAgICAgICAgICAgICAiXG5PdXRwdXQgRXhjZWVkZWQgdGhlIEJ1ZmZlciBTaXplLCBtZXNzYWdlIHRydW5jYXRlZCEhXG48LSAqKioqKioqKioqKlxuIik7CisjZW5kaWYKKyAgICAgICAgLyogSWYgYW4gb3V0cHV0IGVycm9yIGlzIGVuY291bnRlcmVkLCBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJldHVybmVkIGJ5IHNucHJpbnRmICovCisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKHJldCA+IE1BWF9PVkVSRkxPV19NU0cpCisgICAgICAgICAgICByZXQgPSBNQVhfT1ZFUkZMT1dfTVNHOworICAgIH0KKworICAgIHBNYWMtPmdDdXJyZW50TG9nU2l6ZSArPSByZXQ7CisKKworI2lmIGRlZmluZWQgKEFOSV9PU19UWVBFX1dJTkRPV1MpCisgICAgLy9EYmdQcmludCgiJXMiLCBwQnVmKTsKKyAgICBzeXNMb2cocE1hYywgTE9HRSwgRkwoIiVzIiksIHBCdWYpOworI2VuZGlmCisjZW5kaWYgLy9mb3IgI2lmZGVmIFdMQU5fREVCVUcKKyAgICByZXR1cm4gcmV0OworfQorCisKK2NoYXIqIGR1bXBMT0coIHRwQW5pU2lyR2xvYmFsIHBNYWMsIGNoYXIgKnAgKQoreworICAgIHRBTklfVTMyIGk7CisKKyAgICBmb3IoIGkgPSBTSVJfRklSU1RfTU9EVUxFX0lEOyBpIDw9IFNJUl9MQVNUX01PRFVMRV9JRDsgaSsrICkgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKHBNYWMsIHAsICJbMHglMnhdIiwgaSk7CisgICAgICAgIHN3aXRjaCAoaSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTSVJfSEFMX01PRFVMRV9JRDogcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIkhBTCAiKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNJUl9DRkdfTU9EVUxFX0lEOiBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiQ0ZHICIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0lSX0xJTV9NT0RVTEVfSUQ6IHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJMSU0gIik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBTSVJfQVJRX01PRFVMRV9JRDogcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIkFSUSAiKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNJUl9TQ0hfTU9EVUxFX0lEOiBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiU0NIICIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0lSX1BNTV9NT0RVTEVfSUQ6IHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJQTU0gIik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBTSVJfTU5UX01PRFVMRV9JRDogcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIk1OVCAiKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNJUl9EQkdfTU9EVUxFX0lEOiBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiREJHICIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0lSX0RQSF9NT0RVTEVfSUQ6IHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJEUEggIik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBTSVJfU1lTX01PRFVMRV9JRDogcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlNZUyAiKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNJUl9QSFlfTU9EVUxFX0lEOiBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiUEhZICIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0lSX0RWVF9NT0RVTEVfSUQ6IHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJEVlQgIik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBTSVJfU01TX01PRFVMRV9JRDogcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlNNUyAiKTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiVU5LICIsIGkpOyBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsCisgICAgICAgICAgICAgICAgIjogZGVidWcgbGV2ZWwgaXMgWzB4JXhdICIsCisgICAgICAgICAgICAgICAgcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW2kgLSBTSVJfRklSU1RfTU9EVUxFX0lEXSk7CisKKyAgICAgICAgc3dpdGNoKCBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbaSAtIFNJUl9GSVJTVF9NT0RVTEVfSURdICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBMT0dPRkY6IHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJMT0cgZGlzYWJsZWRcbiIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTE9HUDogcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIkxPR1AoUGFuaWMgb25seSlcbiIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTE9HRTogcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIkxPR0UoRXJyb3JzIG9ubHkpXG4iKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExPR1c6IHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJMT0dXKFdhcm5pbmdzKVxuIik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBMT0cxOiBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiTE9HMShNaW5pbWFsIGRlYnVnKVxuIik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBMT0cyOiBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiTE9HMihWZXJib3NlKVxuIik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBMT0czOiBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiTE9HMyhWZXJ5IFZlcmJvc2UpXG4iKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExPRzQ6IHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJMT0c0KFZlcnkgVmVyeSBWZXJib3NlKVxuIik7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlVua25vd25cbiIpOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwOworfQorCitjaGFyKiBzZXRMT0dMZXZlbCggdHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCwgdEFOSV9VMzIgbW9kdWxlLCB0QU5JX1UzMiBsZXZlbCApCit7CisgICAgdEFOSV9VMzIgaTsKKworICAgIGlmKChtb2R1bGUgPiBTSVJfTEFTVF9NT0RVTEVfSUQgfHwgbW9kdWxlIDwgU0lSX0ZJUlNUX01PRFVMRV9JRCkgJiYgbW9kdWxlICE9IDB4ZmYgKSB7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJJbnZhbGlkIG1vZHVsZSBpZCAweCV4XG4iLCBtb2R1bGUgKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgaWYoIDB4ZmYgPT0gbW9kdWxlICkgeworICAgICAgICBmb3IoIGkgPSBTSVJfRklSU1RfTU9EVUxFX0lEOyBpIDw9IFNJUl9MQVNUX01PRFVMRV9JRDsgaSsrICkKKyAgICAgICAgICAgIHBNYWMtPnV0aWxzLmdMb2dEYmdMZXZlbFtpIC0gU0lSX0ZJUlNUX01PRFVMRV9JRF0gPSBsZXZlbDsKKyAgICB9IGVsc2UgeworICAgICAgICBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbbW9kdWxlIC0gU0lSX0ZJUlNUX01PRFVMRV9JRF0gPSBsZXZlbDsKKyAgICB9CisKKyNpZmRlZiBBTklfUEhZX0RFQlVHCisgICAgaWYgKG1vZHVsZSA9PSAweGZmIHx8IG1vZHVsZSA9PSBTSVJfUEhZX01PRFVMRV9JRCkgeworICAgICAgICBwTWFjLT5ocGh5LnBoeS5waHlEZWJ1Z0xvZ0xldmVsID0gbGV2ZWw7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gZHVtcExPRyggcE1hYywgcCApOworfQorCitzdGF0aWMgdm9pZCBMb2dfZ2V0Q2ZnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IGNmZ0lkKQoreworI2RlZmluZSBDRkdfQ1RMX0lOVCAgICAgICAgICAgMHgwMDA4MDAwMAorICAgIGlmICgocE1hYy0+Y2ZnLmdDZmdFbnRyeVtjZmdJZF0uY29udHJvbCAmIENGR19DVExfSU5UKSAhPSAwKQorICAgIHsKKyAgICAgICAgdEFOSV9VMzIgIHZhbDsKKworICAgICAgICAvLyBHZXQgaW50ZWdlciBwYXJhbWV0ZXIKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsICh0QU5JX1UxNiljZmdJZCwgJnZhbCkgIT0gZUhBTF9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgc3lzTG9nKHBNYWMsIExPR0UsIEZMKCJHZXQgY2ZnSWQgMHgleCBmYWlsZWRcbiIpLCBjZmdJZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzeXNMb2coIHBNYWMsIExPR0UsIEZMKCJXTklfQ0ZHXyVzKCVkICAweCV4KSA9ICVsZFxuIiksICBnQ2ZnUGFyYW1OYW1lW2NmZ0lkXSwgY2ZnSWQsIGNmZ0lkLCB2YWwgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0QU5JX1U4IGJ1ZltDRkdfTUFYX1NUUl9MRU5dID0gezB9IDsKKyAgICAgICAgdEFOSV9VMzIgdmFsdWVMZW4gOworCisgICAgICAgIC8vIEdldCBzdHJpbmcgcGFyYW1ldGVyCisgICAgICAgIHZhbHVlTGVuID0gQ0ZHX01BWF9TVFJfTEVOIDsKKyAgICAgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsIGNmZ0lkLCBidWYsICZ2YWx1ZUxlbikgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBzeXNMb2cocE1hYywgTE9HRSwgRkwoIkdldCBjZmdJZCAweCV4IGZhaWxlZFxuIiksIGNmZ0lkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5c0xvZyggcE1hYywgTE9HRSwgRkwoIldOSV9DRkdfJXMoJWQgIDB4JXgpIGxlbj0lbGRcbiIpLCAgZ0NmZ1BhcmFtTmFtZVtjZmdJZF0sIGNmZ0lkLCBjZmdJZCwgdmFsdWVMZW4gKTsKKyAgICAgICAgICAgIHNpckR1bXBCdWYocE1hYywgU0lSX1dEQV9NT0RVTEVfSUQsIExPR1csIGJ1ZiwgdmFsdWVMZW4pIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgTG9nX3NldENmZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiBjZmdJZCwgdEFOSV9VMzIgdmFsKQoreworICAgIHN5c0xvZyhwTWFjLCBMT0dFLCBGTCgiU2V0ICVzKDB4JXgpIHRvIHZhbHVlIDB4JXhcbiIpLAorICAgICAgICAgICBnQ2ZnUGFyYW1OYW1lW2NmZ0lkXSwgY2ZnSWQsIHZhbCk7CisKKyAgICBpZiAoY2ZnU2V0SW50KHBNYWMsICh0QU5JX1UxNiljZmdJZCwgdmFsKSAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQorICAgICAgICBzeXNMb2cocE1hYywgTE9HRSwgRkwoInNldHRpbmcgY2ZnSWQgMHgleCB0byB2YWx1ZSAweCV4IGZhaWxlZCBcbiIpLAorICAgICAgICAgICAgICAgY2ZnSWQsIHZhbCk7CisgICAgIHJldHVybjsKK30KKworCitjaGFyICogZHVtcF9jZmdfZ2V0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgICh2b2lkKSBhcmcyOyAodm9pZCkgYXJnMzsgKHZvaWQpIGFyZzQ7CisgICAgTG9nX2dldENmZyhwTWFjLCAodEFOSV9VMTYpIGFyZzEpOworICAgIHJldHVybiBwOworfQorCitjaGFyICogZHVtcF9jZmdfZ3JvdXBfZ2V0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBhcmcxLCB0QU5JX1UzMiBhcmcyLCB0QU5JX1UzMiBhcmczLCB0QU5JX1UzMiBhcmc0LCBjaGFyICpwKQoreworICAgIHRBTklfVTMyIGksIHN0YXJ0SWQsIGVuZElkOworCisgICAgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworCisgICAgaWYgKGFyZzEgPCBDRkdfUEFSQU1fTUFYX05VTSkgeworICAgICAgICBzdGFydElkID0gYXJnMTsKKyAgICB9IGVsc2UgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiU3RhcnQgQ0ZHSUQgbXVzdCBiZSBsZXNzIHRoYW4gJWRcbiIsIENGR19QQVJBTV9NQVhfTlVNKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgaWYgKChhcmcyID09IDApIHx8IChhcmcyID4gQ0ZHX1BBUkFNX01BWF9OVU0pKQorICAgICAgICBhcmcyID0gMzA7CisKKyAgICBlbmRJZCA9ICgoc3RhcnRJZCArIGFyZzIpIDwgQ0ZHX1BBUkFNX01BWF9OVU0pID8gKHN0YXJ0SWQgKyBhcmcyKSA6IENGR19QQVJBTV9NQVhfTlVNOworCisgICAgZm9yIChpPXN0YXJ0SWQ7IGkgPCBlbmRJZDsgaSsrKQorICAgICAgICBMb2dfZ2V0Q2ZnKHBNYWMsICh0QU5JX1UxNikgaSk7CisKKyAgICByZXR1cm4gcDsKK30KK2NoYXIgKiBkdW1wX2NmZ19zZXQoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIGNoYXIgKnApCit7CisgICAgKHZvaWQpIGFyZzM7ICh2b2lkKSBhcmc0OworICAgIExvZ19zZXRDZmcocE1hYywgKHRBTklfVTE2KSBhcmcxLCBhcmcyKTsKKyAgICByZXR1cm4gcDsKK30KKworY2hhciAqIGR1bXBfbG9nX2xldmVsX3NldCggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICAodm9pZCkgYXJnMTsgKHZvaWQpIGFyZzI7ICh2b2lkKSBhcmczOyAodm9pZCkgYXJnNDsKKyAgICBwID0gc2V0TE9HTGV2ZWwoIHBNYWMsIHAsIGFyZzEsIGFyZzIgKTsKKyAgICByZXR1cm4gcDsKK30KKworI2lmZGVmIFdMQU5fREVCVUcgICAgCitzdGF0aWMgdExvZ2RSZWdMaXN0IGRhdGFUeXBlW10gPQoreworICAgIHtTSVJfTUFDX0RBVEFfREFUQSwgIkRBVEEgIn0sCisgICAge1NJUl9NQUNfREFUQV9EQVRBX0FDSywgIkQrQSAgIn0sCisgICAge1NJUl9NQUNfREFUQV9EQVRBX1BPTEwsICJEK1AgICJ9LAorICAgIHtTSVJfTUFDX0RBVEFfREFUQV9BQ0tfUE9MTCwgIkQrQStQIn0sCisgICAge1NJUl9NQUNfREFUQV9OVUxMLCAiTlVMTCAifSwKKyAgICB7U0lSX01BQ19EQVRBX05VTExfQUNLLCAiQUNLICAifSwKKyAgICB7U0lSX01BQ19EQVRBX05VTExfUE9MTCwgIlBPTEwgIn0sCisgICAge1NJUl9NQUNfREFUQV9OVUxMX0FDS19QT0xMLCAiQStQICAifSwKKyAgICB7U0lSX01BQ19EQVRBX1FPU19EQVRBLCAiUURBVEEifSwKKyAgICB7U0lSX01BQ19EQVRBX1FPU19EQVRBX0FDSywgIlFEK0EgIn0sCisgICAge1NJUl9NQUNfREFUQV9RT1NfREFUQV9QT0xMLCAiUUQrUCAifSwKKyAgICB7U0lSX01BQ19EQVRBX1FPU19EQVRBX0FDS19QT0xMLCAiUUQrQVAifSwKKyAgICB7U0lSX01BQ19EQVRBX1FPU19OVUxMLCAiUU5VTEwifSwKKyAgICB7U0lSX01BQ19EQVRBX1FPU19OVUxMX1BPTEwsICJRQUNLICJ9LAorICAgIHtTSVJfTUFDX0RBVEFfUU9TX05VTExfQUNLX1BPTEwsICJRK0ErUCJ9Cit9OworCitzdGF0aWMgdExvZ2RSZWdMaXN0IG1nbXRUeXBlW10gPSB7CisgICAge1NJUl9NQUNfTUdNVF9CRUFDT04sICJCRUFDT04gICAifSwKKyAgICB7U0lSX01BQ19NR01UX0FTU09DX1JFUSwgIkFTU09DUkVRICJ9LAorICAgIHtTSVJfTUFDX01HTVRfQVNTT0NfUlNQLCAiQVNTT0NSU1AgIn0sCisgICAge1NJUl9NQUNfTUdNVF9SRUFTU09DX1JTUCwgIlJFQVNTUlNQICJ9LAorICAgIHtTSVJfTUFDX01HTVRfUkVBU1NPQ19SRVEsICJSRUFTU1JFUSAifSwKKyAgICB7U0lSX01BQ19NR01UX1BST0JFX1JFUSwgIlBST0JFUkVRICJ9LAorICAgIHtTSVJfTUFDX01HTVRfUFJPQkVfUlNQLCAiUFJPQkVSU1AgIn0sCisgICAge1NJUl9NQUNfTUdNVF9BVVRILCAiQVVUSCAgICAgIn0sCisgICAge1NJUl9NQUNfTUdNVF9ERUFVVEgsICJERUFVVEggICAifSwKKyAgICB7U0lSX01BQ19NR01UX0RJU0FTU09DLCAiRElTQVNTT0MgIn0sCisgICAge1NJUl9NQUNfTUdNVF9BQ1RJT04sICJBQ1RJT04gICAifQorfTsKKworc3RhdGljIHRMb2dkUmVnTGlzdCBjdGxUeXBlW10gPSB7CisgICAge1NJUl9NQUNfQ1RSTF9SVFMsICJSVFMoQ1RMKSAifSwKKyAgICB7U0lSX01BQ19DVFJMX0NUUywgIkNUUyhDVEwpICJ9LAorICAgIHtTSVJfTUFDX0NUUkxfQUNLLCAiQUNLKENUTCkgIn0sCisgICAge1NJUl9NQUNfQ1RSTF9QU19QT0xMLCAiUFMtUE9MTCAgIn0sCisgICAge1NJUl9NQUNfQ1RSTF9CQVIsICJCQVIgICAgICAifSwKKyAgICB7U0lSX01BQ19DVFJMX0JBLCAgIkJBICAgICAgICJ9LAorICAgIHtTSVJfTUFDX0NUUkxfQ0ZfRU5ELCJDRi1FTkQgICAifSwKKyAgICB7U0lSX01BQ19DVFJMX0NGX0VORF9BQ0ssIkNGRStBQ0sgICJ9Cit9OworCitzdGF0aWMgY2hhciAqIHByaW50TWVzZ05hbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgY2hhciAqcCwgdEFOSV9VMzIgdHlwZSwgdEFOSV9VMzIgc3ViVHlwZSwgdEFOSV9VMzIgdGNJZCkKK3sKKyAgICB0TG9nZFJlZ0xpc3QgKnBFbnRyeSA9IE5VTEw7CisgICAgdEFOSV9VMzIgbkVudHJpZXMsIGk7CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIFNJUl9NQUNfREFUQV9GUkFNRToKKyAgICAgICAgICAgIHBFbnRyeSAgID0gJmRhdGFUeXBlWzBdOworICAgICAgICAgICAgbkVudHJpZXMgPSBzaXplb2YoZGF0YVR5cGUpL3NpemVvZihkYXRhVHlwZVswXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfTUFDX01HTVRfRlJBTUU6CisgICAgICAgICAgICBwRW50cnkgICA9ICZtZ210VHlwZVswXTsKKyAgICAgICAgICAgIG5FbnRyaWVzID0gc2l6ZW9mKG1nbXRUeXBlKS9zaXplb2YobWdtdFR5cGVbMF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lSX01BQ19DVFJMX0ZSQU1FOgorICAgICAgICAgICAgcEVudHJ5ICAgPSAmY3RsVHlwZVswXTsKKyAgICAgICAgICAgIG5FbnRyaWVzID0gc2l6ZW9mKGN0bFR5cGUpL3NpemVvZihjdGxUeXBlWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlJFU0VSVkVEICIpOworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCBuRW50cmllczsgaSsrLCBwRW50cnkrKykgeworICAgICAgICBpZiAocEVudHJ5LT5hZGRyID09IHN1YlR5cGUpIHsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICIlcyIsIHBFbnRyeS0+bmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpID49IG5FbnRyaWVzKQorICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiUkVTRVJWRUQgIik7CisKKyAgICBpZiAodHlwZSA9PSBTSVJfTUFDX0RBVEFfRlJBTUUpCisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICIoJWQpICIsIHRjSWQpOworICAgIHJldHVybiBwOworfQorCitjaGFyICogZHVtcF90aHJlYWRfaW5mbyggdHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgYXJnMSwgdEFOSV9VMzIgYXJnMiwgdEFOSV9VMzIgYXJnMywgdEFOSV9VMzIgYXJnNCwgY2hhciAqcCkKK3sKKyAgICB0QU5JX1UzMiBpLCBqOworCisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlxuKioqKiBCQlQgUkVDRUlWRSAqKioqIFxuIik7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlxuQkJUIENSQyBlcnJvcnMgcmVjZWl2ZWQgICA6ICVkXG4iLAorICAgICAgICAgICAgcE1hYy0+c3lzLmdTeXNCYnRDcmNGYWlsKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiQkJUIGR1cGxpY2F0ZXMgcmVjZWl2ZWQgICA6ICVkXG4iLAorICAgICAgICAgICAgcE1hYy0+c3lzLmdTeXNCYnREdXBsaWNhdGVzKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiQkJUIHRvdGFsIGZyYW1lcyByZWNlaXZlZCA6ICVkXG4iLAorICAgICAgICAgICAgcE1hYy0+c3lzLmdTeXNCYnRSZWNlaXZlZCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0UG9zdGVkIHRvIExJTSA6ICVkXG4iLAorICAgICAgICAgICAgcE1hYy0+c3lzLmdTeXNCYnRQb3N0ZWRUb0xpbSk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0UG9zdGVkIHRvIFNDSCA6ICVkXG4iLAorICAgICAgICAgICAgcE1hYy0+c3lzLmdTeXNCYnRQb3N0ZWRUb1NjaCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0UG9zdGVkIHRvIFBNTSA6ICVkXG4iLAorICAgICAgICAgICAgcE1hYy0+c3lzLmdTeXNCYnRQb3N0ZWRUb1BtbSk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0UG9zdGVkIHRvIEhBTCA6ICVkXG4iLAorICAgICAgICAgICAgcE1hYy0+c3lzLmdTeXNCYnRQb3N0ZWRUb0hhbCk7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0RHJvcHBlZCAgICAgICA6ICVkXG4iLAorICAgICAgICAgICAgcE1hYy0+c3lzLmdTeXNCYnREcm9wcGVkKTsKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiXHRcdExlYXJuIG1vZGUgZnJhbWUgb3V0IG9mIGxlYXJuIG1vZGUgOiAlZFxuIiwKKyAgICAgICAgICAgIHBNYWMtPnN5cy5nU3lzQmJ0TGVhcm5GcmFtZUludik7CisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0XHROb24tbGVhcm4gbW9kZSBmcmFtZSBpbiBsZWFybiBtb2RlIDogJWRcbiIsCisgICAgICAgICAgICBwTWFjLT5zeXMuZ1N5c0JidE5vbkxlYXJuRnJhbWVJbnYpOworCisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlxuTUdNVCBSWCBmcmFtZSBjb3VudHNcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGlmIChwTWFjLT5zeXMuZ1N5c0ZyYW1lQ291bnRbMF1baV0pIHsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJcdCIpOworICAgICAgICAgICAgcCA9IHByaW50TWVzZ05hbWUoIHBNYWMsIHAsIDAsIGksIDApOworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlslZF0gJWRcbiIsIGksIHBNYWMtPnN5cy5nU3lzRnJhbWVDb3VudFswXVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiQ1RSTCBSWCBmcmFtZSBjb3VudHNcbiIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgaWYgKHBNYWMtPnN5cy5nU3lzRnJhbWVDb3VudFsxXVtpXSkgeworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0Iik7CisgICAgICAgICAgICBwID0gcHJpbnRNZXNnTmFtZShwTWFjLCBwLCAxLCBpLCAwKTsKKyAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJbJWRdICVkXG4iLCBpLCBwTWFjLT5zeXMuZ1N5c0ZyYW1lQ291bnRbMV1baV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIkRBVEEgUlggZnJhbWUgY291bnRzXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBpZiAocE1hYy0+c3lzLmdTeXNGcmFtZUNvdW50WzJdW2ldKSB7CisgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiXHQiKTsKKyAgICAgICAgICAgIHAgPSBwcmludE1lc2dOYW1lKHBNYWMsIHAsIDIsIGksIDApOworICAgICAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlslZF0gJWRcbiIsIGksCisgICAgICAgICAgICAgICAgICAgIHBNYWMtPnN5cy5nU3lzRnJhbWVDb3VudFsyXVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocE1hYy0+c2NoLmdTY2hCQlhwb3J0UmN2Q250KSB7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJcblNDSCBwcm9jZXNzZWQgbWVzc2FnZXMgOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBwTWFjLT5zY2guZ1NjaEJCWHBvcnRSY3ZDbnQpOworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiXHRCZWFjb25zICA6ICVkXG4iLCBwTWFjLT5zY2guZ1NjaEJjblJjdkNudCk7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJcdFx0aWdub3JlZCAgOiAlZFxuIiwgcE1hYy0+c2NoLmdTY2hCY25JZ25vcmVkKTsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0XHRpbiBlcnJvciA6ICVkXG4iLCBwTWFjLT5zY2guZ1NjaEJjblBhcnNlRXJyb3JDbnQpOworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiXHRRb1MgbnVsbCA6ICVkXG4iLCBwTWFjLT5zY2guZ1NjaFJSUmN2Q250KTsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0RHJvcHBlZCAgOiAlZFxuIiwgcE1hYy0+c2NoLmdTY2hVbmtub3duUmN2Q250KTsKKyAgICB9CisKKworICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJcbkxJTSBwcm9jZXNzZWQgbWVzc2FnZXMgOiAlZFxuIiwgcE1hYy0+bGltLm51bVRvdCk7CisgICAgaWYgKHBNYWMtPmxpbS5udW1Ub3QpIHsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0U01FIE1lc3NhZ2VzIChIREQpIDogJWRcbiIsIHBNYWMtPmxpbS5udW1TbWUpOworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiXHRNQUMgTWVzc2FnZXMgKEJCVCkgOiAlZFxuIiwgcE1hYy0+bGltLm51bUJidCk7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJcdFx0QmFkIFByb3RvY29sXHQ6ICVkXG4iLCBwTWFjLT5saW0ubnVtUHJvdEVycik7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJcdFx0SW4gTGVhcm4gbW9kZVx0OiAlZCAoaWdub3JlZCAlZClcbiIsCisgICAgICAgICAgICAgICAgcE1hYy0+bGltLm51bUxlYXJuLCBwTWFjLT5saW0ubnVtTGVhcm5JZ25vcmUpOworCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykgeworICAgICAgICAgICAgZm9yIChqPTA7IGo8MTY7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChwTWFjLT5saW0ubnVtTUFDW2ldW2pdKSB7CisgICAgICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJcdFx0Iik7CisgICAgICAgICAgICAgICAgICAgIHAgPSBwcmludE1lc2dOYW1lKHBNYWMsIHAsIGksIGosIDApOworICAgICAgICAgICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiXHQ6ICVkXG4iLCBwTWFjLT5saW0ubnVtTUFDW2ldW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiXHRCZWFjb25zIHJlY2VpdmVkIDogJWRcbiIsIHBNYWMtPmxpbS5nTGltTnVtQmVhY29uc1JjdmQpOworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLCBwLCAiXHRcdElnbm9yZWQgOiAlZFxuIiwgcE1hYy0+bGltLmdMaW1OdW1CZWFjb25zSWdub3JlZCk7CisgICAgfQorCisgICAgaWYgKHBNYWMtPnN5cy5nU3lzRnJhbWVDb3VudFtTSVJfTUFDX01HTVRfRlJBTUVdW1NJUl9NQUNfTUdNVF9QUk9CRV9SRVFdKSB7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJcblByb2JlIFJlcXVlc3RzIFJlY2VpdmVkOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBwTWFjLT5zeXMuZ1N5c0ZyYW1lQ291bnRbU0lSX01BQ19NR01UX0ZSQU1FXVtTSVJfTUFDX01HTVRfUFJPQkVfUkVRXSk7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJcdElnbm9yZWQgIFx0OiAlZFxuIiwgcE1hYy0+c3lzLnByb2JlSWdub3JlKTsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0U1NJRCBtaXNzXHQ6ICVkXG4iLCBwTWFjLT5zeXMucHJvYmVCYWRTc2lkKTsKKyAgICAgICAgcCArPSBsb2dfc3ByaW50ZiggcE1hYywgcCwgIlx0UGFyc2UgZXJyXHQ6ICVkXG4iLCBwTWFjLT5zeXMucHJvYmVFcnJvcik7CisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMsIHAsICJcdFJlc3BvbmRlZFx0OiAlZFxuIiwgcE1hYy0+c3lzLnByb2JlUmVzcG9uZCk7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyogSW5pdGlhbGl6ZSB0aGUgaW5kZXggKi8KK3ZvaWQgbG9nRHVtcEluaXQodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgICBwTWFjLT5kdW1wVGFibGVjdXJyZW50SWQgPSAwOworCit9CisKK3ZvaWQgbG9nRHVtcFJlZ2lzdGVyVGFibGUoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREdW1wRnVuY0VudHJ5ICpwRW50cnksIHRBTklfVTMyICAgbkl0ZW1zICkKK3sKKworICAgIHBNYWMtPmR1bXBUYWJsZUVudHJ5W3BNYWMtPmR1bXBUYWJsZWN1cnJlbnRJZF0tPm5JdGVtcyA9IG5JdGVtczsKKyAgICBwTWFjLT5kdW1wVGFibGVFbnRyeVtwTWFjLT5kdW1wVGFibGVjdXJyZW50SWRdLT5taW5kdW1waWQgPSBwRW50cnktPmlkOworICAgIHBNYWMtPmR1bXBUYWJsZUVudHJ5W3BNYWMtPmR1bXBUYWJsZWN1cnJlbnRJZF0tPm1heGR1bXBpZCA9IChwRW50cnkgKyAobkl0ZW1zLTEpKS0+aWQ7CisgICAgcE1hYy0+ZHVtcFRhYmxlRW50cnlbcE1hYy0+ZHVtcFRhYmxlY3VycmVudElkXS0+ZHVtcFRhYmxlID0gcEVudHJ5OworICAgIHBNYWMtPmR1bXBUYWJsZWN1cnJlbnRJZCsrOworfQorCisKKy8qCisgKiBwcmludCBuSXRlbXMgZnJvbSB0aGUgbWVudSBsaXN0IHBvbnRlZCB0byBieSBtCisgKi8KK3N0YXRpYyB0QU5JX1UzMiBwcmludF9tZW51KHRwQW5pU2lyR2xvYmFsIHBNYWMsIGNoYXIgICpwLCB0QU5JX1UzMiBzdGFydElkKQoreworICAgIHRBTklfVTMyIGN1cnJlbnRJZCA9IDA7CisgICAgdEFOSV9VMzIgaSwgajsKKyAgICB0QU5JX1MzMiByZXQgPSAwOworICAgIHREdW1wRnVuY0VudHJ5ICpwRW50cnkgPSBOVUxMOworICAgIHRBTklfVTMyIG5JdGVtcyA9IDA7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBwTWFjLT5kdW1wVGFibGVjdXJyZW50SWQ7IGkrKykgeworICAgICAgICBwRW50cnkgPSBwTWFjLT5kdW1wVGFibGVFbnRyeVtpXS0+ZHVtcFRhYmxlOworICAgICAgICBuSXRlbXMgPSBwTWFjLT5kdW1wVGFibGVFbnRyeVtpXS0+bkl0ZW1zOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuSXRlbXM7IGorKywgcEVudHJ5KyspIHsKKyAgICAgICAgICAgIGlmIChwRW50cnktPmRlc2NyaXB0aW9uID09IE5VTEwpIAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAocEVudHJ5LT5pZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gbG9nX3NwcmludGYoIHBNYWMscCwgIi0tLS0gJXNcbiIsIHBFbnRyeS0+ZGVzY3JpcHRpb24pOyAKKworICAgICAgICAgICAgICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBwICs9IHJldDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBFbnRyeS0+aWQgPCBzdGFydElkKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICByZXQgPSBsb2dfc3ByaW50ZihwTWFjLCBwLCAiJTRkXHQlc1xuIiwgcEVudHJ5LT5pZCwgcEVudHJ5LT5kZXNjcmlwdGlvbik7CisKKyAgICAgICAgICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY3VycmVudElkID0gcEVudHJ5LT5pZDsKKyAgICAgICAgICAgIHAgKz0gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldCA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGN1cnJlbnRJZDsKK30KKworaW50IGxvZ1J0YWlEdW1wKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBjbWQsIHRBTklfVTMyIGFyZzEsIHRBTklfVTMyIGFyZzIsIHRBTklfVTMyIGFyZzMsIHRBTklfVTMyIGFyZzQsIHRBTklfVTggKnBCdWYpCit7CisgICAgY2hhciAqcCA9IChjaGFyICopcEJ1ZjsKKyAgICB0QU5JX1UzMiBpOworICAgIHRBTklfVTMyIG5JdGVtcyA9IDA7CisgICAgdER1bXBGdW5jRW50cnkgKnBFbnRyeSA9IE5VTEw7CisKKyAgICBwTWFjLT5nQ3VycmVudExvZ1NpemUgPSAwOworICAgIGlmIChkZWJ1ZykgeworICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJDbWQgPSAlZCBBcmdzICgweCV4LDB4JXgsMHgleCwweCV4KVxuXG4iLAorICAgICAgICAgICAgICAgIGNtZCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7CisgICAgfQorCisgICAgaWYoIGNtZCA9PSBNQVhfRFVNUF9DTUQgfHwgY21kID09IDAgKSB7CisgICAgICAgIHBNYWMtPm1lbnVDdXJyZW50ID0gcHJpbnRfbWVudShwTWFjLCBwLCBwTWFjLT5tZW51Q3VycmVudCk7CisgICAgICAgIHJldHVybiBwTWFjLT5nQ3VycmVudExvZ1NpemU7CisgICAgfQorICAgIGlmKGNtZCA8PSBIQUxfTE9HX0RVTVBfQ01EX0VORCkKKyAgICB7CisgICAgICAgV0RBX0hBTER1bXBDbWRSZXEocE1hYywgY21kLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICBmb3IoaSA9IDA7IGkgPCBwTWFjLT5kdW1wVGFibGVjdXJyZW50SWQ7IGkrKykgeworICAgICAgICAgICBpZiggKGNtZCA+IHBNYWMtPmR1bXBUYWJsZUVudHJ5W2ldLT5taW5kdW1waWQpICYmIChjbWQgPD0gcE1hYy0+ZHVtcFRhYmxlRW50cnlbaV0tPm1heGR1bXBpZCkpIHsKKyAgICAgICAgICAgICAgIHBFbnRyeSA9IHBNYWMtPmR1bXBUYWJsZUVudHJ5W2ldLT5kdW1wVGFibGU7CisgICAgICAgICAgICAgICBuSXRlbXMgPSBwTWFjLT5kdW1wVGFibGVFbnRyeVtpXS0+bkl0ZW1zOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICAKKyAgICAgICBpZigobkl0ZW1zID4gMCkgJiYgKHBFbnRyeSAhPSBOVUxMKSkgeworICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkl0ZW1zOyBpKyssIHBFbnRyeSsrKSB7CisgICAgICAgICAgICAgICBpZiggY21kID09IHBFbnRyeS0+aWQgKSB7CisgICAgICAgICAgICAgICAgICAgaWYgKCBwRW50cnktPmZ1bmMgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcEVudHJ5LT5mdW5jKHBNYWMsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIHApOworICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIkNtZCBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBwICs9IGxvZ19zcHJpbnRmKCBwTWFjLHAsICJDbWQgbm90IGZvdW5kIFxuIik7CisgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVidWcpCisgICAgICAgIHAgKz0gbG9nX3NwcmludGYoIHBNYWMscCwgIlJldHVybmVkICVkIGJ5dGVzXG4iLCBwTWFjLT5nQ3VycmVudExvZ1NpemUpOworCisgICAgcmV0dXJuIHBNYWMtPmdDdXJyZW50TG9nU2l6ZTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvdXRpbHMvc3JjL21hY1RyYWNlLmMgYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3V0aWxzL3NyYy9tYWNUcmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZjQ4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1NZUy9sZWdhY3kvc3JjL3V0aWxzL3NyYy9tYWNUcmFjZS5jCkBAIC0wLDAgKzEsNjY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFxmaWxlICBtYWNUcmFjZS5jCisKKyAgXGJyaWVmIGltcGxlbWVudGF0aW9uIGZvciB0cmFjZSByZWxhdGVkIEFQSXMKKworICBcYXV0aG9yIFN1bml0IEJoYXRpYQorCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgIm1hY1RyYWNlLmgiCisKKworI2lmZGVmIFRSQUNFX1JFQ09SRAorc3RhdGljIHRUcmFjZVJlY29yZCBnVHJhY2VUYmxbTUFYX1RSQUNFX1JFQ09SRFNdOworc3RhdGljIHRUcmFjZURhdGEgZ1RyYWNlRGF0YTsKK3N0YXRpYyB0cFRyYWNlQ2IgdHJhY2VDQlRhYmxlW1ZPU19NT0RVTEVfSURfTUFYXTsKKworCisKKworCit0QU5JX1U4KiBtYWNUcmFjZUdldFNtZU1zZ1N0cmluZyggdEFOSV9VMTYgc21lTXNnICkKK3sKKyAgICBzd2l0Y2goIHNtZU1zZyApCisgICAgeworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU1RBUlRfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NUQVJUX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TWVNfUkVBRFlfSU5EKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NDQU5fUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NDQU5fQUJPUlRfSU5EKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NDQU5fUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0pPSU5fUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0pPSU5fUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NFVENPTlRFWFRfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NFVENPTlRFWFRfUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1JFQVNTT0NfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1JFQVNTT0NfUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0FVVEhfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0FVVEhfUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0RJU0FTU09DX1JFUSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9ESVNBU1NPQ19SU1ApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfRElTQVNTT0NfSU5EKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0RJU0FTU09DX0NORik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9ERUFVVEhfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0RFQVVUSF9SU1ApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfREVBVVRIX0lORCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9XTV9TVEFUVVNfQ0hBTkdFX05URik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9JQlNTX05FV19QRUVSX0lORCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9JQlNTX1BFRVJfREVQQVJURURfSU5EKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NUQVJUX0JTU19SRVEpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU1RBUlRfQlNTX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9BVVRIX0lORCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9BU1NPQ19JTkQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfQVNTT0NfQ05GKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1JFQVNTT0NfSU5EKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1JFQVNTT0NfQ05GKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NXSVRDSF9DSExfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NXSVRDSF9DSExfUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NUT1BfQlNTX1JFUSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TVE9QX0JTU19SU1ApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfREVMX0JBX1BFRVJfSU5EKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1BST01JU0NVT1VTX01PREVfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1BST01JU0NVT1VTX01PREVfUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX05FSUdIQk9SX0JTU19JTkQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfTUVBU1VSRU1FTlRfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX01FQVNVUkVNRU5UX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9NRUFTVVJFTUVOVF9JTkQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU0VUX1dEU19JTkZPX1JFUSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TRVRfV0RTX0lORk9fUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1dEU19JTkZPX0lORCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9ERUFVVEhfQ05GKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX01JQ19GQUlMVVJFX0lORCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9BRERUU19SRVEpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfQUREVFNfUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0FERFRTX0NORik7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9BRERUU19JTkQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfREVMVFNfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0RFTFRTX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9ERUxUU19JTkQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU0VUX0JBQ0tHUk9VTkRfU0NBTl9NT0RFX1JFUSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TV0lUQ0hfQ0hMX0NCX1BSSU1BUllfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NXSVRDSF9DSExfQ0JfUFJJTUFSWV9SU1ApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU1dJVENIX0NITF9DQl9TRUNPTkRBUllfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NXSVRDSF9DSExfQ0JfU0VDT05EQVJZX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9QUk9CRV9SRVEpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU1RBX1NUQVRfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NUQV9TVEFUX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9BR0dSX1NUQVRfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0FHR1JfU1RBVF9SU1ApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfR0xPQkFMX1NUQVRfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0dMT0JBTF9TVEFUX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9TVEFUX1NVTU1fUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NUQVRfU1VNTV9SU1ApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfUkVNT1ZFS0VZX1JFUSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9SRU1PVkVLRVlfUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0dFVF9TQ0FOTkVEX0NIQU5ORUxfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0dFVF9TQ0FOTkVEX0NIQU5ORUxfUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX1NFVF9UWF9QT1dFUl9SRVEpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfU0VUX1RYX1BPV0VSX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9HRVRfVFhfUE9XRVJfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0dFVF9UWF9QT1dFUl9SU1ApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfR0VUX05PSVNFX1JFUSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9HRVRfTk9JU0VfUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfU01FX0xPV19SU1NJX0lORCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9HRVRfU1RBVElTVElDU19SRVEpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9TTUVfR0VUX1NUQVRJU1RJQ1NfUlNQKTsgICAgICAgIAorCisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1NNRV9NU0dfVFlQRVNfRU5EKTsKKworICAgICAgICAvL0dlbmVyYWwgUG93ZXIgU2F2ZSBNZXNzYWdlcworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9QTUNfUFdSX1NBVkVfQ0ZHKTsKKworICAgICAgICAvL0JNUFMgTWVzc2FnZXMKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfUE1DX0VOVEVSX0JNUFNfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfUE1DX0VOVEVSX0JNUFNfUlNQKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfUE1DX0VYSVRfQk1QU19SRVEpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9QTUNfRVhJVF9CTVBTX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1BNQ19FWElUX0JNUFNfSU5EKTsKKworICAgICAgICAvL0lNUFMgTWVzc2FnZXMuCisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1BNQ19FTlRFUl9JTVBTX1JFUSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1BNQ19FTlRFUl9JTVBTX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1BNQ19FWElUX0lNUFNfUkVRKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfUE1DX0VYSVRfSU1QU19SU1ApOworCisgICAgICAgIC8vVUFQU0QgTWVzc2FnZXMKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKGVXTklfUE1DX0VOVEVSX1VBUFNEX1JFUSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1BNQ19FTlRFUl9VQVBTRF9SU1ApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9QTUNfRVhJVF9VQVBTRF9SRVEpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoZVdOSV9QTUNfRVhJVF9VQVBTRF9SU1ApOworCisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhlV05JX1BNQ19TTVBTX1NUQVRFX0lORCk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiggKHRBTklfVTgqKSJVTktOT1dOIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3RBTklfVTgqIG1hY1RyYWNlR2V0SGFsTXNnU3RyaW5nKCB0QU5JX1UxNiBoYWxNc2cgKQoreworICAgIHN3aXRjaCggaGFsTXNnICkKKyAgICB7CisKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfUkFEQVJfREVURUNURURfSU5EKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfV0RUX0tBTV9SU1AgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfVElNRVJfVEVNUF9NRUFTX1JFUSAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfVElNRVJfUEVSSU9ESUNfU1RBVFNfQ09MTEVDVF9SRVEgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9DQUxfUkVRX05URiAgICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9NTlRfT1BFTl9UUENfVEVNUF9NRUFTX1JFUSApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9DQ0FfTU9OSVRPUl9JTlRFUlZBTF9UTyAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9DQ0FfTU9OSVRPUl9EVVJBVElPTl9UTyAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9DQ0FfTU9OSVRPUl9TVEFSVCAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9DQ0FfTU9OSVRPUl9TVE9QICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9DQ0FfQ0hBTkdFX01PREUgICAgICAgICAgICApOworCisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0FERF9TVEFfUkVRICAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0FERF9TVEFfUlNQICAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0RFTEVURV9TVEFfUkVRICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0RFTEVURV9TVEFfUlNQICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0FERF9CU1NfUkVRICAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0FERF9CU1NfUlNQICAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0RFTEVURV9CU1NfUkVRICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0RFTEVURV9CU1NfUlNQICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0lOSVRfU0NBTl9SRVEgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0lOSVRfU0NBTl9SU1AgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NUQVJUX1NDQU5fUkVRICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NUQVJUX1NDQU5fUlNQICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0VORF9TQ0FOX1JFUSAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0VORF9TQ0FOX1JTUCAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0ZJTklTSF9TQ0FOX1JFUSAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0ZJTklTSF9TQ0FOX1JTUCAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NFTkRfQkVBQ09OX1JFUSAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NFTkRfQkVBQ09OX1JTUCAgICAgICAgICAgICk7CisKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfSU5JVF9DRkdfUkVRICAgICAgICAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfSU5JVF9DRkdfUlNQICAgICAgICAgICAgICAgKTsKKworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9JTklUX1dNX0NGR19SRVEgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9JTklUX1dNX0NGR19SU1AgICAgICAgICAgICApOworCisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NFVF9CU1NLRVlfUkVRICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NFVF9CU1NLRVlfUlNQICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NFVF9TVEFLRVlfUkVRICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NFVF9TVEFLRVlfUlNQICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0RQVV9TVEFUU19SRVEgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0RQVV9TVEFUU19SU1AgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0dFVF9EUFVJTkZPX1JFUSAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0dFVF9EUFVJTkZPX1JTUCAgICAgICAgICAgICk7CisKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfVVBEQVRFX0VEQ0FfUFJPRklMRV9JTkQgICAgKTsKKworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9VUERBVEVfU1RBUkFURUlORk9fUkVRICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9VUERBVEVfU1RBUkFURUlORk9fUlNQICAgICApOworCisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1VQREFURV9CRUFDT05fSU5EICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1VQREFURV9DRl9JTkQgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0NITkxfU1dJVENIX1JFUSAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NXSVRDSF9DSEFOTkVMX1JTUCAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0FERF9UU19SRVEgICAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0RFTF9UU19SRVEgICAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0FERF9UU19SU1ApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TT0ZUTUFDX1RYU1RBVF9SRVBPUlQgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9FWElUX0JNUFNfUkVRICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9FWElUX0JNUFNfUlNQICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9FWElUX0JNUFNfSU5EICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9FTlRFUl9CTVBTX1JFUSAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9FTlRFUl9CTVBTX1JTUCAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9CTVBTX1NUQVRVU19JTkQgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9NSVNTRURfQkVBQ09OX0lORCAgICAgICAgICApOworCisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1BXUl9TQVZFX0NGRyAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfUkVHSVNURVJfUEVfQ0FMTEJBQ0sgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfU09GVE1BQ19NRU1fUkVBRFJFUVVFU1QgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfU09GVE1BQ19NRU1fV1JJVEVSRVFVRVNUICAgKTsKKworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TT0ZUTUFDX01FTV9SRUFEUkVTUE9OU0UgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TT0ZUTUFDX0JVTEtSRUdXUklURV9DT05GSVJNICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfU09GVE1BQ19CVUxLUkVHUkVBRF9SRVNQT05TRSAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NPRlRNQUNfSE9TVE1FU0dfTVNHUFJPQ0VTU1JFU1VMVCApOworCisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0FEREJBX1JFUSAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0FEREJBX1JTUCAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0RFTEJBX0lORCAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfREVMQkFfUkVRICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfSUJTU19TVEFfQUREICAgICAgICAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfVElNRVJfQURKVVNUX0FEQVBUSVZFX1RIUkVTSE9MRF9JTkQgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TRVRfTElOS19TVEFURSAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9FTlRFUl9JTVBTX1JFUSAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9FTlRFUl9JTVBTX1JTUCAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9FWElUX0lNUFNfUlNQICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9FWElUX0lNUFNfUkVRICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TT0ZUTUFDX0hPU1RNRVNHX1BTX1NUQVRVU19JTkQgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1BPU1RQT05FX0VOVEVSX0lNUFNfUlNQICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NUQV9TVEFUX1JFUSAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0dMT0JBTF9TVEFUX1JFUSAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0FHR1JfU1RBVF9SRVEgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NUQV9TVEFUX1JTUCAgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0dMT0JBTF9TVEFUX1JTUCAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0FHR1JfU1RBVF9SU1AgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NUQVRfU1VNTV9SRVEgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NUQVRfU1VNTV9SU1AgICAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1JFTU9WRV9CU1NLRVlfUkVRICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1JFTU9WRV9CU1NLRVlfUlNQICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1JFTU9WRV9TVEFLRVlfUkVRICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1JFTU9WRV9TVEFLRVlfUlNQICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NFVF9TVEFfQkNBU1RLRVlfUkVRICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1NFVF9TVEFfQkNBU1RLRVlfUlNQICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1JFTU9WRV9TVEFfQkNBU1RLRVlfUkVRICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1JFTU9WRV9TVEFfQkNBU1RLRVlfUlNQICAgICk7CisKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfRFBVX01JQ19FUlJPUiAgICAgICAgICAgICAgKTsKKworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9USU1FUl9CQV9BQ1RJVklUWV9SRVEgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9USU1FUl9DSElQX01PTklUT1JfVElNRU9VVCApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9USU1FUl9UUkFGRklDX0FDVElWSVRZX1JFUSApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TRVRfTUlNT1BTX1JFUSAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TRVRfTUlNT1BTX1JTUCAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TWVNfUkVBRFlfSU5EICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TRVRfVFhfUE9XRVJfUkVRICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TRVRfVFhfUE9XRVJfUlNQICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9HRVRfVFhfUE9XRVJfUkVRICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9HRVRfVFhfUE9XRVJfUlNQICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9HRVRfTk9JU0VfUkVRICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9HRVRfTk9JU0VfUlNQICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX1RSQU5TTUlTU0lPTl9DT05UUk9MX0lORCAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfSEFMX0lOSVRfUkFEQVJfSU5EICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfQkVBQ09OX1BSRV9JTkQgICAgICAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfRU5URVJfVUFQU0RfUkVRICAgICAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfRU5URVJfVUFQU0RfUlNQICAgICAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfRVhJVF9VQVBTRF9SRVEgICAgICAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfRVhJVF9VQVBTRF9SU1AgICAgICAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfTE9XX1JTU0lfSU5EICAgICAgICAgICAgICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9IQUxfR0VUX1NUQVRJU1RJQ1NfUlNQICAgICAgICAgKTsKKworI2lmZGVmIFNVUFBPUlRfQkVBQ09OX0ZJTFRFUgorICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9CRUFDT05fRklMVEVSX0lORCAgICk7CisjZW5kaWYgLy9TVVBQT1JUX0JFQUNPTl9GSUxURVIKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybigodEFOSV9VOCopICJVTktOT1dOIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKwordEFOSV9VOCogbWFjVHJhY2VHZXRMaW1Nc2dTdHJpbmcoIHRBTklfVTE2IGxpbU1zZyApCit7CisgICAgc3dpdGNoKCBsaW1Nc2cgKQorICAgIHsKKyAgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX1JFU1VNRV9BQ1RJVklUWV9OVEYpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9TVVNQRU5EX0FDVElWSVRZX1JFUSApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0hBTF9TVVNQRU5EX0FDVElWSVRZX1JTUCApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9SRVRSWV9JTlRFUlJVUFRfTVNHKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9CQl9YUE9SVF9NR01UX01TRyApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9JTlZfS0VZX0lOVEVSUlVQVF9NU0cgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fS0VZX0lEX0lOVEVSUlVQVF9NU0cgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fUkVQTEFZX1RIUkVTX0lOVEVSUlVQVF9NU0cgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fVERfRFVNTVlfQ0FMTEJBQ0tfTVNHICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX1NDSF9DTEVBTl9NU0cgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX1JBREFSX0RFVEVDVF9JTkQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9ERUxfVFNfSU5EKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fQUREX0JBX0lORCApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9ERUxfQkFfQUxMX0lORCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0RFTEVURV9TVEFfQ09OVEVYVF9JTkQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9ERUxfQkFfSU5EICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX01JTl9DSEFOTkVMX1RJTUVPVVQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9NQVhfQ0hBTk5FTF9USU1FT1VUKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fSk9JTl9GQUlMX1RJTUVPVVQgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fQVVUSF9GQUlMX1RJTUVPVVQgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fQVVUSF9SU1BfVElNRU9VVCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0FTU09DX0ZBSUxfVElNRU9VVCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX1JFQVNTT0NfRkFJTF9USU1FT1VUKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fSEVBUlRfQkVBVF9USU1FT1VUKTsKKyNpZiAoV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCkKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fUFJFQVVUSF9DTE5VUF9USU1FT1VUKTsKKyNlbmRpZgorICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9DSEFOTkVMX1NDQU5fVElNRU9VVCApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9QUk9CRV9IQl9GQUlMVVJFX1RJTUVPVVQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9BRERUU19SU1BfVElNRU9VVCApOworI2lmIChXTklfUE9MQVJJU19GV19QUk9EVUNUID09IEFQKSAmJiAoV05JX1BPTEFSSVNfRldfUEFDS0FHRSA9PSBBRFZBTkNFRCkKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fTUVBU1VSRU1FTlRfSU5EX1RJTUVPVVQgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0xFQVJOX0lOVEVSVkFMX1RJTUVPVVQgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9MRUFSTl9EVVJBVElPTl9USU1FT1VUICAgKTsKKyNlbmRpZgorICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9MSU5LX1RFU1RfRFVSQVRJT05fVElNRU9VVCApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9IQVNIX01JU1NfVEhSRVNfVElNRU9VVCAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fQ05GX1dBSVRfVElNRU9VVCAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX0tFRVBBTElWRV9USU1FT1VUICAgICAgICApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9VUERBVEVfT0xCQ19DQUNIRUxfVElNRU9VVCApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9DSEFOTkVMX1NXSVRDSF9USU1FT1VUICAgKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9MSU1fUVVJRVRfVElNRU9VVCAgICAgICAgICAgICk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhTSVJfTElNX1FVSUVUX0JTU19USU1FT1VUICAgICAgKTsKKyNpZmRlZiBXTU1fQVBTRAorICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9XTU1fQVBTRF9TUF9TVEFSVF9NU0dfVFlQRSApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9XTU1fQVBTRF9TUF9FTkRfTVNHX1RZUEUgKTsKKyNlbmRpZgorICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9CRUFDT05fR0VOX0lORCApOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0xJTV9NU0dfVFlQRVNfRU5EKTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKCAodEFOSV9VOCopIlVOS05PV04iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKworCisKK3RBTklfVTgqIG1hY1RyYWNlR2V0Q2ZnTXNnU3RyaW5nKCB0QU5JX1UxNiBjZmdNc2cgKQoreworICAgIHN3aXRjaCggY2ZnTXNnICkKKyAgICB7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhXTklfQ0ZHX1BBUkFNX1VQREFURV9JTkQpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoV05JX0NGR19ETkxEX1JFUSk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhXTklfQ0ZHX0ROTERfQ05GKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFdOSV9DRkdfR0VUX1JTUCk7CisgICAgICAgIENBU0VfUkVUVVJOX1NUUklORyhXTklfQ0ZHX1NFVF9DTkYpOworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoU0lSX0NGR19QQVJBTV9VUERBVEVfSU5EKTsKKyAgICAgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKFNJUl9DRkdfRE9XTkxPQURfQ09NUExFVEVfSU5EKTsKKworICAgICAgICBDQVNFX1JFVFVSTl9TVFJJTkcoV05JX0NGR19TRVRfUkVRX05PX1JTUCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oICh0QU5JX1U4KikiVU5LTk9XTiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCit0QU5JX1U4KiBtYWNUcmFjZUdldE1vZHVsZVN0cmluZyggdEFOSV9VOCBtb2R1bGVJZCAgKQoreworICAgIHJldHVybiAoKHRBTklfVTgqKSJQRSIpOworICAgIC8vcmV0dXJuIGdWb3NUcmFjZUluZm9bbW9kdWxlSWRdLm1vZHVsZU5hbWVTdHI7Cit9CisKKworCisKKworCisKKworCisKK3ZvaWQgbWFjVHJhY2VJbml0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7CisgICAgdEFOSV9VOCBpOworICAgIGdUcmFjZURhdGEuaGVhZCA9IElOVkFMSURfVFJBQ0VfQUREUjsKKyAgICBnVHJhY2VEYXRhLnRhaWwgPSBJTlZBTElEX1RSQUNFX0FERFI7CisgICAgZ1RyYWNlRGF0YS5udW0gPSAwOworICAgIGdUcmFjZURhdGEuZW5hYmxlID0gVFJVRTsKKyAgICBnVHJhY2VEYXRhLmR1bXBDb3VudCA9IERFRkFVTFRfVFJBQ0VfRFVNUF9DT1VOVDsKKyAgICBnVHJhY2VEYXRhLm51bVNpbmNlTGFzdER1bXAgPSAwOworCisgICAgZm9yKGk9MDsgaTxWT1NfTU9EVUxFX0lEX01BWDsgaSsrKQorICAgICAgICB0cmFjZUNCVGFibGVbaV0gPSBOVUxMOworCit9CisKKworCisKKwordm9pZCBtYWNUcmFjZVJlc2V0KHRwQW5pU2lyR2xvYmFsIHBNYWMpCit7Cit9CisKKwordm9pZCBtYWNUcmFjZSh0cEFuaVNpckdsb2JhbCBwTWFjLCAgdEFOSV9VOCBjb2RlLCB0QU5JX1U4IHNlc3Npb24sIHRBTklfVTMyIGRhdGEpCit7CisgICAgLy9Ub2RheSBtYWNUcmFjZSBpcyBiZWluZyBpbnZva2VkIGJ5IFBFIG9ubHksIG5lZWQgdG8gcmVtb3ZlIHRoaXMgZnVuY3Rpb24gb25jZSBQRSBpcyBtaWdyYXRlZCB0byB1c2luZyBuZXcgdHJhY2UgQVBJLgorICAgIG1hY1RyYWNlTmV3KHBNYWMsIFZPU19NT0RVTEVfSURfUEUsIGNvZGUsIHNlc3Npb24sIGRhdGEpOworCisjaWYgMAorICAgIHRwVHJhY2VSZWNvcmQgcmVjID0gTlVMTDsKKworICAgIC8vbGltTG9nKHBNYWMsIExPR0UsICJtYWMgVHJhY2UgY29kZTogJWQsIGRhdGE6ICV4LCBoZWFkOiAlZCwgdGFpbDogJWRcbiIsICBjb2RlLCBkYXRhLCBnVHJhY2VEYXRhLmhlYWQsIGdUcmFjZURhdGEudGFpbCk7CisKKyAgICBpZighZ1RyYWNlRGF0YS5lbmFibGUpCisgICAgICAgIHJldHVybjsKKyAgICBnVHJhY2VEYXRhLm51bSsrOworCisgICAgaWYgKGdUcmFjZURhdGEuaGVhZCA9PSBJTlZBTElEX1RSQUNFX0FERFIpCisgICAgeworICAgICAgICAvKiBmaXJzdCByZWNvcmQgKi8KKyAgICAgICAgZ1RyYWNlRGF0YS5oZWFkID0gMDsKKyAgICAgICAgZ1RyYWNlRGF0YS50YWlsID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogcXVldWUgaXMgbm90IGVtcHR5ICovCisgICAgICAgIHRBTklfVTMyIHRhaWwgPSBnVHJhY2VEYXRhLnRhaWwgKyAxOworCisgICAgICAgIGlmICh0YWlsID09IE1BWF9UUkFDRV9SRUNPUkRTKQorICAgICAgICAgICAgdGFpbCA9IDA7CisKKyAgICAgICAgaWYgKGdUcmFjZURhdGEuaGVhZCA9PSB0YWlsKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmdWxsICovCisgICAgICAgICAgICBpZiAoKytnVHJhY2VEYXRhLmhlYWQgPT0gTUFYX1RSQUNFX1JFQ09SRFMpCisgICAgICAgICAgICAgICAgZ1RyYWNlRGF0YS5oZWFkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGdUcmFjZURhdGEudGFpbCA9IHRhaWw7CisgICAgfQorCisgICAgcmVjID0gJmdUcmFjZVRibFtnVHJhY2VEYXRhLnRhaWxdOworICAgIHJlYy0+Y29kZSA9IGNvZGU7CisgICAgcmVjLT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICByZWMtPmRhdGEgPSBkYXRhOworICAgIHJlYy0+dGltZSA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKKyAgICByZWMtPm1vZHVsZSA9ICBWT1NfTU9EVUxFX0lEX1BFOworICAgIGdUcmFjZURhdGEubnVtU2luY2VMYXN0RHVtcCArKzsKKworICAgIGlmKGdUcmFjZURhdGEubnVtU2luY2VMYXN0RHVtcCA9PSBnVHJhY2VEYXRhLmR1bXBDb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsICJUcmFjZSBEdW1wIGxhc3QgJWQgdHJhY2VzXG4iLCAgZ1RyYWNlRGF0YS5kdW1wQ291bnQpOworICAgICAgICAgICAgbWFjVHJhY2VEdW1wQWxsKHBNYWMsIDAsIDAsIGdUcmFjZURhdGEuZHVtcENvdW50KTsKKyAgICAgICAgICAgIGdUcmFjZURhdGEubnVtU2luY2VMYXN0RHVtcCA9IDA7CisgICAgICAgIH0KKyAgICAjZW5kaWYKKworfQorCisKKwordm9pZCBtYWNUcmFjZU5ldyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IG1vZHVsZSwgdEFOSV9VOCBjb2RlLCB0QU5JX1U4IHNlc3Npb24sIHRBTklfVTMyIGRhdGEpCit7CisgICAgdHBUcmFjZVJlY29yZCByZWMgPSBOVUxMOworCisgICAgLy9saW1Mb2cocE1hYywgTE9HRSwgIm1hYyBUcmFjZSBjb2RlOiAlZCwgZGF0YTogJXgsIGhlYWQ6ICVkLCB0YWlsOiAlZFxuIiwgIGNvZGUsIGRhdGEsIGdUcmFjZURhdGEuaGVhZCwgZ1RyYWNlRGF0YS50YWlsKTsKKworICAgIGlmKCFnVHJhY2VEYXRhLmVuYWJsZSkKKyAgICAgICAgcmV0dXJuOworICAgIC8vSWYgbW9kdWxlIGlzIG5vdCByZWdpc3RlcmVkLCBkb24ndCByZWNvcmQgZm9yIHRoYXQgbW9kdWxlLgorICAgIGlmKHRyYWNlQ0JUYWJsZVttb2R1bGVdID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIAorICAgIGdUcmFjZURhdGEubnVtKys7CisKKyAgICBpZiAoZ1RyYWNlRGF0YS5oZWFkID09IElOVkFMSURfVFJBQ0VfQUREUikKKyAgICB7CisgICAgICAgIC8qIGZpcnN0IHJlY29yZCAqLworICAgICAgICBnVHJhY2VEYXRhLmhlYWQgPSAwOworICAgICAgICBnVHJhY2VEYXRhLnRhaWwgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBxdWV1ZSBpcyBub3QgZW1wdHkgKi8KKyAgICAgICAgdEFOSV9VMzIgdGFpbCA9IGdUcmFjZURhdGEudGFpbCArIDE7CisKKyAgICAgICAgaWYgKHRhaWwgPT0gTUFYX1RSQUNFX1JFQ09SRFMpCisgICAgICAgICAgICB0YWlsID0gMDsKKworICAgICAgICBpZiAoZ1RyYWNlRGF0YS5oZWFkID09IHRhaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZ1bGwgKi8KKyAgICAgICAgICAgIGlmICgrK2dUcmFjZURhdGEuaGVhZCA9PSBNQVhfVFJBQ0VfUkVDT1JEUykKKyAgICAgICAgICAgICAgICBnVHJhY2VEYXRhLmhlYWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgZ1RyYWNlRGF0YS50YWlsID0gdGFpbDsKKyAgICB9CisKKyAgICByZWMgPSAmZ1RyYWNlVGJsW2dUcmFjZURhdGEudGFpbF07CisgICAgcmVjLT5jb2RlID0gY29kZTsKKyAgICByZWMtPnNlc3Npb24gPSBzZXNzaW9uOworICAgIHJlYy0+ZGF0YSA9IGRhdGE7CisgICAgcmVjLT50aW1lID0gKHRBTklfVTE2KXZvc190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKKyAgICByZWMtPm1vZHVsZSA9ICBtb2R1bGU7CisgICAgZ1RyYWNlRGF0YS5udW1TaW5jZUxhc3REdW1wICsrOworCisgICAgaWYoZ1RyYWNlRGF0YS5udW1TaW5jZUxhc3REdW1wID09IGdUcmFjZURhdGEuZHVtcENvdW50KQorICAgICAgICB7CisgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiVHJhY2UgRHVtcCBsYXN0ICVkIHRyYWNlc1xuIiwgIGdUcmFjZURhdGEuZHVtcENvdW50KTsKKyAgICAgICAgICAgICAgbWFjVHJhY2VEdW1wQWxsKHBNYWMsIDAsIDAsIGdUcmFjZURhdGEuZHVtcENvdW50KTsKKyAgICAgICAgICAgICAgZ1RyYWNlRGF0YS5udW1TaW5jZUxhc3REdW1wID0gMDsKKyAgICAgICAgfQorCit9CisKKworCisKKworCisKK3RBTklfVTgqIG1hY1RyYWNlTXNnU3RyaW5nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIG1zZ1R5cGUpCit7CisgICAgdEFOSV9VMTYgbXNnSWQgPSAodEFOSV9VMTYpTUFDX1RSQUNFX0dFVF9NU0dfSUQobXNnVHlwZSk7CisgICAgdEFOSV9VOCBtb2R1bGVJZCA9ICh0QU5JX1U4KU1BQ19UUkFDRV9HRVRfTU9EVUxFX0lEKG1zZ1R5cGUpOworCisgICAgc3dpdGNoKG1vZHVsZUlkKQorICAgIHsKKyAgICAgICAgY2FzZSBTSVJfTElNX01PRFVMRV9JRDoKKyAgICAgICAgICAgIGlmKG1zZ0lkID49IFNJUl9MSU1fSVRDX01TR19UWVBFU19CRUdJTikKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFjVHJhY2VHZXRMaW1Nc2dTdHJpbmcoKHRBTklfVTE2KW1zZ1R5cGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBtYWNUcmFjZUdldFNtZU1zZ1N0cmluZygodEFOSV9VMTYpbXNnVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSVJfSEFMX01PRFVMRV9JRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFjVHJhY2VHZXRIYWxNc2dTdHJpbmcoKHRBTklfVTE2KW1zZ1R5cGUpOworICAgICAgICBjYXNlIFNJUl9DRkdfTU9EVUxFX0lEOgorICAgICAgICAgICAgICAgIHJldHVybiBtYWNUcmFjZUdldENmZ01zZ1N0cmluZygodEFOSV9VMTYpbXNnVHlwZSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICgodEFOSV9VOCopIlVua25vd24gTXNnVHlwZSIpOworICAgIH0KK30KKworCisKKworCisKK3ZvaWQgbWFjVHJhY2VEdW1wQWxsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggY29kZSwgdEFOSV9VOCBzZXNzaW9uLCB0QU5JX1UzMiBjb3VudCkKK3sKKyAgICB0cFRyYWNlUmVjb3JkIHBSZWNvcmQ7CisgICAgdEFOSV9TMzIgaSwgdGFpbDsKKworCisgICAgaWYoIWdUcmFjZURhdGEuZW5hYmxlKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiVHJhY2luZyBEaXNhYmxlZCBcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG90YWwgUmVjb3JkczogJWQsIEhlYWQ6ICVkLCBUYWlsOiAlZFxuIiwgZ1RyYWNlRGF0YS5udW0sIGdUcmFjZURhdGEuaGVhZCwgZ1RyYWNlRGF0YS50YWlsKTsKKworICAgIGlmIChnVHJhY2VEYXRhLmhlYWQgIT0gSU5WQUxJRF9UUkFDRV9BRERSKQorICAgIHsKKworICAgICAgICBpID0gZ1RyYWNlRGF0YS5oZWFkOworICAgICAgICB0YWlsID0gZ1RyYWNlRGF0YS50YWlsOworCisgICAgICAgIGlmIChjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvdW50ID4gZ1RyYWNlRGF0YS5udW0pCisgICAgICAgICAgICAgICAgY291bnQgPSBnVHJhY2VEYXRhLm51bTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IE1BWF9UUkFDRV9SRUNPUkRTKQorICAgICAgICAgICAgICAgIGNvdW50ID0gTUFYX1RSQUNFX1JFQ09SRFM7CisgICAgICAgICAgICBpZih0YWlsID49IChjb3VudCArIDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgPSB0YWlsIC0gY291bnQgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgPSBNQVhfVFJBQ0VfUkVDT1JEUyAtICgoY291bnQgKyAxKSAtIHRhaWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcFJlY29yZCA9ICZnVHJhY2VUYmxbaV07CisKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAgIChjb2RlID09IDAgfHwgKGNvZGUgPT0gcFJlY29yZC0+Y29kZSkpICYmCisgICAgICAgICAgICAgICAgICAgICh0cmFjZUNCVGFibGVbcFJlY29yZC0+bW9kdWxlXSAhPSBOVUxMKSkKKyAgICAgICAgICAgICAgICB0cmFjZUNCVGFibGVbcFJlY29yZC0+bW9kdWxlXShwTWFjLCBwUmVjb3JkLCAodEFOSV9VMTYpaSk7CisKKyAgICAgICAgICAgIGlmIChpID09IHRhaWwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpICs9IDE7CisKKyAgICAgICAgICAgIGlmIChpID09IE1BWF9UUkFDRV9SRUNPUkRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIHBSZWNvcmQgPSAmZ1RyYWNlVGJsWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBSZWNvcmQgKz0gMTsKKyAgICAgICAgfQorICAgICAgICBnVHJhY2VEYXRhLm51bVNpbmNlTGFzdER1bXAgPSAwOworIAorICAgIH0KKworfQorCisKK3ZvaWQgbWFjVHJhY2VDZmcodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgZW5hYmxlLCB0QU5JX1UzMiBkdW1wQ291bnQsIHRBTklfVTMyIGNvZGUsIHRBTklfVTMyIHNlc3Npb24pCit7CisgICAgZ1RyYWNlRGF0YS5lbmFibGUgPSAodEFOSV9VOCllbmFibGU7CisgICAgZ1RyYWNlRGF0YS5kdW1wQ291bnQ9ICh0QU5JX1UxNilkdW1wQ291bnQ7CisgICAgZ1RyYWNlRGF0YS5udW1TaW5jZUxhc3REdW1wID0gMDsKK30KKwordm9pZCBtYWNUcmFjZVJlZ2lzdGVyKCB0cEFuaVNpckdsb2JhbCBwTWFjLCBWT1NfTU9EVUxFX0lEIG1vZHVsZUlkLCAgICB0cFRyYWNlQ2IgdHJhY2VDYikKK3sKKyAgICB0cmFjZUNCVGFibGVbbW9kdWxlSWRdID0gdHJhY2VDYjsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvU1lTL2xlZ2FjeS9zcmMvdXRpbHMvc3JjL3BhcnNlckFwaS5jIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9zcmMvcGFyc2VyQXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkMjczMAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvU1lTL2xlZ2FjeS9zcmMvdXRpbHMvc3JjL3BhcnNlckFwaS5jCkBAIC0wLDAgKzEsNDQ1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBBaXJnbyBOZXR3b3JrcywgSW5jIHByb3ByaWV0YXJ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIHBhcnNlckFwaS5jYyBjb250YWlucyB0aGUgY29kZSBmb3IgcGFyc2luZworICogODAyLjExIG1lc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgUGllcnJlIFZhbmR3YWxsZQorICogRGF0ZTogICAgICAgICAgMDMvMTgvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAic2lyQXBpLmgiCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAicGFyc2VyQXBpLmgiCisjaW5jbHVkZSAiY2ZnQXBpLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlsc1BhcnNlci5oIgorI2luY2x1ZGUgImxpbVNlckRlc1V0aWxzLmgiCisjaW5jbHVkZSAic2NoQXBpLmgiCisjaW5jbHVkZSAicGFsQXBpLmgiCisjaW5jbHVkZSAid21tQXBzZC5oIgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorI2luY2x1ZGUgInJybUFwaS5oIgorI2VuZGlmCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3ZvaWQgZG90MTFmTG9nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIGludCBsb2dsZXZlbCwgY29uc3QgY2hhciAqcFN0cmluZywuLi4pIAoreworI2lmZGVmIFdMQU5fREVCVUcKKyAgICBpZiggKHRBTklfVTMyKWxvZ2xldmVsID4gcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW0xPR19JTkRFWF9GT1JfTU9EVUxFKCBTSVJfREJHX01PRFVMRV9JRCApXSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZhX2xpc3QgICAgICAgICBtYXJrZXI7CisKKyAgICAgICAgdmFfc3RhcnQoIG1hcmtlciwgcFN0cmluZyApOyAgICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZSBhcmd1bWVudHMuICovCisKKyAgICAgICAgbG9nRGVidWcocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIGxvZ2xldmVsLCBwU3RyaW5nLCBtYXJrZXIpOworCisgICAgICAgIHZhX2VuZCggbWFya2VyICk7ICAgICAgICAgICAgICAvKiBSZXNldCB2YXJpYWJsZSBhcmd1bWVudHMuICAgICAgKi8KKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorc3dhcEJpdEZpZWxkMTYodEFOSV9VMTYgaW4sIHRBTklfVTE2ICpvdXQpCit7CisjICAgaWZkZWYgQU5JX0xJVFRMRV9CSVRfRU5ESUFOCisgICAgKm91dCA9IGluOworIyAgIGVsc2UgLy8gQmlnLUVuZGlhbi4uLgorICAgICpvdXQgPSAoICggaW4gJiAweDgwMDAgKSA+PiAxNSApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHg0MDAwICkgPj4gMTMgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MjAwMCApID4+IDExICkgfAorICAgICAgICAgICAoICggaW4gJiAweDEwMDAgKSA+PiAgOSApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwODAwICkgPj4gIDcgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDQwMCApID4+ICA1ICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAyMDAgKSA+PiAgMyApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMTAwICkgPj4gIDEgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDA4MCApIDw8ICAxICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwNDAgKSA8PCAgMyApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMDIwICkgPDwgIDUgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDAxMCApIDw8ICA3ICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwMDggKSA8PCAgOSApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMDA0ICkgPDwgMTEgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDAwMiApIDw8IDEzICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwMDEgKSA8PCAxNSApOworIyAgIGVuZGlmIC8vIEFOSV9MSVRUTEVfQklUX0VORElBTgorfQorCit2b2lkCitzd2FwQml0RmllbGQzMih0QU5JX1UzMiBpbiwgdEFOSV9VMzIgKm91dCkKK3sKKyMgICBpZmRlZiBBTklfTElUVExFX0JJVF9FTkRJQU4KKyAgICAqb3V0ID0gaW47CisjICAgZWxzZSAvLyBCaWctRW5kaWFuLi4uCisgICAgKm91dCA9ICggKCBpbiAmIDB4ODAwMDAwMDAgKSA+PiAzMSApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHg0MDAwMDAwMCApID4+IDI5ICkgfAorICAgICAgICAgICAoICggaW4gJiAweDIwMDAwMDAwICkgPj4gMjcgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MTAwMDAwMDAgKSA+PiAyNSApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwODAwMDAwMCApID4+IDIzICkgfAorICAgICAgICAgICAoICggaW4gJiAweDA0MDAwMDAwICkgPj4gMjEgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDIwMDAwMDAgKSA+PiAxOSApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMTAwMDAwMCApID4+IDE3ICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwODAwMDAwICkgPj4gMTUgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDA0MDAwMDAgKSA+PiAxMyApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMDIwMDAwMCApID4+IDExICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwMTAwMDAwICkgPj4gIDkgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDAwODAwMDAgKSA+PiAgNyApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMDA0MDAwMCApID4+ICA1ICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwMDIwMDAwICkgPj4gIDMgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDAwMTAwMDAgKSA+PiAgMSApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMDAwODAwMCApIDw8ICAxICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwMDA0MDAwICkgPDwgIDMgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDAwMDIwMDAgKSA8PCAgNSApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMDAwMTAwMCApIDw8ICA3ICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwMDAwODAwICkgPDwgIDkgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDAwMDA0MDAgKSA8PCAxMSApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMDAwMDIwMCApIDw8IDEzICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwMDAwMTAwICkgPDwgMTUgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDAwMDAwODAgKSA8PCAxNyApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMDAwMDA0MCApIDw8IDE5ICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwMDAwMDIwICkgPDwgMjEgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDAwMDAwMTAgKSA8PCAyMyApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMDAwMDAwOCApIDw8IDI1ICkgfAorICAgICAgICAgICAoICggaW4gJiAweDAwMDAwMDA0ICkgPDwgMjcgKSB8CisgICAgICAgICAgICggKCBpbiAmIDB4MDAwMDAwMDIgKSA8PCAyOSApIHwKKyAgICAgICAgICAgKCAoIGluICYgMHgwMDAwMDAwMSApIDw8IDMxICk7CisjICAgZW5kaWYgLy8gQU5JX0xJVFRMRV9CSVRfRU5ESUFOCit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBfX3ByaW50V01NUGFyYW1zKHRwQW5pU2lyR2xvYmFsICBwTWFjLCB0RG90MTFmSUVXTU1QYXJhbXMgKnBXbW0pCit7CisgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJXTU0gUGFyYW1ldGVycyBSZWNlaXZlZDogXG4iKSk7CisgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJCRTogYWlmc24gJWQsIGFjbSAlZCwgYWNpICVkLCBjd21pbiAlZCwgY3dtYXggJWQsIHR4b3AgJWQgXG4iKSwKKyAgICAgICAgICAgcFdtbS0+YWNiZV9haWZzbiwgcFdtbS0+YWNiZV9hY20sIHBXbW0tPmFjYmVfYWNpLCBwV21tLT5hY2JlX2Fjd21pbiwgcFdtbS0+YWNiZV9hY3dtYXgsIHBXbW0tPmFjYmVfdHhvcGxpbWl0KTsKKworICAgIGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiQks6IGFpZnNuICVkLCBhY20gJWQsIGFjaSAlZCwgY3dtaW4gJWQsIGN3bWF4ICVkLCB0eG9wICVkIFxuIiksCisgICAgICAgICAgIHBXbW0tPmFjYmtfYWlmc24sIHBXbW0tPmFjYmtfYWNtLCBwV21tLT5hY2JrX2FjaSwgcFdtbS0+YWNia19hY3dtaW4sIHBXbW0tPmFjYmtfYWN3bWF4LCBwV21tLT5hY2JrX3R4b3BsaW1pdCk7CisKKyAgICBsaW1Mb2cocE1hYywgTE9HMSwgRkwoIlZJOiBhaWZzbiAlZCwgYWNtICVkLCBhY2kgJWQsIGN3bWluICVkLCBjd21heCAlZCwgdHhvcCAlZCBcbiIpLAorICAgICAgICAgICBwV21tLT5hY3ZpX2FpZnNuLCBwV21tLT5hY3ZpX2FjbSwgcFdtbS0+YWN2aV9hY2ksIHBXbW0tPmFjdmlfYWN3bWluLCBwV21tLT5hY3ZpX2Fjd21heCwgcFdtbS0+YWN2aV90eG9wbGltaXQpOworCisgICAgbGltTG9nKHBNYWMsIExPRzEsIEZMKCJWTzogYWlmc24gJWQsIGFjbSAlZCwgYWNpICVkLCBjd21pbiAlZCwgY3dtYXggJWQsIHR4b3AgJWQgXG4iKSwKKyAgICAgICAgICAgcFdtbS0+YWN2b19haWZzbiwgcFdtbS0+YWN2b19hY20sIHBXbW0tPmFjdm9fYWNpLCBwV21tLT5hY3ZvX2Fjd21pbiwgcFdtbS0+YWN2b19hY3dtYXgsIHBXbW0tPmFjdm9fdHhvcGxpbWl0KTsKKworICAgIHJldHVybjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGdW5jdGlvbnMgZm9yIHBvcHVsYXRpbmcgImRvdDExZiIgc3R5bGUgSUVzCisKKworLy8gcmV0dXJuOiA+PSAwLCB0aGUgc3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIElFIGluIHJzbklFZGF0YSBpbnNpZGUgdFNpclJTTmllCisvLyAgICAgICAgIDwgMCwgY2Fubm90IGZpbmQKK2ludCBGaW5kSUVMb2NhdGlvbiggdHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUlNOaWUgcFJzbkllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCBFSUQpCit7CisgICAgaW50IGlkeCwgaWVMZW4sIGJ5dGVzTGVmdDsKKworICAgIC8vIEhlcmUncyB3aGF0J3MgZ29pbmcgb246ICdyc25JZScgbG9va3MgbGlrZSB0aGlzOgorCisgICAgLy8gICAgIHR5cGVkZWYgc3RydWN0IHNTaXJSU05pZQorICAgIC8vICAgICB7CisgICAgLy8gICAgICAgICB0QU5JX1UxNiAgICAgICBsZW5ndGg7CisgICAgLy8gICAgICAgICB0QU5JX1U4ICAgICAgICByc25JRWRhdGFbU0lSX01BQ19NQVhfSUVfTEVOR1RIKzJdOworICAgIC8vICAgICB9IHRTaXJSU05pZSwgKnRwU2lyUlNOaWU7CisKKyAgICAvLyBvdGhlciBjb2RlIHJlY29yZHMgYm90aCB0aGUgV1BBICYgUlNOIElFcyAoaW5jbHVkaW5nIHRoZWlyIEVJRHMgJgorICAgIC8vIGxlbmd0aHMpIGludG8gdGhlIGFycmF5ICdyc25JRWRhdGEnLiAgV2UgbWF5IGhhdmU6CisKKyAgICAvLyAgICAgV2l0aCBXQVBJIHN1cHBvcnQsIHRoZXJlIG1heSBiZSAzIElFcyBoZXJlCisgICAgLy8gICAgIEl0IGNhbiBiZSBvbmx5IFdQQSBJRSwgb3Igb25seSBSU04gSUUgb3Igb25seSBXQVBJIElFCisgICAgLy8gICAgIE9yIHR3byBvciBhbGwgdGhyZWUgb2YgdGhlbSB3aXRoIG5vIHBhcnRpY3VsYXIgb3JkZXJpbmcKKworICAgIC8vIFRoZSBpZi90aGVuL2Vsc2Ugc3RhdGVtZW50cyB0aGF0IGZvbGxvdyBhcmUgaGVyZSB0byBmaWd1cmUgb3V0CisgICAgLy8gd2hldGhlciB3ZSBoYXZlIHRoZSBXUEEgSUUsIGFuZCB3aGVyZSBpdCBpcyBpZiB3ZSAqZG8qIGhhdmUgaXQuCisKKyAgICAvL1NhdmUgdGhlIGZpcnN0IElFIGxlbmd0aCAKKyAgICBpZUxlbiA9IHBSc25JZS0+cnNuSUVkYXRhWyAxIF0gKyAyOworICAgIGlkeCA9IDA7CisgICAgYnl0ZXNMZWZ0ID0gcFJzbkllLT5sZW5ndGg7CisKKyAgICB3aGlsZSggMSApCisgICAgeworICAgICAgICBpZiAoIEVJRCA9PSBwUnNuSWUtPnJzbklFZGF0YVsgaWR4IF0gKQorICAgICAgICB7CisgICAgICAgICAgICAvL0ZvdW5kIGl0CisgICAgICAgICAgICByZXR1cm4gKGlkeCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIEVJRCAhPSBwUnNuSWUtPnJzbklFZGF0YVsgaWR4IF0gJiYKKyAgICAgICAgICAgICAvLyAmIGlmIG5vIG1vcmUgSUUsIAorICAgICAgICAgICAgIGJ5dGVzTGVmdCA8PSAodEFOSV9VMTYpKCBpZUxlbiApICkKKyAgICAgICAgeworICAgICAgICAgICAgZG90MTFmTG9nKCBwTWFjLCBMT0czLCBGTCgiTm8gSUUgKCVkKSBpbiBGaW5kSUVMb2NhdGlvbi5cbiIpLCBFSUQgKTsKKyAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICB9CisgICAgICAgIGJ5dGVzTGVmdCAtPSBpZUxlbjsKKyAgICAgICAgaWVMZW4gPSBwUnNuSWUtPnJzbklFZGF0YVsgaWR4ICsgMSBdICsgMjsKKyAgICAgICAgaWR4ICs9IGllTGVuOworICAgIH0KKworICAgIHJldHVybiAoLTEpOworfQorCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmQ2FwYWJpbGl0aWVzKHRwQW5pU2lyR2xvYmFsICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZkNhcGFiaWxpdGllcyAqcERvdDExZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uICAgICAgICAgICAgcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgICAgY2ZnOworICAgIHRTaXJSZXRTdGF0dXMgblNpclN0YXR1czsKKworICAgIG5TaXJTdGF0dXMgPSBjZmdHZXRDYXBhYmlsaXR5SW5mbyggcE1hYywgJmNmZyxwc2Vzc2lvbkVudHJ5ICk7CisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gblNpclN0YXR1cyApCisgICAgeworICAgICAgICBkb3QxMWZMb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gcmV0cmlldmUgdGhlIENhcGFiaWxpdGllcyBiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGZpZWxkIGZyb20gQ0ZHICglZCkuXG4iKSwgblNpclN0YXR1cyApOworICAgICAgICByZXR1cm4gblNpclN0YXR1czsKKyAgICB9CisKKyNpZiAwCisgICAgaWYgKCBzaXJJc1Byb3BDYXBhYmlsaXR5RW5hYmxlZCggcE1hYywgU0lSX01BQ19QUk9QX0NBUEFCSUxJVFlfMTFFUU9TICkgKQorICAgIHsKKyAgICAgICAgU0lSX01BQ19DTEVBUl9DQVBBQklMSVRZKCBjZmcsIFFPUyApOworICAgIH0KKyNlbmRpZgorICAgIHN3YXBCaXRGaWVsZDE2KCBjZmcsICggdEFOSV9VMTYqIClwRG90MTFmICk7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZDYXBhYmlsaXRpZXMuCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmQ2FwYWJpbGl0aWVzMih0cEFuaVNpckdsb2JhbCAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZkZmQ2FwYWJpbGl0aWVzICpwRG90MTFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwRHBoSGFzaE5vZGUgICAgICAgICAgcFN0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gICAgICAgICAgICBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTE2ICAgICAgICAgICBjZmc7CisgICAgdFNpclJldFN0YXR1cyBuU2lyU3RhdHVzOworICAgIG5TaXJTdGF0dXMgPSBjZmdHZXRDYXBhYmlsaXR5SW5mbyggcE1hYywgJmNmZyAscHNlc3Npb25FbnRyeSk7CisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gblNpclN0YXR1cyApCisgICAgeworICAgICAgICBkb3QxMWZMb2coIHBNYWMsIExPR1AsIEZMKCJGYWlsZWQgdG8gcmV0cmlldmUgdGhlIENhcGFiaWxpdGllcyBiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGZpZWxkIGZyb20gQ0ZHICglZCkuXG4iKSwgblNpclN0YXR1cyApOworICAgICAgICByZXR1cm4gblNpclN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoICggTlVMTCAhPSBwU3RhICkgJiYgcFN0YS0+YW5pUGVlciAmJgorICAgICAgICAgUFJPUF9DQVBBQklMSVRZX0dFVCggMTFFUU9TLCBwU3RhLT5wcm9wQ2FwYWJpbGl0eSApICkKKyAgICB7CisgICAgICAgIFNJUl9NQUNfQ0xFQVJfQ0FQQUJJTElUWSggY2ZnLCBRT1MgKTsKKyAgICB9CisKKyAgICBzd2FwQml0RmllbGQxNiggY2ZnLCAoIHRBTklfVTE2KiApcERvdDExZiApOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZDYXBhYmlsaXRpZXMyLgorCit2b2lkCitQb3B1bGF0ZURvdDExZkNoYW5Td2l0Y2hBbm4odHBBbmlTaXJHbG9iYWwgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDaGFuU3dpdGNoQW5uICpwRG90MTFmKQoreworICAgIHBEb3QxMWYtPnN3aXRjaE1vZGUgPSBwTWFjLT5saW0uZ0xpbUNoYW5uZWxTd2l0Y2guc3dpdGNoTW9kZTsKKyAgICBwRG90MTFmLT5uZXdDaGFubmVsID0gcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnByaW1hcnlDaGFubmVsOworICAgIHBEb3QxMWYtPnN3aXRjaENvdW50ID0gKCB0QU5JX1U4ICkgcE1hYy0+bGltLmdMaW1DaGFubmVsU3dpdGNoLnN3aXRjaENvdW50OworCisgICAgcERvdDExZi0+cHJlc2VudCA9IDE7Cit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZkNoYW5Td2l0Y2hBbm4uCisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmRXh0Q2hhblN3aXRjaEFubih0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUV4dENoYW5Td2l0Y2hBbm4gKnBEb3QxMWYpCit7CisgICAgLy9IYXMgdG8gYmUgdXBkYXRlZCBvbiB0aGUgY2Igc3RhdGUgYmFzaXMKKyAgICBwRG90MTFmLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gCisgICAgICAgICAgICAgbGltR2V0SFRDQlN0YXRlKHBNYWMtPmxpbS5nTGltQ2hhbm5lbFN3aXRjaC5zZWNvbmRhcnlTdWJCYW5kKTsKKworICAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworfQorCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZkNvdW50cnkodHBBbmlTaXJHbG9iYWwgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDb3VudHJ5ICpwRG90MTFmLAorICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgIGxlbiwgbWF4bGVuLCBjb2RlbGVuOworICAgIHRBTklfVTE2ICAgICAgICAgICBpdGVtOworICAgIHRTaXJSZXRTdGF0dXMgblNpclN0YXR1czsKKyAgICB0U2lyUkZCYW5kICAgICAgICAgcmZCYW5kOworICAgIHRBTklfVTggICAgICAgICAgICB0ZW1wW0NGR19NQVhfU1RSX0xFTl0sIGNvZGVbM107CisKKyAgICBpZiAocHNlc3Npb25FbnRyeS0+bGltMTFkRW5hYmxlZCApCisgICAgeworICAgICAgICBsaW1HZXRSZkJhbmQocE1hYywgJnJmQmFuZCwgcHNlc3Npb25FbnRyeSk7CisgICAgICAgIGlmIChyZkJhbmQgPT0gU0lSX0JBTkRfNV9HSFopCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZW0gICA9IFdOSV9DRkdfTUFYX1RYX1BPV0VSXzU7CisgICAgICAgICAgICBtYXhsZW4gPSBXTklfQ0ZHX01BWF9UWF9QT1dFUl81X0xFTjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZW0gICA9IFdOSV9DRkdfTUFYX1RYX1BPV0VSXzJfNDsKKyAgICAgICAgICAgIG1heGxlbiA9IFdOSV9DRkdfTUFYX1RYX1BPV0VSXzJfNF9MRU47CisgICAgICAgIH0KKworICAgICAgICBDRkdfR0VUX1NUUiggblNpclN0YXR1cywgcE1hYywgaXRlbSwgdGVtcCwgbGVuLCBtYXhsZW4gKTsKKworICAgICAgICBpZiAoIDMgPiBsZW4gKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBubyBsaW1pdCBvbiB0eCBwb3dlciwgY2Fubm90IGluY2x1ZGUgdGhlIElFIGJlY2F1c2UgYXQgbGVhc3QKKyAgICAgICAgICAgIC8vIG9uZSAoY2hhbm5lbCxudW0sdHggcG93ZXIpIG11c3QgYmUgcHJlc2VudAorICAgICAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgfQorCisgICAgICAgIENGR19HRVRfU1RSKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0NPVU5UUllfQ09ERSwKKyAgICAgICAgICAgICAgICAgICAgIGNvZGUsIGNvZGVsZW4sIDMgKTsKKworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRG90MTFmLT5jb3VudHJ5LCBjb2RlLCBjb2RlbGVuICk7CisKKyAgICAgICAgaWYobGVuID4gTUFYX1NJWkVfT0ZfVFJJUExFVFNfSU5fQ09VTlRSWV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgZG90MTFmTG9nKCBwTWFjLCBMT0dFLCBGTCgibGVuOiVkIGlzIG91dCBvZiBib3VuZHMsIHJlc2V0dGluZy5cbiIpLCBsZW4pOworICAgICAgICAgICAgbGVuID0gTUFYX1NJWkVfT0ZfVFJJUExFVFNfSU5fQ09VTlRSWV9JRTsKKyAgICAgICAgfQorCisgICAgICAgIHBEb3QxMWYtPm51bV90cmlwbGV0cyA9ICggdEFOSV9VOCApICggbGVuIC8gMyApOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqIClwRG90MTFmLT50cmlwbGV0cywgdGVtcCwgbGVuICk7CisKKyAgICAgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmQ291bnRyeS4KKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZEU1BhcmFtcyh0cEFuaVNpckdsb2JhbCAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRFNQYXJhbXMgKnBEb3QxMWYsIHRBTklfVTggY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKy8vICAgIHRTaXJSZXRTdGF0dXMgICAgICAgblNpclN0YXR1czsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgIG5QaHlNb2RlOworCisgICAgLy8gR2V0IFBIWSBtb2RlIGFuZCBiYXNlZCBvbiB0aGF0IGFkZCBEUyBQYXJhbWV0ZXIgU2V0IElFCisgICAgbGltR2V0UGh5TW9kZShwTWFjLCAmblBoeU1vZGUsIHBzZXNzaW9uRW50cnkpOworCisgICAgaWYgKCBXTklfQ0ZHX1BIWV9NT0RFXzExQSAhPSBuUGh5TW9kZSApCisgICAgeworICAgICAgICAvLyAuMTFiL2cgbW9kZSBQSFkgPT4gSW5jbHVkZSB0aGUgRFMgUGFyYW1ldGVyIFNldCBJRToKKyAgICAgICAgI2lmIDAKKyAgICAgICAgQ0ZHX0dFVF9JTlQoIG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMLCBjZmcgKTsKKyAgICAgICAgI2VuZGlmIC8vVE8gU1VQUE9SVCBCVC1BTVAKKyAgICAgICAgcERvdDExZi0+Y3Vycl9jaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmRFNQYXJhbXMuCisKKyNkZWZpbmUgU0VUX0FJRlNOKGFpZnNuKSAoKChhaWZzbikgPCAyKSA/IDIgOiAoYWlmc24pKQorCisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmRURDQVBhcmFtU2V0KHRwQW5pU2lyR2xvYmFsICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUVEQ0FQYXJhbVNldCAqcERvdDExZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworCisgICAgaWYgKCAgcHNlc3Npb25FbnRyeS0+bGltUW9zRW5hYmxlZCApCisgICAgeworICAgICAgICAvL2NoYW5nZSB0byBiaXR3aXNlIG9wZXJhdGlvbiwgYWZ0ZXIgdGhpcyBpcyBmaXhlZCBpbiBmcmFtZXMuCisgICAgICAgIHBEb3QxMWYtPnFvcyA9ICh0QU5JX1U4KSgweGYwICYgKHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1TZXRDb3VudCA8PCA0KSApOworCisgICAgICAgIC8vIEZpbGwgZWFjaCBFRENBIHBhcmFtZXRlciBzZXQgaW4gb3JkZXI6IGJlLCBiaywgdmksIHZvCisgICAgICAgIHBEb3QxMWYtPmFjYmVfYWlmc24gICAgID0gKCAweGYgJiBTRVRfQUlGU04ocHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1swXS5hY2kuYWlmc24pICk7CisgICAgICAgIHBEb3QxMWYtPmFjYmVfYWNtICAgICAgID0gKCAweDEgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzBdLmFjaS5hY20gKTsKKyAgICAgICAgcERvdDExZi0+YWNiZV9hY2kgICAgICAgPSAoIDB4MyAmIFNJUl9NQUNfRURDQUFDSV9CRVNURUZGT1JUICk7CisgICAgICAgIHBEb3QxMWYtPmFjYmVfYWN3bWluICAgID0gKCAweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzBdLmN3Lm1pbiApOworICAgICAgICBwRG90MTFmLT5hY2JlX2Fjd21heCAgICA9ICggMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1swXS5jdy5tYXggKTsKKyAgICAgICAgcERvdDExZi0+YWNiZV90eG9wbGltaXQgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzBdLnR4b3BsaW1pdDsKKworICAgICAgICBwRG90MTFmLT5hY2JrX2FpZnNuICAgICA9ICggMHhmICYgU0VUX0FJRlNOKHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMV0uYWNpLmFpZnNuKSApOworICAgICAgICBwRG90MTFmLT5hY2JrX2FjbSAgICAgICA9ICggMHgxICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS5hY2kuYWNtICk7CisgICAgICAgIHBEb3QxMWYtPmFjYmtfYWNpICAgICAgID0gKCAweDMgJiBTSVJfTUFDX0VEQ0FBQ0lfQkFDS0dST1VORCApOworICAgICAgICBwRG90MTFmLT5hY2JrX2Fjd21pbiAgICA9ICggMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS5jdy5taW4gKTsKKyAgICAgICAgcERvdDExZi0+YWNia19hY3dtYXggICAgPSAoIDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMV0uY3cubWF4ICk7CisgICAgICAgIHBEb3QxMWYtPmFjYmtfdHhvcGxpbWl0ID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS50eG9wbGltaXQ7CisKKyAgICAgICAgcERvdDExZi0+YWN2aV9haWZzbiAgICAgPSAoIDB4ZiAmIFNFVF9BSUZTTihwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzJdLmFjaS5haWZzbikgKTsKKyAgICAgICAgcERvdDExZi0+YWN2aV9hY20gICAgICAgPSAoIDB4MSAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMl0uYWNpLmFjbSApOworICAgICAgICBwRG90MTFmLT5hY3ZpX2FjaSAgICAgICA9ICggMHgzICYgU0lSX01BQ19FRENBQUNJX1ZJREVPICk7CisgICAgICAgIHBEb3QxMWYtPmFjdmlfYWN3bWluICAgID0gKCAweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzJdLmN3Lm1pbiApOworICAgICAgICBwRG90MTFmLT5hY3ZpX2Fjd21heCAgICA9ICggMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1syXS5jdy5tYXggKTsKKyAgICAgICAgcERvdDExZi0+YWN2aV90eG9wbGltaXQgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzJdLnR4b3BsaW1pdDsKKworICAgICAgICBwRG90MTFmLT5hY3ZvX2FpZnNuICAgICA9ICggMHhmICYgU0VUX0FJRlNOKHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbM10uYWNpLmFpZnNuKSApOworICAgICAgICBwRG90MTFmLT5hY3ZvX2FjbSAgICAgICA9ICggMHgxICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1szXS5hY2kuYWNtICk7CisgICAgICAgIHBEb3QxMWYtPmFjdm9fYWNpICAgICAgID0gKCAweDMgJiBTSVJfTUFDX0VEQ0FBQ0lfVk9JQ0UgKTsKKyAgICAgICAgcERvdDExZi0+YWN2b19hY3dtaW4gICAgPSAoIDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbM10uY3cubWluICk7CisgICAgICAgIHBEb3QxMWYtPmFjdm9fYWN3bWF4ICAgID0gKCAweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzNdLmN3Lm1heCApOworICAgICAgICBwRG90MTFmLT5hY3ZvX3R4b3BsaW1pdCA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbM10udHhvcGxpbWl0OworCisgICAgICAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworICAgIH0KKworfSAvLyBFbmQgUG9wbHVhdGVEb3QxMWZFRENBUGFyYW1TZXQuCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmRVJQSW5mbyh0cEFuaVNpckdsb2JhbCAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUVSUEluZm8gKnBEb3QxMWYsCisgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gICAgcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisgICAgdEFOSV9VMzIgICAgICAgICAgICB2YWw7CisgICAgdFNpclJGQmFuZCAgICAgICAgICByZkJhbmQgPSBTSVJfQkFORF9VTktOT1dOOworCisgICAgbGltR2V0UmZCYW5kKHBNYWMsICZyZkJhbmQsIHBzZXNzaW9uRW50cnkpOworICAgIGlmKFNJUl9CQU5EXzJfNF9HSFogPT0gcmZCYW5kKQorICAgIHsKKyAgICAgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisKKyAgICAgICAgdmFsICA9IHBzZXNzaW9uRW50cnktPmNmZ1Byb3RlY3Rpb24uZnJvbWxsYjsKKyAgICAgICAgaWYoIXZhbCApeworICAgICAgICAgICAgZG90MTFmTG9nKCBwTWFjLCBMT0dFLCBGTCgiMTFCIHByb3RlY3Rpb24gbm90IGVuYWJsZWQuIE5vdCBwb3B1bGF0aW5nIEVSUCBJRSAlZFxuIiApLHZhbCApOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwc2Vzc2lvbkVudHJ5LT5nTGltMTFiUGFyYW1zLnByb3RlY3Rpb25FbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBwRG90MTFmLT5ub25fZXJwX3ByZXNlbnQgPSAxOworICAgICAgICAgICAgcERvdDExZi0+dXNlX3Byb3QgICAgICAgID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcHNlc3Npb25FbnRyeS0+Z0xpbU9sYmNQYXJhbXMucHJvdGVjdGlvbkVuYWJsZWQgKQorICAgICAgICB7CisgICAgICAgICAgICAvL0ZJWE1FX1BST1RFQ1RJT046IHdlIHNob3VsZCBiZSBzZXR0aW5nIG5vbl9lcnAgcHJlc2VudCBhbHNvLgorICAgICAgICAgICAgLy9jaGVjayB0aGUgdGVzdCBwbGFuIGZpcnN0LgorICAgICAgICAgICAgcERvdDExZi0+dXNlX3Byb3QgPSAxOworICAgICAgICB9CisKKworICAgICAgICBpZigocHNlc3Npb25FbnRyeS0+Z0xpbU5vU2hvcnRQYXJhbXMubnVtTm9uU2hvcnRQcmVhbWJsZVN0YSkgCisgICAgICAgICAgICAgICAgIHx8ICFwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGUpeyAKKyAgICAgICAgICAgICAgICBwRG90MTFmLT5iYXJrZXJfcHJlYW1ibGUgPSAxOworICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgcHJvdGVjdGlvbiBhbHdheXMgZmxhZyBpcyBzZXQsIGFkdmVydGlzZSBwcm90ZWN0aW9uIGVuYWJsZWQKKyAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiBsZWdhY3kgc3RhdGlvbnMgcHJlc2VuY2UKKyAgICAgICAgQ0ZHX0dFVF9JTlQoIG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfMTFHX1BST1RFQ1RJT05fQUxXQVlTLCB2YWwgKTsKKworICAgICAgICBpZiAoIHZhbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEb3QxMWYtPnVzZV9wcm90ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZkVSUEluZm8uCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmRXh0U3VwcFJhdGVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTggbkNoYW5uZWxOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVFeHRTdXBwUmF0ZXMgKnBEb3QxMWYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisgICAgdEFOSV9VMzIgICAgICAgICAgIG5SYXRlcyA9IDA7CisgICAgdEFOSV9VOCAgICAgICAgICAgIHJhdGVzW1dOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVRfTEVOXTsKKworICAgLyogVXNlIHRoZSBleHQgcmF0ZXMgcHJlc2VudCBpbiBzZXNzaW9uIGVudHJ5IHdoZW5ldmVyIG5DaGFubmVsTnVtIGlzIHNldCB0byBPUEVSQVRJT05BTAorICAgICAgIGVsc2UgdXNlIHRoZSBleHQgc3VwcG9ydGVkIHJhdGUgc2V0IGZyb20gQ0ZHLCB3aGljaCBpcyBmaXhlZCBhbmQgZG9lcyBub3QgY2hhbmdlIGR5bmFtaWNhbGx5IGFuZCBpcyB1c2VkIGZvcgorICAgICAgIHNlbmRpbmcgbWdtdCBmcmFtZXMgKGxpbGUgcHJvYmUgcmVxKSB3aGljaCBuZWVkIHRvIGdvIG91dCBiZWZvcmUgYW55IHNlc3Npb24gaXMgcHJlc2VudC4KKyAgICovCisgICAgaWYoUE9QVUxBVEVfRE9UMTFGX1JBVEVTX09QRVJBVElPTkFMID09IG5DaGFubmVsTnVtICkKKyAgICB7CisgICAgICAgIGlmKHBzZXNzaW9uRW50cnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgblJhdGVzID0gcHNlc3Npb25FbnRyeS0+ZXh0UmF0ZVNldC5udW1SYXRlczsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcmF0ZXMsIHBzZXNzaW9uRW50cnktPmV4dFJhdGVTZXQucmF0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5SYXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkb3QxMWZMb2coIHBNYWMsIExPR0UsIEZMKCJubyBzZXNzaW9uIGNvbnRleHQgZXhpc3RzIHdoaWxlIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBwb3B1bGF0aW5nIE9wZXJhdGlvbmFsIFJhdGUgU2V0XG4iKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIEhJR0hFU1RfMjRHSFpfQ0hBTk5FTF9OVU0gPj0gbkNoYW5uZWxOdW0gKQorICAgIHsKKyAgICAgICAgQ0ZHX0dFVF9TVFIoIG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfRVhURU5ERURfT1BFUkFUSU9OQUxfUkFURV9TRVQsCisgICAgICAgICAgICAgICAgICAgICByYXRlcywgblJhdGVzLCBXTklfQ0ZHX0VYVEVOREVEX09QRVJBVElPTkFMX1JBVEVfU0VUX0xFTiApOworICAgIH0KKworICAgIGlmICggMCAhPSBuUmF0ZXMgKQorICAgIHsKKyAgICAgICAgcERvdDExZi0+bnVtX3JhdGVzID0gKCB0QU5JX1U4ICluUmF0ZXM7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBEb3QxMWYtPnJhdGVzLCByYXRlcywgblJhdGVzICk7CisgICAgICAgIHBEb3QxMWYtPnByZXNlbnQgICA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZFeHRTdXBwUmF0ZXMuCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmRXh0U3VwcFJhdGVzMSh0cEFuaVNpckdsb2JhbCAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVsTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUV4dFN1cHBSYXRlcyAqcERvdDExZikKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgICAgblJhdGVzOworICAgIHRTaXJSZXRTdGF0dXMgblNpclN0YXR1czsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgcmF0ZXNbU0lSX01BQ19NQVhfTlVNQkVSX09GX1JBVEVTXTsKKworICAgIGlmICggMTQgPCBuQ2hhbm5lbE51bSApCisgICAgeworICAgICAgICBwRG90MTFmLT5wcmVzZW50ID0gMDsKKyAgICAgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvLyBOLkIuIEkgaGF2ZSAqbm8qIGlkZWEgd2h5IHdlJ3JlIGNhbGxpbmcgJ3dsYW5fY2ZnR2V0U3RyJyB3aXRoIGFuIGFyZ3VtZW50CisgICAgLy8gb2YgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBIGhlcmUsIGJ1dCB0aGF0J3Mgd2hhdCB3YXMgZG9uZQorICAgIC8vIHByZXZpb3VzbHkgJiBJJ20gYWZyYWlkIHRvIGNoYW5nZSBpdCEKKyAgICBDRkdfR0VUX1NUUiggblNpclN0YXR1cywgcE1hYywgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFBLAorICAgICAgICAgICAgICAgICByYXRlcywgblJhdGVzLCBTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVMgKTsKKworICAgIGlmICggMCAhPSBuUmF0ZXMgKQorICAgIHsKKyAgICAgICAgcERvdDExZi0+bnVtX3JhdGVzID0gKCB0QU5JX1U4ICkgblJhdGVzOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRG90MTFmLT5yYXRlcywgcmF0ZXMsIG5SYXRlcyApOworICAgICAgICBwRG90MTFmLT5wcmVzZW50ICAgPSAxOworICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8vIFBvcHVsYXRlRG90MTFmRXh0U3VwcFJhdGVzMS4KKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZIVENhcHModHBBbmlTaXJHbG9iYWwgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUhUQ2FwcyAqcERvdDExZikKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBuQ2ZnVmFsdWUsIG5DZmdMZW47CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICAgICAgbkNmZ1ZhbHVlODsKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgICAgICAgICAgICAgICBuU2lyU3RhdHVzOworICAgIHRTaXJNYWNIVFBhcmFtZXRlcnNJbmZvICAgICAgICAgKnBIVFBhcmFtZXRlcnNJbmZvOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgLy8gdGhpcyBpcyBhZGRlZCBmb3IgZml4aW5nIENScyBvbiBNRE05SyBwbGF0Zm9ybSAtIDI1Nzk1MSwgMjU5NTc3CisgICAgdW5pb24geworICAgICAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgICAgIG5DZmdWYWx1ZTE2OworICAgICAgICB0U2lyTWFjSFRDYXBhYmlsaXR5SW5mbyAgICAgICAgIGh0Q2FwSW5mbzsKKyAgICAgICAgdFNpck1hY0V4dGVuZGVkSFRDYXBhYmlsaXR5SW5mbyBleHRIdENhcEluZm87CisgICAgfSB1SFRDYXBhYmlsaXR5SW5mbzsKKyNlbHNlCisgICAgdEFOSV9VMTYgICAgICAgICAgICAgICAgICAgICAgICAgbkNmZ1ZhbHVlMTY7CisgICAgdFNpck1hY0hUQ2FwYWJpbGl0eUluZm8gICAgICAgICAqcEhUQ2FwYWJpbGl0eUluZm87CisgICAgdFNpck1hY0V4dGVuZGVkSFRDYXBhYmlsaXR5SW5mbyAqcEV4dGVuZGVkSFRDYXBhYmlsaXR5SW5mbzsKKyNlbmRpZgorCisgICAgdFNpck1hY1R4QkZDYXBhYmlsaXR5SW5mbyAgICAgICAqcFR4QkZDYXBhYmlsaXR5SW5mbzsKKyAgICB0U2lyTWFjQVNDYXBhYmlsaXR5SW5mbyAgICAgICAgICpwQVNDYXBhYmlsaXR5SW5mbzsKKworICAgIENGR19HRVRfSU5UKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0hUX0NBUF9JTkZPLCBuQ2ZnVmFsdWUgKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgIC8vIHRoaXMgaXMgYWRkZWQgZm9yIGZpeGluZyBDUnMgb24gTURNOUsgcGxhdGZvcm0gLSAyNTc5NTEsIDI1OTU3NworICAgIHVIVENhcGFiaWxpdHlJbmZvLm5DZmdWYWx1ZTE2ID0gbkNmZ1ZhbHVlICYgMHhGRkZGOworI2Vsc2UKKyAgICBuQ2ZnVmFsdWUxNiA9ICggdEFOSV9VMTYgKSBuQ2ZnVmFsdWU7CisgICAgcEhUQ2FwYWJpbGl0eUluZm8gPSAoIHRTaXJNYWNIVENhcGFiaWxpdHlJbmZvKiApICZuQ2ZnVmFsdWUxNjsKKyNlbmRpZgorCisgICAgZG90MTFmTG9nKCBwTWFjLCBMT0cxLCBGTCggIkhUIENhcHM6ICV4XG4iICksIG5DZmdWYWx1ZSk7CisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgIC8vIHRoaXMgaXMgYWRkZWQgZm9yIGZpeGluZyBDUnMgb24gTURNOUsgcGxhdGZvcm0gLSAyNTc5NTEsIDI1OTU3NworICAgIHBEb3QxMWYtPmFkdkNvZGluZ0NhcCAgICAgICAgICAgICA9IHVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby5hZHZDb2RpbmdDYXA7CisgICAgcERvdDExZi0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0ID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnN1cHBvcnRlZENoYW5uZWxXaWR0aFNldDsKKyAgICBwRG90MTFmLT5taW1vUG93ZXJTYXZlICAgICAgICAgICAgPSB1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8ubWltb1Bvd2VyU2F2ZTsKKyAgICBwRG90MTFmLT5ncmVlbkZpZWxkICAgICAgICAgICAgICAgPSB1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8uZ3JlZW5GaWVsZDsKKyAgICBwRG90MTFmLT5zaG9ydEdJMjBNSHogICAgICAgICAgICAgPSB1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8uc2hvcnRHSTIwTUh6OworICAgIHBEb3QxMWYtPnNob3J0R0k0ME1IeiAgICAgICAgICAgICA9IHVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby5zaG9ydEdJNDBNSHo7CisgICAgcERvdDExZi0+dHhTVEJDICAgICAgICAgICAgICAgICAgID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnR4U1RCQzsKKyAgICBwRG90MTFmLT5yeFNUQkMgICAgICAgICAgICAgICAgICAgPSB1SFRDYXBhYmlsaXR5SW5mby5odENhcEluZm8ucnhTVEJDOworICAgIHBEb3QxMWYtPmRlbGF5ZWRCQSAgICAgICAgICAgICAgICA9IHVIVENhcGFiaWxpdHlJbmZvLmh0Q2FwSW5mby5kZWxheWVkQkE7CisgICAgcERvdDExZi0+bWF4aW1hbEFNU0RVc2l6ZSAgICAgICAgID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLm1heGltYWxBTVNEVXNpemU7CisgICAgcERvdDExZi0+ZHNzc0Nja01vZGU0ME1IeiAgICAgICAgID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLmRzc3NDY2tNb2RlNDBNSHo7CisgICAgcERvdDExZi0+cHNtcCAgICAgICAgICAgICAgICAgICAgID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnBzbXA7CisgICAgcERvdDExZi0+c3RiY0NvbnRyb2xGcmFtZSAgICAgICAgID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLnN0YmNDb250cm9sRnJhbWU7CisgICAgcERvdDExZi0+bHNpZ1RYT1BQcm90ZWN0aW9uICAgICAgID0gdUhUQ2FwYWJpbGl0eUluZm8uaHRDYXBJbmZvLmxzaWdUWE9QUHJvdGVjdGlvbjsKKyNlbHNlCisgICAgcERvdDExZi0+YWR2Q29kaW5nQ2FwICAgICAgICAgICAgID0gcEhUQ2FwYWJpbGl0eUluZm8tPmFkdkNvZGluZ0NhcDsKKyAgICBwRG90MTFmLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPSBwSFRDYXBhYmlsaXR5SW5mby0+c3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0OworICAgIHBEb3QxMWYtPm1pbW9Qb3dlclNhdmUgICAgICAgICAgICA9IHBIVENhcGFiaWxpdHlJbmZvLT5taW1vUG93ZXJTYXZlOworICAgIHBEb3QxMWYtPmdyZWVuRmllbGQgICAgICAgICAgICAgICA9IHBIVENhcGFiaWxpdHlJbmZvLT5ncmVlbkZpZWxkOworICAgIHBEb3QxMWYtPnNob3J0R0kyME1IeiAgICAgICAgICAgICA9IHBIVENhcGFiaWxpdHlJbmZvLT5zaG9ydEdJMjBNSHo7CisgICAgcERvdDExZi0+c2hvcnRHSTQwTUh6ICAgICAgICAgICAgID0gcEhUQ2FwYWJpbGl0eUluZm8tPnNob3J0R0k0ME1IejsKKyAgICBwRG90MTFmLT50eFNUQkMgICAgICAgICAgICAgICAgICAgPSBwSFRDYXBhYmlsaXR5SW5mby0+dHhTVEJDOworICAgIHBEb3QxMWYtPnJ4U1RCQyAgICAgICAgICAgICAgICAgICA9IHBIVENhcGFiaWxpdHlJbmZvLT5yeFNUQkM7CisgICAgcERvdDExZi0+ZGVsYXllZEJBICAgICAgICAgICAgICAgID0gcEhUQ2FwYWJpbGl0eUluZm8tPmRlbGF5ZWRCQTsKKyAgICBwRG90MTFmLT5tYXhpbWFsQU1TRFVzaXplICAgICAgICAgPSBwSFRDYXBhYmlsaXR5SW5mby0+bWF4aW1hbEFNU0RVc2l6ZTsKKyAgICBwRG90MTFmLT5kc3NzQ2NrTW9kZTQwTUh6ICAgICAgICAgPSBwSFRDYXBhYmlsaXR5SW5mby0+ZHNzc0Nja01vZGU0ME1IejsKKyAgICBwRG90MTFmLT5wc21wICAgICAgICAgICAgICAgICAgICAgPSBwSFRDYXBhYmlsaXR5SW5mby0+cHNtcDsKKyAgICBwRG90MTFmLT5zdGJjQ29udHJvbEZyYW1lICAgICAgICAgPSBwSFRDYXBhYmlsaXR5SW5mby0+c3RiY0NvbnRyb2xGcmFtZTsKKyAgICBwRG90MTFmLT5sc2lnVFhPUFByb3RlY3Rpb24gICAgICAgPSBwSFRDYXBhYmlsaXR5SW5mby0+bHNpZ1RYT1BQcm90ZWN0aW9uOworI2VuZGlmCisKKyAgICAvKiBFbnN1cmUgdGhhdCBzaG9ydEdJNDBNSHogaXMgRGlzYWJsZWQgaWYgc3VwcG9ydGVkQ2hhbm5lbFdpZHRoU2V0IGlzCisgICAgICAgZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFogKi8KKyAgICBpZihwRG90MTFmLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQgPT0gZUhUX0NIQU5ORUxfV0lEVEhfMjBNSFopCisgICAgeworICAgICAgIHBEb3QxMWYtPnNob3J0R0k0ME1IeiA9IDA7CisgICAgfQorCisgICAgZG90MTFmTG9nKHBNYWMsIExPRzEsIEZMKCJTdXBwb3J0ZWRDaG5sV2lkdGg6ICVkLCBtaW1vUFM6ICVkLCBHRjogJWQsIHNob3J0R0kyMDolZCwgc2hvcnRHSTQwOiAlZCwgZHNzc0NjazogJWRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRG90MTFmLT5zdXBwb3J0ZWRDaGFubmVsV2lkdGhTZXQsIHBEb3QxMWYtPm1pbW9Qb3dlclNhdmUsICBwRG90MTFmLT5ncmVlbkZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRG90MTFmLT5zaG9ydEdJMjBNSHosIHBEb3QxMWYtPnNob3J0R0k0ME1IeiwgcERvdDExZi0+ZHNzc0Nja01vZGU0ME1Ieik7CisKKworICAgIENGR19HRVRfSU5UKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0hUX0FNUERVX1BBUkFNUywgbkNmZ1ZhbHVlICk7CisKKyAgICBuQ2ZnVmFsdWU4ID0gKCB0QU5JX1U4ICkgbkNmZ1ZhbHVlOworICAgIHBIVFBhcmFtZXRlcnNJbmZvID0gKCB0U2lyTWFjSFRQYXJhbWV0ZXJzSW5mbyogKSAmbkNmZ1ZhbHVlODsKKworICAgIHBEb3QxMWYtPm1heFJ4QU1QRFVGYWN0b3IgPSBwSFRQYXJhbWV0ZXJzSW5mby0+bWF4UnhBTVBEVUZhY3RvcjsKKyAgICBwRG90MTFmLT5tcGR1RGVuc2l0eSAgICAgID0gcEhUUGFyYW1ldGVyc0luZm8tPm1wZHVEZW5zaXR5OworICAgIHBEb3QxMWYtPnJlc2VydmVkMSAgICAgICAgPSBwSFRQYXJhbWV0ZXJzSW5mby0+cmVzZXJ2ZWQ7CisKKyAgICBkb3QxMWZMb2coIHBNYWMsIExPRzEsIEZMKCAiQU1QRFUgUGFyYW06ICV4XG4iICksIG5DZmdWYWx1ZSk7CisKKworICAgIENGR19HRVRfU1RSKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1NVUFBPUlRFRF9NQ1NfU0VULAorICAgICAgICAgICAgICAgICBwRG90MTFmLT5zdXBwb3J0ZWRNQ1NTZXQsIG5DZmdMZW4sCisgICAgICAgICAgICAgICAgIFNJWkVfT0ZfU1VQUE9SVEVEX01DU19TRVQgKTsKKworCisgICAgQ0ZHX0dFVF9JTlQoIG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfRVhUX0hUX0NBUF9JTkZPLCBuQ2ZnVmFsdWUgKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgIC8vIHRoaXMgaXMgYWRkZWQgZm9yIGZpeGluZyBDUnMgb24gTURNOUsgcGxhdGZvcm0gLSAyNTc5NTEsIDI1OTU3NworICAgIHVIVENhcGFiaWxpdHlJbmZvLm5DZmdWYWx1ZTE2ID0gbkNmZ1ZhbHVlICYgMHhGRkZGOworCisgICAgcERvdDExZi0+cGNvICAgICAgICAgICAgPSB1SFRDYXBhYmlsaXR5SW5mby5leHRIdENhcEluZm8ucGNvOworICAgIHBEb3QxMWYtPnRyYW5zaXRpb25UaW1lID0gdUhUQ2FwYWJpbGl0eUluZm8uZXh0SHRDYXBJbmZvLnRyYW5zaXRpb25UaW1lOworICAgIHBEb3QxMWYtPm1jc0ZlZWRiYWNrICAgID0gdUhUQ2FwYWJpbGl0eUluZm8uZXh0SHRDYXBJbmZvLm1jc0ZlZWRiYWNrOworCisjZWxzZQorICAgIG5DZmdWYWx1ZTE2ID0gKCB0QU5JX1UxNiApIG5DZmdWYWx1ZSA7CisgICAgcEV4dGVuZGVkSFRDYXBhYmlsaXR5SW5mbyA9ICggdFNpck1hY0V4dGVuZGVkSFRDYXBhYmlsaXR5SW5mbyogKSAmbkNmZ1ZhbHVlMTY7CisgICAgcERvdDExZi0+cGNvICAgICAgICAgICAgPSBwRXh0ZW5kZWRIVENhcGFiaWxpdHlJbmZvLT5wY287CisgICAgcERvdDExZi0+dHJhbnNpdGlvblRpbWUgPSBwRXh0ZW5kZWRIVENhcGFiaWxpdHlJbmZvLT50cmFuc2l0aW9uVGltZTsKKyAgICBwRG90MTFmLT5tY3NGZWVkYmFjayAgICA9IHBFeHRlbmRlZEhUQ2FwYWJpbGl0eUluZm8tPm1jc0ZlZWRiYWNrOworI2VuZGlmCisKKyAgICBDRkdfR0VUX0lOVCggblNpclN0YXR1cywgcE1hYywgV05JX0NGR19UWF9CRl9DQVAsIG5DZmdWYWx1ZSApOworCisgICAgcFR4QkZDYXBhYmlsaXR5SW5mbyA9ICggdFNpck1hY1R4QkZDYXBhYmlsaXR5SW5mbyogKSAmbkNmZ1ZhbHVlOworICAgIHBEb3QxMWYtPnR4QkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPnR4QkY7CisgICAgcERvdDExZi0+cnhTdGFnZ2VyZWRTb3VuZGluZyAgICAgICAgICAgICAgICAgICAgICAgID0gcFR4QkZDYXBhYmlsaXR5SW5mby0+cnhTdGFnZ2VyZWRTb3VuZGluZzsKKyAgICBwRG90MTFmLT50eFN0YWdnZXJlZFNvdW5kaW5nICAgICAgICAgICAgICAgICAgICAgICAgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT50eFN0YWdnZXJlZFNvdW5kaW5nOworICAgIHBEb3QxMWYtPnJ4WkxGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPnJ4WkxGOworICAgIHBEb3QxMWYtPnR4WkxGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPnR4WkxGOworICAgIHBEb3QxMWYtPmltcGxpY2l0VHhCRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPmltcGxpY2l0VHhCRjsKKyAgICBwRG90MTFmLT5jYWxpYnJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT5jYWxpYnJhdGlvbjsKKyAgICBwRG90MTFmLT5leHBsaWNpdENTSVR4QkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT5leHBsaWNpdENTSVR4QkY7CisgICAgcERvdDExZi0+ZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeCAgICAgICAgID0gcFR4QkZDYXBhYmlsaXR5SW5mby0+ZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeDsKKyAgICBwRG90MTFmLT5leHBsaWNpdEJGQ1NJRmVlZGJhY2sgICAgICAgICAgICAgICAgICAgICAgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT5leHBsaWNpdEJGQ1NJRmVlZGJhY2s7CisgICAgcERvdDExZi0+ZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrID0gcFR4QkZDYXBhYmlsaXR5SW5mby0+ZXhwbGljaXRVbmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEZlZWRiYWNrOworICAgIHBEb3QxMWYtPmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2sgICA9IHBUeEJGQ2FwYWJpbGl0eUluZm8tPmV4cGxpY2l0Q29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4RmVlZGJhY2s7CisgICAgcERvdDExZi0+Y3NpTnVtQkZBbnRlbm5hZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcFR4QkZDYXBhYmlsaXR5SW5mby0+Y3NpTnVtQkZBbnRlbm5hZTsKKyAgICBwRG90MTFmLT51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWUgICAgICAgPSBwVHhCRkNhcGFiaWxpdHlJbmZvLT51bmNvbXByZXNzZWRTdGVlcmluZ01hdHJpeEJGQW50ZW5uYWU7CisgICAgcERvdDExZi0+Y29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZSAgICAgICAgID0gcFR4QkZDYXBhYmlsaXR5SW5mby0+Y29tcHJlc3NlZFN0ZWVyaW5nTWF0cml4QkZBbnRlbm5hZTsKKworICAgIENGR19HRVRfSU5UKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0FTX0NBUCwgbkNmZ1ZhbHVlICk7CisKKyAgICBuQ2ZnVmFsdWU4ID0gKCB0QU5JX1U4ICkgbkNmZ1ZhbHVlOworCisgICAgcEFTQ2FwYWJpbGl0eUluZm8gPSAoIHRTaXJNYWNBU0NhcGFiaWxpdHlJbmZvKiApICZuQ2ZnVmFsdWU4OworICAgIHBEb3QxMWYtPmFudGVubmFTZWxlY3Rpb24gICAgICAgICA9IHBBU0NhcGFiaWxpdHlJbmZvLT5hbnRlbm5hU2VsZWN0aW9uOworICAgIHBEb3QxMWYtPmV4cGxpY2l0Q1NJRmVlZGJhY2tUeCAgICA9IHBBU0NhcGFiaWxpdHlJbmZvLT5leHBsaWNpdENTSUZlZWRiYWNrVHg7CisgICAgcERvdDExZi0+YW50ZW5uYUluZGljZXNGZWVkYmFja1R4ID0gcEFTQ2FwYWJpbGl0eUluZm8tPmFudGVubmFJbmRpY2VzRmVlZGJhY2tUeDsKKyAgICBwRG90MTFmLT5leHBsaWNpdENTSUZlZWRiYWNrICAgICAgPSBwQVNDYXBhYmlsaXR5SW5mby0+ZXhwbGljaXRDU0lGZWVkYmFjazsKKyAgICBwRG90MTFmLT5hbnRlbm5hSW5kaWNlc0ZlZWRiYWNrICAgPSBwQVNDYXBhYmlsaXR5SW5mby0+YW50ZW5uYUluZGljZXNGZWVkYmFjazsKKyAgICBwRG90MTFmLT5yeEFTICAgICAgICAgICAgICAgICAgICAgPSBwQVNDYXBhYmlsaXR5SW5mby0+cnhBUzsKKyAgICBwRG90MTFmLT50eFNvdW5kaW5nUFBEVXMgICAgICAgICAgPSBwQVNDYXBhYmlsaXR5SW5mby0+dHhTb3VuZGluZ1BQRFVzOworCisgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZkhUQ2Fwcy4KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmSFRJbmZvKHRwQW5pU2lyR2xvYmFsICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUhUSW5mbyAqcERvdDExZiwKKyAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uICAgICAgcHNlc3Npb25FbnRyeSApCisjZWxzZQordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZIVEluZm8odHBBbmlTaXJHbG9iYWwgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFSFRJbmZvICpwRG90MTFmKQorI2VuZGlmCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgbkNmZ1ZhbHVlLCBuQ2ZnTGVuOworICAgIHRBTklfVTggICAgICAgICAgICAgIGh0SW5mb0ZpZWxkMTsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgIGh0SW5mb0ZpZWxkMjsKKyAgICB0U2lyUmV0U3RhdHVzICAgICAgICBuU2lyU3RhdHVzOworICAgIHRTaXJNYWNIVEluZm9GaWVsZDEgKnBIVEluZm9GaWVsZDE7CisgICAgdFNpck1hY0hUSW5mb0ZpZWxkMiAqcEhUSW5mb0ZpZWxkMjsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFICAvLyB0aGlzIGlzIGFkZGVkIGZvciBmaXhpbmcgQ1JzIG9uIE1ETTlLIHBsYXRmb3JtIC0gMjU3OTUxLCAyNTk1NzcKKyAgICB1bmlvbiB7CisgICAgICAgIHRBTklfVTE2ICAgICAgICAgbkNmZ1ZhbHVlMTY7CisgICAgICAgIHRTaXJNYWNIVEluZm9GaWVsZDMgaW5mb0ZpZWxkMzsKKyAgICB9dUhUSW5mb0ZpZWxkOworICAgIHVuaW9uIHsKKyAgICAgICAgdEFOSV9VMTYgICAgICAgICBuQ2ZnVmFsdWUxNjsKKyAgICAgICAgdFNpck1hY0hUSW5mb0ZpZWxkMiBpbmZvRmllbGQyOworICAgIH11SFRJbmZvRmllbGQyPXswfTsKKyNlbHNlCisgICAgdEFOSV9VMTYgICAgICAgICAgICBodEluZm9GaWVsZDM7CisgICAgdFNpck1hY0hUSW5mb0ZpZWxkMyAqcEhUSW5mb0ZpZWxkMzsKKyNlbmRpZgorCisjaWZuZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgIHBzZXNzaW9uRW50cnkgPSAmcE1hYy0+bGltLmdwU2Vzc2lvblswXTsgIC8vVEJELVJBSkVTSCBIT1cgVE8gR0VUIHNlc3Npb25FbnRyeT8/Pz8/CisjZW5kaWYKKworICAgICNpZiAwCisgICAgQ0ZHX0dFVF9JTlQoIG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfQ1VSUkVOVF9DSEFOTkVMLCBuQ2ZnVmFsdWUgKTsKKyAgICAjZW5kaWYgLy8gVE8gU1VQUE9SVCBCVC1BTVAKKyAgICAKKyAgICBwRG90MTFmLT5wcmltYXJ5Q2hhbm5lbCA9IHBzZXNzaW9uRW50cnktPmN1cnJlbnRPcGVyQ2hhbm5lbDsKKworICAgIENGR19HRVRfSU5UKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0hUX0lORk9fRklFTEQxLCBuQ2ZnVmFsdWUgKTsKKworICAgIGh0SW5mb0ZpZWxkMSA9ICggdEFOSV9VOCApIG5DZmdWYWx1ZTsKKworICAgIHBIVEluZm9GaWVsZDEgPSAoIHRTaXJNYWNIVEluZm9GaWVsZDEqICkgJmh0SW5mb0ZpZWxkMTsKKyAgICBwSFRJbmZvRmllbGQxLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0ICAgICA9IHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworICAgIHBIVEluZm9GaWVsZDEtPnJlY29tbWVuZGVkVHhXaWR0aFNldCAgICAgID0gcE1hYy0+bGltLmdIVFJlY29tbWVuZGVkVHhXaWR0aFNldDsKKyAgICBwSFRJbmZvRmllbGQxLT5yaWZzTW9kZSAgICAgICAgICAgICAgICAgICA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mUklGU01vZGU7CisgICAgcEhUSW5mb0ZpZWxkMS0+c2VydmljZUludGVydmFsR3JhbnVsYXJpdHkgPSBwTWFjLT5saW0uZ0hUU2VydmljZUludGVydmFsR3JhbnVsYXJpdHk7CisKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBpZihwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlID09IGVMSU1fQVBfUk9MRSApeworICAgIENGR19HRVRfSU5UKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0hUX0lORk9fRklFTEQyLCBuQ2ZnVmFsdWUgKTsKKworICAgIHVIVEluZm9GaWVsZDIubkNmZ1ZhbHVlMTYgPSBuQ2ZnVmFsdWUgJiAweEZGRkY7IC8vIHRoaXMgaXMgYWRkZWQgZm9yIGZpeGluZyBDUnMgb24gTURNOUsgcGxhdGZvcm0gLSAyNTc5NTEsIDI1OTU3NworCisgICAgdUhUSW5mb0ZpZWxkMi5pbmZvRmllbGQyLm9wTW9kZSAgID0gIHBzZXNzaW9uRW50cnktPmh0T3Blck1vZGU7CisgICAgdUhUSW5mb0ZpZWxkMi5pbmZvRmllbGQyLm5vbkdGRGV2aWNlc1ByZXNlbnQgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMubGxuTm9uR0ZDb2V4aXN0OworICAgIHVIVEluZm9GaWVsZDIuaW5mb0ZpZWxkMi5vYnNzTm9uSFRTdGFQcmVzZW50ID0gcHNlc3Npb25FbnRyeS0+YmVhY29uUGFyYW1zLmdIVE9ic3NNb2RlOyAgIC8qYWRkZWQgZm9yIE9ic3MgICovCisKKyAgICB1SFRJbmZvRmllbGQyLmluZm9GaWVsZDIucmVzZXJ2ZWQgPSAwOworCisgICB9ZWxzZXsKKyNlbmRpZgorICAgICAgICBDRkdfR0VUX0lOVCggblNpclN0YXR1cywgcE1hYywgV05JX0NGR19IVF9JTkZPX0ZJRUxEMiwgbkNmZ1ZhbHVlICk7CisKKyAgICAgICAgaHRJbmZvRmllbGQyID0gKCB0QU5JX1UxNiApIG5DZmdWYWx1ZTsKKworICAgICAgICBwSFRJbmZvRmllbGQyID0gKCB0U2lyTWFjSFRJbmZvRmllbGQyKiApICZodEluZm9GaWVsZDI7CisgICAgICAgIHBIVEluZm9GaWVsZDItPm9wTW9kZSAgID0gcE1hYy0+bGltLmdIVE9wZXJNb2RlOworICAgICAgICBwSFRJbmZvRmllbGQyLT5ub25HRkRldmljZXNQcmVzZW50ID0gcE1hYy0+bGltLmdIVE5vbkdGRGV2aWNlc1ByZXNlbnQ7CisgICAgICAgIHBIVEluZm9GaWVsZDItPm9ic3NOb25IVFN0YVByZXNlbnQgPSBwTWFjLT5saW0uZ0hUT2Jzc01vZGU7ICAgLyphZGRlZCBmb3IgT2JzcyAgKi8KKworICAgICAgICBwSFRJbmZvRmllbGQyLT5yZXNlcnZlZCA9IDA7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIH0KKyNlbmRpZgorCisgICAgQ0ZHX0dFVF9JTlQoIG5TaXJTdGF0dXMsIHBNYWMsIFdOSV9DRkdfSFRfSU5GT19GSUVMRDMsIG5DZmdWYWx1ZSApOworCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFICAvLyB0aGlzIGlzIGFkZGVkIGZvciBmaXhpbmcgQ1JzIG9uIE1ETTlLIHBsYXRmb3JtIC0gMjU3OTUxLCAyNTk1NzcKKyAgICB1SFRJbmZvRmllbGQubkNmZ1ZhbHVlMTYgPSBuQ2ZnVmFsdWUgJiAweEZGRkY7CisKKworICAgIHVIVEluZm9GaWVsZC5pbmZvRmllbGQzLmJhc2ljU1RCQ01DUyAgICAgICAgICAgICAgICAgID0gcE1hYy0+bGltLmdIVFNUQkNCYXNpY01DUzsKKyAgICB1SFRJbmZvRmllbGQuaW5mb0ZpZWxkMy5kdWFsQ1RTUHJvdGVjdGlvbiAgICAgICAgICAgICA9IHBNYWMtPmxpbS5nSFREdWFsQ1RTUHJvdGVjdGlvbjsKKyAgICB1SFRJbmZvRmllbGQuaW5mb0ZpZWxkMy5zZWNvbmRhcnlCZWFjb24gICAgICAgICAgICAgICA9IHBNYWMtPmxpbS5nSFRTZWNvbmRhcnlCZWFjb247CisgICAgdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMubHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSBwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OworICAgIHVIVEluZm9GaWVsZC5pbmZvRmllbGQzLnBjb0FjdGl2ZSAgICAgICAgICAgICAgICAgICAgID0gcE1hYy0+bGltLmdIVFBDT0FjdGl2ZTsKKyAgICB1SFRJbmZvRmllbGQuaW5mb0ZpZWxkMy5wY29QaGFzZSAgICAgICAgICAgICAgICAgICAgICA9IHBNYWMtPmxpbS5nSFRQQ09QaGFzZTsKKyAgICB1SFRJbmZvRmllbGQuaW5mb0ZpZWxkMy5yZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICA9IDA7CisKKyNlbHNlCisgICAgaHRJbmZvRmllbGQzID0gKHRBTklfVTE2KSBuQ2ZnVmFsdWU7CisKKyAgICBwSFRJbmZvRmllbGQzID0gKCB0U2lyTWFjSFRJbmZvRmllbGQzKiApICZodEluZm9GaWVsZDM7CisgICAgcEhUSW5mb0ZpZWxkMy0+YmFzaWNTVEJDTUNTICAgICAgICAgICAgICAgICAgPSBwTWFjLT5saW0uZ0hUU1RCQ0Jhc2ljTUNTOworICAgIHBIVEluZm9GaWVsZDMtPmR1YWxDVFNQcm90ZWN0aW9uICAgICAgICAgICAgID0gcE1hYy0+bGltLmdIVER1YWxDVFNQcm90ZWN0aW9uOworICAgIHBIVEluZm9GaWVsZDMtPnNlY29uZGFyeUJlYWNvbiAgICAgICAgICAgICAgID0gcE1hYy0+bGltLmdIVFNlY29uZGFyeUJlYWNvbjsKKyAgICBwSFRJbmZvRmllbGQzLT5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9IHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisgICAgcEhUSW5mb0ZpZWxkMy0+cGNvQWN0aXZlICAgICAgICAgICAgICAgICAgICAgPSBwTWFjLT5saW0uZ0hUUENPQWN0aXZlOworICAgIHBIVEluZm9GaWVsZDMtPnBjb1BoYXNlICAgICAgICAgICAgICAgICAgICAgID0gcE1hYy0+bGltLmdIVFBDT1BoYXNlOworICAgIHBIVEluZm9GaWVsZDMtPnJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyNlbmRpZgorCisgICAgcERvdDExZi0+c2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAgICAgICAgPSBwSFRJbmZvRmllbGQxLT5zZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworICAgIHBEb3QxMWYtPnJlY29tbWVuZGVkVHhXaWR0aFNldCAgICAgICAgID0gcEhUSW5mb0ZpZWxkMS0+cmVjb21tZW5kZWRUeFdpZHRoU2V0OworICAgIHBEb3QxMWYtPnJpZnNNb2RlICAgICAgICAgICAgICAgICAgICAgID0gcEhUSW5mb0ZpZWxkMS0+cmlmc01vZGU7CisgICAgcERvdDExZi0+Y29udHJvbGxlZEFjY2Vzc09ubHkgICAgICAgICAgPSBwSFRJbmZvRmllbGQxLT5jb250cm9sbGVkQWNjZXNzT25seTsKKyAgICBwRG90MTFmLT5zZXJ2aWNlSW50ZXJ2YWxHcmFudWxhcml0eSAgICA9IHBIVEluZm9GaWVsZDEtPnNlcnZpY2VJbnRlcnZhbEdyYW51bGFyaXR5OworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRSAgLy8gdGhpcyBpcyBhZGRlZCBmb3IgZml4aW5nIENScyBvbiBNRE05SyBwbGF0Zm9ybSAtIDI1Nzk1MSwgMjU5NTc3CisgICAgcERvdDExZi0+b3BNb2RlICAgICAgICAgICAgICAgICAgICAgICAgPSB1SFRJbmZvRmllbGQyLmluZm9GaWVsZDIub3BNb2RlOworICAgIHBEb3QxMWYtPm5vbkdGRGV2aWNlc1ByZXNlbnQgICAgICAgICAgID0gdUhUSW5mb0ZpZWxkMi5pbmZvRmllbGQyLm5vbkdGRGV2aWNlc1ByZXNlbnQ7CisgICAgcERvdDExZi0+b2Jzc05vbkhUU3RhUHJlc2VudCAgICAgICAgICAgPSB1SFRJbmZvRmllbGQyLmluZm9GaWVsZDIub2Jzc05vbkhUU3RhUHJlc2VudDsKKyAgICBwRG90MTFmLT5yZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICA9IHVIVEluZm9GaWVsZDIuaW5mb0ZpZWxkMi5yZXNlcnZlZDsKKworI2Vsc2UKKyAgICBwRG90MTFmLT5vcE1vZGUgICAgICAgICAgICAgICAgICAgICAgICA9IHBIVEluZm9GaWVsZDItPm9wTW9kZTsKKyAgICBwRG90MTFmLT5ub25HRkRldmljZXNQcmVzZW50ICAgICAgICAgICA9IHBIVEluZm9GaWVsZDItPm5vbkdGRGV2aWNlc1ByZXNlbnQ7CisgICAgcERvdDExZi0+b2Jzc05vbkhUU3RhUHJlc2VudCAgICAgICAgICAgPSBwSFRJbmZvRmllbGQyLT5vYnNzTm9uSFRTdGFQcmVzZW50OworICAgIHBEb3QxMWYtPnJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgID0gcEhUSW5mb0ZpZWxkMi0+cmVzZXJ2ZWQ7CisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgIC8vIHRoaXMgaXMgYWRkZWQgZm9yIGZpeGluZyBDUnMgb24gTURNOUsgcGxhdGZvcm0gLSAyNTc5NTEsIDI1OTU3NworICAgIHBEb3QxMWYtPmJhc2ljU1RCQ01DUyAgICAgICAgICAgICAgICAgID0gdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMuYmFzaWNTVEJDTUNTOworICAgIHBEb3QxMWYtPmR1YWxDVFNQcm90ZWN0aW9uICAgICAgICAgICAgID0gdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMuZHVhbENUU1Byb3RlY3Rpb247CisgICAgcERvdDExZi0+c2Vjb25kYXJ5QmVhY29uICAgICAgICAgICAgICAgPSB1SFRJbmZvRmllbGQuaW5mb0ZpZWxkMy5zZWNvbmRhcnlCZWFjb247CisgICAgcERvdDExZi0+bHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSB1SFRJbmZvRmllbGQuaW5mb0ZpZWxkMy5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDsKKyAgICBwRG90MTFmLT5wY29BY3RpdmUgICAgICAgICAgICAgICAgICAgICA9IHVIVEluZm9GaWVsZC5pbmZvRmllbGQzLnBjb0FjdGl2ZTsKKyAgICBwRG90MTFmLT5wY29QaGFzZSAgICAgICAgICAgICAgICAgICAgICA9IHVIVEluZm9GaWVsZC5pbmZvRmllbGQzLnBjb1BoYXNlOworICAgIHBEb3QxMWYtPnJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgID0gdUhUSW5mb0ZpZWxkLmluZm9GaWVsZDMucmVzZXJ2ZWQ7CisjZWxzZQorICAgIHBEb3QxMWYtPmJhc2ljU1RCQ01DUyAgICAgICAgICAgICAgICAgID0gcEhUSW5mb0ZpZWxkMy0+YmFzaWNTVEJDTUNTOworICAgIHBEb3QxMWYtPmR1YWxDVFNQcm90ZWN0aW9uICAgICAgICAgICAgID0gcEhUSW5mb0ZpZWxkMy0+ZHVhbENUU1Byb3RlY3Rpb247CisgICAgcERvdDExZi0+c2Vjb25kYXJ5QmVhY29uICAgICAgICAgICAgICAgPSBwSFRJbmZvRmllbGQzLT5zZWNvbmRhcnlCZWFjb247CisgICAgcERvdDExZi0+bHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSBwSFRJbmZvRmllbGQzLT5sc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDsKKyAgICBwRG90MTFmLT5wY29BY3RpdmUgICAgICAgICAgICAgICAgICAgICA9IHBIVEluZm9GaWVsZDMtPnBjb0FjdGl2ZTsKKyAgICBwRG90MTFmLT5wY29QaGFzZSAgICAgICAgICAgICAgICAgICAgICA9IHBIVEluZm9GaWVsZDMtPnBjb1BoYXNlOworICAgIHBEb3QxMWYtPnJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgID0gcEhUSW5mb0ZpZWxkMy0+cmVzZXJ2ZWQ7CisjZW5kaWYKKyAgICBDRkdfR0VUX1NUUiggblNpclN0YXR1cywgcE1hYywgV05JX0NGR19CQVNJQ19NQ1NfU0VULAorICAgICAgICAgICAgICAgICBwRG90MTFmLT5iYXNpY01DU1NldCwgbkNmZ0xlbiwKKyAgICAgICAgICAgICAgICAgU0laRV9PRl9CQVNJQ19NQ1NfU0VUICk7CisKKyAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmSFRJbmZvLgorCit2b2lkCitQb3B1bGF0ZURvdDExZklCU1NQYXJhbXModHBBbmlTaXJHbG9iYWwgICAgICAgcE1hYywKKyAgICAgICB0RG90MTFmSUVJQlNTUGFyYW1zICpwRG90MTFmLCB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIGlmICggZUxJTV9TVEFfSU5fSUJTU19ST0xFID09IHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgKQorICAgIHsKKyAgICAgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisgICAgICAgIC8vIEFUSU0gZHVyYXRpb24gaXMgYWx3YXlzIHNldCB0byAwCisgICAgICAgIHBEb3QxMWYtPmF0aW0gPSAwOworICAgIH0KKworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZJQlNTUGFyYW1zLgorCisKKyNpZmRlZiBBTklfU1VQUE9SVF8xMUgKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmTWVhc3VyZW1lbnRSZXBvcnQwKHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUgIHBSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCAqcERvdDExZikKK3sKKyAgICBwRG90MTFmLT50b2tlbiAgICAgPSBwUmVxLT5tZWFzUmVxSUUubWVhc1Rva2VuOworICAgIHBEb3QxMWYtPmxhdGUgICAgICA9IDA7CisgICAgcERvdDExZi0+aW5jYXBhYmxlID0gMDsKKyAgICBwRG90MTFmLT5yZWZ1c2VkICAgPSAxOworICAgIHBEb3QxMWYtPnR5cGUgICAgICA9IFNJUl9NQUNfQkFTSUNfTUVBU1VSRU1FTlRfVFlQRTsKKworICAgIHBEb3QxMWYtPnByZXNlbnQgICA9IDE7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8vIEVuZCBQb3B1bGF0ZWREb3QxMWZNZWFzdXJlbWVudFJlcG9ydDAuCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmTWVhc3VyZW1lbnRSZXBvcnQxKHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lICBwUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRU1lYXN1cmVtZW50UmVwb3J0ICpwRG90MTFmKQoreworICAgIHBEb3QxMWYtPnRva2VuICAgICA9IHBSZXEtPm1lYXNSZXFJRS5tZWFzVG9rZW47CisgICAgcERvdDExZi0+bGF0ZSAgICAgID0gMDsKKyAgICBwRG90MTFmLT5pbmNhcGFibGUgPSAwOworICAgIHBEb3QxMWYtPnJlZnVzZWQgICA9IDE7CisgICAgcERvdDExZi0+dHlwZSAgICAgID0gU0lSX01BQ19DQ0FfTUVBU1VSRU1FTlRfVFlQRTsKKworICAgIHBEb3QxMWYtPnByZXNlbnQgICA9IDE7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8vIEVuZCBQb3B1bGF0ZWREb3QxMWZNZWFzdXJlbWVudFJlcG9ydDEuCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmTWVhc3VyZW1lbnRSZXBvcnQyKHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUgIHBSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCAqcERvdDExZikKK3sKKyAgICBwRG90MTFmLT50b2tlbiAgICAgPSBwUmVxLT5tZWFzUmVxSUUubWVhc1Rva2VuOworICAgIHBEb3QxMWYtPmxhdGUgICAgICA9IDA7CisgICAgcERvdDExZi0+aW5jYXBhYmxlID0gMDsKKyAgICBwRG90MTFmLT5yZWZ1c2VkICAgPSAxOworICAgIHBEb3QxMWYtPnR5cGUgICAgICA9IFNJUl9NQUNfUlBJX01FQVNVUkVNRU5UX1RZUEU7CisKKyAgICBwRG90MTFmLT5wcmVzZW50ICAgPSAxOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgUG9wdWxhdGVkRG90MTFmTWVhc3VyZW1lbnRSZXBvcnQyLgorI2VuZGlmCisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmUG93ZXJDYXBzKHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVBvd2VyQ2FwcyAqcENhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IG5Bc3NvY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIGlmIChuQXNzb2NUeXBlID09IExJTV9SRUFTU09DKQorICAgIHsKKyAgICAgICAgcENhcHMtPm1pblR4UG93ZXIgPSBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+cG93ZXJDYXAubWluVHhQb3dlcjsKKyAgICAgICAgcENhcHMtPm1heFR4UG93ZXIgPSBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+cG93ZXJDYXAubWF4VHhQb3dlcjsKKyAgICB9ZWxzZQorICAgIHsKKyAgICAgICAgcENhcHMtPm1pblR4UG93ZXIgPSBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+cG93ZXJDYXAubWluVHhQb3dlcjsKKyAgICAgICAgcENhcHMtPm1heFR4UG93ZXIgPSBwc2Vzc2lvbkVudHJ5LT5wTGltSm9pblJlcS0+cG93ZXJDYXAubWF4VHhQb3dlcjsKKworICAgIH0KKyAgICAKKyAgICBwQ2Fwcy0+cHJlc2VudCAgICA9IDE7Cit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZlBvd2VyQ2Fwcy4KKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZQb3dlckNvbnN0cmFpbnRzKHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUG93ZXJDb25zdHJhaW50cyAqcERvdDExZikKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgICAgY2ZnOworICAgIHRTaXJSZXRTdGF0dXMgblNpclN0YXR1czsKKworICAgIENGR19HRVRfSU5UKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0xPQ0FMX1BPV0VSX0NPTlNUUkFJTlQsIGNmZyApOworCisgICAgcERvdDExZi0+bG9jYWxQb3dlckNvbnN0cmFpbnRzID0gKCB0QU5JX1U4ICljZmc7CisgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZQb3dlckNvbnN0cmFpbnRzLgorCit2b2lkCitQb3B1bGF0ZURvdDExZlFPU0NhcHNBcCh0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVRT1NDYXBzQXAgKnBEb3QxMWYsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgcERvdDExZi0+Y291bnQgICAgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtU2V0Q291bnQ7CisgICAgcERvdDExZi0+cmVzZXJ2ZWQgPSAwOworICAgIHBEb3QxMWYtPnR4b3ByZXEgID0gMDsKKyAgICBwRG90MTFmLT5xcmVxICAgICA9IDA7CisgICAgcERvdDExZi0+cWFjayAgICAgPSAwOworICAgIHBEb3QxMWYtPnByZXNlbnQgID0gMTsKK30gLy8gRW5kIFBvcHVsYXRlZERvdDExZlFPU0NhcHMuCisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmUU9TQ2Fwc1N0YXRpb24odHBBbmlTaXJHbG9iYWwgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVRT1NDYXBzU3RhdGlvbiAqcERvdDExZikKK3sKKyAgICB0QU5JX1UzMiAgdmFsID0gMDsKKworICAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfTUFYX1NQX0xFTkdUSCwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKSAKKyAgICAgICAgUEVMT0dFKGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiY291bGQgbm90IHJldHJpZXZlIE1heCBTUCBMZW5ndGggXG4iKSk7KQorICAgCisgICAgcERvdDExZi0+bW9yZV9kYXRhX2FjayA9IDA7CisgICAgcERvdDExZi0+bWF4X3NwX2xlbmd0aCA9ICh0QU5JX1U4KXZhbDsKKyAgICBwRG90MTFmLT5xYWNrICAgID0gMDsKKworICAgIGlmIChwTWFjLT5saW0uZ1VhcHNkRW5hYmxlKQorICAgIHsKKyAgICAgICAgcERvdDExZi0+YWNiZV91YXBzZCA9IExJTV9VQVBTRF9HRVQoQUNCRSwgcE1hYy0+bGltLmdVYXBzZFBlckFjQml0bWFzayk7CisgICAgICAgIHBEb3QxMWYtPmFjYmtfdWFwc2QgPSBMSU1fVUFQU0RfR0VUKEFDQkssIHBNYWMtPmxpbS5nVWFwc2RQZXJBY0JpdG1hc2spOworICAgICAgICBwRG90MTFmLT5hY3ZpX3VhcHNkID0gTElNX1VBUFNEX0dFVChBQ1ZJLCBwTWFjLT5saW0uZ1VhcHNkUGVyQWNCaXRtYXNrKTsKKyAgICAgICAgcERvdDExZi0+YWN2b191YXBzZCA9IExJTV9VQVBTRF9HRVQoQUNWTywgcE1hYy0+bGltLmdVYXBzZFBlckFjQml0bWFzayk7CisgICAgfSAgIAorICAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworfSAvLyBFbmQgUG9wdWxhdGVkRG90MTFmUU9TQ2Fwcy4KKwordFNpclJldFN0YXR1cworUG9wdWxhdGVEb3QxMWZSU04odHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgICAgICAgICAgICAgICB0cFNpclJTTmllICAgICAgcFJzbkllLAorICAgICAgICAgICAgICAgICAgdERvdDExZklFUlNOICAgKnBEb3QxMWYpCit7CisgICAgdEFOSV9VMzIgICAgICAgIHN0YXR1czsKKyAgICBpbnQgIGlkeDsKKworICAgIGlmICggcFJzbkllLT5sZW5ndGggKQorICAgIHsKKyAgICAgICAgaWYoIDAgPD0gKCBpZHggPSBGaW5kSUVMb2NhdGlvbiggcE1hYywgcFJzbkllLCBET1QxMUZfRUlEX1JTTiApICkgKQorICAgICAgICAgICAgeworICAgICAgICBzdGF0dXMgPSBkb3QxMWZVbnBhY2tJZVJTTiggcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSc25JZS0+cnNuSUVkYXRhICsgaWR4ICsgMiwgLy9FSUQsIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJzbkllLT5yc25JRWRhdGFbIGlkeCArIDEgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEb3QxMWYgKTsKKyAgICAgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBzdGF0dXMgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdDExZkxvZyggcE1hYywgTE9HRSwgRkwoIlBhcnNlIGZhaWx1cmUgaW4gUG9wdWxhdGVEb3QxMWZSUyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk4gKDB4JTA4eCkuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzICk7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGRvdDExZkxvZyggcE1hYywgTE9HMiwgRkwoImRvdDExZlVucGFja0llUlNOIHJldHVybmVkIDB4JTA4eCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRlRG90MTFmUlNOLlxuIiksIHN0YXR1cyApOworICAgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZSU04uCisKK3RTaXJSZXRTdGF0dXMgUG9wdWxhdGVEb3QxMWZSU05PcGFxdWUoIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUlNOaWUgICAgICAgICAgcFJzbkllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUlNOT3BhcXVlICpwRG90MTFmICkKK3sKKyAgICBpbnQgaWR4OworCisgICAgaWYgKCBwUnNuSWUtPmxlbmd0aCApCisgICAgeworICAgICAgICBpZiggMCA8PSAoIGlkeCA9IEZpbmRJRUxvY2F0aW9uKCBwTWFjLCBwUnNuSWUsIERPVDExRl9FSURfUlNOICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEb3QxMWYtPnByZXNlbnQgID0gMTsKKyAgICAgICAgICAgIHBEb3QxMWYtPm51bV9kYXRhID0gcFJzbkllLT5yc25JRWRhdGFbIGlkeCArIDEgXTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBEb3QxMWYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnNuSWUtPnJzbklFZGF0YSArIGlkeCArIDIsICAgIC8vIEVJRCwgbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnNuSWUtPnJzbklFZGF0YVsgaWR4ICsgMSBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZlJTTk9wYXF1ZS4KKworCisKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZldBUEkodHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgICAgICAgICAgICAgICB0cFNpclJTTmllICAgICAgcFJzbkllLAorICAgICAgICAgICAgICAgICAgdERvdDExZklFV0FQSSAgICpwRG90MTFmKQorICAgICAgICB7CisgICAgdEFOSV9VMzIgICAgICAgIHN0YXR1czsKKyAgICBpbnQgIGlkeDsKKworICAgIGlmICggcFJzbkllLT5sZW5ndGggKQorICAgICAgICB7CisgICAgICAgIGlmKCAwIDw9ICggaWR4ID0gRmluZElFTG9jYXRpb24oIHBNYWMsIHBSc25JZSwgRE9UMTFGX0VJRF9XQVBJICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRvdDExZlVucGFja0llV0FQSSggcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnNuSWUtPnJzbklFZGF0YSArIGlkeCArIDIsIC8vRUlELCBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnNuSWUtPnJzbklFZGF0YVsgaWR4ICsgMSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEb3QxMWYgKTsKKyAgICAgICAgICAgIGlmICggRE9UMTFGX0ZBSUxFRCggc3RhdHVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdDExZkxvZyggcE1hYywgTE9HRSwgRkwoIlBhcnNlIGZhaWx1cmUgaW4gUG9wdWxhdGVEb3QxMWZXQVBJICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG90MTFmTG9nKCBwTWFjLCBMT0cyLCBGTCgiZG90MTFmVW5wYWNrSWVSU04gcmV0dXJuZWQgMHglMDh4IGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9wdWxhdGVEb3QxMWZXQVBJLlxuIiksIHN0YXR1cyApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmV0FQSS4KKwordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZldBUElPcGFxdWUoIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUlNOaWUgICAgICAgICAgcFJzbkllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV0FQSU9wYXF1ZSAqcERvdDExZiApCit7CisgICAgaW50IGlkeDsKKworICAgIGlmICggcFJzbkllLT5sZW5ndGggKQorICAgIHsKKyAgICAgICAgaWYoIDAgPD0gKCBpZHggPSBGaW5kSUVMb2NhdGlvbiggcE1hYywgcFJzbkllLCBET1QxMUZfRUlEX1dBUEkgKSApICkKKyAgICAgICAgeworICAgICAgICBwRG90MTFmLT5wcmVzZW50ICA9IDE7CisgICAgICAgIHBEb3QxMWYtPm51bV9kYXRhID0gcFJzbkllLT5yc25JRWRhdGFbIGlkeCArIDEgXTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcERvdDExZi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFJzbkllLT5yc25JRWRhdGEgKyBpZHggKyAyLCAgICAvLyBFSUQsIGxlbgorICAgICAgICAgICAgICAgICAgICAgICBwUnNuSWUtPnJzbklFZGF0YVsgaWR4ICsgMSBdICk7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmV0FQSU9wYXF1ZS4KKworCisjZW5kaWYgLy9kZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorCit2b2lkCitQb3B1bGF0ZURvdDExZlNTSUQodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICB0U2lyTWFjU1NpZCAgICpwSW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgdERvdDExZklFU1NJRCAqcERvdDExZikKK3sKKyAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKKyAgICBwRG90MTFmLT5udW1fc3NpZCA9IHBJbnRlcm5hbC0+bGVuZ3RoOworICAgIGlmICggcEludGVybmFsLT5sZW5ndGggKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApcERvdDExZi0+c3NpZCwgKCB0QU5JX1U4KiApJnBJbnRlcm5hbC0+c3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgcEludGVybmFsLT5sZW5ndGggKTsKKyAgICB9Cit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZlNTSUQuCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmU1NJRDIodHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgdERvdDExZklFU1NJRCAqcERvdDExZikKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgICAgbkNmZzsKKyAgICB0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisKKyAgICBDRkdfR0VUX1NUUiggblNpclN0YXR1cywgcE1hYywgV05JX0NGR19TU0lELCBwRG90MTFmLT5zc2lkLCBuQ2ZnLCAzMiApOworICAgIHBEb3QxMWYtPm51bV9zc2lkID0gKCB0QU5JX1U4ICluQ2ZnOworICAgIHBEb3QxMWYtPnByZXNlbnQgID0gMTsKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZTU0lEMi4KKwordm9pZAorUG9wdWxhdGVEb3QxMWZTY2hlZHVsZSh0U2lyTWFjU2NoZWR1bGVJRSAqcFNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTY2hlZHVsZSAqcERvdDExZikKK3sKKyAgICBwRG90MTFmLT5hZ2dyZWdhdGlvbiAgICAgICAgPSBwU2NoZWR1bGUtPmluZm8uYWdncmVnYXRpb247CisgICAgcERvdDExZi0+dHNpZCAgICAgICAgICAgICAgID0gcFNjaGVkdWxlLT5pbmZvLnRzaWQ7CisgICAgcERvdDExZi0+ZGlyZWN0aW9uICAgICAgICAgID0gcFNjaGVkdWxlLT5pbmZvLmRpcmVjdGlvbjsKKyAgICBwRG90MTFmLT5yZXNlcnZlZCAgICAgICAgICAgPSBwU2NoZWR1bGUtPmluZm8ucnN2ZDsKKyAgICBwRG90MTFmLT5zZXJ2aWNlX3N0YXJ0X3RpbWUgPSBwU2NoZWR1bGUtPnN2Y1N0YXJ0VGltZTsKKyAgICBwRG90MTFmLT5zZXJ2aWNlX2ludGVydmFsICAgPSBwU2NoZWR1bGUtPnN2Y0ludGVydmFsOworICAgIHBEb3QxMWYtPm1heF9zZXJ2aWNlX2R1ciAgICA9IHBTY2hlZHVsZS0+bWF4U3ZjRHVyYXRpb247CisgICAgcERvdDExZi0+c3BlY19pbnRlcnZhbCAgICAgID0gcFNjaGVkdWxlLT5zcGVjSW50ZXJ2YWw7CisKKyAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmU2NoZWR1bGUuCisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmU3VwcENoYW5uZWxzKHRwQW5pU2lyR2xvYmFsICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVN1cHBDaGFubmVscyAqcERvdDExZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggbkFzc29jVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VOCAgaTsKKyAgICB0QU5JX1U4ICpwOworCisgICAgaWYgKG5Bc3NvY1R5cGUgPT0gTElNX1JFQVNTT0MpCisgICAgeworICAgICAgICBwID0gKCB0QU5JX1U4KiApcHNlc3Npb25FbnRyeS0+cExpbVJlQXNzb2NSZXEtPnN1cHBvcnRlZENoYW5uZWxzLmNoYW5uZWxMaXN0OworICAgICAgICBwRG90MTFmLT5udW1fYmFuZHMgPSBwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+c3VwcG9ydGVkQ2hhbm5lbHMubnVtQ2hubDsKKyAgICB9ZWxzZQorICAgIHsKKyAgICAgICAgcCA9ICggdEFOSV9VOCogKXBzZXNzaW9uRW50cnktPnBMaW1Kb2luUmVxLT5zdXBwb3J0ZWRDaGFubmVscy5jaGFubmVsTGlzdDsKKyAgICAgICAgcERvdDExZi0+bnVtX2JhbmRzID0gcHNlc3Npb25FbnRyeS0+cExpbUpvaW5SZXEtPnN1cHBvcnRlZENoYW5uZWxzLm51bUNobmw7CisgICAgfQorICAgIGZvciAoIGkgPSAwVTsgaSA8IHBEb3QxMWYtPm51bV9iYW5kczsgKytpLCArK3ApCisgICAgeworICAgICAgICBwRG90MTFmLT5iYW5kc1tpXVswXSA9ICpwOworICAgICAgICBwRG90MTFmLT5iYW5kc1tpXVsxXSA9IDE7CisgICAgfQorCisgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmU3VwcENoYW5uZWxzLgorCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZlN1cHBSYXRlcyh0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgbkNoYW5uZWxOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTdXBwUmF0ZXMgKnBEb3QxMWYsdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgICB0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisgICAgdEFOSV9VMzIgICAgICAgICAgIG5SYXRlczsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgcmF0ZXNbU0lSX01BQ19NQVhfTlVNQkVSX09GX1JBVEVTXTsKKworICAgLyogVXNlIHRoZSBvcGVyYXRpb25hbCByYXRlcyBwcmVzZW50IGluIHNlc3Npb24gZW50cnkgd2hlbmV2ZXIgbkNoYW5uZWxOdW0gaXMgc2V0IHRvIE9QRVJBVElPTkFMCisgICAgICAgZWxzZSB1c2UgdGhlIHN1cHBvcnRlZCByYXRlIHNldCBmcm9tIENGRywgd2hpY2ggaXMgZml4ZWQgYW5kIGRvZXMgbm90IGNoYW5nZSBkeW5hbWljYWxseSBhbmQgaXMgdXNlZCBmb3IKKyAgICAgICBzZW5kaW5nIG1nbXQgZnJhbWVzIChsaWxlIHByb2JlIHJlcSkgd2hpY2ggbmVlZCB0byBnbyBvdXQgYmVmb3JlIGFueSBzZXNzaW9uIGlzIHByZXNlbnQuCisgICAqLworICAgIGlmKFBPUFVMQVRFX0RPVDExRl9SQVRFU19PUEVSQVRJT05BTCA9PSBuQ2hhbm5lbE51bSApCisgICAgeworICAgICAgICAjaWYgMAorICAgICAgICBDRkdfR0VUX1NUUiggblNpclN0YXR1cywgcE1hYywgV05JX0NGR19PUEVSQVRJT05BTF9SQVRFX1NFVCwKKyAgICAgICAgICAgICAgICAgICAgIHJhdGVzLCBuUmF0ZXMsIFNJUl9NQUNfTUFYX05VTUJFUl9PRl9SQVRFUyApOworICAgICAgICAjZW5kaWYgLy9UTyBTVVBQT1JUIEJULUFNUAorICAgICAgICBpZihwc2Vzc2lvbkVudHJ5ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5SYXRlcyA9IHBzZXNzaW9uRW50cnktPnJhdGVTZXQubnVtUmF0ZXM7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHJhdGVzLCBwc2Vzc2lvbkVudHJ5LT5yYXRlU2V0LnJhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBuUmF0ZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZG90MTFmTG9nKCBwTWFjLCBMT0dFLCBGTCgibm8gc2Vzc2lvbiBjb250ZXh0IGV4aXN0cyB3aGlsZSBwb3B1bGF0aW5nIE9wZXJhdGlvbmFsIFJhdGUgU2V0XG4iKSk7CisgICAgICAgICAgICBuUmF0ZXMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCAxNCA+PSBuQ2hhbm5lbE51bSApCisgICAgeworICAgICAgICBDRkdfR0VUX1NUUiggblNpclN0YXR1cywgcE1hYywgV05JX0NGR19TVVBQT1JURURfUkFURVNfMTFCLAorICAgICAgICAgICAgICAgICAgICAgcmF0ZXMsIG5SYXRlcywgU0lSX01BQ19NQVhfTlVNQkVSX09GX1JBVEVTICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENGR19HRVRfU1RSKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX1NVUFBPUlRFRF9SQVRFU18xMUEsCisgICAgICAgICAgICAgICAgICAgICByYXRlcywgblJhdGVzLCBTSVJfTUFDX01BWF9OVU1CRVJfT0ZfUkFURVMgKTsKKyAgICB9CisKKyAgICBpZiAoIDAgIT0gblJhdGVzICkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPm51bV9yYXRlcyA9ICggdEFOSV9VOCApblJhdGVzOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRG90MTFmLT5yYXRlcywgcmF0ZXMsIG5SYXRlcyApOworICAgICAgICBwRG90MTFmLT5wcmVzZW50ICAgPSAxOworICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmU3VwcFJhdGVzLgorCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZlRQQ1JlcG9ydCh0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUUENSZXBvcnQgKnBEb3QxMWYsCisgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHRBTklfVTE2IHN0YWlkLCB0eFBvd2VyOworICAgIHRTaXJSZXRTdGF0dXMgblNpclN0YXR1czsKKworICAgIG5TaXJTdGF0dXMgPSBsaW1HZXRNZ210U3RhaWQoIHBNYWMsICZzdGFpZCwgcHNlc3Npb25FbnRyeSk7CisgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gblNpclN0YXR1cyApCisgICAgeworICAgICAgICBkb3QxMWZMb2coIHBNYWMsIExPRzEsIEZMKCJGYWlsZWQgdG8gZ2V0IHRoZSBTVEFJRCBpbiBQb3B1bGF0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlRG90MTFmVFBDUmVwb3J0OyBsaW1HZXRNZ210U3RhaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCBzdGF0dXMgJWQuXG4iKSwKKyAgICAgICAgICAgICAgICAgICBuU2lyU3RhdHVzICk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gRnJhbWVzVG9EbzogVGhpcyBmdW5jdGlvbiB3YXMgIm1pc3BsYWNlZCIgaW4gdGhlIG1vdmUgdG8gR2VuNF9UVk0uLi4KKyAgICAvLyB0eFBvd2VyID0gaGFsR2V0UmF0ZVRvUHdyVmFsdWUoIHBNYWMsIHN0YWlkLCBwTWFjLT5saW0uZ0xpbUN1cnJlbnRDaGFubmVsSWQsIGlzQmVhY29uICk7CisgICAgdHhQb3dlciA9IDA7CisgICAgcERvdDExZi0+dHhfcG93ZXIgICAgPSAoIHRBTklfVTggKXR4UG93ZXI7CisgICAgcERvdDExZi0+bGlua19tYXJnaW4gPSAwOworICAgIHBEb3QxMWYtPnByZXNlbnQgICAgID0gMTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZlRQQ1JlcG9ydC4KKworCit2b2lkIFBvcHVsYXRlRG90MTFmVFNJbmZvKHRTaXJNYWNUU0luZm8gICAqcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZGZlRTSW5mbyAqcERvdDExZikKK3sKKyAgICBwRG90MTFmLT50cmFmZmljX3R5cGUgICA9IHBJbmZvLT50cmFmZmljLnRyYWZmaWNUeXBlOworICAgIHBEb3QxMWYtPnRzaWQgICAgICAgICAgID0gcEluZm8tPnRyYWZmaWMudHNpZDsKKyAgICBwRG90MTFmLT5kaXJlY3Rpb24gICAgICA9IHBJbmZvLT50cmFmZmljLmRpcmVjdGlvbjsKKyAgICBwRG90MTFmLT5hY2Nlc3NfcG9saWN5ICA9IHBJbmZvLT50cmFmZmljLmFjY2Vzc1BvbGljeTsKKyAgICBwRG90MTFmLT5hZ2dyZWdhdGlvbiAgICA9IHBJbmZvLT50cmFmZmljLmFnZ3JlZ2F0aW9uOworICAgIHBEb3QxMWYtPnBzYiAgICAgICAgICAgID0gcEluZm8tPnRyYWZmaWMucHNiOworICAgIHBEb3QxMWYtPnVzZXJfcHJpb3JpdHkgID0gcEluZm8tPnRyYWZmaWMudXNlclByaW87CisgICAgcERvdDExZi0+dHNpbmZvX2Fja19wb2wgPSBwSW5mby0+dHJhZmZpYy5hY2tQb2xpY3k7CisgICAgcERvdDExZi0+c2NoZWR1bGUgICAgICAgPSBwSW5mby0+c2NoZWR1bGUuc2NoZWR1bGU7Cit9IC8vIEVuZCBQb3B1bGF0ZWREb3QxMWZUU0luZm8uCisKK3ZvaWQgUG9wdWxhdGVEb3QxMWZXTU0odHBBbmlTaXJHbG9iYWwgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1JbmZvQXAgICpwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NUGFyYW1zICpwUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1DYXBzICAgKnBDYXBzLAorICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiAgICAgICAgcHNlc3Npb25FbnRyeSkKK3sKKyAgICBpZiAoIHBzZXNzaW9uRW50cnktPmxpbVdtZUVuYWJsZWQgKQorICAgIHsKKyAgICAgICAgaWYgKCBlTElNX1NUQV9JTl9JQlNTX1JPTEUgPT0gcHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYgKCAhIHNpcklzUHJvcENhcGFiaWxpdHlFbmFibGVkKCBwTWFjLCBTSVJfTUFDX1BST1BfQ0FQQUJJTElUWV9XTUUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1JbmZvQXAoIHBNYWMsIHBJbmZvLCBwc2Vzc2lvbkVudHJ5ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1QYXJhbXMoIHBNYWMsIHBQYXJhbXMsIHBzZXNzaW9uRW50cnkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgIGlmICggcHNlc3Npb25FbnRyeS0+bGltV3NtRW5hYmxlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1DYXBzKCBwQ2FwcyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZXTU0uCisKK3ZvaWQgUG9wdWxhdGVEb3QxMWZXTU1DYXBzKHREb3QxMWZJRVdNTUNhcHMgKnBDYXBzKQoreworICAgIHBDYXBzLT52ZXJzaW9uICAgICAgID0gU0lSX01BQ19PVUlfVkVSU0lPTl8xOworICAgIHBDYXBzLT5xYWNrICAgICAgICAgID0gMDsKKyAgICBwQ2Fwcy0+cXVldWVfcmVxdWVzdCA9IDE7CisgICAgcENhcHMtPnR4b3BfcmVxdWVzdCAgPSAwOworICAgIHBDYXBzLT5tb3JlX2FjayAgICAgID0gMDsKKyAgICBwQ2Fwcy0+cHJlc2VudCAgICAgICA9IDE7Cit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZldtbUNhcHMuCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCit2b2lkIFBvcHVsYXRlRG90MTFmUmVBc3NvY1RzcGVjKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZSZUFzc29jUmVxdWVzdCAqcFJlYXNzb2MsIHRwUEVTZXNzaW9uIHBzZXNzaW9uRW50cnkpCit7CisgICAgdEFOSV9VOCBudW1Uc3BlY3MgPSAwLCBpZHg7CisgICAgdFRzcGVjSW5mbyAqcFRzcGVjID0gTlVMTDsKKworICAgIG51bVRzcGVjcyA9IHBzZXNzaW9uRW50cnktPnBMaW1SZUFzc29jUmVxLT5jY3hUc3BlY0luZm8ubnVtVHNwZWNzOworICAgIHBUc3BlYyA9ICZwc2Vzc2lvbkVudHJ5LT5wTGltUmVBc3NvY1JlcS0+Y2N4VHNwZWNJbmZvLnRzcGVjWzBdOworICAgIHBSZWFzc29jLT5udW1fV01NVFNQRUMgPSBudW1Uc3BlY3M7CisgICAgaWYgKG51bVRzcGVjcykgeworICAgICAgICBmb3IgKGlkeD0wOyBpZHg8bnVtVHNwZWNzOyBpZHgrKykgeworICAgICAgICAgICAgUG9wdWxhdGVEb3QxMWZXTU1UU1BFQygmcFRzcGVjLT50c3BlYywgJnBSZWFzc29jLT5XTU1UU1BFQ1tpZHhdKTsKKyAgICAgICAgICAgIHBUc3BlYysrOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIAorCit2b2lkIFBvcHVsYXRlRG90MTFmV01NSW5mb0FwKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRVdNTUluZm9BcCAqcEluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5KQoreworICAgIHBJbmZvLT52ZXJzaW9uID0gU0lSX01BQ19PVUlfVkVSU0lPTl8xOworCisgICAgLyogV01NIFNwZWNpZmljYXRpb24gMy4xLjMsIDMuMi4zCisgICAgICogQW4gSUJTUyBzdGFpb24gc2hhbGwgYWx3YXlzIHVzZSBpdHMgZGVmYXVsdCBXTU0gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBpZiAoIGVMSU1fU1RBX0lOX0lCU1NfUk9MRSA9PSBwc2Vzc2lvbkVudHJ5LT5saW1TeXN0ZW1Sb2xlICkKKyAgICB7CisgICAgICAgIHBJbmZvLT5wYXJhbV9zZXRfY291bnQgPSAwOworICAgICAgICBwSW5mby0+dWFwc2QgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwSW5mby0+cGFyYW1fc2V0X2NvdW50ID0gKCAweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtU2V0Q291bnQgKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICl7CisgICAgICAgICAgICBwSW5mby0+dWFwc2QgPSAoIDB4MSAmIHBzZXNzaW9uRW50cnktPmFwVWFwc2RFbmFibGUgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHBJbmZvLT51YXBzZCA9ICggMHgxICYgcE1hYy0+bGltLmdVYXBzZEVuYWJsZSApOworICAgIH0KKyAgICBwSW5mby0+cHJlc2VudCA9IDE7Cit9CisKK3ZvaWQgUG9wdWxhdGVEb3QxMWZXTU1JbmZvU3RhdGlvbih0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiAqcEluZm8pCit7CisgICAgdEFOSV9VMzIgIHZhbCA9IDA7CisKKyAgICBwSW5mby0+dmVyc2lvbiA9IFNJUl9NQUNfT1VJX1ZFUlNJT05fMTsKKyAgICBwSW5mby0+YWN2b191YXBzZCA9IExJTV9VQVBTRF9HRVQoQUNWTywgcE1hYy0+bGltLmdVYXBzZFBlckFjQml0bWFzayk7CisgICAgcEluZm8tPmFjdmlfdWFwc2QgPSBMSU1fVUFQU0RfR0VUKEFDVkksIHBNYWMtPmxpbS5nVWFwc2RQZXJBY0JpdG1hc2spOworICAgIHBJbmZvLT5hY2JrX3VhcHNkID0gTElNX1VBUFNEX0dFVChBQ0JLLCBwTWFjLT5saW0uZ1VhcHNkUGVyQWNCaXRtYXNrKTsKKyAgICBwSW5mby0+YWNiZV91YXBzZCA9IExJTV9VQVBTRF9HRVQoQUNCRSwgcE1hYy0+bGltLmdVYXBzZFBlckFjQml0bWFzayk7CisKKyAgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX01BWF9TUF9MRU5HVEgsICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykgCisgICAgICAgIFBFTE9HRShsaW1Mb2cocE1hYywgTE9HRSwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBNYXggU1AgTGVuZ3RoIFxuIikpOykKKworICAgIHBJbmZvLT5tYXhfc3BfbGVuZ3RoID0gKHRBTklfVTgpdmFsOworICAgIHBJbmZvLT5wcmVzZW50ID0gMTsKK30KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3ZvaWQgUG9wdWxhdGVEb3QxMWZXTU1QYXJhbXModHBBbmlTaXJHbG9iYWwgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1QYXJhbXMgKnBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwUEVTZXNzaW9uICAgICAgICBwc2Vzc2lvbkVudHJ5KQorI2Vsc2UKK3ZvaWQgUG9wdWxhdGVEb3QxMWZXTU1QYXJhbXModHBBbmlTaXJHbG9iYWwgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1QYXJhbXMgKnBQYXJhbXMpCisjZW5kaWYKK3sKKyAgICBwUGFyYW1zLT52ZXJzaW9uID0gU0lSX01BQ19PVUlfVkVSU0lPTl8xOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFKQorICAgICAgIHBQYXJhbXMtPnFvc0luZm8gPQorICAgICAgICAgICAocHNlc3Npb25FbnRyeS0+YXBVYXBzZEVuYWJsZSA8PCA3KSB8ICgodEFOSV9VOCkoMHgwZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1TZXRDb3VudCkpOworICAgIGVsc2UgCisjZW5kaWYKKyAgICAgICBwUGFyYW1zLT5xb3NJbmZvID0KKyAgICAgICAgICAgKHBNYWMtPmxpbS5nVWFwc2RFbmFibGUgPDwgNykgfCAoKHRBTklfVTgpKDB4MGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtU2V0Q291bnQpKTsKKworICAgIC8vIEZpbGwgZWFjaCBFRENBIHBhcmFtZXRlciBzZXQgaW4gb3JkZXI6IGJlLCBiaywgdmksIHZvCisgICAgcFBhcmFtcy0+YWNiZV9haWZzbiAgICAgPSAoIDB4ZiAmIFNFVF9BSUZTTihwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzBdLmFjaS5haWZzbikgKTsKKyAgICBwUGFyYW1zLT5hY2JlX2FjbSAgICAgICA9ICggMHgxICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1swXS5hY2kuYWNtICk7CisgICAgcFBhcmFtcy0+YWNiZV9hY2kgICAgICAgPSAoIDB4MyAmIFNJUl9NQUNfRURDQUFDSV9CRVNURUZGT1JUICk7CisgICAgcFBhcmFtcy0+YWNiZV9hY3dtaW4gICAgPSAoIDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMF0uY3cubWluICk7CisgICAgcFBhcmFtcy0+YWNiZV9hY3dtYXggICAgPSAoIDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMF0uY3cubWF4ICk7CisgICAgcFBhcmFtcy0+YWNiZV90eG9wbGltaXQgPSBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzBdLnR4b3BsaW1pdDsKKworICAgIHBQYXJhbXMtPmFjYmtfYWlmc24gICAgID0gKCAweGYgJiBTRVRfQUlGU04ocHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS5hY2kuYWlmc24pICk7CisgICAgcFBhcmFtcy0+YWNia19hY20gICAgICAgPSAoIDB4MSAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMV0uYWNpLmFjbSApOworICAgIHBQYXJhbXMtPmFjYmtfYWNpICAgICAgID0gKCAweDMgJiBTSVJfTUFDX0VEQ0FBQ0lfQkFDS0dST1VORCApOworICAgIHBQYXJhbXMtPmFjYmtfYWN3bWluICAgID0gKCAweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzFdLmN3Lm1pbiApOworICAgIHBQYXJhbXMtPmFjYmtfYWN3bWF4ICAgID0gKCAweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzFdLmN3Lm1heCApOworICAgIHBQYXJhbXMtPmFjYmtfdHhvcGxpbWl0ID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1sxXS50eG9wbGltaXQ7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYocHNlc3Npb25FbnRyeS0+bGltU3lzdGVtUm9sZSA9PSBlTElNX0FQX1JPTEUgKQorICAgICAgICBwUGFyYW1zLT5hY3ZpX2FpZnNuICAgICA9ICggMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1syXS5hY2kuYWlmc24gKTsKKyAgICBlbHNlCisjZW5kaWYgCisgICAgICAgIHBQYXJhbXMtPmFjdmlfYWlmc24gICAgID0gKCAweGYgJiBTRVRfQUlGU04ocHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1syXS5hY2kuYWlmc24pICk7CisKKworCisgICAgcFBhcmFtcy0+YWN2aV9hY20gICAgICAgPSAoIDB4MSAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMl0uYWNpLmFjbSApOworICAgIHBQYXJhbXMtPmFjdmlfYWNpICAgICAgID0gKCAweDMgJiBTSVJfTUFDX0VEQ0FBQ0lfVklERU8gKTsKKyAgICBwUGFyYW1zLT5hY3ZpX2Fjd21pbiAgICA9ICggMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1syXS5jdy5taW4gKTsKKyAgICBwUGFyYW1zLT5hY3ZpX2Fjd21heCAgICA9ICggMHhmICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1syXS5jdy5tYXggKTsKKyAgICBwUGFyYW1zLT5hY3ZpX3R4b3BsaW1pdCA9IHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbMl0udHhvcGxpbWl0OworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKHBzZXNzaW9uRW50cnktPmxpbVN5c3RlbVJvbGUgPT0gZUxJTV9BUF9ST0xFICkKKyAgICAgICAgcFBhcmFtcy0+YWN2b19haWZzbiAgICAgPSAoIDB4ZiAmIHBzZXNzaW9uRW50cnktPmdMaW1FZGNhUGFyYW1zQkNbM10uYWNpLmFpZnNuICk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHBQYXJhbXMtPmFjdm9fYWlmc24gICAgID0gKCAweGYgJiBTRVRfQUlGU04ocHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1szXS5hY2kuYWlmc24pICk7CisKKyAgICBwUGFyYW1zLT5hY3ZvX2FjbSAgICAgICA9ICggMHgxICYgcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1szXS5hY2kuYWNtICk7CisgICAgcFBhcmFtcy0+YWN2b19hY2kgICAgICAgPSAoIDB4MyAmIFNJUl9NQUNfRURDQUFDSV9WT0lDRSApOworICAgIHBQYXJhbXMtPmFjdm9fYWN3bWluICAgID0gKCAweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzNdLmN3Lm1pbiApOworICAgIHBQYXJhbXMtPmFjdm9fYWN3bWF4ICAgID0gKCAweGYgJiBwc2Vzc2lvbkVudHJ5LT5nTGltRWRjYVBhcmFtc0JDWzNdLmN3Lm1heCApOworICAgIHBQYXJhbXMtPmFjdm9fdHhvcGxpbWl0ID0gcHNlc3Npb25FbnRyeS0+Z0xpbUVkY2FQYXJhbXNCQ1szXS50eG9wbGltaXQ7CisKKyAgICBwUGFyYW1zLT5wcmVzZW50ID0gMTsKKworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZXTU1QYXJhbXMuCisKK3ZvaWQgUG9wdWxhdGVEb3QxMWZXTU1TY2hlZHVsZSh0U2lyTWFjU2NoZWR1bGVJRSAgICAqcFNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdNTVNjaGVkdWxlICpwRG90MTFmKQoreworICAgIHBEb3QxMWYtPnZlcnNpb24gICAgICAgICAgICA9IDE7CisgICAgcERvdDExZi0+YWdncmVnYXRpb24gICAgICAgID0gcFNjaGVkdWxlLT5pbmZvLmFnZ3JlZ2F0aW9uOworICAgIHBEb3QxMWYtPnRzaWQgICAgICAgICAgICAgICA9IHBTY2hlZHVsZS0+aW5mby50c2lkOworICAgIHBEb3QxMWYtPmRpcmVjdGlvbiAgICAgICAgICA9IHBTY2hlZHVsZS0+aW5mby5kaXJlY3Rpb247CisgICAgcERvdDExZi0+cmVzZXJ2ZWQgICAgICAgICAgID0gcFNjaGVkdWxlLT5pbmZvLnJzdmQ7CisgICAgcERvdDExZi0+c2VydmljZV9zdGFydF90aW1lID0gcFNjaGVkdWxlLT5zdmNTdGFydFRpbWU7CisgICAgcERvdDExZi0+c2VydmljZV9pbnRlcnZhbCAgID0gcFNjaGVkdWxlLT5zdmNJbnRlcnZhbDsKKyAgICBwRG90MTFmLT5tYXhfc2VydmljZV9kdXIgICAgPSBwU2NoZWR1bGUtPm1heFN2Y0R1cmF0aW9uOworICAgIHBEb3QxMWYtPnNwZWNfaW50ZXJ2YWwgICAgICA9IHBTY2hlZHVsZS0+c3BlY0ludGVydmFsOworCisgICAgcERvdDExZi0+cHJlc2VudCA9IDE7Cit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZldNTVNjaGVkdWxlLgorCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZldQQSh0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICAgICAgICAgICAgICAgIHRwU2lyUlNOaWUgICAgICBwUnNuSWUsCisgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXUEEgICAqcERvdDExZikKK3sKKyAgICB0QU5JX1UzMiAgICAgICAgc3RhdHVzOworICAgIGludCBpZHg7CisKKyAgICBpZiAoIHBSc25JZS0+bGVuZ3RoICkKKyAgICB7CisgICAgICAgIGlmKCAwIDw9ICggaWR4ID0gRmluZElFTG9jYXRpb24oIHBNYWMsIHBSc25JZSwgRE9UMTFGX0VJRF9XUEEgKSApICkKKyAgICAgICAgeworICAgICAgICBzdGF0dXMgPSBkb3QxMWZVbnBhY2tJZVdQQSggcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSc25JZS0+cnNuSUVkYXRhICsgaWR4ICsgMiArIDQsICAvLyBFSUQsIGxlbmd0aCwgT1VJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnNuSWUtPnJzbklFZGF0YVsgaWR4ICsgMSBdIC0gNCwgLy8gT1VJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRG90MTFmICk7CisgICAgICAgIGlmICggRE9UMTFGX0ZBSUxFRCggc3RhdHVzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3QxMWZMb2coIHBNYWMsIExPR0UsIEZMKCJQYXJzZSBmYWlsdXJlIGluIFBvcHVsYXRlRG90MTFmV1AiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBICgweCUwOHgpLlxuIiksCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyApOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZXUEEuCisKKworCit0U2lyUmV0U3RhdHVzIFBvcHVsYXRlRG90MTFmV1BBT3BhcXVlKCB0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpclJTTmllICAgICAgICAgIHBSc25JZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdQQU9wYXF1ZSAqcERvdDExZiApCit7CisgICAgaW50IGlkeDsKKworICAgIGlmICggcFJzbkllLT5sZW5ndGggKQorICAgIHsKKyAgICAgICAgaWYoIDAgPD0gKCBpZHggPSBGaW5kSUVMb2NhdGlvbiggcE1hYywgcFJzbkllLCBET1QxMUZfRUlEX1dQQSApICkgKQorICAgICAgICB7CisgICAgICAgIHBEb3QxMWYtPnByZXNlbnQgID0gMTsKKyAgICAgICAgcERvdDExZi0+bnVtX2RhdGEgPSBwUnNuSWUtPnJzbklFZGF0YVsgaWR4ICsgMSBdIC0gNDsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcERvdDExZi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFJzbkllLT5yc25JRWRhdGEgKyBpZHggKyAyICsgNCwgICAgLy8gRUlELCBsZW4sIE9VSQorICAgICAgICAgICAgICAgICAgICAgICBwUnNuSWUtPnJzbklFZGF0YVsgaWR4ICsgMSBdIC0gNCApOyAvLyBPVUkKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZXUEFPcGFxdWUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0U2lyUmV0U3RhdHVzCitzaXJHZXRDZmdQcm9wQ2Fwcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UxNiAqY2FwcykKK3sKKyNpZiAwCisgICAgdEFOSV9VMzIgdmFsOworCisgICAgKmNhcHMgPSAwOworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1BST1BSSUVUQVJZX0FOSV9GRUFUVVJFU19FTkFCTEVELCAmdmFsKQorICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBQcm9wRmVhdHVyZSBlbmFibGVkIGZsYWdcbiIpKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUFJPUF9DQVBBQklMSVRZLCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNvdWxkIG5vdCByZXRyaWV2ZSBQUk9QX0NBUEFCTElUWSBmbGFnXG4iKSk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgKmNhcHMgPSAodEFOSV9VMTYpIHZhbDsKKyNlbmRpZgorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnRQcm9iZVJlcUZyYW1lMlN0cnVjdCh0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICpwRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgbkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUHJvYmVSZXEgICBwUHJvYmVSZXEpCit7CisgICAgdEFOSV9VMzIgc3RhdHVzOworICAgIHREb3QxMWZQcm9iZVJlcXVlc3QgcHI7CisKKyAgICAvLyBPaywgemVyby1pbml0IG91ciBbb3V0XSBwYXJhbWV0ZXIsCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTgqKXBQcm9iZVJlcSwgc2l6ZW9mKHRTaXJQcm9iZVJlcSkpOworCisgICAgLy8gZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsCisgICAgc3RhdHVzID0gZG90MTFmVW5wYWNrUHJvYmVSZXF1ZXN0KHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmcHIpOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFyc2UgYSBQcm9iZSBSZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgICAgICAgc3RhdHVzLCBuRnJhbWUpOworICAgICAgICBQRUxPRzIoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHVucGFja2luZyBhIFByb2JlIFJlcXVlc3QgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lICk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgIH0KKworICAgIC8vICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZlByb2JlUmVxdWVzdHRvJyBhICd0U2lyUHJvYmVSZXEnLi4uCisgICAgaWYgKCAhIHByLlNTSUQucHJlc2VudCApCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJNYW5kYXRvcnkgSUUgU1NJRCBub3QgcHJlc2VudCFcbiIpKTspCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBQcm9iZVJlcS0+c3NpZFByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0U1NJRCggcE1hYywgJnBQcm9iZVJlcS0+c3NJZCwgJnByLlNTSUQgKTsKKyAgICB9CisKKyAgICBpZiAoICEgcHIuU3VwcFJhdGVzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiTWFuZGF0b3J5IElFIFN1cHBvcnRlZCBSYXRlcyBub3QgcHJlc2VudCFcbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBQcm9iZVJlcS0+c3VwcFJhdGVzUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRTdXBwUmF0ZXMoIHBNYWMsICZwUHJvYmVSZXEtPnN1cHBvcnRlZFJhdGVzLCAmcHIuU3VwcFJhdGVzICk7CisgICAgfQorCisgICAgaWYgKCBwci5FeHRTdXBwUmF0ZXMucHJlc2VudCApCisgICAgeworICAgICAgICBwUHJvYmVSZXEtPmV4dGVuZGVkUmF0ZXNQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydEV4dFN1cHBSYXRlcyggcE1hYywgJnBQcm9iZVJlcS0+ZXh0ZW5kZWRSYXRlcywgJnByLkV4dFN1cHBSYXRlcyApOworICAgIH0KKworICAgIGlmICggcHIuSFRDYXBzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYywgJnBQcm9iZVJlcS0+SFRDYXBzLCAmcHIuSFRDYXBzLCBzaXplb2YoIHREb3QxMWZJRUhUQ2FwcyApICk7CisgICAgfQorCisgICAgaWYgKCBwci5Xc2NQcm9iZVJlcS5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBQcm9iZVJlcS0+d3NjSWVQcmVzZW50ID0gMTsKKyAgICAgICAgbWVtY3B5KCZwUHJvYmVSZXEtPnByb2JlUmVxV3NjSWVJbmZvLCAmcHIuV3NjUHJvYmVSZXEsIHNpemVvZih0RG90MTFmSUVXc2NQcm9iZVJlcSkpOworICAgIH0KKworICAgIGlmICggcHIuUDJQUHJvYmVSZXEucHJlc2VudCApCisgICAgeworICAgICAgICBwUHJvYmVSZXEtPnAycEllUHJlc2VudCA9IDE7CisgICAgfQorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIHNpckNvbnZlcnRQcm9iZVJlcUZyYW1lMlN0cnVjdC4KKwordFNpclJldFN0YXR1cyBzaXJDb252ZXJ0UHJvYmVGcmFtZTJTdHJ1Y3QodHBBbmlTaXJHbG9iYWwgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICAgICAgICAgICAgKnBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgICAgICAgIG5GcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uIHBQcm9iZVJlc3ApCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgc3RhdHVzOworICAgIHREb3QxMWZQcm9iZVJlc3BvbnNlIHByOworCisgICAgLy8gT2ssIHplcm8taW5pdCBvdXIgW291dF0gcGFyYW1ldGVyLAorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKXBQcm9iZVJlc3AsIHNpemVvZih0U2lyUHJvYmVSZXNwQmVhY29uKSApOworICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZwciwgc2l6ZW9mKHREb3QxMWZQcm9iZVJlc3BvbnNlKSApOworCisgICAgCisgICAgLy8gZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsCisgICAgc3RhdHVzID0gZG90MTFmVW5wYWNrUHJvYmVSZXNwb25zZSggcE1hYywgcEZyYW1lLCBuRnJhbWUsICZwciApOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFyc2UgYSBQcm9iZSBSZXNwb25zZSAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lKTsKKyAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBzdGF0dXMgKSApCisgICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbmcgYSBQcm9iZSBSZXNwb25zZSAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgICAgICAgICAgc3RhdHVzLCBuRnJhbWUgKTsKKyAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTspCisgICAgfQorCisgICAgLy8gJiAidHJhbnNsaXRlcmF0ZSIgZnJvbSBhICd0RG90MTFmUHJvYmVSZXNwb25zZScgdG8gYSAndFNpclByb2JlUmVzcEJlYWNvbicuLi4KKworICAgIC8vIFRpbWVzdGFtcAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKXBQcm9iZVJlc3AtPnRpbWVTdGFtcCwgKCB0QU5JX1U4KiApJnByLlRpbWVTdGFtcCwgc2l6ZW9mKHRTaXJNYWNUaW1lU3RhbXApICk7CisKKyAgICAvLyBCZWFjb24gSW50ZXJ2YWwKKyAgICBwUHJvYmVSZXNwLT5iZWFjb25JbnRlcnZhbCA9IHByLkJlYWNvbkludGVydmFsLmludGVydmFsOworCisgICAgLy8gQ2FwYWJpbGl0aWVzCisgICAgcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8uZXNzICAgICAgICAgICAgPSBwci5DYXBhYmlsaXRpZXMuZXNzOworICAgIHBQcm9iZVJlc3AtPmNhcGFiaWxpdHlJbmZvLmlic3MgICAgICAgICAgID0gcHIuQ2FwYWJpbGl0aWVzLmlic3M7CisgICAgcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8uY2ZQb2xsYWJsZSAgICAgPSBwci5DYXBhYmlsaXRpZXMuY2ZQb2xsYWJsZTsKKyAgICBwUHJvYmVSZXNwLT5jYXBhYmlsaXR5SW5mby5jZlBvbGxSZXEgICAgICA9IHByLkNhcGFiaWxpdGllcy5jZlBvbGxSZXE7CisgICAgcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8ucHJpdmFjeSAgICAgICAgPSBwci5DYXBhYmlsaXRpZXMucHJpdmFjeTsKKyAgICBwUHJvYmVSZXNwLT5jYXBhYmlsaXR5SW5mby5zaG9ydFByZWFtYmxlICA9IHByLkNhcGFiaWxpdGllcy5zaG9ydFByZWFtYmxlOworICAgIHBQcm9iZVJlc3AtPmNhcGFiaWxpdHlJbmZvLnBiY2MgICAgICAgICAgID0gcHIuQ2FwYWJpbGl0aWVzLnBiY2M7CisgICAgcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8uY2hhbm5lbEFnaWxpdHkgPSBwci5DYXBhYmlsaXRpZXMuY2hhbm5lbEFnaWxpdHk7CisgICAgcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8uc3BlY3RydW1NZ3QgICAgPSBwci5DYXBhYmlsaXRpZXMuc3BlY3RydW1NZ3Q7CisgICAgcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8ucW9zICAgICAgICAgICAgPSBwci5DYXBhYmlsaXRpZXMucW9zOworICAgIHBQcm9iZVJlc3AtPmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWUgID0gcHIuQ2FwYWJpbGl0aWVzLnNob3J0U2xvdFRpbWU7CisgICAgcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8uYXBzZCAgICAgICAgICAgPSBwci5DYXBhYmlsaXRpZXMuYXBzZDsKKyAgICBwUHJvYmVSZXNwLT5jYXBhYmlsaXR5SW5mby5ycm0gICAgICAgICAgICA9IHByLkNhcGFiaWxpdGllcy5ycm07CisgICAgcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8uZHNzc09mZG0gICAgICAgPSBwci5DYXBhYmlsaXRpZXMuZHNzc09mZG07CisgICAgcFByb2JlUmVzcC0+Y2FwYWJpbGl0eUluZm8uZGVsYXllZEJBICAgICAgID0gcHIuQ2FwYWJpbGl0aWVzLmRlbGF5ZWRCQTsKKyAgICBwUHJvYmVSZXNwLT5jYXBhYmlsaXR5SW5mby5pbW1lZGlhdGVCQSAgICA9IHByLkNhcGFiaWxpdGllcy5pbW1lZGlhdGVCQTsKKworICAgIGlmICggISBwci5TU0lELnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiTWFuZGF0b3J5IElFIFNTSUQgbm90IHByZXNlbnQhXG4iKSk7KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwUHJvYmVSZXNwLT5zc2lkUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRTU0lEKCBwTWFjLCAmcFByb2JlUmVzcC0+c3NJZCwgJnByLlNTSUQgKTsKKyAgICB9CisKKyAgICBpZiAoICEgcHIuU3VwcFJhdGVzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiTWFuZGF0b3J5IElFIFN1cHBvcnRlZCBSYXRlcyBub3QgcHJlc2VudCFcbiIpKTspCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBQcm9iZVJlc3AtPnN1cHBSYXRlc1ByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0U3VwcFJhdGVzKCBwTWFjLCAmcFByb2JlUmVzcC0+c3VwcG9ydGVkUmF0ZXMsICZwci5TdXBwUmF0ZXMgKTsKKyAgICB9CisKKyAgICBpZiAoIHByLkV4dFN1cHBSYXRlcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBQcm9iZVJlc3AtPmV4dGVuZGVkUmF0ZXNQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydEV4dFN1cHBSYXRlcyggcE1hYywgJnBQcm9iZVJlc3AtPmV4dGVuZGVkUmF0ZXMsICZwci5FeHRTdXBwUmF0ZXMgKTsKKyAgICB9CisKKworICAgIGlmICggcHIuQ0ZQYXJhbXMucHJlc2VudCApCisgICAgeworICAgICAgICBwUHJvYmVSZXNwLT5jZlByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0Q0ZQYXJhbXMoIHBNYWMsICZwUHJvYmVSZXNwLT5jZlBhcmFtU2V0LCAmcHIuQ0ZQYXJhbXMgKTsKKyAgICB9CisKKyAgICBpZiAoIHByLkNvdW50cnkucHJlc2VudCApCisgICAgeworICAgICAgICBwUHJvYmVSZXNwLT5jb3VudHJ5SW5mb1ByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0Q291bnRyeSggcE1hYywgJnBQcm9iZVJlc3AtPmNvdW50cnlJbmZvUGFyYW0sICZwci5Db3VudHJ5ICk7CisgICAgfQorCisgICAgaWYgKCBwci5FRENBUGFyYW1TZXQucHJlc2VudCApCisgICAgeworICAgICAgICBwUHJvYmVSZXNwLT5lZGNhUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRFRENBUGFyYW0oIHBNYWMsICZwUHJvYmVSZXNwLT5lZGNhUGFyYW1zLCAmcHIuRURDQVBhcmFtU2V0ICk7CisgICAgfQorCisgICAgaWYgKCBwci5DaGFuU3dpdGNoQW5uLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcFByb2JlUmVzcC0+Y2hhbm5lbFN3aXRjaFByZXNlbnQgPSAxOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLCAmcFByb2JlUmVzcC0+Y2hhbm5lbFN3aXRjaElFLCAmcHIuQ2hhblN3aXRjaEFubiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHREb3QxMWZJRUV4dENoYW5Td2l0Y2hBbm4pICk7CisgICAgfQorCisgICAgICAgaWYgKCBwci5FeHRDaGFuU3dpdGNoQW5uLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcFByb2JlUmVzcC0+ZXh0Q2hhbm5lbFN3aXRjaFByZXNlbnQgPSAxOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLCAmcFByb2JlUmVzcC0+ZXh0Q2hhbm5lbFN3aXRjaElFLCAmcHIuRXh0Q2hhblN3aXRjaEFubiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHREb3QxMWZJRUV4dENoYW5Td2l0Y2hBbm4pICk7CisgICAgfQorCisgICAgaWYoIHByLlRQQ1JlcG9ydC5wcmVzZW50KQorICAgIHsKKyAgICAgICAgcFByb2JlUmVzcC0+dHBjUmVwb3J0UHJlc2VudCA9IDE7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBQcm9iZVJlc3AtPnRwY1JlcG9ydCwgJnByLlRQQ1JlcG9ydCwgc2l6ZW9mKHREb3QxMWZJRVRQQ1JlcG9ydCkpOworICAgIH0KKworICAgIGlmKCBwci5Qb3dlckNvbnN0cmFpbnRzLnByZXNlbnQpCisgICAgeworICAgICAgICBwUHJvYmVSZXNwLT5wb3dlckNvbnN0cmFpbnRQcmVzZW50ID0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcFByb2JlUmVzcC0+bG9jYWxQb3dlckNvbnN0cmFpbnQsICZwci5Qb3dlckNvbnN0cmFpbnRzLCBzaXplb2YodERvdDExZklFUG93ZXJDb25zdHJhaW50cykpOworICAgIH0KKworICAgIGlmICggcHIuUXVpZXQucHJlc2VudCApCisgICAgeworICAgICAgICBwUHJvYmVSZXNwLT5xdWlldElFUHJlc2VudCA9IDE7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMsICZwUHJvYmVSZXNwLT5xdWlldElFLCAmcHIuUXVpZXQsIHNpemVvZih0RG90MTFmSUVRdWlldCkgKTsKKyAgICB9CisKKyAgICBpZiAoIHByLkhUQ2Fwcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMsICZwUHJvYmVSZXNwLT5IVENhcHMsICZwci5IVENhcHMsIHNpemVvZiggdERvdDExZklFSFRDYXBzICkgKTsKKyAgICB9CisKKyAgICBpZiAoIHByLkhUSW5mby5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMsICZwUHJvYmVSZXNwLT5IVEluZm8sICZwci5IVEluZm8sIHNpemVvZiggdERvdDExZklFSFRJbmZvICkgKTsKKyAgICB9CisKKyAgICBpZiAoIHByLkRTUGFyYW1zLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcFByb2JlUmVzcC0+ZHNQYXJhbXNQcmVzZW50ID0gMTsKKyAgICAgICAgcFByb2JlUmVzcC0+Y2hhbm5lbE51bWJlciA9IHByLkRTUGFyYW1zLmN1cnJfY2hhbm5lbDsKKyAgICB9CisgICAgZWxzZSBpZihwci5IVEluZm8ucHJlc2VudCkKKyAgICB7CisgICAgICAgIHBQcm9iZVJlc3AtPmNoYW5uZWxOdW1iZXIgPSBwci5IVEluZm8ucHJpbWFyeUNoYW5uZWw7CisgICAgfQorCisgICAgaWYgKCBwci5SU04ucHJlc2VudCApCisgICAgeworICAgICAgICBwUHJvYmVSZXNwLT5yc25QcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFJTTiggcE1hYywgJnBQcm9iZVJlc3AtPnJzbiwgJnByLlJTTiApOworICAgIH0KKworICAgIGlmICggcHIuV1BBLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcFByb2JlUmVzcC0+d3BhUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRXUEEoIHBNYWMsICZwUHJvYmVSZXNwLT53cGEsICZwci5XUEEgKTsKKyAgICB9CisKKyAgICBpZiAoIHByLldNTVBhcmFtcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBQcm9iZVJlc3AtPndtZUVkY2FQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFdNTVBhcmFtcyggcE1hYywgJnBQcm9iZVJlc3AtPmVkY2FQYXJhbXMsICZwci5XTU1QYXJhbXMgKTsKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiV01NIFBhcmFtZXRlciBwcmVzZW50IGluIFByb2JlIFJlc3BvbnNlIEZyYW1lIVxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3ByaW50V01NUGFyYW1zKHBNYWMsICZwci5XTU1QYXJhbXMpOykKKyAgICB9CisKKyAgICBpZiAoIHByLldNTUluZm9BcC5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBQcm9iZVJlc3AtPndtZUluZm9QcmVzZW50ID0gMTsKKyAgICAgICAgUEVMT0cxKGxpbUxvZyhwTWFjLCBMT0cxLCBGTCgiV01NIEluZm9ybWF0aW9uIEVsZW1lbnQgcHJlc2VudCBpbiBQcm9iZSBSZXNwb25zZSBGcmFtZSFcbiIpKTspCisgICAgfQorCisgICAgaWYgKCBwci5XTU1DYXBzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcFByb2JlUmVzcC0+d3NtQ2FwYWJsZVByZXNlbnQgPSAxOworICAgIH0KKworCisgICAgaWYgKCBwci5FUlBJbmZvLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcFByb2JlUmVzcC0+ZXJwUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRFUlBJbmZvKCBwTWFjLCAmcFByb2JlUmVzcC0+ZXJwSUVJbmZvLCAmcHIuRVJQSW5mbyApOworICAgIH0KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgaWYgKHByLk1vYmlsaXR5RG9tYWluLnByZXNlbnQpCisgICAgeworICAgICAgICAvLyBNb2JpbGl0eURvbWFpbgorICAgICAgICBwUHJvYmVSZXNwLT5tZGllUHJlc2VudCA9IDE7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopJihwUHJvYmVSZXNwLT5tZGllWzBdKSwgKHRBTklfVTggKikmKHByLk1vYmlsaXR5RG9tYWluLk1ESUQpLCBzaXplb2YodEFOSV9VMTYpICk7CisgICAgICAgIHBQcm9iZVJlc3AtPm1kaWVbMl0gPSAoKHByLk1vYmlsaXR5RG9tYWluLm92ZXJEU0NhcCA8PCAwKSB8IChwci5Nb2JpbGl0eURvbWFpbi5yZXNvdXJjZVJlcUNhcCA8PCAxKSk7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVJfREVCVUcKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJtZGllPSUwMnglMDJ4JTAyeFxuIiksICh1bnNpZ25lZCBpbnQpcFByb2JlUmVzcC0+bWRpZVswXSwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpcFByb2JlUmVzcC0+bWRpZVsxXSwgKHVuc2lnbmVkIGludClwUHJvYmVSZXNwLT5tZGllWzJdKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fQ0NYCisgICAgaWYgKHByLlFCU1NMb2FkLnByZXNlbnQpCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwUHJvYmVSZXNwLT5RQlNTTG9hZCwgJnByLlFCU1NMb2FkLCBzaXplb2YodERvdDExZklFUUJTU0xvYWQpKTsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgaWYgKHByLlAyUFByb2JlUmVzLnByZXNlbnQpCisgICAgeworICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMsICZwUHJvYmVSZXNwLT5QMlBQcm9iZVJlcywgJnByLlAyUFByb2JlUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHREb3QxMWZJRVAyUFByb2JlUmVzKSApOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIHNpckNvbnZlcnRQcm9iZUZyYW1lMlN0cnVjdC4KKwordFNpclJldFN0YXR1cworc2lyQ29udmVydEFzc29jUmVxRnJhbWUyU3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgICAgICAgICAgICpwRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICBuRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJBc3NvY1JlcSAgcEFzc29jUmVxKQoreworICAgIHREb3QxMWZBc3NvY1JlcXVlc3QgYXI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgIHN0YXR1czsKKworICAgIC8vIFplcm8taW5pdCBvdXIgW291dF0gcGFyYW1ldGVyLAorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKXBBc3NvY1JlcSwgc2l6ZW9mKHRTaXJBc3NvY1JlcSkgKTsKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmYXIsIHNpemVvZiggdERvdDExZkFzc29jUmVxdWVzdCApICk7CisKKyAgICAvLyBkZWxlZ2F0ZSB0byB0aGUgZnJhbWVzYy1nZW5lcmF0ZWQgY29kZSwKKyAgICBzdGF0dXMgPSBkb3QxMWZVbnBhY2tBc3NvY1JlcXVlc3QoIHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmYXIgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhcnNlIGFuIEFzc29jaWF0aW9uIFJlcXVlc3QgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICBzdGF0dXMsIG5GcmFtZSk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggc3RhdHVzICkgKQorICAgIHsKKyAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGFuIEFzc29pY2F0aW9uIFJlcXVlc3QgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lICk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgIH0KKworICAgIC8vICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZkFzc29jUmVxdWVzdCcgdG8gYSAndFNpckFzc29jUmVxJy4uLgorCisgICAgLy8gbWFrZSBzdXJlIHRoaXMgaXMgc2VlbiBhcyBhbiBhc3NvYyByZXF1ZXN0CisgICAgcEFzc29jUmVxLT5yZWFzc29jUmVxdWVzdCA9IDA7CisKKyAgICAvLyBDYXBhYmlsaXRpZXMKKyAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmVzcyAgICAgICAgICAgID0gYXIuQ2FwYWJpbGl0aWVzLmVzczsKKyAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmlic3MgICAgICAgICAgID0gYXIuQ2FwYWJpbGl0aWVzLmlic3M7CisgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5jZlBvbGxhYmxlICAgICA9IGFyLkNhcGFiaWxpdGllcy5jZlBvbGxhYmxlOworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uY2ZQb2xsUmVxICAgICAgPSBhci5DYXBhYmlsaXRpZXMuY2ZQb2xsUmVxOworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8ucHJpdmFjeSAgICAgICAgPSBhci5DYXBhYmlsaXRpZXMucHJpdmFjeTsKKyAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnNob3J0UHJlYW1ibGUgID0gYXIuQ2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGU7CisgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5wYmNjICAgICAgICAgICA9IGFyLkNhcGFiaWxpdGllcy5wYmNjOworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uY2hhbm5lbEFnaWxpdHkgPSBhci5DYXBhYmlsaXRpZXMuY2hhbm5lbEFnaWxpdHk7CisgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5zcGVjdHJ1bU1ndCAgICA9IGFyLkNhcGFiaWxpdGllcy5zcGVjdHJ1bU1ndDsKKyAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnFvcyAgICAgICAgICAgID0gYXIuQ2FwYWJpbGl0aWVzLnFvczsKKyAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWUgID0gYXIuQ2FwYWJpbGl0aWVzLnNob3J0U2xvdFRpbWU7CisgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5hcHNkICAgICAgICAgICA9IGFyLkNhcGFiaWxpdGllcy5hcHNkOworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8ucnJtICAgICAgICAgICAgPSBhci5DYXBhYmlsaXRpZXMucnJtOworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uZHNzc09mZG0gICAgICAgPSBhci5DYXBhYmlsaXRpZXMuZHNzc09mZG07CisgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5kZWxheWVkQkEgICAgICAgPSBhci5DYXBhYmlsaXRpZXMuZGVsYXllZEJBOworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uaW1tZWRpYXRlQkEgICAgPSBhci5DYXBhYmlsaXRpZXMuaW1tZWRpYXRlQkE7CisKKyAgICAvLyBMaXN0ZW4gSW50ZXJ2YWwKKyAgICBwQXNzb2NSZXEtPmxpc3RlbkludGVydmFsID0gYXIuTGlzdGVuSW50ZXJ2YWwuaW50ZXJ2YWw7CisKKyAgICAvLyBTU0lECisgICAgaWYgKCBhci5TU0lELnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEFzc29jUmVxLT5zc2lkUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRTU0lEKCBwTWFjLCAmcEFzc29jUmVxLT5zc0lkLCAmYXIuU1NJRCApOworICAgIH0KKworICAgIC8vIFN1cHBvcnRlZCBSYXRlcworICAgIGlmICggYXIuU3VwcFJhdGVzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEFzc29jUmVxLT5zdXBwUmF0ZXNQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFN1cHBSYXRlcyggcE1hYywgJnBBc3NvY1JlcS0+c3VwcG9ydGVkUmF0ZXMsICZhci5TdXBwUmF0ZXMgKTsKKyAgICB9CisKKyAgICAvLyBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMKKyAgICBpZiAoIGFyLkV4dFN1cHBSYXRlcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+ZXh0ZW5kZWRSYXRlc1ByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0RXh0U3VwcFJhdGVzKCBwTWFjLCAmcEFzc29jUmVxLT5leHRlbmRlZFJhdGVzLCAmYXIuRXh0U3VwcFJhdGVzICk7CisgICAgfQorCisgICAgLy8gUU9TIENhcGFiaWxpdGllczoKKyAgICBpZiAoIGFyLlFPU0NhcHNTdGF0aW9uLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEFzc29jUmVxLT5xb3NDYXBhYmlsaXR5UHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRRT1NDYXBzU3RhdGlvbiggcE1hYywgJnBBc3NvY1JlcS0+cW9zQ2FwYWJpbGl0eSwgJmFyLlFPU0NhcHNTdGF0aW9uICk7CisgICAgfQorCisgICAgLy8gV1BBCisgICAgaWYgKCBhci5XUEFPcGFxdWUucHJlc2VudCApCisgICAgeworICAgICAgICBwQXNzb2NSZXEtPndwYVByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0V1BBT3BhcXVlKCBwTWFjLCAmcEFzc29jUmVxLT53cGEsICZhci5XUEFPcGFxdWUgKTsKKyAgICB9CisKKyAgICAvLyBSU04KKyAgICBpZiAoIGFyLlJTTk9wYXF1ZS5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+cnNuUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRSU05PcGFxdWUoIHBNYWMsICZwQXNzb2NSZXEtPnJzbiwgJmFyLlJTTk9wYXF1ZSApOworICAgIH0KKworICAgIC8vIFdTQyBJRQorICAgIGlmIChhci5Xc2NJRU9wYXF1ZS5wcmVzZW50KSAKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+YWRkSUVQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFdzY09wYXF1ZShwTWFjLCAmcEFzc29jUmVxLT5hZGRJRSwgJmFyLldzY0lFT3BhcXVlKTsKKyAgICB9CisgICAgCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgaWYoYXIuUDJQSUVPcGFxdWUucHJlc2VudCkKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+YWRkSUVQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFAyUE9wYXF1ZSggcE1hYywgJnBBc3NvY1JlcS0+YWRkSUUsICZhci5QMlBJRU9wYXF1ZSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBQb3dlciBDYXBhYmlsaXRpZXMKKyAgICBpZiAoIGFyLlBvd2VyQ2Fwcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+cG93ZXJDYXBhYmlsaXR5UHJlc2VudCAgICAgPSAxOworICAgICAgICBDb252ZXJ0UG93ZXJDYXBzKCBwTWFjLCAmcEFzc29jUmVxLT5wb3dlckNhcGFiaWxpdHksICZhci5Qb3dlckNhcHMgKTsKKyAgICB9CisKKyAgICAvLyBTdXBwb3J0ZWQgQ2hhbm5lbHMKKyAgICBpZiAoIGFyLlN1cHBDaGFubmVscy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+c3VwcG9ydGVkQ2hhbm5lbHNQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFN1cHBDaGFubmVscyggcE1hYywgJnBBc3NvY1JlcS0+c3VwcG9ydGVkQ2hhbm5lbHMsICZhci5TdXBwQ2hhbm5lbHMgKTsKKyAgICB9CisKKyAgICBpZiAoIGFyLkhUQ2Fwcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMsICZwQXNzb2NSZXEtPkhUQ2FwcywgJmFyLkhUQ2Fwcywgc2l6ZW9mKCB0RG90MTFmSUVIVENhcHMgKSApOworICAgIH0KKworICAgIGlmICggYXIuV01NSW5mb1N0YXRpb24ucHJlc2VudCApCisgICAgeworICAgICAgICBwQXNzb2NSZXEtPndtZUluZm9QcmVzZW50ID0gMTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMsICZwQXNzb2NSZXEtPldNTUluZm9TdGF0aW9uLCAmYXIuV01NSW5mb1N0YXRpb24sIHNpemVvZiggdERvdDExZklFV01NSW5mb1N0YXRpb24gKSApOworI2VuZGlmCisKKyAgICB9CisKKworICAgIGlmICggYXIuV01NQ2Fwcy5wcmVzZW50ICkgcEFzc29jUmVxLT53c21DYXBhYmxlUHJlc2VudCA9IDE7CisKKyAgICBpZiAoICEgcEFzc29jUmVxLT5zc2lkUHJlc2VudCApCisgICAgeworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJSZWNlaXZlZCBBc3NvYyB3aXRob3V0IFNTSUQgSUUuXG4iKSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGlmICggIXBBc3NvY1JlcS0+c3VwcFJhdGVzUHJlc2VudCAmJiAhcEFzc29jUmVxLT5leHRlbmRlZFJhdGVzUHJlc2VudCApCisgICAgeworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJSZWNlaXZlZCBBc3NvYyB3aXRob3V0IHN1cHAgcmF0ZSBJRS5cbiIpKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgc2lyQ29udmVydEFzc29jUmVxRnJhbWUyU3RydWN0LgorCit0U2lyUmV0U3RhdHVzCitzaXJDb252ZXJ0QXNzb2NSZXNwRnJhbWUyU3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICAgICAgICAgICAqcEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgICAgICAgIG5GcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJBc3NvY1JzcCAgcEFzc29jUnNwKQoreworICAgIHN0YXRpYyB0RG90MTFmQXNzb2NSZXNwb25zZSBhcjsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICB0QU5JX1U4ICBjbnQgPTA7CisKKyAgICAvLyBaZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqIClwQXNzb2NSc3AsIHNpemVvZih0U2lyQXNzb2NSc3ApICk7CisKKyAgICAvLyBkZWxlZ2F0ZSB0byB0aGUgZnJhbWVzYy1nZW5lcmF0ZWQgY29kZSwKKyAgICBzdGF0dXMgPSBkb3QxMWZVbnBhY2tBc3NvY1Jlc3BvbnNlKCBwTWFjLCBwRnJhbWUsIG5GcmFtZSwgJmFyKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhcnNlIGFuIEFzc29jaWF0aW9uIFJlc3BvbnNlICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgICAgICAgc3RhdHVzLCBuRnJhbWUpOworICAgICAgICBQRUxPRzIoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGFuIEFzc29jaWF0aW9uIFJlc3BvbnNlICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lICk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgIH0KKworICAgIC8vICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZkFzc29jUmVzcG9uc2UnIGEgJ3RTaXJBc3NvY1JzcCcuLi4KKworICAgIC8vIENhcGFiaWxpdGllcworICAgIHBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8uZXNzICAgICAgICAgICAgPSBhci5DYXBhYmlsaXRpZXMuZXNzOworICAgIHBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8uaWJzcyAgICAgICAgICAgPSBhci5DYXBhYmlsaXRpZXMuaWJzczsKKyAgICBwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbGFibGUgICAgID0gYXIuQ2FwYWJpbGl0aWVzLmNmUG9sbGFibGU7CisgICAgcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5jZlBvbGxSZXEgICAgICA9IGFyLkNhcGFiaWxpdGllcy5jZlBvbGxSZXE7CisgICAgcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5wcml2YWN5ICAgICAgICA9IGFyLkNhcGFiaWxpdGllcy5wcml2YWN5OworICAgIHBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZSAgPSBhci5DYXBhYmlsaXRpZXMuc2hvcnRQcmVhbWJsZTsKKyAgICBwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLnBiY2MgICAgICAgICAgID0gYXIuQ2FwYWJpbGl0aWVzLnBiY2M7CisgICAgcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5jaGFubmVsQWdpbGl0eSA9IGFyLkNhcGFiaWxpdGllcy5jaGFubmVsQWdpbGl0eTsKKyAgICBwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLnNwZWN0cnVtTWd0ICAgID0gYXIuQ2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0OworICAgIHBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8ucW9zICAgICAgICAgICAgPSBhci5DYXBhYmlsaXRpZXMucW9zOworICAgIHBBc3NvY1JzcC0+Y2FwYWJpbGl0eUluZm8uc2hvcnRTbG90VGltZSAgPSBhci5DYXBhYmlsaXRpZXMuc2hvcnRTbG90VGltZTsKKyAgICBwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLmFwc2QgICAgICAgICAgID0gYXIuQ2FwYWJpbGl0aWVzLmFwc2Q7CisgICAgcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5ycm0gICAgICAgICAgICA9IGFyLkNhcGFiaWxpdGllcy5ycm07CisgICAgcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5kc3NzT2ZkbSAgICAgICA9IGFyLkNhcGFiaWxpdGllcy5kc3NzT2ZkbTsKKyAgICBwQXNzb2NSc3AtPmNhcGFiaWxpdHlJbmZvLmRlbGF5ZWRCQSAgICAgICA9IGFyLkNhcGFiaWxpdGllcy5kZWxheWVkQkE7CisgICAgcEFzc29jUnNwLT5jYXBhYmlsaXR5SW5mby5pbW1lZGlhdGVCQSAgICA9IGFyLkNhcGFiaWxpdGllcy5pbW1lZGlhdGVCQTsKKworICAgIHBBc3NvY1JzcC0+c3RhdHVzQ29kZSA9IGFyLlN0YXR1cy5zdGF0dXM7CisgICAgcEFzc29jUnNwLT5haWQgICAgICAgID0gYXIuQUlELmFzc29jaWQ7CisKKyAgICBpZiAoICEgYXIuU3VwcFJhdGVzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEFzc29jUnNwLT5zdXBwUmF0ZXNQcmVzZW50ID0gMDsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiTWFuZGF0b3J5IElFIFN1cHBvcnRlZCBSYXRlcyBub3QgcHJlc2VudCFcbiIpKTspCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBBc3NvY1JzcC0+c3VwcFJhdGVzUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRTdXBwUmF0ZXMoIHBNYWMsICZwQXNzb2NSc3AtPnN1cHBvcnRlZFJhdGVzLCAmYXIuU3VwcFJhdGVzICk7CisgICAgfQorCisgICAgaWYgKCBhci5FeHRTdXBwUmF0ZXMucHJlc2VudCApCisgICAgeworICAgICAgICBwQXNzb2NSc3AtPmV4dGVuZGVkUmF0ZXNQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydEV4dFN1cHBSYXRlcyggcE1hYywgJnBBc3NvY1JzcC0+ZXh0ZW5kZWRSYXRlcywgJmFyLkV4dFN1cHBSYXRlcyApOworICAgIH0KKworICAgIGlmICggYXIuRURDQVBhcmFtU2V0LnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEFzc29jUnNwLT5lZGNhUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRFRENBUGFyYW0oIHBNYWMsICZwQXNzb2NSc3AtPmVkY2EsICZhci5FRENBUGFyYW1TZXQgKTsKKyAgICB9CisKKworICAgIGlmICggYXIuV01NUGFyYW1zLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEFzc29jUnNwLT53bWVFZGNhUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRXTU1QYXJhbXMoIHBNYWMsICZwQXNzb2NSc3AtPmVkY2EsICZhci5XTU1QYXJhbXMpOworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIldNTSBQYXJhbWV0ZXIgRWxlbWVudCBwcmVzZW50IGluIEFzc29jaWF0aW9uIFJlc3BvbnNlIEZyYW1lIVxuIikpOworICAgICAgICBfX3ByaW50V01NUGFyYW1zKHBNYWMsICZhci5XTU1QYXJhbXMpOworICAgIH0KKworICAgIGlmICggYXIuSFRDYXBzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYywgJnBBc3NvY1JzcC0+SFRDYXBzLCAmYXIuSFRDYXBzLCBzaXplb2YoIHREb3QxMWZJRUhUQ2FwcyApICk7CisgICAgfQorCisgICAgaWYgKCBhci5IVEluZm8ucHJlc2VudCApCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLCAmcEFzc29jUnNwLT5IVEluZm8sICZhci5IVEluZm8sIHNpemVvZiggdERvdDExZklFSFRJbmZvICkgKTsKKyAgICB9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGlmIChhci5Nb2JpbGl0eURvbWFpbi5wcmVzZW50KQorICAgIHsKKyAgICAgICAgLy8gTW9iaWxpdHlEb21haW4KKyAgICAgICAgcEFzc29jUnNwLT5tZGllUHJlc2VudCA9IDE7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICh0QU5JX1U4ICopJihwQXNzb2NSc3AtPm1kaWVbMF0pLCAodEFOSV9VOCAqKSYoYXIuTW9iaWxpdHlEb21haW4uTURJRCksIHNpemVvZih0QU5JX1UxNikgKTsKKyAgICAgICAgcEFzc29jUnNwLT5tZGllWzJdID0gKChhci5Nb2JpbGl0eURvbWFpbi5vdmVyRFNDYXAgPDwgMCkgfCAoYXIuTW9iaWxpdHlEb21haW4ucmVzb3VyY2VSZXFDYXAgPDwgMSkpOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgibmV3IG1kaWU9JTAyeCUwMnglMDJ4XG4iKSwgKHVuc2lnbmVkIGludClwQXNzb2NSc3AtPm1kaWVbMF0sCisgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXBBc3NvY1JzcC0+bWRpZVsxXSwgKHVuc2lnbmVkIGludClwQXNzb2NSc3AtPm1kaWVbMl0pOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKCBhci5GVEluZm8ucHJlc2VudCApCisgICAgeworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSX0RFQlVHCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRlQgSW5mbyBwcmVzZW50ICVkICVkICVkXG4iKSwgYXIuRlRJbmZvLlIwS0hfSUQubnVtX1BNS19SMF9JRCwKKyAgICAgICAgICAgICAgICBhci5GVEluZm8uUjBLSF9JRC5wcmVzZW50LAorICAgICAgICAgICAgICAgIGFyLkZUSW5mby5SMUtIX0lELnByZXNlbnQpOworI2VuZGlmCisgICAgICAgIHBBc3NvY1JzcC0+ZnRpbmZvUHJlc2VudCA9IDE7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMsICZwQXNzb2NSc3AtPkZUSW5mbywgJmFyLkZUSW5mbywgc2l6ZW9mKHREb3QxMWZJRUZUSW5mbykgKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgaWYgKGFyLm51bV9SSUNEYXRhRGVzYykgeworICAgICAgICBmb3IgKGNudD0wOyBjbnQgPCBhci5udW1fUklDRGF0YURlc2M7IGNudCsrKSB7CisgICAgICAgICAgICBpZiAoYXIuUklDRGF0YURlc2NbY250XS5wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLCAmcEFzc29jUnNwLT5SSUNEYXRhW2NudF0sICZhci5SSUNEYXRhRGVzY1tjbnRdLCBzaXplb2YodERvdDExZklFUklDRGF0YURlc2MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwQXNzb2NSc3AtPm51bV9SSUNEYXRhID0gYXIubnVtX1JJQ0RhdGFEZXNjOworICAgICAgICBwQXNzb2NSc3AtPnJpY1ByZXNlbnQgPSBUUlVFOworICAgIH0KKyNlbmRpZiAgICAKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICBpZiAoYXIubnVtX1dNTVRTUEVDKSB7CisgICAgICAgIHBBc3NvY1JzcC0+bnVtX3RzcGVjcyA9IGFyLm51bV9XTU1UU1BFQzsKKyAgICAgICAgZm9yIChjbnQ9MDsgY250IDwgYXIubnVtX1dNTVRTUEVDOyBjbnQrKykgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLCAmcEFzc29jUnNwLT5UU1BFQ0luZm9bY250XSwgJmFyLldNTVRTUEVDW2NudF0sIChzaXplb2YodERvdDExZklFV01NVFNQRUMpKmFyLm51bV9XTU1UU1BFQykpOworICAgICAgICB9CisgICAgICAgIHBBc3NvY1JzcC0+dHNwZWNQcmVzZW50ID0gVFJVRTsKKyAgICB9CisgICAKKyAgICBpZihhci5DQ1hUcmFmU3RybU1ldC5wcmVzZW50KQorICAgIHsKKyAgICAgICAgcEFzc29jUnNwLT50c21QcmVzZW50ID0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCZwQXNzb2NSc3AtPnRzbUlFLnRzaWQsCisgICAgICAgICAgICAgICAgJmFyLkNDWFRyYWZTdHJtTWV0LnRzaWQsc2l6ZW9mKHRTaXJNYWNDQ1hUU01JRSkpOworICAgIH0gICAgCisjZW5kaWYKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIHNpckNvbnZlcnRBc3NvY1Jlc3BGcmFtZTJTdHJ1Y3QuCisKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnRSZWFzc29jUmVxRnJhbWUyU3RydWN0KHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgKnBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgICAgICAgbkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJBc3NvY1JlcSAgcEFzc29jUmVxKQoreworICAgIHN0YXRpYyB0RG90MTFmUmVBc3NvY1JlcXVlc3QgYXI7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCisgICAgLy8gWmVyby1pbml0IG91ciBbb3V0XSBwYXJhbWV0ZXIsCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApcEFzc29jUmVxLCBzaXplb2YodFNpckFzc29jUmVxKSApOworCisgICAgLy8gZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsCisgICAgc3RhdHVzID0gZG90MTFmVW5wYWNrUmVBc3NvY1JlcXVlc3QoIHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmYXIgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhcnNlIGEgUmUtYXNzb2NpYXRpb24gUmVxdWVzdCAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lKTsKKyAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBzdGF0dXMgKSApCisgICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbmcgYSBSZS1hc3NvY2lhdGlvbiBSZXF1ZXN0ICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIG5GcmFtZSApOworICAgICAgICBQRUxPRzIoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOykKKyAgICB9CisKKyAgICAvLyAmICJ0cmFuc2xpdGVyYXRlIiBmcm9tIGEgJ3REb3QxMWZSZUFzc29jUmVxdWVzdCcgdG8gYSAndFNpckFzc29jUmVxJy4uLgorCisgICAgLy8gbWFrZSBzdXJlIHRoaXMgaXMgc2VlbiBhcyBhIHJlLWFzc29jIHJlcXVlc3QKKyAgICBwQXNzb2NSZXEtPnJlYXNzb2NSZXF1ZXN0ID0gMTsKKworICAgIC8vIENhcGFiaWxpdGllcworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uZXNzICAgICAgICAgICAgPSBhci5DYXBhYmlsaXRpZXMuZXNzOworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uaWJzcyAgICAgICAgICAgPSBhci5DYXBhYmlsaXRpZXMuaWJzczsKKyAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbGFibGUgICAgID0gYXIuQ2FwYWJpbGl0aWVzLmNmUG9sbGFibGU7CisgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5jZlBvbGxSZXEgICAgICA9IGFyLkNhcGFiaWxpdGllcy5jZlBvbGxSZXE7CisgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5wcml2YWN5ICAgICAgICA9IGFyLkNhcGFiaWxpdGllcy5wcml2YWN5OworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZSAgPSBhci5DYXBhYmlsaXRpZXMuc2hvcnRQcmVhbWJsZTsKKyAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnBiY2MgICAgICAgICAgID0gYXIuQ2FwYWJpbGl0aWVzLnBiY2M7CisgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5jaGFubmVsQWdpbGl0eSA9IGFyLkNhcGFiaWxpdGllcy5jaGFubmVsQWdpbGl0eTsKKyAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLnNwZWN0cnVtTWd0ICAgID0gYXIuQ2FwYWJpbGl0aWVzLnNwZWN0cnVtTWd0OworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8ucW9zICAgICAgICAgICAgPSBhci5DYXBhYmlsaXRpZXMucW9zOworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uc2hvcnRTbG90VGltZSAgPSBhci5DYXBhYmlsaXRpZXMuc2hvcnRTbG90VGltZTsKKyAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmFwc2QgICAgICAgICAgID0gYXIuQ2FwYWJpbGl0aWVzLmFwc2Q7CisgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5ycm0gICAgICAgICAgICA9IGFyLkNhcGFiaWxpdGllcy5ycm07CisgICAgcEFzc29jUmVxLT5jYXBhYmlsaXR5SW5mby5kc3NzT2ZkbSAgICAgID0gYXIuQ2FwYWJpbGl0aWVzLmRzc3NPZmRtOworICAgIHBBc3NvY1JlcS0+Y2FwYWJpbGl0eUluZm8uZGVsYXllZEJBICAgICAgID0gYXIuQ2FwYWJpbGl0aWVzLmRlbGF5ZWRCQTsKKyAgICBwQXNzb2NSZXEtPmNhcGFiaWxpdHlJbmZvLmltbWVkaWF0ZUJBICAgID0gYXIuQ2FwYWJpbGl0aWVzLmltbWVkaWF0ZUJBOworCisgICAgLy8gTGlzdGVuIEludGVydmFsCisgICAgcEFzc29jUmVxLT5saXN0ZW5JbnRlcnZhbCA9IGFyLkxpc3RlbkludGVydmFsLmludGVydmFsOworCisgICAgLy8gU1NJRAorICAgIGlmICggYXIuU1NJRC5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+c3NpZFByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0U1NJRCggcE1hYywgJnBBc3NvY1JlcS0+c3NJZCwgJmFyLlNTSUQgKTsKKyAgICB9CisKKyAgICAvLyBTdXBwb3J0ZWQgUmF0ZXMKKyAgICBpZiAoIGFyLlN1cHBSYXRlcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+c3VwcFJhdGVzUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRTdXBwUmF0ZXMoIHBNYWMsICZwQXNzb2NSZXEtPnN1cHBvcnRlZFJhdGVzLCAmYXIuU3VwcFJhdGVzICk7CisgICAgfQorCisgICAgLy8gRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzCisgICAgaWYgKCBhci5FeHRTdXBwUmF0ZXMucHJlc2VudCApCisgICAgeworICAgICAgICBwQXNzb2NSZXEtPmV4dGVuZGVkUmF0ZXNQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydEV4dFN1cHBSYXRlcyggcE1hYywgJnBBc3NvY1JlcS0+ZXh0ZW5kZWRSYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyLkV4dFN1cHBSYXRlcyApOworICAgIH0KKworICAgIC8vIFFPUyBDYXBhYmlsaXRpZXM6CisgICAgaWYgKCBhci5RT1NDYXBzU3RhdGlvbi5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+cW9zQ2FwYWJpbGl0eVByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0UU9TQ2Fwc1N0YXRpb24oIHBNYWMsICZwQXNzb2NSZXEtPnFvc0NhcGFiaWxpdHksICZhci5RT1NDYXBzU3RhdGlvbiApOworICAgIH0KKworICAgIC8vIFdQQQorICAgIGlmICggYXIuV1BBT3BhcXVlLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEFzc29jUmVxLT53cGFQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFdQQU9wYXF1ZSggcE1hYywgJnBBc3NvY1JlcS0+d3BhLCAmYXIuV1BBT3BhcXVlICk7CisgICAgfQorCisgICAgLy8gUlNOCisgICAgaWYgKCBhci5SU05PcGFxdWUucHJlc2VudCApCisgICAgeworICAgICAgICBwQXNzb2NSZXEtPnJzblByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0UlNOT3BhcXVlKCBwTWFjLCAmcEFzc29jUmVxLT5yc24sICZhci5SU05PcGFxdWUgKTsKKyAgICB9CisKKworICAgIC8vIFBvd2VyIENhcGFiaWxpdGllcworICAgIGlmICggYXIuUG93ZXJDYXBzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEFzc29jUmVxLT5wb3dlckNhcGFiaWxpdHlQcmVzZW50ICAgICA9IDE7CisgICAgICAgIENvbnZlcnRQb3dlckNhcHMoIHBNYWMsICZwQXNzb2NSZXEtPnBvd2VyQ2FwYWJpbGl0eSwgJmFyLlBvd2VyQ2FwcyApOworICAgIH0KKworICAgIC8vIFN1cHBvcnRlZCBDaGFubmVscworICAgIGlmICggYXIuU3VwcENoYW5uZWxzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEFzc29jUmVxLT5zdXBwb3J0ZWRDaGFubmVsc1ByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0U3VwcENoYW5uZWxzKCBwTWFjLCAmcEFzc29jUmVxLT5zdXBwb3J0ZWRDaGFubmVscywgJmFyLlN1cHBDaGFubmVscyApOworICAgIH0KKworICAgIGlmICggYXIuSFRDYXBzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYywgJnBBc3NvY1JlcS0+SFRDYXBzLCAmYXIuSFRDYXBzLCBzaXplb2YoIHREb3QxMWZJRUhUQ2FwcyApICk7CisgICAgfQorCisgICAgaWYgKCBhci5XTU1JbmZvU3RhdGlvbi5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+d21lSW5mb1ByZXNlbnQgPSAxOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYywgJnBBc3NvY1JlcS0+V01NSW5mb1N0YXRpb24sICZhci5XTU1JbmZvU3RhdGlvbiwgc2l6ZW9mKCB0RG90MTFmSUVXTU1JbmZvU3RhdGlvbiApICk7CisjZW5kaWYKKworICAgIH0KKworICAgIGlmICggYXIuV01NQ2Fwcy5wcmVzZW50ICkgcEFzc29jUmVxLT53c21DYXBhYmxlUHJlc2VudCA9IDE7CisKKyAgICBpZiAoICEgcEFzc29jUmVxLT5zc2lkUHJlc2VudCApCisgICAgeworICAgICAgICBQRUxPRzIobGltTG9nKHBNYWMsIExPRzIsIEZMKCJSZWNlaXZlZCBBc3NvYyB3aXRob3V0IFNTSUQgSUUuXG4iKSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGlmICggISBwQXNzb2NSZXEtPnN1cHBSYXRlc1ByZXNlbnQgJiYgISBwQXNzb2NSZXEtPmV4dGVuZGVkUmF0ZXNQcmVzZW50ICkKKyAgICB7CisgICAgICAgIFBFTE9HMihsaW1Mb2cocE1hYywgTE9HMiwgRkwoIlJlY2VpdmVkIEFzc29jIHdpdGhvdXQgc3VwcCByYXRlIElFLlxuIikpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBXaHkgbm8gY2FsbCB0byAndXBkYXRlQXNzb2NSZXFGcm9tUHJvcENhcGFiaWxpdHknIGhlcmUsIGxpa2UKKyAgICAvLyB0aGVyZSBpcyBpbiAnc2lyQ29udmVydEFzc29jUmVxRnJhbWUyU3RydWN0Jz8KKworICAgIC8vIFdTQyBJRQorICAgIGlmIChhci5Xc2NJRU9wYXF1ZS5wcmVzZW50KSAKKyAgICB7CisgICAgICAgIHBBc3NvY1JlcS0+YWRkSUVQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFdzY09wYXF1ZShwTWFjLCAmcEFzc29jUmVxLT5hZGRJRSwgJmFyLldzY0lFT3BhcXVlKTsKKyAgICB9CisgICAgCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIGlmKGFyLlAyUElFT3BhcXVlLnByZXNlbnQpCisgICAgeworICAgICAgICBwQXNzb2NSZXEtPmFkZElFUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRQMlBPcGFxdWUoIHBNYWMsICZwQXNzb2NSZXEtPmFkZElFLCAmYXIuUDJQSUVPcGFxdWUpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgc2lyQ29udmVydFJlYXNzb2NSZXFGcmFtZTJTdHJ1Y3QuCisKK3RTaXJSZXRTdGF0dXMKK3NpclBhcnNlQmVhY29uSUUodHBBbmlTaXJHbG9iYWwgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uICBwQmVhY29uU3RydWN0LAorICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICpwUGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgblBheWxvYWQpCit7CisgICAgdERvdDExZkJlYWNvbklFcyAqcEJpZXM7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgIHN0YXR1czsKKworICAgIC8vIFplcm8taW5pdCBvdXIgW291dF0gcGFyYW1ldGVyLAorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKXBCZWFjb25TdHJ1Y3QsIHNpemVvZih0U2lyUHJvYmVSZXNwQmVhY29uKSApOworCisgICAgc3RhdHVzID0gcGFsQWxsb2NhdGVNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiopJnBCaWVzLCBzaXplb2YodERvdDExZkJlYWNvbklFcykpOworICAgIGlmKCFIQUxfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikgKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgLy8gZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsCisgICAgc3RhdHVzID0gZG90MTFmVW5wYWNrQmVhY29uSUVzKCBwTWFjLCBwUGF5bG9hZCwgblBheWxvYWQsIHBCaWVzICk7CisKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhcnNlIEJlYWNvbiBJRXMgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICBzdGF0dXMsIG5QYXlsb2FkKTsKKyAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBQYXlsb2FkLCBuUGF5bG9hZCk7KQorICAgICAgICBwYWxGcmVlTWVtb3J5KHBNYWMtPmhIZGQsIHBCaWVzKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICBsaW1Mb2coIHBNYWMsIExPR1csIEZMKCJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIHVucGFja2luZyBCZWFjb24gSUVzICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIG5QYXlsb2FkICk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwUGF5bG9hZCwgblBheWxvYWQpOykKKyAgICB9CisKKyAgICAvLyAmICJ0cmFuc2xpdGVyYXRlIiBmcm9tIGEgJ3REb3QxMWZCZWFjb25JRXMnIHRvIGEgJ3RTaXJQcm9iZVJlc3BCZWFjb24nLi4uCisgICAgaWYgKCAhIHBCaWVzLT5TU0lELnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgUEVMT0dXKGxpbUxvZyhwTWFjLCBMT0dXLCBGTCgiTWFuZGF0b3J5IElFIFNTSUQgbm90IHByZXNlbnQhXG4iKSk7KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5zc2lkUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRTU0lEKCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+c3NJZCwgJnBCaWVzLT5TU0lEICk7CisgICAgfQorCisgICAgaWYgKCAhIHBCaWVzLT5TdXBwUmF0ZXMucHJlc2VudCApCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJNYW5kYXRvcnkgSUUgU3VwcG9ydGVkIFJhdGVzIG5vdCBwcmVzZW50IVxuIikpOykKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+c3VwcFJhdGVzUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRTdXBwUmF0ZXMoIHBNYWMsICZwQmVhY29uU3RydWN0LT5zdXBwb3J0ZWRSYXRlcywgJnBCaWVzLT5TdXBwUmF0ZXMgKTsKKyAgICB9CisKKyAgICBpZiAoIHBCaWVzLT5FeHRTdXBwUmF0ZXMucHJlc2VudCApCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5leHRlbmRlZFJhdGVzUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRFeHRTdXBwUmF0ZXMoIHBNYWMsICZwQmVhY29uU3RydWN0LT5leHRlbmRlZFJhdGVzLCAmcEJpZXMtPkV4dFN1cHBSYXRlcyApOworICAgIH0KKworICAgIGlmICggcEJpZXMtPkNGUGFyYW1zLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+Y2ZQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydENGUGFyYW1zKCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+Y2ZQYXJhbVNldCwgJnBCaWVzLT5DRlBhcmFtcyApOworICAgIH0KKworICAgIGlmICggcEJpZXMtPlRJTS5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPnRpbVByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0VElNKCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+dGltLCAmcEJpZXMtPlRJTSApOworICAgIH0KKworICAgIGlmICggcEJpZXMtPkNvdW50cnkucHJlc2VudCApCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5jb3VudHJ5SW5mb1ByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0Q291bnRyeSggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPmNvdW50cnlJbmZvUGFyYW0sICZwQmllcy0+Q291bnRyeSApOworICAgIH0KKworICAgIC8vIDExaCBJRXMKKyAgICBpZihwQmllcy0+VFBDUmVwb3J0LnByZXNlbnQpCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT50cGNSZXBvcnRQcmVzZW50ID0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICZwQmVhY29uU3RydWN0LT50cGNSZXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgJnBCaWVzLT5UUENSZXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB0RG90MTFmSUVUUENSZXBvcnQpKTsKKyAgICB9CisKKyAgICBpZihwQmllcy0+UG93ZXJDb25zdHJhaW50cy5wcmVzZW50KQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+cG93ZXJDb25zdHJhaW50UHJlc2VudCA9IDE7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAmcEJlYWNvblN0cnVjdC0+bG9jYWxQb3dlckNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgJnBCaWVzLT5Qb3dlckNvbnN0cmFpbnRzLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0RG90MTFmSUVQb3dlckNvbnN0cmFpbnRzKSk7CisgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICBpZihwQmllcy0+Q0NYVHhtaXRQb3dlci5wcmVzZW50KQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+Y2N4VHhQd3IucHJlc2VudCA9IDE7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPmNjeFR4UHdyLnBvd2VyX2xpbWl0ID0gcEJpZXMtPkNDWFR4bWl0UG93ZXIucG93ZXJfbGltaXQ7CisgICAgfQorICAgIGlmIChwQmllcy0+UUJTU0xvYWQucHJlc2VudCkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBCZWFjb25TdHJ1Y3QtPlFCU1NMb2FkLCAmcEJpZXMtPlFCU1NMb2FkLCBzaXplb2YodERvdDExZklFUUJTU0xvYWQpKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggcEJpZXMtPkVEQ0FQYXJhbVNldC5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPmVkY2FQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydEVEQ0FQYXJhbSggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPmVkY2FQYXJhbXMsICZwQmllcy0+RURDQVBhcmFtU2V0ICk7CisgICAgfQorCisgICAgLy8gUU9TIENhcGFiaWxpdGllczoKKyAgICBpZiAoIHBCaWVzLT5RT1NDYXBzQXAucHJlc2VudCApCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5xb3NDYXBhYmlsaXR5UHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRRT1NDYXBzKCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+cW9zQ2FwYWJpbGl0eSwgJnBCaWVzLT5RT1NDYXBzQXAgKTsKKyAgICB9CisKKworCisgICAgaWYgKCBwQmllcy0+Q2hhblN3aXRjaEFubi5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPmNoYW5uZWxTd2l0Y2hQcmVzZW50ID0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcEJlYWNvblN0cnVjdC0+Y2hhbm5lbFN3aXRjaElFLCAmcEJpZXMtPkNoYW5Td2l0Y2hBbm4sCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHREb3QxMWZJRUNoYW5Td2l0Y2hBbm4pKTsKKyAgICB9CisKKyAgICBpZiAoIHBCaWVzLT5FeHRDaGFuU3dpdGNoQW5uLnByZXNlbnQpCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5leHRDaGFubmVsU3dpdGNoUHJlc2VudD0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcEJlYWNvblN0cnVjdC0+ZXh0Q2hhbm5lbFN3aXRjaElFLCAmcEJpZXMtPkV4dENoYW5Td2l0Y2hBbm4sCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHREb3QxMWZJRUV4dENoYW5Td2l0Y2hBbm4pKTsKKyAgICB9CisKKyAgICBpZiAoIHBCaWVzLT5RdWlldC5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPnF1aWV0SUVQcmVzZW50ID0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPnF1aWV0SUUsICZwQmllcy0+UXVpZXQsIHNpemVvZih0RG90MTFmSUVRdWlldCkgKTsKKyAgICB9CisKKyAgICBpZiAoIHBCaWVzLT5IVENhcHMucHJlc2VudCApCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+SFRDYXBzLCAmcEJpZXMtPkhUQ2Fwcywgc2l6ZW9mKCB0RG90MTFmSUVIVENhcHMgKSApOworICAgIH0KKworICAgIGlmICggcEJpZXMtPkhUSW5mby5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMsICZwQmVhY29uU3RydWN0LT5IVEluZm8sICZwQmllcy0+SFRJbmZvLCBzaXplb2YoIHREb3QxMWZJRUhUSW5mbyApICk7CisgICAgfQorCisgICAgaWYgKCBwQmllcy0+RFNQYXJhbXMucHJlc2VudCApCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5kc1BhcmFtc1ByZXNlbnQgPSAxOworICAgICAgICBwQmVhY29uU3RydWN0LT5jaGFubmVsTnVtYmVyID0gcEJpZXMtPkRTUGFyYW1zLmN1cnJfY2hhbm5lbDsKKyAgICB9CisgICAgZWxzZSBpZihwQmllcy0+SFRJbmZvLnByZXNlbnQpCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5jaGFubmVsTnVtYmVyID0gcEJpZXMtPkhUSW5mby5wcmltYXJ5Q2hhbm5lbDsKKyAgICB9CisgICAgCisgICAgaWYgKCBwQmllcy0+UlNOLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+cnNuUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRSU04oIHBNYWMsICZwQmVhY29uU3RydWN0LT5yc24sICZwQmllcy0+UlNOICk7CisgICAgfQorCisgICAgaWYgKCBwQmllcy0+V1BBLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+d3BhUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRXUEEoIHBNYWMsICZwQmVhY29uU3RydWN0LT53cGEsICZwQmllcy0+V1BBICk7CisgICAgfQorCisgICAgaWYgKCBwQmllcy0+V01NUGFyYW1zLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+d21lRWRjYVByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0V01NUGFyYW1zKCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+ZWRjYVBhcmFtcywgJnBCaWVzLT5XTU1QYXJhbXMgKTsKKyAgICB9CisKKyAgICBpZiAoIHBCaWVzLT5XTU1JbmZvQXAucHJlc2VudCApCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT53bWVJbmZvUHJlc2VudCA9IDE7CisgICAgfQorCisgICAgaWYgKCBwQmllcy0+V01NQ2Fwcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPndzbUNhcGFibGVQcmVzZW50ID0gMTsKKyAgICB9CisKKworICAgIGlmICggcEJpZXMtPkVSUEluZm8ucHJlc2VudCApCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5lcnBQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydEVSUEluZm8oIHBNYWMsICZwQmVhY29uU3RydWN0LT5lcnBJRUluZm8sICZwQmllcy0+RVJQSW5mbyApOworICAgIH0KKworICAgIHBhbEZyZWVNZW1vcnkocE1hYy0+aEhkZCwgcEJpZXMpOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgc2lyUGFyc2VCZWFjb25JRS4KKwordFNpclJldFN0YXR1cworc2lyQ29udmVydEJlYWNvbkZyYW1lMlN0cnVjdCh0cEFuaVNpckdsb2JhbCAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICpwRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyUHJvYmVSZXNwQmVhY29uIHBCZWFjb25TdHJ1Y3QpCit7CisgICAgdERvdDExZkJlYWNvbiAgIGJlYWNvbjsKKyAgICB0QU5JX1UzMiAgICAgICAgc3RhdHVzLCBuUGF5bG9hZDsKKyAgICB0QU5JX1U4ICAgICAgICAqcFBheWxvYWQ7CisgICAgdHBTaXJNYWNNZ210SGRyIHBIZHI7CisgICAgdEFOSV9VOCAgICAgICAgIG1hcHBlZFJYQ2g7CisKKyAgICBwUGF5bG9hZCA9IFdEQV9HRVRfUlhfTVBEVV9EQVRBKCBwRnJhbWUgKTsKKyAgICBuUGF5bG9hZCA9IFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4oIHBGcmFtZSApOworICAgIHBIZHIgICAgID0gV0RBX0dFVF9SWF9NQUNfSEVBREVSKCBwRnJhbWUgKTsKKyAgICBtYXBwZWRSWENoID0gV0RBX0dFVF9SWF9DSCggcEZyYW1lICk7CisgICAgCisgICAgLy8gWmVyby1pbml0IG91ciBbb3V0XSBwYXJhbWV0ZXIsCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApcEJlYWNvblN0cnVjdCwgc2l6ZW9mKHRTaXJQcm9iZVJlc3BCZWFjb24pICk7CisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJmJlYWNvbiwgc2l6ZW9mKHREb3QxMWZCZWFjb24pICk7CisKKyAgICAvLyBnZXQgdGhlIE1BQyBhZGRyZXNzIG91dCBvZiB0aGUgQkQsCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcEJlYWNvblN0cnVjdC0+YnNzaWQsIHBIZHItPnNhLCA2ICk7CisKKyAgICAvLyBkZWxlZ2F0ZSB0byB0aGUgZnJhbWVzYy1nZW5lcmF0ZWQgY29kZSwKKyAgICBzdGF0dXMgPSBkb3QxMWZVbnBhY2tCZWFjb24oIHBNYWMsIHBQYXlsb2FkLCBuUGF5bG9hZCwgJmJlYWNvbiApOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFyc2UgQmVhY29uIElFcyAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgICAgICAgICAgIHN0YXR1cywgblBheWxvYWQpOworICAgICAgICBQRUxPRzIoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcFBheWxvYWQsIG5QYXlsb2FkKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBzdGF0dXMgKSApCisgICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbmcgQmVhY29uIElFcyAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgICAgICAgICAgc3RhdHVzLCBuUGF5bG9hZCApOworICAgICAgICBQRUxPRzIoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcFBheWxvYWQsIG5QYXlsb2FkKTspCisgICAgfQorCisgICAgLy8gJiAidHJhbnNsaXRlcmF0ZSIgZnJvbSBhICd0RG90MTFmQmVhY29uJyB0byBhICd0U2lyUHJvYmVSZXNwQmVhY29uJy4uLgorICAgIC8vIFRpbWVzdGFtcAorICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKXBCZWFjb25TdHJ1Y3QtPnRpbWVTdGFtcCwgKCB0QU5JX1U4KiApJmJlYWNvbi5UaW1lU3RhbXAsIHNpemVvZih0U2lyTWFjVGltZVN0YW1wKSApOworCisgICAgLy8gQmVhY29uIEludGVydmFsCisgICAgcEJlYWNvblN0cnVjdC0+YmVhY29uSW50ZXJ2YWwgPSBiZWFjb24uQmVhY29uSW50ZXJ2YWwuaW50ZXJ2YWw7CisKKyAgICAvLyBDYXBhYmlsaXRpZXMKKyAgICBwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5lc3MgICAgICAgICAgICA9IGJlYWNvbi5DYXBhYmlsaXRpZXMuZXNzOworICAgIHBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLmlic3MgICAgICAgICAgID0gYmVhY29uLkNhcGFiaWxpdGllcy5pYnNzOworICAgIHBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbGFibGUgICAgID0gYmVhY29uLkNhcGFiaWxpdGllcy5jZlBvbGxhYmxlOworICAgIHBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLmNmUG9sbFJlcSAgICAgID0gYmVhY29uLkNhcGFiaWxpdGllcy5jZlBvbGxSZXE7CisgICAgcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8ucHJpdmFjeSAgICAgICAgPSBiZWFjb24uQ2FwYWJpbGl0aWVzLnByaXZhY3k7CisgICAgcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8uc2hvcnRQcmVhbWJsZSAgPSBiZWFjb24uQ2FwYWJpbGl0aWVzLnNob3J0UHJlYW1ibGU7CisgICAgcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8ucGJjYyAgICAgICAgICAgPSBiZWFjb24uQ2FwYWJpbGl0aWVzLnBiY2M7CisgICAgcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8uY2hhbm5lbEFnaWxpdHkgPSBiZWFjb24uQ2FwYWJpbGl0aWVzLmNoYW5uZWxBZ2lsaXR5OworICAgIHBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLnNwZWN0cnVtTWd0ICAgID0gYmVhY29uLkNhcGFiaWxpdGllcy5zcGVjdHJ1bU1ndDsKKyAgICBwQmVhY29uU3RydWN0LT5jYXBhYmlsaXR5SW5mby5xb3MgICAgICAgICAgICA9IGJlYWNvbi5DYXBhYmlsaXRpZXMucW9zOworICAgIHBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLnNob3J0U2xvdFRpbWUgID0gYmVhY29uLkNhcGFiaWxpdGllcy5zaG9ydFNsb3RUaW1lOworICAgIHBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLmFwc2QgICAgICAgICAgID0gYmVhY29uLkNhcGFiaWxpdGllcy5hcHNkOworICAgIHBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLnJybSAgICAgICAgICAgID0gYmVhY29uLkNhcGFiaWxpdGllcy5ycm07CisgICAgcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8uZHNzc09mZG0gICAgICA9IGJlYWNvbi5DYXBhYmlsaXRpZXMuZHNzc09mZG07CisgICAgcEJlYWNvblN0cnVjdC0+Y2FwYWJpbGl0eUluZm8uZGVsYXllZEJBICAgICA9IGJlYWNvbi5DYXBhYmlsaXRpZXMuZGVsYXllZEJBOworICAgIHBCZWFjb25TdHJ1Y3QtPmNhcGFiaWxpdHlJbmZvLmltbWVkaWF0ZUJBICAgID0gYmVhY29uLkNhcGFiaWxpdGllcy5pbW1lZGlhdGVCQTsKKyAKKyAgICBpZiAoICEgYmVhY29uLlNTSUQucHJlc2VudCApCisgICAgeworICAgICAgICBQRUxPR1cobGltTG9nKHBNYWMsIExPR1csIEZMKCJNYW5kYXRvcnkgSUUgU1NJRCBub3QgcHJlc2VudCFcbiIpKTspCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPnNzaWRQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFNTSUQoIHBNYWMsICZwQmVhY29uU3RydWN0LT5zc0lkLCAmYmVhY29uLlNTSUQgKTsKKyAgICB9CisKKyAgICBpZiAoICEgYmVhY29uLlN1cHBSYXRlcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIFBFTE9HVyhsaW1Mb2cocE1hYywgTE9HVywgRkwoIk1hbmRhdG9yeSBJRSBTdXBwb3J0ZWQgUmF0ZXMgbm90IHByZXNlbnQhXG4iKSk7KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5zdXBwUmF0ZXNQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFN1cHBSYXRlcyggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPnN1cHBvcnRlZFJhdGVzLCAmYmVhY29uLlN1cHBSYXRlcyApOworICAgIH0KKworICAgIGlmICggYmVhY29uLkV4dFN1cHBSYXRlcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPmV4dGVuZGVkUmF0ZXNQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydEV4dFN1cHBSYXRlcyggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPmV4dGVuZGVkUmF0ZXMsICZiZWFjb24uRXh0U3VwcFJhdGVzICk7CisgICAgfQorCisKKyAgICBpZiAoIGJlYWNvbi5DRlBhcmFtcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPmNmUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRDRlBhcmFtcyggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPmNmUGFyYW1TZXQsICZiZWFjb24uQ0ZQYXJhbXMgKTsKKyAgICB9CisKKyAgICBpZiAoIGJlYWNvbi5USU0ucHJlc2VudCApCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT50aW1QcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFRJTSggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPnRpbSwgJmJlYWNvbi5USU0gKTsKKyAgICB9CisKKyAgICBpZiAoIGJlYWNvbi5Db3VudHJ5LnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+Y291bnRyeUluZm9QcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydENvdW50cnkoIHBNYWMsICZwQmVhY29uU3RydWN0LT5jb3VudHJ5SW5mb1BhcmFtLCAmYmVhY29uLkNvdW50cnkgKTsKKyAgICB9CisKKyAgICAvLyBRT1MgQ2FwYWJpbGl0aWVzOgorICAgIGlmICggYmVhY29uLlFPU0NhcHNBcC5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPnFvc0NhcGFiaWxpdHlQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFFPU0NhcHMoIHBNYWMsICZwQmVhY29uU3RydWN0LT5xb3NDYXBhYmlsaXR5LCAmYmVhY29uLlFPU0NhcHNBcCApOworICAgIH0KKworICAgIGlmICggYmVhY29uLkVEQ0FQYXJhbVNldC5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPmVkY2FQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydEVEQ0FQYXJhbSggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPmVkY2FQYXJhbXMsICZiZWFjb24uRURDQVBhcmFtU2V0ICk7CisgICAgfQorCisgICAgaWYgKCBiZWFjb24uQ2hhblN3aXRjaEFubi5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPmNoYW5uZWxTd2l0Y2hQcmVzZW50ID0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPmNoYW5uZWxTd2l0Y2hJRSwgJmJlYWNvbi5DaGFuU3dpdGNoQW5uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0RG90MTFmSUVDaGFuU3dpdGNoQW5uKSApOworICAgIH0KKworICAgIGlmICggYmVhY29uLkV4dENoYW5Td2l0Y2hBbm4ucHJlc2VudCApCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5leHRDaGFubmVsU3dpdGNoUHJlc2VudCA9IDE7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMsICZwQmVhY29uU3RydWN0LT5leHRDaGFubmVsU3dpdGNoSUUsICZiZWFjb24uRXh0Q2hhblN3aXRjaEFubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodERvdDExZklFRXh0Q2hhblN3aXRjaEFubikgKTsKKyAgICB9CisKKyAgICBpZiggYmVhY29uLlRQQ1JlcG9ydC5wcmVzZW50KQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+dHBjUmVwb3J0UHJlc2VudCA9IDE7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgJnBCZWFjb25TdHJ1Y3QtPnRwY1JlcG9ydCwgJmJlYWNvbi5UUENSZXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0RG90MTFmSUVUUENSZXBvcnQpKTsKKyAgICB9CisKKyAgICBpZiggYmVhY29uLlBvd2VyQ29uc3RyYWludHMucHJlc2VudCkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPnBvd2VyQ29uc3RyYWludFByZXNlbnQgPSAxOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwQmVhY29uU3RydWN0LT5sb2NhbFBvd2VyQ29uc3RyYWludCwgJmJlYWNvbi5Qb3dlckNvbnN0cmFpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHREb3QxMWZJRVBvd2VyQ29uc3RyYWludHMpKTsKKyAgICB9CisjaWYgZGVmaW5lZCBGRUFUVVJFX1dMQU5fQ0NYCisgICAgaWYgKGJlYWNvbi5DQ1hUeG1pdFBvd2VyLnByZXNlbnQpCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICZwQmVhY29uU3RydWN0LT5jY3hUeFB3ciwgJmJlYWNvbi5DQ1hUeG1pdFBvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHREb3QxMWZJRUNDWFR4bWl0UG93ZXIpKTsKKyAgICB9CisgICAgaWYgKGJlYWNvbi5RQlNTTG9hZC5wcmVzZW50KQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmcEJlYWNvblN0cnVjdC0+UUJTU0xvYWQsICZiZWFjb24uUUJTU0xvYWQsIHNpemVvZih0RG90MTFmSUVRQlNTTG9hZCkpOworICAgIH0KKyNlbmRpZgorICAgIGlmICggYmVhY29uLlF1aWV0LnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+cXVpZXRJRVByZXNlbnQgPSAxOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+cXVpZXRJRSwgJmJlYWNvbi5RdWlldCwgc2l6ZW9mKHREb3QxMWZJRVF1aWV0KSk7CisgICAgfQorCisgICAgaWYgKCBiZWFjb24uSFRDYXBzLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPkhUQ2FwcywgJmJlYWNvbi5IVENhcHMsIHNpemVvZiggdERvdDExZklFSFRDYXBzICkgKTsKKyAgICB9CisKKyAgICBpZiAoIGJlYWNvbi5IVEluZm8ucHJlc2VudCApCisgICAgeworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+SFRJbmZvLCAmYmVhY29uLkhUSW5mbywgc2l6ZW9mKCB0RG90MTFmSUVIVEluZm8pICk7CisKKyAgICB9CisKKyAgICBpZiAoIGJlYWNvbi5EU1BhcmFtcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPmRzUGFyYW1zUHJlc2VudCA9IDE7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPmNoYW5uZWxOdW1iZXIgPSBiZWFjb24uRFNQYXJhbXMuY3Vycl9jaGFubmVsOworICAgIH0KKyAgICBlbHNlIGlmKGJlYWNvbi5IVEluZm8ucHJlc2VudCkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPmNoYW5uZWxOdW1iZXIgPSBiZWFjb24uSFRJbmZvLnByaW1hcnlDaGFubmVsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQmVhY29uU3RydWN0LT5jaGFubmVsTnVtYmVyID0gbGltVW5tYXBDaGFubmVsKG1hcHBlZFJYQ2gpOworICAgIH0KKworICAgIGlmICggYmVhY29uLlJTTi5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPnJzblByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0UlNOKCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+cnNuLCAmYmVhY29uLlJTTiApOworICAgIH0KKworICAgIGlmICggYmVhY29uLldQQS5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPndwYVByZXNlbnQgPSAxOworICAgICAgICBDb252ZXJ0V1BBKCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+d3BhLCAmYmVhY29uLldQQSApOworICAgIH0KKworICAgIGlmICggYmVhY29uLldNTVBhcmFtcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPndtZUVkY2FQcmVzZW50ID0gMTsKKyAgICAgICAgQ29udmVydFdNTVBhcmFtcyggcE1hYywgJnBCZWFjb25TdHJ1Y3QtPmVkY2FQYXJhbXMsICZiZWFjb24uV01NUGFyYW1zICk7CisgICAgICAgIFBFTE9HMShsaW1Mb2cocE1hYywgTE9HMSwgRkwoIldNTSBQYXJhbWV0ZXIgcHJlc2VudCBpbiBCZWFjb24gRnJhbWUhXG4iKSk7CisgICAgICAgIF9fcHJpbnRXTU1QYXJhbXMocE1hYywgJmJlYWNvbi5XTU1QYXJhbXMpOyApCisgICAgfQorCisgICAgaWYgKCBiZWFjb24uV01NSW5mb0FwLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+d21lSW5mb1ByZXNlbnQgPSAxOworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsIEZMKCJXTU0gSW5mbyBwcmVzZW50IGluIEJlYWNvbiBGcmFtZSFcbiIpKTspCisgICAgfQorCisgICAgaWYgKCBiZWFjb24uV01NQ2Fwcy5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPndzbUNhcGFibGVQcmVzZW50ID0gMTsKKyAgICB9CisKKyAgICBpZiAoIGJlYWNvbi5FUlBJbmZvLnByZXNlbnQgKQorICAgIHsKKyAgICAgICAgcEJlYWNvblN0cnVjdC0+ZXJwUHJlc2VudCA9IDE7CisgICAgICAgIENvbnZlcnRFUlBJbmZvKCBwTWFjLCAmcEJlYWNvblN0cnVjdC0+ZXJwSUVJbmZvLCAmYmVhY29uLkVSUEluZm8gKTsKKyAgICB9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorICAgIGlmIChiZWFjb24uTW9iaWxpdHlEb21haW4ucHJlc2VudCkKKyAgICB7CisgICAgICAgIC8vIE1vYmlsaXR5RG9tYWluCisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPm1kaWVQcmVzZW50ID0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRBTklfVTggKikmKHBCZWFjb25TdHJ1Y3QtPm1kaWVbMF0pLCAodEFOSV9VOCAqKSYoYmVhY29uLk1vYmlsaXR5RG9tYWluLk1ESUQpLCBzaXplb2YodEFOSV9VMTYpICk7CisgICAgICAgIHBCZWFjb25TdHJ1Y3QtPm1kaWVbMl0gPSAoKGJlYWNvbi5Nb2JpbGl0eURvbWFpbi5vdmVyRFNDYXAgPDwgMCkgfCAoYmVhY29uLk1vYmlsaXR5RG9tYWluLnJlc291cmNlUmVxQ2FwIDw8IDEpKTsKKworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgc2lyQ29udmVydEJlYWNvbkZyYW1lMlN0cnVjdC4KKwordFNpclJldFN0YXR1cworc2lyQ29udmVydEF1dGhGcmFtZTJTdHJ1Y3QodHBBbmlTaXJHbG9iYWwgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICpwRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICBuRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpck1hY0F1dGhGcmFtZUJvZHkgcEF1dGgpCit7CisgICAgc3RhdGljIHREb3QxMWZBdXRoZW50aWNhdGlvbiBhdXRoOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKworICAgIC8vIFplcm8taW5pdCBvdXIgW291dF0gcGFyYW1ldGVyLAorICAgIHBhbFplcm9NZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKXBBdXRoLCBzaXplb2YodFNpck1hY0F1dGhGcmFtZUJvZHkpICk7CisKKyAgICAvLyBkZWxlZ2F0ZSB0byB0aGUgZnJhbWVzYy1nZW5lcmF0ZWQgY29kZSwKKyAgICBzdGF0dXMgPSBkb3QxMWZVbnBhY2tBdXRoZW50aWNhdGlvbiggcE1hYywgcEZyYW1lLCBuRnJhbWUsICZhdXRoICk7CisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwYXJzZSBhbiBBdXRoZW50aWNhdGlvbiBmcmFtZSAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lKTsKKyAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBzdGF0dXMgKSApCisgICAgeworICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbmcgYW4gQXV0aGVudGljYXRpb24gZnJhbWUgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lICk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgIH0KKworICAgIC8vICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZkF1dGhlbnRpY2F0aW9uJyB0byBhICd0U2lyTWFjQXV0aEZyYW1lQm9keScuLi4KKyAgICBwQXV0aC0+YXV0aEFsZ29OdW1iZXIgICAgICAgICAgID0gYXV0aC5BdXRoQWxnby5hbGdvOworICAgIHBBdXRoLT5hdXRoVHJhbnNhY3Rpb25TZXFOdW1iZXIgPSBhdXRoLkF1dGhTZXFOby5ubzsKKyAgICBwQXV0aC0+YXV0aFN0YXR1c0NvZGUgICAgICAgICAgID0gYXV0aC5TdGF0dXMuc3RhdHVzOworCisgICAgaWYgKCBhdXRoLkNoYWxsZW5nZVRleHQucHJlc2VudCApCisgICAgeworICAgICAgICBwQXV0aC0+dHlwZSAgID0gU0lSX01BQ19DSEFMTEVOR0VfVEVYVF9FSUQ7CisgICAgICAgIHBBdXRoLT5sZW5ndGggPSBhdXRoLkNoYWxsZW5nZVRleHQubnVtX3RleHQ7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBBdXRoLT5jaGFsbGVuZ2VUZXh0LCBhdXRoLkNoYWxsZW5nZVRleHQudGV4dCwgYXV0aC5DaGFsbGVuZ2VUZXh0Lm51bV90ZXh0ICk7CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgc2lyQ29udmVydEF1dGhGcmFtZTJTdHJ1Y3QuCisKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnRBZGR0c1JlcTJTdHJ1Y3QodHBBbmlTaXJHbG9iYWwgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgICAgICAgICAgICAgICpwRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgICAgICAgICAgbkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQWRkdHNSZXFJbmZvICpwQWRkVHMpCit7CisgICAgdERvdDExZkFkZFRTUmVxdWVzdCAgICBhZGR0cyA9IHt7MH19OworICAgIHREb3QxMWZXTU1BZGRUU1JlcXVlc3Qgd21tYWRkdHMgPSB7ezB9fTsKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgajsKKyAgICB0QU5JX1UxNiAgICAgICAgICAgICAgICAgICAgaTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCisgICAgaWYgKCBTSVJfTUFDX1FPU19BRERfVFNfUkVRICE9ICooIHBGcmFtZSArIDEgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJzaXJDb252ZXJ0QWRkdHNSZXEyU3RydWN0IGludm9rZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuIEFjdGlvbiBvZiAlZDsgdGhpcyBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgJiBpcyBwcm9iYWJseSBhbiBlcnJvci4iKSwKKyAgICAgICAgICAgICAgICAgICAqKCBwRnJhbWUgKyAxICkgKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBaZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqIClwQWRkVHMsIHNpemVvZih0U2lyQWRkdHNSZXFJbmZvKSApOworCisgICAgLy8gZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsCisgICAgc3dpdGNoICggKnBGcmFtZSApCisgICAgeworICAgIGNhc2UgU0lSX01BQ19BQ1RJT05fUU9TX01HTVQ6CisgICAgICAgIHN0YXR1cyA9IGRvdDExZlVucGFja0FkZFRTUmVxdWVzdCggcE1hYywgcEZyYW1lLCBuRnJhbWUsICZhZGR0cyApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNJUl9NQUNfQUNUSU9OX1dNRToKKyAgICAgICAgc3RhdHVzID0gZG90MTFmVW5wYWNrV01NQWRkVFNSZXF1ZXN0KCBwTWFjLCBwRnJhbWUsIG5GcmFtZSwgJndtbWFkZHRzICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoInNpckNvbnZlcnRBZGR0c1JlcTJTdHJ1Y3QgaW52b2tlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggYSBDYXRlZ29yeSBvZiAlZDsgdGhpcyBpcyBub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdXBwb3J0ZWQgJiBpcyBwcm9iYWJseSBhbiBlcnJvci4iKSwKKyAgICAgICAgICAgICAgICAgICAqcEZyYW1lICk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBzdGF0dXMgKSApCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBwYXJzZSBhbiBBZGQgVFMgUmVxdWVzdCBmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhbWUgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICBzdGF0dXMsIG5GcmFtZSk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyBhbiBBZGQgVFMgUmVxdWVzdCBmcmFtZSAoMHglMDh4LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBuRnJhbWUgKTsKKyAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTspCisgICAgfQorCisgICAgLy8gJiAidHJhbnNsaXRlcmF0ZSIgZnJvbSBhICd0RG90MTFmQWRkVFNSZXF1ZXN0JyBvciBhCisgICAgLy8gJ3REb3QxMVdNTUFkZFRTUmVxdWVzdCcgdG8gYSAndFNpck1hY0FkZHRzUmVxSW5mbycuLi4KKyAgICBpZiAoIFNJUl9NQUNfQUNUSU9OX1FPU19NR01UID09ICpwRnJhbWUgKQorICAgIHsKKyAgICAgICAgcEFkZFRzLT5kaWFsb2dUb2tlbiA9IGFkZHRzLkRpYWxvZ1Rva2VuLnRva2VuOworCisgICAgICAgIGlmICggYWRkdHMuVFNQRUMucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnZlcnRUU1BFQyggcE1hYywgJnBBZGRUcy0+dHNwZWMsICZhZGR0cy5UU1BFQyApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiTWFuZGF0b3J5IFRTUEVDIGVsZW1lbnQgbWlzc2luZyBpbiBBZGQgVFMgUmVxdWVzdC5cbiIpICk7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBhZGR0cy5udW1fVENMQVMgKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRkVHMtPm51bVRjbGFzID0gKHRBTklfVTgpYWRkdHMubnVtX1RDTEFTOworCisgICAgICAgICAgICBmb3IgKCBpID0gMFU7IGkgPCBhZGR0cy5udW1fVENMQVM7ICsraSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBlU0lSX1NVQ0NFU1MgIT0gQ29udmVydFRDTEFTKCBwTWFjLCAmKCBwQWRkVHMtPnRjbGFzSW5mb1tpXSApLCAmKCBhZGR0cy5UQ0xBU1tpXSApICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIGNvbnZlcnQgYSBUQ0xBUyBJRS5cbiIpICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBhZGR0cy5UQ0xBU1NQUk9DLnByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRkVHMtPnRjbGFzUHJvY1ByZXNlbnQgPSAxOworICAgICAgICAgICAgcEFkZFRzLT50Y2xhc1Byb2MgPSBhZGR0cy5UQ0xBU1NQUk9DLnByb2Nlc3Npbmc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGFkZHRzLldNTVRTUEVDLnByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRkVHMtPndzbVRzcGVjUHJlc2VudCA9IDE7CisgICAgICAgICAgICBDb252ZXJ0V01NVFNQRUMoIHBNYWMsICZwQWRkVHMtPnRzcGVjLCAmYWRkdHMuV01NVFNQRUMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggYWRkdHMubnVtX1dNTVRDTEFTICkKKyAgICAgICAgeworICAgICAgICAgICAgaiA9ICh0QU5JX1U4KShwQWRkVHMtPm51bVRjbGFzICsgYWRkdHMubnVtX1dNTVRDTEFTKTsKKyAgICAgICAgICAgIGlmICggU0lSX01BQ19UQ0xBU0lFX01BWE5VTSA+IGogKSBqID0gU0lSX01BQ19UQ0xBU0lFX01BWE5VTTsKKworICAgICAgICAgICAgZm9yICggaSA9IHBBZGRUcy0+bnVtVGNsYXM7IGkgPCBqOyArK2kgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggZVNJUl9TVUNDRVNTICE9IENvbnZlcnRXTU1UQ0xBUyggcE1hYywgJiggcEFkZFRzLT50Y2xhc0luZm9baV0gKSwgJiggYWRkdHMuV01NVENMQVNbaV0gKSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBjb252ZXJ0IGEgVENMQVMgSUUuXG4iKSApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggYWRkdHMuV01NVENMQVNQUk9DLnByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRkVHMtPnRjbGFzUHJvY1ByZXNlbnQgPSAxOworICAgICAgICAgICAgcEFkZFRzLT50Y2xhc1Byb2MgPSBhZGR0cy5XTU1UQ0xBU1BST0MucHJvY2Vzc2luZzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggMSA8IHBBZGRUcy0+bnVtVGNsYXMgJiYgKCAhIHBBZGRUcy0+dGNsYXNQcm9jUHJlc2VudCApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiJWQgVENMQVMgSUUgYnV0IG5vdCBUQ0xBU1BST0MgSUUuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcEFkZFRzLT5udW1UY2xhcyApOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQWRkVHMtPmRpYWxvZ1Rva2VuID0gd21tYWRkdHMuRGlhbG9nVG9rZW4udG9rZW47CisKKyAgICAgICAgaWYgKCB3bW1hZGR0cy5XTU1UU1BFQy5wcmVzZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkZFRzLT53bWVUc3BlY1ByZXNlbnQgPSAxOworICAgICAgICAgICAgQ29udmVydFdNTVRTUEVDKCBwTWFjLCAmcEFkZFRzLT50c3BlYywgJndtbWFkZHRzLldNTVRTUEVDICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJNYW5kYXRvcnkgV01FIFRTUEVDIGVsZW1lbnQgbWlzc2luZyFcbiIpICk7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgc2lyQ29udmVydEFkZHRzUmVxMlN0cnVjdC4KKwordFNpclJldFN0YXR1cworc2lyQ29udmVydEFkZHRzUnNwMlN0cnVjdCh0cEFuaVNpckdsb2JhbCAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgKnBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICBuRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJBZGR0c1JzcEluZm8gKnBBZGRUcykKK3sKKyAgICB0RG90MTFmQWRkVFNSZXNwb25zZSAgICBhZGR0cyA9IHt7MH19OworICAgIHREb3QxMWZXTU1BZGRUU1Jlc3BvbnNlIHdtbWFkZHRzID0ge3swfX07CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgICAgICBqOworICAgIHRBTklfVTE2ICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKworICAgIGlmICggU0lSX01BQ19RT1NfQUREX1RTX1JTUCAhPSAqKCBwRnJhbWUgKyAxICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgic2lyQ29udmVydEFkZHRzUnNwMlN0cnVjdCBpbnZva2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCBhbiBBY3Rpb24gb2YgJWQ7IHRoaXMgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkICYgaXMgcHJvYmFibHkgYW4gZXJyb3IuIiksCisgICAgICAgICAgICAgICAgICAgKiggcEZyYW1lICsgMSApICk7CisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gWmVyby1pbml0IG91ciBbb3V0XSBwYXJhbWV0ZXIsCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApcEFkZFRzLCBzaXplb2YodFNpckFkZHRzUnNwSW5mbykgKTsKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmYWRkdHMsIHNpemVvZih0RG90MTFmQWRkVFNSZXNwb25zZSkgKTsKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmd21tYWRkdHMsIHNpemVvZih0RG90MTFmV01NQWRkVFNSZXNwb25zZSkgKTsKKworCisgICAgLy8gZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsCisgICAgc3dpdGNoICggKnBGcmFtZSApCisgICAgeworICAgIGNhc2UgU0lSX01BQ19BQ1RJT05fUU9TX01HTVQ6CisgICAgICAgIHN0YXR1cyA9IGRvdDExZlVucGFja0FkZFRTUmVzcG9uc2UoIHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmYWRkdHMgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTSVJfTUFDX0FDVElPTl9XTUU6CisgICAgICAgIHN0YXR1cyA9IGRvdDExZlVucGFja1dNTUFkZFRTUmVzcG9uc2UoIHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmd21tYWRkdHMgKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgic2lyQ29udmVydEFkZHRzUnNwMlN0cnVjdCBpbnZva2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCBhIENhdGVnb3J5IG9mICVkOyB0aGlzIGlzIG5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHN1cHBvcnRlZCAmIGlzIHByb2JhYmx5IGFuIGVycm9yLiIpLAorICAgICAgICAgICAgICAgICAgICpwRnJhbWUgKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhcnNlIGFuIEFkZCBUUyBSZXNwb25zZSBmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhbWUgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICBzdGF0dXMsIG5GcmFtZSk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyBhbiBBZGQgVFMgUmVzcG9uc2UgZnJhbWUgKDB4JTA4eCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lICk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgIH0KKworICAgIC8vICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZkFkZFRTUmVzcG9uc2UnIG9yIGEKKyAgICAvLyAndERvdDExV01NQWRkVFNSZXNwb25zZScgdG8gYSAndFNpck1hY0FkZHRzUnNwSW5mbycuLi4KKyAgICBpZiAoIFNJUl9NQUNfQUNUSU9OX1FPU19NR01UID09ICpwRnJhbWUgKQorICAgIHsKKyAgICAgICAgcEFkZFRzLT5kaWFsb2dUb2tlbiA9IGFkZHRzLkRpYWxvZ1Rva2VuLnRva2VuOworICAgICAgICBwQWRkVHMtPnN0YXR1cyAgICAgID0gKCB0U2lyTWFjU3RhdHVzQ29kZXMgKWFkZHRzLlN0YXR1cy5zdGF0dXM7CisKKyAgICAgICAgaWYgKCBhZGR0cy5UU0RlbGF5LnByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBDb252ZXJ0VFNEZWxheSggcE1hYywgJnBBZGRUcy0+ZGVsYXksICZhZGR0cy5UU0RlbGF5ICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUUyBEZWxheSBpcyBwcmVzZW50IGlmZiBzdGF0dXMgaW5kaWNhdGVzIGl0cyBwcmVzZW5jZQorICAgICAgICBpZiAoIGVTSVJfTUFDX1RTX05PVF9DUkVBVEVEX1NUQVRVUyA9PSBwQWRkVHMtPnN0YXR1cyAmJiAhIGFkZHRzLlRTRGVsYXkucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HVywgRkwoIk1pc3NpbmcgVFNEZWxheSBJRS5cbiIpICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGFkZHRzLlRTUEVDLnByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBDb252ZXJ0VFNQRUMoIHBNYWMsICZwQWRkVHMtPnRzcGVjLCAmYWRkdHMuVFNQRUMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIk1hbmRhdG9yeSBUU1BFQyBlbGVtZW50IG1pc3NpbmcgaW4gQWRkIFRTIFJlc3BvbnNlLlxuIikgKTsKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGFkZHRzLm51bV9UQ0xBUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGRUcy0+bnVtVGNsYXMgPSAodEFOSV9VOClhZGR0cy5udW1fVENMQVM7CisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwVTsgaSA8IGFkZHRzLm51bV9UQ0xBUzsgKytpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGVTSVJfU1VDQ0VTUyAhPSBDb252ZXJ0VENMQVMoIHBNYWMsICYoIHBBZGRUcy0+dGNsYXNJbmZvW2ldICksICYoIGFkZHRzLlRDTEFTW2ldICkgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gY29udmVydCBhIFRDTEFTIElFLlxuIikgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGFkZHRzLlRDTEFTU1BST0MucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGRUcy0+dGNsYXNQcm9jUHJlc2VudCA9IDE7CisgICAgICAgICAgICBwQWRkVHMtPnRjbGFzUHJvYyA9IGFkZHRzLlRDTEFTU1BST0MucHJvY2Vzc2luZzsKKyAgICAgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgICAgICAgaWYoYWRkdHMuQ0NYVHJhZlN0cm1NZXQucHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkZFRzLT50c21QcmVzZW50ID0gMTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwmcEFkZFRzLT50c21JRS50c2lkLAorICAgICAgICAgICAgICAgICAgICAgICZhZGR0cy5DQ1hUcmFmU3RybU1ldC50c2lkLHNpemVvZih0U2lyTWFjQ0NYVFNNSUUpKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmICggYWRkdHMuU2NoZWR1bGUucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGRUcy0+c2NoZWR1bGVQcmVzZW50ID0gMTsKKyAgICAgICAgICAgIENvbnZlcnRTY2hlZHVsZSggcE1hYywgJnBBZGRUcy0+c2NoZWR1bGUsICZhZGR0cy5TY2hlZHVsZSApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBhZGR0cy5XTU1TY2hlZHVsZS5wcmVzZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkZFRzLT5zY2hlZHVsZVByZXNlbnQgPSAxOworICAgICAgICAgICAgQ29udmVydFdNTVNjaGVkdWxlKCBwTWFjLCAmcEFkZFRzLT5zY2hlZHVsZSwgJmFkZHRzLldNTVNjaGVkdWxlICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGFkZHRzLldNTVRTUEVDLnByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRkVHMtPndzbVRzcGVjUHJlc2VudCA9IDE7CisgICAgICAgICAgICBDb252ZXJ0V01NVFNQRUMoIHBNYWMsICZwQWRkVHMtPnRzcGVjLCAmYWRkdHMuV01NVFNQRUMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggYWRkdHMubnVtX1dNTVRDTEFTICkKKyAgICAgICAgeworICAgICAgICAgICAgaiA9ICh0QU5JX1U4KShwQWRkVHMtPm51bVRjbGFzICsgYWRkdHMubnVtX1dNTVRDTEFTKTsKKyAgICAgICAgICAgIGlmICggU0lSX01BQ19UQ0xBU0lFX01BWE5VTSA+IGogKSBqID0gU0lSX01BQ19UQ0xBU0lFX01BWE5VTTsKKworICAgICAgICAgICAgZm9yICggaSA9IHBBZGRUcy0+bnVtVGNsYXM7IGkgPCBqOyArK2kgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggZVNJUl9TVUNDRVNTICE9IENvbnZlcnRXTU1UQ0xBUyggcE1hYywgJiggcEFkZFRzLT50Y2xhc0luZm9baV0gKSwgJiggYWRkdHMuV01NVENMQVNbaV0gKSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkZhaWxlZCB0byBjb252ZXJ0IGEgVENMQVMgSUUuXG4iKSApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggYWRkdHMuV01NVENMQVNQUk9DLnByZXNlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRkVHMtPnRjbGFzUHJvY1ByZXNlbnQgPSAxOworICAgICAgICAgICAgcEFkZFRzLT50Y2xhc1Byb2MgPSBhZGR0cy5XTU1UQ0xBU1BST0MucHJvY2Vzc2luZzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggMSA8IHBBZGRUcy0+bnVtVGNsYXMgJiYgKCAhIHBBZGRUcy0+dGNsYXNQcm9jUHJlc2VudCApICkKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiJWQgVENMQVMgSUUgYnV0IG5vdCBUQ0xBU1BST0MgSUUuXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcEFkZFRzLT5udW1UY2xhcyApOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQWRkVHMtPmRpYWxvZ1Rva2VuID0gd21tYWRkdHMuRGlhbG9nVG9rZW4udG9rZW47CisgICAgICAgIHBBZGRUcy0+c3RhdHVzICAgICAgPSAoIHRTaXJNYWNTdGF0dXNDb2RlcyApd21tYWRkdHMuU3RhdHVzQ29kZS5zdGF0dXNDb2RlOworCisgICAgICAgIGlmICggd21tYWRkdHMuV01NVFNQRUMucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGRUcy0+d21lVHNwZWNQcmVzZW50ID0gMTsKKyAgICAgICAgICAgIENvbnZlcnRXTU1UU1BFQyggcE1hYywgJnBBZGRUcy0+dHNwZWMsICZ3bW1hZGR0cy5XTU1UU1BFQyApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiTWFuZGF0b3J5IFdNRSBUU1BFQyBlbGVtZW50IG1pc3NpbmchXG4iKSApOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgICBpZih3bW1hZGR0cy5DQ1hUcmFmU3RybU1ldC5wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgICBwQWRkVHMtPnRzbVByZXNlbnQgPSAxOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCZwQWRkVHMtPnRzbUlFLnRzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJndtbWFkZHRzLkNDWFRyYWZTdHJtTWV0LnRzaWQsc2l6ZW9mKHRTaXJNYWNDQ1hUU01JRSkpOworICAgICAgICB9CisjZW5kaWYKKworICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIHNpckNvbnZlcnRBZGR0c1JzcDJTdHJ1Y3QuCisKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnREZWx0c1JlcTJTdHJ1Y3QodHBBbmlTaXJHbG9iYWwgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAgICAgICAgICAgICAgICpwRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgICAgICAgICAgbkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyRGVsdHNSZXFJbmZvICpwRGVsVHMpCit7CisgICAgdERvdDExZkRlbFRTICAgIGRlbHRzID0ge3swfX07CisgICAgdERvdDExZldNTURlbFRTIHdtbWRlbHRzID0ge3swfX07CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgc3RhdHVzOworCisgICAgaWYgKCBTSVJfTUFDX1FPU19ERUxfVFNfUkVRICE9ICooIHBGcmFtZSArIDEgKSApCisgICAgeworICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJzaXJDb252ZXJ0RGVsdHNSc3AyU3RydWN0IGludm9rZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuIEFjdGlvbiBvZiAlZDsgdGhpcyBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgJiBpcyBwcm9iYWJseSBhbiBlcnJvci4iKSwKKyAgICAgICAgICAgICAgICAgICAqKCBwRnJhbWUgKyAxICkgKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBaZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqIClwRGVsVHMsIHNpemVvZih0U2lyRGVsdHNSZXFJbmZvKSApOworCisgICAgLy8gZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsCisgICAgc3dpdGNoICggKnBGcmFtZSApCisgICAgeworICAgIGNhc2UgU0lSX01BQ19BQ1RJT05fUU9TX01HTVQ6CisgICAgICAgIHN0YXR1cyA9IGRvdDExZlVucGFja0RlbFRTKCBwTWFjLCBwRnJhbWUsIG5GcmFtZSwgJmRlbHRzICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0lSX01BQ19BQ1RJT05fV01FOgorICAgICAgICBzdGF0dXMgPSBkb3QxMWZVbnBhY2tXTU1EZWxUUyggcE1hYywgcEZyYW1lLCBuRnJhbWUsICZ3bW1kZWx0cyApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBsaW1Mb2coIHBNYWMsIExPR0UsIEZMKCJzaXJDb252ZXJ0RGVsdHNSc3AyU3RydWN0IGludm9rZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIGEgQ2F0ZWdvcnkgb2YgJWQ7IHRoaXMgaXMgbm90IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc3VwcG9ydGVkICYgaXMgcHJvYmFibHkgYW4gZXJyb3IuIiksCisgICAgICAgICAgICAgICAgICAgKnBGcmFtZSApOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR0UsIEZMKCJGYWlsZWQgdG8gcGFyc2UgYW4gRGVsIFRTIFJlcXVlc3QgZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW1lICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgICAgICAgc3RhdHVzLCBuRnJhbWUpOworICAgICAgICBQRUxPRzIoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOykKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisgICAgZWxzZSBpZiAoIERPVDExRl9XQVJORUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGRvdDExZkxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImcgYW4gRGVsIFRTIFJlcXVlc3QgZnJhbWUgKDB4JTA4eCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lICk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgIH0KKworICAgIC8vICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZkRlbFRTUmVzcG9uc2UnIG9yIGEKKyAgICAvLyAndERvdDExV01NRGVsVFNSZXNwb25zZScgdG8gYSAndFNpck1hY0RlbHRzUmVxSW5mbycuLi4KKyAgICBpZiAoIFNJUl9NQUNfQUNUSU9OX1FPU19NR01UID09ICpwRnJhbWUgKQorICAgIHsKKyAgICAgICAgcERlbFRzLT50c2luZm8udHJhZmZpYy50cmFmZmljVHlwZSAgPSAodEFOSV9VMTYpZGVsdHMuVFNJbmZvLnRyYWZmaWNfdHlwZTsKKyAgICAgICAgcERlbFRzLT50c2luZm8udHJhZmZpYy50c2lkICAgICAgICAgPSAodEFOSV9VMTYpZGVsdHMuVFNJbmZvLnRzaWQ7CisgICAgICAgIHBEZWxUcy0+dHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uICAgID0gKHRBTklfVTE2KWRlbHRzLlRTSW5mby5kaXJlY3Rpb247CisgICAgICAgIHBEZWxUcy0+dHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID0gKHRBTklfVTE2KWRlbHRzLlRTSW5mby5hY2Nlc3NfcG9saWN5OworICAgICAgICBwRGVsVHMtPnRzaW5mby50cmFmZmljLmFnZ3JlZ2F0aW9uICA9ICh0QU5JX1UxNilkZWx0cy5UU0luZm8uYWdncmVnYXRpb247CisgICAgICAgIHBEZWxUcy0+dHNpbmZvLnRyYWZmaWMucHNiICAgICAgICAgID0gKHRBTklfVTE2KWRlbHRzLlRTSW5mby5wc2I7CisgICAgICAgIHBEZWxUcy0+dHNpbmZvLnRyYWZmaWMudXNlclByaW8gICAgID0gKHRBTklfVTE2KWRlbHRzLlRTSW5mby51c2VyX3ByaW9yaXR5OworICAgICAgICBwRGVsVHMtPnRzaW5mby50cmFmZmljLmFja1BvbGljeSAgICA9ICh0QU5JX1UxNilkZWx0cy5UU0luZm8udHNpbmZvX2Fja19wb2w7CisKKyAgICAgICAgcERlbFRzLT50c2luZm8uc2NoZWR1bGUuc2NoZWR1bGUgICAgPSAodEFOSV9VOClkZWx0cy5UU0luZm8uc2NoZWR1bGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICggd21tZGVsdHMuV01NVFNQRUMucHJlc2VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEZWxUcy0+d21lVHNwZWNQcmVzZW50ID0gMTsKKyAgICAgICAgICAgIENvbnZlcnRXTU1UU1BFQyggcE1hYywgJnBEZWxUcy0+dHNwZWMsICZ3bW1kZWx0cy5XTU1UU1BFQyApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZG90MTFmTG9nKCBwTWFjLCBMT0dFLCBGTCgiTWFuZGF0b3J5IFdNRSBUU1BFQyBlbGVtZW50IG1pc3NpbmchXG4iKSApOworICAgICAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIHNpckNvbnZlcnREZWx0c1JlcTJTdHJ1Y3QuCisKKworI2lmZGVmIEFOSV9TVVBQT1JUXzExSAordFNpclJldFN0YXR1cworc2lyQ29udmVydFRwY1JlcUZyYW1lMlN0cnVjdCh0cEFuaVNpckdsb2JhbCAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggICAgICAgICAgICAgICAgICAgICAgICpwRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjVHBjUmVxQWN0aW9uRnJhbWUgcFRwY1JlcUZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgICAgbkZyYW1lKQoreworICAgIHREb3QxMWZUUENSZXF1ZXN0ICAgICByZXE7CisgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCisgICAgLy8gWmVyby1pbml0IG91ciBbb3V0XSBwYXJhbWV0ZXIsCisgICAgcGFsWmVyb01lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApcFRwY1JlcUZyYW1lLCBzaXplb2YodFNpck1hY1RwY1JlcUFjdGlvbkZyYW1lKSApOworCisgICAgLy8gZGVsZWdhdGUgdG8gdGhlIGZyYW1lc2MtZ2VuZXJhdGVkIGNvZGUsCisgICAgc3RhdHVzID0gZG90MTFmVW5wYWNrVFBDUmVxdWVzdCggcE1hYywgcEZyYW1lLCBuRnJhbWUsICZyZXEgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGRvdDExZkxvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhcnNlIGEgVFBDIFJlcXVlc3QgZnJhbWUgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgICBzdGF0dXMsIG5GcmFtZSk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgICBlbHNlIGlmICggRE9UMTFGX1dBUk5FRCggc3RhdHVzICkgKQorICAgIHsKKyAgICAgIGRvdDExZkxvZyggcE1hYywgTE9HVywgRkwoIlRoZXJlIHdlcmUgd2FybmluZ3Mgd2hpbGUgdW5wYWNraW5nIGEgVFBDIFJlcXVlc3QgZnJhbWUgKDB4JTA4eCwgJWQgYnl0ZXMpOlxuIiksCisgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lICk7CisgICAgICAgIFBFTE9HMihzaXJEdW1wQnVmKHBNYWMsIFNJUl9EQkdfTU9EVUxFX0lELCBMT0cyLCBwRnJhbWUsIG5GcmFtZSk7KQorICAgIH0KKworICAgIC8vICYgInRyYW5zbGl0ZXJhdGUiIGZyb20gYSAndERvdDExZlRQQ1JlcXVlc3QnIHRvIGEKKyAgICAvLyAndFNpck1hY1RwY1JlcUFjdGlvbkZyYW1lJy4uLgorICAgIHBUcGNSZXFGcmFtZS0+YWN0aW9uSGVhZGVyLmNhdGVnb3J5ICAgID0gcmVxLkNhdGVnb3J5LmNhdGVnb3J5OworICAgIHBUcGNSZXFGcmFtZS0+YWN0aW9uSGVhZGVyLmFjdGlvbklEICAgID0gcmVxLkFjdGlvbi5hY3Rpb247CisgICAgcFRwY1JlcUZyYW1lLT5hY3Rpb25IZWFkZXIuZGlhbG9nVG9rZW4gPSByZXEuRGlhbG9nVG9rZW4udG9rZW47CisgICAgaWYgKCByZXEuVFBDUmVxdWVzdC5wcmVzZW50ICkKKyAgICB7CisgICAgICAgIHBUcGNSZXFGcmFtZS0+dHlwZSAgID0gRE9UMTFGX0VJRF9UUENSRVFVRVNUOworICAgICAgICBwVHBjUmVxRnJhbWUtPmxlbmd0aCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRvdDExZkxvZyggcE1hYywgTE9HVywgRkwoIiEhIVJjdiBUUEMgUmVxIG9mIGluYWxpZCB0eXBlIVxuIikgKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworCit9IC8vIEVuZCBzaXJDb252ZXJ0VHBjUmVxRnJhbWUyU3RydWN0LgorCisKK3RTaXJSZXRTdGF0dXMKK3NpckNvbnZlcnRNZWFzUmVxRnJhbWUyU3RydWN0KHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICAgICAgICAgKnBGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyTWFjTWVhc1JlcUFjdGlvbkZyYW1lIHBNZWFzUmVxRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgICAgICAgICAgICAgICAgICAgICAgIG5GcmFtZSkKK3sKKyAgICB0RG90MTFmTWVhc3VyZW1lbnRSZXF1ZXN0IG1yOworICAgIHRBTklfVTMyICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisKKyAgICAvLyBaZXJvLWluaXQgb3VyIFtvdXRdIHBhcmFtZXRlciwKKyAgICBwYWxaZXJvTWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqIClwTWVhc1JlcUZyYW1lLCBzaXplb2YodHBTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUpICk7CisKKyAgICAvLyBkZWxlZ2F0ZSB0byB0aGUgZnJhbWVzYy1nZW5lcmF0ZWQgY29kZSwKKyAgICBzdGF0dXMgPSBkb3QxMWZVbnBhY2tNZWFzdXJlbWVudFJlcXVlc3QoIHBNYWMsIHBGcmFtZSwgbkZyYW1lLCAmbXIgKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGRvdDExZkxvZyhwTWFjLCBMT0dFLCBGTCgiRmFpbGVkIHRvIHBhcnNlIGEgTWVhc3VyZW1lbnQgUmVxdWVzdCBmcmFtZSAoMHglMDh4LCAlZCBieXRlcyk6XG4iKSwKKyAgICAgICAgICAgICAgICAgIHN0YXR1cywgbkZyYW1lKTsKKyAgICAgICAgUEVMT0cyKHNpckR1bXBCdWYocE1hYywgU0lSX0RCR19NT0RVTEVfSUQsIExPRzIsIHBGcmFtZSwgbkZyYW1lKTspCisgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgfQorICAgIGVsc2UgaWYgKCBET1QxMUZfV0FSTkVEKCBzdGF0dXMgKSApCisgICAgeworICAgICAgZG90MTFmTG9nKCBwTWFjLCBMT0dXLCBGTCgiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSB1bnBhY2tpbmcgYSBNZWFzdXJlbWVudCBSZXF1ZXN0IGZyYW1lICgweCUwOHgsICVkIGJ5dGVzKTpcbiIpLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIG5GcmFtZSApOworICAgICAgICBQRUxPRzIoc2lyRHVtcEJ1ZihwTWFjLCBTSVJfREJHX01PRFVMRV9JRCwgTE9HMiwgcEZyYW1lLCBuRnJhbWUpOykKKyAgICB9CisKKyAgICAvLyAmICJ0cmFuc2xpdGVyYXRlIiBmcm9tIGEgJ3REb3QxMWZNZWFzdXJlbWVudFJlcXVlc3QnIHRvIGEKKyAgICAvLyAndHBTaXJNYWNNZWFzUmVxQWN0aW9uRnJhbWUnLi4uCisgICAgcE1lYXNSZXFGcmFtZS0+YWN0aW9uSGVhZGVyLmNhdGVnb3J5ICAgID0gbXIuQ2F0ZWdvcnkuY2F0ZWdvcnk7CisgICAgcE1lYXNSZXFGcmFtZS0+YWN0aW9uSGVhZGVyLmFjdGlvbklEICAgID0gbXIuQWN0aW9uLmFjdGlvbjsKKyAgICBwTWVhc1JlcUZyYW1lLT5hY3Rpb25IZWFkZXIuZGlhbG9nVG9rZW4gPSBtci5EaWFsb2dUb2tlbi50b2tlbjsKKworICAgIGlmICggMCA9PSBtci5udW1fTWVhc3VyZW1lbnRSZXF1ZXN0ICkKKyAgICB7CisgICAgICAgIGRvdDExZkxvZyggcE1hYywgTE9HRSwgRkwoIk1pc3NpbmcgbWFuZGF0b3J5IElFIGluIE1lYXN1cmVtZW50IFJlcXVlc3QgRnJhbWUuXG4iKSApOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKyAgICBlbHNlIGlmICggMSA8IG1yLm51bV9NZWFzdXJlbWVudFJlcXVlc3QgKQorICAgIHsKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dXLCBGTCgiV2FybmluZzogZHJvcHBpbmcgZXh0cmEgTWVhc3VyZW1lbnQgUmVxdWVzdCBJRXMhIikgKTsKKyAgICB9CisKKyAgICBwTWVhc1JlcUZyYW1lLT5tZWFzUmVxSUUudHlwZSAgICAgICAgPSBET1QxMUZfRUlEX01FQVNVUkVNRU5UUkVRVUVTVDsKKyAgICBwTWVhc1JlcUZyYW1lLT5tZWFzUmVxSUUubGVuZ3RoICAgICAgPSBET1QxMUZfSUVfTUVBU1VSRU1FTlRSRVFVRVNUX01JTl9MRU47CisgICAgcE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLm1lYXNUb2tlbiAgID0gbXIuTWVhc3VyZW1lbnRSZXF1ZXN0WzBdLm1lYXN1cmVtZW50X3Rva2VuOworICAgIHBNZWFzUmVxRnJhbWUtPm1lYXNSZXFJRS5tZWFzUmVxTW9kZSA9ICggbXIuTWVhc3VyZW1lbnRSZXF1ZXN0WzBdLnJlc2VydmVkIDw8IDMgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBtci5NZWFzdXJlbWVudFJlcXVlc3RbMF0uZW5hYmxlICAgPDwgMiApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIG1yLk1lYXN1cmVtZW50UmVxdWVzdFswXS5yZXF1ZXN0ICA8PCAxICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggbXIuTWVhc3VyZW1lbnRSZXF1ZXN0WzBdLnJlcG9ydCAvKjw8IDAqLyApOworICAgIHBNZWFzUmVxRnJhbWUtPm1lYXNSZXFJRS5tZWFzVHlwZSAgICA9IG1yLk1lYXN1cmVtZW50UmVxdWVzdFswXS5tZWFzdXJlbWVudF90eXBlOworCisgICAgcE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLm1lYXNSZXFGaWVsZC5jaGFubmVsTnVtYmVyID0gbXIuTWVhc3VyZW1lbnRSZXF1ZXN0WzBdLmNoYW5uZWxfbm87CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwTWVhc1JlcUZyYW1lLT5tZWFzUmVxSUUubWVhc1JlcUZpZWxkLm1lYXNTdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgbXIuTWVhc3VyZW1lbnRSZXF1ZXN0WzBdLm1lYXNfc3RhcnRfdGltZSwgOCApOworCisgICAgcE1lYXNSZXFGcmFtZS0+bWVhc1JlcUlFLm1lYXNSZXFGaWVsZC5tZWFzRHVyYXRpb24gPSBtci5NZWFzdXJlbWVudFJlcXVlc3RbMF0ubWVhc19kdXJhdGlvbjsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIHNpckNvbnZlcnRNZWFzUmVxRnJhbWUyU3RydWN0LgorI2VuZGlmCisKKwordm9pZAorUG9wdWxhdGVEb3QxMWZUU1BFQyh0U2lyTWFjVHNwZWNJRSAgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVRTUEVDICAqcERvdDExZikKK3sKKyAgICBwRG90MTFmLT50cmFmZmljX3R5cGUgICAgICAgICA9IHBPbGQtPnRzaW5mby50cmFmZmljLnRyYWZmaWNUeXBlOworICAgIHBEb3QxMWYtPnRzaWQgICAgICAgICAgICAgICAgID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMudHNpZDsKKyAgICBwRG90MTFmLT5kaXJlY3Rpb24gICAgICAgICAgICA9IHBPbGQtPnRzaW5mby50cmFmZmljLmRpcmVjdGlvbjsKKyAgICBwRG90MTFmLT5hY2Nlc3NfcG9saWN5ICAgICAgICA9IHBPbGQtPnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeTsKKyAgICBwRG90MTFmLT5hZ2dyZWdhdGlvbiAgICAgICAgICA9IHBPbGQtPnRzaW5mby50cmFmZmljLmFnZ3JlZ2F0aW9uOworICAgIHBEb3QxMWYtPnBzYiAgICAgICAgICAgICAgICAgID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMucHNiOworICAgIHBEb3QxMWYtPnVzZXJfcHJpb3JpdHkgICAgICAgID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMudXNlclByaW87CisgICAgcERvdDExZi0+dHNpbmZvX2Fja19wb2wgICAgICAgPSBwT2xkLT50c2luZm8udHJhZmZpYy5hY2tQb2xpY3k7CisgICAgcERvdDExZi0+c2NoZWR1bGUgICAgICAgICAgICAgPSBwT2xkLT50c2luZm8uc2NoZWR1bGUuc2NoZWR1bGU7CisgICAgLyogQXMgZGVmaW5lZCBpbiBJRUVFIDgwMi4xMS0yMDA3LCBzZWN0aW9uIDcuMy4yLjMwCisgICAgICogTm9taW5hbCBNU0RVIHNpemU6IEJpdFswOjE0XT1TaXplLCBCaXRbMTVdPUZpeGVkCisgICAgICovCisgICAgcERvdDExZi0+c2l6ZSAgICAgICAgICAgICAgICAgPSAoIHBPbGQtPm5vbU1zZHVTeiAmIDB4N2ZmZiApOworICAgIHBEb3QxMWYtPmZpeGVkICAgICAgICAgICAgICAgID0gKCBwT2xkLT5ub21Nc2R1U3ogJiAweDgwMDAgKSA/IDEgOiAwOworICAgIHBEb3QxMWYtPm1heF9tc2R1X3NpemUgICAgICAgID0gcE9sZC0+bWF4TXNkdVN6OworICAgIHBEb3QxMWYtPm1pbl9zZXJ2aWNlX2ludCAgICAgID0gcE9sZC0+bWluU3ZjSW50ZXJ2YWw7CisgICAgcERvdDExZi0+bWF4X3NlcnZpY2VfaW50ICAgICAgPSBwT2xkLT5tYXhTdmNJbnRlcnZhbDsKKyAgICBwRG90MTFmLT5pbmFjdGl2aXR5X2ludCAgICAgICA9IHBPbGQtPmluYWN0SW50ZXJ2YWw7CisgICAgcERvdDExZi0+c3VzcGVuc2lvbl9pbnQgICAgICAgPSBwT2xkLT5zdXNwZW5kSW50ZXJ2YWw7CisgICAgcERvdDExZi0+c2VydmljZV9zdGFydF90aW1lICAgPSBwT2xkLT5zdmNTdGFydFRpbWU7CisgICAgcERvdDExZi0+bWluX2RhdGFfcmF0ZSAgICAgICAgPSBwT2xkLT5taW5EYXRhUmF0ZTsKKyAgICBwRG90MTFmLT5tZWFuX2RhdGFfcmF0ZSAgICAgICA9IHBPbGQtPm1lYW5EYXRhUmF0ZTsKKyAgICBwRG90MTFmLT5wZWFrX2RhdGFfcmF0ZSAgICAgICA9IHBPbGQtPnBlYWtEYXRhUmF0ZTsKKyAgICBwRG90MTFmLT5idXJzdF9zaXplICAgICAgICAgICA9IHBPbGQtPm1heEJ1cnN0U3o7CisgICAgcERvdDExZi0+ZGVsYXlfYm91bmQgICAgICAgICAgPSBwT2xkLT5kZWxheUJvdW5kOworICAgIHBEb3QxMWYtPm1pbl9waHlfcmF0ZSAgICAgICAgID0gcE9sZC0+bWluUGh5UmF0ZTsKKyAgICBwRG90MTFmLT5zdXJwbHVzX2J3X2FsbG93YW5jZSA9IHBPbGQtPnN1cnBsdXNCdzsKKyAgICBwRG90MTFmLT5tZWRpdW1fdGltZSAgICAgICAgICA9IHBPbGQtPm1lZGl1bVRpbWU7CisKKyAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKKworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZUU1BFQy4KKwordm9pZAorUG9wdWxhdGVEb3QxMWZXTU1UU1BFQyh0U2lyTWFjVHNwZWNJRSAgICAgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdNTVRTUEVDICAqcERvdDExZikKK3sKKyAgICBwRG90MTFmLT50cmFmZmljX3R5cGUgICAgICAgICA9IHBPbGQtPnRzaW5mby50cmFmZmljLnRyYWZmaWNUeXBlOworICAgIHBEb3QxMWYtPnRzaWQgICAgICAgICAgICAgICAgID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMudHNpZDsKKyAgICBwRG90MTFmLT5kaXJlY3Rpb24gICAgICAgICAgICA9IHBPbGQtPnRzaW5mby50cmFmZmljLmRpcmVjdGlvbjsKKyAgICBwRG90MTFmLT5hY2Nlc3NfcG9saWN5ICAgICAgICA9IHBPbGQtPnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeTsKKyAgICBwRG90MTFmLT5hZ2dyZWdhdGlvbiAgICAgICAgICA9IHBPbGQtPnRzaW5mby50cmFmZmljLmFnZ3JlZ2F0aW9uOworICAgIHBEb3QxMWYtPnBzYiAgICAgICAgICAgICAgICAgID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMucHNiOworICAgIHBEb3QxMWYtPnVzZXJfcHJpb3JpdHkgICAgICAgID0gcE9sZC0+dHNpbmZvLnRyYWZmaWMudXNlclByaW87CisgICAgcERvdDExZi0+dHNpbmZvX2Fja19wb2wgICAgICAgPSBwT2xkLT50c2luZm8udHJhZmZpYy5hY2tQb2xpY3k7CisgICAgcERvdDExZi0+YnVyc3Rfc2l6ZV9kZWZuICAgICAgPSBwT2xkLT50c2luZm8udHJhZmZpYy5idXJzdFNpemVEZWZuOworICAgIC8qIEFzIGRlZmluZWQgaW4gSUVFRSA4MDIuMTEtMjAwNywgc2VjdGlvbiA3LjMuMi4zMAorICAgICAqIE5vbWluYWwgTVNEVSBzaXplOiBCaXRbMDoxNF09U2l6ZSwgQml0WzE1XT1GaXhlZAorICAgICAqLworICAgIHBEb3QxMWYtPnNpemUgICAgICAgICAgICAgICAgID0gKCBwT2xkLT5ub21Nc2R1U3ogJiAweDdmZmYgKTsKKyAgICBwRG90MTFmLT5maXhlZCAgICAgICAgICAgICAgICA9ICggcE9sZC0+bm9tTXNkdVN6ICYgMHg4MDAwICkgPyAxIDogMDsKKyAgICBwRG90MTFmLT5tYXhfbXNkdV9zaXplICAgICAgICA9IHBPbGQtPm1heE1zZHVTejsKKyAgICBwRG90MTFmLT5taW5fc2VydmljZV9pbnQgICAgICA9IHBPbGQtPm1pblN2Y0ludGVydmFsOworICAgIHBEb3QxMWYtPm1heF9zZXJ2aWNlX2ludCAgICAgID0gcE9sZC0+bWF4U3ZjSW50ZXJ2YWw7CisgICAgcERvdDExZi0+aW5hY3Rpdml0eV9pbnQgICAgICAgPSBwT2xkLT5pbmFjdEludGVydmFsOworICAgIHBEb3QxMWYtPnN1c3BlbnNpb25faW50ICAgICAgID0gcE9sZC0+c3VzcGVuZEludGVydmFsOworICAgIHBEb3QxMWYtPnNlcnZpY2Vfc3RhcnRfdGltZSAgID0gcE9sZC0+c3ZjU3RhcnRUaW1lOworICAgIHBEb3QxMWYtPm1pbl9kYXRhX3JhdGUgICAgICAgID0gcE9sZC0+bWluRGF0YVJhdGU7CisgICAgcERvdDExZi0+bWVhbl9kYXRhX3JhdGUgICAgICAgPSBwT2xkLT5tZWFuRGF0YVJhdGU7CisgICAgcERvdDExZi0+cGVha19kYXRhX3JhdGUgICAgICAgPSBwT2xkLT5wZWFrRGF0YVJhdGU7CisgICAgcERvdDExZi0+YnVyc3Rfc2l6ZSAgICAgICAgICAgPSBwT2xkLT5tYXhCdXJzdFN6OworICAgIHBEb3QxMWYtPmRlbGF5X2JvdW5kICAgICAgICAgID0gcE9sZC0+ZGVsYXlCb3VuZDsKKyAgICBwRG90MTFmLT5taW5fcGh5X3JhdGUgICAgICAgICA9IHBPbGQtPm1pblBoeVJhdGU7CisgICAgcERvdDExZi0+c3VycGx1c19id19hbGxvd2FuY2UgPSBwT2xkLT5zdXJwbHVzQnc7CisgICAgcERvdDExZi0+bWVkaXVtX3RpbWUgICAgICAgICAgPSBwT2xkLT5tZWRpdW1UaW1lOworCisgICAgcERvdDExZi0+dmVyc2lvbiA9IDE7CisgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmV01NVFNQRUMuCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCit2b2lkIFBvcHVsYXRlRG90MTFUU1JTSUUodHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0NDWFRTUlNJRSAgICAgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFQ0NYVHJhZlN0cm1SYXRlU2V0ICAqcERvdDExZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4IHJhdGVfbGVuZ3RoKQoreworICAgIHBEb3QxMWYtPnRzaWQgPSBwT2xkLT50c2lkOworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCxwRG90MTFmLT50c3JhdGVzLCBwT2xkLT5yYXRlcyxyYXRlX2xlbmd0aCk7CisgICAgcERvdDExZi0+bnVtX3RzcmF0ZXMgPSByYXRlX2xlbmd0aDsKKyAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKK30KKyNlbmRpZgorCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmVENMQVModHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgIHRTaXJUY2xhc0luZm8gICpwT2xkLAorICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUQ0xBUyAqcERvdDExZikKK3sKKyAgICBwRG90MTFmLT51c2VyX3ByaW9yaXR5ICAgPSBwT2xkLT50Y2xhcy51c2VyUHJpbzsKKyAgICBwRG90MTFmLT5jbGFzc2lmaWVyX3R5cGUgPSBwT2xkLT50Y2xhcy5jbGFzc2lmaWVyVHlwZTsKKyAgICBwRG90MTFmLT5jbGFzc2lmaWVyX21hc2sgPSBwT2xkLT50Y2xhcy5jbGFzc2lmaWVyTWFzazsKKworICAgIHN3aXRjaCAoIHBEb3QxMWYtPmNsYXNzaWZpZXJfdHlwZSApCisgICAgeworICAgIGNhc2UgU0lSX01BQ19UQ0xBU1RZUEVfRVRIRVJORVQ6CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZwRG90MTFmLT5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VOCogKSZwT2xkLT50Y2xhc1BhcmFtcy5ldGguc3JjQWRkciwgNiApOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmcERvdDExZi0+aW5mby5FdGhQYXJhbXMuZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgKCB0QU5JX1U4KiApJnBPbGQtPnRjbGFzUGFyYW1zLmV0aC5kc3RBZGRyLCA2ICk7CisgICAgICAgIHBEb3QxMWYtPmluZm8uRXRoUGFyYW1zLnR5cGUgPSBwT2xkLT50Y2xhc1BhcmFtcy5ldGgudHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTSVJfTUFDX1RDTEFTVFlQRV9UQ1BVRFBJUDoKKyAgICAgICAgcERvdDExZi0+aW5mby5JcFBhcmFtcy52ZXJzaW9uID0gcE9sZC0+dmVyc2lvbjsKKyAgICAgICAgaWYgKCBTSVJfTUFDX1RDTEFTX0lQVjQgPT0gcERvdDExZi0+aW5mby5JcFBhcmFtcy52ZXJzaW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJnBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBWNFBhcmFtcy5zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTgqIClwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnNyY0lwQWRkciwgNCApOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJnBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBWNFBhcmFtcy5kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0QU5JX1U4KiApcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5kc3RJcEFkZHIsIDQgKTsKKyAgICAgICAgICAgIHBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuc3JjX3BvcnQgID0KKyAgICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5zcmNQb3J0OworICAgICAgICAgICAgcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0X3BvcnQgPQorICAgICAgICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LmRzdFBvcnQ7CisgICAgICAgICAgICBwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1AgICAgICA9CisgICAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuZHNjcDsKKyAgICAgICAgICAgIHBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucHJvdG8gICAgID0KKyAgICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5wcm90b2NvbDsKKyAgICAgICAgICAgIHBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQgID0KKyAgICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5yc3ZkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJnBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBWNlBhcmFtcy5zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTgqIClwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LnNyY0lwQWRkciwgMTYgKTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElwVjZQYXJhbXMuZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VOCogKXBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuZHN0SXBBZGRyLCAxNiApOworICAgICAgICAgICAgcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydCAgPQorICAgICAgICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LnNyY1BvcnQ7CisgICAgICAgICAgICBwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydCA9CisgICAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuZHN0UG9ydDsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElwVjZQYXJhbXMuZmxvd19sYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VOCogKXBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuZmxvd0xhYmVsLCAzICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTSVJfTUFDX1RDTEFTVFlQRV84MDIxRFE6CisgICAgICAgIHBEb3QxMWYtPmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlID0gcE9sZC0+dGNsYXNQYXJhbXMudDgwMjFkcS50YWc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGxpbUxvZyggcE1hYywgTE9HRSwgRkwoIkJhZCBUQ0xBUyB0eXBlICVkIGluIFBvcHVsYXRlRG90MTFmVENMQVMuXG4iKSwKKyAgICAgICAgICAgICAgICBwRG90MTFmLT5jbGFzc2lmaWVyX3R5cGUgKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmVENMQVMuCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmV01NVENMQVModHBBbmlTaXJHbG9iYWwgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgIHRTaXJUY2xhc0luZm8gICAgICpwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1UQ0xBUyAqcERvdDExZikKK3sKKyAgICBwRG90MTFmLT52ZXJzaW9uICAgICAgICAgPSAxOworICAgIHBEb3QxMWYtPnVzZXJfcHJpb3JpdHkgICA9IHBPbGQtPnRjbGFzLnVzZXJQcmlvOworICAgIHBEb3QxMWYtPmNsYXNzaWZpZXJfdHlwZSA9IHBPbGQtPnRjbGFzLmNsYXNzaWZpZXJUeXBlOworICAgIHBEb3QxMWYtPmNsYXNzaWZpZXJfbWFzayA9IHBPbGQtPnRjbGFzLmNsYXNzaWZpZXJNYXNrOworCisgICAgc3dpdGNoICggcERvdDExZi0+Y2xhc3NpZmllcl90eXBlICkKKyAgICB7CisgICAgY2FzZSBTSVJfTUFDX1RDTEFTVFlQRV9FVEhFUk5FVDoKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJnBEb3QxMWYtPmluZm8uRXRoUGFyYW1zLnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCB0QU5JX1U4KiApJnBPbGQtPnRjbGFzUGFyYW1zLmV0aC5zcmNBZGRyLCA2ICk7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZwRG90MTFmLT5pbmZvLkV0aFBhcmFtcy5kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTgqICkmcE9sZC0+dGNsYXNQYXJhbXMuZXRoLmRzdEFkZHIsIDYgKTsKKyAgICAgICAgcERvdDExZi0+aW5mby5FdGhQYXJhbXMudHlwZSA9IHBPbGQtPnRjbGFzUGFyYW1zLmV0aC50eXBlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNJUl9NQUNfVENMQVNUWVBFX1RDUFVEUElQOgorICAgICAgICBwRG90MTFmLT5pbmZvLklwUGFyYW1zLnZlcnNpb24gPSBwT2xkLT52ZXJzaW9uOworICAgICAgICBpZiAoIFNJUl9NQUNfVENMQVNfSVBWNCA9PSBwRG90MTFmLT5pbmZvLklwUGFyYW1zLnZlcnNpb24gKQorICAgICAgICB7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJcFY0UGFyYW1zLnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VOCogKXBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuc3JjSXBBZGRyLCA0ICk7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJcFY0UGFyYW1zLmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRBTklfVTgqIClwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LmRzdElwQWRkciwgNCApOworICAgICAgICAgICAgcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydCAgPQorICAgICAgICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnNyY1BvcnQ7CisgICAgICAgICAgICBwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydCA9CisgICAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuZHN0UG9ydDsKKyAgICAgICAgICAgIHBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuRFNDUCAgICAgID0KKyAgICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5kc2NwOworICAgICAgICAgICAgcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90byAgICAgPQorICAgICAgICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnByb3RvY29sOworICAgICAgICAgICAgcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5yZXNlcnZlZCAgPQorICAgICAgICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnJzdmQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmcERvdDExZi0+aW5mby5JcFBhcmFtcy5wYXJhbXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJcFY2UGFyYW1zLnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICggdEFOSV9VOCogKXBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuc3JjSXBBZGRyLCAxNiApOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJnBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBWNlBhcmFtcy5kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0QU5JX1U4KiApcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni5kc3RJcEFkZHIsIDE2ICk7CisgICAgICAgICAgICBwRG90MTFmLT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNyY19wb3J0ICA9CisgICAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuc3JjUG9ydDsKKyAgICAgICAgICAgIHBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuZGVzdF9wb3J0ID0KKyAgICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni5kc3RQb3J0OworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJnBEb3QxMWYtPmluZm8uSXBQYXJhbXMucGFyYW1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBWNlBhcmFtcy5mbG93X2xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0QU5JX1U4KiApcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni5mbG93TGFiZWwsIDMgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFNJUl9NQUNfVENMQVNUWVBFXzgwMjFEUToKKyAgICAgICAgcERvdDExZi0+aW5mby5QYXJhbXM4MDIxZHEudGFnX3R5cGUgPSBwT2xkLT50Y2xhc1BhcmFtcy50ODAyMWRxLnRhZzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgbGltTG9nKCBwTWFjLCBMT0dFLCBGTCgiQmFkIFRDTEFTIHR5cGUgJWQgaW4gUG9wdWxhdGVEb3QxMWZUQ0xBUy5cbiIpLAorICAgICAgICAgICAgICAgIHBEb3QxMWYtPmNsYXNzaWZpZXJfdHlwZSApOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyBFbmQgUG9wdWxhdGVEb3QxMWZXTU1UQ0xBUy4KKworI2lmICggV05JX1BPTEFSSVNfRldfUFJPRFVDVCA9PSBBUCApCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmQ0ZQYXJhbXModHBBbmlTaXJHbG9iYWwgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmRmZDYXBhYmlsaXRpZXMgKnBDYXBzLAorICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDRlBhcmFtcyAgICAgKnBEb3QxMWYpCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgIGNmZzsKKyAgICB0U2lyUmV0U3RhdHVzIG5TaXJTdGF0dXM7CisKKyAgICBpZiAoIHBDYXBzLT5jZlBvbGxhYmxlIHx8IHBDYXBzLT5jZlBvbGxSZXEgKQorICAgIHsKKyAgICAgICAgcERvdDExZi0+Y2ZwX2NvdW50ID0gc2NoR2V0Q0ZQQ291bnQoIHBNYWMgKTsKKworICAgICAgICBDRkdfR0VUX0lOVCggblNpclN0YXR1cywgcE1hYywgV05JX0NGR19DRlBfUEVSSU9ELCBjZmcgKTsKKyAgICAgICAgcERvdDExZi0+Y2ZwX3BlcmlvZCA9ICggY2ZnICYgMHgwMDAwMDBmZiApOworCisgICAgICAgIENGR19HRVRfSU5UKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT04sIGNmZyApOworICAgICAgICBwRG90MTFmLT5jZnBfbWF4ZHVyYXRpb24gPSAoIGNmZyAmIDB4MDAwMGZmZmYgKTsKKworICAgICAgICBwRG90MTFmLT5jZnBfZHVycmVtYWluaW5nID0gc2NoR2V0Q0ZQRHVyUmVtYWluaW5nKCBwTWFjICk7CisKKyAgICAgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmQ0ZQYXJhbXMuCisKK3ZvaWQKK1BvcHVsYXRlRG90MTFmUXVpZXQodHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVF1aWV0ICpwRG90MTFmKQoreworICAgIC8vIFF1aWV0IENvdW50IC0gTnVtIFRCVFRzIHVudGlsIHN0YXJ0IG9mIHF1aWV0IGludGVydmFsCisgICAgcERvdDExZi0+Y291bnQgPSAodEFOSV9VOCkgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldENvdW50OworICAgIC8vIFF1aWV0IFBlcmlvZAorICAgIHBEb3QxMWYtPnBlcmlvZCA9IDA7CisgICAgLy8gUXVpZXQgRHVyYXRpb24gKGluIFRVJ3MpCisgICAgcERvdDExZi0+ZHVyYXRpb24gPSAoIHRBTklfVTE2ICkgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldER1cmF0aW9uX1RVOworICAgIC8vIFF1aWV0IE9mZnNldAorICAgIHBEb3QxMWYtPm9mZnNldCA9IDA7CisKKyAgICBkb3QxMWZMb2coIHBNYWMsIExPRzIsCisgICAgICAgICAgICAgICBGTCgiRmlsbGluZyBRdWlldEJTUyBJRTogJWQsIExlbiAlZCwgUUMgJTFkLCBRUCAwLCBRRCAiCisgICAgICAgICAgICAgICAgICAiJTJkKFRVKS8lMmQoVElDS1MpLCBRTyAwXG4iKSwKKyAgICAgICAgICAgICAgIFNJUl9NQUNfUVVJRVRfRUlELCBET1QxMUZfSUVfUVVJRVRfTUlOX0xFTiwKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXRDb3VudCwKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXREdXJhdGlvbl9UVSwKKyAgICAgICAgICAgICAgIHBNYWMtPmxpbS5nTGltU3BlY01nbXQucXVpZXREdXJhdGlvbiApOworCisgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisKK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmUXVpZXQuCisKK3RTaXJSZXRTdGF0dXMKK1BvcHVsYXRlRG90MTFmQVBOYW1lKHRwQW5pU2lyR2xvYmFsICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgICAgICAgICBjYXBFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVBUE5hbWUgKnBEb3QxMWYpCit7CisgICAgdEFOSV9VMzIgICAgICAgICAgIG5OYW1lOworICAgIHRTaXJSZXRTdGF0dXMgblNpclN0YXR1czsKKworICAgIENGR19HRVRfU1RSKCBuU2lyU3RhdHVzLCBwTWFjLCBXTklfQ0ZHX0FQX05PREVfTkFNRSwgcERvdDExZi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgbk5hbWUsIFNJUl9NQUNfTUFYX1NTSURfTEVOR1RIICk7CisgICAgcERvdDExZi0+bnVtX25hbWUgPSAoIHRBTklfVTggKSBuTmFtZTsKKyAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZkFQTmFtZS4KKwordm9pZAorUG9wdWxhdGVEb3QxMWZQcm9wUXVpZXRCU1ModHBBbmlTaXJHbG9iYWwgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgIGNhcHNFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQcm9wUXVpZXRCU1MgKnBEb3QxMWYpCit7CisgICAgLy8gUG9wdWxhdGUgUHJvcHJpZXRhcnkgUXVpZXQgQlNTIElFLCBPTkxZIElGIDExSCBpcyBOT1QgZW5hYmxlZCEgIElmIDExSAorICAgIC8vIElTIGVuYWJsZWQsIHRoZW4gdGhlIFF1aWV0IElFIHdpbGwgYmUgYXBwcm9wcmlhdGVseSBzZW50IGFzIHBlciB0aGUKKyAgICAvLyAxMUggc3BlYyBhbmQgaGVuY2UgbmVlZCBOT1QgYmUgc2VudCBpbiB0aGUgUHJvcHJpZXRhcnkgSUUgYXMgd2VsbAorICAgIGlmICggKCBlTElNX1FVSUVUX1JVTk5JTkcgPT0gcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldFN0YXRlICkgJiYKKyAgICAgICAgICFwTWFjLT5saW0uZ0xpbTExaEVuYWJsZSAgJiYKKyAgICAgICAgIFBST1BfQ0FQQUJJTElUWV9HRVQoIFRJVEFOLCBjYXBzRW5hYmxlICkgKQorICAgIHsKKyAgICAgICAgLy8gUXVpZXQgQ291bnQgLSBOdW0gVEJUVHMgdW50aWwgc3RhcnQgb2YgcXVpZXQgaW50ZXJ2YWwKKyAgICAgICAgcERvdDExZi0+cXVpZXRfY291bnQgPSBwTWFjLT5saW0uZ0xpbVNwZWNNZ210LnF1aWV0Q291bnQ7CisgICAgICAgIC8vIFF1aWV0IFBlcmlvZAorICAgICAgICBwRG90MTFmLT5xdWlldF9wZXJpb2QgPSAwOworICAgICAgICAvLyBRdWlldCBEdXJhdGlvbiAoaW4gVFUncykKKyAgICAgICAgcERvdDExZi0+cXVpZXRfZHVyYXRpb24gPSAoIHRBTklfVTE2ICkgcE1hYy0+bGltLmdMaW1TcGVjTWdtdC5xdWlldER1cmF0aW9uX1RVOworICAgICAgICAvLyBRdWlldCBPZmZzZXQKKyAgICAgICAgcERvdDExZi0+cXVpZXRfb2Zmc2V0ID0gMDsKKworICAgICAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKKyAgICB9Cit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZlByb3BRdWlldEJTUy4KKwordm9pZAorUG9wdWxhdGVEb3QxMWZUcmlnU3RhQmtTY2FuKHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICAgICAgICAgICAgICAgICAgICAgICBjYXBzRW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVRyaWdnZXJTdGFCZ1NjYW4gKnBEb3QxMWYpCit7CisgICAgaWYgKCBQUk9QX0NBUEFCSUxJVFlfR0VUKCBUSVRBTiwgY2Fwc0VuYWJsZSApICkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPmVuYWJsZSA9IHBNYWMtPmxpbS5nTGltVHJpZ2dlckJhY2tncm91bmRTY2FuRHVyaW5nUXVpZXRCc3M7CisgICAgICAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworICAgIH0KK30gLy8gRW5kIFBvcHVsYXRlRG90MTFmVHJpZ1N0YUJrU2Nhbi4KKworI2lmIChXTklfUE9MQVJJU19GV19QQUNLQUdFID09IEFEVkFOQ0VEKQorCit0U2lyUmV0U3RhdHVzCitQb3B1bGF0ZURvdDExZldEUyh0cEFuaVNpckdsb2JhbCAgcE1hYywKKyAgICAgICAgICAgICAgICAgIHRBTklfVTMyICAgICAgICAgICAgIGNhcEVuYWJsZSwKKyAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdEUyAgICpwRG90MTFmICkKK3sKKyAgICB0cFBFU2Vzc2lvbiBwc2Vzc2lvbkVudHJ5ID0gJnBNYWMtPmxpbS5ncFNlc3Npb25bMF07ICAvL1RCRC1SQUpFU0ggSE9XIFRPIEdFVCBzZXNzaW9uRW50cnk/Pz8/PworCisgICAgaWYgKCBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPndkc0luZm8ud2RzTGVuZ3RoICkKKyAgICB7CisgICAgICAgIGlmICggcHNlc3Npb25FbnRyeS0+cExpbVN0YXJ0QnNzUmVxLT53ZHNJbmZvLndkc0xlbmd0aCA+IDY0KQorICAgICAgICB7CisgICAgICAgICAgICBsaW1Mb2coIHBNYWMsIExPRzMsIEZMKCJXRFMgTGVuZ3RoIG92ZXJmbG93IGluIFBvcHVsYXRlRG90MTFmV0RTLiIpICk7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisKKyAgICAgICAgcERvdDExZi0+bnVtX3dkc0RhdGEgPSBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPndkc0luZm8ud2RzTGVuZ3RoOworICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRG90MTFmLT53ZHNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5LT5wTGltU3RhcnRCc3NSZXEtPndkc0luZm8ud2RzQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHBEb3QxMWYtPm51bV93ZHNEYXRhICk7CisgICAgICAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9IC8vIEVuZCBQb3B1bGF0ZURvdDExZldEUy4KKworI2VuZGlmIC8vIFdOSV9QT0xBUklTX0ZXX1BBQ0tBR0UgPT0gQURWQU5DRUQKKworI2VuZGlmIC8vIFdOSV9QT0xBUklTX0ZXX1BST0RVQ1QgPT0gQVAKKwordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZldzYyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXc2NCZWFjb24gKnBEb3QxMWYpCit7CisKKyAgICB0QU5JX1UzMiB3cHNTdGF0ZTsKKworICAgIHBEb3QxMWYtPlZlcnNpb24ucHJlc2VudCA9IDE7CisgICAgcERvdDExZi0+VmVyc2lvbi5tYWpvciA9IDB4MDE7CisgICAgcERvdDExZi0+VmVyc2lvbi5taW5vciA9IDB4MDA7CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgKHRBTklfVTE2KSBXTklfQ0ZHX1dQU19TVEFURSwgJndwc1N0YXRlKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCJGYWlsZWQgdG8gY2ZnIGdldCBpZCAlZFxuIiwgV05JX0NGR19XUFNfU1RBVEUgKTsKKworICAgIHBEb3QxMWYtPldQU1N0YXRlLnByZXNlbnQgPSAxOworICAgIHBEb3QxMWYtPldQU1N0YXRlLnN0YXRlID0gKHRBTklfVTgpIHdwc1N0YXRlOworCisgICAgcERvdDExZi0+QVBTZXR1cExvY2tlZC5wcmVzZW50ID0gMDsKKworICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyLnByZXNlbnQgPSAwOworCisgICAgcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50ID0gMDsKKworICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5wcmVzZW50ID0gMDsKKworICAgIHBEb3QxMWYtPlVVSURfRS5wcmVzZW50ID0gMDsKKworICAgIHBEb3QxMWYtPlJGQmFuZHMucHJlc2VudCA9IDA7CisKKyAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzIFBvcHVsYXRlRG90MTFmV3NjUmVnaXN0cmFySW5mbyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV3NjQmVhY29uICpwRG90MTFmKQoreworICAgIGNvbnN0IHN0cnVjdCBzTGltV3NjSWVJbmZvICpjb25zdCBwV3NjSWVJbmZvID0gJihwTWFjLT5saW0ud3NjSWVJbmZvKTsKKyAgICB0QU5JX1UzMiBkZXZpY2VwYXNzd2RJZDsKKworCisgICAgcERvdDExZi0+QVBTZXR1cExvY2tlZC5wcmVzZW50ID0gMTsKKyAgICBwRG90MTFmLT5BUFNldHVwTG9ja2VkLmZMb2NrZWQgPSBwV3NjSWVJbmZvLT5hcFNldHVwTG9ja2VkOworCisgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCA9IDE7CisgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIuc2VsZWN0ZWQgPSBwV3NjSWVJbmZvLT5zZWxlY3RlZFJlZ2lzdHJhcjsKKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCAodEFOSV9VMTYpIFdOSV9DRkdfV1BTX0RFVklDRV9QQVNTV09SRF9JRCwgJmRldmljZXBhc3N3ZElkKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCJGYWlsZWQgdG8gY2ZnIGdldCBpZCAlZFxuIiwgV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEICk7CisKKyAgICBwRG90MTFmLT5EZXZpY2VQYXNzd29yZElELnByZXNlbnQgPSAxOworICAgIHBEb3QxMWYtPkRldmljZVBhc3N3b3JkSUQuaWQgPSAodEFOSV9VMTYpIGRldmljZXBhc3N3ZElkOworCisgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQgPSAxOworICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5tZXRob2RzID0gcFdzY0llSW5mby0+c2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOworCisgICAgLy8gVVVJRF9FIGFuZCBSRiBCYW5kcyBhcmUgYXBwbGljYWJsZSBvbmx5IGZvciBkdWFsIGJhbmQgQVAKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3RTaXJSZXRTdGF0dXMgRGVQb3B1bGF0ZURvdDExZldzY1JlZ2lzdHJhckluZm8odHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV3NjQmVhY29uICpwRG90MTFmKQoreworICAgIHBEb3QxMWYtPkFQU2V0dXBMb2NrZWQucHJlc2VudCA9IDA7CisgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCA9IDA7CisgICAgcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50ID0gMDsKKyAgICBwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCA9IDA7CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3RTaXJSZXRTdGF0dXMgUG9wdWxhdGVEb3QxMWZQcm9iZVJlc1dQU0lFcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVXc2NQcm9iZVJlcyAqcERvdDExZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAKKyAgIHRTaXJXUFNQcm9iZVJzcElFICpwU2lyV1BTUHJvYmVSc3BJRTsKKworICAgcFNpcldQU1Byb2JlUnNwSUUgPSAmcHNlc3Npb25FbnRyeS0+QVBXUFNJRXMuU2lyV1BTUHJvYmVSc3BJRTsKKyAgIAorICAgIAorICAgIGlmKHBTaXJXUFNQcm9iZVJzcElFLT5GaWVsZFByZXNlbnQgJiBTSVJfV1BTX1BST0JSU1BfVkVSX1BSRVNFTlQpCisgICAgeworICAgICAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+VmVyc2lvbi5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+VmVyc2lvbi5tYWpvciA9ICh0QU5JX1U4KSAoKHBTaXJXUFNQcm9iZVJzcElFLT5WZXJzaW9uICYgMHhGMCk+PjQpOworICAgICAgICBwRG90MTFmLT5WZXJzaW9uLm1pbm9yID0gKHRBTklfVTgpIChwU2lyV1BTUHJvYmVSc3BJRS0+VmVyc2lvbiAmIDB4MEYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRG90MTFmLT5wcmVzZW50ID0gMDsKKyAgICAgICAgcERvdDExZi0+VmVyc2lvbi5wcmVzZW50ID0gMDsKKyAgICB9CisKKyAgICBpZihwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX1NUQVRFX1BSRVNFTlQpCisgICAgeworICAgICAgICAKKyAgICAgICAgcERvdDExZi0+V1BTU3RhdGUucHJlc2VudCA9IDE7CisgICAgICAgIHBEb3QxMWYtPldQU1N0YXRlLnN0YXRlID0gKHRBTklfVTgpcFNpcldQU1Byb2JlUnNwSUUtPndwc1N0YXRlOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBEb3QxMWYtPldQU1N0YXRlLnByZXNlbnQgPSAwOworICAgICAgICAKKyAgICBpZihwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX0FQU0VUVVBMT0NLX1BSRVNFTlQpCisgICAgeworICAgICAgICBwRG90MTFmLT5BUFNldHVwTG9ja2VkLnByZXNlbnQgPSAxOworICAgICAgICBwRG90MTFmLT5BUFNldHVwTG9ja2VkLmZMb2NrZWQgPSBwU2lyV1BTUHJvYmVSc3BJRS0+QVBTZXR1cExvY2tlZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwRG90MTFmLT5BUFNldHVwTG9ja2VkLnByZXNlbnQgPSAwOworICAgICAgICAKKyAgICBpZihwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX1NFTEVDVEVEUkVHSVNUUkFfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyLnByZXNlbnQgPSAxOworICAgICAgICBwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhci5zZWxlY3RlZCA9IHBTaXJXUFNQcm9iZVJzcElFLT5TZWxlY3RlZFJlZ2lzdHJhOworICAgIH0KKyAgICBlbHNlCisgICAgICAgICBwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhci5wcmVzZW50ID0gMDsKKyAgICAKKyAgICBpZihwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX0RFVklDRVBBU1NXT1JESURfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPkRldmljZVBhc3N3b3JkSUQucHJlc2VudCA9IDE7CisgICAgICAgIHBEb3QxMWYtPkRldmljZVBhc3N3b3JkSUQuaWQgPSBwU2lyV1BTUHJvYmVSc3BJRS0+RGV2aWNlUGFzc3dvcmRJRDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwRG90MTFmLT5EZXZpY2VQYXNzd29yZElELnByZXNlbnQgPSAwOworICAgICAgICAKKyAgICBpZihwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX1NFTEVDVEVEUkVHSVNUUkFDRkdNRVRIT0RfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLm1ldGhvZHMgPSBwU2lyV1BTUHJvYmVSc3BJRS0+U2VsZWN0ZWRSZWdpc3RyYUNmZ01ldGhvZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhckNvbmZpZ01ldGhvZHMucHJlc2VudCA9IDA7CisgICAgICAgIAorICAgIGlmKHBTaXJXUFNQcm9iZVJzcElFLT5GaWVsZFByZXNlbnQgJiBTSVJfV1BTX1BST0JSU1BfUkVTUE9OU0VUWVBFX1BSRVNFTlQpCisgICAgeworICAgICAgICBwRG90MTFmLT5SZXNwb25zZVR5cGUucHJlc2VudCA9IDE7CisgICAgICAgIHBEb3QxMWYtPlJlc3BvbnNlVHlwZS5yZXNUeXBlID0gcFNpcldQU1Byb2JlUnNwSUUtPlJlc3BvbnNlVHlwZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwRG90MTFmLT5SZXNwb25zZVR5cGUucHJlc2VudCA9IDA7CisgICAgICAgIAorICAgIGlmKHBTaXJXUFNQcm9iZVJzcElFLT5GaWVsZFByZXNlbnQgJiBTSVJfV1BTX1BST0JSU1BfVVVJREVfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPlVVSURfRS5wcmVzZW50ID0gMTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwRG90MTFmLT5VVUlEX0UudXVpZCwgcFNpcldQU1Byb2JlUnNwSUUtPlVVSURfRSwgV05JX0NGR19XUFNfVVVJRF9MRU4pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBEb3QxMWYtPlVVSURfRS5wcmVzZW50ID0gMDsKKyAgICAKKyAgICBpZihwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX01BTlVGQUNUVVJFX1BSRVNFTlQpCisgICAgeworICAgICAgICBwRG90MTFmLT5NYW51ZmFjdHVyZXIucHJlc2VudCA9IDE7CisgICAgICAgIHBEb3QxMWYtPk1hbnVmYWN0dXJlci5udW1fbmFtZSA9IHBTaXJXUFNQcm9iZVJzcElFLT5NYW51ZmFjdHVyZS5udW1fbmFtZTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBwRG90MTFmLT5NYW51ZmFjdHVyZXIubmFtZSwgcFNpcldQU1Byb2JlUnNwSUUtPk1hbnVmYWN0dXJlLm5hbWUsIHBTaXJXUFNQcm9iZVJzcElFLT5NYW51ZmFjdHVyZS5udW1fbmFtZSk7CisgICAgfSAKKyAgICBlbHNlCisgICAgICAgIHBEb3QxMWYtPk1hbnVmYWN0dXJlci5wcmVzZW50ID0gMDsKKyAgICAgICAgCisgICAgaWYocFNpcldQU1Byb2JlUnNwSUUtPkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9NT0RFTE5VTUJFUl9QUkVTRU5UKQorICAgIHsKKyAgICAgICAgcERvdDExZi0+TW9kZWxOYW1lLnByZXNlbnQgPSAxOworICAgICAgICBwRG90MTFmLT5Nb2RlbE5hbWUubnVtX3RleHQgPSBwU2lyV1BTUHJvYmVSc3BJRS0+TW9kZWxOYW1lLm51bV90ZXh0OworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBEb3QxMWYtPk1vZGVsTmFtZS50ZXh0LCBwU2lyV1BTUHJvYmVSc3BJRS0+TW9kZWxOYW1lLnRleHQsIHBEb3QxMWYtPk1vZGVsTmFtZS5udW1fdGV4dCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHBEb3QxMWYtPk1vZGVsTmFtZS5wcmVzZW50ID0gMDsKKyAgICAKKyAgICBpZihwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX01PREVMTlVNQkVSX1BSRVNFTlQpCisgICAgeworICAgICAgICBwRG90MTFmLT5Nb2RlbE51bWJlci5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+TW9kZWxOdW1iZXIubnVtX3RleHQgPSBwU2lyV1BTUHJvYmVSc3BJRS0+TW9kZWxOdW1iZXIubnVtX3RleHQ7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcERvdDExZi0+TW9kZWxOdW1iZXIudGV4dCwgcFNpcldQU1Byb2JlUnNwSUUtPk1vZGVsTnVtYmVyLnRleHQsIHBEb3QxMWYtPk1vZGVsTnVtYmVyLm51bV90ZXh0KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwRG90MTFmLT5Nb2RlbE51bWJlci5wcmVzZW50ID0gMDsKKyAgICAKKyAgICBpZihwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX1NFUklBTE5VTUJFUl9QUkVTRU5UKQorICAgIHsKKyAgICAgICAgcERvdDExZi0+U2VyaWFsTnVtYmVyLnByZXNlbnQgPSAxOworICAgICAgICBwRG90MTFmLT5TZXJpYWxOdW1iZXIubnVtX3RleHQgPSBwU2lyV1BTUHJvYmVSc3BJRS0+U2VyaWFsTnVtYmVyLm51bV90ZXh0OworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBEb3QxMWYtPlNlcmlhbE51bWJlci50ZXh0LCBwU2lyV1BTUHJvYmVSc3BJRS0+U2VyaWFsTnVtYmVyLnRleHQsIHBEb3QxMWYtPlNlcmlhbE51bWJlci5udW1fdGV4dCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcERvdDExZi0+U2VyaWFsTnVtYmVyLnByZXNlbnQgPSAwOworICAgIAorICAgIGlmKHBTaXJXUFNQcm9iZVJzcElFLT5GaWVsZFByZXNlbnQgJiBTSVJfV1BTX1BST0JSU1BfUFJJTUFSWURFVklDRVRZUEVfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPlByaW1hcnlEZXZpY2VUeXBlLnByZXNlbnQgPSAxOworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBEb3QxMWYtPlByaW1hcnlEZXZpY2VUeXBlLm91aSwgcFNpcldQU1Byb2JlUnNwSUUtPlByaW1hcnlEZXZpY2VPVUksIHNpemVvZihwU2lyV1BTUHJvYmVSc3BJRS0+UHJpbWFyeURldmljZU9VSSkpOyAKKyAgICAgICAgcERvdDExZi0+UHJpbWFyeURldmljZVR5cGUucHJpbWFyeV9jYXRlZ29yeSA9ICh0QU5JX1UxNilwU2lyV1BTUHJvYmVSc3BJRS0+UHJpbWFyeURldmljZUNhdGVnb3J5OworICAgICAgICBwRG90MTFmLT5QcmltYXJ5RGV2aWNlVHlwZS5zdWJfY2F0ZWdvcnkgPSAodEFOSV9VMTYpcFNpcldQU1Byb2JlUnNwSUUtPkRldmljZVN1YkNhdGVnb3J5OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBEb3QxMWYtPlByaW1hcnlEZXZpY2VUeXBlLnByZXNlbnQgPSAwOworICAgIAorICAgIGlmKHBTaXJXUFNQcm9iZVJzcElFLT5GaWVsZFByZXNlbnQgJiBTSVJfV1BTX1BST0JSU1BfREVWSUNFTkFNRV9QUkVTRU5UKQorICAgIHsKKyAgICAgICAgcERvdDExZi0+RGV2aWNlTmFtZS5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+RGV2aWNlTmFtZS5udW1fdGV4dCA9IHBTaXJXUFNQcm9iZVJzcElFLT5EZXZpY2VOYW1lLm51bV90ZXh0OworICAgICAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsIHBEb3QxMWYtPkRldmljZU5hbWUudGV4dCwgcFNpcldQU1Byb2JlUnNwSUUtPkRldmljZU5hbWUudGV4dCwgcERvdDExZi0+RGV2aWNlTmFtZS5udW1fdGV4dCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcERvdDExZi0+RGV2aWNlTmFtZS5wcmVzZW50ID0gMDsKKyAgICAKKyAgICBpZihwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX0NPTkZJR01FVEhPRFNfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPkNvbmZpZ01ldGhvZHMucHJlc2VudCA9IDE7CisgICAgICAgIHBEb3QxMWYtPkNvbmZpZ01ldGhvZHMubWV0aG9kcyA9IHBTaXJXUFNQcm9iZVJzcElFLT5Db25maWdNZXRob2Q7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcERvdDExZi0+Q29uZmlnTWV0aG9kcy5wcmVzZW50ID0gMDsKKyAgICAKKyAgICAKKyAgICBpZihwU2lyV1BTUHJvYmVSc3BJRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19QUk9CUlNQX1JGX0JBTkRTX1BSRVNFTlQpCisgICAgeworICAgICAgICBwRG90MTFmLT5SRkJhbmRzLnByZXNlbnQgPSAxOworICAgICAgICBwRG90MTFmLT5SRkJhbmRzLmJhbmRzID0gcFNpcldQU1Byb2JlUnNwSUUtPlJGQmFuZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgIHBEb3QxMWYtPlJGQmFuZHMucHJlc2VudCA9IDA7ICAgICAgCisgICAgICAgCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KK3RTaXJSZXRTdGF0dXMgUG9wdWxhdGVEb3QxMWZBc3NvY1Jlc1dQU0lFcyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVXc2NBc3NvY1JlcyAqcERvdDExZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAgIHRTaXJXUFNQcm9iZVJzcElFICpwU2lyV1BTUHJvYmVSc3BJRTsKKworICAgcFNpcldQU1Byb2JlUnNwSUUgPSAmcHNlc3Npb25FbnRyeS0+QVBXUFNJRXMuU2lyV1BTUHJvYmVSc3BJRTsKKyAgIAorICAgIGlmKHBTaXJXUFNQcm9iZVJzcElFLT5GaWVsZFByZXNlbnQgJiBTSVJfV1BTX1BST0JSU1BfVkVSX1BSRVNFTlQpCisgICAgeworICAgICAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+VmVyc2lvbi5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+VmVyc2lvbi5tYWpvciA9ICh0QU5JX1U4KSAoKHBTaXJXUFNQcm9iZVJzcElFLT5WZXJzaW9uICYgMHhGMCk+PjQpOworICAgICAgICBwRG90MTFmLT5WZXJzaW9uLm1pbm9yID0gKHRBTklfVTgpIChwU2lyV1BTUHJvYmVSc3BJRS0+VmVyc2lvbiAmIDB4MEYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRG90MTFmLT5wcmVzZW50ID0gMDsKKyAgICAgICAgcERvdDExZi0+VmVyc2lvbi5wcmVzZW50ID0gMDsKKyAgICB9CisgICAgCisgICAgaWYocFNpcldQU1Byb2JlUnNwSUUtPkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9SRVNQT05TRVRZUEVfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPlJlc3BvbnNlVHlwZS5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+UmVzcG9uc2VUeXBlLnJlc1R5cGUgPSBwU2lyV1BTUHJvYmVSc3BJRS0+UmVzcG9uc2VUeXBlOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBEb3QxMWYtPlJlc3BvbnNlVHlwZS5wcmVzZW50ID0gMDsgICAgCisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzIFBvcHVsYXRlRG90MTFmQmVhY29uV1BTSUVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRVdzY0JlYWNvbiAqcERvdDExZiwgdHBQRVNlc3Npb24gcHNlc3Npb25FbnRyeSkKK3sKKyAKKyAgIHRTaXJXUFNCZWFjb25JRSAqcFNpcldQU0JlYWNvbklFOworCisgICBwU2lyV1BTQmVhY29uSUUgPSAmcHNlc3Npb25FbnRyeS0+QVBXUFNJRXMuU2lyV1BTQmVhY29uSUU7CisgICAKKyAgICAKKyAgICBpZihwU2lyV1BTQmVhY29uSUUtPkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfUFJPQlJTUF9WRVJfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworICAgICAgICBwRG90MTFmLT5WZXJzaW9uLnByZXNlbnQgPSAxOworICAgICAgICBwRG90MTFmLT5WZXJzaW9uLm1ham9yID0gKHRBTklfVTgpICgocFNpcldQU0JlYWNvbklFLT5WZXJzaW9uICYgMHhGMCk+PjQpOworICAgICAgICBwRG90MTFmLT5WZXJzaW9uLm1pbm9yID0gKHRBTklfVTgpIChwU2lyV1BTQmVhY29uSUUtPlZlcnNpb24gJiAweDBGKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcERvdDExZi0+cHJlc2VudCA9IDA7CisgICAgICAgIHBEb3QxMWYtPlZlcnNpb24ucHJlc2VudCA9IDA7CisgICAgfQorICAgIAorICAgIGlmKHBTaXJXUFNCZWFjb25JRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19CRUFDT05fU1RBVEVfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIAorICAgICAgICBwRG90MTFmLT5XUFNTdGF0ZS5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+V1BTU3RhdGUuc3RhdGUgPSAodEFOSV9VOClwU2lyV1BTQmVhY29uSUUtPndwc1N0YXRlOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBEb3QxMWYtPldQU1N0YXRlLnByZXNlbnQgPSAwOworICAgICAgICAKKyAgICBpZihwU2lyV1BTQmVhY29uSUUtPkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfQkVBQ09OX0FQU0VUVVBMT0NLX1BSRVNFTlQpCisgICAgeworICAgICAgICBwRG90MTFmLT5BUFNldHVwTG9ja2VkLnByZXNlbnQgPSAxOworICAgICAgICBwRG90MTFmLT5BUFNldHVwTG9ja2VkLmZMb2NrZWQgPSBwU2lyV1BTQmVhY29uSUUtPkFQU2V0dXBMb2NrZWQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcERvdDExZi0+QVBTZXR1cExvY2tlZC5wcmVzZW50ID0gMDsKKyAgICAgICAgCisgICAgaWYocFNpcldQU0JlYWNvbklFLT5GaWVsZFByZXNlbnQgJiBTSVJfV1BTX0JFQUNPTl9TRUxFQ1RFRFJFR0lTVFJBX1BSRVNFTlQpCisgICAgeworICAgICAgICBwRG90MTFmLT5TZWxlY3RlZFJlZ2lzdHJhci5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIuc2VsZWN0ZWQgPSBwU2lyV1BTQmVhY29uSUUtPlNlbGVjdGVkUmVnaXN0cmE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyLnByZXNlbnQgPSAwOworICAgIAorICAgIGlmKHBTaXJXUFNCZWFjb25JRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19CRUFDT05fREVWSUNFUEFTU1dPUkRJRF9QUkVTRU5UKQorICAgIHsKKyAgICAgICAgcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+RGV2aWNlUGFzc3dvcmRJRC5pZCA9IHBTaXJXUFNCZWFjb25JRS0+RGV2aWNlUGFzc3dvcmRJRDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwRG90MTFmLT5EZXZpY2VQYXNzd29yZElELnByZXNlbnQgPSAwOworICAgICAgICAKKyAgICBpZihwU2lyV1BTQmVhY29uSUUtPkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfQkVBQ09OX1NFTEVDVEVEUkVHSVNUUkFDRkdNRVRIT0RfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLm1ldGhvZHMgPSBwU2lyV1BTQmVhY29uSUUtPlNlbGVjdGVkUmVnaXN0cmFDZmdNZXRob2Q7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQgPSAwOworICAgICAgICAKKyAgICBpZihwU2lyV1BTQmVhY29uSUUtPkZpZWxkUHJlc2VudCAmIFNJUl9XUFNfQkVBQ09OX1VVSURFX1BSRVNFTlQpCisgICAgeworICAgICAgICBwRG90MTFmLT5VVUlEX0UucHJlc2VudCA9IDE7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgcERvdDExZi0+VVVJRF9FLnV1aWQsIHBTaXJXUFNCZWFjb25JRS0+VVVJRF9FLCBXTklfQ0ZHX1dQU19VVUlEX0xFTik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcERvdDExZi0+VVVJRF9FLnByZXNlbnQgPSAwOworICAgIAorICAgICAgIAorICAgIGlmKHBTaXJXUFNCZWFjb25JRS0+RmllbGRQcmVzZW50ICYgU0lSX1dQU19CRUFDT05fUkZfQkFORFNfUFJFU0VOVCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPlJGQmFuZHMucHJlc2VudCA9IDE7CisgICAgICAgIHBEb3QxMWYtPlJGQmFuZHMuYmFuZHMgPSBwU2lyV1BTQmVhY29uSUUtPlJGQmFuZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgIHBEb3QxMWYtPlJGQmFuZHMucHJlc2VudCA9IDA7ICAgICAgCisgICAgICAgCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKyNlbmRpZgordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZldzY0luUHJvYmVSZXModHBBbmlTaXJHbG9iYWwgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdzY1Byb2JlUmVzICpwRG90MTFmKQoreworICAgIHRBTklfVTMyIGNmZ01ldGhvZHM7CisgICAgdEFOSV9VMzIgY2ZnU3RyTGVuOworICAgIHRBTklfVTMyIHZhbDsKKyAgICB0QU5JX1UzMiB3cHNWZXJzaW9uLCB3cHNTdGF0ZTsKKworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsICh0QU5JX1UxNikgV05JX0NGR19XUFNfVkVSU0lPTiwgJndwc1ZlcnNpb24pICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIkZhaWxlZCB0byBjZmcgZ2V0IGlkICVkXG4iLCBXTklfQ0ZHX1dQU19WRVJTSU9OICk7CisKKyAgICBwRG90MTFmLT5WZXJzaW9uLnByZXNlbnQgPSAxOworICAgIHBEb3QxMWYtPlZlcnNpb24ubWFqb3IgPSAodEFOSV9VOCkgKCh3cHNWZXJzaW9uICYgMHhGMCk+PjQpOworICAgIHBEb3QxMWYtPlZlcnNpb24ubWlub3IgPSAodEFOSV9VOCkgKHdwc1ZlcnNpb24gJiAweDBGKTsKKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCAodEFOSV9VMTYpIFdOSV9DRkdfV1BTX1NUQVRFLCAmd3BzU3RhdGUpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIkZhaWxlZCB0byBjZmcgZ2V0IGlkICVkXG4iLCBXTklfQ0ZHX1dQU19TVEFURSApOworCisgICAgcERvdDExZi0+V1BTU3RhdGUucHJlc2VudCA9IDE7CisgICAgcERvdDExZi0+V1BTU3RhdGUuc3RhdGUgPSAodEFOSV9VOCkgd3BzU3RhdGU7CisKKyAgICBwRG90MTFmLT5BUFNldHVwTG9ja2VkLnByZXNlbnQgPSAwOworCisgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXIucHJlc2VudCA9IDA7CisKKyAgICBwRG90MTFmLT5EZXZpY2VQYXNzd29yZElELnByZXNlbnQgPSAwOworCisgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQgPSAwOworCisgICAgcERvdDExZi0+UmVzcG9uc2VUeXBlLnByZXNlbnQgPSAxOworICAgIGlmICgocE1hYy0+bGltLndzY0llSW5mby5yZXFUeXBlID09IFJFUV9UWVBFX1JFR0lTVFJBUikgfHwKKyAgICAgICAgKHBNYWMtPmxpbS53c2NJZUluZm8ucmVxVHlwZSA9PSBSRVFfVFlQRV9XTEFOX01BTkFHRVJfUkVHSVNUUkFSKSl7CisgICAgICAgIHBEb3QxMWYtPlJlc3BvbnNlVHlwZS5yZXNUeXBlID0gUkVTUF9UWVBFX0VOUk9MTEVFX09QRU5fODAyMVg7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgICBwRG90MTFmLT5SZXNwb25zZVR5cGUucmVzVHlwZSA9IFJFU1BfVFlQRV9BUDsKKyAgICB9CisKKyAgICAvKiBVVUlEIGlzIGEgMTYgYnl0ZSBsb25nIGJpbmFyeS4gU3RpbGwgdXNlIHdsYW5fY2ZnR2V0U3RyIHRvIGdldCBpdC4gKi8KKyAgICBwRG90MTFmLT5VVUlEX0UucHJlc2VudCA9IDE7CisgICAgY2ZnU3RyTGVuID0gV05JX0NGR19XUFNfVVVJRF9MRU47CisgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsCisgICAgICAgICAgICAgICAgICBXTklfQ0ZHX1dQU19VVUlELAorICAgICAgICAgICAgICAgICAgcERvdDExZi0+VVVJRF9FLnV1aWQsCisgICAgICAgICAgICAgICAgICAmY2ZnU3RyTGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICAqKHBEb3QxMWYtPlVVSURfRS51dWlkKSA9ICdcMCc7CisgICAgfQorCisgICAgcERvdDExZi0+TWFudWZhY3R1cmVyLnByZXNlbnQgPSAxOworICAgIGNmZ1N0ckxlbiA9IFdOSV9DRkdfTUFOVUZBQ1RVUkVSX05BTUVfTEVOIC0gMTsKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywKKyAgICAgICAgICAgICAgICAgIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX05BTUUsCisgICAgICAgICAgICAgICAgICBwRG90MTFmLT5NYW51ZmFjdHVyZXIubmFtZSwKKyAgICAgICAgICAgICAgICAgICZjZmdTdHJMZW4pICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPk1hbnVmYWN0dXJlci5udW1fbmFtZSA9IDA7CisgICAgICAgICoocERvdDExZi0+TWFudWZhY3R1cmVyLm5hbWUpID0gJ1wwJzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcERvdDExZi0+TWFudWZhY3R1cmVyLm51bV9uYW1lID0gKHRBTklfVTgpIChjZmdTdHJMZW4gJiAweDAwMDAwMEZGKTsKKyAgICAgICAgcERvdDExZi0+TWFudWZhY3R1cmVyLm5hbWVbY2ZnU3RyTGVuXSA9ICdcMCc7CisgICAgfQorCisgICAgcERvdDExZi0+TW9kZWxOYW1lLnByZXNlbnQgPSAxOworICAgIGNmZ1N0ckxlbiA9IFdOSV9DRkdfTU9ERUxfTkFNRV9MRU4gLSAxOworICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLAorICAgICAgICAgICAgICAgICAgV05JX0NGR19NT0RFTF9OQU1FLAorICAgICAgICAgICAgICAgICAgcERvdDExZi0+TW9kZWxOYW1lLnRleHQsCisgICAgICAgICAgICAgICAgICAmY2ZnU3RyTGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBwRG90MTFmLT5Nb2RlbE5hbWUubnVtX3RleHQgPSAwOworICAgICAgICAqKHBEb3QxMWYtPk1vZGVsTmFtZS50ZXh0KSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPk1vZGVsTmFtZS5udW1fdGV4dCA9ICh0QU5JX1U4KSAoY2ZnU3RyTGVuICYgMHgwMDAwMDBGRik7CisgICAgICAgIHBEb3QxMWYtPk1vZGVsTmFtZS50ZXh0W2NmZ1N0ckxlbl0gPSAnXDAnOworICAgIH0KKworICAgIHBEb3QxMWYtPk1vZGVsTnVtYmVyLnByZXNlbnQgPSAxOworICAgIGNmZ1N0ckxlbiA9IFdOSV9DRkdfTU9ERUxfTlVNQkVSX0xFTiAtIDE7CisgICAgaWYgKHdsYW5fY2ZnR2V0U3RyKHBNYWMsCisgICAgICAgICAgICAgICAgICBXTklfQ0ZHX01PREVMX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgIHBEb3QxMWYtPk1vZGVsTnVtYmVyLnRleHQsCisgICAgICAgICAgICAgICAgICAmY2ZnU3RyTGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBwRG90MTFmLT5Nb2RlbE51bWJlci5udW1fdGV4dCA9IDA7CisgICAgICAgICoocERvdDExZi0+TW9kZWxOdW1iZXIudGV4dCkgPSAnXDAnOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRG90MTFmLT5Nb2RlbE51bWJlci5udW1fdGV4dCA9ICh0QU5JX1U4KSAoY2ZnU3RyTGVuICYgMHgwMDAwMDBGRik7CisgICAgICAgIHBEb3QxMWYtPk1vZGVsTnVtYmVyLnRleHRbY2ZnU3RyTGVuXSA9ICdcMCc7CisgICAgfQorCisgICAgcERvdDExZi0+U2VyaWFsTnVtYmVyLnByZXNlbnQgPSAxOworICAgIGNmZ1N0ckxlbiA9IFdOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfVkVSU0lPTl9MRU4gLSAxOworICAgIGlmICh3bGFuX2NmZ0dldFN0cihwTWFjLAorICAgICAgICAgICAgICAgICAgV05JX0NGR19NQU5VRkFDVFVSRVJfUFJPRFVDVF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgcERvdDExZi0+U2VyaWFsTnVtYmVyLnRleHQsCisgICAgICAgICAgICAgICAgICAmY2ZnU3RyTGVuKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBwRG90MTFmLT5TZXJpYWxOdW1iZXIubnVtX3RleHQgPSAwOworICAgICAgICAqKHBEb3QxMWYtPlNlcmlhbE51bWJlci50ZXh0KSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPlNlcmlhbE51bWJlci5udW1fdGV4dCA9ICh0QU5JX1U4KSAoY2ZnU3RyTGVuICYgMHgwMDAwMDBGRik7CisgICAgICAgIHBEb3QxMWYtPlNlcmlhbE51bWJlci50ZXh0W2NmZ1N0ckxlbl0gPSAnXDAnOworICAgIH0KKworICAgIHBEb3QxMWYtPlByaW1hcnlEZXZpY2VUeXBlLnByZXNlbnQgPSAxOworCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfV1BTX1BSSU1BUllfREVWSUNFX0NBVEVHT1JZLCAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCBGTCgiY2ZnIGdldCBwcmltIGRldmljZSBjYXRlZ29yeSBmYWlsZWRcbiIpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgIHBEb3QxMWYtPlByaW1hcnlEZXZpY2VUeXBlLnByaW1hcnlfY2F0ZWdvcnkgPSAodEFOSV9VMTYpIHZhbDsKKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1dQU19QSU1BUllfREVWSUNFX09VSSwgJnZhbCkgIT0gZVNJUl9TVUNDRVNTKQorICAgIHsKKyAgICAgICBsaW1Mb2cocE1hYywgTE9HUCwgRkwoImNmZyBnZXQgcHJpbSBkZXZpY2UgT1VJIGZhaWxlZFxuIikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICoocERvdDExZi0+UHJpbWFyeURldmljZVR5cGUub3VpKSA9ICh0QU5JX1U4KSgodmFsID4+IDI0KSYgMHhmZik7CisgICAgICAgKihwRG90MTFmLT5QcmltYXJ5RGV2aWNlVHlwZS5vdWkrMSkgPSAodEFOSV9VOCkoKHZhbCA+PiAxNikmIDB4ZmYpOworICAgICAgICoocERvdDExZi0+UHJpbWFyeURldmljZVR5cGUub3VpKzIpID0gKHRBTklfVTgpKCh2YWwgPj4gOCkmIDB4ZmYpOworICAgICAgICoocERvdDExZi0+UHJpbWFyeURldmljZVR5cGUub3VpKzMpID0gKHRBTklfVTgpKCh2YWwgJiAweGZmKSk7CisgICAgfQorCisgICAgaWYgKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfV1BTX0RFVklDRV9TVUJfQ0FURUdPUlksICZ2YWwpICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgbGltTG9nKHBNYWMsIExPR1AsIEZMKCJjZmcgZ2V0IHByaW0gZGV2aWNlIHN1YiBjYXRlZ29yeSBmYWlsZWRcbiIpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgIHBEb3QxMWYtPlByaW1hcnlEZXZpY2VUeXBlLnN1Yl9jYXRlZ29yeSA9ICh0QU5JX1UxNikgdmFsOworCisgICAgcERvdDExZi0+RGV2aWNlTmFtZS5wcmVzZW50ID0gMTsKKyAgICBjZmdTdHJMZW4gPSBXTklfQ0ZHX01BTlVGQUNUVVJFUl9QUk9EVUNUX05BTUVfTEVOIC0gMTsKKyAgICBpZiAod2xhbl9jZmdHZXRTdHIocE1hYywKKyAgICAgICAgICAgICAgICAgIFdOSV9DRkdfTUFOVUZBQ1RVUkVSX1BST0RVQ1RfTkFNRSwKKyAgICAgICAgICAgICAgICAgIHBEb3QxMWYtPkRldmljZU5hbWUudGV4dCwKKyAgICAgICAgICAgICAgICAgICZjZmdTdHJMZW4pICE9IGVTSVJfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPkRldmljZU5hbWUubnVtX3RleHQgPSAwOworICAgICAgICAqKHBEb3QxMWYtPkRldmljZU5hbWUudGV4dCkgPSAnXDAnOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRG90MTFmLT5EZXZpY2VOYW1lLm51bV90ZXh0ID0gKHRBTklfVTgpIChjZmdTdHJMZW4gJiAweDAwMDAwMEZGKTsKKyAgICAgICAgcERvdDExZi0+RGV2aWNlTmFtZS50ZXh0W2NmZ1N0ckxlbl0gPSAnXDAnOworICAgIH0KKworICAgIGlmICh3bGFuX2NmZ0dldEludChwTWFjLAorICAgICAgICAgICAgICAgICAgV05JX0NGR19XUFNfQ0ZHX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICZjZmdNZXRob2RzKSAhPSBlU0lSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBwRG90MTFmLT5Db25maWdNZXRob2RzLnByZXNlbnQgPSAwOworICAgICAgICBwRG90MTFmLT5Db25maWdNZXRob2RzLm1ldGhvZHMgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRG90MTFmLT5Db25maWdNZXRob2RzLnByZXNlbnQgPSAxOworICAgICAgICBwRG90MTFmLT5Db25maWdNZXRob2RzLm1ldGhvZHMgPSAodEFOSV9VMTYpIChjZmdNZXRob2RzICYgMHgwMDAwRkZGRik7CisgICAgfQorCisgICAgcERvdDExZi0+UkZCYW5kcy5wcmVzZW50ID0gMDsKKworICAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3RTaXJSZXRTdGF0dXMgUG9wdWxhdGVEb3QxMWZXc2NSZWdpc3RyYXJJbmZvSW5Qcm9iZVJlcyh0cEFuaVNpckdsb2JhbCBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdzY1Byb2JlUmVzICpwRG90MTFmKQoreworICAgIGNvbnN0IHN0cnVjdCBzTGltV3NjSWVJbmZvICpjb25zdCBwV3NjSWVJbmZvID0gJihwTWFjLT5saW0ud3NjSWVJbmZvKTsKKyAgICB0QU5JX1UzMiBkZXZpY2VwYXNzd2RJZDsKKworICAgIHBEb3QxMWYtPkFQU2V0dXBMb2NrZWQucHJlc2VudCA9IDE7CisgICAgcERvdDExZi0+QVBTZXR1cExvY2tlZC5mTG9ja2VkID0gcFdzY0llSW5mby0+YXBTZXR1cExvY2tlZDsKKworICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyLnByZXNlbnQgPSAxOworICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyLnNlbGVjdGVkID0gcFdzY0llSW5mby0+c2VsZWN0ZWRSZWdpc3RyYXI7CisKKyAgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgKHRBTklfVTE2KSBXTklfQ0ZHX1dQU19ERVZJQ0VfUEFTU1dPUkRfSUQsICZkZXZpY2VwYXNzd2RJZCkgIT0gZVNJUl9TVUNDRVNTKQorICAgICAgIGxpbUxvZyhwTWFjLCBMT0dQLCJGYWlsZWQgdG8gY2ZnIGdldCBpZCAlZFxuIiwgV05JX0NGR19XUFNfREVWSUNFX1BBU1NXT1JEX0lEICk7CisKKyAgICBwRG90MTFmLT5EZXZpY2VQYXNzd29yZElELnByZXNlbnQgPSAxOworICAgIHBEb3QxMWYtPkRldmljZVBhc3N3b3JkSUQuaWQgPSAodEFOSV9VMTYpIGRldmljZXBhc3N3ZElkOworCisgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQgPSAxOworICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyQ29uZmlnTWV0aG9kcy5tZXRob2RzID0gcFdzY0llSW5mby0+c2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzOworCisgICAgLy8gVVVJRF9FIGFuZCBSRiBCYW5kcyBhcmUgYXBwbGljYWJsZSBvbmx5IGZvciBkdWFsIGJhbmQgQVAKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3RTaXJSZXRTdGF0dXMgRGVQb3B1bGF0ZURvdDExZldzY1JlZ2lzdHJhckluZm9JblByb2JlUmVzKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXc2NQcm9iZVJlcyAqcERvdDExZikKK3sKKyAgICBwRG90MTFmLT5BUFNldHVwTG9ja2VkLnByZXNlbnQgPSAwOworICAgIHBEb3QxMWYtPlNlbGVjdGVkUmVnaXN0cmFyLnByZXNlbnQgPSAwOworICAgIHBEb3QxMWYtPkRldmljZVBhc3N3b3JkSUQucHJlc2VudCA9IDA7CisgICAgcERvdDExZi0+U2VsZWN0ZWRSZWdpc3RyYXJDb25maWdNZXRob2RzLnByZXNlbnQgPSAwOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZkFzc29jUmVzV3NjSUUodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXc2NBc3NvY1JlcyAqcERvdDExZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cFNpckFzc29jUmVxIHBSY3ZkQXNzb2NSZXEpCit7CisgICAgdERvdDExZklFV3NjQXNzb2NSZXEgcGFyc2VkV3NjQXNzb2NSZXEgPSB7IDAsIH07CisgICAgdEFOSV9VOCAgICAgICAgICp3c2NJZTsKKyAgICAKKworICAgIHdzY0llID0gbGltR2V0V3NjSUVQdHIocE1hYywgcFJjdmRBc3NvY1JlcS0+YWRkSUUuYWRkSUVkYXRhLCBwUmN2ZEFzc29jUmVxLT5hZGRJRS5sZW5ndGgpOworICAgIGlmKHdzY0llICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyByZXRyZWl2ZSBXU0MgSUUgZnJvbSBnaXZlbiBBc3NvY1JlcSAKKyAgICAgICAgZG90MTFmVW5wYWNrSWVXc2NBc3NvY1JlcSggcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzY0llICsgMiArIDQsICAvLyBFSUQsIGxlbmd0aCwgT1VJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2NJZVsgMSBdIC0gNCwgLy8gbGVuZ3RoIHdpdGhvdXQgT1VJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2VkV3NjQXNzb2NSZXEgKTsKKyAgICAgICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisgICAgICAgIC8vIHZlcnNpb24gaGFzIHRvIGJlIDB4MTAKKyAgICAgICAgcERvdDExZi0+VmVyc2lvbi5wcmVzZW50ID0gMTsKKyAgICAgICAgcERvdDExZi0+VmVyc2lvbi5tYWpvciA9IDB4MTsKKyAgICAgICAgcERvdDExZi0+VmVyc2lvbi5taW5vciA9IDB4MDsKKworICAgICAgICBwRG90MTFmLT5SZXNwb25zZVR5cGUucHJlc2VudCA9IDE7CisgICAgICAgIAorICAgICAgICBpZiAoKHBhcnNlZFdzY0Fzc29jUmVxLlJlcXVlc3RUeXBlLnJlcVR5cGUgPT0gUkVRX1RZUEVfUkVHSVNUUkFSKSB8fAorICAgICAgICAgICAgKHBhcnNlZFdzY0Fzc29jUmVxLlJlcXVlc3RUeXBlLnJlcVR5cGUgPT0gUkVRX1RZUEVfV0xBTl9NQU5BR0VSX1JFR0lTVFJBUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEb3QxMWYtPlJlc3BvbnNlVHlwZS5yZXNUeXBlID0gUkVTUF9UWVBFX0VOUk9MTEVFX09QRU5fODAyMVg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgcERvdDExZi0+UmVzcG9uc2VUeXBlLnJlc1R5cGUgPSBSRVNQX1RZUEVfQVA7CisgICAgICAgIH0KKyAgICAgICAgLy8gVmVyc2lvbiBpbmZvbXJhdGlvbiBzaG91bGQgYmUgdGFrZW4gZnJvbSBvdXIgY2FwYWJpbGl0eSBhcyB3ZWxsIGFzIHBlZXJzCisgICAgICAgIC8vIFRPRE86IGN1cnJlbnRseSBpdCB0YWtlcyBmcm9tIHBlZXJzIG9ubHkKKyAgICAgICAgaWYocGFyc2VkV3NjQXNzb2NSZXEuVmVuZG9yRXh0ZW5zaW9uLnByZXNlbnQgJiYKKyAgICAgICAgICAgcGFyc2VkV3NjQXNzb2NSZXEuVmVuZG9yRXh0ZW5zaW9uLlZlcnNpb24yLnByZXNlbnQpCisgICAgICAgIHsgICAKKyAgICAgICAgICAgIHBEb3QxMWYtPlZlbmRvckV4dGVuc2lvbi5wcmVzZW50ID0gMTsKKyAgICAgICAgICAgIHBEb3QxMWYtPlZlbmRvckV4dGVuc2lvbi52ZW5kb3JJZFswXSA9IDB4MDA7CisgICAgICAgICAgICBwRG90MTFmLT5WZW5kb3JFeHRlbnNpb24udmVuZG9ySWRbMV0gPSAweDM3OworICAgICAgICAgICAgcERvdDExZi0+VmVuZG9yRXh0ZW5zaW9uLnZlbmRvcklkWzJdID0gMHgyQTsKKyAgICAgICAgICAgIHBEb3QxMWYtPlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5wcmVzZW50ID0gMTsKKyAgICAgICAgICAgIHBEb3QxMWYtPlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5tYWpvciA9IHBhcnNlZFdzY0Fzc29jUmVxLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5tYWpvcjsKKyAgICAgICAgICAgIHBEb3QxMWYtPlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5taW5vciA9IHBhcnNlZFdzY0Fzc29jUmVxLlZlbmRvckV4dGVuc2lvbi5WZXJzaW9uMi5taW5vcjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExQXNzb2NSZXNQMlBJRSh0cEFuaVNpckdsb2JhbCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVAyUEFzc29jUmVzICpwRG90MTFmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyQXNzb2NSZXEgcFJjdmRBc3NvY1JlcSkKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgKnAycEllOworCisgICAgcDJwSWUgPSBsaW1HZXRQMnBJRVB0cihwTWFjLCBwUmN2ZEFzc29jUmVxLT5hZGRJRS5hZGRJRWRhdGEsIHBSY3ZkQXNzb2NSZXEtPmFkZElFLmxlbmd0aCk7CisgICAgaWYocDJwSWUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworICAgICAgICBwRG90MTFmLT5QMlBTdGF0dXMucHJlc2VudCA9IDE7CisgICAgICAgIHBEb3QxMWYtPlAyUFN0YXR1cy5zdGF0dXMgPSBlU0lSX1NVQ0NFU1M7CisgICAgICAgIHBEb3QxMWYtPkV4dGVuZGVkTGlzdGVuVGltaW5nLnByZXNlbnQgPSAwOworICAgIH0KKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKwordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZldGQVRQQyggdHBBbmlTaXJHbG9iYWwgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXRkFUUEMgKnBEb3QxMWYsIHRBTklfVTggdHhQb3dlciwgdEFOSV9VOCBsaW5rTWFyZ2luICkKK3sKKyAgICAgcERvdDExZi0+dHhQb3dlciA9IHR4UG93ZXI7CisgICAgIHBEb3QxMWYtPmxpbmtNYXJnaW4gPSBsaW5rTWFyZ2luOworICAgICBwRG90MTFmLT5wcmVzZW50ID0gMTsKKworICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit0U2lyUmV0U3RhdHVzIFBvcHVsYXRlRG90MTFmQmVhY29uUmVwb3J0KCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVNZWFzdXJlbWVudFJlcG9ydCAqcERvdDExZiwgdFNpck1hY0JlYWNvblJlcG9ydCAqcEJlYWNvblJlcG9ydCApCit7CisKKyAgICAgcERvdDExZi0+cmVwb3J0LkJlYWNvbi5yZWdDbGFzcyA9IHBCZWFjb25SZXBvcnQtPnJlZ0NsYXNzOworICAgICBwRG90MTFmLT5yZXBvcnQuQmVhY29uLmNoYW5uZWwgPSBwQmVhY29uUmVwb3J0LT5jaGFubmVsOworICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRG90MTFmLT5yZXBvcnQuQmVhY29uLm1lYXNfc3RhcnRfdGltZSwgcEJlYWNvblJlcG9ydC0+bWVhc1N0YXJ0VGltZSwgc2l6ZW9mKHBEb3QxMWYtPnJlcG9ydC5CZWFjb24ubWVhc19zdGFydF90aW1lKSApOworICAgICBwRG90MTFmLT5yZXBvcnQuQmVhY29uLm1lYXNfZHVyYXRpb24gPSBwQmVhY29uUmVwb3J0LT5tZWFzRHVyYXRpb247CisgICAgIHBEb3QxMWYtPnJlcG9ydC5CZWFjb24uY29uZGVuc2VkX1BIWSA9IHBCZWFjb25SZXBvcnQtPnBoeVR5cGU7CisgICAgIHBEb3QxMWYtPnJlcG9ydC5CZWFjb24ucmVwb3J0ZWRfZnJhbWVfdHlwZSA9ICFwQmVhY29uUmVwb3J0LT5iY25Qcm9iZVJzcDsKKyAgICAgcERvdDExZi0+cmVwb3J0LkJlYWNvbi5SQ1BJID0gcEJlYWNvblJlcG9ydC0+cmNwaTsKKyAgICAgcERvdDExZi0+cmVwb3J0LkJlYWNvbi5SU05JID0gcEJlYWNvblJlcG9ydC0+cnNuaTsKKyAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcERvdDExZi0+cmVwb3J0LkJlYWNvbi5CU1NJRCwgcEJlYWNvblJlcG9ydC0+YnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICBwRG90MTFmLT5yZXBvcnQuQmVhY29uLmFudGVubmFfaWQgPSBwQmVhY29uUmVwb3J0LT5hbnRlbm5hSWQ7CisgICAgIHBEb3QxMWYtPnJlcG9ydC5CZWFjb24ucGFyZW50X1RTRiA9IHBCZWFjb25SZXBvcnQtPnBhcmVudFRTRjsKKworICAgICBpZiggcEJlYWNvblJlcG9ydC0+bnVtSWVzICkKKyAgICAgeworICAgICAgICAgIHBEb3QxMWYtPnJlcG9ydC5CZWFjb24uQmVhY29uUmVwb3J0RnJtQm9keS5wcmVzZW50ID0gMTsKKyAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwRG90MTFmLT5yZXBvcnQuQmVhY29uLkJlYWNvblJlcG9ydEZybUJvZHkucmVwb3J0ZWRGaWVsZHMsIHBCZWFjb25SZXBvcnQtPkllcywgcEJlYWNvblJlcG9ydC0+bnVtSWVzICk7CisgICAgICAgICAgcERvdDExZi0+cmVwb3J0LkJlYWNvbi5CZWFjb25SZXBvcnRGcm1Cb2R5Lm51bV9yZXBvcnRlZEZpZWxkcyA9IHBCZWFjb25SZXBvcnQtPm51bUllczsKKyAgICAgfQorCisgICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7CisKK30KKwordFNpclJldFN0YXR1cyBQb3B1bGF0ZURvdDExZlJSTUllKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0RG90MTFmSUVSUk1FbmFibGVkQ2FwICpwRG90MTFmLCB0cFBFU2Vzc2lvbiAgICBwc2Vzc2lvbkVudHJ5ICkKK3sgIAorICAgdHBSUk1DYXBzIHBScm1DYXBzOworCisgICBwUnJtQ2FwcyA9IHJybUdldENhcGFiaWxpdGllcyggcE1hYywgcHNlc3Npb25FbnRyeSApOworCisgICBwRG90MTFmLT5MaW5rTWVhc3VyZW1lbnQgICAgICAgICA9IHBScm1DYXBzLT5MaW5rTWVhc3VyZW1lbnQgOworICAgcERvdDExZi0+TmVpZ2hib3JScHQgICAgICAgICAgICAgPSBwUnJtQ2Fwcy0+TmVpZ2hib3JScHQgOworICAgcERvdDExZi0+cGFyYWxsZWwgICAgICAgICAgICAgICAgPSBwUnJtQ2Fwcy0+cGFyYWxsZWwgOworICAgcERvdDExZi0+cmVwZWF0ZWQgICAgICAgICAgICAgICAgPSBwUnJtQ2Fwcy0+cmVwZWF0ZWQgOworICAgcERvdDExZi0+QmVhY29uUGFzc2l2ZSAgICAgICAgICAgPSBwUnJtQ2Fwcy0+QmVhY29uUGFzc2l2ZSA7CisgICBwRG90MTFmLT5CZWFjb25BY3RpdmUgICAgICAgICAgICA9IHBScm1DYXBzLT5CZWFjb25BY3RpdmUgOworICAgcERvdDExZi0+QmVhY29uVGFibGUgICAgICAgICAgICAgPSBwUnJtQ2Fwcy0+QmVhY29uVGFibGUgOworICAgcERvdDExZi0+QmVhY29uUmVwQ29uZCAgICAgICAgICAgPSBwUnJtQ2Fwcy0+QmVhY29uUmVwQ29uZCA7CisgICBwRG90MTFmLT5GcmFtZU1lYXN1cmVtZW50ICAgICAgICA9IHBScm1DYXBzLT5GcmFtZU1lYXN1cmVtZW50IDsKKyAgIHBEb3QxMWYtPkNoYW5uZWxMb2FkICAgICAgICAgICAgID0gcFJybUNhcHMtPkNoYW5uZWxMb2FkIDsKKyAgIHBEb3QxMWYtPk5vaXNlSGlzdG9ncmFtICAgICAgICAgID0gcFJybUNhcHMtPk5vaXNlSGlzdG9ncmFtIDsKKyAgIHBEb3QxMWYtPnN0YXRpc3RpY3MgICAgICAgICAgICAgID0gcFJybUNhcHMtPnN0YXRpc3RpY3MgOworICAgcERvdDExZi0+TENJTWVhc3VyZW1lbnQgICAgICAgICAgPSBwUnJtQ2Fwcy0+TENJTWVhc3VyZW1lbnQgOworICAgcERvdDExZi0+TENJQXppbXV0aCAgICAgICAgICAgICAgPSBwUnJtQ2Fwcy0+TENJQXppbXV0aCA7CisgICBwRG90MTFmLT5UQ01DYXBhYmlsaXR5ICAgICAgICAgICA9IHBScm1DYXBzLT5UQ01DYXBhYmlsaXR5IDsKKyAgIHBEb3QxMWYtPnRyaWdnZXJlZFRDTSAgICAgICAgICAgID0gcFJybUNhcHMtPnRyaWdnZXJlZFRDTSA7CisgICBwRG90MTFmLT5BUENoYW5SZXBvcnQgICAgICAgICAgICA9IHBScm1DYXBzLT5BUENoYW5SZXBvcnQgOworICAgcERvdDExZi0+UlJNTUlCRW5hYmxlZCAgICAgICAgICAgPSBwUnJtQ2Fwcy0+UlJNTUlCRW5hYmxlZCA7CisgICBwRG90MTFmLT5vcGVyYXRpbmdDaGFuTWF4ICAgICAgICA9IHBScm1DYXBzLT5vcGVyYXRpbmdDaGFuTWF4IDsKKyAgIHBEb3QxMWYtPm5vbk9wZXJhdGluQ2hhbk1heCAgICAgID0gcFJybUNhcHMtPm5vbk9wZXJhdGluZ0NoYW5NYXggOworICAgcERvdDExZi0+TWVhc3VyZW1lbnRQaWxvdCAgICAgICAgPSBwUnJtQ2Fwcy0+TWVhc3VyZW1lbnRQaWxvdCA7CisgICBwRG90MTFmLT5NZWFzdXJlbWVudFBpbG90RW5hYmxlZCA9IHBScm1DYXBzLT5NZWFzdXJlbWVudFBpbG90RW5hYmxlZCA7CisgICBwRG90MTFmLT5OZWlnaGJvclRTRk9mZnNldCAgICAgICA9IHBScm1DYXBzLT5OZWlnaGJvclRTRk9mZnNldCA7CisgICBwRG90MTFmLT5SQ1BJTWVhc3VyZW1lbnQgICAgICAgICA9IHBScm1DYXBzLT5SQ1BJTWVhc3VyZW1lbnQgOworICAgcERvdDExZi0+UlNOSU1lYXN1cmVtZW50ICAgICAgICAgPSBwUnJtQ2Fwcy0+UlNOSU1lYXN1cmVtZW50IDsKKyAgIHBEb3QxMWYtPkJzc0F2Z0FjY2Vzc0RlbGF5ICAgICAgID0gcFJybUNhcHMtPkJzc0F2Z0FjY2Vzc0RlbGF5IDsKKyAgIHBEb3QxMWYtPkJTU0F2YWlsQWRtaXNzaW9uICAgICAgID0gcFJybUNhcHMtPkJTU0F2YWlsQWRtaXNzaW9uIDsKKyAgIHBEb3QxMWYtPkFudGVubmFJbmZvcm1hdGlvbiAgICAgID0gcFJybUNhcHMtPkFudGVubmFJbmZvcm1hdGlvbiA7CisKKyAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgordm9pZCBQb3B1bGF0ZU1ESUUoIHRwQW5pU2lyR2xvYmFsICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRU1vYmlsaXR5RG9tYWluICpwRG90MTFmLCB0QU5JX1U4IG1kaWVbU0lSX01ESUVfU0laRV0gKQoreworICAgcERvdDExZi0+cHJlc2VudCA9IDE7CisgICBwRG90MTFmLT5NRElEID0gKHRBTklfVTE2KSgobWRpZVsxXSA8PCA4KSB8IChtZGllWzBdKSk7CisKKyAgIC8vIFBsdWdmZXN0IGZpeAorICAgcERvdDExZi0+b3ZlckRTQ2FwID0gICAobWRpZVsyXSAmIDB4MDEpOworICAgcERvdDExZi0+cmVzb3VyY2VSZXFDYXAgPSAoKG1kaWVbMl0gPj4gMSkgJiAweDAxKTsKKyAgIAorfQorCit2b2lkIFBvcHVsYXRlRlRJbmZvKCB0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVGVEluZm8gICAgICpwRG90MTFmICkKK3sKKyAgIHBEb3QxMWYtPnByZXNlbnQgPSAxOworICAgcERvdDExZi0+SUVDb3VudCA9IDA7IC8vVE9ETzogcHV0IHZhbGlkIGRhdGEgZHVyaW5nIHJlYXNzb2MuCisgICAvL0FsbCBvdGhlciBpbmZvIGlzIHplcm8uCisKK30KKyNlbmRpZgorCit2b2lkIFBvcHVsYXRlRG90MTFmQXNzb2NSc3BSYXRlcyAoIHRwQW5pU2lyR2xvYmFsIHBNYWMsIHREb3QxMWZJRVN1cHBSYXRlcyAqcFN1cHAsIAorICAgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICpwRXh0LCB0QU5JX1UxNiAqXzExYlJhdGVzLCB0QU5JX1UxNiAqXzExYVJhdGVzICkKK3sKKyAgdEFOSV9VOCBudW1fc3VwcCA9IDAsIG51bV9leHQgPSAwOworICB0QU5JX1U4IGksajsKKworICBmb3IoIGkgPSAwIDsgKGkgPCBTSVJfTlVNXzExQl9SQVRFUyAmJiBfMTFiUmF0ZXNbaV0pIDsgaSsrLCBudW1fc3VwcCsrICkKKyAgeworICAgICAgcFN1cHAtPnJhdGVzW251bV9zdXBwXSA9ICh0QU5JX1U4KV8xMWJSYXRlc1tpXTsKKyAgfSAgCisgIGZvciggaiA9IDAgOyAoaiA8IFNJUl9OVU1fMTFBX1JBVEVTICYmIF8xMWFSYXRlc1tqXSkgOyBqKysgKQorICB7CisgICAgIGlmKCBudW1fc3VwcCA8IDggKQorICAgICAgICAgcFN1cHAtPnJhdGVzW251bV9zdXBwKytdID0gKHRBTklfVTgpXzExYVJhdGVzW2pdOworICAgICBlbHNlCisgICAgICAgICBwRXh0LT5yYXRlc1tudW1fZXh0KytdID0gICh0QU5JX1U4KV8xMWFSYXRlc1tqXTsgCisgIH0gIAorCisgIGlmKCBudW1fc3VwcCApCisgIHsKKyAgICAgIHBTdXBwLT5udW1fcmF0ZXMgPSBudW1fc3VwcDsKKyAgICAgIHBTdXBwLT5wcmVzZW50ID0gMTsKKyAgfQorICBpZiggbnVtX2V4dCApCisgIHsKKyAgICAgcEV4dC0+bnVtX3JhdGVzID0gbnVtX2V4dDsKKyAgICAgcEV4dC0+cHJlc2VudCA9IDE7CisgIH0KK30gCisvLyBwYXJzZXJBcGkuYyBlbmRzIGhlcmUuCmRpZmYgLS1naXQgYS9DT1JFL1NZUy9sZWdhY3kvc3JjL3V0aWxzL3NyYy91dGlsc0FwaS5jIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9zcmMvdXRpbHNBcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzgzNDVkCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9zcmMvdXRpbHNBcGkuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gIEZpbGU6ICAgICAgICAgdXRpbHNBcGkuY2MKKy8vCisvLyAgRGVzY3JpcHRpb246ICBJbXBsZW1lbnRpb24gb2YgYSBmZXcgdXRpbGl0eSByb3V0aW5lcy4gCisvLworLy8gIEF1dGhvcjogICAgICAgTmVlbGF5IERhcworLy8KKy8vICBDb3B5cmlnaHQgMjAwMywgV29vZHNpZGUgTmV0d29ya3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyAgQ2hhbmdlIGdIaXN0b3J5OgorLy8gIDEyLzE1LzIwMDMgLSBOREEgLSBJbml0aWFsIHZlcnNpb24uCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworI2luY2x1ZGUgInV0aWxzQXBpLmgiCisKKyNpZiBkZWZpbmVkIChBTklfT1NfVFlQRV9XSU5ET1dTKQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNpckJ1c3lXYWl0SW50ZXJuKCkgCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwdXQgcHJvY2Vzc29yIGluIGEgYnVzeSBsb29wIGZvcgorICogYSBnaXZlbiBhbW91bnQgb2YgZHVyYXRpb24KKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIE5vbmUuCisgKgorICogTk9URToKKyAqIDEuIEFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGluIG5hbm8gc2Vjb25kIHVuaXRzCisgKiAyLiBPUyBzcGVjaWZpYyBjYWxscyB1c2VkIGlmIGF2YWlsYWJsZS4gT3RoZXJ3aXNlIHRoaXMgbmVlZAorICogICAgdG8gYmUgZW5oYW5jZWQuCisgKgorICogQHBhcmFtICBkdXJhdGlvbiAgICBEdXJhdGlvbiB0byBiZSBidXN5IHNsZXB0CisgKiBAcmV0dXJuIE5vbmUKKyAqLworCit2b2lkCitzaXJCdXN5V2FpdEludGVybih2b2lkICpwTWFjR2xvYmFsLCB0QU5JX1UzMiBkdXJhdGlvbikKK3sKKyAgICAgICAgTmRpc1N0YWxsRXhlY3V0aW9uKChkdXJhdGlvbis5OTkpLzEwMDApOyAvLyBUaGlzIHJvdXRpbmUgdGFrZXMgdGhlIGR1cmF0aW9uIGluIHVTZWNzLgorfSAvLyBzaXJCdXN5V2FpdEludGVybigpCisKKyNlbmRpZiAvLyAoV05JX1BPTEFSSVNfRldfT1MgPT0gU0lSX1dJTkRPV1MpCisKKworCisjaWYgIWRlZmluZWQgQU5JX09TX1RZUEVfT1NYCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogc2lyRHVtcEJ1ZigpCisgKgorICogRlVOQ1RJT046CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkdW1wIGEgYnVmZmVyIHdpdGggYSBjZXJ0YWluIGxldmVsCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiBOb25lLgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHBCdWY6IGJ1ZmZlciBwb2ludGVyCisgKiBAcmV0dXJuIE5vbmUuCisgKi8KK3ZvaWQKK3NpckR1bXBCdWYodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBtb2RJZCwgdEFOSV9VMzIgbGV2ZWwsIHRBTklfVTggKmJ1ZiwgdEFOSV9VMzIgc2l6ZSkKK3sKKyAgICB0QU5JX1UzMiBpOworCisgICAgaWYgKGxldmVsID4gcE1hYy0+dXRpbHMuZ0xvZ0RiZ0xldmVsW0xPR19JTkRFWF9GT1JfTU9EVUxFKG1vZElkKV0pCisgICAgICAgIHJldHVybjsKKworICAgIGxvZ0RiZyhwTWFjLCBtb2RJZCwgbGV2ZWwsIEZMKCJEdW1waW5nICVkIGJ5dGVzIGluIGhvc3Qgb3JkZXJcbiIpLCBzaXplKTsKKworICAgIGZvciAoaT0wOyAoaSs3KTxzaXplOyBpKz04KQorICAgIHsKKyAgICAgICAgbG9nRGJnKHBNYWMsIG1vZElkLCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCBcbiIsCisgICAgICAgICAgICAgICAgIGJ1ZltpXSwKKyAgICAgICAgICAgICAgICAgYnVmW2krMV0sCisgICAgICAgICAgICAgICAgIGJ1ZltpKzJdLAorICAgICAgICAgICAgICAgICBidWZbaSszXSwKKyAgICAgICAgICAgICAgICAgYnVmW2krNF0sCisgICAgICAgICAgICAgICAgIGJ1ZltpKzVdLAorICAgICAgICAgICAgICAgICBidWZbaSs2XSwKKyAgICAgICAgICAgICAgICAgYnVmW2krN10pOworICAgIH0KKworICAgIC8vIER1bXAgdGhlIGJ5dGVzIGluIHRoZSBsYXN0IGxpbmUKKyAgICBmb3IgKDsgaSA8IHNpemU7IGkrKykKKyAgICB7CisgICAgICAgIGxvZ0RiZyhwTWFjLCBtb2RJZCwgbGV2ZWwsICIlMDJ4ICIsIGJ1ZltpXSk7CisKKyAgICAgICAgaWYoKGkrMSkgPT0gc2l6ZSkKKyAgICAgICAgICAgIGxvZ0RiZyhwTWFjLCBtb2RJZCwgbGV2ZWwsICJcbiIpOworICAgIH0KKworfS8qKiogZW5kIHNpckR1bXBCdWYoKSAqKiovCisjZWxzZQordm9pZAorc2lyRHVtcEJ1Zih0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IG1vZElkLCB0QU5JX1UzMiBsZXZlbCwgdEFOSV9VOCAqYnVmLCB0QU5JX1UzMiBzaXplKQoreworICAgICh2b2lkKXBNYWM7ICh2b2lkKW1vZElkOyAodm9pZClsZXZlbDsgKHZvaWQpYnVmOyAodm9pZClzaXplOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1NZUy9sZWdhY3kvc3JjL3V0aWxzL3NyYy91dGlsc1BhcnNlci5jIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9zcmMvdXRpbHNQYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDk1NjhlCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9TWVMvbGVnYWN5L3NyYy91dGlscy9zcmMvdXRpbHNQYXJzZXIuYwpAQCAtMCwwICsxLDc0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKgorICogQWlyZ28gTmV0d29ya3MsIEluYyBwcm9wcmlldGFyeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSB1dGlsc1BhcnNlci5jYyBjb250YWlucyB0aGUgY29kZSBmb3IgcGFyc2luZworICogODAyLjExIG1lc3NhZ2VzLgorICogQXV0aG9yOiAgICAgICAgUGllcnJlIFZhbmR3YWxsZQorICogRGF0ZTogICAgICAgICAgMDMvMTgvMDIKKyAqIEhpc3Rvcnk6LQorICogRGF0ZSAgICAgICAgICAgTW9kaWZpZWQgYnkgICAgTW9kaWZpY2F0aW9uIEluZm9ybWF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAidXRpbHNQYXJzZXIuaCIKKyNpbmNsdWRlICJsaW1TZXJEZXNVdGlscy5oIgorCit2b2lkIENvbnZlcnRTU0lEKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNTU2lkICAgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVNTSUQgICAgKnBOZXcpCit7CisgICAgcE9sZC0+bGVuZ3RoID0gcE5ldy0+bnVtX3NzaWQ7CisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE9sZC0+c3NJZCwgcE5ldy0+c3NpZCwgcE5ldy0+bnVtX3NzaWQgKTsKK30KKwordm9pZCBDb252ZXJ0U3VwcFJhdGVzKHRwQW5pU2lyR2xvYmFsICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjUmF0ZVNldCAgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFU3VwcFJhdGVzICpwTmV3KQoreworICAgIHBPbGQtPm51bVJhdGVzID0gcE5ldy0+bnVtX3JhdGVzOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBPbGQtPnJhdGUsIHBOZXctPnJhdGVzLCBwTmV3LT5udW1fcmF0ZXMgKTsKK30KKwordm9pZCBDb252ZXJ0RXh0U3VwcFJhdGVzKHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjUmF0ZVNldCAgICAgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRXh0U3VwcFJhdGVzICpwTmV3KQoreworICAgIHBPbGQtPm51bVJhdGVzID0gcE5ldy0+bnVtX3JhdGVzOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBPbGQtPnJhdGUsIHBOZXctPnJhdGVzLCBwTmV3LT5udW1fcmF0ZXMgKTsKK30KKworCit2b2lkIENvbnZlcnRRT1NDYXBzKHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNRb3NDYXBhYmlsaXR5SUUgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVFPU0NhcHNBcCAgICAgKnBOZXcpCit7CisgICAgcE9sZC0+dHlwZSAgICA9IDQ2OworICAgIHBPbGQtPmxlbmd0aCAgPSAxOworCisgICAgcE9sZC0+cW9zSW5mby5jb3VudCAgID0gcE5ldy0+Y291bnQ7ICAgCit9CisKKwordm9pZCBDb252ZXJ0UU9TQ2Fwc1N0YXRpb24odHBBbmlTaXJHbG9iYWwgICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjUW9zQ2FwYWJpbGl0eVN0YUlFICAqcE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVFPU0NhcHNTdGF0aW9uICAgICpwTmV3KQoreworICAgIHBPbGQtPnR5cGUgICAgPSA0NjsKKyAgICBwT2xkLT5sZW5ndGggID0gMTsKKworICAgIHBPbGQtPnFvc0luZm8ubW9yZURhdGFBY2sgPSBwTmV3LT5tb3JlX2RhdGFfYWNrOworICAgIHBPbGQtPnFvc0luZm8ubWF4U3BMZW4gICAgPSBwTmV3LT5tYXhfc3BfbGVuZ3RoOworICAgIHBPbGQtPnFvc0luZm8ucWFjayAgICAgICAgPSBwTmV3LT5xYWNrOworICAgIHBPbGQtPnFvc0luZm8uYWNiZV91YXBzZCAgPSBwTmV3LT5hY2JlX3VhcHNkOworICAgIHBPbGQtPnFvc0luZm8uYWNia191YXBzZCAgPSBwTmV3LT5hY2JrX3VhcHNkOworICAgIHBPbGQtPnFvc0luZm8uYWN2aV91YXBzZCAgPSBwTmV3LT5hY3ZpX3VhcHNkOworICAgIHBPbGQtPnFvc0luZm8uYWN2b191YXBzZCAgPSBwTmV3LT5hY3ZvX3VhcHNkOyAgICAKK30KKwordFNpclJldFN0YXR1cyBDb252ZXJ0V1BBKHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNXcGFJbmZvICpwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdQQSAgICAgICpwTmV3KQoreworICAgIC8vIFRoaXMgaXMgYXdmdWwsIEkga25vdywgYnV0IHRoZSBvbGQgY29kZSBqdXN0IHJhbW1lZCB0aGUgSUUgaW50byBhbgorICAgIC8vIGFycmF5Li4uCisgICAgdEFOSV9VOCBidWZmZXJbMjU3XTsKKyAgICB0QU5JX1UzMiBzdGF0dXMsIHdyaXR0ZW4gPSAwLCBuYnVmZmVyID0gMjU3OworICAgIHN0YXR1cyA9IGRvdDExZlBhY2tJZVdQQSggcE1hYywgcE5ldywgYnVmZmVyLCBuYnVmZmVyLCAmd3JpdHRlbiApOworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggc3RhdHVzICkgKQorICAgIHsKKyAgICAgICAgZG90MTFmTG9nKHBNYWMsIExPRzIsIEZMKCJGYWlsZWQgdG8gcmUtcGFjayB0aGUgV1BBIElFICgweCUweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4KS5cbiIpLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHBPbGQtPmxlbmd0aCA9ICh0QU5JX1U4KXdyaXR0ZW4gLSAyOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBPbGQtPmluZm8sIGJ1ZmZlciArIDIsIHBPbGQtPmxlbmd0aCApOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordFNpclJldFN0YXR1cyBDb252ZXJ0V1BBT3BhcXVlKCB0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNXcGFJbmZvICAgICAqcE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV1BBT3BhcXVlICpwTmV3ICkKK3sKKyAgICAvLyBUaGlzIGlzIGF3ZnVsLCBJIGtub3csIGJ1dCB0aGUgb2xkIGNvZGUganVzdCByYW1tZWQgdGhlIElFIGludG8KKyAgICAvLyBhbiBvcGFxdWUgYXJyYXkuICBOb3RlIHRoYXQgd2UgbmVlZCB0byBleHBsaWNpdGx5IGFkZCB0aGUgT1VJIQorICAgIHBPbGQtPmxlbmd0aCAgICA9IHBOZXctPm51bV9kYXRhICsgNDsKKyAgICBwT2xkLT5pbmZvWyAwIF0gPSAweDAwOworICAgIHBPbGQtPmluZm9bIDEgXSA9IDB4NTA7CisgICAgcE9sZC0+aW5mb1sgMiBdID0gMHhmMjsKKyAgICBwT2xkLT5pbmZvWyAzIF0gPSAweDAxOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBPbGQtPmluZm8gKyA0LCBwTmV3LT5kYXRhLCBwTmV3LT5udW1fZGF0YSApOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordFNpclJldFN0YXR1cyBDb252ZXJ0V3NjT3BhcXVlKCB0cEFuaVNpckdsb2JhbCAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJBZGRpZSAgICAgICAgICAgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVdzY0lFT3BhcXVlICpwTmV3ICkKK3sKKyAgICAvLyBUaGlzIGlzIGF3ZnVsLCBJIGtub3csIGJ1dCB0aGUgb2xkIGNvZGUganVzdCByYW1tZWQgdGhlIElFIGludG8KKyAgICAvLyBhbiBvcGFxdWUgYXJyYXkuICBOb3RlIHRoYXQgd2UgbmVlZCB0byBleHBsaWNpdGx5IGFkZCB0aGUgdmVuZG9ySUUgYW5kIE9VSSAhCisgICAgdEFOSV9VOCBjdXJBZGRJRUxlbiA9IHBPbGQtPmxlbmd0aDsgCisKKyAgICBwT2xkLT5sZW5ndGggICAgPSBjdXJBZGRJRUxlbiArIHBOZXctPm51bV9kYXRhICsgNjsKKyAgICBwT2xkLT5hZGRJRWRhdGFbIGN1ckFkZElFTGVuKysgXSA9IDB4ZGQ7CisgICAgcE9sZC0+YWRkSUVkYXRhWyBjdXJBZGRJRUxlbisrIF0gPSBwTmV3LT5udW1fZGF0YSArIDQ7CisgICAgcE9sZC0+YWRkSUVkYXRhWyBjdXJBZGRJRUxlbisrIF0gPSAweDAwOworICAgIHBPbGQtPmFkZElFZGF0YVsgY3VyQWRkSUVMZW4rKyBdID0gMHg1MDsKKyAgICBwT2xkLT5hZGRJRWRhdGFbIGN1ckFkZElFTGVuKysgXSA9IDB4ZjI7CisgICAgcE9sZC0+YWRkSUVkYXRhWyBjdXJBZGRJRUxlbisrIF0gPSAweDA0OworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBPbGQtPmFkZElFZGF0YSArIGN1ckFkZElFTGVuLCBwTmV3LT5kYXRhLCBwTmV3LT5udW1fZGF0YSApOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKK3RTaXJSZXRTdGF0dXMgQ29udmVydFAyUE9wYXF1ZSggdHBBbmlTaXJHbG9iYWwgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQWRkaWUgICAgICAgICAgICpwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVQMlBJRU9wYXF1ZSAqcE5ldyApCit7CisgICAgLy8gVGhpcyBpcyBhd2Z1bCwgSSBrbm93LCBidXQgdGhlIG9sZCBjb2RlIGp1c3QgcmFtbWVkIHRoZSBJRSBpbnRvCisgICAgLy8gYW4gb3BhcXVlIGFycmF5LiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gZXhwbGljaXRseSBhZGQgdGhlIHZlbmRvcklFIGFuZCBPVUkgIQorICAgIHRBTklfVTggY3VyQWRkSUVMZW4gPSBwT2xkLT5sZW5ndGg7IAorCisgICAgcE9sZC0+bGVuZ3RoICAgID0gY3VyQWRkSUVMZW4gKyBwTmV3LT5udW1fZGF0YSArIDY7CisgICAgcE9sZC0+YWRkSUVkYXRhWyBjdXJBZGRJRUxlbisrIF0gPSAweGRkOworICAgIHBPbGQtPmFkZElFZGF0YVsgY3VyQWRkSUVMZW4rKyBdID0gcE5ldy0+bnVtX2RhdGEgKyA0OworICAgIHBPbGQtPmFkZElFZGF0YVsgY3VyQWRkSUVMZW4rKyBdID0gMHg1MDsKKyAgICBwT2xkLT5hZGRJRWRhdGFbIGN1ckFkZElFTGVuKysgXSA9IDB4NmY7CisgICAgcE9sZC0+YWRkSUVkYXRhWyBjdXJBZGRJRUxlbisrIF0gPSAweDlBOworICAgIHBPbGQtPmFkZElFZGF0YVsgY3VyQWRkSUVMZW4rKyBdID0gMHgwOTsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwT2xkLT5hZGRJRWRhdGEgKyBjdXJBZGRJRUxlbiwgcE5ldy0+ZGF0YSwgcE5ldy0+bnVtX2RhdGEgKTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisjZW5kaWYKKwordFNpclJldFN0YXR1cyBDb252ZXJ0UlNOKHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNSc25JbmZvICpwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVJTTiAgICAgICpwTmV3KQoreworICAgIHRBTklfVTggYnVmZmVyWzI1N107CisgICAgdEFOSV9VMzIgc3RhdHVzLCB3cml0dGVuID0gMCwgbmJ1ZmZlciA9IDI1NzsKKyAgICBzdGF0dXMgPSBkb3QxMWZQYWNrSWVSU04oIHBNYWMsIHBOZXcsIGJ1ZmZlciwgbmJ1ZmZlciwgJndyaXR0ZW4gKTsKKyAgICBpZiAoIERPVDExRl9GQUlMRUQoIHN0YXR1cyApICkKKyAgICB7CisgICAgICAgIGRvdDExZkxvZyhwTWFjLCBMT0cyLCBGTCgiRmFpbGVkIHRvIHJlLXBhY2sgdGhlIFJTTiBJRSAoMHglMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOCkuXG4iKSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwT2xkLT5sZW5ndGggPSAodEFOSV9VOCl3cml0dGVuIC0gMjsKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwT2xkLT5pbmZvLCBidWZmZXIgKyAyLCBwT2xkLT5sZW5ndGggKTsKKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3RTaXJSZXRTdGF0dXMgQ29udmVydFJTTk9wYXF1ZSggdHBBbmlTaXJHbG9iYWwgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjUnNuSW5mbyAgICAgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVJTTk9wYXF1ZSAqcE5ldyApCit7CisgICAgLy8gVGhpcyBpcyBhd2Z1bCwgSSBrbm93LCBidXQgdGhlIG9sZCBjb2RlIGp1c3QgcmFtbWVkIHRoZSBJRSBpbnRvCisgICAgLy8gYW4gb3BhcXVlIGFycmF5LgorICAgIHBPbGQtPmxlbmd0aCA9IHBOZXctPm51bV9kYXRhOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBPbGQtPmluZm8sIHBOZXctPmRhdGEsIHBPbGQtPmxlbmd0aCApOworCisgICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKK30KKwordm9pZCBDb252ZXJ0UG93ZXJDYXBzKHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjUG93ZXJDYXBhYmlsaXR5SUUgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFUG93ZXJDYXBzICAgICAgICAgICpwTmV3KQoreworICAgIHBPbGQtPnR5cGUgICAgICAgPSAzMzsKKyAgICBwT2xkLT5sZW5ndGggICAgID0gMjsKKyAgICBwT2xkLT5taW5UeFBvd2VyID0gcE5ldy0+bWluVHhQb3dlcjsKKyAgICBwT2xkLT5tYXhUeFBvd2VyID0gcE5ldy0+bWF4VHhQb3dlcjsKK30KKwordm9pZCBDb252ZXJ0U3VwcENoYW5uZWxzKHRwQW5pU2lyR2xvYmFsICAgICAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY1N1cHBvcnRlZENoYW5uZWxJRSAqcE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTdXBwQ2hhbm5lbHMgICAgICAgICpwTmV3KQoreworICAgIHBPbGQtPnR5cGUgICA9IDM2OworICAgIHBPbGQtPmxlbmd0aCA9ICggcE5ldy0+bnVtX2JhbmRzICogMiApOworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKXBPbGQtPnN1cHBvcnRlZENoYW5uZWxzLCAoIHRBTklfVTgqIClwTmV3LT5iYW5kcywgcE9sZC0+bGVuZ3RoICk7Cit9CisKK3ZvaWQgQ29udmVydENGUGFyYW1zKHRwQW5pU2lyR2xvYmFsICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0NmUGFyYW1TZXQgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDRlBhcmFtcyAgICAqcE5ldykKK3sKKyAgICBwT2xkLT5jZnBDb3VudCAgICAgICAgPSBwTmV3LT5jZnBfY291bnQ7CisgICAgcE9sZC0+Y2ZwUGVyaW9kICAgICAgID0gcE5ldy0+Y2ZwX3BlcmlvZDsKKyAgICBwT2xkLT5jZnBNYXhEdXJhdGlvbiAgPSBwTmV3LT5jZnBfbWF4ZHVyYXRpb247CisgICAgcE9sZC0+Y2ZwRHVyUmVtYWluaW5nID0gcE5ldy0+Y2ZwX2R1cnJlbWFpbmluZzsKK30KKwordm9pZCBDb252ZXJ0VElNKHRwQW5pU2lyR2xvYmFsIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY1RpbSAgICAqcE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUSU0gICAgICpwTmV3KQoreworICAgIHBPbGQtPmR0aW1Db3VudCAgICAgPSBwTmV3LT5kdGltX2NvdW50OworICAgIHBPbGQtPmR0aW1QZXJpb2QgICAgPSBwTmV3LT5kdGltX3BlcmlvZDsKKyAgICBwT2xkLT5iaXRtYXBDb250cm9sID0gcE5ldy0+Ym1wY3RsOworICAgIHBPbGQtPmJpdG1hcExlbmd0aCAgPSBwTmV3LT5udW1fdmJtcDsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBPbGQtPmJpdG1hcCwgcE5ldy0+dmJtcCwgcE5ldy0+bnVtX3ZibXAgKTsKK30KKwordm9pZCBDb252ZXJ0Q291bnRyeSh0cEFuaVNpckdsb2JhbCAgICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyQ291bnRyeUluZm9ybWF0aW9uICpwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVDb3VudHJ5ICAgICAgICAgICpwTmV3KQoreworICAgIGludCBpOworCisgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE9sZC0+Y291bnRyeVN0cmluZywgcE5ldy0+Y291bnRyeSwgQ09VTlRSWV9TVFJJTkdfTEVOR1RIICk7CisKKyAgICBwT2xkLT5udW1JbnRlcnZhbHMgPSBwTmV3LT5udW1fdHJpcGxldHM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcE5ldy0+bnVtX3RyaXBsZXRzOyArK2kpCisgICAgeworICAgICAgICBwT2xkLT5jaGFubmVsVHJhbnNtaXRQb3dlcltpXS5jaGFubmVsTnVtYmVyICAgID0gcE5ldy0+dHJpcGxldHNbaV1bMF07CisgICAgICAgIHBPbGQtPmNoYW5uZWxUcmFuc21pdFBvd2VyW2ldLm51bUNoYW5uZWwgICAgICAgPSBwTmV3LT50cmlwbGV0c1tpXVsxXTsKKyAgICAgICAgcE9sZC0+Y2hhbm5lbFRyYW5zbWl0UG93ZXJbaV0ubWF4VHJhbnNtaXRQb3dlciA9IHBOZXctPnRyaXBsZXRzW2ldWzJdOworICAgIH0KK30KKwordm9pZCBDb252ZXJ0V01NUGFyYW1zKHRwQW5pU2lyR2xvYmFsICAgICAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjRWRjYVBhcmFtU2V0SUUgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NUGFyYW1zICAgICAgICpwTmV3KQoreworICAgIHBPbGQtPnR5cGUgPSAyMjE7CisgICAgcE9sZC0+bGVuZ3RoID0gMjQ7CisKKyAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqICkmcE9sZC0+cW9zSW5mbywgKCB0QU5JX1U4KiApJnBOZXctPnFvc0luZm8sIDEgKTsKKworICAgIHBPbGQtPmFjYmUuYWNpLmFpZnNuICA9IHBOZXctPmFjYmVfYWlmc247CisgICAgcE9sZC0+YWNiZS5hY2kuYWNtICAgID0gcE5ldy0+YWNiZV9hY207CisgICAgcE9sZC0+YWNiZS5hY2kuYWNpICAgID0gcE5ldy0+YWNiZV9hY2k7CisgICAgcE9sZC0+YWNiZS5jdy5taW4gICAgID0gcE5ldy0+YWNiZV9hY3dtaW47CisgICAgcE9sZC0+YWNiZS5jdy5tYXggICAgID0gcE5ldy0+YWNiZV9hY3dtYXg7CisgICAgcE9sZC0+YWNiZS50eG9wbGltaXQgID0gcE5ldy0+YWNiZV90eG9wbGltaXQ7CisKKyAgICBwT2xkLT5hY2JrLmFjaS5haWZzbiAgPSBwTmV3LT5hY2JrX2FpZnNuOworICAgIHBPbGQtPmFjYmsuYWNpLmFjbSAgICA9IHBOZXctPmFjYmtfYWNtOworICAgIHBPbGQtPmFjYmsuYWNpLmFjaSAgICA9IHBOZXctPmFjYmtfYWNpOworICAgIHBPbGQtPmFjYmsuY3cubWluICAgICA9IHBOZXctPmFjYmtfYWN3bWluOworICAgIHBPbGQtPmFjYmsuY3cubWF4ICAgICA9IHBOZXctPmFjYmtfYWN3bWF4OworICAgIHBPbGQtPmFjYmsudHhvcGxpbWl0ICA9IHBOZXctPmFjYmtfdHhvcGxpbWl0OworCisgICAgcE9sZC0+YWN2aS5hY2kuYWlmc24gID0gcE5ldy0+YWN2aV9haWZzbjsKKyAgICBwT2xkLT5hY3ZpLmFjaS5hY20gICAgPSBwTmV3LT5hY3ZpX2FjbTsKKyAgICBwT2xkLT5hY3ZpLmFjaS5hY2kgICAgPSBwTmV3LT5hY3ZpX2FjaTsKKyAgICBwT2xkLT5hY3ZpLmN3Lm1pbiAgICAgPSBwTmV3LT5hY3ZpX2Fjd21pbjsKKyAgICBwT2xkLT5hY3ZpLmN3Lm1heCAgICAgPSBwTmV3LT5hY3ZpX2Fjd21heDsKKyAgICBwT2xkLT5hY3ZpLnR4b3BsaW1pdCAgPSBwTmV3LT5hY3ZpX3R4b3BsaW1pdDsKKworICAgIHBPbGQtPmFjdm8uYWNpLmFpZnNuICA9IHBOZXctPmFjdm9fYWlmc247CisgICAgcE9sZC0+YWN2by5hY2kuYWNtICAgID0gcE5ldy0+YWN2b19hY207CisgICAgcE9sZC0+YWN2by5hY2kuYWNpICAgID0gcE5ldy0+YWN2b19hY2k7CisgICAgcE9sZC0+YWN2by5jdy5taW4gICAgID0gcE5ldy0+YWN2b19hY3dtaW47CisgICAgcE9sZC0+YWN2by5jdy5tYXggICAgID0gcE5ldy0+YWN2b19hY3dtYXg7CisgICAgcE9sZC0+YWN2by50eG9wbGltaXQgID0gcE5ldy0+YWN2b190eG9wbGltaXQ7Cit9CisKK3ZvaWQgQ29udmVydEVSUEluZm8odHBBbmlTaXJHbG9iYWwgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0VycEluZm8gICAqcE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFRVJQSW5mbyAgICAqcE5ldykKK3sKKyAgICBwT2xkLT5ub25FcnBQcmVzZW50ID0gcE5ldy0+bm9uX2VycF9wcmVzZW50OworICAgIHBPbGQtPnVzZVByb3RlY3Rpb24gPSBwTmV3LT51c2VfcHJvdDsKKyAgICBwT2xkLT5iYXJrZXJQcmVhbWJsZU1vZGUgPSBwTmV3LT5iYXJrZXJfcHJlYW1ibGU7Cit9CisKK3ZvaWQgQ29udmVydEVEQ0FQYXJhbSh0cEFuaVNpckdsb2JhbCAgICAgICAgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0VkY2FQYXJhbVNldElFICpwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRUVEQ0FQYXJhbVNldCAgICAqcE5ldykKK3sKKyAgICBwT2xkLT50eXBlICAgPSAxMjsKKyAgICBwT2xkLT5sZW5ndGggPSAyMDsKKworICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZwT2xkLT5xb3NJbmZvLCAoIHRBTklfVTgqICkmcE5ldy0+cW9zLCAxICk7CisKKyAgICBwT2xkLT5hY2JlLmFjaS5haWZzbiAgPSBwTmV3LT5hY2JlX2FpZnNuOworICAgIHBPbGQtPmFjYmUuYWNpLmFjbSAgICA9IHBOZXctPmFjYmVfYWNtOworICAgIHBPbGQtPmFjYmUuYWNpLmFjaSAgICA9IHBOZXctPmFjYmVfYWNpOworICAgIHBPbGQtPmFjYmUuY3cubWluICAgICA9IHBOZXctPmFjYmVfYWN3bWluOworICAgIHBPbGQtPmFjYmUuY3cubWF4ICAgICA9IHBOZXctPmFjYmVfYWN3bWF4OworICAgIHBPbGQtPmFjYmUudHhvcGxpbWl0ICA9IHBOZXctPmFjYmVfdHhvcGxpbWl0OworCisgICAgcE9sZC0+YWNiay5hY2kuYWlmc24gID0gcE5ldy0+YWNia19haWZzbjsKKyAgICBwT2xkLT5hY2JrLmFjaS5hY20gICAgPSBwTmV3LT5hY2JrX2FjbTsKKyAgICBwT2xkLT5hY2JrLmFjaS5hY2kgICAgPSBwTmV3LT5hY2JrX2FjaTsKKyAgICBwT2xkLT5hY2JrLmN3Lm1pbiAgICAgPSBwTmV3LT5hY2JrX2Fjd21pbjsKKyAgICBwT2xkLT5hY2JrLmN3Lm1heCAgICAgPSBwTmV3LT5hY2JrX2Fjd21heDsKKyAgICBwT2xkLT5hY2JrLnR4b3BsaW1pdCAgPSBwTmV3LT5hY2JrX3R4b3BsaW1pdDsKKworICAgIHBPbGQtPmFjdmkuYWNpLmFpZnNuICA9IHBOZXctPmFjdmlfYWlmc247CisgICAgcE9sZC0+YWN2aS5hY2kuYWNtICAgID0gcE5ldy0+YWN2aV9hY207CisgICAgcE9sZC0+YWN2aS5hY2kuYWNpICAgID0gcE5ldy0+YWN2aV9hY2k7CisgICAgcE9sZC0+YWN2aS5jdy5taW4gICAgID0gcE5ldy0+YWN2aV9hY3dtaW47CisgICAgcE9sZC0+YWN2aS5jdy5tYXggICAgID0gcE5ldy0+YWN2aV9hY3dtYXg7CisgICAgcE9sZC0+YWN2aS50eG9wbGltaXQgID0gcE5ldy0+YWN2aV90eG9wbGltaXQ7CisKKyAgICBwT2xkLT5hY3ZvLmFjaS5haWZzbiAgPSBwTmV3LT5hY3ZvX2FpZnNuOworICAgIHBPbGQtPmFjdm8uYWNpLmFjbSAgICA9IHBOZXctPmFjdm9fYWNtOworICAgIHBPbGQtPmFjdm8uYWNpLmFjaSAgICA9IHBOZXctPmFjdm9fYWNpOworICAgIHBPbGQtPmFjdm8uY3cubWluICAgICA9IHBOZXctPmFjdm9fYWN3bWluOworICAgIHBPbGQtPmFjdm8uY3cubWF4ICAgICA9IHBOZXctPmFjdm9fYWN3bWF4OworICAgIHBPbGQtPmFjdm8udHhvcGxpbWl0ICA9IHBOZXctPmFjdm9fdHhvcGxpbWl0OworCit9CisKK3ZvaWQgQ29udmVydFRTUEVDKHRwQW5pU2lyR2xvYmFsICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY1RzcGVjSUUgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVUU1BFQyAqcE5ldykKK3sKKyAgICBwT2xkLT50c2luZm8udHJhZmZpYy50cmFmZmljVHlwZSAgPSAodEFOSV9VMTYpcE5ldy0+dHJhZmZpY190eXBlOworICAgIHBPbGQtPnRzaW5mby50cmFmZmljLnRzaWQgICAgICAgICA9ICh0QU5JX1UxNilwTmV3LT50c2lkOworICAgIHBPbGQtPnRzaW5mby50cmFmZmljLmRpcmVjdGlvbiAgICA9ICh0QU5JX1UxNilwTmV3LT5kaXJlY3Rpb247CisgICAgcE9sZC0+dHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID0gKHRBTklfVTE2KXBOZXctPmFjY2Vzc19wb2xpY3k7CisgICAgcE9sZC0+dHNpbmZvLnRyYWZmaWMuYWdncmVnYXRpb24gID0gKHRBTklfVTE2KXBOZXctPmFnZ3JlZ2F0aW9uOworICAgIHBPbGQtPnRzaW5mby50cmFmZmljLnBzYiAgICAgICAgICA9ICh0QU5JX1UxNilwTmV3LT5wc2I7CisgICAgcE9sZC0+dHNpbmZvLnRyYWZmaWMudXNlclByaW8gICAgID0gKHRBTklfVTE2KXBOZXctPnVzZXJfcHJpb3JpdHk7CisgICAgcE9sZC0+dHNpbmZvLnRyYWZmaWMuYWNrUG9saWN5ICAgID0gKHRBTklfVTE2KXBOZXctPnRzaW5mb19hY2tfcG9sOworCisgICAgcE9sZC0+dHNpbmZvLnNjaGVkdWxlLnNjaGVkdWxlICAgID0gKHRBTklfVTgpcE5ldy0+c2NoZWR1bGU7CisKKyAgICBwT2xkLT5ub21Nc2R1U3ogICAgICAgICAgICAgICAgICAgPSBwTmV3LT5zaXplOworICAgIHBPbGQtPm1heE1zZHVTeiAgICAgICAgICAgICAgICAgICA9IHBOZXctPm1heF9tc2R1X3NpemU7CisgICAgcE9sZC0+bWluU3ZjSW50ZXJ2YWwgICAgICAgICAgICAgID0gcE5ldy0+bWluX3NlcnZpY2VfaW50OworICAgIHBPbGQtPm1heFN2Y0ludGVydmFsICAgICAgICAgICAgICA9IHBOZXctPm1heF9zZXJ2aWNlX2ludDsKKyAgICBwT2xkLT5pbmFjdEludGVydmFsICAgICAgICAgICAgICAgPSBwTmV3LT5pbmFjdGl2aXR5X2ludDsKKyAgICBwT2xkLT5zdXNwZW5kSW50ZXJ2YWwgICAgICAgICAgICAgPSBwTmV3LT5zdXNwZW5zaW9uX2ludDsKKyAgICBwT2xkLT5zdmNTdGFydFRpbWUgICAgICAgICAgICAgICAgPSBwTmV3LT5zZXJ2aWNlX3N0YXJ0X3RpbWU7CisgICAgcE9sZC0+bWluRGF0YVJhdGUgICAgICAgICAgICAgICAgID0gcE5ldy0+bWluX2RhdGFfcmF0ZTsKKyAgICBwT2xkLT5tZWFuRGF0YVJhdGUgICAgICAgICAgICAgICAgPSBwTmV3LT5tZWFuX2RhdGFfcmF0ZTsKKyAgICBwT2xkLT5wZWFrRGF0YVJhdGUgICAgICAgICAgICAgICAgPSBwTmV3LT5wZWFrX2RhdGFfcmF0ZTsKKyAgICBwT2xkLT5tYXhCdXJzdFN6ICAgICAgICAgICAgICAgICAgPSBwTmV3LT5idXJzdF9zaXplOworICAgIHBPbGQtPmRlbGF5Qm91bmQgICAgICAgICAgICAgICAgICA9IHBOZXctPmRlbGF5X2JvdW5kOworICAgIHBPbGQtPm1pblBoeVJhdGUgICAgICAgICAgICAgICAgICA9IHBOZXctPm1pbl9waHlfcmF0ZTsKKyAgICBwT2xkLT5zdXJwbHVzQncgICAgICAgICAgICAgICAgICAgPSBwTmV3LT5zdXJwbHVzX2J3X2FsbG93YW5jZTsKKyAgICBwT2xkLT5tZWRpdW1UaW1lICAgICAgICAgICAgICAgICAgPSBwTmV3LT5tZWRpdW1fdGltZTsKK30KKwordFNpclJldFN0YXR1cyBDb252ZXJ0VENMQVModHBBbmlTaXJHbG9iYWwgIHBNYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyVGNsYXNJbmZvICAqcE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREb3QxMWZJRVRDTEFTICpwTmV3KQoreworICAgIHRBTklfVTMyIGxlbmd0aDsKKworICAgIGlmICggRE9UMTFGX0ZBSUxFRCggZG90MTFmR2V0UGFja2VkSUVUQ0xBUyggcE1hYywgcE5ldywgJmxlbmd0aCApICkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwT2xkLT50Y2xhcy50eXBlICAgICAgICAgICA9IERPVDExRl9FSURfVENMQVM7CisgICAgcE9sZC0+dGNsYXMubGVuZ3RoICAgICAgICAgPSAodEFOSV9VOClsZW5ndGg7CisgICAgcE9sZC0+dGNsYXMudXNlclByaW8gICAgICAgPSBwTmV3LT51c2VyX3ByaW9yaXR5OworICAgIHBPbGQtPnRjbGFzLmNsYXNzaWZpZXJUeXBlID0gcE5ldy0+Y2xhc3NpZmllcl90eXBlOworICAgIHBPbGQtPnRjbGFzLmNsYXNzaWZpZXJNYXNrID0gcE5ldy0+Y2xhc3NpZmllcl9tYXNrOworCisgICAgc3dpdGNoICggcE5ldy0+Y2xhc3NpZmllcl90eXBlICkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCBwT2xkLT50Y2xhc1BhcmFtcy5ldGguc3JjQWRkciwgcE5ldy0+aW5mby5FdGhQYXJhbXMuc291cmNlLCA2ICk7CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBPbGQtPnRjbGFzUGFyYW1zLmV0aC5kc3RBZGRyLCBwTmV3LT5pbmZvLkV0aFBhcmFtcy5kZXN0LCA2ICk7CisgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmV0aC50eXBlID0gcE5ldy0+aW5mby5FdGhQYXJhbXMudHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBwT2xkLT52ZXJzaW9uID0gcE5ldy0+aW5mby5JcFBhcmFtcy52ZXJzaW9uOworICAgICAgICBpZiAoIDQgPT0gcE5ldy0+aW5mby5JcFBhcmFtcy52ZXJzaW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC52ZXJzaW9uID0gNDsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnNyY0lwQWRkciwgKCB0QU5JX1U4KiApcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zb3VyY2UsIDQgKTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKSZwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LmRzdElwQWRkciwgKCB0QU5JX1U4KiApcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5kZXN0LCA0ICk7CisgICAgICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnNyY1BvcnQgID0gcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5zcmNfcG9ydDsKKyAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuZHN0UG9ydCAgPSBwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3RfcG9ydDsKKyAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuZHNjcCAgICAgPSBwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLkRTQ1A7CisgICAgICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnByb3RvY29sID0gcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNFBhcmFtcy5wcm90bzsKKyAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjQucnN2ZCAgICAgPSBwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnJlc2VydmVkOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCA2ID09IHBOZXctPmluZm8uSXBQYXJhbXMudmVyc2lvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjYudmVyc2lvbiA9IDY7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqIClwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LnNyY0lwQWRkciwgKCB0QU5JX1U4KiApcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zb3VyY2UsIDE2ICk7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqIClwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LmRzdElwQWRkciwgKCB0QU5JX1U4KiApcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0LCAxNiApOworICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni5zcmNQb3J0ICA9IHBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjZQYXJhbXMuc3JjX3BvcnQ7CisgICAgICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LmRzdFBvcnQgID0gcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5kZXN0X3BvcnQ7CisgICAgICAgICAgICBwYWxDb3B5TWVtb3J5KCBwTWFjLT5oSGRkLCAoIHRBTklfVTgqIClwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LmZsb3dMYWJlbCwgKCB0QU5JX1U4KiApcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5mbG93X2xhYmVsLCAzICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMudDgwMjFkcS50YWcgPSBwTmV3LT5pbmZvLlBhcmFtczgwMjFkcS50YWdfdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfQorCit2b2lkIENvbnZlcnRXTU1UU1BFQyh0cEFuaVNpckdsb2JhbCAgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNUc3BlY0lFICAgICpwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NVFNQRUMgKnBOZXcpCit7CisgICAgcE9sZC0+dHNpbmZvLnRyYWZmaWMudHJhZmZpY1R5cGUgID0gKHRBTklfVTE2KXBOZXctPnRyYWZmaWNfdHlwZTsKKyAgICBwT2xkLT50c2luZm8udHJhZmZpYy50c2lkICAgICAgICAgPSAodEFOSV9VMTYpcE5ldy0+dHNpZDsKKyAgICBwT2xkLT50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24gICAgPSAodEFOSV9VMTYpcE5ldy0+ZGlyZWN0aW9uOworICAgIHBPbGQtPnRzaW5mby50cmFmZmljLmFjY2Vzc1BvbGljeSA9ICh0QU5JX1UxNilwTmV3LT5hY2Nlc3NfcG9saWN5OworICAgIHBPbGQtPnRzaW5mby50cmFmZmljLmFnZ3JlZ2F0aW9uICA9ICh0QU5JX1UxNilwTmV3LT5hZ2dyZWdhdGlvbjsKKyAgICBwT2xkLT50c2luZm8udHJhZmZpYy5wc2IgICAgICAgICAgPSAodEFOSV9VMTYpcE5ldy0+cHNiOworICAgIHBPbGQtPnRzaW5mby50cmFmZmljLnVzZXJQcmlvICAgICA9ICh0QU5JX1UxNilwTmV3LT51c2VyX3ByaW9yaXR5OworICAgIHBPbGQtPnRzaW5mby50cmFmZmljLmFja1BvbGljeSAgICA9ICh0QU5JX1UxNilwTmV3LT50c2luZm9fYWNrX3BvbDsKKyAgICBwT2xkLT5ub21Nc2R1U3ogICAgICAgICAgICAgICAgICAgPSBwTmV3LT5zaXplOworICAgIHBPbGQtPm1heE1zZHVTeiAgICAgICAgICAgICAgICAgICA9IHBOZXctPm1heF9tc2R1X3NpemU7CisgICAgcE9sZC0+bWluU3ZjSW50ZXJ2YWwgICAgICAgICAgICAgID0gcE5ldy0+bWluX3NlcnZpY2VfaW50OworICAgIHBPbGQtPm1heFN2Y0ludGVydmFsICAgICAgICAgICAgICA9IHBOZXctPm1heF9zZXJ2aWNlX2ludDsKKyAgICBwT2xkLT5pbmFjdEludGVydmFsICAgICAgICAgICAgICAgPSBwTmV3LT5pbmFjdGl2aXR5X2ludDsKKyAgICBwT2xkLT5zdXNwZW5kSW50ZXJ2YWwgICAgICAgICAgICAgPSBwTmV3LT5zdXNwZW5zaW9uX2ludDsKKyAgICBwT2xkLT5zdmNTdGFydFRpbWUgICAgICAgICAgICAgICAgPSBwTmV3LT5zZXJ2aWNlX3N0YXJ0X3RpbWU7CisgICAgcE9sZC0+bWluRGF0YVJhdGUgICAgICAgICAgICAgICAgID0gcE5ldy0+bWluX2RhdGFfcmF0ZTsKKyAgICBwT2xkLT5tZWFuRGF0YVJhdGUgICAgICAgICAgICAgICAgPSBwTmV3LT5tZWFuX2RhdGFfcmF0ZTsKKyAgICBwT2xkLT5wZWFrRGF0YVJhdGUgICAgICAgICAgICAgICAgPSBwTmV3LT5wZWFrX2RhdGFfcmF0ZTsKKyAgICBwT2xkLT5tYXhCdXJzdFN6ICAgICAgICAgICAgICAgICAgPSBwTmV3LT5idXJzdF9zaXplOworICAgIHBPbGQtPmRlbGF5Qm91bmQgICAgICAgICAgICAgICAgICA9IHBOZXctPmRlbGF5X2JvdW5kOworICAgIHBPbGQtPm1pblBoeVJhdGUgICAgICAgICAgICAgICAgICA9IHBOZXctPm1pbl9waHlfcmF0ZTsKKyAgICBwT2xkLT5zdXJwbHVzQncgICAgICAgICAgICAgICAgICAgPSBwTmV3LT5zdXJwbHVzX2J3X2FsbG93YW5jZTsKKyAgICBwT2xkLT5tZWRpdW1UaW1lICAgICAgICAgICAgICAgICAgPSBwTmV3LT5tZWRpdW1fdGltZTsKK30KKwordFNpclJldFN0YXR1cyBDb252ZXJ0V01NVENMQVModHBBbmlTaXJHbG9iYWwgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJUY2xhc0luZm8gICAgICpwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFV01NVENMQVMgKnBOZXcpCit7CisgICAgdEFOSV9VMzIgbGVuZ3RoOworCisgICAgaWYgKCBET1QxMUZfRkFJTEVEKCBkb3QxMWZHZXRQYWNrZWRJRVdNTVRDTEFTKCBwTWFjLCBwTmV3LCAmbGVuZ3RoICkgKSApCisgICAgeworICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHBPbGQtPnRjbGFzLnR5cGUgICAgICAgICAgID0gRE9UMTFGX0VJRF9XTU1UQ0xBUzsKKyAgICBwT2xkLT50Y2xhcy5sZW5ndGggICAgICAgICA9ICh0QU5JX1U4KWxlbmd0aDsKKyAgICBwT2xkLT50Y2xhcy51c2VyUHJpbyAgICAgICA9IHBOZXctPnVzZXJfcHJpb3JpdHk7CisgICAgcE9sZC0+dGNsYXMuY2xhc3NpZmllclR5cGUgPSBwTmV3LT5jbGFzc2lmaWVyX3R5cGU7CisgICAgcE9sZC0+dGNsYXMuY2xhc3NpZmllck1hc2sgPSBwTmV3LT5jbGFzc2lmaWVyX21hc2s7CisKKyAgICBzd2l0Y2ggKCBwTmV3LT5jbGFzc2lmaWVyX3R5cGUgKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsIHBPbGQtPnRjbGFzUGFyYW1zLmV0aC5zcmNBZGRyLCBwTmV3LT5pbmZvLkV0aFBhcmFtcy5zb3VyY2UsIDYgKTsKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgcE9sZC0+dGNsYXNQYXJhbXMuZXRoLmRzdEFkZHIsIHBOZXctPmluZm8uRXRoUGFyYW1zLmRlc3QsIDYgKTsKKyAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuZXRoLnR5cGUgPSBwTmV3LT5pbmZvLkV0aFBhcmFtcy50eXBlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHBPbGQtPnZlcnNpb24gPSBwTmV3LT5pbmZvLklwUGFyYW1zLnZlcnNpb247CisgICAgICAgIGlmICggNCA9PSBwTmV3LT5pbmZvLklwUGFyYW1zLnZlcnNpb24gKQorICAgICAgICB7CisgICAgICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy5pcHY0LnZlcnNpb24gPSA0OworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJnBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuc3JjSXBBZGRyLCAoIHRBTklfVTgqIClwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNvdXJjZSwgNCApOworICAgICAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKCB0QU5JX1U4KiApJnBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuZHN0SXBBZGRyLCAoIHRBTklfVTgqIClwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLmRlc3QsIDQgKTsKKyAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjQuc3JjUG9ydCAgPSBwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnNyY19wb3J0OworICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5kc3RQb3J0ICA9IHBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuZGVzdF9wb3J0OworICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5kc2NwICAgICA9IHBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMuRFNDUDsKKyAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjQucHJvdG9jb2wgPSBwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY0UGFyYW1zLnByb3RvOworICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2NC5yc3ZkICAgICA9IHBOZXctPmluZm8uSXBQYXJhbXMucGFyYW1zLklwVjRQYXJhbXMucmVzZXJ2ZWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIDYgPT0gcE5ldy0+aW5mby5JcFBhcmFtcy52ZXJzaW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgcE9sZC0+dGNsYXNQYXJhbXMuaXB2Ni52ZXJzaW9uID0gNjsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKXBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuc3JjSXBBZGRyLCAoIHRBTklfVTgqIClwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLnNvdXJjZSwgMTYgKTsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKXBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuZHN0SXBBZGRyLCAoIHRBTklfVTgqIClwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3QsIDE2ICk7CisgICAgICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy5pcHY2LnNyY1BvcnQgID0gcE5ldy0+aW5mby5JcFBhcmFtcy5wYXJhbXMuSXBWNlBhcmFtcy5zcmNfcG9ydDsKKyAgICAgICAgICAgIHBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuZHN0UG9ydCAgPSBwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmRlc3RfcG9ydDsKKyAgICAgICAgICAgIHBhbENvcHlNZW1vcnkoIHBNYWMtPmhIZGQsICggdEFOSV9VOCogKXBPbGQtPnRjbGFzUGFyYW1zLmlwdjYuZmxvd0xhYmVsLCAoIHRBTklfVTgqIClwTmV3LT5pbmZvLklwUGFyYW1zLnBhcmFtcy5JcFY2UGFyYW1zLmZsb3dfbGFiZWwsIDMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBwT2xkLT50Y2xhc1BhcmFtcy50ODAyMWRxLnRhZyA9IHBOZXctPmluZm8uUGFyYW1zODAyMWRxLnRhZ190eXBlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBlU0lSX1NVQ0NFU1M7Cit9CisKK3ZvaWQgQ29udmVydFRTRGVsYXkodHBBbmlTaXJHbG9iYWwgICAgcE1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY1RzRGVsYXlJRSAqcE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdERvdDExZklFVFNEZWxheSAqcE5ldykKK3sKKyAgICBwT2xkLT50eXBlICAgPSBET1QxMUZfRUlEX1RTREVMQVk7CisgICAgcE9sZC0+bGVuZ3RoID0gNFU7CisgICAgcE9sZC0+ZGVsYXkgID0gcE5ldy0+ZGVsYXk7Cit9CisKK3ZvaWQgQ29udmVydFNjaGVkdWxlKHRwQW5pU2lyR2xvYmFsICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY1NjaGVkdWxlSUUgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVTY2hlZHVsZSAqcE5ldykKK3sKKyAgICBwT2xkLT50eXBlICAgICAgICAgICAgID0gRE9UMTFGX0VJRF9TQ0hFRFVMRTsKKyAgICBwT2xkLT5sZW5ndGggICAgICAgICAgID0gRE9UMTFGX0lFX1NDSEVEVUxFX01JTl9MRU47CisKKyAgICBwT2xkLT5pbmZvLmFnZ3JlZ2F0aW9uID0gcE5ldy0+YWdncmVnYXRpb247CisgICAgcE9sZC0+aW5mby50c2lkICAgICAgICA9IHBOZXctPnRzaWQ7CisgICAgcE9sZC0+aW5mby5kaXJlY3Rpb24gICA9IHBOZXctPmRpcmVjdGlvbjsKKworICAgIHBPbGQtPnN2Y1N0YXJ0VGltZSAgICAgPSBwTmV3LT5zZXJ2aWNlX3N0YXJ0X3RpbWU7CisgICAgcE9sZC0+c3ZjSW50ZXJ2YWwgICAgICA9IHBOZXctPnNlcnZpY2VfaW50ZXJ2YWw7CisgICAgcE9sZC0+c3BlY0ludGVydmFsICAgICA9IHBOZXctPnNwZWNfaW50ZXJ2YWw7Cit9CisKK3ZvaWQgQ29udmVydFdNTVNjaGVkdWxlKHRwQW5pU2lyR2xvYmFsICAgICAgICBwTWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY1NjaGVkdWxlSUUgICAgKnBPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RG90MTFmSUVXTU1TY2hlZHVsZSAqcE5ldykKK3sKKyAgICBwT2xkLT50eXBlICAgICAgICAgICAgID0gRE9UMTFGX0VJRF9XTU1TQ0hFRFVMRTsKKyAgICBwT2xkLT5sZW5ndGggICAgICAgICAgID0gRE9UMTFGX0lFX1dNTVNDSEVEVUxFX01JTl9MRU47CisKKyAgICBwT2xkLT5pbmZvLmFnZ3JlZ2F0aW9uID0gcE5ldy0+YWdncmVnYXRpb247CisgICAgcE9sZC0+aW5mby50c2lkICAgICAgICA9IHBOZXctPnRzaWQ7CisgICAgcE9sZC0+aW5mby5kaXJlY3Rpb24gICA9IHBOZXctPmRpcmVjdGlvbjsKKworICAgIHBPbGQtPnN2Y1N0YXJ0VGltZSAgICAgPSBwTmV3LT5zZXJ2aWNlX3N0YXJ0X3RpbWU7CisgICAgcE9sZC0+c3ZjSW50ZXJ2YWwgICAgICA9IHBOZXctPnNlcnZpY2VfaW50ZXJ2YWw7CisgICAgcE9sZC0+c3BlY0ludGVydmFsICAgICA9IHBOZXctPnNwZWNfaW50ZXJ2YWw7Cit9CisKKy8qKgorICAgIEBicmllZiAgIDogICAgVGhpcyBmdW5jdGlvbnMgY29udmVydHMgdGhlIGdpdmVuIGJ1ZmZlciB0aWxsIGdpdmVuIHNpemUgdG8gQmlnIGVuZGlhbiBmb3JtYXQgYXNzdW1pbmcgdGhlIAorICAgICAgICAgICAgICAgICAgICAgYnVzIGlzIDMyIGJpdC4gVGhlIHNpemUgc2hvdWxkIGJlIGZvdXIgYnl0ZSBhbGlnbmVkLgorICAgIEBwYXJhbSA6ICAgIHB0ciB0byBiZSBjb252ZXJ0ZWQsIHNpemUKKyAgICBAcmV0dXJuICA6ICAgIHZvaWQKKyovCisKK3ZvaWQgQ29udmVydHRvQmlnRW5kaWFuKHZvaWQgKnB0ciwgdEFOSV9VMTYgICAgc2l6ZSkKK3sKKyAgICB0QU5JX1U4ICAgICAgICAqdGVtcF9wdHI7CisgICAgdEFOSV9VMzIgICAgKmRlc3RfcHRyOworCisgICAgZGVzdF9wdHIgID0gKHRBTklfVTMyICopcHRyOworICAgIHdoaWxlKHNpemUpCisgICAgeworICAgICAgICB0ZW1wX3B0ciA9ICh0QU5JX1U4ICopIGRlc3RfcHRyOworICAgICAgICAqZGVzdF9wdHIgPSAodGVtcF9wdHJbMF0gPDwgMjQpIHwgKHRlbXBfcHRyWzFdIDw8IDE2KSB8ICh0ZW1wX3B0clsyXSA8PCA4KSB8IHRlbXBfcHRyWzNdOworICAgICAgICBkZXN0X3B0cisrOworICAgICAgICBzaXplIC09IDQ7CisgICAgfQorfQorCisKK3ZvaWQgQ3JlYXRlU2NhbkRhdGFOdWxsRnJhbWUodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1hY01nbXRIZHIgKm1hY01nbXRIZHIsCisgICAgICAgICAgICAgICAgICB0QU5JX1U4IHB3ck1nbXQsIHRTaXJNYWNBZGRyIGJzc2lkLCB0U2lyTWFjQWRkciBzZWxmTWFjQWRkcikKK3sKKworICAgIG1hY01nbXRIZHItPmZjLnR5cGUgPSBTSVJfTUFDX0RBVEFfRlJBTUU7CisgICAgbWFjTWdtdEhkci0+ZmMuc3ViVHlwZSA9IFNJUl9NQUNfREFUQV9OVUxMOworICAgIG1hY01nbXRIZHItPmZjLnByb3RWZXIgPSBTSVJfTUFDX1BST1RPQ09MX1ZFUlNJT047CisgICAgbWFjTWdtdEhkci0+ZmMub3JkZXIgPSAwOworICAgIG1hY01nbXRIZHItPmZjLndlcCA9IDA7CisgICAgbWFjTWdtdEhkci0+ZmMubW9yZURhdGEgPTA7CisgICAgbWFjTWdtdEhkci0+ZmMucG93ZXJNZ210ID0gcHdyTWdtdDsKKyAgICBtYWNNZ210SGRyLT5mYy5yZXRyeSA9IDA7CisgICAgbWFjTWdtdEhkci0+ZmMubW9yZUZyYWcgPSAwOworICAgIG1hY01nbXRIZHItPmZjLmZyb21EUyA9IDA7CisgICAgbWFjTWdtdEhkci0+ZmMudG9EUyA9IDA7CisgICAgbWFjTWdtdEhkci0+ZHVyYXRpb25MbyA9ICh0QU5JX1U4KSAoU0lSX01BQ19NQVhfRFVSQVRJT05fTUlDUk9fU0VDT05EUyAmIDB4ZmYpOworICAgIG1hY01nbXRIZHItPmR1cmF0aW9uSGkgPSAodEFOSV9VOCkgKChTSVJfTUFDX01BWF9EVVJBVElPTl9NSUNST19TRUNPTkRTICYgMHhmZjAwKSA+PiA4KTsKKyAgICBtYWNNZ210SGRyLT5zZXFDb250cm9sLmZyYWdOdW0gPSAwOworICAgIG1hY01nbXRIZHItPnNlcUNvbnRyb2wuc2VxTnVtTG8gPSAwOworICAgIG1hY01nbXRIZHItPnNlcUNvbnRyb2wuc2VxTnVtSGkgPSAyOworICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikmbWFjTWdtdEhkci0+ZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopJm1hY01nbXRIZHItPnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSZtYWNNZ210SGRyLT5ic3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYnNzaWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgIAorICAgIHJldHVybjsKK30KKworCit2b2lkIENyZWF0ZVNjYW5DdHNGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjTWdtdEhkciAqbWFjTWdtdEhkciwgdFNpck1hY0FkZHIgc2VsZk1hYykKK3sKKyAgICBtYWNNZ210SGRyLT5mYy50eXBlID0gU0lSX01BQ19DVFJMX0ZSQU1FOworICAgIG1hY01nbXRIZHItPmZjLnN1YlR5cGUgPSBTSVJfTUFDX0NUUkxfQ1RTOworICAgIG1hY01nbXRIZHItPmZjLm9yZGVyID0gMDsKKyAgICBtYWNNZ210SGRyLT5mYy53ZXAgPSAwOworICAgIG1hY01nbXRIZHItPmZjLm1vcmVEYXRhID0wOworICAgIG1hY01nbXRIZHItPmZjLnBvd2VyTWdtdCA9IDA7ICAKKyAgICBtYWNNZ210SGRyLT5mYy5yZXRyeSA9IDA7CisgICAgbWFjTWdtdEhkci0+ZmMubW9yZUZyYWcgPSAwOworICAgIG1hY01nbXRIZHItPmZjLmZyb21EUyA9IDA7CisgICAgbWFjTWdtdEhkci0+ZmMudG9EUyA9IDA7CisgICAgbWFjTWdtdEhkci0+ZHVyYXRpb25MbyA9ICh0QU5JX1U4KSAoU0lSX01BQ19NQVhfRFVSQVRJT05fTUlDUk9fU0VDT05EUyAmIDB4ZmYpOworICAgIG1hY01nbXRIZHItPmR1cmF0aW9uSGkgPSAodEFOSV9VOCkgKChTSVJfTUFDX01BWF9EVVJBVElPTl9NSUNST19TRUNPTkRTICYgMHhmZjAwKSA+PiA4KTsKKyAgICBwYWxDb3B5TWVtb3J5KHBNYWMtPmhIZGQsICh2b2lkICopbWFjTWdtdEhkci0+ZGEsICh2b2lkICopc2VsZk1hYywgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICAgICAgICAgICAKKyAgICByZXR1cm47Cit9CisKKworCisKKworCisKKy8qKgorICAgIEBicmllZiAgICA6ICAgIFRoaXMgZnVuY3Rpb25zIGNyZWF0ZXMgYSBEQVRBX05VTEwvQ1RTMlNFTEYgZnJhbWUgaW4gQmlnIGVuZGlhbiBmb3JtYXQgCisgICAgQHBhcmFtICAgIDogICAgR2xvYmFsIE1BQyBzdHJ1Y3R1cmUsIHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBjcmVhdGVkIHBhY2tldCwgcm9sZSB3aGljaCBpcyBTdGF0aW9uL0FQCisgICAgQHJldHVybiAgICA6ICAgIHZvaWQKKyovCisKK3ZvaWQgQ3JlYXRlSW5pdFNjYW5SYXdGcmFtZSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTWFjTWdtdEhkciAqbWFjTWdtdEhkciwgdEJzc1N5c3RlbVJvbGUgcm9sZSkKK3sKKyNpZiAwCisgICAgdHBTdGFTdHJ1Y3QgcFN0YSA9ICh0cFN0YVN0cnVjdCkgcE1hYy0+aGFsLmhhbE1hYy5zdGFUYWJsZTsKKyAgICAKKyAgICBpZiAocm9sZSA9PSBlU1lTVEVNX1NUQV9ST0xFKQorICAgIHsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMudHlwZSA9IFNJUl9NQUNfREFUQV9GUkFNRTsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMuc3ViVHlwZSA9IFNJUl9NQUNfREFUQV9OVUxMOworICAgICAgICBtYWNNZ210SGRyLT5mYy5wcm90VmVyID0gU0lSX01BQ19QUk9UT0NPTF9WRVJTSU9OOworICAgICAgICBtYWNNZ210SGRyLT5mYy5vcmRlciA9IDA7CisgICAgICAgIG1hY01nbXRIZHItPmZjLndlcCA9IDA7CisgICAgICAgIG1hY01nbXRIZHItPmZjLm1vcmVEYXRhID0wOworICAgICAgICBtYWNNZ210SGRyLT5mYy5wb3dlck1nbXQgPSAxOyAgLy8gTmVlZGVkIGZvciBzdGF0aW9uCisgICAgICAgIG1hY01nbXRIZHItPmZjLnJldHJ5ID0gMDsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMubW9yZUZyYWcgPSAwOworICAgICAgICBtYWNNZ210SGRyLT5mYy5mcm9tRFMgPSAwOworICAgICAgICBtYWNNZ210SGRyLT5mYy50b0RTID0gMTsKKyAgICAgICAgbWFjTWdtdEhkci0+ZHVyYXRpb25MbyA9ICh0QU5JX1U4KSAoU0lSX01BQ19NQVhfRFVSQVRJT05fTUlDUk9fU0VDT05EUyAmIDB4ZmYpOworICAgICAgICBtYWNNZ210SGRyLT5kdXJhdGlvbkhpID0gKHRBTklfVTgpICgoU0lSX01BQ19NQVhfRFVSQVRJT05fTUlDUk9fU0VDT05EUyAmIDB4ZmYwMCkgPj4gOCk7CisgICAgICAgIG1hY01nbXRIZHItPnNlcUNvbnRyb2wuZnJhZ051bSA9IDA7CisgICAgICAgIG1hY01nbXRIZHItPnNlcUNvbnRyb2wuc2VxTnVtTG8gPSAwOworICAgICAgICBtYWNNZ210SGRyLT5zZXFDb250cm9sLnNlcU51bUhpID0gMjsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKSZtYWNNZ210SGRyLT5kYSwgKHZvaWQgKilwU3RhWzBdLmJzc0lkLCA2KTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAmbWFjTWdtdEhkci0+c2EsIHBTdGFbMF0uc3RhQWRkciwgNik7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKikmbWFjTWdtdEhkci0+YnNzSWQsICh2b2lkICopcFN0YVswXS5ic3NJZCwgNik7CisgICAgfQorICAgIGVsc2UgaWYgKHJvbGUgPT0gZVNZU1RFTV9BUF9ST0xFIHx8IHJvbGUgPT0gZVNZU1RFTV9TVEFfSU5fSUJTU19ST0xFKQorICAgIHsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMudHlwZSA9IFNJUl9NQUNfQ1RSTF9GUkFNRTsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMuc3ViVHlwZSA9IFNJUl9NQUNfQ1RSTF9DVFM7CisgICAgICAgIG1hY01nbXRIZHItPmZjLm9yZGVyID0gMDsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMud2VwID0gMDsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMubW9yZURhdGEgPTA7CisgICAgICAgIG1hY01nbXRIZHItPmZjLnBvd2VyTWdtdCA9IDA7ICAvLyBOZWVkZWQgZm9yIHN0YXRpb24KKyAgICAgICAgbWFjTWdtdEhkci0+ZmMucmV0cnkgPSAwOworICAgICAgICBtYWNNZ210SGRyLT5mYy5tb3JlRnJhZyA9IDA7CisgICAgICAgIG1hY01nbXRIZHItPmZjLmZyb21EUyA9IDA7CisgICAgICAgIG1hY01nbXRIZHItPmZjLnRvRFMgPSAwOworICAgICAgICBtYWNNZ210SGRyLT5kdXJhdGlvbkxvID0gKHRBTklfVTgpIChTSVJfTUFDX01BWF9EVVJBVElPTl9NSUNST19TRUNPTkRTICYgMHhmZik7CisgICAgICAgIG1hY01nbXRIZHItPmR1cmF0aW9uSGkgPSAodEFOSV9VOCkgKChTSVJfTUFDX01BWF9EVVJBVElPTl9NSUNST19TRUNPTkRTICYgMHhmZjAwKSA+PiA4KTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKW1hY01nbXRIZHItPmRhLCAodm9pZCAqKXBTdGFbMF0uc3RhQWRkciwgNik7CisgICAgfQorICAgIHJldHVybjsKKyNlbmRpZgorfQorCisvKioKKyAgICBAYnJpZWYgICAgOiAgICBUaGlzIGZ1bmN0aW9ucyBjcmVhdGVzIGEgREFUQV9OVUxMIGZyYW1lIGluIEJpZyBlbmRpYW4gZm9ybWF0IAorICAgIEBwYXJhbSAgICA6ICAgIEdsb2JhbCBNQUMgc3RydWN0dXJlLCBwb2ludGVyIHRvIHJldHVybiB0aGUgY3JlYXRlZCBwYWNrZXQsIHJvbGUgd2hpY2ggaXMgU3RhdGlvbi9BUAorICAgIEByZXR1cm4gICAgOiAgICB2b2lkCisqLworCisKK3ZvaWQgQ3JlYXRlRmluaXNoU2NhblJhd0ZyYW1lKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNYWNNZ210SGRyICptYWNNZ210SGRyLCB0QnNzU3lzdGVtUm9sZSByb2xlKQoreworI2lmIDAKKyAgICB0cFN0YVN0cnVjdCBwU3RhID0gKHRwU3RhU3RydWN0KSBwTWFjLT5oYWwuaGFsTWFjLnN0YVRhYmxlOworCisgICAgaWYgKHJvbGUgPT0gZVNZU1RFTV9TVEFfUk9MRSkKKyAgICB7CisgICAgICAgIG1hY01nbXRIZHItPmZjLnR5cGUgPSBTSVJfTUFDX0RBVEFfRlJBTUU7CisgICAgICAgIG1hY01nbXRIZHItPmZjLnN1YlR5cGUgPSBTSVJfTUFDX0RBVEFfTlVMTDsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMucHJvdFZlciA9IFNJUl9NQUNfUFJPVE9DT0xfVkVSU0lPTjsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMub3JkZXIgPSAwOworICAgICAgICBtYWNNZ210SGRyLT5mYy53ZXAgPSAwOworICAgICAgICBtYWNNZ210SGRyLT5mYy5tb3JlRGF0YSA9MDsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMucG93ZXJNZ210ID0gMDsgICAgIC8vIE5lZWRlZCBmb3Igc3RhdGlvbgorICAgICAgICBtYWNNZ210SGRyLT5mYy5yZXRyeSA9IDA7CisgICAgICAgIG1hY01nbXRIZHItPmZjLm1vcmVGcmFnID0gMDsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMuZnJvbURTID0gMDsKKyAgICAgICAgbWFjTWdtdEhkci0+ZmMudG9EUyA9IDE7CisgICAgICAgIG1hY01nbXRIZHItPmR1cmF0aW9uTG8gPSAodEFOSV9VOCkgKFNJUl9NQUNfTUFYX0RVUkFUSU9OX01JQ1JPX1NFQ09ORFMgJiAweGZmKTsKKyAgICAgICAgbWFjTWdtdEhkci0+ZHVyYXRpb25IaSA9ICh0QU5JX1U4KSAoKFNJUl9NQUNfTUFYX0RVUkFUSU9OX01JQ1JPX1NFQ09ORFMgJiAweGZmMDApID4+IDgpOworICAgICAgICBtYWNNZ210SGRyLT5zZXFDb250cm9sLmZyYWdOdW0gPSAwOworICAgICAgICBtYWNNZ210SGRyLT5zZXFDb250cm9sLnNlcU51bUxvID0gMDsKKyAgICAgICAgbWFjTWdtdEhkci0+c2VxQ29udHJvbC5zZXFOdW1IaSA9IDI7CisgICAgICAgIHBhbENvcHlNZW1vcnkocE1hYy0+aEhkZCwgKHZvaWQgKiltYWNNZ210SGRyLT5kYSwgKHZvaWQgKilwU3RhWzBdLmJzc0lkLCA2KTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCBtYWNNZ210SGRyLT5zYSwgcFN0YVswXS5zdGFBZGRyLCA2KTsKKyAgICAgICAgcGFsQ29weU1lbW9yeShwTWFjLT5oSGRkLCAodm9pZCAqKW1hY01nbXRIZHItPmJzc0lkLCAodm9pZCAqKXBTdGFbMF0uYnNzSWQsIDYpOworCisgICAgfQorICAgIAorICAgIHJldHVybjsKKyNlbmRpZgorfQorCisKKy8vIHV0aWxzUGFyc2VyLmMgZW5kcyBoZXJlLgpkaWZmIC0tZ2l0IGEvQ09SRS9UTC9pbmMvdGxEZWJ1Zy5oIGIvQ09SRS9UTC9pbmMvdGxEZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTY0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1RML2luYy90bERlYnVnLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19UTF9ERUJVR19IX18KKyNkZWZpbmUgX19UTF9ERUJVR19IX18KKyNpZiAoIWRlZmluZWQgQU5JX09TX1RZUEVfT1NYICYmICFkZWZpbmVkIChBTklfT1NfVFlQRV9BTkRST0lEKSkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisjaWZkZWYgV0xBTl9ERUJVRworI2lmZGVmIFdMQU5fTURNX0RBVEFQQVRIX09QVAorI2RlZmluZSBUTExPR1AoeDApICB4MAorI2RlZmluZSBUTExPR0UoeDApICB4MAorI2RlZmluZSBUTExPR1coeDApICB4MAorI2RlZmluZSBUTExPRzEoeCkgIHt9CisjZGVmaW5lIFRMTE9HMih4KSAge30KKyNkZWZpbmUgVExMT0czKHgpICB7fQorI2RlZmluZSBUTExPRzQoeCkgIHt9CisKKyNlbHNlIC8qV0xBTl9NRE1fREFUQVBBVEhfT1BUKi8KKworI2RlZmluZSBUTExPR1AoeDApICB4MAorI2RlZmluZSBUTExPR0UoeDApICB4MAorI2RlZmluZSBUTExPR1coeDApICB4MAorI2RlZmluZSBUTExPRzEoeDApICB4MAorCisjaWZkZWYgVExfREVCVUdfTE9HMgorI2RlZmluZSBUTExPRzIoeDApICB4MAorI2Vsc2UKKyAjZGVmaW5lIFRMTE9HMih4MCkKKyNlbmRpZgorCisjaWZkZWYgVExfREVCVUdfTE9HMworI2RlZmluZSBUTExPRzMoeDApICB4MAorI2Vsc2UKKyAjZGVmaW5lIFRMTE9HMyh4MCkKKyNlbmRpZgorCisjaWZkZWYgVExfREVCVUdfTE9HNAorI2RlZmluZSBUTExPRzQoeDApICB4MAorI2Vsc2UKKyAjZGVmaW5lIFRMTE9HNCh4MCkKKyNlbmRpZgorCisKKyNlbmRpZiAvKldMQU5fTURNX0RBVEFQQVRIX09QVCovCisKKyNlbHNlIC8qIFdMQU4gREVCVUcgKi8KKworI2RlZmluZSBUTExPR1AoeCkgIHgKKyNkZWZpbmUgVExMT0dFKHgpICB7fQorI2RlZmluZSBUTExPR1coeCkgIHt9CisjZGVmaW5lIFRMTE9HMSh4KSAge30KKyNkZWZpbmUgVExMT0cyKHgpICB7fQorI2RlZmluZSBUTExPRzMoeCkgIHt9CisjZGVmaW5lIFRMTE9HNCh4KSAge30KKyNlbmRpZiAvKiBXTEFOIERFQlVHICovCisKKworI2VuZGlmIC8vIF9fVExfREVCVUdfSF9fCisKZGlmZiAtLWdpdCBhL0NPUkUvVEwvaW5jL3dsYW5fcWN0X3RsLmggYi9DT1JFL1RML2luYy93bGFuX3FjdF90bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDQwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1RML2luYy93bGFuX3FjdF90bC5oCkBAIC0wLDAgKzEsMjQ0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiAqLworCisjaWZuZGVmIFdMQU5fUUNUX1dMQU5UTF9ICisjZGVmaW5lIFdMQU5fUUNUX1dMQU5UTF9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgIFcgTCBBIE4gICBUIFIgQSBOIFMgUCBPIFIgVCAgIEwgQSBZIEUgUiAKKyAgICAgICAgICAgICAgICAgICAgICAgRSBYIFQgRSBSIE4gQSBMICBBIFAgSQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIAorREVTQ1JJUFRJT04KKyAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBleHRlcm5hbCBBUEkgZXhwb3NlZCBieSB0aGUgd2xhbiB0cmFuc3BvcnQgbGF5ZXIgCisgIG1vZHVsZS4KKyAgCisgICAgICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKK3doZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDEvMDgvMTAgICAgbHRpICAgICBBZGRlZCBUTCBEYXRhIENhY2hpbmcgCisxMC8xNS8wOSAgICBybmFpciAgIE1vZGlmeWluZyBTVEFEZXNjVHlwZSBzdHJ1Y3QKKzEwLzA2LzA5ICAgIHJuYWlyICAgQWRkaW5nIHN1cHBvcnQgZm9yIFdBUEkgCiswOS8yMi8wOSAgICBsdGkgICAgIEFkZCBkZXJlZ2lzdHJhdGlvbiBBUEkgZm9yIG1hbmFnZW1lbnQgY2xpZW50CiswMi8wMi8wOSAgICBzY2ggICAgIEFkZCBIYW5kb2ZmIHN1cHBvcnQKKzEyLzA5LzA4ICAgIGx0aSAgICAgRml4ZXMgZm9yIEFNU1MgY29tcGlsYXRpb24gCiswOS8wNS8wOCAgICBsdGkgICAgIEZpeGVzIGFmdGVyIFFPUyB1bml0IHRlc3RpbmcgCiswOC8wNi8wOCAgICBsdGkgICAgIEFkZGVkIFFPUyBzdXBwb3J0IAorMDUvMDEvMDggICAgbHRpICAgICBDcmVhdGVkIG1vZHVsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUyBGT1IgTU9EVUxFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAidm9zX2FwaS5oIiAKKyNpbmNsdWRlICJ2b3NfcGFja2V0LmgiIAorI2luY2x1ZGUgInNpckFwaS5oIgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNpbmNsdWRlICJjc3JBcGkuaCIKKyNpbmNsdWRlICJzYXBBcGkuaCIKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyAjZW5kaWYgCisgCisvKk9mZnNldCBvZiB0aGUgT1VJIGZpZWxkIGluc2lkZSB0aGUgTExDL1NOQVAgaGVhZGVyKi8KKyNkZWZpbmUgV0xBTlRMX0xMQ19PVUlfT0ZGU0VUICAgICAgICAgICAgICAgICAzCisKKy8qU2l6ZSBvZiB0aGUgT1VJIHR5cGUgZmllbGQgaW5zaWRlIHRoZSBMTEMvU05BUCBoZWFkZXIqLworI2RlZmluZSBXTEFOVExfTExDX09VSV9TSVpFICAgICAgICAgICAgICAgICAgIDMKKworLypPZmZzZXQgb2YgdGhlIExMQy9TTkFQIGhlYWRlciovCisjZGVmaW5lIFdMQU5UTF9MTENfU05BUF9PRkZTRVQgICAgICAgICAgICAgICAgMAorCisvKlNpemUgb2YgdGhlIExMQy9TTkFQIGhlYWRlciovCisjZGVmaW5lIFdMQU5UTF9MTENfU05BUF9TSVpFICAgICAgICAgICAgICAgICAgIDgKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgR0VORVJJQyBTVFJVQ1RVUkVTIC0gbm90IGJlbG9uZ2luZyB0byBUTCAKKyAqICAgICBUTyBCRSBNT1ZFRCBUTyBBIEdMT0JBTCBIRUFERVIKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qTWF4aW11bSBudW1iZXIgb2YgQUNzICovCisjZGVmaW5lIFdMQU5UTF9NQVhfQUMgICAgICAgICAgICAgICAgICAgICAgICAgNAorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorCisvKiBCaXQgTWFzayB0byByZXByZXNlbnQgQWxsIFN0YXRpb25zICovCisjZGVmaW5lIFdMQU5fQUxMX1NUQSAgICAgICAgICAgICAgICAgICAgICAgICAweEZGCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHN0YXRpb24gc3VwcG9ydGVkIGJ5IFRMLCBpbmNsdWRpbmcgQkMuICovCisjZGVmaW5lIFdMQU5fTUFYX1NUQV9DT1VOVCAgKEhBTF9OVU1fU1RBKQorCisvKiBUaGUgc3ltYm9saWMgc3RhdGlvbiBJRCByZXR1cm4gdG8gSEREIHRvIHNwZWNpZnkgdGhlIHBhY2tldCBpcyBiYy9tYyAqLworI2RlZmluZSBXTEFOX1JYX0JDTUNfU1RBX0lEIChXTEFOX01BWF9TVEFfQ09VTlQgKyAxKQorCisvKiBUaGUgc3ltYm9saWMgc3RhdGlvbiBJRCByZXR1cm4gdG8gSEREIHRvIHNwZWNpZnkgdGhlIHBhY2tldCBpcyB0byBzb2Z0LUFQIGl0c2VsZiAqLworI2RlZmluZSBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRCAoV0xBTl9NQVhfU1RBX0NPVU5UICsgMikKKworLyogVXNlZCBieSBIRFMgc3lzdG1lLiBUaGlzIHN0YXRpb24gSUQgaXMgdXNlZCBieSBUTCB0byB0ZWxsIHVwcGVyIGxheWVyIHRoYXQKKyAgIHRoaXMgcGFja2V0IGlzIGZvciBXRFMgYW5kIG5vdCBmb3IgYSBsb29wYmFjayBmb3IgYW4gYXNzb2NpYXRlZCBzdGF0aW9uLiAqLworI2RlZmluZSBXTEFOVExfUlhfV0RTX1NUQUlEIFdMQU5fTUFYX1NUQV9DT1VOVAorCisvKiBTdGF0aW9uIElEIHVzZWQgZm9yIEJDIHRyYWZmaWMuIFRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIHdoZW4gdXBwZXIgbGF5ZXIgcmVnaXN0ZXJzCisgICB0aGUgYnJvYWRjYXN0IGNsaWVudCBvciBhbGxvY2F0ZSBzdGF0aW9uIHN0cmN1dHVyZSB0byBrZWVwIHBlci1zdGF0aW9uIGluZm8uKi8KKy8vI2RlZmluZSBXTEFOVExfQkNfU1RBX0lEICAweDAwCisKKyNlbmRpZgorCisjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TCisjZGVmaW5lIFdMQU5UTF9NQVhfVElEICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBBY2Nlc3MgY2F0ZWdvcnkgZW51bSB1c2VkIGJ5IFRMCisgIC0gb3JkZXIgbXVzdCBiZSBrZXB0IGFzIHRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBzZXR1cCB0aGUgQUMgbWFzaworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICBXTEFOVExfQUNfQksgPSAwLAorICBXTEFOVExfQUNfQkUgPSAxLAorICBXTEFOVExfQUNfVkkgPSAyLAorICBXTEFOVExfQUNfVk8gPSAzCit9V0xBTlRMX0FDRW51bVR5cGU7IAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBTVEEgVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAvKiBJbmRpY2F0ZXMgYSBsaW5rIHRvIGFuIEFQKi8KKyAgV0xBTl9TVEFfSU5GUkEgID0gMCwgIAorCisgIC8qIEFELWhvYyBsaW5rKi8KKyAgV0xBTl9TVEFfSUJTUywgICAKKworICAvKiBCVC1BTVAgbGluayovCisgIFdMQU5fU1RBX0JUX0FNUCwKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgLyogU29mdEFQIHN0YXRpb24gKi8KKyAgV0xBTl9TVEFfU09GVEFQLAorI2VuZGlmCisKKyAgLyogSW52YWxpZCBsaW5rKi8KKyAgV0xBTl9TVEFfTUFYCisKK31XTEFOX1NUQVR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEJBUCBNYW5hZ2VtZW50IGZyYW1lIHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICAvKiBCVC1BTVAgcGFja2V0IG9mIHR5cGUgZGF0YSAqLworICAgIFdMQU5UTF9CVF9BTVBfVFlQRV9EQVRBID0gMHgwMDAxLAorCisgICAgLyogQlQtQU1QIHBhY2tldCBvZiB0eXBlIGFjdGl2aXR5IHJlcG9ydCAqLworICAgIFdMQU5UTF9CVF9BTVBfVFlQRV9BUiA9IDB4MDAwMiwKKworICAgIC8qIEJULUFNUCBwYWNrZXQgb2YgdHlwZSBzZWN1cml0eSBmcmFtZSAqLworICAgIFdMQU5UTF9CVF9BTVBfVFlQRV9TRUMgPSAweDAwMDMsCisKKyAgICAvKiBCVC1BTVAgcGFja2V0IG9mIHR5cGUgTGluayBTdXBlcnZpc2lvbiByZXF1ZXN0IGZyYW1lICovCisgICAgV0xBTlRMX0JUX0FNUF9UWVBFX0xTX1JFUSA9IDB4MDAwNCwKKworICAgIC8qIEJULUFNUCBwYWNrZXQgb2YgdHlwZSBMaW5rIFN1cGVydmlzaW9uIHJlcGx5IGZyYW1lICovCisgICAgV0xBTlRMX0JUX0FNUF9UWVBFX0xTX1JFUCA9IDB4MDAwNSwKKworICAgIC8qIEludmFsaWQgRnJhbWUgKi8KKyAgICBXTEFOVExfQkFQX0lOVkFMSURfRlJBTUUKKworfSBXTEFOVExfQkFQRnJhbWVFbnVtVHlwZTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKy8qIFR5cGUgdXNlZCB0byBzcGVjaWZ5IExXTSB0aHJlc2hvbGQgdW5pdCAqLwordHlwZWRlZiBlbnVtICB7CisgICAgV0xBTl9MV01fVEhSRVNIT0xEX0JZVEUgPSAwLAorCisgICAgV0xBTl9MV01fVEhSRVNIT0xEX1BBQ0tFVAorfSBXTEFOX0xXTV9UaHJlc2hvbGRfVHlwZTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUTCBTdGF0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgLyogVHJhbnNpdGlvbiBpbiB0aGlzIHN0YXRlIG1hZGUgdXBvbiBjcmVhdGlvbiovCisgIFdMQU5UTF9TVEFfSU5JVCA9IDAsCisKKyAgLyogVHJhbnNpdGlvbiBoYXBwZW5zIGFmdGVyIEFzc29jIHN1Y2Nlc3MgaWYgc2Vjb25kIGxldmVsIGF1dGhlbnRpY2F0aW9uCisgICAgIGlzIG5lZWRlZCovCisgIFdMQU5UTF9TVEFfQ09OTkVDVEVELAorCisgIC8qIFRyYW5zaXRpb24gaGFwcGVucyB3aGVuIHNlY29uZCBsZXZlbCBhdXRoIGlzIHN1Y2Nlc3NmdWwgYW5kIGtleXMgYXJlCisgICAgIHByb3Blcmx5IGluc3RhbGxlZCAqLworICBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQsCisKKyAgLyogVHJhbnNpdGlvbiBoYXBwZW5zIHdoZW4gY29ubmVjdGl2aXR5IGlzIGxvc3QqLworICBXTEFOVExfU1RBX0RJU0NPTk5FQ1RFRCwKKworICBXTEFOVExfU1RBX01BWF9TVEFURQorfVdMQU5UTF9TVEFTdGF0ZVR5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU1RBIERlc2NyaXB0b3IgVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qU1RBIHVuaXF1ZSBpZGVudGlmaWVyLCBvcmlnaW5hdGluZyBmcm9tIEhBTCovCisgIHZfVThfdCAgICAgICAgIHVjU1RBSWQ7IAorCisgIC8qU1RBIE1BQyBBZGRyZXNzKi8KKyAgdl9NQUNBRERSX3QgICAgdlNUQU1BQ0FkZHJlc3M7IAorCisgIC8qQlNTSUQgZm9yIElCU1MqLworICB2X01BQ0FERFJfdCAgICB2QlNTSURmb3JJQlNTOyAKKworICAvKlNlbGYgTUFDIEFkZHJlc3MqLworICB2X01BQ0FERFJfdCAgICB2U2VsZk1BQ0FkZHJlc3M7CisKKyAgLypUeXBlIG9mIHRoZSBTVEEqLworICBXTEFOX1NUQVR5cGUgICB3U1RBVHlwZTsgCisKKyAgLypmbGFnIGZvciBzZXR0aW5nIHRoZSBzdGF0ZSBvZiB0aGUgUU9TIGZvciB0aGUgbGluayovCisgIHZfVThfdCAgICAgICAgIHVjUW9zRW5hYmxlZDsKKworICAvKmVuYWJsZSBGVCBpbiBUTCAqLworICB2X1U4X3QgICAgICAgICB1Y1N3RnJhbWVUWFhsYXRpb247IAorICB2X1U4X3QgICAgICAgICB1Y1N3RnJhbWVSWFhsYXRpb247CisKKyAgLypGbGFnIGZvciBzaWduYWxpbmcgVEwgaWYgTExDIGhlYWRlciBuZWVkcyB0byBiZSBhZGRlZCBmb3Igb3V0Z29pbmcgCisgICAgcGFja2V0cyovCisgIHZfVThfdCAgICAgICAgIHVjQWRkUm12TExDOworCisgLypGbGFnIGZvciBzaWduYWxpbmcgaWYgdGhlIHByaXZhY3kgYml0IG5lZWRzIHRvIGJlIHNldCovCisgIHZfVThfdCAgICAgICAgIHVjUHJvdGVjdGVkRnJhbWU7CisKKyAvKkRQVSBTaWduYXR1cmUgdXNlZCBmb3IgdW5pY2FzdCBkYXRhIC0gdXNlZCBmb3IgZGF0YSBjYWNoaW5nKi8KKyAgdl9VOF90ICAgICAgICAgICAgICB1Y1VjYXN0U2lnOworIC8qRmxhZyB0byBpbmRpY2F0ZSBpZiBTVEEgaXMgYSBXQVBJIFNUQSovCisgIHZfVThfdCAgICAgICAgIHVjSXNXYXBpU3RhOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorIC8qRmxhZyB0byBpbmRpY2F0ZSBpZiBTVEEgaXMgYSBDQ1ggU1RBKi8KKyAgdl9VOF90ICAgICAgICAgdWNJc0NjeFN0YTsKKyNlbmRpZgorCisgIC8qRFBVIFNpZ25hdHVyZSB1c2VkIGZvciBicm9hZGNhc3QgZGF0YSAtIHVzZWQgZm9yIGRhdGEgY2FjaGluZyovCisgIHZfVThfdCAgICAgICAgICAgICAgdWNCY2FzdFNpZzsKKworICAvKkluaXRpYWwgc3RhdGUgYXQgd2hpY2ggdGhlIFNUQSBzaG91bGQgYmUgYnJvdWdodCB1cCB0byovCisgIFdMQU5UTF9TVEFTdGF0ZVR5cGUgdWNJbml0U3RhdGU7CisjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TCisgLyogMSBtZWFucyByZXBsYXkgY2hlY2sgaXMgbmVlZGVkIGZvciB0aGUgc3RhdGlvbiwKKyAgICAwIG1lYW5zIHJlcGxheSBjaGVjayBpcyBub3QgbmVlZGVkIGZvciB0aGUgc3RhdGlvbiovIAorICB2X0JPT0xfdCAgICAgIHVjSXNSZXBsYXlDaGVja1ZhbGlkOyAKKyNlbmRpZgorfVdMQU5fU1RBRGVzY1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRMIENvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgCit0eXBlZGVmIHN0cnVjdAoreworICAvKkFDIHdlaWdodCBmb3IgV0ZRKi8KKyAgdl9VOF90ICAgdWNBY1dlaWdodHNbV0xBTlRMX01BWF9BQ107IAorCisgIC8qRGVsYXllZCB0cmlnZ2VyIGZyYW1lIHRpbW1lcjogLSB1c2VkIGJ5IFRMIHRvIHNlbmQgdHJpZ2dlciBmcmFtZXMgbGVzcyAKKyAgICBvZnRlbiB3aGVuIGl0IGhhcyBlc3RhYmxpc2hlZCB0aGF0IHRoZSBBcHAgaXMgc3VzcGVuZGVkKi8KKyAgdl9VMzJfdCAgdURlbGF5ZWRUcmlnZ2VyRnJtSW50OyAgCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgIC8qIE1pbiBUaHJlc2hvbGQgZm9yIFByb2Nlc3NpbmcgRnJhbWVzIGluIFRMICovCisgIHZfVThfdCAgIHVNaW5GcmFtZXNQcm9jVGhyZXM7CisjZW5kaWYKK31XTEFOVExfQ29uZmlnSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRTUEVDIERpcmVjdGlvbiBFbnVtIFR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgLyogdXBsaW5rICovCisgIFdMQU5UTF9UWF9ESVIgPSAwLAorCisgIC8qIGRvd25saW5rICovCisgIFdMQU5UTF9SWF9ESVIgPSAxLAorCisgIC8qYmlkaXJlY3Rpb25hbCovCisgIFdMQU5UTF9CSV9ESVIgPSAyLAorfVdMQU5UTF9UU0RpclR5cGU7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgIEdFTkVSSUMgU1RSVUNUVVJFUyAtIEVORAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUTCBFcnJvciBUeXBlIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAKK3R5cGVkZWYgZW51bQoreworICAvKiBHZW5lcmljIGVycm9yICovCisgIFdMQU5UTF9FUlJPUiA9IDAsICAgICAgCisKKyAgLyogTm8gcnggY2FsbGJhY2sgcmVnaXN0ZXJlZCBmb3IgZGF0YSBwYXRoICovCisgIFdMQU5UTF9OT19SWF9EQVRBX0NCLCAgCisKKyAgLyogTm8gcnggY2FsbGJhY2sgcmVnaXN0ZXJlZCBmb3IgbWFuYWdlbWVudCBwYXRoKi8KKyAgV0xBTlRMX05PX1JYX01HTVRfQ0IsICAKKworICAvKiBHZW5lcmljIG1lbW9yeSBlcnJvciovCisgIFdMQU5UTF9NRU1fRVJST1IsICAgICAgCisKKyAgLyogQnVzIGVycm9yIG5vdGlmaWVkIGJ5IEJBTCAqLworICBXTEFOVExfQlVTX0VSUk9SICAgICAgIAorCit9V0xBTlRMX0Vycm9yVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU1RBIHByaW9yaXR5IHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgCit0eXBlZGVmIGVudW0gCit7CisgIC8qIFNUQSBnZXRzIHRvIHR4IGV2ZXJ5IHNlY29uZCByb3VuZCovCisgIFdMQU5UTF9TVEFfUFJJX1ZFUllfTE9XICA9IC0yLCAKKworICAvKiBTVEEgZ2V0cyB0byB0eCBldmVyeSBvdGhlciByb3VuZCovCisgIFdMQU5UTF9TVEFfUFJJX0xPVyAgICAgICA9IC0xLCAKKworICAvKiBTVEEgZ2V0cyB0byB0eCBlYWNoIHRpbWUgKi8KKyAgV0xBTlRMX1NUQV9QUklfTk9STUFMICAgID0gIDAsIAorCisgIC8qIFNUQSBnZXRzIHRvIHR4IHR3aWNlIGVhY2ggdGltZSovIAorICBXTEFOVExfU1RBX1BSSV9ISUdIICAgICAgPSAgMSwgCisKKyAgLyogU1RBIGdldHMgdG8gdHggdGhyZWUgdGltZXMgZWFjaCB0aW1lKi8KKyAgV0xBTlRMX1NUQV9QUklfVkVSWV9ISUdIID0gIDIgIAorCit9V0xBTlRMX1NUQVByaW9yaXR5VHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTWV0YSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQgZnJvbSBIREQgYnkgVEwgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAgIAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogVElEIG9mIHRoZSBwYWNrZXQgYmVpbmcgc2VudCAqLworICB2X1U4X3QgICAgdWNUSUQ7CisKKyAgLyogVVAgb2YgdGhlIHBhY2tldCBiZWluZyBzZW50ICovCisgIHZfVThfdCAgICB1Y1VQOworCisgIC8qIG5vdGlmeWluZyBUTCBpZiB0aGlzIGlzIGFuIEVBUE9MIGZyYW1lIG9yIG5vdCAqLworICB2X1U4X3QgICAgdWNJc0VhcG9sOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgIC8qIG5vdGlmeWluZyBUTCBpZiB0aGlzIGlzIGEgV0FJIGZyYW1lIG9yIG5vdCAqLworICB2X1U4X3QgICAgdWNJc1dhaTsKKyNlbmRpZgorICAvKiBmcmFtZSBpcyA4MDIuMTEgYW5kIGl0IGRvZXMgbm90IG5lZWQgdHJhbnNsYXRpb24gKi8KKyAgdl9VOF90ICAgIHVjRGlzYWJsZUZybVh0bDsKKworICAvKiBmcmFtZSBpcyBicm9hZGNhc3QgKi8KKyAgdl9VOF90ICAgIHVjQmNhc3Q7CisKKyAgLyogZnJhbWUgaXMgbXVsdGljYXN0ICovCisgIHZfVThfdCAgICB1Y01jYXN0OworCisgIC8qIGZyYW1lIHR5cGUgKi8KKyAgdl9VOF90ICAgIHVjVHlwZTsKKworICAvKiB0aW1lc3RhbXAgKi8KKyAgdl9VMTZfdCAgIHVzVGltZVN0YW1wOworCisgIC8qIFNUQSBoYXMgbW9yZSBwYWNrZXRzIHRvIHNlbmQgKi8KKyAgdl9CT09MX3QgIGJNb3JlUGFja2V0czsKK31XTEFOVExfTWV0YUluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNZXRhIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IFRMIHRvIEhERCBvbiByeCBwYXRoICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBVUCBvZiB0aGUgcGFja2V0IGJlaW5nIHNlbnQgKi8KKyAgdl9VOF90ICAgIHVjVVA7CisgIC8qIEFkZHJlc3MgMyBJbmRleCBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0ICovCisgIHZfVTE2X3QgICB1Y0Rlc1NUQUlkOworfVdMQU5UTF9SeE1ldGFJbmZvVHlwZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBIYW5kb2ZmIHN1cHBvcnQgYW5kIHN0YXRpc3RpY3MgZGVmaW5lcyBhbmQgZW51bSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFRocmVzaG9sZCBjcm9zc2VkIGV2ZW50IHR5cGUgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgV0xBTlRMX0hPX1RIUkVTSE9MRF9OQSAgICAweDAwCisjZGVmaW5lIFdMQU5UTF9IT19USFJFU0hPTERfRE9XTiAgMHgwMQorI2RlZmluZSBXTEFOVExfSE9fVEhSRVNIT0xEX1VQICAgIDB4MDIKKyNkZWZpbmUgV0xBTlRMX0hPX1RIUkVTSE9MRF9DUk9TUyAweDA0CisKKy8qIFJlYWx0aW1lIHRyYWZmaWMgc3RhdHVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgIFdMQU5UTF9IT19SVF9UUkFGRklDX1NUQVRVU19PRkYsCisgICBXTEFOVExfSE9fUlRfVFJBRkZJQ19TVEFUVVNfT04KK30gV0xBTlRMX0hPX1JUX1RSQUZGSUNfU1RBVFVTX1RZUEU7CisKKy8qIE5vbi1SZWFsdGltZSB0cmFmZmljIHN0YXR1cyAqLwordHlwZWRlZiBlbnVtCit7CisgICBXTEFOVExfSE9fTlJUX1RSQUZGSUNfU1RBVFVTX09GRiwKKyAgIFdMQU5UTF9IT19OUlRfVFJBRkZJQ19TVEFUVVNfT04KK30gV0xBTlRMX0hPX05SVF9UUkFGRklDX1NUQVRVU19UWVBFOworCisvKiBTdGF0aXN0aWNzIHR5cGUgVEwgc3VwcG9ydGVkICovCit0eXBlZGVmIGVudW0KK3sKKyAgIFdMQU5UTF9TVEFUSUNfVFhfVUNfRkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfVFhfTUNfRkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfVFhfQkNfRkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfVFhfVUNfQkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfVFhfTUNfQkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfVFhfQkNfQkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfUlhfVUNfRkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfUlhfTUNfRkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfUlhfQkNfRkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfUlhfVUNfQkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfUlhfTUNfQkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfUlhfQkNfQkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfUlhfQkNOVCwKKyAgIFdMQU5UTF9TVEFUSUNfUlhfQkNOVF9DUkNfT0ssCisgICBXTEFOVExfU1RBVElDX1JYX1JBVEUKK30gV0xBTlRMX1RSQU5TRkVSX1NUQVRJQ19UWVBFOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBIYW5kb2ZmIHN1cHBvcnQgYW5kIHN0YXRpc3RpY3Mgc3RydWN0dXJlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICBXTEFOVExfSE9fUlRfVFJBRkZJQ19TVEFUVVNfVFlQRSAgIHJ0VHJhZmZpY1N0YXR1czsKKyAgIFdMQU5UTF9IT19OUlRfVFJBRkZJQ19TVEFUVVNfVFlQRSAgbnJ0VHJhZmZpY1N0YXR1czsKK30gV0xBTlRMX0hPX1RSQUZGSUNfU1RBVFVTX1RZUEU7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCit0eXBlZGVmIHRTYXBfU29mdGFwU3RhdHMgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFOworI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgICB2X1UzMl90IHR4VUNGY250OworICAgdl9VMzJfdCB0eE1DRmNudDsKKyAgIHZfVTMyX3QgdHhCQ0ZjbnQ7CisgICB2X1UzMl90IHR4VUNCY250OworICAgdl9VMzJfdCB0eE1DQmNudDsKKyAgIHZfVTMyX3QgdHhCQ0JjbnQ7CisgICB2X1UzMl90IHJ4VUNGY250OworICAgdl9VMzJfdCByeE1DRmNudDsKKyAgIHZfVTMyX3QgcnhCQ0ZjbnQ7CisgICB2X1UzMl90IHJ4VUNCY250OworICAgdl9VMzJfdCByeE1DQmNudDsKKyAgIHZfVTMyX3QgcnhCQ0JjbnQ7CisgICB2X1UzMl90IHJ4QmNudDsKKyAgIHZfVTMyX3QgcnhCY250Q1JDb2s7CisgICB2X1UzMl90IHJ4UmF0ZTsKK31XTEFOVExfVFJBTlNGRVJfU1RBX1RZUEU7CisjZW5kaWYKKworLyogVW5kZXIgaGVyZSBub3QgcHVibGljIGl0ZW1zLCBqdXN0IHVzZSBmb3IgaW50ZXJuYWwgKi8KKy8qIDMgU01FIDEgSEREICovCisjZGVmaW5lIFdMQU5UTF9NQVhfQVZBSUxfVEhSRVNIT0xEICAgNQorI2RlZmluZSBXTEFOVExfSFNfTlVNX0NMSUVOVCAgICAgICAgIDIKKyNkZWZpbmUgV0xBTlRMX1NJTkdMRV9DTE5UX1RIUkVTSE9MRCA0CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICBUTCBjYWxsYmFjayB0eXBlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIERFU0NSSVBUSU9OICAgCisgICAgVHlwZSBvZiB0aGUgdHggY29tcGxldGUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIFRMLiAKKyAgICAKKyAgICBUTCB3aWxsIGNhbGwgdGhpcyB0byBub3RpZnkgdGhlIGNsaWVudCB3aGVuIGEgdHJhbnNtaXNzaW9uIGZvciBhIAorICAgIHBhY2tldCAgaGFzIGVuZGVkLiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byAKKyAgICAgICAgICAgICAgICAgICAgVEwvSEFML1BFL0JBUC9IREQgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gCisgICAgICAgICAgICAgICAgICAgIGl0cyBjb250ZXh0IAorICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIFZPU1MgZGF0YSBidWZmZXIgdGhhdCB3YXMgdHJhbnNtaXR0ZWQgCisgICAgd1R4U1RBdHVzOiAgICAgIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXNzaW9uIAorCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIFZPU19TVEFUVVMgKCpXTEFOVExfVHhDb21wQ0JUeXBlKSggdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90KiAgICAgcEZyYW1lRGF0YUJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1NUQVRVUyAgICAgd1R4U1RBdHVzICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSU5URVJBQ1RJT04gV0lUSCBIREQKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgREVTQ1JJUFRJT04gICAKKyAgICBUeXBlIG9mIHRoZSBmZXRjaCBwYWNrZXQgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIFRMLiAKKyAgICAKKyAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIFRMIHdoZW4gdGhlIHNjaGVkdWxpbmcgYWxnb3JpdGhtcyBhbGxvd3MgZm9yIAorICAgIHRyYW5zbWlzc2lvbiBvZiBhbm90aGVyIHBhY2tldCB0byB0aGUgbW9kdWxlLiAKKyAgICBJdCB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgQkFMIGZldGNoIHRyYW5zbWl0IHBhY2tldCAKKyAgICBmdW5jdGlvbiwgaW5pdGlhdGVkIGJ5IHRoZSBidXMgbG93ZXIgbGF5ZXIuIAorCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgCisgICAgICAgICAgICAgICAgICAgIHRvIFRMJ3Mgb3IgSEREJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIAorICAgICAgICAgICAgICAgICAgICBmcm9tIGl0cyBjb250ZXh0IAorCisgICAgSU4vT1VUCisgICAgcHVjU1RBSWQ6ICAgICAgIHRoZSBJZCBvZiB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggVEwgaXMgcmVxdWVzdGluZyBhIAorICAgICAgICAgICAgICAgICAgICBwYWNrZXQsIGluIGNhc2UgSEREIGRvZXMgbm90IG1haW50YWluIHBlciBzdGF0aW9uIAorICAgICAgICAgICAgICAgICAgICBxdWV1ZXMgaXQgY2FuIGdpdmUgdGhlIG5leHQgcGFja2V0IGluIGl0cyBxdWV1ZSAKKyAgICAgICAgICAgICAgICAgICAgYW5kIHB1dCBpbiB0aGUgcmlnaHQgdmFsdWUgZm9yIHRoZSAKKyAgICBwdWNBQzogICAgICAgICAgYWNjZXNzIGNhdGVnb3J5IHJlcXVlc3RlZCBieSBUTCwgaWYgSEREIGRvZXMgbm90IGhhdmUgCisgICAgICAgICAgICAgICAgICAgIHBhY2tldHMgb24gdGhpcyBBQyBpdCBjYW4gY2hvb3NlIHRvIHNlcnZpY2UgYW5vdGhlciBBQyAKKyAgICAgICAgICAgICAgICAgICAgcXVldWUgaW4gdGhlIG9yZGVyIG9mIHByaW9yaXR5CisKKyAgICBPVVQKKyAgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSBWT1NTIGRhdGEgYnVmZmVyIHRoYXQgd2FzIHRyYW5zbWl0dGVkIAorICAgIHRsTWV0YUluZm86ICAgIG1ldGEgaW5mbyByZWxhdGVkIHRvIHRoZSBkYXRhIGZyYW1lCisKKworICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBWT1NfU1RBVFVTICgqV0xBTlRMX1NUQUZldGNoUGt0Q0JUeXBlKSggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90KiAgICAgICAgICAgICAgIHB1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQUNFbnVtVHlwZSAgICAgdWNBQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90KiogICAgICAgICAgIHZvc0RhdGFCdWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTWV0YUluZm9UeXBlKiAgdGxNZXRhSW5mbyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIERFU0NSSVBUSU9OICAgCisgICAgVHlwZSBvZiB0aGUgcmVjZWl2ZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwuIAorICAgIAorICAgIFRMIHdpbGwgY2FsbCB0aGlzIHRvIG5vdGlmeSB0aGUgY2xpZW50IHdoZW4gYSBwYWNrZXQgd2FzIHJlY2VpdmVkIAorICAgIGZvciBhIHJlZ2lzdGVyZWQgU1RBLgorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIAorICAgICAgICAgICAgICAgICAgICBUTCdzIG9yIEhERCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIAorICAgICAgICAgICAgICAgICAgICBpdHMgY29udGV4dCAKKyAgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSBWT1NTIGRhdGEgYnVmZmVyIHRoYXQgd2FzIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICAgIChpdCBtYXkgYmUgYSBsaW5rZWQgbGlzdCkgCisgICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWQKKyAgICBwUnhNZXRhSW5mbzogICBtZXRhIGluZm8gZm9yIHRoZSByZWNlaXZlZCBwYWNrZXQocykgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIFZPU19TVEFUVVMgKCpXTEFOVExfU1RBUnhDQlR5cGUpKCB2X1BWT0lEX3QgICAgICAgICAgICAgIHB2b3NHQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90KiAgICAgICAgICAgICB2b3NEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAgICAgICAgICAgICAgICAgdWNTVEFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSogcFJ4TWV0YUluZm8pOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIElOVEVSQUNUSU9OIFdJVEggQkFQCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgREVTQ1JJUFRJT04gICAKKyAgICBUeXBlIG9mIHRoZSByZWNlaXZlIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCBUTCBmb3IgQkFQLiAKKyAgICAKKyAgICBUaGUgcmVnaXN0ZXJlZCByZWNlcHRpb24gY2FsbGJhY2sgaXMgYmVpbmcgdHJpZ2dlcmVkIGJ5IFRMIHdoZW5ldmVyIGEgCisgICAgZnJhbWUgd2FzIHJlY2VpdmVkIGFuZCBpdCB3YXMgZmlsdGVyZWQgYXMgYSBub24tZGF0YSBCVCBBTVAgcGFja2V0LiAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdk9TUyBidWZmZXIgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgcGFja2V0OyAKKyAgICAgICAgICAgICAgICAgICBubyBjaGFpbmluZyB3aWxsIGJlIGRvbmUgb24gdGhpcyBwYXRoCisgICAgZnJhbWVUeXBlOiAgICAgdHlwZSBvZiB0aGUgZnJhbWUgdG8gYmUgaW5kaWNhdGVkIHRvIEJBUC4KKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgVk9TX1NUQVRVUyAoKldMQU5UTF9CQVBSeENCVHlwZSkoIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90KiAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQkFQRnJhbWVFbnVtVHlwZSBmcmFtZVR5cGUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBERVNDUklQVElPTiAgIAorICAgIENhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCBUTCBmb3IgQkFQLCB0aGlzIGlzIHJlcXVpcmVkIGlub3JkZXIgZm9yCisgICAgVEwgdG8gaW5mb3JtIEJBUCwgdGhhdCB0aGUgZmx1c2ggb3BlcmF0aW9uIHJlcXVlc3RlZCBoYXMgYmVlbiBjb21wbGV0ZWQuIAorICAgIAorICAgIFRoZSByZWdpc3RlcmVkIHJlY2VwdGlvbiBjYWxsYmFjayBpcyBiZWluZyB0cmlnZ2VyZWQgYnkgVEwgd2hlbmV2ZXIgYSAKKyAgICBmcmFtZSBTSVJfVExfSEFMX0ZMVVNIX0FDX1JTUCBpcyByZWNlaXZlZCBieSBUTCBmcm9tIEhBTC4KKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB2T1NTIGJ1ZmZlciBjb250YWluaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQ7IAorICAgICAgICAgICAgICAgICAgICBubyBjaGFpbmluZyB3aWxsIGJlIGRvbmUgb24gdGhpcyBwYXRoIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBWT1NfU1RBVFVTICgqV0xBTlRMX0ZsdXNoT3BDb21wQ0JUeXBlKSggdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAgICAgICAgdWNTdGFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAgICAgICAgdWNUSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICAgICAgICBzdGF0dXMpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSU5URVJBQ1RJT04gV0lUSCBQRQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIERFU0NSSVBUSU9OICAgCisgICAgVHlwZSBvZiB0aGUgcmVjZWl2ZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwgZm9yIFBFLiAKKyAgICAKKyAgICBVcG9uIHJlY2VpcHQgb2YgYSBtYW5hZ2VtZW50IGZyYW1lIFRMIHdpbGwgY2FsbCB0aGUgcmVnaXN0ZXJlZCByZWNlaXZlIAorICAgIGNhbGxiYWNrIGFuZCBmb3J3YXJkIHRoaXMgZnJhbWUgdG8gdGhlIGludGVyZXN0ZWQgbW9kdWxlLCBpbiBvdXIgY2FzZSBQRS4gCisKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgdm9zRnJtQnVmOiAgICAgcG9pbnRlciB0byBhIHZPU1MgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG1hbmFnZW1lbnQgZnJhbWUgCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIFZPU19TVEFUVVMgKCpXTEFOVExfTWdtdEZybVJ4Q0JUeXBlKSggdl9QVk9JRF90ICBwdm9zR0N0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9QVk9JRF90ICB2b3NCdWZmKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJTlRFUkFDVElPTiBXSVRIIEhBTAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIERFU0NSSVBUSU9OIAorICAgIFR5cGUgb2YgdGhlIGZldGNoIHBhY2tldCBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggVEwuIAorICAgIAorICAgIEhBTCBjYWxscyB0aGlzIEFQSSB3aGVuIGl0IHdpc2hlcyB0byBzdXNwZW5kIHRyYW5zbWlzc2lvbiBmb3IgYSAKKyAgICBwYXJ0aWN1bGFyIFNUQS4KKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGU7IAorICAgICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIDAgYXNzdW1lcyBzdXNwZW5kIG9uIGFsbCBhY3RpdmUgc3RhdGlvbgorICAgIHBmblN1c3BlbmRUeENCOiBwb2ludGVyIHRvIHRoZSBzdXNwZW5kIHJlc3VsdCBub3RpZmljYXRpb24gaW4gY2FzZSB0aGUgCisgICAgICAgICAgICAgICAgICAgIGNhbGwgaXMgYXN5bmNocm9ub3VzCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBWT1NfU1RBVFVTICgqV0xBTlRMX1N1c3BlbmRDQlR5cGUpKCB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90KiAgICAgICAgdWNTVEFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1NUQVRVUyAgICAgdm9zU3RhdHVzKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgREVTQ1JJUFRJT04gCisgICAgVHJhZmZpYyBzdGF0dXMgY2hhbmdlZCBjYWxsYmFjayBmdW5jdGlvbgorICAgIFNob3VsZCBiZSByZWdpc3RlcmVkIHRvIGxldCBjbGllbnQga25vdyB0aGF0IHRyYWZmaWMgc3RhdHVzIGlzIGNoYW5nZWQKKyAgICBSRUYgV0xBTlRMX1JlZ0dldFRyYWZmaWNTdGF0dXMKKworICBQQVJBTUVURVJTIAorICAgIHBBZGFwdGVyICAgICAgIEdsb2JhbCBoYW5kbGUgcG9pbnRlcgorICAgIHRyYWZmaWNTdGF0dXMgIFJUIGFuZCBOUlQgY3VycmVudCB0cmFmZmljIHN0YXR1cworICAgIHBVc2VyQ3R4dCAgICAgIHByZSByZWdpc3RlcmVkIGNsaWVudCBjb250ZXh0CisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVUworCisgIFNJREUgRUZGRUNUUyAKKyAgICBOT05FCisgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIElGIHRyYWZmaWMgc3RhdHVzIGlzIGNoYW5nZWQsIHNlbmQgbm90aWZpY2F0aW9uIHRvIFNNRSAqLwordHlwZWRlZiBWT1NfU1RBVFVTICgqV0xBTlRMX1RyYWZmaWNTdGF0dXNDaGFuZ2VkQ0JUeXBlKQorKAorICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCisgICBXTEFOVExfSE9fVFJBRkZJQ19TVEFUVVNfVFlQRSB0cmFmZmljU3RhdHVzLAorICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgcFVzZXJDdHh0CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgREVTQ1JJUFRJT04gCisgICAgUlNTSSB0aHJlc2hvbGQgY3Jvc3NlZCBub3RpZmljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24KKyAgICBSRUYgV0xBTlRMX1JlZ1JTU0lJbmRpY2F0aW9uQ0IKKworICBQQVJBTUVURVJTIAorICAgIHBBZGFwdGVyICAgICAgICAgIEdsb2JhbCBoYW5kbGUgcG9pbnRlcgorICAgIHJzc2lOb3RpZmljYXRpb24gIE5vdGlmaWNhdGlvbiBldmVudCB0eXBlCisgICAgcFVzZXJDdHh0ICAgICAgICAgcHJlIHJlZ2lzdGVyZWQgY2xpZW50IGNvbnRleHQKKworICBSRVRVUk4gVkFMVUUKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBJZiBSU1NJIHJlYWxtIGlzIGNoYW5nZWQsIHNlbmQgbm90aWZpY2F0aW9uIHRvIENsaWVudHMsIFNNRSwgSEREICovCit0eXBlZGVmIFZPU19TVEFUVVMgKCpXTEFOVExfUlNTSUNyb3NzVGhyZXNob2xkQ0JUeXBlKQorKAorICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaU5vdGlmaWNhdGlvbiwKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJDdHh0CispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRG9jdW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfT3BlbgorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBieSBIREQgYXQgZHJpdmVyIGluaXRpYWxpemF0aW9uLiBUTCB3aWxsIGluaXRpYWxpemUgYWxsIGl0cyAKKyAgICBpbnRlcm5hbCByZXNvdXJjZXMgYW5kIHdpbGwgd2FpdCBmb3IgdGhlIGNhbGwgdG8gc3RhcnQgdG8gcmVnaXN0ZXIgCisgICAgd2l0aCB0aGUgb3RoZXIgbW9kdWxlcy4gCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgcFRMQ29uZmlnOiAgICAgIFRMIENvbmZpZ3VyYXRpb24gCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOVExfT3BlbgorKCAKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsCisgIFdMQU5UTF9Db25maWdJbmZvVHlwZSogIHBUTENvbmZpZworKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9TdGFydAorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBieSBIREQgYXMgcGFydCBvZiB0aGUgb3ZlcmFsbCBzdGFydCBwcm9jZWR1cmUuIFRMIHdpbGwgdXNlIHRoaXMgCisgICAgY2FsbCB0byByZWdpc3RlciB3aXRoIEJBTCBhcyBhIHRyYW5zcG9ydCBsYXllciBlbnRpdHkuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICAgIE90aGVyIGNvZGVzIGNhbiBiZSByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBhIEJBTCBmYWlsdXJlOyBzZWUgQkFMIEFQSSAKKyAgICBmb3IgbW9yZSBpbmZvCisgICAgCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOVExfU3RhcnQKKyggCisgIHZfUFZPSURfdCAgcHZvc0dDdHggCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1N0b3AKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgSEREIHRvIHN0b3Agb3BlcmF0aW9uIGluIFRMLCBiZWZvcmUgY2xvc2UuIFRMIHdpbGwgc3VzcGVuZCBhbGwgCisgICAgZnJhbWUgdHJhbnNmZXIgb3BlcmF0aW9uIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjbG9zZSByZXF1ZXN0IHRvIGNsZWFuIHVwIAorICAgIGl0cyByZXNvdXJjZXMuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIAorV0xBTlRMX1N0b3AKKyggCisgIHZfUFZPSURfdCAgcHZvc0dDdHggCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0Nsb3NlCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGJ5IEhERCBkdXJpbmcgZ2VuZXJhbCBkcml2ZXIgY2xvc2UgcHJvY2VkdXJlLiBUTCB3aWxsIGNsZWFuIHVwIAorICAgIGFsbCB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLiAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAKK1dMQU5UTF9DbG9zZQorKCAKKyAgdl9QVk9JRF90ICBwdm9zR0N0eCAKKyk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSU5URVJBQ1RJT04gV0lUSCBIREQKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsCisKKyAgREVTQ1JJUFRJT04KKyAgICAgRnVuY3Rpb24gdG8gZGlzYWJsZS9lbmFibGUgZnJhbWUgdHJhbnNsYXRpb24gZm9yIGFsbCBhc3NvY2lhdGlvbiBzdGF0aW9ucy4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICAgICAgVk9TIGNvbnRleHQgCisgICAgRW5hYmxlRnJhbWVYbGF0aW9uIFRSVUUgbWVhbnMgZW5hYmxlIFNXIHRyYW5zbGF0aW9uIGZvciBhbGwgc3RhdGlvbnMuCisgICAgLgorCisgIFJFVFVSTiBWQUxVRQorCisgICB2b2lkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQKK1dMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsCisoCisgIHZfUFZPSURfdCBwdm9zR0N0eCwgCisgIHZfQk9PTF90IGVuYWJsZUZyYW1lWGxhdGlvbgorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQKKworICBERVNDUklQVElPTiAKKworICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBIREQgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIGRhdGEgc2VydmljZXMgCisgICAgd2l0aCBUTC4gSEREIHdpbGwgY2FsbCB0aGlzIEFQSSBmb3IgZWFjaCBuZXcgc3RhdGlvbiB0aGF0IGl0IGFkZHMsIAorICAgIHRodXMgaGF2aW5nIHRoZSBmbGV4aWJpbGl0eSBvZiByZWdpc3RlcmluZyBkaWZmZXJlbnQgY2FsbGJhY2sgZm9yIGVhY2ggCisgICAgU1RBIGl0IHNlcnZpY2VzLiAKKworICBERVBFTkRFTkNJRVMgCisKKyAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KKyAgICAgCisgICAgUmVzdHJpY3Rpb246IAorICAgICAgTWFpbiB0aHJlYWQgd2lsbCBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGF0IFR4IGFuZCBSeCB0aHJlYWRzIHRodXMgCisgICAgICBndWFyYW50ZWVpbmcgdGhhdCBhIHN0YXRpb24gd2lsbCBiZSBhZGRlZCBiZWZvcmUgYW55IGRhdGEgY2FuIGJlIAorICAgICAgcmVjZWl2ZWQgZm9yIGl0LiAoVGhpcyBlbmFibGVzIFRMIHRvIGJlIGxvY2sgZnJlZSkgCisKKyAgUEFSQU1FVEVSUyAKKworICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgcGZuU3RBUng6ICAgICAgICBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSByZWNlaXZlIHBhY2tldCBoYW5kbGVyIGZyb20gSERECisgICBwZm5TVEFUeENvbXA6ICAgIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IGNvbXBsZXRlIGNvbmZpcm1hdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlciBmcm9tIEhERCAKKyAgIHBmblNUQUZldGNoUGt0OiAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgcGFja2V0IHJldHJpZXZhbCByb3V0aW5lIGluIEhERCAKKyAgIHdTVEFEZXNjVHlwZTogICAgU1RBIERlc2NyaXB0b3IsIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIAorICAgICAgICAgICAgICAgICAgICBuZXcgYWRkZWQgU1RBCisgICAKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6IElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKyAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAgCitXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQgCisoIAorICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgIHB2b3NHQ3R4LAorICBXTEFOVExfU1RBUnhDQlR5cGUgICAgICAgIHBmblNUQVJ4LCAgCisgIFdMQU5UTF9UeENvbXBDQlR5cGUgICAgICAgcGZuU1RBVHhDb21wLCAgCisgIFdMQU5UTF9TVEFGZXRjaFBrdENCVHlwZSAgcGZuU1RBRmV0Y2hQa3QsCisgIFdMQU5fU1RBRGVzY1R5cGUqICAgICAgICAgd1NUQURlc2NUeXBlICwKKyAgdl9TN190ICAgICAgICAgICAgICAgICAgICByc3NpCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9DbGVhclNUQUNsaWVudAorCisgIERFU0NSSVBUSU9OIAorCisgICAgSEREIHdpbGwgY2FsbCB0aGlzIEFQSSB3aGVuIGl0IG5vIGxvbmdlciBuZWVkcyBkYXRhIHNlcnZpY2VzIGZvciB0aGUgCisgICAgcGFydGljdWxhciBzdGF0aW9uLiAKKworICBERVBFTkRFTkNJRVMgCisKKyAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNsZWFyIHJlZ2lzdHJhdGlvbiBpcyAKKyAgICBjYWxsZWQuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgIHB2b3NHQ3R4OiAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgIHVjU1RBSWQ6ICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSB0byBiZSBjbGVhcmVkCisgICAKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisgICAgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKyAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAgCitXTEFOVExfQ2xlYXJTVEFDbGllbnQgCisoIAorICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgIHVjU1RBSWQgCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZQorCisgIERFU0NSSVBUSU9OIAorCisgICAgSEREIHdpbGwgbWFrZSB0aGlzIG5vdGlmaWNhdGlvbiB3aGVuZXZlciBhIGNoYW5nZSBvY2N1cnMgaW4gdGhlIAorICAgIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhIHBhcnRpY3VsYXIgU1RBLiAKKworICBERVBFTkRFTkNJRVMgCisKKyAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNoYW5nZSBzdGF0ZSBjYW4gYmUKKyAgICBjYWxsZWQuCisKKyAgICBSRVNUUklDVElPTjogQSBzdGF0aW9uIGlzIGJlaW5nIG5vdGlmaWVkIGFzIGF1dGhlbnRpY2F0ZWQgYmVmb3JlIHRoZSAKKyAgICAgICAgICAgICAgICAga2V5cyBhcmUgaW5zdGFsbGVkIGluIEhXLiBUaGlzIHdheSBpZiBhIGZyYW1lIGlzIHJlY2VpdmVkIAorICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGtleXMgYXJlIGluc3RhbGxlZCBEUFUgd2lsbCBkcm9wIHRoYXQgZnJhbWUuIAorCisgICAgTWFpbiB0aHJlYWQgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGF0IFR4IGFuZCBSeCB0aHJlYWRzIHRodXMgZ3VhcmFudGVlaW5nIAorICAgIHRoZSBmb2xsb3dpbmc6IAorICAgICAgICAtIGEgc3RhdGlvbiB3aWxsIGJlIGluIGFzc29jIHN0YXRlIGluIFRMIGJlZm9yZSBUTCByZWNlaXZlcyBhbnkgZGF0YSAKKyAgICAgICAgICBmb3IgaXQgCisKKyAgUEFSQU1FVEVSUyAKKworICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgdWNTVEFJZDogICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRoYXQgaXMgcGVuZGluZyB0cmFuc21pc3Npb24KKyAgIHRsU1RBU3RhdGU6ICAgICB0aGUgbmV3IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBzdGF0aW9uCisKKyAgIAorICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKyAgICAKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTICAKK1dMQU5UTF9DaGFuZ2VTVEFTdGF0ZSAKKyggCisgIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKKyAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCisgIFdMQU5UTF9TVEFTdGF0ZVR5cGUgICB0bFNUQVN0YXRlIAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfU1RBUGt0UGVuZGluZworCisgIERFU0NSSVBUSU9OIAorCisgICAgSEREIHdpbGwgY2FsbCB0aGlzIEFQSSB3aGVuIGEgcGFja2V0IGlzIHBlbmRpbmcgdHJhbnNtaXNzaW9uIGluIGl0cyAKKyAgICBxdWV1ZXMuIAorCisgIERFUEVOREVOQ0lFUyAKKworICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgcGFja2V0IHBlbmRpbmcgCisgICAgbm90aWZpY2F0aW9uIGNhbiBiZSBzZW50LgorCisgICAgUkVTVFJJQ1RJT046IFRMIHdpbGwgbm90IGNvdW50IHBhY2tldHMgZm9yIHBlbmRpbmcgbm90aWZpY2F0aW9uLiAKKyAgICAgICAgICAgICAgICAgSEREIGlzIGV4cGVjdGVkIHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvbmx5IHdoZW4gCisgICAgICAgICAgICAgICAgIG5vbi1lbXB0eSBldmVudCBnZXRzIHRyaWdnZXJlZC4gV29yc3QgY2FzZSBzY2VuYXJpbyAKKyAgICAgICAgICAgICAgICAgaXMgdGhhdCBUTCBtaWdodCBlbmQgdXAgbWFraW5nIGEgY2FsbCB3aGVuIEhkZHMgCisgICAgICAgICAgICAgICAgIHF1ZXVlcyBhcmUgYWN0dWFsbHkgZW1wdHkuIAorCisgIFBBUkFNRVRFUlMgCisKKyAgICBwdm9zR0N0eDogICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgICB1Y1NUQUlkOiAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSB0aGF0IGlzIHBlbmRpbmcgdHJhbnNtaXNzaW9uCisgICAgdWNBQzogICAgICAgIGFjY2VzcyBjYXRlZ29yeSBvZiB0aGUgbm9uLWVtcHR5IHF1ZXVlCisgICAKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfU1RBUGt0UGVuZGluZyAKKyggCisgIHZfUFZPSURfdCAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICAgICB1Y1NUQUlkLAorICBXTEFOVExfQUNFbnVtVHlwZSAgICB1Y0FjCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1NldFNUQVByaW9yaXR5CisKKyAgREVTQ1JJUFRJT04gCisKKyAgICBUTCBleHBvc2VzIHRoaXMgQVBJIHRvIGFsbG93IHVwcGVyIGxheWVycyBhIHJvdWdoIGNvbnRyb2wgb3ZlciB0aGUgCisgICAgcHJpb3JpdHkgb2YgdHJhbnNtaXNzaW9uIGZvciBhIGdpdmVuIHN0YXRpb24gd2hlbiBzdXBwb3J0aW5nIG11bHRpcGxlIAorICAgIGNvbm5lY3Rpb25zLgorCisgIERFUEVOREVOQ0lFUyAKKworICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2hhbmdlIGluIHByaW9yaXR5IGNhbiBiZSAKKyAgICBjYWxsZWQuCisKKyAgUEFSQU1FVEVSUyAKKworICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRoYXQgaGFzIHRvIGNoYW5nZSBwcmlvcml0eQorICAgCisgIFJFVFVSTiBWQUxVRQorCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorICAgIAorICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9TZXRTVEFQcmlvcml0eSAKKyggCisgIHZfUFZPSURfdCAgICAgICAgICAgICAgICBwdm9zR0N0eCwKKyAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCisgIFdMQU5UTF9TVEFQcmlvcml0eVR5cGUgICB0bFNUQVByaQorKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSU5URVJBQ1RJT04gV0lUSCBCQVAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50CisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGJ5IFNNRSB0byByZWdpc3RlciBpdHNlbGYgYXMgY2xpZW50IGZvciBub24tZGF0YSBCVC1BTVAgcGFja2V0cy4gCisKKyAgREVQRU5ERU5DSUVTIAorICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4gCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgIHBmblRsQkFQUnhGcm06ICBwb2ludGVyIHRvIHRoZSByZWNlaXZlIHByb2Nlc3Npbmcgcm91dGluZSBmb3Igbm9uLWRhdGEgCisgICAgICAgICAgICAgICAgICAgIEJULUFNUCBwYWNrZXRzCisgICAgcGZuRmx1c2hPcENvbXBsZXRlQ2I6IAorICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgaW5mb3JtIEJBUCB0aGF0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgZmx1c2ggb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgorICAgCisgIFJFVFVSTiBWQUxVRQorICAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisgICAgCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZCAKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBCQUwgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyAgCitXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQgCisoIAorICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgcHZvc0dDdHgsCisgIFdMQU5UTF9CQVBSeENCVHlwZSAgICAgICAgICBwZm5UbEJBUFJ4LAorICBXTEFOVExfRmx1c2hPcENvbXBDQlR5cGUgICAgcGZuRmx1c2hPcENvbXBsZXRlQ2IKKyk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9UeEJBUEZybQorCisgIERFU0NSSVBUSU9OIAorICAgIEJBUCBjYWxscyB0aGlzIHdoZW4gaXQgd2FudHMgdG8gc2VuZCBhIGZyYW1lIHRvIHRoZSBtb2R1bGUKKworICBERVBFTkRFTkNJRVMgCisgICAgQkFQIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuIAorCisgICAgUkVTVFJJQ1RJT046IEJBUCBDQU5OT1QgcHVzaCBhbnkgcGFja2V0cyB0byBUTCB1bnRpbCBpdCBkaWQgbm90IHJlY2VpdmUgCisgICAgICAgICAgICAgICAgIGEgdHggY29tcGxldGUgZnJvbSB0aGUgcHJldmlvdXMgcGFja2V0LCB0aGF0IG1lYW5zIEJBUAorICAgICAgICAgICAgICAgICBzZW5kcyBvbmUgcGFja2V0LCB3YWl0IGZvciB0eCBjb21wbGV0ZSBhbmQgdGhlbiAKKyAgICAgICAgICAgICAgICAgc2VuZHMgYW5vdGhlciBvbmUKKworICAgICAgICAgICAgICAgICBJZiBCQVAgc2VuZHMgYW5vdGhlciBwYWNrZXQgYmVmb3JlIFRMIG1hbmFnZXMgdG8gcHJvY2VzcyB0aGUKKyAgICAgICAgICAgICAgICAgcHJldmlvdXNseSBzZW50IHBhY2tldCBjYWxsIHdpbGwgZW5kIGluIGZhaWx1cmUgICAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBvciBCQVAncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB2T1NTIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwYWNrZXQgdG8gYmUgCisgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVkCisgICAgcE1ldGFJbmZvOiAgICAgIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2tldCAKKyAgICBwZm5UbEJBUFR4Q29tcDogcG9pbnRlciB0byBhIHRyYW5zbWl0IGNvbXBsZXRlIHJvdXRpbmUgZm9yIG5vdGlmeWluZyAKKyAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIG92ZXIgdGhlIGJ1cworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IEJBTCBjbGllbnQgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAorICAgIFZPU19TVEFUVVNfRV9CVVNZOiAgIFRoZSBwcmV2aW91cyBCVC1BTVAgcGFja2V0IHdhcyBub3QgeWV0IHRyYW5zbWl0dGVkCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgICAgT3RoZXIgZmFpbHVyZSBtZXNzYWdlcyBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUgQkQgaGVhZGVyIGhhbmRsaW5nIAorICAgIHJvdXRpbmVzLCBwbGVhc2UgY2hlY2sgYXByb3ByaWF0ZSBBUEkgZm9yIG1vcmUgaW5mby4gCisgICAgCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgIAorV0xBTlRMX1R4QkFQRnJtIAorKCAKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsCisgIHZvc19wa3RfdCogICAgICAgICAgICAgIHZvc0RhdGFCdWZmLCAgCisgIFdMQU5UTF9NZXRhSW5mb1R5cGUqICAgIHBNZXRhSW5mbywgICAKKyAgV0xBTlRMX1R4Q29tcENCVHlwZSAgICAgcGZuVGxCQVBUeENvbXAKKyk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSU5URVJBQ1RJT04gV0lUSCBTTUUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFJzc2kKKworICBERVNDUklQVElPTiAKKyAgICBUTCB3aWxsIGV4dHJhY3QgdGhlIFJTU0kgaW5mb3JtYXRpb24gZnJvbSBldmVyeSBkYXRhIHBhY2tldCBmcm9tIHRoZSAKKyAgICBvbmdvaW5nIHRyYWZmaWMgYW5kIHdpbGwgc3RvcmUgaXQuIEl0IHdpbGwgcHJvdmlkZSB0aGUgcmVzdWx0IHRvIFNNRSAKKyAgICB1cG9uIHJlcXVlc3QuCisKKyAgREVQRU5ERU5DSUVTIAorCisgICAgV0FSTklORzogdGhlIHJlYWQgYW5kIHdyaXRlIG9mIHRoaXMgdmFsdWUgd2lsbCBub3QgYmUgcHJvdGVjdGVkIAorICAgICAgICAgICAgIGJ5IGxvY2tzLCB0aGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGFmdGVyIGEgcmVhZCAKKyAgICAgICAgICAgICBtaWdodCBub3QgYWx3YXlzIGJlIGNvbnNpc3RlbnQuICAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQorCisgICAgT1VUCisgICAgcHVSc3NpOiAgICAgICAgIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBSU1NJCisKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFNUQSB3YXMgbm90IHlldCByZWdpc3RlcmVkCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorICAgIAorICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTICAKK1dMQU5UTF9HZXRSc3NpIAorKCAKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKKyAgdl9TN190KiAgICAgICAgICAgICAgIHB1UnNzaQorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRMaW5rUXVhbGl0eQorCisgIERFU0NSSVBUSU9OIAorICAgIFRMIHdpbGwgZXh0cmFjdCB0aGUgTGlua1F1YWxpdHkgaW5mb3JtYXRpb24gZnJvbSBldmVyeSBkYXRhIHBhY2tldCBmcm9tIHRoZSAKKyAgICBvbmdvaW5nIHRyYWZmaWMgYW5kIHdpbGwgc3RvcmUgaXQuIEl0IHdpbGwgcHJvdmlkZSB0aGUgcmVzdWx0IHRvIFNNRSAKKyAgICB1cG9uIHJlcXVlc3QuCisKKyAgREVQRU5ERU5DSUVTIAorCisgICAgV0FSTklORzogdGhlIHJlYWQgYW5kIHdyaXRlIG9mIHRoaXMgdmFsdWUgd2lsbCBub3QgYmUgcHJvdGVjdGVkIAorICAgICAgICAgICAgIGJ5IGxvY2tzLCB0aGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGFmdGVyIGEgcmVhZCAKKyAgICAgICAgICAgICBtaWdodCBub3QgYWx3YXlzIGJlIGNvbnNpc3RlbnQuICAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQorCisgICAgT1VUCisgICAgcHVMaW5rUXVhbGl0eTogICAgICAgICB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgTGlua1F1YWxpdHkKKworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU1RBIHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisgICAgCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgIAorV0xBTlRMX0dldExpbmtRdWFsaXR5IAorKCAKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKKyAgdl9VMzJfdCogICAgICAgICAgICAgIHB1TGlua1F1YWxpdHkKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfRmx1c2hTdGFUSUQKKworICBERVNDUklQVElPTiAKKyAgICBUTCBwcm92aWRlcyB0aGlzIEFQSSBhcyBhbiBpbnRlcmZhY2UgdG8gU01FIChCQVApIGxheWVyLiBUTCBpbnR1cm4gcG9zdHMgYSAKKyAgICBtZXNzYWdlIHRvIEhBTC4gVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IHRoZSBTTUUgaW5vcmRlciB0byBwZXJmb3JtIGEgZmx1c2ggCisgICAgb3BlcmF0aW9uLgorCisgIERFUEVOREVOQ0lFUyAKKworICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIHZhbHVlCisgICAgdWNUaWQ6ICAgICAgICAgIFRzcGVjIElEIGZvciB0aGUgbmV3IEJBIHNlc3Npb24KKworICAgIE9VVAorICAgIFRoZSByZXNwb25zZSBmb3IgdGhpcyBwb3N0IGlzIHJlY2VpdmVkIGluIHRoZSBtYWluIHRocmVhZCwgdmlhIGEgcmVzcG9uc2UgCisgICAgbWVzc2FnZSBmcm9tIEhBTCB0byBUTC4gCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorICAgIAorICBTSURFIEVGRkVDVFMgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgIAorV0xBTlRMX0ZsdXNoU3RhVElEIAorKCAKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKKyAgdl9VOF90ICAgICAgICAgICAgICAgIHVjVGlkCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJTlRFUkFDVElPTiBXSVRIIFBFCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9SZWdpc3Rlck1nbXRGcm1DbGllbnQKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgUEUgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzIGRlbGl2ZXJ5LiAKKworICBERVBFTkRFTkNJRVMgCisgICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4gCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgIFRMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgcGZuVGxNZ210RnJtUng6ICAgICBwb2ludGVyIHRvIHRoZSByZWNlaXZlIHByb2Nlc3Npbmcgcm91dGluZSBmb3IgCisgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50IGZyYW1lcworICAgICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKyAgICAKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IE1nbXQgRnJhbWUgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikgCisgICAgCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgIAorV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudAorKCAKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsCisgIFdMQU5UTF9NZ210RnJtUnhDQlR5cGUgIHBmblRsTWdtdEZybVJ4CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0RlUmVnaXN0ZXJNZ210RnJtQ2xpZW50CisKKyAgREVTQ1JJUFRJT04KKyAgICBDYWxsZWQgYnkgUEUgdG8gZGVyZWdpc3RlciBhcyBhIGNsaWVudCBmb3IgbWFuYWdlbWVudCBmcmFtZXMgZGVsaXZlcnkuCisKKyAgREVQRU5ERU5DSUVTCisgICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgVEwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogTWdtdCBGcmFtZSBjbGllbnQgd2FzIG5ldmVyIHJlZ2lzdGVyZWQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfRGVSZWdpc3Rlck1nbXRGcm1DbGllbnQKKygKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfVHhNZ210RnJtCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGJ5IFBFIHdoZW4gaXQgd2FudCB0byBzZW5kIG91dCBhIG1hbmFnZW1lbnQgZnJhbWUuIAorICAgIEhBTCB3aWxsIGFsc28gdXNlIHRoaXMgQVBJIGZvciB0aGUgZmV3IGZyYW1lcyBpdCBzZW5kcyBvdXQsIHRoZXkgYXJlIG5vdCAKKyAgICBtYW5hZ2VtZW50IGZyYW1lcyBob3dldmVyZSBpdCBpcyBhY2NlcHRlZCB0aGF0IGFuIGV4Y2VwdGlvbiB3aWxsIGJlIAorICAgIGFsbG93ZWQgT05MWSBmb3IgdGhlIHVzYWdlIG9mIEhBTC4gCisgICAgR2VuZXJpYyBkYXRhIGZyYW1lcyBTSE9VTEQgTk9UIHRyYXZlbCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uIAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIEFQSSBjYW4gYmUgY2FsbGVkLiAKKworICAgIFJFU1RSSUNUSU9OOiBJZiBQRSBzZW5kcyBhbm90aGVyIHBhY2tldCBiZWZvcmUgVEwgbWFuYWdlcyB0byBwcm9jZXNzIHRoZQorICAgICAgICAgICAgICAgICBwcmV2aW91c2x5IHNlbnQgcGFja2V0IGNhbGwgd2lsbCBlbmQgaW4gZmFpbHVyZSAgIAorCisgICAgICAgICAgICAgICAgIEZyYW1lcyBjb21taW5nIHRocm91Z2ggaGVyZSBtdXN0IGJlIDgwMi4xMSBmcmFtZXMsIGZyYW1lIAorICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbiBpbiBVTUEgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRpc2FibGVkLiAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDthIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgICB2b3NGcm1CdWY6ICAgICAgcG9pbnRlciB0byBhIHZPU1MgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG1hbmFnZW1lbnQgIAorICAgICAgICAgICAgICAgICAgICBmcmFtZSB0byBiZSB0cmFuc21pdHRlZAorICAgIHVzRnJtTGVuOiAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSB0byBiZSB0cmFuc21pdHRlZDsgaW5mb3JtYXRpb24gCisgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIHZPU1MgYnVmZmVyCisgICAgd0ZybVR5cGU6ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBmcmFtZSBiZWluZyB0cmFuc21pdHRlZAorICAgIHRpZDogICAgICAgICAgICB0aWQgdXNlZCB0byB0cmFuc21pdCB0aGlzIGZyYW1lCisgICAgcGZuQ29tcFR4RnVuYzogIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IGNvbXBsZXRlIHJvdXRpbmUKKyAgICBwdkJESGVhZGVyOiAgICAgcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyLCBpZiBOVUxMIGl0IG1lYW5zIGl0IHdhcyBub3QgCisgICAgICAgICAgICAgICAgICAgIHlldCBjb25zdHJ1Y3RlZCBhbmQgaXQgbGllcyB3aXRoaW4gVEwncyByZXNwb25zaWJpbGl0eSAgCisgICAgICAgICAgICAgICAgICAgIHRvIGRvIHNvOyBpZiBub3QgTlVMTCBpdCBpcyBleHBlY3RlZCB0aGF0IGl0IHdhcyAKKyAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBwYWNrZWQgaW5zaWRlIHRoZSB2b3MgcGFja2V0IAorICAgIHVjQWNrUmVzcG9uc2U6ICBmbGFnIG5vdGlmeWluZyBpdCBhbiBpbnRlcnJ1cHQgaXMgbmVlZGVkIGZvciB0aGUgCisgICAgICAgICAgICAgICAgICAgIGFja25vd2xlZGdlbWVudCByZWNlaXZlZCB3aGVuIHRoZSBmcmFtZSBpcyBzZW50IG91dCAKKyAgICAgICAgICAgICAgICAgICAgdGhlIGFpciBhbmQgOyB0aGUgaW50ZXJydXB0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IEhBTCwgCisgICAgICAgICAgICAgICAgICAgIG9ubHkgb25lIHN1Y2ggZnJhbWUgY2FuIGJlIHBlbmRpbmcgaW4gdGhlIHN5c3RlbSBhdCAKKyAgICAgICAgICAgICAgICAgICAgb25lIHRpbWUuIAorCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZCAKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBNZ210IEZyYW1lIGNsaWVudCB3YXMgbm90IHlldCByZWdpc3RlcmVkCisgICAgVk9TX1NUQVRVU19FX0JVU1k6ICAgVGhlIHByZXZpb3VzIE1nbXQgcGFja2V0IHdhcyBub3QgeWV0IHRyYW5zbWl0dGVkCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopIAorCisgICAgT3RoZXIgZmFpbHVyZSBtZXNzYWdlcyBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUgQkQgaGVhZGVyIGhhbmRsaW5nIAorICAgIHJvdXRpbmVzLCBwbGVhc2UgY2hlY2sgYXByb3ByaWF0ZSBBUEkgZm9yIG1vcmUgaW5mby4gCisgICAgCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXTEFOVExfVHhNZ210RnJtCisoIAorICB2X1BWT0lEX3QgICAgICAgICAgICBwdm9zR0N0eCwgIAorICB2b3NfcGt0X3QqICAgICAgICAgICB2b3NGcm1CdWYsCisgIHZfVTE2X3QgICAgICAgICAgICAgIHVzRnJtTGVuLAorICB2X1U4X3QgICAgICAgICAgICAgICB1Y0ZybVR5cGUsIAorICB2X1U4X3QgICAgICAgICAgICAgICB0aWQsCisgIFdMQU5UTF9UeENvbXBDQlR5cGUgIHBmbkNvbXBUeEZ1bmMsCisgIHZfUFZPSURfdCAgICAgICAgICAgIHZvb3NCREhlYWRlciwKKyAgdl9VOF90ICAgICAgICAgICAgICAgdWNBY2tSZXNwb25zZQorKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJTlRFUkFDVElPTiBXSVRIIEhBTAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfUmVzZXROb3RpZmljYXRpb24KKworICBERVNDUklQVElPTiAKKyAgICBIQUwgbm90aWZpZXMgVEwgd2hlbiB0aGUgbW9kdWxlIGlzIGJlaW5nIHJlc2V0LgorICAgIEN1cnJlbnRseSBub3QgdXNlZC4KKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KSAKKyAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1Jlc2V0Tm90aWZpY2F0aW9uCisoIAorICB2X1BWT0lEX3QgICBwdm9zR0N0eCAKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfU3VzcGVuZERhdGFUeAorCisgIERFU0NSSVBUSU9OIAorICAgIEhBTCBjYWxscyB0aGlzIEFQSSB3aGVuIGl0IHdpc2hlcyB0byBzdXNwZW5kIHRyYW5zbWlzc2lvbiBmb3IgYSAKKyAgICBwYXJ0aWN1bGFyIFNUQS4KKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIFRoZSBTVEEgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgbXVzdCBiZSBmaXJzdCByZWdpc3RlcmVkIHdpdGggCisgICAgVEwgYnkgSERELiAKKworICAgIFJFU1RSSUNUSU9OOiAgSW4gY2FzZSBvZiBhIHN1c3BlbmQsIHRoZSBmbGFnIHdyaXRlIGFuZCByZWFkIHdpbGwgbm90IGJlIAorICAgICAgICAgICAgICAgICAgbG9ja2VkOiB3b3JzdCBjYXNlIHNjZW5hcmlvIG9uZSBtb3JlIHBhY2tldCBjYW4gZ2V0IAorICAgICAgICAgICAgICAgICAgdGhyb3VnaCBiZWZvcmUgdGhlIGZsYWcgZ2V0cyB1cGRhdGVkICh3ZSBjYW4gbWFrZSB0aGlzIAorICAgICAgICAgICAgICAgICAgd3JpdGUgYXRvbWljIGFzIHdlbGwgdG8gZ3VhcmFudGVlIGNvbnNpc3RlbmN5KQorCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgIHB1Y1NUQUlkOiAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlOyAKKyAgICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBvZiBOVUxMIGFzc3VtZXMgc3VzcGVuZCBvbiBhbGwgYWN0aXZlIHN0YXRpb24KKyAgICBwZm5TdXNwZW5kVHhDQjogcG9pbnRlciB0byB0aGUgc3VzcGVuZCByZXN1bHQgbm90aWZpY2F0aW9uIGluIGNhc2UgdGhlIAorICAgICAgICAgICAgICAgICAgICBjYWxsIGlzIGFzeW5jaHJvbm91cworCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorICAgIAorICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfU3VzcGVuZERhdGFUeAorKCAKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsCisgIHZfVThfdCogICAgICAgICAgICAgICAgIHVjU1RBSWQsCisgIFdMQU5UTF9TdXNwZW5kQ0JUeXBlICAgIHBmblN1c3BlbmRUeAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9SZXN1bWVEYXRhVHgKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgSEFMIHRvIHJlc3VtZSBkYXRhIHRyYW5zbWlzc2lvbiBmb3IgYSBnaXZlbiBTVEEuIAorCisgICAgV0FSTklORzogSWYgYSBzdGF0aW9uIHdhcyBpbmRpdmlkdWFsbHkgc3VzcGVuZGVkIGEgZ2xvYmFsIHJlc3VtZSB3aWxsIAorICAgICAgICAgICAgIG5vdCByZXN1bWUgdGhhdCBzdGF0aW9uCisgICAgICAgICAgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgcHVjU1RBSWQ6ICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gd2hpY2ggaXMgYmVpbmcgcmVzdW1lZDsgTlVMTAorICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVzIGludG8gZ2xvYmFsIHJlc3VtZQorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKyAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1Jlc3VtZURhdGFUeAorKCAKKyAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCisgIHZfVThfdCogICAgICAgIHB1Y1NUQUlkIAorKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDTElFTlQgSU5ERVBFTkRFTlQgSU5URVJGQUNFCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRUeFBrdENvdW50CisKKyAgREVTQ1JJUFRJT04gCisgICAgVEwgd2lsbCBwcm92aWRlIHRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcGFja2V0cyBjb3VudGVkIHBlciAKKyAgICBTVEEgcGVyIFRJRC4gCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gCisgICAgdWNUaWQ6ICAgICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHRzcGVjIAorCisgICAgT1VUCisgICAgcHVUeFBrdENvdW50OiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0eCBwYWNrZXQgZm9yIHRoaXMgU1RBIGFuZCBUSUQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisgICAgCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorICAgIAorICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfR2V0VHhQa3RDb3VudAorKCAKKyAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCisgIHZfVThfdCAgICAgICAgIHVjU1RBSWQsCisgIHZfVThfdCAgICAgICAgIHVjVGlkLAorICB2X1UzMl90KiAgICAgICBwdVR4UGt0Q291bnQKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfR2V0UnhQa3RDb3VudAorCisgIERFU0NSSVBUSU9OIAorICAgIFRMIHdpbGwgcHJvdmlkZSB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgY291bnRlZCBwZXIgCisgICAgU1RBIHBlciBUSUQuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIAorICAgIHVjVGlkOiAgICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSB0c3BlYyAKKyAgIAorICAgT1VUCisgICAgcHVUeFBrdENvdW50OiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyByeCBwYWNrZXQgZm9yIHRoaXMgU1RBIGFuZCBUSUQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZCAKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZCAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisgICAgCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9HZXRSeFBrdENvdW50CisoIAorICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKKyAgdl9VOF90ICAgICAgICAgdWNTVEFJZCwKKyAgdl9VOF90ICAgICAgICAgdWNUaWQsCisgIHZfVTMyX3QqICAgICAgIHB1UnhQa3RDb3VudAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFZPU1MgU0NIRURVTEVSIElOVEVSQUNUSU9OCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfTWNQcm9jZXNzTXNnCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGJ5IFZPU1Mgd2hlbiBhIG1lc3NhZ2Ugd2FzIHNlcmlhbGl6ZWQgZm9yIFRMIHRocm91Z2ggdGhlCisgICAgbWFpbiB0aHJlYWQvdGFzay4gCisKKyAgREVQRU5ERU5DSUVTIAorICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZSAKKyAgICAgICAgICAgICAgICAgICAgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorICAgCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9NY1Byb2Nlc3NNc2cKKygKKyAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKKyAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9NY0ZyZWVNc2cKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgVk9TUyB0byBmcmVlIGEgZ2l2ZW4gVEwgbWVzc2FnZSBvbiB0aGUgTWFpbiB0aHJlYWQgd2hlbiB0aGVyZSAKKyAgICBhcmUgbWVzc2FnZXMgcGVuZGluZyBpbiB0aGUgcXVldWUgd2hlbiB0aGUgd2hvbGUgc3lzdGVtIGlzIGJlZW4gcmVzZXQuIAorICAgIEZvciBub3csIFRMIGRvZXMgbm90IGFsbG9jYXRlIGFueSBib2R5IHNvIHRoaXMgZnVuY3Rpb24gc2hvdXQgdHJhbnNsYXRlIAorICAgIGludG8gYSBOT09QCisKKyAgREVQRU5ERU5DSUVTIAorICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZSAKKyAgICAgICAgICAgICAgICAgICAgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9NY0ZyZWVNc2cKKygKKyAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKKyAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9UeFByb2Nlc3NNc2cKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgVk9TUyB3aGVuIGEgbWVzc2FnZSB3YXMgc2VyaWFsaXplZCBmb3IgVEwgdGhyb3VnaCB0aGUKKyAgICB0eCB0aHJlYWQvdGFzay4gCisKKyAgREVQRU5ERU5DSUVTIAorICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZSAKKyAgICAgICAgICAgICAgICAgICAgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIE90aGVyIHZhbHVlcyBjYW4gYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCBwbGVhc2UgY2hlY2sgCisgIGNvcnJlc3BvbmRpbmcgQVBJIGZvciBtb3JlIGluZm8uIAorICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfVHhQcm9jZXNzTXNnCisoCisgIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCisgIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfTWNGcmVlTXNnCisKKyAgREVTQ1JJUFRJT04gCisgICAgQ2FsbGVkIGJ5IFZPU1MgdG8gZnJlZSBhIGdpdmVuIFRMIG1lc3NhZ2Ugb24gdGhlIE1haW4gdGhyZWFkIHdoZW4gdGhlcmUgCisgICAgYXJlIG1lc3NhZ2VzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlIHdoZW4gdGhlIHdob2xlIHN5c3RlbSBpcyBiZWVuIHJlc2V0LiAKKyAgICBGb3Igbm93LCBUTCBkb2VzIG5vdCBhbGxvY2F0ZSBhbnkgYm9keSBzbyB0aGlzIGZ1bmN0aW9uIHNob3V0IHRyYW5zbGF0ZSAKKyAgICBpbnRvIGEgTk9PUAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLiAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgbWVzc2FnZTogICAgICAgIHR5cGUgYW5kIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UgCisgICAgICAgICAgICAgICAgICAgIAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfVHhGcmVlTXNnCisoCisgIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCisgIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQorKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9FbmFibGVVQVBTREZvckFDCisKKyAgREVTQ1JJUFRJT04gCisgICBDYWxsZWQgYnkgSEREIHRvIGVuYWJsZSBVQVBTRCBpbiBUTC4gVEwgaXMgaW4gY2hhcmdlIGZvciBzZW5kaW5nIHRyaWdnZXIgCisgICBmcmFtZXMuIAorCisgIERFUEVOREVOQ0lFUyAKKyAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLiAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gSWQgCisgICAgdWNBQ0lkOiAgICAgICAgIEFDIGZvciB3aGljaCBVLUFQU0QgaXMgYmVpbmcgZW5hYmxlZCAgCisgICAgdWNUaWQgICAgICAgICAgIFRTcGVjIElkICAgICAKKyAgICB1U2VydmljZUludDogICAgc2VydmljZSBpbnRlcnZhbCB1c2VkIGJ5IFRMIHRvIHNlbmQgdHJpZ2dlciBmcmFtZXMKKyAgICB1U3VzcGVuZEludDogICAgc3VzcGVuZCBpbnRlcnZhbCB1c2VkIGJ5IFRMIHRvIGRldGVybWluZSB0aGF0IGFuIAorICAgICAgICAgICAgICAgICAgICBhcHAgaXMgaWRsZSBhbmQgc2hvdWxkIHN0YXJ0IHNlbmRpbmcgdHJpZ2cgZnJtcyBsZXNzIG9mdGVuCisgICAgd1RTRGlyOiAgICAgICAgIGRpcmVjdGlvbiBvZiBUU3BlYyAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMKKygKKyAgdl9QVk9JRF90ICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICAgdWNTVEFJZCwKKyAgV0xBTlRMX0FDRW51bVR5cGUgIHVjQUNJZCwKKyAgdl9VOF90ICAgICAgICAgICAgIHVjVGlkLAorICB2X1U4X3QgICAgICAgICAgICAgdWNVUCwKKyAgdl9VMzJfdCAgICAgICAgICAgIHVTZXJ2aWNlSW50LAorICB2X1UzMl90ICAgICAgICAgICAgdVN1c3BlbmRJbnQsCisgIFdMQU5UTF9UU0RpclR5cGUgICB3VFNEaXIKKyk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfRGlzYWJsZVVBUFNERm9yQUMKKworICBERVNDUklQVElPTiAKKyAgIENhbGxlZCBieSBIREQgdG8gZGlzYWJsZSBVQVBTRCBpbiBUTC4gVEwgd2lsbCBzdG9wIHNlbmRpbmcgdHJpZ2dlciAKKyAgIGZyYW1lcy4gCisKKyAgREVQRU5ERU5DSUVTIAorICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBJZCAKKyAgICB1Y0FDSWQ6ICAgICAgICAgQUMgZm9yIHdoaWNoIFUtQVBTRCBpcyBiZWluZyBlbmFibGVkICAgICAgIAorICAgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQworKAorICB2X1BWT0lEX3QgICAgICAgICAgcHZvc0dDdHgsCisgIHZfVThfdCAgICAgICAgICAgICB1Y1NUQUlkLAorICBXTEFOVExfQUNFbnVtVHlwZSAgdWNBQ0lkCispOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgV0xBTlRMX1JlZ1JTU0lJbmRpY2F0aW9uQ0IKKworICBERVNDUklQVElPTiAgUmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHRvIGdldCBub3RpZmljYXRpb24gaWYgUlNTSSBjcm9zcworICAgICAgICAgICAgICAgdGhyZXNob2xkLgorICAgICAgICAgICAgICAgQ2xpZW50IHNob3VsZCByZWdpc3RlciB0aHJlc2hvbGQsIGRpcmVjdGlvbiwgYW5kIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorCisgIERFUEVOREVOQ0lFUyBOT05FCisgICAgCisgIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKKyAgICAgICAgICAgICAgIGluIHJzc2lWYWx1ZSAtIFJTU0kgdGhyZXNob2xkIHZhbHVlCisgICAgICAgICAgICAgICBpbiB0cmlnZ2VyRXZlbnQgLSBDcm9zcyBkaXJlY3Rpb24gc2hvdWxkIGJlIG5vdGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUCwgRE9XTiwgYW5kIENST1NTCisgICAgICAgICAgICAgICBpbiBjcm9zc0NCRnVuY3Rpb24gLSBOb3RpZmljYXRpb24gQ0IgRnVuY3Rpb24KKyAgICAgICAgICAgICAgIGluIHVzckN0eHQgLSB1c2VyIGNvbnRleHQKKworICBSRVRVUk4gVkFMVUUgVk9TX1NUQVRVUworCisgIFNJREUgRUZGRUNUUyBOT05FCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9SZWdSU1NJSW5kaWNhdGlvbkNCCisoCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgdl9TN190ICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCwKKyAgIFdMQU5UTF9SU1NJQ3Jvc3NUaHJlc2hvbGRDQlR5cGUgY3Jvc3NDQkZ1bmN0aW9uLAorICAgVk9TX01PRFVMRV9JRCAgICAgICAgICAgICAgICAgICBtb2R1bGVJRCwKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgV0xBTlRMX0RlcmVnUlNTSUluZGljYXRpb25DQgorCisgIERFU0NSSVBUSU9OICBSZW1vdmUgc3BlY2lmaWMgdGhyZXNob2xkIGZyb20gbGlzdAorCisgIERFUEVOREVOQ0lFUyBOT05FCisgICAgCisgIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKKyAgICAgICAgICAgICAgIGluIHJzc2lWYWx1ZSAtIFJTU0kgdGhyZXNob2xkIHZhbHVlCisgICAgICAgICAgICAgICBpbiB0cmlnZ2VyRXZlbnQgLSBDcm9zcyBkaXJlY3Rpb24gc2hvdWxkIGJlIG5vdGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUCwgRE9XTiwgYW5kIENST1NTCisgICAKKyAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKKworICBTSURFIEVGRkVDVFMgTk9ORQorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCCisoCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgdl9TN190ICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCwKKyAgIFdMQU5UTF9SU1NJQ3Jvc3NUaHJlc2hvbGRDQlR5cGUgY3Jvc3NDQkZ1bmN0aW9uLAorICAgVk9TX01PRFVMRV9JRCAgICAgICAgICAgICAgICAgICBtb2R1bGVJRAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX0JNUFNSU1NJUmVnaW9uQ2hhbmdlZE5vdGlmaWNhdGlvbgorKAorICAgdl9QVk9JRF90ICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgdHBTaXJSU1NJTm90aWZpY2F0aW9uIHBSU1NJTm90aWZpY2F0aW9uCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICBXTEFOVExfU2V0QWxwaGEKKworICBERVNDUklQVElPTiAgQUxQTEEgaXMgd2VpZ2h0IHZhbHVlIHRvIGNhbGN1bGF0ZSBBVkcgUlNTSQorICAgICAgICAgICAgICAgYXZnUlNTSSA9IChBTFBIQSAqIGhpc3RvcnlSU1NJKSArICgoMTAgLSBBTFBIQSkgKiBuZXdSU1NJKQorICAgICAgICAgICAgICAgYXZnUlNTSSBoYXMgKEFMUEhBICogMTApJSBvZiBoaXN0b3J5IFJTU0kgd2VpZ2h0IGFuZAorICAgICAgICAgICAgICAgKDEwIC0gQUxQSEEpJSBvZiBuZXdSU1NJIHdlaWdodAorICAgICAgICAgICAgICAgVGhpcyBwb3J0aW9uIGlzIGR5bmFtaWNhbGx5IGNvbmZpZ3VyYWJsZS4KKyAgICAgICAgICAgICAgIERlZmF1bHQgaXMgPworCisgIERFUEVOREVOQ0lFUyBOT05FCisgICAgCisgIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKKyAgICAgICAgICAgICAgIGluIHZhbHVlQWxwYWggLSBBTFBIQQorICAgCisgIFJFVFVSTiBWQUxVRSBWT1NfU1RBVFVTCisKKyAgU0lERSBFRkZFQ1RTIE5PTkUKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX1NldEFscGhhCisoCisgICB2X1BWT0lEX3QgcEFkYXB0ZXIsCisgICB2X1U4X3QgICAgdmFsdWVBbHBoYQorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgV0xBTlRMX1JlZ0dldFRyYWZmaWNTdGF0dXMKKworICBERVNDUklQVElPTiAgUmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0cmFmZmljIHN0YXR1cyBtb25pdG9yaW5nCisgICAgICAgICAgICAgICBEdXJpbmcgbWVhc3VyZSBwZXJpb2QgY291bnQgZGF0YSBmcmFtZXMuCisgICAgICAgICAgICAgICBJZiBmcmFtZSBjb3VudCBpcyBsYXJnZXIgdGhlbiBJRExFIHRocmVzaG9sZCBzZXQgYXMgdHJhZmZpYyBPTgorICAgICAgICAgICAgICAgb3IgT0ZGLgorICAgICAgICAgICAgICAgQW5kIHRyYWZmaWMgc3RhdHVzIGlzIGNoYW5nZWQgc2VuZCByZXBvcnQgdG8gY2xpZW50IHdpdGgKKyAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24KKworICBERVBFTkRFTkNJRVMgTk9ORQorICAgIAorICBQQVJBTUVURVJTICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCisgICAgICAgICAgICAgICBpbiBpZGxlVGhyZXNob2xkIC0gVHJhZmZpYyBvbiBvciBvZmYgdGhyZXNob2xkCisgICAgICAgICAgICAgICBpbiBtZWFzdXJlUGVyaW9kIC0gVHJhZmZpYyBzdGF0ZSBjaGVjayBwZXJpb2QKKyAgICAgICAgICAgICAgIGluIHRyZmZpY1N0YXR1c0NCIC0gdHJhZmZpYyBzdGF0dXMgY2hhbmdlZCBub3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0IgZnVuY3Rpb24KKyAgICAgICAgICAgICAgIGluIHVzckN0eHQgLSB1c2VyIGNvbnRleHQKKyAgIAorICBSRVRVUk4gVkFMVUUgVk9TX1NUQVRVUworCisgIFNJREUgRUZGRUNUUyBOT05FCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9SZWdHZXRUcmFmZmljU3RhdHVzCisoCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlVGhyZXNob2xkLAorICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlUGVyaW9kLAorICAgV0xBTlRMX1RyYWZmaWNTdGF0dXNDaGFuZ2VkQ0JUeXBlICB0cmZmaWNTdGF0dXNDQiwKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dAorKTsKKyNlbmRpZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRTdGF0aXN0aWNzCisKKyAgREVTQ1JJUFRJT04gICBHZXQgdHJhZmZpYyBzdGF0aXN0aWNzIGZvciBpZGVudGlmaWVkIHN0YXRpb24gCisKKyAgREVQRU5ERU5DSUVTICBOT05FCisgICAgCisgIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCisgICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CisgICAgICAgICAgICAgICAgb3V0IHN0YXRCdWZmZXIgLSB0cmFmZmljIHN0YXRpc3RpY3MgYnVmZmVyCisgICAKKyAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCisKKyAgU0lERSBFRkZFQ1RTICBOT05FCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9HZXRTdGF0aXN0aWNzCisoCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKKyAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAgKnN0YXRCdWZmZXIsCisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICBTVEFpZAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgIFdMQU5UTF9SZXNldFN0YXRpc3RpY3MKKworICBERVNDUklQVElPTiAgIFJlc2V0IHN0YXRpc3RpY3Mgc3RydWN0dXJlIGZvciBpZGVudGlmaWVkIHN0YXRpb24gSUQKKyAgICAgICAgICAgICAgICBSZXNldCBtZWFucyBzZXQgdmFsdWVzIGFzIDAKKworICBERVBFTkRFTkNJRVMgIE5PTkUKKyAgICAKKyAgUEFSQU1FVEVSUyAgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKKyAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKKyAgIAorICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKKworICBTSURFIEVGRkVDVFMgIE5PTkUKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX1Jlc2V0U3RhdGlzdGljcworKAorICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICBTVEFpZAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRTcGVjU3RhdGlzdGljCisKKyAgREVTQ1JJUFRJT04gICBHZXQgc3BlY2lmaWMgZmllbGQgd2l0aGluIHN0YXRpc3RpY3Mgc3RydWN0dXJlIGZvcgorICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgc3RhdGlvbiBJRCAKKworICBERVBFTkRFTkNJRVMgIE5PTkUKKworICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQorICAgICAgICAgICAgICAgIGluIHN0YXRUeXBlIC0gc3BlY2lmaWMgc3RhdGlzdGljcyBmaWVsZCB0byByZXNldAorICAgICAgICAgICAgICAgIGluIFNUQWlkICAgIC0gU3RhdGlvbiBJRAorICAgICAgICAgICAgICAgIG91dCBidWZmZXIgIC0gU3RhdGlzdGljIHZhbHVlCisgICAKKyAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCisKKyAgU0lERSBFRkZFQ1RTICBOT05FCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9HZXRTcGVjU3RhdGlzdGljCisoCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgV0xBTlRMX1RSQU5TRkVSX1NUQVRJQ19UWVBFICBzdGF0VHlwZSwKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAorICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICBTVEFpZAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgIFdMQU5UTF9SZXNldFNwZWNTdGF0aXN0aWMKKworICBERVNDUklQVElPTiAgIFJlc2V0IHNwZWNpZmljIGZpZWxkIHdpdGhpbiBzdGF0aXN0aWNzIHN0cnVjdHVyZSBmb3IKKyAgICAgICAgICAgICAgICBpZGVudGlmaWVkIHN0YXRpb24gSUQKKyAgICAgICAgICAgICAgICBSZXNldCBtZWFucyBzZXQgYXMgMAorCisgIERFUEVOREVOQ0lFUyAgTk9ORQorICAgIAorICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQorICAgICAgICAgICAgICAgIGluIHN0YXRUeXBlIC0gc3BlY2lmaWMgc3RhdGlzdGljcyBmaWVsZCB0byByZXNldAorICAgICAgICAgICAgICAgIGluIFNUQWlkICAgIC0gU3RhdGlvbiBJRAorCisgIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUworCisgIFNJREUgRUZGRUNUUyAgTk9ORQorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfUmVzZXRTcGVjU3RhdGlzdGljCisoCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgV0xBTlRMX1RSQU5TRkVSX1NUQVRJQ19UWVBFICBzdGF0VHlwZSwKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgU1RBaWQKKyk7CisjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgICBXTEFOVExfSXNSZXBsYXlQYWNrZXQKKyAgIAorICBERVNDUklQVElPTiAgIFRoaXMgZnVuY3Rpb24gZG9lcyByZXBsYXkgY2hlY2sgZm9yIHZhbGlkIHN0YXRpb25zCisKKyAgREVQRU5ERU5DSUVTICBWYWxpZGl0eSBvZiByZXBsYXkgY2hlY2sgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZnVuY3Rpb24gCisgICAgICAgICAgICAgICAgaXMgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgUEFSQU1FVEVSUyAgICBjdXJyZW50UmVwbGF5Q291bnRlciAgICBjdXJyZW50IHJlcGxheSBjb3VudGVyIHRha2VuIGZyb20gUlggQkQgCisgICAgICAgICAgICAgICAgcHJldmlvdXNSZXBsYXlDb3VudGVyICAgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgdGFrZW4gZnJvbSBUTCBDQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFJFVFJVTiAgICAgICAgVk9TX1RSVUUgICAgcGFja2V0IGlzIGEgcmVwbGF5IHBhY2tldAorICAgICAgICAgICAgICAgIFZPU19GQUxTRSAgIHBhY2tldCBpcyBub3QgYSByZXBsYXkgcGFja2V0CisKKyAgU0lERSBFRkZFQ1RTICAgbm9uZQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9CT09MX3QgV0xBTlRMX0lzUmVwbGF5UGFja2V0CisoCisgICAgdl9VNjRfdCAgICBjdXJyZW50UmVwbGF5Q291bnRlciwKKyAgICB2X1U2NF90ICAgIHByZXZpb3VzUmVwbGF5Q291bnRlcgorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFJlcGxheUNvdW50ZXJGcm9tUnhCRAorICAgICAKKyAgREVTQ1JJUFRJT04gICBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIDQ4LWJpdCByZXBsYXkgcGFja2V0IG51bWJlciBmcm9tIFJYIEJEIAorIAorICBERVBFTkRFTkNJRVMgIFZhbGlkaXR5IG9mIHJlcGxheSBjaGVjayBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBmdW5jdGlvbiAKKyAgICAgICAgICAgICAgICBpcyBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFBBUkFNRVRFUlMgICAgcHVjUnhIZWFkZXIgcG9pbnRlciB0byBSWCBCRCBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBSRVRSVU4gICAgICAgIHZfVTY0X3QgICAgUGFja2V0IG51bWJlciBleHRhcmN0ZWQgZnJvbSBSWCBCRAorCisgIFNJREUgRUZGRUNUUyAgIG5vbmUKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfVTY0X3QKK1dMQU5UTF9HZXRSZXBsYXlDb3VudGVyRnJvbVJ4QkQKKygKKyAgIHZfVThfdCAqcHVjUnhCREhlYWRlcgorKTsKKyNlbmRpZiAvKkVuZCBvZiAjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TKi8KKworCisKKy8qCisgREVTQ1JJUFRJT04gCisgICAgVEwgcmV0dXJucyB0aGUgd2VpZ2h0IGN1cnJlbnRseSBtYWludGFpbmVkIGluIFRMLgorIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisKKyBPVVQKKyAgICBwQUNXZWlnaHRzOiAgICAgQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIGZpbGxpbmcgaW4gd2VpZ2h0cworCisgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCisqLworVk9TX1NUQVRVUyAgCitXTEFOVExfR2V0QUNXZWlnaHRzIAorKCAKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QqICAgICAgICAgICAgICAgcEFDV2VpZ2h0cworKTsKKworCisvKgorIERFU0NSSVBUSU9OIAorICAgIENoYW5nZSB0aGUgd2VpZ2h0IGN1cnJlbnRseSBtYWludGFpbmVkIGJ5IFRMLgorIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgcEFDV2VpZ2h0czogICAgIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IGNvbnRhaW4gdGhlIHdlaWdodHMgdG8gdXNlCisKKworIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUworKi8KK1ZPU19TVEFUVVMgIAorV0xBTlRMX1NldEFDV2VpZ2h0cyAKKyggCisgIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKKyAgdl9VOF90KiAgICAgICAgICAgICAgIHBBQ1dlaWdodHMKKyk7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFNvZnRBUFN0YXRpc3RpY3MKKworICBERVNDUklQVElPTiAgIENvbGxlY3QgdGhlIGN1bXVsYXRpdmUgc3RhdGlzdGljcyBmb3IgYWxsIFNvZnRhcCBzdGF0aW9ucworCisgIERFUEVOREVOQ0lFUyAgTk9ORQorICAgIAorICBQQVJBTUVURVJTICAgIGluIHB2b3NHQ3R4ICAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dAorICAgICAgICAgICAgICAgICAgIGJSZXNldCAgICAtIElmIHNldCBUTCBzdGF0aXN0aWNzIHdpbGwgYmUgY2xlYXJlZCBhZnRlciByZWFkaW5nCisgICAgICAgICAgICAgICAgb3V0IHN0YXRzU3VtIC0gcG9pbnRlciB0byBjb2xsZWN0ZWQgc3RhdGlzdGljcworCisgIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVU19TVUNDRVNTIDogaWYgdGhlIFN0YXRpc3RpY3MgYXJlIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQKKworICBTSURFIEVGRkVDVFMgIE5PTkUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9HZXRTb2Z0QVBTdGF0aXN0aWNzKHZfUFZPSURfdCBwQWRhcHRlciwgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0c1N1bSwgdl9CT09MX3QgYlJlc2V0KTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyB9CisjZW5kaWYgCisKKworIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0Fzc29jRmFpbGVkCisKKyAgREVTQ1JJUFRJT04KKworICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBQRSB0byBub3RpZnkgVEwgdGhhdCBjYWNoZSBuZWVkcyB0byBmbHVzaGVkCisgICAgd2hlbiBhc3NvY2lhdGlvbiBpcyBub3Qgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAKKworICAgIEludGVybmFsbHksIFRMIHBvc3QgYSBtZXNzYWdlIHRvIFRYX1RocmVhZCB0byBzZXJpYWxpemUgdGhlIHJlcXVlc3QgdG8gCisgICAga2VlcCBsb2NrLWZyZWUgbWVjaGFuaXNtLgorCisgICAKKyAgREVQRU5ERU5DSUVTCisKKyAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KKworICAgCisgIFBBUkFNRVRFUlMKKworICAgdWNTVEFJZDogICBzdGF0aW9uIGlkIAorCisgIFJFVFVSTiBWQUxVRQorCisgICBub25lCisgICAKKyAgU0lERSBFRkZFQ1RTCisgICBUaGVyZSBtYXkgYmUgcmFjZSBjb25kaXRpb24gdGhhdCBQRSBjYWxsIHRoaXMgQVBJIGFuZCBzZW5kIGFub3RoZXIgYXNzb2NpYXRpb24KKyAgIHJlcXVlc3QgaW1tZWRpYXRlbHkgd2l0aCBzYW1lIHN0YUlkIGJlZm9yZSBUWF90aHJlYWQgY2FuIHByb2Nlc3MgdGhlIG1lc3NhZ2UuCisKKyAgIFRvIGF2b2lkIHRoaXMsIHdlIG1pZ2h0IG5lZWQgUEUgdG8gd2FpdCBmb3IgVFhfdGhyZWFkIHByb2Nlc3MgdGhlIG1lc3NhZ2UsCisgICBidXQgdGhpcyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiAKKyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFdMQU5UTF9Bc3NvY0ZhaWxlZCh2X1U4X3Qgc3RhSWQpOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgIFdMQU5UTF9Qb3N0UmVzTmVlZGVkCisgICAgIAorICBERVNDUklQVElPTiAgIFRoaXMgZnVuY3Rpb24gcG9zdHMgbWVzc2FnZSB0byBUTCB0byByZXNlcnZlIEJEL1BEVSBtZW1vcnkKKyAKKyAgREVQRU5ERU5DSUVTICBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBQQVJBTUVURVJTICAgIHB2b3NHQ3R4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgUkVUVVJOICAgICAgICBOb25lCisKKyAgU0lERSBFRkZFQ1RTICAgbm9uZQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIFdMQU5UTF9Qb3N0UmVzTmVlZGVkKHZfUFZPSURfdCBwdm9zR0N0eCk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0ZpbmlzaF9VTEEKKworICBERVNDUklQVElPTgorICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgSEREIHRvIG5vdGlmeSBUTCB0byBmaW5pc2ggVXBwZXIgbGF5ZXIgYXV0aGVudGljYXRpb24KKyAgICAgaW5jYXNlIHRoZSBsYXN0IEVBUE9MIHBhY2tldCBpcyBwZW5kaW5nIGluIHRoZSBUTCBxdWV1ZS4gCisgICAgIFRvIGF2b2lkIHRoZSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHNtZSBzZXQga2V5IGFuZCB0aGUgbGFzdCBFQVBPTCBwYWNrZXQgCisgICAgIHRoZSBIREQgbW9kdWxlIGNhbGxzIHRoaXMgZnVuY3Rpb24ganVzdCBiZWZvcmUgY2FsbGluZyB0aGUgc21lX1JvYW1TZXRLZXkuCisgICAKKyAgREVQRU5ERU5DSUVTCisKKyAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KKworICAgCisgIFBBUkFNRVRFUlMKKworICAgY2FsbGJhY2tSb3V0aW5lOiAgIEhERCBDYWxsYmFjayBmdW5jdGlvbi4KKyAgIGNhbGxiYWNrQ29udGV4dCA6IEhERCB1c2VyZGF0YSBjb250ZXh0LgorCisgIFJFVFVSTiBWQUxVRQorCisgICBWT1NfU1RBVFVTX1NVQ0NFU1MvVk9TX1NUQVRVU19GQUlMVVJFCisgICAKKyAgU0lERSBFRkZFQ1RTCisgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitWT1NfU1RBVFVTIFdMQU5UTF9GaW5pc2hfVUxBKCB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNhbGxiYWNrQ29udGV4dCk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgICBXTEFOVExfVXBkYXRlUnNzaUJtcHMKKworICBERVNDUklQVElPTiAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIFRMJ3MgUlNTSSAoaW4gQk1QUyBtb2RlKQorCisgIERFUEVOREVOQ0lFUyAgIE5vbmUKKworICBQQVJBTUVURVJTCisKKyAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0ICAgICAgICAgIFZPUyBHbG9iYWwgY29udGV4dAorICAgIHN0YUlkICAgICAgICAgICAgU3RhdGlvbiBJRCAgICAgICAgICAgU3RhdGlvbiBJRAorICAgIHJzc2kgICAgICAgICAgICAgUlNTSSAoQk1QUyBtb2RlKSAgICAgUlNTSSBpbiBCTVBTIG1vZGUKKworICBSRVRVUk4gICAgICAgICBOb25lCisKKyAgU0lERSBFRkZFQ1RTICAgbm9uZQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIFdMQU5UTF9VcGRhdGVSc3NpQm1wcyh2X1BWT0lEX3QgcHZvc0dDdHgsIHZfVThfdCBzdGFJZCwgdl9TN190IHJzc2kpOworCisjZW5kaWYgLyogI2lmbmRlZiBXTEFOX1FDVF9XTEFOVExfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9UTC9zcmMvd2xhbl9xY3RfdGwuYyBiL0NPUkUvVEwvc3JjL3dsYW5fcWN0X3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5NWY4MAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVEwvc3JjL3dsYW5fcWN0X3RsLmMKQEAgLTAsMCArMSwxMDY5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworICAgICAgICAgICAgICAgICAgICAgICBXIEwgQSBOIF8gUSBDIFQgXyBUIEwgLiBDCisKKyAgT1ZFUlZJRVc6CisKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBUcmFuc3BvcnQgTGF5ZXIuCisKKyAgVGhlIGZ1bmN0aW9ucyBleHRlcm5hbGl6ZWQgYnkgdGhpcyBtb2R1bGUgYXJlIHRvIGJlIGNhbGxlZCBPTkxZIGJ5IG90aGVyCisgIFdMQU4gbW9kdWxlcyB0aGF0IHByb3Blcmx5IHJlZ2lzdGVyIHdpdGggdGhlIFRyYW5zcG9ydCBMYXllciBpbml0aWFsbHkuCisKKyAgREVQRU5ERU5DSUVTOgorCisgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorCisKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAgJEhlYWRlciQkRGF0ZVRpbWUkJEF1dGhvciQKKworCisgIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwMTAtMDctMTMgICAgY19zaGluZGUgRml4ZWQgYW4gaXNzdWUgd2hlcmUgV0FQSSByZWtleWluZyB3YXMgZmFpbGluZyBiZWNhdXNlIAorICAgICAgICAgICAgICAgICAgICAgIFdBSSBmcmFtZSBzZW50IG91dCBkdXJpbmcgcmVrZXlpbmcgaGFkIHRoZSBwcm90ZWN0ZWQgYml0CisgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIDEuCisyMDEwLTA1LTA2ICAgIHJuYWlyICAgQ2hhbmdlZCBuYW1lIG9mIHZhcmlhYmxlIGZyb20gdXNMbGNUeXBlIHRvIHVzRXRoZXJUeXBlCisgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZCBmdW5jdGlvbiBuYW1lIGZyb20gR2V0TExDVHlwZSB0byBHZXRFdGhlclR5cGUKKyAgICAgICAgICAgICAgICAgICAgICBGaXhlZCA4MDIuMyB0byA4MDIuMTEgZnJhbWUgdHJhbnNsYXRpb24gaXNzdWUgd2hlcmUgdHdvIAorICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIG9mIHRoZSBMTEMgaGVhZGVyIHdhcyBnZXR0aW5nIG92ZXJ3cml0dGVuIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgIG5vbi1Rb3MgcGF0aAorMjAxMC0wNS0wNiAgICBybmFpciAgIFJ4QXV0aCBwYXRoIGZpeCBmb3IgbW9kaWZ5aW5nIHRoZSBoZWFkZXIgYmVmb3JlIGV0aGVyCisgICAgICAgICAgICAgICAgICAgICAgdHlwZSBpcyByZXRyZWl2ZWQgKERldGVjdGVkIHdoaWxlIHRlc3RpbmcgcmVrZXlpbmcKKyAgICAgICAgICAgICAgICAgICAgICBpbiBXQVBJIFZvbGFucykKKzIwMTAtMDItMTkgICAgYmFkICAgICBGaXhlZCA4MDIuMTEgdG8gODAyLjMgZnQgaXNzdWVzIHdpdGggV0FQSQorMjAxMC0wMi0xOSAgICBybmFpciAgIFdBUEk6IElmIGZyYW1lIGlzIGEgV0FJIGZyYW1lIGluIFR4Q29ubiBhbmQgVHhBdXRoLCBUTCAKKyAgICAgICAgICAgICAgICAgICAgICBkb2VzIGZyYW1lIHRyYW5zbGF0aW9uLiAKKzIwMTAtMDItMDEgICAgcm5haXIgICBXQVBJOiBGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgdmFsdWUgb2YgdWNJc1dhcGlTdGEgd2FzIG5vdCAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBiZWluZyBzZXQgaW4gdGhlIFRMIGNvbnRyb2wgYmxvY2sgaW4gdGhlIFJlZ2lzdGVyU1RBIGZ1bmMuIAorMjAxMC0wMS0wOCAgICBsdGkgICAgIEFkZGVkIFRMIERhdGEgQ2FjaGluZyAKKzIwMDktMTEtMDQgICAgcm5haXIgICBXQVBJOiBNb3ZpbmcgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdG8gYSBzZXBlcmF0ZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBXTEFOVExfR2V0TExDVHlwZQorMjAwOS0xMC0xNSAgICBybmFpciAgIFdBUEk6IEZlYXR1cml6aW5nIFdBUEkgY29kZQorMjAwOS0xMC0wOSAgICBybmFpciAgIFdBUEk6IE1vZGlmaWNhdGlvbnMgdG8gYXV0aGVudGljYXRlZCBzdGF0ZSBoYW5kbGluZyBvZiBSeCBkYXRhCisyMDA5LTEwLTA2ICAgIHJuYWlyICAgQWRkaW5nIHN1cHBvcnQgZm9yIFdBUEkgCisyMDA5LTA5LTIyICAgIGx0aSAgICAgQWRkIGRlcmVnaXN0cmF0aW9uIEFQSSBmb3IgbWFuYWdlbWVudCBjbGllbnQKKzIwMDktMDctMTYgICAgcm5haXIgICBUZW1wb3JhcnkgZml4IHRvIGxldCBUTCBmZXRjaCBwYWNrZXRzIHdoZW4gbXVsdGlwbGUgCisgICAgICAgICAgICAgICAgICAgICAgcGVlcnMgZXhpc3QgaW4gYW4gSUJTUworMjAwOS0wNi0xMCAgICBsdGkgICAgIEZpeCBmb3IgY2hlY2tpbmcgVElEIHZhbHVlIG9mIG1ldGEgaW5mbyBvbiBUWCAtIHByZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgb3ZlcndyaXRlIAorICAgICAgICAgICAgICAgICAgICAgIEZpeCBmb3IgcHJvcGVybHkgY2hlY2tpbmcgdGhlIHN0YSBpZCBmb3IgcmVzdW1pbmcgdHJpZ2dlcgorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGdlbmVyYXRpb24KKzIwMDktMDUtMTQgICAgbHRpICAgICBGaXggZm9yIHNlbmRpbmcgb3V0IHRyaWdnZXIgZnJhbWVzCisyMDA5LTA1LTE1ICAgIGx0aSAgICAgQWRkcjMgZmlsdGVyaW5nIAorMjAwOS0wNC0xMyAgICBsdGkgICAgIEFzc2VydCBpZiBwYWNrZXQgbGFyZ2VyIHRoZW4gYWxsb3dlZAorICAgICAgICAgICAgICAgICAgICAgIERyb3AgcGFja2V0IHRoYXQgZmFpbHMgZmxhdHRlbgorMjAwOS0wNC0wMiAgICBsdGkgICAgIFBlcmZvcm1hbmNlIGZpeGVzIGZvciBUTCAKKzIwMDktMDItMTkgICAgbHRpICAgICBBZGRlZCBmaXggZm9yIExMQyBtYW5hZ2VtZW50IG9uIFJ4IENvbm5lY3QgCisyMDA5LTAxLTE2ICAgIGx0aSAgICAgUmVwbGFjZWQgcGVlayBkYXRhIHdpdGggZXh0cmFjdCBkYXRhIGZvciBub24gQkQgb3BlcnRpb25zCisgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdGVkIGZyYW1lIGNvbnRyb2wgaW4gVGwgYW5kIHBhc3MgdG8gSEFMIGZvciBmcmFtZSAKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlIGV2YWx1YXRpb24KKzIwMDktMDItMDIgICAgc2NoICAgICBBZGQgaGFuZG9mZiBzdXBwb3J0CisyMDA4LTEyLTA5ICAgIGx0aSAgICAgRml4ZXMgZm9yIEFNU1MgY29tcGlsYXRpb24gCisgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlZCBhc3NlcnQgb24gcmVjZWl2ZSB3aGVuIHRoZXJlIGlzIG5vIHN0YXRpb24KKzIwMDgtMTItMDIgICAgbHRpICAgICBGaXggZm8gdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uIAorMjAwOC0xMC0zMSAgICBsdGkgICAgIEZpeCBmbyBUTCB0eCBzdXNwZW5kCisyMDA4LTEwLTAxICAgIGx0aSAgICAgTWVyZ2VkIGluIGZpeGVzIGZyb20gcmVvcmRlcmluZworICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkIHBhcnQgb2YgVUFQU0QgZnVuY3Rpb25hbGl0eSBpbiBUTAorICAgICAgICAgICAgICAgICAgICAgICh3aWxsIGJlIHJlLWVuYWJsZWQgb25jZSBVQVBTRCBpcyB0ZXN0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgRml4IGZvciBVQVBTRCBtdWx0aXBsZSBlbmFibGUKKzIwMDgtMDgtMTAgICAgbHRpICAgICBGaXhlcyBmb2xsb3dpbmcgVUFQU0QgdGVzdGluZworICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIGluZmluaXRlIGxvb3Agb24gbWFzayBjb21wdXRhdGlvbiB3aGVuIFNUQSBubyByZWcKKzIwMDgtMDgtMDYgICAgbHRpICAgICBGaXhlcyBhZnRlciBRT1MgdW5pdCB0ZXN0aW5nCisyMDA4LTA4LTA2ICAgIGx0aSAgICAgQWRkZWQgUU9TIHN1cHBvcnQKKzIwMDgtMDctMjMgICAgbHRpICAgICBGaXggZm9yIHZvcyBwYWNrZXQgZHJhaW5pbmcKKzIwMDgtMDctMTcgICAgbHRpICAgICBGaXggZm9yIGRhdGEgdHlwZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZyYW1lIHRyYW5zbGF0aW9uIGNvZGUgaW4gVEwKKyAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXR1cm5pbmcgZmFpbHVyZSB0byBQRSBpbiBjYXNlIHByZXZpb3VzIGZyYW1lIGlzCisgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgcGVuZGluZzsgZmFpbCBwcmV2aW91cyBhbmQgY2FjaGUgbmV3IG9uZSBmb3IgdHgKKyAgICAgICAgICAgICAgICAgICAgICBHZXQgZnJhbWVzIHJldHVybmluZyBib29sZWFuIHRydWUgaWYgbW9yZSBmcmFtZXMgYXJlIHBlbmRpbmcKKzIwMDgtMDctMDMgICAgbHRpICAgICBGaXhlcyBmb2xsb3dpbmcgcHJlLWludGVncmF0aW9uIHRlc3RpbmcKKzIwMDgtMDYtMjYgICAgbHRpICAgICBGaXhlcyBmb2xsb3dpbmcgdW5pdCB0ZXN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgYWxsb2MgYW5kIGZyZWUgZm9yIFRMIGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICBVc2luZyBhdG9taWMgc2V0IHU4IGluc3RlYWQgb2YgdTMyCisyMDA4LTA1LTE2ICAgIGx0aSAgICAgQ3JlYXRlZCBtb2R1bGUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIiAKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGEuaCIgCisjaW5jbHVkZSAid2xhbl9xY3RfdGxpLmgiIAorI2luY2x1ZGUgIndsYW5fcWN0X3RsaV9iYS5oIiAKKyNpbmNsdWRlICJ3bGFuX3FjdF90bF9ob3N1cHBvcnQuaCIKKyNpZiAhZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyNpbmNsdWRlICJ3bGFuX3FjdF9zc2MuaCIKKyNlbmRpZgorI2luY2x1ZGUgInRsRGVidWcuaCIKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorLypJbmNsdWRlZCB0byBhY2Nlc3MgV0RJX1J4QmRUeXBlICovCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2JkLmgiCisjZW5kaWYKKy8qRW5hYmxlcyBkZWJ1Z2dpbmcgYmVoYXZpb3IgaW4gVEwqLworI2RlZmluZSBUTF9ERUJVRworLy8jZGVmaW5lIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCisKKy8vI2RlZmluZSBCVEFNUF9URVNUCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qTExDIGhlYWRlciB2YWx1ZSovCitzdGF0aWMgdl9VOF90IFdMQU5UTF9MTENfSEVBREVSW10gPSAgezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKy8qQWlyb25ldCBTTkFQIGhlYWRlciB2YWx1ZSovCitzdGF0aWMgdl9VOF90IFdMQU5UTF9BSVJPTkVUX1NOQVBfSEVBREVSW10gPSAgezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDAgfTsKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9DQ1gKKworLypCVC1BTVAgcGFja2V0IExMQyBPVUkgdmFsdWUqLworY29uc3Qgdl9VOF90IFdMQU5UTF9CVF9BTVBfT1VJW10gPSAgezB4MDAsIDB4MTksIDB4NTggfTsKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNkZWZpbmUgV0xBTlRMX0JEX1BEVV9SRVNFUlZFX1RIUkVTSE9MRCAgICAgICAgICAgODAKKyNlbmRpZgorCisjaWZkZWYgVk9MQU5TX1BFUkYKKyNkZWZpbmUgV0xBTlRMX0JEX1BEVV9JTlRFUlJVUFRfRU5BQkxFX1RIUkVTSE9MRCAgMTIwCisjZGVmaW5lIFdMQU5UTF9CRF9QRFVfSU5URVJSVVBUX0dFVF9USFJFU0hPTEQgIDEyMAorCisvKiBUTCBCRC9QRFUgdGhyZXNob2xkIHRvIGVuYWJsZSBpbnRlcnJ1cHQgKi8KK2ludCBiZFBkdUludGVycnVwdEVuYWJsZVRocmVzaG9sZCA9IFdMQU5UTF9CRF9QRFVfSU5URVJSVVBUX0VOQUJMRV9USFJFU0hPTEQ7CitpbnQgYmRQZHVJbnRlcnJ1cHRHZXRUaHJlc2hvbGQgPSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9HRVRfVEhSRVNIT0xEOworI2VuZGlmIC8qIFZPTEFOU19QRVJGICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgfCAgIFR5cGUoMmIpICAgfCAgICAgU3ViLXR5cGUoNGIpICAgfAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdMQU5UTF9JU19EQVRBX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfREFUQV9GUkFNRV9UWVBFID09ICggKF90eXBlX3N1YikgJiAweDMwICkpCisKKyNkZWZpbmUgV0xBTlRMX0lTX1FPU19EQVRBX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICgoIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkgJiYgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFID09ICggKF90eXBlX3N1YikgJiAweEYgKSkpIAorCisjZGVmaW5lIFdMQU5UTF9JU19NR01UX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfTUdNVF9GUkFNRV9UWVBFID09ICggKF90eXBlX3N1YikgJiAweDMwICkpCisKKyNkZWZpbmUgV0xBTlRMX0lTX0NUUkxfRlJBTUUoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF9DVFJMX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkKKworLypNQVggQWxsb3dlZCBsZW4gcHJvY2Vzc2VkIGJ5IFRMIC0gTUF4IE1UVSArIDgwMi4zIGhlYWRlciArIEJEK0RYRStYVEwqLworI2RlZmluZSBXTEFOVExfTUFYX0FMTE9XRURfTEVOICAgIDE1MTQgKyAxMDAKKworI2RlZmluZSBXTEFOVExfTUFTS19BQyAgMHgwMworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorLy9zb21lIGZsb3dfY29udHJvbCBkZWZpbmUKKy8vTFdNIG1vZGUgd2lsbCBiZSBlbmFibGVkIGZvciB0aGlzIHN0YXRpb24gaWYgdGhlIGVncmVzcy9pbmdyZXNzIGZhbGxzIGJlbG93IHRoaXMgcmF0aW8KKyNkZWZpbmUgV0xBTlRMX0xXTV9FR1JFU1NfSU5HUkVTU19USFJFU0hPTEQgKDAuNzUpCisKKy8vR2V0IGVub3VnaCBzYW1wbGUgdG8gZG8gdGhlIExXTSByZWxhdGVkIGNhbGN1bGF0aW9uCisjZGVmaW5lIFdMQU5UTF9MV01fSU5HUkVTU19TQU1QTEVfVEhSRVNIT0xEICg2NCkKKworLy9NYXhpbWFsIG9uLWZseSBwYWNrZXQgcGVyIHN0YXRpb24gaW4gTFdNIG1vZGUKKyNkZWZpbmUgV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWCAoMjU2KQorCisjZGVmaW5lIFdMQU5UTF9BQ19NQVNLICgweDcpCisjZGVmaW5lIFdMQU5UTF9TVEFJRF9PRkZTRVQgKDB4NCkKKyNlbmRpZgorCisvKiBVSU5UMzIgdHlwZSBlbmRpYW4gc3dhcCAqLworI2RlZmluZSBTV0FQX0VORElBTl9VSU5UMzIoYSkgICAgICAgICAgKChhKSA9ICgoYSkgPj4gMHgxOCApIHwoKChhKSAmIDB4RkYwMDAwKSA+PiAweDA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgJiAweEZGMDApIDw8IDB4MDgpICB8ICgoKGEpICYgMHhGRikgPDwgMHgxOCkpCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUSUQgdG8gQUMgbWFwcGluZyBpbiBUTAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2NvbnN0IHZfVThfdCAgV0xBTlRMX1RJRF8yX0FDW1dMQU5fTUFYX1RJRF0gPSB7ICAgV0xBTlRMX0FDX0JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQUNfQkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ19CSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDX0JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQUNfVkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ19WSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDX1ZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQUNfVk8gfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFRMX0xJVFRMRV9CSVRfRU5ESUFOCisKK3R5cGVkZWYgc3RydWN0Cit7CisKKyNpZm5kZWYgVExfTElUVExFX0JJVF9FTkRJQU4KKworICAgdl9VOF90IHN1YlR5cGUgOjQ7CisgICB2X1U4X3QgdHlwZSA6MjsKKyAgIHZfVThfdCBwcm90VmVyIDoyOworCisgICB2X1U4X3Qgb3JkZXIgOjE7CisgICB2X1U4X3Qgd2VwIDoxOworICAgdl9VOF90IG1vcmVEYXRhIDoxOworICAgdl9VOF90IHBvd2VyTWdtdCA6MTsKKyAgIHZfVThfdCByZXRyeSA6MTsKKyAgIHZfVThfdCBtb3JlRnJhZyA6MTsKKyAgIHZfVThfdCBmcm9tRFMgOjE7CisgICB2X1U4X3QgdG9EUyA6MTsKKworI2Vsc2UKKworICAgdl9VOF90IHByb3RWZXIgOjI7CisgICB2X1U4X3QgdHlwZSA6MjsKKyAgIHZfVThfdCBzdWJUeXBlIDo0OworCisgICB2X1U4X3QgdG9EUyA6MTsKKyAgIHZfVThfdCBmcm9tRFMgOjE7CisgICB2X1U4X3QgbW9yZUZyYWcgOjE7CisgICB2X1U4X3QgcmV0cnkgOjE7CisgICB2X1U4X3QgcG93ZXJNZ210IDoxOworICAgdl9VOF90IG1vcmVEYXRhIDoxOworICAgdl9VOF90IHdlcCA6MTsKKyAgIHZfVThfdCBvcmRlciA6MTsKKworI2VuZGlmCisKK30gV0xBTlRMX01BQ0ZDVHlwZTsKKworLyogODAyLjExIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAvKiBGcmFtZSBjb250cm9sIGZpZWxkICovCisgV0xBTlRMX01BQ0ZDVHlwZSAgd0ZybUN0cmw7CisKKyAvKiBEdXJhdGlvbiBJRCAqLworIHZfVTE2X3QgIHVzRHVyYXRpb25JZDsKKworIC8qIEFkZHJlc3MgMSBmaWVsZCAgKi8KKyB2X1U4X3QgICB2QTFbVk9TX01BQ19BRERSX1NJWkVdOworCisgLyogQWRkcmVzcyAyIGZpZWxkICovCisgdl9VOF90ICAgdkEyW1ZPU19NQUNfQUREUl9TSVpFXTsKKworIC8qIEFkZHJlc3MgMyBmaWVsZCAqLworIHZfVThfdCAgIHZBM1tWT1NfTUFDX0FERFJfU0laRV07CisKKyAvKiBTZXF1ZW5jZSBjb250cm9sIGZpZWxkICovCisgdl9VMTZfdCAgdXNTZXFDdHJsOworCisgLy8gRmluZCB0aGUgc2l6ZSBvZiB0aGUgbWFuZGF0b3J5IGhlYWRlciBzaXplLgorI2RlZmluZSBXTEFOODAyMTFfTUFOREFUT1JZX0hFQURFUl9TSVpFIFwKKyAgICAoc2l6ZW9mKFdMQU5UTF9NQUNGQ1R5cGUpICsgc2l6ZW9mKHZfVTE2X3QpICsgXAorICAgICgzICogKHNpemVvZih2X1U4X3QpICogVk9TX01BQ19BRERSX1NJWkUpKSAgKyBcCisgICAgc2l6ZW9mKHZfVTE2X3QpKQorCisgLyogT3B0aW9uYWwgQTQgYWRkcmVzcyAqLworIHZfVThfdCAgIG9wdHZBNFtWT1NfTUFDX0FERFJfU0laRV07CisKKyAvKiBPcHRpb25hbCBRT1MgY29udHJvbCBmaWVsZCAqLworIHZfVTE2X3QgIHVzUW9zQ3RybDsKK31XTEFOVExfODAyMTFIZWFkZXJUeXBlOworCisvKiA4MDIuMyBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgLyogRGVzdGluYXRpb24gYWRkcmVzcyBmaWVsZCAqLworIHZfVThfdCAgIHZEQVtWT1NfTUFDX0FERFJfU0laRV07CisKKyAvKiBTb3VyY2UgYWRkcmVzcyBmaWVsZCAqLworIHZfVThfdCAgIHZTQVtWT1NfTUFDX0FERFJfU0laRV07CisKKyAvKiBMZW5ndGggZmllbGQgKi8KKyB2X1UxNl90ICB1c0xlblR5cGU7Cit9V0xBTlRMXzgwMjNIZWFkZXJUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdsb2JhbCBEYXRhIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0xBTl9UTF9JTlZBTElEX1VfU0lHIDI1NQorI2RlZmluZSBXTEFOX1RMX0lOVkFMSURfQl9TSUcgMjU1CisKKyNkZWZpbmUgV0xBTl9UTF9BQ19BUlJBWV8yX01BU0soIF9wU1RBLCBfdWNBQ01hc2ssIGkgKSBcCisgIGRvXAorICB7XAorICAgIF91Y0FDTWFzayA9IDA7IFwKKyAgICBmb3IgKCBpID0gMDsgaSA8IFdMQU5UTF9NQVhfQUM7IGkrKyApIFwKKyAgICB7IFwKKyAgICAgIGlmICggMCAhPSAoX3BTVEEpLT5hdWNBQ01hc2tbaV0gKSBcCisgICAgICB7IFwKKyAgICAgICAgX3VjQUNNYXNrIHw9ICggMSA8PCBpICk7IFwKKyAgICAgIH0gXAorICAgIH0gXAorICB9IHdoaWxlICgwKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgVmFyaWFibGUgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFZPU19TVEFUVVMgCitXTEFOVExfR2V0RXRoZXJUeXBlCisoCisgIHZfVThfdCAgICAgICAgICAgICAgICogYXVjQkRIZWFkZXIsCisgIHZvc19wa3RfdCAgICAgICAgICAgICogdm9zRGF0YUJ1ZmYsCisgIHZfVThfdCAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwKKyAgdl9VMTZfdCAgICAgICAgICAgICAgKiB1c0V0aGVyVHlwZQorKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQWRkaW5nIGEgZ2xvYmFsIHZhcmlhYmxlIHRvIGJlIHVzZWQgd2hlbiBkb2luZyBmcmFtZSB0cmFuc2xhdGlvbiBpbiBUeEF1dGgKKyAqIHN0YXRlIHNvIGFzIHRvIG5vdCBzZXQgdGhlIHByb3RlY3RlZCBiaXQgdG8gMSBpbiB0aGUgY2FzZSBvZiBXQUkgZnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1U4X3QgZ1VjSXNXYWkgPSAwOworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRXh0ZXJuYWxpemVkIEZ1bmN0aW9uIERlZmluaXRpb25zCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRG9jdW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfT3BlbgorCisgIERFU0NSSVBUSU9OCisgICAgQ2FsbGVkIGJ5IEhERCBhdCBkcml2ZXIgaW5pdGlhbGl6YXRpb24uIFRMIHdpbGwgaW5pdGlhbGl6ZSBhbGwgaXRzCisgICAgaW50ZXJuYWwgcmVzb3VyY2VzIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjYWxsIHRvIHN0YXJ0IHRvIHJlZ2lzdGVyCisgICAgd2l0aCB0aGUgb3RoZXIgbW9kdWxlcy4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICBwVExDb25maWc6ICAgICAgVEwgQ29uZmlndXJhdGlvbgorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfT3BlbgorKAorICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKKyAgV0xBTlRMX0NvbmZpZ0luZm9UeXBlKiAgcFRMQ29uZmlnCispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7IAorICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCisgIHRIYWxIYW5kbGUgICAgICBzbWVDb250ZXh0OworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgVk9TX1NUQVRVUyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbmRpZgorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdm9zX2FsbG9jX2NvbnRleHQoIHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCAKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSZwVExDYiwgc2l6ZW9mKFdMQU5UTF9DYlR5cGUpKTsKKworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHBUTENvbmZpZyApICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOiBJbnZhbGlkIGlucHV0IHBvaW50ZXIgb24gV0xBTlRMX09wZW4gVEwgJXggQ29uZmlnICV4IiwgcFRMQ2IsIHBUTENvbmZpZyApKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgc21lQ29udGV4dCA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgcHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gc21lQ29udGV4dCApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHNtZUNvbnRleHQiLCBfX0ZVTkNUSU9OX18pKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLyogWmVybyBvdXQgdGhlIG1lbW9yeSBzbyB3ZSBhcmUgT0ssIHdoZW4gQ2xlYW5DQiBpcyBjYWxsZWQuKi8KKyAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXBUTENiLCBzaXplb2YoV0xBTlRMX0NiVHlwZSkpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2xlYW4gdXAgVEwgY29udHJvbCBibG9jaywgaW5pdGlhbGl6ZSBhbGwgdmFsdWVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9PcGVuIikpOworCisgIHBUTENiLT5hdGxTVEFDbGllbnRzID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKFdMQU5UTF9TVEFDbGllbnRUeXBlKSAqIFdMQU5fTUFYX1NUQV9DT1VOVCk7CisgIGlmIChOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOIFRMOiBTdGFDbGllbnRzIGFsbG9jYXRpb24gZmFpbGVkXG4iKSk7CisgICAgdm9zX2ZyZWVfY29udGV4dChwdm9zR0N0eCwgVk9TX01PRFVMRV9JRF9UTCwgcFRMQ2IpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopcFRMQ2ItPmF0bFNUQUNsaWVudHMsIHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkgKiBXTEFOX01BWF9TVEFfQ09VTlQpOworCisgIHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCA9IHZvc19tZW1fbWFsbG9jKHNpemVvZihXTEFOVExfUkVPUkRFUl9CVUZGRVJfVCkgKiBXTEFOVExfTUFYX0JBX1NFU1NJT04pOworICBpZiAoTlVMTCA9PSBwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wpCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6IFJlb3JkZXIgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKSk7CisgICAgdm9zX21lbV9mcmVlKHBUTENiLT5hdGxTVEFDbGllbnRzKTsKKyAgICB2b3NfZnJlZV9jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCBwVExDYik7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgICAgIAorICB9CisKKyAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCwgc2l6ZW9mKFdMQU5UTF9SRU9SREVSX0JVRkZFUl9UKSAqIFdMQU5UTF9NQVhfQkFfU0VTU0lPTik7CisKKyAgV0xBTlRMX0NsZWFuQ0IocFRMQ2IsIDAgLypkbyBub3QgZW1wdHkqLyk7CisKKyAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOVExfTUFYX0FDIDsgdWNJbmRleCsrKQorICB7CisgICAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y0luZGV4XSA9CisgICAgICAgICAgICAgICAgcFRMQ29uZmlnLT51Y0FjV2VpZ2h0c1t1Y0luZGV4XTsKKyAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAvLyBzY2hlZHVsaW5nIGluaXQgdG8gYmUgdGhlIGxhc3Qgb25lIG9mIHByZXZpb3VzIHJvdW5kCisgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfQks7CisgIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgPSAxOworICBwVExDYi0+dWNDdXJyZW50U1RBID0gV0xBTl9NQVhfU1RBX0NPVU5ULTE7CisKKyNpZiAwCisgIC8vZmxvdyBjb250cm9sIGZpZWxkIGluaXQKKyAgdm9zX21lbV96ZXJvKCZwVExDYi0+dGxGQ0luZm8sIHNpemVvZih0RmNUeFBhcmFtc190eXBlKSk7CisgIC8vYml0IDA6IHNldCAoQmQvcGR1IGNvdW50KSBiaXQgMTogc2V0IChyZXF1ZXN0IHN0YXRpb24gUFMgY2hhbmdlIG5vdGlmaWNhdGlvbikKKyAgcFRMQ2ItPnRsRkNJbmZvLmZjQ29uZmlnID0gMHgxOworI2VuZGlmCisKKyAgcFRMQ2ItPnZvc1R4RkNCdWYgPSBOVUxMOworICBwVExDYi0+dGxDb25maWdJbmZvLnVNaW5GcmFtZXNQcm9jVGhyZXMgPQorICAgICAgICAgICAgICAgIHBUTENvbmZpZy0+dU1pbkZyYW1lc1Byb2NUaHJlczsKKyNlbmRpZgorCisgIHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50ID0KKyAgICAgICAgICAgICAgICBwVExDb25maWctPnVEZWxheWVkVHJpZ2dlckZybUludDsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFsbG9jYXRlIGludGVybmFsIHJlc291cmNlcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdm9zX3BrdF9nZXRfcGFja2V0KCZwVExDYi0+dm9zRHVtbXlCdWYsIFZPU19QS1RfVFlQRV9SWF9SQVcsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAxLyp0cnVlKi8sTlVMTCwgTlVMTCk7CisKKyAgV0xBTlRMX0luaXRCQVJlb3JkZXJCdWZmZXIocHZvc0dDdHgpOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgIC8qIEluaXRpYWxpemUgSGFuZG9mZiBzdXBwb3J0IG1vZHVlCisgICAgKiBSU1NJIG1lYXN1cmUgYW5kIFRyYWZmaWMgc3RhdGUgbW9uaXRvcmluZyAqLworICBzdGF0dXMgPSBXTEFOVExfSFNJbml0KHB2b3NHQ3R4KTsKKyAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJIYW5kb2ZmIHN1cHBvcnQgbW9kdWxlIGluaXQgZmFpbCIpKTsKKyAgICB2b3NfbWVtX2ZyZWUocFRMQ2ItPmF0bFNUQUNsaWVudHMpOworICAgIHZvc19tZW1fZnJlZShwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wpOworICAgIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisjZW5kaWYKKworICBwVExDYi0+aXNCTVBTID0gVk9TX0ZBTFNFOworICBwbWNSZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kKCBzbWVDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUG93ZXJTdGF0ZUNoYW5nZWRDQiwgcHZvc0dDdHggKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9PcGVuICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfU3RhcnQKKworICBERVNDUklQVElPTgorICAgIENhbGxlZCBieSBIREQgYXMgcGFydCBvZiB0aGUgb3ZlcmFsbCBzdGFydCBwcm9jZWR1cmUuIFRMIHdpbGwgdXNlIHRoaXMKKyAgICBjYWxsIHRvIHJlZ2lzdGVyIHdpdGggQkFMIGFzIGEgdHJhbnNwb3J0IGxheWVyIGVudGl0eS4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQorICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgICBPdGhlciBjb2RlcyBjYW4gYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgYSBCQUwgZmFpbHVyZTsgc2VlIEJBTCBBUEkKKyAgICBmb3IgbW9yZSBpbmZvCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1N0YXJ0CisoCisgIHZfUFZPSURfdCAgcHZvc0dDdHgKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiAgICAgID0gTlVMTDsKKyAgdl9VMzJfdCAgICAgICAgICAgICB1UmVzQ291bnQgPSBXREFfVExJX01JTl9SRVNfREFUQTsKKyAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N0YXJ0IikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJlZ2lzdGVyIHdpdGggV0RBIGFzIHRyYW5zcG9ydCBsYXllciBjbGllbnQKKyAgICBSZXF1ZXN0IHJlc291cmNlcyBmb3IgdHggZnJvbSBidXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOIFRMOldMQU5UTF9TdGFydCIpKTsKKworICB2b3NTdGF0dXMgPSBXREFfRFNfUmVnaXN0ZXIoIHB2b3NHQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX1R4Q29tcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9SeEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0dldEZyYW1lcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9SZXNvdXJjZUNCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfVExJX01JTl9SRVNfREFUQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB2b3NHQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVSZXNDb3VudCApOyAKKworICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICJXTEFOIFRMOlRMIGZhaWxlZCB0byByZWdpc3RlciB3aXRoIEJBTC9XREEsIEVycjogJWQiLAorICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CisgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgfQorCisgIC8qIEVuYWJsZSB0cmFuc21pc3Npb24gKi8KKyAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMCk7CisKKyAgcFRMQ2ItPnVSZXNDb3VudCA9IHVSZXNDb3VudDsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9TdGFydCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1N0b3AKKworICBERVNDUklQVElPTgorICAgIENhbGxlZCBieSBIREQgdG8gc3RvcCBvcGVyYXRpb24gaW4gVEwsIGJlZm9yZSBjbG9zZS4gVEwgd2lsbCBzdXNwZW5kIGFsbAorICAgIGZyYW1lIHRyYW5zZmVyIG9wZXJhdGlvbiBhbmQgd2lsbCB3YWl0IGZvciB0aGUgY2xvc2UgcmVxdWVzdCB0byBjbGVhbiB1cAorICAgIGl0cyByZXNvdXJjZXMuCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9TdG9wCisoCisgIHZfUFZPSURfdCAgcHZvc0dDdHgKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKKyAgdl9VOF90ICAgICAgdWNJbmRleDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU3RvcCBUTCBhbmQgZW1wdHkgU3RhdGlvbiBsaXN0CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9TdG9wIikpOworCisgIC8qIERpc2FibGUgdHJhbnNtaXNzaW9uICovCisgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPnVjVHhTdXNwZW5kZWQsIDEpOworCisgIGlmICggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApCisgIHsKKyAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOworICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmID0gTlVMTDsKKyAgfQorCisgIGlmICggTlVMTCAhPSBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkKKyAgeworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKKyAgICBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmID0gTlVMTDsKKyAgfQorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0xBTlRMX0hTU3RvcChwdm9zR0N0eCkpCisgIHsKKyAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJIYW5kb2ZmIFN1cHBvcnQgbW9kdWxlIHN0b3AgZmFpbCIpKTsKKyAgfQorI2VuZGlmCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2xlYW4gY2xpZW50IHN0YXRpb25zCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9TVEFfQ09VTlQgOyB1Y0luZGV4KyspCisgIHsKKyAgICBXTEFOVExfQ2xlYW5TVEEoJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLCAxIC8qZW1wdHkgYWxsIHF1ZXVlcyovKTsKKyAgfQorCisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOVExfU3RvcCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0Nsb3NlCisKKyAgREVTQ1JJUFRJT04KKyAgICBDYWxsZWQgYnkgSEREIGR1cmluZyBnZW5lcmFsIGRyaXZlciBjbG9zZSBwcm9jZWR1cmUuIFRMIHdpbGwgY2xlYW4gdXAKKyAgICBhbGwgdGhlIGludGVybmFsIHJlc291cmNlcy4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQorICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX0Nsb3NlCisoCisgIHZfUFZPSURfdCAgcHZvc0dDdHgKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKKyAgdEhhbEhhbmRsZSBzbWVDb250ZXh0OworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRGVyZWdpc3RlciBmcm9tIFBNQworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgc21lQ29udGV4dCA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgcHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gc21lQ29udGV4dCApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHNtZUNvbnRleHQiLCBfX0ZVTkNUSU9OX18pKTsKKyAgICAvLyBjb250aW51ZSBzbyB0aGF0IHdlIGNhbiBjbGVhbnVwIGFzIG11Y2ggYXMgcG9zc2libGUKKyAgfQorICBlbHNlCisgIHsKKyAgICBwbWNEZXJlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQoIHNtZUNvbnRleHQsIFdMQU5UTF9Qb3dlclN0YXRlQ2hhbmdlZENCICk7CisgIH0KKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IFdMQU5UTF9IU0RlSW5pdChwdm9zR0N0eCkpCisgIHsKKyAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJIYW5kb2ZmIFN1cHBvcnQgbW9kdWxlIERlSW5pdCBmYWlsIikpOworICB9CisjZW5kaWYKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENsZWFudXAgVEwgY29udHJvbCBibG9jay4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6IFdMQU5UTF9DbG9zZSIpKTsKKyAgV0xBTlRMX0NsZWFuQ0IocFRMQ2IsIDEgLyogZW1wdHkgcXVldWVzL2xpc3RzL3BrdHMgaWYgYW55Ki8pOworCisgIHZvc19tZW1fZnJlZShwVExDYi0+YXRsU1RBQ2xpZW50cyk7CisgIHZvc19tZW1fZnJlZShwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRnJlZSBUTCBjb250ZXh0IGZyb20gVk9TUyBnbG9iYWwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOVExfQ2xvc2UgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSU5URVJBQ1RJT04gV0lUSCBIREQKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsCisKKyAgREVTQ1JJUFRJT04KKyAgICAgRnVuY3Rpb24gdG8gZGlzYWJsZS9lbmFibGUgZnJhbWUgdHJhbnNsYXRpb24gZm9yIGFsbCBhc3NvY2lhdGlvbiBzdGF0aW9ucy4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisgICBJTgorICAgIHB2b3NHQ3R4OiBWT1MgY29udGV4dCAKKyAgICBFbmFibGVGcmFtZVhsYXRpb24gVFJVRSBtZWFucyBlbmFibGUgU1cgdHJhbnNsYXRpb24gZm9yIGFsbCBzdGF0aW9ucy4KKyAgICAuCisKKyAgUkVUVVJOIFZBTFVFCisKKyAgIHZvaWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZAorV0xBTlRMX0NvbmZpZ3VyZVN3RnJhbWVUWFhsYXRpb25Gb3JBbGwKKygKKyAgdl9QVk9JRF90IHB2b3NHQ3R4LCAKKyAgdl9CT09MX3QgZW5hYmxlRnJhbWVYbGF0aW9uCispCit7CisgIHZfVThfdCB1Y0luZGV4OworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiAiCisgICAgICAgICAgICJXTEFOVExfQ29uZmlndXJlU3dGcmFtZVRYWGxhdGlvbkZvckFsbCIpKTsKKyAgICByZXR1cm47CisgIH0KKworICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgIldMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsOiBDb25maWd1cmUgU1cgZnJhbWVYbGF0aW9uICVkIiwgCisgICAgICBlbmFibGVGcmFtZVhsYXRpb24pKTsKKworICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1RJRDsgdWNJbmRleCsrKSAKKyAgeworICAgIGlmICggMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XS51Y0V4aXN0cyApCisgICAgeworI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQorICAgICAgLy8gaWYgdGhpcyBzdGF0aW9uIHdhcyBub3QgYWxsb2NhdGVkIHJlc291cmNlcyB0byBwZXJmb3JtIEhXLWJhc2VkCisgICAgICAvLyBUWCBmcmFtZSB0cmFuc2xhdGlvbiB0aGVuIGZvcmNlIFNXLWJhc2VkIFRYIGZyYW1lIHRyYW5zbGF0aW9uCisgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSBmcmFtZSB0cmFuc2xhdGlvbiBzdXBwbGllZCBieSB0aGUgY2xpZW50CisgICAgICBpZiAoIVdEQV9Jc0h3RnJhbWVUeFRyYW5zbGF0aW9uQ2FwYWJsZShwdm9zR0N0eCwgdWNJbmRleCkpCisgICAgICB7CisgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IDE7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0ud1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGVuYWJsZUZyYW1lWGxhdGlvbjsKKyAgICB9CisgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfU3RhcnRGb3J3YXJkaW5nCisKKyAgREVTQ1JJUFRJT04KKworICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc2sgc2VyaWFsaXphdGlvbiB0aHJvdWdoIFRYIHRocmVhZCBvZiB0aGUgICAKKyAgICBjYWNoZWQgZnJhbWUgZm9yd2FyZGluZyAoaWYgc3RhdGF0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIG1lYW4gd2hpbGUpIAorICAgIG9yIGZsdXNoaW5nIChpZiBzdGF0aW9uIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZSB0aW1lKQorCisgICAgSW4gY2FzZSBvZiBmb3J3YXJkaW5nLCB1cHBlciBsYXllciBpcyBvbmx5IHJlcXVpcmVkIHRvIGNhbGwgV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50KCkKKyAgICBhbmQgZG9lc24ndCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBleHBsaWNpdGx5LiBUTCB3aWxsIGhhbmRsZSB0aGlzIGluc2lkZSAKKyAgICBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQoKS4gCisgICAgCisgICAgSW4gY2FzZSBvZiBmbHVzaGluZywgdXBwZXIgbGF5ZXIgaXMgcmVxdWlyZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkKKyAgICAKKyAgREVQRU5ERU5DSUVTCisKKyAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KKworICAgCisgIFBBUkFNRVRFUlMKKworICAgdWNTVEFJZDogICBzdGF0aW9uIGlkIAorCisgIFJFVFVSTiBWQUxVRQorCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKyAgICBQbGVhc2UgY2hlY2sgcmV0dXJuIHZhbHVlcyBvZiB2b3NfdHhfbXFfc2VyaWFsaXplLgorCisgIFNJREUgRUZGRUNUUworICAgIElmIFRMIHdhcyBhc2tlZCB0byBwZXJmb3JtIFdMQU5UTF9DYWNoZVNUQUZyYW1lKCkgaW4gV0xBTlRMX1J4RnJhbWVzKCksIAorICAgIGVpdGhlciBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQoKSBvciB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIAorICAgIHdpdGhpbiByZWFzb25hYmxlIHRpbWUuIE90aGVyd2lzZSwgVEwgd2lsbCBrZWVwIGNhY2hlZCB2b3MgYnVmZmVyIHVudGlsCisgICAgb25lIG9mIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbmQgbWF5IGVuZCB1cCB3aXRoIHN5c3RlbSBidWZmZXIgZXhoYXN1dGlvbi4gCisKKyAgICBJdCdzIGFuIHVwcGVyIGxheWVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGNhc2Ugb2YKKyAgICBmbHVzaGluZworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworVk9TX1NUQVRVUyAKK1dMQU5UTF9TdGFydEZvcndhcmRpbmcKKygKKyAgdl9VOF90IHVjU1RBSWQsCisgIHZfVThfdCB1Y1VjYXN0U2lnLCAKKyAgdl9VOF90IHVjQmNhc3RTaWcgCispCit7CisgIHZvc19tc2dfdCAgICAgIHNNZXNzYWdlOworICB2X1UzMl90ICAgICAgICB1RGF0YTsgICAgICAgICAgICAgCisgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKiBTaWduYWwgdGhlIE9TIHRvIHNlcmlhbGl6ZSBvdXIgZXZlbnQgKi8KKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiU2VyaWFsaXppbmcgVEwgU3RhcnQgRm9yd2FyZGluZyBDYWNoZWQgZm9yIGNvbnRyb2wgU1RBICVkIiwgCisgICAgICAgICAgICAgIHVjU1RBSWQgKTsKKworICB2b3NfbWVtX3plcm8oICZzTWVzc2FnZSwgc2l6ZW9mKHZvc19tc2dfdCkgKTsKKworICB1RGF0YSA9IHVjU1RBSWQgfCAodWNVY2FzdFNpZyA8PCA4ICkgfCAodWNCY2FzdFNpZyA8PCAxNik7IAorICBzTWVzc2FnZS5ib2R5cHRyID0gKHZfUFZPSURfdCl1RGF0YTsKKyAgc01lc3NhZ2UudHlwZSAgICA9IFdMQU5UTF9UWF9GV0RfQ0FDSEVEOworCisgIHJldHVybiB2b3NfdHhfbXFfc2VyaWFsaXplKFZPU19NUV9JRF9UTCwgJnNNZXNzYWdlKTsKKworfSAvKiBXTEFOVExfU3RhcnRGb3J3YXJkaW5nKCkgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfQXNzb2NGYWlsZWQKKworICBERVNDUklQVElPTgorCisgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IFBFIHRvIG5vdGlmeSBUTCB0aGF0IGNhY2hlIG5lZWRzIHRvIGZsdXNoZWQnIAorICAgIHdoZW4gYXNzb2NpYXRpb24gaXMgbm90IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgCisKKyAgICBJbnRlcm5hbGx5LCBUTCBwb3N0IGEgbWVzc2FnZSB0byBUWF9UaHJlYWQgdG8gc2VyaWFsaXplIHRoZSByZXF1ZXN0IHRvIAorICAgIGtlZXAgbG9jay1mcmVlIG1lY2hhbmlzbS4KKworICAgCisgIERFUEVOREVOQ0lFUworCisgICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCisKKyAgIAorICBQQVJBTUVURVJTCisKKyAgIHVjU1RBSWQ6ICAgc3RhdGlvbiBpZCAKKworICBSRVRVUk4gVkFMVUUKKworICAgbm9uZQorICAgCisgIFNJREUgRUZGRUNUUworICAgVGhlcmUgbWF5IGJlIHJhY2UgY29uZGl0aW9uIHRoYXQgUEUgY2FsbCB0aGlzIEFQSSBhbmQgc2VuZCBhbm90aGVyIGFzc29jaWF0aW9uCisgICByZXF1ZXN0IGltbWVkaWF0ZWx5IHdpdGggc2FtZSBzdGFJZCBiZWZvcmUgVFhfdGhyZWFkIGNhbiBwcm9jZXNzIHRoZSBtZXNzYWdlLgorCisgICBUbyBhdm9pZCB0aGlzLCB3ZSBtaWdodCBuZWVkIFBFIHRvIHdhaXQgZm9yIFRYX3RocmVhZCBwcm9jZXNzIHRoZSBtZXNzYWdlLAorICAgYnV0IHRoaXMgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gCisgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBXTEFOVExfQXNzb2NGYWlsZWQodl9VOF90IHN0YUlkKQoreworICAvLyBmbHVzaGluZyBmcmFtZXMgYW5kIGZvcndhcmRpbmcgZnJhbWVzIHVzZXMgdGhlIHNhbWUgbWVzc2FnZQorICAvLyB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHdoYXQgaGFwcGVucyB3aGVuIHRoZSBtZXNzYWdlIGlzIHByb2Nlc3NlZAorICAvLyBpZiB0aGUgU1RBIGV4aXN0LCB0aGUgZnJhbWVzIHdpbGwgYmUgZm9yd2FyZGVkCisgIC8vIGFuZCBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGUgZnJhbWVzIHdpbGwgYmUgZmx1c2hlZAorICAvLyBpbiB0aGlzIGNhc2Ugd2Uga25vdyBpdCB3b24ndCBleGlzdCBzbyB0aGUgRFBVIGluZGV4IHNpZ25hdHVyZSB2YWx1ZXMgZG9uJ3QgbWF0dGVyCisgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZyhzdGFJZCwwLDApKSkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgIiAlcyBmYWlscyB0byBzdGFydCBmb3J3YXJkaW5nIiwgX19GVU5DVElPTl9fKTsKKyAgfQorfQorICAKKyAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgV0xBTlRMX0ZpbmlzaF9VTEEKKworICBERVNDUklQVElPTgorICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgSEREIHRvIG5vdGlmeSBUTCB0byBmaW5pc2ggVXBwZXIgbGF5ZXIgYXV0aGVudGljYXRpb24KKyAgICAgaW5jYXNlIHRoZSBsYXN0IEVBUE9MIHBhY2tldCBpcyBwZW5kaW5nIGluIHRoZSBUTCBxdWV1ZS4gCisgICAgIFRvIGF2b2lkIHRoZSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHNtZSBzZXQga2V5IGFuZCB0aGUgbGFzdCBFQVBPTCBwYWNrZXQgCisgICAgIHRoZSBIREQgbW9kdWxlIGNhbGxzIHRoaXMgZnVuY3Rpb24ganVzdCBiZWZvcmUgY2FsbGluZyB0aGUgc21lX1JvYW1TZXRLZXkuCisKKyAgREVQRU5ERU5DSUVTCisKKyAgICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCisgIAorICBQQVJBTUVURVJTCisKKyAgIGNhbGxiYWNrUm91dGluZTogICBIREQgQ2FsbGJhY2sgZnVuY3Rpb24uCisgICBjYWxsYmFja0NvbnRleHQgOiBIREQgdXNlcmRhdGEgY29udGV4dC4KKyAgCisgICBSRVRVUk4gVkFMVUUKKworICAgVk9TX1NUQVRVU19TVUNDRVNTL1ZPU19TVEFUVVNfRkFJTFVSRQorICAgCisgIFNJREUgRUZGRUNUUworICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworVk9TX1NUQVRVUyBXTEFOVExfRmluaXNoX1VMQSggdm9pZCAoKmNhbGxiYWNrUm91dGluZSkgKHZvaWQgKmNhbGxiYWNrQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja0NvbnRleHQpCit7CisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgIHJldHVybiBXREFfRFNfRmluaXNoVUxBKCBjYWxsYmFja1JvdXRpbmUsIGNhbGxiYWNrQ29udGV4dCk7IAorI2Vsc2UKKyAgIHZvc19tc2dfdCAgdm9zTXNnOyAgIAorICAgVk9TX1NUQVRVUyB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIHZvc01zZy5yZXNlcnZlZCA9IDA7CisgICB2b3NNc2cuYm9keXZhbCAgPSAodl9VMzJfdCljYWxsYmFja0NvbnRleHQ7CisgICB2b3NNc2cuYm9keXB0ciA9IGNhbGxiYWNrUm91dGluZTsKKyAgIHZvc01zZy50eXBlICAgID0gV0xBTlNTQ19GSU5JU0hfVUxBOworICAgdm9zU3RhdHVzID0gdm9zX3R4X21xX3NlcmlhbGl6ZSggVk9TX01RX0lEX1NTQywgJnZvc01zZyk7CisgICByZXR1cm4gdm9zU3RhdHVzOworI2VuZGlmCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQKKworICBERVNDUklQVElPTgorCisgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IEhERCB0byByZWdpc3RlciBhcyBhIGNsaWVudCBmb3IgZGF0YSBzZXJ2aWNlcworICAgIHdpdGggVEwuIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgZm9yIGVhY2ggbmV3IHN0YXRpb24gdGhhdCBpdCBhZGRzLAorICAgIHRodXMgaGF2aW5nIHRoZSBmbGV4aWJpbGl0eSBvZiByZWdpc3RlcmluZyBkaWZmZXJlbnQgY2FsbGJhY2sgZm9yIGVhY2gKKyAgICBTVEEgaXQgc2VydmljZXMuCisKKyAgREVQRU5ERU5DSUVTCisKKyAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KKworICAgIFJlc3RyaWN0aW9uOgorICAgICAgTWFpbiB0aHJlYWQgd2lsbCBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGF0IFR4IGFuZCBSeCB0aHJlYWRzIHRodXMKKyAgICAgIGd1YXJhbnRlZWluZyB0aGF0IGEgc3RhdGlvbiB3aWxsIGJlIGFkZGVkIGJlZm9yZSBhbnkgZGF0YSBjYW4gYmUKKyAgICAgIHJlY2VpdmVkIGZvciBpdC4gKFRoaXMgZW5hYmxlcyBUTCB0byBiZSBsb2NrIGZyZWUpCisKKyAgUEFSQU1FVEVSUworCisgICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgcGZuU3RBUng6ICAgICAgICBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSByZWNlaXZlIHBhY2tldCBoYW5kbGVyIGZyb20gSERECisgICBwZm5TVEFUeENvbXA6ICAgIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IGNvbXBsZXRlIGNvbmZpcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyIGZyb20gSERECisgICBwZm5TVEFGZXRjaFBrdDogIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHBhY2tldCByZXRyaWV2YWwgcm91dGluZSBpbiBIREQKKyAgIHdTVEFEZXNjVHlwZTogICAgU1RBIERlc2NyaXB0b3IsIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgIG5ldyBhZGRlZCBTVEEKKworICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6IElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6IFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50CisoCisgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgcHZvc0dDdHgsCisgIFdMQU5UTF9TVEFSeENCVHlwZSAgICAgICAgcGZuU1RBUngsCisgIFdMQU5UTF9UeENvbXBDQlR5cGUgICAgICAgcGZuU1RBVHhDb21wLAorICBXTEFOVExfU1RBRmV0Y2hQa3RDQlR5cGUgIHBmblNUQUZldGNoUGt0LAorICBXTEFOX1NUQURlc2NUeXBlKiAgICAgICAgIHB3U1RBRGVzY1R5cGUsCisgIHZfUzdfdCAgICAgICAgICAgICAgICAgICAgcnNzaQorKQoreworICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOworI2lmZGVmIEFOSV9DSElQU0VUX1ZPTEFOUworICB2X1U4X3QgICAgdWNUaWQgPSAwOy8qTG9jYWwgdmFyaWFibGUgdG8gY2xlYXIgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXJzIG9mIFNUQSBvbiBhbGwgVElEcyovCisjZW5kaWYKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcHdTVEFEZXNjVHlwZSApIHx8ICggTlVMTCA9PSBwZm5TVEFSeCApIHx8CisgICAgICAoIE5VTEwgPT0gcGZuU1RBRmV0Y2hQa3QgKSkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgIH0KKworICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCApICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgaWYgKCAwICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLnVjRXhpc3RzICkKKyAgeworICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLnVjRXhpc3RzKys7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIG9uIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUmVnaXN0ZXIgc3RhdGlvbiB3aXRoIFRMCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIiwgcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCApKTsKKworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS5wZm5TVEFSeCAgICAgICA9IHBmblNUQVJ4OworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS5wZm5TVEFGZXRjaFBrdCA9IHBmblNUQUZldGNoUGt0OworCisgIC8qIE9ubHkgcmVnaXN0ZXIgaWYgZGlmZmVyZW50IGZyb20gTlVMTCAtIFRMIGRlZmF1bHQgVHggQ29tcCBDYiB3aWxsCisgICAgcmVsZWFzZSB0aGUgdm9zIHBhY2tldCAqLworICBpZiAoIE5VTEwgIT0gcGZuU1RBVHhDb21wICkKKyAgeworICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLnBmblNUQVR4Q29tcCAgID0gcGZuU1RBVHhDb21wOworICB9CisKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0udGxTdGF0ZSAgPSBXTEFOVExfU1RBX0lOSVQ7CisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLnRsUHJpICAgID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfU1RBX1BSSV9OT1JNQUw7CisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLndTVEFEZXNjLnVjU1RBSWQgID0KKyAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkOworCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQgd2l0aCBVQyAlZCBhbmQgQkMgJWQiLCAKKyAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKKyAgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNVY2FzdFNpZywgcHdTVEFEZXNjVHlwZS0+dWNCY2FzdFNpZykpOworCisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLndTVEFEZXNjLndTVEFUeXBlID0KKyAgICBwd1NUQURlc2NUeXBlLT53U1RBVHlwZTsKKworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS53U1RBRGVzYy51Y1Fvc0VuYWJsZWQgPQorICAgIHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZDsKKworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS53U1RBRGVzYy51Y0FkZFJtdkxMQyA9CisgICAgcHdTVEFEZXNjVHlwZS0+dWNBZGRSbXZMTEM7CisKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0ud1NUQURlc2MudWNQcm90ZWN0ZWRGcmFtZSA9CisgICAgcHdTVEFEZXNjVHlwZS0+dWNQcm90ZWN0ZWRGcmFtZTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0ud1NUQURlc2MudWNJc0NjeFN0YSA9CisgICAgcHdTVEFEZXNjVHlwZS0+dWNJc0NjeFN0YTsKKworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIFFvUyAlZCBBZGQgTExDICVkIFByb3RGcmFtZSAlZCBDY3hTdGEgJWQiLCAKKyAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKKyAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1Fvc0VuYWJsZWQsCisgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNBZGRSbXZMTEMsCisgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNQcm90ZWN0ZWRGcmFtZSwKKyAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y0lzQ2N4U3RhKSk7CisjZWxzZQorCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQgUW9TICVkIEFkZCBMTEMgJWQgUHJvdEZyYW1lICVkIiwgCisgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCwgCisgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNRb3NFbmFibGVkLAorICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjQWRkUm12TExDLAorICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjUHJvdGVjdGVkRnJhbWUpKTsKKworI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0NDWAorI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQorICAvLyBpZiB0aGlzIHN0YXRpb24gd2FzIG5vdCBhbGxvY2F0ZWQgcmVzb3VyY2VzIHRvIHBlcmZvcm0gSFctYmFzZWQKKyAgLy8gVFggZnJhbWUgdHJhbnNsYXRpb24gdGhlbiBmb3JjZSBTVy1iYXNlZCBUWCBmcmFtZSB0cmFuc2xhdGlvbgorICAvLyBvdGhlcndpc2UgdXNlIHRoZSBmcmFtZSB0cmFuc2xhdGlvbiBzdXBwbGllZCBieSB0aGUgY2xpZW50CisKKyAgaWYgKCFXREFfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUocHZvc0dDdHgsIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQpCisgICAgICB8fCAoIFdMQU5fU1RBX0JUX0FNUCA9PSBwd1NUQURlc2NUeXBlLT53U1RBVHlwZSkpCisgIHsKKyAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU3dGcmFtZVRYWGxhdGlvbiA9IDE7CisgIH0KKyNlbmRpZgorCisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9CisgICAgcHdTVEFEZXNjVHlwZS0+dWNTd0ZyYW1lVFhYbGF0aW9uOworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS53U1RBRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24gPQorICAgIHB3U1RBRGVzY1R5cGUtPnVjU3dGcmFtZVJYWGxhdGlvbjsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLndTVEFEZXNjLnVjSXNXYXBpU3RhID0KKyAgICBwd1NUQURlc2NUeXBlLT51Y0lzV2FwaVN0YTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisgIHZvc19jb3B5X21hY2FkZHIoICZwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS4KKyAgICAgICAgICAgICAgICAgICAgICB3U1RBRGVzYy52U1RBTUFDQWRkcmVzcywgJnB3U1RBRGVzY1R5cGUtPnZTVEFNQUNBZGRyZXNzKTsKKworICB2b3NfY29weV9tYWNhZGRyKCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0uCisgICAgICAgICAgICAgICAgICAgICAgd1NUQURlc2MudkJTU0lEZm9ySUJTUywgJnB3U1RBRGVzY1R5cGUtPnZCU1NJRGZvcklCU1MpOworCisgIHZvc19jb3B5X21hY2FkZHIoICZwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS4KKyAgICAgICAgICAgICAgICAgd1NUQURlc2MudlNlbGZNQUNBZGRyZXNzLCAmcHdTVEFEZXNjVHlwZS0+dlNlbGZNQUNBZGRyZXNzKTsKKworI2lmZGVmIEFOSV9DSElQU0VUX1ZPTEFOUworICAvKiBJbiB2b2xhbnMgcmVsZWFzZSBMIHJlcGxheSBjaGVjayBpcyBkb25lIGF0IFRMICovCisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLnVjSXNSZXBsYXlDaGVja1ZhbGlkID0gCisgICAgcHdTVEFEZXNjVHlwZS0+IHVjSXNSZXBsYXlDaGVja1ZhbGlkOworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkID0gIDA7CisvKkNsZWFyIHJlcGxheSBjb3VudGVycyBvZiB0aGUgU1RBIG9uIGFsbCBUSURzKi8KKyAgZm9yKHVjVGlkID0gMDsgdWNUaWQgPCBXTEFOVExfTUFYX1RJRCA7IHVjVGlkKyspCisgIHsKKyAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9ICAwOworICB9CisjZW5kaWYKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBTZXQgdGhlIEFDIGZvciB0aGUgcmVnaXN0ZXJlZCBzdGF0aW9uIHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IEFDCisgICAgICBFdmVuIGlmIHRoaXMgQUMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3RhdGlvbiwgY29ycmVjdGlvbiB3aWxsIGJlCisgICAgICBtYWRlIGluIHRoZSBtYWluIFRMIGxvb3AgYWZ0ZXIgdGhlIHN1cHBvcnRlZCBtYXNrIGlzIHByb3Blcmx5CisgICAgICB1cGRhdGVkIGluIHRoZSBwZW5kaW5nIHBhY2tldHMgY2FsbAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0udWNDdXJyZW50QUMgICAgID0gV0xBTlRMX0FDX1ZPOworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS51Y0N1cnJlbnRXZWlnaHQgPSAwOworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS51Y1NlcnZpY2VkQUMgICAgPSBXTEFOVExfQUNfQks7CisgIAorICB2b3NfbWVtX3plcm8oIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLmF1Y0FDTWFzaywKKyAgICAgICAgICAgICAgICBzaXplb2YocFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0uYXVjQUNNYXNrKSk7IAorCisgIHZvc19tZW1femVybyggJnBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLndVQVBTREluZm8sCisgICAgICAgICAgIHNpemVvZihwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS53VUFQU0RJbmZvKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJlb3JkZXJpbmcgaW5mbyBhbmQgQU1TRFUgZGUtYWdncmVnYXRpb24KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHZvc19tZW1femVybyggcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0uYXRsQkFSZW9yZGVySW5mbywKKyAgICAgc2l6ZW9mKHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bMF0pKgorICAgICBXTEFOX01BWF9USUQpOworCisgIHZvc19tZW1femVybyggcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0uYXVjTVBEVUhlYWRlciwKKyAgICAgICAgICAgICAgICBXTEFOVExfTVBEVV9IRUFERVJfTEVOKTsKKworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS51Y01QRFVIZWFkZXJMZW4gICA9IDA7CisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLnZvc0FNU0RVQ2hhaW4gICAgID0gTlVMTDsKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0udm9zQU1TRFVDaGFpblJvb3QgPSBOVUxMOworCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFN0YXRzIGluZm8KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHZvc19tZW1femVybyggcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0uYXVSeENvdW50LAorICAgICAgc2l6ZW9mKHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLmF1UnhDb3VudFswXSkqCisgICAgICBXTEFOX01BWF9USUQpOworCisgIHZvc19tZW1femVybyggcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0uYXVUeENvdW50LAorICAgICAgc2l6ZW9mKHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLmF1UnhDb3VudFswXSkqCisgICAgICBXTEFOX01BWF9USUQpOworICAvKiBJbml0aWFsIFJTU0kgaXMgYWx3YXlzIHJlcG9ydGVkIGFzIHplcm8gYmVjYXVzZSBUTCBkb2VzbnQgaGF2ZSBlbm91Z2gKKyAgICAgZGF0YSB0byBjYWxjdWxhdGUgUlNTSS4gU28gdG8gYXZvaWQgcmVwb3J0aW5nIHplcm8sIHdlIGFyZSBpbml0aWFsaXppbmcKKyAgICAgUlNTSSB3aXRoIFJTU0kgc2F2ZWQgaW4gQnNzRGVzY3JpcHRpb24gZHVyaW5nIHNjYW5uaW5nLiAqLworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS5yc3NpQXZnID0gcnNzaTsKKworICAvKlR4IG5vdCBzdXNwZW5kZWQgYW5kIHN0YXRpb24gZnVsbHkgcmVnaXN0ZXJlZCovCisgIHZvc19hdG9taWNfc2V0X1U4KAorICAgICAgICAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0udWNUeFN1c3BlbmRlZCwgMCk7CisKKyAgLyogVXNlZCB1bnRpbCBtdWx0aXBsZSBzdGF0aW9uIHN1cHBvcnQgd2lsbCBiZSBhZGRlZCovCisgIHBUTENiLT51Y1JlZ2lzdGVyZWRTdGFJZCA9IHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQ7CisKKyAgLyogU2F2ZSB0aGUgQkFQIHN0YXRpb24gSUQgZm9yIGZ1dHVyZSB1c2FnZSAqLworICBpZiAoIFdMQU5fU1RBX0JUX0FNUCA9PSBwd1NUQURlc2NUeXBlLT53U1RBVHlwZSApCisgIHsKKyAgICBwVExDYi0+dGxCQVBDbGllbnQudWNCQVBTVEFJZCA9IHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFN0YXRpc3RpY3MgaW5mbyAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIG1lbXNldCgmcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0udHJhZmZpY1N0YXRpc3RpY3MsCisgICAgICAgICAwLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFN0YXJ0IHdpdGggdGhlIHN0YXRlIHN1Z2dlc3RlZCBieSBjbGllbnQgY2FsbGVyCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXS50bFN0YXRlID0gCisgICAgcHdTVEFEZXNjVHlwZS0+dWNJbml0U3RhdGU7CisKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0udWNSeEJsb2NrZWQgPSAxOyAKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFmdGVyIGFsbCB0aGUgaW5pdCBpcyBjb21wbGV0ZSB3ZSBjYW4gbWFyayB0aGUgZXhpc3RhbmNlIGZsYWcgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLnVjRXhpc3RzKys7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgIC8vZmxvdyBjb250cm9sIGZpZWxkcyBpbml0CisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQgPSBGQUxTRTsKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0udWNMd21FdmVudFJlcG9ydGVkID0gRkFMU0U7CisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLmJtdU1lbUNvbnN1bWVkID0gMDsKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoID0gMDsKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0udUJ1ZmZUaHJlc2hvbGRNYXggPSBXTEFOVExfU1RBX0JNVV9USFJFU0hPTERfTUFYOworCisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3B3U1RBRGVzY1R5cGUtPnVjU1RBSWRdLnVMd21UaHJlc2hvbGQgPSBXTEFOVExfU1RBX0JNVV9USFJFU0hPTERfTUFYIC8gMzsKKworICAvL0BAQCBIRERTT0ZUQVAgZG9lcyBub3QgcXVldWUgdW5yZWdpc3RlcmVkIHBhY2tldCBmb3Igbm93CisgIGlmICggV0xBTl9TVEFfU09GVEFQICE9IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlICkKKyAgeyAKKyNlbmRpZgorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBGb3J3YXJkIHJlY2VpdmVkIGZyYW1lcyB3aGlsZSBTVEEgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZCAKKyAgICAtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKFdMQU5UTF9TdGFydEZvcndhcmRpbmcoIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNVY2FzdFNpZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y0JjYXN0U2lnKSkpCisgICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIgJXMgZmFpbHMgdG8gc3RhcnQgZm9yd2FyZGluZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgfQorI2VuZGlmCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFyU1RBQ2xpZW50CisKKyAgREVTQ1JJUFRJT04KKworICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgd2hlbiBpdCBubyBsb25nZXIgbmVlZHMgZGF0YSBzZXJ2aWNlcyBmb3IgdGhlCisgICAgcGFydGljdWxhciBzdGF0aW9uLgorCisgIERFUEVOREVOQ0lFUworCisgICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjbGVhciByZWdpc3RyYXRpb24gaXMKKyAgICBjYWxsZWQuCisKKyAgUEFSQU1FVEVSUworCisgICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgdWNTVEFJZDogICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRvIGJlIGNsZWFyZWQKKworICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6IFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfQ2xlYXJTVEFDbGllbnQKKygKKyAgdl9QVk9JRF90ICAgICAgICAgcHZvc0dDdHgsCisgIHZfVThfdCAgICAgICAgICAgIHVjU1RBSWQKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsgCisgIHZfVThfdCAgdWNJbmRleDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DbGVhclNUQUNsaWVudCIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NsZWFyU1RBQ2xpZW50IikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNFeGlzdHMgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0NsZWFyU1RBQ2xpZW50IikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOworICB9CisKKyAgLyogRGVsZXRlIEJBIHNlc3Npb25zIG9uIGFsbCBUSUQncyAqLworICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1RJRCA7IHVjSW5kZXgrKykgCisgIHsKKyAgICAgV0xBTlRMX0JhU2Vzc2lvbkRlbCAocHZvc0dDdHgsIHVjU1RBSWQsIHVjSW5kZXgpOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDbGVhciBzdGF0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFRMOkNsZWFyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIiwgdWNTVEFJZCApKTsKKyAgV0xBTlRMX0NsZWFuU1RBKCZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSwgMSAvKmVtcHR5IHBhY2tldHMqLyk7CisKKyAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiV0xBTiBUTDpDbGVhcmluZyBTVEEgUmVzZXQgSGlzdG9yeSBSU1NJIGFuZCBSZWdpb24gbnVtYmVyIikpOworICBwVExDYi0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLmhpc3RvcnlSU1NJID0gMDsKKyAgcFRMQ2ItPmhvU3VwcG9ydC5jdXJyZW50SE9TdGF0ZS5yZWdpb25OdW1iZXIgPSAwOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX0NsZWFyU1RBQ2xpZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0NoYW5nZVNUQVN0YXRlCisKKyAgREVTQ1JJUFRJT04KKworICAgIEhERCB3aWxsIG1ha2UgdGhpcyBub3RpZmljYXRpb24gd2hlbmV2ZXIgYSBjaGFuZ2Ugb2NjdXJzIGluIHRoZQorICAgIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhIHBhcnRpY3VsYXIgU1RBLgorCisgIERFUEVOREVOQ0lFUworCisgICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjaGFuZ2Ugc3RhdGUgY2FuIGJlCisgICAgY2FsbGVkLgorCisgICAgUkVTVFJJQ1RJT046IEEgc3RhdGlvbiBpcyBiZWluZyBub3RpZmllZCBhcyBhdXRoZW50aWNhdGVkIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgICAga2V5cyBhcmUgaW5zdGFsbGVkIGluIEhXLiBUaGlzIHdheSBpZiBhIGZyYW1lIGlzIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUga2V5cyBhcmUgaW5zdGFsbGVkIERQVSB3aWxsIGRyb3AgdGhhdCBmcmFtZS4KKworICAgIE1haW4gdGhyZWFkIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhdCBUeCBhbmQgUnggdGhyZWFkcyB0aHVzIGd1YXJhbnRlZWluZworICAgIHRoZSBmb2xsb3dpbmc6CisgICAgICAgIC0gYSBzdGF0aW9uIHdpbGwgYmUgaW4gYXNzb2Mgc3RhdGUgaW4gVEwgYmVmb3JlIFRMIHJlY2VpdmVzIGFueSBkYXRhCisgICAgICAgICAgZm9yIGl0CisKKyAgUEFSQU1FVEVSUworCisgICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgdWNTVEFJZDogICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRoYXQgaXMgcGVuZGluZyB0cmFuc21pc3Npb24KKyAgIHRsU1RBU3RhdGU6ICAgICB0aGUgbmV3IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBzdGF0aW9uCisKKworICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bworICAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfQ2hhbmdlU1RBU3RhdGUKKygKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKKyAgV0xBTlRMX1NUQVN0YXRlVHlwZSAgIHRsU1RBU3RhdGUKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggdGxTVEFTdGF0ZSA+PSBXTEFOVExfU1RBX01BWF9TVEFURSApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgIH0KKworICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjRXhpc3RzICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoYW5nZSBTVEEgc3RhdGUKKyAgICBObyBuZWVkIHRvIGxvY2sgdGhpcyBvcGVyYXRpb24sIHNlZSByZXN0cmljdGlvbnMgYWJvdmUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6Q2hhbmdpbmcgc3RhdGUgZm9yIFNUQSBDbGllbnQgSUQ6ICVkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgIHVjU1RBSWQsIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnRsU3RhdGUsIHRsU1RBU3RhdGUpKTsKKworICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS50bFN0YXRlID0gdGxTVEFTdGF0ZTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFQa3RQZW5kaW5nCisKKyAgREVTQ1JJUFRJT04KKworICAgIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgd2hlbiBhIHBhY2tldCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbiBpbiBpdHMKKyAgICBxdWV1ZXMuCisKKyAgREVQRU5ERU5DSUVTCisKKyAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIHBhY2tldCBwZW5kaW5nCisgICAgbm90aWZpY2F0aW9uIGNhbiBiZSBzZW50LgorCisgICAgUkVTVFJJQ1RJT046IFRMIHdpbGwgbm90IGNvdW50IHBhY2tldHMgZm9yIHBlbmRpbmcgbm90aWZpY2F0aW9uLgorICAgICAgICAgICAgICAgICBIREQgaXMgZXhwZWN0ZWQgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9uIG9ubHkgd2hlbgorICAgICAgICAgICAgICAgICBub24tZW1wdHkgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQuIFdvcnN0IGNhc2Ugc2NlbmFyaW8KKyAgICAgICAgICAgICAgICAgaXMgdGhhdCBUTCBtaWdodCBlbmQgdXAgbWFraW5nIGEgY2FsbCB3aGVuIEhkZHMKKyAgICAgICAgICAgICAgICAgcXVldWVzIGFyZSBhY3R1YWxseSBlbXB0eS4KKworICBQQVJBTUVURVJTCisKKyAgICBwdm9zR0N0eDogICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgdWNTVEFJZDogICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdGhhdCBpcyBwZW5kaW5nIHRyYW5zbWlzc2lvbgorCisgIFJFVFVSTiBWQUxVRQorCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKKyAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9TVEFQa3RQZW5kaW5nCisoCisgIHZfUFZPSURfdCAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICAgICB1Y1NUQUlkLAorICBXTEFOVExfQUNFbnVtVHlwZSAgICB1Y0FjCispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICB2b3NfbXNnX3QgICAgICB2b3NNc2c7CisjZW5kaWYKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICJXTEFOIFRMOlBhY2tldCBwZW5kaW5nIGluZGljYXRpb24gZm9yIFNUQTogJWQgQUM6ICVkIiwgdWNTVEFJZCwgdWNBYyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9TVEFQa3RQZW5kaW5nIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVBrdFBlbmRpbmciKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0V4aXN0cyApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfU1RBUGt0UGVuZGluZyIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGVtcG9yYXJ5IGZpeCB0byBlbmFibGUgVEwgdG8gZmV0Y2ggcGFja2V0cyB3aGVuIG11bHRpcGxlIHBlZXJzIGpvaW4KKyAgICBhbiBJQlNTLiBUbyBmaXggQ1IxNzczMDEuIE5lZWRzIHRvIGdvIGF3YXkgd2hlbiB0aGUgYWN0dWFsIGZpeCBvZgorICAgIGdvaW5nIHRocm91Z2ggYWxsIFNUQSdzIGluIHJvdW5kIHJvYmluIGZhc2hpb24gZ2V0cyBtZXJnZWQgaW4gZnJvbQorICAgIEJUIEFNUCBicmFuY2guCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYi0+dWNSZWdpc3RlcmVkU3RhSWQgPSB1Y1NUQUlkOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFbmFibGUgdGhpcyBBQyBpbiB0aGUgQUMgbWFzayBpbiBvcmRlciBmb3IgVEwgdG8gc3RhcnQgc2VydmljaW5nIGl0CisgICAgU2V0IHBhY2tldCBwZW5kaW5nIGZsYWcgCisgICAgVG8gYXZvaWQgcmFjZSBjb25kaXRpb24sIHNlcmlhbGl6ZSB0aGUgdXBkYXRpb24gb2YgQUMgYW5kIEFDIG1hc2sgCisgICAgdGhyb3VnaCBXTEFOVExfVFhfU1RBSURfQUNfSU5EIG1lc3NhZ2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgaWYgKFdMQU5fU1RBX1NPRlRBUCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS53U1RBRGVzYy53U1RBVHlwZSkKKyAgICB7CisjZW5kaWYKKworICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXVjQUNNYXNrW3VjQWNdID0gMTsgCisKKyAgICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNQa3RQZW5kaW5nLCAxKTsKKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgQ2hlY2sgaWYgdGhlcmUgYXJlIGVub3VnaCByZXNvdXJjZXMgZm9yIHRyYW5zbWlzc2lvbiBhbmQgdHggaXMgbm90CisgICAgICAgIHN1c3BlbmRlZC4KKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfREFUQSApICYmCisgICAgICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkpCisgICAgICB7CisgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICJJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwiKSk7CisgICAgICAgICAgIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIE5vIGVycm9yIGNvZGUgaXMgc2VudCBiZWNhdXNlIFRMIHdpbGwgcmVzdW1lIHR4IGF1dG9ub21vdXNseSBpZgorICAgICAgICAgIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlIG9yIHR4IGdldHMgcmVzdW1lZAorICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBidXQgY29uZGl0aW9uIG5vdCBtZXQuIFJlczogJWQsU3VzcGVuZDogJWQiLAorICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50LCBwVExDYi0+dWNUeFN1c3BlbmRlZCApKTsKKyAgICAgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB2b3NNc2cucmVzZXJ2ZWQgPSAwOworICAgICAgdm9zTXNnLmJvZHl2YWwgID0gMDsKKyAgICAgIHZvc01zZy5ib2R5dmFsID0gKHVjQWMgfCAodWNTVEFJZCA8PCBXTEFOVExfU1RBSURfT0ZGU0VUKSk7CisgICAgICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfU1RBSURfQUNfSU5EOworICAgICAgcmV0dXJuIHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NUV9JRF9UTCwgJnZvc01zZyk7CisgICAgfQorI2VuZGlmCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1NUQVBrdFBlbmRpbmcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9TZXRTVEFQcmlvcml0eQorCisgIERFU0NSSVBUSU9OCisKKyAgICBUTCBleHBvc2VzIHRoaXMgQVBJIHRvIGFsbG93IHVwcGVyIGxheWVycyBhIHJvdWdoIGNvbnRyb2wgb3ZlciB0aGUKKyAgICBwcmlvcml0eSBvZiB0cmFuc21pc3Npb24gZm9yIGEgZ2l2ZW4gc3RhdGlvbiB3aGVuIHN1cHBvcnRpbmcgbXVsdGlwbGUKKyAgICBjb25uZWN0aW9ucy4KKworICBERVBFTkRFTkNJRVMKKworICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2hhbmdlIGluIHByaW9yaXR5IGNhbiBiZQorICAgIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdGhhdCBoYXMgdG8gY2hhbmdlIHByaW9yaXR5CisKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1NldFNUQVByaW9yaXR5CisoCisgIHZfUFZPSURfdCAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICAgICB1Y1NUQUlkLAorICBXTEFOVExfU1RBUHJpb3JpdHlUeXBlICAgdGxTVEFQcmkKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfU2V0U1RBUHJpb3JpdHkiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU2V0U1RBUHJpb3JpdHkiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0V4aXN0cyApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfU2V0U1RBUHJpb3JpdHkiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJlLWFuYWxpemUgaWYgbG9jayBpcyBuZWVkZWQgd2hlbiBhZGRpbmcgbXVsdGlwbGUgc3RhdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6Q2hhbmdpbmcgc3RhdGUgZm9yIFNUQSBQcmkgSUQ6ICVkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgIHVjU1RBSWQsIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnRsUHJpLCB0bFNUQVByaSkpOworICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS50bFByaSA9IHRsU1RBUHJpOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1NldFNUQVByaW9yaXR5ICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSU5URVJBQ1RJT04gV0lUSCBCQVAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50CisKKyAgREVTQ1JJUFRJT04KKyAgICBDYWxsZWQgYnkgU01FIHRvIHJlZ2lzdGVyIGl0c2VsZiBhcyBjbGllbnQgZm9yIG5vbi1kYXRhIEJULUFNUCBwYWNrZXRzLgorCisgIERFUEVOREVOQ0lFUworICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICBwZm5UbEJBUFJ4RnJtOiAgcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIG5vbi1kYXRhCisgICAgICAgICAgICAgICAgICAgIEJULUFNUCBwYWNrZXRzCisgICAgcGZuRmx1c2hPcENvbXBsZXRlQ2I6CisgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNhbGwgYmFjayBmdW5jdGlvbiwgZm9yIHRoZSBGbHVzaCBvcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbi4KKworCisgIFJFVFVSTiBWQUxVRQorCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKKyAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBCQUwgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQKKygKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICBwdm9zR0N0eCwKKyAgV0xBTlRMX0JBUFJ4Q0JUeXBlICAgICBwZm5UbEJBUFJ4RnJtLAorICBXTEFOVExfRmx1c2hPcENvbXBDQlR5cGUgIHBmbkZsdXNoT3BDb21wbGV0ZUNiCispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcGZuVGxCQVBSeEZybSApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50IikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgIH0KKworICBpZiAoIE5VTEwgPT0gcGZuRmx1c2hPcENvbXBsZXRlQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgIkludmFsaWQgRmx1c2ggQ29tcGxldGUgQ2IgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50IikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHJlZ2lzdHJhdGlvbiBhdHRlbXB0CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIDAgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzICkKKyAgeworICAgIHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cysrOworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldMQU4gVEw6QkFQIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSZWdpc3RlciBzdGF0aW9uIHdpdGggVEwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgQkFQIENsaWVudCIgKSk7CisKKyAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzKys7CisKKyAgaWYgKCBOVUxMICE9IHBmblRsQkFQUnhGcm0gKSAKKyAgeworICAgIHBUTENiLT50bEJBUENsaWVudC5wZm5UbEJBUFJ4ICAgICAgICAgICAgID0gcGZuVGxCQVBSeEZybTsKKyAgfQorCisgIHBUTENiLT50bEJBUENsaWVudC5wZm5GbHVzaE9wQ29tcGxldGVDYiAgID0gcGZuRmx1c2hPcENvbXBsZXRlQ2I7CisKKyAgcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiAgICAgPSBOVUxMOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1JlZ2lzdGVyQkFQQ2xpZW50ICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9UeEJBUEZybQorCisgIERFU0NSSVBUSU9OCisgICAgQkFQIGNhbGxzIHRoaXMgd2hlbiBpdCB3YW50cyB0byBzZW5kIGEgZnJhbWUgdG8gdGhlIG1vZHVsZQorCisgIERFUEVOREVOQ0lFUworICAgIEJBUCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgorCisgICAgUkVTVFJJQ1RJT046IEJBUCBDQU5OT1QgcHVzaCBhbnkgcGFja2V0cyB0byBUTCB1bnRpbCBpdCBkaWQgbm90IHJlY2VpdmUKKyAgICAgICAgICAgICAgICAgYSB0eCBjb21wbGV0ZSBmcm9tIHRoZSBwcmV2aW91cyBwYWNrZXQsIHRoYXQgbWVhbnMgQkFQCisgICAgICAgICAgICAgICAgIHNlbmRzIG9uZSBwYWNrZXQsIHdhaXQgZm9yIHR4IGNvbXBsZXRlIGFuZCB0aGVuCisgICAgICAgICAgICAgICAgIHNlbmRzIGFub3RoZXIgb25lCisKKyAgICAgICAgICAgICAgICAgSWYgQkFQIHNlbmRzIGFub3RoZXIgcGFja2V0IGJlZm9yZSBUTCBtYW5hZ2VzIHRvIHByb2Nlc3MgdGhlCisgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgc2VudCBwYWNrZXQgY2FsbCB3aWxsIGVuZCBpbiBmYWlsdXJlCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIG9yIEJBUCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdk9TUyBidWZmZXIgY29udGFpbmluZyB0aGUgcGFja2V0IHRvIGJlCisgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVkCisgICAgcE1ldGFJbmZvOiAgICAgIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2tldAorICAgIHBmblRsQkFQVHhDb21wOiBwb2ludGVyIHRvIGEgdHJhbnNtaXQgY29tcGxldGUgcm91dGluZSBmb3Igbm90aWZ5aW5nCisgICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBvdmVyIHRoZSBidXMKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogQkFMIGNsaWVudCB3YXMgbm90IHlldCByZWdpc3RlcmVkCisgICAgVk9TX1NUQVRVU19FX0JVU1k6ICAgVGhlIHByZXZpb3VzIEJULUFNUCBwYWNrZXQgd2FzIG5vdCB5ZXQgdHJhbnNtaXR0ZWQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICAgIE90aGVyIGZhaWx1cmUgbWVzc2FnZXMgbWF5IGJlIHJldHVybmVkIGZyb20gdGhlIEJEIGhlYWRlciBoYW5kbGluZworICAgIHJvdXRpbmVzLCBwbGVhc2UgY2hlY2sgYXByb3ByaWF0ZSBBUEkgZm9yIG1vcmUgaW5mby4KKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfVHhCQVBGcm0KKygKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsCisgIHZvc19wa3RfdCogICAgICAgICAgICAgIHZvc0RhdGFCdWZmLAorICBXTEFOVExfTWV0YUluZm9UeXBlKiAgICBwTWV0YUluZm8sCisgIFdMQU5UTF9UeENvbXBDQlR5cGUgICAgIHBmblRsQkFQVHhDb21wCispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiAgICAgID0gTlVMTDsKKyAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgIHZfTUFDQUREUl90ICAgICB2RGVzdE1hY0FkZHI7CisgIHZfVTE2X3QgICAgICAgICB1c1BrdExlbjsKKyAgdl9VOF90ICAgICAgICAgIHVjU3RhSWQgPSAwOworICB2X1U4X3QgICAgICAgICAgZXh0cmFIZWFkU3BhY2UgPSAwOworICB2X1U4X3QgICAgICAgICAgdWNXRFNFbmFibGVkID0gMDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfVHhCQVBGcm0iKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRW5zdXJlIHRoYXQgQkFQIGNsaWVudCB3YXMgcmVnaXN0ZXJlZCBwcmV2aW91c2x5CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCAwID09IHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cyApIHx8CisgICAgICAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRChwVExDYi0+dGxCQVBDbGllbnQudWNCQVBTVEFJZCkgKSkKKyAgeworICAgIHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cysrOworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkJBUCBjbGllbnQgbm90IHJlZ2lzdGVyIG9uIFdMQU5UTF9UeEJBUEZybSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBDaGVjayBpZiBhbnkgQlQtQU1QIEZybSBpcyBwZW5kaW5nCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggTlVMTCAhPSBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgIldMQU4gVEw6QlQtQU1QIEZyYW1lIGFscmVhZHkgcGVuZGluZyB0eCBpbiBUTCBvbiBXTEFOVExfVHhCQVBGcm0iKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9CVVNZOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYXZlIGJ1ZmZlciBhbmQgbm90aWZ5IEJBTDsgbm8gbG9jayBpcyBuZWVkZWQgaWYgdGhlIGFib3ZlIHJlc3RyaWN0aW9uCisgICAgaXMgbWV0CisgICAgU2F2ZSB0aGUgdHggY29tcGxldGUgZm5jdCBwb2ludGVyIGFzIHRsIHNwZWNpZmljIGRhdGEgaW4gdGhlIHZvcyBidWZmZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB1Y1N0YUlkID0gcFRMQ2ItPnRsQkFQQ2xpZW50LnVjQkFQU1RBSWQ7CisgIGlmICgoIDAgPT0gcE1ldGFJbmZvLT51Y0Rpc2FibGVGcm1YdGwgKSAmJgorICAgICAgKCAwICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiApKQorICB7CisgICAgdm9zU3RhdHVzID0gV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwgdWNTdGFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1ldGFJbmZvLT51Y1VQLCAmdWNXRFNFbmFibGVkLCAmZXh0cmFIZWFkU3BhY2UpOworCisgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3Igd2hlbiB0cmFuc2xhdGluZyBoZWFkZXIgV0xBTlRMX1R4QkFQRnJtIikpOworCisgICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgIH0KKworICAgIHBNZXRhSW5mby0+dWNEaXNhYmxlRnJtWHRsID0gMTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENhbGwgSEFMIHRvIGZpbGwgQkQgaGVhZGVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAvKiBBZGRpbmcgVHlwZSwgU3ViVHlwZSB3aGljaCB3YXMgbWlzc2luZyBmb3IgRUFQT0wgZnJvbSBCQVAgKi8KKyAgcE1ldGFJbmZvLT51Y1R5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1RZUEUgPDwgNCk7CisgIHBNZXRhSW5mby0+dWNUeXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSk7CisKKyAgdm9zU3RhdHVzID0gV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYgLCAKKyAgICAgICAgICAgICAgICAgICAgJnZEZXN0TWFjQWRkciwgcE1ldGFJbmZvLT51Y0Rpc2FibGVGcm1YdGwsIAorICAgICAgICAgICAgICAgICAgICAmdXNQa3RMZW4sIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLndTVEFEZXNjLnVjUW9zRW5hYmxlZCwgCisgICAgICAgICAgICAgICAgICAgIHVjV0RTRW5hYmxlZCwgZXh0cmFIZWFkU3BhY2UsIHBNZXRhSW5mby0+dWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIHBNZXRhSW5mby0+dWNUSUQsIDAgLyogTm8gQUNLICovLCBwTWV0YUluZm8tPnVzVGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICBwTWV0YUluZm8tPnVjSXNFYXBvbCwgcE1ldGFJbmZvLT51Y1VQICk7CisKKyAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBidWlsZGluZyBUWCBoZWFkZXIgJWQiLCB2b3NTdGF0dXMpKTsKKyAgICByZXR1cm4gdm9zU3RhdHVzOworICB9CisKKyAgaWYgKCBOVUxMICE9IHBmblRsQkFQVHhDb21wICkKKyAgeworICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBmblRsQkFQVHhDb21wKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClXTEFOVExfVHhDb21wRGVmYXVsdENiKTsKKworICB9CisKKyAgdm9zX2F0b21pY19zZXRfVTMyKCAodl9VMzJfdCopJnBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgKHZfVTMyX3Qpdm9zRGF0YUJ1ZmYpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhyZSBhcmUgZW5vdWdoIHJlc291cmNlcyBmb3IgdHJhbnNtaXNzaW9uIGFuZCB0eCBpcyBub3QKKyAgICBzdXNwZW5kZWQuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfQkFQICkgJiYKKyAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApKQorICB7CisgICAgV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIE5vIGVycm9yIGNvZGUgaXMgc2VudCBiZWNhdXNlIFRMIHdpbGwgcmVzdW1lIHR4IGF1dG9ub21vdXNseSBpZgorICAgICAgcmVzb3VyY2VzIGJlY29tZSBhdmFpbGFibGUgb3IgdHggZ2V0cyByZXN1bWVkCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAiV0xBTiBUTDpSZXF1ZXN0IHRvIHNlbmQgZnJvbSBCQVAgYnV0IGNvbmRpdGlvbiBub3QgbWV0LlJlczogJWQsIgorICAgICAgICAgICAgICAgICAiU3VzcGVuZDogJWQiLCBwVExDYi0+dVJlc0NvdW50LCBwVExDYi0+dWNUeFN1c3BlbmRlZCApKTsKKyAgfQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1R4QkFQRnJtICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSU5URVJBQ1RJT04gV0lUSCBTTUUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFJzc2kKKworICBERVNDUklQVElPTgorICAgIFRMIHdpbGwgZXh0cmFjdCB0aGUgUlNTSSBpbmZvcm1hdGlvbiBmcm9tIGV2ZXJ5IGRhdGEgcGFja2V0IGZyb20gdGhlCisgICAgb25nb2luZyB0cmFmZmljIGFuZCB3aWxsIHN0b3JlIGl0LiBJdCB3aWxsIHByb3ZpZGUgdGhlIHJlc3VsdCB0byBTTUUKKyAgICB1cG9uIHJlcXVlc3QuCisKKyAgREVQRU5ERU5DSUVTCisKKyAgICBXQVJOSU5HOiB0aGUgcmVhZCBhbmQgd3JpdGUgb2YgdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBwcm90ZWN0ZWQKKyAgICAgICAgICAgICBieSBsb2NrcywgdGhlcmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBvYnRhaW5lZCBhZnRlciBhIHJlYWQKKyAgICAgICAgICAgICBtaWdodCBub3QgYWx3YXlzIGJlIGNvbnNpc3RlbnQuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQorCisgICAgT1VUCisgICAgcHVSc3NpOiAgICAgICAgIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBSU1NJCisKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFNUQSB3YXMgbm90IHlldCByZWdpc3RlcmVkCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX0dldFJzc2kKKygKKyAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKKyAgdl9VOF90ICAgICAgICAgICB1Y1NUQUlkLAorICB2X1M3X3QqICAgICAgICAgIHBSc3NpCispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcFJzc2kgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0UnNzaSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9HZXRSc3NpIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0UnNzaSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjRXhpc3RzICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFJzc2kiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENvcHkgd2lsbCBub3QgYmUgbG9ja2VkOyBwbGVhc2UgcmVhZCByZXN0cmljdGlvbgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYocFRMQ2ItPmlzQk1QUykKKyAgeworICAgICpwUnNzaSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnJzc2lBdmdCbXBzOworICAgIC8qIENoZWNrIElmIFJTU0kgaXMgemVybyBiZWNhdXNlIHdlIGFyZSByZWFkaW5nIHJzc0F2Z0JtcHMgdXBkYXRlZCBieSBIQUwgaW4gCisgICAgcHJldmlvdXMgR2V0U3RhdHNSZXF1ZXN0LiBJdCBtYXkgYmUgdXBkYXRlZCBhcyB6ZXJvIGJ5IEhhbCBiZWNhdXNlIEVudGVyQm1wcyAKKyAgICBtaWdodCBub3QgaGF2ZSBoYXBwZW5kIGJ5IHRoYXQgdGltZS4gSGVuY2UgcmVhZGluZyB0aGUgbW9zdCByZWNlbnQgUnNzaSAKKyAgICBjYWxjbHVhdGVkIGJ5IFRMKi8KKyAgICBpZigwID09ICpwUnNzaSkKKyAgICB7CisgICAgICAqcFJzc2kgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5yc3NpQXZnOworICAgIH0KKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpibXBzUnNzaSAlZCBcbiIsKnBSc3NpKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgKnBSc3NpID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucnNzaUF2ZzsKKyAgfQorCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfR2V0UnNzaSBmb3IgU1RBOiAlZCBSU1NJOiAlZCIsIHVjU1RBSWQsICpwdVJzc2kpKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9HZXRSc3NpICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfR2V0TGlua1F1YWxpdHkKKworICBERVNDUklQVElPTgorICAgIFRMIHdpbGwgZXh0cmFjdCB0aGUgU05SIGluZm9ybWF0aW9uIGZyb20gZXZlcnkgZGF0YSBwYWNrZXQgZnJvbSB0aGUKKyAgICBvbmdvaW5nIHRyYWZmaWMgYW5kIHdpbGwgc3RvcmUgaXQuIEl0IHdpbGwgcHJvdmlkZSB0aGUgcmVzdWx0IHRvIFNNRQorICAgIHVwb24gcmVxdWVzdC4KKworICBERVBFTkRFTkNJRVMKKworICAgIFdBUk5JTkc6IHRoZSByZWFkIGFuZCB3cml0ZSBvZiB0aGlzIHZhbHVlIHdpbGwgbm90IGJlIHByb3RlY3RlZAorICAgICAgICAgICAgIGJ5IGxvY2tzLCB0aGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGFmdGVyIGEgcmVhZAorICAgICAgICAgICAgIG1pZ2h0IG5vdCBhbHdheXMgYmUgY29uc2lzdGVudC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIHZhbHVlCisKKyAgICBPVVQKKyAgICBwdUxpbmtRdWFsaXR5OiAgICAgICAgIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBTTlIKKworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU1RBIHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfR2V0TGlua1F1YWxpdHkKKygKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKKyAgdl9VMzJfdCogICAgICAgICAgICAgIHB1TGlua1F1YWxpdHkKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBOVUxMID09IHB1TGlua1F1YWxpdHkgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiSW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0TGlua1F1YWxpdHkiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiSW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0TGlua1F1YWxpdHkiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0TGlua1F1YWxpdHkiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0V4aXN0cyApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ29weSB3aWxsIG5vdCBiZSBsb2NrZWQ7IHBsZWFzZSByZWFkIHJlc3RyaWN0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAqcHVMaW5rUXVhbGl0eSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMaW5rUXVhbGl0eUF2ZzsKKworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIldMQU5UTF9HZXRMaW5rUXVhbGl0eSBmb3IgU1RBOiAlZCBMaW5rUXVhbGl0eTogJWQiLCB1Y1NUQUlkLCAqcHVMaW5rUXVhbGl0eSkpOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX0dldExpbmtRdWFsaXR5ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfRmx1c2hTdGFUSUQKKworICBERVNDUklQVElPTgorICAgIFRMIHByb3ZpZGVzIHRoaXMgQVBJIGFzIGFuIGludGVyZmFjZSB0byBTTUUgKEJBUCkgbGF5ZXIuIFRMIGludHVybiBwb3N0cyBhCisgICAgbWVzc2FnZSB0byBIQUwuIFRoaXMgQVBJIGlzIGNhbGxlZCBieSB0aGUgU01FIGlub3JkZXIgdG8gcGVyZm9ybSBhIGZsdXNoCisgICAgb3BlcmF0aW9uLgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0ZWQgdmFsdWUKKyAgICB1Y1RpZDogICAgICAgICAgVHNwZWMgSUQgZm9yIHRoZSBuZXcgQkEgc2Vzc2lvbgorCisgICAgT1VUCisgICAgVGhlIHJlc3BvbnNlIGZvciB0aGlzIHBvc3QgaXMgcmVjZWl2ZWQgaW4gdGhlIG1haW4gdGhyZWFkLCB2aWEgYSByZXNwb25zZQorICAgIG1lc3NhZ2UgZnJvbSBIQUwgdG8gVEwuCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9GbHVzaFN0YVRJRAorKAorICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCisgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkLAorICB2X1U4X3QgICAgICAgICAgICAgICAgdWNUaWQKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKKyAgdHBGbHVzaEFDUmVxIEZsdXNoQUNSZXFQdHIgPSBOVUxMOworICB2b3NfbXNnX3Qgdm9zTWVzc2FnZTsKKworCisgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiSW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfRmx1c2hTdGFUSUQiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfRmx1c2hTdGFUSUQiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0V4aXN0cyApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9GbHVzaFN0YVRJRCIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdlIG5lZWQgdG8gcG9zdCBhIG1lc3NhZ2Ugd2l0aCB0aGUgU1RBLCBUSUQgdmFsdWUgdG8gSEFMLiBIQUwgcGVyZm9ybXMgdGhlIGZsdXNoCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIEZsdXNoQUNSZXFQdHIgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodEZsdXNoQUNSZXEpKTsKKworICBpZiAoIE5VTEwgPT0gRmx1c2hBQ1JlcVB0ciApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICJXTEFOIFRMOiBmYXRhbCBmYWlsdXJlLCBjYW5ub3QgYWxsb2NhdGUgRmx1c2ggUmVxIHN0cnVjdHVyZSIpKTsKKyAgICBWT1NfQVNTRVJUKDApOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgIH0KKworICAvLyBTdGFydCBjb25zdHJ1Y3RpbmcgdGhlIG1lc3NhZ2UgZm9yIEhBTAorICBGbHVzaEFDUmVxUHRyLT5tZXNnVHlwZSAgICA9IFNJUl9UTF9IQUxfRkxVU0hfQUNfUkVROworICBGbHVzaEFDUmVxUHRyLT5tZXNnTGVuICAgICA9IHNpemVvZih0Rmx1c2hBQ1JlcSk7CisgIEZsdXNoQUNSZXFQdHItPm1lc2dMZW4gICAgID0gc2l6ZW9mKHRGbHVzaEFDUmVxKTsKKyAgRmx1c2hBQ1JlcVB0ci0+dWNTVEFJZCA9IHVjU1RBSWQ7CisgIEZsdXNoQUNSZXFQdHItPnVjVGlkID0gdWNUaWQ7CisKKyAgdm9zTWVzc2FnZS50eXBlICAgICAgICAgICAgPSBXREFfVExfRkxVU0hfQUNfUkVROworICB2b3NNZXNzYWdlLmJvZHlwdHIgPSAodm9pZCAqKUZsdXNoQUNSZXFQdHI7CisKKyAgdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfV0RBLCAmdm9zTWVzc2FnZSk7CisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSU5URVJBQ1RJT04gV0lUSCBQRQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50CisKKyAgREVTQ1JJUFRJT04KKyAgICBDYWxsZWQgYnkgUEUgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzIGRlbGl2ZXJ5LgorCisgIERFUEVOREVOQ0lFUworICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgQVBJIGNhbiBiZSBjYWxsZWQuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICBwZm5UbE1nbXRGcm1SeDogICAgIHBvaW50ZXIgdG8gdGhlIHJlY2VpdmUgcHJvY2Vzc2luZyByb3V0aW5lIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlbWVudCBmcmFtZXMKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IE1nbXQgRnJhbWUgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50CisoCisgIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAorICBXTEFOVExfTWdtdEZybVJ4Q0JUeXBlICBwZm5UbE1nbXRGcm1SeAorKQoreworICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBOVUxMID09IHBmblRsTWdtdEZybVJ4ICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50IikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHJlZ2lzdHJhdGlvbiBhdHRlbXB0CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIDAgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyApCisgIHsKKyAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzKys7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IGZyYW1lIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSZWdpc3RlciBzdGF0aW9uIHdpdGggVEwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBNYW5hZ2VtZW50IEZyYW1lIENsaWVudCIgKSk7CisKKyAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cysrOworCisgIGlmICggTlVMTCAhPSBwZm5UbE1nbXRGcm1SeCApCisgIHsKKyAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4ID0gcGZuVGxNZ210RnJtUng7CisgIH0KKworICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiA9IE5VTEw7CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfRGVSZWdpc3Rlck1nbXRGcm1DbGllbnQKKworICBERVNDUklQVElPTgorICAgIENhbGxlZCBieSBQRSB0byBkZXJlZ2lzdGVyIGFzIGEgY2xpZW50IGZvciBtYW5hZ2VtZW50IGZyYW1lcyBkZWxpdmVyeS4KKworICBERVBFTkRFTkNJRVMKKyAgICBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIEFQSSBjYW4gYmUgY2FsbGVkLgorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICBUTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKKyAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBNZ210IEZyYW1lIGNsaWVudCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9EZVJlZ2lzdGVyTWdtdEZybUNsaWVudAorKAorICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eAorKQoreworICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHJlZ2lzdHJhdGlvbiBhdHRlbXB0CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIDAgPT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgZnJhbWUgY2xpZW50IHdhcyBuZXZlciByZWdpc3RlcmVkIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDbGVhciByZWdpc3RyYXRpb24gd2l0aCBUTAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICJXTEFOIFRMOkRlcmVnaXN0ZXJpbmcgTWFuYWdlbWVudCBGcmFtZSBDbGllbnQiICkpOworCisgIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUnggPSBXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiOworICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpCisgIHsKKyAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIldMQU4gVEw6TWFuYWdlbWVudCBjYWNoZSBidWZmZXIgbm90IGVtcHR5IG9uIGRlcmVnaXN0ZXJpbmciCisgICAgICAgICAgICAgICAiIC0gZHJvcHBpbmcgcGFja2V0IiApKTsKKyAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOworCisgICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgPSBOVUxMOyAKKyAgfQorCisgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgPSAwOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1R4TWdtdEZybQorCisgIERFU0NSSVBUSU9OCisgICAgQ2FsbGVkIGJ5IFBFIHdoZW4gaXQgd2FudCB0byBzZW5kIG91dCBhIG1hbmFnZW1lbnQgZnJhbWUuCisgICAgSEFMIHdpbGwgYWxzbyB1c2UgdGhpcyBBUEkgZm9yIHRoZSBmZXcgZnJhbWVzIGl0IHNlbmRzIG91dCwgdGhleSBhcmUgbm90CisgICAgbWFuYWdlbWVudCBmcmFtZXMgaG93ZXZlcmUgaXQgaXMgYWNjZXB0ZWQgdGhhdCBhbiBleGNlcHRpb24gd2lsbCBiZQorICAgIGFsbG93ZWQgT05MWSBmb3IgdGhlIHVzYWdlIG9mIEhBTC4KKyAgICBHZW5lcmljIGRhdGEgZnJhbWVzIFNIT1VMRCBOT1QgdHJhdmVsIHRocm91Z2ggdGhpcyBmdW5jdGlvbi4KKworICBERVBFTkRFTkNJRVMKKyAgICBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIEFQSSBjYW4gYmUgY2FsbGVkLgorCisgICAgUkVTVFJJQ1RJT046IElmIFBFIHNlbmRzIGFub3RoZXIgcGFja2V0IGJlZm9yZSBUTCBtYW5hZ2VzIHRvIHByb2Nlc3MgdGhlCisgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgc2VudCBwYWNrZXQgY2FsbCB3aWxsIGVuZCBpbiBmYWlsdXJlCisKKyAgICAgICAgICAgICAgICAgRnJhbWVzIGNvbW1pbmcgdGhyb3VnaCBoZXJlIG11c3QgYmUgODAyLjExIGZyYW1lcywgZnJhbWUKKyAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gaW4gVU1BIHdpbGwgYmUgYXV0b21hdGljYWxseSBkaXNhYmxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7YSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgIHZvc0ZybUJ1ZjogICAgICBwb2ludGVyIHRvIGEgdk9TUyBidWZmZXIgY29udGFpbmluZyB0aGUgbWFuYWdlbWVudAorICAgICAgICAgICAgICAgICAgICBmcmFtZSB0byBiZSB0cmFuc21pdHRlZAorICAgIHVzRnJtTGVuOiAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSB0byBiZSB0cmFuc21pdHRlZDsgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgdk9TUyBidWZmZXIKKyAgICB3RnJtVHlwZTogICAgICAgdGhlIHR5cGUgb2YgdGhlIGZyYW1lIGJlaW5nIHRyYW5zbWl0dGVkCisgICAgdGlkOiAgICAgICAgICAgIHRpZCB1c2VkIHRvIHRyYW5zbWl0IHRoaXMgZnJhbWUKKyAgICBwZm5Db21wVHhGdW5jOiAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgY29tcGxldGUgcm91dGluZQorICAgIHB2QkRIZWFkZXI6ICAgICBwb2ludGVyIHRvIHRoZSBCRCBoZWFkZXIsIGlmIE5VTEwgaXQgbWVhbnMgaXQgd2FzIG5vdAorICAgICAgICAgICAgICAgICAgICB5ZXQgY29uc3RydWN0ZWQgYW5kIGl0IGxpZXMgd2l0aGluIFRMJ3MgcmVzcG9uc2liaWxpdHkKKyAgICAgICAgICAgICAgICAgICAgdG8gZG8gc287IGlmIG5vdCBOVUxMIGl0IGlzIGV4cGVjdGVkIHRoYXQgaXQgd2FzCisgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgcGFja2VkIGluc2lkZSB0aGUgdm9zIHBhY2tldAorICAgIHVjQWNrUmVzcG9uc2U6ICBmbGFnIG5vdGlmeWluZyBpdCBhbiBpbnRlcnJ1cHQgaXMgbmVlZGVkIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgYWNrbm93bGVkZ2VtZW50IHJlY2VpdmVkIHdoZW4gdGhlIGZyYW1lIGlzIHNlbnQgb3V0CisgICAgICAgICAgICAgICAgICAgIHRoZSBhaXIgYW5kIDsgdGhlIGludGVycnVwdCB3aWxsIGJlIHByb2Nlc3NlZCBieSBIQUwsCisgICAgICAgICAgICAgICAgICAgIG9ubHkgb25lIHN1Y2ggZnJhbWUgY2FuIGJlIHBlbmRpbmcgaW4gdGhlIHN5c3RlbSBhdAorICAgICAgICAgICAgICAgICAgICBvbmUgdGltZS4KKworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogTWdtdCBGcmFtZSBjbGllbnQgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAorICAgIFZPU19TVEFUVVNfRV9CVVNZOiAgIFRoZSBwcmV2aW91cyBNZ210IHBhY2tldCB3YXMgbm90IHlldCB0cmFuc21pdHRlZAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgICAgT3RoZXIgZmFpbHVyZSBtZXNzYWdlcyBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUgQkQgaGVhZGVyIGhhbmRsaW5nCisgICAgcm91dGluZXMsIHBsZWFzZSBjaGVjayBhcHJvcHJpYXRlIEFQSSBmb3IgbW9yZSBpbmZvLgorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9UeE1nbXRGcm0KKygKKyAgdl9QVk9JRF90ICAgICAgICAgICAgcHZvc0dDdHgsCisgIHZvc19wa3RfdCogICAgICAgICAgIHZvc0ZybUJ1ZiwKKyAgdl9VMTZfdCAgICAgICAgICAgICAgdXNGcm1MZW4sCisgIHZfVThfdCAgICAgICAgICAgICAgIHdGcm1UeXBlLAorICB2X1U4X3QgICAgICAgICAgICAgICB1Y1RpZCwKKyAgV0xBTlRMX1R4Q29tcENCVHlwZSAgcGZuQ29tcFR4RnVuYywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgcHZCREhlYWRlciwKKyAgdl9VOF90ICAgICAgICAgICAgICAgdWNBY2tSZXNwb25zZQorKQoreworICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOworICB2X01BQ0FERFJfdCAgICAgdkRlc3RNYWNBZGRyOworICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICB2X1UxNl90ICAgICAgICAgdXNQa3RMZW47CisgIHZfVTMyX3QgICAgICAgICB1c1RpbWVTdGFtcCA9IDA7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gdm9zRnJtQnVmICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1R4TWdtdEZybSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9UeE1nbXRGcm0iKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRW5zdXJlIHRoYXQgbWFuYWdlbWVudCBmcmFtZSBjbGllbnQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCAwID09IHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgKQorICB7CisgICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cysrOworICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IEZyYW1lIGNsaWVudCBub3QgcmVnaXN0ZXIgb24gV0xBTlRMX1R4TWdtdEZybSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKKyAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIGlmIGFueSBNZ210IEZybSBpcyBwZW5kaW5nCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvL3Zvc1RlbXBCdWZmID0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmY7CisgIGlmICggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApCisgIHsKKworICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgIldMQU4gVEw6TWFuYWdlbWVudCBGcmFtZSBhbHJlYWR5IHBlbmRpbmcgdHggaW4gVEw6IGZhaWxpbmcgb2xkIG9uZSIpKTsKKworCisgICAgLypGYWlsaW5nIHRoZSB0eCBmb3IgdGhlIHByZXZpb3VzIHBhY2tldCBlbnF1ZWQgYnkgUEUqLworICAgIC8vdm9zX2F0b21pY19zZXRfVTMyKCAodl9VMzJfdCopJnBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAorICAgIC8vICAgICAgICAgICAgICAgICAgICAodl9VMzJfdClOVUxMKTsKKworICAgIC8vdm9zX3BrdF9nZXRfdXNlcl9kYXRhX3B0ciggdm9zVGVtcEJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcGZuVHhDb21wKTsKKworICAgIC8qaXQgc2hvdWxkIG5ldmVyIGJlIE5VTEwgLSBkZWZhdWx0IGhhbmRsZXIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgaWYgbm9uZSovCisgICAgLy9pZiAoIE5VTEwgPT0gcGZuVHhDb21wICkKKyAgICAvL3sKKyAgICAvLyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgLy8gICAgICAgICAgICAiTlVMTCBwb2ludGVyIHRvIFR4IENvbXBsZXRlIG9uIFdMQU5UTF9UeE1nbXRGcm0iKTsKKyAgICAvLyAgVk9TX0FTU0VSVCgwKTsKKyAgICAvLyAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAvL30KKworICAgIC8vcGZuVHhDb21wKCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYsIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgKTsKKyAgICAvL3JldHVybiBWT1NfU1RBVFVTX0VfQlVTWTsKKworCisgICAgLy9wZm5Db21wVHhGdW5jKCBwdm9zR0N0eCwgdm9zRnJtQnVmLCBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX1JFU09VUkNFUzsKKyAgfQorCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiBCRCBoZWFkZXIgd2FzIGJ1aWxkLCBpZiBub3QgY29uc3RydWN0CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcHZCREhlYWRlciApCisgIHsKKyAgICAgdl9NQUNBRERSX3QqICAgICBwdkFkZHIyTWFjQWRkcjsKKyAgICAgdl9VOF90ICAgdVFvc0hkciA9IFZPU19GQUxTRTsKKworICAgICAvKiBHZXQgYWRkcmVzcyAyIG9mIE1hbmdlbWVudCBGcmFtZSB0byBnaXZlIHRvIFdMQU5IQUxfRmlsbFR4QmQgKi8KKyAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0ZybUJ1ZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUFDX0FERFJfQUxJR04oMSkgKyBWT1NfTUFDX0FERFJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2QWRkcjJNYWNBZGRyLCBWT1NfTUFDX0FERFJfU0laRSk7CisKKyAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgICAgeworICAgICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBnZXQgYWRkcjIgJWQiLCB2b3NTdGF0dXMpKTsKKyAgICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgIC8qIENDWCBJQVBQIEZyYW1lIHdoaWNoIGFyZSBkYXRhIGZyYW1lcyBidXQgdGVjaG5pY2FsbHkgdXNlZAorICAgICAqIGZvciBtYW5hZ2VtZW50IGZ1bmN0aW9uYWxpdHkgY29tZXMgdGhyb3VnaCByb3V0ZS4KKyAgICAgKi8KKyAgICBpZiAoV0xBTlRMX0lTX1FPU19EQVRBX0ZSQU1FKHdGcm1UeXBlKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7CisgICAgICAgIHVRb3NIZHIgPSBWT1NfVFJVRTsKKyAgICB9CisjZW5kaWYKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIENhbGwgV0RBIHRvIGJ1aWxkIFRYIGhlYWRlcgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICB2b3NTdGF0dXMgPSBXREFfRFNfQnVpbGRUeFBhY2tldEluZm8oIHB2b3NHQ3R4LCB2b3NGcm1CdWYgLCAmdkRlc3RNYWNBZGRyLCAKKyAgICAgICAgICAgICAgICAgICAxIC8qIGFsd2F5cyA4MDIuMTEgZnJhbWVzKi8sICZ1c1BrdExlbiwgdVFvc0hkciAvKnFvcyBub3QgZW5hYmxlZCAhISEqLywgCisgICAgICAgICAgICAgICAgICAgMCAvKiBXRFMgb2ZmICovLCAwLCB3RnJtVHlwZSwgcHZBZGRyMk1hY0FkZHIsIHVjVGlkLCAKKyAgICAgICAgICAgICAgICAgICB1Y0Fja1Jlc3BvbnNlLCB1c1RpbWVTdGFtcCwgMCwgMCApOworCisKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCisgICAgeworICAgICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGJ1aWxkIFRYIGhlYWRlciAlZCIsIHZvc1N0YXR1cykpOworICAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgICB9CisgICB9LyogaWYgQkQgaGVhZGVyIG5vdCBwcmVzZW50ICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYXZlIGJ1ZmZlciBhbmQgbm90aWZ5IEJBTDsgbm8gbG9jayBpcyBuZWVkZWQgaWYgdGhlIGFib3ZlIHJlc3RyaWN0aW9uCisgICAgaXMgbWV0CisgICAgU2F2ZSB0aGUgdHggY29tcGxldGUgZm5jdCBwb2ludGVyIGFzIHRsIHNwZWNpZmljIGRhdGEgaW4gdGhlIHZvcyBidWZmZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggTlVMTCAhPSBwZm5Db21wVHhGdW5jICkKKyAgeworICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0ZybUJ1ZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwZm5Db21wVHhGdW5jKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NGcm1CdWYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpV0xBTlRMX1R4Q29tcERlZmF1bHRDYik7CisKKyAgfQorCisgIHZvc19hdG9taWNfc2V0X1UzMiggKHZfVTMyX3QqKSZwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdCl2b3NGcm1CdWYpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhyZSBhcmUgZW5vdWdoIHJlc291cmNlcyBmb3IgdHJhbnNtaXNzaW9uIGFuZCB0eCBpcyBub3QKKyAgICBzdXNwZW5kZWQuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19NRiApCisgIHsKKyAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAiV0xBTiBUTDpJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwgZm9yIE1HTVQiKSk7CisgICAgdm9zU3RhdHVzID0gV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CisgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKKyAgICB7CisgICAgICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAiV0xBTiBUTDpXREFfRFNfU3RhcnRYbWl0IGZhaWxzLiB2b3NTdGF0dXMgJWQiLCB2b3NTdGF0dXMpKTsKKyAgICAgICB2b3NfYXRvbWljX3NldF9VMzIoICh2X1UzMl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsMCk7IAorICAgIH0KKyAgICByZXR1cm4gdm9zU3RhdHVzOworICAgIAorICB9CisgIGVsc2UKKyAgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBObyBlcnJvciBjb2RlIGlzIHNlbnQgYmVjYXVzZSBUTCB3aWxsIHJlc3VtZSB0eCBhdXRvbm9tb3VzbHkgaWYKKyAgICAgIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlIG9yIHR4IGdldHMgcmVzdW1lZAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBmb3IgTWdtdCBGcm0gYnV0IGNvbmRpdGlvbiBub3QgbWV0LiBSZXM6ICVkIiwKKyAgICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQpKTsKKyAgfQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1R4TWdtdEZybSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJTlRFUkFDVElPTiBXSVRIIEhBTAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfUmVzZXROb3RpZmljYXRpb24KKworICBERVNDUklQVElPTgorICAgIEhBTCBub3RpZmllcyBUTCB3aGVuIHRoZSBtb2R1bGUgaXMgYmVpbmcgcmVzZXQuCisgICAgQ3VycmVudGx5IG5vdCB1c2VkLgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9SZXNldE5vdGlmaWNhdGlvbgorKAorICB2X1BWT0lEX3QgICBwdm9zR0N0eAorKQoreworICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1Jlc2V0Tm90aWZpY2F0aW9uIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBXTEFOVExfQ2xlYW5DQihwVExDYiwgMSAvKmVtcHR5IGFsbCBxdWV1ZXMgYW5kIHBlbmRpbmcgcGFja2V0cyovKTsKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOVExfUmVzZXROb3RpZmljYXRpb24gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9TdXNwZW5kRGF0YVR4CisKKyAgREVTQ1JJUFRJT04KKyAgICBIQUwgY2FsbHMgdGhpcyBBUEkgd2hlbiBpdCB3aXNoZXMgdG8gc3VzcGVuZCB0cmFuc21pc3Npb24gZm9yIGEKKyAgICBwYXJ0aWN1bGFyIFNUQS4KKworICBERVBFTkRFTkNJRVMKKyAgICBUaGUgU1RBIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIG11c3QgYmUgZmlyc3QgcmVnaXN0ZXJlZCB3aXRoCisgICAgVEwgYnkgSERELgorCisgICAgUkVTVFJJQ1RJT046ICBJbiBjYXNlIG9mIGEgc3VzcGVuZCwgdGhlIGZsYWcgd3JpdGUgYW5kIHJlYWQgd2lsbCBub3QgYmUKKyAgICAgICAgICAgICAgICAgIGxvY2tlZDogd29yc3QgY2FzZSBzY2VuYXJpbyBvbmUgbW9yZSBwYWNrZXQgY2FuIGdldAorICAgICAgICAgICAgICAgICAgdGhyb3VnaCBiZWZvcmUgdGhlIGZsYWcgZ2V0cyB1cGRhdGVkICh3ZSBjYW4gbWFrZSB0aGlzCisgICAgICAgICAgICAgICAgICB3cml0ZSBhdG9taWMgYXMgd2VsbCB0byBndWFyYW50ZWUgY29uc2lzdGVuY3kpCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgcHVjU1RBSWQ6ICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGU7CisgICAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgTlVMTCBhc3N1bWVzIHN1c3BlbmQgb24gYWxsIGFjdGl2ZSBzdGF0aW9uCisgICAgcGZuU3VzcGVuZFR4Q0I6IHBvaW50ZXIgdG8gdGhlIHN1c3BlbmQgcmVzdWx0IG5vdGlmaWNhdGlvbiBpbiBjYXNlIHRoZQorICAgICAgICAgICAgICAgICAgICBjYWxsIGlzIGFzeW5jaHJvbm91cworCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworVk9TX1NUQVRVUworV0xBTlRMX1N1c3BlbmREYXRhVHgKKygKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICBwdm9zR0N0eCwKKyAgdl9VOF90KiAgICAgICAgICAgICAgICBwdWNTVEFJZCwKKyAgV0xBTlRMX1N1c3BlbmRDQlR5cGUgICBwZm5TdXNwZW5kVHgKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKKyAgdm9zX21zZ190ICAgICAgIHZvc01zZzsKKyAgdl9VOF90ICAgICAgICAgIHVjVHhTdXNwZW5kUmVxLCB1Y1R4U3VzcGVuZGVkOworICB2X1UzMl90ICAgICAgICAgU1RBSWQgPSAwOworCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgfHwgTlVMTCA9PSBwdWNTVEFJZCApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N1c3BlbmREYXRhVHgiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdGhlIHR5cGUgb2YgcmVxdWVzdDogZ2VuZXJpYyBzdXNwZW5kLCBvciBwZXIgc3RhdGlvbiBzdXNwZW5kCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBTdGF0aW9uIElEcyBmb3IgU3VzcGVuZCByZXF1ZXN0IGFyZSByZWNlaXZlZCBhcyBiaXRtYXAgICAgICAgICAgICAgICAgICAqLworICB1Y1R4U3VzcGVuZFJlcSA9ICpwdWNTVEFJZDsKKyAgdWNUeFN1c3BlbmRlZCA9IHBUTENiLT51Y1R4U3VzcGVuZGVkOworCisgIGlmIChXTEFOX0FMTF9TVEEgPT0gdWNUeFN1c3BlbmRlZCkKKyAgeworICAgIC8qIEFsbCBTdGF0aW9ucyBhcmUgaW4gU3VzcGVuZCBtb2RlLiBOb3RoaW5nIHRvIGRvICovCisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgIldMQU4gVEw6QWxsIHN0YXRpb25zIGFscmVhZHkgc3VzcGVuZGVkIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOworICB9CisKKyAgaWYgKFdMQU5fQUxMX1NUQSA9PSAqcHVjU1RBSWQpCisgIHsKKyAgICAvKiBHZW5lcmFsIFN1c3BlbmQgUmVxdWVzdCByZWNlaXZlZCAqLworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICJXTEFOIFRMOkdlbmVyYWwgc3VzcGVuZCByZXF1ZXN0ZWQiKSk7CisgICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgV0xBTl9BTExfU1RBKTsKKyAgICB2b3NNc2cucmVzZXJ2ZWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU3RhdGlvbiBzcGVjaWZpYyBTdXNwZW5kIFJlcXVlc3QgcmVjZWl2ZWQgKi8KKyAgICAvKiBVcGRhdGUgU3RhdGlvbiBJZCBCaXQgbWFwIGZvciBzdXNwZW5kIHJlcXVlc3QgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAvKiBJZiBCaXQgc2V0IGZvciB0aGlzIHN0YXRpb24gd2l0aCBTVEFJZCAqLworICAgICAgaWYgKHVjVHhTdXNwZW5kUmVxID4+IChTVEFJZCArMSkgKQorICAgICAgeworICAgICAgICAvKiBJZiBpdCBpcyBOb3QgYSB2YWxpZCBzdGF0aW9uIElEICovCisgICAgICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCBTVEFJZCApICkKKyAgICAgICAgeworICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfU3VzcGVuZERhdGFUeCIpKTsKKyAgICAgICAgICBTVEFJZCsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8qIElmIHRoaXMgc3RhdGlvbiBpcyBOb3QgcmVnaXN0ZXJlZCB3aXRoIFRMICovCisgICAgICAgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFJZF0udWNFeGlzdHMgKQorICAgICAgICB7CisgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9TdXNwZW5kRGF0YVR4IikpOworICAgICAgICAgIFNUQUlkKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIldMQU4gVEw6U3VzcGVuZCByZXF1ZXN0IGZvciBzdGF0aW9uOiAlZCIsIFNUQUlkKSk7CisgICAgICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBSWRdLnVjVHhTdXNwZW5kZWQsIDEpOworICAgICAgfQorICAgICAgU1RBSWQrKzsKKyAgICB9IHdoaWxlICggU1RBSWQgPCBXTEFOX01BWF9TVEFfQ09VTlQgKTsKKyAgICB2b3NNc2cucmVzZXJ2ZWQgPSAqcHVjU1RBSWQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlcmlhbGl6ZSByZXF1ZXN0IHRocm91Z2ggVFggdGhyZWFkCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfU0lHX1NVU1BFTkQ7CisgIHZvc01zZy5ib2R5cHRyICAgICA9ICh2X1BWT0lEX3QpcGZuU3VzcGVuZFR4OworCisgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX3R4X21xX3NlcmlhbGl6ZSggVk9TX01RX0lEX1RMLCAmdm9zTXNnKSkpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICIgJXMgZmFpbHMgdG8gcG9zdCBtZXNzYWdlIiwgX19GVU5DVElPTl9fKTsKKyAgfQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1N1c3BlbmREYXRhVHggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9SZXN1bWVEYXRhVHgKKworICBERVNDUklQVElPTgorICAgIENhbGxlZCBieSBIQUwgdG8gcmVzdW1lIGRhdGEgdHJhbnNtaXNzaW9uIGZvciBhIGdpdmVuIFNUQS4KKworICAgIFdBUk5JTkc6IElmIGEgc3RhdGlvbiB3YXMgaW5kaXZpZHVhbGx5IHN1c3BlbmRlZCBhIGdsb2JhbCByZXN1bWUgd2lsbAorICAgICAgICAgICAgIG5vdCByZXN1bWUgdGhhdCBzdGF0aW9uCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgcHVjU1RBSWQ6ICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gd2hpY2ggaXMgYmVpbmcgcmVzdW1lZDsgTlVMTAorICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVzIGludG8gZ2xvYmFsIHJlc3VtZQorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK1ZPU19TVEFUVVMKK1dMQU5UTF9SZXN1bWVEYXRhVHgKKygKKyAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCisgIHZfVThfdCogICAgICAgIHB1Y1NUQUlkCispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CisgIHZfVThfdCAgICAgICAgICB1Y1R4UmVzdW1lUmVxOworICB2X1UzMl90ICAgICAgICAgU1RBSWQgPSAwOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiIHx8IE5VTEwgPT0gcHVjU1RBSWQpCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZXN1bWVEYXRhVHgiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIHVjVHhSZXN1bWVSZXEgPSAqcHVjU1RBSWQ7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIHRoZSB0eXBlIG9mIHJlc3VtZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBXTEFOX0FMTF9TVEEgPT0gKnB1Y1NUQUlkKQorICB7CisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgIldMQU4gVEw6R2VuZXJhbCByZXN1bWUgcmVxdWVzdGVkIikpOworICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPnVjVHhTdXNwZW5kZWQsIDApOworCisgICAgLyogU2V0IHRvIFJlc3VtZSBmb3IgYWxsIHN0YXRpb25zICovCisgICAgZm9yIChTVEFJZCA9IDA7IFNUQUlkIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBTVEFJZCsrKQorICAgICAgICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFJZF0udWNUeFN1c3BlbmRlZCwgMCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgZG8KKyAgICB7CisgICAgICAvKiBJZiBCaXQgU2V0IGZvciB0aGlzIHN0YXRpb24gd2l0aCBTVEFJZCAqLworICAgICAgaWYgKHVjVHhSZXN1bWVSZXEgPj4gKFNUQUlkICsgMSkpCisgICAgICB7CisgICAgICAgIC8qIElmIGl0IGlzIE5vdCBhIHZhbGlkIHN0YXRpb24gSUQgKi8KKyAgICAgICAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIFNUQUlkICkpCisgICAgICAgIHsKKyAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfUmVzdW1lRGF0YVR4IikpOworICAgICAgICAgIFNUQUlkKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgdGhpcyBzdGF0aW9uIGlzIE5vdCByZWdpc3RlcmVkIHdpdGggVEwgKi8KKyAgICAgICAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW1NUQUlkXS51Y0V4aXN0cyApCisgICAgICAgIHsKKyAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1Jlc3VtZURhdGFUeCIpKTsKKyAgICAgICAgICBTVEFJZCsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOlJlc3VtZSByZXF1ZXN0IGZvciBzdGF0aW9uOiAlZCIsIFNUQUlkKSk7CisgICAgICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBSWRdLnVjVHhTdXNwZW5kZWQsIDApOworICAgICAgfQorICAgICAgU1RBSWQrKzsKKyAgICB9IHdoaWxlICggU1RBSWQgPCBXTEFOX01BWF9TVEFfQ09VTlQgKTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUmVzdW1pbmcgdHJhbnNtaXNzaW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19NRiApCisgIHsKKyAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIldMQU4gVEw6UmVzdW1pbmcgdHJhbnNtaXNzaW9uIikpOworICAgIHJldHVybiBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKKyAgfQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1Jlc3VtZURhdGFUeCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9TdXNwZW5kQ0IKKworICBERVNDUklQVElPTgorICAgIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBzZXJpYWxpemluZyBTdXNwZW5kIHNpZ25hbCB0aHJvdWdoIFR4IHRocmVhZAorCisgIERFUEVOREVOQ0lFUworICAgIEp1c3Qgbm90aWZ5IEhBTCB0aGF0IHN1c3BlbmQgaW4gVEwgaXMgY29tcGxldGUuCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICBwVXNlckRhdGE6ICAgICAgdXNlciBkYXRhIHNlbnQgd2l0aCB0aGUgY2FsbGJhY2sKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1N1c3BlbmRDQgorKAorICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCisgIFdMQU5UTF9TdXNwZW5kQ0JUeXBlICBwZm5TdXNwZW5kQ0IsCisgIHZfVTE2X3QgICAgICAgICAgICAgICB1c1Jlc2VydmVkCispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiAgID0gTlVMTDsKKyAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQgPSAodl9VOF90KXVzUmVzZXJ2ZWQ7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcGZuU3VzcGVuZENCICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vIENhbGwgYmFjayBwcm9jZXNzaW5nIHJlcXVlc3RlZCBXTEFOVExfU3VzcGVuZENCIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TdXNwZW5kQ0IiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQorICB7CisgICAgcGZuU3VzcGVuZENCKHB2b3NHQ3R4LCBOVUxMLCBWT1NfU1RBVFVTX1NVQ0NFU1MpOworICB9CisgIGVsc2UKKyAgeworICAgIHBmblN1c3BlbmRDQihwdm9zR0N0eCwgJnVjU1RBSWQsIFZPU19TVEFUVVNfU1VDQ0VTUyk7CisgIH0KKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qV0xBTlRMX1N1c3BlbmRDQiovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ0xJRU5UIElOREVQRU5ERU5UIElOVEVSRkFDRQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfR2V0VHhQa3RDb3VudAorCisgIERFU0NSSVBUSU9OCisgICAgVEwgd2lsbCBwcm92aWRlIHRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcGFja2V0cyBjb3VudGVkIHBlcgorICAgIFNUQSBwZXIgVElELgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uCisgICAgdWNUaWQ6ICAgICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHRzcGVjCisKKyAgICBPVVQKKyAgICBwdVR4UGt0Q291bnQ6ICAgdGhlIG51bWJlciBvZiBwYWNrZXRzIHR4IHBhY2tldCBmb3IgdGhpcyBTVEEgYW5kIFRJRAorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9HZXRUeFBrdENvdW50CisoCisgIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICB1Y1NUQUlkLAorICB2X1U4X3QgICAgICAgICB1Y1RpZCwKKyAgdl9VMzJfdCogICAgICAgcHVUeFBrdENvdW50CispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcHVUeFBrdENvdW50ICkKKyAgeworICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldFR4UGt0Q291bnQiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgfHwgV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkgKQorICB7CisgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgJWQvdGlkICVkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCIsCisgICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgaWYgc3RhdGlvbiBleGlzdHMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRUeFBrdENvdW50IikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNFeGlzdHMgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFR4UGt0Q291bnQgJWQiLAorICAgICB1Y1NUQUlkKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJldHVybiBkYXRhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvL1ZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELAorICAgIC8vICAgICAgICAgIldMQU4gVEw6UmVxdWVzdGVkIHR4IHBhY2tldCBjb3VudCBmb3IgU1RBOiAlZCwgVElEOiAlZCIsIAorICAgICAgLy8gICAgICAgICB1Y1NUQUlkLCB1Y1RpZCk7CisKKyAgKnB1VHhQa3RDb3VudCA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF1VHhDb3VudFt1Y1RpZF07CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOVExfR2V0VHhQa3RDb3VudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFJ4UGt0Q291bnQKKworICBERVNDUklQVElPTgorICAgIFRMIHdpbGwgcHJvdmlkZSB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgY291bnRlZCBwZXIKKyAgICBTVEEgcGVyIFRJRC4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbgorICAgIHVjVGlkOiAgICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSB0c3BlYworCisgICBPVVQKKyAgICBwdVR4UGt0Q291bnQ6ICAgdGhlIG51bWJlciBvZiBwYWNrZXRzIHJ4IHBhY2tldCBmb3IgdGhpcyBTVEEgYW5kIFRJRAorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9HZXRSeFBrdENvdW50CisoCisgIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICB1Y1NUQUlkLAorICB2X1U4X3QgICAgICAgICB1Y1RpZCwKKyAgdl9VMzJfdCogICAgICAgcHVSeFBrdENvdW50CispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcHVSeFBrdENvdW50ICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgfHwgV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCAlZC90aWQgJWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9HZXRSeFBrdENvdW50IiwKKyAgICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgZXhpc3RhbmNlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRSeFBrdENvdW50IikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNFeGlzdHMgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJldHVybiBkYXRhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBUTExPRzMoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCisgICAgICAgICAgICAiV0xBTiBUTDpSZXF1ZXN0ZWQgcnggcGFja2V0IGNvdW50IGZvciBTVEE6ICVkLCBUSUQ6ICVkIiwKKyAgICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOworCisgICpwdVJ4UGt0Q291bnQgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5hdVJ4Q291bnRbdWNUaWRdOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX0dldFJ4UGt0Q291bnQgKi8KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK1ZPU19TVEFUVVMKK1dMQU5UTF9UeEZDRnJhbWUKKygKKyAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CispOworI2VuZGlmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICBUTCBJTlRFUk5BTCBBUEkgREVGSU5JVElPTgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfR2V0RnJhbWVzCisKKyAgREVTQ1JJUFRJT04KKworICAgIEJBTCBjYWxscyB0aGlzIGZ1bmN0aW9uIGF0IHRoZSByZXF1ZXN0IG9mIHRoZSBsb3dlciBidXMgaW50ZXJmYWNlLgorICAgIFdoZW4gdGhpcyByZXF1ZXN0IGlzIGJlaW5nIHJlY2VpdmVkIFRMIHdpbGwgcmV0cmlldmUgcGFja2V0cyBmcm9tIEhERAorICAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgcHJpb3JpdHkgcnVsZXMgYW5kIHRoZSBjb3VudCBzdXBwbGllZCBieSBCQUwuCisKKyAgREVQRU5ERU5DSUVTCisKKyAgICBIREQgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgd2l0aCBUTCBhdCBsZWFzdCBvbmUgU1RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uCisgICAgY2FuIGJlIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICB1U2l6ZTogICAgICAgICAgbWF4aW11bSBzaXplIGFjY2VwdGVkIGJ5IHRoZSBsb3dlciBsYXllcgorICAgIHVGbG93TWFzayAgICAgICBUWCBmbG93IGNvbnRyb2wgbWFzayBmb3IgUHJpbWEuIEVhY2ggYml0IGlzIGRlZmluZWQgYXMgCisgICAgICAgICAgICAgICAgICAgIFdEQV9UWEZsb3dFbnVtVHlwZQorCisgICAgT1VUCisgICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnVmZmVyIHN1cHBsaWVkCisgICAgICAgICAgICAgICAgICAgIGJ5IFRMLCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhY2tldCBzdXBwbGllZCwgVEwKKyAgICAgICAgICAgICAgICAgICAgd2lsbCBjaGFpbiB0aGVtIHRocm91Z2ggdk9TUyBidWZmZXJzCisKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgMSBvciBtb3JlOiBudW1iZXIgb2YgcmVxdWlyZWQgcmVzb3VyY2VzIGlmIHRoZXJlIGFyZSBzdGlsbCBmcmFtZXMgdG8gZmV0Y2gKKyAgICAwIDogZXJyb3Igb3IgSEREIHF1ZXVlcyBhcmUgZHJhaW5lZAorCisgIFNJREUgRUZGRUNUUworCisgIE5PVEUKKyAgICAKKyAgICBGZWF0dXJpemVkIHVGbG93TWFzay4gSWYgd2Ugd2FudCB0byByZW1vdmUgZmVhdHVyaXphdGlvbiwgd2UgbmVlZCB0byBjaGFuZ2UKKyAgICBCQUwgb24gVm9sYW5zLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfVTMyX3QKK1dMQU5UTF9HZXRGcmFtZXMKKygKKyAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAorICB2b3NfcGt0X3QgICAgICoqcHBGcmFtZURhdGFCdWZmLAorICB2X1UzMl90ICAgICAgICAgdVNpemUsCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzaywKKyNlbmRpZgorICB2X0JPT0xfdCogICAgICAgcGJVcmdlbnQKKykKK3sKKyAgIHZvc19wa3RfdCoqICAgICAgICAgcHZvc0RhdGFCdWZmID0gKHZvc19wa3RfdCoqKXBwRnJhbWVEYXRhQnVmZjsKKyAgIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgPSBOVUxMOworICAgdl9VMzJfdCAgICAgICAgICAgICB1UmVtYWluaW5nID0gdVNpemU7CisgICB2b3NfcGt0X3QqICAgICAgICAgIHZvc1Jvb3Q7CisgICB2b3NfcGt0X3QqICAgICAgICAgIHZvc1RlbXBCdWY7CisgICBXTEFOVExfU1RBRnVuY1R5cGUgIHBmblNUQUZzbTsKKyAgIHZfVTE2X3QgICAgICAgICAgICAgdXNQa3RMZW47CisgICB2X1UzMl90ICAgICAgICAgICAgIHVSZXNMZW47CisgICB2X1U4X3QgICAgICAgICAgICAgIHVjU1RBSWQ7CisgICB2X1U4X3QgICAgICAgICAgICAgIHVjQUM7CisgICB2b3NfcGt0X3QqICAgICAgICAgIHZvc0RhdGFCdWZmOworICAgdl9VMzJfdCAgICAgICAgICAgICB1VG90YWxQa3RMZW47CisgICB2X1UzMl90ICAgICAgICAgICAgIGk9MDsKKyAgIHZfVTMyX3QgICAgICAgICAgICAgdWNSZXN1bHQgPSAwOworICAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CisgICBXTEFOVExfU1RBRXZlbnRUeXBlICAgd1NUQUV2ZW50OworICAgdEJzc1N5c3RlbVJvbGUgICAgICAgc3lzdGVtUm9sZTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWM7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHB2b3NEYXRhQnVmZiApKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOworICAgIHJldHVybiB1Y1Jlc3VsdDsKKyAgfQorCisgIHBNYWMgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9QRSwgcHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcE1hYyApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBNYWMiLCBfX0ZVTkNUSU9OX18pKTsKKyAgICByZXR1cm4gdWNSZXN1bHQ7CisgIH0KKworICB2b3NEYXRhQnVmZiA9IHBUTENiLT52b3NEdW1teUJ1ZjsgLyogSnVzdCB0byBhdm9pZCBjaGVja2luZyBmb3IgTlVMTCBhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGl0ZXJhdGlvbiAqLworCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgcFRMQ2ItPnVSZXNDb3VudCA9IHVTaXplOworI2VuZGlmCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhdmUgdGhlIHJvb3QgYXMgd2Ugd2lsbCB3YWxrIHRoaXMgY2hhaW4gYXMgd2UgZmlsbCBpdAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b3NSb290ID0gdm9zRGF0YUJ1ZmY7CisgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUaGVyZSBpcyBzdGlsbCBkYXRhIC0gdW50aWwgRlNNIGZ1bmN0aW9uIHNheXMgb3RoZXJ3aXNlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiLT5iVXJnZW50ICAgICAgPSBGQUxTRTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgd2hpbGUgKCggcFRMQ2ItPnRsQ29uZmlnSW5mby51TWluRnJhbWVzUHJvY1RocmVzIDwgcFRMQ2ItPnVSZXNDb3VudCApICYmCisgICAgICAgICAoIDAgPCB1UmVtYWluaW5nICkpCisjZWxzZQorICB3aGlsZSAoKCAwIDwgcFRMQ2ItPnVSZXNDb3VudCApICYmCisgICAgICAgICAoIDAgPCB1UmVtYWluaW5nICkpCisjZW5kaWYKKyAgeworICAgIHN5c3RlbVJvbGUgPSB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNpZmRlZiBXTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTgorLyogRklYTUU6IFRoZSBjb2RlIGhhcyBiZWVuIGRpc2FibGVkIHNpbmNlIGl0IGlzIGNyZWF0aW5nIGlzc3VlcyBpbiBwb3dlciBzYXZlICovCisgICAgaWYgKGVTWVNURU1fQVBfUk9MRSA9PSBzeXN0ZW1Sb2xlKQorICAgIHsKKyAgICAgICBpZiAocFRMQ2ItPmRvbmVfb25jZSA9PSAwICYmIE5VTEwgPT0gcFRMQ2ItPnZvc1R4RkNCdWYpCisgICAgICAgeworICAgICAgICAgIFdMQU5UTF9UeEZDRnJhbWUgKHB2b3NHQ3R4KTsKKyAgICAgICAgICBwVExDYi0+ZG9uZV9vbmNlICsrOworICAgICAgIH0KKyAgICB9IAorICAgIGlmICggTlVMTCAhPSBwVExDYi0+dm9zVHhGQ0J1ZiApCisgICAgeworICAgICAgIC8vdGhlcmUgaXMgZmxvdyBjb250cm9sIHBhY2tldCB3YWl0aW5nIHRvIGJlIHNlbnQKKyAgICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCBwVExDYi0+dm9zVHhGQ0J1ZiwgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CisgICAgCisgICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPiB1UmVzTGVuICkgJiYKKyAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorICAgICAgICAgICAmJiAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0ZDICkgKQorI2VuZGlmCisgICAgICAgICAgKQorICAgICAgIHsKKyAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIEZDIGZyYW1lIGZpcnN0IG9uIEdldEZyYW1lIikpOworCisgICAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLCBwVExDYi0+dm9zVHhGQ0J1ZiwgMSAvKnRydWUqLyApOworCisgICAgICAgICAgdm9zX2F0b21pY19zZXRfVTMyKCAodl9VMzJfdCopJnBUTENiLT52b3NUeEZDQnVmLCAodl9VMzJfdClOVUxMKTsKKworICAgICAgICAgIC8qRkMgZnJhbWVzIGNhbm5vdCBiZSBkZWxheWVkKi8KKyAgICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKKworICAgICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KKyAgICAgICAgICB1UmVtYWluaW5nICAgICAgICAtPSAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKKworICAgICAgICAgIC8qVXBkYXRlIHJlc291cmNlIGNvdW50ICovCisgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAtPSB1UmVzTGVuOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICJXTEFOIFRMOnNlbmQgZmMgb3V0IG9mIHNvdXJjZSAlcyIsIF9fRlVOQ1RJT05fXykpOworICAgICAgICAgIHVjUmVzdWx0ID0gKCBwVExDYi0+dVJlc0NvdW50ID4gdVJlc0xlbiApP1ZPU19UUlVFOlZPU19GQUxTRTsKKyAgICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KKyAgICAgICB9CisgICB9CisgICBlbHNlIAorI2VuZGlmIC8vV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KKyNlbmRpZiAvLyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisKKyAgICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKQorICAgIHsKKyAgICAgIFdEQV9UTElfUFJPQ0VTU19GUkFNRV9MRU4oIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKKworICAgICAgVk9TX0FTU0VSVCh1c1BrdExlbiA8PSBXTEFOVExfTUFYX0FMTE9XRURfTEVOKTsKKworICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPiB1UmVzTGVuICkgJiYKKyAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorICAgICAgICAgICAmJiAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX01HTVQgKSApCisjZW5kaWYKKyAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBtYW5hZ2VtZW50IGZyYW1lIG9uIEdldEZyYW1lIikpOworCisgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKnRydWUqLyApOworCisgICAgICAgIHZvc19hdG9taWNfc2V0X1UzMiggKHZfVTMyX3QqKSZwVExDYi0+dGxNZ210RnJtQ2xpZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1BlbmRpbmdEYXRhQnVmZiwgKHZfVTMyX3QpTlVMTCk7CisKKyAgICAgICAgLyptYW5hZ2VtZW50IGZyYW1lcyBjYW5ub3QgYmUgZGVsYXllZCovCisgICAgICAgIHBUTENiLT5iVXJnZW50ICAgICAgPSBUUlVFOworCisgICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KKyAgICAgICAgdVJlbWFpbmluZyAgICAgICAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CisKKyAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KKyAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAtPSB1UmVzTGVuOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB1Y1Jlc3VsdCA9ICggcFRMQ2ItPnVSZXNDb3VudCA+IHVSZXNMZW4gKT9WT1NfVFJVRTpWT1NfRkFMU0U7CisgICAgICAgIGJyZWFrOyAvKiBPdXQgb2YgcmVzb3VyY2VzIG9yIHJlYWNoZWQgbWF4IGxlbiAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKSAmJgorICAgICAgICAgICAgICggV0RBX1RMSV9NSU5fUkVTX0JBUCA8PSBwVExDYi0+dVJlc0NvdW50ICkgJiYKKyAgICAgICAgICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKQorI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgICAgICAgICAgICYmICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQkFQICkgKQorI2VuZGlmCisgICAgICAgICAgKQorICAgIHsKKyAgICAgIFdEQV9UTElfUFJPQ0VTU19GUkFNRV9MRU4oIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzUGt0TGVuLCB1UmVzTGVuLCB1VG90YWxQa3RMZW4pOworCisgICAgICBWT1NfQVNTRVJUKHVzUGt0TGVuIDw9IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4pOworCisgICAgICBpZiAoICggcFRMQ2ItPnVSZXNDb3VudCA+ICh1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX01GICkgKSAmJgorICAgICAgICAgICAoIHVSZW1haW5pbmcgPiB1VG90YWxQa3RMZW4gKSkKKyAgICAgIHsKKyAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBCVC1BTVAgZnJhbWUgb24gR2V0RnJhbWUiKSk7CisKKyAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyp0cnVlKi8gKTsKKworICAgICAgICAvKkJBUCBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLworICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKKworICAgICAgICB2b3NfYXRvbWljX3NldF9VMzIoICh2X1UzMl90KikmcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdClOVUxMKTsKKworICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCisgICAgICAgIHVSZW1haW5pbmcgICAgICAgIC09ICAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKKworICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLworICAgICAgICBwVExDYi0+dVJlc0NvdW50ICAtPSB1UmVzTGVuOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgICAgICAgIHVjUmVzdWx0ID0gdVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19NRjsKKyNlbHNlCisgICAgICAgIHVjUmVzdWx0ID0gKCBwVExDYi0+dVJlc0NvdW50ID4gKCB1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX01GICkgKT8KKyAgICAgICAgICAgICAgICAgICAgIFZPU19UUlVFOlZPU19GQUxTRTsKKyNlbmRpZgorICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKCBXREFfVExJX01JTl9SRVNfREFUQSA8PSBwVExDYi0+dVJlc0NvdW50ICkmJgorICAgICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgICAgICAgICAgJiYgKCggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfQksgKSApIHx8IAorICAgICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19CRSApICkgfHwKKyAgICAgICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfVkkgKSApIHx8IAorICAgICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19WTyApICkpCisjZW5kaWYKKyAgICAgICAgICApCisgICAgeworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbnkgcGFja2V0IGxlZnQgYmVoaW5kIHByZXZpb3VzbHkgZHVlIHRvCisgICAgICAgIHNpemUgY29uc3RyYWludHMKKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgdm9zVGVtcEJ1ZiA9IE5VTEw7CisKKyAgICAgIGlmICggTlVMTCAhPSBwVExDYi0+dm9zVGVtcEJ1ZiApIAorICAgICAgeworICAgICAgICB2b3NUZW1wQnVmICAgICAgICAgID0gcFRMQ2ItPnZvc1RlbXBCdWY7CisgICAgICAgIHBUTENiLT52b3NUZW1wQnVmICAgPSBOVUxMOworICAgICAgICB1Y1NUQUlkICAgICAgICAgICAgID0gcFRMQ2ItPnVjQ2FjaGVkU1RBSWQ7IAorICAgICAgICB1Y0FDICAgICAgICAgICAgICAgID0gcFRMQ2ItPnVjQ2FjaGVkQUM7CisgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTm9Nb3JlRGF0YSA9IDA7CisKKyAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBjYWNoZWQgZGF0YSBmcmFtZSBvbiBHZXRGcmFtZSIpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgV0xBTl9UTEdldE5leHRUeElkcyggcHZvc0dDdHgsICZ1Y1NUQUlkKTsKKyAgICAgICAgaWYgKHVjU1RBSWQgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKQorICAgICAgICB7CisgICAgICAgICAvKiBQYWNrZXRzIHN0YXJ0IGNvbWluZyBpbiBldmVuIGFmdGVyIGluc21vZCBXaXRob3V0ICoKKyAgICAgICAgICAgIHN0YXJ0aW5nIEhvc3RhcGQgb3IgSW50ZXJmYWNlIGJlaW5nIHVwICAgICAgICAgICAgKgorICAgICAgICAgICAgRHVyaW5nIHdoaWNoIGNhc2VzIFNUQUlEIGlzIGludmFsZWQgYW5kIGhlbmNlIAorICAgICAgICAgICAgdGhlIGNoZWNrLiBIYWxNc2dfU2NuYUNvbXBsZXRlIFRyaWdnZXJzICovCisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIHVjQ3VycmVudEFDIHNob3VsZCBoYXZlIGNvcnJlY3QgQUMgdG8gYmUgc2VydmVkIGJ5IGNhbGxpbmcKKyAgICAgICAgICAgV0xBTl9UTEdldE5leHRUeElkcyAqLworICAgICAgICB1Y0FDID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNDdXJyZW50QUM7CisKKyAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNOb01vcmVEYXRhID0gMTsKKyAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiAlcyBnZXQgb25lIGRhdGEgZnJhbWUsIHN0YXRpb24gSUQgJWQgIiwgX19GVU5DVElPTl9fLCB1Y1NUQUlkKSk7CisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBDaGVjayB0byBzZWUgdGhhdCBTVEEgaXMgdmFsaWQgYW5kIHR4IGlzIG5vdCBzdXNwZW5kZWQKKyAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBpZiAoICggISBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApICYmCisgICAgICAgICAgICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1R4U3VzcGVuZGVkICkgJiYKKyAgICAgICAgICAgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmZjU3RhVHhEaXNhYmxlZCkgKQorICAgICAgICB7CisgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiAlcyBzdGEgaWQgdmFsaWQgYW5kIG5vdCBzdXNwZW5kZWQgIixfX0ZVTkNUSU9OX18pKTsKKyAgICAgICAgICB3U1RBRXZlbnQgPSBXTEFOVExfVFhfRVZFTlQ7CisKKyAgICAgICAgICBwZm5TVEFGc20gPSB0bFNUQUZzbVtwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS50bFN0YXRlXS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBmblNUQVRibFt3U1RBRXZlbnRdOworCisgICAgICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCisgICAgICAgICAgeworICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNOb01vcmVEYXRhID0gMDsKKyAgICAgICAgICAgIHZvc1N0YXR1cyAgPSBwZm5TVEFGc20oIHB2b3NHQ3R4LCB1Y1NUQUlkLCAmdm9zVGVtcEJ1Zik7CisKKyAgICAgICAgICAgIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSAmJgorICAgICAgICAgICAgICAgICggTlVMTCAhPSB2b3NUZW1wQnVmICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnBmblNUQVR4Q29tcCggcHZvc0dDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NTdGF0dXMgKTsKKyAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiA9IE5VTEw7CisgICAgICAgICAgICB9Lyogc3RhdHVzIHN1Y2Nlc3MqLworICAgICAgICAgIH0vKk5VTEwgZnVuY3Rpb24gc3RhdGUqLworICAgICAgICB9LyogdmFsaWQgU1RBIGlkIGFuZCAhIHN1c3BlbmRlZCovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICBpZiAoICEgV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKSAKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJXTEFOIFRMOk5vdCBmZXRjaGluZyBmcmFtZSBiZWNhdXNlIHN1c3BlbmRlZCBmb3Igc3RhIElEICVkIiwgCisgICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0vKiBkYXRhICovCisKKyAgICAgIGlmICggTlVMTCAhPSB2b3NUZW1wQnVmICkKKyAgICAgIHsKKyAgICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggdm9zVGVtcEJ1ZiwgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CisKKyAgICAgICAgVk9TX0FTU0VSVCggdXNQa3RMZW4gPD0gV0xBTlRMX01BWF9BTExPV0VEX0xFTik7CisKKyAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgICAgIldMQU4gVEw6UmVzb3VyY2VzIG5lZWRlZCBieSBmcmFtZTogJWQiLCB1UmVzTGVuKSk7CisKKyAgICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPj0gKHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfQkFQICkgKSAmJgorICAgICAgICAgICAoIHVSZW1haW5pbmcgPiB1VG90YWxQa3RMZW4gKQorI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgICAgICAgICAgICYmICggdUZsb3dNYXNrICYgKCAxIDw8IHVjQUMgKSApCisjZW5kaWYKKyAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgZGF0YSBmcmFtZSBvbiBHZXRGcmFtZSIpKTsKKworICAgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwgdm9zVGVtcEJ1ZiwgMSAvKnRydWUqLyApOworICAgICAgICAgIHZvc1RlbXBCdWYgPSAgTlVMTDsKKworICAgICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KKyAgICAgICAgICB1UmVtYWluaW5nICAgICAgICAtPSAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKKworICAgICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLworICAgICAgICAgIHBUTENiLT51UmVzQ291bnQgIC09IHVSZXNMZW47CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgLy9mb3cgY29udHJvbCB1cGRhdGUKKyAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggKz0gdVJlc0xlbjsKKyAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51QnVmZlRocmVzaG9sZE1heCA9IChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51QnVmZlRocmVzaG9sZE1heCA+PSB1UmVzTGVuKSA/CisgICAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUJ1ZmZUaHJlc2hvbGRNYXggLSB1UmVzTGVuKSA6IDA7CisjZW5kaWYKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFN0b3JlIHRoaXMgZm9yIGxhdGVyIHR4IC0gYWxyZWFkeSBmZXRjaGVkIGZyb20gSEREICovCisgICAgICAgICAgcFRMQ2ItPnZvc1RlbXBCdWYgPSB2b3NUZW1wQnVmOworICAgICAgICAgIHBUTENiLT51Y0NhY2hlZFNUQUlkID0gdWNTVEFJZDsKKyAgICAgICAgICBwVExDYi0+dWNDYWNoZWRBQyAgICA9IHVjQUM7CisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgICAgICAgICB1Y1Jlc3VsdCA9IHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfQkFQOworICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAibWluICVkIHJlcyByZXF1aXJlZCBieSBUTC4iLCB1Y1Jlc3VsdCApKTsKKyNlbHNlCisgICAgICAgICAgdWNSZXN1bHQgPSAoIHBUTENiLT51UmVzQ291bnQgPj0gKHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfQkFQICkpPworICAgICAgICAgICAgICAgICAgICAgICBWT1NfVFJVRTpWT1NfRkFMU0U7CisjZW5kaWYKKyAgICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0udWNFeGlzdHMpICYmIAorICAgICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLnVjUGt0UGVuZGluZykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIGlzIHN0YXRpb24gdG8gYmUgU2VydmVkICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgICAgIGlmIChpID49IFdMQU5fTUFYX1NUQV9DT1VOVCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBObyBNb3JlIHRvIFNlcnZlIEV4aXQgR2V0IEZyYW1lcyAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogTW9yZSB0byBiZSBTZXJ2ZWQgKi8KKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiV0xBTiBUTDpSZXR1cm5pbmcgZnJvbSBHZXRGcmFtZTogcmVzb3VyY2VzID0gJWQgc3VzcGVuZGVkID0gJWQiLAorICAgICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50LCBwVExDYi0+dWNUeFN1c3BlbmRlZCkpOworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgICAgICAvKiBUTCBpcyBzdGFydmluZyBldmVuIHdoZW4gRFhFIGlzIG5vdCBpbiBsb3cgcmVzb3VyY2UgY29uZGl0aW9uIAorICAgICAgICAgUmV0dXJuIG1pbiByZXNvdXJjZSBudW1iZXIgcmVxdWlyZWQgYW5kIExldCBEWEUgZGVjZWlkZSB3aGF0IHRvIGRvICovCisgICAgICBpZigoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSAmJiAKKyAgICAgICAgICgoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX0JLICkgKSB8fCAKKyAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX0JFICkgKSB8fAorICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfVkkgKSApIHx8IAorICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfVk8gKSApKSkKKyAgICAgIHsKKyAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICJXTEFOIFRMOlJldHVybmluZyBmcm9tIEdldEZyYW1lOiByZXNvdXJjZXMgPSAlZCIsCisgICAgICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQpKTsKKyAgICAgICAgIHVjUmVzdWx0ID0gV0RBX1RMSV9NSU5fUkVTX0RBVEE7CisgICAgICB9CisjZW5kaWYKKyAgICAgICBicmVhazsgLypvdXQgb2YgbWluIGRhdGEgcmVzb3VyY2VzKi8KKyAgICB9CisKKyAgICBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50Kys7CisgICAgLyogTW92ZSBkYXRhIGJ1ZmZlciB1cCBvbmUgcGFja2V0ICovCisgICAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsICZ2b3NEYXRhQnVmZiwgMC8qZmFsc2UqLyApOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGFja2V0IGNoYWluIHN0YXJ0cyBhdCByb290ICsgMQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc1Jvb3QsICZ2b3NEYXRhQnVmZiwgMS8qdHJ1ZSovICk7CisKKyAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOworICBWT1NfQVNTRVJUKCBwYlVyZ2VudCApOworICAqcGJVcmdlbnQgICAgID0gcFRMQ2ItPmJVcmdlbnQ7CisgIHJldHVybiB1Y1Jlc3VsdDsKK30vKiBXTEFOVExfR2V0RnJhbWVzICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9UeENvbXAKKworICBERVNDUklQVElPTgorICAgIEl0IGlzIGJlaW5nIGNhbGxlZCBieSBCQUwgdXBvbiBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uIG9mIHRoZSBwYWNrZXQKKyAgICBvciBwYWNrZXRzICBiZWluZyBzZW50IG92ZXIgdGhlIGJ1cy4KKworICBERVBFTkRFTkNJRVMKKyAgICBUeCBjb21wbGV0ZSBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgYSBwcmV2aW91cyB0cmFuc21pdC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBidWZmZXIgZm9yIHdoaWNoCisgICAgICAgICAgICAgICAgICAgIHRoZSBCQUwgcmVwb3J0IGlzIGJlaW5nIG1hZGUsIGlmIHRoZXJlIGlzIG1vcmUgdGhlbiBvbmUKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0IHRoZXkgd2lsbCBiZSBjaGFpbmVkIHVzaW5nIHZPU1MgYnVmZmVycy4KKyAgICB3VHhTdGF0dXM6ICAgICAgdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0LCBzZWUgYWJvdmUgY2hhcHRlcgorICAgICAgICAgICAgICAgICAgICBvbiBIREQgaW50ZXJhY3Rpb24gZm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfVHhDb21wCisoCisgIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKKyAgdm9zX3BrdF90ICAgICAgKnBGcmFtZURhdGFCdWZmLAorICBWT1NfU1RBVFVTICAgICAgd1R4U3RhdHVzCispCit7CisgIHZvc19wa3RfdCogICAgICAgICAgIHZvc0RhdGFCdWZmID0gKHZvc19wa3RfdCopcEZyYW1lRGF0YUJ1ZmY7CisgIFdMQU5UTF9DYlR5cGUqICAgICAgIHBUTENiICAgICA9IE5VTEw7CisgIFdMQU5UTF9UeENvbXBDQlR5cGUgIHBmblR4Q29tcCA9IE5VTEw7CisgIFZPU19TVEFUVVMgICAgICAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNpZiAhZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgdm9zX21zZ190ICAgICAgICAgICAgdm9zTXNnOworI2VuZGlmCisgIHZvc19wa3RfdCogICAgICAgICAgIHZvc1RlbXBUeCA9IE5VTEw7CisKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggTlVMTCA9PSB2b3NEYXRhQnVmZiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpFeHRyYW5lb3VzIE5VTEwgZGF0YSBwb2ludGVyIG9uIFdMQU5UTF9UeENvbXAiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9UeENvbXAiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIHdoaWxlICgoMCA8IHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQpICYmCisgICAgICAgICAoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMgKSAmJgorICAgICAgICAgKCBOVUxMICE9ICB2b3NEYXRhQnVmZikpCisgIHsKKyAgICB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCAgdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnBmblR4Q29tcCk7CisKKyAgICAvKml0IHNob3VsZCBuZXZlciBiZSBOVUxMIC0gZGVmYXVsdCBoYW5kbGVyIHNob3VsZCBiZSByZWdpc3RlcmVkIGlmIG5vbmUqLworICAgIGlmICggTlVMTCA9PSBwZm5UeENvbXAgKQorICAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiV0xBTiBUTDpOVUxMIHBvaW50ZXIgdG8gVHggQ29tcGxldGUgb24gV0xBTlRMX1R4Q29tcCIpKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpDYWxsaW5nIFR4IGNvbXBsZXRlIGZvciBwa3QgJXggaW4gZnVuY3Rpb24gJXgiLAorICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsIHBmblR4Q29tcCkpOworCisgICAgdm9zVGVtcFR4ID0gdm9zRGF0YUJ1ZmY7CisgICAgdm9zU3RhdHVzID0gdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8pOworCisgICAgcGZuVHhDb21wKCBwdm9zR0N0eCwgdm9zVGVtcFR4LCB3VHhTdGF0dXMgKTsKKworICAgIHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQtLTsKKyAgfQorCisjaWYgIWRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApIAorICBpZiAoKCAwID09IHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQgKSAmJgorICAgICAgKCBwVExDYi0+dVJlc0NvdW50IDw9IFdEQV9UTElfQkRfUERVX1JFU0VSVkVfVEhSRVNIT0xEICkpCisgIHsKKyAgICB2b3NNc2cucmVzZXJ2ZWQgPSAwOworICAgIHZvc01zZy5ib2R5cHRyICA9IE5VTEw7CisgICAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX1JFU19ORUVERUQ7CisgICAgdm9zX3R4X21xX3NlcmlhbGl6ZSggVk9TX01RX0lEX1RMLCAmdm9zTXNnKTsKKyAgfQorI2VuZGlmCisgCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAiV0xBTiBUTDogY3VycmVudCBUTCB2YWx1ZXMgYXJlOiByZXNvdXJjZXMgPSAlZCAiCisgICAgICAgICAgICAicFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCA9ICVkIiwKKyAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCwgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCkpOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1R4Q29tcCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0NhY2hlU1RBRnJhbWUKKworICBERVNDUklQVElPTgorICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGZvciBjYWNoaW5nIGluY29taW5nIGRhdGEgZnJhbWVzIHRoYXQgZG8gCisgICAgbm90IGhhdmUgYSByZWdpc3RlcmVkIHN0YXRpb24geWV0LiAKKworICBERVBFTkRFTkNJRVMKKyAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KKyAgICBJbiBvcmRlciB0byBiZW5lZml0IGZyb20gdGhzaSBjYWNoaW5nLCB0aGUgY29tcG9uZW50cyBtdXN0IGVuc3VyZSB0aGF0CisgICAgdGhleSB3aWxsIG9ubHkgcmVnaXN0ZXIgd2l0aCBUTCBhdCB0aGUgbW9tZW50IHdoZW4gdGhleSBhcmUgZnVsbHkgc2V0dXAKKyAgICBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBpbmNvbWluZyBkYXRhIAorICAgCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgCisgICAgcFRMQ2I6ICAgICAgICAgICAgICAgICAgVEwgY29udHJvbCBibG9jaworICAgIHVjU1RBSWQ6ICAgICAgICAgICAgICAgIHN0YXRpb24gaWQKKyAgICB2b3NUZW1wQnVmZjogICAgICAgICAgICB0aGUgZGF0YSBwYWNrZXQKKyAgICB1RFBVU2lnOiAgICAgICAgICAgICAgICBEUFUgc2lnbmF0dXJlIG9mIHRoZSBpbmNvbWluZyBwYWNrZXQKKyAgICBiQmNhc3Q6ICAgICAgICAgICAgICAgICB0cnVlIGlmIHBhY2tldCBoYWQgdGhlIE1DL0JDIGJpdCBzZXQgCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgb3IgU1RBIElkIGludmFsaWQgOyBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBWT1NfU1RBVFVTCitXTEFOVExfQ2FjaGVTVEFGcmFtZQorKAorICBXTEFOVExfQ2JUeXBlKiAgICBwVExDYiwKKyAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZCwKKyAgdm9zX3BrdF90KiAgICAgICAgdm9zVGVtcEJ1ZmYsCisgIHZfVTMyX3QgICAgICAgICAgIHVEUFVTaWcsCisgIHZfVThfdCAgICAgICAgICAgIGJCY2FzdCwKKyAgdl9VOF90ICAgICAgICAgICAgdWNGcm1UeXBlCispCit7CisgIHZfVThfdCAgICB1Y1VjYXN0U2lnOworICB2X1U4X3QgICAgdWNCY2FzdFNpZzsKKyAgdl9CT09MX3QgIGJPbGRTVEFQa3Q7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHZvc1RlbXBCdWZmICkgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6IEludmFsaWQgaW5wdXQgcG9pbnRlciBvbiBXTEFOVExfQ2FjaGVTVEFGcmFtZSBUTCAleCIKKyAgICAgICAgICAgICAgICIgUGFja2V0ICV4IiwgcFRMQ2IsIHZvc1RlbXBCdWZmICkpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NhY2hlU1RBRnJhbWUiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6QXR0ZW1wdGluZyB0byBjYWNoZSBwa3QgZm9yIFNUQSAlZCwgQkQgRFBVIFNpZzogJWQgd2l0aCBzaWcgVUM6ICVkLCBCQzogJWQiLCAKKyAgICAgICAgICAgICB1Y1NUQUlkLCB1RFBVU2lnLAorICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLnVjVWNhc3RTaWcsCisgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNCY2FzdFNpZykpOworCisgIGlmKFdMQU5UTF9JU19DVFJMX0ZSQU1FKHVjRnJtVHlwZSkpCisgIHsKKyAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyBuZWVkIHRvIGNhY2hlIENUUkwgZnJhbWUuIERyb3BwaW5nIikpOworICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhlIHBhY2tldCB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gY2FjaGUgYmVsb25ncyB0byB0aGUgb2xkCisgICAgcmVnaXN0ZXJlZCBzdGF0aW9uIChpZiBhbnkpIG9yIHRoZSBuZXcgKHBvdGVudGlhbGx5KXVwY29taW5nIHN0YXRpb24KKyAgICAKKyAgICAtIElmIHRoZSBTVEEgd2l0aCB0aGlzIElkIHdhcyBuZXZlciByZWdpc3RlcmVkIHdpdGggVEwgLSB0aGUgc2lnbmF0dXJlCisgICAgd2lsbCBiZSBpbnZhbGlkOworICAgIC0gSWYgdGhlIFNUQSB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkIFRMIHdpbGwgaGF2ZSBjYWNoZWQgdGhlIGZvcm1lcgorICAgIHNldCBvZiBEUFUgc2lnbmF0dXJlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBiQmNhc3QgKQorICB7CisgICAgdWNCY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKKyAgICBiT2xkU1RBUGt0ID0gKCggV0xBTl9UTF9JTlZBTElEX0JfU0lHICE9IAorICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNCY2FzdFNpZyApICYmCisgICAgICAoIHVjQmNhc3RTaWcgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNCY2FzdFNpZyApKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB1Y1VjYXN0U2lnID0gKHZfVThfdCl1RFBVU2lnOworICAgIGJPbGRTVEFQa3QgPSAoKCBXTEFOX1RMX0lOVkFMSURfVV9TSUcgIT0gCisgICAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLnVjVWNhc3RTaWcgKSAmJgorICAgICAgICAoIHVjVWNhc3RTaWcgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNVY2FzdFNpZyApKTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSWYgdGhlIHZhbHVlIG9mIHRoZSBEUFUgU0lHIG1hdGNoZXMgdGhlIG9sZCwgdGhpcyBwYWNrZXQgd2lsbCBub3QKKyAgICBiZSBjYWNoZWQgYXMgaXQgYmVsb25nZWQgdG8gdGhlIGZvcm1lciBhc3NvY2lhdGlvbgorICAgIEluIGNhc2UgdGhlIFNJRyBkb2VzIG5vdCBtYXRjaCAtIHRoaXMgaXMgYSBwYWNrZXQgZm9yIGEgcG90ZW50aWFsbHkgbmV3CisgICAgYXNzb2NpYXRlZCBzdGF0aW9uIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBiT2xkU1RBUGt0ICkKKyAgeworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpEYXRhIHBhY2tldCBtYXRjaGVzIG9sZCBzaWcgZm9yIHNpZyBEUFU6ICVkIFVDOiAlZCwgIgorICAgICAgICAgICAgICAgIkJDOiAlZCAtIGRyb3BwaW5nIiwgCisgICAgICAgICAgICAgICB1RFBVU2lnLCAKKyAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLnVjVWNhc3RTaWcsIAorICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNCY2FzdFNpZykpOworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAorICB9CisgIGVsc2UKKyAgeworICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS52b3NCZWdDYWNoZWRGcmFtZSApIAorICAgIHsKKyAgICAgIC8qdGhpcyBpcyB0aGUgZmlyc3QgZnJhbWUgdGhhdCB3ZSBhcmUgY2FjaGluZyAqLworICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udm9zQmVnQ2FjaGVkRnJhbWUgPSB2b3NUZW1wQnVmZjsgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qdGhpcyBpcyBhIHN1YnNlcXVlbnQgZnJhbWUgdGhhdCB3ZSBhcmUgY2FjaGluZzogY2hhaW4gdG8gdGhlIGVuZCAqLworICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udm9zRW5kQ2FjaGVkRnJhbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYsIFZPU19UUlVFKTsKKyAgICB9CisgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udm9zRW5kQ2FjaGVkRnJhbWUgPSB2b3NUZW1wQnVmZjsgCisgIH0vKmVsc2UgbmV3IHBhY2tldCovCisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsgCit9LypXTEFOVExfQ2FjaGVTVEFGcmFtZSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfRmx1c2hDYWNoZWRGcmFtZXMKKworICBERVNDUklQVElPTgorICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBUTCB0byBmbHVzaCB0aGUgc3RhdGlvbiBjYWNoZQorCisgIERFUEVOREVOQ0lFUworICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgorICAgIAorICBQQVJBTUVURVJTCisKKyAgICBJTgorCisgICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2FjaGVkIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkLAorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKyAgTk9URQorICAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZS1pbml0aWFsaXplIHZvc0RhdGFCdWZmIHRvIE5VTEwuIEl0J3MgY2FsbGVyJ3MgCisgICAgcmVzcG9uc2liaWxpdHkgdG8gZG8gc28sIGlmIHJlcXVpcmVkLCBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwuCisgICAgQmVjYXVzZSBvZiB0aGlzIHJlc3RyaWN0aW9uLCB3ZSBkZWNpZGUgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIHRvIHN0YXRpYworICAgIHNvIHRoYXQgdXBwZXIgbGF5ZXIgZG9lc24ndCBuZWVkIHRvIGJlIGF3YXJlIG9mIHRoaXMgcmVzdHJpY3Rpb24uIAorICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgVk9TX1NUQVRVUworV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzCisoCisgIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZgorKQoreworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSZXR1cm4gdGhlIGVudGlyZSBjaGFpbiB0byB2b3MgaWYgdGhlcmUgYXJlIGluZGVlZCBjYWNoZSBmcmFtZXMgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgIT0gdm9zRGF0YUJ1ZmYgKQorICB7CisgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKKyAgfQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7ICAKK30vKldMQU5UTF9GbHVzaENhY2hlZEZyYW1lcyovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcworCisgIERFU0NSSVBUSU9OCisgICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZWl0aGVyIGZvcndhcmRpbmcgY2FjaGVkIGRhdGEgdG8gdGhlIHN0YXRpb24gYWZ0ZXIKKyAgICB0aGUgc3RhdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkLCBvciBmbHVzaGluZyBjYWNoZWQgZGF0YSBpZiB0aGUgc3RhdGlvbiBoYXMgbm90IAorICAgIGJlZW4gcmVnaXN0ZXJlZC4gCisgICAgIAorCisgIERFUEVOREVOQ0lFUworICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgorICAgCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgCisgICAgcFRMQ2I6ICAgICAgICAgICAgICAgICAgVEwgY29udHJvbCBibG9jaworICAgIHVjU1RBSWQ6ICAgICAgICAgICAgICAgIHN0YXRpb24gaWQKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisgICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlLWluaXRpYWxpemUgdm9zRGF0YUJ1ZmYgdG8gTlVMTC4gSXQncyBjYWxsZXIncyAKKyAgICByZXNwb25zaWJpbGl0eSB0byBkbyBzbywgaWYgcmVxdWlyZWQsIGFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbC4KKyAgICBCZWNhdXNlIG9mIHRoaXMgcmVzdHJpY3Rpb24sIHdlIGRlY2lkZSB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdG8gc3RhdGljCisgICAgc28gdGhhdCB1cHBlciBsYXllciBkb2Vzbid0IG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhpcyByZXN0cmljdGlvbi4gCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIFZPU19TVEFUVVMKK1dMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzCisoCisgIHZvaWQqICAgICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkLAorICB2X1U4X3QgICAgICAgICAgICB1Y1VjYXN0U2lnLAorICB2X1U4X3QgICAgICAgICAgICB1Y0JjYXN0U2lnCispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiV0xBTiBUTDogSW52YWxpZCBpbnB1dCBwb2ludGVyIG9uIFdMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzIFRMICV4IiwKKyAgICAgICAgIHBUTENiICkpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8vV0xBTl9UTF9MT0NLX1NUQV9DQUNIRShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSk7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIENoZWNrIGlmIHN0YXRpb24gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIG1lYW4gd2hpbGUKKyAgICAgaWYgbm90IHJlZ2lzdGVyZWQsIGZsdXNoIGNhY2hlZCBmcmFtZXMuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjRXhpc3RzICkKKyAgeworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgIldMQU4gVEw6U3RhdGlvbiBoYXMgYmVlbiBkZWxldGVkIGZvciBTVEEgJWQgLSBmbHVzaGluZyBjYWNoZSIsIHVjU1RBSWQpKTsKKyAgICBXTEFOVExfRmx1c2hDYWNoZWRGcmFtZXMocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udm9zQmVnQ2FjaGVkRnJhbWUpOworICAgIGdvdG8gZG9uZTsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZvcndhcmRpbmcgY2FjaGUgZnJhbWVzIHJlY2VpdmVkIHdoaWxlIHRoZSBzdGF0aW9uIHdhcyBpbiB0aGUgcHJvY2VzcyAgIAorICAgIG9mIGJlaW5nIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgU1cgY29tcG9uZW50cyAgIAorCisgICAgQWNjZXNzIHRvIHRoZSBjYWNoZSBtdXN0IGJlIGxvY2tlZDsgc2ltaWxhcmx5IHVwZGF0aW5nIHRoZSBzaWduYXR1cmUgYW5kICAgCisgICAgdGhlIGV4aXN0ZW5jZSBmbGFnIG11c3QgYmUgc3luY2hyb25pemVkIGJlY2F1c2UgdGhlc2UgdmFsdWVzIGFyZSBjaGVja2VkICAgCisgICAgZHVyaW5nIGNhY2hlZCAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgIldMQU4gVEw6UHJlcGFyaW5nIHRvIGZ3ZCBwYWNrZXRzIGZvciBTVEEgJWQiLCB1Y1NUQUlkKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhdmUgdGhlIG5ldyBzaWduYXR1cmUgdmFsdWVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLnVjVWNhc3RTaWcgID0gdWNVY2FzdFNpZzsKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNCY2FzdFNpZyAgPSB1Y0JjYXN0U2lnOworCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgIldMQU4gVEw6RndkLWluZyBwYWNrZXRzIGZvciBTVEEgJWQgVUMgJWQgQkMgJWQiLAorICAgICAgIHVjU1RBSWQsIHVjVWNhc3RTaWcsIHVjQmNhc3RTaWcpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorICAgICBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgY2FjaGVkIGRhdGEgdG8gZm9yd2FyZCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKyAgaWYgKCBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnZvc0JlZ0NhY2hlZEZyYW1lICkgCisgIHsKKyAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIldMQU4gVEw6IEZ3ZC1pbmcgQ2FjaGVkIHBhY2tldHMgZm9yIHN0YXRpb24gJWQiLCB1Y1NUQUlkICkpOworCisgICAgV0xBTlRMX1J4Q2FjaGVkRnJhbWVzKCBwVExDYiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnZvc0JlZ0NhY2hlZEZyYW1lKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOiBOTyBjYWNoZWQgcGFja2V0cyBmb3Igc3RhdGlvbiAlZCIsIHVjU1RBSWQgKSk7CisgIH0KKworZG9uZToKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgIENsZWFyIHRoZSBzdGF0aW9uIGNhY2hlIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnZvc0JlZ0NhY2hlZEZyYW1lID0gTlVMTDsgICAKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udm9zRW5kQ2FjaGVkRnJhbWUgPSBOVUxMOyAKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBZnRlciBhbGwgdGhlIGluaXQgaXMgY29tcGxldGUgd2UgY2FuIG1hcmsgdGhlIGV4aXN0YW5jZSBmbGFnIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1J4QmxvY2tlZCA9IDA7CisKKyAgLy9XTEFOX1RMX1VOTE9DS19TVEFfQ0FDSEUocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0pOyAKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsgCisKK30vKldMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzKi8KKworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9Jc0lBUFBGcmFtZQorCisgIERFU0NSSVBUSU9OCisgICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZGV0ZWN0aW5nIGluY29taW5nIENDWCBJQVBQIGZyYW1lcworCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgCisgICAgcHZCREhlYWRlcjogICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCisgICAgdm9zVGVtcEJ1ZmY6ICAgICAgICAgICAgdGhlIGRhdGEgcGFja2V0CisKKyAgICBJTi9PVVQKKyAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0YXRpb24KKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19UUlVFOiAgIEl0IGlzIGEgSUFQUCBmcmFtZQorICAgIFZPU19GQUxTRTogIEl0IGlzIE5PVCBJQVBQIGZyYW1lCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9CT09MX3QKK1dMQU5UTF9Jc0lBUFBGcmFtZQorKAorICB2X1BWT0lEX3QgICAgICAgICBwdkJESGVhZGVyLAorICB2b3NfcGt0X3QqICAgICAgICB2b3NUZW1wQnVmZgorKQoreworICB2X1UxNl90ICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CisgIHZfVThfdCAgICAgICAgICAgICAgdWNPZmZzZXQ7CisgIHZfVThfdCAgICAgICAgICAgICAgdWNTbmFwSGRyW1dMQU5UTF9MTENfU05BUF9TSVpFXTsKKyAgdl9TSVpFX3QgICAgICAgICAgICB1c1NuYXBIZHJTaXplID0gV0xBTlRMX0xMQ19TTkFQX1NJWkU7CisgIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOworCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgT1VJIGZpZWxkIGlzIHByZXNlbnQuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIFZPU19GQUxTRSA9PSBXREFfSVNfUlhfTExDX1BSRVNFTlQocHZCREhlYWRlcikgKQorICB7CisgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkxMQyBoZWFkZXIgcmVtb3ZlZCwgY2Fubm90IGRldGVybWluZSBCVC1BTVAgdHlwZSAtIgorICAgICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKKyAgICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOworICAgICAgcmV0dXJuIFZPU19UUlVFOworICB9CisgIHVzTVBEVURPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChwdkJESGVhZGVyKTsKKyAgdWNPZmZzZXQgICAgICA9ICh2X1U4X3QpdXNNUERVRE9mZnNldCArIFdMQU5UTF9MTENfU05BUF9PRkZTRVQ7CisKKyAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc1RlbXBCdWZmLCB1Y09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1Y1NuYXBIZHIsICZ1c1NuYXBIZHJTaXplKTsKKworICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKSkgCisgIHsKKyAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGV4dHJhY3QgU25hcCBIZHIgb2YgZGF0YSAgcGFja2V0IC0iCisgICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKKyAgICByZXR1cm4gVk9TX0ZBTFNFOworICB9CisKKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIGlmIHRoaXMgaXMgSUFQUCBmcmFtZSBieSBtYXRjaGluZyBBaXJvbmV0IFNuYXAgaGRyLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLy8gQ29tcGFyZSByZXR1cm5zIDEgaWYgdmFsdWVzIGFyZSBzYW1lIGFuZCAwCisgIC8vIGlmIG5vdCB0aGUgc2FtZS4KKyAgaWYgKCggV0xBTlRMX0xMQ19TTkFQX1NJWkUgIT0gdXNTbmFwSGRyU2l6ZSApIHx8CisgICAgICggMCA9PSB2b3NfbWVtX2NvbXBhcmUodWNTbmFwSGRyLCAodl9QVk9JRF90KVdMQU5UTF9BSVJPTkVUX1NOQVBfSEVBREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9MTENfU05BUF9TSVpFICkgKSkKKyAgeworICAgIHJldHVybiBWT1NfRkFMU0U7CisgIH0KKworICByZXR1cm4gVk9TX1RSVUU7CisKK30KKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9DQ1gKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9Qcm9jZXNzQkFQRnJhbWUKKworICBERVNDUklQVElPTgorICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHByb2Nlc3NpbmcgaW5jb21pbmcgQlQtQU1QIGZyYW1lcworCisgIERFUEVOREVOQ0lFUworICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgorICAgIEJvdGhlIHRoZSBCVC1BTVAgc3RhdGlvbiBhbmQgdGhlIEJBUCBDdHJsIHBhdGggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSAKKyAgICByZWdpc3RlcmVkIHdpdGggVEwuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICAKKyAgICBwdkJESGVhZGVyOiAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBCRCBoZWFkZXIKKyAgICB2b3NUZW1wQnVmZjogICAgICAgICAgICB0aGUgZGF0YSBwYWNrZXQKKyAgICBwVExDYjogICAgICAgICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCisgICAgdWNTVEFJZDogICAgICAgICAgICAgICAgc3RhdGlvbiBpZAorCisgICAgSU4vT1VUCisgICAgcEZpcnN0RGF0YVBrdEFycml2ZWQ6ICAgc3RhdGljIGZyb20gY2FsbGVyIGZ1bmN0aW9uOyB1c2VkIGZvciByc3NpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGF0aW9uCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfQk9PTF90CitXTEFOVExfUHJvY2Vzc0JBUEZyYW1lCisoCisgIHZfUFZPSURfdCAgICAgICAgIHB2QkRIZWFkZXIsCisgIHZvc19wa3RfdCogICAgICAgIHZvc1RlbXBCdWZmLAorICBXTEFOVExfQ2JUeXBlKiAgICBwVExDYiwKKyAgdl9VOF90KiAgICAgICAgICAgcEZpcnN0RGF0YVBrdEFycml2ZWQsCisgIHZfVThfdCAgICAgICAgICAgIHVjU1RBSWQKKykKK3sKKyAgdl9VMTZfdCAgICAgICAgICAgICB1c01QRFVET2Zmc2V0OworICB2X1U4X3QgICAgICAgICAgICAgIHVjT2Zmc2V0OworICB2X1U4X3QgICAgICAgICAgICAgIHVjT1VJW1dMQU5UTF9MTENfT1VJX1NJWkVdOworICB2X1NJWkVfdCAgICAgICAgICAgIHVzT1VJU2l6ZSA9IFdMQU5UTF9MTENfT1VJX1NJWkU7CisgIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOworICB2X1UxNl90ICAgICAgICAgICAgIHVzVHlwZTsKKyAgdl9TSVpFX3QgICAgICAgICAgICB1c1R5cGVMZW4gPSBzaXplb2YodXNUeXBlKTsKKyAgdl9VOF90ICAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0OworICB2X1U4X3QgICAgICAgICAgICAgIHVjTVBEVUhMZW4gPSAwOworICB2X1UxNl90ICAgICAgICAgICAgIHVzQWN0dWFsSExlbiA9IDA7CisKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IE9VSSBhbmQgdHlwZSBmcm9tIExMQyBhbmQgdmFsaWRhdGU7IGlmIG5vbi1kYXRhIHNlbmQgdG8gQkFQCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIFZPU19GQUxTRSA9PSBXREFfSVNfUlhfTExDX1BSRVNFTlQocHZCREhlYWRlcikgKQorICB7CisgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgIldMQU4gVEw6TExDIGhlYWRlciByZW1vdmVkLCBjYW5ub3QgZGV0ZXJtaW5lIEJULUFNUCB0eXBlIC0iCisgICAgICAgICAgICAgICJkcm9wcGluZyBwa3QiKSk7CisgICAgLyogRHJvcCBwYWNrZXQgKi8KKyAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOworICAgIHJldHVybiBWT1NfVFJVRTsgCisgIH0KKworICB1c01QRFVET2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfREFUQV9PRkZTRVQocHZCREhlYWRlcik7CisgIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKHB2QkRIZWFkZXIpOworICB1Y01QRFVITGVuICAgID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX0xFTihwdkJESGVhZGVyKTsKKyAgdWNPZmZzZXQgICAgICA9ICh2X1U4X3QpdXNNUERVRE9mZnNldCArIFdMQU5UTF9MTENfT1VJX09GRlNFVDsKKworICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zVGVtcEJ1ZmYsIHVjT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXVjT1VJLCAmdXNPVUlTaXplKTsKKworI2lmIDAKKyAgLy8gQ29tcGFyZSByZXR1cm5zIDEgaWYgdmFsdWVzIGFyZSBzYW1lIGFuZCAwCisgIC8vIGlmIG5vdCB0aGUgc2FtZS4KKyAgaWYgKCggV0xBTlRMX0xMQ19PVUlfU0laRSAhPSB1c09VSVNpemUgKSB8fAorICAgICAoIDAgPT0gdm9zX21lbV9jb21wYXJlKHVjT1VJLCAodl9QVk9JRF90KVdMQU5UTF9CVF9BTVBfT1VJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9MTENfT1VJX1NJWkUgKSApKQorICB7CisgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIkxMQyBoZWFkZXIgcG9pbnRzIHRvIGRpZmYgT1VJIGluIEJULUFNUCBzdGF0aW9uIC0iCisgICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKKyAgICAvKiBEcm9wIHBhY2tldCAqLworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CisgICAgcmV0dXJuIFZPU19UUlVFOworICB9CisjZW5kaWYKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IExMQyBPVUkgYW5kIGVuc3VyZSB0aGF0IHRoaXMgaXMgaW5kZWVkIGEgQlQtQU1QIGZyYW1lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zVGVtcEJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y09mZnNldCArIFdMQU5UTF9MTENfT1VJX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnVzVHlwZSwgJnVzVHlwZUxlbik7CisKKyAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgfHwKKyAgICAgICggc2l6ZW9mKHVzVHlwZSkgIT0gdXNUeXBlTGVuICkpCisgIHsKKyAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGV4dHJhY3QgdHlwZSBvbiBpbmNvbWluZyBCQVAgcGFja2V0IC0iCisgICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKKyAgICAvKiBEcm9wIHBhY2tldCAqLworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CisgICAgcmV0dXJuIFZPU19UUlVFOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiB0aGlzIGlzIEJULUFNUCBkYXRhIG9yIGN0cmwgcGFja2V0KFJTTiwgTGlua1N2aXNpb24sIEFjdGl2aXR5UikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVzVHlwZSA9IHZvc19iZTE2X3RvX2NwdSh1c1R5cGUpOworCisgIGlmIChXTEFOVExfQkFQX0lTX05PTl9EQVRBX1BLVF9UWVBFKHVzVHlwZSkpCisgIHsKKyAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgIldMQU4gVEw6Tm9uLWRhdGEgcGFja2V0IHJlY2VpdmVkIG92ZXIgQlQtQU1QIGxpbms6ICVkLCA9PiBCQVAiLAorICAgICAgICAgICAgICAgdXNUeXBlKSk7CisKKyAgICAvKkZsYXR0ZW4gcGFja2V0IGFzIEJBUCBleHBlY3RzIHRvIGJlIGFibGUgdG8gcGVlayovCisgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX3BrdF9mbGF0dGVuX3J4X3BrdCgmdm9zVGVtcEJ1ZmYpKQorICAgIHsKKyAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZmxhdHRlbiBCVC1BTVAgcGFja2V0IC0gZHJvcHBpbmciKSk7CisgICAgICAvKiBEcm9wIHBhY2tldCAqLworICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKKyAgICAgIHJldHVybiBWT1NfVFJVRTsKKyAgICB9CisKKyAgICAvKiBTZW5kIHBhY2tldCB0byBCQVAgY2xpZW50Ki8KKworICAgIFZPU19BU1NFUlQocFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUnggIT0gTlVMTCk7CisKKyAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfVHJpbVJ4UGFja2V0SW5mbyggdm9zVGVtcEJ1ZmYgKSApCisgICAgeworICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBjb3JydXB0ZWQgLSBkcm9wcGluZyBwYWNrZXQiKSk7CisgICAgICAvKiBEcm9wIHBhY2tldCAqLworICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKKyAgICAgIHJldHVybiBWT1NfVFJVRTsKKyAgICB9CisKKyAgICBpZiAoIDAgPT0gV0RBX0dFVF9SWF9GVF9ET05FKHB2QkRIZWFkZXIpICkKKyAgICB7CisgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICJOb24tZGF0YSBwYWNrZXQgcmVjZWl2ZWQgb3ZlciBCVC1BTVAgbGluazogU2VuZGluZyBpdCBmb3IgIgorICAgICAgICAgICJmcmFtZSBUcmFuc2xhdGlvbiIpKTsKKworICAgICAgaWYgKHVzTVBEVURPZmZzZXQgPiB1Y01QRFVIT2Zmc2V0KQorICAgICAgeworICAgICAgICB1c0FjdHVhbEhMZW4gPSB1c01QRFVET2Zmc2V0IC0gdWNNUERVSE9mZnNldDsKKyAgICAgIH0KKworICAgICAgLyogc29mdHdhcmUgZnJhbWUgdHJhbnNsYXRpb24gZm9yIEJUQU1QIFdEUy4qLworICAgICAgV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyKCB2b3NUZW1wQnVmZiwgJnZvc1N0YXR1cywgdXNBY3R1YWxITGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYix1Y1NUQUlkICk7CisgICAgICAKKyAgICB9CisgICAgaWYgKHBUTENiLT50bEJBUENsaWVudC5wZm5UbEJBUFJ4KQorICAgICAgICBwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCggdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5UTF9CQVBGcmFtZUVudW1UeXBlKXVzVHlwZSApOworCisgICAgcmV0dXJuIFZPU19UUlVFOworICB9CisgIGVsc2UKKyAgeworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAiV0xBTiBUTDogQkFQIERBVEEgcGFja2V0IHJlY2VpdmVkIG92ZXIgQlQtQU1QIGxpbms6ICVkLCA9PiBCQVAiLAorICAgICAgICAgICAgICAgdXNUeXBlKSk7CisgICAvKiEhIUZJWCBNRSEhKi8KKyAjaWYgMAorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRm9yIGRhdGEgcGFja2V0IGNvbGxlY3QgcGh5IHN0YXRzIFJTU0kgYW5kIExpbmsgUXVhbGl0eQorICAgICBDYWxjdWxhdGUgdGhlIFJTU0kgYXZlcmFnZSBhbmQgc2F2ZSBpdC4gQ29udGludW91cyBhdmVyYWdlIGlzIGRvbmUuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggKnBGaXJzdERhdGFQa3RBcnJpdmVkID09IDApCisgICAgeworICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucnNzaUF2ZyA9CisgICAgICAgICBXTEFOSEFMX0dFVF9SU1NJX0FWRVJBR0UoIHB2QkRIZWFkZXIgKTsKKyAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMaW5rUXVhbGl0eUF2ZyA9IAorICAgICAgICBXTEFOSEFMX1JYX0JEX0dFVF9TTlIoIHB2QkRIZWFkZXIgKTsKKworICAgICAgLy8gUmN2ZCAxc3QgcGt0LCBzdGFydCBhdmVyYWdlIGZyb20gbmV4dCB0aW1lCisgICAgICAqcEZpcnN0RGF0YVBrdEFycml2ZWQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucnNzaUF2ZyA9CisgICAgICAgICAgKFdMQU5IQUxfR0VUX1JTU0lfQVZFUkFHRSggcHZCREhlYWRlciApICsgCisgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnJzc2lBdmcpLzI7CisgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51TGlua1F1YWxpdHlBdmcgPQorICAgICAgICAgIChXTEFOSEFMX1JYX0JEX0dFVF9TTlIoIHB2QkRIZWFkZXIgKSArICAKKyAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUxpbmtRdWFsaXR5QXZnKS8yOworICAgIH0vKkVsc2UsIGZpcnN0IGRhdGEgcGFja2V0Ki8KKyAjZW5kaWYKKyAgfS8qQlQtQU1QIGRhdGEgcGFja2V0Ki8KKworICByZXR1cm4gVk9TX0ZBTFNFOyAKK30vKldMQU5UTF9Qcm9jZXNzQkFQRnJhbWUqLworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1Byb2Nlc3NGQ0ZyYW1lCisKKyAgREVTQ1JJUFRJT04KKyAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIGluY29taW5nIEZsb3cgQ29udHJvbCBmcmFtZXMuIEVuYWJsZQorICAgIG9yIGRpc2FibGUgTFdNIG1vZGUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uLgorCisgIERFUEVOREVOQ0lFUworICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgorICAgIEZXIHNlbmRzIHVwIHNwZWNpYWwgZmxvdyBjb250cm9sIGZyYW1lLgorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHggICAgICAgICAgICAgICAgcG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQKKyAgICBwdkJESGVhZGVyOiAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBCRCBoZWFkZXIKKyAgICBwVExDYjogICAgICAgICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCisgICAgcHZCREhlYWRlciAgICAgICAgICAgICAgcG9pbnRlciB0byBCRCBoZWFkZXIuCisKKyAgICBJTi9PVVQKKyAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0YXRpb24KKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBmcmFtZSBhcmUgaW52YWxpZAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworICAgIFRoZSBpbmdyZXNzIGFuZCBlZ3Jlc3Mgb2YgZWFjaCBzdGF0aW9uIHdpbGwgYmUgdXBkYXRlZC4gSWYgbmVlZGVkLCBMV00gbW9kZSB3aWxsCisgICAgYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBiYXNlZCBvbiB0aGUgZmxvdyBjb250cm9sIGFsZ29yaXRobS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X0JPT0xfdAorV0xBTlRMX1Byb2Nlc3NGQ0ZyYW1lCisoCisgIHZfUFZPSURfdCAgICAgICAgIHB2b3NHQ3R4LAorICB2b3NfcGt0X3QqICAgICAgICBwdm9zRGF0YUJ1ZmYsCisgIHZfUFZPSURfdCAgICAgICAgIHB2QkRIZWFkZXIKKykKK3sKKyNpZiAxIC8vZW5hYmxlIHByb2Nlc3Npbmcgb2Ygb25seSBmY1N0YVR4RGlzYWJsZWQgYml0bWFwIGZvciBub3cuIHRoZSBlbHNlIHBhcnQgaXMgb2xkIGJldHRlciBxb3MgY29kZS4KKyAgICAgIC8vIG5lZWQgdG8gcmV2aXNpdCB0aGUgb2xkIGNvZGUgZm9yIGZ1bGwgaW1wbGVtZW50YXRpb24uCisgIHZfVThfdCAgICAgICAgICAgICAgIHVjVHhTdXNwZW5kZWQgPSAwLCB1Y1R4U3VzcGVuZFJlcSA9IDAsIHVjVHhSZXN1bWVSZXEgPSAwOworICBXTEFOVExfQ2JUeXBlKiAgICAgICBwVExDYiA9IE5VTEw7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N1c3BlbmREYXRhVHgiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qIEV4aXN0aW5nIFN0YXRpb25zIHdpdGggVHggc3VzcGVuZGVkICovCisgIHVjVHhTdXNwZW5kZWQgPSBwVExDYi0+dWNUeFN1c3BlbmRlZDsKKworICAvKiBTdXNwZW5kIFJlcXVlc3QgUmVjZWl2ZWQgKi8KKyAgdWNUeFN1c3BlbmRSZXEgPSAodl9VOF90KSBXREFfR0VUX1JYX0ZDX1NUQV9UWF9ESVNBQkxFRF9CSVRNQVAocHZCREhlYWRlcik7CisgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJXTEFOVExfUHJvY2Vzc0ZDRnJhbWUgY2FsbGVkIGZvciBTdGF0aW9uczo6IEN1cnJlbnQ6ICV4IFJlcXVlc3RlZDogJXggIiwgdWNUeFN1c3BlbmRlZCwgdWNUeFN1c3BlbmRSZXEpKTsKKworICB1Y1R4UmVzdW1lUmVxID0gdWNUeFN1c3BlbmRSZXEgXiAoIHVjVHhTdXNwZW5kZWQgfCB1Y1R4U3VzcGVuZFJlcSApOworICB1Y1R4U3VzcGVuZFJlcSA9IHVjVHhTdXNwZW5kUmVxIF4gKCB1Y1R4U3VzcGVuZGVkICYgdWNUeFN1c3BlbmRSZXEgKTsKKyAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIlN0YXRpb24gU3VzcGVuZCByZXF1ZXN0IHByb2Nlc3NlZCA6OiBTdXNwZW5kOiAleCA6UmVzdW1lOiAleCAiLCB1Y1R4U3VzcGVuZFJlcSwgdWNUeFJlc3VtZVJlcSkpOworCisgIGlmICggMCAhPSB1Y1R4U3VzcGVuZFJlcSApCisgIHsKKyAgICBXTEFOVExfU3VzcGVuZERhdGFUeChwdm9zR0N0eCwgJnVjVHhTdXNwZW5kUmVxLCBOVUxMKTsKKyAgfQorICBpZiAoIDAgIT0gdWNUeFJlc3VtZVJlcSApCisgIHsKKyAgICBXTEFOVExfUmVzdW1lRGF0YVR4KHB2b3NHQ3R4LCAmdWNUeFJlc3VtZVJlcSk7CisgIH0KKworI2Vsc2UKKyAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CisgIHRwSGFsRmNSeEJkICAgICAgICAgcHZGY1J4QmQgPSBOVUxMOworICB2X1U4X3QgICAgICAgICAgICAgIHVjQml0Q2hlY2sgPSAweDE7CisgIHZfVThfdCAgICAgICAgICAgICAgdWNTdGFWYWxpZCA9IDA7CisgIHZfVThfdCAgICAgICAgICAgICAgdWNTVEFJZCA9IDA7CisKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBGQyBSZXNwb25zZSIpOworICBpZiAoIChOVUxMID09IHBUTENiKSB8fCAoTlVMTCA9PSBwdm9zRGF0YUJ1ZmYpKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBvaW50ZXIgaW4gJXMgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCBwdm9zRGF0YUJ1ZmYsIDAsICh2X1BWT0lEX3QpJnB2RmNSeEJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodEhhbEZjUnhCZCkpOworCisgIGlmICggKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpIHx8IChOVUxMID09IHB2RmNSeEJkKSApCisgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldMQU4gVEw6d3JvbmcgRkMgUnggcGFja2V0IikpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorICAKKyAgLy8gbmVlZCB0byBzd2FwIGJ5dGVzIGluIHRoZSBGQyBjb250ZW50cy4gIAorICBXTEFOSEFMX1N3YXBGY1J4QmQoJnB2RmNSeEJkLT5mY1NUQVR4UUxlblswXSk7CisKKyAgLy9sb2dpYyB0byBlbmFibGUvZGlzYWJsZSBMV00gbW9kZSBmb3IgZWFjaCBzdGF0aW9uCisgIGZvciggdWNTdGFWYWxpZCA9ICh2X1U4X3QpcHZGY1J4QmQtPmZjU1RBVmFsaWRNYXNrOyB1Y1N0YVZhbGlkOyB1Y1N0YVZhbGlkID4+PSAxLCB1Y0JpdENoZWNrIDw8PSAxLCB1Y1NUQUlkICsrKQorICB7CisgICAgaWYgKCAoMCA9PSAodWNTdGFWYWxpZCAmIDB4MSkpIHx8ICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjRXhpc3RzKSApCisgICAgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCBwdkZjUnhCZC0+ZmNTVEFUaHJlc2hJbmRNYXNrICYgdWNCaXRDaGVjayApCisgICAgeworICAgICAgLy9MV00gZXZlbnQgaXMgcmVwb3J0ZWQgYnkgRlcuIEFibGUgdG8gZmV0Y2ggbW9yZSBwYWNrZXQKKyAgICAgIGlmKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkICkKKyAgICAgIHsKKyAgICAgICAgLy9Ob3cgbWVtb3J5IHVzYWdlIGlzIGJlbG93IExXTS4gU3RhdGlvbiBjYW4gc2VuZCBtb3JlIHBhY2tldHMuCisgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtRXZlbnRSZXBvcnRlZCA9IFRSVUU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZXIHJlcG9ydCBMV00gZXZlbnQgYnV0IHRoZSBzdGF0aW9uICVkIGlzIG5vdCBpbiBMV00gbW9kZSBcbiIsIHVjU1RBSWQpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvL2NhbGN1bGF0ZSB1RWdyZXNzX2xlbmd0aC91SW5ncmVzc19sZW5ndGggb25seSBhZnRlciByZWNlaXZpbmcgZW5vdWdoIHBhY2tldHMKKyAgICBpZiAoV0xBTlRMX0xXTV9JTkdSRVNTX1NBTVBMRV9USFJFU0hPTEQgPD0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoKQorICAgIHsKKyAgICAgIC8vY2hlY2sgbWVtb3J5IHVzYWdlIGluZm8gdG8gc2VlIHdoZXRoZXIgTFdNIG1vZGUgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoZSBzdGF0aW9uCisgICAgICB2X1UzMl90IHVFZ3Jlc3NfbGVuZ3RoID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoICsgCisgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkIC0gcHZGY1J4QmQtPmZjU1RBVHhRTGVuW3VjU1RBSWRdOworCisgICAgICAvL2lmICgoZmxvYXQpdUVncmVzc19sZW5ndGgvKGZsb2F0KXBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCAKKyAgICAgIC8vICAgICAgPD0gV0xBTlRMX0xXTV9FR1JFU1NfSU5HUkVTU19USFJFU0hPTEQpCisgICAgICBpZiAoIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggPiB1RWdyZXNzX2xlbmd0aCkgJiYKKyAgICAgICAgICAgKChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggLSB1RWdyZXNzX2xlbmd0aCApID49IAorICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCA+PiAyKSkKKyAgICAgICAgICkKKyAgICAgIHsgICAKKyAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkVuYWJsZSBMV00gbW9kZSBmb3Igc3RhdGlvbiAlZFxuIiwgdWNTVEFJZCkpOworICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCA9IFRSVUU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkICkKKyAgICAgICAgeworICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkRpc2FibGUgTFdNIG1vZGUgZm9yIHN0YXRpb24gJWRcbiIsIHVjU1RBSWQpKTsKKyAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgfQorCisgICAgICAvL3JlbWVtYmVyIG1lbW9yeSB1c2FnZSBpbiBGVyBzdGFydGluZyBmcm9tIHRoaXMgcm91bmQKKyAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkID0gcHZGY1J4QmQtPmZjU1RBVHhRTGVuW3VjU1RBSWRdOworICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoID0gMDsKKyAgICB9IC8vKFdMQU5UTF9MV01fSU5HUkVTU19TQU1QTEVfVEhSRVNIT0xEIDw9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCkKKworICAgIGlmKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkICkKKyAgICB7CisgICAgICAvL2Fsd2F5cyB1cGRhdGUgY3VycmVudCBtYXhpbXVtIGFsbG93ZWQgbWVtZW9yeSB1c2FnZQorICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUJ1ZmZUaHJlc2hvbGRNYXggPSAgV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWCAtCisgICAgICAgIHB2RmNSeEJkLT5mY1NUQVR4UUxlblt1Y1NUQUlkXTsKKyAgICB9CisKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfUnhGcmFtZXMKKworICBERVNDUklQVElPTgorICAgIENhbGxiYWNrIHJlZ2lzdGVyZWQgYnkgVEwgYW5kIGNhbGxlZCBieSBCQUwgd2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZAorICAgIG92ZXIgdGhlIGJ1cy4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIGZ1bmN0aW9uIFRMIHdpbGwgbWFrZSB0aGUgbmVjZXNzYXJ5CisgICAgZGVjaXNpb24gd2l0aCByZWdhcmRzIHRvIHRoZSBmb3J3YXJkaW5nIG9yIHF1ZXVpbmcgb2YgdGhpcyBwYWNrZXQgYW5kCisgICAgdGhlIGxheWVyIGl0IG5lZWRzIHRvIGJlIGRlbGl2ZXJlZCB0by4KKworICBERVBFTkRFTkNJRVMKKyAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KKyAgICBJZiB0aGUgZnJhbWUgY2FycmllZCBpcyBhIGRhdGEgZnJhbWUgdGhlbiB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggaXQgaXMKKyAgICBkZXN0aW5lZCB0byBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBUTC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKworICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlciByZWNlaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZSBwYWNrZXQgdGhleSB3aWxsIGJlIGNoYWluZWQKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgdk9TUyBidWZmZXJzLgorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9SeEZyYW1lcworKAorICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKKyAgdm9zX3BrdF90ICAgICAqcEZyYW1lRGF0YUJ1ZmYKKykKK3sKKyAgdm9zX3BrdF90KiAgICAgICAgICB2b3NEYXRhQnVmZiA9ICh2b3NfcGt0X3QqKXBGcmFtZURhdGFCdWZmOworICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiID0gTlVMTDsKKyAgV0xBTlRMX1NUQUZ1bmNUeXBlICBwZm5TVEFGc207CisgIHZvc19wa3RfdCogICAgICAgICAgdm9zVGVtcEJ1ZmY7CisgIHZfVThfdCAgICAgICAgICAgICAgdWNTVEFJZDsKKyAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CisgIHZfVThfdCAgICAgICAgICAgICAgdWNGcm1UeXBlOworICB2X1BWT0lEX3QgICAgICAgICAgIHB2QkRIZWFkZXIgPSBOVUxMOworICBXTEFOVExfU1RBRXZlbnRUeXBlIHdTVEFFdmVudCAgPSBXTEFOVExfUlhfRVZFTlQ7CisgIHZfVThfdCAgICAgICAgICAgICAgdWNUaWQgICAgICA9IDA7CisgIHZfQk9PTF90ICAgICAgICAgICAgYnJvYWRjYXN0ICA9IFZPU19GQUxTRTsKKyAgdl9CT09MX3QgICAgICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsKKyAgc3RhdGljIHZfVThfdCAgICAgICBmaXJzdF9kYXRhX3BrdF9hcnJpdmVkID0gMDsKKyAgdl9VMzJfdCAgICAgICAgICAgICB1RFBVU2lnOyAKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgIHZfVTE2X3QgICAgICAgICAgICAgdXNQa3RMZW47CisjZW5kaWYKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiV0xBTiBUTDpUTCBSZWNlaXZlIEZyYW1lcyBjYWxsZWQiKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUnhGcmFtZXMiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2F2ZSB0aGUgaW5pdGlhbCBidWZmZXIgLSB0aGlzIGlzIHRoZSBmaXJzdCByZWNlaXZlZCBidWZmZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CisKKyAgd2hpbGUgKCBOVUxMICE9IHZvc1RlbXBCdWZmICkKKyAgeworICAgIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc0RhdGFCdWZmLCAmdm9zRGF0YUJ1ZmYsIDEvKnRydWUqLyApOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFBlZWsgYXQgQkQgaGVhZGVyIC0gZG8gbm90IHJlbW92ZQorICAgICAgISEhIE9wdGltaXplIG1lOiBvbmx5IHBhcnQgb2YgaGVhZGVyIGlzIG5lZWRlZDsgbm90IGVudGlyZSBvbmUKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICB2b3NTdGF0dXMgPSBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zVGVtcEJ1ZmYsICh2X1BWT0lEX3QpJnB2QkRIZWFkZXIsIDEvKlN3YXAgQkQqLyApOworCisgICAgaWYgKCBOVUxMID09IHB2QkRIZWFkZXIgKQorICAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGV4dHJhY3QgQkQgaGVhZGVyIikpOworICAgICAgLyogRHJvcCBwYWNrZXQgKi8KKyAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CisgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOworICAgICAgY29udGludWU7CisgICAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBDaGVjayBpZiBGQyBmcmFtZSByZXBvcnRlZCBmcm9tIEZXCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZihXREFfSVNfUlhfRkMocHZCREhlYWRlcikpCisgICAgeworICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgIldMQU4gVEw6cmVjZWl2ZSBvbmUgRkMgZnJhbWUiKSk7CisKKyAgICAgIFdMQU5UTF9Qcm9jZXNzRkNGcmFtZShwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYsIHB2QkRIZWFkZXIpOworICAgICAgLyogRHJvcCBwYWNrZXQgKi8KKyAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CisgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOworICAgICAgY29udGludWU7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBBTVNEVSBIVyBidWcgZml4CisgICAgICogQWZ0ZXIgMm5kIEFNU0RVIHN1YmZyYW1lIEhXIGNvdWxkIG5vdCBoYW5kbGUgQkQgY29ycmVjdGx5CisgICAgICogSEFMIHdvcmthcm91bmQgaXMgbmVlZGVkICovCisgICAgaWYoV0RBX0dFVF9SWF9BU0YocHZCREhlYWRlcikpCisgICAgeworICAgICAgV0RBX0RTX1J4QW1zZHVCZEZpeChwdm9zR0N0eCwgcHZCREhlYWRlcik7CisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIEV4dHJhY3QgZnJhbWUgY29udHJvbCBmaWVsZCBmcm9tIDgwMi4xMSBoZWFkZXIgaWYgcHJlc2VudCAKKyAgICAgIChmcmFtZSB0cmFuc2xhdGlvbiBub3QgZG9uZSkgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIHZvc1N0YXR1cyA9IFdEQV9EU19HZXRGcmFtZVR5cGVTdWJUeXBlKCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlciwgJnVjRnJtVHlwZSApOworICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEZyYW1lIENvbnRyb2wgRmllbGQiKSk7CisgICAgICAvKiBEcm9wIHBhY2tldCAqLworICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKKyAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NUZW1wQnVmZiwgJnVzUGt0TGVuKTsKKyNlbmRpZgorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIENoZWNrIGlmIG1hbmFnZW1lbnQgYW5kIHNlbmQgdG8gUEUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYgKCBXTEFOVExfSVNfTUdNVF9GUkFNRSh1Y0ZybVR5cGUpICkKKyAgICB7CisgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTZW5kaW5nIHBhY2tldCB0byBtYW5hZ2VtZW50IGNsaWVudCIpKTsKKyAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19wa3RfZmxhdHRlbl9yeF9wa3QoJnZvc1RlbXBCdWZmKSkKKyAgICAgIHsKKyAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBmbGF0dGVuIHBhY2tldCAtIGRyb3BwaW5nIikpOworICAgICAgICAvKiBEcm9wIHBhY2tldCAqLworICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOworICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVjU1RBSWQgPSAodl9VOF90KVdEQV9HRVRfUlhfU1RBSUQoIHB2QkRIZWFkZXIgKTsKKyAgICAgIC8qIFJlYWQgUlNTSSBhbmQgdXBkYXRlICovCisgICAgICBpZighV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjU1RBSWQpKQorICAgICAgeworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgICAgICAgLyogUmVhZCBSU1NJIGFuZCB1cGRhdGUgKi8KKyAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0hTSGFuZGxlUlhGcmFtZShwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUdNVF9GUkFNRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisjZWxzZQorICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVhZFJTU0kocHZvc0dDdHgsIHB2QkRIZWFkZXIsIHVjU1RBSWQpOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgVExMT0dXKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAiSGFuZGxlIFJYIE1hbmFnZW1lbnQgRnJhbWUgZmFpbCB3aXRoaW4gSGFuZG9mZiBzdXBwb3J0IG1vZHVsZSIpKTsKKyAgICAgICAgLyogRG8gTm90IERyb3AgcGFja2V0IGF0IGhlcmUgCisgICAgICAgICAqIFJldmlzaXQgd2h5IEhPIG1vZHVsZSByZXR1cm4gZmFpbAorICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOworICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOworICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICovCisgICAgICB9CisgICAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4KCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYpOyAKKyAgICB9CisgICAgZWxzZSAvKiBEYXRhIEZyYW1lICovCisgICAgeworICAgICAgdWNTVEFJZCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9TVEFJRCggcHZCREhlYWRlciApOworICAgICAgdWNUaWQgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoIHB2QkRIZWFkZXIgKTsKKworICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgIldMQU4gVEw6RGF0YSBwYWNrZXQgcmVjZWl2ZWQgZm9yIFNUQSAlZCIsIHVjU1RBSWQpKTsKKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkIHdoZW4gbXVsdGlwZSBzdGEgc3VwcG9ydCBpcyBhZGRlZCAhISEKKyAgICAgICAgZm9yIG5vdyBiY2FzdCBmcmFtZXMgd2lsbCBiZSBzZW50IHRvIHRoZSBsYXN0IHJlZ2lzdGVyZWQgU1RBCisgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIGlmICggV0RBX0lTX1JYX0JDQVNUKHB2QkRIZWFkZXIpKQorICAgICAgeworICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAiV0xBTiBUTDpUTCByeCBCY2FzdCBmcmFtZSAtIHNlbmRpbmcgdG8gbGFzdCByZWdpc3RlcmVkIHN0YXRpb24iKSk7CisgICAgICAgIGJyb2FkY2FzdCA9IFZPU19UUlVFOworICAgICAgICAKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgSWYgQWRkcjEgaXMgYi9tY2FzdCwgYnV0IEFkZHIzIGlzIG91ciBvd24gc2VsZiBNQUMsIGl0IGlzIGEgYi9tY2FzdAorICAgICAgICAgIHBrdCB3ZSBzZW50ICBsb29waW5nIGJhY2sgdG8gdXMuIFRvIGJlIGRyb3BwZWQgaWYgd2UgYXJlIG5vbiBCVEFNUCAgCisgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisgICAgICAgIGlmKCBXTEFOSEFMX1JYX0JEX0FERFIzX1NFTEZfSURYID09IAorICAgICAgICAgICAgKHZfVThfdClXREFfR0VUX1JYX0FERFIzX0lEWCggcHZCREhlYWRlciApKSAKKyAgICAgICAgeworICAgICAgICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX1RSVUU7IAorICAgICAgICB9CisgICAgICB9LyppZiBiY2FzdCovCisKKyAgICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjU1RBSWQpICkKKyAgICAgIHsKKyAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6U1RBIElEIGludmFsaWQgLSBkcm9wcGluZyBwa3QiKSk7CisgICAgICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CisgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTm8gbmVlZCB0byBsb2NrIGNhY2hlIGFjY2VzcyBiZWNhdXNlIGNhY2hlIG1hbmlwdWxhdGlvbiBvbmx5IGhhcHBlbnMKKyAgICAgICAgaW4gdGhlIHRyYW5zcG9ydCB0aHJlYWQvdGFzayBjb250ZXh0CisgICAgICAgIC0gVGhlc2UgZnJhbWVzIGFyZSB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIHN0YXRpb24gdXBvbiByZWdpc3RyYXRpb24KKyAgICAgICAgICB3aGljaCBoYXBwZW5zIGluIHRoZSBtYWluIHRocmVhZCBjb250ZXh0CisgICAgICAgICAgVGhlIGNhY2hpbmcgaGVyZSBjYW4gaGFwcGVuIGluIGVpdGhlciBUeCBvciBSeCB0aHJlYWQgZGVwZW5kaW5nCisgICAgICAgICAgb24gdGhlIGN1cnJlbnQgU1NDIHNjaGVkdWxpbmcKKyAgICAgICAgLSBhbHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGZyYW1lcyBpbiB0aGUgY2FjaGUgYXJlIGZ3ZC1lZCB0bworICAgICAgICAgIHRoZSBzdGF0aW9uIGJlZm9yZSB0aGUgbmV3IGluY29taW5nIG9uZXMgCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBpZiAoKCggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0V4aXN0cyApIHx8CisgICAgICAgICAgKCAoMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1J4QmxvY2tlZCkKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICAgICAgICAvLy9AQEA6IHhnOiBubyBjaGVja2luZyBpbiBTT0ZUQVAgZm9yIG5vdywgd2lsbCByZXZpc2l0IGxhdGVyCisgICAgICAgICAgICAmJiAoV0xBTl9TVEFfU09GVEFQICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLndTVEFUeXBlKQorI2VuZGlmCisgICAgICAgICAgKSB8fAorICAgICAgICAgICggV0xBTlRMX1NUQV9ESVNDT05ORUNURUQgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udGxTdGF0ZSkpICYmCisgICAgICAgICAgICAvKkRvbnQgYnVmZmVyIEJyb2FkY2FzdC9NdWx0aWNhc3QgZnJhbWVzLiBJZiBBUCB0cmFuc21pdHMgYnVyc3RzIG9mIEJyb2FkY2FzdC9NdWx0aWNhc3QgZGF0YSBmcmFtZXMsIAorICAgICAgICAgICAgICogbGlicmEgYnVmZmVycyBhbGwgQnJvYWRjYXN0L011bHRpY2FzdCBwYWNrZXRzIGFmdGVyIGF1dGhlbnRpY2F0aW9uIHdpdGggQVAsIAorICAgICAgICAgICAgICogU28gaXQgd2lsbCBsZWFkIHRvIGxvdyByZXNvdXJjZSBjb25kaXRpb24gaW4gUnggRGF0YSBQYXRoLiovCisgICAgICAgICAgKChXREFfSVNfUlhfQkNBU1QocHZCREhlYWRlcikgPT0gMCkpKQorICAgICAgeworICAgICAgICB1RFBVU2lnID0gV0RBX0dFVF9SWF9EUFVTSUcoIHB2QkRIZWFkZXIgKTsKKyAgICAgICAgICAvL1N0YXRpb24gaGFzIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIHdpdGggVEwgLSBjYWNoZSB0aGUgZnJhbWUKKyAgICAgICAgV0xBTlRMX0NhY2hlU1RBRnJhbWUoIHBUTENiLCB1Y1NUQUlkLCB2b3NUZW1wQnVmZiwgdURQVVNpZywgYnJvYWRjYXN0LCB1Y0ZybVR5cGUpOworICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgaWYgKChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS53U1RBRGVzYy51Y0lzQ2N4U3RhKXx8IGJyb2FkY2FzdCkKKyAgICAgIHsKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIEZpbHRlciB0aGUgSUFQUCBmcmFtZXMgZm9yIENDWCBjb25uZWN0aW9uOyAKKyAgICAgICAgICBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdCAKKyAgICAgICAgICB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIGRhdGEgcGF0aAorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGlmICggV0xBTlRMX0lzSUFQUEZyYW1lKHB2QkRIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX3BrdF9mbGF0dGVuX3J4X3BrdCgmdm9zVGVtcEJ1ZmYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGZsYXR0ZW4gcGFja2V0IC0gZHJvcHBpbmciKSk7CisgICAgICAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLworICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFJlY2VpdmVkIENDWCBJQVBQIEZyYW1lIikpOworCisgICAgICAgICAgICAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4KCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmICggV0xBTl9TVEFfQlRfQU1QID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLndTVEFUeXBlICkKKyAgICAgIHsKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIFByb2Nlc3MgdGhlIGN0cmwgQkFQIGZyYW1lOyBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdCAKKyAgICAgICAgICB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIGRhdGEgcGF0aAorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGlmICggV0xBTlRMX1Byb2Nlc3NCQVBGcmFtZSggcHZCREhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdF9kYXRhX3BrdF9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQpKQorICAgICAgICB7CisgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfS8qaWYgQlQtQU1QIHN0YXRpb24qLworICAgICAgZWxzZSBpZihzZWxmQmNhc3RMb29wYmFjayA9PSBWT1NfVFJVRSkKKyAgICAgIHsgCisgICAgICAgIC8qIERyb3AgcGFja2V0ICovIAorICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOyAKKyAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsgCisgICAgICAgIGNvbnRpbnVlOyAKKyAgICAgIH0gCisgICAgICAKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIERhdGEgcGFja2V0IHJlY2VpdmVkLCBzZW5kIHRvIHN0YXRlIG1hY2hpbmUKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICB3U1RBRXZlbnQgPSBXTEFOVExfUlhfRVZFTlQ7CisKKyAgICAgIHBmblNUQUZzbSA9IHRsU1RBRnNtW3BUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnRsU3RhdGVdLgorICAgICAgICAgICAgICAgICAgICAgIHBmblNUQVRibFt3U1RBRXZlbnRdOworCisgICAgICBpZiAoIE5VTEwgIT0gcGZuU1RBRnNtICkKKyAgICAgIHsKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCisgICAgICAgIC8qIFJlYWQgUlNTSSBhbmQgdXBkYXRlICovCisgICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9IU0hhbmRsZVJYRnJhbWUocHZvc0dDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0RBVEFfRlJBTUVfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdkJESGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmKTsKKyAgICAgICAgYnJvYWRjYXN0ID0gVk9TX0ZBTFNFOworI2Vsc2UKKyAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRSU1NJKHB2b3NHQ3R4LCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKKyNlbmRpZiAvKkZFQVRVUkVfV0xBTl9HRU42X1JPQU1JTkcqLworICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICJIYW5kbGUgUlggRGF0YSBGcmFtZSBmYWlsIHdpdGhpbiBIYW5kb2ZmIHN1cHBvcnQgbW9kdWxlIikpOworICAgICAgICAgIC8qIERvIE5vdCBEcm9wIHBhY2tldCBhdCBoZXJlIAorICAgICAgICAgICAqIFJldmlzaXQgd2h5IEhPIG1vZHVsZSByZXR1cm4gZmFpbAorICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CisgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgKi8KKyAgICAgICAgfQorICAgICAgICBwZm5TVEFGc20oIHB2b3NHQ3R4LCB1Y1NUQUlkLCAmdm9zVGVtcEJ1ZmYpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAiV0xBTiBUTDpOVUxMIHN0YXRlIGZ1bmN0aW9uLCBTVEE6JWQsIFN0YXRlOiAlZC0gZHJvcHBpbmcgcGFja2V0IiwKKyAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS50bFN0YXRlKSk7CisgICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KKyAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOworICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAvKiBSWCBTdGF0aXN0aWNzIERhdGEgKi8KKyAgICAgIC8qIFRoaXMgaXMgUlggVUMgZGF0YSBmcmFtZSAqLworICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udHJhZmZpY1N0YXRpc3RpY3MucnhVQ0ZjbnQrKzsKKyAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnRyYWZmaWNTdGF0aXN0aWNzLnJ4VUNCY250ICs9IHVzUGt0TGVuOworI2VuZGlmCisKKyAgICB9LyogZWxzZSBkYXRhIGZyYW1lKi8KKworICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CisgIH0vKndoaWxlIGNoYWluKi8KKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9SeEZyYW1lcyAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfUnhDYWNoZWRGcmFtZXMKKworICBERVNDUklQVElPTgorICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBUTCB0byBmb3J3YXJkIHRoZSBjYWNoZWQgZnJhbWVzIHRvIGEgcGFydGljdWxhcgorICAgIHN0YXRpb247IAorCisgIERFUEVOREVOQ0lFUworICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgorICAgIElmIHRoZSBmcmFtZSBjYXJyaWVkIGlzIGEgZGF0YSBmcmFtZSB0aGVuIHRoZSBzdGF0aW9uIGZvciB3aGljaCBpdCBpcworICAgIGRlc3RpbmVkIHRvIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIFRMLgorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcFRMQ2I6ICAgcG9pbnRlciB0byBUTCBoYW5kbGUgCisgICAKKyAgICB1Y1NUQUlkOiAgICBzdGF0aW9uIGZvciB3aGljaCB3ZSBuZWVkIHRvIGZvcndhcmQgdGhlIHBhY2tldHMKKworICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNhY2hlZCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICByZWNlaXZlZCwgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZSBwYWNrZXQgdGhleSB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgY2hhaW5lZCB1c2luZyB2T1NTIGJ1ZmZlcnMuCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1J4Q2FjaGVkRnJhbWVzCisoCisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKKyAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQsCisgIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZgorKQoreworICBXTEFOVExfU1RBRnVuY1R5cGUgIHBmblNUQUZzbTsKKyAgdm9zX3BrdF90KiAgICAgICAgICB2b3NUZW1wQnVmZjsKKyAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CisgIHZfUFZPSURfdCAgICAgICAgICAgcHZCREhlYWRlciA9IE5VTEw7CisgIFdMQU5UTF9TVEFFdmVudFR5cGUgd1NUQUV2ZW50ICA9IFdMQU5UTF9SWF9FVkVOVDsKKyAgdl9VOF90ICAgICAgICAgICAgICB1Y1RpZCAgICAgID0gMDsKKyAgdl9CT09MX3QgICAgICAgICAgICBicm9hZGNhc3QgID0gVk9TX0ZBTFNFOworICB2X0JPT0xfdCAgICAgICAgICAgIGJTaWdNYXRjaCAgPSBWT1NfRkFMU0U7IAorICB2X0JPT0xfdCAgICAgICAgICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX0ZBTFNFOworICBzdGF0aWMgdl9VOF90ICAgICAgIGZpcnN0X2RhdGFfcGt0X2Fycml2ZWQgPSAwOworICB2X1UzMl90ICAgICAgICAgICAgIHVEUFVTaWc7IAorICB2X1U4X3QgICAgICAgICAgICAgIHVjVWNhc3RTaWc7IAorICB2X1U4X3QgICAgICAgICAgICAgIHVjQmNhc3RTaWc7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFRMOlRMIFJlY2VpdmUgQ2FjaGVkIEZyYW1lcyBjYWxsZWQiKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUnhGcmFtZXMiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2F2ZSB0aGUgaW5pdGlhbCBidWZmZXIgLSB0aGlzIGlzIHRoZSBmaXJzdCByZWNlaXZlZCBidWZmZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CisKKyAgd2hpbGUgKCBOVUxMICE9IHZvc1RlbXBCdWZmICkKKyAgeworICAgIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc0RhdGFCdWZmLCAmdm9zRGF0YUJ1ZmYsIDEvKnRydWUqLyApOworCisgICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOlNlbmRpbmcgbmV3IGNhY2hlZCBwYWNrZXQgdG8gc3RhdGlvbiAlZCIsIHVjU1RBSWQpKTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgUGVlayBhdCBCRCBoZWFkZXIgLSBkbyBub3QgcmVtb3ZlCisgICAgICAhISEgT3B0aW1pemUgbWU6IG9ubHkgcGFydCBvZiBoZWFkZXIgaXMgbmVlZGVkOyBub3QgZW50aXJlIG9uZQorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHZvc1N0YXR1cyA9IFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKCB2b3NUZW1wQnVmZiwgKHZfUFZPSURfdCkmcHZCREhlYWRlciwgMCApOworCisgICAgaWYgKCBOVUxMID09IHB2QkRIZWFkZXIgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGV4dHJhY3QgQkQgaGVhZGVyIikpOworICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKKyAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICB1RFBVU2lnID0gV0RBX0dFVF9SWF9EUFVTSUcoIHB2QkRIZWFkZXIgKTsKKworICAgIC8qIEFNU0RVIEhXIGJ1ZyBmaXgKKyAgICAgKiBBZnRlciAybmQgQU1TRFUgc3ViZnJhbWUgSFcgY291bGQgbm90IGhhbmRsZSBCRCBjb3JyZWN0bHkKKyAgICAgKiBIQUwgd29ya2Fyb3VuZCBpcyBuZWVkZWQgKi8KKyAgICBpZihXREFfR0VUX1JYX0FTRihwdkJESGVhZGVyKSkKKyAgICB7CisgICAgICBXREFfRFNfUnhBbXNkdUJkRml4KHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCxwVExDYiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlcik7CisgICAgfQorCisgICAgdWNUaWQgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoIHB2QkRIZWFkZXIgKTsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkRhdGEgcGFja2V0IGNhY2hlZCBmb3IgU1RBICVkIiwgdWNTVEFJZCk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkIHdoZW4gbXVsdGlwZSBzdGEgc3VwcG9ydCBpcyBhZGRlZCAhISEKKyAgICAgIGZvciBub3cgYmNhc3QgZnJhbWVzIHdpbGwgYmUgc2VudCB0byB0aGUgbGFzdCByZWdpc3RlcmVkIFNUQQorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggV0RBX0lTX1JYX0JDQVNUKHB2QkRIZWFkZXIpKQorICAgIHsKKyAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAiV0xBTiBUTDpUTCByeCBCY2FzdCBmcmFtZSAiKSk7CisgICAgICBicm9hZGNhc3QgPSBWT1NfVFJVRTsKKworICAgICAgLyogSWYgQWRkcjEgaXMgYi9tY2FzdCwgYnV0IEFkZHIzIGlzIG91ciBvd24gc2VsZiBNQUMsIGl0IGlzIGEgYi9tY2FzdCAKKyAgICAgICAqIHBrdCB3ZSBzZW50IGxvb3BpbmcgYmFjayB0byB1cy4gVG8gYmUgZHJvcHBlZCBpZiB3ZSBhcmUgbm9uIEJUQU1QICAKKyAgICAgICAqLyAKKyAgICAgIGlmKCBXTEFOSEFMX1JYX0JEX0FERFIzX1NFTEZfSURYID09IAorICAgICAgICAgICh2X1U4X3QpV0RBX0dFVF9SWF9BRERSM19JRFgoIHB2QkRIZWFkZXIgKSkgCisgICAgICB7CisgICAgICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX1RSVUU7IAorICAgICAgfQorICAgIH0vKmlmIGJjYXN0Ki8KKworICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIENoZWNrIGlmIHRoZSBwYWNrZXQgdGhhdCB3ZSBjYWNoZWQgbWF0Y2hlcyB0aGUgRFBVIHNpZ25hdHVyZSBvZiB0aGUKKyAgICAgIG5ld2x5IGFkZGVkIHN0YXRpb24gCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBicm9hZGNhc3QgKQorICAgIHsKKyAgICAgIHVjQmNhc3RTaWcgPSAodl9VOF90KXVEUFVTaWc7CisgICAgICBiU2lnTWF0Y2ggPSAoKCBXTEFOX1RMX0lOVkFMSURfQl9TSUcgIT0gCisgICAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLnVjQmNhc3RTaWcgKSAmJgorICAgICAgICAoIHVjQmNhc3RTaWcgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNCY2FzdFNpZyApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHVjVWNhc3RTaWcgPSAodl9VOF90KXVEUFVTaWc7CisgICAgICBiU2lnTWF0Y2ggPSAoKCBXTEFOX1RMX0lOVkFMSURfVV9TSUcgIT0gCisgICAgICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNVY2FzdFNpZyApICYmCisgICAgICAgICAgKCB1Y1VjYXN0U2lnID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLnVjVWNhc3RTaWcgKSk7CisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBJZiB0aGUgcGFja2V0IGRvZXNuJ3QgbWF0Y2ggLSBkcm9wIGl0IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggIWJTaWdNYXRjaCApCisgICAgeworICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiV0xBTiBUTDogQ2FjaGVkIHBhY2tldCBkb2VzIG5vdCBtYXRjaCBEUFUgU2lnIG9mIHRoZSBuZXcgU1RBIC0gZHJvcCAiCisgICAgICAgICIgRFBVIFNpZyAlZCAgVUMgJWQgQkMgJWQgQiAlZCIsCisgICAgICAgIHVEUFVTaWcsCisgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLnVjVWNhc3RTaWcsCisgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLnVjVWNhc3RTaWcsCisgICAgICAgIGJyb2FkY2FzdCkpOworCisgICAgICAvKiBEcm9wIHBhY2tldCAqLyAKKyAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAorICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsgCisgICAgICBjb250aW51ZTsgCisKKyAgICB9LyppZiBzaWduYXR1cmUgbWlzbWF0Y2gqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIENoZWNrIGlmIEJULUFNUCBmcmFtZToKKyAgICAgIC0gYWRkaXRpb25hbCBwcm9jZXNzaW5nIG5lZWRlZCBpbiB0aGlzIGNhc2UgdG8gc2VwYXJhdGUgQlQtQU1QIGRhdGUKKyAgICAgICAgZnJvbSBCVC1BTVAgQ3RybCBwYXRoIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBXTEFOX1NUQV9CVF9BTVAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2Mud1NUQVR5cGUgKQorICAgIHsKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgUHJvY2VzcyB0aGUgY3RybCBCQVAgZnJhbWU7IGlmIGRhdGEgaXQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIGl0IAorICAgICAgICB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIGRhdGEgcGF0aAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYgKCBXTEFOVExfUHJvY2Vzc0JBUEZyYW1lKCBwdkJESGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X2RhdGFfcGt0X2Fycml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQpKQorICAgICAgeworICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0vKmlmIEJULUFNUCBzdGF0aW9uKi8KKyAgICAgIGVsc2UgaWYoc2VsZkJjYXN0TG9vcGJhY2sgPT0gVk9TX1RSVUUpCisgICAgICB7IAorICAgICAgICAvKiBEcm9wIHBhY2tldCAqLyAKKyAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCisgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7IAorICAgICAgICBjb250aW51ZTsgCisgICAgICB9IAorICAgICAgCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBEYXRhIHBhY2tldCByZWNlaXZlZCwgc2VuZCB0byBzdGF0ZSBtYWNoaW5lCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgd1NUQUV2ZW50ID0gV0xBTlRMX1JYX0VWRU5UOworCisgICAgICBwZm5TVEFGc20gPSB0bFNUQUZzbVtwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS50bFN0YXRlXS4KKyAgICAgICAgICAgICAgICAgICAgICBwZm5TVEFUYmxbd1NUQUV2ZW50XTsKKworICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCisgICAgICB7CisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworICAgICAgICAvKiBSZWFkIFJTU0kgYW5kIHVwZGF0ZSAqLworICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfSFNIYW5kbGVSWEZyYW1lKHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZik7CisgICAgICAgIGJyb2FkY2FzdCA9IFZPU19GQUxTRTsKKyNlbHNlCisgICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkUlNTSSh2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKKyNlbmRpZiAvKkZFQVRVUkVfV0xBTl9HRU42X1JPQU1JTkcqLworICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICJIYW5kbGUgUlggRGF0YSBGcmFtZSBmYWlsIHdpdGhpbiBIYW5kb2ZmIHN1cHBvcnQgbW9kdWxlIikpOworICAgICAgICAgIC8qIERvIE5vdCBEcm9wIHBhY2tldCBhdCBoZXJlIAorICAgICAgICAgICAqIFJldmlzaXQgd2h5IEhPIG1vZHVsZSByZXR1cm4gZmFpbAorICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CisgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgKi8KKyAgICAgICAgfQorICAgICAgICBwZm5TVEFGc20oIHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCxwVExDYiksIHVjU1RBSWQsIAorICAgICAgICAgICAgICAgICAmdm9zVGVtcEJ1ZmYpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiV0xBTiBUTDpOVUxMIHN0YXRlIGZ1bmN0aW9uLCBTVEE6JWQsIFN0YXRlOiAlZC0gZHJvcHBpbmcgcGFja2V0IiwKKyAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS50bFN0YXRlKSk7CisgICAgICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CisgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKKyAgfS8qd2hpbGUgY2hhaW4qLworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1J4Q2FjaGVkRnJhbWVzICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlRMX1Jlc291cmNlQ0IKKworICBERVNDUklQVElPTgorICAgIENhbGxlZCBieSB0aGUgVEwgd2hlbiBpdCBoYXMgcGFja2V0cyBhdmFpbGFibGUgZm9yIHRyYW5zbWlzc2lvbi4KKworICBERVBFTkRFTkNJRVMKKyAgICBUaGUgVEwgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggQkFMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9SZXNvdXJjZUNCCisoCisgIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKKyAgdl9VMzJfdCAgICAgICAgIHVDb3VudAorKQoreworICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgcFRMQ2ItPnVSZXNDb3VudCA9IHVDb3VudDsKKworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSZXN1bWUgVHggaWYgZW5vdWdoIHJlcyBhbmQgbm90IHN1c3BlbmRlZAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfTUYgKSAmJgorICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkpCisgIHsKKyAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgIldMQU4gVEw6SXNzdWluZyBYbWl0IHN0YXJ0IHJlcXVlc3QgdG8gQkFMIGZvciBhdmFpbCByZXMgQVNZTkMiKSk7CisgICAgcmV0dXJuIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOworICB9CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOVExfUmVzb3VyY2VDQiAqLworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgICBUTCBTVEFURSBNQUNISU5FCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhDb25uCisKKyAgREVTQ1JJUFRJT04KKyAgICBUcmFuc21pdCBpbiBjb25uZWN0ZWQgc3RhdGUgLSBvbmx5IEVBUE9MIGFuZCBXQUkgcGFja2V0cyBhbGxvd2VkCisKKyAgREVQRU5ERU5DSUVTCisgICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgorCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCisgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB0eCB2b3MgYnVmZmVyCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgICBPdGhlciByZXR1cm4gdmFsdWVzIGFyZSBwb3NzaWJsZSBjb21pbmcgZnJvbSB0aGUgY2FsbGVkIGZ1bmN0aW9ucy4KKyAgIFBsZWFzZSBjaGVjayBBUEkgZm9yIGFkZGl0aW9uYWwgaW5mby4KKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfU1RBVHhDb25uCisoCisgIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCisgIHZfVThfdCAgICAgICAgdWNTVEFJZCwKKyAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYKKykKK3sKKyAgIHZfVTE2X3QgICAgICAgICAgICAgIHVzUGt0TGVuOworICAgVk9TX1NUQVRVUyAgICAgICAgICAgdm9zU3RhdHVzOworICAgdl9NQUNBRERSX3QgICAgICAgICAgdkRlc3RNYWNBZGRyOworICAgdm9zX3BrdF90KiAgICAgICAgICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOworICAgV0xBTlRMX0NiVHlwZSogICAgICAgcFRMQ2IgICAgICAgPSBOVUxMOworICAgV0xBTlRMX01ldGFJbmZvVHlwZSAgdGxNZXRhSW5mbzsKKyAgIHZfVThfdCAgICAgICAgICAgICAgIHVjVHlwZVN1YnR5cGUgPSAwOworICAgdl9VOF90ICAgICAgICAgICAgICAgdWNUaWQ7CisgICB2X1U4X3QgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSA9IDA7CisgICB2X1U4X3QgICAgICAgICAgICAgICB1Y1dEU0VuYWJsZWQgPSAwOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TVEFUeENvbm4iKSk7CisgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBEaXNhYmxlIEFDIHRlbXBvcmFyeSAtIGlmIHN1Y2Nlc3NmdWxsIHJldHJpZXZlIHJlLWVuYWJsZQorICAgICAgVGhlIG9yZGVyIGlzIGp1c3RpZmllZCBiZWNhdXNlIG9mIHRoZSBwb3NzaWJsZSBzY2VuYXJpbworICAgICAgIC0gVEwgdHJ5ZXMgdG8gZmV0Y2ggcGFja2V0IGZvciBBQyBhbmQgaXQgcmV0dXJucyBOVUxMCisgICAgICAgLSBUTCBhbmFseXplcyB0aGUgZGF0YSBpdCBoYXMgcmVjZWl2ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZQorICAgICAgIGFueSBtb3JlIHBrdHMgYXZhaWxhYmxlIGZvciBBQyAtPiBpZiBub3QgVEwgd2lsbCBkaXNhYmxlIEFDCisgICAgICAgLSBob3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2hpbGUgYW5hbHl6aW5nIHJlc3VsdHMgVEwgZ290CisgICAgICAgcHJlZW1wdGVkIGJ5IGEgcGVuZGluZyBpbmRpY2F0aW9uIHdoZXJlIHRoZSBtYXNrIHdhcyBhZ2FpbiBzZXQKKyAgICAgICBUTCB3aWxsIG5vdCBjaGVjayBhZ2FpbiBhbmQgYXMgYSByZXN1bHQgd2hlbiBpdCByZXN1bWVzCisgICAgICAgZXhlY3V0aW9uIGl0IHdpbGwgZGlzYWJsZSBBQworICAgICAgIFRvIHByZXZlbnQgdGhpcyB0aGUgQUMgd2lsbCBiZSBkaXNhYmxlZCBoZXJlIGFuZCBpZiByZXRyaWV2ZQorICAgICAgIGlzIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgYmUgcmUtZW5hYmxlZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS4KKyAgICAgYXVjQUNNYXNrW3BUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjQ3VycmVudEFDXSA9IDA7IAorCisgICAgLypZb3UgbWFrZSBhbiBpbml0aWFsIGFzc3VtcHRpb24gdGhhdCBIREQgaGFzIG5vIG1vcmUgZGF0YSBhbmQgaWYgdGhlIAorICAgICAgYXNzdW1wdGlvbiB3YXMgd3JvbmcgeW91IHJlc2V0IHRoZSBmbGFncyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZQorICAgICBUaGlzIHdpbGwgcHJldmVudCBmcm9tIGV4cG9zaW5nIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBjaGVja2luZyB3aXRoIEhERCAKKyAgICAgZm9yIHBhY2tldHMgYW5kIHNldHRpbmcgdGhlIGZsYWdzIHRvIGZhbHNlKi8KKyAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcsIDApOworICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y05vTW9yZURhdGEgPSAxOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmV0Y2ggdHggcGFja2V0IGZyb20gSERECisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgaWYgKFdMQU5fU1RBX1NPRlRBUCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS53U1RBRGVzYy53U1RBVHlwZSAmJiAKKyAgICAgKCF2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpKQorICB7CisjZW5kaWYKKyAgICAvLyBkb24ndCBzZXQgMC4gCisgICAgLy92b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjUGt0UGVuZGluZywgMCk7CisgICAgdm9zU3RhdHVzID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucGZuU1RBRmV0Y2hQa3QoIHB2b3NHQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjQ3VycmVudEFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b3NEYXRhQnVmZiwgJnRsTWV0YUluZm8gKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgIH0KKyAgZWxzZQorICB7CisgICAgLy9zb2Z0YXAgY2FzZQorICAgIFdMQU5UTF9BQ0VudW1UeXBlIHVjQUMgPSBwVExDYi0+dUN1clNlcnZlZEFDOworICAgIHZvc1N0YXR1cyA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnBmblNUQUZldGNoUGt0KCBwdm9zR0N0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVjU1RBSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNBQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b3NEYXRhQnVmZiwgJnRsTWV0YUluZm8gKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8ICggTlVMTCA9PSB2b3NEYXRhQnVmZiApKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6Tm8gbW9yZSBkYXRhIGF0IEhERCBzdGF0dXMgJWQiLCB2b3NTdGF0dXMpKTsKKyAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSZXNldCBBQyBmb3IgdGhlIHNlcnZpY2VkIHN0YXRpb24gdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgQUMKKyAgICAtPiBkdWUgdG8gbm8gbW9yZSBkYXRhIGF0IHRoZSBzdGF0aW9uCisgICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQorICAgIG1hZGUgaW4gdGhlIG1haW4gVEwgbG9vcAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0N1cnJlbnRBQyAgICAgPSBXTEFOVExfQUNfVk87CisgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNDdXJyZW50V2VpZ2h0ID0gMDsKKworICAgIHJldHVybiB2b3NTdGF0dXM7CisgIH0KKworICAvKlRoZXJlIGFyZSBzdGlsbCBwYWNrZXRzIGluIEhERCAtIHNldCBiYWNrIHRoZSBwZW5kaW5nIHBhY2tldHMgYW5kIAorICAgdGhlIG5vIG1vcmUgZGF0YSBhc3N1bXB0aW9uKi8KKyAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcsIDEpOworICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y05vTW9yZURhdGEgPSAwOworCisgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS4KKyAgICAgYXVjQUNNYXNrW3BUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjQ3VycmVudEFDXSA9IDE7IAorI2lmZGVmIFdMQU5fUEVSRiAKKyAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpMCk7CisKKyNlbmRpZiAvKldMQU5fUEVSRiovCisKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIElmIHRoZSBwYWNrZXQgaXMgbmVpdGhlciBhbiBFYXBvbCBwYWNrZXQgbm9yIGEgV0FJIHBhY2tldCB0aGVuIGRyb3AgaXQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIDAgPT0gdGxNZXRhSW5mby51Y0lzRWFwb2wgJiYgMCA9PSB0bE1ldGFJbmZvLnVjSXNXYWkgKQorICAgeworICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gVEw6T25seSBFQVBPTCBvciBXQUkgcGFja2V0cyBhbGxvd2VkIGJlZm9yZSBhdXRoZW50aWNhdGlvbiIpKTsKKworICAgICAvKiBGYWlsIHR4IGZvciBwYWNrZXQgKi8KKyAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucGZuU1RBVHhDb21wKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0VfQkFETVNHKTsKKyAgICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOworICAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgfQorI2Vsc2UKKyAgIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjSXNFYXBvbCApCisgIHsKKyAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBub24gRUFQT0wgcGFja2V0IGJlZm9yZSBhdXRoZW50aWNhdGlvbiIpKTsKKworICAgIC8qIEZhaWwgdHggZm9yIHBhY2tldCAqLworICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnBmblNUQVR4Q29tcCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1NUQVRVU19FX0JBRE1TRyk7CisgICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOworICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgQ2hlY2sgVElECisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB1Y1RpZCAgICAgPSB0bE1ldGFJbmZvLnVjVElEOworCisgIC8qTWFrZSBzdXJlIFRJRCBpcyB2YWxpZCovCisgIGlmICggV0xBTlRMX1RJRF9JTlZBTElEKHVjVGlkKSkgCisgIHsKKyAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUSUQgc2VudCBpbiBtZXRhIGluZm8gJWQgLSBkZWZhdWx0aW5nIHRvIDAgKEJFKSIsIAorICAgICAgICAgICAgIHVjVGlkKSk7CisgICAgIHVjVGlkID0gMDsgCisgIH0KKworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFRMOkF0dGFjaGluZyBCRCBoZWFkZXIgdG8gcGt0IG9uIFdMQU5UTF9TVEFUeENvbm4iKSk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEgaWYgRnJhbWUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCBvciBpZiAKKyAgICBmcmFtZSBpcyBhIFdBSSBmcmFtZS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggKCAxID09IHRsTWV0YUluZm8udWNJc1dhaSApIHx8CisgICAgICAgKCAwID09IHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsICkgKQorI2Vsc2UKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExIGlmIEZyYW1lIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoICggMCA9PSB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCApICYmCisgICAgICAoIDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uKSApCisjZW5kaWYgLy8jaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgeworICAgIHZvc1N0YXR1cyA9ICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLCB1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsTWV0YUluZm8udWNVUCwgJnVjV0RTRW5hYmxlZCwgJmV4dHJhSGVhZFNwYWNlKTsKKworICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXTEFOIFRMOkVycm9yIHdoZW4gdHJhbnNsYXRpbmcgaGVhZGVyIFdMQU5UTF9TVEFUeENvbm4iKSk7CisKKyAgICAgIHJldHVybiB2b3NTdGF0dXM7CisgICAgfQorCisgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgPSAxOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2FsbCBIQUwgdG8gZmlsbCBCRCBoZWFkZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOworCisgIGlmICggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNRb3NFbmFibGVkICkKKyAgeworICAgIHVjVHlwZVN1YnR5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFKTsKKyAgfQorCisKKyAgdm9zU3RhdHVzID0gKFZPU19TVEFUVVMpV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYgLCAmdkRlc3RNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCwgJnVzUGt0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS53U1RBRGVzYy51Y1Fvc0VuYWJsZWQsIHVjV0RTRW5hYmxlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhSGVhZFNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1R5cGVTdWJ0eXBlLCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudlNlbGZNQUNBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1RpZCwgSEFMX1RYX05PX0VOQ1JZUFRJT05fTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51c1RpbWVTdGFtcCwgdGxNZXRhSW5mby51Y0lzRWFwb2wsIHRsTWV0YUluZm8udWNVUCApOworCisgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgIHsKKyAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZpbGwgQkQgJWQiLCB2b3NTdGF0dXMpKTsKKyAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKKyAgICByZXR1cm4gdm9zU3RhdHVzOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFVwZGF0ZSB0eCBjb3VudGVyIGZvciBCQSBzZXNzaW9uIHF1ZXJ5IGZvciB0eCBzaWRlCisgICAgITEgLSBzaG91bGQgdGhpcyBiZSBkb25lIGZvciBFQVBPTCBmcmFtZXM/CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5hdVR4Q291bnRbdWNUaWRdKys7CisKKyAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAorICAgICAgICAgICAgICAgKHZfUFZPSURfdClwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5wZm5TVEFUeENvbXAgKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhdmUgZGF0YSB0byBpbnB1dCBwb2ludGVyIGZvciBUTCBjb3JlCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICpwdm9zRGF0YUJ1ZmYgPSB2b3NEYXRhQnVmZjsKKyAgLypzZWN1cml0eSBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLworICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgLyogVFggU3RhdGlzdGljcyAqLworICBpZiAoISh0bE1ldGFJbmZvLnVjQmNhc3QgfHwgdGxNZXRhSW5mby51Y01jYXN0KSkKKyAgeworICAgIC8qIFRoaXMgaXMgVFggVUMgZnJhbWUgKi8KKyAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS50cmFmZmljU3RhdGlzdGljcy50eFVDRmNudCsrOworICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNCY250ICs9IHVzUGt0TGVuOworICB9CisjZW5kaWYKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9TVEFUeENvbm4gKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFUeEF1dGgKKworICBERVNDUklQVElPTgorICAgIFRyYW5zbWl0IGluIGF1dGhlbnRpY2F0ZWQgc3RhdGUgLSBhbGwgZGF0YSBhbGxvd2VkCisKKyAgREVQRU5ERU5DSUVTCisgICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgorCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCisgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB0eCB2b3MgYnVmZmVyCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgICBPdGhlciByZXR1cm4gdmFsdWVzIGFyZSBwb3NzaWJsZSBjb21pbmcgZnJvbSB0aGUgY2FsbGVkIGZ1bmN0aW9ucy4KKyAgIFBsZWFzZSBjaGVjayBBUEkgZm9yIGFkZGl0aW9uYWwgaW5mby4KKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfU1RBVHhBdXRoCisoCisgIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCisgIHZfVThfdCAgICAgICAgdWNTVEFJZCwKKyAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYKKykKK3sKKyAgIHZfVTE2X3QgICAgICAgICAgICAgICB1c1BrdExlbjsKKyAgIFZPU19TVEFUVVMgICAgICAgICAgICB2b3NTdGF0dXM7CisgICB2X01BQ0FERFJfdCAgICAgICAgICAgdkRlc3RNYWNBZGRyOworICAgdm9zX3BrdF90KiAgICAgICAgICAgIHZvc0RhdGFCdWZmID0gTlVMTDsKKyAgIFdMQU5UTF9DYlR5cGUqICAgICAgICBwVExDYiAgICAgICA9IE5VTEw7CisgICBXTEFOVExfTWV0YUluZm9UeXBlICAgdGxNZXRhSW5mbzsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1R5cGVTdWJ0eXBlID0gMDsKKyAgIFdMQU5UTF9BQ0VudW1UeXBlICAgICB1Y0FDOworICAgV0xBTlRMX0FDRW51bVR5cGUgICAgIHVjTmV4dEFDOworICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjVGlkOworICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU3dGcm1YdGwgPSAwOworICAgdl9VOF90ICAgICAgICAgICAgICAgIGV4dHJhSGVhZFNwYWNlID0gMDsKKyAgIFdMQU5UTF9TVEFDbGllbnRUeXBlICpwU3RhQ2xpZW50OworICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjV0RTRW5hYmxlZCA9IDA7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgdWNUeEZsYWcgICA9IDA7IAorICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjQUNNYXNrLCBpOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8ICggTlVMTCA9PSBwdm9zRGF0YUJ1ZmYgKSkKKyAgeworICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIGlucHV0IHBhcmFtcyBvbiBXTEFOVExfU1RBVHhBdXRoIFRMICV4IERCICV4IiwKKyAgICAgICAgICAgICBwVExDYiwgcHZvc0RhdGFCdWZmKSk7CisgICAgaWYgKE5VTEwgIT0gcHZvc0RhdGFCdWZmKQorICAgIHsKKyAgICAgICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CisgICAgfQorICAgIGlmKE5VTEwgIT0gcFRMQ2IpCisgICAgeworICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y05vTW9yZURhdGEgPSAxOworICAgIH0KKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgcFN0YUNsaWVudCA9ICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKKworICB2b3NfbWVtX3plcm8oJnRsTWV0YUluZm8sIHNpemVvZih0bE1ldGFJbmZvKSk7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmV0Y2ggcGFja2V0IGZyb20gSERECisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgaWYgKChXTEFOX1NUQV9TT0ZUQVAgIT0gcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUpICYmCisgICAgICAoIXZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkpCisgIHsKKyNlbmRpZgorICB1Y0FDID0gcFN0YUNsaWVudC0+dWNDdXJyZW50QUM7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBEaXNhYmxlIEFDIHRlbXBvcmFyeSAtIGlmIHN1Y2Nlc3NmdWxsIHJldHJpZXZlIHJlLWVuYWJsZQorICAgICAgVGhlIG9yZGVyIGlzIGp1c3RpZmllZCBiZWNhdXNlIG9mIHRoZSBwb3NzaWJsZSBzY2VuYXJpbworICAgICAgIC0gVEwgdHJ5ZXMgdG8gZmV0Y2ggcGFja2V0IGZvciBBQyBhbmQgaXQgcmV0dXJucyBOVUxMCisgICAgICAgLSBUTCBhbmFseXplcyB0aGUgZGF0YSBpdCBoYXMgcmVjZWl2ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZQorICAgICAgIGFueSBtb3JlIHBrdHMgYXZhaWxhYmxlIGZvciBBQyAtPiBpZiBub3QgVEwgd2lsbCBkaXNhYmxlIEFDCisgICAgICAgLSBob3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2hpbGUgYW5hbHl6aW5nIHJlc3VsdHMgVEwgZ290CisgICAgICAgcHJlZW1wdGVkIGJ5IGEgcGVuZGluZyBpbmRpY2F0aW9uIHdoZXJlIHRoZSBtYXNrIHdhcyBhZ2FpbiBzZXQKKyAgICAgICBUTCB3aWxsIG5vdCBjaGVjayBhZ2FpbiBhbmQgYXMgYSByZXN1bHQgd2hlbiBpdCByZXN1bWVzCisgICAgICAgZXhlY3V0aW9uIGl0IHdpbGwgZGlzYWJsZSBBQworICAgICAgIFRvIHByZXZlbnQgdGhpcyB0aGUgQUMgd2lsbCBiZSBkaXNhYmxlZCBoZXJlIGFuZCBpZiByZXRyaWV2ZQorICAgICAgIGlzIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgYmUgcmUtZW5hYmxlZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFN0YUNsaWVudC0+YXVjQUNNYXNrW3BTdGFDbGllbnQtPnVjQ3VycmVudEFDXSA9IDA7IAorCisgIC8vIGRvbid0IHJlc2V0IGl0LCBhcyBvdGhlciBBQyBxdWV1ZXMgaW4gSEREIG1heSBoYXZlIHBhY2tldHMKKyAgLy92b3NfYXRvbWljX3NldF9VOCggJnBTdGFDbGllbnQtPnVjUGt0UGVuZGluZywgMCk7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICB9CisgIGVsc2UKKyAgeworICAgIC8vc29mdGFwIGNhc2UKKyAgICB1Y0FDID0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQzsKKyAgICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbdWNBQ10gPSAwOyAKKworICAgIC8vdm9zX2F0b21pY19zZXRfVTgoICZwU3RhQ2xpZW50LT51Y1BrdFBlbmRpbmcsIDApOworICB9CisjZW5kaWYKKworICBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyggcFN0YUNsaWVudCwgdWNBQ01hc2ssIGkpOyAKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgLypZb3UgbWFrZSBhbiBpbml0aWFsIGFzc3VtcHRpb24gdGhhdCBIREQgaGFzIG5vIG1vcmUgZGF0YSBhbmQgaWYgdGhlIAorICAgICAgYXNzdW1wdGlvbiB3YXMgd3JvbmcgeW91IHJlc2V0IHRoZSBmbGFncyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZQorICAgICBUaGlzIHdpbGwgcHJldmVudCBmcm9tIGV4cG9zaW5nIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBjaGVja2luZyB3aXRoIEhERCAKKyAgICAgZm9yIHBhY2tldHMgYW5kIHNldHRpbmcgdGhlIGZsYWdzIHRvIGZhbHNlKi8KKyAgaWYgKCAwID09IHVjQUNNYXNrICkKKyAgeworICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKKyAgICBwU3RhQ2xpZW50LT51Y05vTW9yZURhdGEgPSAxOworICB9CisjZW5kaWYKKworICB2b3NTdGF0dXMgPSBwU3RhQ2xpZW50LT5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAmdGxNZXRhSW5mbyApOworCisKKyAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8ICggTlVMTCA9PSB2b3NEYXRhQnVmZiApKQorICB7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmV0Y2ggcGt0IGZyb20gSEREICVkIiwKKyAgICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpOworICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFJlc2V0IEFDIGZvciB0aGUgc2VydmljZWQgc3RhdGlvbiB0byB0aGUgaGlnaGVzdCBwcmlvcml0eSBBQworICAgICAgLT4gZHVlIHRvIG5vIG1vcmUgZGF0YSBhdCB0aGUgc3RhdGlvbgorICAgICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQorICAgICAgbWFkZSBpbiB0aGUgbWFpbiBUTCBsb29wCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IFdMQU5UTF9BQ19WTzsKKyAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgPSAwOworCisgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAvKlRoZXJlIGFyZSBzdGlsbCBwYWNrZXRzIGluIEhERCAtIHNldCBiYWNrIHRoZSBwZW5kaW5nIHBhY2tldHMgYW5kIAorICAgdGhlIG5vIG1vcmUgZGF0YSBhc3N1bXB0aW9uKi8KKyAgdm9zX2F0b21pY19zZXRfVTgoICZwU3RhQ2xpZW50LT51Y1BrdFBlbmRpbmcsIDEpOworICBwU3RhQ2xpZW50LT51Y05vTW9yZURhdGEgPSAwOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgIGlmIChXTEFOX1NUQV9TT0ZUQVAgIT0gcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUpCisgIHsKKyNlbmRpZgorICAvLyBkb24ndCBuZWVkIHRvIHNldCBpdCwgYXMgd2UgZG9uJ3QgcmVzZXQgaXQgaW4gdGhpcyBmdW5jdGlvbi4KKyAgLy92b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjUGt0UGVuZGluZywgMSk7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICB9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fUEVSRiAKKyAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9CQUwsIAorICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KTApOworI2VuZGlmIC8qV0xBTl9QRVJGKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgVElECisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHVjVGlkICAgICA9IHRsTWV0YUluZm8udWNUSUQ7CisKKyAgLypNYWtlIHN1cmUgVElEIGlzIHZhbGlkKi8KKyAgaWYgKCBXTEFOVExfVElEX0lOVkFMSUQodWNUaWQpKSAKKyAgeworICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRJRCBzZW50IGluIG1ldGEgaW5mbyAlZCAtIGRlZmF1bHRpbmcgdG8gMCAoQkUpIiwgCisgICAgICAgICAgICAgdWNUaWQpKTsKKyAgICAgdWNUaWQgPSAwOyAKKyAgfQorCisgIC8qU2F2ZSBmb3IgVUFQU0QgdGltZXIgY29uc2lkZXJhdGlvbiovCisgIHBTdGFDbGllbnQtPnVjU2VydmljZWRBQyA9IHVjQUM7IAorCisgIGlmICggdWNBQyA9PSBwU3RhQ2xpZW50LT51Y0N1cnJlbnRBQyApIAorICB7CisgICAgcFN0YUNsaWVudC0+YXVjQUNNYXNrW3BTdGFDbGllbnQtPnVjQ3VycmVudEFDXSA9IDE7CisgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0LS07CisgIH0KKyAgZWxzZQorICB7CisgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgICAgID0gdWNBQzsKKyAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjQUNdIC0gMTsKKworICAgIHBTdGFDbGllbnQtPmF1Y0FDTWFza1twU3RhQ2xpZW50LT51Y0N1cnJlbnRBQ10gPSAxOworCisgIH0KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgaWYgKFdMQU5fU1RBX1NPRlRBUCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSkKKyAgeworI2VuZGlmCisgIGlmICggMCA9PSBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgKSAKKyAgeworICAgIFdMQU5UTF9BQ0VudW1UeXBlIHRlbXBBQyA9IHVjQUM7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIENob29zZSBuZXh0IEFDIC0gISEhIG9wdGltaXplIG1lCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHdoaWxlICggMCAhPSB1Y0FDTWFzayApIAorICAgIHsKKyAgICAgIHVjTmV4dEFDID0gKFdMQU5UTF9BQ0VudW1UeXBlKSgoIHRlbXBBQyAtIDEgKSAmIFdMQU5UTF9NQVNLX0FDKTsgCisgICAgICBpZiAoIDAgIT0gcFN0YUNsaWVudC0+YXVjQUNNYXNrW3VjTmV4dEFDXSApCisgICAgICB7CisgICAgICAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRBQyAgICAgPSB1Y05leHRBQzsKKyAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNOZXh0QUNdOworCisgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQ2hhbmdpbmcgc2VydmljZWQgQUMgdG86ICVkIHdpdGggV2VpZ2h0OiAlZCIsCisgICAgICAgICAgICAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICwgCisgICAgICAgICAgICAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCkpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB0ZW1wQUMgPSB1Y05leHRBQzsKKyAgICB9CisgIH0KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgIH0KKyNlbmRpZgorCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6QXR0YWNoaW5nIEJEIGhlYWRlciB0byBwa3Qgb24gV0xBTlRMX1NUQVR4QXV0aCIpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCApCisgIHsKKyAgICAgLyogTmVlZHMgZnJhbWUgdHJhbnNsYXRpb24gKi8KKyAgICAgLy8gaWYgdGhlIGNsaWVudCBoYXMgbm90IGVuYWJsZWQgU1ctb25seSBmcmFtZSB0cmFuc2xhdGlvbgorICAgICAvLyBhbmQgaWYgdGhlIGZyYW1lIGlzIGEgdW5pY2FzdCBmcmFtZQorICAgICAvLyAgIChIVyBmcmFtZSB0cmFuc2xhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGJyb2FkY2FzdCBkb21haW5zCisgICAgIC8vICAgIHNvIHdlIHVzZSBTVyBmcmFtZSB0cmFuc2xhdGlvbiBmb3IgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZXMpCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgICAgLy8gYW5kIGlmIHRoZSBmcmFtZSBpcyBub3QgYSBXQVBJIGZyYW1lCisjZW5kaWYKKyAgICAgLy8gdGhlbiB1c2UgSFdfYmFzZWQgZnJhbWUgdHJhbnNsYXRpb24KKworICAgICBpZiAoICggMCA9PSBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gKSAmJgorICAgICAgICAgICggMCA9PSB0bE1ldGFJbmZvLnVjQmNhc3QgKSAmJgorICAgICAgICAgICggMCA9PSB0bE1ldGFJbmZvLnVjTWNhc3QgKQorI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgICAgJiYgKCB0bE1ldGFJbmZvLnVjSXNXYWkgIT0gMSApCisjZW5kaWYKKyAgICAgICAgKQorICAgICB7CisjaWZkZWYgV0xBTl9QRVJGIAorICAgICAgICB2X1UzMl90IHVGYXN0RndkT0sgPSAwOworCisgICAgICAgIC8qIEhXIGJhc2VkIHRyYW5zbGF0aW9uLiBTZWUgaWYgdGhlIGZyYW1lIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkICovCisgICAgICAgIFdEQV9UTElfRmFzdEh3RndkRGF0YUZyYW1lKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYgLCAmdm9zU3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVGYXN0RndkT0ssICZ0bE1ldGFJbmZvLCAmcFN0YUNsaWVudC0+d1NUQURlc2MpOworCisgICAgICAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYodUZhc3RGd2RPSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBQYWNrZXQgY291bGQgYmUgZmFzdCBmb3J3YXJkZWQgbm93ICovCisgICAgICAgICAgICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBTdGFDbGllbnQtPnBmblNUQVR4Q29tcCApOworCisgICAgICAgICAgICAgICAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOworCisgICAgICAgICAgICAgICAgLyogVE9ETzogRG8gd2UgcmVhbGx5IG5lZWQgdG8gdXBkYXRlIFdMQU5UTF9IU0hhbmRsZVRYRnJhbWUoKSAKKyAgICAgICAgICAgICAgICAgICBzdGF0cyBmb3IgZXZlcnkgcGt0PyAqLworICAgICAgICAgICAgICAgIHBTdGFDbGllbnQtPmF1VHhDb3VudFt0bE1ldGFJbmZvLnVjVElEXSsrOworICAgICAgICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIC8qIGNhbid0IGJlIGZhc3QgZm9yd2FyZGVkLCBmYWxsIHRocm91Z2ggbm9ybWFsIChzbG93KSBwYXRoLiAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZhc3RGd2QgQkQgJWQiLCB2b3NTdGF0dXMpKTsKKyAgICAgICAgICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgICAgICAgfQorI2VuZGlmIC8qV0xBTl9QRVJGKi8KKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgLyogU1cgYmFzZWQgdHJhbnNsYXRpb24gKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICAgICAgZ1VjSXNXYWkgPSB0bE1ldGFJbmZvLnVjSXNXYWksCisjZW5kaWYKKworICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwgdWNTVEFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsTWV0YUluZm8udWNVUCwgJnVjV0RTRW5hYmxlZCwgJmV4dHJhSGVhZFNwYWNlKTsKKyAgICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQorICAgICAgIHsKKyAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkVycm9yIHdoZW4gdHJhbnNsYXRpbmcgaGVhZGVyIFdMQU5UTF9TVEFUeEF1dGgiKSk7CisgICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgICAgICB9CisKKyAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMIHNvZnR3YXJlIHRyYW5zbGF0aW9uIHN1Y2Nlc3MgXG4iKSk7CisgICAgICAgdWNTd0ZybVh0bCA9IDE7CisgICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgPSAxOworICAgIH0KKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENhbGwgSEFMIHRvIGZpbGwgQkQgaGVhZGVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdWNUeXBlU3VidHlwZSB8PSAoV0xBTlRMXzgwMjExX0RBVEFfVFlQRSA8PCA0KTsKKworICBpZiAoIHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApIAorICB7CisgICAgdWNUeXBlU3VidHlwZSB8PSAoV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEUpOworICB9CisKKyAgdWNUeEZsYWcgID0gKDAgIT0gcFN0YUNsaWVudC0+d1VBUFNESW5mb1t1Y0FDXS51Y1NldCk/CisgICAgICAgICAgICAgIEhBTF9UUklHR0VSX0VOQUJMRURfQUNfTUFTSzowOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKKyAgaWYgKCBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y0lzV2FwaVN0YSA9PSAxICkKKyAgeworI2lmZGVmIExJQlJBX1dBUElfU1VQUE9SVAorICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfV0FQSV9TVEFfTUFTSzsKKyNlbmRpZiAvL0xJQlJBX1dBUElfU1VQUE9SVAorICAgIGlmICggdGxNZXRhSW5mby51Y0lzV2FpID09IDEgKSAKKyAgICB7CisgICAgICB1Y1R4RmxhZyA9IHVjVHhGbGFnIHwgSEFMX1RYX05PX0VOQ1JZUFRJT05fTUFTSzsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworCisgIHZvc1N0YXR1cyA9IChWT1NfU1RBVFVTKVdEQV9EU19CdWlsZFR4UGFja2V0SW5mbyggcHZvc0dDdHgsIAorICAgICAgICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYgLCAmdkRlc3RNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwsICZ1c1BrdExlbiwKKyAgICAgICAgICAgICAgICAgICAgIHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCwgdWNXRFNFbmFibGVkLCAKKyAgICAgICAgICAgICAgICAgICAgIGV4dHJhSGVhZFNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSwgJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgIHVjVGlkLCB1Y1R4RmxhZywgdGxNZXRhSW5mby51c1RpbWVTdGFtcCwgCisgICAgICAgICAgICAgICAgICAgICB0bE1ldGFJbmZvLnVjSXNFYXBvbCwgdGxNZXRhSW5mby51Y1VQICk7CisKKyAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGaWxsIFRYIEJEIEVycm9yIHN0YXR1cyAlZCIsIHZvc1N0YXR1cykpOworCisgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAvKiBUWCBTdGF0aXN0aWNzICovCisgIGlmICghKHRsTWV0YUluZm8udWNCY2FzdCB8fCB0bE1ldGFJbmZvLnVjTWNhc3QpKQorICB7CisgICAgLyogVGhpcyBpcyBUWCBVQyBmcmFtZSAqLworICAgIHBTdGFDbGllbnQtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNGY250Kys7CisgICAgcFN0YUNsaWVudC0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0JjbnQgKz0gdXNQa3RMZW47CisgIH0KKyNlbmRpZgorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBVcGRhdGUgdHggY291bnRlciBmb3IgQkEgc2Vzc2lvbiBxdWVyeSBmb3IgdHggc2lkZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFN0YUNsaWVudC0+YXVUeENvdW50W3VjVGlkXSsrOworCisgIC8qIFRoaXMgY29kZSBpcyB0byBzZW5kIHRyYWZmaWMgd2l0aCBsb3dlciBwcmlvcml0eSBBQyB3aGVuIHdlIGRvZXMgbm90IAorICAgICBnZXQgYWRtaXR0ZWQgdG8gc2VuZCBpdC4gVG9kYXkgSEFMIGRvZXMgbm90IGRvd25ncmFkZSBBQyBzbyB0aGlzIGNvZGUgCisgICAgIGRvZXMgbm90IGdldCBleGVjdXRlZC4oSW4gb3RoZXIgd29yZHMsIEhBTCBkb2VzbpJ0IGNoYW5nZSB0aWQuIFRoZSBpZiAKKyAgICAgc3RhdGVtZW50IGlzIGFsd2F5cyBmYWxzZS4pCisgICAgIE5PVEU6IEluIHRoZSBjYXNlIG9mIExBIGRvd25ncmFkZSBvY2N1cnMgaW4gSEREICh0aGF0IHdhcyB0aGUgY2hhbmdlIAorICAgICBQaGFuaSBtYWRlIGR1cmluZyBXTU0tQUMgcGx1Z2Zlc3QpLiBJZiBXTSAmIEJNUCBhbHNvIHRvb2sgdGhpcyBhcHByb2FjaCwgCisgICAgIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBuZWVkIGZvciBhbnkgQUMgZG93bmdyYWRlIGxvZ2ljIGluIFRML1dESS4gICAqLworI2lmIDAKKyAgaWYgKCggdWNUaWQgIT0gdGxNZXRhSW5mby51Y1RJRCApICYmCisgICAgICAoIDAgIT0gcFN0YUNsaWVudC0+d1NUQURlc2MudWNRb3NFbmFibGVkICkgJiYgCisgICAgICAoIDAgIT0gdWNTd0ZybVh0bCApKQorICB7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICEhIEZJWCBtZTogT25jZSBkb3duZ3JhZGluZyBpcyBjbGVhciBwdXQgaW4gdGhlIHByb3BlciBjaGFuZ2UKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHVjUUNPZmZzZXQgPSBXTEFOSEFMX1RYX0JEX0hFQURFUl9TSVpFICsgV0xBTlRMXzgwMl8xMV9IRUFERVJfTEVOOworCisgICAgLy8hISFGaXggdGhpcyByZXBsYWNlIHBlZWsgd2l0aCBleHRyYWN0IAorICAgIHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgdWNRQ09mZnNldCwodl9QVk9JRF90KSZwdWNRb3NDdHJsLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnB1Y1Fvc0N0cmwpKTsKKyAgICAqcHVjUW9zQ3RybCA9IHVjVGlkOyAvLz8gcHJvcGVyIGJ5dGUgb3JkZXIKKyAgfQorI2VuZGlmCisKKyAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZpbGwgQkQgJWQiLCB2b3NTdGF0dXMpKTsKKyAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKKyAgICByZXR1cm4gdm9zU3RhdHVzOworICB9CisKKyAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAorICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpcFN0YUNsaWVudC0+cGZuU1RBVHhDb21wICk7CisKKyAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOworCisgIC8qQkUgJiBCSyBjYW4gYmUgZGVsYXllZCwgVk8gYW5kIFZJIG5vdCBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLworICBpZiAoIHBTdGFDbGllbnQtPnVjU2VydmljZWRBQyA+IFdMQU5UTF9BQ19CRSApIAorICB7CisgICAgcFRMQ2ItPmJVcmdlbnQ9IFRSVUU7CisgIH0KKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9TVEFUeEF1dGggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhEaXNjCisKKyAgREVTQ1JJUFRJT04KKyAgICBUcmFuc21pdCBpbiBkaXNjb25uZWN0ZWQgc3RhdGUgLSBubyBkYXRhIGFsbG93ZWQKKworICBERVBFTkRFTkNJRVMKKyAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKKyAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4IHZvcyBidWZmZXIKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9TVEFUeERpc2MKKygKKyAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKKyAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAorICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZgorKQoreworICAgV0xBTlRMX0NiVHlwZSogICAgICAgIHBUTENiICAgICAgID0gTlVMTDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU1RBVHhBdXRoIikpOworICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEVycm9yCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICJXTEFOIFRMOlBhY2tldCBzaG91bGQgbm90IGJlIHRyYW5zbWl0dGVkIGluIHN0YXRlIGRpc2Nvbm5lY3RlZCBpZ25vcmluZyIKKyAgICAgICAgICAgICIgcmVxdWVzdCIpKTsKKworICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKKyAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTm9Nb3JlRGF0YSA9IDE7CisgICAKKyAgIC8vU2hvdWxkIG5vdCBiZSBhbnl0aGluZyBwZW5kaW5nIGluIGRpc2Nvbm5lY3Qgc3RhdGUKKyAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNQa3RQZW5kaW5nLCAwKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9TVEFUeERpc2MgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfU1RBUnhDb25uCisKKyAgREVTQ1JJUFRJT04KKyAgICBSZWNlaXZlIGluIGNvbm5lY3RlZCBzdGF0ZSAtIG9ubHkgRUFQT0wKKworICBERVBFTkRFTkNJRVMKKyAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKKyAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4L3J4IHZvcyBidWZmZXIKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9TVEFSeENvbm4KKygKKyAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKKyAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAorICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZgorKQoreworICAgV0xBTlRMX0NiVHlwZSogICAgICAgICAgIHBUTENiID0gTlVMTDsKKyAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0V0aGVyVHlwZSA9IDA7CisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNQa3RMZW47CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKKyAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVET2Zmc2V0OworICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVUxlbjsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuOworICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzQWN0dWFsSExlbiA9IDA7CisgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZjsKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICBhdWNCREhlYWRlcjsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y1RpZDsKKyAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSAgICB3UnhNZXRhSW5mbzsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfU1RBUnhDb25uIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgQkQgaGVhZGVyIGFuZCBjaGVjayBpZiB2YWxpZAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdm9zU3RhdHVzID0gV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHZvc0RhdGFCdWZmLCAodl9QVk9JRF90KSZhdWNCREhlYWRlciwgMC8qU3dhcCBCRCovICk7CisKKyAgaWYgKCBOVUxMID09IGF1Y0JESGVhZGVyICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKKyAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisKKyAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQoYXVjQkRIZWFkZXIpOworICB1c01QRFVET2Zmc2V0ID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKKyAgdXNNUERVTGVuICAgICA9ICh2X1UxNl90KVdEQV9HRVRfUlhfTVBEVV9MRU4oYXVjQkRIZWFkZXIpOworICB1Y01QRFVITGVuICAgID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX0xFTihhdWNCREhlYWRlcik7CisgIHVjVGlkICAgICAgICAgPSAodl9VOF90KVdEQV9HRVRfUlhfVElEKGF1Y0JESGVhZGVyKTsKKworICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgJnVzUGt0TGVuKTsKKworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBwcm9jZXNzaW5nIGRhdGE6IEhPICVkIERPICVkIExlbiAlZCBITGVuICVkIiwKKyAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0LCB1c01QRFVET2Zmc2V0LCB1c01QRFVMZW4sIHVjTVBEVUhMZW4pKTsKKworICAgIC8qSXQgd2lsbCBjdXQgb3V0IHRoZSA4MDIuMTEgaGVhZGVyIGlmIG5vdCB1c2VkKi8KKyAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX1RyaW1SeFBhY2tldEluZm8oIHZvc0RhdGFCdWZmICkgKQorICB7CisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBjb3JydXB0ZWQgLSBkcm9wcGluZyBwYWNrZXQiKSk7CisgICAgLyogRHJvcCBwYWNrZXQgKi8KKyAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgIH0KKworICB2b3NTdGF0dXMgPSBXTEFOVExfR2V0RXRoZXJUeXBlKGF1Y0JESGVhZGVyLHZvc0RhdGFCdWZmLHVjTVBEVUhMZW4sJnVzRXRoZXJUeXBlKTsKKyAgCisgIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCisgIHsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICAgIC8qIElmIGZyYW1lIGlzIG5laXRoZXIgYW4gRUFQT0wgZnJhbWUgbm9yIGEgV0FJIGZyYW1lIHRoZW4gd2UgZHJvcCB0aGUgZnJhbWUqLworICAgIC8qIFRPRE86IERvIHdlIG5lZWQgYSBjaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIFdBUEkgbW9kZT8gSWYgbm90IGlzIGl0IHBvc3NpYmxlICovCisgICAgLyogdGhhdCB3ZSBnZXQgYW4gRUFQT0wgcGFja2V0IGluIFdBUEkgbW9kZSBvciB2aWNlIHZlcnNhPyAqLworICAgIGlmICggV0xBTlRMX0xMQ184MDIxWF9UWVBFICAhPSB1c0V0aGVyVHlwZSAmJiBXTEFOVExfTExDX1dBSV9UWVBFICAhPSB1c0V0aGVyVHlwZSApCisgICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiV0xBTiBUTDpGcmFtZSBub3QgRUFQT0wgb3IgV0FJIC0gZHJvcHBpbmciKSk7CisgICAgICAvKiBEcm9wIHBhY2tldCAqLworICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKKyAgICB9CisjZWxzZQorICAgIGlmICggV0xBTlRMX0xMQ184MDIxWF9UWVBFICAhPSB1c0V0aGVyVHlwZSApCisgICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiV0xBTiBUTDpGcmFtZSBub3QgRUFQT0wgLSBkcm9wcGluZyIpKTsKKyAgICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOworICAgIH0KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLworICAgIGVsc2UgLyogRnJhbWUgaXMgYW4gRUFQT0wgZnJhbWUgb3IgYSBXQUkgZnJhbWUqLyAgCisgICAgeworICAgICAgaWYgKCggMCA9PSBXREFfR0VUX1JYX0ZUX0RPTkUoYXVjQkRIZWFkZXIpICkgJiYKKyAgICAgICAgICggMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS53U1RBRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24pKQorICAgICAgeworICAgICAgaWYgKHVzTVBEVURPZmZzZXQgPiB1Y01QRFVIT2Zmc2V0KQorICAgICAgeworICAgICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CisgICAgICB9CisKKyAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsIHVzQWN0dWFsSExlbiwgCisgICAgICAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwgcFRMQ2IsIHVjU1RBSWQpOworCisgICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIAorICAgICAgICB7CisgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHRvIHRyYW5zbGF0ZSBmcm9tIDgwMi4xMSB0byA4MDIuMyAtIGRyb3BwaW5nIikpOworICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKKyAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIEluY3JlbWVudCByZWNlaXZlIGNvdW50ZXIKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXVSeENvdW50W3VjVGlkXSsrOworCisgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIldMQU4gVEw6U2VuZGluZyBFQVBvTCBmcmFtZSB0byBzdGF0aW9uICVkIEFDICVkIiwgdWNTVEFJZCwgdWNUaWQpKTsKKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAhISFBc3N1bWluZyBUSUQgPSBVUCBtYXBwaW5nIAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICB3UnhNZXRhSW5mby51Y1VQID0gdWNUaWQ7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAiV0xBTiBUTCAlczpTZW5kaW5nIGRhdGEgY2hhaW4gdG8gc3RhdGlvbiBcbiIsIF9fRlVOQ1RJT05fXykpOworICAgICAgaWYgKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2Mud1NUQVR5cGUgKQorICAgICAgeworICAgICAgICB3UnhNZXRhSW5mby51Y0Rlc1NUQUlkID0gV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQ7CisgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd1J4TWV0YUluZm8gKTsKKyAgICB9LypFQVBPTCBmcmFtZSBvciBXQUkgZnJhbWUqLworICB9Lyp2b3Mgc3RhdHVzIHN1Y2Nlc3MqLworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LyogV0xBTlRMX1NUQVJ4Q29ubiAqLworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfRndkUGt0VG9IREQKKworICBERVNDUklQVElPTgorICAgIERldGVybWluZSB0aGUgRGVzdGF0aW9uIFN0YXRpb24gSUQgYW5kIHJvdXRlIHRoZSBGcmFtZSB0byBVcHBlciBMYXllcgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCisgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSByeCB2b3MgYnVmZmVyCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK1ZPU19TVEFUVVMKK1dMQU5UTF9Gd2RQa3RUb0hERAorKAorICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgsCisgIHZvc19wa3RfdCogICAgIHB2b3NEYXRhQnVmZiwKKyAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQKKykKK3sKKyAgIHZfTUFDQUREUl90IERlc3RNYWNBZGRyZXNzOworICAgdl9NQUNBRERSX3QgKnBEZXN0TWFjQWRkcmVzcyA9ICZEZXN0TWFjQWRkcmVzczsKKyAgIHZfU0laRV90IHVzTWFjQWRkU2l6ZSA9IFZPU19NQUNfQUREUl9TSVpFOworICAgV0xBTlRMX0NiVHlwZSogICAgICAgICAgIHBUTENiID0gTlVMTDsKKyAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZiA7CisgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgU1RBTWV0YUluZm87CisgICB2b3NfcGt0X3QqICAgICAgICAgICAgICB2b3NOZXh0RGF0YUJ1ZmYgOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgdWNEZXNTVEFJZDsKKyAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSAgICB3UnhNZXRhSW5mbzsKKworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHB2b3NEYXRhQnVmZiApIHx8ICggTlVMTCA9PSAoIHZvc0RhdGFCdWZmID0gcHZvc0RhdGFCdWZmICkpKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9Gd2RQa3RUb0hkZCIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9Gd2RQa3RUb0hkZCIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisgICAvKiBUaGlzIHRoZSBjaGFuZ2UgcmVxdWlyZWQgZm9yIFNvZnRBcCB0byBoYW5kbGUgUmVvcmRlcmVkIEJ1ZmZlci4gU2luY2UgYSBTVEEKKyAgICAgIG1heSBoYXZlIHBhY2tldHMgZGVzdGluZWQgdG8gbXVsdGlwbGUgZGVzdGluYXRpb25zIHdlIGhhdmUgdG8gcHJvY2VzcyBlYWNoIHBhY2tldAorICAgICAgYXQgYSB0aW1lIGFuZCBkZXRlcm1pbmUgaXRzIERlc3RpbmF0aW9uLiBTbyB0aGUgVm9zY2hhaW4gcHJvdmlkZWQgYnkgUmVvcmRlciBjb2RlCisgICAgICBpcyB1bmNoYWluIGFuZCBmb3J3YXJkZWQgdG8gVXBwZXIgTGF5ZXIgYWZ0ZXIgRGV0ZXJtaW5pbmcgdGhlIERlc3RpbmF0aW9uICovCisKKyAgIHZvc0RhdGFCdWZmID0gcHZvc0RhdGFCdWZmOworICAgd2hpbGUgKHZvc0RhdGFCdWZmICE9IE5VTEwpCisgICB7CisgICAgICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwgJnZvc05leHREYXRhQnVmZiwgMS8qdHJ1ZSovICk7CisgICAgICB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90ICopJlNUQU1ldGFJbmZvICk7CisgICAgICB3UnhNZXRhSW5mby51Y1VQID0gKHZfVThfdCkoU1RBTWV0YUluZm8gJiBXTEFOVExfQUNfTUFTSyk7CisgICAgICB1Y0Rlc1NUQUlkID0gKCh2X1U4X3QpU1RBTWV0YUluZm8pID4+IFdMQU5UTF9TVEFJRF9PRkZTRVQ7IAorICAgICAgIAorICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc0RhdGFCdWZmLCAwLCAodl9WT0lEX3QgKilwRGVzdE1hY0FkZHJlc3MsICZ1c01hY0FkZFNpemUpOworICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgICAgIHsKKyAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiV0xBTiBUTDogcmVjdiBjb3JydXB0ZWQgZGF0YSBwYWNrZXRcbiIpKTsKKyAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CisgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgICAgfQorCisgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csInN0YXRpb24gbWFjIDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3RNYWNBZGRyZXNzLT5ieXRlc1swXSwgcERlc3RNYWNBZGRyZXNzLT5ieXRlc1sxXSwgcERlc3RNYWNBZGRyZXNzLT5ieXRlc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3RNYWNBZGRyZXNzLT5ieXRlc1szXSwgcERlc3RNYWNBZGRyZXNzLT5ieXRlc1s0XSwgcERlc3RNYWNBZGRyZXNzLT5ieXRlc1s1XSkpOworCisgICAgICBpZiAodm9zX2lzX21hY2FkZHJfYnJvYWRjYXN0KCBwRGVzdE1hY0FkZHJlc3MgKSB8fCB2b3NfaXNfbWFjYWRkcl9ncm91cChwRGVzdE1hY0FkZHJlc3MpKQorICAgICAgeworICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIGlzIG1jL2JjIHN0YXRpb24KKyAgICAgICAgICB1Y0Rlc1NUQUlkID0gV0xBTl9SWF9CQ01DX1NUQV9JRDsKKyAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBCQy9NQyBwYWNrZXQsIGlkICVkXG4iLCBfX0ZVTkNUSU9OX18sIFdMQU5fUlhfQkNNQ19TVEFfSUQpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGlmICh2b3NfaXNfbWFjYWRkcl9lcXVhbChwRGVzdE1hY0FkZHJlc3MsICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MpKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gaXMgQVAgaXRzZWxmCisgICAgICAgICAgICB1Y0Rlc1NUQUlkID0gV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQ7CisgICAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICAgICIlczogcGFja2V0IHRvIEFQIGl0c2VsZiwgaWQgJWRcbiIsIF9fRlVOQ1RJT05fXywgV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYgKCBXTEFOX01BWF9TVEFfQ09VTlQgPD0gdWNEZXNTVEFJZCApCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBkZXN0aW5hdGlvbiBzdGF0aW9uIGlzIHNvbWV0aGluZyBlbHNlCisgICAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgIiVzOiBnZXQgYW4gc3RhdGlvbiBpbmRleCBsYXJnZXIgdGhhbiBXTEFOX01BWF9TVEFfQ09VTlQgJWRcbiIsIF9fRlVOQ1RJT05fXywgdWNEZXNTVEFJZCkpOworICAgICAgICAgICAgdWNEZXNTVEFJZCA9IFdMQU5fUlhfU0FQX1NFTEZfU1RBX0lEOworICAgICAgICAgfQorCisgICAgICAgICAKKyAgICAgICAgIC8vbG9vcGJhY2sgdW5pY2FzdCBzdGF0aW9uIGNvbWVzIGhlcmUKKyAgICAgIH0KKworICAgICAgd1J4TWV0YUluZm8udWNVUCA9ICh2X1U4X3QpKFNUQU1ldGFJbmZvICYgV0xBTlRMX0FDX01BU0spOworICAgICAgd1J4TWV0YUluZm8udWNEZXNTVEFJZCA9IHVjRGVzU1RBSWQ7CisgICAgIAorICAgdm9zU3RhdHVzID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucGZuU1RBUngoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiwgdWNEZXNTVEFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CisgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgIHsKKyAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXTEFOIFRMOiBmYWlsZWQgdG8gc2VuZCBwa3QgdG8gSEREIFxuIikpOworICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOworICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgfQorICAgICAgdm9zRGF0YUJ1ZmYgPSB2b3NOZXh0RGF0YUJ1ZmY7CisgICB9CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8qIFdMQU5UTF9TT0ZUQVBfRkVBVFVSRSAqLyAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfU1RBUnhBdXRoCisKKyAgREVTQ1JJUFRJT04KKyAgICBSZWNlaXZlIGluIGF1dGhlbnRpY2F0ZWQgc3RhdGUgLSBhbGwgZGF0YSBhbGxvd2VkCisKKyAgREVQRU5ERU5DSUVTCisgICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgorCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCisgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSByeCB2b3MgYnVmZmVyCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfU1RBUnhBdXRoCisoCisgIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCisgIHZfVThfdCAgICAgICAgdWNTVEFJZCwKKyAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYKKykKK3sKKyAgIFdMQU5UTF9DYlR5cGUqICAgICAgICAgICBwVExDYiA9IE5VTEw7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNBc2Y7IC8qIEFNU0RVIHN1YiBmcmFtZSAqLworICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKKyAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVMZW47CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSExlbjsKKyAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0FjdHVhbEhMZW4gPSAwOyAgIAorICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjVGlkOworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGU7CisjZW5kaWYKKyAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c1BrdExlbjsKKyAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZiA7CisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgYXVjQkRIZWFkZXI7CisgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzOworICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlICAgIHdSeE1ldGFJbmZvOworICAgc3RhdGljIHZfVThfdCAgICAgICAgICAgIHVjUE1QRFVITGVuID0gMDsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICB2X1U4X3QqICAgICAgICAgICAgICAgICAgU1RBTWV0YUluZm9QdHI7CisjZW5kaWYKKyNpZmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y0VzZj0wOyAvKiBmaXJzdCBzdWJmcmFtZSBvZiBBTVNEVSBmbGFnICovCisgICB2X1U2NF90ICAgICAgICAgICAgICAgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXI9MDsgLypjdXJyZW50IHJlcGxheSBjb3VudGVyKi8KKyAgIHZfVTY0X3QgICAgICAgICAgICAgICAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXI9MDsgLypwcmV2aW91cyByZXBsYXkgY291bnRlciovCisgICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdWNVbmljYXN0QnJvYWRjYXN0VHlwZT0wOyAvKkl0IGRlbm90ZXMgd2hldGhlciByZWNlaXZlZCBmcmFtZSBpcyBVQyBvciBCQyovCisjZW5kaWYKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeEF1dGgiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU1RBUnhBdXRoIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgQkQgaGVhZGVyIGFuZCBjaGVjayBpZiB2YWxpZAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHZvc0RhdGFCdWZmLCAodl9QVk9JRF90KSZhdWNCREhlYWRlciwgMCApOworCisgIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKKyAgdXNNUERVRE9mZnNldCA9ICh2X1UxNl90KVdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChhdWNCREhlYWRlcik7CisgIHVzTVBEVUxlbiAgICAgPSAodl9VMTZfdClXREFfR0VUX1JYX01QRFVfTEVOKGF1Y0JESGVhZGVyKTsKKyAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4oYXVjQkRIZWFkZXIpOworICB1Y1RpZCAgICAgICAgID0gKHZfVThfdClXREFfR0VUX1JYX1RJRChhdWNCREhlYWRlcik7CisKKyNpZmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKyAgLypIb3N0IGJhc2VkIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgZm9yIHVuaWNhc3QgZGF0YSBmcmFtZXMqLworICB1Y1VuaWNhc3RCcm9hZGNhc3RUeXBlICA9ICh2X1UxNl90KVdEQV9JU19SWF9CQ0FTVChhdWNCREhlYWRlcik7CisjZW5kaWYKKyAgaWYoMCAhPSB1Y01QRFVITGVuKQorICB7CisgICAgdWNQTVBEVUhMZW4gPSB1Y01QRFVITGVuOworICB9CisKKyAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgcHJvY2Vzc2luZyBkYXRhOiBITyAlZCBETyAlZCBMZW4gJWQgSExlbiAlZCIKKyAgICAgICAgICAgICAiIFRpZCAlZCBCRCAlZCIsCisgICAgICAgICAgICAgdWNNUERVSE9mZnNldCwgdXNNUERVRE9mZnNldCwgdXNNUERVTGVuLCB1Y01QRFVITGVuLCB1Y1RpZCwKKyAgICAgICAgICAgICBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFKSk7CisKKyAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsICZ1c1BrdExlbik7CisKKyAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX1RyaW1SeFBhY2tldEluZm8oIHZvc0RhdGFCdWZmICkgKQorICB7CisgICAgaWYoKFdEQV9HRVRfUlhfQVNGKGF1Y0JESGVhZGVyKSAmJiAhV0RBX0dFVF9SWF9FU0YoYXVjQkRIZWFkZXIpKSkKKyAgeworICAgIC8qIEFNU0RVIGNhc2UsIHVjTVBEVUhPZmZzZXQgPSAwCisgICAgICogaXQgc2hvdWxkIGJlIGhhbmNkbGVkIHNlcGVyYXRseSAqLworICAgIGlmKCggdXNNUERVRE9mZnNldCA+ICB1Y01QRFVIT2Zmc2V0ICkgJiYKKyAgICAgICAoIHVzTVBEVUxlbiAgICAgPj0gdWNNUERVSExlbiApICYmICggdXNQa3RMZW4gPj0gdXNNUERVTGVuICkgJiYKKyAgICAgICAoICFXTEFOVExfVElEX0lOVkFMSUQodWNUaWQpICkpCisgICAgeworICAgICAgICB1Y01QRFVIT2Zmc2V0ID0gdXNNUERVRE9mZnNldCAtIFdMQU5UTF9NUERVX0hFQURFUl9MRU47IAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgY29ycnVwdGVkIC0gZHJvcHBpbmcgcGFja2V0IikpOworICAgICAgLyogRHJvcCBwYWNrZXQgKi8KKyAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgY29ycnVwdGVkIC0gZHJvcHBpbmcgcGFja2V0IikpOworICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICB9CisgIH0KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCisgIGlmICggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNJc1dhcGlTdGEgKQorICB7CisgICAgdm9zU3RhdHVzID0gV0xBTlRMX0dldEV0aGVyVHlwZShhdWNCREhlYWRlciwgdm9zRGF0YUJ1ZmYsIHVjTVBEVUhMZW4sICZ1c0V0aGVyVHlwZSk7CisgICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKKyAgICB7CisgICAgICBpZiAoIFdMQU5UTF9MTENfV0FJX1RZUEUgID09IHVzRXRoZXJUeXBlICkKKyAgICAgIHsgICAgICAgIAorICAgICAgICBpZiAoICEoIFdMQU5IQUxfUlhfSVNfVU5QUk9URUNURURfV1BJX0ZSQU1FKGF1Y0JESGVhZGVyKSkgKQorICAgICAgICB7CisgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6V0FJIGZyYW1lIHdhcyByZWNlaXZlZCBlbmNyeXB0ZWQgLSBkcm9wcGluZyIpKTsKKyAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLworICAgICAgICAgIC8qVGVtcG9yYXJ5IGZpeCBhZGRlZCB0byBmaXggd2FwaSByZWtleSBpc3N1ZSovCisgICAgICAgICAgLy92b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOworICAgICAgICAgIC8vcmV0dXJuIHZvc1N0YXR1czsgLy9yZXR1cm5pbmcgc3VjY2VzcworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICggIFdMQU5IQUxfUlhfSVNfVU5QUk9URUNURURfV1BJX0ZSQU1FKGF1Y0JESGVhZGVyKSApIAorICAgICAgICB7CisgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Tm9uLVdBSSBmcmFtZSB3YXMgcmVjZWl2ZWQgdW5lbmNyeXB0ZWQgLSBkcm9wcGluZyIpKTsKKyAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLworICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7IAorICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7IC8vcmV0dXJuaW5nIHN1Y2Nlc3MKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vY291bGQgbm90IGV4dHJhY3QgRXRoZXJUeXBlIC0gdGhpcyBzaG91bGQgbm90IGhhcHBlbgorICAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q291bGQgbm90IGV4dHJhY3QgRXRoZXJUeXBlIC1kcm9wcGluZyBmcmFtZSIpKTsKKyAgICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOyAKKyAgICAgIHJldHVybiB2b3NTdGF0dXM7IC8vcmV0dXJuaW5nIGZhaWx1cmUKKyAgICAgICAgCisgICAgfQorICB9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJbmNyZW1lbnQgcmVjZWl2ZSBjb3VudGVyCisgICAgISEgbm90IHN1cmUgdGhpcyBpcyB0aGUgYmVzdCBwbGFjZSB0byBpbmNyZWFzZSB0aGlzIC0gcGt0IG1pZ2h0IGJlCisgICAgZHJvcHBlZCBiZWxvdyBvciBkZWxheWVkIGluIFRMJ3MgcXVldWVzCisgICAgLSB3aWxsIGxlYXZlIGl0IGhlcmUgZm9yIG5vdworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXVSeENvdW50W3VjVGlkXSsrOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgQU1TRFUgYW5kIHNlbmQgZm9yIHByb2Nlc3NpbmcgaWYgc28KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVjQXNmID0gKHZfVThfdClXREFfR0VUX1JYX0FTRihhdWNCREhlYWRlcik7CisKKyAgaWYgKCAwICE9IHVjQXNmICkKKyAgeworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpQYWNrZXQgaXMgQU1TRFUgc3ViIGZyYW1lIC0gc2VuZGluZyBmb3IgY29tcGxldGlvbiIpKTsKKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfQU1TRFVQcm9jZXNzKCBwdm9zR0N0eCwgJnZvc0RhdGFCdWZmLCBhdWNCREhlYWRlciwgdWNTVEFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCB1c01QRFVMZW4gKTsKKyAgICBpZihOVUxMID09IHZvc0RhdGFCdWZmKQorICAgIHsKKyAgICAgICAvL1BhY2tldCBpcyBhbHJhZHkgZnJlZWQKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgIH0KKyAgfQorICAvKiBBZnRlciBBTVNEVSBoZWFkZXIgaGFuZGxlZAorICAgKiBBTVNEVSBmcmFtZSBqdXN0IHNhbWUgd2l0aCBub3JtYWwgZnJhbWVzICovCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBUcmFuc2xhdGluZyBoZWFkZXIgaWYgbmVjZXNhcnkKKyAgICAgICAhISBGaXggbWU6IHJtdiBjb21tZW50cyBiZWxvdworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikgKSAmJgorICAgICAgKCAwICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbikgJiYKKyAgICAgICggV0xBTlRMX0lTX0RBVEFfRlJBTUUoV0RBX0dFVF9SWF9UWVBFX1NVQlRZUEUoYXVjQkRIZWFkZXIpKSApKQorICB7CisgICAgaWYoMCA9PSB1Y01QRFVITGVuKQorICAgIHsKKyAgICAgIHVjTVBEVUhMZW4gPSB1Y1BNUERVSExlbjsKKyAgICB9CisgICAgaWYgKHVzTVBEVURPZmZzZXQgPiB1Y01QRFVIT2Zmc2V0KQorICAgIHsKKyAgICAgIHVzQWN0dWFsSExlbiA9IHVzTVBEVURPZmZzZXQgLSB1Y01QRFVIT2Zmc2V0OworICAgIH0KKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLCB1c0FjdHVhbEhMZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwgcFRMQ2IsIHVjU1RBSWQpOworCisgICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQorICAgICAgeworICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gdHJhbnNsYXRlIGZyb20gODAyLjExIHRvIDgwMi4zIC0gZHJvcHBpbmciKSk7CisgICAgICAgIC8qIERyb3AgcGFja2V0ICovCisgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CisgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CisgICAgICB9CisgICAgfQorICAgIC8qIFNvZnRhcCByZXF1aXJlcyBhZGRpdGlvbmFsIEluZm8gc3VjaCBhcyBEZXN0aW5hdGlvbiBTVEFJRCBhbmQgQWNjZXNzCisgICAgICAgQ2F0ZWdvcnkuIFZvc2NoYWluIG9yIEJ1ZmZlciByZXR1cm5lZCBieSBCQSB3b3VsZCBiZSB1bmNoYWluIGFuZCB0aGlzCisgICAgICAgTWV0YSBEYXRhIHdvdWxkIGhlbHAgaW4gcm91dGluZyB0aGUgcGFja2V0cyB0byBhcHByb3ByaWF0ZSBEZXN0aW5hdGlvbiAqLworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBpZiggV0xBTl9TVEFfU09GVEFQID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLndTVEFUeXBlKQorICAgIHsKKyAgICAgICBTVEFNZXRhSW5mb1B0ciA9ICh2X1U4X3QgKikodWNUaWQgfCAoV0RBX0dFVF9SWF9BRERSM19JRFgoYXVjQkRIZWFkZXIpIDw8IFdMQU5UTF9TVEFJRF9PRkZTRVQpKTsKKyAgICAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KVNUQU1ldGFJbmZvUHRyKTsKKyAgICB9CisjZW5kaWYKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIHRvIHNlZSBpZiByZS1vcmRlcmluZyBzZXNzaW9uIGlzIGluIHBsYWNlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXRsQkFSZW9yZGVySW5mb1t1Y1RpZF0udWNFeGlzdHMgKQorICB7CisgICAgV0xBTlRMX01TRFVSZW9yZGVyKCBwVExDYiwgJnZvc0RhdGFCdWZmLCBhdWNCREhlYWRlciwgdWNTVEFJZCwgdWNUaWQgKTsKKyAgfQorCisjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TCitpZigwID09IHVjVW5pY2FzdEJyb2FkY2FzdFR5cGUKKyNpZmRlZiBGRUFUVVJFX09OX0NISVBfUkVPUkRFUklORworICAgJiYgKFdMQU5IQUxfSXNPbkNoaXBSZW9yZGVyaW5nRW5hYmxlZEZvclRJRChwdm9zR0N0eCwgdWNTVEFJZCwgdWNUaWQpICE9IFRSVUUpCisjZW5kaWYKKykKK3sKKyAgLyogcmVwbGF5IGNoZWNrIGNvZGUgOiBjaGVjayB3aGV0aGVyIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgb3Igbm90ICovCisgIGlmKFZPU19UUlVFID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjSXNSZXBsYXlDaGVja1ZhbGlkKQorICB7CisgICAgICAvKiByZXBsYXkgY2hlY2sgaXMgbmVlZGVkIGZvciB0aGUgc3RhdGlvbiAqLworCisgICAgICAvKiBjaGVjayB3aGV0aGVyIGZyYW1lIGlzIEFNU0RVIGZyYW1lICovCisgICAgICBpZiAoIDAgIT0gdWNBc2YgKQorICAgICAgeworICAgICAgICAgIC8qIFNpbmNlIHZpcmdvIGNhbid0IHNlbmQgQU1TRFUgZnJhbWVzIHRoaXMgbGVnIG9mIHRoZSBjb2RlIAorICAgICAgICAgICAgIHdhcyBub3QgdGVzdGVkIHByb3Blcmx5LCBpdCBuZWVkcyB0byBiZSB0ZXN0ZWQgcHJvcGVybHkqLworICAgICAgICAgIC8qIEZyYW1lIGlzIEFNU0RVIGZyYW1lLiBBcyBwZXIgODAyLjExbiBvbmx5IGZpcnN0CisgICAgICAgICAgICAgc3ViZnJhbWUgd2lsbCBoYXZlIHJlcGxheSBjb3VudGVyICovCisgICAgICAgICAgdWNFc2YgPSAgV0RBX0dFVF9SWF9FU0YoIGF1Y0JESGVhZGVyICk7CisgICAgICAgICAgaWYoIDAgIT0gdWNFc2YgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdl9CT09MX3Qgc3RhdHVzOworICAgICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCByZXBsYXkgY291bnRlciBmcm9tIHRoZSBSWCBCRCAqLworICAgICAgICAgICAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IFdEQV9EU19HZXRSZXBsYXlDb3VudGVyKGF1Y0JESGVhZGVyKTsKKyAKKyAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICJXTEFOIFRMOiBBTVNEVSBjdXJyZW50UmVwbGF5Q291bnRlciBbMHglbGxYXVxuIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCBwcmV2aW91cyByZXBsYXkgY291bnRlciBmcm9tIFRMIGNvbnRyb2wgIGJsb2NrICovCisgICAgICAgICAgICAgIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlciA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdOworCisgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgcHJldmlvdXNSZXBsYXlDb3VudGVyIFsweCVsbFhdXG4iLHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CisKKyAgICAgICAgICAgICAgLyogSXQgaXMgZmlyc3Qgc3ViZnJhbWUgb2YgQU1TRFUgdGh1cyBpdAorICAgICAgICAgICAgICAgICBjb25hdGFpbnMgcmVwbGF5IGNvdW50ZXIgcGVyZm9ybSB0aGUKKyAgICAgICAgICAgICAgICAgcmVwbGF5IGNoZWNrIGZvciB0aGlzIGZpcnN0IHN1YmZyYW1lKi8KKyAgICAgICAgICAgICAgc3RhdHVzID0gIFdMQU5UTF9Jc1JlcGxheVBhY2tldCggdWxsY3VycmVudFJlcGxheUNvdW50ZXIsIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CisgICAgICAgICAgICAgIGlmKFZPU19GQUxTRSA9PSBzdGF0dXMpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAvKiBOb3QgYSByZXBsYXkgcGFrZXQsIHVwZGF0ZSBwcmV2aW91cyByZXBsYXkgY291bnRlciBpbiBUTCBDQiAqLyAgICAKKyAgICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgRHJvcCB0aGUgcmVwbGF5IHBhY2tldCB3aXRoIFBOIDogWzB4JWxsWF1cbiIsdWxsY3VycmVudFJlcGxheUNvdW50ZXIpOworCisgICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CisgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBBTVNEVSB0b3RhbCBkcm9wcGVkIHJlcGxheSBwYWNrZXRzIG9uIFNUQSBJRCAgJVggaXMgWzB4JWxYXVxuIiwKKyAgICAgICAgICAgICAgICAgIHVjU1RBSWQsICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgLyogRHJvcCB0aGUgcGFja2V0ICovCisgICAgICAgICAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICAgdl9CT09MX3Qgc3RhdHVzOworCisgICAgICAgICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCisgICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gV0RBX0RTX0dldFJlcGxheUNvdW50ZXIoYXVjQkRIZWFkZXIpOworCisgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIldMQU4gVEw6IE5vbi1BTVNEVSBjdXJyZW50UmVwbGF5Q291bnRlciBbMHglbGxYXVxuIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CisKKyAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgZnJvbSBUTCBjb250cm9sICBibG9jayAqLworICAgICAgICAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51bGxSZXBsYXlDb3VudGVyW3VjVGlkXTsKKworICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vbi1BTVNEVSBwcmV2aW91c1JlcGxheUNvdW50ZXIgWzB4JWxsWF1cbiIsdWxscHJldmlvdXNSZXBsYXlDb3VudGVyKTsKKworICAgICAgICAgICAvKiBJdCBpcyBub3QgQU1TRFUgZnJhbWUgc28gcGVyZm9ybSAKKyAgICAgICAgICAgICAgcmVhcGx5IGNoZWNrIGZvciBlYWNoIHBhY2tldCwgYXMKKyAgICAgICAgICAgICAgZWFjaCBwYWNrZXQgY29udGFpbnMgdmFsaWQgcmVwbGF5IGNvdW50ZXIqLyAKKyAgICAgICAgICAgc3RhdHVzID0gIFdMQU5UTF9Jc1JlcGxheVBhY2tldCggdWxsY3VycmVudFJlcGxheUNvdW50ZXIsIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CisgICAgICAgICAgIGlmKFZPU19GQUxTRSA9PSBzdGF0dXMpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBOb3QgYSByZXBsYXkgcGFrZXQsIHVwZGF0ZSBwcmV2aW91cyByZXBsYXkgY291bnRlciBpbiBUTCBDQiAqLyAgICAKKyAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOiBOb24tQU1TRFUgRHJvcCB0aGUgcmVwbGF5IHBhY2tldCB3aXRoIFBOIDogWzB4JWxsWF1cbiIsdWxsY3VycmVudFJlcGxheUNvdW50ZXIpOworCisgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIHRvdGFsIGRyb3BwZWQgcmVwbGF5IHBhY2tldHMgb24gU1RBIElEICVYIGlzIFsweCVsWF1cbiIsCisgICAgICAgICAgICAgICAgdWNTVEFJZCwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWxUb3RhbFJlcGxheVBhY2tldHNEZXRlY3RlZCk7CisKKyAgICAgICAgICAgICAgIC8qIFJlcGFseSBwYWNrZXQsIGRyb3AgdGhlIHBhY2tldCAqLworICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKKyAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorfQorLypJdCBpcyBhIGJyb2FkYXN0IHBhY2tldCBEUFUgaGFzIGFscmVhZHkgZG9uZSByZXBsYXkgY2hlY2sgZm9yIAorICBicm9hZGNhc3QgcGFja2V0cyBubyBuZWVkIHRvIGRvIHJlcGxheSBjaGVjayBvZiB0aGVzZSBwYWNrZXRzKi8KKyNlbmRpZiAvKkVuZCBvZiAjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TKi8KKworICBpZiAoIE5VTEwgIT0gdm9zRGF0YUJ1ZmYgKQorICB7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2Mud1NUQVR5cGUpCisgICAgeworICAgICAgV0xBTlRMX0Z3ZFBrdFRvSEREKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgd1J4TWV0YUluZm8udWNVUCA9IHVjVGlkOworICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucGZuU1RBUngoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiwgdWNTVEFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CisgICAgfQorICB9LyogaWYgbm90IE5VTEwgKi8KKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9TVEFSeEF1dGggKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeERpc2MKKworICBERVNDUklQVElPTgorICAgIFJlY2VpdmUgaW4gZGlzY29ubmVjdGVkIHN0YXRlIC0gbm8gZGF0YSBhbGxvd2VkCisKKyAgREVQRU5ERU5DSUVTCisgICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgorCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCisgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSByeCB2b3MgYnVmZmVyCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfU1RBUnhEaXNjCisoCisgIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCisgIHZfVThfdCAgICAgICAgdWNTVEFJZCwKKyAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYKKykKK3sKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICAqcHZvc0RhdGFCdWZmICkpCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1NUQVJ4RGlzYyIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFcnJvciAtIGRyb3AgcGFja2V0CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIldMQU4gVEw6UGFja2V0IHNob3VsZCBub3QgYmUgcmVjZWl2ZWQgaW4gc3RhdGUgZGlzY29ubmVjdGVkIgorICAgICAgICAgICAgICIgLSBkcm9wcGluZyIpKTsKKyAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCpwdm9zRGF0YUJ1ZmYpOworICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9TVEFSeERpc2MgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUHJvY2Vzc2luZyBtYWluIGxvb3BzIGZvciBNQUlOIGFuZCBUWCB0aHJlYWRzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfTWNQcm9jZXNzTXNnCisKKyAgREVTQ1JJUFRJT04KKyAgICBDYWxsZWQgYnkgVk9TUyB3aGVuIGEgbWVzc2FnZSB3YXMgc2VyaWFsaXplZCBmb3IgVEwgdGhyb3VnaCB0aGUKKyAgICBtYWluIHRocmVhZC90YXNrLgorCisgIERFUEVOREVOQ0lFUworICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgbWVzc2FnZTogICAgICAgIHR5cGUgYW5kIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UKKworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX01jUHJvY2Vzc01zZworKAorICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAorICB2b3NfbXNnX3QqICAgICAgIG1lc3NhZ2UKKykKK3sKKyAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CisgICB0QWRkQkFJbmQqICAgICAgcHRBZGRCYUluZCA9IE5VTEw7CisgICB0RGVsQkFJbmQqICAgICAgcHREZWxCYUluZCA9IE5VTEw7CisgICB0QWRkQkFSc3AqICAgICAgcHRBZGRCYVJzcCA9IE5VTEw7CisgICB2b3NfbXNnX3QgICAgICAgdm9zTWVzc2FnZTsKKyAgIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXM7CisgICB0cEZsdXNoQUNSc3AgRmx1c2hBQ1JzcFB0cjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggTlVMTCA9PSBtZXNzYWdlICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1Byb2Nlc3NNYWluTWVzc2FnZSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9Qcm9jZXNzTWFpbk1lc3NhZ2UiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICJXTEFOIFRMOlJlY2VpdmVkIG1lc3NhZ2U6ICVkIHRocm91Z2ggbWFpbiBmbG93IiwgbWVzc2FnZS0+dHlwZSkpOworCisgIHN3aXRjaCggbWVzc2FnZS0+dHlwZSApCisgIHsKKyAgY2FzZSBXREFfVExfRkxVU0hfQUNfUlNQOgorICAgIC8vIEV4dHJhY3QgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBib2R5CisgICAgRmx1c2hBQ1JzcFB0ciA9ICh0cEZsdXNoQUNSc3ApKG1lc3NhZ2UtPmJvZHlwdHIpOworICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2FsbCBiYWNrIGZ1bmN0aW9uIGlzIG5vdCBudWxsLgorICAgIFZPU19BU1NFUlQocFRMQ2ItPnRsQkFQQ2xpZW50LnBmbkZsdXNoT3BDb21wbGV0ZUNiICE9IE5VTEwpOworCisgICAgVExMT0cyKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIlJlY2VpdmVkIG1lc3NhZ2U6ICBGbHVzaCBjb21wbGV0ZSByZWNlaXZlZCBieSBUTCIpKTsKKworICAgIC8vIFNpbmNlIHdlIGhhdmUgdGhlIHJlc3BvbnNlIGJhY2sgZnJvbSBIQUwsIGp1c3QgY2FsbCB0aGUgQkFQIGNsaWVudAorICAgIC8vIHJlZ2lzdGVyZWQgY2FsbCBiYWNrIGZyb20gVEwuIFRoZXJlIGlzIG9ubHkgMSBwb3NzaWJsZQorICAgIC8vIEJBUCBjbGllbnQuIFNvIGRpcmVjdGx5IHJlZmVyZW5jZSB0bEJBUENsaWVudAorICAgIHBUTENiLT50bEJBUENsaWVudC5wZm5GbHVzaE9wQ29tcGxldGVDYiggcHZvc0dDdHgsCisgICAgICAgICAgICBGbHVzaEFDUnNwUHRyLT51Y1NUQUlkLAorICAgICAgICAgICAgRmx1c2hBQ1JzcFB0ci0+dWNUaWQsIEZsdXNoQUNSc3BQdHItPnN0YXR1cyApOworCisgICAgLy8gRnJlZSB0aGUgUEFMIG1lbW9yeSwgd2UgYXJlIGRvbmUgd2l0aCBpdC4KKyAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICJGbHVzaCBjb21wbGV0ZSByZWNlaXZlZCBieSBUTDogRnJlZWluZyAlcCIsIEZsdXNoQUNSc3BQdHIpKTsKKyAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICopRmx1c2hBQ1JzcFB0cik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBXREFfSEREX0FEREJBX1JFUToKKyAgIHB0QWRkQmFJbmQgPSAodEFkZEJBSW5kKikobWVzc2FnZS0+Ym9keXB0cik7CisgICAgdm9zU3RhdHVzID0gV0xBTlRMX0JhU2Vzc2lvbkFkZCggcHZvc0dDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEFkZEJhSW5kLT5iYVNlc3Npb24uYmFTZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLlNUQUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5iYVRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1UzMl90KXB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5iYUJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEFkZEJhSW5kLT5iYVNlc3Npb24ud2luU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5TU04pOworICAgIHB0QWRkQmFSc3AgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YoKnB0QWRkQmFSc3ApKTsKKworICAgIGlmICggTlVMTCA9PSBwdEFkZEJhUnNwICkKKyAgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gVEw6IGZhdGFsIGZhaWx1cmUsIGNhbm5vdCBhbGxvY2F0ZSBCQSBSc3Agc3RydWN0dXJlIikpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgfQorCisgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzICkKKyAgICB7CisgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICJXTEFOIFRMOiBTZW5kaW5nIHN1Y2Nlc3MgaW5kaWNhdGlvbiB0byBIQUwgZm9yIEFERCBCQSIpKTsKKyAgICAgIC8qU2VuZCBzdWNjZXNzKi8KKyAgICAgIHB0QWRkQmFSc3AtPm1lc2dUeXBlICAgID0gV0RBX0hERF9BRERCQV9SU1A7CisgICAgICB2b3NNZXNzYWdlLnR5cGUgICAgICAgICA9IFdEQV9IRERfQUREQkFfUlNQOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFNlbmRpbmcgZmFpbHVyZSBpbmRpY2F0aW9uIHRvIEhBTCBmb3IgQUREIEJBIikpOworCisgICAgICAvKlNlbmQgZmFpbHVyZSovCisgICAgICBwdEFkZEJhUnNwLT5tZXNnVHlwZSAgICA9IFdEQV9CQV9GQUlMX0lORDsKKyAgICAgIHZvc01lc3NhZ2UudHlwZSAgICAgICAgID0gV0RBX0JBX0ZBSUxfSU5EOworICAgIH0KKworICAgIHB0QWRkQmFSc3AtPm1lc2dMZW4gICAgID0gc2l6ZW9mKHRBZGRCQVJzcCk7CisgICAgcHRBZGRCYVJzcC0+YmFTZXNzaW9uSUQgPSBwdEFkZEJhSW5kLT5iYVNlc3Npb24uYmFTZXNzaW9uSUQ7CisgICAgICAvKiBUaGlzIGlzIGRlZmF1bHQsIHJlcGx5IHdpbiBzaXplIGhhcyB0byBiZSBoYW5kbGVkIEJBIG1vZHVsZSwgRklYIFRISVMgKi8KKyAgICAgIHB0QWRkQmFSc3AtPnJlcGx5V2luU2l6ZSA9IFdMQU5UTF9NQVhfV0lOU0laRTsKKyAgICB2b3NNZXNzYWdlLmJvZHlwdHIgPSBwdEFkZEJhUnNwOworCisgICAgdm9zX21xX3Bvc3RfbWVzc2FnZSggVk9TX01RX0lEX1dEQSwgJnZvc01lc3NhZ2UgKTsKKyAgICBXTEFOVExfTWNGcmVlTXNnIChwdm9zR0N0eCwgbWVzc2FnZSk7CisgIGJyZWFrOworICBjYXNlIFdEQV9ERUxFVEVCQV9JTkQ6CisgICAgcHREZWxCYUluZCA9ICh0RGVsQkFJbmQqKShtZXNzYWdlLT5ib2R5cHRyKTsKKyAgICB2b3NTdGF0dXMgID0gV0xBTlRMX0JhU2Vzc2lvbkRlbChwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPnN0YUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPmJhVElEKTsKKworICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIGRlbCBCQSBzZXNzaW9uIFNUQTolZCBUSUQ6JWQgU3RhdHVzIDolZCIsCisgICAgICAgICAgICAgICBwdERlbEJhSW5kLT5zdGFJZHgsCisgICAgICAgICAgICAgICBwdERlbEJhSW5kLT5iYVRJRCwKKyAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOworICAgIH0KKyAgICBXTEFOVExfTWNGcmVlTXNnIChwdm9zR0N0eCwgbWVzc2FnZSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgLypubyBwcm9jZXNzaW5nIGZvciBub3cqLworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOVExfUHJvY2Vzc01haW5NZXNzYWdlICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlRMX01jRnJlZU1zZworCisgIERFU0NSSVBUSU9OCisgICAgQ2FsbGVkIGJ5IFZPU1MgdG8gZnJlZSBhIGdpdmVuIFRMIG1lc3NhZ2Ugb24gdGhlIE1haW4gdGhyZWFkIHdoZW4gdGhlcmUKKyAgICBhcmUgbWVzc2FnZXMgcGVuZGluZyBpbiB0aGUgcXVldWUgd2hlbiB0aGUgd2hvbGUgc3lzdGVtIGlzIGJlZW4gcmVzZXQuCisgICAgRm9yIG5vdywgVEwgZG9lcyBub3QgYWxsb2NhdGUgYW55IGJvZHkgc28gdGhpcyBmdW5jdGlvbiBzaG91dCB0cmFuc2xhdGUKKyAgICBpbnRvIGEgTk9PUAorCisgIERFUEVOREVOQ0lFUworICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgbWVzc2FnZTogICAgICAgIHR5cGUgYW5kIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UKKworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX01jRnJlZU1zZworKAorICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAorICB2b3NfbXNnX3QqICAgICAgIG1lc3NhZ2UKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gbWVzc2FnZSApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9NY0ZyZWVNc2ciKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfTWNGcmVlTXNnIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIG1haW4gZnJlZSIsIG1lc3NhZ2UtPnR5cGUpKTsKKworICBzd2l0Y2goIG1lc3NhZ2UtPnR5cGUgKQorICB7CisgIGNhc2UgV0RBX0hERF9BRERCQV9SRVE6CisgIGNhc2UgV0RBX0RFTEVURUJBX0lORDoKKyAgICAvKnZvcyBmcmVlIGJvZHkgcG9pbnRlciovCisgICAgdm9zX21lbV9mcmVlKG1lc3NhZ2UtPmJvZHlwdHIpOworICAgIG1lc3NhZ2UtPmJvZHlwdHIgPSBOVUxMOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIC8qbm8gcHJvY2Vzc2luZyBmb3Igbm93Ki8KKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9LypXTEFOVExfTWNGcmVlTXNnKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfVHhQcm9jZXNzTXNnCisKKyAgREVTQ1JJUFRJT04KKyAgICBDYWxsZWQgYnkgVk9TUyB3aGVuIGEgbWVzc2FnZSB3YXMgc2VyaWFsaXplZCBmb3IgVEwgdGhyb3VnaCB0aGUKKyAgICB0eCB0aHJlYWQvdGFzay4KKworICBERVBFTkRFTkNJRVMKKyAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCisKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIE90aGVyIHZhbHVlcyBjYW4gYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCBwbGVhc2UgY2hlY2sKKyAgY29ycmVzcG9uZGluZyBBUEkgZm9yIG1vcmUgaW5mby4KKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1R4UHJvY2Vzc01zZworKAorICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAorICB2b3NfbXNnX3QqICAgICAgIG1lc3NhZ2UKKykKK3sKKyAgIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB2X1UzMl90ICAgICAgICAgdURhdGE7CisgICB2X1U4X3QgICAgICAgICAgdWNTVEFJZDsgCisgICB2X1U4X3QgICAgICAgICAgdWNVY2FzdFNpZzsKKyAgIHZfVThfdCAgICAgICAgICB1Y0JjYXN0U2lnOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CisgICBXTEFOVExfQUNFbnVtVHlwZSAgICB1Y0FDOworI2VuZGlmCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQpOworICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0OworI2VuZGlmCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gbWVzc2FnZSApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9Qcm9jZXNzVHhNZXNzYWdlIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFByb2Nlc3MgbWVzc2FnZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIHR4IGZsb3ciLCBtZXNzYWdlLT50eXBlKSk7CisKKyAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKKyAgeworICBjYXNlIFdMQU5UTF9UWF9TSUdfU1VTUEVORDoKKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfU3VzcGVuZENCKCBwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfU3VzcGVuZENCVHlwZSltZXNzYWdlLT5ib2R5cHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+cmVzZXJ2ZWQpOworICAgIGJyZWFrOworICBjYXNlIFdMQU5UTF9UWF9SRVNfTkVFREVEOgorICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRUeFJlc291cmNlc0NCKCBwdm9zR0N0eCApOworICAgICBicmVhazsKKyAgCisgIGNhc2UgV0xBTlRMX1RYX0ZXRF9DQUNIRUQ6CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgVGhlIGRhdGEgc2VudCB3aXRoIHRoZSBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTogCisgICAgICAgfCAwMCB8IHVjQmNhc3RTaWduYXR1cmUgfCB1Y1VjYXN0U2lnbmF0dXJlIHwgdWNTVEFJRCB8CisgICAgICAgZWFjaCBmaWVsZCBhYm92ZSBpcyBvbmUgYnl0ZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgdURhdGEgICAgICAgPSAodl9VMzJfdCltZXNzYWdlLT5ib2R5cHRyOyAKKyAgICB1Y1NUQUlkICAgICA9ICggdURhdGEgJiAweDAwMDAwMEZGKTsgCisgICAgdWNVY2FzdFNpZyAgPSAoIHVEYXRhICYgMHgwMDAwRkYwMCk+Pjg7IAorICAgIHVjQmNhc3RTaWcgID0gKHZfVThfdCkoKCB1RGF0YSAmIDB4MDBGRjAwMDApPj4xNik7IAorICAgIHZvc1N0YXR1cyAgID0gV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMoIHB2b3NHQ3R4LCB1Y1NUQUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1VjYXN0U2lnLCB1Y0JjYXN0U2lnKTsKKyAgICBicmVhazsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgIGNhc2UgV0xBTlRMX1RYX1NUQUlEX0FDX0lORDoKKyAgICAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICAgICAgeworICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU1RBUGt0UGVuZGluZyIpKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICB9CisKKyAgICAgIHVjQUMgPSBtZXNzYWdlLT5ib2R5dmFsICYgIFdMQU5UTF9BQ19NQVNLOworICAgICAgdWNTVEFJZCA9ICh2X1U4X3QpbWVzc2FnZS0+Ym9keXZhbCA+PiBXTEFOVExfU1RBSURfT0ZGU0VUOyAgCisgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5hdWNBQ01hc2tbdWNBQ10gPSAxOyAKKworICAgICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcsIDEpOworICAgICAgdm9zU3RhdHVzID0gV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CisgICAgICBicmVhazsKKyNlbmRpZiAKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorICBjYXNlIFdEQV9EU19UWF9TVEFSVF9YTUlUOgorCisgICAgdm9zU3RhdHVzID0gV0RBX0RTX1R4RnJhbWVzKCBwdm9zR0N0eCApOworCisgICAgICBicmVhazsKKworICBjYXNlIFdEQV9EU19GSU5JU0hfVUxBOgorICAgIGNhbGxiYWNrQ29udGV4dCA9ICh2b2lkICopbWVzc2FnZS0+Ym9keXZhbDsKKyAgIAorICAgIGNhbGxiYWNrUm91dGluZSA9IG1lc3NhZ2UtPmJvZHlwdHI7CisgICAgY2FsbGJhY2tSb3V0aW5lKGNhbGxiYWNrQ29udGV4dCk7CisgICAgYnJlYWs7CisjZW5kaWYKKworICBkZWZhdWx0OgorICAgIC8qbm8gcHJvY2Vzc2luZyBmb3Igbm93Ki8KKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiB2b3NTdGF0dXM7Cit9LyogV0xBTlRMX1R4UHJvY2Vzc01zZyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9NY0ZyZWVNc2cKKworICBERVNDUklQVElPTgorICAgIENhbGxlZCBieSBWT1NTIHRvIGZyZWUgYSBnaXZlbiBUTCBtZXNzYWdlIG9uIHRoZSBNYWluIHRocmVhZCB3aGVuIHRoZXJlCisgICAgYXJlIG1lc3NhZ2VzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlIHdoZW4gdGhlIHdob2xlIHN5c3RlbSBpcyBiZWVuIHJlc2V0LgorICAgIEZvciBub3csIFRMIGRvZXMgbm90IGFsbG9jYXRlIGFueSBib2R5IHNvIHRoaXMgZnVuY3Rpb24gc2hvdXQgdHJhbnNsYXRlCisgICAgaW50byBhIE5PT1AKKworICBERVBFTkRFTkNJRVMKKyAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCisKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9UeEZyZWVNc2cKKygKKyAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKKyAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCispCit7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qTm90aGluZyB0byBkbyBmb3Igbm93ISEhKi8KKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKldMQU5UTF9UeEZyZWVNc2cqLworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9UeEZDRnJhbWUKKworICBERVNDUklQVElPTgorICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gdG8gc2VuZCBGQyBmcmFtZS4gRW5hYmxlCisgICAgb3IgZGlzYWJsZSBMV00gbW9kZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24uCisKKyAgREVQRU5ERU5DSUVTCisgICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCisgICAgRlcgc2VuZHMgdXAgc3BlY2lhbCBmbG93IGNvbnRyb2wgZnJhbWUuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwb2ludGVycyBhcmUgTlVMTC4KKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU29tZXRoaW5nIGlzIHdyb25nLgorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QuCisKKyAgU0lERSBFRkZFQ1RTCisgICAgTmV3bHkgZm9ybWVkIEZDIGZyYW1lIGlzIGdlbmVyYXRlZCBhbmQgd2FpdHMgdG8gYmUgdHJhbnNtaXR0ZWQuIFByZXZpb3VzbHkgdW5zZW50IGZyYW1lIHdpbGwKKyAgICBiZSByZWxlYXNlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfVHhGQ0ZyYW1lCisoCisgIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAorKQoreworI2lmIDAKKyAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiA9IE5VTEw7CisgIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOworICB0cEhhbEZjVHhCZCAgICAgICAgIHB2RmNUeEJkID0gTlVMTDsKKyAgdm9zX3BrdF90ICogICAgICAgICBwUGFja2V0ID0gTlVMTDsKKyAgdl9VOF90ICAgICAgICAgICAgICB1Y1NUQUlkID0gMDsKKyAgdl9VOF90ICAgICAgICAgICAgICB1Y0JpdENoZWNrID0gMTsKKworICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIldMQU4gVEw6IFNlbmQgRkMgZnJhbWUgJXMiLCBfX0ZVTkNUSU9OX18pOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBOVUxMID09IHB2b3NHQ3R4ICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyICVzIiwgX19GVU5DVElPTl9fKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKworICBpZiAoTlVMTCA9PSBwVExDYikKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwb2ludGVyIGluICVzIFxuIiwgX19GVU5DVElPTl9fKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorICAKKyAgLy9HZXQgb25lIHZvc3MgcGFja2V0CisgIHZvc1N0YXR1cyA9IHZvc19wa3RfZ2V0X3BhY2tldCggJnBQYWNrZXQsIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCwgc2l6ZW9mKHRIYWxGY1R4QmQpLCAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19GQUxTRSwgTlVMTCwgTlVMTCApOworCisgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgIHsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgdm9zU3RhdHVzID0gdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHBQYWNrZXQsICh2b2lkICopJnB2RmNUeEJkLCBzaXplb2YodEhhbEZjVHhCZCkpOworCisgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBmYWlsZWQgdG8gcmVzZXJ2ZSBGQyBUWCBCRCAlZFxuIixfX0ZVTkNUSU9OX18sIHNpemVvZih0SGFsRmNUeEJkKSkpOworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvL0dlbmVyYXRlIG1vc3QgcmVjZW50IHRsRkNJbmZvLiBNb3N0IGZpZWxkcyBhcmUgY29ycmVjdC4KKyAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVGhyZXNoRW5hYmxlZE1hc2sgPSAwOworICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUeE1vcmVEYXRhTWFzayA9IDA7CisgIGZvciggdWNTVEFJZCA9IDAsIHVjQml0Q2hlY2sgPSAxIDsgdWNTVEFJZCA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgdWNCaXRDaGVjayA8PD0gMSwgdWNTVEFJZCArKykKKyAgeworICAgIGlmICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjRXhpc3RzKQorICAgIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcpCisgICAgeworICAgICAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVHhNb3JlRGF0YU1hc2sgfD0gdWNCaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAoIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkKSAmJgorICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkID4gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUx3bVRocmVzaG9sZCkpCisgICAgeworICAgICAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVGhyZXNoRW5hYmxlZE1hc2sgfD0gdWNCaXRDaGVjazsKKworICAgICAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVGhyZXNoW3VjU1RBSWRdID0gKHRBTklfVTgpcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUx3bVRocmVzaG9sZDsKKworICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21FdmVudFJlcG9ydGVkID0gRkFMU0U7CisgICAgfQorCisgIH0KKyAgCisgIC8vcmVxdWVzdCBpbW1lZGlhdGUgZmVlZGJhY2sKKyAgcFRMQ2ItPnRsRkNJbmZvLmZjQ29uZmlnIHw9IDB4NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgLy9maWxsIGluIEJEIHRvIHNlbnQKKyAgdm9zU3RhdHVzID0gV0xBTkhBTF9GaWxsRmNUeEJkKHB2b3NHQ3R4LCAmcFRMQ2ItPnRsRkNJbmZvLCAodm9pZCAqKXB2RmNUeEJkKTsKKworICBpZiggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogRmlsbCBGQyBUWCBCRCB1bnN1Y2Nlc3NmdWxcbiIsIF9fRlVOQ1RJT05fXykpOworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCggcFBhY2tldCApOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBpZiAoTlVMTCAhPSBwVExDYi0+dm9zVHhGQ0J1ZikKKyAgeworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICIlczogUHJldmlvdXMgRkMgVFggQkQgbm90IHNlbnRcbiIsIF9fRlVOQ1RJT05fXykpOworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dm9zVHhGQ0J1Zik7CisgIH0KKworICBwVExDYi0+dm9zVHhGQ0J1ZiA9IHBQYWNrZXQ7CisKKyAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggcFBhY2tldCwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClXTEFOVExfVHhDb21wRGVmYXVsdENiKTsKKyAgdm9zU3RhdHVzID0gV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CisKKyAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOiBzZW5kIEZDIGZyYW1lIGxlYXZlICVzIiwgX19GVU5DVElPTl9fKSk7CisjZW5kaWYKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IKKworICBERVNDUklQVElPTgorICAgIFByb2Nlc3NpbmcgZnVuY3Rpb24gZm9yIFJlc291cmNlIG5lZWRlZCBzaWduYWwuIEEgcmVxdWVzdCB3aWxsIGJlIGlzc3VlZAorICAgIHRvIEJBTCB0byBnZXQgbW9yZSB0eCByZXNvdXJjZXMuCisKKyAgREVQRU5ERU5DSUVTCisgICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBPdGhlciB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbCwgcGxlYXNlIGNoZWNrCisgIGNvcnJlc3BvbmRpbmcgQVBJIGZvciBtb3JlIGluZm8uCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9HZXRUeFJlc291cmNlc0NCCisoCisgIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiICAgICAgPSBOVUxMOworICB2X1UzMl90ICAgICAgICAgdVJlc0NvdW50ICA9IFdEQV9UTElfTUlOX1JFU19EQVRBOworICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgdl9VOF90ICAgICAgICAgIHVjTWdtdCAgICAgPSAwOworICB2X1U4X3QgICAgICAgICAgdWNCQVAgICAgICA9IDA7CisgIHZfVThfdCAgICAgICAgICB1Y0RhdGEgICAgID0gMDsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KKyAgdEJzc1N5c3RlbVJvbGUgc3lzdGVtUm9sZTsKKyAgdHBBbmlTaXJHbG9iYWwgcE1hYzsKKyNlbmRpZgorI2VuZGlmCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIgorICAgICAgICAgICAgICAgIiBXTEFOVExfUHJvY2Vzc1R4TWVzc2FnZSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgdHggcmVzb3VyY2VzIGZyb20gQkFMCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b3NTdGF0dXMgPSBXREFfRFNfR2V0VHhSZXNvdXJjZXMoIHB2b3NHQ3R4LCAmdVJlc0NvdW50ICk7CisKKyAgaWYgKCAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgJiYgKFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgIT0gdm9zU3RhdHVzKSkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOlRMIGZhaWxlZCB0byBnZXQgcmVzb3VyY2VzIGZyb20gQkFMLCBFcnI6ICVkIiwKKyAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOworICAgIHJldHVybiB2b3NTdGF0dXM7CisgIH0KKworICAvKiBDdXJyZW50bHkgb25seSBMaW51eCBCQUwgcmV0dXJucyB0aGUgRV9SRVNPVVJDRVMgZXJyb3IgY29kZSB3aGVuIGl0IGlzIHJ1bm5pbmcgCisgICAgIG91dCBvZiBCRC9QRFVzLiBUbyBtYWtlIHVzZSBvZiB0aGlzIGludGVycnVwdCBmb3IgdGhyb3VnaHB1dCBlbmhhbmNlbWVudCwgc2ltaWxhcgorICAgICBjaGFuZ2VzIHNob3VsZCBiZSBkb25lIGluIEJBTCBjb2RlIG9mIEFNU1MgYW5kIFdNICovCisgIGlmIChWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTID09IHZvc1N0YXR1cykKKyAgeworI2lmZGVmIFZPTEFOU19QRVJGCisgICAgIFdMQU5IQUxfRW5hYmxlSWRsZUJkUGR1SW50ZXJydXB0KHB2b3NHQ3R4LCAodEFOSV9VOCliZFBkdUludGVycnVwdEdldFRocmVzaG9sZCk7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOiBFbmFibGluZyBJZGxlIEJEL1BEVSBpbnRlcnJ1cHQsIEN1cnJlbnQgcmVzb3VyY2VzID0gJWQiLCB1UmVzQ291bnQpOworI2Vsc2UKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisjZW5kaWYKKyAgfQorCisgIHBUTENiLT51UmVzQ291bnQgPSB1UmVzQ291bnQ7CisgIAorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorI2lmZGVmIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCisgIC8qIEZJWE1FOiBkaXNhYmxlZCBzaW5jZSBjcmVhdGluZyBpc3N1ZXMgaW4gcG93ZXItc2F2ZSwgbmVlZHMgdG8gYmUgYWRkcmVzc2VkICovIAorICBwVExDYi0+c2VuZEZDRnJhbWUgKys7CisgIHBNYWMgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9XREEsIHB2b3NHQ3R4KTsKKyAgc3lzdGVtUm9sZSA9IHdkYUdldEdsb2JhbFN5c3RlbVJvbGUocE1hYyk7CisgIGlmIChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkKKyAgeworICAgICBpZiAocFRMQ2ItPnNlbmRGQ0ZyYW1lICUgMTYgPT0gMCkKKyAgICAgeworICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAiVHJhbnNtaXQgRkMiKSk7CisgICAgICAgICBXTEFOVExfVHhGQ0ZyYW1lIChwdm9zR0N0eCk7CisgICAgIH0gCisgIH0KKyNlbmRpZiAvL1dMQU5fU09GVEFQX0ZMT1dDVFJMX0VOIAorI2VuZGlmIC8vV0xBTl9TT0ZUQVBfRkVBVFVSRQorCisgIHVjRGF0YSA9ICggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX0RBVEEgKTsKKyAgdWNCQVAgID0gKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfQkFQICkgJiYKKyAgICAgICAgICAgKCBOVUxMICE9IHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKTsKKyAgdWNNZ210ID0gKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfTUYgKSAmJgorICAgICAgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKTsKKworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFRMOiBFdmFsIFJlc3VtZSB0eCBSZXM6ICVkIERBVEE6ICVkIEJBUDogJWQgTUdNVDogJWQiLAorICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQsIHVjRGF0YSwgdWNCQVAsIHVjTWdtdCkpOworCisgIGlmICgoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSAmJgorICAgICAgKCggMCAhPSB1Y0RhdGEgKSB8fCAoIDAgIT0gdWNNZ210ICkgfHwgKCAwICE9IHVjQkFQICkgKSApCisgIHsKKyAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAiSXNzdWluZyBYbWl0IHN0YXJ0IHJlcXVlc3QgdG8gQkFMIGZvciBhdmFpbCByZXMgU1lOQyIpKTsKKyAgICB2b3NTdGF0dXMgPVdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOworICB9CisgIHJldHVybiB2b3NTdGF0dXM7Cit9LypXTEFOVExfR2V0VHhSZXNvdXJjZXNDQiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFV0aWxpdHkgZnVuY3Rpb25zCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIKKworICBERVNDUklQVElPTgorICAgIElubGluZSBmdW5jdGlvbiBmb3IgdHJhbnNsYXRpbmcgYW5kIDgwMi4xMSBoZWFkZXIgaW50byBhbiA4MDIuMyBoZWFkZXIuCisKKyAgREVQRU5ERU5DSUVTCisKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgcFRMQ2I6ICAgICAgICAgICAgVEwgY29udHJvbCBibG9jaworICAgIHVjU3RhSWQ6ICAgICAgICAgIHN0YXRpb24gSUQKKworICAgSU4vT1VUCisgICAgdm9zRGF0YUJ1ZmY6ICAgICAgdm9zIGRhdGEgYnVmZmVyLCB3aWxsIGNvbnRhaW4gdGhlIG5ldyBoZWFkZXIgb24gb3V0cHV0CisKKyAgIE9VVAorICAgIHB2b3NTdGF0dXM6ICAgICAgIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCisKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICAgIE90aGVyIGVycm9yIGNvZGVzIG1pZ2h0IGJlIHJldHVybmVkIGZyb20gdGhlIHZvcyBhcGkgdXNlZCBpbiB0aGUgZnVuY3Rpb24KKyAgICBwbGVhc2UgY2hlY2sgdGhvc2UgcmV0dXJuIHZhbHVlcy4KKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIKKygKKyAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAorICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiLAorICB2X1U4X3QgICAgICAgICAgdWNTdGFJZCwKKyAgdl9VOF90ICAgICAgICAgIHVjVVAsCisgIHZfVThfdCAgICAgICAgICAqdWNXRFNFbmFibGVkLAorICB2X1U4X3QgICAgICAgICAgKmV4dHJhSGVhZFNwYWNlCispCit7CisgIFdMQU5UTF84MDIzSGVhZGVyVHlwZSAgdzgwMjNIZWFkZXI7CisgIFdMQU5UTF84MDIxMUhlYWRlclR5cGUgKnB3ODAyMTFIZWFkZXI7IC8vIEFsbG9jYXRlIGFuIGFsaWduZWQgQkQgYW5kIHRoZW4gZmlsbCBpdC4gCisgIFZPU19TVEFUVVMgICAgICAgICAgICAgdm9zU3RhdHVzOworICB2X1U4X3QgICAgICAgICAgICAgICAgIE1hbmRhdG9yeXVjSGVhZGVyU2l6ZSA9IFdMQU44MDIxMV9NQU5EQVRPUllfSEVBREVSX1NJWkU7CisgIHZfVThfdCAgICAgICAgICAgICAgICAgdWNIZWFkZXJTaXplID0gMDsKKyAgdl9WT0lEX3QgICAgICAgICAgICAgICAqcHB2QkRIZWFkZXIgPSBOVUxMOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y1FvU09mZnNldCA9IFdMQU44MDIxMV9NQU5EQVRPUllfSEVBREVSX1NJWkU7CisjZW5kaWYKKworICAqdWNXRFNFbmFibGVkID0gMDsgLy8gZGVmYXVsdCBXRFMgb2ZmLgorICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgJnc4MDIzSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodzgwMjNIZWFkZXIpKTsKKworICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQorICB7CisgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgIldMQU4gVEw6IFBhY2tldCBwb3AgaGVhZGVyIGZhaWxzIG9uIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKKyAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgfQorCisKKyAgaWYgKCAwICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLndTVEFEZXNjLnVjQWRkUm12TExDICkKKyAgeworICAgIC8qIFB1c2ggdGhlIGxlbmd0aCAqLworICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLAorICAgICAgICAgICAgICAgICAgICAmdzgwMjNIZWFkZXIudXNMZW5UeXBlLCBzaXplb2YodzgwMjNIZWFkZXIudXNMZW5UeXBlKSk7CisKKyAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQorICAgIHsKKyAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogUGFja2V0IHB1c2ggZXRoZXIgdHlwZSBmYWlscyBvbiIKKyAgICAgICAgICAgICAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOworICAgICAgIHJldHVybiB2b3NTdGF0dXM7CisgICAgfQorCisjaWZkZWYgQlRBTVBfVEVTVAorICAgIC8vIFRoZSBTVEEgc2lkZSB3aWxsIGV4ZWN1dGUgdGhpcywgYSBoYWNrIHRvIHRlc3QgQlRBTVAgYnkgdXNpbmcgdGhlCisgICAgLy8gaW5mcmEgc2V0dXAuIE9uIHJlYWwgQlRBTVAgdGhpcyB3aWxsIGNvbWUgZnJvbSBCQVAgaXRzZWxmLgorICAgIHsKKyAgICBzdGF0aWMgdl9VOF90IFdMQU5UTF9CVF9BTVBfTExDX0hFQURFUltdID0gIHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDE5LCAweDU4IH07CisgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsIFdMQU5UTF9CVF9BTVBfTExDX0hFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdMQU5UTF9CVF9BTVBfTExDX0hFQURFUikpOworCisgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgICB7CisgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiV0xBTiBUTDogUGFja2V0IHB1c2ggTExDIGhlYWRlciBmYWlscyBvbiIKKyAgICAgICAgICAgICAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOworICAgICAgIHJldHVybiB2b3NTdGF0dXM7CisgICAgfQorICAgIH0KKyNlbHNlCisgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsIFdMQU5UTF9MTENfSEVBREVSLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0xBTlRMX0xMQ19IRUFERVIpKTsKKworICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgICAgeworICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFBhY2tldCBwdXNoIExMQyBoZWFkZXIgZmFpbHMgb24iCisgICAgICAgICAgICAgICAgICAiIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKKyAgICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgIH0KKyNlbmRpZgorICB9LypJZiBhZGQgTExDIGlzIGVuYWJsZWQqLworICBlbHNlCisgIHsKKyAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAiV0xBTiBUTDogU1RBIENsaWVudCByZWdpc3RlcmVkIHRvIG5vdCByZW1vdmUgTExDIgorICAgICAgICAgICAgICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CisgIH0KKworI2lmZGVmIEJUQU1QX1RFU1QKKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0ud1NUQURlc2Mud1NUQVR5cGUgPSBXTEFOX1NUQV9CVF9BTVA7CisjZW5kaWYKKworICAvLyBGaW5kIHRoZSBzcGFjZSByZXF1aXJlZCBmb3IgdGhlIDgwMi4xMSBoZWFkZXIgZm9ybWF0CisgIC8vIGJhc2VkIG9uIHRoZSBmcmFtZSBjb250cm9sIGZpZWxkcy4KKyAgdWNIZWFkZXJTaXplID0gTWFuZGF0b3J5dWNIZWFkZXJTaXplOworICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0ud1NUQURlc2MudWNRb3NFbmFibGVkKQorICB7ICAKKyAgICB1Y0hlYWRlclNpemUgKz0gc2l6ZW9mKHB3ODAyMTFIZWFkZXItPnVzUW9zQ3RybCk7CisgIH0KKyAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLndTVEFEZXNjLndTVEFUeXBlID09IFdMQU5fU1RBX0JUX0FNUCkKKyAgeyAgCisgICAgdWNIZWFkZXJTaXplICs9IHNpemVvZihwdzgwMjExSGVhZGVyLT5vcHR2QTQpOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICB1Y1FvU09mZnNldCArPSBzaXplb2YocHc4MDIxMUhlYWRlci0+b3B0dkE0KTsKKyNlbmRpZgorICB9CisKKyAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIDogSGVhZGVyIHNpemUgPSAlZCAiLCB1Y0hlYWRlclNpemUpKTsKKworICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsICZwcHZCREhlYWRlciwgdWNIZWFkZXJTaXplICk7CisgIGlmICggTlVMTCA9PSBwcHZCREhlYWRlciApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gVEw6Vk9TUyBwYWNrZXQgY29ycnVwdGVkICIpKTsKKyAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICByZXR1cm4gKnB2b3NTdGF0dXM7CisgIH0KKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgLyogQ2hlY2sgZm9yIGFsaWdubWVudCAqLworICAqZXh0cmFIZWFkU3BhY2UgPSAodl9VOF90KSgoKCh2X1UzMl90KShwcHZCREhlYWRlcikpICYgMHg3KSAlIDB4NCk7CisgIGlmICgqZXh0cmFIZWFkU3BhY2UpCisgIHsKKworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgIldMQU4gVEw6Vk9TUyByZXNlcnZpbmcgZXh0cmEgaGVhZGVyIHNwYWNlID0gJWQiLCAqZXh0cmFIZWFkU3BhY2UpKTsKKyAgICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsICZwcHZCREhlYWRlciwgKmV4dHJhSGVhZFNwYWNlICk7CisgICAgaWYgKCBOVUxMID09IHBwdkJESGVhZGVyICkKKyAgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpWT1NTIHBhY2tldCBjb3JydXB0ZWQgb24gQXR0YWNoIEJEIGhlYWRlciB3aGlsZSByZXNlcnZpbmcgZXh0cmEgaGVhZGVyIHNwYWNlIikpOworICAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICByZXR1cm4gKnB2b3NTdGF0dXM7CisgICAgfQorICB9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKKyAgLy8gT0sgbm93IHdlIGhhdmUgdGhlIHNwYWNlLiBGaWxsIHRoZSA4MDIxMSBoZWFkZXIKKyAgLyogRmlsbCBBMiAqLworICBwdzgwMjExSGVhZGVyID0gKFdMQU5UTF84MDIxMUhlYWRlclR5cGUgKikocHB2QkRIZWFkZXIpOworICAvLyBvbmx5IGNsZWFyIHRoZSByZXF1aXJlZCBzcGFjZS4KKyAgdm9zX21lbV9zZXQoIHB3ODAyMTFIZWFkZXIsIHVjSGVhZGVyU2l6ZSwgMCApOworICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMiwgdzgwMjNIZWFkZXIudlNBLCAgVk9TX01BQ19BRERSX1NJWkUpOworCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQorICBpZiAoIFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS50bFN0YXRlICYmIGdVY0lzV2FpICE9IDEgKQorI2Vsc2UKKyAgaWYgKCBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0udGxTdGF0ZSApCisjZW5kaWYKKyAgeworICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLndlcCA9CisgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLndTVEFEZXNjLnVjUHJvdGVjdGVkRnJhbWU7CisgIH0KKworICBwdzgwMjExSGVhZGVyLT51c0R1cmF0aW9uSWQgPSAwOworICBwdzgwMjExSGVhZGVyLT51c1NlcUN0cmwgICAgPSAwOworCisgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnR5cGUgICAgID0gV0xBTlRMXzgwMjExX0RBVEFfVFlQRTsKKworCisKKyAgaWYocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0ud1NUQURlc2MudWNRb3NFbmFibGVkKQorICB7CisgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5zdWJUeXBlICA9IFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgKigodl9VMTZfdCAqKSgodl9VOF90ICopcHB2QkRIZWFkZXIgKyB1Y1FvU09mZnNldCkpID0gdWNVUDsKKyNlbHNlCisgICAgICBwdzgwMjExSGVhZGVyLT51c1Fvc0N0cmwgPSB1Y1VQOworI2VuZGlmCisKKyAgfQorICBlbHNlCisgIHsKKyAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnN1YlR5cGUgID0gMDsKKworICAvLyBOTyBOTyBOTyAtIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCB0byB3cml0ZSB0aGUgUU9TIGN0cmwgIAorICAvLyBmaWVsZCwgaXQgd2lsbCBvdmVyd3JpdGUgdGhlIGZpcnN0IDIgYnl0ZXMgb2YgdGhlIGRhdGEgcGFja2V0KExMQyBoZWFkZXIpCisgIC8vIHB3ODAyMTFIZWFkZXItPnVzUW9zQ3RybCAgICAgICAgID0gMDsKKyAgfQorCisKKyAgc3dpdGNoKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS53U1RBRGVzYy53U1RBVHlwZSApCisgIHsKKyAgICAgIGNhc2UgV0xBTl9TVEFfSUJTUzoKKyAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudG9EUyAgICAgICAgICA9IDA7CisgICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAwOworICAgICAgICAvKkZpeCBtZSovCisgICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMSwKKyAgICAgICAgICAgICAgJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKKyAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTMsCisgICAgICAgICAgICAgICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS53U1RBRGVzYy52QlNTSURmb3JJQlNTICwKKyAgICAgICAgICAgICAgVk9TX01BQ19BRERSX1NJWkUpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBXTEFOX1NUQV9CVF9BTVA6CisgICAgICAgICp1Y1dEU0VuYWJsZWQgPSAxOyAvLyBXRFMgb24uCisgICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnRvRFMgICAgICAgICAgPSAxOworICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMTsKKyAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkExLAorICAgICAgICAgICAgICAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0ud1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOworICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMiwKKyAgICAgICAgICAgICAgICB3ODAyM0hlYWRlci52U0EsIFZPU19NQUNfQUREUl9TSVpFKTsKKyAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkEzLAorICAgICAgICAgICAgICAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0ud1NUQURlc2MudlNUQU1BQ0FkZHJlc3MpOworICAgICAgICAvKiBmaWxsIHRoZSBvcHRpb25hbCBBNCBoZWFkZXIgKi8KKyAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT5vcHR2QTQsCisgICAgICAgICAgICAgICAgdzgwMjNIZWFkZXIudlNBLCBWT1NfTUFDX0FERFJfU0laRSk7CisgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAiQlRBTVAgQ0FTRSBOT1cgLS0tLS0tLS0tc3RhaWQ9JWRcbiIsCisgICAgICAgICAgICB1Y1N0YUlkKSk7CisgICAgICAgIGJyZWFrOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgY2FzZSBXTEFOX1NUQV9TT0ZUQVA6CisgICAgICAgICp1Y1dEU0VuYWJsZWQgPSAwOyAvLyBXRFMgb2ZmLgorICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMDsKKyAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuZnJvbURTICAgICAgICA9IDE7CisgICAgICAgIC8qQ29weSB0aGUgREEgdG8gQTEqLworICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMSwgdzgwMjNIZWFkZXIudkRBICwgVk9TX01BQ19BRERSX1NJWkUpOyAgIAorICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTIsCisgICAgICAgICAgICAgICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MpOworICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMywKKyAgICAgICAgICAgICAgICB3ODAyM0hlYWRlci52U0EsIFZPU19NQUNfQUREUl9TSVpFKTsKKyAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICJzdyA4MDIgdG8gODAyMTEgc29mdGFwIGNhc2UgIC0tLS0tLS0tLXN0YWlkPSVkXG4iLAorICAgICAgICAgICAgdWNTdGFJZCkpOworICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICBjYXNlIFdMQU5fU1RBX0lORlJBOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudG9EUyAgICAgICAgICA9IDE7CisgICAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLmZyb21EUyAgICAgICAgPSAwOworICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCisgICAgICAgICAgICAgICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyk7CisgICAgICAgIHZvc19tZW1fY29weSggcHc4MDIxMUhlYWRlci0+dkEzLCB3ODAyM0hlYWRlci52REEgLCBWT1NfTUFDX0FERFJfU0laRSk7CisgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAiUkVHVUxBUiBJTkZSQSBMSU5LIENBU0UtLS0tLS0tLS1zdGFpZD0lZFxuIiwKKyAgICAgICAgICAgIHVjU3RhSWQpKTsKKyAgICAgICAgYnJlYWs7CisgIH0KKyAgLy8gT0sgbm93IHdlIGhhdmUgdGhlIHNwYWNlLiBGaWxsIHRoZSA4MDIxMSBoZWFkZXIKKyAgLyogRmlsbCBBMiAqLworICBwdzgwMjExSGVhZGVyID0gKFdMQU5UTF84MDIxMUhlYWRlclR5cGUgKikocHB2QkRIZWFkZXIpOworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBCRUdJTiBMT0cgRlVOQ1RJT04gICAgISEhIFJlbW92ZSBtZSBvciBjbGVhbiBtZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIFdMQU5UTF9ERUJVRyAKKworI2RlZmluZSBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSAgICAxNgorI2RlZmluZSBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURSAgICA0CisKK3N0YXRpYyB2X1ZPSURfdCBXTEFOVExfRGVidWdGcmFtZQorKAorICAgdl9QVk9JRF90ICAgZGF0YVBvaW50ZXIsCisgICB2X1UzMl90ICAgICBkYXRhU2l6ZQorKQoreworICAgdl9VOF90ICAgbGluZUJ1ZmZlcltXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORV07CisgICB2X1UzMl90ICBudW1MaW5lczsKKyAgIHZfVTMyX3QgIG51bUJ5dGVzOworICAgdl9VMzJfdCAgaWR4OworICAgdl9VOF90ICAgKmxpbmVQb2ludGVyOworCisgICBudW1MaW5lcyA9IGRhdGFTaXplIC8gV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkU7CisgICBudW1CeXRlcyA9IGRhdGFTaXplICUgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkU7CisgICBsaW5lUG9pbnRlciA9ICh2X1U4X3QgKilkYXRhUG9pbnRlcjsKKworICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTiBUTDpGcmFtZSBEZWJ1ZyBGcmFtZSBTaXplICVkLCBQb2ludGVyIDB4JXAiLCBkYXRhU2l6ZSwgZGF0YVBvaW50ZXIpKTsKKyAgIGZvcihpZHggPSAwOyBpZHggPCBudW1MaW5lczsgaWR4KyspCisgICB7CisgICAgICBtZW1zZXQobGluZUJ1ZmZlciwgMCwgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUpOworICAgICAgbWVtY3B5KGxpbmVCdWZmZXIsIGxpbmVQb2ludGVyLCBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSk7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU0FMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gVEw6MHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMnggMHglMngiLAorICAgICAgICAgICAgICAgICBsaW5lQnVmZmVyWzBdLCBsaW5lQnVmZmVyWzFdLCBsaW5lQnVmZmVyWzJdLCBsaW5lQnVmZmVyWzNdLCBsaW5lQnVmZmVyWzRdLCBsaW5lQnVmZmVyWzVdLCBsaW5lQnVmZmVyWzZdLCBsaW5lQnVmZmVyWzddLAorICAgICAgICAgICAgICAgICBsaW5lQnVmZmVyWzhdLCBsaW5lQnVmZmVyWzldLCBsaW5lQnVmZmVyWzEwXSwgbGluZUJ1ZmZlclsxMV0sIGxpbmVCdWZmZXJbMTJdLCBsaW5lQnVmZmVyWzEzXSwgbGluZUJ1ZmZlclsxNF0sIGxpbmVCdWZmZXJbMTVdKSk7CisgICAgICBsaW5lUG9pbnRlciArPSBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORTsKKyAgIH0KKworICAgaWYoMCA9PSBudW1CeXRlcykKKyAgICAgIHJldHVybjsKKworICAgbWVtc2V0KGxpbmVCdWZmZXIsIDAsIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FKTsKKyAgIG1lbWNweShsaW5lQnVmZmVyLCBsaW5lUG9pbnRlciwgbnVtQnl0ZXMpOworICAgZm9yKGlkeCA9IDA7IGlkeCA8IFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FIC8gV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEU7IGlkeCsrKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTiBUTDoweCUyeCAweCUyeCAweCUyeCAweCUyeCIsCisgICAgICAgICAgICAgICAgbGluZUJ1ZmZlcltpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0sIGxpbmVCdWZmZXJbMSArIGlkeCAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFXSwKKyAgICAgICAgICAgICAgICBsaW5lQnVmZmVyWzIgKyBpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0sIGxpbmVCdWZmZXJbMyArIGlkeCAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFXSkpOworICAgICAgaWYoKChpZHggKyAxKSAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFKSA+PSBudW1CeXRlcykKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm47Cit9CisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRU5EIExPRyBGVU5DVElPTgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlcgorCisgIERFU0NSSVBUSU9OCisgICAgSW5saW5lIGZ1bmN0aW9uIGZvciB0cmFuc2xhdGluZyBhbmQgODAyLjExIGhlYWRlciBpbnRvIGFuIDgwMi4zIGhlYWRlci4KKworICBERVBFTkRFTkNJRVMKKworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBwVExDYjogICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCisgICAgdWNTdGFJZDogICAgICAgICAgc3RhdGlvbiBJRAorICAgIHVjSGVhZGVyTGVuOiAgICAgIExlbmd0aCBvZiB0aGUgaGVhZGVyIGZyb20gQkQKKyAgICB1Y0FjdHVhbEhMZW46ICAgICBMZW5ndGggb2YgaGVhZGVyIGluY2x1ZGluZyBwYWRkaW5nIG9yIGFueSBvdGhlciB0cmFpbGVycworCisgICBJTi9PVVQKKyAgICB2b3NEYXRhQnVmZjogICAgICB2b3MgZGF0YSBidWZmZXIsIHdpbGwgY29udGFpbiB0aGUgbmV3IGhlYWRlciBvbiBvdXRwdXQKKworICAgT1VUCisgICAgcHZvc1N0YXR1czogICAgICAgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KKworICAgUkVUVVJOIFZBTFVFCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlcgorKAorICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYsCisgIFZPU19TVEFUVVMqICAgICBwdm9zU3RhdHVzLAorICB2X1UxNl90ICAgICAgICAgdXNBY3R1YWxITGVuLAorICB2X1U4X3QgICAgICAgICAgdWNIZWFkZXJMZW4sCisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKKyAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQKKykKK3sKKyAgV0xBTlRMXzgwMjNIZWFkZXJUeXBlICB3ODAyM0hlYWRlcjsKKyAgV0xBTlRMXzgwMjExSGVhZGVyVHlwZSB3ODAyMTFIZWFkZXI7CisgIHZfVThfdCAgICAgICAgICAgICAgICAgYXVjTExDSGVhZGVyW1dMQU5UTF9MTENfSEVBREVSX0xFTl07CisgIFZPU19TVEFUVVMgICAgICAgICAgICAgdm9zU3RhdHVzOworICB2X1UxNl90ICAgICAgICAgICAgICAgIHVzRGF0YVN0YXJ0T2Zmc2V0ID0gMDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgaWYgKCBzaXplb2YodzgwMjExSGVhZGVyKSA8IHVjSGVhZGVyTGVuICkKKyAgeworICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICJXYXJuaW5nICE6IENoZWNrIHRoZSBoZWFkZXIgc2l6ZSBmb3IgdGhlIFJ4IGZyYW1lIHN0cnVjdHVyZT0lZCByZWNlaXZlZD0lZG4iLAorICAgICAgIHNpemVvZih3ODAyMTFIZWFkZXIpLCB1Y0hlYWRlckxlbikpOworICAgICB1Y0hlYWRlckxlbiA9IHNpemVvZih3ODAyMTFIZWFkZXIpOworICB9CisKKyAgLy8gVGhpcyB3aWxsIHRha2UgY2FyZSBvZiBoZWFkZXJzIG9mIGFsbCBzaXplcywgMyBhZGRyZXNzLCAzIGFkZHIgUU9TLAorICAvLyBXRFMgbm9uLVFPUyBhbmQgV0RTIFFvUyBldGMuIFdlIGhhdmUgc3BhY2UgZm9yIGFsbCBpbiB0aGUgODAyLjExIGhlYWRlciBzdHJ1Y3R1cmUuCisgIHZvc1N0YXR1cyA9IHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCAmdzgwMjExSGVhZGVyLCB1Y0hlYWRlckxlbik7CisKKyAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgeworICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byBwb3AgODAyMTEgaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKKyAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKKworICAgICByZXR1cm4gdm9zU3RhdHVzOworICB9CisKKyAgc3dpdGNoICggdzgwMjExSGVhZGVyLndGcm1DdHJsLmZyb21EUyApCisgIHsKKyAgY2FzZSAwOgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBpZiAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC50b0RTICkKKyAgICB7CisgICAgICAvL1NvZnRBUCBBUCBtb2RlCisgICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMywgVk9TX01BQ19BRERSX1NJWkUpOworICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTIsIFZPU19NQUNfQUREUl9TSVpFKTsKKyAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAiV0xBTiBUTCBTb2Z0QVA6IDgwMiAzIERBICUwOHggU0EgJTA4eCBcbiIsCisgICAgICAgICAgICAgICAgICB3ODAyM0hlYWRlci52REEsIHc4MDIzSGVhZGVyLnZTQSkpOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgIC8qIElCU1MgKi8KKyAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CisgICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMiwgVk9TX01BQ19BRERSX1NJWkUpOworICAgIH0KKyNlbHNlCisgICAgLyogSUJTUyAqLworICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CisgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTIsIFZPU19NQUNfQUREUl9TSVpFKTsKKyNlbmRpZgorICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgaWYgKCB3ODAyMTFIZWFkZXIud0ZybUN0cmwudG9EUyApCisgICAgeworICAgICAgLyogQlQtQU1QIGNhc2UgKi8KKyAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CisgICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMiwgVk9TX01BQ19BRERSX1NJWkUpOworICAgIH0KKyAgICBlbHNlCisgICAgeyAvKiBJbmZyYSAqLworICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTEsIFZPU19NQUNfQUREUl9TSVpFKTsKKyAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEzLCBWT1NfTUFDX0FERFJfU0laRSk7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgaWYoIHVzQWN0dWFsSExlbiA+IHVjSGVhZGVyTGVuICkKKyAgeworICAgICB1c0RhdGFTdGFydE9mZnNldCA9IHVzQWN0dWFsSExlbiAtIHVjSGVhZGVyTGVuOworICB9CisKKyAgaWYgKCAwIDwgdXNEYXRhU3RhcnRPZmZzZXQgKQorICB7CisgICAgdm9zU3RhdHVzID0gdm9zX3BrdF90cmltX2hlYWQoIHZvc0RhdGFCdWZmLCB1c0RhdGFTdGFydE9mZnNldCApOworCisgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHRyaW0gaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOworICAgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgICB9CisgIH0KKworICBpZiAoIDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1NUQURlc2MudWNBZGRSbXZMTEMgKQorICB7CisgICAgLy8gRXh0cmFjdCB0aGUgTExDIGhlYWRlcgorICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCBhdWNMTENIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0xMQ19IRUFERVJfTEVOKTsKKworICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgICAgeworICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gcG9wIExMQyBoZWFkZXIgZnJvbSBwYWNrZXQgJWQiLAorICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CisKKyAgICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgIH0KKworICAgIC8vRXh0cmFjdCB0aGUgbGVuZ3RoCisgICAgdm9zX21lbV9jb3B5KCZ3ODAyM0hlYWRlci51c0xlblR5cGUsCisgICAgICAmYXVjTExDSGVhZGVyW1dMQU5UTF9MTENfSEVBREVSX0xFTiAtIHNpemVvZih3ODAyM0hlYWRlci51c0xlblR5cGUpXSwKKyAgICAgIHNpemVvZih3ODAyM0hlYWRlci51c0xlblR5cGUpICk7CisgIH0KKyAgZWxzZQorICB7CisgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCh2b3NEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdzgwMjNIZWFkZXIudXNMZW5UeXBlKTsKKworICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgICAgeworICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gZ2V0IHBhY2tldCBsZW5ndGggJWQiLAorICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CisKKyAgICAgICByZXR1cm4gdm9zU3RhdHVzOworICAgIH0KKworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICJXTEFOIFRMOiBCVEFNUCBsZW4gKGV0aGVydHlwZSkgZmxkID0gJWQiLAorICAgICAgICB3ODAyM0hlYWRlci51c0xlblR5cGUpKTsKKyAgICB3ODAyM0hlYWRlci51c0xlblR5cGUgPSB2b3NfY3B1X3RvX2JlMTYodzgwMjNIZWFkZXIudXNMZW5UeXBlKTsKKyAgfQorCisgIHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCAmdzgwMjNIZWFkZXIsIHNpemVvZih3ODAyM0hlYWRlcikpOworCisjaWZkZWYgQlRBTVBfVEVTVAorICB7CisgIC8vIEFQIHNpZGUgd2lsbCBleGVjdXRlIHRoaXMuCisgIHZfVThfdCAqdGVtcF93ODAyM0hlYWRlciA9IE5VTEw7CisgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgMCwKKyAgICAmdGVtcF93ODAyM0hlYWRlciwgc2l6ZW9mKHc4MDIzSGVhZGVyKSApOworICB9CisjZW5kaWYKKyNpZiAwIC8qVExfREVCVUcqLworICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKHZvc0RhdGFCdWZmLCAmdXNMZW4pOworICB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgYXVjRGF0YSwgdXNMZW4pOworCisgIFdMQU5UTF9EZWJ1Z0ZyYW1lKGF1Y0RhdGEsIHVzTGVuKTsKKworICB2b3NfcGt0X3B1c2hfaGVhZCh2b3NEYXRhQnVmZiwgYXVjRGF0YSwgdXNMZW4pOworCisjZW5kaWYKKworICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyKi8KKworI2lmIDAKKyNpZmRlZiBXTEFOX1BFUkYgCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9GYXN0SHdGd2REYXRhRnJhbWUKKworICBERVNDUklQVElPTiAKKyAgICBGYXN0IHBhdGggZnVuY3Rpb24gdG8gcXVpY2tseSBmb3J3YXJkIGEgZGF0YSBmcmFtZSBpZiBIQUwgZGV0ZXJtaW5lcyBCRCAKKyAgICBzaWduYXR1cmUgY29tcHV0ZWQgaGVyZSBtYXRjaGVzIHRoZSBzaWduYXR1cmUgaW5zaWRlIGN1cnJlbnQgVk9TUyBwYWNrZXQuIAorICAgIElmIHRoZXJlIGlzIGEgbWF0Y2gsIEhBTCBhbmQgVEwgZmlsbHMgaW4gdGhlIHN3YXBwZWQgcGFja2V0IGxlbmd0aCBpbnRvIAorICAgIEJEIGhlYWRlciBhbmQgRHhFIGhlYWRlciwgcmVzcGVjdGl2ZWx5LiBPdGhlcndpc2UsIHBhY2tldCBnb2VzIGJhY2sgdG8gCisgICAgbm9ybWFsIChzbG93KSBwYXRoIGFuZCBhIG5ldyBCRCBzaWduYXR1cmUgd291bGQgYmUgdGFnZ2VkIGludG8gQkQgaW4gdGhpcworICAgIFZPU1MgcGFja2V0IGxhdGVyIGJ5IHRoZSBXTEFOSEFMX0ZpbGxUeEJkKCkgZnVuY3Rpb24uCisKKyAgREVQRU5ERU5DSUVTIAorICAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgSU4KKyAgICAgICAgcHZvc0dDdHggICAgVk9TIGNvbnRleHQKKyAgICAgICAgdm9zRGF0YUJ1ZmYgUHRyIHRvIFZPU1MgcGFja2V0CisgICAgICAgIHBNZXRhSW5mbyAgIEZvciBnZXR0aW5nIGZyYW1lJ3MgVElECisgICAgICAgIHBTdGFJbmZvICAgIEZvciBjaGVja2luZyBTVEEgdHlwZQorICAgIAorICAgT1VUCisgICAgICAgIHB2b3NTdGF0dXMgIHJldHVybmVkIHN0YXR1cworICAgICAgICBwdUZhc3RGd2RPSyBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgZnJhbWUgY291bGQgYmUgZmFzdCBmb3J3YXJkZWQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBObyByZXR1cm4uICAgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQKK1dMQU5UTF9GYXN0SHdGd2REYXRhRnJhbWUKKyggCisgIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCisgIHZvc19wa3RfdCogICAgdm9zRGF0YUJ1ZmYsCisgIFZPU19TVEFUVVMqICAgcHZvc1N0YXR1cywKKyAgdl9VMzJfdCogICAgICAgcHVGYXN0RndkT0ssCisgIFdMQU5UTF9NZXRhSW5mb1R5cGUqICBwTWV0YUluZm8sCisgIFdMQU5fU1RBRGVzY1R5cGUqICBwU3RhSW5mbworIAorKQoreworICAgIHZfUFZPSURfdCAgIHB2UGVla0RhdGE7CisgICAgdl9VOF90ICAgICAgdWNEeEVCRFdMQU5IZWFkZXJMZW4gPSBXTEFOVExfQkRfSEVBREVSX0xFTigwKSArIHNpemVvZihXTEFOQkFMX3NEWEVIZWFkZXJUeXBlKTsgCisgICAgdl9VOF90ICAgICAgdWNJc1VuaWNhc3Q7CisgICAgV0xBTkJBTF9zRFhFSGVhZGVyVHlwZSAgKnBEeEVIZWFkZXI7CisgICAgdl9QVk9JRF90ICAgcHZCREhlYWRlcjsKKyAgICB2X1BWT0lEX3QgICBwdWNCdWZmUHRyOworICAgIHZfVTE2X3QgICAgICB1c1BrdExlbjsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcGFja2V0IGxlbmd0aAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgoIHZvc0RhdGFCdWZmLCAmdXNQa3RMZW4pOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBNQUMgYWRkcmVzcworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAqcHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUFDX0FERFJfQUxJR04oMCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTUFDX0FERFJfU0laRSApOworCisgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gKnB2b3NTdGF0dXMgKSAKKyAgICB7CisgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBNQUMgQWRkciAlZCIsIAorICAgICAgICAgICAgICAgICAgKnB2b3NTdGF0dXMpKTsKKyAgICAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUmVzZXJ2ZSBoZWFkIHJvb20gZm9yIER4RSBoZWFkZXIsIEJELCBhbmQgV0xBTiBoZWFkZXIKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsICZwdWNCdWZmUHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHVjRHhFQkRXTEFOSGVhZGVyTGVuICk7CisgICAgaWYgKCBOVUxMID09IHB1Y0J1ZmZQdHIgKQorICAgIHsKKyAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpObyBlbm91Z2ggc3BhY2UgaW4gVk9TUyBwYWNrZXQgJXAgZm9yIER4RS9CRC9XTEFOIGhlYWRlciIsIHZvc0RhdGFCdWZmKSk7CisgICAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcER4RUhlYWRlciA9IChXTEFOQkFMX3NEWEVIZWFkZXJUeXBlICAqKXB1Y0J1ZmZQdHI7CisgICAgcHZCREhlYWRlciA9ICh2X1BWT0lEX3QpICZwRHhFSGVhZGVyWzFdOworCisgICAgLyogVU1BIFR4IGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkLiAKKyAgICAgKiBVTUEgd291bGQgaGVscCBjb252ZXJ0IGZyYW1lcyB0byA4MDIuMTEsIGZpbGwgcGFydGlhbCBCRCBmaWVsZHMgYW5kIAorICAgICAqIGNvbnN0cnVjdCBMTEMgaGVhZGVyLiBUbyBmdXJ0aGVyIGFjY2VsZXJhdGUgdGhpcyBraW5kIG9mIGZyYW1lcywKKyAgICAgKiBIQUwgd291bGQgYXR0ZW1wdCB0byByZXVzZSB0aGUgQkQgZGVzY3JpcHRvciBpZiB0aGUgQkQgc2lnbmF0dXJlIAorICAgICAqIG1hdGNoZXMgdG8gdGhlIHNhdmVkIEJEIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgIGlmKHBTdGFJbmZvLT53U1RBVHlwZSA9PSBXTEFOX1NUQV9JQlNTKQorICAgICAgICB1Y0lzVW5pY2FzdCA9ICEoKCh0QU5JX1U4ICopcHZQZWVrRGF0YSlbMF0gJiAweDAxKTsKKyAgICAgZWxzZQorICAgICAgICB1Y0lzVW5pY2FzdCA9IDE7CisgCisgICAgICpwdUZhc3RGd2RPSyA9ICh2X1UzMl90KSBXTEFOSEFMX1R4QmRGYXN0RndkKHB2b3NHQ3R4LCBwdlBlZWtEYXRhLCBwTWV0YUluZm8tPnVjVElELCB1Y0lzVW5pY2FzdCwgcHZCREhlYWRlciwgdXNQa3RMZW4gKTsKKyAgICAKKyAgICAgIC8qIENhbid0IGJlIGZhc3QgZm9yd2FyZGVkLiBUcmltIHRoZSBWT1MgaGVhZCBiYWNrIHRvIG9yaWdpbmFsIGxvY2F0aW9uLiAqLworICAgICAgaWYoISAqcHVGYXN0RndkT0speworICAgICAgICAgIHZvc19wa3RfdHJpbV9oZWFkKHZvc0RhdGFCdWZmLCB1Y0R4RUJEV0xBTkhlYWRlckxlbik7CisgICAgICB9ZWxzZXsKKyAgICAgICAgLyogY291bGQgYmUgZmFzdCBmb3J3YXJkZWQuIE5vdyBub3RpZnkgQkFMIER4RSBoZWFkZXIgZmlsbGluZyBjb3VsZCBiZSBjb21wbGV0ZWx5IHNraXBwZWQKKyAgICAgICAgICovCisgICAgICAgIHZfVTMyX3QgdVBhY2tldFNpemUgPSBXTEFOVExfQkRfSEVBREVSX0xFTigwKSArIHVzUGt0TGVuOworICAgICAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfQkFMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1UGFja2V0U2l6ZSk7CisgICAgICAgIHBEeEVIZWFkZXItPnNpemUgID0gU1dBUF9FTkRJQU5fVUlOVDMyKHVQYWNrZXRTaXplKTsKKyAgICAgIH0KKyAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICByZXR1cm47Cit9CisjZW5kaWYgLypXTEFOX1BFUkYqLworI2VuZGlmCisKKyNpZiAwCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXTEFOVExfUHJlcGFyZUJESGVhZGVyCisKKyAgREVTQ1JJUFRJT04KKyAgICBJbmxpbmUgZnVuY3Rpb24gZm9yIHByZXBhcmluZyBCRCBoZWFkZXIgYmVmb3JlIEhBTCBwcm9jZXNzaW5nLgorCisgIERFUEVOREVOQ0lFUworICAgIEp1c3Qgbm90aWZ5IEhBTCB0aGF0IHN1c3BlbmQgaW4gVEwgaXMgY29tcGxldGUuCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgIHZvc0RhdGFCdWZmOiAgICAgIHZvcyBkYXRhIGJ1ZmZlcgorICAgIHVjRGlzYWJsZUZybVh0bDogIGlzIGZyYW1lIHh0bCBkaXNhYmxlZAorCisgICBPVVQKKyAgICBwcHZCREhlYWRlcjogICAgICBpdCB3aWxsIGNvbnRhaW4gdGhlIEJEIGhlYWRlcgorICAgIHB2RGVzdE1hY0FkZGRyOiAgIGl0IHdpbGwgY29udGFpbiB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKyAgICBwdm9zU3RhdHVzOiAgICAgICBzdGF0dXMgb2YgdGhlIGNvbWJpbmVkIHByb2Nlc3NpbmcKKyAgICBwdXNQa3RMZW46ICAgICAgICBwYWNrZXQgbGVuLgorCisgIFJFVFVSTiBWQUxVRQorICAgIE5vIHJldHVybi4KKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkCitXTEFOVExfUHJlcGFyZUJESGVhZGVyCisoCisgIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZiwKKyAgdl9QVk9JRF90KiAgICAgIHBwdkJESGVhZGVyLAorICB2X01BQ0FERFJfdCogICAgcHZEZXN0TWFjQWRkZHIsCisgIHZfVThfdCAgICAgICAgICB1Y0Rpc2FibGVGcm1YdGwsCisgIFZPU19TVEFUVVMqICAgICBwdm9zU3RhdHVzLAorICB2X1UxNl90KiAgICAgICAgcHVzUGt0TGVuLAorICB2X1U4X3QgICAgICAgICAgdWNRb3NFbmFibGVkLAorICB2X1U4X3QgICAgICAgICAgdWNXRFNFbmFibGVkLAorICB2X1U4X3QgICAgICAgICAgZXh0cmFIZWFkU3BhY2UKKykKK3sKKyAgdl9VOF90ICAgICAgdWNIZWFkZXJPZmZzZXQ7CisgIHZfVThfdCAgICAgIHVjSGVhZGVyTGVuOworI2lmbmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgIHZfUFZPSURfdCAgIHB2UGVla0RhdGE7CisjZW5kaWYKKyAgdl9VOF90ICAgICAgdWNCREhlYWRlckxlbiA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKHVjRGlzYWJsZUZybVh0bCk7CisKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBoZWFkZXIgcG9pbnRlciBmcm9tIFZPU1MKKyAgICAhISEgbWFrZSBzdXJlIHJlc2VydmUgaGVhZCB6ZXJvcyBvdXQgdGhlIG1lbW9yeQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgoIHZvc0RhdGFCdWZmLCBwdXNQa3RMZW4pOworCisgIGlmICggV0xBTlRMX01BQ19IRUFERVJfTEVOKHVjRGlzYWJsZUZybVh0bCkgPiAqcHVzUGt0TGVuICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOiBMZW5ndGggb2YgdGhlIHBhY2tldCBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQgbmV0d29yayIKKyAgICAgICAgICAgICAgICIgaGVhZGVyICVkIiwgKnB1c1BrdExlbiApKTsKKworICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgIHJldHVybjsKKyAgfQorCisgIHZvc19wa3RfcmVzZXJ2ZV9oZWFkKCB2b3NEYXRhQnVmZiwgcHB2QkRIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y0JESGVhZGVyTGVuICk7CisgIGlmICggTlVMTCA9PSAqcHB2QkRIZWFkZXIgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXTEFOIFRMOlZPU1MgcGFja2V0IGNvcnJ1cHRlZCBvbiBBdHRhY2ggQkQgaGVhZGVyIikpOworICAgICpwdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgIHJldHVybjsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IE1BQyBhZGRyZXNzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICB7CisgICB2X1NJWkVfdCB1c01hY0FkZHJTaXplID0gVk9TX01BQ19BRERSX1NJWkU7CisgICAqcHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0JESGVhZGVyTGVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUFDX0FERFJfQUxJR04odWNEaXNhYmxlRnJtWHRsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXB2RGVzdE1hY0FkZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c01hY0FkZHJTaXplICk7CisgIH0KKyNlbHNlCisgICpwdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0RhdGFCdWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQkRIZWFkZXJMZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTih1Y0Rpc2FibGVGcm1YdGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2UGVla0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01BQ19BRERSX1NJWkUgKTsKKworICAvKkZpeCBtZSovCisgIHZvc19jb3B5X21hY2FkZHIocHZEZXN0TWFjQWRkZHIsICh2X01BQ0FERFJfdCopcHZQZWVrRGF0YSk7CisjZW5kaWYKKyAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gKnB2b3NTdGF0dXMgKQorICB7CisgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBleHRyYWN0IE1BQyBBZGRyICVkIiwKKyAgICAgICAgICAgICAgICAqcHZvc1N0YXR1cykpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIEZpbGwgTVBEVSBpbmZvIGZpZWxkczoKKyAgICAgICAgICAtIE1QRFUgZGF0YSBzdGFydCBvZmZzZXQKKyAgICAgICAgICAtIE1QRFUgaGVhZGVyIHN0YXJ0IG9mZnNldAorICAgICAgICAgIC0gTVBEVSBoZWFkZXIgbGVuZ3RoCisgICAgICAgICAgLSBNUERVIGxlbmd0aCAtIHRoaXMgaXMgYSAxNmIgZmllbGQgLSBuZWVkcyBzd2FwcGluZworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICB1Y0hlYWRlck9mZnNldCA9IHVjQkRIZWFkZXJMZW47CisgICAgdWNIZWFkZXJMZW4gICAgPSBXTEFOVExfTUFDX0hFQURFUl9MRU4odWNEaXNhYmxlRnJtWHRsKTsKKworICAgIGlmICggMCAhPSB1Y0Rpc2FibGVGcm1YdGwgKQorICAgIHsKKyAgICAgIGlmICggMCAhPSB1Y1Fvc0VuYWJsZWQgKQorICAgICAgeworICAgICAgICB1Y0hlYWRlckxlbiArPSBXTEFOVExfODAyXzExX0hFQURFUl9RT1NfQ1RMOworICAgICAgfQorCisgICAgICAvLyBTaW1pbGFyIHRvIFFvcyB3ZSBuZWVkIHNvbWV0aGluZyBmb3IgV0RTIGZvcm1hdCAhCisgICAgICBpZiAoIHVjV0RTRW5hYmxlZCAhPSAwICkKKyAgICAgIHsKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBmcmFtZSB0cmFuc2xhdGlvbiBlbmFibGVkCisgICAgICAgIHVjSGVhZGVyTGVuICAgICs9IFdMQU5UTF84MDJfMTFfSEVBREVSX0FERFI0X0xFTjsKKyAgICAgIH0KKyAgICAgIGlmICggZXh0cmFIZWFkU3BhY2UgIT0gMCApCisgICAgICB7CisgICAgICAgIC8vIERlY3JlYXNlIHRoZSBwYWNrZXQgbGVuZ3RoIHdpdGggdGhlIGV4dHJhIHBhZGRpbmcgYWZ0ZXIgdGhlIGhlYWRlcgorICAgICAgICAqcHVzUGt0TGVuID0gKnB1c1BrdExlbiAtIGV4dHJhSGVhZFNwYWNlOworICAgICAgfQorICAgIH0KKworICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfSEVBREVSX0xFTiggKnBwdkJESGVhZGVyLCB1Y0hlYWRlckxlbik7CisgICAgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9IRUFERVJfT0ZGU0VUKCAqcHB2QkRIZWFkZXIsIHVjSGVhZGVyT2Zmc2V0KTsKKyAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0RBVEFfT0ZGU0VUKCAqcHB2QkRIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0hlYWRlck9mZnNldCArIHVjSGVhZGVyTGVuICsgZXh0cmFIZWFkU3BhY2UpOworICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfTEVOKCAqcHB2QkRIZWFkZXIsICpwdXNQa3RMZW4pOworCisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAiV0xBTiBUTDogVkFMVUVTIEFSRSBITGVuPSV4IEhvZmY9JXggZG9mZj0leCBsZW49JXggZXg9JWQiLAorICAgICAgICAgICAgICAgIHVjSGVhZGVyTGVuLCB1Y0hlYWRlck9mZnNldCwgCisgICAgICAgICAgICAgICAgKHVjSGVhZGVyT2Zmc2V0ICsgdWNIZWFkZXJMZW4gKyBleHRyYUhlYWRTcGFjZSksIAorICAgICAgICAgICAgICAgICpwdXNQa3RMZW4sIGV4dHJhSGVhZFNwYWNlKSk7CisgIH0vKiBpZiBwZWVrIE1BQyBzdWNjZXNzKi8KKworfS8qIFdMQU5UTF9QcmVwYXJlQkRIZWFkZXIgKi8KKyNlbmRpZgorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorLy9USElTIElTIEEgSEFDSyBBTkQgTkVFRFMgVE8gQkUgRklYRUQgRk9SIENPTkNVUlJFTkNZCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5fVExHZXROZXh0VHhJZHMKKworICBERVNDUklQVElPTgorICAgIEdldHMgdGhlIG5leHQgc3RhdGlvbiBhbmQgbmV4dCBBQyBpbiB0aGUgbGlzdCB0aGF0IHNob3VsZCBiZSBzZXJ2ZWQgYnkgdGhlIFRMLgorCisgICAgTXVsdGlwbGUgU3RhdGlvbiBTY2hlZHVsaW5nIGFuZCBUTCBxdWV1ZSBtYW5hZ2VtZW50LiAKKworICAgIDQgSEREIEJDL01DIGRhdGEgcGFja2V0IHF1ZXVlIHN0YXR1cyBpcyBzcGVjaWZpZWQgYXMgU3RhdGlvbiAwJ3Mgc3RhdHVzLiBXZWlnaHRzIHVzZWQKKyAgICBpbiBXRlEgYWxnb3JpdGggYXJlIGluaXRpYWxpemVkIGluIFdMQU5UTF9PUEVOIGFuZCBjb250YWluZWQgaW4gdGxDb25maWdJbmZvIGZpZWxkLgorICAgIEVhY2ggc3RhdGlvbiBoYXMgZmllbGRzIG9mIHVjUGt0UGVuZGluZyBhbmQgQUMgbWFzayB0byB0ZWxsIHdoZXRoZXIgYSBBQyBoYXMgdHJhZmZpYworICAgIG9yIG5vdC4KKyAgICAgIAorICAgIFN0YXRpb25zIGFyZSBzZXJ2ZWQgaW4gYSByb3VuZC1yb2JpbiBmYXNoaW9uIGZyb20gaGlnaGVzdCBwcmlvcml0eSB0byBsb3dlc3QgcHJpb3JpdHkuCisgICAgVGhlIG51bWJlciBvZiByb3VuZC1yb2JpbiB0aW1lcyBvZiBlYWNoIHByaW9pcnR5IGVxdWFscyB0byB0aGUgV0ZRIHdlaWdodHMgYW5kIGRpZmZlcmV0aWF0ZXMKKyAgICB0aGUgdHJhZmZpYyBvZiBkaWZmZXJlbnQgcHJpb2lydHkuIEFzIHN1Y2gsIHN0YXRpb25zIGNhbiBub3QgcHJvdmlkZSBsb3cgcHJpb3JpdHkgcGFja2V0cyBpZgorICAgIGhpZ2ggcHJpb3JpdHkgcGFja2V0cyBhcmUgYWxsIHNlcnZlZC4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICBwdm9zR0N0eDogICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorCisgICBPVVQKKyAgIHB1Y1NUQUlkOiAgICBTdGF0aW9uIElECisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QKKworICBTSURFIEVGRkVDVFMKKyAgIAorICAgVEwgY29udGV4dCBjb250YWlucyBjdXJyZW50bHkgc2VydmVkIHN0YXRpb24gSUQgaW4gdWNDdXJyZW50U1RBIGZpZWxkLCBjdXJyZW50bHkgc2VydmVkIEFDCisgICBpbiB1Q3VyU2VydmVkQUMgZmllbGQsIGFuZCB1bnNlcnZlZCB3ZWlnaHRzIG9mIGN1cnJlbnQgQUMgaW4gdUN1ckxlZnRXZWlnaHQuCisgICBXaGVuIGV4aXN0aW5nIGZyb20gdGhlIGZ1bmN0aW9uLCB0aGVzZSB0aHJlZSBmaWVsZHMgYXJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTl9UTEFQR2V0TmV4dFR4SWRzCisoCisgIHZfUFZPSURfdCAgICBwdm9zR0N0eCwKKyAgdl9VOF90KiAgICAgIHB1Y1NUQUlkCispCit7CisgIFdMQU5UTF9DYlR5cGUqICBwVExDYjsKKyAgdl9VOF90ICAgICAgICAgIHVjQUNGaWx0ZXIgPSAxOworICB2X1U4X3QgICAgICAgICAgdWNOZXh0U1RBIDsgCisgIHZfQk9PTF90ICAgICAgICBpc1NlcnZlZCA9IFRSVUU7ICAvL2N1cnJlbnQgcm91bmQgaGFzIGZpbmQgYSBwYWNrZXQgb3Igbm90CisgIHZfVThfdCAgICAgICAgICB1Y0FDTG9vcE51bSA9IFdMQU5UTF9BQ19WTyArIDE7IC8vbnVtYmVyIG9mIGxvb3AgdG8gZ28KKyAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzazsgLy8gVFggRmxvd01hc2sgZnJvbSBXREEKKyAgdWludDggICAgICAgICAgIHVjQUNNYXNrOyAKKyAgdWludDggICAgICAgICAgIGk7IAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvL0VOVEVSKCk7CisKKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5fVExBUEdldE5leHRUeElkcyIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX0dldFR4Rmxvd01hc2soIHB2b3NHQ3R4LCAmdUZsb3dNYXNrICkgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgIldMQU4gVEw6RmFpbGVkIHRvIHJldHJpZXZlIEZsb3cgY29udHJvbCBtYXNrIGZyb20gV0RBIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICB1Y05leHRTVEEgPSBwVExDYi0+dWNDdXJyZW50U1RBOworCisgICsrdWNOZXh0U1RBOworCisgIGlmICggV0xBTl9NQVhfU1RBX0NPVU5UIDw9IHVjTmV4dFNUQSApCisgIHsKKyAgICAvL29uZSByb3VuZCBpcyBkb25lLgorICAgIHVjTmV4dFNUQSA9IDA7CisgICAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodC0tOworICAgIGlzU2VydmVkID0gRkFMU0U7CisgICAgaWYgKCAwID09IHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgKQorICAgIHsKKyAgICAgIC8vY3VycmVudCBwcmlvaXJ0eSBpcyBkb25lCisgICAgICBpZiAoIFdMQU5UTF9BQ19CSyA9PSAoV0xBTlRMX0FDRW51bVR5cGUpcFRMQ2ItPnVDdXJTZXJ2ZWRBQyApCisgICAgICB7CisgICAgICAgIC8vZW5kIG9mIGN1cnJlbnQgVk8sIFZJLCBCRSwgQksgbG9vcC4gUmVzZXQgcHJpb3JpdHkuCisgICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfVk87CisgICAgICB9CisgICAgICBlbHNlIAorICAgICAgeworICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDIC0tOworICAgICAgfQorCisgICAgICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID0gIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbcFRMQ2ItPnVDdXJTZXJ2ZWRBQ107CisgCisgICAgfSAvLyAoMCA9PSBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0KQorICB9IC8vKCBXTEFOX01BWF9TVEFfQ09VTlQgPT0gdWNOZXh0U1RBICkKKworICAvL2RlY2lkZSBob3cgbWFueSBsb29wcyB0byBnby4gaWYgY3VycmVudCBsb29wIGlzIHBhcnRpYWwsIGRvIG9uZSBleHRyYSB0byBtYWtlIHN1cmUKKyAgLy93ZSBjb3ZlciBldmVyeSBzdGF0aW9uCisgIGlmICgoMSA9PSBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0KSAmJiAodWNOZXh0U1RBICE9IDApKQorICB7CisgICAgdWNBQ0xvb3BOdW0gKys7IC8vIG5vdyBpcyA1IGxvb3BzCisgIH0KKworICAvKiBTdGFydCB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkuIHVjTmV4dFNUQSwgcFRMQ2ItPnVDdXJTZXJ2ZWRBQywgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodAorICAgICBhbGwgaGF2ZSBwcmV2aW91cyB2YWx1ZXMuKi8KKyAgZm9yICg7IHVjQUNMb29wTnVtID4gMDsgIHVjQUNMb29wTnVtLS0pCisgIHsKKworICAgIHVjQUNGaWx0ZXIgPSAxIDw8IHBUTENiLT51Q3VyU2VydmVkQUM7CisKKyAgICAvLyBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0IGtlZXBzIHByZXZpb3VzIHJlc3VsdHMuCisgICAgZm9yICg7IChwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID4gMCkgJiYgKHVGbG93TWFzayAmIHVjQUNGaWx0ZXIpOyBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0LS0gKQorICAgIHsKKworICAgICAgZm9yICggOyB1Y05leHRTVEEgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IHVjTmV4dFNUQSArKyApCisgICAgICB7CisgICAgICAgIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLICgmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXSwgdWNBQ01hc2ssIGkpOyAKKworICAgICAgICBpZiAoICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0udWNFeGlzdHMpIHx8CisgICAgICAgICAgICAgKCgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0udWNQa3RQZW5kaW5nKSAmJiAhKHVjQUNNYXNrKSkgfHwKKyAgICAgICAgICAgICAoMCA9PSAodWNBQ01hc2sgJiB1Y0FDRmlsdGVyKSkgKQorCisgICAgICAgIHsKKyAgICAgICAgICAvL2N1cnJlbnQgc3RhdGlvaW4gZG9lcyBub3QgZXhpc3Qgb3IgaGF2ZSBhbnkgcGFja2V0IHRvIHNlcnZlLgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy9nbyB0byBuZXh0IHN0YXRpb24gaWYgY3VycmVudCBzdGF0aW9uIGNhbid0IHNlbmQgZHVlIHRvIGZsb3cgY29udHJvbAorICAgICAgICAvL1N0YXRpb24gaXMgYWxsb3dlZCB0byBzZW5kIHdoZW4gaXQgaXMgbm90IGluIExXTSBtb2RlLiBXaGVuIHN0YXRpb24gaXMgaW4gTFdNIG1vZGUsCisgICAgICAgIC8vc3RhdGlvbiBpcyBhbGxvd2VkIHRvIHNlbmQgb25seSBhZnRlciBGVyByZXBvcnRzIEZXIG1lbW9yeSBpcyBiZWxvdyB0aHJlc2hvbGQgYW5kIG9uLWZseQorICAgICAgICAvL3BhY2tldHMgYXJlIGxlc3MgdGhlbiBhbGxvd2VkIHZhbHVlCisgICAgICAgIGlmICggKFRSVUUgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS51Y0x3bU1vZGVFbmFibGVkKSAmJiAKKyAgICAgICAgICAgICAoKEZBTFNFID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0udWNMd21FdmVudFJlcG9ydGVkKSB8fCAKKyAgICAgICAgICAgICAgICAgKDAgPCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLnVCdWZmVGhyZXNob2xkTWF4KSkKKyAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIEZpbmQgYSBzdGF0aW9uLiBXZWlnaHQgaXMgdXBkYXRlZCBhbHJlYWR5LgorICAgICAgICAqcHVjU1RBSWQgPSB1Y05leHRTVEE7CisgICAgICAgIHBUTENiLT51Y0N1cnJlbnRTVEEgPSB1Y05leHRTVEE7CisgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0udWNDdXJyZW50QUMgPSBwVExDYi0+dUN1clNlcnZlZEFDOworICAKKyAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAgICAgICIgVEwgc2VydmUgb25lIHN0YXRpb24gQUM6ICVkICBXOiAlZCBTdGFJZDogJWQiLAorICAgICAgICAgICAgICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMsIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQsIHBUTENiLT51Y0N1cnJlbnRTVEEgKSk7CisgICAgICAKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIH0gLy9TVEEgbG9vcAorCisgICAgICB1Y05leHRTVEEgPSAwOworICAgICAgaWYgKCBGQUxTRSA9PSBpc1NlcnZlZCApCisgICAgICB7CisgICAgICAgIC8vY3VycmVudCBsb29wIGZpbmRzIG5vIHBhY2tldC5ubyBuZWVkIHRvIHJlcGVhdCBmb3IgdGhlIHNhbWUgcHJpb3JpdHkKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvL2N1cnJlbnQgbG9vcCBpcyBwYXJ0aWFsIGxvb3AuIGdvIGZvciBvbmUgbW9yZSBsb29wLgorICAgICAgaXNTZXJ2ZWQgPSBGQUxTRTsKKworICAgIH0gLy9XZWlnaHQgbG9vcAorCisgICAgaWYgKFdMQU5UTF9BQ19CSyA9PSBwVExDYi0+dUN1clNlcnZlZEFDKQorICAgIHsKKyAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfVk87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwVExDYi0+dUN1clNlcnZlZEFDLS07CisgICAgfQorICAgIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgPSAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1twVExDYi0+dUN1clNlcnZlZEFDXTsKKworICB9Ly8gQUMgbG9vcAorCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIiBUTCBjYW4ndCBmaW5kIG9uZSBzdGF0aW9uIHRvIHNlcnZlIFxuIiApKTsKKworICBwVExDYi0+dUN1clNlcnZlZEFDID0gV0xBTlRMX0FDX0JLOworICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID0gMTsKKyAgLy9pbnZhbGlkIG51bWJlciB3aWxsIGJlIGNhcHR1cmVkIGJ5IGNhbGxlcgorICBwVExDYi0+dWNDdXJyZW50U1RBID0gV0xBTl9NQVhfU1RBX0NPVU5UOyAKKworICAqcHVjU1RBSWQgPSBwVExDYi0+dWNDdXJyZW50U1RBOworICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLnVjQ3VycmVudEFDID0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQzsKKyAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5fVExHZXROZXh0VHhJZHMKKworICBERVNDUklQVElPTgorICAgIEdldHMgdGhlIG5leHQgc3RhdGlvbiBhbmQgbmV4dCBBQyBpbiB0aGUgbGlzdAorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgIHB2b3NHQ3R4OiAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisKKyAgIE9VVAorICAgcHVjU1RBSWQ6ICAgIFN0YXRpb24gSUQKKworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTl9UTEdldE5leHRUeElkcworKAorICB2X1BWT0lEX3QgICAgcHZvc0dDdHgsCisgIHZfVThfdCogICAgICBwdWNTVEFJZAorKQoreworICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2I7CisgIHZfVThfdCAgICAgICAgICB1Y05leHRBQzsKKyAgdl9VOF90ICAgICAgICAgIHVjTmV4dFNUQTsgCisgIHZfVThfdCAgICAgICAgICB1Y0NvdW50OyAKKyAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzazsgLy8gVFggRmxvd01hc2sgZnJvbSBXREEKKyAgdl9VOF90ICAgICAgICAgIHVjQUNNYXNrID0gMDsKKyAgdl9VOF90ICAgICAgICAgIGkgPSAwOyAKKworICB0QnNzU3lzdGVtUm9sZSBzeXN0ZW1Sb2xlOyAvL1JHIEhBQ0sgdG8gYmUgcmVtb3ZlZAorICB0cEFuaVNpckdsb2JhbCBwTWFjOworCisgIHBNYWMgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9QRSwgcHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcE1hYyApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBNYWMiLCBfX0ZVTkNUSU9OX18pKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgc3lzdGVtUm9sZSA9IHdkYUdldEdsb2JhbFN5c3RlbVJvbGUocE1hYyk7CisgIGlmICgoZVNZU1RFTV9BUF9ST0xFID09IHN5c3RlbVJvbGUpIHx8ICh2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpKQorICB7CisgICAgcmV0dXJuIFdMQU5fVExBUEdldE5leHRUeElkcyhwdm9zR0N0eCxwdWNTVEFJZCk7CisgIH0KKworICAKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5fVExHZXROZXh0VHhJZHMiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19HZXRUeEZsb3dNYXNrKCBwdm9zR0N0eCwgJnVGbG93TWFzayApICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICJXTEFOIFRMOkZhaWxlZCB0byByZXRyaWV2ZSBGbG93IGNvbnRyb2wgbWFzayBmcm9tIFdEQSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLypTVEEgaWQgLSBubyBwcmlvcml0eSB5ZXQgaW1wbGVtZW50ZWQgKi8KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENob29zZSB0aGUgbmV4dCBTVEEgZm9yIHR4IC0gZm9yIG5vdyBnbyBpbiBhIHJvdW5kIHJvYmluIGZhc2hpb24KKyAgICB0aHJvdWdoIGFsbCB0aGUgc3RhdGlvbnMgdGhhdCBoYXZlIHBlbmRpbmcgcGFja2V0cyAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB1Y05leHRTVEEgPSBwVExDYi0+dWNDdXJyZW50U1RBOworICAKKyAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IFdMQU5fTUFYX1NUQV9DT1VOVDsgCisgIGZvciAoIHVjQ291bnQgPSAwOyAKKyAgICAgICAgdWNDb3VudCA8IFdMQU5fTUFYX1NUQV9DT1VOVDsKKyAgICAgICAgdWNDb3VudCsrICkKKyAgeworICAgIHVjTmV4dFNUQSA9ICggKHVjTmV4dFNUQSsxKSA+PSBXTEFOX01BWF9TVEFfQ09VTlQgKT8wOih1Y05leHRTVEErMSk7CisgICAgCisgICAgaWYgKCggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS51Y0V4aXN0cyApICYmCisgICAgICAgICggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS51Y1BrdFBlbmRpbmcgKSkKKyAgICB7CisgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgIlNUQSBJRDogJWQgb24gV0xBTl9UTEdldE5leHRUeElkcyIsICpwdWNTVEFJZCkpOworICAgICAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IHVjTmV4dFNUQTsgCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAqcHVjU1RBSWQgPSBwVExDYi0+dWNDdXJyZW50U1RBOworCisgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCAqcHVjU1RBSWQgKSApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgIldMQU4gVEw6Tm8gc3RhdGlvbiByZWdpc3RlcmVkIHdpdGggVEwgYXQgdGhpcyBwb2ludCIpKTsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisKKyAgfQorCisgIC8qQ29udmVydCB0aGUgYXJyYXkgdG8gYSBtYXNrIGZvciBlYXNpZXIgb3BlcmF0aW9uKi8KKyAgV0xBTl9UTF9BQ19BUlJBWV8yX01BU0soICZwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLCB1Y0FDTWFzaywgaSk7IAorICAKKyAgaWYgKCAwID09IHVjQUNNYXNrICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICJXTEFOIFRMOiBNYXNrIDAgIgorICAgICAgIlNUQSBJRDogJWQgb24gV0xBTl9UTEdldE5leHRUeElkcyIsICpwdWNTVEFJZCkpOworCisgICAgIC8qc2V0dGluZyBTVEEgaWQgdG8gaW52YWxpZCBpZiBtYXNrIGlzIDAqLworICAgICAqcHVjU1RBSWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CisKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBQyBpcyB1cGRhdGVkIHdoZW5ldmVyIGEgcGFja2V0IGlzIGZldGNoZWQgZnJvbSBIREQgLT4gdGhlIGN1cnJlbnQKKyAgICB3ZWlnaHQgb2Ygc3VjaCBhbiBBQyBjYW5ub3QgYmUgMCAtPiBpbiB0aGlzIGNhc2UgVEwgaXMgZXhwZWN0ZWQgdG8KKyAgICBleGl0IHRoaXMgZnVuY3Rpb24gYXQgdGhpcyBwb2ludCBkdXJpbmcgdGhlIG1haW4gVHggbG9vcAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggMCA8IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0udWNDdXJyZW50V2VpZ2h0ICApCisgIHsKKyAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IE1haW50YWluaW5nIHNlcnZpY2VkIEFDIHRvOiAlZCBmb3IgV2VpZ2h0OiAlZCIsCisgICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLnVjQ3VycmVudEFDICwKKyAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0udWNDdXJyZW50V2VpZ2h0KSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgQ2hvb3NlIGhpZ2hlc3QgcHJpb3JpdHkgQUMgLSAhISEgb3B0aW1pemUgbWUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB1Y05leHRBQyA9IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0udWNDdXJyZW50QUM7CisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiTmV4dCBBQzogJWQiLCB1Y05leHRBQykpOworCisgIHdoaWxlICggMCAhPSB1Y0FDTWFzayApCisgIHsKKyAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICIgQUMgTWFzazogJWQgTmV4dDogJWQgUmVzIDogJWQiLAorICAgICAgICAgICAgICAgdWNBQ01hc2ssICggMSA8PCB1Y05leHRBQyApLCAoIHVjQUNNYXNrICYgKCAxIDw8IHVjTmV4dEFDICkpKSk7CisKKyAgICBpZiAoIDAgIT0gKCB1Y0FDTWFzayAmICggMSA8PCB1Y05leHRBQyApICYgdUZsb3dNYXNrICkpCisgICAgeworICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0udWNDdXJyZW50QUMgICAgID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfQUNFbnVtVHlwZSl1Y05leHRBQzsKKyAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLnVjQ3VycmVudFdlaWdodCA9CisgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNOZXh0QUNdOworCisgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogU3dpdGNoaW5nIHNlcnZpY2VkIEFDIHRvOiAlZCB3aXRoIFdlaWdodDogJWQiLAorICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS51Y0N1cnJlbnRBQyAsCisgICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLnVjQ3VycmVudFdlaWdodCkpOworICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHVjTmV4dEFDID0gKCB1Y05leHRBQyAtIDEgKSAmIFdMQU5UTF9NQVNLX0FDOworCisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICJOZXh0IEFDICVkIiwgdWNOZXh0QUMpKTsKKworICB9CisKKyAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiIEMgQUM6ICVkIEMgVzogJWQiLAorICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0udWNDdXJyZW50QUMsCisgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS51Y0N1cnJlbnRXZWlnaHQpKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5fVExHZXROZXh0VHhJZHMgKi8KKworI2Vsc2UKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOX1RMR2V0TmV4dFR4SWRzCisKKyAgREVTQ1JJUFRJT04KKyAgICBHZXRzIHRoZSBuZXh0IHN0YXRpb24gYW5kIG5leHQgQUMgaW4gdGhlIGxpc3QKKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICBwdm9zR0N0eDogICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorCisgICBPVVQKKyAgIHB1Y1NUQUlkOiAgICBTdGF0aW9uIElECisKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5fVExHZXROZXh0VHhJZHMKKygKKyAgdl9QVk9JRF90ICAgIHB2b3NHQ3R4LAorICB2X1U4X3QqICAgICAgcHVjU1RBSWQKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiOworICB2X1U4X3QgICAgICAgICAgdWNOZXh0QUM7CisgIHZfVThfdCAgICAgICAgICB1Y05leHRTVEE7IAorICB2X1U4X3QgICAgICAgICAgdWNDb3VudDsgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOX1RMR2V0TmV4dFR4SWRzIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKlNUQSBpZCAtIG5vIHByaW9yaXR5IHlldCBpbXBsZW1lbnRlZCAqLworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hvb3NlIHRoZSBuZXh0IFNUQSBmb3IgdHggLSBmb3Igbm93IGdvIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbgorICAgIHRocm91Z2ggYWxsIHRoZSBzdGF0aW9ucyB0aGF0IGhhdmUgcGVuZGluZyBwYWNrZXRzICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVjTmV4dFNUQSA9IHBUTENiLT51Y0N1cnJlbnRTVEE7CisgIAorICBwVExDYi0+dWNDdXJyZW50U1RBID0gV0xBTl9NQVhfU1RBX0NPVU5UOyAKKyAgZm9yICggdWNDb3VudCA9IDA7IAorICAgICAgICB1Y0NvdW50IDwgV0xBTl9NQVhfU1RBX0NPVU5UOworICAgICAgICB1Y0NvdW50KysgKQorICB7CisgICAgdWNOZXh0U1RBID0gKCAodWNOZXh0U1RBKzEpID49IFdMQU5fTUFYX1NUQV9DT1VOVCApPzA6KHVjTmV4dFNUQSsxKTsKKyAgICAKKyAgICBpZiAoKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLnVjRXhpc3RzICkgJiYKKyAgICAgICAgKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLnVjUGt0UGVuZGluZyApKQorICAgIHsKKyAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAiV0xBTiBUTDpObyBzdGF0aW9uIHJlZ2lzdGVyZWQgd2l0aCBUTCBhdCB0aGlzIHBvaW50IG9yIE1hc2sgMCIKKyAgICAgICJTVEEgSUQ6ICVkIG9uIFdMQU5fVExHZXROZXh0VHhJZHMiLCAqcHVjU1RBSWQpKTsKKyAgICAgIHBUTENiLT51Y0N1cnJlbnRTVEEgPSB1Y05leHRTVEE7IAorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgKnB1Y1NUQUlkID0gcFRMQ2ItPnVjQ3VycmVudFNUQTsKKworICAgaWYgKCAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggKnB1Y1NUQUlkICkgKSB8fAorICAgICAgICAoIDAgPT0gdWNBQ01hc2sgKSApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAiV0xBTiBUTDpObyBzdGF0aW9uIHJlZ2lzdGVyZWQgd2l0aCBUTCBhdCB0aGlzIHBvaW50IG9yIE1hc2sgMCIKKyAgICAgICJTVEEgSUQ6ICVkIG9uIFdMQU5fVExHZXROZXh0VHhJZHMiLCAqcHVjU1RBSWQpKTsKKworICAgICAvKnNldHRpbmcgU1RBIGlkIHRvIGludmFsaWQgaWYgbWFzayBpcyAwKi8KKyAgICAgKnB1Y1NUQUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOworCisgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQUMgaXMgdXBkYXRlZCB3aGVuZXZlciBhIHBhY2tldCBpcyBmZXRjaGVkIGZyb20gSEREIC0+IHRoZSBjdXJyZW50CisgICAgd2VpZ2h0IG9mIHN1Y2ggYW4gQUMgY2Fubm90IGJlIDAgLT4gaW4gdGhpcyBjYXNlIFRMIGlzIGV4cGVjdGVkIHRvCisgICAgZXhpdCB0aGlzIGZ1bmN0aW9uIGF0IHRoaXMgcG9pbnQgZHVyaW5nIHRoZSBtYWluIFR4IGxvb3AKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIDAgPCBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLnVjQ3VycmVudFdlaWdodCAgKQorICB7CisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBNYWludGFpbmluZyBzZXJ2aWNlZCBBQyB0bzogJWQgZm9yIFdlaWdodDogJWQiLAorICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS51Y0N1cnJlbnRBQyAsCisgICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLnVjQ3VycmVudFdlaWdodCkpOworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIENob29zZSBoaWdoZXN0IHByaW9yaXR5IEFDIC0gISEhIG9wdGltaXplIG1lCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdWNOZXh0QUMgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLnVjQ3VycmVudEFDOworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIk5leHQgQUM6ICVkIiwgdWNOZXh0QUMpKTsKKworICB3aGlsZSAoIDAgIT0gdWNBQ01hc2sgKQorICB7CisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiIEFDIE1hc2s6ICVkIE5leHQ6ICVkIFJlcyA6ICVkIiwKKyAgICAgICAgICAgICAgIHVjQUNNYXNrLCAoIDEgPDwgdWNOZXh0QUMgKSwgKCB1Y0FDTWFzayAmICggMSA8PCB1Y05leHRBQyApKSkpOworCisgICAgaWYgKCAwICE9ICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLmF1Y0FDTWFza1t1Y05leHRBQ10gKQorICAgIHsKKyAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLnVjQ3VycmVudEFDICAgICA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0xBTlRMX0FDRW51bVR5cGUpdWNOZXh0QUM7CisgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS51Y0N1cnJlbnRXZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjTmV4dEFDXTsKKworICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFN3aXRjaGluZyBzZXJ2aWNlZCBBQyB0bzogJWQgd2l0aCBXZWlnaHQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0udWNDdXJyZW50QUMgLAorICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS51Y0N1cnJlbnRXZWlnaHQpKTsKKyAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB1Y05leHRBQyA9ICggdWNOZXh0QUMgLSAxICkgJiBXTEFOVExfTUFTS19BQzsKKworICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiTmV4dCBBQyAlZCIsIHVjTmV4dEFDKSk7CisKKyAgfQorCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIiBDIEFDOiAlZCBDIFc6ICVkIiwKKyAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLnVjQ3VycmVudEFDLAorICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0udWNDdXJyZW50V2VpZ2h0KSk7CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOX1RMR2V0TmV4dFR4SWRzICovCisjZW5kaWYgLy9XTEFOX1NPRlRBUF9GRUFUVVJFCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgREVGQVVMVCBIQU5ETEVSUzogUmVnaXN0ZXJlZCBhdCBpbml0aWFsaXphdGlvbiB3aXRoIFRMCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IKKworICBERVNDUklQVElPTgorICAgIERlZmF1bHQgTWdtdCBGcm0gcnggY2FsbGJhY2s6IGFzc2VydHMgYWxsIHRoZSB0aW1lLiBJZiB0aGlzIGZ1bmN0aW9uIGdldHMKKyAgICBjYWxsZWQgIGl0IG1lYW5zIHRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgcnggY2IgcG9pbnRlciBmb3IgTWdtdCBGcm0uCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworICAgIE5vdCB1c2VkLgorCisgIFJFVFVSTiBWQUxVRQorCisgICBWT1NfU1RBVFVTX0VfRkFJTFVSRTogQWx3YXlzIEZBSUxVUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYgorKAorICB2X1BWT0lEX3QgIHB2b3NHQ3R4LAorICB2X1BWT0lEX3QgIHZvc0J1ZmYKKykKK3sKKyAgaWYgKCBOVUxMICE9IHZvc0J1ZmYgKQorICB7CisgICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICJXTEFOIFRMOkZhdGFsIGZhaWx1cmU6IE5vIHJlZ2lzdGVyZWQgTWdtdCBGcm0gY2xpZW50IG9uIHBrdCBSWCIpKTsKKyAgICAvKiBEcm9wIHBhY2tldCAqLworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCgodm9zX3BrdF90ICopdm9zQnVmZik7CisgIH0KKworI2lmICFkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorICBpZighdm9zX2lzX2xvYWRfdW5sb2FkX2luX3Byb2dyZXNzKFZPU19NT0RVTEVfSURfVEwsIE5VTEwpKQorICB7CisgICAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhdGFsIGZhaWx1cmU6IE5vIHJlZ2lzdGVyZWQgTWdtdCBGcm0gY2xpZW50IG9uIHBrdCBSWCIpKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgIH0KKyAgZWxzZQorICB7CisjZW5kaWYKKyAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyByZWdpc3RlcmVkIE1nbXQgRnJtIGNsaWVudCBvbiBwa3QgUlguIExvYWQvVW5sb2FkIGluIHByb2dyZXNzLCBJZ25vcmUiKSk7CisjaWYgIWRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgIH0KKyNlbmRpZgorCisgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKK30vKldMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4RGVmYXVsdENiCisKKyAgREVTQ1JJUFRJT04KKyAgICBEZWZhdWx0IEJBUCByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cworICAgIGNhbGxlZCAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCByeCBjYiBwb2ludGVyIGZvciBCQVAuCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworICAgIE5vdCB1c2VkLgorCisgIFJFVFVSTiBWQUxVRQorCisgICBWT1NfU1RBVFVTX0VfRkFJTFVSRTogQWx3YXlzIEZBSUxVUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX0JBUFJ4RGVmYXVsdENiCisoCisgIHZfUFZPSURfdCAgcHZvc0dDdHgsCisgIHZvc19wa3RfdCogICAgICAgdm9zRGF0YUJ1ZmYsCisgIFdMQU5UTF9CQVBGcmFtZUVudW1UeXBlIGZyYW1lVHlwZQorKQoreworICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgIldMQU4gVEw6RmF0YWwgZmFpbHVyZTogTm8gcmVnaXN0ZXJlZCBCQVAgY2xpZW50IG9uIEJBUCBwa3QgUlgiKSk7CisjaWZuZGVmIEJUQU1QX1RFU1QKKyAgVk9TX0FTU0VSVCgwKTsKKyNlbmRpZgorICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7Cit9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeERlZmF1bHRDYgorCisgIERFU0NSSVBUSU9OCisgICAgRGVmYXVsdCBTVEEgcnggY2FsbGJhY2s6IGFzc2VydHMgYWxsIHRoZSB0aW1lLiBJZiB0aGlzIGZ1bmN0aW9uIGdldHMKKyAgICBjYWxsZWQgIGl0IG1lYW5zIHRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgcnggY2IgcG9pbnRlciBmb3Igc3RhdGlvbi4KKyAgICAoTWVtIGNvcnJ1cHRpb24gbW9zdCBsaWtlbHksIGl0IHNob3VsZCBuZXZlciBoYXBwZW4pCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworICAgIE5vdCB1c2VkLgorCisgIFJFVFVSTiBWQUxVRQorCisgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9TVEFSeERlZmF1bHRDYgorKAorICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKKyAgdm9zX3BrdF90KiAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCisgIHZfVThfdCAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCisgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSogIHBSeE1ldGFJbmZvCispCit7CisgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAiV0xBTiBUTDogTm8gcmVnaXN0ZXJlZCBTVEEgY2xpZW50IHJ4IGNiIGZvciBTVEFJRDogJWQgZHJvcHBpbmcgcGt0IiwKKyAgICAgICAgICAgICAgIHVjU1RBSWQpKTsKKyAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKKyAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworfS8qV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYiovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFGZXRjaFBrdERlZmF1bHRDYgorCisgIERFU0NSSVBUSU9OCisgICAgRGVmYXVsdCBmZXRjaCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cworICAgIGNhbGxlZCAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCBmZXRjaCBjYiBwb2ludGVyIGZvciBzdGF0aW9uLgorICAgIChNZW0gY29ycnVwdGlvbiBtb3N0IGxpa2VseSwgaXQgc2hvdWxkIG5ldmVyIGhhcHBlbikKKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisgICAgTm90IHVzZWQuCisKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRTogQWx3YXlzIEZBSUxVUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiCisoCisgIHZfUFZPSURfdCAgICAgICAgICAgICAgcHZvc0dDdHgsCisgIHZfVThfdCogICAgICAgICAgICAgICAgcHVjU1RBSWQsCisgIFdMQU5UTF9BQ0VudW1UeXBlICAgICAgdWNBQywKKyAgdm9zX3BrdF90KiogICAgICAgICAgICB2b3NEYXRhQnVmZiwKKyAgV0xBTlRMX01ldGFJbmZvVHlwZSogICB0bE1ldGFJbmZvCispCit7CisgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAiV0xBTiBUTDpGYXRhbCBmYWlsdXJlOiBObyByZWdpc3RlcmVkIFNUQSBjbGllbnQgb24gZGF0YSBwa3QgUlgiKSk7CisgIFZPU19BU1NFUlQoMCk7CisgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKK30vKldMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1R4Q29tcERlZmF1bHRDYgorCisgIERFU0NSSVBUSU9OCisgICAgRGVmYXVsdCB0eCBjb21wbGV0ZSBoYW5kbGVyLiBJdCB3aWxsIHJlbGVhc2UgdGhlIGNvbXBsZXRlZCBwa3QgdG8KKyAgICBwcmV2ZW50IG1lbW9yeSBsZWFrcy4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvCisgICAgICAgICAgICAgICAgICAgIFRML0hBTC9QRS9CQVAvSEREIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tCisgICAgICAgICAgICAgICAgICAgIGl0cyBjb250ZXh0CisgICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgVk9TUyBkYXRhIGJ1ZmZlciB0aGF0IHdhcyB0cmFuc21pdHRlZAorICAgIHdUeFNUQXR1czogICAgICBzdGF0dXMgb2YgdGhlIHRyYW5zbWlzc2lvbgorCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb247IHBsZWFzZQorICAgIGNoZWNrIHZvc19wa3RfcmV0dXJuX3BhY2tldCBmb3IgcG9zc2libGUgZXJyb3IgY29kZXMuCisKKyAgICBQbGVhc2UgY2hlY2sgIHZvc19wa3RfcmV0dXJuX3BhY2tldCBBUEkgZm9yIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1R4Q29tcERlZmF1bHRDYgorKAorIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAorIHZvc19wa3RfdCogICAgIHZvc0RhdGFCdWZmLAorIFZPU19TVEFUVVMgICAgIHdUeFNUQXR1cworKQoreworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgIldMQU4gVEw6VFhDb21wIG5vdCByZWdpc3RlcmVkLCByZWxlYXNpbmcgcGt0IHRvIHByZXZlbnQgbWVtIGxlYWsiKSk7CisgIHJldHVybiB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOworfS8qV0xBTlRMX1R4Q29tcERlZmF1bHRDYiovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgQ2xlYW51cCBmdW5jdGlvbnMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFuQ0IKKworICBERVNDUklQVElPTgorICAgIENsZWFucyBUTCBjb250cm9sIGJsb2NrCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwVExDYjogICAgICAgcG9pbnRlciB0byBUTCdzIGNvbnRyb2wgYmxvY2sKKyAgICB1Y0VtcHR5OiAgICAgc2V0IGlmIFRMIGhhcyB0byBjbGVhbiB1cCB0aGUgcXVldWVzIGFuZCByZWxlYXNlIHBlZG5pbmcgcGt0cworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycworICAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX0NsZWFuQ0IKKygKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiLAorICB2X1U4X3QgICAgICB1Y0VtcHR5CispCit7CisgIHZfVThfdCB1Y0luZGV4OworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfQ2xlYW5DQiIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgLyogbnVtYmVyIG9mIHBhY2tldHMgc2VudCB0byBCQUwgd2FpdGluZyBmb3IgdHggY29tcGxldGUgY29uZmlybWF0aW9uICovCisgIHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQgPSAwOworCisgIC8qIGdsb2JhbCBzdXNwZW5kIGZsYWcgKi8KKyAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPnVjVHhTdXNwZW5kZWQsIDEpOworCisgIC8qIHJlc291cmNlIGZsYWcgKi8KKyAgcFRMQ2ItPnVSZXNDb3VudCA9IDA7CisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDbGllbnQgc3RhdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1NUQV9DT1VOVCA7IHVjSW5kZXgrKykKKyAgeworICAgIFdMQU5UTF9DbGVhblNUQSggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLCB1Y0VtcHR5KTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1hbmFnZW1lbnQgRnJhbWUgY2xpZW50CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyA9IDA7CisKKyAgaWYgKCAoIDAgIT0gdWNFbXB0eSkgJiYKKyAgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKSkKKyAgeworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZik7CisgIH0KKworICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiAgPSBOVUxMOworCisgIC8qIHNldCB0byBhIGRlZmF1bHQgY2IgaW4gb3JkZXIgdG8gcHJldmVudCBjb25zdGFudCBjaGVja2luZyBmb3IgTlVMTCAqLworICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4ID0gV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBCVCBBTVAgY2xpZW50CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzID0gMDsKKworICBpZiAoKCAwICE9IHVjRW1wdHkpICYmCisgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApKQorICB7CisgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOworICB9CisgIAorICBpZiAoKCAwICE9IHVjRW1wdHkpICYmCisgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnZvc0R1bW15QnVmICkpCisgIHsKKyAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnZvc0R1bW15QnVmKTsKKyAgfQorCisgIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgID0gTlVMTDsKKworICBwVExDYi0+dm9zRHVtbXlCdWYgPSBOVUxMOworICBwVExDYi0+dm9zVGVtcEJ1ZiAgPSBOVUxMOworICBwVExDYi0+dWNDYWNoZWRTVEFJZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKKworICAvKiBzZXQgdG8gYSBkZWZhdWx0IGNiIGluIG9yZGVyIHRvIHByZXZlbnQgY29uc3RhbnQgY2hlY2tpbmcgZm9yIE5VTEwgKi8KKyAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmblRsQkFQUnggPSBXTEFOVExfQkFQUnhEZWZhdWx0Q2I7CisKKyAgcFRMQ2ItPnVjUmVnaXN0ZXJlZFN0YUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKK30vKiBXTEFOVExfQ2xlYW5DQiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfQ2xlYW5TVEEKKworICBERVNDUklQVElPTgorICAgIENsZWFucyBhIHN0YXRpb24gY29udHJvbCBibG9jay4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICB1Y0VtcHR5OiAgICAgICAgaWYgc2V0IHRoZSBxdWV1ZXMgYW5kIHBlbmRpbmcgcGt0cyB3aWxsIGJlIGVtcHR5ZWQKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfQ2xlYW5TVEEKKygKKyAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICBwdGxTVEFDbGllbnQsCisgIHZfVThfdCAgICAgICAgICAgICB1Y0VtcHR5CispCit7CisgIHZfVThfdCAgdWNJbmRleDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBOVUxMID09IHB0bFNUQUNsaWVudCApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9DbGVhblNUQSIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDbGVhciBzdGF0aW9uIGZyb20gVEwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6IENsZWFyaW5nIFNUQSBDbGllbnQgSUQ6ICVkLCBFbXB0eSBmbGFnOiAlZCIsCisgICAgICAgICAgICAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1NUQUlkLCB1Y0VtcHR5ICkpOworCisgIHB0bFNUQUNsaWVudC0+cGZuU1RBUnggICAgICAgICAgPSBXTEFOVExfU1RBUnhEZWZhdWx0Q2I7CisgIHB0bFNUQUNsaWVudC0+cGZuU1RBVHhDb21wICAgICAgPSBXTEFOVExfVHhDb21wRGVmYXVsdENiOworICBwdGxTVEFDbGllbnQtPnBmblNUQUZldGNoUGt0ICAgID0gV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiOworCisgIHB0bFNUQUNsaWVudC0+dGxTdGF0ZSAgICAgICAgICAgPSBXTEFOVExfU1RBX0lOSVQ7CisgIHB0bFNUQUNsaWVudC0+dGxQcmkgICAgICAgICAgICAgPSBXTEFOVExfU1RBX1BSSV9OT1JNQUw7CisKKyAgdm9zX3plcm9fbWFjYWRkciggJnB0bFNUQUNsaWVudC0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MgKTsKKyAgdm9zX3plcm9fbWFjYWRkciggJnB0bFNUQUNsaWVudC0+d1NUQURlc2MudkJTU0lEZm9ySUJTUyApOworICB2b3NfemVyb19tYWNhZGRyKCAmcHRsU1RBQ2xpZW50LT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MgKTsKKworICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU1RBSWQgID0gMDsKKyAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSA9IFdMQU5fU1RBX01BWDsKKworICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCAgICAgPSAwOworICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjQWRkUm12TExDICAgICAgPSAwOworICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IDA7CisgIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uID0gMDsKKyAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1Byb3RlY3RlZEZyYW1lID0gMDsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBTVNEVSBpbmZvcm1hdGlvbiBmb3IgdGhlIFNUQQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggKCAwICE9IHVjRW1wdHkgKSAmJgorICAgICAgICggTlVMTCAhPSBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW5Sb290ICkpCisgIHsKKyAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocHRsU1RBQ2xpZW50LT52b3NBTVNEVUNoYWluUm9vdCk7CisgIH0KKworICBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW4gICAgID0gTlVMTDsKKyAgcHRsU1RBQ2xpZW50LT52b3NBTVNEVUNoYWluUm9vdCA9IE5VTEw7CisKKyAgdm9zX21lbV96ZXJvKCAodl9QVk9JRF90KXB0bFNUQUNsaWVudC0+YXVjTVBEVUhlYWRlciwKKyAgICAgICAgICAgICAgICAgV0xBTlRMX01QRFVfSEVBREVSX0xFTik7CisgIHB0bFNUQUNsaWVudC0+dWNNUERVSGVhZGVyTGVuICAgID0gMDsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSZW9yZGVyaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgU1RBCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9USUQgOyB1Y0luZGV4KyspCisgIHsKKyAgICBpZigwID09IHB0bFNUQUNsaWVudC0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XS51Y0V4aXN0cykKKyAgICB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoTlVMTCAhPSBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlcikKKyAgICB7CisgICAgICBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlci0+aXNBdmFpbGFibGUgPSBWT1NfVFJVRTsKKyAgICAgIG1lbXNldCgmcHRsU1RBQ2xpZW50LT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLnJlb3JkZXJCdWZmZXItPmFycmF5QnVmZmVyWzBdLCAwLCBXTEFOVExfTUFYX1dJTlNJWkUgKiBzaXplb2Yodl9QVk9JRF90KSk7CisgICAgfQorICAgIHZvc190aW1lcl9kZXN0cm95KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0uYWdpbmdUaW1lcik7CisgICAgbWVtc2V0KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0sIDAsIHNpemVvZihXTEFOVExfQkFSZW9yZGVyVHlwZSkpOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFFPUyBpbmZvcm1hdGlvbiBmb3IgdGhlIFNUQQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcHRsU1RBQ2xpZW50LT51Y0N1cnJlbnRBQyAgICAgPSBXTEFOVExfQUNfVk87CisgICBwdGxTVEFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IDA7CisgICBwdGxTVEFDbGllbnQtPnVjU2VydmljZWRBQyAgICA9IFdMQU5UTF9BQ19CSzsKKworICAgdm9zX21lbV96ZXJvKCBwdGxTVEFDbGllbnQtPmF1Y0FDTWFzaywgc2l6ZW9mKHB0bFNUQUNsaWVudC0+YXVjQUNNYXNrKSk7CisgICB2b3NfbWVtX3plcm8oICZwdGxTVEFDbGllbnQtPndVQVBTREluZm8sIHNpemVvZihwdGxTVEFDbGllbnQtPndVQVBTREluZm8pKTsKKworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTdGF0cyBpbmZvCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgdm9zX21lbV96ZXJvKCBwdGxTVEFDbGllbnQtPmF1UnhDb3VudCwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0bFNUQUNsaWVudC0+YXVSeENvdW50WzBdKSogV0xBTl9NQVhfVElEKTsKKyAgIHZvc19tZW1femVybyggcHRsU1RBQ2xpZW50LT5hdVR4Q291bnQsCisgICAgICAgICAgICAgICAgIHNpemVvZihwdGxTVEFDbGllbnQtPmF1VHhDb3VudFswXSkqIFdMQU5fTUFYX1RJRCk7CisgICBwdGxTVEFDbGllbnQtPnJzc2lBdmcgPSAwOworCisgICAvKlR4IG5vdCBzdXNwZW5kZWQgYW5kIHN0YXRpb24gZnVsbHkgcmVnaXN0ZXJlZCovCisgICB2b3NfYXRvbWljX3NldF9VOCggJnB0bFNUQUNsaWVudC0+dWNUeFN1c3BlbmRlZCwgMCk7CisgICB2b3NfYXRvbWljX3NldF9VOCggJnB0bFNUQUNsaWVudC0+dWNOb01vcmVEYXRhLCAxKTsKKworICBpZiAoIDAgPT0gdWNFbXB0eSApCisgIHsKKyAgICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjVWNhc3RTaWcgICAgICAgPSBXTEFOX1RMX0lOVkFMSURfVV9TSUc7CisgICAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y0JjYXN0U2lnICAgICAgID0gV0xBTl9UTF9JTlZBTElEX0JfU0lHOworICB9CisKKyAgcHRsU1RBQ2xpZW50LT51Y0V4aXN0cyAgICAgICA9IDA7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFN0YXRpc3RpY3MgaW5mbyAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIG1lbXNldCgmcHRsU1RBQ2xpZW50LT50cmFmZmljU3RhdGlzdGljcywKKyAgICAgICAgIDAsCisgICAgICAgICBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CisKKyAgLypmaXggbWUhITogYWRkIG5ldyB2YWx1ZXMgZnJvbSB0aGUgVEwgQ2IgZm9yIGNsZWFudXAgKi8KKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOVExfQ2xlYW5TVEEgKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9FbmFibGVVQVBTREZvckFDCisKKyAgREVTQ1JJUFRJT04KKyAgIENhbGxlZCBieSBIREQgdG8gZW5hYmxlIFVBUFNELiBUTCBpbiB0dXJuIGNhbGxzIFdEQSBBUEkgdG8gZW5hYmxlIHRoZQorICAgbG9naWMgaW4gRlcvU0xNIHRvIHN0YXJ0IHNlbmRpbmcgdHJpZ2dlciBmcmFtZXMuIFByZXZpb3VzbHkgVEwgaGFkIHRoZQorICAgdHJpZ2dlciBmcmFtZSBsb2dpYyB3aGljaCBsYXRlciBtb3ZlZCBkb3duIHRvIEZXLiBIZW5jZQorICAgSEREIC0+IFRMIC0+IFdEQSAtPiBGVyBjYWxsIGZsb3cuCisKKyAgREVQRU5ERU5DSUVTCisgICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBJZAorICAgIHVjQUM6ICAgICAgICAgICBBQyBmb3Igd2hpY2ggVS1BUFNEIGlzIGJlaW5nIGVuYWJsZWQKKyAgICB1Y1RpZDogICAgICAgICAgVElEIGZvciB3aGljaCBVLUFQU0QgaXMgc2V0dXAKKyAgICB1Y1VQOiAgICAgICAgICAgdXNlZCB0byBwbGFjZSBpbiB0aGUgdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uCisgICAgdWNTZXJ2aWNlSW50OiAgIHNlcnZpY2UgaW50ZXJ2YWwgdXNlZCBieSBUTCB0byBzZW5kIHRyaWdnZXIgZnJhbWVzCisgICAgdWNTdXNwZW5kSW50OiAgIHN1c3BlbmQgaW50ZXJ2YWwgdXNlZCBieSBUTCB0byBkZXRlcm1pbmUgdGhhdCBhbgorICAgICAgICAgICAgICAgICAgICBhcHAgaXMgaWRsZSBhbmQgc2hvdWxkIHN0YXJ0IHNlbmRpbmcgdHJpZ2cgZnJtcyBsZXNzIG9mdGVuCisgICAgd1RTRGlyOiAgICAgICAgIGRpcmVjdGlvbiBvZiBUU3BlYworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMKKygKKyAgdl9QVk9JRF90ICAgICAgICAgIHB2b3NHQ3R4LAorICB2X1U4X3QgICAgICAgICAgICAgdWNTVEFJZCwKKyAgV0xBTlRMX0FDRW51bVR5cGUgIHVjQUMsCisgIHZfVThfdCAgICAgICAgICAgICB1Y1RpZCwKKyAgdl9VOF90ICAgICAgICAgICAgIHVjVVAsCisgIHZfVTMyX3QgICAgICAgICAgICB1U2VydmljZUludCwKKyAgdl9VMzJfdCAgICAgICAgICAgIHVTdXNwZW5kSW50LAorICBXTEFOVExfVFNEaXJUeXBlICAgd1RTRGlyCispCit7CisKKyAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiAgICAgID0gTlVMTDsKKyAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXMgICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgdFVhcHNkSW5mbyAgICAgICAgICBoYWxVQVBTREluZm87IAorIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkKKyAgICAgIHx8ICAgV0xBTlRMX0FDX0lOVkFMSUQodWNBQykgfHwgKCAwID09IHVTZXJ2aWNlSW50ICkgKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBpbnB1dCBwYXJhbXMgb24gV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMiCisgICAgICAgICAgICAgICAiIFRMOiAleCAgU1RBOiAlZCAgQUM6ICVkIFNJOiAlZCIsIAorICAgICAgICAgICAgICAgcFRMQ2IsIHVjU1RBSWQsIHVjQUMsIHVTZXJ2aWNlSW50ICkpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKlNldCB0aGlzIGZsYWcgaW4gb3JkZXIgdG8gcmVtZW1iZXIgdGhhdCB0aGlzIGlzIGEgdHJpZ2dlciBlbmFibGVkIEFDKi8KKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1VBUFNESW5mb1t1Y0FDXS51Y1NldCA9IDE7IAorICAKKyAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiV0xBTiBUTDpFbmFibGluZyBVLUFQU0QgaW4gRlcgZm9yIFNUQTogJWQgQUM6ICVkIFNJOiAlZCBTUEk6ICVkICIKKyAgICAgICAgICAgICAiREk6ICVkIiwKKyAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FDLCB1U2VydmljZUludCwgdVN1c3BlbmRJbnQsCisgICAgICAgICAgICAgcFRMQ2ItPnRsQ29uZmlnSW5mby51RGVsYXllZFRyaWdnZXJGcm1JbnQpKTsKKworICAvKlNhdmUgYWxsIGluZm8gZm9yIEhBTCovCisgIGhhbFVBUFNESW5mby5zdGFpZHggICAgICAgICA9IHVjU1RBSWQ7IAorICBoYWxVQVBTREluZm8uYWMgICAgICAgICAgICAgPSB1Y0FDOyAgIAorICBoYWxVQVBTREluZm8udXAgICAgICAgICAgICAgPSB1Y1VQOyAgIAorICBoYWxVQVBTREluZm8uc3J2SW50ZXJ2YWwgICAgPSB1U2VydmljZUludDsgIAorICBoYWxVQVBTREluZm8uc3VzSW50ZXJ2YWwgICAgPSB1U3VzcGVuZEludDsKKyAgaGFsVUFQU0RJbmZvLmRlbGF5SW50ZXJ2YWwgID0gcFRMQ2ItPnRsQ29uZmlnSW5mby51RGVsYXllZFRyaWdnZXJGcm1JbnQ7IAorCisgIC8qTm90aWZ5IEhBTCovCisgIHZvc1N0YXR1cyA9IFdEQV9FbmFibGVVYXBzZEFjUGFyYW1zKHB2b3NHQ3R4LCB1Y1NUQUlkLCAmaGFsVUFQU0RJbmZvKTsKKworICByZXR1cm4gdm9zU3RhdHVzOworCit9LypXTEFOVExfRW5hYmxlVUFQU0RGb3JBQyovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfRGlzYWJsZVVBUFNERm9yQUMKKworICBERVNDUklQVElPTgorICAgQ2FsbGVkIGJ5IEhERCB0byBkaXNhYmxlIFVBUFNELiBUTCBpbiB0dXJuIGNhbGxzIFdEQSBBUEkgdG8gZGlzYWJsZSB0aGUKKyAgIGxvZ2ljIGluIEZXL1NMTSB0byBzdG9wIHNlbmRpbmcgdHJpZ2dlciBmcmFtZXMuIFByZXZpb3VzbHkgVEwgaGFkIHRoZQorICAgdHJpZ2dlciBmcmFtZSBsb2dpYyB3aGljaCBsYXRlciBtb3ZlZCBkb3duIHRvIEZXLiBIZW5jZQorICAgSEREIC0+IFRMIC0+IFdEQSAtPiBGVyBjYWxsIGZsb3cuCisKKyAgREVQRU5ERU5DSUVTCisgICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBJZAorICAgIHVjQUM6ICAgICAgICAgQUMgZm9yIHdoaWNoIFUtQVBTRCBpcyBiZWluZyBlbmFibGVkCisKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQworKAorICB2X1BWT0lEX3QgICAgICAgICAgcHZvc0dDdHgsCisgIHZfVThfdCAgICAgICAgICAgICB1Y1NUQUlkLAorICBXTEFOVExfQUNFbnVtVHlwZSAgdWNBQworKQoreworICBXTEFOVExfQ2JUeXBlKiBwVExDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKQorICAgICAgfHwgICBXTEFOVExfQUNfSU5WQUxJRCh1Y0FDKSApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIGlucHV0IHBhcmFtcyBvbiBXTEFOVExfRGlzYWJsZVVBUFNERm9yQUMiCisgICAgICAgICAgICAgICAiIFRMOiAleCAgU1RBOiAlZCAgQUM6ICVkIiwgcFRMQ2IsIHVjU1RBSWQsIHVjQUMgKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qUmVzZXQgdGhpcyBmbGFnIGFzIHRoaXMgaXMgbm8gbG9uZ2VyIGEgdHJpZ2dlciBlbmFibGVkIEFDKi8KKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ud1VBUFNESW5mb1t1Y0FDXS51Y1NldCA9IDE7IAorCisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6RGlzYWJsaW5nIFUtQVBTRCBpbiBGVyBmb3IgU1RBOiAlZCBBQzogJWQgIiwKKyAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FDKSk7CisKKyAgLypOb3RpZnkgSEFMKi8KKyAgV0RBX0Rpc2FibGVVYXBzZEFjUGFyYW1zKHB2b3NHQ3R4LCB1Y1NUQUlkLCB1Y0FDKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQyAqLworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgV0xBTlRMX1JlZ1JTU0lJbmRpY2F0aW9uQ0IKKworICBERVNDUklQVElPTiAgUmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHRvIGdldCBub3RpZmljYXRpb24gaWYgUlNTSSBjcm9zcworICAgICAgICAgICAgICAgdGhyZXNob2xkLgorICAgICAgICAgICAgICAgQ2xpZW50IHNob3VsZCByZWdpc3RlciB0aHJlc2hvbGQsIGRpcmVjdGlvbiwgYW5kIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorCisgIERFUEVOREVOQ0lFUyBOT05FCisgICAgCisgIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKKyAgICAgICAgICAgICAgIGluIHJzc2lWYWx1ZSAtIFJTU0kgdGhyZXNob2xkIHZhbHVlCisgICAgICAgICAgICAgICBpbiB0cmlnZ2VyRXZlbnQgLSBDcm9zcyBkaXJlY3Rpb24gc2hvdWxkIGJlIG5vdGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUCwgRE9XTiwgYW5kIENST1NTCisgICAgICAgICAgICAgICBpbiBjcm9zc0NCRnVuY3Rpb24gLSBOb3RpZmljYXRpb24gQ0IgRnVuY3Rpb24KKyAgICAgICAgICAgICAgIGluIHVzckN0eHQgLSB1c2VyIGNvbnRleHQKKworICBSRVRVUk4gVkFMVUUgVk9TX1NUQVRVUworCisgIFNJREUgRUZGRUNUUyBOT05FCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9SZWdSU1NJSW5kaWNhdGlvbkNCCisoCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgdl9TN190ICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCwKKyAgIFdMQU5UTF9SU1NJQ3Jvc3NUaHJlc2hvbGRDQlR5cGUgY3Jvc3NDQkZ1bmN0aW9uLAorICAgVk9TX01PRFVMRV9JRCAgICAgICAgICAgICAgICAgICBtb2R1bGVJRCwKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dAorKQoreworICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgc3RhdHVzID0gV0xBTlRMX0hTUmVnUlNTSUluZGljYXRpb25DQihwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzQ0JGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQpOworCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCCisKKyAgREVTQ1JJUFRJT04gIFJlbW92ZSBzcGVjaWZpYyB0aHJlc2hvbGQgZnJvbSBsaXN0CisKKyAgREVQRU5ERU5DSUVTIE5PTkUKKyAgICAKKyAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQorICAgICAgICAgICAgICAgaW4gcnNzaVZhbHVlIC0gUlNTSSB0aHJlc2hvbGQgdmFsdWUKKyAgICAgICAgICAgICAgIGluIHRyaWdnZXJFdmVudCAtIENyb3NzIGRpcmVjdGlvbiBzaG91bGQgYmUgbm90aWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQLCBET1dOLCBhbmQgQ1JPU1MKKyAgIAorICBSRVRVUk4gVkFMVUUgVk9TX1NUQVRVUworCisgIFNJREUgRUZGRUNUUyBOT05FCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9EZXJlZ1JTU0lJbmRpY2F0aW9uQ0IKKygKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCisgICB2X1M3X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAorICAgV0xBTlRMX1JTU0lDcm9zc1RocmVzaG9sZENCVHlwZSBjcm9zc0NCRnVuY3Rpb24sCisgICBWT1NfTU9EVUxFX0lEICAgICAgICAgICAgICAgICAgIG1vZHVsZUlECispCit7CisgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICBzdGF0dXMgPSBXTEFOVExfSFNEZXJlZ1JTU0lJbmRpY2F0aW9uQ0IocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9zc0NCRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlSUQpOworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgV0xBTlRMX1NldEFscGhhCisKKyAgREVTQ1JJUFRJT04gIEFMUExBIGlzIHdlaWdodCB2YWx1ZSB0byBjYWxjdWxhdGUgQVZHIFJTU0kKKyAgICAgICAgICAgICAgIGF2Z1JTU0kgPSAoQUxQSEEgKiBoaXN0b3J5UlNTSSkgKyAoKDEwIC0gQUxQSEEpICogbmV3UlNTSSkKKyAgICAgICAgICAgICAgIGF2Z1JTU0kgaGFzIChBTFBIQSAqIDEwKSUgb2YgaGlzdG9yeSBSU1NJIHdlaWdodCBhbmQKKyAgICAgICAgICAgICAgICgxMCAtIEFMUEhBKSUgb2YgbmV3UlNTSSB3ZWlnaHQKKyAgICAgICAgICAgICAgIFRoaXMgcG9ydGlvbiBpcyBkeW5hbWljYWxseSBjb25maWd1cmFibGUuCisgICAgICAgICAgICAgICBEZWZhdWx0IGlzID8KKworICBERVBFTkRFTkNJRVMgTk9ORQorICAgIAorICBQQVJBTUVURVJTICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCisgICAgICAgICAgICAgICBpbiB2YWx1ZUFscGFoIC0gQUxQSEEKKyAgIAorICBSRVRVUk4gVkFMVUUgVk9TX1NUQVRVUworCisgIFNJREUgRUZGRUNUUyBOT05FCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9TZXRBbHBoYQorKAorICAgdl9QVk9JRF90IHBBZGFwdGVyLAorICAgdl9VOF90ICAgIHZhbHVlQWxwaGEKKykKK3sKKyAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIHN0YXR1cyA9IFdMQU5UTF9IU1NldEFscGhhKHBBZGFwdGVyLCB2YWx1ZUFscGhhKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgRlVOQ1RJT04KKworICAgREVTQ1JJUFRJT04gCisgICAgCisgICBQQVJBTUVURVJTIAorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9CTVBTUlNTSVJlZ2lvbkNoYW5nZWROb3RpZmljYXRpb24KKygKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICBwQWRhcHRlciwKKyAgIHRwU2lyUlNTSU5vdGlmaWNhdGlvbiBwUlNTSU5vdGlmaWNhdGlvbgorKQoreworICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgc3RhdHVzID0gV0xBTlRMX0hTQk1QU1JTU0lSZWdpb25DaGFuZ2VkTm90aWZpY2F0aW9uKHBBZGFwdGVyLCBwUlNTSU5vdGlmaWNhdGlvbik7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICBXTEFOVExfUmVnR2V0VHJhZmZpY1N0YXR1cworCisgIERFU0NSSVBUSU9OICBSZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRyYWZmaWMgc3RhdHVzIG1vbml0b3JpbmcKKyAgICAgICAgICAgICAgIER1cmluZyBtZWFzdXJlIHBlcmlvZCBjb3VudCBkYXRhIGZyYW1lcy4KKyAgICAgICAgICAgICAgIElmIGZyYW1lIGNvdW50IGlzIGxhcmdlciB0aGVuIElETEUgdGhyZXNob2xkIHNldCBhcyB0cmFmZmljIE9OCisgICAgICAgICAgICAgICBvciBPRkYuCisgICAgICAgICAgICAgICBBbmQgdHJhZmZpYyBzdGF0dXMgaXMgY2hhbmdlZCBzZW5kIHJlcG9ydCB0byBjbGllbnQgd2l0aAorICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbgorCisgIERFUEVOREVOQ0lFUyBOT05FCisgICAgCisgIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKKyAgICAgICAgICAgICAgIGluIGlkbGVUaHJlc2hvbGQgLSBUcmFmZmljIG9uIG9yIG9mZiB0aHJlc2hvbGQKKyAgICAgICAgICAgICAgIGluIG1lYXN1cmVQZXJpb2QgLSBUcmFmZmljIHN0YXRlIGNoZWNrIHBlcmlvZAorICAgICAgICAgICAgICAgaW4gdHJmZmljU3RhdHVzQ0IgLSB0cmFmZmljIHN0YXR1cyBjaGFuZ2VkIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQiBmdW5jdGlvbgorICAgICAgICAgICAgICAgaW4gdXNyQ3R4dCAtIHVzZXIgY29udGV4dAorICAgCisgIFJFVFVSTiBWQUxVRSBWT1NfU1RBVFVTCisKKyAgU0lERSBFRkZFQ1RTIE5PTkUKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX1JlZ0dldFRyYWZmaWNTdGF0dXMKKygKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkbGVUaHJlc2hvbGQsCisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVQZXJpb2QsCisgICBXTEFOVExfVHJhZmZpY1N0YXR1c0NoYW5nZWRDQlR5cGUgIHRyZmZpY1N0YXR1c0NCLAorICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0CispCit7CisgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICBzdGF0dXMgPSBXTEFOVExfSFNSZWdHZXRUcmFmZmljU3RhdHVzKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlUGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmZmaWNTdGF0dXNDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dCk7CisgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFN0YXRpc3RpY3MKKworICBERVNDUklQVElPTiAgIEdldCB0cmFmZmljIHN0YXRpc3RpY3MgZm9yIGlkZW50aWZpZWQgc3RhdGlvbiAKKworICBERVBFTkRFTkNJRVMgIE5PTkUKKyAgICAKKyAgUEFSQU1FVEVSUyAgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKKyAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKKyAgICAgICAgICAgICAgICBvdXQgc3RhdEJ1ZmZlciAtIHRyYWZmaWMgc3RhdGlzdGljcyBidWZmZXIKKyAgIAorICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKKworICBTSURFIEVGRkVDVFMgIE5PTkUKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX0dldFN0YXRpc3RpY3MKKygKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICAqc3RhdEJ1ZmZlciwKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgIFNUQWlkCispCit7CisgIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CisgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKE5VTEwgPT0gcFRMQ2IpIAorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIGlmKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdLnVjRXhpc3RzKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIGlmKE5VTEwgPT0gc3RhdEJ1ZmZlcikKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICJXTEFOIFRMOkludmFsaWQgVEwgc3RhdGlzdGljcyBidWZmZXIgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgc3RhdGlzdGljcyA9ICZwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF0udHJhZmZpY1N0YXRpc3RpY3M7CisgIG1lbWNweShzdGF0QnVmZmVyLCBzdGF0aXN0aWNzLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgIFdMQU5UTF9SZXNldFN0YXRpc3RpY3MKKworICBERVNDUklQVElPTiAgIFJlc2V0IHN0YXRpc3RpY3Mgc3RydWN0dXJlIGZvciBpZGVudGlmaWVkIHN0YXRpb24gSUQKKyAgICAgICAgICAgICAgICBSZXNldCBtZWFucyBzZXQgdmFsdWVzIGFzIDAKKworICBERVBFTkRFTkNJRVMgIE5PTkUKKyAgICAKKyAgUEFSQU1FVEVSUyAgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKKyAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKKyAgIAorICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKKworICBTSURFIEVGRkVDVFMgIE5PTkUKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX1Jlc2V0U3RhdGlzdGljcworKAorICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICBTVEFpZAorKQoreworICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOworICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzID0gTlVMTDsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmIChOVUxMID09IHBUTENiKSAKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBpZigwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW1NUQWlkXS51Y0V4aXN0cykKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICJXTEFOIFRMOiAlZCBTVEEgSUQgZG9lcyBub3QgZXhpc3QiLCBTVEFpZCkpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgIH0KKworICBzdGF0aXN0aWNzID0gJnBUTENiLT5hdGxTVEFDbGllbnRzW1NUQWlkXS50cmFmZmljU3RhdGlzdGljczsKKyAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXN0YXRpc3RpY3MsIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFNwZWNTdGF0aXN0aWMKKworICBERVNDUklQVElPTiAgIEdldCBzcGVjaWZpYyBmaWVsZCB3aXRoaW4gc3RhdGlzdGljcyBzdHJ1Y3R1cmUgZm9yCisgICAgICAgICAgICAgICAgaWRlbnRpZmllZCBzdGF0aW9uIElEIAorCisgIERFUEVOREVOQ0lFUyAgTk9ORQorCisgIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCisgICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CisgICAgICAgICAgICAgICAgaW4gU1RBaWQgICAgLSBTdGF0aW9uIElECisgICAgICAgICAgICAgICAgb3V0IGJ1ZmZlciAgLSBTdGF0aXN0aWMgdmFsdWUKKyAgIAorICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKKworICBTSURFIEVGRkVDVFMgIE5PTkUKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX0dldFNwZWNTdGF0aXN0aWMKKygKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCisgICBXTEFOVExfVFJBTlNGRVJfU1RBVElDX1RZUEUgIHN0YXRUeXBlLAorICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgIFNUQWlkCispCit7CisgIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CisgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKE5VTEwgPT0gcFRMQ2IpIAorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIGlmKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdLnVjRXhpc3RzKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIGlmKE5VTEwgPT0gYnVmZmVyKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgIldMQU4gVEw6SW52YWxpZCBUTCBzdGF0aXN0aWMgYnVmZmVyIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIHN0YXRpc3RpY3MgPSAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdLnRyYWZmaWNTdGF0aXN0aWNzOworICBzd2l0Y2goc3RhdFR5cGUpCisgIHsKKyAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfVUNfRkNOVDoKKyAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eFVDRmNudDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0ZDTlQ6CisgICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhNQ0ZjbnQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9CQ19GQ05UOgorICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnR4QkNGY250OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfVUNfQkNOVDoKKyAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eFVDQmNudDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0JDTlQ6CisgICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhNQ0JjbnQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9CQ19CQ05UOgorICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnR4QkNCY250OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfVUNfRkNOVDoKKyAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeFVDRmNudDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0ZDTlQ6CisgICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhNQ0ZjbnQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ19GQ05UOgorICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4QkNGY250OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfVUNfQkNOVDoKKyAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeFVDQmNudDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0JDTlQ6CisgICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhNQ0JjbnQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ19CQ05UOgorICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4QkNCY250OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNOVDoKKyAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJjbnQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UX0NSQ19PSzoKKyAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJjbnRDUkNvazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1JBVEU6CisgICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhSYXRlOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgKmJ1ZmZlciA9IDA7CisgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICBicmVhazsKKyAgfQorCisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgIFdMQU5UTF9SZXNldFNwZWNTdGF0aXN0aWMKKworICBERVNDUklQVElPTiAgIFJlc2V0IHNwZWNpZmljIGZpZWxkIHdpdGhpbiBzdGF0aXN0aWNzIHN0cnVjdHVyZSBmb3IKKyAgICAgICAgICAgICAgICBpZGVudGlmaWVkIHN0YXRpb24gSUQKKyAgICAgICAgICAgICAgICBSZXNldCBtZWFucyBzZXQgYXMgMAorCisgIERFUEVOREVOQ0lFUyAgTk9ORQorICAgIAorICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQorICAgICAgICAgICAgICAgIGluIHN0YXRUeXBlIC0gc3BlY2lmaWMgc3RhdGlzdGljcyBmaWVsZCB0byByZXNldAorICAgICAgICAgICAgICAgIGluIFNUQWlkICAgIC0gU3RhdGlvbiBJRAorCisgIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUworCisgIFNJREUgRUZGRUNUUyAgTk9ORQorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfUmVzZXRTcGVjU3RhdGlzdGljCisoCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgV0xBTlRMX1RSQU5TRkVSX1NUQVRJQ19UWVBFICBzdGF0VHlwZSwKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgU1RBaWQKKykKK3sKKyAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICpwVExDYiAgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKKyAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAqc3RhdGlzdGljcyA9IE5VTEw7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoTlVMTCA9PSBwVExDYikgCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgaWYoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF0udWNFeGlzdHMpCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAiV0xBTiBUTDogJWQgU1RBIElEIGRvZXMgbm90IGV4aXN0IiwgU1RBaWQpKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgc3RhdGlzdGljcyA9ICZwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF0udHJhZmZpY1N0YXRpc3RpY3M7CisgIHN3aXRjaChzdGF0VHlwZSkKKyAgeworICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9VQ19GQ05UOgorICAgICAgc3RhdGlzdGljcy0+dHhVQ0ZjbnQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfTUNfRkNOVDoKKyAgICAgIHN0YXRpc3RpY3MtPnR4TUNGY250ID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0ZDTlQ6CisgICAgICBzdGF0aXN0aWNzLT50eEJDRmNudCA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9VQ19CQ05UOgorICAgICAgc3RhdGlzdGljcy0+dHhVQ0JjbnQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5UTF9TVEFUSUNfVFhfTUNfQkNOVDoKKyAgICAgIHN0YXRpc3RpY3MtPnR4TUNCY250ID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0JDTlQ6CisgICAgICBzdGF0aXN0aWNzLT50eEJDQmNudCA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9VQ19GQ05UOgorICAgICAgc3RhdGlzdGljcy0+cnhVQ0ZjbnQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfTUNfRkNOVDoKKyAgICAgIHN0YXRpc3RpY3MtPnJ4TUNGY250ID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0ZDTlQ6CisgICAgICBzdGF0aXN0aWNzLT5yeEJDRmNudCA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9VQ19CQ05UOgorICAgICAgc3RhdGlzdGljcy0+cnhVQ0JjbnQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfTUNfQkNOVDoKKyAgICAgIHN0YXRpc3RpY3MtPnJ4TUNCY250ID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0JDTlQ6CisgICAgICBzdGF0aXN0aWNzLT5yeEJDQmNudCA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UOgorICAgICAgc3RhdGlzdGljcy0+cnhCY250ID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDTlRfQ1JDX09LOgorICAgICAgc3RhdGlzdGljcy0+cnhCY250Q1JDb2sgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfUkFURToKKyAgICAgIHN0YXRpc3RpY3MtPnJ4UmF0ZSA9IDA7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAgIFJlYWQgUlNTSSB2YWx1ZSBvdXQgb2YgYSBSWCBCRAorICAgIAorICAgUEFSQU1FVEVSUzogIENhbGxlciBtdXN0IHZhbGlkYXRlIGFsbCBwYXJhbWV0ZXJzIAorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9SZWFkUlNTSQorKAorICAgdl9QVk9JRF90ICAgICAgICBwQWRhcHRlciwKKyAgIHZfUFZPSURfdCAgICAgICAgcEJESGVhZGVyLAorICAgdl9VOF90ICAgICAgICAgICBTVEFpZAorKQoreworICAgV0xBTlRMX0NiVHlwZSAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKKyAgIHZfUzdfdCAgICAgICAgICAgY3VycmVudFJTU0ksIGN1cnJlbnRSU1NJMCwgY3VycmVudFJTU0kxOworCisKKyAgIGlmKE5VTEwgPT0gdGxDdHh0KQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBJbnZhbGlkIFRMIGhhbmRsZSIsIF9fRlVOQ1RJT05fXykpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgY3VycmVudFJTU0kwID0gV0xBTlRMX0dFVFJTU0kwKHBCREhlYWRlcik7CisgICBjdXJyZW50UlNTSTEgPSBXTEFOVExfR0VUUlNTSTEocEJESGVhZGVyKTsKKyAgIGN1cnJlbnRSU1NJICA9IChjdXJyZW50UlNTSTAgPiBjdXJyZW50UlNTSTEpID8gY3VycmVudFJTU0kwIDogY3VycmVudFJTU0kxOworCisgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLnJzc2lBdmcgPSBjdXJyZW50UlNTSTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKgorIERFU0NSSVBUSU9OIAorICAgIFRMIHJldHVybnMgdGhlIHdlaWdodCBjdXJyZW50bHkgbWFpbnRhaW5lZCBpbiBUTC4KKyBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorCisgT1VUCisgICAgcEFDV2VpZ2h0czogICAgIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IGZvciBmaWxsaW5nIGluIHdlaWdodHMKKworIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUworKi8KK1ZPU19TVEFUVVMgIAorV0xBTlRMX0dldEFDV2VpZ2h0cyAKKyggCisgIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKKyAgdl9VOF90KiAgICAgICAgICAgICAgIHBBQ1dlaWdodHMKKykKK3sKKyAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CisgICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcEFDV2VpZ2h0cyApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRBQ1dlaWdodHMiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRBQ1dlaWdodHMiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5UTF9NQVhfQUMgOyB1Y0luZGV4KyspCisgIHsKKyAgICBwQUNXZWlnaHRzW3VjSW5kZXhdID0gcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y0luZGV4XTsKKyAgfQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworCisvKgorIERFU0NSSVBUSU9OIAorICAgIENoYW5nZSB0aGUgd2VpZ2h0IGN1cnJlbnRseSBtYWludGFpbmVkIGJ5IFRMLgorIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICAgcEFDV2VpZ2h0czogICAgIENhbGxlciBhbGxvY2F0ZWQgbWVtb3J5IGNvbnRhaW4gdGhlIHdlaWdodHMgdG8gdXNlCisKKworIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUworKi8KK1ZPU19TVEFUVVMgIAorV0xBTlRMX1NldEFDV2VpZ2h0cyAKKyggCisgIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKKyAgdl9VOF90KiAgICAgICAgICAgICAgIHBBQ1dlaWdodHMKKykKK3sKKyAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CisgICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcEFDV2VpZ2h0cyApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRBQ1dlaWdodHMiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRBQ1dlaWdodHMiKSk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5UTF9NQVhfQUMgOyB1Y0luZGV4KyspCisgIHsKKyAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjSW5kZXhdID0gcEFDV2VpZ2h0c1t1Y0luZGV4XTsKKyAgfQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgV0xBTlRMX1Bvd2VyU3RhdGVDaGFuZ2VkQ0IKKygKKyAgIHZfUFZPSURfdCBwQWRhcHRlciwKKyAgIHRQbWNTdGF0ZSBuZXdTdGF0ZQorKQoreworICAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICAgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CisKKyAgIGlmIChOVUxMID09IHRsQ3R4dCkKKyAgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIkludmFsaWQgVEwgQ29udHJvbCBCbG9jayIsIF9fRlVOQ1RJT05fXyApOworICAgICByZXR1cm47CisgICB9CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJQb3dlciBzdGF0ZSBjaGFuZ2VkLCBuZXcgc3RhdGUgaXMgJWQiLCBuZXdTdGF0ZSApOworICAgc3dpdGNoKG5ld1N0YXRlKQorICAgeworICAgICAgY2FzZSBGVUxMX1BPV0VSOgorICAgICAgICAgdGxDdHh0LT5pc0JNUFMgPSBWT1NfRkFMU0U7CisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBCTVBTOgorI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgICAgICAgIFdMQU5UTF9TZXRGV1JTU0lUaHJlc2hvbGRzKHBBZGFwdGVyKTsKKyNlbmRpZgorCisgICAgICAgICB0bEN0eHQtPmlzQk1QUyA9IFZPU19UUlVFOworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSU1QUzoKKyAgICAgIGNhc2UgTE9XX1BPV0VSOgorICAgICAgY2FzZSBSRVFVRVNUX0JNUFM6CisgICAgICBjYXNlIFJFUVVFU1RfRlVMTF9QT1dFUjoKKyAgICAgIGNhc2UgUkVRVUVTVF9JTVBTOgorICAgICAgY2FzZSBTVE9QUEVEOgorICAgICAgY2FzZSBSRVFVRVNUX1NUQVJUX1VBUFNEOgorICAgICAgY2FzZSBSRVFVRVNUX1NUT1BfVUFQU0Q6CisgICAgICBjYXNlIFVBUFNEOgorICAgICAgY2FzZSBSRVFVRVNUX1NUQU5EQlk6CisgICAgICBjYXNlIFNUQU5EQlk6CisgICAgICBjYXNlIFJFUVVFU1RfRU5URVJfV09XTDoKKyAgICAgIGNhc2UgUkVRVUVTVF9FWElUX1dPV0w6CisgICAgICBjYXNlIFdPV0w6CisgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIk5vdCBoYW5kbGUgdGhpcyBldmVudHMgJWQiLCBuZXdTdGF0ZSApKTsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiTm90IGEgdmFsaWQgZXZlbnQgJWQiLCBuZXdTdGF0ZSApKTsKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm47Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldEV0aGVyVHlwZQorCisgIERFU0NSSVBUSU9OICAgRXh0cmFjdCBFdGhlciB0eXBlIGluZm9ybWF0aW9uIGZyb20gdGhlIEJECisKKyAgREVQRU5ERU5DSUVTICBOT05FCisgICAgCisgIFBBUkFNRVRFUlMgICAgaW4gYXVjQkRIZWFkZXIgLSBCRCBoZWFkZXIKKyAgICAgICAgICAgICAgICBpbiB2b3NEYXRhQnVmZiAtIGRhdGEgYnVmZmVyCisgICAgICAgICAgICAgICAgaW4gdWNNUERVSExlbiAgLSBNUERVIGhlYWRlciBsZW5ndGgKKyAgICAgICAgICAgICAgICBvdXQgcFVzRXRoZXJUeXBlIC0gcG9pbnRlciB0byBFdGhlcnR5cGUKKworICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVNfU1VDQ0VTUyA6IGlmIHRoZSBFdGhlclR5cGUgaXMgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZAorICAgICAgICAgICAgICAgIFZPU19TVEFUVVNfRkFJTFVSRSA6IGlmIHRoZSBFdGhlclR5cGUgZXh0cmFjdGlvbiBmYWlsZWQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldCB3YXMgZHJvcHBlZAorCisgIFNJREUgRUZGRUNUUyAgTk9ORQorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIFZPU19TVEFUVVMgV0xBTlRMX0dldEV0aGVyVHlwZQorKAorICAgdl9VOF90ICAgICAgICAgICAgICAgKiBhdWNCREhlYWRlciwKKyAgIHZvc19wa3RfdCAgICAgICAgICAgICogdm9zRGF0YUJ1ZmYsCisgICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCisgICB2X1UxNl90ICAgICAgICAgICAgICAqIHBVc0V0aGVyVHlwZQorKQoreworICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNPZmZzZXQ7CisgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0V0aGVyVHlwZSA9ICpwVXNFdGhlclR5cGU7CisgIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c0xMQ1NpemUgPSBzaXplb2YodXNFdGhlclR5cGUpOworICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgTExDIGlzIHByZXNlbnQgLSBpZiBub3QsIFRMIGlzIHVuYWJsZSB0byBkZXRlcm1pbmUgdHlwZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBWT1NfRkFMU0UgPT0gV0RBX0lTX1JYX0xMQ19QUkVTRU5UKCBhdWNCREhlYWRlciApICkKKyAgeworICAgIHVjT2Zmc2V0ID0gV0xBTlRMXzgwMl8zX0hFQURFUl9MRU4gLSBzaXplb2YodXNFdGhlclR5cGUpOyAKKyAgfQorICBlbHNlCisgIHsKKyAgICB1Y09mZnNldCA9IHVjTVBEVUhMZW4gKyBXTEFOVExfTExDX1BST1RPX1RZUEVfT0ZGU0VUOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IExMQyB0eXBlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsIHVjT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnVzRXRoZXJUeXBlLCAmdXNMTENTaXplKTsgCisKKyAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8IAorICAgICAgKCBzaXplb2YodXNFdGhlclR5cGUpICE9IHVzTExDU2l6ZSApKQorICAgICAgCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpFcnJvciBleHRyYWN0aW5nIEV0aGVyIHR5cGUgZnJvbSBkYXRhIHBhY2tldCIpKTsKKyAgICAvKiBEcm9wIHBhY2tldCAqLworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CisgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKyAgZWxzZQorICB7CisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkV0aGVyIHR5cGUgcmV0cmlldmVkIGJlZm9yZSBlbmRpYW5lc3MgY29udjogJWQiLCAKKyAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlKSk7CisKKyAgICB1c0V0aGVyVHlwZSA9IHZvc19iZTE2X3RvX2NwdSh1c0V0aGVyVHlwZSk7CisgICAgKnBVc0V0aGVyVHlwZSA9IHVzRXRoZXJUeXBlOworCisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOkV0aGVyIHR5cGUgcmV0cmlldmVkOiAlZCIsIHVzRXRoZXJUeXBlKSk7CisgIH0KKyAgCisgIHJldHVybiB2b3NTdGF0dXM7Cit9CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFNvZnRBUFN0YXRpc3RpY3MKKworICBERVNDUklQVElPTiAgIENvbGxlY3QgdGhlIGN1bXVsYXRpdmUgc3RhdGlzdGljcyBmb3IgYWxsIFNvZnRhcCBzdGF0aW9ucworCisgIERFUEVOREVOQ0lFUyAgTk9ORQorICAgIAorICBQQVJBTUVURVJTICAgIGluIHB2b3NHQ3R4ICAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dAorICAgICAgICAgICAgICAgICAgIGJSZXNldCAgICAtIElmIHNldCBUTCBzdGF0aXN0aWNzIHdpbGwgYmUgY2xlYXJlZCBhZnRlciByZWFkaW5nCisgICAgICAgICAgICAgICAgb3V0IHN0YXRzU3VtIC0gcG9pbnRlciB0byBjb2xsZWN0ZWQgc3RhdGlzdGljcworCisgIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVU19TVUNDRVNTIDogaWYgdGhlIFN0YXRpc3RpY3MgYXJlIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQKKworICBTSURFIEVGRkVDVFMgIE5PTkUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9HZXRTb2Z0QVBTdGF0aXN0aWNzKHZfUFZPSURfdCBwQWRhcHRlciwgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0c1N1bSwgdl9CT09MX3QgYlJlc2V0KQoreworICAgIHZfVThfdCBpID0gMDsKKyAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgV0xBTlRMX0NiVHlwZSAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CisgICAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFIHN0YXRCdWZmZXJUZW1wOworICAgIHZvc19tZW1femVybygodl9WT0lEX3QgKikmc3RhdEJ1ZmZlclRlbXAsIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKKyAgICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopc3RhdHNTdW0sIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKKworCisgICAgaWYgKCBOVUxMID09IHBUTENiICkKKyAgICB7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9IAorCisgICAgLy8gU3VtIHVwIGFsbCB0aGUgc3RhdGlzdGljcyBmb3Igc3RhdGlvbnMgb2YgU29mdCBBUCBmcm9tIFRMCisgICAgZm9yIChpID0gMDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLndTVEFEZXNjLndTVEFUeXBlID09IFdMQU5fU1RBX1NPRlRBUCkKKyAgICAgICAgeworICAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfR2V0U3RhdGlzdGljcyhwQWRhcHRlciwgJnN0YXRCdWZmZXJUZW1wLCBpKTsvLyBDYW4gaW5jbHVkZSBzdGFJZCAxIGJlY2F1c2Ugc3RhdGlzdGljcyBub3QgY29sbGVjdGVkIGZvciBpdAorCisgICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKworICAgICAgICAgICAgLy8gQWRkIHRvIHRoZSBjb3VudGVycworICAgICAgICAgICBzdGF0c1N1bS0+dHhVQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhVQ0ZjbnQ7CisgICAgICAgICAgIHN0YXRzU3VtLT50eE1DRmNudCArPSBzdGF0QnVmZmVyVGVtcC50eE1DRmNudDsKKyAgICAgICAgICAgc3RhdHNTdW0tPnR4QkNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4QkNGY250OworICAgICAgICAgICBzdGF0c1N1bS0+dHhVQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhVQ0JjbnQ7CisgICAgICAgICAgIHN0YXRzU3VtLT50eE1DQmNudCArPSBzdGF0QnVmZmVyVGVtcC50eE1DQmNudDsKKyAgICAgICAgICAgc3RhdHNTdW0tPnR4QkNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4QkNCY250OworICAgICAgICAgICBzdGF0c1N1bS0+cnhVQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhVQ0ZjbnQ7CisgICAgICAgICAgIHN0YXRzU3VtLT5yeE1DRmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeE1DRmNudDsKKyAgICAgICAgICAgc3RhdHNTdW0tPnJ4QkNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4QkNGY250OworICAgICAgICAgICBzdGF0c1N1bS0+cnhVQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhVQ0JjbnQ7CisgICAgICAgICAgIHN0YXRzU3VtLT5yeE1DQmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeE1DQmNudDsKKyAgICAgICAgICAgc3RhdHNTdW0tPnJ4QkNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4QkNCY250OworCisgICAgICAgICAgIGlmIChiUmVzZXQpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1Jlc2V0U3RhdGlzdGljcyhwQWRhcHRlciwgaSk7CisgICAgICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsgICAgICAgICAgICAgICAKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdm9zU3RhdHVzOworfQorI2VuZGlmCisjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgICBXTEFOVExfSXNSZXBsYXlQYWNrZXQKKyAgICAgCisgIERFU0NSSVBUSU9OICAgVGhpcyBmdW5jdGlvbiBkb2VzIHJlcGxheSBjaGVjayBmb3IgdmFsaWQgc3RhdGlvbnMKKyAKKyAgREVQRU5ERU5DSUVTICBWYWxpZGl0eSBvZiByZXBsYXkgY2hlY2sgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZnVuY3Rpb24gCisgICAgICAgICAgICAgICAgaXMgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBQQVJBTUVURVJTICAgIGN1cnJlbnRSZXBsYXlDb3VudGVyICAgIGN1cnJlbnQgcmVwbGF5IGNvdW50ZXIgdGFrZW4gZnJvbSBSWCBCRCAKKyAgICAgICAgICAgICAgICBwcmV2aW91c1JlcGxheUNvdW50ZXIgICBwcmV2aW91cyByZXBsYXkgY291bnRlciB0YWtlbiBmcm9tIFRMIENCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgUkVUUlVOICAgICAgICBWT1NfVFJVRSAgICBwYWNrZXQgaXMgYSByZXBsYXkgcGFja2V0CisgICAgICAgICAgICAgICAgVk9TX0ZBTFNFICAgcGFja2V0IGlzIG5vdCBhIHJlcGxheSBwYWNrZXQKKworICBTSURFIEVGRkVDVFMgICBub25lCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X0JPT0xfdAorV0xBTlRMX0lzUmVwbGF5UGFja2V0CisoCisgIHZfVTY0X3QgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIsCisgIHZfVTY0X3QgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyCispCit7CisgICAvKiBEbyB0aGUgcmVwbGF5IGNoZWNrIGJ5IGNvbXBhcmluZyBwcmV2aW91cyByZWNlaXZlZCByZXBsYXkgY291bnRlciB3aXRoCisgICAgICBjdXJyZW50IHJlY2VpdmVkIHJlcGxheSBjb3VudGVyKi8KKyAgICBpZih1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIgPCB1bGxjdXJyZW50UmVwbGF5Q291bnRlcikKKyAgICB7CisgICAgICAgIC8qIFZhbGlkIHBhY2tldCBub3QgcmVwbGF5ICovCisgICAgICAgIHJldHVybiBWT1NfRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisKKyAgICAgICAgLyogQ3VycmVudCBwYWNrZXQgbnVtYmVyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwcmV2aXVvcyByZWNlaXZlZCAKKyAgICAgICAgICAgcGFja2V0IG5vLCB0aGlzIG1lYW5zIGN1cnJlbnQgcGFja2V0IGlzIHJlcGxheSBwYWNrZXQgKi8KKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICJXTEFOIFRMOiBSZXBsYXkgcGFja2V0IGZvdW5kIHdpdGggcmVwbGF5IGNvdW50ZXIgOlsweCVsbFhdIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CisgICAgICAgICAgIAorICAgICAgICByZXR1cm4gVk9TX1RSVUU7CisgICAgfQorfQorCisjaWYgMAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFJlcGxheUNvdW50ZXJGcm9tUnhCRAorICAgICAKKyAgREVTQ1JJUFRJT04gICBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIDQ4LWJpdCByZXBsYXkgcGFja2V0IG51bWJlciBmcm9tIFJYIEJEIAorIAorICBERVBFTkRFTkNJRVMgIFZhbGlkaXR5IG9mIHJlcGxheSBjaGVjayBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBmdW5jdGlvbiAKKyAgICAgICAgICAgICAgICBpcyBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFBBUkFNRVRFUlMgICAgcHVjUnhIZWFkZXIgcG9pbnRlciB0byBSWCBCRCBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBSRVRSVU4gICAgICAgIHZfVTY0X3QgICAgUGFja2V0IG51bWJlciBleHRhcmN0ZWQgZnJvbSBSWCBCRAorCisgIFNJREUgRUZGRUNUUyAgIG5vbmUKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfVTY0X3QKK1dMQU5UTF9HZXRSZXBsYXlDb3VudGVyRnJvbVJ4QkQKKygKKyAgIHZfVThfdCAqcHVjUnhCREhlYWRlcgorKQoreworLyogNDgtYml0IHJlcGxheSBjb3VudGVyIGlzIGNyZWF0ZWQgYXMgZm9sbG93cworICAgZnJvbSBSWCBCRCA2IGJ5dGUgUE1JIGNvbW1hbmQ6CisgICBBZGRyIDogQUVTL1RLSVAKKyAgIDB4MzggOiBwbjMvdHNjMworICAgMHgzOSA6IHBuMi90c2MyCisgICAweDNhIDogcG4xL3RzYzEKKyAgIDB4M2IgOiBwbjAvdHNjMAorCisgICAweDNjIDogcG41L3RzYzUKKyAgIDB4M2QgOiBwbjQvdHNjNCAqLworCisjaWZkZWYgQU5JX0JJR19CWVRFX0VORElBTgorICAgIHZfVTY0X3QgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAwOworICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCisgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSBXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjBUTzIzKHB1Y1J4QkRIZWFkZXIpOyAKKyAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA8PD0gMTY7CisgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgfD0gKCggV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzI0VE8yNShwdWNSeEJESGVhZGVyKSAmIDB4RkZGRjAwMDApID4+IDE2KTsKKyAgICByZXR1cm4gdWxsY3VycmVudFJlcGxheUNvdW50ZXI7CisjZWxzZQorICAgIHZfVTY0X3QgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAwOworICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCisgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAoV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzI0VE8yNShwdWNSeEJESGVhZGVyKSAmIDB4MDAwMEZGRkYpOyAKKyAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA8PD0gMzI7IAorICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIHw9IFdMQU5IQUxfUlhfQkRfR0VUX1BNSUNNRF8yMFRPMjMocHVjUnhCREhlYWRlcik7IAorICAgIHJldHVybiB1bGxjdXJyZW50UmVwbGF5Q291bnRlcjsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgICAgV0xBTlRMX1Bvc3RSZXNOZWVkZWQKKyAgICAgCisgIERFU0NSSVBUSU9OICAgVGhpcyBmdW5jdGlvbiBwb3N0cyBtZXNzYWdlIHRvIFRMIHRvIHJlc2VydmUgQkQvUERVIG1lbW9yeQorIAorICBERVBFTkRFTkNJRVMgIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFBBUkFNRVRFUlMgICAgcHZvc0dDdHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBSRVRVUk4gICAgICAgIE5vbmUKKworICBTSURFIEVGRkVDVFMgICBub25lCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgV0xBTlRMX1Bvc3RSZXNOZWVkZWQodl9QVk9JRF90IHB2b3NHQ3R4KQoreworICB2b3NfbXNnX3QgICAgICAgICAgICB2b3NNc2c7CisKKyAgdm9zTXNnLnJlc2VydmVkID0gMDsKKyAgdm9zTXNnLmJvZHlwdHIgID0gTlVMTDsKKyAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX1JFU19ORUVERUQ7CisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgIldMQU4gVEw6IEJEL1BEVSBhdmFpbGFibGUgaW50ZXJydXB0IHJlY2VpdmVkLCBQb3N0aW5nIG1lc3NhZ2UgdG8gVEwiKTsKKyAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTVFfSURfVEwsICZ2b3NNc2cpKSkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgIiAlcyBmYWlscyB0byBwb3N0IG1lc3NhZ2UiLCBfX0ZVTkNUSU9OX18pOworICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICAgICBXTEFOVExfVXBkYXRlUnNzaUJtcHMKKworICBERVNDUklQVElPTiAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIFRMJ3MgUlNTSSAoaW4gQk1QUyBtb2RlKQorCisgIERFUEVOREVOQ0lFUyAgIE5vbmUKKworICBQQVJBTUVURVJTCisKKyAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0ICAgICAgICAgIFZPUyBHbG9iYWwgY29udGV4dAorICAgIHN0YUlkICAgICAgICAgICAgU3RhdGlvbiBJRCAgICAgICAgICAgU3RhdGlvbiBJRAorICAgIHJzc2kgICAgICAgICAgICAgUlNTSSAoQk1QUyBtb2RlKSAgICAgUlNTSSBpbiBCTVBTIG1vZGUKKworICBSRVRVUk4gICAgICAgICBOb25lCisKKyAgU0lERSBFRkZFQ1RTICAgbm9uZQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIFdMQU5UTF9VcGRhdGVSc3NpQm1wcyh2X1BWT0lEX3QgcHZvc0dDdHgsIHZfVThfdCBzdGFJZCwgdl9TN190IHJzc2kpCit7CisgIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisKKyAgaWYgKE5VTEwgIT0gcFRMQ2IpCisgIHsKKyAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0ucnNzaUF2Z0JtcHMgPSByc3NpOworICB9Cit9CmRpZmYgLS1naXQgYS9DT1JFL1RML3NyYy93bGFuX3FjdF90bF9iYS5jIGIvQ09SRS9UTC9zcmMvd2xhbl9xY3RfdGxfYmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzAyNjRmCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9UTC9zcmMvd2xhbl9xY3RfdGxfYmEuYwpAQCAtMCwwICsxLDE3NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIFQgTCBfIEIgQS4gQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgT1ZFUlZJRVc6CisgIAorICBUaGlzIHNvZnR3YXJlIHVuaXQgaG9sZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXTEFOIFRyYW5zcG9ydCBMYXllcgorICBCbG9jayBBY2sgc2Vzc2lvbiBzdXBwb3J0LiBBbHNvIGluY2x1ZGVkIGFyZSB0aGUgQU1TRFUgZGUtYWdncmVnYXRpb24gCisgIGNvbXBsZXRpb24gYW5kIE1TRFUgcmUtb3JkZXJpbmcgZnVuY3Rpb25hbGl0eS4gCisgIAorICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIE9OTFkgYnkgdGhlIG1haW4KKyAgVEwgbW9kdWxlIG9yIHRoZSBIQUwgbGF5ZXIuCisKKyAgREVQRU5ERU5DSUVTOiAKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4gCisgIAorICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAgJEhlYWRlciQkRGF0ZVRpbWUkJEF1dGhvciQKKworCisgIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIwMTAtMTAteHggICAgZGxpICAgICBDaGFuZ2UgdWNDSW5kZXggdG8gcG9pbnQgdG8gdGhlIHNsb3QgdGhlIG5leHQgZnJhbWUgdG8gYmUgZXhwZWN0ZWQgdG8gZndkCisyMDA4LTA4LTIyICAgIHNjaCAgICAgVXBkYXRlIGJhc2VkIG9uIHVuaXQgdGVzdAorMjAwOC0wNy0zMSAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAid2xhbl9xY3RfdGwuaCIgCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiIAorI2luY2x1ZGUgIndsYW5fcWN0X3RsaS5oIiAKKyNpbmNsdWRlICJ3bGFuX3FjdF90bGlfYmEuaCIgCisjaW5jbHVkZSAid2xhbl9xY3RfaGFsLmgiIAorI2luY2x1ZGUgInZvc19saXN0LmgiCisjaW5jbHVkZSAidm9zX2xvY2suaCIKKyNpbmNsdWRlICJ0bERlYnVnLmgiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vI2RlZmluZSBXTEFOVExfUkVPUkRFUl9ERUJVR19NU0dfRU5BQkxFCisjZGVmaW5lIFdMQU5UTF9CQV9SRU9SREVSSU5HX0FHSU5HX1RJTUVSICAgMzAgICAvKiAzMCBtaWxsaXNlYyAqLworI2RlZmluZSBXTEFOVExfQkFfTUlOX0ZSRUVfUlhfVk9TX0JVRkZFUiAgIDAgICAgLyogUlggVk9TIGJ1ZmZlciBsb3cgdGhyZXNob2xkICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTiAgICB0bFJlb3JkZXJpbmdBZ2luZ1RpbWVyRXhwaWVyQ0IKKworICAgREVTQ1JJUFRJT04gCisgICAgICBBZnRlciBhZ2luZyB0aW1lciBleHBpZXJlZCwgYWxsIFFlZCBmcmFtZXMgaGF2ZSB0byBiZSByb3V0ZWQgdG8gdXBwZXIKKyAgICAgIGxheWVyLiBPdGhlcndpc2UsIHRoZXJlIGlzIHBvc3NpYmlsaXRpZWQgdGhhdCBhaG5nIHNvbWUgZnJhbWVzCisgICAgCisgICBQQVJBTUVURVJTIAorICAgICAgdl9QVk9JRF90ICB0aW1lclVkYXRhICAgIFRpbWVyIGNhbGxiYWNrIHVzZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhcyBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSBmcmFtZXMgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVkCisgICAKKyAgIFJFVFVSTiBWQUxVRQorICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICAgICAgIEdlbmVyYWwgc3VjY2VzcworICAgICAgVk9TX1NUQVRVU19FX0lOVkFMICAgICAgIEludmFsaWQgZnJhbWUgaGFuZGxlCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1ZPSURfdCBXTEFOVExfUmVvcmRlcmluZ0FnaW5nVGltZXJFeHBpZXJDQgorKAorICAgdl9QVk9JRF90ICB0aW1lclVkYXRhCispCit7CisgICBXTEFOVExfVElNRVJfRVhQSUVSX1VEQVRBX1QgKmV4cGlyZUhhbmRsZTsKKyAgIFdMQU5UTF9CQVJlb3JkZXJUeXBlICAgICAgICAqUmVvcmRlckluZm87CisgICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgICAgKnBUTEhhbmRsZTsKKyAgIHZvc19wa3RfdCAgICAgICAgICAgICAgICAgICAqdm9zRGF0YUJ1ZmY7CisgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJRDsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgdWNUSUQ7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgIG9wQ29kZTsKKyAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSAgICAgICAgd1J4TWV0YUluZm87CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgIGZ3SWR4ID0gMDsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIGlmKE5VTEwgPT0gdGltZXJVZGF0YSkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJUaW1lciBDYWxsYmFjayBVc2VyIGRhdGEgTlVMTCIpKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgZXhwaXJlSGFuZGxlID0gKFdMQU5UTF9USU1FUl9FWFBJRVJfVURBVEFfVCAqKXRpbWVyVWRhdGE7CisgICB1Y1NUQUlEICAgICAgPSAodl9VOF90KWV4cGlyZUhhbmRsZS0+U1RBSUQ7CisgICB1Y1RJRCAgICAgICAgPSBleHBpcmVIYW5kbGUtPlRJRDsKKyAgIGlmKFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlEKSB8fCBXTEFOVExfVElEX0lOVkFMSUQodWNUSUQpKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIlNJRCAlZCBvciBUSUQgJWQgaXMgbm90IHZhbGlkIiwKKyAgICAgICAgICAgICAgICAgIHVjU1RBSUQsIHVjVElEKSk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHBUTEhhbmRsZSAgICA9IChXTEFOVExfQ2JUeXBlICopZXhwaXJlSGFuZGxlLT5wVExIYW5kbGU7CisgICBpZihOVUxMID09IHBUTEhhbmRsZSkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJUTCBDb250cm9sIGJsb2NrIE5VTEwiKSk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIFJlb3JkZXJJbmZvID0gJnBUTEhhbmRsZS0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlEXS5hdGxCQVJlb3JkZXJJbmZvW3VjVElEXTsKKyAgIGlmKE5VTEwgPT0gUmVvcmRlckluZm8pCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUmVvcmRlciBkYXRhIE5VTEwsIHRoaXMgY291bGQgbm90IGhhcHBlbiBTSUQgJWQsIFRJRCAlZCIsIAorICAgICAgICAgICAgICAgICAgdWNTVEFJRCwgdWNUSUQpKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgaWYoMCA9PSBwVExIYW5kbGUtPmF0bFNUQUNsaWVudHNbdWNTVEFJRF0uYXRsQkFSZW9yZGVySW5mb1t1Y1RJRF0udWNFeGlzdHMpCisgICB7CisgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIlJlb3JkZXIgc2Vzc2lvbiBkb2Vzbid0IGV4aXN0IFNJRCAlZCwgVElEICVkIiwgCisgICAgICAgICAgICAgICAgICAgdWNTVEFJRCwgdWNUSUQpKTsKKyAgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX2xvY2tfYWNxdWlyZSgmUmVvcmRlckluZm8tPnJlb3JkZXJMb2NrKSkpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTlRMX1Jlb3JkZXJpbmdBZ2luZ1RpbWVyRXhwaWVyQ0IsIEdldCBMT0NLIEZhaWwiKSk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmKCBwVExIYW5kbGUtPmF0bFNUQUNsaWVudHNbdWNTVEFJRF0uYXRsQkFSZW9yZGVySW5mb1t1Y1RJRF0udWNFeGlzdHMgPT0gMCApCisgICB7CisgICAgICB2b3NfbG9ja19yZWxlYXNlKCZSZW9yZGVySW5mby0+cmVvcmRlckxvY2spOworICAgICAgcmV0dXJuOworICAgfQorCisgICBvcENvZGUgICAgICA9IFdMQU5UTF9PUENPREVfRldEQUxMX0RST1BDVVI7CisgICB2b3NEYXRhQnVmZiA9IE5VTEw7CisKKworICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkJBIHRpbWVvdXQgd2l0aCAlZCBwZW5kaW5nIGZyYW1lcywgY3VySWR4ICVkIiwgUmVvcmRlckluZm8tPnBlbmRpbmdGcmFtZXNDb3VudCwgUmVvcmRlckluZm8tPnVjQ0luZGV4KSk7CisKKyAgIGlmKFJlb3JkZXJJbmZvLT5wZW5kaW5nRnJhbWVzQ291bnQgPT0gMCkKKyAgIHsKKyAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX2xvY2tfcmVsZWFzZSgmUmVvcmRlckluZm8tPnJlb3JkZXJMb2NrKSkpCisgICAgICB7CisgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTlRMX1Jlb3JkZXJpbmdBZ2luZ1RpbWVyRXhwaWVyQ0IsIFJlbGVhc2UgTE9DSyBGYWlsIikpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgfQorCisgICBpZigwID09IFJlb3JkZXJJbmZvLT51Y0NJbmRleCkKKyAgIHsKKyAgICAgIGZ3SWR4ID0gUmVvcmRlckluZm8tPndpblNpemU7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBmd0lkeCA9IFJlb3JkZXJJbmZvLT51Y0NJbmRleCAtIDE7CisgICB9CisKKyNpZmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKyAgIC8qIERvIHJlcGxheSBjaGVjayBiZWZvcmUgZ2l2aW5nIHBhY2tldHMgdG8gdXBwZXIgbGF5ZXIgCisgICAgICByZXBsYXkgY2hlY2sgY29kZSA6IGNoZWNrIHdoZXRoZXIgcmVwbGF5IGNoZWNrIGlzIG5lZWRlZCBvciBub3QgKi8KKyAgIGlmKFZPU19UUlVFID09IHBUTEhhbmRsZS0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlEXS51Y0lzUmVwbGF5Q2hlY2tWYWxpZCkKKyAgIHsKKyAgICAgICB2X1U2NF90ICAgIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlciA9IDA7CisgICAgICAgdl9VNjRfdCAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IDA7CisgICAgICAgdl9VOF90ICAgICB1Y2xvb3BDb3VudGVyID0gMDsKKyAgICAgICB2X0JPT0xfdCAgIHN0YXR1cyA9IDA7CisKKyAgICAgICAvKkRvIHJlcGxheSBjaGVjayBmb3IgYWxsIHBhY2tldHMgd2hpY2ggYXJlIGluIFJlb3JkZXIgYnVmZmVyICovCisgICAgICAgZm9yKHVjbG9vcENvdW50ZXIgPSAwOyB1Y2xvb3BDb3VudGVyIDwgV0xBTlRMX01BWF9XSU5TSVpFOyB1Y2xvb3BDb3VudGVyKyspCisgICAgICAgeworICAgICAgICAgLypHZXQgcHJldmlvdXMgcmVwbHkgY291bnRlciovCisgICAgICAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIgPSBwVExIYW5kbGUtPmF0bFNUQUNsaWVudHNbdWNTVEFJRF0udWxsUmVwbGF5Q291bnRlclt1Y1RJRF07CisKKyAgICAgICAgIC8qR2V0IGN1cnJlbnQgcmVwbGF5IGNvdW50ZXIgb2YgcGFja2V0IGluIHJlb3JkZXIgYnVmZmVyKi8KKyAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gUmVvcmRlckluZm8tPnJlb3JkZXJCdWZmZXItPnVsbFJlcGxheUNvdW50ZXJbdWNsb29wQ291bnRlcl07CisKKyAgICAgICAgIC8qQ2hlY2sgZm9yIGhvbGVzLCBpZiBhIGhvbGUgaXMgZm91bmQgaW4gUmVvcmRlciBidWZmZXIgdGhlbgorICAgICAgICAgICBubyBuZWVkIHRvIGRvIHJlcGxheSBjaGVjayBvbiBpdCwgc2tpcCB0aGUgY3VycmVudAorICAgICAgICAgICBob2xlIGFuZCBkbyByZXBsYXkgY2hlY2sgb24gb3RoZXIgcGFja2V0cyovCisgICAgICAgICBpZihOVUxMICE9IChSZW9yZGVySW5mby0+cmVvcmRlckJ1ZmZlci0+YXJyYXlCdWZmZXJbdWNsb29wQ291bnRlcl0pKQorICAgICAgICAgeworICAgICAgICAgICBzdGF0dXMgPSBXTEFOVExfSXNSZXBsYXlQYWNrZXQodWxsY3VycmVudFJlcGxheUNvdW50ZXIsIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7IAorICAgICAgICAgICBpZihWT1NfVFJVRSA9PSBzdGF0dXMpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qSW5jcmVtZW50IHRoZSBkZWJ1ZyBjb3VudGVyKi8KKyAgICAgICAgICAgICAgIHBUTEhhbmRsZS0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlEXS51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CisKKyAgICAgICAgICAgICAgIC8qQSByZXBsYXkgcGFja2V0IGZvdW5kKi8KKyAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXTEFOVExfUmVvcmRlcmluZ0FnaW5nVGltZXJFeHBpZXJDQjogdG90YWwgZHJvcHBlZCByZXBsYXkgcGFja2V0cyBvbiBTVEEgSUQgJVggaXMgWzB4JWxYXVxuIiwKKyAgICAgICAgICAgICAgICB1Y1NUQUlELCBwVExIYW5kbGUtPmF0bFNUQUNsaWVudHNbdWNTVEFJRF0udWxUb3RhbFJlcGxheVBhY2tldHNEZXRlY3RlZCk7CisKKyAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXTEFOVExfUmVvcmRlcmluZ0FnaW5nVGltZXJFeHBpZXJDQjogcmVwbGF5IHBhY2tldCBmb3VuZCB3aXRoIFBOIDogWzB4JWxsWF1cbiIsCisgICAgICAgICAgICAgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIpOworCisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiV0xBTlRMX1Jlb3JkZXJpbmdBZ2luZ1RpbWVyRXhwaWVyQ0I6IERyb3AgdGhlIHJlcGxheSBwYWNrZXQgd2l0aCBQTiA6IFsweCVsbFhdXG4iLAorICAgICAgICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKKworICAgICAgICAgICAgICAgUmVvcmRlckluZm8tPnJlb3JkZXJCdWZmZXItPmFycmF5QnVmZmVyW3VjbG9vcENvdW50ZXJdID0gTlVMTDsKKyAgICAgICAgICAgICAgIFJlb3JkZXJJbmZvLT5yZW9yZGVyQnVmZmVyLT51bGxSZXBsYXlDb3VudGVyW3VjbG9vcENvdW50ZXJdID0gMDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLypOb3QgYSByZXBsYXkgcGFja2V0IHVwZGF0ZSBwcmV2aW91cyByZXBsYXkgY291bnRlciovCisgICAgICAgICAgICAgIHBUTEhhbmRsZS0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlEXS51bGxSZXBsYXlDb3VudGVyW3VjVElEXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOworICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEEgaG9sZSBkZXRlY3RlZCBpbiBSZW9yZGVyIGJ1ZmZlciovCisgICAgICAgICAgICAgIC8vQkFNU0dFUlJPUigiV0xBTlRMX1Jlb3JkZXJpbmdBZ2luZ1RpbWVyRXhwaWVyQ0IsaG9sZSBkZXRlY3RlZFxuIiwwLDAsMCk7CisgICAgICAgICAgICAgICAKKyAgICAgICAgIH0KKyAgICAgICB9IAorICAgfQorI2VuZGlmCisKKyAgIHN0YXR1cyA9IFdMQU5UTF9DaGFpbkZyb250UGt0cyhmd0lkeCwgb3BDb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zRGF0YUJ1ZmYsIFJlb3JkZXJJbmZvLCBOVUxMKTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJNYWtlIHBhY2tldCBjaGFpbiBmYWlsIHdpdGggUWVkIGZyYW1lcyAlZCIsIHN0YXR1cykpOworICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfbG9ja19yZWxlYXNlKCZSZW9yZGVySW5mby0+cmVvcmRlckxvY2spKSkKKyAgICAgIHsKKyAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJXTEFOVExfUmVvcmRlcmluZ0FnaW5nVGltZXJFeHBpZXJDQiwgUmVsZWFzZSBMT0NLIEZhaWwiKSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmKE5VTEwgPT0gcFRMSGFuZGxlLT5hdGxTVEFDbGllbnRzW3VjU1RBSURdLnBmblNUQVJ4KQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkNhbGxiYWNrIGZ1bmN0aW9uIE5VTEwgd2l0aCBTVEFJRCAlZCIsIHVjU1RBSUQpKTsKKyAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX2xvY2tfcmVsZWFzZSgmUmVvcmRlckluZm8tPnJlb3JkZXJMb2NrKSkpCisgICAgICB7CisgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTlRMX1Jlb3JkZXJpbmdBZ2luZ1RpbWVyRXhwaWVyQ0IsIFJlbGVhc2UgTE9DSyBGYWlsIikpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgfQorCisgICBpZihOVUxMID09IHZvc0RhdGFCdWZmKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIk5vIHBlbmRpbmcgZnJhbWVzLCB3aHkgdHJpZ2dlcmVkIHRpbWVyPyAiKSk7CisgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19sb2NrX3JlbGVhc2UoJlJlb3JkZXJJbmZvLT5yZW9yZGVyTG9jaykpKQorICAgICAgeworICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIldMQU5UTF9SZW9yZGVyaW5nQWdpbmdUaW1lckV4cGllckNCLCBSZWxlYXNlIExPQ0sgRmFpbCIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgIH0KKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUgIAorICAgaWYoIFdMQU5fU1RBX1NPRlRBUCA9PSBwVExIYW5kbGUtPmF0bFNUQUNsaWVudHNbdWNTVEFJRF0ud1NUQURlc2Mud1NUQVR5cGUpCisgICB7CisgICAgICBXTEFOVExfRndkUGt0VG9IREQoIGV4cGlyZUhhbmRsZS0+cEFkYXB0ZXIsIHZvc0RhdGFCdWZmLCB1Y1NUQUlEKTsKKyAgIH0KKyAgIGVsc2UKKyNlbmRpZgorICAgeworICAgICAgd1J4TWV0YUluZm8udWNVUCA9IHVjVElEOworICAgICAgcFRMSGFuZGxlLT5hdGxTVEFDbGllbnRzW3VjU1RBSURdLnBmblNUQVJ4KGV4cGlyZUhhbmRsZS0+cEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsIHVjU1RBSUQsICZ3UnhNZXRhSW5mbyk7CisgICB9CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19sb2NrX3JlbGVhc2UoJlJlb3JkZXJJbmZvLT5yZW9yZGVyTG9jaykpKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIldMQU5UTF9SZW9yZGVyaW5nQWdpbmdUaW1lckV4cGllckNCLCBSZWxlYXNlIExPQ0sgRmFpbCIpKTsKKyAgIH0KKyAgIHJldHVybjsKK30vKldMQU5UTF9SZW9yZGVyaW5nQWdpbmdUaW1lckV4cGllckNCKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSU5URVJBQ1RJT04gV0lUSCBUTCBNYWluCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgRlVOQ1RJT04gICAgV0xBTlRMX0luaXRCQVJlb3JkZXJCdWZmZXIKKworICAgREVTQ1JJUFRJT04gCisgICAgICBJbml0IFJlb3JkZXIgYnVmZmVyIGFycmF5CisgICAgCisgICBQQVJBTUVURVJTIAorICAgICAgdl9QVk9JRF90ICAgcHZvc0dDdHggR2xvYmFsIGNvbnRleHQKKworICAgUkVUVVJOIFZBTFVFCisgICAgICBOT05FCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgV0xBTlRMX0luaXRCQVJlb3JkZXJCdWZmZXIKKygKKyAgIHZfUFZPSURfdCAgIHB2b3NHQ3R4CispCit7CisgICBXTEFOVExfQ2JUeXBlICAgICAgICAqcFRMQ2I7CisgICB2X1UzMl90ICAgICAgICAgICAgICBpZHg7CisgICB2X1UzMl90ICAgICAgICAgICAgICBwSWR4OworCisgICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICAgaWYgKE5VTEwgPT0gcFRMQ2IpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFRMIENvbnRyb2wgQmxvY2siLCBfX0ZVTkNUSU9OX18pKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgZm9yKGlkeCA9IDA7IGlkeCA8IFdMQU5UTF9NQVhfQkFfU0VTU0lPTjsgaWR4KyspCisgICB7CisgICAgICBwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2xbaWR4XS5pc0F2YWlsYWJsZSA9IFZPU19UUlVFOworICAgICAgZm9yKHBJZHggPSAwOyBwSWR4IDwgV0xBTlRMX01BWF9XSU5TSVpFOyBwSWR4KyspCisgICAgICB7CisgICAgICAgICBwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2xbaWR4XS5hcnJheUJ1ZmZlcltwSWR4XSA9IE5VTEw7CisjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TCisgICAgICAgICBwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2xbaWR4XS51bGxSZXBsYXlDb3VudGVyW3BJZHhdID0gMDsgCisjZW5kaWYKKyAgICAgIH0KKyAgIH0KKworICAgVExMT0c0KFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csIkJBIHJlb3JkZXIgYnVmZmVyIGluaXQiKSk7CisgICByZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfQmFTZXNzaW9uQWRkCisKKyAgREVTQ1JJUFRJT04gCisgICAgSEFMIG5vdGlmaWVzIFRMIHdoZW4gYSBuZXcgQmxvY2sgQWNrIHNlc3Npb24gaXMgYmVpbmcgYWRkZWQuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgQSBCQSBzZXNzaW9uIG9uIFJ4IG5lZWRzIHRvIGJlIGFkZGVkIGluIFRMIGJlZm9yZSB0aGUgcmVzcG9uc2UgaXMgCisgICAgYmVpbmcgc2VudCBvdXQgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGZvciB3aGljaCByZXF1ZXN0ZWQgdGhlIEJBIAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCisgICAgdWNUaWQ6ICAgICAgICAgIFRzcGVjIElEIGZvciB0aGUgbmV3IEJBIHNlc3Npb24KKyAgICB1U2l6ZTogICAgICAgICAgc2l6ZSBvZiB0aGUgcmVvcmRlcmluZyB3aW5kb3cKKworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICAgICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICAgICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogICAgIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkIG9yIEJBIHNlc3Npb24gYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMKKyAgICBWT1NfU1RBVFVTX0VfTk9TVVBQT1JUOiAgTm90IHlldCBzdXBwb3J0ZWQKKyAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX0JhU2Vzc2lvbkFkZCAKKyggCisgIHZfUFZPSURfdCAgIHB2b3NHQ3R4LCAKKyAgdl9VMTZfdCAgICAgc2Vzc2lvbklELAorICB2X1UzMl90ICAgICB1Y1NUQUlkLAorICB2X1U4X3QgICAgICB1Y1RpZCwgCisgIHZfVTMyX3QgICAgIHVCdWZmZXJTaXplLAorICB2X1UzMl90ICAgICB3aW5TaXplLAorICB2X1UzMl90ICAgICBTU04KKykKK3sKKyAgV0xBTlRMX0NiVHlwZSAgICAgICAgKnBUTENiID0gTlVMTDsgCisgIFdMQU5UTF9CQVJlb3JkZXJUeXBlICpyZW9yZGVySW5mbzsKKyAgdl9VMzJfdCAgICAgICAgICAgICAgIGlkeDsKKyAgVk9TX1NUQVRVUyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0xBTlRMX1RJRF9JTlZBTElEKHVjVGlkKSkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9CYVNlc3Npb25BZGQiKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQmFTZXNzaW9uQWRkIik7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CisgIGlmICggTlVMTCA9PSBwVExDYiApIAorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0JhU2Vzc2lvbkFkZCIpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNFeGlzdHMgKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZCBvbiBXTEFOVExfQmFTZXNzaW9uQWRkIik7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFZlcmlmeSB0aGF0IEJBIHNlc3Npb24gd2FzIG5vdCBhbHJlYWR5IGFkZGVkCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXRsQkFSZW9yZGVySW5mb1t1Y1RpZF0udWNFeGlzdHMgKSAKKyAgeworICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnVjRXhpc3RzKys7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXTEFOIFRMOkJBIHNlc3Npb24gYWxyZWFkeSBleGlzdHMgb24gV0xBTlRMX0JhU2Vzc2lvbkFkZCIpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJbml0aWFsaXplIG5ldyBCQSBzZXNzaW9uIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmVvcmRlckluZm8gPSAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXRsQkFSZW9yZGVySW5mb1t1Y1RpZF07CisKKyAgZm9yKGlkeCA9IDA7IGlkeCA8IFdMQU5UTF9NQVhfQkFfU0VTU0lPTjsgaWR4KyspCisgIHsKKyAgICBpZihWT1NfVFJVRSA9PSBwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2xbaWR4XS5pc0F2YWlsYWJsZSkKKyAgICB7CisgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5hdGxCQVJlb3JkZXJJbmZvW3VjVGlkXS5yZW9yZGVyQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2xbaWR4XSk7CisgICAgICBwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2xbaWR4XS5pc0F2YWlsYWJsZSA9IFZPU19GQUxTRTsKKyAgICAgIFRMTE9HNChWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCIlZHRoIGJ1ZmZlciBhdmFpbGFibGUsIGJ1ZmZlciBQVFIgMHglcCIsCisgICAgICAgICAgICAgICAgICBpZHgsCisgICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5hdGxCQVJlb3JkZXJJbmZvW3VjVGlkXS5yZW9yZGVyQnVmZmVyCisgICAgICAgICAgICAgICAgICApKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRSAgCisgIAorICBpZiggV0xBTl9TVEFfU09GVEFQID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLndTVEFUeXBlKQorICB7CisgICAgICBpZiggV0xBTlRMX01BWF9CQV9TRVNTSU9OID09IGlkeCkgCisgICAgICB7CisgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJOdW1iZXIgb2YgQWRkIEJBIHJlcXVlc3QgcmVjZWl2ZWQgbW9yZSB0aGFuIGFsbG93ZWQgXG4iKTsKKyAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PU1VQUE9SVDsKKyAgICAgIH0KKyAgfQorI2VuZGlmCisgIHJlb3JkZXJJbmZvLT50aW1lclVkYXRhLnBBZGFwdGVyICAgICA9IHB2b3NHQ3R4OworICByZW9yZGVySW5mby0+dGltZXJVZGF0YS5wVExIYW5kbGUgICAgPSAodl9QVk9JRF90KXBUTENiOworICByZW9yZGVySW5mby0+dGltZXJVZGF0YS5TVEFJRCAgICAgICAgPSB1Y1NUQUlkOworICByZW9yZGVySW5mby0+dGltZXJVZGF0YS5USUQgICAgICAgICAgPSB1Y1RpZDsKKworICAvKiBCQSBhZ2luZyB0aW1lciAqLworICBzdGF0dXMgPSB2b3NfdGltZXJfaW5pdCgmcmVvcmRlckluZm8tPmFnaW5nVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19USU1FUl9UWVBFX1NXLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUmVvcmRlcmluZ0FnaW5nVGltZXJFeHBpZXJDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkoJnJlb3JkZXJJbmZvLT50aW1lclVkYXRhKSk7CisgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgeworICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiVGltZXIgSW5pdCBGYWlsIikpOworICAgICByZXR1cm4gc3RhdHVzOworICB9CisKKyAgLyogUmVvcmRlciBMT0NLCisgICAqIER1cmluZyBoYW5kbGUgbm9ybWFsIFJYIGZyYW1lLCBpZiB0aW1lciBzeHBpZXIsIGFibm9ybWFsIHJhY2UgY29uZGl0aW9uIGhhcHBlbgorICAgKiBGcmFtZXMgc2hvdWxkIGJlIHByb3RlY3RlZCBmcm9tIGRvdWJsZSBoYW5kbGUgKi8KKyAgc3RhdHVzID0gdm9zX2xvY2tfaW5pdCgmcmVvcmRlckluZm8tPnJlb3JkZXJMb2NrKTsKKyAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICB7CisgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJMb2NrIEluaXQgRmFpbCIpKTsKKyAgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorCisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnVjRXhpc3RzKys7CisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnVzQ291bnQgICA9IDA7CisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnVjQ0luZGV4ICA9IDA7CisgIGlmKDAgPT0gd2luU2l6ZSkKKyAgeworICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLndpblNpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01BWF9XSU5TSVpFOworICB9CisgIGVsc2UKKyAgeworICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLndpblNpemUgICA9IHdpblNpemU7CisgIH0KKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXRsQkFSZW9yZGVySW5mb1t1Y1RpZF0uU1NOICAgICAgID0gU1NOOworICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5hdGxCQVJlb3JkZXJJbmZvW3VjVGlkXS5zZXNzaW9uSUQgPSBzZXNzaW9uSUQ7CisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnBlbmRpbmdGcmFtZXNDb3VudCA9IDA7CisgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gVEw6TmV3IEJBIHNlc3Npb24gYWRkZWQgZm9yIFNUQTogJWQgVElEOiAlZCIsCisgICAgICAgICAgICAgdWNTVEFJZCwgdWNUaWQpKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9CYVNlc3Npb25BZGQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9CYVNlc3Npb25EZWwKKworICBERVNDUklQVElPTiAKKyAgICBIQUwgbm90aWZpZXMgVEwgd2hlbiBhIG5ldyBCbG9jayBBY2sgc2Vzc2lvbiBpcyBiZWluZyBkZWxldGVkLiAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzIAorICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKKyAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggcmVxdWVzdGVkIHRoZSBCQSAKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbgorICAgIHVjVGlkOiAgICAgICAgICBUc3BlYyBJRCBmb3IgdGhlIG5ldyBCQSBzZXNzaW9uCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgICAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQgCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgICAgIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0ICAKKyAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgICAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQgb3IgQkEgc2Vzc2lvbiBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cworICAgIFZPU19TVEFUVVNfRV9OT1NVUFBPUlQ6ICBOb3QgeWV0IHN1cHBvcnRlZAorICAgIAorICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfQmFTZXNzaW9uRGVsIAorKCAKKyAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsIAorICB2X1UxNl90ICAgICAgICB1Y1NUQUlkLAorICB2X1U4X3QgICAgICAgICB1Y1RpZAorKQoreworICBXTEFOVExfQ2JUeXBlKiAgICAgICAgICBwVExDYiAgICAgICA9IE5VTEw7IAorICB2b3NfcGt0X3QqICAgICAgICAgICAgICB2b3NEYXRhQnVmZiA9IE5VTEw7CisgIFZPU19TVEFUVVMgICAgICAgICAgICAgIHZvc1N0YXR1cyAgID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIFZPU19TVEFUVVMgICAgICAgICAgICAgIGxvY2tTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsgIAorICBXTEFOVExfQkFSZW9yZGVyVHlwZSogICByZU9yZGVySW5mbyA9IE5VTEw7CisgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSAgIHdSeE1ldGFJbmZvOworICB2X1UzMl90ICAgICAgICAgICAgICAgICBmd0lkeCA9IDA7CisgIHRBTklfVTggICAgICAgICAgICAgICAgIGxvY2tSZXRyeUNudCA9IDA7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIFdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkpCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfQmFTZXNzaW9uRGVsIik7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorCisgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9CYVNlc3Npb25EZWwiKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHBUTENiICkgCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQmFTZXNzaW9uRGVsIik7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIGlmICgoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNFeGlzdHMgKSAmJgorICAgICAgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnVjRXhpc3RzICkpCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0JhU2Vzc2lvbkRlbCIpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOworICB9CisgIGVsc2UgaWYoKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjRXhpc3RzICkgJiYKKyAgICAgICAgICAoIDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXRsQkFSZW9yZGVySW5mb1t1Y1RpZF0udWNFeGlzdHMgKSkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgIlNUQSB3YXMgZGVsZXRlZCBidXQgQkEgaW5mbyBpcyBzdGlsbCB0aGVyZSwganVzdCByZW1vdmUgQkEgaW5mbyIpOworCisgICAgcmVPcmRlckluZm8gPSAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXRsQkFSZW9yZGVySW5mb1t1Y1RpZF07CisgICAgcmVPcmRlckluZm8tPnJlb3JkZXJCdWZmZXItPmlzQXZhaWxhYmxlID0gVk9TX1RSVUU7CisgICAgbWVtc2V0KCZyZU9yZGVySW5mby0+cmVvcmRlckJ1ZmZlci0+YXJyYXlCdWZmZXJbMF0sCisgICAgICAgICAgIDAsCisgICAgICAgICAgIFdMQU5UTF9NQVhfV0lOU0laRSAqIHNpemVvZih2X1BWT0lEX3QpKTsKKyAgICB2b3NfdGltZXJfZGVzdHJveSgmcmVPcmRlckluZm8tPmFnaW5nVGltZXIpOworICAgIG1lbXNldChyZU9yZGVySW5mbywgMCwgc2l6ZW9mKFdMQU5UTF9CQVJlb3JkZXJUeXBlKSk7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBWZXJpZnkgdGhhdCBCQSBzZXNzaW9uIHdhcyBhZGRlZAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnVjRXhpc3RzICkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6QkEgc2Vzc2lvbiBkb2VzIG5vdCBleGlzdHMgb24gV0xBTlRMX0JhU2Vzc2lvbkRlbCIpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOworICB9CisKKyAgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgYWxsIHBlbmRpbmcgcGFja2V0cyB0byBIREQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZU9yZGVySW5mbyA9ICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5hdGxCQVJlb3JkZXJJbmZvW3VjVGlkXTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBJbnZhbGlkYXRlIHJlb3JkZXIgaW5mbyBoZXJlLiBUaGlzIGVuc3VyZXMgdGhhdCBubyBwYWNrZXRzIGFyZSAKKyAgICAgYnVmZmVyZCBhZnRlciAgcmVvcmRlciBidWZmZXIgaXMgY2xlYW5lZC4KKyAgICovCisgIGxvY2tTdGF0dXMgPSB2b3NfbG9ja19hY3F1aXJlKCZyZU9yZGVySW5mby0+cmVvcmRlckxvY2spOworICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKGxvY2tTdGF0dXMpKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgIlVuYWJsZSB0byBhY3F1aXJlIHJlb3JkZXIgdm9zIGxvY2sgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOworICAgIHJldHVybiBsb2NrU3RhdHVzOworICB9CisgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnVjRXhpc3RzID0gMDsKKworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIldMQU4gVEw6IEZ3ZCBhbGwgcGFja2V0cyB0byBIREQgb24gV0xBTlRMX0JhU2Vzc2lvbkRlbCIpKTsKKworICBpZigwID09IHJlT3JkZXJJbmZvLT51Y0NJbmRleCkKKyAgeworICAgICBmd0lkeCA9IHJlT3JkZXJJbmZvLT53aW5TaXplOworICB9CisgIGVsc2UKKyAgeworICAgICBmd0lkeCA9IHJlT3JkZXJJbmZvLT51Y0NJbmRleCAtIDE7CisgIH0KKworICBpZigwICE9IHJlT3JkZXJJbmZvLT5wZW5kaW5nRnJhbWVzQ291bnQpCisgIHsKKyAgICB2b3NTdGF0dXMgPSBXTEFOVExfQ2hhaW5Gcm9udFBrdHMoZndJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9PUENPREVfRldEQUxMX0RST1BDVVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b3NEYXRhQnVmZiwgcmVPcmRlckluZm8sIHBUTENiKTsKKyAgfQorCisgIGlmICgoVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cykgJiYgKE5VTEwgIT0gdm9zRGF0YUJ1ZmYpKQorICB7CisgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiV0xBTiBUTDogQ2hhaW5pbmcgd2FzIHN1Y2Nlc3NmdWwgc2VuZGluZyBhbGwgcGt0cyB0byBIREQgOiAleCIsCisgICAgICAgICAgICAgIHZvc0RhdGFCdWZmICkpOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIGlmICggV0xBTl9TVEFfU09GVEFQID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLndTVEFUeXBlICkKKyAgICB7CisgICAgICBXTEFOVExfRndkUGt0VG9IREQoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiwgdWNTVEFJZCk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHdSeE1ldGFJbmZvLnVjVVAgPSB1Y1RpZDsKKyAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOworICAgIH0KKyAgfQorCisgIHZvc19sb2NrX3JlbGVhc2UoJnJlT3JkZXJJbmZvLT5yZW9yZGVyTG9jayk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRGVsZXRlIHJlb3JkZXJpbmcgdGltZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKFZPU19USU1FUl9TVEFURV9SVU5OSU5HID09IHZvc190aW1lcl9nZXRDdXJyZW50U3RhdGUoJnJlT3JkZXJJbmZvLT5hZ2luZ1RpbWVyKSkKKyAgeworICAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9zdG9wKCZyZU9yZGVySW5mby0+YWdpbmdUaW1lcik7CisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgIHsgCisgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIlRpbWVyIHN0b3AgZmFpbCIsIHZvc1N0YXR1cykpOworICAgICAgIHJldHVybiB2b3NTdGF0dXM7CisgICAgfQorICB9CisKKyAgaWYoVk9TX1RJTUVSX1NUQVRFX1NUT1BQRUQgPT0gdm9zX3RpbWVyX2dldEN1cnJlbnRTdGF0ZSgmcmVPcmRlckluZm8tPmFnaW5nVGltZXIpKQorICB7CisgICAgIHZvc1N0YXR1cyA9IHZvc190aW1lcl9kZXN0cm95KCZyZU9yZGVySW5mby0+YWdpbmdUaW1lcik7CisgIH0KKyAgZWxzZQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIlRpbWVyIGlzIG5vdCBzdG9wcGVkIHN0YXRlIGN1cnJlbnQgc3RhdGUgaXMgJWQiLAorICAgICAgICAgICAgICAgIHZvc190aW1lcl9nZXRDdXJyZW50U3RhdGUoJnJlT3JkZXJJbmZvLT5hZ2luZ1RpbWVyKSkpOworICB9CisgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIAorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHRvIGRlc3Ryb3kgcmVvcmRlciB0aW1lciBvbiBXTEFOVExfQmFTZXNzaW9uQWRkIik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIERlbGV0ZSBzZXNzaW9uIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXRsQkFSZW9yZGVySW5mb1t1Y1RpZF0udXNDb3VudCAgPSAwOworICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5hdGxCQVJlb3JkZXJJbmZvW3VjVGlkXS51Y0NJbmRleCA9IDA7CisgIHJlT3JkZXJJbmZvLT53aW5TaXplICAgPSAwOworICByZU9yZGVySW5mby0+U1NOICAgICAgID0gMDsKKyAgcmVPcmRlckluZm8tPnNlc3Npb25JRCA9IDA7CisKKyAgd2hpbGUgKHZvc19sb2NrX2Rlc3Ryb3koJnJlT3JkZXJJbmZvLT5yZW9yZGVyTG9jaykgPT0gVk9TX1NUQVRVU19FX0JVU1kpCisgIHsKKyAgICBpZiggbG9ja1JldHJ5Q250ID4gMikKKyAgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiVW5hYmxlIHRvIGRlc3Ryb3kgcmVvcmRlckxvY2tcbiIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB2b3Nfc2xlZXAoMSk7CisgICAgbG9ja1JldHJ5Q250Kys7CisgIH0KKworICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFRMOiBCQSBzZXNzaW9uIGRlbGV0ZWQgZm9yIFNUQTogJWQgVElEOiAlZCIsCisgICAgICAgICAgICAgdWNTVEFJZCwgdWNUaWQpKTsKKworICBtZW1zZXQoKHZfVThfdCAqKSgmcmVPcmRlckluZm8tPnJlb3JkZXJCdWZmZXItPmFycmF5QnVmZmVyWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01BWF9XSU5TSVpFICogc2l6ZW9mKHZfUFZPSURfdCkpOworICByZU9yZGVySW5mby0+cmVvcmRlckJ1ZmZlci0+aXNBdmFpbGFibGUgPSBWT1NfVFJVRTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9CYVNlc3Npb25EZWwgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJTlRFUkFDVElPTiBXSVRIIFRMIG1haW4gbW9kdWxlCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgQU1TRFUgc3ViLWZyYW1lIHByb2Nlc3NpbmcgbW9kdWxlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlRMX0FNU0RVUHJvY2VzcworCisgIERFU0NSSVBUSU9OIAorICAgIFByb2Nlc3MgQS1NU0RVIHN1Yi1mcmFtZS4gU3RhcnQgb2YgY2hhaW4gaWYgbWFya2VkIGFzIGZpcnN0IGZyYW1lLiAKKyAgICBMaW5rZWQgYXQgdGhlIGVuZCBvZiB0aGUgZXhpc3RpbmcgQU1TRFUgY2hhaW4uIAorCisgIERFUEVOREVOQ0lFUyAKKyAgICAgICAgIAorICBQQVJBTUVURVJTIAorCisgICBJTi9PVVQ6CisgICB2b3NEYXRhQnVmZjogdm9zIHBhY2tldCBmb3IgdGhlIHJlY2VpdmVkIGRhdGEKKyAgICAgICAgICAgICAgICAgb3V0Z29pbmcgY29udGFpbnMgdGhlIHJvb3Qgb2YgdGhlIGNoYWluIGZvciB0aGUgcnggCisgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZWQgTVNEVSBpZiB0aGUgZnJhbWUgaXMgbWFya2VkIGFzIGxhc3Q7IG90aGVyd2lzZSAKKyAgICAgICAgICAgICAgICAgTlVMTAorICAgCisgICBJTgorICAgcHZvc0dDdHg6ICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgcHZCREhlYWRlcjogICBwb2ludGVyIHRvIHRoZSBCRCBoZWFkZXIKKyAgIHVjU1RBSWQ6ICAgICAgU3RhdGlvbiBJRCAKKyAgIHVjTVBEVUhMZW46ICAgbGVuZ3RoIG9mIHRoZSBNUERVIGhlYWRlcgorICAgdXNNUERVTGVuOiAgICBsZW5ndGggb2YgdGhlIE1QRFUgCisgICAgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorCisgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycworICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIE90aGVyIHZhbHVlcyBjYW4gYmUgcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCBwbGVhc2UgY2hlY2sgCisgIGNvcnJlc3BvbmRpbmcgQVBJIGZvciBtb3JlIGluZm8uIAorICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX0FNU0RVUHJvY2VzcworKCAKKyAgdl9QVk9JRF90ICAgcHZvc0dDdHgsCisgIHZvc19wa3RfdCoqIHBwVm9zRGF0YUJ1ZmYsIAorICB2X1BWT0lEX3QgICBwdkJESGVhZGVyLAorICB2X1U4X3QgICAgICB1Y1NUQUlkLAorICB2X1U4X3QgICAgICB1Y01QRFVITGVuLAorICB2X1UxNl90ICAgICB1c01QRFVMZW4KKykKK3sKKyAgdl9VOF90ICAgICAgICAgIHVjRnNmOyAvKiBGaXJzdCBBTVNEVSBzdWIgZnJhbWUgKi8KKyAgdl9VOF90ICAgICAgICAgIHVjQWVmOyAvKiBFcnJvciBpbiBBTVNEVSBzdWIgZnJhbWUgKi8KKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsgCisgIHZfVThfdCAgICAgICAgICBNUERVSGVhZGVyQU1TRFVIZWFkZXJbV0xBTlRMX01QRFVfSEVBREVSX0xFTiArIFRMX0FNU0RVX1NVQkZSTV9IRUFERVJfTEVOXTsKKyAgdl9VMTZfdCAgICAgICAgIHN1YkZyYW1lTGVuZ3RoOworICB2X1UxNl90ICAgICAgICAgcGFkZGluZ1NpemU7CisgIFZPU19TVEFUVVMgICAgICB2U3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICB2X1UxNl90ICAgICAgICAgTVBEVURhdGFPZmZzZXQ7CisgIHZfVTE2X3QgICAgICAgICBwYWNrZXRMZW5ndGg7IAorICBzdGF0aWMgdl9VMzJfdCAgbnVtQU1TRFVGcmFtZXMgPSAwOworICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmY7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwcFZvc0RhdGFCdWZmICkgfHwgKE5VTEwgPT0gKnBwVm9zRGF0YUJ1ZmYpIHx8ICggTlVMTCA9PSBwdkJESGVhZGVyICkgfHwgCisgICAgICAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkgKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9BTVNEVVByb2Nlc3MiKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICB9CisKKyAgdm9zRGF0YUJ1ZmYgPSAqcHBWb3NEYXRhQnVmZjsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOworICBpZiAoIE5VTEwgPT0gcFRMQ2IgKSAKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0FNU0RVUHJvY2VzcyIpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIGZyYW1lCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB1Y0FlZiA9ICAodl9VOF90KVdEQV9HRVRfUlhfQUVGKCBwdkJESGVhZGVyICk7CisgIHVjRnNmID0gICh2X1U4X3QpV0RBX0dFVF9SWF9FU0YoIHB2QkRIZWFkZXIgKTsKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgIE1QRFVEYXRhT2Zmc2V0ID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKHB2QkRIZWFkZXIpIC0gV0xBTkhBTF9SWF9CRF9IRUFERVJfU0laRTsKKyNlbHNlCisgIC8qIE9uIFByaW1hLCBNUERVIGRhdGEgb2Zmc2V0IG5vdCBpbmNsdWRlcyBCRCBoZWFkZXIgc2l6ZSAqLworICBNUERVRGF0YU9mZnNldCA9ICh2X1UxNl90KVdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChwdkJESGVhZGVyKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworICBpZiAoIFdMQU5IQUxfUlhfQkRfQUVGX1NFVCA9PSB1Y0FlZiApIAorICB7CisgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3IgaW4gQU1TRFUgLSBkcm9wcGluZyBlbnRpcmUgY2hhaW4iKSk7CisKKyAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOworICAgICpwcFZvc0RhdGFCdWZmID0gTlVMTDsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOyAvKk5vdCBhIHRyYW5zcG9ydCBlcnJvciovIAorICB9CisKKyAgaWYoKDAgIT0gdWNNUERVSExlbikgJiYgdWNGc2YpCisgIHsKKyAgICAvKgorICAgICAqIFRoaXMgaXMgZmlyc3QgQU1TRFUgc3ViIGZyYW1lCisgICAgICogQU1TRFUgSGVhZGVyIHNob3VsZCBiZSByZW1vdmVkCisgICAgICogTVBEVSBoZWFkZXIgc2hvdWxkIGJlIHN0b3JlZCBpbnRvIGNvbnRleHQgdG8gcmVjb3ZlciBuZXh0IGZyYW1lcworICAgICAqLworICAgIHZTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKHZvc0RhdGFCdWZmLCBNUERVSGVhZGVyQU1TRFVIZWFkZXIsIHVjTVBEVUhMZW4gKyBUTF9BTVNEVV9TVUJGUk1fSEVBREVSX0xFTik7CisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUG9wIE1QRFUgQU1TRFUgSGVhZGVyIGZhaWwiKSk7CisgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOworICAgICAgKnBwVm9zRGF0YUJ1ZmYgPSBOVUxMOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsgLypOb3QgYSB0cmFuc3BvcnQgZXJyb3IqLyAKKyAgICB9CisgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNNUERVSGVhZGVyTGVuID0gdWNNUERVSExlbjsKKyAgICBtZW1jcHkocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYXVjTVBEVUhlYWRlciwgTVBEVUhlYWRlckFNU0RVSGVhZGVyLCB1Y01QRFVITGVuKTsKKyAgICAvKiBBTVNEVSBoZWFkZXIgc3RvcmVkIHRvIGhhbmRsZSBnYWJhZ2UgZGF0YSB3aXRoaW4gbmV4dCBmcmFtZSAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFRyaW0gZ2FiYWdlLCBzaXplIGlzIGZyYW1lTG9vcCAqLworICAgIGlmKE1QRFVEYXRhT2Zmc2V0ID4gMCkKKyAgICB7CisgICAgICB2U3RhdHVzID0gdm9zX3BrdF90cmltX2hlYWQodm9zRGF0YUJ1ZmYsIE1QRFVEYXRhT2Zmc2V0KTsKKyAgICB9CisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiVHJpbSBHYXJiYWdlIERhdGEgZmFpbCIpKTsKKyAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CisgICAgICAqcHBWb3NEYXRhQnVmZiA9IE5VTEw7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOyAvKk5vdCBhIHRyYW5zcG9ydCBlcnJvciovIAorICAgIH0KKworICAgIC8qIFJlbW92ZSBNUERVIGhlYWRlciBhbmQgQU1TRFUgaGVhZGVyIGZyb20gdGhlIHBhY2tldCAqLworICAgIHZTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKHZvc0RhdGFCdWZmLCBNUERVSGVhZGVyQU1TRFVIZWFkZXIsIHVjTVBEVUhMZW4gKyBUTF9BTVNEVV9TVUJGUk1fSEVBREVSX0xFTik7CisgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiQU1TRFUgSGVhZGVyIFBvcCBmYWlsIikpOworICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKKyAgICAgICpwcFZvc0RhdGFCdWZmID0gTlVMTDsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7IC8qTm90IGEgdHJhbnNwb3J0IGVycm9yKi8gCisgICAgfQorICB9IC8qIEVuZCBvZiBoZW5hbGRpbmcgbm90IGZpcnN0IHN1YiBmcmFtZSBzcGVjaWZpYyAqLworCisgIC8qIFB1dCBpbiBNUERVIGhlYWRlciBpbnRvIGFsbCB0aGUgZnJhbWUgKi8KKyAgdlN0YXR1cyA9IHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5hdWNNUERVSGVhZGVyLCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y01QRFVIZWFkZXJMZW4pOworICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICB7CisgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIk1QRFUgSGVhZGVyIFB1c2ggYmFjayBmYWlsIikpOworICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CisgICAgKnBwVm9zRGF0YUJ1ZmYgPSBOVUxMOworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7IC8qTm90IGEgdHJhbnNwb3J0IGVycm9yKi8gCisgIH0KKworICAvKiBGaW5kIFBhZGRpbmcgYW5kIHJlbW92ZSAqLworICBtZW1jcHkoJnN1YkZyYW1lTGVuZ3RoLCBNUERVSGVhZGVyQU1TRFVIZWFkZXIgKyB1Y01QRFVITGVuICsgV0xBTlRMX0FNU0RVX1NVQkZSQU1FX0xFTl9PRkZTRVQsIHNpemVvZih2X1UxNl90KSk7CisgIHN1YkZyYW1lTGVuZ3RoID0gdm9zX2JlMTZfdG9fY3B1KHN1YkZyYW1lTGVuZ3RoKTsKKyAgcGFkZGluZ1NpemUgPSB1c01QRFVMZW4gLSB1Y01QRFVITGVuIC0gc3ViRnJhbWVMZW5ndGggLSBUTF9BTVNEVV9TVUJGUk1fSEVBREVSX0xFTjsKKworICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKHZvc0RhdGFCdWZmLCAmcGFja2V0TGVuZ3RoKTsKKyAgaWYoKHBhZGRpbmdTaXplID4gMCkgJiYgKHBhZGRpbmdTaXplIDwgcGFja2V0TGVuZ3RoKSkKKyAgeworICAgIC8qIFRoZXJlIGlzIHBhZGRpbmcgYml0cywgcmVtb3ZlIGl0ICovCisgICAgdm9zX3BrdF90cmltX3RhaWwodm9zRGF0YUJ1ZmYsIHBhZGRpbmdTaXplKTsKKyAgfQorICBlbHNlIGlmKDAgPT0gcGFkZGluZ1NpemUpCisgIHsKKyAgICAvKiBObyBQYWRkaW5nIGJpdHMgKi8KKyAgICAvKiBEbyBOb3RoaW5nICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUGFkZGluZyBzaXplIGlzIGxhcmdlciB0aGFuIEZyYW1lIHNpemUsIEFjdHVhbGx5IG5lZ2F0aXZlICovCisgICAgLyogTm90IGEgdmFsaWQgY2FzZSwgbm90IGEgdmFsaWQgZnJhbWUsIGRyb3AgaXQgKi8KKyAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUGFkZGluZyBTaXplIGlzIG5lZ2F0aXZlLCBubyBwb3NzaWJsZSAlZCIsIHBhZGRpbmdTaXplKSk7CisgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKKyAgICAqcHBWb3NEYXRhQnVmZiA9IE5VTEw7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsgLypOb3QgYSB0cmFuc3BvcnQgZXJyb3IqLyAKKyAgfQorCisgIG51bUFNU0RVRnJhbWVzKys7CisgIGlmKDAgPT0gKG51bUFNU0RVRnJhbWVzICUgNTAwMCkpCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJWx1IEFNU0RVIGZyYW1lcyBhcnJpdmVkIiwgbnVtQU1TRFVGcmFtZXMpKTsKKyAgfQorICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfS8qIFdMQU5UTF9BTVNEVVByb2Nlc3MgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUmUtb3JkZXJpbmcgbW9kdWxlCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfTVNEVVJlb3JkZXIKKworICBERVNDUklQVElPTiAKKyAgICBNU0RVIHJlb3JkZXJpbmcgCisKKyAgREVQRU5ERU5DSUVTIAorICAgICAgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgIElOCisgICAKKyAgIHZvc0RhdGFCdWZmOiB2b3MgcGFja2V0IGZvciB0aGUgcmVjZWl2ZWQgZGF0YQorICAgcHZCREhlYWRlcjogcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCisgICB1Y1NUQUlkOiAgICBTdGF0aW9uIElEIAorICAgICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9NU0RVUmVvcmRlcgorKCAKKyAgIFdMQU5UTF9DYlR5cGUgICAgKnBUTENiLAorICAgdm9zX3BrdF90ICAgICAgICAqKnZvc0RhdGFCdWZmLCAKKyAgIHZfUFZPSURfdCAgICAgICAgcHZCREhlYWRlciwKKyAgIHZfVThfdCAgICAgICAgICAgdWNTVEFJZCwKKyAgIHZfVThfdCAgICAgICAgICAgdWNUaWQKKykKK3sKKyAgIFdMQU5UTF9CQVJlb3JkZXJUeXBlICpjdXJyZW50UmVvcmRlckluZm87CisgICB2b3NfcGt0X3QgICAgICAgICAgICAqdm9zUGt0SWR4OworICAgdl9VOF90ICAgICAgICAgICAgICAgdWNPcENvZGU7IAorICAgdl9VOF90ICAgICAgICAgICAgICAgdWNTbG90SWR4OworICAgdl9VOF90ICAgICAgICAgICAgICAgdWNGd2RJZHg7CisgICB2X1UxNl90ICAgICAgICAgICAgICBDU047CisgICB2X1UzMl90ICAgICAgICAgICAgICB1Y0NJbmRleE9yaWc7CisgICBWT1NfU1RBVFVTICAgICAgICAgICBzdGF0dXMgICAgICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIFZPU19TVEFUVVMgICAgICAgICAgIGxvY2tTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOyAKKyAgIFZPU19TVEFUVVMgICAgICAgICAgIHRpbWVyU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOyAKKyAgIFZPU19USU1FUl9TVEFURSAgICAgIHRpbWVyU3RhdGU7CisgICB2X1NJWkVfdCAgICAgICAgICAgICByeEZyZWU7CisjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TCisgICB2X1U2NF90ICAgICAgICAgICAgICB1bGxyZXBsYXlDb3VudGVyID0gMDsgLyogNDgtYml0IHJlcGxheSBjb3VudGVyICovCisjZW5kaWYKKyAgIGlmKChOVUxMID09IHBUTENiKSB8fCAoKnZvc0RhdGFCdWZmID09IE5VTEwpKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkludmFsaWQgQVJHIHBUTENiIDB4JXAsIHZvc0RhdGFCdWZmIDB4JXAiLAorICAgICAgICAgICAgICAgICAgcFRMQ2IsICp2b3NEYXRhQnVmZikpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgY3VycmVudFJlb3JkZXJJbmZvID0gJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdOworCisgICBsb2NrU3RhdHVzID0gdm9zX2xvY2tfYWNxdWlyZSgmY3VycmVudFJlb3JkZXJJbmZvLT5yZW9yZGVyTG9jayk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKGxvY2tTdGF0dXMpKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIldMQU5UTF9NU0RVUmVvcmRlciwgUmVsZWFzZSBMT0NLIEZhaWwiKSk7CisgICAgICByZXR1cm4gbG9ja1N0YXR1czsKKyAgIH0KKworICAgaWYoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnVjRXhpc3RzID09IDAgKQorICAgeworICAgICB2b3NfbG9ja19yZWxlYXNlKCZjdXJyZW50UmVvcmRlckluZm8tPnJlb3JkZXJMb2NrKTsKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKyAgIHVjT3BDb2RlICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9SRU9SREVSX09QQ09ERShwdkJESGVhZGVyKTsKKyAgIHVjU2xvdElkeCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9SRU9SREVSX1NMT1RfSURYKHB2QkRIZWFkZXIpOworICAgdWNGd2RJZHggID0gKHZfVThfdClXREFfR0VUX1JYX1JFT1JERVJfRldEX0lEWChwdkJESGVhZGVyKTsKKyAgIENTTiAgICAgICA9ICh2X1UxNl90KVdEQV9HRVRfUlhfUkVPUkRFUl9DVVJfUEtUX1NFUV9OTyhwdkJESGVhZGVyKTsKKworCisKKyNpZmRlZiBXTEFOVExfSEFMX1ZPTEFOUworICAgLyogUmVwbGF5IGNoZWNrIGNvZGUgOiBjaGVjayB3aGV0aGVyIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgb3Igbm90ICovCisgICBpZihWT1NfVFJVRSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0lzUmVwbGF5Q2hlY2tWYWxpZCkKKyAgIHsKKyAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgZnJvbSB0aGUgUlggQkQgKi8KKyAgICAgICAgICAgdWxscmVwbGF5Q291bnRlciA9IFdEQV9EU19HZXRSZXBsYXlDb3VudGVyKGF1Y0JESGVhZGVyKTsKKyAgIH0KKyNlbmRpZiAKKworI2lmZGVmIFdMQU5UTF9SRU9SREVSX0RFQlVHX01TR19FTkFCTEUKKyAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJvcENvZGUgJWQgU0kgJWQsIEZJICVkLCBDSSAlZCBzZXFObyAlZCIsIHVjT3BDb2RlLCB1Y1Nsb3RJZHgsIHVjRndkSWR4LCBjdXJyZW50UmVvcmRlckluZm8tPnVjQ0luZGV4LCBDU04pKTsKKyNlbHNlCisgICBUTExPRzQoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywib3BDb2RlICVkIFNJICVkLCBGSSAlZCwgQ0kgJWQgc2VxTm8gJWQiLCB1Y09wQ29kZSwgdWNTbG90SWR4LCB1Y0Z3ZElkeCwgY3VycmVudFJlb3JkZXJJbmZvLT51Y0NJbmRleCwgQ1NOKSk7CisjZW5kaWYKKworICAgLy8gcmVtZW1iZXIgb3VyIGN1cnJlbnQgQ0kgc28gdGhhdCBsYXRlciB3ZSBjYW4gdGVsbCBpZiBpdCBhZHZhbmNlZAorICAgdWNDSW5kZXhPcmlnID0gY3VycmVudFJlb3JkZXJJbmZvLT51Y0NJbmRleDsKKworICAgc3dpdGNoKHVjT3BDb2RlKSAKKyAgIHsKKyAgICAgIGNhc2UgV0xBTlRMX09QQ09ERV9JTlZBTElEOgorICAgICAgICAgLyogRG8gbm90aGluZyBqdXN0IHBhc3MgdGhyb3VnaCBjdXJyZW50IGZyYW1lICovCisgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBXTEFOVExfT1BDT0RFX1FDVVJfRldEQlVGOgorICAgICAgICAgaWYoMCA9PSBjdXJyZW50UmVvcmRlckluZm8tPnBlbmRpbmdGcmFtZXNDb3VudCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vVGhpcyBmcmFtZSB3aWxsIGJlIGZ3ZCdlZCB0byB0aGUgT1MuIFRoZSBuZXh0IHNsb3QgaXMgdGhlIG9uZSB3ZSBleHBlY3QgbmV4dAorICAgICAgICAgICAgY3VycmVudFJlb3JkZXJJbmZvLT51Y0NJbmRleCA9ICh1Y1Nsb3RJZHggKyAxKSAlIGN1cnJlbnRSZW9yZGVySW5mby0+d2luU2l6ZTsKKyAgICAgICAgICAgIGxvY2tTdGF0dXMgPSB2b3NfbG9ja19yZWxlYXNlKCZjdXJyZW50UmVvcmRlckluZm8tPnJlb3JkZXJMb2NrKTsKKyAgICAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MobG9ja1N0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTlRMX01TRFVSZW9yZGVyLCBSZWxlYXNlIExPQ0sgRmFpbCIpKTsKKyAgICAgICAgICAgICAgIHJldHVybiBsb2NrU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgIH0KKyAgICAgICAgIHN0YXR1cyA9IFdMQU5UTF9RdWV1ZUN1cnJlbnQoY3VycmVudFJlb3JkZXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTbG90SWR4KTsKKyNpZmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKyAgICAgICAgIGlmKFZPU19UUlVFID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjSXNSZXBsYXlDaGVja1ZhbGlkKQorICAgICAgICAgeworICAgICAgICAgICAgIFdMQU5UTF9GaWxsUmVwbGF5Q291bnRlcihjdXJyZW50UmVvcmRlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxscmVwbGF5Q291bnRlciwgdWNTbG90SWR4KTsKKyAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgaWYoVk9TX1NUQVRVU19FX1JFU09VUkNFUyA9PSBzdGF0dXMpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBjYXNlIHNsb3QgaW5kZXggaXMgYWxyZWFkeSBjeWNsZSBvbmUgcm91dGUsIHJvdXRlIGFsbCB0aGUgZnJhbWVzIFFlZCAqLworICAgICAgICAgICAgdm9zUGt0SWR4ID0gTlVMTDsKKyAgICAgICAgICAgIHN0YXR1cyA9IFdMQU5UTF9DaGFpbkZyb250UGt0cyh1Y0Z3ZElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfT1BDT0RFX0ZXREFMTF9RQ1VSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zUGt0SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZW9yZGVySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYik7CisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiTWFrZSBmcmFtZSBjaGFpbiBmYWlsICVkIiwgc3RhdHVzKSk7CisgICAgICAgICAgICAgICBsb2NrU3RhdHVzID0gdm9zX2xvY2tfcmVsZWFzZSgmY3VycmVudFJlb3JkZXJJbmZvLT5yZW9yZGVyTG9jayk7CisgICAgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKGxvY2tTdGF0dXMpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIldMQU5UTF9NU0RVUmVvcmRlciwgUmVsZWFzZSBMT0NLIEZhaWwiKSk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gbG9ja1N0YXR1czsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSB2b3NfcGt0X2NoYWluX3BhY2tldCh2b3NQa3RJZHgsICp2b3NEYXRhQnVmZiwgMSk7CisgICAgICAgICAgICAqdm9zRGF0YUJ1ZmYgPSB2b3NQa3RJZHg7CisgICAgICAgICAgICBjdXJyZW50UmVvcmRlckluZm8tPnBlbmRpbmdGcmFtZXNDb3VudCA9IDA7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICB2b3NQa3RJZHggPSBOVUxMOworICAgICAgICAgICAgc3RhdHVzID0gV0xBTlRMX0NoYWluRnJvbnRQa3RzKHVjRndkSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9PUENPREVfUUNVUl9GV0RCVUYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b3NQa3RJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlb3JkZXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiKTsKKyAgICAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJNYWtlIGZyYW1lIGNoYWluIGZhaWwgJWQiLCBzdGF0dXMpKTsKKyAgICAgICAgICAgICAgIGxvY2tTdGF0dXMgPSB2b3NfbG9ja19yZWxlYXNlKCZjdXJyZW50UmVvcmRlckluZm8tPnJlb3JkZXJMb2NrKTsKKyAgICAgICAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MobG9ja1N0YXR1cykpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTlRMX01TRFVSZW9yZGVyLCBSZWxlYXNlIExPQ0sgRmFpbCIpKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NrU3RhdHVzOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp2b3NEYXRhQnVmZiA9IHZvc1BrdElkeDsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFdMQU5UTF9PUENPREVfRldEQlVGX0ZXRENVUjoKKyAgICAgICAgIHZvc1BrdElkeCA9IE5VTEw7CisgICAgICAgICBzdGF0dXMgPSBXTEFOVExfQ2hhaW5Gcm9udFBrdHModWNGd2RJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX09QQ09ERV9GV0RCVUZfRldEQ1VSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zUGt0SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZW9yZGVySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYik7CisgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICB7CisgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiTWFrZSBmcmFtZSBjaGFpbiBmYWlsICVkIiwgc3RhdHVzKSk7CisgICAgICAgICAgICBsb2NrU3RhdHVzID0gdm9zX2xvY2tfcmVsZWFzZSgmY3VycmVudFJlb3JkZXJJbmZvLT5yZW9yZGVyTG9jayk7CisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKGxvY2tTdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIldMQU5UTF9NU0RVUmVvcmRlciwgUmVsZWFzZSBMT0NLIEZhaWwiKSk7CisgICAgICAgICAgICAgICByZXR1cm4gbG9ja1N0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICB9CisKKyAgICAgICAgIGlmKE5VTEwgPT0gdm9zUGt0SWR4KQorICAgICAgICAgeworICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csIk5vdGhpbmcgdG8gY2hhaW4sIGp1c3Qgc2VuZCBjdXJyZW50IGZyYW1lXG4iKSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSB2b3NfcGt0X2NoYWluX3BhY2tldCh2b3NQa3RJZHgsICp2b3NEYXRhQnVmZiwgMSk7CisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiTWFrZSBmcmFtZSBjaGFpbiB3aXRoIENVUiBmcmFtZSBmYWlsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cykpOworICAgICAgICAgICAgICAgbG9ja1N0YXR1cyA9IHZvc19sb2NrX3JlbGVhc2UoJmN1cnJlbnRSZW9yZGVySW5mby0+cmVvcmRlckxvY2spOworICAgICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhsb2NrU3RhdHVzKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJXTEFOVExfTVNEVVJlb3JkZXIsIFJlbGVhc2UgTE9DSyBGYWlsIikpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2tTdGF0dXM7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnZvc0RhdGFCdWZmID0gdm9zUGt0SWR4OworICAgICAgICAgfQorICAgICAgICAgLy91Y0Z3ZElkeCBpcyB0aGUgc2xvdCB0aGlzIHBhY2tldCBzdXBwb3NlcyB0byB0YWtlIGJ1dCB0aGVyZSBpcyBhIGhvbGUgdGhlcmUKKyAgICAgICAgIC8vSXQgbG9va3MgdGhhdCB0aGUgY2hpcCB3aWxsIHB1dCB0aGUgbmV4dCBwYWNrZXQgaW50byB0aGUgc2xvdCB1Y0Z3ZElkeC4KKyAgICAgICAgIGN1cnJlbnRSZW9yZGVySW5mby0+dWNDSW5kZXggPSB1Y0Z3ZElkeDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFdMQU5UTF9PUENPREVfUUNVUjoKKyAgICAgICAgIHN0YXR1cyA9IFdMQU5UTF9RdWV1ZUN1cnJlbnQoY3VycmVudFJlb3JkZXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTbG90SWR4KTsKKyNpZmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKyAgICAgICAgICAgaWYoVk9TX1RSVUUgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNJc1JlcGxheUNoZWNrVmFsaWQpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFdMQU5UTF9GaWxsUmVwbGF5Q291bnRlcihjdXJyZW50UmVvcmRlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bGxyZXBsYXlDb3VudGVyLCB1Y1Nsb3RJZHgpOworICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgIGlmKFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgPT0gc3RhdHVzKQorICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgY2FzZSBzbG90IGluZGV4IGlzIGFscmVhZHkgY3ljbGUgb25lIHJvdXRlLCByb3V0ZSBhbGwgdGhlIGZyYW1lcyBRZWQgKi8KKyAgICAgICAgICAgIHZvc1BrdElkeCA9IE5VTEw7CisgICAgICAgICAgICBzdGF0dXMgPSBXTEFOVExfQ2hhaW5Gcm9udFBrdHModWNGd2RJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX09QQ09ERV9GV0RBTExfUUNVUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc1BrdElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVvcmRlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IpOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIk1ha2UgZnJhbWUgY2hhaW4gZmFpbCAlZCIsIHN0YXR1cykpOworICAgICAgICAgICAgICAgbG9ja1N0YXR1cyA9IHZvc19sb2NrX3JlbGVhc2UoJmN1cnJlbnRSZW9yZGVySW5mby0+cmVvcmRlckxvY2spOworICAgICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhsb2NrU3RhdHVzKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJXTEFOVExfTVNEVVJlb3JkZXIsIFJlbGVhc2UgTE9DSyBGYWlsIikpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2tTdGF0dXM7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gdm9zX3BrdF9jaGFpbl9wYWNrZXQodm9zUGt0SWR4LCAqdm9zRGF0YUJ1ZmYsIDEpOworICAgICAgICAgICAgKnZvc0RhdGFCdWZmID0gdm9zUGt0SWR4OworICAgICAgICAgICAgY3VycmVudFJlb3JkZXJJbmZvLT5wZW5kaW5nRnJhbWVzQ291bnQgPSAwOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgLyogU2luY2UgY3VycmVudCBGcmFtZSBpcyBRZWQsIG5vIGZyYW1lIHdpbGwgYmUgcm91dGVkICovCisgICAgICAgICAgICAqdm9zRGF0YUJ1ZmYgPSBOVUxMOyAKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFdMQU5UTF9PUENPREVfRldEQlVGX1FVRVVFQ1VSOgorICAgICAgICAgdm9zUGt0SWR4ID0gTlVMTDsKKyAgICAgICAgIHN0YXR1cyA9IFdMQU5UTF9DaGFpbkZyb250UGt0cyh1Y0Z3ZElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfT1BDT0RFX0ZXREJVRl9RVUVVRUNVUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc1BrdElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVvcmRlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IpOworICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgeworICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIk1ha2UgY2hhaW4gd2l0aCBidWZmZXJlZCBmcmFtZSBmYWlsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cykpOworICAgICAgICAgICAgbG9ja1N0YXR1cyA9IHZvc19sb2NrX3JlbGVhc2UoJmN1cnJlbnRSZW9yZGVySW5mby0+cmVvcmRlckxvY2spOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhsb2NrU3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJXTEFOVExfTVNEVVJlb3JkZXIsIFJlbGVhc2UgTE9DSyBGYWlsIikpOworICAgICAgICAgICAgICAgcmV0dXJuIGxvY2tTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgfQorICAgICAgICAgLy9UaGlzIG9wQ29kZSBtZWFucyB0aGUgd2luZG93IHNoaWZ0LiBFbmZvcmNlIHRoZSBjdXJyZW50IEluZGV4CisgICAgICAgICBjdXJyZW50UmVvcmRlckluZm8tPnVjQ0luZGV4ID0gdWNGd2RJZHg7CisKKyAgICAgICAgIHN0YXR1cyA9IFdMQU5UTF9RdWV1ZUN1cnJlbnQoY3VycmVudFJlb3JkZXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTbG90SWR4KTsKKyNpZmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKyAgICAgICAgICAgaWYoVk9TX1RSVUUgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNJc1JlcGxheUNoZWNrVmFsaWQpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFdMQU5UTF9GaWxsUmVwbGF5Q291bnRlcihjdXJyZW50UmVvcmRlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bGxyZXBsYXlDb3VudGVyLCB1Y1Nsb3RJZHgpOworICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgIGlmKFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgPT0gc3RhdHVzKQorICAgICAgICAgeworICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1BrdElkeCk7IAorICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgY2FzZSBzbG90IGluZGV4IGlzIGFscmVhZHkgY3ljbGUgb25lIHJvdXRlLCByb3V0ZSBhbGwgdGhlIGZyYW1lcyBRZWQgKi8KKyAgICAgICAgICAgIHZvc1BrdElkeCA9IE5VTEw7CisgICAgICAgICAgICBzdGF0dXMgPSBXTEFOVExfQ2hhaW5Gcm9udFBrdHModWNGd2RJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX09QQ09ERV9GV0RBTExfUUNVUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc1BrdElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVvcmRlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IpOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIk1ha2UgZnJhbWUgY2hhaW4gZmFpbCAlZCIsIHN0YXR1cykpOworICAgICAgICAgICAgICAgbG9ja1N0YXR1cyA9IHZvc19sb2NrX3JlbGVhc2UoJmN1cnJlbnRSZW9yZGVySW5mby0+cmVvcmRlckxvY2spOworICAgICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhsb2NrU3RhdHVzKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJXTEFOVExfTVNEVVJlb3JkZXIsIFJlbGVhc2UgTE9DSyBGYWlsIikpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2tTdGF0dXM7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gdm9zX3BrdF9jaGFpbl9wYWNrZXQodm9zUGt0SWR4LCAqdm9zRGF0YUJ1ZmYsIDEpOworICAgICAgICAgICAgKnZvc0RhdGFCdWZmID0gdm9zUGt0SWR4OworICAgICAgICAgICAgY3VycmVudFJlb3JkZXJJbmZvLT5wZW5kaW5nRnJhbWVzQ291bnQgPSAwOworICAgICAgICAgfQorICAgICAgICAgKnZvc0RhdGFCdWZmID0gdm9zUGt0SWR4OworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgV0xBTlRMX09QQ09ERV9GV0RCVUZfRFJPUENVUjoKKyAgICAgICAgIHZvc1BrdElkeCA9IE5VTEw7CisgICAgICAgICBzdGF0dXMgPSBXTEFOVExfQ2hhaW5Gcm9udFBrdHModWNGd2RJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX09QQ09ERV9GV0RCVUZfRFJPUENVUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc1BrdElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVvcmRlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IpOworICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgeworICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIk1ha2UgY2hhaW4gd2l0aCBidWZmZXJlZCBmcmFtZSBmYWlsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cykpOworICAgICAgICAgICAgbG9ja1N0YXR1cyA9IHZvc19sb2NrX3JlbGVhc2UoJmN1cnJlbnRSZW9yZGVySW5mby0+cmVvcmRlckxvY2spOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhsb2NrU3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJXTEFOVExfTVNEVVJlb3JkZXIsIFJlbGVhc2UgTE9DSyBGYWlsIikpOworICAgICAgICAgICAgICAgcmV0dXJuIGxvY2tTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgfQorCisgICAgICAgICAvL1NpbmNlIEJBUiBmcmFtZSByZWNlaXZlZCwgc2V0IHRoZSBpbmRleCB0byB0aGUgcmlnaHQgbG9jYXRpb24KKyAgICAgICAgIGN1cnJlbnRSZW9yZGVySW5mby0+dWNDSW5kZXggPSB1Y0Z3ZElkeDsKKworICAgICAgICAgLyogQ3VycmVudCBmcmFtZSBoYXMgdG8gYmUgZHJvcHBlZCwgQkFSIGZyYW1lICovCisgICAgICAgICBzdGF0dXMgPSB2b3NfcGt0X3JldHVybl9wYWNrZXQoKnZvc0RhdGFCdWZmKTsKKyAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJEcm9wIEJBUiBmcmFtZSBmYWlsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cykpOworICAgICAgICAgICAgbG9ja1N0YXR1cyA9IHZvc19sb2NrX3JlbGVhc2UoJmN1cnJlbnRSZW9yZGVySW5mby0+cmVvcmRlckxvY2spOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhsb2NrU3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJXTEFOVExfTVNEVVJlb3JkZXIsIFJlbGVhc2UgTE9DSyBGYWlsIikpOworICAgICAgICAgICAgICAgcmV0dXJuIGxvY2tTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgfQorICAgICAgICAgKnZvc0RhdGFCdWZmID0gdm9zUGt0SWR4OworICAgICAgICAgYnJlYWs7CisgCisgICAgICBjYXNlIFdMQU5UTF9PUENPREVfRldEQUxMX0RST1BDVVI6CisgICAgICAgICB2b3NQa3RJZHggPSBOVUxMOworICAgICAgICAgc3RhdHVzID0gV0xBTlRMX0NoYWluRnJvbnRQa3RzKHVjRndkSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9PUENPREVfRldEQUxMX0RST1BDVVIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b3NQa3RJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlb3JkZXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiKTsKKyAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJNYWtlIGNoYWluIHdpdGggYnVmZmVyZWQgZnJhbWUgZmFpbCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpKTsKKyAgICAgICAgICAgIGxvY2tTdGF0dXMgPSB2b3NfbG9ja19yZWxlYXNlKCZjdXJyZW50UmVvcmRlckluZm8tPnJlb3JkZXJMb2NrKTsKKyAgICAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MobG9ja1N0YXR1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTlRMX01TRFVSZW9yZGVyLCBSZWxlYXNlIExPQ0sgRmFpbCIpKTsKKyAgICAgICAgICAgICAgIHJldHVybiBsb2NrU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgIH0KKworICAgICAgICAgLy9TaW5jZSBCQVIgZnJhbWUgcmVjZWl2ZWQgYW5kIGJleW9uZCBjdXIgd2luZG93LCBzZXQgdGhlIGluZGV4IHRvIHRoZSByaWdodCBsb2NhdGlvbgorICAgICAgICAgY3VycmVudFJlb3JkZXJJbmZvLT51Y0NJbmRleCA9IDA7CisKKyAgICAgICAgIHN0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldCgqdm9zRGF0YUJ1ZmYpOworICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgICAgeworICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkRyb3AgQkFSIGZyYW1lIGZhaWwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKSk7CisgICAgICAgICAgICBsb2NrU3RhdHVzID0gdm9zX2xvY2tfcmVsZWFzZSgmY3VycmVudFJlb3JkZXJJbmZvLT5yZW9yZGVyTG9jayk7CisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKGxvY2tTdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIldMQU5UTF9NU0RVUmVvcmRlciwgUmVsZWFzZSBMT0NLIEZhaWwiKSk7CisgICAgICAgICAgICAgICByZXR1cm4gbG9ja1N0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICB9CisKKyAgICAgICAgICp2b3NEYXRhQnVmZiA9IHZvc1BrdElkeDsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFdMQU5UTF9PUENPREVfRldEQUxMX1FDVVI6CisgICAgICAgICB2b3NQa3RJZHggPSBOVUxMOworICAgICAgICAgc3RhdHVzID0gV0xBTlRMX0NoYWluRnJvbnRQa3RzKGN1cnJlbnRSZW9yZGVySW5mby0+d2luU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfT1BDT0RFX0ZXREFMTF9EUk9QQ1VSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zUGt0SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZW9yZGVySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYik7CisgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICB7CisgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiTWFrZSBjaGFpbiB3aXRoIGJ1ZmZlcmVkIGZyYW1lIGZhaWwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKSk7CisgICAgICAgICAgICBsb2NrU3RhdHVzID0gdm9zX2xvY2tfcmVsZWFzZSgmY3VycmVudFJlb3JkZXJJbmZvLT5yZW9yZGVyTG9jayk7CisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKGxvY2tTdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIldMQU5UTF9NU0RVUmVvcmRlciwgUmVsZWFzZSBMT0NLIEZhaWwiKSk7CisgICAgICAgICAgICAgICByZXR1cm4gbG9ja1N0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICB9CisgICAgICAgICBzdGF0dXMgPSBXTEFOVExfUXVldWVDdXJyZW50KGN1cnJlbnRSZW9yZGVySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU2xvdElkeCk7CisjaWZkZWYgQU5JX0NISVBTRVRfVk9MQU5TCisgICAgICAgICAgIGlmKFZPU19UUlVFID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjSXNSZXBsYXlDaGVja1ZhbGlkKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBXTEFOVExfRmlsbFJlcGxheUNvdW50ZXIoY3VycmVudFJlb3JkZXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxscmVwbGF5Q291bnRlciwgdWNTbG90SWR4KTsKKyAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICAgICB7CisgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUSBDdXJyZW50IGZyYW1lIGZhaWwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKSk7CisgICAgICAgICAgICBsb2NrU3RhdHVzID0gdm9zX2xvY2tfcmVsZWFzZSgmY3VycmVudFJlb3JkZXJJbmZvLT5yZW9yZGVyTG9jayk7CisgICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKGxvY2tTdGF0dXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIldMQU5UTF9NU0RVUmVvcmRlciwgUmVsZWFzZSBMT0NLIEZhaWwiKSk7CisgICAgICAgICAgICAgICByZXR1cm4gbG9ja1N0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICB9CisgICAgICAgICBjdXJyZW50UmVvcmRlckluZm8tPnVjQ0luZGV4ID0gdWNTbG90SWR4OworICAgICAgICAgKnZvc0RhdGFCdWZmID0gdm9zUGt0SWR4OworICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgV0xBTlRMX09QQ09ERV9URUFSRE9XTjoKKyAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBwcm9jZWR1cmUgaW4gcGxhY2UgdG8gdGVhcmRvd24gQkE/CisKKyAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBkcm9wIHRoZSBjdXJyZW50IHBhY2tldAorICAgICAgY2FzZSBXTEFOVExfT1BDT0RFX0RST1BDVVI6CisgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoKnZvc0RhdGFCdWZmKTsKKyAgICAgICAgICp2b3NEYXRhQnVmZiA9IE5VTEw7CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGJyZWFrOworICAgfQorCisgICAvKiBDaGVjayB0aGUgYXZhaWxhYmxlIFZPUyBSWCBidWZmZXIgc2l6ZQorICAgICogSWYgcmVtYWluaW5nIFZPUyBSWCBidWZmZXIgaXMgdG9vIGZldywgaGF2ZSB0byBtYWtlIHNwYWNlCisgICAgKiBSb3V0ZSBhbGwgdGhlIFFlZCBmcmFtZXMgdXBwZXIgbGF5ZXIKKyAgICAqIE90aGVyd2lzZSwgUlggdGhyZWFkIGNvdWxkIGJlIHN0YWxsICovCisgICB2b3NfcGt0X2dldF9hdmFpbGFibGVfYnVmZmVyX3Bvb2woVk9TX1BLVF9UWVBFX1JYX1JBVywgJnJ4RnJlZSk7CisgICBpZihXTEFOVExfQkFfTUlOX0ZSRUVfUlhfVk9TX0JVRkZFUiA+IHJ4RnJlZSkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJSWCBGcmVlIiwgcnhGcmVlKSk7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUlggZnJlZSBidWZmZXIgY291bnQgaXMgdG9vIGxvdywgUGVuZGluZyBmcmFtZSBjb3VudCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICBjdXJyZW50UmVvcmRlckluZm8tPnBlbmRpbmdGcmFtZXNDb3VudCkpOworICAgICAgdm9zUGt0SWR4ID0gTlVMTDsKKyAgICAgIHN0YXR1cyA9IFdMQU5UTF9DaGFpbkZyb250UGt0cyh1Y0Z3ZElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfT1BDT0RFX0ZXREFMTF9EUk9QQ1VSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zUGt0SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZW9yZGVySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYik7CisgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICB7CisgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiTWFrZSBmcmFtZSBjaGFpbiBmYWlsICVkIiwgc3RhdHVzKSk7CisgICAgICAgICBsb2NrU3RhdHVzID0gdm9zX2xvY2tfcmVsZWFzZSgmY3VycmVudFJlb3JkZXJJbmZvLT5yZW9yZGVyTG9jayk7CisgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKGxvY2tTdGF0dXMpKQorICAgICAgICAgeworICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIldMQU5UTF9NU0RVUmVvcmRlciwgUmVsZWFzZSBMT0NLIEZhaWwiKSk7CisgICAgICAgICAgICByZXR1cm4gbG9ja1N0YXR1czsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisgICAgICBpZihOVUxMICE9ICp2b3NEYXRhQnVmZikKKyAgICAgIHsKKyAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCJBbHJlYWR5IHNvbWV0aGluZywgQ2hhaW4gaXQiKSk7CisgICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCgqdm9zRGF0YUJ1ZmYsIHZvc1BrdElkeCwgMSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAqdm9zRGF0YUJ1ZmYgPSB2b3NQa3RJZHg7CisgICAgICB9CisgICAgICBjdXJyZW50UmVvcmRlckluZm8tPnBlbmRpbmdGcmFtZXNDb3VudCA9IDA7CisgICB9CisKKyAgIC8qCisgICAgKiBDdXJyZW50IGFnaW5nIHRpbWVyIGxvZ2ljOgorICAgICogMSkgaWYgd2UgZm9yd2FyZGVkIGFueSBwYWNrZXRzIGFuZCB0aGUgdGltZXIgaXMgcnVubmluZzoKKyAgICAqICAgIHN0b3AgdGhlIHRpbWVyCisgICAgKiAyKSBpZiB0aGVyZSBhcmUgcGFja2V0cyBxdWV1ZWQgYW5kIHRoZSB0aW1lciBpcyBub3QgcnVubmluZzoKKyAgICAqICAgIHN0YXJ0IHRoZSB0aW1lcgorICAgICovCisgICB0aW1lclN0YXRlID0gdm9zX3RpbWVyX2dldEN1cnJlbnRTdGF0ZSgmY3VycmVudFJlb3JkZXJJbmZvLT5hZ2luZ1RpbWVyKTsKKyAgIGlmICgoVk9TX1RJTUVSX1NUQVRFX1JVTk5JTkcgPT0gdGltZXJTdGF0ZSkgJiYKKyAgICAgICAodWNDSW5kZXhPcmlnICE9IGN1cnJlbnRSZW9yZGVySW5mby0+dWNDSW5kZXgpKQorICAgeworICAgICAgVExMT0c0KFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csIkhPTEUgZmlsbGVkLCBQZW5kaW5nIEZyYW1lcyBDb3VudCAlZCIsCisgICAgICAgICAgICAgICAgIGN1cnJlbnRSZW9yZGVySW5mby0+cGVuZGluZ0ZyYW1lc0NvdW50KSk7CisKKyAgICAgIC8vIHdlIGZvcndhcmRlZCBzb21lIHBhY2tldHMgc28gc3RvcCBhZ2luZyB0aGUgY3VycmVudCBob2xlCisgICAgICB0aW1lclN0YXR1cyA9IHZvc190aW1lcl9zdG9wKCZjdXJyZW50UmVvcmRlckluZm8tPmFnaW5nVGltZXIpOworICAgICAgdGltZXJTdGF0ZSA9IFZPU19USU1FUl9TVEFURV9TVE9QUEVEOworCisgICAgICAvLyBpZ25vcmUgdGhlIHJldHVybmVkIHN0YXR1cyBzaW5jZSB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uCisgICAgICAvLyB3aGVyZWJ5IGJldHdlZW4gdGhlIHRpbWUgd2UgY2FsbGVkIGdldEN1cnJlbnRTdGF0ZSgpIGFuZCB0aGUKKyAgICAgIC8vIHRpbWUgd2UgY2FsbCBzdG9wKCkgdGhlIHRpbWVyIGNvdWxkIGhhdmUgZmlyZWQuICBJbiB0aGF0IGNhc2UKKyAgICAgIC8vIHN0b3AoKSB3aWxsIHJldHVybiBhbiBlcnJvciwgYnV0IHdlIGRvbid0IGNhcmUgc2luY2UgdGhlCisgICAgICAvLyB0aW1lciBoYXMgc3RvcHBlZAorICAgfQorCisgICBpZiAoY3VycmVudFJlb3JkZXJJbmZvLT5wZW5kaW5nRnJhbWVzQ291bnQgPiAwKQorICAgeworICAgICAgaWYgKFZPU19USU1FUl9TVEFURV9TVE9QUEVEID09IHRpbWVyU3RhdGUpCisgICAgICB7CisgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywiVGhlcmUgaXMgYSBuZXcgSE9MRSwgUGVuZGluZyBGcmFtZXMgQ291bnQgJWQiLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVvcmRlckluZm8tPnBlbmRpbmdGcmFtZXNDb3VudCkpOworICAgICAgICAgdGltZXJTdGF0dXMgPSB2b3NfdGltZXJfc3RhcnQoJmN1cnJlbnRSZW9yZGVySW5mby0+YWdpbmdUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9CQV9SRU9SREVSSU5HX0FHSU5HX1RJTUVSKTsKKyAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModGltZXJTdGF0dXMpKQorICAgICAgICAgeworICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIlRpbWVyIHN0YXJ0IGZhaWwiLCB0aW1lclN0YXR1cykpOworICAgICAgICAgICAgbG9ja1N0YXR1cyA9IHZvc19sb2NrX3JlbGVhc2UoJmN1cnJlbnRSZW9yZGVySW5mby0+cmVvcmRlckxvY2spOworICAgICAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhsb2NrU3RhdHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJXTEFOVExfTVNEVVJlb3JkZXIsIFJlbGVhc2UgTE9DSyBGYWlsIikpOworICAgICAgICAgICAgICAgcmV0dXJuIGxvY2tTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGltZXJTdGF0dXM7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvLyB3ZSBkaWRuJ3QgZm9yd2FyZCBhbnkgcGFja2V0cyBhbmQgdGhlIHRpbWVyIHdhcyBhbHJlYWR5CisgICAgICAgICAvLyBydW5uaW5nIHNvIHdlJ3JlIHN0aWxsIGFnaW5nIHRoZSBzYW1lIGhvbGUKKyAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCJTdGlsbCBIT0xFLCBQZW5kaW5nIEZyYW1lcyBDb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZW9yZGVySW5mby0+cGVuZGluZ0ZyYW1lc0NvdW50KSk7CisgICAgICB9CisgICB9CisKKyAgIGxvY2tTdGF0dXMgPSB2b3NfbG9ja19yZWxlYXNlKCZjdXJyZW50UmVvcmRlckluZm8tPnJlb3JkZXJMb2NrKTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MobG9ja1N0YXR1cykpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTlRMX01TRFVSZW9yZGVyLCBSZWxlYXNlIExPQ0sgRmFpbCIpKTsKKyAgICAgIHJldHVybiBsb2NrU3RhdHVzOworICAgfQorICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30vKiBXTEFOVExfTVNEVVJlb3JkZXIgKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFV0aWxpdHkgZnVuY3Rpb25zIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfUXVldWVDdXJyZW50CisKKyAgREVTQ1JJUFRJT04gCisgICAgSXQgd2lsbCBxdWV1ZSBhIHBhY2tldCBhdCBhIGdpdmVuIHNsb3QgaW5kZXggaW4gdGhlIE1TRFUgcmVvcmRlcmluZyBsaXN0LiAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwd0JhUmVvcmRlcjogICBwb2ludGVyIHRvIHRoZSBCQSByZW9yZGVyaW5nIHNlc3Npb24gaW5mbyAKKyAgICB2b3NEYXRhQnVmZjogICBkYXRhIGJ1ZmZlciB0byBiZSBxdWV1ZWQKKyAgICB1Y1Nsb3RJbmRleDogICBzbG90IGluZGV4IAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICAgIEV2ZXJ5dGhpbmcgaXMgT0sKKworICAgIAorICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9RdWV1ZUN1cnJlbnQKKygKKyAgIFdMQU5UTF9CQVJlb3JkZXJUeXBlKiAgcHdCYVJlb3JkZXIsCisgICB2b3NfcGt0X3QqKiAgICAgICAgICAgIHZvc0RhdGFCdWZmLAorICAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y1Nsb3RJbmRleAorKQoreworICAgVk9TX1NUQVRVUyAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICBUTExPRzQoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywidm9zIFBhY2tldCBoYXMgdG8gYmUgUWVkIDB4JXAiLAorICAgICAgICAgICAgICAgKnZvc0RhdGFCdWZmKSk7CisgICBpZihOVUxMICE9IHB3QmFSZW9yZGVyLT5yZW9yZGVyQnVmZmVyLT5hcnJheUJ1ZmZlclt1Y1Nsb3RJbmRleF0pCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiT25lIEN5Y2xlIHJvdW5kZWQsIGxvc3QgbWFueSBmcmFtZXMgYWxyZWFkeSwgbm90IGluIFEgJWRcbiIsCisgICAgICAgICAgICAgICAgICBwd0JhUmVvcmRlci0+cGVuZGluZ0ZyYW1lc0NvdW50KSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX1JFU09VUkNFUzsKKyAgIH0KKworICAgcHdCYVJlb3JkZXItPnJlb3JkZXJCdWZmZXItPmFycmF5QnVmZmVyW3VjU2xvdEluZGV4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkoKnZvc0RhdGFCdWZmKTsKKyAgIHB3QmFSZW9yZGVyLT5wZW5kaW5nRnJhbWVzQ291bnQrKzsKKyAgIFRMTE9HNChWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCJBc3NpZ25lZCwgUGVuZGluZyBGcmFtZXMgJWQgYXQgc2xvdCAlZCwgZGF0YVB0ciAweCV4IiwKKyAgICAgICAgICAgICAgIHB3QmFSZW9yZGVyLT5wZW5kaW5nRnJhbWVzQ291bnQsCisgICAgICAgICAgICAgICB1Y1Nsb3RJbmRleCwKKyAgICAgICAgICAgICAgIHB3QmFSZW9yZGVyLT5yZW9yZGVyQnVmZmVyLT5hcnJheUJ1ZmZlclt1Y1Nsb3RJbmRleF0pKTsKKworICAgcmV0dXJuIHN0YXR1czsKK30vKldMQU5UTF9RdWV1ZUN1cnJlbnQqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0NoYWluRnJvbnRQa3RzCisKKyAgREVTQ1JJUFRJT04gCisgICAgSXQgd2lsbCByZW1vdmUgYWxsIHRoZSBwYWNrZXRzIGZyb20gdGhlIGZyb250IG9mIGEgdm9zIGxpc3QgYW5kIGNoYWluIAorICAgIHRoZW0gdG8gYSB2b3MgcGt0IC4gCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgdWNDb3VudDogICAgICAgbnVtYmVyIG9mIHBhY2tldHMgdG8gZXh0cmFjdAorICAgIHB3QmFSZW9yZGVyOiAgIHBvaW50ZXIgdG8gdGhlIEJBIHJlb3JkZXJpbmcgc2Vzc2lvbiBpbmZvIAorCisgICAgT1VUCisgICAgdm9zRGF0YUJ1ZmY6ICAgZGF0YSBidWZmZXIgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIGNoYWluIG9mIHBhY2tldHMKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgICBFdmVyeXRoaW5nIGlzIE9LCisKKyAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfQ2hhaW5Gcm9udFBrdHMKKyggCisgICB2X1UzMl90ICAgICAgICAgICAgICAgIGZ3ZEluZGV4LAorICAgdl9VOF90ICAgICAgICAgICAgICAgICBvcENvZGUsCisgICB2b3NfcGt0X3QgICAgICAgICAgICAgICoqdm9zRGF0YUJ1ZmYsCisgICBXTEFOVExfQkFSZW9yZGVyVHlwZSAgICpwd0JhUmVvcmRlciwKKyAgIFdMQU5UTF9DYlR5cGUgICAgICAgICAgKnBUTENiCispCit7CisgICBWT1NfU1RBVFVTICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZfVTMyX3QgICAgICAgICAgICAgaWR4OyAKKyAgIHZfUFZPSURfdCAgICAgICAgICAgY3VycmVudERhdGFQdHIgPSBOVUxMOworICAgaW50ICAgICAgICAgICAgICAgICBuZWdEZXRlY3Q7CisjaWZkZWYgV0xBTlRMX1JFT1JERVJfREVCVUdfTVNHX0VOQUJMRQorI2RlZmluZSBXTEFOVExfT1VUX09GX1dJTkRPV19JRFggICAgNjUKKyAgIHZfVTMyX3QgZnJhbWVJZHhbMl0gPSB7MCwgMH0sIGZmaWR4ID0gZndkSW5kZXgsIGlkeDIgPSBXTEFOVExfT1VUX09GX1dJTkRPV19JRFg7CisgICBpbnQgcGVuZGluZyA9IHB3QmFSZW9yZGVyLT5wZW5kaW5nRnJhbWVzQ291bnQsIHN0YXJ0ID0gV0xBTlRMX09VVF9PRl9XSU5ET1dfSURYLCBlbmQ7CisjZW5kaWYKKworICAgaWYocHdCYVJlb3JkZXItPnVjQ0luZGV4ID49IGZ3ZEluZGV4KQorICAgeworICAgICAgZndkSW5kZXggKz0gcHdCYVJlb3JkZXItPndpblNpemU7CisgICB9CisKKyAgIGlmKChXTEFOVExfT1BDT0RFX0ZXREFMTF9EUk9QQ1VSID09IG9wQ29kZSkgfHwKKyAgICAgIChXTEFOVExfT1BDT0RFX0ZXREFMTF9RQ1VSID09IG9wQ29kZSkpCisgICB7CisgICAgICBmd2RJbmRleCA9IHB3QmFSZW9yZGVyLT51Y0NJbmRleCArIHB3QmFSZW9yZGVyLT53aW5TaXplOworICAgfQorCisgICBUTExPRzQoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywiQ3VycmVudCBJbmRleCAlZCwgRldEIEluZGV4ICVkLCByZW9yZGVyQnVmZmVyIDB4JXAiLAorICAgICAgICAgICAgICAgcHdCYVJlb3JkZXItPnVjQ0luZGV4ICUgcHdCYVJlb3JkZXItPndpblNpemUsCisgICAgICAgICAgICAgICBmd2RJbmRleCAlIHB3QmFSZW9yZGVyLT53aW5TaXplLAorICAgICAgICAgICAgICAgcHdCYVJlb3JkZXItPnJlb3JkZXJCdWZmZXIpKTsKKworICAgbmVnRGV0ZWN0ID0gcHdCYVJlb3JkZXItPnBlbmRpbmdGcmFtZXNDb3VudDsKKyAgIGZvcihpZHggPSBwd0JhUmVvcmRlci0+dWNDSW5kZXg7IGlkeCA8PSBmd2RJbmRleDsgaWR4KyspCisgICB7CisgICAgICBjdXJyZW50RGF0YVB0ciA9IAorICAgICAgcHdCYVJlb3JkZXItPnJlb3JkZXJCdWZmZXItPmFycmF5QnVmZmVyW2lkeCAlIHB3QmFSZW9yZGVyLT53aW5TaXplXTsKKyAgICAgIGlmKE5VTEwgIT0gY3VycmVudERhdGFQdHIpCisgICAgICB7CisjaWZkZWYgV0xBTlRMX1JFT1JERVJfREVCVUdfTVNHX0VOQUJMRQorICAgICAgICAgaWR4MiA9IChpZHggPj0gIHB3QmFSZW9yZGVyLT53aW5TaXplKSA/IChpZHggLSAgcHdCYVJlb3JkZXItPndpblNpemUpIDogaWR4OworICAgICAgICAgZnJhbWVJZHhbaWR4MiAvIDMyXSB8PSAxIDw8IChpZHgyICUgMzIpOworICAgICAgICAgaWYoc3RhcnQgPT0gV0xBTlRMX09VVF9PRl9XSU5ET1dfSURYKSBzdGFydCA9IGlkeDI7CisjZW5kaWYKKyAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCJUaGVyZSBpcyBidWZmZXJlZCBmcmFtZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICBpZHggJSBwd0JhUmVvcmRlci0+d2luU2l6ZSkpOworICAgICAgICAgaWYoTlVMTCA9PSAqdm9zRGF0YUJ1ZmYpCisgICAgICAgICB7CisgICAgICAgICAgICAqdm9zRGF0YUJ1ZmYgPSAodm9zX3BrdF90ICopY3VycmVudERhdGFQdHI7CisgICAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywiVGhpcyBpcyBuZXcgaGVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZHggJSBwd0JhUmVvcmRlci0+d2luU2l6ZSkpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csIlRoZXJlIGlzIGJ1ZmVyZWQgSnVzdCBhZGQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgaWR4ICUgcHdCYVJlb3JkZXItPndpblNpemUpKTsKKyAgICAgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCp2b3NEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b3NfcGt0X3QgKiljdXJyZW50RGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19UUlVFKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHB3QmFSZW9yZGVyLT5yZW9yZGVyQnVmZmVyLT5hcnJheUJ1ZmZlcltpZHggICUgcHdCYVJlb3JkZXItPndpblNpemVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgIHB3QmFSZW9yZGVyLT5wZW5kaW5nRnJhbWVzQ291bnQtLTsKKyAgICAgICAgIG5lZ0RldGVjdC0tOworICAgICAgICAgaWYobmVnRGV0ZWN0IDwgMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJUaGlzIGlzIG5vdCBwb3NzaWJsZSwgc29tZSBiYWxhbmNlIGhhcyBwcm9ibGVtXG4iKSk7CisgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgICAgIH0KKyAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCJTbG90IEluZGV4ICVkLCBzZXQgYXMgTlVMTCwgUGVuZGluZyBGcmFtZXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgaWR4ICAlIHB3QmFSZW9yZGVyLT53aW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgcHdCYVJlb3JkZXItPnBlbmRpbmdGcmFtZXNDb3VudAorICAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICBwd0JhUmVvcmRlci0+dWNDSW5kZXggPSAoaWR4ICsgMSkgJSBwd0JhUmVvcmRlci0+d2luU2l6ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLCJFbXB0eSBBcnJheSAlZCIsCisgICAgICAgICAgICAgICAgICAgICBpZHggJSBwd0JhUmVvcmRlci0+d2luU2l6ZSkpOworICAgICAgfQorICAgICAgVExMT0c0KFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csIkN1cnJlbnQgSW5kZXggJWQsIHdpblNpemUgJWQiLAorICAgICAgICAgICAgICAgICAgcHdCYVJlb3JkZXItPnVjQ0luZGV4LAorICAgICAgICAgICAgICAgICAgcHdCYVJlb3JkZXItPndpblNpemUKKyAgICAgICAgICAgICAgICAgICkpOworICAgfQorCisjaWZkZWYgV0xBTlRMX1JFT1JERVJfREVCVUdfTVNHX0VOQUJMRQorICAgZW5kID0gaWR4MjsKKworICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkZ3ZCAweCUwOFgtJTA4WCBvcENvZGUgJWQgZndkSWR4ICVkIHdpbmRvd1NpemUgJWQgcGVuZGluZyBmcmFtZSAlZCBmdyBuby4gJWQgZnJvbSBpZHggJWQgdG8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgZnJhbWVJZHhbMV0sIGZyYW1lSWR4WzBdLCBvcENvZGUsIGZmaWR4LCBwd0JhUmVvcmRlci0+d2luU2l6ZSwgcGVuZGluZywgcGVuZGluZyAtIG5lZ0RldGVjdCwgc3RhcnQsIGVuZCkpOworI2VuZGlmCisKKyAgIHJldHVybiBzdGF0dXM7IAorfS8qV0xBTlRMX0NoYWluRnJvbnRQa3RzKi8KKyNpZmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0ZpbGxSZXBsYXlDb3VudGVyCisgCisgIERFU0NSSVBUSU9OIAorICAgIEl0IHdpbGwgZmlsbCByZXBhbHkgY291bnRlciBhdCBhIGdpdmVuIHNsb3QgaW5kZXggaW4gdGhlIE1TRFUgcmVvcmRlcmluZyBsaXN0LiAKKyAgICAgICAgICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgICAgICAgICAgICAgICAgIAorICBQQVJBTUVURVJTIAorCisgIElOCisgICAgICBwd0JhUmVvcmRlciAgOiAgIHBvaW50ZXIgdG8gdGhlIEJBIHJlb3JkZXJpbmcgc2Vzc2lvbiBpbmZvIAorICAgICAgcmVwbGF5Q291bnRlcjogICByZXBsYXkgY291bnRlciB0byBiZSBmaWxsZWQKKyAgICAgIHVjU2xvdEluZGV4ICA6ICAgc2xvdCBpbmRleCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFJFVFVSTiBWQUxVRQorICAgICBOT05FIAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFNJREUgRUZGRUNUUyAKKyAgICAgTk9ORQorICAgICAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgV0xBTlRMX0ZpbGxSZXBsYXlDb3VudGVyCisoCisgICBXTEFOVExfQkFSZW9yZGVyVHlwZSogIHB3QmFSZW9yZGVyLAorICAgdl9VNjRfdCAgICAgICAgICAgICAgICB1bGxyZXBsYXlDb3VudGVyLAorICAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y1Nsb3RJbmRleAorKQoreworCisgICAvL0JBTVNHREVCVUcoInJlcGxheSBjb3VudGVyIHRvIGJlIGZpbGxlZCBpbiBRZWQgZnJhbWVzICVsbHUiLAorICAgICAgICAgICAgICAgLy9yZXBsYXlDb3VudGVyLCAwLCAwKTsKKworICAgcHdCYVJlb3JkZXItPnJlb3JkZXJCdWZmZXItPnVsbFJlcGxheUNvdW50ZXJbdWNTbG90SW5kZXhdID0gdWxscmVwbGF5Q291bnRlcjsKKyAgIC8vQkFNU0dERUJVRygiQXNzaWduZWQsIHJlcGxheSBjb3VudGVyIFBlbmRpbmcgRnJhbWVzICVkIGF0IHNsb3QgJWQsIHJlcGxheSBjb3VudGVyWzB4JWxsWF1cbiIsCisgICAgICAgICAgICAgICAvL3B3QmFSZW9yZGVyLT5wZW5kaW5nRnJhbWVzQ291bnQsCisgICAgICAgICAgICAgICAvL3VjU2xvdEluZGV4LAorICAgICAgICAgICAgICAgLy9wd0JhUmVvcmRlci0+cmVvcmRlckJ1ZmZlci0+dWxsUmVwbGF5Q291bnRlcik7CisgICByZXR1cm47Cit9LypXTEFOVExfRmlsbFJlcGxheUNvdW50ZXIqLworI2VuZGlmIC8qRW5kIG9mICNpZmRlZiBXTEFOVExfSEFMX1ZPTEFOUyovCisKZGlmZiAtLWdpdCBhL0NPUkUvVEwvc3JjL3dsYW5fcWN0X3RsX2hvc3VwcG9ydC5jIGIvQ09SRS9UTC9zcmMvd2xhbl9xY3RfdGxfaG9zdXBwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4MDk4NAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVEwvc3JjL3dsYW5fcWN0X3RsX2hvc3VwcG9ydC5jCkBAIC0wLDAgKzEsMTc5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgVyBMIEEgTiBfIFEgQyBUIF8gVCBMIF8gSE9TVVBQT1JULiBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBPVkVSVklFVzoKKyAgCisgIERFUEVOREVOQ0lFUzogCisKKyAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuIAorICAKKyAgCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgICRIZWFkZXIkJERhdGVUaW1lJCRBdXRob3IkCisKKworICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMi8xOS8wOSAgICAgIGx0aSAgICAgVm9zIHRyYWNlIGZpeAorMDIvMDYvMDkgICAgICBzY2ggICAgIERlcmVnIEJ1ZyBmaXgKKzEyLzExLzA4ICAgICAgc2NoICAgICBJbml0aWFsIGNyZWF0aW9uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSAid2xhbl9xY3RfdGwuaCIgCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ3bGFuX3FjdF90bF9ob3N1cHBvcnQuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF90bGkuaCIKKyNpbmNsdWRlICJ0bERlYnVnLmgiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vI2RlZmluZSBXTEFOVExfSE9fREVCVUdfTVNHCisvLyNkZWZpbmUgV0xBTlRMX0hPX1VURVNUCisKKyNkZWZpbmUgV0xBTlRMX0hPX0RFRkFVTFRfUlNTSSAgICAgIDB4RkYKKyNkZWZpbmUgV0xBTlRMX0hPX0RFRkFVTFRfQUxQSEEgICAgIDUKKyNkZWZpbmUgV0xBTlRMX0hPX0lOVkFMSURfUlNTSSAgICAgIC0xMDAKKy8qIFJTU0kgc2FtcGxpbmcgcGVyaW9kLCB1c2VjIGJhc2VkCisgKiBUbyByZWR1Y2UgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQKKyAqIEN1cnJlbnQgZGVmYXVsdCA1MDBtc2VjICovCisjZGVmaW5lIFdMQU5UTF9IT19TQU1QTElOR19QRVJJT0QgICA1MDAwMDAKKworCisKKy8qIEdldCBhbmQgcmVsZWFzZSBsb2NrICovCisjZGVmaW5lIFRIU0dFVExPQ0soYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX2xvY2tfYWNxdWlyZShiKSkpICAgIFwKKyAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXMgR2V0IExvY2sgRmFpbCIsIGEpKTsgICAgICBcCisgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9d2hpbGUoMCkKKworI2RlZmluZSBUSFNSRUxFQVNFTE9DSyhhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19sb2NrX3JlbGVhc2UoYikpKSAgICBcCisgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzIFJlbGVhc2UgTG9jayBGYWlsIiwgYSkpOyAgXAorICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfXdoaWxlKDApCisKK2NvbnN0IHZfVThfdCAgV0xBTlRMX0hPX1RJRF8yX0FDW1dMQU5fTUFYX1RJRF0gPSB7V0xBTlRMX0FDX0JFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDX0JLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQUNfQkssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQUNfQkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ19WSSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9BQ19WSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0FDX1ZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfQUNfVk99OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVGVtcG9yYXJ5IHRocmVzaG9sZCBzdG9yZSBwbGFjZSBmb3IgQk1QUyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZfUzdfdCAgcnNzaTsKKyAgIHZfVThfdCAgZXZlbnQ7Cit9IFdMQU5UTF9IU1RlbXBQU0luZFR5cGU7CisKKyNpZmRlZiBSU1NJX0hBQ0sKKy8qIFRoaXMgaXMgYSBkdW1teSBhdmVyYWdlZCBSU1NJIHZhbHVlIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgZHVtcCBjb21tYW5kcyAKKyAqIHRvIHRyaWdnZXIgVEwgdG8gaXNzdWUgaGFuZG9mZiByZWxhdGVkIGV2ZW50cy4gV2Ugd2lsbCBiZSB1c2luZyBkdW1wIDM2MiA8YXZlcmFnZSBSU1NJPiAKKyAqIHZhbHVlIHRvIGNoYW5nZSBpdHMgdmFsdWUgKi8KK2ludCAgZHVtcENtZFJTU0kgPSAtNDg7CisjZW5kaWYKKworI2lmZGVmIFdMQU5UTF9IT19VVEVTVAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2X1M3X3QgICByc3NpOworc3RhdGljIHZfUzdfdCAgIGRpcmVjdGlvbjsKK3ZvaWQgVExIU19VdGVzdEhhbmRsZU5ld1JTU0kodl9TN190ICpuZXdSU1NJLCB2X1BWT0lEX3QgcEFkYXB0ZXIpCit7CisgICBpZigwID09IHJzc2kpCisgICB7CisgICAgICBkaXJlY3Rpb24gPSAtMTsKKyAgIH0KKyAgIGVsc2UgaWYoLTkwID09IHJzc2kpCisgICB7CisgICAgICBkaXJlY3Rpb24gPSAxOworICAgfQorCisgICAqbmV3UlNTSSA9IHJzc2k7CisgICByc3NpICs9IGRpcmVjdGlvbjsKKworICAgcmV0dXJuOworfQorI2VuZGlmIC8qIFdMQU5UTF9IT19VVEVTVCAqLworCisjaWZkZWYgV0xBTlRMX0hPX0RFQlVHX01TRworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgV0xBTlRMX1N0YXREZWJ1Z0Rpc3BsYXkKKygKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgU1RBaWQsCisgICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MKKykKK3sKKyAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKSk7CisgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJTdGF0aXN0aWNzIGZvciBTVEEgJWQiLCBTVEFpZCkpOworICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiUlggVUMgRmNudCAlNWQsIE1DIEZjbnQgJTVkLCBCQyBGY250ICU1ZCIsCisgICAgICAgICAgICAgICAgc3RhdGlzdGljcy0+cnhVQ0ZjbnQsIHN0YXRpc3RpY3MtPnJ4TUNGY250LCBzdGF0aXN0aWNzLT5yeEJDRmNudCkpOworICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiUlggVUMgQmNudCAlNWQsIE1DIEJjbnQgJTVkLCBCQyBCY250ICU1ZCIsCisgICAgICAgICAgICAgICAgc3RhdGlzdGljcy0+cnhVQ0JjbnQsIHN0YXRpc3RpY3MtPnJ4TUNCY250LCBzdGF0aXN0aWNzLT5yeEJDQmNudCkpOworICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiVFggVUMgRmNudCAlNWQsIE1DIEZjbnQgJTVkLCBCQyBGY250ICU1ZCIsCisgICAgICAgICAgICAgICAgc3RhdGlzdGljcy0+dHhVQ0ZjbnQsIHN0YXRpc3RpY3MtPnR4TUNGY250LCBzdGF0aXN0aWNzLT50eEJDRmNudCkpOworICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiVFggVUMgQmNudCAlNWQsIE1DIEJjbnQgJTVkLCBCQyBCY250ICU1ZCIsCisgICAgICAgICAgICAgICAgc3RhdGlzdGljcy0+dHhVQ0JjbnQsIHN0YXRpc3RpY3MtPnR4TUNCY250LCBzdGF0aXN0aWNzLT50eEJDQmNudCkpOworICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiVFJYIEJjbnQgJTVkLCBDUkNPSyBCY250ICU1ZCwgUlhSYXRlICU1ZCIsCisgICAgICAgICAgICAgICAgc3RhdGlzdGljcy0+cnhCY250LCBzdGF0aXN0aWNzLT5yeEJjbnRDUkNvaywgc3RhdGlzdGljcy0+cnhSYXRlKSk7CisgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikpOworICAgcmV0dXJuOworfQorI2VuZGlmIC8qIFdMQU5UTF9IT19ERUJVR19NU0cgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgV0xBTlRMX0hTRGVidWdEaXNwbGF5CisoCisgICB2X1BWT0lEX3QgcEFkYXB0ZXIKKykKK3sKKyAgIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAgICAgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgc0lkeDsKKyAgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uRm91bmQgPSBWT1NfRkFMU0U7CisgICBXTEFOVExfQ1VSUkVOVF9IT19TVEFURV9UWVBFICAgKmN1cnJlbnRITzsKKyAgIFdMQU5UTF9IT19TVVBQT1JUX1RZUEUgICAgICAgICAqaG9TdXBwb3J0OworCisgICBpZiAoTlVMTCA9PSB0bEN0eHQpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFRMIENvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgY3VycmVudEhPID0gJih0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50SE9TdGF0ZSk7CisgICBob1N1cHBvcnQgPSAmKHRsQ3R4dC0+aG9TdXBwb3J0KTsKKworCisgICBmb3IoaWR4ID0gMDsgaWR4IDwgY3VycmVudEhPLT5udW1UaHJlc2hvbGQ7IGlkeCsrKQorICAgeworICAgICAgaWYoaWR4ID09IGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyKQorICAgICAgeworICAgICAgICAgcmVnaW9uRm91bmQgPSBWT1NfVFJVRTsKKyAgICAgICAgIGlmKFZPU19UUlVFID09IHRsQ3R4dC0+aXNCTVBTKQorICAgICAgICAgeworICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiIC0tLS0+IENSZWdpb24gJWQsIGhSU1NJOk5BLCBCTVBTLCBBbHBoYSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEhPLT5yZWdpb25OdW1iZXIsIGN1cnJlbnRITy0+YWxwaGEpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIiAtLS0tPiBDUmVnaW9uICVkLCBoUlNTSSAlZCwgQWxwaGEgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRITy0+aGlzdG9yeVJTU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEhPLT5hbHBoYSkpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yKHNJZHggPSAwOyBzSWR4IDwgV0xBTlRMX0hTX05VTV9DTElFTlQ7IHNJZHgrKykKKyAgICAgIHsKKyAgICAgICAgIGlmKE5VTEwgIT0gaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0uY3Jvc3NDQkZ1bmN0aW9uW3NJZHhdKQorICAgICAgICAgeworICAgICAgICAgICAgaWYoVk9TX01PRFVMRV9JRF9IREQgPT0gaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0ud2hvSXNDbGllbnRbc0lkeF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJDbGllbnQgSEREIHBDQiAlcCwgdHJpZ2dlckV2dCAlZCwgUlNTSSAlZCIsCisgICAgICAgICAgICAgICAgICAgaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0uY3Jvc3NDQkZ1bmN0aW9uW3NJZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS50cmlnZ2VyRXZlbnRbc0lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLnJzc2lWYWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiQ2xpZW50IFNNRSBwQ0IgJXAsIHRyaWdnZXJFdnQgJWQsIFJTU0kgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS5jcm9zc0NCRnVuY3Rpb25bc0lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLnRyaWdnZXJFdmVudFtzSWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0ucnNzaVZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIGlmKFZPU19GQUxTRSA9PSByZWdpb25Gb3VuZCkKKyAgIHsKKyAgICAgIGlmKFZPU19UUlVFID09IHRsQ3R4dC0+aXNCTVBTKQorICAgICAgeworICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiAtLS0tPiBDUmVnaW9uICVkLCBoUlNTSTpOQSwgQk1QUywgQWxwaGEgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyLCBjdXJyZW50SE8tPmFscGhhKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiIC0tLS0+IENSZWdpb24gJWQsIGhSU1NJICVkLCBBbHBoYSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEhPLT5yZWdpb25OdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEhPLT5oaXN0b3J5UlNTSSwKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SE8tPmFscGhhKSk7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX1NldEZXUlNTSVRocmVzaG9sZHMKKygKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIKKykKK3sKKyAgIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAgICAgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CisgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIFdMQU5UTF9IT19TVVBQT1JUX1RZUEUgICAgICAgICAqaG9TdXBwb3J0OworICAgV0xBTlRMX0NVUlJFTlRfSE9fU1RBVEVfVFlQRSAgICpjdXJyZW50SE87CisgICB0U2lyUlNTSVRocmVzaG9sZHMgICAgICAgICAgICAgIGJtcHNUaHJlc2hvbGRzOworICAgV0xBTlRMX0hTVGVtcFBTSW5kVHlwZSAgICAgICAgICB0ZW1wSW5kU2V0W1dMQU5UTF9TSU5HTEVfQ0xOVF9USFJFU0hPTERdOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICBibXBzTG9vcDsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wc0luZDsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50TG9vcDsKKworICAgaWYoTlVMTCA9PSB0bEN0eHQpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSW52YWxpZCBUTCBoYW5kbGUiKSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBXTEFOVExfSFNEZWJ1Z0Rpc3BsYXkocEFkYXB0ZXIpOworICAgY3VycmVudEhPID0gJih0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50SE9TdGF0ZSk7CisgICBob1N1cHBvcnQgPSAmKHRsQ3R4dC0+aG9TdXBwb3J0KTsKKworICAgbWVtc2V0KCh2X1U4X3QgKikmdGVtcEluZFNldFswXSwgMCwgV0xBTlRMX1NJTkdMRV9DTE5UX1RIUkVTSE9MRCAqIHNpemVvZihXTEFOVExfSFNUZW1wUFNJbmRUeXBlKSk7CisgICBtZW1zZXQoJmJtcHNUaHJlc2hvbGRzLCAwLCBzaXplb2YodFNpclJTU0lUaHJlc2hvbGRzKSk7CisKKyAgIGJtcHNJbmQgPSAwOworICAgZm9yKGJtcHNMb29wID0gMDsgYm1wc0xvb3AgPCBXTEFOVExfTUFYX0FWQUlMX1RIUkVTSE9MRDsgYm1wc0xvb3ArKykKKyAgIHsKKyAgICAgIGZvcihjbGllbnRMb29wID0gMDsgY2xpZW50TG9vcCA8IFdMQU5UTF9IU19OVU1fQ0xJRU5UOyBjbGllbnRMb29wKyspCisgICAgICB7CisgICAgICAgICBpZigwICE9IGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtibXBzTG9vcF0udHJpZ2dlckV2ZW50W2NsaWVudExvb3BdKQorICAgICAgICAgeworICAgICAgICAgICAgaWYoYm1wc0luZCA9PSBXTEFOVExfU0lOR0xFX0NMTlRfVEhSRVNIT0xEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIlNpbmdsZSBDbGllbnQgVGhyZXNob2xkIHNob3VsZCBiZSBsZXNzIHRoYW4gJWQiLCBXTEFOVExfU0lOR0xFX0NMTlRfVEhSRVNIT0xEKSk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRlbXBJbmRTZXRbYm1wc0luZF0ucnNzaSAgPSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbYm1wc0xvb3BdLnJzc2lWYWx1ZTsKKyAgICAgICAgICAgIHRlbXBJbmRTZXRbYm1wc0luZF0uZXZlbnQgPSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbYm1wc0xvb3BdLnRyaWdnZXJFdmVudFtjbGllbnRMb29wXTsKKyAgICAgICAgICAgIGJtcHNJbmQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBibXBzVGhyZXNob2xkcy51Y1Jzc2lUaHJlc2hvbGQxID0gdGVtcEluZFNldFswXS5yc3NpOworICAgaWYoKFdMQU5UTF9IT19USFJFU0hPTERfRE9XTiA9PSB0ZW1wSW5kU2V0WzBdLmV2ZW50KSB8fAorICAgICAgKFdMQU5UTF9IT19USFJFU0hPTERfQ1JPU1MgPT0gdGVtcEluZFNldFswXS5ldmVudCkpCisgICB7CisgICAgICBibXBzVGhyZXNob2xkcy5iUnNzaVRocmVzMU5lZ05vdGlmeSA9IDE7CisgICB9CisgICBpZigoV0xBTlRMX0hPX1RIUkVTSE9MRF9VUCA9PSB0ZW1wSW5kU2V0WzBdLmV2ZW50KSB8fAorICAgICAgKFdMQU5UTF9IT19USFJFU0hPTERfQ1JPU1MgPT0gdGVtcEluZFNldFswXS5ldmVudCkpCisgICB7CisgICAgICBibXBzVGhyZXNob2xkcy5iUnNzaVRocmVzMVBvc05vdGlmeSA9IDE7CisgICB9CisKKyAgIGJtcHNUaHJlc2hvbGRzLnVjUnNzaVRocmVzaG9sZDIgPSB0ZW1wSW5kU2V0WzFdLnJzc2k7CisgICBpZigoV0xBTlRMX0hPX1RIUkVTSE9MRF9ET1dOID09IHRlbXBJbmRTZXRbMV0uZXZlbnQpIHx8CisgICAgICAoV0xBTlRMX0hPX1RIUkVTSE9MRF9DUk9TUyA9PSB0ZW1wSW5kU2V0WzFdLmV2ZW50KSkKKyAgIHsKKyAgICAgIGJtcHNUaHJlc2hvbGRzLmJSc3NpVGhyZXMyTmVnTm90aWZ5ID0gMTsKKyAgIH0KKyAgIGlmKChXTEFOVExfSE9fVEhSRVNIT0xEX1VQID09IHRlbXBJbmRTZXRbMV0uZXZlbnQpIHx8CisgICAgICAoV0xBTlRMX0hPX1RIUkVTSE9MRF9DUk9TUyA9PSB0ZW1wSW5kU2V0WzFdLmV2ZW50KSkKKyAgIHsKKyAgICAgIGJtcHNUaHJlc2hvbGRzLmJSc3NpVGhyZXMyUG9zTm90aWZ5ID0gMTsKKyAgIH0KKworICAgYm1wc1RocmVzaG9sZHMudWNSc3NpVGhyZXNob2xkMyA9IHRlbXBJbmRTZXRbMl0ucnNzaTsKKyAgIGlmKChXTEFOVExfSE9fVEhSRVNIT0xEX0RPV04gPT0gdGVtcEluZFNldFsyXS5ldmVudCkgfHwKKyAgICAgIChXTEFOVExfSE9fVEhSRVNIT0xEX0NST1NTID09IHRlbXBJbmRTZXRbMl0uZXZlbnQpKQorICAgeworICAgICAgYm1wc1RocmVzaG9sZHMuYlJzc2lUaHJlczNOZWdOb3RpZnkgPSAxOworICAgfQorICAgaWYoKFdMQU5UTF9IT19USFJFU0hPTERfVVAgPT0gdGVtcEluZFNldFsyXS5ldmVudCkgfHwKKyAgICAgIChXTEFOVExfSE9fVEhSRVNIT0xEX0NST1NTID09IHRlbXBJbmRTZXRbMl0uZXZlbnQpKQorICAgeworICAgICAgYm1wc1RocmVzaG9sZHMuYlJzc2lUaHJlczNQb3NOb3RpZnkgPSAxOworICAgfQorCisgICBXREFfU2V0UlNTSVRocmVzaG9sZHMoaG9TdXBwb3J0LT5tYWNDdHh0LCAmYm1wc1RocmVzaG9sZHMpOworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX1N0YXRIYW5kbGVSWEZyYW1lCisoCisgICB2X1BWT0lEX3QgICAgICAgIHBBZGFwdGVyLAorICAgdl9QVk9JRF90ICAgICAgICBwQkRIZWFkZXIsCisgICB2X1U4X3QgICAgICAgICAgIFNUQWlkLAorICAgdl9CT09MX3QgICAgICAgICBpc0Jyb2FkY2FzdCwKKyAgIHZvc19wa3RfdCAgICAgICAqZGF0YUJ1ZmZlciAgIAorKQoreworICAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKKyAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzOworICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplOworCisgICBpZihOVUxMID09IHRsQ3R4dCkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJJbnZhbGlkIFRMIGhhbmRsZSIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIGlmKE5VTEwgPT0gZGF0YUJ1ZmZlcikKKyAgIHsKKyAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIk1hbmFnZW1lbnQgRnJhbWUsIG5vdCBuZWVkIHRvIGhhbmRsZSB3aXRoIFN0YXQiKSk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBpZigwID09IHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0udWNFeGlzdHMpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTiBUTDogJWQgU1RBIElEIGlzIG5vdCBleGlzdCIsIFNUQWlkKSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvKiBUT0RPIDogQkMvTUMvVUMgaGF2ZSB0byBiZSBkZXRlcm1pbmVkIGJ5IE1BQyBhZGRyZXNzICovCisgICBzdGF0aXN0aWNzID0gJnRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0udHJhZmZpY1N0YXRpc3RpY3M7CisgICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKGRhdGFCdWZmZXIsICZwYWNrZXRTaXplKTsKKyAgIGlmKFdEQV9JU19SWF9CQ0FTVChwQkRIZWFkZXIpKQorICAgeworICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiVGhpcyBpcyBSWCBCQy9NQyBmcmFtZSIpKTsKKyAgICAgIGlmKFZPU19GQUxTRSA9PSBpc0Jyb2FkY2FzdCkKKyAgICAgIHsKKyAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlRoaXMgaXMgUlggQkMgZnJhbWUiKSk7CisgICAgICAgICBzdGF0aXN0aWNzLT5yeEJDRmNudCsrOworICAgICAgICAgc3RhdGlzdGljcy0+cnhCQ0JjbnQgKz0gKHBhY2tldFNpemUgLSBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlRoaXMgaXMgUlggTUMgZnJhbWUiKSk7CisgICAgICAgICBzdGF0aXN0aWNzLT5yeE1DRmNudCsrOworICAgICAgICAgc3RhdGlzdGljcy0+cnhNQ0JjbnQgKz0gKHBhY2tldFNpemUgLSBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFKTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlRoaXMgaXMgUlggVUMgZnJhbWUiKSk7CisgICAgICBzdGF0aXN0aWNzLT5yeFVDRmNudCsrOworICAgICAgc3RhdGlzdGljcy0+cnhVQ0JjbnQgKz0gKHBhY2tldFNpemUgLSBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFKTsKKyAgIH0KKworICAgLyogVE9ETyBjYWN1bGF0aW9uIGlzIG5lZWRlZCwgZGltZW5zaW9uIG9mIDUwMGticHMgKi8KKyAgIHN0YXRpc3RpY3MtPnJ4UmF0ZSA9IFdEQV9HRVRfUlhfTUFDX1JBVEVfSURYKHBCREhlYWRlcik7CisgICBzdGF0aXN0aWNzLT5yeEJjbnQgKz0gKHBhY2tldFNpemUgLSBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFKTsKKworI2lmZGVmIFdMQU5UTF9IT19ERUJVR19NU0cKKyAgIFdMQU5UTF9TdGF0RGVidWdEaXNwbGF5KFNUQWlkLCBzdGF0aXN0aWNzKTsKKyNlbmRpZiAvKiBXTEFOVExfSE9fREVCVUdfTVNHICovCisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgRlVOQ1RJT04KKworICAgREVTQ1JJUFRJT04gCisgICAgCisgICBQQVJBTUVURVJTIAorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9TdGF0SGFuZGxlVFhGcmFtZQorKAorICAgdl9QVk9JRF90ICAgICAgICBwQWRhcHRlciwKKyAgIHZfVThfdCAgICAgICAgICAgU1RBaWQsCisgICB2b3NfcGt0X3QgICAgICAgKmRhdGFCdWZmZXIsCisgICB2X1BWT0lEX3QgICAgICAgIHBCREhlYWRlcgorKQoreworICAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKKyAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzOworICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplOworCisgICBpZigoTlVMTCA9PSB0bEN0eHQpIHx8IChOVUxMID09IGRhdGFCdWZmZXIpKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkludmFsaWQgVEwgaGFuZGxlIikpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgaWYoMCA9PSB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLnVjRXhpc3RzKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIldMQU4gVEw6ICVkIFNUQSBJRCBpcyBub3QgZXhpc3QiLCBTVEFpZCkpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLyogVE9ETyA6IEJDL01DL1VDIGhhdmUgdG8gYmUgZGV0ZXJtaW5lZCBieSBNQUMgYWRkcmVzcyAqLworICAgc3RhdGlzdGljcyA9ICZ0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLnRyYWZmaWNTdGF0aXN0aWNzOworICAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aChkYXRhQnVmZmVyLCAmcGFja2V0U2l6ZSk7CisgICBpZihXTEFOVExfU1RBX0lEX0JDQVNUID09IFNUQWlkKQorICAgeworICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiVGhpcyBUWCBpcyBCQyBmcmFtZSIpKTsKKyAgICAgIHN0YXRpc3RpY3MtPnR4QkNGY250Kys7CisgICAgICBzdGF0aXN0aWNzLT50eEJDQmNudCArPSAocGFja2V0U2l6ZSAtIFdMQU5IQUxfVFhfQkRfSEVBREVSX1NJWkUpOworICAgfQorLyoKKyAgIGlmKFdMQU5IQUxfVFhfQkRfR0VUX1VCKHBCREhlYWRlcikpCisgICB7CisgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJUaGlzIFRYIGlzIEJDL01DIGZyYW1lIikpOworICAgICAgaWYoV0xBTlRMX1NUQV9JRF9CQ0FTVCA9PSBTVEFpZCkKKyAgICAgIHsKKyAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlRoaXMgVFggaXMgQkMgZnJhbWUiKSk7CisgICAgICAgICBzdGF0aXN0aWNzLT50eEJDRmNudCsrOworICAgICAgICAgc3RhdGlzdGljcy0+dHhCQ0JjbnQgKz0gKHBhY2tldFNpemUgLSBXTEFOSEFMX1RYX0JEX0hFQURFUl9TSVpFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlRoaXMgVFggaXMgTUMgZnJhbWUiKSk7CisgICAgICAgICBzdGF0aXN0aWNzLT50eE1DRmNudCsrOworICAgICAgICAgc3RhdGlzdGljcy0+dHhNQ0JjbnQgKz0gKHBhY2tldFNpemUgLSBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFKTsKKyAgICAgIH0KKyAgIH0KKyovCisgICBlbHNlCisgICB7CisgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJUaGlzIGlzIFRYIFVDIGZyYW1lIikpOworICAgICAgc3RhdGlzdGljcy0+dHhVQ0ZjbnQrKzsKKyAgICAgIHN0YXRpc3RpY3MtPnR4VUNCY250ICs9IChwYWNrZXRTaXplIC0gV0xBTkhBTF9SWF9CRF9IRUFERVJfU0laRSk7CisgICB9CisKKyNpZmRlZiBXTEFOVExfSE9fREVCVUdfTVNHCisgICBXTEFOVExfU3RhdERlYnVnRGlzcGxheShTVEFpZCwgc3RhdGlzdGljcyk7CisjZW5kaWYgLyogV0xBTlRMX0hPX0RFQlVHX01TRyAqLworCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OICBXTEFOVExfSFNUcmFmZmljU3RhdHVzVGltZXJFeHBpcmVkCisKKyAgIERFU0NSSVBUSU9OICBJZiB0cmFmZmljIHN0YXR1cyBtb25pdG9yaW5nIHRpbWVyIGlzIGV4cGllcmVkLAorICAgICAgICAgICAgICAgIENvdW50IGhvdyBtYXkgZnJhbWVzIGhhdmUgc2VudCBhbmQgcmVjZWl2ZWQgZHVyaW5nIAorICAgICAgICAgICAgICAgIG1lYXN1cmUgcGVyaW9kIGFuZCBpZiB0cmFmZmljIHN0YXR1cyBpcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgc2VuZCBub3RpZmljYXRpb24gdG8gQ2xpZW50KFNNRSkKKyAgICAKKyAgIFBBUkFNRVRFUlMgcEFkYXB0ZXIKKyAgICAgICAgICAgICAgR2xvYmFsIGhhbmRsZQorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1ZPSURfdCBXTEFOVExfSFNUcmFmZmljU3RhdHVzVGltZXJFeHBpcmVkCisoCisgICB2X1BWT0lEX3QgcEFkYXB0ZXIKKykKK3sKKyAgIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAgICAgICAgICAgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CisgICBXTEFOVExfSE9fVFJBRkZJQ19TVEFUVVNfSEFORExFX1RZUEUgKnRyYWZmaWNIYW5kbGUgPSBOVUxMOworICAgV0xBTlRMX0hPX1RSQUZGSUNfU1RBVFVTX1RZUEUgICAgICAgICBuZXdUcmFmZmljOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydEZyYW1lQ291bnQ7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ydEZyYW1lQ291bnQ7CisgICB2X0JPT0xfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWZmaWNTdGF0dXNDaGFuZ2VkID0gVk9TX0ZBTFNFOworCisgICBpZihOVUxMID09IHRsQ3R4dCkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJJbnZhbGlkIFRMIGhhbmRsZSIpKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogR2V0IHJ0IGFuZCBucnQgZnJhbWUgY291bnQgc3VtICovCisgICB0cmFmZmljSGFuZGxlID0gJnRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljOworICAgcnRGcmFtZUNvdW50ICA9IHRyYWZmaWNIYW5kbGUtPnJ0UlhGcmFtZUNvdW50ICsgdHJhZmZpY0hhbmRsZS0+cnRUWEZyYW1lQ291bnQ7CisgICBucnRGcmFtZUNvdW50ID0gdHJhZmZpY0hhbmRsZS0+bnJ0UlhGcmFtZUNvdW50ICsgdHJhZmZpY0hhbmRsZS0+bnJ0VFhGcmFtZUNvdW50OworCisgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJUcmFmZmljIHN0YXR1cyB0aW1lciBleHBpcmVkIFJUIEZDICVkLCBOUlQgRkMgJWQiLCBydEZyYW1lQ291bnQsIG5ydEZyYW1lQ291bnQpKTsKKworICAgLyogR2V0IGN1cnJlbnQgdHJhZmZpYyBzdGF0dXMgKi8KKyAgIGlmKHJ0RnJhbWVDb3VudCA+IHRyYWZmaWNIYW5kbGUtPmlkbGVUaHJlc2hvbGQpCisgICB7CisgICAgICBuZXdUcmFmZmljLnJ0VHJhZmZpY1N0YXR1cyA9IFdMQU5UTF9IT19SVF9UUkFGRklDX1NUQVRVU19PTjsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIG5ld1RyYWZmaWMucnRUcmFmZmljU3RhdHVzID0gV0xBTlRMX0hPX1JUX1RSQUZGSUNfU1RBVFVTX09GRjsKKyAgIH0KKworICAgaWYobnJ0RnJhbWVDb3VudCA+IHRyYWZmaWNIYW5kbGUtPmlkbGVUaHJlc2hvbGQpCisgICB7CisgICAgICBuZXdUcmFmZmljLm5ydFRyYWZmaWNTdGF0dXMgPSBXTEFOVExfSE9fTlJUX1RSQUZGSUNfU1RBVFVTX09OOworICAgfQorICAgZWxzZQorICAgeworICAgICAgbmV3VHJhZmZpYy5ucnRUcmFmZmljU3RhdHVzID0gV0xBTlRMX0hPX05SVF9UUkFGRklDX1NUQVRVU19PRkY7CisgICB9CisKKyAgIC8qIERpZmZlcmVudGlhdGUgd2l0aCBvbGQgdHJhZmZpYyBzdGF0dXMgKi8KKyAgIGlmKHRyYWZmaWNIYW5kbGUtPnRyYWZmaWNTdGF0dXMucnRUcmFmZmljU3RhdHVzICE9IG5ld1RyYWZmaWMucnRUcmFmZmljU3RhdHVzKQorICAgeworICAgICAgVExMT0dXKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwiUlQgVHJhZmZpYyBzdGF0dXMgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICAgICB0cmFmZmljSGFuZGxlLT50cmFmZmljU3RhdHVzLnJ0VHJhZmZpY1N0YXR1cywKKyAgICAgICAgICAgICAgICAgICBuZXdUcmFmZmljLnJ0VHJhZmZpY1N0YXR1cykpOworICAgICAgdHJhZmZpY1N0YXR1c0NoYW5nZWQgPSBWT1NfVFJVRTsKKyAgIH0KKyAgIGlmKHRyYWZmaWNIYW5kbGUtPnRyYWZmaWNTdGF0dXMubnJ0VHJhZmZpY1N0YXR1cyAhPSBuZXdUcmFmZmljLm5ydFRyYWZmaWNTdGF0dXMpCisgICB7CisgICAgICBUTExPR1coVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLCJOUlQgVHJhZmZpYyBzdGF0dXMgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICAgICB0cmFmZmljSGFuZGxlLT50cmFmZmljU3RhdHVzLm5ydFRyYWZmaWNTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgbmV3VHJhZmZpYy5ucnRUcmFmZmljU3RhdHVzKSk7CisgICAgICB0cmFmZmljU3RhdHVzQ2hhbmdlZCA9IFZPU19UUlVFOworICAgfQorCisgICAvKiBJZiB0cmFmZmljIHN0YXR1cyBpcyBjaGFuZ2VkIHNlbmQgbm90aWZpY2F0aW9uIHRvIGNsaWVudCAqLworICAgaWYoKFZPU19UUlVFID09IHRyYWZmaWNTdGF0dXNDaGFuZ2VkKSAmJiAoTlVMTCAhPSB0cmFmZmljSGFuZGxlLT50cmFmZmljQ0IpKQorICAgeworICAgICAgdHJhZmZpY0hhbmRsZS0+dHJhZmZpY0NCKHBBZGFwdGVyLCBuZXdUcmFmZmljLCB0cmFmZmljSGFuZGxlLT51c3JDdHh0KTsKKyAgICAgIHRyYWZmaWNIYW5kbGUtPnRyYWZmaWNTdGF0dXMucnRUcmFmZmljU3RhdHVzID0gbmV3VHJhZmZpYy5ydFRyYWZmaWNTdGF0dXM7CisgICAgICB0cmFmZmljSGFuZGxlLT50cmFmZmljU3RhdHVzLm5ydFRyYWZmaWNTdGF0dXMgPSBuZXdUcmFmZmljLm5ydFRyYWZmaWNTdGF0dXM7CisgICB9CisgICBlbHNlIGlmKChWT1NfVFJVRSA9PSB0cmFmZmljU3RhdHVzQ2hhbmdlZCkgJiYgKE5VTEwgPT0gdHJhZmZpY0hhbmRsZS0+dHJhZmZpY0NCKSkKKyAgIHsKKyAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sIlRyYWZmaWMgc3RhdHVzIGlzIGNoYW5nZWQgYnV0IG5vdCBuZWVkIHRvIHJlcG9ydCIpKTsKKyAgIH0KKworICAgLyogUmVzZXQgZnJhbWUgY291bnRlcnMgKi8KKyAgIHRyYWZmaWNIYW5kbGUtPnJ0UlhGcmFtZUNvdW50ID0gMDsKKyAgIHRyYWZmaWNIYW5kbGUtPnJ0VFhGcmFtZUNvdW50ID0gMDsKKyAgIHRyYWZmaWNIYW5kbGUtPm5ydFJYRnJhbWVDb3VudCA9IDA7CisgICB0cmFmZmljSGFuZGxlLT5ucnRUWEZyYW1lQ291bnQgPSAwOworCisgICBpZihOVUxMICE9IHRyYWZmaWNIYW5kbGUtPnRyYWZmaWNDQikKKyAgIHsKKyAgICAgIC8qIHJlc3RhcnQgdGltZXIgIG9ubHkgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbm90IE5VTEwgKi8KKyAgICAgIHZvc190aW1lcl9zdGFydCgmdHJhZmZpY0hhbmRsZS0+dHJhZmZpY1RpbWVyLCB0cmFmZmljSGFuZGxlLT5tZWFzdXJlUGVyaW9kKTsKKyAgIH0KKyAgIAorICAgcmV0dXJuOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgRlVOQ1RJT04KKworICAgREVTQ1JJUFRJT04gCisgICAgCisgICBQQVJBTUVURVJTIAorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9IU0dldFJTU0kKKygKKyAgIHZfUFZPSURfdCAgICAgICAgcEFkYXB0ZXIsCisgICB2X1BWT0lEX3QgICAgICAgIHBCREhlYWRlciwKKyAgIHZfVThfdCAgICAgICAgICAgU1RBaWQsCisgICB2X1M3X3QgICAgICAgICAgKmN1cnJlbnRBdmdSU1NJCispCit7CisgICBXTEFOVExfQ2JUeXBlICAgKnRsQ3R4dCA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOworICAgVk9TX1NUQVRVUyAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB2X1M3X3QgICAgICAgICAgIGN1cnJlbnRSU1NJLCBjdXJyZW50UlNTSTAsIGN1cnJlbnRSU1NJMTsKKyAgIFdMQU5UTF9DVVJSRU5UX0hPX1NUQVRFX1RZUEUgKmN1cnJlbnRITyA9IE5VTEw7CisKKworICAgaWYoTlVMTCA9PSB0bEN0eHQpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSW52YWxpZCBUTCBoYW5kbGUiKSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvKiAKKyAgICAgIENvbXB1dGUgUlNTSSBvbmx5IGZvciB0aGUgbGFzdCBNUERVIG9mIGFuIEFNUERVLgorICAgICAgT25seSBsYXN0IE1QRFUgY2FycmllcyB0aGUgUGh5IFN0YXRzIFZhbHVlcyAKKyAgICovCisgICAgaWYgKFdEQV9JU19SWF9BTl9BTVBEVSAocEJESGVhZGVyKSkgeworICAgICAgIGlmICghV0RBX0lTX1JYX0xBU1RfTVBEVShwQkRIZWFkZXIpKSB7CisgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgICB9CisgICAgfQorCisgICBjdXJyZW50SE8gPSAmdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGU7CisKKyAgIGN1cnJlbnRSU1NJMCA9IFdMQU5UTF9HRVRSU1NJMChwQkRIZWFkZXIpOworICAgY3VycmVudFJTU0kxID0gV0xBTlRMX0dFVFJTU0kwKHBCREhlYWRlcik7CisgICBjdXJyZW50UlNTSSAgPSAoY3VycmVudFJTU0kwID4gY3VycmVudFJTU0kxKSA/IGN1cnJlbnRSU1NJMCA6IGN1cnJlbnRSU1NJMTsKKworICAgaWYgKDAgPT0gY3VycmVudFJTU0kpCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworCisjaWZkZWYgV0xBTlRMX0hPX1VURVNUCisgICBUTEhTX1V0ZXN0SGFuZGxlTmV3UlNTSSgmY3VycmVudFJTU0ksIHBBZGFwdGVyKTsKKyNlbmRpZiAvKiBXTEFOVExfSE9fVVRFU1QgKi8KKworLyogQ29tbWVudGluZyB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgYXMgdGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyaXR5IHRydWUgaW4gYWxsIGNhc2VzICovCisjaWYgMAorICAgaWYoV0xBTlRMX0hPX0lOVkFMSURfUlNTSSA9PSBjdXJyZW50UlNTSSkKKyAgIHsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisjZW5kaWYKKworICAgaWYoMCA9PSBjdXJyZW50SE8tPmhpc3RvcnlSU1NJKQorICAgeworICAgICAgKmN1cnJlbnRBdmdSU1NJID0gY3VycmVudFJTU0k7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAqY3VycmVudEF2Z1JTU0kgPSAoKGN1cnJlbnRITy0+aGlzdG9yeVJTU0kgKiBjdXJyZW50SE8tPmFscGhhKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRSU1NJICogKDEwIC0gY3VycmVudEhPLT5hbHBoYSkpKSAvIDEwOworICAgfQorI2lmZGVmIFJTU0lfSEFDSworICAgKmN1cnJlbnRBdmdSU1NJID0gKHZfUzdfdClkdW1wQ21kUlNTSTsKKyNlbmRpZgorCisKKyAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0ucnNzaUF2ZyA9ICpjdXJyZW50QXZnUlNTSTsKKworICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiQ3VycmVudCBuZXcgUlNTSSBpcyAlZCwgYXZlcmFnZWQgUlNTSSBpcyAlZCIsIGN1cnJlbnRSU1NJLCAqY3VycmVudEF2Z1JTU0kpKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgRlVOQ1RJT04KKworICAgREVTQ1JJUFRJT04gCisgICAgCisgICBQQVJBTUVURVJTIAorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9IU0JNUFNSU1NJUmVnaW9uQ2hhbmdlZE5vdGlmaWNhdGlvbgorKAorICAgdl9QVk9JRF90ICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgdHBTaXJSU1NJTm90aWZpY2F0aW9uIHBSU1NJTm90aWZpY2F0aW9uCispCit7CisgICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgICAgICAgKnRsQ3R4dCA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOworICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICBXTEFOVExfQ1VSUkVOVF9IT19TVEFURV9UWVBFICAgKmN1cnJlbnRITzsKKyAgIFdMQU5UTF9IT19TVVBQT1JUX1RZUEUgICAgICAgICAqaG9TdXBwb3J0OworICAgV0xBTlRMX1JTU0lDcm9zc1RocmVzaG9sZENCVHlwZSBjYkZ1bmN0aW9uID0gTlVMTDsKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dCA9IE5VTEw7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dFR5cGUgPSBXTEFOVExfSE9fVEhSRVNIT0xEX05BOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBwcmVGV05vdGlmaWNhdGlvbiA9IDA7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZXTm90aWZpY2F0aW9uID0gMDsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVnaW9uTnVtYmVyID0gMDsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZ2lvbk51bWJlciA9IDAsIG5SZWdpb25OdW1iZXIgPSAwOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBpc1NldDsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4LCBzSWR4OworCisgICBpZihOVUxMID09IHRsQ3R4dCkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJJbnZhbGlkIFRMIGhhbmRsZSIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIGlmKE5VTEwgPT0gcFJTU0lOb3RpZmljYXRpb24pCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSW52YWxpZCBGVyBSU1NJIE5vdGlmaWNhdGlvbiIpKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBjdXJyZW50SE8gPSAmKHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlKTsKKyAgIGhvU3VwcG9ydCA9ICYodGxDdHh0LT5ob1N1cHBvcnQpOworICAgcHJlRldOb3RpZmljYXRpb24gPSBjdXJyZW50SE8tPmZ3Tm90aWZpY2F0aW9uOworCisgICBpc1NldCA9IHBSU1NJTm90aWZpY2F0aW9uLT5iUnNzaVRocmVzMVBvc0Nyb3NzOworICAgY3VyRldOb3RpZmljYXRpb24gfD0gaXNTZXQgPDwgNTsKKyAgIGlzU2V0ID0gcFJTU0lOb3RpZmljYXRpb24tPmJSc3NpVGhyZXMyUG9zQ3Jvc3M7CisgICBjdXJGV05vdGlmaWNhdGlvbiB8PSBpc1NldCA8PCA0OworICAgaXNTZXQgPSBwUlNTSU5vdGlmaWNhdGlvbi0+YlJzc2lUaHJlczNQb3NDcm9zczsKKyAgIGN1ckZXTm90aWZpY2F0aW9uIHw9IGlzU2V0IDw8IDM7CisgICBpc1NldCA9IHBSU1NJTm90aWZpY2F0aW9uLT5iUnNzaVRocmVzMU5lZ0Nyb3NzOworICAgY3VyRldOb3RpZmljYXRpb24gfD0gaXNTZXQgPDwgMjsKKyAgIGlzU2V0ID0gcFJTU0lOb3RpZmljYXRpb24tPmJSc3NpVGhyZXMyTmVnQ3Jvc3M7CisgICBjdXJGV05vdGlmaWNhdGlvbiB8PSBpc1NldCA8PCAxOworICAgaXNTZXQgPSBwUlNTSU5vdGlmaWNhdGlvbi0+YlJzc2lUaHJlczNOZWdDcm9zczsKKyAgIGN1ckZXTm90aWZpY2F0aW9uIHw9IGlzU2V0OworICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiQ3VycmVudCBGVyBOb3RpZmljYXRpb24gaXMgMHgleCIsICh2X1UzMl90KWN1ckZXTm90aWZpY2F0aW9uICkpOworCisgICBjdXJyZW50SE8tPmZ3Tm90aWZpY2F0aW9uID0gY3VyRldOb3RpZmljYXRpb247CisKKyAgIGlmKDAgPT0gcHJlRldOb3RpZmljYXRpb24pCisgICB7CisgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIG5vdGlmaWNhdGlvbiBmcm9tIEZXIFZhbHVlIGlzIDB4JXgiLCBjdXJGV05vdGlmaWNhdGlvbikpOworICAgICAgcHJlRldOb3RpZmljYXRpb24gPSBjdXJGV05vdGlmaWNhdGlvbjsKKyAgIH0KKyAgIGVsc2UgaWYocHJlRldOb3RpZmljYXRpb24gPT0gY3VyRldOb3RpZmljYXRpb24pCisgICB7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBpZigxID09IHBSU1NJTm90aWZpY2F0aW9uLT5iUnNzaVRocmVzMVBvc0Nyb3NzKQorICAgeworICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiUE9TIENyb3NzIHRvIFJlZ2lvbiAwIikpOworICAgICAgcFJlZ2lvbk51bWJlciA9IDA7CisgICB9CisgICBlbHNlIGlmKDEgPT0gcFJTU0lOb3RpZmljYXRpb24tPmJSc3NpVGhyZXMyUG9zQ3Jvc3MpCisgICB7CisgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJQT1MgQ3Jvc3MgdG8gUmVnaW9uIDEiKSk7CisgICAgICBwUmVnaW9uTnVtYmVyID0gMTsKKyAgIH0KKyAgIGVsc2UgaWYoMSA9PSBwUlNTSU5vdGlmaWNhdGlvbi0+YlJzc2lUaHJlczNQb3NDcm9zcykKKyAgIHsKKyAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlBPUyBDcm9zcyB0byBSZWdpb24gMiIpKTsKKyAgICAgIHBSZWdpb25OdW1iZXIgPSAyOworICAgfQorCisgICBpZigxID09IHBSU1NJTm90aWZpY2F0aW9uLT5iUnNzaVRocmVzM05lZ0Nyb3NzKQorICAgeworICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiTkVHIENyb3NzIHRvIFJlZ2lvbiAzIikpOworICAgICAgblJlZ2lvbk51bWJlciA9IDM7CisgICB9CisgICBlbHNlIGlmKDEgPT0gcFJTU0lOb3RpZmljYXRpb24tPmJSc3NpVGhyZXMyTmVnQ3Jvc3MpCisgICB7CisgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJORUcgQ3Jvc3MgdG8gUmVnaW9uIDIiKSk7CisgICAgICBuUmVnaW9uTnVtYmVyID0gMjsKKyAgIH0KKyAgIGVsc2UgaWYoMSA9PSBwUlNTSU5vdGlmaWNhdGlvbi0+YlJzc2lUaHJlczFOZWdDcm9zcykKKyAgIHsKKyAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIk5FRyBDcm9zcyB0byBSZWdpb24gMSIpKTsKKyAgICAgIG5SZWdpb25OdW1iZXIgPSAxOworICAgfQorCisKKyAgIG5ld1JlZ2lvbk51bWJlciA9IChuUmVnaW9uTnVtYmVyID4gcFJlZ2lvbk51bWJlcikgPyBuUmVnaW9uTnVtYmVyIDogcFJlZ2lvbk51bWJlcjsKKyAgIGlmKChjdXJyZW50SE8tPnJlZ2lvbk51bWJlcikgJiYgKG5ld1JlZ2lvbk51bWJlciA9PSBjdXJyZW50SE8tPnJlZ2lvbk51bWJlcikpCisgICB7CisgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJObyBSZWdpb24gQ2hhbmdlIHdpdGggQk1QUyBtb2RlIikpOworICAgICAgcHJlRldOb3RpZmljYXRpb24gPSBjdXJGV05vdGlmaWNhdGlvbjsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICB9CisgICBlbHNlIGlmKG5ld1JlZ2lvbk51bWJlciA+IGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyKQorICAgeworICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiUmVnaW9uIEluY3JlYXNlIFdvcnNlIFJTU0kiKSk7CisgICAgICBmb3IoaWR4ID0gY3VycmVudEhPLT5yZWdpb25OdW1iZXI7IGlkeCA8IG5ld1JlZ2lvbk51bWJlcjsgaWR4KyspCisgICAgICB7CisgICAgICAgICBmb3Ioc0lkeCA9IDA7IHNJZHggPCBXTEFOVExfSFNfTlVNX0NMSUVOVDsgc0lkeCsrKQorICAgICAgICAgeworICAgICAgICAgICAgaWYoKFdMQU5UTF9IT19USFJFU0hPTERfRE9XTiA9PSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS50cmlnZ2VyRXZlbnRbc0lkeF0pIHx8CisgICAgICAgICAgICAgICAoV0xBTlRMX0hPX1RIUkVTSE9MRF9DUk9TUyA9PSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS50cmlnZ2VyRXZlbnRbc0lkeF0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS5jcm9zc0NCRnVuY3Rpb25bc0lkeF0pCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjYkZ1bmN0aW9uID0gaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0uY3Jvc3NDQkZ1bmN0aW9uW3NJZHhdOworICAgICAgICAgICAgICAgICAgdXNyQ3R4dCA9IGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLnVzckN0eHRbc0lkeF07CisgICAgICAgICAgICAgICAgICBldnRUeXBlID0gV0xBTlRMX0hPX1RIUkVTSE9MRF9ET1dOOworICAgICAgICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiVHJpZ2dlciBFdmVudCAlZCwgcmVnaW9uIGluZGV4ICVkIiwgaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0udHJpZ2dlckV2ZW50W3NJZHhdLCBpZHgpKTsKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyID0gbmV3UmVnaW9uTnVtYmVyOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2JGdW5jdGlvbihwQWRhcHRlciwgZXZ0VHlwZSwgdXNyQ3R4dCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJSZWdpb24gRGVjcmVhc2UgQmV0dGVyIFJTU0kiKSk7CisgICAgICBpZHggPSAoY3VycmVudEhPLT5yZWdpb25OdW1iZXIpPyhjdXJyZW50SE8tPnJlZ2lvbk51bWJlci0xKTowOworICAgICAgd2hpbGUgKGlkeCA+PSBuZXdSZWdpb25OdW1iZXIpCisgICAgICB7CisgICAgICAgICBmb3Ioc0lkeCA9IDA7IHNJZHggPCBXTEFOVExfSFNfTlVNX0NMSUVOVDsgc0lkeCsrKQorICAgICAgICAgeworICAgICAgICAgICAgaWYoKFdMQU5UTF9IT19USFJFU0hPTERfVVAgJiBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS50cmlnZ2VyRXZlbnRbc0lkeF0pIHx8CisgICAgICAgICAgICAgICAoV0xBTlRMX0hPX1RIUkVTSE9MRF9DUk9TUyAmIGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLnRyaWdnZXJFdmVudFtzSWR4XSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZihOVUxMICE9IGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLmNyb3NzQ0JGdW5jdGlvbltzSWR4XSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGNiRnVuY3Rpb24gPSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS5jcm9zc0NCRnVuY3Rpb25bc0lkeF07CisgICAgICAgICAgICAgICAgICB1c3JDdHh0ID0gaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0udXNyQ3R4dFtzSWR4XTsKKyAgICAgICAgICAgICAgICAgIGV2dFR5cGUgPSBXTEFOVExfSE9fVEhSRVNIT0xEX1VQOworICAgICAgICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiVHJpZ2dlciBFdmVudCAlZCwgcmVnaW9uIGluZGV4ICVkIiwgaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0udHJpZ2dlckV2ZW50W3NJZHhdLCBpZHgpKTsKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyID0gbmV3UmVnaW9uTnVtYmVyOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2JGdW5jdGlvbihwQWRhcHRlciwgZXZ0VHlwZSwgdXNyQ3R4dCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBpZiAoIWlkeC0tKQorICAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorCisgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJCTVBTIFN0YXRlLCBNU0cgZnJvbSBGVywgVHJpZ2dlciBFdmVudCAlZCwgcmVnaW9uIGluZGV4ICVkIiwKKyAgICAgICAgICAgICAgICAgZXZ0VHlwZSwgY3VycmVudEhPLT5yZWdpb25OdW1iZXIpKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX0hTSGFuZGxlUlNTSUNoYW5nZQorKAorICAgdl9QVk9JRF90ICAgcEFkYXB0ZXIsCisgICB2X1M3X3QgICAgICBjdXJyZW50UlNTSQorKQoreworICAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICAgICAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKKyAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVnaW9uID0gMDsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4LCBzSWR4OworICAgV0xBTlRMX0NVUlJFTlRfSE9fU1RBVEVfVFlQRSAgICpjdXJyZW50SE87CisgICBXTEFOVExfSE9fU1VQUE9SVF9UWVBFICAgICAgICAgKmhvU3VwcG9ydDsKKyAgIFdMQU5UTF9SU1NJQ3Jvc3NUaHJlc2hvbGRDQlR5cGUgY2JGdW5jdGlvbiA9IE5VTEw7CisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQgPSBOVUxMOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICBldnRUeXBlID0gV0xBTlRMX0hPX1RIUkVTSE9MRF9OQTsKKworICAgaWYoTlVMTCA9PSB0bEN0eHQpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSW52YWxpZCBUTCBoYW5kbGUiKSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBjdXJyZW50SE8gPSAmKHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlKTsKKyAgIGhvU3VwcG9ydCA9ICYodGxDdHh0LT5ob1N1cHBvcnQpOworICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiQ1JlZ2lvbiAlZCwgTlRocmVzaG9sZCAlZCwgSFJTU0kgJWQiLAorICAgICAgICAgICAgICAgIGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyLAorICAgICAgICAgICAgICAgIGN1cnJlbnRITy0+bnVtVGhyZXNob2xkLAorICAgICAgICAgICAgICAgIGN1cnJlbnRITy0+aGlzdG9yeVJTU0kpKTsKKworICAgLyogRmluZCB3aGVyZSBpcyBjdXJyZW50IHJlZ2lvbiAqLworICAgZm9yKGlkeCA9IDA7IGlkeCA8IGN1cnJlbnRITy0+bnVtVGhyZXNob2xkOyBpZHgrKykKKyAgIHsKKyAgICAgIGlmKGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLnJzc2lWYWx1ZSA8IGN1cnJlbnRSU1NJKQorICAgICAgeworICAgICAgICAgY3VycmVudFJlZ2lvbiA9IGlkeDsKKyAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIkZvdW5kIHJlZ2lvbiAlZCwgbm90IGJvdHRvbSIsIGN1cnJlbnRSZWdpb24pKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorCisgICAvKiBJZiBjb3VsZCBub3QgZmluZCB0aGVuIG5ldyBSU1NJIGlzIGJlbG9uZyB0byBib3R0b20gcmVnaW9uICovCisgICBpZihpZHggPT0gY3VycmVudEhPLT5udW1UaHJlc2hvbGQpCisgICB7CisgICAgICBjdXJyZW50UmVnaW9uID0gaWR4OworICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiQ3VycmVudCByZWdpb24gaXMgYm90dG9tICVkIiwgaWR4KSk7CisgICB9CisKKyAgIC8qIFRoaXMgaXMgYSBoYWNrLiBBY3R1YWwgYXNzaWdubWVudCB3YXMgaGFwcGVuaW5nIGFmdGVyIHRoZSBiZWxvdyBjaGVja3MuIFRoaXMgaGFjayBpcyBuZWVkZWQgdGlsbCBUTAorICAgICAgcG9zdHMgbWVzc2FnZSBhbmQgbm90aGluZyBlbHNlIGluIHRoZSBjYWxsYmFjayBpbmRpY2F0aW5nIFVQL0RPV04gZXZlbnQgdG8gdGhlIHJlZ2lzdGVyZWQgbW9kdWxlICovCisgICBjdXJyZW50SE8tPmhpc3RvcnlSU1NJID0gY3VycmVudFJTU0k7CisgICAKKyAgIGlmKGN1cnJlbnRSZWdpb24gPT0gY3VycmVudEhPLT5yZWdpb25OdW1iZXIpCisgICB7CisgICAgICBjdXJyZW50SE8tPmhpc3RvcnlSU1NJID0gY3VycmVudFJTU0k7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorICAgZWxzZSBpZihjdXJyZW50UmVnaW9uID4gY3VycmVudEhPLT5yZWdpb25OdW1iZXIpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUmVnaW9uIEluY3JlYXNlIFdvcnNlIFJTU0kiKSk7CisgICAgICBmb3IoaWR4ID0gY3VycmVudEhPLT5yZWdpb25OdW1iZXI7IGlkeCA8IGN1cnJlbnRSZWdpb247IGlkeCsrKQorICAgICAgeworICAgICAgICAgZm9yKHNJZHggPSAwOyBzSWR4IDwgV0xBTlRMX0hTX05VTV9DTElFTlQ7IHNJZHgrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChXTEFOVExfSE9fVEhSRVNIT0xEX0RPV04gPT0gaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0udHJpZ2dlckV2ZW50W3NJZHhdKSB8fAorICAgICAgICAgICAgICAgKFdMQU5UTF9IT19USFJFU0hPTERfQ1JPU1MgPT0gaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0udHJpZ2dlckV2ZW50W3NJZHhdKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0uY3Jvc3NDQkZ1bmN0aW9uW3NJZHhdKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2JGdW5jdGlvbiA9IGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLmNyb3NzQ0JGdW5jdGlvbltzSWR4XTsKKyAgICAgICAgICAgICAgICAgIHVzckN0eHQgPSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS51c3JDdHh0W3NJZHhdOworICAgICAgICAgICAgICAgICAgZXZ0VHlwZSA9IFdMQU5UTF9IT19USFJFU0hPTERfRE9XTjsKKyAgICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJUcmlnZ2VyIEV2ZW50ICVkLCByZWdpb24gaW5kZXggJWQiLCBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS50cmlnZ2VyRXZlbnRbc0lkeF0sIGlkeCkpOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2JGdW5jdGlvbihwQWRhcHRlciwgZXZ0VHlwZSwgdXNyQ3R4dCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUmVnaW9uIERlY3JlYXNlIEJldHRlciBSU1NJIikpOworICAgICAgZm9yKGlkeCA9IGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyOyBpZHggPiBjdXJyZW50UmVnaW9uOyBpZHgtLSkKKyAgICAgIHsKKyAgICAgICAgIGZvcihzSWR4ID0gMDsgc0lkeCA8IFdMQU5UTF9IU19OVU1fQ0xJRU5UOyBzSWR4KyspCisgICAgICAgICB7CisgICAgICAgICAgICBpZigoV0xBTlRMX0hPX1RIUkVTSE9MRF9VUCAmIGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHggLSAxXS50cmlnZ2VyRXZlbnRbc0lkeF0pIHx8CisgICAgICAgICAgICAgICAoV0xBTlRMX0hPX1RIUkVTSE9MRF9DUk9TUyAmIGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHggLSAxXS50cmlnZ2VyRXZlbnRbc0lkeF0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4IC0gMV0uY3Jvc3NDQkZ1bmN0aW9uW3NJZHhdKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2JGdW5jdGlvbiA9IGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHggLSAxXS5jcm9zc0NCRnVuY3Rpb25bc0lkeF07CisgICAgICAgICAgICAgICAgICB1c3JDdHh0ID0gaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeCAtIDFdLnVzckN0eHRbc0lkeF07CisgICAgICAgICAgICAgICAgICBldnRUeXBlID0gV0xBTlRMX0hPX1RIUkVTSE9MRF9VUDsKKyAgICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJUcmlnZ2VyIEV2ZW50ICVkLCByZWdpb24gaW5kZXggJWQiLCBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4IC0gMV0udHJpZ2dlckV2ZW50W3NJZHhdLCBpZHggLSAxKSk7CisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjYkZ1bmN0aW9uKHBBZGFwdGVyLCBldnRUeXBlLCB1c3JDdHh0KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgY3VycmVudEhPLT5oaXN0b3J5UlNTSSA9IGN1cnJlbnRSU1NJOworICAgY3VycmVudEhPLT5yZWdpb25OdW1iZXIgPSBjdXJyZW50UmVnaW9uOworICAgV0xBTlRMX0hTRGVidWdEaXNwbGF5KHBBZGFwdGVyKTsKKworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkNsaWVudCBmYWlsIHRvIGhhbmRsZSByZWdpb24gY2hhbmdlIGluIG5vcm1hbCBtb2RlICVkIiwgc3RhdHVzKSk7CisgICB9CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OCisKKyAgIERFU0NSSVBUSU9OIAorICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgUkVUVVJOIFZBTFVFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfSFNIYW5kbGVSWEZyYW1lCisoCisgICB2X1BWT0lEX3QgICAgICAgIHBBZGFwdGVyLAorICAgdl9VOF90ICAgICAgICAgICBmcmFtZVR5cGUsCisgICB2X1BWT0lEX3QgICAgICAgIHBCREhlYWRlciwKKyAgIHZfVThfdCAgICAgICAgICAgU1RBaWQsCisgICB2X0JPT0xfdCAgICAgICAgIGlzQnJvYWRjYXN0LAorICAgdm9zX3BrdF90ICAgICAgICpkYXRhQnVmZmVyCispCit7CisgICBXTEFOVExfQ1VSUkVOVF9IT19TVEFURV9UWVBFICpjdXJyZW50SE8gPSBOVUxMOworICAgV0xBTlRMX0NiVHlwZSAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKKyAgIFZPU19TVEFUVVMgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdl9TN190ICAgICAgICAgICBjdXJyZW50QXZnUlNTSSA9IDA7CisgICB2X1U4X3QgICAgICAgICAgIGFjOworICAgdl9VMzJfdCAgICAgICAgICBjdXJyZW50VGltZXN0YW1wOworICAgdl9VOF90ICAgICAgICAgICB0aWQ7CisKKyAgIGlmKE5VTEwgPT0gdGxDdHh0KQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkludmFsaWQgVEwgaGFuZGxlIikpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgV0xBTlRMX1N0YXRIYW5kbGVSWEZyYW1lKHBBZGFwdGVyLCBwQkRIZWFkZXIsIFNUQWlkLCBpc0Jyb2FkY2FzdCwgZGF0YUJ1ZmZlcik7CisKKyAgIC8qIElmIHRoaXMgZnJhbWUgaXMgbm90IG1hbmFnZW1lbnQgZnJhbWUgaW5jcmVhc2UgZnJhbWUgY291bnQgKi8KKyAgIGlmKCgwICE9IHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLmlkbGVUaHJlc2hvbGQpICYmCisgICAgICAoV0xBTlRMX01HTVRfRlJBTUVfVFlQRSAhPSBmcmFtZVR5cGUpKQorICAgeworICAgICAgdGlkID0gV0RBX0dFVF9SWF9USUQoIHBCREhlYWRlciApOworICAgICAgYWMgPSBXTEFOVExfSE9fVElEXzJfQUNbKHZfVThfdCl0aWRdOworCisgICAgICAvKiBPbmx5IFZvaWNlIHRyYWZmaWMgaXMgaGFuZGxlZCBhcyByZWFsIHRpbWUgdHJhZmZpYyAqLworICAgICAgaWYoV0xBTlRMX0FDX1ZPID09IGFjKQorICAgICAgeworICAgICAgICAgdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudFRyYWZmaWMucnRSWEZyYW1lQ291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLm5ydFJYRnJhbWVDb3VudCsrOworICAgICAgfQorICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiUlggZnJhbWUgQUMgJWQsIFJUIEZyYW1lIENvdW50ICVkLCBOUlQgRnJhbWUgQ291bnQgJWQiLAorICAgICAgICAgICAgICAgICAgIGFjLAorICAgICAgICAgICAgICAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLnJ0UlhGcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLm5ydFJYRnJhbWVDb3VudCkpOworICAgfQorCisgICBjdXJyZW50SE8gPSAmdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGU7CisgICBpZihWT1NfVFJVRSA9PSB0bEN0eHQtPmlzQk1QUykKKyAgIHsKKyAgICAgIFdMQU5UTF9IU0dldFJTU0kocEFkYXB0ZXIsIHBCREhlYWRlciwgU1RBaWQsICZjdXJyZW50QXZnUlNTSSk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBjdXJyZW50VGltZXN0YW1wID0gV0RBX0dFVF9SWF9USU1FU1RBTVAocEJESGVhZGVyKTsKKyAgIGlmKChjdXJyZW50VGltZXN0YW1wIC0gY3VycmVudEhPLT5zYW1wbGVUaW1lKSA8IFdMQU5UTF9IT19TQU1QTElOR19QRVJJT0QpCisgICB7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorICAgY3VycmVudEhPLT5zYW1wbGVUaW1lID0gY3VycmVudFRpbWVzdGFtcDsKKworICAgLyogSWYgYW55IHRocmVzaG9sZCBpcyBub3QgcmVnaXN0ZXJkLCBETyBOT1RISU5HISAqLworICAgaWYoMCA9PSB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50SE9TdGF0ZS5udW1UaHJlc2hvbGQpCisgICB7CisgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJUaGVyZSBpcyBubyB0aHJlc2hvbGRzIHBhc3MiKSk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAvKiBHZXQgQ3VycmVudCBSU1NJIGZyb20gQkQgSGVhc2VyICovCisgICAgICBzdGF0dXMgPSBXTEFOVExfSFNHZXRSU1NJKHBBZGFwdGVyLCBwQkRIZWFkZXIsIFNUQWlkLCAmY3VycmVudEF2Z1JTU0kpOworICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICAgeworICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiR2V0IFJTU0kgRmFpbCIpKTsKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisgICAgICAvKiBIYW5kbGUgY3VycmVudCBSU1NJIHZhbHVlLCByZWdpb24sIG5vdGlmaWNhdGlvbiwgZXRjICovCisgICAgICBzdGF0dXMgPSBXTEFOVExfSFNIYW5kbGVSU1NJQ2hhbmdlKHBBZGFwdGVyLCBjdXJyZW50QXZnUlNTSSk7CisgICAgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICAgICB7CisgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSGFuZGxlIG5ldyBSU1NJIGZhaWwiKSk7CisgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OCisKKyAgIERFU0NSSVBUSU9OIAorICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgUkVUVVJOIFZBTFVFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfSFNIYW5kbGVUWEZyYW1lCisoCisgICB2X1BWT0lEX3QgICAgICAgIHBBZGFwdGVyLAorICAgdl9VOF90ICAgICAgICAgICBhYywKKyAgIHZfVThfdCAgICAgICAgICAgU1RBaWQsCisgICB2b3NfcGt0X3QgICAgICAgKmRhdGFCdWZmZXIsCisgICB2X1BWT0lEX3QgICAgICAgIGJkSGVhZGVyCispCit7CisgICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgICAgICAgKnRsQ3R4dCA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOworICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIGlmKE5VTEwgPT0gdGxDdHh0KQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkludmFsaWQgVEwgaGFuZGxlIikpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLyogVHJhZmZpYyBzdGF0dXMgcmVwb3J0IGlzIG5vdCByZWdpc3RlcmVkLCBKVVNUIERPIE5PVEhJTkcgKi8KKyAgIGlmKDAgPT0gdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudFRyYWZmaWMuaWRsZVRocmVzaG9sZCkKKyAgIHsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisKKyAgIFdMQU5UTF9TdGF0SGFuZGxlVFhGcmFtZShwQWRhcHRlciwgU1RBaWQsIGRhdGFCdWZmZXIsIGJkSGVhZGVyKTsKKworICAgLyogT25seSBWb2ljZSB0cmFmZmljIGlzIGhhbmRsZWQgYXMgcmVhbCB0aW1lIHRyYWZmaWMgKi8KKyAgIGlmKFdMQU5UTF9BQ19WTyA9PSBhYykKKyAgIHsKKyAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLnJ0VFhGcmFtZUNvdW50Kys7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50VHJhZmZpYy5ucnRUWEZyYW1lQ291bnQrKzsKKyAgIH0KKyAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlRYIGZyYW1lIEFDICVkLCBSVCBGcmFtZSBDb3VudCAlZCwgTlJUIEZyYW1lIENvdW50ICVkIiwKKyAgICAgICAgICAgICAgICBhYywKKyAgICAgICAgICAgICAgICB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50VHJhZmZpYy5ydFRYRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50VHJhZmZpYy5ucnRUWEZyYW1lQ291bnQpKTsKKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX0hTUmVnUlNTSUluZGljYXRpb25DQgorKAorICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKKyAgIHZfUzdfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaVZhbHVlLAorICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCisgICBXTEFOVExfUlNTSUNyb3NzVGhyZXNob2xkQ0JUeXBlIGNyb3NzQ0JGdW5jdGlvbiwKKyAgIFZPU19NT0RVTEVfSUQgICAgICAgICAgICAgICAgICAgbW9kdWxlSUQsCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQKKykKK3sKKyAgIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAgICAgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CisgICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4LCBzSWR4OworICAgV0xBTlRMX0hPX1NVUFBPUlRfVFlQRSAgICAgICAgICpob1N1cHBvcnQ7CisgICBXTEFOVExfQ1VSUkVOVF9IT19TVEFURV9UWVBFICAgKmN1cnJlbnRITzsKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50T3JkZXIgPSAwOworCisgICBpZihOVUxMID09IHRsQ3R4dCkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJJbnZhbGlkIFRMIGhhbmRsZSIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIGlmKCgtMSA8IHJzc2lWYWx1ZSkgfHwgKE5VTEwgPT0gY3Jvc3NDQkZ1bmN0aW9uKSkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJSZWcgSW52YWxpZCBBcmd1bWVudCIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIFRIU0dFVExPQ0soIldMQU5UTF9IU1JlZ1JTU0lJbmRpY2F0aW9uQ0IiLCAmdGxDdHh0LT5ob1N1cHBvcnQuaG9zTG9jayk7CisKKyAgIGN1cnJlbnRITyA9ICYodGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGUpOworICAgaG9TdXBwb3J0ID0gJih0bEN0eHQtPmhvU3VwcG9ydCk7CisgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiTWFrZSBSZWdpc3RyYXRpb24gTW9kdWxlICVkLCBFdmVudCAlZCwgUlNTSSAlZCIsIG1vZHVsZUlELCB0cmlnZ2VyRXZlbnQsIHJzc2lWYWx1ZSkpOworCisgICBpZigoV0xBTlRMX01BWF9BVkFJTF9USFJFU0hPTEQgPCBjdXJyZW50SE8tPm51bVRocmVzaG9sZCkgfHwKKyAgICAgIChXTEFOVExfTUFYX0FWQUlMX1RIUkVTSE9MRCA9PSBjdXJyZW50SE8tPm51bVRocmVzaG9sZCkpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiTm8gbW9yZSBhdmFpbGFibGUgc2xvdCwgcGxlYXNlIERFTCBmaXJzdCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRITy0+bnVtVGhyZXNob2xkKSk7CisgICAgICBUSFNSRUxFQVNFTE9DSygiV0xBTlRMX0hTUmVnUlNTSUluZGljYXRpb25DQiIsICZ0bEN0eHQtPmhvU3VwcG9ydC5ob3NMb2NrKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTOworICAgfQorCisgICBpZigwID09IGN1cnJlbnRITy0+bnVtVGhyZXNob2xkKQorICAgeworICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiRmlyc3QgUmVnaXN0cmF0aW9uIikpOworICAgICAgaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kWzBdLnJzc2lWYWx1ZSAgICA9IHJzc2lWYWx1ZTsKKyAgICAgIGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFswXS50cmlnZ2VyRXZlbnRbMF0gICAgPSB0cmlnZ2VyRXZlbnQ7CisgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbMF0uY3Jvc3NDQkZ1bmN0aW9uWzBdID0gY3Jvc3NDQkZ1bmN0aW9uOworICAgICAgaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kWzBdLnVzckN0eHRbMF0gICAgICAgICA9IHVzckN0eHQ7CisgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbMF0ud2hvSXNDbGllbnRbMF0gICAgID0gbW9kdWxlSUQ7CisgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbMF0ubnVtQ2xpZW50Kys7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBmb3IoaWR4ID0gMDsgaWR4IDwgY3VycmVudEhPLT5udW1UaHJlc2hvbGQ7IGlkeCsrKQorICAgICAgeworICAgICAgICAgaWYocnNzaVZhbHVlID09IGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLnJzc2lWYWx1ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihzSWR4ID0gMDsgc0lkeCA8IFdMQU5UTF9IU19OVU1fQ0xJRU5UOyBzSWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUmVnIENCIFAgMHgleCwgcmVnaXN0ZXJlZCBDQiBQIDB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9zc0NCRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLmNyb3NzQ0JGdW5jdGlvbltzSWR4XSkpOworICAgICAgICAgICAgICAgaWYoY3Jvc3NDQkZ1bmN0aW9uID09IGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLmNyb3NzQ0JGdW5jdGlvbltzSWR4XSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJTYW1lIFJTU0kgJWQsIFNhbWUgQ0IgMHgleCBhbHJlYWR5IHJlZ2lzdGVyZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwgY3Jvc3NDQkZ1bmN0aW9uKSk7CisgICAgICAgICAgICAgICAgICBXTEFOVExfSFNEZWJ1Z0Rpc3BsYXkocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgVEhTUkVMRUFTRUxPQ0soIldMQU5UTF9IU1JlZ1JTU0lJbmRpY2F0aW9uQ0IiLCAmdGxDdHh0LT5ob1N1cHBvcnQuaG9zTG9jayk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3Ioc0lkeCA9IDA7IHNJZHggPCBXTEFOVExfSFNfTlVNX0NMSUVOVDsgc0lkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS5jcm9zc0NCRnVuY3Rpb25bc0lkeF0pCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjbGllbnRPcmRlciA9IHNJZHg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLnRyaWdnZXJFdmVudFtjbGllbnRPcmRlcl0gICAgPSB0cmlnZ2VyRXZlbnQ7CisgICAgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS5jcm9zc0NCRnVuY3Rpb25bY2xpZW50T3JkZXJdID0gY3Jvc3NDQkZ1bmN0aW9uOworICAgICAgICAgICAgaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0udXNyQ3R4dFtjbGllbnRPcmRlcl0gICAgICAgICA9IHVzckN0eHQ7CisgICAgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS53aG9Jc0NsaWVudFtjbGllbnRPcmRlcl0gICAgID0gbW9kdWxlSUQ7CisgICAgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS5udW1DbGllbnQrKzsKKyAgICAgICAgICAgIFdMQU5UTF9IU0RlYnVnRGlzcGxheShwQWRhcHRlcik7CisgICAgICAgICAgICBUSFNSRUxFQVNFTE9DSygiV0xBTlRMX0hTUmVnUlNTSUluZGljYXRpb25DQiIsICZ0bEN0eHQtPmhvU3VwcG9ydC5ob3NMb2NrKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IoaWR4ID0gMDsgaWR4IDwgY3VycmVudEhPLT5udW1UaHJlc2hvbGQ7IGlkeCsrKQorICAgICAgeworICAgICAgICAgaWYocnNzaVZhbHVlID4gaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0ucnNzaVZhbHVlKQorICAgICAgICAgeworICAgICAgICAgICAgZm9yKHNJZHggPSAoY3VycmVudEhPLT5udW1UaHJlc2hvbGQgLSAxKTsgKHNJZHggPiBpZHgpIHx8IChzSWR4ID09IGlkeCk7IHNJZHgtLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJTaGlmdCAlZCBhcnJheSB0byAlZCIsIHNJZHgsIHNJZHggKyAxKSk7CisgICAgICAgICAgICAgICBtZW1jcHkoJmhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtzSWR4ICsgMV0sICZob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbc0lkeF0sIHNpemVvZihXTEFOVExfSE9fUlNTSV9JTkRJQ0FUSU9OX1RZUEUpKTsKKyAgICAgICAgICAgICAgIG1lbXNldCgmaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW3NJZHhdLCAwLCBzaXplb2YoV0xBTlRMX0hPX1JTU0lfSU5ESUNBVElPTl9UWVBFKSk7CisgICAgICAgICAgICAgICBpZigwID09IHNJZHgpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlB1dCBpbiBIZXJlICVkIiwgaWR4KSk7CisgICAgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS5yc3NpVmFsdWUgICAgPSByc3NpVmFsdWU7CisgICAgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS50cmlnZ2VyRXZlbnRbMF0gICAgPSB0cmlnZ2VyRXZlbnQ7CisgICAgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS5jcm9zc0NCRnVuY3Rpb25bMF0gPSBjcm9zc0NCRnVuY3Rpb247CisgICAgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS51c3JDdHh0WzBdICAgICAgICAgPSB1c3JDdHh0OworICAgICAgICAgICAgaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2lkeF0ud2hvSXNDbGllbnRbMF0gICAgID0gbW9kdWxlSUQ7CisgICAgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS5udW1DbGllbnQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgICAgaWYoY3VycmVudEhPLT5udW1UaHJlc2hvbGQgPT0gaWR4KQorICAgICAgeworICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIk5ldyB0aHJlc2hvbGQgcHV0IGluIGJvdHRvbSIpKTsKKworICAgICAgICAgaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2N1cnJlbnRITy0+bnVtVGhyZXNob2xkXS5yc3NpVmFsdWUgICAgPSByc3NpVmFsdWU7CisgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbY3VycmVudEhPLT5udW1UaHJlc2hvbGRdLnRyaWdnZXJFdmVudFswXSA9IHRyaWdnZXJFdmVudDsKKyAgICAgICAgIGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtjdXJyZW50SE8tPm51bVRocmVzaG9sZF0uY3Jvc3NDQkZ1bmN0aW9uWzBdID0gY3Jvc3NDQkZ1bmN0aW9uOworICAgICAgICAgaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2N1cnJlbnRITy0+bnVtVGhyZXNob2xkXS51c3JDdHh0WzBdID0gdXNyQ3R4dDsKKyAgICAgICAgIGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtjdXJyZW50SE8tPm51bVRocmVzaG9sZF0ud2hvSXNDbGllbnRbMF0gICAgID0gbW9kdWxlSUQ7CisgICAgICAgICBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbY3VycmVudEhPLT5udW1UaHJlc2hvbGRdLm51bUNsaWVudCsrOworICAgICAgfQorICAgfQorCisgICBjdXJyZW50SE8tPm51bVRocmVzaG9sZCsrOworICAgaWYoKFZPU19GQUxTRSA9PSB0bEN0eHQtPmlzQk1QUykgJiYgKHJzc2lWYWx1ZSA+IGN1cnJlbnRITy0+aGlzdG9yeVJTU0kpKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkFkZGVkIFRocmVzaG9sZCBhYm92ZSBjdXJyZW50IFJTU0kgbGV2ZWwsIG9sZCBSTiAlZCIsIGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyKSk7CisgICAgICBpZig0ID4gY3VycmVudEhPLT5yZWdpb25OdW1iZXIpCisgICAgICB7CisgICAgICAgICBjdXJyZW50SE8tPnJlZ2lvbk51bWJlcisrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkN1cnJlbnQgcmVnaW9uIG51bWJlciBpcyBtYXggJWQsIGNhbm5vdCBpbmNyZWFzZSBhbnltb3JlIiwgY3VycmVudEhPLT5yZWdpb25OdW1iZXIpKTsKKyAgICAgIH0KKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJpbmNyZWFzZSByZWdpb24gbnVtYmVyIHdpdGhvdXQgbm90aWZpY2F0aW9uICVkIiwgY3VycmVudEhPLT5yZWdpb25OdW1iZXIpKTsKKyAgIH0KKyAgIGVsc2UgaWYoVk9TX1RSVUUgPT0gdGxDdHh0LT5pc0JNUFMpCisgICB7CisgICAgICBpZigwICE9IGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyKQorICAgICAgeworICAgICAgICAgaWYoaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW2N1cnJlbnRITy0+cmVnaW9uTnVtYmVyXS5yc3NpVmFsdWUgPCByc3NpVmFsdWUpCisgICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50SE8tPnJlZ2lvbk51bWJlcisrOworICAgICAgICAgICAgaWYoKFdMQU5UTF9IT19USFJFU0hPTERfRE9XTiA9PSB0cmlnZ2VyRXZlbnQpIHx8IChXTEFOVExfSE9fVEhSRVNIT0xEX0NST1NTID09IHRyaWdnZXJFdmVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUmVnaXN0ZXJlZCBSU1NJIHZhbHVlIGxhcmdlciB0aGFuIEN1cnJlbnQgUlNTSSwgYW5kIERPV04gZXZlbnQsIFNlbmQgTm90aWZpY2F0aW9uIikpOworICAgICAgICAgICAgICAgY3Jvc3NDQkZ1bmN0aW9uKHBBZGFwdGVyLCBXTEFOVExfSE9fVEhSRVNIT0xEX0RPV04sIHVzckN0eHQpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZigoY3VycmVudEhPLT5yZWdpb25OdW1iZXIgPCAoY3VycmVudEhPLT5udW1UaHJlc2hvbGQgLSAxKSkgJiYKKyAgICAgICAgICAgICAgICAgKGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtjdXJyZW50SE8tPnJlZ2lvbk51bWJlciArIDFdLnJzc2lWYWx1ZSA+IHJzc2lWYWx1ZSkpCisgICAgICAgICB7CisgICAgICAgICAgICBpZigoV0xBTlRMX0hPX1RIUkVTSE9MRF9VUCA9PSB0cmlnZ2VyRXZlbnQpIHx8IChXTEFOVExfSE9fVEhSRVNIT0xEX0NST1NTID09IHRyaWdnZXJFdmVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUmVnaXN0ZXJlZCBSU1NJIHZhbHVlIHNtYWxsZXIgdGhhbiBDdXJyZW50IFJTU0kiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpZihob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbY3VycmVudEhPLT5yZWdpb25OdW1iZXJdLnJzc2lWYWx1ZSA+IHJzc2lWYWx1ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChXTEFOVExfSE9fVEhSRVNIT0xEX1VQID09IHRyaWdnZXJFdmVudCkgfHwgKFdMQU5UTF9IT19USFJFU0hPTERfQ1JPU1MgPT0gdHJpZ2dlckV2ZW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJSZWdpc3RlcmVkIFJTU0kgdmFsdWUgc21hbGxlciB0aGFuIEN1cnJlbnQgUlNTSSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgaWYoKFZPU19GQUxTRSA9PSB0bEN0eHQtPmlzQk1QUykgJiYKKyAgICAgIChyc3NpVmFsdWUgPj0gY3VycmVudEhPLT5oaXN0b3J5UlNTSSkgJiYgKDAgIT0gY3VycmVudEhPLT5oaXN0b3J5UlNTSSkgJiYKKyAgICAgICgoV0xBTlRMX0hPX1RIUkVTSE9MRF9ET1dOID09IHRyaWdnZXJFdmVudCkgfHwgKFdMQU5UTF9IT19USFJFU0hPTERfQ1JPU1MgPT0gdHJpZ2dlckV2ZW50KSkpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUmVnaXN0ZXJlZCBSU1NJIHZhbHVlIGxhcmdlciB0aGFuIEN1cnJlbnQgUlNTSSwgYW5kIERPV04gZXZlbnQsIFNlbmQgTm90aWZpY2F0aW9uIikpOworICAgICAgY3Jvc3NDQkZ1bmN0aW9uKHBBZGFwdGVyLCBXTEFOVExfSE9fVEhSRVNIT0xEX0RPV04sIHVzckN0eHQpOworICAgfQorICAgZWxzZSBpZigoVk9TX0ZBTFNFID09IHRsQ3R4dC0+aXNCTVBTKSAmJgorICAgICAgICAgICAocnNzaVZhbHVlIDwgY3VycmVudEhPLT5oaXN0b3J5UlNTSSkgJiYgKDAgIT0gY3VycmVudEhPLT5oaXN0b3J5UlNTSSkgJiYKKyAgICAgICAgICAgKChXTEFOVExfSE9fVEhSRVNIT0xEX1VQID09IHRyaWdnZXJFdmVudCkgfHwgKFdMQU5UTF9IT19USFJFU0hPTERfQ1JPU1MgPT0gdHJpZ2dlckV2ZW50KSkpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiUmVnaXN0ZXJlZCBSU1NJIHZhbHVlIHNtYWxsZXIgdGhhbiBDdXJyZW50IFJTU0ksIGFuZCBVUCBldmVudCwgU2VuZCBOb3RpZmljYXRpb24iKSk7CisgICAgICBjcm9zc0NCRnVuY3Rpb24ocEFkYXB0ZXIsIFdMQU5UTF9IT19USFJFU0hPTERfVVAsIHVzckN0eHQpOworICAgfQorCisgICBpZihWT1NfVFJVRSA9PSB0bEN0eHQtPmlzQk1QUykKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJSZWdpc3RlciBpbnRvIEZXLCBub3cgQk1QUyIpKTsKKyAgICAgIC8qIHRoaXMgZnVuY3Rpb24gaG9sZHMgdGhlIGxvY2sgYWNyb3NzIGEgZG93bnN0cmVhbSBXREEgZnVuY3Rpb24gY2FsbCwgdGhpcyBpcyB2aW9sYXRlcyBzb21lIGxvY2sKKyAgICAgICAgIG9yZGVyaW5nIGNoZWNrcyBkb25lIG9uIHNvbWUgSExPUyBzZWUgQ1IzMjMyMjEqLworICAgICAgVEhTUkVMRUFTRUxPQ0soIldMQU5UTF9IU1JlZ1JTU0lJbmRpY2F0aW9uQ0IiLCAmdGxDdHh0LT5ob1N1cHBvcnQuaG9zTG9jayk7CisgICAgICBXTEFOVExfU2V0RldSU1NJVGhyZXNob2xkcyhwQWRhcHRlcik7CisgICAgICBUSFNHRVRMT0NLKCJXTEFOVExfSFNSZWdSU1NJSW5kaWNhdGlvbkNCIiwgJnRsQ3R4dC0+aG9TdXBwb3J0Lmhvc0xvY2spOworICAgfQorCisgICBXTEFOVExfSFNEZWJ1Z0Rpc3BsYXkocEFkYXB0ZXIpOworICAgVEhTUkVMRUFTRUxPQ0soIldMQU5UTF9IU1JlZ1JTU0lJbmRpY2F0aW9uQ0IiLCAmdGxDdHh0LT5ob1N1cHBvcnQuaG9zTG9jayk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OCisKKyAgIERFU0NSSVBUSU9OIAorICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgUkVUVVJOIFZBTFVFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfSFNEZXJlZ1JTU0lJbmRpY2F0aW9uQ0IKKygKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCisgICB2X1M3X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAorICAgV0xBTlRMX1JTU0lDcm9zc1RocmVzaG9sZENCVHlwZSBjcm9zc0NCRnVuY3Rpb24sCisgICBWT1NfTU9EVUxFX0lEICAgICAgICAgICAgICAgICAgIG1vZHVsZUlECispCit7CisgICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgICAgICAgKnRsQ3R4dCA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOworICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgc0lkeDsKKyAgIFdMQU5UTF9IT19TVVBQT1JUX1RZUEUgICAgICAgICAqaG9TdXBwb3J0OworICAgV0xBTlRMX0NVUlJFTlRfSE9fU1RBVEVfVFlQRSAgICpjdXJyZW50SE87CisgICB2X0JPT0xfdCAgICAgICAgICAgICAgICAgICAgICAgIGJtcHNBYm92ZSA9IFZPU19GQUxTRTsKKworICAgaWYoTlVMTCA9PSB0bEN0eHQpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSW52YWxpZCBUTCBoYW5kbGUiKSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBpZigwID09IHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLm51bVRocmVzaG9sZCkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJFbXB0eSBsaXN0LCBjYW4gbm90IHJlbW92ZSIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRU1QVFk7CisgICB9CisKKyAgIFRIU0dFVExPQ0soIldMQU5UTF9IU0RlcmVnUlNTSUluZGljYXRpb25DQiIsICZ0bEN0eHQtPmhvU3VwcG9ydC5ob3NMb2NrKTsKKyAgIGN1cnJlbnRITyA9ICYodGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGUpOworICAgaG9TdXBwb3J0ID0gJih0bEN0eHQtPmhvU3VwcG9ydCk7CisKKyAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJERUwgdGFyZ2V0IFJTU0kgJWQsIGV2ZW50ICVkIiwgcnNzaVZhbHVlLCB0cmlnZ2VyRXZlbnQpKTsKKworICAgaWYoKFZPU19UUlVFID09IHRsQ3R4dC0+aXNCTVBTKSAmJiAoMCA8IGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyKSkKKyAgIHsKKyAgICAgIGlmKHJzc2lWYWx1ZSA+PSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbY3VycmVudEhPLT5yZWdpb25OdW1iZXIgLSAxXS5yc3NpVmFsdWUpCisgICAgICB7CisgICAgICAgICBibXBzQWJvdmUgPSBWT1NfVFJVRTsKKyAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJSZW1vdmUgVGhyZXNob2xkIGxhcmdlciB0aGFuIGN1cnJlbnQgcmVnaW9uIikpOworICAgICAgfQorICAgfQorCisgICBmb3IoaWR4ID0gMDsgaWR4IDwgY3VycmVudEhPLT5udW1UaHJlc2hvbGQ7IGlkeCsrKQorICAgeworICAgICAgaWYocnNzaVZhbHVlID09IGhvU3VwcG9ydC0+cmVnaXN0ZXJlZEluZFtpZHhdLnJzc2lWYWx1ZSkKKyAgICAgIHsKKyAgICAgICAgIGZvcihzSWR4ID0gMDsgc0lkeCA8IFdMQU5UTF9IU19OVU1fQ0xJRU5UOyBzSWR4KyspCisgICAgICAgICB7CisgICAgICAgICAgICBpZihjcm9zc0NCRnVuY3Rpb24gPT0gdGxDdHh0LT5ob1N1cHBvcnQucmVnaXN0ZXJlZEluZFtpZHhdLmNyb3NzQ0JGdW5jdGlvbltzSWR4XSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LnJlZ2lzdGVyZWRJbmRbaWR4XS50cmlnZ2VyRXZlbnRbc0lkeF0gICAgPSAwOworICAgICAgICAgICAgICAgdGxDdHh0LT5ob1N1cHBvcnQucmVnaXN0ZXJlZEluZFtpZHhdLmNyb3NzQ0JGdW5jdGlvbltzSWR4XSA9IE5VTEw7CisgICAgICAgICAgICAgICB0bEN0eHQtPmhvU3VwcG9ydC5yZWdpc3RlcmVkSW5kW2lkeF0udXNyQ3R4dFtzSWR4XSAgICAgICAgID0gTlVMTDsKKyAgICAgICAgICAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LnJlZ2lzdGVyZWRJbmRbaWR4XS53aG9Jc0NsaWVudFtzSWR4XSAgICAgPSAwOworICAgICAgICAgICAgICAgdGxDdHh0LT5ob1N1cHBvcnQucmVnaXN0ZXJlZEluZFtpZHhdLm51bUNsaWVudC0tOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgaWYoMCAhPSB0bEN0eHQtPmhvU3VwcG9ydC5yZWdpc3RlcmVkSW5kW2lkeF0ubnVtQ2xpZW50KQorICAgICAgICAgeworICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiRm91bmQgTXVsdGlwbGUgaWR4IGlzICVkIiwgaWR4KSk7CisgICAgICAgICAgICBXTEFOVExfSFNEZWJ1Z0Rpc3BsYXkocEFkYXB0ZXIpOworICAgICAgICAgICAgVEhTUkVMRUFTRUxPQ0soIldMQU5UTF9IU0RlcmVnUlNTSUluZGljYXRpb25DQiIsICZ0bEN0eHQtPmhvU3VwcG9ydC5ob3NMb2NrKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJGb3VuZCBTaW5nbGUgaWR4IGlzICVkIiwgaWR4KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKyAgIGlmKGlkeCA9PSBjdXJyZW50SE8tPm51bVRocmVzaG9sZCkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJDb3VsZCBub3QgZmluZCBlbnRyeSwgbWF5YmUgaW52YWxpZCBhcmciKSk7CisgICAgICBUSFNSRUxFQVNFTE9DSygiV0xBTlRMX0hTRGVyZWdSU1NJSW5kaWNhdGlvbkNCIiwgJnRsQ3R4dC0+aG9TdXBwb3J0Lmhvc0xvY2spOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgZm9yKGlkeCA9IDA7IGlkeCA8IGN1cnJlbnRITy0+bnVtVGhyZXNob2xkOyBpZHgrKykKKyAgIHsKKyAgICAgIGlmKHJzc2lWYWx1ZSA9PSBob1N1cHBvcnQtPnJlZ2lzdGVyZWRJbmRbaWR4XS5yc3NpVmFsdWUpCisgICAgICB7CisgICAgICAgICBpZigoY3VycmVudEhPLT5udW1UaHJlc2hvbGQgLSAxKSA9PSBpZHgpCisgICAgICAgICB7CisgICAgICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJSZW1vdmUgdGFyZ2V0IGlzIGxhc3Qgb25lIikpOworICAgICAgICAgICAgLyogRG9lcyBub3QgbmVlZCBtb3ZlIGFueSBlbGVtZW50LCBqdXN0IHJlbW92ZSBsYXN0IGFycmF5IGVudHJ5ICovCisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBmb3Ioc0lkeCA9IGlkeDsgc0lkeCA8IChjdXJyZW50SE8tPm51bVRocmVzaG9sZCAtIDEpOyBzSWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCJTaGlmdCB1cCBmcm9tICVkIHRvICVkIiwgc0lkeCArIDEsIHNJZHgpKTsKKyAgICAgICAgICAgICAgIG1lbWNweSgmaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW3NJZHhdLCAmaG9TdXBwb3J0LT5yZWdpc3RlcmVkSW5kW3NJZHggKyAxXSwgc2l6ZW9mKFdMQU5UTF9IT19SU1NJX0lORElDQVRJT05fVFlQRSkpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisgICAvKiBDb21tb24gcmVtb3ZlIGxhc3QgYXJyYXkgZW50cnkgKi8KKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LnJlZ2lzdGVyZWRJbmRbY3VycmVudEhPLT5udW1UaHJlc2hvbGQgLSAxXS5yc3NpVmFsdWUgICAgPSBXTEFOVExfSE9fREVGQVVMVF9SU1NJOworICAgZm9yKGlkeCA9IDA7IGlkeCA8IFdMQU5UTF9IU19OVU1fQ0xJRU5UOyBpZHgrKykKKyAgIHsKKyAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LnJlZ2lzdGVyZWRJbmRbY3VycmVudEhPLT5udW1UaHJlc2hvbGQgLSAxXS50cmlnZ2VyRXZlbnRbaWR4XSAgICA9IFdMQU5UTF9IT19USFJFU0hPTERfTkE7CisgICAgICB0bEN0eHQtPmhvU3VwcG9ydC5yZWdpc3RlcmVkSW5kW2N1cnJlbnRITy0+bnVtVGhyZXNob2xkIC0gMV0uY3Jvc3NDQkZ1bmN0aW9uW2lkeF0gPSBOVUxMOworICAgICAgdGxDdHh0LT5ob1N1cHBvcnQucmVnaXN0ZXJlZEluZFtjdXJyZW50SE8tPm51bVRocmVzaG9sZCAtIDFdLnVzckN0eHRbaWR4XSAgICAgICAgID0gTlVMTDsKKyAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LnJlZ2lzdGVyZWRJbmRbY3VycmVudEhPLT5udW1UaHJlc2hvbGQgLSAxXS53aG9Jc0NsaWVudFtpZHhdICAgICA9IDA7CisgICAgICB0bEN0eHQtPmhvU3VwcG9ydC5yZWdpc3RlcmVkSW5kW2N1cnJlbnRITy0+bnVtVGhyZXNob2xkIC0gMV0ubnVtQ2xpZW50ICAgICAgICAgICAgPSAwOworICAgfQorCisgICBpZigoVk9TX0ZBTFNFID09IHRsQ3R4dC0+aXNCTVBTKSAmJiAocnNzaVZhbHVlID49IGN1cnJlbnRITy0+aGlzdG9yeVJTU0kpKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIlJlbW92ZWQgVGhyZXNob2xkIGFib3ZlIGN1cnJlbnQgUlNTSSBsZXZlbCwgb2xkIFJOICVkIiwgY3VycmVudEhPLT5yZWdpb25OdW1iZXIpKTsKKyAgICAgIGlmKDAgPCBjdXJyZW50SE8tPnJlZ2lvbk51bWJlcikKKyAgICAgIHsKKyAgICAgICAgIGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyLS07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiQ3VycmVudCBSZWdpb24gbnVtYmVyIGlzIDAsIGNhbm5vdCBkZWNyZWFzZSBhbnltb3JlIikpOworICAgICAgfQorICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiRGVjcmVhc2UgcmVnaW9uIG51bWJlciB3aXRob3V0IG5vdGlmaWNhdGlvbiAlZCIsIGN1cnJlbnRITy0+cmVnaW9uTnVtYmVyKSk7CisgICB9CisgICBlbHNlIGlmKChWT1NfVFJVRSA9PSB0bEN0eHQtPmlzQk1QUykgJiYgKFZPU19UUlVFID09IGJtcHNBYm92ZSkpCisgICB7CisgICAgICBjdXJyZW50SE8tPnJlZ2lvbk51bWJlci0tOworICAgfQorICAgLyogRGVjcmVhc2UgbnVtYmVyIG9mIHRocmVzaG9sZHMgKi8KKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLm51bVRocmVzaG9sZC0tOworICAgLypSZXNldCB0aGUgRlcgbm90aWZpY2F0aW9uKi8KKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLmZ3Tm90aWZpY2F0aW9uPTA7CisKKyAgIGlmKFZPU19UUlVFID09IHRsQ3R4dC0+aXNCTVBTKQorICAgeworICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiUmVnaXN0ZXIgaW50byBGVywgbm93IEJNUFMiKSk7CisgICAgICAgLyogdGhpcyBmdW5jdGlvbiBob2xkcyB0aGUgbG9jayBhY3Jvc3MgYSBkb3duc3RyZWFtIFdEQSBmdW5jdGlvbiBjYWxsLCB0aGlzIGlzIHZpb2xhdGVzIHNvbWUgbG9jaworICAgICAgICAgb3JkZXJpbmcgY2hlY2tzIGRvbmUgb24gc29tZSBITE9TIHNlZSBDUjMyMzIyMSovCisgICAgICBUSFNSRUxFQVNFTE9DSygiV0xBTlRMX0hTRGVyZWdSU1NJSW5kaWNhdGlvbkNCIiwgJnRsQ3R4dC0+aG9TdXBwb3J0Lmhvc0xvY2spOworICAgICAgV0xBTlRMX1NldEZXUlNTSVRocmVzaG9sZHMocEFkYXB0ZXIpOyAKKyAgICAgIFRIU0dFVExPQ0soIldMQU5UTF9IU0RlcmVnUlNTSUluZGljYXRpb25DQiIsICZ0bEN0eHQtPmhvU3VwcG9ydC5ob3NMb2NrKTsKKyAgIH0KKworICAgLyogQmFzZWQgb24gbmV3IHRocmVzaG9sZCBzZXQgcmVjYWxjdWxhdGVkIGN1cnJlbnQgUlNTSSBzdGF0dXMgKi8KKyAgIGlmKDAgPCB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50SE9TdGF0ZS5udW1UaHJlc2hvbGQpCisgICB7CisgICB9CisgICBlbHNlIGlmKDAgPT0gdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGUubnVtVGhyZXNob2xkKQorICAgeworICAgICAgY3VycmVudEhPLT5yZWdpb25OdW1iZXIgPSAwOworICAgICAgVExMT0dXKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwiTm8gcmVnaXN0ZXJlZCBUaHJlc2hvbGQiKSk7CisgICAgICAvKiBXaGF0IHNob3VsZCBkbz8gKi8KKyAgIH0KKworICAgV0xBTlRMX0hTRGVidWdEaXNwbGF5KHBBZGFwdGVyKTsKKyAgIFRIU1JFTEVBU0VMT0NLKCJXTEFOVExfSFNEZXJlZ1JTU0lJbmRpY2F0aW9uQ0IiLCAmdGxDdHh0LT5ob1N1cHBvcnQuaG9zTG9jayk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OCisKKyAgIERFU0NSSVBUSU9OIAorICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgUkVUVVJOIFZBTFVFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfSFNTZXRBbHBoYQorKAorICAgdl9QVk9JRF90IHBBZGFwdGVyLAorICAgaW50ICAgICAgIHZhbHVlQWxwaGEKKykKK3sKKyAgIFdMQU5UTF9DYlR5cGUgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CisgICBWT1NfU1RBVFVTICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgaWYoTlVMTCA9PSB0bEN0eHQpCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiSW52YWxpZCBUTCBoYW5kbGUiKSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBUSFNHRVRMT0NLKCJXTEFOVExfSFNTZXRBbHBoYSIsICZ0bEN0eHQtPmhvU3VwcG9ydC5ob3NMb2NrKTsKKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLmFscGhhID0gKHZfVThfdCl2YWx1ZUFscGhhOworICAgVEhTUkVMRUFTRUxPQ0soIldMQU5UTF9IU1NldEFscGhhIiwgJnRsQ3R4dC0+aG9TdXBwb3J0Lmhvc0xvY2spOworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX0hTUmVnR2V0VHJhZmZpY1N0YXR1cworKAorICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRsZVRocmVzaG9sZCwKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kLAorICAgV0xBTlRMX1RyYWZmaWNTdGF0dXNDaGFuZ2VkQ0JUeXBlICB0cmZmaWNTdGF0dXNDQiwKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dAorKQoreworICAgV0xBTlRMX0NiVHlwZSAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKKyAgIFZPU19TVEFUVVMgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICBpZihOVUxMID09IHRsQ3R4dCkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJJbnZhbGlkIFRMIGhhbmRsZSIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIGlmKCgwID09IGlkbGVUaHJlc2hvbGQpIHx8ICgwID09IHBlcmlvZCkgfHwgKE5VTEwgPT0gdHJmZmljU3RhdHVzQ0IpKQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkludmFsaWQgQXJndW1lbnQgUGFzc2VkIGZyb20gU01FIikpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudFRyYWZmaWMuaWRsZVRocmVzaG9sZCA9IGlkbGVUaHJlc2hvbGQ7CisgICB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50VHJhZmZpYy5tZWFzdXJlUGVyaW9kID0gcGVyaW9kOworICAgdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudFRyYWZmaWMudHJhZmZpY0NCICAgICA9IHRyZmZpY1N0YXR1c0NCOworICAgdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudFRyYWZmaWMudXNyQ3R4dCAgICAgICA9IHVzckN0eHQ7CisKKyAgIHZvc190aW1lcl9zdGFydCgmdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudFRyYWZmaWMudHJhZmZpY1RpbWVyLAorICAgICAgICAgICAgICAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLm1lYXN1cmVQZXJpb2QpOworCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OCisKKyAgIERFU0NSSVBUSU9OIAorICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgUkVUVVJOIFZBTFVFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfSFNJbml0CisoCisgICB2X1BWT0lEX3QgICBwQWRhcHRlcgorKQoreworICAgV0xBTlRMX0NiVHlwZSAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKKyAgIFZPU19TVEFUVVMgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdl9VOF90ICAgICAgICAgICBpZHgsIHNJZHg7CisKKyAgIGlmKE5VTEwgPT0gdGxDdHh0KQorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIkludmFsaWQgVEwgaGFuZGxlIikpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKyNpZmRlZiBXTEFOVExfSE9fVVRFU1QKKyAgIHJzc2kgPSAwOworICAgZGlyZWN0aW9uID0gLTE7CisjZW5kaWYgLyogV0xBTlRMX0hPX1VURVNUICovCisKKyAgIC8qIHNldCBkZWZhdWx0IGN1cnJlbnQgSE8gc3RhdHVzICovCisgICB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50SE9TdGF0ZS5hbHBoYSAgICAgICAgPSBXTEFOVExfSE9fREVGQVVMVF9BTFBIQTsKKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLmhpc3RvcnlSU1NJICA9IDA7CisgICB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50SE9TdGF0ZS5udW1UaHJlc2hvbGQgPSAwOworICAgdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudEhPU3RhdGUucmVnaW9uTnVtYmVyID0gMDsKKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLnNhbXBsZVRpbWUgICA9IDA7CisKKyAgIC8qIHNldCBkZWZhdWx0IGN1cnJlbnQgdHJhZmZpYyBzdGF0dXMgKi8KKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLnRyYWZmaWNTdGF0dXMucnRUcmFmZmljU3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBXTEFOVExfSE9fUlRfVFJBRkZJQ19TVEFUVVNfT0ZGOworICAgdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudFRyYWZmaWMudHJhZmZpY1N0YXR1cy5ucnRUcmFmZmljU3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBXTEFOVExfSE9fTlJUX1RSQUZGSUNfU1RBVFVTX09GRjsKKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLmlkbGVUaHJlc2hvbGQgICA9IDA7CisgICB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50VHJhZmZpYy5tZWFzdXJlUGVyaW9kICAgPSAwOworICAgdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudFRyYWZmaWMucnRSWEZyYW1lQ291bnQgID0gMDsKKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLnJ0VFhGcmFtZUNvdW50ICA9IDA7CisgICB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50VHJhZmZpYy5ucnRSWEZyYW1lQ291bnQgPSAwOworICAgdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudFRyYWZmaWMubnJ0VFhGcmFtZUNvdW50ID0gMDsKKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLnRyYWZmaWNDQiAgICAgICA9IE5VTEw7CisKKyAgIC8qIEluaXRpYWxpemUgaW5kaWNhdGlvbiBhcnJheSAqLworICAgZm9yKGlkeCA9IDA7IGlkeCA8IFdMQU5UTF9NQVhfQVZBSUxfVEhSRVNIT0xEOyBpZHgrKykKKyAgIHsKKyAgICAgIGZvcihzSWR4ID0gMDsgc0lkeCA8IFdMQU5UTF9IU19OVU1fQ0xJRU5UOyBzSWR4KyspCisgICAgICB7CisgICAgICAgICB0bEN0eHQtPmhvU3VwcG9ydC5yZWdpc3RlcmVkSW5kW2lkeF0udHJpZ2dlckV2ZW50W3NJZHhdICAgID0gV0xBTlRMX0hPX1RIUkVTSE9MRF9OQTsKKyAgICAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LnJlZ2lzdGVyZWRJbmRbaWR4XS5jcm9zc0NCRnVuY3Rpb25bc0lkeF0gPSBOVUxMOworICAgICAgICAgdGxDdHh0LT5ob1N1cHBvcnQucmVnaXN0ZXJlZEluZFtpZHhdLnVzckN0eHRbc0lkeF0gICAgICAgICA9IE5VTEw7CisgICAgICAgICB0bEN0eHQtPmhvU3VwcG9ydC5yZWdpc3RlcmVkSW5kW2lkeF0ud2hvSXNDbGllbnRbc0lkeF0gICAgID0gMDsKKyAgICAgIH0KKyAgICAgIHRsQ3R4dC0+aG9TdXBwb3J0LnJlZ2lzdGVyZWRJbmRbaWR4XS5yc3NpVmFsdWUgICAgICAgICAgPSBXTEFOVExfSE9fREVGQVVMVF9SU1NJOworICAgICAgdGxDdHh0LT5ob1N1cHBvcnQucmVnaXN0ZXJlZEluZFtpZHhdLm51bUNsaWVudCAgICAgICAgICA9IDA7CisgICB9CisKKyAgIHZvc190aW1lcl9pbml0KCZ0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50VHJhZmZpYy50cmFmZmljVGltZXIsCisgICAgICAgICAgICAgICAgICBWT1NfVElNRVJfVFlQRV9TVywKKyAgICAgICAgICAgICAgICAgIFdMQU5UTF9IU1RyYWZmaWNTdGF0dXNUaW1lckV4cGlyZWQsCisgICAgICAgICAgICAgICAgICBwQWRhcHRlcik7CisKKworICAgdm9zX2xvY2tfaW5pdCgmdGxDdHh0LT5ob1N1cHBvcnQuaG9zTG9jayk7CisgICB0bEN0eHQtPmhvU3VwcG9ydC5tYWNDdHh0ID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfU01FLCBwQWRhcHRlcik7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTiAgICBXTEFOVExfSFNEZUluaXQKKworICAgREVTQ1JJUFRJT04gCisgICAgCisgICBQQVJBTUVURVJTIAorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK1ZPU19TVEFUVVMgV0xBTlRMX0hTRGVJbml0CisoCisgICB2X1BWT0lEX3QgICBwQWRhcHRlcgorKQoreworICAgV0xBTlRMX0NiVHlwZSAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKKyAgIFZPU19TVEFUVVMgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICBpZihOVUxMID09IHRsQ3R4dCkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJJbnZhbGlkIFRMIGhhbmRsZSIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIERlc3Ryb3kgdGhlIHRpbWVyLi4uICAgICAgCisgICBzdGF0dXMgPSB2b3NfdGltZXJfZGVzdHJveSggJnRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLnRyYWZmaWNUaW1lciApOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSApCisgICB7CisgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiV0xBTlRMX0hTU3RvcDogVGltZXIgRGVzdHJveSBGYWlsIFN0YXR1cyAlZCIsIHN0YXR1cykpOworICAgfQorICAgcmV0dXJuIHN0YXR1czsgICAKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OCisKKyAgIERFU0NSSVBUSU9OIAorICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgUkVUVVJOIFZBTFVFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfSFNTdG9wCisoCisgICB2X1BWT0lEX3QgICBwQWRhcHRlcgorKQoreworICAgV0xBTlRMX0NiVHlwZSAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKKyAgIFZPU19TVEFUVVMgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgVk9TX1RJTUVSX1NUQVRFICB0aW1lclN0YXRlOworCisgICBpZihOVUxMID09IHRsQ3R4dCkKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJJbnZhbGlkIFRMIGhhbmRsZSIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHRpbWVyU3RhdGUgPSB2b3NfdGltZXJfZ2V0Q3VycmVudFN0YXRlKCZ0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50VHJhZmZpYy50cmFmZmljVGltZXIpOworICAgaWYoVk9TX1RJTUVSX1NUQVRFX1JVTk5JTkcgPT0gdGltZXJTdGF0ZSkKKyAgIHsKKyAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIlN0b3AgVHJhZmZpYyBzdGF0dXMgbW9uaXRvcmluZyB0aW1lciIpKTsKKyAgICAgIHN0YXR1cyA9IHZvc190aW1lcl9zdG9wKCZ0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50VHJhZmZpYy50cmFmZmljVGltZXIpOworICAgfQorICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJUaW1lciBTdG9wIEZhaWxlZCwgU3RhdHVzICVkIiwgc3RhdHVzKSk7CisgICB9CisKKyAgIC8vRGVyZWdpc3RlciB0aGUgdHJhZmZpYyBTdGF0dXMKKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLmlkbGVUaHJlc2hvbGQgPSAwOworICAgdGxDdHh0LT5ob1N1cHBvcnQuY3VycmVudFRyYWZmaWMubWVhc3VyZVBlcmlvZCA9IDA7CisgICB0bEN0eHQtPmhvU3VwcG9ydC5jdXJyZW50VHJhZmZpYy50cmFmZmljQ0IgICAgID0gTlVMTDsKKyAgIHRsQ3R4dC0+aG9TdXBwb3J0LmN1cnJlbnRUcmFmZmljLnVzckN0eHQgICAgICAgPSBOVUxMOworCisgICByZXR1cm4gc3RhdHVzOyAgIAorfQorI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0dFTjZfUk9BTUlORwpkaWZmIC0tZ2l0IGEvQ09SRS9UTC9zcmMvd2xhbl9xY3RfdGxfaG9zdXBwb3J0LmggYi9DT1JFL1RML3NyYy93bGFuX3FjdF90bF9ob3N1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzdmZWMxCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9UTC9zcmMvd2xhbl9xY3RfdGxfaG9zdXBwb3J0LmgKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFdMQU5fUUNUX1RMX0hPU1VQUE9SVF9ICisjZGVmaW5lIFdMQU5fUUNUX1RMX0hPU1VQUE9SVF9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgIFcgTCBBIE4gICBUIFIgQSBOIFMgUCBPIFIgVCAgIEwgQSBZIEUgUiAKKyAgICAgICAgICAgICAgIEhPIFNVUFBPUlQgICAgSSBOIFQgRSBSIE4gQSBMICBBIFAgSQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIAorREVTQ1JJUFRJT04KKyAgICAgICAgCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAkSGVhZGVyOiQgJERhdGVUaW1lOiAkICRBdXRob3I6ICQKKworCit3aGVuICAgICAgICB3aG8gICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEyLzExLzA4ICAgICAgc2NoICAgICBJbml0aWFsIGNyZWF0aW9uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMgRk9SIE1PRFVMRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgIndsYW5fcWN0X3RsLmgiIAorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgRlVOQ1RJT04KKworICAgREVTQ1JJUFRJT04gCisgICAgCisgICBQQVJBTUVURVJTIAorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9IU0hhbmRsZVJYRnJhbWUKKygKKyAgIHZfUFZPSURfdCAgICAgICAgcEFkYXB0ZXIsCisgICB2X1U4X3QgICAgICAgICAgIGZyYW1lVHlwZSwKKyAgIHZfUFZPSURfdCAgICAgICAgcEJESGVhZGVyLAorICAgdl9VOF90ICAgICAgICAgICBTVEFpZCwKKyAgIHZfQk9PTF90ICAgICAgICAgaXNCcm9hZGNhc3QsCisgICB2b3NfcGt0X3QgICAgICAgKmRhdGFCdWZmZXIKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgRlVOQ1RJT04KKworICAgREVTQ1JJUFRJT04gCisgICAgCisgICBQQVJBTUVURVJTIAorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9IU0hhbmRsZVRYRnJhbWUKKygKKyAgIHZfUFZPSURfdCAgICAgICAgcEFkYXB0ZXIsCisgICB2X1U4X3QgICAgICAgICAgIGFjLAorICAgdl9VOF90ICAgICAgICAgICBTVEFpZCwKKyAgIHZvc19wa3RfdCAgICAgICAqZGF0YUJ1ZmZlciwKKyAgIHZfUFZPSURfdCAgICAgICAgYmRIZWFkZXIKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgRlVOQ1RJT04KKworICAgREVTQ1JJUFRJT04gCisgICAgCisgICBQQVJBTUVURVJTIAorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9IU1JlZ1JTU0lJbmRpY2F0aW9uQ0IKKygKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCisgICB2X1M3X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAorICAgV0xBTlRMX1JTU0lDcm9zc1RocmVzaG9sZENCVHlwZSBjcm9zc0NCRnVuY3Rpb24sCisgICBWT1NfTU9EVUxFX0lEICAgICAgICAgICAgICAgICAgIG1vZHVsZUlELAorICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OCisKKyAgIERFU0NSSVBUSU9OIAorICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgUkVUVVJOIFZBTFVFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfSFNEZXJlZ1JTU0lJbmRpY2F0aW9uQ0IKKygKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCisgICB2X1M3X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAorICAgV0xBTlRMX1JTU0lDcm9zc1RocmVzaG9sZENCVHlwZSBjcm9zc0NCRnVuY3Rpb24sCisgICBWT1NfTU9EVUxFX0lEICAgICAgICAgICAgICAgICAgIG1vZHVsZUlECispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OCisKKyAgIERFU0NSSVBUSU9OIAorICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgUkVUVVJOIFZBTFVFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfSFNCTVBTUlNTSVJlZ2lvbkNoYW5nZWROb3RpZmljYXRpb24KKygKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICBwQWRhcHRlciwKKyAgIHRwU2lyUlNTSU5vdGlmaWNhdGlvbiBwUlNTSU5vdGlmaWNhdGlvbgorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX0hTU2V0QWxwaGEKKygKKyAgIHZfUFZPSURfdCBwQWRhcHRlciwKKyAgIGludCAgICAgICB2YWx1ZUFscGhhCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OCisKKyAgIERFU0NSSVBUSU9OIAorICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgUkVUVVJOIFZBTFVFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfSFNSZWdHZXRUcmFmZmljU3RhdHVzCisoCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAorICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlVGhyZXNob2xkLAorICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QsCisgICBXTEFOVExfVHJhZmZpY1N0YXR1c0NoYW5nZWRDQlR5cGUgIHRyZmZpY1N0YXR1c0NCLAorICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OCisKKyAgIERFU0NSSVBUSU9OIAorICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgUkVUVVJOIFZBTFVFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXTEFOVExfSFNJbml0CisoCisgICB2X1BWT0lEX3QgICBwQWRhcHRlcgorKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIEZVTkNUSU9OICAgIFdMQU5UTF9IU0RlSW5pdAorCisgICBERVNDUklQVElPTiAKKyAgICAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIFJFVFVSTiBWQUxVRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworVk9TX1NUQVRVUyBXTEFOVExfSFNEZUluaXQKKygKKyAgIHZfUFZPSURfdCAgIHBBZGFwdGVyCispOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgRlVOQ1RJT04KKworICAgREVTQ1JJUFRJT04gCisgICAgCisgICBQQVJBTUVURVJTIAorCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9IU1N0b3AKKygKKyAgIHZfUFZPSURfdCAgIHBBZGFwdGVyCispOworCitWT1NfU1RBVFVTIFdMQU5UTF9TZXRGV1JTU0lUaHJlc2hvbGRzCisoCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyCispOworCisKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9HRU42X1JPQU1JTkcKKworI2VuZGlmIC8qIFdMQU5fUUNUX1RMX0hPU1VQUE9SVF9IICovCmRpZmYgLS1naXQgYS9DT1JFL1RML3NyYy93bGFuX3FjdF90bGkuaCBiL0NPUkUvVEwvc3JjL3dsYW5fcWN0X3RsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NDUzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1RML3NyYy93bGFuX3FjdF90bGkuaApAQCAtMCwwICsxLDE1OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogKi8KKyNpZm5kZWYgV0xBTl9RQ1RfVExJX0gKKyNkZWZpbmUgV0xBTl9RQ1RfVExJX0gKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgVyBMIEEgTiAgIFQgUiBBIE4gUyBQIE8gUiBUICAgTCBBIFkgRSBSCisgICAgICAgICAgICAgICAgICAgICBJIE4gVCBFIFIgTiBBIEwgICBBIFAgSQorCisKK0RFU0NSSVBUSU9OCisgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZGVjbGFyYXRpb25zIHVzZWQgd2l0aGluIHdsYW4gdHJhbnNwb3J0CisgIGxheWVyIG1vZHVsZS4KKworICBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjokICREYXRlVGltZTogJCAkQXV0aG9yOiAkCisKKword2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMi8xOS8xMCAgICBiYWQgICAgIEZpeGVkIDgwMi4xMSB0byA4MDIuMyBmdCBpc3N1ZXMgd2l0aCBXQVBJCiswMS8xNC8xMCAgICBybmFpciAgIEZpeGVkIHRoZSBieXRlIG9yZGVyIGZvciB0aGUgV0FJIHBhY2tldCB0eXBlLgorMDEvMDgvMTAgICAgbHRpICAgICBBZGRlZCBUTCBEYXRhIENhY2hpbmcKKzEwLzA5LzA5ICAgIHJuYWlyICAgQWRkIHN1cHBvcnQgZm9yIFdBUEkKKzAyLzAyLzA5ICAgIHNjaCAgICAgQWRkIEhhbmRvZmYgc3VwcG9ydAorMTIvMDkvMDggICAgbHRpICAgICBGaXhlcyBmb3IgQU1TUyBjb21waWxhdGlvbgorMTIvMDIvMDggICAgbHRpICAgICBGaXggZm8gdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uCisxMC8zMS8wOCAgICBsdGkgICAgIEZpeCBmbyBUTCB0eCBzdXNwZW5kCisxMC8wMS8wOCAgICBsdGkgICAgIE1lcmdlZCBpbiBmaXhlcyBmcm9tIHJlb3JkZXJpbmcKKzA5LzA1LzA4ICAgIGx0aSAgICAgRml4ZXMgZm9sbG93aW5nIFFPUyB1bml0IHRlc3RpbmcKKzA4LzA2LzA4ICAgIGx0aSAgICAgQWRkZWQgUU9TIHN1cHBvcnQKKzA3LzE4LzA4ICAgIGx0aSAgICAgRml4ZXMgZm9sbG93aW5nIGludGVncmF0aW9uCisgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZyYW1lIHRyYW5zbGF0aW9uCiswNi8yNi8wOCAgICBsdGkgICAgIEZpeGVzIGZvbGxvd2luZyB1bml0IHRlc3RpbmcKKzA1LzA1LzA4ICAgIGx0aSAgICAgQ3JlYXRlZCBtb2R1bGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMgRk9SIE1PRFVMRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInZvc19wYWNrZXQuaCIKKyNpbmNsdWRlICJ2b3NfYXBpLmgiCisjaW5jbHVkZSAidm9zX3RpbWVyLmgiCisjaW5jbHVkZSAidm9zX21xLmgiCisjaW5jbHVkZSAidm9zX2xpc3QuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIgorI2luY2x1ZGUgInBtY0FwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X2hhbC5oIgorCisKKyNkZWZpbmUgU1RBVElDICBzdGF0aWMKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qTWF4aW11bSBudW1iZXIgb2YgVElEcyAqLworI2RlZmluZSBXTEFOX01BWF9USUQgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKworLyoqIFRoZSBkZWZpbmUgaXMgbW92ZWQgdG8gZXh0ZXJuYWwgaGVhZGVyIGZpbGUgdG8gYmUgdXNlZCBieSBIREQgKi8KKyNpZm5kZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorLypNYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgc3RhdGlvbnMgKi8KKyNkZWZpbmUgV0xBTl9NQVhfU1RBX0NPVU5UICAgICAgICAgICAgICAgICAgICA1CisjZW5kaWYKKworLypPZmZzZXQgb2YgdGhlIE9VSSBmaWVsZCBpbnNpZGUgdGhlIExMQy9TTkFQIGhlYWRlciovCisjZGVmaW5lIFdMQU5UTF9MTENfT1VJX09GRlNFVCAgICAgICAgICAgICAgICAgMworCisvKlNpemUgb2YgdGhlIE9VSSB0eXBlIGZpZWxkIGluc2lkZSB0aGUgTExDL1NOQVAgaGVhZGVyKi8KKyNkZWZpbmUgV0xBTlRMX0xMQ19PVUlfU0laRSAgICAgICAgICAgICAgICAgICAzCisKKy8qT2Zmc2V0IG9mIHRoZSBwcm90b2NvbCB0eXBlIGZpZWxkIGluc2lkZSB0aGUgTExDL1NOQVAgaGVhZGVyKi8KKyNkZWZpbmUgV0xBTlRMX0xMQ19QUk9UT19UWVBFX09GRlNFVCAgV0xBTlRMX0xMQ19PVUlfT0ZGU0VUICsgIFdMQU5UTF9MTENfT1VJX1NJWkUKKworLypTaXplIG9mIHRoZSBwcm90b2NvbCB0eXBlIGZpZWxkIGluc2lkZSB0aGUgTExDL1NOQVAgaGVhZGVyKi8KKyNkZWZpbmUgV0xBTlRMX0xMQ19QUk9UT19UWVBFX1NJWkUgICAgICAgICAgICAyCisKKy8qODAyLjF4IHByb3RvY29sIHR5cGUgKi8KKyNkZWZpbmUgV0xBTlRMX0xMQ184MDIxWF9UWVBFICAgICAgICAgICAgMHg4ODhFCisKKy8qV0FQSSBwcm90b2NvbCB0eXBlICovCisjZGVmaW5lIFdMQU5UTF9MTENfV0FJX1RZUEUgICAgICAgICAgICAgIDB4ODhiNAorCisvKkxlbmd0aCBvZmZzZXQgaW5zaWRlIHRoZSBBTVNEVSBzdWItZnJhbWUgaGVhZGVyKi8KKyNkZWZpbmUgV0xBTlRMX0FNU0RVX1NVQkZSQU1FX0xFTl9PRkZTRVQgICAgIDEyCisKKy8qODAyLjMgaGVhZGVyIGRlZmluaXRpb25zKi8KKyNkZWZpbmUgIFdMQU5UTF84MDJfM19IRUFERVJfTEVOICAgICAgICAgICAgIDE0CisKKy8qIE9mZnNldCBvZiBEQSBmaWVsZCBpbiBhIDgwMi4zIGhlYWRlciovCisjZGVmaW5lICBXTEFOVExfODAyXzNfSEVBREVSX0RBX09GRlNFVCAgICAgICAgMAorCisvKjgwMi4xMSBoZWFkZXIgZGVmaW5pdGlvbnMgLSBoZWFkZXIgbGVuIHdpdGhvdXQgUU9TIGN0cmwgZmllbGQqLworI2RlZmluZSAgV0xBTlRMXzgwMl8xMV9IRUFERVJfTEVOICAgICAgICAgICAgMjQKKworLyo4MDIuMTEgaGVhZGVyIGxlbmd0aCArIFFPUyBjdHJsIGZpZWxkKi8KKyNkZWZpbmUgIFdMQU5UTF9NUERVX0hFQURFUl9MRU4gICAgICAgICAgICAgIDMyCisKKy8qODAyLjExIGhlYWRlciBkZWZpbml0aW9ucyovCisjZGVmaW5lICBXTEFOVExfODAyXzExX01BWF9IRUFERVJfTEVOICAgICAgICA0MAorCisvKjgwMi4xMSBoZWFkZXIgZGVmaW5pdGlvbnMgLSBxb3MgY3RybCBmaWVsZCBsZW4qLworI2RlZmluZSAgV0xBTlRMXzgwMl8xMV9IRUFERVJfUU9TX0NUTCAgICAgICAgIDIKKworLyo4MDIuMTEgaGVhZGVyIGRlZmluaXRpb25zIC0gaHQgY3RybCBmaWVsZCBsZW4qLworI2RlZmluZSAgV0xBTlRMXzgwMl8xMV9IRUFERVJfSFRfQ1RMICAgICAgICAgIDQKKworLyogT2Zmc2V0IG9mIEFkZHIxIGZpZWxkIGluIGEgODAyLjExIGhlYWRlciovCisjZGVmaW5lICBXTEFOVExfODAyXzExX0hFQURFUl9BRERSMV9PRkZTRVQgICAgNAorCisvKjgwMi4xMSBBRERSNCBNQUMgYWRkciBmaWVsZCBsZW4gKi8KKyNkZWZpbmUgIFdMQU5UTF84MDJfMTFfSEVBREVSX0FERFI0X0xFTiAgICAgICBWT1NfTUFDX0FERFJfU0laRQorCisvKiBMZW5ndGggb2YgYW4gQU1TRFUgc3ViLWZyYW1lICovCisjZGVmaW5lIFRMX0FNU0RVX1NVQkZSTV9IRUFERVJfTEVOICAgICAgICAgICAxNAorCisvKiBMZW5ndGggb2YgdGhlIExMQyBoZWFkZXIqLworI2RlZmluZSBXTEFOVExfTExDX0hFQURFUl9MRU4gICA4CisKKy8qQXMgcGVyIDgwMi4xMSBzcGVjICovCisjZGVmaW5lIFdMQU5UTF9NR01UX0ZSQU1FX1RZUEUgICAgICAgMHgwMAorI2RlZmluZSBXTEFOVExfQ1RSTF9GUkFNRV9UWVBFICAgICAgIDB4MTAKKyNkZWZpbmUgV0xBTlRMX0RBVEFfRlJBTUVfVFlQRSAgICAgICAweDIwCisKKy8qVmFsdWUgb2YgdGhlIGRhdGEgdHlwZSBmaWVsZCBpbiB0aGUgODAyLjExIGZyYW1lICovCisjZGVmaW5lIFdMQU5UTF84MDIxMV9EQVRBX1RZUEUgICAgICAgICAweDAyCisjZGVmaW5lIFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFICAweDA4CisjZGVmaW5lIFdMQU5UTF84MDIxMV9OVUxMX1FPU19TVUJUWVBFICAweDBDCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEJULUFNUCByZWxhdGVkIGRlZmluaXRpb24gLSAhISEgc2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIHRvIEJULUFNUCBoZWFkZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBIZWxwZXIgbWFjcm9zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIC8qQ2hlY2tzIFNUQSBpbmRleCB2YWxpZGl0eSovCisjZGVmaW5lIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggX3N0YWlkICkoIF9zdGFpZCA+PSBXTEFOX01BWF9TVEFfQ09VTlQgKQorCisvKkFzIHBlciBMaWJyYSBiZWhhdmlvciAqLworI2RlZmluZSBXTEFOVExfU1RBX0lEX0JDQVNUICAgICAweEZGCisKKy8qQ2hlY2tzIFRJRCB2YWxpZGl0eSovCisjZGVmaW5lIFdMQU5UTF9USURfSU5WQUxJRCggX3RpZCApICAgICAoIF90aWQgPj0gV0xBTl9NQVhfVElEICkKKworLypDaGVja3MgQUMgdmFsaWRpdHkqLworI2RlZmluZSBXTEFOVExfQUNfSU5WQUxJRCggX3RpZCApICAgICAoIF90aWQgPj0gV0xBTlRMX01BWF9BQyApCisKKy8qRGV0ZXJtaW5lcyB0aGUgYWRkciBmaWVsZCBvZmZzZXQgYmFzZWQgb24gdGhlIGZyYW1lIHh0bCBiaXQqLworI2RlZmluZSBXTEFOVExfTUFDX0FERFJfQUxJR04oIF9keHRsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICggMCA9PSBfZHh0bCApID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdMQU5UTF84MDJfM19IRUFERVJfREFfT0ZGU0VUOiBXTEFOVExfODAyXzExX0hFQURFUl9BRERSMV9PRkZTRVQgKQorCisvKkRldGVybWluZXMgdGhlIGhlYWRlciBsZW4gYmFzZWQgb24gdGhlIGRpc2FibGUgeHRsIGZpZWxkKi8KKyNkZWZpbmUgV0xBTlRMX01BQ19IRUFERVJfTEVOKCBfZHh0bCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAoIDAgPT0gX2R4dGwgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgV0xBTlRMXzgwMl8zX0hFQURFUl9MRU46V0xBTlRMXzgwMl8xMV9IRUFERVJfTEVOICkKKworLypEZXRlcm1pbmVzIHRoZSBuZWNlc2FyeSBsZW5ndGggb2YgdGhlIEJEIGhlYWRlciAtIGluIGNhc2UKKyAgVU1BIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQgZW5vdWdoIHJvb20gbmVlZHMgdG8gYmUgbGVmdCBpbiBmcm9udCBvZiB0aGUKKyAgcGFja2V0IGZvciB0aGUgODAyLjExIGhlYWRlciB0byBiZSBpbnNlcnRlZCovCisjZGVmaW5lIFdMQU5UTF9CRF9IRUFERVJfTEVOKCBfZHh0bCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAoIDAgPT0gX2R4dGwgKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKFdMQU5IQUxfVFhfQkRfSEVBREVSX1NJWkUrV0xBTlRMXzgwMl8xMV9NQVhfSEVBREVSX0xFTik6IFdMQU5IQUxfVFhfQkRfSEVBREVSX1NJWkUgKQorCisKKyNkZWZpbmUgV0xBTl9UTF9DRUlMKCBfYSwgX2IpICAoKCAwICE9IChfYSklKF9iKSk/IChfYSkvKF9iKSArIDE6IChfYSkvKF9iKSkKKworLypnZXQgVEwgY29udHJvbCBibG9jayBmcm9tIHZvcyBnbG9iYWwgY29udGV4dCAqLworI2RlZmluZSBWT1NfR0VUX1RMX0NCKF9wdm9zR0N0eCkgXAorICAgICAgICAoV0xBTlRMX0NiVHlwZSopdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX1RMLCBfcHZvc0dDdHgpCisKKy8qIENoZWNrIHdoZXRoZXIgUnggZnJhbWUgaXMgTFMgb3IgRUFQT0wgcGFja2V0IChvdGhlciB0aGFuIGRhdGEpICovCisjZGVmaW5lIFdMQU5UTF9CQVBfSVNfTk9OX0RBVEFfUEtUX1RZUEUodXNUeXBlKSBcCisgICAgICAgIChXTEFOVExfQlRfQU1QX1RZUEVfQVIgPT0gdXNUeXBlKSB8fCAoV0xBTlRMX0JUX0FNUF9UWVBFX1NFQyA9PSB1c1R5cGUpIHx8IFwKKyAgICAgICAgKFdMQU5UTF9CVF9BTVBfVFlQRV9MU19SRVEgPT0gdXNUeXBlKSB8fCAoV0xBTlRMX0JUX0FNUF9UWVBFX0xTX1JFUCA9PSB1c1R5cGUpCisKKy8qZ2V0IFJTU0kwIGZyb20gYSBSWCBCRCovCisvKiA3IGJpdHMgaW4gcGh5c3RhdHMgcmVwcmVzZW50IC0xMDBkQm0gdG8gKzI3ZEJtICovCisjZGVmaW5lIFdMQU5fVExfUlNTSV9DT1JSRUNUSU9OIDEwMAorI2RlZmluZSBXTEFOVExfR0VUUlNTSTAocEJEKSAgICAoV0RBX0dFVFJTU0kwKHBCRCkgLSBXTEFOX1RMX1JTU0lfQ09SUkVDVElPTikKKworLypnZXQgUlNTSTEgZnJvbSBhIFJYIEJEKi8KKyNkZWZpbmUgV0xBTlRMX0dFVFJTU0kxKHBCRCkgICAgKFdEQV9HRVRSU1NJMShwQkQpIC0gV0xBTl9UTF9SU1NJX0NPUlJFQ1RJT04pCisKKy8qIENoZWNrIHdoZXRoZXIgUnggZnJhbWUgaXMgTFMgb3IgRUFQT0wgcGFja2V0IChvdGhlciB0aGFuIGRhdGEpICovCisjZGVmaW5lIFdMQU5UTF9CQVBfSVNfTk9OX0RBVEFfUEtUX1RZUEUodXNUeXBlKSBcCisgICAgICAgIChXTEFOVExfQlRfQU1QX1RZUEVfQVIgPT0gdXNUeXBlKSB8fCAoV0xBTlRMX0JUX0FNUF9UWVBFX1NFQyA9PSB1c1R5cGUpIHx8IFwKKyAgICAgICAgKFdMQU5UTF9CVF9BTVBfVFlQRV9MU19SRVEgPT0gdXNUeXBlKSB8fCAoV0xBTlRMX0JUX0FNUF9UWVBFX0xTX1JFUCA9PSB1c1R5cGUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRMIHNpZ25hbHMgZm9yIFRYIHRocmVhZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAvKlN1c3BlbmQgc2lnbmFsIC0gZm9sbG93aW5nIHNlcmlhbGl6YXRpb24gb2YgYSBIQUwgc3VzcGVuZCByZXF1ZXN0Ki8KKyAgV0xBTlRMX1RYX1NJR19TVVNQRU5EID0gMCwKKworICAvKlJlcyBuZWVkIHNpZ25hbCAtIHRyaWdnZXJlZCB3aGVuIGFsbCBwZW5kaW5nIFR4Q29tcCBoYXZlIGJlZW4gcmVjZWl2ZWQKKyAgIGFuZCBUTCBpcyBsb3cgb24gcmVzb3VyY2VzKi8KKyAgV0xBTlRMX1RYX1JFU19ORUVERUQgID0gMSwKKworICAvKiBGb3J3YXJkaW5nIFJYIGNhY2hlZCBmcmFtZXMgKi8KKyAgV0xBTlRMX1RYX0ZXRF9DQUNIRUQgID0gMiwKKworICAvKiBTZXJpYWxpemVkIFNUQUlEIEFDIEluZGljYXRpb24gKi8KKyAgV0xBTlRMX1RYX1NUQUlEX0FDX0lORCA9IDMsCisKKyAgLyogU2VyaWFsemllIFRYIHRyYW5zbWl0IHJlcXVlc3QgKi8KKyAgV0xBTlRMX1RYX1NUQVJUX1hNSVQgPSA0LAorCisgIC8qIFNlcmlhbHppZSBGaW5pc2ggVUwgQXV0aGVudGljYXRpb24gcmVxdWVzdCAqLworICBXTEFOVExfRklOSVNIX1VMQSAgID0gNSwKKworICBXTEFOVExfVFhfTUFYCit9V0xBTlRMX1R4U2lnbmFsc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFNUQSBFdmVudCB0eXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgIC8qIFRyYW5zbWl0IGZyYW1lIGV2ZW50ICovCisgIFdMQU5UTF9UWF9FVkVOVCA9IDAsCisKKyAgLyogUmVjZWl2ZSBmcmFtZSBldmVudCAqLworICBXTEFOVExfUlhfRVZFTlQgPSAxLAorCisgIFdMQU5UTF9NQVhfRVZFTlQKK31XTEFOVExfU1RBRXZlbnRUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIERFU0NSSVBUSU9OCisgICAgU3RhdGUgbWFjaGluZSB1c2VkIGJ5IHRyYW5zcG9ydCBsYXllciBmb3IgcmVjZWl2aW5nIG9yIHRyYW5zbWl0dGluZworICAgIHBhY2tldHMuCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgcEFkYXB0ZXI6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgYWRhcHRlciBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICB1Y1NUQUlkOiAgICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCisgICB2b3NEYXRhQnVmZjogICAgcG9pbnRlciB0byB0aGUgdHgvcnggdm9zIGJ1ZmZlcgorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIFZPU19TVEFUVVMgKCpXTEFOVExfU1RBRnVuY1R5cGUpKCB2X1BWT0lEX3QgICAgIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBTVEEgRlNNIEVudHJ5IHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICBXTEFOVExfU1RBRnVuY1R5cGUgIHBmblNUQVRibFtXTEFOVExfTUFYX0VWRU5UXTsKK30gV0xBTlRMX1NUQUZzbUVudHJ5VHlwZTsKKworLyogUmVjZWl2ZSBpbiBjb25uZWN0ZWQgc3RhdGUgLSBvbmx5IEVBUE9MIG9yIFdBSSovCitWT1NfU1RBVFVTIFdMQU5UTF9TVEFSeENvbm4oIHZfUFZPSURfdCAgICAgcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAgICAgICAgdWNTVEFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYgKTsKKworLyogVHJhbnNtaXQgaW4gY29ubmVjdGVkIHN0YXRlIC0gb25seSBFQVBPTCBvciBXQUkqLworVk9TX1NUQVRVUyBXTEFOVExfU1RBVHhDb25uKCB2X1BWT0lEX3QgICAgIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmICk7CisKKy8qIFJlY2VpdmUgaW4gYXV0aGVudGljYXRlZCBzdGF0ZSAtIGFsbCBkYXRhIGFsbG93ZWQqLworVk9TX1NUQVRVUyBXTEFOVExfU1RBUnhBdXRoKCB2X1BWT0lEX3QgICAgIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmICk7CisKKy8qIFRyYW5zbWl0IGluIGF1dGhlbnRpY2F0ZWQgc3RhdGUgLSBhbGwgZGF0YSBhbGxvd2VkKi8KK1ZPU19TVEFUVVMgV0xBTlRMX1NUQVR4QXV0aCggdl9QVk9JRF90ICAgICBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiApOworCisvKiBSZWNlaXZlIGluIGRpc2Nvbm5lY3RlZCBzdGF0ZSAtIG5vIGRhdGEgYWxsb3dlZCovCitWT1NfU1RBVFVTIFdMQU5UTF9TVEFSeERpc2MoIHZfUFZPSURfdCAgICAgcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAgICAgICAgdWNTVEFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYgKTsKKworLyogVHJhbnNtaXQgaW4gZGlzY29ubmVjdGVkIHN0YXRlIC0gbm8gZGF0YSBhbGxvd2VkKi8KK1ZPU19TVEFUVVMgV0xBTlRMX1NUQVR4RGlzYyggdl9QVk9JRF90ICAgICBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiApOworCisvKiBUTCBTdGF0ZSBNYWNoaW5lICovCitTVEFUSUMgY29uc3QgV0xBTlRMX1NUQUZzbUVudHJ5VHlwZSB0bFNUQUZzbVtXTEFOVExfU1RBX01BWF9TVEFURV0gPQoreworICAvKiBXTEFOVExfU1RBX0lOSVQgKi8KKyAgeyB7CisgICAgTlVMTCwgICAgICAvKiBXTEFOVExfVFhfRVZFTlQgLSBubyBwYWNrZXRzIHNob3VsZCBnZXQgdHJhbnNtaXR0ZWQqLworICAgIE5VTEwsICAgICAgLyogV0xBTlRMX1JYX0VWRU5UIC0gbm8gcGFja2V0cyBzaG91bGQgYmUgcmVjZWl2ZWQgLSBkcm9wKi8KKyAgfSB9LAorCisgIC8qIFdMQU5UTF9TVEFfQ09OTkVDVEVEICovCisgIHsgeworICAgIFdMQU5UTF9TVEFUeENvbm4sICAgICAgLyogV0xBTlRMX1RYX0VWRU5UIC0gb25seSBFQVBvTCBvciBXQUkgZnJhbWVzIGFyZSBhbGxvd2VkKi8KKyAgICBXTEFOVExfU1RBUnhDb25uLCAgICAgIC8qIFdMQU5UTF9SWF9FVkVOVCAtIG9ubHkgRUFQb0wgb3IgV0FJIGZyYW1lcyBjYW4gYmUgcngqLworICB9IH0sCisKKyAgLyogV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEICovCisgIHsgeworICAgIFdMQU5UTF9TVEFUeEF1dGgsICAgICAgLyogV0xBTlRMX1RYX0VWRU5UIC0gYWxsIGRhdGEgZnJhbWVzIGFsbG93ZWQqLworICAgIFdMQU5UTF9TVEFSeEF1dGgsICAgICAgLyogV0xBTlRMX1JYX0VWRU5UIC0gYWxsIGRhdGEgZnJhbWVzIGNhbiBiZSByeCAqLworICB9IH0sCisKKyAgLyogV0xBTlRMX1NUQV9ESVNDT05ORUNURUQgKi8KKyAgeyB7CisgICAgV0xBTlRMX1NUQVR4RGlzYywgICAgICAvKiBXTEFOVExfVFhfRVZFTlQgLSBkbyBub3RoaW5nICovCisgICAgV0xBTlRMX1NUQVJ4RGlzYywgICAgICAvKiBXTEFOVExfUlhfRVZFTlQgLSBmcmFtZXMgd2lsbCBzdGlsbCBiZSBmd2QtZWQqLworICB9IH0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJlb3JkZXJpbmcgaW5mb3JtYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgV0xBTlRMX01BWF9XSU5TSVpFICAgICAgNjQKKyNkZWZpbmUgV0xBTlRMX01BWF9CQV9TRVNTSU9OICAgNDAKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZfQk9PTF90ICAgICBpc0F2YWlsYWJsZTsKKyNpZmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKyAgIHZfVTY0X3QgICAgICB1bGxSZXBsYXlDb3VudGVyW1dMQU5UTF9NQVhfV0lOU0laRV07CisjZW5kaWYKKyAgIHZfUFZPSURfdCAgICBhcnJheUJ1ZmZlcltXTEFOVExfTUFYX1dJTlNJWkVdOworfSBXTEFOVExfUkVPUkRFUl9CVUZGRVJfVDsKKworCisvKiBUbyBoYW5kbGUgRnJhbWUgUSBhZ2luZywgdGltZXIgaXMgbmVlZGVkCisgKiBBZnRlciB0aW1lciBleHBpcmVkLCBRZWQgZnJhbWVzIGhhdmUgdG8gYmUgcm91dGVkIHRvIHVwcGVyIGxheWVyCisgKiBXTEFOVExfVElNRVJfRVhQSUVSX1VEQVRBX1QgaXMgdXNlciBkYXRhIHR5cGUgZm9yIHRpbWVyIGNhbGxiYWNrCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAvKiBHbG9iYWwgY29udGVjdCwgSEFMLCBIREQgbmVlZCB0aGlzICovCisgICB2X1BWT0lEX3QgICAgICAgICAgcEFkYXB0ZXI7CisKKyAgIC8qIFRMIGNvbnRleHQgaGFuZGxlICovCisgICB2X1BWT0lEX3QgICAgICAgICAgcFRMSGFuZGxlOworCisgICAvKiBDdXJyZW50IFNUQUlELCB0byBrbm93IFNUQSBjb250ZXh0ICovCisgICB2X1UzMl90ICAgICAgICAgICAgU1RBSUQ7CisKKyAgIHZfVThfdCAgICAgICAgICAgICBUSUQ7Cit9IFdMQU5UTF9USU1FUl9FWFBJRVJfVURBVEFfVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypzcGVjaWZpZXMgaWYgcmUtb3JkZXIgc2Vzc2lvbiBleGlzdHMqLworICB2X1U4X3QgICAgICAgICAgICAgdWNFeGlzdHM7CisKKyAgLyogQ3VycmVudCBJbmRleCAqLworICB2X1UzMl90ICAgICAgICAgICAgIHVjQ0luZGV4OworCisgIC8qIENvdW50IG9mIHRoZSB0b3RhbCBwYWNrZXRzIGluIGxpc3QqLworICB2X1UxNl90ICAgICAgICAgICAgdXNDb3VudDsKKworICAvKiB2b3MgdHRpbWVyIHRvIGhhbmRsZSBRZWQgZnJhbWVzIGFnaW5nICovCisgIHZvc190aW1lcl90ICAgICAgICBhZ2luZ1RpbWVyOworCisgIC8qIFEgd2luZG9lIHNpemUgKi8KKyAgdl9VMzJfdCAgICAgICAgICAgIHdpblNpemU7CisKKyAgLyogQXZhaWxhYmxlIFJYIGZyYW1lIGJ1ZmZlciBzaXplICovCisgIHZfVTMyX3QgICAgICAgICAgICBidWZmZXJTaXplOworCisgIC8qIFN0YXJ0IFNlcXVlbmNlIG51bWJlciAqLworICB2X1UzMl90ICAgICAgICAgICAgU1NOOworCisgIC8qIEJBIHNlc3Npb24gSUQsIGdlbmVyYXRlIGJ5IEhBTCAqLworICB2X1UzMl90ICAgICAgICAgICAgc2Vzc2lvbklEOworCisgIHZfVTMyX3QgICAgICAgICAgICBjdXJyZW50RVNOOworCisgIHZfVTMyX3QgICAgICAgICAgICBwZW5kaW5nRnJhbWVzQ291bnQ7CisKKyAgdm9zX2xvY2tfdCAgICAgICAgIHJlb3JkZXJMb2NrOworCisgIC8qIEFnaW5nIHRpbWVyIGNhbGxiYWNrIHVzZXIgZGF0YSAqLworICBXTEFOVExfVElNRVJfRVhQSUVSX1VEQVRBX1QgdGltZXJVZGF0YTsKKworICBXTEFOVExfUkVPUkRFUl9CVUZGRVJfVCAgICAgKnJlb3JkZXJCdWZmZXI7Cit9V0xBTlRMX0JBUmVvcmRlclR5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVUFQU0QgaW5mb3JtYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBmbGFnIHNldCB3aGVuIGEgVUFQU0Qgc2Vzc2lvbiB3aXRoIHRyaWdnZXJzIGdlbmVyYXRlZCBpbiBmdyBpcyBiZWluZyBzZXQqLworICB2X1U4X3QgICAgICAgICAgICAgIHVjU2V0OworfVdMQU5UTF9VQVBTREluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBTVEEgQ2xpZW50IHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBGbGFnIHRoYXQga2VlcHMgdHJhY2sgb2YgcmVnaXN0cmF0aW9uOyBvbmx5IG9uZSBTVEEgd2l0aCB1bmlxdWUKKyAgICAgSUQgYWxsb3dlZCAqLworICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICB1Y0V4aXN0czsKKworICAvKlRoZSBmbGFnIGNvbnRyb2xzIHRoZSBSeCBwYXRoIGZvciB0aGUgc3RhdGlvbiAtIGFzIGxvbmcgYXMgdGhlcmUgYXJlCisgICAgcGFja2V0cyBhdCBzdGEgbGV2ZWwgdGhhdCBuZWVkIHRvIGJlIGZ3ZC1lZCB0aGUgUnggcGF0aCB3aWxsIGJlIGJsb2NrZWQsCisgICAgaXQgd2lsbCBiZWNvbWUgdW5ibG9ja2VkIG9ubHkgd2hlbiB0aGUgY2FjaGVkIGZyYW1lcyB3ZXJlIGZ3ZC1lZDsKKyAgICB3aGlsZSB0aGUgcnggcGF0aCBpcyBibG9ja2VkIGFsbCByeC1lZCBmcmFtZXMgZm9yIHRoYXQgU1RBIHdpbGwgYmUgY2FjaGVkCisgICAgKi8KKyAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgdWNSeEJsb2NrZWQ7CisKKyAgLyogRnVuY3Rpb24gcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBwYWNrZXQgaGFuZGxlciBmcm9tIEhERCAqLworICBXTEFOVExfU1RBUnhDQlR5cGUgICAgICAgICAgICBwZm5TVEFSeDsKKworICAvKiBGdW5jdGlvbiBwb2ludGVyIHRvIHRoZSB0cmFuc21pdCBjb21wbGV0ZSBjb25maXJtYXRpb24gaGFuZGxlcgorICAgIGZyb20gSEREICovCisgIFdMQU5UTF9UeENvbXBDQlR5cGUgICAgICAgICAgIHBmblNUQVR4Q29tcDsKKworICAvKiBGdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBwYWNrZXQgcmV0cmlldmFsIHJvdXRpbmUgaW4gSEREICovCisgIFdMQU5UTF9TVEFGZXRjaFBrdENCVHlwZSAgICAgIHBmblNUQUZldGNoUGt0OworCisgIC8qIFJlb3JkZXJpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBTVEEgKi8KKyAgV0xBTlRMX0JBUmVvcmRlclR5cGUgICAgICAgICAgYXRsQkFSZW9yZGVySW5mb1tXTEFOX01BWF9USURdOworCisgIC8qIFNUQSBEZXNjcmlwdG9yLCBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBuZXcgYWRkZWQgU1RBICovCisgIFdMQU5fU1RBRGVzY1R5cGUgICAgICAgICAgICAgIHdTVEFEZXNjOworCisgIC8qIEN1cnJlbnQgY29ubmVjdGl2aXR5IHN0YXRlIG9mIHRoZSBTVEEgKi8KKyAgV0xBTlRMX1NUQVN0YXRlVHlwZSAgICAgICAgICAgdGxTdGF0ZTsKKworICAvKiBTdGF0aW9uIHByaW9yaXR5ICovCisgIFdMQU5UTF9TVEFQcmlvcml0eVR5cGUgICAgICAgIHRsUHJpOworCisgIC8qIFZhbHVlIG9mIHRoZSBhdmVyYWdlZCBSU1NJIGZvciB0aGlzIHN0YXRpb24gKi8KKyAgdl9TN190ICAgICAgICAgICAgICAgICAgICAgICAgcnNzaUF2ZzsKKworICAvKiBWYWx1ZSBvZiB0aGUgYXZlcmFnZWQgUlNTSSBmb3IgdGhpcyBzdGF0aW9uIGluIEJNUFMgKi8KKyAgdl9TN190ICAgICAgICAgICAgICAgICAgICAgICAgcnNzaUF2Z0JtcHM7CisKKyAgLyogVmFsdWUgb2YgdGhlIGF2ZXJhZ2VkIFJTU0kgZm9yIHRoaXMgc3RhdGlvbiAqLworICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICB1TGlua1F1YWxpdHlBdmc7CisKKyAgLyogVHggcGFja2V0IGNvdW50IHBlciBzdGF0aW9uIHBlciBUSUQgKi8KKyAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgYXVUeENvdW50W1dMQU5fTUFYX1RJRF07CisKKyAgLyogUnggcGFja2V0IGNvdW50IHBlciBzdGF0aW9uIHBlciBUSUQgKi8KKyAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgYXVSeENvdW50W1dMQU5fTUFYX1RJRF07CisKKyAgLyogU3VzcGVuZCBmbGFnICovCisgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgIHVjVHhTdXNwZW5kZWQ7CisKKyAgLyogUG9pbnRlciB0byB0aGUgQU1TRFUgY2hhaW4gbWFpbnRhaW5lZCBieSB0aGUgQU1TRFUgZGUtYWdncmVnYXRpb24KKyAgICAgY29tcGxldGlvbiBzdWItbW9kdWxlICovCisgIHZvc19wa3RfdCogICAgICAgICAgICAgICAgICAgIHZvc0FNU0RVQ2hhaW5Sb290OworCisgIC8qIFBvaW50ZXIgdG8gdGhlIHJvb3Qgb2YgdGhlIGNoYWluICovCisgIHZvc19wa3RfdCogICAgICAgICAgICAgICAgICAgIHZvc0FNU0RVQ2hhaW47CisKKyAgLyogVXNlZCBmb3Igc2F2aW5nL3Jlc3RvcmluZyBmcmFtZSBoZWFkZXIgZm9yIDgwMi4zLzExIEFNU0RVIHN1Yi1mcmFtZXMgKi8KKyAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgYXVjTVBEVUhlYWRlcltXTEFOVExfTVBEVV9IRUFERVJfTEVOXTsKKworICAvKiBsZW5ndGggb2YgdGhlIGhlYWRlciAqLworICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVIZWFkZXJMZW47CisKKyAgLyogRW5hYmxlZCBBQ3MgY3VycmVudGx5IHNlcnZpY2VkIGJ5IFRMIChhdXRvbWF0aWMgc2V0dXAgaW4gVEwpKi8KKyAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgYXVjQUNNYXNrW1dMQU5UTF9NQVhfQUNdOworCisgIC8qIEN1cnJlbnQgQUMgdG8gYmUgcmV0cmlldmVkICovCisgIFdMQU5UTF9BQ0VudW1UeXBlICAgICAgICAgICAgIHVjQ3VycmVudEFDOworCisgIC8qUGFja2V0IHBlbmRpbmcgZmxhZyAtIHNldCBpZiB0eCBpcyBwZW5kaW5nIGZvciB0aGUgc3RhdGlvbiovCisgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgIHVjUGt0UGVuZGluZzsKKyAgCisgIC8qdXNlZCBvbiB0eCBwYWNrZXQgdG8gc2lnbmFsIHdoZW4gdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvIHR4IGZvciB0aGUgCisgICBtb21lbnQ9PiBwYWNrZXRzIGNhbiBiZSBwYXNzZWQgdG8gQkFMICovCisgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgdWNOb01vcmVEYXRhOworCisgIC8qIExhc3Qgc2VydmljZWQgQUMgdG8gYmUgcmV0cmlldmVkICovCisgIFdMQU5UTF9BQ0VudW1UeXBlICAgICAgICAgICAgIHVjU2VydmljZWRBQzsKKworICAgLyogQ3VycmVudCB3ZWlnaHQgZm9yIHRoZSBBQyAqLworICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICB1Y0N1cnJlbnRXZWlnaHQ7CisKKyAgLyogSW5mbyB1c2VkIGZvciBVQVBTRCB0cmlnZ2VyIGZyYW1lIGdlbmVyYXRpb24gICovCisgIFdMQU5UTF9VQVBTREluZm9UeXBlICAgICAgICAgIHdVQVBTREluZm9bV0xBTlRMX01BWF9BQ107CisKKyAgLyogZmxhZyB0byBzaWduYWwgaWYgYSB0cmlnZ2VyIGZyYW1lcyBpcyBwZW5kaW5nICovCisgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgIHVjUGVuZGluZ1RyaWdGcm07CisKKyAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICAgICAgdHJhZmZpY1N0YXRpc3RpY3M7CisKKyAgLypNZW1iZXJzIG5lZWRlZCBmb3IgcGFja2V0IGNhY2hpbmcgaW4gVEwqLworICAvKkJlZ2luaW5nIG9mIHRoZSBjYWNoZWQgcGFja2V0cyBjaGFpbiovCisgIHZvc19wa3RfdCogICAgICAgICAgICAgICAgIHZvc0JlZ0NhY2hlZEZyYW1lOworCisgIC8qQmVnaW5pbmcgb2YgdGhlIGNhY2hlZCBwYWNrZXRzIGNoYWluKi8KKyAgdm9zX3BrdF90KiAgICAgICAgICAgICAgICAgdm9zRW5kQ2FjaGVkRnJhbWU7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisKKyAgLyogTFdNIHJlbGF0ZWQgZmllbGRzICovCisKKyAgLy9jdXJyZW50IHN0YXRpb24gaXMgc2xvdy4gTFdNIG1vZGUgaXMgZW5hYmxlZC4KKyAgdl9CT09MX3QgdWNMd21Nb2RlRW5hYmxlZDsKKyAgLy9MV00gZXZlbnRzIGlzIHJlcG9ydGVkIHdoZW4gTFdNIG1vZGUgaXMgb24uIEFibGUgdG8gc2VuZCBtb3JlIHRyYWZmaWMKKyAgLy91bmRlciB0aGUgY29uc3RyYWludHMgb2YgdUJ1ZmZUaHJlc2hvbGRNYXgKKyAgdl9CT09MX3QgdWNMd21FdmVudFJlcG9ydGVkOworCisgIC8vdl9VOF90IHVMd21FdmVudFJlcG9ydGVkOworCisgIC8qIEZsb3cgY29udHJvbCBmaWVsZHMgKi8KKyAgLy9tZW1vcnkgdXNlZCBpbiBwcmV2aW91cyByb3VuZAorICB2X1U4X3QgYm11TWVtQ29uc3VtZWQ7CisKKyAgLy90aGUgbnVtYmVyIHBhY2tldHMgaW5qZWN0ZWQgaW4gdGhpcyByb3VuZAorICB2X1UzMl90IHVJbmdyZXNzX2xlbmd0aDsKKworICAvL251bWJlciBvZiBwYWNrZXRzIGFsbG93ZWQgaW4gY3VycmVudCByb3VuZCBiZWZvcmluZyByZWNlaXZpbmcgbmV3IEZXIG1lbW9yeSB1cGRhdGVzCisgIHZfVTMyX3QgdUJ1ZmZUaHJlc2hvbGRNYXg7CisKKworICAvLyB2X1UzMl90IHVFZ3Jlc3NfbGVuZ3RoOworCisgIC8vIHZfVTMyX3QgdUluZ3Jlc3NfbGVuZ3RoOworCisgIC8vIHZfVTMyX3QgdUJ1ZmZUaHJlc2hvbGRNYXg7CisKKyAgLy8gdl9VMzJfdCB1QnVmZlRocmVzaG9sZFVzZWQ7CisKKyAgLyogVmFsdWUgdXNlZCB0byBzZXQgTFdNIGluIEZXLiBJbml0aWFsaXplZCB0byAxLzMqIFdMQU5fU1RBX0JNVV9USFJFU0hPTERfTUFYCisgICAgIEluIHRoZSBmdXR1cmUsIGl0IGNhbiBiZSBkeW5hbWljYWxseSBhZGp1c3RlZCBpZiB3ZSBmaW5kIHRoZSByZWFzb24gdG8gaW1wbGVtZW50CisgICAgIHN1Y2ggYWxnb3JpdGhtLiAqLworICB2X1UzMl90IHVMd21UaHJlc2hvbGQ7CisKKyAgLy90eCBkaXNhYmxlIGZvcmNlZCBieSBSaXZhIHNvZnR3YXJlCisgIHZfVTE2X3QgZmNTdGFUeERpc2FibGVkOworCisgIC8qKiBIREQgYnVmZmVyIHN0YXR1cyBmb3IgcGFja2V0IHNjaGVkdWxpbmcuIE9uY2UgSERECisgICAqICBzdG9yZXMgYSBuZXcgcGFja2V0IGluIGEgcHJldmlvdXNseSBlbXB0eSBxdWV1ZSwgaXQKKyAgICogIHdpbGwgY2FsbCBUTCBpbnRlcmZhY2UgdG8gc2V0IHRoZSBmaWVsZHMuIFRoZSBmaWVsZHMKKyAgICogIHdpbGwgYmUgY2xlYW5lZCBieSBUTCB3aGVuIFRMIGNhbid0IGZldGNoIG1vcmUgcGFja2V0cworICAgKiAgZnJvbSB0aGUgcXVldWUuICovCisgIC8vIHRoZSBmaWVsZHMgYXJlIHVjUGt0UGVuZGluZyBhbmQgdWNBQ01hc2s7CisKKyAgLyogUXVldWUgdG8ga2VlcCB1bmljYXN0IHN0YXRpb24gbWFuYWdlbWVudCBmcmFtZSAqLworICB2b3NfbGlzdF90IHBTdGFNYW5hZ2VROworI2VuZGlmCisKKyNpZmRlZiBBTklfQ0hJUFNFVF9WT0xBTlMKKyAvKiAxIG1lYW5zIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgZm9yIHRoZSBzdGF0aW9uLAorICAqIDAgbWVhbnMgcmVwbGF5IGNoZWNrIGlzIG5vdCBuZWVkZWQgZm9yIHRoZSBzdGF0aW9uKi8KKyAgdl9CT09MX3QgICAgICB1Y0lzUmVwbGF5Q2hlY2tWYWxpZDsKKworIC8qIEl0IGNvbnRhaW5zIDQ4LWJpdCByZXBsYXkgY291bnRlciBwZXIgVElEKi8KKyAgdl9VNjRfdCAgICAgICB1bGxSZXBsYXlDb3VudGVyW1dMQU5UTF9NQVhfVElEXTsKKworIC8qIEl0IGNvbnRhaW5zIG5vIG9mIHJlcGxheSBwYWNrZXRzIGZvdW5kIHBlciBTVEEuCisgICAgSXQgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9ubHkuKi8KKyAgdl9VMzJfdCAgICAgICB1bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkOworI2VuZGlmCisKK31XTEFOVExfU1RBQ2xpZW50VHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQkFQIENsaWVudCB0eXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogZmxhZyB0aGF0IGtlZXBzIHRyYWNrIG9mIHJlZ2lzdHJhdGlvbjsgb25seSBvbmUgbm9uLWRhdGEgQlQtQU1QIGNsaWVudAorICAgICBhbGxvd2VkICovCisgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgdWNFeGlzdHM7CisKKyAgLyogcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIG5vbi1kYXRhIEJULUFNUCBmcmFtZXMgKi8KKyAgV0xBTlRMX0JBUFJ4Q0JUeXBlICAgICAgICBwZm5UbEJBUFJ4OworCisgIC8qIHBvaW50ZXIgdG8gdGhlIGZsdXNoIGNhbGwgYmFjayBjb21wbGV0ZSBmdW5jdGlvbiAqLworICBXTEFOVExfRmx1c2hPcENvbXBDQlR5cGUgICAgcGZuRmx1c2hPcENvbXBsZXRlQ2I7CisKKyAgLyogcG9pbnRlciB0byB0aGUgbm9uLWRhdGEgQlQtQU1QIGZyYW1lIHBlbmRpbmcgdHJhbnNtaXNzaW9uICovCisgIHZvc19wa3RfdCogICAgICAgICAgICAgICAgdm9zUGVuZGluZ0RhdGFCdWZmOworCisgIC8qIEJBUCBzdGF0aW9uIElEICovCisgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgdWNCQVBTVEFJZDsKK31XTEFOVExfQkFQQ2xpZW50VHlwZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNYW5hZ2VtZW50IEZyYW1lIENsaWVudCB0eXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogZmxhZyB0aGF0IGtlZXBzIHRyYWNrIG9mIHJlZ2lzdHJhdGlvbjsgb25seSBvbmUgbWFuYWdlbWVudCBmcmFtZQorICAgICBjbGllbnQgYWxsb3dlZCAqLworICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgIHVjRXhpc3RzOworCisgIC8qIHBvaW50ZXIgdG8gdGhlIHJlY2VpdmUgcHJvY2Vzc2luZyByb3V0aW5lIGZvciBtYW5hZ2VtZW50IGZyYW1lcyAqLworICBXTEFOVExfTWdtdEZybVJ4Q0JUeXBlICAgICAgIHBmblRsTWdtdEZybVJ4OworCisgIC8qIHBvaW50ZXIgdG8gdGhlIG1hbmFnZW1lbnQgZnJhbWUgcGVuZGluZyB0cmFuc21pc3Npb24gKi8KKyAgdm9zX3BrdF90KiAgICAgICAgICAgICAgICAgICB2b3NQZW5kaW5nRGF0YUJ1ZmY7Cit9V0xBTlRMX01nbXRGcm1DbGllbnRUeXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgV0xBTlRMX1RyYWZmaWNTdGF0dXNDaGFuZ2VkQ0JUeXBlICB0cmFmZmljQ0I7CisgICBXTEFOVExfSE9fVFJBRkZJQ19TVEFUVVNfVFlQRSAgICAgIHRyYWZmaWNTdGF0dXM7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkbGVUaHJlc2hvbGQ7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVQZXJpb2Q7CisgICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0UlhGcmFtZUNvdW50OworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBydFRYRnJhbWVDb3VudDsKKyAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJ0UlhGcmFtZUNvdW50OworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBucnRUWEZyYW1lQ291bnQ7CisgICB2b3NfdGltZXJfdCAgICAgICAgICAgICAgICAgICAgICAgIHRyYWZmaWNUaW1lcjsKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dDsKK30gV0xBTlRMX0hPX1RSQUZGSUNfU1RBVFVTX0hBTkRMRV9UWVBFOworCit0eXBlZGVmIHN0cnVjdAoreworICAgdl9TN190ICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWU7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudFtXTEFOVExfSFNfTlVNX0NMSUVOVF07CisgICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHRbV0xBTlRMX0hTX05VTV9DTElFTlRdOworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9Jc0NsaWVudFtXTEFOVExfSFNfTlVNX0NMSUVOVF07CisgICBXTEFOVExfUlNTSUNyb3NzVGhyZXNob2xkQ0JUeXBlIGNyb3NzQ0JGdW5jdGlvbltXTEFOVExfSFNfTlVNX0NMSUVOVF07CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNsaWVudDsKK30gV0xBTlRMX0hPX1JTU0lfSU5ESUNBVElPTl9UWVBFOworCit0eXBlZGVmIHN0cnVjdAoreworICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UaHJlc2hvbGQ7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbk51bWJlcjsKKyAgIHZfUzdfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeVJTU0k7CisgICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lOworICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmd05vdGlmaWNhdGlvbjsKK30gV0xBTlRMX0NVUlJFTlRfSE9fU1RBVEVfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIFdMQU5UTF9IT19SU1NJX0lORElDQVRJT05fVFlQRSAgICAgICByZWdpc3RlcmVkSW5kW1dMQU5UTF9NQVhfQVZBSUxfVEhSRVNIT0xEXTsKKyAgIFdMQU5UTF9DVVJSRU5UX0hPX1NUQVRFX1RZUEUgICAgICAgICBjdXJyZW50SE9TdGF0ZTsKKyAgIFdMQU5UTF9IT19UUkFGRklDX1NUQVRVU19IQU5ETEVfVFlQRSBjdXJyZW50VHJhZmZpYzsKKyAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHh0OworICAgdm9zX2xvY2tfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc0xvY2s7Cit9IFdMQU5UTF9IT19TVVBQT1JUX1RZUEU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRMIGNvbnRyb2wgYmxvY2sgdHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIFRMIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gKi8KKyAgV0xBTlRMX0NvbmZpZ0luZm9UeXBlICAgICB0bENvbmZpZ0luZm87CisKKyAgLyogbGlzdCBvZiB0aGUgYWN0aXZlIHN0YXRpb25zICovCisgIFdMQU5UTF9TVEFDbGllbnRUeXBlICAgICAgKmF0bFNUQUNsaWVudHM7IC8qQWxsb2NhdGUgbWVtb3J5IFtXTEFOX01BWF9TVEFfQ09VTlRdIG9mIHN0YXRpb24gKi8KKworICAvKiBpbmZvcm1hdGlvbiBvbiB0aGUgbWFuYWdlbWVudCBmcmFtZSBjbGllbnQgKi8KKyAgV0xBTlRMX01nbXRGcm1DbGllbnRUeXBlICB0bE1nbXRGcm1DbGllbnQ7CisKKyAgLyogaW5mb3JtYXRpb24gb24gdGhlIEJUIEFNUCBjbGllbnQgKi8KKyAgV0xBTlRMX0JBUENsaWVudFR5cGUgICAgICB0bEJBUENsaWVudDsKKworICAvKiBudW1iZXIgb2YgcGFja2V0cyBzZW50IHRvIEJBTCB3YWl0aW5nIGZvciB0eCBjb21wbGV0ZSBjb25maXJtYXRpb24gKi8KKyAgdl9VMTZfdCAgICAgICAgICAgICAgICAgICB1c1BlbmRpbmdUeENvbXBsZXRlQ291bnQ7CisKKyAgLyogZ2xvYmFsIHN1c3BlbmQgZmxhZyAqLworICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIHVjVHhTdXNwZW5kZWQ7CisKKyAgLyogcmVzb3VyY2UgZmxhZyAqLworICB2X1UzMl90ICAgICAgICAgICAgICAgICAgIHVSZXNDb3VudDsKKworICAvKiBkdW1teSB2b3MgYnVmZmVyIC0gdXNlZCBmb3IgY2hhaW5zICovCisgIHZvc19wa3RfdCogICAgICAgICAgICAgICAgdm9zRHVtbXlCdWY7CisKKyAgLyogdGVtcG9yYXJ5IGJ1ZmZlciBmb3Igc3RvcmluZyB0aGUgcGFja2V0IHRoYXQgbm8gbG9uZ2VyIGZpdHMgKi8KKyAgdm9zX3BrdF90KiAgICAgICAgICAgICAgICB2b3NUZW1wQnVmOworCisgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3RhdGlvbiBpZCBhbmQgQUMgZm9yIHRoZSBjYWNoZWQgYnVmZmVyICovCisgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgdWNDYWNoZWRTVEFJZDsKKyAgdl9VOF90ICAgICAgICAgICAgICAgICAgICB1Y0NhY2hlZEFDOworCisgIC8qIExhc3QgcmVnaXN0ZXJlZCBTVEEgLSB1bnRpbCBtdWx0aXBsZSBzdGEgc3VwcG9ydCBpcyBhZGRlZCB0aGlzIHdpbGwKKyAgICAgYmUgdXNlZCBhbHdheXMgZm9yIHR4ICovCisgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgdWNSZWdpc3RlcmVkU3RhSWQ7CisKKyAgLypDdXJyZW50IFRMIFNUQSB1c2VkIGZvciBUWCovCisgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgdWNDdXJyZW50U1RBOworCisgIFdMQU5UTF9SRU9SREVSX0JVRkZFUl9UICAgKnJlb3JkZXJCdWZmZXJQb29sOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIFtXTEFOVExfTUFYX0JBX1NFU1NJT05dIHNlc3Npb25zICovCisKKyAgV0xBTlRMX0hPX1NVUFBPUlRfVFlQRSAgICBob1N1cHBvcnQ7CisKKyAgdl9CT09MX3QgICAgICAgICAgICAgICAgICBiVXJnZW50OworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorCisgIC8qIHJlc291cmNlIGZsYWcgKi8KKyAgdl9VMzJfdCBiZF9wZHVSZXNDb3VudDsKKworICAvKiB0aW1lIGludGVydmFsIHRvIGV2YWx1YXRlIExXTSBtb2RlKi8KKyAgLy92b3NfdGltZXJfdCB0VGhyZXNob2xkU2FtcGxpbmdUaW1lcjsKKworI2lmIDAKKyAgLy9pbmZvcm1hdGlvbiBmaWVsZHMgZm9yIGZsb3cgY29udHJvbAorICB0RmNUeFBhcmFtc190eXBlIHRsRkNJbmZvOworI2VuZGlmCisKKyAgdm9zX3BrdF90KiAgICAgICAgICAgICAgICB2b3NUeEZDQnVmOworCisgIC8qIExXTSBtb2RlIGlzIGVuYWJsZWQgb3Igbm90IGZvciBlYWNoIHN0YXRpb24uIEJpdC13aXNlIG9wZXJhdGlvbi4zMiBzdGF0aW9uIG1heGltdW0uICovCisgIC8vICB2X1UzMl90IHVTdGFMd21NYXNrOworCisgIC8qIExXTSBldmVudCBpcyByZXBvcnRlZCBieSBGVy4gKi8KKyAgLy8gIHZfVTMyX3QgdVN0YUx3bUV2ZW50UmVwb3J0ZWQ7CisKKyAgLyoqIE11bHRpcGxlIFN0YXRpb24gU2NoZWR1bGluZyBhbmQgVEwgcXVldWUgbWFuYWdlbWVudC4KKyAgICAgIDQgSEREIEJDL01DIGRhdGEgcGFja2V0IHF1ZXVlIHN0YXR1cyBpcyBzcGVjaWZpZWQgYXMgU3RhdGlvbiAwJ3Mgc3RhdHVzLiBXZWlnaHRzIHVzZWQKKyAgICAgIGluIFdGUSBhbGdvcml0aCBhcmUgaW5pdGlhbGl6ZWQgaW4gV0xBTlRMX09QRU4gYW5kIGNvbnRhaW5lZCBpbiB0bENvbmZpZ0luZm8gZmllbGQuCisgICAgICBFYWNoIHN0YXRpb24gaGFzIGZpZWxkcyBvZiB1Y1BrdFBlbmRpbmcgYW5kIEFDIG1hc2sgdG8gdGVsbCB3aGV0aGVyIGEgQUMgaGFzIHRyYWZmaWMKKyAgICAgIG9yIG5vdC4KKworICAgICAgU3RhdGlvbnMgYXJlIHNlcnZlZCBpbiBhIHJvdW5kLXJvYmluIGZhc2hpb24gZnJvbSBoaWdoZXN0IHByaW9yaXR5IHRvIGxvd2VzdCBwcmlvcml0eS4KKyAgICAgIFRoZSBudW1iZXIgb2Ygcm91bmQtcm9iaW4gdGltZXMgb2YgZWFjaCBwcmlvaXJ0eSBlcXVhbHMgdG8gdGhlIFdGUSB3ZWlnaHRzIGFuZCBkaWZmZXJldGlhdGVzCisgICAgICB0aGUgdHJhZmZpYyBvZiBkaWZmZXJlbnQgcHJpb2lydHkuIEFzIHN1Y2gsIHN0YXRpb25zIGNhbiBub3QgcHJvdmlkZSBsb3cgcHJpb3JpdHkgcGFja2V0cyBpZgorICAgICAgaGlnaCBwcmlvcml0eSBwYWNrZXRzIGFyZSBhbGwgc2VydmVkLgorICAgICAgKi8KKworICAvKiBDdXJyZW50bHkgc2VydmVkIHN0YXRpb24gaWQuIFJldXNlIHVjQ3VycmVudFNUQSBmaWVsZC4gKi8KKyAgLy92X1U4X3QgdUN1clN0YUlkOworCisgIC8qIEN1cnJlbnQgc2VydmVkIHN0YXRpb24gSUQgaW4gcm91bmQtcm9iaW4gbWV0aG9kIHRvIHRyYXZlcnNlIGFsbCBzdGF0aW9ucy4qLworICBXTEFOVExfQUNFbnVtVHlwZSB1Q3VyU2VydmVkQUM7CisKKyAgLyogSG93IG1hbnkgd2VpZ2h0cyBoYXZlIG5vdCBiZWVuIHNlcnZlZCBpbiBjdXJyZW50IEFDLiAqLworICB2X1U4X3QgdWNDdXJMZWZ0V2VpZ2h0OworCisgIC8qIEJDL01DIG1hbmFnZW1lbnQgcXVldWUuIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gdXNlcyBxdWV1ZSBzaXplIDEuIFdpbGwgY2hlY2sgd2hldGhlcgorICAgIHNpemUgTiBpcyBzdXBwb3J0ZWQuICovCisgIHZvc19saXN0X3QgcE1DQkNNYW5hZ2VROworCisgIHZfVTMyX3Qgc2VuZEZDRnJhbWU7CisKKyAgdl9VOF90IGRvbmVfb25jZTsKKyAgdl9VOF90IHVGcmFtZXNQcm9jVGhyZXM7CisjZW5kaWYKKyAgLyp3aGV0aGVyIHdlIGFyZSBpbiBCTVBTL1VBUFNEL1dPV0wgbW9kZSwgc2luY2UgdGhlIGxhdHRlciAyIG5lZWQgdG8gYmUgQk1QUyBmaXJzdCovCisgIHZfQk9PTF90ICAgICAgICAgICAgICAgICAgaXNCTVBTOworfVdMQU5UTF9DYlR5cGU7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfR2V0RnJhbWVzCisKKyAgREVTQ1JJUFRJT04KKworICAgIEJBTCBjYWxscyB0aGlzIGZ1bmN0aW9uIGF0IHRoZSByZXF1ZXN0IG9mIHRoZSBsb3dlciBidXMgaW50ZXJmYWNlLgorICAgIFdoZW4gdGhpcyByZXF1ZXN0IGlzIGJlaW5nIHJlY2VpdmVkIFRMIHdpbGwgcmV0cmlldmUgcGFja2V0cyBmcm9tIEhERAorICAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgcHJpb3JpdHkgcnVsZXMgYW5kIHRoZSBjb3VudCBzdXBwbGllZCBieSBCQUwuCisKKyAgREVQRU5ERU5DSUVTCisKKyAgICBIREQgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgd2l0aCBUTCBhdCBsZWFzdCBvbmUgU1RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uCisgICAgY2FuIGJlIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHBBZGFwdGVyOiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgYWRhcHRlciBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgdVNpemU6ICAgICAgICAgIG1heGltdW0gc2l6ZSBhY2NlcHRlZCBieSB0aGUgbG93ZXIgbGF5ZXIKKyAgICB1Rmxvd01hc2sgICAgICAgVFggZmxvdyBjb250cm9sIG1hc2suIEVhY2ggYml0IGlzIGRlZmluZWQgYXMgCisgICAgICAgICAgICAgICAgICAgIFdEQV9UWEZsb3dFbnVtVHlwZQorCisgICAgT1VUCisgICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnVmZmVyIHN1cHBsaWVkCisgICAgICAgICAgICAgICAgICAgIGJ5IFRMLCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhY2tldCBzdXBwbGllZCwgVEwKKyAgICAgICAgICAgICAgICAgICAgd2lsbCBjaGFpbiB0aGVtIHRocm91Z2ggdk9TUyBidWZmZXJzCisKKyAgUkVUVVJOIFZBTFVFCisKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgICAgMSBvciBtb3JlOiBudW1iZXIgb2YgcmVxdWlyZWQgcmVzb3VyY2VzIGlmIHRoZXJlIGFyZSBzdGlsbCBmcmFtZXMgdG8gZmV0Y2gKKyAgICAgICAgICAgICAgIEZvciBWb2xhbnMsIGl0J3MgQkQvUERVIG51bWJlcnMuIEZvciBQcmltYSwgaXQncyBmcmVlIERYRSBkZXNjcmlwdG9ycy4KKyAgICAwIDogZXJyb3Igb3IgSEREIHF1ZXVlcyBhcmUgZHJhaW5lZAorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfVTMyX3QKK1dMQU5UTF9HZXRGcmFtZXMKKygKKyAgdl9QVk9JRF90ICAgICAgIHBBZGFwdGVyLAorICB2b3NfcGt0X3QgICAgICoqcHBGcmFtZURhdGFCdWZmLAorICB2X1UzMl90ICAgICAgICAgdVNpemUsCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzaywKKyNlbmRpZgorICB2X0JPT0xfdCogICAgICAgcGJVcmdlbnQKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfVHhDb21wCisKKyAgREVTQ1JJUFRJT04KKyAgICBJdCBpcyBiZWluZyBjYWxsZWQgYnkgQkFMIHVwb24gYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiBvZiB0aGUgcGFja2V0CisgICAgb3IgcGFja2V0cyAgYmVpbmcgc2VudCBvdmVyIHRoZSBidXMuCisKKyAgREVQRU5ERU5DSUVTCisgICAgVHggY29tcGxldGUgY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGEgcHJldmlvdXMgdHJhbnNtaXQuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwQWRhcHRlcjogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIGFkYXB0ZXIgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBvciBCQUwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlciBmb3Igd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCByZXBvcnQgaXMgYmVpbmcgbWFkZSwgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZQorICAgICAgICAgICAgICAgICAgICBwYWNrZXQgdGhleSB3aWxsIGJlIGNoYWluZWQgdXNpbmcgdk9TUyBidWZmZXJzLgorICAgIHdUeFNUQXR1czogICAgICB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc21pdHRlZCBwYWNrZXQsIHNlZSBhYm92ZSBjaGFwdGVyCisgICAgICAgICAgICAgICAgICAgIG9uIEhERCBpbnRlcmFjdGlvbiBmb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1R4Q29tcAorKAorICB2X1BWT0lEX3QgICAgICBwQWRhcHRlciwKKyAgdm9zX3BrdF90ICAgICAqcEZyYW1lRGF0YUJ1ZmYsCisgIFZPU19TVEFUVVMgICAgIHdUeFN0YXR1cworKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9SeEZyYW1lcworCisgIERFU0NSSVBUSU9OCisgICAgQ2FsbGJhY2sgcmVnaXN0ZXJlZCBieSBUTCBhbmQgY2FsbGVkIGJ5IEJBTCB3aGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkCisgICAgb3ZlciB0aGUgYnVzLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgZnVuY3Rpb24gVEwgd2lsbCBtYWtlIHRoZSBuZWNlc3NhcnkKKyAgICBkZWNpc2lvbiB3aXRoIHJlZ2FyZHMgdG8gdGhlIGZvcndhcmRpbmcgb3IgcXVldWluZyBvZiB0aGlzIHBhY2tldCBhbmQKKyAgICB0aGUgbGF5ZXIgaXQgbmVlZHMgdG8gYmUgZGVsaXZlcmVkIHRvLgorCisgIERFUEVOREVOQ0lFUworICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgorICAgIElmIHRoZSBmcmFtZSBjYXJyaWVkIGlzIGEgZGF0YSBmcmFtZSB0aGVuIHRoZSBzdGF0aW9uIGZvciB3aGljaCBpdCBpcworICAgIGRlc3RpbmVkIHRvIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIFRMLgorCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcEFkYXB0ZXI6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBhZGFwdGVyIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKworICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlciByZWNlaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZSBwYWNrZXQgdGhleSB3aWxsIGJlIGNoYWluZWQKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgdk9TUyBidWZmZXJzLgorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1J4RnJhbWVzCisoCisgIHZfUFZPSURfdCAgICAgIHBBZGFwdGVyLAorICB2b3NfcGt0X3QgICAgICpwRnJhbWVEYXRhQnVmZgorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9SeENhY2hlZEZyYW1lcworCisgIERFU0NSSVBUSU9OCisgICAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IFRMIHRvIGZvcndhcmQgdGhlIGNhY2hlZCBmcmFtZXMgdG8gYSBwYXJ0aWN1bGFyCisgICAgc3RhdGlvbjsKKworICBERVBFTkRFTkNJRVMKKyAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KKyAgICBJZiB0aGUgZnJhbWUgY2FycmllZCBpcyBhIGRhdGEgZnJhbWUgdGhlbiB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggaXQgaXMKKyAgICBkZXN0aW5lZCB0byBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBUTC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHBUTENiOiAgIHBvaW50ZXIgdG8gVEwgaGFuZGxlCisKKyAgICB1Y1NUQUlkOiAgICBzdGF0aW9uIGZvciB3aGljaCB3ZSBuZWVkIHRvIGZvcndhcmQgdGhlIHBhY2tldHMKKworICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNhY2hlZCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICByZWNlaXZlZCwgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZSBwYWNrZXQgdGhleSB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgY2hhaW5lZCB1c2luZyB2T1NTIGJ1ZmZlcnMuCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1J4Q2FjaGVkRnJhbWVzCisoCisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKKyAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQsCisgIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZgorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfUmVzb3VyY2VDQgorCisgIERFU0NSSVBUSU9OCisgICAgQ2FsbGVkIGJ5IHRoZSBUTCB3aGVuIGl0IGhhcyBwYWNrZXRzIGF2YWlsYWJsZSBmb3IgdHJhbnNtaXNzaW9uLgorCisgIERFUEVOREVOQ0lFUworICAgIFRoZSBUTCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBCQUwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHBBZGFwdGVyOiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgYWRhcHRlciBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgdUNvdW50OiAgICAgICAgIGF2YWlsIHJlc291cmNlIGNvdW50IG9idGFpbmVkIGZyb20gaHcKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9SZXNvdXJjZUNCCisoCisgIHZfUFZPSURfdCAgICAgICBwQWRhcHRlciwKKyAgdl9VMzJfdCAgICAgICAgIHVDb3VudAorKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9Qcm9jZXNzTWFpbk1lc3NhZ2UKKworICBERVNDUklQVElPTgorICAgIENhbGxlZCBieSBWT1NTIHdoZW4gYSBtZXNzYWdlIHdhcyBzZXJpYWxpemVkIGZvciBUTCB0aHJvdWdoIHRoZQorICAgIG1haW4gdGhyZWFkL3Rhc2suCisKKyAgREVQRU5ERU5DSUVTCisgICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHBBZGFwdGVyOiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgYWRhcHRlciBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICAgbWVzc2FnZTogICAgICAgIHR5cGUgYW5kIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UKKworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1Byb2Nlc3NNYWluTWVzc2FnZQorKAorICB2X1BWT0lEX3QgICAgICAgIHBBZGFwdGVyLAorICB2b3NfbXNnX3QqICAgICAgIG1lc3NhZ2UKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlRMX1Byb2Nlc3NUeE1lc3NhZ2UKKworICBERVNDUklQVElPTgorICAgIENhbGxlZCBieSBWT1NTIHdoZW4gYSBtZXNzYWdlIHdhcyBzZXJpYWxpemVkIGZvciBUTCB0aHJvdWdoIHRoZQorICAgIHR4IHRocmVhZC90YXNrLgorCisgIERFUEVOREVOQ0lFUworICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwQWRhcHRlcjogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIGFkYXB0ZXIgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAorICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCisKKworICBSRVRVUk4gVkFMVUUKKworICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfUHJvY2Vzc1R4TWVzc2FnZQorKAorICB2X1BWT0lEX3QgICAgICAgIHBBZGFwdGVyLAorICB2b3NfbXNnX3QqICAgICAgIG1lc3NhZ2UKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTl9UTEdldE5leHRUeElkcworCisgIERFU0NSSVBUSU9OCisgICAgR2V0cyB0aGUgbmV4dCBzdGF0aW9uIGFuZCBuZXh0IEFDIGluIHRoZSBsaXN0CisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICBPVVQKKyAgIHB1Y1NUQUlkOiAgICBTVEF0aW9uIElECisKKyAgUkVUVVJOIFZBTFVFCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOX1RMR2V0TmV4dFR4SWRzCisoCisgIHZfUFZPSURfdCAgICBwQWRhcHRlciwKKyAgdl9VOF90KiAgICAgIHB1Y1NUQUlkCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFuQ2IKKworICBERVNDUklQVElPTgorICAgIENsZWFucyBUTCBjb250cm9sIGJsb2NrCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICAgSU4KKyAgICBwVExDYjogICAgICAgcG9pbnRlciB0byBUTCdzIGNvbnRyb2wgYmxvY2sKKyAgICB1Y0VtcHR5OiAgICAgc2V0IGlmIFRMIGhhcyB0byBjbGVhbiB1cCB0aGUgcXVldWVzIGFuZCByZWxlYXNlIHBlZG5pbmcgcGt0cworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX0NsZWFuQ0IKKygKKyAgV0xBTlRMX0NiVHlwZSogIHBUTENiLAorICB2X1U4X3QgICAgICAgICAgdWNFbXB0eQorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9DbGVhblNUQQorCisgIERFU0NSSVBUSU9OCisgICAgQ2xlYW5zIGEgc3RhdGlvbiBjb250cm9sIGJsb2NrLgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgIElOCisgICAgcEFkYXB0ZXI6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBhZGFwdGVyIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgICB1Y0VtcHR5OiAgICAgICAgaWYgc2V0IHRoZSBxdWV1ZXMgYW5kIHBlbmRpbmcgcGt0cyB3aWxsIGJlIGVtcHR5ZWQKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9DbGVhblNUQQorKAorICBXTEFOVExfU1RBQ2xpZW50VHlwZSogIHB0bFNUQUNsaWVudCwKKyAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y0VtcHR5CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRUeFJlc291cmNlc0NCCisKKyAgREVTQ1JJUFRJT04KKyAgICBQcm9jZXNzaW5nIGZ1bmN0aW9uIGZvciBSZXNvdXJjZSBuZWVkZWQgc2lnbmFsLiBBIHJlcXVlc3Qgd2lsbCBiZSBpc3N1ZWQKKyAgICB0byBCQUwgdG8gZ2V0IG1vciB0eCByZXNvdXJjZXMuCisKKyAgREVQRU5ERU5DSUVTCisgICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBPdGhlciB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbCwgcGxlYXNlIGNoZWNrCisgIGNvcnJlc3BvbmRpbmcgQVBJIGZvciBtb3JlIGluZm8uCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9HZXRUeFJlc291cmNlc0NCCisoCisgIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlRMX1ByZXBhcmVCREhlYWRlcgorCisgIERFU0NSSVBUSU9OCisgICAgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHNlcmlhbGl6aW5nIFN1c3BlbmQgc2lnbmFsIHRocm91Z2ggVHggdGhyZWFkCisKKyAgREVQRU5ERU5DSUVTCisgICAgSnVzdCBub3RpZnkgSEFMIHRoYXQgc3VzcGVuZCBpbiBUTCBpcyBjb21wbGV0ZS4KKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICBwQWRhcHRlcjogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIGFkYXB0ZXIgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncworICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CisgICBwVXNlckRhdGE6ICAgICAgdXNlciBkYXRhIHNlbnQgd2l0aCB0aGUgY2FsbGJhY2sKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQKK1dMQU5UTF9QcmVwYXJlQkRIZWFkZXIKKygKKyAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAorICB2X1BWT0lEX3QqICAgICAgcHB2QkRIZWFkZXIsCisgIHZfTUFDQUREUl90KiAgICBwdkRlc3RNYWNBZGRkciwKKyAgdl9VOF90ICAgICAgICAgIHVjRGlzYWJsZUZybVh0bCwKKyAgVk9TX1NUQVRVUyogICAgIHB2b3NTVEF0dXMsCisgIHZfVTE2X3QqICAgICAgICB1c1BrdExlbiwKKyAgdl9VOF90ICAgICAgICAgIHVjUW9zRW5hYmxlZCwKKyAgdl9VOF90ICAgICAgICAgIHVjV0RTRW5hYmxlZCwKKyAgdl9VOF90ICAgICAgICAgIGV4dHJhSGVhZFNwYWNlCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlcgorCisgIERFU0NSSVBUSU9OCisgICAgSW5saW5lIGZ1bmN0aW9uIGZvciB0cmFuc2xhdGluZyBhbmQgODAyLjMgaGVhZGVyIGludG8gYW4gODAyLjExIGhlYWRlci4KKworICBERVBFTkRFTkNJRVMKKworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBwVExDYjogICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCisgICAgdWNTdGFJZDogICAgICAgICAgc3RhdGlvbiBJRAorCisgICBJTi9PVVQKKyAgICB2b3NEYXRhQnVmZjogICAgICB2b3MgZGF0YSBidWZmZXIsIHdpbGwgY29udGFpbiB0aGUgbmV3IGhlYWRlciBvbiBvdXRwdXQKKworICAgT1VUCisgICAgcHZvc1N0YXR1czogICAgICAgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KKworICBSRVRVUk4gVkFMVUUKKyAgICBObyByZXR1cm4uCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyCisoCisgIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZiwKKyAgVk9TX1NUQVRVUyogICAgIHB2b3NTdGF0dXMsCisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKKyAgdl9VOF90ICAgICAgICAgIHVjU3RhSWQsCisgIHZfVThfdCAgICAgICAgICB1Y1VQLAorICB2X1U4X3QgICAgICAgICAgKnVjV0RTRW5hYmxlZCwKKyAgdl9VOF90ICAgICAgICAgICpleHRyYUhlYWRTcGFjZQorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIKKworICBERVNDUklQVElPTgorICAgIElubGluZSBmdW5jdGlvbiBmb3IgdHJhbnNsYXRpbmcgYW5kIDgwMi4xMSBoZWFkZXIgaW50byBhbiA4MDIuMyBoZWFkZXIuCisKKyAgREVQRU5ERU5DSUVTCisKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgcFRMQ2I6ICAgICAgICAgICAgVEwgY29udHJvbCBibG9jaworICAgIHVjU3RhSWQ6ICAgICAgICAgIHN0YXRpb24gSUQKKyAgICB1Y0hlYWRlckxlbjogICAgICBMZW5ndGggb2YgdGhlIGhlYWRlciBmcm9tIEJECisgICAgdWNBY3R1YWxITGVuOiAgICAgTGVuZ3RoIG9mIGhlYWRlciBpbmNsdWRpbmcgcGFkZGluZyBvciBhbnkgb3RoZXIgdHJhaWxlcnMKKworICAgSU4vT1VUCisgICAgdm9zRGF0YUJ1ZmY6ICAgICAgdm9zIGRhdGEgYnVmZmVyLCB3aWxsIGNvbnRhaW4gdGhlIG5ldyBoZWFkZXIgb24gb3V0cHV0CisKKyAgIE9VVAorICAgIHB2b3NTdGF0dXM6ICAgICAgIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCisKKyAgUkVUVVJOIFZBTFVFCisgICAgU3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIKKygKKyAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAorICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKKyAgdl9VMTZfdCAgICAgICAgIHVzQWN0dWFsSExlbiwgIAorICB2X1U4X3QgICAgICAgICAgdWNIZWFkZXJMZW4sCisgIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKKyAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiCisKKyAgREVTQ1JJUFRJT04KKyAgICBEZWZhdWx0IE1nbXQgRnJtIHJ4IGNhbGxiYWNrOiBhc3NlcnRzIGFsbCB0aGUgdGltZS4gSWYgdGhpcyBmdW5jdGlvbiBnZXRzCisgICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIE1nbXQgRnJtLgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgIE5vdCB1c2VkLgorCisgIFJFVFVSTiBWQUxVRQorICAgQWx3YXlzIEZBSUxVUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYgorKAorICB2X1BWT0lEX3QgIHBBZGFwdGVyLAorICB2X1BWT0lEX3QgIHZvc0J1ZmYKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfU1RBUnhEZWZhdWx0Q2IKKworICBERVNDUklQVElPTgorICAgIERlZmF1bHQgQkFQIHJ4IGNhbGxiYWNrOiBhc3NlcnRzIGFsbCB0aGUgdGltZS4gSWYgdGhpcyBmdW5jdGlvbiBnZXRzCisgICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIEJBUC4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgICBOb3QgdXNlZC4KKworICBSRVRVUk4gVkFMVUUKKyAgIEFsd2F5cyBGQUlMVVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9CQVBSeERlZmF1bHRDYgorKAorICB2X1BWT0lEX3QgICAgcEFkYXB0ZXIsCisgIHZvc19wa3RfdCogICB2b3NEYXRhQnVmZiwKKyAgV0xBTlRMX0JBUEZyYW1lRW51bVR5cGUgZnJhbWVUeXBlCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4RGVmYXVsdENiCisKKyAgREVTQ1JJUFRJT04KKyAgICBEZWZhdWx0IFNUQSByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cworICAgIGNhbGxlZCAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCByeCBjYiBwb2ludGVyIGZvciBzdGF0aW9uLgorICAgIChNZW0gY29ycnVwdGlvbiBtb3N0IGxpa2VseSwgaXQgc2hvdWxkIG5ldmVyIGhhcHBlbikKKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgICBOb3QgdXNlZC4KKworICBSRVRVUk4gVkFMVUUKKyAgIEFsd2F5cyBGQUlMVVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9TVEFSeERlZmF1bHRDYgorKAorICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwQWRhcHRlciwKKyAgdm9zX3BrdF90KiAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCisgIHZfVThfdCAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCisgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSogIHBSeE1ldGFJbmZvCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiCisKKyAgREVTQ1JJUFRJT04KKyAgICBEZWZhdWx0IGZldGNoIGNhbGxiYWNrOiBhc3NlcnRzIGFsbCB0aGUgdGltZS4gSWYgdGhpcyBmdW5jdGlvbiBnZXRzCisgICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIGZldGNoIGNiIHBvaW50ZXIgZm9yIHN0YXRpb24uCisgICAgKE1lbSBjb3JydXB0aW9uIG1vc3QgbGlrZWx5LCBpdCBzaG91bGQgbmV2ZXIgaGFwcGVuKQorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgIE5vdCB1c2VkLgorCisgIFJFVFVSTiBWQUxVRQorICAgQWx3YXlzIEZBSUxVUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiCisoCisgIHZfUFZPSURfdCAgICAgICAgICAgICAgcEFkYXB0ZXIsCisgIHZfVThfdCogICAgICAgICAgICAgICAgcHVjU1RBSWQsCisgIFdMQU5UTF9BQ0VudW1UeXBlICAgICAgdWNBQywKKyAgdm9zX3BrdF90KiogICAgICAgICAgICB2b3NEYXRhQnVmZiwKKyAgV0xBTlRMX01ldGFJbmZvVHlwZSogICB0bE1ldGFJbmZvCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1R4Q29tcERlZmF1bHRDYgorCisgIERFU0NSSVBUSU9OCisgICAgRGVmYXVsdCB0eCBjb21wbGV0ZSBoYW5kbGVyLiBJdCB3aWxsIHJlbGVhc2UgdGhlIGNvbXBsZXRlZCBwa3QgdG8KKyAgICBwcmV2ZW50IG1lbW9yeSBsZWFrcy4KKworICBQQVJBTUVURVJTCisKKyAgICBJTgorICAgIHBBZGFwdGVyOiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgYWRhcHRlciBjb250ZXh0OyBhIGhhbmRsZSB0bworICAgICAgICAgICAgICAgICAgICBUTC9IQUwvUEUvQkFQL0hERCBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICBpdHMgY29udGV4dAorICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIFZPU1MgZGF0YSBidWZmZXIgdGhhdCB3YXMgdHJhbnNtaXR0ZWQKKyAgICB3VHhTVEF0dXM6ICAgICAgc3RhdHVzIG9mIHRoZSB0cmFuc21pc3Npb24KKworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uOyBwbGVhc2UKKyAgICBjaGVjayB2b3NfcGt0X3JldHVybl9wa3QgZm9yIHBvc3NpYmxlIGVycm9yIGNvZGVzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9UeENvbXBEZWZhdWx0Q2IKKygKKyB2X1BWT0lEX3QgICAgICBwQWRhcHRlciwKKyB2b3NfcGt0X3QqICAgICB2b3NEYXRhQnVmZiwKKyBWT1NfU1RBVFVTICAgICB3VHhTVEF0dXMKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfUGFja1VwVHJpZ2dlckZyYW1lCisKKyAgREVTQ1JJUFRJT04KKyAgICBQYWNrcyB1cCBhIHRyaWdnZXIgZnJhbWUgYW5kIHBsYWNlcyBpdCBpbiBUTCdzIGNhY2hlIGZvciB0eCBhbmQgbm90aWZpZXMKKyAgICBCQUwKKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgSU4KKyAgICBwVExDYjogICAgICAgICBwb2ludGVyIHRvIHRoZSBUTCBjb250cm9sIGJsb2NrCisgICAgcGZuU1RBVHhDb21wOiAgVHggQ29tcGxldGUgQ2IgdG8gYmUgdXNlZCB3aGVuIGZyYW1lIGlzIHJlY2VpdmVkCisgICAgdWNTVEFJZDogICAgICAgc3RhdGlvbiBpZAorICAgIHVjQUM6ICAgICAgICAgIGFjY2VzcyBjYXRlZ29yeQorCisgIFJFVFVSTiBWQUxVRQorICAgIE5vbmUKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfUGFja1VwVHJpZ2dlckZyYW1lCisoCisgIFdMQU5UTF9DYlR5cGUqICAgICAgICAgICAgcFRMQ2IsCisgIFdMQU5UTF9UeENvbXBDQlR5cGUgICAgICAgcGZuU1RBVHhDb21wLAorICB2X1U4X3QgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCisgIFdMQU5UTF9BQ0VudW1UeXBlICAgICAgICAgdWNBQworKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5UTF9UeENvbXBUcmlnZ0ZyYW1lU0kKKworICBERVNDUklQVElPTgorICAgIFR4IGNvbXBsZXRlIGhhbmRsZXIgZm9yIHRoZSBzZXJ2aWNlIGludGVydmFsIHRyaWdnZXIgZnJhbWUuCisgICAgSXQgd2lsbCByZXN0YXJ0IHRoZSBTSSB0aW1lci4KKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8KKyAgICAgICAgICAgICAgICAgICAgVEwvSEFML1BFL0JBUC9IREQgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgaXRzIGNvbnRleHQKKyAgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSBWT1NTIGRhdGEgYnVmZmVyIHRoYXQgd2FzIHRyYW5zbWl0dGVkCisgICAgd1R4U1RBdHVzOiAgICAgIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXNzaW9uCisKKworICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfVHhDb21wVHJpZ2dGcmFtZVNJCisoCisgIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAorICB2b3NfcGt0X3QqICAgICB2b3NEYXRhQnVmZiwKKyAgVk9TX1NUQVRVUyAgICAgd1R4U1RBdHVzCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1R4Q29tcFRyaWdnRnJhbWVTSQorCisgIERFU0NSSVBUSU9OCisgICAgVHggY29tcGxldGUgaGFuZGxlciBmb3IgdGhlIHNlcnZpY2UgaW50ZXJ2YWwgdHJpZ2dlciBmcmFtZS4KKyAgICBJdCB3aWxsIHJlc3RhcnQgdGhlIFNJIHRpbWVyLgorCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0bworICAgICAgICAgICAgICAgICAgICBUTC9IQUwvUEUvQkFQL0hERCBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICBpdHMgY29udGV4dAorICAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIFZPU1MgZGF0YSBidWZmZXIgdGhhdCB3YXMgdHJhbnNtaXR0ZWQKKyAgICB3VHhTVEF0dXM6ICAgICAgc3RhdHVzIG9mIHRoZSB0cmFuc21pc3Npb24KKworCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX1R4Q29tcFRyaWdnRnJhbWVESQorKAorIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAorIHZvc19wa3RfdCogICAgIHZvc0RhdGFCdWZmLAorIFZPU19TVEFUVVMgICAgIHdUeFNUQXR1cworKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBGVU5DVElPTgorCisgICBERVNDUklQVElPTiAgIFJlYWQgUlNTSSB2YWx1ZSBvdXQgb2YgYSBSWCBCRAorCisgICBQQVJBTUVURVJTOiBDYWxsZXIgbXVzdCB2YWxpZGF0ZSBhbGwgcGFyYW1ldGVycworCisgICBSRVRVUk4gVkFMVUUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5UTF9SZWFkUlNTSQorKAorICAgdl9QVk9JRF90ICAgICAgICBwQWRhcHRlciwKKyAgIHZfUFZPSURfdCAgICAgICAgcEJESGVhZGVyLAorICAgdl9VOF90ICAgICAgICAgICBTVEFpZAorKTsKKworCisKK3ZvaWQgV0xBTlRMX1Bvd2VyU3RhdGVDaGFuZ2VkQ0IKKygKKyAgIHZfUFZPSURfdCBwQWRhcHRlciwKKyAgIHRQbWNTdGF0ZSBuZXdTdGF0ZQorKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICBXTEFOVExfRndkUGt0VG9IREQgCisKKyAgREVTQ1JJUFRJT04KKyAgICBEZXRlcm1pbmUgdGhlIERlc3RhdGlvbiBTdGF0aW9uIElEIGFuZCByb3V0ZSB0aGUgRnJhbWUgdG8gVXBwZXIgTGF5ZXIKKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCisgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKKyAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAorICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgcnggdm9zIGJ1ZmZlcgorCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitWT1NfU1RBVFVTCitXTEFOVExfRndkUGt0VG9IREQKKygKKyAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAorICB2b3NfcGt0X3QqICAgICBwdm9zRGF0YUJ1ZmYsCisgIHZfVThfdCAgICAgICAgICB1Y1NUQUlkCispOworCisjZW5kaWYgLyogI2lmZGVmIFdMQU5UTF9TT0ZUQVBfRkVBVFVSRSAqLworI2VuZGlmIC8qICNpZm5kZWYgV0xBTl9RQ1RfVExJX0ggKi8KZGlmZiAtLWdpdCBhL0NPUkUvVEwvc3JjL3dsYW5fcWN0X3RsaV9iYS5oIGIvQ09SRS9UTC9zcmMvd2xhbl9xY3RfdGxpX2JhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkNmUwZAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVEwvc3JjL3dsYW5fcWN0X3RsaV9iYS5oCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBXTEFOX1FDVF9UTElfQkFfSAorI2RlZmluZSBXTEFOX1FDVF9UTElfQkFfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICBXIEwgQSBOICAgVCBSIEEgTiBTIFAgTyBSIFQgICBMIEEgWSBFIFIgCisgICAgICAgICAgICAgICBCIEwgTyBDIEsgICBBIEMgSyAgICBJIE4gVCBFIFIgTiBBIEwgIEEgUCBJCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgCitERVNDUklQVElPTgorICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludGVybmFsIGRlY2xhcmF0aW9ucyB1c2VkIHdpdGhpbiB3bGFuIHRyYW5zcG9ydCAKKyAgbGF5ZXIgbW9kdWxlIGZvciBCQSBzZXNzaW9uIHN1cHBvcnQsIEFNU0RVIGRlLWFnZ3JlZ2F0aW9uIGFuZCAKKyAgTVNEVSByZW9yZGVyaW5nLgorICAgICAgICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKK3doZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDgvMjIvMDggICAgc2NoICAgICBVcGRhdGUgYmFzZWQgb24gdW5pdCB0ZXN0CiswNy8zMS8wOCAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTIEZPUiBNT0RVTEUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ3bGFuX3FjdF90bGkuaCIgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBSZS1vcmRlciBvcGNvZGUgZmlsbGVkIGluIGJ5IFJQRSAKKyAgICEhISBmaXggbWU6IChjaGVjayB3aXRoIFJQRSBkb2MgaWYgdGhlIGNvZGVzIGFyZSBjb3JyZWN0KQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgV0xBTlRMX09QQ09ERV9JTlZBTElEICAgICAgICAgPSAwLAorICBXTEFOVExfT1BDT0RFX1FDVVJfRldEQlVGICAgICA9IDEsCisgIFdMQU5UTF9PUENPREVfRldEQlVGX0ZXRENVUiAgID0gMiwKKyAgV0xBTlRMX09QQ09ERV9RQ1VSICAgICAgICAgICAgPSAzLAorICBXTEFOVExfT1BDT0RFX0ZXREJVRl9RVUVVRUNVUiA9IDQsCisgIFdMQU5UTF9PUENPREVfRldEQlVGX0RST1BDVVIgID0gNSwKKyAgV0xBTlRMX09QQ09ERV9GV0RBTExfRFJPUENVUiAgPSA2LAorICBXTEFOVExfT1BDT0RFX0ZXREFMTF9RQ1VSICAgICA9IDcsCisgIFdMQU5UTF9PUENPREVfVEVBUkRPV04gICAgICAgID0gOCwKKyAgV0xBTlRMX09QQ09ERV9EUk9QQ1VSICAgICAgICAgPSA5LAorICBXTEFOVExfT1BDT0RFX01BWAorfVdMQU5UTF9PcENvZGVFbnVtVHlwZTsKKwordm9pZCBXTEFOVExfSW5pdEJBUmVvcmRlckJ1ZmZlcgorKAorICAgdl9QVk9JRF90ICAgcHZvc0dDdHgKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfQmFTZXNzaW9uQWRkCisKKyAgREVTQ1JJUFRJT04gCisgICAgSEFMIG5vdGlmaWVzIFRMIHdoZW4gYSBuZXcgQmxvY2sgQWNrIHNlc3Npb24gaXMgYmVpbmcgYWRkZWQuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgQSBCQSBzZXNzaW9uIG9uIFJ4IG5lZWRzIHRvIGJlIGFkZGVkIGluIFRMIGJlZm9yZSB0aGUgcmVzcG9uc2UgaXMgCisgICAgYmVpbmcgc2VudCBvdXQgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGZvciB3aGljaCByZXF1ZXN0ZWQgdGhlIEJBIAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCisgICAgdWNUaWQ6ICAgICAgICAgIFRzcGVjIElEIGZvciB0aGUgbmV3IEJBIHNlc3Npb24KKyAgICB1U2l6ZTogICAgICAgICAgc2l6ZSBvZiB0aGUgcmVvcmRlcmluZyB3aW5kb3cKKworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICAgICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkIAorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICAgICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdCAgCisgICAgVk9TX1NUQVRVU19FX0VYSVNUUzogICAgIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkIG9yIEJBIHNlc3Npb24gYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMKKyAgICBWT1NfU1RBVFVTX0VfTk9TVVBQT1JUOiAgTm90IHlldCBzdXBwb3J0ZWQKKyAgICAKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0xBTlRMX0JhU2Vzc2lvbkFkZCAKKyggCisgIHZfUFZPSURfdCAgIHB2b3NHQ3R4LCAKKyAgdl9VMTZfdCAgICAgc2Vzc2lvbklELAorICB2X1UzMl90ICAgICB1Y1NUQUlkLAorICB2X1U4X3QgICAgICB1Y1RpZCwgCisgIHZfVTMyX3QgICAgIHVCdWZmZXJTaXplLAorICB2X1UzMl90ICAgICB3aW5TaXplLAorICB2X1UzMl90ICAgICBTU04gCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX0JhU2Vzc2lvbkRlbAorCisgIERFU0NSSVBUSU9OIAorICAgIEhBTCBub3RpZmllcyBUTCB3aGVuIGEgbmV3IEJsb2NrIEFjayBzZXNzaW9uIGlzIGJlaW5nIGRlbGV0ZWQuIAorICAgIAorICBERVBFTkRFTkNJRVMgCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGZvciB3aGljaCByZXF1ZXN0ZWQgdGhlIEJBIAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCisgICAgdWNUaWQ6ICAgICAgICAgIFRzcGVjIElEIGZvciB0aGUgbmV3IEJBIHNlc3Npb24KKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZCAKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQgIAorICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICAgICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZCBvciBCQSBzZXNzaW9uIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzCisgICAgVk9TX1NUQVRVU19FX05PU1VQUE9SVDogIE5vdCB5ZXQgc3VwcG9ydGVkCisgICAgCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dMQU5UTF9CYVNlc3Npb25EZWwgCisoIAorICB2X1BWT0lEX3QgICAgICAgICAgIHB2b3NHQ3R4LCAKKyAgdl9VMTZfdCAgICAgICAgICAgICB1Y1NUQUlkLAorICB2X1U4X3QgICAgICAgICAgICAgIHVjVGlkCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdMQU5UTF9BTVNEVVByb2Nlc3MKKworICBERVNDUklQVElPTiAKKyAgICBQcm9jZXNzIEEtTVNEVSBzdWItZnJhbWUuIFN0YXJ0IG9mIGNoYWluIGlmIG1hcmtlZCBhcyBmaXJzdCBmcmFtZS4gCisgICAgTGlua2VkIGF0IHRoZSBlbmQgb2YgdGhlIGV4aXN0aW5nIEFNU0RVIGNoYWluLiAKKyAgICAKKworICBERVBFTkRFTkNJRVMgCisgICAgICAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgSU4vT1VUOgorICAgdm9zRGF0YUJ1ZmY6IHZvcyBwYWNrZXQgZm9yIHRoZSByZWNlaXZlZCBkYXRhCisgICAgICAgICAgICAgICAgIG91dGdvaW5nIGNvbnRhaW5zIHRoZSByb290IG9mIHRoZSBjaGFpbiBmb3IgdGhlIHJ4IAorICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVkIE1TRFUgaWYgdGhlIGZyYW1lIGlzIG1hcmtlZCBhcyBsYXN0OyBvdGhlcndpc2UgCisgICAgICAgICAgICAgICAgIE5VTEwKKyAgIAorICAgSU4KKyAgIHBBZGFwdGVyOiAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIGFkYXB0ZXIgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKKyAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCisgICBwdkJESGVhZGVyOiAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgorICAgdWNTVEFJZDogICAgICBTVEF0aW9uIElEIAorICAgICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfQU1TRFVQcm9jZXNzCisoIAorICB2X1BWT0lEX3QgICBwdm9zR0N0eCwKKyAgdm9zX3BrdF90KiogcHBWb3NEYXRhQnVmZiwgCisgIHZfUFZPSURfdCAgIHB2QkRIZWFkZXIsCisgIHZfVThfdCAgICAgIHVjU1RBSWQsCisgIHZfVThfdCAgICAgIHVjTVBEVUhMZW4sCisgIHZfVTE2X3QgICAgIHVzTVBEVUxlbgorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXTEFOVExfTVNEVVJlb3JkZXIKKworICBERVNDUklQVElPTiAKKyAgICBNU0RVIHJlb3JkZXJpbmcgCisKKyAgREVQRU5ERU5DSUVTIAorICAgICAgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgIElOCisgICAKKyAgIHZvc0RhdGFCdWZmOiB2b3MgcGFja2V0IGZvciB0aGUgcmVjZWl2ZWQgZGF0YQorICAgcHZCREhlYWRlcjogcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCisgICB1Y1NUQUlkOiAgICBTVEF0aW9uIElEIAorICAgICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfTVNEVVJlb3JkZXIKKyggCisgICBXTEFOVExfQ2JUeXBlICAgICpwVExDYiwKKyAgIHZvc19wa3RfdCAgICAgICAgKip2b3NEYXRhQnVmZiwgCisgICB2X1BWT0lEX3QgICAgICAgIHB2QkRIZWFkZXIsCisgICB2X1U4X3QgICAgICAgICAgIHVjU1RBSWQsCisgICB2X1U4X3QgICAgICAgICAgIHVjVGlkCispOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBVdGlsaXR5IGZ1bmN0aW9ucworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0xBTlRMX0FNU0RVQ29tcGxldGVGcmFtZQorCisgIERFU0NSSVBUSU9OIAorICAgIENvbXBsZXRlIEFNU0RVIGRlLWFnZ3JlZ2F0aW9uCisKKyAgREVQRU5ERU5DSUVTIAorICAgICAgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgIElOL09VVDoKKyAgIHZvc0RhdGFCdWZmOiB2b3MgcGFja2V0IGZvciB0aGUgcmVjZWl2ZWQgZGF0YQorICAgCisgICBJTgorICAgcHZCREhlYWRlcjogcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCisgICB1Y1NUQUlkOiAgICBTVEF0aW9uIElEIAorICAgICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfQU1TRFVDb21wbGV0ZUZyYW1lCisoIAorICB2b3NfcGt0X3QqICB2b3NEYXRhQnVmZiwKKyAgdl9VOF90ICAgICAgdWNNUERVSExlbiwKKyAgdl9VMTZfdCAgICAgdXNNUERVTGVuCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgRlVOQ1RJT04gICAgV0xBTlRMX1F1ZXVlQ3VycmVudAorCisgIERFU0NSSVBUSU9OIAorICAgIEl0IHdpbGwgcXVldWUgYSBwYWNrZXQgYXQgYSBnaXZlbiBzbG90IGluZGV4IGluIHRoZSBNU0RVIHJlb3JkZXJpbmcgbGlzdC4gCisgICAgCisgIERFUEVOREVOQ0lFUyAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHdCYVJlb3JkZXI6ICAgcG9pbnRlciB0byB0aGUgQkEgcmVvcmRlcmluZyBzZXNzaW9uIGluZm8gCisgICAgdm9zRGF0YUJ1ZmY6ICAgZGF0YSBidWZmZXIgdG8gYmUgcXVldWVkCisgICAgdWNTbG90SW5kZXg6ICAgc2xvdCBpbmRleCAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKyAgICBWT1NfU1RBVFVTX0VfU1VDQ0VTUzogICAgIEV2ZXJ5dGhpbmcgaXMgT0sKKworICAgIAorICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXTEFOVExfUXVldWVDdXJyZW50CisoCisgIFdMQU5UTF9CQVJlb3JkZXJUeXBlKiAgcHdCYVJlb3JkZXIsCisgIHZvc19wa3RfdCoqICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCisgIHZfVThfdCAgICAgICAgICAgICAgICAgdWNTbG90SW5kZXgKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOVExfQ2hhaW5Gcm9udFBrdHMKKworICBERVNDUklQVElPTiAKKyAgICBJdCB3aWxsIHJlbW92ZSBhbGwgdGhlIHBhY2tldHMgZnJvbSB0aGUgZnJvbnQgb2YgYSB2b3MgbGlzdCBhbmQgY2hhaW4gCisgICAgdGhlbSB0byBhIHZvcyBwa3QgLiAKKyAgICAKKyAgREVQRU5ERU5DSUVTIAorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB1Y0NvdW50OiAgICAgICBudW1iZXIgb2YgcGFja2V0cyB0byBleHRyYWN0CisgICAgcHdCYVJlb3JkZXI6ICAgcG9pbnRlciB0byB0aGUgQkEgcmVvcmRlcmluZyBzZXNzaW9uIGluZm8gCisKKyAgICBPVVQKKyAgICB2b3NEYXRhQnVmZjogICBkYXRhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgY2hhaW4gb2YgcGFja2V0cworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICAgIFZPU19TVEFUVVNfRV9TVUNDRVNTOiAgICAgRXZlcnl0aGluZyBpcyBPSworCisgICAgCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgV0xBTlRMX0NoYWluRnJvbnRQa3RzCisoIAorICAgdl9VMzJfdCAgICAgICAgICAgICAgICBmd2RJbmRleCwKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgb3BDb2RlLAorICAgdm9zX3BrdF90ICAgICAgICAgICAgICAqKnZvc0RhdGFCdWZmLAorICAgV0xBTlRMX0JBUmVvcmRlclR5cGUgICAqcHdCYVJlb3JkZXIsCisgICBXTEFOVExfQ2JUeXBlICAgICAgICAgICpwVExDYgorKTsKKworI2lmZGVmIEFOSV9DSElQU0VUX1ZPTEFOUworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIAorICAgRlVOQ1RJT04gICAgV0xBTlRMX0ZpbGxSZXBsYXlDb3VudGVyCisgCisgICBERVNDUklQVElPTiAKKyAgICBJdCB3aWxsIGZpbGwgcmVwYWx5IGNvdW50ZXIgYXQgYSBnaXZlbiBzbG90IGluZGV4IGluIHRoZSBNU0RVIHJlb3JkZXJpbmcgbGlzdC4gCisgICAgICAgICAgICAgIAorICAgREVQRU5ERU5DSUVTIAorICAgICAgICAgICAgICAgIAorICAgUEFSQU1FVEVSUyAKKworICAgSU4KKyAgIHB3QmFSZW9yZGVyICA6ICAgcG9pbnRlciB0byB0aGUgQkEgcmVvcmRlcmluZyBzZXNzaW9uIGluZm8gCisgICByZXBsYXlDb3VudGVyOiAgIHJlcGxheSBjb3VudGVyIHRvIGJlIGZpbGxlZAorICAgdWNTbG90SW5kZXggIDogICBzbG90IGluZGV4IAorICAgICAgICAgICAgICAgICAKKyAgIFJFVFVSTiBWQUxVRQorICAgTk9ORSAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgU0lERSBFRkZFQ1RTIAorICAgTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFdMQU5UTF9GaWxsUmVwbGF5Q291bnRlcgorKAorICAgV0xBTlRMX0JBUmVvcmRlclR5cGUqICBwd0JhUmVvcmRlciwKKyAgIHZfVTY0X3QgICAgICAgICAgICAgICAgcmVwbGF5Q291bnRlciwKKyAgIHZfVThfdCAgICAgICAgICAgICAgICAgdWNTbG90SW5kZXgKKyk7CisjZW5kaWYgLypBTklfQ0hJUFNFVF9WT0xBTlMqLworCisjZW5kaWYgLyogI2lmbmRlZiBXTEFOX1FDVF9UTElfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy9ldmVudF9kZWZzLmggYi9DT1JFL1ZPU1MvaW5jL2V2ZW50X2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzE2MTM4Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy9ldmVudF9kZWZzLmgKQEAgLTAsMCArMSwxOTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBFVkVOVF9ERUZTX0gKKyNkZWZpbmUgRVZFTlRfREVGU19ICisKKwordHlwZWRlZiBlbnVtCit7CisgIEVWRU5UX0RST1BfSUQgPSAwLAorCisgIEVWRU5UX0JBTkRfQ0xBU1NfQ0hBTkdFID0gMHgwMTAwLCAgIC8qIEluY2x1ZGVzIGJhbmQgY2xhc3MgYXMgcGF5bG9hZCAqLworICBFVkVOVF9DRE1BX0NIX0NIQU5HRSwgICAgICAgICAgICAgICAvKiBJbmNsdWRlcyBjZG1hIGNoYW5uZWwgYXMgcGF5bG9hZCAqLworICBFVkVOVF9CU19QX1JFVl9DSEFOR0UsICAgICAgICAgICAgICAvKiBJbmNsdWRlcyBCUyBwX3JldiBhcyBwYXlsb2FkICovCisgIEVWRU5UX1BfUkVWX0lOX1VTRV9DSEFOR0UsICAgICAgICAgIC8qIEluY2x1ZGVzIHBfcmV2X2luX3VzZSBhcyBwYXlsb2FkICovCisgIEVWRU5UX1NJRF9DSEFOR0UsICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzIFNJRCBhcyBwYXlsb2FkICovCisgIEVWRU5UX05JRF9DSEFOR0UsICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzIE5JRCBhcyBwYXlsb2FkICovCisgIEVWRU5UX1BaSURfQ0hBTkdFLCAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzIFBaSUQgYXMgcGF5bG9hZCAqLworICBFVkVOVF9QREVfU0VTU0lPTl9FTkQsICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX09QX01PREVfQ0hBTkdFLCAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzIG9wZXJhdGlvbiBtb2RlIGFzIHBheWxvYWQgKi8KKyAgRVZFTlRfTUVTU0FHRV9SRUNFSVZFRCwgICAgICAgICAgICAgLyogSW5jbHVkZXMgY2hhbm5lbCBhbmQgbWVzc2FnZSBJRCBhcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCAqLworICBFVkVOVF9NRVNTQUdFX1RSQU5TTUlUVEVELCAgICAgICAgICAvKiBJbmNsdWRlcyBjaGFubmVsIGFuZCBtZXNzYWdlIElEIGFzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkICovCisgIEVWRU5UX1RJTUVSX0VYUElSRUQsICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzIHRpbWVyIElEIGFzIHBheWxvYWQgKi8KKyAgRVZFTlRfQ09VTlRFUl9USFJFU0hPTEQsICAgICAgICAgICAgLyogSW5jbHVkZXMgY291bnRlciBJRCBhcyBwYXlsb2FkICovCisgIEVWRU5UX0NBTExfUFJPQ0VTU0lOR19TVEFURV9DSEFOR0UsIC8qIEluY2x1ZGVzIG5ldyBzdGF0ZSBhbmQgb2xkIHN0YXRlIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgKi8gCisgIEVWRU5UX0NBTExfQ09OVFJPTF9JTlNUQU5USUFURUQsICAgIC8qIEluY2x1ZGVzIGNvbl9yZWYgYXMgcGF5bG9hZCAqLworICBFVkVOVF9DQUxMX0NPTlRST0xfU1RBVEVfQ0hBTkdFLCAgICAvKiBJbmNsdWRlcyBjb25fcmVmLCBvbGQgc3Vic3RhdGUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBzdWJzdGF0ZSBhcyBwYXlsb2FkICovCisgIEVWRU5UX0NBTExfQ09OVFJPTF9URVJNSU5BVEVELCAgICAgIC8qIEluY2x1ZGVzIGNvbl9yZWYgYXMgcGF5bG9hZCAqLworICBFVkVOVF9SRUdfWk9ORV9DSEFOR0UsICAgICAgICAgICAgICAvKiBJbmNsdWRlcyByZWdfem9uZSBhcyBwYXlsb2FkICovIAorICBFVkVOVF9TTE9UVEVEX01PREVfT1BFUkFUSU9OLCAgICAgICAvKiBJbmNsdWRlcyBlbnRlci9leGl0IGJpdCBhcyBwYXlsb2FkICovCisgIEVWRU5UX1FQQ0hfSU5fVVNFLCAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzIGVuYWJsZS9kaXNhYmxlIGJpdCBhcyBwYXlsb2FkICovCisgIEVWRU5UX0lETEVfSEFORE9GRiwgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzIHBuX29mZnNldCBhcyBwYXlsb2FkICovCisgIEVWRU5UX0FDQ0VTU19IQU5ET0ZGLCAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzIHBuX29mZnNldCBhcyBwYXlsb2FkICovCisgIEVWRU5UX0FDQ0VTU19QUk9CRV9IQU5ET0ZGLCAgICAgICAgIC8qIEluY2x1ZGVzIHBuX29mZnNldCBhcyBwYXlsb2FkICovCisgIEVWRU5UX1NPRlRfSEFORE9GRiwgICAKKyAgICAvKiBJbmNsdWRlcyBwbl9vZmZzZXRzIG9mIGVhY2ggQlMgaW4gYXNldCBhbmQgaW5kaWNhdG9ycyB3aGV0aGVyIEJTIGluIFNDSCAKKyAgICAgICBhc2V0Ki8gCisgIEVWRU5UX0hBUkRfSEFORE9GRl9GUkVRX0NIQU5HRSwgCisgICAgLyogSW5jbHVkZXMgcG5fb2Zmc2V0cyBvZiBlYWNoIEJTIGluIGFzZXQgYW5kIGluZGljYXRvcnMgd2hldGhlciBCUyBpbiBTQ0ggCisgICAgICAgYXNldCovIAorICBFVkVOVF9IQVJEX0hBTkRPRkZfRlJBTUVfT0ZGU0VUX0NIQU5HRSwgCisgICAgLyogSW5jbHVkZXMgcG5fb2Zmc2V0cyBvZiBlYWNoIEJTIGluIGFzZXQgYW5kIGluZGljYXRvcnMgd2hldGhlciBCUyBpbiBTQ0ggCisgICAgICAgYXNldCovIAorICBFVkVOVF9IQVJEX0hBTkRPRkZfRElTSk9JTlRfQVNFVCwKKyAgICAvKiBJbmNsdWRlcyBwbl9vZmZzZXRzIG9mIGVhY2ggQlMgaW4gYXNldCBhbmQgaW5kaWNhdG9ycyB3aGV0aGVyIEJTIGluIFNDSCAKKyAgICAgICBhc2V0Ki8gCisgIEVWRU5UX1VOU1VDQ0VTU0ZVTF9IQVJEX0hBTkRPRkYsICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfVE1TSV9BU1NJR05FRCwgICAgICAgICAgICAgICAgLyogSW5jbHVkZXMgVE1TSSBhcyBwYXlsb2FkICovCisgIEVWRU5UX1NFUlZJQ0VfTkVHT1RJQVRJT05fQ09NUExFVEVELC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfU09fTkVHT1RJQVRJT05fQ09NUExFVEVELCAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9FTlRFUl9DT05UUk9MX0hPTERfTU9ERSwgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0VYSVRfQ09OVFJPTF9IT0xEX01PREUsICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfU1RBUlRfRldEX1NVUFBfQlVSU1RfQVNTR04sICAgLyogSW5jbHVkZXMgU0NIIHJhdGUgYXMgcGF5bG9hZCAqLworICBFVkVOVF9FTkRfRldEX1NVUFBfQlVSU1RfQVNTR04sICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1NUQVJUX1JFVl9TVVBQX0JVUlNUX0FTU0dOLCAgIC8qIEluY2x1ZGVzIFNDSCByYXRlIGFzIHBheWxvYWQgKi8KKyAgRVZFTlRfRU5EX1JFVl9TVVBQX0JVUlNUX0FTU0dOLCAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9EVFgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1RfQUREX0FCT1JULCAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQ0hfSU5EX0NIQU5HRSwgICAgICAgICAgICAgICAgLyogSW5jbHVkZSBjaF9pbmQgYXMgcGF5bG9hZCAqLworICBFVkVOVF9UUkFOU01JVFRFUl9ESVNBQkxFRCwgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1RSQU5TTUlUVEVSX0VOQUJMRUQsICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfU01TX1JFQ0VJVkVELCAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9TTVNfU0VOVCwgICAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0lOQUNUSVZJVFlfVElNRVJfRVhQSVJFRCwgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfRE9STUFOVF9USU1FUl9FWFBJUkVELCAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9BQ0NFU1NfQVRURU1QVF9GQUlMX01BWF9QUk9CRVNfU0VOVCwgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9BQ0NFU1NfQVRURU1QVF9GQUlMX0xPU1NfT0ZfUENfT1JfRkNDQywgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9QQ0hfQUNRVUlSRUQsICAgICAgICAgICAgICAgICAvKiBJbmNsdWRlcyBwYWdlY2ggYW5kIHBuX29mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBwYXlsb2FkICovCisgIEVWRU5UX0JDQ0hfQUNRVUlSRUQsICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzIHdhbHNoIGNvZGUgZm9yIEJDQ0ggYW5kIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbl9vZmZzZXQgYXMgcGF5bG9hZCAqLworICBFVkVOVF9GRkNIX0FDUVVJUkVELCAgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiAxNCBieXRlcyAqLworICBFVkVOVF9GRENDSF9BQ1FVSVJFRCwgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiAxNCBieXRlcyAqLworICBFVkVOVF9GRkNIX1BMVVNfRENDSF9BQ1FVSVJFRCwgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1JFR0lTVFJBVElPTl9QRVJGT1JNRUQsICAgICAgIC8qIEluY2x1ZGVzIHJlZ190eXBlIGFzIHBheWxvYWQgKi8gCisgIEVWRU5UX05FV19TWVNURU1fSURMRV9IQU5ET0ZGLCAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfU1lTVEVNX1JFU0VMRUNUSU9OLCAgICAgICAgICAgLyogSW5jbHVkZXMgZWNpbyBhbmQgcHMgYXMgcGF5bG9hZCAqLworICBFVkVOVF9SRVNDQU4sICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1BST1RPQ09MX01JU01BVENILCAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfTE9DSywgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9VTkxPQ0ssICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0FDQ0VTU19ERU5JRUQsICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfTkRTU19PRkYsICAgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9SRUxFQVNFLCAgICAgICAgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiAxIGJ5dGUgKi8KKyAgRVZFTlRfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9SRURJUkVDVElPTiwgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1JFR0lTVFJBVElPTl9SRUpFQ1RFRCwgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfV1JPTkdfU1lTVEVNLCAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9XUk9OR19ORVRXT1JLLCAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0xPU1NfT0ZfQUNRX0FGVEVSX1NMRUVQLCAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUE9XRVJfRE9XTiwgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9DQUxMX1JFTEVBU0VfUkVRVUVTVCwgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1NFUlZJQ0VfSU5BQ1RJVkUsICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfRVhURU5ERURfUkVMRUFTRSwgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworCisgIEVWRU5UX0hEUl9NU0dfUlgsICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sLCBtc2ctIDMgYnl0ZXMgKi8KKyAgRVZFTlRfSERSX1JYTVNHX0lHTk9SRURfU1RBVEUsICAgICAgLyogcHJvdG9jb2wsIG1zZy0gMyBieXRlcyAqLworICBFVkVOVF9IRFJfUlhNU0dfSUdOT1JFRF9TRVEsICAgICAgICAvKiBwcm90b2NvbCwgbXNnLSAzIGJ5dGVzICovCisgIEVWRU5UX0hEUl9UWE1TR19BQ0tFRCwgICAgICAgICAgICAgIC8qIHByb3RvY29sLCBtc2ctIDMgYnl0ZXMgKi8KKyAgRVZFTlRfSERSX1RYTVNHX0RST1BQRUQsICAgICAgICAgICAgLyogcHJvdG9jb2wsIG1zZy0gMyBieXRlcyAqLyAgICAgIAorICBFVkVOVF9IRFJfU1RBVEVfQ0hBTkdFLCAgICAgICAgICAgICAvKiBwcm90b2NvbCwgZnJvbSwgdG8gLSA1IGJ5dGVzICovCisgIEVWRU5UX0hEUl9BTE1QX09CRVlJTkdfUkVESVJFQ1RJT04sIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0FMTVBfQ09OTkVDVElPTl9DTE9TRUQsICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfQUxNUF9UX1NEX1JFU0VMRUNULCAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9BTE1QX0NPTk5FQ1RJT05fT1BFTkVELCAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0hNUF9RVUVVRURfTVNHLCAgICAgICAgICAgLyogcHJvdG9jb2wsIG1zZy0gMyBieXRlcyAqLworICBFVkVOVF9IRFJfSE1QX1NFTlRfTVNHLCAgICAgICAgICAgICAvKiBwcm90b2NvbCwgbXNnLCBjaGFuLCBpc19yZWxpYWJsZSAtIDUgYnl0ZXMgKi8KKyAgRVZFTlRfSERSX0hNUF9BQk9SVElOR19BQ01BQ19BQ1RJVkFUSU9OLCAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9JRExFX1RfQ09ORklHX1JTUCwgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0lETEVfVF9BVF9TRVRVUCwgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfSURMRV9UX1NVU1BFTkQsICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9JRExFX0NPTk5FQ1RJT05fREVOSUVELCAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0lOSVRfVF9TWU5DX0FDUSwgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfSU5JVF9QUk9UT0NPTF9NSVNNQVRDSCwgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9PVkhEX0lORk9fQ1VSUkVOVCwgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX09WSERfVF9RQ19TVVBFUlZJU0lPTiwgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfT1ZIRF9UX1NQX1NVUEVSVklTSU9OLCAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9PVkhEX1RfQVBfU1VQRVJWSVNJT04sICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX09WSERfSUdOT1JFRF9NU0dfVU5FWFBFQ1RFRF9MSU5LLCAvKiBtc2csIGV4cF9saW5rLmNoYW5fbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cF9saW5rLnBpbG90LCByeF9saW5rLmNoYW5fbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4X2xpbmsucGlsb3QgLSAxMCBieXRlcyAqLworICBFVkVOVF9IRFJfT1ZIRF9JR05PUkVEX1NQX01TR19ESUZGX1NFQ19TSUcsIC8qIGV4cF9zaWcsIHJ4X3NpZyAtIDggYnl0ZXMgKi8KKyAgRVZFTlRfSERSX09WSERfSUdOT1JFRF9BUF9NU0dfRElGRl9BQ0NfU0lHLCAvKiBleHBfc2lnLCByeF9zaWcgLSA4IGJ5dGVzICovCisgIEVWRU5UX0hEUl9PVkhEX0lHTk9SRURfU1BfTVNHX0RJRkZfU0VDX0lELCAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfT1ZIRF9TUF9NU0dfUlgsICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9PVkhEX0FQX01TR19SWCwgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX1JVUF9UX0NPTk5FQ1RJT05fU0VUVVAsICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfU0xQX01BWF9SRVRSSUVTLCAgICAgICAgICAvKiBtc2cgLSAyIGJ5dGVzICovCisgIEVWRU5UX0hEUl9MTUFDX0FDUV9GQUlMX1BJTE9ULCAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0xNQUNfQUNRX1NVQ0NFU1MsICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfTE1BQ19ORVRXT1JLX0xPU1QsICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9MTUFDX0lETEVfSE8sICAgICAgICAgICAgIC8qIG5ld19waWxvdCAtIDIgYnl0ZXMgKi8KKyAgRVZFTlRfSERSX0xNQUNfQ0hBTl9DSEFOR0VfQ09NUExFVEUsIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0xNQUNfQUNDRVNTX0hPX05FRURFRCwgICAgLyogc3VnZ2VzdGVkX3BpbG90IC0gMiBieXRlcyAqLworICBFVkVOVF9IRFJfTE1BQ19BQ0NFU1NfSE9fQ09NUExFVEUsICAvKiBuZXdfcGlsb3QgLSAyIGJ5dGVzICovCisgIEVWRU5UX0hEUl9MTUFDX0FDUVVJUkUsICAgICAgICAgICAgIC8qIGNoYW5uZWwgMiBieXRlcyAqLworICBFVkVOVF9IRFJfTE1BQ19DSEFOR0lOR19DQ19IQVNILCAgICAvKiBjY19oYXNoIC0gMSBieXRlICovCisgIEVWRU5UX0hEUl9MTUFDX0lETEVfQ0hBTl9DSEFOR0UsICAgIC8qIGNoYW5uZWwgLSAyIGJ5dGVzICovCisgIEVWRU5UX0hEUl9DTUFDX1RfU1VQRVJWSVNJT04sICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0FNQUNfU1RBUlRfQUNDRVNTLCAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfQU1BQ19QUk9CSU5HX1NUT1BQRUQsICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9BTUFDX0FDQ0VTU19DT01QTEVURSwgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0FNQUNfQUNDRVNTX0FCT1JURUQsICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfQU1BQ19NQVhfUFJPQkVTLCAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9GTUFDX0RST1BfUEtULCAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX1JNQUNfVF9SQVRFX0xJTUlULCAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfUk1BQ19UWF9TVEFSVEVELCAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9STUFDX1RYX1NUT1BQRUQsICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX1NNUF9UX0tFRVBfQUxJVkUsICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfQU1QX0FTU0lHTl9NU0dfSUdOT1JFRF9GUkVTSCwgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfQU1QX1RfQVRfUkVTUE9OU0UsICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9BTVBfVF9EVUFMX0FERFJFU1MsICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX1NDUF9CRUdJTl9DT05GSUdVUkFUSU9OLCAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfU0NQX1RfQ09ORklHX1JTUCwgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9TQ1BfVF9BTl9JTklUX1NUQVRFLCAgICAgIC8qIE5vIHBheWxvYWQgKi8KKworICBFVkVOVF9XQ0RNQV9MMV9TVEFURSwgICAgICAgICAgICAgICAvKiBsMV9zdGF0ZSAtIDEgYnl0ZSAqLworICBFVkVOVF9XQ0RNQV9JTVNJLCAgICAgICAgICAgICAgICAgICAvKiBJTVNJIC0gOSBieXRlcyAqLworICBFVkVOVF9HU01fTDFfU1RBVEUsICAgICAgICAgICAgICAgICAvKiBHU00gbDFfc3RhdGUgLSAxIGJ5dGUgKi8KKyAgRVZFTlRfUkFORE9NX0FDQ0VTU19SRVFVRVNULCAgICAgICAgLyogR1NNIFJhbmRvbSBBY2Nlc3MgUmVxdWVzdCAtIDQgYnl0ZXMgKi8KKyAgRVZFTlRfSElHSF9MRVZFTF9DQUxMX1BST0NFU1NJTkdfU1RBVEVfQ0hBTkdFLCAvKiBQdW1hIHJlcXVlc3RlZCBldmVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChzYW1lIHBheWxvYWQgYXMgQ0FMTF9QUk9DRVNTSU5HX1NUQVRFX0NIQU5HRSkgKi8KKyAgRVZFTlRfRU5DUllQVElPTl9GQUlMVVJFLCAgICAgICAgICAgICAgICAgIC8qIFB1bWEgZXZlbnQsIG5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQUNDVF9CTE9DS0VELCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFB1bWEgZXZlbnQsIG5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQ09NTU9OX0NIQU5ORUxfTU9OSVRPUkVELCAgICAgICAgICAgIC8qIFB1bWEgZXZlbnQsIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NPRlRfSEFORE9GRl9WMiwgICAgICAgICAgICAgICAgICAgICAvKiBQdW1hIGV2ZW50LCAxNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSEFSRF9IQU5ET0ZGX0ZSRVFfQ0hBTkdFX1YyLCAgICAgICAgIC8qIFB1bWEgZXZlbnQsIDE0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9IQVJEX0hBTkRPRkZfRlJBTUVfT0ZGU0VUX0NIQU5HRV9WMiwgLyogUHVtYSBldmVudCwgMTQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0hBUkRfSEFORE9GRl9ESVNKT0lOVF9BU0VUX1YyLCAgICAgICAvKiBQdW1hIGV2ZW50LCAxNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0NETUFfTkVXX1JFRkVSRU5DRV9DRUxMLAorICBFVkVOVF9DQUxMX0NPTlRST0xfQ09OUkVGX0NIQU5HRSwgICAgICAgICAgLyogUHVtYSBldmVudCwgMiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9HUFNfU0VTU0lPTl9CRUdJTiwKKyAgRVZFTlRfR1BTX1NFU1NJT05fRU5ELAorICBFVkVOVF9HUFNfV0FJVElOR19PTl9TQSwKKyAgRVZFTlRfR1BTX1BQTV9TVEFSVCwKKyAgRVZFTlRfR1BTX1BQTV9SRVNVTFRTLAorICBFVkVOVF9HUFNfUFBNX0VORCwKKyAgRVZFTlRfR1BTX1ZJU0lUX0JFR0lOLAorICBFVkVOVF9HUFNfVklTSVRfRU5ELAorICBFVkVOVF9HUFNfQ0RNQV9SRVNVTUVEX0FGVEVSX0dQU19WSVNJVCwKKyAgRVZFTlRfR1BTX1BEX1NFU1NJT05fQkVHSU4sCisgIEVWRU5UX0dQU19QRF9TRVNTSU9OX0VORCwgICAgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiAxIGJ5dGUgUERTTSBzdWJzdGF0ZSAqLworICBFVkVOVF9HUFNfSVM4MDFfUlgsICAgICAgICAgICAgICAgICAgICAgICAgLyogUGF5bG9hZCwgMSBieXRlIG1zZ190eXBlICovCisgIEVWRU5UX0dQU19JUzgwMV9UWCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiAxIGJ5dGUgbXNnX3R5cGUgKi8KKyAgRVZFTlRfUE9XRVJVUCwKKyAgRVZFTlRfV0NETUFfQVNFVCwKKyAgRVZFTlRfQ01fQ0FMTF9TVEFURSwgICAgICAgICAgICAgICAgICAgICAgIC8qICgxIGJ5dGUgcGF5bG9hZDogb3ZlcmFsbCBjYWxsIHN0YXRlKSAqLworICBFVkVOVF9DTV9PUEVSQVRJT05BTF9NT0RFLCAgICAgICAgICAgICAgICAgLyogKDEgYnl0ZSBwYXlsb2FkOiBvcCBtb2RlKSAqLworICBFVkVOVF9DTV9TWVNURU1fTU9ERSwgICAgICAgICAgICAgICAgICAgICAgLyogKDEgYnl0ZSBwYXlsb2FkOiBzeXNfbW9kZSkgKi8KKworICBFVkVOVF9ERUVQX1NMRUVQLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gcGF5bG9hZCAqLworICBFVkVOVF9XQUtFVVAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5zaWduZWQgbG9uZyAoNCBieXRlcykgcGF5bG9hZCAqLworICBFVkVOVF9BQ1FVSVNJVElPTl9NT0RFLCAgICAgICAgICAgICAgICAgICAgLyogdW5zaWduZWQgY2hhciAoMSBieXRlKSBwYXlsb2FkICovCisgIEVWRU5UX0FDUVVJU0lUSU9OX1RZUEUsICAgICAgICAgICAgICAgICAgICAvKiB1bnNpZ25lZCBjaGFyICgxIGJ5dGUpIHBheWxvYWQgKi8KKyAgRVZFTlRfQUNQX0VYSVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuc2lnbmVkIGNoYXIgKDEgYnl0ZSkgcGF5bG9hZCAqLworICBFVkVOVF9DRE1BX0VYSVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5zaWduZWQgY2hhciAoMSBieXRlKSBwYXlsb2FkICovCisKKyAgRVZFTlRfSERSX0hZQlJJRF9QT1dFUl9TQVZFLCAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0RFRVBfU0xFRVAsICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX1JFU0VMRUNUSU9OLCAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfU0FNX0xPQ0tfR1JBTlRFRCwgICAgICAgICAgICAgICAgICAgIC8qIDxOZXdPd25lciAoMSBieXRlKSA8RHVyYXRpb24gKDIgYnl0ZXMpICovCisgIEVWRU5UX1NBTV9MT0NLX1JFTEVBU0VELCAgICAgICAgICAgICAgICAgICAvKiA8T2xkT3duZXIgKDEgYnl0ZSkgKi8KKworICBFVkVOVF9HU01fSEFORE9WRVJfU1RBUlQsCisgIEVWRU5UX0dTTV9IQU5ET1ZFUl9FTkQsCisgIEVWRU5UX0dTTV9MSU5LX0ZBSUxVUkUsCisgIEVWRU5UX0dTTV9SRVNFTEVDVF9TVEFSVCwKKyAgRVZFTlRfR1NNX1JFU0VMRUNUX0VORCwKKyAgRVZFTlRfR1NNX0NBTVBfQVRURU1QVF9TVEFSVCwKKyAgRVZFTlRfR1NNX1JSX0lOX1NFUlZJQ0UsCisgIEVWRU5UX0dTTV9SUl9PVVRfT0ZfU0VSVklDRSwKKyAgRVZFTlRfR1NNX1BBR0VfUkVDRUlWRUQsCisgIEVWRU5UX0dTTV9DQU1QX0FUVEVNUFRfRU5ELAorICBFVkVOVF9HUFNfSVM4MDFfVElNRU9VVCwKKyAgRVZFTlRfR1BTX0lTODAxX0RJU0NBUkQsICAgICAgICAgICAgICAgICAgIC8qIFBheWxvYWQ6IDEgYnl0ZSBtc2cgdHlwZSAqLworICBFVkVOVF9HU01fQ0VMTF9TRUxFQ1RJT05fU1RBUlQsICAgICAgICAgICAgLyogUGF5bG9hZDogMSBieXRlIGNlbGxfc2VsZWN0aW9uX3JlYXNvbiAqLworICBFVkVOVF9HU01fQ0VMTF9TRUxFQ1RJT05fRU5ELCAgICAgICAgICAgICAgLyogUGF5bG9hZDogMSBieXRlIGVuZF9zdGF0dXMgc3VjY2Vzcy9mYWlsdXJlIHJlYXNvbiAqLworICBFVkVOVF9HU01fUE9XRVJfU0NBTl9TVEFUVVMsICAgICAgICAgICAgICAgLyogUGF5bG9hZDogMSBieXRlIHN0YXR1cyAoc3RhcnRlZCBvciBjb21wbGV0ZWQpICovCisgIEVWRU5UX0dTTV9QTE1OX0xJU1RfU1RBUlQsICAgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiAxIGJ5dGUgKi8KKyAgRVZFTlRfR1NNX1BMTU5fTElTVF9FTkQsCisgIEVWRU5UX1dDRE1BX0lOVEVSX1JBVF9IQU5ET1ZFUl9TVEFSVCwgICAgICAvKiBQYXlsb2FkOiA0IGJ5dGVzIGhhbmRvdmVyIHR5cGUsIEJDQ0ggQVJGQ04sIEJTSUMgKi8KKyAgRVZFTlRfV0NETUFfSU5URVJfUkFUX0hBTkRPVkVSX0VORCwgICAgICAgIC8qIFBheWxvYWQ6IDIgYnl0ZXMgc3VjY2VzcywgZmFpbHVyZSByZWFzb24gKi8KKworICBFVkVOVF9HU01fTUVTU0FHRV9TRU5ULCAgICAgICAgICAgICAgICAgICAgLyogUGF5bG9hZDogMiBieXRlcyBpbmRpY2F0aW5nIGlkZW50aXR5IG9mIHRoZSBtZXNzYWdlICovCisgIEVWRU5UX0dTTV9NRVNTQUdFX1JFQ0VJVkVELCAgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiAyIGJ5dGVzIGluZGljYXRpbmcgaWRlbnRpdHkgb2YgdGhlIG1lc3NhZ2UgKi8KKyAgRVZFTlRfR1NNX1RJTUVSX0VYUElSRUQsICAgICAgICAgICAgICAgICAgIC8qIFBheWxvYWQ6IDIgYnl0ZXMgaW5kaWNhdGluZyBpZGVudGl0eSBvZiB0aGUgbWVzc2FnZSAqLworICBFVkVOVF9HU01fQ09VTlRFUl9FWFBJUkVELCAgICAgICAgICAgICAgICAgLyogUGF5bG9hZDogMiBieXRlcyBpbmRpY2F0aW5nIGlkZW50aXR5IG9mIHRoZSBtZXNzYWdlICovCisKKyAgRVZFTlRfTkFTX01FU1NBR0VfU0VOVCwKKyAgRVZFTlRfTkFTX01FU1NBR0VfUkVDRUlWRUQsCisgIEVWRU5UX1JSQ19NRVNTQUdFX1NFTlQsCisgIEVWRU5UX1JSQ19NRVNTQUdFX1JFQ0VJVkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FtZXJhIGV2ZW50czogTm8gUGF5bG9hZCAqLworICBFVkVOVF9DQU1FUkFfQ0FOTk9UX0NBUFRVUkUsICAgICAgLyogQ2Fubm90IGNhcHR1cmUsIHRyYW5zaXRpb24gdG8gcmVhZHkgKi8KKyAgRVZFTlRfQ0FNRVJBX0NBTk5PVF9DT05GSUdfSlBFRywgIC8qIENhbm5vdCBjb25maWcgSlBFRywgdHJhbnNpdGlvbiB0byByZWFkeSAqLworICBFVkVOVF9DQU1FUkFfQ0FOTk9UX0NPTkZJR19WRkUsICAgLyogQ2Fubm90IGNvbmZpZyBWRkUsIHRyYW5zaXRpb24gdG8gcmVhZHkgKi8KKyAgRVZFTlRfQ0FNRVJBX0NBTk5PVF9FTkNPREUsICAgICAgIC8qIENhbm5vdCBlbmNvZGUsIHRyYW5zaXRpb24gdG8gcmVhZHkgKi8KKyAgRVZFTlRfQ0FNRVJBX0NBTk5PVF9JRExFX0RTUCwgICAgIC8qIENhbm5vdCBpZGxlIERTUCwgdHJhbnNpdGlvbiB0byByZWFkeSAqLworICBFVkVOVF9DQU1FUkFfQ0FOTk9UX0xPQURfRFNQLCAgICAgLyogQ2Fubm90IGxvYWQgRFNQLCB0cmFuc2l0aW9uIHRvIHJlYWR5ICovCisgIEVWRU5UX0NBTUVSQV9EU1BfRkFUQUwsICAgICAgICAgICAvKiBEU1AgZmF0YWwgZXJyb3IsIHRyYW5zaXRpb24gdG8gcmVhZHkgKi8KKyAgRVZFTlRfQ0FNRVJBX0RTUF9SRVFfSUxMRUdBTCwgICAgIC8qIERTUCByZXF1ZXN0IGlsbGVnYWwsIHRyYW5zaXRpb24gdG8gcmVhZHkgKi8KKyAgRVZFTlRfQ0FNRVJBX0VGU19GQUlMRUQsICAgICAgICAgIC8qIEVGUyBmYWlsZWQsIHRyYW5zaXRpb24gdG8gcmVhZHkgKi8KKyAgRVZFTlRfQ0FNRVJBX0VYSVQsICAgICAgICAgICAgICAgIC8qIFN0b3AsIHRyYW5zaXRpb24gdG8gcmVhZHkgKi8KKyAgRVZFTlRfQ0FNRVJBX0ZPUk1BVF9OT1RfU1VQUE9SVEVELC8qIEZvcm1hdCBub3Qgc3VwcG9ydGVkICovCisgIEVWRU5UX0NBTUVSQV9GVU5DVElPTl9SRUpFQ1RFRCwgICAvKiBGdW5jdGlvbiByZWplY3RlZCwgdHJhbnNpdGlvbiB0byByZWFkeSAqLworICBFVkVOVF9DQU1FUkFfSU1BR0VfQ09SUlVQVCwgICAgICAgLyogSW1hZ2UgY29ycnVwdGVkLCByZWNvbmZpZyAqLworICBFVkVOVF9DQU1FUkFfSU5WQUxJRF9DT05GSUdfUEFSTSwgLyogSW52YWxpZCBjb25maWcgcGFybSwgdG8gcmVhZHkgKi8KKyAgRVZFTlRfQ0FNRVJBX0lOVkFMSURfU0VUX0lELCAgICAgIC8qIEludmFsaWQgc2V0IHBhcmFtIElEIHR5cGUgKi8KKyAgRVZFTlRfQ0FNRVJBX0lOVkFMSURfU1RBVEUsICAgICAgIC8qIEludmFsaWQgc3RhdGUgKi8KKyAgRVZFTlRfQ0FNRVJBX0pQRUdfRU5DT0RFRCwgICAgICAgIC8qIEpQRUcgZW5jb2RlZCAqLworICBFVkVOVF9DQU1FUkFfTk9fTUVNT1JZLCAgICAgICAgICAgLyogTm8gbWVtb3J5LCB0cmFuc2l0aW9uIHRvIHJlYWR5ICovCisgIEVWRU5UX0NBTUVSQV9OT19QSUNUVVJFLCAgICAgICAgICAvKiBQaWN0dXJlIG5vdCByZWFkeSAqLworICBFVkVOVF9DQU1FUkFfUElDVFVSRV9TQVZFRCwgICAgICAgLyogUGljdHVyZSBzYXZlZCwgdHJhbnNpdGlvbiB0byByZWFkeSAqLworICBFVkVOVF9DQU1FUkFfUElDVFVSRV9UQUtFTiwgICAgICAgLyogUGljdHVyZSB0YWtlbiwgdHJhbnNpdGlvbiB0byByZWFkeSAqLworICBFVkVOVF9DQU1FUkFfUFJFVklFVywgICAgICAgICAgICAgLyogRW50ZXIgcHJldmlldyAqLworICBFVkVOVF9DQU1FUkFfUkVDT1JELCAgICAgICAgICAgICAgLyogRW50ZXIgcmVjb3JkaW5nICovCisgIEVWRU5UX0NBTUVSQV9TQVZFX1BJQ1RVUkUsICAgICAgICAvKiBFbnRlciBzYXZlIHBpY3R1cmUgKi8KKyAgRVZFTlRfQ0FNRVJBX1NFVF9GQUlMRUQsICAgICAgICAgIC8qIFNldCBmYWlsZWQgKi8KKyAgRVZFTlRfQ0FNRVJBX1NFVF9TVUNDRUVERUQsICAgICAgIC8qIFNldCBzdWNjZWVkZWQgKi8KKyAgRVZFTlRfQ0FNRVJBX1NUQVJULCAgICAgICAgICAgICAgIC8qIFN0YXJ0LCB0cmFuc2l0aW9uIHRvIHJlYWR5ICovCisgIEVWRU5UX0NBTUVSQV9TVE9QLCAgICAgICAgICAgICAgICAvKiBTdG9wLCB0cmFuc2l0aW9uIHRvIGluaXQgKi8KKyAgRVZFTlRfQ0FNRVJBX1RBS0VfUElDVFVSRSwgICAgICAgIC8qIEVudGVyIHRha2UgcGljdHVyZSAqLworCisgIEVWRU5UX0RJQUdfU1RSRVNTX1RFU1RfTk9fUEFZTE9BRCwKKyAgRVZFTlRfRElBR19TVFJFU1NfVEVTVF9XSVRIX1BBWUxPQUQsCisKKyAgRVZFTlRfQ01fQ0FMTF9PUklHX1NUQVJUX1AxLCAgICAgIC8qIFBheWxvYWQ6IDUgc2luZ2xlIGJ5dGVzICovCisgIEVWRU5UX0NNX0NBTExfT1JJR19TVEFSVF9QMiwgICAgICAvKiBQYXlsb2FkOiAzIHNpbmdsZSBieXRlcyAqLworICBFVkVOVF9DTV9DQUxMX09SSUdfU1RBUlRfUDMsICAgICAgLyogUGF5bG9hZDogMyBzaW5nbGUgYnl0ZXMgKi8KKyAgRVZFTlRfQ01fQ0FMTF9PUklHX1NXSVRDSF9UT19IRFIsIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fQ0FMTF9PUklHX1JFRElBTCwgICAgICAgIC8qIFBheWxvYWQ6IDQgYnl0ZXMgKi8KKyAgRVZFTlRfQ01fQ0FMTF9PUklHX1NFTkRfSERSX09SSUcsIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fQ0FMTF9PUklHX1NFTkRfTUNfT1JJRywgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fQ0FMTF9PUklHX0VORCwgICAgICAgICAgIC8qIFBheWxvYWQ6IDIgYnl0ZXMgKi8KKyAgRVZFTlRfQ01fQ0FMTF9PUklHX0NPTk5FQ1RFRCwgICAgIC8qIFBheWxvYWQ6IDMgYnl0ZXMgKi8KKworICBFVkVOVF9NVF9TTVNfTk9USUZZLCAgICAgICAgICAgICAgLyogUGF5bG9hZDogMSBieXRlIG1lbV90eXBlLCA0IGJ5dGUgbXNnX2luZGV4ICovCisgIEVWRU5UX1NNU19TTE9UX1dBS0VVUCwgICAgICAgICAgICAvKiBQYXlsb2FkOiAxIGJ5dGUgc2xvdF9tYXNrICovCisgIEVWRU5UX01PX1NNU19TVEFUVVMsICAgICAgICAgICAgICAvKiBQYXlsb2FkOiA0IGJ5dGUgdHJhbnNhY3Rpb25faWQsIDEgYnl0ZSBtZW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZSBtc2dfaW5kZXgsIDEgYnl0ZSByZXBvcnRfc3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgYnl0ZSBjYXNlX2NvZGUgKi8KKyAgRVZFTlRfR1BSU19TVVJST1VORF9TRUFSQ0hfU1RBUlQsCisgIEVWRU5UX0dQUlNfU1VSUk9VTkRfU0VBUkNIX0VORCwKKyAgRVZFTlRfR1BSU19NQUNfUkVTRUxFQ1RfSU5ELAorICBFVkVOVF9HUFJTX1BBR0VfUkVDRUlWRUQsCisgIEVWRU5UX0dQUlNfTElOS19GQUlMVVJFLAorICBFVkVOVF9HUFJTX0NFTExfVVBEQVRFX1NUQVJULAorICBFVkVOVF9HUFJTX0NFTExfVVBEQVRFX0VORCwKKyAgRVZFTlRfR1BSU19FQVJMWV9DQU1QSU5HLAorICBFVkVOVF9QQUNLRVRfUkFORE9NX0FDQ0VTU19SRVEsCisgIEVWRU5UX0dQUlNfTUFDX01TR19TRU5ULCAgICAgICAgICAvKiBQYXlsb2FkOiAzIGJ5dGVzIGdpdmluZyBtZXNzYWdlIGlkZW50aXR5IGFuZCBjaGFubmVsICovCisgIEVWRU5UX0dQUlNfTUFDX01TR19SRUNFSVZFRCwgICAgICAvKiBQYXlsb2FkOiAzIGJ5dGVzIGdpdmluZyBtZXNzYWdlIGlkZW50aXR5IGFuZCBjaGFubmVsICovCisgIEVWRU5UX0dQUlNfU01HTU1fTVNHX1NFTlQsICAgICAgICAvKiBQYXlsb2FkOiAzIGJ5dGVzIGdpdmluZyBtZXNzYWdlIGlkZW50aXR5IGFuZCBjaGFubmVsICovCisgIEVWRU5UX0dQUlNfU01HTU1fTVNHX1JFQ0VJVkVELCAgICAvKiBQYXlsb2FkOiAzIGJ5dGVzIGdpdmluZyBtZXNzYWdlIGlkZW50aXR5IGFuZCBjaGFubmVsICovCisKKyAgRVZFTlRfQ1BfTUFUQ0hFRF9NU0csICAgICAgICAgICAgIC8qIFBheWxvYWQ6IDEgYnl0ZSAqLworICBFVkVOVF9QUkVGX1NZU19SRVNFTCwgICAgICAgICAgICAgLyogUGF5bG9hZDogbm9uZSAqLyAKKworICBFVkVOVF9XQ0RNQV9MQVlFUjFfUFJBQ0gsICAgICAgICAgLyogUGF5bG9hZDogNCBieXRlcyAqLworICBFVkVOVF9XQ0RNQV9MQVlFUjFfTUVBU1VSRU1FTlQsICAgLyogUGF5bG9hZDogVW5zcGVjaWZpZWQgKi8KKworICBFVkVOVF9NT0JJTElUWV9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSwgLyogUGF5bG9hZDogMSBieXRlIG9sZCBzdGF0ZSwgMSBieXRlIG5ldyBzdGF0ZSAqLworCisgIEVWRU5UX0xTTV9TVEFURV9DSEFOR0UsICAgICAgICAgICAvKiBQYXlsb2FkOiAxIGJ5dGUgKi8KKyAgRVZFTlRfUkxQLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBheWxvYWQ6IDIgYnl0ZXMgKi8KKworICBFVkVOVF9DTV9NT0RFX1BSRUYsICAgICAgICAgICAgICAgLyogUGF5bG9hZDogNCBieXRlcyAqLworICBFVkVOVF9DTV9CQU5EX1BSRUYsICAgICAgICAgICAgICAgLyogUGF5bG9hZDogNCBieXRlcyAqLworICBFVkVOVF9DTV9ST0FNX1BSRUYsICAgICAgICAgICAgICAgLyogUGF5bG9hZDogNCBieXRlcyAqLworICBFVkVOVF9DTV9TUlZfRE9NQUlOX1BSRUYsICAgICAgICAgLyogUGF5bG9hZDogNCBieXRlcyAqLworICBFVkVOVF9DTV9HV19BQ1FfT1JERVJfUFJFRiwgICAgICAgLyogUGF5bG9hZDogNCBieXRlcyAqLworICBFVkVOVF9DTV9IWUJSSURfUFJFRiwgICAgICAgICAgICAgLyogUGF5bG9hZDogNCBieXRlcyAqLworICBFVkVOVF9DTV9ORVRXT1JLX1NFTF9NT0RFX1BSRUYsICAgLyogUGF5bG9hZDogNCBieXRlcyAqLworCisgIEVWRU5UX1dDRE1BX0wxX1NVU1BFTkQsICAgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiAzIGJ5dGVzICovCisgIEVWRU5UX1dDRE1BX0wxX1JFU1VNRSwgICAgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiA1IGJ5dGVzICovCisgIEVWRU5UX1dDRE1BX0wxX1NUT1BQRUQsICAgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiA0IGJ5dGVzICovCisgIEVWRU5UX1dDRE1BX1RPX1dDRE1BX1JFU0VMRUNUSU9OX1NUQVJULCAvKiBQYXlsb2FkOiA2IGJ5dGVzICovCisgIEVWRU5UX1dDRE1BX1RPX0dTTV9SRVNFTEVDVElPTl9TVEFSVCwgICAvKiBQYXlsb2FkOiA0IGJ5dGVzICovCisgIEVWRU5UX1dDRE1BX1RPX0dTTV9SRVNFTEVDVElPTl9FTkQsICAgICAvKiBQYXlsb2FkOiAyIGJ5dGVzICovCisgIEVWRU5UX1dDRE1BX1RPX1dDRE1BX1JFU0VMRUNUSU9OX0VORCwgICAvKiBQYXlsb2FkOiA0IGJ5dGVzICovCisgIEVWRU5UX1dDRE1BX1JBQ0hfQVRURU1QVCwgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiAzIGJ5dGVzICovCisKKyAgRVZFTlRfU1RBUlRfRldEX1NVUFBfQlVSU1RfQVNTSUdOLCAgICAgIC8qIFBheWxvYWQ6IDMgYnl0ZXMgKi8KKyAgRVZFTlRfU1RBUlRfUkVWX1NVUFBfQlVSU1RfQVNTSUdOLCAgICAgIC8qIFBheWxvYWQ6IDMgYnl0ZXMgKi8KKyAgRVZFTlRfUkVWX0ZDSF9HQVRJTkdfSU5fVVNFLCAgICAgICAgICAgIC8qIFBheWxvYWQ6IDEgYnl0ZSAgKi8KKyAgRVZFTlRfUFBQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBheWxvYWQ6IDcgYnl0ZXMgKi8KKyAgRVZFTlRfTUlQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBheWxvYWQ6IDIgYnl0ZXMgKi8KKyAgRVZFTlRfVENQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBheWxvYWQ6IDUgYnl0ZXMgKi8KKyAgRVZFTlRfQ0FNRVJBX0VYSUZfRkFJTEVELCAgICAgICAgICAgICAgIC8qIEVYSUYgZW5jb2RpbmcgZmFpbGVkICovCisgIEVWRU5UX0NBTUVSQV9WSURFT19GQUlMRUQsICAgICAgICAgICAgICAvKiBWaWRlbyBlbmNvZGluZyBmYWlsZWQgKi8KKyAgRVZFTlRfQ0FNRVJBX05PX1NFTlNPUiwgICAgICAgICAgICAgICAgIC8qIE5vIHNlbnNvciAqLworICBFVkVOVF9DQU1FUkFfQUJPUlQsICAgICAgICAgICAgICAgICAgICAgLyogT3BlcmF0aW9uIGFib3J0ZWQgKi8KKworICBFVkVOVF9DTV9CTE9DS19IRFJfT1JJR19EVVJJTkdfR1BTLCAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9DTV9BTExPV19IRFJfT1JJR19EVVJJTkdfR1BTLCAgICAgLyogTm8gcGF5bG9hZCAqLworCisgIEVWRU5UX0dTTV9BTVJfU1RBVEVfQ0hBTkdFLCAgICAgICAgICAgICAvKiAyIGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX1JBVFNDQ0hfSU5fRFRYLCAgICAgICAgICAgICAgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX0ZBQ0NIX0lOX0RUWCwgICAgICAgICAgICAgICAgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX0ZBQ0NIX0FORF9SQVRTQ0NIX0NPTExJU0lPTiwgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX0ZBQ0NIX0FORF9TSURfVVBEQVRFX0NPTExJU0lPTiwgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX1JBVFNDQ0hfQU5EX1NJRF9VUERBVEVfQ09MTElTSU9OLC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX1JBVFNDQ0hfQ01JX1BIQVNFX0NIQU5HRSwgICAgIC8qIDIgYnl0ZXMgcGF5bG9hZCAqLworICBFVkVOVF9HU01fUkFUU0NDSF9SRVFfQUNUX1RJTUVSX0VYUElSWSwgLyogOCBieXRlcyBwYXlsb2FkICovCisgIEVWRU5UX0dTTV9SQVRTQ0NIX0FDS19BQ1RfVElNRVJfRVhQSVJZLCAvKiAyIGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX0FNUl9DTUNfVFVSTkFST1VORF9USU1FLCAgICAgIC8qIDIgYnl0ZXMgcGF5bG9hZCAqLworICBFVkVOVF9DTV9QTE1OX0ZPVU5ELCAgICAgICAgICAgICAgICAgICAgLyogMTIgYnl0ZXMgKi8KKyAgRVZFTlRfQ01fU0VSVklDRV9DT05GSVJNRUQsICAgICAgICAgICAgIC8qIDEyIGJ5dGVzICovCisKKyAgRVZFTlRfR1BSU19NQUNfQ0FNUEVEX09OX0NFTEwsICAgICAgICAgIC8qIEV2ZW50IElkIDogNTU5LCBObyBwYXlsb2FkICovCisgIEVWRU5UX0dQUlNfTExDX1JFQURZX1RJTUVSX1NUQVJULCAgICAgICAvKiBFdmVudCBJZCA6IDU2MCwgTm8gcGF5bG9hZCAqLworICBFVkVOVF9HUFJTX0xMQ19SRUFEWV9USU1FUl9FTkQsICAgICAgICAgLyogRXZlbnQgSWQgOiA1NjEsIE5vIHBheWxvYWQgKi8KKworICBFVkVOVF9XQ0RNQV9QSFlDSEFOX0VTVEFCTElTSEVELCAgICAgICAgLyogUGF5bG9hZCBUQkQgKi8KKyAgRVZFTlRfSFNfRElTUExBWV9CTVBfQ0FQVFVSRV9TVEFUVVMsICAgIC8qIFBheWxvYWQgNCBieXRlcyAqLworCisgIEVWRU5UX1dDRE1BX0NFTExfU0VMRUNURUQsICAgICAgICAgICAgICAvKiA0IGJ5dGUgUGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9QQUdFX1JFQ0VJVkVELCAgICAgICAgICAgICAgLyogMiBieXRlIFBheWxvYWQgKi8KKyAgRVZFTlRfV0NETUFfU0VORF9LRVksICAgICAgICAgICAgICAgICAgIC8qIFBheWxvYWQgVEJEICovCisgIEVWRU5UX1dDRE1BX1JMX0ZBSUxVUkUsICAgICAgICAgICAgICAgICAvKiBObyBQYXlsb2FkICovCisgIEVWRU5UX1dDRE1BX01BWF9SRVNFVCwgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgUGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9DQUxMX1NFVFVQLCAgICAgICAgICAgICAgICAgLyogUGF5bG9hZCBUQkQgKi8KKyAgRVZFTlRfV0NETUFfQ0FMTF9EUk9QUEVELCAgICAgICAgICAgICAgIC8qIFBheWxvYWQgVEJEICovCisgIEVWRU5UX1dDRE1BX1JSQ19TVEFURSwgICAgICAgICAgICAgICAgICAvKiAzIGJ5dGUgUGF5bG9hZCAqLworICBFVkVOVF9HUFNfUERfQ09OTkVDVElPTl9USU1FT1VULCAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfUERfRElTQ09OTkVDVElPTl9DT01QTEVURSwgICAgLyogTm8gUGF5bG9hZCAqLworCisgIEVWRU5UX01FRElBX1BMQVlFUl9TVEFSVCwgICAgICAgICAgICAgICAvKiBtZWRpYSBwbGF5ZXIgc3RhcnRzIHBsYXlpbmcgYSBjbGlwLCBubyBwYXlsb2FkICovCisgIEVWRU5UX01FRElBX1BMQVlFUl9TVE9QLCAgICAgICAgICAgICAgICAvKiBtZWRpYSBwbGF5ZXIgc3RvcHBlZCBwbGF5aW5nIGEgY2xpcCwgbm8gcGF5bG9hZCAqLworICBFVkVOVF9NRURJQV9QTEFZRVJfU0VFSywgICAgICAgICAgICAgICAgLyogbWVkaWEgcGxheWVyIHJlcG9zaXRpb25lZCBpdHNlbGYsIG5vIHBheWxvYWQgKi8KKworICBFVkVOVF9HUFNfU1JDSF9TVEFSVCwgICAgICAgICAgICAgLyogUGF5bG9hZDogc2Vzc2lvbl90eXBlICgxIGJ5dGUpICovCisKKyAgRVZFTlRfR1BTX1NSQ0hfRU5ELCAgICAgICAgICAgICAgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1BQTV9QQVVTRSwgICAgICAgICAgICAgIC8qIFBheWxvYWQ6IHBhdXNlX3JlYXNvbiAoMSBieXRlKSAqLworICBFVkVOVF9HUFNfUFBNX1JFU1VNRSwgICAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfU0FfUkVDRUlWRUQsICAgICAgICAgICAgLyogUGF5bG9hZDogUkVGX0JJVF9OVU0gKDIgYnl0ZXMpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSX1NJWkUgICAgICgxYnl0ZSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFVkVOVF9HUFNfQ0xLX09OLCAgICAgICAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfQ0xLX09GRiwgICAgICAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfVklTSVRfUkVRVUVTVCwgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLyAKKyAgRVZFTlRfR1BTX1ZJU0lUX1JFU1BPTlNFLCAgICAgICAgIC8qIFBheWxvYWQ6IHJlc3BvbnNlX3Jlc3VsdCAoMSBieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisgIEVWRU5UX0dQU19UQV9TVEFSVCwgICAgICAgICAgICAgICAvKiBObyBQYXlsb2FkICovCisgIEVWRU5UX0dQU19EU1BfUkVBRFksICAgICAgICAgICAgICAvKiBObyBQYXlsb2FkICovCisgIEVWRU5UX0dQU19EU1BfQ0hBTk5FTF9TVEFSVCwgICAgICAvKiBQYXlsb2FkOiBTVl9JRCAgICAgICAgICgxIGJ5dGUpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSQ0hfTU9ERSAgICAgKDEgYnl0ZSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9OVU0gICAoMSBieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VSVkVEICAgICAgKDEgYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVWRU5UX0dQU19EU1BfQ0hBTk5FTF9ET05FLCAgICAgICAvKiBQYXlsb2FkOiBjaGFubmVsX251bSAoMSBieXRlKSAqLworICBFVkVOVF9HUFNfRFNQX1NUT1AsICAgICAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfRFNQX0RPTkUsICAgICAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfVEJfRU5ELCAgICAgICAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfU1JDSF9MQVJHRV9ET1BQX1dJTiwgICAgLyogUGF5bG9hZDogc3ZfcHJuX251bSAoMSBieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2hfbW9kZSAoMSBieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvcHBfd2luZCAoMiBieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisgIEVWRU5UX0dQU19TUkNIX0VYQ0VQVElPTiwgICAgICAgICAvKiBQYXlsb2FkOiBncmlkX2xvZ19pZCAoMiBieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl90eXBlICgxIGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFVkVOVF9HUFNfU1JDSF9IV19QT0xMSU5HMSwgICAgICAgLyogUGF5bG9hZDogYWdjX3ZhbCAoMiBieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjaV9vZmYgKDIgYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY3Ffb2ZmICgyIGJ5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJrX2xvICgyIGJ5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9fYmlhcyAoMiBieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFVkVOVF9HUFNfU1JDSF9IV19QT0xMSU5HMiwgICAgICAgLyogUGF5bG9hZDogc3luYzgwICgyIGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFVkVOVF9HUFNfUEdJX0FDVElPTl9QUk9DRVNTLCAgICAgLyogUGF5bG9hZDogcGdpX3N1YnN0YXRlICgxIGJ5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdpX2NtZCAoMSBieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVZFTlRfR1BTX0dTQ19BQ1RJT05fUFJPQ0VTUywgICAgIC8qIFBheWxvYWQ6IGdzY19zdWJzdGF0ZSAoMSBieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzY19jbWQgKDEgYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVWRU5UX0dQU19QR0lfQUJPUlQsICAgICAgICAgICAgICAvKiBQYXlsb2FkOiBwZ2lfc3Vic2F0ZSAoMSBieXRlKSAqLworICBFVkVOVF9HUFNfR1NDX0FCT1JULCAgICAgICAgICAgICAgLyogUGF5bG9hZDogZ3NjX3N1YnNhdGUgKDEgYnl0ZSkgKi8KKworCisKKyAgRVZFTlRfR1BTX1BEX0ZJWF9TVEFSVCwgICAgICAgICAgICAgICAgLyogUGF5bG9hZDogZXZlbnRfbG9nX2NudCAgKDIgYnl0ZSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uX21vZGUgKDEgYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVZFTlRfR1BTX1BEX0ZJWF9FTkQsICAgICAgICAgICAgICAgICAgLyogUGF5bG9hZDogZW5kX3N0YXR1cyAgICAgKDEgYnl0ZSkgICovCisgIEVWRU5UX0dQU19EQVRBX0RPV05MT0FEX1NUQVJULCAgICAgICAgIC8qIFBheWxvYWQ6IGRhdGFfdHlwZSAgICgxIGJ5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdl9tYXNrICAgICAoNCBieXRlKSAgICAgKi8KKyAgRVZFTlRfR1BTX0RBVEFfRE9XTkxPQURfRU5ELCAgICAgICAgICAgLyogUGF5bG9hZDogZW5kX3N0YXR1cyAgICAgICgxIGJ5dGUpICovCisgIEVWRU5UX0dQU19QRF9TRVNTSU9OX1NUQVJULCAgICAgICAgICAgIC8qIFBheWxvYWQ6IHN0YXJ0X3NvdXJjZSAgICAoNCBiaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbl9tb2RlICAoNCBiaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fdHlwZSAgICAoNCBiaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhY3kgICAgICAgICAoNCBiaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9maXhlZCAgICAgICAoMiBieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhfcGVyaW9kICAgICAgKDIgYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2X2RhdGFfZGwgICAgICg0IGJpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJxICAgICAgICAgICAgICgxIGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCAgICAgICAoMiBieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfdHlwZSAgKDQgYml0KSAgKi8KKyAgRVZFTlRfR1BTX0RPUk1BTkNZX0JFR0lOLCAgICAgICAgICAgICAgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0RPUk1BTkNZX0VORCwgICAgICAgICAgICAgICAgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1BSUV9USU1FT1VULCAgICAgICAgICAgICAgICAgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1BEX0NPTk5FQ1RJT05fU1RBUlQsICAgICAgICAgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1BEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQsICAgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1BEX0RJU0NPTk5FQ1RJT05fU1RBUlQsICAgICAgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0ZURVNUX0ZJWF9TVEFSVCwgICAgICAgICAgICAgIC8qIFBheWxvYWQ6IHJlc2VydmVkICg0IGJ5dGUpICovCisgIEVWRU5UX0dQU19GVEVTVF9GSVhfRU5ELCAgICAgICAgICAgICAgICAvKiBQYXlsb2FkOiByZXNlcnZlZCAoNCBieXRlKSAqLworICBFVkVOVF9HUFNfUERfUE9TSVRJT04sICAgICAgICAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfRTkxMV9TVEFSVCwgICAgICAgICAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfRTkxMV9FTkQsICAgICAgICAgICAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfREJNX1NFTkRfRkFJTFVSRSwgICAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9HUFNfVUFQRE1TX1NUQVRFX0NIQU5HRSwgICAgICAgICAgLyogUGF5bG9hZDogbmV3X3N0YXRlICgxIGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24gICAgKDEgYnl0ZSkgKi8KKyAgRVZFTlRfV0NETUFfT1VUX09GX1NFUlZJQ0UsICAgICAgICAgICAgIC8qIE5vIFBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX0wxX1NVQlNUQVRFLCAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZXMgcGF5bG9hZCAqLworICBFVkVOVF9TRF9FVkVOVF9BQ1RJT04sICAgICAgICAgICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU0RfRVZFTlRfQUNUSU9OX0hZQlIsICAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfVU1UU19DQUxMU19TVEFUSVNUSUNTLCAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1BaSURfSEFUX1NUQVJURUQsICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1dDRE1BX0RSWF9DWUNMRSwgICAgICAgICAgICAgICAgICAvKiAzIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9SRV9BQ1FVSVNJVElPTl9GQUlMLCAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9SUkNfUkIwX1NFVFVQX0ZBSUxVUkUsICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9SUkNfUEhZQ0hBTl9FU1RfRkFJTFVSRSwgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9DTV9DQUxMX0VWRU5UX09SSUcsICAgICAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fQ0FMTF9FVkVOVF9DT05ORUNULCAgICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX0NBTExfRVZFTlRfRU5ELCAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9FTlRFUl9FTUVSR0VOQ1lfQ0IsICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9DTV9FWElUX0VNRVJHRU5DWV9DQiwgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9QWklEX0hBVF9FWFBJUkVELCAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IRFJfU01QX1NFU1NJT05fQ0xPU0VELCAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0NETUFfTUVNT1JZX0xFQUssICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUFpJRF9IVF9TVEFSVEVELCAgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1BaSURfSFRfRVhQSVJFRCwgICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9BQ0NFU1NfRU5UUllfSEFORE9GRiwgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9CUkVXX0FQUF9TVEFSVCwgICAgICAgICAgICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQlJFV19BUFBfU1RPUCwgICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0JSRVdfQVBQX1BBVVNFLCAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9CUkVXX0FQUF9SRVNVTUUsICAgICAgICAgICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQlJFV19FWFRfTU9EVUxFX1NUQVJULCAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0JSRVdfRVhUX01PRFVMRV9TVE9QLCAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9CUkVXX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQlJFV19SRVNFUlZFRF82NDcsICAgICAgICAgICAgICAgIC8qIEJSRVcgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyAgRVZFTlRfQlJFV19SRVNFUlZFRF82NDgsICAgICAgICAgICAgICAgIC8qIEJSRVcgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyAgRVZFTlRfQlJFV19SRVNFUlZFRF82NDksICAgICAgICAgICAgICAgIC8qIEJSRVcgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyAgRVZFTlRfQlJFV19SRVNFUlZFRF82NTAsICAgICAgICAgICAgICAgIC8qIEJSRVcgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyAgRVZFTlRfQlJFV19SRVNFUlZFRF82NTEsICAgICAgICAgICAgICAgIC8qIEJSRVcgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyAgRVZFTlRfQlJFV19SRVNFUlZFRF82NTIsICAgICAgICAgICAgICAgIC8qIEJSRVcgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyAgRVZFTlRfQlJFV19SRVNFUlZFRF82NTMsICAgICAgICAgICAgICAgIC8qIEJSRVcgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyAgRVZFTlRfQlJFV19SRVNFUlZFRF82NTQsICAgICAgICAgICAgICAgIC8qIEJSRVcgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyAgRVZFTlRfQlJFV19SRVNFUlZFRF82NTUsICAgICAgICAgICAgICAgIC8qIEJSRVcgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyAgRVZFTlRfQlJFV19VU0VSXzY1NiwgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIEJSRVcgdXNlciBldmVudHMgKi8KKyAgRVZFTlRfQlJFV19HRU5FUklDLCAgICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkOiBjbHNpZCArIGRhdGEgKi8KKyAgRVZFTlRfQlJFV19NRURJQVBMQVlFUl9TRUxFQ1RfRklMRSwgICAgIC8qIG5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQlJFV19NRURJQVBMQVlFUl9DT05UUk9MLCAgICAgICAgIC8qIG5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQlJFV19BUFBfRk9STUlURU1fU1RBQ0tfQ0hBTkdFLCAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0JSRVdfQ0FUQVBQX1JFQ1ZfUFJPQUNUSVZFX0NNRCwgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0JSRVdfQ0FUQVBQX1RFUk1JTkFMX1JTUCwgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0JSRVdfQ0FUQVBQX05PX0RJU1BMQVksICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0JSRVdfU0lSSVVTX0VNQUlMX0RFTEVURSwgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0JSRVdfU0lSSVVTX0VNQUlMX09QRVJBVElPTl9DT01QTEVURSwgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9CUkVXX1NJUklVU19FTUFJTF9ORVdfRU1BSUxfTk9USUZJQ0FUSU9OLCAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9CUkVXX1VOREVGSU5FRF82NjcsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY2OCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjY5LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF82NzAsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY3MSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjcyLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF82NzMsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY3NCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjc1LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF82NzYsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY3NywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjc4LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF82NzksCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY4MCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjgxLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF82ODIsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY4MywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjg0LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF82ODUsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY4NiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjg3LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF82ODgsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY4OSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjkwLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF82OTEsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY5MiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjkzLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF82OTQsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY5NSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjk2LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF82OTcsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzY5OCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNjk5LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MDAsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzcwMSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzAyLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MDMsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzcwNCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzA1LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MDYsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzcwNywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzA4LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MDksCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzcxMCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzExLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MTIsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzcxMywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzE0LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MTUsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzcxNiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzE3LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MTgsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzcxOSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzIwLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MjEsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzcyMiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzIzLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MjQsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzcyNSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzI2LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MjcsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzcyOCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzI5LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MzAsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzczMSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzMyLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MzMsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzczNCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzM1LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MzYsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzczNywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzM4LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83MzksCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc0MCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzQxLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NDIsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc0MywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzQ0LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NDUsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc0NiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzQ3LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NDgsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc0OSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzUwLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NTEsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc1MiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzUzLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NTQsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc1NSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzU2LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NTcsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc1OCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzU5LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NjAsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc2MSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzYyLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NjMsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc2NCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzY1LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NjYsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc2NywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzY4LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NjksCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc3MCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzcxLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NzIsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc3MywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzc0LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NzUsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc3NiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzc3LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83NzgsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc3OSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzgwLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83ODEsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc4MiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzgzLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83ODQsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc4NSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzg2LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83ODcsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc4OCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzg5LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83OTAsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc5MSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzkyLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83OTMsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc5NCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzk1LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83OTYsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzc5NywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfNzk4LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF83OTksCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgwMCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODAxLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MDIsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgwMywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODA0LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MDUsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgwNiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODA3LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MDgsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgwOSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODEwLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MTEsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgxMiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODEzLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MTQsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgxNSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODE2LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MTcsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgxOCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODE5LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MjAsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgyMSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODIyLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MjMsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgyNCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODI1LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MjYsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgyNywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODI4LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MjksCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgzMCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODMxLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MzIsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgzMywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODM0LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MzUsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgzNiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODM3LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84MzgsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzgzOSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODQwLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NDEsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg0MiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODQzLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NDQsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg0NSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODQ2LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NDcsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg0OCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODQ5LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NTAsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg1MSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODUyLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NTMsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg1NCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODU1LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NTYsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg1NywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODU4LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NTksCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg2MCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODYxLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NjIsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg2MywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODY0LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NjUsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg2NiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODY3LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NjgsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg2OSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODcwLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NzEsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg3MiwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODczLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NzQsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg3NSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODc2LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84NzcsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg3OCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODc5LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84ODAsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg4MSwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODgyLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84ODMsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg4NCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODg1LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84ODYsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg4NywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODg4LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84ODksCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg5MCwKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODkxLAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84OTIsCisgIEVWRU5UX0JSRVdfVU5ERUZJTkVEXzg5MywKKyAgRVZFTlRfQlJFV19VTkRFRklORURfODk0LAorICBFVkVOVF9CUkVXX1VOREVGSU5FRF84OTUsCisKKyAgRVZFTlRfV0NETUFfUFNfREFUQV9SQVRFLCAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dTTV9UT19XQ0RNQV9SRVNFTEVDVF9FTkQsICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9QWklEX0hBSV9FTkFCTEVELCAgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCovCisgIEVWRU5UX1BaSURfSEFJX0RJU0FCTEVELCAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkKi8KKyAgRVZFTlRfR1NNX1RPX1dDRE1BX0hBTkRPVkVSX1NUQVJULCAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dDRE1BX1JSQ19NT0RFLCAgICAgICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9MMV9BQ1FfU1VCU1RBVEUsICAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0NETUFfUEhZQ0hBTl9DRkdfQ0hBTkdFRCwgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfUVRWX0NMSVBfU1RBUlRFRCwgICAgICAgICAgICAgICAgICAgIC8qIDcgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9DTElQX0VOREVELCAgICAgICAgICAgICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU0RQX1BBUlNFUl9SRUpFQ1QsICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfQ0xJUF9QQVVTRSwgICAgICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX0NMSVBfUkVQT1NJVElPTklORywgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9DTElQX1pPT01fSU4sICAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9DTElQX1pPT01fT1VULCAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9DTElQX1JPVEFURSwgICAgICAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVFZfQ0xJUF9QQVVTRV9SRVNVTUUsICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX0NMSVBfUkVQT1NJVElPTl9SRVNVTUUsICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9EU1BfSU5JVCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9TVFJFQU1JTkdfU0VSVkVSX1VSTCwgICAgICAgICAgICAvKiAyMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX1NFUlZFUl9QT1JUU19VU0VELCAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9VU0lOR19QUk9YWV9TRVJWRVIsICAgICAgICAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU1RSRUFNRVJfU1RBVEVfSURMRSwgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU1RSRUFNRVJfU1RBVEVfQ09OTkVDVElORywgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU1RSRUFNRVJfU1RBVEVfU0VUVElOR19UUkFDS1MsICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU1RSRUFNRVJfU1RBVEVfU1RSRUFNSU5HLCAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU1RSRUFNRVJfU1RBVEVfUEFVU0VELCAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU1RSRUFNRVJfU1RBVEVfU1VTUEVOREVELCAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU1RSRUFNRVJfQ09OTkVDVEVELCAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU1RSRUFNRVJfSU5JVFNUUkVBTV9GQUlMLCAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfQlVGRkVSSU5HX1NUQVJURUQsICAgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX0JVRkZFUklOR19FTkRFRCwgICAgICAgICAgICAgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9DTElQX0ZVTExTQ1JFRU4sICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9QU19ET1dOTE9BRF9TVEFSVEVELCAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVFZfUFNFVURPX1NUUkVBTV9TVEFSVEVELCAgICAgICAgICAgLyogTm8gUGF5bG9hZCAqLworICBFVkVOVF9RVFZfUFNfUExBWUVSX1NUQVRFX1BTRVVET19QQVVTRSwgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfUFNfUExBWUVSX1NUQVRFX1BTRVVET19SRVNVTUUsICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX1BBUlNFUl9TVEFURV9SRUFEWSwgICAgICAgICAgICAgIC8qIDE0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVFZfRlJBR01FTlRfUExBWUJBQ0tfQkVHSU4sICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX0ZSQUdNRU5UX1BMQVlCQUNLX0NPTVBMRVRFLCAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9QQVJTRVJfU1RBVEVfUFNFVURPX1BBVVNFLCAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9QTEFZRVJfU1RBVEVfUFNFVURPX1BBVVNFLCAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9QQVJTRVJfU1RBVEVfUFNFVURPX1JFU1VNRSwgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVFZfUExBWUVSX1NUQVRFX1BTRVVET19SRVNVTUUsICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX0ZSQUdNRU5URURfRklMRV9ERUNPREVfU1RBUlQsICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9GUkFHTUVOVEVEX0ZJTEVfRU5EX1NVQ0NFU1MsICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVFZfRE9XTkxPQURfREFUQV9SRVBPUlQsICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX1ZERUNfRElBR19ERUNPREVfQ0FMTEJBQ0ssICAgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9VUkxfUExBWUVEX0lTX01VTFRJQ0FTVCwgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9WREVDX0RJQUdfU1RBVFVTLCAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU1RSRUFNSU5HX1VSTF9PUEVOLCAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX1NUUkVBTUlOR19VUkxfT1BFTklORywgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX0NMSVBfRU5ERURfVkVSMiwgICAgICAgICAgICAgICAgIC8qIDEzIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU0lMRU5DRV9JTlNFUlRJT05fU1RBUlRFRCwgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVFZfU0lMRU5DRV9JTlNFUlRJT05fRU5ERUQsICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX0FVRElPX0NIQU5ORUxfU1dJVENIX0ZSQU1FLCAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9GSVJTVF9WSURFT19GUkFNRV9SRU5ERVJFRCwgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9GSVJTVF9WSURFT19JX0ZSQU1FX1JFTkRFUkVELCAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9TRFBfU0VMRUNURUQsICAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9ESUFHX1BMQVlFUl9TVEFUVVMsICAgICAgICAgICAgICAvKiAxMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVRWX1NJTEVOQ0VfSU5TRVJUSU9OX0RVUkFUSU9OLCAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FUVl9VTkRFRklORURfOTU3LAorICBFVkVOVF9RVFZfVU5ERUZJTkVEXzk1OCwKKyAgRVZFTlRfUVRWX1VOREVGSU5FRF85NTksCisgIEVWRU5UX1FUVl9VTkRFRklORURfOTYwLAorICBFVkVOVF9RVFZfVU5ERUZJTkVEXzk2MSwKKyAgRVZFTlRfUVRWX1VOREVGSU5FRF85NjIsCisgIEVWRU5UX1FUVl9VTkRFRklORURfOTYzLAorICBFVkVOVF9RVFZfVU5ERUZJTkVEXzk2NCwKKyAgRVZFTlRfUVRWX1VOREVGSU5FRF85NjUsCisgIEVWRU5UX1FUVl9VTkRFRklORURfOTY2LAorICBFVkVOVF9RVFZfVU5ERUZJTkVEXzk2NywKKworICBFVkVOVF9EU19TRVRTX0FSTV9DTE9DS19GQVNURVIsICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9EU19TRVRTX0FSTV9DTE9DS19TTE9XRVIsICAgICAgLyogTm8gcGF5bG9hZCAqLworCisgIEVWRU5UX1NNU19TVEFUSVNUSUNTLCAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TTV9QRFBfU1RBVEUsICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTVZTX1NUQVRFLCAgICAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfU0VDU1NMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TRUNURVNULCAgICAgICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NFQ1ZQTiwgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU0VDQ1JZUFQsICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TRUNDUllQVF9DTUQsICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfU0VDX1JFU0VSVkVEXzk3OCwgICAgICAgICAgICAgIC8qIHVua25vd24gcGF5bG9hZCAqLworICBFVkVOVF9TRUNfUkVTRVJWRURfOTc5LCAgICAgICAgICAgICAgLyogdW5rbm93biBwYXlsb2FkICovCisgIEVWRU5UX1NFQ19SRVNFUlZFRF85ODAsICAgICAgICAgICAgICAvKiB1bmtub3duIHBheWxvYWQgKi8KKyAgRVZFTlRfU0VDX1JFU0VSVkVEXzk4MSwgICAgICAgICAgICAgIC8qIHVua25vd24gcGF5bG9hZCAqLworCisgIEVWRU5UX0FSTV9DTEtfRlJFUVVFTkNZX0NIQU5HRSwgICAgICAvKiAxMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQURTUF9DTEtfRlJFUVVFTkNZX0NIQU5HRSwgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX01EU1BfQ0xLX0ZSRVFVRU5DWV9DSEFOR0UsICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0NFTExfQ0hBTkdFX0lORElDQVRJT04sICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DQl9TVEFURV9DSEFOR0UsICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU01TQ0JfTDFfU1RBVEVfQ0hBTkdFLCAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NNU0NCX0wxX0NPTExJU0lPTiwgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XTVNfU0VBUkNIX1JFUVVFU1QsICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fR0VUX1BBU1NXT1JEX0lORCwgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX1NUQVRVUywgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fVVNTX1JFU1BPTlNFX05PVElGWV9JTkQsICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX1VTU19DT05GLCAgICAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9SRUxFQVNFX1VTU19JTkQsICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fRldEX0FPQ19JTkQsICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1BaSURfSUQsICAgICAgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9QWklEX0hUX1ZBTFVFLCAgICAgICAgICAgICAgICAgLyogOSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUFpJRF9FWElTVFNfSU5fTElTVCwgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dTRElfR0VUX0ZJTEVfQVRUUklCVVRFUywgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HU0RJX1NJTV9SRUFELCAgICAgICAgICAgICAgICAgLyogNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NESV9TSU1fV1JJVEUsICAgICAgICAgICAgICAgIC8qIDYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dTRElfR0VUX1BJTl9TVEFUVVMsICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HU0RJX1ZFUklGWV9QSU4sICAgICAgICAgICAgICAgLyogNyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NESV9VTkJMT0NLX1BJTiwgICAgICAgICAgICAgIC8qIDcgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dTRElfRElTQUJMRV9QSU4sICAgICAgICAgICAgICAvKiA3IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HU0RJX0VOQUJMRV9QSU4sICAgICAgICAgICAgICAgLyogNyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NESV9TSU1fSU5DUkVBU0UsICAgICAgICAgICAgIC8qIDYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dTRElfRVhFQ1VURV9BUERVX1JFUSwgICAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TRUdfVVBNX0FERFJfTUlTTUFUQ0gsICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0NETUFfUFJBQ0gsICAgICAgICAgICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dTRElfU0VMRUNULCAgICAgICAgICAgICAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9SQUJfUkFURV9SRUNPTkZJRywgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0NETUFfUkxDX1JFU0VUUywgICAgICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dDRE1BX1JMQ19PUEVOX0NMT1NFLCAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9STENfTVJXLCAgICAgICAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVZQX0FQUF9QUk9DRVNTX0VWRU5ULCAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FWUF9BUFBfU1RBVEVfQ0hBTkdFRF9FVkVOVCwgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVlBfQVBQX0NBTExfQ09OTkVDVEVEX0VWRU5ULCAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NESV9DQVJEX0VWRU5UX05PVElGSUNBVElPTiwgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX0RBVEFfQVZBSUxBQkxFLCAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19JTlRFUlJBVF9TVEFURSwgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTU1fU1RBVEUsICAgICAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dNTV9TVEFURSwgICAgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9QTE1OX0lORk9STUFUSU9OLCAgICAgICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ09SRUFQUF9TRVRfVk9JQ0VfUFJJVkFDWSwgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NPUkVBUFBfR0VUX1ZPSUNFX1BSSVZBQ1ksICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9IQVJEX0hBTkRPRkZfTE9OR19DT0RFX01BU0tfQ0hBTkdFLCAvKiAxNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfVkNUQ1hPX0ZSRUVaRSwgICAgICAgICAgICAgICAgIC8qIHBheWxvYWQgKi8KKyAgRVZFTlRfVkNUQ1hPX1VORlJFRVpFLCAgICAgICAgICAgICAgIC8qIHBheWxvYWQgKi8KKyAgRVZFTlRfU01TX1NMT1RfV0FLRVVQX1YyLCAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FWUF9SQ1ZEX0ZJUlNUX1ZJREVPX0ZSQU1FLCAgICAvKiBubyBwYXlsb2FkICovCisgIEVWRU5UX1FWUF9DQUxMX1JFTEVBU0VELCAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DQl9TTVNfTk9USUZZLCAgICAgICAgICAgICAgICAgLyogMTAgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19QRFNNX0VWRU5UX1JFUE9SVCwgICAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9MT05HX0NPREVfTUFTS19DSEFOR0VELCAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFM3MDcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfR1NESV9BQ1RJVkFURV9GRUFUVVJFX0lORCwgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dTRElfREVBQ1RJVkFURV9GRUFUVVJFX0lORCwgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HU0RJX0dFVF9GRUFUVVJFX0lORCwgICAgICAgICAgLyogMTEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dTRElfU0VUX0ZFQVRVUkVfREFUQSwgICAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HU0RJX1VOQkxPQ0tfRkVBVFVSRV9JTkQsICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NESV9HRVRfQ09OVFJPTF9LRVksICAgICAgICAgIC8qIDYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dTRElfT1RBX0RFUEVSU08sICAgICAgICAgICAgICAvKiAyNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NESV9HRVRfUEVSTV9GRUFUVVJFX0lORCwgICAgIC8qIDExIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HU0RJX1BFUk1fRElTQkFMRV9GRUFUVVJFX0lORCwgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX0wxX1ZPQ09ERVJfSU5JVElBTElaRSwgICAgIC8qIFRCRCAqLworICBFVkVOVF9HU01fTDFfQUxJR05fVkZSLCAgICAgICAgICAgICAgLyogVEJEICovCisgIEVWRU5UX0dTTV9MMV9WT0NPREVSX0VOQUJMRUQsICAgICAgICAvKiBUQkQgKi8KKyAgRVZFTlRfSERSX0FNQUNfUEVSU0lTVEVOQ0VfRkFJTEVELCAgIC8qIG5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0FNQUNfUEVSU0lTVEVOQ0VfUEFTU0VELCAgIC8qIG5vIHBheWxvYWQgKi8KKworICAvKiAyMCBldmVudHMgcmVzZXJ2ZWQgZm9yIE1lZGlhRkxPICovCisgIEVWRU5UX01GTE9fU1RSRUFNX1NUQVRFLCAgICAgICAgICAgICAgICAvKiAxMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTUZMT19DT05UUk9MX0NIQU5ORUxfU1RBVEVfQ0hBTkdFLC8qIDEyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NRkxPX1NMRUVQX1NUQVRFX0NIQU5HRSwgICAgICAgICAgLyogMTIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX01GTE9fTkVUV09SS19TVEFURV9DSEFOR0UsICAgICAgICAvKiAyMCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTUZMT19UUkFOU19TVEFURSwgICAgICAgICAgICAgICAgIC8qIDEyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NRkxPX09JU19TVEFURSwgICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX01GTE9fUlhEX1NUQVRFLCAgICAgICAgICAgICAgICAgICAvKiAxMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTUZMT19ISVBSSV9TVEFURV9DSEFOR0UsICAgICAgICAgIC8qIDggIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NRkxPX0NBU19TVEFURSwgICAgICAgICAgICAgICAgICAgLyogMTIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX01GTE9fQUNRX1NUQVRFLCAgICAgICAgICAgICAgICAgICAvKiA4ICBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTUZMT19PU0NBUl9GUkFNRV9ERUNPREVELCAgICAgICAgIC8qIDggIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NRkxPX0NIQU5fU1dJVENIX1JFTkRFUkVELCAgICAgICAgLyogMTYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX01GTE9fT1NDQVJfREVDX0VYQ0VQVElPTl9ERVRFQ1RFRCwvKiA0ICBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTUZMT19NRk5fU1VCU1RBVEUsICAgICAgICAgICAgICAgIC8qIDggIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NRkxPX01GTl9TVEFURSwgICAgICAgICAgICAgICAgICAgLyogMTIgIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NRkxPX01GTl9WRVJUSUNBTF9IQU5ET0ZGLCAgICAgICAgLyogMTYgIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NRkxPX01GTl9BQ1FfU1RBVEUsICAgICAgICAgICAgICAgLyogMTAgIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NRkxPX0ZMT1dfU1RBVFVTLCAgICAgICAgICAgICAgICAgLyogMTIgIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NRkxPX05FVFdPUktfU1RBVFVTLCAgICAgICAgICAgICAgLyogMTIgIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NRkxPX1VOREVGSU5FRF8xMDcwLAorCisgIEVWRU5UX0NNX0xDU19NT0xSX0NPTkYsICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9QUFBfTkVUTU9ERUwsICAgICAgICAgICAgICAgICAgICAgLyogNyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ0FNRVJBX1BST0ZJTElORywgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX01BQ19IU19UMV9FWFBJUlksICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9BU1lOQ19EUzcwNywgICAgICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUEtUX0RTNzA3LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQUlNfVElNRVJfRVhQSVJZLCAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFJTX01BQ19JRExFX0lORCwgICAgICAgICAgICAgICAgLyogbm8gcGF5bG9hZCAqLworICBFVkVOVF9HUFJTX1BBQ0tFVF9DSEFOTkVMX1JFUVVFU1QsICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BSU19BQ0NFU1NfUkVKRUNULCAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQUlNfUEFDS0VUX1JFU09VUkNFX1JFUVVFU1QsICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFJTX1BBQ0tFVF9VUExJTktfQVNTSUdOTUVOVCwgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BSU19QQUNLRVRfRE9XTkxJTktfQVNTSUdOTUVOVCwgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1BBQ0tFVF9USU1FU0xPVF9SRUNPTkZJR1VSRSwgICAgICAvKiAzIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFJTX1RCRl9SRUxFQVNFLCAgICAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BSU19DRUxMX0NIQU5HRV9PUkRFUiwgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQUlNfQ0VMTF9DSEFOR0VfRkFJTFVSRSwgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HU01fQU1SX1JBVFNDQ0hfUkVRLCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX0FNUl9SQVRTQ0NIX1JTUCwgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NEX1NSVl9JTkRfSFlCUl9XTEFOLAorICBFVkVOVF9TRF9FVkVOVF9BQ1RJT05fSFlCUl9XTEFOLAorICBFVkVOVF9HUFNfUERfREVNT0RfU0VTU19TVEFSVCwgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1BEX0RFTU9EX1NFU1NfRU5ELCAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19TVl9BQ1FVSVJFRCwgICAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfU1ZfQklUX0VER0VfRk9VTkQsICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0RFTU9EX1NUQVJURUQsICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19ERU1PRF9PVVRfT0ZfTE9DSywgICAgICAgICAgICAvKiAzIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfREVNT0RfU1RPUFBFRCwgICAgICAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0RFTU9EX1BSRUFNQkxFX0ZPVU5ELCAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19ERU1PRF9GUkFNRV9TWU5DX1NUQVRVUywgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfREVNT0RfU1VCRlJBTUUsICAgICAgICAgICAgICAgLyogNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0RFTU9EX0VQSEVNRVJJU19DT01QTEVURSwgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19ERU1PRF9BTE1BTkFDX0NPTVBMRVRFLCAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfREVNT0RfQklUX0VER0VfU1RBVFVTLCAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUkFUX0NIQU5HRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1JFR0lTVFJBVElPTl9TVVBQUkVTU0VELCAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9IRFJfUlVQX0RJU1RfQkFTRURfUkVHLCAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0RJQUdfQVBQX1RSQUNLSU5HX1NUQVJULCAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19ESUFHX0FQUF9UUkFDS0lOR19FTkQsICAgICAgICAvKiAxMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0RJQUdfQVBQX1BPU0lUSU9OX1NVQ0NFU1MsICAgIC8qIDE2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfRElBR19BUFBfUE9TSVRJT05fRkFJTFVSRSwgICAgLyogNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NNX0FNUl9NVUxUSVJBVEVfSUUsICAgICAgICAgICAgIC8qIDkgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0VQWklEX0hZU1RFUkVTSVNfRU5BQkxFRCwgICAgICAgICAvKiBubyBwYXlsb2FkICovCisgIEVWRU5UX0VQWklEX0hZU1RFUkVTSVNfRElTQUJMRUQsICAgICAgICAvKiBubyBwYXlsb2FkICovCisgIEVWRU5UX0VQWklEX0hUX1NUQVJURUQsICAgICAgICAgICAgICAgICAvKiAxMCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRVBaSURfSFRfRVhQSVJFRCwgICAgICAgICAgICAgICAgIC8qIDEwIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9IRFJfQkNNQ1NfRkxPV19TVEFURV9DSEFOR0UsICAgICAgLyogNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX0xNQUNfVVBEQVRFX0JDX1NUQVRVUywgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RTX0NBTV9USU1FUiwgICAgICAgICAgICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EU19SRFVEX1RJTUVSLCAgICAgICAgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFNfQ1RBX1RJTUVSLCAgICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZXMgcGF5bG9hZCAqLworICBFVkVOVF9EU19GQUxMQkFDSywgICAgICAgICAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFMzR19DQU1fRkxPV19DVFJMX1RJTUVSLCAgICAgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19KQU1NRVJfREVURUNUSU9OX1RFU1RfUEFTUywgICAvKiBubyBwYXlsb2FkICovCisgIEVWRU5UX0dQU19KQU1NRVJfREVURUNUSU9OX1RFU1RfRkFJTFVSRSwvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9KQU1NRVJfREVURUNUX05PSVNFX1NUQVRTLCAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0dFVF9QQVJBTSwgICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19HRVRfUEFSQU1fQlNfSU5GTywgICAgICAgICAgICAvKiAxOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSFNfU0VSVklOR19DRUxMX0NIQU5HRSwgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0hTX0RTQ0hfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TTUdNTV9SRVFVRVNUX1NFTlQsICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU01HTU1fUkVKRUNUX1JFQ0VJVkVELCAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xJTlVYX0FQUF9TVE9QLCAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfUERfQ01FX1NFU1NJT05fU1RBUlQsICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1BEX0NNRV9TRVNTSU9OX0VORCwgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisKKyAgLyogMjAgZXZlbnRzIHJlc2VydmVkIGZvciBRVmlkZW9QaG9uZSAqLworICBFVkVOVF9TSVBfUkVHSVNURVJfU1RBUlQsICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU0lQX1JFR0lTVEVSX0RPTkUsICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NJUF9DQUxMX1NFVFVQX1NUQVJULCAgICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TSVBfQ0FMTF9TRVRVUF9ET05FLCAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9TSVBfQ0FMTF9SRUxFQVNFX1NUQVJULCAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU0lQX0NBTExfUkVMRUFTRV9ET05FLCAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQVVESU9fRlJBTUVfU0VOVF9UT19ERUNPREVSLCAgICAgIC8qIDEyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9WSURFT19GUkFNRV9TRU5UX1RPX0RFQ09ERVIsICAgICAgLyogMTIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RFQ19SRU5ERVJfRlJBTUUsICAgICAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9ERUNfUkVOREVSX0RPTkUsICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9ERUNfU1RBUlRfREVDT0RJTkcsICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfREVDX0ZSQU1FX0RFQ09ERUQsICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1ZfRU5DT0RFRCwgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfREVDX1NUQVJUX0RFQ09ESU5HX0VYVCwgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RFQ19GUkFNRV9ERUNPREVEX0VYVCwgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVklERU9QSE9ORV9VTkRFRklORURfMTE1MSwKKyAgRVZFTlRfUVZJREVPUEhPTkVfVU5ERUZJTkVEXzExNTIsCisgIEVWRU5UX1FWSURFT1BIT05FX1VOREVGSU5FRF8xMTUzLAorICBFVkVOVF9RVklERU9QSE9ORV9VTkRFRklORURfMTE1NCwKKyAgRVZFTlRfUVZJREVPUEhPTkVfVU5ERUZJTkVEXzExNTUsCisKKyAgRVZFTlRfR1BTX0NNRV9QT1NfUkVRLCAgICAgICAgICAgICAgICAgIC8qIG5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0NNRV9GSVhfU1RBUlQsICAgICAgICAgICAgICAgIC8qIG5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0NNRV9GSVhfRU5ELCAgICAgICAgICAgICAgICAgIC8qIG5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1NFRURfQ0xNLCAgICAgICAgICAgICAgICAgICAgIC8qIDEyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfU0VFRF9TSUQsICAgICAgICAgICAgICAgICAgICAgLyogMTAgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19TRUVEX1NMLCAgICAgICAgICAgICAgICAgICAgICAvKiAxMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1NFRURfR0VULCAgICAgICAgICAgICAgICAgICAgIC8qIDEzIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0hEUl9PVkhEX0JDX01TR19SWCwgICAgICAgICAgICAgICAvKiBubyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9PVkhEX1RfQkNfU1VQRVJWSVNJT04sICAgICAgICAvKiBubyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9MTUFDX1NFVF9CQ01DU19QQUdFX0NZQ0xFLCAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9IRFJfSE1QX1NFU1NJT05fQ0xPU0VELCAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9XTEFOX0NQLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0FSUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfREhDUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XTEFOX1dQQSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogNyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRUFQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xBTl8xWCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0NBTUVSQV9TVkNTX1NUQVJULCAgICAgICAgICAgICAgICAvKiBubyBwYXlsb2FkICovCisgIEVWRU5UX0NBTUVSQV9TVkNTX1NUT1AsICAgICAgICAgICAgICAgICAvKiBubyBwYXlsb2FkICovCisKKyAgRVZFTlRfQkNNQ1NfU1JWQ19BVkFJTEFCTEUsICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0JDTUNTX1NSVkNfTE9TVCwgICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9CQ01DU19GTE9XX1JFR0lTVEVSRUQsICAgICAgICAgICAgLyogMTggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0JDTUNTX0ZMT1dfREVSRUdJU1RFUkVELCAgICAgICAgICAvKiAxOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQkNNQ1NfRkxPV19TVEFUVVNfQ0hBTkdFRCwgICAgICAgIC8qIDE5IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0NBTUVSQV9TVkNTX1gsICAgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9DQUxMX0VWRU5UX09SSUdfVEhSLCAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9WRkVfTVNHX0NPTkZJR19DT01QTEVURSwgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9WRkVfTVNHX0lETEVfQ09NUExFVEUsICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9WRkVfTVNHX1VQREFURV9DT01QTEVURSwgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9WRkVfTVNHX0FFX0FXQl9TVEFUUywgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9EU1BfVklERU9fRU5DX0RPV05MT0FEX0RPTkUsICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9EU1BfVklERU9fRU5DX1NFTEVDVElPTl9ET05FLCAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9EU1BfVklERU9fRU5DX0NPTkZJR19ET05FLCAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9EU1BfVklERU9fRU5DX0ZSQU1FX0RPTkUsICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworCisgIEVWRU5UX0hEUl9PVkhEX0JDTUNTX0NIQU5fQ0hBTkdFLCAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1FWU19SRUdJU1RFUl9TVEFSVCwgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVlNfUkVHSVNURVJfRE9ORSwgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUVZTX1JFR0lTVEVSX0ZBSUxFRCwgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUVZTX0NBTExfU0VUVVBfU1RBUlQsICAgICAgICAgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1FWU19DQUxMX1NFVFVQX0RPTkUsICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FWU19DQUxMX1NFVFVQX0ZBSUxFRCwgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1FWU19DQUxMX1JFTEVBU0VfU1RBUlQsICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVlNfQ0FMTF9SRUxFQVNFX0RPTkUsICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9RVlNfQ0FMTF9SRUxFQVNFX0ZBSUxFRCwgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworCisgIEVWRU5UX0NBTUNPUkRFUl9TVEFSVF9SRUNPUkQsICAgICAgICAgICAvKiA5IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DQU1DT1JERVJfU1RBUlRfVFJBTlNDT0RFLCAgICAgICAgLyogNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ0FNQ09SREVSX0ZSQU1FX0RST1AsICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQ0FNQ09SREVSX0FVRElPRFVCLCAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfUFNNTV9TRU5ULCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfUERfRkFMTEJBQ0tfTU9ERSwgICAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9QRUFQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfVFRMUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1RMUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1dDRE1BX1RPX1dDRE1BX1JFU0VMRUNUSU9OX1ZFUjJfU1RBUlQsIC8qIDcgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfRVVMX1JFQ09ORklHX09SX0FTVSwgICAgICAgICAgICAgIC8qIDEwIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9FVUxfU0VSVklOR19DRUxMX0NIQU5HRSwgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRVVMX1BIWVNJQ0FMX0xBWUVSX1JFQ09ORklHLCAgICAgIC8qIDEwIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0RSTV9ST0FQX1RSSUdHRVJfUkVDSUVWRUQsICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EUk1fUk9BUF9QUk9UT0NPTF9TVEFSVCwgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFJNX1JPQVBfUkVRVUVTVCwgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RSTV9ST0FQX1JFUVVFU1RfRVhURU5TSU9OLCAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EUk1fUk9BUF9SRVNQT05TRSwgICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFJNX1JPQVBfUkVTUE9OU0VfRVhURU5TSU9OLCAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RSTV9ST0FQX1JJX0NPTlRFWFQsICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EUk1fUk9BUF9FUlJPUiwgICAgICAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFJNX1JPQVBfUlNQX1ZBTElEQVRJT04sICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RSTV9ST0FQX1BST1RPQ09MX0VORCwgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0RTX1dNS19BTExPQ0FURUQsICAgICAgICAgICAgICAgICAvKiAxNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFNfV01LX0RFQUxMT0NBVEVELCAgICAgICAgICAgICAgIC8qIDggIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EU19XTUtfRkxVU0hFRCwgICAgICAgICAgICAgICAgICAgLyogMTIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RTX1dNS19GTE9XX0VOQUJMRUQsICAgICAgICAgICAgICAvKiAxMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFNfV01LX0ZMT1dfRElTQUJMRUQsICAgICAgICAgICAgIC8qIDEyIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0hEUl9JRExFX1NFVF9TTEVFUF9EVVJBVElPTiwgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9IRFJfU0NNX1NFU1NJT05fQ0hBTkdFRCwgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9VTVRTX1RPX0NETUFfREFUQV9IQU5ET1ZFUiwgICAgICAgLyogTm8gcGF5bG9hZCAqLyAKKyAgRVZFTlRfVU1UU19UT19DRE1BX1ZPSUNFX0hBTkRPVkVSLCAgICAgIC8qIDE4IGJ5dGUgcGF5bG9hZCAqLyAKKworICBFVkVOVF9NT19TTVNfUkVUUllfQVRURU1QVCwgICAgICAgICAgICAgLyogMTQgYnl0ZSBwYXlsb2FkICovIAorCisgIEVWRU5UX0hEUl9MTUFDX1VQREFURV9RU01fU1RBVFVTLCAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLyAKKworICBFVkVOVF9DTV9DRUxMX1NSVl9JTkQsICAgICAgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8gCisKKyAgRVZFTlRfUkxQX05BS19BQk9SVCwgICAgICAgICAgICAgICAgICAgIC8qIDkgYnl0ZSBwYXlsb2FkICovIAorCisgIEVWRU5UX0RSTV9SSUdIVFNfT1BFUkFUSU9OLCAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0RTX1JFU1ZfTVNHX1NFTlRfUkVWX0ZMT1dTLCAgICAgICAvKiAxNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFNfUkVTVl9NU0dfU0VOVF9GV0RfRkxPV1MsICAgICAgIC8qIDE1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EU19SRVNWX1JFU1BfU1VDQ0VTU19SRUNELCAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFNfUkVTVl9SRVNQX0ZBSUxVUkVfUkVDRCwgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfR1BTX1BEX0NPTU1fRkFJTFVSRSwgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19QRF9DT01NX0RPTkUsICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0dQU19QRF9FVkVOVF9FTkQsICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfUEFfRVZFTlRfQ0FMTEJBQ0ssICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1BEX0NNRF9FUlJfQ0FMTEJBQ0ssICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19QQV9DTURfRVJSX0NBTExCQUNLLCAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0dQU19MTV9FTlRFUl9TQV9SRl9WRVJJRiwgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfTE1fRVhJVF9TQV9SRl9WRVJJRiwgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0xNX0VSUk9SX1NBX1JGX1ZFUklGLCAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19MTV9QRF9DT01QTEVURSwgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0dQU19MTV9JUV9URVNUX0NPTVBMRVRFLCAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisKKyAgRVZFTlRfUE1fQVBQX09UR19JTklULCAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUE1fQVBQX09UR19SRVNFVCwgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUE1fQVBQX09UR19BQ1FVSVJFX0JVU19SRVEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1BNX0FQUF9PVEdfUkVMSU5RVUlTSF9CVVNfUkVRLCAgICAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1BNX0FQUF9PVEdfU1VTUEVORCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1BNX0FQUF9PVEdfUkVTVU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUE1fQVBQX09UR19ERVZJQ0VfQVRUQUNIRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgYnlUZSBwYXlsb2FkICovCisgIEVWRU5UX1BNX0FQUF9PVEdfREVWSUNFX0RFVEFDSEVELCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUE1fQVBQX09UR19IT1NUX01PREVfUkVNX1BFUklfRElTLCAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUE1fQVBQX09UR19QRVJJX01PREVfUFJFUEFSRV9GT1JfUkVNX0hPU1RfV0FLRVVQX1NJRywgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUE1fQVBQX09UR19QRVJJX01PREVfUkVNX0hPU1RfV0FLRVVQX1NJR19ET05FLCAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfUE1fQVBQX09UR19TRVRfUkVNX1dBS0VVUF9DQVBBQklMSVRZLCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUE1fQVBQX09UR19PUEVSQVRJT05BTF9FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBQYXlsb2FkICovCisgIEVWRU5UX1BNX0FQUF9PVEdfQ09ORklHVVJFX1VTQl9QT1dFUl9DT05TVU1FUiwgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1BNX0FQUF9PVEdfU0VUX1VTQl9QT1dFUl9DT05TVU1QVElPTl9SRVFVSVJFTUVOVCwgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9QTV9BUFBfT1RHX1BFUklfTU9ERV9QUk9DRVNTX1VTQl9QT1dFUl9MSU5FX0NPTlRfUkVRLCAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUE1fQVBQX09UR19QRVJJX01PREVfU0VUX1JFTV9BX0RFVl9JTkZPLCAgICAgICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1BNX0FQUF9PVEdfU1RBVEVfVFJBTlNJVElPTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0RUVl9UQUJMRV9BQ1FfU1VDQ0VTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMCBieXRlIHBheWxvYWQgKi8gIAorICBFVkVOVF9EVFZfVEFCTEVfQUNRX0ZBSUwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8gIAorICBFVkVOVF9EVFZfRFZCSF9TRUxfUExURk1fUkVRX1JDVkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0RWQkhfUExURk1fQUNRX1NVQ0NFU1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9EVkJIX1BMVEZNX0FDUV9GQUlMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLyAgCisgIEVWRU5UX0RUVl9EVkJIX1RCTF9NR1JfU1RBVEVfQ0hBTkdFRCwgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfRFZCSF9DRV9TVEFURV9DSEFOR0VELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0RWQkhfTUNBU1RfSk9JTl9SRVFfUkNWRCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfRFZCSF9NQ0FTVF9MRUFWRV9SRVFfUkNWRCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9EVkJIX0lOSVRfUkVRX1JDVkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9EVkJIX01DQVNUX0pPSU5fU1VDQ0VTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0RWQkhfTUNBU1RfSk9JTl9GQUlMVVJFLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfRFZCSF9NQ0FTVF9MRUFWRV9TVUNDRVNTLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9EVkJIX01DQVNUX0xFQVZFX0ZBSUxVUkUsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0RWQkhfSU5JVF9TVUNDRVNTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0RWQkhfSU5JVF9GQUlMVVJFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKworICBFVkVOVF9HUFNfTE1fU0VTU0lPTl9TVEFSVCwgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0xNX1NFU1NJT05fRU5ELCAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0xNX0ZJWF9SRVFVRVNUX1NUQVJULCAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0xNX0ZJWF9SRVFVRVNUX0VORCwgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0xNX1BSTV9SRVFVRVNUX1NUQVJULCAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0xNX1BSTV9SRVFVRVNUX0VORCwgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0xNX1NFU1NJT05fQ09OVElOVUUsICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19MTV9GSVhfUkVRVUVTVF9DT05USU5VRSwgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0dQU19MTV9QUk1fUkVRVUVTVF9DT05USU5VRSwgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0dQU19MTV9QUE1fUkVRVUVTVF9DT05USU5VRSwgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0dQU19MTV9BSURJTkdfREFUQV9SRUNFSVZFRCwgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfTE1fUkNfT05fVElNRVJfVElNRU9VVCwgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HUFNfTE1fU0hVVF9PRkZfVElNRVJfVElNRU9VVCwgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HUFNfTE1fTUdQX09OLCAgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HUFNfTE1fTUdQX0lETEUsICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HUFNfTE1fTUdQX09GRiwgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworCisgIEVWRU5UX0RSTV9ST19DT05TVU1QVElPTl9WQUxJREFUSU9OLCAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EUk1fUk9fSU5TVEFMTEFUSU9OX1ZBTElEQVRJT04sICAgLyogMiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9GTFVURV9GRFRfSU5TVF9SQ1ZELCAgICAgICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRkxVVEVfRkRUX0lOU1RfUkNWX0ZBSUwsICAgICAgICAgIC8qIDkgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0ZMVVRFX0ZEVF9JTlNUX0VYUElSRUQsICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9GTFVURV9KT0lOX1NFU1NJT05fUkVRX1JDVkQsICAgICAgLyogMjQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0ZMVVRFX0xFQVZFX1NFU1NJT05fUkVRX1JDVkQsICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9GTFVURV9TRVNTSU9OX0NMT1NFRCwgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8gCisgIEVWRU5UX0ZMVVRFX1NFU1NJT05fQ0xPU0VEX0JZX0FQUCwgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLyAKKyAgRVZFTlRfRkxVVEVfQl9GTEFHX1JDVkQsICAgICAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovIAorICBFVkVOVF9GTFVURV9HRVRfRklMRV9SRVFVRVNUX1JDVkQsICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8gCisgIEVWRU5UX0ZMVVRFX0pPSU5fU0VTU0lPTl9SU1AsICAgICAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLyAKKyAgRVZFTlRfRkxVVEVfRklMRV9TVEFUVVNfUlNQLCAgICAgICAgICAgIC8qIDE2IGJ5dGUgcGF5bG9hZCAqLyAKKyAgRVZFTlRfRkxVVEVfQ0FOQ0VMX0ZJTEVfUkVRX1JDVkQsICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfRFRWX0RWQkhfREVJTklUX1JFUV9SQ1ZELCAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0RWQkhfREVJTklUX1NVQ0NFU1MsICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0RWQkhfREVJTklUX0ZBSUxVUkUsICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKworICBFVkVOVF9DT05URU5UX0lOU1RBTExfQkVHSU4sICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9DT05URU5UX0lOU1RBTExfQ09NUExFVEUsICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ09OVEVOVF9SRVRSSUVWQUxfQkVHSU4gLCAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQ09OVEVOVF9SRVRSSUVWQUxfQ09NUExFVEUsICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NPTlRFTlRfQkFDS1VQX0JFR0lOLCAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0NPTlRFTlRfQkFDS1VQX0NPTVBMRVRFLCAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DT05URU5UX0ZXRF9CRUdJTiwgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9DT05URU5UX0ZXRF9DT01QTEVURSwgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9IQVJEX0hBTkRPRkZfVk9JUF9UT19DRE1BLCAgICAgICAgLyogMTQgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfRUFQX1NJTV9BS0EsICAgICAgICAgICAgICAgICAgICAgIC8qIDE0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XTEFOX0NQX01FQVMsICAgICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dMQU5fQ1BfSE8sICAgICAgICAgICAgICAgICAgICAgICAvKiAxMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9DUF8xMUQsICAgICAgICAgICAgICAgICAgICAgIC8qIDkgIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XTEFOX01DLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiAgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfU1ZHX0NPTlRFTlRfU0VULCAgICAgICAgICAgICAgICAgIC8qIDIgIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TVkdfQ09OVEVOVF9QTEFZLCAgICAgICAgICAgICAgICAgLyogMiAgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NWR19DT05URU5UX1JFU1VNRSwgICAgICAgICAgICAgICAvKiAxICBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU1ZHX0NPTlRFTlRfUEFVU0UsICAgICAgICAgICAgICAgIC8qIDEgIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TVkdfQ09OVEVOVF9TVE9QLCAgICAgICAgICAgICAgICAgLyogMSAgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NWR19DT05URU5UX1VTRVJFVkVOVCwgICAgICAgICAgICAvKiAxMCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU1ZHX0NPTlRFTlRfR0VUVVJJREFUQSwgICAgICAgICAgIC8qIDMgIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TVkdfQ09OVEVOVF9UUkFOU0ZPUk0sICAgICAgICAgICAgLyogMTAgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NWR19HRVRfUEFSQU0sICAgICAgICAgICAgICAgICAgICAvKiAzICBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU1ZHX1NFVF9QQVJBTSwgICAgICAgICAgICAgICAgICAgIC8qIDMgIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1dMQU5fV1BBMiwgICAgICAgICAgICAgICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1dDRE1BX1BTQ19TQ0FOTkVSX1NUT1AsICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX01FRElBX1BMQVlFUl9LRVlQUkVTUywgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1dMQU5fTUNfUU9TLCAgICAgICAgICAgICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1dDRE1BX1BTQ19TQ0FOTkVSX1NUQVRFLCAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1dMQU5fQ1BfQURIT0MsICAgICAgICAgICAgICAgICAgICAvKiAxNiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9ETUJfU1RBQ0tfU0hVVERPV04sICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRE1CX1RVTkVfRE9ORV9TVUNDRVNTLCAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RNQl9UVU5FX0RPTkVfRkFJTFVSRSwgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9ETUJfU0VBUkNIX0RPTkUsICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRE1CX1NDQU5fRE9ORSwgICAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RNQl9SRUNFUFRJT05fSU5GT19DSEFOR0VELCAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9ETUJfRE1CX0dVSURFX0NIQU5HRUQsICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRE1CX0xPQ0FUSU9OX0lORk9fQ0hBTkdFRCwgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RNQl9MT1NUX0VOU0VNQkxFLCAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9ETUJfU1RSRUFNX1RFUk1JTkFURUQsICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRE1CX1NUUkVBTV9EQVRBX0FWQUlMQUJMRSwgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RNQl9SRVNFUlZFRDEsICAgICAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9ETUJfUkVTRVJWRUQyLCAgICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRE1CX1JFU0VSVkVEMywgICAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RNQl9SRVNFUlZFRDQsICAgICAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9ETUJfUkVTRVJWRUQ1LCAgICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRE1CX1JFU0VSVkVENiwgICAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RNQl9SRVNFUlZFRDcsICAgICAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9ETUJfUkVTRVJWRUQ4LCAgICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRE1CX1JFU0VSVkVEOSwgICAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RNQl9SRVNFUlZFRDEwLCAgICAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX01PQklMRVZJRVdfUkVTRVJWRUQxLCAgICAgICAgICAgICAvKiBUQkQgKi8KKyAgRVZFTlRfTU9CSUxFVklFV19SRVNFUlZFRDIsICAgICAgICAgICAgIC8qIFRCRCAqLworICBFVkVOVF9NT0JJTEVWSUVXX1JFU0VSVkVEMywgICAgICAgICAgICAgLyogVEJEICovCisgIEVWRU5UX01PQklMRVZJRVdfUkVTRVJWRUQ0LCAgICAgICAgICAgICAvKiBUQkQgKi8KKyAgRVZFTlRfTU9CSUxFVklFV19SRVNFUlZFRDUsICAgICAgICAgICAgIC8qIFRCRCAqLworCisgIEVWRU5UX0hEUl9ET1NfTU9fRE9TX1NUQVRVUywgICAgICAgICAgICAvKiAzIGJ5dGUgcGF5bG9hZCAqLyAKKworICBFVkVOVF9HUFNPTkVYVFJBX1NUQVJUX0RPV05MT0FELCAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTT05FWFRSQV9FTkRfRE9XTkxPQUQsICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfU05TRF9HRU5FUklDLCAgICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NOU0RfREVWSUNFX0lOSVQsICAgICAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TTlNEX0RFVklDRV9DT05GSUdVUkVELCAgICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU05TRF9FVkVOVF9EQVRBX1JFQURZLCAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NOU0RfRVZFTlRfQ09ORF9NRVQsICAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TTlNEX0RFVklDRV9ET1dOLCAgICAgICAgICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU05TRF9FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIAorICBFVkVOVF9DTV9DT1VOVFJZX1NFTEVDVEVELCAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fU0VMRUNUX0NPVU5UUlksICAgICAgICAgICAgICAgIC8qIDcgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfR1BTX0RDTUVfTkVXX1NWX0FEREVEX0lOX0FBLCAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19EQ01FX1NWX1JFTU9WRURfRlJPTV9BQSwgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0VTR19HRVRfUFJPVl9MSVNUX1JFUV9SQ1ZELCAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0VTR19HRVRfUFJPVl9MSVNUX1JFUV9GQUlMLCAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0VTR19QUk9WX0xJU1RfQVZBSUxBQkxFLCAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0VTR19BQ1FfUkVRX1JDVkQsICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9FU0dfQUNRX1JFUV9GQUlMLCAgICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRVNHX1NUT1BfUkVRX1JDVkQsICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfRVNHX1NUT1BfUkVRX0ZBSUwsICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfRVNHX1NUT1BfQ09NUExFVEUsICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfQURDX09ORElFX1RIRVJNX1JFQUQsICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfQ09OVEVOVF9OT19WQUxJRF9PUl9FWFBJUkVEX1JJR0hUUywgLyogTm8gUGF5bG9hZCAqLworCisgIEVWRU5UX01PQklMRVZJRVdfUkVTRVJWRUQzMCwgICAgICAgICAgICAvKiBFVkVOVCBUTyBCRSBSRVBMQUNFRCAqLworICBFVkVOVF9NT0JJTEVWSUVXX1JFU0VSVkVEMzEsICAgICAgICAgICAgLyogRVZFTlQgVE8gQkUgUkVQTEFDRUQgKi8KKyAgRVZFTlRfTU9CSUxFVklFV19SRVNFUlZFRDMyLCAgICAgICAgICAgIC8qIEVWRU5UIFRPIEJFIFJFUExBQ0VEICovCisKKyAgRVZFTlRfR1BTX0RDTUVfTUVBU19DWUNMRV9TVEFSVCwgICAgICAgIC8qIE5vIHBheWxvYWQgKi8gCisgIEVWRU5UX0dQU19EQ01FX01FQVNfQ1lDTEVfRU5ELCAgICAgICAgICAvKiBObyBwYXlsb2FkICovIAorICBFVkVOVF9HUFNfQ01FX0VOR0FHRUQsICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLyAKKyAgRVZFTlRfR1BTX0NNRV9OT1RfRU5HQUdFRCwgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8gCisgIEVWRU5UX0dQU19EQ01FX0VOR0FHRUQsICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovIAorICBFVkVOVF9HUFNfRENNRV9OT1RfRU5HQUdFRCwgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLyAKKworICBFVkVOVF9IU19VU0JfREVWSUNFX0FUVEFDSEVELCAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IU19VU0JfSElEX0RJU0NPTkVDVCwgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IU19VU0JfSElEX0NPTk5FQ1QsICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSFNfVVNCX01TRF9DT05ORUNULCAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSFNfVVNCX01TRF9ESVNDT05FQ1QsICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfSFNfVVNCX1NUQUNLX1NVU1BFTkRFRCwgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0hTX1VTQl9TVEFDS19SRVNVTUVELCAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9IU19VU0JfRU5URVJfSE9TVF9NT0RFLCAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9IU19VU0JfT1BFUkFUSU9OQUxfRVJST1IsICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9EVFZfTDFfQUNRX0RPTkUsICAgICAgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0wxX1NDQU4sICAgICAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9MMV9PTkxJTkUsICAgICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfTDFfU05PT1pFLCAgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9EVFZfTDFfU0xFRVAsICAgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9EVFZfTDFfSEFORE9GRiwgICAgICAgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0wxX1NJR05BTF9MT1NULCAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKworICBFVkVOVF9JTVNfU0lQX1JFR0lTVFJBVElPTl9TVEFSVCwgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSU1TX1NJUF9SRUdJU1RFUl9FTkQsICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19TSVBfREVSRUdJU1RFUl9TVEFSVCwgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9JTVNfU0lQX0RFUkVHSVNURVJfRU5ELCAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSU1TX1NJUF9TRVNTSU9OX1NUQVJULCAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19TSVBfU0VTU0lPTl9SSU5HSU5HLCAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9JTVNfU0lQX1NFU1NJT05fRVNUQUJMSVNIRUQsICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSU1TX1NJUF9TRVNTSU9OX1RFUk1JTkFURUQsICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19TSVBfU0VTU0lPTl9DQU5DRUwsICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9JTVNfU0lQX1NFU1NJT05fRkFJTFVSRSwgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSU1TX1NJUF9SRVNQT05TRV9SRUNWLCAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19TSVBfUkVRVUVTVF9SRUNWLCAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9JTVNfU0lQX1JFU1BPTlNFX1NFTkQsICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSU1TX1NJUF9SRVFVRVNUX1NFTkQsICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfV0xBTl9US0lQX0NPVU5URVJfTUVBUywgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfR1BTX0JMQU5LSU5HX09GRiwgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0JMQU5LSU5HX09OLCAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKworICBFVkVOVF9NTUdTRElfRVZFTlQsICAgICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfV0xBTl9DUF9TWVNfTUdSX1NUQVRFX1RSQU5TLCAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfR1BTX09QVElNSVNUSUNfUFVOQ19TVEFSVCwgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19PUFRJTUlTVElDX1BVTkNfRU5ELCAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1FWUF9TRU5EX1JUUF9QQUNLRVQsICAgICAgICAgICAgICAvKiA3IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9RVlBfUkVDVl9SVFBfUEFDS0VULCAgICAgICAgICAgICAgLyogNyBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9IRFJfSURMRV9SRUFDUV9GQUlMX0REQVJGLCAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9CQ0FTVF9TRUNfU1RLTV9QQVJTRV9TVEFUVVMsICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQkNBU1RfU0VDX1NUS01fUkVDRUlWRUQsICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfQkNBU1RfU0VDX1NEUF9QQVJTRV9TVEFUVVMsICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfQ0dQU19NRV9EUE9fU1RBVFVTLCAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19TVl9TRUFSQ0hfU1RBVEUsICAgICAgICAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfVE1fT05fREVNQU5EX01PREVfQ0hBTkdFLCAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX1RNX09OX0RFTUFORF9CRUdJTiwgICAgICAgICAgIC8qIDYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU19UTV9PTl9ERU1BTkRfRE9ORSwgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1JNQUNfQ0FSUklFUl9TVEFURV9DSEFOR0VELCAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0dQU19TQkFTX0RFTU9EX1JFUE9SVCwgICAgICAgICAgICAvKiA5IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNfRVhURVJOX0NPQVJTRV9QT1NfSU5KX1NUQVJULCAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HUFNfRVhURVJOX0NPQVJTRV9QT1NfSU5KX0VORCwgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTX0VQSF9SRVJFUVVFU1RfVElNRSwgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfV0xBTl9RT1NfUFNUUkVBTSwgICAgICAgICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dMQU5fQ1BfVkNDLCAgICAgICAgICAgICAgICAgICAgICAvKiA5IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0NHUFNfRElBR19GSVJTVF9TVUNDRVNTRlVMX0ZJWCwgICAvKiBObyBwYXlsb2FkICovCisKKyAgRVZFTlRfRVVMX1JFQ09ORklHX09SX0FTVV9PUl9UVElfUkVDRkcsIC8qIDEyIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0RTNzA3X1BLVF9MTl9VUERBVEUsICAgICAgICAgICAgICAvKiAzIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EUzcwN19QS1RfSURNX0NIQU5HRSwgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9STFBfUU5fQURELCAgICAgICAgICAgICAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfUkxQX1FOX0RST1AsICAgICAgICAgICAgICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1JMUF9NVUxUSUxJTktfTkFLLCAgICAgICAgICAgICAgICAvKiA5IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9STFBfUkVWX0xJTktfTkFLLCAgICAgICAgICAgICAgICAgLyogOSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1NUS19FVkVOVCwgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0dBTl9SRUdJU1RSQVRJT05fUkVRVUVTVCwgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HQU5fUkVHSVNURVJfQUNDRVBULCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ0FMTF9SSU5HSU5HX0FMRVJULCAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dBTl9QQUdJTkdfUkVDRUlWRUQsICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HQU5fQ0FMTF9ESVNDT05ORUNULCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR0FOX0NBTExfUkVMRUFTRV9DT01QTEVURSwgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dBTl9IQU5ESU5fQ09NTUFORCwgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HQU5fSEFORElOX0NPTVBMRVRFLCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR0FOX0hBTkRPVVRfQ09NTUFORCwgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dBTl9IQU5ET1VUX0NPTVBMRVRFLCAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HQU5fU01TX1NUQVJULCAgICAgICAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR0FOX1NNU19BQ0ssICAgICAgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dBTl9RREpfRU5RVUVVRSwgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0dBTl9RREpfREVRVUVVRSwgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0dBTl9BQ1RJVkFURV9EQVRBX0NIQU5ORUwsICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HQU5fREFUQV9DSEFOTkVMX0NPTk5FQ1RFRCwgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR0FOX1JMUF9TVVNQRU5ELCAgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dBTl9STFBfUkVTVU1FLCAgICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HQU5fV0FLRVVQX1JFUSwgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HQU5fV0FLRVVQX0NORiwgICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HQU5fSElCRVJOQVRJT05fUkVRLCAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HQU5fSElCRVJOQVRJT05fQ05GLCAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworCisgIEVWRU5UX1dDRE1BX1VMX0FNUl9SQVRFLCAgICAgICAgICAgICAgICAvKiAxMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRVVMX1RUSV9SRUNPTkZJRywgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dDRE1BX0NPTk5fUkVMX0NBVVNFLCAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9DT05OX1JFUV9DQVVTRSwgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9MVEVfVElNSU5HX0FEVkFOQ0UsICAgICAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX1VMX09VVF9PRl9TWU5DLCAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX1NQU19ERUFDVElWQVRFRCwgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xURV9SQUNIX0FDQ0VTU19TVEFSVCwgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9MVEVfUkFDSF9SQUlEX01BVENILCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX1JBQ0hfQUNDRVNTX1JFU1VMVCwgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfRFRWX0wxX1BPV0VSVVAsICAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9MMV9QT1dFUkRPV04sICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfTDFfU09GVF9SRVNFVCwgICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0wxX1NUQVRFX0NIQU5HRSwgICAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9MMV9BQ1FfVFVORV9TVEFUVVMsICAgICAgICAgICAvKiA5IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfTDFfQUNRX0RPTkVfU1RBVFVTLCAgICAgICAgICAgLyogOSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0wxX0FDUV9GQUlMLCAgICAgICAgICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9MMV9UUkFGRklDX1NUQVJURUQsICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfTDFfQkFEX0ZSQU1FX1JFQ0VJVkVELCAgICAgICAgLyogNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0wxX1RNQ0NfRkFJTFVSRSwgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9MMV9SRUNPVkVSWV9TVEFUVVMsICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfTDFfSU5URVJSVVBUX0xPR19SRUNFSVZFRCwgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0wxX0wzX0FQSV9DT01NQU5ELCAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9MMV9NT0RFTV9GQUlMVVJFLCAgICAgICAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0dTTV9DQUxMX0RST1AsICAgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HU01fQUNDRVNTX0ZBSUxVUkUsICAgICAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9EVFZfSVNEQl9BQ1RJVkFURSwgICAgICAgICAgICAgICAgLyogOSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0lTREJfREVBQ1RJVkFURSwgICAgICAgICAgICAgIC8qIDkgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9JU0RCX1RVTkUsICAgICAgICAgICAgICAgICAgICAvKiAxMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0lTREJfVU5UVU5FLCAgICAgICAgICAgICAgICAgIC8qIDkgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9JU0RCX1NFTEVDVF9TRVJWSUNFLCAgICAgICAgICAvKiAxMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0lTREJfU0VSVklDRV9BVkFJTEFCTEUsICAgICAgIC8qIDYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9JU0RCX1RSQUZGSUNfTE9TVCwgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfSVNEQl9UQUJMRV9VUERBVEUsICAgICAgICAgICAgLyogNyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0lTREJfVFJBQ0tTX1NFTEVDVEVELCAgICAgICAgIC8qIDEzIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfSVNEQl9QRVNfQlVGRkVSX09WRVJGTE9XLCAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0lTREJfUEVTX0JVRkZFUl9VTkRFUkZMT1csICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9JU0RCX0FDUVVJUkVfREFUQV9DT01QT05FTlQsICAvKiAxMCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0lTREJfU1RPUF9DT01QT05FTlRfQUNRVUlTSVRJT04sIC8qIDEwIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9EVFZfSVNEQl9ESUlfQ0hBTkdFRCwgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0lTREJfREFUQV9FVkVOVF9NRVNTQUdFLCAgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0RUVl9JU0RCX01PRFVMRV9DT05TVFJVQ1RJT04sICAgICAvKiAxMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfRFRWX0lTREJfUEFSU0lOR19FUlJPUiwgICAgICAgICAgIC8qIDEzIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0hEUl9TTFBfU0xQUUhfVElNRVJfU1RBUlRFRCwgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0hEUl9TTFBfU0xQUUhfVElNRVJfU1RPUFBFRCwgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9IRFJfU0xQX1NMUFFIX05VTV9QRU5ESU5HX01TR1MsICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSERSX09WSERfRklORF9DQUNIRURfTVNHLCAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfV0NETUFfUlJDX1RJTUVSX0VYUElSRUQsICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dDRE1BX1VPT1NfVElNRVJfVVNFRCwgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9VT09TX1RJTUVSX1NUQVJULCAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0NETUFfVU9PU19USU1FUl9TVE9QLCAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dDRE1BX1VPT1NfVElNRV9SRU1BSU5JTkcsICAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9SUkNDU1BfU0NBTl9TVEFSVCwgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0NETUFfQUNRVUlTSVRPTl9TVUNDRVNTLCAgICAgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dDRE1BX0NFTExfU0VMRUNUSU9OX0ZBSUwsICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9CUExNTl9TVEFSVCwgICAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0NETUFfQlBMTU5fRU5ELCAgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dDRE1BX0JQTE1OX1NDQU5fU1RBUlQsICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XQ0RNQV9CUExNTl9TQ0FOX0VORCwgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9NU0dfSElHSCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX01TR19NRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTVNHX0xPVywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NU0dfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX01TR19GQVRBTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9HQU5fU1RBUlRfVFUzOTEwLCAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HQU5fU1RPUF9UVTM5MTAsICAgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLyAKKyAgRVZFTlRfR0FOX0VYUElSWV9UVTM5MTAsICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR0FOX1NUQVJUX1RVMzkyMCwgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR0FOX1NUT1BfVFUzOTIwLCAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR0FOX0VYUElSWV9UVTM5MjAsICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR0FOX1NUQVJUX1RVMzkwNiwgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8gCisgIEVWRU5UX0dBTl9TVE9QX1RVMzkwNiwgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovIAorICBFVkVOVF9HQU5fRVhQSVJZX1RVMzkwNiwgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HQU5fVVJSX1JFR0lTVEVSX1VQREFURSwgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9JUFNFQ19JS0VfU0FfSU5JVF9TRU5ULCAgICAgICAgICAgIC8qIDggYnl0ZXMgcGF5bG9hZCAqLworICBFVkVOVF9JUFNFQ19JS0VfU0FfSU5JVF9SRUNWLCAgICAgICAgICAgIC8qIDE2IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfSUtFX1NBX0VTVEFCTElTSEVELCAgICAgICAgICAvKiAxNiBieXRlcyBwYXlsb2FkICovCisgIEVWRU5UX0lQU0VDX0lLRV9BVVRIX1NFTlQsICAgICAgICAgICAgICAgLyogMTYgYnl0ZXMgcGF5bG9hZCAqLworICBFVkVOVF9JUFNFQ19JS0VfQVVUSF9SRUNWLCAgICAgICAgICAgICAgIC8qIDE2IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfSUtFX0VBUF9TVEFSVCwgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0lQU0VDX0lLRV9FQVBfRklOSVNILCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfQ0hJTERfU0FfRVNUQUJMSVNIRUQsICAgICAgICAvKiA4IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfSUtFX0lORk9fTVNHX1NFTlQsICAgICAgICAgICAvKiAxNiBieXRlcyBwYXlsb2FkICovIAorICBFVkVOVF9JUFNFQ19JS0VfSU5GT19NU0dfUkVDViwgICAgICAgICAgIC8qIDE2IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfQ1JFQVRFX0NISUxEX1NBX1NFTlQsICAgICAgICAvKiAxNiBieXRlcyBwYXlsb2FkICovCisgIEVWRU5UX0lQU0VDX0NSRUFURV9DSElMRF9TQV9SRUNWLCAgICAgICAgLyogMTYgYnl0ZXMgcGF5bG9hZCAqLworICBFVkVOVF9JUFNFQ19JS0VfU0FfREVMRVRFX1NUQVJULCAgICAgICAgIC8qIDE2IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfSUtFX1NBX0RFTEVURV9ET05FLCAgICAgICAgICAvKiAxNiBieXRlcyBwYXlsb2FkICovCisgIEVWRU5UX0lQU0VDX0NISUxEX1NBX0RFTEVURV9TVEFSVCwgICAgICAgLyogOCBieXRlcyBwYXlsb2FkICovCisgIEVWRU5UX0lQU0VDX0NISUxEX1NBX0RFTEVURV9ET05FLCAgICAgICAgLyogOCBieXRlcyBwYXlsb2FkICovCisgIEVWRU5UX0lQU0VDX0lLRV9TQV9SRUtFWV9TVEFSVCwgICAgICAgICAgLyogMTYgYnl0ZXMgcGF5bG9hZCAqLworICBFVkVOVF9JUFNFQ19JS0VfU0FfUkVLRVlfRE9ORSwgICAgICAgICAgIC8qIDE2IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfQ0hJTERfU0FfUkVLRVlfU1RBUlQsICAgICAgICAvKiA4IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfQ0hJTERfU0FfUkVLRVlfRE9ORSwgICAgICAgICAvKiA4IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfSUtFX01FU0dfUkVUUkFOU01JVCwgICAgICAgICAvKiA0IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfSUtFX05BVF9ERVRFQ1RFRCwgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0lQU0VDX0lLRV9OQVRfS0VFUEFMSVZFX1NFTlQsICAgICAgLyogMTYgYnl0ZXMgcGF5bG9hZCAqLworICBFVkVOVF9JUFNFQ19JS0VfRFBEX1NFTlQsICAgICAgICAgICAgICAgIC8qIDE2IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfSUtFX0VSUl9OT1RJRllfU0VOVCwgICAgICAgICAvKiA0IGJ5dGVzIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBTRUNfSUtFX0VSUl9OT1RJRllfUkVDViwgICAgICAgICAvKiA0IGJ5dGVzIHBheWxvYWQgKi8KKworICBFVkVOVF9HQU5fUk9WRUlOX0NORiwgICAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR0FOX1JPVkVPVVRfQ05GLCAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX0dBTl9SUkNfUk9WRUlOX0NORiwgICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HQU5fUlJDX1JPVkVJTl9SRUosICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dBTl9SUkNfUk9WRU9VVF9DTkYsICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9HQU5fUlJDX1JPVkVPVVRfUkVKLCAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfR1BTWFRSQV9UX1NFU1NfQkVHSU4sICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9HUFNYVFJBX1RfU0VTU19EQVRBLCAgICAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0dQU1hUUkFfVF9TRVNTX0RPTkUsICAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfR1BTWFRSQV9UX1NFU1NfRU5ELCAgICAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0RTX0dPX05VTExfVElNRVIsICAgICAgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9MVEVfUlJDX1RJTUVSX1NUQVRVUywgICAgICAgICAgICAgIC8qIDYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xURV9SUkNfU1RBVEVfQ0hBTkdFLCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX1JSQ19PVVRfT0ZfU0VSVklDRSwgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9MVEVfUlJDX1JBRElPX0xJTktfRkFJTFVSRSwgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xURV9SUkNfRExfTVNHLCAgICAgICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8gCisgIEVWRU5UX0xURV9SUkNfVUxfTVNHLCAgICAgICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX1JSQ19ORVdfQ0VMTF9JTkQsICAgICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9MVEVfUlJDX0NFTExfUkVTRUxfRkFJTFVSRSwgICAgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xURV9SUkNfSE9fRkFJTFVSRSwgICAgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX1JSQ19QQUdJTkdfRFJYX0NZQ0xFLCAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9MVEVfUlJDX0lSQVRfSE9fRlJPTV9FVVRSQU4sICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xURV9SUkNfSVJBVF9IT19GUk9NX0VVVFJBTl9GQUlMVVJFLCAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9MVEVfUlJDX0lSQVRfUkVTRUxfRlJPTV9FVVRSQU4sICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX1JSQ19JUkFUX1JFU0VMX0ZST01fRVVUUkFOX0ZBSUxVUkUsIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xURV9SUkNfU0lCX1JFQURfRkFJTFVSRSwgICAgICAgICAgLyogNiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9HQU5fUk9WRUlOX1JFUSwgICAgICAgICAgICAgICAgICAgIC8qIE5vIHBheWxvYWQgKi8KKyAgRVZFTlRfR0FOX1JPVkVPVVRfUkVRLCAgICAgICAgICAgICAgICAgICAvKiBObyBwYXlsb2FkICovCisKKyAgRVZFTlRfTUJQX1JGX0FOQUxPR19KRF9NT0RFX0NIQU5HRSwgICAgICAvKiA3IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9NQlBfUkZfQU5BTE9HX0pEX0lOVCwgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfQ0dQU19RV0lQX1NZU0RfVFJBTlNJVElPTiwgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICAKKyAgRVZFTlRfSFBMTU5fVElNRVJfRVhQSVJFRCwgICAgICAgICAgICAgICAvKiBObyBQYXlsb2FkICovCisKKyAgRVZFTlRfR1NESV9HRVRfRkVBVFVSRV9JTkRJQ0FUT1JfREFUQSwgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0xURV9DTV9JTkNPTUlOR19NU0csICAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX0NNX09VVEdPSU5HX01TRywgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9MVEVfRU1NX0lOQ09NSU5HX01TRywgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xURV9FTU1fT1VUR09JTkdfTVNHLCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX0VNTV9USU1FUl9TVEFSVCwgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9MVEVfRU1NX1RJTUVSX0VYUElSWSwgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfTFRFX1JFR19JTkNPTUlOR19NU0csICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9MVEVfUkVHX09VVEdPSU5HX01TRywgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xURV9FU01fSU5DT01JTkdfTVNHLCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX0VTTV9PVVRHT0lOR19NU0csICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9MVEVfRVNNX1RJTUVSX1NUQVJULCAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0xURV9FU01fVElNRVJfRVhQSVJZLCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9TTlNfQ09OVEVYVF9PUEVOLCAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NOU19DT05URVhUX0NMT1NFLCAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU05TX0NPTkRfU0VULCAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9TTlNfQ09ORF9DQU5DRUwsICAgICAgICAgICAgICAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1NOU19DT05EX01FVCwgICAgICAgICAgICAgICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU05TX0RBVEFfU1RBUlQsICAgICAgICAgICAgICAgICAgICAvKiAxMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfU05TX0RBVEFfU1RPUCwgICAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1dDRE1BX1JMQ19DT05GSUcsICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9IU1BBX1BMVVNfQ0ZHLCAgICAgICAgICAgICAgICAgICAgIC8qIDYgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfU05TX0RSSVZFUl9TVEFURV9DSEFOR0UsICAgICAgICAgICAvKiA5IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX1dDRE1BX1RJTUVSX0RJU0NBUkRfRVhQSVJZLCAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8gIAorCisgIEVWRU5UX05BU19DQl9QQUdFX1JFQ0VJVkVELCAgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8gIAorCisgIEVWRU5UX1dDRE1BX1JMQ19SRVNFVCwgICAgICAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8gIAorCisgIEVWRU5UX0hEUl9NUkxQX0VIUlBEX1BFUlNPTkFMSVRZX0lTX0FDVElWRSwgLyogMSBieXRlIHBheWxvYWQgKi8gIAorICAKKyAgRVZFTlRfV0xBTl9TRUNVUklUWSwgICAgICAgICAgICAgICAgICAgICAvKiAxMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgICAvKiAxNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9IQU5ET0ZGLCAgICAgICAgICAgICAgICAgICAgICAvKiAxNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9WQ0MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XTEFOX1FPUywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dMQU5fUEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTYgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dMQU5fQUREX0JMT0NLX0FDS19TVUNDRVNTLCAgICAgICAgLyogMTEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dMQU5fQUREX0JMT0NLX0FDS19GQUlMRUQsICAgICAgICAgLyogOSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9ERUxFVEVfQkxPQ0tfQUNLX1NVQ0NFU1MsICAgICAvKiA4IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XTEFOX0RFTEVURV9CTE9DS19BQ0tfRkFJTEVELCAgICAgIC8qIDggYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dMQU5fQlNTX1BST1RFQ1RJT04sICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9CUklOR1VQX1NUQVRVUywgICAgICAgICAgICAgICAvKiAxMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9QT1dFUlNBVkVfR0VORVJJQywgICAgICAgICAgICAvKiAxNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9QT1dFUlNBVkVfV09XLCAgICAgICAgICAgICAgICAvKiAxMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9XQ00sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9XUFNfU0NBTl9TVEFSVCwgICAgICAgICAgICAgICAvKiAxNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9XUFNfU0NBTl9DT01QTEVURSwgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XTEFOX1dQU19DT05ORUNUX1JFUVVFU1QsICAgICAgICAgIC8qIDkgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dMQU5fV1BTX0NPTk5FQ1RfUkVTUE9OU0UsICAgICAgICAgLyogNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9XUFNfUEJDX1NFU1NJT05fT1ZFUkxBUCwgICAgICAvKiAxNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9XUFNfUEJDX1dBTEtfVElNRVJfU1RBUlQsICAgICAvKiBObyBwYXlsb2FkICovCisgIEVWRU5UX1dMQU5fV1BTX1BCQ19XQUxLX1RJTUVSX1NUT1AsICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9XTEFOX1dQU19QQkNfQVBfREVURUNURUQsICAgICAgICAgIC8qIDE0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XTEFOX1dQU19SRUdJU1RSQVRJT05fU1RBUlQsICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dMQU5fV1BTX1dTQ19NRVNTQUdFLCAgICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfV0xBTl9XUFNfRElTQ09WRVJZLCAgICAgICAgICAgICAgICAvKiA3IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9XTEFOX1dQU19SRUdJU1RSQVRJT05fQ09NUExFVEUsICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1dMQU5fV1BTX0RJU0NPTk5FQ1QsICAgICAgICAgICAgICAgLyogTm8gcGF5bG9hZCAqLworICBFVkVOVF9XTEFOX0JUQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE1IGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0lQVjZfU01fRVZFTlQsICAgICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSVBWNl9TTV9UUkFOU0lUSU9OLCAgICAgICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9JUFY2X1BSRUZJWF9VUERBVEUsICAgICAgICAgICAgICAgIC8qIDEzIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0xURV9NTDFfU1RBVEVfQ0hBTkdFLCAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9BVVRIX1BST1RPLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX1ZTTkNQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSUlELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX1JFR0lTVFJBVElPTl9TVUNDRVNTLCAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0lOVklURV9TRU5ULCAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0lOQ09NSU5HX0lOVklURSwgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0FDQ0VQVF9SRUpFQ1RfSU5WSVRFLCAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0FDQ0VQVElOR19TRVNTSU9OLCAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX1NFU1NJT05fRVNUQUJMSVNIRUQsICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0VORF9TRVNTSU9OLCAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX1BSRVZJRVdfVklERU9fRlJBTUUsICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0RFQ09ERURfVklERU9fRlJBTUUsICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX1JFQ0VJVklORywgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX1NUQVJUX0FQUExJQ0FUSU9OLCAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0VORF9BUFBMSUNBVElPTiwgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0NBUEFCSUxJVFlfU1VDQ0VTUywgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX01FRElBX1JFQ09SRElOR19SRVNPVVJDRV9BQ1FVSVJFRCwgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9JTVNfVklERU9TSEFSRV9NRURJQV9SRUNPUkRJTkdfUkVTT1VSQ0VfUkVMRUFTRUQsICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSU1TX1ZJREVPU0hBUkVfU0VORElORywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0lOQ09NSU5HX09QVElPTl9SRUNFSVZFRCwgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9JTVNfVklERU9TSEFSRV9JTkNPTUlOR19PUFRJT05fUkVTUE9OREVELCAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSU1TX1ZJREVPU0hBUkVfRVJSX0NBTExfRkFJTEVELCAgICAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0VSUl9SRUdJU1RSQVRJT05fRkFJTEVELCAgICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9JTVNfVklERU9TSEFSRV9FUlJfUkVDT1JERVJfRVJST1IsICAgICAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSU1TX1ZJREVPU0hBUkVfRVJSX1BMQVlFUl9FUlJPUiwgICAgICAgICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0lNU19WSURFT1NIQVJFX0VSUl9NRURJQV9TRVNTSU9OX0ZBSUxVUkUsICAgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9JTVNfVklERU9TSEFSRV9FUlJfQ0FQQUJJTElUWV9GQUlMVVJFLCAgICAgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfSU1TX1ZJREVPU0hBUkVfRVJSX01FRElBX1JFQ09SRElOR19GQUlMRUQsICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfV0xBTl9QRV9GUkFNRSwgICAgICAgICAgICAgICAgICAgICAvKiAxNiBieXRlIHBheWxvYWQgKi8KKworICBFVkVOVF9TTlNfVkNQU19IRUFESU5HX0NPTVBVVEVELCAgICAgICAgIC8qIDEyIGJ5dGUgcGF5bG9hZCAqLyAKKyAgRVZFTlRfU05TX1ZDUFNfVFJBQ0tFRF9DQUxfU0VUX1NBVkVELCAgICAvKiAyMiBieXRlIHBheWxvYWQgKi8gCisKKyAgRVZFTlRfR05TU19QUkVTQ19EV0VMTF9DT01QTEVURSwgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLyAKKworICBFVkVOVF9MVEVfTUFDX1JFU0VULCAgICAgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovIAorICBFVkVOVF9MVEVfQlNSX1NSX1JFUVVFU1QsICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovIAorICBFVkVOVF9MVEVfTUFDX1RJTUVSLCAgICAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovIAorCisgIEVWRU5UX0NNX0RTX09QRVJBVElPTkFMX01PREUsICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fRFNfTU9ERV9QUkVGLCAgICAgICAgICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19HV19BQ1FfT1JERVJfUFJFRiwgICAgICAgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX0RTX1NSVl9ET01BSU5fUFJFRiwgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fRFNfQkFORF9QUkVGLCAgICAgICAgICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19ST0FNX1BSRUYsICAgICAgICAgICAgICAgICAgIC8qIDUgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX0RTX0hZQlJJRF9QUkVGLCAgICAgICAgICAgICAgICAgLyogNSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fRFNfTkVUV09SS19TRUxfTU9ERV9QUkVGLCAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19DQUxMX0VWRU5UX09SSUcsICAgICAgICAgICAgIC8qIDQgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX0RTX0NBTExfRVZFTlRfQ09OTkVDVCwgICAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fRFNfQ0FMTF9FVkVOVF9FTkQsICAgICAgICAgICAgICAvKiAzIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19FTlRFUl9FTUVSR0VOQ1lfQ0IsICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX0RTX0VYSVRfRU1FUkdFTkNZX0NCLCAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fRFNfQ0FMTF9TVEFURSwgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19EU19JTlRFUlJBVF9TVEFURSwgICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX0RTX0NFTExfU1JWX0lORCwgICAgICAgICAgICAgICAgLyogNiBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fRFNfQ09VTlRSWV9TRUxFQ1RFRCwgICAgICAgICAgICAvKiAzIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19EQVRBX0FWQUlMQUJMRSwgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX0RTX1NFTEVDVF9DT1VOVFJZLCAgICAgICAgICAgICAgLyogOCBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fRFNfQ0FMTF9FVkVOVF9PUklHX1RIUiwgICAgICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19QTE1OX0ZPVU5ELCAgICAgICAgICAgICAgICAgIC8qIDEzIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19TRVJWSUNFX0NPTkZJUk1FRCwgICAgICAgICAgIC8qIDEzIGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19HRVRfUEFTU1dPUkRfSU5ELCAgICAgICAgICAgIC8qIDMgYnl0ZSBwYXlsb2FkICovCisgIEVWRU5UX0NNX0RTX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX1NUQVRVUywgLyogMyBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfQ01fRFNfVVNTX1JFU1BPTlNFX05PVElGWV9JTkQsICAgICAvKiA0IGJ5dGUgcGF5bG9hZCAqLworICBFVkVOVF9DTV9EU19MQ1NfTU9MUl9DT05GLCAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovCisKKyAgRVZFTlRfRFNfTkFTX01FU1NBR0VfU0VOVCwgICAgICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLyAKKyAgRVZFTlRfRFNfTkFTX01FU1NBR0VfUkVDRUlWRUQsICAgICAgICAgICAvKiA1IGJ5dGUgcGF5bG9hZCAqLyAgCisgIEVWRU5UX0RTX01NX1NUQVRFLCAgICAgICAgICAgICAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8gCisgIEVWRU5UX0RTX0dNTV9TVEFURSwgICAgICAgICAgICAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8gCisgIEVWRU5UX0RTX1BMTU5fSU5GT1JNQVRJT04sICAgICAgICAgICAgICAgLyogMTAgYnl0ZSBwYXlsb2FkICovIAorCisgIEVWRU5UX0RJQUdfU1RSRVNTX1RFU1RfQ09NUExFVEVELCAgICAgICAgLyogNCBieXRlIHBheWxvYWQgKi8gCisKKyAgRVZFTlRfR05TU19DQ19TVEFUVVMsICAgICAgICAgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLyAKKworICBFVkVOVF9TTlNfVVNFUl9TVEFURV9DSEFOR0UsICAgICAgICAgICAgIC8qIDYgYnl0ZSBwYXlsb2FkICovIAorCisgIEVWRU5UX0RTX0hQTE1OX1RJTUVSX0VYUElSRUQsICAgICAgICAgICAgLyogMSBieXRlIHBheWxvYWQgKi8gIAorICBFVkVOVF9EU19SQVRfQ0hBTkdFLCAgICAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovIAorCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9DQUxMX0FDVElWQVRFLCAgICAgICAgICAgICAgIC8qOSBieXRlIHBheWxvYWQqLyAvKklEPTE3NTcqLyAKKyAgRVZFTlRfRFRWX0NNTUJfQVBJX0NBTExfREVBQ1RJVkFURSwgICAgICAgICAgIC8qOSBieXRlIHBheWxvYWQqLworICBFVkVOVF9EVFZfQ01NQl9BUElfQ0FMTF9UVU5FLCAgICAgICAgICAgICAgICAgICAgIC8qMTMgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX0NBTExfU0VMRUNUX1NFUlZJQ0UsICAgICAvKjExIGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9DQUxMX0RFU0VMRUNUX1NFUlZJQ0UsICAvKjExIGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9DQUxMX0dFVF9TSUdOQUxfUEFSQU1FVEVSUywgICAgICAvKjkgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX0NBTExfR0VUX05JVCwgICAgICAgICAgICAgICAgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9DQUxMX0dFVF9DTUNULCAgICAgICAgICAgICAvKjkgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX0NBTExfR0VUX1NNQ1QsICAgICAgICAgICAgIC8qOSBieXRlIHBheWxvYWQqLworICBFVkVOVF9EVFZfQ01NQl9BUElfQ0FMTF9HRVRfQ1NDVCwgICAgICAgICAgICAgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9DQUxMX0dFVF9TU0NULCAgICAgICAgICAgICAvKjkgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX0NBTExfR0VUX0VBRFQsICAgICAgICAgICAgIC8qOSBieXRlIHBheWxvYWQqLworICBFVkVOVF9EVFZfQ01NQl9BUElfQ0FMTF9SRVFVRVNUX0NBX0NBUkRfTlVNQkVSLCAgIC8qOSBieXRlIHBheWxvYWQqLworICBFVkVOVF9EVFZfQ01NQl9BUElfQ0FMTF9SRVFVRVNUX0NBU19JRCwgICAgICAgICAgICAgICAgIC8qOSBieXRlIHBheWxvYWQqLworICBFVkVOVF9EVFZfQ01NQl9BUElfQ0FMTF9SRUdJU1RFUl9GT1JfQ09OVFJPTF9OT1RJRklDQVRJT05TLCAgICAgICAgIC8qOSBieXRlIHBheWxvYWQqLworICBFVkVOVF9EVFZfQ01NQl9BUElfQ0FMTF9ERVJFR0lTVEVSX0ZST01fQ09OVFJPTF9OT1RJRklDQVRJT05TLCAgIC8qOSBieXRlIHBheWxvYWQqLworICBFVkVOVF9EVFZfQ01NQl9BUElfTk9USUZJQ0FUSU9OX0FDVElWQVRFLCAgICAgICAgICAgICAgIC8qOSBieXRlIHBheWxvYWQqLworICBFVkVOVF9EVFZfQ01NQl9BUElfTk9USUZJQ0FUSU9OX0RFQUNUSVZBVEUsICAgICAgICAgICAvKjkgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX05PVElGSUNBVElPTl9UVU5FLCAgICAgIC8qMTMgYnl0ZSBwYXlsb2FkKi8gCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9OT1RJRklDQVRJT05fU0VMRUNUX1NFUlZJQ0UsICAgICAvKjExIGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9OT1RJRklDQVRJT05fREVTRUxFQ1RfU0VSVklDRSwgIC8qMTEgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX05PVElGSUNBVElPTl9UQUJMRV9VUERBVEUsICAgICAgICAvKjYgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX05PVElGSUNBVElPTl9TSUdOQUxfUEFSQU1FVEVSUywvKjE0IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9OT1RJRklDQVRJT05fQVVUSE9SSVpBVElPTl9GQUlMVVJFLCAgICAgICAgICAgICAgICAgLyoxMSBieXRlIHBheWxvYWQqLworICBFVkVOVF9EVFZfQ01NQl9BUElfTk9USUZJQ0FUSU9OX1JFR0lTVEVSX0ZPUl9DT05UUk9MX05PVElGSUNBVElPTlNfQ09NUExFVEUsICAgICAgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9OT1RJRklDQVRJT05fREVSRUdJU1RFUl9GUk9NX0NPTlRST0xfTk9USUZJQ0FUSU9OU19DT01QTEVURSwgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9OT1RJRklDQVRJT05fQ0FfQ0FSRF9OVU1CRVIsICAgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9OT1RJRklDQVRJT05fQ0FTX0lELCAgICAgICAgICAgICAgICAgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9OT1RJRklDQVRJT05fRU1FUkdFTkNZX0JST0FEQ0FTVElOR19UUklHR0VSLCAvKjkgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX05PVElGSUNBVElPTl9FTUVSR0VOQ1lfQlJPQURDQVNUSU5HX01FU1NBR0UsLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9DQUxMX1JFR0lTVEVSX0ZPUl9FU0dfTk9USUZJQ0FUSU9OUywgICAgICAgICAgICAgICAgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9DQUxMX0RFUkVHSVNURVJfRlJPTV9FU0dfTk9USUZJQ0FUSU9OUywgICAgICAgICAgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9DQUxMX0dFVF9CQVNJQ19ERVNDUklQVElPTl9JTkZPUk1BVElPTiwgICAgICAgICAgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0FQSV9DQUxMX1NFVF9PVVRQVVRfUEFUSCwvKjkgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX05PVElGSUNBVElPTl9FU0dfREFUQV9JTkZPUk1BVElPTiwgICAgICAgICAgICAgICAgICAvKjYgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX05PVElGSUNBVElPTl9FU0dfREFUQV9JTkZPUk1BVElPTl9ET1dOTE9BRF9DT01QTEVURSwgICAgICAgICAvKjkgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX05PVElGSUNBVElPTl9FU0dfUFJPR1JBTV9JTkRJQ0FUSU9OX0lORk9STUFUSU9OLCAgICAgICAgICAgICAgICAgICAvKjkgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX05PVElGSUNBVElPTl9SRUdJU1RFUl9GT1JfRVNHX05PVElGSUNBVElPTlNfQ09NUExFVEUsICAgICAgICAgICAvKjkgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQVBJX05PVElGSUNBVElPTl9ERVJFR0lTVEVSX0ZST01fRVNHX05PVElGSUNBVElPTlNfQ09NUExFVEUsICAgICAvKjkgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRFRWX0NNTUJfQ0FTX0lOSVRJQUxJWkVELCAgICAgICAgICAgICAgICAgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0NBU19FTU1fUkVDRUlWRURfQU5EX1BST0NFU1NFRCwgICAgLyo5IGJ5dGUgcGF5bG9hZCovCisgIEVWRU5UX0RUVl9DTU1CX0NBU19FQ01fUkVDRUlWRURfQU5EX1BST0NFU1NFRCwgICAgLyoxMSBieXRlIHBheWxvYWQqLyAvKklEPTE3OTgqLworICAKKyAgRVZFTlRfRUNBTExfU1RBUlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjMgYnl0ZSBwYXlsb2FkKi8gCisgIEVWRU5UX0VDQUxMX1NUT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoxIGJ5dGUgcGF5bG9hZCovIAorICBFVkVOVF9FQ0FMTF9TRVNTSU9OX1NUQVJULCAgICAgICAgICAgICAgICAgICAgICAgIC8qMSBieXRlIHBheWxvYWQqLworICBFVkVOVF9FQ0FMTF9TRVNTSU9OX0ZBSUxVUkUsICAgICAgICAgICAgICAgICAgICAgIC8qMSBieXRlIHBheWxvYWQqLworICBFVkVOVF9FQ0FMTF9TRVNTSU9OX0NPTVBMRVRFLCAgICAgICAgICAgICAgICAgICAvKjMgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRUNBTExfU0VTU0lPTl9SRVNFVCwgICAgICAgICAgICAgICAgICAgICAgICAvKjEgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRUNBTExfUFNBUF9NU0RfREVDT0RFX1NVQ0NFU1MsICAgICAvKjIgYnl0ZSBwYXlsb2FkKi8KKyAgRVZFTlRfRUNBTExfUFNBUF9MT1NUX1NZTkMsICAgICAgICAgICAgICAgICAgICAgLyoxIGJ5dGUgcGF5bG9hZCovIC8qSUQgPSAxODA2Ki8KKworICBFVkVOVF9MVEVfUlJDX0lSQVRfUkVESVJfRlJPTV9FVVRSQU5fU1RBUlQsIC8qMSBieXRlIHBheWxvYWQgKi8KKyAgRVZFTlRfTFRFX1JSQ19JUkFUX1JFRElSX0ZST01fRVVUUkFOX0VORCwgICAgLyogMiBieXRlIHBheWxvYWQgKi8gLypJRCA9IDE4MDgqLworCisgIEVWRU5UX0dQUlNfRFNfQ0VMTF9DSEFOR0VfT1JERVIsICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8gLyoxODA5Ki8KKyAgRVZFTlRfR1NNX0RTX0NFTExfU0VMRUNUSU9OX0VORCwgICAgICAgICAgICAvKiAyIGJ5dGUgcGF5bG9hZCAqLyAvKjE4MTAqLworICBFVkVOVF9HU01fRFNfTDFfU1RBVEUsICAgICAgICAgICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovIC8qMTgxMSovCisgIEVWRU5UX0dTTV9EU19QTE1OX0xJU1RfU1RBUlQsICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8gLyoxODEyKi8KKyAgRVZFTlRfR1NNX0RTX1BMTU5fTElTVF9FTkQsICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLyAvKjE4MTMqLworICBFVkVOVF9HU01fRFNfUE9XRVJfU0NBTl9TVEFUVVMsICAgICAgICAgICAgIC8qIDIgYnl0ZSBwYXlsb2FkICovIC8qMTgxNCovCisgIEVWRU5UX0dTTV9EU19SRVNFTEVDVF9TVEFSVCwgICAgICAgICAgICAgICAgLyogMiBieXRlIHBheWxvYWQgKi8gLyoxODE1Ki8KKyAgRVZFTlRfR1NNX0RTX1JSX0lOX1NFUlZJQ0UsICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgcGF5bG9hZCAqLyAvKjE4MTYqLworICBFVkVOVF9HU01fRFNfUlJfT1VUX09GX1NFUlZJQ0UsICAgICAgICAgICAgIC8qIDEgYnl0ZSBwYXlsb2FkICovIC8qMTgxNyovCisgIEVWRU5UX0dTTV9EU19USU1FUl9FWFBJUkVELCAgICAgICAgICAgICAgICAgLyogMyBieXRlIHBheWxvYWQgKi8gLyoxODE4Ki8KKyAgRVZFTlRfR1NNX0RTX1RPX1dDRE1BX1JFU0VMRUNUX0VORCwgICAgICAgICAvKiA2IGJ5dGUgcGF5bG9hZCAqLyAvKjE4MTkqLworCisgIEVWRU5UX0NNX0RTX1NZU1RFTV9NT0RFLCAgICAgICAgICAgICAgICAgICAgLyoyIGJ5dGUgcGF5bG9hZCovIC8qMTgyMCovCisgIEVWRU5UX1NEX0RTX0VWRU5UX0FDVElPTiwgICAgICAgICAgICAgICAgICAgLyo5IGJ5dGUgcGF5bG9hZCovIC8qMTgyMSovCisgIEVWRU5UX1NNR01NX0RTX1JFUVVFU1RfU0VOVCwgICAgICAgICAgICAgICAgLyozIGJ5dGUgcGF5bG9hZCovIC8qMTgyMiovCisKKyAgRVZFTlRfSUZBQ0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjQgYnl0ZSBwYXlsb2FkKi8gLyoxODIzKi8KKyAgRVZFTlRTX0RTX0dTTV9MMV9BTElHTl9WRlIgPSAweDcyMCwKKyAgRVZFTlRTX0RTX0dTTV9MMV9TVEFURSA9IDB4NzIxLAorICBFVkVOVFNfRFNfR1NNX1JBVFNDQ0hfSU5fRFRYID0gMHg3MjIsCisgIEVWRU5UU19EU19HU01fRkFDQ0hfSU5fRFRYID0gMHg3MjMsCisgIEVWRU5UU19EU19HU01fRkFDQ0hfQU5EX1JBVFNDQ0hfQ09MTElTSU9OID0gMHg3MjQsCisgIEVWRU5UU19EU19HU01fRkFDQ0hfQU5EX1NJRF9VUERBVEVfQ09MTElTSU9OID0gMHg3MjUsCisgIEVWRU5UU19EU19HU01fUkFUU0NDSF9BTkRfU0lEX1VQREFURV9DT0xMSVNJT04gPSAweDcyNiwKKyAgRVZFTlRTX0RTX0dTTV9BTVJfU1RBVEVfQ0hBTkdFID0gMHg3MjcsCisgIEVWRU5UU19EU19HU01fUkFUU0NDSF9DTUlfUEhBU0VfQ0hBTkdFID0gMHg3MjgsCisgIEVWRU5UU19EU19HU01fUkFUU0NDSF9SRVFfQUNUX1RJTUVSX0VYUElSWSA9IDB4NzI5LAorICBFVkVOVFNfRFNfR1NNX1JBVFNDQ0hfQUNLX0FDVF9USU1FUl9FWFBJUlkgPSAweDcyYSwKKyAgRVZFTlRTX0RTX0dTTV9BTVJfUkFUU0NDSF9SRVEgPSAweDcyYiwKKyAgRVZFTlRTX0RTX0dTTV9BTVJfUkFUU0NDSF9SU1AgPSAweDcyYywKKyAgRVZFTlRTX0RTX0dTTV9BTVJfQ01DX1RVUk5BUk9VTkRfVElNRSA9IDB4NzJkLAorICBFVkVOVFNfRFNfR1BSU19TTUdNTV9NU0dfUkVDRUlWRUQgPSAweDcyZSwKKyAgRVZFTlRTX0RTX0dQUlNfU01HTU1fTVNHX1NFTlQgPSAweDcyZiwKKyAgRVZFTlRTX0RTX0dQUlNfTExDX1JFQURZX1RJTUVSX1NUQVJUID0gMHg3MzAsCisgIEVWRU5UU19EU19HUFJTX0xMQ19SRUFEWV9USU1FUl9FTkQgPSAweDczMSwKKyAgRVZFTlRTX0RTX1BBQ0tFVF9USU1FU0xPVF9SRUNPTkZJR1VSRSA9IDB4NzMyLAorICBFVkVOVFNfRFNfR1BSU19NQUNfTVNHX1JFQ0VJVkVEID0gMHg3MzMsCisgIEVWRU5UU19EU19HUFJTX01BQ19NU0dfU0VOVCA9IDB4NzM0LAorICBFVkVOVFNfRFNfR1BSU19NQUNfQ0FNUEVEX09OX0NFTEwgPSAweDczNSwKKyAgRVZFTlRTX0RTX0dQUlNfQ0VMTF9DSEFOR0VfRkFJTFVSRSA9IDB4NzM2LAorICBFVkVOVFNfRFNfR1BSU19QQUNLRVRfQ0hBTk5FTF9SRVFVRVNUID0gMHg3MzcsCisgIEVWRU5UU19EU19HUFJTX1BBQ0tFVF9VUExJTktfQVNTSUdOTUVOVCA9IDB4NzM4LAorICBFVkVOVFNfRFNfR1BSU19QQUNLRVRfRE9XTkxJTktfQVNTSUdOTUVOVCA9IDB4NzM5LAorICBFVkVOVFNfRFNfR1BSU19UQkZfUkVMRUFTRSA9IDB4NzNhLAorICBFVkVOVFNfRFNfR1BSU19USU1FUl9FWFBJUlkgPSAweDczYiwKKyAgRVZFTlRTX0RTX0dQUlNfUEFDS0VUX1JFU09VUkNFX1JFUVVFU1QgPSAweDczYywKKyAgRVZFTlRTX0RTX1JBTkRPTV9BQ0NFU1NfUkVRVUVTVCA9IDB4NzNkLAorICBFVkVOVFNfRFNfR1NNX0hBTkRPVkVSX1NUQVJUID0gMHg3M2UsCisgIEVWRU5UU19EU19HU01fSEFORE9WRVJfRU5EID0gMHg3M2YsCisgIEVWRU5UU19EU19HU01fUkVTRUxFQ1RfU1RBUlQgPSAweDc0MCwKKyAgRVZFTlRTX0RTX0dTTV9SRVNFTEVDVF9FTkQgPSAweDc0MSwKKyAgRVZFTlRTX0RTX0dTTV9UT19XQ0RNQV9SRVNFTEVDVF9FTkQgPSAweDc0MiwKKyAgRVZFTlRTX0RTX0dTTV9NRVNTQUdFX1JFQ0VJVkVEID0gMHg3NDMsCisgIEVWRU5UU19EU19HU01fUlJfSU5fU0VSVklDRSA9IDB4NzQ0LAorICBFVkVOVFNfRFNfR1NNX1JSX09VVF9PRl9TRVJWSUNFID0gMHg3NDUsCisgIEVWRU5UU19EU19HU01fUEFHRV9SRUNFSVZFRCA9IDB4NzQ2LAorICBFVkVOVFNfRFNfR1NNX0NBTVBfQVRURU1QVF9TVEFSVCA9IDB4NzQ3LAorICBFVkVOVFNfRFNfR1NNX0NBTVBfQVRURU1QVF9FTkQgPSAweDc0OCwKKyAgRVZFTlRTX0RTX0dTTV9DQUxMX0RST1AgPSAweDc0OSwKKyAgRVZFTlRTX0RTX0dTTV9BQ0NFU1NfRkFJTFVSRSA9IDB4NzRhLAorICBFVkVOVFNfRFNfR1NNX0NFTExfU0VMRUNUSU9OX1NUQVJUID0gMHg3NGIsCisgIEVWRU5UU19EU19HU01fQ0VMTF9TRUxFQ1RJT05fRU5EID0gMHg3NGMsCisgIEVWRU5UU19EU19HU01fUE9XRVJfU0NBTl9TVEFUVVMgPSAweDc0ZCwKKyAgRVZFTlRTX0RTX0dTTV9QTE1OX0xJU1RfU1RBUlQgPSAweDc0ZSwKKyAgRVZFTlRTX0RTX0dTTV9QTE1OX0xJU1RfRU5EID0gMHg3NGYsCisgIEVWRU5UU19EU19HU01fQU1SX01VTFRJUkFURV9JRSA9IDB4NzUwLAorICBFVkVOVFNfRFNfR1BSU19MSU5LX0ZBSUxVUkUgPSAweDc1MSwKKyAgRVZFTlRTX0RTX0dQUlNfUEFHRV9SRUNFSVZFRCA9IDB4NzUyLAorICBFVkVOVFNfRFNfR1BSU19TVVJST1VORF9TRUFSQ0hfU1RBUlQgPSAweDc1MywKKyAgRVZFTlRTX0RTX0dQUlNfU1VSUk9VTkRfU0VBUkNIX0VORCA9IDB4NzU0LAorICBFVkVOVFNfRFNfR1BSU19FQVJMWV9DQU1QSU5HID0gMHg3NTUsCisgIEVWRU5UU19EU19HU01fTElOS19GQUlMVVJFID0gMHg3NTYsCisKKworICBFVkVOVF9NVFBfRklMRV9ERUxFVEVEID0gMHg3NTcsCisgIEVWRU5UX01UUF9QTEFZTElTVF9SRU1PVkVEX09CSkVDVCA9IDB4NzU4LAorICBFVkVOVF9NVFBfU1lOQ19TVEFSVEVEID0gMHg3NTksCisgIEVWRU5UX01UUF9TWU5DX0ZJTklTSEVEID0gMHg3NWEsCisgIEVWRU5UX01UUF9TQVZFX0FMQlVNQVJUX1NUQVJURUQgPSAweDc1YiwKKyAgRVZFTlRfTVRQX1NBVkVfQUxCVU1BUlRfRklOSVNIRUQgPSAweDc1YywKKyAgRVZFTlRfTVRQX0ZPUk1BVF9TVE9SRV9TVEFSVEVEID0gMHg3NWQsCisgIEVWRU5UX01UUF9GT1JNQVRfU1RPUkVfRE9ORSA9IDB4NzVlLAorICBFVkVOVF9NVFBfRk9STUFUX1NUT1JFX0VSUk9SID0gMHg3NWYsCisgIEVWRU5UX0xURV9SUkNfU0VDVVJJVFlfQ09ORklHID0gMHg3NjAsCisgIEVWRU5UX0xURV9SUkNfSVJBVF9SRVNFTF9GUk9NX0VVVFJBTl9TVEFSVCA9IDB4NzYxLAorICBFVkVOVF9MVEVfUlJDX0lSQVRfUkVTRUxfRlJPTV9FVVRSQU5fRU5EID0gMHg3NjIsCisgIEVWRU5UX1NOU19SRVNUX0RFVEVDVF9BQ0NFTF9BQ1RJVkVfVFMgPSAweDc2MywKKyAgRVZFTlRfU05TX1JFU1RfREVURUNUX0FDQ0VMX1NUT1BfVFMgPSAweDc2NCwKKyAgRVZFTlRfQ1BDX0NPTkZJR19BQ1RJT04gPSAweDc2NSwKKyAgRVZFTlRfRkRQQ0hfQ09ORklHX0FDVElPTiA9IDB4NzY2LAorICBFVkVOVF9TTlNfRFJWX01PVElPTl9ERVRFQ1RfU0lHID0gMHg3NjcsCisgIEVWRU5UX1NOU19EUlZfT1BNT0RFX0NIQU5HRSA9IDB4NzY4LAorCisgIEVWRU5UX05FWFRfVU5VU0VEX0VWRU5ULAorICBFVkVOVF9SU1ZEX1NUQVJUID0gMHgwODAwLAorICBFVkVOVF9SU1ZEX0VORCAgID0gMHgwODNGLAorICBFVkVOVF9MQVNUX0lEICAgID0gMHgwODNGLAorCisgIEVWRU5UX01BWF9JRCAgICAgPSAweDBGRkYKK30gZXZlbnRfaWRfZW51bV90eXBlOworCisKKyNlbmRpZiAvKiBFVkVOVF9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9pbmMvaV92b3NfZGlhZ19jb3JlX2V2ZW50LmggYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX2RpYWdfY29yZV9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwODU1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX2RpYWdfY29yZV9ldmVudC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fSV9WT1NfRElBR19DT1JFX0VWRU5UX0ggKQorI2RlZmluZSBfX0lfVk9TX0RJQUdfQ09SRV9FVkVOVF9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBpX3Zvc19kaWFnX2NvcmVfZXZlbnQuaAorICAKKyAgXGJyaWVmIEFuZHJvaWQgc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIHZPU1MgRElBRyBldmVudHMKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKyNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCisjaW5jbHVkZSA8ZXZlbnRfZGVmcy5oPgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKwordm9pZCB2b3NfZXZlbnRfcmVwb3J0X3BheWxvYWQodl9VMTZfdCBldmVudF9JZCwgdl9VMTZfdCBsZW5ndGgsIHZfVk9JRF90ICpwUGF5bG9hZCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBBbGxvY2F0ZSBhbiBldmVudCBwYXlsb2FkIGhvbGRlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYoIHBheWxvYWRfbmFtZSwgcGF5bG9hZF90eXBlICkgXAorICAgICAgICAgICBwYXlsb2FkX3R5cGUocGF5bG9hZF9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUmVwb3J0IHRoZSBldmVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0xBTl9WT1NfRElBR19FVkVOVF9SRVBPUlQoIHBheWxvYWRfcHRyLCBldl9pZCApIFwKKyAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB2b3NfZXZlbnRfcmVwb3J0X3BheWxvYWQoIGV2X2lkLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggKihwYXlsb2FkX3B0cikgKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBheWxvYWRfcHRyKSApOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9IHdoaWxlICgwKQorCisjZWxzZSAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCisKKyNkZWZpbmUgV0xBTl9WT1NfRElBR19FVkVOVF9ERUYoIHBheWxvYWRfbmFtZSwgcGF5bG9hZF90eXBlICkgCisjZGVmaW5lIFdMQU5fVk9TX0RJQUdfRVZFTlRfUkVQT1JUKCBwYXlsb2FkX3B0ciwgZXZfaWQgKSAKKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvLyBfX0lfVk9TX0RJQUdfQ09SRV9FVkVOVF9ICmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL2lfdm9zX2RpYWdfY29yZV9sb2cuaCBiL0NPUkUvVk9TUy9pbmMvaV92b3NfZGlhZ19jb3JlX2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYWM0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX2RpYWdfY29yZV9sb2cuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19JX1ZPU19ESUFHX0NPUkVfTE9HX0ggKQorI2RlZmluZSBfX0lfVk9TX0RJQUdfQ09SRV9MT0dfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgaV92b3NfZGlhZ19jb3JlX2V2ZW50LmgKKyAgCisgIFxicmllZiBhbmRyb2lkLXNwZWNpZmljIGRlZmluaXRpb25zIGZvciB2T1NTIERJQUcgbG9ncworICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHZvc190eXBlcy5oPgorI2luY2x1ZGUgPHZvc19tZW1vcnkuaD4KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKKyNpbmNsdWRlIDxsb2dfY29kZXMuaD4KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy9GSVhNRSBUbyBiZSByZW1vdmVkIHdoZW4gRElBRyBzdXBwb3J0IGlzIGFkZGVkLiBUaGlzIGRlZmluaXRvbiBzaG91bGQgYmUKKy8vcGlja2VkIGZyb20gbG9nLmggZmlsZSBhYm92ZS4gCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBTcGVjaWZpZXMgdGhlIGxlbmd0aCwgaW4gYnl0ZXMgb2YgdGhlIGVudHJ5LCBpbmNsdWRpbmcgdGhpcyBoZWFkZXIuICovCisgICAgdl9VMTZfdCBsZW47CisgIAorICAvKiBTcGVjaWZpZXMgdGhlIGxvZyBjb2RlIGZvciB0aGUgZW50cnkqLworICAgIHZfVTE2X3QgY29kZTsgCisKKyAgLypUaW1lIFN0YW1wIGxvKi8KKyAgICB2X1UzMl90IHRzX2xvOworICAKKyAgIC8qVGltZSBTdGFtcCBoaSovCisgICAgdl9VMzJfdCB0c19oaTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBsb2dfaGRyX3R5cGU7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVAordm9pZCB2b3NfbG9nX3NldF9jb2RlICh2X1ZPSURfdCAqcHRyLCB2X1UxNl90IGNvZGUpOwordm9pZCB2b3NfbG9nX3NldF9sZW5ndGggKHZfVk9JRF90ICpwdHIsIHZfVTE2X3QgbGVuZ3RoKTsKK3ZvaWQgdm9zX2xvZ19zZXRfdGltZXN0YW1wICh2X1ZPSURfdCAqcGxvZ19oZHJfcHRyKTsKK3ZvaWQgdm9zX2xvZ19zdWJtaXQodl9WT0lEX3QgKnBsb2dfaGRyX3B0cik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEFsbG9jYXRlIGFuIGV2ZW50IHBheWxvYWQgaG9sZGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFdMQU5fVk9TX0RJQUdfTE9HX0FMTE9DKCBwYXlsb2FkX3B0ciwgcGF5bG9hZF90eXBlLCBsb2dfY29kZSApIFwKKyAgICAgICAgICAgZG8gXAorICAgICAgICAgICB7ICBcCisgICAgICAgICAgICAgIHBheWxvYWRfcHRyID0gKCBwYXlsb2FkX3R5cGUgKil2b3NfbWVtX21hbGxvYyhzaXplb2YocGF5bG9hZF90eXBlKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBpZiggcGF5bG9hZF9wdHIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHZvc19tZW1femVybyhwYXlsb2FkX3B0ciwgc2l6ZW9mKHBheWxvYWRfdHlwZSkpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICB2b3NfbG9nX3NldF9jb2RlKHBheWxvYWRfcHRyLCBsb2dfY29kZSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgdm9zX2xvZ19zZXRfbGVuZ3RoKHBheWxvYWRfcHRyLCBzaXplb2YocGF5bG9hZF90eXBlKSk7ICAgICAgICBcCisgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB9IHdoaWxlICgwKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBSZXBvcnQgdGhlIGV2ZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXTEFOX1ZPU19ESUFHX0xPR19SRVBPUlQoIHBheWxvYWRfcHRyICkgXAorICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmKCBwYXlsb2FkX3B0cikgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdm9zX2xvZ19zdWJtaXQoIHBheWxvYWRfcHRyKTsgIFwKKyAgICAgICAgICB2b3NfbWVtX2ZyZWUocGF5bG9hZF9wdHIpOyBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisgICAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBGcmVlIHRoZSBwYXlsb2FkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXTEFOX1ZPU19ESUFHX0xPR19GUkVFKCBwYXlsb2FkX3B0ciApIFwKKyAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBpZiggcGF5bG9hZF9wdHIpICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHZvc19tZW1fZnJlZShwYXlsb2FkX3B0cik7IFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKyAgICAKKworI2Vsc2UgLyogRkVBVFVSRV9XTEFOX0RJQUdfU1VQUE9SVCAqLworCisjZGVmaW5lIFdMQU5fVk9TX0RJQUdfTE9HX0FMTE9DKCBwYXlsb2FkX3B0ciwgcGF5bG9hZF90eXBlLCBsb2dfY29kZSApIAorI2RlZmluZSBXTEFOX1ZPU19ESUFHX0xPR19SRVBPUlQoIHBheWxvYWRfcHRyICkgCisjZGVmaW5lIFdMQU5fVk9TX0RJQUdfTE9HX0ZSRUUoIHBheWxvYWRfcHRyICkKKworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvLyBfX0lfVk9TX0RJQUdfQ09SRV9MT0dfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy9pX3Zvc19ldmVudC5oIGIvQ09SRS9WT1NTL2luYy9pX3Zvc19ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MWQ0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX2V2ZW50LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19JX1ZPU19FVkVOVF9IICkKKyNkZWZpbmUgX19JX1ZPU19FVkVOVF9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBcZmlsZSAgaV92b3NfZXZlbnQuaAorCisgIFxicmllZiBMaW51eC1zcGVjaWZpYyBkZWZpbml0aW9ucyBmb3Igdk9TUyBFdmVudHMKKworICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHZvc190eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBMSU5VWF9FVkVOVF9DT09LSUUgMHgxMjM0MTIzNAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IGV2dAoreworICAgc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CisgICB2X1UzMl90ICBjb29raWU7Cit9IHZvc19ldmVudF90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8vIF9fSV9WT1NfRVZFTlRfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy9pX3Zvc19saXN0LmggYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDNkMzIzCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy9pX3Zvc19saXN0LmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19JX1ZPU19MSVNUX0ggKQorI2RlZmluZSBfX0lfVk9TX0xJU1RfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgaV92b3NfbGlzdC5oCisgIAorICBcYnJpZWYgTGludXgtc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIHZPU1MgbGlzdHMgCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8dm9zX3R5cGVzLmg+CisjaW5jbHVkZSA8dm9zX3N0YXR1cy5oPgorI2luY2x1ZGUgPHZvc19wYWNrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHZvc19saW51eF9saXN0X3MKK3sKKyAgIHN0cnVjdCBsaXN0X2hlYWQgYW5jaG9yOworICAgdl9TSVpFX3QgY291bnQ7CisgICBzdHJ1Y3QgbXV0ZXggbG9jazsKKyAgIHZfVTMyX3QgY29va2llOworfSB2b3NfbGlzdF90OworCit0eXBlZGVmIHN0cnVjdCBsaXN0X2hlYWQgdm9zX2xpc3Rfbm9kZV90OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvLyBfX0lfVk9TX0xJU1RfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy9pX3Zvc19sb2NrLmggYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTk2YzNjCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy9pX3Zvc19sb2NrLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19JX1ZPU19MT0NLX0ggKQorI2RlZmluZSBfX0lfVk9TX0xPQ0tfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgaV92b3NfbG9jay5oCisgIAorICBcYnJpZWYgTGludXgtc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIHZPU1MgTG9ja3MKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHZvc19sb2NrX3MKK3sKKyAgIHN0cnVjdCBtdXRleCBtX2xvY2s7CisgICB2X1UzMl90IGNvb2tpZTsKKyAgIGludCBwcm9jZXNzSUQ7CisgICB2X1UzMl90IHN0YXRlOworICAgdl9VOF90ICByZWZjb3VudDsKK30gdm9zX2xvY2tfdDsKKwordHlwZWRlZiBzcGlubG9ja190IHZvc19zcGluX2xvY2tfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLy8gX19JX1ZPU19MT0NLX0gKZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9pbmMvaV92b3NfcGFja2V0LmggYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MjUxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX3BhY2tldC5oCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX0lfVk9TX1BBQ0tFVF9IICkKKyNkZWZpbmUgX19JX1ZPU19QQUNLRVRfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgXGZpbGUgICAgICAgIGlfdm9zX3BhY2tldC5oCisKKyAgXGJyaWVmICAgICAgIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWVzICh2T1NTKQorCisgICBOZXR3b3JrIFByb3RvY29sIHBhY2tldC9idWZmZXIgaW50ZXJuYWwgaW5jbHVkZSBmaWxlCisKKyAgIENvcHlyaWdodCAyMDA5IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKyNpbmNsdWRlIDx2b3NfbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgPHdsYW5fcWN0X3BhbF9wYWNrZXQuaD4KKyNpbmNsdWRlIDx3bGFuX3FjdF93ZGlfZHMuaD4KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vIERlZmluaXRpb25zIGZvciB0aGUgdmFyaW91cyBWT1MgcGFja2V0IHBvb2xzLiAgRm9sbG93aW5nIGFyZSBkZWZpbmVzCisvLyBmb3IgdGhlIFNJWkUgYW5kIHRoZSBOVU1CRVIgb2Ygdm9zIHBhY2tldHMgaW4gdGhlIHZvcyBwYWNrZXQgcG9vbHMuCisvLyBOb3RlIHRoYXQgYWxsIG9mIHRoZSBjb2RlIGlzIHdyaXR0ZW4gdG8gYWxsb2NhdGUgYW5kIG1hbmFnZSB0aGUgdm9zCisvLyBwYWNrZXQgcG9vbHMgYmFzZWQgb24gdGhlc2UgI2RlZmluZXMgb25seS4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0bworLy8gY2hhbmdlIHRoZSBudW1iZXIgb2YgUlhfUkFXIHBhY2tldHMsIHNpbXBseSBjaGFuZ2UgdGhlICNkZWZpbmUgdGhhdAorLy8gZGVmaW5lcyB0aGUgbnVtYmVyIG9mIFJYX1JBVyBwYWNrZXRzIGFuZCByZWJ1aWxkIFZPU1MuCisKKy8vIHRoZSBudW1iZXIgb2YgUmVjZWl2ZSB2b3MgcGFja2V0cyB1c2VkIGV4Y2x1c2l2ZWx5IGZvciB2b3MgcGFja2V0CisvLyBhbGxvY2F0aW9ucyBvZiB0eXBlIFZPU19QS1RfVFlQRV9SWF9SQVcKKyNkZWZpbmUgVlBLVF9OVU1fUlhfUkFXX1BBQ0tFVFMgKCAgNTEyICkKKworLy8gdGhlIG51bWJlciBvZiBUcmFuc21pdCBNYW5hZ2VtZW50IHZvcyBwYWNrZXRzLCB1c2VkIGV4Y2x1c2l2ZWx5IGZvcgorLy8gdm9zIHBhY2tldCBhbGxvY2F0aW9ucyBvZiB0eXBlIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVAorI2RlZmluZSBWUEtUX05VTV9UWF9NR01UX1BBQ0tFVFMgKCAgNiApCisKKy8vIHRoZSBudW1iZXIgb2YgVHJhbnNtaXQgRGF0YSB2b3MgcGFja2V0cywgdXNlZCBleGNsdXNpdmVseSBmb3IKKy8vIHZvcyBwYWNrZXQgYWxsb2NhdGlvbnMgb2YgdHlwZSBWT1NfUEtUX1RZUEVfVFhfODAyXzNfREFUQSBvcgorLy8gVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9EQVRBCisjZGVmaW5lIFZQS1RfTlVNX1RYX0RBVEFfUEFDS0VUUyAoIDEyOCApCisKKy8vIHRoZSBudW1iZXIgb2YgVk9TIFBhY2tldHMgd2UgbmVlZC4gIFRoaXMgaXMgdGhlIG1lbW9yeSB3ZSBuZWVkIHRvCisvLyBhbGxvY2F0ZSBmb3IgdGhlIHZvcyBQYWNrZXQgc3RydWN0dXJlcyB0aGVtc2VsdmVzLiAgV2UgbmVlZCB2b3MKKy8vIHBhY2tldCBzdHJ1Y3R1cmVzIGZvciBhbGwgb2YgdGhlIHBhY2tldCB0eXBlcyAoUlhfUkFXLCBUWF9NR01ULCBhbmQKKy8vIFRYX0RBVEEpLgorI2RlZmluZSBWUEtUX05VTV9WT1NfUEtUX0JVRkZFUlMgXAorICAgICAgICAgICAgICAgICggVlBLVF9OVU1fUlhfUkFXX1BBQ0tFVFMgXAorICAgICAgICAgICAgICAgICsgVlBLVF9OVU1fVFhfTUdNVF9QQUNLRVRTIFwKKyAgICAgICAgICAgICAgICArIFZQS1RfTlVNX1RYX0RBVEFfUEFDS0VUUyApCisKKy8vIHRoZSBudW1iZXIgb2YgUmVjZWl2ZSB2b3MgcGFja2V0cyB0aGF0IHdlIGFjY3VtdWxhdGUgaW4gdGhlCisvLyByZXBsZW5pc2ggcG9vbCBiZWZvcmUgd2UgYXR0ZW1wdCB0byByZXBsZW5pc2ggdGhlbQorI2RlZmluZSBWUEtUX1JYX1JFUExFTklTSF9USFJFU0hPTEQgKCAgVlBLVF9OVU1fUlhfUkFXX1BBQ0tFVFMgPj4gMiApCisKKy8vIG1hZ2ljIG51bWJlciB3aGljaCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIHN0cnVjdHVyZSBwb2ludGVyIGJlaW5nCisvLyBkZXJlZmVyZW5jZWQgaXMgcmVhbGx5IHJlZmVyZW5jaW5nIGEgc3RydWN0IHZvc19wa3RfdAorI2RlZmluZSBWUEtUX01BR0lDX05VTUJFUiAweDU2NTA0QjU0ICAvKiBWUEtUIGluIEFTQ0lJICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKy8vLyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyB2b3MgcGFja2V0IHR5cGUKK3N0cnVjdCB2b3NfcGt0X3QKK3sKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKworICAgLy9wYWxQYWNrZXQgTVVTVCBiZSB0aGUgZmlyc3QgbWVtYmVyIG9mIHZvc19wa3RfdAorICAgd3B0X3BhY2tldCBwYWxQYWNrZXQ7CisjZW5kaWYKKworICAgLy8gTm9kZSBmb3IgbGlua2luZyB2b3MgcGFja2V0cyBpbnRvIGEgZnJlZSBsaXN0CisgICBzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisKKyAgIC8vIE5vZGUgZm9yIGNoYWluaW5nIHZvcyBwYWNrZXRzIGludG8gYSBwYWNrZXQgY2hhaW4KKyAgIHN0cnVjdCB2b3NfcGt0X3QgKnBOZXh0OworCisgICAvLyBwb2ludGVyIHRvIGFuIE9TIHNwZWNpZmljIHBhY2tldCBkZXNjcmlwdG9yCisgICBzdHJ1Y3Qgc2tfYnVmZiAqcFNrYjsKKworICAgLy8gcGFja2V0IHR5cGUKKyAgIFZPU19QS1RfVFlQRSBwYWNrZXRUeXBlOworCisgICAvLyB0aW1lc3RhbXAKKyAgIHZfVElNRV90IHRpbWVzdGFtcDsKKworICAgLy8gdXNlciBkYXRhIHBvaW50ZXJzCisgICB2X1ZPSURfdCAqcHZVc2VyRGF0YVsgVk9TX1BLVF9VU0VSX0RBVEFfSURfTUFYIF07CisKKyAgIC8vIG1hZ2ljIG51bWJlciBmb3IgdmVyaWZ5aW5nIHRoaXMgaXMgcmVhbGx5IGEgc3RydWN0IHZvc19wa3RfdAorICAgdl9VMzJfdCBtYWdpYzsKK307CisKKworLy8gUGFyYW1ldGVycyBmcm9tIHRoZSB2b3NfcGt0X2dldF9wYWNrZXQoKSBjYWxsIHRoYXQgbmVlZHMKKy8vIHRvIGJlIHNhdmVkIGluICdsb3cgcmVzb3VyY2UnIGNvbmRpdGlvbnMuICBXZSBuZWVkIGFsbCB0aGUKKy8vIHBhcmFtZXRlcnMgZnJvbSB0aGUgb3JpZ2luYWwgY2FsbCB0byB2b3NfcGt0X2dldF9wYWNrZXQoKQorLy8gdG8gcmVzb2x2ZSB0aGUgcGFja2V0IHJlcXVlc3Qgd2hlbiBvbmUgYmVjb21lIGF2YWlsYWJsZS4KK3R5cGVkZWYgc3RydWN0Cit7CisgICB2b3NfcGt0X2dldF9wYWNrZXRfY2FsbGJhY2sgY2FsbGJhY2s7CisKKyAgIHZfVk9JRF90ICp1c2VyRGF0YTsKKworICAgdl9TSVpFX3QgZGF0YVNpemU7CisgICB2X1NJWkVfdCBudW1QYWNrZXRzOworICAgdl9CT09MX3QgemVyb0J1ZmZlcjsKKworfSB2b3NfcGt0X2xvd19yZXNvdXJjZV9pbmZvOworCisKKworLy8gdk9TUyBQYWNrZXQgQ29udGV4dCAtIGFsbCBjb250ZXh0IC8gaW50ZXJuYWwgZGF0YSBuZWVkZWQgZm9yIHRoZQorLy8gdk9TUyBwUGFja2V0IG1vZHVsZS4gIFRoaXMgY29uc2lzdGUgb2Y6CisvLyAtIG1lbW9yeSBmb3IgdGhlIHZvcyBQYWNrZXQgc3RydWN0dXJlcworLy8gLSBtZW1vcnkgZm9yIHRoZSB2b3MgUGFja2V0IEhlYWQgLyBUYWlsIGJ1ZmZlcnMKKy8vIC0gbWVtb3J5IGZvciB0aGUgUnggUmF3IGRhdGEgYnVmZmVycworLy8gLSBtZW1vcnkgZm9yIHRoZSBUeCBNZ210IGRhdGEgYnVmZmVycy4KK3R5cGVkZWYgc3RydWN0IHZvc19wa3RfY29udGV4dF9zCit7CisgICAvLyBwbGFjZSB0byBzYXZlIHRoZSB2b3MgQ29udGV4dAorICAgdl9DT05URVhUX3Qgdm9zQ29udGV4dDsKKworICAgLy8gdGhlIG1lbW9yeSBmb3IgdGhlIHZvcyBQYWNrZXQgc3RydWN0dXJlcy4uLi4KKyAgIHN0cnVjdCB2b3NfcGt0X3Qgdm9zUGt0QnVmZmVyc1sgVlBLVF9OVU1fVk9TX1BLVF9CVUZGRVJTIF07CisKKyAgIC8vIFRoZXNlIGFyZSB0aGUgbGlzdHMgdG8ga2VlcCB0aGUgY29uc3RydWN0ZWQgVk9TIHBhY2tldHMgdGhhdCBhcmUKKyAgIC8vIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4gIFRoZXJlIGFyZSBzZXBhcmF0ZSBmcmVlIHZvcyBwYWNrZXQKKyAgIC8vIHBvb2xzIGZvciBSWF9SQVcgd2l0aG91dCBhdHRhY2hlZCBza2IsIFJYX1JBVyB3aXRoIGF0dGFjaGVkIHNrYiwKKyAgIC8vIFRYX0RBVEEsIGFuZCBUWF9NR01ULgorICAgc3RydWN0IGxpc3RfaGVhZCByeFJlcGxlbmlzaExpc3Q7CisgICBzdHJ1Y3QgbGlzdF9oZWFkIHJ4UmF3RnJlZUxpc3Q7CisgICBzdHJ1Y3QgbGlzdF9oZWFkIHR4RGF0YUZyZWVMaXN0OworICAgc3RydWN0IGxpc3RfaGVhZCB0eE1nbXRGcmVlTGlzdDsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgIC8vRXhpc3RpbmcgbGlzdF9zaXplIG9wZWFyYXRpb24gdHJhdmVyc2UgdGhlIGxpc3QuIFRvbyBzbG93IGZvciBkYXRhIHBhdGguCisgICAvL0FkZCB0aGUgZmllbGQgdG8gZW5hYmxlIGZhc3RlciBmbG93IGNvbnRyb2wgb24gdHggcGF0aAorICAgdl9VMzJfdCB1Y3R4RGF0YUZyZWVMaXN0Q291bnQ7CisjZW5kaWYKKworICAgLy8gV2Uga2VlcCBhIHNlcGFyYXRlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgUlhfUkFXIHBhY2tldHMKKyAgIC8vIHdhaXRpbmcgdG8gYmUgcmVwbGVuaXNoZWQKKyAgIHZfU0laRV90IHJ4UmVwbGVuaXNoTGlzdENvdW50OworCisgICAvLyBUaGVzZSBhcmUgdGhlIHN0cnVjdHMgdG8ga2VlcCBsb3ctcmVzb3VyY2UgY2FsbGJhY2sgaW5mb3JtYXRpb24uCisgICAvLyBUaGVyZSBhcmUgc2VwYXJhdGUgbG93LXJlc291cmNlIGNhbGxiYWNrIGluZm9ybWF0aW9uIGJsb2NrcyBmb3IKKyAgIC8vIFJYX1JBVywgVFhfREFUQSwgYW5kIFRYX01HTVQuCisgICB2b3NfcGt0X2xvd19yZXNvdXJjZV9pbmZvIHJ4UmF3TG93UmVzb3VyY2VJbmZvOworICAgdm9zX3BrdF9sb3dfcmVzb3VyY2VfaW5mbyB0eERhdGFMb3dSZXNvdXJjZUluZm87CisgICB2b3NfcGt0X2xvd19yZXNvdXJjZV9pbmZvIHR4TWdtdExvd1Jlc291cmNlSW5mbzsgICAKKworICAgc3RydWN0IG11dGV4IG1sb2NrOworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgLypNZXRhIEluZm9ybWF0aW9uIHRvIGJlIHRyYW5zcG9ydGVkIHdpdGggdGhlIHBhY2tldCovCisgICBXRElfRFNfVHhNZXRhSW5mb1R5cGUgdHhNZ210TWV0YUluZm9bVlBLVF9OVU1fVFhfTUdNVF9QQUNLRVRTXTsKKyAgIFdESV9EU19UeE1ldGFJbmZvVHlwZSB0eERhdGFNZXRhSW5mb1tWUEtUX05VTV9UWF9EQVRBX1BBQ0tFVFNdOworICAgV0RJX0RTX1J4TWV0YUluZm9UeXBlIHJ4TWV0YUluZm9bVlBLVF9OVU1fUlhfUkFXX1BBQ0tFVFNdOworI2VuZGlmCisKK30gdm9zX3BrdF9jb250ZXh0X3Q7CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcGFja2V0X29wZW4oKSAtIGluaXRpYWxpemUgdGhlIHZPU1MgUGFja2V0IG1vZHVsZQorCisgIFRoZSBcYSB2b3NfcGFja2V0X29wZW4oKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgdk9TUyBQYWNrZXQKKyAgbW9kdWxlLgorCisgIFxwYXJhbSAgcFZvc0NvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdk9TUyBDb250ZXh0CisKKyAgXHBhcmFtICBwVm9zUGFja2V0Q29udGV4dCAtIHBvaW50ZXIgdG8gYSBwcmV2aW91c2x5IGFsbG9jYXRlZAorICAgICAgICAgIGJ1ZmZlciBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIHZvcyBQYWNrZXQgY29udGV4dC4KKworICBccGFyYW0gIHZvc1BhY2tldENvbnRleHRTaXplIC0gdGhlIHNpemUgYWxsb2NhdGVkIGZvciB0aGUgdm9zCisgICAgICAgICAgcGFja2V0IGNvbnRleHQuCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB2b3MgUGFja2V0IG1vZHVsZSB3YXMgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgaW5pdGlhbGl6ZWQgYW5kIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpCisgICAgICAgICAgYXJlIHVuYXZhaWxhYmxlIHRvIGluaXRpbGl6ZSB0aGUgdm9zIFBhY2tldCBtb2R1bGUKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9OT01FTSAtIGluc3VmZmljaWVudCBtZW1vcnkgZXhpc3RzIHRvIGluaXRpYWxpemUKKyAgICAgICAgICB0aGUgdm9zIHBhY2tldCBtb2R1bGUKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIEludmFsaWQgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgdm9zIG9wZW4KKyAgICAgICAgICBmdW5jdGlvbgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBGYWlsdXJlIHRvIGluaXRpYWxpemUgdGhlIHZvcyBwYWNrZXQKKyAgICAgICAgICBtb2R1bGUKKworICBcc2Egdm9zX3BhY2tldF9jbG9zZSgpCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wYWNrZXRfb3Blbiggdl9WT0lEX3QgKnBWb3NDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfY29udGV4dF90ICpwVm9zUGFja2V0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1NJWkVfdCB2b3NQYWNrZXRDb250ZXh0U2l6ZSApOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wYWNrZXRfY2xvc2UoKSAtIENsb3NlIHRoZSB2T1NTIFBhY2tldCBtb2R1bGUKKworICBUaGUgXGEgdm9zX3BhY2tldF9jbG9zZSgpIGZ1bmN0aW9uIGNsb3NlcyB0aGUgdk9TUyBQYWNrZXQgbW9kdWxlCisgIFVwb24gc3VjY2Vzc2Z1bCBjbG9zZSBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBmcm9tIHRoZSBPUyB3aWxsIGJlCisgIHJlbGlucXVpc2hlZC4KKworICBccGFyYW0gIHBWb3NDb250ZXh0IC0gcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZPU1MgQ29udGV4dAorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gUGFja2V0IG1vZHVsZSB3YXMgc3VjY2Vzc2Z1bGx5IGNsb3NlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIEludmFsaWQgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgcGFja2V0CisgICAgICAgICAgY2xvc2UgZnVuY3Rpb24KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gRmFpbHVyZSB0byBjbG9zZSB0aGUgdm9zIFBhY2tldCBtb2R1bGUKKworICBcc2Egdm9zX3BhY2tldF9vcGVuKCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BhY2tldF9jbG9zZSggdl9QVk9JRF90IHBWb3NDb250ZXh0ICk7CisKKyNlbmRpZiAgLy8gIWRlZmluZWQoIF9fSV9WT1NfUEFDS0VUX0ggKQpkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy9pX3Zvc190aW1lci5oIGIvQ09SRS9WT1NTL2luYy9pX3Zvc190aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODhiZmUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX3RpbWVyLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19JX1ZPU19USU1FUl9IICkKKyNkZWZpbmUgX19JX1ZPU19USU1FUl9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBpX3Zvc190aW1lci5oCisgIAorICBcYnJpZWYgTGludXgtc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIHZPU1MgcGFja2V0cworICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHZvc190aW1lci5oPgorI2luY2x1ZGUgPHZvc190eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3Qgdm9zX3RpbWVyX3BsYXRmb3JtX3MKK3sKKyAgIHN0cnVjdCB0aW1lcl9saXN0IFRpbWVyOworICAgaW50IHRocmVhZElEOyAKKyAgIHZfVTMyX3QgY29va2llOworICAgc3BpbmxvY2tfdCAgc3BpbmxvY2s7CisKK30gdm9zX3RpbWVyX3BsYXRmb3JtX3Q7CisKKy8qCisgKiBUT0RPczogTmVlZCB0byBhZGQgZGVmZXJyZWQgdGltZXIgaW1wbGVtZW50YXRpb24gCisgKgorKi8gCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8vIF9fSV9WT1NfVElNRVJfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy9pX3Zvc190cmFjZS5oIGIvQ09SRS9WT1NTL2luYy9pX3Zvc190cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZDczMDEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX3RyYWNlLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisKKyNpZiAhZGVmaW5lZCggX19JX1ZPU19UUkFDRV9IICkKKyNkZWZpbmUgX19JX1ZPU19UUkFDRV9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBpX3Zvc190cmFjZS5oCisgIAorICBcYnJpZWYgTGludXgtc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIFZPU1MgdHJhY2UKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyBcYnJpZWYgVk9TX1RSQUNFKCkgLyB2b3NfdHJhY2VfbXNnKCkgLSBUcmFjZSAvIGxvZ2dpbmcgQVBJCisgICAKKyBVc2VycyB3aXNoaW5nIHRvIGFkZCB0cmFjaW5nIGluZm9ybWF0aW9uIHRvIHRoZWlyIGNvZGUgc2hvdWxkIHVzZSAKKyBWT1NfVFJBQ0UuICBWT1NfVFJBQ0UoKSB3aWxsIGNvbXBpbGUgaW50byBhIGNhbGwgdG8gdm9zX3RyYWNlX21zZygpIHdoZW4KKyB0cmFjaW5nIGlzIGVuYWJsZWQuCisgIAorIFxwYXJhbSBtb2R1bGUgLSBtb2R1bGUgaWRlbnRpZmllci4gICBBIG1lbWJlciBvZiB0aGUgVk9TX01PRFVMRV9JRAorICAgICAgICAgICAgICAgICBlbnVtZXJhdGlvbiB0aGF0IGlkZW50aWZpZXMgdGhlIG1vZHVsZSBpc3N1aW5nIHRoZSB0cmFjZSBtZXNzYWdlLgorICAgICAgICAgCisgXHBhcmFtIGxldmVsIC0gdHJhY2UgbGV2ZWwuICAgQSBtZW1iZXIgb2YgdGhlIFZPU19UUkFDRV9MRVZFTCAKKyAgICAgICAgICAgICAgICBlbnVtZXJhdGlvbiBpbmRpY2F0aW5nIHRoZSBzZXZlcml0eSBvZiB0aGUgY29uZGl0aW9uIGNhdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgdHJhY2UgbWVzc2FnZSB0byBiZSBpc3N1ZWQuICAgTW9yZSBzZXZlcmUgY29uZGl0aW9ucyBhcmUgbW9yZSAKKyAgICAgICAgICAgICAgICBsaWtlbHkgdG8gYmUgbG9nZ2VkLgorICAgICAgICAgCisgICBccGFyYW0gc3RyRm9ybWF0IC0gZm9ybWF0IHN0cmluZy4gIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC4gIFRoaXMgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5zIHByaW50Zi1saWtlIHJlcGxhY2VtZW50IHBhcmFtZXRlcnMsIHdoaWNoIGZvbGxvdworICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGluIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgCisgIAorICAgXHJldHVybiAgbm90aGluZworICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHZvc190cmFjZV9tc2coIFZPU19NT0RVTEVfSUQgbW9kdWxlLCBWT1NfVFJBQ0VfTEVWRUwgbGV2ZWwsIGNoYXIgKnN0ckZvcm1hdCwgLi4uICk7CisKK3ZvaWQgdm9zX3RyYWNlX2Rpc3BsYXkodm9pZCk7CisKK3ZvaWQgdm9zX3RyYWNlX3NldFZhbHVlKCBWT1NfTU9EVUxFX0lEIG1vZHVsZSwgVk9TX1RSQUNFX0xFVkVMIGxldmVsLCB2X1U4X3Qgb24gKTsKKworCisvLyBWT1NfVFJBQ0UgaXMgdGhlIG1hY3JvIGludm9rZWQgdG8gYWRkIHRyYWNlIG1lc3NhZ2VzIHRvIGNvZGUuICBTZWUgdGhlIAorLy8gZG9jdW1lbmF0aW9uIGZvciB2b3NfdHJhY2VfbXNnKCkgZm9yIHRoZSBwYXJhbWV0ZXJzIGV0Yy4gZm9yIHRoaXMgZnVuY3Rpb24uCisvLyAKKy8vIE5PVEU6ICBDb2RlIFZPU19UUkFDRSgpIG1hY3JvcyBpbnRvIHRoZSBzb3VyY2UgY29kZS4gIERvIG5vdCBjb2RlIGRpcmVjdGx5CisvLyB0byB0aGUgdm9zX3RyYWNlX21zZygpIGZ1bmN0aW9uLgorLy8KKy8vIE5PVEUgMjogIHZvcyB0cmFjaW5nIGlzIHRvdGFsbHkgdHVybmVkIG9mZiBpZiBXTEFOX0RFQlVHIGlzICpub3QqIGRlZmluZWQuCisvLyBUaGlzIGFsbG93cyB1cyB0byBidWlsZCAncGVyZm9ybWFuY2UnIGJ1aWxkcyB3aGVyZSB3ZSBjYW4gbWVhc3VyZSBwZXJmb3JtYW5jZQorLy8gd2l0aG91dCBiZWluZyBib2dnZWQgZG93biBieSBhbGwgdGhlIHRyYWNpbmcgaW4gdGhlIGNvZGUuCisjaWYgZGVmaW5lZCggV0xBTl9ERUJVRyApCisjZGVmaW5lIFZPU19UUkFDRSB2b3NfdHJhY2VfbXNnCisjZWxzZQorI2RlZmluZSBWT1NfVFJBQ0UoYXJnLi4uKSAKKyNlbmRpZgorCisKK3ZvaWQgdm9zX3NucHJpbnRmKGNoYXIgKnN0ckJ1ZmZlciwgdW5zaWduZWQgIGludCBzaXplLCBjaGFyICpzdHJGb3JtYXQsIC4uLik7CisjZGVmaW5lIFZPU19TTlBSSU5URiB2b3Nfc25wcmludGYKKworI2lmZGVmIFZPU19FTkFCTEVfVFJBQ0lORworCisKKyNkZWZpbmUgVk9TX0FTU0VSVCggX2NvbmRpdGlvbiApICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpZiAoICEgKCBfY29uZGl0aW9uICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHByaW50ayhLRVJOX0NSSVQgIlZPUyBBU1NFUlQgaW4gJXMgTGluZSAlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKyAgIFdBUk5fT04oMSk7IFwKK30KKworI2Vsc2UgCisKKworICAvLyBUaGlzIGNvZGUgd2lsbCBiZSB1c2VkIGZvciBjb21waWxhdGlvbiBpZiB0cmFjaW5nIGlzIHRvIGJlIGNvbXBpbGVkIG91dAorICAvLyBvZiB0aGUgY29kZSBzbyB0aGVzZSBmdW5jdGlvbnMvbWFjcm9zIGFyZSAnZG8gbm90aGluZycKKyAgVk9TX0lOTElORV9GTiB2b2lkIHZvc190cmFjZV9tc2coIFZPU19NT0RVTEVfSUQgbW9kdWxlLCAuLi4gKXt9CisgIAorICAjZGVmaW5lIFZPU19BU1NFUlQoIF9jb25kaXRpb24gKQorCisjZW5kaWYKKworI2lmZGVmIFBBTklDX09OX0JVRworCisjZGVmaW5lIFZPU19CVUcoIF9jb25kaXRpb24gKSBcCitpZiAoICEgKCBfY29uZGl0aW9uICkgKSAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBwcmludGsoS0VSTl9DUklUICJWT1MgQlVHIGluICVzIExpbmUgJWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCisgICBCVUdfT04oMSk7IFwKK30KKworI2Vsc2UKKworI2RlZmluZSBWT1NfQlVHKCBfY29uZGl0aW9uICkgXAoraWYgKCAhICggX2NvbmRpdGlvbiApICkgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcHJpbnRrKEtFUk5fQ1JJVCAiVk9TIEJVRyBpbiAlcyBMaW5lICVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorICAgV0FSTl9PTigxKTsgXAorfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL2lfdm9zX3R5cGVzLmggYi9DT1JFL1ZPU1MvaW5jL2lfdm9zX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzOWI1OAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVk9TUy9pbmMvaV92b3NfdHlwZXMuaApAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19JX1ZPU19UWVBFU19IICkKKyNkZWZpbmUgX19JX1ZPU19UWVBFU19ICisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICBpX3Zvc19UeXBlcy5oCisgIAorICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpZXMgKHZPU1MpIFR5cGVzCisgICAgICAgICAgICAgICAKKyAgIExpbnV4IHNwZWNpZmljIGJhc2ljIHR5cGUgZGVmaW5pdGlvbnMgCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogMS4gR05VIEMvQysrIENvbXBpbGVyCisgKgorICogSG93IHRvIGRldGVjdCBnY2MgOiBfX0dOVUNfXworICogSG93IHRvIGRldGVjdCBnY2MgdmVyc2lvbiA6IAorICogICBtYWpvciB2ZXJzaW9uIDogX19HTlVDX18gKDIgPSAyLngsIDMgPSAzLngsIDQgPSA0LngpCisgKiAgIG1pbm9yIHZlcnNpb24gOiBfX0dOVUNfTUlOT1JfXworICoKKyAqIDIuIE1pY3Jvc29mdCBDL0MrKyBDb21waWxlcgorICoKKyAqIEhvdyB0byBkZXRlY3QgbXNjIDogX01TQ19WRVIKKyAqIEhvdyB0byBkZXRlY3QgbXNjIHZlcnNpb24gOgorICogICBfTVNDX1ZFUiAoMTIwMCA9IE1TVkMgNi4wLCAxMzAwID0gTVNWQyA3LjAsIC4uLikKKyAqCisgKi8KKyAgIAorLy8gTUFDUk9zIHRvIGhlbHAgd2l0aCBjb21waWxlciBhbmQgT1Mgc3BlY2lmaWNzLiAgCisvLyBcbm90ZTogbWF5IG5lZWQgdG8gZ2V0IGEgbGl0dGxlIG1vcmUgc29waGlzdGljYXRlZCB0aGFuIHRoaXMgYW5kIGRlZmluZQorLy8gdGhlc2UgdG8gc3BlY2lmaWMgJ1ZFUlNJT05TJyBvZiB0aGUgY29tcGlsZXIgYW5kIE9TLiAgVW50aWwgd2UgaGF2ZSBhIAorLy8gbmVlZCBmb3IgdGhhdCwgbGV0cyBnbyB3aXRoIHRoaXMuCisjaWYgZGVmaW5lZCggX01TQ19WRVIgKQorCisjZGVmaW5lIFZPU19DT01QSUxFUl9NU0MKKyNkZWZpbmUgVk9TX09TX1dJTk1PQklMRSAgICAvLyBhc3N1bWluZyB0aGF0IGlmIHdlIGJ1aWxkIHdpdGggTVNDLCBPUyBpcyBXaW5Nb2JpbGUKKworI2VsaWYgZGVmaW5lZCggX19HTlVDX18gKQorCisjZGVmaW5lIFZPU19DT01QSUxFUl9HTlVDCisjZGVmaW5lIFZPU19PU19MSU5VWCAgICAgICAvLyBhc3N1bWluZyBpZiBidWlsZGluZyB3aXRoIEdOVUMsIE9TIGlzIExpbnV4CisKKyNlbmRpZgorCisKKy8vIFZPUyBkZWZpbml0aW9ucyAoY29tcGlsZXIgc3BlY2lmaWMpIGZvciBQYWNraW5nIHN0cnVjdHVyZXMuICBOb3RlIHRoYXQgdGhlIAorLy8gV2luZG93cyBjb21waWxlciBkZWZpbmVzIGEgd2F5IHRvIHBhY2sgYSAncmFuZ2UnIG9mIGNvZGUgaW4gYSBmaWxlLiAgVG8gCisvLyBhY2NvbW9kYXRlIHRoaXMsIHdlIGhhdmUgdG8gaW5jbHVkZSBhIGZpbGUgdGhhdCBoYXMgdGhlIHBhY2tpbmcgI3ByYWdtYXMKKy8vIFRoZXNlIGZpbGVzIGFyZSBjYWxsZWQKKy8vIHZvc19wYWNrX3JhbmdlX25fc3RhcnQuaCB3aGVyZSAibiIgaXMgdGhlIHBhY2tpbmcgYWxpZ21lbnQuICBGb3IgZXhhbXBsZSwKKy8vIHZvc19wYWNrX3JhbmdlXzJfc3RhcnQuaCBpcyBpbmNsdWRlZCBpbiB0aGUgZmlsZSB3aGVyZSB5b3Ugd2FudCB0byAKKy8vIHN0YXJ0IHBhY2tpbmcgb24gYSAyIGJ5dGUgYWxpZ25tZW50LiAgdm9zX3BhY2tfcmFuZ2VfZW5kLmggaXMgaW5jbHVkZWQKKy8vIGluIHRoZSBmaWxlIHdoZXJlIHlvdSB3YW50IHRvIHN0b3AgdGhlIHBhY2tpbmcuCisvLworLy8gT3RoZXIgY29tcGlsZXJzIGFsbG93IHBhY2tpbmcgaW5kaXZpZHVhbCBzdHJ1Y3V0cmVzIHNvIHdlIGhhdmUgYSBzZXJpZXMKKy8vIG9mIG1hY3JvcyB0aGF0IGFyZSBhZGRlZCB0byB0aGUgc3RydWN0dXJlIHRvIGRlZmluZSB0aGUgcGFja2luZyBhdHRyaWJ1dGVzLgorLy8gRm9yIGV4YW1wbGUsIFZPU19QQUNLX1NUUlVDVF8yIHdpbGwgYWRkIHRoZSBhdHRyaWJ1dGVzIHRvIHBhY2sgYW4gCisvLyBpbmRpdmlkdWFsIHN0cnVjdHVyZSBvbiBhIDIgYnl0ZSBib3VuZGFyeS4gIAorLy8KKy8vIFNvIHdoYXQgZG9lcyBhIGNvZGVyIGhhdmUgdG8gZG8gdG8gcHJvcGVybHkgcGFjayBhIHN0cnVjdHVyZSBmb3IgYWxsIHRoZQorLy8gc3VwcG9ydGVkIGNvbXBpbGVycz8gIFlvdSBoYXZlIHRvIGFkZCB0d28gaW5jbHVkZXMgYXJvdW5kICphbGwqIHRoZSAKKy8vIHN0cnVjdHVyZXMgeW91IHdhbnQgcGFja2VkIHRoZSBzYW1lIHdheSBhbmQgeW91IGFsc28gaGF2ZSB0byBhZGQgdGhlIAorLy8gVk9TX1BBQ0tfU1RSVUNUX24gbWFjcm9zIHRvIHRoZSBpbmRpdmlkdWFsIHN0cnVjdHVyZXMuICAKKy8vCisvLyBGb3IgZXhhbXBsZSB0byBwcm9wZXJseSBwYWNrIG15U3RydWN0IG9uIGEgMiBieXRlIGJvdW5kYXJ5IGZvciBhbGwgCisvLyB2b3NzIHN1cHBvcnRlZCBjb21waWxlcnMsIHRoZSBmb2xsb3dpbmcgbmVlZHMgY29kZWQuLi4KKy8vCisvLworLy8gI2luY2x1ZGUgPHZvc19wYWNrX3JhbmdlXzJfc3RhcnQuaD4KKy8vCisvLyB0eXBlZGVmIHN0cnVjdAorLy8geworLy8gICB1bnNpZ25lZCBjaGFyIGM7CisvLyAgIGxvbmcgaW50IGk7CisvLyB9IG15U3RydWN0IFZPU19QQUNLX1NUUlVDVF8yOworLy8KKy8vCisvLyBub3RlLi4uIHlvdSBjYW4gaW5jbHVkZSBvdGhlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgaW4gaGVyZSB0aGF0IGhhdmUgdGhlIAorLy8gc2FtZSAyIGJ5dGUgcGFja2luZworLy8KKy8vICNpbmNsdWRlIDx2b3NfcGFja19yYW5nZV9lbmQuaD4KKworCisvLyAvdG9kbzogbm90IHN1cmUgd2hhdCB0aGUgZmxhZyBpcyB0byBpZGVudGlmeSB0aGUgTWljcm9zb2Z0IGNvbXBpbGVyIGZvciBXaW5Nb2JpbGUKKy8vIExldCdzIGxlYXZlIHRoaXMgb3V0IGZvciBub3cgYW5kIGp1c3QgaW5jbHVkZSB0aGUgZGVmaW50aW9ucyBmb3IgV2luTW9iaWxlLiAgTmVlZAorLy8gdG8gYWRkcmVzcyB0aGlzIHdoZW4gd2UgbW92ZSB0byBzdXBwb3J0IG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiAgUHJvYmFibHkgYmVzdCB0bworLy8gZGVmaW5lIHNvbWUgb2Ygb3VyIG93biAndHlwZXMnIG9yIHByZXByb2Nlc3NvciBmbGFncyBsaWtlIFZPU19DT01QSUxFUl9UWVBFLCAKKy8vIFZPU19PU19UWVBFLCBldGMuIGFuZCB0aGVuIGFsbCBvdXIgY29kZSBjYW4gYmFzZSBvbiB0aG9zZSBmbGFncy90eXBlcyBpbmRlcGVuZGVudAorLy8gb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIGNvbXBpbGVyLCBldGMuCisjaWYgZGVmaW5lZCggVk9TX0NPTVBJTEVSX01TQyApCisKKworI2RlZmluZSBWT1NfSU5MSU5FX0ZOICBfX2lubGluZQorCisvLyBkb2VzIG5vdGhpbmcgb24gV2luZG93cy4gIHBhY2tpbmcgaW5kaXZpZHVhbCBzdHJ1Y3RzIGlzIG5vdCAKKy8vIHN1cHBvcnRlZCBvbiB0aGUgV2luZG93cyBjb21waWxlci4KKyNkZWZpbmUgVk9TX1BBQ0tfU1RSVUNUXzEKKyNkZWZpbmUgVk9TX1BBQ0tfU1RSVUNUXzIKKyNkZWZpbmUgVk9TX1BBQ0tfU1RSVUNUXzQKKyNkZWZpbmUgVk9TX1BBQ0tfU1RSVUNUXzgKKyNkZWZpbmUgVk9TX1BBQ0tfU1RSVUNUXzE2CisKKyNlbGlmIGRlZmluZWQoIFZPU19DT01QSUxFUl9HTlVDICkKKworI2RlZmluZSBWT1NfSU5MSU5FX0ZOICBzdGF0aWMgaW5saW5lCisKKyNkZWZpbmUgVk9TX1BBQ0tfU1RSVUNUXzEgIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDEpLCBwYWNrZWQpKQorI2RlZmluZSBWT1NfUEFDS19TVFJVQ1RfMiAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMiksIHBhY2tlZCkpCisjZGVmaW5lIFZPU19QQUNLX1NUUlVDVF80ICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSwgcGFja2VkKSkKKyNkZWZpbmUgVk9TX1BBQ0tfU1RSVUNUXzggIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpLCBwYWNrZWQpKQorI2RlZmluZSBWT1NfUEFDS19TVFJVQ1RfMTYgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpLCBwYWNrZWQpKQorCisjZWxzZQorI2Vycm9yICJDb21waWxpbmcgd2l0aCBhbiB1bmtub3duIGNvbXBpbGVyISEiCisjZW5kaWYKKworIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLy8gdW5zaWduZWQgOC1iaXQgdHlwZXMKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB2X1U4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdl9VQ0hBUl90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHZfQllURV90OworCisvLy8gdW5zaWduZWQgMTYtYml0IHR5cGVzCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHZfVTE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHZfVVNIT1JUX3Q7CisKKy8vLyB1bnNpZ25lZCAzMi1iaXQgdHlwZXMKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdl9VMzJfdDsKKy8vIHR5cGVkZWYgYXRvbWljX3Qgdl9VMzJBVF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB2X1VMT05HX3Q7CisKKy8vLyB1bnNpZ25lZCA2NC1iaXQgdHlwZXMKK3R5cGVkZWYgbG9uZyBsb25nIHZfVTY0X3Q7CisKKy8vLyB1bnNpZ25lZCBpbnRlZ2VyIHR5cGVzCit0eXBlZGVmIHVuc2lnbmVkIGludCAgdl9VSU5UX3Q7CisKKy8vLyBzaWduZWQgOC1iaXQgdHlwZXMKK3R5cGVkZWYgc2lnbmVkIGNoYXIgIHZfUzdfdDsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgIHZfU0NIQVJfdDsKKworLy8vIHNpZ25lZCAxNi1iaXQgdHlwZXMKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHZfUzE1X3Q7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCB2X1NTSE9SVF90OworCisvLy8gc2lnbmVkIDMyLWJpdCB0eXBlcwordHlwZWRlZiBzaWduZWQgbG9uZyB2X1MzMV90OwordHlwZWRlZiBzaWduZWQgbG9uZyB2X1NMT05HX3Q7CisKKy8vLyBzaWduZWQgaW50ZWdlciB0eXBlcwordHlwZWRlZiBzaWduZWQgaW50ICAgdl9TSU5UX3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8vLyBCb29sZWFuIHR5cGVzCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdl9CT09MX3Q7CisKKy8vLyB2b2lkIHR5cGUKKyNkZWZpbmUgdl9WT0lEX3Qgdm9pZAorCisjZW5kaWYgLy8gX19JX1ZPU1NfVFlQRVNfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy9sb2dfY29kZXMuaCBiL0NPUkUvVk9TUy9pbmMvbG9nX2NvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlMmE1OAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVk9TUy9pbmMvbG9nX2NvZGVzLmgKQEAgLTAsMCArMSwyMDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBMT0dfQ09ERVNfSAorI2RlZmluZSBMT0dfQ09ERVNfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgTG9nIENvZGUgRGVmaW5pdGlvbnMKKworR2VuZXJhbCBEZXNjcmlwdGlvbgorICBUaGlzIGZpbGUgY29udGFpbnMgbG9nIGNvZGUgZGVmaW5pdGlvbnMgYW5kIGlzIHNoYXJlZCB3aXRoIHRoZSB0b29scy4KKworQ29weXJpZ2h0IChjKSAxOTkxLTIwMTAgYnkgUVVBTENPTU0sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBETyBOT1QgTU9ESUZZIFRISVMgRklMRSBXSVRIT1VUIFBSSU9SIEFQUFJPVkFMCisqKgorKiogTG9nIGNvZGVzLCBieSBkZXNpZ24sIGFyZSBhIHRpZ2h0bHkgY29udHJvbGxlZCBzZXQgb2YgdmFsdWVzLiAgCisqKiBEZXZlbG9wZXJzIG1heSBub3QgY3JlYXRlIGxvZyBjb2RlcyBhdCB3aWxsLgorKioKKyoqIFJlcXVlc3QgbmV3IGxvZ3MgdXNpbmcgdGhlIGZvbGxvd2luZyBwcm9jZXNzOgorKioKKyoqIDEuIFNlbmQgZW1haWwgdG8gYXN3LmRpYWcucmVxdWVzdCByZXF1ZXN0aW5nIGxvZyBjb2Rhc3NpZ25tZW50cy4KKyoqIDIuIElkZW50aWZ5IHRoZSBsb2cgbmVlZGVkIGJ5IG5hbWUuCisqKiAzLiBQcm92aWRlIGEgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHRoZSBsb2cuCisqKgorKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0IEhpc3RvcnkKKworJEhlYWRlcjogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9zZXJ2aWNlcy9kaWFnL2FwaS9pbmMvbWFpbi9sYXRlc3QvbG9nX2NvZGVzLmgjOSAkCisgICAKK3doZW4gICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgIC0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDcvMzAvMDkgICBkaGFvICAgIENvbnNvbGlkYXRlIGxvZ19jb2Rlc19hcHBzLmgKKzA3LzMwLzA5ICAgZGhhbyAgICBBZGQgTGFzdCBsb2cgY29kZSBkZWZpbml0aW9uIGZvciBFcXVpcCBJRCAxMSAKKzA2LzI2LzA5ICAgZGhhbyAgICBVcGRhdGUgZm9ybWF0IHRoZSBtYWNybworMDYvMjQvMDkgICBzYXIgICAgIFJldmVydGVkIGxhc3QgY2hhbmdlLgorMDYvMjQvMDkgICBzYXIgICAgIEFkZGVkIGxvZyBjb2RlIGZvciBMT0dfTUNfU1RNX0MuCisxMS8wMi8wMSAgIHNmaCAgICAgRmVhdHVyaXplIGNvbW1vbiBOQVMgbG9nIGNvZGVzIGZvciBVTVRTLgorMTAvMzAvMDEgICBzZmggICAgIEFkZGVkIGxvZyBjb2RlIGZvciBMT0dfR1BTX0ZBVFBBVEhfSU5GT19DLgorMTAvMjQvMDEgICBzZmggICAgIEFkZGVkIHVwZGF0ZXMgZm9yIFVNVFMgZXF1aXBtZW50IElEIGFuZCBsb2cgY29kZXMuCiswNi8yNy8wMSAgIGxhZCAgICAgQWRkZWQgbXVsdGlwbGUgZXF1aXBtZW50IElEIHN1cHBvcnQuCiswNS8yMi8wMSAgIHNmaCAgICAgUmVzZXJ2ZWQgbG9nIGNvZGVzIDE1OCAtIDE2OC4KKzA1LzIxLzAxICAgc2ZoICAgICBLZWVwIGNvbmZ1c2luZyBYWFhfQkFTRV9DIG5hbWVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKzA1LzE2LzAxICAgc2ZoICAgICBSZXNlcnZlZCBsb2cgY29kZSAxNTUuCiswNS8wOC8wMSAgIHNmaCAgICAgUmVzZXJ2ZWQgbG9nIGNvZGVzIDE1MCAtIDE1NC4KKzA0LzA2LzAxICAgbGFkICAgICBBZGRlZCBkZWZpbml0aW9ucyBvZiBiYXNlIElEcyAoc3VjaCBhcyBMT0dfV0NETUFfQkFTRV9DKS4KKyAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGN1cnJlbnRseSB1c2luZyB0ZW1wb3JhcnkgSUQgdmFsdWVzIGluIHRoZSAweDEwMDAgCisgICAgICAgICAgICAgICAgICAgcmFuZ2UuCiswMi8yMy8wMSAgIGxhZCAgICAgQ3JlYXRlZCBmaWxlIGZyb20gRE1TUyBsb2cuaC4gIExvZyBjb2RlcyBvbmx5CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8dm9zX3R5cGVzLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERhdGEgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvZyBlcXVpcG1lbnQgSURzLgorICogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgNCBiaXRzIG9mIHRoZSAxNiBiaXQgbG9nIGNvZGUgaXMgdGhlIGVxdWlwbWVudCBJRC4KKyAqIE9yaWduYWxseSwgdGhlIG1vYmlsZSB3YXMgdG8gaGF2ZSBhbiBJRCwgYW5kIGJhc2Ugc3RhdGlvbnMgYW5kIG90aGVyIAorICogSURzLiAgQXMgUUNUIHRlY2hub2xvZ3kgZGl2ZXJzaWZpZXMsIG5ldyBlcXVpcG1lbnQgSURzIGFyZSBhc3NpZ25lZCB0byBuZXcKKyAqIHRlY2hub2xvZ3kgYXJlYXMuICAweDIwMDAgYW5kIDB4MzAwMCBhcmUgcmVzZXJ2ZWQgZm9yIGxlZ2FjeSByZWFzb25zLCBzbyAKKyAqIHRoZSBmaXJzdCAKKyAqIGFkZGl0aW9uIHN0YXJ0cyBhdCAweDQwMDAuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTE9HXzFYX0JBU0VfQyAgICAoKHZfVTE2X3QpIDB4MTAwMCkKKyNkZWZpbmUgTE9HX1dDRE1BX0JBU0VfQyAoKHZfVTE2X3QpIDB4NDAwMCkKKyNkZWZpbmUgTE9HX0dTTV9CQVNFX0MgICAoKHZfVTE2X3QpIDB4NTAwMCkKKyNkZWZpbmUgTE9HX0xCU19CQVNFX0MgICAoKHZfVTE2X3QpIDB4NjAwMCkKKyNkZWZpbmUgTE9HX1VNVFNfQkFTRV9DICAoKHZfVTE2X3QpIDB4NzAwMCkKKyNkZWZpbmUgTE9HX1RETUFfQkFTRV9DICAoKHZfVTE2X3QpIDB4ODAwMCkKKyNkZWZpbmUgTE9HX0RUVl9CQVNFX0MgICAoKHZfVTE2X3QpIDB4QTAwMCkKKyNkZWZpbmUgTE9HX0FQUFNfQkFTRV9DICAoKHZfVTE2X3QpIDB4QjAwMCkKKyNkZWZpbmUgTE9HX0xURV9CQVNFX0MgICAoKHZfVTE2X3QpICgweEIwMDAgKyAweDAwMTApKQorI2RlZmluZSBMT0dfTFRFX0xBU1RfQyAgICgodl9VMTZfdCkgMHhCMUZGKQorI2RlZmluZSBMT0dfV0lNQVhfQkFTRV9DICgodl9VMTZfdCkgMHhCNDAwKQorI2RlZmluZSBMT0dfRFNQX0JBU0VfQyAgICgodl9VMTZfdCkgMHhDMDAwKQorCisjZGVmaW5lIExPR19UT09MU19CQVNFX0MgKCh2X1UxNl90KSAweEYwMDApCisKKy8qIExPR19CQVNFX0MgaXMgd2hhdCB3YXMgdXNlZCBiZWZvcmUgZXhwYW5kaW5nIHRoZSB1c2Ugb2YgdGhlIGVxdWlwbWVudCBJRC4gCisgKiBUT0RPOiBPbmNlIGFsbCB0YXJnZXRzIGFyZSB1c2luZyB0aGUgImNvcmUiIGRpYWcgc3lzdGVtLCB0aGlzIHNob3VsZCBiZQorICogb21taXR0ZWQuICovCisjZGVmaW5lIExPR19CQVNFX0MgTE9HXzFYX0JBU0VfQyAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9nIENvZGVzCisgKiAgIFRoZXNlIGNvZGVzIGlkZW50aWZ5IHRoZSBraW5kIG9mIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiBhIGxvZyBlbnRyeS4gCisgKiAgIFRoZXkgYXJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgJ2NvZGUnIGZpZWxkIG9mIHRoZSBsb2cgZW50cnkgCisgKiAgIGhlYWRlci4gIFRoZSBkYXRhIHR5cGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGNvZGUgYXJlIGRlZmluZWQgYmVsb3cuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoZSB1cHBlciA0IGJpdHMgb2YgdGhlIDE2IGJpdCBsb2cgZW50cnkgY29kZSBzcGVjaWZ5IHdoaWNoIHR5cGUKKyAqIG9mIGVxdWlwbWVudCBjcmVhdGVkIHRoZSBsb2cgZW50cnkuICovCisKKy8qIDAgTW9iaWxlIFN0YXRpb24gdGVtcG9yYWwgYW5hbHl6ZXIgZW50cnkgKi8KKyNkZWZpbmUgTE9HX1RBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwICsgTE9HXzFYX0JBU0VfQykKKworLyogMSBBR0MgdmFsdWVzIGFuZCBjbG9zZWQgbG9vcCBwb3dlciBjb250cm9sIGVudHJ5ICovCisjZGVmaW5lIExPR19BR0NfUENUTF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MSArIExPR18xWF9CQVNFX0MpCisKKy8qIDIgRm9yd2FyZCBsaW5rIGZyYW1lIHJhdGVzIGFuZCB0eXBlcyBlbnRyeSAqLworI2RlZmluZSBMT0dfRl9NVVgxX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzIFJldmVyc2UgbGluayBmcmFtZSByYXRlcyBhbmQgdHlwZXMgZW50cnkgKi8KKyNkZWZpbmUgTE9HX1JfTVVYMV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzICsgTE9HXzFYX0JBU0VfQykKKworLyogNCBBY2Nlc3MgY2hhbm5lbCBtZXNzYWdlIGVudHJ5ICovCisjZGVmaW5lIExPR19BQ19NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NCArIExPR18xWF9CQVNFX0MpCisKKy8qIDUgUmV2ZXJzZSBsaW5rIHRyYWZmaWMgY2hhbm5lbCBtZXNzYWdlIGVudHJ5ICovCisjZGVmaW5lIExPR19SX1RDX01TR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NSArIExPR18xWF9CQVNFX0MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiA2IFN5bmMgY2hhbm5lbCBtZXNzYWdlIGVudHJ5ICovCisjZGVmaW5lIExPR19TQ19NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NiArIExPR18xWF9CQVNFX0MpCisKKy8qIDcgUGFnaW5nIGNoYW5uZWwgbWVzc2FnZSBlbnRyeSAqLyAKKyNkZWZpbmUgTE9HX1BDX01TR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg3ICsgTE9HXzFYX0JBU0VfQykKKworLyogOCBGb3J3YXJkIGxpbmsgdHJhZmZpYyBjaGFubmVsIG1lc3NhZ2UgZW50cnkgKi8KKyNkZWZpbmUgTE9HX0ZfVENfTVNHX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4ICsgTE9HXzFYX0JBU0VfQykKKworLyogOSBGb3J3YXJkIGxpbmsgdm9jb2RlciBwYWNrZXQgZW50cnkgKi8KKyNkZWZpbmUgTE9HX1ZPQ19GT1JfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg5ICsgTE9HXzFYX0JBU0VfQykKKworLyogMTAgUmV2ZXJzZSBsaW5rIHZvY29kZXIgcGFja2V0IGVudHJ5ICovCisjZGVmaW5lIExPR19WT0NfUkVWX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QSArIExPR18xWF9CQVNFX0MpCisKKy8qIDExIFRlbXBvcmFsIGFuYWx5emVyIGZpbmdlciBpbmZvIG9ubHkgKi8KKyNkZWZpbmUgTE9HX0ZJTkdfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhCICsgTE9HXzFYX0JBU0VfQykKKworLyogMTIgU2VhcmNoZXIgcGF0aGxvZyBpbmZvIChSZXVzZWQgb2xkIFNSQ0ggbG9ndHlwZSkgKi8KKyNkZWZpbmUgTE9HX1NSQ0hfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhDICsgTE9HXzFYX0JBU0VfQykKKworLyogMTMgUG9zaXRpb24gYW5kIHNwZWVkIGluZm9ybWF0aW9uIHJlYWQgZnJvbSBFVEFLICovCisjZGVmaW5lIExPR19FVEFLX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RCArIExPR18xWF9CQVNFX0MpCisKKy8qIDE0IE1hcmtvdiBmcmFtZSBzdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19NQVJfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RSArIExPR18xWF9CQVNFX0MpCisKKy8qIDE1IE5ldyBhbmQgaW1wcm92ZWQgdGVtcG9yYWwgYW5hbHl6ZXIgc2VhcmNoZXIgaW5mbyAqLworI2RlZmluZSBMT0dfU1JDSDJfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxNiBUaGUgRnVqaXRzdSBoYW5kc2V0IGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19IQU5EU0VUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxNyBWb2NvZGVyIGJpdCBlcnJvciByYXRlIG1hc2sgKi8KKyNkZWZpbmUgTE9HX0VSUk1BU0tfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMSArIExPR18xWF9CQVNFX0MpCisKKy8qIDE4IEFuYWxvZyB2b2ljZSBjaGFubmVsIGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19BTkFMT0dfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxOSBBY2Nlc3MgcHJvYmUgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0FDQ19JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMyArIExPR18xWF9CQVNFX0MpCisKKy8qIDIwIFBvc2l0aW9uICYgc3BlZWQgaW5mbyByZWFkIGZyb20gR1BTIHJlY2VpdmVyICovCisjZGVmaW5lIExPR19HUFNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMSBUZXN0IENvbW1hbmQgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1RFU1RfQ01EX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNSArIExPR18xWF9CQVNFX0MpCisKKy8qIDIyIFNwYXJzZSAoMjBtcykgQUdDIC8gY2xvc2VkIGxvb3AgcG93ZXIgY29udHJvbCBlbnRyeSAqLworI2RlZmluZSBMT0dfU19BR0NfUENUTF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE2ICsgTE9HXzFYX0JBU0VfQykKKyAgCisvKiAyMyBOb3RpZmljYXRpb24gb2YgYSBiYW5kIGNsYXNzIGNoYW5nZSAqLworI2RlZmluZSBMT0dfQkFORF9DSEFOR0VfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE3ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjQgRE0gZGVidWcgbWVzc2FnZXMsIGlmIGJlaW5nIGxvZ2dlZCB2aWEgbG9nIHNlcnZpY2VzICovCisjZGVmaW5lIExPR19EQkdfTVNHX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTggKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyNSBHZW5lcmFsIHRlbXBvcmFsIGFuYWx5emVyIGVudHJ5ICovCisjZGVmaW5lIExPR19HRU5STF9UQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyNiBHZW5lcmFsIHRlbXBvcmFsIGFuYWx5emVyIHcvc3VwcGxlbWVudGFsIGNoYW5uZWxzICovCisjZGVmaW5lIExPR19HRU5STF9UQV9TVVBfQ0hfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGZWF0dXJpemF0aW9uIFJlbW92YWwgcmVxdWVzdGVkIGJ5IENNSSAKKyNpZmRlZiBGRUFUVVJFX1BMVCAKKyovCisKKy8qIDI3IERlY29kZXIgcmF3IGJpdHMgbG9nZ2luZyAqLworI2RlZmluZSBMT0dfUExUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFCICsgTE9HXzFYX0JBU0VfQykKKworLyogRmVhdHVyaXphdGlvbiBSZW1vdmFsIHJlcXVlc3RlZCBieSBDTUkKKyNlbHNlCisyNyBFRlMgVXNhZ2UgSW5mbyAtIE5vIGltcGxlbWVudGF0aW9uIGFzIHlldCAKKyNkZWZpbmUgTE9HX0VGU19JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxQiArIExPR18xWF9CQVNFX0MpCisjZW5kaWYgICAKKyovCisKKy8qIDI4IEFuYWxvZyBGb3J3YXJkIENoYW5uZWwgKi8KKyNkZWZpbmUgTE9HX0FOQUxPR19GT1JXX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxQyArIExPR18xWF9CQVNFX0MpCisKKy8qIDI5IEFuYWxvZyBSZXZlcnNlIENoYW5uZWwgKi8KKyNkZWZpbmUgTE9HX0FOQUxPR19SRVZTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxRCArIExPR18xWF9CQVNFX0MpCisKKy8qIDMwIEFuYWxvZyBIYW5kb2ZmIEVudHJ5ICovCisjZGVmaW5lIExPR19BTkFMT0dfSEFORE9GRl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzMSBGTSBTbG90IFN0YXRpc3RpcyBlbnRyeSAqLworI2RlZmluZSBMT0dfQU5BTE9HX0ZNU0xPVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFGICsgTE9HXzFYX0JBU0VfQykKKyAgCisvKiAzMiBGT0NDIFdvcmQgU3luYyBDb3VudCBlbnRyeSAqLworI2RlZmluZSBMT0dfQU5BTE9HX1dTX0NPVU5UX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwICsgTE9HXzFYX0JBU0VfQykKKworLyogMzMgKi8KKyNkZWZpbmUgTE9HX1JMUF9QQUNLRVRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMSArIExPR18xWF9CQVNFX0MpCisKKy8qIDM0ICovCisjZGVmaW5lIExPR19BU1lOQ19UQ1BfU0VHX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNSAqLworI2RlZmluZSBMT0dfUEFDS0VUX0RBVEFfSVBfUEFDS0VUU19DICAgICAgICAgICAgICAgICAgICgweDIzICsgTE9HXzFYX0JBU0VfQykKKworLyogMzYgKi8KKyNkZWZpbmUgTE9HX0ZOQkRUX01FU1NBR0VfTE9HX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNCArIExPR18xWF9CQVNFX0MpCisKKy8qIEJlZ2luIElTLTIwMDAgTE9HIGZlYXR1cmVzICovCisgCisvKiAzNyBSTFAgUlggRnJhbWVzIGxvZ2dpbmcgKi8gCisjZGVmaW5lIExPR19STFBfUlhfRlJBTUVTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjUgKyBMT0dfMVhfQkFTRV9DKQorICAKKy8qIDM4IFJMUCBUWCBGcmFtZXMgbG9nZ2luZyAqLworI2RlZmluZSBMT0dfUkxQX1RYX0ZSQU1FU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDI2ICsgTE9HXzFYX0JBU0VfQykKKworLyogMzkgUmVzZXJ2ZWQgZm9yIGFkZGl0aW9ucyB0byBSTFAgZnJhbWVzICovCisjZGVmaW5lIExPR19STFBfUlNWRDFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA0MCBSZXNlcnZlZCBmb3IgYWRkaXRpb25zIHRvIFJMUCBmcmFtZXMgKi8KKyNkZWZpbmUgTE9HX1JMUF9SU1ZEMl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyOCArIExPR18xWF9CQVNFX0MpCisKKy8qIDQxIEZvcndhcmQgTGluayBGcmFtZSBUeXBlcyBsb2dnaW5nICovCisjZGVmaW5lIExPR19GV0RfRlJBTUVfVFlQRVNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjkgKyBMT0dfMVhfQkFTRV9DKQorICAKKy8qIDQyIFJldmVyc2UgTGluayBGcmFtZSBUeXBlcyBsb2dnaW5nICovCisjZGVmaW5lIExPR19SRVZfRlJBTUVfVFlQRVNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MkEgKyBMT0dfMVhfQkFTRV9DKQorICAKKy8qIDQzIEZhc3QgRm9yd2FyZCBQb3dlciBDb250cm9sIFBhcmFtZXRlcnMgbG9nZ2luZyAqLworI2RlZmluZSBMT0dfRkZXRF9QQ1RSTF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDJCICsgTE9HXzFYX0JBU0VfQykKKworLyogNDQgUmV2ZXJzZSBQb3dlciBDb250cm9sIFBhcmFtZXRlcnMgbG9nZ2luZyAqLworI2RlZmluZSBMT0dfUkVWX1BDVFJMX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDJDICsgTE9HXzFYX0JBU0VfQykKKworLyogNDUgU2VhcmNoZXIgYW5kIEZpbmdlciBJbmZvcm1hdGlvbiBsb2dnaW5nICovCisjZGVmaW5lIExPR19TUkNIX0ZJTkdfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MkQgKyBMT0dfMVhfQkFTRV9DKQorICAKKy8qIDQ2IFNlcnZpY2UgQ29uZmlndXJhdGlvbiBsb2dnaW5nICovCisjZGVmaW5lIExPR19TVkNfQ09ORklHX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MkUgKyBMT0dfMVhfQkFTRV9DKQorICAKKy8qIDQ3IEFjdGl2ZSBTZXQgQ29uZmlndXJhdGlvbiBsb2dnaW5nICovCisjZGVmaW5lIExPR19BU0VUX0NPTkZJR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MkYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA0OCBRdWljayBQYWdpbmcgQ2hhbm5lbCBsb2dnaW5nICovCisjZGVmaW5lIExPR19RUENIX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA0OSBSTFAgU3RhdGlzdGljcyBsb2dnaW5nICovCisjZGVmaW5lIExPR19STFBfU1RBVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA1MCBTaW1wbGUgVGVzdCBEYXRhIFNlcnZpY2UgT3B0aW9uIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX1NURFNPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMiArIExPR18xWF9CQVNFX0MpCisKKy8qIDUxIFBpbG90IFBoYXNlIE1lYXN1cmVtZW50IHJlc3VsdHMgbG9nZ2luZyAqLworI2RlZmluZSBMT0dfU1JDSF9QUE1fUkVTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMzICsgTE9HXzFYX0JBU0VfQykKKworLyogNTIgUGlsb3QgUGhhc2UgTWVhc3VyZW1lbnQgRGF0YSBCYXNlIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX1NSQ0hfUFBNX0RCX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNCArIExPR18xWF9CQVNFX0MpCisKKy8qIDUzIFBpbG90IFBoYXNlIE1lYXN1cmVtZW50IHNlYXJjaCByZXN1bHRzIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX1NSQ0hfUFBNX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNSArIExPR18xWF9CQVNFX0MpCisKKy8qIDU0IElTLTgwMSBmb3J3YXJkIGxpbmsgbWVzc2FnZSAqLworI2RlZmluZSBMT0dfR1BTX0ZXRF9NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM2ICsgTE9HXzFYX0JBU0VfQykKKworLyogNTUgSVMtODAxIHJldmVyc2UgbGluayBtZXNzYWdlICovCisjZGVmaW5lIExPR19HUFNfUkVWX01TR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA1NiBHUFMgc2VhcmNoIHNlc3Npb24gc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfR1BTX1NUQVRTX01TR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM4ICsgTE9HXzFYX0JBU0VfQykKKworLyogNTcgR1BTIHNlYXJjaCByZXN1bHRzICovCisjZGVmaW5lIExPR19HUFNfU1JDSF9QRUFLU19NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4MzkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA1OCBGYWN0b3J5IFRlc3Rtb2RlIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX0ZUTV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQSArIExPR18xWF9CQVNFX0MpCisKKy8qIDU5IE11bHRpcGxlIFBlYWsgTG9nZ2luZyAqLworI2RlZmluZSBMT0dfU1JDSF9HUFNfTVVMVElfUEVBS1NfSU5GT19DICAgICAgICAgICAgICAgICgweDNCICsgTE9HXzFYX0JBU0VfQykKKworLyogNjAgUG9zdCBwcm9jZXNzZWQgc2VhcmNoIHJlc3VsdHMgbG9ncyAqLworI2RlZmluZSBMT0dfU1JDSF9HUFNfUE9TVF9QUk9DX0MgICAgICAgICAgICAgICAgICAgICAgICgweDNDICsgTE9HXzFYX0JBU0VfQykKKworLyogNjEgRlVMTCBUZXN0IERhdGEgU2VydmljZSBPcHRpb24gbG9nZ2luZyAqLworI2RlZmluZSBMT0dfRlREU09fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNEICsgTE9HXzFYX0JBU0VfQykKKworLyogNjIgQmx1ZXRvb3RoIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX0JUX1JFU0VSVkVEX0NPREVTX0JBU0VfQyAgICAgICAgICAgICAgICAgICAoMHgzRSArIExPR18xWF9CQVNFX0MpCisvKiBLZWVwIGNvbmZ1c2luZyBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gICovCisjZGVmaW5lIExPR19CVF9CQVNFX0MgTE9HX0JUX1JFU0VSVkVEX0NPREVTX0JBU0VfQworCisvKiA5MiBCbHVldG9vdGgncyBsYXN0IGxvZyBjb2RlICovCisjZGVmaW5lIExPR19CVF9MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwICsgTE9HX0JUX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworLyogOTMgSERSIGxvZyBjb2RlcyAqLworI2RlZmluZSBMT0dfSERSX1JFU0VSVkVEX0NPREVTX0JBU0VfQyAgICAgICAgICAgICAgICAgICgweDVEICsgTE9HXzFYX0JBU0VfQykKKy8qIEtlZXAgY29uZnVzaW5nIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgKi8KKyNkZWZpbmUgTE9HX0hEUl9CQVNFX0MgTE9HX0hEUl9SRVNFUlZFRF9DT0RFU19CQVNFX0MKKworLyogMTQzIGlzIEhEUidzIGxhc3QgbG9nIGNvZGUgKi8KKyNkZWZpbmUgTE9HX0hEUl9MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNTAgKyBMT0dfSERSX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworLyogMTQ0IElTMjAwMCBEQ0NIIEZvcndhcmQgbGluayBjaGFubmVsICovCisjZGVmaW5lIExPR19GT1JfRENDSF9NU0dfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OTAgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfRENDSF9GV0RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19GT1JfRENDSF9NU0dfQworICAKKy8qIDE0NSBJUzIwMDAgRENDSCBGb3J3YXJkIGxpbmsgY2hhbm5lbCAqLworI2RlZmluZSBMT0dfUkVWX0RDQ0hfTVNHX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDkxICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX0RDQ0hfUkVWX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfUkVWX0RDQ0hfTVNHX0MKKworLyogMTQ2IElTMjAwMCBEQ0NIIEZvcndhcmQgbGluayBjaGFubmVsICovCisjZGVmaW5lIExPR19aUkVYX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OTIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxNDcgQWN0aXZlIHNldCBpbmZvIGxvZ2dpbmcsIHNpbWlsYXIgdG8gQVNFVF9DT05GSUcsIGJ1dCBzaW1wbGVyLiAgKi8KKyNkZWZpbmUgTE9HX0FTRVRfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg5MyArIExPR18xWF9CQVNFX0MpCisKKy8qIDE0OCBQaWxvdCBQaGFzZSBNZWFzdXJlbWVudCBmb3VyLXNob3VsZGVyLXNlYXJjaCByZXN1dGx0cyBsb2dnaW5nICovCisjZGVmaW5lIExPR19TUkNIX1BQTV80U0hPVUxERVJfUkVTX0MgICAgICAgICAgICAgICAgICAgKDB4OTQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxNDkgRXh0ZW5kZWQgUGlsb3QgUGhhc2UgTWVhc3VyZW1lbnQgRGF0YSBCYXNlIGxvZ2dpbmcgKi8KKyNkZWZpbmUgTE9HX1NSQ0hfRVhUX1BQTV9EQl9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg5NSArIExPR18xWF9CQVNFX0MpCisKKy8qIDE1MCBHUFMgVmlzaXQgUGFyYW1ldGVycyAqLworI2RlZmluZSBMT0dfR1BTX1ZJU0lUX1BBUkFNRVRFUlNfQyAgICAgICAgICAgICAgICAgICAgICgweDk2ICsgTE9HXzFYX0JBU0VfQykKKworLyogMTUxIEdQUyBNZWFzdXJlbWVudCAqLworI2RlZmluZSBMT0dfR1BTX01FQVNVUkVNRU5UX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDk3ICsgTE9HXzFYX0JBU0VfQykKKworLyogMTUyIFVJTSBEYXRhICovCisjZGVmaW5lIExPR19VSU1fREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OTggKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxNTMgU1REU08gcGx1cyBQMiAqLworI2RlZmluZSBMT0dfU1REU09fUDJfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDk5ICsgTE9HXzFYX0JBU0VfQykKKworLyogMTU0IEZURFNPIHBsdXMgUDIgKi8KKyNkZWZpbmUgTE9HX0ZURFNPX1AyX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg5QSArIExPR18xWF9CQVNFX0MpCisKKy8qIDE1NSBTZWFyY2ggUFBNIFN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1NSQ0hfUFBNX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg5QiArIExPR18xWF9CQVNFX0MpCisKKy8qIDE1NiBQUFAgVHggRnJhbWVzICovCisjZGVmaW5lIExPR19QUFBfVFhfRlJBTUVTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OUMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxNTcgUFBQIFJ4IEZyYW1lcyAqLworI2RlZmluZSBMT0dfUFBQX1JYX0ZSQU1FU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDlEICsgTE9HXzFYX0JBU0VfQykKKworLyogMTU4LTE4NyBTU0wgcmVzZXJ2ZWQgbG9nIGNvZGVzICovCisjZGVmaW5lIExPR19TU0xfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAgICAgKDB4OUUgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfU1NMX0xBU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyOSArIExPR19TU0xfUkVTRVJWRURfQ09ERVNfQkFTRV9DKQorCisvKiAxODgtMTk5IFB1bWEgcmVzZXJ2ZWQgbG9nIGNvZGVzICovCisvKiAxODggUVBDSCwgdmVyc2lvbiAyICovCisjZGVmaW5lIExPR19RUENIX1ZFUl8yX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QkMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxODkgRW5oYW5jZWQgQWNjZXNzIFByb2JlICovCisjZGVmaW5lIExPR19FQV9QUk9CRV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QkQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxOTAgQkNDSCBGcmFtZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfQkNDSF9GUkFNRV9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweEJFICsgTE9HXzFYX0JBU0VfQykKKworLyogMTkxIEZDQ0NIIEZyYW1lIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GQ0NDSF9GUkFNRV9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QkYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxOTIgRkRDSCBGcmFtZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRkRDSF9GUkFNRV9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweEMwICsgTE9HXzFYX0JBU0VfQykKKworLyogMTkzIFJEQ0ggRnJhbWUgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1JEQ0hfRlJBTUVfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhDMSArIExPR18xWF9CQVNFX0MpCisKKy8qIDE5NCBGRlBDIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GRlBDX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QzIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxOTUgUlBDIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19SUENfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QzMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxOTYgU2VhcmNoZXIgYW5kIEZpbmdlciBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfU1JDSF9GSU5HX0lORk9fVkVSXzJfQyAgICAgICAgICAgICAgICAgICAgICgweEM0ICsgTE9HXzFYX0JBU0VfQykKKworLyogMTk3IFNlcnZpY2UgQ29uZmlndXJhdGlvbiwgdmVyc2lvbiAyICovCisjZGVmaW5lIExPR19TUlZfQ09ORklHX1ZFUl8yX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QzUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxOTggQWN0aXZlIFNldCBJbmZvcm1hdGlvbiwgdmVyc2lvbiAyICovCisjZGVmaW5lIExPR19BU0VUX0lORk9fVkVSXzJfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QzYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxOTkgUmVkdWNlZCBBY3RpdmUgU2V0ICovCisjZGVmaW5lIExPR19SRURVQ0VEX0FTRVRfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgKDB4QzcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMDAgU2VhcmNoIFRyaWFnZSBJbmZvICovCisjZGVmaW5lIExPR19TUkNIX1RSSUFHRV9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QzggKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMDEgUkRBIEZyYW1lIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19SREFfRlJBTUVfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4QzkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMDIgZ3BzT25lIGZhdHBhdGggaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0dQU19GQVRQQVRIX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHhDQSArIExPR18xWF9CQVNFX0MpCisKKy8qIDIwMyBFeHRlbmRlZCBBR0MgKi8KKyNkZWZpbmUgTE9HX0VYVEVOREVEX0FHQ19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhDQiArIExPR18xWF9CQVNFX0MpCisKKy8qIDIwNCBUcmFuc21pdCBBR0MgKi8KKyNkZWZpbmUgTE9HX1RSQU5TTUlUX0FHQ19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhDQyArIExPR18xWF9CQVNFX0MpCisKKy8qIDIwNSBJL1EgT2Zmc2V0IHJlZ2lzdGVycyAqLworI2RlZmluZSBMT0dfSVFfT0ZGU0VUX1JFR0lTVEVSU19DICAgICAgICAgICAgICAgICAgICAgICgweENEICsgTE9HXzFYX0JBU0VfQykKKworLyogMjA2IERBQ0MgSS9RIEFjY3VtdWxhdG9yIHJlZ2lzdGVycyAqLworI2RlZmluZSBMT0dfREFDQ19JUV9BQ0NVTVVMQVRPUl9DICAgICAgICAgICAgICAgICAgICAgICgweENFICsgTE9HXzFYX0JBU0VfQykKKworLyogMjA3IFJlZ2lzdGVyIHBvbGxpbmcgcmVzdWx0cyAqLworI2RlZmluZSBMT0dfUkVHSVNURVJfUE9MTElOR19SRVNVTFRTX0MgICAgICAgICAgICAgICAgICgweENGICsgTE9HXzFYX0JBU0VfQykKKworLyogMjA4IFN5c3RlbSBhcmJpdHJhdGlvbiBtb2R1bGUgKi8KKyNkZWZpbmUgTE9HX0FUX1NBTV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhEMCArIExPR18xWF9CQVNFX0MpCisKKy8qIDIwOSBEaWFibG8gc2VhcmNoZXIgZmluZ2VyIGxvZyAqLworI2RlZmluZSBMT0dfRElBQkxPX1NSQ0hfRklOR19JTkZPX0MgICAgICAgICAgICAgICAgICAgICgweEQxICsgTE9HXzFYX0JBU0VfQykKKworLyogMjEwIGxvZyByZXNlcnZlZCBmb3IgZGFuZHJ1cyAqLworI2RlZmluZSBMT0dfU0QyMF9MQVNUX0FDVElPTl9DICAgICAgICAgICAgICAgICAgICAgICAgICgweEQyICsgTE9HXzFYX0JBU0VfQykKKworLyogMjExIGxvZyByZXNlcnZlZCBmb3IgZGFuZHJ1cyAqLworI2RlZmluZSBMT0dfU0QyMF9MQVNUX0FDVElPTl9IWUJSSURfQyAgICAgICAgICAgICAgICAgICgweEQzICsgTE9HXzFYX0JBU0VfQykKKworLyogMjEyIGxvZyByZXNlcnZlZCBmb3IgZGFuZHJ1cyAqLworI2RlZmluZSBMT0dfU0QyMF9TU19PQkpFQ1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEQ0ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjEzIGxvZyByZXNlcnZlZCBmb3IgZGFuZHJ1cyAqLworI2RlZmluZSBMT0dfU0QyMF9TU19PQkpFQ1RfSFlCUklEX0MgICAgICAgICAgICAgICAgICAgICgweEQ1ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjE0IGxvZyByZXNlcnZlZCBmb3IganBpbm9zICovCisjZGVmaW5lIExPR19CQ0NIX1NJR05BTElOR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RDYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMTUgbG9nIHJlc2VydmVkIGZvciBqcGlub3MgKi8KKyNkZWZpbmUgTE9HX1JFQUNIX1NJR05BTElOR19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhENyArIExPR18xWF9CQVNFX0MpCisKKy8qIDIxNiBsb2cgcmVzZXJ2ZWQgZm9yIGpwaW5vcyAqLworI2RlZmluZSBMT0dfRkNDQ0hfU0lHTkFMSU5HX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweEQ4ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjE3IFJEQSBGcmFtZSBJbmZvcm1hdGlvbiAyICovCisjZGVmaW5lIExPR19SREFfRlJBTUVfSU5GT18yX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RDkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMTggKi8KKyNkZWZpbmUgTE9HX0dQU19CSVRfRURHRV9SRVNVTFRTX0MgICAgICAgICAgICAgICAgICAgICAoMHhEQSArIExPR18xWF9CQVNFX0MpCisKKy8qIDIxOSAqLworI2RlZmluZSBMT0dfUEVfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweERCICsgTE9HXzFYX0JBU0VfQykKKworLyogMjIwICovCisjZGVmaW5lIExPR19QRV9QQVJUSUFMX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4REMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMjEgKi8KKyNkZWZpbmUgTE9HX0dQU19TSU5HTEVfUEVBS19TUkNIX1JFU1VMVFNfQyAgICAgICAgICAgICAoMHhERCArIExPR18xWF9CQVNFX0MpCisKKy8qIDIyMiAqLworI2RlZmluZSBMT0dfU1JDSDRfU0FNUFJBTV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweERFICsgTE9HXzFYX0JBU0VfQykKKworLyogMjIzICovCisjZGVmaW5lIEhEUl9BTl9QUFBfVFhfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4REYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMjQgKi8KKyNkZWZpbmUgSERSX0FOX1BQUF9SWF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhFMCArIExPR18xWF9CQVNFX0MpCisKKy8qIDIyNSAqLworI2RlZmluZSBMT0dfR1BTX1NDSEVEVUxFUl9UUkFDRV9DICAgICAgICAgICAgICAgICAgICAgICgweEUxICsgTE9HXzFYX0JBU0VfQykKKworLyogMjI2ICovCisjZGVmaW5lIExPR19NUEVHNF9ZVVZfRlJBTUVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RTIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAyMjcgKi8KKyNkZWZpbmUgTE9HX01QRUc0X0NMSVBfU1RBVFNfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHhFMyArIExPR18xWF9CQVNFX0MpCisKKy8qIDIyOCAqLworI2RlZmluZSBMT0dfTVBFRzRfQ0xJUF9TVEFUU19WRVIyX0MgICAgICAgICAgICAgICAgICAgICgweEU0ICsgTE9HXzFYX0JBU0VfQykKKworLyogMjI2LTI0MSBNTUVHIHJlc2VydmVkLiAqLworI2RlZmluZSBMT0dfTVBFR19SRVNFUlZFRF9DT0RFU19CQVNFX0MgICAgICAgICAgICAgICAgICgweEYxICsgTE9HXzFYX0JBU0VfQykKKworLyogMjQyLTI3NCBCUkVXIHJlc2VydmVkIGxvZyByYW5nZSAqLworI2RlZmluZSBMT0dfQlJFV19SRVNFUlZFRF9DT0RFU19CQVNFX0MgICAgICAgICAgICAgICAgICgweEYyICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX0JSRVdfTEFTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzIgKyBMT0dfQlJFV19SRVNFUlZFRF9DT0RFU19CQVNFX0MpCisKKy8qIDI3NS0zMzkgUFBQIEV4dGVuZGVkIEZyYW1lcyAqLworI2RlZmluZSBMT0dfUFBQX0ZSQU1FU19SRVNFUlZFRF9DT0RFU19CQVNFX0MgICAgICAgICAgICgweDExMyArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QUFBfRlJBTUVTX0xBU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDY0ICsgTE9HX1BQUF9GUkFNRVNfUkVTRVJWRURfQ09ERVNfQkFTRV9DKQorCisjZGVmaW5lIExPR19QUFBfRVhUX0ZSQU1FRF9SWF9VTV9DICAgICAgICAgICAgICAgICAgICAgKDB4MTEzICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BQUF9FWFRfRlJBTUVEX1JYX1JNX0MgICAgICAgICAgICAgICAgICAgICAoMHgxMTQgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFBQX0VYVF9GUkFNRURfUlhfQU5fQyAgICAgICAgICAgICAgICAgICAgICgweDExNSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1BQUF9FWFRfRlJBTUVEX1RYX1VNX0MgICAgICAgICAgICAgICAgICAgICAoMHgxMjMgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFBQX0VYVF9GUkFNRURfVFhfUk1fQyAgICAgICAgICAgICAgICAgICAgICgweDEyNCArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QUFBfRVhUX0ZSQU1FRF9UWF9BTl9DICAgICAgICAgICAgICAgICAgICAgKDB4MTI1ICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfUFBQX0VYVF9VTkZSQU1FRF9SWF9VTV9DICAgICAgICAgICAgICAgICAgICgweDEzMyArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QUFBfRVhUX1VORlJBTUVEX1JYX1JNX0MgICAgICAgICAgICAgICAgICAgKDB4MTM0ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BQUF9FWFRfVU5GUkFNRURfUlhfQU5fQyAgICAgICAgICAgICAgICAgICAoMHgxMzUgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19QUFBfRVhUX1VORlJBTUVEX1RYX1VNX0MgICAgICAgICAgICAgICAgICAgKDB4MTQzICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BQUF9FWFRfVU5GUkFNRURfVFhfUk1fQyAgICAgICAgICAgICAgICAgICAoMHgxNDQgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUFBQX0VYVF9VTkZSQU1FRF9UWF9BTl9DICAgICAgICAgICAgICAgICAgICgweDE0NSArIExPR18xWF9CQVNFX0MpCisKKy8qIDM0MCBMT0dfUEVfREFUQV9FWFRfQyAqLworI2RlZmluZSBMT0dfUEVfREFUQV9FWFRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE1NCArIExPR18xWF9CQVNFX0MpCisKKy8qIFJFWCBTdWJzeXN0ZW0gbG9ncyAqLworI2RlZmluZSBMT0dfTUVNREVCVUdfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE1NSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19TWVNQUk9GSUxFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTU2ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1RBU0tQUk9GSUxFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNTcgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfQ09SRURVTVBfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE1OCArIExPR18xWF9CQVNFX0MpCisKKy8qIDM0MS0zNDkgUkVYIHN1YnN5c3RlbSBsb2dzICovCisjZGVmaW5lIExPR19SRVhfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAgICAgKDB4MTU1ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1JFWF9MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCArIExPR19SRVhfUkVTRVJWRURfQ09ERVNfQkFTRV9DKQorCisvKiAzNTAgTE9HX1BFX1BBUlRJQUxfREFUQV9FWFRfQyAqLworI2RlZmluZSBMT0dfUEVfUEFSVElBTF9EQVRBX0VYVF9DICAgICAgICAgICAgICAgICAgICAgICgweDE1RSArIExPR18xWF9CQVNFX0MpCisKKy8qIDM1MSBMT0dfRElBR19TVFJFU1NfVEVTVF9DICovCisjZGVmaW5lIExPR19ESUFHX1NUUkVTU19URVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTVGICsgTE9HXzFYX0JBU0VfQykKKworLyogMzUyICBMT0dfV01TX1JFQURfQyAqLworI2RlZmluZSBMT0dfV01TX1JFQURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE2MCArIExPR18xWF9CQVNFX0MpCisKKy8qIDM1MyBTZWFyY2ggVHJpYWdlIEluZm8gVmVyc2lvbiAyICovCisjZGVmaW5lIExPR19TUkNIX1RSSUFHRV9JTkZPMl9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDE2MSArIExPR18xWF9CQVNFX0MpCisKKy8qIDM1NCBSTFAgUnggRkRDSCBGcmFtZXMgKi8KKyNkZWZpbmUgTE9HX1JMUF9SWF9GRENIX0ZSQU1FU19DICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTYyICsgTE9HXzFYX0JBU0VfQykKKworCisvKiAzNTUgUkxQIFR4IEZEQ0ggRnJhbWVzICovCisjZGVmaW5lIExPR19STFBfVFhfRkRDSF9GUkFNRVNfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDE2MyArIExPR18xWF9CQVNFX0MpCisKKy8qIDM1Ni0zNzEgUVRWIHN1YnN5c3RlbSBsb2dzICovCisjZGVmaW5lIExPR19RVFZfUkVTRVJWRURfQ09ERVNfQkFTRV9DICAgICAgICAgICAgICAgICAgICgweDE2NCArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19RVFZfTEFTVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNSArIExPR19RVFZfUkVTRVJWRURfQ09ERVNfQkFTRV9DKQorCisvKiAzNzIgU2VhcmNoZXIgNCAxWCAqLworI2RlZmluZSBMT0dfU1JDSDRfMVhfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNzQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNzMgU2VhcmNoZXIgc2xlZXAgc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfU1JDSF9TTEVFUF9TVEFUU19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNzUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNzQgU2VydmljZSBDb25maWd1cmF0aW9uLCB2ZXJzaW9uIDMgKi8KKyNkZWZpbmUgTE9HX1NSVl9DT05GSUdfVkVSXzNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTc2ICsgTE9HXzFYX0JBU0VfQykKKworLyogMzc1IFNlYXJjaGVyIDQgSERSICovCisjZGVmaW5lIExPR19TUkNINF9IRFJfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE3NyArIExPR18xWF9CQVNFX0MpCisKKy8qIDM3NiBTZWFyY2hlciA0IEFGTFQgKi8KKyNkZWZpbmUgTE9HX1NSQ0g0X0FGTFRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTc4ICsgTE9HXzFYX0JBU0VfQykKKworLyogMzc3IEVuaGFuY2VkIEZpbmdlciBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRU5IX0ZJTkdfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxNzkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzNzggRFYgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0RWX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTdBICsgTE9HXzFYX0JBU0VfQykKKworLyogMzc5IFdNUyBzZXQgcm91dGVzIGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19XTVNfU0VUX1JPVVRFU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDE3QiArIExPR18xWF9CQVNFX0MpCisKKy8qIDM4MCBGVE0gVmVyc2lvbiAyIExvZ3MgKi8KKyNkZWZpbmUgTE9HX0ZUTV9WRVJfMl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTdDICsgTE9HXzFYX0JBU0VfQykKKworLyogMzgxIEdQUyBNdWx0aXBlYWsgbG9nZ2luZyAqLworI2RlZmluZSBMT0dfU1JDSF9HUFNfTVVMVElfUEVBS1NfU0lNUExJRklFRF9JTkZPX0MgICAgICAoMHgxN0QgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAzODIgR1BTIE11bHRpcGVhayBsb2dnaW5nICovCisjZGVmaW5lIExPR19TUkNIX0dQU19NVUxUSV9QRUFLU19WRVJCT1NFX0lORk9fQyAgICAgICAgICgweDE3RSArIExPR18xWF9CQVNFX0MpCisKKy8qIDM4My00MDMgSERSIHJlc2VydmVkIGxvZ3MgKi8KKyNkZWZpbmUgTE9HX0hEUl9SRVNFUlZFRF9DT0RFU19CQVNFXzJfQyAgICAgICAgICAgICAgICAgKDB4MTdGICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX0hEUl9MQVNUXzJfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIwICsgTE9HX0hEUl9SRVNFUlZFRF9DT0RFU19CQVNFXzJfQykKKworLyogUkxQIFJ4IC0gUERDSCBwYXJ0aWFsIE11eFBEVTUgZnJhbWVzICovCisjZGVmaW5lIExPR19STFBfUlhfUERDSF9QQVJUSUFMX01VWFBEVTVfRlJBTUVTX0MgICAgICAgICgweDE5NCArIExPR18xWF9CQVNFX0MpCisKKy8qIFJMUCBUeCAtIFBEQ0ggcGFydGlhbCBNdXhQRFU1IGZyYW1lcyAqLworI2RlZmluZSBMT0dfUkxQX1RYX1BEQ0hfUEFSVElBTF9NVVhQRFU1X0ZSQU1FU19DICAgICAgICAoMHgxOTUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSTFAgUnggaW50ZXJuYWwgZGV0YWlscyAqLworI2RlZmluZSBMT0dfUkxQX1JYX0lOVEVSTkFMX0RFVEFJTFNfQyAgICAgICAgICAgICAgICAgICAoMHgxOTYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSTFAgVHggaW50ZXJuYWwgZGV0YWlscyAqLworI2RlZmluZSBMT0dfUkxQX1RYX0lOVEVSTkFMX0RFVEFJTFNfQyAgICAgICAgICAgICAgICAgICAoMHgxOTcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBNUEVHNCBDbGlwIFN0YXRpc3RpY3MgdmVyc2lvbiAzICovCisjZGVmaW5lIExPR19NUEVHNF9DTElQX1NUQVRTX1ZFUjNfQyAgICAgICAgICAgICAgICAgICAgICgweDE5OCArIExPR18xWF9CQVNFX0MpCisKKy8qIE1vYmlsZSBJUCBQZXJmb3JtYW5jZSAqLworI2RlZmluZSBMT0dfTU9CSUxFX0lQX1BFUkZPUk1BTkNFX0MgICAgICAgICAgICAgICAgICAgICAoMHgxOTkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA0MTAtNDMwIFNlYXJjaGVyIHJlc2VydmVkIGxvZ3MgKi8KKyNkZWZpbmUgTE9HX1NFQVJDSEVSX1JFU0VSVkVEX0NPREVTX0JBU0VfQyAgICAgICAgICAgICAgKDB4MTlBICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1NFQVJDSEVSX0xBU1RfMl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIxICsgTE9HX1NFQVJDSEVSX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworLyogNDMyLTQ4MCBRVFYgcmVzZXJ2ZWQgbG9ncyAqLworI2RlZmluZSBMT0dfUVRWMl9SRVNFUlZFRF9DT0RFU19CQVNFX0MgICAgICAgICAgICAgICAgICAoMHgxQjAgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVRWMl9MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNDggKyBMT0dfUVRWMl9SRVNFUlZFRF9DT0RFU19CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1FUVl9QRFMyX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUI2ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9QRFMyX0dFVF9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUI3ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9QRFMyX0dFVF9SRVNQX0hFQURFUiAgICAgICAgICAgICAgICAgICAgKDB4MUI4ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9QRFMyX0dFVF9SRVNQX1BDS1QgICAgICAgICAgICAgICAgICAgICAgKDB4MUI5ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9DTVhfQVVESU9fSU5QVVRfREFUQV9DICAgICAgICAgICAgICAgICAgKDB4MUJBICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9SVFNQX09QVElPTlNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUJCICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9SVFNQX0dFVF9QQVJBTUVURVJfQyAgICAgICAgICAgICAgICAgICAgKDB4MUJDICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9SVFNQX1NFVF9QQVJBTUVURVJfQyAgICAgICAgICAgICAgICAgICAgKDB4MUJEICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9WSURFT19CSVRTVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUJFICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX0FSTV9WSURFT19ERUNPREVfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgKDB4MUJGICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9EU1BfU0xJQ0VfQlVGRkVSX0MgICAgICAgICAgICAgICAgICAgICAgKDB4MUMwICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9DTURfTE9HR0lOR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUMxICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9BVURJT19GUkFNRV9QVFNfSU5GT19DICAgICAgICAgICAgICAgICAgKDB4MUMyICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9WSURFT19GUkFNRV9ERUNPREVfSU5GT19DICAgICAgICAgICAgICAgKDB4MUMzICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9SVENQX0NPTVBPVU5EX1JSX0MgICAgICAgICAgICAgICAgICAgICAgKDB4MUM0ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9GUkFNRV9CVUZGRVJfUkVMRUFTRV9SRUFTT05fQyAgICAgICAgICAgKDB4MUM1ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9BVURJT19DSEFOTkVMX1NXSVRDSF9GUkFNRV9DICAgICAgICAgICAgKDB4MUM2ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9SVFBfREVDUllQVEVEX1BLVF9DICAgICAgICAgICAgICAgICAgICAgKDB4MUM3ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FUVl9QQ1JfRFJJRlRfUkFURV9DICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUM4ICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIFBEU00gbG9ncyAqLworI2RlZmluZSBMT0dfUERTTV9QT1NJVElPTl9SRVBPUlRfQ0FMTEJBQ0tfQyAgICAgICAgICAgICAoMHgxRTEgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUERTTV9QRF9FVkVOVF9DQUxMQkFDS19DICAgICAgICAgICAgICAgICAgICAoMHgxRTIgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUERTTV9QQV9FVkVOVF9DQUxMQkFDS19DICAgICAgICAgICAgICAgICAgICAoMHgxRTMgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUERTTV9OT1RJRllfVkVSSUZZX1JFUVVFU1RfQyAgICAgICAgICAgICAgICAoMHgxRTQgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUERTTV9SRVNFUlZFRDFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxRTUgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUERTTV9SRVNFUlZFRDJfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxRTYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTZWFyY2hlciBEZW1vZHVsYXRpb24gU3RhdHVzIGxvZyAqLworI2RlZmluZSBMT0dfU1JDSF9ERU1PRF9TVEFUVVNfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxRTcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTZWFyY2hlciBDYWxsIFN0YXRpc3RpY3MgbG9nICovCisjZGVmaW5lIExPR19TUkNIX0NBTExfU1RBVElTVElDU19DICAgICAgICAgICAgICAgICAgICAgICgweDFFOCArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBNUy1NUEMgRm9yd2FyZCBsaW5rICovCisjZGVmaW5lIExPR19NU19NUENfRldEX0xJTktfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFFOSArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBNUy1NUEMgUmV2ZXJzZSBsaW5rICovCisjZGVmaW5lIExPR19NU19NUENfUkVWX0xJTktfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFFQSArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIERhdGEgKi8KKyNkZWZpbmUgTE9HX0RBVEFfUFJPVE9DT0xfTE9HR0lOR19DICAgICAgICAgICAgICAgICAgICAgKDB4MUVCICsgTE9HXzFYX0JBU0VfQykKKworLyogTWVkaWFGTE8gcmVzZXJ2ZWQgbG9nIGNvZGVzICovCisjZGVmaW5lIExPR19NRkxPX1JFU0VSVkVEX0NPREVTX0JBU0VfQyAgICAgICAgICAgICAgICAgICgweDFFQyArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19NRkxPX0xBU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg5OSArIExPR19NRkxPX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworLyogR1BTIGRlbW9kdWxhdGlvbiB0cmFja2luZyBoZWFkZXIgaW5mbyAqLworI2RlZmluZSBMT0dfR1BTX0RFTU9EX1RSQUNLSU5HX0hFQURFUl9DICAgICAgICAgICAgICAgICAoMHgyNTAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgZGVtb2R1bGF0aW9uIHRyYWNraW5nIHJlc3VsdHMgKi8KKyNkZWZpbmUgTE9HX0dQU19ERU1PRF9UUkFDS0lOR19DICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjUxICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIGJpdCBlZGdlIGxvZ3MgZnJvbSBkZW1vZCB0cmFja2luZyAqLworI2RlZmluZSBMT0dfR1BTX0RFTU9EX0JJVF9FREdFX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNTIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgZGVtb2R1bGF0aW9uIHNvZnQgZGVjaXNpb25zICovCisjZGVmaW5lIExPR19HUFNfREVNT0RfU09GVF9ERUNJU0lPTlNfQyAgICAgICAgICAgICAgICAgICgweDI1MyArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBwb3N0LXByb2Nlc3NlZCBkZW1vZCB0cmFja2luZyByZXN1bHRzICovCisjZGVmaW5lIExPR19HUFNfREVNT0RfVFJBQ0tJTkdfUE9TVF9QUk9DX0MgICAgICAgICAgICAgICgweDI1NCArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBzdWJmcmFtZSBsb2cgKi8KKyNkZWZpbmUgTE9HX0dQU19ERU1PRF9TVUJGUkFNRV9DICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjU1ICsgTE9HXzFYX0JBU0VfQykKKworLyogRi1DUENDSCBRdWFsaXR5IEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GX0NQQ0NIX1FVQUxJVFlfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICgweDI1NiArIExPR18xWF9CQVNFX0MpCisKKy8qIFJldmVyc2UgUERDQ0gvUERDSCBGcmFtZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfUl9QRENDSF9SX1BEQ0hfRlJBTUVfSU5GT19DICAgICAgICAgICAgICAgICAoMHgyNTcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGb3J3YXJkIEcgQ2hhbm5lbCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRl9HQ0hfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNTggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGb3J3YXJkIEcgQ2hhbm5lbCBGcmFtZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRl9HQ0hfRlJBTUVfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNTkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGb3J3YXJkIFJDIENoYW5uZWwgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZfUkNDSF9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjVBICsgTE9HXzFYX0JBU0VfQykKKworLyogRm9yd2FyZCBBQ0sgQ2hhbm5lbCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRl9BQ0tDSF9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNUIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGb3J3YXJkIEFDSyBDaGFubmVsIEFDS0RBIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GX0FDS0NIX0FDS0RBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDI1QyArIExPR18xWF9CQVNFX0MpCisKKy8qIFJldmVyc2UgUkVRIENoYW5uZWwgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1JfUkVRQ0hfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjVEICsgTE9HXzFYX0JBU0VfQykKKworLyogU2xlZXAgVGFzayBTdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19TTEVFUF9TVEFUU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDI1RSArIExPR18xWF9CQVNFX0MpCisKKy8qIFNsZWVwIGNvbnRyb2xsZXIgc3RhdGlzdGljcyAxWCAqLworI2RlZmluZSBMT0dfMVhfU0xFRVBfQ09OVFJPTExFUl9TVEFUU19DICAgICAgICAgICAgICAgICAoMHgyNUYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTbGVlcCBjb250cm9sbGVyIHN0YXRpc3RpY3MgSERSICovCisjZGVmaW5lIExPR19IRFJfU0xFRVBfQ09OVFJPTExFUl9TVEFUU19DICAgICAgICAgICAgICAgICgweDI2MCArIExPR18xWF9CQVNFX0MpCisKKy8qIFNsZWVwIGNvbnRyb2xsZXIgc3RhdGlzdGljcyBHU00gKi8KKyNkZWZpbmUgTE9HX0dTTV9TTEVFUF9DT05UUk9MTEVSX1NUQVRTX0MgICAgICAgICAgICAgICAgKDB4MjYxICsgTE9HXzFYX0JBU0VfQykKKworLyogU2xlZXAgY29udHJvbGxlciBzdGF0aXN0aWNzIFdDRE1BICovCisjZGVmaW5lIExPR19XQ0RNQV9TTEVFUF9DT05UUk9MTEVSX1NUQVRTX0MgICAgICAgICAgICAgICgweDI2MiArIExPR18xWF9CQVNFX0MpCisKKy8qIFNsZWVwIHRhc2sgYW5kIGNvbnRyb2xsZXIgcmVzZXJ2ZWQgbG9ncyAqLworI2RlZmluZSBMT0dfU0xFRVBfQVBQU19TVEFUU19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNjMgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfU0xFRVBfU1RBVFNfUkVTRVJWRUQyX0MgICAgICAgICAgICAgICAgICAgICAoMHgyNjQgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfU0xFRVBfU1RBVFNfUkVTRVJWRUQzX0MgICAgICAgICAgICAgICAgICAgICAoMHgyNjUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEViBJbmZvcm1hdGlvbiBwbGFjZWhvbGRlciBjaGFubmVsIGxvZ3MgKi8KKyNkZWZpbmUgTE9HX1BEQ0NIX0xPX1NFTEVDVEVEX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjY2ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BEQ0NIX0hJX1NFTEVDVEVEX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjY3ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1dBTFNIX1NFTEVDVEVEX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjY4ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BEQ0hfQkVfU0VMRUNURURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjY5ICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BEQ0NIX0xMUl9TRUxFQ1RFRF9DICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjZBICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX0NRSV9BQ0tfTE9fU0VMRUNURURfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4MjZCICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX0NRSV9BQ0tfSElfU0VMRUNURURfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4MjZDICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1JMX0dBSU5fU0VMRUNURURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjZEICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BEQ0NIMF9TTkRBX1NFTEVDVEVEX0MgICAgICAgICAgICAgICAgICAgICAgKDB4MjZFICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1BEQ0NIMV9TTkRBX1NFTEVDVEVEX0MgICAgICAgICAgICAgICAgICAgICAgKDB4MjZGICsgTE9HXzFYX0JBU0VfQykKKworLyogNjI0IFdNUyBNZXNzYWdlIExpc3QgKi8KKyNkZWZpbmUgTE9HX1dNU19NRVNTQUdFX0xJU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjcwICsgTE9HXzFYX0JBU0VfQykKKworLyogNjI1IE11bHRpbW9kZSBHZW5lcmljIFNJTSBEcml2ZXIgSW50ZXJmYWNlICovCisjZGVmaW5lIExPR19NTV9HRU5FUklDX1NJTV9EUklWRVJfQyAgICAgICAgICAgICAgICAgICAgICgweDI3MSArIExPR18xWF9CQVNFX0MpCisKKy8qIDYyNiBHZW5lcmljIFNJTSBUb29sa2l0IFRhc2sgKi8KKyNkZWZpbmUgTE9HX0dFTkVSSUNfU0lNX1RPT0xLSVRfVEFTS19DICAgICAgICAgICAgICAgICAgKDB4MjcyICsgTE9HXzFYX0JBU0VfQykKKworLyogNjI3IENhbGwgTWFuYWdlciBQaG9uZSBldmVudHMgbG9nICovCisjZGVmaW5lIExPR19DTV9QSF9FVkVOVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDI3MyArIExPR18xWF9CQVNFX0MpCisKKy8qIDYyOCBXTVMgU2V0IE1lc3NhZ2UgTGlzdCAqLworI2RlZmluZSBMT0dfV01TX1NFVF9NRVNTQUdFX0xJU1RfQyAgICAgICAgICAgICAgICAgICAgICAoMHgyNzQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA2MjktNzA0IEhEUiByZXNlcnZlZCBsb2dzICovCisjZGVmaW5lIExPR19IRFJfUkVTRVJWRURfQ09ERVNfQkFTRV8zX0MgICAgICAgICAgICAgICAgICgweDI3NSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19IRFJfTEFTVF8zX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg3NSArIExPR19IRFJfUkVTRVJWRURfQ09ERVNfQkFTRV8zX0MpCisKKy8qIDcwNSBDYWxsIE1hbmFnZXIgY2FsbCBldmVudCBsb2cgKi8KKyNkZWZpbmUgTE9HX0NNX0NBTExfRVZFTlRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MkMxICsgTE9HXzFYX0JBU0VfQykKKworLyogNzA2LTczOCBRVlAgcmVzZXJ2ZWQgbG9ncyAqLworI2RlZmluZSBMT0dfUVZQX1JFU0VSVkVEX0NPREVTX0JBU0VfQyAgICAgICAgICAgICAgICAgICAoMHgyQzIgKyBMT0dfMVhfQkFTRV9DKQorI2RlZmluZSBMT0dfUVZQX0xBU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzIgKyBMT0dfUVZQX1JFU0VSVkVEX0NPREVTX0JBU0VfQykKKworLyogNzM5IEdQUyBQRSBQb3NpdGlvbiBSZXBvcnQgbG9nICovCisjZGVmaW5lIExPR19HUFNfUEVfUE9TSVRJT05fUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgICgweDJFMyArIExPR18xWF9CQVNFX0MpCisKKy8qIDc0MCBHUFMgUEUgUG9zaXRpb24gUmVwb3J0IEV4dGVuZGVkIGxvZyAqLworI2RlZmluZSBMT0dfR1BTX1BFX1BPU0lUSU9OX1JFUE9SVF9FWFRfQyAgICAgICAgICAgICAgICAoMHgyRTQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA3NDEgbG9nICovCisjZGVmaW5lIExPR19NRERJX0hPU1RfU1RBVFNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDJFNSArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBEZWNvZGVkIEVwaGVtZXJpcyAqLworI2RlZmluZSBMT0dfR1BTX0RFQ09ERURfRVBIRU1FUklTX0MgICAgICAgICAgICAgICAgICAgICAoMHgyRTYgKyBMT0dfMVhfQkFTRV9DKQorIAorLyogR1BTIERlY29kZWQgQWxtYW5hYyAqLworI2RlZmluZSBMT0dfR1BTX0RFQ09ERURfQUxNQU5BQ19DICAgICAgICAgICAgICAgICAgICAgICAoMHgyRTcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBUcmFuc2NlaXZlciBSZXNvdXJjZSBNYW5hZ2VyICovCisjZGVmaW5lIExPR19UUkFOU0NFSVZFUl9SRVNPVVJDRV9NR1JfQyAgICAgICAgICAgICAgICAgICgweDJFOCArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBQb3NpdGlvbiBFbmdpbmUgSW5mbyAqLworI2RlZmluZSBMT0dfR1BTX1BPU0lUSU9OX0VOR0lORV9JTkZPX0MgICAgICAgICAgICAgICAgICAoMHgyRTkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiA3NDYtODEwIFJBUFRPUiByZXNlcnZlZCBsb2cgcmFuZ2UgKi8KKyNkZWZpbmUgTE9HX1JBUFRPUl9SRVNFUlZFRF9DT0RFU19CQVNFX0MgICAgICAgICAgICAgICAgKDB4MkVBICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1JBUFRPUl9MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDY0ICsgTE9HX1JBUFRPUl9SRVNFUlZFRF9DT0RFU19CQVNFX0MpCisKKy8qIFFPUyBTcGVjaWZpY2F0aW9uIExvZ2dpbmcgKi8KKworLyogUU9TIFJlcXVlc3RlZCBMb2cgKi8KKyNkZWZpbmUgTE9HX1FPU19SRVFVRVNURURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzJCICsgTE9HXzFYX0JBU0VfQykKKworLyogUU9TIEdyYW50ZWQgTG9nICovCisjZGVmaW5lIExPR19RT1NfR1JBTlRFRF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMyQyArIExPR18xWF9CQVNFX0MpCisKKy8qIFFPUyBTdGF0ZSBMb2cgKi8KKyNkZWZpbmUgTE9HX1FPU19TVEFURV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzJEICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfUU9TX01PRElGSUVEX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMkUgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19RREpfRU5RVUVVRV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMyRiArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19RREpfREVRVUVVRV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMzMCArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19RREpfVVBEQVRFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMzMSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19RRFRYX0VOQ09ERVJfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMzMiArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19RRFRYX0RFQ09ERVJfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMzMyArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1BPUlRfQVNTSUdOTUVOVF9TVEFUVVNfQyAgICAgICAgICAgICAgICAgICAgKDB4MzM0ICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgcmVzZXJ2ZWQgbG9nIGNvZGVzICovCisjZGVmaW5lIExPR19QU19SRVNFUlZFRF9DT0RFU19CQVNFX0MgICAgICAgICAgICAgICAgICAgICgweDMzNSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QU19MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyNSArIExPR19QU19SRVNFUlZFRF9DKQorCisjZGVmaW5lIExPR19QU19TVEFUX0lQX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDMzNSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QU19TVEFUX0dMT0JBTF9JUFY0X0MgICAgICAgICAgICAgICAgICAgICAgICgweDMzNSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QU19TVEFUX0dMT0JBTF9JUFY2X0MgICAgICAgICAgICAgICAgICAgICAgICgweDMzNiArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QU19TVEFUX0dMT0JBTF9JQ01QVjRfQyAgICAgICAgICAgICAgICAgICAgICgweDMzNyArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QU19TVEFUX0dMT0JBTF9JQ01QVjZfQyAgICAgICAgICAgICAgICAgICAgICgweDMzOCArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QU19TVEFUX0dMT0JBTF9UQ1BfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDMzOSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19QU19TVEFUX0dMT0JBTF9VRFBfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDMzQSArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGRlc2NyaWJlIGFsbCBUQ1AgaW5zdGFuY2VzICovCisjZGVmaW5lIExPR19QU19TVEFUX0RFU0NfQUxMX1RDUF9JTlNUX0MgICAgICAgICAgICAgICAgICgweDMzQiArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGRlc2NyaWJlIGFsbCBtZW1vcnkgcG9vbCBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfREVTQ19BTExfTUVNX1BPT0xfSU5TVF9DICAgICAgICAgICAgKDB4MzNDICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgZGVzY3JpYmUgYWxsIElGQUNFIGluc3RhbmNlcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9ERVNDX0FMTF9JRkFDRV9JTlNUX0MgICAgICAgICAgICAgICAoMHgzM0QgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBkZXNjcmliZSBhbGwgUFBQIGluc3RhbmNlcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9ERVNDX0FMTF9QUFBfSU5TVF9DICAgICAgICAgICAgICAgICAoMHgzM0UgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBkZXNjcmliZSBhbGwgQVJQIGluc3RhbmNlcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9ERVNDX0FMTF9BUlBfSU5TVF9DICAgICAgICAgICAgICAgICAoMHgzM0YgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBkZXNjcmliZSBkZWx0YSBpbnN0YW5jZSAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9ERVNDX0RFTFRBX0lOU1RfQyAgICAgICAgICAgICAgICAgICAoMHgzNDAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBpbnN0YW5jZSBUQ1Agc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9UQ1BfSU5TVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNDEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBpbnN0YW5jZSBVRFAgc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9VRFBfSU5TVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNDIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBpbnN0YW5jZSBQUFAgc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9QUFBfSU5TVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNDMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBpbnN0YW5jZSBJRkFDRSBzdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19QU19TVEFUX0lGQUNFX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDM0NCArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGluc3RhbmNlIG1lbW9yeSBzdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19QU19TVEFUX01FTV9JTlNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM0NSArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGluc3RhbmNlIGZsb3cgc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9GTE9XX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNDYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBpbnN0YW5jZSBwaHlzaWNhbCBsaW5rIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfUEhZU19MSU5LX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgKDB4MzQ3ICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgaW5zdGFuY2UgQVJQIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfQVJQX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzQ4ICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgaW5zdGFuY2UgTExDIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfTExDX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzQ5ICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgaW5zdGFuY2UgSVBIQyBzdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19QU19TVEFUX0lQSENfSU5TVF9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDM0QSArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGluc3RhbmNlIFJPSEMgc3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9ST0hDX0lOU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNEIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBpbnN0YW5jZSBSU1ZQIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfUlNWUF9JTlNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzRDICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgZGVzY3JpYmUgYWxsIExMQyBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfREVTQ19BTExfTExDX0lOU1RfQyAgICAgICAgICAgICAgICAgKDB4MzREICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgZGVzY3JpYmUgYWxsIFJTVlAgaW5zdGFuY2VzICovCisjZGVmaW5lIExPR19QU19TVEFUX0RFU0NfQUxMX1JTVlBfSU5TVF9DICAgICAgICAgICAgICAgICgweDM0RSArIExPR18xWF9CQVNFX0MpCisKKy8qIENhbGwgTWFuYWdlciBTZXJ2aW5nIFN5c3RlbSBldmVudCBsb2cgKi8KKyNkZWZpbmUgTE9HX0NNX1NTX0VWRU5UX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzRGICsgTE9HXzFYX0JBU0VfQykKKworLyogVmNUY3hvIG1hbmFnZXKScyBhdXRvbWF0aWMgZnJlcXVlbmN5IGNvbnRyb2wgbG9nICovCisjZGVmaW5lIExPR19UQ1hPTUdSX0FGQ19EQVRBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM1MCArIExPR18xWF9CQVNFX0MpCisKKy8qIENsb2NrIHRyYW5zYWN0aW9ucyBhbmQgZ2VuZXJhbCBjbG9ja3Mgc3RhdHVzIGxvZyAqLworI2RlZmluZSBMT0dfQ0xPQ0tfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNTEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgc2VhcmNoIHByb2Nlc3NlZCBwZWFrIHJlc3VsdHMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgc2VhcmNoIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgTE9HX0dQU19QUk9DRVNTRURfUEVBS19DICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzUyICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfTURTUF9MT0dfQ0hVTktTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNTMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQZXJpb2RpYyBSU1NJIHVwZGF0ZSBsb2cgKi8KKyNkZWZpbmUgTE9HX1dMQU5fUlNTSV9VUERBVEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzU0ICsgTE9HXzFYX0JBU0VfQykKKworLyogUGVyaW9kaWMgTGluayBMYXllciBzdGF0aXN0aWNzIGxvZyAqLworI2RlZmluZSBMT0dfV0xBTl9MTF9TVEFUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNTUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBRT1MgRXh0ZW5kZWQgU3RhdGUgTG9nICovCisjZGVmaW5lIExPR19RT1NfU1RBVEVfRVhfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM1NiArIExPR18xWF9CQVNFX0MpCisKKy8qIEJsdWV0b290aCBob3N0IEhDSSB0cmFuc21pdHRlZCBkYXRhICovCisjZGVmaW5lIExPR19CVF9IT1NUX0hDSV9UWF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM1NyArIExPR18xWF9CQVNFX0MpCisKKy8qIEJsdWV0b290aCBob3N0IEhDSSByZWNlaXZlZCBkYXRhICovCisjZGVmaW5lIExPR19CVF9IT1NUX0hDSV9SWF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM1OCArIExPR18xWF9CQVNFX0MpCisKKy8qIEludGVybmFsIC0gR1BTIFBFIFBvc2l0aW9uIFJlcG9ydCBQYXJ0IDMgKi8KKyNkZWZpbmUgTE9HX0dQU19QRV9QT1NJVElPTl9SRVBPUlRfUEFSVDNfQyAgICAgICAgICAgICAgKDB4MzU5ICsgTE9HXzFYX0JBU0VfQykKKworLyogRXh0ZW5kZWQgbG9nIGNvZGUgd2hpY2ggbG9ncyByZXF1ZXN0ZWQgUW9TICovCisjZGVmaW5lIExPR19RT1NfUkVRVUVTVEVEX0VYX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM1QSArIExPR18xWF9CQVNFX0MpCisKKy8qIEV4dGVuZGVkIGxvZyBjb2RlIHdoaWNoIGxvZ3MgZ3JhbnRlZCBRb1MgKi8KKyNkZWZpbmUgTE9HX1FPU19HUkFOVEVEX0VYX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzVCICsgTE9HXzFYX0JBU0VfQykKKworLyogRXh0ZW5kZWQgbG9nIGNvZGUgd2hpY2ggbG9ncyBtb2RpZmllZCBRb1MgKi8KKyNkZWZpbmUgTE9HX1FPU19NT0RJRklFRF9FWF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzVDICsgTE9HXzFYX0JBU0VfQykKKworLyogQnVzIE1vbml0b3IgUHJvZmlsaW5nIEluZm8gKi8KKyNkZWZpbmUgTE9HX0JVU19NT05fUFJPRl9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzVEICsgTE9HXzFYX0JBU0VfQykKKworLyogUGlsb3QgUGhhc2UgTWVhc3VyZW1lbnQgU2VhcmNoIHJlc3VsdHMgKi8KKyNkZWZpbmUgTE9HX1NSQ0hfUFBNX1JFU19WRVJfMl9DICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzVFICsgTE9HXzFYX0JBU0VfQykKKworLyogUGlsb3QgUGhhc2UgTWVhc3VyZW1lbnQgRGF0YSBCYXNlICovCisjZGVmaW5lIExPR19TUkNIX1BQTV9EQl9WRVJfMl9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDM1RiArIExPR18xWF9CQVNFX0MpCisKKy8qIFBpbG90IFBoYXNlIE1lYXN1cmVtZW50IHN0YXRlIG1hY2hpbmUgKi8KKyNkZWZpbmUgTE9HX1BQTV9TTV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzYwICsgTE9HXzFYX0JBU0VfQykKKworLyogUm9idXN0IEhlYWRlciBDb21wcmVzc2lvbiAtIENvbXByZXNzb3IgKi8KKyNkZWZpbmUgTE9HX1JPSENfQ09NUFJFU1NPUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzYxICsgTE9HXzFYX0JBU0VfQykKKworLyogUm9idXN0IEhlYWRlciBDb21wcmVzc2lvbiAtIERlY29tcHJlc3NvciAqLworI2RlZmluZSBMT0dfUk9IQ19ERUNPTVBSRVNTT1JfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNjIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSb2J1c3QgSGVhZGVyIENvbXByZXNzaW9uIC0gRmVlZGJhY2sgQ29tcHJlc3NvciAqLworI2RlZmluZSBMT0dfUk9IQ19GRUVEQkFDS19DT01QUkVTU09SX0MgICAgICAgICAgICAgICAgICAoMHgzNjMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSb2J1c3QgSGVhZGVyIENvbXByZXNzaW9uIC0gRmVlZGJhY2sgRGVjb21wcmVzc29yICovCisjZGVmaW5lIExPR19ST0hDX0ZFRURCQUNLX0RFQ09NUFJFU1NPUl9DICAgICAgICAgICAgICAgICgweDM2NCArIExPR18xWF9CQVNFX0MpCisKKy8qIEJsdWV0b290aCBIQ0kgY29tbWFuZHMgKi8KKyNkZWZpbmUgTE9HX0JUX0hDSV9DTURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzY1ICsgTE9HXzFYX0JBU0VfQykKKworLyogQmx1ZXRvb3RoIEhDSSBldmVudHMgKi8KKyNkZWZpbmUgTE9HX0JUX0hDSV9FVl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzY2ICsgTE9HXzFYX0JBU0VfQykKKworLyogQmx1ZXRvb3RoIEhDSSBUcmFuc21pdHRlZCBBQ0wgZGF0YSAqLworI2RlZmluZSBMT0dfQlRfSENJX1RYX0FDTF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNjcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBCbHVldG9vdGggSENJIFJlY2VpdmVkIEFDTCBkYXRhICovCisjZGVmaW5lIExPR19CVF9IQ0lfUlhfQUNMX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM2OCArIExPR18xWF9CQVNFX0MpCisKKy8qIEJsdWV0b290aCBTT0MgSDQgRGVlcCBTbGVlcCAqLworI2RlZmluZSBMT0dfQlRfU09DX0g0RFNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzNjkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTVRTIHRvIENETUEgSGFuZG92ZXIgTWVzc2FnZSAqLworI2RlZmluZSBMT0dfVU1UU19UT19DRE1BX0hBTkRPVkVSX01TR19DICAgICAgICAgICAgICAgICAoMHgzNkEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHcmFwaGljIEV2ZW50IERhdGEgKi8KKyNkZWZpbmUgTE9HX1BST0ZJTEVSX0dSQVBISUNfREFUQV9DICAgICAgICAgICAgICAgICAgICAgKDB4MzZCICsgTE9HXzFYX0JBU0VfQykKKworLyogQXVkaW8gRXZlbnQgRGF0YSAqLworI2RlZmluZSBMT0dfUFJPRklMRVJfQVVESU9fREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAoMHgzNkMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgU3BlY3RyYWwgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0dQU19TUEVDVFJBTF9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzZEICsgTE9HXzFYX0JBU0VfQykKKworLyogQUhCIFBlcmZvcm1hbmNlIE1vbml0b3IgTE9HIGRhdGEgKi8KKyNkZWZpbmUgTE9HX0FQTV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MzZFICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIENsb2NrIFJlcG9ydCAqLworI2RlZmluZSBMT0dfQ09OVkVSR0VEX0dQU19DTE9DS19SRVBPUlRfQyAgICAgICAgICAgICAgICAoMHgzNkYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgUG9zaXRpb24gUmVwb3J0ICovCisjZGVmaW5lIExPR19DT05WRVJHRURfR1BTX1BPU0lUSU9OX1JFUE9SVF9DICAgICAgICAgICAgICgweDM3MCArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBNZWFzdXJlbWVudCBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0NPTlZFUkdFRF9HUFNfTUVBU1VSRU1FTlRfUkVQT1JUX0MgICAgICAgICAgKDB4MzcxICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIFJGIFN0YXR1cyBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0NPTlZFUkdFRF9HUFNfUkZfU1RBVFVTX1JFUE9SVF9DICAgICAgICAgICAgKDB4MzcyICsgTE9HXzFYX0JBU0VfQykKKworLyogVk9JUCBUbyBDRE1BIEhhbmRvdmVyIE1lc3NhZ2UgLSBPYnNvbGV0ZWQgYnkgMHgxMzhCIC0gMHgxMzhEICovCisjZGVmaW5lIExPR19WT0lQX1RPX0NETUFfSEFORE9WRVJfTVNHX0MgICAgICAgICAgICAgICAgICgweDM3MyArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBQcmVzY3JpYmVkIER3ZWxsIFJlc3VsdCAqLworI2RlZmluZSBMT0dfR1BTX1BSRVNDUklCRURfRFdFTExfUkVTVUxUX0MgICAgICAgICAgICAgICAoMHgzNzQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIElQQyBEYXRhICovCisjZGVmaW5lIExPR19DR1BTX0lQQ19EQVRBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDM3NSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTm9uIElQQyBEYXRhICovCisjZGVmaW5lIExPR19DR1BTX05PTl9JUENfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDM3NiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgU2Vzc2lvbiBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUkVQX0VWVF9MT0dfUEFDS0VUX0MgICAgICAgICAgICAgICAgICAgKDB4Mzc3ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIEdldCBQb3NpdGlvbiAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX0dFVF9QT1NJVElPTl9DICAgICAgICAgICAgICAgICAgICAoMHgzNzggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gU2V0IFBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9TRVRfUEFSQU1FVEVSU19DICAgICAgICAgICAgICAgICAgKDB4Mzc5ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIEVuZCBTZXNzaW9uICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fRU5EX1NFU1NJT05fQyAgICAgICAgICAgICAgICAgICAgICgweDM3QSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBOb3RpZnkgVmVyaWZ5IFJlc3BvbnNlICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fTk9USUZZX1ZFUklGWV9SRVNQX0MgICAgICAgICAgICAgICgweDM3QiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBQb3NpdGlvbiBSZXBvcnQgQ2FsbGJhY2sgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9QT1NJVElPTl9SRVBPUlRfQ0FMTEJBQ0tfQyAgICAgICAgKDB4MzdDICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIFBEIEV2ZW50IENhbGxiYWNrICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fUERfRVZFTlRfQ0FMTEJBQ0tfQyAgICAgICAgICAgICAgICgweDM3RCArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBQQSBFdmVudCBDYWxsYmFjayAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX1BBX0VWRU5UX0NBTExCQUNLX0MgICAgICAgICAgICAgICAoMHgzN0UgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gTm90aWZ5IFZlcmlmeSBSZXF1ZXN0IENhbGxiYWNrICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fTk9USUZZX1ZFUklGWV9SRVFVRVNUX0MgICAgICAgICAgICgweDM3RiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBQRCBDb21tYW5kIEVycm9yIENhbGxiYWNrICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fUERfQ01EX0VSUl9DQUxMQkFDS19DICAgICAgICAgICAgICgweDM4MCArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBQQSBDb21tYW5kIEVycm9yIENhbGxiYWNrICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fUEFfQ01EX0VSUl9DQUxMQkFDS19DICAgICAgICAgICAgICgweDM4MSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBQb3NpdGlvbiBFcnJvciAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX1BPU19FUlJPUl9DICAgICAgICAgICAgICAgICAgICAgICAoMHgzODIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gRXh0ZW5kZWQgU3RhdHVzIFBvc2l0aW9uIFJlcG9ydCAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX0VYVF9TVEFUVVNfUE9TX1JFUE9SVF9DICAgICAgICAgICAoMHgzODMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gRXh0ZW5kZWQgU3RhdHVzIE5NRUEgUmVwb3J0ICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fRVhUX1NUQVRVU19OTUVBX1JFUE9SVF9DICAgICAgICAgICgweDM4NCArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBFeHRlbmRlZCBTdGF0dXMgTWVhc3VyZW1lbnQgUmVwb3J0ICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fRVhUX1NUQVRVU19NRUFTX1JFUE9SVF9DICAgICAgICAgICgweDM4NSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUmVwb3J0IFNlcnZlciBUWCBQYWNrZXQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUkVQX1NWUl9UWF9MT0dfUEFDS0VUX0MgICAgICAgICAgICAgICAgKDB4Mzg2ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBSZXBvcnQgU2VydmVyIFJYIFBhY2tldCAqLworI2RlZmluZSBMT0dfQ0dQU19SRVBfU1ZSX1JYX0xPR19QQUNLRVRfQyAgICAgICAgICAgICAgICAoMHgzODcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTVRTIFRvIENETUEgSGFuZG92ZXIgUGFnaW5nIENoYW5uZWwgTWVzc2FnZSAqLworI2RlZmluZSBMT0dfVU1UU19UT19DRE1BX0hBTkRPVkVSX1BDSF9NU0dfQyAgICAgICAgICAgICAoMHgzODggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTVRTIFRvIENETUEgSGFuZG92ZXIgVHJhZmZpYyBDaGFubmVsIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX1VNVFNfVE9fQ0RNQV9IQU5ET1ZFUl9UQ0hfTVNHX0MgICAgICAgICAgICAgKDB4Mzg5ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ29udmVyZ2VkIEdQUyBJUSBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0NPTlZFUkdFRF9HUFNfSVFfUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgKDB4MzhBICsgTE9HXzFYX0JBU0VfQykKKworLyogVk9JUCBUbyBDRE1BIFBhZ2luZyBDaGFubmVsIEhhbmRvdmVyIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX1ZPSVBfVE9fQ0RNQV9QQ0hfSEFORE9WRVJfTVNHX0MgICAgICAgICAgICAgKDB4MzhCICsgTE9HXzFYX0JBU0VfQykKKworLyogVk9JUCBUbyBDRE1BIEFjY2VzcyBDaGFubmVsIEhhbmRvdmVyIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX1ZPSVBfVE9fQ0RNQV9BQ0hfSEFORE9WRVJfTVNHX0MgICAgICAgICAgICAgKDB4MzhDICsgTE9HXzFYX0JBU0VfQykKKworLyogVk9JUCBUbyBDRE1BIEZvcndhcmQgVHJhZmZpYyBDaGFubmVsIEhhbmRvdmVyIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX1ZPSVBfVE9fQ0RNQV9GVENfSEFORE9WRVJfTVNHX0MgICAgICAgICAgICAgKDB4MzhEICsgTE9HXzFYX0JBU0VfQykKKworLyogUU1JIHJlc2VydmVkIGxvZ3MgKi8KKyNkZWZpbmUgTE9HX1FNSV9SRVNFUlZFRF9DT0RFU19CQVNFX0MgICAgICAgICAgICAgICAgICAgKDB4MzhFICsgTE9HXzFYX0JBU0VfQykKKyNkZWZpbmUgTE9HX1FNSV9MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMyICsgTE9HX1FNSV9SRVNFUlZFRF9DT0RFU19CQVNFX0MpCisKKy8qIFFPUyBJbmZvIENvZGUgVXBkYXRlIExvZyAqLworI2RlZmluZSBMT0dfUU9TX0lORk9fQ09ERV9VUERBVEVfQyAgICAgICAgICAgICAgICAgICAgICAoMHgzQUYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBUcmFuc21pdChVcGxpbmspIFZvY29kZXIgUENNIFBhY2tldCBMb2cgKi8KKyNkZWZpbmUgTE9HX1RYX1BDTV9QQUNLRVRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0IwICsgTE9HXzFYX0JBU0VfQykKKworLyogQXVkaW8gVm9jb2RlciBEYXRhIFBhdGhzICovCisjZGVmaW5lIExPR19BVURWT0NfREFUQV9QQVRIU19QQUNLRVRfQyAgICAgICAgICAgICAgICAgICgweDNCMCArIExPR18xWF9CQVNFX0MpCisKKy8qIFJlY2VpdmUoRG93bmxpbmspIFZvY29kZXIgUENNIFBhY2tldCBMb2cgKi8KKyNkZWZpbmUgTE9HX1JYX1BDTV9QQUNLRVRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0IxICsgTE9HXzFYX0JBU0VfQykKKworLyogQ1JDIG9mIFlVViBmcmFtZSBsb2cgKi8KKyNkZWZpbmUgTE9HX0RFQ19DUkNfRlJBTUVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0IyICsgTE9HXzFYX0JBU0VfQykKKworLyogRkxVVEUgU2Vzc2lvbiBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRkxVVEVfU0VTU0lPTl9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQjMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGTFVURSBBRFAgRmlsZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRkxVVEVfQURQX0ZJTEVfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAoMHgzQjQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGTFVURSBGaWxlIFJlcXVlc3QgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZMVVRFX0ZJTEVfUkVRX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgKDB4M0I1ICsgTE9HXzFYX0JBU0VfQykKKworLyogRkxVVEUgRkRUIEluc3RhbmNlIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GTFVURV9GRFRfSU5TVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNCNiArIExPR18xWF9CQVNFX0MpCisKKy8qIEZMVVRFIEZEVCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRkxVVEVfRkRUX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQjcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGTFVURSBGaWxlIExvZyBQYWNrZXQgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZMVVRFX0ZJTEVfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0I4ICsgTE9HXzFYX0JBU0VfQykKKworLyogM0cgMVggUGFyYW1ldGVyIE92ZXJoZWFkIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19WT0lQX1RPX0NETUFfM0cxWF9QQVJBTUVURVJTX0MgICAgICAgICAgICAgICgweDNCOSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUUgSm9iIEluZm8gKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUVfSk9CX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0JBICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBNRSBTViBMaXN0cyAqLworI2RlZmluZSBMT0dfQ1BHU19NRV9TVl9MSVNUU19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQkIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGbGV4aWJsZSBQcm9maWxpbmcgU3RhdHVzICovCisjZGVmaW5lIExPR19QUk9GRElBR19HRU5fU1RBVFVTX0MgICAgICAgICAgICAgICAgICAgICAgICgweDNCQyArIExPR18xWF9CQVNFX0MpCisKKy8qIEZsZXhpYmxlIFByb2ZpbGluZyBSZXN1bHRzICovCisjZGVmaW5lIExPR19QUk9GRElBR19HRU5fUFJPRl9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDNCRCArIExPR18xWF9CQVNFX0MpCisKKy8qIEZMVVRFIEFEUCBGaWxlIENvbnRlbnQgTG9nIFBhY2tldCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfRkxVVEVfQURQX0ZJTEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzQkUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBGTFVURSBGRFQgSW5zdGFuY2UgRmlsZSBDb250ZW50IExvZyBQYWNrZXQgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZMVVRFX0ZEVF9JTlNUX0ZJTEVfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4M0JGICsgTE9HXzFYX0JBU0VfQykKKworLyogRkxVVEUgRkRUIEVudHJpZXMgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0ZMVVRFX0ZEVF9FTlRSSUVTX0lORk9fQyAgICAgICAgICAgICAgICAgICAgKDB4M0MwICsgTE9HXzFYX0JBU0VfQykKKworLyogRkxVVEUgRmlsZSBDb250ZW50cyBMb2cgUGFja2V0IEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19GTFVURV9GSUxFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNDMSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUUgVGltZS1UcmFuc2ZlciBJbmZvICovCisjZGVmaW5lIExPR19DR1BTX01FX1RJTUVfVFJBTlNGRVJfSU5GT19DICAgICAgICAgICAgICAgICgweDNDMiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUUgVU1UUyBUaW1lLVRhZ2dpbmcgSW5mbyAqLworI2RlZmluZSBMT0dfQ0dQU19NRV9VTVRTX1RJTUVfVEFHR0lOR19JTkZPX0MgICAgICAgICAgICAoMHgzQzMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIE1FIEdlbmVyaWMgVGltZSBFc3RpbWF0ZSBQdXQgbG5mbyAqLworI2RlZmluZSBMT0dfQ0dQU19NRV9USU1FX0VTVF9QVVRfSU5GT19DICAgICAgICAgICAgICAgICAoMHgzQzQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIE1FIEdlbmVyaWMgRnJlcSBFc3RpbWF0ZSBQdXQgbG5mbyAqLworI2RlZmluZSBMT0dfQ0dQU19NRV9GUkVRX0VTVF9QVVRfSU5GT19DICAgICAgICAgICAgICAgICAoMHgzQzUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFNsb3cgQ2xvY2sgUmVwb3J0ICovCisjZGVmaW5lIExPR19DR1BTX1NMT1dfQ0xPQ0tfUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgICgweDNDNiArIExPR18xWF9CQVNFX0MpCisKKy8qIENvbnZlcmdlZCBHUFMgTWVkaXVtIEdyaWQgKi8KKyNkZWZpbmUgTE9HX0NPTlZFUkdFRF9HUFNfTUVESVVNX0dSSURfQyAgICAgICAgICAgICAgICAgKDB4M0M3ICsgTE9HXzFYX0JBU0VfQykKKworLyogU3RhdGljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXIgb3IgZGV2aWNlICovCisjZGVmaW5lIExPR19TTlNEX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNDOCArIExPR18xWF9CQVNFX0MpCisKKy8qIER5bmFtaWMgc3RhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBvciBkcml2ZXIgKi8KKyNkZWZpbmUgTE9HX1NOU0RfU1RBVEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0M5ICsgTE9HXzFYX0JBU0VfQykKKworLyogRGF0YSBmcm9tIGEgZHJpdmVyICovCisjZGVmaW5lIExPR19TTlNEX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNDQSArIExPR18xWF9CQVNFX0MpCisjZGVmaW5lIExPR19TTlNEX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNDQSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgQ2VsbCBEQiBDZWxsIENoYW5nZSBJbmZvICovCisjZGVmaW5lIExPR19DR1BTX0NFTExEQl9DRUxMX0NIQU5HRV9JTkZPX0MgICAgICAgICAgICAgICgweDNDQiArIExPR18xWF9CQVNFX0MpCisKKy8qIHhTY2FsYXIgWVVWIGZyYW1lIGxvZyAqLworI2RlZmluZSBMT0dfREVDX1hTQ0FMRV9ZVVZfRlJBTUVfQyAgICAgICAgICAgICAgICAgICAgICAoMHgzQ0MgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDUkMgb2YgeFNjYWxlZCBZVVYgZnJhbWUgbG9nICovCisjZGVmaW5lIExPR19ERUNfWFNDQUxFX0NSQ19GUkFNRV9DICAgICAgICAgICAgICAgICAgICAgICgweDNDRCArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgRnJlcXVlbmN5IEVzdGltYXRlIFJlcG9ydCAqLworI2RlZmluZSBMT0dfQ0dQU19GUkVRX0VTVF9SRVBPUlRfQyAgICAgICAgICAgICAgICAgICAgICAoMHgzQ0UgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBHUFMgRENNRSBTcmNoIEpvYiBDb21wbGV0ZWQgKi8KKyNkZWZpbmUgTE9HX0dQU19EQ01FX1NSQ0hfSk9CX0NPTVBMRVRFRF9DICAgICAgICAgICAgICAgKDB4M0NGICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBNRSBGYXN0c2NhbiByZXN1bHRzICAqLworI2RlZmluZSBMT0dfQ0dQU19NRV9GQVNUU0NBTl9SRVNVTFRTX0MgICAgICAgICAgICAgICAgICAoMHgzRDAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBYTyBmcmVxdWVuY3kgRXN0aW1hdGlvbiBsb2cgKi8KKyNkZWZpbmUgTE9HX1hPX0ZSRVFfRVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0QxICsgTE9HXzFYX0JBU0VfQykKKworLyogVGN4b21nciBmaWVsZCBjYWxpYnJhdGlvbiBkYXRhICAqLworI2RlZmluZSBMT0dfVENYT01HUl9GSUVMRF9DQUxfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRDIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgQ2FsbCBQcm9jZXNzaW5nIENvbm5lY3Rpb24gQXR0ZW1wdCAqLworI2RlZmluZSBMT0dfVU1CQ1BfQ09OTkVDVElPTl9BVFRFTVBUX0MgICAgICAgICAgICAgICAgICAoMHgzRDMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgQ2FsbCBQcm9jZXNzaW5nIENvbm5lY3Rpb24gUmVsZWFzZSAqLworI2RlZmluZSBMT0dfVU1CQ1BfQ09OTkVDVElPTl9SRUxFQVNFX0MgICAgICAgICAgICAgICAgICAoMHgzRDQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgQ2FsbCBQcm9jZXNzaW5nIFBhZ2UgTWVzc2FnZSAqLworI2RlZmluZSBMT0dfVU1CQ1BfUEFHRV9NRVNTQUdFX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRDUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgQ2FsbCBQcm9jZXNzaW5nIE9WSEQgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1VNQkNQX09WSERfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0Q2ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIENhbGwgUHJvY2Vzc2luZyBTZXNzaW9uIEF0dGVtcHQgKi8KKyNkZWZpbmUgTE9HX1VNQkNQX1NFU1NJT05fQVRURU1QVF9DICAgICAgICAgICAgICAgICAgICAgKDB4M0Q3ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIENhbGwgUHJvY2Vzc2luZyBSb3V0ZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfVU1CQ1BfUk9VVEVfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRDggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgQ2FsbCBQcm9jZXNzaW5nIFN0YXRlIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19VTUJDUF9TVEFURV9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNEOSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBDYWxsIFByb2Nlc3NpbmcgU05QICovCisjZGVmaW5lIExPR19VTUJDUF9TTlBfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNEQSArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgU2Vzc2lvbiBFYXJseSBFeGl0IERlY2lzaW9uICovCisjZGVmaW5lIExPR19DR1BTX1NFU1NJT05fRUFSTFlfRVhJVF9ERUNJU0lPTl9DICAgICAgICAgICgweDNEQiArIExPR18xWF9CQVNFX0MpCisKKy8qIEdQUyBSRiBMaW5lYXJpdHkgU3RhdHVzICovCisjZGVmaW5lIExPR19DR1BTX01FX1JGX0xJTkVBUklUWV9JTkZPX0MgICAgICAgICAgICAgICAgICgweDNEQyArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUUgNW1zIElRIFN1bXMgKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUVfNU1TX0lRX1NVTVNfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4M0REICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBNRSAyMG1zIElRIFN1bXMgKi8KKyNkZWZpbmUgTE9HX0NQR1NfTUVfMjBNU19JUV9TVU1TX0MgICAgICAgICAgICAgICAgICAgICAgKDB4M0RFICsgTE9HXzFYX0JBU0VfQykKKworLyogUk9IQyBDb21wcmVzc29yIFN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1JPSENfQ09NUFJFU1NPUl9TVEFUU19DICAgICAgICAgICAgICAgICAgICAgKDB4M0RGICsgTE9HXzFYX0JBU0VfQykKKworLyogUk9IQyBEZWNvbXByZXNzb3IgU3RhdGlzdGljcyAqLworI2RlZmluZSBMT0dfUk9IQ19ERUNPTVBSRVNTT1JfU1RBVFNfQyAgICAgICAgICAgICAgICAgICAoMHgzRTAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTZW5zb3JzIC0gS2FsbWFuIGZpbHRlciBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfU0VOU09SX0tGX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRTEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTZW5zb3JzIC0gSW50ZWdyYXRlZCBtZWFzdXJlbWVudHMgKi8KKyNkZWZpbmUgTE9HX1NFTlNPUl9JTlRfTUVBU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0UyICsgTE9HXzFYX0JBU0VfQykKKworLyogU2Vuc29ycyAtIEJpYXMgY2FsaWJyYXRpb24gdmFsdWVzICovCisjZGVmaW5lIExPR19TRU5TT1JfQklBU19DQUxJQlJBVElPTl9DICAgICAgICAgICAgICAgICAgICgweDNFMyArIExPR18xWF9CQVNFX0MpCisKKy8qIExvZyBjb2RlcyAweDEzRTQtMHgxM0U3IGFyZSBub3QgZm9sbG93aW5nIHN0YW5kYXJkIGxvZyBuYW1pbmcgY29udmVudGlvbiAqLworCisvKiBEVFYgSVNEQi1UIFRyYW5zcG9ydCBTdHJlYW0gUGFja2V0cyAqLworI2RlZmluZSBMT0dfRFRWX0lTREJfVFNfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRTQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEVFYgSVNEQi1UIFBFUyBQYWNrZXRzICovCisjZGVmaW5lIExPR19EVFZfSVNEQl9QRVNfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICgweDNFNSArIExPR18xWF9CQVNFX0MpCisKKy8qIERUViBJU0RCLVQgU2VjdGlvbnMgKi8KKyNkZWZpbmUgTE9HX0RUVl9JU0RCX1NFQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0U2ICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIElTREItVCBCdWZmZXJpbmcgKi8KKyNkZWZpbmUgTE9HX0RUVl9JU0RCX0JVRkZFUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0U3ICsgTE9HXzFYX0JBU0VfQykKKworLyogV0xBTiBTeXN0ZW0gQWNxdWlzaXRpb24gYW5kIEhhbmRvZmYgKi8KKyNkZWZpbmUgTE9HX1dMQU5fU1lTX0FDUV9IT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0U4ICsgTE9HXzFYX0JBU0VfQykKKworLyogV0xBTiBHZW5lcmFsIENvbmZpZ3VyYWJsZSBQYXJhbWV0ZXJzICovCisjZGVmaW5lIExPR19XTEFOX0dFTl9DT05GSUdfUEFSQU1TX0MgICAgICAgICAgICAgICAgICAgICgweDNFOSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBDaGFubmVsIGFuZCBJbnRlcmZlcmVuY2UgRXN0aW1hdGlvbiAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9EUElDSF9DSUVfQyAgICAgICAgICAgICAgICAgICAgICAoMHgzRUEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgTU1TRS9NUkMgRGVtb2R1bGF0ZWQgRGF0YSBTeW1ib2xzIChMb3cpICovCisjZGVmaW5lIExPR19VTUJfUEhZX1JYX0RBVEFfREVNT0RfTE9XX0MgICAgICAgICAgICAgICAgICgweDNFQiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBNTVNFL01SQyBEZW1vZHVsYXRlZCBEYXRhIFN5bWJvbHMgKEhpZ2gpICovCisjZGVmaW5lIExPR19VTUJfUEhZX1JYX0RBVEFfREVNT0RfSElHSF9DICAgICAgICAgICAgICAgICgweDNFQyArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBEQ0ggRGVjb2RlciAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9EQ0hfREVDT0RFUl9DICAgICAgICAgICAgICAgICAgICAoMHgzRUQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgRENIIFN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfRENIX1NUQVRJU1RJQ1NfQyAgICAgICAgICAgICAgICAgICAgKDB4M0VFICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIENxaVBpY2ggUHJvY2Vzc2luZyAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9DUUlQSUNIX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRUYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgTUlNTy9TSU1PIGluIENxaVBpY2ggKEhpZ2gpICovCisjZGVmaW5lIExPR19VTUJfUEhZX1JYX0NRSVBJQ0hfQ0hBTlRBUFNfSElHSF9DICAgICAgICAgICgweDNGMCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBNSU1PL1NJTU8gaW4gQ3F1aVBpY2ggKExvdykgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfQ1FJUElDSF9DSEFOVEFQU19MT1dfQyAgICAgICAgICAgKDB4M0YxICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIFRpbWUtRG9tYWluIENoYW5uZWwgVGFwcyAoSGlnaCkgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfUFBJQ0hfQ0hBTl9FU1RfSElHSF9DICAgICAgICAgICAgKDB4M0YyICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIFRpbWUtRG9tYWluIENoYW5uZWwgVGFwcyAoTG93KSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9QUElDSF9DSEFOX0VTVF9MT1dfQyAgICAgICAgICAgICAoMHgzRjMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQVQgTW9kdWxhdG9yICovCisjZGVmaW5lIExPR19VTUJfUEhZX1RYX1BJQ0hfQ09ORklHX0MgICAgICAgICAgICAgICAgICAgICgweDNGNCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBBVCBNb2R1bGF0b3IgZm9yIFItQUNLIChIaWdoKSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9UWF9BQ0tfSElHSF9DICAgICAgICAgICAgICAgICAgICAgICAoMHgzRjUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQVQgTW9kdWxhdG9yIGZvciBSLUFDSyAoTG93KSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9UWF9BQ0tfTE9XX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRjYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQVQgTW9kdWxhdG9yIGZvciBSLVBJQ0ggKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfVFhfUElDSF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0Y3ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEFUIE1vZHVsYXRvciBmb3IgUi1BQ0ggKEFjY2VzcykgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfVFhfQUNIX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4M0Y4ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEFUIE1vZHVsYXRvciBmb3IgUi1PRERDQ0ggKEhpZ2gpICovCisjZGVmaW5lIExPR19VTUJfUEhZX1RYX09EQ0NIX0hJR0hfQyAgICAgICAgICAgICAgICAgICAgICgweDNGOSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBBVCBNb2R1bGF0b3IgZm9yIFItT0REQ0NIIChMb3cpICovCisjZGVmaW5lIExPR19VTUJfUEhZX1RYX09EQ0NIX0xPV19DICAgICAgICAgICAgICAgICAgICAgICgweDNGQSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBBVCBNb2R1bGF0b3IgZm9yIFItQ0RDQ0ggKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfVFhfUkNEQ0NIX0NPTkZJR19DICAgICAgICAgICAgICAgICAgKDB4M0ZCICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEFUIE1vZHVsYXRvciBmb3IgQ1FJIHNlbnQgb24gUkNEQ0NIICovCisjZGVmaW5lIExPR19VTUJfUEhZX1RYX05PTkZMU1NfQ1FJQ0hfQyAgICAgICAgICAgICAgICAgICgweDNGQyArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBBVCBNb2R1bGF0b3IgZm9yIENRSSBzZW50IG9uIFJDRENDSCAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9UWF9GTFNTX0NRSUNIX0MgICAgICAgICAgICAgICAgICAgICAoMHgzRkQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQVQgTW9kdWxhdG9yIGZvciBQQUNIIHNlbnQgb24gUkNEQ0NIICovCisjZGVmaW5lIExPR19VTUJfUEhZX1RYX1BBSENIX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNGRSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBBVCBNb2R1bGF0b3IgZm9yIFJFUSBzZW50IG9uIFJDRENDSCAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9UWF9SRVFDSF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRkYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgQVQgTW9kdWxhdG9yIGZvciBQU0Qgc2VudCBvbiBSQ0RDQ0ggKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfVFhfUFNEQ0hfQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDAwICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEFUIE1vZHVsYXRvciBmb3IgUi1EQ0ggKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfVFhfRENIX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDAxICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIFRpbWUvRnJlcXVlbmN5L1J4UG93ZXIgRXN0aW1hdGUgKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfVElNRV9GUkVRX1BPV0VSX0VTVElNQVRFX0MgICAgICAgKDB4NDAyICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEZMQ1MgUHJvY2Vzc2luZyAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9GTENTX1BST0NFU1NJTkdfQyAgICAgICAgICAgICAgICAoMHg0MDMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgUEJDQ0ggUHJvY2Vzc2luZyAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9QQkNDSF9QUk9DRVNTSU5HX0MgICAgICAgICAgICAgICAoMHg0MDQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgU0JDQ0ggUHJvY2Vzc2luZyAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9TQkNDSF9QUk9DRVNTSU5HX0MgICAgICAgICAgICAgICAoMHg0MDUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgUVBDSCBQcm9jZXNzaW5nICovCisjZGVmaW5lIExPR19VTUJfUEhZX1JYX1FQQ0hfUFJPQ0VTU0lOR19DICAgICAgICAgICAgICAgICgweDQwNiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBNUkMgRGVtb2R1bGF0ZWQgRGF0YSBTeW1ib2xzIChQcmVhbWJsZSBTQkNDSC9RUENIKSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9TQkNDSF9ERU1PRF9DICAgICAgICAgICAgICAgICAgICAoMHg0MDcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUGh5c2ljYWwgTGF5ZXIgTVJDIERlbW9kdWxhdGVkIERhdGEgU3ltYm9scyAoUHJlYW1ibGUgUEJDQ0gpICovCisjZGVmaW5lIExPR19VTUJfUEhZX1JYX1BCQ0NIX0RFTU9EX0MgICAgICAgICAgICAgICAgICAgICgweDQwOCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBWQ1FJICovCisjZGVmaW5lIExPR19VTUJfUEhZX1JYX1ZDUUlfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQwOSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBQaHlzaWNhbCBMYXllciBBY3F1aXNpdGlvbiBBbGdvcml0aG0gKi8KKyNkZWZpbmUgTE9HX1VNQl9QSFlfUlhfSU5JVElBTF9BQ1FVSVNJVElPTl9DICAgICAgICAgICAgKDB4NDBBICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFBoeXNpY2FsIExheWVyIEhhbmRvZmYgU2VhcmNoIEFsZ29yaXRobSAqLworI2RlZmluZSBMT0dfVU1CX1BIWV9SWF9IQU5ET0ZGX1NFQVJDSF9DICAgICAgICAgICAgICAgICAoMHg0MEIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkYgUkZGRSBDb25maWd1cmF0aW9uIEluZm8gKi8KKyNkZWZpbmUgTE9HX1VNQl9BVF9SRkZFX0NPTkZHX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDBDICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFJGIENhbGlicmF0ZWQgVmFsdWVzIEFmdGVyIFBvd2VydXAgKi8KKyNkZWZpbmUgTE9HX1VNQl9BVF9SRkZFX1JYX0NBTElCX0MgICAgICAgICAgICAgICAgICAgICAgKDB4NDBEICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFJGIEFHQyBCbG9jayBpbiBBY3F1aXNpdGlvbiBNb2RlICovCisjZGVmaW5lIExPR19VTUJfQVRfUkZGRV9SWF9BQ1FfQyAgICAgICAgICAgICAgICAgICAgICAgICgweDQwRSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSRiBBR0MgQmxvY2sgaW4gSWRsZSBNb2RlICovCisjZGVmaW5lIExPR19VTUJfQVRfUkZGRV9SWF9JRExFX0MgICAgICAgICAgICAgICAgICAgICAgICgweDQwRiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSRiBBR0MgQmxvY2sgaW4gQ29ubmVjdGVkIE1vZGUgKi8KKyNkZWZpbmUgTE9HX1VNQl9BVF9SRkZFX1JYX0NPTk5FQ1RFRF9DICAgICAgICAgICAgICAgICAgKDB4NDEwICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFJGIEFHQyBCbG9jayBpbiBDb25uZWN0ZWQgTW9kZSAoRlRNKSAqLworI2RlZmluZSBMT0dfVU1CX0FUX1JGRkVfUlhfQ09OTkVDVEVEX0ZUTV9DICAgICAgICAgICAgICAoMHg0MTEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkYgSmFtbWVyIERldGVjdG9yIEZ1bmN0aW9uYWxpdHkgKi8KKyNkZWZpbmUgTE9HX1VNQl9BVF9SRkZFX1JYX0pBTU1FUl9ERVRFQ1RPUl9GVU5DVElPTkFMSVRZX0MgICgweDQxMiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSRiBKYW1tZXIgRGV0ZWN0b3IgUmVzcG9uc2UgKi8KKyNkZWZpbmUgTE9HX1VNQl9BVF9SRkZFX1JYX0pBTU1FUl9ERVRFQ1RPUl9SRVNQT05TRV9DICAgKDB4NDEzICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFJGIFJGRkUgVFggUG93ZXIgQ29udHJvbCAqLworI2RlZmluZSBMT0dfVU1CX0FUX1JGRkVfVFhfQkVUQV9TQ0FMSU5HX0MgICAgICAgICAgICAgICAoMHg0MTQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgU2VhcmNoZXIgRHVtcCAqLworI2RlZmluZSBMT0dfVU1CX1NFQVJDSEVSX0RVTVBfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MTUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgU3lzdGVtIEFjcXVpcmUgKi8KKyNkZWZpbmUgTE9HX1VNQl9TWVNURU1fQUNRVUlSRV9DICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDE2ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFNldCBNYWludGVuYW5jZSAqLworI2RlZmluZSBMT0dfVU1CX1NFVF9NQUlOVEVOQU5DRV9DICAgICAgICAgICAgICAgICAgICAgICAoMHg0MTcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUVBDSCAqLworI2RlZmluZSBMT0dfVU1CX1FQQ0hfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MTggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgUkxMIEZvcndhcmQgUGFydGlhbCBSUCBQYWNrZXQgKi8KKyNkZWZpbmUgTE9HX1VNQl9STExfRk9SV0FSRF9QQVJUSUFMX1JQX0MgICAgICAgICAgICAgICAgKDB4NDE5ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFJMTCBSZXZlcnNlIFBhcnRpYWwgUlAgUGFja2V0ICovCisjZGVmaW5lIExPR19VTUJfUkxMX1JFVkVSU0VfUEFSVElBTF9SUF9DICAgICAgICAgICAgICAgICgweDQxQSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSTEwgRm9yd2FyZCBTaWduYWwgUGFja2V0ICovCisjZGVmaW5lIExPR19VTUJfUkxMX0ZPUldBUkRfU0lHTkFMX0MgICAgICAgICAgICAgICAgICAgICgweDQxQiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSTEwgUmV2ZXJzZSBTaWduYWwgUGFja2V0ICovCisjZGVmaW5lIExPR19VTUJfUkxMX1JFVkVSU0VfU0lHTkFMX0MgICAgICAgICAgICAgICAgICAgICgweDQxQyArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSTEwgRm9yd2FyZCBTdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19VTUJfUkxMX0ZPUldBUkRfU1RBVFNfQyAgICAgICAgICAgICAgICAgICAgICgweDQxRCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSTEwgUmV2ZXJzZSBTdGF0aXN0aWNzICovCisjZGVmaW5lIExPR19VTUJfUkxMX1JFVkVSU0VfU1RBVFNfQyAgICAgICAgICAgICAgICAgICAgICgweDQxRSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBSTEwgSVJUUCAqLworI2RlZmluZSBMT0dfVU1CX1JMTF9JUlRQX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MUYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgQVAgRm9yd2FyZCBMaW5rIE1BQyBQYWNrZXRzICovCisjZGVmaW5lIExPR19VTUJfQVBfRkxfTUFDX1BBQ0tFVF9DICAgICAgICAgICAgICAgICAgICAgICgweDQyMCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBBUCBSZXZlcnNlIExpbmsgTUFDIFBhY2tldHMgKi8KKyNkZWZpbmUgTE9HX1VNQl9BUF9STF9NQUNfUEFDS0VUX0MgICAgICAgICAgICAgICAgICAgICAgKDB4NDIxICsgTE9HXzFYX0JBU0VfQykKKworLyogR1BTIFBlcmZvcm1hbmNlIFN0YXRpc3RpY3MgbG9nICovCisjZGVmaW5lIExPR19DR1BTX1BFUkZPUk1BTkNFX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgICgweDQyMiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBTZWFyY2hlciBHZW5lcmFsIFN0YXR1cyAqLworI2RlZmluZSBMT0dfVU1CX1NSQ0hfR0VORVJBTF9TVEFUVVNfQyAgICAgICAgICAgICAgICAgICAoMHg0MjMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgU3VwZXJmcmFtZSBTY2hlZHVsZXIgKi8KKyNkZWZpbmUgTE9HX1VNQl9TVVBFUkZSQU1FX1NDSEVEVUxFUl9DICAgICAgICAgICAgICAgICAgKDB4NDI0ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIFNlY3RvciBMaXN0ICovCisjZGVmaW5lIExPR19VTUJfU0VDVE9SX0xJU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQyNSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBNQUMgQWNjZXNzIEF0dGVtcHQgQ29tbWFuZCAqLworI2RlZmluZSBMT0dfVU1CX01BQ19BQ0NFU1NfQVRURU1QVF9DTURfQyAgICAgICAgICAgICAgICAoMHg0MjYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIEFjY2VzcyBQcm9iZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfVU1CX01BQ19BQ0NFU1NfUFJPQkVfSU5GT19DICAgICAgICAgICAgICAgICAoMHg0MjcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIFJUQ01BQyBQYWNrYWdlIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19VTUJfTUFDX1JUQ01BQ19QS0dfSU5GT19DICAgICAgICAgICAgICAgICAgICgweDQyOCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBNQUMgU3VwZXIgRnJhbWUgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX1VNQl9NQUNfU0lfSU5GT19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDI5ICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIE1BQyBRdWljayBDaGFubmVsIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19VTUJfTUFDX1FDSV9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQyQSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBNQUMgUGFnaW5nIElkIExpc3QgKi8KKyNkZWZpbmUgTE9HX1VNQl9NQUNfUEFHSU5HX0lEX0xJU1RfQyAgICAgICAgICAgICAgICAgICAgKDB4NDJCICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIE1BQyBRdWljayBQYWdpbmcgQ2hhbm5lbCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfVU1CX01BQ19RUENIX0lORk9fQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MkMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIEZUQ01BQyBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dfVU1CX01BQ19GVENNQUNfUEtHX0lORk9fQyAgICAgICAgICAgICAgICAgICAoMHg0MkQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBVTUIgTUFDIEFjY2VzcyBHcmFudCBSZWNlaXZpbmcgKi8KKyNkZWZpbmUgTE9HX1VNQl9NQUNfQUNDRVNTX0dSQU5UX0MgICAgICAgICAgICAgICAgICAgICAgKDB4NDJFICsgTE9HXzFYX0JBU0VfQykKKworLyogVU1CIE1BQyBHZW5lcmljIERlYnVnIExvZyAqLworI2RlZmluZSBMT0dfVU1CX01BQ19HRU5fREVCVUdfTE9HX1BLR19DICAgICAgICAgICAgICAgICAoMHg0MkYgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIEZyZXF1ZW5jeSBCaWFzIEVzdGltYXRlICovCisjZGVmaW5lIExPR19DR1BTX01DX0ZSRVFfQklBU19FU1RfQyAgICAgICAgICAgICAgICAgICAgICgweDQzMCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBNQUMgUmVxdWVzdCBSZXBvcnQgSW5mb3JtYXRpb24gTG9nICovCisjZGVmaW5lIExPR19VTUJfTUFDX1JFUUNIX1JFUE9SVF9JTkZPX0MgICAgICAgICAgICAgICAgICgweDQzMSArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBNQUMgUmV2ZXJzZSBMaW5rIFFvUyBUb2tlbiBCdWNrZXQgSW5mb3JtYXRpb24gTG9nICovCisjZGVmaW5lIExPR19VTUJfTUFDX1JMUU9TX1RPS0VOX0JVQ0tFVF9JTkZPX0MgICAgICAgICAgICgweDQzMiArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBNQUMgUmV2ZXJzZSBMaW5rIFFvUyBTdHJlYW0gSW5mb3JtYXRpb24gTG9nICovCisjZGVmaW5lIExPR19VTUJfTUFDX1JMUU9TX1NUUkVBTV9JTkZPX0MgICAgICAgICAgICAgICAgICgweDQzMyArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBNQUMgUmV2ZXJzZSBMaW5rIFFvUyBBbGxvdG1lbnQgSW5mb3JtYXRpb24gTG9nICovCisjZGVmaW5lIExPR19VTUJfTUFDX1JMUU9TX0FMTE9UTUVOVF9JTkZPX0MgICAgICAgICAgICAgICgweDQzNCArIExPR18xWF9CQVNFX0MpCisKKy8qIFVNQiBTZWFyY2hlciBSZWNlbnQgU3RhdGUgTWFjaGluZSBUcmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgTE9HX1VNQl9TUkNIX1NUTV9BQ1RJVklUWV9DICAgICAgICAgICAgICAgICAgICAgKDB4NDM1ICsgTE9HXzFYX0JBU0VfQykKKworLyogUGVyZm9ybWFuY2UgQ291bnRlcnMgb24gQVJNMTEgUHJvZmlsaW5nIEluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19BUk0xMV9QRVJGX0NOVF9JTkZPX0MgICAgICAgICAgICAgICAgICAgICAgICgweDQzNiArIExPR18xWF9CQVNFX0MpCisKKy8qIFByb3RvY29sIFNlcnZpY2VzIGRlc2NyaWJlIGFsbCBmbG93IGluc3RhbmNlcyAqLworI2RlZmluZSBMT0dfUFNfU1RBVF9ERVNDX0FMTF9GTE9XX0lOU1RfQyAgICAgICAgICAgICAgICAoMHg0MzcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBkZXNjcmliZSBhbGwgcGh5c2ljYWwgbGluayBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfREVTQ19BTExfUEhZU19MSU5LX0lOU1RfQyAgICAgICAgICAgKDB4NDM4ICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgZGVzY3JpYmUgYWxsIFVEUCBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfREVTQ19BTExfVURQX0lOU1RfQyAgICAgICAgICAgICAgICAgKDB4NDM5ICsgTE9HXzFYX0JBU0VfQykKKworLyogU2VhcmNoZXIgNCBNdWx0aS1DYXJyaWVyIEhEUiAqLworI2RlZmluZSBMT0dfU1JDSDRfTUNfSERSX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0M0EgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQcm90b2NvbCBTZXJ2aWNlcyBkZXNjcmliZSBhbGwgSVBIQyBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTE9HX1BTX1NUQVRfREVTQ19BTExfSVBIQ19JTlNUX0MgICAgICAgICAgICAgICAgKDB4NDNCICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgZGVzY3JpYmUgYWxsIFJPSEMgaW5zdGFuY2VzICovCisjZGVmaW5lIExPR19QU19TVEFUX0RFU0NfQUxMX1JPSENfSU5TVF9DICAgICAgICAgICAgICAgICgweDQzQyArIExPR18xWF9CQVNFX0MpCisKKy8qIEJDYXN0IHNlY3VyaXR5IGFkZCBwcm9ncmFtIGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19CQ0FTVF9TRUNfQUREX1BST0dSQU1fSU5GT19DICAgICAgICAgICAgICAgICgweDQzRCArIExPR18xWF9CQVNFX0MpCisKKy8qIEJDYXN0IHNlY3VyaXR5IGFkZCBwcm9ncmFtIGNvbXBsZXRlICovCisjZGVmaW5lIExPR19CQ0FTVF9TRUNfQUREX1BST0dSQU1fQ09NUExFVEVfQyAgICAgICAgICAgICgweDQzRSArIExPR18xWF9CQVNFX0MpCisKKy8qIEJDYXN0IHNlY3VyaXR5IFNEUCBwYXJzZSAqLworI2RlZmluZSBMT0dfQkNBU1RfU0VDX1NEUF9QQVJTRV9DICAgICAgICAgICAgICAgICAgICAgICAoMHg0M0YgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIE1FIGR5bmFtaWMgcG93ZXIgb3B0aW1pemF0aW9uIHN0YXR1cyAqLworI2RlZmluZSBMT0dfQ0dQU19NRV9EUE9fU1RBVFVTX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NDAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gb24gZGVtYW5kIHNlc3Npb24gc3RhcnQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9PTl9ERU1BTkRfU0VTU0lPTl9TVEFSVF9DICAgICAgICAgKDB4NDQxICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIG9uIGRlbWFuZCBzZXNzaW9uIHN0b3AgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9PTl9ERU1BTkRfU0VTU0lPTl9TVE9QX0MgICAgICAgICAgKDB4NDQyICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIG9uIGRlbWFuZCBzZXNzaW9uIG5vdCBzdGFydGVkICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fT05fREVNQU5EX1NFU1NJT05fTk9UX1NUQVJURURfQyAgICgweDQ0MyArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBleHRlcm4gY29hcnNlIHBvc2l0aW9uIGluamVjdCBzdGFydCAqLworI2RlZmluZSBMT0dfQ0dQU19QRFNNX0VYVEVSTl9DT0FSU0VfUE9TX0lOSl9TVEFSVF9DICAgICAoMHg0NDQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEVFYgSVNEQi1UIFRNQ0MgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0RUVl9JU0RCX1RNQ0NfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDQ1ICsgTE9HXzFYX0JBU0VfQykKKworLyogUkYgZGV2ZWxvcG1lbnQgKi8KKyNkZWZpbmUgTE9HX1JGX0RFVl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDQ2ICsgTE9HXzFYX0JBU0VfQykKKworLyogUkYgUkZNIEFQSSAqLworI2RlZmluZSBMT0dfUkZfUkZNX0FQSV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NDcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSRiBSRk0gc3RhdGUgKi8KKyNkZWZpbmUgTE9HX1JGX1JGTV9TVEFURV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDQ4ICsgTE9HXzFYX0JBU0VfQykKKworLyogMVggUkYgV2FybXVwICovCisjZGVmaW5lIExPR18xWF9SRl9XQVJNVVBfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0OSArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIHBvd2VyIGxpbWl0aW5nICovCisjZGVmaW5lIExPR18xWF9SRl9QV1JfTE1UX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0QSArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIHN0YXRlICovCisjZGVmaW5lIExPR18xWF9SRl9TVEFURV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0QiArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIHNsZWVwICovCisjZGVmaW5lIExPR18xWF9SRl9TTEVFUF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0QyArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIFRYIHN0YXRlICovCisjZGVmaW5lIExPR18xWF9SRl9UWF9TVEFURV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0RCArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIEludGVsbGlDZWl2ZXIgc3RhdGUgKi8KKyNkZWZpbmUgTE9HXzFYX1JGX0lOVF9TVEFURV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDRFICsgTE9HXzFYX0JBU0VfQykKKworLyogMVggUkYgUlggQURDIGNsb2NrICovCisjZGVmaW5lIExPR18xWF9SRl9SWF9BRENfQ0xLX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ0RiArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIExOQSBzd2l0Y2ggcG9pbnQgKi8KKyNkZWZpbmUgTE9HXzFYX1JGX0xOQV9TV0lUQ0hQX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDUwICsgTE9HXzFYX0JBU0VfQykKKworLyogMVggUkYgUlggY2FsaWJyYXRpb24gKi8KKyNkZWZpbmUgTE9HXzFYX1JGX1JYX0NBTF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDUxICsgTE9HXzFYX0JBU0VfQykKKworLyogMVggUkYgQVBJICovCisjZGVmaW5lIExPR18xWF9SRl9BUElfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ1MiArIExPR18xWF9CQVNFX0MpCisKKy8qIDFYIFJGIFJYIFBMTCBsb2NraW5nIHN0YXR1cyAqLworI2RlZmluZSBMT0dfMVhfUkZfUlhfUExMX0xPQ0tfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NTMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiAxWCBSRiB2b2x0YWdlIHJlZ3VsYXRvciAqLworI2RlZmluZSBMT0dfMVhfUkZfVlJFR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NTQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIERJQUcgc3VjY2Vzc2Z1bCBmaXggY291bnQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfRElBR19TVUNDRVNTRlVMX0ZJWF9DT1VOVF9DICAgICAgICAgICAgKDB4NDU1ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBNQyB0cmFjayBkeW5hbWljIHBvd2VyIG9wdGltaXphdGlvbiBzdGF0dXMgKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUNfVFJBQ0tfRFBPX1NUQVRVU19DICAgICAgICAgICAgICAgICAgKDB4NDU2ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBNQyBTQkFTIGRlbW9kdWxhdGVkIGJpdHMgKi8KKyNkZWZpbmUgTE9HX0NHUFNfTUNfU0JBU19ERU1PRF9CSVRTX0MgICAgICAgICAgICAgICAgICAgKDB4NDU3ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBNQyBTQkFTIGRlbW9kdWxhdGVkIHNvZnQgc3ltYm9scyAqLworI2RlZmluZSBMT0dfQ0dQU19NQ19TQkFTX0RFTU9EX1NPRlRfU1lNQk9MU19DICAgICAgICAgICAoMHg0NTggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEYXRhIFNlcnZpY2VzIFBQUCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIExPR19EU19QUFBfQ09ORklHX1BBUkFNU19DICAgICAgICAgICAgICAgICAgICAgICgweDQ1OSArIExPR18xWF9CQVNFX0MpCisKKy8qIERhdGEgU2VydmljZXMgcGh5c2ljYWwgbGluayBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIExPR19EU19QSFlTX0xJTktfQ09ORklHX1BBUkFNU19DICAgICAgICAgICAgICAgICgweDQ1QSArIExPR18xWF9CQVNFX0MpCisKKy8qIERhdGEgU2VydmljZXMgUFBQIGRldmljZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIExPR19QU19QUFBfREVWX0NPTkZJR19QQVJBTVNfQyAgICAgICAgICAgICAgICAgICgweDQ1QiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUERTTSBHUFMgc3RhdGUgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9HUFNfU1RBVEVfSU5GT19DICAgICAgICAgICAgICAgICAgKDB4NDVDICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIEVYVCBzdGF0dXMgR1BTIHN0YXRlIGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fRVhUX1NUQVRVU19HUFNfU1RBVEVfSU5GT19DICAgICAgICgweDQ1RCArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgTUUgUmFwaWQgU2VhcmNoIFJlcG9ydCAqLworI2RlZmluZSBMT0dfQ0dQU19NRV9SQVBJRF9TRUFSQ0hfUkVQT1JUX0MgICAgICAgICAgICAgICAoMHg0NUUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFBEU00gWFRSQS1UIHNlc3Npb24gKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9YVFJBX1RfU0VTU0lPTl9DICAgICAgICAgICAgICAgICAgKDB4NDVGICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBQRFNNIFhUUkEtVCB1cGxvYWQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUERTTV9YVFJBX1RfVVBMT0FEX0MgICAgICAgICAgICAgICAgICAgKDB4NDYwICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBXaXBlciBQb3NpdGlvbiBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfV0lQRVJfUE9TSVRJT05fUkVQT1JUX0MgICAgICAgICAgICAgICAgKDB4NDYxICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIEhUVFAgRGlnZXN0IFJlcXVlc3QgSW5mbyAqLworI2RlZmluZSBMT0dfRFRWX0RWQkhfU0VDX1NDX0hUVFBfRElHRVNUX1JFUV9DICAgICAgICAgICAoMHg0NjIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEVFYgRFZCSCBTZWN1cml0eSBTbWFydENhcmQgSFRUUCBEaWdlc3QgUmVzcG9uc2UgSW5mbyAqLworI2RlZmluZSBMT0dfRFRWX0RWQkhfU0VDX1NDX0hUVFBfRElHRVNUX1JTUF9DICAgICAgICAgICAoMHg0NjMgKyBMT0dfMVhfQkFTRV9DKSAKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIFNlcnZpY2VzIFJlZ2lzdHJhdGlvbiBSZXF1ZXN0IEluZm8gKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19TVkNfUkVHX1JFUV9DICAgICAgICAgICAgICAgKDB4NDY0ICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIFNlcnZpY2VzIFJlZ2lzdHJhdGlvbiBDb21wbGV0ZSBJbmZvICovCisjZGVmaW5lIExPR19EVFZfRFZCSF9TRUNfU0NfU1ZDX1JFR19DT01QTEVURV9DICAgICAgICAgICgweDQ2NSArIExPR18xWF9CQVNFX0MpCisKKy8qIERUViBEVkJIIFNlY3VyaXR5IFNtYXJ0Q2FyZCBTZXJ2aWNlcyBEZXJlZ2lzdHJhdGlvbiBSZXF1ZXN0IEluZm8gKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19TVkNfREVSRUdfUkVRX0MgICAgICAgICAgICAgKDB4NDY2ICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIFNlcnZpY2VzIERlcmVnaXN0cmF0aW9uIENvbXBsZXRlIEluZm8gKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19TVkNfREVSRUdfQ09NUExFVEVfQyAgICAgICAgKDB4NDY3ICsgTE9HXzFYX0JBU0VfQykgCisKKy8qIERUViBEVkJIIFNlY3VyaXR5IFNtYXJ0Q2FyZCBMVEtNIFJlcXVlc3QgSW5mbyAqLworI2RlZmluZSBMT0dfRFRWX0RWQkhfU0VDX1NDX0xUS01fUkVRX0MgICAgICAgICAgICAgICAgICAoMHg0NjggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBEVFYgRFZCSCBTZWN1cml0eSBTbWFydENhcmQgTFRLTSBSZXF1ZXN0IENvbXBsZXRlIEluZm8gKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19MVEtNX1JFUV9DT01QTEVURV9DICAgICAgICAgKDB4NDY5ICsgTE9HXzFYX0JBU0VfQykgCisKKy8qIERUViBEVkJIIFNlY3VyaXR5IFNtYXJ0Q2FyZCBQcm9ncmFtIFNlbGVjdGlvbiBJbmZvICovCisjZGVmaW5lIExPR19EVFZfRFZCSF9TRUNfU0NfUFJPR19TRUxfQyAgICAgICAgICAgICAgICAgICgweDQ2QSArIExPR18xWF9CQVNFX0MpCisKKy8qIERUViBEVkJIIFNlY3VyaXR5IFNtYXJ0Q2FyZCBQcm9ncmFtIFNlbGVjdGlvbiBDb21wbGV0ZSBJbmZvICovCisjZGVmaW5lIExPR19EVFZfRFZCSF9TRUNfU0NfUFJPR19TRUxfQ09NUExFVEVfQyAgICAgICAgICgweDQ2QiArIExPR18xWF9CQVNFX0MpCisKKy8qIERUViBEVkJIIFNlY3VyaXR5IFNtYXJ0Q2FyZCBMVEtNICovCisjZGVmaW5lIExPR19EVFZfRFZCSF9TRUNfU0NfTFRLTV9DICAgICAgICAgICAgICAgICAgICAgICgweDQ2QyArIExPR18xWF9CQVNFX0MpICAKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIExUS00gVmVyaWZpY2F0aW9uIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19MVEtNX1ZFUklGSUNBVElPTl9DICAgICAgICAgKDB4NDZEICsgTE9HXzFYX0JBU0VfQykgCisKKy8qIERUViBEVkJIIFNlY3VyaXR5IFNtYXJ0Q2FyZCBQYXJlbnRhbCBDb250cm9sIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19QQVJFTlRBTF9DVFJMX0MgICAgICAgICAgICAgKDB4NDZFICsgTE9HXzFYX0JBU0VfQykKKworLyogRFRWIERWQkggU2VjdXJpdHkgU21hcnRDYXJkIFNUS00gKi8KKyNkZWZpbmUgTE9HX0RUVl9EVkJIX1NFQ19TQ19TVEtNX0MgICAgICAgICAgICAgICAgICAgICAgKDB4NDZGICsgTE9HXzFYX0JBU0VfQykKKworLyogUHJvdG9jb2wgU2VydmljZXMgU3RhdGlzdGljcyBHbG9iYWwgU29ja2V0ICovCisjZGVmaW5lIExPR19QU19TVEFUX0dMT0JBTF9TT0NLX0MgICAgICAgICAgICAgICAgICAgICAgICgweDQ3MCArIExPR18xWF9CQVNFX0MpCisKKy8qIE1DUyBBcHBsaWNhdGlvbiBNYW5hZ2VyICovCisjZGVmaW5lIExPR19NQ1NfQVBQTUdSX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ3MSArIExPR18xWF9CQVNFX0MpCisKKy8qIE1DUyBNU0dSICovCisjZGVmaW5lIExPR19NQ1NfTVNHUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ3MiArIExPR18xWF9CQVNFX0MpCisKKy8qIE1DUyBRVEYgICovCisjZGVmaW5lIExPR19NQ1NfUVRGX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ3MyArIExPR18xWF9CQVNFX0MpCisKKy8qIFNlbnNvcnMgU3RhdGlvbmFyeSBEZXRlY3RvciBPdXRwdXQgKi8KKyNkZWZpbmUgTE9HX1NUQVRJT05BUllfREVURUNUT1JfT1VUUFVUX0MgICAgICAgICAgICAgICAgKDB4NDc0ICsgTE9HXzFYX0JBU0VfQykgIAorCisvKiBQcmludCBvdXQgdGhlIHBwbSBkYXRhIHBvcnRpb24gICovCisjZGVmaW5lIExPR19DR1BTX1BEU01fRVhUX1NUQVRVU19NRUFTX1JFUE9SVF9QUE1fQyAgICAgICgweDQ3NSArIExPR18xWF9CQVNFX0MpICAKKworLyogR05TUyBQb3NpdGlvbiBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0dOU1NfUE9TSVRJT05fUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgICAgKDB4NDc2ICsgTE9HXzFYX0JBU0VfQykgIAorCisvKiBHTlNTIEdQUyBNZWFzdXJlbWVudCBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0dOU1NfR1BTX01FQVNVUkVNRU5UX1JFUE9SVF9DICAgICAgICAgICAgICAgKDB4NDc3ICsgTE9HXzFYX0JBU0VfQykgIAorCisvKiBHTlNTIENsb2NrIFJlcG9ydCAqLworI2RlZmluZSBMT0dfR05TU19DTE9DS19SRVBPUlRfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0NzggKyBMT0dfMVhfQkFTRV9DKSAgCisKKy8qIEdOU1MgRGVtb2QgU29mdCBEZWNpc2lvbiAqLworI2RlZmluZSBMT0dfR05TU19ERU1PRF9TT0ZUX0RFQ0lTSU9OU19DICAgICAgICAgICAgICAgICAoMHg0NzkgKyBMT0dfMVhfQkFTRV9DKSAgCisKKy8qIEdOU1MgTUUgNU1TIElRIHN1bSAqLworI2RlZmluZSBMT0dfR05TU19NRV81TVNfSVFfU1VNU19DICAgICAgICAgICAgICAgICAgICAgICAoMHg0N0EgKyBMT0dfMVhfQkFTRV9DKSAgCisKKy8qIEdOU1MgQ0QgREIgcmVwb3J0ICovCisjZGVmaW5lIExPR19HTlNTX0NEX0RCX1JFUE9SVF9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ3QiArIExPR18xWF9CQVNFX0MpIAorCisvKiBHTlNTIFBFIFdMUyBwb3NpdGlvbiByZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0dOU1NfUEVfV0xTX1BPU0lUSU9OX1JFUE9SVF9DICAgICAgICAgICAgICAgKDB4NDdDICsgTE9HXzFYX0JBU0VfQykgCisKKy8qIEdOU1MgUEUgS0YgcG9zaXRpb24gcmVwb3J0ICovCisjZGVmaW5lIExPR19HTlNTX1BFX0tGX1BPU0lUSU9OX1JFUE9SVF9DICAgICAgICAgICAgICAgICgweDQ3RCArIExPR18xWF9CQVNFX0MpIAorCisvKiBHTlNTIFBSWCBSRiBIVyBzdGF0dXMgcmVwb3J0ICovCisjZGVmaW5lIExPR19HTlNTX1BSWF9SRl9IV19TVEFUVVNfUkVQT1JUX0MgICAgICAgICAgICAgICgweDQ3RSArIExPR18xWF9CQVNFX0MpIAorCisvKiBHTlNTIERSWCBSRiBIVyBzdGF0dXMgcmVwb3J0ICovCisjZGVmaW5lIExPR19HTlNTX0RSWF9SRl9IV19TVEFUVVNfUkVQT1JUX0MgICAgICAgICAgICAgICgweDQ3RiArIExPR18xWF9CQVNFX0MpIAorCisvKiBHTlNTIEdsb25hc3MgTWVhc3VyZW1lbnQgcmVwb3J0ICovCisjZGVmaW5lIExPR19HTlNTX0dMT05BU1NfTUVBU1VSRU1FTlRfUkVQT1JUX0MgICAgICAgICAgICgweDQ4MCArIExPR18xWF9CQVNFX0MpIAorCisvKiBHTlNTIEdQUyBIQlcgUlhEIG1lYXN1cmVtZW50ICovCisjZGVmaW5lIExPR19HTlNTX0dQU19IQldfUlhEX01FQVNVUkVNRU5UX0MgICAgICAgICAgICAgICgweDQ4MSArIExPR18xWF9CQVNFX0MpIAorCisvKiBHTlNTIFBEU00gcG9zaXRpb24gcmVwb3J0IGNhbGxiYWNrICovCisjZGVmaW5lIExPR19HTlNTX1BEU01fUE9TSVRJT05fUkVQT1JUX0NBTExCQUNLX0MgICAgICAgICgweDQ4MiArIExPR18xWF9CQVNFX0MpCisKKy8qIElTZW5zZSBSZXF1ZXN0IFN0cmluZyAgKi8KKyNkZWZpbmUgTE9HX0lTRU5TRV9SRVFVRVNUX1NUUl9DICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDgzICsgTE9HXzFYX0JBU0VfQykgCisKKy8qIElTZW5zZSBSZXNwb25zZSBTdHJpbmcgKi8KKyNkZWZpbmUgTE9HX0lTRU5TRV9SRVNQT05TRV9TVFJfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4NDg0ICsgTE9HXzFYX0JBU0VfQykKKworLyogQmx1ZXRvb3RoIFNPQyBHZW5lcmFsIExvZyBQYWNrZXQqLworI2RlZmluZSBMT0dfQlRfU09DX0dFTkVSQUxfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0ODUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBRQ1JpbCBDYWxsIEZsb3cgKi8KKyNkZWZpbmUgTE9HX1FDUklMX0NBTExfRkxPV19DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDg2ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBXaWRlYmFuZCBGRlQgc3RhdHMgKi8KKyNkZWZpbmUgTE9HX0NHUFNfV0JfRkZUX1NUQVRTX0MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDg3ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBTbG93IENsb2NrIENhbGlicmF0aW9uIFJlcG9ydCovCisjZGVmaW5lIExPR19DR1BTX1NMT1dfQ0xPQ0tfQ0FMSUJfUkVQT1JUX0MgICAgICAgICAgICAgICgweDQ4OCArIExPR18xWF9CQVNFX0MpCisKKy8qIFNOUyBHUFMgVElNRVNUQU1QICovCisjZGVmaW5lIExPR19TTlNfR1BTX1RJTUVTVEFNUF9DICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ4OSArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgU2VhcmNoIFN0cmF0ZWd5IFRhc2sgQWxsb2NhdGlvbiAqLworI2RlZmluZSBMT0dfR05TU19TRUFSQ0hfU1RSQVRFR1lfVEFTS19BTExPQ0FUSU9OX0MgICAgICAoMHg0OEEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSRiBNQyBTVE0gc3RhdGUgKi8KKyNkZWZpbmUgTE9HXzFYSERSX01DX1NUQVRFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDhCICsgTE9HXzFYX0JBU0VfQykKKworLyogUmVjb3JkIGluIHRoZSBTcGFyc2UgTmV0d29yayBEQiAqLworI2RlZmluZSBMT0dfQ0dQU19TTkRCX1JFQ09SRF9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0OEMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBSZWNvcmQgcmVtb3ZlZCBmcm9tIHRoZSBEQiAqLworI2RlZmluZSBMT0dfQ0dQU19TTkRCX1JFTU9WRV9DICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0OEQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFJlc2VydmVkICovCisjZGVmaW5lIExPR19HTlNTX0NDX1BFUkZPUk1BTkNFX1NUQVRTX0MgICAgICAgICAgICAgICAgICgweDQ4RSArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgUERTTSBTZXQgUGFyYW1lcnRlcnMgKi8KKyNkZWZpbmUgTE9HX0dOU1NfUERTTV9TRVRfUEFSQU1FVEVSU19DICAgICAgICAgICAgICAgICAgKDB4NDhGICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBQRFNNIFBEIEV2ZW50IENhbGxiYWNrICovCisjZGVmaW5lIExPR19HTlNTX1BEU01fUERfRVZFTlRfQ0FMTEJBQ0tfQyAgICAgICAgICAgICAgICgweDQ5MCArIExPR18xWF9CQVNFX0MpCisKKy8qIEdOU1MgUERTTSBQQSBFdmVudCBDYWxsYmFjayAqLworI2RlZmluZSBMT0dfR05TU19QRFNNX1BBX0VWRU5UX0NBTExCQUNLX0MgICAgICAgICAgICAgICAoMHg0OTEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDR1BTIFJlc2VydmVkICovCisjZGVmaW5lIExPR19DR1BTX1JFU0VSVkVEMl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ5MiArIExPR18xWF9CQVNFX0MpCisKKy8qIENHUFMgUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTE9HX0NHUFNfUkVTRVJWRUQzX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDkzICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBQRFNNIEVYVCBTdGF0dXMgTUVBUyBSZXBvcnQgKi8KKyNkZWZpbmUgTE9HX0dOU1NfUERTTV9FWFRfU1RBVFVTX01FQVNfUkVQT1JUX0MgICAgICAgICAgKDB4NDk0ICsgTE9HXzFYX0JBU0VfQykKKworLyogR05TUyBTTSBFcnJvciAqLworI2RlZmluZSBMT0dfR05TU19TTV9FUlJPUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0OTUgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBXTEFOIFNjYW4gKi8KKyNkZWZpbmUgTE9HX1dMQU5fU0NBTl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDk2ICsgTE9HXzFYX0JBU0VfQykKKworLyogV0xBTiBJQlNTICovCisjZGVmaW5lIExPR19XTEFOX0lCU1NfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ5NyArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gODAyLjExZCovCisjZGVmaW5lIExPR19XTEFOXzgwMjExRF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ5OCArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gSGFuZG9mZiAqLworI2RlZmluZSBMT0dfV0xBTl9IQU5ET0ZGX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0OTkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBXTEFOIFFvUyBFRENBICovCisjZGVmaW5lIExPR19XTEFOX1FPU19FRENBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQ5QSArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gQmVhY29uIFVwZGF0ZSAqLworI2RlZmluZSBMT0dfV0xBTl9CRUFDT05fVVBEQVRFX0MgICAgICAgICAgICAgICAgICAgICAgICAoMHg0OUIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBXTEFOIFBvd2VyIHNhdmUgd293IGFkZCBwYXR0ZXJuICovCisjZGVmaW5lIExPR19XTEFOX1BPV0VSU0FWRV9XT1dfQUREX1BUUk5fQyAgICAgICAgICAgICAgICgweDQ5QyArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gV0NNIGxpbmsgbWV0cmljcyAqLworI2RlZmluZSBMT0dfV0xBTl9XQ01fTElOS01FVFJJQ1NfQyAgICAgICAgICAgICAgICAgICAgICAoMHg0OUQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBXTEFOIHdwcyBzY2FuIGNvbXBsZXRlKi8KKyNkZWZpbmUgTE9HX1dMQU5fV1BTX1NDQU5fQ09NUExFVEVfQyAgICAgICAgICAgICAgICAgICAgKDB4NDlFICsgTE9HXzFYX0JBU0VfQykKKworLyogV0xBTiBXUFMgV1NDIE1lc3NhZ2UgKi8KKyNkZWZpbmUgTE9HX1dMQU5fV1BTX1dTQ19NRVNTQUdFX0MgICAgICAgICAgICAgICAgICAgICAgKDB4NDlGICsgTE9HXzFYX0JBU0VfQykKKworLyogV0xBTiBXUFMgY3JlZGVudGlhbHMgKi8KKyNkZWZpbmUgTE9HX1dMQU5fV1BTX0NSRURFTlRJQUxTX0MgICAgICAgICAgICAgICAgICAgICAgKDB4NEEwICsgTE9HXzFYX0JBU0VfQykKKworLyogV0xBTiBMaW5rbGF5ZXIgc3RhdCovCisjZGVmaW5lIExPR19XTEFOX0xJTktMQVlFUl9TVEFUX0MgICAgICAgICAgICAgICAgICAgICAgICgweDRBMSArIExPR18xWF9CQVNFX0MpCisKKy8qIFdMQU4gUW9zIFRTcGVjKi8KKyNkZWZpbmUgTE9HX1dMQU5fUU9TX1RTUEVDX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NEEyICsgTE9HXzFYX0JBU0VfQykKKworLyogUE1JQyBWcmVnIENvbnRyb2wgKi8KKyNkZWZpbmUgTE9HX1BNX1ZSRUdfQ09OVFJPTF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NEEzICsgTE9HXzFYX0JBU0VfQykKKworLyogUE1JQyBWcmVnIExldmVsICovCisjZGVmaW5lIExPR19QTV9WUkVHX0xFVkVMX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDRBNCArIExPR18xWF9CQVNFX0MpCisgCisvKiBQTUlDIFZyZWcgU3RhdGUgKi8KKyNkZWZpbmUgTE9HX1BNX1ZSRUdfU1RBVEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NEE1ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ0dQUyBTTSBFUEggUmFuZG9taXphdGlvbiBpbmZvICovCisjZGVmaW5lIExPR19DR1BTX1NNX0VQSF9SQU5ET01JWkFUSU9OX0lORk9fQyAgICAgICAgICAgICgweDRBNiArIExPR18xWF9CQVNFX0MpCisKKy8qIEF1ZGlvIGNhbGlicmF0aW9uIGRhdGEgKi8KKyNkZWZpbmUgTE9HX1FBQ1RfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NEE3ICsgTE9HXzFYX0JBU0VfQykKKworLyogQ29tcGFzcyAyRCBUcmFja2VkIENhbGlicmF0aW9uIFNldCAqLworI2RlZmluZSBMT0dfU05TX1ZDUFNfMkRfVFJBQ0tFRF9DQUxfU0VUICAgICAgICAgICAgICAgICAoMHg0QTggKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDb21wYXNzIDNEIFRyYWNrZWQgQ2FsaWJyYXRpb24gU2V0ICAqLworI2RlZmluZSBMT0dfU05TX1ZDUFNfM0RfVFJBQ0tFRF9DQUxfU0VUICAgICAgICAgICAgICAgICAoMHg0QTkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDYWxpYnJhdGlvbiBtZXRyaWMgKi8KKyNkZWZpbmUgTE9HX1NOU19WQ1BTX0NBTF9NRVRSSUMgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NEFBICsgTE9HXzFYX0JBU0VfQykKKworLyogQWNjZWxlcm9tZXRlciBkaXN0YW5jZSAqLworI2RlZmluZSBMT0dfU05TX1ZDUFNfQUNDRUxfRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QUIgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBQbGFuZSB1cGRhdGUgKi8KKyNkZWZpbmUgTE9HX1NOU19WQ1BTX1BMQU5FX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgKDB4NEFDICsgTE9HXzFYX0JBU0VfQykKKworLyogTG9jYXRpb24gcmVwb3J0ICAqLworI2RlZmluZSBMT0dfU05TX1ZDUFNfTE9DX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QUQgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDTSBBY3RpdmUgc3Vic2NyaXB0aW9uICovCisjZGVmaW5lIExPR19DTV9QSF9FVkVOVF9TVUJTQ1JJUFRJT05fUFJFRl9JTkZPX0MgICAgICAgICgweDRBRSArIExPR18xWF9CQVNFX0MpCisKKy8qIERTRFMgdmVyc2lvbiBvZiBDTSBjYWxsIGV2ZW50ICovCisjZGVmaW5lIExPR19DTV9EU19DQUxMX0VWRU5UX0MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDRBRiArIExPR18xWF9CQVNFX0MpCisKKy8qIFNlbnNvcnMgP01vYmlTZW5zIE91dHB1dCAqLworI2RlZmluZSBMT0dfTU9CSVNFTlNfT1VUUFVUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QjAgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBBY2NlbGVyb21ldGVyIERhdGEgICAqLworI2RlZmluZSBMT0dfQUNDRUxfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QjEgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBBY2NlbGVyb21ldGVyIENvbXBlbnNhdGVkIERhdGEgICovCisjZGVmaW5lIExPR19BQ0NFTF9DT01QX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDRCMiArIExPR18xWF9CQVNFX0MpCisKKy8qIE1vdGlvbiBTdGF0ZSBEYXRhICAqLworI2RlZmluZSBMT0dfTU9USU9OX1NUQVRFX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QjMgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTdGF0aW9uYXJ5IFBvc2l0aW9uIEluZGljYXRvciAgKi8KKyNkZWZpbmUgTE9HX1NUQVRfUE9TX0lORF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NEI0ICsgTE9HXzFYX0JBU0VfQykKKworLyogTW90aW9uIFN0YXRlIEZlYXR1cmVzICAgKi8KKyNkZWZpbmUgTE9HX01PVElPTl9TVEFURV9GRUFUVVJFU19DICAgICAgICAgICAgICAgICAgICAgKDB4NEI1ICsgTE9HXzFYX0JBU0VfQykKKworLyogTW90aW9uIFN0YXRlIEhhcmQgRGVjaXNpb24gKi8KKyNkZWZpbmUgTE9HX01PVElPTl9TVEFURV9IQVJEX0RFQ0lTSU9OX0MgICAgICAgICAgICAgICAgKDB4NEI2ICsgTE9HXzFYX0JBU0VfQykKKyAgCisvKiBNb3Rpb24gU3RhdGUgU29mdCBEZWNpc2lvbiAqLworI2RlZmluZSBMT0dfTU9USU9OX1NUQVRFX1NPRlRfREVDSVNJT05fQyAgICAgICAgICAgICAgICAoMHg0QjcgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTZW5zb3JzIFNvZnR3YXJlIFZlcnNpb24gKi8KKyNkZWZpbmUgTE9HX1NFTlNPUlNfU09GVFdBUkVfVkVSU0lPTl9DICAgICAgICAgICAgICAgICAgKDB4NEI4ICsgTE9HXzFYX0JBU0VfQykKKworLyogTW9iaVNlbnMgU3RhdGlvbmFyeSBQb3NpdGlvbiBJbmRpY2F0b3IgTG9nIFBhY2tldCAqLworI2RlZmluZSBMT0dfTU9CSVNFTlNfU1BJX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QjkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBYTyBjYWxpYnJhdGlvbiByYXcgSVEgZGF0YSAqLworI2RlZmluZSBMT0dfWE9fSVFfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0QkEgKyBMT0dfMVhfQkFTRV9DKQorCisvKkRUViBDTU1CIENvbnRyb2wgVGFibCBVcGRhdGVkKi8KKyNkZWZpbmUgTE9HX0RUVl9DTU1CX0NPTlRST0xfVEFCTEVfVVBEQVRFICAgICAgICAgICAgICAgICAgKCgweDRCQikgKyBMT0dfMVhfQkFTRV9DKQorCisvKkRUViBDTU1CIE1lZGlhIEFQSSBCdWZmZXJpbmcgU3RhdHVzKi8KKyNkZWZpbmUgTE9HX0RUVl9DTU1CX01FRElBX0JVRkZFUklOR19TVEFUVVMgICAgICAgICAgICAgICAgKCgweDRCQykgKyBMT0dfMVhfQkFTRV9DKQorCisvKkRUViBDTU1CICpFbWVyZ2VuY3kgQnJvYWRjYXN0IERhdGEqLworI2RlZmluZSBMT0dfRFRWX0NNTUJfQ09OVFJPTF9FTUVSR0VOQ1lfQkNBU1QgICAgICAgICAgICAgKCgweDRCRCkgKyBMT0dfMVhfQkFTRV9DKQorCisvKkRUViBDTU1CIEVNTS9FQ00gRGF0YSovCisjZGVmaW5lIExPR19EVFZfQ01NQl9DQVNfRU1NX0VDTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0QkUpICsgTE9HXzFYX0JBU0VfQykKKworLypEVFYgQ01NQiBIVyBTdGF0dXMqLworI2RlZmluZSBMT0dfRFRWX0NNTUJfSFdfUEVSRk9STUFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRCRikgKyBMT0dfMVhfQkFTRV9DKQorCisvKkRUViBDTU1CIEVTU0cgUHJvZ3JhbSBJbmRpY2F0aW9uIEluZm9ybWF0aW9uKi8KKyNkZWZpbmUgTE9HX0RUVl9DTU1CX0VTR19QUk9HUkFNX0lORElDQVRJT05fSU5GT1JNQVRJT04gICAgKCgweDRDMCkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBTZW5zb3JzIKhDIGJpbmFyeSBvdXRwdXQgb2YgY29udmVydGVkIHNlbnNvciBkYXRhICovCisjZGVmaW5lIExPR19DT05WRVJURURfU0VOU09SX0RBVEFfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRDMSkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBDTSBTdWJzY3JpcHRpb24gZXZlbnQgKi8KKyNkZWZpbmUgTE9HX0NNX1NVQlNDUklQVElPTl9FVkVOVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEMyKSArIExPR18xWF9CQVNFX0MpCisKKy8qIFNlbnNvciBBbWJpZW50IExpZ2h0IERhdGEgKi8KKyNkZWZpbmUgTE9HX1NOU19BTFNfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0QzMpICsgTE9HXzFYX0JBU0VfQykKKworLypTZW5zb3IgQW1iaWVudCBMaWdodCBBZGFwdGl2ZSBEYXRhICovCisjZGVmaW5lIExPR19TTlNfQUxTX0RBVEFfQURBUFRJVkVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0QzQpICsgTE9HXzFYX0JBU0VfQykKKworLypTZW5zb3IgUHJveGltaXR5IERpc3RhbmNlIERhdGEgKi8KKyNkZWZpbmUgTE9HX1NOU19QUlhfRElTVF9EQVRBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRDNSkgKyBMT0dfMVhfQkFTRV9DKQorCisvKlNlbnNvciBQcm94aW1pdHkgRGF0YSAqLworI2RlZmluZSBMT0dfU05TX1BSWF9EQVRBX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEM2KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0dOU1NfU0JBU19SRVBPUlRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRDNykgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19DUFVfTU9OSVRPUl9NT0RFTV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0QzgpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfQ1BVX01PTklUT1JfQVBQU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEM5KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0JMQVNUX1RBU0tQUk9GSUxFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRDQSkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19CTEFTVF9TWVNQUk9GSUxFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0Q0IpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfRk1fUkFESU9fRlRNX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NENDKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0ZNX1JBRElPX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRDRCkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19VSU1fRFNfREFUQV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0Q0UpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfUU1JX0NBTExfRkxPV19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NENGKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0FQUl9NT0RFTV9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDREMCkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19BUFJfQVBQU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0RDEpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfQVBSX0FEU1BfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEQyKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0RBVEFfTVVYX1JYX1JBV19QQUNLRVRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDREMykgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19EQVRBX01VWF9UWF9SQVdfUEFDS0VUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0RDQpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfREFUQV9NVVhfUlhfRlJBTUVfUEFDS0VUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEQ1KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0RBVEFfTVVYX1RYX0ZSQU1FX1BBQ0tFVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRENikgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19DR1BTX1BEU01fRVhUX1NUQVRVU19QT1NfSU5KX1JFUV9JTkZPX0MgICAgICAgICAgICAgICAgICgoMHg0RDcpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfVEVNUEVSQVRVUkVfTU9OSVRPUl9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEQ4KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1NOU19HRVNUVVJFU19SRVNUX0RFVEVDVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDREOSkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19TTlNfR0VTVFVSRVNfT1JJRU5UQVRJT05fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0REEpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfU05TX0dFU1RVUkVTX0ZBQ0lOR19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NERCKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1NOU19HRVNUVVJFU19CQVNJQ19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDREQykgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19TTlNfR0VTVFVSRVNfSElOQllFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0REQpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfR05TU19PRU1EUkVfTUVBU1VSRU1FTlRfUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NERFKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0dOU1NfT0VNRFJFX1BPU0lUSU9OX1JFUE9SVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRFMCkgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19HTlNTX09FTURSRV9TVlBPTFlfUkVQT1JUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0RTEpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfR05TU19PRU1EUlNZTkNfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEUyKSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX1NOU19NR1JfRVZFTlRfTk9USUZZX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRFMykgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19TTlNfTUdSX0VWRU5UX1JFR0lTVEVSX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0RTQpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfR05TU19QRFNNX1BQTV9TRVNTSU9OX0JFR0lOX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEU1KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0dOU1NfUERTTV9QUE1fU0VTU0lPTl9QUE1fU1VTUEVORF9DICAgICAgICAgICAgICAgICAgICAgKCgweDRFNikgKyBMT0dfMVhfQkFTRV9DKQorCisjZGVmaW5lIExPR19HTlNTX1BEU01fUFBNX1JFUE9SVF9USFJPVFRMRURfQyAgICAgICAgICAgICAgICAgICAgICAgICgoMHg0RTcpICsgTE9HXzFYX0JBU0VfQykKKworI2RlZmluZSBMT0dfR05TU19QRFNNX1BQTV9SRVBPUlRfRklSRURfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4NEU4KSArIExPR18xWF9CQVNFX0MpCisKKyNkZWZpbmUgTE9HX0dOU1NfUERTTV9QUE1fU0VTU0lPTl9FTkRfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRFOSkgKyBMT0dfMVhfQkFTRV9DKQorCisvKiBUaGUgbGFzdCBkZWZpbmVkIERNU1MgbG9nIGNvZGUgKi8KKyNkZWZpbmUgTE9HXzFYX0xBU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDRFOSkgKyBMT0dfMVhfQkFTRV9DKQorCisKKy8qIFRoaXMgaXMgb25seSBoZXJlIGZvciBvbGQgKHByZSBlcXVpcG1lbnQgSUQgdXBkYXRlKSBsb2dnaW5nIGNvZGUgKi8KKyNkZWZpbmUgTE9HX0xBU1RfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBMT0dfMVhfTEFTVF9DICYgMHhGRkYgKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFQUFMgTE9HIGRlZmluaXRpb246CisgKiBUaGUgbWF4IG51bWJlciBvZiAxNiBsb2cgY29kZXMgaXMgYXNzaWduZWQgZm9yIEFwcHMuCisgKiBUaGUgbGFzdCBhcHBzIGxvZyBjb2RlIGNvdWxkIGJlIDB4QjAwRi4KKyAqIEJlbG93IGRlZmluaXRpb24gaXMgY29uc29saWRhdGVkIGZyb20gbG9nX2NvZGVzX2FwcHMuaAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gICBBUFBTIFByb2ZpbGluZyAgPT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIExPR19BUFBTX1NZU1BST0ZJTEVfQyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDEgICsgTE9HX0FQUFNfQkFTRV9DKQorI2RlZmluZSBMT0dfQVBQU19UQVNLUFJPRklMRV9DICAgICAgICAgICAgICAgICAgICAgICgweDAyICArIExPR19BUFBTX0JBU0VfQykKKworLyogVGhlIGxhc3QgZGVmaW5lZCBBUFBTIGxvZyBjb2RlICovCisvKiBDaGFuZ2UgaXQgdG8gKDB4MDIgKyBMT0dfTFRFX0xBU1RfQykgdG8gYWxsb3cgTFRFIGxvZyBjb2RlcyAqLworI2RlZmluZSBMT0dfQVBQU19MQVNUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAyICsgTE9HX0xURV9MQVNUX0MpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvZyBFcXVpcG1lbnQgSURzLgorICogVGhlIG51bWJlciBpcyByZXByZXNlbnRlZCBieSA0IGJpdHMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit0eXBlZGVmIGVudW0geworICBMT0dfRVFVSVBfSURfT0VNICAgPSAwLCAvKiAzcmQgcGFydHkgT0VNIChsaWNlbnNlZSkgdXNlICovCisgIExPR19FUVVJUF9JRF8xWCAgICA9IDEsIC8qIFRyYWRpdGlvbmFsIDFYIGxpbmUgb2YgcHJvZHVjdHMgKi8KKyAgTE9HX0VRVUlQX0lEX1JTVkQyID0gMiwKKyAgTE9HX0VRVUlQX0lEX1JTVkQzID0gMywKKyAgTE9HX0VRVUlQX0lEX1dDRE1BID0gNCwKKyAgTE9HX0VRVUlQX0lEX0dTTSAgID0gNSwKKyAgTE9HX0VRVUlQX0lEX0xCUyAgID0gNiwKKyAgTE9HX0VRVUlQX0lEX1VNVFMgID0gNywKKyAgTE9HX0VRVUlQX0lEX1RETUEgID0gOCwKKyAgTE9HX0VRVUlQX0lEX0JPQSAgID0gOSwKKyAgTE9HX0VRVUlQX0lEX0RUViAgID0gMTAsCisgIExPR19FUVVJUF9JRF9BUFBTICA9IDExLAorICBMT0dfRVFVSVBfSURfRFNQICAgPSAxMiwKKworICBMT0dfRVFVSVBfSURfTEFTVF9ERUZBVUxUID0gTE9HX0VRVUlQX0lEX0RTUAorCit9IGxvZ19lcXVpcF9pZF9lbnVtX3R5cGU7CisKKyNkZWZpbmUgTE9HX0VRVUlQX0lEX01BWCAweEYgLyogVGhlIGVxdWlwbWVudCBJRCBpcyA0IGJpdHMgKi8KKworLyogTm90ZSB0aGF0IHRoZXNlIGFyZSB0aGUgb2ZmaWNpYWwgdmFsdWVzIGFuZCBhcmUgdXNlZCBieSBkZWZhdWx0IGluIAorICAgZGlhZ3R1bmUuaC4KKyovCisjZGVmaW5lIExPR19FUVVJUF9JRF8wX0xBU1RfQ09ERV9ERUZBVUxUIDAgCisjZGVmaW5lIExPR19FUVVJUF9JRF8xX0xBU1RfQ09ERV9ERUZBVUxUIExPR18xWF9MQVNUX0MKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzJfTEFTVF9DT0RFX0RFRkFVTFQgMCAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzNfTEFTVF9DT0RFX0RFRkFVTFQgMCAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzRfTEFTVF9DT0RFX0RFRkFVTFQgMAorI2RlZmluZSBMT0dfRVFVSVBfSURfNV9MQVNUX0NPREVfREVGQVVMVCAwCisjZGVmaW5lIExPR19FUVVJUF9JRF82X0xBU1RfQ09ERV9ERUZBVUxUIDAgCisjZGVmaW5lIExPR19FUVVJUF9JRF83X0xBU1RfQ09ERV9ERUZBVUxUIDAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzhfTEFTVF9DT0RFX0RFRkFVTFQgMAorI2RlZmluZSBMT0dfRVFVSVBfSURfOV9MQVNUX0NPREVfREVGQVVMVCAwIAorI2RlZmluZSBMT0dfRVFVSVBfSURfMTBfTEFTVF9DT0RFX0RFRkFVTFQgMCAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzExX0xBU1RfQ09ERV9ERUZBVUxUIExPR19MVEVfTEFTVF9DIAorI2RlZmluZSBMT0dfRVFVSVBfSURfMTJfTEFTVF9DT0RFX0RFRkFVTFQgMCAKKyNkZWZpbmUgTE9HX0VRVUlQX0lEXzEzX0xBU1RfQ09ERV9ERUZBVUxUIDAgCisjZGVmaW5lIExPR19FUVVJUF9JRF8xNF9MQVNUX0NPREVfREVGQVVMVCAwCisjZGVmaW5lIExPR19FUVVJUF9JRF8xNV9MQVNUX0NPREVfREVGQVVMVCAwCisKKyNlbmRpZiAvKiBMT0dfQ09ERVNfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy92b3NfYXBpLmggYi9DT1JFL1ZPU1MvaW5jL3Zvc19hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc4ZjMyCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy92b3NfYXBpLmgKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fVk9TX0FQSV9IICkKKyNkZWZpbmUgX19WT1NfQVBJX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHZvc19BcGkuaAorICAKKyAgXGJyaWVmIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWNlcyAodk9TUykgQVBJCisgICAgICAgICAgICAgICAKKyAgIEhlYWRlciBmaWxlIHRoYXQgaW5sdWRlcyBhbGwgdGhlIHZPU1MgQVBJIGRlZmluaXRpb25zLgorICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisKKyAgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFIAorICAgCisgICAKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuIAorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLiAKKyAgIAorICAgCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJCAKKyAgIAorICAgCisgIHdoZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5IAorICAtLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMDYvMjMvMDggICAgaGJhICAgICBBZGRlZCB2b3NfcHJlT3BlbigpCisgIDA1LzE4LzA4ICAgIGxhYyAgICAgQ3JlYXRlZCBtb2R1bGUuIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBvbmUgc3RvcCBzaG9wcGluZy4gIFRoaXMgYnJpbmdzIGluIHRoZSBlbnRpcmUgdk9TUyBBUEkuCisjaW5jbHVkZSA8dm9zX3R5cGVzLmg+CisjaW5jbHVkZSA8dm9zX3N0YXR1cy5oPgorI2luY2x1ZGUgPHZvc19tZW1vcnkuaD4KKyNpbmNsdWRlIDx2b3NfbGlzdC5oPgorI2luY2x1ZGUgPHZvc19nZXRCaW4uaD4KKyNpbmNsdWRlIDx2b3NfdHJhY2UuaD4KKyNpbmNsdWRlIDx2b3NfZXZlbnQuaD4KKyNpbmNsdWRlIDx2b3NfbG9jay5oPgorI2luY2x1ZGUgPHZvc19tcS5oPgorI2luY2x1ZGUgPHZvc19udml0ZW0uaD4KKyNpbmNsdWRlIDx2b3NfcGFja2V0Lmg+CisjaW5jbHVkZSA8dm9zX3RocmVhZHMuaD4KKyNpbmNsdWRlIDx2b3NfdGltZXIuaD4KKyNpbmNsdWRlIDx2b3NfcGFja19hbGlnbi5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3ByZU9wZW4oKSAtIFByZU9wZW4gdGhlIHZPU1MgTW9kdWxlICAKKyAgICAKKyAgVGhlIFxhIHZvc19wcmVPcGVuKCkgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBWb3MgQ29udGV4dCwgYnV0IGRvIG5vdCAgICAgIAorICBpbml0aWFsaXplIGFsbCB0aGUgbWVtYmVycy4gVGhpcyBvdmVyYWwgaW5pdGlhbGl6YXRpb24gd2lsbCBoYXBwZW4KKyAgYXQgdm9zX09wZW4oKS4KKyAgVGhlIHJlYXNvbiB3aHkgd2UgbmVlZCB2b3NfcHJlT3BlbigpIGlzIHRvIGdldCBhIG1pbmltdW0gY29udGV4dCAKKyAgd2hlcmUgdG8gc3RvcmUgQkFMIGFuZCBTQUwgcmVsYXRpdmUgZGF0YSwgd2hpY2ggaGFwcGVucyBiZWZvcmUKKyAgdm9zX09wZW4oKSBpcyBjYWxsZWQuCisgIAorICBccGFyYW0gIHBWb3NDb250ZXh0OiBBIHBvaW50ZXIgdG8gd2hlcmUgdG8gc3RvcmUgdGhlIFZPUyBDb250ZXh0IAorIAorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBTY2hlZHVsZXIgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQgCisgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKyAgICAgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBGYWlsdXJlIHRvIGluaXRpYWxpemUgdGhlIHNjaGVkdWxlci8gICAKKyAgICAgICAgICAKKyAgXHNhIHZvc19vcGVuKCkKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcHJlT3BlbiAoIHZfQ09OVEVYVF90ICpwVm9zQ29udGV4dCApOworCitWT1NfU1RBVFVTIHZvc19wcmVDbG9zZSggdl9DT05URVhUX3QgKnBWb3NDb250ZXh0ICk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKworVk9TX1NUQVRVUyB2b3NfcHJlU3RhcnQoIHZfQ09OVEVYVF90IHZvc0NvbnRleHQgKTsKKworI2VuZGlmCisKK1ZPU19TVEFUVVMgdm9zX29wZW4oIHZfQ09OVEVYVF90ICpwVm9zQ29udGV4dCwgdl9TSVpFX3QgaGRkQ29udGV4dFNpemUgKTsKKworCisKK1ZPU19TVEFUVVMgdm9zX3N0YXJ0KCB2X0NPTlRFWFRfdCB2b3NDb250ZXh0ICk7IAorCitWT1NfU1RBVFVTIHZvc19zdG9wKCB2X0NPTlRFWFRfdCB2b3NDb250ZXh0ICk7CisKK1ZPU19TVEFUVVMgdm9zX2Nsb3NlKCB2X0NPTlRFWFRfdCB2b3NDb250ZXh0ICk7CisKKy8qIHZvcyBzaHV0ZG93biB3aWxsIG5vdCBjbG9zZSBjb250cm9sIHRyYW5zcG9ydCBhbmQgd2lsbCBub3QgaGFuZHNoYWtlIHdpdGggUml2YSAqLworVk9TX1NUQVRVUyB2b3Nfc2h1dGRvd24oIHZfQ09OVEVYVF90IHZvc0NvbnRleHQgKTsKKworLyogdGhlIHdkYSBpbnRlcmZhY2UgdG8gc2h1dGRvd24gKi8KK1ZPU19TVEFUVVMgdm9zX3dkYV9zaHV0ZG93biggdl9DT05URVhUX3Qgdm9zQ29udGV4dCApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfZ2V0X2NvbnRleHQoKSAtIGdldCBjb250ZXh0IGRhdGEgYXJlYQorICAKKyAgRWFjaCBtb2R1bGUgaW4gdGhlIHN5c3RlbSBoYXMgYSBjb250ZXh0IC8gZGF0YSBhcmVhIHRoYXQgaXMgYWxsb2NhdGVkCisgIGFuZCBtYWFuZ2VkIGJ5IHZvc3MuICBUaGlzIEFQSSBhbGxvd3MgYW55IHVzZXIgdG8gZ2V0IGEgcG9pbnRlciB0byBpdHMgCisgIGFsbG9jYXRlZCBjb250ZXh0IGRhdGEgYXJlYSBmcm9tIHRoZSBWT1NTIGdsb2JhbCBjb250ZXh0LiAgCisKKyAgXHBhcmFtIHZvc0NvbnRleHQgLSB0aGUgVk9TUyBHbG9iYWwgQ29udGV4dC4gIAorICAKKyAgXHBhcmFtIG1vZHVsZUlkIC0gdGhlIG1vZHVsZSBJRCwgd2hvJ3MgY29udGV4dCBkYXRhIGFyZSBpcyBiZWluZyByZXRyaXZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgXHJldHVybiAtIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgZGF0YSBhcmVhLgorICAKKyAgICAgICAgICAtIE5VTEwgaWYgdGhlIGNvbnRleHQgZGF0YSBpcyBub3QgYWxsb2NhdGVkIGZvciB0aGUgbW9kdWxlIElECisgICAgICAgICAgICBzcGVjaWZpZWQgCisgICAgICAgICAgICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1ZPSURfdCAqdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEIG1vZHVsZUlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQ09OVEVYVF90IHZvc0NvbnRleHQgKTsKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KCkgLSBnZXQgVk9TUyBnbG9iYWwgQ29udGV4dAorICAKKyAgVGhpcyBBUEkgYWxsb3dzIGFueSB1c2VyIHRvIGdldCB0aGUgVk9TIEdsb2JhbCBDb250ZXh0IHBvaW50ZXIgZnJvbSBhCisgIG1vZHVsZSBjb250ZXh0IGRhdGEgYXJlYS4gIAorICAKKyAgXHBhcmFtIG1vZHVsZUNvbnRleHQgLSB0aGUgaW5wdXQgbW9kdWxlIGNvbnRleHQgcG9pbnRlcgorICAKKyAgXHBhcmFtIG1vZHVsZUlkIC0gdGhlIG1vZHVsZSBJRCB3aG8ncyBjb250ZXh0IHBvaW50ZXIgaXMgaW5wdXQgaW4gCisgICAgICAgICBtb2R1bGVDb250ZXh0LgorICAgICAgICAgICAgICAgICAgICAgIAorICBccmV0dXJuIC0gcG9pbnRlciB0byB0aGUgVk9TUyBnbG9iYWwgY29udGV4dAorICAKKyAgICAgICAgICAtIE5VTEwgaWYgdGhlIGZ1bmN0aW9uIGlzIHVuYWJsZSB0byByZXRyZWl2ZSB0aGUgVk9TUyBjb250ZXh0LiAKKyAgICAgICAgICAgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfQ09OVEVYVF90IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoIFZPU19NT0RVTEVfSUQgbW9kdWxlSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKm1vZHVsZUNvbnRleHQgKTsKKwordl9VOF90IHZvc19pc19sb2dwX2luX3Byb2dyZXNzKFZPU19NT0RVTEVfSUQgbW9kdWxlSWQsIHZfVk9JRF90ICptb2R1bGVDb250ZXh0KTsKK3ZvaWQgdm9zX3NldF9sb2dwX2luX3Byb2dyZXNzKFZPU19NT0RVTEVfSUQgbW9kdWxlSWQsIHZfVThfdCB2YWx1ZSk7Cit2X1U4X3Qgdm9zX2lzX2xvYWRfdW5sb2FkX2luX3Byb2dyZXNzKFZPU19NT0RVTEVfSUQgbW9kdWxlSWQsIHZfVk9JRF90ICptb2R1bGVDb250ZXh0KTsKK3ZvaWQgdm9zX3NldF9sb2FkX3VubG9hZF9pbl9wcm9ncmVzcyhWT1NfTU9EVUxFX0lEIG1vZHVsZUlkLCB2X1U4X3QgdmFsdWUpOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfYWxsb2NfY29udGV4dCgpIC0gYWxsb2NhdGUgYSBjb250ZXh0IHdpdGhpbiB0aGUgVk9TUyBnbG9iYWwgQ29udGV4dAorICAKKyAgVGhpcyBBUEkgYWxsb3dzIGFueSB1c2VyIHRvIGFsbG9jYXRlIGEgdXNlciBjb250ZXh0IGFyZWEgd2l0aGluIHRoZSAKKyAgVk9TIEdsb2JhbCBDb250ZXh0LiAgCisgIAorICBccGFyYW0gcFZvc0NvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgVm9zIGNvbnRleHQKKyAgCisgIFxwYXJhbSBtb2R1bGVJZCAtIHRoZSBtb2R1bGUgSUQgd2hvJ3MgY29udGV4dCBhcmVhIGlzIGJlaW5nIGFsbG9jYXRlZC4KKyAgCisgIFxwYXJhbSBwcE1vZHVsZUNvbnRleHQgLSBwb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIHRoZSBwb2ludGVyIHRvIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBjb250ZXh0IGlzIHJldHVybmVkLiAgTm90ZSB0aGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvaW50ZXIgaXMgdmFsaWQgb25seSBpZiB0aGUgQVBJCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIFZPU19TVEFUVVNfU1VDQ0VTUworICAKKyAgXHBhcmFtIHNpemUgLSB0aGUgc2l6ZSBvZiB0aGUgY29udGV4dCBhcmVhIHRvIGJlIGFsbG9jYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgXHJldHVybiAtIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBjb250ZXh0IGZvciB0aGUgbW9kdWxlIElEIGhhcyBiZWVuIAorICAgICAgICAgICAgYWxsb2NhdGVkIHN1Y2Nlc3NmdWxseS4gIFRoZSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGFyZWEKKyAgICAgICAgICAgIGNhbiBiZSBmb3VuZCBpbiAqcHBNb2R1bGVDb250ZXh0LiAgCisgICAgICAgICAgICBcbm90ZSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVk9TX1NUQVRVU19TVUNDRVNTIGlmIHRoZSAKKyAgICAgICAgICAgIG1vZHVsZSBjb250ZXh0IHdhcyBhbHJlYWR5IGFsbG9jYXRlZCBhbmQgdGhlIHNpemUgCisgICAgICAgICAgICBhbGxvY2F0ZWQgbWF0Y2hlcyB0aGUgc2l6ZSBvbiB0aGlzIGNhbGwuCisKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHRoZSBtb2R1bGVJZCBpcyBub3QgYSB2YWxpZCBvciBkb2VzIAorICAgICAgICAgICAgbm90IGlkZW50aWZ5IGEgbW9kdWxlIHRoYXQgY2FuIGhhdmUgYSBjb250ZXh0IGFsbG9jYXRlZC4KKworICAgICAgICAgICAgVk9TX1NUQVRVU19FX0VYSVNUUyAtIHZvcyBjb3VsZCBhbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIGNvbnRleHQgCisgICAgICAgICAgICBiZWNhdXNlIGEgY29udGV4dCBmb3IgdGhpcyBtb2R1bGUgSUQgYWxyZWFkeSBleGlzdHMgYW5kIGl0IGlzCisgICAgICAgICAgICBhICpkaWZmZXJlbnQqIHNpemUgdGhhdCBzcGVjaWZpZWQgb24gdGhpcyBjYWxsLgorICAgICAgICAgICAgCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfTk9NRU0gLSB2b3MgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIAorICAgICAgICAgICAgcmVxdWVzdGVkIGNvbnRleHQgYXJlYS4gIAorICAgICAgICAgICAgICAKKyAgXHNhIHZvc19nZXRfY29udGV4dCgpLCB2b3NfZnJlZV9jb250ZXh0KCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2FsbG9jX2NvbnRleHQoIHZfVk9JRF90ICpwVm9zQ29udGV4dCwgVk9TX01PRFVMRV9JRCBtb2R1bGVJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqKnBwTW9kdWxlQ29udGV4dCwgdl9TSVpFX3Qgc2l6ZSApOworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19mcmVlX2NvbnRleHQoKSAtIGZyZWUgYW4gYWxsb2NhdGVkIGEgY29udGV4dCB3aXRoaW4gdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU1MgZ2xvYmFsIENvbnRleHQKKyAgCisgIFRoaXMgQVBJIGFsbG93cyBhIHVzZXIgdG8gZnJlZSB0aGUgdXNlciBjb250ZXh0IGFyZWEgd2l0aGluIHRoZSAKKyAgVk9TIEdsb2JhbCBDb250ZXh0LiAgCisgIAorICBccGFyYW0gcFZvc0NvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgVm9zIGNvbnRleHQKKyAgCisgIFxwYXJhbSBtb2R1bGVJZCAtIHRoZSBtb2R1bGUgSUQgd2hvJ3MgY29udGV4dCBhcmVhIGlzIGJlaW5nIGZyZWUKKyAgCisgIFxwYXJhbSBwTW9kdWxlQ29udGV4dCAtIHBvaW50ZXIgdG8gbW9kdWxlIGNvbnRleHQgYXJlYSB0byBiZSBmcmVlJ2QuCisgICAgICAgICAgICAgICAgICAgICAgCisgIFxyZXR1cm4gLSBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgY29udGV4dCBmb3IgdGhlIG1vZHVsZSBJRCBoYXMgYmVlbiAKKyAgICAgICAgICAgIGZyZWUnZC4gIFRoZSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGFyZWEgaXMgbm90IGxvbmdlciAKKyAgICAgICAgICAgIGF2YWlsYWJsZS4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gcFZvc0NvbnRleHQgb3IgcE1vZHVsZUNvbnRleHQgYXJlIG5vdCAKKyAgICAgICAgICAgIHZhbGlkIHBvaW50ZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSB0aGUgbW9kdWxlSWQgaXMgbm90IGEgdmFsaWQgb3IgZG9lcyAKKyAgICAgICAgICAgIG5vdCBpZGVudGlmeSBhIG1vZHVsZSB0aGF0IGNhbiBoYXZlIGEgY29udGV4dCBmcmVlJ2QuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9FWElTVFMgLSB2b3MgY291bGQgbm90IGZyZWUgdGhlIHJlcXVlc3RlZCAKKyAgICAgICAgICAgIGNvbnRleHQgYXJlYSBiZWNhdXNlIGEgY29udGV4dCBmb3IgdGhpcyBtb2R1bGUgSUQgZG9lcyBub3QKKyAgICAgICAgICAgIGV4aXN0IGluIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQuCisgICAgICAgICAgICAgIAorICBcc2Egdm9zX2dldF9jb250ZXh0KCkgICAgICAgICAgICAgIAorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfZnJlZV9jb250ZXh0KCB2X1ZPSURfdCAqcFZvc0NvbnRleHQsIFZPU19NT0RVTEVfSUQgbW9kdWxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICpwTW9kdWxlQ29udGV4dCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3ZfQk9PTF90IHZvc19pc19hcHBzX3Bvd2VyX2NvbGxhcHNlX2FsbG93ZWQodm9pZCogcEhkZEN0eCk7Cit2b2lkIHZvc19hYm9ydF9tYWNfc2Nhbih2b2lkKTsKKworLyoqCisgIEBicmllZiB2b3Nfd2xhblNodXRkb3duKCkgLSBUaGlzIEFQSSB3aWxsIHNodXRkb3duIFdMQU4gZHJpdmVyCisKKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBSaXZhIHN1YnN5c3RlbSBjcmFzaGVzLiAgVGhlcmUgYXJlIHR3bworICBtZXRob2RzIChvciBvcGVyYXRpb25zKSBpbiBXTEFOIGRyaXZlciB0byBoYW5kbGUgUml2YSBjcmFzaCwKKyAgICAxLiBzaHV0ZG93bjogQ2FsbGVkIHdoZW4gUml2YSBnb2VzIGRvd24sIHRoaXMgd2lsbCBzaHV0ZG93biBXTEFOCisgICAgICAgICAgICAgICAgIGRyaXZlciB3aXRob3V0IGhhbmRzaGFraW5nIHdpdGggUml2YS4KKyAgICAyLiByZS1pbml0OiAgTmV4dCBBUEkKKworICBAcGFyYW0KKyAgICAgICBOT05FCisgIEByZXR1cm4KKyAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgICAtIE9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gT3BlcmF0aW9uIGZhaWxlZC4KKworKi8KK1ZPU19TVEFUVVMgdm9zX3dsYW5TaHV0ZG93bih2b2lkKTsKKworLyoqCisgIEBicmllZiB2b3Nfd2xhblJlSW5pdCgpIC0gVGhpcyBBUEkgd2lsbCByZS1pbml0IFdMQU4gZHJpdmVyCisKKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBSaXZhIHN1YnN5c3RlbSByZWJvb3RzLiAgVGhlcmUgYXJlIHR3bworICBtZXRob2RzIChvciBvcGVyYXRpb25zKSBpbiBXTEFOIGRyaXZlciB0byBoYW5kbGUgUml2YSBjcmFzaCwKKyAgICAxLiBzaHV0ZG93bjogUHJldmlvdXMgQVBJCisgICAgMi4gcmUtaW5pdDogIENhbGxlZCB3aGVuIFJpdmEgY29tZXMgYmFjayBhZnRlciB0aGUgY3Jhc2guIFRoaXMgd2lsbAorICAgICAgICAgICAgICAgICByZS1pbml0aWFsaXplIFdMQU4gZHJpdmVyLiBJbiBzb21lIGNhc2VzIHJlLW9wZW4gbWF5IGJlCisgICAgICAgICAgICAgICAgIHJlZmVycmVkIGluc3RlYWQgb2YgcmUtaW5pdC4KKyAgQHBhcmFtCisgICAgICAgTk9ORQorICBAcmV0dXJuCisgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTICAgLSBPcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIE9wZXJhdGlvbiBmYWlsZWQuCisKKyovCitWT1NfU1RBVFVTIHZvc193bGFuUmVJbml0KHZvaWQpOworCisjZW5kaWYgLy8gaWYgIWRlZmluZWQgX19WT1NfTlZJVEVNX0gKZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9pbmMvdm9zX2RpYWdfY29yZV9ldmVudC5oIGIvQ09SRS9WT1NTL2luYy92b3NfZGlhZ19jb3JlX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5YTI2NAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVk9TUy9pbmMvdm9zX2RpYWdfY29yZV9ldmVudC5oCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1ZPU19ESUFHX0NPUkVfRVZFTlRfSCApCisjZGVmaW5lIF9fVk9TX0RJQUdfQ09SRV9FVkVOVF9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB2b3NfZXZlbnQuaAorICAKKyAgXGJyaWVmIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWNlcyAodk9TUykgRElBRyBFdmVudHMKKyAgICAgICAgICAgICAgIAorICAgRGVmaW5pdGlvbnMgZm9yIHZPU1MgRXZlbnRzCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAidm9zX3R5cGVzLmgiCisjaW5jbHVkZSAidm9zX3BhY2tfYWxpZ24uaCIKKyNpbmNsdWRlICJpX3Zvc19kaWFnX2NvcmVfZXZlbnQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBFdmVudCBJRDogRVZFTlRfV0xBTl9TRUNVUklUWQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZfVThfdCBldmVudElkOworICAgdl9VOF90IGF1dGhNb2RlOworICAgdl9VOF90IGVuY3J5cHRpb25Nb2RlVW5pY2FzdDsKKyAgIHZfVThfdCBlbmNyeXB0aW9uTW9kZU11bHRpY2FzdDsKKyAgIHZfVThfdCBwbWtJRE1hdGNoOworICAgdl9VOF90IGJzc2lkWzZdOworICAgdl9VOF90IGtleUlkOworICAgdl9VOF90IHN0YXR1czsKK30gdm9zX2V2ZW50X3dsYW5fc2VjdXJpdHlfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEV2ZW50IElEOiBFVkVOVF9XTEFOX1NUQVRVUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZfVThfdCBldmVudElkOworICAgdl9VOF90IHNzaWRbNl07CisgICB2X1U4X3QgYnNzVHlwZTsKKyAgIHZfVThfdCByc3NpOworICAgdl9VOF90IGNoYW5uZWw7CisgICB2X1U4X3QgcW9zQ2FwYWJpbGl0eTsKKyAgIHZfVThfdCBhdXRoVHlwZTsKKyAgIHZfVThfdCBlbmNyeXB0aW9uVHlwZTsKKyAgIHZfVThfdCByZWFzb247CisgICB2X1U4X3QgcmVhc29uRGlzY29ubmVjdDsKK30gdm9zX2V2ZW50X3dsYW5fc3RhdHVzX3BheWxvYWRfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBFdmVudCBJRDogRVZFTlRfV0xBTl9IQU5ET0ZGCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgdl9VOF90IGV2ZW50SWQ7CisgICB2X1U4X3QgY3VycmVudEFwQnNzaWRbNl07CisgICB2X1U4X3QgY3VycmVudEFwUnNzaTsKKyAgIHZfVThfdCBjYW5kaWRhdGVBcEJzc2lkWzZdOworICAgdl9VOF90IGNhbmRpZGF0ZUFwUnNzaTsKK30gdm9zX2V2ZW50X3dsYW5faGFuZG9mZl9wYXlsb2FkX3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRXZlbnQgSUQ6IEVWRU5UX1dMQU5fVkNDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgdl9VOF90IGV2ZW50SWQ7CisgICB2X1U4X3QgcnNzaTsKKyAgIHZfVThfdCB0eFBlcjsKKyAgIHZfVThfdCByeFBlcjsKKyAgIGludCAgICBsaW5rUXVhbGl0eTsKK30gdm9zX2V2ZW50X3dsYW5fdmNjX3BheWxvYWRfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBFdmVudCBJRDogRVZFTlRfV0xBTl9RT1MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICB2X1U4X3QgZXZlbnRJZDsKKyAgIHZfVThfdCByZWFzb25Db2RlOworfSB2b3NfZXZlbnRfd2xhbl9xb3NfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEV2ZW50IElEOiBFVkVOVF9XTEFOX1BFCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgY2hhciAgICAgICBic3NpZFs2XTsKKyAgIHZfVTE2X3QgICAgZXZlbnRfdHlwZTsKKyAgIHZfVTE2X3QgICAgc21lX3N0YXRlOworICAgdl9VMTZfdCAgICBtbG1fc3RhdGU7CisgICB2X1UxNl90ICAgIHN0YXR1czsKKyAgIHZfVTE2X3QgICAgcmVhc29uX2NvZGU7ICAgCit9IHZvc19ldmVudF93bGFuX3BlX3BheWxvYWRfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBFdmVudCBJRDogRVZFTlRfV0xBTl9BRERfQkxPQ0tfQUNLX1NVQ0NFU1MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgICAgICAgIHVjQmFQZWVyTWFjWzZdOworICB2X1U4X3QgICAgICB1Y0JhVGlkOworICB2X1U4X3QgICAgICB1Y0JhQnVmZmVyU2l6ZTsKKyAgdl9VMTZfdCAgICAgdXNCYVNTTjsKKyAgdl9VOF90ICAgICAgZkluaXRpYXRvcjsgCit9IHZvc19ldmVudF93bGFuX2FkZF9ibG9ja19hY2tfc3VjY2Vzc19wYXlsb2FkX3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRXZlbnQgSUQ6IEVWRU5UX1dMQU5fQUREX0JMT0NLX0FDS19GQUlMRUQKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgICAgICAgIHVjQmFQZWVyTWFjWzZdOyAKKyAgdl9VOF90ICAgICAgdWNCYVRpZDsKKyAgdl9VOF90ICAgICAgdWNSZWFzb25Db2RlOworICB2X1U4X3QgICAgICBmSW5pdGlhdG9yOyAKK30gdm9zX2V2ZW50X3dsYW5fYWRkX2Jsb2NrX2Fja19mYWlsZWRfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEV2ZW50IElEOiBFVkVOVF9XTEFOX0RFTEVURV9CTE9DS19BQ0tfU1VDQ0VTUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAgICAgICAgdWNCYVBlZXJNYWNbNl07IAorICB2X1U4X3QgICAgICB1Y0JhVGlkOworICB2X1U4X3QgICAgICB1Y0RlbGV0ZVJlYXNvbkNvZGU7IAorfSB2b3NfZXZlbnRfd2xhbl9hZGRfYmxvY2tfYWNrX2RlbGV0ZWRfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEV2ZW50IElEOiBFVkVOVF9XTEFOX0RFTEVURV9CTE9DS19BQ0tfRkFJTEVECisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICBjaGFyICAgICAgICB1Y0JhUGVlck1hY1s2XTsgCisgIHZfVThfdCAgICAgIHVjQmFUaWQ7CisgIHZfVThfdCAgICAgIHVjRGVsZXRlUmVhc29uQ29kZTsgCisgIHZfVThfdCAgICAgIHVjRmFpbFJlYXNvbkNvZGU7Cit9IHZvc19ldmVudF93bGFuX2FkZF9ibG9ja19hY2tfZGVsZXRlX2ZhaWxlZF9wYXlsb2FkX3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRXZlbnQgSUQ6IEVWRU5UX1dMQU5fQlNTX1BST1RFQ1RJT04KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHZfVThfdCAgICAgIGV2ZW50X3R5cGU7CisgIHZfVThfdCAgICAgIHByb3RfdHlwZTsgCit9IHZvc19ldmVudF93bGFuX2Jzc19wcm90X3BheWxvYWRfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBFdmVudCBJRDogRVZFTlRfV0xBTl9CUklOR1VQX1NUQVRVUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZfVTE2X3QgIHdsYW5TdGF0dXM7CisgICBjaGFyICAgICBkcml2ZXJWZXJzaW9uWzEwXTsKK30gdm9zX2V2ZW50X3dsYW5fYnJpbmd1cF9zdGF0dXNfcGF5bG9hZF90eXBlOworCitWT1NfUEFDS19TVEFSVAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEV2ZW50IElEOiBFVkVOVF9XTEFOX1BPV0VSU0FWRV9HRU5FUklDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIFZPU19QQUNLX1BSRSBzdHJ1Y3QKK3sKKyAgIHZfVThfdCAgIGV2ZW50X3N1YnR5cGU7CisgICB2X1UzMl90ICBpbXBzX3BlcmlvZDsKKyAgIHZfVThfdCAgIGZ1bGxfcG93ZXJfcmVxdWVzdF9yZWFzb247CisgICB2X1U4X3QgICBwbWNfY3VycmVudF9zdGF0ZTsKKyAgIHZfVThfdCAgIGVuYWJsZV9kaXNhYmxlX3Bvd2Vyc2F2ZV9tb2RlOworICAgdl9VOF90ICAgd2lubW9iX2RfcG93ZXJfc3RhdGU7CisgICB2X1U4X3QgICBkdGltX3BlcmlvZDsKKyAgIHZfVTE2X3QgIGZpbmFsX2xpc3Rlbl9pbnR2OworICAgdl9VMTZfdCAgYm1wc19hdXRvX3RpbWVyX2R1cmF0aW9uOworICAgdl9VMTZfdCAgYm1wc19wZXJpb2Q7Cit9IFZPU19QQUNLX1BPU1Qgdm9zX2V2ZW50X3dsYW5fcG93ZXJzYXZlX3BheWxvYWRfdHlwZTsKKworVk9TX1BBQ0tfRU5ECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRXZlbnQgSUQ6IEVWRU5UX1dMQU5fUE9XRVJTQVZFX1dPVworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZfVThfdCAgIGV2ZW50X3N1YnR5cGU7CisgICB2X1U4X3QgICB3b3dfdHlwZTsKKyAgIHZfVThfdCAgIHdvd19tYWdpY19wYXR0ZXJuWzZdOworICAgdl9VOF90ICAgd293X2RlbF9wdHJuX2lkOworICAgdl9VOF90ICAgd293X3dha2V1cF9jYXVzZTsKKyAgIHZfVThfdCAgIHdvd193YWtldXBfY2F1c2VfcGJtX3B0cm5faWQ7Cit9IHZvc19ldmVudF93bGFuX3Bvd2Vyc2F2ZV93b3dfcGF5bG9hZF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEV2ZW50IElEOiBFVkVOVF9XTEFOX0JUQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZfVThfdCAgZXZlbnRJZDsKKyAgIHZfVThfdCAgYnRBZGRyWzZdOworICAgdl9VMTZfdCBjb25uSGFuZGxlOworICAgdl9VOF90ICBjb25uU3RhdHVzOworICAgdl9VOF90ICBsaW5rVHlwZTsKKyAgIHZfVThfdCAgc2NvSW50ZXJ2YWw7CisgICB2X1U4X3QgIHNjb1dpbmRvdzsKKyAgIHZfVThfdCAgcmV0cmFuc1dpbmRvdzsKKyAgIHZfVThfdCAgbW9kZTsKK30gdm9zX2V2ZW50X3dsYW5fYnRjX3R5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvLyBfX1ZPU19ESUFHX0NPUkVfRVZFTlRfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy92b3NfZGlhZ19jb3JlX2xvZy5oIGIvQ09SRS9WT1NTL2luYy92b3NfZGlhZ19jb3JlX2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDM1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL3Zvc19kaWFnX2NvcmVfbG9nLmgKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fVk9TX0RJQUdfQ09SRV9MT0dfSCApCisjZGVmaW5lIF9fVk9TX0RJQUdfQ09SRV9MT0dfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgdm9zX2V2ZW50LmgKKyAgCisgIFxicmllZiB2aXJ0dWFsIE9wZXJhdGluZyBTeXN0ZW0gU2VydmljZXMgKHZPU1MpIERJQUcgbG9ncworICAgICAgICAgICAgICAgCisgICBEZWZpbml0aW9ucyBmb3Igdk9TUyBFdmVudHMKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJpX3Zvc19kaWFnX2NvcmVfbG9nLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFZPU19MT0dfTUFYX05VTV9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBWT1NfTE9HX01BWF9OVU1fQlNTSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgVk9TX0xPR19NQVhfU1NJRF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFZPU19MT0dfTUFYX0JTU0lEX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFZPU19MT0dfTUFYX05VTV9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBWT1NfTE9HX01BWF9OVU1fSE9fQ0FORElEQVRFX0FQUyAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgVk9TX0xPR19NQVhfV09XX1BUUk5fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBWT1NfTE9HX01BWF9XT1dfUFRSTl9NQVNLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMTYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoaXMgcGFja2V0IGNvbnRhaW5zIHRoZSBzY2FuIHJlc3VsdHMgb2YgdGhlIHJlY2VudCBzY2FuIG9wZXJhdGlvbiAKKyAgIExPR19XTEFOX1NDQU5fQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ5NiAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgCit0eXBlZGVmIHN0cnVjdAoreworICAgbG9nX2hkcl90eXBlICBoZHI7CisgICB2X1U4X3QgIGV2ZW50SWQ7CisgICB2X1U4X3QgIG51bVNzaWQ7CisgICB2X1U4X3QgIHNzaWRbVk9TX0xPR19NQVhfTlVNX1NTSURdW1ZPU19MT0dfTUFYX1NTSURfU0laRV07CisgICB2X1U4X3QgIGJzc2lkW1ZPU19MT0dfTUFYX05VTV9CU1NJRF1bVk9TX0xPR19NQVhfQlNTSURfU0laRV07CisgICB2X1U4X3QgIHRvdGFsU3NpZDsKKyAgIHZfVThfdCAgbWluQ2huVGltZTsKKyAgIHZfVThfdCAgbWF4Q2huVGltZTsKKyAgIHZfVTE2X3QgdGltZUJldHdlZW5CZ1NjYW47CisgICB2X1U4X3QgIEJTU01vZGU7CisgICB2X1U4X3QgIG51bUNoYW5uZWw7CisgICB2X1U4X3QgIGNoYW5uZWxzW1ZPU19MT0dfTUFYX05VTV9DSEFOTkVMXTsKKyAgIHZfVTE2X3Qgc3RhdHVzOworfSB2b3NfbG9nX3NjYW5fcGt0X3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUaGlzIHBhY2tldCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBJQlNTIGNvbm5lY3Rpb24gc2V0dXAgIAorICAgTE9HX1dMQU5fSUJTU19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDk3IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAKK3R5cGVkZWYgc3RydWN0IAoreworICAgbG9nX2hkcl90eXBlICBoZHI7CisgICB2X1U4X3QgZXZlbnRJZDsKKyAgIHZfVThfdCBjaGFubmVsU2V0dGluZzsKKyAgIHZfVThfdCBic3NpZFtWT1NfTE9HX01BWF9CU1NJRF9TSVpFXTsKKyAgIHZfVThfdCBwZWVyTWFjQWRkcltWT1NfTE9HX01BWF9CU1NJRF9TSVpFXTsKKyAgIHZfVThfdCBzc2lkW1ZPU19MT0dfTUFYX1NTSURfU0laRV07CisgICB2X1U4X3Qgb3BlcmF0aW5nQ2hhbm5lbDsKKyAgIHZfVThfdCBiZWFjb25JbnRlcnZhbDsKKyAgIHZfVThfdCBzdGF0dXM7Cit9IHZvc19sb2dfaWJzc19wa3RfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoaXMgcGFja2V0IGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIDgwMi4xMUQgICAKKyAgIExPR19XTEFOXzgwMjExRF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ5OCAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgCit0eXBlZGVmIHN0cnVjdAoreworICAgbG9nX2hkcl90eXBlICBoZHI7CisgICB2X1U4X3QgZXZlbnRJZDsKKyAgIHZfVThfdCBudW1DaGFubmVsOworICAgdl9VOF90IENoYW5uZWxzW1ZPU19MT0dfTUFYX05VTV9DSEFOTkVMXTsKKyAgIHZfVThfdCBUeFB3cltWT1NfTE9HX01BWF9OVU1fQ0hBTk5FTF07CisgICB2X1U4X3QgY291bnRyeUNvZGVbM107CisgICB2X1U4X3Qgc3VwcG9ydE11bHRpcGxlRG9tYWluOworfSB2b3NfbG9nXzgwMl8xMWRfcGt0X3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGlzIGEgbG9nIHBhY2tldCB3aGljaCBjb250YWlucyBiZWxvdyBoYW5kb2ZmIGluZm9ybWF0aW9uOgorLSBDdXJyZW50IEFQICsgUlNTSSAoaWYgYWxyZWFkeSBhc3NvY2lhdGVkKQorLSBDYW5kaWRhdGUgQVAgKyBSU1NJIChiZWZvcmUgYXNzb2NpYXRpb24gYW5kIHdoZW4gdGhlIGxpc3QgaXMgdXBkYXRlZCkKKy0gRm9yIGVhY2ggQlNTSUQgaW4gY2FuZGlkYXRlIGxpc3QsIHByb3ZpZGUgUlNTSSwgUW9TIGFuZCBzZWN1cml0eSBjb21wYXRpYmlsaXR5CitMT0dfV0xBTl9IQU5ET0ZGX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0OTkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgCit0eXBlZGVmIHN0cnVjdAoreworICB2X1U4X3QgICAgICAgIHNzaWRbOV07CisgIHZfVThfdCAgICAgICAgYnNzaWRbVk9TX0xPR19NQVhfQlNTSURfU0laRV07CisgIHZfVThfdCAgICAgICAgY2hhbm5lbF9pZDsKKyAgdl9VMzJfdCAgICAgICBxb3Nfc2NvcmU7CisgIHZfVTMyX3QgICAgICAgc2VjX3Njb3JlOworICB2X1UzMl90ICAgICAgIHJzc2lfc2NvcmU7CisgIHZfVTMyX3QgICAgICAgb3ZlcmFsbF9zY29yZTsKKyAgdl9VMzJfdCAgICAgICB0eF9wZXI7ICAgICAvKiByZXByZXNlbnRlZCBhcyBhICUgICAgICAqLworICB2X1UzMl90ICAgICAgIHJ4X3BlcjsgICAgIC8qIHJlcHJlc2VudGVkIGFzIGEgJSAgICAgICovCisKK30gdm9zX2xvZ19ob19hcF9pbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICBsb2dfaGRyX3R5cGUgICAgICAgaGRyOworICB2X1UzMl90ICAgICAgICAgICAgbnVtX2FwczsKKyAgdm9zX2xvZ19ob19hcF9pbmZvIGN1cnJlbnRfYXBfaW5mbzsKKyAgdm9zX2xvZ19ob19hcF9pbmZvIGNhbmRpZGF0ZV9hcF9pbmZvW1ZPU19MT0dfTUFYX05VTV9IT19DQU5ESURBVEVfQVBTXTsKK30gdm9zX2xvZ19ob19wa3RfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoaXMgcGFja2V0IGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBFRENBIHBhcmFtZXRlcnMgCisgICBhZHZlcnRpc2VkIGJ5IHRoZSBBUAorICAgTE9HX1dMQU5fUU9TX0VEQ0FfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDlBCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbG9nX2hkcl90eXBlICAgICAgIGhkcjsKKyAgdl9VOF90ICAgICAgICAgICAgIGFjaV9iZTsKKyAgdl9VOF90ICAgICAgICAgICAgIGN3X2JlOworICB2X1UxNl90ICAgICAgICAgICAgdHhvcGxpbWl0X2JlOworICB2X1U4X3QgICAgICAgICAgICAgYWNpX2JrOworICB2X1U4X3QgICAgICAgICAgICAgY3dfYms7CisgIHZfVTE2X3QgICAgICAgICAgICB0eG9wbGltaXRfYms7CisgIHZfVThfdCAgICAgICAgICAgICBhY2lfdmk7CisgIHZfVThfdCAgICAgICAgICAgICBjd192aTsKKyAgdl9VMTZfdCAgICAgICAgICAgIHR4b3BsaW1pdF92aTsKKyAgdl9VOF90ICAgICAgICAgICAgIGFjaV92bzsKKyAgdl9VOF90ICAgICAgICAgICAgIGN3X3ZvOworICB2X1UxNl90ICAgICAgICAgICAgdHhvcGxpbWl0X3ZvOworfSB2b3NfbG9nX3Fvc19lZGNhX3BrdF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhpcyBwYWNrZXQgY29udGFpbnMgdGhlIHRvdGFsIG51bWJlciBvZiBiZWFjb24gcmVjZWl2ZWQgdmFsdWUgICAgCisgICBMT0dfV0xBTl9CRUFDT05fVVBEQVRFX0MgICAgICAgICAgICAgICAgICAgICAgICAweDE0OUIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICBsb2dfaGRyX3R5cGUgICAgICAgaGRyOworICB2X1UzMl90ICAgICAgICAgICAgYmNuX3J4X2NudDsKK30gdm9zX2xvZ19iZWFjb25fdXBkYXRlX3BrdF90eXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhpcyBwYWNrZXQgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYSBXb1cgcGF0ZXJuIHZhbHVlIHdoZW4gc2V0CisgICBMT0dfV0xBTl9QT1dFUlNBVkVfV09XX0FERF9QVFJOX0MgICAgICAgICAgICAgICAweDE0OUMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbG9nX2hkcl90eXBlICAgICAgIGhkcjsKKyAgdl9VOF90ICAgICAgICAgICAgIHBhdHRlcm5faWQ7CisgIHZfVThfdCAgICAgICAgICAgICBwYXR0ZXJuX2J5dGVfb2Zmc2V0OworICB2X1U4X3QgICAgICAgICAgICAgcGF0dGVybl9zaXplOworICB2X1U4X3QgICAgICAgICAgICAgcGF0dGVybltWT1NfTE9HX01BWF9XT1dfUFRSTl9TSVpFXTsKKyAgdl9VOF90ICAgICAgICAgICAgIHBhdHRlcm5fbWFza19zaXplOworICB2X1U4X3QgICAgICAgICAgICAgcGF0dGVybl9tYXNrW1ZPU19MT0dfTUFYX1dPV19QVFJOX01BU0tfU0laRV07Cit9IHZvc19sb2dfcG93ZXJzYXZlX3dvd19hZGRfcHRybl9wa3RfdHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoaXMgcGFja2V0IGNvbnRhaW5zIHRoZSBQSFkgJiBNQUMgbGF5ZXIgc3RhdGlzdGljcyBzZW50IGJ5IGxvd2VyIGxheWVyCisgICBfV0xBTl9MSU5LTEFZRVJfU1RBVF9DICAgICAgICAgICAgICAgICAgICAgICAweDE0QTEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgdl9VMzJfdCByZXRyeV9jbnRbNF07CisgICB2X1UzMl90IG11bHRpcGxlX3JldHJ5X2NudFs0XTsKKyAgIHZfVTMyX3QgdHhfZnJtX2NudFs0XTsKKyAgIHZfVTMyX3QgcnhfZnJtX2NudDsKKyAgIHZfVTMyX3QgZnJtX2R1cF9jbnQ7CisgICB2X1UzMl90IGZhaWxfY250WzRdOworICAgdl9VMzJfdCBydHNfZmFpbF9jbnQ7CisgICB2X1UzMl90IGFja19mYWlsX2NudDsKKyAgIHZfVTMyX3QgcnRzX3N1Y2NfY250OworICAgdl9VMzJfdCByeF9kaXNjYXJkX2NudDsKKyAgIHZfVTMyX3QgcnhfZXJyb3JfY250OworICAgdl9VMzJfdCB0eF9ieXRlX2NudDsKKworfSBzdW1tYXJ5U3RhdHNJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgdl9VMzJfdCByeF9mcmFnX2NudDsKKyAgIHZfVTMyX3QgcHJvbWlzY3VvdXNfcnhfZnJhZ19jbnQ7CisgICB2X1UzMl90IHJ4X2lucHV0X3NlbnNpdGl2aXR5OworICAgdl9VMzJfdCBtYXhfcHdyOworICAgdl9VMzJfdCBzeW5jX2ZhaWxfY250OworICAgdl9VMzJfdCB0eF9yYXRlOworCit9IGdsb2JhbENsYXNzQVN0YXRzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZfVTMyX3QgdWNfcnhfd2VwX3VuZW5jcnlwdGVkX2ZybV9jbnQ7CisgICB2X1UzMl90IHVjX3J4X21pY19mYWlsX2NudDsKKyAgIHZfVTMyX3QgdWNfdGtpcF9pY3ZfZXJyOworICAgdl9VMzJfdCB1Y19hZXNfY2NtcF9mb3JtYXRfZXJyOworICAgdl9VMzJfdCB1Y19hZXNfY2NtcF9yZXBsYXlfY250OworICAgdl9VMzJfdCB1Y19hZXNfY2NtcF9kZWNycHRfZXJyOworICAgdl9VMzJfdCB1Y193ZXBfdW5kZWNyeXB0YWJsZV9jbnQ7CisgICB2X1UzMl90IHVjX3dlcF9pY3ZfZXJyOworICAgdl9VMzJfdCB1Y19yeF9kZWNyeXB0X3N1Y2NfY250OworICAgdl9VMzJfdCB1Y19yeF9kZWNyeXB0X2ZhaWxfY250OworICAgdl9VMzJfdCBtY2JjX3J4X3dlcF91bmVuY3J5cHRlZF9mcm1fY250OworICAgdl9VMzJfdCBtY2JjX3J4X21pY19mYWlsX2NudDsKKyAgIHZfVTMyX3QgbWNiY190a2lwX2ljdl9lcnI7CisgICB2X1UzMl90IG1jYmNfYWVzX2NjbXBfZm9ybWF0X2VycjsKKyAgIHZfVTMyX3QgbWNiY19hZXNfY2NtcF9yZXBsYXlfY250OworICAgdl9VMzJfdCBtY2JjX2Flc19jY21wX2RlY3JwdF9lcnI7CisgICB2X1UzMl90IG1jYmNfd2VwX3VuZGVjcnlwdGFibGVfY250OworICAgdl9VMzJfdCBtY2JjX3dlcF9pY3ZfZXJyOworICAgdl9VMzJfdCBtY2JjX3J4X2RlY3J5cHRfc3VjY19jbnQ7CisgICB2X1UzMl90IG1jYmNfcnhfZGVjcnlwdF9mYWlsX2NudDsKKworfSBnbG9iYWxDbGFzc0JTdGF0c0luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICB2X1UzMl90IHJ4X2Ftc2R1X2NudDsKKyAgIHZfVTMyX3QgcnhfYW1wZHVfY250OworICAgdl9VMzJfdCB0eF8yMF9mcm1fY250OworICAgdl9VMzJfdCByeF8yMF9mcm1fY250OworICAgdl9VMzJfdCByeF9tcGR1X2luX2FtcGR1X2NudDsKKyAgIHZfVTMyX3QgYW1wZHVfZGVsaW1pdGVyX2NyY19lcnI7CisKK30gZ2xvYmFsQ2xhc3NDU3RhdHNJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgdl9VMzJfdCB0eF91Y19mcm1fY250OworICAgdl9VMzJfdCB0eF9tY19mcm1fY250OworICAgdl9VMzJfdCB0eF9iY19mcm1fY250OworICAgdl9VMzJfdCByeF91Y19mcm1fY250OworICAgdl9VMzJfdCByeF9tY19mcm1fY250OworICAgdl9VMzJfdCByeF9iY19mcm1fY250OworICAgdl9VMzJfdCB0eF91Y19ieXRlX2NudFs0XTsKKyAgIHZfVTMyX3QgdHhfbWNfYnl0ZV9jbnQ7CisgICB2X1UzMl90IHR4X2JjX2J5dGVfY250OworICAgdl9VMzJfdCByeF91Y19ieXRlX2NudFs0XTsKKyAgIHZfVTMyX3QgcnhfbWNfYnl0ZV9jbnQ7CisgICB2X1UzMl90IHJ4X2JjX2J5dGVfY250OworICAgdl9VMzJfdCByeF9ieXRlX2NudDsKKyAgIHZfVTMyX3QgbnVtX3J4X2J5dGVzX2NyY19vazsKKyAgIHZfVTMyX3QgcnhfcmF0ZTsKKworfSBnbG9iYWxDbGFzc0RTdGF0c0luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICB2X1UzMl90IHR4X2ZyYWdfY250WzRdOworICAgdl9VMzJfdCB0eF9hbXBkdV9jbnQ7CisgICB2X1UzMl90IHR4X21wZHVfaW5fYW1wZHVfY250OworfSBwZXJTdGFTdGF0c0luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGxvZ19oZHJfdHlwZSAgICAgICAgICAgICBoZHI7CisgIHZfVThfdCAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOworICB2X1U4X3QgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbM107CisgIHZfVTMyX3QgICAgICAgICAgICAgICAgICBzdGF0X21hc2s7CisgIHN1bW1hcnlTdGF0c0luZm8gICAgICAgICBzdW1tYXJ5U3RhdHM7CisgIGdsb2JhbENsYXNzQVN0YXRzSW5mbyAgICBnbG9iYWxDbGFzc0FTdGF0czsKKyAgZ2xvYmFsQ2xhc3NCU3RhdHNJbmZvICAgIGdsb2JhbENsYXNzQlN0YXRzOworICBnbG9iYWxDbGFzc0NTdGF0c0luZm8gICAgZ2xvYmFsQ2xhc3NDU3RhdHM7CisgIGdsb2JhbENsYXNzRFN0YXRzSW5mbyAgICBnbG9iYWxDbGFzc0RTdGF0czsKKyAgcGVyU3RhU3RhdHNJbmZvICAgICAgICAgIHBlclN0YVN0YXRzOworfSB2b3NfbG9nX3N0YXRpc3RpY3NfcGt0X3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUaGlzIHBhY2tldCBjb250YWlucyB0aGUgVHNwZWMgaW5mbyBuZWdvdGlhdGVkIHdpdGggdGhlIEFQIGZvciB0aGUgCisgICBzcGVjaWZpYyBBQyAKKyAgIExPR19XTEFOX1FPU19UU1BFQ19DICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTRBMiAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICBsb2dfaGRyX3R5cGUgICAgaGRyOworICB2X1U4X3QgICAgICAgICAgdHNpbmZvWzNdOworICB2X1UxNl90ICAgICAgICAgbm9taW5hbF9tc2R1X3NpemU7CisgIHZfVTE2X3QgICAgICAgICBtYXhpbXVtX21zZHVfc2l6ZTsKKyAgdl9VMzJfdCAgICAgICAgIG1pbl9zZXJ2aWNlX2ludGVydmFsOworICB2X1UzMl90ICAgICAgICAgbWF4X3NlcnZpY2VfaW50ZXJ2YWw7CisgIHZfVTMyX3QgICAgICAgICBpbmFjdGl2aXR5X2ludGVydmFsOworICB2X1UzMl90ICAgICAgICAgc3VzcGVuc2lvbl9pbnRlcnZhbDsKKyAgdl9VMzJfdCAgICAgICAgIHN2Y19zdGFydF90aW1lOworICB2X1UzMl90ICAgICAgICAgbWluX2RhdGFfcmF0ZTsKKyAgdl9VMzJfdCAgICAgICAgIG1lYW5fZGF0YV9yYXRlOworICB2X1UzMl90ICAgICAgICAgcGVha19kYXRhX3JhdGU7CisgIHZfVTMyX3QgICAgICAgICBtYXhfYnVyc3Rfc2l6ZTsKKyAgdl9VMzJfdCAgICAgICAgIGRlbGF5X2JvdW5kOworICB2X1UzMl90ICAgICAgICAgbWluX3BoeV9yYXRlOworICB2X1UxNl90ICAgICAgICAgc3VycGx1c19id19hbGxvd2FuY2U7CisgIHZfVTE2X3QgICAgICAgICBtZWRpdW1fdGltZTsKK30gdm9zX2xvZ19xb3NfdHNwZWNfcGt0X3R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLy8gX19WT1NfRElBR19DT1JFX0xPR19ICmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL3Zvc19ldmVudC5oIGIvQ09SRS9WT1NTL2luYy92b3NfZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTVjZWZhCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy92b3NfZXZlbnQuaApAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19WT1NfRVZFTlRfSCApCisjZGVmaW5lIF9fVk9TX0VWRU5UX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHZvc19ldmVudC5oCisgIAorICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpY2VzICh2T1NTKSBFdmVudHMKKyAgICAgICAgICAgICAgIAorICAgRGVmaW5pdGlvbnMgZm9yIHZPU1MgRXZlbnRzCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAidm9zX3N0YXR1cy5oIgorI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgImlfdm9zX2V2ZW50LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2V2ZW50X2luaXQoKSAtIGluaXRpYWxpemUgYSB2T1NTIGV2ZW50CisgIAorICBUaGUgXGEgdm9zX2xvY2tfZXZlbnQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGV2ZW50LiBVcG9uIAorICBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLCB0aGUgc3RhdGUgb2YgdGhlIGV2ZW50IGJlY29tZXMgaW5pdGlhbGl6ZWQgCisgIGFuZCBub3QgJ3NpZ25hbGVkLgorCisgIEFuIGV2ZW50IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IG1heSBiZSB1c2VkIGluIGFueSBvdGhlciBsb2NrIAorICBmdW5jdGlvbnMuIAorICAKKyAgQXR0ZW1wdGluZyB0byBpbml0aWFsaXplIGFuIGFscmVhZHkgaW5pdGlhbGl6ZWQgZXZlbnQgcmVzdWx0cyBpbiAKKyAgYSBmYWlsdXJlLgorIAorICBccGFyYW0gbG9jayAtIHBvaW50ZXIgdG8gdGhlIG9wYXF1ZSBldmVudCBvYmplY3QgdG8gaW5pdGlhbGl6ZQorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBldmVudCB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZCAKKyAgICAgICAgICBpcyByZWFkeSB0byBiZSB1c2VkLgorICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpIAorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZSB0byBpbml0aWxpemUgdGhlIGV2ZW50CisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfTk9NRU0gLSBpbnN1ZmZpY2llbnQgbWVtb3J5IGV4aXN0cyB0byBpbml0aWFsaXplIAorICAgICAgICAgIHRoZSBldmVudAorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0JVU1kgLSBUaGUgaW1wbGVtZW50YXRpb24gaGFzIGRldGVjdGVkIGFuIGF0dGVtcHQgCisgICAgICAgICAgdG8gcmVpbml0aWFsaXplIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSBldmVudCwgYSBwcmV2aW91c2x5IAorICAgICAgICAgIGluaXRpYWxpemVkLCBidXQgbm90IHlldCBkZXN0cm95ZWQsIGV2ZW50LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIGV2ZW50IGlzIGFuIGludmFsaWQgcG9pbnRlci4gICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfZXZlbnRfaW5pdCggdm9zX2V2ZW50X3QgKmV2ZW50ICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfZXZlbnRfc2V0KCkgLSBzZXQgYSB2T1NTIGV2ZW50CisKKyAgVGhlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQgaXMgc2V0IHRvICdzaWduYWxsZWQgYnkgY2FsbGluZyAKKyAgXGEgdm9zX2V2ZW50X3NldCgpLiAgVGhlIHN0YXRlIG9mIHRoZSBldmVudCByZW1haW5zIHNpZ25hbGxlZCB1bnRpbCBhbiAKKyAgZXhwbGljaXQgY2FsbCB0byB2b3NfZXZlbnRfcmVzZXQoKS4gIAorICAKKyAgQW55IHRocmVhZHMgd2FpdGluZyBvbiB0aGUgZXZlbnQgYXMgYSByZXN1bHQgb2YgYSB2b3NfZXZlbnRfd2FpdCgpIHdpbGwgCisgIGJlIHVuYmxvY2tlZCBhbmQgYXZhaWxhYmxlIHRvIGJlIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uIHdoZW4gdGhlIGV2ZW50CisgIGlzIHNpZ25hbGVkIGJ5IGEgY2FsbCB0byBcYSB2b3NfZXZlbnRfc2V0KCkuICAKKyAgICAKKyAgXHBhcmFtIGV2ZW50IC0gdGhlIGV2ZW50IHRvIHNldCB0byB0aGUgc2lnbmFsbGVkIHN0YXRlCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBldmVudCB3YXMgc3VjY2Vzc2Z1bGx5IHNpZ25hbGxlZC4KKyAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBldmVudCBkb2VzIG5vdCByZWZlciAKKyAgICAgICAgICB0byBhbiBpbml0aWFsaXplZCBldmVudCBvYmplY3QuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIGV2ZW50IGlzIGFuIGludmFsaWQgcG9pbnRlci4gICAgIAorICAgICAgICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfZXZlbnRfc2V0KCB2b3NfZXZlbnRfdCAqIGV2ZW50ICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19ldmVudF9yZXNldCgpIC0gcmVzZXQgYSB2T1NTIGV2ZW50CisKKyAgVGhlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQgaXMgc2V0IHRvICdOT1Qgc2lnbmFsbGVkJyBieSBjYWxsaW5nIAorICBcYSB2b3NfZXZlbnRfcmVzZXQoKS4gIFRoZSBzdGF0ZSBvZiB0aGUgZXZlbnQgcmVtYWlucyBOT1Qgc2lnbmFsbGVkIHVudGlsIGFuIAorICBleHBsaWNpdCBjYWxsIHRvIHZvc19ldmVudF9zZXQoKS4gIAorICAKKyAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBldmVudCB0byBhIE5PVCBzaWduYWxsZWQgc3RhdGUgZXZlbiBpZiB0aGUgZXZlbnQgd2FzIAorICBzaWduYWxsZWQgbXVsdGlwbGUgdGltZXMgYmVmb3JlIGJlaW5nIHNpZ25hbGVkLgorICAKKyAgXHBhcmFtIGV2ZW50IC0gdGhlIGV2ZW50IHRvIHNldCB0byB0aGUgTk9UIHNpZ25hbGxlZCBzdGF0ZQorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgZXZlbnQgc3RhdGUgd2FzIHN1Y2Nlc3NmdWxseSBjaGFuZ2UgdG8gCisgICAgICAgICAgTk9UIHNpZ25hbGxlZC4KKyAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBldmVudCBkb2VzIG5vdCByZWZlciAKKyAgICAgICAgICB0byBhbiBpbml0aWFsaXplZCBldmVudCBvYmplY3QuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIGV2ZW50IGlzIGFuIGludmFsaWQgcG9pbnRlci4gICAgIAorICAgICAgICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfZXZlbnRfcmVzZXQoIHZvc19ldmVudF90ICogZXZlbnQgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2V2ZW50X2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSB2T1NTIGV2ZW50CisKKyAgVGhlIFxhIHZvc19ldmVudF9kZXN0cm95KCkgZnVuY3Rpb24gc2hhbGwgZGVzdHJveSB0aGUgZXZlbnQgb2JqZWN0IAorICByZWZlcmVuY2VkIGJ5IGV2ZW50LiAgQWZ0ZXIgYSBzdWNjZXNzZnVsIHJldHVybiBmcm9tIFxhIHZvc19ldmVudF9kZXN0cm95KCkKKyAgdGhlIGV2ZW50IG9iamVjdCBiZWNvbWVzLCBpbiBlZmZlY3QsIHVuaW5pdGlhbGl6ZWQuCisgICAKKyAgQSBkZXN0cm95ZWQgZXZlbnQgb2JqZWN0IGNhbiBiZSByZWluaXRpYWxpemVkIHVzaW5nIHZvc19ldmVudF9pbml0KCk7IAorICB0aGUgcmVzdWx0cyBvZiBvdGhlcndpc2UgcmVmZXJlbmNpbmcgdGhlIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgCisgIGFyZSB1bmRlZmluZWQuICBDYWxscyB0byB2T1NTIGV2ZW50IGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHRoZSBsb2NrIHN1Y2gKKyAgYXMgdm9zX2V2ZW50X3NldCgpIHdpbGwgZmFpbCBpZiB0aGUgZXZlbnQgaXMgZGVzdHJveWVkLiAgVGhlcmVmb3JlLCAKKyAgZG9uJ3QgdXNlIHRoZSBldmVudCBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgdW50aWwgaXQgaGFzIAorICBiZWVuIHJlLWluaXRpYWxpemVkLgorICAKKyAgXHBhcmFtIGV2ZW50IC0gdGhlIGV2ZW50IG9iamVjdCB0byBiZSBkZXN0cm95ZWQuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgZGVzdHJveWVkLgorICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfQlVTWSAtIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgZGV0ZWN0ZWQgYW4gYXR0ZW1wdCAKKyAgICAgICAgICB0byBkZXN0cm95IHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSBldmVudCB3aGlsZSBpdCBpcyBzdGlsbCBiZWluZworICAgICAgICAgIHJlZmVyZW5jZWQgKHRoZXJlIGFyZSB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBldmVudCkgCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IGV2ZW50IGlzIGludmFsaWQuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gZXZlbnQgaXMgYW4gaW52YWxpZCBwb2ludGVyLiAgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19ldmVudF9kZXN0cm95KCB2b3NfZXZlbnRfdCAqZXZlbnQgKTsKKworLy8gVE9ETzogdGhpcyBpcyBiZWluZyByZW1vdmVkIGFuZCBhIHN0dWIgZXhpc3RzIGN1cnJlbnRseSB0byBhdm9pZCAKKy8vIGNvbXBpbGVyIGVycm9ycworVk9TX1NUQVRVUyB2b3Nfd2FpdF9ldmVudHMoIHZvc19ldmVudF90ICpldmVudHMsIHZfVThfdCBudW1FdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCB0aW1lb3V0LCB2X1U4X3QgKnBFdmVudEluZGV4ICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc193YWl0X3NpbmdsZV9ldmVudCgpIC0gV2FpdHMgZm9yIGEgc2luZ2xlIGV2ZW50IHRvIGJlIHNldC4KKworICAgVGhpcyBBUEkgd2FpdHMgZm9yIHRoZSBldmVudCB0byBiZSBzZXQuCisgICAKKyAgXHBhcmFtIHBFdmVudCAtIHBvaW50ZXIgdG8gYW4gZXZlbnQgdG8gd2FpdCBvbi4KKyAgCisgIFxwYXJhbSB0aW1lb3V0IC0gVGltZW91dCB2YWx1ZSAoaW4gbWlsbGlzZWNvbmRzKS4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgICAgICAgaWYgdGhpcyBpbnRlcnZhbCBlbGFwc2VzLCByZWdhcmRsZXNzIGlmIGFueSBvZiB0aGUgZXZlbnRzIGhhdmUgCisgICAgICAgICBiZWVuIHNldC4gIEFuIGlucHV0IHZhbHVlIG9mIDAgZm9yIHRoaXMgdGltZW91dCBwYXJhbWV0ZXIgbWVhbnMgCisgICAgICAgICB0byB3YWl0IGluZmluaXRlbHksIG1lYW5pbmcgYSB0aW1lb3V0IHdpbGwgbmV2ZXIgb2NjdXIuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSB3YWl0IHdhcyBzYXRpc2lmZWQgYnkgdGhlIGV2ZW50IGJlaW5nCisgICAgICAgICAgc2V0LiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX1RJTUVPVVQgLSB0aGUgdGltZW91dCBpbnRlcnZhbCBlbGFwc2VkIGJlZm9yZSB0aGUKKyAgICAgICAgICBldmVudCB3YXMgc2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBldmVudCBpcyBpbnZhbGlkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHBFdmVudCBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBcc2Egdm9zX3dhaXRfbXVsdGlwbGVfZXZlbnRzKCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3dhaXRfc2luZ2xlX2V2ZW50KCB2b3NfZXZlbnRfdCAqcEV2ZW50LCB2X1UzMl90IHRpbWVvdXQgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3dhaXRfbXVsdGlwbGVfZXZlbnRzKCkgLSBXYWl0cyBmb3IgZXZlbnQocykgdG8gYmUgc2V0LgorCisgICBUaGlzIEFQSSB3YWl0cyBmb3IgYW55IGV2ZW50IGluIHRoZSBpbnB1dCBhcnJheSBvZiBldmVudHMgdG8gYmUKKyAgIHNldC4gIFRoZSBjYWxsZXIgaXMgYmxvY2tlZCB3YWl0aW5nIGFueSBldmVudCBpbiB0aGUgYXJyYXkgdG8gYmUgCisgICBzZXQgb3IgZm9yIHRoZSB0aW1lb3V0IHRvIG9jY3VyLiAKKyAgIAorICAgSWYgbXVsdGlwbGUgZXZlbnRzIGluIHRoZSBhcnJheSBhcmUgc2V0LCBvbmx5IG9uZSBldmVudCBpcyBpZGVudGlmaWVkCisgICBpbiB0aGUgcmV0dXJuIGZyb20gdGhpcyBjYWxsIGFzIHNhdGlzZnlpbmcgdGhlIHdhaXQgY29uZGl0aW9uLiAgVGhlCisgICBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgXGEgdm9zX3dhaXRfZXZlbnRzKCkgYWdhaW4gdG8gZmluZAorICAgdGhlIG90aGVyIGV2ZW50cyB0aGF0IGFyZSBzZXQuCisgIAorICBccGFyYW0gcEV2ZW50TGlzdCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZXZlbnQgcG9pbnRlcnMKKyAgCisgIFxwYXJhbSBudW1FdmVudHMgLSBOdW1iZXIgb2YgZXZlbnRzCisgIAorICBccGFyYW0gdGltZW91dCAtIFRpbWVvdXQgdmFsdWUgKGluIG1pbGxpc2Vjb25kcykuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgICAgICAgIGlmIHRoaXMgaW50ZXJ2YWwgZWxhcHNlcywgcmVnYXJkbGVzcyBpZiBhbnkgb2YgdGhlIGV2ZW50cyBoYXZlIAorICAgICAgICAgYmVlbiBzZXQuICBBbiBpbnB1dCB2YWx1ZSBvZiAwIGZvciB0aGlzIHRpbWVvdXQgcGFyYW1ldGVyIG1lYW5zIAorICAgICAgICAgdG8gd2FpdCBpbmZpbml0ZWx5LCBtZWFuaW5nIGEgdGltZW91dCB3aWxsIG5ldmVyIG9jY3VyLgorICAKKyAgXHBhcmFtIHBFdmVudEluZGV4IC0gVGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBpbmRleCBvZiAKKyAgICAgICAgIHRoZSBldmVudCBpbiB0aGUgZXZlbnQgYXJyYXkgdGhhdCBzYXRpc2ZpZWQgdGhlIHdhaXQgYmVjYXVzZSAKKyAgICAgICAgIHRoZSBldmVudCB3YXMgc2V0LiAgCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSB3YWl0IHdhcyBzYXRpc2lmZWQgYnkgb25lIG9mIHRoZSBldmVudHMKKyAgICAgICAgICBpbiB0aGUgZXZlbnQgYXJyYXkgYmVpbmcgc2V0LiAgVGhlIGluZGV4IGludG8gdGhlIGV2ZW50IGFycnkgCisgICAgICAgICAgdGhhdCBzYXRpc2ZpZWQgdGhlIHdhaXQgY2FuIGJlIGZvdW5kIGF0ICpwRXZlbnRJbmRleC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfVElNRU9VVCAtIHRoZSB0aW1lb3V0IGludGVydmFsIGVsYXBzZWQgYmVmb3JlIGFueSBvZiAKKyAgICAgICAgICB0aGUgZXZlbnRzIHdlcmUgc2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSAKKyAgICAgICAgICBldmVudCBhcnJheSByZWZlcnMgdG8gYW4gdW5pbml0aWFsaXplZCBldmVudCBvYmplY3QuICBUaGUgaW52YWxpZAorICAgICAgICAgIGV2ZW50IGlzIGlkZW50aWZpZWQgYnkgdGhlIGluZGV4IGluICpwRXZlbnRJbmRleC4gIE5vdGUgdGhhdCBvbmx5CisgICAgICAgICAgdGhlIGZpcnN0IHVuaW5pdGlhbGl6ZWQgZXZlbnQgaXMgZGV0ZWN0ZWQgd2hlbiB0aGlzIGVycm9yIGlzIAorICAgICAgICAgIHJldHVybmVkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIHRoZSBldmVudHMgYXJyYXkgaXMgZW1wdHkuICBUaGlzIGNvbmRpdGlvbgorICAgICAgICAgIGlzIGRldGVjdGVkIGJ5IG51bUV2ZW50cyBiZWluZyAwIG9uIGlucHV0LgorICAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgLSBldmVudCBvciBwRXZlbnRJbmRleCBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBcc2Egdm9zX3dhaXRfc2luZ2xlX2V2ZW50cygpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc193YWl0X211bHRpcGxlX2V2ZW50cyggdm9zX2V2ZW50X3QgKipwRXZlbnRMaXN0LCB2X1U4X3QgbnVtRXZlbnRzLAorICAgdl9VMzJfdCB0aW1lb3V0LCB2X1U4X3QgKnBFdmVudEluZGV4ICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvLyBfX1ZPU1NfRVZFTlRfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy92b3NfZ2V0QmluLmggYi9DT1JFL1ZPU1MvaW5jL3Zvc19nZXRCaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg1NGEyCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy92b3NfZ2V0QmluLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fVk9TX0dFVEJJTl9IICkKKyNkZWZpbmUgX19WT1NfR0VUQklOX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHZvc19nZXRCaW4uaAorICAKKyAgXGJyaWVmIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWNlcyAodk9TUykgYmluYXJ5IEFQSXMKKyAgICAgICAgICAgICAgIAorICAgQmluYXJ5IHJldHJpZXZhbCBkZWZpbml0aW9ucyBhbmQgQVBJcy4gIAorICAgCisgICBUaGVzZSBBUElzIGFsbG93IGNvbXBvbmVudHMgdG8gcmV0cmlldmUgYmluYXJ5IGNvbnRlbnRzIChmaXJtd2FyZSwgCisgICBjb25maWd1cmF0aW9uIGRhdGEsIGV0Yy4pIGZyb20gYSBzdG9yYWdlIG1lZGl1bSBvbiB0aGUgcGxhdGZvcm0uCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8dm9zX3R5cGVzLmg+CisjaW5jbHVkZSA8dm9zX3N0YXR1cy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8vIEJpbmFyeSBJRHMgIAordHlwZWRlZiBlbnVtCit7CisgIC8vLyBCaW5hcnkgSUQgZm9yIGZpcm13YXJlCisgIFZPU19CSU5BUllfSURfRklSTVdBUkUsCisgIAorICAvLy8gQmluYXJ5IElEIGZvciBDb25maWd1cmF0aW9uIGRhdGEKKyAgVk9TX0JJTkFSWV9JRF9DT05GSUcsCisKKyAgLy8vIEJpbmFyeSBJRCBmb3IgY291bnRyeSBjb2RlIHRvIHJlZ3VsYXRvcnkgZG9tYWluIG1hcHBpbmcKKyAgVk9TX0JJTkFSWV9JRF9DT1VOVFJZX0lORk8sCisKKyAgLy8vIEJpbmFyeSBJRCBmb3IgSGFuZG9mZiBDb25maWd1cmF0aW9uIGRhdGEKKyAgVk9TX0JJTkFSWV9JRF9IT19DT05GSUcKKworICAKK30gVk9TX0JJTkFSWV9JRDsKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19nZXRfYmluYXJ5X2Jsb2IoKSAtIGdldCBiaW5hcnkgZGF0YSBmcm9tIHBsYXRmb3JtCisKKyAgVGhpcyBBUEkgYWxsb3dzIGNvbXBvbmVudHMgdG8gZ2V0IGJpbmFyeSBkYXRhIGZyb20gdGhlIHBsYXRmb3JtIGluZGVwZW5kZW50CisgIG9mIHdoZXJlIHRoZSBkYXRhIGlzIHN0b3JlZCBvbiB0aGUgZGV2aWNlLgorICAKKyAgPHVsPgorICAgIDxsaT4gRmlybXdhcmUKKyAgICA8bGk+IENvbmZpZ3VyYXRpb24gRGF0YQorICA8L3VsPiAKKyAgCisgIFxwYXJhbSBiaW5hcnlJZCAtIGlkZW50aWZpZXMgdGhlIGJpbmFyeSBkYXRhIHRvIHJldHVybiB0byB0aGUgY2FsbGVyLgorICAgICAgICAgCisgIFxwYXJhbSBwQnVmZmVyIC0gYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2hlcmUgdGhlIGJpbmFyeSBkYXRhIHdpbGwgYmUgCisgICAgICAgICByZXRyaWV2ZWQuICBNZW1vcnkgZm9yIHRoaXMgYnVmZmVyIGlzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIAorICAgICAgICAgYW5kIGZyZWUnZCBieSB0aGUgY2FsbGVyLiB2T1NTIHdpbGwgZmlsbCB0aGlzIGJ1ZmZlciB3aXRoIAorICAgICAgICAgcmF3IGJpbmFyeSBkYXRhIGFuZCB1cGRhdGUgdGhlICpwQnVmZmVyU2l6ZSB3aXRoIHRoZSBleGFjdAorICAgICAgICAgc2l6ZSBvZiB0aGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJldHJlaXZlZC4KKyAgICAgICAgIAorICAgICAgICAgSW5wdXQgdmFsdWUgb2YgTlVMTCBpcyB2YWxpZCBhbmQgd2lsbCBjYXVzZSB0aGUgQVBJIHRvIHJldHVybiAKKyAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBiaW5hcnkgZGF0YSBpbiAqcEJ1ZmZlclNpemUuCisgICAgICAgICAKKyAgXHBhcmFtIHBCdWZmZXJTaXplIC0gcG9pbnRlciB0byBhIHZhcmlhYmxlIHRoYXQgdXBvbiBpbnB1dCBjb250YWlucyB0aGUgCisgICAgICAgICBzaXplIG9mIHRoZSBkYXRhIGJ1ZmZlciBhdmFpbGFibGUgYXQgcEJ1ZmZlci4gIFVwb24gc3VjY2VzcywgdGhpcworICAgICAgICAgdmFyaWFibGUgaXMgdXBkYXRlZCB3aXRoIHRoZSBzaXplIG9mIHRoZSBiaW5hcnkgZGF0YSB0aGF0IHdhcyAKKyAgICAgICAgIHJldHJlaXZlZCBhbmQgd3JpdHRlbiB0byB0aGUgYnVmZmVyIGF0IHBCdWZmZXIuCisgICAgICAgICAKKyAgICAgICAgIElucHV0IHZhbHVlIG9mIDAgaXMgdmFsaWQgYW5kIHdpbGwgY2F1c2UgdGhlIEFQSSB0byByZXR1cm4KKyAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBiaW5hcnkgZGF0YSBpbiAqcEJ1ZmZlclNpemUuCisgICAgICAgICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgYmluYXJ5IGRhdGEgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IAorICAgICAgICAgIHJldHJlaXZlZCBhbmQgd3JpdHRlbiB0byB0aGUgYnVmZmVyLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgYmluYXJ5SWQgZG9lcyBub3QgCisgICAgICAgICAgcmVmZXIgdG8gYSB2YWxpZCBWT1MgQmluYXJ5IElELgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHBCdWZmZXJTaXplIGlzIG5vdCBhIHZhbGlkIHBvaW50ZXIgdG8gYSAKKyAgICAgICAgICB2YXJpYWJsZSB0aGF0IHRoZSBBUEkgY2FuIHdyaXRlIHRvLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9OT01FTSAtIHRoZSBtZW1vcnkgcmVmZXJyZWQgdG8gYnkgcEJ1ZmZlciBhbmQgCisgICAgICAgICAgKnBCdWZmZXJTaXplIGlzIG5vdCBiaWcgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIGJpbmFyeS4KKworICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2dldF9iaW5hcnlfYmxvYiggVk9TX0JJTkFSWV9JRCBiaW5hcnlJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICpwQnVmZmVyLCB2X1NJWkVfdCAqcEJ1ZmZlclNpemUgKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFxicmllZiB2b3NfZ2V0X2NvbnBhcmFtKCktIGZ1bmN0aW9uIHRvIHJlYWQgdGhlIGluc21vZCBwYXJhbWV0ZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0Vk9TX0NPTl9NT0RFIHZvc19nZXRfY29ucGFyYW0oIHZvaWQgKTsKKyNlbmRpZgordFZPU19DT05DVVJSRU5DWV9NT0RFIHZvc19nZXRfY29uY3VycmVuY3lfbW9kZSggdm9pZCApOwordl9CT09MX3Qgdm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZyh2b2lkKTsKKworI2VuZGlmIC8vICFkZWZpbmVkIF9fVk9TX0dFVEJJTl9ICmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL3Zvc19saXN0LmggYi9DT1JFL1ZPU1MvaW5jL3Zvc19saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlM2YwYQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVk9TUy9pbmMvdm9zX2xpc3QuaApAQCAtMCwwICsxLDU4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19WT1NfTElTVF9IICkKKyNkZWZpbmUgX19WT1NfTElTVF9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB2b3NfbGlzdC5oCisgIAorICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpY2VzICh2T1NTKSBMaXN0IEFQSXMKKyAgICAgICAgICAgICAgIAorICAgRGVmaW5pdGlvbnMgZm9yIHZPU1MgTGlua2VkIExpc3RzIEFQSQorICAgCisgICBMaXN0cyBhcmUgaW1wbGVtZW50ZWQgYXMgYSBkb3VibHkgbGlua2VkIGxpc3QuIEFuIGl0ZW0gaW4gYSBsaXN0IGNhbiAKKyAgIGJlIG9mIGFueSB0eXBlIGFzIGxvbmcgYXMgdGhlIGRhdGF0eXBlIGNvbnRhaW5zIGEgZmllbGQgb2YgdHlwZSAKKyAgIHZvc19saW5rX3QuCisKKyAgIEluIGdlbmVyYWwsIGEgbGlzdCBpcyBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBpdGVtcyB3aXRoIGEgcG9pbnRlciAKKyAgIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdCBhbmQgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBUaGUKKyAgIGxpc3QgaXRlbXMgY29udGFpbiBhIGZvcndhcmQgYW5kIGJhY2sgbGluay4KKyAgICAgICAgICAgIAorICAgICBMaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVzCisgICA9PT09PT09PT09PT09ICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgKy0tLS0tLS0rCisgICB8IEZyb250IHwtLS0tLS0tLS0tLS0tPistLS0tLS0tLS0rICAgICArLS0tLS0tLS0tKworICAgKy0tLS0tLS0rICAgICAgICAgICAgICB8IE5leHQgICAgfC0tLS0+fCBOZXh0ICAgIHwtLS0tPk5VTEwKKyAgIHwgQmFjayAgfC0rICAgICAgICAgICAgKy0tLS0tLS0tLSsgICAgICstLS0tLS0tLS0rCisgICArLS0tLS0tLSsgfCAgIE5VTEw8LS0tLXwgUHJldiAgICB8PC0tLS18IFByZXYgICAgfAorICAgICAgICAgICAgIHwgICAgICAgICAgICArLS0tLS0tLS0tKyAgICAgKy0tLS0tLS0tLSsKKyAgICAgICAgICAgICB8ICAgICAgICAgICAgfFVzZXIgRGF0YXwgICAgIHxVc2VyIERhdGF8CisgICAgICAgICAgICAgfCAgICAgICAgICAgICstLS0tLS0tLS0rICAgICArLS0tLS0tLS0tKworICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICBUaGlzIGxpbmtlZCBsaXN0IEFQSSBpcyBpbXBsZW1lbnRlZCB3aXRoIGFwcHJvcHJpYXRlIGxvY2tpbmcKKyAgIG1lY2hhbmlzbXMgdG8gYXNzdXJlIG9wZXJhdGlvbnMgb24gdGhlIGxpc3QgYXJlIHRocmVhZCBzYWZlLgorICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHZvc190eXBlcy5oPgorI2luY2x1ZGUgPHZvc19zdGF0dXMuaD4KKyNpbmNsdWRlIDxpX3Zvc19saXN0Lmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9pbml0KCkgLSBpbml0aWFsaXplIGEgdk9TIExpbmtlZCBMaXN0ICAKKyAgICAKKyAgVGhlIFxhIHZvc19saXN0X2luaXQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGxpbmtlZCBsaXN0CisgICdvYmplY3QnLiAgVXBvbiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLCB0aGUgc3RhdGUgb2YgdGhlIGxpc3QgCisgIGJlY29tZXMgaW5pdGlhbGl6ZWQgYW5kIGF2YWlsYWJsZSBmb3IgdXNlIHRocm91Z2ggdGhlIG90aGVyIHZvc19saXN0X3h4eAorICBBUElzLgorCisgIEEgbGlzdCBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgdm9zX2xpc3RfaW5pdCgpIGJlZm9yZSBpdCAKKyAgbWF5IGJlIHVzZWQgaW4gYW55IG90aGVyIGxvY2sgZnVuY3Rpb25zLiAKKyAgCisgIEF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSBhbiBhbHJlYWR5IGluaXRpYWxpemVkIGxpc3QgcmVzdWx0cyBpbiAKKyAgYSBmYWlsdXJlLgorIAorICBccGFyYW0gcExpc3QgLSBwb2ludGVyIHRvIHRoZSBvcGFxdWUgbGlzdCBvYmplY3QgdG8gaW5pdGlhbGl6ZQorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIAorICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgLSBTeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkgCisgICAgICAgICAgYXJlIHVuYXZhaWxhYmxlIHRvIGluaXRpbGl6ZSB0aGUgbGlzdAorCisgICAgICAgICAgVk9TX1NUQVRVU19FX05PTUVNIC0gaW5zdWZmaWNpZW50IG1lbW9yeSBleGlzdHMgdG8gaW5pdGlhbGl6ZSAKKyAgICAgICAgICB0aGUgbGlzdAorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0JVU1kgLSBUaGUgaW1wbGVtZW50YXRpb24gaGFzIGRldGVjdGVkIGFuIGF0dGVtcHQgCisgICAgICAgICAgdG8gcmVpbml0aWFsaXplIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSBsaXN0LCBhIHByZXZpb3VzbHkgCisgICAgICAgICAgaW5pdGlhbGl6ZWQsIGJ1dCBub3QgeWV0IGRlc3Ryb3llZCwgbGlzdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBwTGlzdCBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgICAKKyAgICAgICAgICAKKyAgXHNhIHZvc19saXN0X2Rlc3Ryb3koKQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbGlzdF9pbml0KCB2b3NfbGlzdF90ICpwTGlzdCApOworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9kZXN0cm95KCkgLSBEZXN0cm95IGEgdk9TUyBMaXN0CisKKyAgVGhlIFxhIHZvc19saXN0X2Rlc3Ryb3koKSBmdW5jdGlvbiBzaGFsbCBkZXN0cm95IHRoZSBsaXN0IG9iamVjdCAKKyAgcmVmZXJlbmNlZCBieSBwTGlzdC4gIEFmdGVyIGEgc3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBcYSB2b3NfbGlzdF9kZXN0cm95KCkKKyAgdGhlIGxpc3Qgb2JqZWN0IGJlY29tZXMsIGluIGVmZmVjdCwgdW5pbml0aWFsaXplZC4KKyAgIAorICBBIGRlc3Ryb3llZCBsb2NrIG9iamVjdCBjYW4gYmUgcmVpbml0aWFsaXplZCB1c2luZyB2b3NfbGlzdF9pbml0KCk7IAorICB0aGUgcmVzdWx0cyBvZiBvdGhlcndpc2UgcmVmZXJlbmNpbmcgdGhlIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgCisgIGFyZSB1bmRlZmluZWQuICBDYWxscyB0byB2T1NTIGxpc3QgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdGhlIGxpc3Qgc3VjaAorICB3aWxsIGZhaWwgaWYgdGhlIGxpc3Qgb3IgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIG9yIGlzIGRlc3Ryb3llZC4gIAorICBUaGVyZWZvcmUsIGRvbid0IHVzZSB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgdW50aWwgaXQgaGFzIAorICBiZWVuIHJlLWluaXRpYWxpemVkLgorICAKKyAgXHBhcmFtIHBMbGlzdCAtIHBvaW50ZXIgdG8gdGhlIGxpc3Qgb2JqZWN0IHRvIGJlIGRlc3Ryb3llZC4KKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gbGlzdCB3YXMgc3VjY2Vzc2Z1bGx5IGRlc3Ryb3llZC4KKyAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0JVU1kgLSBUaGUgaW1wbGVtZW50YXRpb24gaGFzIGRldGVjdGVkIGFuIGF0dGVtcHQgCisgICAgICAgICAgdG8gZGVzdHJveSB0aGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgcExpc3QgdGhhdCBpcyBzdGlsbCBoYXMKKyAgICAgICAgICBub2Rlcy4gIFRoZSBsaXN0IG11c3QgYmUgZW1wdHkgYmVmb3JlIGl0IGNhbiBiZSBkZXN0cm95ZWQuIAorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gcExpc3QgaXMgYW4gaW52YWxpZCBwb2ludGVyLiAgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19saXN0X2Rlc3Ryb3koIHZvc19saXN0X3QgKnBMaXN0ICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9sb2NrKCkgLSBMb2NrIGEgdk9TUyBMaXN0CisKKyAgVGhlIFxhIHZvc19saXN0X2xvY2soKSBmdW5jdGlvbiBzaGFsbCBsb2NrIHRoZSBsaXN0IG9iamVjdCB0byBwcmV2ZW50CisgIG90aGVyIHRhc2tzIGZyb20gb3BlcmF0aW5nIG9uIHRoaXMgbGlzdC4gIFRoZSBsaXN0IHJlbWFpbnMgbG9ja2VkIHVudGlsCisgIGEgY2FsbCB0byB2b3NfbGlzdF91bmxvY2soKSBpcyBtYWRlLgorICAKKyAgRWFjaCBsaXN0IGZ1bmN0aW9uIGFscmVhZHkgb3BlcmF0ZSB3aXRoaW4gYSBjcml0aWNhbCBzZWN0aW9uLiAgCisgIEhvd2V2ZXIgaXQgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB0byBsb2NrIGEgbGlzdCBvdmVyIGEgc2VyaWVzIG9mIGxpc3QgCisgIGZ1bmN0aW9uIGNhbGxzLiAgCisgIAorICBGb3IgZXhhbXBsZSwgd2hlbiBvbmUgbmVlZHMgdG8gc2VhcmNoIGEgbm9kZSBvbiBhIGxpc3QgYW5kIGluc2VydCBhbm90aGVyIAorICBub2RlIGFmdGVyIGl0LCBvbmUgd291bGQgd2FudCB0byBsb2NrIHRoaXMgbGlzdCBmb3IgdGhlIGVudGlyZSBwcm9jZXNzIAorICBpbiBjYXNlIGFub3RoZXIgdGFzayBhdHRlbXB0cyB0byBtYW5pcHVsYXRlIHRoaXMgbGlzdC4KKworICBccGFyYW0gcExsaXN0IC0gcG9pbnRlciB0byB0aGUgbGlzdCBvYmplY3QgdG8gYmUgbG9ja2VkLgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IHdhcyBzdWNjZXNzZnVsbHkgbG9ja2VkLgorICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gcExpc3QgaXMgYW4gaW52YWxpZCBwb2ludGVyLiAgICAgCisKKyAgXHNhIHZvc19saXN0X3VubG9jaygpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2xpc3RfbG9jayggdm9zX2xpc3RfdCAqcExpc3QgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19saXN0X3VubG9jaygpIC0gVW5sb2NrIGEgdk9TUyBMaXN0CisKKyAgVGhlIFxhIHZvc19saXN0X3VubG9jaygpIGZ1bmN0aW9uIHNoYWxsIHVubG9jayB0aGUgbGlzdCBvYmplY3QgdG8gYWxsb3cgCisgIG90aGVyIHRhc2tzIHRvIHVzZSB0aGlzIGxpc3QuICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIHdoZW4gCisgIHRoZSB2b3NfbGlzdF9sb2NrKCkgaXMgcHJldmlvdXNseSBjYWxsZWQgaW4gdGhlIGN1cnJlbnQgdGFzay4gCisgIAorICBccGFyYW0gcExsaXN0IC0gcG9pbnRlciB0byB0aGUgbGlzdCBvYmplY3QgdG8gYmUgdW5sb2NrZWQuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgd2FzIHN1Y2Nlc3NmdWxseSB1bmxvY2tlZC4KKyAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0IGlzIGFuIGludmFsaWQgcG9pbnRlci4gICAgIAorCisgIFxzYSB2b3NfbGlzdF9sb2NrKCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbGlzdF91bmxvY2soIHZvc19saXN0X3QgKnBMaXN0ICk7CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2xpc3RfaW5zZXJ0X2Zyb250KCkgLSBpbnNlcnQgbm9kZSBhdCBmcm9udCBvZiBhIGxpbmtlZCBsaXN0IAorCisgIFRoZSB2b3NfbGlzdF9pbnNlcnRfZnJvbnQoKSBBUEkgd2lsbCBpbnNlcnQgYSBub2RlIGF0IHRoZSBmcm9udCBvZgorICBhIHByb3Blcmx5IGluaXRpYWxpemVkIHZPUyBMaXN0IG9iamVjdC4gCisgIAorICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IHdoZXJlIHRoZSBub2RlIHdpbGwgYmUgaW5zZXJ0ZWQKKyAgCisgIFxwYXJhbSBwTm9kZSAtIFBvaW50ZXIgdG8gdGhlIGxpc3Qgbm9kZSB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0LgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgd2FzIHN1Y2Nlc3NmdWxseSBpbnNlcnRlZCBvbnRvIAorICAgICAgICAgIHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgcExpc3QgaXMgbm90IGEgdmFsaWQsCisgICAgICAgICAgaW5pdGlhbGl6ZWQgbGlzdCBvYmplY3QuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0IGlzIGFuIGludmFsaWQgcG9pbnRlciBvciBwTm9kZSBpcyBhbgorICAgICAgICAgIGludmFsaWQgcG9pbnRlci4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19saXN0X2luc2VydF9mcm9udCggdm9zX2xpc3RfdCAqcExpc3QsIHZvc19saXN0X25vZGVfdCAqcE5vZGUgKTsKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9pbnNlcnRfYmFjaygpIC0gaW5zZXJ0IG5vZGUgYXQgYmFjayBvZiBhIGxpbmtlZCBsaXN0IAorCisgIFRoZSB2b3NfbGlzdF9pbnNlcnRfYmFjaygpIEFQSSB3aWxsIGluc2VydCBhIG5vZGUgYXQgdGhlIGJhY2sgb2YKKyAgYSBwcm9wZXJseSBpbml0aWFsaXplZCB2T1MgTGlzdCBvYmplY3QuIAorICAKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCB3aGVyZSB0aGUgbm9kZSB3aWxsIGJlIGluc2VydGVkCisgIAorICBccGFyYW0gcE5vZGUgLSBQb2ludGVyIHRvIHRoZSBsaXN0IG5vZGUgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbGlzdC4KKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gbGlzdCBub2RlIHdhcyBzdWNjZXNzZnVsbHkgaW5zZXJ0ZWQgb250byAKKyAgICAgICAgICB0aGUgYmFjayBvZiB0aGUgbGlzdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgcExpc3QgaXMgbm90IGEgdmFsaWQsCisgICAgICAgICAgaW5pdGlhbGl6ZWQgbGlzdCBvYmplY3QuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0IGlzIGFuIGludmFsaWQgcG9pbnRlciBvciBwTm9kZSBpcyBhbgorICAgICAgICAgIGludmFsaWQgcG9pbnRlci4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19saXN0X2luc2VydF9iYWNrKCB2b3NfbGlzdF90ICpwTGlzdCwgdm9zX2xpc3Rfbm9kZV90ICpwTm9kZSApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9pbnNlcnRfYmFja19zaXplKCkgLSBpbnNlcnQgbm9kZSBhdCBiYWNrIG9mIGEgbGlua2VkIGxpc3QgYW5kCisgIHJldHVybiB0aGUgc2l6ZSBBRlRFUiB0aGUgZW5xdWV1ZS4gVGhpcyBzaXplIGlzIGRldGVybWluZWQgaW4gYSByYWNlIGZyZWUgCisgIG1hbm5lciBpLmUuIHdoaWxlIHRoZSBsaXN0IGlzIGxvY2tlZCBmb3IgdGhlIGVucXVldWUgb3BlcmF0aW9uCisKKyAgVGhlIHZvc19saXN0X2luc2VydF9iYWNrX3NpemUoKSBBUEkgd2lsbCBpbnNlcnQgYSBub2RlIGF0IHRoZSBiYWNrIG9mCisgIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgdk9TIExpc3Qgb2JqZWN0LiAKKyAgCisgIFxwYXJhbSBwTGlzdCAtIFBvaW50ZXIgdG8gbGlzdCBvYmplY3Qgd2hlcmUgdGhlIG5vZGUgd2lsbCBiZSBpbnNlcnRlZAorICAKKyAgXHBhcmFtIHBOb2RlIC0gUG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGxpc3QuCisKKyAgXHBhcmFtIHBTaXplIC0gUG9pbnRlciB0byBhIHNpemUgdmFyaWFibGUsIHdoZXJlIHRoZSBzaXplIG9mIHRoZSAKKyAgICAgICAgICAgICAgICAgbGlzdCB3aWxsIGJlIHJldHVybmVkLgorIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgbm9kZSB3YXMgc3VjY2Vzc2Z1bGx5IGluc2VydGVkIG9udG8gCisgICAgICAgICAgdGhlIGJhY2sgb2YgdGhlIGxpc3QuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHBMaXN0IGlzIG5vdCBhIHZhbGlkLAorICAgICAgICAgIGluaXRpYWxpemVkIGxpc3Qgb2JqZWN0LgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBwTGlzdCBpcyBhbiBpbnZhbGlkIHBvaW50ZXIgb3IgcE5vZGUgaXMgYW4KKyAgICAgICAgICBpbnZhbGlkIHBvaW50ZXIuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbGlzdF9pbnNlcnRfYmFja19zaXplKCB2b3NfbGlzdF90ICpwTGlzdCwgdm9zX2xpc3Rfbm9kZV90ICpwTm9kZSwgdl9TSVpFX3QgKnBTaXplICk7CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2xpc3RfcmVtb3ZlX2Zyb250KCkgLSByZW1vdmUgbm9kZSBhdCBmcm9udCBvZiBhIGxpbmtlZCBsaXN0IAorCisgIFRoZSB2b3NfbGlzdF9yZW1vdmVfZnJvbnQoKSBBUEkgd2lsbCByZW1vdmUgYSBub2RlIGF0IHRoZSBmcm9udCBvZgorICBhIHByb3Blcmx5IGluaXRpYWxpemVkIHZPUyBMaXN0IG9iamVjdC4gCisgIAorICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IHdoZXJlIHRoZSBub2RlIHdpbGwgYmUgcmVtb3ZlZAorICAKKyAgXHBhcmFtIHBwTm9kZSAtIFBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSBsaXN0IG5vZGUgdG8gYmUgcmVtb3ZlZCAKKyAgZnJvbSB0aGUgbGlzdC4KKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gbGlzdCBub2RlIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIAorICAgICAgICAgIHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgcExpc3QgaXMgbm90IGEgdmFsaWQsCisgICAgICAgICAgaW5pdGlhbGl6ZWQgbGlzdCBvYmplY3QuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRU1QVFkgLSBUaGUgc3BlY2lmaWVkIGlzIGVtcHR5IHNvIG5vZGVzIGNhbm5vdCBiZSAKKyAgICAgICAgICByZW1vdmVkLgorICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0IGlzIGFuIGludmFsaWQgcG9pbnRlciBvciBwcE5vZGUgaXMgYW4KKyAgICAgICAgICBpbnZhbGlkIHBvaW50ZXIuCisgICAgCisgIFxzYSB2b3NfbGlzdF9yZW1vdmVfYmFjaygpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19saXN0X3JlbW92ZV9mcm9udCggdm9zX2xpc3RfdCAqcExpc3QsIHZvc19saXN0X25vZGVfdCAqKnBwTm9kZSApOworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19saXN0X3JlbW92ZV9iYWNrKCkgLSByZW1vdmUgbm9kZSBhdCBiYWNrIG9mIGEgbGlua2VkIGxpc3QgCisKKyAgVGhlIHZvc19saXN0X3JlbW92ZV9iYWNrKCkgQVBJIHdpbGwgcmVtb3ZlIGEgbm9kZSBhdCB0aGUgYmFjayBvZgorICBhIHByb3Blcmx5IGluaXRpYWxpemVkIHZPUyBMaXN0IG9iamVjdC4gCisgIAorICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IHdoZXJlIHRoZSBub2RlIHdpbGwgYmUgcmVtb3ZlZAorICAKKyAgXHBhcmFtIHBwTm9kZSAtIFBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSBsaXN0IG5vZGUgdG8gYmUgcmVtb3ZlZCAKKyAgZnJvbSB0aGUgbGlzdC4KKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gbGlzdCBub2RlIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIAorICAgICAgICAgIHRoZSBiYWNrIG9mIHRoZSBsaXN0LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIFRoZSBzcGVjaWZpZWQgaXMgZW1wdHkgc28gbm9kZXMgY2Fubm90IGJlIAorICAgICAgICAgIHJlbW92ZWQuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0IGlzIGFuIGludmFsaWQgcG9pbnRlciBvciBwcE5vZGUgaXMgYW4KKyAgICAgICAgICBpbnZhbGlkIHBvaW50ZXIuCisgICAgCisgIFxzYSB2b3NfbGlzdF9yZW1vdmVfYmFjaygpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKK1ZPU19TVEFUVVMgdm9zX2xpc3RfcmVtb3ZlX2JhY2soIHZvc19saXN0X3QgKnBMaXN0LCB2b3NfbGlzdF9ub2RlX3QgKipwcE5vZGUgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9zaXplKCkgLSByZXR1cm4gdGhlIHNpemUgb2Ygb2YgYSBsaW5rZWQgbGlzdCAKKworICBUaGUgdm9zX2xpc3Rfc2l6ZSgpIEFQSSB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIG5vZGVzIG9uIHRoZSAKKyAgZ2l2ZW4gdk9TIExpc3Qgb2JqZWN0LiAKKyAgCisgIFxwYXJhbSBwTGlzdCAtIFBvaW50ZXIgdG8gbGlzdCBvYmplY3Qgd2hlcmUgdGhlIG5vZGUgd2lsbCBiZSBjb3VudGVkCisgIAorICBccGFyYW0gcFNpemUgLSBQb2ludGVyIHRvIGEgc2l6ZSB2YXJpYWJsZSwgd2hlcmUgdGhlIHNpemUgb2YgdGhlIAorICAgICAgICAgICAgICAgICBsaXN0IHdpbGwgYmUgcmV0dXJuZWQuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgc2l6ZSBvZiB0aGUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgCisgICAgICAgICAgdm9zIGxpc3Qgb2JqZWN0IGhhcyBiZWVuIHJldHVybmVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gcExpc3Qgb3IgcFNpemUgYXJlIG5vdCB2YWxpZCBwb2ludGVycworICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorVk9TX1NUQVRVUyB2b3NfbGlzdF9zaXplKCB2b3NfbGlzdF90ICpwTGlzdCwgdl9TSVpFX3QgKnBTaXplICk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19saXN0X3BlZWtfZnJvbnQoKSAtIHBlZWsgYXQgdGhlIG5vZGUgYXQgZnJvbnQgb2YgYSBsaW5rZWQgbGlzdCAKKworICBUaGUgdm9zX2xpc3RfcGVla19mcm9udCgpIEFQSSB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5vZGUgYXQgdGhlIAorICBmcm9udCBvZiBhIHByb3Blcmx5IGluaXRpYWxpemVkIHZPUyBMaXN0IG9iamVjdC4gIFRoZSBub2RlIHdpbGwgKm5vdCogYmUKKyAgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgorICAKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCBvZiB0aGUgbGlzdCB0byBiZSAncGVla2VkJyAKKyAgCisgIFxwYXJhbSBwcE5vZGUgLSBQb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHRoYXQgZXhpc3RzIGF0CisgIHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gbGlzdCBub2RlIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdCB3YXMgCisgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIFRoZSBzcGVjaWZpZWQgaXMgZW1wdHkgc28gbm9kZXMgY2Fubm90IGJlIAorICAgICAgICAgIHJlbW92ZWQuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0IG9yIG9yIHBwTm9kZSBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuCisgICAgCisgIFxzYSB2b3NfbGlzdF9yZW1vdmVfYmFjaygpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKK1ZPU19TVEFUVVMgdm9zX2xpc3RfcGVla19mcm9udCggdm9zX2xpc3RfdCAqcExpc3QsIHZvc19saXN0X25vZGVfdCAqKnBwTm9kZSApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9wZWVrX2JhY2soKSAtIHBlZWsgYXQgdGhlIG5vZGUgYXQgYmFjayBvZiBhIGxpbmtlZCBsaXN0IAorCisgIFRoZSB2b3NfbGlzdF9wZWVrX2JhY2soKSBBUEkgd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBub2RlIGF0IHRoZSAKKyAgYmFjayBvZiBhIHByb3Blcmx5IGluaXRpYWxpemVkIHZPUyBMaXN0IG9iamVjdC4gIFRoZSBub2RlIHdpbGwgKm5vdCogYmUKKyAgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgorICAKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCBvZiB0aGUgbGlzdCB0byBiZSAncGVla2VkJyAKKyAgCisgIFxwYXJhbSBwcE5vZGUgLSBQb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHRoYXQgZXhpc3RzIGF0CisgIHRoZSBiYWNrIG9mIHRoZSBsaXN0LgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgYXQgdGhlIGJhY2sgb2YgdGhlIGxpc3Qgd2FzIAorICAgICAgICAgIHN1Y2Nlc3NmdWxseSByZXR1cm5lZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgcExpc3QgaXMgbm90IGEgdmFsaWQsCisgICAgICAgICAgaW5pdGlhbGl6ZWQgbGlzdCBvYmplY3QuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRU1QVFkgLSBUaGUgc3BlY2lmaWVkIGlzIGVtcHR5IHNvIG5vZGVzIGNhbm5vdCBiZSAKKyAgICAgICAgICByZW1vdmVkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBwTGlzdCBvciBvciBwcE5vZGUgaXMgYW4gaW52YWxpZCBwb2ludGVyLgorICAgIAorICBcc2Egdm9zX2xpc3RfcGVla19iYWNrKCksIHZvc19saXN0X3JlbW92ZV9iYWNrKCksIHZvc19saXN0X3BlZWtfZnJvbnQoKSwgCisgICAgICB2b3NfbGlzdF9yZW1vdmVfZnJvbnQoKQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCitWT1NfU1RBVFVTIHZvc19saXN0X3BlZWtfYmFjayggdm9zX2xpc3RfdCAqcExpc3QsIHZvc19saXN0X25vZGVfdCAqKnBwTm9kZSApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9wZWVrX25leHQoKSAtIHBlZWsgYXQgdGhlIG5vZGUgYWZ0ZXIgdGhlIHNwZWNpZmllZCBub2RlIAorCisgIFRoZSB2b3NfbGlzdF9wZWVrX25leHQoKSBBUEkgd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBub2RlIGZvbGxvd2luZyB0aGUKKyAgc3BlY2lmaWVkIG5vZGUgb24gYSBwcm9wZXJseSBpbml0aWFsaXplZCB2T1MgTGlzdCBvYmplY3QuICBUaGUgbm9kZSB3aWxsIAorICAqbm90KiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuCisgIAorICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IG9mIHRoZSBsaXN0IHRvIGJlICdwZWVrZWQnIAorICAKKyAgXHBhcmFtIHBOb2RlIC0gUG9pbnRlciB0byB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nICdwZWVrZWQnCisgIAorICBccGFyYW0gcHBOb2RlIC0gUG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIGxpc3Qgbm9kZSB0aGF0IGZvbGxvd3MgdGhlCisgIHBOb2RlIG5vZGUgb24gdGhlIGxpc3QuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgbm9kZSBmb2xsb3dpbmcgcE5vZGUgb24gdGhlIHByb3Blcmx5IAorICAgICAgICAgIGluaXRpYWxpemVkIGxpc3QgaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIFRoZSBzcGVjaWZpZWQgaXMgZW1wdHkgc28gbm9kZXMgY2Fubm90IGJlIAorICAgICAgICAgIHJlbW92ZWQuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0LCBwTm9kZSBvciBwcE5vZGUgaXMgYW4gaW52YWxpZCBwb2ludGVyLgorICAgIAorICBcc2Egdm9zX2xpc3RfcmVtb3ZlX2JhY2soKQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCitWT1NfU1RBVFVTIHZvc19saXN0X3BlZWtfbmV4dCggdm9zX2xpc3RfdCAqcExpc3QsIHZvc19saXN0X25vZGVfdCAqcE5vZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19saXN0X25vZGVfdCAqKnBwTm9kZSApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9wZWVrX3ByZXYoKSAtIHBlZWsgYXQgdGhlIG5vZGUgYmVmb3JlIHRoZSBzcGVjaWZpZWQgbm9kZSAKKworICBUaGUgdm9zX2xpc3RfcGVla19wcmV2KCkgQVBJIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbm9kZSBiZWZvcmUgdGhlCisgIHNwZWNpZmllZCBub2RlIG9uIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgdk9TIExpc3Qgb2JqZWN0LiAgVGhlIG5vZGUgd2lsbCAKKyAgKm5vdCogYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgorICAKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCBvZiB0aGUgbGlzdCB0byBiZSAncGVla2VkJyAKKyAgCisgIFxwYXJhbSBwTm9kZSAtIFBvaW50ZXIgdG8gdGhlIG5vZGUgdGhhdCBpcyBiZWluZyAncGVla2VkJworICAKKyAgXHBhcmFtIHBwTm9kZSAtIFBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSBsaXN0IG5vZGUgYmVmb3JlIHRoZQorICBwTm9kZSBub2RlIG9uIHRoZSBsaXN0LgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgYmVmb3JlIHBOb2RlIG9uIHRoZSBwcm9wZXJseSAKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IGlzIHN1Y2Nlc3NmdWxseSByZXR1cm5lZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgcExpc3QgaXMgbm90IGEgdmFsaWQsCisgICAgICAgICAgaW5pdGlhbGl6ZWQgbGlzdCBvYmplY3QuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0VNUFRZIC0gVGhlIHNwZWNpZmllZCBpcyBlbXB0eSBzbyBub2RlcyBjYW5ub3QgYmUgCisgICAgICAgICAgcmVtb3ZlZC4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gcExpc3QsIHBOb2RlIG9yIHBwTm9kZSBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuCisgICAgCisgIFxzYSB2b3NfbGlzdF9yZW1vdmVfYmFjaygpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitWT1NfU1RBVFVTIHZvc19saXN0X3BlZWtfcHJldiggdm9zX2xpc3RfdCAqcExpc3QsIHZvc19saXN0X25vZGVfdCAqcE5vZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19saXN0X25vZGVfdCAqKnBwTm9kZSApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9pbnNlcnRfYmVmb3JlKCkgLSBpbnNlcnQgbm9kZSBhdCBmcm9udCBvZiBhIHNwZWNpZmllZAorICBsaXN0IG5vZGUgCisKKyAgVGhlIHZvc19saXN0X2luc2VydF9iZWZvcmUoKSBBUEkgd2lsbCBpbnNlcnQgYSBub2RlIG9udG8gYSBwcm9wZXJseSAKKyAgaW5pdGlhbGl6ZWQgdk9TIExpc3Qgb2JqZWN0IGluIGZyb250IG9mIHRoZSBzcGVjaWZpZWQgbGlzdCBub2RlLgorICAKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCB3aGVyZSB0aGUgbm9kZSB3aWxsIGJlIGluc2VydGVkCisgIAorICBccGFyYW0gcE5vZGVUb0luc2VydCAtIFBvaW50ZXIgdG8gdGhlIGxpc3Qgbm9kZSB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0LgorICAKKyAgXHBhcmFtIHBOb2RlIC0gUG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHdoZXJlIHBOb2RlVG9JbnNlcnQgd2lsbCBiZSBpbnNlcnRlZAorICBpbiBmcm9udCBvZi4KKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gbGlzdCBub2RlIHdhcyBzdWNjZXNzZnVsbHkgaW5zZXJ0ZWQgb250byAKKyAgICAgICAgICB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHBMaXN0IGlzIG5vdCBhIHZhbGlkLAorICAgICAgICAgIGluaXRpYWxpemVkIGxpc3Qgb2JqZWN0LgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBwTGlzdCwgcE5vZGVUb0luc2VydCwgb3IgcE5vZGUgYXJlCisgICAgICAgICAgaW52YWxpZCBwb2ludGVyKHMpCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbGlzdF9pbnNlcnRfYmVmb3JlKCB2b3NfbGlzdF90ICpwTGlzdCwgdm9zX2xpc3Rfbm9kZV90ICpwTm9kZVRvSW5zZXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX2xpc3Rfbm9kZV90ICpwTm9kZSApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbGlzdF9pbnNlcnRfYWZ0ZXIoKSAtIGluc2VydCBub2RlIGJlaGluZCBhIHNwZWNpZmllZCBsaXN0IG5vZGUgCisKKyAgVGhlIHZvc19saXN0X2luc2VydF9hZnRlcigpIEFQSSB3aWxsIGluc2VydCBhIG5vZGUgb250byBhIHByb3Blcmx5IAorICBpbml0aWFsaXplZCB2T1MgTGlzdCBvYmplY3QgYWZ0ZXIgdGhlIHNwZWNpZmllZCBsaXN0IG5vZGUuCisgIAorICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IHdoZXJlIHRoZSBub2RlIHdpbGwgYmUgaW5zZXJ0ZWQKKyAgCisgIFxwYXJhbSBwTm9kZVRvSW5zZXJ0IC0gUG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGxpc3QuCisgIAorICBccGFyYW0gcE5vZGUgLSBQb2ludGVyIHRvIHRoZSBsaXN0IG5vZGUgd2hlcmUgcE5vZGVUb0luc2VydCB3aWxsIGJlIGluc2VydGVkCisgIGFmdGVyLgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgd2FzIHN1Y2Nlc3NmdWxseSBpbnNlcnRlZCBvbnRvIAorICAgICAgICAgIHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgcExpc3QgaXMgbm90IGEgdmFsaWQsCisgICAgICAgICAgaW5pdGlhbGl6ZWQgbGlzdCBvYmplY3QuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0LCBwTm9kZVRvSW5zZXJ0LCBvciBwTm9kZSBhcmUKKyAgICAgICAgICBpbnZhbGlkIHBvaW50ZXIocykKKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK1ZPU19TVEFUVVMgdm9zX2xpc3RfaW5zZXJ0X2FmdGVyKCB2b3NfbGlzdF90ICpwTGlzdCwgdm9zX2xpc3Rfbm9kZV90ICpwTm9kZVRvSW5zZXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfbGlzdF9ub2RlX3QgKnBOb2RlICk7ICAgICAgICAgCisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2xpc3RfcmVtb3ZlX25vZGUoKSAtIHJlbW92ZSBzcGVjaWZpZWQgbm9kZSBmcm9tIHZPUyBsaXN0IGxpc3QgCisKKyAgVGhlIHZvc19saXN0X3JlbW92ZV9ub2RlKCkgQVBJIHdpbGwgcmVtb3ZlIGEgc3BlY2lmaWVkIG5vZGUgZnJvbSB0aGUgCisgIHByb3Blcmx5IGluaXRpYWxpemVkIHZPUyBMaXN0IG9iamVjdC4gCisgIAorICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IHdoZXJlIHRoZSBub2RlIHdpbGwgYmUgcmVtb3ZlZAorICAKKyAgXHBhcmFtIHBwTm9kZSAtIFBvaW50ZXIgdG8gdGhlIG5vZGUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkIGZyb20gCisgICAgICAgICAgdGhlIGxpc3QuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHBMaXN0IGlzIG5vdCBhIHZhbGlkLAorICAgICAgICAgIGluaXRpYWxpemVkIGxpc3Qgb2JqZWN0LgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIFRoZSBzcGVjaWZpZWQgaXMgZW1wdHkgc28gbm9kZXMgY2Fubm90IGJlIAorICAgICAgICAgIHJlbW92ZWQuCisgICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0IG9yIHBOb2RlVG9SZW1vdmUgaXMgbm90IGEgdmFsaWQgcG9pbnRlcgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorVk9TX1NUQVRVUyB2b3NfbGlzdF9yZW1vdmVfbm9kZSggdm9zX2xpc3RfdCAqcExpc3QsIHZvc19saXN0X25vZGVfdCAqcE5vZGVUb1JlbW92ZSApOworCisKKworI2VuZGlmIC8vIF9fVk9TX0xJU1RfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy92b3NfbG9jay5oIGIvQ09SRS9WT1NTL2luYy92b3NfbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZmIzZTMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL3Zvc19sb2NrLmgKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fVk9TX0xPQ0tfSCApCisjZGVmaW5lIF9fVk9TX0xPQ0tfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgdm9zX2xvY2suaAorICAKKyAgXGJyaWVmIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWVzICh2T1MpIExvY2tzCisgICAgICAgICAgICAgICAKKyAgIERlZmluaXRpb25zIGZvciB2T1NTIExvY2tzCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAidm9zX3N0YXR1cy5oIgorI2luY2x1ZGUgImlfdm9zX2xvY2suaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2xvY2tfaW5pdCgpIC0gaW5pdGlhbGl6ZSBhIHZPU1MgbG9jaworICAKKyAgVGhlIFxhIHZvc19sb2NrX2luaXQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGxvY2suIFVwb24gCisgIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24sIHRoZSBzdGF0ZSBvZiB0aGUgbG9jayBiZWNvbWVzIGluaXRpYWxpemVkIAorICBhbmQgdW5sb2NrZWQuCisKKyAgQSBsb2NrIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyB2b3NfbG9ja19pbml0KCkgYmVmb3JlIGl0IAorICBtYXkgYmUgdXNlZCBpbiBhbnkgb3RoZXIgbG9jayBmdW5jdGlvbnMuIAorICAKKyAgQXR0ZW1wdGluZyB0byBpbml0aWFsaXplIGFuIGFscmVhZHkgaW5pdGlhbGl6ZWQgbG9jayByZXN1bHRzIGluIAorICBhIGZhaWx1cmUuCisgCisgIFxwYXJhbSBsb2NrIC0gcG9pbnRlciB0byB0aGUgb3BhcXVlIGxvY2sgb2JqZWN0IHRvIGluaXRpYWxpemUKKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gbG9jayB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZCAKKyAgICAgICAgICBpcyByZWFkeSB0byBiZSB1c2VkLgorICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpIAorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZSB0byBpbml0aWxpemUgdGhlIGxvY2sKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9OT01FTSAtIGluc3VmZmljaWVudCBtZW1vcnkgZXhpc3RzIHRvIGluaXRpYWxpemUgCisgICAgICAgICAgdGhlIGxvY2sKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9CVVNZIC0gVGhlIGltcGxlbWVudGF0aW9uIGhhcyBkZXRlY3RlZCBhbiBhdHRlbXB0IAorICAgICAgICAgIHRvIHJlaW5pdGlhbGl6ZSB0aGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgbG9jaywgYSBwcmV2aW91c2x5IAorICAgICAgICAgIGluaXRpYWxpemVkLCBidXQgbm90IHlldCBkZXN0cm95ZWQsIGxvY2suCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gbG9jayBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19sb2NrX2luaXQoIHZvc19sb2NrX3QgKmxvY2sgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19sb2NrX2FjcXVpcmUoKSAtIGFjcXVpcmUgYSBsb2NrCisKKyAgQSBsb2NrIG9iamVjdCBpcyBhY3F1aXJlZCBieSBjYWxsaW5nIFxhIHZvc19sb2NrX2FjcXVpcmUoKS4gIElmIHRoZSBsb2NrIAorICBpcyBhbHJlYWR5IGxvY2tlZCwgdGhlIGNhbGxpbmcgdGhyZWFkIHNoYWxsIGJsb2NrIHVudGlsIHRoZSBsb2NrIGJlY29tZXMgCisgIGF2YWlsYWJsZS4gVGhpcyBvcGVyYXRpb24gc2hhbGwgcmV0dXJuIHdpdGggdGhlIGxvY2sgb2JqZWN0IHJlZmVyZW5jZWQgYnkgCisgIGxvY2sgaW4gdGhlIGxvY2tlZCBzdGF0ZSB3aXRoIHRoZSBjYWxsaW5nIHRocmVhZCBhcyBpdHMgb3duZXIuIAorICAKKyAgXHBhcmFtIGxvY2sgLSB0aGUgbG9jayBvYmplY3QgdG8gYWNxdWlyZQorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgbG9jayB3YXMgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkIGJ5IAorICAgICAgICAgIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBsb2NrIGRvZXMgbm90IHJlZmVyIAorICAgICAgICAgIHRvIGFuIGluaXRpYWxpemVkIGxvY2sgb2JqZWN0LgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIGxvY2sgaXMgYW4gaW52YWxpZCBwb2ludGVyLiAgICAgCisgICAgICAgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2xvY2tfYWNxdWlyZSggdm9zX2xvY2tfdCAqIGxvY2sgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2xvY2tfcmVsZWFzZSgpIC0gcmVsZWFzZSBhIGxvY2sKKworICBUaGUgXGEgdm9zX2xvY2tfcmVsZWFzZSgpIGZ1bmN0aW9uIHNoYWxsIHJlbGVhc2UgdGhlIGxvY2sgb2JqZWN0IAorICByZWZlcmVuY2VkIGJ5ICdsb2NrJy4gIAorCisgIElmIGEgdGhyZWFkIGF0dGVtcHRzIHRvIHJlbGVhc2UgYSBsb2NrIHRoYXQgaXQgdW5sb2NrZWQgb3IgaXMgbm90CisgIGluaXRpYWxpemVkLCBhbiBlcnJvciBpcyByZXR1cm5lZC4gCisKKyAgXHBhcmFtIGxvY2sgLSB0aGUgbG9jayB0byByZWxlYXNlCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBsb2NrIHdhcyBzdWNjZXNzZnVsbHkgcmVsZWFzZWQKKyAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBsb2NrIGRvZXMgbm90IHJlZmVyIAorICAgICAgICAgIHRvIGFuIGluaXRpYWxpemVkIGxvY2sgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgbG9jayBkb2VzIG5vdCByZWZlciAKKyAgICAgICAgICB0byBhbiBpbml0aWFsaXplZCBsb2NrIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfUEVSTSAtIE9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkLiAgVGhlIGNhbGxpbmcgCisgICAgICAgICAgdGhyZWFkIGRvZXMgbm90IG93biB0aGUgbG9jay4gCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2xvY2tfcmVsZWFzZSggdm9zX2xvY2tfdCAqbG9jayApOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbG9ja19kZXN0cm95KCkgLSBEZXN0cm95IGEgdk9TUyBMb2NrCisKKyAgVGhlIFxhIHZvc19sb2NrX2Rlc3Ryb3koKSBmdW5jdGlvbiBzaGFsbCBkZXN0cm95IHRoZSBsb2NrIG9iamVjdCAKKyAgcmVmZXJlbmNlZCBieSBsb2NrLiAgQWZ0ZXIgYSBzdWNjZXNzZnVsIHJldHVybiBmcm9tIFxhIHZvc19sb2NrX2Rlc3Ryb3koKQorICB0aGUgbG9jayBvYmplY3QgYmVjb21lcywgaW4gZWZmZWN0LCB1bmluaXRpYWxpemVkLgorICAgCisgIEEgZGVzdHJveWVkIGxvY2sgb2JqZWN0IGNhbiBiZSByZWluaXRpYWxpemVkIHVzaW5nIHZvc19sb2NrX2luaXQoKTsgCisgIHRoZSByZXN1bHRzIG9mIG90aGVyd2lzZSByZWZlcmVuY2luZyB0aGUgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCAKKyAgYXJlIHVuZGVmaW5lZC4gIENhbGxzIHRvIHZPU1MgbG9jayBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgbG9jayBzdWNoCisgIGFzIHZvc19sb2NrX2FjcXVpcmUoKSB3aWxsIGZhaWwgaWYgdGhlIGxvY2sgaXMgZGVzdHJveWVkLiAgVGhlcmVmb3JlLCAKKyAgZG9uJ3QgdXNlIHRoZSBsb2NrIGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCB1bnRpbCBpdCBoYXMgCisgIGJlZW4gcmUtaW5pdGlhbGl6ZWQuCisgIAorICBccGFyYW0gbG9jayAtIHRoZSBsb2NrIG9iamVjdCB0byBiZSBkZXN0cm95ZWQuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxvY2sgd2FzIHN1Y2Nlc3NmdWxseSBkZXN0cm95ZWQuCisgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9CVVNZIC0gVGhlIGltcGxlbWVudGF0aW9uIGhhcyBkZXRlY3RlZCBhbiBhdHRlbXB0IAorICAgICAgICAgIHRvIGRlc3Ryb3kgdGhlIG9iamVjdCByZWZlcmVuY2VkIGJ5IGxvY2sgd2hpbGUgaXQgaXMgbG9ja2VkIAorICAgICAgICAgIG9yIHN0aWxsIHJlZmVyZW5jZWQuIAorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBsb2NrIGlzIGludmFsaWQuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIGxvY2sgaXMgYW4gaW52YWxpZCBwb2ludGVyLiAgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2xvY2tfZGVzdHJveSggdm9zX2xvY2tfdCAqbG9jayApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3NwaW5fbG9ja19pbml0KCkgLSBpbml0aWFsaXplcyBhIHZPU1Mgc3BpbiBsb2NrCisgIAorICBUaGUgdm9zX3NwaW5fbG9ja19pbml0KCkgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHNwZWNpZmllZCBzcGluIGxvY2suIFVwb24gCisgIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24sIHRoZSBzdGF0ZSBvZiB0aGUgbG9jayBiZWNvbWVzIGluaXRpYWxpemVkIAorICBhbmQgdW5sb2NrZWQuCisKKyAgQSBsb2NrIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyB2b3Nfc3Bpbl9sb2NrX2luaXQoKSBiZWZvcmUgaXQgCisgIG1heSBiZSB1c2VkIGluIGFueSBvdGhlciBsb2NrIGZ1bmN0aW9ucy4gCisgIAorICBBdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgYW4gYWxyZWFkeSBpbml0aWFsaXplZCBsb2NrIHJlc3VsdHMgaW4gCisgIGEgZmFpbHVyZS4KKyAKKyAgXHBhcmFtIHBMb2NrIC0gcG9pbnRlciB0byB0aGUgb3BhcXVlIGxvY2sgb2JqZWN0IHRvIGluaXRpYWxpemUKKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gc3BpbiBsb2NrIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIAorICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3NwaW5fbG9ja19pbml0KHZvc19zcGluX2xvY2tfdCAqcExvY2spOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3NwaW5fbG9ja19hY3F1aXJlKCkgLSBhY3F1aXJlcyBhIHNwaW4gbG9jaworCisgIEEgbG9jayBvYmplY3QgaXMgYWNxdWlyZWQgYnkgY2FsbGluZyBcYSB2b3Nfc3Bpbl9sb2NrX2FjcXVpcmUoKS4gIElmIHRoZSBsb2NrIAorICBpcyBhbHJlYWR5IGxvY2tlZCwgdGhlIGNhbGxpbmcgdGhyZWFkIHNoYWxsIHNwaW4gdW50aWwgdGhlIGxvY2sgYmVjb21lcyAKKyAgYXZhaWxhYmxlLiBUaGlzIG9wZXJhdGlvbiBzaGFsbCByZXR1cm4gd2l0aCB0aGUgbG9jayBvYmplY3QgcmVmZXJlbmNlZCBieSAKKyAgbG9jayBpbiB0aGUgbG9ja2VkIHN0YXRlIHdpdGggdGhlIGNhbGxpbmcgdGhyZWFkIGFzIGl0cyBvd25lci4gCisgIAorICBccGFyYW0gcExvY2sgLSB0aGUgbG9jayBvYmplY3QgdG8gYWNxdWlyZQorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgbG9jayB3YXMgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkIGJ5IAorICAgICAgICAgIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3NwaW5fbG9ja19hY3F1aXJlKHZvc19zcGluX2xvY2tfdCAqcExvY2spOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3NwaW5fbG9ja19yZWxlYXNlKCkgLSByZWxlYXNlcyBhIGxvY2sKKworICBUaGUgXGEgdm9zX2xvY2tfcmVsZWFzZSgpIGZ1bmN0aW9uIHNoYWxsIHJlbGVhc2UgdGhlIHNwaW4gbG9jayBvYmplY3QgCisgIHJlZmVyZW5jZWQgYnkgJ2xvY2snLiAgCisKKyAgSWYgYSB0aHJlYWQgYXR0ZW1wdHMgdG8gcmVsZWFzZSBhIGxvY2sgdGhhdCBpdCB1bmxvY2tlZCBvciBpcyBub3QKKyAgaW5pdGlhbGl6ZWQsIGFuIGVycm9yIGlzIHJldHVybmVkLiAKKworICBccGFyYW0gcExvY2sgLSB0aGUgbG9jayB0byByZWxlYXNlCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBsb2NrIHdhcyBzdWNjZXNzZnVsbHkgcmVsZWFzZWQKKyAgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3Nfc3Bpbl9sb2NrX3JlbGVhc2Uodm9zX3NwaW5fbG9ja190ICpwTG9jayk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3Nfc3Bpbl9sb2NrX2Rlc3Ryb3koKSAtIHJlbGVhc2VzIHJlc291cmNlIG9mIGEgbG9jaworCisgIFxwYXJhbSBwTG9jayAtIHBvaW50ZXIgdG8gYSBsb2NrIHRvIHJlbGVhc2UKKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGhlIGxvY2sgd2FzIHN1Y2Nlc3NmdWxseSByZWxlYXNlZAorICAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19zcGluX2xvY2tfZGVzdHJveSh2b3Nfc3Bpbl9sb2NrX3QgKnBMb2NrKTsKKworCisjZW5kaWYgLy8gX19WT1NTX0xPQ0tfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy92b3NfbWVtb3J5LmggYi9DT1JFL1ZPU1MvaW5jL3Zvc19tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTk5YTg3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy92b3NfbWVtb3J5LmgKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fVk9TX01FTU9SWV9IICkKKyNkZWZpbmUgX19WT1NfTUVNT1JZX0gKKyAKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB2b3NfbWVtb3J5LmgKKyAgCisgIFxicmllZiB2aXJ0dWFsIE9wZXJhdGluZyBTeXN0ZW0gU2VydmllcyAodk9TUykKKyAgICAgICAgICAgICAgIAorICAgTWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8dm9zX3R5cGVzLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBNRU1PUllfREVCVUcKK3ZfVk9JRF90IHZvc19tZW1faW5pdCh2X1ZPSURfdCk7Cit2X1ZPSURfdCB2b3NfbWVtX2V4aXQodl9WT0lEX3QpOwordm9pZCB2b3NfbWVtX2NsZWFuKHZvaWQpOworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbWVtX21hbGxvYygpIC0gdk9TUyBNZW1vcnkgQWxsb2NhdGlvbgorCisgIFRoaXMgZnVuY3Rpb24gd2lsbCBkeW5hbWljYWxsbHkgYWxsb2NhdGUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgb2YgCisgIG1lbW9yeS4KKyAgCisgIFxwYXJhbSBzaXplIC0gdGhlIG51bWJlciBvZiBieXRlcyBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuICAKKyAgCisgIFxyZXR1cm4gVXBvbiBzdWNjZXNzZnVsIGFsbG9jYXRlLCByZXR1cm5zIGEgbm9uLU5VTEwgcG9pbnRlciB0byB0aGUgCisgIGFsbG9jYXRlZCBtZW1vcnkuICBJZiB0aGlzIGZ1bmN0aW9uIGlzIHVuYWJsZSB0byBhbGxvY2F0ZSB0aGUgYW1vdW50IG9mIAorICBtZW1vcnkgc3BlY2lmaWVkIChmb3IgYW55IHJlYXNvbikgaXQgcmV0dXJucyBOVUxMLgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBNRU1PUllfREVCVUcKKyNkZWZpbmUgdm9zX21lbV9tYWxsb2Moc2l6ZSkgdm9zX21lbV9tYWxsb2NfZGVidWcoc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQordl9WT0lEX3QgKiB2b3NfbWVtX21hbGxvY19kZWJ1Zyggdl9TSVpFX3Qgc2l6ZSwgY2hhciogZmlsZU5hbWUsIHZfVTMyX3QgbGluZU51bSk7CisjZWxzZQordl9WT0lEX3QgKiB2b3NfbWVtX21hbGxvYyggdl9TSVpFX3Qgc2l6ZSApOworI2VuZGlmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX21lbV9mcmVlKCkgLSB2T1NTIEZyZWUgTWVtb3J5CisKKyAgVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5ICdwdHInLgorICAKKyAgXHBhcmFtIHB0ciAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBiZSAKKyAgICAgICAgICAgICAgIGZyZWUnZC4gIAorICAKKyAgXHJldHVybiBOb3RoaW5nCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9WT0lEX3Qgdm9zX21lbV9mcmVlKCB2X1ZPSURfdCAqcHRyICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGZuIHZvc19tZW1fc2V0KCkgLSBzZXQgKGZpbGwpIG1lbW9yeSB3aXRoIGEgc3BlY2lmaWVkIGJ5dGUgdmFsdWUuCisgIAorICBccGFyYW0gcE1lbW9yeSAtIHBvaW50ZXIgdG8gbWVtb3J5IHRoYXQgd2lsbCBiZSBzZXQKKyAgICAKKyAgXHBhcmFtIG51bUJ5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBzZXQKKyAgICAKKyAgXHBhcmFtIHZhbHVlIC0gdGhlIGJ5dGUgc2V0IGluIG1lbW9yeQorICAgIAorICBccmV0dXJuIC0gTm90aGluZy4gIAorICAKKyAgXHNhIHZvc19tZW1femVybygpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1ZPSURfdCB2b3NfbWVtX3NldCggdl9WT0lEX3QgKnB0ciwgdl9TSVpFX3QgbnVtQnl0ZXMsIHZfQllURV90IHZhbHVlICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGZuIHZvc19tZW1femVybygpIC0gemVybyBvdXQgbWVtb3J5CisgIAorICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIG1lbW9yeSBsb2NhdGlvbiB0byBhbGwgemVyb3MsIGVzc2VudGlhbGx5IGNsZWFyaW5nCisgIHRoZSBtZW1vcnkuCisgIAorICBccGFyYW0gcE1lbW9yeSAtIHBvaW50ZXIgdG8gbWVtb3J5IHRoYXQgd2lsbCBiZSBzZXQgdG8gemVybworICAgIAorICBccGFyYW0gbnVtQnl0ZXMgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHplcm8KKyAgICAKKyAgXHBhcmFtIHZhbHVlIC0gdGhlIGJ5dGUgc2V0IGluIG1lbW9yeQorICAgIAorICBccmV0dXJuIC0gTm90aGluZy4gIAorICAKKyAgXHNhIHZvc19tZW1fc2V0KCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVk9JRF90IHZvc19tZW1femVybyggdl9WT0lEX3QgKnB0ciwgdl9TSVpFX3QgbnVtQnl0ZXMgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbWVtX2NvcHkoKSAtIENvcHkgbWVtb3J5CisKKyAgQ29weSBob3N0IG1lbW9yeSBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyLCBzaW1pbGFyIHRvIG1lbWNweSBpbiAKKyAgc3RhbmRhcmQgQy4gIE5vdGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlIG92ZXJsYXBwaW5nCisgIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWVtb3J5IGxvY2F0aW9ucy4gIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoCisgIG92ZXJsYXBwaW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWVtb3J5IGxvY2F0aW9ucyB3aWxsIHJlc3VsdCBpbgorICB1bnByZWRpY3RhYmxlIHJlc3VsdHMuICBVc2Ugdm9zX21lbV9tb3ZlKCkgaWYgdGhlIG1lbW9yeSBsb2NhdGlvbnMKKyAgZm9yIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBvdmVybGFwcGluZyAob3IgY291bGQgYmUgb3ZlcmxhcHBpbmchKQorCisgIFxwYXJhbSBwRHN0IC0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBtZW1vcnkgbG9jYXRpb24gKHRvIGNvcHkgdG8pCisgIAorICBccGFyYW0gcFNyYyAtIHBvaW50ZXIgdG8gc291cmNlIG1lbW9yeSBsb2NhdGlvbiAodG8gY29weSBmcm9tKQorICAKKyAgXHBhcmFtIG51bUJ5dGVzIC0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgIAorICBccmV0dXJuIC0gTm90aGluZworICAgIAorICBcc2Egdm9zX21lbV9tb3ZlKCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVk9JRF90IHZvc19tZW1fY29weSggdl9WT0lEX3QgKnBEc3QsIGNvbnN0IHZfVk9JRF90ICpwU3JjLCB2X1NJWkVfdCBudW1CeXRlcyApOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19tZW1fbW92ZSgpIC0gTW92ZSBtZW1vcnkKKworICBNb3ZlIGhvc3QgbWVtb3J5IGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIsIHNpbWlsYXIgdG8gbWVtbW92ZSBpbiAKKyAgc3RhbmRhcmQgQy4gIE5vdGUgdGhpcyBmdW5jdGlvbiAqZG9lcyogaGFuZGxlIG92ZXJsYXBwaW5nCisgIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWVtb3J5IGxvY2F0aW9ucy4KKworICBccGFyYW0gcERzdCAtIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gbWVtb3J5IGxvY2F0aW9uICh0byBtb3ZlIHRvKQorICAKKyAgXHBhcmFtIHBTcmMgLSBwb2ludGVyIHRvIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHRvIG1vdmUgZnJvbSkKKyAgCisgIFxwYXJhbSBudW1CeXRlcyAtIG51bWJlciBvZiBieXRlcyB0byBtb3ZlLgorICAKKyAgXHJldHVybiAtIE5vdGhpbmcKKyAgICAKKyAgXHNhIHZvc19tZW1fbW92ZSgpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1ZPSURfdCB2b3NfbWVtX21vdmUoIHZfVk9JRF90ICpwRHN0LCBjb25zdCB2X1ZPSURfdCAqcFNyYywgdl9TSVpFX3QgbnVtQnl0ZXMgKTsKKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgXGZuIHZvc19tZW1fY29tcGFyZSgpCisKKyAgICBcYnJpZWYgdm9zX21lbV9jb21wYXJlKCkgLSBNZW1vcnkgY29tcGFyZQorICAgIAorICAgIEZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIHBpZWNlcyBvZiBtZW1vcnksIHNpbWlsYXIgdG8gbWVtY21wIGZ1bmN0aW9uIAorICAgIGluIHN0YW5kYXJkIEMuCisgICAgCisgICAgXHBhcmFtIHBNZW1vcnkxIC0gcG9pbnRlciB0byBvbmUgbG9jYXRpb24gaW4gbWVtb3J5IHRvIGNvbXBhcmUuCisKKyAgICBccGFyYW0gcE1lbW9yeTIgLSBwb2ludGVyIHRvIHNlY29uZCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gY29tcGFyZS4KKyAgICAKKyAgICBccGFyYW0gbnVtQnl0ZXMgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUuCisgICAgCisgICAgXHJldHVybiB2X0JPT0xfdCAtIHJldHVybnMgYSBib29sZWFuIHZhbHVlIHRoYXQgdGVsbHMgaWYgdGhlIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbnMgYXJlIGVxdWFsIG9yIG5vdCBlcXVhbC4gCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9CT09MX3Qgdm9zX21lbV9jb21wYXJlKCB2X1ZPSURfdCAqcE1lbW9yeTEsIHZfVk9JRF90ICpwTWVtb3J5Miwgdl9VMzJfdCBudW1CeXRlcyApOyAKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBcZm4gdm9zX21lbV9jb21wYXJlMigpCisKKyAgICBcYnJpZWYgdm9zX21lbV9jb21wYXJlMigpIC0gTWVtb3J5IGNvbXBhcmUKKyAgICAKKyAgICBGdW5jdGlvbiB0byBjb21wYXJlIHR3byBwaWVjZXMgb2YgbWVtb3J5LCBzaW1pbGFyIHRvIG1lbWNtcCBmdW5jdGlvbiAKKyAgICBpbiBzdGFuZGFyZCBDLgorCisgICAgXHBhcmFtIHBNZW1vcnkxIC0gcG9pbnRlciB0byBvbmUgbG9jYXRpb24gaW4gbWVtb3J5IHRvIGNvbXBhcmUuCisKKyAgICBccGFyYW0gcE1lbW9yeTIgLSBwb2ludGVyIHRvIHNlY29uZCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gY29tcGFyZS4KKyAgICAKKyAgICBccGFyYW0gbnVtQnl0ZXMgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUuCisgICAgCisgICAgXHJldHVybiB2X1NJTlRfdCAtIHJldHVybnMgYSBib29sZWFuIHZhbHVlIHRoYXQgdGVsbHMgaWYgdGhlIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbnMgYXJlIGVxdWFsIG9yIG5vdCBlcXVhbC4gCisgICAgICAgICAgICAgICAgICAgICAgIDAgLS0gZXF1YWwKKyAgICAgICAgICAgICAgICAgICAgICAgPCAwIC0tICpwTWVtb3J5MSBpcyBsZXNzIHRoYW4gKnBNZW1vcnkyCisgICAgICAgICAgICAgICAgICAgICAgID4gMCAtLSAqcE1lbW9yeTEgaXMgYmlnZ2VyIHRoYW4gKnBNZW1vcnkyCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9TSU5UX3Qgdm9zX21lbV9jb21wYXJlMiggdl9WT0lEX3QgKnBNZW1vcnkxLCB2X1ZPSURfdCAqcE1lbW9yeTIsIHZfVTMyX3QgbnVtQnl0ZXMgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbWVtX2RtYV9tYWxsb2MoKSAtIHZPU1MgRE1BIE1lbW9yeSBBbGxvY2F0aW9uCisKKyAgVGhpcyBmdW5jdGlvbiB3aWxsIGR5bmFtaWNhbGxseSBhbGxvY2F0ZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBvZiAKKyAgbWVtb3J5LiBUaGlzIG1lbW9yeSB3aWxsIGhhdmUgc3BlY2lhbCBhdHRyaWJ1dGVzIG1ha2luZyBpdCBETUEgZnJpZW5kbHkgaS5lLgorICBpdCB3aWxsIGV4aXN0IGluIGNvbnRpZ3VvdXMsIDMyLWJ5dGUgYWxpZ25lZCB1bmNhY2hlZCBtZW1vcnkuIEEgbm9ybWFsIAorICB2b3NfbWVtX21hbGxvYyBkb2VzIG5vdCB5aWVsZCBtZW1vcnkgd2l0aCB0aGVzZSBhdHRyaWJ1dGVzLiAKKworICBOT1RFOiB0aGUgc3BlY2lhbCBETUEgZnJpZW5kbHkgbWVtb3J5IGlzIHZlcnkgc2NhcmNlIGFuZCB0aGlzIEFQSSBtdXN0IGJlCisgIHVzZWQgc3BhcmluZ2x5CisgIAorICBccGFyYW0gc2l6ZSAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLiAgCisgIAorICBccmV0dXJuIFVwb24gc3VjY2Vzc2Z1bCBhbGxvY2F0ZSwgcmV0dXJucyBhIG5vbi1OVUxMIHBvaW50ZXIgdG8gdGhlIAorICBhbGxvY2F0ZWQgbWVtb3J5LiAgSWYgdGhpcyBmdW5jdGlvbiBpcyB1bmFibGUgdG8gYWxsb2NhdGUgdGhlIGFtb3VudCBvZiAKKyAgbWVtb3J5IHNwZWNpZmllZCAoZm9yIGFueSByZWFzb24pIGl0IHJldHVybnMgTlVMTC4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgTUVNT1JZX0RFQlVHCisjZGVmaW5lIHZvc19tZW1fZG1hX21hbGxvYyhzaXplKSB2b3NfbWVtX2RtYV9tYWxsb2NfZGVidWcoc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQordl9WT0lEX3QgKiB2b3NfbWVtX2RtYV9tYWxsb2NfZGVidWcoIHZfU0laRV90IHNpemUsIGNoYXIqIGZpbGVOYW1lLCB2X1UzMl90IGxpbmVOdW0pOworI2Vsc2UKK3ZfVk9JRF90ICogdm9zX21lbV9kbWFfbWFsbG9jKCB2X1NJWkVfdCBzaXplICk7CisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbWVtX2RtYV9mcmVlKCkgLSB2T1NTIERNQSBGcmVlIE1lbW9yeQorCisgIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHNwZWNpYWwgRE1BIGZyaWVuZGx5IG1lbW9yeSBwb2ludGVkIHRvIGJ5ICdwdHInLgorICAKKyAgXHBhcmFtIHB0ciAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBiZSAKKyAgICAgICAgICAgICAgIGZyZWUnZC4gIAorICAKKyAgXHJldHVybiBOb3RoaW5nCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9WT0lEX3Qgdm9zX21lbV9kbWFfZnJlZSggdl9WT0lEX3QgKnB0ciApOworCisjaWZkZWYgRE1BX0RJUkVDVF9BQ0NFU1MKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19tZW1fc2V0X2RtYV9wdHIoKSAtIHZPU1MgRE1BIG1lbW9yeSBwb2l0ZXIgc2V0IGJ5IFNBTAorCisgIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgRE1BIFBoeXNpY2FsIG1lbW9yeSBwb2ludGVyLgorCisgIAorICBccGFyYW0gZG1hQnVmZmVyIC0gcG9pbnRlciB0byB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIGJlIAorICAgICAgICAgICAgICAgZnJlZSdkLiAgCisgIAorICBccmV0dXJuIE5vdGhpbmcKKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1ZPSURfdCB2b3NfbWVtX3NldF9kbWFfcHRyKHVuc2lnbmVkIGNoYXIgKmRtYUJ1ZmZlcik7CisjZW5kaWYgLyogRE1BX0RJUkVDVF9BQ0NFU1MgKi8KKyNlbmRpZiAvLyBfX1ZPU1NfTE9DS19ICmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL3Zvc19tcS5oIGIvQ09SRS9WT1NTL2luYy92b3NfbXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDk5N2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy92b3NfbXEuaApAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19WT1NfTVFfSCApCisjZGVmaW5lIF9fVk9TX01RX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHZvc19tcS5oCisgIAorICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpY2VzICh2T1NTKSBtZXNzYWdlIHF1ZXVlIEFQSXMKKyAgICAgICAgICAgICAgIAorICAgTWVzc2FnZSBRdWV1ZSBEZWZpbml0aW9ucyBhbmQgQVBJCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8dm9zX3R5cGVzLmg+CisjaW5jbHVkZSA8dm9zX3N0YXR1cy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAKKy8vLyB2b3MgTWVzc2FnZSBUeXBlLiAgCisvLy8gVGhpcyByZXByZXNuZXRzIGEgbWVzc2FnZSB0aGF0IGNhbiBiZSBwb3N0ZWQgdG8gYW5vdGhlciBtb2R1bGUgdGhyb3VnaAorLy8vIHRoZSB2b3NzIE1lc3NhZ2UgUXVldWVzLiAgCisvLy8KKy8vLyBcbm90ZSBUaGlzIGlzIG1hcHBlZCBkaXJlY3RseSB0byB0aGUgdFNpck1zZ1EgZm9yIGJhY2t3YXJkCisvLy8gICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBsZWdhY3kgTUFDIGNvZGUuICAKKwordHlwZWRlZiBzdHJ1Y3Qgdm9zX21zZ19zCit7CisgICAgdl9VMTZfdCB0eXBlOworICAgIC8qCisgICAgICogVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCBhcyBzZXF1ZW5jZSBudW1iZXIvZGlhbG9nIHRva2VuIGZvciBtYXRjaGluZworICAgICAqIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCisgICAgICovCisgICAgdl9VMTZfdCByZXNlcnZlZDsKKyAgICAvKioKKyAgICAgKiBCYXNlZCBvbiB0aGUgdHlwZSBlaXRoZXIgYSBib2R5cHRyIHBvaW50ZXIgaW50bworICAgICAqIG1lbW9yeSBvciBib2R5dmFsIGFzIGEgMzIgYml0IGRhdGEgaXMgdXNlZC4KKyAgICAgKiBib2R5cHRyOiBpcyBhbHdheXMgYSBmcmVlYWJsZSBwb2ludGVyLCBvbmUgc2hvdWxkIGFsd2F5cworICAgICAqIG1ha2Ugc3VyZSB0aGF0IGJvZHlwdHIgaXMgYWx3YXlzIGZyZWVhYmxlLgorICAgICAqIAorICAgICAqIE1lc3NhZ2VzIHNob3VsZCB1c2UgZWl0aGVyIGJvZHlwdHIgb3IgYm9keXZhbDsgbm90IGJvdGggISEhLgorICAgICAqLworICAgIHZvaWQgKmJvZHlwdHI7CisgICAgCisgICAgdl9VMzJfdCBib2R5dmFsOyAgICAKKyAgICAKK30gdm9zX21zZ190OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgCisvLy8gTWVzc2FnZSBRdWV1ZSBJRHMgIAordHlwZWRlZiBlbnVtCit7CisgIC8vLyBNZXNzYWdlIFF1ZXVlIElEIGZvciBtZXNzYWdlcyBib3VuZCBmb3IgU01FCisgIFZPU19NUV9JRF9TTUUgPSBWT1NfTU9EVUxFX0lEX1NNRSwKKyAgCisgIC8vLyBNZXNzYWdlIFF1ZXVlIElEIGZvciBtZXNzYWdlcyBib3VuZCBmb3IgUEUKKyAgVk9TX01RX0lEX1BFID0gVk9TX01PRFVMRV9JRF9QRSwgCisgIAorI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgLy8vIE1lc3NhZ2UgUXVldWUgSUQgZm9yIG1lc3NhZ2VzIGJvdW5kIGZvciBIQUwKKyAgVk9TX01RX0lEX0hBTCA9IFZPU19NT0RVTEVfSURfSEFMLAorI2Vsc2UKKyAgLy8vIE1lc3NhZ2UgUXVldWUgSUQgZm9yIG1lc3NhZ2VzIGJvdW5kIGZvciBXREEKKyAgVk9TX01RX0lEX1dEQSA9IFZPU19NT0RVTEVfSURfV0RBLAorI2VuZGlmCisKKyAgLy8vIE1lc3NhZ2UgUXVldWUgSUQgZm9yIG1lc3NhZ2VzIGJvdW5kIGZvciBUTAorICBWT1NfTVFfSURfVEwgPSBWT1NfTU9EVUxFX0lEX1RMLAorCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAvLy8gTWVzc2FnZSBRdWV1ZSBJRCBmb3IgbWVzc2FnZXMgYm91bmQgZm9yIFNTQworICBWT1NfTVFfSURfU1NDID0gVk9TX01PRFVMRV9JRF9TU0MsCisjZW5kaWYKKyAgCisgIC8vLyBNZXNzYWdlIFF1ZXVlIElEIGZvciBtZXNzYWdlcyBib3VuZCBmb3IgdGhlIFNZUyBtb2R1bGUKKyAgVk9TX01RX0lEX1NZUyA9IFZPU19NT0RVTEVfSURfU1lTLAorCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAvLy8gTWVzc2FnZSBRdWV1ZSBJRCBmb3IgU0RJTyBJbnRlcnJ1cHQgSGFuZGxlIGluIFNBTAorICBWT1NfTVFfSURfU0FMID0gVk9TX01PRFVMRV9JRF9TQUwKKyNlbHNlCisgIC8vLyBNZXNzYWdlIFF1ZXVlIElEIGZvciBtZXNzYWdlcyBib3VuZCBmb3IgV0RBCisgIFZPU19NUV9JRF9XREkgPSBWT1NfTU9EVUxFX0lEX1dESSwKKyNlbmRpZgorICAKK30gVk9TX01RX0lEOworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19tcV9wb3N0X21lc3NhZ2UoKSAtIHBvc3QgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBxdWV1ZQorCisgIFRoaXMgQVBJIGFsbG93cyBtZXNzYWdlcyB0byBiZSBwb3N0ZWQgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIHF1ZXVlLiAgTWVzc2FnZXMKKyAgY2FuIGJlIHBvc3RlZCB0byB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgcXVldWVzOgorICAKKyAgPHVsPgorICAgIDxsaT4gU01FCisgICAgPGxpPiBQRQorICAgIDxsaT4gSEFMCisgICAgPGxpPiBUTAorICA8L3VsPiAKKyAgCisgIFxwYXJhbSBtc2dRdWV1ZUlkIC0gaWRlbnRpZmllcyB0aGUgbWVzc2FnZSBxdWV1ZSB1cG9uIHdoaWNoIHRoZSBtZXNzYWdlCisgICAgICAgICB3aWxsIGJlIHBvc3RlZC4KKyAgICAgICAgIAorICBccGFyYW0gbWVzc2FnZSAtIGEgcG9pbnRlciB0byBhIG1lc3NhZ2UgYnVmZmVyLiAgTWVtb3J5IGZvciB0aGlzIG1lc3NhZ2UgCisgICAgICAgICBidWZmZXIgaXMgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIgYW5kIGZyZWUnZCBieSB0aGUgdk9TUyBhZnRlciB0aGUKKyAgICAgICAgIG1lc3NhZ2UgaXMgcG9zdGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlLiAgSWYgdGhlIGNvbnN1bWVyIG9mIHRoZSAKKyAgICAgICAgIG1lc3NhZ2UgbmVlZHMgYW55dGhpbmcgaW4gdGhpcyBtZXNzYWdlLCBpdCBuZWVkcyB0byBjb3B5IHRoZSBjb250ZW50cworICAgICAgICAgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoZSBtZXNzYWdlIHF1ZXVlIGhhbmRsZXIuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwb3N0ZWQKKyAgICAgICAgICB0byB0aGUgbWVzc2FnZSBxdWV1ZS4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IG1zZ1F1ZXVlSWQgZG9lcyBub3QgCisgICAgICAgICAgcmVmZXIgdG8gYSB2YWxpZCBNZXNzYWdlIFF1ZXVlIElkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBtZXNzYWdlIGlzIGFuIGludmFsaWQgcG9pbnRlci4gICAgIAorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gdGhlIG1lc3NhZ2UgcXVldWUgaGFuZGxlciBoYXMgcmVwb3J0ZWQKKyAgICAgICAgICBhbiB1bmtub3duIGZhaWx1cmUuCisKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19tcV9wb3N0X21lc3NhZ2UoIFZPU19NUV9JRCBtc2dRdWV1ZUlkLCB2b3NfbXNnX3QgKm1lc3NhZ2UgKTsKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfdHhfbXFfc2VyaWFsaXplKCkgLSBzZXJpYWxpemUgYSBtZXNzYWdlIHRvIHRoZSBUeCBleGVjdXRpb24gZmxvdworCisgIFRoaXMgQVBJIGFsbG93cyBtZXNzYWdlcyB0byBiZSBwb3N0ZWQgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIHF1ZXVlIGluIHRoZSAKKyAgVHggZXhjdXRpb24gZmxvdy4gIE1lc3NhZ2VzIGZvciB0aGUgVHggZXhlY3V0aW9uIGZsb3cgY2FuIGJlIHBvc3RlZCBvbmx5IAorICB0byB0aGUgZm9sbG93aW5nIHF1ZXVlLgorICAKKyAgPHVsPgorICAgIDxsaT4gVEwKKyAgICA8bGk+IFdESS9TU0MKKyAgPC91bD4KKyAgCisgIFxwYXJhbSBtc2dRdWV1ZUlkIC0gaWRlbnRpZmllcyB0aGUgbWVzc2FnZSBxdWV1ZSB1cG9uIHdoaWNoIHRoZSBtZXNzYWdlCisgICAgICAgICB3aWxsIGJlIHBvc3RlZC4KKyAgICAgICAgIAorICBccGFyYW0gbWVzc2FnZSAtIGEgcG9pbnRlciB0byBhIG1lc3NhZ2UgYnVmZmVyLiAgQm9keSBtZW1vcnkgZm9yIHRoaXMgbWVzc2FnZSAKKyAgICAgICAgIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciBhbmQgZnJlZSdkIGJ5IHRoZSB2T1NTIGFmdGVyIHRoZQorICAgICAgICAgbWVzc2FnZSBpcyBkaXNwYWN0aGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBjb21wb25lbnQuICBJZiB0aGUgY29uc3VtZXIgCisgICAgICAgICBvZiB0aGUgbWVzc2FnZSBuZWVkcyB0byBrZWVwIGFueXRoaW5nIGluIHRoZSBib2R5LCBpdCBuZWVkcyB0byBjb3B5IAorICAgICAgICAgdGhlIGNvbnRlbnRzIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgbWVzc2FnZSBoYW5kbGVyLgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgbWVzc2FnZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcG9zdGVkCisgICAgICAgICAgdG8gdGhlIG1lc3NhZ2UgcXVldWUuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBtc2dRdWV1ZUlkIGRvZXMgbm90IAorICAgICAgICAgIHJlZmVyIHRvIGEgdmFsaWQgTWVzc2FnZSBRdWV1ZSBJZC4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gbWVzc2FnZSBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgICAKKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIHRoZSBtZXNzYWdlIHF1ZXVlIGhhbmRsZXIgaGFzIHJlcG9ydGVkCisgICAgICAgICAgYW4gdW5rbm93biBmYWlsdXJlLgorCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTVFfSUQgbXNnUXVldWVJZCwgdm9zX21zZ190ICptZXNzYWdlICk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcnhfbXFfc2VyaWFsaXplKCkgLSBzZXJpYWxpemUgYSBtZXNzYWdlIHRvIHRoZSBSeCBleGVjdXRpb24gZmxvdworCisgIFRoaXMgQVBJIGFsbG93cyBtZXNzYWdlcyB0byBiZSBwb3N0ZWQgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIHF1ZXVlIGluIHRoZQorICBUeCBleGN1dGlvbiBmbG93LiAgTWVzc2FnZXMgZm9yIHRoZSBSeCBleGVjdXRpb24gZmxvdyBjYW4gYmUgcG9zdGVkIG9ubHkKKyAgdG8gdGhlIGZvbGxvd2luZyBxdWV1ZS4KKworICA8dWw+CisgICAgPGxpPiBXREkKKyAgPC91bD4KKworICBccGFyYW0gbXNnUXVldWVJZCAtIGlkZW50aWZpZXMgdGhlIG1lc3NhZ2UgcXVldWUgdXBvbiB3aGljaCB0aGUgbWVzc2FnZQorICAgICAgICAgd2lsbCBiZSBwb3N0ZWQuCisKKyAgXHBhcmFtIG1lc3NhZ2UgLSBhIHBvaW50ZXIgdG8gYSBtZXNzYWdlIGJ1ZmZlci4gIEJvZHkgbWVtb3J5IGZvciB0aGlzIG1lc3NhZ2UKKyAgICAgICAgIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciBhbmQgZnJlZSdkIGJ5IHRoZSB2T1NTIGFmdGVyIHRoZQorICAgICAgICAgbWVzc2FnZSBpcyBkaXNwYWN0aGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBjb21wb25lbnQuICBJZiB0aGUgY29uc3VtZXIKKyAgICAgICAgIG9mIHRoZSBtZXNzYWdlIG5lZWRzIHRvIGtlZXAgYW55dGhpbmcgaW4gdGhlIGJvZHksIGl0IG5lZWRzIHRvIGNvcHkKKyAgICAgICAgIHRoZSBjb250ZW50cyBiZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIG1lc3NhZ2UgaGFuZGxlci4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwb3N0ZWQKKyAgICAgICAgICB0byB0aGUgbWVzc2FnZSBxdWV1ZS4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgbXNnUXVldWVJZCBkb2VzIG5vdAorICAgICAgICAgIHJlZmVyIHRvIGEgdmFsaWQgTWVzc2FnZSBRdWV1ZSBJZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBtZXNzYWdlIGlzIGFuIGludmFsaWQgcG9pbnRlci4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gdGhlIG1lc3NhZ2UgcXVldWUgaGFuZGxlciBoYXMgcmVwb3J0ZWQKKyAgICAgICAgICBhbiB1bmtub3duIGZhaWx1cmUuCisKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcnhfbXFfc2VyaWFsaXplKCBWT1NfTVFfSUQgbXNnUXVldWVJZCwgdm9zX21zZ190ICptZXNzYWdlICk7CisKKyNlbmRpZgorCisjZW5kaWYgLy8gaWYgIWRlZmluZWQgX19WT1NfTVFfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy92b3NfbnZpdGVtLmggYi9DT1JFL1ZPU1MvaW5jL3Zvc19udml0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGI0NTBjCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy92b3NfbnZpdGVtLmgKQEAgLTAsMCArMSw2NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fVk9TX05WSVRFTV9IICkKKyNkZWZpbmUgX19WT1NfTlZJVEVNX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFxmaWxlICB2b3NfbnZpdGVtLmgKKworICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpY2VzICh2T1NTKTogTm9uLVZvbGF0aWxlIHN0b3JhZ2UgQVBJCisKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJ2b3Nfc3RhdHVzLmgiCisjaW5jbHVkZSAid2xhbl9udi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBOViBJdGVtcyB3aXRoIHRoZWlyIHBhcmFtZXRlcnMgYXJlIHNwZWNpZmllZCBiZWxvdworLy8gUGFyYW1ldGVycyBpbmNsdWRlOiBlbnVtIGxhYmVsIGluIFZOVl9UWVBFIChfbmFtZSksCisvLyBlbGVtZW50IGNvdW50IChfY250KSwgZWxlbWVudCBzaXplIChfc2l6ZSksCisvLyBlbnVtIG9mIGZpcnN0IGVsZW1lbnQgaW4gTlYgbW9kdWxlIChfbGFiZWwpCisKKy8qCisgKiBUaGUgVk9TIE5WIEl0ZW0gVGFibGUgaXMgY29tcGxpYW50IHRvIEFNU1MgTlYgc2VydmljZSBmaWxlcyBvZjoKKyAqIC8vc291cmNlL3Fjb20vcWN0L3djb25uZWN0L3dsYW4vcHJpdmF0ZS9jc3cvbnYvIEAgQ0wgNDMxMTAyCisgKgorICogVk5WX1JFR1VMQVRPUllfRE9NQUlOX1RBQkxFIC0gY29udGFpbnMgcmVndWxhdG9yeSBkb21haW4gaW5mb3JtYXRpb247CisgKiB0aGUgdGFibGUgaXMgc3RvcmVkIGFzICQoUkVHRE9NQUlOX0NPVU5UKSBOViBpdGVtcyB3aGVyZSBlYWNoIE5WIGl0ZW0KKyAqIGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBvbmUgZG9tYWluOyBzZWUgZGVmaW5pdGlvbiBvZiB2X1JFR0RPTUFJTl90CisgKiBmb3IgdGhlIHJlZ3VsYXRvcnkgZG9tYWlucworICoKKyAqIFZOVl9GSUVMRF9JTUFHRSAtIGNvbnRhaW5zIHZhcmlvdXMgZWxlbWVudHMgc3VjaCBhcyBNQUMgYWRkcmVzc2VzCisgKgorICogVk5WX1JBVEVfVE9fUE9XRVJfVEFCTEUgLSB0YWJsZSBvZiBwb3dlciBmb3IgZWFjaCBvZiAyNSBQSFkgcmF0ZXMKKyAqCisgKiBWTlZfREVGQVVMVF9MT0NBVElPTiAgLSBkZWZhdWx0IGNvdW50cnkgY29kZSBhbmQgcmVndWxhdG9yeSBkb21haW4KKyAqCisgKiBWTlZfTUFYSU1VTV9UWF9QT1dFUgorICoKKyAqIFZOVl9SWF9TRU5TSVRJVklUWSAtIHRhYmxlIG9mIHNlbnNpdGl2aXR5IGZvciBlYWNoIG9mICUoTUFDX1JBVEVfQ09VTlQpIE1BQworICogcmF0ZXM7IHNlZSBkZWZpbml0aW9uIG9mIHZfTUFDX1JBVEVfdCBmb3IgdGhlIE1BQyByYXRlcworICoKKyAqIFZOVl9ORVRXT1JLX1RZUEUgLSBlaXRoZXIgQSwgQiBvciBHIHR5cGUKKyAqCisgKiBWT1ZfUUZVU0UgLSAxNiBieXRlIFFGVVNFIGRhdGEKKyAqLworI2RlZmluZSBWTlZfSVRFTV9UQUJMRSBcCitBRERfVk5WX0lURU0oIFZOVl9SRUdVTEFSVE9SWV9ET01BSU5fVEFCTEUsIFJFR0RPTUFJTl9DT1VOVCwgMTQ0LCBcCisgICAgICBOVl9XTEFOX1JFR1VMQVRPUllfRE9NQUlOX0ZDQ19JICkgXAorQUREX1ZOVl9JVEVNKCBWTlZfRklFTERfSU1BR0UsIDEsIDUyLCBOVl9XTEFOX0ZJRUxEX0lNQUdFX0kgKSBcCitBRERfVk5WX0lURU0oIFZOVl9SQVRFX1RPX1BPV0VSX1RBQkxFLCAyLCA2NiwgTlZfV0xBTl9SQVRFX1RPX1BPV0VSX0xJU1RfSSApXAorQUREX1ZOVl9JVEVNKCBWTlZfREVGQVVMVF9MT0NBVElPTiwgMSwgNCwgTlZfV0xBTl9ERUZBVUxUX0xPQ0FUSU9OX0lORk9fSSApIFwKK0FERF9WTlZfSVRFTSggVk5WX1RQQ19QT1dFUl9UQUJMRSwgMTQsIDEyOCwgTlZfV0xBTl9UUENfUE9XRVJfVEFCTEVfSSApIFwKK0FERF9WTlZfSVRFTSggVk5WX1RQQ19QREFEQ19PRkZTRVRTLCAxNCwgMiwgTlZfV0xBTl9UUENfUERBRENfT0ZGU0VUU19JICkgXAorQUREX1ZOVl9JVEVNKCBWTlZfTUFYSU1VTV9UWF9QT1dFUiwgMSwgMSwgTlZfV0xBTl9NQVhfVFhfUE9XRVJfSSApIFwKK0FERF9WTlZfSVRFTSggVk5WX1JYX1NFTlNJVElWSVRZLCAxLCBNQUNfUkFURV9DT1VOVCwgTlZfV0xBTl9SWF9TRU5TSVRJVklUWV9JKVwKK0FERF9WTlZfSVRFTSggVk5WX05FVFdPUktfVFlQRSwgMSwgMSwgTlZfV0xBTl9ORVRXT1JLX1RZUEVfSSApIFwKK0FERF9WTlZfSVRFTSggVk5WX0NBTF9NRU1PUlksIDEsIDM0NjAsIE5WX1dMQU5fQ0FMX01FTU9SWV9JICkgXAorQUREX1ZOVl9JVEVNKCBWTlZfQ0FMX1NUQVRVUywgMSwgMzIsIE5WX1dMQU5fQ0FMX1NUQVRVU19JICkgXAorQUREX1ZOVl9JVEVNKCBWTlZfUlNTSV9DSEFOTkVMX09GRlNFVFMsIDIsIDU2LCBOVl9XTEFOX1JTU0lfQ0hBTk5FTF9PRkZTRVRTX0kgKSBcCitBRERfVk5WX0lURU0oIFZOVl9SRl9DQUxfVkFMVUVTLCAxLCA0OCwgTlZfV0xBTl9SRl9DQUxfVkFMVUVTX0kgKSBcCitBRERfVk5WX0lURU0oIFZOVl9BTlRFTk5BX1BBVEhfTE9TUywgMTQsIDIsIE5WX1dMQU5fQU5URU5OQV9QQVRIX0xPU1NfSSApIFwKK0FERF9WTlZfSVRFTSggVk5WX1BBQ0tFVF9UWVBFX1BPV0VSX0xJTUlUUywgNDIsIDIsIE5WX1dMQU5fUEFDS0VUX1RZUEVfUE9XRVJfTElNSVRTX0kgKSBcCitBRERfVk5WX0lURU0oIFZOVl9PRkRNX0NNRF9QV1JfT0ZGU0VULCAxLCAyLCBOVl9XTEFOX09GRE1fQ01EX1BXUl9PRkZTRVRfSSApIFwKK0FERF9WTlZfSVRFTSggVk5WX1RYX0JCX0ZJTFRFUl9NT0RFLCAxLCA0LCBOVl9UWF9CQl9GSUxURVJfTU9ERV9JICkgXAorQUREX1ZOVl9JVEVNKCBWTlZfRlJFUVVFTkNZX0ZPUl8xXzNWX1NVUFBMWSwgMSwgNCwgTlZfRlJFUVVFTkNZX0ZPUl8xXzNWX1NVUFBMWV9JICkgXAorQUREX1ZOVl9JVEVNKCBWTlZfVEFCTEVfVklSVFVBTF9SQVRFLCAxLCA0LCBWTlZfVEFCTEVfVklSVFVBTF9SQVRFX0kgKSBcCisKKworI2RlZmluZSBWT1NfQ09VTlRSWV9DT0RFX0xFTiAgMgorI2RlZmluZSBWT1NfTUFDX0FERFJFU1NfTEVOICAgNgorI2RlZmluZSBWT1NfTlZfRlJFUVVFTkNZX0ZPUl8xXzNWX1NVUFBMWV8zUDJNSCAwICAgLy8zLjIgTWh6CisjZGVmaW5lIFZPU19OVl9GUkVRVUVOQ1lfRk9SXzFfM1ZfU1VQUExZXzFQNk1IIDEgICAvLzEuNiBNaHoKKworCisvKiEgCisgKiBUaGUgcGF0aCAoZnJvbSB0aGUgcm9vdCBvZiB0aGUgRFBQX0ZPTERFUl9QQVRIXFFDT00pIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcKKyAqIHRoZSBDTFBDIHByb3Zpc2lvbmluZyBkYXRhLiBUaGlzIGlzIGJlaW5nIHRlbXBvcmFyaWx5IHB1dCBoZXJlLiBUaGlzIHNob3VsZCBnbworICogdG8gZXNwX2RwcC5oIHdoZXJlIHRoZSBXTEFOX1BST1ZJU0lPTl9EQVRBIGlzIHByZXNlbnQuCisgKi8KKyNkZWZpbmUgQ0xQQ19QUk9WSVNJT05fREFUQSBMIldMQU5fQ0xQQy5QUk9WSVNJT04iCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vIGVudW0gb2YgUlggc2Vuc2l0aXZpdHkgdGFibGUgaW5kZXgKK3R5cGVkZWYgZW51bQoreworICAgLy8gMTFiCisgICBNQUNfUkFURV8xMUJfMV9NQlBTLAorICAgTUFDX1JBVEVfMTFCXzJfTUJQUywKKyAgIE1BQ19SQVRFXzExQl81XzVfTUJQUywKKyAgIE1BQ19SQVRFXzExQl8xMV9NQlBTLAorCisgICAvLyAxMWcKKyAgIE1BQ19SQVRFXzExR182X01CUFMsCisgICBNQUNfUkFURV8xMUdfOV9NQlBTLAorICAgTUFDX1JBVEVfMTFHXzEyX01CUFMsCisgICBNQUNfUkFURV8xMUdfMThfTUJQUywKKyAgIE1BQ19SQVRFXzExR18yNF9NQlBTLAorICAgTUFDX1JBVEVfMTFHXzM2X01CUFMsCisgICBNQUNfUkFURV8xMUdfNDhfTUJQUywKKyAgIE1BQ19SQVRFXzExR181NF9NQlBTLAorCisgICAvLyAxMW4KKyAgIE1BQ19SQVRFXzExTl9NQ1NfMCwKKyAgIE1BQ19SQVRFXzExTl9NQ1NfMSwKKyAgIE1BQ19SQVRFXzExTl9NQ1NfMiwKKyAgIE1BQ19SQVRFXzExTl9NQ1NfMywKKyAgIE1BQ19SQVRFXzExTl9NQ1NfNCwKKyAgIE1BQ19SQVRFXzExTl9NQ1NfNSwKKyAgIE1BQ19SQVRFXzExTl9NQ1NfNiwKKyAgIE1BQ19SQVRFXzExTl9NQ1NfNywKKworICAgTUFDX1JBVEVfQ09VTlQKKworfSB2X01BQ19SQVRFX3Q7CisKKy8vIGVudW0gb2YgcmVndWxhdG9yeSBkb2FtYWlucyBpbiBXTEFOCit0eXBlZGVmIGVudW0KK3sKKyAgIFJFR0RPTUFJTl9GQ0MsCisgICBSRUdET01BSU5fRVRTSSwKKyAgIFJFR0RPTUFJTl9KQVBBTiwKKyAgIFJFR0RPTUFJTl9XT1JMRCwKKyAgIFJFR0RPTUFJTl9OX0FNRVJfRVhDX0ZDQywKKyAgIFJFR0RPTUFJTl9BUEFDLAorICAgUkVHRE9NQUlOX0tPUkVBLAorICAgUkVHRE9NQUlOX0hJXzVHSFosCisgICBSRUdET01BSU5fTk9fNUdIWiwKKyAgIC8vIGFkZCBuZXcgcmVndWxhdG9yeSBkb21haW4gaGVyZQorICAgUkVHRE9NQUlOX0NPVU5UCit9Cit2X1JFR0RPTUFJTl90OworCisvLyBlbnVtIG9mIHN1cHBvcnRlZCBOViBpdGVtcyBpbiBWT1NTCit0eXBlZGVmIGVudW0KK3sKKyNkZWZpbmUgQUREX1ZOVl9JVEVNKF9uYW1lLCBfY250LCBfc2l6ZSwgX2xhYmVsKSBfbmFtZSwKKyAgIFZOVl9JVEVNX1RBQkxFCisjdW5kZWYgQUREX1ZOVl9JVEVNCisgICBWTlZfVFlQRV9DT1VOVAorfQorVk5WX1RZUEU7CisKKy8vIGNvdW50cnkgY29kZSB0eXBlCit0eXBlZGVmIHZfVThfdCB2X0NPVU5UUllDT0RFX3RbVk9TX0NPVU5UUllfQ09ERV9MRU5dOworCisvLyBNQUMgYWRkcmVzcyB0eXBlCit0eXBlZGVmIHZfVThfdCB2X01BQ19BRERSRVNTX3RbVk9TX01BQ19BRERSRVNTX0xFTl07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19udl9pbml0KCkgLSBpbml0aWFsaXplIHRoZSBOViBtb2R1bGUKKworICBUaGUgXGEgdm9zX252X2luaXQoKSBpbml0aWFsaXplcyB0aGUgTlYgbW9kdWxlLiAgVGhpcyByZWFkIHRoZSBiaW5hcnkKKyAgZmlsZSBmb3IgY291bnRyeSBjb2RlIGFuZCByZWd1bGF0b3J5IGRvbWFpbiBpbmZvcm1hdGlvbi4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG1vZHVsZSBpcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBvdGhlcndpc2UgIC0gbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZAorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X2luaXQodm9pZCk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbnZfZ2V0UmVnRG9tYWluRnJvbUNvdW50cnlDb2RlKCkgLSBnZXQgdGhlIHJlZ3VsYXRvcnkgZG9tYWluIG9mCisgIGEgY291bnRyeSBnaXZlbiBpdHMgY291bnRyeSBjb2RlCisKKyAgVGhlIFxhIHZvc19udl9nZXRSZWdEb21haW5Gcm9tQ291bnRyeUNvZGUoKSByZXR1cm5zIHRoZSByZWd1bGF0b3J5IGRvbWFpbiBvZgorICBhIGNvdW50cnkgZ2l2ZW4gaXRzIGNvdW50cnkgY29kZS4gIFRoaXMgaXMgZG9uZSBmcm9tIHJlYWRpbmcgYSBjYWNoZWQKKyAgY29weSBvZiB0aGUgYmluYXJ5IGZpbGUuCisKKyAgXHBhcmFtIHBSZWdEb21haW4gIC0gcG9pbnRlciB0byByZWd1bGF0b3J5IGRvbWFpbgorCisgIFxwYXJhbSBjb3VudHJ5Q29kZSAtIGNvdW50cnkgY29kZQorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gcmVndWxhdG9yeSBkb21haW4gaXMgZm91bmQgZm9yIHRoZSBnaXZlbiBjb3VudHJ5CisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gaW52YWxpZCBwb2ludGVyIGVycm9yCisgICAgICAgICAgVk9TX1NUQVRVU19FX0VNUFRZIC0gY291bnRyeSBjb2RlIHRhYmxlIGlzIGVtcHR5CisgICAgICAgICAgVk9TX1NUQVRVU19FX0VYSVNUUyAtIGdpdmVuIGNvdW50cnkgY29kZSBkb2VzIG5vdCBleGlzdCBpbiB0YWJsZQorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbnZfZ2V0UmVnRG9tYWluRnJvbUNvdW50cnlDb2RlKCB2X1JFR0RPTUFJTl90ICpwUmVnRG9tYWluLAorICAgICAgY29uc3Qgdl9DT1VOVFJZQ09ERV90IGNvdW50cnlDb2RlICk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbnZfZ2V0U3VwcG9ydGVkQ291bnRyeUNvZGUoKSAtIGdldCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQKKyAgY291bnRyeSBjb2RlcworCisgIFRoZSBcYSB2b3NfbnZfZ2V0U3VwcG9ydGVkQ291bnRyeUNvZGUoKSBlbmNvZGVzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZAorICBjb3VudHJ5IGNvZGVzIHdpdGggcGFkZGluZ3MgaW4gdGhlIHByb3ZpZGVkIGJ1ZmZlcgorCisgIFxwYXJhbSBwQnVmZmVyICAgICAtIHBvaW50ZXIgdG8gYnVmZmVyIHdoZXJlIHN1cHBvcnRlZCBjb3VudHJ5IGNvZGVzCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCBwYWRkaW5ncyBhcmUgZW5jb2RlZDsgdGhpcyBtYXkgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgdXNlciB3aXNoZXMgdG8gcXVlcnkgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIHRvCisgICAgICAgICAgICAgICAgICAgICAgIGdldCB0aGUgY291bnRyeSBjb2RlIGxpc3QKKworICBccGFyYW0gcEJ1ZmZlclNpemUgLSB0aGlzIGlzIHRoZSBwcm92aWRlZCBidWZmZXIgc2l6ZSBvbiBpbnB1dDsKKyAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgcmVxdWlyZWQgb3IgY29uc3VtZWQgYnVmZmVyIHNpemUgb24gb3V0cHV0CisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBjb3VudHJ5IGNvZGVzIGFyZSBzdWNjZXNzZnVsbHkgZW5jb2RlZAorICAgICAgICAgIFZPU19TVEFUVVNfRV9OT01FTSAtIGNvdW50cnkgY29kZXMgYXJlIG5vdCBlbmNvZGVkIGJlY2F1c2UgZWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ1ZmZlciBpcyBOVUxMIG9yIGJ1ZmZlciBzaXplIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZmljaWVudAorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X2dldFN1cHBvcnRlZENvdW50cnlDb2RlKCB2X0JZVEVfdCAqcEJ1ZmZlciwgdl9TSVpFX3QgKnBCdWZmZXJTaXplLAorICAgICAgdl9TSVpFX3QgcGFkZGluZ1NpemUgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19udl9zZXRWYWxpZGl0eSgpIC0gc2V0IHRoZSB2YWxpZGl0eSBvZiBhbiBOViBpdGVtLgorCisgIFRoZSBcYSB2b3NfbnZfc2V0VmFsaWRpdHkoKSB2YWxpZGF0ZXMgYW5kIGludmFsaWRhdGVzIGFuIE5WIGl0ZW0uICBUaGUKKyAgdmFsaWRpdHkgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIE5WIG1lbW9yeS4KKyAgT25lIHdvdWxkIGdldCB0aGUgVk9TX1NUQVRVU19FX0VYSVNUUyBlcnJvciB3aGVuIHJlYWRpbmcgYW4gaW52YWxpZCBpdGVtLgorICBBbiBpdGVtIGJlY29tZXMgdmFsaWQgd2hlbiBvbmUgaGFzIHdyaXR0ZW4gdG8gaXQgc3VjY2Vzc2Z1bGx5LgorCisgIFxwYXJhbSB0eXBlICAgICAgICAtIE5WIGl0ZW0gdHlwZQorCisgIFxwYXJhbSBpdGVtSXNWYWxpZCAtIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB0aGUgaXRlbSdzIHZhbGlkaXR5CisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB2YWxpZGl0eSBpcyBzZXQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIGludmFsaWQKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIHVua25vd24gZXJyb3IKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19udl9zZXRWYWxpZGl0eSggVk5WX1RZUEUgdHlwZSwgdl9CT09MX3QgaXRlbUlzVmFsaWQgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19udl9nZXRWYWxpZGl0eSgpIC0gZ2V0IHRoZSB2YWxpZGl0eSBvZiBhbiBOViBpdGVtLgorCisgIFRoZSBcYSB2b3NfbnZfZ2V0VmFsaWRpdHkoKSBpbmRpY2F0ZXMgaWYgYW4gTlYgaXRlbSBpcyB2YWxpZC4gIFRoZQorICB2YWxpZGl0eSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gTlYgbWVtb3J5LgorICBPbmUgd291bGQgZ2V0IHRoZSBWT1NfU1RBVFVTX0VfRVhJU1RTIGVycm9yIHdoZW4gcmVhZGluZyBhbiBpbnZhbGlkIGl0ZW0uCisgIEFuIGl0ZW0gYmVjb21lcyB2YWxpZCB3aGVuIG9uZSBoYXMgd3JpdHRlbiB0byBpdCBzdWNjZXNzZnVsbHkuCisKKyAgXHBhcmFtIHR5cGUgICAgICAgIC0gTlYgaXRlbSB0eXBlCisKKyAgXHBhcmFtIHBJdGVtSXNWYWxpZC0gcG9pbnRlciB0byB0aGUgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBpdGVtJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkKKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHZhbGlkaXR5IGlzIGRldGVybWluZWQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIGludmFsaWQKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIHVua25vd24gZXJyb3IKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19udl9nZXRWYWxpZGl0eSggVk5WX1RZUEUgdHlwZSwgdl9CT09MX3QgKnBJdGVtSXNWYWxpZCApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX252X3JlYWQoKSAtIHJlYWQgYSBOViBpdGVtIHRvIGFuIG91dHB1dCBidWZmZXIKKworICBUaGUgXGEgdm9zX252X3JlYWQoKSByZWFkcyBhIE5WIGl0ZW0gdG8gYW4gb3V0cHV0IGJ1ZmZlci4gIElmIHRoZSBpdGVtIGlzCisgIGFuIGFycmF5LCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHJlYWQgdGhlIGVudGlyZSBhcnJheS4gT25lIHdvdWxkIGdldCBhCisgIFZPU19TVEFUVVNfRV9FWElTVFMgZXJyb3Igd2hlbiByZWFkaW5nIGFuIGludmFsaWQgaXRlbS4KKworICBGb3IgZXJyb3IgY29uZGl0aW9ucyBvZiBWT1NfU1RBVFVTX0VfRVhJU1RTIGFuZCBWT1NfU1RBVFVTX0VfRkFJTFVSRSwKKyAgaWYgYSBkZWZhdWx0IGJ1ZmZlciBpcyBwcm92aWRlZCAod2l0aCBhIG5vbi1OVUxMIHZhbHVlKSwKKyAgdGhlIGRlZmF1bHQgYnVmZmVyIGNvbnRlbnQgaXMgY29waWVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorCisgIFxwYXJhbSB0eXBlICAtIE5WIGl0ZW0gdHlwZQorCisgIFxwYXJhbSBvdXRwdXRCdWZmZXIgICAtIG91dHB1dCBidWZmZXIKKworICBccGFyYW0gZGVmYXVsdEJ1ZmZlciAgLSBkZWZhdWx0IGJ1ZmZlcgorCisgIFxwYXJhbSBidWZmZXJTaXplICAtIG91dHB1dCBidWZmZXIgc2l6ZQorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gTlYgaXRlbSBpcyByZWFkIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBpbnZhbGlkCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gZGVmYXVsdEJ1ZmZlciBwb2ludCBpcyBOVUxMCisgICAgICAgICAgVk9TX1NUQVRVU19FX0VYSVNUUyAtIE5WIHR5cGUgaXMgdW5zdXBwb3J0ZWQKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIHVua25vd24gZXJyb3IKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19udl9yZWFkKCBWTlZfVFlQRSB0eXBlLCB2X1ZPSURfdCAqb3V0cHV0QnVmZmVyLAorICAgICAgdl9WT0lEX3QgKmRlZmF1bHRCdWZmZXIsIHZfU0laRV90IGJ1ZmZlclNpemUgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19udl9yZWFkQXRJbmRleCgpIC0gcmVhZCBhbiBlbGVtZW50IG9mIGEgTlYgYXJyYXkgdG8gYW4gb3V0cHV0CisgIGJ1ZmZlcgorCisgIFRoZSBcYSB2b3NfbnZfcmVhZEF0SW5kZXgoKSByZWFkcyBhbiBlbGVtZW50IG9mIGEgTlYgaXRlbSB0byBhbiBvdXRwdXQKKyAgYnVmZmVyLiBJZiB0aGUgaXRlbSBpcyBub3QgYXJyYXksIHRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBmb3IgaW5kZXggb2YgMC4KKyAgT25lIHdvdWxkIGdldCBhIFZPU19TVEFUVVNfRV9FWElTVFMgZXJyb3Igd2hlbiByZWFkaW5nIGFuIGludmFsaWQgaXRlbS4KKworICBGb3IgZXJyb3IgY29uZGl0aW9ucyBvZiBWT1NfU1RBVFVTX0VfRVhJU1RTIGFuZCBWT1NfU1RBVFVTX0VfRkFJTFVSRSwKKyAgaWYgYSBkZWZhdWx0IGJ1ZmZlciBpcyBwcm92aWRlZCAod2l0aCBhIG5vbi1OVUxsIHZhbHVlKSwKKyAgdGhlIGRlZmF1bHQgYnVmZmVyIGNvbnRlbnQgaXMgY29waWVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorCisgIFxwYXJhbSB0eXBlICAtIE5WIGl0ZW0gdHlwZQorCisgIFxwYXJhbSBpbmRleCAtIE5WIGFycmF5IGluZGV4CisKKyAgXHBhcmFtIG91dHB1dEJ1ZmZlciAgIC0gb3V0cHV0IGJ1ZmZlcgorCisgIFxwYXJhbSBkZWZhdWx0QnVmZmVyICAtIGRlZmF1bHQgYnVmZmVyCisKKyAgXHBhcmFtIGJ1ZmZlclNpemUgIC0gb3V0cHV0IGJ1ZmZlciBzaXplCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBOViBpdGVtIGlzIHJlYWQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIGludmFsaWQKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgLSBkZWZhdWx0QnVmZmVyIHBvaW50IGlzIE5VTEwKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRVhJU1RTIC0gTlYgdHlwZSBpcyB1bnN1cHBvcnRlZAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gdW5rbm93biBlcnJvcgorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X3JlYWRBdEluZGV4KCBWTlZfVFlQRSB0eXBlLCB2X1VJTlRfdCBpbmRleCwKKyAgICAgIHZfVk9JRF90ICpvdXRwdXRCdWZmZXIsIHZfVk9JRF90ICpkZWZhdWx0QnVmZmVyLCB2X1NJWkVfdCBidWZmZXJTaXplICk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbnZfd3JpdGUoKSAtIHdyaXRlIHRvIGEgTlYgaXRlbSBmcm9tIGFuIGlucHV0IGJ1ZmZlcgorCisgIFRoZSBcYSB2b3NfbnZfd3JpdGUoKSB3cml0ZXMgdG8gYSBOViBpdGVtIGZyb20gYW4gaW5wdXQgYnVmZmVyLiBUaGlzIHdvdWxkCisgIHZhbGlkYXRlIHRoZSBOViBpdGVtIGlmIHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKworICBccGFyYW0gdHlwZSAtIE5WIGl0ZW0gdHlwZQorCisgIFxwYXJhbSBpbnB1dEJ1ZmZlciAtIGlucHV0IGJ1ZmZlcgorCisgIFxwYXJhbSBpbnB1dEJ1ZmZlclNpemUgLSBpbnB1dCBidWZmZXIgc2l6ZQorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gTlYgaXRlbSBpcyByZWFkIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBpbnZhbGlkCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gb3V0cHV0QnVmZmVyIHBvaW50ZXIgaXMgTlVMTAorICAgICAgICAgIFZPU19TVEFUVVNfRV9FWElTVFMgLSBOViB0eXBlIGlzIHVuc3VwcG9ydGVkCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgICAtIHVua25vd24gZXJyb3IKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19udl93cml0ZSggVk5WX1RZUEUgdHlwZSwgdl9WT0lEX3QgKmlucHV0QnVmZmVyLAorICAgICAgIHZfU0laRV90IGlucHV0QnVmZmVyU2l6ZSApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX252X3dyaXRlQXRJbmRleCgpIC0gd3JpdGUgdG8gYW4gZWxlbWVudCBvZiBhIE5WIGFycmF5IGZyb20gYW4KKyAgaW5wdXQgYnVmZmVyCisKKyAgVGhlIFxhIHZvc19udl93cml0ZUF0SW5kZXgoKSB3cml0ZXMgdG8gYW4gZWxlbWVudCBvZiBhIE5WIGFycmF5IGZyb20gYW4KKyAgaW5wdXQgYnVmZmVyLiAgSWYgdGhlIGl0ZW0gaXMgbm90IGFuIGFycmF5LCB0aGlzIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yCisgIGFuIGFycmF5IGluZGV4IG9mIDAuICBUaGlzIHdvdWxkIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGUgdGhlIE5WIGl0ZW0gaWYgdGhlCisgIHdyaXRlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLgorCisgIFxwYXJhbSB0eXBlIC0gTlYgaXRlbSB0eXBlCisKKyAgXHBhcmFtIGluZGV4IC0gTlYgYXJyYXkgaW5kZXgKKworICBccGFyYW0gaW5wdXRCdWZmZXIgLSBpbnB1dCBidWZmZXIKKworICBccGFyYW0gaW5wdXRCdWZmZXJTaXplIC0gaW5wdXQgYnVmZmVyIHNpemUKKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIE5WIGl0ZW0gaXMgcmVhZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgaW52YWxpZAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIG91dHB1dEJ1ZmZlciBwb2ludGVyIGlzIE5VTEwKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRVhJU1RTIC0gTlYgdHlwZSBpcyB1bnN1cHBvcnRlZAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFICAgLSB1bmtub3duIGVycm9yCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbnZfd3JpdGVBdEluZGV4KCBWTlZfVFlQRSB0eXBlLCB2X1VJTlRfdCBpbmRleCwKKyAgICAgIHZfVk9JRF90ICppbnB1dEJ1ZmZlciwgdl9TSVpFX3QgaW5wdXRCdWZmZXJTaXplICk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbnZfZ2V0RWxlbWVudENvdW50KCkgLSByZXR1cm4gZWxlbWVudCBjb3VudCBvZiBhIE5WIGFycmF5CisKKyAgVGhlIFxhIHZvc19udl9nZXRFbGVtZW50Q291bnQoKSByZXR1cm5zIGVsZW1lbnQgY291bnQgb2YgYSBOViBhcnJheQorCisgIFxwYXJhbSB0eXBlIC0gTlYgaXRlbSB0eXBlCisKKyAgXHJldHVybiBjb3VudCBpZiB0eXBlIGlzIHZhbGlkOyAwIG90aGVyd2lzZQorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX0lOTElORV9GTiB2X1NJWkVfdCB2b3NfbnZfZ2V0RWxlbWVudENvdW50KCBWTlZfVFlQRSB0eXBlICkKK3sKKyAgIHN3aXRjaCAodHlwZSkKKyAgIHsKKyNkZWZpbmUgQUREX1ZOVl9JVEVNKF9uYW1lLCBfY250LCBfc2l6ZSwgX2xhYmVsKSBjYXNlIChfbmFtZSk6IHJldHVybiAoX2NudCk7CisgICAgICBWTlZfSVRFTV9UQUJMRQorI3VuZGVmIEFERF9WTlZfSVRFTQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiAwOworICAgfQorfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX252X2dldEVsZW1lbnRTaXplKCkgLSByZXR1cm4gc2l6ZSBvZiBhIE5WIGVsZW1lbnQKKworICBUaGUgXGEgdm9zX252X2dldEVsZW1lbnRTaXplKCkgcmV0dXJucyBzaXplIG9mIGEgTlYgZWxlbWVudC4KKworICBccGFyYW0gdHlwZSAtIE5WIGl0ZW0gdHlwZQorCisgIFxyZXR1cm4gc2l6ZSBpZiB0eXBlIGlzIHZhbGlkOyAwIG90aGVyd2lzZQorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX0lOTElORV9GTiB2X1NJWkVfdCB2b3NfbnZfZ2V0RWxlbWVudFNpemUoIFZOVl9UWVBFIHR5cGUgKQoreworICAgc3dpdGNoICh0eXBlKQorICAgeworI2RlZmluZSBBRERfVk5WX0lURU0oX25hbWUsIF9jbnQsIF9zaXplLCBfbGFiZWwpIGNhc2UgKF9uYW1lKTogcmV0dXJuIChfc2l6ZSk7CisgICAgICBWTlZfSVRFTV9UQUJMRQorI3VuZGVmIEFERF9WTlZfSVRFTQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiAwOworICAgfQorfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX252X2dldEl0ZW1TaXplKCkgLSByZXR1cm4gc2l6ZSBvZiBhIE5WIGl0ZW0KKworICBUaGUgXGEgdm9zX252X2dldEl0ZW1TaXplKCkgcmV0dXJucyBzaXplIG9mIGEgTlYgaXRlbS4KKworICBccGFyYW0gdHlwZSAtIE5WIGl0ZW0gdHlwZQorCisgIFxyZXR1cm4gc2l6ZSBvZiBhIE5WIGl0ZW0gYXJyYXkgaWYgdHlwZSBpcyB2YWxpZDsgMCBvdGhlcndpc2UKKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19JTkxJTkVfRk4gdl9TSVpFX3Qgdm9zX252X2dldEl0ZW1TaXplKCBWTlZfVFlQRSB0eXBlICkKK3sKKyAgIHJldHVybiB2b3NfbnZfZ2V0RWxlbWVudENvdW50KHR5cGUpICogdm9zX252X2dldEVsZW1lbnRTaXplKHR5cGUpOworfQorCisvLyBUT0RPOiBIQUwgTlYgaW50ZXJmYWNlIHNob3VsZCBiZSB1c2VkIHRvIGFjY2VzcyBpbmRpdmlkdWFsIE5WIGl0ZW1zCisvLyBpbnN0ZWFkIG9mIGJlbG93IGZ1bmN0aW9ucyBvbmNlIHRoYXQgaXMgcmVhZHkKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19udl9yZWFkVHhBbnRlbm5hQ291bnQoKSAtIHJldHVybiBudW1iZXIgb2YgVFggYW50ZW5uYQorCisgIFxwYXJhbSBwVHhBbnRlbm5hQ291bnQgICAtIGFudGVubmEgY291bnQKKworICBccmV0dXJuIHN0YXR1cyBvZiB0aGUgTlYgcmVhZCBvcGVyYXRpb24KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X3JlYWRUeEFudGVubmFDb3VudCggdl9VOF90ICpwVHhBbnRlbm5hQ291bnQgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19udl9yZWFkUnhBbnRlbm5hQ291bnQoKSAtIHJldHVybiBudW1iZXIgb2YgUlggYW50ZW5uYQorCisgIFxwYXJhbSBwUnhBbnRlbm5hQ291bnQgICAtIGFudGVubmEgY291bnQKKworICBccmV0dXJuIHN0YXR1cyBvZiB0aGUgTlYgcmVhZCBvcGVyYXRpb24KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X3JlYWRSeEFudGVubmFDb3VudCggdl9VOF90ICpwUnhBbnRlbm5hQ291bnQgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19udl9yZWFkTWFjQWRkcmVzcygpIC0gcmV0dXJuIHRoZSBNQUMgYWRkcmVzcworCisgIFxwYXJhbSBwTWFjQWRkcmVzcyAtIE1BQyBhZGRyZXNzCisKKyAgXHJldHVybiBzdGF0dXMgb2YgdGhlIE5WIHJlYWQgb3BlcmF0aW9uCisKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19udl9yZWFkTWFjQWRkcmVzcyggdl9NQUNfQUREUkVTU190IHBNYWNBZGRyZXNzICk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbnZfcmVhZE11bHRpTWFjQWRkcmVzcygpIC0gcmV0dXJuIHRoZSBNdWx0aXBsZSBNQUMgYWRkcmVzc2VzCisKKyAgXHBhcmFtIHBNYWNBZGRyZXNzIC0gTUFDIGFkZHJlc3MKKyAgXHBhcmFtIG1hY0NvdW50IC0gQ291bnQgb2YgdmFsaWQgTUFDIGFkZHJlc3NlcyB0byBnZXQgZnJvbSBOViBmaWVsZAorCisgIFxyZXR1cm4gc3RhdHVzIG9mIHRoZSBOViByZWFkIG9wZXJhdGlvbgorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbnZfcmVhZE11bHRpTWFjQWRkcmVzcyggdl9VOF90KiBwTWFjQWRkciwgdl9VOF90ICBtYWNDb3VudCk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgdm9zX252X2dldERlZmF1bHRSZWdEb21haW4oKSAtIHJldHVybiB0aGUgZGVmYXVsdCByZWd1bGF0b3J5IGRvbWFpbgorICBccmV0dXJuIGRlZmF1bHQgcmVndWxhdG9yeSBkb21haW4KKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9SRUdET01BSU5fdCB2b3NfbnZfZ2V0RGVmYXVsdFJlZ0RvbWFpbiggdm9pZCApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHZvc19udl9nZXRTdXBwb3J0ZWRDaGFubmVscygpIC0gZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBsaXN0IG9mCisgICAgICAgICAgc3VwcG9ydGVkIGNoYW5uZWxzCisgIFxwYXJhbSBwMjBNaHpDaGFubmVscyAtIGxpc3Qgb2YgMjAgTWh6IGNoYW5uZWxzCisgIFxwYXJhbSBwTnVtMjBNaHpDaGFubmVscyAtIG51bWJlciBvZiAyMCBNaHogY2hhbm5lbHMKKyAgXHBhcmFtIHA0ME1oekNoYW5uZWxzIC0gbGlzdCBvZiAyMCBNaHogY2hhbm5lbHMKKyAgXHBhcmFtIHBOdW00ME1oekNoYW5uZWxzIC0gbnVtYmVyIG9mIDIwIE1oeiBjaGFubmVscworICBccmV0dXJuIHN0YXR1cyBvZiB0aGUgTlYgcmVhZCBvcGVyYXRpb24KKyAgXE5vdGU6IDQwTWh6IG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X2dldFN1cHBvcnRlZENoYW5uZWxzKCB2X1U4X3QgKnAyME1oekNoYW5uZWxzLCBpbnQgKnBOdW0yME1oekNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcDQwTWh6Q2hhbm5lbHMsIGludCAqcE51bTQwTWh6Q2hhbm5lbHMpOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHZvc19udl9yZWFkRGVmYXVsdENvdW50cnlUYWJsZSgpIC0gcmV0dXJuIHRoZSBkZWZhdWx0IENvdW50cnkgdGFibGUKKyAgXHBhcmFtIHRhYmxlIGRhdGEgLSBhIHVuaW9uIHRvIHJldHVybiB0aGUgZGVmYXVsdCBjb3VudHJ5IHRhYmxlIGRhdGEgaW4uCisgIFxyZXR1cm4gc3RhdHVzIG9mIHRoZSBOViByZWFkIG9wZXJhdGlvbgorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19udl9yZWFkRGVmYXVsdENvdW50cnlUYWJsZSggdU52VGFibGVzICp0YWJsZURhdGEgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiB2b3NfbnZfZ2V0Q2hhbm5lbExpc3RXaXRoUG93ZXIoKSAtIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgbGlzdCBvZgorICAgICAgICAgIHN1cHBvcnRlZCBjaGFubmVscyB3aXRoIHRoZSBwb3dlciBsaW1pdCBpbmZvIHRvby4KKyAgXHBhcmFtIHBDaGFubmVsczIwTUh6IC0gbGlzdCBvZiAyMCBNaHogY2hhbm5lbHMKKyAgXHBhcmFtIHBOdW0yME1IekNoYW5uZWxzRm91bmQgLSBudW1iZXIgb2YgMjAgTWh6IGNoYW5uZWxzCisgIFxwYXJhbSBwQ2hhbm5lbHM0ME1IeiAtIGxpc3Qgb2YgMjAgTWh6IGNoYW5uZWxzCisgIFxwYXJhbSBwTnVtNDBNSHpDaGFubmVsc0ZvdW5kIC0gbnVtYmVyIG9mIDIwIE1oeiBjaGFubmVscworICBccmV0dXJuIHN0YXR1cyBvZiB0aGUgTlYgcmVhZCBvcGVyYXRpb24KKyAgXE5vdGU6IDQwTWh6IG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X2dldENoYW5uZWxMaXN0V2l0aFBvd2VyKHRDaGFubmVsTGlzdFdpdGhQb3dlciAqcENoYW5uZWxzMjBNSHogLypbTlVNX0xFR0lUX1JGX0NIQU5ORUxTXSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBOdW0yME1IekNoYW5uZWxzRm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q2hhbm5lbExpc3RXaXRoUG93ZXIgKnBDaGFubmVsczQwTUh6IC8qW05VTV9DSEFOX0JPTkRfQ0hBTk5FTFNdICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCAqcE51bTQwTUh6Q2hhbm5lbHNGb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19udl9vcGVuKCkgLSBpbml0aWFsaXplIHRoZSBOViBtb2R1bGUKKworICBUaGUgXGEgdm9zX252X29wZW4oKSBpbml0aWFsaXplcyB0aGUgTlYgbW9kdWxlLiAgVGhpcyBmdW5jdGlvbiByZWFkIHRoZSBiaW5hcnkKKyAgZmlsZSBxY29tX252LmJpbiBmb3IgbWFjYWRkcmVzcyxjb3VudHJ5IGNvZGUscmVndWxhdG9yeSBkb21haW4gaW5mb3JtYXRpb24gYW5kIGV0Yy4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG1vZHVsZSBpcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBvdGhlcndpc2UgIC0gbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZAorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X29wZW4odm9pZCk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbnZfY2xvc2UoKSAtIHVuaW5pdGlhbGl6ZSB0aGUgTlYgbW9kdWxlCisKKyAgVGhlIFxhIHZvc19udl9pbml0KCkgdW5pbml0aWFsaXplcyB0aGUgTlYgbW9kdWxlLiAgVGhpcyBmdW5jdGlvbiByZWxlYXNlIHRoZSBiaW5hcnkKKyAgZmlsZSBxY29tX252LmJpbiBkYXRhIGJ1ZmZlci4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG1vZHVsZSBpcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBvdGhlcndpc2UgIC0gbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZAorICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVk9TX1NUQVRVUyB2b3NfbnZfY2xvc2Uodm9pZCk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgdm9zX252X2dldEJ1ZmZlciAtIAorICBccGFyYW0gcEJ1ZmZlciAgLSB0byByZXR1cm4gdGhlIGJ1ZmZlciBhZGRyZXNzCisgICAgICAgICAgICBwTnZCaXRtYXAgLSBOdiBCaXQgbWFwCisgICAgICAgICAgICBwU2l6ZSAgICAgLSBidWZmZXIgc2l6ZS4KKyAgXHJldHVybiBzdGF0dXMgb2YgdGhlIE5WIHJlYWQgb3BlcmF0aW9uCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X2dldE5WQnVmZmVyKHZfVk9JRF90ICoqcE52QnVmZmVyICx2X1NJWkVfdCAqcFNpemUpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHZvc19udl9zZXRSZWdEb21haW4gLSAKKyAgXHBhcmFtIGNsaWVudEN0eHQgIC0gQ2xpZW50IENvbnRleHQsIE5vdCB1c2VkIGZvciBQUklNQQorICAgICAgICAgICAgICByZWdJZCAgLSBSZWd1bGF0b3J5IERvbWFpbiBJRAorICBccmV0dXJuIHN0YXR1cyBzZXQgUkVHIGRvbWFpbiBvcGVyYXRpb24KKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbnZfc2V0UmVnRG9tYWluKHZvaWQgKiBjbGllbnRDdHh0LCB2X1JFR0RPTUFJTl90IHJlZ0lkKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiB2b3NfbnZfZ2V0Q2hhbm5lbEVuYWJsZWRTdGF0ZSAtIAorICBccGFyYW0gcmZDaGFubmVsICAtIGlucHV0IGNoYW5uZWwgbnVtYmVyIHRvIGtub3cgZW5hYmxlZCBzdGF0ZQorICBccmV0dXJuIGVOVkNoYW5uZWxFbmFibGVkVHlwZSBlbmFibGVkIHN0YXRlIGZvciBjaGFubmVsCisgICAgICAgICAgICAgKiBlbmFibGVkCisgICAgICAgICAgICAgKiBkaXNhYmxlZAorICAgICAgICAgICAgICogREZTCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZU5WQ2hhbm5lbEVuYWJsZWRUeXBlIHZvc19udl9nZXRDaGFubmVsRW5hYmxlZFN0YXRlCisoCisgICB2X1UzMl90ICAgIHJmQ2hhbm5lbAorKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworI2VuZGlmIC8vIF9fVk9TX05WSVRFTV9ICmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL3Zvc19wYWNrX2FsaWduLmggYi9DT1JFL1ZPU1MvaW5jL3Zvc19wYWNrX2FsaWduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkY2ViNgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVk9TUy9pbmMvdm9zX3BhY2tfYWxpZ24uaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19WT1NfUEFDS19BTElHTl9IICkKKyNkZWZpbmUgX19WT1NfUEFDS19BTElHTl9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB2b3NfcGFja19hbGlnbi5oCisgIAorICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpZXMgKHZPUykgcGFjayBhbmQgYWxpZ24gcHJpbWl0aXZlcworICAgICAgICAgICAgICAgCisgICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWVhbnMgb2YgcGFja2luZyBhbmQgYWxpZ25pbmcKKyAgIGRhdGEgc3RydWN0dXJlcworICAKKyAgIENvcHlyaWdodCAyMDA5IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgCisgIFBsYWNlIHRoZSBtYWNybyBWT1NfUEFDS19TVEFSVCBhYm92ZSBhIHN0cnVjdHVyZSBkZWNsYXJhdGlvbiB0byBwYWNrLiBXZSAKKyAgYXJlIG5vdCBnb2luZyB0byBhbGxvdyBtb2RpZnlpbmcgdGhlIHBhY2sgc2l6ZSBiZWNhdXNlIHBhY2sgc2l6ZSBjYW5ub3QgYmUgCisgIHNwZWNpZmllZCBpbiBBTVNTIGFuZCBHTlUuIFBsYWNlIHRoZSBtYWNybyBWT1NfUEFDS19FTkQgYmVsb3cgYSBzdHJ1Y3R1cmUgCisgIGRlY2xhcmF0aW9uIHRvIHN0b3AgdGhlIHBhY2suIFRoaXMgcmVxdWlyZW1lbnQgaXMgbmVjZXNzaXRhdGVkIGJ5IFdpbmRvd3MKKyAgd2hpY2ggbmVlZCBwcmFnbWEgYmFzZWQgcHJvbG9nIGFuZCBlcGlsb2cuCisKKyAgUGFjay1zaXplID4gMS1ieXRlIGlzIG5vdCBzdXBwb3J0ZWQgc2luY2UgZ2NjIGFuZCBhcm0gZG8gbm90IHN1cHBvcnQgdGhhdC4KKyAgCisgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMKKyAgCisgIDEuIFBhY2stc2l6ZSAxLWJ5dGUgZm9vX3QgYWNyb3NzIGFsbCBwbGF0Zm9ybXMgIAorICAKKyAgVk9TX1BBQ0tfU1RBUlQKKyAgdHlwZWRlZiBWT1NfUEFDS19QUkUgc3RydWN0IGZvb19zIHsgLi4uIH0gVk9TX1BBQ0tfUE9TVCBmb29fdDsgCisgIFZPU19QQUNLX0VORAorICAKKyAgMi4gMi1ieXRlIGFsaWdubWVudCBmb3IgZm9vX3QgYWNyb3NzIGFsbCBwbGF0Zm9ybXMKKyAgCisgIHR5cGVkZWYgVk9TX0FMSUdOX1BSRSgyKSBzdHJ1Y3QgZm9vX3MgeyAuLi4gfSBWT1NfQUxJR05fUE9TVCgyKSBmb29fdDsgCisKKyAgMy4gUGFjay1zaXplIDEtYnl0ZSBhbmQgMi1ieXRlIGFsaWdubWVudCBmb3IgZm9vX3QgYWNyb3NzIGFsbCBwbGF0Zm9ybXMKKworICBWT1NfUEFDS19TVEFSVAorICB0eXBlZGVmIFZPU19QQUNLX1BSRSBWT1NfQUxJR05fUFJFKDIpIHN0cnVjdCBmb29fcyB7IC4uLiB9IFZPU19BTElHTl9QT1NUKDIpIFZPU19QQUNLX1BPU1QgZm9vX3Q7IAorICBWT1NfUEFDS19FTkQKKyAgCisqLworCisjaWYgZGVmaW5lZCBfX0dOVUNfXworCisgICNkZWZpbmUgVk9TX1BBQ0tfU1RBUlQgCisgICNkZWZpbmUgVk9TX1BBQ0tfRU5EIAorCisgICNkZWZpbmUgVk9TX1BBQ0tfUFJFIAorICAjZGVmaW5lIFZPU19QQUNLX1BPU1QgIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQorCisgICNkZWZpbmUgVk9TX0FMSUdOX1BSRShfX3ZhbHVlKQorICAjZGVmaW5lIFZPU19BTElHTl9QT1NUKF9fdmFsdWUpICBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhfX3ZhbHVlKSkpCisKKyNlbGlmIGRlZmluZWQgX19hcm0KKworICAjZGVmaW5lIFZPU19QQUNLX1NUQVJUIAorICAjZGVmaW5lIFZPU19QQUNLX0VORCAKKworICAjZGVmaW5lIFZPU19QQUNLX1BSRSAgX19wYWNrZWQKKyAgI2RlZmluZSBWT1NfUEFDS19QT1NUCisKKyAgI2RlZmluZSBWT1NfQUxJR05fUFJFKF9fdmFsdWUpICBfX2FsaWduKF9fdmFsdWUpCisgICNkZWZpbmUgVk9TX0FMSUdOX1BPU1QoX192YWx1ZSkKKworI2VsaWYgZGVmaW5lZCBfTVNDX1ZFUgorCisgICNkZWZpbmUgVk9TX1BBQ0tfU1RBUlQgIF9fcHJhZ21hIChwYWNrKHB1c2gsMSkpCisgICNkZWZpbmUgVk9TX1BBQ0tfRU5EICBfX3ByYWdtYSAocGFjayhwb3ApKQorCisgICNkZWZpbmUgVk9TX1BBQ0tfUFJFIAorICAjZGVmaW5lIFZPU19QQUNLX1BPU1QKKworICAjZGVmaW5lIFZPU19BTElHTl9QUkUoX192YWx1ZSkgIF9fZGVjbHNwZWMoYWxpZ24oX192YWx1ZSkpCisgICNkZWZpbmUgVk9TX0FMSUdOX1BPU1QoX192YWx1ZSkKKworI2Vsc2UKKworICAjZXJyb3IgVW5zdXBwb3J0ZWQgY29tcGlsZXIhISEKKworI2VuZGlmCisKKyNlbmRpZiAvLyBfX1ZPU1NfUEFDS19BTElHTl9ICmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL3Zvc19wYWNrZXQuaCBiL0NPUkUvVk9TUy9pbmMvdm9zX3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNWEwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL3Zvc19wYWNrZXQuaApAQCAtMCwwICsxLDEwOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fVk9TX1BLVF9IICkKKyNkZWZpbmUgX19WT1NfUEtUX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgICAgICAgIHZvc19wYWNrZXQuaAorICAKKyAgXGJyaWVmICAgICAgIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWNlcyAodk9TUykgbmV0d29yayBQYWNrZXQgQVBJcworICAgICAgICAgICAgICAgCisgICBOZXR3b3JrIFByb3RvY29sIHBhY2tldC9idWZmZXIgc3VwcG9ydCBpbnRlcmZhY2VzIAorICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHZvc190eXBlcy5oPgorI2luY2x1ZGUgPHZvc19zdGF0dXMuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCB2b3NfcGt0X3Q7Cit0eXBlZGVmIHN0cnVjdCB2b3NfcGt0X3Qgdm9zX3BrdF90OworCisKKy8vLyBkYXRhIHZlY3RvcgordHlwZWRlZiBzdHJ1Y3QKK3sgICAgICAgICAKKyAgIC8vLyBhZGRyZXNzIG9mIGRhdGEKKyAgIHZfVk9JRF90ICpwRGF0YTsKKyAgIAorICAgLy8vIG51bWJlciBvZiBieXRlcyBhdCBhZGRyZXNzCisgICB2X1UzMl90ICBudW1CeXRlczsKKyAgIAorfSB2b3NfcGt0X2RhdGFfdmVjdG9yX3Q7CisKKworCisvLy8gdm9zcyBQYWNrZXQgVHlwZXMKK3R5cGVkZWYgZW51bQoreworICAgLy8vIHZvc3MgUGFja2V0IGlzIHVzZWQgdG8gdHJhbnNtaXQgODAyLjExIE1hbmFnZW1lbnQgZnJhbWVzLgorICAgVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01ULAorICAgCisgICAvLy8gdm9zcyBQYWNrZXQgaXMgdXNlZCB0byB0cmFuc21pdCA4MDIuMTEgRGF0YSBmcmFtZXMuCisgICBWT1NfUEtUX1RZUEVfVFhfODAyXzExX0RBVEEsCisgICAKKyAgIC8vLyB2b3NzIFBhY2tldCBpcyB1c2VkIHRvIHRyYW5zbWl0IDgwMi4zIERhdGEgZnJhbWVzLgorICAgVk9TX1BLVF9UWVBFX1RYXzgwMl8zX0RBVEEsCisgICAKKyAgIC8vLyB2b3NzIFBhY2tldCBjb250YWlucyBSZWNlaXZlZCBkYXRhIG9mIGFuIHVua25vd24gZnJhbWUgdHlwZQorICAgVk9TX1BLVF9UWVBFX1JYX1JBVywKKworICAgLy8vIEludmFsaWQgc2VudGluZWwgdmFsdWUKKyAgIFZPU19QS1RfVFlQRV9NQVhJTVVNCisKK30gVk9TX1BLVF9UWVBFOworCisvLy8gdXNlciBJRHMuICAgVGhlc2UgSURzIGFyZSBuZWVkZWQgb24gdGhlIHZvc19wa3RfZ2V0L3NldF91c2VyX2RhdGFfcHRyKCkKKy8vLyB0byBpZGVudGlmeSB0aGUgdXNlciBhcmVhIGluIHRoZSB2b3NzIFBhY2tldC4KK3R5cGVkZWYgZW51bQoreworICAgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwgPTAsICAKKyAgIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgIAorICAgVk9TX1BLVF9VU0VSX0RBVEFfSURfV0RBLCAgIAorICAgVk9TX1BLVF9VU0VSX0RBVEFfSURfSERELAorICAgVk9TX1BLVF9VU0VSX0RBVEFfSURfQkFQLAorICAgVk9TX1BLVF9VU0VSX0RBVEFfSURfQlNMLAorCisgICBWT1NfUEtUX1VTRVJfREFUQV9JRF9NQVgKKyAgIAorfSBWT1NfUEtUX1VTRVJfREFUQV9JRDsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zcyBhc3luY2hyb25vdXMgZ2V0X3BhY2tldCBjYWxsYmFjayBmdW5jdGlvbgorCisgIFRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIHdoZW4gdm9zX3BrdF9nZXRfcGFja2V0KCkgY2Fubm90CisgIGdldCB0aGUgcmVxdWVzdGVkIHBhY2tldCBhbmQgdGhlIGNhbGxlciBzcGVjaWZpZWQgYSBjYWxsYmFjayB0byBiZSAKKyAgaW52b2tlZCB3aGVuIHBhY2tldHMgYXJlIGF2YWlsYWJsZS4gCisgIAorICBccGFyYW0gcFBhY2tldCAtIHRoZSBwYWNrZXQgb2J0YWluZWQgYnkgdm9zcyBmb3IgdGhlIGNhbGxlci4gCisgIAorICBccGFyYW0gdXNlckRhdGEgLSB0aGUgdXNlckRhdGEgZmllbGQgZ2l2ZW4gb24gdGhlIHZvc19wa3RfZ2V0X3BhY2tldCgpIAorICAgICAgICAgY2FsbAorICAKKyAgXHJldHVybgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIFZPU19TVEFUVVMgKCAqdm9zX3BrdF9nZXRfcGFja2V0X2NhbGxiYWNrICkoIHZvc19wa3RfdCAqcFBhY2tldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICp1c2VyRGF0YSApOworCisvKgorICogaW5jbHVkZSB0aGUgT1Mtc3BlY2lmaWMgcGFja2V0IGFic3RyYWN0aW9uCisgKiB3ZSBpbmNsdWRlIGl0IGhlcmUgc2luY2UgdGhlIGFic3RyYWN0aW9uIHByb2JhYmx5IG5lZWRzIHRvIGFjY2VzcyB0aGUKKyAqIGdlbmVyaWMgdHlwZXMgZGVmaW5lZCBhYm92ZQorICovCisjaW5jbHVkZSAiaV92b3NfcGFja2V0LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19wa3RfZ2V0X3BhY2tldCgpIC0gR2V0IGEgdm9zcyBQYWNrZXRzCisKKyAgR2V0cyBhIHZvc3MgUGFja2V0cyBmcm9tIGFuIGludGVybmFsbHkgbWFuYWdlZCBwYWNrZXQgcG9vbC4gCisgIAorICBccGFyYW0gcHBQYWNrZXQgLSBwb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIHRoZSB2b3NzIFBhY2tldCBwb2ludGVyIGlzIAorICAgICAgICAgICAgICAgICAgICByZXR1cm5lZC4gIElmIG11bHRpcGxlIHBhY2tldHMgYXJlIHJlcXVlc3RlZCwgdGhleSAKKyAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjaGFpbmVkIG9udG8gdGhpcyBmaXJzdCBwYWNrZXQuICAKKyAgICAgICAgICAgICAgICAgICAgCisgIFxwYXJhbSBwa3RUeXBlIC0gdGhlIHBhY2tldCB0eXBlIHRvIGJlIHJldHJlaXZlZC4gIFZhbGlkIHBhY2tldCB0eXBlcyBhcmU6CisgICAgIDx1bD4KKyAgICAgICA8bGk+IFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCAtIHZvc3MgcGFja2V0IGlzIGZvciBUcmFuc21pdHRpbmcgODAyLjExIAorICAgICAgICAgICAgTWFuYWdlbWVudCBmcmFtZXMuCisgICAgIAorICAgICAgIDxsaT4gVk9TX1BLVF9UWVBFX1JYX1JBVyAtIHZvc3MgUGFja2V0IGNvbnRhaW5zIGEgYnVmZmVyIGZvciBSZWNlaXZpbmcgCisgICAgICAgICAgICByYXcgZnJhbWVzIG9mIHVua25vd24gdHlwZS4gIAorICAgICA8L3VsPgorICAgICAKKyAgXHBhcmFtIGRhdGFTaXplIC0gdGhlIERhdGEgc2l6ZSBuZWVkZWQgaW4gdGhlIHZvc3MgUGFja2V0LgorICAKKyAgXHBhcmFtIG51bVBhY2tldHMgLSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcmVxdWVzdGVkLiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgXHBhcmFtIHplcm9CdWZmZXIgLSBwYXJhbWV0ZXIgdGhhdCB0ZWxscyB0aGUgQVBJIHRvIHplcm8gdGhlIGRhdGEgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyB2b3NzIFBhY2tldC4gIAorICAgICA8dWw+ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIDxsaT4gVk9TX1RSVUUgLSB0aGUgQVBJIHdpbGwgemVybyBvdXQgdGhlIGVudGlyZSBkYXRhIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICA8bGk+IFZPU19GQUxTRSAtIHRoZSBBUEkgd2lsbCBub3QgemVybyBvdXQgdGhlIGRhdGEgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBcbm90ZSBJZiBlbm91Z2ggcm9vbSBmb3IgaGVhZGVycyB0byB0cmFuc21pdCBvciByZWNlaXZlIHRoZSBwYWNrZXQgaXMgbm90IAorICAgICAgICBhdmFpbGFibGUsIHRoaXMgQVBJIHdpbGwgZmFpbC4KKyAgICAgICAgCisgIFxwYXJhbSBjYWxsYmFjayAtIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24sIGlmIHByb3ZpZGVkLCBpcyBpbnZva2VkIGluIHRoZSAKKyAgICAgICAgIGNhc2Ugd2hlbiByZXNvdXJjZXMgYXJlIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwgdG8gCisgICAgICAgICBnZXQgcGFja2V0cy4gIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgaW52b2tlZCB3aGVuIHBhY2tldHMgYXJlIAorICAgICAgICAgYXZhaWxhYmxlLiAgCisgICAgICAgICAgICAgICAgICAgIAorICBccGFyYW0gdXNlckRhdGEgLSBUaGlzIHVzZXIgZGF0YSBpcyBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGluIHRoZSAKKyAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uLCBpZiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBBUEkgd2FzIGFibGUgdG8gZ2V0IGEgdm9zX3BhY2tldCBmb3IgdGhlCisgICAgICAgICAgcmVxdWVzdGVkIHR5cGUuICAqcHBQYWNrZXQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBwYWNrZXQuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gcGt0VHlwZSBpcyBub3QgYSB2YWxpZCBwYWNrZXQgdHlwZS4gIFRoaXMgCisgICAgICAgICAgQVBJIG9ubHkgc3VwcG9ydHMgZ2V0dGluZyB2b3MgcGFja2V0cyBmb3IgODAyXzExX01HTVQgYW5kIAorICAgICAgICAgIFJYX1JBVyBwYWNrZXQgdHlwZXMuICBUaGlzIHN0YXR1cyBpcyBhbHNvIHJldHVybmVkIGlmIHRoZSAKKyAgICAgICAgICBudW1QYWNrZXRzIG9yIGRhdGFTaXplIGFyZSBpbnZhbGlkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgLSB1bmFibGUgdG8gZ2V0IHJlc291cmNlcyBuZWVkZWQgdG8gZ2V0CisgICAgICAgICAgYSB2b3MgcGFja2V0LiAgSWYgYSBjYWxsYmFjayBmdW5jdGlvbiBpcyBzcGVjaWZpZWQgYW5kIHRoaXMgCisgICAgICAgICAgc3RhdHVzIGlzIHJldHVybmVkIGZyb20gdGhlIEFQSSwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIAorICAgICAgICAgIHdoZW4gcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgdG8gZnVsZmlsbCB0aGUgb3JpZ2luYWwgcmVxdWVzdC4KKyAgICAgICAgICAKKyAgICAgICAgICBOb3RlIHRoYXQgdGhlIGxvdyByZXNvdXJjZXMgY29uZGl0aW9uIGlzIGluZGljYXRlZCB0byB0aGUgY2FsbGVyCisgICAgICAgICAgYnkgcmV0dXJuaW5nIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMuICBUaGlzIHN0YXR1cyBpcyB0aGUgb25seSAKKyAgICAgICAgICBub24tc3VjY2VzcyBzdGF0dXMgdGhhdCBpbmRpY2F0ZXMgdG8gdGhlIGNhbGxlciB0aGF0IHRoZSBjYWxsYmFjaworICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4gcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUuICBBbGwgb3RoZXIgc3RhdHVzCisgICAgICAgICAgaW5kaWNhdGUgZmFpbHVyZXMgdGhhdCBhcmUgbm90IHJlY292ZXJhYmxlIGFuZCB0aGUgJ2NhbGxiYWNrJyAKKyAgICAgICAgICB3aWxsIG5vdCBiZSBjYWxsZWQuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIFRoZSBBUEkgcmV0dXJucyB0aGlzIHN0YXR1cyB3aGVuIHVuYWJsZSAKKyAgICAgICAgICB0byBnZXQgYSBwYWNrZXQgZnJvbSB0aGUgcGFja2V0IHBvb2wgYmVjYXVzZSB0aGUgcG9vbAorICAgICAgICAgIGlzIGRlcGxldGVkIGFuZCB0aGUgY2FsbGVyIGRpZCBub3Qgc3BlY2lmeSBhIGxvdyByZXNvdXJjZSBjYWxsYmFjay4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIFRoaXMgc3RhdHVzIGlzIHJldHVybmVkIHdoZW4gdGhlIFZPUworICAgICAgICAgIHBhY2tldCBwb29sIGlzIGluIGEgJ2xvdyByZXNvdXJjZScgY29uZGl0aW9uIGFuZCBjYW5ub3QgCisgICAgICAgICAgYWNjb21vZGF0ZSBhbnkgbW9yZSBjYWxscyB0byByZXRyaWV2ZSBwYWNrZXRzIGZyb20gdGhhdCAKKyAgICAgICAgICBwb29sLiAgIE5vdGUgdGhpcyBpcyBhIEZBSUxVUkUgYW5kIHRoZSAnbG93IHJlc291cmNlJyBjYWxsYmFjaworICAgICAgICAgIHdpbGwgKm5vdCogYmUgY2FsbGVkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHBwUGFja2V0IGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZCBwb2ludGVyLiAgICAgICAgICAKKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCitWT1NfU1RBVFVTIHZvc19wa3RfZ2V0X3BhY2tldCggdm9zX3BrdF90ICoqcHBQYWNrZXQsIFZPU19QS1RfVFlQRSBwa3RUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1NJWkVfdCBkYXRhU2l6ZSwgdl9TSVpFX3QgbnVtUGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCB6ZXJvQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfZ2V0X3BhY2tldF9jYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqdXNlckRhdGEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X3dyYXBfZGF0YV9wYWNrZXRzKCkgLSBXcmFwIGFuIE9TIHByb3ZpZGVkIGRhdGEgcGFja2V0IGluIGEKKyAgICAgICAgIHZvcyBwYWNrZXQuCisKKyAgVGFrZXMgYXMgaW5wdXQgYW4gT1MgcHJvdmlkZWQgZGF0YSBwYWNrZXQgYW5kICd3cmFwcycgdGhhdCBwYWNrZXQgaW4gYSAKKyAgdm9zX3BhY2tldCwgcmV0dXJuaW5nIHRoZSB2b3NfcGFja2V0IHRvIHRoZSBjYWxsZXIuICAKKyAgCisgIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIEhERCB0byB3cmFwIFR4IGRhdGEgcGFja2V0cworICBmcm9tIHRoZSBPUyBpbnRvIHZvc19wYWNrZXRzIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gVEwgZm9yIHRyYW5zbWlzc2lvbi4KKyAgICAKKyAgXHBhcmFtIHBwUGFja2V0IC0gcG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSB0aGUgdm9zcyBQYWNrZXQgcG9pbnRlciBpcyAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQuICBJZiBtdWx0aXBsZSBwYWNrZXRzIGFyZSByZXF1ZXN0ZWQsIHRoZXkgCisgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgY2hhaW5lZCBvbnRvIHRoaXMgZmlyc3QgcGFja2V0LiAgCisgICAgICAgICAgICAgICAgICAgIAorICBccGFyYW0gcGt0VHlwZSAtIHRoZSBwYWNrZXQgdHlwZSB0byBiZSByZXRyZWl2ZWQuICBWYWxpZCBwYWNrZXQgdHlwZXMgYXJlOgorICAgICA8dWw+CisgICAgICAgPGxpPiBWT1NfUEtUX1RZUEVfODAyXzNfREFUQSAtIHZvc3MgcGFja2V0IGlzIGZvciBUcmFuc21pdHRpbmcgODAyLjMgCisgICAgICAgICAgICBkYXRhIGZyYW1lcy4KKyAgICAgCisgICAgICAgPGxpPiBWT1NfUEtUX1RZUEVfODAyXzExX0RBVEEgLSB2b3NzIFBhY2tldCBpcyBmb3IgVHJhbnNtaXR0aW5nIDgwMi4xMQorICAgICAgICAgICAgZGF0YSBmcmFtZXMuICAKKyAgICAgPC91bD4KKyAgICAgCisgIFxwYXJhbSBwT1NQYWNrZXQgLSBhIHBvaW50ZXIgdG8gdGhlIFRyYW5zbWl0IHBhY2tldCBwcm92aWRlZCBieSB0aGUgT1MuICBUaGlzCisgICAgICAgICBPUyBwcm92aWRlZCBwYWNrZXQgd2lsbCBiZSB3cmFwcGVkIGludG8gYSB2b3NfcGFja2V0X3QuICBOb3RlIHRoaXMgCisgICAgICAgICBPUyBwYWNrZXQgcG9pbnRlciBjYW4gYmUgTlVMTC4gIFRoZSBPUyBwYWNrZXQgcG9pbnRlciBjYW4gYmUgaW5zZXJ0ZWQKKyAgICAgICAgIGludG8gYSBWT1MgcGFja2V0IG9mIHR5cGUgVk9TX1BLVF9UWVBFXzgwMl8zX0RBVEEgb3IgCisgICAgICAgICBWT1NfUEtUX1RZUEVfODAyXzExX0RBVEEgdGhyb3VnaCB2b3NfcGt0X3NldF9vc19wYWNrZXQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgXG5vdGUgSWYgZW5vdWdoIHJvb20gZm9yIGhlYWRlcnMgdG8gdHJhbnNtaXQgb3IgcmVjZWl2ZSB0aGUgcGFja2V0IGlzIG5vdCAKKyAgICAgICAgYXZhaWxhYmxlLCB0aGlzIEFQSSB3aWxsIGZhaWwuCisgICAgICAgIAorICBccGFyYW0gY2FsbGJhY2sgLSBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uLCBpZiBwcm92aWRlZCwgaXMgaW52b2tlZCBpbiB0aGUgCisgICAgICAgICBjYXNlIHdoZXJlIHBhY2tldHMgYXJlIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwgdG8gCisgICAgICAgICByZXR1cm4gdGhlIHBhY2tldHMgdG8gdGhlIGNhbGxlciAoYSAnbG93IHJlc291cmNlJyBjb25kaXRpb24pLgorICAgICAgICAgCisgICAgICAgICBXaGVuIHBhY2tldHMgYmVjb21lIGF2YWlsYWJsZSwgdGhlIGNhbGxiYWNrIGNhbGxiYWNrIGZ1bmN0aW9uIGlzCisgICAgICAgICBpbnZva2VkIHRvIHJldHVybiBhIFZPUyBwYWNrZXQgdG8gdGhlIGNhbGxlci4gIE5vdGUgdGhhdCB0aGUgCisgICAgICAgICBPUyBQYWNrZXQgaXMgKm5vdCogaW5zZXJ0ZWQgaW50byB0aGUgVk9TIHBhY2tldCB3aGVuIGl0IGlzIHJldHVybmVkCisgICAgICAgICB0byB0aGUgbG93IHJlc291cmNlIGNhbGxiYWNrLiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBpbnNlcnQKKyAgICAgICAgIHRoZSBPUyBwYWNrZXQgaW50byB0aGUgVk9TIHBhY2tldCBieSBjYWxsaW5nIHZvc19wa3Rfc2V0X29zX3BhY2tldCgpCisgICAgICAgICAgICAgICAgICAgIAorICBccGFyYW0gdXNlckRhdGEgLSBUaGlzIHVzZXIgZGF0YSBpcyBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGluIHRoZSAKKyAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uLCBpZiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBBUEkgd2FzIGFibGUgdG8gZ2V0IGEgdm9zX3BhY2tldCBmb3IgdGhlCisgICAgICAgICAgcmVxdWVzdGVkIHR5cGUuICAqcHBQYWNrZXQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBwYWNrZXQuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gcGt0VHlwZSBpcyBub3QgYSB2YWxpZCBwYWNrZXQgdHlwZS4gIFRoaXMgCisgICAgICAgICAgQVBJIG9ubHkgc3VwcG9ydHMgZ2V0dGluZyB2b3MgcGFja2V0cyBmb3IgODAyXzExX01HTVQgYW5kIAorICAgICAgICAgIFJYX1JBVyBwYWNrZXQgdHlwZXMuICAgICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX1JFU09VUkNFUyAtIHVuYWJsZSB0byBnZXQgcmVzb3VyY2VzIG5lZWRlZCB0byBnZXQKKyAgICAgICAgICBhIHZvcyBwYWNrZXQuICBJZiBhIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCBhbmQgdGhpcyAKKyAgICAgICAgICBzdGF0dXMgaXMgcmV0dXJuZWQgZnJvbSB0aGUgQVBJLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgCisgICAgICAgICAgd2hlbiByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSB0byBmdWxmaWxsIHRoZSBvcmlnaW5hbCByZXF1ZXN0LgorICAgICAgICAgIAorICAgICAgICAgIE5vdGUgdGhhdCB0aGUgbG93IHJlc291cmNlcyBjb25kaXRpb24gaXMgaW5kaWNhdGVkIHRvIHRoZSBjYWxsZXIKKyAgICAgICAgICBieSByZXR1cm5pbmcgVk9TX1NUQVRVU19FX1JFU09VUkNFUy4gIFRoaXMgc3RhdHVzIGlzIHRoZSBvbmx5IAorICAgICAgICAgIG5vbi1zdWNjZXNzIHN0YXR1cyB0aGF0IGluZGljYXRlcyB0byB0aGUgY2FsbGVyIHRoYXQgdGhlIGNhbGxiYWNrCisgICAgICAgICAgd2lsbCBiZSBjYWxsZWQgd2hlbiByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZS4gIEFsbCBvdGhlciBzdGF0dXMKKyAgICAgICAgICBpbmRpY2F0ZSBmYWlsdXJlcyB0aGF0IGFyZSBub3QgcmVjb3ZlcmFibGUgYW5kIHRoZSAnY2FsbGJhY2snIAorICAgICAgICAgIHdpbGwgbm90IGJlIGNhbGxlZC4gICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBUaGUgQVBJIHJldHVybnMgdGhpcyBzdGF0dXMgd2hlbiB1bmFibGUgCisgICAgICAgICAgdG8gZ2V0IGEgcGFja2V0IGZyb20gdGhlIHBhY2tldCBwb29sIGJlY2F1c2UgdGhlIHBvb2wKKyAgICAgICAgICBpcyBkZXBsZXRlZCBhbmQgdGhlIGNhbGxlciBkaWQgbm90IHNwZWNpZnkgYSBsb3cgcmVzb3VyY2UgY2FsbGJhY2suCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBUaGlzIHN0YXR1cyBpcyByZXR1cm5lZCB3aGVuIHRoZSBWT1MKKyAgICAgICAgICBwYWNrZXQgcG9vbCBpcyBpbiBhICdsb3cgcmVzb3VyY2UnIGNvbmRpdGlvbiBhbmQgY2Fubm90IAorICAgICAgICAgIGFjY29tb2RhdGUgYW55IG1vcmUgY2FsbHMgdG8gcmV0cmlldmUgcGFja2V0cyBmcm9tIHRoYXQgCisgICAgICAgICAgcG9vbC4gICBOb3RlIHRoaXMgaXMgYSBGQUlMVVJFIGFuZCB0aGUgJ2xvdyByZXNvdXJjZScgY2FsbGJhY2sKKyAgICAgICAgICB3aWxsICpub3QqIGJlIGNhbGxlZC4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgLSBwcFBhY2tldCBvciBwT1NQYWNrZXQgZG8gbm90IHNwZWNpZnkgdmFsaWQKKyAgICAgICAgICBwb2ludGVycy4gICAgICAgICAgCisgICAgCisgIFxzYSB2b3NfcGt0X3NldF9vc19wYWNrZXQoKQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorVk9TX1NUQVRVUyB2b3NfcGt0X3dyYXBfZGF0YV9wYWNrZXQoIHZvc19wa3RfdCAqKnBwUGFja2V0LCBWT1NfUEtUX1RZUEUgcGt0VHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKnBPU1BhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfcGt0X2dldF9wYWNrZXRfY2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKnVzZXJEYXRhICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X3NldF9vc19wYWNrZXQoKSAtIHNldCB0aGUgT1MgcGFja2V0IGluIGEgVk9TIGRhdGEgcGFja2V0CisKKyAgVGhpcyBBUEkgaW5zZXJ0cyBhbiBPUyBwYWNrZXQgaW50byBhIHByZXZpb3VzbHkgcmV0cmVpdmVkIFZPUyBwYWNrZXQuCisgIFRoaXMgQVBJIG9ubHkgYXBwbGllcyB0byBWT1MgcGFja2V0cyBvZiB0eXBlIFZPU19QS1RfVFlQRV84MDJfM19EQVRBIG9yCisgIFZPU19QS1RfVFlQRV84MDJfMTFfREFUQS4gIAorICAKKyAgVGhlcmUgYXJlIGNhc2VzIHdoZXJlIGEgdXNlciB3aWxsIG5lZWQgdG8gZ2V0IGEgVk9TIGRhdGEgcGFja2V0IHdpdGhvdXQgCisgIGhhdmluZyB0aGUgT1MgcGFja2V0IHRvIGluc2VydC93cmFwIGludG8gdGhlIGRhdGEgcGFja2V0LiBUaGlzIGNvdWxkIGhhcHBlbgorICBpZiB0aGUgdXNlciBjYWxscyB2b3NfcGt0X3dyYXBfZGF0YV9wYWNrZXQoKSB3aXRob3V0IHRoZSBPUyBwYWNrZXQuICAKKyAgCisgIEFsc28sIHdoZW4gdGhlIHVzZXIgaGl0IGEgJ2xvdyByZXNvdXJjZScgc2l0dWF0aW9uIGZvciBkYXRhIHBhY2tldHMsIHRoZSAKKyAgbG93IHJlc291cmNlIGNhbGxiYWNrIGlzIGdvaW5nIHRvIHJldHVybiBhIFZPUyBwYWNrZXQgd2l0aG91dCBhbiBPUyBwYWNrZXQKKyAgYXR0YWNoZWQgdG8gaXQuICBUaGUgY2FsbGVyIHdobyBnZXRzIHRoZSBwYWNrZXQgdGhyb3VnaCB0aGUgbG93IHJlc291cmNlCisgIGNhbGxiYWNrIHVzZXMgdGhpcyBBUEkgdG8gaW5zZXJ0IGFuIE9TIHBhY2tldCBpbnRvIHRoZSBWT1MgcGFja2V0IHRoYXQgCisgIHdhcyByZXR1cm5lZCB0aHJvdWdoIHRoZSBsb3cgcmVzb3VyY2UgY2FsbGJhY2suCisgIAorICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCB0byBpbnNlcnQgdGhlIE9TIHBhY2tldCBpbnRvLgorICAgICAgICAgCisgIFxwYXJhbSBwT1NQYWNrZXQgLSBhIHBvaW50ZXIgdG8gdGhlIFRyYW5zbWl0IHBhY2tldCBwcm92aWRlZCBieSB0aGUgT1MuICBUaGlzCisgICAgICAgICBPUyBwcm92aWRlZCBwYWNrZXQgd2lsbCBiZSB3cmFwcGVkIGludG8gYSB2b3NfcGFja2V0X3QuICBOb3RlIHRoaXMgCisgICAgICAgICBPUyBwYWNrZXQgcG9pbnRlciBjYW4gYmUgTlVMTC4gIFRoZSBPUyBwYWNrZXQgcG9pbnRlciBjYW4gYmUgaW5zZXJ0ZWQKKyAgICAgICAgIGludG8gYSBWT1MgcGFja2V0IG9mIHR5cGUgVk9TX1BLVF9UWVBFXzgwMl8zX0RBVEEgb3IgCisgICAgICAgICBWT1NfUEtUX1RZUEVfODAyXzExX0RBVEEgdGhyb3VnaCB2b3NfcGt0X3NldF9vc19wYWNrZXQoKS4KKyAgICAgICAgIAorICAgICAgICAgQ2FsbGVyIGJld2FyZS4gIElmIHRoZXJlIGlzIGEgdmFsaWQgT1MgcGFja2V0IHdyYXBwZWQgaW50byB0aGlzIAorICAgICAgICAgVk9TIHBhY2tldCBhbHJlYWR5LCB0aGlzIEFQSSB3aWxsIGJsaW5kbHkgb3ZlcndyaXRlIHRoZSBPUyBwYWNrZXQKKyAgICAgICAgIHdpdGggdGhlIG5ldyBvbmUgc3BlY2lmaWVkIG9uIHRoaXMgQVBJIGNhbGwuICBJZiB5b3UgbmVlZCB0byBkZXRlcm1pbmUKKyAgICAgICAgIG9yIHJldHJlaXZlIHRoZSBjdXJyZW50IE9TIHBhY2tldCBmcm9tIGEgVk9TIHBhY2tldCwgY2FsbCAKKyAgICAgICAgIHZvc19wa3RfZ2V0X29zX3BhY2tldCgpIGZpcnN0LgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgQVBJIHdhcyBhYmxlIHRvIGluc2VydCB0aGUgT1MgcGFja2V0IGludG8KKyAgICAgICAgICB0aGUgdm9zX3BhY2tldC4gIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBwa3RUeXBlIGlzIG5vdCBhIHZhbGlkIHBhY2tldCB0eXBlLiAgVGhpcyAKKyAgICAgICAgICBBUEkgb25seSBzdXBwb3J0cyBnZXR0aW5nIHZvcyBwYWNrZXRzIG9mIHR5cGUgCisgICAgICAgICAgVk9TX1BLVF9UWVBFXzgwMl8zX0RBVEEgb3IgVk9TX1BLVF9UWVBFXzgwMl8xMV9EQVRBLiAgICAgICAgICAgIAorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHBQYWNrZXQgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbGlkIHBvaW50ZXIuICAgICAgICAgIAorICAgIAorICBcc2Egdm9zX3BrdF9nZXRfb3NfcGFja2V0KCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3NldF9vc19wYWNrZXQoIHZvc19wa3RfdCAqcFBhY2tldCwgdl9WT0lEX3QgKnBPU1BhY2tldCApOworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X2dldF9vc19wYWNrZXQoKSAtIGdldCB0aGUgT1MgcGFja2V0IGluIGEgVk9TIGRhdGEgcGFja2V0CisKKyAgVGhpcyBBUEkgcmV0dXJucyB0aGUgT1MgcGFja2V0IHRoYXQgaXMgaW5zZXJ0ZWQgaW4gYSBWT1MgcGFja2V0LgorICBUaGlzIEFQSSBvbmx5IGFwcGxpZXMgdG8gVk9TIHBhY2tldHMgb2YgdHlwZSBWT1NfUEtUX1RZUEVfODAyXzNfREFUQSBvcgorICBWT1NfUEtUX1RZUEVfODAyXzExX0RBVEEuICAKKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIHJldHVybiB0aGUgT1MgcGFja2V0IGZyb20uCisgICAgICAgICAKKyAgXHBhcmFtIHBwT1NQYWNrZXQgLSBhIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBPUyBwYWNrZXQgcG9pbnRlciAKKyAgICAgICAgIHJldHJlaXZlZCBmcm9tIHRoZSBWT1MgcGFja2V0IHdpbGwgYmUgcmV0dXJuZWQuICBOb3RlIHRoaXMgT1MgcGFja2V0CisgICAgICAgICBwb2ludGVyIGNhbiBiZSBOVUxMLCBtZWFuaW5nIHRoZXJlIGlzIG5vIE9TIHBhY2tldCBhdHRhY2hlZCB0byB0aGlzCisgICAgICAgICBWT1MgZGF0YSBwYWNrZXQuCisgICAgICAgICAKKyAgXHBhcmFtIGNsZWFyT1NQYWNrZXQgLSBhIGJvb2xlYW4gdmFsdWUgdGhhdCB0ZWxscyB0aGUgQVBJIHRvIGNsZWFyIG91dCB0aGUKKyAgICAgICAgIE9TIHBhY2tldCBwb2ludGVyIGZyb20gdGhlIFZPUyBwYWNrZXQuICBTZXR0aW5nIHRoaXMgdG8gJ3RydWUnIHdpbGwKKyAgICAgICAgIGVzc2VudGlhbGx5IHJlbW92ZSB0aGUgT1MgcGFja2V0IGZyb20gdGhlIFZPUyBwYWNrZXQuICAnZmFsc2UnIG1lYW5zCisgICAgICAgICB0aGUgT1MgcGFja2V0IHJlbWFpbnMgY2hhaW5lZCB0byB0aGUgVk9TIHBhY2tldC4gIEluIGVpdGhlciBjYXNlLCAKKyAgICAgICAgIHRoZSBPUyBwYWNrZXQgcG9pbnRlciBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICAgICAgICAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGhlIEFQSSB3YXMgYWJsZSB0byByZXRyZWl2ZSB0aGUgT1MgcGFja2V0IAorICAgICAgICAgIHBvaW50ZXIgZnJvbSB0aGUgVk9TIHBhY2tldCBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIgaW4gCisgICAgICAgICAgKnBwT3NQYWNrZXQgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBwa3RUeXBlIGlzIG5vdCBhIHZhbGlkIHBhY2tldCB0eXBlLiAgVGhpcyAKKyAgICAgICAgICBBUEkgb25seSBzdXBwb3J0cyBnZXR0aW5nIHZvcyBwYWNrZXRzIG9mIHR5cGUgCisgICAgICAgICAgVk9TX1BLVF9UWVBFXzgwMl8zX0RBVEEgb3IgVk9TX1BLVF9UWVBFXzgwMl8xMV9EQVRBLiAgICAgICAgICAgIAorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHBQYWNrZXQgb3IgcHBPc1BhY2tldCBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsaWQKKyAgICAgICAgICBwb2ludGVycy4KKyAgICAKKyAgXHNhIHZvc19wa3Rfc2V0X29zX3BhY2tldCgpLCB2b3NfcGt0X3dyYXBfZGF0YV9wYWNrZXQoKSwgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X2dldF9vc19wYWNrZXQoIHZvc19wa3RfdCAqcFBhY2tldCwgdl9WT0lEX3QgKipwcE9TUGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCBjbGVhck9TUGFja2V0ICk7CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCkgLSByZXR1cm4gYSBwb2ludGVyIHRvIHVzZXIgZGF0YSBhcmVhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBhIHZvc3MgUGFja2V0CisKKyAgVGhpcyBBUEkgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzcGVjaWZpZWQgdXNlciBEYXRhIGFyZWEgaW4gdGhlIHZvc3MgCisgIFBhY2tldC4gIFVzZXIgZGF0YSBhcmVhcyBhcmUgdW5pcXVhIGFyZWFzIG9mIHRoZSB2b3NzIFBhY2tldCB0aGF0IGNhbiAKKyAgYmUgdXNlZCBieSBzcGVjaWZpYyBjb21wb25lbnRzIHRvIHN0b3JlIHByaXZhdGUgZGF0YS4gIFRoZXNlIGFyZWFzIGFyZSAKKyAgaWRlbnRpZmllZCBieSBhIHVzZXIgIklEIiBhbmQgc2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgYnkgdGhlIGNvbXBvbmVudAorICBzcGVjaWZpZWQuCisgIAorICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCB0byByZXRyZWl2ZSB0aGUgdXNlciBkYXRhIHBvaW50ZXIgZnJvbS4KKyAgCisgIFxwYXJhbSB1c2VySUQgLSB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgZGF0YSBhcmVhIGluIHRoZSB2b3NzIFBhY2tldAorICAgICAgICAgICAgICAgICAgdG8gZ2V0LgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBVc2VyIElEcyBhbmQgdXNlciBkYXRhIGFyZWFzIGluIHRoZSB2b3NzIFBhY2tldCBhcmUgCisgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZm9yOgorICAgICAgICAgICAgICAgICAgLSBUcmFuc3BvcnQgTGF5ZXIgKFRMKQorICAgICAgICAgICAgICAgICAgLSBCdXMgQWJzdHJhY3Rpb24gTGF5ZXIgKEJBTCkKKyAgICAgICAgICAgICAgICAgIC0gU0RJTyBTZXJ2aWNlcyBDb21wb25lbnQgKFNTQykKKyAgICAgICAgICAgICAgICAgIC0gSG9zdCBEZXZpY2UgRHJpdmVyIChIREQpCisgICAgICAgICAgICAgICAgICAKKyAgXHBhcmFtIHBwVXNlckRhdGEgLSBwb2ludGVyIHRvIGxvY2F0aW9uIHRvIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgdXNlciAKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLgorICAKKyAgXHJldHVybiAtIE5vdGhpbmcuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1ZPSURfdCB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCB2b3NfcGt0X3QgKnBQYWNrZXQsIFZPU19QS1RfVVNFUl9EQVRBX0lEIHVzZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICoqcHBVc2VyRGF0YSApOworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0cigpIC0gc2V0IHRoZSB1c2VyIGRhdGEgcG9pbnRlciBvZiBhIHZvc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXQKKworICBUaGlzIEFQSSBzZXRzIGEgcG9pbnRlciBpbiB0aGUgc3BlY2lmaWVkIHVzZXIgRGF0YSBhcmVhIGluIHRoZSB2b3NzIAorICBQYWNrZXQuICBVc2VyIGRhdGEgYXJlYXMgYXJlIHVuaXF1YSBhcmVhcyBvZiB0aGUgdm9zcyBQYWNrZXQgdGhhdCBjYW4gCisgIGJlIHVzZWQgYnkgc3BlY2lmaWMgY29tcG9uZW50cyB0byBzdG9yZSBwcml2YXRlIGRhdGEuICBUaGVzZSBhcmVhcyBhcmUgCisgIGlkZW50aWZpZWQgYnkgYSB1c2VyICJJRCIgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIGJ5IHRoZSBjb21wb25lbnQKKyAgc3BlY2lmaWVkLgorICAKKyAgTm90ZTogIFRoZSBzaXplIG9mIHRoZSB1c2VyIGRhdGEgYXJlYXMgaW4gdGhlIHZvc3MgUGFja2V0IGFyZSBmaXhlZC4gIFRoZQorICAgICAgICAgc2l6ZSBvZiBhIHNpbmdsZSBwb2ludGVyIGlzIGF2YWlsYWJsZSBpbiBlYWNoIHVzZXIgYXJlYS4KKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIHNldCB0aGUgdXNlciBwb2ludGVyLgorICAKKyAgXHBhcmFtIHVzZXJJRCAtIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgdXNlciBkYXRhIGFyZWEgaW4gdGhlIHZvc3MgUGFja2V0CisgICAgICAgICAgICAgICAgICB0byBzZXQuCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIFVzZXIgSURzIGFuZCB1c2VyIGRhdGEgYXJlYXMgaW4gdGhlIHZvc3MgUGFja2V0IGFyZSAKKyAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBmb3I6CisgICAgICAgICAgICAgICAgICAtIFRyYW5zcG9ydCBMYXllciAoVEwpCisgICAgICAgICAgICAgICAgICAtIEJ1cyBBYnN0cmFjdGlvbiBMYXllciAoQkFMKQorICAgICAgICAgICAgICAgICAgLSBTRElPIFNlcnZpY2VzIENvbXBvbmVudCAoU1NDKQorICAgICAgICAgICAgICAgICAgLSBIb3N0IERldmljZSBEcml2ZXIgKEhERCkKKyAgICAgICAgICAgICAgICAgIAorICBccGFyYW0gcFVzZXJEYXRhIC0gcG9pbnRlciB2YWx1ZSB0byBzZXQgaW4gdGhlIHVzZXIgZGF0YSBhcmVhIG9mIHRoZSB2b3NzIAorICAgICAgICAgICAgICAgICAgICAgcGFja2V0Li4KKyAgCisgIFxyZXR1cm4gLSBOb3RoaW5nLgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9WT0lEX3Qgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zX3BrdF90ICpwUGFja2V0LCBWT1NfUEtUX1VTRVJfREFUQV9JRCB1c2VySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqcFVzZXJEYXRhICk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCkgLSBSZXR1cm4gYSB2b3NzIFBhY2tldCAoY2hhaW4pIHRvIHZPU1MKKworICBUaGlzIEFQSSByZXR1cm5zIGEgdm9zcyBQYWNrZXQgdG8gdGhlIGludGVybmFsbHkgbWFuYWdlZCBwYWNrZXQgcG9vbC4gIAorICAKKyAgTm90ZTogIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBwYWNrZXRzIGNoYWluZWQgdG8gdGhpcyBwYWNrZXQsIHRoZSBlbnRpcmUgCisgIHBhY2tldCBjaGFpbiBpcyByZXR1cm5lZCB0byB2T1NTLiAgVGhlIGNhbGxlciBtdXN0IHVuY2hhaW4gdGhlIAorICBwYWNrZXRzIHRocm9naCB2b3NfcGt0X2dldF9uZXh0X3BhY2tldCgpIGFuZCByZXR1cm4gdGhlbSBpbmRpdmlkdWFsbHkgCisgIGlmIGFsbCBwYWNrZXRzIGluIHRoZSBwYWNrZXQgY2hhaW4gYXJlIG5vdCB0byBiZSByZXR1cm5lZC4KKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0KHMpIHRvIHJldHVybi4gIE5vdGUgYWxsIHBhY2tldHMgY2hhaW5lZAorICAgICAgICAgICAgICAgICAgIHRvIHRoaXMgcGFja2V0IGFyZSByZXR1cm5lZCB0byB2T1NTLgorICAKKyAgXHJldHVybgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHZvc19wa3RfdCAqcFBhY2tldCApOworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3BrdF9jaGFpbl9wYWNrZXQoKSAtIGNoYWluIGEgdm9zcyBQYWNrZXQgdG8gYW5vdGhlciBwYWNrZXQgCisKKyAgVGhpcyBBUEkgY2hhaW5zIGEgdm9zcyBQYWNrZXQgdG8gYW5vdGhlciB2b3NzIFBhY2tldCwgY3JlYXRpbmcgYSBwYWNrZXQKKyAgY2hhaW4uICBQYWNrZXRzIGNhbiBiZSBjaGFpbmVkIGJlZm9yZSBvciBhZnRlciB0aGUgY3VycmVudCBwYWNrZXQgaW4gdGhlCisgIHBhY2tldCBjaGFpbi4KKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gcG9pbnRlciB0byBhIHZvc3MgcGFja2V0IHRvIGNoYWluIHRvIAorICAKKyAgXHBhcmFtIHBDaGFpblBhY2tldCAtIHBvaW50ZXIgdG8gcGFja2V0IHRvIGNoYWluCisgIAorICBccGFyYW0gY2hhaW5BZnRlciAtIGJvb2xlYW4gdG8gc3BlY2lmeSB0byBjaGFpbiBwYWNrZXQgYWZ0ZXIgb3IgYmVmb3JlIAorICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBwYWNrZXQKKyAgPHVsPiAgICAgICAgICAgICAgICAgICAgICAgCisgICAgPGxpPiB0cnVlIC0gY2hhaW4gcGFja2V0IEFGVEVSIHBQYWNrZXQgKGNoYWluIGJlaGluZCkKKyAgICA8bGk+IGZhbHNlIC0gY2hhaW4gcGFja2V0IEJFRk9SRSBwUGFja2V0IChjaGFpbiBpbiBmcm9udCkgIAorICA8L3VsPgorICAgIAorICBccmV0dXJuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NfcGt0X3QgKnBQYWNrZXQsIHZvc19wa3RfdCAqcENoYWluUGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IGNoYWluQWZ0ZXIgKTsKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oKSAtIFdhbGsgcGFja2V0IGNoYWluIGFuZCAocG9zc2libHkpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2hhaW4gcGFja2V0cworCisgIFRoaXMgQVBJIHdpbGwgd2FsayB0aGUgdm9zcyBQYWNrZXQgYW5kIHVuY2hhaW4gdGhlIHBhY2tldCBmcm9tIHRoZSBjaGFpbiwgCisgIGlmIHNwZWNpZmllZC4gIFRoZSAnbmV4dCcgcGFja2V0IGluIHRoZSBwYWNrZXQgY2hhaW4gaXMgcmV0dXJuZWQgYXMgdGhlIAorICBwYWNrZXQgY2hhaW4gaXMgdHJhdmVyc2VkLiAKKyAgCisgIFxwYXJhbSAgcFBhY2tldCAtIGlucHV0IHZvc19wYWNrZXQgd2FsayAKKyAgCisgIFxwYXJhbSBwcENoYWluZWRQYWNrZXQgLSBwb2ludGVyIHRvIGxvY2F0aW9uIHRvIHJldHVybiB0aGUgJ25leHQnIHZvc3MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQgcG9pbnRlciBpbiB0aGUgcGFja2V0IGNoYWluLiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIG1lYW5zIHRoZXJlIGlzIHdhcyBub3QgcGFja2V0IGNoYWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoaXMgcGFja2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFxwYXJhbSB1bmNoYWluUGFja2V0IC0gRmxhZyB0aGF0IHNwZWNpZmllcyBpZiB0aGUgY2FsbGVyIHdhbnRzIHRoZSBwYWNrZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW1vdmVkIGZyb20gdGhlIHBhY2tldCBjaGFpbi4gIFRoaXMgaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgdG8gYWxsb3cgdGhlIGNhbGxlciB0byB3YWxrIHRoZSBwYWNrZXQgY2hhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9yIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGNoYWluLiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgPHVsPgorICAgICAgPGxpPiB0cnVlIC0gd2hlbiBzZXQgJ3RydWUnIHRoZSBBUEkgd2lsbCByZXR1cm4gCisgICAgICAgICAgICAgICAgICB0aGUgJ25leHQnIHBhY2tldCBwb2ludGVyIGluIHRoZSB2b3NzIFBhY2t0ZSBjaGFpbiBhbmQgCisgICAgICAgICAgICAgICAgICAqV0lMTCogdW5jaGFpbiB0aGUgaW5wdXQgcGFja2V0IGZyb20gdGhlIHBhY2tldCBjaGFpbi4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICA8bGk+IE5PVCBmYWxzZSAtIHdoZW4gc2V0ICdmYWxzZScgdGhlIEFQSSB3aWxsIHJldHVybiAKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlICduZXh0JyBwYWNrZXQgcG9pbnRlciBpbiB0aGUgdm9zcyBQYWNrZXQgY2hhaW4gYnV0CisgICAgICAgICAgICAgICAgICAgICAgICpXSUxMIE5PVCogdW5jaGFpbiB0aGUgcGFja2V0IGNoYWluLiAgIFRoaXMgb3B0aW9uIGdpdmVzCisgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIgdGhlIGFiaWxpdHkgdG8gd2FsayB0aGUgcGFja2V0IGNoYWluIHdpdGhvdXQgCisgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeWluZyBpdCBpbiB0aGUgcHJvY2Vzcy4KKyAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAKKyAgXG5vdGUgSGF2aW5nIHRoZSBwYWNrZXRzIGNoYWluZWQgaGFzIGFuIGltcGxpY2FpdG9uIG9uIGhvdyB0aGUgcmV0dXJuCisgICAgICAgIHBhY2tldCBBUEkgKHZvc19wa3RfcmV0dXJuX3BhY2tldCgpICkgb3BlcmF0ZXMuICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCisgIFxyZXR1cm4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zX3BrdF90ICpwUGFja2V0LCB2b3NfcGt0X3QgKipwcENoYWluZWRQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfQk9PTF90IHVuY2hhaW5QYWNrZXQgKTsKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19wa3RfZ2V0X2RhdGFfdmVjdG9yKCkgLSBHZXQgZGF0YSB2ZWN0b3JzIGZyb20gYSB2b3NzIFBhY2tldAorCisgIFRoaXMgQVBJIGdldHMgdGhlIGNvbXBsZXRlIHNldCBvZiBWZWN0b3JzIChwb2ludGVyIC8gbGVuZ3RoIHBhaXJzKSB0aGF0IAorICBkZXNjcmliZSBhbGwgb2YgdGhlIGRhdGEgdGhhdCBtYWtlcyB1cCB0aGUgdm9zcyBQYWNrZXQuCisKKyAgXHBhcmFtIHBQYWNrZXQgLSBwb2ludGVyIHRvIHRoZSB2T1NTIFBhY2tldCB0byBnZXQgdGhlIHBvaW50ZXIvbGVuZ3RoIAorICAgICAgICAgICAgICAgICAgIHZlY3RvciBmcm9tCisgICAgICAgICAgICAgICAgICAgCisgIFxwYXJhbSBwVmVjdG9yIC0gcG9pbnRlciB0byB0aGUgdmVjdG9yIGFycmF5IHdoZXJlIHRoZSB2ZWN0b3JzIGFyZSByZXR1cm5lZC4KKyAgCisgIFxwYXJhbSBwTnVtVmVjdG9ycyAtIE51bWJlciBvZiB2ZWN0b3IncyBpbiB0aGUgdmVjdG9yIGFycmF5IChhdCBwVmVjdG9yKS4gIAorICAgICAgICAgICAgICAgICAgICAgICBPbiBzdWNjZXNzZnVsIHJldHVybiwgKnBOdW1WZWN0b3JzIGlzIHVwZGF0ZWQgd2l0aCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBwb2ludGVyL2xlbmd0aCB2ZWN0b3JzIGF0IHBWZWN0b3IgcG9wdWxhdGVkIAorICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHZhbGlkIHZlY3RvcnMuCisgIAorICBDYWxsIHdpdGggTlVMTCBwVmVjdG9yIG9yIDAgdmVjdG9yU2l6ZSwgd2lsbCByZXR1cm4gdGhlIHNpemUgb2YgdmVjdG9yIAorICBuZWVkZWQgKGluICpwTnVtVmVjdG9ycykKKyAgCisgIENhbGxlciBhbGxvY2F0ZXMgYW5kIGZyZWVzIHRoZSB2ZWN0b3IgbWVtb3J5LgorICAKKyAgXHJldHVybgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X2dldF9kYXRhX3ZlY3Rvciggdm9zX3BrdF90ICpwUGFja2V0LCB2b3NfcGt0X2RhdGFfdmVjdG9yX3QgKnBWZWN0b3IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9TSVpFX3QgKnBOdW1WZWN0b3JzICk7CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X2V4dHJhY3RfZGF0YSgpIC0gRXh0cmFjdCBkYXRhIGZyb20gdGhlIHZvc3MgUGFja2V0LgorCisgIFRoaXMgQVBJIGV4dHJhY3RzIGRhdGEgZnJvbSBhIHZvc3MgUGFja2V0LCBjb3B5aW5nIHRoZSBkYXRhIGludG8gdGhlIAorICBzdXBwbGllZCBvdXRwdXQgYnVmZmVyLiAgTm90ZSB0aGUgZGF0YSBpcyBjb3BpZWQgZnJvbSB0aGUgdm9zIHBhY2tldAorICBidXQgdGhlIGRhdGEgcmVtYWlucyBpbiB0aGUgdm9zIHBhY2tldCBhbmQgdGhlIHNpemUgaXMgdW5hZmZlY3RlZC4KKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIGdldCB0aGUgZGF0YSBmcm9tLgorICAKKyAgXHBhcmFtIHBrdE9mZnNldCAtIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZvc3MgUGFja2V0IHRvIGdldCB0aGUgCisgICAgICAgICBkYXRhLiAgKGkuZS4gMCB3b3VsZCBiZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2b3NzIFBhY2tldCkuCisgICAgICAgICAKKyAgXHBhcmFtIHBPdXRwdXRCdWZmZXIgLSBQb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgdm9zcyBQYWNrZXQgZGF0YQorICAgICAgICAgd2lsbCBiZSBjb3BpZWQuCisgIAorICBccGFyYW0gcE91dHB1dEJ1ZmZlclNpemUgLSBvbiBpbnB1dCwgY29udGFpbnMgdGhlIGFtb3VudCBvZiBkYXRhIHRvIGV4dHJhY3QKKyAgICAgICAgIGludG8gdGhlIG91dHB1dCBidWZmZXIuICBVcG9uIHJldHVybiwgY29udGFpbnMgdGhlIGFtb3VudCBvZiBkYXRhCisgICAgICAgICBleHRyYWN0ZWQgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4gICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICBOb3RlOiAgYW4gaW5wdXQgb2YgMCBpbiAqcE91dHB1dEJ1ZmZlclNpemUsIG1lYW5zIHRvIGNvcHkgKmFsbCogCisgICAgICAgICBkYXRhIGluIHRoZSB2b3NzIFBhY2tldCBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLiAgVGhlIGNhbGxlciBpcyAKKyAgICAgICAgIHJlc3BvbnNpYmxlIGZvciBhc3N1cmluZyB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplIGlzIGJpZyBlbm91Z2gKKyAgICAgICAgIHNpbmNlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaXMgbm90IGJlaW5nIHBhc3NlZCBpbiEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFxyZXR1cm4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc19wa3RfdCAqcFBhY2tldCwgdl9TSVpFX3QgcGt0T2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICpwT3V0cHV0QnVmZmVyLCB2X1NJWkVfdCAqcE91dHB1dEJ1ZmZlclNpemUgKTsKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19wa3RfZXh0cmFjdF9kYXRhX2NoYWluKCkgLSBFeHRyYWN0IGRhdGEgZnJvbSBhIHZvc3MgUGFja2V0IGNoYWluLgorCisgIFRoaXMgQVBJIGV4dHJhY3RzICphbGwqIHRoZSBkYXRhIGZyb20gYSB2b3NzIFBhY2tldCBjaGFpbiwgY29weWluZyB0aGUgCisgIGRhdGEgaW50byB0aGUgc3VwcGxpZWQgb3V0cHV0IGJ1ZmZlci4gIE5vdGUgdGhlIGRhdGEgaXMgY29waWVkIGZyb20gCisgIHRoZSB2b3MgcGFja2V0IGNoYWluIGJ1dCB0aGUgZGF0YSByZW1haW5zIGluIHRoZSB2b3MgcGFja2V0IGFuZCB0aGUgCisgIHNpemUgb2YgdGhlIHZvcyBwYWNrZXRzIGFyZSB1bmFmZmVjdGVkLgorICAKKyAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgZmlyc3Qgdm9zcyBQYWNrZXQgaW4gdGhlIHZvc3MgcGFja2V0IGNoYWluIHRvIAorICAgICAgICAgZXh0cmFjdCBkYXRhLgorICAgICAgICAgICAKKyAgXHBhcmFtIHBPdXRwdXRCdWZmZXIgLSBQb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgdm9zcyBQYWNrZXQgZGF0YQorICAgICAgICAgd2lsbCBiZSBjb3BpZWQuCisgIAorICBccGFyYW0gcE91dHB1dEJ1ZmZlclNpemUgLSBvbiBpbnB1dCwgY29udGFpbnMgdGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEgCisgICAgICAgICB0aGF0IGNhbiBiZSBleHRyYWN0ZWQgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4gIFVwb24gcmV0dXJuLCBjb250YWlucworICAgICAgICAgdGhlIGFtb3VudCBvZiBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBwYWNrZXQgY2hhaW4uICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBkYXRhIGZyb20gdGhlIGVudGlyZSBwYWNrZXQgY2hhaW4gaXMgCisgICAgICAgICAgZXh0cmFjdGVkIGFuZCBmb3VuZCBhdCAqcE91dHB1dEJ1ZmZlci4gICpwT3V0cHV0QnVmZmVyU2l6ZSBieXRlcworICAgICAgICAgIHdlcmUgZXh0cmFjdGVkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHBQYWNrZXQsIHBPdXRwdXRCdWZmZXIsIG9yIHBPdXRwdXRCdWZmZXJTaXplCisgICAgICAgICAgaXMgbm90IGEgdmFsaWQgcG9pbnRlci4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfTk9NRU0gLSB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gdG8gZXh0cmFjdCB0aGUgZGF0YQorICAgICAgICAgIGZyb20gdGhlIGVudGlyZSBwYWNrZXQgY2hhaW4uICpwT3V0cHV0QnVmZmVyU2l6ZSBoYXMgYmVlbiB1cGRhdGVkIAorICAgICAgICAgIHdpdGggdGhlIHNpemUgbmVlZGVkIHRvIGV4dHJhY3QgdGhlIGVudGllciBwYWNrZXQgY2hhaW4uICAgICAgICAgIAorICAgIAorICBcc2Egdm9zX3BrdF9leHRyYWN0X2RhdGEoKQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3RfZXh0cmFjdF9kYXRhX2NoYWluKCB2b3NfcGt0X3QgKnBQYWNrZXQsIHZfVk9JRF90ICpwT3V0cHV0QnVmZmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfU0laRV90ICpwT3V0cHV0QnVmZmVyU2l6ZSApOworCisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X3BlZWtfZGF0YSgpIC0gcGVlayBpbnRvIHZvc3MgUGFja2V0IGF0IGdpdmVuIG9mZnNldCAKKworICBUaGlzIEFQSSBwcm92aWRlcyBhIHBvaW50ZXIgdG8gYSBzcGVjaWZpZWQgb2Zmc2V0IGludG8gYSB2b3NzIFBhY2tldCwgCisgIGFsbG93aW5nIHRoZSBjYWxsZXIgdG8gcGVlayBhdCBhIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdm9zcyBQYWNrZXQuICAKKyAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGNhbGxlciBjYW4gYWNjZXNzICJudW1CeXRlcyIgb2YgZGF0YSBhdCAKKyAgInBQYWNrZXREYXRhIi4gIAorICAKKyAgVGhpcyBBUEkgd2lsbCBmYWlsIGlmIHRoZSBkYXRhIGxlbmd0aCByZXF1ZXN0ZWQgdG8gcGVlayBhdCBpcyBub3QgaW4gIAorICBjb250aWd1b3VzIG1lbW9yeSBpbiB0aGUgdm9zcyBQYWNrZXQuICBJbiB0aGlzIGNhc2UsIHRoZSBjYWxsZXIgc2hvdWxkIAorICB1c2Ugdm9zX3BrdF9leHRyYWN0X2RhdGEoKSB0byBoYXZlIHRoZSBkYXRhIGNvcGllZCBpbnRvIGEgY2FsbGVyIHN1cHBsaWVkCisgIGJ1ZmZlci4KKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZPU1MgUGFja2V0IHRvIHBlZWsgaW50bworICAKKyAgXHBhcmFtIHBrdE9mZnNldCAtIHRoZSBvZmZzZXQgaW50byB0aGUgdm9zcyBQYWNrZXQgZGF0YSB0byBwZWVrIGludG8uCisgIAorICBccGFyYW0gcHBQYWNrZXREYXRhIC0gcG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQgZGF0YSBhdCBwa3RPZmZzZXQgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICBccGFyYW0gbnVtQnl0ZXMgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBjYWxsZXIgd2lzaGVzIHRvIHBlZWsgYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCisgIFxyZXR1cm4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9wZWVrX2RhdGEoIHZvc19wa3RfdCAqcFBhY2tldCwgdl9TSVpFX3QgcGt0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKipwcFBhY2tldERhdGEsIHZfU0laRV90IG51bUJ5dGVzICk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X2dldF9wYWNrZXRfdHlwZSgpIC0gR2V0IHBhY2tldCB0eXBlIGZvciBhIHZvc3MgUGFja2V0IAorCisgIFRoaXMgQVBJIHJldHVybnMgdGhlIHBhY2tldCBUeXBlIGZvciBhIHZvc3MgUGFja2V0LiAKKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIGdldCB0aGUgcGFja2V0IHR5cGUgZnJvbS4KKyAgCisgIFxwYXJhbSBwUGFja2V0VHlwZSAtIGxvY2F0aW9uIHRvIHJldHVybiB0aGUgcGFja2V0IHR5cGUgZm9yIHRoZSB2b3NzIFBhY2tldAorICAKKyAgXHJldHVybgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X2dldF9wYWNrZXRfdHlwZSggdm9zX3BrdF90ICpwUGFja2V0LCBWT1NfUEtUX1RZUEUgKnBQYWNrZXRUeXBlICk7CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCkgLSBHZXQgcGFja2V0IGxlbmd0aCBmb3IgYSB2b3NzIFBhY2tldCAKKworICBUaGlzIEFQSSByZXR1cm5zIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGRhdGEgaW4gYSB2b3NzIFBhY2tldC4gCisgIAorICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCB0byBnZXQgdGhlIHBhY2tldCBsZW5ndGggZnJvbS4KKyAgCisgIFxwYXJhbSBwUGFja2V0U2l6ZSAtIGxvY2F0aW9uIHRvIHJldHVybiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHZvc3MgUGFja2V0LiAgCisgIFxyZXR1cm4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zX3BrdF90ICpwUGFja2V0LCB2X1UxNl90ICpwUGFja2V0U2l6ZSApOworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3BrdF9nZXRfcGFja2V0X2NoYWluX2xlbmd0aCgpIC0gR2V0IGxlbmd0aCBvZiBhIHZvcyBwYWNrZXQgY2hhaW4gCisKKyAgVGhpcyBBUEkgcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIGEgdm9zcyBQYWNrZXQgY2hhaW4uCisgIAorICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldCBjaGFpbi4gIFRoaXMgQVBJCisgICAgICAgICB3aWxsIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGRhdGEgaW4gdGhlIHBhY2tldCBjaGFpbiBzdGF0aW5nIHdpdGggCisgICAgICAgICB0aGlzIHBhY2tldC4KKyAgCisgIFxwYXJhbSBwUGFja2V0U2l6ZSAtIGxvY2F0aW9uIHRvIHJldHVybiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHZvc3MgUGFja2V0LiAgCisgIFxyZXR1cm4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9nZXRfcGFja2V0X2NoYWluX2xlbmd0aCggdm9zX3BrdF90ICpwUGFja2V0Q2hhaW4sIHZfU0laRV90ICpwUGFja2V0Q2hhaW5TaXplICk7CisKKworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3BrdF9wdXNoX2hlYWQoKSAtIHB1c2ggZGF0YSBvbiB0aGUgZnJvbnQgYSBvZiBhIHZvc3MgUGFja2V0IAorCisgIFRoaXMgQVBJIHdpbGwgcHVzaCBkYXRhIG9udG8gdGhlIGZyb250IG9mIGEgdm9zcyBQYWNrZXQuICBUaGUgZGF0YSB3aWxsIGJlIAorICBhcHBlbmRlZCBpbiBmcm9udCBvZiBhbnkgZGF0YSBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgdm9zcyBQYWNrZXQuCisgIAorICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCB0byBtb2RpZnkuCisgIAorICBccGFyYW0gcERhdGEgLSBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIHB1c2ggb250byB0aGUgaGVhZCBvZiB0aGUgdm9zcyBQYWNrZXQuCisgIAorICBccGFyYW0gZGF0YVNpemUgLSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0byBwdXQgb250byB0aGUgaGVhZCBvZiB0aGUgdm9zcyBQYWNrZXQuICAKKyAgCisgIFxyZXR1cm4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCitWT1NfU1RBVFVTIHZvc19wa3RfcHVzaF9oZWFkKCB2b3NfcGt0X3QgKnBQYWNrZXQsIHZfVk9JRF90ICpwRGF0YSwgdl9TSVpFX3QgZGF0YVNpemUgKTsKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19wa3RfcmVzZXJ2ZV9oZWFkKCkgLSBSZXNlcnZlIHNwYWNlIGF0IHRoZSBmcm9udCBvZiBhIHZvc3MgUGFja2V0IAorCisgIFRoaXMgQVBJIHdpbGwgcmVzZXJ2ZSBzcGFjZSBhdCB0aGUgZnJvbnQgb2YgYSB2b3NzIFBhY2tldC4gIFRoZSBjYWxsZXIgY2FuIAorICB0aGVuIGNvcHkgZGF0YSBpbnRvIHRoaXMgcmVzZXJ2ZWQgc3BhY2UgdXNpbmcgbWVtY3B5KCkgbGlrZSBmdW5jdGlvbnMuICBUaGlzIAorICBhbGxvd3MgdGhlIGNhbGxlciB0byByZXNlcnZlIHNwYWNlIGFuZCBidWlsZCBoZWFkZXJzIGRpcmVjdGx5IGluIHRoaXMKKyAgcmVzZXJ2ZWQgc3BhY2UgaW4gdGhlIHZvc3MgUGFja2V0LgorICAKKyAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGxlbmd0aCBvZiB0aGUgdm9zcyBQYWNrZXQgaXMgaW5jcmVhc2VkIGJ5IAorICBkYXRhU2l6ZS4KKyAgCisgIDwgcHV0IGEgYmVmb3JlIC8gYWZ0ZXIgcGljdHVyZSBoZXJlPiAKKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG1vZGlmeS4KKyAgCisgIFxwYXJhbSBwcERhdGEgLSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcG9pbnRlciB0byB0aGUgcmVzZXJ2ZWQgCisgICAgICAgICAgICAgICAgICBzcGFjZSBpcyByZXR1cm5lZC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBjYWxsZXIgaGFzIAorICAgICAgICAgICAgICAgICAgd3JpdGUgLyByZWFkIGFjY2VzcyB0byB0aGUgZGF0YSBzcGFjZSBhdCAqcHBEYXRhIGZvciBsZW5ndGgKKyAgICAgICAgICAgICAgICAgIGRhdGFTaXplIHRvIGJ1aWxkIGhlYWRlcnMsIGV0Yy4KKyAgCisgIFxwYXJhbSBkYXRhU2l6ZSAtIHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIHJlc2VydmUgYXQgdGhlIGhlYWQgb2YgdGhlIHZvc3MgCisgICAgICAgICAgICAgICAgICAgIFBhY2tldC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBsZW5ndGggb2YgdGhlIHZvc3MKKyAgICAgICAgICAgICAgICAgICAgUGFja2V0IGlzIGluY3JlYXNlZCBieSBkYXRhU2l6ZS4gCisgIAorICBccmV0dXJuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorVk9TX1NUQVRVUyB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zX3BrdF90ICpwUGFja2V0LCB2X1ZPSURfdCAqKnBwRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1NJWkVfdCBkYXRhU2l6ZSApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19wa3RfcmVzZXJ2ZV9oZWFkX2Zhc3QoKS0gUmVzZXJ2ZSBzcGFjZSBhdCB0aGUgZnJvbnQgb2YgYSB2b3NzIFBrdCAKKworICBUaGlzIEFQSSB3aWxsIHJlc2VydmUgc3BhY2UgYXQgdGhlIGZyb250IG9mIGEgdm9zcyBQYWNrZXQuICBUaGUgY2FsbGVyIGNhbiAKKyAgdGhlbiBjb3B5IGRhdGEgaW50byB0aGlzIHJlc2VydmVkIHNwYWNlIHVzaW5nIG1lbWNweSgpIGxpa2UgZnVuY3Rpb25zLiAgVGhpcyAKKyAgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmVzZXJ2ZSBzcGFjZSBhbmQgYnVpbGQgaGVhZGVycyBkaXJlY3RseSBpbiB0aGlzCisgIHJlc2VydmVkIHNwYWNlIGluIHRoZSB2b3NzIFBhY2tldC4KKyAgCisgIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBsZW5ndGggb2YgdGhlIHZvc3MgUGFja2V0IGlzIGluY3JlYXNlZCBieSAKKyAgZGF0YVNpemUuCisgCisgIFNhbWUgYXMgYWJvdmUgQVBJIGJ1dCBubyBtZW1zZXQgdG8gMC4KKyAKKyAgPCBwdXQgYSBiZWZvcmUgLyBhZnRlciBwaWN0dXJlIGhlcmU+IAorICAKKyAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgdm9zcyBQYWNrZXQgdG8gbW9kaWZ5LgorICAKKyAgXHBhcmFtIHBwRGF0YSAtIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBwb2ludGVyIHRvIHRoZSByZXNlcnZlZCAKKyAgICAgICAgICAgICAgICAgIHNwYWNlIGlzIHJldHVybmVkLiAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGNhbGxlciBoYXMgCisgICAgICAgICAgICAgICAgICB3cml0ZSAvIHJlYWQgYWNjZXNzIHRvIHRoZSBkYXRhIHNwYWNlIGF0ICpwcERhdGEgZm9yIGxlbmd0aAorICAgICAgICAgICAgICAgICAgZGF0YVNpemUgdG8gYnVpbGQgaGVhZGVycywgZXRjLgorICAKKyAgXHBhcmFtIGRhdGFTaXplIC0gdGhlIHNpemUgb2YgdGhlIGRhdGEgdG8gcmVzZXJ2ZSBhdCB0aGUgaGVhZCBvZiB0aGUgdm9zcyAKKyAgICAgICAgICAgICAgICAgICAgUGFja2V0LiAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGxlbmd0aCBvZiB0aGUgdm9zcworICAgICAgICAgICAgICAgICAgICBQYWNrZXQgaXMgaW5jcmVhc2VkIGJ5IGRhdGFTaXplLiAKKyAgCisgIFxyZXR1cm4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCitWT1NfU1RBVFVTIHZvc19wa3RfcmVzZXJ2ZV9oZWFkX2Zhc3QoIHZvc19wa3RfdCAqcFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICoqcHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9TSVpFX3QgZGF0YVNpemUgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X3BvcF9oZWFkKCkgLSBSZW1vdmUgZGF0YSBmcm9tIHRoZSBmcm9udCBvZiB0aGUgdm9zcyBQYWNrZXQgCisKKyAgVGhpcyBBUEkgcmVtb3ZlcyBkYXRhIGZyb20gdGhlIGZyb250IG9mIGEgdm9zcyBQYWNrZXQuICBUaGUgZGF0YSBpcyAKKyAgY29waWVkIGludG8gdGhlIG91dHB1dCBidWZmZXIgZGVzY3JpYmVkIGJ5IHBEYXRhIGFuZCBwRGF0YVNpemUKKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG9wZXJhdGUgb24uCisgIAorICBccGFyYW0gcERhdGEgLSBwb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB3aGVyZSB0aGUgZGF0YSByZW1vdmVkIGZyb20gdGhlIAorICAgICAgICAgICAgICAgICB2b3NzIFBhY2tldCBpcyBwbGFjZWQuCisgICAgICAgICAgICAgICAgIAorICBccGFyYW0gZGF0YVNpemUgLSBUaGUgYW1vdW50IG9mIHNwYWNlIHRvIHJlbW92ZSBmcm9tIHRoZSBoZWFkIG9mIHRoZSB2b3NzCisgICAgICAgICAgICAgICAgICAgIFBhY2tldC4gIFRoZSBvdXRwdXQgYnVmZmVyIChhdCAqcERhdGEpIG11c3QgY29udGFpbiBhdAorICAgICAgICAgICAgICAgICAgICBsZWFzdCB0aGlzIGFtb3VudCBvZiBzcGFjZS4KKyAgCisgIFxyZXR1cm4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9wb3BfaGVhZCggdm9zX3BrdF90ICpwUGFja2V0LCB2X1ZPSURfdCAqcERhdGEsIHZfU0laRV90IGRhdGFTaXplICk7CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X3RyaW1faGVhZCgpIC0gU2tpcCBvdmVyIGJ5dGVzIGF0IHRoZSBmcm9udCBvZiBhIHZvc3MgUGFja2V0IAorCisgIFRoaXMgQVBJIG1vdmVzIHRoZSBwb2ludGVycyBhdCB0aGUgaGVhZCBvZiBhIHZvc3MgUGFja2V0IHRvIGVzc2VudGlhbGx5IAorICBza2lwIG92ZXIgZGF0YSBhdCB0aGUgZnJvbnQgb2YgYSB2b3NzIFBhY2tldC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZQorICBsZW5ndGggb2YgdGhlIHZvc3MgUGFja2V0IGlzIHJlZHVjZWQgYnkgZGF0YVNpemUgYW5kIHRoZSBzdGFydGluZyBwb2ludGVyIAorICB0byB0aGUgdm9zcyBQYWNrZXQgaXMgYWRqdXN0ZWQgdG8gZWxpbWluYXRlIHRoZSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorICB2b3NzIFBhY2tldC4gIAorICAKKyAgVGhpcyBBUEkgaGFzIHRoZSBvcHBvc2l0ZSBlZmZlY3Qgb2YgXGEgdm9zX3BrdF9yZXNlcnZlX2hlYWQoKS4KKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG9wZXJhdGUgb24uCisgIAorICBccGFyYW0gZGF0YVNpemUgLSBUaGUgYW1vdW50IG9mIHNwYWNlIHRvIHNraXAgYXQgdGhlIHN0YXJ0IG9mIHRoZSB2b3NzCisgICAgICAgICAgICAgICAgICAgIFBhY2tldC4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB1cG9uIHJldHVybiwgdGhlIGRhdGEgc2tpcHBlZCBvdmVyIGlzIAorICAgICAgICAgICAgICAgICAgICBpbmFjY2Vzc2libGUgdG8gdGhlIGNhbGxlci4gIElmIHRoZSBjYWxsZXIgbmVlZHMgYWNjZXNzCisgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBoZWFkIGRhdGEsIHVzZSB2b3NfcGt0X3BvcF9oZWFkKCkgb3IgCisgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfZXh0cmFjdF9kYXRhKCkgdG8gZ2V0IGEgY29weSBvZiB0aGUgZGF0YS4KKyAgCisgIFxyZXR1cm4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF90cmltX2hlYWQoIHZvc19wa3RfdCAqcFBhY2tldCwgdl9TSVpFX3QgZGF0YVNpemUgKTsKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19wa3RfcHVzaF90YWlsKCkgLSBwdXNoIGRhdGEgb24gdGhlIGVuZCBhIG9mIGEgdm9zcyBQYWNrZXQgCisKKyAgVGhpcyBBUEkgd2lsbCBwdXNoIGRhdGEgb250byB0aGUgZW5kIG9mIGEgdm9zcyBQYWNrZXQuICBUaGUgZGF0YSB3aWxsIGJlIAorICBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGFueSBkYXRhIGFscmVhZHkgY29udGFpbmVkIGluIHRoZSB2b3NzIFBhY2tldC4KKyAgICAKKyAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgdm9zcyBQYWNrZXQgdG8gbW9kaWZ5LgorICAKKyAgXHBhcmFtIHBEYXRhIC0gcG9pbnRlciB0byB0aGUgZGF0YSB0byBwdXNoIG9udG8gdGhlIHRhaWwgb2YgdGhlIHZvc3MgUGFja2V0LgorICAKKyAgXHBhcmFtIGRhdGFTaXplIC0gdGhlIHNpemUgb2YgdGhlIGRhdGEgdG8gcHV0IG9udG8gdGhlIHRhaWwgb2YgdGhlIHZvc3MgUGFja2V0LiAgCisgIAorICBccmV0dXJuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorVk9TX1NUQVRVUyB2b3NfcGt0X3B1c2hfdGFpbCggdm9zX3BrdF90ICpwUGFja2V0LCB2X1ZPSURfdCAqcERhdGEsIHZfU0laRV90IGRhdGFTaXplICk7CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X3Jlc2VydmVfdGFpbCgpIC0gUmVzZXJ2ZSBzcGFjZSBhdCB0aGUgZW5kIG9mIGEgdm9zcyBQYWNrZXQgCisKKyAgVGhpcyBBUEkgd2lsbCByZXNlcnZlIHNwYWNlIGF0IHRoZSBlbmQgb2YgYSB2b3NzIFBhY2tldC4gIFRoZSBjYWxsZXIgY2FuIAorICB0aGVuIGNvcHkgZGF0YSBpbnRvIHRoaXMgcmVzZXJ2ZWQgc3BhY2UgdXNpbmcgbWVtY3B5KCkgbGlrZSBmdW5jdGlvbnMuICBUaGlzIAorICBhbGxvd3MgdGhlIGNhbGxlciB0byByZXNlcnZlIHNwYWNlIGFuZCBidWlsZCBoZWFkZXJzIGRpcmVjdGx5IGluIHRoaXMKKyAgcmVzZXJ2ZWQgc3BhY2UgaW4gdGhlIHZvc3MgUGFja2V0LgorICAKKyAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGxlbmd0aCBvZiB0aGUgdm9zcyBQYWNrZXQgaXMgaW5jcmVhc2VkIGJ5IAorICBkYXRhU2l6ZS4KKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG1vZGlmeS4KKyAgCisgIFxwYXJhbSBwcERhdGEgLSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcG9pbnRlciB0byB0aGUgcmVzZXJ2ZWQgCisgICAgICAgICAgICAgICAgICBzcGFjZSBpcyByZXR1cm5lZC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBjYWxsZXIgaGFzIAorICAgICAgICAgICAgICAgICAgd3JpdGUgLyByZWFkIGFjY2VzcyB0byB0aGUgZGF0YSBzcGFjZSBhdCAqcHBEYXRhIGZvciBsZW5ndGgKKyAgICAgICAgICAgICAgICAgIGRhdGFTaXplIHRvIGJ1aWxkIGhlYWRlcnMsIGV0Yy4KKyAgCisgIFxwYXJhbSBkYXRhU2l6ZSAtIHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIHJlc2VydmUgYXQgdGhlIGhlYWQgb2YgdGhlIHZvc3MgCisgICAgICAgICAgICAgICAgICAgIFBhY2tldC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBsZW5ndGggb2YgdGhlIHZvc3MKKyAgICAgICAgICAgICAgICAgICAgUGFja2V0IGlzIGluY3JlYXNlZCBieSBkYXRhU2l6ZS4gCisgIAorICBccmV0dXJuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3RfcmVzZXJ2ZV90YWlsKCB2b3NfcGt0X3QgKnBQYWNrZXQsIHZfVk9JRF90ICoqcHBEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfU0laRV90IGRhdGFTaXplICk7CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X3BvcF90YWlsKCkgLSBSZW1vdmUgZGF0YSBmcm9tIHRoZSBlbmQgb2YgdGhlIHZvc3MgUGFja2V0IAorCisgIFRoaXMgQVBJIHJlbW92ZXMgZGF0YSBmcm9tIHRoZSBlbmQgb2YgYSB2b3NzIFBhY2tldC4gIFRoZSBkYXRhIGlzIAorICBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciBkZXNjcmliZWQgYnkgcERhdGEgYW5kIHBEYXRhU2l6ZQorICAKKyAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgdm9zcyBQYWNrZXQgdG8gb3BlcmF0ZSBvbi4KKyAgCisgIFxwYXJhbSBwRGF0YSAtIHBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIHJlbW92ZWQgZnJvbSB0aGUgCisgICAgICAgICAgICAgICAgIHZvc3MgUGFja2V0IGlzIHBsYWNlZC4KKyAgICAgICAgICAgICAgICAgCisgIFxwYXJhbSBkYXRhU2l6ZSAtIFRoZSBhbW91bnQgb2Ygc3BhY2UgdG8gcmVtb3ZlIGZyb20gdGhlIGVuZCBvZiB0aGUgdm9zcworICAgICAgICAgICAgICAgICAgICBQYWNrZXQuICBUaGUgb3V0cHV0IGJ1ZmZlciAoYXQgKnBEYXRhKSBtdXN0IGNvbnRhaW4gYXQKKyAgICAgICAgICAgICAgICAgICAgbGVhc3QgdGhpcyBhbW91bnQgb2Ygc3BhY2UuCisgIAorICBccmV0dXJuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3RfcG9wX3RhaWwoIHZvc19wa3RfdCAqcFBhY2tldCwgdl9WT0lEX3QgKnBEYXRhLCB2X1NJWkVfdCBkYXRhU2l6ZSApOworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3BrdF90cmltX3RhaWwoKSAtIFNraXAgb3ZlciBieXRlcyBhdCB0aGUgZW5kIG9mIGEgdm9zcyBQYWNrZXQgCisKKyAgVGhpcyBBUEkgbW92ZXMgdGhlIHBvaW50ZXJzIGF0IHRoZSBoZWFkIG9mIGEgdm9zcyBQYWNrZXQgdG8gZXNzZW50aWFsbHkgCisgIHNraXAgb3ZlciBkYXRhIGF0IHRoZSBlbmQgb2YgYSB2b3NzIFBhY2tldC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZQorICBsZW5ndGggb2YgdGhlIHZvc3MgUGFja2V0IGlzIHJlZHVjZWQgYnkgZGF0YVNpemUgYW5kIHZvc3MgUGFja2V0IGlzIAorICBhZGp1c3RlZCB0byBlbGltaW5hdGUgdGhlIGRhdGEgZnJvbSB0aGUgZW5kIG9mIHRoZSB2b3NzIFBhY2tldC4gIAorICAKKyAgVGhpcyBBUEkgaGFzIHRoZSBvcHBvc2l0ZSBlZmZlY3Qgb2YgXGEgdm9zX3BrdF9yZXNlcnZlX3RhaWwoKS4KKyAgCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG9wZXJhdGUgb24uCisgIAorICBccGFyYW0gZGF0YVNpemUgLSBUaGUgYW1vdW50IG9mIHNwYWNlIHRvIHJlbW92ZSBhdCB0aGUgZW5kIG9mIHRoZSB2b3NzCisgICAgICAgICAgICAgICAgICAgIFBhY2tldC4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB1cG9uIHJldHVybiwgdGhlIGRhdGEgc2tpcHBlZCBvdmVyIGlzIAorICAgICAgICAgICAgICAgICAgICBpbmFjY2Vzc2libGUgdG8gdGhlIGNhbGxlci4gIElmIHRoZSBjYWxsZXIgbmVlZHMgYWNjZXNzCisgICAgICAgICAgICAgICAgICAgIHRvIHRoZSB0YWlsIGRhdGEsIHVzZSB2b3NfcGt0X3BvcF90YWlsKCkgb3IgCisgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfZXh0cmFjdF9kYXRhKCkgdG8gZ2V0IGEgY29weSBvZiB0aGUgZGF0YS4KKyAgCisgIFxyZXR1cm4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF90cmltX3RhaWwoIHZvc19wa3RfdCAqcFBhY2tldCwgdl9TSVpFX3QgZGF0YVNpemUgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X2dldF90aW1lc3RhbXAoKSAtIFJldHJpdmUgdGhlIHRpbWVzdGFtcCBhdHRyaWJ1dGUgZnJvbSB0aGUKKyAgc3BlY2lmaWVkIFZPU1MgcGFja2V0CisKKyAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgdm9zcyBQYWNrZXQgdG8gb3BlcmF0ZSBvbi4gCisKKyAgXHBhcmFtIHBUc3RhbXAgLSB0aGUgdGltZXN0YW1wIHdpbGwgYmUgcmV0dXJuZWQgaGVyZS4gCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVCAtIGludmFsaWQgcGFyYW1ldGVyKHMpIHNwZWNpZmllZAorCisgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTIC0gdGltZXN0YW1wIHJldHJpdmVkIHN1Y2Nlc3NmdWxseQorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X2dldF90aW1lc3RhbXAoIHZvc19wa3RfdCAqcFBhY2tldCwgdl9USU1FX3QqIHBUc3RhbXAgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X2ZsYXR0ZW5fcnhfcGt0KCkgLSBUcmFuc2Zvcm0gYSBwbGF0Zm9ybSBiYXNlZCBSWCBWT1NTCisgIHBhY2tldCBpbnRvIGEgZmxhdCBidWZmZXIgYmFzZWQgVk9TUyBwYWNrZXQgaWYgbmVlZGVkLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlcyAKKyAgd2hlcmUgZm9yIHJlYXNvbnMgb2YgZWZmaWNpZW5jeSB3ZSB3YW50IHRoZSBSWCBwYWNrZXRzIHRvIGJlIHZlcnkgcGxhdGZvcm0gc3BlY2lmaWMKKyAgKGZvciBlLmcuIERTTSBiYXNlZCBvbiBBTVNTLCBldGMpLiBIb3dldmVyIHBsYXRmb3JtIGluZGVwZW5kZW50IGNvZGUgbWF5IHJlbHkKKyAgb24gbWFraW5nIGNhbGxzIG9uIHRoZSBWT1NTIHBhY2tldCB3aGljaCBjYW4gb25seSBiZSBzdXBwb3J0ZWQgYnkgdGhlIGZsYXQgYnVmZmVyCisgIGJhc2VkIGltcGxlbWVudGF0aW9uIG9mIGEgUlggcGFja2V0LiBUaGlzIEFQSSB3aWxsIGFsbG9jYXRlIGEgbmV3IFZPU1MgcGFja2V0IAorICB3aXRoIGZsYXQgYnVmZmVyLCBleHRyYWN0IHRoZSBkYXRhIGZyb20gdGhlIGlucHV0IFZPU1MgcGFja2V0IGFuZCB0aGVuIHJlbGVhc2UgCisgIHRoZSBpbnB1dCBWT1NTIHBhY2tldC4gVGhlIG5ldyBWT1NTIHBhY2tldCB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLgorIAorICBccGFyYW0gcHBQYWNrZXQgLSB0aGUgdm9zcyBQYWNrZXQgdG8gb3BlcmF0ZSBvbi4gb24gaW5wdXQgY29udGFpbnMKKyAgICAgICAgICAgICAgICAgICAgdGhlIHBsYXRmb3JtIGJhc2VkIHBhY2tldC4gT24gb3V0cHV0IGNvbnRhaW5zIHRoZSBmbGF0CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBiYXNlZCBwYWNrZXQuIEFueSBhcHBsaWNhYmxlIHJlc291cmNlcworICAgICAgICAgICAgICAgICAgICBhcmUgZnJlZWQgYXMgcGFydCBvZiB0aGlzIGNhbGwuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVCAtIGludmFsaWQgcGFyYW1ldGVyIHNwZWNpZmllZAorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gcGFja2V0IHR5cGUgbm90IFJYX1JBVyAKKworICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRyYW5zZm9ybSBzdWNjZXNzZnVsCisKKyAgICAgICAgICBvdGhlciBWT1NTIHN0YXR1cyAtIG90aGVyIGVycm9ycyBlbmNvdW50ZXJlZAorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X2ZsYXR0ZW5fcnhfcGt0KCB2b3NfcGt0X3QgKipwcFBhY2tldCApOworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19wa3Rfc2V0X3J4X2xlbmd0aCgpIC0gU2V0IHRoZSBsZW5ndGggb2YgYSByZWNlaXZlZCBwYWNrZXQgCisKKyAgVGhpcyBBUEkgc2V0IHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW5zaWRlIHRoZSBwYWNrZXQgYWZ0ZXIgYSBETUEgaGFzIG9jY3VycmVkCisgIG9uIHJ4LCBpdCB3aWxsIGFsc28gc2V0IHRoZSB0YWlsIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YS4KKworICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCB0byBvcGVyYXRlIG9uLgorCisgIFxwYXJhbSBwa3RMZW4gLSBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBwbGFjZWQgaW4gdGhlIFJ4IHBhY2tldCBkdXJpbmcgRE1BLgorCisKKyAgXHJldHVybgorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3Rfc2V0X3J4X2xlbmd0aCggdm9zX3BrdF90ICpwUGFja2V0LCB2X1NJWkVfdCBwa3RMZW4gKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X2dldF9hdmFpbGFibGVfYnVmZmVyX3Bvb2woKSAtIEdldCBhdmFsaWFibGUgVk9TIHBhY2tldCBzaXplCisgICBWT1NTIFBhY2tldCBwb29sIGlzIGxpbWl0dGVkIHJlc291cmNlCisgICBWT1NTIENsaWVudCBuZWVkIHRvIGtub3cgaG93IG1hbnkgcGFja2V0IHBvb2wgaXMgc3RpbGwgYXZhbGlhYmxlIHRvIGNvbnRyb2wgdGhlIGZsb3cKKyAgIAorICBccGFyYW0gIHBrdFR5cGUgLSBQYWNrZXQgdHlwZSB3YW50IHRvIGtub3cgZnJlZSBidWZmZXIgY291bnQKKyAgICAgICAgICAgICAgICAgICAgVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01ULCBtYW5hZ2VtZW50IGZyZWUgYnVmZmVyIGNvdW50LAorICAgICAgICAgICAgICAgICAgICBWT1NfUEtUX1RZUEVfVFhfODAyXzExX0RBVEEKKyAgICAgICAgICAgICAgICAgICAgVk9TX1BLVF9UWVBFX1RYXzgwMl8zX0RBVEEsIFRYIGZyZWUgYnVmZmVyIGNvdW50CisgICAgICAgICAgICAgICAgICAgIFZPU19QS1RfVFlQRV9SWF9SQVcsIFJYIGZyZWUgYnVmZmVyIGNvdW50CisKKyAgICAgICAgICB2b3NGcmVlQnVmZmVyIC0gZnJlZSBmcmFtZSBidWZmZXIgc2l6ZQorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUwgLSBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcgorCisgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTIC0gR2V0IHNpemUgc3VjY2VzcworICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X2dldF9hdmFpbGFibGVfYnVmZmVyX3Bvb2wKKygKKyAgIFZPU19QS1RfVFlQRSAgcGt0VHlwZSwKKyAgIHZfU0laRV90ICAgICAqdm9zRnJlZUJ1ZmZlcgorKTsKKworI2VuZGlmICAvLyAhZGVmaW5lZCggX19WT1NfUEtUX0ggKQpkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy92b3NfcG93ZXIuaCBiL0NPUkUvVk9TUy9pbmMvdm9zX3Bvd2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiMmYyYwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVk9TUy9pbmMvdm9zX3Bvd2VyLmgKQEAgLTAsMCArMSw2MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9WT1NfUE9XRVJfSF8KKyNkZWZpbmUgX1ZPU19QT1dFUl9IXworCisvKiEKKyAgQGZpbGUKKyAgdm9zX3Bvd2VyLmgKKworICBAYnJpZWYKKyAgVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIFZPU1MgcG93ZXIgQVBJcyB1c2luZyBmb3IgcG93ZXIgbWFuYWdlbWVudCAKKyAgb2YgdGhlIFdMQU4gTGlicmEgbW9kdWxlIGZyb20gdGhlIE1TTSBQTUlDLiBUaGVzZSBpbXBsZW1lbnRhdGlvbiBvZiAKKyAgdGhlc2UgQVBJcyBpcyB2ZXJ5IHRhcmdldCBkZXBlbmRlbnQsIGFsc28gdGhlc2UgQVBJcyBzaG91bGQgb25seSBiZQorICB1c2VkIHdoZW4gdGhlIFdMQU4gTGlicmEgbW9kdWxlIGlzIHBvd2VyZWQgZnJvbSB0aGUgTVNNIFBNSUMgYW5kIG5vdAorICBmcm9tIGFuIGV4dGVybmFsIGluZGVwZW5kZW50IHBvd2VyIHNvdXJjZQorCisqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBRdWFsY29tbSBQcm9wcmlldGFyeQorCisgIEV4cG9ydCBvZiB0aGlzIHRlY2hub2xvZ3kgb3Igc29mdHdhcmUgaXMgcmVndWxhdGVkIGJ5IHRoZSBVLlMuIEdvdmVybm1lbnQuCisgIERpdmVyc2lvbiBjb250cmFyeSB0byBVLlMuIGxhdyBwcm9oaWJpdGVkLgorCisgIEFsbCBpZGVhcywgZGF0YSBhbmQgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIG9yIGRpc2Nsb3NlZCBieQorICB0aGlzIGRvY3VtZW50IGFyZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uIG9mCisgIFFVQUxDT01NIEluY29ycG9yYXRlZCBhbmQgYWxsIHJpZ2h0cyB0aGVyZWluIGFyZSBleHByZXNzbHkgcmVzZXJ2ZWQuCisgIEJ5IGFjY2VwdGluZyB0aGlzIG1hdGVyaWFsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRoYXQgdGhpcyBtYXRlcmlhbAorICBhbmQgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCB0aGVyZWluIGFyZSBoZWxkIGluIGNvbmZpZGVuY2UgYW5kIGluCisgIHRydXN0IGFuZCB3aWxsIG5vdCBiZSB1c2VkLCBjb3BpZWQsIHJlcHJvZHVjZWQgaW4gd2hvbGUgb3IgaW4gcGFydCwKKyAgbm9yIGl0cyBjb250ZW50cyByZXZlYWxlZCBpbiBhbnkgbWFubmVyIHRvIG90aGVycyB3aXRob3V0IHRoZSBleHByZXNzCisgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgTU9EVUxFCisKK1RoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworJEhlYWRlcjogJAorCit3aGVuICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0gICAtLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAxLzIwLzA5ICAgcmcgICAgICBJbml0aWFsIGNyZWF0aW9uIChiYXNlZCBvbiBIZW5yaSdzIHNsaWRlcykKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpbmNsdWRlICJ2b3NfYXBpLmgiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT05TIEFORCBUWVBFUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordHlwZWRlZiBlbnVtCit7CisgIFZPU19DSElQX1JFU0VUX0NNRDUzX0ZBSUxVUkUsICAgICAgICAgICAgICAvKiBSZXNldCBDaGlwIGR1ZSB0byBDTUQ1MyBGYWlsdXJlICovCisgIFZPU19DSElQX1JFU0VUX0ZXX0VYQ0VQVElPTiwgICAgICAgICAgICAgICAvKiBSZXNldCBDaGlwIGR1ZSB0byBGVyBGYWlsdXJlICovCisgIFZPU19DSElQX1JFU0VUX01VVEVYX1JFQURfRkFJTFVSRSwgICAgICAgICAvKiBSZXNldCBDaGlwIGR1ZSB0byAgTXV0ZXggUmVhZCBGYWlsdXJlICovCisgIFZPU19DSElQX1JFU0VUX01JRl9FWENFUFRJT04sICAgICAgICAgICAgICAvKiBSZXNldCBDaGlwIGR1ZSB0byAgTUFDIGV4Y2VwdGlvbiBlLmcuIEJNVSBmYXRhbCwgTUlGIGVycm9yICovCisgIFZPU19DSElQX1JFU0VUX1VOS05PV05fRVhDRVBUSU9OICAgICAgICAgICAvKiBSZXNldCBDaGlwIGR1ZSB0byAgYW55IG90aGVyIGV4Y2VwdGlvbiAqLworfXZvc19jaGlwX3Jlc2V0X3JlYXNvbl90eXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgVk9TX0NBTExfU1lOQywgICAgLyogb3BlcmF0aW9uIGlzIHN5bmNocm9ub3VzICovCisgIFZPU19DQUxMX0FTWU5DICAgIC8qIG9wZXJhdGlvbiBpcyBhc3luY2hyb25vdXMgKi8gICAgCisKK30gdm9zX2NhbGxfc3RhdHVzX3R5cGU7CisKK3R5cGVkZWYgdl9WT0lEX3QgKCp2b3NfcG93ZXJfY2JfdHlwZSkKKygKKyAgdl9QVk9JRF90ICB1c2VyX2RhdGEsICAgIC8qIHVzZXIgY29va2llICovIAorICBWT1NfU1RBVFVTIHJlc3VsdCAgICAgICAgLyogcmVzdWx0IG9mIG9wZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyBmb3Igc3VjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgZm9yIGZhaWx1cmUgICovCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OIFBST1RPVFlQRVMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgIEBicmllZiB2b3NfY2hpcFBvd2VyVXAoKSAtIFRoaXMgQVBJIHdpbGwgcG93ZXIgdXAgdGhlIExpYnJhIGNoaXAKKworICBUaGlzIG9wZXJhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZiBzbywgdGhlIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwKKyAgYmUgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHQuIFRoZSBjYWxsYmFjayB3aWxsIAorICBiZSBjYWxsZWQgd2l0aCB0aGUgdXNlciBzdXBwbGllZCBkYXRhLiBJZiB0aGUgb3BlcmF0aW9uIGlzIGtub3duIHRvIGJlIAorICBzeW5jLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1cHBseSBhIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEuCisKKyAgVGhlIExpYnJhIFNESU8gY29yZSB3aWxsIGhhdmUgYmVlbiBpbml0aWFsaXplZCBpZiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcworICBzdWNjZXNzZnVsbHkKKworICBAcGFyYW0gc3RhdHVzIFtvdXRdIDogd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIHN5bmMgb3IgYXN5bmMKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfRkFVTFQgLSB0aGUgb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGFuZCBhIGNhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlcl9kYXRhIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgKHN0YXR1cyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgCisgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGJ1dCBhbm90aGVyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHByb2dyZXNzIChzdGF0dXMgd2lsbCBiZSBzZXQgdG8gVk9TX0NBTExfQVNZTkMpICAKKyAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBvcGVyYXRpb24gZmFpbGVkIChzdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSkgICAgICAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwUG93ZXJVcAorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEKKyk7CisKKy8qKgorICBAYnJpZWYgdm9zX2NoaXBQb3dlckRvd24oKSAtIFRoaXMgQVBJIHdpbGwgcG93ZXIgZG93biB0aGUgTGlicmEgY2hpcAorCisgIFRoaXMgb3BlcmF0aW9uIG1heSBiZSBhc3luY2hyb25vdXMuIElmIHNvLCB0aGUgc3VwcGxpZWQgY2FsbGJhY2sgd2lsbAorICBiZSBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdC4gVGhlIGNhbGxiYWNrIHdpbGwgCisgIGJlIGNhbGxlZCB3aXRoIHRoZSB1c2VyIHN1cHBsaWVkIGRhdGEuIElmIHRoZSBvcGVyYXRpb24gaXMga25vd24gdG8gYmUgCisgIHN5bmMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IGEgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YS4KKworICBAcGFyYW0gc3RhdHVzIFtvdXRdIDogd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIHN5bmMgb3IgYXN5bmMKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfRkFVTFQgLSB0aGUgb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGFuZCBhIGNhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlcl9kYXRhIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgKHN0YXR1cyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgCisgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGJ1dCBhbm90aGVyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHByb2dyZXNzIChzdGF0dXMgd2lsbCBiZSBzZXQgdG8gVk9TX0NBTExfQVNZTkMpICAKKyAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBvcGVyYXRpb24gZmFpbGVkIChzdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSkgICAgICAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwUG93ZXJEb3duCisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YQorKTsKKworLyoqCisgIEBicmllZiB2b3NfY2hpcFJlc2V0KCkgLSBUaGlzIEFQSSB3aWxsIHJlc2V0IHRoZSBMaWJyYSBjaGlwCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEEgaGFyZCByZXNldCB3aWxsIGludm9sdmUgYSBwb3dlckRvd24gZm9sbG93ZWQgYnkgYSBQb3dlclVwOyBhIHNvZnQgcmVzZXQKKyAgY2FuIHBvdGVudGlhbGx5IGJlIGFjY29tcGxpc2hlZCBieSB3cml0aW5nIHRvIHNvbWUgZGV2aWNlIHJlZ2lzdGVycworCisgIFRoZSBMaWJyYSBTRElPIGNvcmUgd2lsbCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgaWYgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgc3VjY2Vzc2Z1bGx5CisKKyAgQHBhcmFtIHN0YXR1cyBbb3V0XSA6IHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gd2lsbCBjb21wbGV0ZSBzeW5jIG9yIGFzeW5jCisgIEBwYXJhbSBzb2Z0IFtpbl0gOiBWT1NfVFJVRSBpZiBhIHNvZnQgcmVzZXQgaXMgZGVzaXJlZCAKKyAgICAgICAgICAgICAgICAgICAgIFZPU19GQUxTRSBmb3IgYSBoYXJkIHJlc2V0IGkuZS4gcG93ZXJEb3duIGZvbGxvd2VkIGJ5IHBvd2VyVXAKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfTk9TVVBQT1JUIC0gc29mdCByZXNldCBhc2tlZCBmb3IgYnV0IG5vdCBzdXBwb3J0ZWQKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpICAgICAgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcFJlc2V0CisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZfQk9PTF90ICAgICAgICAgICAgICBzb2Z0LAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEsCisgIHZvc19jaGlwX3Jlc2V0X3JlYXNvbl90eXBlICAgIHJlYXNvbgorKTsKKworLyoqCisgIEBicmllZiB2b3NfY2hpcFZvdGVPblBBU3VwcGx5KCkgLSBUaGlzIEFQSSB3aWxsIHBvd2VyIHVwIHRoZSBQQSBzdXBwbHkKKworICBUaGlzIG9wZXJhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZiBzbywgdGhlIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwKKyAgYmUgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHQuIFRoZSBjYWxsYmFjayB3aWxsIAorICBiZSBjYWxsZWQgd2l0aCB0aGUgdXNlciBzdXBwbGllZCBkYXRhLiBJZiB0aGUgb3BlcmF0aW9uIGlzIGtub3duIHRvIGJlIAorICBzeW5jLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1cHBseSBhIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEuCisKKyAgQHBhcmFtIHN0YXR1cyBbb3V0XSA6IHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gd2lsbCBjb21wbGV0ZSBzeW5jIG9yIGFzeW5jCisgIEBwYXJhbSBjYWxsYmFjayBbaW5dIDogdXNlciBzdXBwbGllZCBjYWxsYmFjayBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlcworICBAcGFyYW0gdXNlcl9kYXRhIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNvbnRleHQgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGgKKworICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpICAgICAgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcFZvdGVPblBBU3VwcGx5CisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YQorKTsKKworLyoqCisgIEBicmllZiB2b3NfY2hpcFZvdGVPZmZQQVN1cHBseSgpIC0gVGhpcyBBUEkgd2lsbCB2b3RlIHRvIHR1cm4gb2ZmIHRoZSAKKyAgUEEgc3VwcGx5LiBFdmVuIGlmIHdlIHN1Y2NlZWQgaW4gdm90aW5nLCB0aGVyZSBpcyBhIGNoYW5jZSBQQSBzdXBwbHkgd2lsbCBub3QgCisgIGJlIHR1cm5lZCBvZmYuIFRoaXMgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGEgZmFpbHVyZS4KKworICBUaGlzIG9wZXJhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZiBzbywgdGhlIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwKKyAgYmUgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHQuIFRoZSBjYWxsYmFjayB3aWxsIAorICBiZSBjYWxsZWQgd2l0aCB0aGUgdXNlciBzdXBwbGllZCBkYXRhLiBJZiB0aGUgb3BlcmF0aW9uIGlzIGtub3duIHRvIGJlIAorICBzeW5jLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1cHBseSBhIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEuCisKKyAgQHBhcmFtIHN0YXR1cyBbb3V0XSA6IHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gd2lsbCBjb21wbGV0ZSBzeW5jIG9yIGFzeW5jCisgIEBwYXJhbSBjYWxsYmFjayBbaW5dIDogdXNlciBzdXBwbGllZCBjYWxsYmFjayBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlcworICBAcGFyYW0gdXNlcl9kYXRhIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNvbnRleHQgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGgKKworICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpIGNvdWxkIGJlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhlIHZvdGluZyBhbGdvcml0aG0gZGVjaWRlZCBub3QgdG8gcG93ZXIgZG93biBQQSAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwVm90ZU9mZlBBU3VwcGx5CisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YQorKTsKKworLyoqCisgIEBicmllZiB2b3NfY2hpcEFzc2VydERlZXBTbGVlcCgpIC0gVGhpcyBBUEkgd2lsbCBhc3NlcnQgdGhlIGRlZXAgCisgIHNsZWVwIHNpZ25hbCB0byBMaWJyYQorCisgIFRoaXMgb3BlcmF0aW9uIG1heSBiZSBhc3luY2hyb25vdXMuIElmIHNvLCB0aGUgc3VwcGxpZWQgY2FsbGJhY2sgd2lsbAorICBiZSBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdC4gVGhlIGNhbGxiYWNrIHdpbGwgCisgIGJlIGNhbGxlZCB3aXRoIHRoZSB1c2VyIHN1cHBsaWVkIGRhdGEuIElmIHRoZSBvcGVyYXRpb24gaXMga25vd24gdG8gYmUgCisgIHN5bmMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IGEgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YS4KKworICBAcGFyYW0gc3RhdHVzIFtvdXRdIDogd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIHN5bmMgb3IgYXN5bmMKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfRkFVTFQgLSB0aGUgb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGFuZCBhIGNhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlcl9kYXRhIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgKHN0YXR1cyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgCisgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGJ1dCBhbm90aGVyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHByb2dyZXNzIChzdGF0dXMgd2lsbCBiZSBzZXQgdG8gVk9TX0NBTExfQVNZTkMpICAKKyAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBvcGVyYXRpb24gZmFpbGVkIChzdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSkgICAgICAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwQXNzZXJ0RGVlcFNsZWVwCisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YQorKTsKKworLyoqCisgIEBicmllZiB2b3NfY2hpcERlQXNzZXJ0RGVlcFNsZWVwKCkgLSBUaGlzIEFQSSB3aWxsIGRlLWFzc2VydCB0aGUgZGVlcCBzbGVlcAorICBzaWduYWwgdG8gTGlicmEKKworICBUaGlzIG9wZXJhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZiBzbywgdGhlIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwKKyAgYmUgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHQuIFRoZSBjYWxsYmFjayB3aWxsIAorICBiZSBjYWxsZWQgd2l0aCB0aGUgdXNlciBzdXBwbGllZCBkYXRhLiBJZiB0aGUgb3BlcmF0aW9uIGlzIGtub3duIHRvIGJlIAorICBzeW5jLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1cHBseSBhIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEuCisKKyAgQHBhcmFtIHN0YXR1cyBbb3V0XSA6IHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gd2lsbCBjb21wbGV0ZSBzeW5jIG9yIGFzeW5jCisgIEBwYXJhbSBjYWxsYmFjayBbaW5dIDogdXNlciBzdXBwbGllZCBjYWxsYmFjayBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlcworICBAcGFyYW0gdXNlcl9kYXRhIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNvbnRleHQgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGgKKworICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpICAgICAgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcERlQXNzZXJ0RGVlcFNsZWVwCisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YQorKTsKKworLyoqCisgIEBicmllZiB2b3NfY2hpcFZvdGVPblJGU3VwcGx5KCkgLSBUaGlzIEFQSSB3aWxsIHBvd2VyIHVwIHRoZSBSRiBzdXBwbHkKKworICBUaGlzIG9wZXJhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZiBzbywgdGhlIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwKKyAgYmUgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHQuIFRoZSBjYWxsYmFjayB3aWxsIAorICBiZSBjYWxsZWQgd2l0aCB0aGUgdXNlciBzdXBwbGllZCBkYXRhLiBJZiB0aGUgb3BlcmF0aW9uIGlzIGtub3duIHRvIGJlIAorICBzeW5jLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1cHBseSBhIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEuCisKKyAgQHBhcmFtIHN0YXR1cyBbb3V0XSA6IHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gd2lsbCBjb21wbGV0ZSBzeW5jIG9yIGFzeW5jCisgIEBwYXJhbSBjYWxsYmFjayBbaW5dIDogdXNlciBzdXBwbGllZCBjYWxsYmFjayBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlcworICBAcGFyYW0gdXNlcl9kYXRhIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNvbnRleHQgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGgKKworICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpICAgICAgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcFZvdGVPblJGU3VwcGx5CisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YQorKTsKKworLyoqCisgIEBicmllZiB2b3NfY2hpcFZvdGVPZmZSRlN1cHBseSgpIC0gVGhpcyBBUEkgd2lsbCB2b3RlIHRvIHR1cm4gb2ZmIHRoZSAKKyAgUkYgc3VwcGx5LiBFdmVuIGlmIHdlIHN1Y2NlZWQgaW4gdm90aW5nLCB0aGVyZSBpcyBhIGNoYW5jZSBSRiBzdXBwbHkgd2lsbCBub3QgCisgIGJlIHR1cm5lZCBvZmYgYXMgUkYgcmFpbHMgY291bGQgYmUgc2hhcmVkIHdpdGggb3RoZXIgbW9kdWxlcyAob3V0c2lkZSBXTEFOKQorCisgIFRoaXMgb3BlcmF0aW9uIG1heSBiZSBhc3luY2hyb25vdXMuIElmIHNvLCB0aGUgc3VwcGxpZWQgY2FsbGJhY2sgd2lsbAorICBiZSBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdC4gVGhlIGNhbGxiYWNrIHdpbGwgCisgIGJlIGNhbGxlZCB3aXRoIHRoZSB1c2VyIHN1cHBsaWVkIGRhdGEuIElmIHRoZSBvcGVyYXRpb24gaXMga25vd24gdG8gYmUgCisgIHN5bmMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IGEgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YS4KKworICBAcGFyYW0gc3RhdHVzIFtvdXRdIDogd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIHN5bmMgb3IgYXN5bmMKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfRkFVTFQgLSB0aGUgb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGFuZCBhIGNhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlcl9kYXRhIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgKHN0YXR1cyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgCisgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGJ1dCBhbm90aGVyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHByb2dyZXNzIChzdGF0dXMgd2lsbCBiZSBzZXQgdG8gVk9TX0NBTExfQVNZTkMpICAKKyAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBvcGVyYXRpb24gZmFpbGVkIChzdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSkgY291bGQgYmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgdm90aW5nIGFsZ29yaXRobSBkZWNpZGVkIG5vdCB0byBwb3dlciBkb3duIFBBICAKKyAgVk9TX1NUQVRVU19TVUNDRVNTIC0gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIFNZTkMgKHdpbGwgYmUgc2V0KQorICAgICAgICAgICAgICAgICAgICAgICBPUiBvcGVyYXRpb24gc3RhcnRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIEFTWU5DICh3aWxsIGJlIHNldCkKKworKi8KK1ZPU19TVEFUVVMgdm9zX2NoaXBWb3RlT2ZmUkZTdXBwbHkKKygKKyAgdm9zX2NhbGxfc3RhdHVzX3R5cGUqIHN0YXR1cywKKyAgdm9zX3Bvd2VyX2NiX3R5cGUgICAgIGNhbGxiYWNrLAorICB2X1BWT0lEX3QgICAgICAgICAgICAgdXNlcl9kYXRhCispOworLyoqCisgIEBicmllZiB2b3NfY2hpcFZvdGVPbkJCQW5hbG9nU3VwcGx5KCkgLSBUaGlzIEFQSSB3aWxsIHBvd2VyIHVwIHRoZSBJL1Agdm9sdGFnZQorICB1c2VkIGJ5IEJhc2UgYmFuZCBBbmFsb2cuCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisKKyAgQHJldHVybiAKKyAgVk9TX1NUQVRVU19FX0lOVkFMIC0gc3RhdHVzIGlzIE5VTEwgCisgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHRoZSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYW5kIGEgY2FsbGJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyX2RhdGEgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCAoc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAKKyAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYnV0IGFub3RoZXIgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHN0YXR1cyB3aWxsIGJlIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgIAorICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIG9wZXJhdGlvbiBmYWlsZWQgKHN0YXR1cyB3aWxsIGJlIHNldCBhcHByb3ByaWF0ZWx5KSAgICAgICAKKyAgVk9TX1NUQVRVU19TVUNDRVNTIC0gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIFNZTkMgKHdpbGwgYmUgc2V0KQorICAgICAgICAgICAgICAgICAgICAgICBPUiBvcGVyYXRpb24gc3RhcnRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIEFTWU5DICh3aWxsIGJlIHNldCkKKworKi8KK1ZPU19TVEFUVVMgdm9zX2NoaXBWb3RlT25CQkFuYWxvZ1N1cHBseQorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEKKyk7CisKKy8qKgorICBAYnJpZWYgdm9zX2NoaXBWb3RlT2ZmQkJBbmFsb2dTdXBwbHkoKSAtIFRoaXMgQVBJIHdpbGwgdm90ZSBvZmYgdGhlIEJCIEFuYWxvZyBzdXBwbHkuCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisKKyAgQHJldHVybiAKKyAgVk9TX1NUQVRVU19FX0lOVkFMIC0gc3RhdHVzIGlzIE5VTEwgCisgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHRoZSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYW5kIGEgY2FsbGJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyX2RhdGEgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCAoc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAKKyAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYnV0IGFub3RoZXIgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHN0YXR1cyB3aWxsIGJlIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgIAorICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIG9wZXJhdGlvbiBmYWlsZWQgKHN0YXR1cyB3aWxsIGJlIHNldCBhcHByb3ByaWF0ZWx5KSBjb3VsZCBiZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSB2b3RpbmcgYWxnb3JpdGhtIGRlY2lkZWQgbm90IHRvIHBvd2VyIGRvd24gUEEgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcFZvdGVPZmZCQkFuYWxvZ1N1cHBseQorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEKKyk7CisvKioKKyAgQGJyaWVmIHZvc19jaGlwVm90ZU9uWE9CdWZmZXIoKSAtIFRoaXMgQVBJIHdpbGwgdm90ZSB0byB0dXJuIG9uIHRoZSBYTyBidWZmZXIgZnJvbQorICBQTUlDLiBUaGlzIEFQSSB3aWxsIGJlIHVzZWQgd2hlbiBMaWJyYSB1c2VzIHRoZSBUQ1hPIGZyb20gUE1JQyBvbiB0aGUgTVNNCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisKKyAgQHJldHVybiAKKyAgVk9TX1NUQVRVU19FX0lOVkFMIC0gc3RhdHVzIGlzIE5VTEwgCisgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHRoZSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYW5kIGEgY2FsbGJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyX2RhdGEgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCAoc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAKKyAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYnV0IGFub3RoZXIgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHN0YXR1cyB3aWxsIGJlIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgIAorICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIG9wZXJhdGlvbiBmYWlsZWQgKHN0YXR1cyB3aWxsIGJlIHNldCBhcHByb3ByaWF0ZWx5KSAgICAgICAKKyAgVk9TX1NUQVRVU19TVUNDRVNTIC0gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIFNZTkMgKHdpbGwgYmUgc2V0KQorICAgICAgICAgICAgICAgICAgICAgICBPUiBvcGVyYXRpb24gc3RhcnRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIEFTWU5DICh3aWxsIGJlIHNldCkKKworKi8KK1ZPU19TVEFUVVMgdm9zX2NoaXBWb3RlT25YT0J1ZmZlcgorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEKKyk7CisKKy8qKgorICBAYnJpZWYgdm9zX2NoaXBWb3RlT2ZmWE9CdWZmZXIoKSAtIFRoaXMgQVBJIHdpbGwgdm90ZSBvZmYgUE1JQyBYTyBidWZmZXIuCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisKKyAgQHJldHVybiAKKyAgVk9TX1NUQVRVU19FX0lOVkFMIC0gc3RhdHVzIGlzIE5VTEwgCisgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHRoZSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYW5kIGEgY2FsbGJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyX2RhdGEgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCAoc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAKKyAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYnV0IGFub3RoZXIgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHN0YXR1cyB3aWxsIGJlIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgIAorICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIG9wZXJhdGlvbiBmYWlsZWQgKHN0YXR1cyB3aWxsIGJlIHNldCBhcHByb3ByaWF0ZWx5KSBjb3VsZCBiZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSB2b3RpbmcgYWxnb3JpdGhtIGRlY2lkZWQgbm90IHRvIHBvd2VyIGRvd24gUEEgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcFZvdGVPZmZYT0J1ZmZlcgorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEKKyk7CisKKy8qKgorICBAYnJpZWYgdm9zX2NoaXBWb3RlWE9Db3JlKCkgLSBUaGlzIEFQSSB3aWxsIEZPUkNFIHZvdGUgT04gUE1JQyBYTyBDT1JFLgorCisgIFRoaXMgb3BlcmF0aW9uIG1heSBiZSBhc3luY2hyb25vdXMuIElmIHNvLCB0aGUgc3VwcGxpZWQgY2FsbGJhY2sgd2lsbAorICBiZSBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdC4gVGhlIGNhbGxiYWNrIHdpbGwgCisgIGJlIGNhbGxlZCB3aXRoIHRoZSB1c2VyIHN1cHBsaWVkIGRhdGEuIElmIHRoZSBvcGVyYXRpb24gaXMga25vd24gdG8gYmUgCisgIHN5bmMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IGEgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YS4KKworICBAcGFyYW0gc3RhdHVzIFtvdXRdIDogd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIHN5bmMgb3IgYXN5bmMKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorICBAcGFyYW0gZm9yY2VfZW5hYmxlW2luXSA6IHVzZXIgc3VwcGxpZWQgaW5wdXQgZm9yIHR1cm5pbmcgT04vT0ZGIFhvIENvcmUKKworICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpIGNvdWxkIGJlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhlIHZvdGluZyBhbGdvcml0aG0gZGVjaWRlZCBub3QgdG8gcG93ZXIgZG93biBQQSAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwVm90ZVhPQ29yZQorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEsCisgIHZfQk9PTF90ICAgICAgICAgICAgICBmb3JjZV9lbmFibGUKKyk7CisKKworLyoqCisgIEBicmllZiB2b3NfY2hpcFZvdGVGcmVxRm9yMXAzVlN1cHBseSgpIC0gVGhpcyBBUEkgd2lsbCB2b3RlIGZvciBmcmVxdWVuY3kgZm9yIDEuM1YgUkYgc3VwcGx5LgorICAKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEVWTSBpc3N1ZSBpcyBvYnNlcnZlZCB3aXRoIDEuNk1oeiBmcmVxIGZvciAxLjNWIHN1cHBseSBpbiB3bGFuIHN0YW5kYWxvbmUgY2FzZS4KKyAgRHVyaW5nIGNvbmN1cnJlbnQgb3BlcmF0aW9uIChlLmcuIFdMQU4gYW5kIFdDRE1BKSB0aGlzIGlzc3VlIGlzIG5vdCBvYnNlcnZlZC4gCisgIFRvIHdvcmthcm91bmQsIHdsYW4gd2lsbCB2b3RlIGZvciAzLjJNaHogZHVyaW5nIHN0YXJ0dXAgYW5kIHdpbGwgdm90ZSBmb3IgMS42TWh6CisgIGR1cmluZyBleGl0LgorICAgCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisgIEBwYXJhbSBmcmVxIFtpbl0gICAgIDogIEZyZXF1ZW5jeSBmb3IgMS4zViBTdXBwbHkgZm9yIHdoaWNoIFdMQU4gZHJpdmVyIG5lZWRzIHRvIHZvdGUgZm9yLgorICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpIGNvdWxkIGJlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhlIHZvdGluZyBhbGdvcml0aG0gZGVjaWRlZCBub3QgdG8gcG93ZXIgZG93biBQQSAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwVm90ZUZyZXFGb3IxcDNWU3VwcGx5CisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YSwKKyAgdl9VMzJfdCAgICAgICAgICAgICAgIGZyZXEKKyk7CisKKworI2VuZGlmIC8qIF9WT1NfUE9XRVJfSF8gKi8KZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9pbmMvdm9zX3N0YXR1cy5oIGIvQ09SRS9WT1NTL2luYy92b3Nfc3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0NmMwZAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVk9TUy9pbmMvdm9zX3N0YXR1cy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1ZPU19TVEFUVVNfSCApCisjZGVmaW5lIF9fVk9TX1NUQVRVU19ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB2b3NfU3RhdHVzLmgKKyAgCisgIFxicmllZiB2aXJ0dWFsIE9wZXJhdGluZyBTeXN0ZW0gU2VydmljZXMgKHZPU1MpIFN0YXR1cyBjb2RlcworICAgICAgICAgICAgICAgCisgICBCYXNpYyBzdGF0dXMgY29kZXMvZGVmaW5pdGlvbnMgdXNlZCBieSB2T1NTIAorICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bQoreworICAgLy8vIFJlcXVlc3Qgc3VjY2VlZGVkIQorICAgVk9TX1NUQVRVU19TVUNDRVNTLAorICAgCisgICAvLy8gUmVxdWVzdCBmYWlsZWQgYmVjYXVzZSBzeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkgdG8gCisgICAvLy8gZnVsZmlsbCByZXF1ZXN0IGFyZSBub3QgYXZhaWxhYmxlLiAKKyAgIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMsCisgIAorICAgLy8vIFJlcXVlc3QgZmFpbGVkIGJlY2F1c2Ugbm90IGVub3VnaCBtZW1vcnkgaXMgYXZhaWxhYmxlIHRvIAorICAgLy8vIGZ1bGZpbGwgdGhlIHJlcXVlc3QuCisgICBWT1NfU1RBVFVTX0VfTk9NRU0sICAKKyAgIAorICAgLy8vIFJlcXVlc3QgY291bGQgbm90IGJlIGZ1bGZpbGxlZCBhdCB0aGlzIHRpbWUuICBUcnkgYWdhaW4gbGF0ZXIuCisgICBWT1NfU1RBVFVTX0VfQUdBSU4sCisgICAKKyAgIC8vLyBSZXF1ZXN0IGZhaWxlZCBiZWNhdXNlIHRoZXJlIG9mIGFuIGludmFsaWQgcmVxdWVzdC4gIFRoaXMgaXMgCisgICAvLy8gdHlwaWNhbGx5IHRoZSByZXN1bHQgb2YgaW52YWxpZCBwYXJhbWV0ZXJzIG9uIHRoZSByZXF1ZXN0LgorICAgVk9TX1NUQVRVU19FX0lOVkFMLAorICAgCisgICAvLy8gUmVxdWVzdCBmYWlsZWQgYmVjYXVzZSBoYW5kbGluZyB0aGUgcmVxdWVzdCB3b3VsZCBjYXVzZSBhIAorICAgLy8vIHN5c3RlbSBmYXVsdC4gIFRoaXMgZXJyb3IgaXMgdHlwaWNhbGx5IHJldHVybmVkIHdoZW4gYW4gCisgICAvLy8gaW52YWxpZCBwb2ludGVyIHRvIG1lbW9yeSBpcyBkZXRlY3RlZC4KKyAgIFZPU19TVEFUVVNfRV9GQVVMVCwKKworICAgLy8vIFJlcXVlc3QgcmVmdXNlZCBiZWNheXNlIGEgcmVxdWVzdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzIGFuZCAKKyAgIC8vLyBhbm90aGVyIGNhbm5vdCBiZSBoYW5kbGVkIGN1cnJlbnRseS4KKyAgIFZPU19TVEFUVVNfRV9BTFJFQURZLAorICAgIAorICAgLy8vIFJlcXVlc3QgZmFpbGVkIGJlY2F1c2UgdGhlIG1lc3NhZ2UgKHR5cGUpIGlzIGJhZCwgaW52YWxpZCwgb3IKKyAgIC8vLyBub3QgcHJvcGVybHkgZm9ybWF0dGVkLgorICAgVk9TX1NUQVRVU19FX0JBRE1TRywKKworICAgLy8vIFJlcXVlc3QgZmFpbGVkIGJlY2F1c2UgZGV2aWNlIG9yIHJlc291cmNlIGlzIGJ1c3kuIAorICAgVk9TX1NUQVRVU19FX0JVU1ksCisKKyAgIC8vLyBSZXF1ZXN0IGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBpdCB3YXMgY2FuY2VsZWQuCisgICBWT1NfU1RBVFVTX0VfQ0FOQ0VMRUQsCisKKyAgIC8vLyBSZXF1ZXN0IGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBpdCB3YXMgYWJvcnRlZC4KKyAgIFZPU19TVEFUVVNfRV9BQk9SVEVELAorICAgCisgICAvLy8gUmVxdWVzdCBmYWlsZWQgYmVjYXVzZSB0aGUgcmVxdWVzdCBpcyB2YWxpZCwgdGhvdWdoIG5vdCBzdXBwb3J0ZWQKKyAgIC8vLyBieSB0aGUgZW50aXR5IHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QuCisgICBWT1NfU1RBVFVTX0VfTk9TVVBQT1JULAorICAgCisgICAvLy8gT3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQuCisgICBWT1NfU1RBVFVTX0VfUEVSTSwKKyAgIAorICAgLy8vIFJlcXVlc3QgZmFpbGVkIGJlY2F1c2Ugb2YgYW4gZW1wdHkgY29uZGl0aW9uCisgICBWT1NfU1RBVFVTX0VfRU1QVFksCisgIAorICAgLy8vIEV4aXN0YW5jZSBmYWlsdXJlLiAgT3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgYmVjYXVzZQorICAgLy8vIHNvbWV0aGluZyBleGlzdHMgb3IgZG9lcyBub3QgZXhpc3QuICAKKyAgIFZPU19TVEFUVVNfRV9FWElTVFMsCisgICAKKyAgIC8vLyBPcGVyYXRpb24gdGltZWQgb3V0CisgICBWT1NfU1RBVFVTX0VfVElNRU9VVCwKKyAgIAorICAgLy8vIFJlcXVlc3QgZmFpbGVkIGZvciBzb21lIHVua25vd24gcmVhc29uLiAgTm90ZSBkb24ndCB1c2UgdGhpcworICAgLy8vIHN0YXR1cyB1bmxlc3Mgbm90aGluZyBlbHNlIGFwcGxpZXMKKyAgIFZPU19TVEFUVVNfRV9GQUlMVVJFICAgCisKK30gVk9TX1NUQVRVUzsKKworLy8vIE1hY3JvIHRvIGRldGVybWluZSBpZiBhIFZPU19TVEFUVVMgdHlwZSBpcyBzdWNjZXNzLiAgQWxsIGNhbGxlcnMKKy8vLyB3YW50aW5nIHRvIGludGVycHJldCBWT1NfU1RBVFVTIHNob3VsZCB1c2UgdGhpcyBtYWNybyB0byBjaGVjayAKKy8vLyBmb3Igc3VjY2VzcyB0byBwcm90ZWN0IGFnYWluc3QgdGhlIFZPU19TVEFUVVMgZGVmaW5pdGlvbnMgCisvLy8gY2hhbmdpbmcuCisvLy8KKy8vLyBVc2UgbGlrZSB0aGlzLi4uCisvLy8KKy8vLyAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkgLi4uCisvLy8KKyNkZWZpbmUgVk9TX0lTX1NUQVRVU19TVUNDRVNTKCBzdGF0dXMgKSAoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSAoIHN0YXR1cyApICkKKworCisKKyNlbmRpZiAvLyBpZiAhZGVmaW5lZCBfX1ZPU19TVEFUVVNfSApkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL2luYy92b3NfdGhyZWFkcy5oIGIvQ09SRS9WT1NTL2luYy92b3NfdGhyZWFkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTczZjQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL3Zvc190aHJlYWRzLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fVk9TX1RIUkVBRFNfSCApCisjZGVmaW5lIF9fVk9TX1RIUkVBRFNfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgdm9zX3RocmVhZHMuaAorICAKKyAgXGJyaWVmIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWNlcyAodk9TUykgVGhyZWFkaW5nIEFQSXMKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkb2N1bWVuYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3NsZWVwKCkgLSBzbGVlcAorCisgIFRoZSBcYSB2b3Nfc2xlZXAoKSBmdW5jdGlvbiBzdXNwZW5kcyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjdXJyZW50IHRocmVhZAorICB1bnRpbCB0aGUgc3BlY2lmaWVkIHRpbWUgb3V0IGludGVydmFsIGVsYXBzZXMuCisgICAgIAorICBccGFyYW0gbXNJbnRlcnZhbCAtIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkLgorICBBIHZhbHVlIG9mIDAgbWF5IG9yIG1heSBub3QgY2F1c2UgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHlpZWxkLgorICAKKyAgXHJldHVybiBOb3RoaW5nLgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVk9JRF90IHZvc19zbGVlcCggdl9VMzJfdCBtc0ludGVydmFsICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19zbGVlcF91cygpIC0gc2xlZXAKKworICBUaGUgXGEgdm9zX3NsZWVwX3VzKCkgZnVuY3Rpb24gc3VzcGVuZHMgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY3VycmVudCB0aHJlYWQKKyAgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lIG91dCBpbnRlcnZhbCBlbGFwc2VzLgorICAgICAKKyAgXHBhcmFtIHVzSW50ZXJ2YWwgLSB0aGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyB0byBzdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgQSB2YWx1ZSBvZiAwIG1heSBvciBtYXkgbm90IGNhdXNlIHRoZSBjdXJyZW50IHRocmVhZCB0byB5aWVsZC4KKyAgCisgIFxyZXR1cm4gTm90aGluZy4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1ZPSURfdCB2b3Nfc2xlZXBfdXMoIHZfVTMyX3QgdXNJbnRlcnZhbCApOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19idXN5X3dhaXQoKSAtIGJ1c3kgd2FpdAorCisgIFRoZSBcYSB2b3NfYnVzeV93YWl0KCkgZnVuY3Rpb24gcGxhY2VzIHRoZSBjdXJyZW50IHRocmVhZCBpbiBidXN5IHdhaXQKKyAgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lIG91dCBpbnRlcnZhbCBlbGFwc2VzLiBJZiB0aGUgaW50ZXJ2YWwgaXMgZ3JlYXRlcgorICB0aGFuIDUwdXMgb24gV00sIHRoZSBiZWhhdmlvdXIgaXMgdW5kZWZpbmVkLgorICAgICAKKyAgXHBhcmFtIHVzSW50ZXJ2YWwgLSB0aGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyB0byBidXN5IHdhaXQuIAorICAKKyAgXHJldHVybiBOb3RoaW5nLgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVk9JRF90IHZvc19idXN5X3dhaXQoIHZfVTMyX3QgdXNJbnRlcnZhbCApOworCisjZW5kaWYgLy8gX19WT1NfVEhSRUFEU19ICmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL3Zvc190aW1lci5oIGIvQ09SRS9WT1NTL2luYy92b3NfdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjljMDJjCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy92b3NfdGltZXIuaApAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19WT1NfVElNRVJfSCApCisjZGVmaW5lIF9fVk9TX1RJTUVSX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHZvc190aW1lci5oCisgIAorICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpZXMgKHZPUykKKyAgICAgICAgICAgICAgIAorICAgRGVmaW5pdGlvbnMgZm9yIHZPU1MgVGltZXIgc2VydmljZXMKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx2b3NfdHlwZXMuaD4KKyNpbmNsdWRlIDx2b3Nfc3RhdHVzLmg+CisjaW5jbHVkZSA8dm9zX2xvY2suaD4KKyNpbmNsdWRlIDxpX3Zvc190aW1lci5oPgorCisjaWZkZWYgVElNRVJfTUFOQUdFUgorI2luY2x1ZGUgIndsYW5faGRkX2RwX3V0aWxzLmgiCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgVk9TX1RJTUVSX1NUQVRFX0NPT0tJRSAweDEyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLy8gdm9zIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3RvdHlwZSAod2VsbCwgYWN0dWFsbHkgYSBwcm90b3R5cGUgZm9yIAorLy8vIGEgcG9pbnRlciB0byB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uKQordHlwZWRlZiB2X1ZPSURfdCAoICp2b3NfdGltZXJfY2FsbGJhY2tfdCApKCB2X1BWT0lEX3QgdXNlckRhdGEgKTsKKwordHlwZWRlZiBlbnVtCit7CisgICAvLy8gcHVyZSBzb2Z0d2FyZSB0aW1lci4gIE5vIGd1YXJhbnRlZSB0aGUgYXBwcyBwcm9jZXNzb3Igd2lsbAorICAgLy8vIGF3YWtlbiB3aGVuIHRoZXNlIHRpbWVycyBleHBpcmUuCisgICBWT1NfVElNRVJfVFlQRV9TVywKKyAgIAorICAgLy8vIFRoZXNlIHRpbWVycyBjYW4gYXdha2VuIHRoZSBBcHBzIHByb2Nlc3NvciBmcm9tIHBvd2VyIGNvbGxhcHNlCisgICAvLy8gd2hlbiB0aGVzZSB0aW1lcnMgZXhwaXJlLgorICAgLy8vIFx0b2RvIEkgcmVhbGx5IGRvbnQgbGlrZSB0aGlzIG5hbWUgOi0pCisgICBWT1NfVElNRVJfVFlQRV9XQUtFX0FQUFMKKworfSBWT1NfVElNRVJfVFlQRTsKKwordHlwZWRlZiBlbnVtCit7CisgICBWT1NfVElNRVJfU1RBVEVfVU5VU0VEID0gVk9TX1RJTUVSX1NUQVRFX0NPT0tJRSwKKyAgIFZPU19USU1FUl9TVEFURV9TVE9QUEVELAorICAgVk9TX1RJTUVSX1NUQVRFX1NUQVJUSU5HLAorICAgVk9TX1RJTUVSX1NUQVRFX1JVTk5JTkcsCit9IFZPU19USU1FUl9TVEFURTsKKworI2lmZGVmIFRJTUVSX01BTkFHRVIKK3N0cnVjdCB2b3NfdGltZXJfczsKK3R5cGVkZWYgc3RydWN0IHRpbWVyX25vZGVfcworeworICAgaGRkX2xpc3Rfbm9kZV90IHBOb2RlOworICAgY2hhciogZmlsZU5hbWU7CisgICB1bnNpZ25lZCBpbnQgbGluZU51bTsKKyAgIHN0cnVjdCB2b3NfdGltZXJfcyAqdm9zVGltZXI7Cit9dGltZXJfbm9kZV90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHZvc190aW1lcl9zCit7CisjaWZkZWYgVElNRVJfTUFOQUdFUgorICAgdGltZXJfbm9kZV90ICpwdGltZXJOb2RlOworI2VuZGlmCisKKyAgIHZvc190aW1lcl9wbGF0Zm9ybV90IHBsYXRmb3JtSW5mbzsKKyAgIHZvc190aW1lcl9jYWxsYmFja190IGNhbGxiYWNrOworICAgdl9QVk9JRF90ICAgICAgICAgICAgdXNlckRhdGE7CisgICB2b3NfbG9ja190ICAgICAgICAgICBsb2NrOworICAgVk9TX1RJTUVSX1RZUEUgICAgICAgdHlwZTsKKyAgIFZPU19USU1FUl9TVEFURSAgICAgIHN0YXRlOworfSB2b3NfdGltZXJfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFRJTUVSX01BTkFHRVIKK3ZvaWQgdm9zX3RpbWVyX21hbmFnZXJfaW5pdCh2b2lkKTsKK3ZvaWQgdm9zX3RpbWVyX2V4aXQodm9pZCk7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfdGltZXJfZ2V0Q3VycmVudFN0YXRlKCkgLSBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRpbWVyCisKKyAgXHBhcmFtIHBUaW1lciAtIHRoZSB0aW1lciBvYmplY3QKKyAgCisgIFxyZXR1cm4gdGltZXIgc3RhdGUKKyAgCisgIFxzYQorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfVElNRVJfU1RBVEUgdm9zX3RpbWVyX2dldEN1cnJlbnRTdGF0ZSggdm9zX3RpbWVyX3QgKnBUaW1lciApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3RpbWVyX2luaXQoKSAtIEluaXRpYWxpemUgYSB2T1NTIHRpbWVyLgorCisgIFRoaXMgQVBJIGluaXRpYWxpemVzIGEgdk9TIFRpbWVyIG9iamVjdC4gCisgIAorICBUaGUgXGEgdm9zX3RpbWVyX2luaXQoKSBpbml0aWFsaXplcyBhIHZPUyBUaW1lciBvYmplY3QuICBBIHRpbWVyIG11c3QgYmUgCisgIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgdm9zX3RpbWVyX2luaXRpYWxpemUoKSBiZWZvcmUgaXQgbWF5IGJlIHVzZWQgaW4gCisgIGFueSBvdGhlciB0aW1lciBmdW5jdGlvbnMuIAorICAKKyAgQXR0ZW1wdGluZyB0byBpbml0aWFsaXplIHRpbWVyIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCByZXN1bHRzIGluIAorICBhIGZhaWx1cmUuIEEgZGVzdHJveWVkIHRpbWVyIG9iamVjdCBjYW4gYmUgcmUtaW5pdGlhbGl6ZWQgd2l0aCBhIGNhbGwgdG8KKyAgXGEgdm9zX3RpbWVyX2luaXQoKS4gIFRoZSByZXN1bHRzIG9mIG90aGVyd2lzZSByZWZlcmVuY2luZyB0aGUgb2JqZWN0IAorICBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgYXJlIHVuZGVmaW5lZC4gIAorICAKKyAgQ2FsbHMgdG8gdk9TUyB0aW1lciBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgdGltZXIgc3VjaAorICBhcyB2b3NfdGltZXJfc2V0KCkgd2lsbCBmYWlsIGlmIHRoZSB0aW1lciBpcyBub3QgaW5pdGlhbGl6ZWQgb3IgaGFzCisgIGJlZW4gZGVzdHJveWVkLiAgVGhlcmVmb3JlLCBkb24ndCB1c2UgdGhlIHRpbWVyIGFmdGVyIGl0IGhhcyBiZWVuIAorICBkZXN0cm95ZWQgdW50aWwgaXQgaGFzIGJlZW4gcmUtaW5pdGlhbGl6ZWQuCisgIAorICBBbGwgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCB3aXRoaW4gdGhlIFZPUyBtYWluIHRocmVhZCB1bmxlc3MgaXQgaXMgCisgIGluaXRpYWxpemVkIGZyb20gdGhlIFR4IHRocmVhZCBmbG93LCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmUgZXhlY3V0ZWQKKyAgd2l0aGluIHRoZSB0eCB0aHJlYWQgZmxvdy4KKyAgCisgIFxwYXJhbSB0aW1lciAtIHBvaW50ZXIgdG8gdGhlIG9wYXF1ZSB0aW1lciBvYmplY3QgdG8gaW5pdGlhbGl6ZQorICAKKyAgXHBhcmFtIHRpbWVyVHlwZSAtIHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aW1lci4gIFdlIGhhdmUgdHdvIGRpZmZlcmVudAorICAgICAgICAgICAgICAgICAgICAgdGltZXIgdHlwZXMuCisgICAgPG9sPgorICAgICAgPGxpPiBWT1NfVElNRVJfVFlQRV9TVyAtIFB1cmUgc29mdHdhcmUgdGltZXIuIFRoZSBBcHBzIHByb2Nlc3NvcgorICAgICAgICAgICBtYXkgbm90IGJlIGF3b2tlbiB3aGVuIHRoaXMgdGltZXIgZXhwaXJlcy4KKyAgICAgIDxsaT4gVk9TX1RJTUVSX1RZUEVfV0FLRV9BUFBTIC0gVGhlIEFwcHMgcHJvY2Vzc29yIHdpbGwgYmUgYXdva2VuCisgICAgICAgICAgIGZyb20gcG93ZXIgY29sbGFwc2Ugd2hlbiB0aGlzIHR5cGUgb2YgdGltZXIgZXhwaXJlcy4KKyAgICAgPC9vbD4gICAgICAgICAgICAgICAgICAgICAgCisgIAorICBccGFyYW0gY2FsbGJhY2sgLSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHRpbWVyCisgICAgICAgICBleHBpcmVzLgorICAgICAgICAgCisgIFxwYXJhbSB1c2VyRGF0YSAtIGEgdXNlciBkYXRhIChvciBjb250ZXh0KSB0aGF0IGlzIHJldHVybmVkIHRvIHRoZSAKKyAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGEgcGFyYW1ldGVyIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuICAgICAgICAgCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRpbWVyIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIAorICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgLSBTeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkgCisgICAgICAgICAgYXJlIHVuYXZhaWxhYmxlIHRvIGluaXRpYWxpemUgdGhlIHRpbWVyCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfTk9NRU0gLSBpbnN1ZmZpY2llbnQgbWVtb3J5IGV4aXN0cyB0byBpbml0aWFsaXplIAorICAgICAgICAgIHRoZSB0aW1lcgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0JVU1kgLSBUaGUgaW1wbGVtZW50YXRpb24gaGFzIGRldGVjdGVkIGFuIGF0dGVtcHQgCisgICAgICAgICAgdG8gaW5pdGlhbGl6ZSB0aGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgdGltZXIsIGEgcHJldmlvdXNseSAKKyAgICAgICAgICBpbml0aWFsaXplZCBidXQgbm90IHlldCBkZXN0cm95ZWQgdGltZXIuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gdGltZXIgaXMgYW4gaW52YWxpZCBwb2ludGVyLiAgICAgCisgIFxzYQorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgVElNRVJfTUFOQUdFUgorI2RlZmluZSB2b3NfdGltZXJfaW5pdCh0aW1lciwgdGltZXJUeXBlLCBjYWxsYmFjaywgdXNlcmRhdGEpIFwKKyAgICAgIHZvc190aW1lcl9pbml0X2RlYnVnKHRpbWVyLCB0aW1lclR5cGUsIGNhbGxiYWNrLCB1c2VyZGF0YSwgX19GSUxFX18sIF9fTElORV9fKQorICAgICAgCitWT1NfU1RBVFVTIHZvc190aW1lcl9pbml0X2RlYnVnKCB2b3NfdGltZXJfdCAqdGltZXIsIFZPU19USU1FUl9UWVBFIHRpbWVyVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfdGltZXJfY2FsbGJhY2tfdCBjYWxsYmFjaywgdl9QVk9JRF90IHVzZXJEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGZpbGVOYW1lLCB2X1UzMl90IGxpbmVOdW0gKTsgICAgICAKKyNlbHNlCitWT1NfU1RBVFVTIHZvc190aW1lcl9pbml0KCB2b3NfdGltZXJfdCAqdGltZXIsIFZPU19USU1FUl9UWVBFIHRpbWVyVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfdGltZXJfY2FsbGJhY2tfdCBjYWxsYmFjaywgdl9QVk9JRF90IHVzZXJEYXRhICk7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfdGltZXJfZGVzdHJveSgpIC0gRGVzdHJveSBhIHZPU1MgVGltZXIgb2JqZWN0CisKKyAgVGhlIFxhIHZvc190aW1lcl9kZXN0cm95KCkgZnVuY3Rpb24gc2hhbGwgZGVzdHJveSB0aGUgdGltZXIgb2JqZWN0LgorICBBZnRlciBhIHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gXGEgdm9zX3RpbWVyX2Rlc3Ryb3koKSB0aGUgdGltZXIgCisgIG9iamVjdCBiZWNvbWVzLCBpbiBlZmZlY3QsIHVuaW5pdGlhbGl6ZWQuCisgICAKKyAgQSBkZXN0cm95ZWQgdGltZXIgb2JqZWN0IGNhbiBiZSByZS1pbml0aWFsaXplZCBieSBjYWxsaW5nCisgIHZvc190aW1lcl9pbml0KCkuICBUaGUgcmVzdWx0cyBvZiBvdGhlcndpc2UgcmVmZXJlbmNpbmcgdGhlIG9iamVjdCAKKyAgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVzdHJveWVkIGFyZSB1bmRlZmluZWQuICAKKyAgCisgIENhbGxzIHRvIHZPU1MgdGltZXIgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdGhlIHRpbWVyLCBzdWNoCisgIGFzIHZvc190aW1lcl9zZXQoKSB3aWxsIGZhaWwgaWYgdGhlIGxvY2sgaXMgZGVzdHJveWVkLiAgVGhlcmVmb3JlLCAKKyAgZG9uJ3QgdXNlIHRoZSB0aW1lciBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgdW50aWwgaXQgaGFzIAorICBiZWVuIHJlLWluaXRpYWxpemVkLgorICAKKyAgXHBhcmFtIHRpbWVyIC0gdGhlIHRpbWVyIG9iamVjdCB0byBiZSBkZXN0cm95ZWQuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRpbWVyIHdhcyBzdWNjZXNzZnVsbHkgZGVzdHJveWVkLgorICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfQlVTWSAtIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgZGV0ZWN0ZWQgYW4gYXR0ZW1wdCAKKyAgICAgICAgICB0byBkZXN0cm95IHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSB0aW1lciB3aGlsZSBpdCBpcyBzdGlsbCAKKyAgICAgICAgICBzdGlsbCByZWZlcmVuY2VkLiAgVGhlIHRpbWVyIG11c3QgYmUgc3RvcHBlZCBiZWZvcmUgaXQgY2FuIGJlIAorICAgICAgICAgIGRlc3Ryb3llZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGltZXIgaXMgaW52YWxpZC4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gdGltZXIgaXMgYW4gaW52YWxpZCBwb2ludGVyLiAgICAgCisgIFxzYQorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc190aW1lcl9kZXN0cm95KCB2b3NfdGltZXJfdCAqdGltZXIgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3RpbWVyX3N0YXJ0KCkgLSBTdGFydCBhIHZPU1MgVGltZXIgb2JqZWN0CisKKyAgVGhlIFxhIHZvc190aW1lcl9zdGFydCgpIGZ1bmN0aW9uIHN0YXJ0cyBhIHRpbWVyIHRvIGV4cGlyZSBhZnRlciB0aGUgCisgIHNwZWNpZmllZCBpbnRlcnZhbCwgdGh1cyBydW5uaW5nIHRoZSB0aW1lciBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIAorICB0aGUgaW50ZXJ2YWwgZXhwaXJlcy4KKyAgIAorICBBIHRpbWVyIG9ubHkgcnVucyBvbmNlIChhIG9uZS1zaG90IHRpbWVyKS4gIFRvIHJlLXN0YXJ0IHRoZSAKKyAgdGltZXIsIHZvc190aW1lcl9zdGFydCgpIGhhcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHRpbWVyIHJ1bnMgCisgIG9yIGhhcyBiZWVuIGNhbmNlbGxlZC4KKyAgCisgIFxwYXJhbSB0aW1lciAtIHRoZSB0aW1lciBvYmplY3QgdG8gYmUgc3RhcnRlZAorICAKKyAgXHBhcmFtIGV4cGlyYXRpb25UaW1lIC0gZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgdGltZXIgKGluIG1pbGxpc2Vjb25kcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGV4cGlyYXRpb24gdGltZSBjYW5ub3QgYmUgbGVzcyB0aGFuIDEwIG1zLgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aW1lciB3YXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuCisgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gVGhlIGltcGxlbWVudGF0aW9uIGhhcyBkZXRlY3RlZCBhbiBhdHRlbXB0IAorICAgICAgICAgIHRvIHN0YXJ0IGEgdGltZXIgd2hpbGUgaXQgaXMgYWxyZWFkeSBzdGFydGVkLiAgVGhlIHRpbWVyIG11c3QgCisgICAgICAgICAgYmUgc3RvcHBlZCBvciBleHBpcmUgYmVmb3JlIGl0IGNhbiBiZSBzdGFydGVkIGFnYWluLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aW1lciBpcyBpbnZhbGlkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSB0aW1lciBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3RpbWVyX3N0YXJ0KCB2b3NfdGltZXJfdCAqdGltZXIsIHZfVTMyX3QgZXhwaXJhdGlvblRpbWUgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3RpbWVyX3N0b3AoKSAtIFN0b3AgYSB2T1NTIFRpbWVyCisKKyAgVGhlIFxhIHZvc190aW1lcl9zdG9wKCkgZnVuY3Rpb24gc3RvcHMgYSB0aW1lciB0aGF0IGhhcyBiZWVuIHN0YXJ0ZWQgYnV0CisgIGhhcyBub3QgZXhwaXJlZCwgZXNzZW50aWFsbHkgY2FuY2VsbGluZyB0aGUgJ3N0YXJ0JyByZXF1ZXN0LgorICAgCisgIEFmdGVyIGEgdGltZXIgaXMgc3RvcHBlZCwgaXQgZ29lcyBiYWNrIHRvIHRoZSBzdGF0ZSBpdCB3YXMgaW4gYWZ0ZXIgaXQKKyAgd2FzIGNyZWF0ZWQgYW5kIGNhbiBiZSBzdGFydGVkIGFnYWluIHZpYSBhIGNhbGwgdG8gdm9zX3RpbWVyX3N0YXJ0KCkuCisgIAorICBccGFyYW0gdGltZXIgLSB0aGUgdGltZXIgb2JqZWN0IHRvIGJlIHN0b3BwZWQKKyAgICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aW1lciB3YXMgc3VjY2Vzc2Z1bGx5IHN0b3BwZWQuCisgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgZGV0ZWN0ZWQgYW4gYXR0ZW1wdCAKKyAgICAgICAgICB0byBzdG9wIGEgdGltZXIgdGhhdCBoYXMgbm90IGJlZW4gc3RhcnRlZCBvciBoYXMgYWxyZWFkeSAKKyAgICAgICAgICBleHBpcmVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aW1lciBpcyBpbnZhbGlkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSB0aW1lciBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfdGltZXJfc3RvcCggdm9zX3RpbWVyX3QgKnRpbWVyICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCkgLSBHZXQgdGhlIHN5c3RlbSB0aW1lIGluIDEwbXMgdGlja3MKKworICBUaGUgXGEgdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IG51bWJlcgorICBvZiB0aW1lciB0aWNrcyBpbiAxMG1zZWMgaW50ZXJ2YWxzLiAgVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSB0aW1lc3RhbXBpbmcKKyAgYW5kIGNhbGN1bGF0aW5nIHRpbWUgaW50ZXJ2YWxzIGJ5IGNhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIAorICB0aW1lc3RhbXBzLgorICAgIAorICBccmV0dXJucyAtIFRoZSBjdXJyZW50IHN5c3RlbSB0aWNrIGNvdW50IChpbiAxMG1zZWMgaW50ZXJ2YWxzKS4gIFRoaXMgCisgICAgICAgICAgICAgZnVuY3Rpb24gY2Fubm90IGZhaWwuCisgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1RJTUVfdCB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aWNrcyggdl9WT0lEX3QgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgCisgIFxicmllZiB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCkgLSBHZXQgdGhlIHN5c3RlbSB0aW1lIGluIG1pbGxpc2Vjb25kcworCisgIFRoZSBcYSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aW1lKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyAKKyAgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIHN5c3RlbSB3YXMgc3RhcnRlZAorICAgIAorICBccmV0dXJucyAtIFRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGluIG1pbGxpc2Vjb25kcy4KKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVElNRV90IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpbWUoIHZfVk9JRF90ICk7CisKKworCisjZW5kaWYgLy8gI2lmICFkZWZpbmVkIF9fVk9TU19USU1FUl9ICmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL3Zvc190cmFjZS5oIGIvQ09SRS9WT1NTL2luYy92b3NfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhiYjUwCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy92b3NfdHJhY2UuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19WT1NfVFJBQ0VfSCApCisjZGVmaW5lIF9fVk9TX1RSQUNFX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHZvc190cmFjZS5oCisgIAorICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpZXMgKHZPUykKKyAgICAgICAgICAgICAgIAorICAgVHJhY2UsIGxvZ2dpbmcsIGFuZCBkZWJ1Z2dpbmcgZGVmaW5pdGlvbnMgYW5kIEFQSXMKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICA8dm9zX3R5cGVzLmg+ICAvLyBGb3IgVk9TX01PRFVMRV9JRC4uLgorI2luY2x1ZGUgIDxzdGRhcmcuaD4gICAgICAgLy8gRm9yIHZhX2xpc3QuLi4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgVHlwZSBkZWNsYXJhdGlvbnMgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSAKK3sKKyAgIC8vIE5PTkUgbWVhbnMgTk8gdHJhY2VzIHdpbGwgYmUgbG9nZ2VkLiAgVGhpcyB2YWx1ZSBpcyBpbiBwbGFjZSBmb3IgdGhlIAorICAgLy8gdm9zX3RyYWNlX3NldGxldmVsKCkgdG8gYWxsb3cgdGhlIHVzZXIgdG8gdHVybiBvZmYgYWxsIHRyYWNlcy4KKyAgIFZPU19UUkFDRV9MRVZFTF9OT05FID0gMCwKKyAgIAorICAgLy8gdGhlIGZvbGxvd2luZyB0cmFjZSBsZXZlbHMgYXJlIHRoZSBvbmVzIHRoYXQgJ2NhbGxlcnMnIG9mIFZPU19UUkFDRSgpCisgICAvLyBjYW4gc3BlY2lmeSBpbiBmb3IgdGhlIFZPU19UUkFDRV9MRVZFTCBwYXJhbWV0ZXIuICBUcmFjZXMgYXJlIGNsYXNzaWZpZWQKKyAgIC8vIGJ5IHNldmVyaXR5IChGQVRBTCBiZWluZyBtb3JlIHNlcmlvdXMgdGhhbiBJTkZPIGZvciBleGFtcGxlKS4gICAKKyAgIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIAorICAgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELAorICAgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorCisgICAvLyBBTEwgbWVhbnMgYWxsIHRyYWNlIGxldmVscyB3aWxsIGJlIGFjdGl2ZS4gIFRoaXMgdmFsdWUgaXMgaW4gcGxhY2UgZm9yIHRoZSAKKyAgIC8vIHZvc190cmFjZV9zZXRsZXZlbCgpIHRvIGFsbG93IHRoZSB1c2VyIHRvIHR1cm4gT04gYWxsIHRyYWNlcy4KKyAgIFZPU19UUkFDRV9MRVZFTF9BTEwsIAorCisgICAKKyAgIC8vIG5vdCBhIHJlYWwgbGV2ZWwuICBVc2VkIHRvIGlkZW50aWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiAKKyAgIC8vIFZPU19UUkFDRV9MRVZFTHMgZGVmaW5lZC4KKyAgIFZPU19UUkFDRV9MRVZFTF9NQVggICAKKyAgICAKK30gVk9TX1RSQUNFX0xFVkVMOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBBU1NFUlRfQlVGRkVSX1NJWkUgKCA1MTIgKQorCisvLyBiZWxvdyBkZWZpbml0aW9uIGlzIG9ic29sZXRlIGFuZCBpcyBubyBsb25nZXIgYmVpbmcgdXNlZCBpbiBCTVAgYW5kIFdNCisvLyBUT0RPOiByZW1vdmUgdGhpcyBvbmNlIHRoaXMgaXMgbm90IHVzZWQgb24gQW5kcm9pZAorI2RlZmluZSBWT1NfRU5BQkxFX1RSQUNJTkcgCisKKyNpbmNsdWRlICA8aV92b3NfdHJhY2UuaD4gICAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc190cmFjZV9zZXRMZXZlbCgpIC0gU2V0IHRoZSB0cmFjZSBsZXZlbCBmb3IgYSBwYXJ0aWN1bGFyIG1vZHVsZQorICAKKyAgVGhpcyBpcyBhbiBleHRlcm5hbCBBUEkgdGhhdCBhbGxvd3MgdHJhY2UgbGV2ZWxzIHRvIGJlIHNldCBmb3IgZWFjaCBtb2R1bGUuCisgIAorICBccGFyYW0gbGV2ZWwgLSB0cmFjZSBsZXZlbC4gICBBIG1lbWJlciBvZiB0aGUgVk9TX1RSQUNFX0xFVkVMIAorICAgICAgICAgZW51bWVyYXRpb24gaW5kaWNhdGluZyB0aGUgc2V2ZXJpdHkgb2YgdGhlIGNvbmRpdGlvbiBjYXVzaW5nIHRoZQorICAgICAgICAgdHJhY2UgbWVzc2FnZSB0byBiZSBpc3N1ZWQuICAgTW9yZSBzZXZlcmUgY29uZGl0aW9ucyBhcmUgbW9yZSAKKyAgICAgICAgIGxpa2VseSB0byBiZSBsb2dnZWQuCisgICAgICAgICAKKyAgXHJldHVybiAgbm90aGluZworICAgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCB2b3NfdHJhY2Vfc2V0TGV2ZWwoIFZPU19NT0RVTEVfSUQgbW9kdWxlLCBWT1NfVFJBQ0VfTEVWRUwgbGV2ZWwgKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc190cmFjZV9nZXRMZXZlbCgpIC0gR2V0IHRoZSB0cmFjZSBsZXZlbAorICAKKyAgVGhpcyBpcyBhbiBleHRlcm5hbCBBUEkgdGhhdCByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSB0byBzaWduaWZ5IGlmIGEgCisgIHBhcnRpY3VsYXIgdHJhY2UgbGV2ZWwgaXMgc2V0IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4KKyAgCisgIFxwYXJhbSBsZXZlbCAtIHRyYWNlIGxldmVsLiAgIEEgbWVtYmVyIG9mIHRoZSBWT1NfVFJBQ0VfTEVWRUwgZW51bWVyYXRpb24gCisgICAgICAgICAgICAgICAgIGluZGljYXRpbmcgdGhlIHNldmVyaXR5IG9mIHRoZSBjb25kaXRpb24gY2F1c2luZyB0aGUgdHJhY2UgCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgaXNzdWVkLgorICAgICAgICAgCisgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBpbmRpdmlkdWFsIHRyYWNlIGxldmVscyBhcmUgdGhlIG9ubHkgdmFsaWQgdmFsdWVzCisgICAgICAgICAgICAgICAgIGZvciB0aGlzIEFQSS4gIFZPU19UUkFDRV9MRVZFTF9OT05FIGFuZCBWT1NfVFJBQ0VfTEVWRUxfQUxMCisgICAgICAgICAgICAgICAgIGFyZSBub3QgdmFsaWQgaW5wdXQgYW5kIHdpbGwgcmV0dXJuIEZBTFNFCisKKyAgXHJldHVybiAgVk9TX0ZBTFNFIC0gdGhlIHNwZWNpZmllZCB0cmFjZSBsZXZlbCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUgaXMgT0ZGIAorICAgIAorICAgICAgICAgICBWT1NfVFJVRSAtIHRoZSBzcGVjaWZpZWQgdHJhY2UgbGV2ZWwgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlIGlzIE9OCisgICAgCisgIFxzYSB2b3NfdHJhY2Vfc2V0TGV2ZWwoKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X0JPT0xfdCB2b3NfdHJhY2VfZ2V0TGV2ZWwoIFZPU19NT0RVTEVfSUQgbW9kdWxlLCBWT1NfVFJBQ0VfTEVWRUwgbGV2ZWwgKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL3Zvc190eXBlcy5oIGIvQ09SRS9WT1NTL2luYy92b3NfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM3Mzg5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy92b3NfdHlwZXMuaApAQCAtMCwwICsxLDUxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19WT1NfVFlQRVNfSCApCisjZGVmaW5lIF9fVk9TX1RZUEVTX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHZvc19UeXBlcy5oCisgIAorICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpZXMgKHZPUykKKyAgICAgICAgICAgICAgIAorICAgQmFzaWMgdHlwZSBkZWZpbml0aW9ucyAKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJpX3Zvc190eXBlcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gbWFjcm8gdG8gZ2V0IG1heGltdW0gb2YgdHdvIHZhbHVlcy4KKyNkZWZpbmUgVk9TX01BWCggX3gsIF95ICkgKCAoIChfeCkgPiAoX3kpICkgPyAoX3gpIDogKF95KSApICAKKworLy8gbWFjcm8gdG8gZ2V0IG1pbmltdW0gb2YgdHdvIHZhbHVlcworI2RlZmluZSBWT1NfTUlOKCBfeCwgX3kgKSAoICggKF94KSA8IChfeSkgKSA/IChfeCkgOiAoX3kpICApICAKKworLy8gbWFjcm8gdG8gZ2V0IHRoZSBjZWlsaW5nIG9mIGFuIGludGVnZXIgZGl2aXNpb24gb3BlcmF0aW9uLi4uCisjZGVmaW5lIFZPU19DRUlMX0RJViggX2EsIF9iICkgKCAwICE9IChfYSkgJSAoX2IpICkgPyAoIChfYSkgLyAoX2IpICsgMSApIDogKCAoX2EpIC8gKF9iKSApIAorCisvLyBtYWNybyB0byByZXR1cm4gdGhlIGZsb29yIG9mIGFuIGludGVnZXIgZGl2aXNpb24gb3BlcmF0aW9uCisjZGVmaW5lIFZPU19GTE9PUl9ESVYoIF9hLCBfYiApICggKCAoX2EpIC0gKCAoX2EpICUgKF9iKSApICkgLyAoX2IpICkKKworI2RlZmluZSBWT1NfU1dBUF9VMTYoX3gpIFwKKyAgICggKCAoIChfeCkgPDwgOCApICYgMHhGRjAwICkgfCAoICggKF94KSA+PiA4ICkgJiAweDAwRkYgKSApCisKKyNkZWZpbmUgVk9TX1NXQVBfVTMyKF94KSBcCisgICAoICggKCAoX3gpIDw8IDI0ICkgJiAweEZGMDAwMDAwICkgfCAoICggKF94KSA+PiAyNCApICYgMHgwMDAwMDBGRiApICkgfCBcCisgICAoICggKCAoX3gpIDw8IDggKSAmIDB4MDBGRjAwMDAgKSB8ICggKCAoX3gpID4+IDggKSAmIDB4MDAwMEZGMDAgKSApCisKKy8vIEVuZGlhbiBvcGVyYXRpb25zIGZvciBCaWcgRW5kaWFuIGFuZCBTbWFsbCBFbmRpYW4gbW9kZXMKKyNpZmRlZiBBTklfTElUVExFX0JZVEVfRU5ESUFOCisKKyNkZWZpbmUgdm9zX2NwdV90b19iZTMyKF94KSBWT1NfU1dBUF9VMzIoX3gpCisjZGVmaW5lIHZvc19iZTMyX3RvX2NwdShfeCkgVk9TX1NXQVBfVTMyKF94KQorI2RlZmluZSB2b3NfY3B1X3RvX2JlMTYoX3gpIFZPU19TV0FQX1UxNihfeCkKKyNkZWZpbmUgdm9zX2JlMTZfdG9fY3B1KF94KSBWT1NfU1dBUF9VMTYoX3gpCisjZGVmaW5lIHZvc19jcHVfdG9fbGUzMihfeCkgKF94KQorI2RlZmluZSB2b3NfbGUzMl90b19jcHUoX3gpIChfeCkKKyNkZWZpbmUgdm9zX2NwdV90b19sZTE2KF94KSAoX3gpCisjZGVmaW5lIHZvc19sZTE2X3RvX2NwdShfeCkgKF94KQorCisjZW5kaWYKKworI2lmZGVmIEFOSV9CSUdfQllURV9FTkRJQU4KKworI2RlZmluZSB2b3NfY3B1X3RvX2JlMzIoX3gpIChfeCkKKyNkZWZpbmUgdm9zX2JlMzJfdG9fY3B1KF94KSAoX3gpCisjZGVmaW5lIHZvc19jcHVfdG9fYmUxNihfeCkgKF94KQorI2RlZmluZSB2b3NfYmUxNl90b19jcHUoX3gpIChfeCkKKyNkZWZpbmUgdm9zX2NwdV90b19sZTMyKF94KSBWT1NfU1dBUF9VMzIoX3gpCisjZGVmaW5lIHZvc19sZTMyX3RvX2NwdShfeCkgVk9TX1NXQVBfVTMyKF94KQorI2RlZmluZSB2b3NfY3B1X3RvX2xlMTYoX3gpIFZPU19TV0FQX1UxNihfeCkKKyNkZWZpbmUgdm9zX2xlMTZfdG9fY3B1KF94KSBWT1NfU1dBUF9VMTYoX3gpCisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgCisvLy8gTW9kdWxlIElEcy4gIFRoZXNlIGFyZSBnZW5lcmljIElEcyB0aGF0IGlkZW50aWZ5IHRoZSB2YXJpb3VzIG1vZHVsZXMKKy8vLyBpbiB0aGUgc29mdHdhcmUgc3lzdGVtLgordHlwZWRlZiBlbnVtCit7CisgICBWT1NfTU9EVUxFX0lEX0JBUCAgICAgICAgPSAwLAorICAgVk9TX01PRFVMRV9JRF9UTCAgICAgICAgID0gMSwKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIFZPU19NT0RVTEVfSURfQkFMICAgICAgICA9IDIsCisgICBWT1NfTU9EVUxFX0lEX1NBTCAgICAgICAgPSAzLAorICAgVk9TX01PRFVMRV9JRF9TU0MgICAgICAgID0gNCwKKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICBWT1NfTU9EVUxFX0lEX1dESSAgICAgICAgPSAyLAorI2VuZGlmCisgICAKKyAgIFZPU19NT0RVTEVfSURfSEREICAgICAgICA9IDUsCisgICBWT1NfTU9EVUxFX0lEX1NNRSAgICAgICAgPSA2LAorICAgVk9TX01PRFVMRV9JRF9QRSAgICAgICAgID0gNywKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIFZPU19NT0RVTEVfSURfSEFMICAgICAgICA9IDgsCisjZWxzZQorICAgVk9TX01PRFVMRV9JRF9XREEgICAgICAgID0gOCwKKyNlbmRpZgorCisgICBWT1NfTU9EVUxFX0lEX1NZUyAgICAgICAgPSA5LAorICAgVk9TX01PRFVMRV9JRF9WT1NTICAgICAgID0gMTAsCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgVk9TX01PRFVMRV9JRF9TQVAgICAgICAgID0gMTEsCisgICBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVAgPSAxMiwKKyNlbmRpZiAgIAorCisKKworICAgLy8gbm90IGEgcmVhbCBtb2R1bGUgSUQuICBUaGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1heGl1bXVtCisgICAvLyBudW1iZXIgb2YgVk9TX01PRFVMRV9JRHMgYW5kIHNob3VsZCBhbHdheXMgYmUgYXQgdGhlIEVORCBvZgorICAgLy8gdGhpcyBlbnVtLiAgSWYgSURzIGFyZSBhZGRlZCwgdGhleSBuZWVkIHRvIGdvIGluIGZyb250IG9mIHRoaXMKKyAgIFZPU19NT0RVTEVfSURfTUFYCisKK30gVk9TX01PRFVMRV9JRDsKKworCisvLy8gQ29uY3VycmVuY3kgcm9sZS4gIFRoZXNlIGFyZSBnZW5lcmljIElEcyB0aGF0IGlkZW50aWZ5IHRoZSB2YXJpb3VzIHJvbGVzCisvLy8gaW4gdGhlIHNvZnR3YXJlIHN5c3RlbS4KK3R5cGVkZWYgZW51bQoreyAvKk9OIGxpbnV4IG1haW50YWluIDEtMSBjb3Jlc3BvbmRlbmNlIHdpdGggZGV2aWNlX21vZGVfdCBpbiBoZGQqLworICAgIFZPU19TVEFfTU9ERT0wLCAKKyAgICBWT1NfU1RBX1NBUF9NT0RFPTEsIC8vdG8gc3VwcG9ydCBzb2Z0QXAgIG1vZGUgLiBUaGlzIGlzIG1pc2xlYWRpbmcuIEl0IG1lYW5zIEFQIE1PREUgb25seS4gCisgICAgICAgICAgICAgICAgICAgICAgICAvL1RoZSBjb25zdGFudCBuYW1lIGhhcyBoaXN0b3JpY2FsIHJlYXNvbgorICAgIFZPU19QMlBfQ0xJRU5UX01PREUsCisgICAgVk9TX1AyUF9HT19NT0RFLAorICAgIFZPU19NT05JVE9SX01PREUsCisjaWZkZWYgQU5JX01BTkZfRElBRworICAgIFZPU19GVE1fTU9ERSA9IDUsCisjZW5kaWYKKyAgICBWT1NfTUFYX05PX09GX01PREUKKworfSB0Vk9TX0NPTl9NT0RFOworCisvL1RoaXMgaXMgYSBiaXQgcGF0dGVybiB0byBiZSBzZXQgZm9yIGVhY2ggbW9kZQorLy9iaXQgMCAtIHN0YSBtb2RlCisvL2JpdCAxIC0gYXAgbW9kZQorLy9iaXQgMiAtIHAycCBjbGllbnQgbW9kZQorLy9iaXQgMyAtIHAycCBnbyBtb2RlCit0eXBlZGVmIGVudW0KK3sKKyAgICBWT1NfU1RBPTEsIAorICAgIFZPU19TQVA9MiwKKyAgICBWT1NfU1RBX1NBUD0zLCAvL3RvIHN1cHBvcnQgc3RhLCBzb2Z0QXAgIG1vZGUgLiBUaGlzIG1lYW5zIFNUQStBUCBtb2RlCisgICAgVk9TX1AyUF9DTElFTlQ9NCwKKyAgICBWT1NfUDJQX0dPPTgsCisgICAgVk9TX01BWF9DT05DVVJSRU5DWV9QRVJTT05BPTQKK30gdFZPU19DT05DVVJSRU5DWV9NT0RFOworIAorI2lmICFkZWZpbmVkKCBOVUxMICkKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBOVUxMICAgIDAKKyNlbHNlCisjZGVmaW5lIE5VTEwgICAgKCh2b2lkICopMCkKKyNlbmRpZgorI2VuZGlmCisKK2VudW0KK3sKKyAgIFZPU19GQUxTRSA9IDAsIAorICAgVk9TX1RSVUUgID0gKCAhVk9TX0ZBTFNFICkKK307CisKKy8vLyBwb2ludGVyIHRvIHZvaWQgdHlwZXMKK3R5cGVkZWYgdl9WT0lEX3QgKnZfUFZPSURfdDsKKworLy8vICJTaXplIiB0eXBlLi4uIAordHlwZWRlZiB2X1VJTlRfdCB2X1NJWkVfdDsKKworLy8vICdUaW1lJyB0eXBlCit0eXBlZGVmIHZfVUxPTkdfdCB2X1RJTUVfdDsKKworLy8gdHlwZWRlZiBmb3IgVk9TUyBDb250ZXh0Li4uCit0eXBlZGVmIHZfVk9JRF90ICp2X0NPTlRFWFRfdDsKKworCisvLy8gTUFDIGFkZHJlc3MgZGF0YSB0eXBlIGFuZCBjb3JyZXNwb25kaW5nIG1hY3Jvcy9mdW5jdGlvbnMgdG8gCisvLy8gbWFuaXB1bGF0ZSBNQUMgYWRkcmVzc2VzLi4uCisvLy8gTWFjcm8gZGVmaW5pbmcgdGhlIHNpemUgb2YgYSBNQUMgQWRkcmVzcy4uLgorI2RlZmluZSBWT1NfTUFDX0FERFJfU0laRSAoIDYgKQorCit0eXBlZGVmIHN0cnVjdAoreworICAgLy8vIHRoZSBieXRlcyB0aGF0IG1ha2UgdXAgdGhlIG1hY0FkZHJlc3MuICAKKyAgIHZfQllURV90IGJ5dGVzWyBWT1NfTUFDX0FERFJfU0laRSBdOworICAgIAorfSB2X01BQ0FERFJfdDsKKworCisvLy8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIGluaXRpYWxpemUgYSB2T1NTIE1hY0FkZHJlc3MgdG8gdGhlIAorLy8vIGJyb2FkY2FzdCBNYWNBZGRyZXNzLiAgSXQgaXMgdXNlZCBsaWtlIHRoaXMuLi4KKy8vLyB2X01BQ0FERFJfdCBtYWNBZGRyZXNzID0gVk9TX01BQ19BRERSX0JST0FEQ0FTVF9JTklUSUFMSVpFUjsKKyNkZWZpbmUgVk9TX01BQ19BRERSX0JST0FEQ0FTVF9JTklUSUFMSVpFUiB7IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9IH0KKworLy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBpbml0aWFsaXplIGEgdk9TUyBNYWNBZGRyZXNzIHRvIHplcm8KKy8vLyBJdCBpcyB1c2VkIGxpa2UgdGhpcy4uLgorLy8vIHZfTUFDQUREUl90IG1hY0FkZHJlc3MgPSBWT1NfTUFDX0FERFJfWkVST19JTklUSUFMSVpFUjsKKyNkZWZpbmUgVk9TX01BQ19BRERSX1pFUk9fSU5JVElBTElaRVIgeyB7IDAsIDAsIDAsIDAsIDAsIDAgfSB9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfaXNfbWFjYWRkcl9lcXVhbCgpIC0gY29tcGFyZSB0d28gdk9TUyBNYWNBZGRyZXNzCisKKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB0aGF0IHRlbGxzIGlmIGEgdHdvIHZPU1MgTWFjQWRkcmVzcycgCisgIGFyZSBlcXVpdmFsZW50LgorICAKKyAgXHBhcmFtIHBNYWNBZGRyMSAtIHBvaW50ZXIgdG8gb25lIHZvc3MgTWFjQWRkcmVzcyB0byBjb21wYXJlCisgIFxwYXJhbSBwTWFjQWRkcjIgLSBwb2ludGVyIHRvIHRoZSBvdGhlciB2b3NzIE1hY0FkZHJlc3MgdG8gY29tcGFyZQorICAKKyAgXHJldHVybiAgdHJ1ZSAtIHRoZSBNYWNBZGRyZXNzJ3MgYXJlIGVxdWFsCisgICAgICAgICAgIG5vdCB0cnVlIC0gdGhlIE1hY0FkZHJlc3MncyBhcmUgbm90IGVxdWFsCisgIAorICBcc2EKKyAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX0lOTElORV9GTiB2X0JPT0xfdCB2b3NfaXNfbWFjYWRkcl9lcXVhbCggdl9NQUNBRERSX3QgKnBNYWNBZGRyMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X01BQ0FERFJfdCAqcE1hY0FkZHIyICkKK3sKKyAgIHJldHVybiAoIDAgPT0gbWVtY21wKCBwTWFjQWRkcjEsIHBNYWNBZGRyMiwgVk9TX01BQ19BRERSX1NJWkUgKSApOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2lzX21hY2FkZHJfemVybygpIC0gY2hlY2sgZm9yIGEgTWFjQWRkcmVzcyBvZiBhbGwgemVyb3MuIAorCisgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gdGhhdCB0ZWxscyBpZiBhIE1hY0FkZHJlc3MgaXMgbWFkZSB1cCBvZgorICBhbGwgemVyb3MuCisgIAorICBccGFyYW0gcE1hY0FkZHIgLSBwb2ludGVyIHRvIHRoZSB2X01BQ0FERFJfdCB0byBjaGVjay4KKyAgCisgIFxyZXR1cm4gIHRydWUgLSB0aGUgTWFjQWRkcmVzcyBpcyBhbGwgWmVyb3MKKyAgICAgICAgICAgbm90IHRydWUgLSB0aGUgTWFjQWRkcmVzcyBpcyBub3QgYWxsIFplcm9zLgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19JTkxJTkVfRk4gdl9CT09MX3Qgdm9zX2lzX21hY2FkZHJfemVybyggdl9NQUNBRERSX3QgKnBNYWNBZGRyICkKK3sKKyAgIHZfTUFDQUREUl90IHplcm9NYWNBZGRyID0gVk9TX01BQ19BRERSX1pFUk9fSU5JVElBTElaRVI7CisgICAKKyAgIHJldHVybiggdm9zX2lzX21hY2FkZHJfZXF1YWwoIHBNYWNBZGRyLCAmemVyb01hY0FkZHIgKSApOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc196ZXJvX21hY2FkZHIoKSAtIHplcm8gb3V0IGEgTWFjQWRkcmVzcworCisgIFRoaXMgZnVuY3Rpb24gemVyb3Mgb3V0IGEgdk9TUyBNYWNBZGRyZXNzIHR5cGUuCisgIAorICBccGFyYW0gcE1hY0FkZHIgLSBwb2ludGVyIHRvIHRoZSB2X01BQ0FERFJfdCB0byB6ZXJvLgorICAKKyAgXHJldHVybiAgbm90aGluZworICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19JTkxJTkVfRk4gdl9WT0lEX3Qgdm9zX3plcm9fbWFjYWRkciggdl9NQUNBRERSX3QgKnBNYWNBZGRyICkKK3sKKyAgIG1lbXNldCggcE1hY0FkZHIsIDAsIFZPU19NQUNfQUREUl9TSVpFICk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2lzX21hY2FkZHJfZ3JvdXAoKSAtIGNoZWNrIGZvciBhIE1hY0FkZHJlc3MgaXMgYSAnZ3JvdXAnIGFkZHJlc3MgCisKKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB0aGF0IHRlbGxzIGlmIGEgdGhlIGlucHV0IHZPU1MgTWFjQWRkcmVzcworICBpcyBhICJncm91cCIgYWRkcmVzcy4gIEdyb3VwIGFkZHJlc3NlcyBoYXZlIHRoZSAnZ3JvdXAgYWRkcmVzcyBiaXQnIHR1cm5lZAorICBvbiBpbiB0aGUgTWFjQWRkcmVzcy4gIEdyb3VwIGFkZHJlc3NlcyBhcmUgbWFkZSB1cCBvZiBCcm9hZGNhc3QgYW5kIAorICBNdWx0aWNhc3QgYWRkcmVzc2VzLgorICAKKyAgXHBhcmFtIHBNYWNBZGRyMSAtIHBvaW50ZXIgdG8gdGhlIHZvc3MgTWFjQWRkcmVzcyB0byBjaGVjaworICAKKyAgXHJldHVybiAgdHJ1ZSAtIHRoZSBpbnB1dCBNYWNBZGRyZXNzIGlzIGEgR3JvdXAgYWRkcmVzcworICAgICAgICAgICBub3QgdHJ1ZSAtIHRoZSBpbnB1dCBNYWNBZGRyZXNzIGlzIG5vdCBhIEdyb3VwIGFkZHJlc3MKKyAgCisgIFxzYQorICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfSU5MSU5FX0ZOIHZfQk9PTF90IHZvc19pc19tYWNhZGRyX2dyb3VwKCB2X01BQ0FERFJfdCAqcE1hY0FkZHIgKQoreworICAgIHJldHVybiggcE1hY0FkZHItPmJ5dGVzWyAwIF0gJiAweDAxICk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2lzX21hY2FkZHJfYnJvYWRjYXN0KCkgLSBjaGVjayBmb3IgYSBNYWNBZGRyZXNzIGlzIGEgYnJvYWRjYXN0IGFkZHJlc3MgCisKKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB0aGF0IHRlbGxzIGlmIGEgdGhlIGlucHV0IHZPU1MgTWFjQWRkcmVzcworICBpcyBhICJicm9hZGNhc3QiIGFkZHJlc3MuCisgIAorICBccGFyYW0gcE1hY0FkZHIgLSBwb2ludGVyIHRvIHRoZSB2b3NzIE1hY0FkZHJlc3MgdG8gY2hlY2sKKyAgCisgIFxyZXR1cm4gIHRydWUgLSB0aGUgaW5wdXQgTWFjQWRkcmVzcyBpcyBhIGJyb2FkY2FzdCBhZGRyZXNzCisgICAgICAgICAgIG5vdCB0cnVlIC0gdGhlIGlucHV0IE1hY0FkZHJlc3MgaXMgbm90IGEgYnJvYWRjYXN0IGFkZHJlc3MKKyAgCisgIFxzYQorICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfSU5MSU5FX0ZOIHZfQk9PTF90IHZvc19pc19tYWNhZGRyX2Jyb2FkY2FzdCggdl9NQUNBRERSX3QgKnBNYWNBZGRyICkKK3sKKyAgIHZfTUFDQUREUl90IGJyb2FkY2FzdE1hY0FkZHIgPSBWT1NfTUFDX0FERFJfQlJPQURDQVNUX0lOSVRJQUxJWkVSOworICAgCisgICByZXR1cm4oIHZvc19pc19tYWNhZGRyX2VxdWFsKCBwTWFjQWRkciwgJmJyb2FkY2FzdE1hY0FkZHIgKSApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfaXNfbWFjYWRkcl9tdWx0aWNhc3QoKSAtIGNoZWNrIGZvciBhIE1hY0FkZHJlc3MgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyAKKworICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuIHRoYXQgdGVsbHMgaWYgYSB0aGUgaW5wdXQgdk9TUyBNYWNBZGRyZXNzCisgIGlzIGEgIk11bHRpY2FzdCIgYWRkcmVzcy4KKyAgCisgIFxwYXJhbSBwTWFjQWRkciAtIHBvaW50ZXIgdG8gdGhlIHZvc3MgTWFjQWRkcmVzcyB0byBjaGVjaworICAKKyAgXHJldHVybiAgdHJ1ZSAtIHRoZSBpbnB1dCBNYWNBZGRyZXNzIGlzIGEgTXVsdGljYXN0IGFkZHJlc3MKKyAgICAgICAgICAgbm90IHRydWUgLSB0aGUgaW5wdXQgTWFjQWRkcmVzcyBpcyBub3QgYSBNdWx0aWNhc3QgYWRkcmVzcworICAKKyAgXHNhCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19JTkxJTkVfRk4gdl9CT09MX3Qgdm9zX2lzX21hY2FkZHJfbXVsdGljYXN0KCB2X01BQ0FERFJfdCAqcE1hY0FkZHIgKQoreworICAgcmV0dXJuKCB2b3NfaXNfbWFjYWRkcl9ncm91cCggcE1hY0FkZHIgKSAmJgorICAgICAgICAgICF2b3NfaXNfbWFjYWRkcl9icm9hZGNhc3QoIHBNYWNBZGRyICkgKTsKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19pc19tYWNhZGRyX2RpcmVjdGVkKCkgLSBjaGVjayBmb3IgYSBNYWNBZGRyZXNzIGlzIGEgZGlyZWN0ZWQgYWRkcmVzcyAKKworICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuIHRoYXQgdGVsbHMgaWYgYSB0aGUgaW5wdXQgdk9TUyBNYWNBZGRyZXNzCisgIGlzIGEgImRpcmVjdGVkIiBhZGRyZXNzLgorICAKKyAgXHBhcmFtIHBNYWNBZGRyIC0gcG9pbnRlciB0byB0aGUgdm9zcyBNYWNBZGRyZXNzIHRvIGNoZWNrCisgIAorICBccmV0dXJuICB0cnVlIC0gdGhlIGlucHV0IE1hY0FkZHJlc3MgaXMgYSBkaXJlY3RlZCBhZGRyZXNzCisgICAgICAgICAgIG5vdCB0cnVlIC0gdGhlIGlucHV0IE1hY0FkZHJlc3MgaXMgbm90IGEgZGlyZWN0ZWQgYWRkcmVzcworICAKKyAgXHNhCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19JTkxJTkVfRk4gdl9CT09MX3Qgdm9zX2lzX21hY2FkZHJfZGlyZWN0ZWQoIHZfTUFDQUREUl90ICpwTWFjQWRkciApCit7CisgICAgcmV0dXJuKCAhdm9zX2lzX21hY2FkZHJfZ3JvdXAoIHBNYWNBZGRyICkgKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2NvcHlfbWFjYWRkcigpIC0gY29weSBhIHZPU1MgTWFjQWRkcmVzcworCisgIFRoaXMgZnVuY3Rpb24gY29waWVzIGEgdk9TUyBNYWNBZGRyZXNzIGludG8gYW5vdGhlciB2T1NTIE1hY0FkZHJlc3MuCisgIAorICBccGFyYW0gcERzdCAtIHBvaW50ZXIgdG8gdGhlIHZvc3MgTWFjQWRkcmVzcyB0byBjb3B5IFRPICh0aGUgZGVzdGluYXRpb24pCisgIFxwYXJhbSBwU3JjIC0gcG9pbnRlciB0byB0aGUgdm9zcyBNYWNBZGRyZXNzIHRvIGNvcHkgRlJPTSAodGhlIHNvdXJjZSkKKyAgCisgIFxyZXR1cm4gIG5vdGhpbmcKKyAgICAKKyAgXHNhCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19JTkxJTkVfRk4gdl9WT0lEX3Qgdm9zX2NvcHlfbWFjYWRkciggdl9NQUNBRERSX3QgKnBEc3QsIHZfTUFDQUREUl90ICpwU3JjICkKK3sKKyAgICAqcERzdCA9ICpwU3JjOworfSAgICAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3Nfc2V0X21hY2FkZHJfYnJvYWRjYXN0KCkgLSBzZXQgYSB2T1NTIE1hY0FkZHJlc3MgdG8gdGhlICdicm9hZGNhc3QnIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFRoaXMgZnVuY3Rpb24gc2V0cyBhIHZPU1MgTWFjQWRkcmVzcyB0byB0aGUgJ2Jyb2FkY2FzdCcgTWFjQWRkcmVzcy4gQnJvYWRjYXN0CisgIE1hY0FkZHJlc3MgY29udGFpbnMgYWxsIDB4RkYgYnl0ZXMuCisgIAorICBccGFyYW0gcE1hY0FkZHIgLSBwb2ludGVyIHRvIHRoZSB2b3NzIE1hY0FkZHJlc3MgdG8gc2V0IHRvIGJyb2FkY2FzdAorICAKKyAgXHJldHVybiAgbm90aGluZworICAgIAorICBcc2EKKyAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX0lOTElORV9GTiB2X1ZPSURfdCB2b3Nfc2V0X21hY2FkZHJfYnJvYWRjYXN0KCB2X01BQ0FERFJfdCAqcE1hY0FkZHIgKQoreworICAgbWVtc2V0KCBwTWFjQWRkciwgMHhmZiwgVk9TX01BQ19BRERSX1NJWkUgKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2F0b21pY19zZXRfVTMyKCkgLSBzZXQgYSBVMzIgdmFyaWFibGUgYXRvbWljYWxseSAKKyAgCisgIFxwYXJhbSBwVGFyZ2V0IC0gcG9pbnRlciB0byB0aGUgdl9VMzJfdCB0byBzZXQuCisgIAorICBccGFyYW0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gc2V0IGluIHRoZSB2X1UzMl90IHZhcmlhYmxlLgorICAKKyAgXHJldHVybiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIHByZXZpb3VzbHkgaW4gdGhlIHZfVTMyX3QgYmVmb3JlCisgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBpcyBzZXQuCisgICAgCisgIFxzYSB2b3NfYXRvbWljX2luY3JlbWVudF9VMzIoKSwgdm9zX2F0b21pY19kZWNyZW1lbnRfVTMyKCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit2X1UzMl90IHZvc19hdG9taWNfc2V0X1UzMiggdl9VMzJfdCAqcFRhcmdldCwgdl9VMzJfdCB2YWx1ZSApOworCisKKy8vIFRPRE86IHRoZSBiZWxvdyBmdW5jdGlvbiBpcyBhIHN0dWIgdG8gcGVyZm9ybSBhdG9taWMgc2V0IG9uIGEgQllURQorLy8gQ2xlYXJseSB0aGUgZnVuY3Rpb24gYmVsb3cgaXMgbm90IGFuIGF0b21pYyBmdW5jdGlvbgorVk9TX0lOTElORV9GTiB2X1U4X3Qgdm9zX2F0b21pY19zZXRfVTgoIHZfVThfdCAqcFZhcmlhYmxlLCB2X1U4X3QgdmFsdWUgKQoreworICBpZiAocFZhcmlhYmxlID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqcFZhcmlhYmxlID0gdmFsdWU7CisgIHJldHVybiB2YWx1ZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2F0b21pY19pbmNyZW1lbnRfVTMyKCkgLSBJbmNyZW1lbnQgYSBVMzIgdmFyaWFibGUgYXRvbWljYWxseSAKKyAgCisgIFxwYXJhbSBwVGFyZ2V0IC0gcG9pbnRlciB0byB0aGUgdl9VMzJfdCB0byBpbmNyZW1lbnQuCisgIAorICBccmV0dXJuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGFmdGVyIHRoZSAKKyAgICAgICAgICBpbmNyZW1lbnQgb2NjdXJzLgorICAgIAorICBcc2Egdm9zX2F0b21pY19kZWNyZW1lbnRfVTMyKCksIHZvc19hdG9taWNfc2V0X1UzMigpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAordl9VMzJfdCB2b3NfYXRvbWljX2luY3JlbWVudF9VMzIoIHZfVTMyX3QgKnBUYXJnZXQgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfYXRvbWljX2RlY3JlbWVudF9VMzIoKSAtIERlY3JlbWVudCBhIFUzMiB2YXJpYWJsZSBhdG9taWNhbGx5IAorICAKKyAgXHBhcmFtIHBUYXJnZXQgLSBwb2ludGVyIHRvIHRoZSB2X1UzMl90IHRvIGRlY3JlbWVudC4KKyAgCisgIFxyZXR1cm4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgYWZ0ZXIgdGhlIAorICAgICAgICAgIGRlY3JlbWVudCBvY2N1cnMuCisgICAgCisgIFxzYSB2b3NfYXRvbWljX2luY3JlbWVudF9VMzIoKSwgdm9zX2F0b21pY19zZXRfVTMyKCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit2X1UzMl90IHZvc19hdG9taWNfZGVjcmVtZW50X1UzMiggdl9VMzJfdCAqcFRhcmdldCApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfYXRvbWljX2luY3JlbWVudF9VMzJfYnlfdmFsdWUoKSAtIEluY3JlbWVudCBhIFUzMiB2YXJpYWJsZSBhdG9taWNhbGx5CisgIGJ5IGEgZ2l2ZW4gdmFsdWUKKyAgCisgIFxwYXJhbSBwVGFyZ2V0IC0gcG9pbnRlciB0byB0aGUgdl9VMzJfdCB0byBkZWNyZW1lbnQuCisgIFxwYXJhbSB2YWx1ZSAgIC0gdGhlIHZhbHVlIHRoYXQgbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGFyZ2V0CisgIAorICBccmV0dXJuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGFmdGVyIHRoZSAKKyAgICAgICAgICBkZWNyZW1lbnQgb2NjdXJzLgorICAgIAorICBcc2Egdm9zX2F0b21pY19pbmNyZW1lbnRfVTMyKCksIHZvc19hdG9taWNfc2V0X1UzMigpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAordl9VMzJfdCB2b3NfYXRvbWljX2luY3JlbWVudF9VMzJfYnlfdmFsdWUoIHZfVTMyX3QgKnBUYXJnZXQsIHZfVTMyX3QgdmFsdWUgICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19hdG9taWNfZGVjcmVtZW50X1UzMl9ieV92YWx1ZSgpIC0gRGVjcmVtZW50IGEgVTMyIHZhcmlhYmxlIGF0b21pY2FsbHkKKyAgYnkgYSBnaXZlbiB2YWx1ZQorICAKKyAgXHBhcmFtIHBUYXJnZXQgLSBwb2ludGVyIHRvIHRoZSB2X1UzMl90IHRvIGRlY3JlbWVudC4KKyAgXHBhcmFtIHZhbHVlICAgLSB0aGUgdmFsdWUgdGhhdCBuZWVkcyB0byBiZSBzdWJzdHJhY3RlZCBmcm9tIHRhcmdldAorICAKKyAgXHJldHVybiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBhZnRlciB0aGUgCisgICAgICAgICAgZGVjcmVtZW50IG9jY3Vycy4KKyAgICAKKyAgXHNhIHZvc19hdG9taWNfaW5jcmVtZW50X1UzMigpLCB2b3NfYXRvbWljX3NldF9VMzIoKQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3ZfVTMyX3Qgdm9zX2F0b21pY19kZWNyZW1lbnRfVTMyX2J5X3ZhbHVlKCB2X1UzMl90ICpwVGFyZ2V0LCB2X1UzMl90IHZhbHVlICApOworCisKK3ZfVTMyX3Qgdm9zX2dldF9za2lwX3NzaWRfY2hlY2sodm9pZCk7IAorCit2X1UzMl90IHZvc19nZXRfc2tpcF8xMWVfY2hlY2sodm9pZCk7IAorCisKKworI2VuZGlmIC8vIGlmICFkZWZpbmVkIF9fVk9TU19UWVBFU19ICmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL3Zvc191dGlscy5oIGIvQ09SRS9WT1NTL2luYy92b3NfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTEwZDEzCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL2luYy92b3NfdXRpbHMuaApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiAqLworI2lmICFkZWZpbmVkKCBfX1ZPU19VVElMU19IICkKKyNkZWZpbmUgX19WT1NfVVRJTFNfSAorIAorLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHZvc191dGlscy5oCisgIAorICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpY2VzICh2T1NTKSB1dGlsaXR5IEFQSXMKKyAgICAgICAgICAgICAgIAorICAgVmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucworICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRIZWFkZXIkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHZvc190eXBlcy5oPgorI2luY2x1ZGUgPHZvc19zdGF0dXMuaD4KKy8vI2luY2x1ZGUgPFdpbmNyeXB0Lmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFZPU19ESUdFU1RfU0hBMV9TSVpFICAgIDIwCisjZGVmaW5lIFZPU19ESUdFU1RfTUQ1X1NJWkUgICAgIDE2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWT1NfU1RBVFVTIHZvc19jcnlwdG9faW5pdCggdl9VMzJfdCAqcGhDcnlwdFByb3YgKTsKKworVk9TX1NUQVRVUyB2b3NfY3J5cHRvX2RlaW5pdCggdl9VMzJfdCBoQ3J5cHRQcm92ICk7CisKKworCisvKioKKyAqIHZvc19yYW5kX2dldF9ieXRlcworCisgKiBGVU5DVElPTjoKKyAqIFJldHVybnMgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHBzZXVkby1yYW5kb20gYnl0ZXMuCisgKgorICoKKyAqIEBwYXJhbSBwYkJ1ZiAtIHRoZSBjYWxsZXIgYWxsb2NhdGVkIGxvY2F0aW9uIHdoZXJlIHRoZSBieXRlcyBzaG91bGQgYmUgY29waWVkCisgKiBAcGFyYW0gbnVtQnl0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgYW5kCisgKiBjb3BpZWQKKyAqIAorICogQHJldHVybiBWT1NfU1RBVFVTX1NVQ0NTUyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisqLworVk9TX1NUQVRVUyB2b3NfcmFuZF9nZXRfYnl0ZXMoIHZfVTMyX3QgaGFuZGxlLCB2X1U4X3QgKnBiQnVmLCB2X1UzMl90IG51bUJ5dGVzICk7CisKKworLyoqCisgKiB2b3Nfc2hhMV9obWFjX3N0cgorICoKKyAqIEZVTkNUSU9OOgorICogR2VuZXJhdGUgdGhlIEhNQUMtU0hBMSBvZiBhIHN0cmluZyBnaXZlbiBhIGtleS4KKyAqCisgKiBMT0dJQzoKKyAqIFN0YW5kYXJkIEhNQUMgcHJvY2Vzc2luZyBmcm9tIFJGQyAyMTA0LiBUaGUgY29kZSBpcyBwcm92aWRlZCBpbiB0aGUKKyAqIGFwcGVuZGl4IG9mIHRoZSBSRkMuCisgKgorICogQVNTVU1QVElPTlM6CisgKiBUaGUgUkZDIGlzIGNvcnJlY3QuCisgKgorICogQHBhcmFtIHRleHQgdGV4dCB0byBiZSBoYXNoZWQKKyAqIEBwYXJhbSB0ZXh0TGVuIGxlbmd0aCBvZiB0ZXh0CisgKiBAcGFyYW0ga2V5IGtleSB0byB1c2UgZm9yIEhNQUMKKyAqIEBwYXJhbSBrZXlMZW4gbGVuZ3RoIG9mIGtleQorICogQHBhcmFtIGRpZ2VzdCBob2xkcyByZXN1bHRhbnQgU0hBMSBITUFDICgyMEIpCisgKgorICogQHJldHVybiBWT1NfU1RBVFVTX1NVQ0NTUyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgKgorICovCitWT1NfU1RBVFVTIHZvc19zaGExX2htYWNfc3RyKHZfVTMyX3QgY3J5cHRIYW5kbGUsIC8qIEhhbmRsZSAqLworICAgICAgICAgICB2X1U4X3QgKnRleHQsIC8qIHBvaW50ZXIgdG8gZGF0YSBzdHJlYW0gKi8KKyAgICAgICAgICAgdl9VMzJfdCB0ZXh0TGVuLCAvKiBsZW5ndGggb2YgZGF0YSBzdHJlYW0gKi8KKyAgICAgICAgICAgdl9VOF90ICprZXksIC8qIHBvaW50ZXIgdG8gYXV0aGVudGljYXRpb24ga2V5ICovCisgICAgICAgICAgIHZfVTMyX3Qga2V5TGVuLCAvKiBsZW5ndGggb2YgYXV0aGVudGljYXRpb24ga2V5ICovCisgICAgICAgICAgIHZfVThfdCBkaWdlc3RbVk9TX0RJR0VTVF9TSEExX1NJWkVdKTsvKiBjYWxsZXIgZGlnZXN0IHRvIGJlIGZpbGxlZCBpbiAqLworCisvKioKKyAqIHZvc19tZDVfaG1hY19zdHIKKyAqCisgKiBGVU5DVElPTjoKKyAqIEdlbmVyYXRlIHRoZSBITUFDLU1ENSBvZiBhIHN0cmluZyBnaXZlbiBhIGtleS4KKyAqCisgKiBMT0dJQzoKKyAqIFN0YW5kYXJkIEhNQUMgcHJvY2Vzc2luZyBmcm9tIFJGQyAyMTA0LiBUaGUgY29kZSBpcyBwcm92aWRlZCBpbiB0aGUKKyAqIGFwcGVuZGl4IG9mIHRoZSBSRkMuCisgKgorICogQVNTVU1QVElPTlM6CisgKiBUaGUgUkZDIGlzIGNvcnJlY3QuCisgKgorICogQHBhcmFtIHRleHQgdGV4dCB0byBiZSBoYXNoZWQKKyAqIEBwYXJhbSB0ZXh0TGVuIGxlbmd0aCBvZiB0ZXh0CisgKiBAcGFyYW0ga2V5IGtleSB0byB1c2UgZm9yIEhNQUMKKyAqIEBwYXJhbSBrZXlMZW4gbGVuZ3RoIG9mIGtleQorICogQHBhcmFtIGRpZ2VzdCBob2xkcyByZXN1bHRhbnQgTUQ1IEhNQUMgKDE2QikKKyAqCisgKiBAcmV0dXJuIFZPU19TVEFUVVNfU1VDQ1NTIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKKyAqCisgKi8KK1ZPU19TVEFUVVMgdm9zX21kNV9obWFjX3N0cih2X1UzMl90IGNyeXB0SGFuZGxlLCAvKiBIYW5kbGUgKi8KKyAgICAgICAgICAgdl9VOF90ICp0ZXh0LCAvKiBwb2ludGVyIHRvIGRhdGEgc3RyZWFtICovCisgICAgICAgICAgIHZfVTMyX3QgdGV4dExlbiwgLyogbGVuZ3RoIG9mIGRhdGEgc3RyZWFtICovCisgICAgICAgICAgIHZfVThfdCAqa2V5LCAvKiBwb2ludGVyIHRvIGF1dGhlbnRpY2F0aW9uIGtleSAqLworICAgICAgICAgICB2X1UzMl90IGtleUxlbiwgLyogbGVuZ3RoIG9mIGF1dGhlbnRpY2F0aW9uIGtleSAqLworICAgICAgICAgICB2X1U4X3QgZGlnZXN0W1ZPU19ESUdFU1RfTUQ1X1NJWkVdKTsvKiBjYWxsZXIgZGlnZXN0IHRvIGJlIGZpbGxlZCBpbiAqLworCisKKworVk9TX1NUQVRVUyB2b3NfZW5jcnlwdF9BRVModl9VMzJfdCBjcnlwdEhhbmRsZSwgLyogSGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBUZXh0LCAvKiBwb2ludGVyIHRvIGRhdGEgc3RyZWFtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKkVuY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEtleSk7IC8qIHBvaW50ZXIgdG8gYXV0aGVudGljYXRpb24ga2V5ICovCisKKworVk9TX1NUQVRVUyB2b3NfZGVjcnlwdF9BRVModl9VMzJfdCBjcnlwdEhhbmRsZSwgLyogSGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBUZXh0LCAvKiBwb2ludGVyIHRvIGRhdGEgc3RyZWFtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBEZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBLZXkpOyAvKiBwb2ludGVyIHRvIGF1dGhlbnRpY2F0aW9uIGtleSAqLworCisjZW5kaWYgLy8gI2lmICFkZWZpbmVkIF9fVk9TU19VVElMU19ICmRpZmYgLS1naXQgYS9DT1JFL1ZPU1MvaW5jL3dsYW5faGRkX21pc2MuaCBiL0NPUkUvVk9TUy9pbmMvd2xhbl9oZGRfbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxN2FiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1MvaW5jL3dsYW5faGRkX21pc2MuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBXTEFOX0hERF9NSVNDX0gKKyNkZWZpbmUgV0xBTl9IRERfTUlTQ19ICisKKyNpZmRlZiBNU01fUExBVEZPUk0KKyNpZmRlZiBRQ19XTEFOX0NISVBTRVRfUFJJTUEKKyNkZWZpbmUgV0xBTl9JTklfRklMRSAgICAgICAgICAgICAgIndsYW4vcHJpbWEvV0NOU1NfcWNvbV9jZmcuaW5pIgorI2RlZmluZSBXTEFOX0NGR19GSUxFICAgICAgICAgICAgICAid2xhbi9wcmltYS9XQ05TU19jZmcuZGF0IgorI2RlZmluZSBXTEFOX0ZXX0ZJTEUgICAgICAgICAgICAgICAiIgorI2RlZmluZSBXTEFOX05WX0ZJTEUgICAgICAgICAgICAgICAid2xhbi9wcmltYS9XQ05TU19xY29tX3dsYW5fbnYuYmluIgorI2RlZmluZSBXTEFOX0NPVU5UUllfSU5GT19GSUxFICAgICAid2xhbi9wcmltYS9XQ05TU193bGFuX2NvdW50cnlfaW5mby5kYXQiCisjZGVmaW5lIFdMQU5fSE9fQ0ZHX0ZJTEUgICAgICAgICAgICJ3bGFuL3ByaW1hL1dDTlNTX3dsYW5faG9fY29uZmlnIgorI2Vsc2UKKyNkZWZpbmUgV0xBTl9JTklfRklMRSAgICAgICAgICAgICAgIndsYW4vdm9sYW5zL1dDTjEzMTRfcWNvbV9jZmcuaW5pIgorI2RlZmluZSBXTEFOX0NGR19GSUxFICAgICAgICAgICAgICAid2xhbi92b2xhbnMvV0NOMTMxNF9jZmcuZGF0IgorI2RlZmluZSBXTEFOX0ZXX0ZJTEUgICAgICAgICAgICAgICAid2xhbi92b2xhbnMvV0NOMTMxNF9xY29tX2Z3LmJpbiIKKyNkZWZpbmUgV0xBTl9OVl9GSUxFICAgICAgICAgICAgICAgIndsYW4vdm9sYW5zL1dDTjEzMTRfcWNvbV93bGFuX252LmJpbiIKKyNkZWZpbmUgV0xBTl9DT1VOVFJZX0lORk9fRklMRSAgICAgIndsYW4vdm9sYW5zL1dDTjEzMTRfd2xhbl9jb3VudHJ5X2luZm8uZGF0IgorI2RlZmluZSBXTEFOX0hPX0NGR19GSUxFICAgICAgICAgICAid2xhbi92b2xhbnMvV0NOMTMxNF93bGFuX2hvX2NvbmZpZyIKKyNlbmRpZiAvLyBBTklfQ0hJUFNFVAorI2Vsc2UKKyNkZWZpbmUgV0xBTl9JTklfRklMRSAgICAgICAgICAgICAgIndsYW4vcWNvbV9jZmcuaW5pIgorI2RlZmluZSBXTEFOX0NGR19GSUxFICAgICAgICAgICAgICAid2xhbi9jZmcuZGF0IgorI2RlZmluZSBXTEFOX0ZXX0ZJTEUgICAgICAgICAgICAgICAid2xhbi9xY29tX2Z3LmJpbiIKKyNkZWZpbmUgV0xBTl9OVl9GSUxFICAgICAgICAgICAgICAgIndsYW4vcWNvbV93bGFuX252LmJpbiIKKyNkZWZpbmUgV0xBTl9DT1VOVFJZX0lORk9fRklMRSAgICAgIndsYW4vd2xhbl9jb3VudHJ5X2luZm8uZGF0IgorI2RlZmluZSBXTEFOX0hPX0NGR19GSUxFICAgICAgICAgICAid2xhbi93bGFuX2hvX2NvbmZpZyIKKyNlbmRpZiAvLyBNU01fUExBVEZPUk0KKworCitWT1NfU1RBVFVTIGhkZF9yZXF1ZXN0X2Zpcm13YXJlKGNoYXIgKnBmaWxlTmFtZSx2X1ZPSURfdCAqcEN0eCx2X1ZPSURfdCAqKnBwZndfZGF0YSwgdl9TSVpFX3QgKnBTaXplKTsKKworVk9TX1NUQVRVUyBoZGRfcmVsZWFzZV9maXJtd2FyZShjaGFyICpwRmlsZU5hbWUsdl9WT0lEX3QgKnBDdHgpOworCitWT1NfU1RBVFVTIGhkZF9nZXRfY2ZnX2ZpbGVfc2l6ZSh2X1ZPSURfdCAqcEN0eCwgY2hhciAqcEZpbGVOYW1lLCB2X1NJWkVfdCAqcEJ1ZlNpemUpOworCitWT1NfU1RBVFVTIGhkZF9yZWFkX2NmZ19maWxlKHZfVk9JRF90ICpwQ3R4LCBjaGFyICpwRmlsZU5hbWUsIHZfVk9JRF90ICpwQnVmZmVyLCB2X1NJWkVfdCAqcEJ1ZlNpemUpOworI2lmIDAKKworVk9TX1NUQVRVUyBoZGRfcmVsZWFzZV9maXJtd2FyZShjaGFyICpwRmlsZU5hbWUsdl9WT0lEX3QgKnBDdHgpOworCitWT1NfU1RBVFVTIGhkZF9nZXRfY2ZnX2ZpbGVfc2l6ZSh2X1ZPSURfdCAqcEN0eCwgY2hhciAqcEZpbGVOYW1lLCB2X1NJWkVfdCAqcEJ1ZlNpemUpOworCitWT1NfU1RBVFVTIGhkZF9yZWFkX2NmZ19maWxlKHZfVk9JRF90ICpwQ3R4LCBjaGFyICpwRmlsZU5hbWUsIHZfVk9JRF90ICpwQnVmZmVyLCB2X1NJWkVfdCAqcEJ1ZlNpemUpOworCisjZW5kaWYKKwordFZPU19DT05DVVJSRU5DWV9NT0RFIGhkZF9nZXRfY29uY3VycmVuY3lfbW9kZSAoIHZvaWQgKTsKKworI2VuZGlmIC8qIFdMQU5fSEREX01JU0NfSCAqLworCmRpZmYgLS1naXQgYS9DT1JFL1ZPU1Mvc3JjL3Zvc19hcGkuYyBiL0NPUkUvVk9TUy9zcmMvdm9zX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNjMyZDYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19hcGkuYwpAQCAtMCwwICsxLDIzNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgdm9zX2FwaS5jCisKKyAgXGJyaWVmIFN0dWIgZmlsZSBmb3IgYWxsIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWNlcyAodk9TUykgQVBJcworICAgICAgICAgICAgICAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorCisgICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRSAKKyAgIAorICAgCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLiAKKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4gCisgICAKKyAgIAorICAkSGVhZGVyOiQgJERhdGVUaW1lOiAkICRBdXRob3I6ICQgCisgICAKKyAgIAorICB3aGVuICAgICAgICB3aG8gICAgd2hhdCwgd2hlcmUsIHdoeSAKKyAgLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDAzLzI5LzA5ICAgIGthbmFuZCAgICAgQ3JlYXRlZCBtb2R1bGUuIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImFuaUdsb2JhbC5oIgorI2luY2x1ZGUgImhhbFR5cGVzLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfc2FsLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfYmFsLmgiCisjZW5kaWYKKyNpbmNsdWRlIDx2b3NfbXEuaD4KKyNpbmNsdWRlICJ2b3Nfc2NoZWQuaCIKKyNpbmNsdWRlIDx2b3NfYXBpLmg+CisjaW5jbHVkZSAic2lyVHlwZXMuaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKyNpbmNsdWRlICJzaXJNYWNQcm90RGVmLmgiCisjaW5jbHVkZSAic21lX0FwaS5oIgorI2luY2x1ZGUgIm1hY0luaXRBcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9zeXMuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIgorI2luY2x1ZGUgIndsYW5faGRkX21pc2MuaCIKKyNpbmNsdWRlICJpX3Zvc19wYWNrZXQuaCIKKyNpbmNsdWRlICJ2b3NfbnZpdGVtLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisjaW5jbHVkZSAid2xhbl9oZGRfbWFpbi5oIgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorI2luY2x1ZGUgInNhcEFwaS5oIgorI2VuZGlmCisKKworCisjaWZkZWYgV0xBTl9CVEFNUF9GRUFUVVJFCisjaW5jbHVkZSAiYmFwQXBpLmgiCisjaW5jbHVkZSAiYmFwSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJiYXBfaGRkX21haW4uaCIKKyNlbmRpZiAvL1dMQU5fQlRBTVBfRkVBVFVSRQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIFdEQSB0byBwZXJmb3JtIGFuIGFzeW5jaHJvbm91cyBhY3Rpdml0eS4KKyAgIFRoaXMgdmFsdWUgc2hvdWxkIGJlIGxhcmdlciB0aGFuIHRoZSB0aW1lb3V0IHVzZWQgYnkgV0RJIHRvIHdhaXQgZm9yCisgICBhIHJlc3BvbnNlIGZyb20gV0NOU1Mgc2luY2UgaW4gdGhlIGV2ZW50IHRoYXQgV0NOU1MgaXMgbm90IHJlc3BvbmRpbmcsCisgICBXREkgc2hvdWxkIGhhbmRsZSB0aGF0IHRpbWVvdXQgKi8KKyNkZWZpbmUgVk9TX1dEQV9USU1FT1VUIDE1MDAwCisKKy8qIEFwcHJveGltYXRlIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIFdEQSB0byBzdG9wIFdESSAqLworI2RlZmluZSBWT1NfV0RBX1NUT1BfVElNRU9VVCBXREFfU1RPUF9USU1FT1VUIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGF0YSBkZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBWb3NDb250ZXh0VHlwZSAgZ1Zvc0NvbnRleHQ7CitzdGF0aWMgcFZvc0NvbnRleHRUeXBlIGdwVm9zQ29udGV4dDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZvcndhcmQgZGVjbGFyYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1ZPSURfdCB2b3Nfc3lzX3Byb2JlX3RocmVhZF9jYmFjayAoIHZfVk9JRF90ICpwVXNlckRhdGEgKTsKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKK3ZfVk9JRF90IHZvc19zeXNfc3RhcnRfY29tcGxldGVfY2JhY2sgICggdl9WT0lEX3QgKnBVc2VyRGF0YSApOworI2VuZGlmCit2X1ZPSURfdCB2b3NfY29yZV9yZXR1cm5fbXNnKHZfUFZPSURfdCBwVkNvbnRleHQsIHBWb3NNc2dXcmFwcGVyIHBNc2dXcmFwcGVyKTsKKwordl9WT0lEX3Qgdm9zX2ZldGNoX3RsX2NmZ19wYXJtcyAoIFdMQU5UTF9Db25maWdJbmZvVHlwZSAqcFRMQ29uZmlnLCAKKyAgICBoZGRfY29uZmlnX3QgKiBwQ29uZmlnICk7CisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworVk9TX1NUQVRVUyB2b3NfZ2V0X2Z3YmluYXJ5KCB2X1ZPSURfdCAqKnBwQmluYXJ5LCB2X1NJWkVfdCAqcE51bUJ5dGVzICk7CisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19wcmVPcGVuKCkgLSBQcmVPcGVuIHRoZSB2T1NTIE1vZHVsZSAgCisgICAgCisgIFRoZSBcYSB2b3NfcHJlT3BlbigpIGZ1bmN0aW9uIGFsbG9jYXRlcyB0aGUgVm9zIENvbnRleHQsIGJ1dCBkbyBub3QgICAgICAKKyAgaW5pdGlhbGl6ZSBhbGwgdGhlIG1lbWJlcnMuIFRoaXMgb3ZlcmFsIGluaXRpYWxpemF0aW9uIHdpbGwgaGFwcGVuCisgIGF0IHZvc19PcGVuKCkuCisgIFRoZSByZWFzb24gd2h5IHdlIG5lZWQgdm9zX3ByZU9wZW4oKSBpcyB0byBnZXQgYSBtaW5pbXVtIGNvbnRleHQgCisgIHdoZXJlIHRvIHN0b3JlIEJBTCBhbmQgU0FMIHJlbGF0aXZlIGRhdGEsIHdoaWNoIGhhcHBlbnMgYmVmb3JlCisgIHZvc19PcGVuKCkgaXMgY2FsbGVkLgorICAKKyAgXHBhcmFtICBwVm9zQ29udGV4dDogQSBwb2ludGVyIHRvIHdoZXJlIHRvIHN0b3JlIHRoZSBWT1MgQ29udGV4dCAKKyAKKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gU2NoZWR1bGVyIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIAorICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisgICAgICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gRmFpbHVyZSB0byBpbml0aWFsaXplIHRoZSBzY2hlZHVsZXIvICAgCisgICAgICAgICAgCisgIFxzYSB2b3NfT3BlbigpCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3ByZU9wZW4gKCB2X0NPTlRFWFRfdCAqcFZvc0NvbnRleHQgKQoreworICAgaWYgKCBwVm9zQ29udGV4dCA9PSBOVUxMKQorICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworCisgICAvKiBBbGxvY2F0ZSB0aGUgVk9TIENvbnRleHQgKi8KKyAgICpwVm9zQ29udGV4dCA9IE5VTEw7CisgICBncFZvc0NvbnRleHQgPSAmZ1Zvc0NvbnRleHQ7CisKKyAgIGlmIChOVUxMID09IGdwVm9zQ29udGV4dCkKKyAgIHsKKyAgICAgLyogQ3JpdGljYWwgRXJyb3IgLi4uQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgVk9TIENvbnRleHQiLCBfX2Z1bmNfXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9SRVNPVVJDRVM7CisgICB9CisKKyAgIHZvc19tZW1femVybyhncFZvc0NvbnRleHQsIHNpemVvZihWb3NDb250ZXh0VHlwZSkpOworCisgICAqcFZvc0NvbnRleHQgPSBncFZvc0NvbnRleHQ7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKK30gLyogdm9zX3ByZU9wZW4oKSovCisKKyAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19wcmVDbG9zZSgpIC0gUHJlQ2xvc2UgdGhlIHZPU1MgTW9kdWxlICAKKyAgICAKKyAgVGhlIFxhIHZvc19wcmVDbG9zZSgpIGZ1bmN0aW9uIGZyZWVzIHRoZSBWb3MgQ29udGV4dC4KKyAgCisgIFxwYXJhbSAgcFZvc0NvbnRleHQ6IEEgcG9pbnRlciB0byB3aGVyZSB0aGUgVk9TIENvbnRleHQgd2FzIHN0b3JlZCAKKyAKKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gQWx3YXlzIHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIAorICBcc2Egdm9zX3ByZUNsb3NlKCkKKyAgXHNhIHZvc19jbG9zZSgpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcHJlQ2xvc2UoIHZfQ09OVEVYVF90ICpwVm9zQ29udGV4dCApCit7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiJXM6IERlLWFsbG9jYXRpbmcgdGhlIFZPUyBDb250ZXh0IiwgX19mdW5jX18pOworCisgICBpZiAoKCBwVm9zQ29udGV4dCA9PSBOVUxMKSB8fCAoKnBWb3NDb250ZXh0ID09IE5VTEwpKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiB2T1MgQ29udGV4dCBpcyBOdWxsIiwgX19mdW5jX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBpZiAoZ3BWb3NDb250ZXh0ICE9ICpwVm9zQ29udGV4dCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBDb250ZXh0IG1pc21hdGNoIiwgX19mdW5jX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAqcFZvc0NvbnRleHQgPSBncFZvc0NvbnRleHQgPSBOVUxMOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworCit9IC8qIHZvc19wcmVDbG9zZSgpKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3Nfb3BlbigpIC0gT3BlbiB0aGUgdk9TUyBNb2R1bGUgIAorICAgIAorICBUaGUgXGEgdm9zX29wZW4oKSBmdW5jdGlvbiBvcGVucyB0aGUgdk9TUyBTY2hlZHVsZXIKKyAgVXBvbiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uOgorICAKKyAgICAgLSBBbGwgVk9TIHN1Ym1vZHVsZXMgc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZAorICAgICAKKyAgICAgLSBUaGUgVk9TIHNjaGVkdWxlciBzaG91bGQgaGF2ZSBvcGVuZWQKKyAgICAgCisgICAgIC0gQWxsIHRoZSBXTEFOIFNXIGNvbXBvbmVudHMgc2hvdWxkIGhhdmUgYmVlbiBvcGVuZWQuIFRoaXMgaW5jbHVkZXMKKyAgICAgICBTWVMsIE1BQywgU01FLCBXREEgYW5kIFRMLgorICAgICAgCisgIAorICBccGFyYW0gIGhkZENvbnRleHRTaXplOiBTaXplIG9mIHRoZSBIREQgY29udGV4dCB0byBhbGxvY2F0ZS4KKyAKKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gU2NoZWR1bGVyIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIAorICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgLSBTeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkgCisgICAgICAgICAgYXJlIHVuYXZhaWxhYmxlIHRvIGluaXRpbGl6ZSB0aGUgc2NoZWR1bGVyCisKKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgc2NoZWR1bGVyLyAgIAorICAgICAgICAgIAorICBcc2Egdm9zX3ByZU9wZW4oKQorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19vcGVuKCB2X0NPTlRFWFRfdCAqcFZvc0NvbnRleHQsIHZfU0laRV90IGhkZENvbnRleHRTaXplICkKKworeworICAgVk9TX1NUQVRVUyB2U3RhdHVzICAgICAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICBpbnQgaXRlciAgICAgICAgICAgICAgICA9IDA7CisgICB0U2lyUmV0U3RhdHVzIHNpclN0YXR1cyA9IGVTSVJfU1VDQ0VTUzsKKyAgIHRNYWNPcGVuUGFyYW1ldGVycyBtYWNPcGVuUGFybXM7CisgICBXTEFOVExfQ29uZmlnSW5mb1R5cGUgVExDb25maWc7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBPcGVuaW5nIFZPU1MiLCBfX2Z1bmNfXyk7CisKKyAgIGlmIChOVUxMID09IGdwVm9zQ29udGV4dCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICIlczogVHJ5aW5nIHRvIG9wZW4gVk9TUyB3aXRob3V0IGEgUHJlT3BlbiIsIF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIEluaXRpYWxpemUgdGhlIHRpbWVyIG1vZHVsZSAqLworICAgdm9zX3RpbWVyX21vZHVsZV9pbml0KCk7CisKKyAgIC8qIEluaXRpYWxpemUgdGhlIHByb2JlIGV2ZW50ICovCisgICBpZiAodm9zX2V2ZW50X2luaXQoJmdwVm9zQ29udGV4dC0+UHJvYmVFdmVudCkgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gaW5pdCBwcm9iZUV2ZW50IiwgX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIGlmICh2b3NfZXZlbnRfaW5pdCggJihncFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQpICkgIT0gVk9TX1NUQVRVU19TVUNDRVNTICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAiJXM6IFVuYWJsZSB0byBpbml0IHdkYUNvbXBsZXRlRXZlbnQiLCBfX2Z1bmNfXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgIAorICAgICAgZ290byBlcnJfcHJvYmVfZXZlbnQ7CisgICB9CisKKyAgIC8qIFNhdmluZyB0aGUgSEREIGNvbnRleHQgKi8KKyAgIC8qIFRoaXMgaXMgc2F2ZWQgaW4gaGRkX3dsYW5fc3RhcnRfdXAgYmVmb3JlIGNhbGxpbmcgdm9zX29wZW4KKyAgICAgIGdwVm9zQ29udGV4dC0+cEhERENvbnRleHQgPSBwSGRkQ29udGV4dDsqLworIAorICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIiVzOiBIREQgY29udGV4dCBpcyBzYXZlZCBzdWNjZXNzZnVsbHkiLCBfX2Z1bmNfXyk7CisgICAKKyNlbmRpZgorCisgICAvKiBJbml0aWFsaXplIHRoZSBmcmVlIG1lc3NhZ2UgcXVldWUgKi8KKyAgIHZTdGF0dXMgPSB2b3NfbXFfaW5pdCgmZ3BWb3NDb250ZXh0LT5mcmVlVm9zTXEpOworICAgaWYgKCEgVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICAgeworCisgICAgICAvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBWT1MgZnJlZSBtZXNzYWdlIHF1ZXVlIiwgX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgICBnb3RvIGVycl9wcm9iZV9ldmVudDsKKyNlbHNlCisgICAgICBnb3RvIGVycl93ZGFfY29tcGxldGVfZXZlbnQ7CisjZW5kaWYKKyAgIH0KKworICAgZm9yIChpdGVyID0gMDsgaXRlciA8IFZPU19DT1JFX01BWF9NRVNTQUdFUzsgaXRlcisrKQorICAgeworICAgICAgKGdwVm9zQ29udGV4dC0+YU1zZ1dyYXBwZXJzW2l0ZXJdKS5wVm9zTXNnID0gCisgICAgICAgICAmKGdwVm9zQ29udGV4dC0+YU1zZ0J1ZmZlcnNbaXRlcl0pOyAKKyAgICAgIElOSVRfTElTVF9IRUFEKCZncFZvc0NvbnRleHQtPmFNc2dXcmFwcGVyc1tpdGVyXS5tc2dOb2RlKTsKKyAgICAgIHZvc19tcV9wdXQoJmdwVm9zQ29udGV4dC0+ZnJlZVZvc01xLCAmKGdwVm9zQ29udGV4dC0+YU1zZ1dyYXBwZXJzW2l0ZXJdKSk7CisgICB9CisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgLyogSW5pdGlhbGl6ZSBoZXJlIHRoZSBWT1MgUGFja2V0IHN1YiBtb2R1bGUgKi8KKyAgIHZTdGF0dXMgPSB2b3NfcGFja2V0X29wZW4oIGdwVm9zQ29udGV4dCwgJmdwVm9zQ29udGV4dC0+dm9zUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB2b3NfcGt0X2NvbnRleHRfdCApICk7CisKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggdlN0YXR1cyApICkKKyAgIHsKKyAgICAgIC8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBvcGVuIFZPUyBQYWNrZXQgTW9kdWxlIiwgX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIGdvdG8gZXJyX21zZ19xdWV1ZTsKKyAgIH0KKyNlbmRpZiAgIAorCisgICAvKiBOb3cgT3BlbiB0aGUgVk9TIFNjaGVkdWxlciAqLworICAgdlN0YXR1cz0gdm9zX3NjaGVkX29wZW4oZ3BWb3NDb250ZXh0LCAmZ3BWb3NDb250ZXh0LT52b3NTY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWb3NTY2hlZENvbnRleHQpKTsKKworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICB7CisgICAgICAvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gb3BlbiBWT1MgU2NoZWR1bGVyIiwgX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgICBnb3RvIGVycl9wYWNrZXRfY2xvc2U7CisjZWxzZQorICAgICAgZ290byBlcnJfbXNnX3F1ZXVlOworI2VuZGlmCisgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIC8qCisgICAqKiBOZWVkIHRvIG9wZW4gV0RBIGZpcnN0IGJlY2F1c2UgaXQgY2FsbHMgV0RJX0luaXQsIHdoaWNoIGNhbGxzIHdwYWxPcGVuCisgICAqKiBUaGUgcmVhc29uIHRoYXQgaXMgbmVlZGVkIGJlY2FzdWUgdm9zX3BhY2tldF9vcGVuIG5lZWQgdG8gdXNlIFBBTCBBUElzCisgICAqLworCisgICAvKk9wZW4gdGhlIFdEQSBtb2R1bGUgKi8KKyAgIHZvc19tZW1fc2V0KCZtYWNPcGVuUGFybXMsIHNpemVvZihtYWNPcGVuUGFybXMpLCAwKTsKKyAgIC8qIFVNQSBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUgZm9yIHBlcmZvcm1pbmcgdGhlCisgICAqKiBmcmFtZSB0cmFuc2xhdGlvbiA4MDIuMTEgPC0+IDgwMi4zCisgICAqLworICAgbWFjT3BlblBhcm1zLmZyYW1lVHJhbnNSZXF1aXJlZCA9IDE7CisgICBtYWNPcGVuUGFybXMuZHJpdmVyVHlwZSAgICAgICAgID0gZURSSVZFUl9UWVBFX1BST0RVQ1RJT047CisgICB2U3RhdHVzID0gV0RBX29wZW4oIGdwVm9zQ29udGV4dCwgZ3BWb3NDb250ZXh0LT5wSEREQ29udGV4dCwgJm1hY09wZW5QYXJtcyApOworCisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgIHsKKyAgICAgIC8qIENyaXRpY2FsIEVycm9yIC4uLiAgQ2Fubm90IHByb2NlZWQgZnVydGhlciAqLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBvcGVuIFdEQSBtb2R1bGUiLCBfX2Z1bmNfXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgZ290byBlcnJfc2NoZWRfY2xvc2U7CisgICB9CisKKyAgIC8qIEluaXRpYWxpemUgaGVyZSB0aGUgVk9TIFBhY2tldCBzdWIgbW9kdWxlICovCisgICB2U3RhdHVzID0gdm9zX3BhY2tldF9vcGVuKCBncFZvc0NvbnRleHQsICZncFZvc0NvbnRleHQtPnZvc1BhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggdm9zX3BrdF9jb250ZXh0X3QgKSApOworCisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZTdGF0dXMgKSApCisgICB7CisgICAgICAvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gb3BlbiBWT1MgUGFja2V0IE1vZHVsZSIsIF9fZnVuY19fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICBnb3RvIGVycl93ZGFfY2xvc2U7CisgICB9CisjZW5kaWYKKworICAgLyogT3BlbiB0aGUgU1lTIG1vZHVsZSAqLworICAgdlN0YXR1cyA9IHN5c09wZW4oZ3BWb3NDb250ZXh0KTsKKworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICB7CisgICAgICAvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gb3BlbiBTWVMgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgICBnb3RvIGVycl9zY2hlZF9jbG9zZTsKKyNlbHNlCisgICAgICBnb3RvIGVycl9wYWNrZXRfY2xvc2U7CisjZW5kaWYKKyAgIH0KKworCisgICAvKiBpbml0aWFsaXplIHRoZSBOViBtb2R1bGUgKi8KKyAgIHZTdGF0dXMgPSB2b3NfbnZfb3BlbigpOworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICB7CisgICAgIC8vIE5WIG1vZHVsZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBOViBtb2R1bGUiLCBfX2Z1bmNfXyk7CisgICAgIGdvdG8gZXJyX3N5c19jbG9zZTsKKyAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAvKiBQcm9iZSB0aGUgTUMgdGhyZWFkICovCisgICBzeXNNY1RocmVhZFByb2JlKGdwVm9zQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICZ2b3Nfc3lzX3Byb2JlX3RocmVhZF9jYmFjaywKKyAgICAgICAgICAgICAgICAgICAgZ3BWb3NDb250ZXh0KTsKKworICAgaWYgKHZvc193YWl0X3NpbmdsZV9ldmVudCgmZ3BWb3NDb250ZXh0LT5Qcm9iZUV2ZW50LCAwKSE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gcHJvYmUgTUMgVGhyZWFkIiwgX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIGdvdG8gZXJyX252X2Nsb3NlOworICAgfQorCisgICAvKk5vdyBwcm9iZSB0aGUgVHggdGhyZWFkICovCisgICBzeXNUeFRocmVhZFByb2JlKGdwVm9zQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICZ2b3Nfc3lzX3Byb2JlX3RocmVhZF9jYmFjaywKKyAgICAgICAgICAgICAgICAgICAgZ3BWb3NDb250ZXh0KTsKKyAgIAorICAgaWYgKHZvc193YWl0X3NpbmdsZV9ldmVudCgmZ3BWb3NDb250ZXh0LT5Qcm9iZUV2ZW50LCAwKSE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gcHJvYmUgVFggVGhyZWFkIiwgX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIGdvdG8gZXJyX252X2Nsb3NlOworICAgfQorI2VuZGlmCisKKyAgIC8qIElmIHdlIGFycml2ZSBoZXJlLCBib3RoIHRocmVhZHMgZGlzcGFjdGhpbmcgbWVzc2FnZXMgY29ycmVjdGx5ICovCisgICAKKyAgIC8qIE5vdyBwcm9jZWVkIHRvIG9wZW4gdGhlIE1BQyAqLworCisgICAvKiBVTUEgaXMgc3VwcG9ydGVkIGluIGhhcmR3YXJlIGZvciBwZXJmb3JtaW5nIHRoZQorICAgICAgZnJhbWUgdHJhbnNsYXRpb24gODAyLjExIDwtPiA4MDIuMyAqLworICAgbWFjT3BlblBhcm1zLmZyYW1lVHJhbnNSZXF1aXJlZCA9IDE7CisgICBzaXJTdGF0dXMgPSBtYWNPcGVuKCYoZ3BWb3NDb250ZXh0LT5wTUFDQ29udGV4dCksIGdwVm9zQ29udGV4dC0+cEhERENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm1hY09wZW5QYXJtcyk7CisgICAKKyAgIGlmIChlU0lSX1NVQ0NFU1MgIT0gc2lyU3RhdHVzKQorICAgeworICAgICAvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIG9wZW4gTUFDIiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKDApOworICAgICBnb3RvIGVycl9udl9jbG9zZTsKKyAgIH0KKworICAgLyogTm93IHByb2NlZWQgdG8gb3BlbiB0aGUgU01FICovCisgICB2U3RhdHVzID0gc21lX09wZW4oZ3BWb3NDb250ZXh0LT5wTUFDQ29udGV4dCk7CisgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgIHsKKyAgICAgLyogQ3JpdGljYWwgRXJyb3IgLi4uICBDYW5ub3QgcHJvY2VlZCBmdXJ0aGVyICovCisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBvcGVuIFNNRSIsIF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgZ290byBlcnJfbWFjX2Nsb3NlOworICAgfQorCisgICAvKiBOb3cgcHJvY2VlZCB0byBvcGVuIFRMLiBSZWFkIFRMIGNvbmZpZyBmaXJzdCAqLworICAgdm9zX2ZldGNoX3RsX2NmZ19wYXJtcyAoICZUTENvbmZpZywgCisgICAgICAgKChoZGRfY29udGV4dF90KikoZ3BWb3NDb250ZXh0LT5wSEREQ29udGV4dCkpLT5jZmdfaW5pKTsKKworICAgdlN0YXR1cyA9IFdMQU5UTF9PcGVuKGdwVm9zQ29udGV4dCwgJlRMQ29uZmlnKTsKKyAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICAgeworICAgICAvKiBDcml0aWNhbCBFcnJvciAuLi4gIENhbm5vdCBwcm9jZWVkIGZ1cnRoZXIgKi8KKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIG9wZW4gVEwiLCBfX2Z1bmNfXyk7CisgICAgIFZPU19BU1NFUlQoMCk7CisgICAgIGdvdG8gZXJyX3NtZV9jbG9zZTsKKyAgIH0KKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiJXM6IFZPU1Mgc3VjY2Vzc2Z1bGx5IE9wZW5lZCIsIF9fZnVuY19fKTsKKworICAgKnBWb3NDb250ZXh0ID0gZ3BWb3NDb250ZXh0OworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworCisKK2Vycl9zbWVfY2xvc2U6CisgICBzbWVfQ2xvc2UoZ3BWb3NDb250ZXh0LT5wTUFDQ29udGV4dCk7CisKK2Vycl9tYWNfY2xvc2U6CisgICBtYWNDbG9zZShncFZvc0NvbnRleHQtPnBNQUNDb250ZXh0KTsKKworZXJyX252X2Nsb3NlOgorICAgdm9zX252X2Nsb3NlKCk7CisgICAKK2Vycl9zeXNfY2xvc2U6ICAgCisgICBzeXNDbG9zZShncFZvc0NvbnRleHQpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCitlcnJfcGFja2V0X2Nsb3NlOgorICAgdm9zX3BhY2tldF9jbG9zZSggZ3BWb3NDb250ZXh0ICk7CisKK2Vycl93ZGFfY2xvc2U6CisgICBXREFfY2xvc2UoZ3BWb3NDb250ZXh0KTsKKyNlbmRpZgorCitlcnJfc2NoZWRfY2xvc2U6ICAgCisgICB2b3Nfc2NoZWRfY2xvc2UoZ3BWb3NDb250ZXh0KTsKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKK2Vycl9wYWNrZXRfY2xvc2U6CisgICB2b3NfcGFja2V0X2Nsb3NlKCBncFZvc0NvbnRleHQgKTsKKyNlbmRpZgorCitlcnJfbXNnX3F1ZXVlOgorICAgdm9zX21xX2RlaW5pdCgmZ3BWb3NDb250ZXh0LT5mcmVlVm9zTXEpOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCitlcnJfd2RhX2NvbXBsZXRlX2V2ZW50OgorICAgdm9zX2V2ZW50X2Rlc3Ryb3koICZncFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQgKTsKKyNlbmRpZgorCitlcnJfcHJvYmVfZXZlbnQ6CisgICB2b3NfZXZlbnRfZGVzdHJveSgmZ3BWb3NDb250ZXh0LT5Qcm9iZUV2ZW50KTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworCit9IC8qIHZvc19vcGVuKCkgKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3ByZVN0YXJ0KCkgLQorCisgIFRoZSBcYSB2b3NfcHJlU3RhcnQoKSBmdW5jdGlvbiB0byBkb3dubG9hZCBDRkcuCisgIGluY2x1ZGluZzoKKyAgICAgIC0gY2NtU3RhcnQKKworICAgICAgLSBXREE6IHRyaWdnZXJzIHRoZSBDRkcgZG93bmxvYWQKKworCisgIFxwYXJhbSAgcFZvc0NvbnRleHQ6IFRoZSBWT1MgY29udGV4dAorCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBTY2hlZHVsZXIgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQKKyAgICAgICAgICBpcyByZWFkeSB0byBiZSB1c2VkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX1JFU09VUkNFUyAtIFN5c3RlbSByZXNvdXJjZXMgKG90aGVyIHRoYW4gbWVtb3J5KQorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZSB0byBpbml0aWxpemUgdGhlIHNjaGVkdWxlcgorCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgc2NoZWR1bGVyLworCisgIFxzYSB2b3Nfc3RhcnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3ByZVN0YXJ0KCB2X0NPTlRFWFRfdCB2b3NDb250ZXh0ICkKK3sKKyAgIFZPU19TVEFUVVMgdlN0YXR1cyAgICAgICAgICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHBWb3NDb250ZXh0VHlwZSBwVm9zQ29udGV4dCA9IChwVm9zQ29udGV4dFR5cGUpdm9zQ29udGV4dDsKKyAgIAorICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU1lTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAidm9zIHByZXN0YXJ0Iik7CisKKyAgIFZPU19BU1NFUlQoZ3BWb3NDb250ZXh0ID09IHBWb3NDb250ZXh0KTsKKworICAgVk9TX0FTU0VSVCggTlVMTCAhPSBwVm9zQ29udGV4dC0+cE1BQ0NvbnRleHQpOworCisgICBWT1NfQVNTRVJUKCBOVUxMICE9IHBWb3NDb250ZXh0LT5wV0RBQ29udGV4dCk7CisKKyAgIC8qIGNhbGwgbWFjUHJlU3RhcnQgKi8KKyAgIHZTdGF0dXMgPSBtYWNQcmVTdGFydChncFZvc0NvbnRleHQtPnBNQUNDb250ZXh0KTsKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAiRmFpbGVkIGF0IG1hY1ByZVN0YXJ0ICIpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKiBjYWxsIGNjbVN0YXJ0ICovCisgICBjY21TdGFydChncFZvc0NvbnRleHQtPnBNQUNDb250ZXh0KTsKKworICAgLyogUmVzZXQgd2RhIHdhaXQgZXZlbnQgKi8KKyAgIHZvc19ldmVudF9yZXNldCgmZ3BWb3NDb250ZXh0LT53ZGFDb21wbGV0ZUV2ZW50KTsgICAKKyAgICAKKworICAgLypjYWxsIFdEQSBwcmUgc3RhcnQqLworICAgdlN0YXR1cyA9IFdEQV9wcmVTdGFydChncFZvc0NvbnRleHQpOworICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TWVMsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAiRmFpbGVkIHRvIFdEQSBwcmVzdGFydCIpOworICAgICAgbWFjU3RvcChncFZvc0NvbnRleHQtPnBNQUNDb250ZXh0LCBIQUxfU1RPUF9UWVBFX1NZU19ERUVQX1NMRUVQKTsKKyAgICAgIGNjbVN0b3AoZ3BWb3NDb250ZXh0LT5wTUFDQ29udGV4dCk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKiBOZWVkIHRvIHVwZGF0ZSB0aW1lIG91dCBvZiBjb21wbGV0ZSAqLworICAgdlN0YXR1cyA9IHZvc193YWl0X3NpbmdsZV9ldmVudCggJmdwVm9zQ29udGV4dC0+d2RhQ29tcGxldGVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19XREFfVElNRU9VVCApOworICAgaWYgKCB2U3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUyApCisgICB7CisgICAgICBpZiAoIHZTdGF0dXMgPT0gVk9TX1NUQVRVU19FX1RJTUVPVVQgKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiJXM6IFRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIFdEQSBjb21wbGV0ZVxuIiwgX19mdW5jX18pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgIiVzOiBXREFfcHJlU3RhcnQgcmVwb3J0aW5nIG90aGVyIGVycm9yIiwgX19mdW5jX18pOworICAgICAgfQorICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3N0YXJ0KCkgLSBTdGFydCB0aGUgTGlicmEgU1cgTW9kdWxlcyAKKyAgICAKKyAgVGhlIFxhIHZvc19zdGFydCgpIGZ1bmN0aW9uIHN0YXJ0cyBhbGwgdGhlIGNvbXBvbmVudHMgb2YgdGhlIExpYnJhIFNXCisgIGluY2x1ZGluZzoKKyAgICAgIC0gU0FML0JBTCwgd2hpY2ggaW4gdHVybiBzdGFydHMgU1NDCisgICAgICAKKyAgICAgIC0gdGhlIE1BQyAoSEFMIGFuZCBQRSkKKyAgICAgIAorICAgICAgLSBTTUUKKyAgICAgIAorICAgICAgLSBUTAorICAgICAgCisgICAgICAtIFNZUzogdHJpZ2dlcnMgdGhlIENGRyBkb3dubG9hZAorICAKKyAgCisgIFxwYXJhbSAgcFZvc0NvbnRleHQ6IFRoZSBWT1MgY29udGV4dAorIAorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBTY2hlZHVsZXIgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQgCisgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKyAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX1JFU09VUkNFUyAtIFN5c3RlbSByZXNvdXJjZXMgKG90aGVyIHRoYW4gbWVtb3J5KSAKKyAgICAgICAgICBhcmUgdW5hdmFpbGFibGUgdG8gaW5pdGlsaXplIHRoZSBzY2hlZHVsZXIKKworICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gRmFpbHVyZSB0byBpbml0aWFsaXplIHRoZSBzY2hlZHVsZXIvICAgCisgICAgICAgICAgCisgIFxzYSB2b3NfcHJlU3RhcnQoKQorICBcc2Egdm9zX29wZW4oKQorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19zdGFydCggdl9DT05URVhUX3Qgdm9zQ29udGV4dCApCit7CisgIFZPU19TVEFUVVMgdlN0YXR1cyAgICAgICAgICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgdFNpclJldFN0YXR1cyBzaXJTdGF0dXMgICAgID0gZVNJUl9TVUNDRVNTOworICBwVm9zQ29udGV4dFR5cGUgcFZvc0NvbnRleHQgPSAocFZvc0NvbnRleHRUeXBlKXZvc0NvbnRleHQ7CisgIHRIYWxNYWNTdGFydFBhcmFtZXRlcnMgaGFsU3RhcnRQYXJhbXM7CisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICB2X1ZPSURfdCAqcEZ3QmluYXJ5ID0gTlVMTDsKKyAgdl9TSVpFX3QgIG51bUZ3Qnl0ZXMgPSAwOworI2VuZGlmCisKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiJXM6IFN0YXJ0aW5nIExpYnJhIFNXIiwgX19mdW5jX18pOworCisgIC8qIFdlIHN1cHBvcnQgb25seSBvbmUgaW5zdGFuY2UgZm9yIG5vdyAuLi4qLworICBpZiAoZ3BWb3NDb250ZXh0ICE9IHBWb3NDb250ZXh0KQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgIiVzOiBtaXNtYXRjaCBpbiBjb250ZXh0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgIGlmICgoIHBWb3NDb250ZXh0LT5wQkFMQ29udGV4dCA9PSBOVUxMKSB8fCAoIHBWb3NDb250ZXh0LT5wTUFDQ29udGV4dCA9PSBOVUxMKQorICAgICB8fCAoIHBWb3NDb250ZXh0LT5wVExDb250ZXh0ID09IE5VTEwpKQorICB7CisgICAgIGlmIChwVm9zQ29udGV4dC0+cEJBTENvbnRleHQgPT0gTlVMTCkKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICIlczogQkFMIE5VTEwgY29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIGVsc2UgaWYgKHBWb3NDb250ZXh0LT5wTUFDQ29udGV4dCA9PSBOVUxMKQorICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIiVzOiBNQUMgTlVMTCBjb250ZXh0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgZWxzZQorICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgIiVzOiBUTCBOVUxMIGNvbnRleHQiLCBfX0ZVTkNUSU9OX18pOworICAgICAKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisjZWxzZQorICBpZiAoKCBwVm9zQ29udGV4dC0+cFdEQUNvbnRleHQgPT0gTlVMTCkgfHwgKCBwVm9zQ29udGV4dC0+cE1BQ0NvbnRleHQgPT0gTlVMTCkKKyAgICAgfHwgKCBwVm9zQ29udGV4dC0+cFRMQ29udGV4dCA9PSBOVUxMKSkKKyAgeworICAgICBpZiAocFZvc0NvbnRleHQtPnBXREFDb250ZXh0ID09IE5VTEwpCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAiJXM6IFdEQSBOVUxMIGNvbnRleHQiLCBfX0ZVTkNUSU9OX18pOworICAgICBlbHNlIGlmIChwVm9zQ29udGV4dC0+cE1BQ0NvbnRleHQgPT0gTlVMTCkKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICIlczogTUFDIE5VTEwgY29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIGVsc2UKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICIlczogVEwgTlVMTCBjb250ZXh0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgCisgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIC8qIFdEQV9TdGFydCB3aWxsIGJlIGNhbGxlZCBhZnRlciBOViBpbWFnZSBkb3dubG9hZCBiZWNhdXNlIHRoZSAKKyAgICBOViBpbWFnZSBkYXRhIGhhcyB0byBiZSB1cGRhdGVkIGF0IEhBTCBiZWZvcmUgSEFMX1N0YXJ0IGdldHMgZXhlY3V0ZWQqLworCisgIC8qIFN0YXJ0IHRoZSBOViBJbWFnZSBEb3dubG9hZCAqLworCisgIHZvc19ldmVudF9yZXNldCggJihncFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQpICk7CisKKyAgdlN0YXR1cyA9IFdEQV9OVkRvd25sb2FkX1N0YXJ0KHBWb3NDb250ZXh0KTsKKworICBpZiAoIHZTdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTICkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdGFydCBOViBEb3dubG9hZCIsIF9fZnVuY19fKTsKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgdlN0YXR1cyA9IHZvc193YWl0X3NpbmdsZV9ldmVudCggJihncFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfV0RBX1RJTUVPVVQgKTsKKworICBpZiAoIHZTdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTICkKKyAgeworICAgICBpZiAoIHZTdGF0dXMgPT0gVk9TX1NUQVRVU19FX1RJTUVPVVQgKQorICAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IFRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIFdEQV9OVkRvd25sb2FkX3N0YXJ0IGNvbXBsZXRlIiwgX19mdW5jX18pOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBXREFfTlZEb3dubG9hZF9zdGFydCByZXBvcnRpbmcgb3RoZXIgZXJyb3IiLCBfX2Z1bmNfXyk7CisgICAgIH0KKyAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgZ290byBlcnJfd2RhX3N0b3A7ICAgCisgIH0KKworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICIlczogV0RBX05WRG93bmxvYWRfc3RhcnQgY29ycmVjdGx5IHN0YXJ0ZWQiLCBfX2Z1bmNfXyk7CisKKyAgLyogU3RhcnQgdGhlIFdEQSAqLworICB2U3RhdHVzID0gV0RBX3N0YXJ0KHBWb3NDb250ZXh0KTsKKyAgaWYgKCB2U3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUyApCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RhcnQgV0RBIiwgX19mdW5jX18pOworICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiJXM6IFdEQSBjb3JyZWN0bHkgc3RhcnRlZCIsIF9fZnVuY19fKTsKKworI2VuZGlmCisgIC8qIFN0YXJ0IHRoZSBNQUMgKi8KKyAgdm9zX21lbV96ZXJvKCh2X1BWT0lEX3QpJmhhbFN0YXJ0UGFyYW1zLCBzaXplb2YodEhhbE1hY1N0YXJ0UGFyYW1ldGVycykpOworCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAvKiBBdHRlbXB0IHRvIGdldCB0aGUgZmlybXdhcmUgYmluYXJ5IHRocm91Z2ggVk9TLiAgV2UgbmVlZCB0byBwYXNzIHRoaXMKKyAgICAgdG8gdGhlIE1BQyB3aGVuIHN0YXJ0aW5nLiAqLworICB2U3RhdHVzID0gdm9zX2dldF9md2JpbmFyeSgmcEZ3QmluYXJ5LCAmbnVtRndCeXRlcyk7CisgIAorICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZTdGF0dXMgKSApCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gZ2V0IGZpcm13YXJlIGJpbmFyeSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzOiBGaXJtd2FyZSBiaW5hcnkgZmlsZSBmb3VuZCIsIF9fZnVuY19fKTsKKyAgIAorCisgIC8vQmVnaW5pbmcga2VybmVsIDIuNi4zMSwgbWVtb3J5IGJ1ZmZlciByZXR1cm5lZCBieSByZXF1ZXN0X2Zpcm13YXJlIEFQSQorICAvL2Nhbm5vdCBiZSBvdmVyd3JpdHRlbi4gU28gbmVlZCB0byBjb3B5IHRoZSBmaXJtd2FyZSBpbnRvIGEgc2VwYXJhdGUgYnVmZmVyCisgIC8vYXMgSEFMIG5lZWRzIHRvIG1vZGlmeSB0aGUgZW5kaWFuZXNzIG9mIEZXIGJpbmFyeS4KKworICAvL0tlcm5lbCBtYXkgbm90IGhhdmUgfjQwIHBhZ2VzIG9mIGZyZWUgYnVmZmVycyBhbHdheXMsIHNvCisgIC8vU3RvcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBwcm92aWRlZCBieSBrZXJuZWwgZm9yIG5vdywKKyAgLy9XaGVuIHJlcXVpcmVkIGNvcHkgaXQgdG8gbG9jYWwgYnVmZmVyIGZvciB0cmFuc2xhdGlvbi4KKyAgLy9UaGlzIGlzIGRvbmUgaW4gdm9zX2FwaS5jLCBkdXJpbmcgZmlybXdhcmUgZG93bmxvYWQKKyAgLy9UaGlzIHdvdWxkIHByb3ZpZGUgY29tbW9uIGZpeCBmb3IgZnRtIGRyaXZlciBpc3N1ZSBhc3dlbGwsIAorICAvL3doaWNoIGlzIG5vdCBjcmVhdGluZyB0aGUgY29weSBvZiBmaXJtd2FyZSBpbWFnZSBmb3IgZW5kaWFuIGNvbnZlcnNpb24uCisgIGhhbFN0YXJ0UGFyYW1zLkZXLmNiSW1hZ2UgPSBudW1Gd0J5dGVzOworICBoYWxTdGFydFBhcmFtcy5GVy5wSW1hZ2UgPSBwRndCaW5hcnk7CisKKyAvL2RldGVybWluZSB0aGUgZHJpdmVyVHlwZSBmb3IgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uCisgaGFsU3RhcnRQYXJhbXMuZHJpdmVyVHlwZSA9IGVEUklWRVJfVFlQRV9QUk9EVUNUSU9OOworI2VuZGlmCisgIC8qIFN0YXJ0IHRoZSBNQUMgKi8KKyAgc2lyU3RhdHVzID0gbWFjU3RhcnQocFZvc0NvbnRleHQtPnBNQUNDb250ZXh0LCh2X1BWT0lEX3QpJmhhbFN0YXJ0UGFyYW1zKTsKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgaGRkX3JlbGVhc2VfZmlybXdhcmUoV0xBTl9GV19GSUxFLCBwVm9zQ29udGV4dC0+cEhERENvbnRleHQpOworCisgIGhhbFN0YXJ0UGFyYW1zLkZXLnBJbWFnZSA9IE5VTEw7CisgIGhhbFN0YXJ0UGFyYW1zLkZXLmNiSW1hZ2UgPSAwOworI2VuZGlmIAorICBpZiAoZVNJUl9TVUNDRVNTICE9IHNpclN0YXR1cykKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RhcnQgTUFDIiwgX19mdW5jX18pOworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisjZWxzZQorICAgIGdvdG8gZXJyX3dkYV9zdG9wOworI2VuZGlmCisgIH0KKyAgIAorICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICIlczogTUFDIGNvcnJlY3RseSBzdGFydGVkIiwgX19mdW5jX18pOworCisgIC8qIFNUQVJUIFNNRSAqLworICB2U3RhdHVzID0gc21lX1N0YXJ0KHBWb3NDb250ZXh0LT5wTUFDQ29udGV4dCk7CisKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RhcnQgU01FIiwgX19mdW5jX18pOworICAgIGdvdG8gZXJyX21hY19zdG9wOworICB9CisKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiJXM6IFNNRSBjb3JyZWN0bHkgc3RhcnRlZCIsIF9fZnVuY19fKTsKKworICAvKiogU1RBUlQgVEwgKi8KKyAgdlN0YXR1cyA9IFdMQU5UTF9TdGFydChwVm9zQ29udGV4dCk7CisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN0YXJ0IFRMIiwgX19mdW5jX18pOworICAgIGdvdG8gZXJyX3NtZV9zdG9wOworICB9CisKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiVEwgY29ycmVjdGx5IHN0YXJ0ZWQiKTsKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICAKKyAgLyogU1RBUlQgU1lTLiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgQ0ZHIGRvd25sb2FkICovCisgIHN5c01jU3RhcnQocFZvc0NvbnRleHQsIHZvc19zeXNfc3RhcnRfY29tcGxldGVfY2JhY2ssIHBWb3NDb250ZXh0KTsKKworICBpZiAodm9zX3dhaXRfc2luZ2xlX2V2ZW50KCZncFZvc0NvbnRleHQtPlByb2JlRXZlbnQsIDApIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdGFydCBTWVMgbW9kdWxlIiwgX19mdW5jX18pOworICAgICBnb3RvIGVycl90bF9zdG9wOworICB9CisKKworICAgLyoqCisgICBFVk0gaXNzdWUgaXMgb2JzZXJ2ZWQgd2l0aCAxLjZNaHogZnJlcSBmb3IgMS4zViBSRiBzdXBwbHkgaW4gd2xhbiBzdGFuZGFsb25lIGNhc2UuCisgICBEdXJpbmcgY29uY3VycmVudCBvcGVyYXRpb24gKGUuZy4gV0xBTiBhbmQgV0NETUEpIHRoaXMgaXNzdWUgaXMgbm90IG9ic2VydmVkLgorICAgVG8gd29ya2Fyb3VuZCwgd2xhbiB3aWxsIHZvdGUgZm9yIDMuMk1oeiBkdXJpbmcgc3RhcnR1cCBhbmQgd2lsbCB2b3RlIGZvciAxLjZNaHoKKyAgIGR1cmluZyBleGl0LgorICAgU2luY2UgdXNpbmcgMy4yTWh6IGhhcyBhIHNpZGUgZWZmZWN0IG9uIHBvd2VyIChleHRyYSAyMDB1YSksIHRoaXMgaXMgbGVmdCBjb25maWd1cmFibGUuCisgICBJZiBjdXN0b21lcnMgZG8gdGhlaXIgZGVzaWduIHJpZ2h0LCB0aGV5IHNob3VsZCBub3Qgc2VlIHRoZSBFVk0gaXNzdWUgYW5kIGluIHRoYXQgY2FzZSB0aGV5CisgICBjYW4gZGVjaWRlIHRvIGtlZXAgMS42TWh6IGJ5IHNldHRpbmcgYW4gTlYuCisgICBJZiBOViBpdGVtIGlzIG5vdCBwcmVzZW50LCB1c2UgdGhlIGRlZmF1bHQgMy4yTWh6CisgICB2b3Nfc3RvcCBpcyBhbHNvIGludm9rZWQgaWYgd2xhbiBzdGFydHVwIHNlcSBmYWlscyAoYWZ0ZXIgdm9zX3N0YXJ0LCB3aGVyZSAzLjJNaHogaXMgdm90ZWQuKQorICAgKi8KKyAgeworICAgc0ZyZXFGb3IxcDNWU3VwcGx5IGZyZXE7CisgICB2U3RhdHVzID0gdm9zX252X3JlYWQoIE5WX1RBQkxFX0ZSRVFVRU5DWV9GT1JfMV8zVl9TVVBQTFksICZmcmVxLCBOVUxMLAorICAgICAgICAgc2l6ZW9mKGZyZXEpICk7CisgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZTdGF0dXMpCisgICAgZnJlcS5mcmVxRm9yMXAzVlN1cHBseSA9IFZPU19OVl9GUkVRVUVOQ1lfRk9SXzFfM1ZfU1VQUExZXzNQMk1IOworCisgICAgaWYgKHZvc19jaGlwVm90ZUZyZXFGb3IxcDNWU3VwcGx5KE5VTEwsIE5VTEwsIE5VTEwsIGZyZXEuZnJlcUZvcjFwM1ZTdXBwbHkpICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzZXQgdGhlIGZyZXEgJWQgZm9yIDEuM1YgU3VwcGx5IiwKKyAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZnJlcS5mcmVxRm9yMXAzVlN1cHBseSApOworICB9CisKKyNlbmRpZgorICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiJXM6IFZPU1MgU3RhcnQgaXMgc3VjY2Vzc2Z1bCEhIiwgX19mdW5jX18pOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCitlcnJfdGxfc3RvcDoKKyAgV0xBTlRMX1N0b3AocFZvc0NvbnRleHQpOworI2VuZGlmCisKK2Vycl9zbWVfc3RvcDoKKyAgc21lX1N0b3AocFZvc0NvbnRleHQtPnBNQUNDb250ZXh0LCBUUlVFKTsKKyAgICAKK2Vycl9tYWNfc3RvcDoKKyAgbWFjU3RvcCggcFZvc0NvbnRleHQtPnBNQUNDb250ZXh0LCBIQUxfU1RPUF9UWVBFX1NZU19SRVNFVCApOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCitlcnJfd2RhX3N0b3A6ICAgCisgIHZvc19ldmVudF9yZXNldCggJihncFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQpICk7CisgIFdEQV9zdG9wKCBwVm9zQ29udGV4dCwgSEFMX1NUT1BfVFlQRV9SRl9LSUxMKTsKKyAgdlN0YXR1cyA9IHZvc193YWl0X3NpbmdsZV9ldmVudCggJihncFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfV0RBX1RJTUVPVVQgKTsKKyAgaWYoIHZTdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTICkKKyAgeworICAgICBpZiggdlN0YXR1cyA9PSBWT1NfU1RBVFVTX0VfVElNRU9VVCApCisgICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICIlczogVGltZW91dCBvY2N1cnJlZCBiZWZvcmUgV0RBX3N0b3AgY29tcGxldGUiLCBfX2Z1bmNfXyk7CisKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICIlczogV0RBX3N0b3AgcmVwb3J0aW5nIG90aGVyIGVycm9yIiwgX19mdW5jX18pOworICAgICB9CisgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgCit9IC8qIHZvc19zdGFydCgpICovCisKKworLyogdm9zX3N0b3AgZnVuY3Rpb24gKi8KK1ZPU19TVEFUVVMgdm9zX3N0b3AoIHZfQ09OVEVYVF90IHZvc0NvbnRleHQgKQoreworICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAvKiBXREFfU3RvcCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBTWVMgc28gdGhhdCB0aGUgcHJvY2Vzc2luZyBvZiBSaXZhIAorICBwZW5kaW5nIHJlc3BvbmNlcyB3aWxsIG5vdCBiZSBoYW5kbGVkIGR1cmluZyB1bmluaXRpYWxpemF0aW9uIG9mIFdMQU4gZHJpdmVyICovCisgIHZvc19ldmVudF9yZXNldCggJihncFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQpICk7CisKKyAgdm9zU3RhdHVzID0gV0RBX3N0b3AoIHZvc0NvbnRleHQsIEhBTF9TVE9QX1RZUEVfUkZfS0lMTCApOworCisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIHN0b3AgV0RBIiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKworICB2b3NTdGF0dXMgPSB2b3Nfd2FpdF9zaW5nbGVfZXZlbnQoICYoZ3BWb3NDb250ZXh0LT53ZGFDb21wbGV0ZUV2ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfV0RBX1NUT1BfVElNRU9VVCApOworICAgCisgIGlmICggdm9zU3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUyApCisgIHsKKyAgICAgaWYgKCB2b3NTdGF0dXMgPT0gVk9TX1NUQVRVU19FX1RJTUVPVVQgKQorICAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IFRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIFdEQSBjb21wbGV0ZSIsIF9fZnVuY19fKTsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogV0RBX3N0b3AgcmVwb3J0aW5nIG90aGVyIGVycm9yIiwgX19mdW5jX18gKTsKKyAgICAgfQorICAgICAvKiBpZiBXREEgc3RvcCBmYWlsZWQsIGNhbGwgV0RBIHNodXRkb3duIHRvIGNsZWFudXAgV0RBL1dESSAqLworICAgICB2b3NTdGF0dXMgPSBXREFfc2h1dGRvd24oIHZvc0NvbnRleHQsIFZPU19UUlVFICk7CisgICAgIGlmIChWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICkKKyAgICAgeworICAgICAgICBoZGRfc2V0X3Nzcl9yZXF1aXJlZCggVk9TX1RSVUUgKTsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBzaHV0ZG93biBXREEiLCBfX2Z1bmNfXyApOworICAgICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLyogU1lTIFNUT1Agd2lsbCBzdG9wIFNNRSBhbmQgTUFDICovCisgIHZvc1N0YXR1cyA9IHN5c1N0b3AoIHZvc0NvbnRleHQpOworICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBzdG9wIFNZUyIsIF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisKKyAgdm9zU3RhdHVzID0gV0xBTlRMX1N0b3AoIHZvc0NvbnRleHQgKTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc3RvcCBUTCIsIF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAvKioKKyAgIEVWTSBpc3N1ZSBpcyBvYnNlcnZlZCB3aXRoIDEuNk1oeiBmcmVxIGZvciAxLjNWIHN1cHBseSBpbiB3bGFuIHN0YW5kYWxvbmUgY2FzZS4KKyAgIER1cmluZyBjb25jdXJyZW50IG9wZXJhdGlvbiAoZS5nLiBXTEFOIGFuZCBXQ0RNQSkgdGhpcyBpc3N1ZSBpcyBub3Qgb2JzZXJ2ZWQuCisgICBUbyB3b3JrYXJvdW5kLCB3bGFuIHdpbGwgdm90ZSBmb3IgMy4yTWh6IGR1cmluZyBzdGFydHVwIGFuZCB3aWxsIHZvdGUgZm9yIDEuNk1oegorICAgZHVyaW5nIGV4aXQuCisgICB2b3Nfc3RvcCBpcyBhbHNvIGludm9rZWQgaWYgd2xhbiBzdGFydHVwIHNlcSBmYWlscyAoYWZ0ZXIgdm9zX3N0YXJ0LCB3aGVyZSAzLjJNaHogaXMgdm90ZWQuKQorICAgKi8KKyAgIGlmICh2b3NfY2hpcFZvdGVGcmVxRm9yMXAzVlN1cHBseShOVUxMLCBOVUxMLCBOVUxMLCBWT1NfTlZfRlJFUVVFTkNZX0ZPUl8xXzNWX1NVUFBMWV8xUDZNSCkgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc2V0IHRoZSBmcmVxIHRvIDEuNk1oeiBmb3IgMS4zViBTdXBwbHkiLCBfX2Z1bmNfXyApOworI2VuZGlmCisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKiB2b3NfY2xvc2UgZnVuY3Rpb24gKi8KK1ZPU19TVEFUVVMgdm9zX2Nsb3NlKCB2X0NPTlRFWFRfdCB2b3NDb250ZXh0ICkKK3sKKyAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyAgdm9zU3RhdHVzID0gV0xBTkJBUF9DbG9zZSh2b3NDb250ZXh0KTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY2xvc2UgQkFQIiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKyNlbmRpZiAvLyBXTEFOX0JUQU1QX0ZFQVRVUkUKKworCisgIHZvc1N0YXR1cyA9IFdMQU5UTF9DbG9zZSh2b3NDb250ZXh0KTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY2xvc2UgVEwiLCBfX2Z1bmNfXyk7CisgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgfQorICAgCisgIHZvc1N0YXR1cyA9IHNtZV9DbG9zZSggKChwVm9zQ29udGV4dFR5cGUpdm9zQ29udGV4dCktPnBNQUNDb250ZXh0KTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY2xvc2UgU01FIiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKworICB2b3NTdGF0dXMgPSBtYWNDbG9zZSggKChwVm9zQ29udGV4dFR5cGUpdm9zQ29udGV4dCktPnBNQUNDb250ZXh0KTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY2xvc2UgTUFDIiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKworICAoKHBWb3NDb250ZXh0VHlwZSl2b3NDb250ZXh0KS0+cE1BQ0NvbnRleHQgPSBOVUxMOworCisgIHZvc1N0YXR1cyA9IHZvc19udl9jbG9zZSgpOworICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBjbG9zZSBOViIsIF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisKKworICB2b3NTdGF0dXMgPSBzeXNDbG9zZSggdm9zQ29udGV4dCApOworICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBjbG9zZSBTWVMiLCBfX2Z1bmNfXyk7CisgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgIHZvc1N0YXR1cyA9IFdEQV9jbG9zZSggdm9zQ29udGV4dCApOworICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBjbG9zZSBXREEiLCBfX2Z1bmNfXyk7CisgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgfQorICAKKyAgLyogTGV0IERYRSByZXR1cm4gcGFja2V0cyBpbiBXREFfY2xvc2UgYW5kIHRoZW4gZnJlZSB0aGVtIGhlcmUgKi8KKyAgdm9zU3RhdHVzID0gdm9zX3BhY2tldF9jbG9zZSggdm9zQ29udGV4dCApOworICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBjbG9zZSBWT1NTIFBhY2tldCIsIF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisjZW5kaWYKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgdm9zU3RhdHVzID0gdm9zX3BhY2tldF9jbG9zZSggdm9zQ29udGV4dCApOworICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IEZhaWxlZCB0byBjbG9zZSBWT1NTIFBhY2tldCIsIF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisjZW5kaWYKKworICB2b3NfbXFfZGVpbml0KCYoKHBWb3NDb250ZXh0VHlwZSl2b3NDb250ZXh0KS0+ZnJlZVZvc01xKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICB2b3NTdGF0dXMgPSB2b3NfZXZlbnRfZGVzdHJveSgmZ3BWb3NDb250ZXh0LT53ZGFDb21wbGV0ZUV2ZW50KTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBmYWlsZWQgdG8gZGVzdHJveSB3ZGFDb21wbGV0ZUV2ZW50IiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKyNlbmRpZgorCisgIHZvc1N0YXR1cyA9IHZvc19ldmVudF9kZXN0cm95KCZncFZvc0NvbnRleHQtPlByb2JlRXZlbnQpOworICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IGZhaWxlZCB0byBkZXN0cm95IFByb2JlRXZlbnQiLCBfX2Z1bmNfXyk7CisgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgfQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisgICAgICAgICAgICAgICAgICAKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2dldF9jb250ZXh0KCkgLSBnZXQgY29udGV4dCBkYXRhIGFyZWEKKyAgCisgIEVhY2ggbW9kdWxlIGluIHRoZSBzeXN0ZW0gaGFzIGEgY29udGV4dCAvIGRhdGEgYXJlYSB0aGF0IGlzIGFsbG9jYXRlZAorICBhbmQgbWFhbmdlZCBieSB2b3NzLiAgVGhpcyBBUEkgYWxsb3dzIGFueSB1c2VyIHRvIGdldCBhIHBvaW50ZXIgdG8gaXRzIAorICBhbGxvY2F0ZWQgY29udGV4dCBkYXRhIGFyZWEgZnJvbSB0aGUgVk9TUyBnbG9iYWwgY29udGV4dC4gIAorCisgIFxwYXJhbSB2b3NDb250ZXh0IC0gdGhlIFZPU1MgR2xvYmFsIENvbnRleHQuICAKKyAgCisgIFxwYXJhbSBtb2R1bGVJZCAtIHRoZSBtb2R1bGUgSUQsIHdobydzIGNvbnRleHQgZGF0YSBhcmUgaXMgYmVpbmcgcmV0cml2ZWQuCisgICAgICAgICAgICAgICAgICAgICAgCisgIFxyZXR1cm4gLSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGRhdGEgYXJlYS4KKyAgCisgICAgICAgICAgLSBOVUxMIGlmIHRoZSBjb250ZXh0IGRhdGEgaXMgbm90IGFsbG9jYXRlZCBmb3IgdGhlIG1vZHVsZSBJRAorICAgICAgICAgICAgc3BlY2lmaWVkIAorICAgICAgICAgICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9WT0lEX3QqIHZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRCBtb2R1bGVJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCApCit7CisgIHZfUFZPSURfdCBwTW9kQ29udGV4dCA9IE5VTEw7CisKKyAgaWYgKHBWb3NDb250ZXh0ID09IE5VTEwpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICIlczogdm9zIGNvbnRleHQgcG9pbnRlciBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChncFZvc0NvbnRleHQgIT0gcFZvc0NvbnRleHQpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAiJXM6IHBWb3NDb250ZXh0ICE9IGdwVm9zQ29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBzd2l0Y2gobW9kdWxlSWQpCisgIHsKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfVEw6ICAKKyAgICB7CisgICAgICBwTW9kQ29udGV4dCA9IGdwVm9zQ29udGV4dC0+cFRMQ29udGV4dDsKKyAgICAgIGJyZWFrOworICAgIH0KKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfQkFMOgorICAgIHsKKyAgICAgIHBNb2RDb250ZXh0ID0gZ3BWb3NDb250ZXh0LT5wQkFMQ29udGV4dDsKKyAgICAgIGJyZWFrOworICAgIH0gICAKKworICAgIGNhc2UgVk9TX01PRFVMRV9JRF9TQUw6CisgICAgeworICAgICAgcE1vZENvbnRleHQgPSBncFZvc0NvbnRleHQtPnBTQUxDb250ZXh0OworICAgICAgYnJlYWs7CisgICAgfSAgIAorCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1NTQzogICAKKyAgICB7CisgICAgICBwTW9kQ29udGV4dCA9IGdwVm9zQ29udGV4dC0+cFNTQ0NvbnRleHQ7CisgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfQkFQOgorICAgIHsKKyAgICAgICAgcE1vZENvbnRleHQgPSBncFZvc0NvbnRleHQtPnBCQVBDb250ZXh0OworICAgICAgICBicmVhazsKKyAgICB9ICAgIAorI2VuZGlmIC8vV0xBTl9CVEFNUF9GRUFUVVJFCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1NBUDoKKyAgICB7CisgICAgICBwTW9kQ29udGV4dCA9IGdwVm9zQ29udGV4dC0+cFNBUENvbnRleHQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfSEREX1NPRlRBUDoKKyAgICB7CisgICAgICBwTW9kQ29udGV4dCA9IGdwVm9zQ29udGV4dC0+cEhERFNvZnRBUENvbnRleHQ7CisgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKworICAgIGNhc2UgVk9TX01PRFVMRV9JRF9IREQ6CisgICAgeworICAgICAgcE1vZENvbnRleHQgPSBncFZvc0NvbnRleHQtPnBIRERDb250ZXh0OworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1NNRToKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX0hBTDoKKyNlbmRpZgorICAgIGNhc2UgVk9TX01PRFVMRV9JRF9QRToKKyAgICB7CisgICAgICAvKiAKKyAgICAgICoqIEluIGFsbCB0aGVzZSBjYXNlcywgd2UganVzdCByZXR1cm4gdGhlIE1BQyBDb250ZXh0CisgICAgICAqLworICAgICAgcE1vZENvbnRleHQgPSBncFZvc0NvbnRleHQtPnBNQUNDb250ZXh0OworICAgICAgYnJlYWs7CisgICAgfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1dEQToKKyAgICB7CisgICAgICAvKiBGb3IgV0RBIG1vZHVsZSAqLworICAgICAgcE1vZENvbnRleHQgPSBncFZvc0NvbnRleHQtPnBXREFDb250ZXh0OworICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfVk9TUzoKKyAgICB7CisgICAgICAvKiBGb3IgU1lTIHRoaXMgaXMgVk9TIGl0c2VsZiovCisgICAgICBwTW9kQ29udGV4dCA9IGdwVm9zQ29udGV4dDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlczogTW9kdWxlIElEICVpICIKKyAgICAgICAgICAiZG9lcyBub3QgaGF2ZSBpdHMgY29udGV4dCBtYWludGFpbmVkIGJ5IFZPU1MiLCBfX2Z1bmNfXywgbW9kdWxlSWQpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorCisgIGlmIChwTW9kQ29udGV4dCA9PSBOVUxMICkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwiJXM6IE1vZHVsZSBJRCAlaSAiCisgICAgICAgICAgImNvbnRleHQgaXMgTnVsbCIsIF9fZnVuY19fLCBtb2R1bGVJZCk7CisgIH0KKworICByZXR1cm4gcE1vZENvbnRleHQ7CisKK30gLyogdm9zX2dldF9jb250ZXh0KCkqLworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoKSAtIGdldCBWT1NTIGdsb2JhbCBDb250ZXh0CisgIAorICBUaGlzIEFQSSBhbGxvd3MgYW55IHVzZXIgdG8gZ2V0IHRoZSBWT1MgR2xvYmFsIENvbnRleHQgcG9pbnRlciBmcm9tIGEKKyAgbW9kdWxlIGNvbnRleHQgZGF0YSBhcmVhLiAgCisgIAorICBccGFyYW0gbW9kdWxlQ29udGV4dCAtIHRoZSBpbnB1dCBtb2R1bGUgY29udGV4dCBwb2ludGVyCisgIAorICBccGFyYW0gbW9kdWxlSWQgLSB0aGUgbW9kdWxlIElEIHdobydzIGNvbnRleHQgcG9pbnRlciBpcyBpbnB1dCBpbiAKKyAgICAgICAgIG1vZHVsZUNvbnRleHQuCisgICAgICAgICAgICAgICAgICAgICAgCisgIFxyZXR1cm4gLSBwb2ludGVyIHRvIHRoZSBWT1NTIGdsb2JhbCBjb250ZXh0CisgIAorICAgICAgICAgIC0gTlVMTCBpZiB0aGUgZnVuY3Rpb24gaXMgdW5hYmxlIHRvIHJldHJlaXZlIHRoZSBWT1NTIGNvbnRleHQuIAorICAgICAgICAgICAgICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9DT05URVhUX3Qgdm9zX2dldF9nbG9iYWxfY29udGV4dCggVk9TX01PRFVMRV9JRCBtb2R1bGVJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqbW9kdWxlQ29udGV4dCApCit7CisgIGlmIChncFZvc0NvbnRleHQgPT0gTlVMTCkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICIlczogZ2xvYmFsIHZvc3MgY29udGV4dCBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgfQorCisgIHJldHVybiBncFZvc0NvbnRleHQ7CisKK30gLyogdm9zX2dldF9nbG9iYWxfY29udGV4dCgpICovCisKKwordl9VOF90IHZvc19pc19sb2dwX2luX3Byb2dyZXNzKFZPU19NT0RVTEVfSUQgbW9kdWxlSWQsIHZfVk9JRF90ICptb2R1bGVDb250ZXh0KQoreworICBpZiAoZ3BWb3NDb250ZXh0ID09IE5VTEwpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAiJXM6IGdsb2JhbCB2b3NzIGNvbnRleHQgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAgcmV0dXJuIGdwVm9zQ29udGV4dC0+aXNMb2dwSW5Qcm9ncmVzczsKK30KKwordm9pZCB2b3Nfc2V0X2xvZ3BfaW5fcHJvZ3Jlc3MoVk9TX01PRFVMRV9JRCBtb2R1bGVJZCwgdl9VOF90IHZhbHVlKQoreworICBpZiAoZ3BWb3NDb250ZXh0ID09IE5VTEwpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAiJXM6IGdsb2JhbCB2b3NzIGNvbnRleHQgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuOworICB9CisKKyAgIGdwVm9zQ29udGV4dC0+aXNMb2dwSW5Qcm9ncmVzcyA9IHZhbHVlOworfQorCit2X1U4X3Qgdm9zX2lzX2xvYWRfdW5sb2FkX2luX3Byb2dyZXNzKFZPU19NT0RVTEVfSUQgbW9kdWxlSWQsIHZfVk9JRF90ICptb2R1bGVDb250ZXh0KQoreworICBpZiAoZ3BWb3NDb250ZXh0ID09IE5VTEwpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAiJXM6IGdsb2JhbCB2b3NzIGNvbnRleHQgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIDA7IAorICB9CisKKyAgIHJldHVybiBncFZvc0NvbnRleHQtPmlzTG9hZFVubG9hZEluUHJvZ3Jlc3M7Cit9CisKK3ZvaWQgdm9zX3NldF9sb2FkX3VubG9hZF9pbl9wcm9ncmVzcyhWT1NfTU9EVUxFX0lEIG1vZHVsZUlkLCB2X1U4X3QgdmFsdWUpCit7CisgIGlmIChncFZvc0NvbnRleHQgPT0gTlVMTCkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICIlczogZ2xvYmFsIHZvc3MgY29udGV4dCBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm47CisgIH0KKworICAgZ3BWb3NDb250ZXh0LT5pc0xvYWRVbmxvYWRJblByb2dyZXNzID0gdmFsdWU7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19hbGxvY19jb250ZXh0KCkgLSBhbGxvY2F0ZSBhIGNvbnRleHQgd2l0aGluIHRoZSBWT1NTIGdsb2JhbCBDb250ZXh0CisgIAorICBUaGlzIEFQSSBhbGxvd3MgYW55IHVzZXIgdG8gYWxsb2NhdGUgYSB1c2VyIGNvbnRleHQgYXJlYSB3aXRoaW4gdGhlIAorICBWT1MgR2xvYmFsIENvbnRleHQuICAKKyAgCisgIFxwYXJhbSBwVm9zQ29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBWb3MgY29udGV4dAorICAKKyAgXHBhcmFtIG1vZHVsZUlkIC0gdGhlIG1vZHVsZSBJRCB3aG8ncyBjb250ZXh0IGFyZWEgaXMgYmVpbmcgYWxsb2NhdGVkLgorICAKKyAgXHBhcmFtIHBwTW9kdWxlQ29udGV4dCAtIHBvaW50ZXIgdG8gbG9jYXRpb24gd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGNvbnRleHQgaXMgcmV0dXJuZWQuICBOb3RlIHRoaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9pbnRlciBpcyB2YWxpZCBvbmx5IGlmIHRoZSBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgVk9TX1NUQVRVU19TVUNDRVNTCisgIAorICBccGFyYW0gc2l6ZSAtIHRoZSBzaXplIG9mIHRoZSBjb250ZXh0IGFyZWEgdG8gYmUgYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAgICAgIAorICBccmV0dXJuIC0gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGhlIGNvbnRleHQgZm9yIHRoZSBtb2R1bGUgSUQgaGFzIGJlZW4gCisgICAgICAgICAgICBhbGxvY2F0ZWQgc3VjY2Vzc2Z1bGx5LiAgVGhlIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgYXJlYQorICAgICAgICAgICAgY2FuIGJlIGZvdW5kIGluICpwcE1vZHVsZUNvbnRleHQuICAKKyAgICAgICAgICAgIFxub3RlIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBWT1NfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIAorICAgICAgICAgICAgbW9kdWxlIGNvbnRleHQgd2FzIGFscmVhZHkgYWxsb2NhdGVkIGFuZCB0aGUgc2l6ZSAKKyAgICAgICAgICAgIGFsbG9jYXRlZCBtYXRjaGVzIHRoZSBzaXplIG9uIHRoaXMgY2FsbC4KKworICAgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gdGhlIG1vZHVsZUlkIGlzIG5vdCBhIHZhbGlkIG9yIGRvZXMgCisgICAgICAgICAgICBub3QgaWRlbnRpZnkgYSBtb2R1bGUgdGhhdCBjYW4gaGF2ZSBhIGNvbnRleHQgYWxsb2NhdGVkLgorCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRVhJU1RTIC0gdm9zIGNvdWxkIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgY29udGV4dCAKKyAgICAgICAgICAgIGJlY2F1c2UgYSBjb250ZXh0IGZvciB0aGlzIG1vZHVsZSBJRCBhbHJlYWR5IGV4aXN0cyBhbmQgaXQgaXMKKyAgICAgICAgICAgIGEgKmRpZmZlcmVudCogc2l6ZSB0aGF0IHNwZWNpZmllZCBvbiB0aGlzIGNhbGwuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9OT01FTSAtIHZvcyBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgCisgICAgICAgICAgICByZXF1ZXN0ZWQgY29udGV4dCBhcmVhLiAgCisgICAgICAgICAgICAgIAorICBcc2Egdm9zX2dldF9jb250ZXh0KCksIHZvc19mcmVlX2NvbnRleHQoKQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfYWxsb2NfY29udGV4dCggdl9WT0lEX3QgKnBWb3NDb250ZXh0LCBWT1NfTU9EVUxFX0lEIG1vZHVsZUlELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICoqcHBNb2R1bGVDb250ZXh0LCB2X1NJWkVfdCBzaXplICkKK3sKKyAgdl9WT0lEX3QgKiogcEdwTW9kQ29udGV4dCA9IE5VTEw7CisKKyAgaWYgKCBwVm9zQ29udGV4dCA9PSBOVUxMKSB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgIiVzOiB2b3MgY29udGV4dCBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICBpZiAoKCBncFZvc0NvbnRleHQgIT0gcFZvc0NvbnRleHQpIHx8ICggcHBNb2R1bGVDb250ZXh0ID09IE5VTEwpKSB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgIiVzOiBjb250ZXh0IG1pc21hdGNoIG9yIG51bGwgcGFyYW0gcGFzc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICBzd2l0Y2gobW9kdWxlSUQpCisgIHsKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfVEw6ICAKKyAgICB7CisgICAgICBwR3BNb2RDb250ZXh0ID0gJihncFZvc0NvbnRleHQtPnBUTENvbnRleHQpOyAKKyAgICAgIGJyZWFrOworICAgIH0KKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfQkFMOgorICAgIHsKKyAgICAgIHBHcE1vZENvbnRleHQgPSAmKGdwVm9zQ29udGV4dC0+cEJBTENvbnRleHQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1NBTDoKKyAgICB7CisgICAgICBwR3BNb2RDb250ZXh0ID0gJihncFZvc0NvbnRleHQtPnBTQUxDb250ZXh0KTsKKyAgICAgIGJyZWFrOworICAgIH0gICAKKworICAgIGNhc2UgVk9TX01PRFVMRV9JRF9TU0M6CisgICAgeworICAgICAgcEdwTW9kQ29udGV4dCA9ICYoZ3BWb3NDb250ZXh0LT5wU1NDQ29udGV4dCk7IAorICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisjaWZkZWYgV0xBTl9CVEFNUF9GRUFUVVJFCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX0JBUDoKKyAgICB7CisgICAgICAgIHBHcE1vZENvbnRleHQgPSAmKGdwVm9zQ29udGV4dC0+cEJBUENvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICB9ICAgIAorI2VuZGlmIC8vV0xBTl9CVEFNUF9GRUFUVVJFCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1NBUDoKKyAgICB7CisgICAgICBwR3BNb2RDb250ZXh0ID0gJihncFZvc0NvbnRleHQtPnBTQVBDb250ZXh0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1dEQToKKyAgICB7CisgICAgICBwR3BNb2RDb250ZXh0ID0gJihncFZvc0NvbnRleHQtPnBXREFDb250ZXh0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIGNhc2UgVk9TX01PRFVMRV9JRF9TTUU6CisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgIGNhc2UgVk9TX01PRFVMRV9JRF9IQUw6CisjZW5kaWYKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfUEU6CisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX0hERDoKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVA6CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgIHsgICAgIAorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE1vZHVsZSBJRCAlaSAiCisgICAgICAgICAgImRvZXMgbm90IGhhdmUgaXRzIGNvbnRleHQgYWxsb2NhdGVkIGJ5IFZPU1MiLCBfX2Z1bmNfXywgbW9kdWxlSUQpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgfQorICB9CisKKyAgaWYgKCBOVUxMICE9ICpwR3BNb2RDb250ZXh0KQorICB7CisgICAgLyoKKyAgICAqKiBDb250ZXh0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIQorICAgICoqIFByZXZlbnQgZG91YmxlIGFsbG9jYXRpb24KKyAgICAqLworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IE1vZHVsZSBJRCAlaSBjb250ZXh0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbW9kdWxlSUQpOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOworICB9CisgIAorICAvKgorICAqKiBEeW5hbWljYWxseSBhbGxvY2F0ZSB0aGUgY29udGV4dCBmb3IgbW9kdWxlCisgICovCisgIAorICAqcHBNb2R1bGVDb250ZXh0ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKworICAKKyAgaWYgKCAqcHBNb2R1bGVDb250ZXh0ID09IE5VTEwpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBGYWlsZWQgdG8gIgorICAgICAgICAiYWxsb2NhdGUgQ29udGV4dCBmb3IgbW9kdWxlIElEICVpIiwgX19mdW5jX18sIG1vZHVsZUlEKTsKKyAgICBWT1NfQVNTRVJUKDApOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgIH0KKyAgCisgIGlmIChtb2R1bGVJRD09Vk9TX01PRFVMRV9JRF9UTCkKKyAgeworICAgICB2b3NfbWVtX3plcm8oKnBwTW9kdWxlQ29udGV4dCwgc2l6ZSk7CisgIH0KKworICAqcEdwTW9kQ29udGV4dCA9ICpwcE1vZHVsZUNvbnRleHQ7CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKworfSAvKiB2b3NfYWxsb2NfY29udGV4dCgpICovCisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2ZyZWVfY29udGV4dCgpIC0gZnJlZSBhbiBhbGxvY2F0ZWQgYSBjb250ZXh0IHdpdGhpbiB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TUyBnbG9iYWwgQ29udGV4dAorICAKKyAgVGhpcyBBUEkgYWxsb3dzIGEgdXNlciB0byBmcmVlIHRoZSB1c2VyIGNvbnRleHQgYXJlYSB3aXRoaW4gdGhlIAorICBWT1MgR2xvYmFsIENvbnRleHQuICAKKyAgCisgIFxwYXJhbSBwVm9zQ29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBWb3MgY29udGV4dAorICAKKyAgXHBhcmFtIG1vZHVsZUlkIC0gdGhlIG1vZHVsZSBJRCB3aG8ncyBjb250ZXh0IGFyZWEgaXMgYmVpbmcgZnJlZQorICAKKyAgXHBhcmFtIHBNb2R1bGVDb250ZXh0IC0gcG9pbnRlciB0byBtb2R1bGUgY29udGV4dCBhcmVhIHRvIGJlIGZyZWUnZC4KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgXHJldHVybiAtIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBjb250ZXh0IGZvciB0aGUgbW9kdWxlIElEIGhhcyBiZWVuIAorICAgICAgICAgICAgZnJlZSdkLiAgVGhlIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgYXJlYSBpcyBub3QgbG9uZ2VyIAorICAgICAgICAgICAgYXZhaWxhYmxlLgorICAgICAgICAgICAgCisgICAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgLSBwVm9zQ29udGV4dCBvciBwTW9kdWxlQ29udGV4dCBhcmUgbm90IAorICAgICAgICAgICAgdmFsaWQgcG9pbnRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHRoZSBtb2R1bGVJZCBpcyBub3QgYSB2YWxpZCBvciBkb2VzIAorICAgICAgICAgICAgbm90IGlkZW50aWZ5IGEgbW9kdWxlIHRoYXQgY2FuIGhhdmUgYSBjb250ZXh0IGZyZWUnZC4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgVk9TX1NUQVRVU19FX0VYSVNUUyAtIHZvcyBjb3VsZCBub3QgZnJlZSB0aGUgcmVxdWVzdGVkIAorICAgICAgICAgICAgY29udGV4dCBhcmVhIGJlY2F1c2UgYSBjb250ZXh0IGZvciB0aGlzIG1vZHVsZSBJRCBkb2VzIG5vdAorICAgICAgICAgICAgZXhpc3QgaW4gdGhlIGdsb2JhbCB2b3MgY29udGV4dC4KKyAgICAgICAgICAgICAgCisgIFxzYSB2b3NfZ2V0X2NvbnRleHQoKSAgICAgICAgICAgICAgCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19mcmVlX2NvbnRleHQoIHZfVk9JRF90ICpwVm9zQ29udGV4dCwgVk9TX01PRFVMRV9JRCBtb2R1bGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKnBNb2R1bGVDb250ZXh0ICkKK3sKKyAgdl9WT0lEX3QgKiogcEdwTW9kQ29udGV4dCA9IE5VTEw7CisKKyAgaWYgKCggcFZvc0NvbnRleHQgPT0gTlVMTCkgfHwgKCBncFZvc0NvbnRleHQgIT0gcFZvc0NvbnRleHQpIHx8CisgICAgICAoIHBNb2R1bGVDb250ZXh0ID09IE5VTEwpKQorICB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiJXM6IE51bGwgcGFyYW1zIG9yIGNvbnRleHQgbWlzbWF0Y2giLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisgIAorCisgIHN3aXRjaChtb2R1bGVJRCkKKyAgeworICAgIGNhc2UgVk9TX01PRFVMRV9JRF9UTDogIAorICAgIHsKKyAgICAgIHBHcE1vZENvbnRleHQgPSAmKGdwVm9zQ29udGV4dC0+cFRMQ29udGV4dCk7IAorICAgICAgYnJlYWs7CisgICAgfQorCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgIGNhc2UgVk9TX01PRFVMRV9JRF9CQUw6CisgICAgeworICAgICAgcEdwTW9kQ29udGV4dCA9ICYoZ3BWb3NDb250ZXh0LT5wQkFMQ29udGV4dCk7CisgICAgICBicmVhazsKKyAgICB9ICAgCisKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfU0FMOgorICAgIHsKKyAgICAgIHBHcE1vZENvbnRleHQgPSAmKGdwVm9zQ29udGV4dC0+cFNBTENvbnRleHQpOworICAgICAgYnJlYWs7CisgICAgfSAgIAorCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1NTQzoKKyAgICB7CisgICAgICBwR3BNb2RDb250ZXh0ID0gJihncFZvc0NvbnRleHQtPnBTU0NDb250ZXh0KTsgCisgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfQkFQOgorICAgIHsKKyAgICAgICAgcEdwTW9kQ29udGV4dCA9ICYoZ3BWb3NDb250ZXh0LT5wQkFQQ29udGV4dCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvL1dMQU5fQlRBTVBfRkVBVFVSRQorIAorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICBjYXNlIFZPU19NT0RVTEVfSURfU0FQOgorICAgIHsKKyAgICAgIHBHcE1vZENvbnRleHQgPSAmKGdwVm9zQ29udGV4dC0+cFNBUENvbnRleHQpOyAKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1dEQToKKyAgICB7CisgICAgICBwR3BNb2RDb250ZXh0ID0gJihncFZvc0NvbnRleHQtPnBXREFDb250ZXh0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIGNhc2UgVk9TX01PRFVMRV9JRF9IREQ6CisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX1NNRToKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX0hBTDoKKyNlbmRpZgorICAgIGNhc2UgVk9TX01PRFVMRV9JRF9QRToKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgY2FzZSBWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVA6CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgIHsgICAgIAorICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE1vZHVsZSBJRCAlaSAiCisgICAgICAgICAgImRvZXMgbm90IGhhdmUgaXRzIGNvbnRleHQgYWxsb2NhdGVkIGJ5IFZPU1MiLCBfX2Z1bmNfXywgbW9kdWxlSUQpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgfQorICB9CisKKyAgaWYgKCBOVUxMID09ICpwR3BNb2RDb250ZXh0KQorICB7CisgICAgLyoKKyAgICAqKiBDb250ZXh0IGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgb3IgZnJlZWQgYWxyZWFkeSEKKyAgICAqLworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBNb2R1bGUgSUQgJWkgIgorICAgICAgICAiY29udGV4dCBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIG9yIGZyZWVkIGFscmVhZHkiLCBfX2Z1bmNfXyxtb2R1bGVJRCk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisgIAorICBpZiAoKnBHcE1vZENvbnRleHQgIT0gcE1vZHVsZUNvbnRleHQpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAiJXM6IHBHcE1vZENvbnRleHQgIT0gcE1vZHVsZUNvbnRleHQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfSAKKyAgCisgIGlmKHBNb2R1bGVDb250ZXh0ICE9IE5VTEwpCisgICAgICBrZnJlZShwTW9kdWxlQ29udGV4dCk7CisKKyAgKnBHcE1vZENvbnRleHQgPSBOVUxMOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKK30gLyogdm9zX2ZyZWVfY29udGV4dCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19tcV9wb3N0X21lc3NhZ2UoKSAtIHBvc3QgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBxdWV1ZQorCisgIFRoaXMgQVBJIGFsbG93cyBtZXNzYWdlcyB0byBiZSBwb3N0ZWQgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIHF1ZXVlLiAgTWVzc2FnZXMKKyAgY2FuIGJlIHBvc3RlZCB0byB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgcXVldWVzOgorICAKKyAgPHVsPgorICAgIDxsaT4gU01FCisgICAgPGxpPiBQRQorICAgIDxsaT4gSEFMCisgICAgPGxpPiBUTAorICA8L3VsPiAKKyAgCisgIFxwYXJhbSBtc2dRdWV1ZUlkIC0gaWRlbnRpZmllcyB0aGUgbWVzc2FnZSBxdWV1ZSB1cG9uIHdoaWNoIHRoZSBtZXNzYWdlCisgICAgICAgICB3aWxsIGJlIHBvc3RlZC4KKyAgICAgICAgIAorICBccGFyYW0gbWVzc2FnZSAtIGEgcG9pbnRlciB0byBhIG1lc3NhZ2UgYnVmZmVyLiAgTWVtb3J5IGZvciB0aGlzIG1lc3NhZ2UgCisgICAgICAgICBidWZmZXIgaXMgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIgYW5kIGZyZWUnZCBieSB0aGUgdk9TUyBhZnRlciB0aGUKKyAgICAgICAgIG1lc3NhZ2UgaXMgcG9zdGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlLiAgSWYgdGhlIGNvbnN1bWVyIG9mIHRoZSAKKyAgICAgICAgIG1lc3NhZ2UgbmVlZHMgYW55dGhpbmcgaW4gdGhpcyBtZXNzYWdlLCBpdCBuZWVkcyB0byBjb3B5IHRoZSBjb250ZW50cworICAgICAgICAgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoZSBtZXNzYWdlIHF1ZXVlIGhhbmRsZXIuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwb3N0ZWQKKyAgICAgICAgICB0byB0aGUgbWVzc2FnZSBxdWV1ZS4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IG1zZ1F1ZXVlSWQgZG9lcyBub3QgCisgICAgICAgICAgcmVmZXIgdG8gYSB2YWxpZCBNZXNzYWdlIFF1ZXVlIElkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBtZXNzYWdlIGlzIGFuIGludmFsaWQgcG9pbnRlci4gICAgIAorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gdGhlIG1lc3NhZ2UgcXVldWUgaGFuZGxlciBoYXMgcmVwb3J0ZWQKKyAgICAgICAgICBhbiB1bmtub3duIGZhaWx1cmUuCisKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19tcV9wb3N0X21lc3NhZ2UoIFZPU19NUV9JRCBtc2dRdWV1ZUlkLCB2b3NfbXNnX3QgKnBNc2cgKQoreworICBwVm9zTXFUeXBlICAgICAgcFRhcmdldE1xICAgPSBOVUxMOworICBwVm9zTXNnV3JhcHBlciAgcE1zZ1dyYXBwZXIgPSBOVUxMOworCisgIGlmICgoZ3BWb3NDb250ZXh0ID09IE5VTEwpIHx8IChwTXNnID09IE5VTEwpKQorICB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiJXM6IE51bGwgcGFyYW1zIG9yIGdsb2JhbCB2b3MgY29udGV4dCBpcyBudWxsIiwgX19mdW5jX18pOworICAgIFZPU19BU1NFUlQoMCk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgc3dpdGNoIChtc2dRdWV1ZUlkKQorICB7CisgICAgLy8vIE1lc3NhZ2UgUXVldWUgSUQgZm9yIG1lc3NhZ2VzIGJvdW5kIGZvciBTTUUKKyAgICBjYXNlICBWT1NfTVFfSURfU01FOiAKKyAgICB7CisgICAgICAgcFRhcmdldE1xID0gJihncFZvc0NvbnRleHQtPnZvc1NjaGVkLnNtZU1jTXEpOworICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vLyBNZXNzYWdlIFF1ZXVlIElEIGZvciBtZXNzYWdlcyBib3VuZCBmb3IgUEUKKyAgICBjYXNlIFZPU19NUV9JRF9QRTogIAorICAgIHsKKyAgICAgICBwVGFyZ2V0TXEgPSAmKGdwVm9zQ29udGV4dC0+dm9zU2NoZWQucGVNY01xKTsKKyAgICAgICBicmVhazsKKyAgICB9CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgLy8vIE1lc3NhZ2UgUXVldWUgSUQgZm9yIG1lc3NhZ2VzIGJvdW5kIGZvciBIQUwKKyAgICBjYXNlIFZPU19NUV9JRF9IQUw6IAorICAgIHsKKyAgICAgICBwVGFyZ2V0TXEgPSAmKGdwVm9zQ29udGV4dC0+dm9zU2NoZWQuaGFsTWNNcSk7CisgICAgICAgYnJlYWs7CisgICAgfQorI2Vsc2UKKyAgICAvLy8gTWVzc2FnZSBRdWV1ZSBJRCBmb3IgbWVzc2FnZXMgYm91bmQgZm9yIFdEQQorICAgIGNhc2UgVk9TX01RX0lEX1dEQTogCisgICAgeworICAgICAgIHBUYXJnZXRNcSA9ICYoZ3BWb3NDb250ZXh0LT52b3NTY2hlZC53ZGFNY01xKTsKKyAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLy8gTWVzc2FnZSBRdWV1ZSBJRCBmb3IgbWVzc2FnZXMgYm91bmQgZm9yIFdESQorICAgIGNhc2UgVk9TX01RX0lEX1dESToKKyAgICB7CisgICAgICAgcFRhcmdldE1xID0gJihncFZvc0NvbnRleHQtPnZvc1NjaGVkLndkaU1jTXEpOworICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisgICAgLy8vIE1lc3NhZ2UgUXVldWUgSUQgZm9yIG1lc3NhZ2VzIGJvdW5kIGZvciBUTAorICAgIGNhc2UgVk9TX01RX0lEX1RMOiAKKyAgICB7CisgICAgICAgcFRhcmdldE1xID0gJihncFZvc0NvbnRleHQtPnZvc1NjaGVkLnRsTWNNcSk7CisgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8vIE1lc3NhZ2UgUXVldWUgSUQgZm9yIG1lc3NhZ2VzIGJvdW5kIGZvciB0aGUgU1lTIG1vZHVsZQorICAgIGNhc2UgVk9TX01RX0lEX1NZUzoKKyAgICB7CisgICAgICAgcFRhcmdldE1xID0gJihncFZvc0NvbnRleHQtPnZvc1NjaGVkLnN5c01jTXEpOworICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICgiJXM6IFRyeWluZyB0byBxdWV1ZSBtc2cgaW50byB1bmtub3duIE1DIE1zZyBxdWV1ZSBJRCAlZCIpLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbXNnUXVldWVJZCk7CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICBWT1NfQVNTRVJUKE5VTEwgIT1wVGFyZ2V0TXEpOworICBpZiAocFRhcmdldE1xID09IE5VTEwpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICIlczogcFRhcmdldE1xID09IE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0gCisKKyAgLyoKKyAgKiogVHJ5IGFuZCBnZXQgYSBmcmVlIE1zZyB3cmFwcGVyCisgICovCisgIHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmZ3BWb3NDb250ZXh0LT5mcmVlVm9zTXEpOworCisgIGlmIChOVUxMID09IHBNc2dXcmFwcGVyKQorICB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IFZPUyBDb3JlIHJ1biBvdXQgb2YgbWVzc2FnZSB3cmFwcGVyIiwgX19mdW5jX18pOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9SRVNPVVJDRVM7CisgIH0KKyAgCisgIC8qCisgICoqIENvcHkgdGhlIG1lc3NhZ2Ugbm93CisgICovCisgIHZvc19tZW1fY29weSggKHZfVk9JRF90KilwTXNnV3JhcHBlci0+cFZvc01zZywgCisgICAgICAgICAgICAgICAgKHZfVk9JRF90KilwTXNnLCBzaXplb2Yodm9zX21zZ190KSk7CisKKyAgdm9zX21xX3B1dChwVGFyZ2V0TXEsIHBNc2dXcmFwcGVyKTsKKworICBzZXRfYml0KE1DX1BPU1RfRVZFTlRfTUFTSywgJmdwVm9zQ29udGV4dC0+dm9zU2NoZWQubWNFdmVudEZsYWcpOworICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmdwVm9zQ29udGV4dC0+dm9zU2NoZWQubWNXYWl0UXVldWUpOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKK30gLyogdm9zX21xX3Bvc3RfbWVzc2FnZSgpKi8KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfdHhfbXFfc2VyaWFsaXplKCkgLSBzZXJpYWxpemUgYSBtZXNzYWdlIHRvIHRoZSBUeCBleGVjdXRpb24gZmxvdworCisgIFRoaXMgQVBJIGFsbG93cyBtZXNzYWdlcyB0byBiZSBwb3N0ZWQgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIHF1ZXVlIGluIHRoZSAKKyAgVHggZXhjdXRpb24gZmxvdy4gIE1lc3NhZ2VzIGZvciB0aGUgVHggZXhlY3V0aW9uIGZsb3cgY2FuIGJlIHBvc3RlZCBvbmx5IAorICB0byB0aGUgZm9sbG93aW5nIHF1ZXVlLgorICAKKyAgPHVsPgorICAgIDxsaT4gVEwKKyAgICA8bGk+IFNTQy9XREkKKyAgPC91bD4KKyAgCisgIFxwYXJhbSBtc2dRdWV1ZUlkIC0gaWRlbnRpZmllcyB0aGUgbWVzc2FnZSBxdWV1ZSB1cG9uIHdoaWNoIHRoZSBtZXNzYWdlCisgICAgICAgICB3aWxsIGJlIHBvc3RlZC4KKyAgICAgICAgIAorICBccGFyYW0gbWVzc2FnZSAtIGEgcG9pbnRlciB0byBhIG1lc3NhZ2UgYnVmZmVyLiAgQm9keSBtZW1vcnkgZm9yIHRoaXMgbWVzc2FnZSAKKyAgICAgICAgIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciBhbmQgZnJlZSdkIGJ5IHRoZSB2T1NTIGFmdGVyIHRoZQorICAgICAgICAgbWVzc2FnZSBpcyBkaXNwYWN0aGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBjb21wb25lbnQuICBJZiB0aGUgY29uc3VtZXIgCisgICAgICAgICBvZiB0aGUgbWVzc2FnZSBuZWVkcyB0byBrZWVwIGFueXRoaW5nIGluIHRoZSBib2R5LCBpdCBuZWVkcyB0byBjb3B5IAorICAgICAgICAgdGhlIGNvbnRlbnRzIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgbWVzc2FnZSBoYW5kbGVyLgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgbWVzc2FnZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcG9zdGVkCisgICAgICAgICAgdG8gdGhlIG1lc3NhZ2UgcXVldWUuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBtc2dRdWV1ZUlkIGRvZXMgbm90IAorICAgICAgICAgIHJlZmVyIHRvIGEgdmFsaWQgTWVzc2FnZSBRdWV1ZSBJZC4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gbWVzc2FnZSBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgICAKKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIHRoZSBtZXNzYWdlIHF1ZXVlIGhhbmRsZXIgaGFzIHJlcG9ydGVkCisgICAgICAgICAgYW4gdW5rbm93biBmYWlsdXJlLgorCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTVFfSUQgbXNnUXVldWVJZCwgdm9zX21zZ190ICpwTXNnICkKK3sKKyAgcFZvc01xVHlwZSAgICAgIHBUYXJnZXRNcSAgID0gTlVMTDsKKyAgcFZvc01zZ1dyYXBwZXIgIHBNc2dXcmFwcGVyID0gTlVMTDsKKworICBpZiAoKGdwVm9zQ29udGV4dCA9PSBOVUxMKSB8fCAocE1zZyA9PSBOVUxMKSkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgIiVzOiBOdWxsIHBhcmFtcyBvciBnbG9iYWwgdm9zIGNvbnRleHQgaXMgbnVsbCIsIF9fZnVuY19fKTsKKyAgICBWT1NfQVNTRVJUKDApOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIHN3aXRjaCAobXNnUXVldWVJZCkKKyAgeworICAgIC8vLyBNZXNzYWdlIFF1ZXVlIElEIGZvciBtZXNzYWdlcyBib3VuZCBmb3IgU01FCisgICAgY2FzZSAgVk9TX01RX0lEX1RMOiAKKyAgICB7CisgICAgICAgcFRhcmdldE1xID0gJihncFZvc0NvbnRleHQtPnZvc1NjaGVkLnRsVHhNcSk7CisgICAgICAgYnJlYWs7CisgICAgfQorCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgIC8vLyBNZXNzYWdlIFF1ZXVlIElEIGZvciBtZXNzYWdlcyBib3VuZCBmb3IgU1NDCisgICAgY2FzZSBWT1NfTVFfSURfU1NDOiAgCisgICAgeworICAgICAgIHBUYXJnZXRNcSA9ICYoZ3BWb3NDb250ZXh0LT52b3NTY2hlZC5zc2NUeE1xKTsKKyAgICAgICBicmVhazsKKyAgICB9CisjZWxzZQorICAgIC8vLyBNZXNzYWdlIFF1ZXVlIElEIGZvciBtZXNzYWdlcyBib3VuZCBmb3IgU1NDCisgICAgY2FzZSBWT1NfTVFfSURfV0RJOiAgCisgICAgeworICAgICAgIHBUYXJnZXRNcSA9ICYoZ3BWb3NDb250ZXh0LT52b3NTY2hlZC53ZGlUeE1xKTsKKyAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgCisgICAgCisgICAgLy8vIE1lc3NhZ2UgUXVldWUgSUQgZm9yIG1lc3NhZ2VzIGJvdW5kIGZvciB0aGUgU1lTIG1vZHVsZQorICAgIGNhc2UgVk9TX01RX0lEX1NZUzoKKyAgICB7CisgICAgICAgcFRhcmdldE1xID0gJihncFZvc0NvbnRleHQtPnZvc1NjaGVkLnN5c1R4TXEpOworICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJUcnlpbmcgdG8gcXVldWUgbXNnIGludG8gdW5rbm93biBUeCBNc2cgcXVldWUgSUQgJWQiLAorICAgICAgICAgICAgICAgX19mdW5jX18sIG1zZ1F1ZXVlSWQpOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgaWYgKHBUYXJnZXRNcSA9PSBOVUxMKQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAiJXM6IHBUYXJnZXRNcSA9PSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9IAorICAgIAorCisgIC8qCisgICoqIFRyeSBhbmQgZ2V0IGEgZnJlZSBNc2cgd3JhcHBlcgorICAqLworICBwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJmdwVm9zQ29udGV4dC0+ZnJlZVZvc01xKTsKKworICBpZiAoTlVMTCA9PSBwTXNnV3JhcHBlcikKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgIiVzOiBWT1MgQ29yZSBydW4gb3V0IG9mIG1lc3NhZ2Ugd3JhcHBlciIsIF9fZnVuY19fKTsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTOworICB9CisKKyAgLyoKKyAgKiogQ29weSB0aGUgbWVzc2FnZSBub3cKKyAgKi8KKyAgdm9zX21lbV9jb3B5KCAodl9WT0lEX3QqKXBNc2dXcmFwcGVyLT5wVm9zTXNnLCAKKyAgICAgICAgICAgICAgICAodl9WT0lEX3QqKXBNc2csIHNpemVvZih2b3NfbXNnX3QpKTsKKworICB2b3NfbXFfcHV0KHBUYXJnZXRNcSwgcE1zZ1dyYXBwZXIpOworCisgIHNldF9iaXQoVFhfUE9TVF9FVkVOVF9NQVNLLCAmZ3BWb3NDb250ZXh0LT52b3NTY2hlZC50eEV2ZW50RmxhZyk7CisgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3BWb3NDb250ZXh0LT52b3NTY2hlZC50eFdhaXRRdWV1ZSk7CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKworfSAvKiB2b3NfdHhfbXFfc2VyaWFsaXplKCkqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3J4X21xX3NlcmlhbGl6ZSgpIC0gc2VyaWFsaXplIGEgbWVzc2FnZSB0byB0aGUgUnggZXhlY3V0aW9uIGZsb3cKKworICBUaGlzIEFQSSBhbGxvd3MgbWVzc2FnZXMgdG8gYmUgcG9zdGVkIHRvIGEgc3BlY2lmaWMgbWVzc2FnZSBxdWV1ZSBpbiB0aGUKKyAgVHggZXhjdXRpb24gZmxvdy4gIE1lc3NhZ2VzIGZvciB0aGUgUnggZXhlY3V0aW9uIGZsb3cgY2FuIGJlIHBvc3RlZCBvbmx5CisgIHRvIHRoZSBmb2xsb3dpbmcgcXVldWUuCisKKyAgPHVsPgorICAgIDxsaT4gVEwKKyAgICA8bGk+IFdESQorICA8L3VsPgorCisgIFxwYXJhbSBtc2dRdWV1ZUlkIC0gaWRlbnRpZmllcyB0aGUgbWVzc2FnZSBxdWV1ZSB1cG9uIHdoaWNoIHRoZSBtZXNzYWdlCisgICAgICAgICB3aWxsIGJlIHBvc3RlZC4KKworICBccGFyYW0gbWVzc2FnZSAtIGEgcG9pbnRlciB0byBhIG1lc3NhZ2UgYnVmZmVyLiAgQm9keSBtZW1vcnkgZm9yIHRoaXMgbWVzc2FnZQorICAgICAgICAgYnVmZmVyIGlzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIGFuZCBmcmVlJ2QgYnkgdGhlIHZPU1MgYWZ0ZXIgdGhlCisgICAgICAgICBtZXNzYWdlIGlzIGRpc3BhY3RoZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudC4gIElmIHRoZSBjb25zdW1lcgorICAgICAgICAgb2YgdGhlIG1lc3NhZ2UgbmVlZHMgdG8ga2VlcCBhbnl0aGluZyBpbiB0aGUgYm9keSwgaXQgbmVlZHMgdG8gY29weQorICAgICAgICAgdGhlIGNvbnRlbnRzIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgbWVzc2FnZSBoYW5kbGVyLgorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGhlIG1lc3NhZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHBvc3RlZAorICAgICAgICAgIHRvIHRoZSBtZXNzYWdlIHF1ZXVlLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBtc2dRdWV1ZUlkIGRvZXMgbm90CisgICAgICAgICAgcmVmZXIgdG8gYSB2YWxpZCBNZXNzYWdlIFF1ZXVlIElkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIG1lc3NhZ2UgaXMgYW4gaW52YWxpZCBwb2ludGVyLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSB0aGUgbWVzc2FnZSBxdWV1ZSBoYW5kbGVyIGhhcyByZXBvcnRlZAorICAgICAgICAgIGFuIHVua25vd24gZmFpbHVyZS4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZPU19TVEFUVVMgdm9zX3J4X21xX3NlcmlhbGl6ZSggVk9TX01RX0lEIG1zZ1F1ZXVlSWQsIHZvc19tc2dfdCAqcE1zZyApCit7CisgIHBWb3NNcVR5cGUgICAgICBwVGFyZ2V0TXEgICA9IE5VTEw7CisgIHBWb3NNc2dXcmFwcGVyICBwTXNnV3JhcHBlciA9IE5VTEw7CisgIGlmICgoZ3BWb3NDb250ZXh0ID09IE5VTEwpIHx8IChwTXNnID09IE5VTEwpKQorICB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiJXM6IE51bGwgcGFyYW1zIG9yIGdsb2JhbCB2b3MgY29udGV4dCBpcyBudWxsIiwgX19mdW5jX18pOworICAgIFZPU19BU1NFUlQoMCk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgc3dpdGNoIChtc2dRdWV1ZUlkKQorICB7CisKKyAgICBjYXNlIFZPU19NUV9JRF9TWVM6CisgICAgeworICAgICAgIHBUYXJnZXRNcSA9ICYoZ3BWb3NDb250ZXh0LT52b3NTY2hlZC5zeXNSeE1xKTsKKyAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLy8gTWVzc2FnZSBRdWV1ZSBJRCBmb3IgbWVzc2FnZXMgYm91bmQgZm9yIFdESQorICAgIGNhc2UgVk9TX01RX0lEX1dESToKKyAgICB7CisgICAgICAgcFRhcmdldE1xID0gJihncFZvc0NvbnRleHQtPnZvc1NjaGVkLndkaVJ4TXEpOworICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJUcnlpbmcgdG8gcXVldWUgbXNnIGludG8gdW5rbm93biBSeCBNc2cgcXVldWUgSUQgJWQiLAorICAgICAgICAgICAgICAgX19mdW5jX18sIG1zZ1F1ZXVlSWQpOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgaWYgKHBUYXJnZXRNcSA9PSBOVUxMKQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogcFRhcmdldE1xID09IE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworCisgIC8qCisgICoqIFRyeSBhbmQgZ2V0IGEgZnJlZSBNc2cgd3JhcHBlcgorICAqLworICBwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJmdwVm9zQ29udGV4dC0+ZnJlZVZvc01xKTsKKworICBpZiAoTlVMTCA9PSBwTXNnV3JhcHBlcikKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBWT1MgQ29yZSBydW4gb3V0IG9mIG1lc3NhZ2Ugd3JhcHBlciIsIF9fZnVuY19fKTsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTOworICB9CisKKyAgLyoKKyAgKiogQ29weSB0aGUgbWVzc2FnZSBub3cKKyAgKi8KKyAgdm9zX21lbV9jb3B5KCAodl9WT0lEX3QqKXBNc2dXcmFwcGVyLT5wVm9zTXNnLAorICAgICAgICAgICAgICAgICh2X1ZPSURfdCopcE1zZywgc2l6ZW9mKHZvc19tc2dfdCkpOworCisgIHZvc19tcV9wdXQocFRhcmdldE1xLCBwTXNnV3JhcHBlcik7CisKKyAgc2V0X2JpdChSWF9QT1NUX0VWRU5UX01BU0ssICZncFZvc0NvbnRleHQtPnZvc1NjaGVkLnJ4RXZlbnRGbGFnKTsKKyAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZncFZvc0NvbnRleHQtPnZvc1NjaGVkLnJ4V2FpdFF1ZXVlKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworCit9IC8qIHZvc19yeF9tcV9zZXJpYWxpemUoKSovCisKKyNlbmRpZgordl9WT0lEX3QgCit2b3Nfc3lzX3Byb2JlX3RocmVhZF9jYmFjayAKKyggCisgIHZfVk9JRF90ICpwVXNlckRhdGEgCispCit7CisgIGlmIChncFZvc0NvbnRleHQgIT0gcFVzZXJEYXRhKQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAiJXM6IGdwVm9zQ29udGV4dCAhPSBwVXNlckRhdGEiLCBfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm47CisgIH0gCisKKyAgaWYgKHZvc19ldmVudF9zZXQoJmdwVm9zQ29udGV4dC0+UHJvYmVFdmVudCkhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICIlczogdm9zX2V2ZW50X3NldCBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm47CisgIH0KKworfSAvKiB2b3Nfc3lzX3Byb2JlX3RocmVhZF9jYmFjaygpICovCisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCit2X1ZPSURfdCB2b3Nfc3lzX3N0YXJ0X2NvbXBsZXRlX2NiYWNrCisoIAorICB2X1ZPSURfdCAqcFVzZXJEYXRhCispCit7CisKKyAgaWYgKGdwVm9zQ29udGV4dCAhPSBwVXNlckRhdGEpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICIlczogZ3BWb3NDb250ZXh0ICE9IHBVc2VyRGF0YSIsIF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybjsKKyAgfSAKKworICBpZiAodm9zX2V2ZW50X3NldCgmZ3BWb3NDb250ZXh0LT5Qcm9iZUV2ZW50KSE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgeworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgIiVzOiB2b3NfZXZlbnRfc2V0IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybjsKKyAgfQorCit9IC8qIHZvc19zeXNfc3RhcnRfY29tcGxldGVfY2JhY2soKSAqLworI2Vsc2UKK3ZfVk9JRF90IHZvc19XREFDb21wbGV0ZV9jYmFjaworKAorICB2X1ZPSURfdCAqcFVzZXJEYXRhCispCit7CisKKyAgaWYgKGdwVm9zQ29udGV4dCAhPSBwVXNlckRhdGEpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBncFZvc0NvbnRleHQgIT0gcFVzZXJEYXRhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHZvc19ldmVudF9zZXQoJmdwVm9zQ29udGV4dC0+d2RhQ29tcGxldGVFdmVudCkhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiB2b3NfZXZlbnRfc2V0IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybjsKKyAgfQorCit9IC8qIHZvc19XREFDb21wbGV0ZV9jYmFjaygpICovCisjZW5kaWYKKwordl9WT0lEX3Qgdm9zX2NvcmVfcmV0dXJuX21zZworKAorICB2X1BWT0lEX3QgICAgICBwVkNvbnRleHQsIAorICBwVm9zTXNnV3JhcHBlciBwTXNnV3JhcHBlcgorKQoreworICBwVm9zQ29udGV4dFR5cGUgcFZvc0NvbnRleHQgPSAocFZvc0NvbnRleHRUeXBlKSBwVkNvbnRleHQ7CisgIAorICBWT1NfQVNTRVJUKCBncFZvc0NvbnRleHQgPT0gcFZvc0NvbnRleHQpOworCisgIGlmIChncFZvc0NvbnRleHQgIT0gcFZvc0NvbnRleHQpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICIlczogZ3BWb3NDb250ZXh0ICE9IHBWb3NDb250ZXh0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuOworICB9IAorCisgIFZPU19BU1NFUlQoIE5VTEwgIT1wTXNnV3JhcHBlciApOworCisgIGlmIChwTXNnV3JhcHBlciA9PSBOVUxMKQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAiJXM6IHBNc2dXcmFwcGVyID09IE5VTEwgaW4gZnVuY3Rpb24iLCBfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm47CisgIH0gCisgIAorICAvKgorICAqKiBSZXR1cm4gdGhlIG1lc3NhZ2Ugb24gdGhlIGZyZWUgbWVzc2FnZSBxdWV1ZQorICAqLworICBJTklUX0xJU1RfSEVBRCgmcE1zZ1dyYXBwZXItPm1zZ05vZGUpOworICB2b3NfbXFfcHV0KCZwVm9zQ29udGV4dC0+ZnJlZVZvc01xLCBwTXNnV3JhcHBlcik7CisKK30gLyogdm9zX2NvcmVfcmV0dXJuX21zZygpICovCisKKworLyoqCisgIEBicmllZiB2b3NfZmV0Y2hfdGxfY2ZnX3Bhcm1zKCkgLSB0aGlzIGZ1bmN0aW9uIHdpbGwgYXR0ZW1wdCB0byByZWFkIHRoZQorICBUTCBjb25maWcgcGFyYW1zIGZyb20gdGhlIHJlZ2lzdHJ5CisgICAKKyAgQHBhcmFtIHBBZGFwdGVyIDogW2lub3V0XSBwb2ludGVyIHRvIFRMIGNvbmZpZyBibG9jaworCisgIEByZXR1cm4gCisgIE5vbmUKKworKi8KK3ZfVk9JRF90IAordm9zX2ZldGNoX3RsX2NmZ19wYXJtcyAKKyggCisgIFdMQU5UTF9Db25maWdJbmZvVHlwZSAqcFRMQ29uZmlnLAorICBoZGRfY29uZmlnX3QgKiBwQ29uZmlnCispCit7CisgIGlmIChwVExDb25maWcgPT0gTlVMTCkKKyAgeworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgTlVMTCBwdHIgcGFzc2VkIGluISIsIF9fRlVOQ1RJT05fXyk7CisgICByZXR1cm47CisgIH0KKworICBwVExDb25maWctPnVjQWNXZWlnaHRzWzBdID0gcENvbmZpZy0+V2ZxQmtXZWlnaHQ7CisgIHBUTENvbmZpZy0+dWNBY1dlaWdodHNbMV0gPSBwQ29uZmlnLT5XZnFCZVdlaWdodDsKKyAgcFRMQ29uZmlnLT51Y0FjV2VpZ2h0c1syXSA9IHBDb25maWctPldmcVZpV2VpZ2h0OworICBwVExDb25maWctPnVjQWNXZWlnaHRzWzNdID0gcENvbmZpZy0+V2ZxVm9XZWlnaHQ7CisgIHBUTENvbmZpZy0+dURlbGF5ZWRUcmlnZ2VyRnJtSW50ID0gcENvbmZpZy0+RGVsYXllZFRyaWdnZXJGcm1JbnQ7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICBwVExDb25maWctPnVNaW5GcmFtZXNQcm9jVGhyZXMgPSBwQ29uZmlnLT5NaW5GcmFtZXNQcm9jVGhyZXM7CisjZW5kaWYKKworfQorCit2X0JPT0xfdCB2b3NfaXNfYXBwc19wb3dlcl9jb2xsYXBzZV9hbGxvd2VkKHZvaWQqIHBIZGRDdHgpCit7CisgIHJldHVybiBoZGRfaXNfYXBwc19wb3dlcl9jb2xsYXBzZV9hbGxvd2VkKChoZGRfY29udGV4dF90KikgcEhkZEN0eCk7Cit9CisKK3ZvaWQgdm9zX2Fib3J0X21hY19zY2FuKHZvaWQpCit7CisgICAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCA9IE5VTEw7CisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgICAgICAgID0gTlVMTDsKKworICAgIC8qIEdldCB0aGUgR2xvYmFsIFZPU1MgQ29udGV4dCAqLworICAgIHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NZUywgTlVMTCk7CisgICAgaWYoIXBWb3NDb250ZXh0KSB7CisgICAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBHbG9iYWwgVk9TIGNvbnRleHQgaXMgTnVsbCIsIF9fZnVuY19fKTsKKyAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8qIEdldCB0aGUgSEREIGNvbnRleHQgKi8KKyAgICBwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKil2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQsIHBWb3NDb250ZXh0ICk7CisgICAgaWYoIXBIZGRDdHgpIHsKKyAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IEhERCBjb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGhkZF9hYm9ydF9tYWNfc2NhbihwSGRkQ3R4KTsKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19zaHV0ZG93bigpIC0gc2h1dGRvd24gVk9TCisKKyAgICAgLSBBbGwgVk9TIHN1Ym1vZHVsZXMgYXJlIGNsb3NlZC4KKworICAgICAtIEFsbCB0aGUgV0xBTiBTVyBjb21wb25lbnRzIHNob3VsZCBoYXZlIGJlZW4gb3BlbmVkLiBUaGlzIGluY2x1ZGVzCisgICAgICAgU1lTLCBNQUMsIFNNRSBhbmQgVEwuCisKKworICBccGFyYW0gIHZvc0NvbnRleHQ6IEdsb2JhbCB2b3MgY29udGV4dAorCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBPcGVyYXRpb24gc3VjY2Vzc2Z1bGwgJiB2b3MgaXMgc2h1dGRvd24KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gRmFpbHVyZSB0byBjbG9zZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3Nfc2h1dGRvd24odl9DT05URVhUX3Qgdm9zQ29udGV4dCkKK3sKKyAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisKKyNpZmRlZiBXTEFOX0JUQU1QX0ZFQVRVUkUKKyAgdm9zU3RhdHVzID0gV0xBTkJBUF9DbG9zZSh2b3NDb250ZXh0KTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY2xvc2UgQkFQIiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKyNlbmRpZiAvLyBXTEFOX0JUQU1QX0ZFQVRVUkUKKworICB2b3NTdGF0dXMgPSBXTEFOVExfQ2xvc2Uodm9zQ29udGV4dCk7CisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIGNsb3NlIFRMIiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKworICB2b3NTdGF0dXMgPSBzbWVfQ2xvc2UoICgocFZvc0NvbnRleHRUeXBlKXZvc0NvbnRleHQpLT5wTUFDQ29udGV4dCk7CisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIGNsb3NlIFNNRSIsIF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisKKyAgdm9zU3RhdHVzID0gbWFjQ2xvc2UoICgocFZvc0NvbnRleHRUeXBlKXZvc0NvbnRleHQpLT5wTUFDQ29udGV4dCk7CisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIGNsb3NlIE1BQyIsIF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisKKyAgKChwVm9zQ29udGV4dFR5cGUpdm9zQ29udGV4dCktPnBNQUNDb250ZXh0ID0gTlVMTDsKKworICB2b3NTdGF0dXMgPSB2b3NfbnZfY2xvc2UoKTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY2xvc2UgTlYiLCBfX2Z1bmNfXyk7CisgICAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgfQorCisgIHZvc1N0YXR1cyA9IHN5c0Nsb3NlKCB2b3NDb250ZXh0ICk7CisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIGNsb3NlIFNZUyIsIF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisKKyAvKiBMZXQgRFhFIHJldHVybiBwYWNrZXRzIGluIFdEQV9jbG9zZSBhbmQgdGhlbiBmcmVlIHRoZW0gaGVyZSAqLworICB2b3NTdGF0dXMgPSB2b3NfcGFja2V0X2Nsb3NlKCB2b3NDb250ZXh0ICk7CisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogRmFpbGVkIHRvIGNsb3NlIFZPU1MgUGFja2V0IiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKworICB2b3NfbXFfZGVpbml0KCYoKHBWb3NDb250ZXh0VHlwZSl2b3NDb250ZXh0KS0+ZnJlZVZvc01xKTsKKworICB2b3NTdGF0dXMgPSB2b3NfZXZlbnRfZGVzdHJveSgmZ3BWb3NDb250ZXh0LT53ZGFDb21wbGV0ZUV2ZW50KTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBmYWlsZWQgdG8gZGVzdHJveSB3ZGFDb21wbGV0ZUV2ZW50IiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKworICB2b3NTdGF0dXMgPSB2b3NfZXZlbnRfZGVzdHJveSgmZ3BWb3NDb250ZXh0LT5Qcm9iZUV2ZW50KTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiBmYWlsZWQgdG8gZGVzdHJveSBQcm9iZUV2ZW50IiwgX19mdW5jX18pOworICAgICBWT1NfQVNTRVJUKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHZvc1N0YXR1cyApICk7CisgIH0KKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3Nfd2RhX3NodXRkb3duKCkgLSBWT1MgaW50ZXJmYWNlIHRvIHdkYSBzaHV0ZG93bgorCisgICAgIC0gV0RBL1dESSBzaHV0ZG93bgorCisgIFxwYXJhbSAgdm9zQ29udGV4dDogR2xvYmFsIHZvcyBjb250ZXh0CisKKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIE9wZXJhdGlvbiBzdWNjZXNzZnVsbAorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBGYWlsdXJlIHRvIGNsb3NlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc193ZGFfc2h1dGRvd24odl9DT05URVhUX3Qgdm9zQ29udGV4dCkKK3sKKyAgVk9TX1NUQVRVUyB2b3NTdGF0dXM7CisgIHZvc1N0YXR1cyA9IFdEQV9zaHV0ZG93bih2b3NDb250ZXh0LCBWT1NfRkFMU0UpOworCisgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogZmFpbGVkIHRvIHNodXRkb3duIFdEQSIsIF9fZnVuY19fKTsKKyAgICAgVk9TX0FTU0VSVCggVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApOworICB9CisgIHJldHVybiB2b3NTdGF0dXM7Cit9CisvKioKKyAgQGJyaWVmIHZvc193bGFuU2h1dGRvd24oKSAtIFRoaXMgQVBJIHdpbGwgc2h1dGRvd24gV0xBTiBkcml2ZXIKKworICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIFJpdmEgc3Vic3lzdGVtIGNyYXNoZXMuICBUaGVyZSBhcmUgdHdvCisgIG1ldGhvZHMgKG9yIG9wZXJhdGlvbnMpIGluIFdMQU4gZHJpdmVyIHRvIGhhbmRsZSBSaXZhIGNyYXNoLAorICAgIDEuIHNodXRkb3duOiBDYWxsZWQgd2hlbiBSaXZhIGdvZXMgZG93biwgdGhpcyB3aWxsIHNodXRkb3duIFdMQU4KKyAgICAgICAgICAgICAgICAgZHJpdmVyIHdpdGhvdXQgaGFuZHNoYWtpbmcgd2l0aCBSaXZhLgorICAgIDIuIHJlLWluaXQ6ICBOZXh0IEFQSQorICBAcGFyYW0KKyAgICAgICBOT05FCisgIEByZXR1cm4KKyAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgICAtIE9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gT3BlcmF0aW9uIGZhaWxlZC4KKworKi8KK1ZPU19TVEFUVVMgdm9zX3dsYW5TaHV0ZG93bih2b2lkKQoreworICAgVk9TX1NUQVRVUyB2c3RhdHVzOworICAgdnN0YXR1cyA9IHZvc193YXRjaGRvZ193bGFuX3NodXRkb3duKCk7CisgICByZXR1cm4gdnN0YXR1czsKK30KKy8qKgorICBAYnJpZWYgdm9zX3dsYW5SZUluaXQoKSAtIFRoaXMgQVBJIHdpbGwgcmUtaW5pdCBXTEFOIGRyaXZlcgorCisgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gUml2YSBzdWJzeXN0ZW0gcmVib290cy4gIFRoZXJlIGFyZSB0d28KKyAgbWV0aG9kcyAob3Igb3BlcmF0aW9ucykgaW4gV0xBTiBkcml2ZXIgdG8gaGFuZGxlIFJpdmEgY3Jhc2gsCisgICAgMS4gc2h1dGRvd246IFByZXZpb3VzIEFQSQorICAgIDIuIHJlLWluaXQ6ICBDYWxsZWQgd2hlbiBSaXZhIGNvbWVzIGJhY2sgYWZ0ZXIgdGhlIGNyYXNoLiBUaGlzIHdpbGwKKyAgICAgICAgICAgICAgICAgcmUtaW5pdGlhbGl6ZSBXTEFOIGRyaXZlci4gSW4gc29tZSBjYXNlcyByZS1vcGVuIG1heSBiZQorICAgICAgICAgICAgICAgICByZWZlcnJlZCBpbnN0ZWFkIG9mIHJlLWluaXQuCisgIEBwYXJhbQorICAgICAgIE5PTkUKKyAgQHJldHVybgorICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgIC0gT3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBPcGVyYXRpb24gZmFpbGVkLgorCisqLworVk9TX1NUQVRVUyB2b3Nfd2xhblJlSW5pdCh2b2lkKQoreworICAgVk9TX1NUQVRVUyB2c3RhdHVzOworICAgdnN0YXR1cyA9IHZvc193YXRjaGRvZ193bGFuX3JlX2luaXQoKTsKKyAgIHJldHVybiB2c3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL3NyYy92b3NfZGlhZy5jIGIvQ09SRS9WT1NTL3NyYy92b3NfZGlhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDJiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19kaWFnLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGSUxFOiAgICAgICAgIHZvc19kaWFnLmMKKworICBPVkVSVklFVzogICAgIFRoaXMgc291cmNlIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHZPUyBkaWFnIEFQSXMKKworICBERVBFTkRFTkNJRVM6IAorIAorICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgICAgICAgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgImlfdm9zX2RpYWdfY29yZV9sb2cuaCIKKyNpbmNsdWRlICJpX3Zvc19kaWFnX2NvcmVfZXZlbnQuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisjaW5jbHVkZSAid2xhbl9ubGlua19jb21tb24uaCIKKyNpbmNsdWRlICJ2b3Nfc2NoZWQuaCIKKyNpbmNsdWRlICJ3bGFuX3B0dF9zb2NrX3N2Yy5oIgorCisKKyNkZWZpbmUgUFRUX01TR19ESUFHX0NNRFNfVFlQRSAgIDB4NTA1MAorCisjZGVmaW5lIERJQUdfVFlQRV9MT0dTICAgMSAKKyNkZWZpbmUgRElBR19UWVBFX0VWRU5UUyAyCisKKyNkZWZpbmUgRElBR19TV0FQMTYoQSkgKCgoKHRBTklfVTE2KShBKSAmIDB4ZmYwMCkgPj4gOCkgfCAoKCh0QU5JX1UxNikoQSkgJiAweDAwZmYpIDw8IDgpKQorCisKKwordHlwZWRlZiBzdHJ1Y3QgZXZlbnRfcmVwb3J0X3MKK3sKKyAgICB2X1UzMl90IGRpYWdfdHlwZTsKKyAgICB2X1UxNl90IGV2ZW50X2lkOworICAgIHZfVTE2X3QgbGVuZ3RoOworfSBldmVudF9yZXBvcnRfdDsKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbG9nX3NldF9jb2RlKCkgLSAKKworICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBsb2dnaW5nIGNvZGUgaW4gdGhlIGdpdmVuIGxvZyByZWNvcmQuIAorCisgIFxwYXJhbSAgLSBwdHIgLSBQb2ludGVyIHRvIHRoZSBsb2cgaGVhZGVyIHR5cGUuCisgICAgICAgICAgICAgIC0gY29kZSAtIGxvZyBjb2RlLgorICBccmV0dXJuIC0gTm9uZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZvc19sb2dfc2V0X2NvZGUgKHZfVk9JRF90ICpwdHIsIHZfVTE2X3QgY29kZSkKK3sKKyAgICBpZiAocHRyKQorICAgIHsKKyAgICAgICAgLyogQWxsIGxvZyBwYWNrZXRzIGFyZSByZXF1aXJlZCB0byBzdGFydCB3aXRoICdsb2dfaGVhZGVyX3R5cGUnLiAqLworICAgICAgICAoKGxvZ19oZHJfdHlwZSAqKSBwdHIpLT5jb2RlID0gY29kZTsKKyAgICB9CisKK30gCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19sb2dfc2V0X2xlbmd0aCgpIC0gCisKKyAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgbGVuZ3RoIGZpZWxkIGluIHRoZSBnaXZlbiBsb2cgcmVjb3JkLgorCisgIFxwYXJhbSAgLSBwdHIgLSBQb2ludGVyIHRvIHRoZSBsb2cgaGVhZGVyIHR5cGUuCisgICAgICAgICAgICAgIC0gbGVuZ3RoIC0gbG9nIGxlbmd0aC4KKyAgICAgICAgICAgICAgCisgIFxyZXR1cm4gLSBOb25lCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdm9zX2xvZ19zZXRfbGVuZ3RoICh2X1ZPSURfdCAqcHRyLCB2X1UxNl90IGxlbmd0aCkKK3sKKyAgICBpZihwdHIpCisgICAgeworICAgICAgICAvKiBBbGwgbG9nIHBhY2tldHMgYXJlIHJlcXVpcmVkIHRvIHN0YXJ0IHdpdGggJ2xvZ19oZWFkZXJfdHlwZScuICovCisgICAgICAgICgobG9nX2hkcl90eXBlICopIHB0ciktPmxlbiA9ICh2X1UxNl90KSBsZW5ndGg7CisgICAgfQorfSAKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2xvZ19zdWJtaXQoKSAtIAorCisgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBsb2cgZGF0YSB0byB0aGUgcHR0IHNvY2tldCBhcHAgb25seSBpZiBpdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGRyaXZlci4KKworICBccGFyYW0gIC0gcHRyIC0gUG9pbnRlciB0byB0aGUgbG9nIGhlYWRlciB0eXBlLgorICAgICAgICAgICAgICAKKyAgXHJldHVybiAtIE5vbmUKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2b3NfbG9nX3N1Ym1pdCh2X1ZPSURfdCAqcGxvZ19oZHJfcHRyKQoreworCisgICAgbG9nX2hkcl90eXBlICpwSGRyID0gKGxvZ19oZHJfdHlwZSopIHBsb2dfaGRyX3B0cjsKKworICAgIHRBbmlIZHIgKndtc2cgPSBOVUxMOworICAgIHZfVThfdCAqcEJ1ZjsKKyAgICBoZGRfYWRhcHRlcl90ICpwQWRhcHRlcjsKKyAgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dD0gTlVMTDsKKyAgICB2X1UxNl90IGRhdGFfbGVuOworICAgIHZfVTE2X3QgdG90YWxfbGVuOworCisKKyAgICAgLypHZXQgdGhlIGdsb2JhbCBjb250ZXh0ICovCisgICAgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU1lTLCBOVUxMKTsKKworICAgICAvKkdldCB0aGUgSGRkIENvbnRleHQgKi8KKyAgICBwQWRhcHRlciA9ICgoVm9zQ29udGV4dFR5cGUqKShwVm9zQ29udGV4dCkpLT5wSEREQ29udGV4dDsKKworICAgLyogU2VuZCB0aGUgbG9nIGRhdGEgdG8gdGhlIHB0dCBhcHAgb25seSBpZiBpdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIHdsYW4gZHJpdmVyKi8KKyAgICBpZihwQWRhcHRlci0+cHR0X3BpZCkgCisgICAgeworICAgICAgICBkYXRhX2xlbiA9IHBIZHItPmxlbjsKKyAgICAKKyAgICAgICAgdG90YWxfbGVuID0gc2l6ZW9mKHRBbmlIZHIpK3NpemVvZih2X1UzMl90KStkYXRhX2xlbjsKKyAgICAKKyAgICAgICAgcEJ1ZiA9ICAodl9VOF90Kil2b3NfbWVtX21hbGxvYyh0b3RhbF9sZW4pOworICAgIAorICAgICAgICBpZighcEJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJ2b3NfbWVtX21hbGxvYyBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b3NfbWVtX3plcm8oKHZfVk9JRF90KilwQnVmLHRvdGFsX2xlbik7CisgICAgCisgICAgICAgIHdtc2cgPSAodEFuaUhkciopcEJ1ZjsKKyAgICAgICAgd21zZy0+dHlwZSA9IFBUVF9NU0dfRElBR19DTURTX1RZUEU7CisgICAgICAgIHdtc2ctPmxlbmd0aCA9IHRvdGFsX2xlbjsKKyAgICAgICAgd21zZy0+bGVuZ3RoID0gRElBR19TV0FQMTYod21zZy0+bGVuZ3RoKTsKKyAgICAgICAgcEJ1ZiArPSBzaXplb2YodEFuaUhkcik7CisgICAgCisgICAgCisgICAgICAgICAgICAvKiAgRGlhZyBUeXBlIGV2ZW50cyBvciBsb2cgKi8KKyAgICAgICAgKih2X1UzMl90KilwQnVmID0gRElBR19UWVBFX0xPR1M7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHZfVTMyX3QpOworICAgIAorICAgIAorICAgICAgICBtZW1jcHkocEJ1ZiwgcEhkcixkYXRhX2xlbik7CisgICAgCisgICAgICAgIGlmKHBBZGFwdGVyLT5wdHRfcGlkKSAKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHB0dF9zb2NrX3NlbmRfbXNnX3RvX2FwcCh3bXNnLCAwLCBBTklfTkxfTVNHX1BVTUFDLCBwQWRhcHRlci0+cHR0X3BpZCkgPCAwKSB7CisgICAgICAgIAorICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAoIlB0dCBTb2NrZXQgZXJyb3Igc2VuZGluZyBtZXNzYWdlIHRvIHRoZSBhcHAhIVxuIikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAKKyAgICAgICAgfQorICAgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90Kil3bXNnKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfZXZlbnRfcmVwb3J0X3BheWxvYWQoKSAtIAorCisgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBldmVudCBkYXRhIHRvIHRoZSBwdHQgc29ja2V0IGFwcCBvbmx5IGlmIGl0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZHJpdmVyLgorCisgIFxwYXJhbSAgLSBwdHIgLSBQb2ludGVyIHRvIHRoZSBsb2cgaGVhZGVyIHR5cGUuCisgICAgICAgICAgICAgIAorICBccmV0dXJuIC0gTm9uZQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZvc19ldmVudF9yZXBvcnRfcGF5bG9hZCh2X1UxNl90IGV2ZW50X0lkLCB2X1UxNl90IGxlbmd0aCwgdl9WT0lEX3QgKnBQYXlsb2FkKQoreyAKKworCisgICAgdEFuaUhkciAqd21zZyA9IE5VTEw7CisgICAgdl9VOF90ICpwQnVmOworICAgIGhkZF9hZGFwdGVyX3QgKnBBZGFwdGVyOworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0PSBOVUxMOworICAgIGV2ZW50X3JlcG9ydF90ICpwRXZlbnRfcmVwb3J0OworICAgIHZfVTE2X3QgdG90YWxfbGVuOworCisgICAgIC8qR2V0IHRoZSBnbG9iYWwgY29udGV4dCAqLworICAgIHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NZUywgTlVMTCk7CisKKyAgICAgLypHZXQgdGhlIEhkZCBDb250ZXh0ICovCisgICAgcEFkYXB0ZXIgPSAoKFZvc0NvbnRleHRUeXBlKikocFZvc0NvbnRleHQpKS0+cEhERENvbnRleHQ7CisKKyAgICAKKyAgICAvKiBTZW5kIHRoZSBsb2cgZGF0YSB0byB0aGUgcHR0IGFwcCBvbmx5IGlmIGl0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgd2xhbiBkcml2ZXIqLworICAgIGlmKHBBZGFwdGVyLT5wdHRfcGlkKSAKKyAgICB7CisgICAgICAgIHRvdGFsX2xlbiA9IHNpemVvZih0QW5pSGRyKStzaXplb2YoZXZlbnRfcmVwb3J0X3QpK2xlbmd0aDsKKyAgICAgICAgCisgICAgICAgIHBCdWYgPSAgKHZfVThfdCopdm9zX21lbV9tYWxsb2ModG90YWxfbGVuKTsKKyAgICAKKyAgICAgICAgaWYoIXBCdWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAidm9zX21lbV9tYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3bXNnID0gKHRBbmlIZHIqKXBCdWY7CisgICAgICAgIHdtc2ctPnR5cGUgPSBQVFRfTVNHX0RJQUdfQ01EU19UWVBFOworICAgICAgICB3bXNnLT5sZW5ndGggPSB0b3RhbF9sZW47CisgICAgICAgIHdtc2ctPmxlbmd0aCA9IERJQUdfU1dBUDE2KHdtc2ctPmxlbmd0aCk7CisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKHRBbmlIZHIpOworICAgIAorICAgICAgICBwRXZlbnRfcmVwb3J0ID0gKGV2ZW50X3JlcG9ydF90KilwQnVmOworICAgICAgICBwRXZlbnRfcmVwb3J0LT5kaWFnX3R5cGUgPSBESUFHX1RZUEVfRVZFTlRTOworICAgICAgICBwRXZlbnRfcmVwb3J0LT5ldmVudF9pZCA9IGV2ZW50X0lkOworICAgICAgICBwRXZlbnRfcmVwb3J0LT5sZW5ndGggPSBsZW5ndGg7CisgICAgCisgICAgICAgIHBCdWYgKz0gc2l6ZW9mKGV2ZW50X3JlcG9ydF90KTsgCisgICAgCisgICAgICAgIG1lbWNweShwQnVmLCBwUGF5bG9hZCxsZW5ndGgpOworICAgICAgCisgICAgICAgIGlmKCBwdHRfc29ja19zZW5kX21zZ190b19hcHAod21zZywgMCwgQU5JX05MX01TR19QVU1BQywgcEFkYXB0ZXItPnB0dF9waWQpIDwgMCkgeworICAgIAorICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfSERELCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICgiUHR0IFNvY2tldCBlcnJvciBzZW5kaW5nIG1lc3NhZ2UgdG8gdGhlIGFwcCEhXG4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCopd21zZyk7CisgICAgfQorICAKKyAgICByZXR1cm47CisgICAgCit9CmRpZmYgLS1naXQgYS9DT1JFL1ZPU1Mvc3JjL3Zvc19ldmVudC5jIGIvQ09SRS9WT1NTL3NyYy92b3NfZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjgyOTZkCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL3NyYy92b3NfZXZlbnQuYwpAQCAtMCwwICsxLDUwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZJTEU6ICAgICAgICAgdm9zX2V2ZW50LmMKKworICBPVkVSVklFVzogICAgIFRoaXMgc291cmNlIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHZPUyBldmVudCBBUElzCisgICAgICAgICAgICAgICAgVGhlIGZpdmUgQVBJcyBtZW50aW9uZWQgaW4gdGhpcyBmaWxlIGFyZSB1c2VkIGZvcgorICAgICAgICAgICAgICAgIGluaXRpYWxpemluZywgc2V0dGluZywgcmVzZXR0aW5nLCBkZXN0cm95aW5nIGFuIGV2ZW50IGFuZAorICAgICAgICAgICAgICAgIHdhaXRpbmcgb24gYW4gb2NjdXJhbmNlIG9mIGFuIGV2ZW50IGFtb25nIG11bHRpcGxlIGV2ZW50cy4KKworICBERVBFTkRFTkNJRVM6CisKKyAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFRElUIEhJU1RPUlkgRk9SIE1PRFVMRQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ2b3NfZXZlbnQuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdsb2JhbCBEYXRhIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgVmFyaWFibGUgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEZ1bmN0aW9uIERlZmluaXRpb25zIGFuZCBEb2N1bWVudGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19ldmVudF9pbml0KCkgLSBpbml0aWFsaXplcyBhIHZPU1MgZXZlbnQKKworICBUaGUgdm9zX2V2ZW50X2luaXQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGV2ZW50LiBVcG9uCisgIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24sIHRoZSBzdGF0ZSBvZiB0aGUgZXZlbnQgYmVjb21lcyBpbml0aWFsaXplZAorICBhbmQgbm90IHNpZ25hbGVkLgorCisgIEFuIGV2ZW50IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IG1heSBiZSB1c2VkIGluIGFueSBvdGhlciBldmVudAorICBmdW5jdGlvbnMuCisKKyAgQXR0ZW1wdGluZyB0byBpbml0aWFsaXplIGFuIGFscmVhZHkgaW5pdGlhbGl6ZWQgZXZlbnQgcmVzdWx0cyBpbgorICBhIGZhaWx1cmUuCisKKyAgXHBhcmFtIGxvY2sgLSBwb2ludGVyIHRvIHRoZSBvcGFxdWUgZXZlbnQgb2JqZWN0IHRvIGluaXRpYWxpemUKKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kCisgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9CVVNZIC0gVGhlIGltcGxlbWVudGF0aW9uIGhhcyBkZXRlY3RlZCBhbiBhdHRlbXB0CisgICAgICAgICAgdG8gcmVpbml0aWFsaXplIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSBldmVudCwgYSBwcmV2aW91c2x5CisgICAgICAgICAgaW5pdGlhbGl6ZWQsIGJ1dCBub3QgeWV0IGRlc3Ryb3llZCwgZXZlbnQuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gZXZlbnQgaXMgYW4gaW52YWxpZCBwb2ludGVyLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBldmVudCBjb3VsZCBub3QgYmUgY3JlYXRlZCBkdWUgdG8KKyAgICAgICAgICB1bmtub3duIHJlYXNvbnMKKworICAgICAgICoqKlZPU19TVEFUVVNfRV9SRVNPVVJDRVMgLSBTeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkKKyAgICAgICAgICBhcmUgdW5hdmFpbGFibGUgdG8gaW5pdGlsaXplIHRoZSBldmVudAorCisgICAgICAgKioqVk9TX1NUQVRVU19FX05PTUVNIC0gaW5zdWZmaWNpZW50IG1lbW9yeSBleGlzdHMgdG8gaW5pdGlhbGl6ZQorICAgICAgICAgIHRoZSBldmVudAorCisgIFxzYQorCisgICggKioqIGluZGljYXRlcyByZXR1cm4gdmFsdWVzIGRvIE5PVCBleGlzdCB5ZXQgKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2V2ZW50X2luaXQgKCB2b3NfZXZlbnRfdCogZXZlbnQgKQoreworCisgICAvLyBDaGVjayBmb3IgbnVsbCBwb2ludGVyCisgICBpZiAoIE5VTEwgPT0gZXZlbnQgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJOVUxMIGV2ZW50IHBhc3NlZCBpbnRvICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICAvLyBjaGVjayBmb3IgJ2FscmVhZHkgaW5pdGlhbGl6ZWQnIGV2ZW50CisgICBpZiAoIExJTlVYX0VWRU5UX0NPT0tJRSA9PSBldmVudC0+Y29va2llICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiSW5pdGlhbGl6ZWQgZXZlbnQgcGFzc2VkIGludG8gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfQlVTWTsKKyAgIH0KKworICAgLy8gaW5pdGlhbGl6ZSBuZXcgZXZlbnQKKyAgIGluaXRfY29tcGxldGlvbigmZXZlbnQtPmNvbXBsZXRlKTsKKyAgIGV2ZW50LT5jb29raWUgPSBMSU5VWF9FVkVOVF9DT09LSUU7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX2V2ZW50X3NldCgpIC0gc2V0cyBhIHZPU1MgZXZlbnQKKworICBUaGUgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBldmVudCBpcyBzZXQgdG8gJ3NpZ25hbGxlZCBieSBjYWxsaW5nCisgIFxhIHZvc19ldmVudF9zZXQoKS4KKworICBBbnkgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSBldmVudCBhcyBhIHJlc3VsdCBvZiBhIHZvc19ldmVudF93YWl0KCkgd2lsbAorICBiZSB1bmJsb2NrZWQgYW5kIGF2YWlsYWJsZSB0byBiZSBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlvbiB3aGVuIHRoZSBldmVudAorICBpcyBzaWduYWxlZCBieSBhIGNhbGwgdG8gXGEgdm9zX2V2ZW50X3NldCgpLgorCisgIFxwYXJhbSBldmVudCAtIHRoZSBldmVudCB0byBzZXQgdG8gdGhlIHNpZ25hbGxlZCBzdGF0ZQorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGhlIGV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgc2lnbmFsbGVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBldmVudCBkb2VzIG5vdCByZWZlcgorICAgICAgICAgIHRvIGFuIGluaXRpYWxpemVkIGV2ZW50IG9iamVjdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBldmVudCBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIGV2ZW50IGNvdWxkIG5vdCBiZSBzaWduYWxlZCBkdWUgdG8KKyAgICAgICAgICB1bmtub3duIHJlYXNvbnMKKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVk9TX1NUQVRVUyB2b3NfZXZlbnRfc2V0ICggdm9zX2V2ZW50X3QqIGV2ZW50ICkKK3sKKworICAgLy8gQ2hlY2sgZm9yIG51bGwgcG9pbnRlcgorICAgaWYgKCBOVUxMID09IGV2ZW50ICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiTlVMTCBldmVudCBwYXNzZWQgaW50byAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgLy8gY2hlY2sgaWYgZXZlbnQgcmVmZXJzIHRvIGFuIGluaXRpYWxpemVkIG9iamVjdAorICAgaWYgKCBMSU5VWF9FVkVOVF9DT09LSUUgIT0gZXZlbnQtPmNvb2tpZSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlVuaW5pdGlhbGl6ZWQgZXZlbnQgcGFzc2VkIGludG8gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIGNvbXBsZXRlKCZldmVudC0+Y29tcGxldGUpOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19ldmVudF9yZXNldCgpIC0gcmVzZXRzIGEgdk9TUyBldmVudCAtIFRoaXMgZnVuY3Rpb24gaXNuJ3QgcmVxdWlyZWQKKyAgIGZvciBMaW51eC4gVGhlcmVmb3JlLCBpdCBkb2Vzbid0IGRvIG11Y2guCisKKyAgVGhlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQgaXMgc2V0IHRvICdOT1Qgc2lnbmFsbGVkJyBieSBjYWxsaW5nCisgIFxhIHZvc19ldmVudF9yZXNldCgpLiAgVGhlIHN0YXRlIG9mIHRoZSBldmVudCByZW1haW5zIE5PVCBzaWduYWxsZWQgdW50aWwgYW4KKyAgZXhwbGljaXQgY2FsbCB0byB2b3NfZXZlbnRfc2V0KCkuCisKKyAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBldmVudCB0byBhIE5PVCBzaWduYWxsZWQgc3RhdGUgZXZlbiBpZiB0aGUgZXZlbnQgd2FzCisgIHNpZ25hbGxlZCBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgYmVpbmcgc2lnbmFsZWQuCisKKyAgXHBhcmFtIGV2ZW50IC0gdGhlIGV2ZW50IHRvIHNldCB0byB0aGUgTk9UIHNpZ25hbGxlZCBzdGF0ZQorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGhlIGV2ZW50IHN0YXRlIHdhcyBzdWNjZXNzZnVsbHkgY2hhbmdlIHRvCisgICAgICAgICAgTk9UIHNpZ25hbGxlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgZXZlbnQgZG9lcyBub3QgcmVmZXIKKyAgICAgICAgICB0byBhbiBpbml0aWFsaXplZCBldmVudCBvYmplY3QuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gZXZlbnQgaXMgYW4gaW52YWxpZCBwb2ludGVyLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBldmVudCBjb3VsZCBub3QgYmUgc2lnbmFsZWQgZHVlIHRvCisgICAgICAgICAgdW5rbm93biByZWFzb25zCisKKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2V2ZW50X3Jlc2V0ICggdm9zX2V2ZW50X3QqIGV2ZW50ICkKK3sKKworICAgLy8gY2hlY2sgZm9yIG51bGwgcG9pbnRlcgorICAgaWYgKCBOVUxMID09IGV2ZW50ICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiTlVMTCBldmVudCBwYXNzZWQgaW50byAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgLy8gY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIGFuICdhbHJlYWR5IGluaXRpYWxpemVkJyBldmVudAorICAgaWYgKCBMSU5VWF9FVkVOVF9DT09LSUUgIT0gZXZlbnQtPmNvb2tpZSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlVuaW5pdGlhbGl6ZWQgZXZlbnQgcGFzc2VkIGludG8gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIChyZSlpbml0aWFsaXplIGV2ZW50CisgICBJTklUX0NPTVBMRVRJT04oZXZlbnQtPmNvbXBsZXRlKTsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc193YWl0X2V2ZW50cygpIC0gV2FpdHMgZm9yIHRoZSBmaXJzdCBldmVudChzKSB0byBiZSBzZXQuCisKKyAgIFRoaXMgQVBJIHdhaXRzIGZvciBhbnkgZXZlbnQgaW4gdGhlIGlucHV0IGFycmF5IG9mIGV2ZW50cyB0byBiZQorICAgc2V0LiAgVGhlIGNhbGxlciBpcyBibG9ja2VkIHdhaXRpbmcgYW55IGV2ZW50IGluIHRoZSBhcnJheSB0byBiZQorICAgc2V0IG9yIGZvciB0aGUgdGltZW91dCB0byBvY2N1ci4KKworICAgSWYgbXVsdGlwbGUgZXZlbnRzIGluIHRoZSBhcnJheSBhcmUgc2V0LCBvbmx5IG9uZSBldmVudCBpcyBpZGVudGlmaWVkCisgICBpbiB0aGUgcmV0dXJuIGZyb20gdGhpcyBjYWxsIGFzIHNhdGlzZnlpbmcgdGhlIHdhaXQgY29uZGl0aW9uLiAgVGhlCisgICBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgXGEgdm9zX3dhaXRfZXZlbnRzKCkgYWdhaW4gdG8gZmluZAorICAgdGhlIG90aGVyIGV2ZW50cyB0aGF0IGFyZSBzZXQuCisKKyAgXHBhcmFtIGV2ZW50cyAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZXZlbnRzIHRvIHdhaXQgb24uCisKKyAgXHBhcmFtIG51bUV2ZW50cyAtIE51bWJlciBvZiBldmVudHMgaW4gdGhlIGV2ZW50cyBhcnJheSB0byB3YWl0IG9uLgorCisgIFxwYXJhbSB0aW1lb3V0IC0gVGltZW91dCB2YWx1ZSAoaW4gbWlsbGlzZWNvbmRzKS4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgICAgICAgaWYgdGhpcyBpbnRlcnZhbCBlbGFwc2VzLCByZWdhcmRsZXNzIGlmIGFueSBvZiB0aGUgZXZlbnRzIGhhdmUKKyAgICAgICAgIGJlZW4gc2V0LiAgQW4gaW5wdXQgdmFsdWUgb2YgMCBmb3IgdGhpcyB0aW1lb3V0IHBhcmFtZXRlciBtZWFucworICAgICAgICAgdG8gd2FpdCBpbmZpbml0ZWx5LCBtZWFuaW5nIGEgdGltZW91dCB3aWxsIG5ldmVyIG9jY3VyLgorCisgIFxwYXJhbSBwRXZlbnRJbmRleCAtIFRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgaW5kZXggb2YKKyAgICAgICAgIHRoZSBldmVudCBpbiB0aGUgZXZlbnQgYXJyYXkgdGhhdCBzYXRpc2ZpZWQgdGhlIHdhaXQgYmVjYXVzZQorICAgICAgICAgdGhlIGV2ZW50IHdhcyBzZXQuCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgd2FpdCB3YXMgc2F0aXNpZmVkIGJ5IG9uZSBvZiB0aGUgZXZlbnRzCisgICAgICAgICAgaW4gdGhlIGV2ZW50IGFycmF5IGJlaW5nIHNldC4gIFRoZSBpbmRleCBpbnRvIHRoZSBldmVudCBhcnJ5CisgICAgICAgICAgdGhhdCBzYXRpc2ZpZWQgdGhlIHdhaXQgY2FuIGJlIGZvdW5kIGF0ICpwRXZlbnRJbmRleC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9USU1FT1VUIC0gdGhlIHRpbWVvdXQgaW50ZXJ2YWwgZWxhcHNlZCBiZWZvcmUgYW55IG9mCisgICAgICAgICAgdGhlIGV2ZW50cyB3ZXJlIHNldC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgICAgICBldmVudCBhcnJheSByZWZlcnMgdG8gYW4gdW5pbml0aWFsaXplZCBldmVudCBvYmplY3QuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfQUJPUlRFRCAtIFRoZSBldmVudCBkdWUgdG8gd2hpY2ggdGhlIHdhaXQgd2FzIGFib3J0ZWQKKyAgICAgICAgICBpcyBpZGVudGlmaWVkIGJ5IHRoZSBpbmRleCBpbiAqcEV2ZW50SW5kZXguCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRU1QVFkgLSB0aGUgZXZlbnRzIGFycmF5IGlzIGVtcHR5LiAgVGhpcyBjb25kaXRpb24KKyAgICAgICAgICBpcyBkZXRlY3RlZCBieSBudW1FdmVudHMgYmVpbmcgMCBvbiBpbnB1dC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIGV2ZW50IG9yIHBFdmVudEluZGV4IGlzIGFuIGludmFsaWQgcG9pbnRlci4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gZGVmYXVsdCByZXR1cm4gdmFsdWUgaWYgaXQgZmFpbHMgZHVlIHRvCisgICAgICAgICAgdW5rbm93biByZWFzb25zCisKKyAgXHNhCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc193YWl0X2V2ZW50cyAoIHZvc19ldmVudF90KiBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBudW1FdmVudHMsIHZfVTMyX3QgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwRXZlbnRJbmRleCApCit7CisKKyAgIHJldHVybiB2b3Nfd2FpdF9zaW5nbGVfZXZlbnQoZXZlbnRzLHRpbWVvdXQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19ldmVudF9kZXN0cm95KCkgLSBEZXN0cm95cyBhIHZPU1MgZXZlbnQgLSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZG8KKyAgIG11Y2ggaW4gTGludXguIFRoZXJlIGlzIG5vIG5lZWQgZm9yIHRoZSBjYWxsZXIgdG8gZXhwbGljaXRseSBkZXN0cm95IGFuIGV2ZW50CisgICBhZnRlciB1c2UuCisKKyAgVGhlIG9zX2V2ZW50X2Rlc3Ryb3koKSBmdW5jdGlvbiBzaGFsbCBkZXN0cm95IHRoZSBldmVudCBvYmplY3QKKyAgcmVmZXJlbmNlZCBieSBldmVudC4gIEFmdGVyIGEgc3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBcYSB2b3NfZXZlbnRfZGVzdHJveSgpCisgIHRoZSBldmVudCBvYmplY3QgYmVjb21lcywgaW4gZWZmZWN0LCB1bmluaXRpYWxpemVkLgorCisgIEEgZGVzdHJveWVkIGV2ZW50IG9iamVjdCBjYW4gYmUgcmVpbml0aWFsaXplZCB1c2luZyB2b3NfZXZlbnRfaW5pdCgpOworICB0aGUgcmVzdWx0cyBvZiBvdGhlcndpc2UgcmVmZXJlbmNpbmcgdGhlIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQKKyAgYXJlIHVuZGVmaW5lZC4gIENhbGxzIHRvIHZPU1MgZXZlbnQgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdGhlIGxvY2sgc3VjaAorICBhcyB2b3NfZXZlbnRfc2V0KCkgd2lsbCBmYWlsIGlmIHRoZSBldmVudCBpcyBkZXN0cm95ZWQuICBUaGVyZWZvcmUsCisgIGRvbid0IHVzZSB0aGUgZXZlbnQgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVzdHJveWVkIHVudGlsIGl0IGhhcworICBiZWVuIHJlLWluaXRpYWxpemVkLgorCisgIFxwYXJhbSBldmVudCAtIHRoZSBldmVudCBvYmplY3QgdG8gYmUgZGVzdHJveWVkLgorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gZXZlbnQgd2FzIHN1Y2Nlc3NmdWxseSBkZXN0cm95ZWQuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IGV2ZW50IGlzIGludmFsaWQuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgLSBldmVudCBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIGV2ZW50IGNvdWxkIG5vdCBiZSBzaWduYWxlZCBkdWUgdG8KKyAgICAgICAgICB1bmtub3duIHJlYXNvbnMKKworICAgICAgICoqKlZPU19TVEFUVVNfRV9CVVNZIC0gVGhlIGltcGxlbWVudGF0aW9uIGhhcyBkZXRlY3RlZCBhbiBhdHRlbXB0CisgICAgICAgICAgdG8gZGVzdHJveSB0aGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgZXZlbnQgd2hpbGUgaXQgaXMgc3RpbGwgYmVpbmcKKyAgICAgICAgICByZWZlcmVuY2VkICh0aGVyZSBhcmUgdGhyZWFkcyB3YWl0aW5nIG9uIHRoaXMgZXZlbnQpCisgIFxzYQorCisgICAoICoqKiBpbmRpY2F0ZXMgcmV0dXJuIHZhbHVlcyBkbyBOT1QgZXhpc3QgeWV0ICkKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZPU19TVEFUVVMgdm9zX2V2ZW50X2Rlc3Ryb3kgKCB2b3NfZXZlbnRfdCogZXZlbnQgKQoreworICAgLy8gY2hlY2sgZm9yIG51bGwgcG9pbnRlcgorICAgaWYgKCBOVUxMID09IGV2ZW50ICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiTlVMTCBldmVudCBwYXNzZWQgaW50byAlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgLy8gY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIGFuICdhbHJlYWR5IGluaXRpYWxpemVkJyBldmVudAorICAgaWYgKCBMSU5VWF9FVkVOVF9DT09LSUUgIT0gZXZlbnQtPmNvb2tpZSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlVuaW5pdGlhbGl6ZWQgZXZlbnQgcGFzc2VkIGludG8gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIG1ha2Ugc3VyZSBub2JvZHkgaXMgd2FpdGluZyBvbiB0aGUgZXZlbnQKKyAgIGNvbXBsZXRlX2FsbCgmZXZlbnQtPmNvbXBsZXRlKTsKKworICAgLy8gZGVzdHJveSB0aGUgZXZlbnQKKyAgIG1lbXNldChldmVudCwgMCwgc2l6ZW9mKHZvc19ldmVudF90KSk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3Nfd2FpdF9zaW5nbGVfZXZlbnQoKSAtIFdhaXRzIGZvciBhIHNpbmdsZSBldmVudCB0byBiZSBzZXQuCisKKyAgIFRoaXMgQVBJIHdhaXRzIGZvciB0aGUgZXZlbnQgdG8gYmUgc2V0LgorCisgIFxwYXJhbSBwRXZlbnQgLSBwb2ludGVyIHRvIGFuIGV2ZW50IHRvIHdhaXQgb24uCisKKyAgXHBhcmFtIHRpbWVvdXQgLSBUaW1lb3V0IHZhbHVlIChpbiBtaWxsaXNlY29uZHMpLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAgICAgICBpZiB0aGlzIGludGVydmFsIGVsYXBzZXMsIHJlZ2FyZGxlc3MgaWYgYW55IG9mIHRoZSBldmVudHMgaGF2ZQorICAgICAgICAgYmVlbiBzZXQuICBBbiBpbnB1dCB2YWx1ZSBvZiAwIGZvciB0aGlzIHRpbWVvdXQgcGFyYW1ldGVyIG1lYW5zCisgICAgICAgICB0byB3YWl0IGluZmluaXRlbHksIG1lYW5pbmcgYSB0aW1lb3V0IHdpbGwgbmV2ZXIgb2NjdXIuCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgd2FpdCB3YXMgc2F0aXNpZmVkIGJ5IHRoZSBldmVudCBiZWluZworICAgICAgICAgIHNldC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9USU1FT1VUIC0gdGhlIHRpbWVvdXQgaW50ZXJ2YWwgZWxhcHNlZCBiZWZvcmUgdGhlCisgICAgICAgICAgZXZlbnQgd2FzIHNldC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgZXZlbnQgaXMgaW52YWxpZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHBFdmVudCBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuCisKKyAgXHNhIHZvc193YWl0X211bHRpcGxlX2V2ZW50cygpCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3Nfd2FpdF9zaW5nbGVfZXZlbnQgKCB2b3NfZXZlbnRfdCogZXZlbnQsIHZfVTMyX3QgdGltZW91dCkKK3sKKworICAgaWYgKGluX2ludGVycnVwdCgpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQhISEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIC8vIGNoZWNrIGZvciBudWxsIHBvaW50ZXIKKyAgIGlmICggTlVMTCA9PSBldmVudCApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIk5VTEwgZXZlbnQgcGFzc2VkIGludG8gJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIC8vIGNoZWNrIGlmIGNvb2tpZSBpcyBzYW1lIGFzIHRoYXQgb2YgaW5pdGlhbGl6ZWQgZXZlbnQKKyAgIGlmICggTElOVVhfRVZFTlRfQ09PS0lFICE9IGV2ZW50LT5jb29raWUgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJVbmluaXRpYWxpemVkIGV2ZW50IHBhc3NlZCBpbnRvICVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBpZiAodGltZW91dCkKKyAgIHsKKyAgICAgIGxvbmcgcmV0OworICAgICAgcmV0ID0KKyAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZldmVudC0+Y29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKKyAgICAgIGlmICggMCA+PSByZXQgKQorICAgICAgeworICAgICAgICAgLy8gMCBtZWFucyB0aW1lZCBvdXQsIG5lZ2F0aXZlIG1lYW5zIGludGVycnVwdGVkCisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX1RJTUVPVVQ7CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpbnQgcmV0OworICAgICAgcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZldmVudC0+Y29tcGxldGUpOworICAgICAgaWYgKCAwICE9IHJldCApCisgICAgICB7CisgICAgICAgICAvLyBuZWdhdGl2ZSBtZWFucyBpbnRlcnJ1cHRlZAorICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9USU1FT1VUOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3dhaXRfbXVsdGlwbGVfZXZlbnRzKCkgLSBXYWl0cyBmb3IgZXZlbnQocykgdG8gYmUgc2V0LgorICAgVGhpcyBpcyBhIGR1cGxpY2F0ZSBvZiB2b3Nfd2FpdF9ldmVudHMoKSBmdW5jdGlvbi4gSXQgZW5kcyB1cCBjYWxsaW5nCisgICB2b3Nfd2FpdF9ldmVudHMoKSB3aXRoIHRoZSBwYXJhbXMgcGFzc2VkIGluLgorCisgICBUaGlzIEFQSSB3YWl0cyBmb3IgYW55IGV2ZW50IGluIHRoZSBpbnB1dCBhcnJheSBvZiBldmVudHMgdG8gYmUKKyAgIHNldC4gIFRoZSBjYWxsZXIgaXMgYmxvY2tlZCB3YWl0aW5nIGFueSBldmVudCBpbiB0aGUgYXJyYXkgdG8gYmUKKyAgIHNldCBvciBmb3IgdGhlIHRpbWVvdXQgdG8gb2NjdXIuCisKKyAgIElmIG11bHRpcGxlIGV2ZW50cyBpbiB0aGUgYXJyYXkgYXJlIHNldCwgb25seSBvbmUgZXZlbnQgaXMgaWRlbnRpZmllZAorICAgaW4gdGhlIHJldHVybiBmcm9tIHRoaXMgY2FsbCBhcyBzYXRpc2Z5aW5nIHRoZSB3YWl0IGNvbmRpdGlvbi4gIFRoZQorICAgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIFxhIHZvc193YWl0X2V2ZW50cygpIGFnYWluIHRvIGZpbmQKKyAgIHRoZSBvdGhlciBldmVudHMgdGhhdCBhcmUgc2V0LgorCisgIFxwYXJhbSBwRXZlbnRMaXN0IC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBldmVudCBwb2ludGVycworCisgIFxwYXJhbSBudW1FdmVudHMgLSBOdW1iZXIgb2YgZXZlbnRzCisKKyAgXHBhcmFtIHRpbWVvdXQgLSBUaW1lb3V0IHZhbHVlIChpbiBtaWxsaXNlY29uZHMpLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAgICAgICBpZiB0aGlzIGludGVydmFsIGVsYXBzZXMsIHJlZ2FyZGxlc3MgaWYgYW55IG9mIHRoZSBldmVudHMgaGF2ZQorICAgICAgICAgYmVlbiBzZXQuICBBbiBpbnB1dCB2YWx1ZSBvZiAwIGZvciB0aGlzIHRpbWVvdXQgcGFyYW1ldGVyIG1lYW5zCisgICAgICAgICB0byB3YWl0IGluZmluaXRlbHksIG1lYW5pbmcgYSB0aW1lb3V0IHdpbGwgbmV2ZXIgb2NjdXIuCisKKyAgXHBhcmFtIHBFdmVudEluZGV4IC0gVGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBpbmRleCBvZgorICAgICAgICAgdGhlIGV2ZW50IGluIHRoZSBldmVudCBhcnJheSB0aGF0IHNhdGlzZmllZCB0aGUgd2FpdCBiZWNhdXNlCisgICAgICAgICB0aGUgZXZlbnQgd2FzIHNldC4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSB3YWl0IHdhcyBzYXRpc2lmZWQgYnkgb25lIG9mIHRoZSBldmVudHMKKyAgICAgICAgICBpbiB0aGUgZXZlbnQgYXJyYXkgYmVpbmcgc2V0LiAgVGhlIGluZGV4IGludG8gdGhlIGV2ZW50IGFycnkKKyAgICAgICAgICB0aGF0IHNhdGlzZmllZCB0aGUgd2FpdCBjYW4gYmUgZm91bmQgYXQgKnBFdmVudEluZGV4LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX1RJTUVPVVQgLSB0aGUgdGltZW91dCBpbnRlcnZhbCBlbGFwc2VkIGJlZm9yZSBhbnkgb2YKKyAgICAgICAgICB0aGUgZXZlbnRzIHdlcmUgc2V0LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZQorICAgICAgICAgIGV2ZW50IGFycmF5IHJlZmVycyB0byBhbiB1bmluaXRpYWxpemVkIGV2ZW50IG9iamVjdC4gIFRoZSBpbnZhbGlkCisgICAgICAgICAgZXZlbnQgaXMgaWRlbnRpZmllZCBieSB0aGUgaW5kZXggaW4gKnBFdmVudEluZGV4LiAgTm90ZSB0aGF0IG9ubHkKKyAgICAgICAgICB0aGUgZmlyc3QgdW5pbml0aWFsaXplZCBldmVudCBpcyBkZXRlY3RlZCB3aGVuIHRoaXMgZXJyb3IgaXMKKyAgICAgICAgICByZXR1cm5lZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIHRoZSBldmVudHMgYXJyYXkgaXMgZW1wdHkuICBUaGlzIGNvbmRpdGlvbgorICAgICAgICAgIGlzIGRldGVjdGVkIGJ5IG51bUV2ZW50cyBiZWluZyAwIG9uIGlucHV0LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gZXZlbnQgb3IgcEV2ZW50SW5kZXggaXMgYW4gaW52YWxpZCBwb2ludGVyLgorCisgIFxzYSB2b3Nfd2FpdF9zaW5nbGVfZXZlbnRzKCkKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc193YWl0X211bHRpcGxlX2V2ZW50cyggdm9zX2V2ZW50X3QgKipldmVudHMsIHZfVThfdCBudW1FdmVudHMsCisgICB2X1UzMl90IHRpbWVvdXQsIHZfVThfdCAqcEV2ZW50SW5kZXggKQoreworICAgLy8gTk8gTE9OR0VSIFNVUFBPUlRFRAorICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL3NyYy92b3NfZ2V0QmluLmMgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19nZXRCaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWYzYjljCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL3NyYy92b3NfZ2V0QmluLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICB2b3NfZ2V0QmluLmMKKyAgXGJyaWVmCisgIERlc2NyaXB0aW9uLi4uCisgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogJEhFQURFUiQgKi8KKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgZmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8dm9zX2dldEJpbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+ICAgICAgIC8vIGZvciBzb2Z0bWFjIGRpcmVjdCBmaWxlIGkvbworI2luY2x1ZGUgPHZvc19hcGkuaD4KKyNpbmNsdWRlIDx2b3Nfc2NoZWQuaD4KKyNpbmNsdWRlIDx3bGFuX2hkZF9taXNjLmg+CisjaW5jbHVkZSA8d2xhbl9oZGRfbWFpbi5oPgorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiB0Vk9TX0NPTkNVUlJFTkNZX01PREUgaGRkX2dldF9jb25jdXJyZW5jeV9tb2RlICggdm9pZCApOworICAKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiB2b3NfZ2V0X2JpbmFyeV9ibG9iKCkgLSBnZXQgYmluYXJ5IGRhdGEgZnJvbSBwbGF0Zm9ybQorICBUaGlzIEFQSSBhbGxvd3MgY29tcG9uZW50cyB0byBnZXQgYmluYXJ5IGRhdGEgZnJvbSB0aGUgcGxhdGZvcm0gaW5kZXBlbmRlbnQKKyAgb2Ygd2hlcmUgdGhlIGRhdGEgaXMgc3RvcmVkIG9uIHRoZSBkZXZpY2UuCisgIDx1bD4KKyAgICA8bGk+IEZpcm13YXJlCisgICAgPGxpPiBDb25maWd1cmF0aW9uIERhdGEKKyAgXHBhcmFtIGJpbmFyeUlkIC0gaWRlbnRpZmllcyB0aGUgYmluYXJ5IGRhdGEgdG8gcmV0dXJuIHRvIHRoZSBjYWxsZXIuCisgICAgICAgICByYXcgYmluYXJ5IGRhdGEgYW5kIHVwZGF0ZSB0aGUgKnBCdWZmZXJTaXplIHdpdGggdGhlIGV4YWN0CisgICAgICAgICBzaXplIG9mIHRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmV0cmVpdmVkLgorICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGJpbmFyeSBkYXRhIGluICpwQnVmZmVyU2l6ZS4KKyAgICAgICAgIHNpemUgb2YgdGhlIGRhdGEgYnVmZmVyIGF2YWlsYWJsZSBhdCBwQnVmZmVyLiAgVXBvbiBzdWNjZXNzLCB0aGlzCisgICAgICAgICByZXRyZWl2ZWQgYW5kIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlciBhdCBwQnVmZmVyLgorICAgICAgICAgSW5wdXQgdmFsdWUgb2YgMCBpcyB2YWxpZCBhbmQgd2lsbCBjYXVzZSB0aGUgQVBJIHRvIHJldHVybgorICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGJpbmFyeSBkYXRhIGluICpwQnVmZmVyU2l6ZS4KKyAgICAgICAgICByZXRyZWl2ZWQgYW5kIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlci4KKyAgICAgICAgICByZWZlciB0byBhIHZhbGlkIFZPUyBCaW5hcnkgSUQuCisgICAgICAgICAgdmFyaWFibGUgdGhhdCB0aGUgQVBJIGNhbiB3cml0ZSB0by4KKyAgICAgICAgICAqcEJ1ZmZlclNpemUgaXMgbm90IGJpZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgYmluYXJ5LgorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfZ2V0X2JpbmFyeV9ibG9iKCBWT1NfQklOQVJZX0lEIGJpbmFyeUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqcEJ1ZmZlciwgdl9TSVpFX3QgKnBCdWZmZXJTaXplICkKK3sKKyAgVk9TX1NUQVRVUyBWb3NTdHMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgY2hhciAqcEZpbGVOYW1lOworCisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU1lTLE5VTEwpOworCisgICAgLy8gZ2V0IHRoZSBjb3JyZWN0IGZpbGUgbmFtZSBmcm9tIGJpbmFyeSBJZAorICAgIHN3aXRjaCAoYmluYXJ5SWQpCisgICAgeworICAgICAgICBjYXNlIFZPU19CSU5BUllfSURfQ09ORklHOgorICAgICAgICAgICBwRmlsZU5hbWUgPSBXTEFOX0NGR19GSUxFOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWT1NfQklOQVJZX0lEX0NPVU5UUllfSU5GTzoKKyAgICAgICAgICAgcEZpbGVOYW1lID0gV0xBTl9DT1VOVFJZX0lORk9fRklMRTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk9TX0JJTkFSWV9JRF9IT19DT05GSUc6CisgICAgICAgICAgIHBGaWxlTmFtZSA9IFdMQU5fSE9fQ0ZHX0ZJTEU7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJJbnZhbGlkIGJpbmFyeUlEIik7CisgICAgICAgICAgIHJldHVybiBWb3NTdHM7CisgICAgfQorICAgIGlmKDAgPT0gKnBCdWZmZXJTaXplICkKKyAgICB7CisgICAgICAgLyogIGp1c3QgYSBmaWxlIHNpemUgcmVxdWVzdC4gIHNldCB0aGUgdmFsdWUgYW5kIHJldHVybiAgVk9TX1NUQVRVU19FX05PTUVNKi8KKyAgICAgICBWb3NTdHMgPSBoZGRfZ2V0X2NmZ19maWxlX3NpemUoKChWb3NDb250ZXh0VHlwZSopKHBWb3NDb250ZXh0KSktPnBIRERDb250ZXh0LHBGaWxlTmFtZSxwQnVmZmVyU2l6ZSk7CisKKyAgICAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIFZvc1N0cyApKQorICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgOiB2b3Nfb3BlbiBmYWlsZWRcbiIsX19mdW5jX18pOworCisgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgIH0KKyAgICAgICBWb3NTdHMgPSBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgaWYoTlVMTCAhPSBwQnVmZmVyKSB7CisgICAgICAgICAgLy8gcmVhZCB0aGUgY29udGVudHMgaW50byB0aGUgYnVmZmVyCisgICAgICAgICAgVm9zU3RzID0gaGRkX3JlYWRfY2ZnX2ZpbGUoKChWb3NDb250ZXh0VHlwZSopKHBWb3NDb250ZXh0KSktPnBIRERDb250ZXh0LHBGaWxlTmFtZSxwQnVmZmVyLHBCdWZmZXJTaXplKTsKKyAgICAgICB9CisgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgVm9zU3RzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgfQorICAgIH0gICAgICAgCisgICAgCisgICAgcmV0dXJuIFZvc1N0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCitWT1NfU1RBVFVTIHZvc19nZXRfZndiaW5hcnkoIHZfVk9JRF90ICoqcHBCaW5hcnksIHZfU0laRV90ICpwTnVtQnl0ZXMgKQoreyAgICAgICAgCisgICB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dDsKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICBwVm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9TWVMsTlVMTCk7CisKKyAgIGlmKHBWb3NDb250ZXh0KSB7CisKKyAgICAgICAgIHN0YXR1cyA9IGhkZF9yZXF1ZXN0X2Zpcm13YXJlKFdMQU5fRldfRklMRSwoKFZvc0NvbnRleHRUeXBlKikocFZvc0NvbnRleHQpKS0+cEhERENvbnRleHQscHBCaW5hcnkscE51bUJ5dGVzKTsKKworICAgfSAKKyAgIHJldHVybiBzdGF0dXM7ICAgICAgCit9ICAgICAgICAgCisjZW5kaWYKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK3RWT1NfQ09OX01PREUgdm9zX2dldF9jb25wYXJhbSggdm9pZCApCit7CisgICAgdFZPU19DT05fTU9ERSBjb25fbW9kZTsgCisgICAgY29uX21vZGUgPSBoZGRfZ2V0X2NvbnBhcmFtICggKTsKKyAgICByZXR1cm4gY29uX21vZGU7Cit9CisjZW5kaWYKK3RWT1NfQ09OQ1VSUkVOQ1lfTU9ERSB2b3NfZ2V0X2NvbmN1cnJlbmN5X21vZGUoIHZvaWQgKQoreworICAgIHRWT1NfQ09OQ1VSUkVOQ1lfTU9ERSBjb25fbW9kZTsgCisgICAgY29uX21vZGUgPSBoZGRfZ2V0X2NvbmN1cnJlbmN5X21vZGUgKCApOworICAgIHJldHVybiBjb25fbW9kZTsKK30KKwordl9CT09MX3Qgdm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZyh2b2lkKQoreworICAgIHZfVThfdCBpPTA7CisgICAgdl9VOF90IGo9MDsKKyAgICBoZGRfY29udGV4dF90ICpwSGRkQ3R4OworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dCggVk9TX01PRFVMRV9JRF9IREQsIE5VTEwgKTsgICAgCisKKyAgICBpZiAoTlVMTCAhPSBwVm9zQ29udGV4dCkKKyAgICB7CisgICAgICAgcEhkZEN0eCA9IHZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9IREQsIHBWb3NDb250ZXh0KTsKKworICAgICAgIGZvciAoaT0wO2k8Vk9TX01BWF9OT19PRl9NT0RFOyBpKyspCisgICAgICAgeworICAgICAgICAgIGogKz0gcEhkZEN0eC0+bm9fb2Zfc2Vzc2lvbnNbaV07CisgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoaj4xKTsKK30KKwpkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL3NyYy92b3NfbGlzdC5jIGIvQ09SRS9WT1NTL3NyYy92b3NfbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTZlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19saXN0LmMKQEAgLTAsMCArMSw5MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIHZvc19saXN0LmMKKworICBcYnJpZWYKKworICBEZXNjcmlwdGlvbi4uLgorCisKKyAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLgorICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgICAgICAgICAgICAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KiovCisvKiAkSEVBREVSJCAqLworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIGZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHZvc19saXN0Lmg+CisjaW5jbHVkZSA8dm9zX3RyYWNlLmg+CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBWT1NfTElTVF9DT09LSUUgMHhhYmFkZmVlZAorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2xpc3RfaW5pdCggdm9zX2xpc3RfdCAqcExpc3QgKQoreworICAgaWYgKCBwTGlzdCA9PSBOVUxMKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIHBMaXN0LT5jb29raWUgPT0gVk9TX0xJU1RfQ09PS0lFICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGFscmVhZHkgaW5pdGlhbGl6ZWQgbGlzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0JVU1k7CisgICB9CisKKyAgIG11dGV4X2luaXQoJnBMaXN0LT5sb2NrKTsKKworICAgSU5JVF9MSVNUX0hFQUQoICZwTGlzdC0+YW5jaG9yICk7CisKKyAgIHBMaXN0LT5jb3VudCA9IDA7CisgICBwTGlzdC0+Y29va2llID0gVk9TX0xJU1RfQ09PS0lFOworCisgICByZXR1cm4oIFZPU19TVEFUVVNfU1VDQ0VTUyApOworfQorCisKK1ZPU19TVEFUVVMgdm9zX2xpc3RfZGVzdHJveSggdm9zX2xpc3RfdCAqcExpc3QgKQoreworICAgaW50IHJjOworICAgaWYgKHBMaXN0ID09IE5VTEwpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBOVUxMIHBvaW50ZXIgcGFzc2VkIGluIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIGlmICggcExpc3QtPmNvb2tpZSAhPSBWT1NfTElTVF9DT09LSUUgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogbGlzdCBub3QgaW5pdGlhbGl6ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgcmMgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnBMaXN0LT5sb2NrKTsKKyAgIGlmIChyYykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IHVuYWJsZSB0byBsb2NrIGxpc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgaWYgKCBwTGlzdC0+Y291bnQgIT0wICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3QgbGVuZ3RoIG5vdCBlcXVhbCB0byB6ZXJvIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIG11dGV4X3VubG9jaygmcExpc3QtPmxvY2spOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9CVVNZOworICAgfQorCisgICAvLyBjbGVhciB0aGUgY29va2llLiBUaGlzIGluZGljYXRlcyB0aGUgbGlzdCBpcyBkZXN0cm95ZWQuCisgICBwTGlzdC0+Y29va2llID0gMDsKKyAgIG11dGV4X3VubG9jaygmcExpc3QtPmxvY2spOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKK1ZPU19TVEFUVVMgdm9zX2xpc3RfaW5zZXJ0X2Zyb250KCB2b3NfbGlzdF90ICpwTGlzdCwgdm9zX2xpc3Rfbm9kZV90ICpwTm9kZSApCit7CisgICBpbnQgcmM7CisKKyAgIGlmICggKCBwTGlzdCA9PSBOVUxMKSB8fCAoIHBOb2RlID09IE5VTEwpICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IE5VTEwgcG9pbnRlciBwYXNzZWQgaW4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgaWYgKCBwTGlzdC0+Y29va2llICE9IFZPU19MSVNUX0NPT0tJRSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBsaXN0IG5vdCBpbml0aWFsaXplZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICByYyA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcExpc3QtPmxvY2spOworICAgaWYgKHJjKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogdW5hYmxlIHRvIGxvY2sgbGlzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBsaXN0X2FkZCggcE5vZGUsICZwTGlzdC0+YW5jaG9yICk7CisKKyAgIHBMaXN0LT5jb3VudCsrOworICAgbXV0ZXhfdW5sb2NrKCZwTGlzdC0+bG9jayk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK1ZPU19TVEFUVVMgdm9zX2xpc3RfaW5zZXJ0X2JhY2soIHZvc19saXN0X3QgKnBMaXN0LCB2b3NfbGlzdF9ub2RlX3QgKnBOb2RlICkKK3sKKyAgIGludCByYzsKKworICAgaWYgKCAoIHBMaXN0ID09IE5VTEwpIHx8ICggcE5vZGUgPT0gTlVMTCkgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIHBMaXN0LT5jb29raWUgIT0gVk9TX0xJU1RfQ09PS0lFICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3Qgbm90IGluaXRpYWxpemVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwTGlzdC0+bG9jayk7CisgICBpZiAocmMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gbG9jayBsaXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIGxpc3RfYWRkX3RhaWwoIHBOb2RlLCAmcExpc3QtPmFuY2hvciApOworCisgICBwTGlzdC0+Y291bnQrKzsKKyAgIG11dGV4X3VubG9jaygmcExpc3QtPmxvY2spOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKK1ZPU19TVEFUVVMgdm9zX2xpc3RfaW5zZXJ0X2JhY2tfc2l6ZSggdm9zX2xpc3RfdCAqcExpc3QsIHZvc19saXN0X25vZGVfdCAqcE5vZGUsIHZfU0laRV90ICpwU2l6ZSApCit7CisgICBpbnQgcmM7CisgICBpZiAoICggcExpc3QgPT0gTlVMTCkgfHwgKCBwTm9kZSA9PSBOVUxMKSB8fCAocFNpemUgPT0gTlVMTCkgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIHBMaXN0LT5jb29raWUgIT0gVk9TX0xJU1RfQ09PS0lFICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3Qgbm90IGluaXRpYWxpemVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwTGlzdC0+bG9jayk7CisgICBpZiAocmMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gbG9jayBsaXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIGxpc3RfYWRkX3RhaWwoIHBOb2RlLCAmcExpc3QtPmFuY2hvciApOworCisgICBwTGlzdC0+Y291bnQrKzsKKyAgICpwU2l6ZSA9IHBMaXN0LT5jb3VudDsKKyAgIG11dGV4X3VubG9jaygmcExpc3QtPmxvY2spOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKK1ZPU19TVEFUVVMgdm9zX2xpc3RfcmVtb3ZlX2Zyb250KCB2b3NfbGlzdF90ICpwTGlzdCwgdm9zX2xpc3Rfbm9kZV90ICoqcHBOb2RlICkKK3sKKyAgIHN0cnVjdCBsaXN0X2hlYWQgKiBsaXN0cHRyOworICAgaW50IHJjOworCisgICAvLyB0aGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgcExpc3QgaXMgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKGR1bW15CisgICAvLyBub2RlKSBhbmQgcG9pbnRzIHRvIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnQgaW4gY2lyY3VsYXIgbGlua2VkIGxpc3QKKyAgIGlmICggKCBwTGlzdCA9PSBOVUxMICkgfHwgKCBwcE5vZGUgPT0gTlVMTCkgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIHBMaXN0LT5jb29raWUgIT0gVk9TX0xJU1RfQ09PS0lFICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3Qgbm90IGluaXRpYWxpemVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwTGlzdC0+bG9jayk7CisgICBpZiAocmMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gbG9jayBsaXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIGlmICggbGlzdF9lbXB0eSggJnBMaXN0LT5hbmNob3IgKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3QgZW1wdHkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgbXV0ZXhfdW5sb2NrKCZwTGlzdC0+bG9jayk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VNUFRZOworICAgfQorCisgICBsaXN0cHRyID0gcExpc3QtPmFuY2hvci5uZXh0OworCisgICAqcHBOb2RlID0gbGlzdHB0cjsKKworICAgbGlzdF9kZWwocExpc3QtPmFuY2hvci5uZXh0KTsKKworICAgcExpc3QtPmNvdW50LS07CisgICBtdXRleF91bmxvY2soJnBMaXN0LT5sb2NrKTsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworCitWT1NfU1RBVFVTIHZvc19saXN0X3JlbW92ZV9iYWNrKCB2b3NfbGlzdF90ICpwTGlzdCwgdm9zX2xpc3Rfbm9kZV90ICoqcHBOb2RlICkKK3sKKyAgIHN0cnVjdCBsaXN0X2hlYWQgKiBsaXN0cHRyOworICAgaW50IHJjOworCisgICAvLyB0aGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgcExpc3QgaXMgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKGR1bW15IG5vZGUpIGFuZCBwb2ludHMgdG8gZmlyc3QgYW5kCisgICAvLyBsYXN0IGVsZW1lbnQgaW4gY2lyY3VsYXIgbGlua2VkIGxpc3QKKyAgIGlmICggKCBwTGlzdCA9PSBOVUxMICkgfHwgKCBwcE5vZGUgPT0gTlVMTCkgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIHBMaXN0LT5jb29raWUgIT0gVk9TX0xJU1RfQ09PS0lFICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3Qgbm90IGluaXRpYWxpemVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwTGlzdC0+bG9jayk7CisgICBpZiAocmMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gbG9jayBsaXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIGlmICggbGlzdF9lbXB0eSggJnBMaXN0LT5hbmNob3IgKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3QgZW1wdHkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgbXV0ZXhfdW5sb2NrKCZwTGlzdC0+bG9jayk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VNUFRZOworICAgfQorCisgICBsaXN0cHRyID0gcExpc3QtPmFuY2hvci5wcmV2OworCisgICAqcHBOb2RlID0gbGlzdHB0cjsKKworICAgbGlzdF9kZWwocExpc3QtPmFuY2hvci5wcmV2KTsKKworICAgcExpc3QtPmNvdW50LS07CisgICBtdXRleF91bmxvY2soJnBMaXN0LT5sb2NrKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworVk9TX1NUQVRVUyB2b3NfbGlzdF9zaXplKCB2b3NfbGlzdF90ICpwTGlzdCwgdl9TSVpFX3QgKnBTaXplICkKK3sKKyAgIGludCByYzsKKyAgIGlmICggKCBwTGlzdCA9PU5VTEwpIHx8ICggcFNpemUgPT0gTlVMTCkgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIHBMaXN0LT5jb29raWUgIT0gVk9TX0xJU1RfQ09PS0lFICkKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogbGlzdCBub3QgaW5pdGlhbGl6ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwTGlzdC0+bG9jayk7CisgICBpZiAocmMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gbG9jayBsaXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgICpwU2l6ZSA9IHBMaXN0LT5jb3VudDsKKyAgIG11dGV4X3VubG9jaygmcExpc3QtPmxvY2spOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbGlzdF9wZWVrX2Zyb250KCkgLSBwZWVrIGF0IHRoZSBub2RlIGF0IGZyb250IG9mIGEgbGlua2VkIGxpc3QKKworICBUaGUgdm9zX2xpc3RfcGVla19mcm9udCgpIEFQSSB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5vZGUgYXQgdGhlCisgIGZyb250IG9mIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgdk9TIExpc3Qgb2JqZWN0LiAgVGhlIG5vZGUgd2lsbCAqbm90KiBiZQorICByZW1vdmVkIGZyb20gdGhlIGxpc3QuCisKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCBvZiB0aGUgbGlzdCB0byBiZSAncGVla2VkJworCisgIFxwYXJhbSBwcE5vZGUgLSBQb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHRoYXQgZXhpc3RzIGF0CisgIHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgbm9kZSBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3Qgd2FzCisgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIFRoZSBzcGVjaWZpZWQgaXMgZW1wdHkgc28gbm9kZXMgY2Fubm90IGJlCisgICAgICAgICAgcmVtb3ZlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBwTGlzdCBvciBvciBwcE5vZGUgaXMgYW4gaW52YWxpZCBwb2ludGVyLgorCisgIFxzYSB2b3NfbGlzdF9yZW1vdmVfYmFjaygpCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWT1NfU1RBVFVTIHZvc19saXN0X3BlZWtfZnJvbnQoIHZvc19saXN0X3QgKnBMaXN0LCB2b3NfbGlzdF9ub2RlX3QgKipwcE5vZGUgKQoreworICAgc3RydWN0IGxpc3RfaGVhZCAqIGxpc3RwdHI7CisgICBpbnQgcmM7CisKKyAgIGlmICggKCBwTGlzdCA9PSBOVUxMKSB8fCAoIHBwTm9kZSA9PSBOVUxMKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBOVUxMIHBvaW50ZXIgcGFzc2VkIGluIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIGlmICggcExpc3QtPmNvb2tpZSAhPSBWT1NfTElTVF9DT09LSUUgKQorICAgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBsaXN0IG5vdCBpbml0aWFsaXplZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgcmMgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnBMaXN0LT5sb2NrKTsKKyAgIGlmIChyYykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IHVuYWJsZSB0byBsb2NrIGxpc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgaWYgKCBsaXN0X2VtcHR5KCZwTGlzdC0+YW5jaG9yKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3QgZW1wdHkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgbXV0ZXhfdW5sb2NrKCZwTGlzdC0+bG9jayk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VNUFRZOworICAgfQorICAgbGlzdHB0ciA9IHBMaXN0LT5hbmNob3IubmV4dDsKKyAgICpwcE5vZGUgPSBsaXN0cHRyOworICAgbXV0ZXhfdW5sb2NrKCZwTGlzdC0+bG9jayk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbGlzdF9wZWVrX2JhY2soKSAtIHBlZWsgYXQgdGhlIG5vZGUgYXQgYmFjayBvZiBhIGxpbmtlZCBsaXN0CisKKyAgVGhlIHZvc19saXN0X3BlZWtfYmFjaygpIEFQSSB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5vZGUgYXQgdGhlCisgIGJhY2sgb2YgYSBwcm9wZXJseSBpbml0aWFsaXplZCB2T1MgTGlzdCBvYmplY3QuICBUaGUgbm9kZSB3aWxsICpub3QqIGJlCisgIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KKworICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IG9mIHRoZSBsaXN0IHRvIGJlICdwZWVrZWQnCisKKyAgXHBhcmFtIHBwTm9kZSAtIFBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSBsaXN0IG5vZGUgdGhhdCBleGlzdHMgYXQKKyAgdGhlIGJhY2sgb2YgdGhlIGxpc3QuCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgYXQgdGhlIGJhY2sgb2YgdGhlIGxpc3Qgd2FzCisgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIFRoZSBzcGVjaWZpZWQgaXMgZW1wdHkgc28gbm9kZXMgY2Fubm90IGJlCisgICAgICAgICAgcmVtb3ZlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBwTGlzdCBvciBvciBwcE5vZGUgaXMgYW4gaW52YWxpZCBwb2ludGVyLgorCisgIFxzYSB2b3NfbGlzdF9wZWVrX2JhY2soKSwgdm9zX2xpc3RfcmVtb3ZlX2JhY2soKSwgdm9zX2xpc3RfcGVla19mcm9udCgpLAorICAgICAgdm9zX2xpc3RfcmVtb3ZlX2Zyb250KCkKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZPU19TVEFUVVMgdm9zX2xpc3RfcGVla19iYWNrKCB2b3NfbGlzdF90ICpwTGlzdCwgdm9zX2xpc3Rfbm9kZV90ICoqcHBOb2RlICkKK3sKKyAgIHN0cnVjdCBsaXN0X2hlYWQgKiBsaXN0cHRyOworICAgaW50IHJjOworCisgICBpZiAoICggcExpc3QgPT0gTlVMTCkgfHwgKCBwcE5vZGUgPT0gTlVMTCkgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIHBMaXN0LT5jb29raWUgIT0gVk9TX0xJU1RfQ09PS0lFICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3Qgbm90IGluaXRpYWxpemVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwTGlzdC0+bG9jayk7CisgICBpZiAocmMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gbG9jayBsaXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIGlmICggbGlzdF9lbXB0eSgmcExpc3QtPmFuY2hvcikgKQorICAgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IGxpc3QgZW1wdHkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgIG11dGV4X3VubG9jaygmcExpc3QtPmxvY2spOworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRU1QVFk7CisgICB9CisgICBsaXN0cHRyID0gcExpc3QtPmFuY2hvci5wcmV2OworICAgKnBwTm9kZSA9IGxpc3RwdHI7CisgICBtdXRleF91bmxvY2soJnBMaXN0LT5sb2NrKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19saXN0X3BlZWtfbmV4dCgpIC0gcGVlayBhdCB0aGUgbm9kZSBhZnRlciB0aGUgc3BlY2lmaWVkIG5vZGUKKworICBUaGUgdm9zX2xpc3RfcGVla19uZXh0KCkgQVBJIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbm9kZSBmb2xsb3dpbmcgdGhlCisgIHNwZWNpZmllZCBub2RlIG9uIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgdk9TIExpc3Qgb2JqZWN0LiAgVGhlIG5vZGUgd2lsbAorICAqbm90KiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuCisKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCBvZiB0aGUgbGlzdCB0byBiZSAncGVla2VkJworCisgIFxwYXJhbSBwTm9kZSAtIFBvaW50ZXIgdG8gdGhlIG5vZGUgdGhhdCBpcyBiZWluZyAncGVla2VkJworCisgIFxwYXJhbSBwcE5vZGUgLSBQb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHRoYXQgZm9sbG93cyB0aGUKKyAgICAgICAgIHBOb2RlIG5vZGUgb24gdGhlIGxpc3QuCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgZm9sbG93aW5nIHBOb2RlIG9uIHRoZSBwcm9wZXJseQorICAgICAgICAgIGluaXRpYWxpemVkIGxpc3QgaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIFRoZXJlIGlzIG5vICduZXh0JyBub2RlICh0aGUgaW5wdXQgbm9kZSBpcworICAgICAgICAgIGF0IHRoZSBiYWNrIG9mIHRoZSBsaXN0KS4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBwTGlzdCwgcE5vZGUgb3IgcHBOb2RlIGlzIGFuIGludmFsaWQgcG9pbnRlci4KKworICBcc2Egdm9zX2xpc3RfcmVtb3ZlX2JhY2soKQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVk9TX1NUQVRVUyB2b3NfbGlzdF9wZWVrX25leHQoIHZvc19saXN0X3QgKnBMaXN0LCB2b3NfbGlzdF9ub2RlX3QgKnBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19saXN0X25vZGVfdCAqKnBwTm9kZSApCit7CisgICBzdHJ1Y3QgbGlzdF9oZWFkICogbGlzdHB0cjsKKyAgIGludCByYywgZm91bmQgPSAwOworICAgdm9zX2xpc3Rfbm9kZV90ICp0bXA7CisKKyAgIGlmICggKCBwTGlzdCA9PSBOVUxMKSB8fCAoIHBOb2RlID09IE5VTEwpIHx8IChwcE5vZGUgPT0gTlVMTCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBOVUxMIHBvaW50ZXIgcGFzc2VkIGluIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIGlmICggcExpc3QtPmNvb2tpZSAhPSBWT1NfTElTVF9DT09LSUUgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogbGlzdCBub3QgaW5pdGlhbGl6ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgcmMgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnBMaXN0LT5sb2NrKTsKKyAgIGlmIChyYykKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IHVuYWJsZSB0byBsb2NrIGxpc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgaWYgKCBsaXN0X2VtcHR5KCZwTGlzdC0+YW5jaG9yKSApCisgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICIlczogbGlzdCBlbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgbXV0ZXhfdW5sb2NrKCZwTGlzdC0+bG9jayk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgIH0KKworICAgLy8gdmVyaWZ5IHRoYXQgcE5vZGUgaXMgaW5kZWVkIHBhcnQgb2YgbGlzdCBwTGlzdAorICAgbGlzdF9mb3JfZWFjaCh0bXAsICZwTGlzdC0+YW5jaG9yKQorICAgeworICAgICAgaWYgKHRtcCA9PSBwTm9kZSkKKyAgICAgIHsKKyAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorICAgaWYgKGZvdW5kID09IDApCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworCisgICBsaXN0cHRyID0gcE5vZGUtPm5leHQ7CisgICBpZiAobGlzdHB0ciA9PSAmcExpc3QtPmFuY2hvcikKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICIlczogbGlzdCBlbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBtdXRleF91bmxvY2soJnBMaXN0LT5sb2NrKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRU1QVFk7CisgICB9CisKKyAgICpwcE5vZGUgPSAgbGlzdHB0cjsKKyAgIG11dGV4X3VubG9jaygmcExpc3QtPmxvY2spOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX2xpc3RfcGVla19wcmV2KCkgLSBwZWVrIGF0IHRoZSBub2RlIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG5vZGUKKworICBUaGUgdm9zX2xpc3RfcGVla19wcmV2KCkgQVBJIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbm9kZSBiZWZvcmUgdGhlCisgIHNwZWNpZmllZCBub2RlIG9uIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgdk9TIExpc3Qgb2JqZWN0LiAgVGhlIG5vZGUgd2lsbAorICAqbm90KiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuCisKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCBvZiB0aGUgbGlzdCB0byBiZSAncGVla2VkJworCisgIFxwYXJhbSBwTm9kZSAtIFBvaW50ZXIgdG8gdGhlIG5vZGUgdGhhdCBpcyBiZWluZyAncGVla2VkJworCisgIFxwYXJhbSBwcE5vZGUgLSBQb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgbGlzdCBub2RlIGJlZm9yZSB0aGUKKyAgcE5vZGUgbm9kZSBvbiB0aGUgbGlzdC4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgbm9kZSBiZWZvcmUgcE5vZGUgb24gdGhlIHByb3Blcmx5CisgICAgICAgICAgaW5pdGlhbGl6ZWQgbGlzdCBpcyBzdWNjZXNzZnVsbHkgcmV0dXJuZWQuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHBMaXN0IGlzIG5vdCBhIHZhbGlkLAorICAgICAgICAgIGluaXRpYWxpemVkIGxpc3Qgb2JqZWN0LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0VNUFRZIC0gVGhlcmUgaXMgbm8gJ3ByZXZpb3VzJyBub2RlICh0aGUgaW5wdXQgbm9kZSBpcworICAgICAgICAgIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdCkuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gcExpc3QsIHBOb2RlIG9yIHBwTm9kZSBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuCisKKyAgXHNhIHZvc19saXN0X3JlbW92ZV9iYWNrKCkKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZPU19TVEFUVVMgdm9zX2xpc3RfcGVla19wcmV2KCB2b3NfbGlzdF90ICpwTGlzdCwgdm9zX2xpc3Rfbm9kZV90ICpwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfbGlzdF9ub2RlX3QgKipwcE5vZGUgKQoreworICAgc3RydWN0IGxpc3RfaGVhZCAqIGxpc3RwdHI7CisgICBpbnQgcmMsIGZvdW5kID0gMDsKKyAgIHZvc19saXN0X25vZGVfdCAqdG1wOworCisgICBpZiAoICggcExpc3QgPT0gTlVMTCkgfHwgKCBwTm9kZSA9PSBOVUxMKSB8fCAocHBOb2RlID09IE5VTEwpICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IE5VTEwgcG9pbnRlciBwYXNzZWQgaW4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgaWYgKCBwTGlzdC0+Y29va2llICE9IFZPU19MSVNUX0NPT0tJRSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBsaXN0IG5vdCBpbml0aWFsaXplZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICByYyA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcExpc3QtPmxvY2spOworICAgaWYgKHJjKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogdW5hYmxlIHRvIGxvY2sgbGlzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIGxpc3RfZW1wdHkoJnBMaXN0LT5hbmNob3IpICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICIlczogbGlzdCBlbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBtdXRleF91bmxvY2soJnBMaXN0LT5sb2NrKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRU1QVFk7CisgICB9CisKKyAgIC8vIHZlcmlmeSB0aGF0IHBOb2RlIGlzIGluZGVlZCBwYXJ0IG9mIGxpc3QgcExpc3QKKyAgIGxpc3RfZm9yX2VhY2godG1wLCAmcExpc3QtPmFuY2hvcikKKyAgIHsKKyAgICAgIGlmICh0bXAgPT0gcE5vZGUpCisgICAgICB7CisgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKyAgIGlmIChmb3VuZCA9PSAwKQorICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKworICAgbGlzdHB0ciA9IHBOb2RlLT5wcmV2OworCisgICBpZiAobGlzdHB0ciA9PSAmcExpc3QtPmFuY2hvcikKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICIlczogbGlzdCBlbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBtdXRleF91bmxvY2soJnBMaXN0LT5sb2NrKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRU1QVFk7CisgICB9CisKKyAgICpwcE5vZGUgPSBsaXN0cHRyOworICAgbXV0ZXhfdW5sb2NrKCZwTGlzdC0+bG9jayk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbGlzdF9pbnNlcnRfYmVmb3JlKCkgLSBpbnNlcnQgbm9kZSBhdCBmcm9udCBvZiBhIHNwZWNpZmllZAorICBsaXN0IG5vZGUKKworICBUaGUgdm9zX2xpc3RfaW5zZXJ0X2JlZm9yZSgpIEFQSSB3aWxsIGluc2VydCBhIG5vZGUgb250byBhIHByb3Blcmx5CisgIGluaXRpYWxpemVkIHZPUyBMaXN0IG9iamVjdCBpbiBmcm9udCBvZiB0aGUgc3BlY2lmaWVkIGxpc3Qgbm9kZS4KKworICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IHdoZXJlIHRoZSBub2RlIHdpbGwgYmUgaW5zZXJ0ZWQKKworICBccGFyYW0gcE5vZGVUb0luc2VydCAtIFBvaW50ZXIgdG8gdGhlIGxpc3Qgbm9kZSB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0LgorCisgIFxwYXJhbSBwTm9kZSAtIFBvaW50ZXIgdG8gdGhlIGxpc3Qgbm9kZSB3aGVyZSBwTm9kZVRvSW5zZXJ0IHdpbGwgYmUgaW5zZXJ0ZWQKKyAgaW4gZnJvbnQgb2YuCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgd2FzIHN1Y2Nlc3NmdWxseSBpbnNlcnRlZCBvbnRvCisgICAgICAgICAgdGhlIGZyb250IG9mIHRoZSBsaXN0LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBwTGlzdCwgcE5vZGVUb0luc2VydCwgb3IgcE5vZGUgYXJlCisgICAgICAgICAgaW52YWxpZCBwb2ludGVyKHMpCisKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbGlzdF9pbnNlcnRfYmVmb3JlKCB2b3NfbGlzdF90ICpwTGlzdCwgdm9zX2xpc3Rfbm9kZV90ICpwTm9kZVRvSW5zZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfbGlzdF9ub2RlX3QgKnBOb2RlICkKK3sKKyAgIGludCByYywgZm91bmQgPSAwOworICAgdm9zX2xpc3Rfbm9kZV90ICp0bXA7CisKKyAgIGlmICggKCBwTGlzdCA9PSBOVUxMKSB8fCAoIHBOb2RlID09IE5VTEwpIHx8IChwTm9kZVRvSW5zZXJ0ID09IE5VTEwpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIHBMaXN0LT5jb29raWUgIT0gVk9TX0xJU1RfQ09PS0lFICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBsaXN0IG5vdCBpbml0aWFsaXplZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICByYyA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcExpc3QtPmxvY2spOworICAgaWYgKHJjKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogdW5hYmxlIHRvIGxvY2sgbGlzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIGxpc3RfZW1wdHkoJnBMaXN0LT5hbmNob3IpICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBsaXN0IGVtcHR5IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIG11dGV4X3VubG9jaygmcExpc3QtPmxvY2spOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgIH0KKworICAgLy8gdmVyaWZ5IHRoYXQgcE5vZGUgaXMgaW5kZWVkIHBhcnQgb2YgbGlzdCBwTGlzdAorICAgbGlzdF9mb3JfZWFjaCh0bXAsICZwTGlzdC0+YW5jaG9yKQorICAgeworICAgICAgaWYgKHRtcCA9PSBwTm9kZSkKKyAgICAgIHsKKyAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorICAgaWYgKGZvdW5kID09IDApCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworCisgICBsaXN0X2FkZChwTm9kZVRvSW5zZXJ0LCBwTm9kZSk7CisgICBwTGlzdC0+Y291bnQrKzsKKyAgIG11dGV4X3VubG9jaygmcExpc3QtPmxvY2spOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbGlzdF9pbnNlcnRfYWZ0ZXIoKSAtIGluc2VydCBub2RlIGJlaGluZCBhIHNwZWNpZmllZCBsaXN0IG5vZGUKKworICBUaGUgdm9zX2xpc3RfaW5zZXJ0X2FmdGVyKCkgQVBJIHdpbGwgaW5zZXJ0IGEgbm9kZSBvbnRvIGEgcHJvcGVybHkKKyAgaW5pdGlhbGl6ZWQgdk9TIExpc3Qgb2JqZWN0IGFmdGVyIHRoZSBzcGVjaWZpZWQgbGlzdCBub2RlLgorCisgIFxwYXJhbSBwTGlzdCAtIFBvaW50ZXIgdG8gbGlzdCBvYmplY3Qgd2hlcmUgdGhlIG5vZGUgd2lsbCBiZSBpbnNlcnRlZAorCisgIFxwYXJhbSBwTm9kZVRvSW5zZXJ0IC0gUG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGxpc3QuCisKKyAgXHBhcmFtIHBOb2RlIC0gUG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHdoZXJlIHBOb2RlVG9JbnNlcnQgd2lsbCBiZSBpbnNlcnRlZAorICBhZnRlci4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgbm9kZSB3YXMgc3VjY2Vzc2Z1bGx5IGluc2VydGVkIG9udG8KKyAgICAgICAgICB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHBMaXN0IGlzIG5vdCBhIHZhbGlkLAorICAgICAgICAgIGluaXRpYWxpemVkIGxpc3Qgb2JqZWN0LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0LCBwTm9kZVRvSW5zZXJ0LCBvciBwTm9kZSBhcmUKKyAgICAgICAgICBpbnZhbGlkIHBvaW50ZXIocykKKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19saXN0X2luc2VydF9hZnRlciggdm9zX2xpc3RfdCAqcExpc3QsIHZvc19saXN0X25vZGVfdCAqcE5vZGVUb0luc2VydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NfbGlzdF9ub2RlX3QgKnBOb2RlICkKK3sKKyAgIGludCByYywgZm91bmQgPSAwOworICAgdm9zX2xpc3Rfbm9kZV90ICp0bXA7CisKKyAgIGlmICggKCBwTGlzdCA9PSBOVUxMKSB8fCAoIHBOb2RlID09IE5VTEwpIHx8IChwTm9kZVRvSW5zZXJ0ID09IE5VTEwpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIHBMaXN0LT5jb29raWUgIT0gVk9TX0xJU1RfQ09PS0lFICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3Qgbm90IGluaXRpYWxpemVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwTGlzdC0+bG9jayk7CisgICBpZiAocmMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gbG9jayBsaXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKworICAgaWYgKCBsaXN0X2VtcHR5KCZwTGlzdC0+YW5jaG9yKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBsaXN0IGVtcHR5IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIG11dGV4X3VubG9jaygmcExpc3QtPmxvY2spOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgIH0KKworICAgLy8gdmVyaWZ5IHRoYXQgcE5vZGUgaXMgaW5kZWVkIHBhcnQgb2YgbGlzdCBwTGlzdAorICAgbGlzdF9mb3JfZWFjaCh0bXAsICZwTGlzdC0+YW5jaG9yKQorICAgeworICAgICAgaWYgKHRtcCA9PSBwTm9kZSkKKyAgICAgIHsKKyAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgfQorICAgaWYgKGZvdW5kID09IDApCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworCisgICBsaXN0X2FkZF90YWlsKHBOb2RlVG9JbnNlcnQsIHBOb2RlKTsKKyAgIHBMaXN0LT5jb3VudCsrOworICAgbXV0ZXhfdW5sb2NrKCZwTGlzdC0+bG9jayk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfbGlzdF9yZW1vdmVfbm9kZSgpIC0gcmVtb3ZlIHNwZWNpZmllZCBub2RlIGZyb20gdk9TIGxpc3QgbGlzdAorCisgIFRoZSB2b3NfbGlzdF9yZW1vdmVfbm9kZSgpIEFQSSB3aWxsIHJlbW92ZSBhIHNwZWNpZmllZCBub2RlIGZyb20gdGhlCisgIHByb3Blcmx5IGluaXRpYWxpemVkIHZPUyBMaXN0IG9iamVjdC4KKworICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IHdoZXJlIHRoZSBub2RlIHdpbGwgYmUgcmVtb3ZlZAorCisgIFxwYXJhbSBwcE5vZGUgLSBQb2ludGVyIHRvIHRoZSBub2RlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgbm9kZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbQorICAgICAgICAgIHRoZSBsaXN0LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9FTVBUWSAtIFRoZSBzcGVjaWZpZWQgaXMgZW1wdHkgc28gbm9kZXMgY2Fubm90IGJlCisgICAgICAgICAgcmVtb3ZlZC4KKworCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBMaXN0IG9yIHBOb2RlVG9SZW1vdmUgaXMgbm90IGEgdmFsaWQgcG9pbnRlcgorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2xpc3RfcmVtb3ZlX25vZGUoIHZvc19saXN0X3QgKnBMaXN0LCB2b3NfbGlzdF9ub2RlX3QgKnBOb2RlVG9SZW1vdmUgKQoreworICAgaW50IHJjLCBmb3VuZCA9IDA7CisgICB2b3NfbGlzdF9ub2RlX3QgKnRtcDsKKworICAgaWYgKCAoIHBMaXN0ID09IE5VTEwgKSB8fCAoIHBOb2RlVG9SZW1vdmUgPT0gTlVMTCkgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICBpZiAoIHBMaXN0LT5jb29raWUgIT0gVk9TX0xJU1RfQ09PS0lFICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGxpc3Qgbm90IGluaXRpYWxpemVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwTGlzdC0+bG9jayk7CisgICBpZiAocmMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gbG9jayBsaXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIGlmICggbGlzdF9lbXB0eSgmcExpc3QtPmFuY2hvcikgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogbGlzdCBlbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBtdXRleF91bmxvY2soJnBMaXN0LT5sb2NrKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRU1QVFk7CisgICB9CisKKyAgIC8vIHZlcmlmeSB0aGF0IHBOb2RlVG9SZW1vdmUgaXMgaW5kZWVkIHBhcnQgb2YgbGlzdCBwTGlzdAorICAgbGlzdF9mb3JfZWFjaCh0bXAsICZwTGlzdC0+YW5jaG9yKQorICAgeworICAgICAgaWYgKHRtcCA9PSBwTm9kZVRvUmVtb3ZlKQorICAgICAgeworICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICB9CisgICBpZiAoZm91bmQgPT0gMCkKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisKKyAgIGxpc3RfZGVsKHBOb2RlVG9SZW1vdmUpOworICAgcExpc3QtPmNvdW50LS07CisgICBtdXRleF91bmxvY2soJnBMaXN0LT5sb2NrKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9zcmMvdm9zX2xvY2suYyBiL0NPUkUvVk9TUy9zcmMvdm9zX2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzdlZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL3NyYy92b3NfbG9jay5jCkBAIC0wLDAgKzEsNDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZJTEU6ICAgICAgICAgdm9zX2xvY2suYworCisgIE9WRVJWSUVXOiAgICAgVGhpcyBzb3VyY2UgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3Igdk9TIGxvY2sgQVBJcworICAgICAgICAgICAgICAgIFRoZSBmb3VyIEFQSXMgbWVudGlvbmVkIGluIHRoaXMgZmlsZSBhcmUgdXNlZCBmb3IgCisgICAgICAgICAgICAgICAgaW5pdGlhbGl6aW5nICwgYWNxdWlyaW5nLCByZWxlYXNpbmcgYW5kIGRlc3Ryb3lpbmcgYSBsb2NrLgorICAgICAgICAgICAgICAgIHRoZSBsb2NrIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBjcml0aWNhbCBzZWN0aW9ucworCisgIERFUEVOREVOQ0lFUzogCisgCisgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAgICAgICAgICAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRURJVCBISVNUT1JZIEZPUiBNT0RVTEUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJ2b3NfbG9jay5oIgorI2luY2x1ZGUgInZvc19tZW1vcnkuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTElOVVhfTE9DS19DT09LSUUgMHgxMjM0NTY3OAorZW51bQoreworICAgTE9DS19SRUxFQVNFRCA9IDB4MTEyMjMzNDQsCisgICBMT0NLX0FDUVVJUkVELAorICAgTE9DS19ERVNUUk9ZRUQKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRnVuY3Rpb24gRGVmaW5pdGlvbnMgYW5kIERvY3VtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2xvY2tfaW5pdCgpIC0gaW5pdGlhbGl6ZXMgYSB2T1NTIGxvY2sKKyAgCisgIFRoZSB2b3NfbG9ja19pbml0KCkgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHNwZWNpZmllZCBsb2NrLiBVcG9uIAorICBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLCB0aGUgc3RhdGUgb2YgdGhlIGxvY2sgYmVjb21lcyBpbml0aWFsaXplZCAKKyAgYW5kIHVubG9ja2VkLgorCisgIEEgbG9jayBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgdm9zX2xvY2tfaW5pdCgpIGJlZm9yZSBpdCAKKyAgbWF5IGJlIHVzZWQgaW4gYW55IG90aGVyIGxvY2sgZnVuY3Rpb25zLiAKKyAgCisgIEF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSBhbiBhbHJlYWR5IGluaXRpYWxpemVkIGxvY2sgcmVzdWx0cyBpbiAKKyAgYSBmYWlsdXJlLgorIAorICBccGFyYW0gbG9jayAtIHBvaW50ZXIgdG8gdGhlIG9wYXF1ZSBsb2NrIG9iamVjdCB0byBpbml0aWFsaXplCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxvY2sgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQgCisgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9OT01FTSAtIGluc3VmZmljaWVudCBtZW1vcnkgZXhpc3RzIHRvIGluaXRpYWxpemUgCisgICAgICAgICAgdGhlIGxvY2sKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9CVVNZIC0gVGhlIGltcGxlbWVudGF0aW9uIGhhcyBkZXRlY3RlZCBhbiBhdHRlbXB0IAorICAgICAgICAgIHRvIHJlaW5pdGlhbGl6ZSB0aGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgbG9jaywgYSBwcmV2aW91c2x5IAorICAgICAgICAgIGluaXRpYWxpemVkLCBidXQgbm90IHlldCBkZXN0cm95ZWQsIGxvY2suCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gbG9jayBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIGl0IGZhaWxzIGR1ZSB0byAKKyAgICAgICAgICB1bmtub3duIHJlYXNvbnMKKworICAgICAgICoqKlZPU19TVEFUVVNfRV9SRVNPVVJDRVMgLSBTeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkgCisgICAgICAgICAgYXJlIHVuYXZhaWxhYmxlIHRvIGluaXRpbGl6ZSB0aGUgbG9jaworICBcc2EKKyAgIAorICAgICggKioqIHJldHVybiB2YWx1ZSBub3QgY29uc2lkZXJlZCB5ZXQgKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19sb2NrX2luaXQgKCB2b3NfbG9ja190ICpsb2NrICkKK3sKKworICAgLy9jaGVjayBmb3IgaW52YWxpZCBwb2ludGVyCisgICBpZiAoIGxvY2sgPT0gTlVMTCkKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCBpbiIsX19GVU5DVElPTl9fKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOyAKKyAgIH0KKyAgIC8vIGNoZWNrIGZvciAnYWxyZWFkeSBpbml0aWFsaXplZCcgbG9jaworICAgaWYgKCBMSU5VWF9MT0NLX0NPT0tJRSA9PSBsb2NrLT5jb29raWUgKQorICAgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBhbHJlYWR5IGluaXRpYWxpemVkIGxvY2siLF9fRlVOQ1RJT05fXyk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9CVVNZOworICAgfQorICAgICAgCisgICBpZiAoaW5faW50ZXJydXB0KCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQhISEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsgCisgICB9CisgICAgICAKKyAgIC8vIGluaXRpYWxpemUgbmV3IGxvY2sgCisgICBtdXRleF9pbml0KCAmbG9jay0+bV9sb2NrICk7IAorICAgbG9jay0+Y29va2llID0gTElOVVhfTE9DS19DT09LSUU7CisgICBsb2NrLT5zdGF0ZSAgPSBMT0NLX1JFTEVBU0VEOworICAgbG9jay0+cHJvY2Vzc0lEID0gMDsKKyAgIGxvY2stPnJlZmNvdW50ID0gMDsKKyAgICAgIAorICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19sb2NrX2FjcXVpcmUoKSAtIGFjcXVpcmVzIGEgbG9jaworCisgIEEgbG9jayBvYmplY3QgaXMgYWNxdWlyZWQgYnkgY2FsbGluZyBcYSB2b3NfbG9ja19hY3F1aXJlKCkuICBJZiB0aGUgbG9jayAKKyAgaXMgYWxyZWFkeSBsb2NrZWQsIHRoZSBjYWxsaW5nIHRocmVhZCBzaGFsbCBibG9jayAgIHVudGlsIHRoZSBsb2NrIGJlY29tZXMgCisgIGF2YWlsYWJsZS4gVGhpcyBvcGVyYXRpb24gc2hhbGwgcmV0dXJuIHdpdGggdGhlIGxvY2sgb2JqZWN0IHJlZmVyZW5jZWQgYnkgCisgIGxvY2sgaW4gdGhlIGxvY2tlZCBzdGF0ZSB3aXRoIHRoZSBjYWxsaW5nIHRocmVhZCBhcyBpdHMgb3duZXIuIAorICAKKyAgXHBhcmFtIGxvY2sgLSB0aGUgbG9jayBvYmplY3QgdG8gYWNxdWlyZQorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgbG9jayB3YXMgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkIGJ5IAorICAgICAgICAgIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBsb2NrIGRvZXMgbm90IHJlZmVyIAorICAgICAgICAgIHRvIGFuIGluaXRpYWxpemVkIGxvY2sgb2JqZWN0LgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBsb2NrIGlzIGFuIGludmFsaWQgcG9pbnRlci4gCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIGl0IGZhaWxzIGR1ZSB0byAKKyAgICAgICAgICB1bmtub3duIHJlYXNvbnMKKyAgICAgICAgICAKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19sb2NrX2FjcXVpcmUgKCB2b3NfbG9ja190KiBsb2NrICkKK3sKKyAgICAgIGludCByYzsKKyAgICAgIC8vQ2hlY2sgZm9yIGludmFsaWQgcG9pbnRlcgorICAgICAgaWYgKCBsb2NrID09IE5VTEwgKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IE5VTEwgcG9pbnRlciBwYXNzZWQgaW4iLF9fRlVOQ1RJT05fXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgfQorICAgICAgLy8gY2hlY2sgaWYgbG9jayByZWZlcnMgdG8gYW4gaW5pdGlhbGl6ZWQgb2JqZWN0CisgICAgICBpZiAoIExJTlVYX0xPQ0tfQ09PS0lFICE9IGxvY2stPmNvb2tpZSApCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogdW5pbml0aWFsaXplZCBsb2NrIixfX0ZVTkNUSU9OX18pOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgIH0KKworICAgICAgaWYgKGluX2ludGVycnVwdCgpKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0ISEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7IAorICAgICAgfQorICAgICAgaWYgKChsb2NrLT5wcm9jZXNzSUQgPT0gY3VycmVudC0+cGlkKSAmJiAKKyAgICAgICAgICAobG9jay0+c3RhdGUgPT0gTE9DS19BQ1FVSVJFRCkpCisgICAgICB7CisgICAgICAgICBsb2NrLT5yZWZjb3VudCsrOworI2lmZGVmIFZPU19ORVNURURfTE9DS19ERUJVRworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sIiVzOiAleCAlZCAlZCIsIF9fZnVuY19fLCBsb2NrLCBjdXJyZW50LT5waWQsIGxvY2stPnJlZmNvdW50KTsKKyNlbmRpZgorICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIH0KKyAgICAgIC8vIEFjcXVpcmUgYSBMb2NrCisgICAgICByYyA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSggJmxvY2stPm1fbG9jayApOyAKKyAgICAgIGlmIChyYykgCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gbG9jayBtdXRleCAocmMgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIH0KKyAKKyAgICAgIAorI2lmZGVmIFZPU19ORVNURURfTE9DS19ERUJVRworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sIiVzOiAleCAlZCIsIF9fZnVuY19fLCBsb2NrLCBjdXJyZW50LT5waWQpOworI2VuZGlmCisgICAgICBpZiAoIExPQ0tfREVTVFJPWUVEICE9IGxvY2stPnN0YXRlICkgCisgICAgICB7CisgICAgICAgICBsb2NrLT5wcm9jZXNzSUQgPSBjdXJyZW50LT5waWQ7CisgICAgICAgICBsb2NrLT5yZWZjb3VudCsrOworICAgICAgICAgbG9jay0+c3RhdGUgICAgPSBMT0NLX0FDUVVJUkVEOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8vIGxvY2sgaXMgYWxyZWFkeSBkZXN0cm95ZWQKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBMb2NrIGlzIGFscmVhZHkgZGVzdHJveWVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIG11dGV4X3VubG9jaygmbG9jay0+bV9sb2NrKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2xvY2tfcmVsZWFzZSgpIC0gcmVsZWFzZXMgYSBsb2NrCisKKyAgVGhlIFxhIHZvc19sb2NrX3JlbGVhc2UoKSBmdW5jdGlvbiBzaGFsbCByZWxlYXNlIHRoZSBsb2NrIG9iamVjdCAKKyAgcmVmZXJlbmNlZCBieSAnbG9jaycuICAKKworICBJZiBhIHRocmVhZCBhdHRlbXB0cyB0byByZWxlYXNlIGEgbG9jayB0aGF0IGl0IHVubG9ja2VkIG9yIGlzIG5vdAorICBpbml0aWFsaXplZCwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuIAorCisgIFxwYXJhbSBsb2NrIC0gdGhlIGxvY2sgdG8gcmVsZWFzZQorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgbG9jayB3YXMgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkCisgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgbG9jayBkb2VzIG5vdCByZWZlciAKKyAgICAgICAgICB0byBhbiBpbml0aWFsaXplZCBsb2NrIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IGxvY2sgZG9lcyBub3QgcmVmZXIgCisgICAgICAgICAgdG8gYW4gaW5pdGlhbGl6ZWQgbG9jayBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX1BFUk0gLSBPcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZC4gIFRoZSBjYWxsaW5nIAorICAgICAgICAgIHRocmVhZCBkb2VzIG5vdCBvd24gdGhlIGxvY2suIAorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBkZWZhdWx0IHJldHVybiB2YWx1ZSBpZiBpdCBmYWlscyBkdWUgdG8gCisgICAgICAgICAgdW5rbm93biByZWFzb25zCisgICAgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbG9ja19yZWxlYXNlICggdm9zX2xvY2tfdCAqbG9jayApCit7CisgICAgICAvL0NoZWNrIGZvciBpbnZhbGlkIHBvaW50ZXIKKyAgICAgIGlmICggbG9jayA9PSBOVUxMICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBOVUxMIHBvaW50ZXIgcGFzc2VkIGluIixfX0ZVTkNUSU9OX18pOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgIH0KKworICAgICAgLy8gY2hlY2sgaWYgbG9jayByZWZlcnMgdG8gYW4gdW5pbml0aWFsaXplZCBvYmplY3QKKyAgICAgIGlmICggTElOVVhfTE9DS19DT09LSUUgIT0gbG9jay0+Y29va2llICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiB1bmluaXRpYWxpemVkIGxvY2siLF9fRlVOQ1RJT05fXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgfQorCisgICAgICBpZiAoaW5faW50ZXJydXB0KCkpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQhISEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsgCisgICAgICB9CisKKyAgICAgIC8vIEN1cnJlbnRUaHJlYWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsgCisgICAgICAvLyBDaGVjayB0aHJlYWQgSUQgb2YgY2FsbGVyIGFnYWluc3QgdGhyZWFkIElECisgICAgICAvLyBvZiB0aGUgdGhyZWFkIHdoaWNoIGFjcXVpcmUgdGhlIGxvY2sKKyAgICAgIGlmICggbG9jay0+cHJvY2Vzc0lEICE9IGN1cnJlbnQtPnBpZCApCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogY3VycmVudCB0YXNrIHBpZCBkb2VzIG5vdCBtYXRjaCBvcmlnaW5hbCB0YXNrIHBpZCEhIixfX0ZVTkNUSU9OX18pOworI2lmZGVmIFZPU19ORVNURURfTE9DS19ERUJVRworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sIiVzOiBMb2NrIGhlbGQgYnk9JWQgYmVpbmcgcmVsZWFzZWQgYnk9JWQiLCBfX2Z1bmNfXywgbG9jay0+cHJvY2Vzc0lELCBjdXJyZW50LT5waWQpOworI2VuZGlmCisKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfUEVSTTsKKyAgICAgIH0KKyAgICAgIGlmICgobG9jay0+cHJvY2Vzc0lEID09IGN1cnJlbnQtPnBpZCkgJiYgCisgICAgICAgICAgKGxvY2stPnN0YXRlID09IExPQ0tfQUNRVUlSRUQpKQorICAgICAgeworICAgICAgICAgaWYgKGxvY2stPnJlZmNvdW50ID4gMCkgbG9jay0+cmVmY291bnQtLTsKKyAgICAgIH0KKyNpZmRlZiBWT1NfTkVTVEVEX0xPQ0tfREVCVUcKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCIlczogJXggJWQgJWQiLCBfX2Z1bmNfXywgbG9jaywgbG9jay0+cHJvY2Vzc0lELCBsb2NrLT5yZWZjb3VudCk7CisjZW5kaWYKKyAgICAgIGlmIChsb2NrLT5yZWZjb3VudCkgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgIAorICAgICAgbG9jay0+cHJvY2Vzc0lEID0gMDsKKyAgICAgIGxvY2stPnJlZmNvdW50ID0gMDsKKyAgICAgIGxvY2stPnN0YXRlID0gTE9DS19SRUxFQVNFRDsKKyAgICAgIC8vIFJlbGVhc2UgYSBMb2NrICAgCisgICAgICBtdXRleF91bmxvY2soICZsb2NrLT5tX2xvY2sgKTsKKyNpZmRlZiBWT1NfTkVTVEVEX0xPQ0tfREVCVUcKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCIlczogRnJlZWluZyBsb2NrICV4ICVkICVkIiwgbG9jaywgbG9jay0+cHJvY2Vzc0lELCBsb2NrLT5yZWZjb3VudCk7CisjZW5kaWYKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfbG9ja19kZXN0cm95KCkgLSBEZXN0cm95cyBhIHZPU1MgTG9jayAtIHByb2JhYmx5IG5vdCByZXF1aXJlZAorICBmb3IgTGludXguIEl0IG1heSBub3QgYmUgcmVxdWlyZWQgZm9yIHRoZSBjYWxsZXIgdG8gZGVzdHJveSBhIGxvY2sgYWZ0ZXIKKyAgdXNhZ2UuCisKKyAgVGhlIFxhIHZvc19sb2NrX2Rlc3Ryb3koKSBmdW5jdGlvbiBzaGFsbCBkZXN0cm95IHRoZSBsb2NrIG9iamVjdCAKKyAgcmVmZXJlbmNlZCBieSBsb2NrLiAgQWZ0ZXIgYSBzdWNjZXNzZnVsIHJldHVybiBmcm9tIFxhIHZvc19sb2NrX2Rlc3Ryb3koKQorICB0aGUgbG9jayBvYmplY3QgYmVjb21lcywgaW4gZWZmZWN0LCB1bmluaXRpYWxpemVkLgorICAgCisgIEEgZGVzdHJveWVkIGxvY2sgb2JqZWN0IGNhbiBiZSByZWluaXRpYWxpemVkIHVzaW5nIHZvc19sb2NrX2luaXQoKTsgCisgIHRoZSByZXN1bHRzIG9mIG90aGVyd2lzZSByZWZlcmVuY2luZyB0aGUgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCAKKyAgYXJlIHVuZGVmaW5lZC4gIENhbGxzIHRvIHZPU1MgbG9jayBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgbG9jayBzdWNoCisgIGFzIHZvc19sb2NrX2FjcXVpcmUoKSB3aWxsIGZhaWwgaWYgdGhlIGxvY2sgaXMgZGVzdHJveWVkLiAgVGhlcmVmb3JlLCAKKyAgZG9uJ3QgdXNlIHRoZSBsb2NrIGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCB1bnRpbCBpdCBoYXMgCisgIGJlZW4gcmUtaW5pdGlhbGl6ZWQuCisgIAorICBccGFyYW0gbG9jayAtIHRoZSBsb2NrIG9iamVjdCB0byBiZSBkZXN0cm95ZWQuCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGxvY2sgd2FzIHN1Y2Nlc3NmdWxseSBkZXN0cm95ZWQuCisgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9CVVNZIC0gVGhlIGltcGxlbWVudGF0aW9uIGhhcyBkZXRlY3RlZCBhbiBhdHRlbXB0IAorICAgICAgICAgIHRvIGRlc3Ryb3kgdGhlIG9iamVjdCByZWZlcmVuY2VkIGJ5IGxvY2sgd2hpbGUgaXQgaXMgbG9ja2VkIAorICAgICAgICAgIG9yIHN0aWxsIHJlZmVyZW5jZWQuIAorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBsb2NrIGlzIGludmFsaWQuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIGxvY2sgaXMgYW4gaW52YWxpZCBwb2ludGVyLiAKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gZGVmYXVsdCByZXR1cm4gdmFsdWUgaWYgaXQgZmFpbHMgZHVlIHRvIAorICAgICAgICAgIHVua25vd24gcmVhc29ucworICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX2xvY2tfZGVzdHJveSggdm9zX2xvY2tfdCAqbG9jayApCit7CisgICAgICAvL0NoZWNrIGZvciBpbnZhbGlkIHBvaW50ZXIKKyAgICAgIGlmICggTlVMTCA9PSBsb2NrICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBOVUxMIHBvaW50ZXIgcGFzc2VkIGluIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7IAorICAgICAgfQorCisgICAgICBpZiAoIExJTlVYX0xPQ0tfQ09PS0lFICE9IGxvY2stPmNvb2tpZSApCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogdW5pbml0aWFsaXplZCBsb2NrIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICB9CisKKyAgICAgIGlmIChpbl9pbnRlcnJ1cHQoKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCEhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOyAKKyAgICAgIH0KKworICAgICAgLy8gY2hlY2sgaWYgbG9jayBpcyByZWxlYXNlZAorICAgICAgaWYgKCFtdXRleF90cnlsb2NrKCZsb2NrLT5tX2xvY2spKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGxvY2sgaXMgbm90IHJlbGVhc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfQlVTWTsKKyAgICAgIH0KKyAgICAgIGxvY2stPmNvb2tpZSA9IDA7CisgICAgICBsb2NrLT5zdGF0ZSA9IExPQ0tfREVTVFJPWUVEOworICAgICAgbG9jay0+cHJvY2Vzc0lEID0gMDsKKyAgICAgIGxvY2stPnJlZmNvdW50ID0gMDsKKworICAgICAgbXV0ZXhfdW5sb2NrKCZsb2NrLT5tX2xvY2spOworCisgICAgICAgICAKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19zcGluX2xvY2tfaW5pdCgpIC0gaW5pdGlhbGl6ZXMgYSB2T1NTIHNwaW4gbG9jaworICAKKyAgVGhlIHZvc19zcGluX2xvY2tfaW5pdCgpIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzcGVjaWZpZWQgc3BpbiBsb2NrLiBVcG9uIAorICBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLCB0aGUgc3RhdGUgb2YgdGhlIGxvY2sgYmVjb21lcyBpbml0aWFsaXplZCAKKyAgYW5kIHVubG9ja2VkLgorCisgIEEgbG9jayBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgdm9zX3NwaW5fbG9ja19pbml0KCkgYmVmb3JlIGl0IAorICBtYXkgYmUgdXNlZCBpbiBhbnkgb3RoZXIgbG9jayBmdW5jdGlvbnMuIAorICAKKyAgQXR0ZW1wdGluZyB0byBpbml0aWFsaXplIGFuIGFscmVhZHkgaW5pdGlhbGl6ZWQgbG9jayByZXN1bHRzIGluIAorICBhIGZhaWx1cmUuCisgCisgIFxwYXJhbSBwTG9jayAtIHBvaW50ZXIgdG8gdGhlIG9wYXF1ZSBsb2NrIG9iamVjdCB0byBpbml0aWFsaXplCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHNwaW4gbG9jayB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZCAKKyAgICAgICAgICBpcyByZWFkeSB0byBiZSB1c2VkLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZPU19TVEFUVVMgdm9zX3NwaW5fbG9ja19pbml0KHZvc19zcGluX2xvY2tfdCAqcExvY2spCit7CisgICBzcGluX2xvY2tfaW5pdChwTG9jayk7CisgICAKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3Nfc3Bpbl9sb2NrX2FjcXVpcmUoKSAtIGFjcXVpcmVzIGEgc3BpbiBsb2NrCisKKyAgQSBsb2NrIG9iamVjdCBpcyBhY3F1aXJlZCBieSBjYWxsaW5nIFxhIHZvc19zcGluX2xvY2tfYWNxdWlyZSgpLiAgSWYgdGhlIGxvY2sgCisgIGlzIGFscmVhZHkgbG9ja2VkLCB0aGUgY2FsbGluZyB0aHJlYWQgc2hhbGwgc3BpbiB1bnRpbCB0aGUgbG9jayBiZWNvbWVzIAorICBhdmFpbGFibGUuIFRoaXMgb3BlcmF0aW9uIHNoYWxsIHJldHVybiB3aXRoIHRoZSBsb2NrIG9iamVjdCByZWZlcmVuY2VkIGJ5IAorICBsb2NrIGluIHRoZSBsb2NrZWQgc3RhdGUgd2l0aCB0aGUgY2FsbGluZyB0aHJlYWQgYXMgaXRzIG93bmVyLiAKKyAgCisgIFxwYXJhbSBwTG9jayAtIHRoZSBsb2NrIG9iamVjdCB0byBhY3F1aXJlCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBsb2NrIHdhcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWQgYnkgCisgICAgICAgICAgdGhlIGNhbGxpbmcgdGhyZWFkLgorICAgICAgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3Nfc3Bpbl9sb2NrX2FjcXVpcmUodm9zX3NwaW5fbG9ja190ICpwTG9jaykKK3sKKyAgIHNwaW5fbG9jayhwTG9jayk7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19zcGluX2xvY2tfcmVsZWFzZSgpIC0gcmVsZWFzZXMgYSBsb2NrCisKKyAgVGhlIFxhIHZvc19sb2NrX3JlbGVhc2UoKSBmdW5jdGlvbiBzaGFsbCByZWxlYXNlIHRoZSBzcGluIGxvY2sgb2JqZWN0IAorICByZWZlcmVuY2VkIGJ5ICdsb2NrJy4gIAorCisgIElmIGEgdGhyZWFkIGF0dGVtcHRzIHRvIHJlbGVhc2UgYSBsb2NrIHRoYXQgaXQgdW5sb2NrZWQgb3IgaXMgbm90CisgIGluaXRpYWxpemVkLCBhbiBlcnJvciBpcyByZXR1cm5lZC4gCisKKyAgXHBhcmFtIHBMb2NrIC0gdGhlIGxvY2sgdG8gcmVsZWFzZQorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgbG9jayB3YXMgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkCisgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3NwaW5fbG9ja19yZWxlYXNlKHZvc19zcGluX2xvY2tfdCAqcExvY2spCit7CisgICBzcGluX3VubG9jayhwTG9jayk7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3Nfc3Bpbl9sb2NrX2Rlc3Ryb3koKSAtIHJlbGVhc2VzIHJlc291cmNlIG9mIGEgbG9jaworCisgIFxwYXJhbSBwTG9jayAtIHRoZSBwb2ludGVyIHRvIGEgbG9jayB0byByZWxlYXNlCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBsb2NrIHdhcyBzdWNjZXNzZnVsbHkgcmVsZWFzZWQKKyAgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3Nfc3Bpbl9sb2NrX2Rlc3Ryb3kodm9zX3NwaW5fbG9ja190ICpwTG9jaykKK3sKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9zcmMvdm9zX21lbW9yeS5jIGIvQ09SRS9WT1NTL3NyYy92b3NfbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4MDE3NwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVk9TUy9zcmMvdm9zX21lbW9yeS5jCkBAIC0wLDAgKzEsNDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQGZpbGUgdm9zX21lbW9yeS5jCisKKyAgQGJyaWVmIFZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWNlcyBNZW1vcnkgQVBJCisKKyAgCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgIAorICAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUgCisgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuIAorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLiAKKyAgIAorICAgCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJCAKKyAgIAorICAgCisgIHdoZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5IAorICAtLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgRmlsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCisjaW5jbHVkZSAidm9zX3RyYWNlLmgiCisKKyNpZmRlZiBNRU1PUllfREVCVUcKKyNpbmNsdWRlICJ3bGFuX2hkZF9kcF91dGlscy5oIgorCitoZGRfbGlzdF90IHZvc01lbUxpc3Q7CisKK3N0YXRpYyB2X1U4X3QgV0xBTl9NRU1fSEVBREVSW10gPSAgezB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjggfTsKK3N0YXRpYyB2X1U4X3QgV0xBTl9NRU1fVEFJTFtdICAgPSAgezB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODd9OworCitzdHJ1Y3Qgc192b3NfbWVtX3N0cnVjdAoreworICAgaGRkX2xpc3Rfbm9kZV90IHBOb2RlOworICAgY2hhciogZmlsZU5hbWU7CisgICB1bnNpZ25lZCBpbnQgbGluZU51bTsKKyAgIHVuc2lnbmVkIGludCBzaXplOworICAgdl9VOF90IGhlYWRlcls4XTsKK307CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERhdGEgZGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBGdW5jdGlvbiBpbXBsZW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBNRU1PUllfREVCVUcKK3ZvaWQgdm9zX21lbV9pbml0KCkKK3sKKyAgIC8qIEluaXRhbGl6aW5nIHRoZSBsaXN0IHdpdGggbWF4aW11bSBzaXplIG9mIDYwMDAwICovCisgICBoZGRfbGlzdF9pbml0KCZ2b3NNZW1MaXN0LCA2MDAwMCk7ICAKKyAgIHJldHVybjsgCit9CisKK3ZvaWQgdm9zX21lbV9jbGVhbigpCit7CisgICAgdl9TSVpFX3QgbGlzdFNpemU7CisgICAgaGRkX2xpc3Rfc2l6ZSgmdm9zTWVtTGlzdCwgJmxpc3RTaXplKTsKKworICAgIGlmKGxpc3RTaXplKQorICAgIHsKKyAgICAgICBoZGRfbGlzdF9ub2RlX3QqIHBOb2RlOworICAgICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworCisgICAgICAgc3RydWN0IHNfdm9zX21lbV9zdHJ1Y3QqIG1lbVN0cnVjdDsKKyAKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIiVzOiBMaXN0IGlzIG5vdCBFbXB0eS4gbGlzdFNpemUgJWQgIiwgX19GVU5DVElPTl9fLCAoaW50KWxpc3RTaXplKTsKKworICAgICAgIGRvCisgICAgICAgeworICAgICAgICAgIHNwaW5fbG9jaygmdm9zTWVtTGlzdC5sb2NrKTsKKyAgICAgICAgICB2b3NTdGF0dXMgPSBoZGRfbGlzdF9yZW1vdmVfZnJvbnQoJnZvc01lbUxpc3QsICZwTm9kZSk7CisgICAgICAgICAgc3Bpbl91bmxvY2soJnZvc01lbUxpc3QubG9jayk7CisgICAgICAgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgbWVtU3RydWN0ID0gKHN0cnVjdCBzX3Zvc19tZW1fc3RydWN0KilwTm9kZTsKKyAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgIk1lbW9yeSBMZWFrQCBGaWxlICVzLCBATGluZSAlZCwgc2l6ZSAlZCIsIAorICAgICAgICAgICAgICAgICAgIG1lbVN0cnVjdC0+ZmlsZU5hbWUsIChpbnQpbWVtU3RydWN0LT5saW5lTnVtLCBtZW1TdHJ1Y3QtPnNpemUpOworICAgICAgICAgICAgIGtmcmVlKCh2X1ZPSURfdCopbWVtU3RydWN0KTsKKyAgICAgICAgICB9CisgICAgICAgfXdoaWxlKHZvc1N0YXR1cyA9PSBWT1NfU1RBVFVTX1NVQ0NFU1MpOworICAgIH0KK30KKwordm9pZCB2b3NfbWVtX2V4aXQoKQoreworICAgIHZvc19tZW1fY2xlYW4oKTsgICAgCisgICAgaGRkX2xpc3RfZGVzdHJveSgmdm9zTWVtTGlzdCk7Cit9CisKK3ZfVk9JRF90ICogdm9zX21lbV9tYWxsb2NfZGVidWcoIHZfU0laRV90IHNpemUsIGNoYXIqIGZpbGVOYW1lLCB2X1UzMl90IGxpbmVOdW0pCit7CisgICBzdHJ1Y3Qgc192b3NfbWVtX3N0cnVjdCogbWVtU3RydWN0OworICAgdl9WT0lEX3QqIG1lbVB0ciA9IE5VTEw7CisgICB2X1NJWkVfdCBuZXdfc2l6ZTsKKworICAgaWYgKHNpemUgPiAoMTAyNCoxMDI0KSkKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IGNhbGxlZCB3aXRoIGFyZyA+IDEwMjRLOyBwYXNzZWQgaW4gJWQgISEhIiwgX19GVU5DVElPTl9fLHNpemUpOyAKKyAgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIGlmIChpbl9pbnRlcnJ1cHQoKSkKKyAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgIiVzIGlzIGJlaW5nIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCwgdXNpbmcgR1BGX0FUT01JQy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgIHJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworICAgICAgCisgICB9CisKKyAgIG5ld19zaXplID0gc2l6ZSArIHNpemVvZihzdHJ1Y3Qgc192b3NfbWVtX3N0cnVjdCkgKyA4OyAKKworICAgbWVtU3RydWN0ID0gKHN0cnVjdCBzX3Zvc19tZW1fc3RydWN0KilrbWFsbG9jKG5ld19zaXplLEdGUF9LRVJORUwpOworCisgICBpZihtZW1TdHJ1Y3QgIT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworCisgICAgICBtZW1TdHJ1Y3QtPmZpbGVOYW1lID0gZmlsZU5hbWU7CisgICAgICBtZW1TdHJ1Y3QtPmxpbmVOdW0gID0gbGluZU51bTsKKyAgICAgIG1lbVN0cnVjdC0+c2l6ZSAgICAgPSBzaXplOworCisgICAgICB2b3NfbWVtX2NvcHkoJm1lbVN0cnVjdC0+aGVhZGVyWzBdLCAmV0xBTl9NRU1fSEVBREVSWzBdLCBzaXplb2YoV0xBTl9NRU1fSEVBREVSKSk7CisgICAgICB2b3NfbWVtX2NvcHkoICh2X1U4X3QqKShtZW1TdHJ1Y3QgKyAxKSArIHNpemUsICZXTEFOX01FTV9UQUlMWzBdLCBzaXplb2YoV0xBTl9NRU1fVEFJTCkpOworCisgICAgICBzcGluX2xvY2soJnZvc01lbUxpc3QubG9jayk7CisgICAgICB2b3NTdGF0dXMgPSBoZGRfbGlzdF9pbnNlcnRfZnJvbnQoJnZvc01lbUxpc3QsICZtZW1TdHJ1Y3QtPnBOb2RlKTsKKyAgICAgIHNwaW5fdW5sb2NrKCZ2b3NNZW1MaXN0LmxvY2spOworICAgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gaW5zZXJ0IG5vZGUgaW50byBMaXN0IHZvc1N0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCB2b3NTdGF0dXMpOworICAgICAgfQorCisgICAgICBtZW1QdHIgPSAodl9WT0lEX3QqKShtZW1TdHJ1Y3QgKyAxKTsgCisgICB9CisgICByZXR1cm4gbWVtUHRyOworfQorCit2X1ZPSURfdCB2b3NfbWVtX2ZyZWUoIHZfVk9JRF90ICpwdHIgKQoreworICAgIGlmIChwdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgICAgICBzdHJ1Y3Qgc192b3NfbWVtX3N0cnVjdCogbWVtU3RydWN0ID0gKChzdHJ1Y3Qgc192b3NfbWVtX3N0cnVjdCopcHRyKSAtIDE7CisKKyAgICAgICAgc3Bpbl9sb2NrKCZ2b3NNZW1MaXN0LmxvY2spOworICAgICAgICB2b3NTdGF0dXMgPSBoZGRfbGlzdF9yZW1vdmVfbm9kZSgmdm9zTWVtTGlzdCwgJm1lbVN0cnVjdC0+cE5vZGUpOworICAgICAgICBzcGluX3VubG9jaygmdm9zTWVtTGlzdC5sb2NrKTsKKworICAgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBpZigwID09IHZvc19tZW1fY29tcGFyZShtZW1TdHJ1Y3QtPmhlYWRlciwgJldMQU5fTUVNX0hFQURFUlswXSwgc2l6ZW9mKFdMQU5fTUVNX0hFQURFUikpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgCisgICAgICAgICAgICAgICAgICAgICJNZW1vcnkgSGVhZGVyIGlzIGNvcnJ1cHRlZC4gTWVtSW5mbzogRmlsZW5hbWUgJXMsIExpbmVOdW0gJWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtU3RydWN0LT5maWxlTmFtZSwgKGludCltZW1TdHJ1Y3QtPmxpbmVOdW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoMCA9PSB2b3NfbWVtX2NvbXBhcmUoICh2X1U4X3QqKXB0ciArIG1lbVN0cnVjdC0+c2l6ZSwgJldMQU5fTUVNX1RBSUxbMF0sIHNpemVvZihXTEFOX01FTV9UQUlMICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIAorICAgICAgICAgICAgICAgICAgICAiTWVtb3J5IFRyYWlsZXIgaXMgY29ycnVwdGVkLiBNZW1JbmZvOiBGaWxlbmFtZSAlcywgTGluZU51bSAlZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1TdHJ1Y3QtPmZpbGVOYW1lLCAoaW50KW1lbVN0cnVjdC0+bGluZU51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZSgodl9WT0lEX3QqKW1lbVN0cnVjdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBVbmFsbG9jYXRlZCBtZW1vcnkgKGRvdWJsZSBmcmVlPykiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCit2X1ZPSURfdCAqIHZvc19tZW1fbWFsbG9jKCB2X1NJWkVfdCBzaXplICkKK3sKKyAgIGlmIChzaXplID4gKDEwMjQqMTAyNCkpCisgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGNhbGxlZCB3aXRoIGFyZyA+IDEwMjRLOyBwYXNzZWQgaW4gJWQgISEhIiwgX19GVU5DVElPTl9fLHNpemUpOyAKKyAgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIGlmIChpbl9pbnRlcnJ1cHQoKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCEhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIHJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworfSAgIAorCit2X1ZPSURfdCB2b3NfbWVtX2ZyZWUoIHZfVk9JRF90ICpwdHIgKQoreworICAgIGlmIChwdHIgPT0gTlVMTCkKKyAgICAgIHJldHVybjsKKyAgICBrZnJlZShwdHIpOworfQorI2VuZGlmCisKK3ZfVk9JRF90IHZvc19tZW1fc2V0KCB2X1ZPSURfdCAqcHRyLCB2X1NJWkVfdCBudW1CeXRlcywgdl9CWVRFX3QgdmFsdWUgKQoreworICAgaWYgKHB0ciA9PSBOVUxMKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgY2FsbGVkIHdpdGggTlVMTCBwYXJhbWV0ZXIgcHRyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIG1lbXNldChwdHIsIHZhbHVlLCBudW1CeXRlcyk7Cit9CisKK3ZfVk9JRF90IHZvc19tZW1femVybyggdl9WT0lEX3QgKnB0ciwgdl9TSVpFX3QgbnVtQnl0ZXMgKQoreworICAgaWYgKDAgPT0gbnVtQnl0ZXMpCisgICB7CisgICAgICAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgcHRyIGNhbiBiZSBOVUxMCisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChwdHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIGNhbGxlZCB3aXRoIE5VTEwgcGFyYW1ldGVyIHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm47CisgICB9CisgICBtZW1zZXQocHRyLCAwLCBudW1CeXRlcyk7CisgICAKK30KKworCisvL1RoaXMgZnVuY3Rpb24gaXMgdG8gdmFsaWRhdGUgb25lIGxpc3QgaW4gU01FLiBXZSBzdXNwZWN0IHNvbWVvbmUgY29ycnVwdCB0ZSBsaXN0LiBUaGlzIGNvZGUgbmVlZCB0byBiZSByZW1vdmVkCisvL29uY2UgdGhlIGlzc3VlIGlzIGZpeGVkLgorZXh0ZXJuIGludCBjc3JDaGVja1ZhbGlkYXRlTGlzdHModm9pZCAqIGRlc3QsIGNvbnN0IHZvaWQgKnNyYywgdl9TSVpFX3QgbnVtLCBpbnQgaWR4KTsKKwordl9WT0lEX3Qgdm9zX21lbV9jb3B5KCB2X1ZPSURfdCAqcERzdCwgY29uc3Qgdl9WT0lEX3QgKnBTcmMsIHZfU0laRV90IG51bUJ5dGVzICkKK3sKKyAgIGlmICgwID09IG51bUJ5dGVzKQorICAgeworICAgICAgLy8gc3BlY2lhbCBjYXNlIHdoZXJlIHBEc3Qgb3IgcFNyYyBjYW4gYmUgTlVMTAorICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoKHBEc3QgPT0gTlVMTCkgfHwgKHBTcmM9PU5VTEwpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlcyBjYWxsZWQgd2l0aCBOVUxMIHBhcmFtZXRlciwgc291cmNlOiVwIGRlc3RpbmF0aW9uOiVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBTcmMsIHBEc3QpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIC8vVGhlc2UgdHdvIGNoZWNrIGZ1bmN0aW9uIGNhbGxzIGFyZSB0byBzZWUgaWYgc29tZW9uZSBjb3JydXB0IHRoZSBsaXN0IHdoaWxlIGRvaW5nIG1lbSBjb3B5LgorICAgY3NyQ2hlY2tWYWxpZGF0ZUxpc3RzKHBEc3QsIHBTcmMsIG51bUJ5dGVzLCAxKTsKKyAgIG1lbWNweShwRHN0LCBwU3JjLCBudW1CeXRlcyk7CisgICBjc3JDaGVja1ZhbGlkYXRlTGlzdHMocERzdCwgcFNyYywgbnVtQnl0ZXMsIDIpOworfQorCit2X1ZPSURfdCB2b3NfbWVtX21vdmUoIHZfVk9JRF90ICpwRHN0LCBjb25zdCB2X1ZPSURfdCAqcFNyYywgdl9TSVpFX3QgbnVtQnl0ZXMgKQoreworICAgaWYgKDAgPT0gbnVtQnl0ZXMpCisgICB7CisgICAgICAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgcERzdCBvciBwU3JjIGNhbiBiZSBOVUxMCisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmICgocERzdCA9PSBOVUxMKSB8fCAocFNyYz09TlVMTCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzIGNhbGxlZCB3aXRoIE5VTEwgcGFyYW1ldGVyLCBzb3VyY2U6JXAgZGVzdGluYXRpb246JXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcFNyYywgcERzdCk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuOworICAgfQorICAgbWVtbW92ZShwRHN0LCBwU3JjLCBudW1CeXRlcyk7Cit9CisKK3ZfQk9PTF90IHZvc19tZW1fY29tcGFyZSggdl9WT0lEX3QgKnBNZW1vcnkxLCB2X1ZPSURfdCAqcE1lbW9yeTIsIHZfVTMyX3QgbnVtQnl0ZXMgKQoreyAKKyAgIGlmICgwID09IG51bUJ5dGVzKQorICAgeworICAgICAgLy8gc3BlY2lhbCBjYXNlIHdoZXJlIHBNZW1vcnkxIG9yIHBNZW1vcnkyIGNhbiBiZSBOVUxMCisgICAgICByZXR1cm4gVk9TX1RSVUU7CisgICB9CisKKyAgIGlmICgocE1lbW9yeTEgPT0gTlVMTCkgfHwgKHBNZW1vcnkyPT1OVUxMKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXMgY2FsbGVkIHdpdGggTlVMTCBwYXJhbWV0ZXIsIHAxOiVwIHAyOiVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBNZW1vcnkxLCBwTWVtb3J5Mik7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19GQUxTRTsKKyAgIH0KKyAgIHJldHVybiAobWVtY21wKHBNZW1vcnkxLCBwTWVtb3J5MiwgbnVtQnl0ZXMpP1ZPU19GQUxTRTpWT1NfVFJVRSk7Cit9ICAgCisKKwordl9TSU5UX3Qgdm9zX21lbV9jb21wYXJlMiggdl9WT0lEX3QgKnBNZW1vcnkxLCB2X1ZPSURfdCAqcE1lbW9yeTIsIHZfVTMyX3QgbnVtQnl0ZXMgKQorCit7IAorICAgcmV0dXJuKCAodl9TSU5UX3QpIG1lbWNtcCggcE1lbW9yeTEsIHBNZW1vcnkyLCBudW1CeXRlcyApICk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19tZW1fZG1hX21hbGxvYygpIC0gdk9TUyBETUEgTWVtb3J5IEFsbG9jYXRpb24KKworICBUaGlzIGZ1bmN0aW9uIHdpbGwgZHluYW1pY2FsbGx5IGFsbG9jYXRlIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIG9mIAorICBtZW1vcnkuIFRoaXMgbWVtb3J5IHdpbGwgaGF2ZSBzcGVjaWFsIGF0dHJpYnV0ZXMgbWFraW5nIGl0IERNQSBmcmllbmRseSBpLmUuCisgIGl0IHdpbGwgZXhpc3QgaW4gY29udGlndW91cywgMzItYnl0ZSBhbGlnbmVkIHVuY2FjaGVkIG1lbW9yeS4gQSBub3JtYWwgCisgIHZvc19tZW1fbWFsbG9jIGRvZXMgbm90IHlpZWxkIG1lbW9yeSB3aXRoIHRoZXNlIGF0dHJpYnV0ZXMuIAorCisgIE5PVEU6IHRoZSBzcGVjaWFsIERNQSBmcmllbmRseSBtZW1vcnkgaXMgdmVyeSBzY2FyY2UgYW5kIHRoaXMgQVBJIG11c3QgYmUKKyAgdXNlZCBzcGFyaW5nbHkKKworICBPbiBXTSwgdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoaXMgbWVtb3J5LiBTREhDIGFsbG9jYXRlcyB0aGUgCisgIERNQSBmcmllbmRseSBidWZmZXIgYW5kIGNvcGllcyB0aGUgZGF0YSBpbnRvIGl0CisgIAorICBccGFyYW0gc2l6ZSAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLiAgCisgIAorICBccmV0dXJuIFVwb24gc3VjY2Vzc2Z1bCBhbGxvY2F0ZSwgcmV0dXJucyBhIG5vbi1OVUxMIHBvaW50ZXIgdG8gdGhlIAorICBhbGxvY2F0ZWQgbWVtb3J5LiAgSWYgdGhpcyBmdW5jdGlvbiBpcyB1bmFibGUgdG8gYWxsb2NhdGUgdGhlIGFtb3VudCBvZiAKKyAgbWVtb3J5IHNwZWNpZmllZCAoZm9yIGFueSByZWFzb24pIGl0IHJldHVybnMgTlVMTC4KKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgTUVNT1JZX0RFQlVHCit2X1ZPSURfdCAqIHZvc19tZW1fZG1hX21hbGxvY19kZWJ1Zyggdl9TSVpFX3Qgc2l6ZSwgY2hhciogZmlsZU5hbWUsIHZfVTMyX3QgbGluZU51bSkKK3sKKyAgIHN0cnVjdCBzX3Zvc19tZW1fc3RydWN0KiBtZW1TdHJ1Y3Q7CisgICB2X1ZPSURfdCogbWVtUHRyID0gTlVMTDsKKyAgIHZfU0laRV90IG5ld19zaXplOworCisgICBpZiAoaW5faW50ZXJydXB0KCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQhISEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIG5ld19zaXplID0gc2l6ZSArIHNpemVvZihzdHJ1Y3Qgc192b3NfbWVtX3N0cnVjdCkgKyA4OyAKKworICAgbWVtU3RydWN0ID0gKHN0cnVjdCBzX3Zvc19tZW1fc3RydWN0KilrbWFsbG9jKG5ld19zaXplLEdGUF9LRVJORUwpOworCisgICBpZihtZW1TdHJ1Y3QgIT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworCisgICAgICBtZW1TdHJ1Y3QtPmZpbGVOYW1lID0gZmlsZU5hbWU7CisgICAgICBtZW1TdHJ1Y3QtPmxpbmVOdW0gID0gbGluZU51bTsKKyAgICAgIG1lbVN0cnVjdC0+c2l6ZSAgICAgPSBzaXplOworCisgICAgICB2b3NfbWVtX2NvcHkoJm1lbVN0cnVjdC0+aGVhZGVyWzBdLCAmV0xBTl9NRU1fSEVBREVSWzBdLCBzaXplb2YoV0xBTl9NRU1fSEVBREVSKSk7CisgICAgICB2b3NfbWVtX2NvcHkoICh2X1U4X3QqKShtZW1TdHJ1Y3QgKyAxKSArIHNpemUsICZXTEFOX01FTV9UQUlMWzBdLCBzaXplb2YoV0xBTl9NRU1fVEFJTCkpOworCisgICAgICBzcGluX2xvY2soJnZvc01lbUxpc3QubG9jayk7CisgICAgICB2b3NTdGF0dXMgPSBoZGRfbGlzdF9pbnNlcnRfZnJvbnQoJnZvc01lbUxpc3QsICZtZW1TdHJ1Y3QtPnBOb2RlKTsKKyAgICAgIHNwaW5fdW5sb2NrKCZ2b3NNZW1MaXN0LmxvY2spOworICAgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gaW5zZXJ0IG5vZGUgaW50byBMaXN0IHZvc1N0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCB2b3NTdGF0dXMpOworICAgICAgfQorCisgICAgICBtZW1QdHIgPSAodl9WT0lEX3QqKShtZW1TdHJ1Y3QgKyAxKTsgCisgICB9CisKKyAgIHJldHVybiBtZW1QdHI7Cit9CisKK3ZfVk9JRF90IHZvc19tZW1fZG1hX2ZyZWUoIHZfVk9JRF90ICpwdHIgKQoreworICAgIGlmIChwdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgICAgICBzdHJ1Y3Qgc192b3NfbWVtX3N0cnVjdCogbWVtU3RydWN0ID0gKChzdHJ1Y3Qgc192b3NfbWVtX3N0cnVjdCopcHRyKSAtIDE7CisKKyAgICAgICAgc3Bpbl9sb2NrKCZ2b3NNZW1MaXN0LmxvY2spOworICAgICAgICB2b3NTdGF0dXMgPSBoZGRfbGlzdF9yZW1vdmVfbm9kZSgmdm9zTWVtTGlzdCwgJm1lbVN0cnVjdC0+cE5vZGUpOworICAgICAgICBzcGluX3VubG9jaygmdm9zTWVtTGlzdC5sb2NrKTsKKworICAgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBpZigwID09IHZvc19tZW1fY29tcGFyZShtZW1TdHJ1Y3QtPmhlYWRlciwgJldMQU5fTUVNX0hFQURFUlswXSwgc2l6ZW9mKFdMQU5fTUVNX0hFQURFUikpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgCisgICAgICAgICAgICAgICAgICAgICJNZW1vcnkgSGVhZGVyIGlzIGNvcnJ1cHRlZC4gTWVtSW5mbzogRmlsZW5hbWUgJXMsIExpbmVOdW0gJWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtU3RydWN0LT5maWxlTmFtZSwgKGludCltZW1TdHJ1Y3QtPmxpbmVOdW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoMCA9PSB2b3NfbWVtX2NvbXBhcmUoICh2X1U4X3QqKXB0ciArIG1lbVN0cnVjdC0+c2l6ZSwgJldMQU5fTUVNX1RBSUxbMF0sIHNpemVvZihXTEFOX01FTV9UQUlMICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIAorICAgICAgICAgICAgICAgICAgICAiTWVtb3J5IFRyYWlsZXIgaXMgY29ycnVwdGVkLiBNZW1JbmZvOiBGaWxlbmFtZSAlcywgTGluZU51bSAlZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1TdHJ1Y3QtPmZpbGVOYW1lLCAoaW50KW1lbVN0cnVjdC0+bGluZU51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZSgodl9WT0lEX3QqKW1lbVN0cnVjdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQordl9WT0lEX3QqIHZvc19tZW1fZG1hX21hbGxvYyggdl9TSVpFX3Qgc2l6ZSApCit7CisgICBpZiAoaW5faW50ZXJydXB0KCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQhISEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisgICByZXR1cm4ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX21lbV9kbWFfZnJlZSgpIC0gdk9TUyBETUEgRnJlZSBNZW1vcnkKKworICBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBzcGVjaWFsIERNQSBmcmllbmRseSBtZW1vcnkgcG9pbnRlZCB0byBieSAncHRyJy4KKworICBPbiBXTSwgdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBtZW1vcnkgYmVpbmcgZnJlZSdkLiBTREhDIHdpbGwKKyAgdGFrZSBjYXJlIG9mIGZyZWUnaW5nIHRoZSBETUEgZnJpZW5kbHkgYnVmZmVyCisgIAorICBccGFyYW0gcHRyIC0gcG9pbnRlciB0byB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIGJlIAorICAgICAgICAgICAgICAgZnJlZSdkLiAgCisgIAorICBccmV0dXJuIE5vdGhpbmcKKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1ZPSURfdCB2b3NfbWVtX2RtYV9mcmVlKCB2X1ZPSURfdCAqcHRyICkKK3sKKyAgICBpZiAocHRyID09IE5VTEwpCisgICAgICByZXR1cm47CisgICAga2ZyZWUocHRyKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL3NyYy92b3NfbXEuYyBiL0NPUkUvVk9TUy9zcmMvdm9zX21xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkYzk0ZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVk9TUy9zcmMvdm9zX21xLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgdm9zX21xLmMKKyAgCisgIFxicmllZiB2aXJ0dWFsIE9wZXJhdGluZyBTeXN0ZW0gU2VydmljZXMgKHZPU1MpIG1lc3NhZ2UgcXVldWUgQVBJcworICAgICAgICAgICAgICAgCisgICBNZXNzYWdlIFF1ZXVlIERlZmluaXRpb25zIGFuZCBBUEkKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx2b3NfbXEuaD4KKyNpbmNsdWRlICJ2b3Nfc2NoZWQuaCIKKyNpbmNsdWRlIDx2b3NfYXBpLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX21xX2luaXQoKSAtIEluaXRpYWxpemUgdGhlIHZPU1MgU2NoZWR1bGVyICAKKyAgICAKKyAgVGhlIFxhIHZvc19tcV9pbml0KCkgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIE1lc3NhZ2UgcXVldWUuCisgICAgICAKKyAgXHBhcmFtICBwTXEgLSBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIHF1ZXVlCisgIAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIE1lc3NhZ2UgcXVldWUgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQgCisgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gSW52YWxpZCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBtZXNzYWdlCisgICAgICAgICAgcXVldWUgaW5pdGlhbGl6ZSBmdW5jdGlvbi4KKyAgICAgICAgICAKKyAgXHNhIHZvc19tcV9pbml0KCkKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworX19pbmxpbmUgVk9TX1NUQVRVUyB2b3NfbXFfaW5pdChwVm9zTXFUeXBlIHBNcSkKK3sKKworICAvKiBTb21lIHF1aWNrIHNhbml0eSBjaGVjayovCisgIGlmIChwTXEgPT0gTlVMTCkgeworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgIiVzOiBOVUxMIHBvaW50ZXIgcGFzc2VkIixfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICAvKiAKKyAgKiogTm93IGluaXRpYWxpemUgdGhlIGxvY2sKKyAgKi8KKyAgc3Bpbl9sb2NrX2luaXQoJnBNcS0+bXFMb2NrKTsKKworICAvKgorICAqKiBOb3cgaW5pdGlhbGl6ZSB0aGUgTGlzdCBkYXRhIHN0cnVjdHVyZQorICAqLworICBJTklUX0xJU1RfSEVBRCgmcE1xLT5tcUxpc3QpOworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAKK30gLyogdm9zX21xX2luaXQoKSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX21xX2RlaW5pdCgpIC0gRGVJbml0aWFsaXplIHRoZSB2T1NTIFNjaGVkdWxlciAgCisgICAgCisgIFRoZSBcYSB2b3NfbXFfaW5pdCgpIGZ1bmN0aW9uIGRlLWluaXRpYWxpemVzIHRoZSBNZXNzYWdlIHF1ZXVlLgorICAgICAgCisgIFxwYXJhbSAgcE1xIC0gcG9pbnRlciB0byB0aGUgbWVzc2FnZSBxdWV1ZQorICAKKyAgXHJldHVybiBOb25lCisgICAgICAgICAgCisgIFxzYSB2b3NfbXFfZGVpbml0KCkKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworX19pbmxpbmUgdm9pZCB2b3NfbXFfZGVpbml0KHBWb3NNcVR5cGUgcE1xKQoreworICAvKiAKKyAgKiogU29tZSBxdWljayBzYW5pdHkgY2hlY2sKKyAgKi8KKyAgaWYgKHBNcSA9PSBOVUxMKSB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAiJXM6IE5VTEwgcG9pbnRlciBwYXNzZWQiLF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybiA7CisgIH0KKworICAvKiB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHdpdGggdGhlIGVtYmVkZGVkIGxpc3Qgb3Igc3BpbmxvY2sgKi8KKworfS8qIHZvc19tcV9kZWluaXQoKSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX21xX3B1dCgpIC0gQWRkIGEgbWVzc2FnZSB0byB0aGUgbWVzc2FnZSBxdWV1ZSAKKyAgICAKKyAgVGhlIFxhIHZvc19tcV9wdXQoKSBmdW5jdGlvbiBhZGQgYSBtZXNzYWdlIHRvIHRoZSBNZXNzYWdlIHF1ZXVlLgorICAgICAgCisgIFxwYXJhbSAgcE1xIC0gcG9pbnRlciB0byB0aGUgbWVzc2FnZSBxdWV1ZQorICAKKyAgXHBhcmFtICBwTXNnV3JhcHBlciAtIE1zZyBXcmFwcGVyIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UKKyAgCisgIFxyZXR1cm4gTm9uZQorICAgICAgICAgIAorICBcc2Egdm9zX21xX3B1dCgpCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK19faW5saW5lIHZvaWQgdm9zX21xX3B1dChwVm9zTXFUeXBlIHBNcSwgcFZvc01zZ1dyYXBwZXIgcE1zZ1dyYXBwZXIpCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgLyogCisgICoqIFNvbWUgcXVpY2sgc2FuaXR5IGNoZWNrCisgICovCisgIGlmICgocE1xID09IE5VTEwpIHx8IChwTXNnV3JhcHBlciA9PSBOVUxMKSkgeworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgIiVzOiBOVUxMIHBvaW50ZXIgcGFzc2VkIixfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gOworICB9CisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJnBNcS0+bXFMb2NrLCBmbGFncyk7CisKKyAgbGlzdF9hZGRfdGFpbCgmcE1zZ1dyYXBwZXItPm1zZ05vZGUsICZwTXEtPm1xTGlzdCk7CisKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcE1xLT5tcUxvY2ssIGZsYWdzKTsKKworfSAvKiB2b3NfbXFfcHV0KCkgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19tcV9nZXQoKSAtIEdldCBhIG1lc3NhZ2Ugd2l0aCBpdHMgd3JhcHBlciBmcm9tIGEgbWVzc2FnZSBxdWV1ZSAKKyAgICAKKyAgVGhlIFxhIHZvc19tcV9nZXQoKSBmdW5jdGlvbiByZXRyaWV2ZSBhIG1lc3NhZ2Ugd2l0aCBpdHMgd3JhcHBlciBmcm9tIAorICAgICAgdGhlIE1lc3NhZ2UgcXVldWUuCisgICAgICAKKyAgXHBhcmFtICBwTXEgLSBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIHF1ZXVlCisgIAorICBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIE1lc3NhZ2UgV3JhcHBlcgorICAgICAgICAgIAorICBcc2Egdm9zX21xX2dldCgpCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK19faW5saW5lIHBWb3NNc2dXcmFwcGVyIHZvc19tcV9nZXQocFZvc01xVHlwZSBwTXEpCit7CisgIHBWb3NNc2dXcmFwcGVyIHBNc2dXcmFwcGVyID0gTlVMTDsKKworICAvKiAKKyAgKiogU29tZSBxdWljayBzYW5pdHkgY2hlY2sKKyAgKi8KKyAgc3RydWN0IGxpc3RfaGVhZCAqIGxpc3RwdHI7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIAorICBpZiAocE1xID09IE5VTEwpIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICIlczogTlVMTCBwb2ludGVyIHBhc3NlZCIsX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJnBNcS0+bXFMb2NrLCBmbGFncyk7CisKKyAgaWYoIGxpc3RfZW1wdHkoJnBNcS0+bXFMaXN0KSApCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAiJXM6IFZPUyBNZXNzYWdlIFF1ZXVlIGlzIGVtcHR5IixfX0ZVTkNUSU9OX18pOworICB9CisgIGVsc2UKKyAgeworICAgIGxpc3RwdHIgPSBwTXEtPm1xTGlzdC5uZXh0OworICAgIHBNc2dXcmFwcGVyID0gKHBWb3NNc2dXcmFwcGVyKWxpc3RfZW50cnkobGlzdHB0ciwgVm9zTXNnV3JhcHBlciwgbXNnTm9kZSk7CisgICAgbGlzdF9kZWwocE1xLT5tcUxpc3QubmV4dCk7CisgIH0KKworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwTXEtPm1xTG9jaywgZmxhZ3MpOworCisgIHJldHVybiBwTXNnV3JhcHBlcjsKKworfSAvKiB2b3NfbXFfZ2V0KCkgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19pc19tcV9lbXB0eSgpIC0gUmV0dXJuIGlmIHRoZSBNUSBpcyBlbXB0eQorICAKKyAgVGhlIFxhIHZvc19pc19tcV9lbXB0eSgpIHJldHVybnMgdHJ1ZSBpZiB0aGUgcXVldWUgaXMgZW1wdHkKKyAgICAgIAorICBccGFyYW0gIHBNcSAtIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgcXVldWUKKyAgCisgIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgTWVzc2FnZSBXcmFwcGVyCisgICAgICAgICAgCisgIFxzYSB2b3NfbXFfZ2V0KCkKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworX19pbmxpbmUgdl9CT09MX3Qgdm9zX2lzX21xX2VtcHR5KHBWb3NNcVR5cGUgcE1xKQoreworICB2X0JPT0xfdCAgc3RhdGUgPSBWT1NfRkFMU0U7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgLyogCisgICoqIFNvbWUgcXVpY2sgc2FuaXR5IGNoZWNrCisgICovCisgIGlmIChwTXEgPT0gTlVMTCkKKyAgeworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgIiVzOiBOVUxMIHBvaW50ZXIgcGFzc2VkIixfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICBzcGluX2xvY2tfaXJxc2F2ZSgmcE1xLT5tcUxvY2ssIGZsYWdzKTsKKyAgc3RhdGUgPSBsaXN0X2VtcHR5KCZwTXEtPm1xTGlzdCk/Vk9TX1RSVUU6Vk9TX0ZBTFNFOworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwTXEtPm1xTG9jaywgZmxhZ3MpOworCisgIHJldHVybiBzdGF0ZTsKKworfSAvKiB2b3NfbXFfZ2V0KCkgKi8KKworCmRpZmYgLS1naXQgYS9DT1JFL1ZPU1Mvc3JjL3Zvc19udml0ZW0uYyBiL0NPUkUvVk9TUy9zcmMvdm9zX252aXRlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNWEzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19udml0ZW0uYwpAQCAtMCwwICsxLDE2NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRklMRTogICAgICAgICB2b3NfbnZpdGVtLmMKKyAgT1ZFUlZJRVc6ICAgICBUaGlzIHNvdXJjZSBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB2T1MgTlYgSXRlbSBBUElzCisgIERFUEVOREVOQ0lFUzogTlYsIHJlbW90ZSBBUEkgY2xpZW50LCBXaW5DRSBSRVgKKyAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgICAgICAgICAgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRURJVCBISVNUT1JZIEZPUiBNT0RVTEUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8gdGhlIGZvbGxvd2luZyBpcyB1c2VkIHRvIGRpc2FibGUgd2FybmluZyBmb3IgaGF2aW5nIHRvbyBtYW55IGxhYmVscyBpbgorLy8gdGhlICdudl9pdGVtc19lbnVtX3R5cGUnCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAidm9zX3R5cGVzLmgiCisjaW5jbHVkZSAiYW5pR2xvYmFsLmgiCisjaW5jbHVkZSAidm9zX252aXRlbS5oIgorI2luY2x1ZGUgInZvc190cmFjZS5oIgorI2luY2x1ZGUgInZvc19hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9taXNjLmgiCisjaW5jbHVkZSAidm9zX3NjaGVkLmgiCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgVkFMSURJVFlfQklUTUFQX05WX0lEICAgIE5WX1dMQU5fVkFMSURJVFlfQklUTUFQX0kKKyNkZWZpbmUgVkFMSURJVFlfQklUTUFQX1NJWkUgICAgIDMyCisjZGVmaW5lIE1BWF9DT1VOVFJZX0NPVU5UICAgICAgICAzMDAKKy8vVG8gYmUgcmVtb3ZlZCB3aGVuIE5WIHN1cHBvcnQgaXMgZnVsbHkgZnVuY3Rpb25hbAorI2RlZmluZSBWT1NfSEFSRF9DT0RFRF9NQUMgICAgezAsIDB4MGEsIDB4ZjUsIDQsIDUsIDZ9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vIHRoaXMgd3JhcHBlciBzdHJ1Y3R1cmUgaXMgaWRlbnRpY2FsIHRvIG52X2NtZF90eXBlIGV4Y2VwdCB0aGUKKy8vIGRhdGFfcHRyIHR5cGUgaXMgY2hhbmdlZCB2b2lkKiB0byBhdm9pZCBleGNlZWRpbmcgdGhlIGRlYnVnIGluZm9ybWF0aW9uCisvLyBtb2R1bGUgc2l6ZSBhcyB0aGVyZSBhcmUgdG9vIG1hbnkgZWxlbWVudHMgd2l0aGluIG52X2l0ZW1zX3R5cGUgdW5pb24KKworLy8gc3RydWN0dXJlIGZvciBjb2RlIGFuZCByZWd1bGF0b3J5IGRvbWFpbiBvZiBhIHNpbmdsZSBjb3VudHJ5Cit0eXBlZGVmIHN0cnVjdAoreworICAgdl9VOF90ICAgICAgICAgICAgcmVnRG9tYWluOworICAgdl9DT1VOVFJZQ09ERV90ICAgY291bnRyeUNvZGU7Cit9IENvdW50cnlJbmZvX3Q7CisvLyBzdHJ1Y3R1cmUgb2YgdGFibGUgdG8gbWFwIGNvdW50cnkgY29kZSBhbmQgcmVndWxhdG9yeSBkb21haW4KK3R5cGVkZWYgc3RydWN0Cit7CisgICB2X1UxNl90ICAgICAgICAgICBjb3VudHJ5Q291bnQ7CisgICBDb3VudHJ5SW5mb190ICAgICBjb3VudHJ5SW5mb1tNQVhfQ09VTlRSWV9DT1VOVF07Cit9IENvdW50cnlJbmZvVGFibGVfdDsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgVmFyaWFibGUgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gY2FjaGUgb2YgY291bnRyeSBpbmZvIHRhYmxlOworLy8gdGhpcyBpcyByZS1pbml0aWFsaXplZCBmcm9tIGRhdGEgb24gYmluYXJ5IGZpbGUKKy8vIGxvYWRlZCBvbiBkcml2ZXIgaW5pdGlhbGl6YXRpb24gaWYgYXZhaWxhYmxlCitzdGF0aWMgQ291bnRyeUluZm9UYWJsZV90IGNvdW50cnlJbmZvVGFibGUgPQoreworICAgIDI1NCwKKyAgICB7CisgICAgICAgIHsgUkVHRE9NQUlOX0ZDQywgeydVJywgJ1MnfX0sICAgICAgIC8vIFVTQSAtIG11c3QgYmUgdGhlIGZpcnN0IGNvdW50cnkgY29kZQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeydBJywgJ0QnfX0sICAgICAvL0FORE9SUkEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQseydBJywgJ0UnfX0sICAgLy9VQUUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsnQScsICdGJ319LCAgICAgLy9BRkdIQU5JU1RBTgorICAgICAgICB7IFJFR0RPTUFJTl9OT181R0haLCB7J0EnLCAnRyd9fSwgICAgIC8vQU5USUdVQSBBTkQgQkFSQlVEQQorICAgICAgICB7IFJFR0RPTUFJTl9OT181R0haLCB7J0EnLCAnSSd9fSwgICAgIC8vQU5HVUlMTEEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsnQScsICdMJ319LCAgICAgLy9BTEJBTklBCisgICAgICAgIHsgUkVHRE9NQUlOX05PXzVHSFosIHsnQScsICdNJ319LCAgICAgLy9BUk1FTklBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdBJywgJ04nfX0sICAgICAvL05FVEhFUkxBTkRTIEFOVElMTEVTCisgICAgICAgIHsgUkVHRE9NQUlOX05PXzVHSFosIHsgJ0EnLCAnTyd9fSwgICAgIC8vQU5HT0xBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdBJywgJ1EnfX0sICAgICAvL0FOVEFSQ1RJQ0EKKyAgICAgICAgeyBSRUdET01BSU5fSElfNUdIWix7ICdBJywgJ1InfX0sICAgLy9BUkdFTlRJTkEKKyAgICAgICAgeyBSRUdET01BSU5fRkNDLCB7ICdBJywgJ1MnfX0sICAgICAvL0FNRVJJQ0FOIFNPTU9BCisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksIHsgJ0EnLCAnVCd9fSwgICAgICAvL0FVU1RSSUEKKyAgICAgICAgeyBSRUdET01BSU5fQVBBQywgeyAnQScsICdVJ319LCAgICAgIC8vQVVTVFJBTElBCisgICAgICAgIHsgUkVHRE9NQUlOX05PXzVHSFosIHsgJ0EnLCAnVyd9fSwgICAgIC8vQVJVQkEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0EnLCAnWCd9fSwgICAgIC8vQUxBTkQgSVNMQU5EUworICAgICAgICB7IFJFR0RPTUFJTl9OT181R0haLCB7ICdBJywgJ1onfX0sICAgICAvL0FaRVJCQUlKQU4KKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0InLCAnQSd9fSwgICAgIC8vQk9TTklBIEFORCBIRVJaRUdPVklOQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQicsICdCJ319LCAgICAgLy9CQVJCQURPUworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQicsICdEJ319LCAgICAgLy9CQU5HTEFERVNICisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksICB7J0InLCAnRSd9fSwgICAgICAvL0JFTEdJVU0KKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0InLCAnRid9fSwgICAgIC8vQlVSS0lOQSBGQVNPCisgICAgICAgIHsgUkVHRE9NQUlOX0hJXzVHSFosIHsnQicsICdHJ319LCAgICAgIC8vQlVMR0FSSUEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0InLCAnSCd9fSwgICAgIC8vQkFIUkFJTgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQicsICdJJ319LCAgICAgLy9CVVJVTkRJCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdCJywgJ0onfX0sICAgICAvL0JFTklOCisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksIHsgJ0InLCAnTSd9fSwgICAgIC8vQkVSTVVEQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQicsICdOJ319LCAgICAgLy9CUlVORUkgREFSVVNTQUxBTQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCx7ICdCJywgJ08nfX0sICAgLy9CT0xJVklBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J0InLCAnUid9fSwgICAgICAgLy9CUkFaSUwKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0InLCAnUyd9fSwgICAgIC8vQkFIQU1BUworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQicsICdUJ319LCAgICAgLy9CSFVUQU4KKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0InLCAnVid9fSwgICAgIC8vQk9VVkVUIElTTEFORAorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQicsICdXJ319LCAgICAgLy9CT1RTV0FOQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQicsICdZJ319LCAgICAgLy9CRUxBUlVTCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdCJywgJ1onfX0sICAgICAvL0JFTElaRQorICAgICAgICB7IFJFR0RPTUFJTl9GQ0MsIHsnQycsICdBJ319LCAgICAgICAvL0NBTkFEQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQycsICdDJ319LCAgICAgLy9DT0NPUyAoS0VFTElORykgSVNMQU5EUworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQycsICdEJ319LCAgICAgLy9DT05HTywgVEhFIERFTU9DUkFUSUMgUkVQVUJMSUMgT0YgVEhFCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdDJywgJ0YnfX0sICAgICAvL0NFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQycsICdHJ319LCAgICAgLy9DT05HTworICAgICAgICB7IFJFR0RPTUFJTl9FVFNJLCB7J0MnLCAnSCd9fSwgICAgICAvL1NXSVRaRVJMQU5ECisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdDJywgJ0knfX0sICAgICAvL0NPVEUgRCdJVk9JUkUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0MnLCAnSyd9fSwgICAgIC8vQ09PSyBJU0xBTkRTCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J0MnLCAnTCd9fSwgICAgICAgLy9DSElMRQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQycsICdNJ319LCAgICAgLy9DQU1FUk9PTgorICAgICAgICB7IFJFR0RPTUFJTl9ISV81R0haLCB7J0MnLCAnTid9fSwgICAvL0NISU5BCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J0MnLCAnTyd9fSwgICAgICAgLy9DT0xPTUJJQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeydDJywgJ1InfX0sICAgICAgIC8vQ09TVEEgUklDQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnQycsICdVJ319LCAgICAgLy9DVUJBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdDJywgJ1YnfX0sICAgICAvL0NBUEUgVkVSREUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0MnLCAnWCd9fSwgICAgIC8vQ0hSSVNUTUFTIElTTEFORAorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeydDJywgJ1knfX0sICAgICAgLy9DWVBSVVMKKyAgICAgICAgeyBSRUdET01BSU5fSElfNUdIWiwgeydDJywgJ1onfX0sICAgICAgLy9DWkVDSCBSRVBVQkxJQworICAgICAgICB7IFJFR0RPTUFJTl9FVFNJLCB7J0QnLCAnRSd9fSwgICAgICAvL0dFUk1BTlkKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0QnLCAnSid9fSwgICAgIC8vREpJQk9VVEkKKyAgICAgICAgeyBSRUdET01BSU5fRVRTSSwgeydEJywgJ0snfX0sICAgICAgLy9ERU5NQVJLCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdEJywgJ00nfX0sICAgICAvL0RPTUlOSUNBCisgICAgICAgIHsgUkVHRE9NQUlOX05PXzVHSFoseyAnRCcsICdPJ319LCAgIC8vRE9NSU5JQ0FOIFJFUFVCTElDCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdEJywgJ1onfX0sICAgICAvL0FMR0VSSUEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQseyAnRScsICdDJ319LCAgIC8vRUNVQURPUgorICAgICAgICB7IFJFR0RPTUFJTl9ISV81R0haLCB7J0UnLCAnRSd9fSwgICAgICAvL0VTVE9OSUEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0UnLCAnRyd9fSwgICAgIC8vRUdZUFQKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0UnLCAnSCd9fSwgICAgIC8vV0VTVEVSTiBTQUhBUkEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0UnLCAnUid9fSwgICAgIC8vRVJJVFJFQQorICAgICAgICB7IFJFR0RPTUFJTl9FVFNJLCB7J0UnLCAnUyd9fSwgICAgICAvL1NQQUlOCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdFJywgJ1QnfX0sICAgICAvL0VUSElPUElBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J0YnLCAnSSd9fSwgICAgICAvL0ZJTkxBTkQKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0YnLCAnSid9fSwgICAgIC8vRklKSQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnRicsICdLJ319LCAgICAgLy9GQUxLTEFORCBJU0xBTkRTIChNQUxWSU5BUykKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0YnLCAnTSd9fSwgICAgIC8vTUlDUk9ORVNJQSwgRkVERVJBVEVEIFNUQVRFUyBPRgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnRicsICdPJ319LCAgICAgLy9GQVJPRSBJU0xBTkRTCisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksIHsnRicsICdSJ319LCAgICAgIC8vRlJBTkNFCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdHJywgJ0EnfX0sICAgICAvL0dBQk9OCisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksIHsnRycsICdCJ319LCAgICAgIC8vVU5JVEVEIEtJTkdET00KKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0cnLCAnRCd9fSwgICAgIC8vR1JFTkFEQQorICAgICAgICB7IFJFR0RPTUFJTl9ISV81R0haLCB7ICdHJywgJ0UnfX0sICAgICAvL0dFT1JHSUEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0cnLCAnRid9fSwgICAgIC8vRlJFTkNIIEdVSUFOQQorICAgICAgICB7IFJFR0RPTUFJTl9FVFNJLCB7J0cnLCAnRyd9fSwgICAgICAvL0dVRVJOU0VZCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdHJywgJ0gnfX0sICAgICAvL0dIQU5BCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J0cnLCAnSSd9fSwgICAgICAvL0dJQlJBTFRBUgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnRycsICdMJ319LCAgICAgLy9HUkVFTkxBTkQKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0cnLCAnTSd9fSwgICAgIC8vR0FNQklBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdHJywgJ04nfX0sICAgICAvL0dVSU5FQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnRycsICdQJ319LCAgICAgLy9HVUFERUxPVVBFCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdHJywgJ1EnfX0sICAgICAvL0VRVUFUT1JJQUwgR1VJTkVBCisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksIHsnRycsICdSJ319LCAgICAgIC8vR1JFRUNFCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdHJywgJ1MnfX0sICAgICAvL1NPVVRIIEdFT1JHSUEgQU5EIFRIRSBTT1VUSCBTQU5EV0lDSCBJU0xBTkRTCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELHsgJ0cnLCAnVCd9fSwgICAvL0dVQVRFTUFMQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnRycsICdVJ319LCAgICAgLy9HVUFNCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdHJywgJ1cnfX0sICAgICAvL0dVSU5FQS1CSVNTQVUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0cnLCAnWSd9fSwgICAgIC8vR1VZQU5BCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J0gnLCAnSyd9fSwgICAgICAvL0hPTkdLT05HCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdIJywgJ00nfX0sICAgICAvL0hFQVJEIElTTEFORCBBTkQgTUNET05BTEQgSVNMQU5EUworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCx7J0gnLCAnTid9fSwgICAvL0hPTkRVUkFTCisgICAgICAgIHsgUkVHRE9NQUlOX0hJXzVHSFosIHsnSCcsICdSJ319LCAgICAgIC8vQ1JPQVRJQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnSCcsICdUJ319LCAgICAgLy9IQUlUSQorICAgICAgICB7IFJFR0RPTUFJTl9ISV81R0haLCB7J0gnLCAnVSd9fSwgICAgICAvL0hVTkdBUlkKKyAgICAgICAgeyBSRUdET01BSU5fQVBBQywgeyAnSScsICdEJ319LCAgICAgLy9JTkRPTkVTSUEKKyAgICAgICAgeyBSRUdET01BSU5fRVRTSSwgeydJJywgJ0UnfX0sICAgICAvL0lSRUxBTkQKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsnSScsICdMJ319LCAgICAgICAgLy9JU1JFQUwKKyAgICAgICAgeyBSRUdET01BSU5fRVRTSSwgeydJJywgJ00nfX0sICAgICAgLy9JU0xFIE9GIE1BTgorICAgICAgICB7IFJFR0RPTUFJTl9BUEFDLCB7J0knLCAnTid9fSwgICAgICAvL0lORElBCisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksIHsgJ0knLCAnTyd9fSwgICAgIC8vQlJJVElTSCBJTkRJQU4gT0NFQU4gVEVSUklUT1JZCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdJJywgJ1EnfX0sICAgICAvL0lSQVEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0knLCAnUid9fSwgICAgIC8vSVJBTiwgSVNMQU1JQyBSRVBVQkxJQyBPRgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeydJJywgJ1MnfX0sICAgICAgLy9JQ0VMQU5ECisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksIHsnSScsICdUJ319LCAgICAgIC8vSVRBTFkKKyAgICAgICAgeyBSRUdET01BSU5fRVRTSSwgeydKJywgJ0UnfX0sICAgICAgLy9KRVJTRVkKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0onLCAnTSd9fSwgICAgIC8vSkFNQUlDQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnSicsICdPJ319LCAgICAgLy9KT1JEQU4KKyAgICAgICAgeyBSRUdET01BSU5fSkFQQU4sIHsnSicsICdQJ319LCAgICAgLy9KQVBBTgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnSycsICdFJ319LCAgICAgLy9LRU5ZQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnSycsICdHJ319LCAgICAgLy9LWVJHWVpTVEFOCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdLJywgJ0gnfX0sICAgICAvL0NBTUJPRElBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdLJywgJ0knfX0sICAgICAvL0tJUklCQVRJCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdLJywgJ00nfX0sICAgICAvL0NPTU9ST1MKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0snLCAnTid9fSwgICAgIC8vU0FJTlQgS0lUVFMgQU5EIE5FVklTCisgICAgICAgIHsgUkVHRE9NQUlOX0tPUkVBLCB7ICdLJywgJ1AnfX0sICAgICAvL0tPUkVBLCBERU1PQ1JBVElDIFBFT1BMRSdTIFJFUFVCTElDIE9GCisgICAgICAgIHsgUkVHRE9NQUlOX0tPUkVBLCB7J0snLCAnUid9fSwgICAgIC8vS09SRUEsIFJFUFVCTElDIE9GCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdLJywgJ1cnfX0sICAgICAvL0tVV0FJVAorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnSycsICdZJ319LCAgICAgLy9DQVlNQU4gSVNMQU5EUworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnSycsICdaJ319LCAgICAgLy9LQVpBS0hTVEFOCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdMJywgJ0EnfX0sICAgICAvL0xBTyBQRU9QTEUnUyBERU1PQ1JBVElDIFJFUFVCTElDCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdMJywgJ0InfX0sICAgICAvL0xFQkFOT04KKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ0wnLCAnQyd9fSwgICAgIC8vU0FJTlQgTFVDSUEKKyAgICAgICAgeyBSRUdET01BSU5fRVRTSSwgeydMJywgJ0knfX0sICAgICAgLy9MSUVDSFRFTlNURUlOCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdMJywgJ0snfX0sICAgICAvL1NSSSBMQU5LQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTCcsICdSJ319LCAgICAgLy9MSUJFUklBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdMJywgJ1MnfX0sICAgICAvL0xFU09USE8KKyAgICAgICAgeyBSRUdET01BSU5fSElfNUdIWiwgeydMJywgJ1QnfX0sICAgICAgLy9MSVRIVUFOSUEKKyAgICAgICAgeyBSRUdET01BSU5fRVRTSSwgeydMJywgJ1UnfX0sICAgICAgLy9MVVhFTUJPVVJHCisgICAgICAgIHsgUkVHRE9NQUlOX0hJXzVHSFosIHsnTCcsICdWJ319LCAgICAgIC8vTEFUVklBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdMJywgJ1knfX0sICAgICAvL0xJQllBTiBBUkFCIEpBTUFISVJJWUEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ00nLCAnQSd9fSwgICAgIC8vTU9ST0NDTworICAgICAgICB7IFJFR0RPTUFJTl9FVFNJLCB7J00nLCAnQyd9fSwgICAgICAvL01PTkFDTworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTScsICdEJ319LCAgICAgLy9NT0xET1ZBLCBSRVBVQkxJQyBPRgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTScsICdFJ319LCAgICAgLy9NT05URU5FR1JPCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdNJywgJ0cnfX0sICAgICAvL01BREFHQVNDQVIKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ00nLCAnSCd9fSwgICAgIC8vTUFSU0hBTEwgSVNMQU5EUworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTScsICdLJ319LCAgICAgLy9NQUNFRE9OSUEsIFRIRSBGT1JNRVIgWVVHT1NMQVYgUkVQVUJMSUMgT0YKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ00nLCAnTCd9fSwgICAgIC8vTUFMSQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTScsICdNJ319LCAgICAgLy9NWUFOTUFSCisgICAgICAgIHsgUkVHRE9NQUlOX0hJXzVHSFosIHsgJ00nLCAnTid9fSwgICAgIC8vTU9OR09MSUEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ00nLCAnTyd9fSwgICAgIC8vTUFDQU8KKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ00nLCAnUCd9fSwgICAgIC8vTk9SVEhFUk4gTUFSSUFOQSBJU0xBTkRTCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdNJywgJ1EnfX0sICAgICAvL01BUlRJTklRVUUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ00nLCAnUid9fSwgICAgIC8vTUFVUklUQU5JQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTScsICdTJ319LCAgICAgLy9NT05UU0VSUkFUCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J00nLCAnVCd9fSwgICAgICAvL01BTFRBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdNJywgJ1UnfX0sICAgICAvL01BVVJJVElVUworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTScsICdWJ319LCAgICAgLy9NQUxESVZFUworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTScsICdXJ319LCAgICAgLy9NQUxBV0kKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsnTScsICdYJ319LCAgICAgICAvL01FWElDTworICAgICAgICB7IFJFR0RPTUFJTl9ISV81R0haLHsgJ00nLCAnWSd9fSwgICAvL01BTEFZU0lBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdNJywgJ1onfX0sICAgICAvL01PWkFNQklRVUUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ04nLCAnQSd9fSwgICAgIC8vTkFNSUJJQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTicsICdDJ319LCAgICAgLy9ORVcgQ0FMRURPTklBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdOJywgJ0UnfX0sICAgICAvL05JR0VSCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdOJywgJ0YnfX0sICAgICAvL05PUkZPTEQgSVNMQU5ECisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdOJywgJ0cnfX0sICAgICAvL05JR0VSSUEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQseyAnTicsICdJJ319LCAgICAgICAvL05JQ0FSQUdVQQorICAgICAgICB7IFJFR0RPTUFJTl9FVFNJLCB7J04nLCAnTCd9fSwgICAgICAvL05FVEhFUkxBTkRTCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J04nLCAnTyd9fSwgICAgICAvL05PUldBWQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTicsICdQJ319LCAgICAgLy9ORVBBTAorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTicsICdSJ319LCAgICAgLy9OQVVSVQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnTicsICdVJ319LCAgICAgLy9OSVVFCisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksIHsnTicsICdaJ319LCAgICAgIC8vTkVXIFpFQUxBTkQKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ08nLCAnTSd9fSwgICAgIC8vT01BTgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeydQJywgJ0EnfX0sICAgICAgIC8vUEFOQU1BCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELHsgJ1AnLCAnRSd9fSwgICAvL1BFUlUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1AnLCAnRid9fSwgICAgIC8vRlJFTkNIIFBPTFlORVNJQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnUCcsICdHJ319LCAgICAgLy9QQVBVQSBORVcgR1VJTkVBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J1AnLCAnSCd9fSwgICAgICAvL1BISUxJUFBJTkVTCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdQJywgJ0snfX0sICAgICAvL1BBS0lTVEFOCisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksIHsnUCcsICdMJ319LCAgICAgIC8vUE9MQU5ECisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdQJywgJ00nfX0sICAgICAvL1NBSU5UIFBJRVJSRSBBTkQgTUlRVUVMT04KKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1AnLCAnTid9fSwgICAgIC8vV09STERQSVRDQUlSTgorICAgICAgICB7IFJFR0RPTUFJTl9GQ0MsIHsnUCcsICdSJ319LCAgICAgICAvL1BVRVJUTyBSSUNPCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J1AnLCAnUyd9fSwgICAgICAgIC8vUEFMRVNUSU5JQU4gVEVSUklUT1JZLCBPQ0NVUElFRAorICAgICAgICB7IFJFR0RPTUFJTl9FVFNJLCB7J1AnLCAnVCd9fSwgICAgICAvL1BPUlRVR0FMCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdQJywgJ1cnfX0sICAgICAvL1BBTEFVCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdQJywgJ1knfX0sICAgICAvL1BBUkFHVUFZCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdRJywgJ0EnfX0sICAgICAvL1FBVEFSCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdSJywgJ0UnfX0sICAgICAvL1JFVU5JT04KKyAgICAgICAgeyBSRUdET01BSU5fSElfNUdIWiwgeydSJywgJ08nfX0sICAgICAgLy9ST01BTklBCisgICAgICAgIHsgUkVHRE9NQUlOX0hJXzVHSFosIHsnUicsICdTJ319LCAgICAgIC8vU0VSQklBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J1InLCAnVSd9fSwgICAvL1JVU1NJQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnUicsICdXJ319LCAgICAgLy9SV0FOREEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsnUycsICdBJ319LCAgICAgIC8vU0FVREkgQVJBQklBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdTJywgJ0InfX0sICAgICAvL1NPTE9NT04gSVNMQU5EUworICAgICAgICB7IFJFR0RPTUFJTl9FVFNJLCB7J1MnLCAnQyd9fSwgICAgICAvL1NFWUNIRUxMRVMKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1MnLCAnRCd9fSwgICAgIC8vU1VEQU4KKyAgICAgICAgeyBSRUdET01BSU5fRVRTSSwgeydTJywgJ0UnfX0sICAgICAgLy9TV0VERU4KKyAgICAgICAgeyBSRUdET01BSU5fQVBBQywgeydTJywgJ0cnfX0sICAgICAgLy9TSU5HQVBPUkUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1MnLCAnSCd9fSwgICAgIC8vU0FJTlQgSEVMRU5BCisgICAgICAgIHsgUkVHRE9NQUlOX0hJXzVHSFosIHsnUycsICdJJ319LCAgICAgIC8vU0xPVkVOTklBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdTJywgJ0onfX0sICAgICAvL1NWQUxCQVJEIEFORCBKQU4gTUFZRU4KKyAgICAgICAgeyBSRUdET01BSU5fRVRTSSwgeydTJywgJ0snfX0sICAgICAgLy9TTE9WQUtJQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnUycsICdMJ319LCAgICAgLy9TSUVSUkEgTEVPTkUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1MnLCAnTSd9fSwgICAgIC8vU0FOIE1BUklOTworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnUycsICdOJ319LCAgICAgLy9TRU5FR0FMCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdTJywgJ08nfX0sICAgICAvL1NPTUFMSUEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1MnLCAnUid9fSwgICAgIC8vU1VSSU5BTUUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1MnLCAnVCd9fSwgICAgIC8vU0FPIFRPTUUgQU5EIFBSSU5DSVBFCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J1MnLCAnVid9fSwgICAgICAgLy9FTCBTQUxWQURPUgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnUycsICdZJ319LCAgICAgLy9TWVJJQU4gQVJBQiBSRVBVQkxJQworICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnUycsICdaJ319LCAgICAgLy9TV0FaSUxBTkQKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1QnLCAnQyd9fSwgICAgIC8vVFVSS1MgQU5EIENBSUNPUyBJU0xBTkRTCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdUJywgJ0QnfX0sICAgICAvL0NIQUQKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1QnLCAnRid9fSwgICAgIC8vRlJFTkNIIFNPVVRIRVJOIFRFUlJJVE9SSUVTCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdUJywgJ0cnfX0sICAgICAvL1RPR08KKyAgICAgICAgeyBSRUdET01BSU5fV09STEQseyAnVCcsICdIJ319LCAgIC8vVEhBSUxBTkQKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1QnLCAnSid9fSwgICAgIC8vVEFKSUtJU1RBTgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnVCcsICdLJ319LCAgICAgLy9UT0tFTEFVCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdUJywgJ0wnfX0sICAgICAvL1RJTU9SLUxFU1RFCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdUJywgJ00nfX0sICAgICAvL1RVUktNRU5JU1RBTgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnVCcsICdOJ319LCAgICAgLy9UVU5JU0lBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdUJywgJ08nfX0sICAgICAvL1RPTkdBCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J1QnLCAnUid9fSwgICAgICAvL1RVUktFWQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnVCcsICdUJ319LCAgICAgLy9UUklOSURBRCBBTkQgVE9CQUdPCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7ICdUJywgJ1YnfX0sICAgICAvL1RVVkFMVQorICAgICAgICB7IFJFR0RPTUFJTl9ISV81R0haLHsgJ1QnLCAnVyd9fSwgICAvL1RBSVdBTiwgUFJPVklOQ0UgT0YgQ0hJTkEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1QnLCAnWid9fSwgICAgIC8vVEFOWkFOSUEsIFVOSVRFRCBSRVBVQkxJQyBPRgorICAgICAgICB7IFJFR0RPTUFJTl9ISV81R0haLHsgJ1UnLCAnQSd9fSwgICAvL1VLUkFJTkUKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1UnLCAnRyd9fSwgICAgIC8vVUdBTkRBCisgICAgICAgIHsgUkVHRE9NQUlOX0ZDQywgeydVJywgJ00nfX0sICAgICAgIC8vVU5JVEVEIFNUQVRFUyBNSU5PUiBPVVRMWUlORyBJU0xBTkRTCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELHsgJ1UnLCAnWSd9fSwgICAvL1VSVUdVQVkKKyAgICAgICAgeyBSRUdET01BSU5fSElfNUdIWiwgeyAnVScsICdaJ319LCAgICAgLy9VWkJFS0lTVEFOCisgICAgICAgIHsgUkVHRE9NQUlOX0VUU0ksIHsnVicsICdBJ319LCAgICAgIC8vSE9MWSBTRUUgKFZBVElDQU4gQ0lUWSBTVEFURSkKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1YnLCAnQyd9fSwgICAgIC8vU0FJTlQgVklOQ0VOVCBBTkQgVEhFIEdSRU5BRElORVMKKyAgICAgICAgeyBSRUdET01BSU5fSElfNUdIWix7ICdWJywgJ0UnfX0sICAgLy9WRU5FWlVFTEEKKyAgICAgICAgeyBSRUdET01BSU5fRVRTSSwgeydWJywgJ0cnfX0sICAgICAgIC8vVklSR0lOIElTTEFORFMsIEJSSVRJU0gKKyAgICAgICAgeyBSRUdET01BSU5fRkNDLCB7J1YnLCAnSSd9fSwgICAgICAgLy9WSVJHSU4gSVNMQU5EUywgVVMKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsnVicsICdOJ319LCAgICAgIC8vVklFVCBOQU0KKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1YnLCAnVSd9fSwgICAgIC8vVkFOVUFUVQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnVycsICdGJ319LCAgICAgLy9XQUxMSVMgQU5EIEZVVFVOQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnVycsICdTJ319LCAgICAgLy9TT01PQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnWScsICdFJ319LCAgICAgLy9ZRU1FTgorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnWScsICdUJ319LCAgICAgLy9NQVlPVFRFCisgICAgICAgIHsgUkVHRE9NQUlOX1dPUkxELCB7J1onLCAnQSd9fSwgICAgICAvL1NPVVRIIEFGUklDQQorICAgICAgICB7IFJFR0RPTUFJTl9XT1JMRCwgeyAnWicsICdNJ319LCAgICAgLy9aQU1CSUEKKyAgICAgICAgeyBSRUdET01BSU5fV09STEQsIHsgJ1onLCAnVyd9fSwgICAgIC8vWklNQkFCV0UKKyAgICAgICAgeyBSRUdET01BSU5fS09SRUEsIHsnSycsICcxJ319LCAgICAgLy9Lb3JlYSBhbHRlcm5hdGUgMQorICAgICAgICB7IFJFR0RPTUFJTl9LT1JFQSwgeydLJywgJzInfX0sICAgICAvL0tvcmVhIGFsdGVybmF0ZSAyCisgICAgICAgIHsgUkVHRE9NQUlOX0tPUkVBLCB7J0snLCAnMyd9fSwgICAgIC8vS29yZWEgYWx0ZXJuYXRlIDMKKyAgICAgICAgeyBSRUdET01BSU5fS09SRUEsIHsnSycsICc0J319LCAgICAgIC8vS29yZWEgYWx0ZXJuYXRlIDQKKyAgICAgICAgeyBSRUdET01BSU5fRVRTSSwgeydFJywgJ1UnfX0sICAgICAgIC8vRXVyb3BlIChTU0dGSSkKKyAgICAgICAgeyBSRUdET01BSU5fSkFQQU4sIHsnSicsICcxJ319LCAgICAgLy9KYXBhbiBhbHRlcm5hdGUgMQorICAgICAgICB7IFJFR0RPTUFJTl9KQVBBTiwgeydKJywgJzInfX0sICAgICAvL0phcGFuIGFsdGVybmF0ZSAyCisgICAgICAgIHsgUkVHRE9NQUlOX0pBUEFOLCB7J0onLCAnMyd9fSwgICAgIC8vSmFwYW4gYWx0ZXJuYXRlIDMKKyAgICAgICAgeyBSRUdET01BSU5fSkFQQU4sIHsnSicsICc0J319LCAgICAgLy9KYXBhbiBhbHRlcm5hdGUgNAorICAgICAgICB7IFJFR0RPTUFJTl9KQVBBTiwgeydKJywgJzUnfX0gICAgICAvL0phcGFuIGFsdGVybmF0ZSA1CisgICAgfQorfTsKK3R5cGVkZWYgc3RydWN0IG52RUZTVGFibGVfcworeworICAgdl9VMzJfdCAgICBudlZhbGlkaXR5Qml0bWFwOworICAgc0hhbE52ICAgICBoYWxudjsKK30gbnZFRlNUYWJsZV90OworbnZFRlNUYWJsZV90ICpnbnZFRlNUYWJsZT1OVUxMOworLyogRUZTIFRhYmxlICB0byBzZW5kIHRoZSBOViBzdHJ1Y3R1cmUgdG8gSEFMKi8gCitzdGF0aWMgbnZFRlNUYWJsZV90ICpwbnZFRlNUYWJsZSA9TlVMTDsKKworY29uc3QgdFJmQ2hhbm5lbFByb3BzIHJmQ2hhbm5lbHNbTlVNX1JGX0NIQU5ORUxTXSA9Cit7CisgICAgLy9SRl9TVUJCQU5EXzJfNF9HSFoKKyAgICAvL2ZyZXEsIGNoYW4jLCBiYW5kCisgICAgeyAyNDEyLCAxICAsIFJGX1NVQkJBTkRfMl80X0dIWn0sICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICB7IDI0MTcsIDIgICwgUkZfU1VCQkFORF8yXzRfR0hafSwgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgIHsgMjQyMiwgMyAgLCBSRl9TVUJCQU5EXzJfNF9HSFp9LCAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgeyAyNDI3LCA0ICAsIFJGX1NVQkJBTkRfMl80X0dIWn0sICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICB7IDI0MzIsIDUgICwgUkZfU1VCQkFORF8yXzRfR0hafSwgICAgICAgIC8vUkZfQ0hBTl81LAorICAgIHsgMjQzNywgNiAgLCBSRl9TVUJCQU5EXzJfNF9HSFp9LCAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgeyAyNDQyLCA3ICAsIFJGX1NVQkJBTkRfMl80X0dIWn0sICAgICAgICAvL1JGX0NIQU5fNywKKyAgICB7IDI0NDcsIDggICwgUkZfU1VCQkFORF8yXzRfR0hafSwgICAgICAgIC8vUkZfQ0hBTl84LAorICAgIHsgMjQ1MiwgOSAgLCBSRl9TVUJCQU5EXzJfNF9HSFp9LCAgICAgICAgLy9SRl9DSEFOXzksCisgICAgeyAyNDU3LCAxMCAsIFJGX1NVQkJBTkRfMl80X0dIWn0sICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgeyAyNDYyLCAxMSAsIFJGX1NVQkJBTkRfMl80X0dIWn0sICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgeyAyNDY3LCAxMiAsIFJGX1NVQkJBTkRfMl80X0dIWn0sICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgeyAyNDcyLCAxMyAsIFJGX1NVQkJBTkRfMl80X0dIWn0sICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgeyAyNDg0LCAxNCAsIFJGX1NVQkJBTkRfMl80X0dIWn0sICAgICAgICAvL1JGX0NIQU5fMTQsCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgeyAwLCAgICAyNDAsIFJGX1NVQkJBTkRfNF85X0dIWn0sICAgICAgICAvL1JGX0NIQU5fMjQwLAorICAgIHsgMCwgICAgMjQ0LCBSRl9TVUJCQU5EXzRfOV9HSFp9LCAgICAgICAgLy9SRl9DSEFOXzI0NCwKKyAgICB7IDAsICAgIDI0OCwgUkZfU1VCQkFORF80XzlfR0hafSwgICAgICAgIC8vUkZfQ0hBTl8yNDgsCisgICAgeyAwLCAgICAyNTIsIFJGX1NVQkJBTkRfNF85X0dIWn0sICAgICAgICAvL1JGX0NIQU5fMjUyLAorICAgIHsgMCwgICAgMjA4LCBSRl9TVUJCQU5EXzRfOV9HSFp9LCAgICAgICAgLy9SRl9DSEFOXzIwOCwKKyAgICB7IDAsICAgIDIxMiwgUkZfU1VCQkFORF80XzlfR0hafSwgICAgICAgIC8vUkZfQ0hBTl8yMTIsCisgICAgeyAwLCAgICAyMTYsIFJGX1NVQkJBTkRfNF85X0dIWn0sICAgICAgICAvL1JGX0NIQU5fMjE2LAorICAgIHsgNTE4MCwgMzYgLCBSRl9TVUJCQU5EXzVfTE9XX0dIWn0sICAgICAgLy9SRl9DSEFOXzM2LAorICAgIHsgNTIwMCwgNDAgLCBSRl9TVUJCQU5EXzVfTE9XX0dIWn0sICAgICAgLy9SRl9DSEFOXzQwLAorICAgIHsgNTIyMCwgNDQgLCBSRl9TVUJCQU5EXzVfTE9XX0dIWn0sICAgICAgLy9SRl9DSEFOXzQ0LAorICAgIHsgNTI0MCwgNDggLCBSRl9TVUJCQU5EXzVfTE9XX0dIWn0sICAgICAgLy9SRl9DSEFOXzQ4LAorICAgIHsgNTI2MCwgNTIgLCBSRl9TVUJCQU5EXzVfTE9XX0dIWn0sICAgICAgLy9SRl9DSEFOXzUyLAorICAgIHsgNTI4MCwgNTYgLCBSRl9TVUJCQU5EXzVfTE9XX0dIWn0sICAgICAgLy9SRl9DSEFOXzU2LAorICAgIHsgNTMwMCwgNjAgLCBSRl9TVUJCQU5EXzVfTE9XX0dIWn0sICAgICAgLy9SRl9DSEFOXzYwLAorICAgIHsgNTMyMCwgNjQgLCBSRl9TVUJCQU5EXzVfTE9XX0dIWn0sICAgICAgLy9SRl9DSEFOXzY0LAorICAgIHsgNTUwMCwgMTAwLCBSRl9TVUJCQU5EXzVfTUlEX0dIWn0sICAgICAgLy9SRl9DSEFOXzEwMCwKKyAgICB7IDU1MjAsIDEwNCwgUkZfU1VCQkFORF81X01JRF9HSFp9LCAgICAgIC8vUkZfQ0hBTl8xMDQsCisgICAgeyA1NTQwLCAxMDgsIFJGX1NVQkJBTkRfNV9NSURfR0hafSwgICAgICAvL1JGX0NIQU5fMTA4LAorICAgIHsgNTU2MCwgMTEyLCBSRl9TVUJCQU5EXzVfTUlEX0dIWn0sICAgICAgLy9SRl9DSEFOXzExMiwKKyAgICB7IDU1ODAsIDExNiwgUkZfU1VCQkFORF81X01JRF9HSFp9LCAgICAgIC8vUkZfQ0hBTl8xMTYsCisgICAgeyA1NjAwLCAxMjAsIFJGX1NVQkJBTkRfNV9NSURfR0hafSwgICAgICAvL1JGX0NIQU5fMTIwLAorICAgIHsgNTYyMCwgMTI0LCBSRl9TVUJCQU5EXzVfTUlEX0dIWn0sICAgICAgLy9SRl9DSEFOXzEyNCwKKyAgICB7IDU2NDAsIDEyOCwgUkZfU1VCQkFORF81X01JRF9HSFp9LCAgICAgIC8vUkZfQ0hBTl8xMjgsCisgICAgeyA1NjYwLCAxMzIsIFJGX1NVQkJBTkRfNV9NSURfR0hafSwgICAgICAvL1JGX0NIQU5fMTMyLAorICAgIHsgNTY4MCwgMTM2LCBSRl9TVUJCQU5EXzVfTUlEX0dIWn0sICAgICAgLy9SRl9DSEFOXzEzNiwKKyAgICB7IDU3MDAsIDE0MCwgUkZfU1VCQkFORF81X01JRF9HSFp9LCAgICAgIC8vUkZfQ0hBTl8xNDAsCisgICAgeyA1NzQ1LCAxNDksIFJGX1NVQkJBTkRfNV9ISUdIX0dIWn0sICAgICAvL1JGX0NIQU5fMTQ5LAorICAgIHsgNTc2NSwgMTUzLCBSRl9TVUJCQU5EXzVfSElHSF9HSFp9LCAgICAgLy9SRl9DSEFOXzE1MywKKyAgICB7IDU3ODUsIDE1NywgUkZfU1VCQkFORF81X0hJR0hfR0hafSwgICAgIC8vUkZfQ0hBTl8xNTcsCisgICAgeyA1ODA1LCAxNjEsIFJGX1NVQkJBTkRfNV9ISUdIX0dIWn0sICAgICAvL1JGX0NIQU5fMTYxLAorICAgIHsgNTgyNSwgMTY1LCBSRl9TVUJCQU5EXzVfSElHSF9HSFp9LCAgICAgLy9SRl9DSEFOXzE2NSwKKyAgICB7IDAgICAsIDAgICwgTlVNX1JGX1NVQkJBTkRTfSwgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzMsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80LAorICAgIHsgMCAgICwgMCAgLCBOVU1fUkZfU1VCQkFORFN9LCAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNSwKKyAgICB7IDAgICAsIDAgICwgTlVNX1JGX1NVQkJBTkRTfSwgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzYsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF83LAorICAgIHsgMCAgICwgMCAgLCBOVU1fUkZfU1VCQkFORFN9LCAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfOCwKKyAgICB7IDAgICAsIDAgICwgTlVNX1JGX1NVQkJBTkRTfSwgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzksCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMCwKKyAgICB7IDAgICAsIDAgICwgTlVNX1JGX1NVQkJBTkRTfSwgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzExLAorICAgIHsgMCAgICwgMCAgLCBOVU1fUkZfU1VCQkFORFN9LCAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjQyLAorICAgIHsgMCAgICwgMCAgLCBOVU1fUkZfU1VCQkFORFN9LCAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjQ2LAorICAgIHsgMCAgICwgMCAgLCBOVU1fUkZfU1VCQkFORFN9LCAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjUwLAorICAgIHsgMCAgICwgMCAgLCBOVU1fUkZfU1VCQkFORFN9LCAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjEwLAorICAgIHsgMCAgICwgMCAgLCBOVU1fUkZfU1VCQkFORFN9LCAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjE0LAorICAgIHsgMCAgICwgMCAgLCBOVU1fUkZfU1VCQkFORFN9LCAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMzgsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80MiwKKyAgICB7IDAgICAsIDAgICwgTlVNX1JGX1NVQkJBTkRTfSwgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQ2LAorICAgIHsgMCAgICwgMCAgLCBOVU1fUkZfU1VCQkFORFN9LCAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNTAsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81NCwKKyAgICB7IDAgICAsIDAgICwgTlVNX1JGX1NVQkJBTkRTfSwgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzU4LAorICAgIHsgMCAgICwgMCAgLCBOVU1fUkZfU1VCQkFORFN9LCAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNjIsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMDIsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMDYsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTAsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTQsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTgsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMjIsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMjYsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzAsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzQsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzgsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xNTEsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xNTUsCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xNTksCisgICAgeyAwICAgLCAwICAsIE5VTV9SRl9TVUJCQU5EU30sICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xNjMsCisjZW5kaWYKK307CisKK2V4dGVybiBjb25zdCBzSGFsTnYgbnZEZWZhdWx0czsKKworY29uc3Qgc1JlZ3VsYXRvcnlDaGFubmVsICogcmVnQ2hhbm5lbHMgPSBudkRlZmF1bHRzLnRhYmxlcy5yZWdEb21haW5zWzBdLmNoYW5uZWxzOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEZ1bmN0aW9uIERlZmluaXRpb25zIGFuZCBEb2N1bWVudGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgd2xhbl93cml0ZV90b19lZnMgKHZfVThfdCAqcERhdGEsIHZfVTE2X3QgZGF0YV9sZW4pOworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiB2b3NfbnZfaW5pdCgpIC0gaW5pdGlhbGl6ZSB0aGUgTlYgbW9kdWxlCisgIFRoZSBcYSB2b3NfbnZfaW5pdCgpIGluaXRpYWxpemVzIHRoZSBOViBtb2R1bGUuICBUaGlzIHJlYWQgdGhlIGJpbmFyeQorICBmaWxlIGZvciBjb3VudHJ5IGNvZGUgYW5kIHJlZ3VsYXRvcnkgZG9tYWluIGluZm9ybWF0aW9uLgorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG1vZHVsZSBpcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBvdGhlcndpc2UgIC0gbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19udl9pbml0KHZvaWQpCit7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCitWT1NfU1RBVFVTIHZvc19udl9vcGVuKHZvaWQpCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQ9IE5VTEw7CisgICAgdl9TSVpFX3QgYnVmU2l6ZTsKKyAgICB2X0JPT0xfdCBpdGVtSXNWYWxpZCA9IFZPU19GQUxTRTsKKyAgICAKKyAgICAvKkdldCB0aGUgZ2xvYmFsIGNvbnRleHQgKi8KKyAgICBwVm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9TWVMsIE5VTEwpOworICAgIGJ1ZlNpemUgPSBzaXplb2YobnZFRlNUYWJsZV90KTsKKyAgICBzdGF0dXMgPSBoZGRfcmVxdWVzdF9maXJtd2FyZShXTEFOX05WX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWb3NDb250ZXh0VHlwZSopKHBWb3NDb250ZXh0KSktPnBIRERDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1ZPSURfdCoqKSZnbnZFRlNUYWJsZSwgJmJ1ZlNpemUpOworCisgICAgaWYgKCAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyggc3RhdHVzICkpIHx8ICFnbnZFRlNUYWJsZSkKKyAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gZG93bmxvYWQgTlYgZmlsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBXTEFOX05WX0ZJTEUpOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9SRVNPVVJDRVM7CisgICAgfQorCisgICAgIC8qIENvcHlpbmcgdGhlIHJlYWQgbnYgZGF0YSB0byB0aGUgZ2xvYmEgTlYgRUZTIHRhYmxlICovCisgICAgeworICAgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gZ2xvYmFsIE5WIHRhYmxlICovCisgICAgICAgIHBudkVGU1RhYmxlID0gKG52RUZTVGFibGVfdCAqKXZvc19tZW1fbWFsbG9jKHNpemVvZihudkVGU1RhYmxlX3QpKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcG52RUZTVGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMgOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBOViIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgLypDb3B5aW5nIHRoZSBOViBkZWZhdWx0cyAqLworICAgICAgICB2b3NfbWVtX2NvcHkoJihwbnZFRlNUYWJsZS0+aGFsbnYpLCZudkRlZmF1bHRzLHNpemVvZihzSGFsTnYpKTsKKyAgICAgICAgcG52RUZTVGFibGUtPm52VmFsaWRpdHlCaXRtYXAgPSBnbnZFRlNUYWJsZS0+bnZWYWxpZGl0eUJpdG1hcDsKKworICAgICAgICAvKiBDb3B5IHRoZSB2YWxpZCBmaWVsZHMgdG8gdGhlIE5WIEdsb2JhbCBzdHJ1Y3R1cmUgKi8gCisgICAgICAgIGlmICh2b3NfbnZfZ2V0VmFsaWRpdHkoVk5WX0ZJRUxEX0lNQUdFLCAmaXRlbUlzVmFsaWQpID09IAorICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpdGVtSXNWYWxpZCA9PSBWT1NfVFJVRSkgeworCisgICAgICAgICAgICAgICAgaWYodm9zX252X3JlYWQoIFZOVl9GSUVMRF9JTUFHRSwgKHZfVk9JRF90ICopJnBudkVGU1RhYmxlLT5oYWxudi5maWVsZHMsCisgICAgICAgICAgICAgICAgICAgTlVMTCwgc2l6ZW9mKHNOdkZpZWxkcykgKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlSEFMX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh2b3NfbnZfZ2V0VmFsaWRpdHkoVk5WX1JBVEVfVE9fUE9XRVJfVEFCTEUsICZpdGVtSXNWYWxpZCkgPT0gCisgICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXRlbUlzVmFsaWQgPT0gVk9TX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodm9zX252X3JlYWQoIFZOVl9SQVRFX1RPX1BPV0VSX1RBQkxFLCAKKyAgICAgICAgICAgICAgICAgICh2X1ZPSURfdCAqKSZwbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnB3ck9wdGltdW1bMF0sCisgICAgICAgICAgICAgICAgICBOVUxMLCBzaXplb2YodFJhdGVHcm91cFB3cikgKiBOVU1fUkZfU1VCQkFORFMgKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICByZXR1cm4gKGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHZvc19udl9nZXRWYWxpZGl0eShWTlZfUkVHVUxBUlRPUllfRE9NQUlOX1RBQkxFLCAmaXRlbUlzVmFsaWQpID09IAorICAgICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgCisgICAgICAgICAgICBpZiAoaXRlbUlzVmFsaWQgPT0gVk9TX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodm9zX252X3JlYWQoIFZOVl9SRUdVTEFSVE9SWV9ET01BSU5fVEFCTEUsCisgICAgICAgICAgICAgICAgKHZfVk9JRF90ICopJnBudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucmVnRG9tYWluc1swXSwKKyAgICAgICAgICAgICAgICAgTlVMTCwgc2l6ZW9mKHNSZWd1bGF0b3J5RG9tYWlucykgKiBOVU1fUkVHX0RPTUFJTlMgKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUhBTF9TVEFUVVNfRkFJTFVSRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodm9zX252X2dldFZhbGlkaXR5KFZOVl9ERUZBVUxUX0xPQ0FUSU9OLCAmaXRlbUlzVmFsaWQpID09IAorICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXRlbUlzVmFsaWQgPT0gVk9TX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodm9zX252X3JlYWQoIFZOVl9ERUZBVUxUX0xPQ0FUSU9OLAorICAgICAgICAgICAgICAgICh2X1ZPSURfdCAqKSZwbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLmRlZmF1bHRDb3VudHJ5VGFibGUsCisgICAgICAgICAgICAgICAgTlVMTCwgc2l6ZW9mKHNEZWZhdWx0Q291bnRyeSkgKSAhPSAgVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlSEFMX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIAorICAgICAgICBpZiAodm9zX252X2dldFZhbGlkaXR5KFZOVl9UUENfUE9XRVJfVEFCTEUsICZpdGVtSXNWYWxpZCkgPT0gCisgICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpdGVtSXNWYWxpZCA9PSBWT1NfVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih2b3NfbnZfcmVhZCggVk5WX1RQQ19QT1dFUl9UQUJMRSwgCisgICAgICAgICAgICAgICAgICAodl9WT0lEX3QgKikmcG52RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wbHV0Q2hhcmFjdGVyaXplZFswXSwKKyAgICAgICAgICAgICAgICAgIE5VTEwsIHNpemVvZih0VHBjUG93ZXJUYWJsZSkgKiBOVU1fUkZfQ0hBTk5FTFMgKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgCisgICAgICAgIGlmICh2b3NfbnZfZ2V0VmFsaWRpdHkoVk5WX1RQQ19QREFEQ19PRkZTRVRTLCAmaXRlbUlzVmFsaWQpID09IAorICAgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXRlbUlzVmFsaWQgPT0gVk9TX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodm9zX252X3JlYWQoIFZOVl9UUENfUERBRENfT0ZGU0VUUywKKyAgICAgICAgICAgICAgICAgICh2X1ZPSURfdCAqKSZwbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnBsdXRQZGFkY09mZnNldFswXSwKKyAgICAgICAgICAgICAgICAgIE5VTEwsIHNpemVvZih0QU5JX1UxNikgKiBOVU1fUkZfQ0hBTk5FTFMgKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2b3NfbnZfZ2V0VmFsaWRpdHkoVk5WX1JTU0lfQ0hBTk5FTF9PRkZTRVRTLCAmaXRlbUlzVmFsaWQpID09IAorICAgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpdGVtSXNWYWxpZCA9PSBWT1NfVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih2b3NfbnZfcmVhZCggVk5WX1JTU0lfQ0hBTk5FTF9PRkZTRVRTLAorICAgICAgICAgICAgICAgICAgKHZfVk9JRF90ICopJnBudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucnNzaUNoYW5PZmZzZXRzWzBdLAorICAgICAgICAgICAgICAgICAgTlVMTCwgc2l6ZW9mKHNSc3NpQ2hhbm5lbE9mZnNldHMpICogMiApICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUhBTF9TVEFUVVNfRkFJTFVSRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYgKHZvc19udl9nZXRWYWxpZGl0eShWTlZfUkZfQ0FMX1ZBTFVFUywgJml0ZW1Jc1ZhbGlkKSA9PSAKKyAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGl0ZW1Jc1ZhbGlkID09IFZPU19UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHZvc19udl9yZWFkKCBWTlZfUkZfQ0FMX1ZBTFVFUywgKHZfVk9JRF90ICopJnBudkVGU1RhYmxlLT5oYWxudgorICAgIC50YWJsZXMuckZDYWxWYWx1ZXMsIE5VTEwsIHNpemVvZihzUkZDYWxWYWx1ZXMpICkgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlSEFMX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh2b3NfbnZfZ2V0VmFsaWRpdHkoVk5WX0FOVEVOTkFfUEFUSF9MT1NTLCAmaXRlbUlzVmFsaWQpID09IAorICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXRlbUlzVmFsaWQgPT0gVk9TX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodm9zX252X3JlYWQoIFZOVl9BTlRFTk5BX1BBVEhfTE9TUywKKyAgICAgICAgICAgICAgICAgICh2X1ZPSURfdCAqKSZwbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLmFudGVubmFQYXRoTG9zc1swXSwgTlVMTCwgCisgICAgICAgICAgICAgICAgc2l6ZW9mKHRBTklfUzE2KSpOVU1fUkZfQ0hBTk5FTFMgKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2b3NfbnZfZ2V0VmFsaWRpdHkoVk5WX1BBQ0tFVF9UWVBFX1BPV0VSX0xJTUlUUywgJml0ZW1Jc1ZhbGlkKSA9PSAKKyAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGl0ZW1Jc1ZhbGlkID09IFZPU19UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHZvc19udl9yZWFkKCBWTlZfUEFDS0VUX1RZUEVfUE9XRVJfTElNSVRTLCAKKyAgICAgICAgICAgICAgICAgICh2X1ZPSURfdCAqKSZwbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnBrdFR5cGVQd3JMaW1pdHNbMF0sIE5VTEwsIAorICAgICAgICAgICAgICAgIHNpemVvZih0QU5JX1MxNikqTlVNXzgwMl8xMV9NT0RFUypOVU1fUkZfQ0hBTk5FTFMgKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHZvc19udl9nZXRWYWxpZGl0eShWTlZfT0ZETV9DTURfUFdSX09GRlNFVCwgJml0ZW1Jc1ZhbGlkKSA9PSAKKyAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGl0ZW1Jc1ZhbGlkID09IFZPU19UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHZvc19udl9yZWFkKCBWTlZfT0ZETV9DTURfUFdSX09GRlNFVCwgCisgICAgICAgICAgICAgICAgICAodl9WT0lEX3QgKikmcG52RUZTVGFibGUtPmhhbG52LnRhYmxlcy5vZmRtQ21kUHdyT2Zmc2V0LCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNPZmRtQ21kUHdyT2Zmc2V0KSkgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlSEFMX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh2b3NfbnZfZ2V0VmFsaWRpdHkoVk5WX1RYX0JCX0ZJTFRFUl9NT0RFLCAmaXRlbUlzVmFsaWQpID09IAorICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXRlbUlzVmFsaWQgPT0gVk9TX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZih2b3NfbnZfcmVhZChWTlZfVFhfQkJfRklMVEVSX01PREUsIAorICAgICAgICAgICAgICAgICAgKHZfVk9JRF90ICopJnBudkVGU1RhYmxlLT5oYWxudi50YWJsZXMudHhiYkZpbHRlck1vZGUsIE5VTEwsIAorICAgICAgICAgICAgICAgIHNpemVvZihzVHhCYkZpbHRlck1vZGUpKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVIQUxfU1RBVFVTX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2b3NfbnZfZ2V0VmFsaWRpdHkoVk5WX1RBQkxFX1ZJUlRVQUxfUkFURSwgJml0ZW1Jc1ZhbGlkKSA9PSAKKyAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGl0ZW1Jc1ZhbGlkID09IFZPU19UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYodm9zX252X3JlYWQoVk5WX1RBQkxFX1ZJUlRVQUxfUkFURSwgCisgICAgICAgICAgICAgICAgICAodl9WT0lEX3QgKikmcG52RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wd3JPcHRpbXVtX3ZpcnR1YWxSYXRlLCBOVUxMLCAKKyAgICAgICAgICAgICAgICBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wd3JPcHRpbXVtX3ZpcnR1YWxSYXRlKSkgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlSEFMX1NUQVRVU19GQUlMVVJFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK1ZPU19TVEFUVVMgdm9zX252X2Nsb3NlKHZvaWQpCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQ9IE5VTEw7CisgICAgICAgICAvKkdldCB0aGUgZ2xvYmFsIGNvbnRleHQgKi8KKyAgICBwVm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9TWVMsIE5VTEwpOworICAgIHN0YXR1cyA9IGhkZF9yZWxlYXNlX2Zpcm13YXJlKFdMQU5fTlZfRklMRSwgKChWb3NDb250ZXh0VHlwZSopKHBWb3NDb250ZXh0KSktPnBIRERDb250ZXh0KTsKKyAgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcyA6IHZvc19vcGVuIGZhaWxlZFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisgICAgdm9zX21lbV9mcmVlKHBudkVGU1RhYmxlKTsKKyAgICBnbnZFRlNUYWJsZT1OVUxMOworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHZvc19udl9nZXRSZWdEb21haW5Gcm9tQ291bnRyeUNvZGUoKSAtIGdldCB0aGUgcmVndWxhdG9yeSBkb21haW4gb2YKKyAgYSBjb3VudHJ5IGdpdmVuIGl0cyBjb3VudHJ5IGNvZGUKKyAgVGhlIFxhIHZvc19udl9nZXRSZWdEb21haW5Gcm9tQ291bnRyeUNvZGUoKSByZXR1cm5zIHRoZSByZWd1bGF0b3J5IGRvbWFpbiBvZgorICBhIGNvdW50cnkgZ2l2ZW4gaXRzIGNvdW50cnkgY29kZS4gIFRoaXMgaXMgZG9uZSBmcm9tIHJlYWRpbmcgYSBjYWNoZWQKKyAgY29weSBvZiB0aGUgYmluYXJ5IGZpbGUuCisgIFxwYXJhbSBwUmVnRG9tYWluICAtIHBvaW50ZXIgdG8gcmVndWxhdG9yeSBkb21haW4KKyAgXHBhcmFtIGNvdW50cnlDb2RlIC0gY291bnRyeSBjb2RlCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gcmVndWxhdG9yeSBkb21haW4gaXMgZm91bmQgZm9yIHRoZSBnaXZlbiBjb3VudHJ5CisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gaW52YWxpZCBwb2ludGVyIGVycm9yCisgICAgICAgICAgVk9TX1NUQVRVU19FX0VNUFRZIC0gY291bnRyeSBjb2RlIHRhYmxlIGlzIGVtcHR5CisgICAgICAgICAgVk9TX1NUQVRVU19FX0VYSVNUUyAtIGdpdmVuIGNvdW50cnkgY29kZSBkb2VzIG5vdCBleGlzdCBpbiB0YWJsZQorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19udl9nZXRSZWdEb21haW5Gcm9tQ291bnRyeUNvZGUoIHZfUkVHRE9NQUlOX3QgKnBSZWdEb21haW4sCisgICAgICBjb25zdCB2X0NPVU5UUllDT0RFX3QgY291bnRyeUNvZGUgKQoreworICAgaW50IGk7CisgICAvLyBzYW5pdHkgY2hlY2tzCisgICBpZiAoTlVMTCA9PSBwUmVnRG9tYWluKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICgiSW52YWxpZCByZWcgZG9tYWluIHBvaW50ZXJcclxuIikgKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisgICAqcFJlZ0RvbWFpbiA9IFJFR0RPTUFJTl9DT1VOVDsKKworICAgaWYgKE5VTEwgPT0gY291bnRyeUNvZGUpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgKCJDb3VudHJ5IGNvZGUgYXJyYXkgaXMgTlVMTFxyXG4iKSApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKyAgIGlmICgwID09IGNvdW50cnlJbmZvVGFibGUuY291bnRyeUNvdW50KQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICgiUmVnIGRvbWFpbiB0YWJsZSBpcyBlbXB0eVxyXG4iKSApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgIH0KKyAgIC8vIGl0ZXJhdGUgdGhlIGNvdW50cnkgaW5mbyB0YWJsZSB1bnRpbCBlbmQgb2YgdGFibGUgb3IgdGhlIGNvdW50cnkgY29kZQorICAgLy8gaXMgZm91bmQKKyAgIGZvciAoaSA9IDA7IGkgPCBjb3VudHJ5SW5mb1RhYmxlLmNvdW50cnlDb3VudCAmJgorICAgICAgICAgUkVHRE9NQUlOX0NPVU5UID09ICpwUmVnRG9tYWluOyBpKyspCisgICB7CisgICAgICBpZiAobWVtY21wKGNvdW50cnlDb2RlLCBjb3VudHJ5SW5mb1RhYmxlLmNvdW50cnlJbmZvW2ldLmNvdW50cnlDb2RlLAorICAgICAgICAgICAgICAgVk9TX0NPVU5UUllfQ09ERV9MRU4pID09IDApCisgICAgICB7CisgICAgICAgICAvLyBjb3VudHJ5IGNvZGUgaXMgZm91bmQKKyAgICAgICAgICpwUmVnRG9tYWluID0gY291bnRyeUluZm9UYWJsZS5jb3VudHJ5SW5mb1tpXS5yZWdEb21haW47CisgICAgICB9CisgICB9CisgICBpZiAoUkVHRE9NQUlOX0NPVU5UICE9ICpwUmVnRG9tYWluKQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICgiY291bnRyeSBjb2RlIGlzIG5vdCBmb3VuZFxyXG4iKSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKKyAgIH0KK30KKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgdm9zX252X2dldFN1cHBvcnRlZENvdW50cnlDb2RlKCkgLSBnZXQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkCisgIGNvdW50cnkgY29kZXMKKyAgVGhlIFxhIHZvc19udl9nZXRTdXBwb3J0ZWRDb3VudHJ5Q29kZSgpIGVuY29kZXMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkCisgIGNvdW50cnkgY29kZXMgd2l0aCBwYWRkaW5ncyBpbiB0aGUgcHJvdmlkZWQgYnVmZmVyCisgIFxwYXJhbSBwQnVmZmVyICAgICAtIHBvaW50ZXIgdG8gYnVmZmVyIHdoZXJlIHN1cHBvcnRlZCBjb3VudHJ5IGNvZGVzCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCBwYWRkaW5ncyBhcmUgZW5jb2RlZDsgdGhpcyBtYXkgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgdXNlciB3aXNoZXMgdG8gcXVlcnkgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIHRvCisgICAgICAgICAgICAgICAgICAgICAgIGdldCB0aGUgY291bnRyeSBjb2RlIGxpc3QKKyAgXHBhcmFtIHBCdWZmZXJTaXplIC0gdGhpcyBpcyB0aGUgcHJvdmlkZWQgYnVmZmVyIHNpemUgb24gaW5wdXQ7CisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIHJlcXVpcmVkIG9yIGNvbnN1bWVkIGJ1ZmZlciBzaXplIG9uIG91dHB1dAorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIGNvdW50cnkgY29kZXMgYXJlIHN1Y2Nlc3NmdWxseSBlbmNvZGVkCisgICAgICAgICAgVk9TX1NUQVRVU19FX05PTUVNIC0gY291bnRyeSBjb2RlcyBhcmUgbm90IGVuY29kZWQgYmVjYXVzZSBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnVmZmVyIGlzIE5VTEwgb3IgYnVmZmVyIHNpemUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaWNpZW50CisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X2dldFN1cHBvcnRlZENvdW50cnlDb2RlKCB2X0JZVEVfdCAqcEJ1ZmZlciwgdl9TSVpFX3QgKnBCdWZmZXJTaXplLAorICAgICAgdl9TSVpFX3QgcGFkZGluZ1NpemUgKQoreworICAgdl9TSVpFX3QgcHJvdmlkZWRCdWZmZXJTaXplID0gKnBCdWZmZXJTaXplOworICAgaW50IGk7CisgICAvLyBwQnVmZmVyU2l6ZSBub3cgcG9pbnRzIHRvIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZQorICAgKnBCdWZmZXJTaXplID0gY291bnRyeUluZm9UYWJsZS5jb3VudHJ5Q291bnQgKiAoVk9TX0NPVU5UUllfQ09ERV9MRU4gKyBwYWRkaW5nU2l6ZSApOworICAgaWYgKCBOVUxMID09IHBCdWZmZXIgfHwgcHJvdmlkZWRCdWZmZXJTaXplIDwgKnBCdWZmZXJTaXplICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICgiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgY291bnRyeSBjb2RlIGxpc3RcclxuIikpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKyAgIGZvciAoaSA9IDA7IGkgPCBjb3VudHJ5SW5mb1RhYmxlLmNvdW50cnlDb3VudDsgaSsrKQorICAgeworICAgICAgbWVtY3B5KCBwQnVmZmVyLCBjb3VudHJ5SW5mb1RhYmxlLmNvdW50cnlJbmZvW2ldLmNvdW50cnlDb2RlLCBWT1NfQ09VTlRSWV9DT0RFX0xFTiApOworICAgICAgcEJ1ZmZlciArPSAoVk9TX0NPVU5UUllfQ09ERV9MRU4gKyBwYWRkaW5nU2l6ZSApOworICAgfQorICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgdm9zX252X3JlYWRUeEFudGVubmFDb3VudCgpIC0gcmV0dXJuIG51bWJlciBvZiBUWCBhbnRlbm5hCisgIFxwYXJhbSBwVHhBbnRlbm5hQ291bnQgICAtIGFudGVubmEgY291bnQKKyAgXHJldHVybiBzdGF0dXMgb2YgdGhlIE5WIHJlYWQgb3BlcmF0aW9uCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X3JlYWRUeEFudGVubmFDb3VudCggdl9VOF90ICpwVHhBbnRlbm5hQ291bnQgKQoreworICAgc052RmllbGRzIGZpZWxkSW1hZ2U7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKyAgIHN0YXR1cyA9IHZvc19udl9yZWFkKCBWTlZfRklFTERfSU1BR0UsICZmaWVsZEltYWdlLCBOVUxMLAorICAgICAgICAgc2l6ZW9mKGZpZWxkSW1hZ2UpICk7CisgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykKKyAgIHsKKyAgICAgICpwVHhBbnRlbm5hQ291bnQgPSBmaWVsZEltYWdlLm51bU9mVHhDaGFpbnM7CisgICB9CisgICByZXR1cm4gc3RhdHVzOworfQorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiB2b3NfbnZfcmVhZFJ4QW50ZW5uYUNvdW50KCkgLSByZXR1cm4gbnVtYmVyIG9mIFJYIGFudGVubmEKKyAgXHBhcmFtIHBSeEFudGVubmFDb3VudCAgIC0gYW50ZW5uYSBjb3VudAorICBccmV0dXJuIHN0YXR1cyBvZiB0aGUgTlYgcmVhZCBvcGVyYXRpb24KKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbnZfcmVhZFJ4QW50ZW5uYUNvdW50KCB2X1U4X3QgKnBSeEFudGVubmFDb3VudCApCit7CisgICBzTnZGaWVsZHMgZmllbGRJbWFnZTsKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgc3RhdHVzID0gdm9zX252X3JlYWQoIFZOVl9GSUVMRF9JTUFHRSwgJmZpZWxkSW1hZ2UsIE5VTEwsCisgICAgICAgICBzaXplb2YoZmllbGRJbWFnZSkgKTsKKyAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKQorICAgeworICAgICAgKnBSeEFudGVubmFDb3VudCA9IGZpZWxkSW1hZ2UubnVtT2ZSeENoYWluczsKKyAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgdm9zX252X3JlYWRNYWNBZGRyZXNzKCkgLSByZXR1cm4gdGhlIE1BQyBhZGRyZXNzCisgIFxwYXJhbSBwTWFjQWRkcmVzcyAtIE1BQyBhZGRyZXNzCisgIFxyZXR1cm4gc3RhdHVzIG9mIHRoZSBOViByZWFkIG9wZXJhdGlvbgorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19udl9yZWFkTWFjQWRkcmVzcyggdl9NQUNfQUREUkVTU190IHBNYWNBZGRyZXNzICkKK3sKKyAgIHNOdkZpZWxkcyBmaWVsZEltYWdlOworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICBzdGF0dXMgPSB2b3NfbnZfcmVhZCggVk5WX0ZJRUxEX0lNQUdFLCAmZmllbGRJbWFnZSwgTlVMTCwKKyAgICAgICAgIHNpemVvZihmaWVsZEltYWdlKSApOworICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpCisgICB7CisgICAgICBtZW1jcHkoIHBNYWNBZGRyZXNzLCBmaWVsZEltYWdlLm1hY0FkZHIsIFZPU19NQUNfQUREUkVTU19MRU4gKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8vVGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGNhbiBiZSByZW1vdmVkIHdoZW4gTlYgaXMgcHJvZ3JhbW1lZAorICAgICAgY29uc3Qgdl9VOF90IG1hY0FkZHJbVk9TX01BQ19BRERSRVNTX0xFTl0gPSBWT1NfSEFSRF9DT0RFRF9NQUM7CisgICAgICBtZW1jcHkoIHBNYWNBZGRyZXNzLCBtYWNBZGRyLCBWT1NfTUFDX0FERFJFU1NfTEVOICk7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgIiBmYWlsIHRvIGdldCBNQUMgYWRkcmVzcyBmcm9tIE5WLCBoYXJkY29kZWQgdG8gJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYJTAyWCIsCisgICAgICAgICAgbWFjQWRkclswXSwgbWFjQWRkclsxXSwgbWFjQWRkclsyXSwgbWFjQWRkclszXSwgbWFjQWRkcls0XSwgbWFjQWRkcls1XSk7CisgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB9CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX252X3JlYWRNdWx0aU1hY0FkZHJlc3MoKSAtIHJldHVybiB0aGUgTXVsdGlwbGUgTUFDIGFkZHJlc3NlcworCisgIFxwYXJhbSBwTWFjQWRkcmVzcyAtIE1BQyBhZGRyZXNzCisgIFxwYXJhbSBtYWNDb3VudCAtIENvdW50IG9mIHZhbGlkIE1BQyBhZGRyZXNzZXMgdG8gZ2V0IGZyb20gTlYgZmllbGQKKworICBccmV0dXJuIHN0YXR1cyBvZiB0aGUgTlYgcmVhZCBvcGVyYXRpb24KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X3JlYWRNdWx0aU1hY0FkZHJlc3MoIHZfVThfdCAqcE1hY0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICBtYWNDb3VudCApCit7CisgICBzTnZGaWVsZHMgICBmaWVsZEltYWdlOworICAgVk9TX1NUQVRVUyAgc3RhdHVzOworICAgdl9VOF90ICAgICAgY291bnRMb29wOworICAgdl9VOF90ICAgICAqcE5WTWFjQWRkcmVzczsKKworICAgaWYoKDAgPT0gbWFjQ291bnQpIHx8IChWT1NfTUFYX0NPTkNVUlJFTkNZX1BFUlNPTkEgPCBtYWNDb3VudCkgfHwKKyAgICAgIChOVUxMID09IHBNYWNBZGRyZXNzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgIiBJbnZhbGlkIFBhcmFtZXRlciBmcm9tIE5WIENsaWVudCBtYWNDb3VudCAlZCwgcE1hY0FkZHJlc3MgMHgleCIsCisgICAgICAgICAgbWFjQ291bnQsIHBNYWNBZGRyZXNzKTsKKyAgIH0KKworICAgc3RhdHVzID0gdm9zX252X3JlYWQoIFZOVl9GSUVMRF9JTUFHRSwgJmZpZWxkSW1hZ2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZpZWxkSW1hZ2UpICk7CisgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykKKyAgIHsKKyAgICAgIHBOVk1hY0FkZHJlc3MgPSBmaWVsZEltYWdlLm1hY0FkZHI7CisgICAgICBmb3IoY291bnRMb29wID0gMDsgY291bnRMb29wIDwgbWFjQ291bnQ7IGNvdW50TG9vcCsrKQorICAgICAgeworICAgICAgICAgdm9zX21lbV9jb3B5KHBNYWNBZGRyZXNzICsgKGNvdW50TG9vcCAqIFZPU19NQUNfQUREUkVTU19MRU4pLAorICAgICAgICAgICAgICAgICAgICAgIHBOVk1hY0FkZHJlc3MgKyAoY291bnRMb29wICogVk9TX01BQ19BRERSRVNTX0xFTiksCisgICAgICAgICAgICAgICAgICAgICAgVk9TX01BQ19BRERSRVNTX0xFTik7CisgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAidm9zX252X3JlYWRNdWx0aU1hY0FkZHJlc3MgR2V0IE5WIEZpZWxkIEZhaWwiKTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiB2b3NfbnZfc2V0VmFsaWRpdHkoKSAtIHNldCB0aGUgdmFsaWRpdHkgb2YgYW4gTlYgaXRlbS4KKyAgVGhlIFxhIHZvc19udl9zZXRWYWxpZGl0eSgpIHZhbGlkYXRlcyBhbmQgaW52YWxpZGF0ZXMgYW4gTlYgaXRlbS4gIFRoZQorICB2YWxpZGl0eSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gTlYgbWVtb3J5LgorICBPbmUgd291bGQgZ2V0IHRoZSBWT1NfU1RBVFVTX0VfRVhJU1RTIGVycm9yIHdoZW4gcmVhZGluZyBhbiBpbnZhbGlkIGl0ZW0uCisgIEFuIGl0ZW0gYmVjb21lcyB2YWxpZCB3aGVuIG9uZSBoYXMgd3JpdHRlbiB0byBpdCBzdWNjZXNzZnVsbHkuCisgIFxwYXJhbSB0eXBlICAgICAgICAtIE5WIGl0ZW0gdHlwZQorICBccGFyYW0gaXRlbUlzVmFsaWQgLSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgdGhlIGl0ZW0ncyB2YWxpZGl0eQorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHZhbGlkaXR5IGlzIHNldCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgaW52YWxpZAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gdW5rbm93biBlcnJvcgorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFdMQU5fRlRNX1NUVUIKKworVk9TX1NUQVRVUyB2b3NfbnZfc2V0VmFsaWRpdHkoIFZOVl9UWVBFIHR5cGUsIHZfQk9PTF90IGl0ZW1Jc1ZhbGlkICkKK3sKKyAgIHZfVTMyX3QgbGFzdE52VmFsaWRpdHlCaXRtYXA7CisgICB2X1UzMl90IG5ld052VmFsaWRpdHlCaXRtYXA7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIC8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IE5WIHR5cGUgaXMgdmFsaWQKKyAgIGlmIChWTlZfVFlQRV9DT1VOVCA8IHR5cGUpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgKCJ2b3NfbnZfc2V0VmFsaWRpdHk6IGludmFsaWQgdHlwZT0lZFxyXG4iKSwgdHlwZSApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKyAgIC8vIHJlYWQgdGhlIHZhbGlkaXR5IGJpdG1hcAorICAgbGFzdE52VmFsaWRpdHlCaXRtYXAgPSBnbnZFRlNUYWJsZS0+bnZWYWxpZGl0eUJpdG1hcDsKKyAgIC8vIG1vZGlmeSB0aGUgdmFsaWRpdHkgYml0bWFwCisgICBpZiAoaXRlbUlzVmFsaWQpCisgICB7CisgICAgICAgbmV3TnZWYWxpZGl0eUJpdG1hcCA9IGxhc3ROdlZhbGlkaXR5Qml0bWFwIHwgKDEgPDwgdHlwZSk7CisgICAgICAgICAgICAgIC8vIGNvbW1pdCB0byBOViBzdG9yZSBpZiBiaXRtYXAgaGFzIGJlZW4gbW9kaWZpZWQKKyAgICAgICBpZiAobmV3TnZWYWxpZGl0eUJpdG1hcCAhPSBsYXN0TnZWYWxpZGl0eUJpdG1hcCkKKyAgICAgICB7CisgICAgICAgICAgIGdudkVGU1RhYmxlLT5udlZhbGlkaXR5Qml0bWFwID0gbmV3TnZWYWxpZGl0eUJpdG1hcDsKKyAgICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgbmV3TnZWYWxpZGl0eUJpdG1hcCA9IGxhc3ROdlZhbGlkaXR5Qml0bWFwICYgKH4oMSA8PCB0eXBlKSk7CisgICAgICAgaWYgKG5ld052VmFsaWRpdHlCaXRtYXAgIT0gbGFzdE52VmFsaWRpdHlCaXRtYXApCisgICAgICAgeworICAgICAgICAgICBnbnZFRlNUYWJsZS0+bnZWYWxpZGl0eUJpdG1hcCA9IG5ld052VmFsaWRpdHlCaXRtYXA7CisgICAgICAgICAgIHN0YXR1cyA9IHdsYW5fd3JpdGVfdG9fZWZzKCh2X1U4X3QqKWdudkVGU1RhYmxlLHNpemVvZihudkVGU1RhYmxlX3QpKTsKKyAgICAgICAgICAgaWYgKCEgVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgKCJ2b3NfbnZfd3JpdGVfdG9fZWZzIGZhaWxlZCEhIVxyXG4iKSk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgdm9zX252X2dldFZhbGlkaXR5KCkgLSBnZXQgdGhlIHZhbGlkaXR5IG9mIGFuIE5WIGl0ZW0uCisgIFRoZSBcYSB2b3NfbnZfZ2V0VmFsaWRpdHkoKSBpbmRpY2F0ZXMgaWYgYW4gTlYgaXRlbSBpcyB2YWxpZC4gIFRoZQorICB2YWxpZGl0eSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gTlYgbWVtb3J5LgorICBPbmUgd291bGQgZ2V0IHRoZSBWT1NfU1RBVFVTX0VfRVhJU1RTIGVycm9yIHdoZW4gcmVhZGluZyBhbiBpbnZhbGlkIGl0ZW0uCisgIEFuIGl0ZW0gYmVjb21lcyB2YWxpZCB3aGVuIG9uZSBoYXMgd3JpdHRlbiB0byBpdCBzdWNjZXNzZnVsbHkuCisgIFxwYXJhbSB0eXBlICAgICAgICAtIE5WIGl0ZW0gdHlwZQorICBccGFyYW0gcEl0ZW1Jc1ZhbGlkLSBwb2ludGVyIHRvIHRoZSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgdGhlIGl0ZW0ncworICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eQorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHZhbGlkaXR5IGlzIGRldGVybWluZWQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIGludmFsaWQKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIHVua25vd24gZXJyb3IKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbnZfZ2V0VmFsaWRpdHkoIFZOVl9UWVBFIHR5cGUsIHZfQk9PTF90ICpwSXRlbUlzVmFsaWQgKQoreworICAgdl9VMzJfdCBudlZhbGlkaXR5Qml0bWFwID0gZ252RUZTVGFibGUtPm52VmFsaWRpdHlCaXRtYXA7CisgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBOViB0eXBlIGlzIHZhbGlkCisgICBpZiAoTlVNX05WX1RBQkxFX0lEUyA8IHR5cGUpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgKCJ2b3NfbnZfZ2V0VmFsaWRpdHk6IGludmFsaWQgdHlwZT0lZFxyXG4iKSwgdHlwZSApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKyAgICpwSXRlbUlzVmFsaWQgPSAodl9CT09MX3QpKChudlZhbGlkaXR5Qml0bWFwID4+IHR5cGUpICYgMSk7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiB2b3NfbnZfcmVhZCgpIC0gcmVhZCBhIE5WIGl0ZW0gdG8gYW4gb3V0cHV0IGJ1ZmZlcgorICBUaGUgXGEgdm9zX252X3JlYWQoKSByZWFkcyBhIE5WIGl0ZW0gdG8gYW4gb3V0cHV0IGJ1ZmZlci4gIElmIHRoZSBpdGVtIGlzCisgIGFuIGFycmF5LCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHJlYWQgdGhlIGVudGlyZSBhcnJheS4gT25lIHdvdWxkIGdldCBhCisgIFZPU19TVEFUVVNfRV9FWElTVFMgZXJyb3Igd2hlbiByZWFkaW5nIGFuIGludmFsaWQgaXRlbS4KKyAgRm9yIGVycm9yIGNvbmRpdGlvbnMgb2YgVk9TX1NUQVRVU19FX0VYSVNUUyBhbmQgVk9TX1NUQVRVU19FX0ZBSUxVUkUsCisgIGlmIGEgZGVmYXVsdCBidWZmZXIgaXMgcHJvdmlkZWQgKHdpdGggYSBub24tTlVMTCB2YWx1ZSksCisgIHRoZSBkZWZhdWx0IGJ1ZmZlciBjb250ZW50IGlzIGNvcGllZCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgXHBhcmFtIHR5cGUgIC0gTlYgaXRlbSB0eXBlCisgIFxwYXJhbSBvdXRwdXRCdWZmZXIgICAtIG91dHB1dCBidWZmZXIKKyAgXHBhcmFtIGRlZmF1bHRCdWZmZXIgIC0gZGVmYXVsdCBidWZmZXIKKyAgXHBhcmFtIGJ1ZmZlclNpemUgIC0gb3V0cHV0IGJ1ZmZlciBzaXplCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gTlYgaXRlbSBpcyByZWFkIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBpbnZhbGlkCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gZGVmYXVsdEJ1ZmZlciBwb2ludCBpcyBOVUxMCisgICAgICAgICAgVk9TX1NUQVRVU19FX0VYSVNUUyAtIE5WIHR5cGUgaXMgdW5zdXBwb3J0ZWQKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIHVua25vd24gZXJyb3IKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbnZfcmVhZCggVk5WX1RZUEUgdHlwZSwgdl9WT0lEX3QgKm91dHB1dFZvaWRCdWZmZXIsCisgICAgICB2X1ZPSURfdCAqZGVmYXVsdEJ1ZmZlciwgdl9TSVpFX3QgYnVmZmVyU2l6ZSApCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgICAgICAgICAgICAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdl9TSVpFX3QgaXRlbVNpemU7CisgICAgdl9CT09MX3QgaXRlbUlzVmFsaWQgPSBWT1NfVFJVRTsKKworICAgIC8vIHNhbml0eSBjaGVjaworICAgIGlmIChWTlZfVFlQRV9DT1VOVCA8IHR5cGUpCisgICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgKCJ2b3NfbnZfc2V0VmFsaWRpdHk6IGludmFsaWQgdHlwZT0lZFxyXG4iKSwgdHlwZSApOworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgfQorICAgIGlmIChOVUxMID09IG91dHB1dFZvaWRCdWZmZXIpCisgICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgKCJCdWZmZXIgcHJvdmlkZWQgaXMgTlVMTFxyXG4iKSApOworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgfQorICAgIGlmICgwID09IGJ1ZmZlclNpemUpCisgICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgKCJOViB0eXBlPSVkIGlzIGludmFsaWRcclxuIiksIHR5cGUgKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgIH0KKyAgICAvLyBjaGVjayBpZiB0aGUgTlYgaXRlbSBoYXMgdmFsaWQgZGF0YQorICAgIHN0YXR1cyA9IHZvc19udl9nZXRWYWxpZGl0eSggdHlwZSwgJml0ZW1Jc1ZhbGlkICk7CisgICBpZiAoIWl0ZW1Jc1ZhbGlkKQorICAgeworICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICJOViB0eXBlPSVkIGRvZXMgbm90IGhhdmUgdmFsaWQgZGF0YVxyXG4iLCB0eXBlICk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FTVBUWTsKKyAgIH0KKyAgIHN3aXRjaCh0eXBlKQorICAgeworICAgICAgIGNhc2UgVk5WX0ZJRUxEX0lNQUdFOgorICAgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihnbnZFRlNUYWJsZS0+aGFsbnYuZmllbGRzKTsKKyAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICgidHlwZSA9ICVkIGJ1ZmZlciBzaXplPSVkIGlzIGxlc3MgdGhhbiBkYXRhIHNpemU9JWRcclxuIiksdHlwZSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgbWVtY3B5KG91dHB1dFZvaWRCdWZmZXIsJmdudkVGU1RhYmxlLT5oYWxudi5maWVsZHMsYnVmZmVyU2l6ZSk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBWTlZfUkFURV9UT19QT1dFUl9UQUJMRToKKyAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wd3JPcHRpbXVtKTsKKyAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICgidHlwZSA9ICVkIGJ1ZmZlciBzaXplPSVkIGlzIGxlc3MgdGhhbiBkYXRhIHNpemU9JWRcclxuIiksdHlwZSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgbWVtY3B5KG91dHB1dFZvaWRCdWZmZXIsJmdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucHdyT3B0aW11bVswXSxidWZmZXJTaXplKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIFZOVl9SRUdVTEFSVE9SWV9ET01BSU5fVEFCTEU6CisgICAgICAgICAgIGl0ZW1TaXplID0gc2l6ZW9mKGdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucmVnRG9tYWlucyk7CisgICAgICAgICAgIGlmKGJ1ZmZlclNpemUgIT0gaXRlbVNpemUpIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAoInR5cGUgPSAlZCBidWZmZXIgc2l6ZT0lZCBpcyBsZXNzIHRoYW4gZGF0YSBzaXplPSVkXHJcbiIpLHR5cGUsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgIGl0ZW1TaXplKTsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIG1lbWNweShvdXRwdXRWb2lkQnVmZmVyLCZnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnJlZ0RvbWFpbnNbMF0sYnVmZmVyU2l6ZSk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBWTlZfREVGQVVMVF9MT0NBVElPTjoKKyAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5kZWZhdWx0Q291bnRyeVRhYmxlKTsKKyAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICgidHlwZSA9ICVkIGJ1ZmZlciBzaXplPSVkIGlzIGxlc3MgdGhhbiBkYXRhIHNpemU9JWRcclxuIiksdHlwZSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgbWVtY3B5KG91dHB1dFZvaWRCdWZmZXIsJmdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMuZGVmYXVsdENvdW50cnlUYWJsZSxidWZmZXJTaXplKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIFZOVl9UUENfUE9XRVJfVEFCTEU6CisgICAgICAgICAgIGl0ZW1TaXplID0gc2l6ZW9mKGdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucGx1dENoYXJhY3Rlcml6ZWQpOworICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBtZW1jcHkob3V0cHV0Vm9pZEJ1ZmZlciwmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wbHV0Q2hhcmFjdGVyaXplZFswXSxidWZmZXJTaXplKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIFZOVl9UUENfUERBRENfT0ZGU0VUUzoKKyAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wbHV0UGRhZGNPZmZzZXQpOworICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBtZW1jcHkob3V0cHV0Vm9pZEJ1ZmZlciwmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wbHV0UGRhZGNPZmZzZXRbMF0sYnVmZmVyU2l6ZSk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBWTlZfUlNTSV9DSEFOTkVMX09GRlNFVFM6CisKKyAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5yc3NpQ2hhbk9mZnNldHMpOworCisgICAgICAgICAgIGlmKGJ1ZmZlclNpemUgIT0gaXRlbVNpemUpIHsKKworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICgidHlwZSA9ICVkIGJ1ZmZlciBzaXplPSVkIGlzIGxlc3MgdGhhbiBkYXRhIHNpemU9JWRcclxuIiksdHlwZSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgbWVtY3B5KG91dHB1dFZvaWRCdWZmZXIsJmdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucnNzaUNoYW5PZmZzZXRzWzBdLGJ1ZmZlclNpemUpOworICAgICAgICAgICB9CisgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgVk5WX1JGX0NBTF9WQUxVRVM6CisKKyAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5yRkNhbFZhbHVlcyk7CisKKyAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworCisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBtZW1jcHkob3V0cHV0Vm9pZEJ1ZmZlciwmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5yRkNhbFZhbHVlcyxidWZmZXJTaXplKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIFZOVl9BTlRFTk5BX1BBVEhfTE9TUzoKKyAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5hbnRlbm5hUGF0aExvc3MpOworICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBtZW1jcHkob3V0cHV0Vm9pZEJ1ZmZlciwmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5hbnRlbm5hUGF0aExvc3NbMF0sYnVmZmVyU2l6ZSk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBWTlZfUEFDS0VUX1RZUEVfUE9XRVJfTElNSVRTOgorICAgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnBrdFR5cGVQd3JMaW1pdHMpOworICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBtZW1jcHkob3V0cHV0Vm9pZEJ1ZmZlciwmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wa3RUeXBlUHdyTGltaXRzWzBdWzBdLGJ1ZmZlclNpemUpOworICAgICAgICAgICB9CisgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgVk5WX09GRE1fQ01EX1BXUl9PRkZTRVQ6CisgICAgICAgICAgIGl0ZW1TaXplID0gc2l6ZW9mKGdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMub2ZkbUNtZFB3ck9mZnNldCk7CisgICAgICAgICAgIGlmKGJ1ZmZlclNpemUgIT0gaXRlbVNpemUpIHsKKyAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAoInR5cGUgPSAlZCBidWZmZXIgc2l6ZT0lZCBpcyBsZXNzIHRoYW4gZGF0YSBzaXplPSVkXHJcbiIpLHR5cGUsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgIGl0ZW1TaXplKTsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIG1lbWNweShvdXRwdXRWb2lkQnVmZmVyLCZnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLm9mZG1DbWRQd3JPZmZzZXQsYnVmZmVyU2l6ZSk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBWTlZfVFhfQkJfRklMVEVSX01PREU6CisgICAgICAgICAgIGl0ZW1TaXplID0gc2l6ZW9mKGdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMudHhiYkZpbHRlck1vZGUpOworICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBtZW1jcHkob3V0cHV0Vm9pZEJ1ZmZlciwmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy50eGJiRmlsdGVyTW9kZSxidWZmZXJTaXplKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICAgICBjYXNlIFZOVl9GUkVRVUVOQ1lfRk9SXzFfM1ZfU1VQUExZOgorICAgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLmZyZXFGb3IxcDNWU3VwcGx5KTsKKyAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICgidHlwZSA9ICVkIGJ1ZmZlciBzaXplPSVkIGlzIGxlc3MgdGhhbiBkYXRhIHNpemU9JWRcclxuIiksdHlwZSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgbWVtY3B5KG91dHB1dFZvaWRCdWZmZXIsJmdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMuZnJlcUZvcjFwM1ZTdXBwbHksYnVmZmVyU2l6ZSk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyAqLworCisgICAgICAgY2FzZSBWTlZfVEFCTEVfVklSVFVBTF9SQVRFOgorICAgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnB3ck9wdGltdW1fdmlydHVhbFJhdGUpOworICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBtZW1jcHkob3V0cHV0Vm9pZEJ1ZmZlciwmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wd3JPcHRpbXVtX3ZpcnR1YWxSYXRlLGJ1ZmZlclNpemUpOworICAgICAgICAgICB9CisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKyNpZm5kZWYgV0xBTl9GVE1fU1RVQgorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHZvc19udl93cml0ZSgpIC0gd3JpdGUgdG8gYSBOViBpdGVtIGZyb20gYW4gaW5wdXQgYnVmZmVyCisgIFRoZSBcYSB2b3NfbnZfd3JpdGUoKSB3cml0ZXMgdG8gYSBOViBpdGVtIGZyb20gYW4gaW5wdXQgYnVmZmVyLiBUaGlzIHdvdWxkCisgIHZhbGlkYXRlIHRoZSBOViBpdGVtIGlmIHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKyAgXHBhcmFtIHR5cGUgLSBOViBpdGVtIHR5cGUKKyAgXHBhcmFtIGlucHV0QnVmZmVyIC0gaW5wdXQgYnVmZmVyCisgIFxwYXJhbSBpbnB1dEJ1ZmZlclNpemUgLSBpbnB1dCBidWZmZXIgc2l6ZQorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIE5WIGl0ZW0gaXMgcmVhZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgaW52YWxpZAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIG91dHB1dEJ1ZmZlciBwb2ludGVyIGlzIE5VTEwKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRVhJU1RTIC0gTlYgdHlwZSBpcyB1bnN1cHBvcnRlZAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFICAgLSB1bmtub3duIGVycm9yCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X3dyaXRlKCBWTlZfVFlQRSB0eXBlLCB2X1ZPSURfdCAqaW5wdXRWb2lkQnVmZmVyLAorICAgICAgdl9TSVpFX3QgYnVmZmVyU2l6ZSApCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdl9TSVpFX3QgaXRlbVNpemU7CisgICAgICAgIC8vIHNhbml0eSBjaGVjaworICAgIGlmIChOVU1fTlZfVEFCTEVfSURTIDwgdHlwZSkKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAoInZvc19udl9zZXRWYWxpZGl0eTogaW52YWxpZCB0eXBlPSVkXHJcbiIpLCB0eXBlICk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICB9CisgICAgaWYgKE5VTEwgPT0gaW5wdXRWb2lkQnVmZmVyKQorICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICgiQnVmZmVyIHByb3ZpZGVkIGlzIE5VTExcclxuIikgKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKyAgICBpZiAoMCA9PSBidWZmZXJTaXplKQorICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICgiTlYgdHlwZT0lZCBpcyBpbnZhbGlkXHJcbiIpLCB0eXBlICk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICB9CisgICAgc3dpdGNoKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIFZOVl9GSUVMRF9JTUFHRToKKyAgICAgICAgICAgIGl0ZW1TaXplID0gc2l6ZW9mKGdudkVGU1RhYmxlLT5oYWxudi5maWVsZHMpOworICAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmZ252RUZTVGFibGUtPmhhbG52LmZpZWxkcyxpbnB1dFZvaWRCdWZmZXIsYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWTlZfUkFURV9UT19QT1dFUl9UQUJMRToKKyAgICAgICAgICAgIGl0ZW1TaXplID0gc2l6ZW9mKGdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucHdyT3B0aW11bSk7CisgICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAoInR5cGUgPSAlZCBidWZmZXIgc2l6ZT0lZCBpcyBsZXNzIHRoYW4gZGF0YSBzaXplPSVkXHJcbiIpLHR5cGUsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnB3ck9wdGltdW1bMF0saW5wdXRWb2lkQnVmZmVyLGJ1ZmZlclNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5WX1JFR1VMQVJUT1JZX0RPTUFJTl9UQUJMRToKKyAgICAgICAgICAgIGl0ZW1TaXplID0gc2l6ZW9mKGdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucmVnRG9tYWlucyk7CisgICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAoInR5cGUgPSAlZCBidWZmZXIgc2l6ZT0lZCBpcyBsZXNzIHRoYW4gZGF0YSBzaXplPSVkXHJcbiIpLHR5cGUsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnJlZ0RvbWFpbnNbMF0saW5wdXRWb2lkQnVmZmVyLGJ1ZmZlclNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5WX0RFRkFVTFRfTE9DQVRJT046CisgICAgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLmRlZmF1bHRDb3VudHJ5VGFibGUpOworICAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5kZWZhdWx0Q291bnRyeVRhYmxlLGlucHV0Vm9pZEJ1ZmZlcixidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZOVl9UUENfUE9XRVJfVEFCTEU6CisgICAgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnBsdXRDaGFyYWN0ZXJpemVkKTsKKyAgICAgICAgICAgIGlmKGJ1ZmZlclNpemUgIT0gaXRlbVNpemUpIHsKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICgidHlwZSA9ICVkIGJ1ZmZlciBzaXplPSVkIGlzIGxlc3MgdGhhbiBkYXRhIHNpemU9JWRcclxuIiksdHlwZSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgIGl0ZW1TaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucGx1dENoYXJhY3Rlcml6ZWRbMF0saW5wdXRWb2lkQnVmZmVyLGJ1ZmZlclNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5WX1RQQ19QREFEQ19PRkZTRVRTOgorICAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wbHV0UGRhZGNPZmZzZXQpOworICAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wbHV0UGRhZGNPZmZzZXRbMF0saW5wdXRWb2lkQnVmZmVyLGJ1ZmZlclNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFZOVl9SU1NJX0NIQU5ORUxfT0ZGU0VUUzoKKworICAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5yc3NpQ2hhbk9mZnNldHMpOworCisgICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisKKyAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICgidHlwZSA9ICVkIGJ1ZmZlciBzaXplPSVkIGlzIGxlc3MgdGhhbiBkYXRhIHNpemU9JWRcclxuIiksdHlwZSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgIGl0ZW1TaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmdudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucnNzaUNoYW5PZmZzZXRzWzBdLGlucHV0Vm9pZEJ1ZmZlcixidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBWTlZfUkZfQ0FMX1ZBTFVFUzoKKworICAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5yRkNhbFZhbHVlcyk7CisKKyAgICAgICAgICAgIGlmKGJ1ZmZlclNpemUgIT0gaXRlbVNpemUpIHsKKworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5yRkNhbFZhbHVlcyxpbnB1dFZvaWRCdWZmZXIsYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWTlZfQU5URU5OQV9QQVRIX0xPU1M6CisgICAgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLmFudGVubmFQYXRoTG9zcyk7CisgICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAoInR5cGUgPSAlZCBidWZmZXIgc2l6ZT0lZCBpcyBsZXNzIHRoYW4gZGF0YSBzaXplPSVkXHJcbiIpLHR5cGUsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLmFudGVubmFQYXRoTG9zc1swXSxpbnB1dFZvaWRCdWZmZXIsYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZOVl9QQUNLRVRfVFlQRV9QT1dFUl9MSU1JVFM6CisgICAgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnBrdFR5cGVQd3JMaW1pdHMpOworICAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wa3RUeXBlUHdyTGltaXRzWzBdWzBdLGlucHV0Vm9pZEJ1ZmZlcixidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk5WX09GRE1fQ01EX1BXUl9PRkZTRVQ6CisgICAgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLm9mZG1DbWRQd3JPZmZzZXQpOworICAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5vZmRtQ21kUHdyT2Zmc2V0LGlucHV0Vm9pZEJ1ZmZlcixidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk5WX1RYX0JCX0ZJTFRFUl9NT0RFOgorICAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy50eGJiRmlsdGVyTW9kZSk7CisgICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAoInR5cGUgPSAlZCBidWZmZXIgc2l6ZT0lZCBpcyBsZXNzIHRoYW4gZGF0YSBzaXplPSVkXHJcbiIpLHR5cGUsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnR4YmJGaWx0ZXJNb2RlLGlucHV0Vm9pZEJ1ZmZlcixidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworICAgICAgICBjYXNlIFZOVl9GUkVRVUVOQ1lfRk9SXzFfM1ZfU1VQUExZOgorICAgICAgICAgICAgaXRlbVNpemUgPSBzaXplb2YoZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5mcmVxRm9yMXAzVlN1cHBseSk7CisgICAgICAgICAgICBpZihidWZmZXJTaXplICE9IGl0ZW1TaXplKSB7CisgICAgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAoInR5cGUgPSAlZCBidWZmZXIgc2l6ZT0lZCBpcyBsZXNzIHRoYW4gZGF0YSBzaXplPSVkXHJcbiIpLHR5cGUsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICBpdGVtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLmZyZXFGb3IxcDNWU3VwcGx5LGlucHV0Vm9pZEJ1ZmZlcixidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MgKi8KKworICAgICAgICBjYXNlIFZOVl9UQUJMRV9WSVJUVUFMX1JBVEU6CisgICAgICAgICAgICBpdGVtU2l6ZSA9IHNpemVvZihnbnZFRlNUYWJsZS0+aGFsbnYudGFibGVzLnB3ck9wdGltdW1fdmlydHVhbFJhdGUpOworICAgICAgICAgICAgaWYoYnVmZmVyU2l6ZSAhPSBpdGVtU2l6ZSkgeworICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgKCJ0eXBlID0gJWQgYnVmZmVyIHNpemU9JWQgaXMgbGVzcyB0aGFuIGRhdGEgc2l6ZT0lZFxyXG4iKSx0eXBlLCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgaXRlbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmZ252RUZTVGFibGUtPmhhbG52LnRhYmxlcy5wd3JPcHRpbXVtX3ZpcnR1YWxSYXRlLGlucHV0Vm9pZEJ1ZmZlcixidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpCisgICB7CisgICAgICAvLyBzZXQgTlYgaXRlbSB0byBoYXZlIHZhbGlkIGRhdGEKKyAgICAgIHN0YXR1cyA9IHZvc19udl9zZXRWYWxpZGl0eSggdHlwZSwgVk9TX1RSVUUgKTsKKyAgICAgIGlmICghIFZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAoInZvc19udl9zZXRWYWxpZGl0eSBmYWlsZWQhISFcclxuIikpOworICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgIH0KKyAgICAgIHN0YXR1cyA9IHdsYW5fd3JpdGVfdG9fZWZzKCh2X1U4X3QqKWdudkVGU1RhYmxlLHNpemVvZihudkVGU1RhYmxlX3QpKTsKKworICAgICAgaWYgKCEgVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICgidm9zX252X3dyaXRlX3RvX2VmcyBmYWlsZWQhISFcclxuIikpOworICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKyAgCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHZvc19udl9nZXRDaGFubmVsTGlzdFdpdGhQb3dlcigpIC0gZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBsaXN0IG9mCisgICAgICAgICAgc3VwcG9ydGVkIGNoYW5uZWxzIHdpdGggdGhlIHBvd2VyIGxpbWl0IGluZm8gdG9vLgorICBccGFyYW0gcENoYW5uZWxzMjBNSHogLSBsaXN0IG9mIDIwIE1oeiBjaGFubmVscworICBccGFyYW0gcE51bTIwTUh6Q2hhbm5lbHNGb3VuZCAtIG51bWJlciBvZiAyMCBNaHogY2hhbm5lbHMKKyAgXHBhcmFtIHBDaGFubmVsczQwTUh6IC0gbGlzdCBvZiAyMCBNaHogY2hhbm5lbHMKKyAgXHBhcmFtIHBOdW00ME1IekNoYW5uZWxzRm91bmQgLSBudW1iZXIgb2YgMjAgTWh6IGNoYW5uZWxzCisgIFxyZXR1cm4gc3RhdHVzIG9mIHRoZSBOViByZWFkIG9wZXJhdGlvbgorICBcTm90ZTogNDBNaHogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbnZfZ2V0Q2hhbm5lbExpc3RXaXRoUG93ZXIodENoYW5uZWxMaXN0V2l0aFBvd2VyICpjaGFubmVsczIwTUh6IC8qW05VTV9MRUdJVF9SRl9DSEFOTkVMU10gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpudW0yME1IekNoYW5uZWxzRm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q2hhbm5lbExpc3RXaXRoUG93ZXIgKmNoYW5uZWxzNDBNSHogLypbTlVNX0NIQU5fQk9ORF9DSEFOTkVMU10gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpudW00ME1IekNoYW5uZWxzRm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBpbnQgaSwgY291bnQ7CisgICAgCisgICAgLy9UT0RPOiBEb250IHdhbnQgdG8gdXNlIHBNYWMgaGVyZS4uLmNhbiB3ZSBpbnN0ZWFkIHN0b3JlIHRoZSBjdXJSZWdEb21haW4gaW4gTlYKKyAgICAvLyBvciBwYXNzIGl0IGFzIGEgcGFyYW1ldGVyIHRvIE5WIGZyb20gU01FPworCisgICAgaWYoIGNoYW5uZWxzMjBNSHogJiYgbnVtMjBNSHpDaGFubmVsc0ZvdW5kICkKKyAgICB7CisgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBSRl9DSEFOXzE0OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcmVnQ2hhbm5lbHNbaV0uZW5hYmxlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhbm5lbHMyME1Ieltjb3VudF0uY2hhbklkID0gcmZDaGFubmVsc1tpXS5jaGFubmVsTnVtOworICAgICAgICAgICAgICAgIGNoYW5uZWxzMjBNSHpbY291bnQrK10ucHdyICA9IHJlZ0NoYW5uZWxzW2ldLnB3ckxpbWl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgICAgIGZvciggaSA9IFJGX0NIQU5fMzY7IGkgPD0gUkZfQ0hBTl8xNjU7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCByZWdDaGFubmVsc1tpXS5lbmFibGVkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsczIwTUh6W2NvdW50XS5jaGFuSWQgPSByZkNoYW5uZWxzW2ldLmNoYW5uZWxOdW07CisgICAgICAgICAgICAgICAgY2hhbm5lbHMyME1Ieltjb3VudCsrXS5wd3IgID0gcmVnQ2hhbm5lbHNbaV0ucHdyTGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAqbnVtMjBNSHpDaGFubmVsc0ZvdW5kID0gKHRBTklfVTgpY291bnQ7CisgICAgfQorICAgIC8vVE9ETzogNDAgTUh6CisgICAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHZvc19udl9nZXREZWZhdWx0UmVnRG9tYWluKCkgLSByZXR1cm4gdGhlIGRlZmF1bHQgcmVndWxhdG9yeSBkb21haW4KKyAgXHJldHVybiBkZWZhdWx0IHJlZ3VsYXRvcnkgZG9tYWluCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordl9SRUdET01BSU5fdCB2b3NfbnZfZ2V0RGVmYXVsdFJlZ0RvbWFpbiggdm9pZCApCit7CisgICAgcmV0dXJuIGNvdW50cnlJbmZvVGFibGUuY291bnRyeUluZm9bMF0ucmVnRG9tYWluOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHZvc19udl9nZXRTdXBwb3J0ZWRDaGFubmVscygpIC0gZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBsaXN0IG9mCisgICAgICAgICAgc3VwcG9ydGVkIGNoYW5uZWxzCisgIFxwYXJhbSBwMjBNaHpDaGFubmVscyAtIGxpc3Qgb2YgMjAgTWh6IGNoYW5uZWxzCisgIFxwYXJhbSBwTnVtMjBNaHpDaGFubmVscyAtIG51bWJlciBvZiAyMCBNaHogY2hhbm5lbHMKKyAgXHBhcmFtIHA0ME1oekNoYW5uZWxzIC0gbGlzdCBvZiA0MCBNaHogY2hhbm5lbHMKKyAgXHBhcmFtIHBOdW00ME1oekNoYW5uZWxzIC0gbnVtYmVyIG9mIDQwIE1oeiBjaGFubmVscworICBccmV0dXJuIHN0YXR1cyBvZiB0aGUgTlYgcmVhZCBvcGVyYXRpb24KKyAgXE5vdGU6IDQwTWh6IG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X2dldFN1cHBvcnRlZENoYW5uZWxzKCB2X1U4X3QgKnAyME1oekNoYW5uZWxzLCBpbnQgKnBOdW0yME1oekNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcDQwTWh6Q2hhbm5lbHMsIGludCAqcE51bTQwTWh6Q2hhbm5lbHMpCit7CisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgaW50IGksIGNvdW50ID0gMDsKKworICAgIGlmKCBwMjBNaHpDaGFubmVscyAmJiBwTnVtMjBNaHpDaGFubmVscyApCisgICAgeworICAgICAgICBpZiggKnBOdW0yME1oekNoYW5uZWxzID49IE5VTV9SRl9DSEFOTkVMUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gUkZfQ0hBTl8xNDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwMjBNaHpDaGFubmVsc1tjb3VudCsrXSA9IHJmQ2hhbm5lbHNbaV0uY2hhbm5lbE51bTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICAgICAgICAgIGZvciggaSA9IFJGX0NIQU5fMzY7IGkgPD0gUkZfQ0hBTl8xNjU7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcDIwTWh6Q2hhbm5lbHNbY291bnQrK10gPSByZkNoYW5uZWxzW2ldLmNoYW5uZWxOdW07CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICAqcE51bTIwTWh6Q2hhbm5lbHMgPSBjb3VudDsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgdm9zX252X3JlYWREZWZhdWx0Q291bnRyeVRhYmxlKCkgLSByZXR1cm4gdGhlIGRlZmF1bHQgQ291bnRyeSB0YWJsZQorICBccGFyYW0gdGFibGUgZGF0YSAtIGEgdW5pb24gdG8gcmV0dXJuIHRoZSBkZWZhdWx0IGNvdW50cnkgdGFibGUgZGF0YSBpbi4KKyAgXHJldHVybiBzdGF0dXMgb2YgdGhlIE5WIHJlYWQgb3BlcmF0aW9uCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX252X3JlYWREZWZhdWx0Q291bnRyeVRhYmxlKCB1TnZUYWJsZXMgKnRhYmxlRGF0YSApCit7CisgICAKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworCisgICBzdGF0dXMgPSB2b3NfbnZfcmVhZCggVk5WX0RFRkFVTFRfTE9DQVRJT04sIHRhYmxlRGF0YSwgTlVMTCwgc2l6ZW9mKHNEZWZhdWx0Q291bnRyeSkgKTsKKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiB2b3NfbnZfZ2V0QnVmZmVyIC0gCisgIFxwYXJhbSBwQnVmZmVyICAtIHRvIHJldHVybiB0aGUgYnVmZmVyIGFkZHJlc3MKKyAgICAgICAgICAgICAgcFNpemUgICAgIC0gYnVmZmVyIHNpemUuCisgIFxyZXR1cm4gc3RhdHVzIG9mIHRoZSBOViByZWFkIG9wZXJhdGlvbgorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19udl9nZXROVkJ1ZmZlcih2X1ZPSURfdCAqKnBOdkJ1ZmZlcix2X1NJWkVfdCAqcFNpemUpCit7CisKKyAgIC8qIFNlbmQgdGhlIE5WIHN0cnVjdHVyZSBhbmQgc2l6ZSAqLworICAgKnBOdkJ1ZmZlciA9ICh2X1ZPSURfdCAqKSgmcG52RUZTVGFibGUtPmhhbG52KTsKKyAgICpwU2l6ZSA9IHNpemVvZihzSGFsTnYpOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHZvc19udl9zZXRSZWdEb21haW4gLSAKKyAgXHBhcmFtIGNsaWVudEN0eHQgIC0gQ2xpZW50IENvbnRleHQsIE5vdCB1c2VkIGZvciBQUklNQQorICAgICAgICAgICAgICByZWdJZCAgLSBSZWd1bGF0b3J5IERvbWFpbiBJRAorICBccmV0dXJuIHN0YXR1cyBzZXQgUkVHIGRvbWFpbiBvcGVyYXRpb24KKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfbnZfc2V0UmVnRG9tYWluKHZvaWQgKiBjbGllbnRDdHh0LCB2X1JFR0RPTUFJTl90IHJlZ0lkKQoreworICAgLyogQ2xpZW50IENvbnRleHQgQXJndW1hbnQgbm90IHVzZWQgZm9yIFBSSU1BICovCisgICBpZihyZWdJZCA+PSBSRUdET01BSU5fQ09VTlQpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIlZPUyBzZXQgcmVnIGRvbWFpbiwgaW52YWxpZCBSRUcgZG9tYWluIElEICVkIiwgcmVnSWQpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLyogU2V0IGNvcnJlY3QgY2hhbm5lbCBpbmZvcm1hdGlvbiBiYXNlZCBvbiBSRUcgRG9tYWluICovCisgICByZWdDaGFubmVscyA9IHBudkVGU1RhYmxlLT5oYWxudi50YWJsZXMucmVnRG9tYWluc1tyZWdJZF0uY2hhbm5lbHM7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgdm9zX252X2dldENoYW5uZWxFbmFibGVkU3RhdGUgLSAKKyAgXHBhcmFtIHJmQ2hhbm5lbCAgLSBpbnB1dCBjaGFubmVsIGVudW0gdG8ga25vdyBldmFibGVkIHN0YXRlCisgIFxyZXR1cm4gZU5WQ2hhbm5lbEVuYWJsZWRUeXBlIGVuYWJsZWQgc3RhdGUgZm9yIGNoYW5uZWwKKyAgICAgICAgICAgICAqIGVuYWJsZWQKKyAgICAgICAgICAgICAqIGRpc2FibGVkCisgICAgICAgICAgICAgKiBERlMKKyAgXHNhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZU5WQ2hhbm5lbEVuYWJsZWRUeXBlIHZvc19udl9nZXRDaGFubmVsRW5hYmxlZFN0YXRlCisoCisgICB2X1UzMl90ICAgICByZkNoYW5uZWwKKykKK3sKKyAgIHZfVTMyX3QgICAgICAgY2hhbm5lbExvb3A7CisgICBlUmZDaGFubmVscyAgIGNoYW5uZWxFbnVtID0gSU5WQUxJRF9SRl9DSEFOTkVMOworCisgICBmb3IoY2hhbm5lbExvb3AgPSAwOyBjaGFubmVsTG9vcCA8PSBSRl9DSEFOXzE2NTsgY2hhbm5lbExvb3ArKykKKyAgIHsKKyAgICAgIGlmKHJmQ2hhbm5lbHNbY2hhbm5lbExvb3BdLmNoYW5uZWxOdW0gPT0gcmZDaGFubmVsKQorICAgICAgeworICAgICAgICAgY2hhbm5lbEVudW0gPSAoZVJmQ2hhbm5lbHMpY2hhbm5lbExvb3A7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgaWYoSU5WQUxJRF9SRl9DSEFOTkVMID09IGNoYW5uZWxFbnVtKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJ2b3NfbnZfZ2V0Q2hhbm5lbEVuYWJsZWRTdGF0ZSwgaW52YWxpZCBjYWhubmVsICVkIiwgcmZDaGFubmVsKTsKKyAgICAgIHJldHVybiBOVl9DSEFOTkVMX0lOVkFMSUQ7CisgICB9CisKKyAgIHJldHVybiByZWdDaGFubmVsc1tjaGFubmVsRW51bV0uZW5hYmxlZDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DICovCmRpZmYgLS1naXQgYS9DT1JFL1ZPU1Mvc3JjL3Zvc19wYWNrZXQuYyBiL0NPUkUvVk9TUy9zcmMvdm9zX3BhY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGJkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19wYWNrZXQuYwpAQCAtMCwwICsxLDI5NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgXGZpbGUgICAgICAgIHZvc19wYWNrZXQuYworCisgIFxicmllZiAgICAgICB2aXJ0dWFsIE9wZXJhdGluZyBTeXN0ZW0gU2VydmljZXMgKHZPU1MpIG5ldHdvcmsgUGFja2V0IEFQSXMKKworICAgTmV0d29yayBQcm90b2NvbCBwYWNrZXQvYnVmZmVyIHN1cHBvcnQgaW50ZXJmYWNlcworCisgICBDb3B5cmlnaHQgMjAwOSAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8dm9zX3BhY2tldC5oPgorI2luY2x1ZGUgPGlfdm9zX3BhY2tldC5oPgorI2luY2x1ZGUgPHZvc190aW1lci5oPgorI2luY2x1ZGUgPHZvc190cmFjZS5oPgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyNpbmNsdWRlIDx3bGFuX2hkZF9tYWluLmg+ICAgCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGEgZGVmaW5pdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b3NfcGt0X2NvbnRleHRfdCAqZ3BWb3NQYWNrZXRDb250ZXh0ID0gTlVMTDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbnRhdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgVk9TX1NUQVRVUyB2b3NfcGt0aV9wYWNrZXRfaW5pdCggc3RydWN0IHZvc19wa3RfdCAqcFBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19QS1RfVFlQRSBwa3RUeXBlICkKK3sKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICAvLyBmaXhlZCBmaWVsZHMKKyAgIHBQa3QtPnBhY2tldFR5cGUgPSBwa3RUeXBlOworICAgcFBrdC0+bWFnaWMgPSBWUEtUX01BR0lDX05VTUJFUjsKKworICAgLy8gc29tZSBwYWNrZXQgdHlwZXMgbmVlZCBhbiBhdHRhY2hlZCBza2IKKyAgIHN3aXRjaCAocGt0VHlwZSkKKyAgIHsKKyAgIGNhc2UgVk9TX1BLVF9UWVBFX1JYX1JBVzoKKyAgIGNhc2UgVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01UOgorICAgICAgLy8gdGhlc2UgbmVlZCBhbiBhdHRhY2hlZCBza2IuCisgICAgICAvLyB3ZSBwcmVhbGxvY2F0ZSBhIGZpeGVkLXNpemUgc2tiIGFuZCByZXNlcnZlIHRoZSBlbnRpcmUgYnVmZmVyCisgICAgICAvLyBhcyBoZWFkcm9vbSBzaW5jZSB0aGF0IGlzIHdoYXQgb3RoZXIgY29tcG9uZW50cyBleHBlY3QKKyAgICAgIHBQa3QtPnBTa2IgPSBhbGxvY19za2IoVlBLVF9TSVpFX0JVRkZFUiwgR0ZQX0FUT01JQyk7CisgICAgICBpZiAobGlrZWx5KHBQa3QtPnBTa2IpKQorICAgICAgeworICAgICAgICAgc2tiX3Jlc2VydmUocFBrdC0+cFNrYiwgVlBLVF9TSVpFX0JVRkZFUik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgICB9CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICAgIC8qIEluaXQgUEFMIFBhY2tldCAqLworICAgICAgV1BBTF9QQUNLRVRfU0VUX0JEX1BPSU5URVIoJihwUGt0LT5wYWxQYWNrZXQpLCBOVUxMKTsKKyAgICAgIFdQQUxfUEFDS0VUX1NFVF9CRF9QSFlTKCYocFBrdC0+cGFsUGFja2V0KSwgTlVMTCk7CisgICAgICBXUEFMX1BBQ0tFVF9TRVRfQkRfTEVOR1RIKCYocFBrdC0+cGFsUGFja2V0KSwgMCk7CisgICAgICBXUEFMX1BBQ0tFVF9TRVRfT1NfU1RSVUNUX1BPSU5URVIoJihwUGt0LT5wYWxQYWNrZXQpLCBOVUxMKTsKKyNlbmRpZgorCisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICAvLyBubyBhdHRhY2hlZCBza2IgbmVlZGVkCisgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworCisKK3N0YXRpYyBWT1NfU1RBVFVTIHZvc19wa3RpX2xpc3RfZGVzdHJveSggc3RydWN0IGxpc3RfaGVhZCAqcExpc3QgKQoreworICAgc3RydWN0IHZvc19wa3RfdCAqcFZvc1BhY2tldDsKKworICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcExpc3QpKQorICAgeworICAgICAgLy8gc29tZXRoaW5nIGlzIGZpc2h5IC0tIGRvbid0IGV2ZW4gYm90aGVyIHRyeWluZyAKKyAgICAgIC8vIGNsZWFuIHVwIHRoaXMgbGlzdCBzaW5jZSBpdCBpcyBhcHBhcmVudGx5IGhvc2VkCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwTGlzdCIsIF9fTElORV9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHBWb3NQYWNrZXQsIHBMaXN0LCBub2RlKQorICAgeworCisgICAgICAvLyBpcyB0aGlzIHJlYWxseSBhbiBpbml0aWFsaXplZCB2b3MgcGFja2V0PworICAgICAgaWYgKHVubGlrZWx5KFZQS1RfTUFHSUNfTlVNQkVSICE9IHBWb3NQYWNrZXQtPm1hZ2ljKSkKKyAgICAgIHsKKyAgICAgICAgIC8vIG5vLCBzbyBkb24ndCB0cnkgYW55IGRlaW5pdGlhbGl6YXRpb24gb24gaXQsIGFuZAorICAgICAgICAgLy8gc2luY2Ugd2UgY2FuJ3QgdHJ1c3QgdGhlIGxpbmthZ2VzLCBzdG9wIHRyeWluZworICAgICAgICAgLy8gdG8gZGVzdHJveSB0aGUgbGlzdAorICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEludmFsaWQgbWFnaWMiLCBfX0xJTkVfXyk7CisgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIGRvZXMgdGhpcyB2b3MgcGFja2V0IGhhdmUgYW4gc2tiIGF0dGFjaGVkPworICAgICAgaWYgKHBWb3NQYWNrZXQtPnBTa2IpCisgICAgICB7CisgICAgICAgICAvLyB5ZXMsIHNvIGdpdmUgaXQgYmFjayB0byB0aGUga2VybmVsCisgICAgICAgICBrZnJlZV9za2IocFZvc1BhY2tldC0+cFNrYik7CisgICAgICAgICBwVm9zUGFja2V0LT5wU2tiID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgLy8gdGhlIHZvcyBwYWNrZXQgaXRzZWxmIGlzIGEgc3RhdGljIHBvcnRpb24gb2YgdGhlIHZvcyBwYWNrZXQgY29udGV4dAorICAgICAgLy8gc28gdGhlcmUgaXMgbm8gZGVhbGxvY2F0aW9uIHdlIGhhdmUgdG8gZG8gd2l0aCBpdC4gIGp1c3QgY2xlYXIgdGhlCisgICAgICAvLyBtYWdpYyBzbyB3ZSBubyBsb25nZXIgdGhpbmsgaXQgaXMgdmFsaWQKKyAgICAgIHBWb3NQYWNrZXQtPm1hZ2ljID0gMDsKKworICAgfQorCisgICAvLyBhbGwgbm9kZXMgb2YgdGhlIGxpc3QgaGF2ZSBiZWVuIHByb2Nlc3NlZCBzbyByZWluaXRpYWxpemUgdGhlIGxpc3QKKyAgIElOSVRfTElTVF9IRUFEKHBMaXN0KTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgdm9pZCB2b3NfcGt0aV9yZXBsZW5pc2hfcmF3X3Bvb2wodm9pZCkKK3sKKyAgIHN0cnVjdCBza19idWZmICogcFNrYjsKKyAgIHN0cnVjdCB2b3NfcGt0X3QgKnBWb3NQYWNrZXQ7CisgICB2X0JPT0xfdCBkaWRPbmUgPSBWT1NfRkFMU0U7CisgICB2b3NfcGt0X2dldF9wYWNrZXRfY2FsbGJhY2sgY2FsbGJhY2s7CisgICBpbnQgcmM7IAorCisgICAvLyBpZiB0aGVyZSBhcmUgbm8gcGFja2V0cyBpbiB0aGUgcmVwbGVuaXNoIHBvb2wgdGhlbiB3ZSBjYW4ndCBkbyBhbnl0aGluZworICAgaWYgKGxpa2VseSgwID09IGdwVm9zUGFja2V0Q29udGV4dC0+cnhSZXBsZW5pc2hMaXN0Q291bnQpKQorICAgeworICAgICAgcmV0dXJuOworICAgfQorCisgICAvLyB3ZSBvbmx5IHJlcGxlbmlzaCBpZiB0aGUgUnggUmF3IHBvb2wgaXMgZW1wdHkgb3IgdGhlIFJlcGxlbmlzaCBwb29sCisgICAvLyByZWFjaGVzIGEgaGlnaCB3YXRlciBtYXJrCisgICByYyA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZ3BWb3NQYWNrZXRDb250ZXh0LT5tbG9jayk7CisKKyAgIGlmICh1bmxpa2VseSgwICE9IHJjKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGFjcXVpcmUgbXV0ZXgsIGxpbmUgWyVkXSBpbiAlcyIsIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuOyAgICAgCisgICB9CisKKyAgIGlmICgoZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJlcGxlbmlzaExpc3RDb3VudCA8IFZQS1RfUlhfUkVQTEVOSVNIX1RIUkVTSE9MRCkKKyAgICAgICAmJgorICAgICAgICghbGlzdF9lbXB0eSgmZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJhd0ZyZWVMaXN0KSkpCisgICB7CisgICAgICBtdXRleF91bmxvY2soJmdwVm9zUGFja2V0Q29udGV4dC0+bWxvY2spOworICAgICAgcmV0dXJuOworICAgfQorCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiVlBLVCBbJWRdOiBQYWNrZXQgcmVwbGVuaXNoIGFjdGl2YXRlZCIsIF9fTElORV9fKTsKKworICAgLy8gdHJ5IHRvIHJlcGxlbmlzaCBhbGwgb2YgdGhlIHBhY2tldHMgaW4gdGhlIHJlcGxlbmlzaCBwb29sCisgICB3aGlsZSAoZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJlcGxlbmlzaExpc3RDb3VudCkKKyAgIHsKKyAgICAgIC8vIHdlIHByZWFsbG9jYXRlIGEgZml4ZWQtc2l6ZSBza2IgYW5kIHJlc2VydmUgdGhlIGVudGlyZSBidWZmZXIKKyAgICAgIC8vIGFzIGhlYWRyb29tIHNpbmNlIHRoYXQgaXMgd2hhdCBvdGhlciBjb21wb25lbnRzIGV4cGVjdAorICAgICAgcFNrYiA9IGFsbG9jX3NrYihWUEtUX1NJWkVfQlVGRkVSLCBHRlBfQVRPTUlDKTsKKyAgICAgIGlmICh1bmxpa2VseShOVUxMID09IHBTa2IpKQorICAgICAgeworICAgICAgICAgLy8gd2UgaGF2ZSByZXBsZW5pc2hlZCBhbGwgdGhhdCB3ZSBjYW4KKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc2tiX3Jlc2VydmUocFNrYiwgVlBLVF9TSVpFX0JVRkZFUik7CisKKyAgICAgIC8vIHJlbW92ZSBhIHZvcyBwYWNrZXQgZnJvbSB0aGUgcmVwbGVuaXNoIHBvb2wKKyAgICAgIHBWb3NQYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZncFZvc1BhY2tldENvbnRleHQtPnJ4UmVwbGVuaXNoTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2b3NfcGt0X3QsIG5vZGUpOworICAgICAgbGlzdF9kZWwoJnBWb3NQYWNrZXQtPm5vZGUpOworICAgICAgZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJlcGxlbmlzaExpc3RDb3VudC0tOworCisgICAgICAvLyBhdHRhY2ggdGhlIHNrYiB0byB0aGUgdm9zIHBhY2tldAorICAgICAgcFZvc1BhY2tldC0+cFNrYiA9IHBTa2I7CisKKyAgICAgIC8vIGFkZCBpdCB0byB0aGUgUnggUmF3IEZyZWUgUG9vbAorICAgICAgbGlzdF9hZGRfdGFpbCgmcFZvc1BhY2tldC0+bm9kZSwgJmdwVm9zUGFja2V0Q29udGV4dC0+cnhSYXdGcmVlTGlzdCk7CisKKyAgICAgIGRpZE9uZSA9IFZPU19UUlVFOworCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBbJXBdIFBhY2tldCByZXBsZW5pc2hlZCIsCisgICAgICAgICAgICAgICAgX19MSU5FX18sIHBWb3NQYWNrZXQpOworCisgICB9CisKKyAgIC8vIGlmIHdlIHJlcGxlbmlzaGVkIGFueXRoaW5nIGFuZCBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrIHdhaXRpbmcKKyAgIC8vIHRoZW4gaW52b2tlIHRoZSBjYWxsYmFjaworICAgaWYgKChWT1NfVFJVRSA9PSBkaWRPbmUpICYmCisgICAgICAgKGdwVm9zUGFja2V0Q29udGV4dC0+cnhSYXdMb3dSZXNvdXJjZUluZm8uY2FsbGJhY2spKQorICAgeworICAgICAgLy8gcmVtb3ZlIHRoZSBmaXJzdCByZWNvcmQgZnJvbSB0aGUgZnJlZSBwb29sCisgICAgICBwVm9zUGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeSgmZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJhd0ZyZWVMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZvc19wa3RfdCwgbm9kZSk7CisgICAgICBsaXN0X2RlbCgmcFZvc1BhY2tldC0+bm9kZSk7CisKKyAgICAgIC8vIGNsZWFyIG91dCB0aGUgVXNlciBEYXRhIHBvaW50ZXJzIGluIHRoZSB2b3NzIHBhY2tldC4uCisgICAgICBtZW1zZXQoJnBWb3NQYWNrZXQtPnB2VXNlckRhdGEsIDAsIHNpemVvZihwVm9zUGFja2V0LT5wdlVzZXJEYXRhKSk7CisKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlICdjaGFpbicgcG9pbnRlciB0byBOVUxMLgorICAgICAgcFZvc1BhY2tldC0+cE5leHQgPSBOVUxMOworCisgICAgICAvLyB0aW1lc3RhbXAgdGhlIHZvcyBwYWNrZXQuCisgICAgICBwVm9zUGFja2V0LT50aW1lc3RhbXAgPSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpOworCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBbJXBdIFBhY2tldCByZXBsZW5pc2ggY2FsbGJhY2siLAorICAgICAgICAgICAgICAgIF9fTElORV9fLCBwVm9zUGFja2V0KTsKKworICAgICAgY2FsbGJhY2sgPSBncFZvc1BhY2tldENvbnRleHQtPnJ4UmF3TG93UmVzb3VyY2VJbmZvLmNhbGxiYWNrOworICAgICAgZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJhd0xvd1Jlc291cmNlSW5mby5jYWxsYmFjayA9IE5VTEw7CisgICAgICBtdXRleF91bmxvY2soJmdwVm9zUGFja2V0Q29udGV4dC0+bWxvY2spOworICAgICAgY2FsbGJhY2socFZvc1BhY2tldCwgZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJhd0xvd1Jlc291cmNlSW5mby51c2VyRGF0YSk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBtdXRleF91bmxvY2soJmdwVm9zUGFja2V0Q29udGV4dC0+bWxvY2spOworICAgfQorfQorCisKKyNpZiBkZWZpbmVkKCBXTEFOX0RFQlVHICkKK3N0YXRpYyBjaGFyICp2b3NfcGt0aV9wYWNrZXRfdHlwZV9zdHIoVk9TX1BLVF9UWVBFIHBrdFR5cGUpCit7CisgICBzd2l0Y2ggKHBrdFR5cGUpCisgICB7CisgICBjYXNlIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVDoKKyAgICAgIHJldHVybiAiVFhfODAyXzExX01HTVQiOworICAgICAgYnJlYWs7CisgICAKKyAgIGNhc2UgVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9EQVRBOgorICAgICAgcmV0dXJuICAiVFhfODAyXzExX0RBVEEiOworICAgICAgYnJlYWs7CisgICAgICAgCisgICBjYXNlIFZPU19QS1RfVFlQRV9UWF84MDJfM19EQVRBOgorICAgICAgcmV0dXJuICJUWF84MDJfM19EQVRBIjsKKyAgICAgIGJyZWFrOworICAgCisgICBjYXNlIFZPU19QS1RfVFlQRV9SWF9SQVc6CisgICAgICByZXR1cm4gIlJYX1JBVyI7CisgICAgICBicmVhazsKKworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgICBicmVhazsKKyAgIH0gCit9CisjZW5kaWYgLy8gZGVmaW5lZCggV0xBTl9ERUJVRyApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wYWNrZXRfb3BlbigpIC0gaW5pdGlhbGl6ZSB0aGUgdk9TUyBQYWNrZXQgbW9kdWxlCisKKyAgVGhlIFxhIHZvc19wYWNrZXRfb3BlbigpIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSB2T1NTIFBhY2tldAorICBtb2R1bGUuCisKKyAgXHBhcmFtICBwVm9zQ29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2T1NTIENvbnRleHQKKworICBccGFyYW0gIHBWb3NQYWNrZXRDb250ZXh0IC0gcG9pbnRlciB0byBhIHByZXZpb3VzbHkgYWxsb2NhdGVkCisgICAgICAgICAgYnVmZmVyIGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgdm9zIFBhY2tldCBjb250ZXh0LgorCisgIFxwYXJhbSAgdm9zUGFja2V0Q29udGV4dFNpemUgLSB0aGUgc2l6ZSBhbGxvY2F0ZWQgZm9yIHRoZSB2b3MKKyAgICAgICAgICBwYWNrZXQgY29udGV4dC4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHZvcyBQYWNrZXQgbW9kdWxlIHdhcyBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBpbml0aWFsaXplZCBhbmQgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgLSBTeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkKKyAgICAgICAgICBhcmUgdW5hdmFpbGFibGUgdG8gaW5pdGlsaXplIHRoZSB2b3MgUGFja2V0IG1vZHVsZQorCisgICAgICAgICAgVk9TX1NUQVRVU19FX05PTUVNIC0gaW5zdWZmaWNpZW50IG1lbW9yeSBleGlzdHMgdG8gaW5pdGlhbGl6ZQorICAgICAgICAgIHRoZSB2b3MgcGFja2V0IG1vZHVsZQorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gSW52YWxpZCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSB2b3Mgb3BlbgorICAgICAgICAgIGZ1bmN0aW9uCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgdm9zIHBhY2tldAorICAgICAgICAgIG1vZHVsZQorCisgIFxzYSB2b3NfcGFja2V0X2Nsb3NlKCkKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BhY2tldF9vcGVuKCB2X1ZPSURfdCAqcFZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF9jb250ZXh0X3QgKnBWb3NQYWNrZXRDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfU0laRV90IHZvc1BhY2tldENvbnRleHRTaXplICkKK3sKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdW5zaWduZWQgaW50IGZyZWVQYWNrZXRJbmRleDsKKyAgIHVuc2lnbmVkIGludCBpZHg7CisgICBzdHJ1Y3Qgdm9zX3BrdF90ICpwUGt0OworICAgc3RydWN0IGxpc3RfaGVhZCAqcEZyZWVMaXN0OworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIkVudGVyOiVzIixfX0ZVTkNUSU9OX18pOworCisgICBkbworICAgeworCisgICAgICBpZiAoTlVMTCA9PSBwVm9zQ29udGV4dCkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHBWb3NDb250ZXh0IiwgX19MSU5FX18pOworICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChOVUxMID09IHBWb3NQYWNrZXRDb250ZXh0KQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgcFZvc1BhY2tldENvbnRleHQiLCBfX0xJTkVfXyk7CisgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHNpemVvZih2b3NfcGt0X2NvbnRleHRfdCkgIT0gdm9zUGFja2V0Q29udGV4dFNpemUpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogaW52YWxpZCB2b3NQYWNrZXRDb250ZXh0U2l6ZSwgJWQgdnMgJWQiLAorICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBzaXplb2Yodm9zX3BrdF9jb250ZXh0X3QpLCB2b3NQYWNrZXRDb250ZXh0U2l6ZSk7CisgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gY2xlYXIgdGhlIHZvcyBwYWNrZXQgY29udGV4dC4gIGluIHRoZSBwcm9jZXNzIHRoaXMgd2lsbAorICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbG93IHJlc291cmNlIGluZm8gYmxvY2tzCisgICAgICBtZW1zZXQocFZvc1BhY2tldENvbnRleHQsIDAsIHZvc1BhY2tldENvbnRleHRTaXplKTsKKworICAgICAgLy8gc2F2ZSBhIGdsb2JhbCBwb2ludGVyIHRvIHRoZSB2b3MgcGFja2V0IGNvbnRleHQuCisgICAgICBncFZvc1BhY2tldENvbnRleHQgPSBwVm9zUGFja2V0Q29udGV4dDsKKworICAgICAgLy8gc2F2ZSB0aGUgdm9zIENvbnRleHQgcG9pbnRlciBpbiB0aGUgdm9zIFBhY2tldCBDb250ZXh0LgorICAgICAgcFZvc1BhY2tldENvbnRleHQtPnZvc0NvbnRleHQgPSBwVm9zQ29udGV4dDsKKworICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcnggUmVwbGVuaXNoIHBvb2wgKGluaXRpYWxseSBlbXB0eSkKKyAgICAgIElOSVRfTElTVF9IRUFEKCZwVm9zUGFja2V0Q29udGV4dC0+cnhSZXBsZW5pc2hMaXN0KTsKKyAgICAgIHBWb3NQYWNrZXRDb250ZXh0LT5yeFJlcGxlbmlzaExpc3RDb3VudCA9IDA7CisKKyAgICAgIC8vIGluZGV4IGludG8gdGhlIHBhY2tldCBjb250ZXh0J3Mgdm9zUGt0QnVmZmVyW10gYXJyYXkKKyAgICAgIGZyZWVQYWNrZXRJbmRleCA9IDA7CisKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlIHJ4UmF3IGZyZWUgbGlzdCBwb29sCisgICAgICBwRnJlZUxpc3QgPSAmcFZvc1BhY2tldENvbnRleHQtPnJ4UmF3RnJlZUxpc3Q7CisgICAgICBJTklUX0xJU1RfSEVBRChwRnJlZUxpc3QpOworCisgICAgICAvLyBmaWxsIHRoZSByeFJhdyBmcmVlIGxpc3QKKyAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgVlBLVF9OVU1fUlhfUkFXX1BBQ0tFVFM7IGlkeCsrKQorICAgICAgeworICAgICAgICAgcFBrdCA9ICZwVm9zUGFja2V0Q29udGV4dC0+dm9zUGt0QnVmZmVyc1tmcmVlUGFja2V0SW5kZXgrK107CisgICAgICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0aV9wYWNrZXRfaW5pdChwUGt0LCBWT1NfUEtUX1RZUEVfUlhfUkFXKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgICAgICAgV1BBTF9QQUNLRVRfU0VUX01FVEFJTkZPX1BPSU5URVIoJihwUGt0LT5wYWxQYWNrZXQpLAorICAgICAgICAgICAgICAgICAgKHZvaWQqKSZwVm9zUGFja2V0Q29udGV4dC0+cnhNZXRhSW5mb1tpZHhdKTsKKyAgICAgICAgIFdQQUxfUEFDS0VUX1NFVF9UWVBFKCYocFBrdC0+cGFsUGFja2V0KSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlV0xBTl9QQUxfUEtUX1RZUEVfUlhfUkFXKTsKKyNlbmRpZgorCisgICAgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBQYWNrZXQgaW5pdCBmYWlsdXJlIiwgX19MSU5FX18pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBsaXN0X2FkZF90YWlsKCZwUGt0LT5ub2RlLCBwRnJlZUxpc3QpOworICAgICAgfQorCisgICAgICAvLyBleGl0IGlmIGFueSBwcm9ibGVtcyBzbyBmYXIKKyAgICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKQorICAgICAgeworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlIHR4RGF0YSBmcmVlIGxpc3QgcG9vbAorICAgICAgcEZyZWVMaXN0ID0gJnBWb3NQYWNrZXRDb250ZXh0LT50eERhdGFGcmVlTGlzdDsKKyAgICAgIElOSVRfTElTVF9IRUFEKHBGcmVlTGlzdCk7CisKKyAgICAgIC8vIGZpbGwgdGhlIHR4RGF0YSBmcmVlIGxpc3QKKyAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgVlBLVF9OVU1fVFhfREFUQV9QQUNLRVRTOyBpZHgrKykKKyAgICAgIHsKKyAgICAgICAgIHBQa3QgPSAmcFZvc1BhY2tldENvbnRleHQtPnZvc1BrdEJ1ZmZlcnNbZnJlZVBhY2tldEluZGV4KytdOworICAgICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdGlfcGFja2V0X2luaXQocFBrdCwgVk9TX1BLVF9UWVBFX1RYXzgwMl8zX0RBVEEpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgICAgICAgV1BBTF9QQUNLRVRfU0VUX01FVEFJTkZPX1BPSU5URVIoJihwUGt0LT5wYWxQYWNrZXQpLAorICAgICAgICAgICAgICAgKHZvaWQqKSZwVm9zUGFja2V0Q29udGV4dC0+dHhEYXRhTWV0YUluZm9baWR4XSk7CisgICAgICAgICBXUEFMX1BBQ0tFVF9TRVRfVFlQRSgmKHBQa3QtPnBhbFBhY2tldCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVdMQU5fUEFMX1BLVF9UWVBFX1RYXzgwMl8zX0RBVEEpOworI2VuZGlmCisgICAgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBQYWNrZXQgaW5pdCBmYWlsdXJlIiwgX19MSU5FX18pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBsaXN0X2FkZF90YWlsKCZwUGt0LT5ub2RlLCBwRnJlZUxpc3QpOworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgIHBWb3NQYWNrZXRDb250ZXh0LT51Y3R4RGF0YUZyZWVMaXN0Q291bnQrKzsKKyNlbmRpZgorICAgICAgfQorCisgICAgICAvLyBleGl0IGlmIGFueSBwcm9ibGVtcyBzbyBmYXIKKyAgICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKQorICAgICAgeworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlIHR4TWdtdCBmcmVlIGxpc3QgcG9vbAorICAgICAgcEZyZWVMaXN0ID0gJnBWb3NQYWNrZXRDb250ZXh0LT50eE1nbXRGcmVlTGlzdDsKKyAgICAgIElOSVRfTElTVF9IRUFEKHBGcmVlTGlzdCk7CisKKyAgICAgIG11dGV4X2luaXQoJmdwVm9zUGFja2V0Q29udGV4dC0+bWxvY2spOworICAgICAgLy8gZmlsbCB0aGUgdHhNZ210IGZyZWUgbGlzdAorICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBWUEtUX05VTV9UWF9NR01UX1BBQ0tFVFM7IGlkeCsrKQorICAgICAgeworICAgICAgICAgcFBrdCA9ICZwVm9zUGFja2V0Q29udGV4dC0+dm9zUGt0QnVmZmVyc1tmcmVlUGFja2V0SW5kZXgrK107CisKKyAgICAgICAgIHZvc1N0YXR1cyA9IHZvc19wa3RpX3BhY2tldF9pbml0KHBQa3QsIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICAgICAgIFdQQUxfUEFDS0VUX1NFVF9NRVRBSU5GT19QT0lOVEVSKCYocFBrdC0+cGFsUGFja2V0KSwKKyAgICAgICAgICAgICAgICh2b2lkKikmcFZvc1BhY2tldENvbnRleHQtPnR4TWdtdE1ldGFJbmZvW2lkeF0pOworICAgICAgICAgV1BBTF9QQUNLRVRfU0VUX1RZUEUoJihwUGt0LT5wYWxQYWNrZXQpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVXTEFOX1BBTF9QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCk7CisjZW5kaWYKKworICAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogUGFja2V0IGluaXQgZmFpbHVyZSIsIF9fTElORV9fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgbGlzdF9hZGRfdGFpbCgmcFBrdC0+bm9kZSwgcEZyZWVMaXN0KTsKKyAgICAgIH0KKworICAgICAgLy8gZXhpdCBpZiBhbnkgcHJvYmxlbXMgc28gZmFyCisgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICB9IHdoaWxlICgwKTsKKworICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wYWNrZXRfY2xvc2UoKSAtIENsb3NlIHRoZSB2T1NTIFBhY2tldCBtb2R1bGUKKworICBUaGUgXGEgdm9zX3BhY2tldF9jbG9zZSgpIGZ1bmN0aW9uIGNsb3NlcyB0aGUgdk9TUyBQYWNrZXQgbW9kdWxlCisgIFVwb24gc3VjY2Vzc2Z1bCBjbG9zZSBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBmcm9tIHRoZSBPUyB3aWxsIGJlCisgIHJlbGlucXVpc2hlZC4KKworICBccGFyYW0gIHBWb3NDb250ZXh0IC0gcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZPU1MgQ29udGV4dAorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gUGFja2V0IG1vZHVsZSB3YXMgc3VjY2Vzc2Z1bGx5IGNsb3NlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIEludmFsaWQgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgcGFja2V0CisgICAgICAgICAgY2xvc2UgZnVuY3Rpb24KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gRmFpbHVyZSB0byBjbG9zZSB0aGUgdm9zIFBhY2tldCBtb2R1bGUKKworICBcc2Egdm9zX3BhY2tldF9vcGVuKCkKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGFja2V0X2Nsb3NlKCB2X1BWT0lEX3QgcFZvc0NvbnRleHQgKQoreworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIkVudGVyOiVzIixfX0ZVTkNUSU9OX18pOworCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBwVm9zQ29udGV4dCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwVm9zQ29udGV4dCIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIGlmICh1bmxpa2VseShncFZvc1BhY2tldENvbnRleHQtPnZvc0NvbnRleHQgIT0gcFZvc0NvbnRleHQpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IGludmFsaWQgcFZvc0NvbnRleHQiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAodm9pZCkgdm9zX3BrdGlfbGlzdF9kZXN0cm95KCZncFZvc1BhY2tldENvbnRleHQtPnR4TWdtdEZyZWVMaXN0KTsKKyAgICh2b2lkKSB2b3NfcGt0aV9saXN0X2Rlc3Ryb3koJmdwVm9zUGFja2V0Q29udGV4dC0+dHhEYXRhRnJlZUxpc3QpOworICAgKHZvaWQpIHZvc19wa3RpX2xpc3RfZGVzdHJveSgmZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJhd0ZyZWVMaXN0KTsKKyAgICh2b2lkKSB2b3NfcGt0aV9saXN0X2Rlc3Ryb3koJmdwVm9zUGFja2V0Q29udGV4dC0+cnhSZXBsZW5pc2hMaXN0KTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgIGdwVm9zUGFja2V0Q29udGV4dC0+dWN0eERhdGFGcmVlTGlzdENvdW50ID0gMDsKKyNlbmRpZgorCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wa3RfZ2V0X3BhY2tldCgpIC0gR2V0IGEgdm9zcyBQYWNrZXQKKworICBHZXRzIGEgdm9zcyBQYWNrZXQgZnJvbSBhbiBpbnRlcm5hbGx5IG1hbmFnZWQgcGFja2V0IHBvb2wuCisKKyAgXHBhcmFtIHBwUGFja2V0IC0gcG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSB0aGUgdm9zcyBQYWNrZXQgcG9pbnRlciBpcworICAgICAgICAgICAgICAgICAgICByZXR1cm5lZC4gIElmIG11bHRpcGxlIHBhY2tldHMgYXJlIHJlcXVlc3RlZCwgdGhleQorICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGNoYWluZWQgb250byB0aGlzIGZpcnN0IHBhY2tldC4KKworICBccGFyYW0gcGt0VHlwZSAtIHRoZSBwYWNrZXQgdHlwZSB0byBiZSByZXRyZWl2ZWQuICBWYWxpZCBwYWNrZXQgdHlwZXMgYXJlOgorICAgICA8dWw+CisgICAgICAgPGxpPiBWT1NfUEtUX1RZUEVfVFhfODAyXzExX01HTVQgLSB2b3NzIHBhY2tldCBpcyBmb3IgVHJhbnNtaXR0aW5nCisgICAgICAgICAgICA4MDIuMTEgTWFuYWdlbWVudCBmcmFtZXMuCisKKyAgICAgICA8bGk+IFZPU19QS1RfVFlQRV9SWF9SQVcgLSB2b3NzIFBhY2tldCBjb250YWlucyBhIGJ1ZmZlciBmb3IgUmVjZWl2aW5nCisgICAgICAgICAgICByYXcgZnJhbWVzIG9mIHVua25vd24gdHlwZS4KKyAgICAgPC91bD4KKworICBccGFyYW0gZGF0YVNpemUgLSB0aGUgRGF0YSBzaXplIG5lZWRlZCBpbiB0aGUgdm9zcyBQYWNrZXQuCisKKyAgXHBhcmFtIG51bVBhY2tldHMgLSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcmVxdWVzdGVkLgorCisgIFxwYXJhbSB6ZXJvQnVmZmVyIC0gcGFyYW1ldGVyIHRoYXQgdGVsbHMgdGhlIEFQSSB0byB6ZXJvIHRoZSBkYXRhIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgIGluIHRoaXMgdm9zcyBQYWNrZXQuCisgICAgIDx1bD4KKyAgICAgICA8bGk+IFZPU19UUlVFIC0gdGhlIEFQSSB3aWxsIHplcm8gb3V0IHRoZSBlbnRpcmUgZGF0YSBidWZmZXIuCisKKyAgICAgICA8bGk+IFZPU19GQUxTRSAtIHRoZSBBUEkgd2lsbCBub3QgemVybyBvdXQgdGhlIGRhdGEgYnVmZmVyLgorICAgICA8L3VsPgorCisgIFxub3RlIElmIGVub3VnaCByb29tIGZvciBoZWFkZXJzIHRvIHRyYW5zbWl0IG9yIHJlY2VpdmUgdGhlIHBhY2tldCBpcyBub3QKKyAgICAgICAgYXZhaWxhYmxlLCB0aGlzIEFQSSB3aWxsIGZhaWwuCisKKyAgXHBhcmFtIGNhbGxiYWNrIC0gVGhpcyBjYWxsYmFjayBmdW5jdGlvbiwgaWYgcHJvdmlkZWQsIGlzIGludm9rZWQgaW4gdGhlCisgICAgICAgICBjYXNlIHdoZW4gcmVzb3VyY2VzIGFyZSBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIG9mIHRoZSBjYWxsIHRvCisgICAgICAgICBnZXQgcGFja2V0cy4gIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgaW52b2tlZCB3aGVuIHBhY2tldHMgYXJlCisgICAgICAgICBhdmFpbGFibGUuCisKKyAgXHBhcmFtIHVzZXJEYXRhIC0gVGhpcyB1c2VyIGRhdGEgaXMgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxlciBpbiB0aGUKKyAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uLCBpZiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBBUEkgd2FzIGFibGUgdG8gZ2V0IGEgdm9zX3BhY2tldCBmb3IgdGhlCisgICAgICAgICAgcmVxdWVzdGVkIHR5cGUuICAqcHBQYWNrZXQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBwYWNrZXQuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBwa3RUeXBlIGlzIG5vdCBhIHZhbGlkIHBhY2tldCB0eXBlLiAgVGhpcworICAgICAgICAgIEFQSSBvbmx5IHN1cHBvcnRzIGdldHRpbmcgdm9zIHBhY2tldHMgZm9yIDgwMl8xMV9NR01UIGFuZAorICAgICAgICAgIFJYX1JBVyBwYWNrZXQgdHlwZXMuICBUaGlzIHN0YXR1cyBpcyBhbHNvIHJldHVybmVkIGlmIHRoZQorICAgICAgICAgIG51bVBhY2tldHMgb3IgZGF0YVNpemUgYXJlIGludmFsaWQuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gdW5hYmxlIHRvIGdldCByZXNvdXJjZXMgbmVlZGVkIHRvIGdldAorICAgICAgICAgIGEgdm9zIHBhY2tldC4gIElmIGEgY2FsbGJhY2sgZnVuY3Rpb24gaXMgc3BlY2lmaWVkIGFuZCB0aGlzCisgICAgICAgICAgc3RhdHVzIGlzIHJldHVybmVkIGZyb20gdGhlIEFQSSwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCisgICAgICAgICAgd2hlbiByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSB0byBmdWxmaWxsIHRoZSBvcmlnaW5hbCByZXF1ZXN0LgorCisgICAgICAgICAgTm90ZSB0aGF0IHRoZSBsb3cgcmVzb3VyY2VzIGNvbmRpdGlvbiBpcyBpbmRpY2F0ZWQgdG8gdGhlIGNhbGxlcgorICAgICAgICAgIGJ5IHJldHVybmluZyBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTLiAgVGhpcyBzdGF0dXMgaXMgdGhlIG9ubHkKKyAgICAgICAgICBub24tc3VjY2VzcyBzdGF0dXMgdGhhdCBpbmRpY2F0ZXMgdG8gdGhlIGNhbGxlciB0aGF0IHRoZSBjYWxsYmFjaworICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4gcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUuICBBbGwgb3RoZXIgc3RhdHVzCisgICAgICAgICAgaW5kaWNhdGUgZmFpbHVyZXMgdGhhdCBhcmUgbm90IHJlY292ZXJhYmxlIGFuZCB0aGUgJ2NhbGxiYWNrJworICAgICAgICAgIHdpbGwgbm90IGJlIGNhbGxlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gVGhlIEFQSSByZXR1cm5zIHRoaXMgc3RhdHVzIHdoZW4gdW5hYmxlCisgICAgICAgICAgdG8gZ2V0IGEgcGFja2V0IGZyb20gdGhlIHBhY2tldCBwb29sIGJlY2F1c2UgdGhlIHBvb2wKKyAgICAgICAgICBpcyBkZXBsZXRlZCBhbmQgdGhlIGNhbGxlciBkaWQgbm90IHNwZWNpZnkgYSBsb3cgcmVzb3VyY2UgY2FsbGJhY2suCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIFRoaXMgc3RhdHVzIGlzIHJldHVybmVkIHdoZW4gdGhlIFZPUworICAgICAgICAgIHBhY2tldCBwb29sIGlzIGluIGEgJ2xvdyByZXNvdXJjZScgY29uZGl0aW9uIGFuZCBjYW5ub3QKKyAgICAgICAgICBhY2NvbW9kYXRlIGFueSBtb3JlIGNhbGxzIHRvIHJldHJpZXZlIHBhY2tldHMgZnJvbSB0aGF0CisgICAgICAgICAgcG9vbC4gICBOb3RlIHRoaXMgaXMgYSBGQUlMVVJFIGFuZCB0aGUgJ2xvdyByZXNvdXJjZScgY2FsbGJhY2sKKyAgICAgICAgICB3aWxsICpub3QqIGJlIGNhbGxlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHBwUGFja2V0IGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZCBwb2ludGVyLgorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3RfZ2V0X3BhY2tldCggdm9zX3BrdF90ICoqcHBQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1BLVF9UWVBFIHBrdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9TSVpFX3QgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9TSVpFX3QgbnVtUGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCB6ZXJvQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfZ2V0X3BhY2tldF9jYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqdXNlckRhdGEgKQoreworICAgc3RydWN0IGxpc3RfaGVhZCAqcFBrdEZyZWVMaXN0OworICAgdm9zX3BrdF9sb3dfcmVzb3VyY2VfaW5mbyAqcExvd1Jlc291cmNlSW5mbzsKKyAgIHN0cnVjdCB2b3NfcGt0X3QgKnBWb3NQYWNrZXQ7CisgICBpbnQgcmM7IAorICAgLy8gVmFsaWRhdGUgdGhlIHJldHVybiBwYXJhbWV0ZXIgcG9pbnRlcgorICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcHBQYWNrZXQpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgcHBQYWNrZXQiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyB3ZSBvbmx5IHN1cHBvcnQgZ2V0dGluZyAxIHBhY2tldCBhdCB0aGlzIHRpbWUgKGFzIGRvIFdNICYgQU1TUykKKyAgIGlmICh1bmxpa2VseSgxICE9IG51bVBhY2tldHMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IGludmFsaWQgbnVtUGFja2V0cywgJWQiLCBfX0xJTkVfXywgbnVtUGFja2V0cyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YVNpemUgaXMgd2l0aGluIHJhbmdlCisgICBpZiAodW5saWtlbHkoKDAgPT0gZGF0YVNpemUpIHx8IChkYXRhU2l6ZSA+IFZQS1RfU0laRV9CVUZGRVIpKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBpbnZhbGlkIGRhdGFTaXplLCAlZCIsIF9fTElORV9fLCBkYXRhU2l6ZSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBkZXRlcm1pbmUgd2hpY2ggcGFja2V0IHBvb2wgYW5kIGxvdyByZXNvdXJjZSBibG9jayB3ZSBzaG91bGQgdXNlLgorICAgLy8gdGhpcyBBUEkgaXMgb25seSB2YWxpZCBmb3IgVFggTUdNVCBhbmQgUlggUkFXIHBhY2tldHMKKyAgIC8vIChUWCBEQVRBIHdpbGwgdXNlIHZvc19wa3Rfd3JhcF9kYXRhX3BhY2tldCgpKQorICAgc3dpdGNoIChwa3RUeXBlKQorICAgeworCisgICBjYXNlIFZPU19QS1RfVFlQRV9SWF9SQVc6CisgICAgICBwUGt0RnJlZUxpc3QgPSAmZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJhd0ZyZWVMaXN0OworICAgICAgcExvd1Jlc291cmNlSW5mbyA9ICZncFZvc1BhY2tldENvbnRleHQtPnJ4UmF3TG93UmVzb3VyY2VJbmZvOworCisgICAgICAvLyBzZWUgaWYgd2UgbmVlZCB0byByZXBsZW5pc2ggdGhlIFJ4IFJhdyBwb29sCisgICAgICB2b3NfcGt0aV9yZXBsZW5pc2hfcmF3X3Bvb2woKTsKKworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01UOgorICAgICAgcFBrdEZyZWVMaXN0ID0gJmdwVm9zUGFja2V0Q29udGV4dC0+dHhNZ210RnJlZUxpc3Q7CisgICAgICBwTG93UmVzb3VyY2VJbmZvID0gJmdwVm9zUGFja2V0Q29udGV4dC0+dHhNZ210TG93UmVzb3VyY2VJbmZvOworICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogaW52YWxpZCBwYWNrZXQgdHlwZSAlZFslc10iLAorICAgICAgICAgICAgICAgIF9fTElORV9fLCBwa3RUeXBlLCB2b3NfcGt0aV9wYWNrZXRfdHlwZV9zdHIocGt0VHlwZSkpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gaXMgdGhlcmUgYWxyZWFkeSBhIGxvdyByZXNvdXJjZSBjYWxsYmFjayByZWdpc3RlcmVkIGZvciB0aGlzIHBvb2w/CisgICAvLyB3ZSBvbmx5IHN1cHBvcnQgb25lIGNhbGxiYWNrIHBlciBwb29sLCBzbyBpZiBvbmUgaXMgYWxyZWFkeSByZWdpc3RlcmVkCisgICAvLyB0aGVuIHdlIGtub3cgd2UgYXJlIGFscmVhZHkgaW4gYSBsb3ctcmVzb3VyY2UgY29uZGl0aW9uCisgICBpZiAodW5saWtlbHkocExvd1Jlc291cmNlSW5mby0+Y2FsbGJhY2spKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IExvdyByZXNvdXJjZSBoYW5kbGVyIGFscmVhZHkgcmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9BTFJFQURZOworICAgfQorCisgICByYyA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZ3BWb3NQYWNrZXRDb250ZXh0LT5tbG9jayk7CisgICAvLyBhcmUgdGhlcmUgdm9zIHBhY2tldHMgb24gdGhlIGFzc29jaWF0ZWQgZnJlZSBwb29sPworICAgaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkocFBrdEZyZWVMaXN0KSkpCisgICB7CisgICAgICAvLyBhbGxvY2F0aW9uIGZhaWxlZAorICAgICAgLy8gZGlkIHRoZSBjYWxsZXIgc3BlY2lmeSBhIGNhbGxiYWNrPworICAgICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gY2FsbGJhY2spKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJWUEtUIFslZF06IExvdyByZXNvdXJjZSBjb25kaXRpb24gYW5kIG5vIGNhbGxiYWNrIHByb3ZpZGVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0xJTkVfXyk7CisgICAgICAgICBpZiAobGlrZWx5KDAgPT0gcmMpKSAKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG11dGV4X3VubG9jaygmZ3BWb3NQYWNrZXRDb250ZXh0LT5tbG9jayk7CisgICAgICAgICB9CisKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIH0KKworICAgICAgLy8gc2F2ZSB0aGUgbG93IHJlc291cmNlIGluZm9ybWF0aW9uIHNvIHRoYXQgd2UgY2FuIGludm9rZSB0aGUKKyAgICAgIC8vIGNhbGxiYWNrIHdoZW4gYSBwYWNrZXQgYmVjb21lcyBhdmFpbGFibGUKKyAgICAgIHBMb3dSZXNvdXJjZUluZm8tPmNhbGxiYWNrICAgPSBjYWxsYmFjazsKKyAgICAgIHBMb3dSZXNvdXJjZUluZm8tPnVzZXJEYXRhICAgPSB1c2VyRGF0YTsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IExvdyByZXNvdXJjZSBjb25kaXRpb24gZm9yIHBhY2tldCB0eXBlICVkWyVzXSIsCisgICAgICAgICAgICAgICAgX19MSU5FX18sIHBrdFR5cGUsIHZvc19wa3RpX3BhY2tldF90eXBlX3N0cihwa3RUeXBlKSk7CisgICAgICBpZiAobGlrZWx5KDAgPT0gcmMpKSAKKyAgICAgIHsKKyAgICAgICAgIG11dGV4X3VubG9jaygmZ3BWb3NQYWNrZXRDb250ZXh0LT5tbG9jayk7CisgICAgICB9CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX1JFU09VUkNFUzsKKyAgIH0KKworICAgLy8gcmVtb3ZlIHRoZSBmaXJzdCByZWNvcmQgZnJvbSB0aGUgZnJlZSBwb29sCisgICBwVm9zUGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeShwUGt0RnJlZUxpc3QsIHN0cnVjdCB2b3NfcGt0X3QsIG5vZGUpOworICAgbGlzdF9kZWwoJnBWb3NQYWNrZXQtPm5vZGUpOworICAgaWYgKGxpa2VseSgwID09IHJjKSkgCisgICB7CisgICAgICBtdXRleF91bmxvY2soJmdwVm9zUGFja2V0Q29udGV4dC0+bWxvY2spOworICAgfQorCisgICAvLyBjbGVhciBvdXQgdGhlIFVzZXIgRGF0YSBwb2ludGVycyBpbiB0aGUgdm9zcyBwYWNrZXQuLgorICAgbWVtc2V0KCZwVm9zUGFja2V0LT5wdlVzZXJEYXRhLCAwLCBzaXplb2YocFZvc1BhY2tldC0+cHZVc2VyRGF0YSkpOworCisgICAvLyBpbml0aWFsaXplIHRoZSAnY2hhaW4nIHBvaW50ZXIgdG8gTlVMTC4KKyAgIHBWb3NQYWNrZXQtPnBOZXh0ID0gTlVMTDsKKworICAgLy8gc2V0IHRoZSBwYWNrZXQgdHlwZS4KKyAgIHBWb3NQYWNrZXQtPnBhY2tldFR5cGUgPSBwa3RUeXBlOworCisgICAvLyB0aW1lc3RhbXAgdGhlIHZvcyBwYWNrZXQuCisgICBwVm9zUGFja2V0LT50aW1lc3RhbXAgPSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpOworCisgICAvLyB6ZXJvIHRoZSBkYXRhIGJ1ZmZlciBpZiB0aGUgdXNlciBhc2tlZCBmb3IgaXQgdG8gYmUgY2xlYXJlZC4KKyAgIGlmICh1bmxpa2VseSh6ZXJvQnVmZmVyKSkKKyAgIHsKKyAgICAgIG1lbXNldChwVm9zUGFja2V0LT5wU2tiLT5oZWFkLAorICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgc2tiX2VuZF9wb2ludGVyKHBWb3NQYWNrZXQtPnBTa2IpIC0gcFZvc1BhY2tldC0+cFNrYi0+aGVhZCk7CisgICB9CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICJWUEtUIFslZF06IFslcF0gUGFja2V0IGFsbG9jYXRlZCwgdHlwZSAlZFslc10iLAorICAgICAgICAgICAgIF9fTElORV9fLCBwVm9zUGFja2V0LCBwa3RUeXBlLCB2b3NfcGt0aV9wYWNrZXRfdHlwZV9zdHIocGt0VHlwZSkpOworCisgICAqcHBQYWNrZXQgPSBwVm9zUGFja2V0OworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcGt0X3dyYXBfZGF0YV9wYWNrZXRzKCkgLSBXcmFwIGFuIE9TIHByb3ZpZGVkIGRhdGEgcGFja2V0IGluIGEKKyAgICAgICAgIHZvcyBwYWNrZXQuCisKKyAgVGFrZXMgYXMgaW5wdXQgYW4gT1MgcHJvdmlkZWQgZGF0YSBwYWNrZXQgYW5kICd3cmFwcycgdGhhdCBwYWNrZXQgaW4gYQorICB2b3NfcGFja2V0LCByZXR1cm5pbmcgdGhlIHZvc19wYWNrZXQgdG8gdGhlIGNhbGxlci4KKworICBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBIREQgdG8gd3JhcCBUeCBkYXRhIHBhY2tldHMKKyAgZnJvbSB0aGUgT1MgaW50byB2b3NfcGFja2V0cyBiZWZvcmUgc2VuZGluZyB0aGVtIHRvIFRMIGZvciB0cmFuc21pc3Npb24uCisKKyAgXHBhcmFtIHBwUGFja2V0IC0gcG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSB0aGUgdm9zcyBQYWNrZXQgcG9pbnRlciBpcworICAgICAgICAgICAgICAgICAgICByZXR1cm5lZC4gIElmIG11bHRpcGxlIHBhY2tldHMgYXJlIHJlcXVlc3RlZCwgdGhleQorICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGNoYWluZWQgb250byB0aGlzIGZpcnN0IHBhY2tldC4KKworICBccGFyYW0gcGt0VHlwZSAtIHRoZSBwYWNrZXQgdHlwZSB0byBiZSByZXRyZWl2ZWQuICBWYWxpZCBwYWNrZXQgdHlwZXMgYXJlOgorICAgICA8dWw+CisgICAgICAgPGxpPiBWT1NfUEtUX1RZUEVfODAyXzNfREFUQSAtIHZvc3MgcGFja2V0IGlzIGZvciBUcmFuc21pdHRpbmcgODAyLjMKKyAgICAgICAgICAgIGRhdGEgZnJhbWVzLgorCisgICAgICAgPGxpPiBWT1NfUEtUX1RZUEVfODAyXzExX0RBVEEgLSB2b3NzIFBhY2tldCBpcyBmb3IgVHJhbnNtaXR0aW5nIDgwMi4xMQorICAgICAgICAgICAgZGF0YSBmcmFtZXMuCisgICAgIDwvdWw+CisKKyAgXHBhcmFtIHBPU1BhY2tldCAtIGEgcG9pbnRlciB0byB0aGUgVHJhbnNtaXQgcGFja2V0IHByb3ZpZGVkIGJ5IHRoZSBPUy4gIFRoaXMKKyAgICAgICAgIE9TIHByb3ZpZGVkIHBhY2tldCB3aWxsIGJlIHdyYXBwZWQgaW50byBhIHZvc19wYWNrZXRfdC4gIE5vdGUgdGhpcworICAgICAgICAgT1MgcGFja2V0IHBvaW50ZXIgY2FuIGJlIE5VTEwuICBUaGUgT1MgcGFja2V0IHBvaW50ZXIgY2FuIGJlIGluc2VydGVkCisgICAgICAgICBpbnRvIGEgVk9TIHBhY2tldCBvZiB0eXBlIFZPU19QS1RfVFlQRV84MDJfM19EQVRBIG9yCisgICAgICAgICBWT1NfUEtUX1RZUEVfODAyXzExX0RBVEEgdGhyb3VnaCB2b3NfcGt0X3NldF9vc19wYWNrZXQoKS4KKworICBcbm90ZSBJZiBlbm91Z2ggcm9vbSBmb3IgaGVhZGVycyB0byB0cmFuc21pdCBvciByZWNlaXZlIHRoZSBwYWNrZXQgaXMgbm90CisgICAgICAgIGF2YWlsYWJsZSwgdGhpcyBBUEkgd2lsbCBmYWlsLgorCisgIFxwYXJhbSBjYWxsYmFjayAtIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24sIGlmIHByb3ZpZGVkLCBpcyBpbnZva2VkIGluIHRoZQorICAgICAgICAgY2FzZSB3aGVyZSBwYWNrZXRzIGFyZSBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIG9mIHRoZSBjYWxsIHRvCisgICAgICAgICByZXR1cm4gdGhlIHBhY2tldHMgdG8gdGhlIGNhbGxlciAoYSAnbG93IHJlc291cmNlJyBjb25kaXRpb24pLgorCisgICAgICAgICBXaGVuIHBhY2tldHMgYmVjb21lIGF2YWlsYWJsZSwgdGhlIGNhbGxiYWNrIGNhbGxiYWNrIGZ1bmN0aW9uIGlzCisgICAgICAgICBpbnZva2VkIHRvIHJldHVybiBhIFZPUyBwYWNrZXQgdG8gdGhlIGNhbGxlci4gIE5vdGUgdGhhdCB0aGUKKyAgICAgICAgIE9TIFBhY2tldCBpcyAqbm90KiBpbnNlcnRlZCBpbnRvIHRoZSBWT1MgcGFja2V0IHdoZW4gaXQgaXMgcmV0dXJuZWQKKyAgICAgICAgIHRvIHRoZSBsb3cgcmVzb3VyY2UgY2FsbGJhY2suICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGluc2VydAorICAgICAgICAgdGhlIE9TIHBhY2tldCBpbnRvIHRoZSBWT1MgcGFja2V0IGJ5IGNhbGxpbmcgdm9zX3BrdF9zZXRfb3NfcGFja2V0KCkKKworICBccGFyYW0gdXNlckRhdGEgLSBUaGlzIHVzZXIgZGF0YSBpcyBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGluIHRoZQorICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24sIGlmIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLgorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGhlIEFQSSB3YXMgYWJsZSB0byBnZXQgYSB2b3NfcGFja2V0IGZvciB0aGUKKyAgICAgICAgICByZXF1ZXN0ZWQgdHlwZS4gICpwcFBhY2tldCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHBhY2tldC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHBrdFR5cGUgaXMgbm90IGEgdmFsaWQgcGFja2V0IHR5cGUuICBUaGlzCisgICAgICAgICAgQVBJIG9ubHkgc3VwcG9ydHMgZ2V0dGluZyB2b3MgcGFja2V0cyBmb3IgODAyXzExX01HTVQgYW5kCisgICAgICAgICAgUlhfUkFXIHBhY2tldCB0eXBlcy4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgLSB1bmFibGUgdG8gZ2V0IHJlc291cmNlcyBuZWVkZWQgdG8gZ2V0CisgICAgICAgICAgYSB2b3MgcGFja2V0LiAgSWYgYSBjYWxsYmFjayBmdW5jdGlvbiBpcyBzcGVjaWZpZWQgYW5kIHRoaXMKKyAgICAgICAgICBzdGF0dXMgaXMgcmV0dXJuZWQgZnJvbSB0aGUgQVBJLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKKyAgICAgICAgICB3aGVuIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlIHRvIGZ1bGZpbGwgdGhlIG9yaWdpbmFsIHJlcXVlc3QuCisKKyAgICAgICAgICBOb3RlIHRoYXQgdGhlIGxvdyByZXNvdXJjZXMgY29uZGl0aW9uIGlzIGluZGljYXRlZCB0byB0aGUgY2FsbGVyCisgICAgICAgICAgYnkgcmV0dXJuaW5nIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMuICBUaGlzIHN0YXR1cyBpcyB0aGUgb25seQorICAgICAgICAgIG5vbi1zdWNjZXNzIHN0YXR1cyB0aGF0IGluZGljYXRlcyB0byB0aGUgY2FsbGVyIHRoYXQgdGhlIGNhbGxiYWNrCisgICAgICAgICAgd2lsbCBiZSBjYWxsZWQgd2hlbiByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZS4gIEFsbCBvdGhlciBzdGF0dXMKKyAgICAgICAgICBpbmRpY2F0ZSBmYWlsdXJlcyB0aGF0IGFyZSBub3QgcmVjb3ZlcmFibGUgYW5kIHRoZSAnY2FsbGJhY2snCisgICAgICAgICAgd2lsbCBub3QgYmUgY2FsbGVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBUaGUgQVBJIHJldHVybnMgdGhpcyBzdGF0dXMgd2hlbiB1bmFibGUKKyAgICAgICAgICB0byBnZXQgYSBwYWNrZXQgZnJvbSB0aGUgcGFja2V0IHBvb2wgYmVjYXVzZSB0aGUgcG9vbAorICAgICAgICAgIGlzIGRlcGxldGVkIGFuZCB0aGUgY2FsbGVyIGRpZCBub3Qgc3BlY2lmeSBhIGxvdyByZXNvdXJjZSBjYWxsYmFjay4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gVGhpcyBzdGF0dXMgaXMgcmV0dXJuZWQgd2hlbiB0aGUgVk9TCisgICAgICAgICAgcGFja2V0IHBvb2wgaXMgaW4gYSAnbG93IHJlc291cmNlJyBjb25kaXRpb24gYW5kIGNhbm5vdAorICAgICAgICAgIGFjY29tb2RhdGUgYW55IG1vcmUgY2FsbHMgdG8gcmV0cmlldmUgcGFja2V0cyBmcm9tIHRoYXQKKyAgICAgICAgICBwb29sLiAgIE5vdGUgdGhpcyBpcyBhIEZBSUxVUkUgYW5kIHRoZSAnbG93IHJlc291cmNlJyBjYWxsYmFjaworICAgICAgICAgIHdpbGwgKm5vdCogYmUgY2FsbGVkLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gcHBQYWNrZXQgb3IgcE9TUGFja2V0IGRvIG5vdCBzcGVjaWZ5IHZhbGlkCisgICAgICAgICAgcG9pbnRlcnMuCisKKyAgXHNhIHZvc19wa3Rfc2V0X29zX3BhY2tldCgpCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF93cmFwX2RhdGFfcGFja2V0KCB2b3NfcGt0X3QgKipwcFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfUEtUX1RZUEUgcGt0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqcE9TUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfZ2V0X3BhY2tldF9jYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqdXNlckRhdGEgKQoreworICAgc3RydWN0IGxpc3RfaGVhZCAqcFBrdEZyZWVMaXN0OworICAgdm9zX3BrdF9sb3dfcmVzb3VyY2VfaW5mbyAqcExvd1Jlc291cmNlSW5mbzsKKyAgIHN0cnVjdCB2b3NfcGt0X3QgKnBWb3NQYWNrZXQ7CisKKyAgIC8vIFZhbGlkYXRlIHRoZSByZXR1cm4gcGFyYW1ldGVyIHBvaW50ZXIKKyAgIGlmICh1bmxpa2VseShOVUxMID09IHBwUGFja2V0KSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHBwUGFja2V0IiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgdGhlIHBhY2tldCB0eXBlLiAgT25seSBUeCBEYXRhIHBhY2tldHMgY2FuIGhhdmUgYW4gT1MKKyAgIC8vIHBhY2tldCBhdHRhY2hlZCB0byB0aGVtIChUeCBNZ210IGFuZCBSeCBSYXcgaGF2ZSBPUyBwYWNrZXRzCisgICAvLyBwcmUtYXR0YWNoZWQgdG8gdGhlbSkKKyAgIGlmICh1bmxpa2VseShWT1NfUEtUX1RZUEVfVFhfODAyXzNfREFUQSAhPSBwa3RUeXBlKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBpbnZhbGlkIHBrdFR5cGUiLCBfX0xJTkVfXywgcGt0VHlwZSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBkZXRlcm1pbmUgd2hpY2ggcGFja2V0IHBvb2wgYW5kIGxvdyByZXNvdXJjZSBibG9jayB3ZSBzaG91bGQgdXNlLgorICAgcFBrdEZyZWVMaXN0ID0gJmdwVm9zUGFja2V0Q29udGV4dC0+dHhEYXRhRnJlZUxpc3Q7CisgICBwTG93UmVzb3VyY2VJbmZvID0gJmdwVm9zUGFja2V0Q29udGV4dC0+dHhEYXRhTG93UmVzb3VyY2VJbmZvOworCisgICAvLyBpcyB0aGVyZSBhbHJlYWR5IGEgbG93IHJlc291cmNlIGNhbGxiYWNrIHJlZ2lzdGVyZWQgZm9yIHRoaXMgcG9vbD8KKyAgIC8vIHdlIG9ubHkgc3VwcG9ydCBvbmUgY2FsbGJhY2sgcGVyIHBvb2wsIHNvIGlmIG9uZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQKKyAgIC8vIHRoZW4gd2Uga25vdyB3ZSBhcmUgYWxyZWFkeSBpbiBhIGxvdy1yZXNvdXJjZSBjb25kaXRpb24KKyAgIGlmICh1bmxpa2VseShwTG93UmVzb3VyY2VJbmZvLT5jYWxsYmFjaykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTG93IHJlc291cmNlIGhhbmRsZXIgYWxyZWFkeSByZWdpc3RlcmVkIiwKKyAgICAgICAgICAgICAgICBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0FMUkVBRFk7CisgICB9CisKKyAgIC8vIGFyZSB0aGVyZSB2b3MgcGFja2V0cyBvbiB0aGUgYXNzb2NpYXRlZCBmcmVlIHBvb2w/CisgICBpZiAodW5saWtlbHkobGlzdF9lbXB0eShwUGt0RnJlZUxpc3QpKSkKKyAgIHsKKyAgICAgIC8vIGFsbG9jYXRpb24gZmFpbGVkCisgICAgICAvLyBkaWQgdGhlIGNhbGxlciBzcGVjaWZ5IGEgY2FsbGJhY2s/CisgICAgICBpZiAodW5saWtlbHkoTlVMTCA9PSBjYWxsYmFjaykpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTG93IHJlc291cmNlIGNvbmRpdGlvbiBhbmQgbm8gY2FsbGJhY2sgcHJvdmlkZWQiLAorICAgICAgICAgICAgICAgICAgIF9fTElORV9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIH0KKworICAgICAgLy8gc2F2ZSB0aGUgbG93IHJlc291cmNlIGluZm9ybWF0aW9uIHNvIHRoYXQgd2UgY2FuIGludm9rZSB0aGUKKyAgICAgIC8vIGNhbGxiYWNrIHdoZW4gYSBwYWNrZXQgYmVjb21lcyBhdmFpbGFibGUKKyAgICAgIHBMb3dSZXNvdXJjZUluZm8tPmNhbGxiYWNrICAgPSBjYWxsYmFjazsKKyAgICAgIHBMb3dSZXNvdXJjZUluZm8tPnVzZXJEYXRhICAgPSB1c2VyRGF0YTsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IExvdyByZXNvdXJjZSBjb25kaXRpb24gZm9yIHBvb2wgJXMiLAorICAgICAgICAgICAgICAgIF9fTElORV9fLCB2b3NfcGt0aV9wYWNrZXRfdHlwZV9zdHIocGt0VHlwZSkpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9SRVNPVVJDRVM7CisgICB9CisKKyAgIC8vIHJlbW92ZSB0aGUgZmlyc3QgcmVjb3JkIGZyb20gdGhlIGZyZWUgcG9vbAorICAgcFZvc1BhY2tldCA9IGxpc3RfZmlyc3RfZW50cnkocFBrdEZyZWVMaXN0LCBzdHJ1Y3Qgdm9zX3BrdF90LCBub2RlKTsKKyAgIGxpc3RfZGVsKCZwVm9zUGFja2V0LT5ub2RlKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICBncFZvc1BhY2tldENvbnRleHQtPnVjdHhEYXRhRnJlZUxpc3RDb3VudCAtLTsKKyNlbmRpZgorCisgICAvLyBjbGVhciBvdXQgdGhlIFVzZXIgRGF0YSBwb2ludGVycyBpbiB0aGUgdm9zcyBwYWNrZXQuLgorICAgbWVtc2V0KCZwVm9zUGFja2V0LT5wdlVzZXJEYXRhLCAwLCBzaXplb2YocFZvc1BhY2tldC0+cHZVc2VyRGF0YSkpOworCisgICAvLyBpbml0aWFsaXplIHRoZSAnY2hhaW4nIHBvaW50ZXIgdG8gTlVMTC4KKyAgIHBWb3NQYWNrZXQtPnBOZXh0ID0gTlVMTDsKKworICAgLy8gc2V0IHRoZSBwYWNrZXQgdHlwZS4KKyAgIHBWb3NQYWNrZXQtPnBhY2tldFR5cGUgPSBwa3RUeXBlOworCisgICAvLyBzZXQgdGhlIHNrYiBwb2ludGVyCisgICBwVm9zUGFja2V0LT5wU2tiID0gKHN0cnVjdCBza19idWZmICopIHBPU1BhY2tldDsKKworICAgLy8gdGltZXN0YW1wIHRoZSB2b3MgcGFja2V0LgorICAgcFZvc1BhY2tldC0+dGltZXN0YW1wID0gdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKTsKKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIlZQS1QgWyVkXTogWyVwXSBQYWNrZXQgYWxsb2NhdGVkLCB0eXBlICVzIiwKKyAgICAgICAgICAgICBfX0xJTkVfXywgcFZvc1BhY2tldCwgdm9zX3BrdGlfcGFja2V0X3R5cGVfc3RyKHBrdFR5cGUpKTsKKworICAgKnBwUGFja2V0ID0gcFZvc1BhY2tldDsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcGt0X3NldF9vc19wYWNrZXQoKSAtIHNldCB0aGUgT1MgcGFja2V0IGluIGEgVk9TIGRhdGEgcGFja2V0CisKKyAgVGhpcyBBUEkgaW5zZXJ0cyBhbiBPUyBwYWNrZXQgaW50byBhIHByZXZpb3VzbHkgcmV0cmVpdmVkIFZPUyBwYWNrZXQuCisgIFRoaXMgQVBJIG9ubHkgYXBwbGllcyB0byBWT1MgcGFja2V0cyBvZiB0eXBlIFZPU19QS1RfVFlQRV84MDJfM19EQVRBIG9yCisgIFZPU19QS1RfVFlQRV84MDJfMTFfREFUQS4KKworICBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgYSB1c2VyIHdpbGwgbmVlZCB0byBnZXQgYSBWT1MgZGF0YSBwYWNrZXQgd2l0aG91dAorICBoYXZpbmcgdGhlIE9TIHBhY2tldCB0byBpbnNlcnQvd3JhcCBpbnRvIHRoZSBkYXRhIHBhY2tldC4gVGhpcyBjb3VsZCBoYXBwZW4KKyAgaWYgdGhlIHVzZXIgY2FsbHMgdm9zX3BrdF93cmFwX2RhdGFfcGFja2V0KCkgd2l0aG91dCB0aGUgT1MgcGFja2V0LgorCisgIEFsc28sIHdoZW4gdGhlIHVzZXIgaGl0IGEgJ2xvdyByZXNvdXJjZScgc2l0dWF0aW9uIGZvciBkYXRhIHBhY2tldHMsIHRoZQorICBsb3cgcmVzb3VyY2UgY2FsbGJhY2sgaXMgZ29pbmcgdG8gcmV0dXJuIGEgVk9TIHBhY2tldCB3aXRob3V0IGFuIE9TIHBhY2tldAorICBhdHRhY2hlZCB0byBpdC4gIFRoZSBjYWxsZXIgd2hvIGdldHMgdGhlIHBhY2tldCB0aHJvdWdoIHRoZSBsb3cgcmVzb3VyY2UKKyAgY2FsbGJhY2sgdXNlcyB0aGlzIEFQSSB0byBpbnNlcnQgYW4gT1MgcGFja2V0IGludG8gdGhlIFZPUyBwYWNrZXQgdGhhdAorICB3YXMgcmV0dXJuZWQgdGhyb3VnaCB0aGUgbG93IHJlc291cmNlIGNhbGxiYWNrLgorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIGluc2VydCB0aGUgT1MgcGFja2V0IGludG8uCisKKyAgXHBhcmFtIHBPU1BhY2tldCAtIGEgcG9pbnRlciB0byB0aGUgVHJhbnNtaXQgcGFja2V0IHByb3ZpZGVkIGJ5IHRoZSBPUy4gIFRoaXMKKyAgICAgICAgIE9TIHByb3ZpZGVkIHBhY2tldCB3aWxsIGJlIHdyYXBwZWQgaW50byBhIHZvc19wYWNrZXRfdC4gIE5vdGUgdGhpcworICAgICAgICAgT1MgcGFja2V0IHBvaW50ZXIgY2FuIGJlIE5VTEwuICBUaGUgT1MgcGFja2V0IHBvaW50ZXIgY2FuIGJlIGluc2VydGVkCisgICAgICAgICBpbnRvIGEgVk9TIHBhY2tldCBvZiB0eXBlIFZPU19QS1RfVFlQRV84MDJfM19EQVRBIG9yCisgICAgICAgICBWT1NfUEtUX1RZUEVfODAyXzExX0RBVEEgdGhyb3VnaCB2b3NfcGt0X3NldF9vc19wYWNrZXQoKS4KKworICAgICAgICAgQ2FsbGVyIGJld2FyZS4gIElmIHRoZXJlIGlzIGEgdmFsaWQgT1MgcGFja2V0IHdyYXBwZWQgaW50byB0aGlzCisgICAgICAgICBWT1MgcGFja2V0IGFscmVhZHksIHRoaXMgQVBJIHdpbGwgYmxpbmRseSBvdmVyd3JpdGUgdGhlIE9TIHBhY2tldAorICAgICAgICAgd2l0aCB0aGUgbmV3IG9uZSBzcGVjaWZpZWQgb24gdGhpcyBBUEkgY2FsbC4gIElmIHlvdSBuZWVkIHRvIGRldGVybWluZQorICAgICAgICAgb3IgcmV0cmVpdmUgdGhlIGN1cnJlbnQgT1MgcGFja2V0IGZyb20gYSBWT1MgcGFja2V0LCBjYWxsCisgICAgICAgICB2b3NfcGt0X2dldF9vc19wYWNrZXQoKSBmaXJzdC4KKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRoZSBBUEkgd2FzIGFibGUgdG8gaW5zZXJ0IHRoZSBPUyBwYWNrZXQgaW50bworICAgICAgICAgIHRoZSB2b3NfcGFja2V0LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gcGt0VHlwZSBpcyBub3QgYSB2YWxpZCBwYWNrZXQgdHlwZS4gIFRoaXMKKyAgICAgICAgICBBUEkgb25seSBzdXBwb3J0cyBnZXR0aW5nIHZvcyBwYWNrZXRzIG9mIHR5cGUKKyAgICAgICAgICBWT1NfUEtUX1RZUEVfODAyXzNfREFUQSBvciBWT1NfUEtUX1RZUEVfODAyXzExX0RBVEEuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgLSBwUGFja2V0IGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZCBwb2ludGVyLgorCisgIFxzYSB2b3NfcGt0X2dldF9vc19wYWNrZXQoKQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3Rfc2V0X29zX3BhY2tldCggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICpwT1NQYWNrZXQgKQoreworICAgLy8gVmFsaWRhdGUgdGhlIGlucHV0IHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KChOVUxMID09IHBQYWNrZXQpfHwoTlVMTCA9PSBwT1NQYWNrZXQpKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHBvaW50ZXIiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBWYWxpZGF0ZSB0aGF0IHRoaXMgcmVhbGx5IGFuIGluaXRpYWxpemVkIHZvcyBwYWNrZXQKKyAgIGlmICh1bmxpa2VseShWUEtUX01BR0lDX05VTUJFUiAhPSBwUGFja2V0LT5tYWdpYykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogSW52YWxpZCBtYWdpYyIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBwYWNrZXQgdHlwZS4gIE9ubHkgVHggRGF0YSBwYWNrZXRzIGNhbiBoYXZlIGFuIE9TCisgICAvLyBwYWNrZXQgYXR0YWNoZWQgdG8gdGhlbSAoVHggTWdtdCBhbmQgUnggUmF3IGhhdmUgT1MgcGFja2V0cworICAgLy8gcHJlLWF0dGFjaGVkIHRvIHRoZW0pCisgICBpZiAodW5saWtlbHkoVk9TX1BLVF9UWVBFX1RYXzgwMl8zX0RBVEEgIT0gcFBhY2tldC0+cGFja2V0VHlwZSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogaW52YWxpZCBwYWNrZXQgdHlwZSAlZFslc10iLAorICAgICAgICAgICAgICAgIF9fTElORV9fLCBwUGFja2V0LT5wYWNrZXRUeXBlLAorICAgICAgICAgICAgICAgIHZvc19wa3RpX3BhY2tldF90eXBlX3N0cihwUGFja2V0LT5wYWNrZXRUeXBlKSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBJcyB0aGVyZSBhbHJlYWR5IGEgcGFja2V0IGF0dGFjaGVkPyAgSWYgc28sIGp1c3Qgd2FybiBhbmQgY29udGludWUKKyAgIGlmICh1bmxpa2VseShwUGFja2V0LT5wU2tiKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IFBhY2tldCBwcmV2aW91c2x5IGF0dGFjaGVkIiwgX19MSU5FX18pOworICAgfQorCisgICAvLyBhdHRhY2gKKyAgIHBQYWNrZXQtPnBTa2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgcE9TUGFja2V0OworICAgCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wa3RfZ2V0X29zX3BhY2tldCgpIC0gZ2V0IHRoZSBPUyBwYWNrZXQgaW4gYSBWT1MgZGF0YSBwYWNrZXQKKworICBUaGlzIEFQSSByZXR1cm5zIHRoZSBPUyBwYWNrZXQgdGhhdCBpcyBpbnNlcnRlZCBpbiBhIFZPUyBwYWNrZXQuCisgIFRoaXMgQVBJIG9ubHkgYXBwbGllcyB0byBWT1MgcGFja2V0cyBvZiB0eXBlIFZPU19QS1RfVFlQRV84MDJfM19EQVRBIG9yCisgIFZPU19QS1RfVFlQRV84MDJfMTFfREFUQS4KKworICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCB0byByZXR1cm4gdGhlIE9TIHBhY2tldCBmcm9tLgorCisgIFxwYXJhbSBwcE9TUGFja2V0IC0gYSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgT1MgcGFja2V0IHBvaW50ZXIKKyAgICAgICAgIHJldHJlaXZlZCBmcm9tIHRoZSBWT1MgcGFja2V0IHdpbGwgYmUgcmV0dXJuZWQuICBOb3RlIHRoaXMgT1MgcGFja2V0CisgICAgICAgICBwb2ludGVyIGNhbiBiZSBOVUxMLCBtZWFuaW5nIHRoZXJlIGlzIG5vIE9TIHBhY2tldCBhdHRhY2hlZCB0byB0aGlzCisgICAgICAgICBWT1MgZGF0YSBwYWNrZXQuCisKKyAgXHBhcmFtIGNsZWFyT1NQYWNrZXQgLSBhIGJvb2xlYW4gdmFsdWUgdGhhdCB0ZWxscyB0aGUgQVBJIHRvIGNsZWFyIG91dCB0aGUKKyAgICAgICAgIE9TIHBhY2tldCBwb2ludGVyIGZyb20gdGhlIFZPUyBwYWNrZXQuICBTZXR0aW5nIHRoaXMgdG8gJ3RydWUnIHdpbGwKKyAgICAgICAgIGVzc2VudGlhbGx5IHJlbW92ZSB0aGUgT1MgcGFja2V0IGZyb20gdGhlIFZPUyBwYWNrZXQuICAnZmFsc2UnIG1lYW5zCisgICAgICAgICB0aGUgT1MgcGFja2V0IHJlbWFpbnMgY2hhaW5lZCB0byB0aGUgVk9TIHBhY2tldC4gIEluIGVpdGhlciBjYXNlLAorICAgICAgICAgdGhlIE9TIHBhY2tldCBwb2ludGVyIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgQVBJIHdhcyBhYmxlIHRvIHJldHJlaXZlIHRoZSBPUyBwYWNrZXQKKyAgICAgICAgICBwb2ludGVyIGZyb20gdGhlIFZPUyBwYWNrZXQgYW5kIHJldHVybiBpdCB0byB0aGUgY2FsbGVyIGluCisgICAgICAgICAgKnBwT3NQYWNrZXQKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHBrdFR5cGUgaXMgbm90IGEgdmFsaWQgcGFja2V0IHR5cGUuICBUaGlzCisgICAgICAgICAgQVBJIG9ubHkgc3VwcG9ydHMgZ2V0dGluZyB2b3MgcGFja2V0cyBvZiB0eXBlCisgICAgICAgICAgVk9TX1BLVF9UWVBFXzgwMl8zX0RBVEEgb3IgVk9TX1BLVF9UWVBFXzgwMl8xMV9EQVRBLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gcFBhY2tldCBvciBwcE9zUGFja2V0IGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZAorICAgICAgICAgIHBvaW50ZXJzLgorCisgIFxzYSB2b3NfcGt0X3NldF9vc19wYWNrZXQoKSwgdm9zX3BrdF93cmFwX2RhdGFfcGFja2V0KCksCisgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoKQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3RfZ2V0X29zX3BhY2tldCggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICoqcHBPU1BhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCBjbGVhck9TUGFja2V0ICkKK3sKKyAgIC8vIFZhbGlkYXRlIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KChOVUxMID09IHBQYWNrZXQpfHwoTlVMTCA9PSBwcE9TUGFja2V0KSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwb2ludGVyIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIHJlYWxseSBhbiBpbml0aWFsaXplZCB2b3MgcGFja2V0CisgICBpZiAodW5saWtlbHkoVlBLVF9NQUdJQ19OVU1CRVIgIT0gcFBhY2tldC0+bWFnaWMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEludmFsaWQgbWFnaWMiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBnZXQgT1MgcGFja2V0IHBvaW50ZXIKKyAgICpwcE9TUGFja2V0ID0gKHZfVk9JRF90ICopIHBQYWNrZXQtPnBTa2I7CisKKyAgIC8vIGNsZWFyIGl0PworICAgaWYgKGNsZWFyT1NQYWNrZXQpCisgICB7CisgICAgICBwUGFja2V0LT5wU2tiID0gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3BrdF9nZXRfdXNlcl9kYXRhX3B0cigpIC0gcmV0dXJuIGEgcG9pbnRlciB0byB1c2VyIGRhdGEgYXJlYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYSB2b3NzIFBhY2tldAorCisgIFRoaXMgQVBJIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3BlY2lmaWVkIHVzZXIgRGF0YSBhcmVhIGluIHRoZSB2b3NzCisgIFBhY2tldC4gIFVzZXIgZGF0YSBhcmVhcyBhcmUgdW5pcXVhIGFyZWFzIG9mIHRoZSB2b3NzIFBhY2tldCB0aGF0IGNhbgorICBiZSB1c2VkIGJ5IHNwZWNpZmljIGNvbXBvbmVudHMgdG8gc3RvcmUgcHJpdmF0ZSBkYXRhLiAgVGhlc2UgYXJlYXMgYXJlCisgIGlkZW50aWZpZWQgYnkgYSB1c2VyICJJRCIgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIGJ5IHRoZSBjb21wb25lbnQKKyAgc3BlY2lmaWVkLgorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIHJldHJlaXZlIHRoZSB1c2VyIGRhdGEgcG9pbnRlciBmcm9tLgorCisgIFxwYXJhbSB1c2VySUQgLSB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgZGF0YSBhcmVhIGluIHRoZSB2b3NzIFBhY2tldAorICAgICAgICAgICAgICAgICAgdG8gZ2V0LgorCisgICAgICAgICAgICAgICAgICBVc2VyIElEcyBhbmQgdXNlciBkYXRhIGFyZWFzIGluIHRoZSB2b3NzIFBhY2tldCBhcmUKKyAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBmb3I6CisgICAgICAgICAgICAgICAgICAtIFRyYW5zcG9ydCBMYXllciAoVEwpCisgICAgICAgICAgICAgICAgICAtIEJ1cyBBYnN0cmFjdGlvbiBMYXllciAoQkFMKQorICAgICAgICAgICAgICAgICAgLSBTRElPIFNlcnZpY2VzIENvbXBvbmVudCAoU1NDKQorICAgICAgICAgICAgICAgICAgLSBIb3N0IERldmljZSBEcml2ZXIgKEhERCkKKworICBccGFyYW0gcHBVc2VyRGF0YSAtIHBvaW50ZXIgdG8gbG9jYXRpb24gdG8gcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS4KKworICBccmV0dXJuIC0gTm90aGluZy4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9WT0lEX3Qgdm9zX3BrdF9nZXRfdXNlcl9kYXRhX3B0ciggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1BLVF9VU0VSX0RBVEFfSUQgdXNlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKipwcFVzZXJEYXRhICkKK3sKKyAgIC8vIFZhbGlkYXRlIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcFBhY2tldCkpCisgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwb2ludGVyIiwgX19MSU5FX18pOworICAgICAgIGlmIChwcFVzZXJEYXRhICE9IE5VTEwpCisgICAgICAgeworICAgICAgICAgICAqcHBVc2VyRGF0YSA9IE5VTEw7CisgICAgICAgfQorICAgICAgIHJldHVybjsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIHJlYWxseSBhbiBpbml0aWFsaXplZCB2b3MgcGFja2V0CisgICBpZiAodW5saWtlbHkoVlBLVF9NQUdJQ19OVU1CRVIgIT0gcFBhY2tldC0+bWFnaWMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEludmFsaWQgbWFnaWMiLCBfX0xJTkVfXyk7CisgICAgICAqcHBVc2VyRGF0YSA9IE5VTEw7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8vIFZhbGlkYXRlIHVzZXJJRAorICAgaWYgKHVubGlrZWx5KHVzZXJJRCA+PSBWT1NfUEtUX1VTRVJfREFUQV9JRF9NQVgpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEludmFsaWQgdXNlciBJRCBbJWRdIiwgX19MSU5FX18sIHVzZXJJRCk7CisgICAgICAqcHBVc2VyRGF0YSA9IE5VTEw7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8vIHJldHJlaXZlIHRoZSB1c2VyIGRhdGEgcG9pbnRlciBmcm9tIHRoZSB2b3MgUGFja2V0IGFuZAorICAgLy8gcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIuCisgICAqcHBVc2VyRGF0YSA9IHBQYWNrZXQtPnB2VXNlckRhdGFbdXNlcklEXTsKKworICAgcmV0dXJuOworfQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoKSAtIHNldCB0aGUgdXNlciBkYXRhIHBvaW50ZXIgb2YgYSB2b3NzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0CisKKyAgVGhpcyBBUEkgc2V0cyBhIHBvaW50ZXIgaW4gdGhlIHNwZWNpZmllZCB1c2VyIERhdGEgYXJlYSBpbiB0aGUgdm9zcworICBQYWNrZXQuICBVc2VyIGRhdGEgYXJlYXMgYXJlIHVuaXF1YSBhcmVhcyBvZiB0aGUgdm9zcyBQYWNrZXQgdGhhdCBjYW4KKyAgYmUgdXNlZCBieSBzcGVjaWZpYyBjb21wb25lbnRzIHRvIHN0b3JlIHByaXZhdGUgZGF0YS4gIFRoZXNlIGFyZWFzIGFyZQorICBpZGVudGlmaWVkIGJ5IGEgdXNlciAiSUQiIGFuZCBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCBieSB0aGUgY29tcG9uZW50CisgIHNwZWNpZmllZC4KKworICBOb3RlOiAgVGhlIHNpemUgb2YgdGhlIHVzZXIgZGF0YSBhcmVhcyBpbiB0aGUgdm9zcyBQYWNrZXQgYXJlIGZpeGVkLiAgVGhlCisgICAgICAgICBzaXplIG9mIGEgc2luZ2xlIHBvaW50ZXIgaXMgYXZhaWxhYmxlIGluIGVhY2ggdXNlciBhcmVhLgorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIHNldCB0aGUgdXNlciBwb2ludGVyLgorCisgIFxwYXJhbSB1c2VySUQgLSB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgZGF0YSBhcmVhIGluIHRoZSB2b3NzIFBhY2tldAorICAgICAgICAgICAgICAgICAgdG8gc2V0LgorCisgICAgICAgICAgICAgICAgICBVc2VyIElEcyBhbmQgdXNlciBkYXRhIGFyZWFzIGluIHRoZSB2b3NzIFBhY2tldCBhcmUKKyAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBmb3I6CisgICAgICAgICAgICAgICAgICAtIFRyYW5zcG9ydCBMYXllciAoVEwpCisgICAgICAgICAgICAgICAgICAtIEJ1cyBBYnN0cmFjdGlvbiBMYXllciAoQkFMKQorICAgICAgICAgICAgICAgICAgLSBTRElPIFNlcnZpY2VzIENvbXBvbmVudCAoU1NDKQorICAgICAgICAgICAgICAgICAgLSBIb3N0IERldmljZSBEcml2ZXIgKEhERCkKKworICBccGFyYW0gcFVzZXJEYXRhIC0gcG9pbnRlciB2YWx1ZSB0byBzZXQgaW4gdGhlIHVzZXIgZGF0YSBhcmVhIG9mIHRoZSB2b3NzCisgICAgICAgICAgICAgICAgICAgICBwYWNrZXQuLgorCisgIFxyZXR1cm4gLSBOb3RoaW5nLgorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2X1ZPSURfdCB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NfcGt0X3QgKnBQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfUEtUX1VTRVJfREFUQV9JRCB1c2VySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqcFVzZXJEYXRhICkKK3sKKyAgIC8vIFZhbGlkYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXIgcG9pbnRlcgorICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcFBhY2tldCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwb2ludGVyIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvLyBWYWxpZGF0ZSB0aGF0IHRoaXMgaXMgcmVhbGx5IGFuIGluaXRpYWxpemVkIHZvcyBwYWNrZXQKKyAgIGlmICh1bmxpa2VseShWUEtUX01BR0lDX05VTUJFUiAhPSBwUGFja2V0LT5tYWdpYykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogSW52YWxpZCBtYWdpYyIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgdXNlcklECisgICBpZiAodW5saWtlbHkodXNlcklEID49IFZPU19QS1RfVVNFUl9EQVRBX0lEX01BWCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogSW52YWxpZCB1c2VyIElEIFslZF0iLCBfX0xJTkVfXywgdXNlcklEKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLy8gcmV0cmVpdmUgdGhlIHVzZXIgZGF0YSBwb2ludGVyIGZyb20gdGhlIHZvcyBQYWNrZXQgYW5kCisgICAvLyByZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAgIHBQYWNrZXQtPnB2VXNlckRhdGFbdXNlcklEXSA9IHBVc2VyRGF0YTsKKworICAgcmV0dXJuOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcGt0X3JldHVybl9wYWNrZXQoKSAtIFJldHVybiBhIHZvc3MgUGFja2V0IChjaGFpbikgdG8gdk9TUworCisgIFRoaXMgQVBJIHJldHVybnMgYSB2b3NzIFBhY2tldCB0byB0aGUgaW50ZXJuYWxseSBtYW5hZ2VkIHBhY2tldCBwb29sLgorCisgIE5vdGU6ICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgcGFja2V0cyBjaGFpbmVkIHRvIHRoaXMgcGFja2V0LCB0aGUgZW50aXJlCisgIHBhY2tldCBjaGFpbiBpcyByZXR1cm5lZCB0byB2T1NTLiAgVGhlIGNhbGxlciBtdXN0IHVuY2hhaW4gdGhlCisgIHBhY2tldHMgdGhyb3VnaCB2b3NfcGt0X2dldF9uZXh0X3BhY2tldCgpIGFuZCByZXR1cm4gdGhlbSBpbmRpdmlkdWFsbHkKKyAgaWYgYWxsIHBhY2tldHMgaW4gdGhlIHBhY2tldCBjaGFpbiBhcmUgbm90IHRvIGJlIHJldHVybmVkLgorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0KHMpIHRvIHJldHVybi4gIE5vdGUgYWxsIHBhY2tldHMgY2hhaW5lZAorICAgICAgICAgICAgICAgICAgIHRvIHRoaXMgcGFja2V0IGFyZSByZXR1cm5lZCB0byB2T1NTLgorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHZvc19wa3RfdCAqcFBhY2tldCApCit7CisgICB2b3NfcGt0X3QgKnBOZXh0OworICAgc3RydWN0IGxpc3RfaGVhZCAqcFBrdEZyZWVMaXN0OworICAgdm9zX3BrdF9sb3dfcmVzb3VyY2VfaW5mbyAqcExvd1Jlc291cmNlSW5mbzsKKyAgIHZvc19wa3RfZ2V0X3BhY2tldF9jYWxsYmFjayBjYWxsYmFjazsKKyAgIHZfU0laRV90ICpwQ291bnQ7CisgICBpbnQgcmM7IAorICAgVk9TX1BLVF9UWVBFIHBhY2tldFR5cGUgPSBWT1NfUEtUX1RZUEVfVFhfODAyXzNfREFUQTsKKworICAgLy8gVmFsaWRhdGUgdGhlIGlucHV0IHBhcmFtZXRlciBwb2ludGVyCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBwUGFja2V0KSkKKyAgIHsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIGl0ZXJhdGUgdGhvdWdoIGFsbCBwYWNrZXRzIGluIHRoZSBjaGFpbgorICAgd2hpbGUgKHBQYWNrZXQpCisgICB7CisgICAgICAvLyB1bmxpbmsgdGhpcyBwYWNrZXQgZnJvbSB0aGUgY2hhaW4KKyAgICAgIHBOZXh0ID0gcFBhY2tldC0+cE5leHQ7CisgICAgICBwUGFja2V0LT5wTmV4dCA9IE5VTEw7CisKKyAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhpcyByZWFsbHkgYW4gaW5pdGlhbGl6ZWQgdm9zIHBhY2tldAorICAgICAgaWYgKHVubGlrZWx5KFZQS1RfTUFHSUNfTlVNQkVSICE9IHBQYWNrZXQtPm1hZ2ljKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnZhbGlkIG1hZ2ljIiwgX19MSU5FX18pOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgIH0KKworICAgICAgLy9JZiBhbiBza2IgaXMgYXR0YWNoZWQgdGhlbiByZXNldCB0aGUgcG9pbnRlcnMgICAgICAKKyAgICAgIGlmIChwUGFja2V0LT5wU2tiKQorICAgICAgeworICAgICAgICAgcFBhY2tldC0+cFNrYi0+bGVuID0gMDsKKyAgICAgICAgIHBQYWNrZXQtPnBTa2ItPmRhdGEgPSBwUGFja2V0LT5wU2tiLT5oZWFkOworICAgICAgICAgc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihwUGFja2V0LT5wU2tiKTsKKyAgICAgICAgIHNrYl9yZXNlcnZlKHBQYWNrZXQtPnBTa2IsIFZQS1RfU0laRV9CVUZGRVIpOworICAgICAgfQorCisgICAgICBwQ291bnQgPSBOVUxMOworICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIHBhY2tldCBwb29sIGFuZCBsb3cgcmVzb3VyY2UgYmxvY2sgd2Ugc2hvdWxkIHVzZS4KKyAgICAgIHN3aXRjaCAocFBhY2tldC0+cGFja2V0VHlwZSkKKyAgICAgIHsKKyAgICAgIGNhc2UgVk9TX1BLVF9UWVBFX1JYX1JBVzoKKyAgICAgICAgIC8vIGlmIHRoaXMgcGFja2V0IHN0aWxsIGhhcyBhbiBza2IgYXR0YWNoZWQsIHdlIGNhbiBwdXQgaXQKKyAgICAgICAgIC8vIGJhY2sgaW4gdGhlIGZyZWUgcG9vbCwgb3RoZXJ3aXNlIHdlIG5lZWQgdG8gcHV0IGl0IGluIHRoZQorICAgICAgICAgLy8gcmVwbGVuaXNoIHBvb2wKKyAgICAgICAgIGlmIChwUGFja2V0LT5wU2tiKQorICAgICAgICAgeworICAgICAgICAgICAgcFBrdEZyZWVMaXN0ID0gJmdwVm9zUGFja2V0Q29udGV4dC0+cnhSYXdGcmVlTGlzdDsKKyAgICAgICAgICAgIHBMb3dSZXNvdXJjZUluZm8gPSAmZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJhd0xvd1Jlc291cmNlSW5mbzsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBQa3RGcmVlTGlzdCA9ICZncFZvc1BhY2tldENvbnRleHQtPnJ4UmVwbGVuaXNoTGlzdDsKKyAgICAgICAgICAgIHBMb3dSZXNvdXJjZUluZm8gPSBOVUxMOworICAgICAgICAgICAgcENvdW50ID0gJmdwVm9zUGFja2V0Q29udGV4dC0+cnhSZXBsZW5pc2hMaXN0Q291bnQ7CisgICAgICAgICB9CisgICAgICAgICBwYWNrZXRUeXBlID0gVk9TX1BLVF9UWVBFX1JYX1JBVzsKKyAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVDoKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgIHBQa3RGcmVlTGlzdCA9ICZncFZvc1BhY2tldENvbnRleHQtPnR4TWdtdEZyZWVMaXN0OworICAgICAgICAgcExvd1Jlc291cmNlSW5mbyA9ICZncFZvc1BhY2tldENvbnRleHQtPnR4TWdtdExvd1Jlc291cmNlSW5mbzsKKyAgICAgICAgIAorICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVk9TX1BLVF9UWVBFX1RYXzgwMl8zX0RBVEE6CisgICAgICAgICBwUGt0RnJlZUxpc3QgPSAmZ3BWb3NQYWNrZXRDb250ZXh0LT50eERhdGFGcmVlTGlzdDsKKyAgICAgICAgIHBMb3dSZXNvdXJjZUluZm8gPSAmZ3BWb3NQYWNrZXRDb250ZXh0LT50eERhdGFMb3dSZXNvdXJjZUluZm87CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgICAgICAgZ3BWb3NQYWNrZXRDb250ZXh0LT51Y3R4RGF0YUZyZWVMaXN0Q291bnQgKys7CisjZW5kaWYKKyAgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICJWUEtUIFslZF06IGludmFsaWQgcGFja2V0IHR5cGUgJWRbJXNdIiwKKyAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgcFBhY2tldC0+cGFja2V0VHlwZSwKKyAgICAgICAgICAgICAgICAgICB2b3NfcGt0aV9wYWNrZXRfdHlwZV9zdHIocFBhY2tldC0+cGFja2V0VHlwZSkpOworCisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgfQorCisKKyAgICAgIC8vIGlzIHRoZXJlIGEgbG93IHJlc291cmNlIGNvbmRpdGlvbiBwZW5kaW5nIGZvciB0aGlzIHBhY2tldCB0eXBlPworICAgICAgaWYgKHBMb3dSZXNvdXJjZUluZm8gJiYgcExvd1Jlc291cmNlSW5mby0+Y2FsbGJhY2spCisgICAgICB7CisgICAgICAgICAvLyBbREVCVUddCisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiVlBLVCBbJWRdOiByZWN5Y2xlICVwIiwgIF9fTElORV9fLCBwUGFja2V0KTsKKworICAgICAgICAgLy8geWVzLCBzbyByYXRoZXIgdGhhbiBwbGFjaW5nIHRoZSBwYWNrZXQgYmFjayBpbiB0aGUgZnJlZSBwb29sCisgICAgICAgICAvLyB3ZSB3aWxsIGludm9rZSB0aGUgbG93IHJlc291cmNlIGNhbGxiYWNrCisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBbJXBdIFBhY2tldCByZWN5Y2xlZCwgdHlwZSAlZFslc10iLAorICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBwUGFja2V0LCBwUGFja2V0LT5wYWNrZXRUeXBlLAorICAgICAgICAgICAgICAgICAgIHZvc19wa3RpX3BhY2tldF90eXBlX3N0cihwUGFja2V0LT5wYWNrZXRUeXBlKSk7CisKKyAgICAgICAgIC8vIGNsZWFyIG91dCB0aGUgVXNlciBEYXRhIHBvaW50ZXJzIGluIHRoZSB2b3NzIHBhY2tldC4uCisgICAgICAgICBtZW1zZXQoJnBQYWNrZXQtPnB2VXNlckRhdGEsIDAsIHNpemVvZihwUGFja2V0LT5wdlVzZXJEYXRhKSk7CisKKyAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlICdjaGFpbicgcG9pbnRlciB0byBOVUxMLgorICAgICAgICAgcFBhY2tldC0+cE5leHQgPSBOVUxMOworCisgICAgICAgICAvLyB0aW1lc3RhbXAgdGhlIHZvcyBwYWNrZXQuCisgICAgICAgICBwUGFja2V0LT50aW1lc3RhbXAgPSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpOworCisgICAgICAgICBjYWxsYmFjayA9IHBMb3dSZXNvdXJjZUluZm8tPmNhbGxiYWNrOworICAgICAgICAgcExvd1Jlc291cmNlSW5mby0+Y2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgY2FsbGJhY2socFBhY2tldCwgcExvd1Jlc291cmNlSW5mby0+dXNlckRhdGEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLy8gdGhpcyBwYWNrZXQgZG9lcyBub3Qgc2F0aXNmeSBhIGxvdyByZXNvdXJjZSBjb25kaXRpb24KKyAgICAgICAgIC8vIHNvIHB1dCBpdCBiYWNrIGluIHRoZSBhcHByb3ByaWF0ZSBmcmVlIHBvb2wKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICJWUEtUIFslZF06IFslcF0gUGFja2V0IHJldHVybmVkLCB0eXBlICVkWyVzXSIsCisgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHBQYWNrZXQsIHBQYWNrZXQtPnBhY2tldFR5cGUsCisgICAgICAgICAgICAgICAgICAgdm9zX3BrdGlfcGFja2V0X3R5cGVfc3RyKHBQYWNrZXQtPnBhY2tldFR5cGUpKTsKKyAgICAgICAgIHJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZncFZvc1BhY2tldENvbnRleHQtPm1sb2NrKTsKKyAgICAgICAgIGxpc3RfYWRkX3RhaWwoJnBQYWNrZXQtPm5vZGUsIHBQa3RGcmVlTGlzdCk7CisgICAgICAgICBpZiAobGlrZWx5KDAgPT0gcmMpKSAKKyAgICAgICAgIHsKKyAgICAgICAgICAgIG11dGV4X3VubG9jaygmZ3BWb3NQYWNrZXRDb250ZXh0LT5tbG9jayk7CisgICAgICAgICB9CisgICAgICAgICBpZiAocENvdW50KQorICAgICAgICAgeworICAgICAgICAgICAgKCpwQ291bnQpKys7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIG1vdmUgdG8gbmV4dCBwYWNrZXQgaW4gdGhlIGNoYWluCisgICAgICBwUGFja2V0ID0gcE5leHQ7CisKKyAgIH0gLy8gd2hpbGUgKHBQYWNrZXQpCisKKyAgIC8vIHNlZSBpZiB3ZSBuZWVkIHRvIHJlcGxlbmlzaCB0aGUgUnggUmF3IHBvb2wKKyAgIGlmIChWT1NfUEtUX1RZUEVfUlhfUkFXID09IHBhY2tldFR5cGUpCisgICB7CisgICAgICB2b3NfcGt0aV9yZXBsZW5pc2hfcmF3X3Bvb2woKTsgICAKKyAgIH0KKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wa3RfY2hhaW5fcGFja2V0KCkgLSBjaGFpbiBhIHZvc3MgUGFja2V0IHRvIGFub3RoZXIgcGFja2V0CisKKyAgVGhpcyBBUEkgY2hhaW5zIGEgdm9zcyBQYWNrZXQgdG8gYW5vdGhlciB2b3NzIFBhY2tldCwgY3JlYXRpbmcgYSBwYWNrZXQKKyAgY2hhaW4uICBQYWNrZXRzIGNhbiBiZSBjaGFpbmVkIGJlZm9yZSBvciBhZnRlciB0aGUgY3VycmVudCBwYWNrZXQgaW4gdGhlCisgIHBhY2tldCBjaGFpbi4KKworICBccGFyYW0gcFBhY2tldCAtIHBvaW50ZXIgdG8gYSB2b3NzIHBhY2tldCB0byBjaGFpbiB0bworCisgIFxwYXJhbSBwQ2hhaW5QYWNrZXQgLSBwb2ludGVyIHRvIHBhY2tldCB0byBjaGFpbgorCisgIFxwYXJhbSBjaGFpbkFmdGVyIC0gYm9vbGVhbiB0byBzcGVjaWZ5IHRvIGNoYWluIHBhY2tldCBhZnRlciBvciBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgcGFja2V0CisgIDx1bD4KKyAgICA8bGk+IHRydWUgLSBjaGFpbiBwYWNrZXQgQUZURVIgcFBhY2tldCAoY2hhaW4gYmVoaW5kKQorICAgIDxsaT4gZmFsc2UgLSBjaGFpbiBwYWNrZXQgQkVGT1JFIHBQYWNrZXQgKGNoYWluIGluIGZyb250KQorICA8L3VsPgorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90ICpwQ2hhaW5QYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X0JPT0xfdCBjaGFpbkFmdGVyICkKK3sKKyAgIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMKKyAgIGlmICh1bmxpa2VseSgoTlVMTCA9PSBwUGFja2V0KSB8fCAoTlVMTCA9PSBwQ2hhaW5QYWNrZXQpKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHBvaW50ZXIiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZXNlIGFyZSByZWFsbHkgaW5pdGlhbGl6ZWQgdm9zIHBhY2tldHMKKyAgIGlmICh1bmxpa2VseSgoVlBLVF9NQUdJQ19OVU1CRVIgIT0gcFBhY2tldC0+bWFnaWMpIHx8CisgICAgICAgICAgICAgICAgKFZQS1RfTUFHSUNfTlVNQkVSICE9IHBDaGFpblBhY2tldC0+bWFnaWMpKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnZhbGlkIG1hZ2ljIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gc3dhcCBwb2ludGVycyBpZiB3ZSBjaGFpbiBiZWZvcmUKKyAgIGlmICh1bmxpa2VseShWT1NfRkFMU0UgPT0gY2hhaW5BZnRlcikpCisgICB7CisgICAgICB2b3NfcGt0X3QgKnBUbXAgPSBwUGFja2V0OworICAgICAgcFBhY2tldCA9IHBDaGFpblBhY2tldDsKKyAgICAgIHBDaGFpblBhY2tldCA9IHBUbXA7CisgICB9CisKKyAgIC8vIGZpbmQgdGhlIGVuZCBvZiB0aGUgY2hhaW4KKyAgIHdoaWxlIChwUGFja2V0LT5wTmV4dCkKKyAgIHsKKyAgICAgIHBQYWNrZXQgPSBwUGFja2V0LT5wTmV4dDsKKyAgIH0KKworICAgLy8gYXR0YWNoCisgICBwUGFja2V0LT5wTmV4dCA9IHBDaGFpblBhY2tldDsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCkgLSBXYWxrIHBhY2tldCBjaGFpbiBhbmQgKHBvc3NpYmx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2hhaW4gcGFja2V0cworCisgIFRoaXMgQVBJIHdpbGwgd2FsayB0aGUgdm9zcyBQYWNrZXQgYW5kIHVuY2hhaW4gdGhlIHBhY2tldCBmcm9tIHRoZSBjaGFpbiwKKyAgaWYgc3BlY2lmaWVkLiAgVGhlICduZXh0JyBwYWNrZXQgaW4gdGhlIHBhY2tldCBjaGFpbiBpcyByZXR1cm5lZCBhcyB0aGUKKyAgcGFja2V0IGNoYWluIGlzIHRyYXZlcnNlZC4KKworICBccGFyYW0gIHBQYWNrZXQgLSBpbnB1dCB2b3NfcGFja2V0IHdhbGsKKworICBccGFyYW0gcHBDaGFpbmVkUGFja2V0IC0gcG9pbnRlciB0byBsb2NhdGlvbiB0byByZXR1cm4gdGhlICduZXh0JyB2b3NzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQgcG9pbnRlciBpbiB0aGUgcGFja2V0IGNoYWluLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBtZWFucyB0aGVyZSBpcyB3YXMgbm90IHBhY2tldCBjaGFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGlzIHBhY2tldC4KKworICBccGFyYW0gdW5jaGFpblBhY2tldCAtIEZsYWcgdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGNhbGxlciB3YW50cyB0aGUgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBwYWNrZXQgY2hhaW4uICBUaGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgdG8gYWxsb3cgdGhlIGNhbGxlciB0byB3YWxrIHRoZSBwYWNrZXQgY2hhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9yIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGNoYWluLgorCisgICAgPHVsPgorICAgICAgPGxpPiB0cnVlIC0gd2hlbiBzZXQgJ3RydWUnIHRoZSBBUEkgd2lsbCByZXR1cm4KKyAgICAgICAgICAgICAgICAgIHRoZSAnbmV4dCcgcGFja2V0IHBvaW50ZXIgaW4gdGhlIHZvc3MgUGFja3RlIGNoYWluIGFuZAorICAgICAgICAgICAgICAgICAgKldJTEwqIHVuY2hhaW4gdGhlIGlucHV0IHBhY2tldCBmcm9tIHRoZSBwYWNrZXQgY2hhaW4uCisKKyAgICAgIDxsaT4gTk9UIGZhbHNlIC0gd2hlbiBzZXQgJ2ZhbHNlJyB0aGUgQVBJIHdpbGwgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgIHRoZSAnbmV4dCcgcGFja2V0IHBvaW50ZXIgaW4gdGhlIHZvc3MgUGFja2V0IGNoYWluIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAqV0lMTCBOT1QqIHVuY2hhaW4gdGhlIHBhY2tldCBjaGFpbi4gICBUaGlzIG9wdGlvbiBnaXZlcworICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbGVyIHRoZSBhYmlsaXR5IHRvIHdhbGsgdGhlIHBhY2tldCBjaGFpbiB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeWluZyBpdCBpbiB0aGUgcHJvY2Vzcy4KKyAgICA8L3VsPgorCisgIFxub3RlIEhhdmluZyB0aGUgcGFja2V0cyBjaGFpbmVkIGhhcyBhbiBpbXBsaWNhaXRvbiBvbiBob3cgdGhlIHJldHVybgorICAgICAgICBwYWNrZXQgQVBJICh2b3NfcGt0X3JldHVybl9wYWNrZXQoKSApIG9wZXJhdGVzLgorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NfcGt0X3QgKnBQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfdCAqKnBwQ2hhaW5lZFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgdW5jaGFpblBhY2tldCApCit7CisgICAvLyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHBvaW50ZXJzCisgICBpZiAodW5saWtlbHkoKE5VTEwgPT0gcFBhY2tldCkgfHwgKE5VTEwgPT0gcHBDaGFpbmVkUGFja2V0KSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwb2ludGVyIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIGlzIHJlYWxseSBhbiBpbml0aWFsaXplZCB2b3MgcGFja2V0CisgICBpZiAodW5saWtlbHkoVlBLVF9NQUdJQ19OVU1CRVIgIT0gcFBhY2tldC0+bWFnaWMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEludmFsaWQgbWFnaWMiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBnZXQgbmV4dCBwYWNrZXQKKyAgICpwcENoYWluZWRQYWNrZXQgPSBwUGFja2V0LT5wTmV4dDsKKworICAgLy8gaWYgYXNrZWQgdG8gdW5jaGFpbiwgdGhlbiB1bmNoYWluIGl0CisgICBpZiAoVk9TX0ZBTFNFICE9IHVuY2hhaW5QYWNrZXQpCisgICB7CisgICAgICBwUGFja2V0LT5wTmV4dCA9IE5VTEw7CisgICB9CisKKyAgIC8vIGlmIGVuZCBvZiB0aGUgY2hhaW4sIGluZGljYXRlIGVtcHR5IHRvIHRoZSBjYWxsZXIKKyAgIGlmICgqcHBDaGFpbmVkUGFja2V0KQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRU1QVFk7CisgICB9Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wa3RfZ2V0X2RhdGFfdmVjdG9yKCkgLSBHZXQgZGF0YSB2ZWN0b3JzIGZyb20gYSB2b3NzIFBhY2tldAorCisgIFRoaXMgQVBJIGdldHMgdGhlIGNvbXBsZXRlIHNldCBvZiBWZWN0b3JzIChwb2ludGVyIC8gbGVuZ3RoIHBhaXJzKSB0aGF0CisgIGRlc2NyaWJlIGFsbCBvZiB0aGUgZGF0YSB0aGF0IG1ha2VzIHVwIHRoZSB2b3NzIFBhY2tldC4KKworICBccGFyYW0gcFBhY2tldCAtIHBvaW50ZXIgdG8gdGhlIHZPU1MgUGFja2V0IHRvIGdldCB0aGUgcG9pbnRlci9sZW5ndGgKKyAgICAgICAgICAgICAgICAgICB2ZWN0b3IgZnJvbQorCisgIFxwYXJhbSBwVmVjdG9yIC0gcG9pbnRlciB0byB0aGUgdmVjdG9yIGFycmF5IHdoZXJlIHRoZSB2ZWN0b3JzIGFyZSByZXR1cm5lZC4KKworICBccGFyYW0gcE51bVZlY3RvcnMgLSBOdW1iZXIgb2YgdmVjdG9yJ3MgaW4gdGhlIHZlY3RvciBhcnJheSAoYXQgcFZlY3RvcikuCisgICAgICAgICAgICAgICAgICAgICAgIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCAqcE51bVZlY3RvcnMgaXMgdXBkYXRlZCB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgcG9pbnRlci9sZW5ndGggdmVjdG9ycyBhdCBwVmVjdG9yIHBvcHVsYXRlZAorICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHZhbGlkIHZlY3RvcnMuCisKKyAgQ2FsbCB3aXRoIE5VTEwgcFZlY3RvciBvciAwIHZlY3RvclNpemUsIHdpbGwgcmV0dXJuIHRoZSBzaXplIG9mIHZlY3RvcgorICBuZWVkZWQgKGluICpwTnVtVmVjdG9ycykKKworICBDYWxsZXIgYWxsb2NhdGVzIGFuZCBmcmVlcyB0aGUgdmVjdG9yIG1lbW9yeS4KKworICBccmV0dXJuCisKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9nZXRfZGF0YV92ZWN0b3IoIHZvc19wa3RfdCAqcFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfZGF0YV92ZWN0b3JfdCAqcFZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfU0laRV90ICpwTnVtVmVjdG9ycyApCit7CisgICAvLyBub3Qgc3VwcG9ydGVkCisKKyAgIFZPU19BU1NFUlQoMCk7CisgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3BrdF9leHRyYWN0X2RhdGEoKSAtIEV4dHJhY3QgZGF0YSBmcm9tIHRoZSB2b3NzIFBhY2tldC4KKworICBUaGlzIEFQSSBleHRyYWN0cyBkYXRhIGZyb20gYSB2b3NzIFBhY2tldCwgY29weWluZyB0aGUgZGF0YSBpbnRvIHRoZQorICBzdXBwbGllZCBvdXRwdXQgYnVmZmVyLiAgTm90ZSB0aGUgZGF0YSBpcyBjb3BpZWQgZnJvbSB0aGUgdm9zIHBhY2tldAorICBidXQgdGhlIGRhdGEgcmVtYWlucyBpbiB0aGUgdm9zIHBhY2tldCBhbmQgdGhlIHNpemUgaXMgdW5hZmZlY3RlZC4KKworICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCB0byBnZXQgdGhlIGRhdGEgZnJvbS4KKworICBccGFyYW0gcGt0T2Zmc2V0IC0gdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgdm9zcyBQYWNrZXQgdG8gZ2V0IHRoZQorICAgICAgICAgZGF0YS4gIChpLmUuIDAgd291bGQgYmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgdm9zcyBQYWNrZXQpLgorCisgIFxwYXJhbSBwT3V0cHV0QnVmZmVyIC0gUG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHZvc3MgUGFja2V0IGRhdGEKKyAgICAgICAgIHdpbGwgYmUgY29waWVkLgorCisgIFxwYXJhbSBwT3V0cHV0QnVmZmVyU2l6ZSAtIG9uIGlucHV0LCBjb250YWlucyB0aGUgYW1vdW50IG9mIGRhdGEgdG8gZXh0cmFjdAorICAgICAgICAgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4gIFVwb24gcmV0dXJuLCBjb250YWlucyB0aGUgYW1vdW50IG9mIGRhdGEKKyAgICAgICAgIGV4dHJhY3RlZCBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLgorCisgICAgICAgICBOb3RlOiAgYW4gaW5wdXQgb2YgMCBpbiAqcE91dHB1dEJ1ZmZlclNpemUsIG1lYW5zIHRvIGNvcHkgKmFsbCoKKyAgICAgICAgIGRhdGEgaW4gdGhlIHZvc3MgUGFja2V0IGludG8gdGhlIG91dHB1dCBidWZmZXIuICBUaGUgY2FsbGVyIGlzCisgICAgICAgICByZXNwb25zaWJsZSBmb3IgYXNzdXJpbmcgdGhlIG91dHB1dCBidWZmZXIgc2l6ZSBpcyBiaWcgZW5vdWdoCisgICAgICAgICBzaW5jZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGlzIG5vdCBiZWluZyBwYXNzZWQgaW4hCisKKyAgXHJldHVybgorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NfcGt0X3QgKnBQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1NJWkVfdCBwa3RPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqcE91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfU0laRV90ICpwT3V0cHV0QnVmZmVyU2l6ZSApCit7CisgICB2X1NJWkVfdCBsZW47CisgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisgICAvLyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHBvaW50ZXJzCisgICBpZiAodW5saWtlbHkoKE5VTEwgPT0gcFBhY2tldCkgfHwKKyAgICAgICAgICAgICAgICAoTlVMTCA9PSBwT3V0cHV0QnVmZmVyKSB8fAorICAgICAgICAgICAgICAgIChOVUxMID09IHBPdXRwdXRCdWZmZXJTaXplKSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwb2ludGVyIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIGlzIHJlYWxseSBhbiBpbml0aWFsaXplZCB2b3MgcGFja2V0CisgICBpZiAodW5saWtlbHkoVlBLVF9NQUdJQ19OVU1CRVIgIT0gcFBhY2tldC0+bWFnaWMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEludmFsaWQgbWFnaWMiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBnZXQgcG9pbnRlciB0byB0aGUgc2tiCisgICBza2IgPSBwUGFja2V0LT5wU2tiOworCisgICAvLyBWYWxpZGF0ZSB0aGUgc2tiCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBza2IpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgc2tiIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gZ2V0IG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQKKyAgIGxlbiA9ICpwT3V0cHV0QnVmZmVyU2l6ZTsKKworICAgLy8gaWYgMCBpcyBpbnB1dCBpbiB0aGUgKnBPdXRwdXRCdWZmZXJTaXplLCB0aGVuIHRoZSB1c2VyIHdhbnRzIHVzIHRvIAorICAgLy8gZXh0cmFjdCAqYWxsKiB0aGUgZGF0YSBpbiB0aGUgYnVmZmVyLiAgT3RoZXJ3aXNlLCB0aGUgdXNlciBoYXMgCisgICAvLyBzcGVjaWZpZWQgdGhlIG91dHB1dCBidWZmZXIgc2l6ZSBpbiAqcE91dHB1dEJ1ZmZlclNpemUuICBJbiB0aGUgCisgICAvLyBjYXNlIHdoZXJlIHRoZSBvdXRwdXQgYnVmZmVyIHNpemUgaXMgc3BlY2lmaWVkLCBsZXQncyB2YWxpZGF0ZSB0aGF0IAorICAgLy8gaXQgaXMgYmlnIGVub3VnaC4KKyAgIC8vCisgICAvLyBcbm90ZTogIGknbSBub3QgY3JhenkgYWJvdXQgdGhpcy4gIHdlIHNob3VsZCBlbmZvcmNlIHRoZSBvdXRwdXQKKyAgIC8vIGJ1ZmZlciBzaXplIG9uIGlucHV0IHNvIHRoaXMgQVBJIGlzIG5vdCBnb2luZyB0byBjYXVzZSBjcmFzaGVzCisgICAvLyBiZWNhdXNlIGJ1ZmZlcnMgYXJlIHRvbyBzbWFsbCBhbmQgdGhlIGNhbGxlciBpbnB1dHMgMCA9PSBkb24ndCBjYXJlCisgICAvLyB0byBjaGVjayB0aGUgc2l6ZS4uLiAhIQorICAgaWYgKDAgPT0gbGVuKQorICAgeworICAgICAgbGVuID0gc2tiLT5sZW4gLSBwa3RPZmZzZXQ7CisKKyAgICAgIC8vIHJldHVybiAjIG9mIGJ5dGVzIGNvcGllZAorICAgICAgKnBPdXRwdXRCdWZmZXJTaXplID0gbGVuOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy8gbWFrZSBzdXJlIHdlIGFyZW4ndCBleHRyYWN0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgcGFja2V0CisgICAgICBpZiAobGVuID4gKHNrYi0+bGVuIC0gcGt0T2Zmc2V0KSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBSZXF1ZXN0IG92ZXJydW4sICIKKyAgICAgICAgICAgICAgICAgICAicmVxIG9mZnNldCAlZCwgcmVxIHNpemUgJWQsIHBhY2tldCBzaXplICVkIiwKKyAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgcGt0T2Zmc2V0LCBsZW4sIHNrYi0+bGVuKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICB9CisgICB9CisKKyAgIC8vIGNvcHkgdGhlIGRhdGEKKyAgIG1lbWNweShwT3V0cHV0QnVmZmVyLCAmc2tiLT5kYXRhW3BrdE9mZnNldF0sIGxlbik7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wa3RfZXh0cmFjdF9kYXRhX2NoYWluKCkgLSBFeHRyYWN0IGRhdGEgZnJvbSBhIHZvc3MgUGFja2V0IGNoYWluLgorCisgIFRoaXMgQVBJIGV4dHJhY3RzICphbGwqIHRoZSBkYXRhIGZyb20gYSB2b3NzIFBhY2tldCBjaGFpbiwgY29weWluZyB0aGUKKyAgZGF0YSBpbnRvIHRoZSBzdXBwbGllZCBvdXRwdXQgYnVmZmVyLiAgTm90ZSB0aGUgZGF0YSBpcyBjb3BpZWQgZnJvbQorICB0aGUgdm9zIHBhY2tldCBjaGFpbiBidXQgdGhlIGRhdGEgcmVtYWlucyBpbiB0aGUgdm9zIHBhY2tldCBhbmQgdGhlCisgIHNpemUgb2YgdGhlIHZvcyBwYWNrZXRzIGFyZSB1bmFmZmVjdGVkLgorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIGZpcnN0IHZvc3MgUGFja2V0IGluIHRoZSB2b3NzIHBhY2tldCBjaGFpbiB0bworICAgICAgICAgZXh0cmFjdCBkYXRhLgorCisgIFxwYXJhbSBwT3V0cHV0QnVmZmVyIC0gUG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHZvc3MgUGFja2V0IGRhdGEKKyAgICAgICAgIHdpbGwgYmUgY29waWVkLgorCisgIFxwYXJhbSBwT3V0cHV0QnVmZmVyU2l6ZSAtIG9uIGlucHV0LCBjb250YWlucyB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YQorICAgICAgICAgdGhhdCBjYW4gYmUgZXh0cmFjdGVkIGludG8gdGhlIG91dHB1dCBidWZmZXIuICBVcG9uIHJldHVybiwgY29udGFpbnMKKyAgICAgICAgIHRoZSBhbW91bnQgb2YgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgcGFja2V0IGNoYWluLgorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGhlIGRhdGEgZnJvbSB0aGUgZW50aXJlIHBhY2tldCBjaGFpbiBpcworICAgICAgICAgIGV4dHJhY3RlZCBhbmQgZm91bmQgYXQgKnBPdXRwdXRCdWZmZXIuICAqcE91dHB1dEJ1ZmZlclNpemUgYnl0ZXMKKyAgICAgICAgICB3ZXJlIGV4dHJhY3RlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHBQYWNrZXQsIHBPdXRwdXRCdWZmZXIsIG9yIHBPdXRwdXRCdWZmZXJTaXplCisgICAgICAgICAgaXMgbm90IGEgdmFsaWQgcG9pbnRlci4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9OT01FTSAtIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSB0byBleHRyYWN0IHRoZSBkYXRhCisgICAgICAgICAgZnJvbSB0aGUgZW50aXJlIHBhY2tldCBjaGFpbi4gKnBPdXRwdXRCdWZmZXJTaXplIGhhcyBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICB3aXRoIHRoZSBzaXplIG5lZWRlZCB0byBleHRyYWN0IHRoZSBlbnRpZXIgcGFja2V0IGNoYWluLgorCisgIFxzYSB2b3NfcGt0X2V4dHJhY3RfZGF0YSgpCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9leHRyYWN0X2RhdGFfY2hhaW4oIHZvc19wa3RfdCAqcFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICpwT3V0cHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9TSVpFX3QgKnBPdXRwdXRCdWZmZXJTaXplICkKK3sKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgdl9TSVpFX3QgbGVuOworICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworICAgLy8gVmFsaWRhdGUgdGhlIHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KChOVUxMID09IHBQYWNrZXQpIHx8CisgICAgICAgICAgICAgICAgKE5VTEwgPT0gcE91dHB1dEJ1ZmZlcikgfHwKKyAgICAgICAgICAgICAgICAoTlVMTCA9PSBwT3V0cHV0QnVmZmVyU2l6ZSkpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgcG9pbnRlciIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIFZhbGlkYXRlIHRoYXQgdGhpcyBpcyByZWFsbHkgYW4gaW5pdGlhbGl6ZWQgdm9zIHBhY2tldAorICAgaWYgKHVubGlrZWx5KFZQS1RfTUFHSUNfTlVNQkVSICE9IHBQYWNrZXQtPm1hZ2ljKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnZhbGlkIG1hZ2ljIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gZ2V0IHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSBwYWNrZXQgY2hhaW4uCisgICB2b3NTdGF0dXMgPSB2b3NfcGt0X2dldF9wYWNrZXRfY2hhaW5fbGVuZ3RoKHBQYWNrZXQsICZsZW4pOworICAgaWYgKHVubGlrZWx5KFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IFVuYWJsZSB0byBnZXQgcGFja2V0IGNoYWluIGxlbmd0aCIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLy8gaWYgdGhlIG91dHB1dCBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwsIHJldHVybiBOT01FTSBhbmQgdXBkYXRlCisgICAvLyB0aGUgYWN0dWFsIHNpemUgbmVlZGVkIGluICpwT3V0cHV0QnVmZmVyU2l6ZQorICAgaWYgKGxlbiA+ICpwT3V0cHV0QnVmZmVyU2l6ZSkKKyAgIHsKKyAgICAgICpwT3V0cHV0QnVmZmVyU2l6ZSA9IGxlbjsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIHBhY2tldCBpbiB0aGUgY2hhaW4sIGNvcHlpbmcgdGhlIGRhdGEKKyAgIHdoaWxlIChwUGFja2V0KQorICAgeworICAgICAgLy8gZ2V0IHBvaW50ZXIgdG8gdGhlIHNrYgorICAgICAgc2tiID0gcFBhY2tldC0+cFNrYjsKKworICAgICAgLy8gVmFsaWRhdGUgdGhlIHNrYgorICAgICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gc2tiKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHNrYiIsIF9fTElORV9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICB9CisKKyAgICAgIG1lbWNweShwT3V0cHV0QnVmZmVyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyAgICAgIHBPdXRwdXRCdWZmZXIgKz0gc2tiLT5sZW47CisKKyAgICAgIHBQYWNrZXQgPSBwUGFja2V0LT5wTmV4dDsKKyAgIH0KKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3BrdF9wZWVrX2RhdGEoKSAtIHBlZWsgaW50byB2b3NzIFBhY2tldCBhdCBnaXZlbiBvZmZzZXQKKworICBUaGlzIEFQSSBwcm92aWRlcyBhIHBvaW50ZXIgdG8gYSBzcGVjaWZpZWQgb2Zmc2V0IGludG8gYSB2b3NzIFBhY2tldCwKKyAgYWxsb3dpbmcgdGhlIGNhbGxlciB0byBwZWVrIGF0IGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB2b3NzIFBhY2tldC4KKyAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGNhbGxlciBjYW4gYWNjZXNzICJudW1CeXRlcyIgb2YgZGF0YSBhdAorICAicFBhY2tldERhdGEiLgorCisgIFRoaXMgQVBJIHdpbGwgZmFpbCBpZiB0aGUgZGF0YSBsZW5ndGggcmVxdWVzdGVkIHRvIHBlZWsgYXQgaXMgbm90IGluCisgIGNvbnRpZ3VvdXMgbWVtb3J5IGluIHRoZSB2b3NzIFBhY2tldC4gIEluIHRoaXMgY2FzZSwgdGhlIGNhbGxlciBzaG91bGQKKyAgdXNlIHZvc19wa3RfZXh0cmFjdF9kYXRhKCkgdG8gaGF2ZSB0aGUgZGF0YSBjb3BpZWQgaW50byBhIGNhbGxlciBzdXBwbGllZAorICBidWZmZXIuCisKKyAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgdk9TUyBQYWNrZXQgdG8gcGVlayBpbnRvCisKKyAgXHBhcmFtIHBrdE9mZnNldCAtIHRoZSBvZmZzZXQgaW50byB0aGUgdm9zcyBQYWNrZXQgZGF0YSB0byBwZWVrIGludG8uCisKKyAgXHBhcmFtIHBwUGFja2V0RGF0YSAtIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBwb2ludGVyIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0IGRhdGEgYXQgcGt0T2Zmc2V0IHdpbGwgYmUgcmV0dXJuZWQuCisKKyAgXHBhcmFtIG51bUJ5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB0aGUgY2FsbGVyIHdpc2hlcyB0byBwZWVrIGF0LgorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3BlZWtfZGF0YSggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9TSVpFX3QgcGt0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKipwcFBhY2tldERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1NJWkVfdCBudW1CeXRlcyApCit7CisgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisgICAvLyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHBvaW50ZXJzCisgICBpZiAodW5saWtlbHkoKE5VTEwgPT0gcFBhY2tldCkgfHwKKyAgICAgICAgICAgICAgICAoTlVMTCA9PSBwcFBhY2tldERhdGEpKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHBvaW50ZXIiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBWYWxpZGF0ZSB0aGF0IHRoaXMgaXMgcmVhbGx5IGFuIGluaXRpYWxpemVkIHZvcyBwYWNrZXQKKyAgIGlmICh1bmxpa2VseShWUEtUX01BR0lDX05VTUJFUiAhPSBwUGFja2V0LT5tYWdpYykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogSW52YWxpZCBtYWdpYyIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIFZhbGlkYXRlIG51bUJ5dGVzCisgICBpZiAodW5saWtlbHkoMCA9PSBudW1CeXRlcykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogSW52YWxpZCBudW1CeXRlcyIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIGdldCBwb2ludGVyIHRvIHRoZSBza2IKKyAgIHNrYiA9IHBQYWNrZXQtPnBTa2I7CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBza2IKKyAgIGlmICh1bmxpa2VseShOVUxMID09IHNrYikpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBza2IiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBjaGVjayBmb3Igb3ZlcmZsb3cKKyAgIGlmICh1bmxpa2VseSgocGt0T2Zmc2V0ICsgbnVtQnl0ZXMpID4gc2tiLT5sZW4pKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IFBhY2tldCBvdmVyZmxvdywgb2Zmc2V0ICVkIHNpemUgJWQgbGVuICVkIiwKKyAgICAgICAgICAgICAgICBfX0xJTkVfXywgcGt0T2Zmc2V0LCBudW1CeXRlcywgc2tiLT5sZW4pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gcmV0dXJuIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBkYXRhCisgICAqcHBQYWNrZXREYXRhID0gJnNrYi0+ZGF0YVtwa3RPZmZzZXRdOworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcGt0X2dldF9wYWNrZXRfdHlwZSgpIC0gR2V0IHBhY2tldCB0eXBlIGZvciBhIHZvc3MgUGFja2V0CisKKyAgVGhpcyBBUEkgcmV0dXJucyB0aGUgcGFja2V0IFR5cGUgZm9yIGEgdm9zcyBQYWNrZXQuCisKKyAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgdm9zcyBQYWNrZXQgdG8gZ2V0IHRoZSBwYWNrZXQgdHlwZSBmcm9tLgorCisgIFxwYXJhbSBwUGFja2V0VHlwZSAtIGxvY2F0aW9uIHRvIHJldHVybiB0aGUgcGFja2V0IHR5cGUgZm9yIHRoZSB2b3NzIFBhY2tldAorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X2dldF9wYWNrZXRfdHlwZSggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX1BLVF9UWVBFICpwUGFja2V0VHlwZSApCit7CisgICAvLyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHBvaW50ZXJzCisgICBpZiAodW5saWtlbHkoKE5VTEwgPT0gcFBhY2tldCkgfHwKKyAgICAgICAgICAgICAgICAoTlVMTCA9PSBwUGFja2V0VHlwZSkpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgcG9pbnRlciIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIFZhbGlkYXRlIHRoYXQgdGhpcyBpcyByZWFsbHkgYW4gaW5pdGlhbGl6ZWQgdm9zIHBhY2tldAorICAgaWYgKHVubGlrZWx5KFZQS1RfTUFHSUNfTlVNQkVSICE9IHBQYWNrZXQtPm1hZ2ljKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnZhbGlkIG1hZ2ljIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gcmV0dXJuIHRoZSByZXF1ZXN0ZWQgaW5mb3JtYXRpb24KKyAgICpwUGFja2V0VHlwZSA9IHBQYWNrZXQtPnBhY2tldFR5cGU7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCgpIC0gR2V0IHBhY2tldCBsZW5ndGggZm9yIGEgdm9zcyBQYWNrZXQKKworICBUaGlzIEFQSSByZXR1cm5zIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGRhdGEgaW4gYSB2b3NzIFBhY2tldC4KKworICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCB0byBnZXQgdGhlIHBhY2tldCBsZW5ndGggZnJvbS4KKworICBccGFyYW0gcFBhY2tldFNpemUgLSBsb2NhdGlvbiB0byByZXR1cm4gdGhlIHRvdGFsIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSB2b3NzIFBhY2tldC4KKyAgXHJldHVybgorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgoIHZvc19wa3RfdCAqcFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMTZfdCAqcFBhY2tldFNpemUgKQoreworICAgLy8gVmFsaWRhdGUgdGhlIHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KChOVUxMID09IHBQYWNrZXQpIHx8CisgICAgICAgICAgICAgICAgKE5VTEwgPT0gcFBhY2tldFNpemUpKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHBvaW50ZXIiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBWYWxpZGF0ZSB0aGF0IHRoaXMgaXMgcmVhbGx5IGFuIGluaXRpYWxpemVkIHZvcyBwYWNrZXQKKyAgIGlmICh1bmxpa2VseShWUEtUX01BR0lDX05VTUJFUiAhPSBwUGFja2V0LT5tYWdpYykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogSW52YWxpZCBtYWdpYyIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBza2IKKyAgIGlmICh1bmxpa2VseShOVUxMID09IHBQYWNrZXQtPnBTa2IpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgc2tiIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gcmV0dXJuIHRoZSByZXF1ZXN0ZWQgaW5mb3JtYXRpb24KKyAgICpwUGFja2V0U2l6ZSA9IHBQYWNrZXQtPnBTa2ItPmxlbjsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3BrdF9nZXRfcGFja2V0X2NoYWluX2xlbmd0aCgpIC0gR2V0IGxlbmd0aCBvZiBhIHZvcyBwYWNrZXQgY2hhaW4KKworICBUaGlzIEFQSSByZXR1cm5zIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGRhdGEgaW4gYSB2b3NzIFBhY2tldCBjaGFpbi4KKworICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldCBjaGFpbi4gIFRoaXMgQVBJCisgICAgICAgICB3aWxsIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGRhdGEgaW4gdGhlIHBhY2tldCBjaGFpbiBzdGF0aW5nIHdpdGgKKyAgICAgICAgIHRoaXMgcGFja2V0LgorCisgIFxwYXJhbSBwUGFja2V0U2l6ZSAtIGxvY2F0aW9uIHRvIHJldHVybiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHZvc3MgUGFja2V0LgorICBccmV0dXJuCisKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9nZXRfcGFja2V0X2NoYWluX2xlbmd0aCggdm9zX3BrdF90ICpwUGFja2V0Q2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfU0laRV90ICpwUGFja2V0Q2hhaW5TaXplICkKK3sKKyAgIHZfU0laRV90IGNoYWluU2l6ZSA9IDA7CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMKKyAgIGlmICh1bmxpa2VseSgoTlVMTCA9PSBwUGFja2V0Q2hhaW4pIHx8CisgICAgICAgICAgICAgICAgKE5VTEwgPT0gcFBhY2tldENoYWluU2l6ZSkpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgcG9pbnRlciIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIHdhbGsgdGhyb3VnaCBlYWNoIHBhY2tldCBpbiB0aGUgY2hhaW4sIGFkZGluZyBpdHMgbGVuZ3RoCisgICB3aGlsZSAocFBhY2tldENoYWluKQorICAgeworCisgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoaXMgaXMgcmVhbGx5IGFuIGluaXRpYWxpemVkIHZvcyBwYWNrZXQKKyAgICAgIGlmICh1bmxpa2VseShWUEtUX01BR0lDX05VTUJFUiAhPSBwUGFja2V0Q2hhaW4tPm1hZ2ljKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnZhbGlkIG1hZ2ljIiwgX19MSU5FX18pOworICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgIH0KKworICAgICAgLy8gVmFsaWRhdGUgdGhlIHNrYgorICAgICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcFBhY2tldENoYWluLT5wU2tiKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHNrYiIsIF9fTElORV9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICB9CisKKyAgICAgIGNoYWluU2l6ZSArPSBwUGFja2V0Q2hhaW4tPnBTa2ItPmxlbjsKKyAgICAgIHBQYWNrZXRDaGFpbiA9IHBQYWNrZXRDaGFpbi0+cE5leHQ7CisgICB9CisKKyAgIC8vIHJldHVybiByZXN1bHQKKyAgICpwUGFja2V0Q2hhaW5TaXplID0gY2hhaW5TaXplOworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcGt0X3B1c2hfaGVhZCgpIC0gcHVzaCBkYXRhIG9uIHRoZSBmcm9udCBhIG9mIGEgdm9zcyBQYWNrZXQKKworICBUaGlzIEFQSSB3aWxsIHB1c2ggZGF0YSBvbnRvIHRoZSBmcm9udCBvZiBhIHZvc3MgUGFja2V0LiAgVGhlIGRhdGEgd2lsbCBiZQorICBhcHBlbmRlZCBpbiBmcm9udCBvZiBhbnkgZGF0YSBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgdm9zcyBQYWNrZXQuCisKKyAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgdm9zcyBQYWNrZXQgdG8gbW9kaWZ5LgorCisgIFxwYXJhbSBwRGF0YSAtIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gcHVzaCBvbnRvIHRoZSBoZWFkIG9mIHRoZSB2b3NzIFBhY2tldC4KKworICBccGFyYW0gZGF0YVNpemUgLSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0byBwdXQgb250byB0aGUgaGVhZCBvZiB0aGUgdm9zcworICAgICAgICAgICAgICAgICAgICBQYWNrZXQuCisKKyAgXHJldHVybgorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3RfcHVzaF9oZWFkKCB2b3NfcGt0X3QgKnBQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1NJWkVfdCBkYXRhU2l6ZSApCit7CisgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisgICAvLyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHBvaW50ZXJzCisgICBpZiAodW5saWtlbHkoKE5VTEwgPT0gcFBhY2tldCkgfHwgKE5VTEwgPT0gcERhdGEpKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHBvaW50ZXIiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBWYWxpZGF0ZSB0aGF0IHRoaXMgaXMgcmVhbGx5IGFuIGluaXRpYWxpemVkIHZvcyBwYWNrZXQKKyAgIGlmICh1bmxpa2VseShWUEtUX01BR0lDX05VTUJFUiAhPSBwUGFja2V0LT5tYWdpYykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogSW52YWxpZCBtYWdpYyIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIGdldCBwb2ludGVyIHRvIHRoZSBza2IKKyAgIHNrYiA9IHBQYWNrZXQtPnBTa2I7CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBza2IKKyAgIGlmICh1bmxpa2VseShOVUxMID09IHNrYikpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBza2IiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgaGVhZHJvb20uICBBcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB3ZQorICAgLy8gY2FuIG9taXQgdGhpcyBjaGVjayBsYXRlciBzaW5jZSBza2JfcHVzaCgpIHdpbGwgYWxzbyBwZXJmb3JtIHRoZQorICAgLy8gY2hlY2sgKGV4Y2VwdCBza2JfcHVzaCgpIHdpbGwgcGFuaWMgdGhlIGtlcm5lbCkKKyAgIGlmICh1bmxpa2VseShza2JfaGVhZHJvb20oc2tiKSA8IGRhdGFTaXplKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnN1ZmZpY2llbnQgaGVhZHJvb20sICIKKyAgICAgICAgICAgICAgICAiaGVhZFslcF0sIGRhdGFbJXBdLCByZXFbJWRdIiwKKyAgICAgICAgICAgICAgICBfX0xJTkVfXywgc2tiLT5oZWFkLCBza2ItPmRhdGEsIGRhdGFTaXplKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIGFjdHVhbGx5IHB1c2ggdGhlIGRhdGEKKyAgIG1lbWNweShza2JfcHVzaChza2IsIGRhdGFTaXplKSwgcERhdGEsIGRhdGFTaXplKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3BrdF9yZXNlcnZlX2hlYWQoKSAtIFJlc2VydmUgc3BhY2UgYXQgdGhlIGZyb250IG9mIGEgdm9zcyBQYWNrZXQKKworICBUaGlzIEFQSSB3aWxsIHJlc2VydmUgc3BhY2UgYXQgdGhlIGZyb250IG9mIGEgdm9zcyBQYWNrZXQuICBUaGUgY2FsbGVyIGNhbgorICB0aGVuIGNvcHkgZGF0YSBpbnRvIHRoaXMgcmVzZXJ2ZWQgc3BhY2UgdXNpbmcgbWVtY3B5KCkgbGlrZSBmdW5jdGlvbnMuICBUaGlzCisgIGFsbG93cyB0aGUgY2FsbGVyIHRvIHJlc2VydmUgc3BhY2UgYW5kIGJ1aWxkIGhlYWRlcnMgZGlyZWN0bHkgaW4gdGhpcworICByZXNlcnZlZCBzcGFjZSBpbiB0aGUgdm9zcyBQYWNrZXQuCisKKyAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGxlbmd0aCBvZiB0aGUgdm9zcyBQYWNrZXQgaXMgaW5jcmVhc2VkIGJ5CisgIGRhdGFTaXplLgorCisgIDwgcHV0IGEgYmVmb3JlIC8gYWZ0ZXIgcGljdHVyZSBoZXJlPgorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG1vZGlmeS4KKworICBccGFyYW0gcHBEYXRhIC0gcG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICBzcGFjZSBpcyByZXR1cm5lZC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBjYWxsZXIgaGFzCisgICAgICAgICAgICAgICAgICB3cml0ZSAvIHJlYWQgYWNjZXNzIHRvIHRoZSBkYXRhIHNwYWNlIGF0ICpwcERhdGEgZm9yIGxlbmd0aAorICAgICAgICAgICAgICAgICAgZGF0YVNpemUgdG8gYnVpbGQgaGVhZGVycywgZXRjLgorCisgIFxwYXJhbSBkYXRhU2l6ZSAtIHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIHJlc2VydmUgYXQgdGhlIGhlYWQgb2YgdGhlIHZvc3MKKyAgICAgICAgICAgICAgICAgICAgUGFja2V0LiAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGxlbmd0aCBvZiB0aGUgdm9zcworICAgICAgICAgICAgICAgICAgICBQYWNrZXQgaXMgaW5jcmVhc2VkIGJ5IGRhdGFTaXplLgorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKipwcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1NJWkVfdCBkYXRhU2l6ZSApCit7CisgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAgc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKKworICAgLy8gVmFsaWRhdGUgdGhlIHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KChOVUxMID09IHBQYWNrZXQpIHx8IChOVUxMID09IHBwRGF0YSkpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgcG9pbnRlciIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIFZhbGlkYXRlIHRoYXQgdGhpcyBpcyByZWFsbHkgYW4gaW5pdGlhbGl6ZWQgdm9zIHBhY2tldAorICAgaWYgKHVubGlrZWx5KFZQS1RfTUFHSUNfTlVNQkVSICE9IHBQYWNrZXQtPm1hZ2ljKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnZhbGlkIG1hZ2ljIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gZ2V0IHBvaW50ZXIgdG8gdGhlIHNrYgorICAgc2tiID0gcFBhY2tldC0+cFNrYjsKKworICAgLy8gVmFsaWRhdGUgdGhlIHNrYgorICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gc2tiKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHNrYiIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBoZWFkcm9vbS4gIEFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHdlCisgICAvLyBjYW4gb21pdCB0aGlzIGNoZWNrIGxhdGVyIHNpbmNlIHNrYl9wdXNoKCkgd2lsbCBhbHNvIHBlcmZvcm0gdGhlCisgICAvLyBjaGVjayAoZXhjZXB0IHNrYl9wdXNoKCkgd2lsbCBwYW5pYyB0aGUga2VybmVsKQorICAgaWYgKHVubGlrZWx5KHNrYl9oZWFkcm9vbShza2IpIDwgZGF0YVNpemUpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogSW5zdWZmaWNpZW50IGhlYWRyb29tLCAiCisgICAgICAgICAgICAgICAgImhlYWRbJXBdLCBkYXRhWyVwXSwgcmVxWyVkXSIsCisgICAgICAgICAgICAgICAgX19MSU5FX18sIHNrYi0+aGVhZCwgc2tiLT5kYXRhLCBkYXRhU2l6ZSk7CisgICAgCisgICAgICBpZiAoKG5ld3NrYiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgZGF0YVNpemUpKSA9PSBOVUxMKSB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogRmFpbGVkIHRvIHJlYWxsb2MgaGVhZHJvb20iLCBfX0xJTkVfXyk7CisgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgICAgfQorCisgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgIHNrYiA9IG5ld3NrYjsKKworICAgICAgLy8gc2V0IHRoZSBza2IgcG9pbnRlcgorICAgICAgcFBhY2tldC0+cFNrYiA9IG5ld3NrYjsKKyAgIH0KKworICAgLy8gYWN0dWFsbHkgYWxsb2NhdGUgdGhlIGhlYWRyb29tCisgICAqcHBEYXRhID0gc2tiX3B1c2goc2tiLCBkYXRhU2l6ZSk7CisgICAvLyBaZXJvIG91dCBzbyB3ZSBkb250IHRha2UgdGhlIGZhc3RwYXRoIG9uIEFuZHJvaWQuCisgICBtZW1zZXQoICh2b2lkICopKnBwRGF0YSwgMCwgZGF0YVNpemUgKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcGt0X3Jlc2VydmVfaGVhZF9mYXN0KCkgLSBSZXNlcnZlIHNwYWNlIGF0IHRoZSBmcm9udCBvZiBhIHZvc3MgUGFja2V0CisKKyAgVGhpcyBBUEkgd2lsbCByZXNlcnZlIHNwYWNlIGF0IHRoZSBmcm9udCBvZiBhIHZvc3MgUGFja2V0LiAgVGhlIGNhbGxlciBjYW4KKyAgdGhlbiBjb3B5IGRhdGEgaW50byB0aGlzIHJlc2VydmVkIHNwYWNlIHVzaW5nIG1lbWNweSgpIGxpa2UgZnVuY3Rpb25zLiAgVGhpcworICBhbGxvd3MgdGhlIGNhbGxlciB0byByZXNlcnZlIHNwYWNlIGFuZCBidWlsZCBoZWFkZXJzIGRpcmVjdGx5IGluIHRoaXMKKyAgcmVzZXJ2ZWQgc3BhY2UgaW4gdGhlIHZvc3MgUGFja2V0LgorCisgIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBsZW5ndGggb2YgdGhlIHZvc3MgUGFja2V0IGlzIGluY3JlYXNlZCBieQorICBkYXRhU2l6ZS4KKyAKKyAgU2FtZSBhcyBhYm92ZSBBUGkgYnV0IG5vIG1lbXNldCB0byAwIGF0IHRoZSBlbmQuCisgCisgIDwgcHV0IGEgYmVmb3JlIC8gYWZ0ZXIgcGljdHVyZSBoZXJlPgorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG1vZGlmeS4KKworICBccGFyYW0gcHBEYXRhIC0gcG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICBzcGFjZSBpcyByZXR1cm5lZC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBjYWxsZXIgaGFzCisgICAgICAgICAgICAgICAgICB3cml0ZSAvIHJlYWQgYWNjZXNzIHRvIHRoZSBkYXRhIHNwYWNlIGF0ICpwcERhdGEgZm9yIGxlbmd0aAorICAgICAgICAgICAgICAgICAgZGF0YVNpemUgdG8gYnVpbGQgaGVhZGVycywgZXRjLgorCisgIFxwYXJhbSBkYXRhU2l6ZSAtIHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIHJlc2VydmUgYXQgdGhlIGhlYWQgb2YgdGhlIHZvc3MKKyAgICAgICAgICAgICAgICAgICAgUGFja2V0LiAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGxlbmd0aCBvZiB0aGUgdm9zcworICAgICAgICAgICAgICAgICAgICBQYWNrZXQgaXMgaW5jcmVhc2VkIGJ5IGRhdGFTaXplLgorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3Jlc2VydmVfaGVhZF9mYXN0KCB2b3NfcGt0X3QgKnBQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqKnBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfU0laRV90IGRhdGFTaXplICkKK3sKKyAgIHN0cnVjdCBza19idWZmICpza2I7CisgICBzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCisgICAvLyBnZXQgcG9pbnRlciB0byB0aGUgc2tiCisgICBza2IgPSBwUGFja2V0LT5wU2tiOworCisgICAvLyBWYWxpZGF0ZSB0aGUgc2tiCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBza2IpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgc2tiIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGhlYWRyb29tLiAgQXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gd2UKKyAgIC8vIGNhbiBvbWl0IHRoaXMgY2hlY2sgbGF0ZXIgc2luY2Ugc2tiX3B1c2goKSB3aWxsIGFsc28gcGVyZm9ybSB0aGUKKyAgIC8vIGNoZWNrIChleGNlcHQgc2tiX3B1c2goKSB3aWxsIHBhbmljIHRoZSBrZXJuZWwpCisgICBpZiAodW5saWtlbHkoc2tiX2hlYWRyb29tKHNrYikgPCBkYXRhU2l6ZSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnN1ZmZpY2llbnQgaGVhZHJvb20sICIKKyAgICAgICAgICAgICAgICAiaGVhZFslcF0sIGRhdGFbJXBdLCByZXFbJWRdIiwKKyAgICAgICAgICAgICAgICBfX0xJTkVfXywgc2tiLT5oZWFkLCBza2ItPmRhdGEsIGRhdGFTaXplKTsKKyAgICAKKyAgICAgIGlmICgobmV3c2tiID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBkYXRhU2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBGYWlsZWQgdG8gcmVhbGxvYyBoZWFkcm9vbSIsIF9fTElORV9fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICB9CisKKyAgICAgIGtmcmVlX3NrYihza2IpOworICAgICAgc2tiID0gbmV3c2tiOworCisgICAgICAvLyBzZXQgdGhlIHNrYiBwb2ludGVyCisgICAgICBwUGFja2V0LT5wU2tiID0gbmV3c2tiOworICAgfQorCisgICAvLyBhY3R1YWxseSBhbGxvY2F0ZSB0aGUgaGVhZHJvb20KKyAgICpwcERhdGEgPSBza2JfcHVzaChza2IsIGRhdGFTaXplKTsKKyAgIC8vIFplcm8gb3V0IHNvIHdlIGRvbnQgdGFrZSB0aGUgZmFzdHBhdGggb24gQW5kcm9pZC4KKyAgIC8vbWVtc2V0KCAodm9pZCAqKSpwcERhdGEsIDAsIGRhdGFTaXplICk7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wa3RfcG9wX2hlYWQoKSAtIFJlbW92ZSBkYXRhIGZyb20gdGhlIGZyb250IG9mIHRoZSB2b3NzIFBhY2tldAorCisgIFRoaXMgQVBJIHJlbW92ZXMgZGF0YSBmcm9tIHRoZSBmcm9udCBvZiBhIHZvc3MgUGFja2V0LiAgVGhlIGRhdGEgaXMKKyAgY29waWVkIGludG8gdGhlIG91dHB1dCBidWZmZXIgZGVzY3JpYmVkIGJ5IHBEYXRhIGFuZCBwRGF0YVNpemUKKworICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCB0byBvcGVyYXRlIG9uLgorCisgIFxwYXJhbSBwRGF0YSAtIHBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgdm9zcyBQYWNrZXQgaXMgcGxhY2VkLgorCisgIFxwYXJhbSBkYXRhU2l6ZSAtIFRoZSBhbW91bnQgb2Ygc3BhY2UgdG8gcmVtb3ZlIGZyb20gdGhlIGhlYWQgb2YgdGhlIHZvc3MKKyAgICAgICAgICAgICAgICAgICAgUGFja2V0LiAgVGhlIG91dHB1dCBidWZmZXIgKGF0ICpwRGF0YSkgbXVzdCBjb250YWluIGF0CisgICAgICAgICAgICAgICAgICAgIGxlYXN0IHRoaXMgYW1vdW50IG9mIHNwYWNlLgorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3BvcF9oZWFkKCB2b3NfcGt0X3QgKnBQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9TSVpFX3QgZGF0YVNpemUgKQoreworICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworICAgLy8gVmFsaWRhdGUgdGhlIHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KChOVUxMID09IHBQYWNrZXQpIHx8IChOVUxMID09IHBEYXRhKSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwb2ludGVyIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIGlzIHJlYWxseSBhbiBpbml0aWFsaXplZCB2b3MgcGFja2V0CisgICBpZiAodW5saWtlbHkoVlBLVF9NQUdJQ19OVU1CRVIgIT0gcFBhY2tldC0+bWFnaWMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEludmFsaWQgbWFnaWMiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBnZXQgcG9pbnRlciB0byB0aGUgc2tiCisgICBza2IgPSBwUGFja2V0LT5wU2tiOworCisgICAvLyBWYWxpZGF0ZSB0aGUgc2tiCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBza2IpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgc2tiIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBkYXRhIHRvIHBvcAorICAgaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgZGF0YVNpemUpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IHBvcCBleGNlZWRzIHBhY2tldCBzaXplLCBsZW5bJWRdLCByZXFbJWRdIiwKKyAgICAgICAgICAgICAgICBfX0xJTkVfXywgc2tiLT5sZW4sIGRhdGFTaXplKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIGNvcHkgdGhlIGRhdGEKKyAgIG1lbWNweShwRGF0YSwgc2tiLT5kYXRhLCBkYXRhU2l6ZSk7CisgICBza2JfcHVsbChza2IsIGRhdGFTaXplKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcGt0X3RyaW1faGVhZCgpIC0gU2tpcCBvdmVyIGJ5dGVzIGF0IHRoZSBmcm9udCBvZiBhIHZvc3MgUGFja2V0CisKKyAgVGhpcyBBUEkgbW92ZXMgdGhlIHBvaW50ZXJzIGF0IHRoZSBoZWFkIG9mIGEgdm9zcyBQYWNrZXQgdG8gZXNzZW50aWFsbHkKKyAgc2tpcCBvdmVyIGRhdGEgYXQgdGhlIGZyb250IG9mIGEgdm9zcyBQYWNrZXQuICBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUKKyAgbGVuZ3RoIG9mIHRoZSB2b3NzIFBhY2tldCBpcyByZWR1Y2VkIGJ5IGRhdGFTaXplIGFuZCB0aGUgc3RhcnRpbmcgcG9pbnRlcgorICB0byB0aGUgdm9zcyBQYWNrZXQgaXMgYWRqdXN0ZWQgdG8gZWxpbWluYXRlIHRoZSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorICB2b3NzIFBhY2tldC4KKworICBUaGlzIEFQSSBoYXMgdGhlIG9wcG9zaXRlIGVmZmVjdCBvZiBcYSB2b3NfcGt0X3Jlc2VydmVfaGVhZCgpLgorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG9wZXJhdGUgb24uCisKKyAgXHBhcmFtIGRhdGFTaXplIC0gVGhlIGFtb3VudCBvZiBzcGFjZSB0byBza2lwIGF0IHRoZSBzdGFydCBvZiB0aGUgdm9zcworICAgICAgICAgICAgICAgICAgICBQYWNrZXQuCisKKyAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHVwb24gcmV0dXJuLCB0aGUgZGF0YSBza2lwcGVkIG92ZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgaW5hY2Nlc3NpYmxlIHRvIHRoZSBjYWxsZXIuICBJZiB0aGUgY2FsbGVyIG5lZWRzIGFjY2VzcworICAgICAgICAgICAgICAgICAgICB0byB0aGUgaGVhZCBkYXRhLCB1c2Ugdm9zX3BrdF9wb3BfaGVhZCgpIG9yCisgICAgICAgICAgICAgICAgICAgIHZvc19wa3RfZXh0cmFjdF9kYXRhKCkgdG8gZ2V0IGEgY29weSBvZiB0aGUgZGF0YS4KKworICBccmV0dXJuCisKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF90cmltX2hlYWQoIHZvc19wa3RfdCAqcFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfU0laRV90IGRhdGFTaXplICkKK3sKKyAgIHN0cnVjdCBza19idWZmICpza2I7CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMKKyAgIGlmICh1bmxpa2VseShOVUxMID09IHBQYWNrZXQpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgcG9pbnRlciIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIFZhbGlkYXRlIHRoYXQgdGhpcyBpcyByZWFsbHkgYW4gaW5pdGlhbGl6ZWQgdm9zIHBhY2tldAorICAgaWYgKHVubGlrZWx5KFZQS1RfTUFHSUNfTlVNQkVSICE9IHBQYWNrZXQtPm1hZ2ljKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnZhbGlkIG1hZ2ljIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gZ2V0IHBvaW50ZXIgdG8gdGhlIHNrYgorICAgc2tiID0gcFBhY2tldC0+cFNrYjsKKworICAgLy8gVmFsaWRhdGUgdGhlIHNrYgorICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gc2tiKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHNrYiIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggZGF0YSB0byB0cmltCisgICBpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBkYXRhU2l6ZSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogdHJpbSBleGNlZWRzIHBhY2tldCBzaXplLCBsZW5bJWRdLCByZXFbJWRdIiwKKyAgICAgICAgICAgICAgICBfX0xJTkVfXywgc2tiLT5sZW4sIGRhdGFTaXplKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIGFkanVzdCB0aGUgc2tiCisgICBza2JfcHVsbChza2IsIGRhdGFTaXplKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3BrdF9wdXNoX3RhaWwoKSAtIHB1c2ggZGF0YSBvbiB0aGUgZW5kIGEgb2YgYSB2b3NzIFBhY2tldAorCisgIFRoaXMgQVBJIHdpbGwgcHVzaCBkYXRhIG9udG8gdGhlIGVuZCBvZiBhIHZvc3MgUGFja2V0LiAgVGhlIGRhdGEgd2lsbCBiZQorICBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGFueSBkYXRhIGFscmVhZHkgY29udGFpbmVkIGluIHRoZSB2b3NzIFBhY2tldC4KKworICBccGFyYW0gcFBhY2tldCAtIHRoZSB2b3NzIFBhY2tldCB0byBtb2RpZnkuCisKKyAgXHBhcmFtIHBEYXRhIC0gcG9pbnRlciB0byB0aGUgZGF0YSB0byBwdXNoIG9udG8gdGhlIHRhaWwgb2YgdGhlIHZvc3MgUGFja2V0LgorCisgIFxwYXJhbSBkYXRhU2l6ZSAtIHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIHB1dCBvbnRvIHRoZSB0YWlsIG9mIHRoZSB2b3NzIFBhY2tldC4KKworICBccmV0dXJuCisKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9wdXNoX3RhaWwoIHZvc19wa3RfdCAqcFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVk9JRF90ICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfU0laRV90IGRhdGFTaXplICkKK3sKKyAgIHN0cnVjdCBza19idWZmICpza2I7CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMKKyAgIGlmICh1bmxpa2VseSgoTlVMTCA9PSBwUGFja2V0KSB8fCAoTlVMTCA9PSBwRGF0YSkpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgcG9pbnRlciIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIFZhbGlkYXRlIHRoYXQgdGhpcyBpcyByZWFsbHkgYW4gaW5pdGlhbGl6ZWQgdm9zIHBhY2tldAorICAgaWYgKHVubGlrZWx5KFZQS1RfTUFHSUNfTlVNQkVSICE9IHBQYWNrZXQtPm1hZ2ljKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnZhbGlkIG1hZ2ljIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gZ2V0IHBvaW50ZXIgdG8gdGhlIHNrYgorICAgc2tiID0gcFBhY2tldC0+cFNrYjsKKworICAgLy8gVmFsaWRhdGUgdGhlIHNrYgorICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gc2tiKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHNrYiIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyB0YWlscm9vbS4gIEFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHdlCisgICAvLyBjYW4gb21pdCB0aGlzIGNoZWNrIGxhdGVyIHNpbmNlIHNrYl9wdXQoKSB3aWxsIGFsc28gcGVyZm9ybSB0aGUKKyAgIC8vIGNoZWNrIChleGNlcHQgc2tiX3B1dCgpIHdpbGwgcGFuaWMgdGhlIGtlcm5lbCkKKyAgIGlmICh1bmxpa2VseShza2JfdGFpbHJvb20oc2tiKSA8IGRhdGFTaXplKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnN1ZmZpY2llbnQgdGFpbHJvb20sICIKKyAgICAgICAgICAgICAgICAidGFpbFslcF0sIGVuZFslcF0sIHJlcVslZF0iLAorICAgICAgICAgICAgICAgIF9fTElORV9fLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCisgICAgICAgICAgICAgICAgc2tiX2VuZF9wb2ludGVyKHNrYiksIGRhdGFTaXplKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIGFjdHVhbGx5IHB1c2ggdGhlIGRhdGEKKyAgIG1lbWNweShza2JfcHV0KHNrYiwgZGF0YVNpemUpLCBwRGF0YSwgZGF0YVNpemUpOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wa3RfcmVzZXJ2ZV90YWlsKCkgLSBSZXNlcnZlIHNwYWNlIGF0IHRoZSBlbmQgb2YgYSB2b3NzIFBhY2tldAorCisgIFRoaXMgQVBJIHdpbGwgcmVzZXJ2ZSBzcGFjZSBhdCB0aGUgZW5kIG9mIGEgdm9zcyBQYWNrZXQuICBUaGUgY2FsbGVyIGNhbgorICB0aGVuIGNvcHkgZGF0YSBpbnRvIHRoaXMgcmVzZXJ2ZWQgc3BhY2UgdXNpbmcgbWVtY3B5KCkgbGlrZSBmdW5jdGlvbnMuICBUaGlzCisgIGFsbG93cyB0aGUgY2FsbGVyIHRvIHJlc2VydmUgc3BhY2UgYW5kIGJ1aWxkIGhlYWRlcnMgZGlyZWN0bHkgaW4gdGhpcworICByZXNlcnZlZCBzcGFjZSBpbiB0aGUgdm9zcyBQYWNrZXQuCisKKyAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGxlbmd0aCBvZiB0aGUgdm9zcyBQYWNrZXQgaXMgaW5jcmVhc2VkIGJ5CisgIGRhdGFTaXplLgorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG1vZGlmeS4KKworICBccGFyYW0gcHBEYXRhIC0gcG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICBzcGFjZSBpcyByZXR1cm5lZC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBjYWxsZXIgaGFzCisgICAgICAgICAgICAgICAgICB3cml0ZSAvIHJlYWQgYWNjZXNzIHRvIHRoZSBkYXRhIHNwYWNlIGF0ICpwcERhdGEgZm9yIGxlbmd0aAorICAgICAgICAgICAgICAgICAgZGF0YVNpemUgdG8gYnVpbGQgaGVhZGVycywgZXRjLgorCisgIFxwYXJhbSBkYXRhU2l6ZSAtIHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIHJlc2VydmUgYXQgdGhlIGhlYWQgb2YgdGhlIHZvc3MKKyAgICAgICAgICAgICAgICAgICAgUGFja2V0LiAgVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGxlbmd0aCBvZiB0aGUgdm9zcworICAgICAgICAgICAgICAgICAgICBQYWNrZXQgaXMgaW5jcmVhc2VkIGJ5IGRhdGFTaXplLgorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3Jlc2VydmVfdGFpbCggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9WT0lEX3QgKipwcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1NJWkVfdCBkYXRhU2l6ZSApCit7CisgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisgICAvLyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHBvaW50ZXJzCisgICBpZiAodW5saWtlbHkoKE5VTEwgPT0gcFBhY2tldCkgfHwgKE5VTEwgPT0gcHBEYXRhKSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwb2ludGVyIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIGlzIHJlYWxseSBhbiBpbml0aWFsaXplZCB2b3MgcGFja2V0CisgICBpZiAodW5saWtlbHkoVlBLVF9NQUdJQ19OVU1CRVIgIT0gcFBhY2tldC0+bWFnaWMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEludmFsaWQgbWFnaWMiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBnZXQgcG9pbnRlciB0byB0aGUgc2tiCisgICBza2IgPSBwUGFja2V0LT5wU2tiOworCisgICAvLyBWYWxpZGF0ZSB0aGUgc2tiCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBza2IpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgc2tiIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIHRhaWxyb29tLiAgQXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gd2UKKyAgIC8vIGNhbiBvbWl0IHRoaXMgY2hlY2sgbGF0ZXIgc2luY2Ugc2tiX3B1dCgpIHdpbGwgYWxzbyBwZXJmb3JtIHRoZQorICAgLy8gY2hlY2sgKGV4Y2VwdCBza2JfcHV0KCkgd2lsbCBwYW5pYyB0aGUga2VybmVsKQorICAgaWYgKHVubGlrZWx5KHNrYl90YWlscm9vbShza2IpIDwgZGF0YVNpemUpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEluc3VmZmljaWVudCB0YWlscm9vbSwgIgorICAgICAgICAgICAgICAgICJ0YWlsWyVwXSwgZW5kWyVwXSwgcmVxWyVkXSIsCisgICAgICAgICAgICAgICAgX19MSU5FX18sIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKyAgICAgICAgICAgICAgICBza2JfZW5kX3BvaW50ZXIoc2tiKSwgZGF0YVNpemUpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gYWN0dWFsbHkgYWxsb2NhdGUgdGhlIHNwYWNlCisgICAqcHBEYXRhID0gc2tiX3B1dChza2IsIGRhdGFTaXplKTsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19wa3RfcG9wX3RhaWwoKSAtIFJlbW92ZSBkYXRhIGZyb20gdGhlIGVuZCBvZiB0aGUgdm9zcyBQYWNrZXQKKworICBUaGlzIEFQSSByZW1vdmVzIGRhdGEgZnJvbSB0aGUgZW5kIG9mIGEgdm9zcyBQYWNrZXQuICBUaGUgZGF0YSBpcworICBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciBkZXNjcmliZWQgYnkgcERhdGEgYW5kIHBEYXRhU2l6ZQorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG9wZXJhdGUgb24uCisKKyAgXHBhcmFtIHBEYXRhIC0gcG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgd2hlcmUgdGhlIGRhdGEgcmVtb3ZlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICB2b3NzIFBhY2tldCBpcyBwbGFjZWQuCisKKyAgXHBhcmFtIGRhdGFTaXplIC0gVGhlIGFtb3VudCBvZiBzcGFjZSB0byByZW1vdmUgZnJvbSB0aGUgZW5kIG9mIHRoZSB2b3NzCisgICAgICAgICAgICAgICAgICAgIFBhY2tldC4gIFRoZSBvdXRwdXQgYnVmZmVyIChhdCAqcERhdGEpIG11c3QgY29udGFpbiBhdAorICAgICAgICAgICAgICAgICAgICBsZWFzdCB0aGlzIGFtb3VudCBvZiBzcGFjZS4KKworICBccmV0dXJuCisKKyAgXHNhCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9wb3BfdGFpbCggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1ZPSURfdCAqcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfU0laRV90IGRhdGFTaXplICkKK3sKKyAgIHN0cnVjdCBza19idWZmICpza2I7CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMKKyAgIGlmICh1bmxpa2VseSgoTlVMTCA9PSBwUGFja2V0KSB8fCAoTlVMTCA9PSBwRGF0YSkpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgcG9pbnRlciIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIFZhbGlkYXRlIHRoYXQgdGhpcyBpcyByZWFsbHkgYW4gaW5pdGlhbGl6ZWQgdm9zIHBhY2tldAorICAgaWYgKHVubGlrZWx5KFZQS1RfTUFHSUNfTlVNQkVSICE9IHBQYWNrZXQtPm1hZ2ljKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBJbnZhbGlkIG1hZ2ljIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gZ2V0IHBvaW50ZXIgdG8gdGhlIHNrYgorICAgc2tiID0gcFBhY2tldC0+cFNrYjsKKworICAgLy8gVmFsaWRhdGUgdGhlIHNrYgorICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gc2tiKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHNrYiIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggZGF0YSB0byBwb3AKKyAgIGlmICh1bmxpa2VseShza2ItPmxlbiA8IGRhdGFTaXplKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBwb3AgZXhjZWVkcyBwYWNrZXQgc2l6ZSwgbGVuWyVkXSwgcmVxWyVkXSIsCisgICAgICAgICAgICAgICAgX19MSU5FX18sIHNrYi0+bGVuLCBkYXRhU2l6ZSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBhZGp1c3QgcG9pbnRlcnMgKHRoZXJlIGlzbid0IGEgbmF0aXZlIExpbnV4IEFQSSBmb3IgdGhpcykKKyAgIHNrYi0+dGFpbCAtPSBkYXRhU2l6ZTsKKyAgIHNrYi0+bGVuIC09IGRhdGFTaXplOworCisgICAvLyBhY3R1YWxseSBwdXNoIHRoZSBkYXRhCisgICBtZW1jcHkocERhdGEsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgZGF0YVNpemUpOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfcGt0X3RyaW1fdGFpbCgpIC0gU2tpcCBvdmVyIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSB2b3NzIFBhY2tldAorCisgIFRoaXMgQVBJIG1vdmVzIHRoZSBwb2ludGVycyBhdCB0aGUgaGVhZCBvZiBhIHZvc3MgUGFja2V0IHRvIGVzc2VudGlhbGx5CisgIHNraXAgb3ZlciBkYXRhIGF0IHRoZSBlbmQgb2YgYSB2b3NzIFBhY2tldC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZQorICBsZW5ndGggb2YgdGhlIHZvc3MgUGFja2V0IGlzIHJlZHVjZWQgYnkgZGF0YVNpemUgYW5kIHZvc3MgUGFja2V0IGlzCisgIGFkanVzdGVkIHRvIGVsaW1pbmF0ZSB0aGUgZGF0YSBmcm9tIHRoZSBlbmQgb2YgdGhlIHZvc3MgUGFja2V0LgorCisgIFRoaXMgQVBJIGhhcyB0aGUgb3Bwb3NpdGUgZWZmZWN0IG9mIFxhIHZvc19wa3RfcmVzZXJ2ZV90YWlsKCkuCisKKyAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgdm9zcyBQYWNrZXQgdG8gb3BlcmF0ZSBvbi4KKworICBccGFyYW0gZGF0YVNpemUgLSBUaGUgYW1vdW50IG9mIHNwYWNlIHRvIHJlbW92ZSBhdCB0aGUgZW5kIG9mIHRoZSB2b3NzCisgICAgICAgICAgICAgICAgICAgIFBhY2tldC4KKworICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdXBvbiByZXR1cm4sIHRoZSBkYXRhIHNraXBwZWQgb3ZlciBpcworICAgICAgICAgICAgICAgICAgICBpbmFjY2Vzc2libGUgdG8gdGhlIGNhbGxlci4gIElmIHRoZSBjYWxsZXIgbmVlZHMgYWNjZXNzCisgICAgICAgICAgICAgICAgICAgIHRvIHRoZSB0YWlsIGRhdGEsIHVzZSB2b3NfcGt0X3BvcF90YWlsKCkgb3IKKyAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF9leHRyYWN0X2RhdGEoKSB0byBnZXQgYSBjb3B5IG9mIHRoZSBkYXRhLgorCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3RyaW1fdGFpbCggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9TSVpFX3QgZGF0YVNpemUgKQoreworICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworICAgLy8gVmFsaWRhdGUgdGhlIHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcFBhY2tldCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwb2ludGVyIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIGlzIHJlYWxseSBhbiBpbml0aWFsaXplZCB2b3MgcGFja2V0CisgICBpZiAodW5saWtlbHkoVlBLVF9NQUdJQ19OVU1CRVIgIT0gcFBhY2tldC0+bWFnaWMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEludmFsaWQgbWFnaWMiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBnZXQgcG9pbnRlciB0byB0aGUgc2tiCisgICBza2IgPSBwUGFja2V0LT5wU2tiOworCisgICAvLyBWYWxpZGF0ZSB0aGUgc2tiCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBza2IpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgc2tiIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBkYXRhIHRvIHBvcAorICAgaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgZGF0YVNpemUpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IHBvcCBleGNlZWRzIHBhY2tldCBzaXplLCBsZW5bJWRdLCByZXFbJWRdIiwKKyAgICAgICAgICAgICAgICBfX0xJTkVfXywgc2tiLT5sZW4sIGRhdGFTaXplKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIGFkanVzdCBwb2ludGVycyAodGhlcmUgaXNuJ3QgYSBuYXRpdmUgTGludXggQVBJIGZvciB0aGlzKQorICAgc2tiLT50YWlsIC09IGRhdGFTaXplOworICAgc2tiLT5sZW4gLT0gZGF0YVNpemU7CisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3BrdF9nZXRfdGltZXN0YW1wKCkgLSBSZXRyaXZlIHRoZSB0aW1lc3RhbXAgYXR0cmlidXRlIGZyb20gdGhlCisgIHNwZWNpZmllZCBWT1NTIHBhY2tldAorCisgIFxwYXJhbSBwUGFja2V0IC0gdGhlIHZvc3MgUGFja2V0IHRvIG9wZXJhdGUgb24uCisKKyAgXHBhcmFtIHBUc3RhbXAgLSB0aGUgdGltZXN0YW1wIHdpbGwgYmUgcmV0dXJuZWQgaGVyZS4KKworICBccmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVCAtIGludmFsaWQgcGFyYW1ldGVyKHMpIHNwZWNpZmllZAorCisgICAgICAgICAgVk9TX1NUQVRVU19TVUNDRVNTIC0gdGltZXN0YW1wIHJldHJpdmVkIHN1Y2Nlc3NmdWxseQorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19wa3RfZ2V0X3RpbWVzdGFtcCggdm9zX3BrdF90ICpwUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVElNRV90KiBwVHN0YW1wICkKK3sKKyAgIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMKKyAgIGlmICh1bmxpa2VseSgoTlVMTCA9PSBwUGFja2V0KSB8fAorICAgICAgICAgICAgICAgIChOVUxMID09IHBUc3RhbXApKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiVlBLVCBbJWRdOiBOVUxMIHBvaW50ZXIiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBWYWxpZGF0ZSB0aGF0IHRoaXMgaXMgcmVhbGx5IGFuIGluaXRpYWxpemVkIHZvcyBwYWNrZXQKKyAgIGlmICh1bmxpa2VseShWUEtUX01BR0lDX05VTUJFUiAhPSBwUGFja2V0LT5tYWdpYykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogSW52YWxpZCBtYWdpYyIsIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIHJldHVybiB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uCisgICAqcFRzdGFtcCA9IHBQYWNrZXQtPnRpbWVzdGFtcDsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3BrdF9mbGF0dGVuX3J4X3BrdCgpIC0gVHJhbnNmb3JtIGEgcGxhdGZvcm0gYmFzZWQgUlggVk9TUworICBwYWNrZXQgaW50byBhIGZsYXQgYnVmZmVyIGJhc2VkIFZPU1MgcGFja2V0IGlmIG5lZWRlZC4gVGhpcyBpcyBuZWVkZWQgaW4KKyAgY2FzZXMgd2hlcmUgZm9yIHJlYXNvbnMgb2YgZWZmaWNpZW5jeSB3ZSB3YW50IHRoZSBSWCBwYWNrZXRzIHRvIGJlIHZlcnkKKyAgcGxhdGZvcm0gc3BlY2lmaWMgKGZvciBlLmcuIERTTSBiYXNlZCBvbiBBTVNTLCBldGMpLiBIb3dldmVyIHBsYXRmb3JtCisgIGluZGVwZW5kZW50IGNvZGUgbWF5IHJlbHkgb24gbWFraW5nIGNhbGxzIG9uIHRoZSBWT1NTIHBhY2tldCB3aGljaCBjYW4gb25seQorICBiZSBzdXBwb3J0ZWQgYnkgdGhlIGZsYXQgYnVmZmVyIGJhc2VkIGltcGxlbWVudGF0aW9uIG9mIGEgUlggcGFja2V0LiBUaGlzIEFQSQorICB3aWxsIGFsbG9jYXRlIGEgbmV3IFZPU1MgcGFja2V0IHdpdGggZmxhdCBidWZmZXIsIGV4dHJhY3QgdGhlIGRhdGEgZnJvbSB0aGUKKyAgaW5wdXQgVk9TUyBwYWNrZXQgYW5kIHRoZW4gcmVsZWFzZSB0aGUgaW5wdXQgVk9TUyBwYWNrZXQuIFRoZSBuZXcgVk9TUyBwYWNrZXQKKyAgd2lsbCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4KKworICBccGFyYW0gcHBQYWNrZXQgLSB0aGUgdm9zcyBQYWNrZXQgdG8gb3BlcmF0ZSBvbi4gT24gaW5wdXQgY29udGFpbnMKKyAgICAgICAgICAgICAgICAgICAgdGhlIHBsYXRmb3JtIGJhc2VkIHBhY2tldC4gT24gb3V0cHV0IGNvbnRhaW5zIHRoZSBmbGF0CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBiYXNlZCBwYWNrZXQuIEFueSBhcHBsaWNhYmxlIHJlc291cmNlcworICAgICAgICAgICAgICAgICAgICBhcmUgZnJlZWQgYXMgcGFydCBvZiB0aGlzIGNhbGwuCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQgLSBpbnZhbGlkIHBhcmFtZXRlciBzcGVjaWZpZWQKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHBhY2tldCB0eXBlIG5vdCBSWF9SQVcKKworICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIHRyYW5zZm9ybSBzdWNjZXNzZnVsCisKKyAgICAgICAgICBvdGhlciBWT1NTIHN0YXR1cyAtIG90aGVyIGVycm9ycyBlbmNvdW50ZXJlZAorCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X2ZsYXR0ZW5fcnhfcGt0KCB2b3NfcGt0X3QgKipwcFBhY2tldCApCit7CisgICAvLyBMaW51eC9BbmRyb2lkIHNrYnMgYXJlIGFscmVhZHkgZmxhdCwgbm8gd29yayByZXF1aXJlZAorICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X3NldF9yeF9sZW5ndGgoKSAtIFNldCB0aGUgbGVuZ3RoIG9mIGEgcmVjZWl2ZWQgcGFja2V0IAorCisgIFRoaXMgQVBJIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluc2lkZSB0aGUgcGFja2V0IGFmdGVyIGEgRE1BIGhhcyBvY2N1cnJlZAorICBvbiByeCwgaXQgd2lsbCBhbHNvIHNldCB0aGUgdGFpbCBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGRhdGEuCisKKyAgXHBhcmFtIHBQYWNrZXQgLSB0aGUgdm9zcyBQYWNrZXQgdG8gb3BlcmF0ZSBvbi4KKworICBccGFyYW0gcGt0TGVuIC0gVGhlIHNpemUgb2YgdGhlIGRhdGEgcGxhY2VkIGluIHRoZSBSeCBwYWNrZXQgZHVyaW5nIERNQS4KKworCisgIFxyZXR1cm4KKworICBcc2EKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB2b3NfcGt0X3NldF9yeF9sZW5ndGgoIHZvc19wa3RfdCAqcFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1NJWkVfdCBwa3RMZW4gKQoreworICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworICAgLy8gVmFsaWRhdGUgdGhlIHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcFBhY2tldCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIlZQS1QgWyVkXTogTlVMTCBwb2ludGVyIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIGlzIHJlYWxseSBhbiBpbml0aWFsaXplZCB2b3MgcGFja2V0CisgICBpZiAodW5saWtlbHkoVlBLVF9NQUdJQ19OVU1CRVIgIT0gcFBhY2tldC0+bWFnaWMpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IEludmFsaWQgbWFnaWMiLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvLyBnZXQgcG9pbnRlciB0byB0aGUgc2tiCisgICBza2IgPSBwUGFja2V0LT5wU2tiOworCisgICAvLyBWYWxpZGF0ZSB0aGUgc2tiCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBza2IpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICJWUEtUIFslZF06IE5VTEwgc2tiIiwgX19MSU5FX18pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gYWRqdXN0IHBvaW50ZXJzICh0aGVyZSBpc24ndCBhIG5hdGl2ZSBMaW51eCBBUEkgZm9yIHRoaXMpCisgICAvLyA/PyAtIGlzIHRoaXMgc3VmZmljaWVudD8gCisgICBza2Jfc2V0X3RhaWxfcG9pbnRlcihza2IsIHBrdExlbik7CisgICBza2ItPmxlbiAgID0gcGt0TGVuOworCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOyAKKworfQorLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfcGt0X2dldF9hdmFpbGFibGVfYnVmZmVyX3Bvb2woKSAtIEdldCBhdmFsaWFibGUgVk9TIHBhY2tldCBzaXplCisgICBWT1NTIFBhY2tldCBwb29sIGlzIGxpbWl0dGVkIHJlc291cmNlCisgICBWT1NTIENsaWVudCBuZWVkIHRvIGtub3cgaG93IG1hbnkgcGFja2V0IHBvb2wgaXMgc3RpbGwgYXZhbGlhYmxlIHRvIGNvbnRyb2wKKyAgIHRoZSBmbG93CisgICAKKyAgXHBhcmFtICBwa3RUeXBlIC0gUGFja2V0IHR5cGUgd2FudCB0byBrbm93IGZyZWUgYnVmZmVyIGNvdW50CisgICAgICAgICAgICAgICAgICAgIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCwgbWFuYWdlbWVudCBmcmVlIGJ1ZmZlciBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9EQVRBCisgICAgICAgICAgICAgICAgICAgIFZPU19QS1RfVFlQRV9UWF84MDJfM19EQVRBLCBUWCBmcmVlIGJ1ZmZlciBjb3VudAorICAgICAgICAgICAgICAgICAgICBWT1NfUEtUX1RZUEVfUlhfUkFXLCBSWCBmcmVlIGJ1ZmZlciBjb3VudAorCisgICAgICAgICAgdm9zRnJlZUJ1ZmZlciAtIGZyZWUgZnJhbWUgYnVmZmVyIHNpemUKKyAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMIC0gaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXIKKworICAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIEdldCBzaXplIHN1Y2Nlc3MKKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3BrdF9nZXRfYXZhaWxhYmxlX2J1ZmZlcl9wb29sIChWT1NfUEtUX1RZUEUgIHBrdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9TSVpFX3QgICAgICp2b3NGcmVlQnVmZmVyKQoreworICAgc3RydWN0IGxpc3RfaGVhZCAqcExpc3Q7CisgICBzdHJ1Y3QgbGlzdF9oZWFkICpwTm9kZTsKKyAgIHZfU0laRV90IGNvdW50OworICAgaW50IHJjOyAKKyAgIGlmIChOVUxMID09IHZvc0ZyZWVCdWZmZXIpCisgICB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBzd2l0Y2ggKHBrdFR5cGUpCisgICB7CisgICBjYXNlIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVDoKKyAgICAgIHBMaXN0ID0gJmdwVm9zUGFja2V0Q29udGV4dC0+dHhNZ210RnJlZUxpc3Q7CisgICAgICBicmVhazsKKworICAgY2FzZSBWT1NfUEtUX1RZUEVfVFhfODAyXzExX0RBVEE6CisgICBjYXNlIFZPU19QS1RfVFlQRV9UWF84MDJfM19EQVRBOgorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgIGlmIChWT1NfU1RBX1NBUF9NT0RFID09IGhkZF9nZXRfY29ucGFyYW0oKSkKKyAgICAgIHsKKyAgICAgICAgICp2b3NGcmVlQnVmZmVyID0gZ3BWb3NQYWNrZXRDb250ZXh0LT51Y3R4RGF0YUZyZWVMaXN0Q291bnQ7ICAKKyAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICBwTGlzdCA9ICZncFZvc1BhY2tldENvbnRleHQtPnR4RGF0YUZyZWVMaXN0OworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgVk9TX1BLVF9UWVBFX1JYX1JBVzoKKyAgICAgIC8vIGlmIHRoZSBjYWxsZXIgaXMgY3VyaW91cyBob3cgbWFueSByYXcgcGFja2V0cyBhcmUgYXZhaWxhYmxlCisgICAgICAvLyB0aGVuIGhlIHByb2JhYmx5IHdhbnRzIGFzIG1hbnkgcGFja2V0cyB0byBiZSBhdmFpbGFibGUgYXMKKyAgICAgIC8vIHBvc3NpYmxlIHNvIHJlcGxlbmlzaCB0aGUgcmF3IHBvb2wKKyAgICAgIHZvc19wa3RpX3JlcGxlbmlzaF9yYXdfcG9vbCgpOworICAgICAgcExpc3QgPSAmZ3BWb3NQYWNrZXRDb250ZXh0LT5yeFJhd0ZyZWVMaXN0OworICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKFZPU19TVEFUVVNfRV9JTlZBTCk7CisgICB9CisKKyAgIGNvdW50ID0gMDsKKyAgIHJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZncFZvc1BhY2tldENvbnRleHQtPm1sb2NrKTsKKyAgIGxpc3RfZm9yX2VhY2gocE5vZGUsIHBMaXN0KQorICAgeworICAgICAgY291bnQrKzsKKyAgIH0KKyAgIGlmIChsaWtlbHkoMCA9PSByYykpCisgICB7CisgICAgICBtdXRleF91bmxvY2soJmdwVm9zUGFja2V0Q29udGV4dC0+bWxvY2spOworICAgfQorICAgKnZvc0ZyZWVCdWZmZXIgPSBjb3VudDsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworI2lmZGVmIFZPU19QQUNLRVRfVU5JVF9URVNUCisjaW5jbHVkZSAidm9zX3BhY2tldF90ZXN0LmMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9zcmMvdm9zX3Bvd2VyLmMgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19wb3dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTA5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19wb3dlci5jCkBAIC0wLDAgKzEsMTQ3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qIQorICBAZmlsZQorICB2b3NfcG93ZXIuYworCisgIEBicmllZgorICBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gVk9TUyBwb3dlciBBUElzIHVzaW5nIGZvciBwb3dlciBtYW5hZ2VtZW50IAorICBvZiB0aGUgV0xBTiBMaWJyYSBtb2R1bGUgZnJvbSB0aGUgTVNNIFBNSUMuIFRoZXNlIGltcGxlbWVudGF0aW9uIG9mIAorICB0aGVzZSBBUElzIGlzIHZlcnkgdGFyZ2V0IGRlcGVuZGVudCwgYWxzbyB0aGVzZSBBUElzIHNob3VsZCBvbmx5IGJlCisgIHVzZWQgd2hlbiB0aGUgV0xBTiBMaWJyYSBtb2R1bGUgaXMgcG93ZXJlZCBmcm9tIHRoZSBNU00gUE1JQyBhbmQgbm90CisgIGZyb20gYW4gZXh0ZXJuYWwgaW5kZXBlbmRlbnQgcG93ZXIgc291cmNlCisKKyovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFF1YWxjb21tIFByb3ByaWV0YXJ5CisKKyAgRXhwb3J0IG9mIHRoaXMgdGVjaG5vbG9neSBvciBzb2Z0d2FyZSBpcyByZWd1bGF0ZWQgYnkgdGhlIFUuUy4gR292ZXJubWVudC4KKyAgRGl2ZXJzaW9uIGNvbnRyYXJ5IHRvIFUuUy4gbGF3IHByb2hpYml0ZWQuCisKKyAgQWxsIGlkZWFzLCBkYXRhIGFuZCBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gb3IgZGlzY2xvc2VkIGJ5CisgIHRoaXMgZG9jdW1lbnQgYXJlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24gb2YKKyAgUVVBTENPTU0gSW5jb3Jwb3JhdGVkIGFuZCBhbGwgcmlnaHRzIHRoZXJlaW4gYXJlIGV4cHJlc3NseSByZXNlcnZlZC4KKyAgQnkgYWNjZXB0aW5nIHRoaXMgbWF0ZXJpYWwgdGhlIHJlY2lwaWVudCBhZ3JlZXMgdGhhdCB0aGlzIG1hdGVyaWFsCisgIGFuZCB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIHRoZXJlaW4gYXJlIGhlbGQgaW4gY29uZmlkZW5jZSBhbmQgaW4KKyAgdHJ1c3QgYW5kIHdpbGwgbm90IGJlIHVzZWQsIGNvcGllZCwgcmVwcm9kdWNlZCBpbiB3aG9sZSBvciBpbiBwYXJ0LAorICBub3IgaXRzIGNvbnRlbnRzIHJldmVhbGVkIGluIGFueSBtYW5uZXIgdG8gb3RoZXJzIHdpdGhvdXQgdGhlIGV4cHJlc3MKKyAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFFVQUxDT01NIEluY29ycG9yYXRlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBNT0RVTEUKKworVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCitOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCiskSGVhZGVyOiAkCisKK3doZW4gICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgIC0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8dm9zX3Bvd2VyLmg+CisKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworI2luY2x1ZGUgPGxpYnJhX3NkaW9pZi5oPgorI2VuZGlmCisKKyNpZmRlZiBNU01fUExBVEZPUk0KKyNpbmNsdWRlIDxtYWNoL21wcC5oPgorI2luY2x1ZGUgPG1hY2gvdnJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpZmRlZiBNU01fUExBVEZPUk1fN3gzMAorI2luY2x1ZGUgPG1hY2gvaXJxcy03eDMwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3BtaWM4MDU4Lmg+CisjaW5jbHVkZSA8bWFjaC9ycGNfcG1hcHAuaD4KKyNpbmNsdWRlIDxtYWNoL3BtaWMuaD4KKyNlbmRpZgorCisjaWZkZWYgTVNNX1BMQVRGT1JNXzg2NjAKKyNpbmNsdWRlIDxxY29td2xhbl9wd3JpZi5oPgorI2VuZGlmCisKKyNpZmRlZiBNU01fUExBVEZPUk1fN3gyN0EKKyNpbmNsdWRlIDxsaW51eC9xY29td2xhbjd4MjdhX3B3cmlmLmg+CisjZW5kaWYKKworI2VuZGlmIC8vTVNNX1BMQVRGT1JNCisKKyNpbmNsdWRlIDx2b3Nfc2NoZWQuaD4KKworLy9UbyB3b3JrIGFyb3VuZCBpc3N1ZXMgb2YgZmFpbCB0byB0dXJuIFdJRkkgYmFjayBvbiBhZnRlciB0dXJuaW5nIGl0IG9mZgorI2RlZmluZSBWT1NfUFdSX1dJRklfT05fT0ZGX0hBQ0sKKyNpZmRlZiBWT1NfUFdSX1dJRklfT05fT0ZGX0hBQ0sKKyNkZWZpbmUgVk9TX1BXUl9TTEVFUChtcykgbXNsZWVwKG1zKQorI2Vsc2UKKyNkZWZpbmUgVk9TX1BXUl9TTEVFUChtcykKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICBERUZJTklUSU9OUyBBTkQgVFlQRVMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDSElQX1BPV0VSX09OICAgICAgICAgMQorI2RlZmluZSBDSElQX1BPV0VSX09GRiAgICAgICAgMAorCisvLyBTRElPIENvbmZpZyBDeWNsZSBDbG9jayBGcmVxdWVuY3kKKyNkZWZpbmUgV0xBTl9MT1dfU0RfQ09ORklHX0NMT0NLX0ZSRVEgNDAwMDAwCisKKyNpZmRlZiBNU01fUExBVEZPUk1fN3gzMAorCisjZGVmaW5lIFBNODA1OF9HUElPX1BNX1RPX1NZUyhwbV9ncGlvKSAgKHBtX2dwaW8gKyBOUl9HUElPX0lSUVMpCisKK3N0YXRpYyBjb25zdCBjaGFyKiBpZCA9ICJXTEFOIjsKKworc3RydWN0IHdsYW5fcG04MDU4X2dwaW8geworICAgIGludCBncGlvX251bTsKKyAgICBzdHJ1Y3QgcG1fZ3BpbyBncGlvX2NmZzsKK307CisKKworLy9QTUlDODA1OCBHUElPIENPbmZpZ3VyYXRpb24gZm9yIE1TTTd4MzAgLy9PTgorc3RhdGljIHN0cnVjdCB3bGFuX3BtODA1OF9ncGlvIHdsYW5fZ3Bpb3NfcmVzZXRbXSA9IHsKKyAgICB7UE04MDU4X0dQSU9fUE1fVE9fU1lTKDIyKSx7UE1fR1BJT19ESVJfT1VULCBQTV9HUElPX09VVF9CVUZfQ01PUywgMCwgUE1fR1BJT19QVUxMX05PLCAyLCBQTV9HUElPX1NUUkVOR1RIX0xPVywgUE1fR1BJT19GVU5DX05PUk1BTCwgMH19LAorfTsKKworLy9PRkYKK3N0YXRpYyBzdHJ1Y3Qgd2xhbl9wbTgwNThfZ3BpbyB3bGFuX2dwaW9zX3Jlc2V0X291dFtdID0geworICAgIHtQTTgwNThfR1BJT19QTV9UT19TWVMoMjIpLHtQTV9HUElPX0RJUl9PVVQsIFBNX0dQSU9fT1VUX0JVRl9DTU9TLCAxLCBQTV9HUElPX1BVTExfTk8sIDIsIFBNX0dQSU9fU1RSRU5HVEhfSElHSCwgUE1fR1BJT19GVU5DX05PUk1BTCwgMH19LAorfTsKKworCisvKiBSb3V0aW5lIHRvIHBvd2VyIG9uL29mZiBWb2xhbnMgY2hpcCAqLworaW50IHZvc19jaGlwX3Bvd2VyX3FyZjg2MDAoaW50IG9uKQoreworICAgIHN0cnVjdCB2cmVnICp2cmVnX3dsYW4gPSBOVUxMOworICAgIHN0cnVjdCB2cmVnICp2cmVnX2dwMTYgPSBOVUxMOworICAgIHN0cnVjdCB2cmVnICp2cmVnX2dwMTUgPSBOVUxMOworICAgIHN0cnVjdCB2cmVnICp2cmVnX3MyID0gTlVMTDsKKyAgICBpbnQgcmMgPSAwOworCitWT1NfUFdSX1NMRUVQKDEwMCk7CisgICAgLy8yLjl2IFBBIGZyb20gTERPMTMKKyAgICB2cmVnX3dsYW4gPSB2cmVnX2dldChOVUxMLCAid2xhbiIpOworICAgIGlmIChJU19FUlIodnJlZ193bGFuKSkgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogd2xhbiB2cmVnIGdldCBmYWlsZWQgKCVsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBQVFJfRVJSKHZyZWdfd2xhbikpOworICAgICAgICByZXR1cm4gUFRSX0VSUih2cmVnX3dsYW4pOworICAgIH0KKworICAgIC8vMS4yViBBT04gZnJvbSBMRE8yNAorICAgIHZyZWdfZ3AxNiA9IHZyZWdfZ2V0KE5VTEwsICJncDE2Iik7CisgICAgaWYgKElTX0VSUih2cmVnX2dwMTYpKSAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogZ3AxNiB2cmVnIGdldCBmYWlsZWQgKCVsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBQVFJfRVJSKHZyZWdfZ3AxNikpOworICAgICAgICByZXR1cm4gUFRSX0VSUih2cmVnX2dwMTYpOworICAgIH0KKworICAgIC8vMS4yViBzdyBmcm9tIExETzIyCisgICAgdnJlZ19ncDE1ID0gdnJlZ19nZXQoTlVMTCwgImdwMTUiKTsKKyAgICBpZiAoSVNfRVJSKHZyZWdfZ3AxNSkpICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBncDE1IHZyZWcgZ2V0IGZhaWxlZCAoJWxkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIFBUUl9FUlIodnJlZ19ncDE1KSk7CisgICAgICAgIHJldHVybiBQVFJfRVJSKHZyZWdfZ3AxNSk7CisgICAgfQorCisgICAgLy8xLjNWIHN3IGZyb20gUzIKKyAgICB2cmVnX3MyID0gdnJlZ19nZXQoTlVMTCwgInMyIik7CisgICAgaWYgKElTX0VSUih2cmVnX3MyKSkgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogczIgdnJlZyBnZXQgZmFpbGVkICglbGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgUFRSX0VSUih2cmVnX3MyKSk7CisgICAgICAgIHJldHVybiBQVFJfRVJSKHZyZWdfczIpOworICAgIH0KKworICAgIGlmIChvbikgeworICAgICAgICAvKiBQcm9ncmFtIEdQSU8gMjMgdG8gZGUtYXNzZXJ0IChkcml2ZSAxKSBleHRlcm5hbF9wb3JfbiAoZGVmYXVsdCAweDAwODY1YTA1ICovCisgICAgICAgIHJjID0gcG04eHh4X2dwaW9fY29uZmlnKHdsYW5fZ3Bpb3NfcmVzZXRbMF0uZ3Bpb19udW0sICZ3bGFuX2dwaW9zX3Jlc2V0WzBdLmdwaW9fY2ZnKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogcG1pYyBncGlvICVkIGNvbmZpZyBmYWlsZWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgd2xhbl9ncGlvc19yZXNldFswXS5ncGlvX251bSwgcmMpOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKyAgICAgICAgVk9TX1BXUl9TTEVFUCgzMDApOworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIldMQU4gcHV0IGluIHJlc2V0IG1vZGUgXG4iKTsKKyNpZiAwCisgICAgICAgIHJjID0gcG1hcHBfY2xvY2tfdm90ZSgid2xhbiIsIFBNQVBQX0NMT0NLX0lEX0EwLCBQTUFQUF9DTE9DS19WT1RFX09OKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogVm90aW5nIFRDWE8gdG8gT04gZmFpbGVkLiAoJWQpXG4iLF9fZnVuY19fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8qIENvbmZpZ3VyZSBUQ1hPIHRvIGJlIHNsYXZlIHRvIFdMQU5fQ0xLX1BXUl9SRVEgKi8KKyAgICAgICAgcmMgPSBwbWFwcF9jbG9ja192b3RlKGlkLCBQTUFQUF9DTE9DS19JRF9BMCwgUE1BUFBfQ0xPQ0tfVk9URV9QSU5fQ1RSTCk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IENvbmZpZ3VyaW5nIFRDWE8gdG8gUGluIGNvbnRyb2xsYWJsZSBmYWlsZWQuICglZClcbiIsX19mdW5jX18sIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJUQ1hPIGNvbmZpZ3VyZWQgdG8gYmUgc2xhdmUgdG8gV0xBTl9DTEtfUFdSLVJFUSBcbiIpOworICAgICAgICBwcmludGsoS0VSTl9FUlIgIlRDWE8gaXMgbm93IHNsYXZlIHRvIGNsa19wd3JfcmVxIFxuIik7CisKKyAgICAgICAgLy9XYWl0IDEwbXNlYworICAgICAgICBtc2xlZXAoMTApOworCisgICAgICAgIC8qIEVuYWJsZSBMMTMgdG8gb3V0cHV0IDIuOVYgKGRlZmF1bHQgMi45VikgKi8KKyAgICAgICAgcmMgPSB2cmVnX3NldF9sZXZlbCh2cmVnX3dsYW4sIDMwNTApOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiB3bGFuIHZyZWcgc2V0IGxldmVsIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKworICAgICAgICByYyA9IHZyZWdfZW5hYmxlKHZyZWdfd2xhbik7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHdsYW4gdnJlZyBlbmFibGUgZmFpbGVkLiAoJWQpXG4iLF9fZnVuY19fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiMi45ViBQb3dlciBTdXBwbHkgRW5hYmxlZCBcbiIpOworICAgICAgICBwcmludGsoS0VSTl9FUlIgIjMuMDVWIFN1cHBseSBFbmFibGVkIFxuIik7CisKKyAgICAgICAgLyogRW5hYmxlIEwyNCB0byBvdXRwdXQgMS4yViBBT04oZGVmYXVsdCAxLjNWKSAqLworICAgICAgICByYyA9IHZyZWdfc2V0X2xldmVsKHZyZWdfZ3AxNiwgMTIwMCk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGdwMTYgdnJlZyBzZXQgbGV2ZWwgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gdnJlZ19lbmFibGUodnJlZ19ncDE2KTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogZ3AxNiB2cmVnIGVuYWJsZSBmYWlsZWQuICglZClcbiIsX19mdW5jX18sIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiMS4yViBBT04gUG93ZXIgU3VwcGx5IEVuYWJsZWQgXG4iKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIxLjJWIEFPTiBTdXBwbHkgRW5hYmxlZCBcbiIpOworCisgICAgICAgIC8vV2FpdCAzMDB1c2VjCisgICAgICAgIG1zbGVlcCgxKTsKKworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIjEuMlYgQU9OIFBvd2VyIFN1cHBseSBFbmFibGVkIFxuIik7CisKKyAgICAgICAgcmMgPSBwbTh4eHhfZ3Bpb19jb25maWcod2xhbl9ncGlvc19yZXNldF9vdXRbMF0uZ3Bpb19udW0sICZ3bGFuX2dwaW9zX3Jlc2V0X291dFswXS5ncGlvX2NmZyk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHBtaWMgZ3BpbyAlZCBjb25maWcgZmFpbGVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHdsYW5fZ3Bpb3NfcmVzZXRfb3V0WzBdLmdwaW9fbnVtLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiV0xBTiBpcyBvdXQgb2YgcmVzZXQgbm93IFxuIik7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiV0xBTiBpcyBvdXQgb2YgcmVzZXQgXG4iKTsKKworICAgICAgICAvKiBXYWl0IDUwMHVzZWMgKi8KKyAgICAgICAgbXNsZWVwKDEpOworCisgICAgICAgIC8qIFRPRE86IFJlcGxhY2UgdGhlIGNvZGUgdG8gZW5hYmxlIDEuMlYgc3cgYW5kIDEuM1Ygc3cgb25jZSB3ZSBoYXZlIHRoZSBBUEkgdG8gc2V0IHRoZXNlIHBvd2VyIHN1cHBsaWVzIFBpbiBjb250cm9sbGFibGUgKi8KKworICAgICAgICAvKiBFbmFibGUgMS4yIHN3aXRjaGVhYmxlIHBvd2VyIHN1cHBseSAqLworICAgICAgICByYyA9IHZyZWdfc2V0X2xldmVsKHZyZWdfZ3AxNSwgMTIwMCk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGdwMTUgdnJlZyBzZXQgbGV2ZWwgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPU19QT1dFUl9WT1RFRF9TVVBQTFkKKyAgICAgICAgcmMgPSB2cmVnX2VuYWJsZSh2cmVnX2dwMTUpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBncDE1IHZyZWcgZW5hYmxlIGZhaWxlZC4gKCVkKVxuIixfX2Z1bmNfXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKyNlbHNlICAgICAgICAKKyAgICAgICAgLyogMS4ydiBzd2l0Y2hhYmxlIHN1cHBseSBpcyBmb2xsb3dpbmcgdGhlIGNsa19wd3JfcmVxIHNpZ25hbCAqLworICAgICAgICByYyA9IHBtYXBwX3ZyZWdfcGluY250cmxfdm90ZShpZCwgUE1BUFBfVlJFR19MRE8yMiwgUE1BUFBfQ0xPQ0tfSURfQTAsIFZPU19UUlVFKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogZ3AxNSB2cmVnIGVuYWJsZSBmYWlsZWQuICglZClcbiIsX19mdW5jX18sIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisgICAgICAgIHZvc19zbGVlcCg1KTsKKyNlbmRpZgorCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiMS4yViBzdyBQb3dlciBTdXBwbHkgaXMgZW5hYmxlZCBcbiIpOworICAgICAgICBwcmludGsoS0VSTl9FUlIgIjEuMlYgc3cgaXMgZW5hYmxlZCBcbiIpOworCisgICAgICAgIC8qIEVuYWJsZSAxLjMgc3dpdGNoZWFibGUgcG93ZXIgc3VwcGx5ICovCisgICAgICAgIHJjID0gcG1hcHBfdnJlZ19sZXZlbF92b3RlKGlkLCBQTUFQUF9WUkVHX1MyLCAxMzAwKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogczIgdnJlZyBzZXQgbGV2ZWwgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorICAgICAgICBWT1NfUFdSX1NMRUVQKDMwMCk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9TX1BPV0VSX1ZPVEVEX1NVUFBMWQorICAgICAgICByYyA9IHZyZWdfZW5hYmxlKHZyZWdfczIpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBzMiB2cmVnIGVuYWJsZSBmYWlsZWQuIC4oJWQpXG4iLF9fZnVuY19fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorICAgICAgICBtc2xlZXAoMSk7CisjZWxzZSAgICAgICAgCisgICAgICAgIC8qIDEuM3Ygc3dpdGNoYWJsZSBzdXBwbHkgaXMgZm9sbG93aW5nIHRoZSBjbGtfcHdyX3JlcSBzaWduYWwgKi8KKyAgICAgICAgcmMgPSBwbWFwcF92cmVnX3BpbmNudHJsX3ZvdGUoaWQsIFBNQVBQX1ZSRUdfUzIsIFBNQVBQX0NMT0NLX0lEX0EwLCBWT1NfVFJVRSk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHMyIHZyZWcgZW5hYmxlIGZhaWxlZC4gKCVkKVxuIixfX2Z1bmNfXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKyAgICAgICAgdm9zX3NsZWVwKDUpOworI2VuZGlmCisKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIxLjNWIHN3IFBvd2VyIFN1cHBseSBpcyBlbmFibGVkIFxuIik7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiMS4zViBzdyBpcyBlbmFibGVkIFxuIik7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8qKgorICAgICAgICBBc3NlcnQgdGhlIGV4dGVybmFsIFBPUiB0byBrZWVwIHRoZSBjaGlwIGluIHJlc2V0IHN0YXRlLiBXaGVuIHRoZSBjaGlwIGlzIHR1cm5lZAorICAgICAgICBvbiB0aGUgbmV4dCB0aW1lLCBpdCB3b24ndCBiZSBkZXRlY3RlZCBieSB0aGUgYnVzIGRyaXZlciB1bnRpbCB3ZSBkZWFzc2VydCBpdC4KKyAgICAgICAgVGhpcyBpcyB0byB3b3JrLWFyb3VuZCB0aGUgaXNzdWUgd2hlcmUgaXQgZmFpbHMgc29tZXRpbWVzIHdoZW4gdHVybmluZyBXSUZJIG9mZiBhbmQgb24KKyAgICAgICAgdGhvdWdoIEdVSS4gVGhlIHRoZW9yeSBpcyB0aGF0LCBldmVuIHRob3VnaCB3ZSB2b3RlIG9mZiAxLjJWIEFPTiwgaXQgbWF5IHN0aWxsIG9uIGJlY2F1c2UKKyAgICAgICAgaXQgaXMgc2hhcmVkIGJ5IG90aGVyIGNvbXBvbmVudHMuIFdoZW4gdGhlIG5leHQgdGltZSB0byB0dXJuIG9uIFdJRkksIHBvbGxpbmcgaXMgdHVybmVkIG9uCisgICAgICAgIGZpcnN0IGFuZCB3aGVuIGxpYnJhc2Rpb2lmLmtvIGlzIGxvYWRlZCwgdGhlIGNhcmQgaXMgZGV0ZWN0ZWQgcmlnaHQgYXdheSBiZWZvcmUgd2xhbiBkcml2ZXIgbG9hZHMuIAorICAgICAgICBUaGUgYnVzIGRyaXZlciBtYXkgaGF2ZSBmaW5pc2hlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBkZXZpY2UuIFdoZW4gV0xBTiBkcml2ZXIgbG9hZHMsIAorICAgICAgICBpdCByZXNldHMgdGhlIGRldmljZSB0aGF0IGNhdXNlcyBpc3N1ZXMgd2hlbiB0aGUgYnVzIGRyaXZlciB0cmllcyB0byBhc3Nlc3MgdGhlIGNoaXAgbGF0ZXIuCisgICAgICAgIFRoaXMgc2V0dGluZyBkcmF3cyBtb3JlIHBvd2VyIGFmdGVyIHRoZSBkcml2ZXIgaXMgdW5sb2FkZWQuCisKKyAgICAgICAgVGhlIGxvYWQgc2VxdWVuY2UgaXMKKyAgICAgICAgMS4gRW5hYmxlIHBvbGxpbmcKKyAgICAgICAgMi4gaW5zbW9kIGxpYnJhc2Rpb2lmLmtvIChpZiBjYXJkIGRldGVjdGVkLCBzdG9wIHBvbGxpbmcpCisgICAgICAgIDMuIGluc21vZCBsaWJyYS5rbyAocmVzZXQgdGhlIGNoaXApCisgICAgICAgIDQuIHN0b3AgcG9sbGluZworICAgICAgICAqKi8KKyAgICAgICAgLyogUHJvZ3JhbSBHUElPIDIzIHRvIGRlLWFzc2VydCAoZHJpdmUgMSkgZXh0ZXJuYWxfcG9yX24gdG8gcHJldmVudCBjaGlwIGRldGVjdGlvbgorICAgICAgICAgICB1bnRpbCBpdCBpcyBhc3NlcnRlZC4KKyAgICAgICAgKi8KKyAgICAgICAgcmMgPSBwbTh4eHhfZ3Bpb19jb25maWcod2xhbl9ncGlvc19yZXNldFswXS5ncGlvX251bSwgJndsYW5fZ3Bpb3NfcmVzZXRbMF0uZ3Bpb19jZmcpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBwbWljIGdwaW8gJWQgY29uZmlnIGZhaWxlZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB3bGFuX2dwaW9zX3Jlc2V0WzBdLmdwaW9fbnVtLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPU19QT1dFUl9WT1RFRF9TVVBQTFkKKyAgICAgICAgLyogVE9ETzogUmVtb3ZlIHRoZSBjb2RlIHRvIGRpc2FibGUgMS4yViBzdyBhbmQgMS4zViBzdyBvbmNlIHdlIGhhdmUgdGhlIEFQSSB0byBzZXQgdGhlc2UgcG93ZXIgc3VwcGxpZXMgUGluIGNvbnRyb2xsYWJsZSAqLworICAgICAgICBwcmludGsoS0VSTl9FUlIgInBvd2VyIGRvd24gc3dpdGNoYWJsZVxuIik7CisgICAgICAgIHJjID0gcG1hcHBfdnJlZ19sZXZlbF92b3RlKGlkLCBQTUFQUF9WUkVHX1MyLCAwKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogczIgdnJlZyBzZXQgbGV2ZWwgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogMS4zViBzdyAqLyAgICAKKyAgICAgICAgcmMgPSB2cmVnX2Rpc2FibGUodnJlZ19zMik7IAorICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBzMiB2cmVnIGRpc2FibGUgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIxLjNWIHN3IGlzIGRpc2FibGVkIFxuIik7CisKKyAgICAgICAgLyogMS4yViBzdyAqLworICAgICAgICByYyA9IHZyZWdfZGlzYWJsZSh2cmVnX2dwMTUpOyAKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogZ3AxNSB2cmVnIGRpc2FibGUgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiMS4yViBzdyBpcyBkaXNhYmxlZCBcbiIpOworI2VuZGlmIC8vI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1NfUE9XRVJfVk9URURfU1VQUExZCisKKyAgICAgICAgLyogMS4yViBBT04gKi8KKyAgICAgICAgcmMgPSB2cmVnX2Rpc2FibGUodnJlZ19ncDE2KTsgCisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IGdwMTYgdnJlZyBkaXNhYmxlIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIjEuMlYgQU9OIGlzIGRpc2FibGVkIFxuIik7CisKKyNpZmRlZiBWT0xBTlNfMl8wCisgICAgICAgIC8qIENhbm5vdCB0dXJuIG9mZiAyLjlWIGR1ZSB0byB0aGUgUEFEIGlzc3VlIG9uIFZvbGFucyAqLworCisgICAgICAgIC8qIDIuOVYgKi8KKyAgICAgICAgcmMgPSB2cmVnX2Rpc2FibGUodnJlZ193bGFuKTsgCisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHdsYW4gdnJlZyBkaXNhYmxlIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgIjIuOVYgaXMgZGlzYWJsZWQgXG4iKTsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKyNlbmRpZgorCisjaWZkZWYgTVNNX1BMQVRGT1JNXzd4MjdfRkZBCisKKyNkZWZpbmUgTVBQXzRfQ0hJUF9QV0RfTCAzIC8vTVBQNCBpcyBob29rZWQgdG8gRGVlcCBTbGVlcCBTaWduYWwgCisKKy8vSGVscGVyIHJvdXRpbmUgdG8gcG93ZXIgdXAgTGlicmEga2V5cGFkIG9uIHRoZSA3eDI3IEZGQQoraW50IHZvc19jaGlwX3Bvd2VyXzd4Mjdfa2V5cGFkKCBpbnQgb24gKQoreworICAgc3RydWN0IHZyZWcgKnZyZWdfd2xhbiwgKnZyZWdfYnQgPSBOVUxMOworICAgaW50IHJjID0gMDsKKworICAgdnJlZ193bGFuID0gdnJlZ19nZXQoTlVMTCwgIndsYW4iKTsKKyAgIGlmIChJU19FUlIodnJlZ193bGFuKSkgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHdsYW4gdnJlZyBnZXQgZmFpbGVkICglbGQpIiwKKyAgICAgICAgIF9fZnVuY19fLCBQVFJfRVJSKHZyZWdfd2xhbikpOworICAgICAgcmV0dXJuIFBUUl9FUlIodnJlZ193bGFuKTsKKyAgIH0KKworICAgdnJlZ19idCA9IHZyZWdfZ2V0KE5VTEwsICJncDYiKTsKKyAgIGlmIChJU19FUlIodnJlZ19idCkpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBncDYgdnJlZyBnZXQgZmFpbGVkICglbGQpIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgUFRSX0VSUih2cmVnX2J0KSk7CisgICAgICByZXR1cm4gUFRSX0VSUih2cmVnX2J0KTsKKyAgIH0KKworICAgaWYob24pIHsKKworICAgICAgLyogdW5pdHMgb2YgbVYsIHN0ZXBzIG9mIDUwIG1WICovCisgICAgICByYyA9IHZyZWdfc2V0X2xldmVsKHZyZWdfYnQsIDI2MDApOworICAgICAgaWYgKHJjKSB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogdnJlZyBzZXQgbGV2ZWwgZmFpbGVkICglZCkiLF9fZnVuY19fLCByYyk7CisgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgIH0KKyAgICAgIHJjID0gdnJlZ19lbmFibGUodnJlZ19idCk7CisgICAgICBpZiAocmMpIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiB2cmVnIGVuYWJsZSBmYWlsZWQgKCVkKSIsX19mdW5jX18sIHJjKTsKKyAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgfQorCisgICAgICAvL1NldCBUQ1hPIHRvIDEuOHYuCisgICAgICByYyA9IHZyZWdfc2V0X2xldmVsKHZyZWdfd2xhbiwgMTgwMCk7CisgICAgICBpZiAocmMpIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiB2cmVnIHNldCBsZXZlbCBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCByYyk7CisgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgIH0KKworICAgICAgcmMgPSB2cmVnX2VuYWJsZSh2cmVnX3dsYW4pOworICAgICAgaWYgKHJjKSB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogd2xhbiB2cmVnIGVuYWJsZSBmYWlsZWQgKCVkKSIsX19mdW5jX18sIHJjKTsKKyAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgfQorCisgICAgICBtc2xlZXAoMTAwKTsKKworICAgICAgLy8gUHVsbCBNUFA0IGhpZ2ggdG8gdHVybiBvbiB2YXJpb3VzIHN1cHBseSB2b2x0YWdlcy4KKyAgICAgIHJjID0gbXBwX2NvbmZpZ19kaWdpdGFsX291dChNUFBfNF9DSElQX1BXRF9MLCAKKyAgICAgICAgIE1QUF9DRkcoTVBQX0RMT0dJQ19MVkxfTVNNUCwgTVBQX0RMT0dJQ19PVVRfQ1RSTF9ISUdIKSk7CisgICAgICBpZiAocmMpIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBNUFBfNCBwdWxsIGhpZ2ggZmFpbGVkICglZCkiLF9fZnVuY19fLCByYyk7CisgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgIH0KKworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEVuYWJsZWQgcG93ZXIgc3VwcGx5IGZvciBXTEFOIiwgX19mdW5jX18pOworIAorICAgICAgbXNsZWVwKDUwMCk7CisgICB9CisgICBlbHNlIAorICAgeworCisgICAgICAgLy8gUHVsbCBNUFA0IGxvdyB0byBwbGFjZSB0aGUgY2hpcCBpbiByZXNldC4KKyAgICAgICByYyA9IG1wcF9jb25maWdfZGlnaXRhbF9vdXQoTVBQXzRfQ0hJUF9QV0RfTCwgCisgICAgICAgICAgTVBQX0NGRyhNUFBfRExPR0lDX0xWTF9NU01QLCBNUFBfRExPR0lDX09VVF9DVFJMX0xPVykpOworICAgICAgIGlmIChyYykgeworICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBNUFBfNCBwdWxsIGxvdyBmYWlsZWQgKCVkKSIsX19mdW5jX18sIHJjKTsKKyAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICB9CisKKyAgICAgICBtc2xlZXAoMTAwKTsKKworICAgICAgLyogVHVybiBvZmYgMi42ViAqLworICAgICAgcmMgPSB2cmVnX2Rpc2FibGUodnJlZ19idCk7CisgICAgICBpZiAocmMpIHsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiB2cmVnIGRpc2FibGUgZmFpbGVkICglZCkiLF9fZnVuY19fLCByYyk7CisgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgIH0KKworICAgICAgLyogVHVybiBvZmYgMS44ViAqLworICAgICAgcmMgPSB2cmVnX2Rpc2FibGUodnJlZ193bGFuKTsKKyAgICAgIGlmIChyYykgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHdsYW4gdnJlZyBkaXNhYmxlIGZhaWxlZCAoJWQpIixfX2Z1bmNfXywgcmMpOworICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICB9CisKKyAgICAgIG1zbGVlcCgxMDApOworCisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogRGlzYWJsZWQgcG93ZXIgc3VwcGx5IGZvciBXTEFOIiwgX19mdW5jX18pOworICAgfQorCisgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OIFBST1RPVFlQRVMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgIEBicmllZiB2b3NfY2hpcFBvd2VyVXAoKSAtIFRoaXMgQVBJIHdpbGwgcG93ZXIgdXAgdGhlIExpYnJhIGNoaXAKKworICBUaGlzIG9wZXJhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZiBzbywgdGhlIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwKKyAgYmUgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHQuIFRoZSBjYWxsYmFjayB3aWxsIAorICBiZSBjYWxsZWQgd2l0aCB0aGUgdXNlciBzdXBwbGllZCBkYXRhLiBJZiB0aGUgb3BlcmF0aW9uIGlzIGtub3duIHRvIGJlIAorICBzeW5jLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1cHBseSBhIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEuCisKKyAgVGhlIExpYnJhIFNESU8gY29yZSB3aWxsIGhhdmUgYmVlbiBpbml0aWFsaXplZCBpZiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcworICBzdWNjZXNzZnVsbHkKKworICBAcGFyYW0gc3RhdHVzIFtvdXRdIDogd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIHN5bmMgb3IgYXN5bmMKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfRkFVTFQgLSB0aGUgb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGFuZCBhIGNhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlcl9kYXRhIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgKHN0YXR1cyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgCisgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGJ1dCBhbm90aGVyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHByb2dyZXNzIChzdGF0dXMgd2lsbCBiZSBzZXQgdG8gVk9TX0NBTExfQVNZTkMpICAKKyAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBvcGVyYXRpb24gZmFpbGVkIChzdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSkgICAgICAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwUG93ZXJVcAorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEKKykKK3sKKworI2lmZGVmIE1TTV9QTEFURk9STV84NjYwCisgICBpZih2b3NfY2hpcF9wb3dlcl9xcmY4NjE1KENISVBfUE9XRVJfT04pKQorICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworI2VuZGlmCisKKyNpZmRlZiBNU01fUExBVEZPUk1fN3gzMAorICAgaWYodm9zX2NoaXBfcG93ZXJfcXJmODYwMChDSElQX1BPV0VSX09OKSkKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyNlbmRpZgorCisjaWZkZWYgTVNNX1BMQVRGT1JNXzd4MjdfRkZBCisgICBpZih2b3NfY2hpcF9wb3dlcl83eDI3X2tleXBhZChDSElQX1BPV0VSX09OKSkKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyNlbmRpZgorCisjaWZkZWYgTVNNX1BMQVRGT1JNXzd4MjdBCisgICBpZihjaGlwX3Bvd2VyX3FyZjYyODUoQ0hJUF9QT1dFUl9PTikpCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisjZW5kaWYKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgIEBicmllZiB2b3NfY2hpcFBvd2VyRG93bigpIC0gVGhpcyBBUEkgd2lsbCBwb3dlciBkb3duIHRoZSBMaWJyYSBjaGlwCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisKKyAgQHJldHVybiAKKyAgVk9TX1NUQVRVU19FX0lOVkFMIC0gc3RhdHVzIGlzIE5VTEwgCisgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHRoZSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYW5kIGEgY2FsbGJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyX2RhdGEgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCAoc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAKKyAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYnV0IGFub3RoZXIgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHN0YXR1cyB3aWxsIGJlIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgIAorICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIG9wZXJhdGlvbiBmYWlsZWQgKHN0YXR1cyB3aWxsIGJlIHNldCBhcHByb3ByaWF0ZWx5KSAgICAgICAKKyAgVk9TX1NUQVRVU19TVUNDRVNTIC0gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIFNZTkMgKHdpbGwgYmUgc2V0KQorICAgICAgICAgICAgICAgICAgICAgICBPUiBvcGVyYXRpb24gc3RhcnRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIEFTWU5DICh3aWxsIGJlIHNldCkKKworKi8KK1ZPU19TVEFUVVMgdm9zX2NoaXBQb3dlckRvd24KKygKKyAgdm9zX2NhbGxfc3RhdHVzX3R5cGUqIHN0YXR1cywKKyAgdm9zX3Bvd2VyX2NiX3R5cGUgICAgIGNhbGxiYWNrLAorICB2X1BWT0lEX3QgICAgICAgICAgICAgdXNlcl9kYXRhCispCit7CisKKyNpZmRlZiBBTklfQlVTX1RZUEVfU0RJTworI2lmZGVmIE1TTV9QTEFURk9STQorICAgc3RydWN0IHNkaW9fZnVuYyAqc2Rpb19mdW5jX2RldiA9IE5VTEw7CisKKyAgIC8vIEdldCB0aGUgU0RJTyBmdW5jIGRldmljZQorICAgc2Rpb19mdW5jX2RldiA9IGxpYnJhX2dldHNkaW9fZnVuY2RldigpOworICAgaWYgKHNkaW9fZnVuY19kZXYgPT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiBMaWJyYSBXTEFOIHNkaW8gZGV2aWNlIGlzIE5VTEwgXG4iCisgICAgICAgICAgICAgImV4aXRpbmciLCBfX2Z1bmNfXyk7CisgICB9CisgICBlbHNlIAorICAgeworICAgICAgLy8gU2V0IHNkaW8gY2xvY2sgdG8gbG93ZXIgY29uZmlnIGN5Y2xlIGZyZXF1ZW5jeSBiZWZvcmUgY2hpcCBwb3dlciBkb3duLgorICAgICAgLy8gU2V0dGluZyB0aGlzIGxvdyBmcmVxLCB3aWxsIGFsc28gaW50ZXJuYWxseSBpbiBtc21fc2RjYyBkaXNhYmxlIHBvd2VyIHNhdmUuCisgICAgICAvLyBPbmNlIHRoZSBjYXJkIGlzIHBvd2VyIGRvd24gYW5kIHBvd2VyZWQgdXAgYW5kIGRldGVjdGVkCisgICAgICAvLyBhZnRlciB0aGUgY29uZmlnIGN5Y2xlcyB0aGUgY2xvY2sgZnJlcSB3aWxsIGJlIHNldCBiYWNrIHVwCisgICAgICAvLyB0byBvdXIgY2FwYWJpbGl0eSBvZiA1ME1IegorICAgICAgbGlicmFfc2Rpb19zZXRfY2xvY2soc2Rpb19mdW5jX2RldiwgV0xBTl9MT1dfU0RfQ09ORklHX0NMT0NLX0ZSRVEpOworICAgfQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIE1TTV9QTEFURk9STV84NjYwCisgICBpZih2b3NfY2hpcF9wb3dlcl9xcmY4NjE1KENISVBfUE9XRVJfT0ZGKSkKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyNlbmRpZgorCisjaWZkZWYgTVNNX1BMQVRGT1JNXzd4MzAKKy8vLyNpZm5kZWYgVk9TX1BXUl9XSUZJX09OX09GRl9IQUNLCisgICBpZih2b3NfY2hpcF9wb3dlcl9xcmY4NjAwKENISVBfUE9XRVJfT0ZGKSkKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKy8vLyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNU01fUExBVEZPUk1fN3gyN19GRkEKKyAgIGlmKHZvc19jaGlwX3Bvd2VyXzd4Mjdfa2V5cGFkKENISVBfUE9XRVJfT0ZGKSkKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyNlbmRpZgorCisjaWZkZWYgTVNNX1BMQVRGT1JNXzd4MjdBCisgICBpZihjaGlwX3Bvd2VyX3FyZjYyODUoQ0hJUF9QT1dFUl9PRkYpKQorICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworI2VuZGlmCisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICBAYnJpZWYgdm9zX2NoaXBSZXNldCgpIC0gVGhpcyBBUEkgd2lsbCByZXNldCB0aGUgTGlicmEgY2hpcAorCisgIFRoaXMgb3BlcmF0aW9uIG1heSBiZSBhc3luY2hyb25vdXMuIElmIHNvLCB0aGUgc3VwcGxpZWQgY2FsbGJhY2sgd2lsbAorICBiZSBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdC4gVGhlIGNhbGxiYWNrIHdpbGwgCisgIGJlIGNhbGxlZCB3aXRoIHRoZSB1c2VyIHN1cHBsaWVkIGRhdGEuIElmIHRoZSBvcGVyYXRpb24gaXMga25vd24gdG8gYmUgCisgIHN5bmMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IGEgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YS4KKworICBBIGhhcmQgcmVzZXQgd2lsbCBpbnZvbHZlIGEgcG93ZXJEb3duIGZvbGxvd2VkIGJ5IGEgUG93ZXJVcDsgYSBzb2Z0IHJlc2V0CisgIGNhbiBwb3RlbnRpYWxseSBiZSBhY2NvbXBsaXNoZWQgYnkgd3JpdGluZyB0byBzb21lIGRldmljZSByZWdpc3RlcnMKKworICBUaGUgTGlicmEgU0RJTyBjb3JlIHdpbGwgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGlmIHRoZSBvcGVyYXRpb24gY29tcGxldGVzCisgIHN1Y2Nlc3NmdWxseQorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gc29mdCBbaW5dIDogVk9TX1RSVUUgaWYgYSBzb2Z0IHJlc2V0IGlzIGRlc2lyZWQgCisgICAgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UgZm9yIGEgaGFyZCByZXNldCBpLmUuIHBvd2VyRG93biBmb2xsb3dlZCBieSBwb3dlclVwCisgIEBwYXJhbSBjYWxsYmFjayBbaW5dIDogdXNlciBzdXBwbGllZCBjYWxsYmFjayBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlcworICBAcGFyYW0gdXNlcl9kYXRhIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNvbnRleHQgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGgKKworICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX05PU1VQUE9SVCAtIHNvZnQgcmVzZXQgYXNrZWQgZm9yIGJ1dCBub3Qgc3VwcG9ydGVkCisgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHRoZSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYW5kIGEgY2FsbGJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyX2RhdGEgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCAoc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAKKyAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYnV0IGFub3RoZXIgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHN0YXR1cyB3aWxsIGJlIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgIAorICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIG9wZXJhdGlvbiBmYWlsZWQgKHN0YXR1cyB3aWxsIGJlIHNldCBhcHByb3ByaWF0ZWx5KSAgICAgICAKKyAgVk9TX1NUQVRVU19TVUNDRVNTIC0gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIFNZTkMgKHdpbGwgYmUgc2V0KQorICAgICAgICAgICAgICAgICAgICAgICBPUiBvcGVyYXRpb24gc3RhcnRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIEFTWU5DICh3aWxsIGJlIHNldCkKKworKi8KK1ZPU19TVEFUVVMgdm9zX2NoaXBSZXNldAorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2X0JPT0xfdCAgICAgICAgICAgICAgc29mdCwKKyAgdm9zX3Bvd2VyX2NiX3R5cGUgICAgIGNhbGxiYWNrLAorICB2X1BWT0lEX3QgICAgICAgICAgICAgdXNlcl9kYXRhLAorICB2b3NfY2hpcF9yZXNldF9yZWFzb25fdHlwZSAgIHJlYXNvbgorKQoreworICAgVk9TX1NUQVRVUyB2c3RhdHVzOworICAgdnN0YXR1cyA9IHZvc193YXRjaGRvZ19jaGlwX3Jlc2V0KHJlYXNvbik7CisgICByZXR1cm4gdnN0YXR1czsKK30KKworCisvKioKKyAgQGJyaWVmIHZvc19jaGlwVm90ZU9uUEFTdXBwbHkoKSAtIFRoaXMgQVBJIHdpbGwgcG93ZXIgdXAgdGhlIFBBIHN1cHBseQorCisgIFRoaXMgb3BlcmF0aW9uIG1heSBiZSBhc3luY2hyb25vdXMuIElmIHNvLCB0aGUgc3VwcGxpZWQgY2FsbGJhY2sgd2lsbAorICBiZSBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdC4gVGhlIGNhbGxiYWNrIHdpbGwgCisgIGJlIGNhbGxlZCB3aXRoIHRoZSB1c2VyIHN1cHBsaWVkIGRhdGEuIElmIHRoZSBvcGVyYXRpb24gaXMga25vd24gdG8gYmUgCisgIHN5bmMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IGEgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YS4KKworICBAcGFyYW0gc3RhdHVzIFtvdXRdIDogd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIHN5bmMgb3IgYXN5bmMKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfRkFVTFQgLSB0aGUgb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGFuZCBhIGNhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlcl9kYXRhIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgKHN0YXR1cyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgCisgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGJ1dCBhbm90aGVyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHByb2dyZXNzIChzdGF0dXMgd2lsbCBiZSBzZXQgdG8gVk9TX0NBTExfQVNZTkMpICAKKyAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBvcGVyYXRpb24gZmFpbGVkIChzdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSkgICAgICAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwVm90ZU9uUEFTdXBwbHkKKygKKyAgdm9zX2NhbGxfc3RhdHVzX3R5cGUqIHN0YXR1cywKKyAgdm9zX3Bvd2VyX2NiX3R5cGUgICAgIGNhbGxiYWNrLAorICB2X1BWT0lEX3QgICAgICAgICAgICAgdXNlcl9kYXRhCispCit7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qKgorICBAYnJpZWYgdm9zX2NoaXBWb3RlT2ZmUEFTdXBwbHkoKSAtIFRoaXMgQVBJIHdpbGwgdm90ZSB0byB0dXJuIG9mZiB0aGUgCisgIFBBIHN1cHBseS4gRXZlbiBpZiB3ZSBzdWNjZWVkIGluIHZvdGluZywgdGhlcmUgaXMgYSBjaGFuY2UgUEEgc3VwcGx5IHdpbGwgbm90IAorICBiZSB0dXJuZWQgb2ZmLiBUaGlzIHdpbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhIGZhaWx1cmUuCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisKKyAgQHJldHVybiAKKyAgVk9TX1NUQVRVU19FX0lOVkFMIC0gc3RhdHVzIGlzIE5VTEwgCisgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHRoZSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYW5kIGEgY2FsbGJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyX2RhdGEgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCAoc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAKKyAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYnV0IGFub3RoZXIgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHN0YXR1cyB3aWxsIGJlIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgIAorICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIG9wZXJhdGlvbiBmYWlsZWQgKHN0YXR1cyB3aWxsIGJlIHNldCBhcHByb3ByaWF0ZWx5KSBjb3VsZCBiZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSB2b3RpbmcgYWxnb3JpdGhtIGRlY2lkZWQgbm90IHRvIHBvd2VyIGRvd24gUEEgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcFZvdGVPZmZQQVN1cHBseQorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEKKykKK3sKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqCisgIEBicmllZiB2b3NfY2hpcEFzc2VydERlZXBTbGVlcCgpIC0gVGhpcyBBUEkgd2lsbCBhc3NlcnQgdGhlIGRlZXAgCisgIHNsZWVwIHNpZ25hbCB0byBMaWJyYQorCisgIFRoaXMgb3BlcmF0aW9uIG1heSBiZSBhc3luY2hyb25vdXMuIElmIHNvLCB0aGUgc3VwcGxpZWQgY2FsbGJhY2sgd2lsbAorICBiZSBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdC4gVGhlIGNhbGxiYWNrIHdpbGwgCisgIGJlIGNhbGxlZCB3aXRoIHRoZSB1c2VyIHN1cHBsaWVkIGRhdGEuIElmIHRoZSBvcGVyYXRpb24gaXMga25vd24gdG8gYmUgCisgIHN5bmMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IGEgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YS4KKworICBAcGFyYW0gc3RhdHVzIFtvdXRdIDogd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIHN5bmMgb3IgYXN5bmMKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfRkFVTFQgLSB0aGUgb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGFuZCBhIGNhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlcl9kYXRhIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgKHN0YXR1cyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgCisgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGJ1dCBhbm90aGVyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHByb2dyZXNzIChzdGF0dXMgd2lsbCBiZSBzZXQgdG8gVk9TX0NBTExfQVNZTkMpICAKKyAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBvcGVyYXRpb24gZmFpbGVkIChzdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSkgICAgICAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwQXNzZXJ0RGVlcFNsZWVwCisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YQorKQoreworI2lmZGVmIEZJWE1FX1ZPTEFOUworI2lmZGVmIE1TTV9QTEFURk9STV83eDI3X0ZGQQorICAgaW50IHJjID0gbXBwX2NvbmZpZ19kaWdpdGFsX291dChNUFBfNF9DSElQX1BXRF9MLCAKKyAgICAgIE1QUF9DRkcoTVBQX0RMT0dJQ19MVkxfTVNNUCwgTVBQX0RMT0dJQ19PVVRfQ1RSTF9MT1cpKTsKKyAgIGlmIChyYykgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IEZhaWxlZCB0byBwdWxsIGhpZ2ggTVBQXzRfQ0hJUF9QV0RfTCAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisjZW5kaWYKKworI2lmZGVmIE1TTV9QTEFURk9STV83eDMwCisgICAvLyBDb25maWd1cmUgR1BJTyAyMyBmb3IgRGVlcCBTbGVlcAorICAgaW50IHJjID0gcG04eHh4X2dwaW9fY29uZmlnKHdsYW5fZ3Bpb3NfcmVzZXRfb3V0WzBdLmdwaW9fbnVtLCAmd2xhbl9ncGlvc19yZXNldF9vdXRbMF0uZ3Bpb19jZmcpOworICAgaWYgKHJjKSB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogcG1pYyBHUElPICVkIGNvbmZpZyBmYWlsZWQgKCVkKSIsCisgICAgICAgICBfX2Z1bmNfXywgd2xhbl9ncGlvc19yZXNldF9vdXRbMF0uZ3Bpb19udW0sIHJjKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyNlbmRpZgorI2VuZGlmIC8vRklYTUVfVk9MQU5TCisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqCisgIEBicmllZiB2b3NfY2hpcERlQXNzZXJ0RGVlcFNsZWVwKCkgLSBUaGlzIEFQSSB3aWxsIGRlLWFzc2VydCB0aGUgZGVlcCBzbGVlcAorICBzaWduYWwgdG8gTGlicmEKKworICBUaGlzIG9wZXJhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZiBzbywgdGhlIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwKKyAgYmUgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHQuIFRoZSBjYWxsYmFjayB3aWxsIAorICBiZSBjYWxsZWQgd2l0aCB0aGUgdXNlciBzdXBwbGllZCBkYXRhLiBJZiB0aGUgb3BlcmF0aW9uIGlzIGtub3duIHRvIGJlIAorICBzeW5jLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1cHBseSBhIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEuCisKKyAgQHBhcmFtIHN0YXR1cyBbb3V0XSA6IHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gd2lsbCBjb21wbGV0ZSBzeW5jIG9yIGFzeW5jCisgIEBwYXJhbSBjYWxsYmFjayBbaW5dIDogdXNlciBzdXBwbGllZCBjYWxsYmFjayBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlcworICBAcGFyYW0gdXNlcl9kYXRhIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNvbnRleHQgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGgKKworICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpICAgICAgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcERlQXNzZXJ0RGVlcFNsZWVwCisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YQorKQoreworI2lmZGVmIEZJWE1FX1ZPTEFOUworI2lmZGVmIE1TTV9QTEFURk9STV83eDI3X0ZGQQorICAgaW50IHJjID0gbXBwX2NvbmZpZ19kaWdpdGFsX291dChNUFBfNF9DSElQX1BXRF9MLCAKKyAgICAgIE1QUF9DRkcoTVBQX0RMT0dJQ19MVkxfTVNNUCwgTVBQX0RMT0dJQ19PVVRfQ1RSTF9ISUdIKSk7CisgICBpZiAocmMpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBGYWlsZWQgdG8gcHVsbCBoaWdoIE1QUF80X0NISVBfUFdEX0wgKCVkKSIsCisgICAgICAgICBfX2Z1bmNfXywgcmMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisKKyNlbmRpZgorCisjaWZkZWYgTVNNX1BMQVRGT1JNXzd4MzAKKyAgIC8vIENvbmZpZ3VyZSBHUElPIDIzIGZvciBEZWVwIFNsZWVwCisgICBpbnQgcmMgPSBwbTh4eHhfZ3Bpb19jb25maWcod2xhbl9ncGlvc19yZXNldFsyXS5ncGlvX251bSwgJndsYW5fZ3Bpb3NfcmVzZXRbMl0uZ3Bpb19jZmcpOworICAgaWYgKHJjKSB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogcG1pYyBHUElPICVkIGNvbmZpZyBmYWlsZWQgKCVkKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHdsYW5fZ3Bpb3NfcmVzZXRbMl0uZ3Bpb19udW0sIHJjKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyNlbmRpZgorI2VuZGlmIC8vRklYTUVfVk9MQU5TCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAgQGJyaWVmIHZvc19jaGlwRXhpdERlZXBTbGVlcFZSRUdIYW5kbGVyKCkgLSBUaGlzIEFQSSB3aWxsIGluaXRpYWxpemUgdGhlIHJlcXVpcmVkIFZSRUcKKyAgYWZ0ZXIgZXhpdCBmcm9tIGRlZXAgc2xlZXAuCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisKKyAgQHJldHVybiAKKyAgVk9TX1NUQVRVU19FX0lOVkFMIC0gc3RhdHVzIGlzIE5VTEwgCisgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHRoZSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYW5kIGEgY2FsbGJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyX2RhdGEgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCAoc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAKKyAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYnV0IGFub3RoZXIgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHN0YXR1cyB3aWxsIGJlIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgIAorICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIG9wZXJhdGlvbiBmYWlsZWQgKHN0YXR1cyB3aWxsIGJlIHNldCBhcHByb3ByaWF0ZWx5KSAgICAgICAKKyAgVk9TX1NUQVRVU19TVUNDRVNTIC0gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIFNZTkMgKHdpbGwgYmUgc2V0KQorICAgICAgICAgICAgICAgICAgICAgICBPUiBvcGVyYXRpb24gc3RhcnRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIEFTWU5DICh3aWxsIGJlIHNldCkKKworKi8KK1ZPU19TVEFUVVMgdm9zX2NoaXBFeGl0RGVlcFNsZWVwVlJFR0hhbmRsZXIKKygKKyAgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgICB2X1BWT0lEX3QgICAgICAgICAgICAgdXNlcl9kYXRhCispCit7CisjaWZkZWYgRklYTUVfVk9MQU5TCisjaWZkZWYgTVNNX1BMQVRGT1JNXzd4MjdfRkZBCisgICBzdHJ1Y3QgdnJlZyAqdnJlZ193bGFuOworICAgaW50IHJjOworCisgICB2cmVnX3dsYW4gPSB2cmVnX2dldChOVUxMLCAid2xhbiIpOworICAgaWYgKElTX0VSUih2cmVnX3dsYW4pKSB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogd2xhbiB2cmVnIGdldCBmYWlsZWQgKCVsZCkiLAorICAgICAgICAgICAgX19mdW5jX18sIFBUUl9FUlIodnJlZ193bGFuKSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHJjID0gdnJlZ19zZXRfbGV2ZWwodnJlZ193bGFuLCAxODAwKTsKKyAgIGlmIChyYykgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXM6IHdsYW4gdnJlZyBzZXQgbGV2ZWwgZmFpbGVkICglZCkiLAorICAgICAgICAgICAgX19mdW5jX18sIHJjKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgcmMgPSB2cmVnX2VuYWJsZSh2cmVnX3dsYW4pOworICAgaWYgKHJjKSB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogd2xhbiB2cmVnIGVuYWJsZSBmYWlsZWQgKCVkKSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcmMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBtc2xlZXAoNTAwKTsKKworICAgcmMgPSB2cmVnX3NldF9sZXZlbCh2cmVnX3dsYW4sIDI2MDApOworICAgaWYgKHJjKSB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlczogd2xhbiB2cmVnIHNldCBsZXZlbCBmYWlsZWQgKCVkKSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcmMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBtc2xlZXAoNTAwKTsKKworICAgKnN0YXR1cyA9IFZPU19DQUxMX1NZTkM7CisKKyNlbmRpZgorCisjaWZkZWYgTVNNX1BMQVRGT1JNXzd4MzAKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworICAgdm9zX2NhbGxfc3RhdHVzX3R5cGUgY2FsbFR5cGU7CisKKyAgIHZvc1N0YXR1cyA9IHZvc19jaGlwVm90ZU9uQkJBbmFsb2dTdXBwbHkoJmNhbGxUeXBlLCBOVUxMLCBOVUxMKTsKKyAgIFZPU19BU1NFUlQoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyggdm9zU3RhdHVzICkgKTsKKyAgIG1zbGVlcCg1MDApOworCisjZW5kaWYKKyNlbmRpZiAvL0ZJWE1FX1ZPTEFOUworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgIEBicmllZiB2b3NfY2hpcFZvdGVPblJGU3VwcGx5KCkgLSBUaGlzIEFQSSB3aWxsIHBvd2VyIHVwIHRoZSBSRiBzdXBwbHkKKworICBUaGlzIG9wZXJhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZiBzbywgdGhlIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwKKyAgYmUgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHQuIFRoZSBjYWxsYmFjayB3aWxsIAorICBiZSBjYWxsZWQgd2l0aCB0aGUgdXNlciBzdXBwbGllZCBkYXRhLiBJZiB0aGUgb3BlcmF0aW9uIGlzIGtub3duIHRvIGJlIAorICBzeW5jLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1cHBseSBhIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEuCisKKyAgQHBhcmFtIHN0YXR1cyBbb3V0XSA6IHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gd2lsbCBjb21wbGV0ZSBzeW5jIG9yIGFzeW5jCisgIEBwYXJhbSBjYWxsYmFjayBbaW5dIDogdXNlciBzdXBwbGllZCBjYWxsYmFjayBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlcworICBAcGFyYW0gdXNlcl9kYXRhIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNvbnRleHQgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGgKKworICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpICAgICAgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcFZvdGVPblJGU3VwcGx5CisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YQorKQoreworI2lmZGVmIEZJWE1FX1ZPTEFOUworI2lmZGVmIE1TTV9QTEFURk9STV83eDMwCisgICBpbnQgcmM7CisgICBzdHJ1Y3QgdnJlZyAqdnJlZ19zMiA9IE5VTEw7CisgICBzdHJ1Y3QgdnJlZyAqdnJlZ19zNCA9IE5VTEw7CisKKyAgIC8vMS4zdiBSRjsKKyAgIHZyZWdfczIgPSB2cmVnX2dldChOVUxMLCAiczIiKTsKKyAgIGlmIChJU19FUlIodnJlZ19zMikpIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IHMyIHZyZWcgZ2V0IGZhaWxlZCAoJWxkKVxuIiwKKyAgICAgICAgIF9fZnVuY19fLCBQVFJfRVJSKHZyZWdfczIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLy8yLjJ2IFJGCisgICB2cmVnX3M0ID0gdnJlZ19nZXQoTlVMTCwgInM0Iik7CisgICBpZiAoSVNfRVJSKHZyZWdfczQpKSB7CisgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBzNCB2cmVnIGdldCBmYWlsZWQgKCVsZClcbiIsCisgICAgICAgICBfX2Z1bmNfXywgUFRSX0VSUih2cmVnX3M0KSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHJjID0gcG1hcHBfdnJlZ19sZXZlbF92b3RlKGlkLCBQTUFQUF9WUkVHX1MyLCAxMzAwKTsKKyAgIGlmIChyYykgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IHMyIHZyZWcgdm90ZSAiCisgICAgICAgICAgImxldmVsIGZhaWxlZCAoJWQpIixfX2Z1bmNfXywgcmMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICByYyA9IHZyZWdfZW5hYmxlKHZyZWdfczIpOworICAgaWYgKHJjKSB7CisgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBzMiB2cmVnIGVuYWJsZSBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJjKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgcmMgPSBwbWFwcF92cmVnX2xldmVsX3ZvdGUoaWQsIFBNQVBQX1ZSRUdfUzQsIDIyMDApOworICAgaWYgKHJjKSB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogczQgdnJlZyB2b3RlICIKKyAgICAgICAgICAibGV2ZWwgZmFpbGVkICglZCkiLF9fZnVuY19fLCByYyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHJjID0gdnJlZ19lbmFibGUodnJlZ19zNCk7CisgICBpZiAocmMpIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IHM0IHZyZWcgZW5hYmxlIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworCisjZW5kaWYgLy9NU01fUExBVEZPUk1fN3gzMAorI2VuZGlmIC8vRklYTUVfVk9MQU5TCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAgQGJyaWVmIHZvc19jaGlwVm90ZU9mZlJGU3VwcGx5KCkgLSBUaGlzIEFQSSB3aWxsIHZvdGUgdG8gdHVybiBvZmYgdGhlIAorICBSRiBzdXBwbHkuIEV2ZW4gaWYgd2Ugc3VjY2VlZCBpbiB2b3RpbmcsIHRoZXJlIGlzIGEgY2hhbmNlIFJGIHN1cHBseSB3aWxsIG5vdCAKKyAgYmUgdHVybmVkIG9mZiBhcyBSRiByYWlscyBjb3VsZCBiZSBzaGFyZWQgd2l0aCBvdGhlciBtb2R1bGVzIChvdXRzaWRlIFdMQU4pCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisKKyAgQHJldHVybiAKKyAgVk9TX1NUQVRVU19FX0lOVkFMIC0gc3RhdHVzIGlzIE5VTEwgCisgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHRoZSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYW5kIGEgY2FsbGJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyX2RhdGEgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCAoc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAKKyAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYnV0IGFub3RoZXIgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHN0YXR1cyB3aWxsIGJlIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgIAorICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIG9wZXJhdGlvbiBmYWlsZWQgKHN0YXR1cyB3aWxsIGJlIHNldCBhcHByb3ByaWF0ZWx5KSBjb3VsZCBiZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSB2b3RpbmcgYWxnb3JpdGhtIGRlY2lkZWQgbm90IHRvIHBvd2VyIGRvd24gUEEgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcFZvdGVPZmZSRlN1cHBseQorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEKKykKK3sKKyNpZmRlZiBGSVhNRV9WT0xBTlMKKyNpZmRlZiBNU01fUExBVEZPUk1fN3gzMAorCisgICBpbnQgcmM7CisgICBzdHJ1Y3QgdnJlZyAqdnJlZ19zMjsKKyAgIHN0cnVjdCB2cmVnICp2cmVnX3M0OworCisgICAvLzEuM3YgUkYKKyAgIHZyZWdfczIgPSB2cmVnX2dldChOVUxMLCAiczIiKTsKKyAgIGlmIChJU19FUlIodnJlZ19zMikpIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IHMyIHZyZWcgZ2V0IGZhaWxlZCAoJWxkKVxuIiwKKyAgICAgICAgIF9fZnVuY19fLCBQVFJfRVJSKHZyZWdfczIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLy8yLjJ2IFJGCisgICB2cmVnX3M0ID0gdnJlZ19nZXQoTlVMTCwgInM0Iik7CisgICBpZiAoSVNfRVJSKHZyZWdfczQpKSB7CisgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBzNCB2cmVnIGdldCBmYWlsZWQgKCVsZClcbiIsCisgICAgICAgICBfX2Z1bmNfXywgUFRSX0VSUih2cmVnX3M0KSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHJjID0gcG1hcHBfdnJlZ19sZXZlbF92b3RlKGlkLCBQTUFQUF9WUkVHX1MyLCAwKTsKKyAgIGlmIChyYykgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX1dBUk4sICIlczogczIgdnJlZyB2b3RlICIKKyAgICAgICAgICAibGV2ZWwgZmFpbGVkICglZCkiLF9fZnVuY19fLCByYyk7CisgICB9CisKKyAgIHJjID0gdnJlZ19kaXNhYmxlKHZyZWdfczIpOworICAgaWYgKHJjKSB7CisgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBzMiB2cmVnIGRpc2FibGUgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByYyk7CisgICB9CisKKyAgIHJjID0gcG1hcHBfdnJlZ19sZXZlbF92b3RlKGlkLCBQTUFQUF9WUkVHX1M0LCAwKTsKKyAgIGlmIChyYykgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX1dBUk4sICIlczogczQgdnJlZyB2b3RlICIKKyAgICAgICAgICAibGV2ZWwgZmFpbGVkICglZCkiLF9fZnVuY19fLCByYyk7CisgICB9CisKKyAgIHJjID0gdnJlZ19kaXNhYmxlKHZyZWdfczQpOyAKKyAgIGlmIChyYykgeworICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogczQgdnJlZyBkaXNhYmxlIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmMpOworICAgfQorCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworCisjZW5kaWYgLy9NU01fUExBVEZPUk1fN3gzMAorI2VuZGlmIC8vRklYTUVfVk9MQU5TCisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAgQGJyaWVmIHZvc19jaGlwVm90ZU9uQkJBbmFsb2dTdXBwbHkoKSAtIFRoaXMgQVBJIHdpbGwgcG93ZXIgdXAgdGhlIEkvUCB2b2x0YWdlCisgIHVzZWQgYnkgQmFzZSBiYW5kIEFuYWxvZy4KKworICBUaGlzIG9wZXJhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZiBzbywgdGhlIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwKKyAgYmUgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHQuIFRoZSBjYWxsYmFjayB3aWxsIAorICBiZSBjYWxsZWQgd2l0aCB0aGUgdXNlciBzdXBwbGllZCBkYXRhLiBJZiB0aGUgb3BlcmF0aW9uIGlzIGtub3duIHRvIGJlIAorICBzeW5jLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1cHBseSBhIGNhbGxiYWNrIGFuZCB1c2VyIGRhdGEuCisKKyAgQHBhcmFtIHN0YXR1cyBbb3V0XSA6IHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gd2lsbCBjb21wbGV0ZSBzeW5jIG9yIGFzeW5jCisgIEBwYXJhbSBjYWxsYmFjayBbaW5dIDogdXNlciBzdXBwbGllZCBjYWxsYmFjayBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlcworICBAcGFyYW0gdXNlcl9kYXRhIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNvbnRleHQgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGgKKworICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpICAgICAgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcFZvdGVPbkJCQW5hbG9nU3VwcGx5CisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YQorKQoreworI2lmZGVmIEZJWE1FX1ZPTEFOUworI2lmZGVmIE1TTV9QTEFURk9STV83eDMwCisgICBzdHJ1Y3QgdnJlZyAqdnJlZ193bGFuMiA9IE5VTEw7CisgICBpbnQgcmM7CisKKyAgIC8vMi41diBBbmFsb2cgZnJvbSBMRE8xOQorICAgdnJlZ193bGFuMiA9IHZyZWdfZ2V0KE5VTEwsICJ3bGFuMiIpOworICAgaWYgKElTX0VSUih2cmVnX3dsYW4yKSkgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IHdsYW4yIHZyZWcgZ2V0ICIKKyAgICAgICAgICAiZmFpbGVkICglbGQpIiwgX19mdW5jX18sIFBUUl9FUlIodnJlZ193bGFuMikpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICByYyA9IHZyZWdfc2V0X2xldmVsKHZyZWdfd2xhbjIsIDI1MDApOworICAgaWYgKHJjKSB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsICIlczogd2xhbjIgdnJlZyBzZXQgIgorICAgICAgICAgICJsZXZlbCBmYWlsZWQgKCVkKSIsX19mdW5jX18sIHJjKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgcmMgPSB2cmVnX2VuYWJsZSh2cmVnX3dsYW4yKTsKKyAgIGlmIChyYykgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IHdsYW4yIHZyZWcgZW5hYmxlICIKKyAgICAgICAgICAiZmFpbGVkICglZCkiLCBfX2Z1bmNfXywgcmMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorI2VuZGlmCisjZW5kaWYgLy9GSVhNRV9WT0xBTlMKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICBAYnJpZWYgdm9zX2NoaXBWb3RlT2ZmQkJBbmFsb2dTdXBwbHkoKSAtIFRoaXMgQVBJIHdpbGwgdm90ZSBvZmYgdGhlIEJCIEFuYWxvZyBzdXBwbHkuCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisKKyAgQHJldHVybiAKKyAgVk9TX1NUQVRVU19FX0lOVkFMIC0gc3RhdHVzIGlzIE5VTEwgCisgIFZPU19TVEFUVVNfRV9GQVVMVCAtIHRoZSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYW5kIGEgY2FsbGJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VyX2RhdGEgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCAoc3RhdHVzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAKKyAgVk9TX1NUQVRVU19FX0FMUkVBRFkgLSBvcGVyYXRpb24gbmVlZHMgdG8gY29tcGxldGUgYXN5bmMgYnV0IGFub3RoZXIgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHN0YXR1cyB3aWxsIGJlIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgIAorICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIG9wZXJhdGlvbiBmYWlsZWQgKHN0YXR1cyB3aWxsIGJlIHNldCBhcHByb3ByaWF0ZWx5KSBjb3VsZCBiZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSB2b3RpbmcgYWxnb3JpdGhtIGRlY2lkZWQgbm90IHRvIHBvd2VyIGRvd24gUEEgIAorICBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgU1lOQyAod2lsbCBiZSBzZXQpCisgICAgICAgICAgICAgICAgICAgICAgIE9SIG9wZXJhdGlvbiBzdGFydGVkIHN1Y2Nlc3NmdWxseSBpZiBzdGF0dXMgaXMgQVNZTkMgKHdpbGwgYmUgc2V0KQorCisqLworVk9TX1NUQVRVUyB2b3NfY2hpcFZvdGVPZmZCQkFuYWxvZ1N1cHBseQorKAorICB2b3NfY2FsbF9zdGF0dXNfdHlwZSogc3RhdHVzLAorICB2b3NfcG93ZXJfY2JfdHlwZSAgICAgY2FsbGJhY2ssCisgIHZfUFZPSURfdCAgICAgICAgICAgICB1c2VyX2RhdGEKKykKK3sKKyNpZmRlZiBGSVhNRV9WT0xBTlMKKyNpZmRlZiBNU01fUExBVEZPUk1fN3gzMAorICAgc3RydWN0IHZyZWcgKnZyZWdfd2xhbjIgPSBOVUxMOworICAgaW50IHJjOworCisgICAvLzIuNXYgQW5hbG9nIGZyb20gTERPMTkKKyAgIHZyZWdfd2xhbjIgPSB2cmVnX2dldChOVUxMLCAid2xhbjIiKTsKKyAgIGlmIChJU19FUlIodnJlZ193bGFuMikpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiB3bGFuMiB2cmVnIGdldCAiCisgICAgICAgICAgImZhaWxlZCAoJWxkKSIsIF9fZnVuY19fLCBQVFJfRVJSKHZyZWdfd2xhbjIpKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgcmMgPSB2cmVnX2Rpc2FibGUodnJlZ193bGFuMik7CisgICBpZiAocmMpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwgIiVzOiB3bGFuMiB2cmVnIGRpc2FibGUgIgorICAgICAgICAgICJmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCByYyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisjZW5kaWYKKyNlbmRpZiAvL0ZJWE1FX1ZPTEFOUworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgIEBicmllZiB2b3NfY2hpcFZvdGVPblhPQnVmZmVyKCkgLSBUaGlzIEFQSSB3aWxsIHZvdGUgdG8gdHVybiBvbiB0aGUgWE8gYnVmZmVyIGZyb20KKyAgUE1JQy4gVGhpcyBBUEkgd2lsbCBiZSB1c2VkIHdoZW4gTGlicmEgdXNlcyB0aGUgVENYTyBmcm9tIFBNSUMgb24gdGhlIE1TTQorCisgIFRoaXMgb3BlcmF0aW9uIG1heSBiZSBhc3luY2hyb25vdXMuIElmIHNvLCB0aGUgc3VwcGxpZWQgY2FsbGJhY2sgd2lsbAorICBiZSBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdC4gVGhlIGNhbGxiYWNrIHdpbGwgCisgIGJlIGNhbGxlZCB3aXRoIHRoZSB1c2VyIHN1cHBsaWVkIGRhdGEuIElmIHRoZSBvcGVyYXRpb24gaXMga25vd24gdG8gYmUgCisgIHN5bmMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IGEgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YS4KKworICBAcGFyYW0gc3RhdHVzIFtvdXRdIDogd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIHN5bmMgb3IgYXN5bmMKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfRkFVTFQgLSB0aGUgb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGFuZCBhIGNhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlcl9kYXRhIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgKHN0YXR1cyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgCisgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGJ1dCBhbm90aGVyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHByb2dyZXNzIChzdGF0dXMgd2lsbCBiZSBzZXQgdG8gVk9TX0NBTExfQVNZTkMpICAKKyAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBvcGVyYXRpb24gZmFpbGVkIChzdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSkgICAgICAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwVm90ZU9uWE9CdWZmZXIKKygKKyAgdm9zX2NhbGxfc3RhdHVzX3R5cGUqIHN0YXR1cywKKyAgdm9zX3Bvd2VyX2NiX3R5cGUgICAgIGNhbGxiYWNrLAorICB2X1BWT0lEX3QgICAgICAgICAgICAgdXNlcl9kYXRhCispCit7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAgQGJyaWVmIHZvc19jaGlwVm90ZU9mZlhPQnVmZmVyKCkgLSBUaGlzIEFQSSB3aWxsIHZvdGUgb2ZmIFBNSUMgWE8gYnVmZmVyLgorCisgIFRoaXMgb3BlcmF0aW9uIG1heSBiZSBhc3luY2hyb25vdXMuIElmIHNvLCB0aGUgc3VwcGxpZWQgY2FsbGJhY2sgd2lsbAorICBiZSBpbnZva2VkIHdoZW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdC4gVGhlIGNhbGxiYWNrIHdpbGwgCisgIGJlIGNhbGxlZCB3aXRoIHRoZSB1c2VyIHN1cHBsaWVkIGRhdGEuIElmIHRoZSBvcGVyYXRpb24gaXMga25vd24gdG8gYmUgCisgIHN5bmMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IGEgY2FsbGJhY2sgYW5kIHVzZXIgZGF0YS4KKworICBAcGFyYW0gc3RhdHVzIFtvdXRdIDogd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIHN5bmMgb3IgYXN5bmMKKyAgQHBhcmFtIGNhbGxiYWNrIFtpbl0gOiB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGludm9rZWQgd2hlbiBvcGVyYXRpb24gY29tcGxldGVzCisgIEBwYXJhbSB1c2VyX2RhdGEgW2luXSA6IHVzZXIgc3VwcGxpZWQgY29udGV4dCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfRkFVTFQgLSB0aGUgb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGFuZCBhIGNhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlcl9kYXRhIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgKHN0YXR1cyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgCisgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGJ1dCBhbm90aGVyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHByb2dyZXNzIChzdGF0dXMgd2lsbCBiZSBzZXQgdG8gVk9TX0NBTExfQVNZTkMpICAKKyAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBvcGVyYXRpb24gZmFpbGVkIChzdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSkgY291bGQgYmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgdm90aW5nIGFsZ29yaXRobSBkZWNpZGVkIG5vdCB0byBwb3dlciBkb3duIFBBICAKKyAgVk9TX1NUQVRVU19TVUNDRVNTIC0gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIFNZTkMgKHdpbGwgYmUgc2V0KQorICAgICAgICAgICAgICAgICAgICAgICBPUiBvcGVyYXRpb24gc3RhcnRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIEFTWU5DICh3aWxsIGJlIHNldCkKKworKi8KK1ZPU19TVEFUVVMgdm9zX2NoaXBWb3RlT2ZmWE9CdWZmZXIKKygKKyAgdm9zX2NhbGxfc3RhdHVzX3R5cGUqIHN0YXR1cywKKyAgdm9zX3Bvd2VyX2NiX3R5cGUgICAgIGNhbGxiYWNrLAorICB2X1BWT0lEX3QgICAgICAgICAgICAgdXNlcl9kYXRhCispCit7CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAgQGJyaWVmIHZvc19jaGlwVm90ZVhPQ29yZSAtIFRoaXMgQVBJIHdpbGwgdm90ZSBQTUlDIFhPIENvcmUuCisKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisgIEBwYXJhbSBmb3JjZV9lbmFibGUgW2luXSA6IEZvcmNlIGVuYWJsZSBYTyBDT1JFIG9yIG5vdAorCisgIEByZXR1cm4gCisgIFZPU19TVEFUVVNfRV9JTlZBTCAtIHN0YXR1cyBpcyBOVUxMIAorICBWT1NfU1RBVFVTX0VfRkFVTFQgLSB0aGUgb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGFuZCBhIGNhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXNlcl9kYXRhIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgKHN0YXR1cyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBWT1NfQ0FMTF9BU1lOQykgCisgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gb3BlcmF0aW9uIG5lZWRzIHRvIGNvbXBsZXRlIGFzeW5jIGJ1dCBhbm90aGVyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHByb2dyZXNzIChzdGF0dXMgd2lsbCBiZSBzZXQgdG8gVk9TX0NBTExfQVNZTkMpICAKKyAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBvcGVyYXRpb24gZmFpbGVkIChzdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSkgY291bGQgYmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgdm90aW5nIGFsZ29yaXRobSBkZWNpZGVkIG5vdCB0byBwb3dlciBkb3duIFBBICAKKyAgVk9TX1NUQVRVU19TVUNDRVNTIC0gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIFNZTkMgKHdpbGwgYmUgc2V0KQorICAgICAgICAgICAgICAgICAgICAgICBPUiBvcGVyYXRpb24gc3RhcnRlZCBzdWNjZXNzZnVsbHkgaWYgc3RhdHVzIGlzIEFTWU5DICh3aWxsIGJlIHNldCkKKworKi8KK1ZPU19TVEFUVVMgdm9zX2NoaXBWb3RlWE9Db3JlCisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YSwKKyAgdl9CT09MX3QgICAgICAgICAgICAgIGZvcmNlX2VuYWJsZQorKQoreworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyAgICBzdGF0aWMgdl9CT09MX3QgaXNfdm90ZV9vbjsKKworI2lmIGRlZmluZWQoTVNNX1BMQVRGT1JNXzg2NjApIHx8IGRlZmluZWQoTVNNX1BMQVRGT1JNXzd4MzApCisgICAgaW50IHJjOworI2VuZGlmCisKKyAgIC8qIFRoZSBleHBlY3RhdGlvbiBpcyB0aGUgaXNfdm90ZV9vbiBzaG91bGQgYWx3YXlzIGhhdmUgdmFsdWUgMSBvciAwLiAgVGhpcyBmdW5jbiBzaG91bGQKKyAgICAqIGJlIGNhbGxlZCBhbHRlcm5hdGVseSB3aXRoIDEgYW5kIDAgcGFzc2VkIHRvIGl0LgorICAgICovCisgICBpZiAoKGZvcmNlX2VuYWJsZSAmJiBpc192b3RlX29uKSB8fCAoIWZvcmNlX2VuYWJsZSAmJiAhaXNfdm90ZV9vbikpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJGb3JjZSBYTyBDb3JlICVzIGNhbGxlZCB3aGVuIGFscmVhZHkgJXMgLSBkaXJlY3RseSByZXR1cm4gc3VjY2VzcyAlZCIsIAorICAgICAgICAgZm9yY2VfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIsIGlzX3ZvdGVfb24gPyAiZW5hYmxlIiA6ICJkaXNhYmxlIiwgCisgICAgICAgICBpc192b3RlX29uKTsKKyAgICAgIGdvdG8gc3VjY2VzczsKKyAgIH0gICAgCisKKyNpZmRlZiBNU01fUExBVEZPUk1fN3gzMAorICAgcmMgPSBwbWljX3hvX2NvcmVfZm9yY2VfZW5hYmxlKGZvcmNlX2VuYWJsZSk7CisgICBpZiAocmMpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICIlczogcG1pY194b19jb3JlX2ZvcmNlX2VuYWJsZSAlcyBmYWlsZWQgKCVkKSIsX19mdW5jX18sIAorICAgICAgICAgZm9yY2VfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIscmMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorI2VuZGlmCisKKyNpZmRlZiBNU01fUExBVEZPUk1fODY2MAorICAgcmMgPSBxY29td2xhbl9wbWljX3hvX2NvcmVfZm9yY2VfZW5hYmxlKGZvcmNlX2VuYWJsZSk7CisgICBpZiAocmMpIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICIlczogcG1pY194b19jb3JlX2ZvcmNlX2VuYWJsZSAlcyBmYWlsZWQgKCVkKSIsX19mdW5jX18sIAorICAgICAgICAgZm9yY2VfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIscmMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorI2VuZGlmCisgICAgaXNfdm90ZV9vbj1mb3JjZV9lbmFibGU7CisKK3N1Y2Nlc3M6CisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgIlhPIENPUkUgT04gdm90ZSAlcyBzdWNjZXNzZnVsbHkhIiwKKyAgICAgICAgICAgICAgICBmb3JjZV9lbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DICovCisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqCisgIEBicmllZiB2b3NfY2hpcFZvdGVGcmVxRm9yMXAzVlN1cHBseSgpIC0gVGhpcyBBUEkgd2lsbCB2b3RlIGZvciBmcmVxdWVuY3kgZm9yIDEuM1YgUkYgc3VwcGx5LgorICAKKyAgVGhpcyBvcGVyYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cy4gSWYgc28sIHRoZSBzdXBwbGllZCBjYWxsYmFjayB3aWxsCisgIGJlIGludm9rZWQgd2hlbiBvcGVyYXRpb24gaXMgY29tcGxldGUgd2l0aCB0aGUgcmVzdWx0LiBUaGUgY2FsbGJhY2sgd2lsbCAKKyAgYmUgY2FsbGVkIHdpdGggdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4gSWYgdGhlIG9wZXJhdGlvbiBpcyBrbm93biB0byBiZSAKKyAgc3luYywgdGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgYSBjYWxsYmFjayBhbmQgdXNlciBkYXRhLgorCisgIEVWTSBpc3N1ZSBpcyBvYnNlcnZlZCB3aXRoIDEuNk1oeiBmcmVxIGZvciAxLjNWIHN1cHBseSBpbiB3bGFuIHN0YW5kYWxvbmUgY2FzZS4KKyAgRHVyaW5nIGNvbmN1cnJlbnQgb3BlcmF0aW9uIChlLmcuIFdMQU4gYW5kIFdDRE1BKSB0aGlzIGlzc3VlIGlzIG5vdCBvYnNlcnZlZC4gCisgIFRvIHdvcmthcm91bmQsIHdsYW4gd2lsbCB2b3RlIGZvciAzLjJNaHogZHVyaW5nIHN0YXJ0dXAgYW5kIHdpbGwgdm90ZSBmb3IgMS42TWh6CisgIGR1cmluZyBleGl0LgorICAgCisgIEBwYXJhbSBzdGF0dXMgW291dF0gOiB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29tcGxldGUgc3luYyBvciBhc3luYworICBAcGFyYW0gY2FsbGJhY2sgW2luXSA6IHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgaW52b2tlZCB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAgQHBhcmFtIHVzZXJfZGF0YSBbaW5dIDogdXNlciBzdXBwbGllZCBjb250ZXh0IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisgIEBwYXJhbSBmcmVxIFtpbl0gICAgIDogIEZyZXF1ZW5jeSBmb3IgMS4zViBTdXBwbHkgZm9yIHdoaWNoIFdMQU4gZHJpdmVyIG5lZWRzIHRvIHZvdGUgZm9yLgorICBAcmV0dXJuIAorICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBzdGF0dXMgaXMgTlVMTCAKKyAgVk9TX1NUQVRVU19FX0ZBVUxUIC0gdGhlIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBhbmQgYSBjYWxsYmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZXJfZGF0YSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIChzdGF0dXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gVk9TX0NBTExfQVNZTkMpIAorICBWT1NfU1RBVFVTX0VfQUxSRUFEWSAtIG9wZXJhdGlvbiBuZWVkcyB0byBjb21wbGV0ZSBhc3luYyBidXQgYW5vdGhlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAoc3RhdHVzIHdpbGwgYmUgc2V0IHRvIFZPU19DQUxMX0FTWU5DKSAgCisgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gb3BlcmF0aW9uIGZhaWxlZCAoc3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkpIGNvdWxkIGJlIAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhlIHZvdGluZyBhbGdvcml0aG0gZGVjaWRlZCBub3QgdG8gcG93ZXIgZG93biBQQSAgCisgIFZPU19TVEFUVVNfU1VDQ0VTUyAtIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBTWU5DICh3aWxsIGJlIHNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgT1Igb3BlcmF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGlmIHN0YXR1cyBpcyBBU1lOQyAod2lsbCBiZSBzZXQpCisKKyovCitWT1NfU1RBVFVTIHZvc19jaGlwVm90ZUZyZXFGb3IxcDNWU3VwcGx5CisoCisgIHZvc19jYWxsX3N0YXR1c190eXBlKiBzdGF0dXMsCisgIHZvc19wb3dlcl9jYl90eXBlICAgICBjYWxsYmFjaywKKyAgdl9QVk9JRF90ICAgICAgICAgICAgIHVzZXJfZGF0YSwKKyAgdl9VMzJfdCAgICAgICAgICAgICAgIGZyZXEKKykKK3sKKworCisjaWZkZWYgTVNNX1BMQVRGT1JNXzg2NjAKKyAgICBpZihmcmVxID09IFZPU19OVl9GUkVRVUVOQ1lfRk9SXzFfM1ZfU1VQUExZXzNQMk1IKQorICAgICAgICB7CisgICAgICAgICAgICBpZihxY29td2xhbl9mcmVxX2NoYW5nZV8xcDN2X3N1cHBseShSUE1fVlJFR19GUkVRXzNwMjApKQorICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYocWNvbXdsYW5fZnJlcV9jaGFuZ2VfMXAzdl9zdXBwbHkoUlBNX1ZSRUdfRlJFUV8xcDYwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9zcmMvdm9zX3NjaGVkLmMgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19zY2hlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjQzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19zY2hlZC5jCkBAIC0wLDAgKzEsMjA2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEBmaWxlIHZvc19zY2hlZC5jCisgIEBicmllZiBWT1MgU2NoZWR1bGVyIEltcGxlbWVudGF0aW9uCisKKyAgQ29weXJpZ2h0IChjKSAyMDExIFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisgIHdoZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5CisgIC0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPHZvc19tcS5oPgorI2luY2x1ZGUgPHZvc19hcGkuaD4KKyNpbmNsdWRlIDxhbmlHbG9iYWwuaD4KKyNpbmNsdWRlIDxzaXJUeXBlcy5oPgorI2luY2x1ZGUgPGhhbFR5cGVzLmg+CisjaW5jbHVkZSA8bGltQXBpLmg+CisjaW5jbHVkZSA8c21lX0FwaS5oPgorI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlIDx3bGFuX3FjdF9zc2MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHdsYW5fcWN0X3N5cy5oPgorI2luY2x1ZGUgPHdsYW5fcWN0X3RsLmg+CisjaW5jbHVkZSAidm9zX3NjaGVkLmgiCisjaW5jbHVkZSA8d2xhbl9oZGRfcG93ZXIuaD4KKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGEuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfbXNnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSA8bGlicmFfc2Rpb2lmLmg+CisjaW5jbHVkZSA8d2xhbl9zYWxfbWlzYy5oPgorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFZPU19TQ0hFRF9USFJFQURfSEVBUlRfQkVBVCAgICBJTkZJTklURQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERhdGEgZGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgcFZvc1NjaGVkQ29udGV4dCBncFZvc1NjaGVkQ29udGV4dDsKK3N0YXRpYyBwVm9zV2F0Y2hkb2dDb250ZXh0IGdwVm9zV2F0Y2hkb2dDb250ZXh0PU5VTEw7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGb3J3YXJkIGRlY2xhcmF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBWb3NNQ1RocmVhZCh2b2lkICogQXJnKTsKK3N0YXRpYyBpbnQgVm9zV0RUaHJlYWQodm9pZCAqIEFyZyk7CisjaWYgIWRlZmluZWQoQU5JX01BTkZfRElBRykgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisvKiBJbnRlZ3JhdGVkIFNPQyB3aWxsIGhhdmUgc2luZ2xlIEJJTiBmb3IgRlRNIGRyaXZlciBhbmQgUHJvZHVjdGlvbiBEcml2ZXIKKyAqIFNvLCBhbnljYXNlIHRoaXMgbXVzdCBiZSBjb21waWxlZAorICogTm9uZSBpbnRlZ3JhdGVkIFNPQyB3aWxsIGNvbXBpbGUgdGhpcyBwYXJ0IG9ubHkgZm9yIEZUTSBEcml2ZXIgKi8KK3N0YXRpYyBpbnQgVm9zVFhUaHJlYWQodm9pZCAqIEFyZyk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCitzdGF0aWMgaW50IFZvc1JYVGhyZWFkKHZvaWQqIEFyZyk7Cit2b2lkIHZvc19zY2hlZF9mbHVzaF9yeF9tcXMocFZvc1NjaGVkQ29udGV4dCBTY2hlZENvbnRleHQpOworI2VuZGlmCisjZW5kaWYKK2V4dGVybiB2X1ZPSURfdCB2b3NfY29yZV9yZXR1cm5fbXNnKHZfUFZPSURfdCBwVkNvbnRleHQsIHBWb3NNc2dXcmFwcGVyIHBNc2dXcmFwcGVyKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBGdW5jdGlvbiBpbXBsZW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIHZvc19zY2hlZF9vcGVuKCkgLSBpbml0aWFsaXplIHRoZSB2T1NTIFNjaGVkdWxlcgorICBUaGUgXGEgdm9zX3NjaGVkX29wZW4oKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgdk9TUyBTY2hlZHVsZXIKKyAgVXBvbiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uOgorICAgICAtIEFsbCB0aGUgbWVzc2FnZSBxdWV1ZXMgYXJlIGluaXRpYWxpemVkCisgICAgIC0gVGhlIE1haW4gQ29udHJvbGxlciB0aHJlYWQgaXMgY3JlYXRlZCBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBhbmQKKyAgICAgICBkaXNwYXRjaCBtZXNzYWdlcy4KKyAgICAgLSBUaGUgVHggdGhyZWFkIGlzIGNyZWF0ZWQgYW5kIHJlYWR5IHRvIHJlY2VpdmUgYW5kIGRpc3BhdGNoIG1lc3NhZ2VzCisKKyAgXHBhcmFtICBwVm9zQ29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2T1NTIENvbnRleHQKKyAgXHBhcmFtICBwVm9zU2NoZWRDb250ZXh0IC0gcG9pbnRlciB0byBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ1ZmZlciBiaWcKKyAgICAgICAgICBlbm91Z2ggdG8gaG9sZCBhIHNjaGVkdWxlciBjb250ZXh0LgorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIFNjaGVkdWxlciB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZAorICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisgICAgICAgICAgVk9TX1NUQVRVU19FX1JFU09VUkNFUyAtIFN5c3RlbSByZXNvdXJjZXMgKG90aGVyIHRoYW4gbWVtb3J5KQorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZSB0byBpbml0aWxpemUgdGhlIHNjaGVkdWxlcgorICAgICAgICAgIFZPU19TVEFUVVNfRV9OT01FTSAtIGluc3VmZmljaWVudCBtZW1vcnkgZXhpc3RzIHRvIGluaXRpYWxpemUKKyAgICAgICAgICB0aGUgc2NoZWR1bGVyCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gSW52YWxpZCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBzY2hlZHVsZXIgT3BlbgorICAgICAgICAgIGZ1bmN0aW9uCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBGYWlsdXJlIHRvIGluaXRpYWxpemUgdGhlIHNjaGVkdWxlci8KKyAgXHNhIHZvc19zY2hlZF9vcGVuKCkKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTCit2b3Nfc2NoZWRfb3BlbgorKAorICB2X1BWT0lEX3QgICAgICAgIHBWb3NDb250ZXh0LAorICBwVm9zU2NoZWRDb250ZXh0IHBTY2hlZENvbnRleHQsCisgIHZfU0laRV90ICAgICAgICAgU2NoZWRDdHhTaXplCispCit7CisgIFZPU19TVEFUVVMgIHZTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICIlczogT3BlbmluZyB0aGUgVk9TUyBTY2hlZHVsZXIiLF9fZnVuY19fKTsKKyAgLy8gU2FuaXR5IGNoZWNrcworICBpZiAoKHBWb3NDb250ZXh0ID09IE5VTEwpIHx8IChwU2NoZWRDb250ZXh0ID09IE5VTEwpKSB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAiJXM6IE51bGwgcGFyYW1zIGJlaW5nIHBhc3NlZCIsX19mdW5jX18pOworICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKyAgaWYgKHNpemVvZihWb3NTY2hlZENvbnRleHQpICE9IFNjaGVkQ3R4U2l6ZSkKKyAgeworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBJbmNvcnJlY3QgVk9TIFNjaGVkIENvbnRleHQgc2l6ZSBwYXNzZWQiLF9fZnVuY19fKTsKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgfQorICB2b3NfbWVtX3plcm8ocFNjaGVkQ29udGV4dCwgc2l6ZW9mKFZvc1NjaGVkQ29udGV4dCkpOworICBwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQgPSBwVm9zQ29udGV4dDsKKyAgdlN0YXR1cyA9IHZvc19zY2hlZF9pbml0X21xcyhwU2NoZWRDb250ZXh0KTsKKyAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBWT1MgU2NoZWR1bGVyIE1RcyIsX19mdW5jX18pOworICAgICByZXR1cm4gdlN0YXR1czsKKyAgfQorICAvLyBJbml0aWFsaXplIHRoZSBoZWxwZXIgZXZlbnRzIGFuZCBldmVudCBxdWV1ZXMKKyAgaW5pdF9jb21wbGV0aW9uKCZwU2NoZWRDb250ZXh0LT5NY1N0YXJ0RXZlbnQpOworICBpbml0X2NvbXBsZXRpb24oJnBTY2hlZENvbnRleHQtPlR4U3RhcnRFdmVudCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgIGluaXRfY29tcGxldGlvbigmcFNjaGVkQ29udGV4dC0+UnhTdGFydEV2ZW50KTsKKyNlbmRpZgorICBpbml0X2NvbXBsZXRpb24oJnBTY2hlZENvbnRleHQtPk1jU2h1dGRvd24pOworICBpbml0X2NvbXBsZXRpb24oJnBTY2hlZENvbnRleHQtPlR4U2h1dGRvd24pOworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICBpbml0X2NvbXBsZXRpb24oJnBTY2hlZENvbnRleHQtPlJ4U2h1dGRvd24pOworI2VuZGlmCisgIGluaXRfY29tcGxldGlvbigmcFNjaGVkQ29udGV4dC0+UmVzdW1lTWNFdmVudCk7CisgIGluaXRfY29tcGxldGlvbigmcFNjaGVkQ29udGV4dC0+UmVzdW1lVHhFdmVudCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgIGluaXRfY29tcGxldGlvbigmcFNjaGVkQ29udGV4dC0+UmVzdW1lUnhFdmVudCk7CisjZW5kaWYKKworICBzcGluX2xvY2tfaW5pdCgmcFNjaGVkQ29udGV4dC0+TWNUaHJlYWRMb2NrKTsKKyAgc3Bpbl9sb2NrX2luaXQoJnBTY2hlZENvbnRleHQtPlR4VGhyZWFkTG9jayk7CisgIHNwaW5fbG9ja19pbml0KCZwU2NoZWRDb250ZXh0LT5SeFRocmVhZExvY2spOworCisgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnBTY2hlZENvbnRleHQtPm1jV2FpdFF1ZXVlKTsKKyAgcFNjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcgPSAwOworICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZwU2NoZWRDb250ZXh0LT50eFdhaXRRdWV1ZSk7CisgIHBTY2hlZENvbnRleHQtPnR4RXZlbnRGbGFnPSAwOworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZwU2NoZWRDb250ZXh0LT5yeFdhaXRRdWV1ZSk7CisgIHBTY2hlZENvbnRleHQtPnJ4RXZlbnRGbGFnPSAwOworI2VuZGlmCisgIC8qCisgICoqIFRoaXMgaW5pdGlhbGl6YXRpb24gaXMgY3JpdGljYWwgYXMgdGhlIHRocmVhZHMgd2lsbCBsYXR0ZXIgYWNjZXNzIHRoZQorICAqKiBnbG9iYWwgY29udGV4dHMgbm9ybWFsbHksCisgICoqCisgICoqIEkgc2hhbGwgcHV0IHNvbWUgbWVtb3J5IGJhcnJpZXIgaGVyZSBhZnRlciB0aGUgbmV4dCBwaWVjZSBvZiBjb2RlIGJ1dAorICAqKiBJIGFtIGtlZXBpbmcgaXQgc2ltcGxlIGZvciBub3cuCisgICovCisgIGdwVm9zU2NoZWRDb250ZXh0ID0gcFNjaGVkQ29udGV4dDsKKworICAvL0NyZWF0ZSB0aGUgVk9TUyBNYWluIENvbnRyb2xsZXIgdGhyZWFkCisgIHBTY2hlZENvbnRleHQtPk1jVGhyZWFkID0ga3RocmVhZF9jcmVhdGUoVm9zTUNUaHJlYWQsIHBTY2hlZENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZvc01DVGhyZWFkIik7CisgIGlmIChJU19FUlIocFNjaGVkQ29udGV4dC0+TWNUaHJlYWQpKSAKKyAgeworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAiJXM6IENvdWxkIG5vdCBDcmVhdGUgVk9TUyBNYWluIFRocmVhZCBDb250cm9sbGVyIixfX2Z1bmNfXyk7CisgICAgIGdvdG8gTUNfVEhSRUFEX1NUQVJUX0ZBSUxVUkU7CisgIH0KKyAgd2FrZV91cF9wcm9jZXNzKHBTY2hlZENvbnRleHQtPk1jVGhyZWFkKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogVk9TUyBNYWluIENvbnRyb2xsZXIgdGhyZWFkIENyZWF0ZWQiLF9fZnVuY19fKTsKKworI2lmICFkZWZpbmVkKEFOSV9NQU5GX0RJQUcpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DKQorICBwU2NoZWRDb250ZXh0LT5UeFRocmVhZCA9IGt0aHJlYWRfY3JlYXRlKFZvc1RYVGhyZWFkLCBwU2NoZWRDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWb3NUWFRocmVhZCIpOworICBpZiAoSVNfRVJSKHBTY2hlZENvbnRleHQtPlR4VGhyZWFkKSkgCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgIiVzOiBDb3VsZCBub3QgQ3JlYXRlIFZPU1MgVFggVGhyZWFkIixfX2Z1bmNfXyk7CisgICAgIGdvdG8gVFhfVEhSRUFEX1NUQVJUX0ZBSUxVUkU7CisgIH0KKyAgd2FrZV91cF9wcm9jZXNzKHBTY2hlZENvbnRleHQtPlR4VGhyZWFkKTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAoIlZPU1MgVFggdGhyZWFkIENyZWF0ZWRcbiIpKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICBwU2NoZWRDb250ZXh0LT5SeFRocmVhZCA9IGt0aHJlYWRfY3JlYXRlKFZvc1JYVGhyZWFkLCBwU2NoZWRDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWb3NSWFRocmVhZCIpOworICBpZiAoSVNfRVJSKHBTY2hlZENvbnRleHQtPlJ4VGhyZWFkKSkgCisgIHsKKworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAiJXM6IENvdWxkIG5vdCBDcmVhdGUgVk9TUyBSWCBUaHJlYWQiLF9fZnVuY19fKTsKKyAgICAgZ290byBSWF9USFJFQURfU1RBUlRfRkFJTFVSRTsKKworICB9CisgIHdha2VfdXBfcHJvY2VzcyhwU2NoZWRDb250ZXh0LT5SeFRocmVhZCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgKCJWT1NTIFJYIHRocmVhZCBDcmVhdGVkXG4iKSk7CisjZW5kaWYKKyNlbmRpZgorCisgIC8qCisgICoqIE5vdyBtYWtlIHN1cmUgYWxsIHRocmVhZHMgaGF2ZSBzdGFydGVkIGJlZm9yZSB3ZSBleGl0LgorICAqKiBFYWNoIHRocmVhZCBzaG91bGQgbm9ybWFsbHkgQUNLIGJhY2sgd2hlbiBpdCBzdGFydHMuCisgICovCisgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcFNjaGVkQ29udGV4dC0+TWNTdGFydEV2ZW50KTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICIlczogVk9TUyBNQyBUaHJlYWQgaGFzIHN0YXJ0ZWQiLF9fZnVuY19fKTsKKyNpZiAhZGVmaW5lZChBTklfTUFORl9ESUFHKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQykKKyAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZwU2NoZWRDb250ZXh0LT5UeFN0YXJ0RXZlbnQpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgIiVzOiBWT1NTIFR4IFRocmVhZCBoYXMgc3RhcnRlZCIsX19mdW5jX18pOworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnBTY2hlZENvbnRleHQtPlJ4U3RhcnRFdmVudCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiJXM6IFZPU1MgUnggVGhyZWFkIGhhcyBzdGFydGVkIixfX2Z1bmNfXyk7CisjZW5kaWYKKworICAvKgorICAqKiBXZSdyZSBnb29kIG5vdzogTGV0J3MgZ2V0IHRoZSBiYWxsIHJvbGxpbmchISEKKyAgKi8KKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogVk9TUyBTY2hlZHVsZXIgc3VjY2Vzc2Z1bGx5IE9wZW5lZCIsX19mdW5jX18pOworICNlbmRpZgorICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworCisjaWYgIWRlZmluZWQoQU5JX01BTkZfRElBRykgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKK1JYX1RIUkVBRF9TVEFSVF9GQUlMVVJFOgorICAgIC8vVHJ5IGFuZCBmb3JjZSB0aGUgVHggdGhyZWFkIGNvbnRyb2xsZXIgdG8gZXhpdAorICAgIHNldF9iaXQoTUNfU0hVVERPV05fRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPnR4RXZlbnRGbGFnKTsKKyAgICBzZXRfYml0KE1DX1BPU1RfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPnR4RXZlbnRGbGFnKTsKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJnBTY2hlZENvbnRleHQtPnR4V2FpdFF1ZXVlKTsKKyAgICAgLy9XYWl0IGZvciBUWCB0byBleGl0CisgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZwU2NoZWRDb250ZXh0LT5UeFNodXRkb3duKTsKKyNlbmRpZgorCitUWF9USFJFQURfU1RBUlRfRkFJTFVSRToKKyAgICAvL1RyeSBhbmQgZm9yY2UgdGhlIE1haW4gdGhyZWFkIGNvbnRyb2xsZXIgdG8gZXhpdAorICAgIHNldF9iaXQoTUNfU0hVVERPV05fRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnKTsKKyAgICBzZXRfYml0KE1DX1BPU1RfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnKTsKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJnBTY2hlZENvbnRleHQtPm1jV2FpdFF1ZXVlKTsKKyAgICAvL1dhaXQgZm9yIE1DIHRvIGV4aXQKKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnBTY2hlZENvbnRleHQtPk1jU2h1dGRvd24pOworCisjZW5kaWYKK01DX1RIUkVBRF9TVEFSVF9GQUlMVVJFOgorICAvL0RlLWluaXRpYWxpemUgYWxsIHRoZSBtZXNzYWdlIHF1ZXVlcworICB2b3Nfc2NoZWRfZGVpbml0X21xcyhwU2NoZWRDb250ZXh0KTsKKyAgcmV0dXJuIFZPU19TVEFUVVNfRV9SRVNPVVJDRVM7CisKK30gLyogdm9zX3NjaGVkX29wZW4oKSAqLworCitWT1NfU1RBVFVTIHZvc193YXRjaGRvZ19vcGVuCisoCisgIHZfUFZPSURfdCAgICAgICAgICAgcFZvc0NvbnRleHQsCisgIHBWb3NXYXRjaGRvZ0NvbnRleHQgcFdkQ29udGV4dCwKKyAgdl9TSVpFX3QgICAgICAgICAgICB3ZEN0eFNpemUKKykKK3sKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIiVzOiBPcGVuaW5nIHRoZSBWT1NTIFdhdGNoZG9nIG1vZHVsZSIsX19mdW5jX18pOworICAvL1Nhbml0eSBjaGVja3MKKyAgaWYgKChwVm9zQ29udGV4dCA9PSBOVUxMKSB8fCAocFdkQ29udGV4dCA9PSBOVUxMKSkgeworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIiVzOiBOdWxsIHBhcmFtcyBiZWluZyBwYXNzZWQiLF9fZnVuY19fKTsKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisgIGlmIChzaXplb2YoVm9zV2F0Y2hkb2dDb250ZXh0KSAhPSB3ZEN0eFNpemUpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICIlczogSW5jb3JyZWN0IFZPUyBXYXRjaGRvZyBDb250ZXh0IHNpemUgcGFzc2VkIixfX2Z1bmNfXyk7CisgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgIH0KKyAgdm9zX21lbV96ZXJvKHBXZENvbnRleHQsIHNpemVvZihWb3NXYXRjaGRvZ0NvbnRleHQpKTsKKyAgcFdkQ29udGV4dC0+cFZDb250ZXh0ID0gcFZvc0NvbnRleHQ7CisgIGdwVm9zV2F0Y2hkb2dDb250ZXh0ID0gcFdkQ29udGV4dDsKKworICAvL0luaXRpYWxpemUgdGhlIGhlbHBlciBldmVudHMgYW5kIGV2ZW50IHF1ZXVlcworICBpbml0X2NvbXBsZXRpb24oJnBXZENvbnRleHQtPldkU3RhcnRFdmVudCk7CisgIGluaXRfY29tcGxldGlvbigmcFdkQ29udGV4dC0+V2RTaHV0ZG93bik7CisgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnBXZENvbnRleHQtPndkV2FpdFF1ZXVlKTsKKyAgcFdkQ29udGV4dC0+d2RFdmVudEZsYWcgPSAwOworCisgIC8vIEluaXRpYWxpemUgdGhlIGxvY2sKKyAgc3Bpbl9sb2NrX2luaXQoJnBXZENvbnRleHQtPndkTG9jayk7CisKKyAgLy9DcmVhdGUgdGhlIFdhdGNoZG9nIHRocmVhZAorICBwV2RDb250ZXh0LT5XZFRocmVhZCA9IGt0aHJlYWRfY3JlYXRlKFZvc1dEVGhyZWFkLCBwV2RDb250ZXh0LCJWb3NXRFRocmVhZCIpOworICAKKyAgaWYgKElTX0VSUihwV2RDb250ZXh0LT5XZFRocmVhZCkpIAorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICIlczogQ291bGQgbm90IENyZWF0ZSBXYXRjaGRvZyB0aHJlYWQiLF9fZnVuY19fKTsKKyAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9SRVNPVVJDRVM7CisgIH0gIAorICBlbHNlCisgIHsKKyAgICAgd2FrZV91cF9wcm9jZXNzKHBXZENvbnRleHQtPldkVGhyZWFkKTsKKyAgfQorIC8qCisgICoqIE5vdyBtYWtlIHN1cmUgdGhyZWFkIGhhcyBzdGFydGVkIGJlZm9yZSB3ZSBleGl0LgorICAqKiBFYWNoIHRocmVhZCBzaG91bGQgbm9ybWFsbHkgQUNLIGJhY2sgd2hlbiBpdCBzdGFydHMuCisgICovCisgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcFdkQ29udGV4dC0+V2RTdGFydEV2ZW50KTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAgICIlczogVk9TUyBXYXRjaGRvZyBUaHJlYWQgaGFzIHN0YXJ0ZWQiLF9fZnVuY19fKTsKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30gLyogdm9zX3dhdGNoZG9nX29wZW4oKSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIFZvc01jVGhyZWFkKCkgLSBUaGUgVk9TUyBNYWluIENvbnRyb2xsZXIgdGhyZWFkCisgIFRoZSBcYSBWb3NNY1RocmVhZCgpIGlzIHRoZSBWT1NTIG1haW4gY29udHJvbGxlciB0aHJlYWQ6CisgIFxwYXJhbSAgQXJnIC0gcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZPU1MgU2NoZWQgQ29udGV4dAorICBccmV0dXJuIFRocmVhZCBleGl0IGNvZGUKKyAgXHNhIFZvc01jVGhyZWFkKCkKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50CitWb3NNQ1RocmVhZAorKAorICB2b2lkICogQXJnCispCit7CisgIHBWb3NTY2hlZENvbnRleHQgcFNjaGVkQ29udGV4dCA9IChwVm9zU2NoZWRDb250ZXh0KUFyZzsKKyAgcFZvc01zZ1dyYXBwZXIgcE1zZ1dyYXBwZXIgICAgID0gTlVMTDsKKyAgdHBBbmlTaXJHbG9iYWwgcE1hY0NvbnRleHQgICAgID0gTlVMTDsKKyAgdFNpclJldFN0YXR1cyBtYWNTdGF0dXMgICAgICAgID0gZVNJUl9TVUNDRVNTOworICBWT1NfU1RBVFVTIHZTdGF0dXMgICAgICAgICAgICAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgIGludCByZXRXYWl0U3RhdHVzICAgICAgICAgICAgICA9IDA7CisgIHZfQk9PTF90IHNodXRkb3duICAgICAgICAgICAgICA9IFZPU19GQUxTRTsKKyAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCAgICAgICAgID0gTlVMTDsKKyAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgICAgICAgID0gTlVMTDsKKworICBpZiAoQXJnID09IE5VTEwpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiJXM6IEJhZCBBcmdzIHBhc3NlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybiAwOworICB9CisgIHNldF91c2VyX25pY2UoY3VycmVudCwgLTIpOworCisgIGRhZW1vbml6ZSgiTUNfVGhyZWFkIik7CisgIC8qCisgICoqIEFjayBiYWNrIHRvIHRoZSBjb250ZXh0IGZyb20gd2hpY2ggdGhlIG1haW4gY29udHJvbGxlciB0aHJlYWQgaGFzIGJlZW4KKyAgKiogY3JlYXRlZC4KKyAgKi8KKyAgY29tcGxldGUoJnBTY2hlZENvbnRleHQtPk1jU3RhcnRFdmVudCk7CisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgIiVzOiBNQyBUaHJlYWQgJWQgKCVzKSBzdGFydGluZyB1cCIsX19mdW5jX18sIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSk7CisKKyAgLyogR2V0IHRoZSBHbG9iYWwgVk9TUyBDb250ZXh0ICovCisgIHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NZUywgTlVMTCk7CisgIGlmKCFwVm9zQ29udGV4dCkgeworICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogR2xvYmFsIFZPUyBjb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisgICAgIHJldHVybiAwOworICB9CisKKyAgLyogR2V0IHRoZSBIREQgY29udGV4dCAqLworICBwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKil2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQsIHBWb3NDb250ZXh0ICk7CisgIGlmKCFwSGRkQ3R4KSB7CisgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIixfX2Z1bmNfXyk7CisgICAgIHJldHVybiAwOworICB9CisKKyAgd2hpbGUoIXNodXRkb3duKQorICB7CisgICAgLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBleGVjdXRpb24gbW9kZWwgYWxnb3JpdGhtCisgICAgcmV0V2FpdFN0YXR1cyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwU2NoZWRDb250ZXh0LT5tY1dhaXRRdWV1ZSwKKyAgICAgICB0ZXN0X2JpdChNQ19QT1NUX0VWRU5UX01BU0ssICZwU2NoZWRDb250ZXh0LT5tY0V2ZW50RmxhZykgfHwgCisgICAgICAgdGVzdF9iaXQoTUNfU1VTUEVORF9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcpKTsKKworICAgIGlmKHJldFdhaXRTdGF0dXMgPT0gLUVSRVNUQVJUU1lTKQorICAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlIHJldHVybmVkIC1FUkVTVEFSVFNZUyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2xlYXJfYml0KE1DX1BPU1RfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnKTsKKworICAgIHdoaWxlKDEpCisgICAgeworICAgICAgLy8gQ2hlY2sgaWYgTUMgbmVlZHMgdG8gc2h1dGRvd24KKyAgICAgIGlmKHRlc3RfYml0KE1DX1NIVVRET1dOX0VWRU5UX01BU0ssICZwU2NoZWRDb250ZXh0LT5tY0V2ZW50RmxhZykpCisgICAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICIlczogTUMgdGhyZWFkIHNpZ25hbGVkIHRvIHNodXRkb3duIiwgX19mdW5jX18pOworICAgICAgICBzaHV0ZG93biA9IFZPU19UUlVFOworICAgICAgICAvKiBDaGVjayBmb3IgYW55IFN1c3BlbmQgSW5kaWNhdGlvbiAqLworICAgICAgICBpZih0ZXN0X2JpdChNQ19TVVNQRU5EX0VWRU5UX01BU0ssICZwU2NoZWRDb250ZXh0LT5tY0V2ZW50RmxhZykpCisgICAgICAgIHsKKyAgICAgICAgICAgY2xlYXJfYml0KE1DX1NVU1BFTkRfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnKTsKKyAgICAgICAgCisgICAgICAgICAgIC8qIFVuYmxvY2sgYW55b25lIHdhaXRpbmcgb24gc3VzcGVuZCAqLworICAgICAgICAgICBjb21wbGV0ZSgmcEhkZEN0eC0+bWNfc3VzX2V2ZW50X3Zhcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgICAvKgorICAgICAgKiogQ2hlY2sgdGhlIFdESSBxdWV1ZQorICAgICAgKiogU2VydmljZSBpdCB0aWxsIHRoZSBlbnRpcmUgcXVldWUgaXMgZW1wdHkKKyAgICAgICovCisgICAgICBpZiAoIXZvc19pc19tcV9lbXB0eSgmcFNjaGVkQ29udGV4dC0+d2RpTWNNcSkpCisgICAgICB7CisgICAgICAgIHdwdF9tc2cgKnBXZGlNc2c7CisgICAgICAgIC8qCisgICAgICAgICoqIFNlcnZpY2UgdGhlIFdESSBtZXNzYWdlIHF1ZXVlCisgICAgICAgICovCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dESSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAoIlNlcnZpY2luZyB0aGUgVk9TIE1DIFdESSBNZXNzYWdlIHF1ZXVlIikpOworCisgICAgICAgIHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmcFNjaGVkQ29udGV4dC0+d2RpTWNNcSk7CisgICAgICAgIFZPU19BU1NFUlQoTlVMTCAhPSBwTXNnV3JhcHBlcik7CisKKyAgICAgICAgcFdkaU1zZyA9ICh3cHRfbXNnICopcE1zZ1dyYXBwZXItPnBWb3NNc2ctPmJvZHlwdHI7CisgICAgICAgIFZPU19BU1NFUlQocFdkaU1zZy0+Y2FsbGJhY2spOworCisgICAgICAgIHBXZGlNc2ctPmNhbGxiYWNrKHBXZGlNc2cpOworCisgICAgICAgIC8qIAorICAgICAgICAqKiByZXR1cm4gbWVzc2FnZSB0byB0aGUgQ29yZQorICAgICAgICAqLworICAgICAgICB2b3NfY29yZV9yZXR1cm5fbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXIpOworCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisjZW5kaWYKKyAgICAgIC8vIENoZWNrIHRoZSBTWVMgcXVldWUgZmlyc3QKKyAgICAgIGlmICghdm9zX2lzX21xX2VtcHR5KCZwU2NoZWRDb250ZXh0LT5zeXNNY01xKSkKKyAgICAgIHsKKyAgICAgICAgLy8gU2VydmljZSB0aGUgU1lTIG1lc3NhZ2UgcXVldWUKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAiJXM6IFNlcnZpY2luZyB0aGUgVk9TIFNZUyBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgICAgICAgIHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmcFNjaGVkQ29udGV4dC0+c3lzTWNNcSk7CisgICAgICAgIGlmIChwTXNnV3JhcHBlciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBwTXNnV3JhcHBlciBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdlN0YXR1cyA9IHN5c01jUHJvY2Vzc01zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsCisgICAgICAgICAgIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKyAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICIlczogSXNzdWUgUHJvY2Vzc2luZyBTWVMgbWVzc2FnZSIsX19mdW5jX18pOworICAgICAgICB9CisgICAgICAgIC8vcmV0dXJuIG1lc3NhZ2UgdG8gdGhlIENvcmUKKyAgICAgICAgdm9zX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgICAvLyBDaGVjayB0aGUgV0RBIHF1ZXVlCisgICAgICBpZiAoIXZvc19pc19tcV9lbXB0eSgmcFNjaGVkQ29udGV4dC0+d2RhTWNNcSkpCisgICAgICB7CisgICAgICAgIC8vIFNlcnZpY2UgdGhlIFdEQSBtZXNzYWdlIHF1ZXVlCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiJXM6IFNlcnZpY2luZyB0aGUgVk9TIFdEQSBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgICAgICAgIHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmcFNjaGVkQ29udGV4dC0+d2RhTWNNcSk7CisgICAgICAgIGlmIChwTXNnV3JhcHBlciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBwTXNnV3JhcHBlciBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdlN0YXR1cyA9IFdEQV9NY1Byb2Nlc3NNc2coIHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBJc3N1ZSBQcm9jZXNzaW5nIFdEQSBtZXNzYWdlIixfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmV0dXJuIG1lc3NhZ2UgdG8gdGhlIENvcmUKKyAgICAgICAgdm9zX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisjZWxzZQorCisgICAgICAvLyBDaGVjayB0aGUgSEFMIHF1ZXVlCisgICAgICBpZiAoIXZvc19pc19tcV9lbXB0eSgmcFNjaGVkQ29udGV4dC0+aGFsTWNNcSkpCisgICAgICB7CisgICAgICAgIC8qIE5lZWQgc29tZSBvcHRpbWl6YXRpb24qLworICAgICAgICBwTWFjQ29udGV4dCA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX0hBTCwgcFNjaGVkQ29udGV4dC0+cFZDb250ZXh0KTsKKworICAgICAgICBpZihwTWFjQ29udGV4dCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgIiVzOiBwTWFjQ29udGV4dCBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXJ2aWNlIHRoZSBIQUwgbWVzc2FnZSBxdWV1ZQorICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIiVzOiBTZXJ2aWNpbmcgdGhlIFZPUyBIQUwgTUMgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICAgICAgICBwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPmhhbE1jTXEpOworICAgICAgICBpZiAocE1zZ1dyYXBwZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcE1zZ1dyYXBwZXIgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWFjU3RhdHVzID0gaGFsUHJvY2Vzc01zZyggcE1hY0NvbnRleHQsICh0U2lyTXNnUSopcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworICAgICAgICBpZiAoZVNJUl9TVUNDRVNTICE9IG1hY1N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBJc3N1ZSBQcm9jZXNzaW5nIEhBTCBtZXNzYWdlIixfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmV0dXJuIG1lc3NhZ2UgdG8gdGhlIENvcmUKKyAgICAgICAgdm9zX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisjZW5kaWYKKyNpZiAhZGVmaW5lZChBTklfTUFORl9ESUFHKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQykKKyAgICAgIC8vIENoZWNrIHRoZSBQRSBxdWV1ZQorICAgICAgaWYgKCF2b3NfaXNfbXFfZW1wdHkoJnBTY2hlZENvbnRleHQtPnBlTWNNcSkpCisgICAgICB7CisgICAgICAgIC8vIFNlcnZpY2UgdGhlIFBFIG1lc3NhZ2UgcXVldWUKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAiJXM6IFNlcnZpY2luZyB0aGUgVk9TIFBFIE1DIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgICAgICAgcE1zZ1dyYXBwZXIgPSB2b3NfbXFfZ2V0KCZwU2NoZWRDb250ZXh0LT5wZU1jTXEpOworICAgICAgICBpZiAoTlVMTCA9PSBwTXNnV3JhcHBlcikKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcE1zZ1dyYXBwZXIgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogTmVlZCBzb21lIG9wdGltaXphdGlvbiovCisgICAgICAgIHBNYWNDb250ZXh0ID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsIHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCk7CisgICAgICAgIGlmIChOVUxMID09IHBNYWNDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgIk1BQyBDb250ZXh0IG5vdCByZWFkeSB5ZXQiKTsKKyAgICAgICAgICAgdm9zX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKyAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBtYWNTdGF0dXMgPSBwZVByb2Nlc3NNZXNzYWdlcyggcE1hY0NvbnRleHQsICh0U2lyTXNnUSopcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworICAgICAgICBpZiAoZVNJUl9TVUNDRVNTICE9IG1hY1N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiJXM6IElzc3VlIFByb2Nlc3NpbmcgUEUgbWVzc2FnZSIsX19mdW5jX18pOworICAgICAgICB9CisgICAgICAgIC8vIHJldHVybiBtZXNzYWdlIHRvIHRoZSBDb3JlCisgICAgICAgIHZvc19jb3JlX3JldHVybl9tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlcik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLyoqIENoZWNrIHRoZSBTTUUgcXVldWUgKiovCisgICAgICBpZiAoIXZvc19pc19tcV9lbXB0eSgmcFNjaGVkQ29udGV4dC0+c21lTWNNcSkpCisgICAgICB7CisgICAgICAgIC8qIFNlcnZpY2UgdGhlIFNNRSBtZXNzYWdlIHF1ZXVlICovCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgIiVzOiBTZXJ2aWNpbmcgdGhlIFZPUyBTTUUgTUMgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICAgICAgICBwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnNtZU1jTXEpOworICAgICAgICBpZiAoTlVMTCA9PSBwTXNnV3JhcHBlcikKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IHBNc2dXcmFwcGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5lZWQgc29tZSBvcHRpbWl6YXRpb24qLworICAgICAgICBwTWFjQ29udGV4dCA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgcFNjaGVkQ29udGV4dC0+cFZDb250ZXh0KTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcE1hY0NvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAiTUFDIENvbnRleHQgbm90IHJlYWR5IHlldCIpOworICAgICAgICAgICB2b3NfY29yZV9yZXR1cm5fbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXIpOworICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZTdGF0dXMgPSBzbWVfUHJvY2Vzc01zZyggKHRIYWxIYW5kbGUpcE1hY0NvbnRleHQsIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKyAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBJc3N1ZSBQcm9jZXNzaW5nIFNNRSBtZXNzYWdlIixfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmV0dXJuIG1lc3NhZ2UgdG8gdGhlIENvcmUKKyAgICAgICAgdm9zX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvKiogQ2hlY2sgdGhlIFRMIHF1ZXVlICoqLworICAgICAgaWYgKCF2b3NfaXNfbXFfZW1wdHkoJnBTY2hlZENvbnRleHQtPnRsTWNNcSkpCisgICAgICB7CisgICAgICAgIC8vIFNlcnZpY2UgdGhlIFRMIG1lc3NhZ2UgcXVldWUKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAoIlNlcnZpY2luZyB0aGUgVk9TIFRMIE1DIE1lc3NhZ2UgcXVldWUiKSk7CisgICAgICAgIHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmcFNjaGVkQ29udGV4dC0+dGxNY01xKTsKKyAgICAgICAgaWYgKHBNc2dXcmFwcGVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IHBNc2dXcmFwcGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2U3RhdHVzID0gV0xBTlRMX01jUHJvY2Vzc01zZyggcFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LAorICAgICAgICAgICAgcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiJXM6IElzc3VlIFByb2Nlc3NpbmcgVEwgbWVzc2FnZSIsX19mdW5jX18pOworICAgICAgICB9CisgICAgICAgIC8vIHJldHVybiBtZXNzYWdlIHRvIHRoZSBDb3JlCisgICAgICAgIHZvc19jb3JlX3JldHVybl9tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlcik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLyogQ2hlY2sgZm9yIGFueSBTdXNwZW5kIEluZGljYXRpb24gKi8KKyAgICAgIGlmKHRlc3RfYml0KE1DX1NVU1BFTkRfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnKSkKKyAgICAgIHsKKyAgICAgICAgY2xlYXJfYml0KE1DX1NVU1BFTkRfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPm1jRXZlbnRGbGFnKTsKKyAgICAgICAgc3Bpbl9sb2NrKCZwU2NoZWRDb250ZXh0LT5NY1RocmVhZExvY2spOworCisgICAgICAgIC8qIE1jIFRocmVhZCBTdXNwZW5kZWQgKi8KKyAgICAgICAgY29tcGxldGUoJnBIZGRDdHgtPm1jX3N1c19ldmVudF92YXIpOworCisgICAgICAgIElOSVRfQ09NUExFVElPTihwU2NoZWRDb250ZXh0LT5SZXN1bWVNY0V2ZW50KTsKKyAgICAgICAgc3Bpbl91bmxvY2soJnBTY2hlZENvbnRleHQtPk1jVGhyZWFkTG9jayk7CisKKyAgICAgICAgLyogV2FpdCBmb2UgUmVzdW1lIEluZGljYXRpb24gKi8KKyAgICAgICAgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZwU2NoZWRDb250ZXh0LT5SZXN1bWVNY0V2ZW50KTsKKyAgICAgIH0KKyNlbmRpZiAvKiBBTklfTUFORl9ESUFHICovCisgICAgICBicmVhazsgLy9BbGwgcXVldWVzIGFyZSBlbXB0eSBub3cKKyAgICB9IC8vIHdoaWxlIG1lc3NhZ2UgbG9vcCBwcm9jZXNzaW5nCisgIH0gLy8gd2hpbGUgVFJVRQorICAvLyBJZiB3ZSBnZXQgaGVyZSB0aGUgTUMgdGhyZWFkIG11c3QgZXhpdAorICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAiJXM6IE1DIFRocmVhZCBleGl0aW5nISEhISIsIF9fRlVOQ1RJT05fXyk7CisgIGNvbXBsZXRlX2FuZF9leGl0KCZwU2NoZWRDb250ZXh0LT5NY1NodXRkb3duLCAwKTsKK30gLyogVm9zTUNUaHJlYWQoKSAqLworaW50IGlzV0RyZXNldEluUHJvZ3Jlc3Modm9pZCkKK3sKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICIlczogUmVzZXQgaXMgaW4gUHJvZ3Jlc3MuLi4iLF9fZnVuY19fKTsKKyNpZiAhZGVmaW5lZChBTklfTUFORl9ESUFHKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQykKKyAgIGlmKGdwVm9zV2F0Y2hkb2dDb250ZXh0IT1OVUxMKQorICAgeworICAgICAgcmV0dXJuIGdwVm9zV2F0Y2hkb2dDb250ZXh0LT5yZXNldEluUHJvZ3Jlc3M7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyNlbHNlCisgICByZXR1cm4gMDsKKyNlbmRpZgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgXGJyaWVmIFZvc1dkVGhyZWFkKCkgLSBUaGUgVk9TUyBXYXRjaGRvZyB0aHJlYWQKKyAgVGhlIFxhIFZvc1dkVGhyZWFkKCkgaXMgdGhlIFdhdGNoZG9nIHRocmVhZDoKKyAgXHBhcmFtICBBcmcgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdk9TUyBTY2hlZCBDb250ZXh0CisgIFxyZXR1cm4gVGhyZWFkIGV4aXQgY29kZQorICBcc2EgVm9zTWNUaHJlYWQoKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQKK1Zvc1dEVGhyZWFkCisoCisgIHZvaWQgKiBBcmcKKykKK3sKKyAgcFZvc1dhdGNoZG9nQ29udGV4dCBwV2RDb250ZXh0ID0gKHBWb3NXYXRjaGRvZ0NvbnRleHQpQXJnOworICBpbnQgcmV0V2FpdFN0YXR1cyAgICAgICAgICAgICAgPSAwOworICB2X0JPT0xfdCBzaHV0ZG93biAgICAgICAgICAgICAgPSBWT1NfRkFMU0U7CisgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICBzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0zKTsKKworICBpZiAoQXJnID09IE5VTEwpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiJXM6IEJhZCBBcmdzIHBhc3NlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybiAwOworICB9CisgIGRhZW1vbml6ZSgiV0RfVGhyZWFkIik7CisgIC8qCisgICoqIEFjayBiYWNrIHRvIHRoZSBjb250ZXh0IGZyb20gd2hpY2ggdGhlIFdhdGNoZG9nIHRocmVhZCBoYXMgYmVlbgorICAqKiBjcmVhdGVkLgorICAqLworICBjb21wbGV0ZSgmcFdkQ29udGV4dC0+V2RTdGFydEV2ZW50KTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAiJXM6IFdhdGNoZG9nIFRocmVhZCAlZCAoJXMpIHN0YXJ0aW5nIHVwIixfX2Z1bmNfXywgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tKTsKKworICB3aGlsZSghc2h1dGRvd24pCisgIHsKKyAgICAvLyBUaGlzIGltcGxlbWVudHMgdGhlIFdhdGNoZG9nIGV4ZWN1dGlvbiBtb2RlbCBhbGdvcml0aG0KKyAgICByZXRXYWl0U3RhdHVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBXZENvbnRleHQtPndkV2FpdFF1ZXVlLAorICAgICAgIHRlc3RfYml0KFdEX1BPU1RfRVZFTlRfTUFTSywgJnBXZENvbnRleHQtPndkRXZlbnRGbGFnKSk7CisgICAgaWYocmV0V2FpdFN0YXR1cyA9PSAtRVJFU1RBUlRTWVMpCisgICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgIiVzOiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUgcmV0dXJuZWQgLUVSRVNUQVJUU1lTIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjbGVhcl9iaXQoV0RfUE9TVF9FVkVOVF9NQVNLLCAmcFdkQ29udGV4dC0+d2RFdmVudEZsYWcpOworICAgIHdoaWxlKDEpCisgICAgeworICAgICAgLy8gQ2hlY2sgaWYgV2F0Y2hkb2cgbmVlZHMgdG8gc2h1dGRvd24KKyAgICAgIGlmKHRlc3RfYml0KFdEX1NIVVRET1dOX0VWRU5UX01BU0ssICZwV2RDb250ZXh0LT53ZEV2ZW50RmxhZykpCisgICAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICIlczogV2F0Y2hkb2cgdGhyZWFkIHNpZ25hbGVkIHRvIHNodXRkb3duIiwgX19mdW5jX18pOworCisgICAgICAgIGNsZWFyX2JpdChXRF9TSFVURE9XTl9FVkVOVF9NQVNLLCAmcFdkQ29udGV4dC0+d2RFdmVudEZsYWcpOworICAgICAgICBzaHV0ZG93biA9IFZPU19UUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIHN1YnN5c3RlbSByZXN0YXJ0OiBzaHV0ZG93biBldmVudCBoYW5kbGVyICovCisgICAgICBlbHNlIGlmKHRlc3RfYml0KFdEX1dMQU5fU0hVVERPV05fRVZFTlRfTUFTSywgJnBXZENvbnRleHQtPndkRXZlbnRGbGFnKSkKKyAgICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICIlczogV2F0Y2hkb2cgdGhyZWFkIHNpZ25hbGVkIHRvIHBlcmZvcm0gV0xBTiBzaHV0ZG93biIsX19mdW5jX18pOworICAgICAgICBjbGVhcl9iaXQoV0RfV0xBTl9TSFVURE9XTl9FVkVOVF9NQVNLLCAmcFdkQ29udGV4dC0+d2RFdmVudEZsYWcpOworCisgICAgICAgIC8vUGVyZm9ybSBXTEFOIHNodXRkb3duCisgICAgICAgIGlmKCFwV2RDb250ZXh0LT5yZXNldEluUHJvZ3Jlc3MpCisgICAgICAgIHsKKyAgICAgICAgICBwV2RDb250ZXh0LT5yZXNldEluUHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgIHZvc1N0YXR1cyA9IGhkZF93bGFuX3NodXRkb3duKCk7CisKKyAgICAgICAgICBpZiAoISBWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gc2h1dGRvd24gV0xBTiIsX19mdW5jX18pOworICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICAgZ290byBlcnJfcmVzZXQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBzdWJzeXN0ZW0gcmVzdGFydDogcmUtaW5pdCBldmVudCBoYW5kbGVyICovCisgICAgICBlbHNlIGlmKHRlc3RfYml0KFdEX1dMQU5fUkVJTklUX0VWRU5UX01BU0ssICZwV2RDb250ZXh0LT53ZEV2ZW50RmxhZykpCisgICAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiJXM6IFdhdGNoZG9nIHRocmVhZCBzaWduYWxlZCB0byBwZXJmb3JtIFdMQU4gcmUtaW5pdCIsX19mdW5jX18pOworICAgICAgICBjbGVhcl9iaXQoV0RfV0xBTl9SRUlOSVRfRVZFTlRfTUFTSywgJnBXZENvbnRleHQtPndkRXZlbnRGbGFnKTsKKworICAgICAgICAvL1BlcmZvcm0gV0xBTiByZS1pbml0CisgICAgICAgIGlmKCFwV2RDb250ZXh0LT5yZXNldEluUHJvZ3Jlc3MpCisgICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgIiVzOiBUcnlpbmcgdG8gZG8gV0xBTiByZS1pbml0IHdoZW4gaXQgaXMgbm90IHNodXRkb3duICEhIixfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgdm9zU3RhdHVzID0gaGRkX3dsYW5fcmVfaW5pdCgpOworCisgICAgICAgIGlmICghIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gcmUtaW5pdCBXTEFOIixfX2Z1bmNfXyk7CisgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICBnb3RvIGVycl9yZXNldDsKKyAgICAgICAgfQorICAgICAgICBwV2RDb250ZXh0LT5yZXNldEluUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy9Vbm5lY2Vzc2FyeSB3YWtldXAgLSBTaG91bGQgbmV2ZXIgaGFwcGVuISEKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAiJXM6IFdhdGNoZG9nIHRocmVhZCB3b2tlIHVwIHVubmVjZXNzYXJpbHkiLF9fZnVuY19fKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0gLy8gd2hpbGUgbWVzc2FnZSBsb29wIHByb2Nlc3NpbmcKKyAgfSAvLyB3aGlsZSBzaHV0ZG93bgorCisgIC8vIElmIHdlIGdldCBoZXJlIHRoZSBXYXRjaGRvZyB0aHJlYWQgbXVzdCBleGl0CisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICIlczogV2F0Y2hkb2cgVGhyZWFkIGV4aXRpbmcgISEhISIsIF9fRlVOQ1RJT05fXyk7CisgIGNvbXBsZXRlX2FuZF9leGl0KCZwV2RDb250ZXh0LT5XZFNodXRkb3duLCAwKTsKKworZXJyX3Jlc2V0OgorICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAiJXM6IFdhdGNoZG9nIFRocmVhZCBGYWlsZWQgdG8gUmVzZXQsIEV4aXRpbmchISEhIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gMDsKKworfSAvKiBWb3NNQ1RocmVhZCgpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiBWb3NUWFRocmVhZCgpIC0gVGhlIFZPU1MgTWFpbiBUeCB0aHJlYWQKKyAgVGhlIFxhIFZvc1R4VGhyZWFkKCkgaXMgdGhlIFZPU1MgbWFpbiBjb250cm9sbGVyIHRocmVhZDoKKyAgXHBhcmFtICBBcmcgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdk9TUyBTY2hlZCBDb250ZXh0CisKKyAgXHJldHVybiBUaHJlYWQgZXhpdCBjb2RlCisgIFxzYSBWb3NUeFRocmVhZCgpCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmICFkZWZpbmVkKEFOSV9NQU5GX0RJQUcpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DKQorc3RhdGljIGludCBWb3NUWFRocmVhZCAoIHZvaWQgKiBBcmcgKQoreworICBwVm9zU2NoZWRDb250ZXh0IHBTY2hlZENvbnRleHQgPSAocFZvc1NjaGVkQ29udGV4dClBcmc7CisgIHBWb3NNc2dXcmFwcGVyICAgcE1zZ1dyYXBwZXIgICA9IE5VTEw7CisgIFZPU19TVEFUVVMgICAgICAgdlN0YXR1cyAgICAgICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgaW50ICAgICAgICAgICAgICByZXRXYWl0U3RhdHVzID0gMDsKKyAgdl9CT09MX3Qgc2h1dGRvd24gPSBWT1NfRkFMU0U7CisgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggICAgICAgICA9IE5VTEw7CisgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ICAgICAgICA9IE5VTEw7CisKKyAgc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMSk7CisKKyAgaWYgKEFyZyA9PSBOVUxMKQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlcyBCYWQgQXJncyBwYXNzZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gMDsKKyAgfQorICBkYWVtb25pemUoIlRYX1RocmVhZCIpOworICAvKgorICAqKiBBY2sgYmFjayB0byB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRoZSBtYWluIGNvbnRyb2xsZXIgdGhyZWFkIGhhcyBiZWVuCisgICoqIGNyZWF0ZWQuCisgICovCisgIGNvbXBsZXRlKCZwU2NoZWRDb250ZXh0LT5UeFN0YXJ0RXZlbnQpOworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICIlczogVFggVGhyZWFkICVkICglcykgc3RhcnRpbmcgdXAhIixfX2Z1bmNfXywgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tKTsKKworICAvKiBHZXQgdGhlIEdsb2JhbCBWT1NTIENvbnRleHQgKi8KKyAgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfU1lTLCBOVUxMKTsKKyAgaWYoIXBWb3NDb250ZXh0KSB7CisgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBHbG9iYWwgVk9TIGNvbnRleHQgaXMgTnVsbCIsIF9fZnVuY19fKTsKKyAgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBHZXQgdGhlIEhERCBjb250ZXh0ICovCisgIHBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKXZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX0hERCwgcFZvc0NvbnRleHQgKTsKKyAgaWYoIXBIZGRDdHgpIHsKKyAgICAgaGRkTG9nKFZPU19UUkFDRV9MRVZFTF9GQVRBTCwiJXM6IEhERCBjb250ZXh0IGlzIE51bGwiLF9fZnVuY19fKTsKKyAgICAgcmV0dXJuIDA7CisgIH0KKworCisgIHdoaWxlKCFzaHV0ZG93bikKKyAgeworICAgIC8vIFRoaXMgaW1wbGVtZW50cyB0aGUgZXhlY3V0aW9uIG1vZGVsIGFsZ29yaXRobQorICAgIHJldFdhaXRTdGF0dXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocFNjaGVkQ29udGV4dC0+dHhXYWl0UXVldWUsCisgICAgICAgIHRlc3RfYml0KFRYX1BPU1RfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPnR4RXZlbnRGbGFnKSB8fCAKKyAgICAgICAgdGVzdF9iaXQoVFhfU1VTUEVORF9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+dHhFdmVudEZsYWcpKTsKKworCisgICAgaWYocmV0V2FpdFN0YXR1cyA9PSAtRVJFU1RBUlRTWVMpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICIlczogd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlIHJldHVybmVkIC1FUkVTVEFSVFNZUyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjbGVhcl9iaXQoVFhfUE9TVF9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+dHhFdmVudEZsYWcpOworCisgICAgd2hpbGUoMSkKKyAgICB7CisgICAgICBpZih0ZXN0X2JpdChUWF9TSFVURE9XTl9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+dHhFdmVudEZsYWcpKQorICAgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIiVzOiBUWCB0aHJlYWQgc2lnbmFsZWQgdG8gc2h1dGRvd24iLCBfX2Z1bmNfXyk7CisgICAgICAgIHNodXRkb3duID0gVk9TX1RSVUU7CisgICAgICAgIC8qIENoZWNrIGZvciBhbnkgU3VzcGVuZCBJbmRpY2F0aW9uICovCisgICAgICAgIGlmKHRlc3RfYml0KFRYX1NVU1BFTkRfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPnR4RXZlbnRGbGFnKSkKKyAgICAgICAgeworICAgICAgICAgICBjbGVhcl9iaXQoVFhfU1VTUEVORF9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+dHhFdmVudEZsYWcpOworICAgICAgICAKKyAgICAgICAgICAgLyogVW5ibG9jayBhbnlvbmUgd2FpdGluZyBvbiBzdXNwZW5kICovCisgICAgICAgICAgIGNvbXBsZXRlKCZwSGRkQ3R4LT50eF9zdXNfZXZlbnRfdmFyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIENoZWNrIHRoZSBTWVMgcXVldWUgZmlyc3QKKyAgICAgIGlmICghdm9zX2lzX21xX2VtcHR5KCZwU2NoZWRDb250ZXh0LT5zeXNUeE1xKSkKKyAgICAgIHsKKyAgICAgICAgLy8gU2VydmljZSB0aGUgU1lTIG1lc3NhZ2UgcXVldWUKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgIiVzOiBTZXJ2aWNpbmcgdGhlIFZPUyBTWVMgVFggTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICAgICAgICBwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnN5c1R4TXEpOworICAgICAgICBpZiAocE1zZ1dyYXBwZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IHBNc2dXcmFwcGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2U3RhdHVzID0gc3lzVHhQcm9jZXNzTXNnKCBwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKyAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBJc3N1ZSBQcm9jZXNzaW5nIFRYIFNZUyBtZXNzYWdlIixfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmV0dXJuIG1lc3NhZ2UgdG8gdGhlIENvcmUKKyAgICAgICAgdm9zX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvLyBDaGVjayBub3cgdGhlIFRMIHF1ZXVlCisgICAgICBpZiAoIXZvc19pc19tcV9lbXB0eSgmcFNjaGVkQ29udGV4dC0+dGxUeE1xKSkKKyAgICAgIHsKKyAgICAgICAgLy8gU2VydmljZSB0aGUgVEwgbWVzc2FnZSBxdWV1ZQorICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAiJXM6IFNlcnZpY2luZyB0aGUgVk9TIFRMIFRYIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgICAgICAgcE1zZ1dyYXBwZXIgPSB2b3NfbXFfZ2V0KCZwU2NoZWRDb250ZXh0LT50bFR4TXEpOworICAgICAgICBpZiAocE1zZ1dyYXBwZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IHBNc2dXcmFwcGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2U3RhdHVzID0gV0xBTlRMX1R4UHJvY2Vzc01zZyggcFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiJXM6IElzc3VlIFByb2Nlc3NpbmcgVFggVEwgbWVzc2FnZSIsX19mdW5jX18pOworICAgICAgICB9CisgICAgICAgIC8vIHJldHVybiBtZXNzYWdlIHRvIHRoZSBDb3JlCisgICAgICAgIHZvc19jb3JlX3JldHVybl9tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlcik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgICAgLy8gQ2hlY2sgdGhlIFdESSBxdWV1ZQorICAgICAgaWYgKCF2b3NfaXNfbXFfZW1wdHkoJnBTY2hlZENvbnRleHQtPndkaVR4TXEpKQorICAgICAgeworICAgICAgICB3cHRfbXNnICpwV2RpTXNnOworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREksIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgIiVzOiBTZXJ2aWNpbmcgdGhlIFZPUyBUWCBXREkgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworCisgICAgICAgIHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmcFNjaGVkQ29udGV4dC0+d2RpVHhNcSk7CisgICAgICAgIFZPU19BU1NFUlQoTlVMTCAhPSBwTXNnV3JhcHBlcik7CisKKyAgICAgICAgcFdkaU1zZyA9ICh3cHRfbXNnICopcE1zZ1dyYXBwZXItPnBWb3NNc2ctPmJvZHlwdHI7CisgICAgICAgIFZPU19BU1NFUlQocFdkaU1zZy0+Y2FsbGJhY2spOworCisgICAgICAgIHBXZGlNc2ctPmNhbGxiYWNrKHBXZGlNc2cpOworCisgICAgICAgIC8vIHJldHVybiBtZXNzYWdlIHRvIHRoZSBDb3JlCisgICAgICAgIHZvc19jb3JlX3JldHVybl9tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlcik7CisKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisjZWxzZQorICAgICAgLy8gQ2hlY2sgdGhlIFNTQyBxdWV1ZQorICAgICAgaWYgKCF2b3NfaXNfbXFfZW1wdHkoJnBTY2hlZENvbnRleHQtPnNzY1R4TXEpKQorICAgICAgeworICAgICAgICAvLyBTZXJ2aWNlIHRoZSBQRSBtZXNzYWdlIHF1ZXVlCisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgIiVzOiBTZXJ2aWNpbmcgdGhlIFZPUyBUWCBTU0MgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICAgICAgICBwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnNzY1R4TXEpOworICAgICAgICBpZiAocE1zZ1dyYXBwZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IHBNc2dXcmFwcGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2U3RhdHVzID0gV0xBTlNTQ19Qcm9jZXNzTXNnKCBwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKyAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBJc3N1ZSBQcm9jZXNzaW5nIFRYIFRMIG1lc3NhZ2UiLF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgICAgICAvLyByZXR1cm4gbWVzc2FnZSB0byB0aGUgQ29yZQorICAgICAgICB2b3NfY29yZV9yZXR1cm5fbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworI2VuZGlmCisgICAgICAvKiBDaGVjayBmb3IgYW55IFN1c3BlbmQgSW5kaWNhdGlvbiAqLworICAgICAgaWYodGVzdF9iaXQoVFhfU1VTUEVORF9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+dHhFdmVudEZsYWcpKQorICAgICAgeworICAgICAgICBjbGVhcl9iaXQoVFhfU1VTUEVORF9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+dHhFdmVudEZsYWcpOworICAgICAgICBzcGluX2xvY2soJnBTY2hlZENvbnRleHQtPlR4VGhyZWFkTG9jayk7CisKKyAgICAgICAgLyogVHggVGhyZWFkIFN1c3BlbmRlZCAqLworICAgICAgICBjb21wbGV0ZSgmcEhkZEN0eC0+dHhfc3VzX2V2ZW50X3Zhcik7CisKKyAgICAgICAgSU5JVF9DT01QTEVUSU9OKHBTY2hlZENvbnRleHQtPlJlc3VtZVR4RXZlbnQpOworICAgICAgICBzcGluX3VubG9jaygmcFNjaGVkQ29udGV4dC0+VHhUaHJlYWRMb2NrKTsKKworICAgICAgICAvKiBXYWl0IGZvZSBSZXN1bWUgSW5kaWNhdGlvbiAqLworICAgICAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnBTY2hlZENvbnRleHQtPlJlc3VtZVR4RXZlbnQpOworICAgICAgfQorCisgICAgICBicmVhazsgLy9BbGwgcXVldWVzIGFyZSBlbXB0eSBub3cKKyAgICB9IC8vIHdoaWxlIG1lc3NhZ2UgbG9vcCBwcm9jZXNzaW5nCisgIH0gLy8gd2hpbGUgVFJVRQorICAvLyBJZiB3ZSBnZXQgaGVyZSB0aGUgVFggdGhyZWFkIG11c3QgZXhpdAorICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAiJXM6IFRYIFRocmVhZCBleGl0aW5nISEhISIsIF9fRlVOQ1RJT05fXyk7CisgIGNvbXBsZXRlX2FuZF9leGl0KCZwU2NoZWRDb250ZXh0LT5UeFNodXRkb3duLCAwKTsKK30gLyogVm9zVHhUaHJlYWQoKSAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgVm9zUlhUaHJlYWQoKSAtIFRoZSBWT1NTIE1haW4gUnggdGhyZWFkCisgIFRoZSBcYSBWb3NSeFRocmVhZCgpIGlzIHRoZSBWT1NTIFJ4IGNvbnRyb2xsZXIgdGhyZWFkOgorICBccGFyYW0gIEFyZyAtIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2T1NTIFNjaGVkIENvbnRleHQKKworICBccmV0dXJuIFRocmVhZCBleGl0IGNvZGUKKyAgXHNhIFZvc1J4VGhyZWFkKCkKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgVm9zUlhUaHJlYWQgKCB2b2lkICogQXJnICkKK3sKKyAgcFZvc1NjaGVkQ29udGV4dCBwU2NoZWRDb250ZXh0ID0gKHBWb3NTY2hlZENvbnRleHQpQXJnOworICBwVm9zTXNnV3JhcHBlciAgIHBNc2dXcmFwcGVyICAgPSBOVUxMOworICBpbnQgICAgICAgICAgICAgIHJldFdhaXRTdGF0dXMgPSAwOworICB2X0JPT0xfdCBzaHV0ZG93biA9IFZPU19GQUxTRTsKKyAgaGRkX2NvbnRleHRfdCAqcEhkZEN0eCAgICAgICAgID0gTlVMTDsKKyAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgICAgICAgID0gTlVMTDsKKyAgVk9TX1NUQVRVUyAgICAgICB2U3RhdHVzICAgICAgID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgIHNldF91c2VyX25pY2UoY3VycmVudCwgLTEpOworCisgIGlmIChBcmcgPT0gTlVMTCkKKyAgeworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXMgQmFkIEFyZ3MgcGFzc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuIDA7CisgIH0KKyAgZGFlbW9uaXplKCJSWF9UaHJlYWQiKTsKKyAgLyoKKyAgKiogQWNrIGJhY2sgdG8gdGhlIGNvbnRleHQgZnJvbSB3aGljaCB0aGUgbWFpbiBjb250cm9sbGVyIHRocmVhZCBoYXMgYmVlbgorICAqKiBjcmVhdGVkLgorICAqLworICBjb21wbGV0ZSgmcFNjaGVkQ29udGV4dC0+UnhTdGFydEV2ZW50KTsKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAiJXM6IFJYIFRocmVhZCAlZCAoJXMpIHN0YXJ0aW5nIHVwISIsX19mdW5jX18sIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSk7CisKKyAgLyogR2V0IHRoZSBHbG9iYWwgVk9TUyBDb250ZXh0ICovCisgIHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1NZUywgTlVMTCk7CisgIGlmKCFwVm9zQ29udGV4dCkgeworICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCIlczogR2xvYmFsIFZPUyBjb250ZXh0IGlzIE51bGwiLCBfX2Z1bmNfXyk7CisgICAgIHJldHVybiAwOworICB9CisKKyAgLyogR2V0IHRoZSBIREQgY29udGV4dCAqLworICBwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKil2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQsIHBWb3NDb250ZXh0ICk7CisgIGlmKCFwSGRkQ3R4KSB7CisgICAgIGhkZExvZyhWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsIiVzOiBIREQgY29udGV4dCBpcyBOdWxsIixfX2Z1bmNfXyk7CisgICAgIHJldHVybiAwOworICB9CisKKyAgd2hpbGUoIXNodXRkb3duKQorICB7CisgICAgLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBleGVjdXRpb24gbW9kZWwgYWxnb3JpdGhtCisgICAgcmV0V2FpdFN0YXR1cyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwU2NoZWRDb250ZXh0LT5yeFdhaXRRdWV1ZSwKKyAgICAgICAgdGVzdF9iaXQoUlhfUE9TVF9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+cnhFdmVudEZsYWcpIHx8IAorICAgICAgICB0ZXN0X2JpdChSWF9TVVNQRU5EX0VWRU5UX01BU0ssICZwU2NoZWRDb250ZXh0LT5yeEV2ZW50RmxhZykpOworCisKKyAgICBpZihyZXRXYWl0U3RhdHVzID09IC1FUkVTVEFSVFNZUykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgIiVzOiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUgcmV0dXJuZWQgLUVSRVNUQVJUU1lTIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNsZWFyX2JpdChSWF9QT1NUX0VWRU5UX01BU0ssICZwU2NoZWRDb250ZXh0LT5yeEV2ZW50RmxhZyk7CisKKyAgICB3aGlsZSgxKQorICAgIHsKKyAgICAgIGlmKHRlc3RfYml0KFJYX1NIVVRET1dOX0VWRU5UX01BU0ssICZwU2NoZWRDb250ZXh0LT5yeEV2ZW50RmxhZykpCisgICAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiJXM6IFJYIHRocmVhZCBzaWduYWxlZCB0byBzaHV0ZG93biIsIF9fZnVuY19fKTsKKyAgICAgICAgc2h1dGRvd24gPSBWT1NfVFJVRTsKKyAgICAgICAgLyogQ2hlY2sgZm9yIGFueSBTdXNwZW5kIEluZGljYXRpb24gKi8KKyAgICAgICAgaWYodGVzdF9iaXQoUlhfU1VTUEVORF9FVkVOVF9NQVNLLCAmcFNjaGVkQ29udGV4dC0+cnhFdmVudEZsYWcpKQorICAgICAgICB7CisgICAgICAgICAgIGNsZWFyX2JpdChSWF9TVVNQRU5EX0VWRU5UX01BU0ssICZwU2NoZWRDb250ZXh0LT5yeEV2ZW50RmxhZyk7CisgICAgICAgIAorICAgICAgICAgICAvKiBVbmJsb2NrIGFueW9uZSB3YWl0aW5nIG9uIHN1c3BlbmQgKi8KKyAgICAgICAgICAgY29tcGxldGUoJnBIZGRDdHgtPnJ4X3N1c19ldmVudF92YXIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisKKyAgICAgIC8vIENoZWNrIHRoZSBTWVMgcXVldWUgZmlyc3QKKyAgICAgIGlmICghdm9zX2lzX21xX2VtcHR5KCZwU2NoZWRDb250ZXh0LT5zeXNSeE1xKSkKKyAgICAgIHsKKyAgICAgICAgLy8gU2VydmljZSB0aGUgU1lTIG1lc3NhZ2UgcXVldWUKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgIiVzOiBTZXJ2aWNpbmcgdGhlIFZPUyBTWVMgUlggTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICAgICAgICBwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnN5c1J4TXEpOworICAgICAgICBpZiAocE1zZ1dyYXBwZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IHBNc2dXcmFwcGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2U3RhdHVzID0gc3lzUnhQcm9jZXNzTXNnKCBwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKyAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBJc3N1ZSBQcm9jZXNzaW5nIFRYIFNZUyBtZXNzYWdlIixfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmV0dXJuIG1lc3NhZ2UgdG8gdGhlIENvcmUKKyAgICAgICAgdm9zX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIHRoZSBXREkgcXVldWUKKyAgICAgIGlmICghdm9zX2lzX21xX2VtcHR5KCZwU2NoZWRDb250ZXh0LT53ZGlSeE1xKSkKKyAgICAgIHsKKyAgICAgICAgd3B0X21zZyAqcFdkaU1zZzsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfV0RJLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICIlczogU2VydmljaW5nIHRoZSBWT1MgUlggV0RJIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKworICAgICAgICBwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPndkaVJ4TXEpOworICAgICAgICBpZiAoKE5VTEwgPT0gcE1zZ1dyYXBwZXIpIHx8IChOVUxMID09IHBNc2dXcmFwcGVyLT5wVm9zTXNnKSkKKyAgICAgICAgeworICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiB3ZGlSeE1xIG1lc3NhZ2UgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAvLyB3ZSB3b24ndCByZXR1cm4gdGhpcyB3cmFwcGVyIHNpbmNlIGl0IGlzIGNvcnJ1cHQKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBwV2RpTXNnID0gKHdwdF9tc2cgKilwTXNnV3JhcHBlci0+cFZvc01zZy0+Ym9keXB0cjsKKyAgICAgICAgICBpZiAoKE5VTEwgPT0gcFdkaU1zZykgfHwgKE5VTEwgPT0gcFdkaU1zZy0+Y2FsbGJhY2spKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6IFdESSBNc2cgb3IgY2FsbGJhY2sgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBtZXNzYWdlIGhhbmRsZXIKKyAgICAgICAgICAgIHBXZGlNc2ctPmNhbGxiYWNrKHBXZGlNc2cpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIHJldHVybiBtZXNzYWdlIHRvIHRoZSBDb3JlCisgICAgICAgICAgdm9zX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgZm9yIGFueSBTdXNwZW5kIEluZGljYXRpb24gKi8KKyAgICAgIGlmKHRlc3RfYml0KFJYX1NVU1BFTkRfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPnJ4RXZlbnRGbGFnKSkKKyAgICAgIHsKKyAgICAgICAgY2xlYXJfYml0KFJYX1NVU1BFTkRfRVZFTlRfTUFTSywgJnBTY2hlZENvbnRleHQtPnJ4RXZlbnRGbGFnKTsKKyAgICAgICAgc3Bpbl9sb2NrKCZwU2NoZWRDb250ZXh0LT5SeFRocmVhZExvY2spOworCisgICAgICAgIC8qIFJ4IFRocmVhZCBTdXNwZW5kZWQgKi8KKyAgICAgICAgY29tcGxldGUoJnBIZGRDdHgtPnJ4X3N1c19ldmVudF92YXIpOworCisgICAgICAgIGluaXRfY29tcGxldGlvbigmcFNjaGVkQ29udGV4dC0+UmVzdW1lUnhFdmVudCk7CisgICAgICAgIHNwaW5fdW5sb2NrKCZwU2NoZWRDb250ZXh0LT5SeFRocmVhZExvY2spOworCisgICAgICAgIC8qIFdhaXQgZm9yIFJlc3VtZSBJbmRpY2F0aW9uICovCisgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcFNjaGVkQ29udGV4dC0+UmVzdW1lUnhFdmVudCk7CisgICAgICB9CisKKyAgICAgIGJyZWFrOyAvL0FsbCBxdWV1ZXMgYXJlIGVtcHR5IG5vdworICAgIH0gLy8gd2hpbGUgbWVzc2FnZSBsb29wIHByb2Nlc3NpbmcKKyAgfSAvLyB3aGlsZSBUUlVFCisgIC8vIElmIHdlIGdldCBoZXJlIHRoZSBSWCB0aHJlYWQgbXVzdCBleGl0CisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICIlczogUlggVGhyZWFkIGV4aXRpbmchISEhIiwgX19GVU5DVElPTl9fKTsKKyAgY29tcGxldGVfYW5kX2V4aXQoJnBTY2hlZENvbnRleHQtPlJ4U2h1dGRvd24sIDApOworfSAvKiBWb3NSeFRocmVhZCgpICovCisjZW5kaWYKKworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgdm9zX3NjaGVkX2Nsb3NlKCkgLSBDbG9zZSB0aGUgdk9TUyBTY2hlZHVsZXIKKyAgVGhlIFxhIHZvc19zY2hlZF9jbG9zZXMoKSBmdW5jdGlvbiBjbG9zZXMgdGhlIHZPU1MgU2NoZWR1bGVyCisgIFVwb24gc3VjY2Vzc2Z1bCBjbG9zaW5nOgorICAgICAtIEFsbCB0aGUgbWVzc2FnZSBxdWV1ZXMgYXJlIGZsdXNoZWQKKyAgICAgLSBUaGUgTWFpbiBDb250cm9sbGVyIHRocmVhZCBpcyBjbG9zZWQKKyAgICAgLSBUaGUgVHggdGhyZWFkIGlzIGNsb3NlZAorCisgIFxwYXJhbSAgcFZvc0NvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdk9TUyBDb250ZXh0CisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gU2NoZWR1bGVyIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kCisgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBJbnZhbGlkIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIHNjaGVkdWxlciBPcGVuCisgICAgICAgICAgZnVuY3Rpb24KKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgc2NoZWR1bGVyLworICBcc2Egdm9zX3NjaGVkX2Nsb3NlKCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19zY2hlZF9jbG9zZSAoIHZfUFZPSURfdCBwVm9zQ29udGV4dCApCit7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgIiVzOiBpbnZva2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAoZ3BWb3NTY2hlZENvbnRleHQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAiJXM6IGdwVm9zU2NoZWRDb250ZXh0ID09IE5VTExcbiIsX19GVU5DVElPTl9fKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gc2h1dCBkb3duIE1DIFRocmVhZAorICAgIHNldF9iaXQoTUNfU0hVVERPV05fRVZFTlRfTUFTSywgJmdwVm9zU2NoZWRDb250ZXh0LT5tY0V2ZW50RmxhZyk7CisgICAgc2V0X2JpdChNQ19QT1NUX0VWRU5UX01BU0ssICZncFZvc1NjaGVkQ29udGV4dC0+bWNFdmVudEZsYWcpOworICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3BWb3NTY2hlZENvbnRleHQtPm1jV2FpdFF1ZXVlKTsKKyAgICAvL1dhaXQgZm9yIE1DIHRvIGV4aXQKKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmdwVm9zU2NoZWRDb250ZXh0LT5NY1NodXRkb3duKTsKKyAgICBncFZvc1NjaGVkQ29udGV4dC0+TWNUaHJlYWQgPSAwOworCisjaWYgIWRlZmluZWQoQU5JX01BTkZfRElBRykgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisgICAgLy8gc2h1dCBkb3duIFRYIFRocmVhZAorICAgIHNldF9iaXQoVFhfU0hVVERPV05fRVZFTlRfTUFTSywgJmdwVm9zU2NoZWRDb250ZXh0LT50eEV2ZW50RmxhZyk7CisgICAgc2V0X2JpdChUWF9QT1NUX0VWRU5UX01BU0ssICZncFZvc1NjaGVkQ29udGV4dC0+dHhFdmVudEZsYWcpOworICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3BWb3NTY2hlZENvbnRleHQtPnR4V2FpdFF1ZXVlKTsKKyAgICAvL1dhaXQgZm9yIFRYIHRvIGV4aXQKKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmdwVm9zU2NoZWRDb250ZXh0LT5UeFNodXRkb3duKTsKKyAgICBncFZvc1NjaGVkQ29udGV4dC0+VHhUaHJlYWQgPSAwOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgLy8gc2h1dCBkb3duIFJYIFRocmVhZAorICAgIHNldF9iaXQoUlhfU0hVVERPV05fRVZFTlRfTUFTSywgJmdwVm9zU2NoZWRDb250ZXh0LT5yeEV2ZW50RmxhZyk7CisgICAgc2V0X2JpdChSWF9QT1NUX0VWRU5UX01BU0ssICZncFZvc1NjaGVkQ29udGV4dC0+cnhFdmVudEZsYWcpOworICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3BWb3NTY2hlZENvbnRleHQtPnJ4V2FpdFF1ZXVlKTsKKyAgICAvL1dhaXQgZm9yIFJYIHRvIGV4aXQKKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmdwVm9zU2NoZWRDb250ZXh0LT5SeFNodXRkb3duKTsKKyAgICBncFZvc1NjaGVkQ29udGV4dC0+UnhUaHJlYWQgPSAwOworI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2VuZGlmIC8vICFkZWZpbmVkKEFOSV9NQU5GX0RJQUcpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DKQorCisgICAgLy9DbGVhbiB1cCBtZXNzYWdlIHF1ZXVlcyBvZiBUWCBhbmQgTUMgdGhyZWFkCisgICAgdm9zX3NjaGVkX2ZsdXNoX21jX21xcyhncFZvc1NjaGVkQ29udGV4dCk7CisjaWYgIWRlZmluZWQoQU5JX01BTkZfRElBRykgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisgICAgdm9zX3NjaGVkX2ZsdXNoX3R4X21xcyhncFZvc1NjaGVkQ29udGV4dCk7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAgdm9zX3NjaGVkX2ZsdXNoX3J4X21xcyhncFZvc1NjaGVkQ29udGV4dCk7CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjZW5kaWYgLy8gIWRlZmluZWQoQU5JX01BTkZfRElBRykgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisKKyAgICAvL0RlaW5pdCBhbGwgdGhlIHF1ZXVlcworICAgIHZvc19zY2hlZF9kZWluaXRfbXFzKGdwVm9zU2NoZWRDb250ZXh0KTsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIHZveF9zY2hlZF9jbG9zZSgpICovCisKK1ZPU19TVEFUVVMgdm9zX3dhdGNoZG9nX2Nsb3NlICggdl9QVk9JRF90IHBWb3NDb250ZXh0ICkKK3sKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAiJXM6IHZvc193YXRjaGRvZyBjbG9zaW5nIG5vdyIsIF9fRlVOQ1RJT05fXyk7CisgICAgaWYgKGdwVm9zV2F0Y2hkb2dDb250ZXh0ID09IE5VTEwpCisgICAgeworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgIiVzOiBncFZvc1dhdGNoZG9nQ29udGV4dCBpcyBOVUxMXG4iLF9fRlVOQ1RJT05fXyk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKyAgICBzZXRfYml0KFdEX1NIVVRET1dOX0VWRU5UX01BU0ssICZncFZvc1dhdGNoZG9nQ29udGV4dC0+d2RFdmVudEZsYWcpOworICAgIHNldF9iaXQoV0RfUE9TVF9FVkVOVF9NQVNLLCAmZ3BWb3NXYXRjaGRvZ0NvbnRleHQtPndkRXZlbnRGbGFnKTsKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmdwVm9zV2F0Y2hkb2dDb250ZXh0LT53ZFdhaXRRdWV1ZSk7CisgICAgLy9XYWl0IGZvciBXYXRjaGRvZyB0aHJlYWQgdG8gZXhpdAorICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmZ3BWb3NXYXRjaGRvZ0NvbnRleHQtPldkU2h1dGRvd24pOworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIHZvc193YXRjaGRvZ19jbG9zZSgpICovCisKK1ZPU19TVEFUVVMgdm9zX3dhdGNoZG9nX2NoaXBfcmVzZXQgKCB2b3NfY2hpcF9yZXNldF9yZWFzb25fdHlwZSAgcmVhc29uICkKK3sKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSBOVUxMOworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBOVUxMOworICAgIGhkZF9jaGlwX3Jlc2V0X3N0YXRzX3QgKnBSZXNldFN0YXRzOworICAgIHN0cnVjdCBzZGlvX2Z1bmMgKnNkaW9fZnVuY19kZXYgPSBOVUxMOworICAgIAorICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgIiVzOiB2b3Nfd2F0Y2hkb2cgcmVzZXR0aW5nIFdMQU4iLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChncFZvc1dhdGNoZG9nQ29udGV4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICIlczogV2F0Y2hkb2cgbm90IGVuYWJsZWQuIExPR1AgaWdub3JlZC4iLF9fRlVOQ1RJT05fXyk7CisgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKworICAgIHBWb3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX0hERCwgTlVMTCk7CisgICAgcEhkZEN0eCA9IChoZGRfY29udGV4dF90ICopdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfSERELCBwVm9zQ29udGV4dCApOworCisgICAgaGRkX3Jlc2V0X2FsbF9hZGFwdGVycyhwSGRkQ3R4KTsKKworICAgIHNkaW9fZnVuY19kZXYgPSBsaWJyYV9nZXRzZGlvX2Z1bmNkZXYoKTsKKworICAgIGlmKHNkaW9fZnVuY19kZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgICAvKiBPdXIgY2FyZCBnb3QgcmVtb3ZlZCBiZWZvcmUgTE9HUC4gQ29udGludWUgd2l0aCByZXNldCBhbnl3YXlzICovCisgICAgICAgICBoZGRMb2coVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLCAiJXM6IHNkaW9fZnVuY19kZXYgaXMgTlVMTCEiLF9fZnVuY19fKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgc2RfY2xhaW1faG9zdChzZGlvX2Z1bmNfZGV2KTsKKyAgICAKKyAgICAvKiBEaXNhYmxlIFNESU8gSVJRIHNpbmNlIHdlIGFyZSBpbiBMT0dQIHN0YXRlICovCisgICAgbGlicmFfZGlzYWJsZV9zZGlvX2lycV9jYXBhYmlsaXR5KHNkaW9fZnVuY19kZXYsIDEpOworICAgIGxpYnJhX2VuYWJsZV9zZGlvX2lycShzZGlvX2Z1bmNfZGV2LCAwKTsKKworICAgIHNkX3JlbGVhc2VfaG9zdChzZGlvX2Z1bmNfZGV2KTsKKworICAgIC8qIFRha2UgdGhlIGxvY2sgaGVyZSAqLworICAgIHNwaW5fbG9jaygmZ3BWb3NXYXRjaGRvZ0NvbnRleHQtPndkTG9jayk7CisKKyAgICBpZiAoZ3BWb3NXYXRjaGRvZ0NvbnRleHQtPnJlc2V0SW5Qcm9ncmVzcykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICIlczogUmVzZXQgYWxyZWFkeSBpbiBQcm9ncmVzcy4gSWdub3Jpbmcgc2lnbmFsaW5nIFdhdGNoZG9nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgLyogUmVsZWFzZSB0aGUgbG9jayBoZXJlICovCisgICAgICAgIHNwaW5fdW5sb2NrKCZncFZvc1dhdGNoZG9nQ29udGV4dC0+d2RMb2NrKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0gCisgICAgZWxzZSBpZiAocEhkZEN0eC0+aXNMb2dwSW5Qcm9ncmVzcykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICIlczogTE9HUCBhbHJlYWR5IGluIFByb2dyZXNzLiBJZ25vcmluZyBzaWduYWxpbmcgV2F0Y2hkb2ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAvKiBSZWxlYXNlIHRoZSBsb2NrIGhlcmUgKi8KKyAgICAgICAgc3Bpbl91bmxvY2soJmdwVm9zV2F0Y2hkb2dDb250ZXh0LT53ZExvY2spOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAKKyAgICBwVm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQsIE5VTEwpOworICAgIHBBZGFwdGVyID0gKGhkZF9hZGFwdGVyX3QgKil2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQscFZvc0NvbnRleHQpOworCisgICAgLyogU2V0IHRoZSBmbGFncyBzbyB0aGF0IGFsbCBmdXR1cmUgQ01ENTMgYW5kIFdleHQgY29tbWFuZHMgZ2V0IGJsb2NrZWQgcmlnaHQgYXdheSAqLworICAgIHZvc19zZXRfbG9ncF9pbl9wcm9ncmVzcyhWT1NfTU9EVUxFX0lEX1ZPU1MsIFRSVUUpOworICAgIHBIZGRDdHgtPmlzTG9ncEluUHJvZ3Jlc3MgPSBUUlVFOworCisgICAgLyogUmVsZWFzZSB0aGUgbG9jayBoZXJlICovCisgICAgc3Bpbl91bmxvY2soJmdwVm9zV2F0Y2hkb2dDb250ZXh0LT53ZExvY2spOworCisgICAgaWYgKHBIZGRDdHgtPmlzTG9hZFVubG9hZEluUHJvZ3Jlc3MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAiJXM6IExvYWQvdW5sb2FkIGluIFByb2dyZXNzLiBJZ25vcmluZyBzaWduYWxpbmcgV2F0Y2hkb2ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsgICAgCisgICAgfQorCisjaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKKyAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gaGRkX3dsYW5fcmVzZXRfaW5pdGlhbGl6YXRpb24oKSkKKyAgICB7CisgICAgICAgLyogVGhpcyBjYW4gZmFpbCBpZiBjYXJkIGdvdCByZW1vdmVkIGJ5IFNEQ0MgZHVyaW5nIHJlc3VtZSAqLworICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBVcGRhdGUgUmVzZXQgU3RhdGlzdGljcyAqLworICAgIHBSZXNldFN0YXRzID0gJnBIZGRDdHgtPmhkZENoaXBSZXNldFN0YXRzOworICAgIHBSZXNldFN0YXRzLT50b3RhbExvZ3BSZXNldHMrKzsKKworICAgIHN3aXRjaCAocmVhc29uKQorICAgIHsKKyAgICAgY2FzZSBWT1NfQ0hJUF9SRVNFVF9DTUQ1M19GQUlMVVJFOgorICAgICAgICBwUmVzZXRTdGF0cy0+dG90YWxDTUQ1M0ZhaWx1cmVzKys7CisgICAgICAgIGJyZWFrOworICAgICBjYXNlIFZPU19DSElQX1JFU0VUX0ZXX0VYQ0VQVElPTjoKKyAgICAgICAgcFJlc2V0U3RhdHMtPnRvdGFsRldIZWFyYmVhdEZhaWx1cmVzKys7CisgICAgICAgIGJyZWFrOworICAgICBjYXNlIFZPU19DSElQX1JFU0VUX01VVEVYX1JFQURfRkFJTFVSRToKKyAgICAgICAgcFJlc2V0U3RhdHMtPnRvdGFsTXV0ZXhSZWFkRmFpbHVyZXMrKzsKKyAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgVk9TX0NISVBfUkVTRVRfTUlGX0VYQ0VQVElPTjoKKyAgICAgICAgcFJlc2V0U3RhdHMtPnRvdGFsTUlGRXJyb3JGYWlsdXJlcysrOworICAgICAgICBicmVhazsKKyAgICAgZGVmYXVsdDoKKyAgICAgICAgcFJlc2V0U3RhdHMtPnRvdGFsVW5rbm93bkV4Y2VwdGlvbnMrKzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc2V0X2JpdChXRF9DSElQX1JFU0VUX0VWRU5UX01BU0ssICZncFZvc1dhdGNoZG9nQ29udGV4dC0+d2RFdmVudEZsYWcpOworICAgIHNldF9iaXQoV0RfUE9TVF9FVkVOVF9NQVNLLCAmZ3BWb3NXYXRjaGRvZ0NvbnRleHQtPndkRXZlbnRGbGFnKTsKKyAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmdwVm9zV2F0Y2hkb2dDb250ZXh0LT53ZFdhaXRRdWV1ZSk7CisjZW5kaWYKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiB2b3Nfd2F0Y2hkb2dfY2hpcF9yZXNldCgpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFxicmllZiB2b3Nfc2NoZWRfaW5pdF9tcXM6IEluaXRpYWxpemUgdGhlIHZPU1MgU2NoZWR1bGVyIG1lc3NhZ2UgcXVldWVzCisgIFRoZSBcYSB2b3Nfc2NoZWRfaW5pdF9tcXMoKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgdk9TUyBTY2hlZHVsZXIKKyAgbWVzc2FnZSBxdWV1ZXMuCisgIFxwYXJhbSAgcFZvc1NjaGVkQ29udGV4dCAtIHBvaW50ZXIgdG8gdGhlIFNjaGVkdWxlciBDb250ZXh0LgorICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIFNjaGVkdWxlciB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZAorICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisgICAgICAgICAgVk9TX1NUQVRVU19FX1JFU09VUkNFUyAtIFN5c3RlbSByZXNvdXJjZXMgKG90aGVyIHRoYW4gbWVtb3J5KQorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZSB0byBpbml0aWxpemUgdGhlIHNjaGVkdWxlcgorCisgIFxzYSB2b3Nfc2NoZWRfaW5pdF9tcXMoKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3NjaGVkX2luaXRfbXFzICggcFZvc1NjaGVkQ29udGV4dCBwU2NoZWRDb250ZXh0ICkKK3sKKyAgVk9TX1NUQVRVUyB2U3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAvLyBOb3cgaW50aWFsaXplIGFsbCB0aGUgbWVzc2FnZSBxdWV1ZXMKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogSW5pdGlhbGl6aW5nIHRoZSBXREEgTUMgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICB2U3RhdHVzID0gdm9zX21xX2luaXQoJnBTY2hlZENvbnRleHQtPndkYU1jTXEpOworICBpZiAoISBWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBpbml0IFdEQSBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgICAgVk9TX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gdlN0YXR1czsKKyAgfQorI2Vsc2UKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogSW5pdGlhbGl6aW5nIHRoZSBIQUwgTUMgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICB2U3RhdHVzID0gdm9zX21xX2luaXQoJnBTY2hlZENvbnRleHQtPmhhbE1jTXEpOworICBpZiAoISBWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBpbml0IEhBTCBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgICAgVk9TX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gdlN0YXR1czsKKyAgfQorI2VuZGlmCisjaWYgIWRlZmluZWQoQU5JX01BTkZfRElBRykgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAiJXM6IEluaXRpYWxpemluZyB0aGUgUEUgTUMgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICB2U3RhdHVzID0gdm9zX21xX2luaXQoJnBTY2hlZENvbnRleHQtPnBlTWNNcSk7CisgIGlmICghIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGluaXQgUEUgTUMgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICAgIFZPU19BU1NFUlQoMCk7CisgICAgcmV0dXJuIHZTdGF0dXM7CisgIH0KKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogSW5pdGlhbGl6aW5nIHRoZSBTTUUgTUMgTWVzc2FnZSBxdWV1ZSIsIF9fZnVuY19fKTsKKyAgdlN0YXR1cyA9IHZvc19tcV9pbml0KCZwU2NoZWRDb250ZXh0LT5zbWVNY01xKTsKKyAgaWYgKCEgVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gaW5pdCBTTUUgTUMgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICAgIFZPU19BU1NFUlQoMCk7CisgICAgcmV0dXJuIHZTdGF0dXM7CisgIH0KKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogSW5pdGlhbGl6aW5nIHRoZSBUTCBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZTdGF0dXMgPSB2b3NfbXFfaW5pdCgmcFNjaGVkQ29udGV4dC0+dGxNY01xKTsKKyAgaWYgKCEgVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gaW5pdCBUTCBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgICAgVk9TX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gdlN0YXR1czsKKyAgfQorI2VuZGlmCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAiJXM6IEluaXRpYWxpemluZyB0aGUgU1lTIE1DIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgdlN0YXR1cyA9IHZvc19tcV9pbml0KCZwU2NoZWRDb250ZXh0LT5zeXNNY01xKTsKKyAgaWYgKCEgVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gaW5pdCBTWVMgTUMgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICAgIFZPU19BU1NFUlQoMCk7CisgICAgcmV0dXJuIHZTdGF0dXM7CisgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogSW5pdGlhbGl6aW5nIHRoZSBXREkgTUMgTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworCisgIHZTdGF0dXMgPSB2b3NfbXFfaW5pdCgmcFNjaGVkQ29udGV4dC0+d2RpTWNNcSk7CisgIGlmICghIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGluaXQgV0RJIE1DIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgICBWT1NfQVNTRVJUKDApOworICAgIHJldHVybiB2U3RhdHVzOworICB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEFOSV9NQU5GX0RJQUcpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DKQorICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIiVzOiBJbml0aWFsaXppbmcgdGhlIFRMIFR4IE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgdlN0YXR1cyA9IHZvc19tcV9pbml0KCZwU2NoZWRDb250ZXh0LT50bFR4TXEpOworICBpZiAoISBWT1NfSVNfU1RBVFVTX1NVQ0NFU1ModlN0YXR1cykpCisgIHsKKyAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBpbml0IFRMIFRYIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgICBWT1NfQVNTRVJUKDApOworICAgIHJldHVybiB2U3RhdHVzOworICB9CisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIiVzOiBJbml0aWFsaXppbmcgdGhlIFNTQyBUeCBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZTdGF0dXMgPSB2b3NfbXFfaW5pdCgmcFNjaGVkQ29udGV4dC0+c3NjVHhNcSk7CisgIGlmICghIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGluaXQgU1NDIFRYIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgICBWT1NfQVNTRVJUKDApOworICAgIHJldHVybiB2U3RhdHVzOworICB9CisjZWxzZQorICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIiVzOiBJbml0aWFsaXppbmcgdGhlIFdESSBUeCBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZTdGF0dXMgPSB2b3NfbXFfaW5pdCgmcFNjaGVkQ29udGV4dC0+d2RpVHhNcSk7CisgIGlmICghIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGluaXQgV0RJIFRYIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgICBWT1NfQVNTRVJUKDApOworICAgIHJldHVybiB2U3RhdHVzOworICB9CisKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogSW5pdGlhbGl6aW5nIHRoZSBXREkgUnggTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworCisgIHZTdGF0dXMgPSB2b3NfbXFfaW5pdCgmcFNjaGVkQ29udGV4dC0+d2RpUnhNcSk7CisgIGlmICghIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGluaXQgV0RJIFJYIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgICBWT1NfQVNTRVJUKDApOworICAgIHJldHVybiB2U3RhdHVzOworICB9CisKKyNlbmRpZgorICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIiVzOiBJbml0aWFsaXppbmcgdGhlIFNZUyBUeCBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZTdGF0dXMgPSB2b3NfbXFfaW5pdCgmcFNjaGVkQ29udGV4dC0+c3lzVHhNcSk7CisgIGlmICghIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2U3RhdHVzKSkKKyAgeworICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGluaXQgU1lTIFRYIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgICBWT1NfQVNTRVJUKDApOworICAgIHJldHVybiB2U3RhdHVzOworICB9CisKKyAgdlN0YXR1cyA9IHZvc19tcV9pbml0KCZwU2NoZWRDb250ZXh0LT5zeXNSeE1xKTsKKyAgaWYgKCEgVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZTdGF0dXMpKQorICB7CisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gaW5pdCBTWVMgUlggTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICAgIFZPU19BU1NFUlQoMCk7CisgICAgcmV0dXJuIHZTdGF0dXM7CisgIH0KKyNlbmRpZgorICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfSAvKiB2b3Nfc2NoZWRfaW5pdF9tcXMoKSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBcYnJpZWYgdm9zX3NjaGVkX2RlaW5pdF9tcXM6IERlaW5pdGlhbGl6ZSB0aGUgdk9TUyBTY2hlZHVsZXIgbWVzc2FnZSBxdWV1ZXMKKyAgVGhlIFxhIHZvc19zY2hlZF9pbml0X21xcygpIGZ1bmN0aW9uIGRlaW5pdGlhbGl6ZXMgdGhlIHZPU1MgU2NoZWR1bGVyCisgIG1lc3NhZ2UgcXVldWVzLgorICBccGFyYW0gIHBWb3NTY2hlZENvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBTY2hlZHVsZXIgQ29udGV4dC4KKyAgXHJldHVybiBOb25lCisgIFxzYSB2b3Nfc2NoZWRfZGVpbml0X21xcygpCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCB2b3Nfc2NoZWRfZGVpbml0X21xcyAoIHBWb3NTY2hlZENvbnRleHQgcFNjaGVkQ29udGV4dCApCit7CisgIC8vIE5vdyBkZS1pbnRpYWxpemUgYWxsIG1lc3NhZ2UgcXVldWVzCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAvLyBNQyBIQUwKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlcyBEZS1Jbml0aWFsaXppbmcgdGhlIEhBTCBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZvc19tcV9kZWluaXQoJnBTY2hlZENvbnRleHQtPmhhbE1jTXEpOworI2Vsc2UKKyAvLyBNQyBXREEKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlcyBEZS1Jbml0aWFsaXppbmcgdGhlIFdEQSBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZvc19tcV9kZWluaXQoJnBTY2hlZENvbnRleHQtPndkYU1jTXEpOworI2VuZGlmCisjaWYgIWRlZmluZWQoQU5JX01BTkZfRElBRykgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisgIC8vTUMgUEUKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlcyBEZS1Jbml0aWFsaXppbmcgdGhlIFBFIE1DIE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgdm9zX21xX2RlaW5pdCgmcFNjaGVkQ29udGV4dC0+cGVNY01xKTsKKyAgLy9NQyBTTUUKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlcyBEZS1Jbml0aWFsaXppbmcgdGhlIFNNRSBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZvc19tcV9kZWluaXQoJnBTY2hlZENvbnRleHQtPnNtZU1jTXEpOworICAvL01DIFRMCisgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAiJXMgRGUtSW5pdGlhbGl6aW5nIHRoZSBUTCBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZvc19tcV9kZWluaXQoJnBTY2hlZENvbnRleHQtPnRsTWNNcSk7CisjZW5kaWYKKyAgLy9NQyBTWVMKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlcyBEZS1Jbml0aWFsaXppbmcgdGhlIFNZUyBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZvc19tcV9kZWluaXQoJnBTY2hlZENvbnRleHQtPnN5c01jTXEpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAvLyBNQyBXREkKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlcyBEZS1Jbml0aWFsaXppbmcgdGhlIFdESSBNQyBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZvc19tcV9kZWluaXQoJnBTY2hlZENvbnRleHQtPndkaU1jTXEpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChBTklfTUFORl9ESUFHKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQykKKyAgLy9UeCBUTAorICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIiVzIERlLUluaXRpYWxpemluZyB0aGUgVEwgVHggTWVzc2FnZSBxdWV1ZSIsX19mdW5jX18pOworICB2b3NfbXFfZGVpbml0KCZwU2NoZWRDb250ZXh0LT50bFR4TXEpOworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgLy9UeCBTU0MKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogRGVJbml0aWFsaXppbmcgdGhlIFNTQyBUeCBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZvc19tcV9kZWluaXQoJnBTY2hlZENvbnRleHQtPnNzY1R4TXEpOworCisjZWxzZQorICAvL1R4IFdESQorICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIiVzOiBEZUluaXRpYWxpemluZyB0aGUgV0RJIFR4IE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgdm9zX21xX2RlaW5pdCgmcFNjaGVkQ29udGV4dC0+d2RpVHhNcSk7CisKKworICAvL1J4IFdESQorICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIiVzOiBEZUluaXRpYWxpemluZyB0aGUgV0RJIFJ4IE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgdm9zX21xX2RlaW5pdCgmcFNjaGVkQ29udGV4dC0+d2RpUnhNcSk7CisjZW5kaWYKKworICAvL1R4IFNZUworICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgIiVzOiBEZUluaXRpYWxpemluZyB0aGUgU1lTIFR4IE1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKyAgdm9zX21xX2RlaW5pdCgmcFNjaGVkQ29udGV4dC0+c3lzVHhNcSk7CisKKyAgLy9SeCBTWVMKKyAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICIlczogRGVJbml0aWFsaXppbmcgdGhlIFNZUyBSeCBNZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisgIHZvc19tcV9kZWluaXQoJnBTY2hlZENvbnRleHQtPnN5c1J4TXEpOworCisjZW5kaWYKK30gLyogdm9zX3NjaGVkX2RlaW5pdF9tcXMoKSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0aGlzIGhlbHBlciBmdW5jdGlvbiBmbHVzaGVzIGFsbCB0aGUgTUMgbWVzc2FnZSBxdWV1ZXMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgdm9zX3NjaGVkX2ZsdXNoX21jX21xcyAoIHBWb3NTY2hlZENvbnRleHQgcFNjaGVkQ29udGV4dCApCit7CisgIHBWb3NNc2dXcmFwcGVyIHBNc2dXcmFwcGVyID0gTlVMTDsKKyAgcFZvc0NvbnRleHRUeXBlIHZvc0N0eDsKKworICAvKgorICAqKiBIZXJlIGVhY2ggb2YgdGhlIE1DIHRocmVhZCBNUSBzaGFsbCBiZSBkcmFpbmVkIGFuZCByZXR1cm5lZCB0byB0aGUKKyAgKiogQ29yZS4gQmVmb3JlIHJldHVybmluZyBhIHdyYXBwZXIgdG8gdGhlIENvcmUsIHRoZSBWT1MgbWVzc2FnZSBzaGFsbCBiZQorICAqKiBmcmVlZCAgZmlyc3QKKyAgKi8KKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsCisgICAgICAgICAgICAgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgKCJGbHVzaGluZyB0aGUgTUMgVGhyZWFkIG1lc3NhZ2UgcXVldWVcbiIpICk7CisKKyAgaWYgKE5VTEwgPT0gcFNjaGVkQ29udGV4dCkKKyAgeworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IHBTY2hlZENvbnRleHQgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybjsKKyAgfQorCisgIHZvc0N0eCA9IChwVm9zQ29udGV4dFR5cGUpKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCk7CisgIGlmIChOVUxMID09IHZvc0N0eCkKKyAgeworICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogdm9zQ3R4IGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm47CisgIH0KKworICAvKiBGbHVzaCB0aGUgU1lTIE1xICovCisgIHdoaWxlKCBOVUxMICE9IChwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnN5c01jTXEpICkpCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywKKyAgICAgICAgICAgICAgIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIiVzOiBGcmVlaW5nIE1DIFNZUyBtZXNzYWdlIHR5cGUgJWQgIixfX2Z1bmNfXywKKyAgICAgICAgICAgICAgIHBNc2dXcmFwcGVyLT5wVm9zTXNnLT50eXBlICk7CisgICAgc3lzTWNGcmVlTXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworICAgIHZvc19jb3JlX3JldHVybl9tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlcik7CisgIH0KKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgIC8qIEZsdXNoIHRoZSBIQUwgTXEgKi8KKyAgd2hpbGUoIE5VTEwgIT0gKHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmcFNjaGVkQ29udGV4dC0+aGFsTWNNcSkgKSkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLAorICAgICAgICAgICAgICAgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiJXM6IEZyZWVpbmcgTUMgSEFMIE1TRyBtZXNzYWdlIHR5cGUgJWQiLF9fZnVuY19fLAorICAgICAgICAgICAgICAgcE1zZ1dyYXBwZXItPnBWb3NNc2ctPnR5cGUgKTsKKyAgICBoYWxGcmVlTXNnKHZvc0N0eC0+cE1BQ0NvbnRleHQsICh0U2lyTXNnUSopcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworICAgIHZvc19jb3JlX3JldHVybl9tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlcik7CisgIH0KKyNlbHNlCisgIC8qIEZsdXNoIHRoZSBXREEgTXEgKi8KKyAgd2hpbGUoIE5VTEwgIT0gKHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmcFNjaGVkQ29udGV4dC0+d2RhTWNNcSkgKSkKKyAgeworICAgIGlmKHBNc2dXcmFwcGVyLT5wVm9zTXNnICE9IE5VTEwpIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICIlczogRnJlZWluZyBNQyBXREEgTVNHIG1lc3NhZ2UgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwTXNnV3JhcHBlci0+cFZvc01zZy0+dHlwZSApOworICAgICAgICBpZiAocE1zZ1dyYXBwZXItPnBWb3NNc2ctPmJvZHlwdHIpIHsKKyAgICAgICAgICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QqKXBNc2dXcmFwcGVyLT5wVm9zTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIHBNc2dXcmFwcGVyLT5wVm9zTXNnLT5ib2R5cHRyID0gTlVMTDsKKyAgICAgICAgcE1zZ1dyYXBwZXItPnBWb3NNc2ctPmJvZHl2YWwgPSAwOworICAgICAgICBwTXNnV3JhcHBlci0+cFZvc01zZy0+dHlwZSA9IDA7CisgICAgfQorICAgIHZvc19jb3JlX3JldHVybl9tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlcik7CisgIH0KKworICAvKiBGbHVzaCB0aGUgV0RJIE1xICovCisgIHdoaWxlKCBOVUxMICE9IChwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPndkaU1jTXEpICkpCisgIHsKKyAgICBpZihwTXNnV3JhcHBlci0+cFZvc01zZyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICIlczogRnJlZWluZyBNQyBXREkgTVNHIG1lc3NhZ2UgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwTXNnV3JhcHBlci0+cFZvc01zZy0+dHlwZSApOworICAgICAgICBpZiAocE1zZ1dyYXBwZXItPnBWb3NNc2ctPmJvZHlwdHIpIHsKKyAgICAgICAgICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QqKXBNc2dXcmFwcGVyLT5wVm9zTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIHBNc2dXcmFwcGVyLT5wVm9zTXNnLT5ib2R5cHRyID0gTlVMTDsKKyAgICAgICAgcE1zZ1dyYXBwZXItPnBWb3NNc2ctPmJvZHl2YWwgPSAwOworICAgICAgICBwTXNnV3JhcHBlci0+cFZvc01zZy0+dHlwZSA9IDA7CisgICAgfQorICAgIHZvc19jb3JlX3JldHVybl9tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlcik7CisgIH0KKworI2VuZGlmCisjaWYgIWRlZmluZWQoQU5JX01BTkZfRElBRykgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisgIC8qIEZsdXNoIHRoZSBQRSBNcSAqLworICB3aGlsZSggTlVMTCAhPSAocE1zZ1dyYXBwZXIgPSB2b3NfbXFfZ2V0KCZwU2NoZWRDb250ZXh0LT5wZU1jTXEpICkpCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywKKyAgICAgICAgICAgICAgIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIiVzOiBGcmVlaW5nIE1DIFBFIE1TRyBtZXNzYWdlIHR5cGUgJWQiLF9fZnVuY19fLAorICAgICAgICAgICAgICAgcE1zZ1dyYXBwZXItPnBWb3NNc2ctPnR5cGUgKTsKKyAgICBwZUZyZWVNc2codm9zQ3R4LT5wTUFDQ29udGV4dCwgKHRTaXJNc2dRKilwTXNnV3JhcHBlci0+cFZvc01zZyk7CisgICAgdm9zX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKyAgfQorICAvKiBGbHVzaCB0aGUgU01FIE1xICovCisgIHdoaWxlKCBOVUxMICE9IChwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnNtZU1jTXEpICkpCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywKKyAgICAgICAgICAgICAgIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIiVzOiBGcmVlaW5nIE1DIFNNRSBNU0cgbWVzc2FnZSB0eXBlICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICBwTXNnV3JhcHBlci0+cFZvc01zZy0+dHlwZSApOworICAgIHNtZV9GcmVlTXNnKHZvc0N0eC0+cE1BQ0NvbnRleHQsIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKyAgICB2b3NfY29yZV9yZXR1cm5fbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXIpOworICB9CisgICAgLyogRmx1c2ggdGhlIFRMIE1xICovCisgIHdoaWxlKCBOVUxMICE9IChwTXNnV3JhcHBlciA9IHZvc19tcV9nZXQoJnBTY2hlZENvbnRleHQtPnRsTWNNcSkgKSkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLAorICAgICAgICAgICAgICAgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiJXM6IEZyZWVpbmcgTUMgVEwgbWVzc2FnZSB0eXBlICVkIixfX2Z1bmNfXywKKyAgICAgICAgICAgICAgIHBNc2dXcmFwcGVyLT5wVm9zTXNnLT50eXBlICk7CisgICAgV0xBTlRMX01jRnJlZU1zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKyAgICB2b3NfY29yZV9yZXR1cm5fbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXIpOworICB9CisjZW5kaWYKK30gLyogdm9zX3NjaGVkX2ZsdXNoX21jX21xcygpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGZsdXNoZXMgYWxsIHRoZSBUWCBtZXNzYWdlIHF1ZXVlcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHZvc19zY2hlZF9mbHVzaF90eF9tcXMgKCBwVm9zU2NoZWRDb250ZXh0IHBTY2hlZENvbnRleHQgKQoreworICBwVm9zTXNnV3JhcHBlciBwTXNnV3JhcHBlciA9IE5VTEw7CisgIC8qCisgICoqIEhlcmUgZWFjaCBvZiB0aGUgVFggdGhyZWFkIE1RIHNoYWxsIGJlIGRyYWluZWQgYW5kIHJldHVybmVkIHRvIHRoZQorICAqKiBDb3JlLiBCZWZvcmUgcmV0dXJuaW5nIGEgd3JhcHBlciB0byB0aGUgQ29yZSwgdGhlIFZPUyBtZXNzYWdlIHNoYWxsCisgICoqIGJlIGZyZWVkIGZpcnN0CisgICovCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLAorICAgICAgICAgICAgIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlczogRmx1c2hpbmcgdGhlIFRYIFRocmVhZCBtZXNzYWdlIHF1ZXVlIixfX2Z1bmNfXyk7CisKKyAgaWYgKE5VTEwgPT0gcFNjaGVkQ29udGV4dCkKKyAgeworICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IHBTY2hlZENvbnRleHQgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybjsKKyAgfQorCisgIC8qIEZsdXNoIHRoZSBTWVMgTXEgKi8KKyAgd2hpbGUoIE5VTEwgIT0gKHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmcFNjaGVkQ29udGV4dC0+c3lzVHhNcSkgKSkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLAorICAgICAgICAgICAgICAgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiJXM6IEZyZWVpbmcgVFggU1lTIG1lc3NhZ2UgdHlwZSAlZCIsX19mdW5jX18sCisgICAgICAgICAgICAgICBwTXNnV3JhcHBlci0+cFZvc01zZy0+dHlwZSApOworICAgIHN5c1R4RnJlZU1zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKyAgICB2b3NfY29yZV9yZXR1cm5fbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXIpOworICB9CisgIC8qIEZsdXNoIHRoZSBUTCBNcSAqLworICB3aGlsZSggTlVMTCAhPSAocE1zZ1dyYXBwZXIgPSB2b3NfbXFfZ2V0KCZwU2NoZWRDb250ZXh0LT50bFR4TXEpICkpCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywKKyAgICAgICAgICAgICAgIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIiVzOiBGcmVlaW5nIFRYIFRMIE1TRyBtZXNzYWdlIHR5cGUgJWQiLF9fZnVuY19fLAorICAgICAgICAgICAgICAgcE1zZ1dyYXBwZXItPnBWb3NNc2ctPnR5cGUgKTsKKyAgICBXTEFOVExfVHhGcmVlTXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXItPnBWb3NNc2cpOworICAgIHZvc19jb3JlX3JldHVybl9tc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlcik7CisgIH0KKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgIC8qIEZsdXNoIHRoZSBTU0MgTXEgKi8KKyAgd2hpbGUoIE5VTEwgIT0gKHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmcFNjaGVkQ29udGV4dC0+c3NjVHhNcSkgKSkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLAorICAgICAgICAgICAgICAgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiJXM6IEZyZWVpbmcgVFggU1NDIE1TRyBtZXNzYWdlIHR5cGUgJWQiLF9fZnVuY19fLAorICAgICAgICAgICAgICAgcE1zZ1dyYXBwZXItPnBWb3NNc2ctPnR5cGUgKTsKKyAgICBXTEFOU1NDX0ZyZWVNc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlci0+cFZvc01zZyk7CisgICAgdm9zX2NvcmVfcmV0dXJuX21zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyKTsKKyAgfQorI2Vsc2UKKyAgLyogRmx1c2ggdGhlIFdESSBNcSAqLworICB3aGlsZSggTlVMTCAhPSAocE1zZ1dyYXBwZXIgPSB2b3NfbXFfZ2V0KCZwU2NoZWRDb250ZXh0LT53ZGlUeE1xKSApKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsCisgICAgICAgICAgICAgICBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICIlczogRnJlZWluZyBUWCBXREkgTVNHIG1lc3NhZ2UgdHlwZSAlZCIsX19mdW5jX18sCisgICAgICAgICAgICAgICBwTXNnV3JhcHBlci0+cFZvc01zZy0+dHlwZSApOworICAgIHN5c1R4RnJlZU1zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKyAgICB2b3NfY29yZV9yZXR1cm5fbXNnKHBTY2hlZENvbnRleHQtPnBWQ29udGV4dCwgcE1zZ1dyYXBwZXIpOworICB9CisgI2VuZGlmCit9IC8qIHZvc19zY2hlZF9mbHVzaF90eF9tcXMoKSAqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgVGhpcyBoZWxwZXIgZnVuY3Rpb24gZmx1c2hlcyBhbGwgdGhlIFJYIG1lc3NhZ2UgcXVldWVzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgdm9zX3NjaGVkX2ZsdXNoX3J4X21xcyAoIHBWb3NTY2hlZENvbnRleHQgcFNjaGVkQ29udGV4dCApCit7CisgIHBWb3NNc2dXcmFwcGVyIHBNc2dXcmFwcGVyID0gTlVMTDsKKyAgLyoKKyAgKiogSGVyZSBlYWNoIG9mIHRoZSBSWCB0aHJlYWQgTVEgc2hhbGwgYmUgZHJhaW5lZCBhbmQgcmV0dXJuZWQgdG8gdGhlCisgICoqIENvcmUuIEJlZm9yZSByZXR1cm5pbmcgYSB3cmFwcGVyIHRvIHRoZSBDb3JlLCB0aGUgVk9TIG1lc3NhZ2Ugc2hhbGwKKyAgKiogYmUgZnJlZWQgZmlyc3QKKyAgKi8KKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsCisgICAgICAgICAgICAgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzOiBGbHVzaGluZyB0aGUgUlggVGhyZWFkIG1lc3NhZ2UgcXVldWUiLF9fZnVuY19fKTsKKworICBpZiAoTlVMTCA9PSBwU2NoZWRDb250ZXh0KQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogcFNjaGVkQ29udGV4dCBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuOworICB9CisKKyAgd2hpbGUoIE5VTEwgIT0gKHBNc2dXcmFwcGVyID0gdm9zX21xX2dldCgmcFNjaGVkQ29udGV4dC0+d2RpUnhNcSkgKSkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLAorICAgICAgICAgICAgICAgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiJXM6IEZyZWVpbmcgUlggV0RJIE1TRyBtZXNzYWdlIHR5cGUgJWQiLF9fZnVuY19fLAorICAgICAgICAgICAgICAgcE1zZ1dyYXBwZXItPnBWb3NNc2ctPnR5cGUgKTsKKyAgICBzeXNUeEZyZWVNc2cocFNjaGVkQ29udGV4dC0+cFZDb250ZXh0LCBwTXNnV3JhcHBlci0+cFZvc01zZyk7CisgIH0KKworICB3aGlsZSggTlVMTCAhPSAocE1zZ1dyYXBwZXIgPSB2b3NfbXFfZ2V0KCZwU2NoZWRDb250ZXh0LT5zeXNSeE1xKSApKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsCisgICAgICAgICAgICAgICBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICIlczogRnJlZWluZyBSWCBTWVMgTVNHIG1lc3NhZ2UgdHlwZSAlZCIsX19mdW5jX18sCisgICAgICAgICAgICAgICBwTXNnV3JhcHBlci0+cFZvc01zZy0+dHlwZSApOworICAgIHN5c1R4RnJlZU1zZyhwU2NoZWRDb250ZXh0LT5wVkNvbnRleHQsIHBNc2dXcmFwcGVyLT5wVm9zTXNnKTsKKyAgfQorCit9Lyogdm9zX3NjaGVkX2ZsdXNoX3J4X21xcygpICovCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgVGhpcyBoZWxwZXIgZnVuY3Rpb24gaGVscHMgZGV0ZXJtaW5lIGlmIHRocmVhZCBpZCBpcyBvZiBUWCB0aHJlYWQKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHZvc19zY2hlZF9pc190eF90aHJlYWQoaW50IHRocmVhZElEKQoreworICAgLy8gTWFrZSBzdXJlIHRoYXQgVm9zIFNjaGVkdWxlciBjb250ZXh0IGhhcyBiZWVuIGluaXRpYWxpemVkCisgICBWT1NfQVNTRVJUKCBOVUxMICE9IGdwVm9zU2NoZWRDb250ZXh0KTsKKyAgIGlmIChncFZvc1NjaGVkQ29udGV4dCA9PSBOVUxMKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICIlczogZ3BWb3NTY2hlZENvbnRleHQgPT0gTlVMTCIsX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiAwOworICAgfQorICAgcmV0dXJuICgoZ3BWb3NTY2hlZENvbnRleHQtPlR4VGhyZWFkKSAmJiAodGhyZWFkSUQgPT0gZ3BWb3NTY2hlZENvbnRleHQtPlR4VGhyZWFkLT5waWQpKTsKK30KKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGhlbHBzIGRldGVybWluZSBpZiB0aHJlYWQgaWQgaXMgb2YgUlggdGhyZWFkCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCB2b3Nfc2NoZWRfaXNfcnhfdGhyZWFkKGludCB0aHJlYWRJRCkKK3sKKyAgIC8vIE1ha2Ugc3VyZSB0aGF0IFZvcyBTY2hlZHVsZXIgY29udGV4dCBoYXMgYmVlbiBpbml0aWFsaXplZAorICAgVk9TX0FTU0VSVCggTlVMTCAhPSBncFZvc1NjaGVkQ29udGV4dCk7CisgICBpZiAoZ3BWb3NTY2hlZENvbnRleHQgPT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiJXM6IGdwVm9zU2NoZWRDb250ZXh0ID09IE5VTEwiLF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIHJldHVybiAoKGdwVm9zU2NoZWRDb250ZXh0LT5SeFRocmVhZCkgJiYgKHRocmVhZElEID09IGdwVm9zU2NoZWRDb250ZXh0LT5SeFRocmVhZC0+cGlkKSk7Cit9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIHNjaGVkdWxlciBjb250ZXh0CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3BWb3NTY2hlZENvbnRleHQgZ2V0X3Zvc19zY2hlZF9jdHh0KHZvaWQpCit7CisgICAvL01ha2Ugc3VyZSB0aGF0IFZvcyBTY2hlZHVsZXIgY29udGV4dCBoYXMgYmVlbiBpbml0aWFsaXplZAorICAgaWYgKGdwVm9zU2NoZWRDb250ZXh0ID09IE5VTEwpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IGdwVm9zU2NoZWRDb250ZXh0ID09IE5VTEwiLF9fRlVOQ1RJT05fXyk7CisgICB9CisgICByZXR1cm4gKGdwVm9zU2NoZWRDb250ZXh0KTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIHdhdGNoZG9nIGNvbnRleHQKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworcFZvc1dhdGNoZG9nQ29udGV4dCBnZXRfdm9zX3dhdGNoZG9nX2N0eHQodm9pZCkKK3sKKyAgIC8vTWFrZSBzdXJlIHRoYXQgVm9zIFNjaGVkdWxlciBjb250ZXh0IGhhcyBiZWVuIGluaXRpYWxpemVkCisgICBpZiAoZ3BWb3NXYXRjaGRvZ0NvbnRleHQgPT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICIlczogZ3BWb3NXYXRjaGRvZ0NvbnRleHQgPT0gTlVMTCIsX19GVU5DVElPTl9fKTsKKyAgIH0KKyAgIHJldHVybiAoZ3BWb3NXYXRjaGRvZ0NvbnRleHQpOworfQorLyoqCisgIEBicmllZiB2b3Nfd2F0Y2hkb2dfd2xhbl9zaHV0ZG93bigpCisKKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2h1dGRvd24gV0xBTiBkcml2ZXIgZHVyaW5nIFNTUi4KKyAgQWRhcHRlcnMgYXJlIGRpc2FibGVkLCBhbmQgdGhlIHdhdGNoZG9nIHRhc2sgd2lsbCBiZSBzaWduYWxsZWQKKyAgdG8gc2h1dGRvd24gV0xBTiBkcml2ZXIuCisKKyAgQHBhcmFtCisgICAgICAgICBOT05FCisgIEByZXR1cm4KKyAgICAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUyAgIC0gT3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIE9wZXJhdGlvbiBmYWlsZWQuCisKKyovCitWT1NfU1RBVFVTIHZvc193YXRjaGRvZ193bGFuX3NodXRkb3duKHZvaWQpCit7CisgICAgdl9DT05URVhUX3QgcFZvc0NvbnRleHQgPSBOVUxMOworICAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSBOVUxMOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAiJXM6IFdMQU4gZHJpdmVyIGlzIHNodXR0aW5nIGRvd24gIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAoTlVMTCA9PSBncFZvc1dhdGNoZG9nQ29udGV4dCkKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAiJXM6IFdhdGNoZG9nIG5vdCBlbmFibGVkLiBMT0dQIGlnbm9yZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorCisgICAgcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfSERELCBOVUxMKTsKKyAgICBwSGRkQ3R4ID0gKGhkZF9jb250ZXh0X3QgKil2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9IREQsIHBWb3NDb250ZXh0ICk7CisgICAgaWYgKE5VTEwgPT0gcEhkZEN0eCkKKyAgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAiJXM6IEludmFsaWQgSEREIENvbnRleHQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBUYWtlIHRoZSBsb2NrIGhlcmUgKi8KKyAgICBzcGluX2xvY2soJmdwVm9zV2F0Y2hkb2dDb250ZXh0LT53ZExvY2spOworCisgICAgLyogcmV1c2UgdGhlIGV4aXN0aW5nICdyZXNldCBpbiBwcm9ncmVzcycgKi8KKyAgICBpZiAoZ3BWb3NXYXRjaGRvZ0NvbnRleHQtPnJlc2V0SW5Qcm9ncmVzcykKKyAgICB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICIlczogU2h1dGRvd24gYWxyZWFkeSBpbiBQcm9ncmVzcy4gSWdub3Jpbmcgc2lnbmFsaW5nIFdhdGNoZG9nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgLyogUmVsZWFzZSB0aGUgbG9jayBoZXJlICovCisgICAgICAgIHNwaW5fdW5sb2NrKCZncFZvc1dhdGNoZG9nQ29udGV4dC0+d2RMb2NrKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIH0KKyAgICAvKiByZXVzZSB0aGUgZXhpc3RpbmcgJ2xvZ3AgaW4gcHJvZ3Jlc3MnLCBldmVudGhvdWdoIGl0IGlzIG5vdAorICAgICAqIGV4YWN0bHkgdGhlIHNhbWUgKi8KKyAgICBlbHNlIGlmIChwSGRkQ3R4LT5pc0xvZ3BJblByb2dyZXNzKQorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgIiVzOiBzaHV0ZG93bi9yZS1pbml0IGFscmVhZHkgaW4gUHJvZ3Jlc3MuIElnbm9yaW5nIHNpZ25hbGluZyBXYXRjaGRvZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIC8qIFJlbGVhc2UgdGhlIGxvY2sgaGVyZSAqLworICAgICAgICBzcGluX3VubG9jaygmZ3BWb3NXYXRjaGRvZ0NvbnRleHQtPndkTG9jayk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9IAorCisgICAgLyogU2V0IHRoZSBmbGFncyBzbyB0aGF0IGFsbCBmdXR1cmUgQ01ENTMgYW5kIFdleHQgY29tbWFuZHMgZ2V0IGJsb2NrZWQgcmlnaHQgYXdheSAqLworICAgIHZvc19zZXRfbG9ncF9pbl9wcm9ncmVzcyhWT1NfTU9EVUxFX0lEX1ZPU1MsIFRSVUUpOworICAgIHBIZGRDdHgtPmlzTG9ncEluUHJvZ3Jlc3MgPSBUUlVFOworCisgICAgLyogUmVsZWFzZSB0aGUgbG9jayBoZXJlICovCisgICAgc3Bpbl91bmxvY2soJmdwVm9zV2F0Y2hkb2dDb250ZXh0LT53ZExvY2spOworCisgICAgaWYgKHBIZGRDdHgtPmlzTG9hZFVubG9hZEluUHJvZ3Jlc3MpCisgICAgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBMb2FkL3VubG9hZCBpbiBQcm9ncmVzcy4gSWdub3Jpbmcgc2lnbmFsaW5nIFdhdGNoZG9nIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorICAgIC8qIFVwZGF0ZSBSaXZhIFJlc2V0IFN0YXRpc3RpY3MgKi8KKyAgICBwSGRkQ3R4LT5oZGRSaXZhUmVzZXRTdGF0cysrOworI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECisgICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IGhkZF93bGFuX3Jlc2V0X2luaXRpYWxpemF0aW9uKCkpCisgICAgeworICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgfQorI2VuZGlmCisKKyAgICBzZXRfYml0KFdEX1dMQU5fU0hVVERPV05fRVZFTlRfTUFTSywgJmdwVm9zV2F0Y2hkb2dDb250ZXh0LT53ZEV2ZW50RmxhZyk7CisgICAgc2V0X2JpdChXRF9QT1NUX0VWRU5UX01BU0ssICZncFZvc1dhdGNoZG9nQ29udGV4dC0+d2RFdmVudEZsYWcpOworICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3BWb3NXYXRjaGRvZ0NvbnRleHQtPndkV2FpdFF1ZXVlKTsKKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICBAYnJpZWYgdm9zX3dhdGNoZG9nX3dsYW5fcmVfaW5pdCgpCisKKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmUtaW5pdGlhbGl6ZSBXTEFOIGRyaXZlciwgYW5kIHRoaXMgaXMKKyAgY2FsbGVkIHdoZW4gUml2YSBTUyByZWJvb3RzLgorCisgIEBwYXJhbQorICAgICAgICAgTk9ORQorICBAcmV0dXJuCisgICAgICAgICBWT1NfU1RBVFVTX1NVQ0NFU1MgICAtIE9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBPcGVyYXRpb24gZmFpbGVkLgorCisqLworVk9TX1NUQVRVUyB2b3Nfd2F0Y2hkb2dfd2xhbl9yZV9pbml0KHZvaWQpCit7CisgICAgLyogd2F0Y2hkb2cgdGFzayBpcyBzdGlsbCBydW5uaW5nLCBpdCBpcyBub3QgY2xvc2VkIGluIHNodXRkb3duICovCisgICAgc2V0X2JpdChXRF9XTEFOX1JFSU5JVF9FVkVOVF9NQVNLLCAmZ3BWb3NXYXRjaGRvZ0NvbnRleHQtPndkRXZlbnRGbGFnKTsKKyAgICBzZXRfYml0KFdEX1BPU1RfRVZFTlRfTUFTSywgJmdwVm9zV2F0Y2hkb2dDb250ZXh0LT53ZEV2ZW50RmxhZyk7CisgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZncFZvc1dhdGNoZG9nQ29udGV4dC0+d2RXYWl0UXVldWUpOworCisgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9zcmMvdm9zX3NjaGVkLmggYi9DT1JFL1ZPU1Mvc3JjL3Zvc19zY2hlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OWJiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1Mvc3JjL3Zvc19zY2hlZC5oCkBAIC0wLDAgKzEsNTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1ZPU19TQ0hFRF9IICkKKyNkZWZpbmUgX19WT1NfU0NIRURfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgdm9zX3NjaGVkLmgKKyAgCisgIFxicmllZiB2aXJ0dWFsIE9wZXJhdGluZyBTeXN0ZW0gU2VydmllcyAodk9TUykKKyAgICAgICAgICAgICAgIAorICAgRGVmaW5pdGlvbnMgZm9yIHNvbWUgb2YgdGhlIGludGVybmFsIGRhdGEgdHlwZSB0aGF0IGlzIGludGVybmFsbHkgdXNlZCAKKyAgIGJ5IHRoZSB2T1NTIHNjaGVkdWxlciBvbiBXaW5kb3dzIE1vYmlsZS4KKyAgIAorICAgVGhpcyBmaWxlIGRlZmluZXMgYSB2T1NTIG1lc3NhZ2UgcXVldWUgb24gV2luIE1vYmlsZSBhbmQgZ2l2ZSBzb21lCisgICBpbnNpZ2h0cyBhYm91dCBob3cgdGhlIHNjaGVkdWxlciBpbXBsZW1lbnRzIHRoZSBleGVjdXRpb24gbW9kZWwgc3VwcG9ydGVkCisgICBieSB2T1NTLgorICAgIAorICAKKyAgIENvcHlyaWdodCAyMDA4IChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgIAorICAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUgCisgICAKKyAgIAorICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4gCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuIAorICAgCisgICAKKyAgJEhlYWRlcjokICREYXRlVGltZTogJCAkQXV0aG9yOiAkIAorICAgCisgICAKKyAgd2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkgCisgIC0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAwOS8xNS8wOCAgICBsYWMgICAgUmVtb3ZlZCBoYXJkY29kZWQgI2RlZmluZSBmb3IgVk9TX1RSQUNFLgorICAwNi8xMi8wOCAgICBoYmEgICAgQ3JlYXRlZCBtb2R1bGUuIAorICAgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx2b3NfZXZlbnQuaD4KKyNpbmNsdWRlICJpX3Zvc190eXBlcy5oIgorI2luY2x1ZGUgImlfdm9zX3BhY2tldC5oIgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgorI2luY2x1ZGUgPHZvc19wb3dlci5oPgorCisjZGVmaW5lIFRYX1BPU1RfRVZFTlRfTUFTSyAgICAgICAgICAgICAgIDB4MDAxCisjZGVmaW5lIFRYX1NVU1BFTkRfRVZFTlRfTUFTSyAgICAgICAgICAgIDB4MDAyCisjZGVmaW5lIE1DX1BPU1RfRVZFTlRfTUFTSyAgICAgICAgICAgICAgIDB4MDAxCisjZGVmaW5lIE1DX1NVU1BFTkRfRVZFTlRfTUFTSyAgICAgICAgICAgIDB4MDAyCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisjZGVmaW5lIFJYX1BPU1RfRVZFTlRfTUFTSyAgICAgICAgICAgICAgIDB4MDAxCisjZGVmaW5lIFJYX1NVU1BFTkRfRVZFTlRfTUFTSyAgICAgICAgICAgIDB4MDAyCisjZW5kaWYKKyNkZWZpbmUgVFhfU0hVVERPV05fRVZFTlRfTUFTSyAgICAgICAgICAgMHgwMTAKKyNkZWZpbmUgTUNfU0hVVERPV05fRVZFTlRfTUFTSyAgICAgICAgICAgMHgwMTAKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNkZWZpbmUgUlhfU0hVVERPV05fRVZFTlRfTUFTSyAgICAgICAgICAgMHgwMTAKKyNlbmRpZgorI2RlZmluZSBXRF9QT1NUX0VWRU5UX01BU0sgICAgICAgICAgICAgICAweDAwMQorI2RlZmluZSBXRF9TSFVURE9XTl9FVkVOVF9NQVNLICAgICAgICAgICAweDAwMgorI2RlZmluZSBXRF9DSElQX1JFU0VUX0VWRU5UX01BU0sgICAgICAgICAweDAwNAorI2RlZmluZSBXRF9XTEFOX1NIVVRET1dOX0VWRU5UX01BU0sgICAgICAweDAwOAorI2RlZmluZSBXRF9XTEFOX1JFSU5JVF9FVkVOVF9NQVNLICAgICAgICAweDAxMAorCisgCisgCisvKgorKiogTWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgaW4gdGhlIHN5c3RlbQorKiogVGhlc2UgYXJlIGJ1ZmZlcnMgdG8gYWNjb3VudCBmb3IgYWxsIGN1cnJlbnQgbWVzc2FnZXMgCisqKiB3aXRoIHNvbWUgYWNjb3VudGluZyBvZiB3aGF0IHdlIHRoaW5rIGlzIGEgCisqKiB3b3JzdC1jYXNlIHNjZW5hcmlvLiAgTXVzdCBiZSBhYmxlIHRvIGhhbmRsZSBhbGwKKyoqIGluY29taW5nIGZyYW1lcywgYXMgd2VsbCBhcyBvdmVyaGVhZCBmb3IgaW50ZXJuYWwKKyoqIG1lc3NhZ2luZworKi8KKyNkZWZpbmUgVk9TX0NPUkVfTUFYX01FU1NBR0VTICAgICAgICAgICAoVlBLVF9OVU1fUlhfUkFXX1BBQ0tFVFMgKyAzMikKKworCisvKgorKiogdk9TUyBNZXNzYWdlIHF1ZXVlIGRlZmluaXRpb24uCisqLwordHlwZWRlZiBzdHJ1Y3QgX1Zvc01xVHlwZQoreworICAvKiBMb2NrIHVzZSB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhpcyBtZXNzYWdlIHF1ZXVlICovCisgIHNwaW5sb2NrX3QgICAgICAgbXFMb2NrOworCisgIC8qIExpc3Qgb2Ygdk9TIE1lc3NhZ2VzIHdhaXRpbmcgb24gdGhpcyBxdWV1ZSAqLworICBzdHJ1Y3QgbGlzdF9oZWFkICBtcUxpc3Q7CisKK30gVm9zTXFUeXBlLCAqcFZvc01xVHlwZTsKKworCisvKgorKiogdk9TUyBTY2hlZHVsZXIgY29udGV4dAorKiogVGhlIHNjaGVkdWxlciBjb250ZXh0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CisqKiAgICoqIHRoZSBtZXNzYWdlcyBxdWV1ZXMKKyoqICAgKiogdGhlIGhhbmRsZSB0byB0aGUgdHJlYWQKKyoqICAgKiogcG9pbnRlciB0byB0aGUgZXZlbnRzIHRoYXQgZ3JhY2VmdWxseSBzaHV0ZG93biB0aGUgTUMgYW5kIFR4IHRocmVhZHMKKyoqICAgIAorKi8KK3R5cGVkZWYgc3RydWN0IF9Wb3NTY2hlZENvbnRleHQKK3sKKyAgLyogUGxhY2UgaG9sZGVyIHRvIHRoZSBWT1NTIENvbnRleHQgKi8gCisgICB2X1BWT0lEX3QgICAgICAgICAgIHBWQ29udGV4dDsgCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAvKiBIQUwgTWVzc2FnZSBxdWV1ZSBvbiB0aGUgTWFpbiB0aHJlYWQqLworICAgVm9zTXFUeXBlICAgICAgICAgICBoYWxNY01xOworI2Vsc2UKKyAgLyogV0RBIE1lc3NhZ2UgcXVldWUgb24gdGhlIE1haW4gdGhyZWFkKi8KKyAgIFZvc01xVHlwZSAgICAgICAgICAgd2RhTWNNcTsKKyNlbmRpZgorCisKKworICAgLyogUEUgTWVzc2FnZSBxdWV1ZSBvbiB0aGUgTWFpbiB0aHJlYWQqLworICAgVm9zTXFUeXBlICAgICAgICAgICBwZU1jTXE7CisKKyAgIC8qIFNNRSBNZXNzYWdlIHF1ZXVlIG9uIHRoZSBNYWluIHRocmVhZCovCisgICBWb3NNcVR5cGUgICAgICAgICAgIHNtZU1jTXE7CisKKyAgIC8qIFRMIE1lc3NhZ2UgcXVldWUgb24gdGhlIE1haW4gdGhyZWFkICovCisgICBWb3NNcVR5cGUgICAgICAgICAgIHRsTWNNcTsKKworICAgLyogU1lTIE1lc3NhZ2UgcXVldWUgb24gdGhlIE1haW4gdGhyZWFkICovCisgICBWb3NNcVR5cGUgICAgICAgICAgIHN5c01jTXE7CisKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAvKiBTU0MgTWVzc2FnZSBxdWV1ZSBvbiB0aGUgVHggKi8KKyAgIFZvc01xVHlwZSAgICAgICAgICAgc3NjVHhNcTsKKyNlbHNlCisgIC8qIFdESSBNZXNzYWdlIHF1ZXVlIG9uIHRoZSBNYWluIHRocmVhZCovCisgICBWb3NNcVR5cGUgICAgICAgICAgIHdkaU1jTXE7CisKKyAgIC8qIFdESSBNZXNzYWdlIHF1ZXVlIG9uIHRoZSBUeCBUaHJlYWQqLworICAgVm9zTXFUeXBlICAgICAgICAgICB3ZGlUeE1xOworCisgICAvKiBXREkgTWVzc2FnZSBxdWV1ZSBvbiB0aGUgUnggVGhyZWFkKi8KKyAgIFZvc01xVHlwZSAgICAgICAgICAgd2RpUnhNcTsKKyNlbmRpZgorCisgICAvKiBUTCBNZXNzYWdlIHF1ZXVlIG9uIHRoZSBUeCB0aHJlYWQgKi8KKyAgIFZvc01xVHlwZSAgICAgICAgICAgdGxUeE1xOworCisgICAvKiBTWVMgTWVzc2FnZSBxdWV1ZSBvbiB0aGUgVHggdGhyZWFkICovCisgICBWb3NNcVR5cGUgICAgICAgICAgIHN5c1R4TXE7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIFZvc01xVHlwZSAgICAgICAgICAgc3lzUnhNcTsKKyNlbmRpZgorCisgICAvKiBIYW5kbGUgb2YgRXZlbnQgZm9yIE1DIHRocmVhZCB0byBzaWduYWwgc3RhcnR1cCAqLworICAgc3RydWN0IGNvbXBsZXRpb24gICBNY1N0YXJ0RXZlbnQ7CisKKyAgIC8qIEhhbmRsZSBvZiBFdmVudCBmb3IgVHggdGhyZWFkIHRvIHNpZ25hbCBzdGFydHVwICovCisgICBzdHJ1Y3QgY29tcGxldGlvbiAgIFR4U3RhcnRFdmVudDsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgLyogSGFuZGxlIG9mIEV2ZW50IGZvciBSeCB0aHJlYWQgdG8gc2lnbmFsIHN0YXJ0dXAgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uICAgUnhTdGFydEV2ZW50OworI2VuZGlmCisKKyAgIHN0cnVjdCB0YXNrX3N0cnVjdCogTWNUaHJlYWQ7CisKKyAgIC8qIFRYIFRocmVhZCBoYW5kbGUgKi8KKyAgIAorICAgc3RydWN0IHRhc2tfc3RydWN0KiAgIFR4VGhyZWFkOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAvKiBSWCBUaHJlYWQgaGFuZGxlICovCisgICBzdHJ1Y3QgdGFza19zdHJ1Y3QqICAgUnhUaHJlYWQ7CisjZW5kaWYKKworCisgICAvKiBjb21wbGV0aW9uIG9iamVjdCBmb3IgTUMgdGhyZWFkIHNodXRkb3duICovCisgICBzdHJ1Y3QgY29tcGxldGlvbiAgIE1jU2h1dGRvd247IAorCisgICAvKiBjb21wbGV0aW9uIG9iamVjdCBmb3IgVHggdGhyZWFkIHNodXRkb3duICovCisgICBzdHJ1Y3QgY29tcGxldGlvbiAgIFR4U2h1dGRvd247IAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAvKiBjb21wbGV0aW9uIG9iamVjdCBmb3IgUnggdGhyZWFkIHNodXRkb3duICovCisgICBzdHJ1Y3QgY29tcGxldGlvbiAgIFJ4U2h1dGRvd247CisjZW5kaWYKKworICAgLyogV2FpdCBxdWV1ZSBmb3IgTUMgdGhyZWFkICovCisgICB3YWl0X3F1ZXVlX2hlYWRfdCBtY1dhaXRRdWV1ZTsKKworICAgdW5zaWduZWQgbG9uZyAgICAgbWNFdmVudEZsYWc7CisKKyAgIC8qIFdhaXQgcXVldWUgZm9yIFR4IHRocmVhZCAqLworICAgd2FpdF9xdWV1ZV9oZWFkX3QgdHhXYWl0UXVldWU7CisKKyAgIHVuc2lnbmVkIGxvbmcgICAgIHR4RXZlbnRGbGFnOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAvKiBXYWl0IHF1ZXVlIGZvciBSeCB0aHJlYWQgKi8KKyAgIHdhaXRfcXVldWVfaGVhZF90IHJ4V2FpdFF1ZXVlOworCisgICB1bnNpZ25lZCBsb25nICAgICByeEV2ZW50RmxhZzsKKyNlbmRpZgorICAgCisgICAvKiBDb21wbGV0aW9uIG9iamVjdCB0byByZXN1bWUgTWMgdGhyZWFkICovCisgICBzdHJ1Y3QgY29tcGxldGlvbiBSZXN1bWVNY0V2ZW50OworCisgICAvKiBDb21wbGV0aW9uIG9iamVjdCB0byByZXN1bWUgVHggdGhyZWFkICovCisgICBzdHJ1Y3QgY29tcGxldGlvbiBSZXN1bWVUeEV2ZW50OworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICAvKiBDb21wbGV0aW9uIG9iamVjdCB0byByZXN1bWUgUnggdGhyZWFkICovCisgICBzdHJ1Y3QgY29tcGxldGlvbiBSZXN1bWVSeEV2ZW50OworI2VuZGlmCisKKyAgIC8qIGxvY2sgdG8gbWFrZSBzdXJlIHRoYXQgTWNUaHJlYWQgYW5kIFR4VGhyZWFkIFN1c3BlbmQvcmVzdW1lIG1lY2hhbmlzbSBpcyBpbiBzeW5jKi8KKyAgIHNwaW5sb2NrX3QgTWNUaHJlYWRMb2NrOworICAgc3BpbmxvY2tfdCBUeFRocmVhZExvY2s7CisgICBzcGlubG9ja190IFJ4VGhyZWFkTG9jazsKKworfSBWb3NTY2hlZENvbnRleHQsICpwVm9zU2NoZWRDb250ZXh0OworCisvKgorKiogVk9TUyB3YXRjaGRvZyBjb250ZXh0CisqKiBUaGUgd2F0Y2hkb2cgY29udGV4dCBjb250YWlucyB0aGUgZm9sbG93aW5nOgorKiogVGhlIG1lc3NhZ2VzIHF1ZXVlcyBhbmQgZXZlbnRzCisqKiBUaGUgaGFuZGxlIHRvIHRoZSB0aHJlYWQKKyoqICAgIAorKi8KK3R5cGVkZWYgc3RydWN0IF9Wb3NXYXRjaGRvZ0NvbnRleHQKK3sKKworICAgLyogUGxhY2UgaG9sZGVyIHRvIHRoZSBWT1NTIENvbnRleHQgKi8gCisgICB2X1BWT0lEX3QgcFZDb250ZXh0OyAKKworICAgLyogSGFuZGxlIG9mIEV2ZW50IGZvciBXYXRjaGRvZyB0aHJlYWQgdG8gc2lnbmFsIHN0YXJ0dXAgKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIFdkU3RhcnRFdmVudDsKKworICAgLyogV2F0Y2hkb2cgVGhyZWFkIGhhbmRsZSAqLworICAKKyAgIHN0cnVjdCB0YXNrX3N0cnVjdCogV2RUaHJlYWQ7CisKKyAgIC8qIGNvbXBsZXRpb24gb2JqZWN0IGZvciBXYXRjaGRvZyB0aHJlYWQgc2h1dGRvd24gKi8KKyAgIHN0cnVjdCBjb21wbGV0aW9uIFdkU2h1dGRvd247IAorCisgICAvKiBXYWl0IHF1ZXVlIGZvciBXYXRjaGRvZyB0aHJlYWQgKi8KKyAgIHdhaXRfcXVldWVfaGVhZF90IHdkV2FpdFF1ZXVlOworCisgICAvKiBFdmVudCBmbGFnIGZvciBldmVudHMgaGFuZGxlZCBieSBXYXRjaGRvZyAqLworICAgdW5zaWduZWQgbG9uZyB3ZEV2ZW50RmxhZzsKKworICAgdl9CT09MX3QgcmVzZXRJblByb2dyZXNzOworCisgICB2b3NfY2hpcF9yZXNldF9yZWFzb25fdHlwZSByZWFzb247CisKKyAgIC8qIExvY2sgZm9yIHByZXZlbnRpbmcgbXVsdGlwbGUgcmVzZXQgYmVpbmcgdHJpZ2dlcmVkIHNpbXVsdGFuZW91c2x5ICovCisgICBzcGlubG9ja190IHdkTG9jazsKKworfSBWb3NXYXRjaGRvZ0NvbnRleHQsICpwVm9zV2F0Y2hkb2dDb250ZXh0OworCisvKgorKiogdk9TUyBTY2hlZCBNc2cgV3JhcHBlcgorKiogV3JhcHBlciBtZXNzYWdlcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGNoYWluZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBxdWV1ZQorKiogaW4gdGhlIHNjaGVkdWxlci4KKyovCit0eXBlZGVmIHN0cnVjdCBfVm9zTXNnV3JhcHBlcgoreworICAgLyogTWVzc2FnZSBub2RlICovCisgICBzdHJ1Y3QgbGlzdF9oZWFkICBtc2dOb2RlOworCisgICAvKiB0aGUgVm9zIG1lc3NhZ2UgaXQgaXMgYXNzb2NpYXRlZCB0byAqLworICAgdm9zX21zZ190ICAgICpwVm9zTXNnOworCit9IFZvc01zZ1dyYXBwZXIsICpwVm9zTXNnV3JhcHBlcjsKKworCisKK3R5cGVkZWYgc3RydWN0IF9Wb3NDb250ZXh0VHlwZQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAvKiBNZXNzYWdlcyBidWZmZXJzICovCisgICB2b3NfbXNnX3QgICAgICAgICAgIGFNc2dCdWZmZXJzW1ZPU19DT1JFX01BWF9NRVNTQUdFU107CisKKyAgIFZvc01zZ1dyYXBwZXIgICAgICAgYU1zZ1dyYXBwZXJzW1ZPU19DT1JFX01BWF9NRVNTQUdFU107CisgICAKKyAgIC8qIEZyZWUgTWVzc2FnZSBxdWV1ZSovCisgICBWb3NNcVR5cGUgICAgICAgICAgIGZyZWVWb3NNcTsKKworICAgLyogU2NoZWR1bGVyIENvbnRleHQgKi8KKyAgIFZvc1NjaGVkQ29udGV4dCAgICAgdm9zU2NoZWQ7CisKKyAgIC8qIFdhdGNoZG9nIENvbnRleHQgKi8KKyAgIFZvc1dhdGNoZG9nQ29udGV4dCAgdm9zV2F0Y2hkb2c7CisKKyAgIC8qIEhERCBNb2R1bGUgQ29udGV4dCAgKi8KKyAgIHZfVk9JRF90ICAgICAgICAgICAqcEhERENvbnRleHQ7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAvKiBIREQgU29mdEFQIE1vZHVsZSBDb250ZXh0ICAqLworICAgdl9WT0lEX3QgICAgICAgICAgICpwSEREU29mdEFQQ29udGV4dDsKKyNlbmRpZgorCisgICAvKiBUTCBNb2R1bGUgQ29udGV4dCAgKi8KKyAgIHZfVk9JRF90ICAgICAgICAgICAqcFRMQ29udGV4dDsKKworICAgLyogTUFDIE1vZHVsZSBDb250ZXh0ICAqLworICAgdl9WT0lEX3QgICAgICAgICAgICpwTUFDQ29udGV4dDsKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgICAvKiBCQUwgIENvbnRleHQgICovCisKKyAgIHZfVk9JRF90ICAgICAgICAgICAqcEJBTENvbnRleHQ7CisgICAKKyAgIC8qIFNBTCBDb250ZXh0ICovCisgICB2X1ZPSURfdCAgICAgICAgICAgKnBTQUxDb250ZXh0OworCisgICAvKiBTU0MgQ29udGV4dCAqLworICAgdl9WT0lEX3QgICAgICAgICAgICpwU1NDQ29udGV4dDsKKyNlbmRpZgorICAgLyogQkFQIENvbnRleHQgKi8KKyAgIHZfVk9JRF90ICAgICAgICAgICAqcEJBUENvbnRleHQ7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFICAgCisgICAvKiBTQVAgQ29udGV4dCAqLworICAgdl9WT0lEX3QgICAgICAgICAgICpwU0FQQ29udGV4dDsKKyNlbmRpZgorICAgCisgICAvKiBWT1MgUGFja2V0IENvbnRleHQgKi8KKyAgIHZvc19wa3RfY29udGV4dF90ICAgdm9zUGFja2V0OyAKKworICAgdm9zX2V2ZW50X3QgICAgICAgICBQcm9iZUV2ZW50OworCisgICB2b2xhdGlsZSB2X1U4X3QgICAgIGlzTG9ncEluUHJvZ3Jlc3M7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIHZvc19ldmVudF90ICAgICAgICAgd2RhQ29tcGxldGVFdmVudDsKKworICAgLyogV0RBIENvbnRleHQgKi8KKyAgIHZfVk9JRF90ICAgICAgICAgICAgKnBXREFDb250ZXh0OworI2VuZGlmCisKKyAgIHZvbGF0aWxlIHZfVThfdCAgICBpc0xvYWRVbmxvYWRJblByb2dyZXNzOworCit9IFZvc0NvbnRleHRUeXBlLCAqcFZvc0NvbnRleHRUeXBlOworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhbmQgZG9jdW1lbmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIAoraW50IHZvc19zY2hlZF9pc190eF90aHJlYWQoaW50IHRocmVhZElEKTsKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKK2ludCB2b3Nfc2NoZWRfaXNfcnhfdGhyZWFkKGludCB0aHJlYWRJRCk7CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3NjaGVkX29wZW4oKSAtIGluaXRpYWxpemUgdGhlIHZPU1MgU2NoZWR1bGVyICAKKyAgICAKKyAgVGhlIFxhIHZvc19zY2hlZF9vcGVuKCkgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHZPU1MgU2NoZWR1bGVyCisgIFVwb24gc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbjoKKyAgCisgICAgIC0gQWxsIHRoZSBtZXNzYWdlIHF1ZXVlcyBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgCisgICAgIC0gVGhlIE1haW4gQ29udHJvbGxlciB0aHJlYWQgaXMgY3JlYXRlZCBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBhbmQKKyAgICAgICBkaXNwYXRjaCBtZXNzYWdlcy4KKyAgICAgCisgICAgIC0gVGhlIFR4IHRocmVhZCBpcyBjcmVhdGVkIGFuZCByZWFkeSB0byByZWNlaXZlIGFuZCBkaXNwYXRjaCBtZXNzYWdlcworICAgICAgCisgIAorICBccGFyYW0gIHBWb3NDb250ZXh0IC0gcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZPU1MgQ29udGV4dAorICAKKyAgXHBhcmFtICBwVm9zU2NoZWRDb250ZXh0IC0gcG9pbnRlciB0byBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ1ZmZlciBiaWcKKyAgICAgICAgICBlbm91Z2ggdG8gaG9sZCBhIHNjaGVkdWxlciBjb250ZXh0LiAgICAgICAKKyAgXAorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBTY2hlZHVsZXIgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQgCisgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKyAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX1JFU09VUkNFUyAtIFN5c3RlbSByZXNvdXJjZXMgKG90aGVyIHRoYW4gbWVtb3J5KSAKKyAgICAgICAgICBhcmUgdW5hdmFpbGFibGUgdG8gaW5pdGlsaXplIHRoZSBzY2hlZHVsZXIKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9OT01FTSAtIGluc3VmZmljaWVudCBtZW1vcnkgZXhpc3RzIHRvIGluaXRpYWxpemUgCisgICAgICAgICAgdGhlIHNjaGVkdWxlcgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIEludmFsaWQgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgc2NoZWR1bGVyIE9wZW4KKyAgICAgICAgICBmdW5jdGlvbiAKKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgc2NoZWR1bGVyLyAgIAorICAgICAgICAgIAorICBcc2Egdm9zX3NjaGVkX29wZW4oKQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19zY2hlZF9vcGVuKCB2X1BWT0lEX3QgcFZvc0NvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZvc1NjaGVkQ29udGV4dCBwU2NoZWRDeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1NJWkVfdCBTY2hlZEN0eFNpemUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc193YXRjaGRvZ19vcGVuKCkgLSBpbml0aWFsaXplIHRoZSB2T1NTIHdhdGNoZG9nICAKKyAgICAKKyAgVGhlIFxhIHZvc193YXRjaGRvZ19vcGVuKCkgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHZPU1Mgd2F0Y2hkb2cuIFVwb24gc3VjY2Vzc2Z1bCAKKyAgICAgICAgaW5pdGlhbGl6YXRpb24sIHRoZSB3YXRjaGRvZyB0aHJlYWQgaXMgY3JlYXRlZCBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBhbmQgIHByb2Nlc3MgbWVzc2FnZXMuCisgICAgIAorICAgCisgIFxwYXJhbSAgcFZvc0NvbnRleHQgLSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdk9TUyBDb250ZXh0CisgIAorICBccGFyYW0gIHBXZENvbnRleHQgLSBwb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVyIGJpZworICAgICAgICAgIGVub3VnaCB0byBob2xkIGEgd2F0Y2hkb2cgY29udGV4dC4gICAgICAgCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBXYXRjaGRvZyB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZCAKKyAgICAgICAgICBpcyByZWFkeSB0byBiZSB1c2VkLgorICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpIAorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZSB0byBpbml0aWxpemUgdGhlIFdhdGNoZG9nCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfTk9NRU0gLSBpbnN1ZmZpY2llbnQgbWVtb3J5IGV4aXN0cyB0byBpbml0aWFsaXplIAorICAgICAgICAgIHRoZSBXYXRjaGRvZworICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIEludmFsaWQgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgV2F0Y2hkb2cgT3BlbgorICAgICAgICAgIGZ1bmN0aW9uIAorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gRmFpbHVyZSB0byBpbml0aWFsaXplIHRoZSBXYXRjaGRvZy8gICAKKworICBcc2Egdm9zX3dhdGNoZG9nX29wZW4oKQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1ZPU19TVEFUVVMgdm9zX3dhdGNoZG9nX29wZW4KKworKAorICB2X1BWT0lEX3QgICAgICAgICAgIHBWb3NDb250ZXh0LAorICBwVm9zV2F0Y2hkb2dDb250ZXh0IHBXZENvbnRleHQsCisgIHZfU0laRV90ICAgICAgICAgICAgd2RDdHhTaXplCispOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc19zY2hlZF9jbG9zZSgpIC0gQ2xvc2UgdGhlIHZPU1MgU2NoZWR1bGVyICAKKyAgICAKKyAgVGhlIFxhIHZvc19zY2hlZF9jbG9zZXMoKSBmdW5jdGlvbiBjbG9zZXMgdGhlIHZPU1MgU2NoZWR1bGVyCisgIFVwb24gc3VjY2Vzc2Z1bCBjbG9zaW5nOgorICAKKyAgICAgLSBBbGwgdGhlIG1lc3NhZ2UgcXVldWVzIGFyZSBmbHVzaGVkCisgICAgIAorICAgICAtIFRoZSBNYWluIENvbnRyb2xsZXIgdGhyZWFkIGlzIGNsb3NlZAorICAgICAKKyAgICAgLSBUaGUgVHggdGhyZWFkIGlzIGNsb3NlZAorICAgICAgCisgIAorICBccGFyYW0gIHBWb3NDb250ZXh0IC0gcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZPU1MgQ29udGV4dAorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBTY2hlZHVsZXIgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQgCisgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBJbnZhbGlkIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIHNjaGVkdWxlciBPcGVuCisgICAgICAgICAgZnVuY3Rpb24gCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBGYWlsdXJlIHRvIGluaXRpYWxpemUgdGhlIHNjaGVkdWxlci8gICAKKyAgICAgICAgICAKKyAgXHNhIHZvc19zY2hlZF9jbG9zZSgpCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3NjaGVkX2Nsb3NlKCB2X1BWT0lEX3QgcFZvc0NvbnRleHQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc193YXRjaGRvZ19jbG9zZSgpIC0gQ2xvc2UgdGhlIHZPU1MgV2F0Y2hkb2cgIAorICAgIAorICBUaGUgXGEgdm9zX3dhdGNoZG9nX2Nsb3NlKCkgZnVuY3Rpb24gY2xvc2VzIHRoZSB2T1NTIFdhdGNoZG9nCisgIFVwb24gc3VjY2Vzc2Z1bCBjbG9zaW5nOgorICAKKyAgICAgLSBUaGUgV2F0Y2hkb2cgdGhyZWFkIGlzIGNsb3NlZAorICAgICAKKyAgICAgIAorICBccGFyYW0gIHBWb3NDb250ZXh0IC0gcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZPU1MgQ29udGV4dAorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBXYXRjaGRvZyB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZCAKKyAgICAgICAgICBpcyByZWFkeSB0byBiZSB1c2VkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIEludmFsaWQgcGFyYW1ldGVyIHBhc3NlZCAKKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgV2F0Y2hkb2cvICAgCisgICAgICAgICAgCisgIFxzYSB2b3Nfd2F0Y2hkb2dfY2xvc2UoKQorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc193YXRjaGRvZ19jbG9zZSAoIHZfUFZPSURfdCBwVm9zQ29udGV4dCApOworCisvKiBIZWxwZXIgcm91dGluZXMgcHJvdmlkZWQgdG8gb3RoZXIgVk9TIEFQSSdzICovCitWT1NfU1RBVFVTIHZvc19tcV9pbml0KHBWb3NNcVR5cGUgcE1xKTsKK3ZvaWQgdm9zX21xX2RlaW5pdChwVm9zTXFUeXBlIHBNcSk7Cit2b2lkIHZvc19tcV9wdXQocFZvc01xVHlwZSBwTXEsIHBWb3NNc2dXcmFwcGVyIHBNc2dXcmFwcGVyKTsKK3BWb3NNc2dXcmFwcGVyIHZvc19tcV9nZXQocFZvc01xVHlwZSBwTXEpOwordl9CT09MX3Qgdm9zX2lzX21xX2VtcHR5KHBWb3NNcVR5cGUgcE1xKTsKK3BWb3NTY2hlZENvbnRleHQgZ2V0X3Zvc19zY2hlZF9jdHh0KHZvaWQpOworcFZvc1dhdGNoZG9nQ29udGV4dCBnZXRfdm9zX3dhdGNoZG9nX2N0eHQodm9pZCk7CitWT1NfU1RBVFVTIHZvc19zY2hlZF9pbml0X21xcyAgIChwVm9zU2NoZWRDb250ZXh0IHBTY2hlZENvbnRleHQpOwordm9pZCB2b3Nfc2NoZWRfZGVpbml0X21xcyAocFZvc1NjaGVkQ29udGV4dCBwU2NoZWRDb250ZXh0KTsKK3ZvaWQgdm9zX3NjaGVkX2ZsdXNoX21jX21xcyAgKHBWb3NTY2hlZENvbnRleHQgcFNjaGVkQ29udGV4dCk7Cit2b2lkIHZvc19zY2hlZF9mbHVzaF90eF9tcXMgIChwVm9zU2NoZWRDb250ZXh0IHBTY2hlZENvbnRleHQpOworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQwordm9pZCB2b3Nfc2NoZWRfZmx1c2hfcnhfbXFzICAocFZvc1NjaGVkQ29udGV4dCBwU2NoZWRDb250ZXh0KTsKKyNlbmRpZgorVk9TX1NUQVRVUyB2b3Nfd2F0Y2hkb2dfY2hpcF9yZXNldCAoIHZvc19jaGlwX3Jlc2V0X3JlYXNvbl90eXBlIHJlYXNvbiApOwordm9pZCBjbGVhcldsYW5SZXNldFJlYXNvbih2b2lkKTsKKwordm9pZCB2b3NfdGltZXJfbW9kdWxlX2luaXQoIHZvaWQgKTsKK1ZPU19TVEFUVVMgdm9zX3dhdGNoZG9nX3dsYW5fc2h1dGRvd24odm9pZCk7CitWT1NfU1RBVFVTIHZvc193YXRjaGRvZ193bGFuX3JlX2luaXQodm9pZCk7CisKKyNlbmRpZiAvLyAjaWYgIWRlZmluZWQgX19WT1NTX1NDSEVEX0gKZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9zcmMvdm9zX3RocmVhZHMuYyBiL0NPUkUvVk9TUy9zcmMvdm9zX3RocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTFmYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL3NyYy92b3NfdGhyZWFkcy5jCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHZvc190aHJlYWRzLmMKKyAgCisgIFxicmllZiB2aXJ0dWFsIE9wZXJhdGluZyBTeXN0ZW0gU2VydmljZXMgKHZPU1MpIFRocmVhZGluZyBBUElzCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8dm9zX3RocmVhZHMuaD4KKyNpbmNsdWRlIDx2b3NfdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFR5cGUgZGVjbGFyYXRpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3Nfc2xlZXAoKSAtIHNsZWVwCisKKyAgVGhlIFxhIHZvc19zbGVlcCgpIGZ1bmN0aW9uIHN1c3BlbmRzIHRoZSBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgdGhyZWFkCisgIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZSBvdXQgaW50ZXJ2YWwgZWxhcHNlcy4KKyAgICAgCisgIFxwYXJhbSBtc0ludGVydmFsIC0gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQuCisgIEEgdmFsdWUgb2YgMCBtYXkgb3IgbWF5IG5vdCBjYXVzZSB0aGUgY3VycmVudCB0aHJlYWQgdG8geWllbGQuCisgIAorICBccmV0dXJuIE5vdGhpbmcuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9WT0lEX3Qgdm9zX3NsZWVwKCB2X1UzMl90IG1zSW50ZXJ2YWwgKQoreworICAgaWYgKGluX2ludGVycnVwdCgpKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0ISEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlKG1zSW50ZXJ2YWwpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3Nfc2xlZXBfdXMoKSAtIHNsZWVwCisKKyAgVGhlIFxhIHZvc19zbGVlcF91cygpIGZ1bmN0aW9uIHN1c3BlbmRzIHRoZSBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgdGhyZWFkCisgIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZSBvdXQgaW50ZXJ2YWwgZWxhcHNlcy4KKyAgICAgCisgIFxwYXJhbSB1c0ludGVydmFsIC0gdGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgdG8gc3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQuCisgIEEgdmFsdWUgb2YgMCBtYXkgb3IgbWF5IG5vdCBjYXVzZSB0aGUgY3VycmVudCB0aHJlYWQgdG8geWllbGQuCisgIAorICBccmV0dXJuIE5vdGhpbmcuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9WT0lEX3Qgdm9zX3NsZWVwX3VzKCB2X1UzMl90IHVzSW50ZXJ2YWwgKQoreworICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gdXNlY3NfdG9famlmZmllcyh1c0ludGVydmFsKSArIDE7CisgICBpZiAoaW5faW50ZXJydXB0KCkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQhISEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuOworICAgfQorICAgd2hpbGUgKHRpbWVvdXQgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgIHRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2J1c3lfd2FpdCgpIC0gYnVzeSB3YWl0CisKKyAgVGhlIFxhIHZvc19idXN5X3dhaXQoKSBmdW5jdGlvbiBwbGFjZXMgdGhlIGN1cnJlbnQgdGhyZWFkIGluIGJ1c3kgd2FpdAorICB1bnRpbCB0aGUgc3BlY2lmaWVkIHRpbWUgb3V0IGludGVydmFsIGVsYXBzZXMuIElmIHRoZSBpbnRlcnZhbCBpcyBncmVhdGVyCisgIHRoYW4gNTB1cyBvbiBXTSwgdGhlIGJlaGF2aW91ciBpcyB1bmRlZmluZWQuCisgICAgIAorICBccGFyYW0gdXNJbnRlcnZhbCAtIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHRvIGJ1c3kgd2FpdC4gCisgIAorICBccmV0dXJuIE5vdGhpbmcuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9WT0lEX3Qgdm9zX2J1c3lfd2FpdCggdl9VMzJfdCB1c0ludGVydmFsICkKK3sKKyAgICB1ZGVsYXkodXNJbnRlcnZhbCk7Cit9CmRpZmYgLS1naXQgYS9DT1JFL1ZPU1Mvc3JjL3Zvc190aW1lci5jIGIvQ09SRS9WT1NTL3NyYy92b3NfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQ0YjYxCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL3NyYy92b3NfdGltZXIuYwpAQCAtMCwwICsxLDg2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB2b3NfdGltZXIuYworICAKKyAgXGJyaWVmIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWVzICh2T1MpCisgICAgICAgICAgICAgICAKKyAgIERlZmluaXRpb25zIGZvciB2T1NTIFRpbWVyIHNlcnZpY2VzCisgIAorICAgQ29weXJpZ2h0IDIwMDggKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJEhlYWRlciQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbmNsdWRlIEZpbGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8dm9zX3RpbWVyLmg+CisjaW5jbHVkZSA8dm9zX2xvY2suaD4KKyNpbmNsdWRlIDx2b3NfYXBpLmg+CisjaW5jbHVkZSAid2xhbl9xY3Rfc3lzLmgiCisjaW5jbHVkZSAidm9zX3NjaGVkLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTElOVVhfVElNRVJfQ09PS0lFIDB4MTIzNDEyMzQKKyNkZWZpbmUgTElOVVhfSU5WQUxJRF9USU1FUl9DT09LSUUgMHhmZWVkZmFjZQorI2RlZmluZSBUTVJfSU5WQUxJRF9JRCAoIDAgKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBUeXBlIGRlY2xhcmF0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdW5zaWduZWQgaW50ICAgICAgICBwZXJzaXN0ZW50VGltZXJDb3VudCA9IDA7CitzdGF0aWMgdm9zX2xvY2tfdCAgICAgICAgICBwZXJzaXN0ZW50VGltZXJDb3VudExvY2s7CisvLyBzdGF0aWMgc2xlZXBfb2t0c19oYW5kbGUgICBzbGVlcENsaWVudEhhbmRsZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgYW5kIGRvY3VtZW5hdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gVEJEOiBOZWVkIHRvIGFkZCBjb2RlIGZvciBkZWZlcnJlZCB0aW1lcnMgaW1wbGVtZW50YXRpb24KKworLy8gY2xlYW4gdXAgdGltZXIgc3RhdGVzIGFmdGVyIGl0IGhhcyBiZWVuIGRlYWN0aXZhdGVkCisvLyBjaGVjayBhbmQgdHJ5IHRvIGFsbG93IHNsZWVwIGFmdGVyIGEgdGltZXIgaGFzIGJlZW4gc3RvcHBlZCBvciBleHBpcmVkCitzdGF0aWMgdm9pZCB0cnlBbGxvd2luZ1NsZWVwKCBWT1NfVElNRVJfVFlQRSB0eXBlICkKK3sKKyAgIGlmICggVk9TX1RJTUVSX1RZUEVfV0FLRV9BUFBTID09IHR5cGUgKQorICAgeworICAgICAvLyB2b3NfbG9ja19hY3F1aXJlKCAmcGVyc2lzdGVudFRpbWVyQ291bnRMb2NrICk7CisgICAgICBwZXJzaXN0ZW50VGltZXJDb3VudC0tOworICAgICAgaWYgKCAwID09IHBlcnNpc3RlbnRUaW1lckNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgIC8vIHNpbmNlIHRoZSBudW1iZXIgb2YgcGVyc2lzdGVudCB0aW1lcnMgaGFzIGRlY3JlYXNlZCBmcm9tIDEgdG8gMCwKKyAgICAgICAgIC8vIHRoZSB0aW1lciBzaG91bGQgYWxsb3cgc2xlZXAKKyAgICAgICAgIC8vc2xlZXBfYXNzZXJ0X29rdHMoIHNsZWVwQ2xpZW50SGFuZGxlICk7CisgICAgICB9CisgICAgICAvL3Zvc19sb2NrX3JlbGVhc2UoICZwZXJzaXN0ZW50VGltZXJDb3VudExvY2sgKTsKKyAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiAgdm9zX2xpbnV4X3RpbWVyX2NhbGxiYWNrKCkgLSBpbnRlcm5hbCB2b3MgZW50cnkgcG9pbnQgd2hpY2ggaXMgCisgICAgICAgICAgY2FsbGVkIHdoZW4gdGhlIHRpbWVyIGludGVydmFsIGV4cGlyZXMgCisKKyAgVGhpcyBmdW5jdGlvbiBpbiB0dXJuIGNhbGxzIHRoZSB2T1MgY2xpZW50IGNhbGxiYWNrIGFuZCBjaGFuZ2VzIHRoZSAKKyAgc3RhdGUgb2YgdGhlIHRpbWVyIGZyb20gcnVubmluZyAoQUNUSVZFKSB0byBleHBpcmVkIChJTklUKS4gCisgIAorICAKKyAgXHBhcmFtIHVUaW1lcklEIC0gcmV0dXJuIHZhbHVlIG9mIHRoZSB0aW1lU2V0RXZlbnQoKSBmcm9tIHRoZSAKKyAgICAgIHZvc190aW1lcl9zdGFydCgpIEFQSSB3aGljaCAKKworICBccGFyYW0gZHdVc2VyIC0gdGhpcyBpcyBzdXBwbGllZCBieSB0aGUgZm91cnRoIHBhcmFtZXRlciBvZiB0aGUgdGltZVNldEV2ZW50KCkKKyAgICAgIHdoaWNoIGlzIHRoZSB0aW1lciBzdHJ1Y3R1cmUgYmVpbmcgcGFzc2VkIGFzIHRoZSB1c2VyRGF0YQorCisgIFxwYXJhbSB1TXNnIC0gUmVzZXJ2ZWQgLyBOb3QgVXNlZAorCisgIFxwYXJhbSBkdzEgIC0gUmVzZXJ2ZWQgLyBOb3QgVXNlZAorCisgIFxwYXJhbSBkdzIgIC0gUmVzZXJ2ZWQgLyBOb3QgVXNlZAorICAKKyAgXHJldHVybiAgbm90aGluZworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHZvc19saW51eF90aW1lcl9jYWxsYmFjayAoIHZfVTMyX3QgZGF0YSApIAoreworICAgdm9zX3RpbWVyX3QgKnRpbWVyID0gKCB2b3NfdGltZXJfdCAqKWRhdGE7IAorICAgdm9zX21zZ190IG1zZzsKKyAgIFZPU19TVEFUVVMgdlN0YXR1czsKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAKKyAgIHZvc190aW1lcl9jYWxsYmFja190IGNhbGxiYWNrPU5VTEw7CisgICB2X1BWT0lEX3QgdXNlckRhdGE9TlVMTDsKKyAgIGludCB0aHJlYWRJZDsKKyAgIFZPU19USU1FUl9UWVBFIHR5cGU9Vk9TX1RJTUVSX1RZUEVfU1c7CisgICAKKyAgIFZPU19BU1NFUlQodGltZXIpOworCisgICBpZiAodGltZXIgPT0gTlVMTCkKKyAgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiJXMgTnVsbCBwb2ludGVyIHBhc3NlZCBpbiEiLF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybjsKKyAgIH0KKworICAgdGhyZWFkSWQgPSB0aW1lci0+cGxhdGZvcm1JbmZvLnRocmVhZElEOworICAgc3Bpbl9sb2NrX2lycXNhdmUoICZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrLGZsYWdzICk7CisgICAKKyAgIHN3aXRjaCAoIHRpbWVyLT5zdGF0ZSApCisgICB7CisgICBjYXNlIFZPU19USU1FUl9TVEFURV9TVEFSVElORzoKKyAgICAgIC8vIHdlIGFyZSBpbiB0aGlzIHN0YXRlIGJlY2F1c2Ugc29tZW9uZSBqdXN0IHN0YXJ0ZWQgdGhlIHRpbWVyLCBNTSB0aW1lcgorICAgICAgLy8gZ290IHN0YXJ0ZWQgYW5kIGV4cGlyZWQsIGJ1dCB0aGUgdGltZSBjb250ZW50IGhhdmUgbm90IGJlZSB1cGRhdGVkCisgICAgICAvLyB0aGlzIGlzIGEgcmFyZSByYWNlIGNvbmRpdGlvbiEKKyAgICAgIHRpbWVyLT5zdGF0ZSA9IFZPU19USU1FUl9TVEFURV9TVE9QUEVEOworICAgICAgdlN0YXR1cyA9IFZPU19TVEFUVVNfRV9BTFJFQURZOworICAgICAgYnJlYWs7CisgICBjYXNlIFZPU19USU1FUl9TVEFURV9TVE9QUEVEOgorICAgICAgdlN0YXR1cyA9IFZPU19TVEFUVVNfRV9BTFJFQURZOworICAgICAgYnJlYWs7CisgICBjYXNlIFZPU19USU1FUl9TVEFURV9VTlVTRUQ6CisgICAgICB2U3RhdHVzID0gVk9TX1NUQVRVU19FX0VYSVNUUzsKKyAgICAgIGJyZWFrOworICAgY2FzZSBWT1NfVElNRVJfU1RBVEVfUlVOTklORzoKKyAgICAgIC8vIG5lZWQgdG8gZ28gdG8gc3RvcCBzdGF0ZSBoZXJlIGJlY2F1c2UgdGhlIGNhbGwtYmFjayBmdW5jdGlvbiBtYXkgcmVzdGFydCAKKyAgICAgIC8vIHRpbWVyICh0byBlbXVsYXRlIHBlcmlvZGljIHRpbWVyKQorICAgICAgdGltZXItPnN0YXRlID0gVk9TX1RJTUVSX1NUQVRFX1NUT1BQRUQ7CisgICAgICAvLyBjb3B5IHRoZSByZWxldmFudCB0aW1lciBpbmZvcm1hdGlvbiB0byBsb2NhbCB2YXJpYWJsZXM7CisgICAgICAvLyBvbmNlIHdlIGV4aXN0IGZyb20gdGhpcyBjcml0aWNhbCBzZWN0aW9uLCB0aGUgdGltZXIgY29udGVudCBtYXkgYmUgbW9kaWZpZWQKKyAgICAgIC8vIGJ5IG90aGVyIHRhc2tzCisgICAgICBjYWxsYmFjayA9IHRpbWVyLT5jYWxsYmFjazsKKyAgICAgIHVzZXJEYXRhID0gdGltZXItPnVzZXJEYXRhOworICAgICAgdGhyZWFkSWQgPSB0aW1lci0+cGxhdGZvcm1JbmZvLnRocmVhZElEOworICAgICAgdHlwZSA9IHRpbWVyLT50eXBlOworICAgICAgdlN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2U3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgYnJlYWs7CisgICB9CisgICAKKyAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrLGZsYWdzICk7CisgICAKKyAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZTdGF0dXMgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiVElNRVIgY2FsbGJhY2sgY2FsbGVkIGluIGEgd3Jvbmcgc3RhdGU9JWQiLCB0aW1lci0+c3RhdGUpOworICAgICAgcmV0dXJuOworICAgfQorCisgICB0cnlBbGxvd2luZ1NsZWVwKCB0eXBlICk7CisKKyAgIFZPU19BU1NFUlQoIGNhbGxiYWNrICk7IAorCisgICAvLyBJZiB0aW1lciBoYXMgZXhwaXJlZCB0aGVuIGNhbGwgdm9zX2NsaWVudCBzcGVjaWZpYyBjYWxsYmFjayAKKyAgIGlmICggdm9zX3NjaGVkX2lzX3R4X3RocmVhZCggdGhyZWFkSWQgKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgIlRJTUVSIGNhbGxiYWNrOiBydW5uaW5nIG9uIFRYIHRocmVhZCIpOworICAgICAgICAgCisgICAgICAvL1NlcmlhbGl6ZSB0byB0aGUgVHggdGhyZWFkCisgICAgICBzeXNCdWlsZE1lc3NhZ2VIZWFkZXIoIFNZU19NU0dfSURfVFhfVElNRVIsICZtc2cgKTsKKyAgICAgIG1zZy5ib2R5cHRyICA9IGNhbGxiYWNrOworICAgICAgbXNnLmJvZHl2YWwgID0gKHZfVTMyX3QpdXNlckRhdGE7IAorICAgICAgIAorICAgICAgaWYodm9zX3R4X21xX3NlcmlhbGl6ZSggVk9TX01RX0lEX1NZUywgJm1zZyApID09IFZPU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgIHJldHVybjsKKyAgIH0KKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIGVsc2UgaWYgKCB2b3Nfc2NoZWRfaXNfcnhfdGhyZWFkKCB0aHJlYWRJZCApICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAiVElNRVIgY2FsbGJhY2s6IHJ1bm5pbmcgb24gUlggdGhyZWFkIik7CisgICAgICAgICAKKyAgICAgIC8vU2VyaWFsaXplIHRvIHRoZSBSeCB0aHJlYWQKKyAgICAgIHN5c0J1aWxkTWVzc2FnZUhlYWRlciggU1lTX01TR19JRF9SWF9USU1FUiwgJm1zZyApOworICAgICAgbXNnLmJvZHlwdHIgID0gY2FsbGJhY2s7CisgICAgICBtc2cuYm9keXZhbCAgPSAodl9VMzJfdCl1c2VyRGF0YTsgCisgICAgICAgCisgICAgICBpZih2b3NfcnhfbXFfc2VyaWFsaXplKCBWT1NfTVFfSURfU1lTLCAmbXNnICkgPT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgcmV0dXJuOworICAgfQorI2VuZGlmCisgICBlbHNlIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICJUSU1FUiBjYWxsYmFjazogcnVubmluZyBvbiBNQyB0aHJlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAvLyBTZXJpYWxpemUgdG8gdGhlIE1DIHRocmVhZAorICAgICAgc3lzQnVpbGRNZXNzYWdlSGVhZGVyKCBTWVNfTVNHX0lEX01DX1RJTUVSLCAmbXNnICk7CisgICAgICBtc2cuYm9keXB0ciAgPSBjYWxsYmFjazsKKyAgICAgIG1zZy5ib2R5dmFsICA9ICh2X1UzMl90KXVzZXJEYXRhOyAKKyAgICAgICAKKyAgICAgIGlmKHZvc19tcV9wb3N0X21lc3NhZ2UoIFZPU19NUV9JRF9TWVMsICZtc2cgKSA9PSBWT1NfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybjsKKyAgIH0gICAgIAorCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICIlczogQ291bGQgbm90IGVucXVldWUgdGltZXIgdG8gYW55IHF1ZXVlIiwgX19mdW5jX18pOworICAgVk9TX0FTU0VSVCgwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfdGltZXJfZ2V0Q3VycmVudFN0YXRlKCkgLSBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRpbWVyCisKKyAgXHBhcmFtIHBUaW1lciAtIHRoZSB0aW1lciBvYmplY3QKKyAgCisgIFxyZXR1cm4gdGltZXIgc3RhdGUKKyAgCisgIFxzYQorICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfVElNRVJfU1RBVEUgdm9zX3RpbWVyX2dldEN1cnJlbnRTdGF0ZSggdm9zX3RpbWVyX3QgKnBUaW1lciApCit7CisgICBpZiAoIE5VTEwgPT0gcFRpbWVyICkKKyAgIHsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1RJTUVSX1NUQVRFX1VOVVNFRDsKKyAgIH0KKworICAgc3dpdGNoICggcFRpbWVyLT5zdGF0ZSApCisgICB7CisgICAgICBjYXNlIFZPU19USU1FUl9TVEFURV9TVE9QUEVEOgorICAgICAgY2FzZSBWT1NfVElNRVJfU1RBVEVfU1RBUlRJTkc6CisgICAgICBjYXNlIFZPU19USU1FUl9TVEFURV9SVU5OSU5HOgorICAgICAgY2FzZSBWT1NfVElNRVJfU1RBVEVfVU5VU0VEOgorICAgICAgICAgcmV0dXJuIHBUaW1lci0+c3RhdGU7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgIHJldHVybiBWT1NfVElNRVJfU1RBVEVfVU5VU0VEOworICAgfSAgICAKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3RpbWVyX21vZHVsZV9pbml0KCkgLSBJbml0aWFsaXplcyBhIHZPU1MgdGltZXIgbW9kdWxlLgorCisgIFRoaXMgQVBJIGluaXRpYWxpemVzIHRoZSBWT1NTIHRpbWVyIG1vZHVsZS4gIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkCisgIGV4YWN0bHkgb25jZSBwcmlvciB0byB1c2luZyBhbnkgVk9TUyB0aW1lcnMuIAorCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZvc190aW1lcl9tb2R1bGVfaW5pdCggdm9pZCApCit7CisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgIkluaXRpYWxpemluZyB0aGUgVk9TUyB0aW1lciBtb2R1bGUiKTsKKyAgIHZvc19sb2NrX2luaXQoICZwZXJzaXN0ZW50VGltZXJDb3VudExvY2sgKTsKK30KKworI2lmZGVmIFRJTUVSX01BTkFHRVIKKyNpbmNsdWRlICJ3bGFuX2hkZF9kcF91dGlscy5oIgorCitoZGRfbGlzdF90IHZvc1RpbWVyTGlzdDsKKworc3RhdGljIHZvaWQgdm9zX3RpbWVyX2NsZWFuKHZvaWQpOworCit2b2lkIHZvc190aW1lcl9tYW5hZ2VyX2luaXQoKQoreworICAgLyogSW5pdGFsaXppbmcgdGhlIGxpc3Qgd2l0aCBtYXhpbXVtIHNpemUgb2YgNjAwMDAgKi8KKyAgIGhkZF9saXN0X2luaXQoJnZvc1RpbWVyTGlzdCwgMTAwMCk7ICAKKyAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgdm9zX3RpbWVyX2NsZWFuKCkKK3sKKyAgICB2X1NJWkVfdCBsaXN0U2l6ZTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICAKKyAgICBoZGRfbGlzdF9zaXplKCZ2b3NUaW1lckxpc3QsICZsaXN0U2l6ZSk7CisgICAgCisgICAgaWYgKGxpc3RTaXplKQorICAgIHsKKyAgICAgICBoZGRfbGlzdF9ub2RlX3QqIHBOb2RlOworICAgICAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworCisgICAgICAgdGltZXJfbm9kZV90ICpwdGltZXJOb2RlOworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBMaXN0IGlzIG5vdCBFbXB0eS4gbGlzdFNpemUgJWQgIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAoaW50KWxpc3RTaXplKTsKKworICAgICAgIGRvCisgICAgICAgeworICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZ2b3NUaW1lckxpc3QubG9jaywgZmxhZ3MpOworICAgICAgICAgIHZvc1N0YXR1cyA9IGhkZF9saXN0X3JlbW92ZV9mcm9udCgmdm9zVGltZXJMaXN0LCAmcE5vZGUpOworICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZvc1RpbWVyTGlzdC5sb2NrLCBmbGFncyk7CisgICAgICAgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMpCisgICAgICAgICAgeworICAgICAgICAgICAgIHB0aW1lck5vZGUgPSAodGltZXJfbm9kZV90KilwTm9kZTsKKyAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICAgICJUaW1lciBMZWFrQCBGaWxlICVzLCBATGluZSAlZCIsIAorICAgICAgICAgICAgICAgICAgICAgICBwdGltZXJOb2RlLT5maWxlTmFtZSwgKGludClwdGltZXJOb2RlLT5saW5lTnVtKTsKKworICAgICAgICAgICAgIHZvc19tZW1fZnJlZShwdGltZXJOb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgfSB3aGlsZSAodm9zU3RhdHVzID09IFZPU19TVEFUVVNfU1VDQ0VTUyk7CisgICAgfQorfQorCit2b2lkIHZvc190aW1lcl9leGl0KCkKK3sKKyAgICB2b3NfdGltZXJfY2xlYW4oKTsKKyAgICBoZGRfbGlzdF9kZXN0cm95KCZ2b3NUaW1lckxpc3QpOworfQorI2VuZGlmCisgIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc190aW1lcl9pbml0KCkgLSBJbml0aWFsaXplIGEgdk9TUyB0aW1lci4KKworICBUaGlzIEFQSSBpbml0aWFsaXplcyBhIHZPUyBUaW1lciBvYmplY3QuIAorICAKKyAgVGhlIFxhIHZvc190aW1lcl9pbml0KCkgaW5pdGlhbGl6ZXMgYSB2T1MgVGltZXIgb2JqZWN0LiAgQSB0aW1lciBtdXN0IGJlIAorICBpbml0aWFsaXplZCBieSBjYWxsaW5nIHZvc190aW1lcl9pbml0aWFsaXplKCkgYmVmb3JlIGl0IG1heSBiZSB1c2VkIGluIAorICBhbnkgb3RoZXIgdGltZXIgZnVuY3Rpb25zLiAKKyAgCisgIEF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSB0aW1lciB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgcmVzdWx0cyBpbiAKKyAgYSBmYWlsdXJlLiBBIGRlc3Ryb3llZCB0aW1lciBvYmplY3QgY2FuIGJlIHJlLWluaXRpYWxpemVkIHdpdGggYSBjYWxsIHRvCisgIFxhIHZvc190aW1lcl9pbml0KCkuICBUaGUgcmVzdWx0cyBvZiBvdGhlcndpc2UgcmVmZXJlbmNpbmcgdGhlIG9iamVjdCAKKyAgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVzdHJveWVkIGFyZSB1bmRlZmluZWQuICAKKyAgCisgIENhbGxzIHRvIHZPU1MgdGltZXIgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdGhlIHRpbWVyIHN1Y2gKKyAgYXMgdm9zX3RpbWVyX3NldCgpIHdpbGwgZmFpbCBpZiB0aGUgdGltZXIgaXMgbm90IGluaXRpYWxpemVkIG9yIGhhcworICBiZWVuIGRlc3Ryb3llZC4gIFRoZXJlZm9yZSwgZG9uJ3QgdXNlIHRoZSB0aW1lciBhZnRlciBpdCBoYXMgYmVlbiAKKyAgZGVzdHJveWVkIHVudGlsIGl0IGhhcyBiZWVuIHJlLWluaXRpYWxpemVkLgorICAKKyAgQWxsIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2l0aGluIHRoZSBWT1MgbWFpbiB0aHJlYWQgdW5sZXNzIGl0IGlzIAorICBpbml0aWFsaXplZCBmcm9tIHRoZSBUeCB0aHJlYWQgZmxvdywgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIGV4ZWN1dGVkCisgIHdpdGhpbiB0aGUgdHggdGhyZWFkIGZsb3cuCisgIAorICBccGFyYW0gdGltZXIgLSBwb2ludGVyIHRvIHRoZSBvcGFxdWUgdGltZXIgb2JqZWN0IHRvIGluaXRpYWxpemUKKyAgCisgIFxwYXJhbSB0aW1lclR5cGUgLSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGltZXIuICBXZSBoYXZlIHR3byBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVyIHR5cGVzLgorICAgIDxvbD4KKyAgICAgIDxsaT4gVk9TX1RJTUVSX1RZUEVfU1cgLSBQdXJlIHNvZnR3YXJlIHRpbWVyLiBUaGUgQXBwcyBwcm9jZXNzb3IKKyAgICAgICAgICAgbWF5IG5vdCBiZSBhd29rZW4gd2hlbiB0aGlzIHRpbWVyIGV4cGlyZXMuCisgICAgICA8bGk+IFZPU19USU1FUl9UWVBFX1dBS0VfQVBQUyAtIFRoZSBBcHBzIHByb2Nlc3NvciB3aWxsIGJlIGF3b2tlbgorICAgICAgICAgICBmcm9tIHBvd2VyIGNvbGxhcHNlIHdoZW4gdGhpcyB0eXBlIG9mIHRpbWVyIGV4cGlyZXMuCisgICAgIDwvb2w+ICAgICAgICAgICAgICAgICAgICAgIAorICAKKyAgXHBhcmFtIGNhbGxiYWNrIC0gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lcgorICAgICAgICAgZXhwaXJlcy4KKyAgICAgICAgIAorICBccGFyYW0gdXNlckRhdGEgLSBhIHVzZXIgZGF0YSAob3IgY29udGV4dCkgdGhhdCBpcyByZXR1cm5lZCB0byB0aGUgCisgICAgICAgICBjYWxsYmFjayBmdW5jdGlvbiBhcyBhIHBhcmFtZXRlciB3aGVuIHRoZSB0aW1lciBleHBpcmVzLiAgICAgICAgIAorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aW1lciB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZCAKKyAgICAgICAgICBpcyByZWFkeSB0byBiZSB1c2VkLgorICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpIAorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZSB0byBpbml0aWFsaXplIHRoZSB0aW1lcgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX05PTUVNIC0gaW5zdWZmaWNpZW50IG1lbW9yeSBleGlzdHMgdG8gaW5pdGlhbGl6ZSAKKyAgICAgICAgICB0aGUgdGltZXIKKworICAgICAgICAgIFZPU19TVEFUVVNfRV9CVVNZIC0gVGhlIGltcGxlbWVudGF0aW9uIGhhcyBkZXRlY3RlZCBhbiBhdHRlbXB0IAorICAgICAgICAgIHRvIGluaXRpYWxpemUgdGhlIG9iamVjdCByZWZlcmVuY2VkIGJ5IHRpbWVyLCBhIHByZXZpb3VzbHkgCisgICAgICAgICAgaW5pdGlhbGl6ZWQgYnV0IG5vdCB5ZXQgZGVzdHJveWVkIHRpbWVyLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHRpbWVyIGlzIGFuIGludmFsaWQgcG9pbnRlci4gICAgIAorICBcc2EKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFRJTUVSX01BTkFHRVIKK1ZPU19TVEFUVVMgdm9zX3RpbWVyX2luaXRfZGVidWcoIHZvc190aW1lcl90ICp0aW1lciwgVk9TX1RJTUVSX1RZUEUgdGltZXJUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc190aW1lcl9jYWxsYmFja190IGNhbGxiYWNrLCB2X1BWT0lEX3QgdXNlckRhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZmlsZU5hbWUsIHZfVTMyX3QgbGluZU51bSApCit7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgcG9pbnRlcgorICAgaWYgKCh0aW1lciA9PSBOVUxMKSB8fCAoY2FsbGJhY2sgPT0gTlVMTCkpIAorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6IE51bGwgcGFyYW1zIGJlaW5nIHBhc3NlZCIsX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorCisgICB0aW1lci0+cHRpbWVyTm9kZSA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0aW1lcl9ub2RlX3QpKTsKKworICAgaWYodGltZXItPnB0aW1lck5vZGUgPT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzOiBOb3QgYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRpbWVOb2RlIixfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisKKyAgIHZvc19tZW1fc2V0KHRpbWVyLT5wdGltZXJOb2RlLCBzaXplb2YodGltZXJfbm9kZV90KSwgMCk7CisKKyAgICB0aW1lci0+cHRpbWVyTm9kZS0+ZmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICB0aW1lci0+cHRpbWVyTm9kZS0+bGluZU51bSAgID0gbGluZU51bTsKKyAgICB0aW1lci0+cHRpbWVyTm9kZS0+dm9zVGltZXIgPSB0aW1lcjsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZ2b3NUaW1lckxpc3QubG9jaywgZmxhZ3MpOworICAgIHZvc1N0YXR1cyA9IGhkZF9saXN0X2luc2VydF9mcm9udCgmdm9zVGltZXJMaXN0LCAmdGltZXItPnB0aW1lck5vZGUtPnBOb2RlKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2b3NUaW1lckxpc3QubG9jaywgZmxhZ3MpOworICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAiJXM6IFVuYWJsZSB0byBpbnNlcnQgbm9kZSBpbnRvIExpc3Qgdm9zU3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHZvc1N0YXR1cyk7CisgICAgfQorICAgCisgICAvLyBzZXQgdGhlIHZhcmlvdXMgbWVtYmVycyBvZiB0aGUgdGltZXIgc3RydWN0dXJlIAorICAgLy8gd2l0aCBhcmd1bWVudHMgcGFzc2VkIG9yIHdpdGggZGVmYXVsdCB2YWx1ZXMKKyAgIHNwaW5fbG9ja19pbml0KCZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrKTsKKyAgIGluaXRfdGltZXIoJih0aW1lci0+cGxhdGZvcm1JbmZvLlRpbWVyKSk7CisgICB0aW1lci0+cGxhdGZvcm1JbmZvLlRpbWVyLmZ1bmN0aW9uID0gdm9zX2xpbnV4X3RpbWVyX2NhbGxiYWNrOworICAgdGltZXItPnBsYXRmb3JtSW5mby5UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpdGltZXI7CisgICB0aW1lci0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgIHRpbWVyLT51c2VyRGF0YSA9IHVzZXJEYXRhOworICAgdGltZXItPnR5cGUgPSB0aW1lclR5cGU7CisgICB0aW1lci0+cGxhdGZvcm1JbmZvLmNvb2tpZSA9IExJTlVYX1RJTUVSX0NPT0tJRTsKKyAgIHRpbWVyLT5wbGF0Zm9ybUluZm8udGhyZWFkSUQgPSAwOworICAgdGltZXItPnN0YXRlID0gVk9TX1RJTUVSX1NUQVRFX1NUT1BQRUQ7CisgICAKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZWxzZQorVk9TX1NUQVRVUyB2b3NfdGltZXJfaW5pdCggdm9zX3RpbWVyX3QgKnRpbWVyLCBWT1NfVElNRVJfVFlQRSB0aW1lclR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3RpbWVyX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZfUFZPSURfdCB1c2VyRGF0YSApCit7CisgICAvLyBDaGVjayBmb3IgaW52YWxpZCBwb2ludGVyCisgICBpZiAoKHRpbWVyID09IE5VTEwpIHx8IChjYWxsYmFjayA9PSBOVUxMKSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogTnVsbCBwYXJhbXMgYmVpbmcgcGFzc2VkIixfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICB9CisgICAKKyAgIC8vIHNldCB0aGUgdmFyaW91cyBtZW1iZXJzIG9mIHRoZSB0aW1lciBzdHJ1Y3R1cmUgCisgICAvLyB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgb3Igd2l0aCBkZWZhdWx0IHZhbHVlcworICAgc3Bpbl9sb2NrX2luaXQoJnRpbWVyLT5wbGF0Zm9ybUluZm8uc3BpbmxvY2spOworICAgaW5pdF90aW1lcigmKHRpbWVyLT5wbGF0Zm9ybUluZm8uVGltZXIpKTsKKyAgIHRpbWVyLT5wbGF0Zm9ybUluZm8uVGltZXIuZnVuY3Rpb24gPSB2b3NfbGludXhfdGltZXJfY2FsbGJhY2s7CisgICB0aW1lci0+cGxhdGZvcm1JbmZvLlRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyl0aW1lcjsKKyAgIHRpbWVyLT5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgdGltZXItPnVzZXJEYXRhID0gdXNlckRhdGE7CisgICB0aW1lci0+dHlwZSA9IHRpbWVyVHlwZTsKKyAgIHRpbWVyLT5wbGF0Zm9ybUluZm8uY29va2llID0gTElOVVhfVElNRVJfQ09PS0lFOworICAgdGltZXItPnBsYXRmb3JtSW5mby50aHJlYWRJRCA9IDA7CisgICB0aW1lci0+c3RhdGUgPSBWT1NfVElNRVJfU1RBVEVfU1RPUFBFRDsKKyAgIAorICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3RpbWVyX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSB2T1NTIFRpbWVyIG9iamVjdAorCisgIFRoZSBcYSB2b3NfdGltZXJfZGVzdHJveSgpIGZ1bmN0aW9uIHNoYWxsIGRlc3Ryb3kgdGhlIHRpbWVyIG9iamVjdC4KKyAgQWZ0ZXIgYSBzdWNjZXNzZnVsIHJldHVybiBmcm9tIFxhIHZvc190aW1lcl9kZXN0cm95KCkgdGhlIHRpbWVyIAorICBvYmplY3QgYmVjb21lcywgaW4gZWZmZWN0LCB1bmluaXRpYWxpemVkLgorICAgCisgIEEgZGVzdHJveWVkIHRpbWVyIG9iamVjdCBjYW4gYmUgcmUtaW5pdGlhbGl6ZWQgYnkgY2FsbGluZworICB2b3NfdGltZXJfaW5pdCgpLiAgVGhlIHJlc3VsdHMgb2Ygb3RoZXJ3aXNlIHJlZmVyZW5jaW5nIHRoZSBvYmplY3QgCisgIGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCBhcmUgdW5kZWZpbmVkLiAgCisgIAorICBDYWxscyB0byB2T1NTIHRpbWVyIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHRoZSB0aW1lciwgc3VjaAorICBhcyB2b3NfdGltZXJfc2V0KCkgd2lsbCBmYWlsIGlmIHRoZSBsb2NrIGlzIGRlc3Ryb3llZC4gIFRoZXJlZm9yZSwgCisgIGRvbid0IHVzZSB0aGUgdGltZXIgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVzdHJveWVkIHVudGlsIGl0IGhhcyAKKyAgYmVlbiByZS1pbml0aWFsaXplZC4KKyAgCisgIFxwYXJhbSB0aW1lciAtIHRoZSB0aW1lciBvYmplY3QgdG8gYmUgZGVzdHJveWVkLgorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aW1lciB3YXMgc3VjY2Vzc2Z1bGx5IGRlc3Ryb3llZC4KKyAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0JVU1kgLSBUaGUgaW1wbGVtZW50YXRpb24gaGFzIGRldGVjdGVkIGFuIGF0dGVtcHQgCisgICAgICAgICAgdG8gZGVzdHJveSB0aGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgdGltZXIgd2hpbGUgaXQgaXMgc3RpbGwgCisgICAgICAgICAgc3RpbGwgcmVmZXJlbmNlZC4gIFRoZSB0aW1lciBtdXN0IGJlIHN0b3BwZWQgYmVmb3JlIGl0IGNhbiBiZSAKKyAgICAgICAgICBkZXN0cm95ZWQuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRpbWVyIGlzIGludmFsaWQuCisgICAgICAgICAgCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHRpbWVyIGlzIGFuIGludmFsaWQgcG9pbnRlci4gICAgIAorICBcc2EKKyAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFRJTUVSX01BTkFHRVIKK1ZPU19TVEFUVVMgdm9zX3RpbWVyX2Rlc3Ryb3kgKCB2b3NfdGltZXJfdCAqdGltZXIgKQoreworICAgVk9TX1NUQVRVUyB2U3RhdHVzPVZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAKKyAgIC8vIENoZWNrIGZvciBpbnZhbGlkIHBvaW50ZXIKKyAgIGlmICggTlVMTCA9PSB0aW1lciApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogTnVsbCB0aW1lciBwb2ludGVyIGJlaW5nIHBhc3NlZCIsX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorICAgICAgIAorICAgLy8gQ2hlY2sgaWYgdGltZXIgcmVmZXJzIHRvIGFuIHVuaW5pdGlhbGl6ZWQgb2JqZWN0CisgICBpZiAoIExJTlVYX1RJTUVSX0NPT0tJRSAhPSB0aW1lci0+cGxhdGZvcm1JbmZvLmNvb2tpZSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogQ2Fubm90IGRlc3Ryb3kgdW5pbml0aWFsaXplZCB0aW1lciIsX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisgICAKKyAgIHNwaW5fbG9ja19pcnFzYXZlKCZ2b3NUaW1lckxpc3QubG9jaywgZmxhZ3MpOworICAgdlN0YXR1cyA9IGhkZF9saXN0X3JlbW92ZV9ub2RlKCZ2b3NUaW1lckxpc3QsICZ0aW1lci0+cHRpbWVyTm9kZS0+cE5vZGUpOworICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdm9zVGltZXJMaXN0LmxvY2ssIGZsYWdzKTsKKyAgIGlmKHZTdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgeworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisgICB2b3NfbWVtX2ZyZWUodGltZXItPnB0aW1lck5vZGUpOworICAgCisKKyAgIHNwaW5fbG9ja19pcnFzYXZlKCAmdGltZXItPnBsYXRmb3JtSW5mby5zcGlubG9jayxmbGFncyApOworICAgCisgICBzd2l0Y2ggKCB0aW1lci0+c3RhdGUgKQorICAgeworICAgICAgY2FzZSBWT1NfVElNRVJfU1RBVEVfU1RBUlRJTkc6CisgICAgICAgICB2U3RhdHVzID0gVk9TX1NUQVRVU19FX0JVU1k7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVk9TX1RJTUVSX1NUQVRFX1JVTk5JTkc6CisgICAgICAgICAvKiBTdG9wIHRoZSB0aW1lciBmaXJzdCAqLworICAgICAgICAgZGVsX3RpbWVyKCYodGltZXItPnBsYXRmb3JtSW5mby5UaW1lcikpOworICAgICAgICAgdlN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWT1NfVElNRVJfU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgIHZTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVk9TX1RJTUVSX1NUQVRFX1VOVVNFRDoKKyAgICAgICAgIHZTdGF0dXMgPSBWT1NfU1RBVFVTX0VfQUxSRUFEWTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHZTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgICBicmVhazsKKyAgIH0KKworICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdlN0YXR1cyApCisgICB7CisgICAgICB0aW1lci0+cGxhdGZvcm1JbmZvLmNvb2tpZSA9IExJTlVYX0lOVkFMSURfVElNRVJfQ09PS0lFOworICAgICAgdGltZXItPnN0YXRlID0gVk9TX1RJTUVSX1NUQVRFX1VOVVNFRDsKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrLGZsYWdzICk7CisgICAgICByZXR1cm4gdlN0YXR1czsKKyAgIH0KKworICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJnRpbWVyLT5wbGF0Zm9ybUluZm8uc3BpbmxvY2ssZmxhZ3MgKTsKKworCisgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICIlczogQ2Fubm90IGRlc3Ryb3kgdGltZXIgaW4gc3RhdGUgPSAlZCIsX19mdW5jX18sIHRpbWVyLT5zdGF0ZSk7CisgICBWT1NfQVNTRVJUKDApOworCisgICByZXR1cm4gdlN0YXR1czsgICAKK30KKworI2Vsc2UKK1ZPU19TVEFUVVMgdm9zX3RpbWVyX2Rlc3Ryb3kgKCB2b3NfdGltZXJfdCAqdGltZXIgKQoreworICAgVk9TX1NUQVRVUyB2U3RhdHVzPVZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAKKyAgIC8vIENoZWNrIGZvciBpbnZhbGlkIHBvaW50ZXIKKyAgIGlmICggTlVMTCA9PSB0aW1lciApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogTnVsbCB0aW1lciBwb2ludGVyIGJlaW5nIHBhc3NlZCIsX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorICAgICAgIAorICAgLy8gQ2hlY2sgaWYgdGltZXIgcmVmZXJzIHRvIGFuIHVuaW5pdGlhbGl6ZWQgb2JqZWN0CisgICBpZiAoIExJTlVYX1RJTUVSX0NPT0tJRSAhPSB0aW1lci0+cGxhdGZvcm1JbmZvLmNvb2tpZSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogQ2Fubm90IGRlc3Ryb3kgdW5pbml0aWFsaXplZCB0aW1lciIsX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisgICBzcGluX2xvY2tfaXJxc2F2ZSggJnRpbWVyLT5wbGF0Zm9ybUluZm8uc3BpbmxvY2ssZmxhZ3MgKTsKKyAgIAorICAgc3dpdGNoICggdGltZXItPnN0YXRlICkKKyAgIHsKKyAgICAgIGNhc2UgVk9TX1RJTUVSX1NUQVRFX1NUQVJUSU5HOgorICAgICAgICAgdlN0YXR1cyA9IFZPU19TVEFUVVNfRV9CVVNZOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFZPU19USU1FUl9TVEFURV9SVU5OSU5HOgorICAgICAgICAgLyogU3RvcCB0aGUgdGltZXIgZmlyc3QgKi8KKyAgICAgICAgIGRlbF90aW1lcigmKHRpbWVyLT5wbGF0Zm9ybUluZm8uVGltZXIpKTsKKyAgICAgICAgIHZTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVk9TX1RJTUVSX1NUQVRFX1NUT1BQRUQ6CisgICAgICAgICB2U3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFZPU19USU1FUl9TVEFURV9VTlVTRUQ6CisgICAgICAgICB2U3RhdHVzID0gVk9TX1NUQVRVU19FX0FMUkVBRFk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICB2U3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgICAgICAgYnJlYWs7CisgICB9CisKKyAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTID09IHZTdGF0dXMgKQorICAgeworICAgICAgdGltZXItPnBsYXRmb3JtSW5mby5jb29raWUgPSBMSU5VWF9JTlZBTElEX1RJTUVSX0NPT0tJRTsKKyAgICAgIHRpbWVyLT5zdGF0ZSA9IFZPU19USU1FUl9TVEFURV9VTlVTRUQ7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmdGltZXItPnBsYXRmb3JtSW5mby5zcGlubG9jayxmbGFncyApOworICAgICAgcmV0dXJuIHZTdGF0dXM7CisgICB9CisKKyAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrLGZsYWdzICk7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgIiVzOiBDYW5ub3QgZGVzdHJveSB0aW1lciBpbiBzdGF0ZSA9ICVkIixfX2Z1bmNfXywgdGltZXItPnN0YXRlKTsKKyAgIFZPU19BU1NFUlQoMCk7CisKKyAgIHJldHVybiB2U3RhdHVzOyAgIAorfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfdGltZXJfc3RhcnQoKSAtIFN0YXJ0IGEgdk9TUyBUaW1lciBvYmplY3QKKworICBUaGUgXGEgdm9zX3RpbWVyX3N0YXJ0KCkgZnVuY3Rpb24gc3RhcnRzIGEgdGltZXIgdG8gZXhwaXJlIGFmdGVyIHRoZSAKKyAgc3BlY2lmaWVkIGludGVydmFsLCB0aHVzIHJ1bm5pbmcgdGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gCisgIHRoZSBpbnRlcnZhbCBleHBpcmVzLgorICAgCisgIEEgdGltZXIgb25seSBydW5zIG9uY2UgKGEgb25lLXNob3QgdGltZXIpLiAgVG8gcmUtc3RhcnQgdGhlIAorICB0aW1lciwgdm9zX3RpbWVyX3N0YXJ0KCkgaGFzIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgdGltZXIgcnVucyAKKyAgb3IgaGFzIGJlZW4gY2FuY2VsbGVkLgorICAKKyAgXHBhcmFtIHRpbWVyIC0gdGhlIHRpbWVyIG9iamVjdCB0byBiZSBzdGFydGVkCisgIAorICBccGFyYW0gZXhwaXJhdGlvblRpbWUgLSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSB0aW1lciAoaW4gbWlsbGlzZWNvbmRzKQorICAKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSB0aW1lciB3YXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuCisgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9BTFJFQURZIC0gVGhlIGltcGxlbWVudGF0aW9uIGhhcyBkZXRlY3RlZCBhbiBhdHRlbXB0IAorICAgICAgICAgIHRvIHN0YXJ0IGEgdGltZXIgd2hpbGUgaXQgaXMgYWxyZWFkeSBzdGFydGVkLiAgVGhlIHRpbWVyIG11c3QgCisgICAgICAgICAgYmUgc3RvcHBlZCBvciBleHBpcmUgYmVmb3JlIGl0IGNhbiBiZSBzdGFydGVkIGFnYWluLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aW1lciBpcyBpbnZhbGlkLgorICAgICAgICAgIAorICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSB0aW1lciBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3RpbWVyX3N0YXJ0KCB2b3NfdGltZXJfdCAqdGltZXIsIHZfVTMyX3QgZXhwaXJhdGlvblRpbWUgKQoreworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgCisgICAgICAgICAgICAgIlRpbWVyIEFkZHIgaW5zaWRlIHZvc3Nfc3RhcnQgOiAweCVwICIsIHRpbWVyICk7CisgICAKKyAgIC8vIENoZWNrIGZvciBpbnZhbGlkIHBvaW50ZXIKKyAgIGlmICggTlVMTCA9PSB0aW1lciApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgIiVzIE51bGwgdGltZXIgcG9pbnRlciBiZWluZyBwYXNzZWQiLCBfX2Z1bmNfXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKyAgICAgIAorICAgLy8gQ2hlY2sgaWYgdGltZXIgcmVmZXJzIHRvIGFuIHVuaW5pdGlhbGl6ZWQgb2JqZWN0CisgICBpZiAoIExJTlVYX1RJTUVSX0NPT0tJRSAhPSB0aW1lci0+cGxhdGZvcm1JbmZvLmNvb2tpZSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlczogQ2Fubm90IHN0YXJ0IHVuaW5pdGlhbGl6ZWQgdGltZXIiLF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gQ2hlY2sgaWYgdGltZXIgaGFzIGV4cGlyYXRpb24gdGltZSBsZXNzIHRoYW4gMTAgbXMKKyAgIGlmICggZXhwaXJhdGlvblRpbWUgPCAxMCApCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBDYW5ub3Qgc3RhcnQgYSAiCisgICAgICAgICAgICAgICAgInRpbWVyIHdpdGggZXhwaXJhdGlvbiBsZXNzIHRoYW4gMTAgbXMiLCBfX2Z1bmNfXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKyAgICAgIAorICAgLy8gbWFrZSBzdXJlIHRoZSByZW1haW5lciBvZiB0aGUgbG9naWMgaXNuJ3QgaW50ZXJydXB0ZWQKKyAgIHNwaW5fbG9ja19pcnFzYXZlKCAmdGltZXItPnBsYXRmb3JtSW5mby5zcGlubG9jayxmbGFncyApOworCisgICAvLyBFbnN1cmUgaWYgdGhlIHRpbWVyIGNhbiBiZSBzdGFydGVkCisgICBpZiAoIFZPU19USU1FUl9TVEFURV9TVE9QUEVEICE9IHRpbWVyLT5zdGF0ZSApCisgICB7ICAKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZ0aW1lci0+cGxhdGZvcm1JbmZvLnNwaW5sb2NrLGZsYWdzICk7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwgCisgICAgICAgICAgICAgICAgIiVzOiBDYW5ub3Qgc3RhcnQgdGltZXIgaW4gc3RhdGUgPSAlZCAiLF9fZnVuY19fLCB0aW1lci0+c3RhdGUpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9BTFJFQURZOworICAgfQorICAgICAgCisgICAvLyBTdGFydCB0aGUgdGltZXIKKyAgIG1vZF90aW1lciggJih0aW1lci0+cGxhdGZvcm1JbmZvLlRpbWVyKSwKKyAgICAgICAgICAgICAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoZXhwaXJhdGlvblRpbWUpKTsgCisKKyAgIHRpbWVyLT5zdGF0ZSA9IFZPU19USU1FUl9TVEFURV9SVU5OSU5HOworCisgICAvLyBHZXQgdGhlIHRocmVhZCBJRCBvbiB3aGljaCB0aGUgdGltZXIgaXMgYmVpbmcgc3RhcnRlZAorICAgdGltZXItPnBsYXRmb3JtSW5mby50aHJlYWRJRCAgPSBjdXJyZW50LT5waWQ7CisKKyAgIGlmICggVk9TX1RJTUVSX1RZUEVfV0FLRV9BUFBTID09IHRpbWVyLT50eXBlICkKKyAgIHsKKyAgICAgIHBlcnNpc3RlbnRUaW1lckNvdW50Kys7CisgICAgICBpZiAoIDEgPT0gcGVyc2lzdGVudFRpbWVyQ291bnQgKQorICAgICAgeworICAgICAgICAgLy8gU2luY2Ugd2Ugbm93IGhhdmUgb25lIHBlcnNpc3RlbnQgdGltZXIsIHdlIG5lZWQgdG8gZGlzYWxsb3cgc2xlZXAKKyAgICAgICAgIC8vIHNsZWVwX25lZ2F0ZV9va3RzKCBzbGVlcENsaWVudEhhbmRsZSApOworICAgICAgfQorICAgfQorCisgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmdGltZXItPnBsYXRmb3JtSW5mby5zcGlubG9jayxmbGFncyApOworICAKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHZvc190aW1lcl9zdG9wKCkgLSBTdG9wIGEgdk9TUyBUaW1lcgorCisgIFRoZSBcYSB2b3NfdGltZXJfc3RvcCgpIGZ1bmN0aW9uIHN0b3BzIGEgdGltZXIgdGhhdCBoYXMgYmVlbiBzdGFydGVkIGJ1dAorICBoYXMgbm90IGV4cGlyZWQsIGVzc2VudGlhbGx5IGNhbmNlbGxpbmcgdGhlICdzdGFydCcgcmVxdWVzdC4KKyAgIAorICBBZnRlciBhIHRpbWVyIGlzIHN0b3BwZWQsIGl0IGdvZXMgYmFjayB0byB0aGUgc3RhdGUgaXQgd2FzIGluIGFmdGVyIGl0CisgIHdhcyBjcmVhdGVkIGFuZCBjYW4gYmUgc3RhcnRlZCBhZ2FpbiB2aWEgYSBjYWxsIHRvIHZvc190aW1lcl9zdGFydCgpLgorICAKKyAgXHBhcmFtIHRpbWVyIC0gdGhlIHRpbWVyIG9iamVjdCB0byBiZSBzdG9wcGVkCisgICAgCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gdGltZXIgd2FzIHN1Y2Nlc3NmdWxseSBzdG9wcGVkLgorICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRU1QVFkgLSBUaGUgaW1wbGVtZW50YXRpb24gaGFzIGRldGVjdGVkIGFuIGF0dGVtcHQgCisgICAgICAgICAgdG8gc3RvcCBhIHRpbWVyIHRoYXQgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgb3IgaGFzIGFscmVhZHkgCisgICAgICAgICAgZXhwaXJlZC4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9JTlZBTCAtIFRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGltZXIgaXMgaW52YWxpZC4KKyAgICAgICAgICAKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gdGltZXIgaXMgYW4gaW52YWxpZCBwb2ludGVyLiAgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1ZPU19TVEFUVVMgdm9zX3RpbWVyX3N0b3AgKCB2b3NfdGltZXJfdCAqdGltZXIgKQoreworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsIAorICAgICAgICAgICAgICAgIiVzOiBUaW1lciBBZGRyIGluc2lkZSB2b3NzX3N0b3AgOiAweCVwIixfX2Z1bmNfXyx0aW1lciApOworCisgICAvLyBDaGVjayBmb3IgaW52YWxpZCBwb2ludGVyCisgICBpZiAoIE5VTEwgPT0gdGltZXIgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICIlcyBOdWxsIHRpbWVyIHBvaW50ZXIgYmVpbmcgcGFzc2VkIiwgX19mdW5jX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8vIENoZWNrIGlmIHRpbWVyIHJlZmVycyB0byBhbiB1bmluaXRpYWxpemVkIG9iamVjdAorICAgaWYgKCBMSU5VWF9USU1FUl9DT09LSUUgIT0gdGltZXItPnBsYXRmb3JtSW5mby5jb29raWUgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiJXM6IENhbm5vdCBzdG9wIHVuaW5pdGlhbGl6ZWQgdGltZXIiLF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKyAgICAgIAorICAgLy8gRW5zdXJlIHRoZSB0aW1lciBzdGF0ZSBpcyBjb3JyZWN0CisgICBzcGluX2xvY2tfaXJxc2F2ZSggJnRpbWVyLT5wbGF0Zm9ybUluZm8uc3BpbmxvY2ssZmxhZ3MgKTsKKworICAgaWYgKCBWT1NfVElNRVJfU1RBVEVfUlVOTklORyAhPSB0aW1lci0+c3RhdGUgKQorICAgeworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJnRpbWVyLT5wbGF0Zm9ybUluZm8uc3BpbmxvY2ssZmxhZ3MgKTsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICIlczogQ2Fubm90IHN0b3AgdGltZXIgaW4gc3RhdGUgPSAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHRpbWVyLT5zdGF0ZSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgfQorICAgCisgICB0aW1lci0+c3RhdGUgPSBWT1NfVElNRVJfU1RBVEVfU1RPUFBFRDsKKworICAgZGVsX3RpbWVyKCYodGltZXItPnBsYXRmb3JtSW5mby5UaW1lcikpOworICAgICAgIAorICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJnRpbWVyLT5wbGF0Zm9ybUluZm8uc3BpbmxvY2ssZmxhZ3MgKTsKKyAgICAgIAorICAgdHJ5QWxsb3dpbmdTbGVlcCggdGltZXItPnR5cGUgKTsKKyAgIAorICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKSAtIEdldCB0aGUgc3lzdGVtIHRpbWUgaW4gMTBtcyB0aWNrcworCisgIFRoZSBcYSB2b3NfdGltZXJfZ2V0X3N5c3RlbV90aWNrcygpIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyCisgIG9mIHRpbWVyIHRpY2tzIGluIDEwbXNlYyBpbnRlcnZhbHMuICBUaGlzIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIHRpbWVzdGFtcGluZworICBhbmQgY2FsY3VsYXRpbmcgdGltZSBpbnRlcnZhbHMgYnkgY2FsY3VsYXRpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gCisgIHRpbWVzdGFtcHMuCisgICAgCisgIFxyZXR1cm5zIC0gVGhlIGN1cnJlbnQgc3lzdGVtIHRpY2sgY291bnQgKGluIDEwbXNlYyBpbnRlcnZhbHMpLiAgVGhpcyAKKyAgICAgICAgICAgICBmdW5jdGlvbiBjYW5ub3QgZmFpbC4KKyAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZfVElNRV90IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCB2X1ZPSURfdCApCit7CisgICByZXR1cm4oIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcykgLyAxMCApOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAKKyAgXGJyaWVmIHZvc190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKSAtIEdldCB0aGUgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisKKyAgVGhlIFxhIHZvc190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIAorICB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgc3lzdGVtIHdhcyBzdGFydGVkCisgICAgCisgIFxyZXR1cm5zIC0gVGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordl9USU1FX3Qgdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGltZSggdl9WT0lEX3QgKQoreworICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICBkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKyAgIHJldHVybiB0di50dl9zZWMqMTAwMCArIHR2LnR2X3VzZWMvMTAwMDsgIAorfQpkaWZmIC0tZ2l0IGEvQ09SRS9WT1NTL3NyYy92b3NfdHJhY2UuYyBiL0NPUkUvVk9TUy9zcmMvdm9zX3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzYmQyMAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvVk9TUy9zcmMvdm9zX3RyYWNlLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgXGZpbGUgIHZvc190cmFjZS5jCisKKyAgXGJyaWVmIHZpcnR1YWwgT3BlcmF0aW5nIFN5c3RlbSBTZXJ2aWVzICh2T1MpCisKKyAgIFRyYWNlLCBsb2dnaW5nLCBhbmQgZGVidWdnaW5nIGRlZmluaXRpb25zIGFuZCBBUElzCisKKyAgIENvcHlyaWdodCAyMDA4LDIwMTEgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkKKyAgLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDA5LzE2LzA4ICAgIGh2bSAgICBBZGRpbmcgYWJpbGl0eSB0byBzZXQgbXVsdGlwbGUgdHJhY2UgbGV2ZWxzIHBlciBjb21wb25lbnQKKyAgMDkvMTEvMDggICAgbGFjICAgIEFkZGVkIHRyYWNlIGxldmVscyBwZXIgY29tcG9uZW50LiAgQ2xlYW51cCBmcm9tIHJldmlldy4KKyAgMDgvMTQvMDggICAgdnBhaSAgIFBhcnRpY3VsYXIgbW9kdWxlcyBhbmQgZGVzaXJlZCBsZXZlbCBjYW4gYmUgc2VsZWN0ZWQKKyAgMDYvMjAvMDggICAgdnBhaSAgIENyZWF0ZWQgTW9kdWxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDx2b3NfdHJhY2UuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFZPU19UUkFDRV9CVUZGRVJfU0laRSAoIDUxMiApCisKKy8vIG1hY3JvIHRvIG1hcCB2b3MgdHJhY2UgbGV2ZWxzIGludG8gdGhlIGJpdG1hc2sKKyNkZWZpbmUgVk9TX1RSQUNFX0xFVkVMX1RPX01PRFVMRV9CSVRNQVNLKCBfbGV2ZWwgKSAoICggMSA8PCAoX2xldmVsKSApICkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8vIFRyYWNlIGxldmVsIGZvciBhIG1vZHVsZSwgYXMgYSBiaXRtYXNrLiAgVGhlIGJpdHMgaW4gdGhpcyBtYXNrCisgICAvLyBhcmUgb3JkZXJlZCBieSBWT1NfVFJBQ0VfTEVWRUwuICBGb3IgZXhhbXBsZSwgZWFjaCBiaXQgcmVwcmVzZW50cworICAgLy8gb25lIG9mIHRoZSBiaXRzIGluIFZPU19UUkFDRV9MRVZFTCB0aGF0IG1heSBiZSB0dXJuZWQgb24gdG8gaGF2ZQorICAgLy8gdHJhY2VzIGF0IHRoYXQgbGV2ZWwgbG9nZ2VkLCBpLmUuIGlmIFZPU19UUkFDRV9MRVZFTF9FUlJPUiBpcworICAgLy8gPT0gMiwgdGhlbiBpZiBiaXQgMiAobG93IG9yZGVyKSBpcyB0dXJuZWQgT04sIHRoZW4gRVJST1IgdHJhY2VzCisgICAvLyB3aWxsIGJlIHByaW50ZWQgdG8gdGhlIHRyYWNlIGxvZy4KKyAgIC8vCisgICAvLyBOb3RlIHRoYXQgYWxsIGJpdHMgdHVybmVkIE9GRiBtZWFucyBubyB0cmFjZXMuCisgICB2X1UxNl90IG1vZHVsZVRyYWNlTGV2ZWw7CisKKyAgIC8vIDMgY2hhcmFjdGVyIHN0cmluZyBuYW1lIGZvciB0aGUgbW9kdWxlCisgICB1bnNpZ25lZCBjaGFyIG1vZHVsZU5hbWVTdHJbIDQgXTsgICAvLyAzIGNoYXJzIHBsdXMgdGhlIE5VTEwKKworfSBtb2R1bGVUcmFjZUluZm87CisKKyNkZWZpbmUgVk9TX0RFRkFVTFRfVFJBQ0VfTEVWRUwgXAorICAgKCgxPDxWT1NfVFJBQ0VfTEVWRUxfRkFUQUwpfCgxPDxWT1NfVFJBQ0VfTEVWRUxfRVJST1IpKQorCisvLyBBcnJheSBvZiBzdGF0aWMgZGF0YSB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgcGVyIG1vZHVsZSB0cmFjZQorLy8gaW5mb3JtYXRpb24uICBUaGlzIGluY2x1ZGVzIHRoZSB0cmFjZSBsZXZlbCBmb3IgdGhlIG1vZHVsZSBhbmQKKy8vIHRoZSAzIGNoYXJhY3RlciAnbmFtZScgb2YgdGhlIG1vZHVsZSBmb3IgbWFya2luZyB0aGUgdHJhY2UgbG9ncy4KK21vZHVsZVRyYWNlSW5mbyBnVm9zVHJhY2VJbmZvWyBWT1NfTU9EVUxFX0lEX01BWCBdID0KK3sKKyAgIFtWT1NfTU9EVUxFX0lEX0JBUF0gICAgICAgID0geyAoMTw8Vk9TX1RSQUNFX0xFVkVMX0ZBVEFMKSwgIkJBUCIgfSwKKyAgIFtWT1NfTU9EVUxFX0lEX1RMXSAgICAgICAgID0geyAoMTw8Vk9TX1RSQUNFX0xFVkVMX0ZBVEFMKSwgIlRMICIgfSwKKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCisgICBbVk9TX01PRFVMRV9JRF9CQUxdICAgICAgICA9IHsgKDE8PFZPU19UUkFDRV9MRVZFTF9GQVRBTCksICJCQUwiIH0sCisgICBbVk9TX01PRFVMRV9JRF9TQUxdICAgICAgICA9IHsgKDE8PFZPU19UUkFDRV9MRVZFTF9GQVRBTCksICJTQUwiIH0sCisgICBbVk9TX01PRFVMRV9JRF9TU0NdICAgICAgICA9IHsgKDE8PFZPU19UUkFDRV9MRVZFTF9GQVRBTCksICJTU0MiIH0sCisjZW5kaWYKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgIFtWT1NfTU9EVUxFX0lEX1dESV0gICAgICAgID0geyAoMTw8Vk9TX1RSQUNFX0xFVkVMX0ZBVEFMKSwgIldESSJ9LAorI2VuZGlmCisgICBbVk9TX01PRFVMRV9JRF9IRERdICAgICAgICA9IHsgKDE8PFZPU19UUkFDRV9MRVZFTF9GQVRBTCksICJIREQiIH0sCisgICBbVk9TX01PRFVMRV9JRF9TTUVdICAgICAgICA9IHsgKDE8PFZPU19UUkFDRV9MRVZFTF9GQVRBTCksICJTTUUiIH0sCisgICBbVk9TX01PRFVMRV9JRF9QRV0gICAgICAgICA9IHsgKDE8PFZPU19UUkFDRV9MRVZFTF9GQVRBTCksICJQRSAiIH0sCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworICAgW1ZPU19NT0RVTEVfSURfSEFMXSAgICAgICAgPSB7ICgxPDxWT1NfVFJBQ0VfTEVWRUxfRkFUQUwpLCAiSEFMIiB9LAorI2Vsc2UKKyAgIFtWT1NfTU9EVUxFX0lEX1dEQV0gICAgICAgID0geyAoMTw8Vk9TX1RSQUNFX0xFVkVMX0ZBVEFMKSwgIldEQSIgfSwKKyNlbmRpZgorICAgW1ZPU19NT0RVTEVfSURfU1lTXSAgICAgICAgPSB7ICgxPDxWT1NfVFJBQ0VfTEVWRUxfRkFUQUwpLCAiU1lTIiB9LAorICAgW1ZPU19NT0RVTEVfSURfVk9TU10gICAgICAgPSB7IFZPU19ERUZBVUxUX1RSQUNFX0xFVkVMLCAiVk9TIiB9LAorI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgIFtWT1NfTU9EVUxFX0lEX1NBUF0gICAgICAgID0geyAoMTw8Vk9TX1RSQUNFX0xFVkVMX0ZBVEFMKSwgIlNBUCIgfSwKKyAgIFtWT1NfTU9EVUxFX0lEX0hERF9TT0ZUQVBdID0geyAoMTw8Vk9TX1RSQUNFX0xFVkVMX0ZBVEFMKSwgIkhTUCIgfSwKKyNlbmRpZgorfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRnVuY3Rpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHZvc190cmFjZV9zZXRMZXZlbCggVk9TX01PRFVMRV9JRCBtb2R1bGUsIFZPU19UUkFDRV9MRVZFTCBsZXZlbCApCit7CisgICAvLyBNYWtlIHN1cmUgdGhlIGNhbGxlciBpcyBwYXNzaW5nIGluIGEgdmFsaWQgTEVWRUwuCisgICBpZiAoIGxldmVsID49IFZPU19UUkFDRV9MRVZFTF9NQVggKQorICAgeworICAgICAgcHJfZXJyKCIlczogSW52YWxpZCB0cmFjZSBsZXZlbCAlZCBwYXNzZWQgaW4hXG4iLCBfX0ZVTkNUSU9OX18sIGxldmVsKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLy8gVHJlYXQgJ25vbmUnIGRpZmZlcmVudGx5LiAgTk9ORSBtZWFucyB3ZSBoYXZlIHRvIHJ1biBvZmYgYWxsCisgICAvLyB0aGUgYml0cyBpbiB0aGUgYml0IG1hc2sgc28gbm9uZSBvZiB0aGUgdHJhY2VzIGFwcGVhci4gIEFueXRoaW5nIG90aGVyCisgICAvLyB0aGFuICdub25lJyBtZWFucyB3ZSBuZWVkIHRvIHR1cm4gT04gYSBiaXQgaW4gdGhlIGJpdG1hc2suCisgICBpZiAoIFZPU19UUkFDRV9MRVZFTF9OT05FID09IGxldmVsICkKKyAgIHsKKyAgICAgIGdWb3NUcmFjZUluZm9bIG1vZHVsZSBdLm1vZHVsZVRyYWNlTGV2ZWwgPSBWT1NfVFJBQ0VfTEVWRUxfTk9ORTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8vIFNldCB0aGUgZGVzaXJlZCBiaXQgaW4gdGhlIGJpdCBtYXNrIGZvciB0aGUgbW9kdWxlIHRyYWNlIGxldmVsLgorICAgICAgZ1Zvc1RyYWNlSW5mb1sgbW9kdWxlIF0ubW9kdWxlVHJhY2VMZXZlbCB8PSBWT1NfVFJBQ0VfTEVWRUxfVE9fTU9EVUxFX0JJVE1BU0soIGxldmVsICk7CisgICB9Cit9CisKK3ZvaWQgdm9zX3RyYWNlX3NldFZhbHVlKCBWT1NfTU9EVUxFX0lEIG1vZHVsZSwgVk9TX1RSQUNFX0xFVkVMIGxldmVsLCB2X1U4X3Qgb24pCit7CisgICAvLyBNYWtlIHN1cmUgdGhlIGNhbGxlciBpcyBwYXNzaW5nIGluIGEgdmFsaWQgTEVWRUwuCisgICBpZiAoIGxldmVsIDwgMCAgfHwgbGV2ZWwgPj0gVk9TX1RSQUNFX0xFVkVMX01BWCApCisgICB7CisgICAgICBwcl9lcnIoIiVzOiBJbnZhbGlkIHRyYWNlIGxldmVsICVkIHBhc3NlZCBpbiFcbiIsIF9fRlVOQ1RJT05fXywgbGV2ZWwpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvLyBNYWtlIHN1cmUgdGhlIGNhbGxlciBpcyBwYXNzaW5nIGluIGEgdmFsaWQgbW9kdWxlLgorICAgaWYgKCBtb2R1bGUgPCAwIHx8IG1vZHVsZSA+PSBWT1NfTU9EVUxFX0lEX01BWCApCisgICB7CisgICAgICBwcl9lcnIoIiVzOiBJbnZhbGlkIG1vZHVsZSBpZCAlZCBwYXNzZWQgaW4hXG4iLCBfX0ZVTkNUSU9OX18sIG1vZHVsZSk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8vIFRyZWF0ICdub25lJyBkaWZmZXJlbnRseS4gIE5PTkUgbWVhbnMgd2UgaGF2ZSB0byB0dXJuIG9mZiBhbGwKKyAgIC8vIHRoZSBiaXRzIGluIHRoZSBiaXQgbWFzayBzbyBub25lIG9mIHRoZSB0cmFjZXMgYXBwZWFyLgorICAgaWYgKCBWT1NfVFJBQ0VfTEVWRUxfTk9ORSA9PSBsZXZlbCApCisgICB7CisgICAgICBnVm9zVHJhY2VJbmZvWyBtb2R1bGUgXS5tb2R1bGVUcmFjZUxldmVsID0gVk9TX1RSQUNFX0xFVkVMX05PTkU7CisgICB9CisgICAvLyBUcmVhdCAnQWxsJyBkaWZmZXJlbnRseS4gIEFsbCBtZWFucyB3ZSBoYXZlIHRvIHR1cm4gb24gYWxsCisgICAvLyB0aGUgYml0cyBpbiB0aGUgYml0IG1hc2sgc28gYWxsIG9mIHRoZSB0cmFjZXMgYXBwZWFyLgorICAgZWxzZSBpZiAoIFZPU19UUkFDRV9MRVZFTF9BTEwgPT0gbGV2ZWwgKQorICAgeworICAgICAgZ1Zvc1RyYWNlSW5mb1sgbW9kdWxlIF0ubW9kdWxlVHJhY2VMZXZlbCA9IDB4RkZGRjsKKyAgIH0KKworICAgZWxzZQorICAgeworICAgICAgaWYgKG9uKQorICAgICAgICAgLy8gU2V0IHRoZSBkZXNpcmVkIGJpdCBpbiB0aGUgYml0IG1hc2sgZm9yIHRoZSBtb2R1bGUgdHJhY2UgbGV2ZWwuCisgICAgICAgICBnVm9zVHJhY2VJbmZvWyBtb2R1bGUgXS5tb2R1bGVUcmFjZUxldmVsIHw9IFZPU19UUkFDRV9MRVZFTF9UT19NT0RVTEVfQklUTUFTSyggbGV2ZWwgKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIC8vIENsZWFyIHRoZSBkZXNpcmVkIGJpdCBpbiB0aGUgYml0IG1hc2sgZm9yIHRoZSBtb2R1bGUgdHJhY2UgbGV2ZWwuCisgICAgICAgICBnVm9zVHJhY2VJbmZvWyBtb2R1bGUgXS5tb2R1bGVUcmFjZUxldmVsICY9IH4oVk9TX1RSQUNFX0xFVkVMX1RPX01PRFVMRV9CSVRNQVNLKCBsZXZlbCApKTsKKyAgIH0KK30KKworCit2X0JPT0xfdCB2b3NfdHJhY2VfZ2V0TGV2ZWwoIFZPU19NT0RVTEVfSUQgbW9kdWxlLCBWT1NfVFJBQ0VfTEVWRUwgbGV2ZWwgKQoreworICAgdl9CT09MX3QgdHJhY2VPbiA9IFZPU19GQUxTRTsKKworICAgaWYgKCAoIFZPU19UUkFDRV9MRVZFTF9OT05FID09IGxldmVsICkgfHwKKyAgICAgICAgKCBWT1NfVFJBQ0VfTEVWRUxfQUxMICA9PSBsZXZlbCApIHx8CisgICAgICAgICggbGV2ZWwgPj0gVk9TX1RSQUNFX0xFVkVMX01BWCAgKSAgICApCisgICB7CisgICAgICB0cmFjZU9uID0gVk9TX0ZBTFNFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgdHJhY2VPbiA9ICggbGV2ZWwgJiBnVm9zVHJhY2VJbmZvWyBtb2R1bGUgXS5tb2R1bGVUcmFjZUxldmVsICkgPyBWT1NfVFJVRSA6IFZPU19GQUxTRTsKKyAgIH0KKworICAgcmV0dXJuKCB0cmFjZU9uICk7Cit9CisKK3ZvaWQgdm9zX3NucHJpbnRmKGNoYXIgKnN0ckJ1ZmZlciwgdW5zaWduZWQgIGludCBzaXplLCBjaGFyICpzdHJGb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IHZhbDsKKworICAgIHZhX3N0YXJ0KCB2YWwsIHN0ckZvcm1hdCApOworICAgIHNucHJpbnRmIChzdHJCdWZmZXIsIHNpemUsIHN0ckZvcm1hdCwgdmFsKTsKKyAgICB2YV9lbmQoIHZhbCApOworfQorCisKKworI2lmZGVmIFZPU19FTkFCTEVfVFJBQ0lORworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX3RyYWNlX21zZygpIC0gRXh0ZXJuYWxseSBjYWxsZWQgdHJhY2UgZnVuY3Rpb24KKworICBDaGVja3MgdGhlIGxldmVsIG9mIHNldmVyaXR5IGFuZCBhY2NvcmRpbmdseSBwcmludHMgdGhlIHRyYWNlIG1lc3NhZ2VzCisKKyAgXHBhcmFtIG1vZHVsZSAtIG1vZHVsZSBpZGVudGlmaWVyLiAgIEEgbWVtYmVyIG9mIHRoZSBWT1NfTU9EVUxFX0lECisgICAgICAgICBlbnVtZXJhdGlvbiB0aGF0IGlkZW50aWZpZXMgdGhlIG1vZHVsZSBpc3N1aW5nIHRoZSB0cmFjZSBtZXNzYWdlLgorCisgIFxwYXJhbSBsZXZlbCAtIHRyYWNlIGxldmVsLiAgIEEgbWVtYmVyIG9mIHRoZSBWT1NfVFJBQ0VfTEVWRUwKKyAgICAgICAgIGVudW1lcmF0aW9uIGluZGljYXRpbmcgdGhlIHNldmVyaXR5IG9mIHRoZSBjb25kaXRpb24gY2F1c2luZyB0aGUKKyAgICAgICAgIHRyYWNlIG1lc3NhZ2UgdG8gYmUgaXNzdWVkLiAgIE1vcmUgc2V2ZXJlIGNvbmRpdGlvbnMgYXJlIG1vcmUKKyAgICAgICAgIGxpa2VseSB0byBiZSBsb2dnZWQuCisKKyAgXHBhcmFtIHN0ckZvcm1hdCAtIGZvcm1hdCBzdHJpbmcuICBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuICBUaGlzIGZvcm1hdAorICAgICAgICAgc3RyaW5nIGNvbnRhaW5zIHByaW50Zi1saWtlIHJlcGxhY2VtZW50IHBhcmFtZXRlcnMsIHdoaWNoIGZvbGxvdworICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaW4gdGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QuCisKKyAgXHJldHVybiAgbm90aGluZworCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgdm9zX3RyYWNlX21zZyggVk9TX01PRFVMRV9JRCBtb2R1bGUsIFZPU19UUkFDRV9MRVZFTCBsZXZlbCwgY2hhciAqc3RyRm9ybWF0LCAuLi4gKQoreworICAgY2hhciBzdHJCdWZmZXJbVk9TX1RSQUNFX0JVRkZFUl9TSVpFXTsKKyAgIGludCBuOworCisgICAvLyBQcmludCB0aGUgdHJhY2UgbWVzc2FnZSB3aGVuIHRoZSBkZXNpcmVkIGxldmVsIGJpdCBpcyBzZXQgaW4gdGhlIG1vZHVsZQorICAgLy8gdHJhY2VsIGxldmVsIG1hc2suCisgICBpZiAoIGdWb3NUcmFjZUluZm9bIG1vZHVsZSBdLm1vZHVsZVRyYWNlTGV2ZWwgJiBWT1NfVFJBQ0VfTEVWRUxfVE9fTU9EVUxFX0JJVE1BU0soIGxldmVsICkgKQorICAgeworICAgICAgLy8gdGhlIHRyYWNlIGxldmVsIHN0cmluZ3MgaW4gYW4gYXJyYXkuICB0aGVzZSBhcmUgb3JkZXJlZCBpbiB0aGUgc2FtZSBvcmRlcgorICAgICAgLy8gYXMgdGhlIHRyYWNlIGxldmVscyBhcmUgZGVmaW5lZCBpbiB0aGUgZW51bSAoc2VlIFZPU19UUkFDRV9MRVZFTCkgc28gd2UKKyAgICAgIC8vIGNhbiBpbmRleCBpbnRvIHRoaXMgYXJyYXkgd2l0aCB0aGUgbGV2ZWwgYW5kIGdldCB0aGUgcmlnaHQgc3RyaW5nLiAgVGhlCisgICAgICAvLyB2b3MgdHJhY2UgbGV2ZWxzIGFyZS4uLgorICAgICAgLy8gbm9uZSwgRmF0YSwgRXJyb3IsIFdhcm5pbmcsIEluZm8sIEluZm9IaWdoLCBJbmZvTWVkLCBJbmZvTG93CisgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIFRSQUNFX0xFVkVMX1NUUltdID0geyAiICAiLCAiRiAiLCAiRSAiLCAiVyAiLCAiSSAiLCAiSUgiLCAiSU0iLCAiSUwiIH07CisgICAgICB2YV9saXN0IHZhbDsKKyAgICAgIHZhX3N0YXJ0KHZhbCwgc3RyRm9ybWF0KTsKKworICAgICAgLy8gcHJpbnQgdGhlIHByZWZpeCBzdHJpbmcgaW50byB0aGUgc3RyaW5nIGJ1ZmZlci4uLgorICAgICAgbiA9IHNucHJpbnRmKHN0ckJ1ZmZlciwgVk9TX1RSQUNFX0JVRkZFUl9TSVpFLCAiWyVkOiVkOiUyczolM3NdICIsCisgICAgICAgICAgICAgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLAorICAgICAgICAgICAgICAgICAgIGluX2ludGVycnVwdCgpID8gMCA6IGN1cnJlbnQtPnBpZCwKKyAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBUUkFDRV9MRVZFTF9TVFJbIGxldmVsIF0sCisgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgZ1Zvc1RyYWNlSW5mb1sgbW9kdWxlIF0ubW9kdWxlTmFtZVN0ciApOworCisgICAgICAvLyBwcmludCB0aGUgZm9ybWF0dGVkIGxvZyBtZXNzYWdlIGFmdGVyIHRoZSBwcmVmaXggc3RyaW5nLgorICAgICAgdnNucHJpbnRmKHN0ckJ1ZmZlciArIG4sIFZPU19UUkFDRV9CVUZGRVJfU0laRSAtIG4sIHN0ckZvcm1hdCwgdmFsICk7CisgICAgICBwcl9lcnIoIiVzXG4iLCBzdHJCdWZmZXIpOworICAgICAgdmFfZW5kKCB2YWwpOworICAgfQorfQorCit2b2lkIHZvc190cmFjZV9kaXNwbGF5KHZvaWQpCit7CisgICBWT1NfTU9EVUxFX0lEIG1vZHVsZUlkOworCisgICBwcl9lcnIoIiAgICAgMSlGQVRBTCAgMilFUlJPUiAgMylXQVJOICA0KUlORk8gIDUpSU5GT19IICA2KUlORk9fTSAgNylJTkZPX0xcbiIpOworICAgZm9yIChtb2R1bGVJZCA9IDA7IG1vZHVsZUlkIDwgVk9TX01PRFVMRV9JRF9NQVg7ICsrbW9kdWxlSWQpCisgICB7CisgICAgICBwcl9lcnIoIiUyZCklcyAgICAlcyAgICAgICAgJXMgICAgICAgJXMgICAgICAgJXMgICAgICAgICVzICAgICAgICAgJXMgICAgICAgICAlc1xuIiwKKyAgICAgICAgICAgICAoaW50KW1vZHVsZUlkLAorICAgICAgICAgICAgIGdWb3NUcmFjZUluZm9bbW9kdWxlSWRdLm1vZHVsZU5hbWVTdHIsCisgICAgICAgICAgICAgKGdWb3NUcmFjZUluZm9bbW9kdWxlSWRdLm1vZHVsZVRyYWNlTGV2ZWwgJiAoMSA8PCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwpKSA/ICJYIjoiICIsCisgICAgICAgICAgICAgKGdWb3NUcmFjZUluZm9bbW9kdWxlSWRdLm1vZHVsZVRyYWNlTGV2ZWwgJiAoMSA8PCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IpKSA/ICJYIjoiICIsCisgICAgICAgICAgICAgKGdWb3NUcmFjZUluZm9bbW9kdWxlSWRdLm1vZHVsZVRyYWNlTGV2ZWwgJiAoMSA8PCBWT1NfVFJBQ0VfTEVWRUxfV0FSTikpID8gIlgiOiIgIiwKKyAgICAgICAgICAgICAoZ1Zvc1RyYWNlSW5mb1ttb2R1bGVJZF0ubW9kdWxlVHJhY2VMZXZlbCAmICgxIDw8IFZPU19UUkFDRV9MRVZFTF9JTkZPKSkgPyAiWCI6IiAiLAorICAgICAgICAgICAgIChnVm9zVHJhY2VJbmZvW21vZHVsZUlkXS5tb2R1bGVUcmFjZUxldmVsICYgKDEgPDwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCkpID8gIlgiOiIgIiwKKyAgICAgICAgICAgICAoZ1Zvc1RyYWNlSW5mb1ttb2R1bGVJZF0ubW9kdWxlVHJhY2VMZXZlbCAmICgxIDw8IFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCkpID8gIlgiOiIgIiwKKyAgICAgICAgICAgICAoZ1Zvc1RyYWNlSW5mb1ttb2R1bGVJZF0ubW9kdWxlVHJhY2VMZXZlbCAmICgxIDw8IFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVykpID8gIlgiOiIgIgorICAgICAgICAgKTsKKyAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1ZPU1Mvc3JjL3Zvc190eXBlcy5jIGIvQ09SRS9WT1NTL3NyYy92b3NfdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTZhYTg2Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9WT1NTL3NyYy92b3NfdHlwZXMuYwpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHZvc19UeXBlcy5jCisgIAorICBcYnJpZWYgdmlydHVhbCBPcGVyYXRpbmcgU3lzdGVtIFNlcnZpZXMgKHZPUykKKyAgICAgICAgICAgICAgIAorICAgQmFzaWMgdHlwZSBkZWZpbml0aW9ucyAKKyAgCisgICBDb3B5cmlnaHQgMjAwOCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiAkSGVhZGVyJCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluY2x1ZGUgRmlsZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKworLy8jaW5jbHVkZSAid2xhbl9saWJyYV9jb25maWcuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgVHlwZSBkZWNsYXJhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2F0b21pY19zZXRfVTMyKCkgLSBzZXQgYSBVMzIgdmFyaWFibGUgYXRvbWljYWxseSAKKyAgCisgIFxwYXJhbSBwVGFyZ2V0IC0gcG9pbnRlciB0byB0aGUgdl9VMzJfdCB0byBzZXQuCisgIAorICBccGFyYW0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gc2V0IGluIHRoZSB2X1UzMl90IHZhcmlhYmxlLgorICAKKyAgXHJldHVybiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIHByZXZpb3VzbHkgaW4gdGhlIHZfVTMyX3QgYmVmb3JlCisgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBpcyBzZXQuCisgICAgCisgIFxzYSB2b3NfYXRvbWljX2luY3JlbWVudF9VMzIoKSwgdm9zX2F0b21pY19kZWNyZW1lbnRfVTMyKCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit2X1UzMl90IHZvc19hdG9taWNfc2V0X1UzMiggdl9VMzJfdCAqcFRhcmdldCwgdl9VMzJfdCB2YWx1ZSApCit7CisgIHZfVTMyX3Qgb2xkdmFsOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgIGlmIChwVGFyZ2V0ID09IE5VTEwpCisgIHsKKyAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiTlVMTCBwdHIgcGFzc2VkIGludG8gJXMiLF9fRlVOQ1RJT05fXyk7CisgICAgIHJldHVybiAwOworICB9CisgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgb2xkdmFsID0gKnBUYXJnZXQ7CisgICpwVGFyZ2V0ID0gdmFsdWU7CisgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgLy8gIHZfVTMyX3QgcHJldiA9IGF0b21pY19yZWFkKHBUYXJnZXQpOworICAvLyAgYXRvbWljX3NldChwVGFyZ2V0LCB2YWx1ZSk7CisgIHJldHVybiBvbGR2YWw7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgdm9zX2F0b21pY19pbmNyZW1lbnRfVTMyKCkgLSBJbmNyZW1lbnQgYSBVMzIgdmFyaWFibGUgYXRvbWljYWxseSAKKyAgCisgIFxwYXJhbSBwVGFyZ2V0IC0gcG9pbnRlciB0byB0aGUgdl9VMzJfdCB0byBpbmNyZW1lbnQuCisgIAorICBccmV0dXJuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGFmdGVyIHRoZSAKKyAgICAgICAgICBpbmNyZW1lbnQgb2NjdXJzLgorICAgIAorICBcc2Egdm9zX2F0b21pY19kZWNyZW1lbnRfVTMyKCksIHZvc19hdG9taWNfc2V0X1UzMigpCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAordl9VMzJfdCB2b3NfYXRvbWljX2luY3JlbWVudF9VMzIoIHZfVTMyX3QgKnBUYXJnZXQgKQoreworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBpZiAocFRhcmdldCA9PSBOVUxMKQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIk5VTEwgcHRyIHBhc3NlZCBpbnRvICVzIixfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gMDsKKyAgfQorICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICsrKnBUYXJnZXQ7IAorICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgIHJldHVybiAqcFRhcmdldDsKKyAgLy8gIHJldHVybiBhdG9taWNfaW5jX3JldHVybihwVGFyZ2V0KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB2b3NfYXRvbWljX2RlY3JlbWVudF9VMzIoKSAtIERlY3JlbWVudCBhIFUzMiB2YXJpYWJsZSBhdG9taWNhbGx5IAorICAKKyAgXHBhcmFtIHBUYXJnZXQgLSBwb2ludGVyIHRvIHRoZSB2X1UzMl90IHRvIGRlY3JlbWVudC4KKyAgCisgIFxyZXR1cm4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgYWZ0ZXIgdGhlIAorICAgICAgICAgIGRlY3JlbWVudCBvY2N1cnMuCisgICAgCisgIFxzYSB2b3NfYXRvbWljX2luY3JlbWVudF9VMzIoKSwgdm9zX2F0b21pY19zZXRfVTMyKCkKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit2X1UzMl90IHZvc19hdG9taWNfZGVjcmVtZW50X1UzMiggdl9VMzJfdCAqcFRhcmdldCApCit7IAorICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBpZiAocFRhcmdldCA9PSBOVUxMKQorICB7CisgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIk5VTEwgcHRyIHBhc3NlZCBpbnRvICVzIixfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gMDsKKyAgfQorICAgLy8gcmV0dXJuIGF0b21pY19kZWNfcmV0dXJuKHBUYXJnZXQpOworICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgLS0qcFRhcmdldDsgCisgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICByZXR1cm4gKCpwVGFyZ2V0KTsKK30KKwordl9VMzJfdCB2b3NfYXRvbWljX2luY3JlbWVudF9VMzJfYnlfdmFsdWUoIHZfVTMyX3QgKnBUYXJnZXQsIHZfVTMyX3QgdmFsdWUgKQoreworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgIGlmIChwVGFyZ2V0ID09IE5VTEwpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJOVUxMIHB0ciBwYXNzZWQgaW50byAlcyIsX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiAwOworICAgfQorICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgKnBUYXJnZXQgKz0gdmFsdWUgOworICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgcmV0dXJuICgqcFRhcmdldCk7Cit9ICAgIAorCit2X1UzMl90IHZvc19hdG9taWNfZGVjcmVtZW50X1UzMl9ieV92YWx1ZSggdl9VMzJfdCAqcFRhcmdldCwgdl9VMzJfdCB2YWx1ZSApCit7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgaWYgKHBUYXJnZXQgPT0gTlVMTCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIk5VTEwgcHRyIHBhc3NlZCBpbnRvICVzIixfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIDA7CisgICB9CisgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAqcFRhcmdldCAtPSB2YWx1ZSA7CisgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICByZXR1cm4gKCpwVGFyZ2V0KTsKKworfQorCisKK3ZfVTMyX3Qgdm9zX2dldF9za2lwX3NzaWRfY2hlY2sodm9pZCkKK3sKKy8qKlRoaXMgaXMgbmVlZGVkIGJ5IG9ubHkgQU1TUyBmb3IgaW50ZXJvcGVyYXRhYmlsaXR5ICoqLworCisgICAgcmV0dXJuIDE7Cit9ICAgIAorCisKK3ZfVTMyX3Qgdm9zX2dldF9za2lwXzExZV9jaGVjayh2b2lkKQoreworICAgIC8qIHRoaXMgaXMgbmVlZGVkIG9ubHkgZm9yIEFNU1MgZm9yIGludGVyb3ByYXRhYmlsaXR5ICoqLworICAgIHJldHVybiAxOworfSAgICAKZGlmZiAtLWdpdCBhL0NPUkUvVk9TUy9zcmMvdm9zX3V0aWxzLmMgYi9DT1JFL1ZPU1Mvc3JjL3Zvc191dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NGM5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1ZPU1Mvc3JjL3Zvc191dGlscy5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRklMRTogICAgICAgICB2b3NfdXRpbHMuYworCisgIE9WRVJWSUVXOiAgICAgVGhpcyBzb3VyY2UgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3Igdk9TIGNyeXB0byBBUElzCisgICAgICAgICAgICAgICAgVGhlIGZvdXIgQVBJcyBtZW50aW9uZWQgaW4gdGhpcyBmaWxlIGFyZSB1c2VkIGZvcgorICAgICAgICAgICAgICAgIGluaXRpYWxpemluZywgYW5kIGRlLWluaXRpYWxpemluZyBhIGNyeXB0byBjb250ZXh0LCBhbmQKKyAgICAgICAgICAgICAgICBvYnRhaW5pbmcgdHJ1bHkgcmFuZG9tIGRhdGEgKGZvciBrZXlzKSwgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgIFNIQTEgSE1BQywgYW5kIEFFUyBlbmNyeXB0IGFuZCBkZWNyeXB0IHJvdXRpbmVzLgorCisgICAgICAgICAgICAgICAgVGhlIHJvdXRpbmVzIGluY2x1ZGU6CisgICAgICAgICAgICAgICAgdm9zX2NyeXB0b19pbml0KCkgLSBJbml0aWFsaXplcyBDcnlwdG8gbW9kdWxlCisgICAgICAgICAgICAgICAgdm9zX2NyeXB0b19kZWluaXQoKSAtIERlLWluaXRpYWxpemVzIENyeXB0byBtb2R1bGUKKyAgICAgICAgICAgICAgICB2b3NfcmFuZF9nZXRfYnl0ZXMoKSAtIEdlbmVyYXRlcyByYW5kb20gYnl0ZQorICAgICAgICAgICAgICAgIHZvc19zaGExX2htYWNfc3RyKCkgLSBHZW5lcmF0ZSB0aGUgSE1BQy1TSEExIG9mIGEgc3RyaW5nIGdpdmVuIGEga2V5CisgICAgICAgICAgICAgICAgdm9zX2VuY3J5cHRfQUVTKCkgLSBHZW5lcmF0ZSBBRVMgRW5jcnlwdGVkIGJ5dGUgc3RyZWFtCisgICAgICAgICAgICAgICAgdm9zX2RlY3J5cHRfQUVTKCkgLSBEZWNyeXB0cyBhbiBBRVMgRW5jcnlwdGVkIGJ5dGUgc3RyZWFtCisKKyAgREVQRU5ERU5DSUVTOgorCisgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAgICAgICAgICAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRURJVCBISVNUT1JZIEZPUiBNT0RVTEUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKyNpbmNsdWRlICJ2b3NfdXRpbHMuaCIKKyNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxjcnlwdG8vaGFzaC5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdsb2JhbCBEYXRhIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBzdHJ1Y3QgY3J5cHRvX2FoYXNoICp3Y25zc193bGFuX2NyeXB0b19hbGxvY19haGFzaChjb25zdCBjaGFyICphbGdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWFzayk7CisKK2V4dGVybiBpbnQgd2Nuc3Nfd2xhbl9jcnlwdG9fYWhhc2hfZGlnZXN0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpOworZXh0ZXJuIHZvaWQgd2Nuc3Nfd2xhbl9jcnlwdG9fZnJlZV9haGFzaChzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0pOworZXh0ZXJuIGludCB3Y25zc193bGFuX2NyeXB0b19haGFzaF9zZXRrZXkoc3RydWN0IGNyeXB0b19haGFzaCAqdGZtLCBjb25zdCB1OCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbik7CitleHRlcm4gc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICp3Y25zc193bGFuX2NyeXB0b19hbGxvY19hYmxrY2lwaGVyKGNvbnN0IGNoYXIgKmFsZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgdHlwZSwgdTMyIG1hc2spOworZXh0ZXJuIHZvaWQgd2Nuc3Nfd2xhbl9hYmxrY2lwaGVyX3JlcXVlc3RfZnJlZShzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEpOworZXh0ZXJuIHZvaWQgd2Nuc3Nfd2xhbl9jcnlwdG9fZnJlZV9hYmxrY2lwaGVyKHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgVmFyaWFibGUgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEZ1bmN0aW9uIERlZmluaXRpb25zIGFuZCBEb2N1bWVudGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFxicmllZiB2b3NfY3J5cHRvX2luaXQoKSAtIEluaXRpYWxpemVzIENyeXB0byBtb2R1bGUKKworICBUaGUgdm9zX2NyeXB0b19pbml0KCkgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgQ3J5cHRvIG1vZHVsZS4KKworICBccGFyYW0gcGhDcnlwdFByb3YgLSBwb2ludGVyIHRvIHRoZSBDcnlwdCBoYW5kbGUKKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIFN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgcmFuZG9tIG1lbW9yeS4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBwYkJ1ZiBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIGl0IGZhaWxzIGR1ZSB0bworICAgICAgICAgIHVua25vd24gcmVhc29ucworCisgICAgICAgKioqVk9TX1NUQVRVU19FX1JFU09VUkNFUyAtIFN5c3RlbSByZXNvdXJjZXMgKG90aGVyIHRoYW4gbWVtb3J5KQorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZQorICBcc2EKKworICAgICggKioqIHJldHVybiB2YWx1ZSBub3QgY29uc2lkZXJlZCB5ZXQgKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19jcnlwdG9faW5pdCggdl9VMzJfdCAqcGhDcnlwdFByb3YgKQoreworICAgIFZPU19TVEFUVVMgdVJlc3VsdCA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworCisgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHJlcXVpcmUgYSBjcnlwdG8gY29udGV4dAorICAgICpwaENyeXB0UHJvdiAgPSAodl9VMzJfdClOVUxMOworICAgIHVSZXN1bHQgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgcmV0dXJuICggdVJlc3VsdCApOworfQorCitWT1NfU1RBVFVTIHZvc19jcnlwdG9fZGVpbml0KCB2X1UzMl90IGhDcnlwdFByb3YgKQoreworICAgIFZPU19TVEFUVVMgdVJlc3VsdCA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworCisgICAgLy8gQ3J5cHRSZWxlYXNlQ29udGV4dCBzdWNjZWVkZWQKKyAgICB1UmVzdWx0ID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICAgcmV0dXJuICggdVJlc3VsdCApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgXGJyaWVmIHZvc19yYW5kX2dldF9ieXRlcygpIC0gR2VuZXJhdGVzIHJhbmRvbSBieXRlCisKKyAgVGhlIHZvc19yYW5kX2dldF9ieXRlcygpIGZ1bmN0aW9uIGdlbmVyYXRlIHJhbmRvbSBieXRlcy4KKworICBCdWZmZXIgc2hvdWxkIGJlIGFsbG9jYXRlZCBiZWZvcmUgY2FsbGluZyB2b3NfcmFuZF9nZXRfYnl0ZXMoKS4KKworICBBdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgYW4gYWxyZWFkeSBpbml0aWFsaXplZCBsb2NrIHJlc3VsdHMgaW4KKyAgYSBmYWlsdXJlLgorCisgIFxwYXJhbSBsb2NrIC0gcG9pbnRlciB0byB0aGUgb3BhcXVlIGxvY2sgb2JqZWN0IHRvIGluaXRpYWxpemUKKworICBccmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUyAtIFN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgcmFuZG9tIG1lbW9yeS4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQVVMVCAgLSBwYkJ1ZiBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRSAtIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIGl0IGZhaWxzIGR1ZSB0bworICAgICAgICAgIHVua25vd24gcmVhc29ucworCisgICAgICAgKioqVk9TX1NUQVRVU19FX1JFU09VUkNFUyAtIFN5c3RlbSByZXNvdXJjZXMgKG90aGVyIHRoYW4gbWVtb3J5KQorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZQorICBcc2EKKworICAgICggKioqIHJldHVybiB2YWx1ZSBub3QgY29uc2lkZXJlZCB5ZXQgKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitWT1NfU1RBVFVTIHZvc19yYW5kX2dldF9ieXRlcyggdl9VMzJfdCBjcnlwdEhhbmRsZSwgdl9VOF90ICpwYkJ1Ziwgdl9VMzJfdCBudW1CeXRlcyApCit7CisgICBWT1NfU1RBVFVTIHVSZXN1bHQgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIC8vdl9VSU5UX3QgdUNvZGU7CisvLyAgIEhDUllQVFBST1YgaENyeXB0UHJvdiA9IChIQ1JZUFRQUk9WKSBjcnlwdEhhbmRsZTsKKworICAgLy9jaGVjayBmb3IgaW52YWxpZCBwb2ludGVyCisgICBpZiAoIE5VTEwgPT0gcGJCdWYgKQorICAgeworICAgICAgdVJlc3VsdCA9IFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgIHJldHVybiAoIHVSZXN1bHQgKTsKKyAgIH0KKworLy8jaWYgMAorICAgLy8gZ2V0X3JhbmRvbV9ieXRlcygpIGlzIGEgdm9pZCBwcm9jZWR1cmUKKyAgIGdldF9yYW5kb21fYnl0ZXMoIHBiQnVmLCBudW1CeXRlcyk7CisgICAvLyAiUmFuZG9tIHNlcXVlbmNlIGdlbmVyYXRlZC4iCisgICB1UmVzdWx0ID0gVk9TX1NUQVRVU19TVUNDRVNTOworLy8jZW5kaWYKKworICAgcmV0dXJuICggdVJlc3VsdCApOworfQorCisKKy8qKgorICogdm9zX3NoYTFfaG1hY19zdHIKKyAqCisgKiBGVU5DVElPTjoKKyAqIEdlbmVyYXRlIHRoZSBITUFDLVNIQTEgb2YgYSBzdHJpbmcgZ2l2ZW4gYSBrZXkuCisgKgorICogTE9HSUM6CisgKiBTdGFuZGFyZCBITUFDIHByb2Nlc3NpbmcgZnJvbSBSRkMgMjEwNC4gVGhlIGNvZGUgaXMgcHJvdmlkZWQgaW4gdGhlCisgKiBhcHBlbmRpeCBvZiB0aGUgUkZDLgorICoKKyAqIEFTU1VNUFRJT05TOgorICogVGhlIFJGQyBpcyBjb3JyZWN0LgorICoKKyAqIEBwYXJhbSB0ZXh0IHRleHQgdG8gYmUgaGFzaGVkCisgKiBAcGFyYW0gdGV4dExlbiBsZW5ndGggb2YgdGV4dAorICogQHBhcmFtIGtleSBrZXkgdG8gdXNlIGZvciBITUFDCisgKiBAcGFyYW0ga2V5TGVuIGxlbmd0aCBvZiBrZXkKKyAqIEBwYXJhbSBkaWdlc3QgaG9sZHMgcmVzdWx0YW50IFNIQTEgSE1BQyAoMjBCKQorICoKKyAqIEByZXR1cm4gVk9TX1NUQVRVU19TVUNDU1MgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICoKKyAqLworCitzdHJ1Y3QgaG1hY19zaGExX3Jlc3VsdCB7CisgICAgc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsKKyAgICBpbnQgZXJyOworfTsKKworc3RhdGljIHZvaWQgaG1hY19zaGExX2NvbXBsZXRlKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxLCBpbnQgZXJyKQoreworICAgIHN0cnVjdCBobWFjX3NoYTFfcmVzdWx0ICpyID0gcmVxLT5kYXRhOworICAgIGlmIChlcnIgPT0gLUVJTlBST0dSRVNTKQorICAgICAgICByZXR1cm47CisgICAgci0+ZXJyID0gZXJyOworICAgIGNvbXBsZXRlKCZyLT5jb21wbGV0aW9uKTsKK30KKworaW50IGhtYWNfc2hhMSh2X1U4X3QgKmtleSwgdl9VOF90IGtzaXplLCBjaGFyICpwbGFpbnRleHQsIHZfVThfdCBwc2l6ZSwKKyAgICAgICAgICAgICAgdl9VOF90ICpvdXRwdXQsIHZfVThfdCBvdXRsZW4pCit7CisgICAgaW50IHJldCA9IDA7CisgICAgc3RydWN0IGNyeXB0b19haGFzaCAqdGZtOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKyAgICBzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxOworICAgIHN0cnVjdCBobWFjX3NoYTFfcmVzdWx0IHRyZXN1bHQ7CisgICAgdm9pZCAqaGFzaF9idWZmID0gTlVMTDsKKworICAgIHVuc2lnbmVkIGNoYXIgaGFzaF9yZXN1bHRbNjRdOworICAgIGludCBpOworCisgICAgbWVtc2V0KG91dHB1dCwgMCwgb3V0bGVuKTsKKworICAgIGluaXRfY29tcGxldGlvbigmdHJlc3VsdC5jb21wbGV0aW9uKTsKKworICAgIHRmbSA9IHdjbnNzX3dsYW5fY3J5cHRvX2FsbG9jX2FoYXNoKCJobWFjKHNoYTEpIiwgQ1JZUFRPX0FMR19UWVBFX0FIQVNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19BTEdfVFlQRV9BSEFTSF9NQVNLKTsKKyAgICBpZiAoSVNfRVJSKHRmbSkpIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUyxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJjcnlwdG9fYWxsb2NfYWhhc2ggZmFpbGVkIik7CisgICAgICAgIHJldCA9IFBUUl9FUlIodGZtKTsKKyAgICAgICAgZ290byBlcnJfdGZtOworICAgIH0KKworICAgIHJlcSA9IGFoYXNoX3JlcXVlc3RfYWxsb2ModGZtLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIXJlcSkgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZXF1ZXN0IGZvciBobWFjKHNoYTEpIik7CisgICAgICAgIHJldCA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gZXJyX3JlcTsKKyAgICB9CisKKyAgICBhaGFzaF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhtYWNfc2hhMV9jb21wbGV0ZSwgJnRyZXN1bHQpOworCisgICAgaGFzaF9idWZmID0ga3phbGxvYyhwc2l6ZSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFoYXNoX2J1ZmYpIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUyxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJmYWlsZWQgdG8ga3phbGxvYyBoYXNoX2J1ZmYiKTsKKyAgICAgICAgcmV0ID0gLUVOT01FTTsKKyAgICAgICAgZ290byBlcnJfaGFzaF9idWY7CisgICAgfQorCisgICAgbWVtc2V0KGhhc2hfcmVzdWx0LCAwLCA2NCk7CisgICAgbWVtY3B5KGhhc2hfYnVmZiwgcGxhaW50ZXh0LCBwc2l6ZSk7CisgICAgc2dfaW5pdF9vbmUoJnNnLCBoYXNoX2J1ZmYsIHBzaXplKTsKKworICAgIGlmIChrc2l6ZSkgeworICAgICAgICBjcnlwdG9fYWhhc2hfY2xlYXJfZmxhZ3ModGZtLCB+MCk7CisgICAgICAgIHJldCA9IHdjbnNzX3dsYW5fY3J5cHRvX2FoYXNoX3NldGtleSh0Zm0sIGtleSwga3NpemUpOworCisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiY3J5cHRvX2FoYXNoX3NldGtleSBmYWlsZWQiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyX3NldGtleTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgJnNnLCBoYXNoX3Jlc3VsdCwgcHNpemUpOworICAgIHJldCA9IHdjbnNzX3dsYW5fY3J5cHRvX2FoYXNoX2RpZ2VzdChyZXEpOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUyxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJyZXQgMHgleCIpOworCisgICAgc3dpdGNoIChyZXQpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGZvciAoaT0wOyBpPCBvdXRsZW47IGkrKykKKyAgICAgICAgICAgIG91dHB1dFtpXSA9IGhhc2hfcmVzdWx0W2ldOworICAgICAgICBicmVhazsKKyAgICBjYXNlIC1FSU5QUk9HUkVTUzoKKyAgICBjYXNlIC1FQlVTWToKKyAgICAgICAgcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZ0cmVzdWx0LmNvbXBsZXRpb24pOworICAgICAgICBpZiAoIXJldCAmJiAhdHJlc3VsdC5lcnIpIHsKKyAgICAgICAgICAgIElOSVRfQ09NUExFVElPTih0cmVzdWx0LmNvbXBsZXRpb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIndhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIGlmICghcmV0KQorICAgICAgICAgICAgICAgIHJldCA9IHRyZXN1bHQuZXJyOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKK291dDoKK2Vycl9zZXRrZXk6CisgICAga2ZyZWUoaGFzaF9idWZmKTsKK2Vycl9oYXNoX2J1ZjoKKyAgICBhaGFzaF9yZXF1ZXN0X2ZyZWUocmVxKTsKK2Vycl9yZXE6CisgICAgd2Nuc3Nfd2xhbl9jcnlwdG9fZnJlZV9haGFzaCh0Zm0pOworZXJyX3RmbToKKyAgICByZXR1cm4gcmV0OworfQorCitWT1NfU1RBVFVTIHZvc19zaGExX2htYWNfc3RyKHZfVTMyX3QgY3J5cHRIYW5kbGUsIC8qIEhhbmRsZSAqLworICAgICAgICAgICB2X1U4X3QgKnBUZXh0LCAvKiBwb2ludGVyIHRvIGRhdGEgc3RyZWFtICovCisgICAgICAgICAgIHZfVTMyX3QgdGV4dExlbiwgLyogbGVuZ3RoIG9mIGRhdGEgc3RyZWFtICovCisgICAgICAgICAgIHZfVThfdCAqcEtleSwgLyogcG9pbnRlciB0byBhdXRoZW50aWNhdGlvbiBrZXkgKi8KKyAgICAgICAgICAgdl9VMzJfdCBrZXlMZW4sIC8qIGxlbmd0aCBvZiBhdXRoZW50aWNhdGlvbiBrZXkgKi8KKyAgICAgICAgICAgdl9VOF90IGRpZ2VzdFtWT1NfRElHRVNUX1NIQTFfU0laRV0pLyogY2FsbGVyIGRpZ2VzdCB0byBiZSBmaWxsZWQgaW4gKi8KK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHJldCA9IGhtYWNfc2hhMSgKKyAgICAgICAgICAgIHBLZXksICAgICAgICAgICAgICAgICAgIC8vdl9VOF90ICprZXksCisgICAgICAgICAgICAodl9VOF90KSBrZXlMZW4sICAgICAgICAvL3ZfVThfdCBrc2l6ZSwKKyAgICAgICAgICAgIChjaGFyICopcFRleHQsICAgICAgICAgIC8vY2hhciAqcGxhaW50ZXh0LAorICAgICAgICAgICAgKHZfVThfdCkgdGV4dExlbiwgICAgICAgLy92X1U4X3QgcHNpemUsCisgICAgICAgICAgICBkaWdlc3QsICAgICAgICAgICAgICAgICAvL3ZfVThfdCAqb3V0cHV0LAorICAgICAgICAgICAgVk9TX0RJR0VTVF9TSEExX1NJWkUgICAgLy92X1U4X3Qgb3V0bGVuCisgICAgICAgICAgICApOworCisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCJobWFjX3NoYTEoKSBjYWxsIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICAgIH0KKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICogdm9zX21kNV9obWFjX3N0cgorICoKKyAqIEZVTkNUSU9OOgorICogR2VuZXJhdGUgdGhlIEhNQUMtTUQ1IG9mIGEgc3RyaW5nIGdpdmVuIGEga2V5LgorICoKKyAqIExPR0lDOgorICogU3RhbmRhcmQgSE1BQyBwcm9jZXNzaW5nIGZyb20gUkZDIDIxMDQuIFRoZSBjb2RlIGlzIHByb3ZpZGVkIGluIHRoZQorICogYXBwZW5kaXggb2YgdGhlIFJGQy4KKyAqCisgKiBBU1NVTVBUSU9OUzoKKyAqIFRoZSBSRkMgaXMgY29ycmVjdC4KKyAqCisgKiBAcGFyYW0gdGV4dCB0ZXh0IHRvIGJlIGhhc2hlZAorICogQHBhcmFtIHRleHRMZW4gbGVuZ3RoIG9mIHRleHQKKyAqIEBwYXJhbSBrZXkga2V5IHRvIHVzZSBmb3IgSE1BQworICogQHBhcmFtIGtleUxlbiBsZW5ndGggb2Yga2V5CisgKiBAcGFyYW0gZGlnZXN0IGhvbGRzIHJlc3VsdGFudCBNRDUgSE1BQyAoMjBCKQorICoKKyAqIEByZXR1cm4gVk9TX1NUQVRVU19TVUNDU1MgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcworICoKKyAqLworc3RydWN0IGhtYWNfbWQ1X3Jlc3VsdCB7CisgICAgc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsKKyAgICBpbnQgZXJyOworfTsKKworc3RhdGljIHZvaWQgaG1hY19tZDVfY29tcGxldGUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXEsIGludCBlcnIpCit7CisgICAgc3RydWN0IGhtYWNfbWQ1X3Jlc3VsdCAqciA9IHJlcS0+ZGF0YTsKKyAgICBpZiAoZXJyID09IC1FSU5QUk9HUkVTUykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICByLT5lcnIgPSBlcnI7CisgICAgY29tcGxldGUoJnItPmNvbXBsZXRpb24pOworfQorCitpbnQgaG1hY19tZDUodl9VOF90ICprZXksIHZfVThfdCBrc2l6ZSwgY2hhciAqcGxhaW50ZXh0LCB2X1U4X3QgcHNpemUsCisgICAgICAgICAgICAgICAgdl9VOF90ICpvdXRwdXQsIHZfVThfdCBvdXRsZW4pCit7CisgICAgaW50IHJldCA9IDA7CisgICAgc3RydWN0IGNyeXB0b19haGFzaCAqdGZtOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKyAgICBzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxOworICAgIHN0cnVjdCBobWFjX21kNV9yZXN1bHQgdHJlc3VsdDsKKyAgICB2b2lkICpoYXNoX2J1ZmYgPSBOVUxMOworCisgICAgdW5zaWduZWQgY2hhciBoYXNoX3Jlc3VsdFs2NF07CisgICAgaW50IGk7CisKKyAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRsZW4pOworCisgICAgaW5pdF9jb21wbGV0aW9uKCZ0cmVzdWx0LmNvbXBsZXRpb24pOworCisgICAgdGZtID0gd2Nuc3Nfd2xhbl9jcnlwdG9fYWxsb2NfYWhhc2goImhtYWMobWQ1KSIsIENSWVBUT19BTEdfVFlQRV9BSEFTSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fQUxHX1RZUEVfQUhBU0hfTUFTSyk7CisgICAgaWYgKElTX0VSUih0Zm0pKSB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiY3J5cHRvX2FsbG9jX2FoYXNoIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldCA9IFBUUl9FUlIodGZtKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycl90Zm07CisgICAgfQorCisgICAgcmVxID0gYWhhc2hfcmVxdWVzdF9hbGxvYyh0Zm0sIEdGUF9LRVJORUwpOworICAgIGlmICghcmVxKSB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVlc3QgZm9yIGhtYWMobWQ1KSIpOworICAgICAgICByZXQgPSAtRU5PTUVNOworICAgICAgICBnb3RvIGVycl9yZXE7CisgICAgfQorCisgICAgYWhhc2hfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCBDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobWFjX21kNV9jb21wbGV0ZSwgJnRyZXN1bHQpOworCisgICAgaGFzaF9idWZmID0ga3phbGxvYyhwc2l6ZSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFoYXNoX2J1ZmYpIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUyxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJmYWlsZWQgdG8ga3phbGxvYyBoYXNoX2J1ZmYiKTsKKyAgICAgICAgcmV0ID0gLUVOT01FTTsKKyAgICAgICAgZ290byBlcnJfaGFzaF9idWY7CisgICAgfQorCisgICAgbWVtc2V0KGhhc2hfcmVzdWx0LCAwLCA2NCk7CisgICAgbWVtY3B5KGhhc2hfYnVmZiwgcGxhaW50ZXh0LCBwc2l6ZSk7CisgICAgc2dfaW5pdF9vbmUoJnNnLCBoYXNoX2J1ZmYsIHBzaXplKTsKKworICAgIGlmIChrc2l6ZSkgeworICAgICAgICBjcnlwdG9fYWhhc2hfY2xlYXJfZmxhZ3ModGZtLCB+MCk7CisgICAgICAgIHJldCA9IHdjbnNzX3dsYW5fY3J5cHRvX2FoYXNoX3NldGtleSh0Zm0sIGtleSwga3NpemUpOworCisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiY3J5cHRvX2FoYXNoX3NldGtleSBmYWlsZWQiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyX3NldGtleTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgJnNnLCBoYXNoX3Jlc3VsdCwgcHNpemUpOworICAgIHJldCA9IHdjbnNzX3dsYW5fY3J5cHRvX2FoYXNoX2RpZ2VzdChyZXEpOworCisgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUyxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJyZXQgMHgleCIpOworCisgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZm9yIChpPTA7IGk8IG91dGxlbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbaV0gPSBoYXNoX3Jlc3VsdFtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC1FSU5QUk9HUkVTUzoKKyAgICAgICAgY2FzZSAtRUJVU1k6CisgICAgICAgICAgICAgcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZ0cmVzdWx0LmNvbXBsZXRpb24pOworICAgICAgICAgICAgIGlmICghcmV0ICYmICF0cmVzdWx0LmVycikgeworICAgICAgICAgICAgICAgICAgSU5JVF9DT01QTEVUSU9OKHRyZXN1bHQuY29tcGxldGlvbik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIndhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgICAgICAgICAgICByZXQgPSB0cmVzdWx0LmVycjsKKyAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCitvdXQ6CitlcnJfc2V0a2V5OgorICAgICAgICBrZnJlZShoYXNoX2J1ZmYpOworZXJyX2hhc2hfYnVmOgorICAgICAgICBhaGFzaF9yZXF1ZXN0X2ZyZWUocmVxKTsKK2Vycl9yZXE6CisgICAgICAgIHdjbnNzX3dsYW5fY3J5cHRvX2ZyZWVfYWhhc2godGZtKTsKK2Vycl90Zm06CisgICAgICAgIHJldHVybiByZXQ7Cit9CisKK1ZPU19TVEFUVVMgdm9zX21kNV9obWFjX3N0cih2X1UzMl90IGNyeXB0SGFuZGxlLCAvKiBIYW5kbGUgKi8KKyAgICAgICAgICAgdl9VOF90ICpwVGV4dCwgLyogcG9pbnRlciB0byBkYXRhIHN0cmVhbSAqLworICAgICAgICAgICB2X1UzMl90IHRleHRMZW4sIC8qIGxlbmd0aCBvZiBkYXRhIHN0cmVhbSAqLworICAgICAgICAgICB2X1U4X3QgKnBLZXksIC8qIHBvaW50ZXIgdG8gYXV0aGVudGljYXRpb24ga2V5ICovCisgICAgICAgICAgIHZfVTMyX3Qga2V5TGVuLCAvKiBsZW5ndGggb2YgYXV0aGVudGljYXRpb24ga2V5ICovCisgICAgICAgICAgIHZfVThfdCBkaWdlc3RbVk9TX0RJR0VTVF9NRDVfU0laRV0pLyogY2FsbGVyIGRpZ2VzdCB0byBiZSBmaWxsZWQgaW4gKi8KK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHJldCA9IGhtYWNfbWQ1KAorICAgICAgICAgICAgcEtleSwgICAgICAgICAgICAgICAgICAgLy92X1U4X3QgKmtleSwKKyAgICAgICAgICAgICh2X1U4X3QpIGtleUxlbiwgICAgICAgIC8vdl9VOF90IGtzaXplLAorICAgICAgICAgICAgKGNoYXIgKilwVGV4dCwgICAgICAgICAgLy9jaGFyICpwbGFpbnRleHQsCisgICAgICAgICAgICAodl9VOF90KSB0ZXh0TGVuLCAgICAgICAvL3ZfVThfdCBwc2l6ZSwKKyAgICAgICAgICAgIGRpZ2VzdCwgICAgICAgICAgICAgICAgIC8vdl9VOF90ICpvdXRwdXQsCisgICAgICAgICAgICBWT1NfRElHRVNUX01ENV9TSVpFICAgICAvL3ZfVThfdCBvdXRsZW4KKyAgICAgICAgICAgICk7CisKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVk9TUyxWT1NfVFJBQ0VfTEVWRUxfRVJST1IsImhtYWNfbWQ1KCkgY2FsbCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICB9CisKKyAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisKK3N0cnVjdCBlY2JfYWVzX3Jlc3VsdCB7CisgICAgc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsKKyAgICBpbnQgZXJyOworfTsKKworc3RhdGljIHZvaWQgZWNiX2Flc19jb21wbGV0ZShzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcSwgaW50IGVycikKK3sKKyAgICBzdHJ1Y3QgZWNiX2Flc19yZXN1bHQgKnIgPSByZXEtPmRhdGE7CisgICAgaWYgKGVyciA9PSAtRUlOUFJPR1JFU1MpCisgICAgICAgIHJldHVybjsKKyAgICByLT5lcnIgPSBlcnI7CisgICAgY29tcGxldGUoJnItPmNvbXBsZXRpb24pOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX2VuY3J5cHRfQUVTKCkgLSBHZW5lcmF0ZSBBRVMgRW5jcnlwdGVkIGJ5dGUgc3RyZWFtCisKKyAgVGhlIHZvc19lbmNyeXB0X0FFUygpIGZ1bmN0aW9uIGdlbmVyYXRlcyB0aGUgZW5jcnlwdGVkIGJ5dGUgc3RyZWFtIGZvciBnaXZlbiB0ZXh0LgorCisgIEJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIGJlZm9yZSBjYWxsaW5nIHZvc19yYW5kX2dldF9ieXRlcygpLgorCisgIEF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSBhbiBhbHJlYWR5IGluaXRpYWxpemVkIGxvY2sgcmVzdWx0cyBpbgorICBhIGZhaWx1cmUuCisKKyAgXHBhcmFtIGxvY2sgLSBwb2ludGVyIHRvIHRoZSBvcGFxdWUgbG9jayBvYmplY3QgdG8gaW5pdGlhbGl6ZQorCisgIFxyZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTIC0gU3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCByYW5kb20gbWVtb3J5LgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBVUxUICAtIHBiQnVmIGlzIGFuIGludmFsaWQgcG9pbnRlci4KKworICAgICAgICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFIC0gZGVmYXVsdCByZXR1cm4gdmFsdWUgaWYgaXQgZmFpbHMgZHVlIHRvCisgICAgICAgICAgdW5rbm93biByZWFzb25zCisKKyAgICAgICAqKipWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpCisgICAgICAgICAgYXJlIHVuYXZhaWxhYmxlCisgIFxzYQorCisgICAgKCAqKiogcmV0dXJuIHZhbHVlIG5vdCBjb25zaWRlcmVkIHlldCApCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBJVl9TSVpFX0FFU18xMjggMTYKKyNkZWZpbmUgS0VZX1NJWkVfQUVTXzEyOCAxNgorI2RlZmluZSBBRVNfQkxPQ0tfU0laRSAxNgorCitWT1NfU1RBVFVTIHZvc19lbmNyeXB0X0FFUyh2X1UzMl90IGNyeXB0SGFuZGxlLCAvKiBIYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcFBsYWluVGV4dCwgLyogcG9pbnRlciB0byBkYXRhIHN0cmVhbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90ICpwQ2lwaGVydGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEtleSkgLyogcG9pbnRlciB0byBhdXRoZW50aWNhdGlvbiBrZXkgKi8KK3sKKy8vICAgIFZPU19TVEFUVVMgdVJlc3VsdCA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIHN0cnVjdCBlY2JfYWVzX3Jlc3VsdCByZXN1bHQ7CisgICAgc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxOworICAgIHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtOworICAgIGludCByZXQgPSAwOworICAgIGNoYXIgaXZbSVZfU0laRV9BRVNfMTI4XTsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfaW47CisgICAgc3RydWN0IHNjYXR0ZXJsaXN0IHNnX291dDsKKworICAgIGluaXRfY29tcGxldGlvbigmcmVzdWx0LmNvbXBsZXRpb24pOworCisgICAgdGZtID0gIHdjbnNzX3dsYW5fY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIoICJjYmMoYWVzKSIsIDAsIDApOworICAgIGlmIChJU19FUlIodGZtKSkgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImNyeXB0b19hbGxvY19hYmxrY2lwaGVyIGZhaWxlZCIpOworICAgICAgICByZXQgPSBQVFJfRVJSKHRmbSk7CisgICAgICAgIGdvdG8gZXJyX3RmbTsKKyAgICB9CisKKyAgICByZXEgPSBhYmxrY2lwaGVyX3JlcXVlc3RfYWxsb2ModGZtLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIXJlcSkgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVlc3QgZm9yIGNiYyhhZXMpIik7CisgICAgICAgIHJldCA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gZXJyX3JlcTsKKyAgICB9CisKKyAgICBhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKHJlcSwgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2JfYWVzX2NvbXBsZXRlLCAmcmVzdWx0KTsKKworCisgICAgY3J5cHRvX2FibGtjaXBoZXJfY2xlYXJfZmxhZ3ModGZtLCB+MCk7CisKKyAgICByZXQgPSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkodGZtLCBwS2V5LCBLRVlfU0laRV9BRVNfMTI4KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiY3J5cHRvX2NpcGhlcl9zZXRrZXkgZmFpbGVkIik7CisgICAgICAgIGdvdG8gZXJyX3NldGtleTsKKyAgICB9CisKKyAgICBtZW1zZXQoaXYsIDAsIElWX1NJWkVfQUVTXzEyOCk7CisKKyAgICBzZ19pbml0X29uZSgmc2dfaW4sIHBQbGFpblRleHQsIEFFU19CTE9DS19TSVpFKTsKKworICAgIHNnX2luaXRfb25lKCZzZ19vdXQsIHBDaXBoZXJ0ZXh0LCBBRVNfQkxPQ0tfU0laRSk7CisKKyAgICBhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgJnNnX2luLCAmc2dfb3V0LCBBRVNfQkxPQ0tfU0laRSwgaXYpOworCisgICAgY3J5cHRvX2FibGtjaXBoZXJfZW5jcnlwdChyZXEpOworCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZXJyX3NldGtleToKKyAgICB3Y25zc193bGFuX2FibGtjaXBoZXJfcmVxdWVzdF9mcmVlKHJlcSk7CitlcnJfcmVxOgorICAgIHdjbnNzX3dsYW5fY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcih0Zm0pOworZXJyX3RmbToKKyAgICAvL3JldHVybiByZXQ7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlcygpIGNhbGwgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgIH0KKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgdm9zX2RlY3J5cHRfQUVTKCkgLSBEZWNyeXB0cyBhbiBBRVMgRW5jcnlwdGVkIGJ5dGUgc3RyZWFtCisKKyAgVGhlIHZvc19kZWNyeXB0X0FFUygpIGZ1bmN0aW9uIGRlY3J5cHRzIHRoZSBlbmNyeXB0ZWQgYnl0ZSBzdHJlYW0uCisKKyAgQnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgYmVmb3JlIGNhbGxpbmcgdm9zX3JhbmRfZ2V0X2J5dGVzKCkuCisKKyAgQXR0ZW1wdGluZyB0byBpbml0aWFsaXplIGFuIGFscmVhZHkgaW5pdGlhbGl6ZWQgbG9jayByZXN1bHRzIGluCisgIGEgZmFpbHVyZS4KKworICBccGFyYW0gbG9jayAtIHBvaW50ZXIgdG8gdGhlIG9wYXF1ZSBsb2NrIG9iamVjdCB0byBpbml0aWFsaXplCisKKyAgXHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgLSBTdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIHJhbmRvbSBtZW1vcnkuCisKKyAgICAgICAgICBWT1NfU1RBVFVTX0VfRkFVTFQgIC0gcGJCdWYgaXMgYW4gaW52YWxpZCBwb2ludGVyLgorCisgICAgICAgICAgVk9TX1NUQVRVU19FX0ZBSUxVUkUgLSBkZWZhdWx0IHJldHVybiB2YWx1ZSBpZiBpdCBmYWlscyBkdWUgdG8KKyAgICAgICAgICB1bmtub3duIHJlYXNvbnMKKworICAgICAgICoqKlZPU19TVEFUVVNfRV9SRVNPVVJDRVMgLSBTeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkKKyAgICAgICAgICBhcmUgdW5hdmFpbGFibGUKKyAgXHNhCisKKyAgICAoICoqKiByZXR1cm4gdmFsdWUgbm90IGNvbnNpZGVyZWQgeWV0ICkKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitWT1NfU1RBVFVTIHZvc19kZWNyeXB0X0FFUyh2X1UzMl90IGNyeXB0SGFuZGxlLCAvKiBIYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcFRleHQsIC8qIHBvaW50ZXIgdG8gZGF0YSBzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcERlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcEtleSkgLyogcG9pbnRlciB0byBhdXRoZW50aWNhdGlvbiBrZXkgKi8KK3sKKy8vICAgIFZPU19TVEFUVVMgdVJlc3VsdCA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgIHN0cnVjdCBlY2JfYWVzX3Jlc3VsdCByZXN1bHQ7CisgICAgc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxOworICAgIHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtOworICAgIGludCByZXQgPSAwOworICAgIGNoYXIgaXZbSVZfU0laRV9BRVNfMTI4XTsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfaW47CisgICAgc3RydWN0IHNjYXR0ZXJsaXN0IHNnX291dDsKKworICAgIGluaXRfY29tcGxldGlvbigmcmVzdWx0LmNvbXBsZXRpb24pOworCisgICAgdGZtID0gIHdjbnNzX3dsYW5fY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIoICJjYmMoYWVzKSIsIDAsIDApOworICAgIGlmIChJU19FUlIodGZtKSkgeworICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9WT1NTLFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgImNyeXB0b19hbGxvY19hYmxrY2lwaGVyIGZhaWxlZCIpOworICAgICAgICByZXQgPSBQVFJfRVJSKHRmbSk7CisgICAgICAgIGdvdG8gZXJyX3RmbTsKKyAgICB9CisKKyAgICByZXEgPSBhYmxrY2lwaGVyX3JlcXVlc3RfYWxsb2ModGZtLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIXJlcSkgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVk9TUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVlc3QgZm9yIGNiYyhhZXMpIik7CisgICAgICAgIHJldCA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gZXJyX3JlcTsKKyAgICB9CisKKyAgICBhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKHJlcSwgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2JfYWVzX2NvbXBsZXRlLCAmcmVzdWx0KTsKKworCisgICAgY3J5cHRvX2FibGtjaXBoZXJfY2xlYXJfZmxhZ3ModGZtLCB+MCk7CisKKyAgICByZXQgPSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkodGZtLCBwS2V5LCBLRVlfU0laRV9BRVNfMTI4KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiY3J5cHRvX2NpcGhlcl9zZXRrZXkgZmFpbGVkIik7CisgICAgICAgIGdvdG8gZXJyX3NldGtleTsKKyAgICAgICB9CisKKyAgICBtZW1zZXQoaXYsIDAsIElWX1NJWkVfQUVTXzEyOCk7CisKKyAgICBzZ19pbml0X29uZSgmc2dfaW4sIHBUZXh0LCBBRVNfQkxPQ0tfU0laRSk7CisKKyAgICBzZ19pbml0X29uZSgmc2dfb3V0LCBwRGVjcnlwdGVkLCBBRVNfQkxPQ0tfU0laRSk7CisKKyAgICBhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgJnNnX2luLCAmc2dfb3V0LCBBRVNfQkxPQ0tfU0laRSwgaXYpOworCisgICAgY3J5cHRvX2FibGtjaXBoZXJfZGVjcnlwdChyZXEpOworCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZXJyX3NldGtleToKKyAgICB3Y25zc193bGFuX2FibGtjaXBoZXJfcmVxdWVzdF9mcmVlKHJlcSk7CitlcnJfcmVxOgorICAgIHdjbnNzX3dsYW5fY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcih0Zm0pOworZXJyX3RmbToKKyAgICAvL3JldHVybiByZXQ7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1ZPU1MsVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCIlcygpIGNhbGwgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgICAgIH0KKworICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9DT1JFL1dEQS9pbmMvbGVnYWN5L2hhbE1zZ0FwaS5oIGIvQ09SRS9XREEvaW5jL2xlZ2FjeS9oYWxNc2dBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVhZGYzCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREEvaW5jL2xlZ2FjeS9oYWxNc2dBcGkuaApAQCAtMCwwICsxLDEzMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogKi8KKyNpZm5kZWYgX0hBTE1TR0FQSV9IXworI2RlZmluZSBfSEFMTVNHQVBJX0hfCisKKyNpbmNsdWRlICJoYWxUeXBlcy5oIgorI2luY2x1ZGUgInNpckFwaS5oIgorI2luY2x1ZGUgInNpclBhcmFtcy5oIgorI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxQaHkuaCIKKyNpbmNsdWRlICJoYWxQaHlBcGkuaCIKKyNlbmRpZgorCisjZGVmaW5lIEhBTF9OVU1fQlNTSUQgMgorLyogb3Blck1vZGUgaW4gQUREIEJTUyBtZXNzYWdlICovCisjZGVmaW5lIEJTU19PUEVSQVRJT05BTF9NT0RFX0FQICAgICAwCisjZGVmaW5lIEJTU19PUEVSQVRJT05BTF9NT0RFX1NUQSAgICAxCisKKy8qIFNUQSBlbnRyeSB0eXBlIGluIGFkZCBzdGEgbWVzc2FnZSAqLworI2RlZmluZSBTVEFfRU5UUllfU0VMRiAgICAgICAgICAgICAgMAorI2RlZmluZSBTVEFfRU5UUllfT1RIRVIgICAgICAgICAgICAgMQorI2RlZmluZSBTVEFfRU5UUllfQlNTSUQgICAgICAgICAgICAgMgorI2RlZmluZSBTVEFfRU5UUllfQkNBU1QgICAgICAgICAgICAgMyAvL1NwZWNpYWwgc3RhdGlvbiBpZCBmb3IgdHJhbnNtaXR0aW5nIGJyb2FkY2FzdCBmcmFtZXMuCisjZGVmaW5lIFNUQV9FTlRSWV9QRUVSICAgICAgICAgICAgICBTVEFfRU5UUllfT1RIRVIKKworI2RlZmluZSBTVEFfRU5UUllfVFJBTlNNSVRURVIgICAgICAgU1RBX0VOVFJZX1NFTEYKKyNkZWZpbmUgU1RBX0VOVFJZX1JFQ0VJVkVSICAgICAgICAgIFNUQV9FTlRSWV9PVEhFUgorCisjZGVmaW5lIEhBTF9TVEFfSU5WQUxJRF9JRFggMHhGRgorI2RlZmluZSBIQUxfQlNTX0lOVkFMSURfSURYIDB4RkYKKworI2RlZmluZSBIQUxfQlNTUEVSU09OQV9JTlZBTElEX0lEWCAweEZGCisKKyNkZWZpbmUgV0xBTl9CU1NfUFJPVEVDVElPTl9PTiAgMQorI2RlZmluZSBXTEFOX0JTU19QUk9URUNUSU9OX09GRiAwCisKKy8qIFN0YXRpb24gaW5kZXggYWxsb2NhdGlvbiBhZnRlciBCcm9hZGNhc3Qgc3RhdGlvbiAqLworI2RlZmluZSBIQUxfTUFYX05VTV9CQ0FTVF9TVEFUSU9OUyAgICAgIDEKKyNkZWZpbmUgSEFMX01JTl9CQ0FTVF9TVEFfSU5ERVggICAgICgoSEFMX01BWF9OVU1fQkNBU1RfU1RBVElPTlM+MCk/MDpIQUxfU1RBX0lOVkFMSURfSURYKQorI2RlZmluZSBIQUxfTUFYX0JDQVNUX1NUQV9JTkRFWCAgICAgKChIQUxfTUFYX05VTV9CQ0FTVF9TVEFUSU9OUz4wKT8oSEFMX01BWF9OVU1fQkNBU1RfU1RBVElPTlMgLSAxKTpIQUxfU1RBX0lOVkFMSURfSURYKQorI2RlZmluZSBIQUxfTUlOX1NUQV9JTkRFWCAgICAgICAgICAgKChIQUxfTUFYX0JDQVNUX1NUQV9JTkRFWCE9SEFMX1NUQV9JTlZBTElEX0lEWCk/KEhBTF9NQVhfQkNBU1RfU1RBX0lOREVYKzEpOjApCisjZGVmaW5lIEhBTF9NQVhfU1RBX0lOREVYICAgICAgICAgICAoSEFMX05VTV9TVEEpCisKKy8qIENvbXBpbGF0aW9uIGZsYWdzIGZvciBlbmFibGluZyBkaXNhYmxpbmcgc2VsZlN0YSBhbmQgYmNhc3RTdGEgcGVyIEJTUyAqLworI2RlZmluZSBIQUxfU0VMRl9TVEFfUEVSX0JTUyAgICAgICAgMQorI2RlZmluZSBIQUxfQkNBU1RfU1RBX1BFUl9CU1MgICAgICAgMQorCisvL2ludmFsaWQgY2hhbm5lbCBpZC4KKyNkZWZpbmUgSEFMX0lOVkFMSURfQ0hBTk5FTF9JRCAwCisKKy8qIEJTUyBpbmRleCB1c2VkIHdoZW4gbm8gQlNTIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdGlvbi4gRm9yIGV4YW1wbGUsCisgKiBkcml2ZXIgY3JlYXRlcyBvbmx5IG9uZSBzZWxmIHN0YXRpb24gd2l0aG91dCB2YWxpZCBCU1Mgd2hpbGUgc2Nhbm5pbmcuCisgKiBUaGVuIHRoaXMgaW5kZXggaXMgdXNlZCB0byB0ZWxsIHNvZnRtYWMgdGhhdCBCU1MgaXMgbm90IHZhbGlkLgorICovCisjZGVmaW5lIEJTU0lEWF9JTlZBTElEICAgICAgICAgICAgIDI1NAorCisjZGVmaW5lIEhBTF9JU19WQUxJRF9CU1NfSU5ERVgocE1hYywgYnNzSWR4KSAgKChCU1NJRFhfSU5WQUxJRCAhPSAoYnNzSWR4KSkgJiYgKChic3NJZHgpIDwgKHBNYWMpLT5oYWwubWVtTWFwLm1heEJzc2lkcykpCisKKy8vIEJlYWNvbiBzdHJ1Y3R1cmUKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzQW5pQmVhY29uU3RydWN0Cit7CisgICAgdEFOSV9VMzIgICAgICAgIGJlYWNvbkxlbmd0aDsgICAvLyBJbmRpY2F0ZXMgdGhlIGJlYWNvbiBsZW5ndGgKKyAgICB0U2lyTWFjTWdtdEhkciAgbWFjSGRyOyAgICAgICAgIC8vIE1BQyBIZWFkZXIgZm9yIGJlYWNvbgorICAgIC8vIEJlYWNvbiBib2R5IGZvbGxvd3MgaGVyZQorfSBfX2FuaV9hdHRyX3BhY2tlZCB0QW5pQmVhY29uU3RydWN0LCAqdHBBbmlCZWFjb25TdHJ1Y3Q7CisKKy8vIHByb2JlUnNwIHRlbXBsYXRlIHN0cnVjdHVyZQordHlwZWRlZiBfX2FuaV9hdHRyX3ByZV9wYWNrZWQgc3RydWN0IHNBbmlQcm9iZVJzcFN0cnVjdAoreworICAgIHRTaXJNYWNNZ210SGRyICBtYWNIZHI7ICAgICAgICAgLy8gTUFDIEhlYWRlciBmb3IgcHJvYmVSc3AKKyAgICAvLyBwcm9iZVJzcCBib2R5IGZvbGxvd3MgaGVyZQorfSBfX2FuaV9hdHRyX3BhY2tlZCB0QW5pUHJvYmVSc3BTdHJ1Y3QsICp0cEFuaVByb2JlUnNwU3RydWN0OworCisKKy8vIFBlciBUQyBwYXJhbWV0ZXJzCit0eXBlZGVmIHN0cnVjdAoreworICAgIHRBTklfVTggZGlzYWJsZVR4OworICAgIHRBTklfVTggZGlzYWJsZVJ4OworICAgIHRBTklfVTggcnhDb21wQkE7ICAgICAgICAgICAgICAvLyAxOiBleHBlY3QgdG8gc2VlIGZyYW1lcyB3aXRoIGNvbXByZXNzZWQgQkEgY29taW5nIGZyb20gdGhpcyBwZWVyIE1BQworICAgIHRBTklfVTggcnhCQXBvbGljeTsgICAgICAgICAgICAvLyBpbW1lZGlhdGUgQUNLIG9yIGRlbGF5ZWQgQUNLIGZvciBmcmFtZXMgZnJvbSB0aGlzIHBlZXIgTUFDCisgICAgdEFOSV9VOCB0eENvbXBCQTsgICAgICAgICAgICAgIC8vIDE6IHVzaW5nIGNvbXByZXNzZWQgQkEgdG8gc2VuZCB0byB0aGlzIHBlZXIgTUFDCisgICAgdEFOSV9VOCB0eEJBcG9saWN5OyAgICAgICAgICAgIC8vIGltbWVkaWF0ZSBBQ0sgb3IgZGVsYXllZCBBQ0sgZm9yIGZyYW1lcyB0byB0aGlzIHBlZXIgTUFDCisgICAgdEFOSV9VOCByeFVzZUJBOworICAgIHRBTklfVTggdHhVc2VCQTsKKyAgICB0QU5JX1U4IHJ4QnVmZmVyU2l6ZTsKKyAgICB0QU5JX1U4IHR4QnVmZmVyU2l6ZTsKKyAgICB0QU5JX1UxNiB0eEJBV2FpdFRpbWVvdXQ7CisgICAgdEFOSV9VMTYgcnhCQVdhaXRUaW1lb3V0OworfSB0VENQYXJhbXM7CisKKwordHlwZWRlZiBlbnVtIGVSeHBNb2RlIHsKKyAgICBlUlhQX0lETEVfTU9ERSAgICAgICAgPSAweDAsCisgICAgZVJYUF9TQ0FOX01PREUgICAgICAgID0gMHgxLAorICAgIGVSWFBfUFJFX0FTU09DX01PREUgICA9IDB4MiwKKyAgICBlUlhQX1BPU1RfQVNTT0NfTU9ERSAgPSAweDQsCisgICAgZVJYUF9BUF9NT0RFICAgICAgICAgID0gMHg4LAorICAgIGVSWFBfUFJPTUlTQ1VPVVNfTU9ERSA9IDB4MTAsCisgICAgZVJYUF9MRUFSTl9NT0RFICAgICAgID0gMHgyMCwKKyAgICBlUlhQX1BPV0VSX1NBVkVfTU9ERSAgPSAweDQwLAorICAgIGVSWFBfSUJTU19NT0RFICAgICAgICA9IDB4ODAsCisgICAgZVJYUF9CVEFNUF9QUkVBU1NPQ19NT0RFICAgID0gMHgxMDAsCisgICAgZVJYUF9CVEFNUF9QT1NUQVNTT0NfTU9ERSAgID0gMHgyMDAsCisgICAgZVJYUF9CVEFNUF9BUF9NT0RFICAgICAgICAgID0gMHg0MDAsCisgICAgZVJYUF9CVEFNUF9TVEFfTU9ERSAgICAgICAgID0gMHg4MDAsCisgICAgZVJYUF9NVUxUSV9CU1NfTU9ERSAgICAgICAgID0gMHgxMDAwCisjaWZuZGVmIFdMQU5fRlRNX1NUVUIKKyAgICAsZVJYUF9GVE1fTU9ERSAgICAgICAgID0gMHg0MDAwCisjZW5kaWYKKyAgICxlUlhQX0xJU1RFTl9NT0RFICAgICAgPSAweDgwMDAKK30gdFJ4cE1vZGU7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvLyBGaXJzdCB0d28gZmllbGRzIGJzc2lkIGFuZCBhc3NvY0lkIGFyZSB1c2VkIHRvIGZpbmQgc3RhaWQgZm9yIHN0YS4KKyAgICAvLyBCU1NJRCBvZiBTVEEKKyAgICB0U2lyTWFjQWRkciBic3NJZDsKKworICAgIC8vIEFTU09DIElELCBhcyBhc3NpZ25lZCBieSBQRS9MSU0uIFRoaXMgbmVlZHMgdG8gYmUgYXNzaWduZWQKKyAgICAvLyBvbiBhIHBlciBCU1MgYmFzaXMKKyAgICB0QU5JX1UxNiBhc3NvY0lkOworCisgICAgLy8gRmllbGQgdG8gaW5kaWNhdGUgaWYgdGhpcyBpcyBzdGEgZW50cnkgZm9yIGl0c2VsZiBTVEEgYWRkaW5nIGVudHJ5IGZvciBpdHNlbGYKKyAgICAvLyBvciByZW1vdGUgKEFQIGFkZGluZyBTVEEgYWZ0ZXIgc3VjY2Vzc2Z1bCBhc3NvY2lhdGlvbi4KKyAgICAvLyBUaGlzIG1heSBvciBtYXkgbm90IGJlIHJlcXVpcmVkIGluIHByb2R1Y3Rpb24gZHJpdmVyLgorICAgIHRBTklfVTggc3RhVHlwZTsgICAgICAgLy8gMCAtIFNlbGYsIDEgb3RoZXIvcmVtb3RlLCAyIC0gYnNzaWQKKworICAgIHRBTklfVTggc2hvcnRQcmVhbWJsZVN1cHBvcnRlZDsKKworICAgIC8vIE1BQyBBZGRyZXNzIG9mIFNUQQorICAgIHRTaXJNYWNBZGRyIHN0YU1hYzsKKworICAgIC8vIExpc3RlbiBpbnRlcnZhbC4KKyAgICB0QU5JX1UxNiBsaXN0ZW5JbnRlcnZhbDsKKworICAgIC8vIFN1cHBvcnQgZm9yIDExZS9XTU0KKyAgICB0QU5JX1U4IHdtbUVuYWJsZWQ7CisKKyAgICAvLworICAgIC8vIFUtQVBTRCBGbGFnczogMWIgcGVyIEFDCisgICAgLy8gRW5jb2RlZCBhcyBmb2xsb3dzOgorICAgIC8vIGI3IGI2IGI1IGI0IGIzIGIyIGIxIGIwCisgICAgLy8gWCAgWCAgWCAgWCAgQkUgQksgVkkgVk8KKyAgICAvLworICAgIHRBTklfVTggdUFQU0Q7CisKKyAgICAvLyBNYXggU1AgTGVuZ3RoCisgICAgdEFOSV9VOCBtYXhTUExlbjsKKworICAgIC8vIDExbiBIVCBjYXBhYmxlIFNUQQorICAgIHRBTklfVTggaHRDYXBhYmxlOworCisgICAgLy8gMTFuIEdyZWVuIEZpZWxkIHByZWFtYmxlIHN1cHBvcnQKKyAgICAvLyAwIC0gTm90IHN1cHBvcnRlZCwgMSAtIFN1cHBvcnRlZAorICAgIC8vIEFkZCBpdCB0byBSQSByZWxhdGVkIGZpZWxkcyBvZiBzdGEgZW50cnkgaW4gSEFMCisgICAgdEFOSV9VOCBncmVlbkZpZWxkQ2FwYWJsZTsKKworICAgIC8vIFRYIFdpZHRoIFNldDogMCAtIDIwIE1IeiBvbmx5LCAxIC0gMjAvNDAgTUh6CisgICAgdEFOSV9VOCB0eENoYW5uZWxXaWR0aFNldDsKKworICAgIC8vIE1JTU8gUG93ZXIgU2F2ZQorICAgIHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZSBtaW1vUFM7CisKKyAgICAvLyBSSUZTIG1vZGU6IDAgLSBOQSwgMSAtIEFsbG93ZWQKKyAgICB0QU5JX1U4IHJpZnNNb2RlOworCisgICAgLy8gTC1TSUcgVFhPUCBQcm90ZWN0aW9uIG1lY2hhbmlzbQorICAgIC8vIDAgLSBObyBTdXBwb3J0LCAxIC0gU3VwcG9ydGVkCisgICAgLy8gU0cgLSB0aGVyZSBpcyBnbG9iYWwgZmllbGQuCisgICAgdEFOSV9VOCBsc2lnVHhvcFByb3RlY3Rpb247CisKKyAgICAvLyBkZWxheWVkIGJhIHN1cHBvcnQKKyAgICB0QU5JX1U4IGRlbEJBU3VwcG9ydDsKKyAgICAvLyBkZWxheWVkIGJhIHN1cHBvcnQuLi4gVEJECisKKyNpZmRlZiBBTklfRFZUX0RFQlVHCisgICAgLy9UaGVzZSA2IGZpZWxkcyBhcmUgdXNlZCBvbmx5IGJ5IERWVCBkcml2ZXIgdG8gcGFzcyBzZWxlY3RlZAorICAgIC8vcmF0ZXMgdG8gU29mdG1hYyB0aHJvdWdoIEhBTC4KKyAgICB0QU5JX1U4IHByaW1hcnlSYXRlSW5kZXgsIHNlY29uZGFyeVJhdGVJbmRleCwgdGVydGlhcnlSYXRlSW5kZXg7CisgICAgdEFOSV9VOCBwcmltYXJ5UmF0ZUluZGV4NDAsIHNlY29uZGFyeVJhdGVJbmRleDQwLCB0ZXJ0aWFyeVJhdGVJbmRleDQwOworI2VuZGlmCisKKyAgICAvLyBGSVhNRQorICAgIC8vQWRkIHRoZXNlIGZpZWxkcyB0byBtZXNzYWdlCisgICAgdEFOSV9VOCB1czMyTWF4QW1wZHVEdXJhdGlvbjsgICAgICAgICAgICAgICAgLy9pbiB1bml0cyBvZiAzMiB1cy4KKyAgICB0QU5JX1U4IG1heEFtcGR1U2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIDogOGsgLCAxIDogMTZrLCAyIDogMzJrLCAzIDogNjRrCisgICAgdEFOSV9VOCBtYXhBbXBkdURlbnNpdHk7ICAgICAgICAgICAgICAgICAgICAgLy8gMyA6IDB+NyA6IDJeKDExbkFNUERVZGVuc2l0eSAtNCkKKyAgICB0QU5JX1U4IG1heEFtc2R1U2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIDogMzgzOSBieXRlcywgMCA6IDc5MzUgYnl0ZXMKKworICAgIC8vIFRDIHBhcmFtZXRlcnMKKyAgICB0VENQYXJhbXMgc3RhVENQYXJhbXNbU1RBQ0ZHX01BWF9UQ107CisKKyAgICAvLyBDb21wcmVzc2lvbiBhbmQgQ29uY2F0IHBhcmFtZXRlcnMgZm9yIERQVQorICAgIHRBTklfVTE2IGRlQ29tcEVuYWJsZTsKKyAgICB0QU5JX1UxNiBjb21wRW5hYmxlOworICAgIHRBTklfVTE2IGNvbmNhdFNlcVJtdjsKKyAgICB0QU5JX1UxNiBjb25jYXRTZXFJbnM7CisKKworICAgIC8vMTFuIFBhcmFtZXRlcnMKKworICAgIC8qKgorICAgICAgSFQgU1RBIHNob3VsZCBzZXQgaXQgdG8gMSBpZiBpdCBpcyBlbmFibGVkIGluIEJTUworICAgICAgSFQgU1RBIHNob3VsZCBzZXQgaXQgdG8gMCBpZiBBUCBkb2VzIG5vdCBzdXBwb3J0IGl0LgorICAgICAgVGhpcyBpbmRpY2F0aW9uIGlzIHNlbnQgdG8gSEFMIGFuZCBIQUwgdXNlcyB0aGlzIGZsYWcKKyAgICAgIHRvIHBpY2t1cCB1cCBhcHByb3ByaWF0ZSA0ME1oeiByYXRlcy4KKyAgICAgICovCisgICAgdEFOSV9VOCBmRHNzc0Nja01vZGU0ME1oejsKKworCisgICAgLy9zaG9ydCBHSSBzdXBwb3J0IGZvciA0ME1oeiBwYWNrZXRzCisgICAgdEFOSV9VOCBmU2hvcnRHSTQwTWh6OworCisgICAgLy9zaG9ydCBHSSBzdXBwb3J0IGZvciAyME1oeiBwYWNrZXRzCisgICAgdEFOSV9VOCBmU2hvcnRHSTIwTWh6OworCisKKworICAgIC8qCisgICAgICogQWxsIHRoZSBsZWdhY3kgYW5kIGFpcmdvIHN1cHBvcnRlZCByYXRlcy4KKyAgICAgKiBUaGVzZSByYXRlcyBhcmUgdGhlIGludGVyc2VjdGlvbiBvZiBwZWVyIGFuZCBzZWxmIGNhcGFiaWxpdGllcy4KKyAgICAgKi8KKyAgICB0U2lyU3VwcG9ydGVkUmF0ZXMgc3VwcG9ydGVkUmF0ZXM7CisKKworCisKKworICAgIC8qCisgICAgICogRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIGZvciByZXR1cm5pbmcgc3RhdHVzIGFuZCBzdGF0aW9uIGluZGV4IGZyb20gSEFMIHRvIFBFCisgICAgICogdmlhIHJlc3BvbnNlIG1lc3NhZ2UuIEhBTCBkb2VzIG5vdCByZWFkIHRoZW0uCisgICAgICovCisgICAgLy8gVGhlIHJldHVybiBzdGF0dXMgb2YgU0lSX0hBTF9BRERfU1RBX1JFUSBpcyByZXBvcnRlZCBoZXJlCisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgLy8gU3RhdGlvbiBpbmRleDsgdmFsaWQgb25seSB3aGVuICdzdGF0dXMnIGZpZWxkIHZhbHVlIGlzIGVIQUxfU1RBVFVTX1NVQ0NFU1MKKyAgICB0QU5JX1U4IHN0YUlkeDsKKworICAgIC8vQlNTSUQgb2YgQlNTIHRvIHdoaWNoIHRoZSBzdGF0aW9uIGlzIGFzc29jaWF0ZWQuCisgICAgLy9UaGlzIHNob3VsZCBiZSBmaWxsZWQgYmFjayBpbiBieSBIQUwsIGFuZCBzZW50IGJhY2sgdG8gTElNIGFzIHBhcnQgb2YKKyAgICAvL3RoZSByZXNwb25zZSBtZXNzYWdlLCBzbyBMSU0gY2FuIGNhY2hlIGl0IGluIHRoZSBzdGF0aW9uIGVudHJ5IG9mIGhhc2ggdGFibGUuCisgICAgLy9XaGVuIHN0YXRpb24gaXMgZGVsZXRlZCwgTElNIHdpbGwgbWFrZSB1c2Ugb2YgdGhpcyBic3NJZHggdG8gZGVsZXRlCisgICAgLy9CU1MgZnJvbSBoYWwgdGFibGVzIGFuZCBmcm9tIHNvZnRtYWMuCisgICAgdEFOSV9VOCBic3NJZHg7CisKKyAgICAvKiB0aGlzIHJlcXVpcmVzIGNoYW5nZSBpbiB0ZXN0RGJnLiBJIHdpbGwgY2hhbmdlIGl0IGxhdGVyIGFmdGVyIGNvb3JkaW5hdGluZyB3aXRoIERpYWcgdGVhbS4KKyAgICAgICB0QU5JX1U4IGZGd2RUcmlnZXJTT1NQdG9Ib3N0OyAvL3RyaWdnZXIgdG8gc3RhcnQgc2VydmljZSBwZXJpb2QKKyAgICAgICB0QU5JX1U4IGZGd2RUcmlnZXJFT1NQdG9Ib3N0OyAvL3RyaWdnZXIgdG8gZW5kIHNlcnZpY2UgcGVyaW9kCisgICAgICAgKi8KKworICAgLy9IQUwgc2hvdWxkIHVwZGF0ZSB0aGUgZXhpc3RpbmcgU1RBIGVudHJ5LCBpZiB0aGlzIGZsYWcgaXMgc2V0LgorICAgLy9QRSB3aWxsIHNldCB0aGlzIGZsYWcgaW4gY2FzZSBvZiByZWFzc29jLCB3aGVyZSB3ZSB3YW50IHRvIHJlc3VlIHRoZQorICAgLy90aGUgb2xkIHN0YUlEIGFuZCBzdGlsbCByZXR1cm4gc3VjY2Vzcy4KKyAgICB0QU5JX1U4IHVwZGF0ZVN0YTsKKyAgICAvL0EgZmxhZyB0byBpbmRpY2F0ZSB0byBIQUwgaWYgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgaXMgcmVxdWlyZWQuCisgICAgdEFOSV9VOCByZXNwUmVxZDsKKworICAgIC8qIFJvYnVzdCBNYW5hZ2VtZW50IEZyYW1lIChSTUYpIGVuYWJsZWQvZGlzYWJsZWQgKi8KKyAgICB0QU5JX1U4IHJtZkVuYWJsZWQ7CisKKyAgICAvKiBUaGUgdW5pY2FzdCBlbmNyeXB0aW9uIHR5cGUgaW4gdGhlIGFzc29jaWF0aW9uICovCisgICAgdEFOSV9VMzIgZW5jcnlwdFR5cGU7CisgICAgCisgICAgLypUaGUgRFBVIHNpZ25hdHVyZXMgd2lsbCBiZSBzZW50IGV2ZW50dWFsbHkgdG8gVEwgdG8gaGVscCBpdCBkZXRlcm1pbmUgdGhlIAorICAgICAgYXNzb2NpYXRpb24gdG8gd2hpY2ggYSBwYWNrZXQgYmVsb25ncyB0byovCisgICAgLypVbmljYXN0IERQVSBpbmRleCovCisgICAgdEFOSV9VOCAgICAgdWNVY2FzdFNpZzsKKworICAgIC8qQnJvYWRjYXN0IERQVSBpbmRleCovCisgICAgdEFOSV9VOCAgICAgdWNCY2FzdFNpZzsKKworICAgIHRBTklfVTggICAgIHNlc3Npb25JZDsgLy9QRSBzZXNzaW9uIGlkIGZvciBQRTwtPkhBTCBpbnRlcmZhY2UgCisgICAgLy8gSEFMIGp1c3Qgc2VuZHMgYmFjayB3aGF0IGl0IHJlY2VpdmVzLgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIC8qaWYgdGhpcyBpcyBhIFAyUCBDYXBhYmxlIFN0YSovCisgICAgdEFOSV9VOCAgICAgcDJwQ2FwYWJsZVN0YTsKKyNlbmRpZgorCit9IHRBZGRTdGFQYXJhbXMsICp0cEFkZFN0YVBhcmFtczsKKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8vIFN0YXRpb24gaW5kZXgKKyAgICB0QU5JX1UxNiBzdGFJZHg7CisgICAgdEFOSV9VMTYgdGVtcGxJZHg7CisgICAgdEFOSV9VOCAgIHJhdGVJZHg7CisKKyAgICAvLyBUaGUgcmV0dXJuIHN0YXR1cyBvZiBTSVJfSEFMX1VQREFURV9TVEFSQVRFSU5GT19SRVEgaXMgcmVwb3J0ZWQgaGVyZQorICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCisgICAgLy9BIGZsYWcgdG8gaW5kaWNhdGUgdG8gSEFMIGlmIHRoZSByZXNwb25zZSBtZXNzYWdlIGlzIHJlcXVpcmVkLgorICAgIHRBTklfVTggcmVzcFJlcWQ7CisKK30gdFVwZGF0ZVR4Q21kVGVtcGxQYXJhbXMsICp0cFVwZGF0ZVR4Q21kVGVtcGxQYXJhbXM7CisvL0ZJWE1FOiBjaGFuZ2UgdGhlIHN0cnVjdHVyZSBuYW1lCisKKworCisKKworCisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvLyBpbmRleCBvZiBTVEEgdG8gZGVsZXRlIC0gdGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGluZGV4IHJldHVybmVkCisgICAgLy8gYXMgcGFydCBvZiB0aGUgQWRkU3RhCisgICAgdEFOSV9VMTYgc3RhSWR4OworICAgIHRBTklfVTE2IGFzc29jSWQ7CisgICAgZUhhbFN0YXR1cyAgc3RhdHVzOyAgICAvLyBTdGF0dXMgb2YgU0lSX0hBTF9ERUxFVEVfU1RBX1JFUSBpcyByZXBvcnRlZCBoZXJlCisgICAgdEFOSV9VOCByZXNwUmVxZDsKKyAgICB0QU5JX1U4ICAgICBzZXNzaW9uSWQ7IC8vIFBFIHNlc3Npb24gaWQgZm9yIFBFPC0+SEFMIGludGVyZmFjZSAKKyAgICAvLyBQRSBzZXNzaW9uIGlkIG5vdyBhZGRlZCB0byBhbGwgSEFMPC0+UEUgdHJhbnNhY2F0aW9ucworICAgIC8vIEhBTCBzZW5kcyBpdCBiYWNrIHVubW9kaWZpZWQuCit9IHREZWxldGVTdGFQYXJhbXMsICogdHBEZWxldGVTdGFQYXJhbXM7CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgYnkgUEUgdG8gY29uZmlndXJlIHRoZSBrZXkgaW5mb3JtYXRpb24gb24gYSBnaXZlbiBzdGF0aW9uLgorICogV2hlbiB0aGUgc2VjVHlwZSBpcyBXRVA0MCBvciBXRVAxMDQsIHRoZSBkZWZXRVBJZHggaXMgdXNlZCB0byBsb2NhdGUKKyAqIGEgcHJlY29uZmlndXJlZCBrZXkgZnJvbSBhIEJTUyB0aGUgc3RhdGlvbiBhc3NvaWNhdGVkIHdpdGg7IG90aGVyd2lzZQorICogYSBuZXcga2V5IGRlc2NyaXB0b3IgaXMgY3JlYXRlZCBiYXNlZCBvbiB0aGUga2V5IGZpZWxkLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHRBTklfVTE2ICAgICAgICBzdGFJZHg7CisgICAgdEFuaUVkVHlwZSAgICAgIGVuY1R5cGU7ICAgICAgICAvLyBFbmNyeXB0aW9uL0RlY3J5cHRpb24gdHlwZQorICAgIHRBbmlXZXBUeXBlICAgICB3ZXBUeXBlOyAgICAgICAgLy8gdmFsaWQgb25seSBmb3IgV0VQCisgICAgdEFOSV9VOCAgICAgICAgIGRlZldFUElkeDsgICAgICAvLyBEZWZhdWx0IFdFUCBrZXksIHZhbGlkIG9ubHkgZm9yIHN0YXRpYyBXRVAsIG11c3QgYmV0d2VlbiAwIGFuZCAzCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIHRTaXJLZXlzICAgICAgICBrZXlbU0lSX01BQ19NQVhfTlVNX09GX0RFRkFVTFRfS0VZU107ICAgICAgICAgICAgLy8gdmFsaWQgb25seSBmb3Igbm9uLXN0YXRpYyBXRVAgZW5jeXJwdGlvbnMKKyNlbHNlCisgICAgdFNpcktleXMgICAgICAgIGtleTsKKyNlbmRpZgorICAgIHRBTklfVTggICAgICAgICBzaW5nbGVUaWRSYzsgICAgLy8gMT1TaW5nbGUgVElEIGJhc2VkIFJlcGxheSBDb3VudCwgMD1QZXIgVElEIGJhc2VkIFJDCisgICAgLyoKKyAgICAgKiBGb2xsb3dpbmcgcGFyYW1ldGVyIGlzIGZvciByZXR1cm5pbmcgc3RhdHVzCisgICAgICogdmlhIHJlc3BvbnNlIG1lc3NhZ2UuIEhBTCBkb2VzIG5vdCByZWFkIHRoZW0uCisgICAgICovCisgICAgZUhhbFN0YXR1cyAgc3RhdHVzOyAgICAvLyBzdGF0dXMgb2YgU0lSX0hBTF9TRVRfU1RBS0VZX1JFUSBpcyByZXBvcnRlZCBoZXJlCisgICAgdEFOSV9VOCAgICAgc2Vzc2lvbklkOyAvLyBQRSBzZXNzaW9uIGlkIGZvciBQRTwtPkhBTCBpbnRlcmZhY2UgCisKKyAgICAvLyBQRSBzZXNzaW9uIGlkIG5vdyBhZGRlZCB0byBhbGwgSEFMPC0+UEUgdHJhbnNhY2F0aW9ucworICAgIC8vIEhBTCBzZW5kcyBiYWNrIHJlc3BvbnNlIHdpdGggbm8gbW9kaWZpY2F0aW9uCit9IHRTZXRTdGFLZXlQYXJhbXMsICp0cFNldFN0YUtleVBhcmFtczsKKworLy8KKy8vIE1lc2cgaGVhZGVyIGlzIHVzZWQgZnJvbSB0U2lyTXNnUQorLy8gTWVzZyBUeXBlID0gU0lSX0hBTF9BRERfQlNTX1JFUQorLy8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLy8gTUFDIEFkZHJlc3MvQlNTSUQKKyAgICB0U2lyTWFjQWRkciBic3NJZDsKKyNpZmRlZiBIQUxfU0VMRl9TVEFfUEVSX0JTUworICAgIC8vIFNlbGYgTWFjIEFkZHJlc3MKKyAgICB0U2lyTWFjQWRkciAgc2VsZk1hY0FkZHI7CisjZW5kaWYKKyAgICAvLyBCU1MgdHlwZQorICAgIC8vIEZJWE1FIC0gSXMgdGhpcyByZXFkPyBEbyB3ZSB3YW50IHRvIGlzb2xhdGUgQlNTL0lCU1MgcGFyYW1ldGVycz8KKyAgICB0U2lyQnNzVHlwZSBic3NUeXBlOworCisgICAgLy8gQVAgLSAwOyBTVEEgLSAxIDsKKyAgICB0QU5JX1U4IG9wZXJNb2RlOworCisgICAgLy8gTmV0d29yayB0eXBlIC0gYi9nL2EvTWl4ZWRNb2RlL0dyZWVuRmllbGQvTGVnYWN5CisgICAgLy8gVE9ETyAtIFRoaXMgZW51bSB0byBiZSB1cGRhdGVkIGZvciBIVCBzdXBwb3J0CisgICAgLy8gUmV2aWV3IEZJWE1FIC0gV2h5IGlzIHRoaXMgbmVlZGVkPworICAgIHRTaXJOd1R5cGUgbndUeXBlOworCisgICAgdEFOSV9VOCBzaG9ydFNsb3RUaW1lU3VwcG9ydGVkOworICAgIHRBTklfVTggbGxhQ29leGlzdDsKKyAgICB0QU5JX1U4IGxsYkNvZXhpc3Q7CisgICAgdEFOSV9VOCBsbGdDb2V4aXN0OworICAgIHRBTklfVTggaHQyMENvZXhpc3Q7CisgICAgdEFOSV9VOCBsbG5Ob25HRkNvZXhpc3Q7CisgICAgdEFOSV9VOCBmTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisgICAgdEFOSV9VOCBmUklGU01vZGU7CisKKyAgICAvLyBCZWFjb24gSW50ZXJ2YWwKKyAgICB0U2lyTWFjQmVhY29uSW50ZXJ2YWwgYmVhY29uSW50ZXJ2YWw7CisKKyAgICAvLyBEVElNIHBlcmlvZAorICAgIHRBTklfVTggZHRpbVBlcmlvZDsKKworICAgIC8vIENGIFBhcmFtIFNldAorICAgIC8vIFJldmlldyBGSVhNRSAtIERvZXMgSEFMIG5lZWQgdGhpcz8KKyAgICB0U2lyTWFjQ2ZQYXJhbVNldCBjZlBhcmFtU2V0OworCisgICAgLy8gTUFDIFJhdGUgU2V0CisgICAgLy8gUmV2aWV3IEZJWE1FIC0gRG9lcyBIQUwgbmVlZCB0aGlzPworICAgIHRTaXJNYWNSYXRlU2V0IHJhdGVTZXQ7CisKKyAgICAvLyA4MDIuMTFuIHJlbGF0ZWQgSFQgcGFyYW1ldGVycyB0aGF0IGFyZSBkeW5hbWljCisKKyAgICAvLyBFbmFibGUvRGlzYWJsZSBIVCBjYXBhYmlsaXRpZXMKKyAgICB0QU5JX1U4IGh0Q2FwYWJsZTsKKworICAgIC8vIEVuYWJsZS9EaXNhYmxlIE9CU1MgcHJvdGVjdGlvbgorICAgIHRBTklfVTggb2Jzc1Byb3RFbmFibGVkOworCisgICAgLy8gUk1GIGVuYWJsZWQvZGlzYWJsZWQKKyAgICB0QU5JX1U4IHJtZkVuYWJsZWQ7CisKKyAgICAvLyBIVCBPcGVyYXRpbmcgTW9kZQorICAgIC8vIFJldmlldyBGSVhNRSAtIERvZXMgSEFMIG5lZWQgdGhpcz8KKyAgICB0U2lyTWFjSFRPcGVyYXRpbmdNb2RlIGh0T3Blck1vZGU7CisKKyAgICAvLyBEdWFsIENUUyBQcm90ZWN0aW9uOiAwIC0gVW51c2VkLCAxIC0gVXNlZAorICAgIHRBTklfVTggZHVhbENUU1Byb3RlY3Rpb247CisKKyAgICAvLyBUWCBXaWR0aCBTZXQ6IDAgLSAyMCBNSHogb25seSwgMSAtIDIwLzQwIE1IegorICAgIHRBTklfVTggdHhDaGFubmVsV2lkdGhTZXQ7CisKKyAgICAvLyBDdXJyZW50IE9wZXJhdGluZyBDaGFubmVsCisgICAgdEFOSV9VOCBjdXJyZW50T3BlckNoYW5uZWw7CisKKyAgICAvLyBDdXJyZW50IEV4dGVuc2lvbiBDaGFubmVsLCBpZiBhcHBsaWNhYmxlCisgICAgdEFOSV9VOCBjdXJyZW50RXh0Q2hhbm5lbDsKKworICAgIC8vIEFkZCBhIFNUQSBlbnRyeSBmb3IgIml0c2VsZiIgLQorICAgIC8vIE9uIEFQICAtIEFkZCB0aGUgQVAgaXRzZWxmIGluIGFuICJTVEEgY29udGV4dCIKKyAgICAvLyBPbiBTVEEgLSBBZGQgdGhlIEFQIHRvIHdoaWNoIHRoaXMgU1RBIGlzIGpvaW5pbmcgaW4gYW4gIlNUQSBjb250ZXh0IgorICAgIHRBZGRTdGFQYXJhbXMgc3RhQ29udGV4dDsKKworICAgIC8qCisgICAgKiBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZm9yIHJldHVybmluZyBzdGF0dXMgYW5kIHN0YXRpb24gaW5kZXggZnJvbSBIQUwgdG8gUEUKKyAgICAqIHZpYSByZXNwb25zZSBtZXNzYWdlLiBIQUwgZG9lcyBub3QgcmVhZCB0aGVtLgorICAgICovCisgICAgLy8gVGhlIHJldHVybiBzdGF0dXMgb2YgU0lSX0hBTF9BRERfQlNTX1JFUSBpcyByZXBvcnRlZCBoZXJlCisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgLy8gQlNTIGluZGV4IGFsbG9jYXRlZCBieSBIQUwuCisgICAgLy8gdmFsaWQgb25seSB3aGVuICdzdGF0dXMnIGZpZWxkIGlzIGVIQUxfU1RBVFVTX1NVQ0NFU1MKKyAgICB0QU5JX1UxNiBic3NJZHg7CisKKyAgICAvLyBCcm9hZGNhc3QgRFBVIGRlc2NyaXB0b3IgaW5kZXggYWxsb2NhdGVkIGJ5IEhBTCBhbmQgdXNlZCBmb3IgYnJvYWRjYXN0L211bHRpY2FzdCBwYWNrZXRzLgorICAgIC8vIHZhbGlkIG9ubHkgd2hlbiAnc3RhdHVzJyBmaWVsZCBpcyBlSEFMX1NUQVRVU19TVUNDRVNTCisgICAgdEFOSV9VOCAgICBiY2FzdERwdURlc2NJbmR4OworCisgICAgLy8gRFBVIHNpZ25hdHVyZSB0byBiZSB1c2VkIGZvciBicm9hZGNhc3QvbXVsdGljYXN0IHBhY2tldHMKKyAgICAvLyB2YWxpZCBvbmx5IHdoZW4gJ3N0YXR1cycgZmllbGQgaXMgZUhBTF9TVEFUVVNfU1VDQ0VTUworICAgIHRBTklfVTggICAgYmNhc3REcHVTaWduYXR1cmU7CisKKyAgICAvLyBEUFUgZGVzY3JpcHRvciBpbmRleCBhbGxvY2F0ZWQgYnkgSEFMLCB1c2VkIGZvciBiY2FzdC9tY2FzdCBtYW5hZ2VtZW50IHBhY2tldHMKKyAgICB0QU5JX1U4ICAgIG1nbXREcHVEZXNjSW5keDsKKworICAgIC8vIERQVSBzaWduYXR1cmUgdG8gYmUgdXNlZCBmb3IgYmNhc3QvbWNhc3QgbWFuYWdlbWVudCBwYWNrZXRzCisgICAgdEFOSV9VOCAgICBtZ210RHB1U2lnbmF0dXJlOworCisgICAvL0hBTCBzaG91bGQgdXBkYXRlIHRoZSBleGlzdGluZyBCU1MgZW50cnksIGlmIHRoaXMgZmxhZyBpcyBzZXQuCisgICAvL1BFIHdpbGwgc2V0IHRoaXMgZmxhZyBpbiBjYXNlIG9mIHJlYXNzb2MsIHdoZXJlIHdlIHdhbnQgdG8gcmVzdWUgdGhlCisgICAvL3RoZSBvbGQgYnNzSUQgYW5kIHN0aWxsIHJldHVybiBzdWNjZXNzLgorICAgIHRBTklfVTggdXBkYXRlQnNzOworCisgICAgLy8gQWRkIEJTU0lEIGluZm8gZm9yIHJ4cCBmaWx0ZXIgaW4gSUJTUyBtb2RlCisgICAgdFNpck1hY1NTaWQgc3NJZDsKKworICAgIC8vSEFMIHdpbGwgc2VuZCB0aGUgcmVzcG9uc2UgbWVzc2FnZSB0byBMSU0gb25seSB3aGVuIHRoaXMgZmxhZyBpcyBzZXQuCisgICAgLy9MSU0gd2lsbCBzZXQgdGhpcyBmbGFnLCB3aGVyZWFzIERWVCB3aWxsIG5vdCBzZXQgdGhpcyBmbGFnLgorICAgIHRBTklfVTggcmVzcFJlcWQ7CisgICAgdEFOSV9VOCAgICAgc2Vzc2lvbklkOyAvLyBQRSBzZXNzaW9uIGlkIGZvciBQRTwtPkhBTCBpbnRlcmZhY2UgCisgICAgLy8gUEUgc2Vzc2lvbiBpZCBub3cgYWRkZWQgdG8gYWxsIEhBTDwtPlBFIHRyYW5zYWNhdGlvbnMKKyAgICAvLyBIQUwgU2VuZHMgdGhlIHNlc3Npb25JZCB1bm1vZGlmaWVkLgorCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgICAgdFBvd2VyZEJtIHR4TWdtdFBvd2VyOyAvL0hBTCBmaWxscyBpbiB0aGUgdHggcG93ZXIgdXNlZCBmb3IgbWdtdCBmcmFtZXMgaW4gdGhpcyBmaWVsZC4KKyAgICB0UG93ZXJkQm0gbWF4VHhQb3dlcjsgIC8vbWF4IHBvd2VyIHRvIGJlIHVzZWQgYWZ0ZXIgYXBwbHlpbmcgdGhlIHBvd2VyIGNvbnN0cmFpbnQsIGlmIGFueQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICAgdEFOSV9VOCBleHRTZXRTdGFLZXlQYXJhbVZhbGlkOyAvL0V4dCBCc3MgQ29uZmlnIE1zZyBpZiBzZXQKKyAgICB0U2V0U3RhS2V5UGFyYW1zIGV4dFNldFN0YUtleVBhcmFtOyAgLy9TZXRTdGFLZXlQYXJhbXMgZm9yIGV4dCBic3MgbXNnCisjZW5kaWYKKworICAgIHRBTklfVTggICB1Y01heFByb2JlUmVzcFJldHJ5TGltaXQ7ICAvL3Byb2JlIFJlc3BvbnNlIE1heCByZXRyaWVzCisgICAgdEFOSV9VOCAgIGJIaWRkZW5TU0lERW47ICAgICAgICAgICAgIC8vVG8gRW5hYmxlIEhpZGRlbiBzc2lkLiAgICAgIAorICAgIHRBTklfVTggICBiUHJveHlQcm9iZVJlc3BFbjsgICAgICAgICAvL1RvIEVuYWJsZSBEaXNhYmxlIEZXIFByb3h5IFByb2JlIFJlc3AKKyAgICB0QU5JX1U4ICAgaGFsUGVyc29uYTsgICAgICAgICAvL1BlcnNvbmEgZm9yIHRoZSBCU1MgY2FuIGJlIFNUQSxBUCxHTyxDTElFTlQgdmFsdWUgc2FtZSBhcyB0Vk9TX0NPTl9NT0RFCisKKyAgICAvL1NwZWN0cnVtIE1hbmFnZW1lbnQgQ2FwYWJpbGl0eSwgMSAtIEVuYWJsZWQsIDAgLSBEaXNhYmxlZC4KKyAgICB0QU5JX1U4IGJTcGVjdHJ1bU1ndEVuYWJsZWQ7CisKK30gdEFkZEJzc1BhcmFtcywgKiB0cEFkZEJzc1BhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0QU5JX1U4IGJzc0lkeDsKKyAgICAvLyBUaGUgcmV0dXJuIHN0YXR1cyBvZiBTSVJfSEFMX0RFTEVURV9CU1NfUkVRIGlzIHJlcG9ydGVkIGhlcmUKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICAvL0hBTCB3aWxsIHNlbmQgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgdG8gTElNIG9ubHkgd2hlbiB0aGlzIGZsYWcgaXMgc2V0LgorICAgIC8vTElNIHdpbGwgc2V0IHRoaXMgZmxhZywgd2hlcmVhcyBEVlQgd2lsbCBub3Qgc2V0IHRoaXMgZmxhZy4KKyAgICB0QU5JX1U4IHJlc3BSZXFkOworICAgIHRBTklfVTggICAgIHNlc3Npb25JZDsgLy8gUEUgc2Vzc2lvbiBpZCBmb3IgUEU8LT5IQUwgaW50ZXJmYWNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSEFMIHNlbmRzIGl0IGJhY2sgdW5tb2RpZmllZC4KKyAgICB0U2lyTWFjQWRkciBic3NpZDsgLy8gV2lsbCBiZSByZW1vdmVkIGZvciBQRS1IQUwgaW50ZWdyYXRpb24KK30gdERlbGV0ZUJzc1BhcmFtcywgKiB0cERlbGV0ZUJzc1BhcmFtczsKKworLy8KKy8vIFVBUFNEIEFDIG1hc2s6IDFiIHBlciBBQworLy8gTFNCIDQgYml0cyBmb3IgZGVsaXZlcnkgZW5hYmxlZCBzZXR0aW5nLiBtc2IgNCBiaXRzIGZvciB0cmlnZ2VyIGVuYWJsZWQgc2V0dGluZ3MuIAorLy8gRW5jb2RlZCBhcyBmb2xsb3dzOgorLy8gYjcgYjYgYjUgYjQgYjMgYjIgYjEgYjAKKy8vIEJFICBCSyAgVkkgIFZPICBCRSBCSyBWSSBWTworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHRBTklfVTggc3RhSWR4OworICAgIHRBTklfVTggdWFwc2RBQ01hc2s7IAorICAgIHRBTklfVTggbWF4U3BMZW47ICAgIAorfSB0VXBkYXRlVWFwc2RQYXJhbXMsICogdHBVcGRhdGVVYXBzZFBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3Qgc1NpclNjYW5FbnRyeQoreworICAgIHRBTklfVTggYnNzSWR4W0hBTF9OVU1fQlNTSURdOworICAgIHRBTklfVTggYWN0aXZlQlNTY250OworfXRTaXJTY2FuRW50cnksICpwdFNpclNjYW5FbnRyeTsKKworLy8KKy8vIE1lc2cgaGVhZGVyIGlzIHVzZWQgZnJvbSB0U2lyTXNnUQorLy8gTWVzZyBUeXBlID0gU0lSX0hBTF9JTklUX1NDQU5fUkVRCisvLwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgZUhhbFN5c01vZGUgc2Nhbk1vZGU7CisKKyAgICB0U2lyTWFjQWRkciBic3NpZDsKKworICAgIHRBTklfVTggbm90aWZ5QnNzOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIHRBTklfVTggdXNlTm9BOworI2VuZGlmCisKKyAgICAvLyBJZiB0aGlzIGZsYWcgaXMgc2V0IEhBTCBub3RpZmllcyBQRSB3aGVuIFNNQUMgcmV0dXJucyBzdGF0dXMuCisgICAgdEFOSV9VOCBub3RpZnlIb3N0OworCisgICAgdEFOSV9VOCBmcmFtZUxlbmd0aDsKKyAgICB0QU5JX1U4IGZyYW1lVHlwZTsgICAgIC8vIERhdGEgTlVMTCBvciBDVFMgdG8gc2VsZgorCisgICAgLy8gSW5kaWNhdGVzIHRoZSBzY2FuIGR1cmF0aW9uIChpbiBtcykKKyAgICB0QU5JX1UxNiBzY2FuRHVyYXRpb247CisKKyAgICAvLyBGb3IgY3JlYXRpb24gb2YgQ1RTLXRvLVNlbGYgYW5kIERhdGEtTlVMTCBNQUMgcGFja2V0cworICAgIHRTaXJNYWNNZ210SGRyIG1hY01nbXRIZHI7CisKKyAgICB0U2lyU2NhbkVudHJ5IHNjYW5FbnRyeTsKKworICAgIC8vIHdoZW4gdGhpcyBmbGFnIGlzIHNldCwgSEFMIHNob3VsZCBjaGVjayBmb3IgbGluayB0cmFmZmljIHByaW9yIHRvIHNjYW4KKyAgICB0U2lyTGlua1RyYWZmaWNDaGVjayAgICBjaGVja0xpbmtUcmFmZmljOworCisgICAgLyoKKyAgICAgKiBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZm9yIHJldHVybmluZyBzdGF0dXMgYW5kIHN0YXRpb24gaW5kZXggZnJvbSBIQUwgdG8gUEUKKyAgICAgKiB2aWEgcmVzcG9uc2UgbWVzc2FnZS4gSEFMIGRvZXMgbm90IHJlYWQgdGhlbS4KKyAgICAgKi8KKyAgICAvLyBUaGUgcmV0dXJuIHN0YXR1cyBvZiBTSVJfSEFMX0lOSVRfU0NBTl9SRVEgaXMgcmVwb3J0ZWQgaGVyZQorICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCit9IHRJbml0U2NhblBhcmFtcywgKiB0cEluaXRTY2FuUGFyYW1zOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQordHlwZWRlZiBlbnVtICBlRGVsU3RhUmVhc29uQ29kZXsKKyAgIEhBTF9ERUxfU1RBX1JFQVNPTl9DT0RFX0tFRVBfQUxJVkUgPSAweDEsCisgICBIQUxfREVMX1NUQV9SRUFTT05fQ09ERV9USU1fQkFTRUQgID0gMHgyLAorICAgSEFMX0RFTF9TVEFfUkVBU09OX0NPREVfUkFfQkFTRUQgICA9IDB4MywKKyAgIEhBTF9ERUxfU1RBX1JFQVNPTl9DT0RFX1VOS05PV05fQTIgPSAweDQKK310RGVsU3RhUmVhc29uQ29kZTsKKyNlbmRpZgorCisvLworLy8gTXNnIGhlYWRlciBpcyB1c2VkIGZyb20gdFNpck1zZ1EKKy8vIE1zZyBUeXBlID0gU0lSX0xJTV9ERUxFVEVfU1RBX0NPTlRFWFRfSU5ECisvLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHRBTklfVTE2ICAgIGFzc29jSWQ7CisgICAgdEFOSV9VMTYgICAgc3RhSWQ7CisgICAgdFNpck1hY0FkZHIgYnNzSWQ7IC8vIFRPIFNVUFBPUlQgQlQtQU1QICAgIAorICAgICAgICAgICAgICAgICAgICAgICAvLyBIQUwgY29waWVzIGJzc2lkIGZyb20gdGhlIHN0YSB0YWJsZS4KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB0U2lyTWFjQWRkciBhZGRyMjsgICAgICAgIC8vICAKKyAgICB0QU5JX1UxNiAgICByZWFzb25Db2RlOyAgIC8vIFRvIHVuaWZ5IHRoZSBrZWVwYWxpdmUgLyB1bmtub3duIEEyIC8gdGltLWJhc2VkIGRpc2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZW5kaWYgICAgCit9IHREZWxldGVTdGFDb250ZXh0LCAqIHRwRGVsZXRlU3RhQ29udGV4dDsKKworCisvLworLy8gTWVzZyBoZWFkZXIgaXMgdXNlZCBmcm9tIHRTaXJNc2dRCisvLyBNZXNnIFR5cGUgPSBTSVJfSEFMX1NUQVJUX1NDQU5fUkVRCisvLyBGSVhNRSAtIENhbiB3ZSBqdXN0IHVzZSB0U2lyTXNnUSBkaXJlY3RseSwgaW5zdGVhZCBvZiB1c2luZyB0aGlzIHN0cnVjdHVyZT8KKy8vCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICAvLyBJbmRpY2F0ZXMgdGhlIGN1cnJlbnQgc2NhbiBjaGFubmVsCisgICAgdEFOSV9VOCBzY2FuQ2hhbm5lbDsKKworICAgIC8qCisgICAgKiBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZm9yIHJldHVybmluZyBzdGF0dXMgYW5kIHN0YXRpb24gaW5kZXggZnJvbSBIQUwgdG8gUEUKKyAgICAqIHZpYSByZXNwb25zZSBtZXNzYWdlLiBIQUwgZG9lcyBub3QgcmVhZCB0aGVtLgorICAgICovCisgICAgLy8gVGhlIHJldHVybiBzdGF0dXMgb2YgU0lSX0hBTF9TVEFSVF9TQ0FOX1JFUSBpcyByZXBvcnRlZCBoZXJlCisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisKKyNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgICB0QU5JX1UzMiBzdGFydFRTRlsyXTsKKyAgICB0UG93ZXJkQm0gdHhNZ210UG93ZXI7IC8vSEFMIGZpbGxzIGluIHRoZSB0eCBwb3dlciB1c2VkIGZvciBtZ210IGZyYW1lcyBpbiB0aGlzIGZpZWxkLgorI2VuZGlmCit9IHRTdGFydFNjYW5QYXJhbXMsICogdHBTdGFydFNjYW5QYXJhbXM7CisKKy8vCisvLyBNZXNnIGhlYWRlciBpcyB1c2VkIGZyb20gdFNpck1zZ1EKKy8vIE1lc2cgVHlwZSA9IFNJUl9IQUxfRU5EX1NDQU5fUkVRCisvLyBGSVhNRSAtIENhbiB3ZSBqdXN0IHVzZSB0U2lyTXNnUSBkaXJlY3RseSwgaW5zdGVhZCBvZiB1c2luZyB0aGlzIHN0cnVjdHVyZT8KKy8vCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICAvLyBJbmRpY2F0ZXMgdGhlIGN1cnJlbnQgc2NhbiBjaGFubmVsCisgICAgdEFOSV9VOCBzY2FuQ2hhbm5lbDsKKworICAgIC8qCisgICAgKiBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZm9yIHJldHVybmluZyBzdGF0dXMgYW5kIHN0YXRpb24gaW5kZXggZnJvbSBIQUwgdG8gUEUKKyAgICAqIHZpYSByZXNwb25zZSBtZXNzYWdlLiBIQUwgZG9lcyBub3QgcmVhZCB0aGVtLgorICAgICovCisgICAgLy8gVGhlIHJldHVybiBzdGF0dXMgb2YgU0lSX0hBTF9FTkRfU0NBTl9SRVEgaXMgcmVwb3J0ZWQgaGVyZQorICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCit9IHRFbmRTY2FuUGFyYW1zLCAqIHRwRW5kU2NhblBhcmFtczsKKworLy8KKy8vIE1lc2cgaGVhZGVyIGlzIHVzZWQgZnJvbSB0U2lyTXNnUQorLy8gTWVzZyBUeXBlID0gU0lSX0hBTF9GSU5JU0hfU0NBTl9SRVEKKy8vCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICAvLyBJZGVudGlmaWVzIHRoZSBvcGVyYXRpb25hbCBzdGF0ZSBvZiB0aGUgQVAvU1RBLgorICAgIC8vIEluIGNhc2Ugb2YgdGhlIFNUQSwgb25seSBpZiB0aGUgb3BlclN0YXRlIGlzIG5vbi16ZXJvIHdpbGwgdGhlIHJlc3Qgb2YKKyAgICAvLyB0aGUgcGFyYW1ldGVycyB0aGF0IGZvbGxvdyBiZSBkZWNvZGVkCisgICAgLy8gSW4gY2FzZSBvZiB0aGUgQVAsIGFsbCBwYXJhbWV0ZXJzIGFyZSB2YWxpZAorICAgIC8vCisgICAgLy8gMCAtIElkbGUgc3RhdGUsIDEgLSBMaW5rIEVzdGFibGlzaGVkCisKKyAgICBlSGFsU3lzTW9kZSBzY2FuTW9kZTsKKworICAgIHRTaXJNYWNBZGRyIGJzc2lkOworCisgICAgLy8gQ3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbAorICAgIHRBTklfVTggY3VycmVudE9wZXJDaGFubmVsOworCisgICAgLy8gSWYgMjAvNDAgTUh6IGlzIG9wZXJhdGlvbmFsLCB0aGlzIHdpbGwgaW5kaWNhdGUgdGhlIDQwIE1IeiBleHRlbnNpb24KKyAgICAvLyBjaGFubmVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIGNvbnRyb2wgY2hhbm5lbAorICAgIGVQaHlDaGFuQm9uZFN0YXRlIGNiU3RhdGU7CisKKyAgICAvLyBGb3IgYW4gU1RBLCBpbmRpY2F0ZXMgaWYgYSBEYXRhIE5VTEwgZnJhbWUgbmVlZHMgdG8gYmUgc2VudAorICAgIC8vIHRvIHRoZSBBUCB3aXRoIEZyYW1lQ29udHJvbC5Qd3JNZ210IGJpdCBzZXQgdG8gMAorICAgIHRBTklfVTggbm90aWZ5QnNzOworCisgICAgdEFOSV9VOCBub3RpZnlIb3N0OworCisgICAgdEFOSV9VOCBmcmFtZUxlbmd0aDsKKyAgICB0QU5JX1U4IGZyYW1lVHlwZTsgICAgIC8vIERhdGEgTlVMTCBvciBDVFMgdG8gc2VsZgorCisgICAgLy8gRm9yIGNyZWF0aW9uIG9mIENUUy10by1TZWxmIGFuZCBEYXRhLU5VTEwgTUFDIHBhY2tldHMKKyAgICB0U2lyTWFjTWdtdEhkciBtYWNNZ210SGRyOworCisgICAgdFNpclNjYW5FbnRyeSBzY2FuRW50cnk7CisKKyAgICAvKgorICAgICogRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIGZvciByZXR1cm5pbmcgc3RhdHVzIGFuZCBzdGF0aW9uIGluZGV4IGZyb20gSEFMIHRvIFBFCisgICAgKiB2aWEgcmVzcG9uc2UgbWVzc2FnZS4gSEFMIGRvZXMgbm90IHJlYWQgdGhlbS4KKyAgICAqLworICAgIC8vIFRoZSByZXR1cm4gc3RhdHVzIG9mIFNJUl9IQUxfRklOSVNIX1NDQU5fUkVRIGlzIHJlcG9ydGVkIGhlcmUKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKworfSB0RmluaXNoU2NhblBhcmFtcywgKiB0cEZpbmlzaFNjYW5QYXJhbXM7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzQmVhY29uR2VuU3RhSW5mbyB7CisgICAgdEFOSV9VMTYgICAgYXNzb2NJZDsKKyAgICB0QU5JX1UzMiAgICBzdGFUeEFja0NudDsKK310QmVhY29uR2VuU3RhSW5mbywgKnRwQmVhY29uR2VuU3RhSW5mbzsKKy8vCisvLyBNZXNnIGhlYWRlciBpcyB1c2VkIGZyb20gdFNpck1zZ1EKKy8vIE1lc2cgVHlwZSA9IFNJUl9MSU1fQkVBQ09OX0dFTl9JTkQKKy8vCisKK3R5cGVkZWYgc3RydWN0IHNCZWFjb25HZW5QYXJhbXMgeworICAgIC8vIElkZW50aWZpZXMgdGhlIEJTU0lEIGZvciB3aGljaCBpdCBpcyB0aW1lIHRvIGdlbmVyYXRlIGEgYmVhY29uCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgYnNzSWR4OworICAgIHRTaXJNYWNBZGRyICAgICAgICAgICBic3NJZDsKKyNpZmRlZiBGSVhNRV9WT0xBTlMKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICBudW1PZlN0YTsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0YXRpb25zIGluIHBvd2VyIHNhdmUsIHdobyBoYXZlIGRhdGEgcGVuZGluZyovCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgbnVtT2ZTdGFXaXRob3V0RGF0YTsgLyogTnVtYmVyIG9mIHN0YXRpb25zIGluIHBvd2VyIHNhdmUsIHdobyBkb24ndCBoYXZlIGFueSBkYXRhIHBlbmRpbmcqLworICAgIHRBTklfVTggICAgICAgICAgICAgICAgIGZCcm9hZGNhc3RUcmFmZmljUGVuZGluZyA7CisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgZHRpbUNvdW50OworI2VuZGlmCisgICAgdEFOSV9VOCAgICAgICAgICAgICAgICAgcnN2ZFszXTsgICAgICAgICAgICAgICAgLyoqIEFsaWduIHRoZSBTdHJ1Y3R1cmUgdG8gNCBieXRlcyBhcyB1bmFsbGlnbmVkIGFjY2VzcyB3aWxsIGhhcHBlbiBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdGFJbmZvIGlzIGJlaW5nIEFjY2Vzc2VkICovCisvKiogTk9URTogICB0QmVhY29uR2VuU3RhSW5mbyAgICAgc3RhSW5mb1t4eF07ICBEZXBlbmRpbmcgb24gdGhlIE51bWJlciBvZiBTVEEgaW4gUFMsIEV2ZXJ5IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGFycmF5IGlzIGJlaW5nIGFsbG9jYXRlZCBhbmQgcGlsZWQgdXAgYXQgdGhlIEVuZCovCit9IHRCZWFjb25HZW5QYXJhbXMsICogdHBCZWFjb25HZW5QYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB0U2lyTWFjQWRkciBic3NJZDsKKyAgICB0QU5JX1U4ICpiZWFjb247ICAgICAvLyBCZWFjb24gZGF0YS4KKyAgICB0QU5JX1UzMiBiZWFjb25MZW5ndGg7IC8vbGVuZ3RoIG9mIHRoZSB0ZW1wbGF0ZS4KKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgdEFOSV9VMzIgdGltSWVPZmZzZXQ7IC8vVElNIElFIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlbXBsYXRlLgorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAgICAgCisgICAgdEFOSV9VMTYgcDJwSWVPZmZzZXQ7IC8vUDJQIElFIG9mZnNldCBmcm9tIHRoZSBiZWdpbmluZyBvZiB0aGUgdGVtcGxhdGUKKyNlbmRpZiAgICAKKyNlbmRpZgorfSB0U2VuZGJlYWNvblBhcmFtcywgKiB0cFNlbmRiZWFjb25QYXJhbXM7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCit0eXBlZGVmIHN0cnVjdCBzU2VuZFByb2JlUmVzcFBhcmFtcyB7CisgICAgdFNpck1hY0FkZHIgYnNzSWQ7CisgICAgdEFOSV9VOCAgICAgICpwUHJvYmVSZXNwVGVtcGxhdGU7IAorICAgIHRBTklfVTMyICAgICBwcm9iZVJlc3BUZW1wbGF0ZUxlbjsKKyAgICB0QU5JX1UzMiAgICAgdWNQcm94eVByb2JlUmVxVmFsaWRJRUJtYXBbOF07Cit9IHRTZW5kUHJvYmVSZXNwUGFyYW1zLCAqIHRwU2VuZFByb2JlUmVzcFBhcmFtczsKKyNlbmRpZgorCisvKgorICogVGhpcyBpcyB1c2VkIGJ5IFBFIHRvIGNyZWF0ZSBhIHNldCBvZiBXRVAga2V5cyBmb3IgYSBnaXZlbiBCU1MuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdEFOSV9VOCAgICAgICAgIGJzc0lkeDsKKyAgICB0QW5pRWRUeXBlICAgICAgZW5jVHlwZTsKKyAgICB0QU5JX1U4ICAgICAgICAgbnVtS2V5czsKKyAgICB0U2lyS2V5cyAgICAgICAga2V5W1NJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVNdOworICAgIHRBTklfVTggICAgICAgICBzaW5nbGVUaWRSYzsgICAgLy8gMT1TaW5nbGUgVElEIGJhc2VkIFJlcGxheSBDb3VudCwgMD1QZXIgVElEIGJhc2VkIFJDCisgICAgLyoKKyAgICAgKiBGb2xsb3dpbmcgcGFyYW1ldGVyIGlzIGZvciByZXR1cm5pbmcgc3RhdHVzCisgICAgICogdmlhIHJlc3BvbnNlIG1lc3NhZ2UuIEhBTCBkb2VzIG5vdCByZWFkIHRoZW0uCisgICAgICovCisgICAgZUhhbFN0YXR1cyAgc3RhdHVzOyAgICAgLy8gc3RhdHVzIG9mIFNJUl9IQUxfU0VUX0JTU0tFWV9SRVEgaXMgcmVwb3J0ZWQgaGVyZQorICAgIHRBTklfVTggICAgIHNlc3Npb25JZDsgIC8vIFBFIHNlc3Npb24gaWQgZm9yIFBFPC0+SEFMIGludGVyZmFjZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQUwgc2VuZHMgdGhpcyB1bm1vZGlmaWVkIGluIHRoZSByZXNwb25zZQorfSB0U2V0QnNzS2V5UGFyYW1zLCAqdHBTZXRCc3NLZXlQYXJhbXM7CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgYnkgUEUgdG8gUmVtb3ZlIHRoZSBrZXkgaW5mb3JtYXRpb24gb24gYSBnaXZlbiBzdGF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHRBTklfVTE2ICAgICAgICAgc3RhSWR4OworICAgIHRBbmlFZFR5cGUgICAgICBlbmNUeXBlOyAgICAvLyBFbmNyeXB0aW9uL0RlY3J5cHRpb24gdHlwZQorICAgIHRBTklfVTggICAgICAgICAgIGtleUlkOworICAgIHRBTklfQk9PTEVBTiAgICB1bmljYXN0OworICAgIC8qCisgICAgICogRm9sbG93aW5nIHBhcmFtZXRlciBpcyBmb3IgcmV0dXJuaW5nIHN0YXR1cworICAgICAqIHZpYSByZXNwb25zZSBtZXNzYWdlLiBIQUwgZG9lcyBub3QgcmVhZCB0aGVtLgorICAgICAqLworICAgIGVIYWxTdGF0dXMgIHN0YXR1czsgICAgIC8vIHJldHVybiBzdGF0dXMgb2YgU0lSX0hBTF9SRU1PVkVfU1RBS0VZX1JFUSAKKyAgICB0QU5JX1U4ICAgICBzZXNzaW9uSWQ7ICAvLyBQRSBzZXNzaW9uIGlkIGZvciBQRTwtPkhBTCBpbnRlcmZhY2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIEhBTCBTZW5kcyBiYWNrIHRoZSBQRSBzZXNzaW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBpZCB1bm1vZGlmaWVkIAorfSB0UmVtb3ZlU3RhS2V5UGFyYW1zLCAqdHBSZW1vdmVTdGFLZXlQYXJhbXM7CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgYnkgUEUgdG8gcmVtb3ZlIGtleXMgZm9yIGEgZ2l2ZW4gQlNTLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHRBTklfVTggICAgICAgICBic3NJZHg7CisgICAgdEFuaUVkVHlwZSAgICAgZW5jVHlwZTsKKyAgICB0QU5JX1U4ICAgICAgICAga2V5SWQ7CisgICAgdEFOSV9VOCAgICAgICAgIHdlcFR5cGU7CisgICAgLyoKKyAgICAgKiBGb2xsb3dpbmcgcGFyYW1ldGVyIGlzIGZvciByZXR1cm5pbmcgc3RhdHVzCisgICAgICogdmlhIHJlc3BvbnNlIG1lc3NhZ2UuIEhBTCBkb2VzIG5vdCByZWFkIHRoZW0uCisgICAgICovCisgICAgZUhhbFN0YXR1cyAgc3RhdHVzOyAgICAvLyByZXR1cm4gc3RhdHVzIG9mIFNJUl9IQUxfUkVNT1ZFX0JTU0tFWV9SRVEgCisgICAgdEFOSV9VOCAgICAgc2Vzc2lvbklkOyAvLyBQRSBzZXNzaW9uIGlkIGZvciBQRTwtPkhBTCBpbnRlcmZhY2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgSEFMIFNlbmRzIGJhY2sgdGhlIFBFIHNlc3Npb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgaWQgdW5tb2RpZmllZCAKK30gdFJlbW92ZUJzc0tleVBhcmFtcywgKnRwUmVtb3ZlQnNzS2V5UGFyYW1zOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8vIGluZGV4IG9mIFNUQSB0byBnZXQgdGhlIHN0YXRpc3RpY3MgZnJvbQorICAgIHRBTklfVTE2IHN0YUlkeDsKKyAgICB0QU5JX1U4IGVuY01vZGU7CisgICAgLy8gVGhlIHJldHVybiBzdGF0dXMgb2YgU0lSX0hBTF9EUFVfU1RBVFNfUkVRIGlzIHJlcG9ydGVkIGhlcmUKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICAvLyBUaGUgcmV0dXJuIHN0YXRpc3RpY3MKKyAgICB0QU5JX1UzMiAgc2VuZEJsb2NrczsKKyAgICB0QU5JX1UzMiAgcmVjdkJsb2NrczsKKyAgICB0QU5JX1UzMiAgcmVwbGF5czsKKyAgICB0QU5JX1U4ICAgbWljRXJyb3JDbnQ7CisgICAgdEFOSV9VMzIgIHByb3RFeGNsQ250OworICAgIHRBTklfVTE2ICBmb3JtYXRFcnJDbnQ7CisgICAgdEFOSV9VMTYgIHVuRGVjcnlwdGFibGVDbnQ7CisgICAgdEFOSV9VMzIgIGRlY3J5cHRFcnJDbnQ7CisgICAgdEFOSV9VMzIgIGRlY3J5cHRPa0NudDsKKworfSB0RHB1U3RhdHNQYXJhbXMsICogdHBEcHVTdGF0c1BhcmFtczsKKworCisvKgorICogR2V0IHRoZSBEUFUgc2lnbmF0dXJlIGJhc2VkIG9uIGEgZ2l2ZW4gc3RhSWQKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0QU5JX1UxNiAgICAgICAgc3RhSWR4OworICAgIC8qCisgICAgICogRm9sbG93aW5nIHBhcmFtZXRlciBpcyBmb3IgcmV0dXJuaW5nIHN0YXR1cworICAgICAqIHZpYSByZXNwb25zZSBtZXNzYWdlLiBIQUwgZG9lcyBub3QgcmVhZCB0aGVtLgorICAgICAqLworICAgIC8vIFRoZSByZXR1cm4gc3RhdHVzIG9mIFNJUl9IQUxfU0VUX0JTU0tFWV9SRVEgaXMgcmVwb3J0ZWQgaGVyZQorICAgIGVIYWxTdGF0dXMgc3RhdHVzOworICAgIHRBTklfVTggICAgZHB1RGVzY0luZHg7CisgICAgdEFOSV9VOCAgICBkcHVTaWduYXR1cmU7Cit9IHRHZXREcHVQYXJhbXMsICp0cEdldERwdVBhcmFtczsKKworCisKKy8vSEFMIE1TRzogU0lSX0hBTF9VUERBVEVfQkVBQ09OX0lORAordHlwZWRlZiBzdHJ1Y3QKK3sKKworICAgIHRBTklfVTggIGJzc0lkeDsKKworICAgIC8vc2hvcnRQcmVhbWJsZSBtb2RlLiBIQUwgc2hvdWxkIHVwZGF0ZSBhbGwgdGhlIFNUQSByYXRlcyB3aGVuIGl0CisgICAgLy9yZWNlaXZlcyB0aGlzIG1lc3NhZ2UKKyAgICB0QU5JX1U4IGZTaG9ydFByZWFtYmxlOworICAgIC8vc2hvcnQgU2xvdCB0aW1lLgorICAgIHRBTklfVTggZlNob3J0U2xvdFRpbWU7CisgICAgLy9CZWFjb24gSW50ZXJ2YWwKKyAgICB0QU5JX1UxNiBiZWFjb25JbnRlcnZhbDsKKyAgICAvL1Byb3RlY3Rpb24gcmVsYXRlZAorICAgIHRBTklfVTggbGxhQ29leGlzdDsKKyAgICB0QU5JX1U4IGxsYkNvZXhpc3Q7CisgICAgdEFOSV9VOCBsbGdDb2V4aXN0OworICAgIHRBTklfVTggaHQyME1oekNvZXhpc3Q7CisgICAgdEFOSV9VOCBsbG5Ob25HRkNvZXhpc3Q7CisgICAgdEFOSV9VOCBmTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisgICAgdEFOSV9VOCBmUklGU01vZGU7CisKKyAgICB0QU5JX1UxNiBwYXJhbUNoYW5nZUJpdG1hcDsKK310VXBkYXRlQmVhY29uUGFyYW1zLCAqdHBVcGRhdGVCZWFjb25QYXJhbXM7CisKKworCisvL0hBTCBNU0c6IFNJUl9IQUxfVVBEQVRFX0NGX0lORAordHlwZWRlZiBzdHJ1Y3QKK3sKKworICAgIHRBTklfVTggIGJzc0lkeDsKKworICAgIC8qCisgICAgKiBjZnBDb3VudCBpbmRpY2F0ZXMgaG93IG1hbnkgRFRJTXMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBmcmFtZSkgYXBwZWFyIGJlZm9yZSB0aGUgbmV4dCBDRlAgc3RhcnQuCisgICAgKiBBIENGUENvdW50IG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgRFRJTSBtYXJrcyB0aGUgc3RhcnQgb2YgdGhlIENGUC4KKyAgICAqLworICAgIHRBTklfVTggIGNmcENvdW50OworCisgICAgLyogY2ZwUGVyaW9kIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIERUSU0gaW50ZXJ2YWxzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIENGUHMuICovCisgICAgdEFOSV9VOCBjZnBQZXJpb2Q7CisKK310VXBkYXRlQ0ZQYXJhbXMsICp0cFVwZGF0ZUNGUGFyYW1zOworCisKKworLy9IQUwgTVNHOiBTSVJfSEFMX1VQREFURV9EVElNX0lORAorLy9UaGlzIG1lc3NhZ2Ugbm90IHJlcXVpcmVkLCBhcyBTb2Z0bWFjIGlzIHN1cHBvc2VkIHRvIHJlYWQgdGhlc2UgdmFsdWVzIGZyb20gdGhlIGJlYWNvbi4KKy8vUEUgc2hvdWxkIG5vdCBsb29rIGF0IFRJTSBlbGVtZW50CisKKy8qCit0eXBlZGVmIHN0cnVjdAoreworICAgIHRBTklfVTggIGJzc0lkeDsKKworCisgICAgLy9UaGUgRFRJTSBDb3VudCBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYmVhY29ucyAoaW5jbHVkaW5nIHRoZSBjdXJyZW50IGZyYW1lKSBhcHBlYXIgYmVmb3JlIHRoZSBuZXh0CisgICAgLy8gRFRJTS4gQSBEVElNIENvdW50IG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgVElNIGlzIGEgRFRJTS4KKyAgICAvLworICAgIHRBTklfVTggZHRpbUNvdW50OworCisKKyAgIC8vIFRoZSBEVElNIFBlcmlvZCBmaWVsZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBCZWFjb24gaW50ZXJ2YWxzIGJldHdlZW4gc3VjY2Vzc2l2ZSBEVElNcy4gSWYgYWxsIFRJTXMgYXJlCisgICAvLyBEVElNcywgdGhlIERUSU0gUGVyaW9kIGZpZWxkIGhhcyB0aGUgdmFsdWUgMS4gVGhlIERUSU0gUGVyaW9kIHZhbHVlIDAgaXMgcmVzZXJ2ZWQuCisgICAgLy8KKyAgICB0QU5JX1U4IGR0aW1QZXJpb2Q7CisKK310VXBkYXRlRHRpbVBhcmFtcywgKnRwVXBkYXRlRHRpbVBhcmFtczsKKyovCisKKworLy9IQUwgTVNHOiBTSVJfSEFMX0NITkxfU1dJVENIX1JFUQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0QU5JX1U4IGNoYW5uZWxOdW1iZXI7CisjaWZuZGVmIFdMQU5fRkVBVFVSRV9WT1dJRkkgICAgCisgICAgdEFOSV9VOCBsb2NhbFBvd2VyQ29uc3RyYWludDsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJICAqLworICAgIHRTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgc2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKyAgICB0QU5JX1U4IHBlU2Vzc2lvbklkOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIHRQb3dlcmRCbSB0eE1nbXRQb3dlcjsgLy9IQUwgZmlsbHMgaW4gdGhlIHR4IHBvd2VyIHVzZWQgZm9yIG1nbXQgZnJhbWVzIGluIHRoaXMgZmllbGQuCisgICAgdFBvd2VyZEJtIG1heFR4UG93ZXI7CisgICAgdFNpck1hY0FkZHIgc2VsZlN0YU1hY0FkZHI7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3RoZSByZXF1ZXN0IGhhcyBwb3dlciBjb25zdHJhaW50cywgdGhpcyBzaG91bGQgYmUgYXBwbGllZCBvbmx5IHRvIHRoYXQgc2Vzc2lvbgorI2VuZGlmCisgICAgLyogVk8gV2lmaSBjb21tZW50OiBCU1NJRCBpcyBuZWVkZWQgdG8gaWRlbnRpZnkgd2hpY2ggc2Vzc2lvbiBpc3N1ZWQgdGhpcyByZXF1ZXN0LiBBcyB0aGUgCisgICAgICAgcmVxdWVzdCBoYXMgcG93ZXIgY29uc3RyYWludHMsIHRoaXMgc2hvdWxkIGJlIGFwcGxpZWQgb25seSB0byB0aGF0IHNlc3Npb24gKi8KKyAgICAvKiBWIElNUDogS2VlcCBic3NJZCBmaWVsZCBhdCB0aGUgZW5kIG9mIHRoaXMgbXNnLiBJdCBpcyB1c2VkIHRvIG1hbnRhaW4gYmFja3dhcmQgY29tcGF0YmlsaXR5CisgICAgICogYnkgd2F5IG9mIGlnbm9yaW5nIGlmIHVzaW5nIG5ldyBob3N0L29sZCBGVyBvciBvbGQgaG9zdC9uZXcgRlcgc2luY2UgaXQgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIHN0cnVjdAorICAgICAqLworICAgIHRTaXJNYWNBZGRyIGJzc0lkOworCisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisKK310U3dpdGNoQ2hhbm5lbFBhcmFtcywgKnRwU3dpdGNoQ2hhbm5lbFBhcmFtczsKKwordHlwZWRlZiB2b2lkICgqdHBTZXRMaW5rU3RhdGVDYWxsYmFjaykodHBBbmlTaXJHbG9iYWwgcE1hYywgdm9pZCAqbXNnUGFyYW0gKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc0xpbmtTdGF0ZVBhcmFtcworeworICAgIC8vIFNJUl9IQUxfU0VUX0xJTktfU1RBVEUKKyAgICB0U2lyTWFjQWRkciBic3NpZDsKKyAgICB0U2lyTWFjQWRkciBzZWxmTWFjQWRkcjsKKyAgICB0U2lyTGlua1N0YXRlIHN0YXRlOworICAgIHRwU2V0TGlua1N0YXRlQ2FsbGJhY2sgY2FsbGJhY2s7CisgICAgdm9pZCAqY2FsbGJhY2tBcmc7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICBpbnQgZnQ7CisgICAgdm9pZCAqIHNlc3Npb247CisjZW5kaWYKK30gdExpbmtTdGF0ZVBhcmFtcywgKiB0cExpbmtTdGF0ZVBhcmFtczsKKworCit0eXBlZGVmIHN0cnVjdAoreworICB0QU5JX1UxNiBzdGFJZHg7CisgIHRBTklfVTE2IHRzcGVjSWR4OyAvL1RTUEVDIGhhbmRsZXIgdW5pcXVlbHkgaWRlbnRpZnlpbmcgYSBUU1BFQyBmb3IgYSBTVEEgaW4gYSBCU1MKKyAgdFNpck1hY1RzcGVjSUUgICB0c3BlYzsKKyAgZUhhbFN0YXR1cyAgICAgICBzdGF0dXM7CisgIHRBTklfVTggICAgICAgICAgc2Vzc2lvbklkOyAgICAgICAgICAvL1BFIHNlc3Npb24gaWQgZm9yIFBFPC0+SEFMIGludGVyZmFjZSAKK30gdEFkZFRzUGFyYW1zLCAqdHBBZGRUc1BhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdEFOSV9VMTYgc3RhSWR4OworICB0QU5JX1UxNiB0c3BlY0lkeDsgLy9UU1BFQyBpZGVudGlmaWVyIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGEgVFNQRUMgZm9yIGEgU1RBIGluIGEgQlNTCisgIHRTaXJNYWNBZGRyIGJzc0lkOyAvL1RPIFNVUFBPUlQgQlQtQU1QCisgIAorfSB0RGVsVHNQYXJhbXMsICp0cERlbFRzUGFyYW1zOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKworI2RlZmluZSBIQUxfUU9TX05VTV9UU1BFQ19NQVggMgorI2RlZmluZSBIQUxfUU9TX05VTV9BQ19NQVggNAorCit0eXBlZGVmIHN0cnVjdAoreworICB0QU5JX1UxNiBzdGFJZHg7CisgIHRBTklfVTE2IHRzcGVjSWR4OyAvL1RTUEVDIGhhbmRsZXIgdW5pcXVlbHkgaWRlbnRpZnlpbmcgYSBUU1BFQyBmb3IgYSBTVEEgaW4gYSBCU1MKKyAgdFNpck1hY1RzcGVjSUUgICB0c3BlY1tIQUxfUU9TX05VTV9BQ19NQVhdOworICBlSGFsU3RhdHVzICAgICAgIHN0YXR1c1tIQUxfUU9TX05VTV9BQ19NQVhdOworICB0QU5JX1U4ICAgICAgICAgIHNlc3Npb25JZDsgICAgICAgICAgLy9QRSBzZXNzaW9uIGlkIGZvciBQRTwtPkhBTCBpbnRlcmZhY2UgCit9dEFnZ3JBZGRUc1BhcmFtcywgKnRwQWdnckFkZFRzUGFyYW1zOworCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworCit0eXBlZGVmIHRTaXJSZXRTdGF0dXMgKCp0SGFsTXNnQ2FsbGJhY2spKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIG1lc2dJZCwgdm9pZCAqbWVzZ1BhcmFtICk7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdEFOSV9VMTYgYnNzSWR4OworICB0QU5JX0JPT0xFQU4gaGlnaFBlcmZvcm1hbmNlOworICB0U2lyTWFjRWRjYVBhcmFtUmVjb3JkIGFjYmU7IC8vIGJlc3QgZWZmb3J0CisgIHRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgYWNiazsgLy8gYmFja2dyb3VuZAorICB0U2lyTWFjRWRjYVBhcmFtUmVjb3JkIGFjdmk7IC8vIHZpZGVvCisgIHRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgYWN2bzsgLy8gdm9pY2UKK30gdEVkY2FQYXJhbXMsICp0cEVkY2FQYXJhbXM7CisKKy8qCisqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyovCisKK2VIYWxTdGF0dXMgaGFsTXNnX3NldFByb21pc2NNb2RlKHRwQW5pU2lyR2xvYmFsIHBNYWMpOworCisKKy8vCisvLyBNZXNnIGhlYWRlciBpcyB1c2VkIGZyb20gdFNpck1zZ1EKKy8vIE1lc2cgVHlwZSA9IFNJUl9IQUxfQUREQkFfUkVRCisvLwordHlwZWRlZiBzdHJ1Y3Qgc0FkZEJBUGFyYW1zCit7CisKKyAgICAvLyBTdGF0aW9uIEluZGV4CisgICAgdEFOSV9VMTYgc3RhSWR4OworCisgICAgLy8gUGVlciBNQUMgQWRkcmVzcworICAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCisgICAgLy8gQUREQkEgQWN0aW9uIEZyYW1lIGRpYWxvZyB0b2tlbgorICAgIC8vIEhBTCB3aWxsIG5vdCBpbnRlcnByZXQgdGhpcyBvYmplY3QKKyAgICB0QU5JX1U4IGJhRGlhbG9nVG9rZW47CisKKyAgICAvLyBUSUQgZm9yIHdoaWNoIHRoZSBCQSBpcyBiZWluZyBzZXR1cAorICAgIC8vIFRoaXMgaWRlbnRpZmllcyB0aGUgVEMgb3IgVFMgb2YgaW50ZXJlc3QKKyAgICB0QU5JX1U4IGJhVElEOworCisgICAgLy8gMCAtIERlbGF5ZWQgQkEgKE5vdCBzdXBwb3J0ZWQpCisgICAgLy8gMSAtIEltbWVkaWF0ZSBCQQorICAgIHRBTklfVTggYmFQb2xpY3k7CisKKyAgICAvLyBJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBidWZmZXJzIGZvciB0aGlzIFRJRCAoYmFUSUQpCisgICAgLy8gTk9URSAtIFRoaXMgaXMgdGhlIHJlcXVlc3RlZCBidWZmZXIgc2l6ZS4gV2hlbiB0aGlzCisgICAgLy8gaXMgcHJvY2Vzc2VkIGJ5IEhBTCBhbmQgc3Vic2VxdWVudGx5IGJ5IEhERCwgaXQgaXMKKyAgICAvLyBwb3NzaWJsZSB0aGF0IEhERCBtYXkgY2hhbmdlIHRoaXMgYnVmZmVyIHNpemUuIEFueQorICAgIC8vIGNoYW5nZSBpbiB0aGUgYnVmZmVyIHNpemUgc2hvdWxkIGJlIG5vdGVkIGJ5IFBFIGFuZAorICAgIC8vIGFkdmVydGl6ZWQgYXBwcm9wcmlhdGVseSBpbiB0aGUgQUREQkEgcmVzcG9uc2UKKyAgICB0QU5JX1UxNiBiYUJ1ZmZlclNpemU7CisKKyAgICAvLyBCQSB0aW1lb3V0IGluIFRVJ3MKKyAgICAvLyAwIG1lYW5zIG5vIHRpbWVvdXQgd2lsbCBvY2N1cgorICAgIHRBTklfVTE2IGJhVGltZW91dDsKKworICAgIC8vIGIwLi5iMyAtIEZyYWdtZW50IE51bWJlciAtIEFsd2F5cyBzZXQgdG8gMAorICAgIC8vIGI0Li5iMTUgLSBTdGFydGluZyBTZXF1ZW5jZSBOdW1iZXIgb2YgZmlyc3QgTVNEVQorICAgIC8vIGZvciB3aGljaCB0aGlzIEJBIGlzIHNldHVwCisgICAgdEFOSV9VMTYgYmFTU047CisKKyAgICAvLyBBRERCQSBkaXJlY3Rpb24KKyAgICAvLyAxIC0gT3JpZ2luYXRvcgorICAgIC8vIDAgLSBSZWNpcGllbnQKKyAgICB0QU5JX1U4IGJhRGlyZWN0aW9uOworCisgICAgLy8KKyAgICAvLyBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZm9yIHJldHVybmluZyBzdGF0dXMgZnJvbQorICAgIC8vIEhBTCB0byBQRSB2aWEgcmVzcG9uc2UgbWVzc2FnZS4gSEFMIGRvZXMgbm90IHJlYWQgdGhlbQorICAgIC8vCisgICAgLy8gVGhlIHJldHVybiBzdGF0dXMgb2YgU0lSX0hBTF9BRERCQV9SRVEgaXMgcmVwb3J0ZWQKKyAgICAvLyBpbiB0aGUgU0lSX0hBTF9BRERCQV9SU1AgbWVzc2FnZQorICAgIGVIYWxTdGF0dXMgc3RhdHVzOworCisgICAgLy8gSW5kaWNhdGluZyB0byBIQUwgd2hldGhlciBhIHJlc3BvbnNlIG1lc3NhZ2UgaXMgcmVxdWlyZWQuCisgICAgdEFOSV9VOCByZXNwUmVxZDsKKyAgICB0QU5JX1U4ICAgIHNlc3Npb25JZDsgLy8gUEUgc2Vzc2lvbiBpZCBmb3IgUEU8LT5IQUwgaW50ZXJmYWNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgSEFMIFNlbmRzIGJhY2sgdGhlIFBFIHNlc3Npb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBpZCB1bm1vZGlmaWVkIAorCit9IHRBZGRCQVBhcmFtcywgKiB0cEFkZEJBUGFyYW1zOworCisKKy8vCisvLyBNZXNnIGhlYWRlciBpcyB1c2VkIGZyb20gdFNpck1zZ1EKKy8vIE1lc2cgVHlwZSA9IFNJUl9IQUxfREVMQkFfSU5ECisvLwordHlwZWRlZiBzdHJ1Y3Qgc0RlbEJBUGFyYW1zCit7CisKKyAgICAvLyBTdGF0aW9uIEluZGV4CisgICAgdEFOSV9VMTYgc3RhSWR4OworCisgICAgLy8gVElEIGZvciB3aGljaCB0aGUgQkEgc2Vzc2lvbiBpcyBiZWluZyBkZWxldGVkCisgICAgdEFOSV9VOCBiYVRJRDsKKworICAgIC8vIERFTEJBIGRpcmVjdGlvbgorICAgIC8vIDEgLSBPcmlnaW5hdG9yCisgICAgLy8gMCAtIFJlY2lwaWVudAorICAgIHRBTklfVTggYmFEaXJlY3Rpb247CisKKyAgICAvLyBGSVhNRSAtIERvIHdlIG5lZWQgYSByZXNwb25zZSBmb3IgdGhpcz8KKyAgICAvLyBNYXliZSBqdXN0IHRoZSBJTkQvUkVRIHdpbGwgc3VmZmljZT8KKyAgICAvLworICAgIC8vIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBmb3IgcmV0dXJuaW5nIHN0YXR1cyBmcm9tCisgICAgLy8gSEFMIHRvIFBFIHZpYSByZXNwb25zZSBtZXNzYWdlLiBIQUwgZG9lcyBub3QgcmVhZCB0aGVtCisgICAgLy8KKyAgICAvLyBUaGUgcmV0dXJuIHN0YXR1cyBvZiBTSVJfSEFMX0RFTEJBX1JFUSBpcyByZXBvcnRlZAorICAgIC8vIGluIHRoZSBTSVJfSEFMX0RFTEJBX1JTUCBtZXNzYWdlCisgICAgLy9lSGFsU3RhdHVzIHN0YXR1czsKKworfSB0RGVsQkFQYXJhbXMsICogdHBEZWxCQVBhcmFtczsKKworCisvLworLy8gTWVzZyBoZWFkZXIgaXMgdXNlZCBmcm9tIHRTaXJNc2dRCisvLyBNZXNnIFR5cGUgPSBTSVJfSEFMX1NFVF9NSU1PUFNfUkVRCisvLwordHlwZWRlZiBzdHJ1Y3Qgc1NldF9NSU1PUFMKK3sKKyAgICAvLyBTdGF0aW9uIEluZGV4CisgICAgdEFOSV9VMTYgc3RhSWR4OworCisgICAgLy8gTUlNTyBQb3dlciBTYXZlIFN0YXRlCisgICAgdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIGh0TUlNT1BTU3RhdGU7CisgICAgLy8gVGhlIHJldHVybiBzdGF0dXMgb2YgU0lSX0hBTF9TRVRfTUlNT1BTX1JFUSBpcyByZXBvcnRlZAorICAgIC8vIGluIHRoZSBTSVJfSEFMX1NFVF9NSU1PUFNfUlNQIG1lc3NhZ2UKKyAgICBlSGFsU3RhdHVzIHN0YXR1czsKKyAgICB0QU5JX1U4ICAgICBmc2VuZFJzcDsKKworfSB0U2V0TUlNT1BTLCAqIHRwU2V0TUlNT1BTOworCisKKy8vCisvLyBNZXNnIGhlYWRlciBpcyB1c2VkIGZyb20gdFNpck1zZ1EKKy8vIE1lc2cgVHlwZSA9IFNJUl9IQUxfRVhJVF9CTVBTX1JFUQorLy8KK3R5cGVkZWYgc3RydWN0IHNFeGl0Qm1wc1BhcmFtcworeworICAgIHRBTklfVTggICAgIHNlbmREYXRhTnVsbDsKKyAgICBlSGFsU3RhdHVzICBzdGF0dXM7Cit9IHRFeGl0Qm1wc1BhcmFtcywgKnRwRXhpdEJtcHNQYXJhbXM7CisKKy8vCisvLyBNZXNnIGhlYWRlciBpcyB1c2VkIGZyb20gdFNpck1zZ1EKKy8vIE1lc2cgVHlwZSA9IFNJUl9IQUxfRU5URVJfVUFQU0RfUkVRCisvLwordHlwZWRlZiBzdHJ1Y3Qgc1VhcHNkUGFyYW1zCit7CisgICAgdEFOSV9VOCAgICAgYmtEZWxpdmVyeUVuYWJsZWQ6MTsKKyAgICB0QU5JX1U4ICAgICBiZURlbGl2ZXJ5RW5hYmxlZDoxOworICAgIHRBTklfVTggICAgIHZpRGVsaXZlcnlFbmFibGVkOjE7CisgICAgdEFOSV9VOCAgICAgdm9EZWxpdmVyeUVuYWJsZWQ6MTsKKyAgICB0QU5JX1U4ICAgICBia1RyaWdnZXJFbmFibGVkOjE7CisgICAgdEFOSV9VOCAgICAgYmVUcmlnZ2VyRW5hYmxlZDoxOworICAgIHRBTklfVTggICAgIHZpVHJpZ2dlckVuYWJsZWQ6MTsKKyAgICB0QU5JX1U4ICAgICB2b1RyaWdnZXJFbmFibGVkOjE7CisgICAgZUhhbFN0YXR1cyAgc3RhdHVzOworfXRVYXBzZFBhcmFtcywgKnRwVWFwc2RQYXJhbXM7CisKKy8vCisvLyBNZXNnIGhlYWRlciBpcyB1c2VkIGZyb20gdFNpck1zZ1EKKy8vIE1lc2cgVHlwZSA9IFNJUl9MSU1fREVMX0JBX0lORAorLy8KK3R5cGVkZWYgc3RydWN0IHNCQURlbGV0ZVBhcmFtcworeworCisgICAgLy8gU3RhdGlvbiBJbmRleAorICAgIHRBTklfVTE2IHN0YUlkeDsKKworICAgIC8vIFBlZXIgTUFDIEFkZHJlc3MsIHdob3NlIEJBIHNlc3Npb24gaGFzIHRpbWVkIG91dAorICAgIHRTaXJNYWNBZGRyIHBlZXJNYWNBZGRyOworCisgICAgLy8gVElEIGZvciB3aGljaCBhIEJBIHNlc3Npb24gdGltZW91dCBpcyBiZWluZyB0cmlnZ2VyZWQKKyAgICB0QU5JX1U4IGJhVElEOworCisgICAgLy8gREVMQkEgZGlyZWN0aW9uCisgICAgLy8gMSAtIE9yaWdpbmF0b3IKKyAgICAvLyAwIC0gUmVjaXBpZW50CisgICAgdEFOSV9VOCBiYURpcmVjdGlvbjsKKworICAgIHRBTklfVTMyIHJlYXNvbkNvZGU7CisKKyAgICB0U2lyTWFjQWRkciAgYnNzSWQ7IC8vIFRPIFNVUFBPUlQgQlQtQU1QICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSEFMIGNvcGllcyB0aGUgc3RhIGJzc2lkIHRvIHRoaXMuCit9IHRCQURlbGV0ZVBhcmFtcywgKiB0cEJBRGVsZXRlUGFyYW1zOworCisKKy8vIE1lc2cgVHlwZSA9IFNJUl9MSU1fQUREX0JBX0lORAordHlwZWRlZiBzdHJ1Y3Qgc0JhQWN0aXZpdHlJbmQKK3sKKyAgICB0QU5JX1UxNiBiYUNhbmRpZGF0ZUNudDsKKyAgICAvL2JhQ2FuZGlkYXRlQ250IGlzIGZvbGxvd2VkIGJ5IEJBIENhbmRpZGF0ZSBMaXN0ICggdEFkZEJhQ2FuZGlkYXRlKQorCisgICAgdFNpck1hY0FkZHIgIGJzc0lkOyAvLyBUTyBTVVBQT1JUIEJULUFNUCAgICAKK30gdEJhQWN0aXZpdHlJbmQsICogdHBCYUFjdGl2aXR5SW5kOworCisKK3R5cGVkZWYgc3RydWN0IHRIYWxJbmRDQgoreworCisgICAgdEhhbE1zZ0NhbGxiYWNrIHBIYWxJbmRDQjsKKworfXRIYWxJbmRDQiwqdHBIYWxJbmRDQjsKKworLyoqIE1heCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHN0YXRpb25zIGJpdG1hcCBhbGlnbmVkIGF0IDQgYnl0ZXMgYm91bmRhcnkgKi8KKyNkZWZpbmUgSEFMTVNHX05VTUJZVEVTX1NUQVRJT05fQklUTUFQKHgpICgoKHggLyAzMikgKyAoKHggJSAzMik/MTowKSkgKiA0KQorCit0eXBlZGVmIHN0cnVjdCBzQ29udHJvbFR4UGFyYW1zCit7CisgICAgdEFOSV9CT09MRUFOIHN0b3BUeDsKKyAgICAvKiBNYXN0ZXIgZmxhZyB0byBzdG9wIG9yIHJlc3VtZSBhbGwgdHJhbnNtaXNzaW9uLCBPbmNlIHRoaXMgZmxhZyBpcyBzZXQsCisgICAgICogc29mdG1hYyBkb2VzbnQgbG9vayBmb3IgYW55IG90aGVyIGRldGFpbHMuCisgICAgICovCisgICAgdEFOSV9VOCBmQ3RybEdsb2JhbDsKKyAgICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBzdGFCaXRtYXBbXSBpcyB2YWxpZCAqLworICAgIHRBTklfVTggY3RybFN0YTsKKyAgICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBic3NCaXRtYXAgYW5kIGJlYWNvbkJpdG1hcCBpcyB2YWxpZCAqLworICAgIHRBTklfVTggY3RybEJzczsKKworICAgIC8qIFdoZW4gY3RybEJzcyBpcyBzZXQsIHRoaXMgYml0bWFwIGNvbnRhaW5zIGJpdG1hcCBvZiBCU1MgaW5kaWNlcyB0byBiZQorICAgICAqIHN0b3BwZWQgZm9yIHJlc3VtZWQgZm9yIHRyYW5zbWlzc2lvbi4KKyAgICAgKiBUaGlzIGlzIDMyIGJpdCBiaXRtYXAsIG5vdCBhcnJheSBvZiBieXRlcy4KKyAgICAgKi8KKyAgICB0QU5JX1UzMiBic3NCaXRtYXA7CisgICAgLyogV2hlbiBjdHJsQnNzIGlzIHNldCwgdGhpcyBiaXRtYXAgY29udGFpbnMgYml0bWFwIG9mIEJTUyBpbmRpY2VzIHRvIGJlCisgICAgICogc3RvcHBlZCBmb3IgcmVzdW1lZCBmb3IgYmVhY29uIHRyYW5zbWlzc2lvbi4KKyAgICAgKi8KKyAgICB0QU5JX1UzMiBiZWFjb25CaXRtYXA7CisKKyAgICAvKioKKyAgICAgKiAgTWVtb3J5IGZvciB0aGUgc3RhdGlvbiBiaXRtYXAgd2lsbCBiZSBhbGxvY2F0ZWQgbGF0ZXIgYmFzZWQgb24KKyAgICAgKiAgdGhlIG51bWJlciBvZiBzdGF0aW9uIHN1cHBvcnRlZC4KKyAgICAgKi8KK30gdFR4Q29udHJvbFBhcmFtcywgKiB0cFR4Q29udHJvbFBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0VudGVyQm1wc1BhcmFtcworeworICAgIC8vVEJUVCB2YWx1ZSBkZXJpdmVkIGZyb20gdGhlIGxhc3QgYmVhY29uCisgICAgdEFOSV9VOCAgICAgICAgIGJzc0lkeDsKKyAgICB0QU5JX1U2NCB0YnR0OworICAgIHRBTklfVTggZHRpbUNvdW50OworICAgIC8vRFRJTSBwZXJpb2QgZ2l2ZW4gdG8gSEFMIGR1cmluZyBhc3NvY2lhdGlvbiBtYXkgbm90IGJlIHZhbGlkLAorICAgIC8vaWYgYXNzb2NpYXRpb24gaXMgYmFzZWQgb24gUHJvYmVSc3AgaW5zdGVhZCBvZiBiZWFjb24uCisgICAgdEFOSV9VOCBkdGltUGVyaW9kOworCisgICAgLy8gRm9yIENDWCBhbmQgMTFSIFJvYW1pbmcKKyAgICB0QU5JX1U4ICBiUnNzaUZpbHRlckVuYWJsZTsKKyAgICB0QU5JX1UzMiByc3NpRmlsdGVyUGVyaW9kOworICAgIHRBTklfVTMyIG51bUJlYWNvblBlclJzc2lBdmVyYWdlOworCisgICAgZUhhbFN0YXR1cyBzdGF0dXM7CisgICAgdEFOSV9VOCByZXNwUmVxZDsKK310RW50ZXJCbXBzUGFyYW1zLCAqdHBFbnRlckJtcHNQYXJhbXM7CisKKworLy8KKy8vIE1lc2cgaGVhZGVyIGlzIHVzZWQgZnJvbSB0U2lyTXNnUQorLy8gTWVzZyBUeXBlID0gU0lSX0hBTF9TRVRfTUFYX1RYX1BPV0VSX1JFUQorLy8KK3R5cGVkZWYgc3RydWN0IHNNYXhUeFBvd2VyUGFyYW1zCit7CisgICAgdFNpck1hY0FkZHIgYnNzSWQ7ICAvLyBCU1NJRCBpcyBuZWVkZWQgdG8gaWRlbnRpZnkgd2hpY2ggc2Vzc2lvbiBpc3N1ZWQgdGhpcyByZXF1ZXN0LiBBcyAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlIHJlcXVlc3QgaGFzIHBvd2VyIGNvbnN0cmFpbnRzLCB0aGlzIHNob3VsZCBiZSBhcHBsaWVkIG9ubHkgdG8gdGhhdCBzZXNzaW9uCisgICAgdFNpck1hY0FkZHIgc2VsZlN0YU1hY0FkZHI7CisgICAgLy9JbiByZXF1ZXN0LAorICAgIC8vcG93ZXIgPT0gTWF4VHggcG93ZXIgdG8gYmUgdXNlZC4KKyAgICAvL0luIHJlc3BvbnNlLAorICAgIC8vcG93ZXIgPT0gdHggcG93ZXIgdXNlZCBmb3IgbWFuYWdlbWVudCBmcmFtZXMuCisgICAgdFBvd2VyZEJtICBwb3dlcjsKK310TWF4VHhQb3dlclBhcmFtcywgKnRwTWF4VHhQb3dlclBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3Qgc0FkZFN0YVNlbGZQYXJhbXMKK3sKKyAgIHRTaXJNYWNBZGRyIHNlbGZNYWNBZGRyOworCisgICB0QU5JX1UzMiBzdGF0dXM7Cit9dEFkZFN0YVNlbGZQYXJhbXMsICp0cEFkZFN0YVNlbGZQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHNEZWxTdGFTZWxmUGFyYW1zCit7CisgICB0U2lyTWFjQWRkciBzZWxmTWFjQWRkcjsKKworICAgdEFOSV9VMzIgc3RhdHVzOworfXREZWxTdGFTZWxmUGFyYW1zLCAqdHBEZWxTdGFTZWxmUGFyYW1zOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAordHlwZWRlZiBzdHJ1Y3Qgc1AycFBzUGFyYW1zCit7CisgICB0QU5JX1U4ICAgb3BwX3BzOworICAgdEFOSV9VMzIgIGN0V2luZG93OworICAgdEFOSV9VOCAgIGNvdW50OyAKKyAgIHRBTklfVTMyICBkdXJhdGlvbjsKKyAgIHRBTklfVTMyICBpbnRlcnZhbDsKKyAgIHRBTklfVTMyICBzaW5nbGVfbm9hX2R1cmF0aW9uOworICAgdEFOSV9VOCAgIHBzU2VsZWN0aW9uOworfXRQMnBQc1BhcmFtcywgKnRwUDJwUHNQYXJhbXM7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworc3RhdGljIGlubGluZSB2b2lkIGhhbEdldFR4VFNGdGltZXIodHBBbmlTaXJHbG9iYWwgcE1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyTWFjVGltZVN0YW1wICpwVGltZSkKK3sKK30KKworZXh0ZXJuIHZvaWQgU3lzUHJvY2Vzc01taE1zZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSogcE1zZyk7CisKKy8qIEJlYWNvbiBGaWx0ZXJpbmcgZGF0YSBzdHJ1Y3R1cmVzICovCit0eXBlZGVmIF9fYW5pX2F0dHJfcHJlX3BhY2tlZCBzdHJ1Y3Qgc0JlYWNvbkZpbHRlck1zZworeworICAgIHRBTklfVTE2ICAgIGNhcGFiaWxpdHlJbmZvOworICAgIHRBTklfVTE2ICAgIGNhcGFiaWxpdHlNYXNrOworICAgIHRBTklfVTE2ICAgIGJlYWNvbkludGVydmFsOworICAgIHRBTklfVTE2ICAgIGllTnVtOworfSBfX2FuaV9hdHRyX3BhY2tlZCB0QmVhY29uRmlsdGVyTXNnLCAqdHBCZWFjb25GaWx0ZXJNc2c7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzRWlkQnl0ZUluZm8KK3sKKyAgICB0QU5JX1U4ICAgICBvZmZzZXQ7CisgICAgdEFOSV9VOCAgICAgdmFsdWU7CisgICAgdEFOSV9VOCAgICAgYml0TWFzazsKKyAgICB0QU5JX1U4ICAgICByZWY7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRFaWRCeXRlSW5mbywgKnRwRWlkQnl0ZUluZm87CisKKworLyogVGhlIGFib3ZlIHN0cnVjdHVyZSB3b3VsZCBiZSBmb2xsb3dlZCBieSBtdWx0aXBsZSBvZiBiZWxvdyBtZW50aW9uZWQgCitzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzQmVhY29uRmlsdGVySWUKK3sKKyAgICB0QU5JX1U4ICAgICAgICAgZWxlbWVudElkOworICAgIHRBTklfVTggICAgICAgICBjaGVja0llUHJlc2VuY2U7CisgICAgdEVpZEJ5dGVJbmZvICAgIGJ5dGU7Cit9IF9fYW5pX2F0dHJfcGFja2VkIHRCZWFjb25GaWx0ZXJJZSwgKnRwQmVhY29uRmlsdGVySWU7CisKK3R5cGVkZWYgX19hbmlfYXR0cl9wcmVfcGFja2VkIHN0cnVjdCBzUmVtQmVhY29uRmlsdGVyTXNnICAKK3sKKyAgICB0QU5JX1U4ICB1Y0llQ291bnQ7CisgICAgdEFOSV9VOCAgdWNSZW1JZUlkWzFdOworfSAgX19hbmlfYXR0cl9wYWNrZWQgdFJlbUJlYWNvbkZpbHRlck1zZywgKnRwUmVtQmVhY29uRmlsdGVyTXNnOworCisjZW5kaWYKKyNlbmRpZiAvKiBfSEFMTVNHQVBJX0hfICovCisKZGlmZiAtLWdpdCBhL0NPUkUvV0RBL2luYy9sZWdhY3kvaGFsVHlwZXMuaCBiL0NPUkUvV0RBL2luYy9sZWdhY3kvaGFsVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDdhMDJiCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREEvaW5jL2xlZ2FjeS9oYWxUeXBlcy5oCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorCisKKyAgICBcZmlsZSBoYWxUeXBlcy5oCisKKyAgICBcYnJpZWYgVGhpcyBoZWFkZXIgY2FwdHVyZXMgdHlwZXMgdGhhdCBtdXN0IGJlIHNoYXJlZCBpbiBjb21tb24gd2l0aCBpbmRpdmlkdWFsCisgICAgICAgICAgICBtb2R1bGUgaGVhZGVycyBiZWZvcmUgaW5jbHVzaW9uIGludG8gaGFsQ29tbW9uQXBpLmguCisKKyAgICAkSWQkCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgQWlyZ28gTmV0d29ya3MsIEluY29ycG9yYXRlZAorCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgSEFMVFlQRVNfSAorI2RlZmluZSBIQUxUWVBFU19ICisjaWZuZGVmIFdJTlhQX0FQUFNfQlVJTEQgICAgLy9UT0RPOiB0aGlzIGhlYWRlciBkZXBlbmRlbmN5IGRvZXMgbm90IGJlbG9uZyBpbiB0aGlzIGZpbGUKKyNpZmRlZiBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisjaW5jbHVkZSAid2xhbl9xY3RfYmFsLmgiCisKKyNpZmRlZiBXTEFOX0hBTF9WT0xBTlMKKyNpbmNsdWRlICJ2b2xhbnNEZWZzLmgiCisjZWxzZQorI2luY2x1ZGUgImxpYnJhRGVmcy5oIgorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIFdJTlhQX0FQUFNfQlVJTEQgKi8KKworI2luY2x1ZGUgInBhbFR5cGVzLmgiCisjaW5jbHVkZSAid2xhbl9udi5oIgorCisjZGVmaW5lIE9GRlNFVF9PRihzdHJ1Y3RUeXBlLGZsZE5hbWUpICAgKCYoKHN0cnVjdFR5cGUqKTApLT5mbGROYW1lKQorCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisKKyAgICBcdHlwZWRlZiB0SGFsSGFuZGxlCisKKyAgICBcYnJpZWYgSGFuZGxlIHRvIHRoZSBIQUwuICBUaGUgSEFMIGhhbmRsZSBpcyByZXR1cm5lZCBieSB0aGUgSEFMIGFmdGVyIGl0CisgICAgaXMgb3BlbmVkIChieSBjYWxsaW5nIGhhbE9wZW4pLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3R5cGVkZWYgdm9pZCAqdEhhbEhhbmRsZTsKKworLy8gZGVmaW5lIGEgdmFsdWUgZm9yIGFuIGludmFsaWQgSEFMIGhhbmRsZS4uLi4uCisjZGVmaW5lIEhBTF9JTlZBTElEX0hBTF9IQU5ETEUgKCBOVUxMICkKKworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisKKyAgICBcZW51bSBlSGFsU3RhdHVzCisKKyAgICBcYnJpZWYgRW51bWVyYXRpb24gb2YgYWxsIHN0YXR1cyBjb2RlcyByZXR1cm5lZCBieSB0aGUgaGlnaGVyIGxldmVsCisgICAgSEFMIGludGVyZmFjZSBmdW5jdGlvbnMuCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgZUhBTF9TVEFUVVNfU1VDQ0VTUywKKworICAgIC8vIGdlbmVyYWwgZmFpbHVyZS4gIFRoaXMgc3RhdHVzIGFwcGxpZXMgdG8gYWxsIGZhaWx1cmUgdGhhdCBhcmUgbm90IGNvdmVyZWQKKyAgICAvLyBieSBtb3JlIHNwZWNpZmljIHJldHVybiBjb2Rlcy4KKyAgICBlSEFMX1NUQVRVU19GQUlMVVJFLAorICAgIGVIQUxfU1RBVFVTX0ZBSUxFRF9BTExPQywKKyAgICBlSEFMX1NUQVRVU19SRVNPVVJDRVMsCisKKyAgICAvLyB0aGUgSEFMIGhhcyBub3QgYmVlbiBvcGVuZWQgYW5kIGEgSEFMIGZ1bmN0aW9uIGlzIGJlaW5nIGF0dGVtcHRlZC4KKyAgICBlSEFMX1NUQVRVU19OT1RfT1BFTiwKKworICAgIC8vIGZ1bmN0aW9uIGZhaWxlZCBkdWUgdG8gdGhlIGNhcmQgYmVpbmcgcmVtb3ZlZC4uLgorICAgIGVIQUxfU1RBVFVTX0NBUkRfTk9UX1BSRVNFTlQsCisKKyAgICAvL2hhbEludGVycnVwdCBzdGF0dXMKKyAgICBlSEFMX1NUQVRVU19JTlRFUlJVUFRfRU5BQkxFRCwKKyAgICBlSEFMX1NUQVRVU19JTlRFUlJVUFRfRElTQUJMRUQsCisgICAgZUhBTF9TVEFUVVNfTk9fSU5URVJSVVBUUywKKyAgICBlSEFMX1NUQVRVU19JTlRFUlJVUFRfUFJFU0VOVCwKKyAgICBlSEFMX1NUQVRVU19BTExfSU5URVJSVVBUU19QUk9DRVNTRUQsCisgICAgZUhBTF9TVEFUVVNfSU5URVJSVVBUX05PVF9QUk9DRVNTRUQsICAgICAgICAvL2ludGVycnVwdCBjbGVhcmVkIGJ1dCBubyBJc3IgdG8gcHJvY2VzcworCisgICAgLy8gYSBwYXJhbWV0ZXIgb24gdGhlIFBBTCBmdW5jdGlvbiBjYWxsIGlzIG5vdCB2YWxpZC4KKyAgICBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUiwKKworICAgIC8vIHRoZSBQQUwgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLi4uCisgICAgZUhBTF9TVEFUVVNfTk9UX0lOSVRJQUxJWkVELAorCisgICAgLy8gRXJyb3IgY29kZXMgZm9yIFBFLUhBTCBtZXNzYWdlIEFQSQorICAgIGVIQUxfU1RBVFVTX0lOVkFMSURfU1RBSURYLAorICAgIGVIQUxfU1RBVFVTX0lOVkFMSURfQlNTSURYLAorICAgIGVIQUxfU1RBVFVTX1NUQV9UQUJMRV9GVUxMLCAgICAgICAgICAgICAvLyBObyBzcGFjZSB0byBhZGQgbW9yZSBTVEEsIHN0YSB0YWJsZSBmdWxsLgorICAgIGVIQUxfU1RBVFVTX0JTU0lEX1RBQkxFX0ZVTEwsCisgICAgZUhBTF9TVEFUVVNfRFVQTElDQVRFX0JTU0lELAorICAgIGVIQUxfU1RBVFVTX0RVUExJQ0FURV9TVEEsCisgICAgZUhBTF9TVEFUVVNfQlNTSURfSU5WQUxJRCwKKyAgICBlSEFMX1NUQVRVU19TVEFfSU5WQUxJRCwKKyAgICBlSEFMX1NUQVRVU19JTlZBTElEX0tFWUlELAorICAgIGVIQUxfU1RBVFVTX0lOVkFMSURfU0lHTkFUVVJFLAorCisgICAgLy9EWEUKKyAgICBlSEFMX1NUQVRVU19EWEVfRkFJTEVEX05PX0RFU0NTLAorICAgIGVIQUxfU1RBVFVTX0RYRV9DSEFOTkVMX05PVF9DT05GSUcsICAgICAgICAgLy8gQ2hhbm5lbCBub3QgY29uZmlndXJlZAorICAgIGVIQUxfU1RBVFVTX0RYRV9DSEFOTkVMX01JU1VTRSwgICAgICAgICAgICAgLy8gU3BlY2lmaWVkIG9wZXJhdGlvbiBpbmNvbnNpc3RlbnQgdy8gY29uZmlndXJhdGlvbgorICAgIGVIQUxfU1RBVFVTX0RYRV9WSVJUVUFMX01FTV9BTExPQ19FUlJPUiwgICAgLy8KKyAgICBlSEFMX1NUQVRVU19EWEVfU0hBUkVEX01FTV9BTExPQ19FUlJPUiwgICAgIC8vCisgICAgZUhBTF9TVEFUVVNfRFhFX0lOVkFMSURfQ0hBTk5FTCwKKyAgICBlSEFMX1NUQVRVU19EWEVfSU5WQUxJRF9DQUxMQkFDSywKKyAgICBlSEFMX1NUQVRVU19EWEVfSU5DT05TSVNURU5UX0RFU0NfQ09VTlQsCisgICAgZUhBTF9TVEFUVVNfRFhFX1hGUl9RVUVVRV9FUlJPUiwKKyAgICBlSEFMX1NUQVRVU19EWEVfSU5WQUxJRF9CVUZGRVIsCisgICAgZUhBTF9TVEFUVVNfRFhFX0lOQ09NUExFVEVfUEFDS0VULAorICAgIGVIQUxfU1RBVFVTX0RYRV9JTlZBTElEX1BBUkFNRVRFUiwKKyAgICBlSEFMX1NUQVRVU19EWEVfQ0hfQUxSRUFEWV9DT05GSUdVUkVELAorICAgIGVIQUxfU1RBVFVTX0RYRV9VU0JfSU5WQUxJRF9FUCwKKyAgICBlSEFMX1NUQVRVU19EWEVfR0VOX0VSUk9SLAorCisKKyAgICAvLyBzdGF0dXMgY29kZXMgYWRkZWQgZm9yIHRoZSBJbWFnZVZhbGlkYXRlIGxpYnJhcnkKKyAgICBlSEFMX1NUQVRVU19FX05VTExfVkFMVUUsCisgICAgZUhBTF9TVEFUVVNfRV9GSUxFX05PVF9GT1VORCwKKyAgICBlSEFMX1NUQVRVU19FX0ZJTEVfSU5WQUxJRF9DT05URU5ULAorICAgIGVIQUxfU1RBVFVTX0VfTUFMTE9DX0ZBSUxFRCwKKyAgICBlSEFMX1NUQVRVU19FX0ZJTEVfUkVBRF9GQUlMRUQsCisgICAgZUhBTF9TVEFUVVNfRV9JTUFHRV9JTlZBTElELAorICAgIGVIQUxfU1RBVFVTX0VfSU1BR0VfVU5TVVBQT1JURUQsCisKKyAgICAvLyBzdGF0dXMgY29kZSByZXR1cm5lZCBieSBkZXZpY2UgbWVtb3J5IGNhbGxzIHdoZW4gbWVtb3J5IGlzCisgICAgLy8gbm90IGFsaWduZWQgY29ycmVjdGx5LgorICAgIGVIQUxfU1RBVFVTX0RFVklDRV9NRU1PUllfTUlTQUxJR05FRCwgICAgICAgICAgLy8gbWVtb3J5IGFjY2VzcyBpcyBub3QgYWxpZ25lZCBvbiBhIDQgYnl0ZSBib3VuZGFyeQorICAgIGVIQUxfU1RBVFVTX0RFVklDRV9NRU1PUllfTEVOR1RIX0VSUk9SLCAgICAgICAgLy8gbWVtb3J5IGFjY2VzcyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzCisKKyAgICAvLyBHZW5lcmljIHN0YXR1cyBjb2RlIHRvIGluZGljYXRlIG5ldHdvcmsgY29uZ2VzdGlvbi4KKyAgICBlSEFMX1NUQVRVU19ORVRfQ09OR0VTVElPTiwKKworICAgIC8vIHZhcmlvdXMgc3RhdHVzIGNvZGVzIGZvciBSeCBwYWNrZXQgZHJvcHBlZCBjb25kaXRpb25zLi4uICBOb3RlIHRoZSBNaW4gYW5kIE1heAorICAgIC8vIGVudW1zIHRoYXQgYnJhY2tlZCB0aGUgUnggUGFja2V0IERyb3BwZWQgc3RhdHVzIGNvZGVzLiAgIFRoZXJlIGlzIGNvZGUgdGhhdAorICAgIC8vIGxvb2tzIGF0IHRoZSB2YXJpb3VzIHBhY2tldCBkcm9wcGVkIGNvbmRpdGlvbnMgc28gbWFrZSBzdXJlIHRoZXNlIG1pbiAvIG1heAorICAgIC8vIGVudW1zIHJlbWFpbiBhY2N1cmF0ZS4KKyAgICBlSEFMX1NUQVRVU19SWF9QQUNLRVRfRFJPUFBFRCwKKyAgICBlSEFMX1NUQVRVU19SWF9QQUNLRVRfRFJPUFBFRF9NSU4gPSBlSEFMX1NUQVRVU19SWF9QQUNLRVRfRFJPUFBFRCwKKyAgICBlSEFMX1NUQVRVU19SWF9QQUNLRVRfRFJPUFBFRF9OVUxMX0RBVEEsCisgICAgZUhBTF9TVEFUVVNfUlhfUEFDS0VUX0RST1BQRURfV0RTX0ZSQU1FLAorICAgIGVIQUxfU1RBVFVTX1JYX1BBQ0tFVF9EUk9QUEVEX0ZJTFRFUkVELAorICAgIGVIQUxfU1RBVFVTX1JYX1BBQ0tFVF9EUk9QUEVEX0dST1VQX0ZST01fU0VMRiwKKyAgICBlSEFMX1NUQVRVU19SWF9QQUNLRVRfRFJPUFBFRF9NQVggPSBlSEFMX1NUQVRVU19SWF9QQUNLRVRfRFJPUFBFRF9HUk9VUF9GUk9NX1NFTEYsCisKKyAgICAvLyBTdGF0dXMgaW5kaWNhdGluZyB0aGF0IFBNVSBkaWQgbm90IHBvd2VyIHVwIGFuZCBoZW5jZSBpbmRpY2F0aXZlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIGNsb2NrcyBhcmUgbm90IG9uCisgICAgZUhBTF9TVEFUVVNfUE1VX05PVF9QT1dFUkVEX1VQLAorCisgICAgLy8gUXVldWluZyBjb2RlIGZvciBCQSBtZXNzYWdlIEFQSQorICAgIGVIQUxfU1RBVFVTX0JBX0VOUVVFVUVELCAgICAgICAgLy8gcGFja2V0cyBoYXZlIGJlZW4gYnVmZmVyZWQgaW4gSG9zdAorICAgIGVIQUxfU1RBVFVTX0JBX0lOVkFMSUQsCisKKyAgICAvLyBBLU1QRFUvQkEgcmVsYXRlZCBFcnJvciBjb2RlcworICAgIGVIQUxfU1RBVFVTX0JBX1JYX0JVRkZFUlNfRlVMTCwKKyAgICBlSEFMX1NUQVRVU19CQV9SWF9NQVhfU0VTU0lPTlNfUkVBQ0hFRCwKKyAgICBlSEFMX1NUQVRVU19CQV9SWF9JTlZBTElEX1NFU1NJT05fSUQsCisKKyAgICAvLyAhIUxBQyAtIGNhbiB3ZSByZXdvcmsgdGhlIGNvZGUgc28gdGhlc2UgYXJlIG5vdCBuZWVkZWQ/CisgICAgZUhBTF9TVEFUVVNfQkFfUlhfRFJPUF9GUkFNRSwKKyAgICBlSEFMX1NUQVRVU19CQV9SWF9JTkRJQ0FURV9GUkFNRSwKKyAgICBlSEFMX1NUQVRVU19CQV9SWF9FTlFVRVVFX0ZSQU1FLAorCisgICAgLy8gUE1DIHJldHVybiBjb2Rlcy4KKyAgICBlSEFMX1NUQVRVU19QTUNfUEVORElORywKKyAgICBlSEFMX1NUQVRVU19QTUNfRElTQUJMRUQsCisgICAgZUhBTF9TVEFUVVNfUE1DX05PVF9OT1csCisgICAgZUhBTF9TVEFUVVNfUE1DX0FDX1BPV0VSLAorICAgIGVIQUxfU1RBVFVTX1BNQ19TWVNfRVJST1IsCisgICAgZUhBTF9TVEFUVVNfUE1DX0NBTk5PVF9FTlRFUl9JTVBTLAorICAgIGVIQUxfU1RBVFVTX1BNQ19BTFJFQURZX0lOX0lNUFMsCisKKyAgICBlSEFMX1NUQVRVU19IRUFSVEJFQVRfVE1PVVQsCisgICAgZUhBTF9TVEFUVVNfTlRIX0JFQUNPTl9ERUxJVkVSWSwKKworICAgIC8vQ1NSCisgICAgZUhBTF9TVEFUVVNfQ1NSX1dST05HX1NUQVRFLAorCisgICAgLy8gRFBVCisgICAgZUhBTF9TVEFUVVNfRFBVX0RFU0NSSVBUT1JfVEFCTEVfRlVMTCwKKyAgICBlSEFMX1NUQVRVU19EUFVfTUlDS0VZX1RBQkxFX0ZVTEwsCisKKyAgICAvLyBIQUwtRlcgbWVzc2FnZXMKKyAgICBlSEFMX1NUQVRVU19GV19NU0dfRkFJTFVSRSwgICAgICAgICAgICAgICAgLy8gRXJyb3IgaW4gSGFsLUZXIG1lc3NhZ2UgaW50ZXJmYWNlCisgICAgZUhBTF9TVEFUVVNfRldfTVNHX1RJTUVET1VULAorICAgIGVIQUxfU1RBVFVTX0ZXX01TR19JTlZBTElELAorICAgIGVIQUxfU1RBVFVTX0ZXX1NFTkRfTVNHX0ZBSUxFRCwKKyAgICBlSEFMX1NUQVRVU19GV19QU19CVVNZLAorCisgICAgZUhBTF9TVEFUVVNfVElNRVJfU1RBUlRfRkFJTEVELAorICAgIGVIQUxfU1RBVFVTX1RJTUVSX1NUT1BfRkFJTEVELAorCisgICAgZUhBTF9TVEFUVVNfVExfU1VTUEVORF9USU1FT1VULAorCisgICAgZUhBTF9TVEFUVVNfVU1BX0RFU0NSSVBUT1JfVEFCTEVfRlVMTCwKKworICAgIGVIQUxfU1RBVFVTX1NFVF9DSEFOX0FMUkVBRFlfT05fUkVRVUVTVEVEX0NIQU4sCisKKyAgICAvLyBub3QgYSByZWFsIHN0YXR1cy4gIEp1c3QgYSB3YXkgdG8gbWFyayB0aGUgbWF4aW11bSBpbiB0aGUgZW51bS4KKyAgICBlSEFMX1NUQVRVU19NQVgKKworfSBlSGFsU3RhdHVzOworCisKKy8vIG1hY3JvIHRvIGNoZWNrIGZvciBTVUNDRVNTIHZhbHVlIG9mIHRoZSBoYWxTdGF0dXMKKyNkZWZpbmUgSEFMX1NUQVRVU19TVUNDRVNTKCB2YXJpYWJsZSApICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSAoIHZhcmlhYmxlICkgKQorCisvLy8gQml0IHZhbHVlIGRhdGEgc3RydWN0dXJlCit0eXBlZGVmIGVudW0gc0hhbEJpdFZhbCAgLy8gRm9yIEJpdCBvcGVyYXRpb25zCit7CisgICAgZUhBTF9DTEVBUiwKKyAgICBlSEFMX1NFVAorfXRIYWxCaXRWYWw7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBNTUggQVBJcworZW51bSB7CisgICBlSElfUFJJLAorICAgZVBST1QsCisgICBlREJHCit9OworCisvLy8gU3lzdGVtIHJvbGUgZGVmaW5pdGlvbiBvbiBhIHBlciBCU1MKK3R5cGVkZWYgZW51bSBlQnNzU3lzdGVtUm9sZQoreworICAgIGVTWVNURU1fVU5LTk9XTl9ST0xFLAorICAgIGVTWVNURU1fQVBfUk9MRSwKKyAgICBlU1lTVEVNX1NUQV9JTl9JQlNTX1JPTEUsCisgICAgZVNZU1RFTV9TVEFfUk9MRSwKKyAgICBlU1lTVEVNX0JUQU1QX1NUQV9ST0xFLAorICAgIGVTWVNURU1fQlRBTVBfQVBfUk9MRSwKKworICAgIGVTWVNURU1fTEFTVF9ST0xFLAorICAgIGVTWVNURU1fTVVMVElfQlNTX1JPTEUgPSBlU1lTVEVNX0xBU1RfUk9MRQorfSB0QnNzU3lzdGVtUm9sZTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENoYW5uZWwgQm9uZGluZyBTaWRlYmFuZCBjb25maWd1cmF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgZW51bSBzSGFsQ0JzaWRlYmFuZFR5cGUKK3sKKyAgICBlSEFMX1NJREVCQU5EX0NFTlRFUj0wLAorICAgIGVIQUxfU0lERUJBTkRfTE9XRVIsCisgICAgZUhBTF9TSURFQkFORF9VUFBFUiwKKyAgICBlSEFMX1NJREVCQU5EX0NPUFkKK310SGFsQ0JzaWRlYmFuZFR5cGU7CisKKworLy8vIEhBTCBzdGF0ZXMKK3R5cGVkZWYgZW51bSB7CisgICAgZUhBTF9JRExFLAorICAgIGVIQUxfSU5JVCwKKyAgICBlSEFMX0NGRywgLy9DRkcgZG93bmxvYWQgY29tcGxldGVkLgorICAgIGVIQUxfU1RBUlRFRCwgLy9oYWxQcm9jZXNzU3RhcnRFdmVudCBjb21wZWx0ZWQuCisgICAgZUhBTF9TWVNfUkVBRFksIC8vU3lzX3JlYWR5IG1zZyByZWNlaXZlZCBmcm9tIEhERC4KKyAgICBlSEFMX05PUk1BTCwgLy9TeXNfcmVhZHkgbXNnIHJlY2VpdmVkIGZyb20gSEREIGFuZCBoYWxQcm9jZXNzU3RhcnRFdmVudCBjb21wbGV0ZWQuCit9IHRIQUxfU1RBVEU7CisKKworCisKKy8vIFR5cGUgdG8gZGVmaW5lIHNvZnRtYWMgbW9kZSAoYWxzbyBzeXN0ZW0gbW9kZSkKK3R5cGVkZWYgZW51bQoreworICAgIC8vMy0gUHJvbWlzYywgMiAtIFNjYW4sIDEgLSBMZWFybiAgMCAtIE5vcm1hbAorICAgIGVIQUxfU1lTX01PREVfTk9STUFMID0gMCwKKyAgICBlSEFMX1NZU19NT0RFX0xFQVJOLAorICAgIGVIQUxfU1lTX01PREVfU0NBTiwKKyAgICBlSEFMX1NZU19NT0RFX1BST01JU0MsCisgICAgZUhBTF9TWVNfTU9ERV9TVVNQRU5EX0xJTksKK30gZUhhbFN5c01vZGU7CisKKworCisKKy8vIEhBTCBmcmFtZSB0eXBlcy4gIFVzZWQgb24gdGhlIFR4UnggQVBJcyBhbmQgdGhlCisvLyBjb3JyZXNwb25kaW5nIFBBTCByb3V0aW5lcy4KK3R5cGVkZWYgZW51bSB7CisKKyAgICBIQUxfVFhSWF9GUk1fUkFXLAorICAgIEhBTF9UWFJYX0ZSTV9FVEgyLAorICAgIEhBTF9UWFJYX0ZSTV84MDJfMywKKyAgICBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQsCisgICAgSEFMX1RYUlhfRlJNXzgwMl8xMV9DVFJMLAorICAgIEhBTF9UWFJYX0ZSTV84MDJfMTFfREFUQSwKKyAgICBIQUxfVFhSWF9GUk1fSUdOT1JFRCwgICAvL1RoaXMgZnJhbWUgd2lsbCBiZSBkcm9wcGVkCisgICAgSEFMX1RYUlhfRlJNX01BWAorCit9IGVGcmFtZVR5cGU7CisKKwordHlwZWRlZiBlbnVtCit7CisgICAgQU5JX1RYRElSX0lCU1MgPSAwLAorICAgIEFOSV9UWERJUl9UT0RTLAorICAgIEFOSV9UWERJUl9GUk9NRFMsCisgICAgQU5JX1RYRElSX1dEUworCit9IGVGcmFtZVR4RGlyOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBlUkZfQkFORF9VTktOT1dOID0gMCwKKyAgICBlUkZfQkFORF8yXzRfR0haID0gMSwKKyAgICBlUkZfQkFORF81X0dIWiA9IDIKK30gZVJmQmFuZE1vZGU7CisKKworI2lmbmRlZiBfX29mZnNldG9mCisjZGVmaW5lIF9fb2Zmc2V0b2YodHlwZSwgZmllbGQpICgodEFOSV9VMzIpKCYoKHR5cGUgKikwKS0+ZmllbGQpKQorI2VuZGlmCisKKyNpZm5kZWYgb2Zmc2V0b2YKKyNkZWZpbmUgb2Zmc2V0b2YodHlwZSwgZmllbGQpIF9fb2Zmc2V0b2YodHlwZSwgZmllbGQpCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworI2RlZmluZSBIQUxfTUFYX1RYUE9XRVJfSU5WQUxJRCAgICAgICAxMjcKKworI2RlZmluZSBNSU5fU1RBX1BXUl9DQVBfREJNICAgICAgICAgMTMKKyNkZWZpbmUgTUFYX1NUQV9QV1JfQ0FQX0RCTSAgICAgICAgIDE5IAorCisvKiBNb3ZpbmcgdGhlIG1pc2NlbGxhbmVvdXMgZGVmaW5hdGlvbiByZXF1aXJlZCBieSBVTUFDIGFyZSBtb3ZlZCBoZXJlIGZyb20gCisgKiB2b2xhbnNkZWZzLmggKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdXBwb3J0IGRlZmluaXRpb25zIGZvciB0YXVydXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIFZvbGFucyBzdXBwb3J0cyA4IHN0YXRpb25zIGluIGhhcmR3YXJlCisgKgorICogVm9sYW5zIHdpdGhvdXQgVmlydHVhbCBTVEEgZmVhdHVyZSBjYW4gb25seSBzdXBwb3J0IDggc3RhdGlvbnM6CisgKiAgICAxIEJyb2FkY2FzdCBTVEEgKGhhcmQpCisgKiAgICAxICJTZWxmIiBTVEEgKGhhcmQpCisgKiAgICA2IFNvZnQgQVAgU3RhdGlvbnMgKGhhcmQpCisgKgorICogVm9sYW5zIHdpdGggVmlydHVhbCBTVEEgZmVhdHVyZSBzdXBwb3J0cyAxNCBzdGF0aW9uczoKKyAqICAgIDEgQnJvYWRjYXN0IFNUQSAoaGFyZCkKKyAqICAgIDEgIlNlbGYiIFNUQSAoaGFyZCkKKyAqICAgIDIgR2VuZXJhbCBQdXJwb3NlIFN0YXRpb25zIHRvIHN1cHBvcnQgVmlydHVhbCBTVEFzIChoYXJkKQorICogICAxMCBTb2Z0IEFQIFN0YXRpb25zICg0IGhhcmQvNiB2aXJ0dWFsKQorICovCisKKyNkZWZpbmUgSEFMX0lOVkFMSURfQlNTSURYICAgICAgICAgIEhBTF9OVU1fQlNTSUQrMQorI2RlZmluZSBIQUxfTlVNX1VNQV9ERVNDX0VOVFJJRVMgICAgOAorI2RlZmluZSBNQVhfTlVNX09GX0JBQ0tPRkZTICAgICAgICAgOAorCisjZGVmaW5lIElTX1ZBTElEX0JTU0lEWChfX3gpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoX194KSA8IEhBTF9OVU1fQlNTSUQpCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9WU1RBX0ZFQVRVUkUKKyNkZWZpbmUgSEFMX05VTV9BU1NPQ19TVEEgICAgICAgICAgIDEwCisjZGVmaW5lIEhBTF9OVU1fU1RBICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBIQUxfTlVNX0hXX1NUQSAgICAgICAgICAgICAgOAorI2RlZmluZSBIQUxfTlVNX0dQU1RBICAgICAgICAgICAgICAgMgorI2RlZmluZSBIQUxfTlVNX1ZTVEEgICAgICAgICAgICAgICAgSEFMX05VTV9TVEEgLSBIQUxfTlVNX0hXX1NUQQorCisjZGVmaW5lIFFXTEFORldfTUFYX05VTV9WU1RBICAgICAgICBIQUxfTlVNX1ZTVEEKKyNkZWZpbmUgUVdMQU5GV19WU1RBX0lOVkFMSURfSURYICAgIEhBTF9OVU1fU1RBKzEKKyNkZWZpbmUgUVdMQU5fVlNUQV9NSU5fSURYICAgICAgICAgIEhBTF9OVU1fSFdfU1RBCisjZGVmaW5lIFFXTEFORldfTlVNX0dQU1RBICAgICAgICAgICBIQUxfTlVNX0dQU1RBCisKKworI2RlZmluZSBJU19WU1RBX1ZBTElEX0lEWChfX3gpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX3gpICE9IFFXTEFORldfVlNUQV9JTlZBTElEX0lEWCkKKworI2RlZmluZSBJU19WU1RBX0lEWChfX3gpIFwKKyAgICAgICAgICAgICAgICAgICAoKChfX3gpID49IFFXTEFOX1ZTVEFfTUlOX0lEWCkgJiYgKChfX3gpIDwgSEFMX05VTV9TVEEpKQorCisgICAgICAgICAgICAgICAgIAorLy8gaXMgdGhlIFNUQSBhIEdlbmVyYWwgUHVycG9zZSBTVEE/CisjZGVmaW5lIElTX0dQU1RBX0lEWChfX3gpIFwKKyAgICAoKChfX3gpID49IChIQUxfTlVNX0hXX1NUQS1IQUxfTlVNX0dQU1RBKSkgJiYgXAorICAgICAoKF9feCkgPCBIQUxfTlVNX0hXX1NUQSkpCisKKy8vIGlzIHRoZSBTVEEgYSBIVyBTVEEgKGV4Y2x1ZGluZyBHUCBTVEFzKQorI2RlZmluZSBJU19IV1NUQV9JRFgoX194KSBcCisgICAgKChfX3gpIDwgKEhBTF9OVU1fSFdfU1RBLUhBTF9OVU1fR1BTVEEpKQorCisjZWxzZQorLypJbiBwcmltYSAxMiBIVyBzdGF0aW9ucyBhcmUgc3VwcG9ydGVkIGluY2x1ZGluZyBCQ0FTVCBTVEEoc3RhSWQgMCkKKyBhbmQgU0VMRiBTVEEoc3RhSWQgMSkgc28gdG90YWwgQVNTT0Mgc3RhdGlvbnMgd2hpY2ggY2FuIGNvbm5lY3QgdG8gUHJpbWEKKyBTb2Z0QVAgPSAxMiAtIDEoU2VsZiBTVGEpIC0gMShCY2FzdCBTdGEpID0gMTAgU3RhdGlvbnMuICovCisjZGVmaW5lIEhBTF9OVU1fU1RBICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBIQUxfTlVNX0FTU09DX1NUQSAgICAgICAgICAgMTAKKyNkZWZpbmUgSEFMX05VTV9IV19TVEEgICAgICAgICAgICAgIDEyCisjZW5kaWYKKworLyoKKyAqIEZyb20gTk9WQSBNYWMgQXJjaCBkb2N1bWVudAorICogIEVuY3J5cC4gbW9kZSAgICBUaGUgZW5jcnlwdGlvbiBtb2RlCisgKiAgMDAwOiBFbmNyeXB0aW9uIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGVuYWJsZWQKKyAqICAwMDE6IEVuY3J5cHRpb24gaXMgc2V0IHRvIFdFUAorICogIDAxMDogRW5jcnlwdGlvbiBpcyBzZXQgdG8gV0VQIDEwNAorICogIDAxMTogRW5jcnlwdGlvbiBpcyBzZXQgdG8gVEtJUAorICogIDEwMDogRW5jcnlwdGlvbiBpcyBzZXQgdG8gQUVTCisgKiAgMTAxIC0gMTExOiBSZXNlcnZlZCBmb3IgZnV0dXJlCisgKi8KKworI2RlZmluZSBIQUxfRU5DX1BPTElDWV9OVUxMICAgICAgICAwCisjZGVmaW5lIEhBTF9FTkNfUE9MSUNZX1dFUDQwICAgICAgIDEKKyNkZWZpbmUgSEFMX0VOQ19QT0xJQ1lfV0VQMTA0ICAgICAgMgorI2RlZmluZSBIQUxfRU5DX1BPTElDWV9US0lQICAgICAgICAzCisjZGVmaW5lIEhBTF9FTkNfUE9MSUNZX0FFU19DQ00gICAgIDQKKworI2RlZmluZSBTVEFDRkdfTUFYX1RDICAgOAorCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL0NPUkUvV0RBL2luYy9sZWdhY3kvcGFsVHlwZXMuaCBiL0NPUkUvV0RBL2luYy9sZWdhY3kvcGFsVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWE1OTBjCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREEvaW5jL2xlZ2FjeS9wYWxUeXBlcy5oCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqICovCisjaWYgIWRlZmluZWQoIFBBTFRZUEVTX0hfXyApCisjZGVmaW5lIFBBTFRZUEVTX0hfXworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKiAgCisKKyAgCisgICAgXGZpbGUgcGFsVHlwZXMuaAorICAKKyAgICBcYnJpZWYgRXhwb3J0cyBhbmQgdHlwZXMgZm9yIHRoZSBQbGF0Zm9ybSBBYnN0cmFjdGlvbiBMYXllciB0eXBlZGVmcy4KKyAgICBUaGVzZSBhcmUgY29tbW9uIHR5cGVkZWZzIHRoYXQgY2FuIGJlIHVzZWQgYWNyb3NzIFBsYXRmb3JtcyAoT1MvY29tcGlsZXIKKyAgICBhbmQgYnVzIHR5cGVzKS4gIEFsbCBjb21tb24gY29kZSBzaG91bGQgYWRoZXJlIHRvIHRoZXNlIGNvbW1vbiB0eXBlcy4KKyAgCisgICAgJElkJCAKKyAgCisgICAgQ29weXJpZ2h0IChDKSAyMDA2IEFpcmdvIE5ldHdvcmtzLCBJbmNvcnBvcmF0ZWQKKyAgCisgICAgLi4uIGRlc2NyaXB0aW9uLi4uCisgIAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgV0lOWFBfQVBQU19CVUlMRAorI2luY2x1ZGUgInZvc190eXBlcy5oIgorI2luY2x1ZGUgInZvc19hcGkuaCIKKyNlbmRpZiAvKiBXSU5YUF9BUFBTX0JVSUxEICovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNpbmNsdWRlICJoYWxMZWdhY3lQYWxUeXBlcy5oIgorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisjaWZuZGVmIE1LX0lNQUdFX0hEUgorLy8gdmFsdWVzIHRvIGNoZWNrIGFnYWluc3QgZm9yIGNvZGUgdGhhdCBpcyBDbGllbnQvQVAgc3BlY2lmaWMuICAKKy8vIHRoZSBidWlsZCB3aWxsIGRlZmluZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogCisvLyBBTklfUFJPRFVDVF9UWVBFX0NMSUVOVCAKKy8vIEFOSV9QUk9EVUNUX1RZUEVfQVAKKy8vIEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLIAorLy8KKy8vIFZhbGlkYXRlIHRoZSBQcm9kdWN0IHR5cGUgYmVpbmcgYnVpbHQuLi4uCisvLworI2lmICggZGVmaW5lZCggQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQgKSAmJiAoIGRlZmluZWQoIEFOSV9QUk9EVUNUX1RZUEVfQVAgKSB8fCBkZWZpbmVkKCBBTklfUFJPRFVDVF9UWVBFX0FQX1NESyApICkgKSAKKyNlcnJvciAibW9yZSB0aGFuIG9uZSBBTklfUFJPRFVDVF9UWVBFX3h4eCBpcyBkZWZpbmVkIGZvciB0aGlzIGJ1aWxkIgorCisjZWxpZiAoIGRlZmluZWQoIEFOSV9QUk9EVUNUX1RZUEVfQVAgKSAmJiAoIGRlZmluZWQoIEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UICkgfHwgZGVmaW5lZCggQU5JX1BST0RVQ1RfVFlQRV9BUF9TREsgKSApICkgCisjZXJyb3IgIm1vcmUgdGhhbiBvbmUgQU5JX1BST0RVQ1RfVFlQRV94eHggaXMgZGVmaW5lZCBmb3IgdGhpcyBidWlsZCIKKworI2VsaWYgKCBkZWZpbmVkKCBBTklfUFJPRFVDVF9UWVBFX0FQX1NESyApICYmICggZGVmaW5lZCggQU5JX1BST0RVQ1RfVFlQRV9DTElFTlQgKSB8fCBkZWZpbmVkKCBBTklfUFJPRFVDVF9UWVBFX0FQICkgKSApIAorI2Vycm9yICJtb3JlIHRoYW4gb25lIEFOSV9QUk9EVUNUX1RZUEVfeHh4IGlzIGRlZmluZWQgZm9yIHRoaXMgYnVpbGQiCisKKyNlbGlmICEoIGRlZmluZWQoIEFOSV9QUk9EVUNUX1RZUEVfQ0xJRU5UICkgfHwgZGVmaW5lZCggQU5JX1BST0RVQ1RfVFlQRV9BUCApIHx8IGRlZmluZWQoIEFOSV9QUk9EVUNUX1RZUEVfQVBfU0RLICkgKQorI2Vycm9yICJOT05FIG9mIHRoZSBBTklfUFJPRFVDVF9UWVBFX3h4eHggYXJlIGRlZmluZWQgZm9yIHRoaXMgYnVpbGQiCisKKyNlbmRpZgorCisKKy8vCisvLyBWYWxpZGF0ZSB0aGUgQnVzIHR5cGUgYmVpbmcgYnVpbHQuLi4uCisvLworI2lmIGRlZmluZWQoQU5JX0JVU19UWVBFX1BDSSkKKworI2lmIGRlZmluZWQoIEFOSV9CVVNfVFlQRV9QQ0llICkgfHwgZGVmaW5lZCggQU5JX0JVU19UWVBFX1VTQiApIHx8IGRlZmluZWQoQU5JX0JVU19UWVBFX1NESU8pIHx8IGRlZmluZWQoIEFOSV9CVVNfVFlQRV9QTEFURk9STSApCisjZXJyb3IgIm1vcmUgdGhhbiBvbmUgQU5JX0JVU19UWVBFX3h4eCBpcyBkZWZpbmVkIGZvciB0aGlzIGJ1aWxkIgorI2VuZGlmIC8vCisKKyNlbGlmIGRlZmluZWQoIEFOSV9CVVNfVFlQRV9QQ0llICkKKworI2lmIGRlZmluZWQoIEFOSV9CVVNfVFlQRV9QQ0kgKSB8fCBkZWZpbmVkKCBBTklfQlVTX1RZUEVfVVNCICkgfHwgZGVmaW5lZChBTklfQlVTX1RZUEVfU0RJTykgfHwgZGVmaW5lZCggQU5JX0JVU19UWVBFX1BMQVRGT1JNICkKKyNlcnJvciAibW9yZSB0aGFuIG9uZSBBTklfQlVTX1RZUEVfeHh4IGlzIGRlZmluZWQgZm9yIHRoaXMgYnVpbGQiCisjZW5kaWYKKworI2VsaWYgZGVmaW5lZCggQU5JX0JVU19UWVBFX1VTQiApCisKKyNpZiBkZWZpbmVkKCBBTklfQlVTX1RZUEVfUENJZSApIHx8IGRlZmluZWQoIEFOSV9CVVNfVFlQRV9QQ0kgKSB8fCBkZWZpbmVkKEFOSV9CVVNfVFlQRV9TRElPKSB8fCBkZWZpbmVkKCBBTklfQlVTX1RZUEVfUExBVEZPUk0gKQorI2Vycm9yICJtb3JlIHRoYW4gb25lIEFOSV9CVVNfVFlQRV94eHggaXMgZGVmaW5lZCBmb3IgdGhpcyBidWlsZCIKKyNlbmRpZgorCisjZWxpZiBkZWZpbmVkKCBBTklfQlVTX1RZUEVfU0RJTyApCisKKyNpZiBkZWZpbmVkKCBBTklfQlVTX1RZUEVfUENJZSApIHx8IGRlZmluZWQoIEFOSV9CVVNfVFlQRV9VU0IgKSB8fCBkZWZpbmVkKEFOSV9CVVNfVFlQRV9QQ0kpIHx8IGRlZmluZWQoIEFOSV9CVVNfVFlQRV9QTEFURk9STSApCisjZXJyb3IgIm1vcmUgdGhhbiBvbmUgQU5JX0JVU19UWVBFX3h4eCBpcyBkZWZpbmVkIGZvciB0aGlzIGJ1aWxkIgorI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoIEFOSV9CVVNfVFlQRV9QTEFURk9STSApCisKKyNpZiBkZWZpbmVkKCBBTklfQlVTX1RZUEVfUENJZSApIHx8IGRlZmluZWQoIEFOSV9CVVNfVFlQRV9VU0IgKSB8fCBkZWZpbmVkKEFOSV9CVVNfVFlQRV9QQ0kpIHx8IGRlZmluZWQoIEFOSV9CVVNfVFlQRV9TRElPICkKKyNlcnJvciAibW9yZSB0aGFuIG9uZSBBTklfQlVTX1RZUEVfeHh4IGlzIGRlZmluZWQgZm9yIHRoaXMgYnVpbGQiCisjZW5kaWYKKworI2VsaWYgISggZGVmaW5lZCggQU5JX0JVU19UWVBFX1BDSWUgKSB8fCBkZWZpbmVkKCBBTklfQlVTX1RZUEVfVVNCICkgfHwgZGVmaW5lZChBTklfQlVTX1RZUEVfUENJKSB8fCBkZWZpbmVkKEFOSV9CVVNfVFlQRV9TRElPKSB8fCBkZWZpbmVkKCBBTklfQlVTX1RZUEVfUExBVEZPUk0gKSApCisKKyNlcnJvciAiTk9ORSBvZiB0aGUgQU5JX0JVU19UWVBFX3h4eCBhcmUgZGVmaW5lZCBmb3IgdGhpcyBidWlsZCIKKworI2VuZGlmCisKKworLy8KKy8vIFZhbGlkYXRlIHRoZSBPUyBUeXBlIGJlaW5nIGJ1aWx0Li4uCisvLworI2lmICggZGVmaW5lZCggQU5JX09TX1RZUEVfV0lORE9XUyApICYmIGRlZmluZWQoIEFOSV9PU19UWVBFX0xJTlVYICkgJiYgZGVmaW5lZChBTklfT1NfVFlQRV9PU1gpICYmIGRlZmluZWQoQU5JX09TX1RZUEVfQU1TUykgJiYgXAorICAgICAgZGVmaW5lZCggQU5JX09TX1RZUEVfQU5EUk9JRCApICkKKyNlcnJvciAibW9yZSB0aGFuIG9uZSBBTklfT1NfVFlQRV94eHggaXMgZGVmaW5lZCBmb3IgdGhpcyBidWlsZCIKKworI2VsaWYgISggZGVmaW5lZCggQU5JX09TX1RZUEVfV0lORE9XUyApIHx8IGRlZmluZWQoIEFOSV9PU19UWVBFX0xJTlVYICkgfHwgZGVmaW5lZChBTklfT1NfVFlQRV9PU1gpIHx8IGRlZmluZWQoQU5JX09TX1RZUEVfQU1TUykgXAorICAgICAgICAgfHwgZGVmaW5lZCAoQU5JX09TX1RZUEVfQU5EUk9JRCkgKQorI2Vycm9yICJOT05FIG9mIHRoZSBBTklfT1NfVFlQRV94eHggYXJlIGRlZmluZWQgZm9yIHRoaXMgYnVpbGQiCisKKyNlbmRpZgorCisKKy8vCisvLyBWYWxpZGF0ZSB0aGUgY29tcGlsZXIuLi4KKy8vCisjaWYgKCBkZWZpbmVkKCBBTklfQ09NUElMRVJfVFlQRV9NU1ZDICkgJiYgZGVmaW5lZCggQU5JX0NPTVBJTEVSX1RZUEVfR0NDICkgJiYgZGVmaW5lZCggQU5JX0NPTVBJTEVSX1RZUEVfUlZDVCApICkgCisjZXJyb3IgIm1vcmUgdGhhbiBvbmUgQU5JX0NPTVBJTEVSX1RZUEVfeHh4IGlzIGRlZmluZWQgZm9yIHRoaXMgYnVpbGQiCisKKyNlbGlmICEoIGRlZmluZWQoIEFOSV9DT01QSUxFUl9UWVBFX01TVkMgKSB8fCBkZWZpbmVkKCBBTklfQ09NUElMRVJfVFlQRV9HQ0MgKSB8fCBkZWZpbmVkKCBBTklfQ09NUElMRVJfVFlQRV9SVkNUICkgKQorI2Vycm9yICJOT05FIG9mIHRoZSBBTklfQ09NUElMRVJfVFlQRV94eHggYXJlIGRlZmluZWQgZm9yIHRoaXMgYnVpbGQiCisKKyNlbmRpZgorCisKKworLy8gc29tZSBkaWZmZXJlbmNlcyByZWxhdGVkIHRvIHRoZSBjb21waWxlciBiZWluZyB1c2VkLi4uCisjaWYgZGVmaW5lZCAoIEFOSV9DT01QSUxFUl9UWVBFX0dDQyApCisKKyNkZWZpbmUgQU5JX0lOTElORV9GVU5DVElPTiBzdGF0aWMgX19pbmxpbmVfXworCisjZWxpZiBkZWZpbmVkKCBBTklfQ09NUElMRVJfVFlQRV9NU1ZDICkKKworI2RlZmluZSBBTklfSU5MSU5FX0ZVTkNUSU9OIF9faW5saW5lCisKKyNlbGlmIGRlZmluZWQoIEFOSV9DT01QSUxFUl9UWVBFX1JWQ1QgKQorCisjZGVmaW5lIEFOSV9JTkxJTkVfRlVOQ1RJT04gSU5MSU5FCisKKyNlbHNlIAorCisjZXJyb3IgImludmFsaWQgQU5JX0NPTVBJTEVSX1RZUEUgZGVmaW5pdGlvbiIKKworI2VuZGlmCisjZW5kaWYKKworCisKKworLy8gQ29tbW9uIHR5cGUgZGVmaW5pdGlvbnMuLi4KKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgdEFOSV9VODsKK3R5cGVkZWYgICBzaWduZWQgY2hhciAgdEFOSV9TODsKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB0QU5JX1UxNjsKK3R5cGVkZWYgICBzaWduZWQgc2hvcnQgdEFOSV9TMTY7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdEFOSV9VMzI7Cit0eXBlZGVmICAgc2lnbmVkIGxvbmcgIHRBTklfUzMyOworCisjaWYgZGVmaW5lZCBBTklfT1NfVFlQRV9XSU5ET1dTCit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdEFOSV9VNjQ7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdEFOSV9VNjQ7CisjZW5kaWYKKwordHlwZWRlZiB0QU5JX1U4IHRBTklfQllURTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworI2lmIGRlZmluZWQoIEFOSV9PU19UWVBFX1dJTkRPV1MgKQorI2lmIGRlZmluZWQoX1dJTjY0KQorIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB0QU5JX1UzMl9PUl9QVFI7CisjZWxzZQorIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB0QU5JX1UzMl9PUl9QVFI7CisjZW5kaWYKKyNlbHNlCit0eXBlZGVmIHRBTklfVTMyICAgICB0QU5JX1UzMl9PUl9QVFI7CisjZW5kaWYKKworLy8gQnVmZmVyIGFkZHJlc3M7IGNvdWxkIGJlIHZpcnQgb3IgcGh5czsgY291bGQgYmUgMzItIG9yIDY0LWJpdCBkZXBlbmRpbmcgb24gY29tcGlsZSBvcHRpb24KK3R5cGVkZWYgdEFOSV9VMzJfT1JfUFRSICAgIHRBTklfQlVGRkVSX0FERFI7CisvLyB3aGljaCBib29sZWFuIGlzIHRoZSBtb3N0IHVzZWZ1bGUuLi5vciBib3RoID8KKyNpZm5kZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCit0eXBlZGVmIHRBTklfVTggdEFOSV9CT09MRUFOOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCit0eXBlZGVmIGVudW0gdGFnQW5pQm9vbGVhbiAKK3sKKyAgICBlQU5JX0JPT0xFQU5fRkFMU0UgPSAwLAorICAgIGVBTklfQk9PTEVBTl9UUlVFLAorICAgIAorICAgIGVBTklfQk9PTEVBTl9PRkYgPSAwLAorICAgIGVBTklfQk9PTEVBTl9PTiA9IDEsCit9IGVBbmlCb29sZWFuOworCisKKworLy8KKy8vIE1BQyBhZGRyZXNzIGRhdGEgdHlwZS4uLgorLy8KKy8vIHJldmlldyB0aGUgdXNlZnVsbmVzcyBvZiB0aGlzIHR5cGUuICBJIHN1c3BlY3QgdGhpcyB0eXBlIGlzIG5vdAorLy8gcmVhbCB1c2VmdWwgdW5sZXNzIHdlIHByb3ZpZGUgc29tZSAnaGVscGVyJyBmdW5jdGlvbnMgdG8gbWFuYWdlIAorLy8gdGhlIE1BQyBhZGRyZXNzZXMuCisvLworI2RlZmluZSBBTklfTUFDX0FERFJfU0laRSAoIDYgKQordHlwZWRlZiB0QU5JX1U4IHRBbmlNYWNBZGRyWyBBTklfTUFDX0FERFJfU0laRSBdOworCisKKworCisKKy8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICogCisKKyAgICBcdHlwZWRlZiB0SGRkSGFuZGxlCisgICAgCisgICAgXGJyaWVmIEhhbmRsZSB0byB0aGUgSERELiAgVGhlIEhERCBoYW5kbGUgaXMgZ2l2ZW4gdG8gdGhlIEhBTCBmcm9tIAorICAgIHRoZSBIREQgb24gaGFsT3Blbi4gIFRoZSBIREQgaGFuZGxlIGlzIGFuIGlucHV0IHRvIGFsbCBIREQvUEFMIGZ1bmN0aW9uCisgICAgY2FsbHMgYW5kIHJlcHJlc2VudHMgYW4gb3BhcXVlIGhhbmRsZSB0byB0aGUgSEREIGluc3RhbmNlIHRoYXQgaXMgdGllZAorICAgIHRvIHRoZSBIQUwgaW5zdGFuY2UsIG9wZW5lZCB0aHJvdWdoIGhhbE9wZW4uICAKKyAgICAKKyAgICBUaGUgSEREIG11c3QgYmUgYWJsZSB0byBkZXJpdmUgaXQncyBpbnRlcm5hbCBpbnN0YW5jZSBzdHJ1Y3R1cmUgcG9pbnRlcgorICAgIHRocm91Z2ggdGhpcyBoYW5kbGUuICBoaW50IGhpbnQuLi4KKyAgICAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordHlwZWRlZiB2b2lkICp0SGRkSGFuZGxlOworLy8gZGVmaW5lIGEgdmFsdWUgZm9yIGFuIGludmFsaWQgSEFMIGhhbmRsZS4uLi4uCisjZGVmaW5lIEhERF9JTlZBTElEX0hERF9IQU5ETEUgKCBOVUxMICkKKworCisvLyBGb3IgcGFja2V0IGNsYXNzaWZpY2F0aW9uIHJvdXRpbmVzCisjZGVmaW5lIFBBTF9CSVRfTUFTSyhvZmZzZXQpICAgICAgICAgKDEgPDwgKG9mZnNldCkpCisjZGVmaW5lIFBBTF9QS1RfRkxEX0RTQ1BfT0ZGU0VUICAgICAgMAorI2RlZmluZSBQQUxfUEtUX0ZMRF84MDIxUF9PRkZTRVQgICAgIDEKKworI2RlZmluZSBQQUxfUEtUX0ZMRF9EU0NQX01BU0sgICAgIFBBTF9CSVRfTUFTSyhQQUxfUEtUX0ZMRF9EU0NQX09GRlNFVCkKKyNkZWZpbmUgUEFMX1BLVF9GTERfODAyMVBfTUFTSyAgICBQQUxfQklUX01BU0soUEFMX1BLVF9GTERfODAyMVBfT0ZGU0VUKQorCisjaWYgZGVmaW5lZCggQU5JX09TX1RZUEVfV0lORE9XUyApIHx8IGRlZmluZWQgKEFOSV9PU19UWVBFX09TWCkKKyAgICAjZGVmaW5lIFBBTF9QS1RfRkxEXzgwMjFQX0JJVF9PRkZTRVQgMAorI2VsaWYgZGVmaW5lZCggQU5JX09TX1RZUEVfTElOVVggKQorICAgICNkZWZpbmUgUEFMX1BLVF9GTERfODAyMVBfQklUX09GRlNFVCA1CisjZWxpZiBkZWZpbmVkKCBBTklfT1NfVFlQRV9BTVNTICkKKyAgICAjZGVmaW5lIFBBTF9QS1RfRkxEXzgwMjFQX0JJVF9PRkZTRVQgMAorI2VuZGlmCisKKworLyoKK1RoaXMgcmVwcmVzZW50IGFuIG9iamVjdCBmb3IgYSBzcGluIGxvY2sgYW5kIGl0IGlzIHBsYXRmb3JtIGRlcGVuZGFudAorKi8KKy8vVXNlciBvZiB0aGlzIHZhcmlhYmxlIG11c3QgaW5pdGlhbGl6ZSBpdCB0byBQQUxfSU5WQUxJRF9TUElOTE9DS19IQU5ETEUgaW4gb3JkZXIgZm9yIHZhbGlkYXRpb24gdG8gd29yay4KK3R5cGVkZWYgdm9pZCAqIHRQYWxTcGluTG9ja0hhbmRsZTsKKyAgIAorI2RlZmluZSBQQUxfSU5WQUxJRF9TUElOTE9DS19IQU5ETEUgKE5VTEwpCisKKy8qCisgKiBUaGlzIHJlcHJlc2VudCBhbiBvYmplY3QgZm9yIGEgc2VtYXBob3JlIGFuZCBpdCBpcyBwbGF0Zm9ybSBkZXBlbmRhbnQKKyAqLwordHlwZWRlZiB2b2lkICogdFBhbFNlbWFwaG9yZUhhbmRsZTsKKworCisjZGVmaW5lIFBBTF9USUNLU19QRVJfU0VDT05EICAgICAgICAxMDAKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKK3R5cGVkZWYgdEFOSV9VMzIgdEFOSV9USU1FU1RBTVA7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL0NPUkUvV0RBL2luYy9sZWdhY3kvd2xhbl9xY3RfaGFsLmggYi9DT1JFL1dEQS9pbmMvbGVnYWN5L3dsYW5fcWN0X2hhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTcyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dEQS9pbmMvbGVnYWN5L3dsYW5fcWN0X2hhbC5oCkBAIC0wLDAgKzEsNTkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFF1YWxjb21tLCBJbmMgcHJvcHJpZXRhcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGF0ZSAgICAgICAgICAgIE1vZGlmaWVkIGJ5ICAgIE1vZGlmaWNhdGlvbiBJbmZvcm1hdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBXTEFOX1FDVF9IQUxfSAorI2RlZmluZSBXTEFOX1FDVF9IQUxfSAorI2luY2x1ZGUgInZvc19zdGF0dXMuaCIKKyNpbmNsdWRlICJoYWxUeXBlcy5oIgorI2lmbmRlZiBQQUxUWVBFU19IX18KKworCisvLy8gdW5zaWduZWQgOC1iaXQgdHlwZXMKKyNkZWZpbmUgdEFOSV9VOCAgICAgICAgdl9VOF90CisgCisvLy8gdW5zaWduZWQgMTYtYml0IHR5cGVzCisjZGVmaW5lIHRBTklfVTE2ICAgIHZfVTE2X3QgICAgCisKKy8vLyB1bnNpZ25lZCAzMi1iaXQgdHlwZXMKKyNkZWZpbmUgdEFOSV9VMzIgICAgdl9VMzJfdAorIAorLy8vIHNpZ25lZCA4LWJpdCB0eXBlcworI2RlZmluZSAgICB0QU5JX1M4ICAgICAgICB2X1M3X3QKKyAKKy8vLyBzaWduZWQgMTYtYml0IHR5cGVzCisjZGVmaW5lIHRBTklfUzE2ICAgIHZfUzE1X3QKKyAKKy8vLyBzaWduZWQgMzItYml0IHR5cGVzCisjZGVmaW5lIHRBTklfUzMyICAgIHZfUzMxX3QKKworI2RlZmluZSBlSGFsU3RhdHVzICAgIFZPU19TVEFUVVMKKworI2VuZGlmCisjaWZkZWYgRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQworI2luY2x1ZGUgImhhbEJkRGVmcy5oIgorI2VuZGlmCisjZGVmaW5lIFFXTEFOX0hBTF9EWEUwX01BU1RFUklEICA1CisKK3R5cGVkZWYgc3RydWN0IHNIYWxCZEdlbmVyaWMgeworICAgIC8qIDB4MDAgKi8KKyAgICAvLyBFTkRJQU4gQkVHSU4KKyAgICB0QU5JX1UzMiBkcHVSRiA6IDg7CisgICAgdEFOSV9VMzIgZHB1U2lnbmF0dXJlOjM7ICAgICAvKiBTaWduYXR1cmUgb24gUkEncyBEUFUgZGVzY3JpcHRvciAqLworICAgIHRBTklfVTMyIHN0YVNpZ25hdHVyZTozOworICAgIHRBTklfVTMyIHJlc2VydmVkIDogMTQ7CisgICAgdEFOSV9VMzIgZHB1TkUgOiAxOworICAgIHRBTklfVTMyIGRwdU5DIDogMTsKKyAgICB0QU5JX1UzMiBiZHQgOiAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJEIHR5cGUgKi8KKyAgICAvLyBFTkRJQU4gRU5ECisKKyAgICAvKiAweDA0ICovCisgICAgLy8gRU5ESUFOIEJFR0lOCisgICAgdEFOSV9VMzIgcmVzZXJ2ZWQxOjMyOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvLyBFTkRJQU4gRU5ECisKKworICAgIC8qIDB4MDggKi8KKyAgICAvLyBFTkRJQU4gQkVHSU4KKyAgICB0QU5JX1UzMiBoZWFkUGR1SWR4IDogMTY7ICAgICAgICAgICAgICAgIC8qIEhlYWQgUERVIGluZGV4ICovCisgICAgdEFOSV9VMzIgdGFpbFBkdUlkeCA6IDE2OyAgICAgICAgICAgICAgICAvKiBUYWlsIFBEVSBpbmRleCAqLworICAgIC8vIEVORElBTiBFTkQKKworICAgIC8qIDB4MGMgKi8KKyAgICAvLyBFTkRJQU4gQkVHSU4KKyAgICB0QU5JX1UzMiBtcGR1SGVhZGVyTGVuZ3RoIDogODsgICAgICAgICAgIC8qIE1QRFUgaGVhZGVyIGxlbmd0aCAqLworICAgIHRBTklfVTMyIG1wZHVIZWFkZXJPZmZzZXQgOiA4OyAgICAgICAgICAgLyogTVBEVSBoZWFkZXIgc3RhcnQgb2Zmc2V0ICovCisgICAgdEFOSV9VMzIgbXBkdURhdGFPZmZzZXQgOiA5OyAgICAgICAgICAgICAvKiBNUERVIGRhdGEgc3RhcnQgb2Zmc2V0ICovCisgICAgdEFOSV9VMzIgcGR1Q291bnQgOiA3OyAgICAgICAgICAgICAgICAgICAvKiBQRFUgY291bnQgKi8KKyAgICAvLyBFTkRJQU4gRU5ECisKKyAgICAvKiAweDEwICovCisgICAgLy8gRU5ESUFOIEJFR0lOCisgICAgdEFOSV9VMzIgbXBkdUxlbmd0aCA6IDE2OyAgICAgICAgICAgICAgICAvKiBNUERVIGxlbmd0aCAqLworICAgIHRBTklfVTMyIHJlc2VydmVkMzo0OyAgICAgICAgICAgIC8qIERQVSBjb21wcmVzc2lvbiBmZWVkYmFjayAqLworICAgIHRBTklfVTMyIHRpZCA6IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhZmZpYyBpZGVudGlmaWVyLCB0aWQgKi8KKyAgICB0QU5JX1UzMiByYXRlSW5kZXggOiA4OworICAgIC8vIEVORElBTiBFTkQKKworICAgIC8qIDB4MTQgKi8KKyAgICAvLyBFTkRJQU4gQkVHSU4KKyAgICB0QU5JX1UzMiBkcHVEZXNjSWR4IDogODsKKyAgICB0QU5JX1UzMiBhZGRyMUluZGV4IDogODsgIC8vQTEgaW5kZXggYWZ0ZXIgUnhQIGJpbmFyeSBzZWFyY2gKKyAgICB0QU5JX1UzMiBhZGRyMkluZGV4IDogODsgIC8vQTIgaW5kZXggYWZ0ZXIgUnhQIGJpbmFyeSBzZWFyY2gKKyAgICB0QU5JX1UzMiBhZGRyM0luZGV4IDogODsgIC8vQTMgaW5kZXggYWZ0ZXIgUnhQIGJpbmFyeSBzZWFyY2gKKyAgICAvLyBFTkRJQU4gRU5ECisvL31fX2FuaV9hdHRyX3BhY2tlZCBfX2FuaV9hdHRyX2FsaWduZWRfNCB0SGFsQmRHZW5lcmljLCAqdHBIYWxCZEdlbmVyaWM7Cit9IHRIYWxCZEdlbmVyaWMsICp0cEhhbEJkR2VuZXJpYzsKKworCisvKgorICogUERVIHdpdGhvdXQgQkQKKyAqLworCit0eXBlZGVmIHN0cnVjdCBzSGFsUGR1IHsKKyAgICB0QU5JX1U4IHBheWxvYWRbMTI0XTsKKyAgICB0QU5JX1UzMiBuZXh0UGR1SWR4OyAgICAgICAgICAgICAgICAgICAgIC8qIExTQiAxNiBiaXRzICovCisvL30gX19hbmlfYXR0cl9wYWNrZWQgX19hbmlfYXR0cl9hbGlnbmVkXzQgdEhhbFBkdSwgKnRwSGFsUGR1OworfSB0SGFsUGR1LCAqdHBIYWxQZHU7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fVUFQU0RfRldfVFJHX0ZSQU1FUworLyogVUFQU0QgcGFyYW1ldGVycyBwYXNzZWQgcGVyIEFDIHRvIEhBTCBmcm9tIFRMICovCit0eXBlZGVmIHN0cnVjdCBzVWFwc2RJbmZvIHsKKyAgICB0QU5JX1U4ICBzdGFpZHg7ICAgICAgICAvLyBTVEEgaW5kZXgKKyAgICB0QU5JX1U4ICBhYzsgICAgICAgICAgICAvLyBBY2Nlc3MgQ2F0ZWdvcnkKKyAgICB0QU5JX1U4ICB1cDsgICAgICAgICAgICAvLyBVc2VyIFByaW9yaXR5CisgICAgdEFOSV9VMzIgc3J2SW50ZXJ2YWw7ICAgLy8gU2VydmljZSBJbnRlcnZhbAorICAgIHRBTklfVTMyIHN1c0ludGVydmFsOyAgIC8vIFN1c3BlbmQgSW50ZXJ2YWwKKyAgICB0QU5JX1UzMiBkZWxheUludGVydmFsOyAvLyBEZWxheSBJbnRlcnZhbAorfSB0VWFwc2RJbmZvLCB0cFVhcHNkSW5mbzsKKyNlbmRpZgorCisjZGVmaW5lIEhBTF9UWEJEX0JEUkFURV9ERUZBVUxUIDAKKyNkZWZpbmUgSEFMX1RYQkRfQkRSQVRFX0ZJUlNUICAgMQorI2RlZmluZSBIQUxfVFhCRF9CRFJBVEVfU0VDT05EICAyCisjZGVmaW5lIEhBTF9UWEJEX0JEUkFURV9USElSRCAgIDMKKworI2RlZmluZSBIQUxfRlJBTUVfVFlQRV9NQVNLICAgICAweDMwCisjZGVmaW5lIEhBTF9GUkFNRV9UWVBFX09GRlNFVCAgIDB4NAorI2RlZmluZSBIQUxfRlJBTUVfU1VCVFlQRV9NQVNLICAweDBGCisKKyNkZWZpbmUgSEFMX1RYQkRfQkRfU1NOX0ZJTExfSE9TVCAgICAgICAgICAgICAwCisjZGVmaW5lIEhBTF9UWEJEX0JEX1NTTl9GSUxMX0RQVV9OT05fUU9TICAgIDEKKyNkZWZpbmUgSEFMX1RYQkRfQkRfU1NOX0ZJTExfRFBVX1FPUyAgICAgICAgMgorCisjZGVmaW5lIEhBTF9BQ0tQT0xJQ1lfQUNLX1JFUVVJUkVEICAgICAgICAwCisjZGVmaW5lIEhBTF9BQ0tQT0xJQ1lfQUNLX05PVFJFUVVJUkVEICAgIDEKKworI2RlZmluZSBIQUxfQkRSQVRFX0JDREFUQV9GUkFNRSAgICAgICAgICAgIDEKKyNkZWZpbmUgSEFMX0JEUkFURV9CQ01HTVRfRlJBTUUgICAgICAgICAgICAyCisjZGVmaW5lIEhBTF9CRFJBVEVfQ1RSTF9GUkFNRSAgICAgICAgICAgIDMKKyAgICAKKy8qIERlZmF1bHQgdmFsdWVzIGZvciBGaWxsVHggQkQgKi8KKyNkZWZpbmUgSEFMX0RFRkFVTFRfVU5JQ0FTVF9FTkFCTEVEICAgICAxCisjZGVmaW5lIEhBTF9STUZfRElTQUJMRUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSEFMX1JNRl9FTkFCTEVEICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEhBTF9OT19FTkNSWVBUSU9OX0RJU0FCTEVEICAgICAgICAwCisjZGVmaW5lIEhBTF9OT19FTkNSWVBUSU9OX0VOQUJMRUQgICAgICAgICAxCisgICAgCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfQUREUjNfU0VMRl9JRFggICAgICAwCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorLy8gU2hvdWxkIG5vdCB1c2UgdEhhbFR4QmQgbm9yIHRIYWxSeEJkLiBVTUFDIGRvZXNuJ3Qga25vdyB0aGVzZSBIQUwgc3RydWN0dXJlLgorI2RlZmluZSBXTEFOSEFMX1RYX0JEX0hFQURFUl9TSVpFIDQwCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUgNzYKKyNlbHNlCisjZGVmaW5lIFdMQU5IQUxfVFhfQkRfSEVBREVSX1NJWkUgICAgICAgIHNpemVvZih0SGFsVHhCZCkKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9IRUFERVJfU0laRSAgICAgICAgc2l6ZW9mKHRIYWxSeEJkKQorI2VuZGlmCisKKworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0hFQURFUl9PRkZTRVQgICAgICAgMAorCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX01QRFVfSF9PRkZTRVQoIF9wdkJESGVhZGVyICkgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5tcGR1SGVhZGVyT2Zmc2V0KQorCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX01QRFVfRF9PRkZTRVQoIF9wdkJESGVhZGVyICkgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5tcGR1RGF0YU9mZnNldCkKKworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9NUERVX0xFTiggX3B2QkRIZWFkZXIgKSAgICAgICAgKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+bXBkdUxlbmd0aCkKKworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9NUERVX0hfTEVOKCBfcHZCREhlYWRlciApICAgICAgKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+bXBkdUhlYWRlckxlbmd0aCkKKworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9GVCggX3B2QkRIZWFkZXIgKSAgICAgICAgKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+ZnQpCisKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfTExDKCBfcHZCREhlYWRlciApICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5sbGMpCisKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfVElEKCBfcHZCREhlYWRlciApICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT50aWQpCisKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfQVNGKCBfcHZCREhlYWRlciApICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5hc2YpCisKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfQUVGKCBfcHZCREhlYWRlciApICAgICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5hZWYpCisKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfTFNGKCBfcHZCREhlYWRlciApICAgICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5sc2YpCisKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfRVNGKCBfcHZCREhlYWRlciApICAgICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5lc2YpCisKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfU1RBX0lEKCBfcHZCREhlYWRlciApICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5hZGRyMkluZGV4KQorI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9BRERSM19JRFgoIF9wdkJESGVhZGVyICkgICAgICgoKHRwSGFsUnhCZClfcHZCREhlYWRlciktPmFkZHIzSW5kZXgpCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX0FERFIxX0lEWCggX3B2QkRIZWFkZXIgKSAgICAgKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+YWRkcjFJbmRleCkKKworI2RlZmluZSBXTEFOSEFMX1RYX0JEX0dFVF9USUQoIF9wdkJESGVhZGVyICkgICAgICAgICAgICgoKHRwSGFsVHhCZClfcHZCREhlYWRlciktPnRpZCkKKyNkZWZpbmUgV0xBTkhBTF9UWF9CRF9HRVRfU1RBX0lEKCBfcHZCREhlYWRlciApICAgICgoKHRwSGFsVHhCZClfcHZCREhlYWRlciktPnN0YUluZGV4KQorCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX0RQVV9TSUcoIF9wdkJESGVhZGVyICkgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5kcHVTaWduYXR1cmUpCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjZGVmaW5lIFdMQU5IQUxfRkNfUlhfQkRfUkVQT1JUX0NPTlRFTlRfU0laRSAgICAgICAgMipIQUxfTlVNX1NUQSpzaXplb2YodEFOSV9VOCkgICAvLyBzaXplIG9mIGZjU1RBVHhRTGVuW0hBTF9OVU1fU1RBXStmY1NUQUN1clR4UmF0ZVtIQUxfTlVNX1NUQV0KKyNkZWZpbmUgV0xBTkhBTF9GQ19UWF9CRF9IRUFERVJfU0laRSAgICAgICAgICAgICAgICBzaXplb2YodEhhbEZjVHhCZCkKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfRkMoIF9wdkJESGVhZGVyICkgICAgICAgICAgICAgICAgICAgICAgKCgodHBIYWxGY1J4QmQpX3B2QkRIZWFkZXIpLT5mYykKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfUlhfVElNRV9TVEFNUCggX3B2QkRIZWFkZXIgKSAgICAgICAgICAgKCgodHBIYWxGY1J4QmQpX3B2QkRIZWFkZXIpLT5tY2xrUnhUaW1lc3RhbXApCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX1NUQV9WQUxJRF9NQVNLKCBfcHZCREhlYWRlciApICAgICAgICAgICgoKHRwSGFsRmNSeEJkKV9wdkJESGVhZGVyKS0+ZmNTVEFWYWxpZE1hc2spCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX1NUQV9QU19TVEFURSggX3B2QkRIZWFkZXIgKSAgICAgICAgICAgICgoKHRwSGFsRmNSeEJkKV9wdkJESGVhZGVyKS0+ZmNTVEFQd3JTYXZlU3RhdGVNYXNrKQorI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9TVEFfVEhfSU5EKCBfcHZCREhlYWRlciApICAgICAgICAgICAgICAoKCh0cEhhbEZjUnhCZClfcHZCREhlYWRlciktPmZjU1RBVGhyZXNoSW5kTWFzaykKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfU1RBX1RYUV9TVEFUVVMoIF9wdkJESGVhZGVyICkgICAgICAgICAgKCgodHBIYWxGY1J4QmQpX3B2QkRIZWFkZXIpLT5mY1NUQVR4UVN0YXR1cykKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfU1RBX1RYUV9MRU4oIF9wdkJESGVhZGVyLCBzdGFJZHggKSAgICAgKCgodHBIYWxGY1J4QmQpX3B2QkRIZWFkZXIpLT5mY1NUQVR4UUxlbltzdGFJZHhdKQorI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9TVEFfQ1VSX1RYX1JBVEUoIF9wdkJESGVhZGVyLCBzdGFJZHggKSAoKCh0cEhhbEZjUnhCZClfcHZCREhlYWRlciktPmZjU1RBQ3VyVHhSYXRlW3N0YUlkeF0pCisKKyNkZWZpbmUgV0xBTkhBTF9UWF9CRF9HRVRfUk1GKF9wdkJESGVhZGVyKSAgICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5ybWYpCisKKyNkZWZpbmUgV0xBTkhBTF9UWF9CRF9HRVRfVUIoX3B2QkRIZWFkZXIpICAgICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT51YikKKworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9STUYoX3B2QkRIZWFkZXIpICAgICAgICAgICgoKHRwSGFsUnhCZClfcHZCREhlYWRlciktPnJtZikKKworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9VQihfcHZCREhlYWRlcikgICAgICAgICAgICgoKHRwSGFsUnhCZClfcHZCREhlYWRlciktPnViKQorCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX1JBVEVJTkRFWChfcHZCREhlYWRlcikgICAgKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+cmF0ZUluZGV4KQorCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX1RJTUVTVEFNUChfcHZCREhlYWRlcikgICAgKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+bWNsa1J4VGltZXN0YW1wKQorCisjZGVmaW5lIHRIYWxGY1J4QmQgICAgICAgaGFsRmNSeEJkX3R5cGUgICAgICAgICAgICAgCisjZGVmaW5lIHRwSGFsRmNSeEJkICAgICAgcGhhbEZjUnhCZF90eXBlCisjZGVmaW5lIHRIYWxGY1R4QmQgICAgICAgaGFsRmNUeEJkX3R5cGUKKyNkZWZpbmUgdHBIYWxGY1R4QmQgICAgICBwSGFsRmNUeEJkX3R5cGUgICAgICAgICAgICAgIAorI2RlZmluZSB0SGFsRmNUeFBhcmFtcyAgIHRGY1R4UGFyYW1zX3R5cGUKKyNkZWZpbmUgdEhhbEZjUnhQYXJhbXMgICB0RmNSeFBhcmFtc190eXBlICAgICAgICAgICAgICAgCisjZGVmaW5lIHRwSGFsRmNUeFBhcmFtcyAgcEZjVHhQYXJhbXNfdHlwZSAgICAgICAgICAgICAgIAorI2RlZmluZSB0cEhhbEZjUnhQYXJhbXMgIHBGY1J4UGFyYW1zX3R5cGUgICAgICAgICAgICAgCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0gUlNTSSBhbmQgU05SIEluZm9ybWF0aW9uIGV4dHJhY3Rpb24gLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX1JTU0kwKCBfcHZCREhlYWRlciApICBcCisgICAgKCgoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5waHlTdGF0czApID4+IDI0KSAmIDB4ZmYpCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX1JTU0kxKCBfcHZCREhlYWRlciApICBcCisgICAgKCgoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5waHlTdGF0czApID4+IDE2KSAmIDB4ZmYpCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX1JTU0kyKCBfcHZCREhlYWRlciApICBcCisgICAgKCgoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5waHlTdGF0czApID4+IDApICYgMHhmZikKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfUlNTSTMoIF9wdkJESGVhZGVyICkgIFwKKyAgICAoKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+cGh5U3RhdHMwKSAmIDB4ZmYpCisKKy8vIEdldCB0aGUgYXZlcmFnZSBvZiB0aGUgNCB2YWx1ZXMuCisjZGVmaW5lIFdMQU5IQUxfR0VUX1JTU0lfQVZFUkFHRSggX3B2QkRIZWFkZXIgKSBcCisgICAgKCgoV0xBTkhBTF9SWF9CRF9HRVRfUlNTSTAoX3B2QkRIZWFkZXIpKSArIFwKKyAgICAoV0xBTkhBTF9SWF9CRF9HRVRfUlNTSTEoX3B2QkRIZWFkZXIpKSArIFwKKyAgICAoV0xBTkhBTF9SWF9CRF9HRVRfUlNTSTIoX3B2QkRIZWFkZXIpKSArIFwKKyAgICAoV0xBTkhBTF9SWF9CRF9HRVRfUlNTSTMoX3B2QkRIZWFkZXIpKSkgLyA0KQorCisvLyBHZXQgdGhlIFNOUiB2YWx1ZSBmcm9tIFBIWSBTdGF0cworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9TTlIoIF9wdkJESGVhZGVyICkgICAgXAorICAgICgoKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+cGh5U3RhdHMxKSA+PiAyNCkgJiAweGZmKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX0RQVV9TSUcoIF9wdkJESGVhZGVyICkgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5kcHVTaWduYXR1cmUpCisKKworI2RlZmluZSBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0RBVEFfT0ZGU0VUKCBfYmQsIF9vZmYgKSAgICAgICAgKCgodHBIYWxUeEJkKV9iZCktPm1wZHVEYXRhT2Zmc2V0ID0gX29mZikKKyAKKyNkZWZpbmUgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9IRUFERVJfT0ZGU0VUKCBfYmQsIF9vZmYgKSAgICAoKCh0cEhhbFR4QmQpX2JkKS0+bXBkdUhlYWRlck9mZnNldCA9IF9vZmYpCisKKyNkZWZpbmUgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9IRUFERVJfTEVOKCBfYmQsIF9sZW4gKSAgICAgICAgKCgodHBIYWxUeEJkKV9iZCktPm1wZHVIZWFkZXJMZW5ndGggPSBfbGVuKQorCisjZGVmaW5lIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfTEVOKCBfYmQsIF9sZW4gKSAgICAgICAgICAgICAgICAoKCh0cEhhbFR4QmQpX2JkKS0+bXBkdUxlbmd0aCA9IF9sZW4pCisKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfQkFfT1BDT0RFKF9wdkJESGVhZGVyKSAgICAgICAgKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+cmVvcmRlck9wY29kZSkKKworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9CQV9GSShfcHZCREhlYWRlcikgICAgICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5yZW9yZGVyRndkSWR4KQorCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX0JBX1NJKF9wdkJESGVhZGVyKSAgICAgICAgICAgICgoKHRwSGFsUnhCZClfcHZCREhlYWRlciktPnJlb3JkZXJTbG90SWR4KQorCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX0JBX0NTTihfcHZCREhlYWRlcikgICAgICAgICAgICgoKHRwSGFsUnhCZClfcHZCREhlYWRlciktPmN1cnJlbnRQa3RTZXFObykKKworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9CQV9FU04oX3B2QkRIZWFkZXIpICAgICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5leHBlY3RlZFBrdFNlcU5vKQorCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfR0VUX1JYUF9GTEFHUyhfcHZCREhlYWRlcikgICAgICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT5yeHBGbGFncykKKworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0dFVF9UWVBFX1NVQlRZUEUoX3B2QkRIZWFkZXIpICAgICAgICAgICAgKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+ZnJhbWVUeXBlU3VidHlwZSkKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9TRVRfVFlQRV9TVUJUWVBFKCBfYmQsIF90eXBlU3VidHlwZSApICAgICAgICAoKCh0cEhhbFJ4QmQpX2JkKS0+ZnJhbWVUeXBlU3VidHlwZSA9IF90eXBlU3VidHlwZSkKKworI2lmZGVmICBXTEFOX0hBTF9WT0xBTlMgCisvKk1hY3JvcyB0byBleHRyYWN0IDQ4LWJpdCByZXBsYXkgY291bnRlciB3aGVuIHJlcGxheSBjaGVjayBpcyBkb25lIGF0IGhvc3QgaW4gdm9sYW5zKi8KKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzIwVE8yMyhfcHZCREhlYWRlcikgICAgICAoKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+cG1pQ21kNHRvMjNbNF0pKSAKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfVUNfQkMoIF9wdkJESGVhZGVyICkgICAgICAgICAgICAoKCh0cEhhbFJ4QmQpX3B2QkRIZWFkZXIpLT51YikKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzI0VE8yNShfcHZCREhlYWRlcikgICAgICAoKCgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+cG1pQ21kMjR0bzI1KSkKKyNlbmRpZgorCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfQVNGX1NFVCAgICAgICAgICAgICAgICAxIC8qVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCB3aGVuIHNldCBhbmQgcGt0IGlzIEFNU0RVKi8KKworI2RlZmluZSBXTEFOSEFMX1JYX0JEX0ZTRl9TRVQgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9MU0ZfU0VUICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdMQU5IQUxfUlhfQkRfQUVGX1NFVCAgICAgICAgICAgICAgIDEKKworIAorI2RlZmluZSBXTEFOSEFMX1JYX0JEX0xMQ19QUkVTRU5UICAgICAgICAgICAgMCAvKlRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgd2hlbiBMTEMgaXMgcHJlc2VudCovCisKKyNkZWZpbmUgV0xBTkhBTF9SWF9CRF9GVF9ET05FICAgICAgICAgICAgICAgICAgMSAvKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIHdoZW4gZnJhbWUgeHRsIHdhcyBkb25lKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MgCisvL0NoZWNrIHdoZXRoZXIgYSBSWCBmcmFtZSBpcyB1bnByb3RlY3RlZCBvdmVyIHRoZSBhaXIKKyNpZiBkZWZpbmVkKExJQlJBX1dBUElfU1VQUE9SVCkKKyNkZWZpbmUgV0xBTkhBTF9SWF9JU19VTlBST1RFQ1RFRF9XUElfRlJBTUUoX3B2QkRIZWFkZXIpICBcCisgICAgICAgICgoKHRwSGFsUnhCZClfcHZCREhlYWRlciktPnVlZikKKworI2Vsc2UKKyNkZWZpbmUgV0xBTkhBTF9SWF9JU19VTlBST1RFQ1RFRF9XUElfRlJBTUUoX3B2QkRIZWFkZXIpICBcCisgICAgICAgIChEUFVfRkVFREJBQ0tfV1BJX1VOUFJPVEVDVEVEID09ICgodHBIYWxSeEJkKV9wdkJESGVhZGVyKS0+ZHB1RmVlZGJhY2spCisjZW5kaWYKKyNlbHNlCisvKkRQVV9GRUVEQkFDS19XUElfVU5QUk9URUNURUQgbWFjcm8gZGVmaW5lZCBpbiB2b2xhbnNkZWZzLmggd2hpY2ggaXMgbm90IGF2YWlsYWJsZQorICBmb3IgVU1BQyBpbiBwcmltYSBzbyBkZWNsYXJlZCBpdCBoZXJlICovCisjZGVmaW5lIERQVV9GRUVEQkFDS19XUElfVU5QUk9URUNURUQgMHgyMCAgIAorI2RlZmluZSBXTEFOSEFMX1JYX0lTX1VOUFJPVEVDVEVEX1dQSV9GUkFNRShfcHZCREhlYWRlcikgIFwKKyAgICAgICAgKERQVV9GRUVEQkFDS19XUElfVU5QUk9URUNURUQgPT0gKChXRElfUnhCZFR5cGUgKilfcHZCREhlYWRlciktPmRwdUZlZWRiYWNrKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBGVU5DVElPTiAgICBXTEFOSEFMX1J4QkRfR2V0RnJhbWVUeXBlU3ViVHlwZQorCisgIERFU0NSSVBUSU9OIAorICAgIENhbGxlZCBieSBUTCB0byByZXRyaWV2ZSB0aGUgdHlwZS9zdWJ0eXBlIG9mIHRoZSByZWNlaXZlZCBmcmFtZS4KKworICBERVBFTkRFTkNJRVMgCisgICAgVEwgc2hvdWxkIHBhc3MgYSB2YWxpZCBSeEJEIGJ1ZmZlciBwb2ludGVyLgorICAgIAorICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBwdkJESGVhZGVyOiAgICBWb2lkIHBvaW50ZXIgdG8gdGhlIFJ4QkQgYnVmZmVyLgorICAgIHVzRnJtQ3RybDp0aGUgZnJhbWUgY3RybCBvZiB0aGUgODAyLjExIGhlYWRlciAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBBIGJ5dGUgd2hpY2ggY29udGFpbnMgYm90aCB0eXBlIGFuZCBzdWJ0eXBlIGluZm8uIExTQiBmb3VyIGJ5dGVzIChiMCB0byBiMykKKyAgICBpcyBzdWJ0eXBlIGFuZCBiNS1iNiBpcyB0eXBlIGluZm8uIAorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordEFOSV9VOCBXTEFOSEFMX1J4QkRfR2V0RnJhbWVUeXBlU3ViVHlwZSh2X1BWT0lEX3QgX3B2QkRIZWFkZXIsIHRBTklfVTE2IHVzRnJtQ3RybCk7CisKKworI2RlZmluZSBIQUxfVFhDT01QX1JFUVVFU1RFRF9NQVNLICAgICAgICAgICAweDEgIC8vYml0IDAgZm9yIFR4Q29tcCBpbnRyIHJlcXVlc3RlZC4gCisjZGVmaW5lIEhBTF9VU0VfU0VMRl9TVEFfUkVRVUVTVEVEX01BU0sgICAgIDB4MiAgLy9iaXQgMSBmb3IgU1RBIG92ZXJ3cml0ZSB3aXRoIHNlbGZTdGEgUmVxdWVzdGVkLgorI2RlZmluZSBIQUxfVFhfTk9fRU5DUllQVElPTl9NQVNLICAgICAgICAgICAweDQgIC8vYml0IDIuIElmIHNldCwgdGhlIGZyYW1lIGlzIG5vdCB0byBiZSBlbmNyeXB0ZWQKKyNpZiBkZWZpbmVkKExJQlJBX1dBUElfU1VQUE9SVCkKKyNkZWZpbmUgSEFMX1dBUElfU1RBX01BU0sgICAgICAgICAgICAweDggIC8vYml0IDMuIElmIHNldCwgdGhpcyBmcmFtZSBpcyBmb3IgV0FQSSBzdGF0aW9uCisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9VQVBTRF9GV19UUkdfRlJBTUVTCisjZGVmaW5lIEhBTF9UUklHR0VSX0VOQUJMRURfQUNfTUFTSyAgICAgICAgIDB4MTAgLy9iaXQgNCBmb3IgZGF0YSBmcmFtZXMgYmVsb25naW5nIHRvIHRyaWdnZXIgZW5hYmxlZCBBQworI2VuZGlmCisjZGVmaW5lIEhBTF9VU0VfTk9fQUNLX1JFUVVFU1RFRF9NQVNLICAgICAgIDB4MjAKKworI2RlZmluZSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FIDB4NDAgLy8gQml0IDYgd2lsbCBiZSB1c2VkIHRvIGNvbnRyb2wgQkQgcmF0ZSBmb3IgTWFuYWdlbWVudCBmcmFtZXMKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEZVTkNUSU9OICAgIFdMQU5IQUxfRmlsbFR4QmQKKworICBERVNDUklQVElPTiAKKyAgICBDYWxsZWQgYnkgUEUgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzIGRlbGl2ZXJ5LiAKKworICBERVBFTkRFTkNJRVMgCisgICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4gCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHBBZGFwdGVyOiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgYWRhcHRlciBjb250ZXh0O2EgaGFuZGxlIHRvIFRMJ3MgCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0IAorICAgIHZvc0ZybUJ1ZjogICAgIHBvaW50ZXIgdG8gYSB2T1NTIGJ1ZmZlciBjb250YWluaW5nIHRoZSBtYW5hZ2VtZW50ICAKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQKKyAgICB1c0ZybUxlbjogICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQ7IGluZm9ybWF0aW9uIAorICAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluY2x1ZGVkIGluIHRoZSB2T1NTIGJ1ZmZlcgorICAgIHdGcm1UeXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgZnJhbWUgYmVpbmcgdHJhbnNtaXR0ZWQKKyAgICB0aWQ6ICAgICAgICAgICAgdGlkIHVzZWQgdG8gdHJhbnNtaXQgdGhpcyBmcmFtZQorICAgIHBmbkNvbXBUeEZ1bmM6ICBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSB0cmFuc21pdCBjb21wbGV0ZSByb3V0aW5lCisgICAgdm9vc0JESGVhZGVyOiAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgorICAgIHR4RmxhZzogIGNhbiBoYXZlIGFwcHJvcHJpYXRlIGJpdCBzZXR0aW5nIGFzIHJlcXVpcmVkCisgICAgCisgICAgICAgICAgICAgICAgI2RlZmluZSBIQUxfVFhDT01QX1JFUVVFU1RFRF9NQVNLICAgICAgICAgICAweDEgIC8vYml0IDAgZm9yIFR4Q29tcCBpbnRyIHJlcXVlc3RlZC4gCisgICAgICAgICAgICAgICAgI2RlZmluZSBIQUxfVVNFX1NFTEZfU1RBX1JFUVVFU1RFRF9NQVNLICAgIDB4MiAgLy9iaXQgMSBmb3IgU1RBIG92ZXJ3cml0ZSB3aXRoIHNlbGZTdGEgUmVxdWVzdGVkLgorICAgICAgICAgICAgICAgICNkZWZpbmUgSEFMX1RYX05PX0VOQ1JZUFRJT05fTUFTSyAgICAgICAgICAgMHg0ICAvL2JpdCAyLiBJZiBzZXQsIHRoZSBmcmFtZSBpcyBub3QgdG8gYmUgZW5jcnlwdGVkCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKyAgICAgICAgICAgICAgICAjZGVmaW5lIEhBTF9XQVBJX1NUQV9NQVNLICAgICAgICAgICAgMHg4ICAvL2JpdCAzLiBJZiBzZXQsIHRoaXMgZnJhbWUgaXMgZm9yIFdBUEkgc3RhdGlvbgorI2VuZGlmCisgICAgICAgICAgICAgICAgCisgICAgdVRpbWVzdGFtcDogICAgIHBrdCB0aW1lc3RhbXAKKworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTIFdMQU5IQUxfRmlsbFR4QmQodm9pZCAqcEFkYXB0b3IsIHRBTklfVTggdHlwZVN1YnR5cGUsIHZvaWQgKnBEZXN0TWFjQWRkciwgdm9pZCAqcEFkZHIyLAorICAgICAgICB0QU5JX1U4KiBwdGlkLCB0QU5JX1U4IGRpc2FibGVGcm1YdGwsIHZvaWQgKnBUeEJkLCB0QU5JX1U4IHR4RmxhZywgdEFOSV9VMzIgdGltZVN0YW1wKTsKKworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKK1ZPU19TVEFUVVMgV0xBTkhBTF9GaWxsRmNUeEJkKHZvaWQgKnBWb3NHQ3R4LCB2b2lkICpwRmNQYXJhbXMsIHZvaWQgKnBGY1R4QmQpOworLyoqIFRvIHN3YXAgdGhlIHJlcG9ydCBwYXJ0IG9mIEZDIFJ4QkQgKi8KK3ZvaWQgV0xBTkhBTF9Td2FwRmNSeEJkKHRBTklfVTggKnBCZCk7CisjZW5kaWYKKworLyogVG8gc3dhcCB0aGUgZGF0YSAqLwordm9pZCBXTEFOSEFMX1N3YXAzMkJ5dGVzKHRBTklfVTgqIHBEYXRhLCB0QU5JX1UzMiBzaXplKTsKKworLyoqIFRvIHN3YXAgdGhlIFJ4QkQgKi8KK3ZvaWQgV0xBTkhBTF9Td2FwUnhCZCh0QU5JX1U4ICpwQmQpOwordm9pZCBXTEFOSEFMX1J4QW1zZHVCZEZpeCh2b2lkICpwVm9zR0N0eCx2X1BWT0lEX3QgX3B2QkRIZWFkZXIpOworCisjaWZkZWYgV0xBTl9QRVJGCit0QU5JX1UzMiBXTEFOSEFMX1R4QmRGYXN0RndkKHZvaWQgKnBBZGFwdG9yLCB0QU5JX1U4ICpwRGVzdE1hYywgdEFOSV9VOCB0aWQsIHRBTklfVTggdW5pY2FzdERzdCwgIHZvaWQgKnBUeEJkLCB0QU5JX1UxNik7CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9VQVBTRF9GV19UUkdfRlJBTUVTCitWT1NfU1RBVFVTIFdMQU5IQUxfRW5hYmxlVWFwc2RBY1BhcmFtcyh2b2lkKiBwVm9zR0N0eCwgdEFOSV9VOCBzdGFJZHgsIHRVYXBzZEluZm8gKnBVYXBzZEluZm8pOworVk9TX1NUQVRVUyBXTEFOSEFMX0Rpc2FibGVVYXBzZEFjUGFyYW1zKHZvaWQqIHBWb3NHQ3R4LCB0QU5JX1U4IHN0YUlkeCwgdEFOSV9VOCBhYyk7CisjZW5kaWYKKworVk9TX1NUQVRVUyBXTEFOSEFMX0VuYWJsZUlkbGVCZFBkdUludGVycnVwdCh2b2lkKiBwVm9zR0N0eCwgdEFOSV9VOCBpZGxlQmRQZHVUaHJlc2hvbGQpOworCisjaWZkZWYgRkVBVFVSRV9PTl9DSElQX1JFT1JERVJJTkcKK3RBTklfVTggV0xBTkhBTF9Jc09uQ2hpcFJlb3JkZXJpbmdFbmFibGVkRm9yVElEKHZvaWQqIHBWb3NHQ3R4LCB0QU5JX1U4IHN0YUlkeCwgdEFOSV9VOCB0aWQpOworI2VuZGlmCisKKyNpZmRlZiBXTEFOX1NPRlRBUF9WU1RBX0ZFQVRVUkUKK3ZfQk9PTF90IFdMQU5IQUxfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUodl9QVk9JRF90IHBWb3NHQ3R4LCB0QU5JX1U4IHN0YUlkeCk7CisjZW5kaWYKKworI2RlZmluZSB0SGFsUnhCZCAgICBoYWxSeEJkX3R5cGUKKyNkZWZpbmUgdHBIYWxSeEJkICAgIHBoYWxSeEJkX3R5cGUKKworI2RlZmluZSB0SGFsVHhCZCAgICBoYWxUeEJkX3R5cGUKKyNkZWZpbmUgdHBIYWxUeEJkICAgIHBIYWxUeEJkX3R5cGUKKworI2lmZGVmIEJBX1BBUkFNX1NUUlVDVFVSRQorI2Vsc2UKKyNkZWZpbmUgQkFfUEFSQU1fU1RSVUNUVVJFCisvLworLy8gSEFMIC0tPiBUTAorLy8gTWVzc2FnZXMgaW5kaWNhdGluZyB0aGUgc2V0dXAgYW5kL29yIHRlYXJkb3duIG9mCisvLyBBLU1QRFUvQkEgc2Vzc2lvbnMgd2l0aCBhIGdpdmVuIHBlZXIgSFQgTUFDIGVudGl0eQorLy8KKworLy8KKy8vIEEgZGF0YSBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgYWxsIG9mIHRoZSB2YXJpYWJsZXMKKy8vIGluIGEgdHlwaWNhbCBBLU1QRFUvQkEgc2V0dXAKKy8vCit0eXBlZGVmIHN0cnVjdCBzQkFQYXJhbXMKK3sKKworICAvLyBBIHVuaXF1ZSBCQSBTZXNzaW9uIElEIHRoYXQgaGFzIGJlZW4gYXNzaWduZWQgYnkgSEFMCisgIC8vIGZvciB0aGUgY3VyZW50IEJBIFNlc3Npb24KKyAgdEFOSV9VMTYgYmFTZXNzaW9uSUQ7CisKKyAgLy8gVElEIGZvciB3aGljaCB0aGUgQkEgc2Vzc2lvbiBoYXMgYmVlbiBzZXR1cAorICB0QU5JX1U4IGJhVElEOworCisgIC8vIEJBIEJ1ZmZlciBTaXplIGFsbG9jYXRlZCBmb3IgdGhlIGN1cnJlbnQgQkEgc2Vzc2lvbiAgIC8vU2hvdWxkIGJlIGRlbGV0ZWQuIG5lZWRzIFRMIGNoYW5nZS4gdXNlIHdpblNpemUgaW5zdGVhZAorICB0QU5JX1U4IGJhQnVmZmVyU2l6ZTsKKworICB0QU5JX1UxNiBTU047CisgIHRBTklfVTggd2luU2l6ZTsKKyAgdEFOSV9VOCBTVEFJRDsKKworfSB0QkFQYXJhbXMsICp0cEJBUGFyYW1zOworCisvLworLy8gVEwgLT4gSEFMCisvLyB0U2lyTXNnUS50eXBlID0gU0lSX0hBTF9IRERfQUREQkFfUlNQCisvLwordHlwZWRlZiBzdHJ1Y3Qgc0FkZEJBUnNwCit7CisgIC8vIE1lc3NhZ2UgVHlwZQorICB0QU5JX1UxNiBtZXNnVHlwZTsKKworICAvLyBNZXNzYWdlIExlbmd0aAorICB0QU5JX1UxNiBtZXNnTGVuOworCisgIC8vQkEgc2Vzc2lvbiBJRAorICB0QU5JX1UxNiBiYVNlc3Npb25JRDsKKworICB0QU5JX1UxNiByZXBseVdpblNpemU7Cit9dEFkZEJBUnNwLCAqdHBBZGRCQVJzcDsKKworLy8KKy8vIEhBTCAtPiBUTAorLy8gdFNpck1zZ1EudHlwZSA9IFNJUl9IQUxfQUREQkFfSU5ECisvLyB0U2lyTXNnUS5yZXNlcnZlZCA9IDAKKy8vIHRTaXJNc2dRLmJvZHkgPSAiYWxsb2NhdGVkIiBpbnN0YW5jZSBvZiB0cEFkZEJBSW5kCisvLwordHlwZWRlZiBzdHJ1Y3Qgc0FkZEJBSW5kCit7CisKKyAgLy8gTWVzc2FnZSBUeXBlCisgIHRBTklfVTE2IG1lc2dUeXBlOworCisgIC8vIE1lc3NhZ2UgTGVuZ3RoCisgIHRBTklfVTE2IG1lc2dMZW47CisKKyAgdEJBUGFyYW1zIGJhU2Vzc2lvbjsKKworfSB0QWRkQkFJbmQsICp0cEFkZEJBSW5kOworCisvLworLy8gSEFMIC0+IFRMCisvLyB0U2lyTXNnUS50eXBlID0gU0lSX0hBTF9ERUxCQV9JTkQKKy8vIHRTaXJNc2dRLnJlc2VydmVkID0gMAorLy8gdFNpck1zZ1EuYm9keSA9ICJhbGxvY2F0ZWQiIGluc3RhbmNlIG9mIHRwRGVsQkFJbmQKKy8vCisvLyBUTCAtPiBIQUwKKy8vIHRTaXJNc2dRLnR5cGUgPSBTSVJfSEFMX0JBX0ZBSUxfSU5ECisvLyB0U2lyTXNnUS5yZXNlcnZlZCA9IDAKKy8vIHRTaXJNc2dRLmJvZHkgPSAiYWxsb2NhdGVkIiBpbnN0YW5jZSBvZiB0cERlbEJBSW5kCisvLwordHlwZWRlZiBzdHJ1Y3Qgc0RlbEJBSW5kCit7CisgIHRBTklfVTggc3RhSWR4OworCisgIHRBTklfVTggYmFUSUQ7CisgIC8vIE1lc3NhZ2UgVHlwZQorICB0QU5JX1UxNiBtZXNnVHlwZTsKKworICAvLyBNZXNzYWdlIExlbmd0aAorICB0QU5JX1UxNiBtZXNnTGVuOworCit9IHREZWxCQUluZCwgKnRwRGVsQkFJbmQ7CisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICBUTCA8LT4gSEFMIHN0cnVjdHVyZXMgCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLworLy8gVEwgLT4gSEFMIAorLy8gdFNpck1zZ1EudHlwZSA9IFNJUl9IQUxfVExfRkxVU0hfQUNfUkVRCisvLwordHlwZWRlZiBzdHJ1Y3Qgc0ZsdXNoQUNSZXEKK3sKKyAgICAvLyBNZXNzYWdlIFR5cGUKKyAgICB0QU5JX1UxNiBtZXNnVHlwZTsKKworICAgIC8vIE1lc3NhZ2UgTGVuZ3RoCisgICAgdEFOSV9VMTYgbWVzZ0xlbjsKKworICAgIC8vIFN0YXRpb24gSW5kZXguIG9yaWdpbmF0ZXMgZnJvbSBIQUwKKyAgICB0QU5JX1U4ICB1Y1NUQUlkOworCisgICAgLy8gVElEIGZvciB3aGljaCB0aGUgdHJhbnNtaXQgcXVldWUgaXMgYmVpbmcgZmx1c2hlZCAKKyAgICB0QU5JX1U4ICAgdWNUaWQ7CisKK30gdEZsdXNoQUNSZXEsICp0cEZsdXNoQUNSZXE7CisKKy8vCisvLworLy8gSEFMIC0+IFRMIAorLy8gdFNpck1zZ1EudHlwZSA9IFNJUl9IQUxfVExfRkxVU0hfQUNfUlNQCisvLwordHlwZWRlZiBzdHJ1Y3Qgc0ZsdXNoQUNSc3AKK3sKKyAgICAvLyBNZXNzYWdlIFR5cGUKKyAgICB0QU5JX1UxNiBtZXNnVHlwZTsKKworICAgIC8vIE1lc3NhZ2UgTGVuZ3RoCisgICAgdEFOSV9VMTYgbWVzZ0xlbjsKKworICAgIC8vIFN0YXRpb24gSW5kZXguIG9yaWdpbmF0ZXMgZnJvbSBIQUwKKyAgICB0QU5JX1U4ICB1Y1NUQUlkOworCisgICAgLy8gVElEIGZvciB3aGljaCB0aGUgdHJhbnNtaXQgcXVldWUgaXMgYmVpbmcgZmx1c2hlZCAKKyAgICB0QU5JX1U4ICAgdWNUaWQ7CisKKyAgICAvLyBzdGF0dXMgb2YgdGhlIEZsdXNoIG9wZXJhdGlvbiAKKyAgICB0QU5JX1U4IHN0YXR1czsKK30gdEZsdXNoQUNSc3AsICp0cEZsdXNoQUNSc3A7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9DT1JFL1dEQS9pbmMvd2xhbl9xY3Rfd2RhLmggYi9DT1JFL1dEQS9pbmMvd2xhbl9xY3Rfd2RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwZmE1OQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RBL2luYy93bGFuX3FjdF93ZGEuaApAQCAtMCwwICsxLDIwMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFdMQU5fUUNUX1dEQV9ICisjZGVmaW5lIFdMQU5fUUNUX1dEQV9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgIFcgTCBBIE4gICBERVZJQ0UgQURBUFRBVElPTiAgIEwgQSBZIEUgUiAKKyAgICAgICAgICAgICAgICAgICAgICAgRSBYIFQgRSBSIE4gQSBMICBBIFAgSQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIAorREVTQ1JJUFRJT04KKyAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBleHRlcm5hbCBBUEkgZXhwb3NlZCBieSB0aGUgd2xhbiBhZGFwdGF0aW9uIGxheWVyIGZvciBQcmltYQorICBhbmQgVm9sYW5zLgorCisgIEZvciBWb2xhbnMgdGhpcyBsYXllciBpcyBhY3R1YWxseSBhIHRoaW4gbGF5ZXIgdGhhdCBtYXBzIGFsbCBXREEgbWVzc2FnZXMgYW5kCisgIGZ1bmN0aW9ucyB0byBlcXVpdmFsZW50IEhBTCBtZXNzYWdlcyBhbmQgZnVuY3Rpb25zLiBUaGUgcmVhc29uIHRoaXMgbGF5ZXIgd2FzIGludHJvZHVjZWQKKyAgd2FzIHRvIGtlZXAgdGhlIFVNQUMgaWRlbnRpY2FsIGFjcm9zcyBQcmltYSBhbmQgVm9sYW5zLiBUaGlzIGxheWVyIHByb3ZpZGVzIHRoZSBnbHVlIAorICBiZXR3ZWVuIFNNRSwgUEUgLCBUTCBhbmQgSEFMLgorICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKK3doZW4gICAgICAgIHdobyAgICAgICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgICAtLS0gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxMC8wNS8yMDExICBoYXBhcm5hICAgICBBZGRpbmcgc3VwcG9ydCBmb3IgS2VlcCBBbGl2ZSBGZWF0dXJlCiswMS8yNy8yMDExICBybmFpciAgICAgICBBZGRpbmcgV0RBIHN1cHBvcnQgZm9yIFZvbGFucy4KKzEyLzA4LzIwMTAgIHNlb2t5b3VuICAgIE1vdmUgZG93biBIQUwgaW50ZXJmYWNlcyBmcm9tIFRMIHRvIFdEQQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFVNQUMgY29udmVyZ2VuY2UgYnR3ZWVuIFZvbGFucy9MaWJyYSBhbmQgUHJpbWEKKzA4LzI1LzIwMTAgIGFkd2l2ZWRpICAgIFdEQSBDb250ZXh0IGFuZCBleHBvc2VkIEFQSSdzIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpbmNsdWRlICJhbmlHbG9iYWwuaCIKKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisKKyMgIGluY2x1ZGUgIndsYW5fcWN0X3dkaV9kcy5oIgorCisjZWxzZSAKKworIyAgaW5jbHVkZSAic2lyUGFyYW1zLmgiCisjICBpbmNsdWRlICJsaW1HbG9iYWwuaCIgCisjICBpbmNsdWRlICJoYWxUeXBlcy5oIgorIyAgaW5jbHVkZSAid2xhbl9xY3RfYmFsLmgiCisjICBpbmNsdWRlICJ3bGFuX3FjdF9oYWwuaCIgCisvKiBUaGlzIGhlYWRlciBpcyBmb3IgQUREIGFuZCByZW1vdmUgQkEgc2Vzc2lvbiAqLworIyAgaW5jbHVkZSAiaGFsQ29tbW9uQXBpLmgiCisKKyNlbmRpZgorCisvKiBBZGQgSW5jbHVkZSAqLworCit0eXBlZGVmIGVudW0KK3sKKyAgIFdEQV9JTklUX1NUQVRFLAorICAgV0RBX1NUQVJUX1NUQVRFLAorICAgV0RBX1JFQURZX1NUQVRFLAorICAgV0RBX1BSRV9BU1NPQ19TVEFURSwKKyAgIFdEQV9CQV9VUERBVEVfVExfU1RBVEUsCisgICBXREFfQkFfVVBEQVRFX0xJTV9TVEFURSwKKyAgIFdEQV9TVE9QX1NUQVRFLAorICAgV0RBX0NMT1NFX1NUQVRFCit9V0RBX3N0YXRlOworCit0eXBlZGVmIGVudW0KK3sKKyAgIFdEQV9QUk9DRVNTX1NFVF9MSU5LX1NUQVRFLAorICAgV0RBX0lHTk9SRV9TRVRfTElOS19TVEFURQorfVdEQV9wcm9jZXNzU2V0TGlua1N0YXRlU3RhdHVzOworCit0eXBlZGVmIGVudW0KK3sKKyAgIFdEQV9ESVNBQkxFX0JBLAorICAgV0RBX0VOQUJMRV9CQQorfVdEQV9CYUVuYWJsZUZsYWdzOworCit0eXBlZGVmIGVudW0KK3sKKyAgIFdEQV9JTlZBTElEX1NUQV9JTkRFWCwKKyAgIFdEQV9WQUxJRF9TVEFfSU5ERVgKK31XREFfVmFsaWRTdGFJbmRleDsKKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MgKQorI2lmICFkZWZpbmVkKCBWT1NfTVFfSURfV0RBICkKKyNkZWZpbmUgVk9TX01RX0lEX1dEQSBWT1NfTVFfSURfSEFMCisjZW5kaWYKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBVdGlsaXRpZXMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgV0RBX1RMSV9DRUlMKCBfYSwgX2IpICAoKCAwICE9IChfYSklKF9iKSk/IChfYSkvKF9iKSArIDE6IChfYSkvKF9iKSkKKworLyoKKyAqIENoZWNrIHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgZmluZCBpZiBNQ0MgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb3Igbm90CisgKi8KKyNkZWZpbmUgSVNfTUNDX1NVUFBPUlRFRCAoV0RBX0lzV2Nuc3NXbGFuUmVwb3J0ZWRWZXJzaW9uR3JlYXRlclRoYW5PckVxdWFsKCAwLCAxLCAxLCAwKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEZWZpbml0aW9ucyBmb3IgRGF0YSBwYXRoIEFQSXMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qQXMgcGVyIDgwMi4xMSBzcGVjICovCisjZGVmaW5lIFdEQV9UTElfTUdNVF9GUkFNRV9UWVBFICAgICAgIDB4MDAKKyNkZWZpbmUgV0RBX1RMSV9DVFJMX0ZSQU1FX1RZUEUgICAgICAgMHgxMAorI2RlZmluZSBXREFfVExJX0RBVEFfRlJBTUVfVFlQRSAgICAgICAweDIwCisKKy8qODAyLjMgaGVhZGVyIGRlZmluaXRpb25zKi8KKyNkZWZpbmUgIFdEQV9UTElfODAyXzNfSEVBREVSX0xFTiAgICAgICAgICAgICAxNAorLyo4MDIuMTEgaGVhZGVyIGRlZmluaXRpb25zIC0gaGVhZGVyIGxlbiB3aXRob3V0IFFPUyBjdHJsIGZpZWxkKi8KKyNkZWZpbmUgIFdEQV9UTElfODAyXzExX0hFQURFUl9MRU4gICAgICAgICAgICAyNAorCisvKkRldGVybWluZXMgdGhlIGhlYWRlciBsZW4gYmFzZWQgb24gdGhlIGRpc2FibGUgeHRsIGZpZWxkKi8KKyNkZWZpbmUgV0RBX1RMSV9NQUNfSEVBREVSX0xFTiggX2R4dGwpICAgICAgICAgICAgICAgIFwKKyAgICAgICggKCAwID09IF9keHRsICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIFdEQV9UTElfODAyXzNfSEVBREVSX0xFTjpXREFfVExJXzgwMl8xMV9IRUFERVJfTEVOICkKKworLyogVFggY2hhbm5lbCBlbnVtIHR5cGU6CisgICAgICAKKyAgIFdlIGhhdmUgZml2ZSB0eXBlcyBvZiBUWCBwYWNrZXRzIHNvIGZhciBhbmQgd2FudCB0byBibG9jay91bmJsb2NrIGVhY2ggCisgICB0cmFmZmljIGluZGl2aWR1YWxseSBhY2NvcmRpbmcgdG8sICBmb3IgZXhhbXBsZSwgbG93IHJlc291Y2UgY29uZGl0aW9uLiAKKyAgIERlZmluZSBmaXZlIFRYIGNoYW5uZWxzIGZvciBVTUFDIGhlcmUuIFdEQSBjYW4gbWFwIHRoZXNlIGxvZ2ljYWwKKyAgIGNoYW5uZWxzIHRvIHBoeXNpY2FsIERYRSBjaGFubmVscyBpZiBuZWVkZWQuCisqLwordHlwZWRlZiBlbnVtCit7CisgICBXREFfVFhGTE9XX0FDX0JLID0gMCwKKyAgIFdEQV9UWEZMT1dfQUNfQkUgPSAxLAorICAgV0RBX1RYRkxPV19BQ19WSSA9IDIsCisgICBXREFfVFhGTE9XX0FDX1ZPID0gMywKKyAgIFdEQV9UWEZMT1dfTUdNVCAgPSA0LAorICAgV0RBX1RYRkxPV19CQVAgICA9IDEsIC8qIEJBUCBpcyBzZW50IGFzIEJFICovCisgICBXREFfVFhGTE9XX0ZDICAgID0gMSwgLyogRkMgaXMgc2VudCBhcyBCRSAgKi8KKyAgIFdEQV9UWEZMT1dfTUFYCit9IFdEQV9UWEZsb3dFbnVtVHlwZTsKKworI2RlZmluZSBXREFfVFhGTE9XTUFTSyAgMHgxRiAvKiAxfjRiaXQ6bG93IHByaW9yaXR5IGNoIC8gNWJpdDogaGlnaCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIExpYnJhIGFuZCBWb2xhbnMgc3BlY2lmaWNzCisKKyAgIFRPRE8gQ29uc2lkZXIgcmVmYWN0b3JpbmcgaXQgYW5kIHB1dCBpdCBpbnRvIHR3byBzZXBhcmF0ZSBoZWFkZXJzLCAKKyAgIG9uZSBmb3IgUHJpbWEgYW5kIG9uZSBmb3IgVm9sYW5zIAorCisgICBmZXR1cml6ZWQgd2l0aCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgZm9yIFByaW1hCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5IHdpdGggU0RJTy4gSXQncyBCQUwgaGVhZGVyIHNpemUgZm9yIFNESU8KKyAgIGludGVyZmFjZS4gSXQncyBub3RoaW5nIGZvciBpbnRlZ3JhdGVkIFNPQyAqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjZGVmaW5lIFdEQV9EWEVfSEVBREVSX1NJWkUgICAwCisjZWxzZSAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKyNkZWZpbmUgV0RBX0RYRV9IRUFERVJfU0laRSAgIFdMQU5fQkFMX0RYRV9IRUFERVJfU0laRQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyNlbHNlIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworLypMaWJyYSBQRFUgc2l6ZSovCisjZGVmaW5lIFdEQV9UTElfUERVX1JFU19TSVpFICAgICAgICAgICAgICAgICAxMjQKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworLypNaW5pbXVtIHJlc291cmNlcyBuZWVkZWQgLSBhcmJpdHJhcnkqLworCisvKkRYRSArIFNEKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorI2RlZmluZSBXREFfV0xBTl9MSUJSQV9IRUFERVJfTEVOICAgICAgICAgICAgICAyMCs4CisjZWxzZSAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKyNkZWZpbmUgV0xBTl9MSUJSQV9IRUFERVJfTEVOICAgICAgICAgICAgICAyMCs4CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorI2RlZmluZSBXREFfVExJX0JEX1BEVV9SRVNFUlZFX1RIUkVTSE9MRCAgICAxMAorI2Vsc2UgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisjZGVmaW5lIFdEQV9UTElfQkRfUERVX1JFU0VSVkVfVEhSRVNIT0xEICAgIDE1MAorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9UTElfTUlOX1JFU19NRiAgIDEKKyMgIGRlZmluZSBXREFfVExJX01JTl9SRVNfQkFQICAyCisjICBkZWZpbmUgV0RBX1RMSV9NSU5fUkVTX0RBVEEgMworI2Vsc2UKKyMgIGRlZmluZSBXREFfVExJX01JTl9SRVNfTUYgICAxMyAvKktlZXBpbmcgZm9yIE1GKi8KKyMgIGRlZmluZSBXREFfVExJX01JTl9SRVNfQkFQICBXREFfVExJX01JTl9SRVNfTUYgICsgMTMgLypBbm90aGVyIGZvciBCQVAqLworIyAgZGVmaW5lIFdEQV9UTElfTUlOX1JFU19EQVRBIFdEQV9UTElfTUlOX1JFU19CQVAgKyAxMyAvKk1pbiAxMiBmb3IgZGF0YSovCisjICBkZWZpbmUgV0xBTlRMX1RIX1JFU19EQVRBICAgICAgICAgICAgICAgICAgICAgICAgMjU0CisjZW5kaWYKKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX05VTV9TVEEgOAorI2Vsc2UKKyMgIGRlZmluZSBXREFfTlVNX1NUQSBIQUxfTlVNX1NUQQorI2VuZGlmCisKKy8qIEZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5IHdpdGggU0RJTy4KKyAKKyAgIEZvciBTRElPIGludGVyZmFjZSwgY2FsY3VsYXRlIHRoZSBUWCBmcmFtZSBsZW5ndGggYW5kIG51bWJlciBvZiBQRFUKKyAgIHRvIHRyYW5zZnRlciB0aGUgZnJhbWUuCisKKyAgIF92b3NCdWZmOiAgIElOICAgVk9TIHBha2NldCBidWZmZXIgcG9pbnRlcgorICAgX3VzUGt0TGVuOiAgT1VUICBWT1MgcGFja2V0IGxlbmd0aCBpbiBieXRlcworICAgX3VSZXNMZW46ICAgT1VUICBOdW1iZXIgb2YgUERVIHRvIGhvbGQgdGhpcyBWT1MgcGFja2V0CisgICBfdVRvdGFsUGt0TGVuOiBPVVQgVG90b2FsIHBhY2tldCBsZW5ndGggaW5jbHVkaW5nIEJBTCBoZWFkZXIgc2l6ZQorCisgICBGb3IgaW50ZWdyYXRlZCBTT0MsIF91c1BrdExlbiBhbmQgX3VUb3RhbFBrdExlbiBpcyBWT1MgcGFrY2V0IGxlbmd0aAorICAgd2hpY2ggZG9lcyBpbmNsdWRlIEJEIGhlYWRlciBsZW5ndGguIF91UmVzTGVuIGlzIGhhcmRjb2RlZCAyLgorICovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKworI2lmZGVmIFdJTkRPV1NfRFQKKyNkZWZpbmUgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggX3Zvc0J1ZmYsIF91c1BrdExlbiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3VSZXNMZW4sIF91VG90YWxQa3RMZW4pIFwKKyAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfdXNQa3RMZW4gPSB3cGFsUGFja2V0R2V0RnJhZ0NvdW50KCh3cHRfcGFja2V0Kilfdm9zQnVmZikgKyAxLypCRCovO1wKKyAgICBfdVJlc0xlbiAgPSBfdXNQa3RMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfdVRvdGFsUGt0TGVuID0gX3VzUGt0TGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd2hpbGUgKCAwICkKKyNlbHNlIC8qIFdJTkRPV1NfRFQgKi8KKyNkZWZpbmUgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggX3Zvc0J1ZmYsIF91c1BrdExlbiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3VSZXNMZW4sIF91VG90YWxQa3RMZW4pIFwKKyAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfdXNQa3RMZW4gPSAyOyAgLyogTmVlZCAxIGRlc2NyaXB0b3IgcGVyIGEgcGFja2V0ICsgcGFja2V0Ki8gICAgIFwKKyAgICBfdVJlc0xlbiAgPSAyOyAgLyogQXNzdW1lIHRoYXQgd2Ugc3BlbmRzIHR3byBEWEUgZGVzY3JpcHRvciAqLyAgIFwKKyAgICBfdVRvdGFsUGt0TGVuID0gX3VzUGt0TGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd2hpbGUgKCAwICkKKyNlbmRpZiAvKiBXSU5ET1dTX0RUICovCisKKyNlbHNlIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisjZGVmaW5lIFdMQU5UTF9QRFVfUkVTX1NJWkUgICAgICAgICAgICAgICAgIDEyNCAvKkxpYnJhIFBEVSBzaXplKi8KKyNkZWZpbmUgV0xBTl9MSUJSQV9CRF9IRUFERVJfTEVOICAgICAgICAgICAgMTI4IC8qVGhlIGxlbmdodCBvZiB0aGUgdHggQkQgaGVhZGVyKi8KKworLypNaW5pbXVtIHJlc291cmNlcyBuZWVkZWQgLSBhcmJpdHJhcnkqLworCisvKkRYRSArIFNEKi8KKyNkZWZpbmUgV0xBTl9MSUJSQV9IRUFERVJfTEVOICAgICAgICAgICAgICAyMCs4CisKKyNkZWZpbmUgV0xBTlRMX01BWF9NU0RVICAgICAgICAgICAgICAgICAgICAxNTM4CisKKyNkZWZpbmUgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggX3Zvc0J1ZmYsIF91c1BrdExlbiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3VSZXNMZW4sIF91VG90YWxQa3RMZW4pIFwKKyAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCBfdm9zQnVmZiwgJl91c1BrdExlbiApOyAgICAgICAgICAgICAgIFwKKyAgICBfdVJlc0xlbiA9IFdEQV9UTElfQ0VJTCggKF91c1BrdExlbiAtIFdMQU5fTElCUkFfQkRfSEVBREVSX0xFTiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUERVX1JFU19TSVpFICkgKyAxLypUaGUgQkQqLzsgIFwKKyAgICBfdVRvdGFsUGt0TGVuID0gX3VzUGt0TGVuICsgV0xBTl9CQUxfRFhFX0hFQURFUl9TSVpFOyAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd2hpbGUgKCAwICkKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE1lc3NhZ2UgRGVmaW5pdGlvbnMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRYIFRyYW5taXQgcmVxdWVzdCBtZXNzYWdlLiBJdCBzZXJpYWxpemVzIFRYIHJlcXVlc3QgdG8gVFggdGhyZWFkLgorICAgVGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkIGluIFRMLgorKi8KKyNkZWZpbmUgV0RBX0RTX1RYX1NUQVJUX1hNSVQgIFdMQU5UTF9UWF9TVEFSVF9YTUlUCisjZGVmaW5lIFdEQV9EU19GSU5JU0hfVUxBICAgICBXTEFOVExfRklOSVNIX1VMQQorCisKKyNkZWZpbmUgV0RBX1RYX1BBQ0tFVF9GUkVFRCAgICAgIDBYMAorCisvKiBBcHByb3hpbWF0ZSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBXREEgdG8gc3RvcCBXREkgKi8KKyNkZWZpbmUgV0RBX1NUT1BfVElNRU9VVCAoV0RJX1JFU1BPTlNFX1RJTUVPVVQgKyBXRElfU0VUX1BPV0VSX1NUQVRFX1RJTUVPVVQgKyA1KQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBGdW5jdGlvbnMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZvciBkYXRhIGNsaWVudCAqLwordHlwZWRlZiBWT1NfU1RBVFVTICgqV0RBX0RTX1R4Q29tcGxldGVDYWxsYmFjaykgKCB2X1BWT0lEX3QgcENvbnRleHQsIHZvc19wa3RfdCAqcEZyYW1lRGF0YUJ1ZmYsIFZPU19TVEFUVVMgdHhTdGF0dXMgKTsKK3R5cGVkZWYgVk9TX1NUQVRVUyAoKldEQV9EU19SeFBhY2tldENhbGxiYWNrKSAgICggdl9QVk9JRF90IHBDb250ZXh0LCB2b3NfcGt0X3QgKnBGcmFtZURhdGFCdWZmICk7Cit0eXBlZGVmIHZfVTMyX3QgICAoKldEQV9EU19UeFBhY2tldENhbGxiYWNrKSAgICggdl9QVk9JRF90IHBDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF90ICoqcHBGcmFtZURhdGFCdWZmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VMzJfdCB1U2l6ZSwgCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VOF90IHVGbG93TWFzaywgCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9CT09MX3QgKnBiVXJnZW50ICk7Cit0eXBlZGVmIFZPU19TVEFUVVMgKCpXREFfRFNfUmVzb3VyY2VDQikgICAgICAoIHZfUFZPSURfdCBwQ29udGV4dCwgdl9VMzJfdCB1Q291bnQgKTsKKworCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKy8qIEZvciBtYW5hZ2VtZW50IGNsaWVudCAqLwordHlwZWRlZiBWT1NfU1RBVFVTICgqV0RBX0RTX1R4Q29tcGxldGVDYikoIHZfUFZPSURfdCAgICAgcENvbnRleHQsIHdwdF9wYWNrZXQgKnBGcmFtZSApOwordHlwZWRlZiBWT1NfU1RBVFVTICgqV0RBX0RTX1J4Q29tcGxldGVDYikoIHZfUFZPSURfdCBwQ29udGV4dCwgd3B0X3BhY2tldCAqcEZyYW1lICk7Cit0eXBlZGVmIFZPU19TVEFUVVMgKCpXREFfRFNfVHhGbG93Q29udHJvbENiKSggdl9QVk9JRF90IHBDb250ZXh0LCB2X1U4X3QgYWNNYXNrICk7Cit0eXBlZGVmIHZvaWQgKCpwV0RBVHhSeENvbXBGdW5jKSggdl9QVk9JRF90IHBDb250ZXh0LCB2b2lkICpwRGF0YSApOworCisvL2NhbGxiYWNrIGZ1bmN0aW9uIGZvciBUWCBjb21wbGV0ZQorLy9wYXJhbWV0ZXIgMSAtIGdsb2JhbCBwTWFjIHBvaW50ZXIKKy8vcGFyYW1ldGVyIDIgLSB0eENvbXBsZXRlIHN0YXR1cyA6IDEtIHN1Y2Nlc3MsIDAgLSBmYWlsdXJlLgordHlwZWRlZiBlSGFsU3RhdHVzICgqcFdEQUFja0ZuVHhDb21wKSh0cEFuaVNpckdsb2JhbCwgdEFOSV9VMzIpOworCit0eXBlZGVmIHN0cnVjdAoreworICAgdEFOSV9VMTYgdWNWYWxpZFN0YUluZGV4IDsKKyAgIC8qIAorICAgICogZWFjaCBiaXQgaW4gdWNVc2VCYUJpdG1hcCByZXByZXNlbnQgQkEgaXMgZW5hYmxlZCBvciBub3QgZm9yIHRoaXMgdGlkIAorICAgICogdGlkMCAuLmJpdDAsIHRpZDEuLmJpdDEgYW5kIHNvIG9uLi4KKyAgICAqLworICAgdEFOSV9VOCAgICB1Y1VzZUJhQml0bWFwIDsKKyAgIHRBTklfVTggICAgYnNzSWR4OworICAgdEFOSV9VMzIgICBmcmFtZXNUeGVkW1NUQUNGR19NQVhfVENdOworfXRXZGFTdGFJbmZvLCAqdHBXZGFTdGFJbmZvIDsKKworLyogZ3JvdXAgYWxsIHRoZSBXREEgdGltZXJzIGludG8gdGhpcyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAvKiBCQSBhY3Rpdml0eSBjaGVjayB0aW1lciAqLworICAgVFhfVElNRVIgYmFBY3Rpdml0eUNoa1RtciA7CisKKyAgIC8qIFR4IENvbXBsZXRlIFRpbWVvdXQgdGltZXIgKi8KKyAgIFRYX1RJTUVSIFR4Q29tcGxldGVUaW1lciA7Cit9dFdkYVRpbWVycyA7CisKKyNkZWZpbmUgV0RBX01BWF9TVEEgICAgKDE2KQorCit0eXBlZGVmIHN0cnVjdAoreworICAgdl9QVk9JRF90ICAgICAgICAgICAgcFZvc0NvbnRleHQ7ICAgICAgICAgICAgIC8qIGdsb2JhbCBWT1NTIGNvbnRleHQqLworICAgdl9QVk9JRF90ICAgICAgICAgICAgcFdkaUNvbnRleHQ7ICAgICAgICAgICAgIC8qIFdESSBjb250ZXh0ICovCisgICBXREFfc3RhdGUgICAgICAgICAgICB3ZGFTdGF0ZSA7ICAgICAgICAgICAgICAgLyogV0RBIHN0YXRlIHRyYWNraW5nICovIAorICAgdl9QVk9JRF90ICAgICAgICAgICAgd2RhTXNnUGFyYW0gOyAgICAgICAgICAgIC8qIFBFIHBhcmFtZXRlciB0cmFja2luZyAqLworICAgdl9QVk9JRF90ICAgICAgICAgICAgd2RhV2RpQXBpTXNnUGFyYW0gOyAgICAgIC8qIFdESSBBUEkgcGFyYW10ZXIgdHJhY2tpbmcgKi8KKyAgIHZfUFZPSURfdCAgICAgICAgICAgIHdkYVdkaUNmZ0FwaU1zZ1BhcmFtIDsgICAvKiBXREkgQVBJIHBhcmFtdGVyIHRyYWNraW5nICovCisgICB2b3NfZXZlbnRfdCAgICAgICAgICB3ZGFXZGlFdmVudDsgICAgICAgICAgICAgLyogV0RJIEFQSSBzeW5jIGV2ZW50ICovCisKKyAgIC8qIEV2ZW50IHRvIHdhaXQgZm9yIHR4IGNvbXBsZXRpb24gKi8KKyAgIHZvc19ldmVudF90ICAgICAgICAgIHR4RnJhbWVFdmVudDsKKworICAgLyogY2FsbCBiYWNrIGZ1bmN0aW9uIGZvciB0eCBjb21wbGV0ZSovCisgICBwV0RBVHhSeENvbXBGdW5jICAgICBwVHhDYkZ1bmM7CisgICAvKiBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHR4IHBhY2tldCBhY2sgKi8KKyAgIHBXREFBY2tGblR4Q29tcCAgICAgIHBBY2tUeENiRnVuYzsgICAKKyAgIHRBTklfVTMyICAgICAgICAgICAgIGZyYW1lVHJhbnNSZXF1aXJlZDsKKyAgIHRTaXJNYWNBZGRyICAgICAgICAgIG1hY0JTU0lEOyAgICAgICAgICAgICAvKkJTU0lEIG9mIHRoZSBuZXR3b3JrICovCisgICB0U2lyTWFjQWRkciAgICAgICAgICBtYWNTVEFTZWxmOyAgICAgLypTZWxmIFNUQSBNQUMqLworCisgICAvKiBUWCBjaGFubmVsIG1hc2sgZm9yIGZsb3cgY29udHJvbCAqLworICAgdl9VOF90ICAgICAgICAgICAgICAgdVR4Rmxvd01hc2s7CisgICAvKiBUTCdzIFRYIHJlc291cmNlIGNhbGxiYWNrICAgICAgICAqLworICAgV0RBX0RTX1Jlc291cmNlQ0IgICAgcGZuVHhSZXNvdXJjZUNCOworICAgLyogVEwncyBUWCBjb21wbGV0ZSBjYWxsYmFjayAgICAgKi8KKyAgIFdEQV9EU19UeENvbXBsZXRlQ2FsbGJhY2sgcGZuVHhDb21wbGV0ZUNhbGxiYWNrOyAKKyAgIAorICAgdFdkYVN0YUluZm8gICAgICAgICAgd2RhU3RhSW5mb1tXREFfTUFYX1NUQV07CisKKyAgIHRBTklfVTggICAgICAgICAgICAgIHdkYU1heFN0YTsKKyAgIHRXZGFUaW1lcnMgICAgICAgICAgIHdkYVRpbWVyczsKKworICAgLyogU1RBLCBBUCwgSUJTUywgTVVMVEktQlNTIGV0Yy4qLworICAgdEJzc1N5c3RlbVJvbGUgICAgICAgd2RhR2xvYmFsU3lzdGVtUm9sZTsgCisKKyAgIC8qIGRyaXZlciBtb2RlLCBQUk9EVUNUSU9OIG9yIEZUTSAqLworICAgdERyaXZlclR5cGUgICAgICAgICAgZHJpdmVyTW9kZTsKKworI2lmZGVmIEFOSV9NQU5GX0RJQUcKKyAgIC8qIEZUTSBDb21tYW5kIFJlcXVlc3QgdHJhY2tpbmcgKi8KKyAgIHZfUFZPSURfdCAgICAgICAgICAgIHdkYUZUTUNtZFJlcTsKKyNlbmRpZiAvKiBBTklfTUFORl9ESUFHICovCisKKyAgIC8qIEV2ZW50IHRvIHdhaXQgZm9yIHN1c3BlbmQgZGF0YSB0eCovCisgICB2b3NfZXZlbnRfdCAgICAgICAgICBzdXNwZW5kRGF0YVR4RXZlbnQ7CisgICAvKiBTdGF0dXMgZnJtIFRMIGFmdGVyIHN1c3BlbmQvcmVzdW1lIFR4ICovCisgICB0QU5JX1U4ICAgIHR4U3RhdHVzOworICAgLyogRmxhZyBzZXQgdG8gdHJ1ZSB3aGVuIFRMIHN1c3BlbmQgdGltZXNvdXQuKi8KKyAgIHRBTklfVTggICAgdHhTdXNwZW5kVGltZWRPdXQ7ICAgCisKKyAgIHZvc19ldmVudF90ICAgICAgICAgIHdhaXRPbldkaUluZGljYXRpb25DYWxsQmFjazsKKworICAgLyogdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgdFNpclZlcnNpb25UeXBlICAgICAgd2Nuc3NXbGFuQ29tcGlsZWRWZXJzaW9uOworICAgdFNpclZlcnNpb25UeXBlICAgICAgd2Nuc3NXbGFuUmVwb3J0ZWRWZXJzaW9uOworICAgdFNpclZlcnNpb25TdHJpbmcgICAgd2Nuc3NTb2Z0d2FyZVZlcnNpb25TdHJpbmc7CisgICB0U2lyVmVyc2lvblN0cmluZyAgICB3Y25zc0hhcmR3YXJlVmVyc2lvblN0cmluZzsKKworICAgCisgICB0U2lyTGlua1N0YXRlICAgICAgICBsaW5rU3RhdGU7CisgICAvKiBzZXQsIHdoZW4gQlQgQU1QIHNlc3Npb24gaXMgZ29pbmcgb24gKi8KKyAgIHZfQk9PTF90ICAgICAgICAgICAgIHdkYUFtcFNlc3Npb25PbjsKKyAgIHZfVTMyX3QgICAgICAgICAgICAgIFZvc1BhY2tldFRvRnJlZTsKK30gdFdEQV9DYkNvbnRleHQgOyAKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZfUFZPSURfdCAgICAgICAgICAgIHBXZGFDb250ZXh0OyAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIFdEQSBjb250ZXh0Ki8KKyAgIHZfUFZPSURfdCAgICAgICAgICAgIHdkYU1zZ1BhcmFtOyAgICAgICAgICAgIC8qIFBFIHBhcmFtZXRlciB0cmFja2luZyAqLworICAgdl9QVk9JRF90ICAgICAgICAgICAgd2RhV2RpQXBpTXNnUGFyYW07ICAgICAgLyogV0RJIEFQSSBwYXJhbXRlciB0cmFja2luZyAqLworfSB0V0RBX1JlcVBhcmFtczsgCisKKy8qCisgKiBGVU5DVElPTjogV0RBX29wZW4KKyAqIG9wZW4gV0RBIGNvbnRleHQKKyAqLyAKKworVk9TX1NUQVRVUyBXREFfb3Blbih2X1BWT0lEX3QgcFZvc0NvbnRleHQsIHZfUFZPSURfdCBwT1NDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TWFjT3BlblBhcmFtZXRlcnMgKnBNYWNQYXJhbXMgKSA7CisKKy8qCisgKiBGVU5DVElPTjogV0RBX3ByZVN0YXJ0CisgKiBUcmlnZ2VyIERBTC1BTCB0byBzdGFydCBDRkcgZG93bmxvYWQgCisgKi8gCitWT1NfU1RBVFVTIFdEQV9zdGFydCh2X1BWT0lEX3QgcFZvc0NvbnRleHQpIDsKKworVk9TX1NUQVRVUyBXREFfTlZEb3dubG9hZF9TdGFydCh2X1BWT0lEX3QgcFZvc0NvbnRleHQpOworCisvKgorICogRlVOQ1RJT046IFdEQV9wcmVTdGFydAorICogVHJpZ2dlciBXREEgdG8gc3RhcnQgQ0ZHIGRvd25sb2FkIAorICovIAorVk9TX1NUQVRVUyBXREFfcHJlU3RhcnQodl9QVk9JRF90IHBWb3NDb250ZXh0KSA7CisvKgorICogRlVOQ1RJT046IFdEQV9zdG9wCisgKiBzdG9wIFdEQQorICovCitWT1NfU1RBVFVTIFdEQV9zdG9wKHZfUFZPSURfdCBwVm9zQ29udGV4dCx0QU5JX1U4IHJlYXNvbik7CisKKy8qCisgKiBGVU5DVElPTjogV0RBX2Nsb3NlCisgKiBjbG9zZSBXREEgY29udGV4dAorICovCitWT1NfU1RBVFVTIFdEQV9jbG9zZSh2X1BWT0lEX3QgcFZvc0NvbnRleHQpOworLyoKKyAqIEZVTkNUSU9OOiBXREFfc2h1dGRvd24KKyAqIFNodXRkb3duIHdpbGwgbm90IGNsb3NlIHRoZSBjb250cm9sIHRyYW5zcG9ydCwgYWRkZWQgYnkgU1NSCisgKi8KK1ZPU19TVEFUVVMgV0RBX3NodXRkb3duKHZfUFZPSURfdCBwVm9zQ29udGV4dCwgd3B0X2Jvb2xlYW4gY2xvc2VUcmFuc3BvcnQpOworCisvKgorICogRlVOQ1RJT046IFdEQV9NY1Byb2Nlc3NNc2cKKyAqIERBTC1BTCBtZXNzYWdlIHByb2Nlc3NpbmcgZW50cnkgZnVuY3Rpb24gCisgKi8gCisKK1ZPU19TVEFUVVMgV0RBX01jUHJvY2Vzc01zZyggdl9DT05URVhUX3QgcFZvc0NvbnRleHQsIHZvc19tc2dfdCAqcE1zZyApIDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdEQSBkYXRhIHBhdGggQVBJJ3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZVTkNUSU9OOiBXREFfTWdtdERTUmVnaXN0ZXIKKyAqIFNlbmQgTWVzc2FnZSBiYWNrIHRvIFBFCisgKi8gCisKK1ZPU19TVEFUVVMgV0RBX01nbXREU1JlZ2lzdGVyKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEQV9EU19UeENvbXBsZXRlQ2IgV0RBX1R4Q29tcGxldGVDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEQV9EU19SeENvbXBsZXRlQ2IgV0RBX1J4Q29tcGxldGVDYWxsYmFjaywgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RBX0RTX1R4Rmxvd0NvbnRyb2xDYiBXREFfVHhGbG93Q3RybENhbGxiYWNrIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDsKKy8qCisgKiBGVU5DVElPTjogV0RBX01nbXREU1R4UGFja2V0CisgKiBGb3J3YXJkIFRYIG1hbmFnZW1lbnQgZnJhbWUgdG8gV0RJCisgKi8gCisKK1ZPU19TVEFUVVMgV0RBX1R4UGFja2V0KHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBGcm1CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiBmcm1MZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRnJhbWVUeXBlIGZybVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRnJhbWVUeERpciB0eERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdEQVR4UnhDb21wRnVuYyBwQ29tcEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXREFBY2tGblR4Q29tcCBwQWNrVHhDb21wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggdHhGbGFnKTsKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUG9zdE1zZ0FwaQorICogQVBJIGZwciBQRSB0byBwb3N0IE1lc3NhZ2UgdG8gV0RBCisgKi8KK1ZPU19TVEFUVVMgV0RBX1Bvc3RNc2dBcGkodHBBbmlTaXJHbG9iYWwgcE1hYywgdFNpck1zZ1EgKnBNc2cpIDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGVU5DVElPTjogIHdkYUdldEdsb2JhbFN5c3RlbVJvbGUoKQorICoKKyAqIEdldCB0aGUgZ2xvYmFsIEhBTCBzeXN0ZW0gcm9sZS4gCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordEJzc1N5c3RlbVJvbGUgd2RhR2V0R2xvYmFsU3lzdGVtUm9sZSh0cEFuaVNpckdsb2JhbCBwTWFjKTsKKworLyogbWF4aW11bSB3YWl0IHRpbWUgZm9yIFdEQSBjb21wbGV0ZSBldmVudCAoY29ycmVjdCB2YWx1ZSBoYXMgdG8gYmUgZGVyaXZlZCkgCisgKiBmb3Igbm93IGdpdmluZyB0aGUgdmFsdWUgMTAwMCBtcyAqLworI2RlZmluZSBXREFfV0RJX0NPTVBMRVRJT05fVElNRV9PVVQgMzAwMDAgLyogaW4gbXMgKi8KKworI2RlZmluZSBXREFfVExfVFhfRlJBTUVfVElNRU9VVCAgMTAwMDAgIC8qIGluIG1zZWMgYSB2ZXJ5IGhpZ2ggdXBwZXIgbGltaXQgb2YgNSwwMDAgbXNlYyAqLworI2RlZmluZSBXREFfVExfU1VTUEVORF9USU1FT1VUICAgMjAwMCAgLyogaW4gbXMgdW5pdCAqLworCisvKlRhZyB1c2VkIGJ5IFdEQSB0byBtYXJrIGEgdGltZWQgb3V0IGZyYW1lKi8KKyNkZWZpbmUgV0RBX1RMX1RYX01HTVRfVElNRURfT1VUICAgMHhERUFEIAorCisjZGVmaW5lIFdEQV9UTF9UWF9TVVNQRU5EX1NVQ0NFU1MgICAwCisjZGVmaW5lIFdEQV9UTF9UWF9TVVNQRU5EX0ZBSUxVUkUgICAxCisKKy8vIEZJWE1FIFRlbXBvcmFyeSB2YWx1ZSBmb3IgUjMzRCBpbnRlZ2FyYXRpb24KKy8vI2RlZmluZSBXREFfVExfVFhfRlJBTUVfVElNRU9VVCAgMjAwMDAgLyogaW4gbXNlYyBhIHZlcnkgaGlnaCB1cHBlciBsaW1pdCAqLworCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DICkKKyNpZiAhZGVmaW5lZCggd2RhR2V0R2xvYmFsU3lzdGVtUm9sZSApCisjZGVmaW5lIHdkYUdldEdsb2JhbFN5c3RlbVJvbGUgaGFsR2V0R2xvYmFsU3lzdGVtUm9sZQorI2VuZGlmCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgCisgICBSWCBNZXRhIGluZm8gYWNjZXNzIGZvciBJbnRlZ3JhdGVkIFNPQworICAgUlggQkQgaGVhZGVyIGFjY2VzcyBmb3IgTk9OIEludGVncmF0ZWQgU09DCisKKyAgICAgIFRoZXNlIE1BQ1JPIGFyZSBmb3IgUlggZnJhbWVzIHRoYXQgYXJlIG9uIGZsYXQgYnVmZmVycworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFdEQV9HRVRfUlhfTUFDX0hFQURFUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfTUFDX0hFQURFUihwUnhNZXRhKSAgXAorICAgICAgKHRwU2lyTWFjTWdtdEhkcikoICgoV0RJX0RTX1J4TWV0YUluZm9UeXBlICopKHBSeE1ldGEpKS0+bXBkdUhlYWRlclB0ciApCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfTUFDX0hFQURFUihiZEhkKSBTSVJfTUFDX0JEX1RPX01QRFVIRUFERVIoYmRIZCkgCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9NUERVSEVBREVSM0EgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfTVBEVUhFQURFUjNBKHBSeE1ldGEpIFwKKyAgICh0cFNpck1hY0RhdGFIZHIzYSkoICgoV0RJX0RTX1J4TWV0YUluZm9UeXBlICopKHBSeE1ldGEpKS0+bXBkdUhlYWRlclB0ciApCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfTVBEVUhFQURFUjNBKGJkSGQpICAgIFNJUl9NQUNfQkRfVE9fTVBEVUhFQURFUjNBKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfTVBEVV9IRUFERVJfTEVOKHBSeE1ldGEpICAgXAorICAgICAgICAgICAgICAgICAgICAoICgoV0RJX0RTX1J4TWV0YUluZm9UeXBlICopKHBSeE1ldGEpKS0+bXBkdUhlYWRlckxlbmd0aCApCisjZWxzZSAKKyMgIGRlZmluZSBXREFfR0VUX1JYX01QRFVfSEVBREVSX0xFTihiZEhkKSAgIFdMQU5IQUxfUlhfQkRfR0VUX01QRFVfSF9MRU4oYmRIZCkKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX01QRFVfTEVOICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9NUERVX0xFTihwUnhNZXRhKSAgXAorICAgICAgICAgICAgICAgKCAoKFdESV9EU19SeE1ldGFJbmZvVHlwZSAqKShwUnhNZXRhKSktPm1wZHVMZW5ndGggKQorI2Vsc2UgCisjICBkZWZpbmUgV0RBX0dFVF9SWF9NUERVX0xFTihiZEhkKSBXTEFOSEFMX1JYX0JEX0dFVF9NUERVX0xFTihiZEhkKQorI2VuZGlmCisKKy8qIFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfUEFZTE9BRF9MRU4ocFJ4TWV0YSkgICBcCisgICAgICAgKCBXREFfR0VUX1JYX01QRFVfTEVOKHBSeE1ldGEpIC0gV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4ocFJ4TWV0YSkgKQorI2Vsc2UKKyMgIGRlZmluZSBXREFfR0VUX1JYX1BBWUxPQURfTEVOKGJkSGQpIFNJUl9NQUNfQkRfVE9fUEFZTE9BRF9MRU4oYmRIZCkKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX01BQ19SQVRFX0lEWCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfR0VUX1JYX01BQ19SQVRFX0lEWChwUnhNZXRhKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoV0RJX0RTX1J4TWV0YUluZm9UeXBlICopKHBSeE1ldGEpKS0+cmF0ZUluZGV4ICkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9NQUNfUkFURV9JRFgoYmRIZCkgICAgIFNJUl9NQUNfQkRfVE9fUkFURV9JTkRFWChiZEhkKQorI2VuZGlmCisKKy8qIFdEQV9HRVRfUlhfTVBEVV9EQVRBICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfTVBEVV9EQVRBKHBSeE1ldGEpICBcCisgICAgICAgICAgICAgICAgICAgKCAoKFdESV9EU19SeE1ldGFJbmZvVHlwZSAqKShwUnhNZXRhKSktPm1wZHVEYXRhUHRyICkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9NUERVX0RBVEEoYmRIZCkgU0lSX01BQ19CRF9UT19NUERVREFUQShiZEhkKQorI2VuZGlmCisKKy8qIFdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIEZvciBJbnRlZ3JhdGVkIFNPQzogV2hlbiBVTUFDIHJlY2VpdmUgdGhlIHBhY2tldC4gQkQgaXMgYWxyZWFkeSBzdHJpcHBlZCBvZmYuCisvLyAgICAgICAgICAgICAgICAgICAgIERhdGEgb2Zmc2V0IGlzIHRoZSBNUERVIGhlYWRlciBsZW5ndGgKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChwUnhNZXRhKSAgV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4ocFJ4TWV0YSkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKGJkSGQpIFwKKyAgICAgICAgICAgICAgICBXTEFOSEFMX1JYX0JEX0dFVF9NUERVX0RfT0ZGU0VUKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gRm9yIEludGVncmF0ZWQgU09DOiBXZSBVTUFDIHJlY2VpdmUgdGhlIGZyYW1lLCAKKy8vICAgICAgICAgICAgICAgICAgICAgQkQgaXMgZ29uZSBhbmQgTUFDIGhlYWRlciBhdCBvZmZzZXQgMAorI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQocFJ4TWV0YSkgICAwCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKGJkSGQpIFdMQU5IQUxfUlhfQkRfR0VUX01QRFVfSF9PRkZTRVQoYmRIZCkKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX1VOS05PV05fVUNBU1QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfR0VUX1JYX1VOS05PV05fVUNBU1QocFJ4TWV0YSkgICBcCisgICAgICAgICAgICAgICAgICAgICAoICgoV0RJX0RTX1J4TWV0YUluZm9UeXBlICopKHBSeE1ldGEpKS0+dW5rbm93blVjYXN0UGt0ICkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9VTktOT1dOX1VDQVNUKGJkSGQpIFNJUl9NQUNfQkRfSVNfVU5LTk9XTl9VQ0FTVF9GUkFNRShiZEhkKQorI2VuZGlmCisKKy8qIFdEQV9HRVRfUlhfVElEICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfVElEKHBSeE1ldGEpICggKChXRElfRFNfUnhNZXRhSW5mb1R5cGUgKikocFJ4TWV0YSkpLT50aWQgKQorI2Vsc2UKKyMgIGRlZmluZSBXREFfR0VUX1JYX1RJRChiZEhkKSBXTEFOSEFMX1JYX0JEX0dFVF9USUQoYmRIZCkKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX1NUQUlEICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfR0VUX1JYX1NUQUlEKHBSeE1ldGEpICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+c3RhSWQpCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfU1RBSUQoYmRIZCkgICAgV0xBTkhBTF9SWF9CRF9HRVRfU1RBX0lEKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9BRERSM19JRFggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9BRERSM19JRFgocFJ4TWV0YSkgKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5hZGRyM0lkeCkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9BRERSM19JRFgoYmRIZCkgICAgV0xBTkhBTF9SWF9CRF9HRVRfQUREUjNfSURYKGJkSGQpIAorI2VuZGlmCisKKy8qIFdEQV9HRVRfUlhfQ0ggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfQ0gocFJ4TWV0YSkgKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5yeENoYW5uZWwpCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfQ0goYmRIZCkgU0lSX01BQ19CRF9UT19SWF9DSEFOTkVMKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9EUFVTSUcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9EUFVTSUcocFJ4TWV0YSkgICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+ZHB1U2lnKQorI2Vsc2UKKyMgIGRlZmluZSBXREFfR0VUX1JYX0RQVVNJRyhiZEhkKSAgICAgV0xBTkhBTF9SWF9CRF9HRVRfRFBVX1NJRyhiZEhkKQorI2VuZGlmCisKKy8qIFdEQV9JU19SWF9CQ0FTVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9JU19SWF9CQ0FTVChwUnhNZXRhKSAgIFwKKyAgICAgICggKDEgPT0gKChXRElfRFNfUnhNZXRhSW5mb1R5cGUqKShwUnhNZXRhKSktPmJjYXN0KSA/IFZPU19UUlVFIDogVk9TX0ZBTFNFICkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0lTX1JYX0JDQVNUKGJkSGQpICAgXAorICAgICAgKCAoIDB4RkYgPT0gV0xBTkhBTF9SWF9CRF9HRVRfQUREUjFfSURYKGJkSGQpKSA/IFZPU19UUlVFIDogVk9TX0ZBTFNFICkKKyNlbmRpZgorICAgIAorLyogV0RBX0dFVF9SWF9GVF9ET05FICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9GVF9ET05FKHBSeE1ldGEpICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+ZnQpCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfRlRfRE9ORShiZEhkKSAgICBXTEFOSEFMX1JYX0JEX0dFVF9GVChiZEhkKQorI2VuZGlmCisKKy8qIFdEQV9HRVRfUlhfRFBVX0ZFRURCQUNLICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9EUFVfRkVFREJBQ0socFJ4TWV0YSkgXAorICAgICAgICAgICAgICAgICAgICAgICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+ZHB1RmVlZGJhY2spCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9BU0YgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9BU0YocFJ4TWV0YSkgKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5hbXNkdV9hc2YpCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfQVNGKGJkSGQpICAgICBXTEFOSEFMX1JYX0JEX0dFVF9BU0YoYmRIZCkKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX0FFRiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfR0VUX1JYX0FFRihwUnhNZXRhKSAoKChXRElfRFNfUnhNZXRhSW5mb1R5cGUqKShwUnhNZXRhKSktPmFtc2R1X2FlZikKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9BRUYoYmRIZCkgICAgV0xBTkhBTF9SWF9CRF9HRVRfQUVGKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9FU0YgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9FU0YocFJ4TWV0YSkgICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+YW1zZHVfZXNmKQorI2Vsc2UKKyMgIGRlZmluZSBXREFfR0VUX1JYX0VTRihiZEhkKSAgICAgV0xBTkhBTF9SWF9CRF9HRVRfRVNGKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9CRUFDT05fU0VOVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9CRUFDT05fU0VOVChwUnhNZXRhKSBcCisgICAgICAgICAgICAgICAgICAgICAoKChXRElfRFNfUnhNZXRhSW5mb1R5cGUqKShwUnhNZXRhKSktPmJzZikKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9CRUFDT05fU0VOVChiZEhkKSBTSVJfTUFDX0JEX1RPX0lCU1NfQkNOX1NFTlQoYmRIZCkKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX1RTRl9MQVRFUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfVFNGX0xBVEVSKHBSeE1ldGEpICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+cnRzZikKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9UU0ZfTEFURVIoYmRIZCkgU0lSX01BQ19CRF9UT19JQlNTX1RTRl9MQVRFUihiZEhkKQorI2VuZGlmCisKKy8qIFdEQV9HRVRfUlhfVFlQRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfVFlQRShwUnhNZXRhKSAoKChXRElfRFNfUnhNZXRhSW5mb1R5cGUqKShwUnhNZXRhKSktPnR5cGUpCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfVFlQRShiZEhkKSBcCisgICAgICAgICAgICAoICggV0xBTkhBTF9SWF9CRF9HRVRfVFlQRV9TVUJUWVBFKGJkSGQpICYgMHgzMCApID4+IDQgKSAKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX1NVQlRZUEUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfR0VUX1JYX1NVQlRZUEUocFJ4TWV0YSkgKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5zdWJ0eXBlKQorI2Vsc2UKKyMgIGRlZmluZSBXREFfR0VUX1JYX1NVQlRZUEUoYmRIZCkgKCBXTEFOSEFMX1JYX0JEX0dFVF9UWVBFX1NVQlRZUEUoYmRIZCkgJiAweDBGICkKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX1RZUEVfU1VCVFlQRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9UWVBFX1NVQlRZUEUocFJ4TWV0YSkgIFwKKyAgICAgICAgICAgICAgICAgKChXREFfR0VUX1JYX1RZUEUocFJ4TWV0YSk8PDQpfFdEQV9HRVRfUlhfU1VCVFlQRShwUnhNZXRhKSkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9UWVBFX1NVQlRZUEUoYmRIZCkgV0xBTkhBTF9SWF9CRF9HRVRfVFlQRV9TVUJUWVBFKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9SRU9SREVSX09QQ09ERSA6IEZvciBNU0RVIHJlb3JkZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfUkVPUkRFUl9PUENPREUocFJ4TWV0YSkgXAorICAgICAgICAgICAoKChXRElfRFNfUnhNZXRhSW5mb1R5cGUqKShwUnhNZXRhKSktPmFtcGR1X3Jlb3JkZXJPcGNvZGUpCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfUkVPUkRFUl9PUENPREUoYmRIZCkgV0xBTkhBTF9SWF9CRF9HRVRfQkFfT1BDT0RFKGJkSGQpIAorI2VuZGlmCisKKy8qIFdEQV9HRVRfUlhfUkVPUkRFUl9TTE9UX0lEWCA6IEZvciBNU0RVIHJlb3JkZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfUkVPUkRFUl9TTE9UX0lEWChwUnhNZXRhKSBcCisgICAgICAgICAgICAgICAgKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5hbXBkdV9yZW9yZGVyU2xvdElkeCkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9SRU9SREVSX1NMT1RfSURYKGJkSGQpIFdMQU5IQUxfUlhfQkRfR0VUX0JBX1NJKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9SRU9SREVSX0ZXRF9JRFggOiBGb3IgTVNEVSByZW9yZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9SRU9SREVSX0ZXRF9JRFgocFJ4TWV0YSkgIFwKKyAgICAgICAgICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+YW1wZHVfcmVvcmRlckZ3ZElkeCkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9SRU9SREVSX0ZXRF9JRFgoYmRIZCkgV0xBTkhBTF9SWF9CRF9HRVRfQkFfRkkoYmRIZCkKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX1JFT1JERVJfQ1VSX1BLVF9TRVFfTk8gOiBGcm8gTVNEVSByZW9yZGVyICoqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfR0VUX1JYX1JFT1JERVJfQ1VSX1BLVF9TRVFfTk8ocFJ4TWV0YSkgIFwKKyAgICAgICAgICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+Y3VycmVudFBrdFNlcU5vKQorI2Vsc2UKKyMgIGRlZmluZSBXREFfR0VUX1JYX1JFT1JERVJfQ1VSX1BLVF9TRVFfTk8oYmRIZCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkhBTF9SWF9CRF9HRVRfQkFfQ1NOKGJkSGQpIAorI2VuZGlmCisKKy8qIFdEQV9JU19SWF9MTENfUFJFU0VOVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9JU19SWF9MTENfUFJFU0VOVChwUnhNZXRhKSAgICBcCisgICAgICAoICgwID09ICgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5sbGNyKSA/IFZPU19UUlVFIDogVk9TX0ZBTFNFICkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0lTX1JYX0xMQ19QUkVTRU5UKGJkSGQpICAgICAgIFwKKyAgICAgICAgICAgKCAoMCA9PSAodl9VOF90KVdMQU5IQUxfUlhfQkRfR0VUX0xMQyhiZEhkKSApID8gVk9TX1RSVUUgOiBWT1NfRkFMU0UgKQorI2VuZGlmCisKKyNkZWZpbmUgV0xBTldEQV9IT19JU19BTl9BTVBEVSAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdMQU5XREFfSE9fTEFTVF9NUERVX09GX0FNUERVICAgICAgICAgICAgIDB4NDAwCisKKy8qIFdEQV9JU19SWF9BTl9BTVBEVSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9JU19SWF9BTl9BTVBEVShwUnhNZXRhKSAgICAgICBcCisgICAoICgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5yeHBGbGFncyAmIFdMQU5XREFfSE9fSVNfQU5fQU1QRFUgKQorI2Vsc2UKKyMgIGRlZmluZSBXREFfSVNfUlhfQU5fQU1QRFUoYmRIZCkgICBXTEFOX0hBTF9JU19BTl9BTVBEVShiZEhkKSAKKyNlbmRpZgorCisvKiBXREFfSVNfUlhfTEFTVF9NUERVICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfSVNfUlhfTEFTVF9NUERVKHBSeE1ldGEpICAgICAgXAorICAgKCAoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+cnhwRmxhZ3MgJiBXTEFOV0RBX0hPX0xBU1RfTVBEVV9PRl9BTVBEVSApIAorI2Vsc2UKKyMgIGRlZmluZSBXREFfSVNfUlhfTEFTVF9NUERVKGJkSGQpICAgICAgICAgV0xBTl9IQUxfSVNfTEFTVF9NUERVKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9USU1FU1RBTVAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfR0VUX1JYX1RJTUVTVEFNUChwUnhNZXRhKSAoKChXRElfRFNfUnhNZXRhSW5mb1R5cGUqKShwUnhNZXRhKSktPm1jbGtSeFRpbWVzdGFtcCkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9USU1FU1RBTVAoYmRIZCkgICAgU0lSX01BQ19CRF9SWF9USU1FU1RBTVAoYmRIZCkKKyNlbmRpZgorCisvKiBXREFfSVNfUlhfSU5fU0NBTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfSVNfUlhfSU5fU0NBTihwUnhNZXRhKSAgKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5zY2FuKQorI2Vsc2UKKyMgIGRlZmluZSBXREFfSVNfUlhfSU5fU0NBTihiZEhkKSAgICAgU0lSX01BQ19CRF9UT19TQ0FOX0xFQVJOKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9SU1NJX0RCICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisvLyBWb2xhbnMgUkYKKyMgIGRlZmluZSBXREFfUlNTSV9PRkZTRVQgICAgICAgICAgICAgMTAwCisjICBkZWZpbmUgV0RBX0dFVF9SU1NJMF9EQihyc3NpMCkgICAgIChyc3NpMCAtIFdEQV9SU1NJX09GRlNFVCkKKyMgIGRlZmluZSBXREFfR0VUX1JTU0kxX0RCKHJzc2kwKSAgICAgKDAgLSBXREFfUlNTSV9PRkZTRVQpCisjICBkZWZpbmUgV0RBX01BWF9PRl9UV08odmFsMSwgdmFsMikgICggKCh2YWwxKSA+ICh2YWwyKSkgPyAodmFsMSkgOiAodmFsMikpCisjICBkZWZpbmUgV0RBX0dFVF9SU1NJX0RCKHJzc2kwKSAgXAorICAgICAgICAgICAgICAgIFdEQV9NQVhfT0ZfVFdPKFdEQV9HRVRfUlNTSTBfREIocnNzaTApLCBXREFfR0VUX1JTU0kxX0RCKHJzc2kwKSkKKyMgIGRlZmluZSBXREFfR0VUX1JYX1JTU0lfREIocFJ4TWV0YSkgXAorICAgICAgICAgICAgICAgICAgICAgICBXREFfR0VUX1JTU0lfREIoKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5yc3NpMCkpCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfUlNTSV9EQihiZEhkKSAgICAgU0lSX01BQ19CRF9UT19SU1NJX0RCKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9TTlIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9TTlIocFJ4TWV0YSkgICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+c25yKQorI2Vsc2UKKyMgIGRlZmluZSBXREFfR0VUX1JYX1NOUihiZEhkKSBXTEFOSEFMX1JYX0JEX0dFVF9TTlIoYmRIZCkKKyNlbmRpZgorCisvKiBXREFfSVNfUlhfRkMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBGbG93IGNvbnRyb2wgZnJhbWVzCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKy8qIEZJWE1FIFdEQSBzaG91bGQgcHJvdmlkZSB0aGUgbWV0YSBpbmZvIHdoaWNoIGluZGljYXRlcyBGQyBmcmFtZSAKKyAgICAgICAgICBJbiB0aGUgbWVhbnRpbWUsIHVzZSBoYXJkY29kZWQgRkFMU0UsIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgRkMgeWV0ICovCisjICBkZWZpbmUgV0RBX0lTX1JYX0ZDKHBSeE1ldGEpICAgICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+ZmMpCisjZWxzZQorIyAgZGVmaW5lIFdEQV9JU19SWF9GQyhiZEhkKSAgICAgICAgV0xBTkhBTF9SWF9CRF9HRVRfRkMoYmRIZCkKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX0ZDX1ZBTElEX1NUQV9NQVNLICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfR0VUX1JYX0ZDX1ZBTElEX1NUQV9NQVNLKHBSeE1ldGEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5mY1NUQVZhbGlkTWFzaykKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9GQ19WQUxJRF9TVEFfTUFTSyhiZEhkKSBcCisgICAgICAgICAgICAgICAgICAgICAgIFdMQU5IQUxfUlhfQkRfR0VUX1NUQV9WQUxJRF9NQVNLKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9GQ19QV1JTQVZFX1NUQV9NQVNLICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9GQ19QV1JTQVZFX1NUQV9NQVNLKHBSeE1ldGEpIFwKKyAgICAgICAgICAgICAgICAgKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5mY1NUQVB3clNhdmVTdGF0ZU1hc2spCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfRkNfUFdSU0FWRV9TVEFfTUFTSyhiZEhkKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOSEFMX1JYX0JEX0dFVF9TVEFfUFNfU1RBVEUoYmRIZCkKKyNlbmRpZgorCisvKiBXREFfR0VUX1JYX0ZDX1NUQV9USFJEX0lORF9NQVNLICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9GQ19TVEFfVEhSRF9JTkRfTUFTSyhwUnhNZXRhKSBcCisgICAgICAgICAgICAgICAgICAgICAoKChXRElfRFNfUnhNZXRhSW5mb1R5cGUqKShwUnhNZXRhKSktPmZjU1RBVGhyZXNoSW5kTWFzaykKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVF9SWF9GQ19TVEFfVEhSRF9JTkRfTUFTSyhiZEhkKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOSEFMX1JYX0JEX0dFVF9TVEFfVEhfSU5EKGJkSGQpCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9GQ19GT1JDRURfU1RBX1RYX0RJU0FCTEVEX0JJVE1BUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyMgIGRlZmluZSBXREFfR0VUX1JYX0ZDX1NUQV9UWF9ESVNBQkxFRF9CSVRNQVAocFJ4TWV0YSkgXAorICAgICAgICAgICAgICAgICAgICAgKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5mY1N0YVR4RGlzYWJsZWRCaXRtYXApCisKKy8qIFdEQV9HRVRfUlhfRkNfU1RBX1RYUV9MRU4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfRkNfU1RBX1RYUV9MRU4ocFJ4TWV0YSwgc3RhSWQpIFwKKyAgICAgICAgICAgICAgICAgICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+ZmNTVEFUeFFMZW5bKHN0YUlkKV0pCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfRkNfU1RBX1RYUV9MRU4oYmRIZCwgc3RhSWQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkhBTF9SWF9CRF9HRVRfU1RBX1RYUV9MRU4oIF9wdkJESGVhZGVyLCBzdGFJZCApCisjZW5kaWYKKworLyogV0RBX0dFVF9SWF9GQ19TVEFfQ1VSX1RYUkFURSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVF9SWF9GQ19TVEFfQ1VSX1RYUkFURShwUnhNZXRhLCBzdGFJZCkgXAorICAgICAgICAgICAgICAgICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+ZmNTVEFDdXJUeFJhdGVbKHN0YUlkKV0pCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfRkNfU1RBX0NVUl9UWFJBVEUoYmRIZCwgc3RhSWQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTkhBTF9SWF9CRF9HRVRfU1RBX0NVUl9UWF9SQVRFKCBiZEhkLCBzdGFJZHggKQorI2VuZGlmCisKKy8qIFdEQV9HRVRfUlhfUkVQTEFZX0NPVU5UICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9HRVRfUlhfUkVQTEFZX0NPVU5UKHBSeE1ldGEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChXRElfRFNfUnhNZXRhSW5mb1R5cGUqKShwUnhNZXRhKSktPnJlcGxheUNvdW50KQorI2VuZGlmCisKKy8qIFdEQV9HRVRSU1NJMCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyMgIGRlZmluZSBXREFfR0VUUlNTSTAocFJ4TWV0YSkgKCgoV0RJX0RTX1J4TWV0YUluZm9UeXBlKikocFJ4TWV0YSkpLT5yc3NpMCkKKyNlbHNlCisjICBkZWZpbmUgV0RBX0dFVFJTU0kwKGJkSGQpICh2X1M3X3QpKEhBTF9HRVRfUlNTSTBfREIoU0lSX01BQ19CRF9UT19QSFlfU1RBVFMwKGJkSGQpKSkKKyNlbmRpZgorCisvKiBXREFfR0VUUlNTSTEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX0dFVFJTU0kxKHBSeE1ldGEpICgoKFdESV9EU19SeE1ldGFJbmZvVHlwZSopKHBSeE1ldGEpKS0+cnNzaTEpCisjZWxzZQorIyAgZGVmaW5lIFdEQV9HRVRSU1NJMShiZEhkKSAodl9TN190KShIQUxfR0VUX1JTU0kxX0RCKFNJUl9NQUNfQkRfVE9fUEhZX1NUQVRTMChiZEhkKSkpCisjZW5kaWYKKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCit1aW50OCBXREFfSXNXY25zc1dsYW5Db21waWxlZFZlcnNpb25HcmVhdGVyVGhhbk9yRXF1YWwodWludDggbWFqb3IsIHVpbnQ4IG1pbm9yLCB1aW50OCB2ZXJzaW9uLCB1aW50OCByZXZpc2lvbik7Cit1aW50OCBXREFfSXNXY25zc1dsYW5SZXBvcnRlZFZlcnNpb25HcmVhdGVyVGhhbk9yRXF1YWwodWludDggbWFqb3IsIHVpbnQ4IG1pbm9yLCB1aW50OCB2ZXJzaW9uLCB1aW50OCByZXZpc2lvbik7CisKKworVk9TX1NUQVRVUyBXREFfR2V0V2Nuc3NXbGFuQ29tcGlsZWRWZXJzaW9uKHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyVmVyc2lvblR5cGUgKnBWZXJzaW9uKTsKK1ZPU19TVEFUVVMgV0RBX0dldFdjbnNzV2xhblJlcG9ydGVkVmVyc2lvbih2X1BWT0lEX3QgcHZvc0dDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclZlcnNpb25UeXBlICpwVmVyc2lvbik7CitWT1NfU1RBVFVTIFdEQV9HZXRXY25zc1NvZnR3YXJlVmVyc2lvbih2X1BWT0lEX3QgcHZvc0dDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHZlcnNpb25CdWZmZXJTaXplKTsKK1ZPU19TVEFUVVMgV0RBX0dldFdjbnNzSGFyZHdhcmVWZXJzaW9uKHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgdmVyc2lvbkJ1ZmZlclNpemUpOworCitWT1NfU1RBVFVTIFdEQV9TZXRVYXBzZEFjUGFyYW1zUmVxKHZfUFZPSURfdCAsIHZfVThfdCAsIHRVYXBzZEluZm8gKik7CitWT1NfU1RBVFVTIFdEQV9DbGVhclVhcHNkQWNQYXJhbXNSZXEodl9QVk9JRF90ICwgdl9VOF90ICwgd3B0X3VpbnQ4ICk7CitWT1NfU1RBVFVTIFdEQV9TZXRSU1NJVGhyZXNob2xkc1JlcSh0cEFuaVNpckdsb2JhbCAsIHRTaXJSU1NJVGhyZXNob2xkcyAqKTsKKy8vIEp1c3QgZGVjbGFyZSB0aGUgZnVuY3Rpb24gZXh0ZXJuIGhlcmUgYW5kIHNhdmUgc29tZSB0aW1lLgorZXh0ZXJuIHRTaXJSZXRTdGF0dXMgaGFsTW1oRm9yd2FyZE1CbXNnKHZvaWQqLCB0U2lyTWJNc2cqKTsKK3RTaXJSZXRTdGF0dXMgdU1hY1Bvc3RDdHJsTXNnKHZvaWQqIHBTaXJHbG9iYWwsIHRTaXJNYk1zZyogcE1iKTsKKyNlbHNlCisjICBkZWZpbmUgdU1hY1Bvc3RDdHJsTXNnKGhhbCwgbXNnKSAgaGFsTW1oRm9yd2FyZE1CbXNnKGhhbCwgbXNnKQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQykgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MpCisjZGVmaW5lIFdEQV9NQVhfVFhQT1dFUl9JTlZBTElEIEhBTF9NQVhfVFhQT1dFUl9JTlZBTElECisKKy8vV0RBIE1lc3NhZ2VzIHRvIEhBTCBtZXNzYWdlcyBNYXBwaW5nCisjaWYgMAorLy9SZXF1aXJlZCBieSBTTUUKKy8vI2RlZmluZSBXREFfU0lHTkFMX0JUX0VWRU5UIFNJUl9IQUxfU0lHTkFMX0JUX0VWRU5UIC0gdGhpcyBpcyBkZWZpbmVkIGluIHNpclBhcmFtcy5oCisvLyNkZWZpbmUgV0RBX0JUQ19TRVRfQ0ZHIFNJUl9IQUxfQlRDX1NFVF9DRkcKKworLy9SZXF1aXJlZCBieSBQRQorI2RlZmluZSBXREFfSE9TVF9NU0dfU1RBUlQgU0lSX0hBTF9IT1NUX01TR19TVEFSVCAKKyNkZWZpbmUgV0RBX0lOSVRJQUxfQ0FMX0ZBSUxFRF9OVEYgU0lSX0hBTF9JTklUSUFMX0NBTF9GQUlMRURfTlRGCisjZGVmaW5lIFdEQV9TSFVURE9XTl9SRVEgU0lSX0hBTF9TSFVURE9XTl9SRVEKKyNkZWZpbmUgV0RBX1NIVVRET1dOX0NORiBTSVJfSEFMX1NIVVRET1dOX0NORgorI2RlZmluZSBXREFfUkFESU9fT05fT0ZGX0lORCBTSVJfSEFMX1JBRElPX09OX09GRl9JTkQKKyNkZWZpbmUgV0RBX1JFU0VUX0NORiBTSVJfSEFMX1JFU0VUX0NORgorI2RlZmluZSBXREFfU2V0UmVnRG9tYWluIFwKKyAgICAgICAgZUhhbFN0YXR1cyBoYWxQaHlTZXRSZWdEb21haW4odEhhbEhhbmRsZSBoSGFsLCBlUmVnRG9tYWluSWQgcmVnRG9tYWluKTsKKyNlbmRpZgorCisjZGVmaW5lIFdEQV9BUFBfU0VUVVBfTlRGICBTSVJfSEFMX0FQUF9TRVRVUF9OVEYgCisjZGVmaW5lIFdEQV9OSUNfT1BFUl9OVEYgICBTSVJfSEFMX05JQ19PUEVSX05URgorI2RlZmluZSBXREFfSU5JVF9TVEFSVF9SRVEgU0lSX0hBTF9JTklUX1NUQVJUX1JFUQorI2RlZmluZSBXREFfUkVTRVRfUkVRICAgICAgU0lSX0hBTF9SRVNFVF9SRVEKKyNkZWZpbmUgV0RBX0hERF9BRERCQV9SRVEgIFNJUl9IQUxfSEREX0FEREJBX1JFUQorI2RlZmluZSBXREFfSEREX0FEREJBX1JTUCAgU0lSX0hBTF9IRERfQUREQkFfUlNQCisjZGVmaW5lIFdEQV9ERUxFVEVCQV9JTkQgICBTSVJfSEFMX0RFTEVURUJBX0lORAorI2RlZmluZSBXREFfQkFfRkFJTF9JTkQgICAgU0lSX0hBTF9CQV9GQUlMX0lORAorI2RlZmluZSBXREFfVExfRkxVU0hfQUNfUkVRIFNJUl9UTF9IQUxfRkxVU0hfQUNfUkVRCisjZGVmaW5lIFdEQV9UTF9GTFVTSF9BQ19SU1AgU0lSX0hBTF9UTF9GTFVTSF9BQ19SU1AKKworI2RlZmluZSBXREFfTVNHX1RZUEVTX0JFR0lOICAgICAgICAgICAgU0lSX0hBTF9NU0dfVFlQRVNfQkVHSU4KKyNkZWZpbmUgV0RBX0lUQ19NU0dfVFlQRVNfQkVHSU4gICAgICAgIFNJUl9IQUxfSVRDX01TR19UWVBFU19CRUdJTgorI2RlZmluZSBXREFfUkFEQVJfREVURUNURURfSU5EICAgICAgICAgU0lSX0hBTF9SQURBUl9ERVRFQ1RFRF9JTkQKKyNkZWZpbmUgV0RBX1dEVF9LQU1fUlNQICAgICAgICAgICAgICAgIFNJUl9IQUxfV0RUX0tBTV9SU1AgCisjZGVmaW5lIFdEQV9USU1FUl9URU1QX01FQVNfUkVRICAgICAgICBTSVJfSEFMX1RJTUVSX1RFTVBfTUVBU19SRVEKKyNkZWZpbmUgV0RBX1RJTUVSX1BFUklPRElDX1NUQVRTX0NPTExFQ1RfUkVRICAgU0lSX0hBTF9USU1FUl9QRVJJT0RJQ19TVEFUU19DT0xMRUNUX1JFUQorI2RlZmluZSBXREFfQ0FMX1JFUV9OVEYgICAgICAgICAgICAgICAgU0lSX0hBTF9DQUxfUkVRX05URgorI2RlZmluZSBXREFfTU5UX09QRU5fVFBDX1RFTVBfTUVBU19SRVEgU0lSX0hBTF9NTlRfT1BFTl9UUENfVEVNUF9NRUFTX1JFUQorI2RlZmluZSBXREFfQ0NBX01PTklUT1JfSU5URVJWQUxfVE8gICAgU0lSX0hBTF9DQ0FfTU9OSVRPUl9JTlRFUlZBTF9UTworI2RlZmluZSBXREFfQ0NBX01PTklUT1JfRFVSQVRJT05fVE8gICAgU0lSX0hBTF9DQ0FfTU9OSVRPUl9EVVJBVElPTl9UTworI2RlZmluZSBXREFfQ0NBX01PTklUT1JfU1RBUlQgICAgICAgICAgU0lSX0hBTF9DQ0FfTU9OSVRPUl9TVEFSVCAKKyNkZWZpbmUgV0RBX0NDQV9NT05JVE9SX1NUT1AgICAgICAgICAgIFNJUl9IQUxfQ0NBX01PTklUT1JfU1RPUAorI2RlZmluZSBXREFfQ0NBX0NIQU5HRV9NT0RFICAgICAgICAgICAgU0lSX0hBTF9DQ0FfQ0hBTkdFX01PREUKKyNkZWZpbmUgV0RBX1RJTUVSX1dSQVBfQVJPVU5EX1NUQVRTX0NPTExFQ1RfUkVRICAgU0lSX0hBTF9USU1FUl9XUkFQX0FST1VORF9TVEFUU19DT0xMRUNUX1JFUQorCisvKgorICogTmV3IFRhdXJ1cyByZWxhdGVkIG1lc3NhZ2VzCisgKi8KKyNkZWZpbmUgV0RBX0FERF9TVEFfUkVRICAgICAgICAgICAgICAgIFNJUl9IQUxfQUREX1NUQV9SRVEKKyNkZWZpbmUgV0RBX0FERF9TVEFfUlNQICAgICAgICAgICAgICAgIFNJUl9IQUxfQUREX1NUQV9SU1AKKyNkZWZpbmUgV0RBX0FERF9TVEFfU0VMRl9SU1AgICAgICAgICAgIFNJUl9IQUxfQUREX1NUQV9TRUxGX1JTUAorI2RlZmluZSBXREFfREVMX1NUQV9TRUxGX1JTUCAgICAgICAgICAgU0lSX0hBTF9ERUxfU1RBX1NFTEZfUlNQCisjZGVmaW5lIFdEQV9ERUxFVEVfU1RBX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0RFTEVURV9TVEFfUkVRIAorI2RlZmluZSBXREFfREVMRVRFX1NUQV9SU1AgICAgICAgICAgICAgU0lSX0hBTF9ERUxFVEVfU1RBX1JTUAorI2RlZmluZSBXREFfQUREX0JTU19SRVEgICAgICAgICAgICAgICAgU0lSX0hBTF9BRERfQlNTX1JFUQorI2RlZmluZSBXREFfQUREX0JTU19SU1AgICAgICAgICAgICAgICAgU0lSX0hBTF9BRERfQlNTX1JTUAorI2RlZmluZSBXREFfREVMRVRFX0JTU19SRVEgICAgICAgICAgICAgU0lSX0hBTF9ERUxFVEVfQlNTX1JFUQorI2RlZmluZSBXREFfREVMRVRFX0JTU19SU1AgICAgICAgICAgICAgU0lSX0hBTF9ERUxFVEVfQlNTX1JTUAorI2RlZmluZSBXREFfSU5JVF9TQ0FOX1JFUSAgICAgICAgICAgICAgU0lSX0hBTF9JTklUX1NDQU5fUkVRCisjZGVmaW5lIFdEQV9JTklUX1NDQU5fUlNQICAgICAgICAgICAgICBTSVJfSEFMX0lOSVRfU0NBTl9SU1AKKyNkZWZpbmUgV0RBX1NUQVJUX1NDQU5fUkVRICAgICAgICAgICAgIFNJUl9IQUxfU1RBUlRfU0NBTl9SRVEKKyNkZWZpbmUgV0RBX1NUQVJUX1NDQU5fUlNQICAgICAgICAgICAgIFNJUl9IQUxfU1RBUlRfU0NBTl9SU1AKKyNkZWZpbmUgV0RBX0VORF9TQ0FOX1JFUSAgICAgICAgICAgICAgIFNJUl9IQUxfRU5EX1NDQU5fUkVRCisjZGVmaW5lIFdEQV9FTkRfU0NBTl9SU1AgICAgICAgICAgICAgICBTSVJfSEFMX0VORF9TQ0FOX1JTUAorI2RlZmluZSBXREFfRklOSVNIX1NDQU5fUkVRICAgICAgICAgICAgU0lSX0hBTF9GSU5JU0hfU0NBTl9SRVEKKyNkZWZpbmUgV0RBX0ZJTklTSF9TQ0FOX1JTUCAgICAgICAgICAgIFNJUl9IQUxfRklOSVNIX1NDQU5fUlNQCisjZGVmaW5lIFdEQV9TRU5EX0JFQUNPTl9SRVEgICAgICAgICAgICBTSVJfSEFMX1NFTkRfQkVBQ09OX1JFUQorI2RlZmluZSBXREFfU0VORF9CRUFDT05fUlNQICAgICAgICAgICAgU0lSX0hBTF9TRU5EX0JFQUNPTl9SU1AKKworI2RlZmluZSBXREFfSU5JVF9DRkdfUkVRICAgICAgICAgICAgICAgU0lSX0hBTF9JTklUX0NGR19SRVEKKyNkZWZpbmUgV0RBX0lOSVRfQ0ZHX1JTUCAgICAgICAgICAgICAgIFNJUl9IQUxfSU5JVF9DRkdfUlNQCisKKyNkZWZpbmUgV0RBX0lOSVRfV01fQ0ZHX1JFUSAgICAgICAgICAgIFNJUl9IQUxfSU5JVF9XTV9DRkdfUkVRCisjZGVmaW5lIFdEQV9JTklUX1dNX0NGR19SU1AgICAgICAgICAgICBTSVJfSEFMX0lOSVRfV01fQ0ZHX1JTUAorCisjZGVmaW5lIFdEQV9TRVRfQlNTS0VZX1JFUSAgICAgICAgICAgICBTSVJfSEFMX1NFVF9CU1NLRVlfUkVRCisjZGVmaW5lIFdEQV9TRVRfQlNTS0VZX1JTUCAgICAgICAgICAgICBTSVJfSEFMX1NFVF9CU1NLRVlfUlNQCisjZGVmaW5lIFdEQV9TRVRfU1RBS0VZX1JFUSAgICAgICAgICAgICBTSVJfSEFMX1NFVF9TVEFLRVlfUkVRCisjZGVmaW5lIFdEQV9TRVRfU1RBS0VZX1JTUCAgICAgICAgICAgICBTSVJfSEFMX1NFVF9TVEFLRVlfUlNQCisjZGVmaW5lIFdEQV9EUFVfU1RBVFNfUkVRICAgICAgICAgICAgICBTSVJfSEFMX0RQVV9TVEFUU19SRVEgCisjZGVmaW5lIFdEQV9EUFVfU1RBVFNfUlNQICAgICAgICAgICAgICBTSVJfSEFMX0RQVV9TVEFUU19SU1AKKyNkZWZpbmUgV0RBX0dFVF9EUFVJTkZPX1JFUSAgICAgICAgICAgIFNJUl9IQUxfR0VUX0RQVUlORk9fUkVRCisjZGVmaW5lIFdEQV9HRVRfRFBVSU5GT19SU1AgICAgICAgICAgICBTSVJfSEFMX0dFVF9EUFVJTkZPX1JTUAorCisjZGVmaW5lIFdEQV9VUERBVEVfRURDQV9QUk9GSUxFX0lORCAgICBTSVJfSEFMX1VQREFURV9FRENBX1BST0ZJTEVfSU5ECisKKyNkZWZpbmUgV0RBX1VQREFURV9TVEFSQVRFSU5GT19SRVEgICAgIFNJUl9IQUxfVVBEQVRFX1NUQVJBVEVJTkZPX1JFUQorI2RlZmluZSBXREFfVVBEQVRFX1NUQVJBVEVJTkZPX1JTUCAgICAgU0lSX0hBTF9VUERBVEVfU1RBUkFURUlORk9fUlNQCisKKyNkZWZpbmUgV0RBX1VQREFURV9CRUFDT05fSU5EICAgICAgICAgIFNJUl9IQUxfVVBEQVRFX0JFQUNPTl9JTkQKKyNkZWZpbmUgV0RBX1VQREFURV9DRl9JTkQgICAgICAgICAgICAgIFNJUl9IQUxfVVBEQVRFX0NGX0lORAorI2RlZmluZSBXREFfQ0hOTF9TV0lUQ0hfUkVRICAgICAgICAgICAgU0lSX0hBTF9DSE5MX1NXSVRDSF9SRVEKKyNkZWZpbmUgV0RBX0FERF9UU19SRVEgICAgICAgICAgICAgICAgIFNJUl9IQUxfQUREX1RTX1JFUQorI2RlZmluZSBXREFfREVMX1RTX1JFUSAgICAgICAgICAgICAgICAgU0lSX0hBTF9ERUxfVFNfUkVRCisjZGVmaW5lIFdEQV9TT0ZUTUFDX1RYU1RBVF9SRVBPUlQgICAgICBTSVJfSEFMX1NPRlRNQUNfVFhTVEFUX1JFUE9SVAorCisjZGVmaW5lIFdEQV9NQk9YX1NFTkRNU0dfQ09NUExFVEVfSU5EICBTSVJfSEFMX01CT1hfU0VORE1TR19DT01QTEVURV9JTkQKKyNkZWZpbmUgV0RBX0VYSVRfQk1QU19SRVEgICAgICAgICAgICAgIFNJUl9IQUxfRVhJVF9CTVBTX1JFUQorI2RlZmluZSBXREFfRVhJVF9CTVBTX1JTUCAgICAgICAgICAgICAgU0lSX0hBTF9FWElUX0JNUFNfUlNQCisjZGVmaW5lIFdEQV9FWElUX0JNUFNfSU5EICAgICAgICAgICAgICBTSVJfSEFMX0VYSVRfQk1QU19JTkQgCisjZGVmaW5lIFdEQV9FTlRFUl9CTVBTX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0VOVEVSX0JNUFNfUkVRCisjZGVmaW5lIFdEQV9FTlRFUl9CTVBTX1JTUCAgICAgICAgICAgICBTSVJfSEFMX0VOVEVSX0JNUFNfUlNQCisjZGVmaW5lIFdEQV9CTVBTX1NUQVRVU19JTkQgICAgICAgICAgICBTSVJfSEFMX0JNUFNfU1RBVFVTX0lORAorI2RlZmluZSBXREFfTUlTU0VEX0JFQUNPTl9JTkQgICAgICAgICAgU0lSX0hBTF9NSVNTRURfQkVBQ09OX0lORAorCisjZGVmaW5lIFdEQV9DRkdfUlhQX0ZJTFRFUl9SRVEgICAgICAgICBTSVJfSEFMX0NGR19SWFBfRklMVEVSX1JFUQorI2RlZmluZSBXREFfQ0ZHX1JYUF9GSUxURVJfUlNQICAgICAgICAgU0lSX0hBTF9DRkdfUlhQX0ZJTFRFUl9SU1AKKworI2RlZmluZSBXREFfU1dJVENIX0NIQU5ORUxfUlNQICAgICAgICAgU0lSX0hBTF9TV0lUQ0hfQ0hBTk5FTF9SU1AKKyNkZWZpbmUgV0RBX1AyUF9OT0FfQVRUUl9JTkQgICAgICAgICAgIFNJUl9IQUxfUDJQX05PQV9BVFRSX0lORAorI2RlZmluZSBXREFfUFdSX1NBVkVfQ0ZHICAgICAgICAgICAgICAgU0lSX0hBTF9QV1JfU0FWRV9DRkcKKworI2RlZmluZSBXREFfUkVHSVNURVJfUEVfQ0FMTEJBQ0sgICAgICAgU0lSX0hBTF9SRUdJU1RFUl9QRV9DQUxMQkFDSworI2RlZmluZSBXREFfU09GVE1BQ19NRU1fUkVBRFJFUVVFU1QgICAgU0lSX0hBTF9TT0ZUTUFDX01FTV9SRUFEUkVRVUVTVAorI2RlZmluZSBXREFfU09GVE1BQ19NRU1fV1JJVEVSRVFVRVNUICAgU0lSX0hBTF9TT0ZUTUFDX01FTV9XUklURVJFUVVFU1QKKworI2RlZmluZSBXREFfU09GVE1BQ19NRU1fUkVBRFJFU1BPTlNFICAgU0lSX0hBTF9TT0ZUTUFDX01FTV9SRUFEUkVTUE9OU0UKKyNkZWZpbmUgV0RBX1NPRlRNQUNfQlVMS1JFR1dSSVRFX0NPTkZJUk0gICAgICBTSVJfSEFMX1NPRlRNQUNfQlVMS1JFR1dSSVRFX0NPTkZJUk0KKyNkZWZpbmUgV0RBX1NPRlRNQUNfQlVMS1JFR1JFQURfUkVTUE9OU0UgICAgICBTSVJfSEFMX1NPRlRNQUNfQlVMS1JFR1JFQURfUkVTUE9OU0UKKyNkZWZpbmUgV0RBX1NPRlRNQUNfSE9TVE1FU0dfTVNHUFJPQ0VTU1JFU1VMVCBTSVJfSEFMX1NPRlRNQUNfSE9TVE1FU0dfTVNHUFJPQ0VTU1JFU1VMVAorCisjZGVmaW5lIFdEQV9BRERCQV9SRVEgICAgICAgICAgICAgICAgICBTSVJfSEFMX0FEREJBX1JFUSAKKyNkZWZpbmUgV0RBX0FEREJBX1JTUCAgICAgICAgICAgICAgICAgIFNJUl9IQUxfQUREQkFfUlNQCisjZGVmaW5lIFdEQV9ERUxCQV9JTkQgICAgICAgICAgICAgICAgICBTSVJfSEFMX0RFTEJBX0lORAorI2RlZmluZSBXREFfREVMX0JBX0lORCAgICAgICAgICAgICAgICAgU0lSX0hBTF9ERUxfQkFfSU5ECisjZGVmaW5lIFdEQV9NSUNfRkFJTFVSRV9JTkQgICAgICAgICAgICBTSVJfSEFMX01JQ19GQUlMVVJFX0lORAorCisvL21lc3NhZ2UgZnJvbSBzbWUgdG8gaW5pdGlhdGUgZGVsZXRlIGJsb2NrIGFjayBzZXNzaW9uLgorI2RlZmluZSBXREFfREVMQkFfUkVRICAgICAgICAgICAgICAgICAgU0lSX0hBTF9ERUxCQV9SRVEKKyNkZWZpbmUgV0RBX0lCU1NfU1RBX0FERCAgICAgICAgICAgICAgIFNJUl9IQUxfSUJTU19TVEFfQURECisjZGVmaW5lIFdEQV9USU1FUl9BREpVU1RfQURBUFRJVkVfVEhSRVNIT0xEX0lORCAgIFNJUl9IQUxfVElNRVJfQURKVVNUX0FEQVBUSVZFX1RIUkVTSE9MRF9JTkQKKyNkZWZpbmUgV0RBX1NFVF9MSU5LX1NUQVRFICAgICAgICAgICAgIFNJUl9IQUxfU0VUX0xJTktfU1RBVEUKKyNkZWZpbmUgV0RBX1NFVF9MSU5LX1NUQVRFX1JTUCAgICAgICAgIFNJUl9IQUxfU0VUX0xJTktfU1RBVEVfUlNQCisjZGVmaW5lIFdEQV9FTlRFUl9JTVBTX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0VOVEVSX0lNUFNfUkVRCisjZGVmaW5lIFdEQV9FTlRFUl9JTVBTX1JTUCAgICAgICAgICAgICBTSVJfSEFMX0VOVEVSX0lNUFNfUlNQCisjZGVmaW5lIFdEQV9FWElUX0lNUFNfUlNQICAgICAgICAgICAgICBTSVJfSEFMX0VYSVRfSU1QU19SU1AKKyNkZWZpbmUgV0RBX0VYSVRfSU1QU19SRVEgICAgICAgICAgICAgIFNJUl9IQUxfRVhJVF9JTVBTX1JFUQorI2RlZmluZSBXREFfU09GVE1BQ19IT1NUTUVTR19QU19TVEFUVVNfSU5EICBTSVJfSEFMX1NPRlRNQUNfSE9TVE1FU0dfUFNfU1RBVFVTX0lORCAgCisjZGVmaW5lIFdEQV9QT1NUUE9ORV9FTlRFUl9JTVBTX1JTUCAgICBTSVJfSEFMX1BPU1RQT05FX0VOVEVSX0lNUFNfUlNQCisjZGVmaW5lIFdEQV9TVEFfU1RBVF9SRVEgICAgICAgICAgICAgICBTSVJfSEFMX1NUQV9TVEFUX1JFUSAKKyNkZWZpbmUgV0RBX0dMT0JBTF9TVEFUX1JFUSAgICAgICAgICAgIFNJUl9IQUxfR0xPQkFMX1NUQVRfUkVRCisjZGVmaW5lIFdEQV9BR0dSX1NUQVRfUkVRICAgICAgICAgICAgICBTSVJfSEFMX0FHR1JfU1RBVF9SRVEgCisjZGVmaW5lIFdEQV9TVEFfU1RBVF9SU1AgICAgICAgICAgICAgICBTSVJfSEFMX1NUQV9TVEFUX1JTUAorI2RlZmluZSBXREFfR0xPQkFMX1NUQVRfUlNQICAgICAgICAgICAgU0lSX0hBTF9HTE9CQUxfU1RBVF9SU1AKKyNkZWZpbmUgV0RBX0FHR1JfU1RBVF9SU1AgICAgICAgICAgICAgIFNJUl9IQUxfQUdHUl9TVEFUX1JTUAorI2RlZmluZSBXREFfU1RBVF9TVU1NX1JFUSAgICAgICAgICAgICAgU0lSX0hBTF9TVEFUX1NVTU1fUkVRCisjZGVmaW5lIFdEQV9TVEFUX1NVTU1fUlNQICAgICAgICAgICAgICBTSVJfSEFMX1NUQVRfU1VNTV9SU1AKKyNkZWZpbmUgV0RBX1JFTU9WRV9CU1NLRVlfUkVRICAgICAgICAgIFNJUl9IQUxfUkVNT1ZFX0JTU0tFWV9SRVEKKyNkZWZpbmUgV0RBX1JFTU9WRV9CU1NLRVlfUlNQICAgICAgICAgIFNJUl9IQUxfUkVNT1ZFX0JTU0tFWV9SU1AKKyNkZWZpbmUgV0RBX1JFTU9WRV9TVEFLRVlfUkVRICAgICAgICAgIFNJUl9IQUxfUkVNT1ZFX1NUQUtFWV9SRVEKKyNkZWZpbmUgV0RBX1JFTU9WRV9TVEFLRVlfUlNQICAgICAgICAgIFNJUl9IQUxfUkVNT1ZFX1NUQUtFWV9SU1AKKyNkZWZpbmUgV0RBX1NFVF9TVEFfQkNBU1RLRVlfUkVRICAgICAgIFNJUl9IQUxfU0VUX1NUQV9CQ0FTVEtFWV9SRVEgCisjZGVmaW5lIFdEQV9TRVRfU1RBX0JDQVNUS0VZX1JTUCAgICAgICBTSVJfSEFMX1NFVF9TVEFfQkNBU1RLRVlfUlNQCisjZGVmaW5lIFdEQV9SRU1PVkVfU1RBX0JDQVNUS0VZX1JFUSAgICBTSVJfSEFMX1JFTU9WRV9TVEFfQkNBU1RLRVlfUkVRCisjZGVmaW5lIFdEQV9SRU1PVkVfU1RBX0JDQVNUS0VZX1JTUCAgICBTSVJfSEFMX1JFTU9WRV9TVEFfQkNBU1RLRVlfUlNQCisjZGVmaW5lIFdEQV9BRERfVFNfUlNQICAgICAgICAgICAgICAgICBTSVJfSEFMX0FERF9UU19SU1AKKyNkZWZpbmUgV0RBX0RQVV9NSUNfRVJST1IgICAgICAgICAgICAgIFNJUl9IQUxfRFBVX01JQ19FUlJPUgorI2RlZmluZSBXREFfVElNRVJfQkFfQUNUSVZJVFlfUkVRICAgICAgU0lSX0hBTF9USU1FUl9CQV9BQ1RJVklUWV9SRVEKKyNkZWZpbmUgV0RBX1RJTUVSX0NISVBfTU9OSVRPUl9USU1FT1VUIFNJUl9IQUxfVElNRVJfQ0hJUF9NT05JVE9SX1RJTUVPVVQKKyNkZWZpbmUgV0RBX1RJTUVSX1RSQUZGSUNfQUNUSVZJVFlfUkVRIFNJUl9IQUxfVElNRVJfVFJBRkZJQ19BQ1RJVklUWV9SRVEKKyNkZWZpbmUgV0RBX1RJTUVSX0FEQ19SU1NJX1NUQVRTICAgICAgIFNJUl9IQUxfVElNRVJfQURDX1JTU0lfU1RBVFMKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyNkZWZpbmUgV0RBX1RTTV9TVEFUU19SRVEgICAgICAgICAgICAgIFNJUl9IQUxfVFNNX1NUQVRTX1JFUQorI2RlZmluZSBXREFfVFNNX1NUQVRTX1JTUCAgICAgICAgICAgICAgU0lSX0hBTF9UU01fU1RBVFNfUlNQCisjZW5kaWYKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisjZGVmaW5lIFdEQV9VUERBVEVfUFJPQkVfUlNQX0lFX0JJVE1BUF9JTkQgU0lSX0hBTF9VUERBVEVfUFJPQkVfUlNQX0lFX0JJVE1BUF9JTkQKKyNkZWZpbmUgV0RBX1VQREFURV9VQVBTRF9JTkQgICAgICAgICAgIFNJUl9IQUxfVVBEQVRFX1VBUFNEX0lORAorI2VuZGlmCisKKyNkZWZpbmUgV0RBX1NFVF9NSU1PUFNfUkVRICAgICAgICAgICAgICAgICAgICAgIFNJUl9IQUxfU0VUX01JTU9QU19SRVEgCisjZGVmaW5lIFdEQV9TRVRfTUlNT1BTX1JTUCAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX1NFVF9NSU1PUFNfUlNQCisjZGVmaW5lIFdEQV9TWVNfUkVBRFlfSU5EICAgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX1NZU19SRUFEWV9JTkQKKyNkZWZpbmUgV0RBX1NFVF9UWF9QT1dFUl9SRVEgICAgICAgICAgICAgICAgICAgIFNJUl9IQUxfU0VUX1RYX1BPV0VSX1JFUQorI2RlZmluZSBXREFfU0VUX1RYX1BPV0VSX1JTUCAgICAgICAgICAgICAgICAgICAgU0lSX0hBTF9TRVRfVFhfUE9XRVJfUlNQCisjZGVmaW5lIFdEQV9HRVRfVFhfUE9XRVJfUkVRICAgICAgICAgICAgICAgICAgICBTSVJfSEFMX0dFVF9UWF9QT1dFUl9SRVEKKyNkZWZpbmUgV0RBX0dFVF9UWF9QT1dFUl9SU1AgICAgICAgICAgICAgICAgICAgIFNJUl9IQUxfR0VUX1RYX1BPV0VSX1JTUAorI2RlZmluZSBXREFfR0VUX05PSVNFX1JFUSAgICAgICAgICAgICAgICAgICAgICAgU0lSX0hBTF9HRVRfTk9JU0VfUkVRIAorI2RlZmluZSBXREFfR0VUX05PSVNFX1JTUCAgICAgICAgICAgICAgICAgICAgICAgU0lSX0hBTF9HRVRfTk9JU0VfUlNQCisjZGVmaW5lIFdEQV9TRVRfVFhfUEVSX1RSQUNLSU5HX1JFUSAgICBTSVJfSEFMX1NFVF9UWF9QRVJfVFJBQ0tJTkdfUkVRCisKKy8qIE1lc3NhZ2VzIHRvIHN1cHBvcnQgdHJhbnNtaXRfaGFsdCBhbmQgdHJhbnNtaXRfcmVzdW1lICovCisjZGVmaW5lIFdEQV9UUkFOU01JU1NJT05fQ09OVFJPTF9JTkQgICAgICAgICAgICBTSVJfSEFMX1RSQU5TTUlTU0lPTl9DT05UUk9MX0lORAorLyogSW5kaWNhdGlvbiBmcm9tIExJTSB0byBIQUwgdG8gSW5pdGlhbGl6ZSByYWRhciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgV0RBX0lOSVRfUkFEQVJfSU5EICAgICAgICAgICAgICAgICAgICAgIFNJUl9IQUxfSU5JVF9SQURBUl9JTkQKKy8qIE1lc3NhZ2VzIHRvIHN1cHBvcnQgdHJhbnNtaXRfaGFsdCBhbmQgdHJhbnNtaXRfcmVzdW1lICovCisKKworI2RlZmluZSBXREFfQkVBQ09OX1BSRV9JTkQgICAgICAgICAgICAgU0lSX0hBTF9CRUFDT05fUFJFX0lORAorI2RlZmluZSBXREFfRU5URVJfVUFQU0RfUkVRICAgICAgICAgICAgU0lSX0hBTF9FTlRFUl9VQVBTRF9SRVEKKyNkZWZpbmUgV0RBX0VOVEVSX1VBUFNEX1JTUCAgICAgICAgICAgIFNJUl9IQUxfRU5URVJfVUFQU0RfUlNQCisjZGVmaW5lIFdEQV9FWElUX1VBUFNEX1JFUSAgICAgICAgICAgICBTSVJfSEFMX0VYSVRfVUFQU0RfUkVRIAorI2RlZmluZSBXREFfRVhJVF9VQVBTRF9SU1AgICAgICAgICAgICAgU0lSX0hBTF9FWElUX1VBUFNEX1JTUAorI2RlZmluZSBXREFfTE9XX1JTU0lfSU5EICAgICAgICAgICAgICAgU0lSX0hBTF9MT1dfUlNTSV9JTkQgCisjZGVmaW5lIFdEQV9CRUFDT05fRklMVEVSX0lORCAgICAgICAgICBTSVJfSEFMX0JFQUNPTl9GSUxURVJfSU5ECisvLy8gUEUgPC0+IEhBTCBXT1dMIG1lc3NhZ2VzCisjZGVmaW5lIFdEQV9XT1dMX0FERF9CQ0FTVF9QVFJOICAgICAgICBTSVJfSEFMX1dPV0xfQUREX0JDQVNUX1BUUk4KKyNkZWZpbmUgV0RBX1dPV0xfREVMX0JDQVNUX1BUUk4gICAgICAgIFNJUl9IQUxfV09XTF9ERUxfQkNBU1RfUFRSTgorI2RlZmluZSBXREFfV09XTF9FTlRFUl9SRVEgICAgICAgICAgICAgU0lSX0hBTF9XT1dMX0VOVEVSX1JFUQorI2RlZmluZSBXREFfV09XTF9FTlRFUl9SU1AgICAgICAgICAgICAgU0lSX0hBTF9XT1dMX0VOVEVSX1JTUAorI2RlZmluZSBXREFfV09XTF9FWElUX1JFUSAgICAgICAgICAgICAgU0lSX0hBTF9XT1dMX0VYSVRfUkVRCisjZGVmaW5lIFdEQV9XT1dMX0VYSVRfUlNQICAgICAgICAgICAgICBTSVJfSEFMX1dPV0xfRVhJVF9SU1AKKyNkZWZpbmUgV0RBX1RYX0NPTVBMRVRFX0lORCAgICAgICAgICAgIFNJUl9IQUxfVFhfQ09NUExFVEVfSU5ECisjZGVmaW5lIFdEQV9USU1FUl9SQV9DT0xMRUNUX0FORF9BREFQVCBTSVJfSEFMX1RJTUVSX1JBX0NPTExFQ1RfQU5EX0FEQVBUCisvLy8gUEUgPC0+IEhBTCBzdGF0aXN0aWNzIG1lc3NhZ2VzCisjZGVmaW5lIFdEQV9HRVRfU1RBVElTVElDU19SRVEgICAgICAgICBTSVJfSEFMX0dFVF9TVEFUSVNUSUNTX1JFUQorI2RlZmluZSBXREFfR0VUX1NUQVRJU1RJQ1NfUlNQICAgICAgICAgU0lSX0hBTF9HRVRfU1RBVElTVElDU19SU1AKKyNkZWZpbmUgV0RBX1NFVF9LRVlfRE9ORSAgICAgICAgICAgICAgIFNJUl9IQUxfU0VUX0tFWV9ET05FCisKKy8vLyBQRSA8LT4gSEFMIEJUQyBtZXNzYWdlcworI2RlZmluZSBXREFfQlRDX1NFVF9DRkcgICAgICAgICAgICAgICAgU0lSX0hBTF9CVENfU0VUX0NGRworI2RlZmluZSBXREFfU0lHTkFMX0JUX0VWRU5UICAgICAgICAgICAgU0lSX0hBTF9TSUdOQUxfQlRfRVZFTlQKKyNkZWZpbmUgV0RBX0hBTkRMRV9GV19NQk9YX1JTUCAgICAgICAgIFNJUl9IQUxfSEFORExFX0ZXX01CT1hfUlNQCisjZGVmaW5lIFdEQV9VUERBVEVfUFJPQkVfUlNQX1RFTVBMQVRFX0lORCAgICAgU0lSX0hBTF9VUERBVEVfUFJPQkVfUlNQX1RFTVBMQVRFX0lORAorI2RlZmluZSBXREFfU0lHTkFMX0JUQU1QX0VWRU5UICAgICAgICAgU0lSX0hBTF9TSUdOQUxfQlRBTVBfRVZFTlQKKworI2lmZGVmIEFOSV9DSElQU0VUX1ZPTEFOUworI2VuZGlmCisKKyNkZWZpbmUgV0RBX1NFVF9NQVhfVFhfUE9XRVJfUkVRICAgICAgIFNJUl9IQUxfU0VUX01BWF9UWF9QT1dFUl9SRVEKKyNkZWZpbmUgV0RBX1NFVF9NQVhfVFhfUE9XRVJfUlNQICAgICAgIFNJUl9IQUxfU0VUX01BWF9UWF9QT1dFUl9SU1AKKworI2RlZmluZSBXREFfU0VORF9NU0dfQ09NUExFVEUgICAgICAgICAgU0lSX0hBTF9TRU5EX01TR19DT01QTEVURSAKKworLy8vIFBFIDwtPiBIQUwgSG9zdCBPZmZsb2FkIG1lc3NhZ2UKKyNkZWZpbmUgV0RBX1NFVF9IT1NUX09GRkxPQUQgICAgICAgICAgIFNJUl9IQUxfU0VUX0hPU1RfT0ZGTE9BRAorCisvLy8gUEUgPC0+IEhBTCBLZWVwIEFsaXZlIG1lc3NhZ2UKKyNkZWZpbmUgV0RBX1NFVF9LRUVQX0FMSVZFICAgICAgICAgICAgIFNJUl9IQUxfU0VUX0tFRVBfQUxJVkUKKworI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorI2RlZmluZSBXREFfU0VUX05TX09GRkxPQUQgICAgICAgICAgICAgU0lSX0hBTF9TRVRfTlNfT0ZGTE9BRAorI2VuZGlmIC8vV0xBTl9OU19PRkZMT0FECisjZGVmaW5lIFdEQV9BRERfU1RBX1NFTEZfUkVRICAgICAgICAgICBTSVJfSEFMX0FERF9TVEFfU0VMRl9SRVEKKyNkZWZpbmUgV0RBX0RFTF9TVEFfU0VMRl9SRVEgICAgICAgICAgIFNJUl9IQUxfREVMX1NUQV9TRUxGX1JFUQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorI2RlZmluZSBXREFfU0VUX1AyUF9HT19OT0FfUkVRICAgICAgICAgU0lSX0hBTF9TRVRfUDJQX0dPX05PQV9SRVEKKyNlbmRpZgorCisjZGVmaW5lIFdEQV9UWF9DT01QTEVURV9USU1FT1VUX0lORCAgV0RBX01TR19UWVBFU19FTkQgLSAxCisjZGVmaW5lIFdEQV9XTEFOX1NVU1BFTkRfSU5EICAgICAgICAgICBTSVJfSEFMX1dMQU5fU1VTUEVORF9JTkQKKyNkZWZpbmUgV0RBX1dMQU5fUkVTVU1FX1JFUSAgICAgICAgICAgU0lSX0hBTF9XTEFOX1JFU1VNRV9SRVEKKyNkZWZpbmUgV0RBX01TR19UWVBFU19FTkQgICAgU0lSX0hBTF9NU0dfVFlQRVNfRU5ECisKKyNkZWZpbmUgV0RBX1NVU1BFTkRfQUNUSVZJVFlfUlNQIFNJUl9IQUxfU1VTUEVORF9BQ1RJVklUWV9SU1AKKworCisjZGVmaW5lIFdEQV9NTUhfVFhNQl9SRUFEWV9FVlQgU0lSX0hBTF9NTUhfVFhNQl9SRUFEWV9FVlQgICAgIAorI2RlZmluZSBXREFfTU1IX1JYTUJfRE9ORV9FVlQgIFNJUl9IQUxfTU1IX1JYTUJfRE9ORV9FVlQgICAgCisjZGVmaW5lIFdEQV9NTUhfTVNHUV9ORV9FVlQgICAgU0lSX0hBTF9NTUhfTVNHUV9ORV9FVlQKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyNkZWZpbmUgV0RBX0FHR1JfUU9TX1JFUSAgICAgICAgICAgICAgIFNJUl9IQUxfQUdHUl9RT1NfUkVRCisjZGVmaW5lIFdEQV9BR0dSX1FPU19SU1AgICAgICAgICAgICAgICBTSVJfSEFMX0FHR1JfUU9TX1JTUAorI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKyNpZmRlZiBBTklfTUFORl9ESUFHCisvKiBGVE0gQ01EIE1TRyAqLworI2RlZmluZSBXREFfRlRNX0NNRF9SRVEgICAgICAgIFNJUl9QVFRfTVNHX1RZUEVTX0JFR0lOCisjZGVmaW5lIFdEQV9GVE1fQ01EX1JTUCAgICAgICAgU0lSX1BUVF9NU0dfVFlQRVNfRU5ECisjZW5kaWYgLyogQU5JX01BTkZfRElBRyAqLworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisvKlJlcXVlc3RzIHNlbnQgdG8gbG93ZXIgZHJpdmVyKi8KKyNkZWZpbmUgV0RBX1NFVF9QTk9fUkVRICAgICAgICAgICAgIFNJUl9IQUxfU0VUX1BOT19SRVEKKyNkZWZpbmUgV0RBX1NFVF9SU1NJX0ZJTFRFUl9SRVEgICAgIFNJUl9IQUxfU0VUX1JTU0lfRklMVEVSX1JFUQorI2RlZmluZSBXREFfVVBEQVRFX1NDQU5fUEFSQU1TX1JFUSAgU0lSX0hBTF9VUERBVEVfU0NBTl9QQVJBTVMKKworLypJbmRpY2F0aW9uIGNvbW1pbmcgZnJvbSBsb3dlciBkcml2ZXIqLworI2RlZmluZSBXREFfU0VUX1BOT19DSEFOR0VEX0lORCAgICAgU0lSX0hBTF9TRVRfUE5PX0NIQU5HRURfSU5ECisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKyNkZWZpbmUgV0RBX1dBS0VfUkVBU09OX0lORCAgICBTSVJfSEFMX1dBS0VfUkVBU09OX0lORCAgCisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworI2RlZmluZSBXREFfODAyM19NVUxUSUNBU1RfTElTVF9SRVEgICAgICAgICAgICAgICAgICAgICBTSVJfSEFMXzgwMjNfTVVMVElDQVNUX0xJU1RfUkVRCisjZGVmaW5lIFdEQV9SRUNFSVZFX0ZJTFRFUl9TRVRfRklMVEVSX1JFUSAgICAgICAgICAgICAgIFNJUl9IQUxfUkVDRUlWRV9GSUxURVJfU0VUX0ZJTFRFUl9SRVEKKyNkZWZpbmUgV0RBX1BBQ0tFVF9DT0FMRVNDSU5HX0ZJTFRFUl9NQVRDSF9DT1VOVF9SRVEgICAgU0lSX0hBTF9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUkVRCisjZGVmaW5lIFdEQV9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUlNQICAgIFNJUl9IQUxfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JTUAorI2RlZmluZSBXREFfUkVDRUlWRV9GSUxURVJfQ0xFQVJfRklMVEVSX1JFUSAgICAgICAgICAgICBTSVJfSEFMX1JFQ0VJVkVfRklMVEVSX0NMRUFSX0ZJTFRFUl9SRVEgICAKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisjZGVmaW5lIFdEQV9TRVRfUE9XRVJfUEFSQU1TX1JFUSAgIFNJUl9IQUxfU0VUX1BPV0VSX1BBUkFNU19SRVEKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorI2RlZmluZSBXREFfR1RLX09GRkxPQURfUkVRICAgICAgICAgICAgIFNJUl9IQUxfR1RLX09GRkxPQURfUkVRCisjZGVmaW5lIFdEQV9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JFUSAgICAgU0lSX0hBTF9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JFUQorI2RlZmluZSBXREFfR1RLX09GRkxPQURfR0VUSU5GT19SU1AgICAgIFNJUl9IQUxfR1RLX09GRkxPQURfR0VUSU5GT19SU1AKKyNlbmRpZiAvL1dMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCisjZGVmaW5lIFdEQV9TRVRfVE1fTEVWRUxfUkVRICAgICAgIFNJUl9IQUxfU0VUX1RNX0xFVkVMX1JFUQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DCit0U2lyUmV0U3RhdHVzIHdkYVBvc3RDdHJsTXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DKQorI2RlZmluZSBWT1NfTU9EVUxFX0lEX1dEQSBWT1NfTU9EVUxFX0lEX0hBTAorCisvL1JlcXVpcmVkIGJ5IFRMCisKKy8vV0RBIEZ1bmN0aW9ucyB0byBIQUwgZnVuY3Rpb25zIE1hcHBpbmcKKy8vUmVxdWlyZWQgYnkgU01FIGFuZCBQRQorI2RlZmluZSBXREFfU2V0UmVnRG9tYWluIGhhbFBoeVNldFJlZ0RvbWFpbiAKKyNkZWZpbmUgd2RhUG9zdEN0cmxNc2cgaGFsUG9zdE1zZ0FwaQorI2Vsc2UKK2VIYWxTdGF0dXMgV0RBX1NldFJlZ0RvbWFpbih2b2lkICogY2xpZW50Q3R4dCwgdl9SRUdET01BSU5fdCByZWdJZCk7CisjZW5kaWYgLy9GRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DCisKKyNkZWZpbmUgSEFMX1VTRV9CRF9SQVRFMl9GT1JfTUFOQUdFTUVOVF9GUkFNRSAweDQwIC8vIEJpdCA2IHdpbGwgYmUgdXNlZCB0byBjb250cm9sIEJEIHJhdGUgZm9yIE1hbmFnZW1lbnQgZnJhbWVzCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorI2RlZmluZSBoYWxUeEZyYW1lKGhIYWwsIHBGcm1CdWYsIGZybUxlbiwgZnJtVHlwZSwgdHhEaXIsIHRpZCwgcENvbXBGdW5jLCBwRGF0YSwgdHhGbGFnKSBcCisgICAoZUhhbFN0YXR1cykoIFdEQV9UeFBhY2tldChcCisgICAgICAgICB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9XREEsIHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9XREEsIChoSGFsKSkpLFwKKyAgICAgICAgIChwRnJtQnVmKSxcCisgICAgICAgICAoZnJtTGVuKSxcCisgICAgICAgICAoZnJtVHlwZSksXAorICAgICAgICAgKHR4RGlyKSxcCisgICAgICAgICAodGlkKSxcCisgICAgICAgICAocENvbXBGdW5jKSxcCisgICAgICAgICAocERhdGEpLFwKKyAgICAgICAgIChOVUxMKSwgXAorICAgICAgICAgKHR4RmxhZykpICkKKworI2RlZmluZSBoYWxUeEZyYW1lV2l0aFR4Q29tcGxldGUoaEhhbCwgcEZybUJ1ZiwgZnJtTGVuLCBmcm1UeXBlLCB0eERpciwgdGlkLCBwQ29tcEZ1bmMsIHBEYXRhLCBwQ0JhY2tGblR4Q29tcCwgdHhGbGFnKSBcCisgICAoZUhhbFN0YXR1cykoIFdEQV9UeFBhY2tldChcCisgICAgICAgICB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9XREEsIHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9XREEsIChoSGFsKSkpLFwKKyAgICAgICAgIChwRnJtQnVmKSxcCisgICAgICAgICAoZnJtTGVuKSxcCisgICAgICAgICAoZnJtVHlwZSksXAorICAgICAgICAgKHR4RGlyKSxcCisgICAgICAgICAodGlkKSxcCisgICAgICAgICAocENvbXBGdW5jKSxcCisgICAgICAgICAocERhdGEpLFwKKyAgICAgICAgIChwQ0JhY2tGblR4Q29tcCksIFwKKyAgICAgICAgICh0eEZsYWcpKSApCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RBIGRhdGEgcGF0aCBBUEkncyBmb3IgVEwKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCit2X0JPT0xfdCBXREFfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUodl9QVk9JRF90IHBWb3NHQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggc3RhSWR4KTsKKyNlbHNlCisjICBkZWZpbmUgV0RBX0lzSHdGcmFtZVR4VHJhbnNsYXRpb25DYXBhYmxlKHZvc0dDdHgsIHN0YUlkKSBcCisgICAgICBXTEFOSEFMX0lzSHdGcmFtZVR4VHJhbnNsYXRpb25DYXBhYmxlKHZvc0dDdHgsIHN0YUlkKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9FbmFibGVVYXBzZEFjUGFyYW1zKHZvc0dDdHgsIHN0YUlkLCB1YXBzZEluZm8pIFwKKyAgICAgICAgIFdEQV9TZXRVYXBzZEFjUGFyYW1zUmVxKHZvc0dDdHgsIHN0YUlkLCB1YXBzZEluZm8pCisjZWxzZQorIyAgZGVmaW5lIFdEQV9FbmFibGVVYXBzZEFjUGFyYW1zKHZvc0dDdHgsIHN0YUlkLCB1YXBzZEluZm8pIFwKKyAgICAgICAgIFdMQU5IQUxfRW5hYmxlVWFwc2RBY1BhcmFtcyh2b3NHQ3R4LCBzdGFJZCwgdWFwc2RJbmZvKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorIyAgZGVmaW5lIFdEQV9EaXNhYmxlVWFwc2RBY1BhcmFtcyh2b3NHQ3R4LCBzdGFJZCwgYWMpIFwKKyAgICAgICAgICBXREFfQ2xlYXJVYXBzZEFjUGFyYW1zUmVxKHZvc0dDdHgsIHN0YUlkLCBhYykKKyNlbHNlCisjICBkZWZpbmUgV0RBX0Rpc2FibGVVYXBzZEFjUGFyYW1zKHZvc0dDdHgsIHN0YUlkLCBhYykgXAorICAgICAgICAgV0xBTkhBTF9EaXNhYmxlVWFwc2RBY1BhcmFtcyh2b3NHQ3R4LCBzdGFJZCwgYWMpCisjZW5kaWYKKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjICBkZWZpbmUgV0RBX1NldFJTU0lUaHJlc2hvbGRzKHBNYWMsIHBUaHJlc2hvbGRzKSBcCisgICAgICAgICBXREFfU2V0UlNTSVRocmVzaG9sZHNSZXEocE1hYywgcFRocmVzaG9sZHMpCisjZWxzZQorIyAgZGVmaW5lIFdEQV9TZXRSU1NJVGhyZXNob2xkcyhwTWFjLCBwVGhyZXNob2xkcykgXAorICAgICAgICAgaGFsUFNfU2V0UlNTSVRocmVzaG9sZHMocE1hYywgcFRocmVzaG9sZHMpCisjZW5kaWYKKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisjZGVmaW5lIFdEQV9VcGRhdGVSc3NpQm1wcyhwdm9zR0N0eCwgIHN0YUlkLCByc3NpKSBcCisgICAgICAgIFdMQU5UTF9VcGRhdGVSc3NpQm1wcyAocHZvc0dDdHgsIHN0YUlkLCByc3NpKQorI2VuZGlmCisKKyNpZmRlZiBXTEFOX1BFUkYgCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdEQV9UTElfRmFzdEh3RndkRGF0YUZyYW1lCisKKyAgREVTQ1JJUFRJT04gCisgICAgRm9yIE5PTiBpbnRlZ3JhdGVkIFNPQywgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgVEwuCisKKyAgICBGYXN0IHBhdGggZnVuY3Rpb24gdG8gcXVpY2tseSBmb3J3YXJkIGEgZGF0YSBmcmFtZSBpZiBIQUwgZGV0ZXJtaW5lcyBCRCAKKyAgICBzaWduYXR1cmUgY29tcHV0ZWQgaGVyZSBtYXRjaGVzIHRoZSBzaWduYXR1cmUgaW5zaWRlIGN1cnJlbnQgVk9TUyBwYWNrZXQuIAorICAgIElmIHRoZXJlIGlzIGEgbWF0Y2gsIEhBTCBhbmQgVEwgZmlsbHMgaW4gdGhlIHN3YXBwZWQgcGFja2V0IGxlbmd0aCBpbnRvIAorICAgIEJEIGhlYWRlciBhbmQgRHhFIGhlYWRlciwgcmVzcGVjdGl2ZWx5LiBPdGhlcndpc2UsIHBhY2tldCBnb2VzIGJhY2sgdG8gCisgICAgbm9ybWFsIChzbG93KSBwYXRoIGFuZCBhIG5ldyBCRCBzaWduYXR1cmUgd291bGQgYmUgdGFnZ2VkIGludG8gQkQgaW4gdGhpcworICAgIFZPU1MgcGFja2V0IGxhdGVyIGJ5IHRoZSBXTEFOSEFMX0ZpbGxUeEJkKCkgZnVuY3Rpb24uCisKKyAgVE9ETyAgRm9yIGludGVncmF0ZWQgU09DLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyB5ZXQuIFBpbWEgU0xNL0hBTCAKKyAgICAgICAgc2hvdWxkIHByb3ZpZGUgdGhlIGVxdWl2ZWxhbnQgZnVuY3Rpb25hbGl0eS4KKworICBERVBFTkRFTkNJRVMgCisgICAgIAorICBQQVJBTUVURVJTIAorCisgICBJTgorICAgICAgICBwdm9zR0N0eCAgICBWT1MgY29udGV4dAorICAgICAgICB2b3NEYXRhQnVmZiBQdHIgdG8gVk9TUyBwYWNrZXQKKyAgICAgICAgcE1ldGFJbmZvICAgRm9yIGdldHRpbmcgZnJhbWUncyBUSUQKKyAgICAgICAgcFN0YUluZm8gICAgRm9yIGNoZWNraW5nIFNUQSB0eXBlCisgICAgCisgICBPVVQKKyAgICAgICAgcHZvc1N0YXR1cyAgcmV0dXJuZWQgc3RhdHVzCisgICAgICAgIHB1RmFzdEZ3ZE9LIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBmcmFtZSBjb3VsZCBiZSBmYXN0IGZvcndhcmRlZAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIE5vIHJldHVybi4gICAKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFdEQV9UTElfRmFzdEh3RndkRGF0YUZyYW1lCisoCisgIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCisgIHZvc19wa3RfdCogICAgdm9zRGF0YUJ1ZmYsCisgIFZPU19TVEFUVVMqICAgcHZvc1N0YXR1cywKKyAgdl9VMzJfdCogICAgICAgcHVGYXN0RndkT0ssCisgIFdMQU5UTF9NZXRhSW5mb1R5cGUqICBwTWV0YUluZm8sCisgIFdMQU5fU1RBRGVzY1R5cGUqICBwU3RhSW5mbworKTsKKyNlbmRpZiAvKiBXTEFOX1BFUkYgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXREFfRFNfUmVnaXN0ZXIKKworICBERVNDUklQVElPTiAKKyAgICBSZWdpc3RlciBUTCBjbGllbnQgdG8gV0RBLiBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBUTCBSWC9UWCBmdW5jdGlvbnMKKyAgICB0byBXREkgYnkgY2FsbGluZyBXRElfRFNfUmVnaXN0ZXIuCisKKworICAgIEZvciBOT04gaW50ZWdyYXRlZCBTT0MsIHRoaXMgZnVuY3Rpb24gY2FsbHMgV0xBTkJBTF9SZWdUbENiRnVuY3Rpb25zCisgICAgdG8gcmVnaXN0ZXIgVEwncyBSWC9UWCBmdW5jdGlvbnMgdG8gQkFMCisKKyAgVE9ETyAKKyAgICBGb3IgUHJpbWEsIHBmblJlc291cmNlQ0IgZ2V0cyBjYWxsZWQgaW4gV0RUU19PT1Jlc291cmNlTm90aWZpY2F0aW9uLgorICAgIFRoZSB1Q291bnQgcGFyYW1ldGVyIGlzIEFDIG1hc2suIEl0IHNob3VsZCBiZSByZWRlZmluZWQgdG8gdXNlIHRoZQorICAgIHNhbWUgcmVzb3VyY2UgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgREVQRU5ERU5DSUVTIAorICAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgSU4KKyAgICAgICAgcHZvc0dDdHggICAgVk9TIGNvbnRleHQKKyAgICAgICAgcGZuVHhDb21wbGV0ZUNhbGxiYWNrICAgICAgIFRYIGNvbXBsZXRlIGNhbGxiYWNrIHVwb24gVFggY29tcGxldGlvbgorICAgICAgICBwZm5SeFBhY2tldENhbGxiYWNrICAgICAgICAgUlggY2FsbGJhY2sKKyAgICAgICAgcGZuUmVzb3VyY2VDQiAgICAgICAgICAgICAgIGdldHMgY2FsbGVkIHdoZW4gdXBkYXRpbmcgVFggUERVIG51bWJlcgorICAgICAgICB1UmVzVGhlc2hvbGQgICAgICAgICAgICAgICAgbWluaW11bSBUWCBQRFUgc2l6ZSBmb3IgYSBwYWNrZXQKKyAgICAgICAgcENhbGxiYWNrQ29udGV4dCAgICAgICAgICAgIFdESSBjYWxscyBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1MgZ2xvYmFsIGNvbnRleHQgcG9pbnRlcgorICAgT1VUCisgICAgICAgIHVBdmFpbGFibGVUeEJ1ZiAgICAgICBhdmFpbGFibGUgVFggUERVIG51bWJkZXIuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMIHJldHVybnMgaXQgZm9yIE5PTiBpbnRlZ3JhdGVkIFNPQworICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgaXMgTlVMTCBhbmQgb3RoZXIgZXJyb3JzIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMgCitXREFfRFNfUmVnaXN0ZXIgCisoIAorICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgIHB2b3NHQ3R4LCAKKyAgV0RBX0RTX1R4Q29tcGxldGVDYWxsYmFjayBwZm5UeENvbXBsZXRlQ2FsbGJhY2ssCisgIFdEQV9EU19SeFBhY2tldENhbGxiYWNrICAgcGZuUnhQYWNrZXRDYWxsYmFjaywgCisgIFdEQV9EU19UeFBhY2tldENhbGxiYWNrICAgcGZuVHhQYWNrZXRDYWxsYmFjaywKKyAgV0RBX0RTX1Jlc291cmNlQ0IgICAgICAgICBwZm5SZXNvdXJjZUNCLAorICB2X1UzMl90ICAgICAgICAgICAgICAgICAgIHVSZXNUaGVzaG9sZCwKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICBwQ2FsbGJhY2tDb250ZXh0LAorICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICp1QXZhaWxhYmxlVHhCdWYKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0RBX0RTX1N0YXJ0WG1pdAorCisgIERFU0NSSVBUSU9OIAorICAgIFNlcmlhbGl6ZSBUWCB0cmFuc21pdCByZXF1ZXMgdG8gVFggdGhyZWFkLiAKKworICBUT0RPIFRoaXMgc2VuZHMgVFggdHJhbnNtaXQgcmVxdWVzdCB0byBUTC4gSXQgc2hvdWxkIHNlbmQgdG8gV0RJIGZvcgorICAgICAgICAgYWJzdHJhY3Rpb24uCisKKyAgICBGb3IgTk9OIGludGVncmF0ZWQgU09DLCB0aGlzIGZ1bmN0aW9uIGNhbGxzIFdMQU5CQUxfU3RhcnRYbWl0CisKKyAgREVQRU5ERU5DSUVTIAorICAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgSU4KKyAgICAgICAgcHZvc0dDdHggICAgVk9TIGNvbnRleHQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXREFfRFNfU3RhcnRYbWl0CisoCisgIHZfUFZPSURfdCBwdm9zR0N0eAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXREFfRFNfRmluaXNoVUxBCisKKyAgREVTQ1JJUFRJT04gCisgICAgU2VyaWFsaXplIEZpbmlzaCBVcHBlciBMZXZlbCBBdXRoZW50aWNhdGlvbiByZXF1ZXMgdG8gVFggdGhyZWFkLiAKKworICBERVBFTkRFTkNJRVMgCisgICAgIAorICBQQVJBTUVURVJTIAorCisgICBJTgorICAgICAgICBjYWxsYmFja1JvdXRpbmUgICAgcm91dGluZSB0byBiZSBjYWxsZWQgaW4gVFggdGhyZWFkCisgICAgICAgIGNhbGxiYWNrQ29udGV4dCAgICB1c2VyIGRhdGEgZm9yIHRoZSBhYm92ZSByb3V0aW5lIAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIHBsZWFzZSBzZWUgdm9zX3R4X21xX3NlcmlhbGl6ZQorCisgIFNJREUgRUZGRUNUUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dEQV9EU19GaW5pc2hVTEEKKygKKyB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0KSwKKyB2b2lkICAqY2FsbGJhY2tDb250ZXh0CispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfQnVpbGRUeFBhY2tldEluZm8KKworICBERVNDUklQVElPTgorICAgIEJ1aWxkIFRYIG1ldGEgaW5mbyBmb3IgaW50ZWdyYXRlZCBTT0MuCisgICAgCisgICAgU2FtZSBmdW5jdGlvbiBjYWxscyBIQUwgZm9yIHJlc2VydmUgQkQgaGVhZGVyIHNwYWNlIGludG8gVk9TIHBhY2tldCBhbmQKKyAgICBIQUwgZnVuY3Rpb24gdG8gZmlsbCBpdC4KKyAgICAKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgIHB2b3NHQ3R4ICAgICAgICAgVk9TIGNvbnRleHQKKyAgICB2b3NEYXRhQnVmZiAgICAgIHZvcyBkYXRhIGJ1ZmZlcgorICAgIHB2RGVzdE1hY0FkZHIgICBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyBwb250ZXIKKyAgICB1Y0Rpc2FibGVGcm1YdGwgIElzIGZyYW1lIHh0bCBkaXNhYmxlZD8KKyAgICB1Y1Fvc0VuYWJsZWQgICAgIElzIFFvUyBlbmFibGVkPworICAgIHVjV0RTRW5hYmxlZCAgICAgSXMgV0RTIGVuYWJsZWQ/CisgICAgZXh0cmFIZWFkU3BhY2UgICBFeHRyYSBoZWFkIGJ5dGVzLiBJZiBpdCdzIG5vdCAwIGR1ZSB0byA0IGJ5dGVzIGFsaWduCisgICAgICAgICAgICAgICAgICAgICBvZiBCRCBoZWFkZXIuCisgICAgdHlwZVN1YnR5cGUgICAgICB0eXBlU3VidHlwZSBmcm9tIE1BQyBoZWFkZXIgb3IgVFggbWV0YWluZm8vQkQKKyAgICBwQWRkcjIgICAgICAgICAgIGFkZHJlc3MgMgorICAgIHVUaWQgICAgICAgICAgICAgdGlkCisgICAgdHhGbGFnCisgICAgdGltZVN0YW1wCisgICAgdWNJc0VhcG9sCisgICAgdWNVUAorCisgICBPVVQKKyAgICAqcHVzUGt0TGVuICAgICAgIFBhY2tldCBsZW5ndGgKKworICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXREFfRFNfQnVpbGRUeFBhY2tldEluZm8KKygKKyAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAorICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYsCisgIHZfTUFDQUREUl90KiAgICBwdkRlc3RNYWNBZGRyLAorICB2X1U4X3QgICAgICAgICAgdWNEaXNhYmxlRnJtWHRsLAorICB2X1UxNl90KiAgICAgICAgcHVzUGt0TGVuLAorICB2X1U4X3QgICAgICAgICAgdWNRb3NFbmFibGVkLAorICB2X1U4X3QgICAgICAgICAgdWNXRFNFbmFibGVkLAorICB2X1U4X3QgICAgICAgICAgZXh0cmFIZWFkU3BhY2UsCisgIHZfVThfdCAgICAgICAgICB0eXBlU3VidHlwZSwKKyAgdl9QVk9JRF90ICAgICAgIHBBZGRyMiwKKyAgdl9VOF90ICAgICAgICAgIHVUaWQsCisgIHZfVThfdCAgICAgICAgICB0eEZsYWcsCisgIHZfVTMyX3QgICAgICAgICB0aW1lU3RhbXAsCisgIHZfVThfdCAgICAgICAgICB1Y0lzRWFwb2wsCisgIHZfVThfdCAgICAgICAgICB1Y1VQCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfUGVla1J4UGFja2V0SW5mbworCisgIERFU0NSSVBUSU9OCisgICAgUmV0dXJuIFJYIG1ldGFpbmZvIHBvaW50ZXIgZm9yIGZvciBpbnRlZ3JhdGVkIFNPQy4KKyAgICAKKyAgICBTYW1lIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEJEIGhlYWRlciBwb2ludGVyLgorICAgIAorICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgdm9zRGF0YUJ1ZmYgICAgICB2b3MgZGF0YSBidWZmZXIKKworICAgIHB2RGVzdE1hY0FkZHIgICAgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgcG9udGVyCisgICAgYlN3YXAgICAgICAgICAgICBXYW50IHRvIHN3YXAgQkQgaGVhZGVyPyBGb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eQorICAgICAgICAgICAgICAgICAgICAgSXQgZG9lcyBub3RoaW5nIGZvciBpbnRlZ3JhdGVkIFNPQworICAgT1VUCisgICAgKnBwUnhIZWFkZXIgICAgICBSWCBtZXRhaW5mbyBwb2ludGVyCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciBpcyBOVUxMIGFuZCBvdGhlciBlcnJvcnMgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0RBX0RTX1BlZWtSeFBhY2tldEluZm8KKygKKyAgdm9zX3BrdF90ICp2b3NEYXRhQnVmZiwKKyAgdl9QVk9JRF90ICpwcFJ4SGVhZGVyLAorICB2X0JPT0xfdCAgYlN3YXAKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICAgIFdEQV9EU19UcmltUnhQYWNrZXRJbmZvCisKKyAgREVTQ1JJUFRJT04KKyAgICBUcmltL1JlbW92ZSBSWCBCRCBoZWFkZXIgZm9yIE5PTiBpbnRlZ3JhdGVkIFNPQy4KKyAgICBJdCBkb2VzIG5vdGhpbmcgZm9yIGludGVncmF0ZWQgU09DLgorICAgIAorICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgdm9zRGF0YUJ1ZmYgICAgICB2b3MgZGF0YSBidWZmZXIKKworICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXREFfRFNfVHJpbVJ4UGFja2V0SW5mbworKCAKKyAgdm9zX3BrdF90ICp2b3NEYXRhQnVmZgorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgV0RBX0RTX0dldFR4UmVzb3VyY2VzCisKKyAgREVTQ1JJUFRJT04KKyAgICBJdCBkb2VzIHJldHVybiBoYXJkY29kZWQgdmFsdWUgZm9yIFByaW1hLiBJdCBzaG91bGQgYmlnZ2VyIG51bWJlciB0aGFuIDAuCisgICAgUmV0dXJuaW5nIDAgd2lsbCBwdXQgVEwgaW4gb3V0LW9mLXJlc291cmNlIGNvbmRpdGlvbiBmb3IgVFguCisKKyAgICBSZXR1cm4gY3VycmVudCBQRFUgcmVzb3VyY2VzIGZyb20gQkFMIGZvciBOT04gaW50ZWdyYXRlZCBTT0MuCisgICAgCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICB2b3NEYXRhQnVmZiAgICAgIHZvcyBkYXRhIGJ1ZmZlcgorICAgCisgICBPVVQKKyAgICBwdVJlc0NvdW50ICAgICAgICBhdmFpbGFibGUgUERVIG51bWJlciBmb3IgVFgKKworICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXREFfRFNfR2V0VHhSZXNvdXJjZXMKKyggCisgIHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgdl9VMzJfdCogIHB1UmVzQ291bnQKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICAgIFdEQV9EU19HZXRSc3NpCisKKyAgREVTQ1JJUFRJT04KKyAgICBHZXQgUlNTSSAKKworICBUT0RPIEl0IHJldHVybnMgaGFyZGNvZGVkIHZhbHVlIGluIHRoZSBtZWFudGltZSBzaW5jZSBXREEvV0RJIGRvZXMgbm90aGluZworICAgICAgIHN1cHBvcnQgaXQgeWV0IGZvciBQcmltYS4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgdm9zRGF0YUJ1ZmYgICAgICB2b3MgZGF0YSBidWZmZXIKKworICAgT1VUCisgICAgcHVSc3NpICAgICAgICAgICBSU1NJCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciBpcyBOVUxMIGFuZCBvdGhlciBlcnJvcnMgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0RBX0RTX0dldFJzc2kKKygKKyAgdl9QVk9JRF90IHB2b3NHQ3R4LAorICB2X1M3X3QqICAgcHVSc3NpCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfUnhBbXNkdUJkRml4CisKKyAgREVTQ1JJUFRJT04KKyAgICBGb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSB3aXRoIExpYnJhL1ZvbGFucy4gTmVlZCB0byBjYWxsIEhBTCBmdW5jdGlvbgorICAgIGZvciBIVyBCRCBidWcgZml4CisKKyAgICBJdCBkb2VzIG5vdGhpbmcgZm9yIGludGVncmF0ZWQgU09DLgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0CisgICAgcHZCREhlYWRlciAgICAgICBCRCBoZWFkZXIgcG9pbnRlcgorCisgICBPVVQKKworICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXREFfRFNfUnhBbXNkdUJkRml4CisoCisgIHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgdl9QVk9JRF90IHB2QkRIZWFkZXIKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICAgIFdEQV9EU19HZXRGcmFtZVR5cGVTdWJUeXBlCisKKyAgREVTQ1JJUFRJT04KKyAgICBHZXQgdHlwZVN1YnR5cGUgZnJvbSB0aGUgcGFja2V0LiBUaGUgQkQgaGVhZGVyIHNob3VsZCBoYXZlIHRoaXMuCisgICAgQnV0IHNvbWUgcmVhc29uLCBMaWJyYS9Wb2xhbnMgcmVhZCBpdCBmcm9tIDgwMi4xMSBoZWFkZXIgYW5kIHNhdmUgaXQKKyAgICBiYWNrIHRvIEJEIGhlYWRlci4gU28gZm9yIE5PTiBpbnRlZ3JhdGVkIFNPQywgdGhpcyBmdW5jdGlvbiBkb2VzCisgICAgdGhlIHNhbWUuCisKKyAgICBGb3IgaW50ZWdyYXRlZCBTT0MsIFdESSBkb2VzIHRoZSBzYW1lLCBub3QgVEwuIAorICAgIEl0IGRvZXMgcmV0dXJuIHR5cGVTdWJ0eXBlIGZyb20gUlggbWV0YSBpbmZvIGZvciBpbnRlZ3JhdGVkIFNPQy4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgcHZvc0dDdHggICAgICAgICBWT1MgY29udGV4dAorICAgIHZvc0RhdGFCdWZmICAgICAgdm9zIGRhdGEgYnVmZmVyCisgICAgcFJ4SGVhZGVyICAgICAgICBSWCBtZXRhIGluZm8gb3IgQkQgaGVhZGVyIHBvaW50ZXIKKworICAgT1VUCisgICAgdWNUeXBlU3VidHlwZSAgICB0eXBlU3VidHlwZQorCisgIFJFVFVSTiBWQUxVRQorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgaXMgTlVMTCBhbmQgb3RoZXIgZXJyb3JzIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dEQV9EU19HZXRGcmFtZVR5cGVTdWJUeXBlCisoCisgIHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgdm9zX3BrdF90ICp2b3NEYXRhQnVmZiwKKyAgdl9QVk9JRF90IHBSeEhlYWRlciwKKyAgdl9VOF90ICAgICp1Y1R5cGVTdWJ0eXBlCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfR2V0UmVwbGF5Q291bnRlcgorCisgIERFU0NSSVBUSU9OCisgICAgUmV0dXJuIHJlcGxheSBjb3VudGVyIGZyb20gQkQgaGVhZGVyIG9yIFJYIG1ldGEgaW5mbworCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBwUnhIZWFkZXIgICAgICAgIFJYIG1ldGEgaW5mbyBvciBCRCBoZWFkZXIgcG9pbnRlcgorCisgICBPVVQKKworICBSRVRVUk4gVkFMVUUKKyAgICBSZXBsYXkgQ291bnRlcgorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZfVTY0X3QKK1dEQV9EU19HZXRSZXBsYXlDb3VudGVyCisoCisgIHZfUFZPSURfdCBwUnhIZWFkZXIKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZVTkNUSU9OICAgIFdEQV9EU19HZXRSZXBsYXlDb3VudGVyCisKKyAgREVTQ1JJUFRJT04KKyAgICBITyBzdXBwb3J0LiBTZXQgUlNTSSB0aHJlc2hvbGQgdmlhIEhBTCBmdW5jdGlvbiBmb3IgTk9OIGludGVncmF0ZWQgU09DCisKKyAgVE9ETworICAgIFNhbWUgZnVuY3Rpb24gc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IFdEQS9XREkgZm9yIFByaW1hLgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBwTWFjICAgICAgICAgICAgIE1BQyBnbG9iYWwgcG9pbnRlcgorICAgIHBUaHJlc2hvbGRzICAgICAgcG9pbnRlciBvZiB0aHJlc2hvbGQgc3RydWN0dXJlIHRvIHNldC4KKworICAgT1VUCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciBpcyBOVUxMIGFuZCBvdGhlciBlcnJvcnMgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0RBX0RTX1NldFJTU0lUaHJlc2hvbGRzCisoCisgIHRwQW5pU2lyR2xvYmFsICAgICAgcE1hYywKKyAgdHBTaXJSU1NJVGhyZXNob2xkcyBwVGhyZXNob2xkcworKTsKKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfVHhGcmFtZXMKKworICBERVNDUklQVElPTgorICAgIFB1bGwgcGFja2V0cyBmcm9tIFRMIGFuZCBwdXNoIHRoZW0gdG8gV0RJLiBJdCBnZXRzIGludm9rZWQgdXBvbgorICAgIFdEQV9EU19UWF9TVEFSVF9YTUlULgorCisgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmVsYW50IG9mIFdMQU5TU0NfVHJhbnNtaXQgaW4gTGlicmEvVm9sYW5zLgorCisgIFRPRE8KKyAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhbmQgbW92ZWQgaW4gV0RJLgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0CisKKyAgIE9VVAorCisgIFJFVFVSTiBWQUxVRQorICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgaXMgTlVMTCBhbmQgb3RoZXIgZXJyb3JzIAorICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1ZPU19TVEFUVVMKK1dEQV9EU19UeEZyYW1lcworKCAKKyAgdl9QVk9JRF90IHB2b3NHQ3R4IAorKTsKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfVHhGbG93Q29udHJvbENhbGxiYWNrCisKKyAgREVTQ1JJUFRJT04KKyAgICBJbnZva2VkIGJ5IFdESSB0byBjb250cm9sIFRYIGZsb3cuCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgIHB2b3NHQ3R4ICAgICAgICAgVk9TIGNvbnRleHQKKyAgICB1Rmxvd01hc2sgICAgICAgIFRYIGNoYW5uZWwgbWFzayBmb3IgZmxvdyBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICBEZWZpbmVkIGluIFdEQV9UWEZsb3dFbnVtVHlwZQorCisgICBPVVQKKworICBSRVRVUk4gVkFMVUUKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1ZPSURfdAorV0RBX0RTX1R4Rmxvd0NvbnRyb2xDYWxsYmFjaworKAorIHZfUFZPSURfdCBwdm9zR0N0eCwKKyB2X1U4X3QgICAgdUZsb3dNYXNrCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfR2V0VHhGbG93TWFzaworCisgIERFU0NSSVBUSU9OCisgICAgcmV0dXJuIFRYIGZsb3cgbWFzayBjb250cm9sIHZhbHVlCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgIHB2b3NHQ3R4ICAgICAgICAgVk9TIGNvbnRleHQKKworICAgT1VUCisgICAgdUZsb3dNYXNrICAgICAgICBUWCBjaGFubmVsIG1hc2sgZm9yIGZsb3cgY29udHJvbAorICAgICAgICAgICAgICAgICAgICAgRGVmaW5lZCBpbiBXREFfVFhGbG93RW51bVR5cGUKKworICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXREFfRFNfR2V0VHhGbG93TWFzaworKAorIHZfUFZPSURfdCBwdm9zR0N0eCwKKyB2X1U4X3QqICAgcHVGbG93TWFzaworKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgV0RBX0hBTER1bXBDbWRSZXEKKworICBERVNDUklQVElPTgorICAgIFNlbmQgRHVtcCBjb21tYW5kc3RvIFdESQorICAgIAorICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgcE1hYyAgICAgICAgICAgICBNQUMgZ2xvYmFsIHBvaW50ZXIKKyAgICBjbWQgICAgICAgICAgICAgICBIYWwgZHVtcCBjb21tYW5kCisgICAgYXJnMSAgICAgICAgICAgICAgRHVtcCBjb21tYW5kIGFyZ3VtZW50IDEKKyAgICBhcmcyICAgICAgICAgICAgICBEdW1wIGNvbW1hbmQgYXJndW1lbnQgMgorICAgIGFyZzMgICAgICAgICAgICAgIER1bXAgY29tbWFuZCBhcmd1bWVudCAzCisgICAgYXJnNCAgICAgICAgICAgICAgRHVtcCBjb21tYW5kIGFyZ3VtZW50IDQKKworICAgT1VUCisgICAgICAgcEJ1ZmZlciAgICAgICAgICBEdW1wIGNvbW1hbmQgUmVzcG9uc2UgYnVmZmVyCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciBpcyBOVUxMIGFuZCBvdGhlciBlcnJvcnMgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXREFfSEFMRHVtcENtZFJlcSh0cEFuaVNpckdsb2JhbCAgIHBNYWMsdEFOSV9VMzIgY21kLCAKKyAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICBhcmcxLCB0QU5JX1UzMiAgIGFyZzIsIHRBTklfVTMyICAgYXJnMywKKyAgICAgICAgICAgICAgICAgdEFOSV9VMzIgICBhcmc0LCB0QU5JX1U4ICAgKnBCdWZmZXIpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfZmVhdHVyZUNhcHNFeGNoYW5nZQorCisgIERFU0NSSVBUSU9OCisgICAgV0RBIEFQSSB0byBpbnZva2UgY2FwYWJpbGl0eSBleGNoYW5nZSBiZXR3ZWVuIGhvc3QgYW5kIEZXCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgIHBWb3NDb250ZXh0ICAgICAgICAgVk9TIGNvbnRleHQKKworICAgT1VUCisgICAgTk9ORQorCisgIFJFVFVSTiBWQUxVRQorICAgIE5PTkUKKyAgICAKKyAgU0lERSBFRkZFQ1RTCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgV0RBX2ZlYXR1cmVDYXBzRXhjaGFuZ2Uodl9QVk9JRF90IHBWb3NDb250ZXh0KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgV0RBX2dldEhvc3RXbGFuRmVhdENhcHMKKworICBERVNDUklQVElPTgorICAgIFdyYXBwZXIgZm9yIFdESSBBUEksIHRoYXQgd2lsbCByZXR1cm4gaWYgdGhlIGZlYXR1cmUgKGVudW0gdmFsdWUpLnBhc3NlZAorICAgIHRvIHRoaXMgQVBJIGlzIHN1cHBvcnRlZCBvciBub3QgaW4gSG9zdAorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBmZWF0RW51bVZhbHVlICAgICBlbnVtIHZhbHVlIGZvciB0aGUgZmVhdHVyZSBhcyBpbiBwbGFjZUhvbGRlckluQ2FwQml0bWFwIGluIHdsYW5faGFsX21zZy5oLgorCisgICBPVVQKKyAgICBOT05FCisKKyAgUkVUVVJOIFZBTFVFCisgICAgMCAtIGltcGxpZXMgZmVhdHVyZSBpcyBOT1QgU3VwcG9ydGVkCisgICAgYW55IG5vbiB6ZXJvIHZhbHVlIC0gaW1wbGllcyBmZWF0dXJlIGlzIFNVUFBPUlRFRAorICAgIAorICBTSURFIEVGRkVDVFMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordEFOSV9VOCBXREFfZ2V0SG9zdFdsYW5GZWF0Q2Fwcyh0QU5JX1U4IGZlYXRFbnVtVmFsdWUpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfZ2V0RndXbGFuRmVhdENhcHMKKworICBERVNDUklQVElPTgorICAgIFdyYXBwZXIgZm9yIFdESSBBUEksIHRoYXQgd2lsbCByZXR1cm4gaWYgdGhlIGZlYXR1cmUgKGVudW0gdmFsdWUpLnBhc3NlZAorICAgIHRvIHRoaXMgQVBJIGlzIHN1cHBvcnRlZCBvciBub3QgaW4gRlcKKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgZmVhdEVudW1WYWx1ZSAgICAgZW51bSB2YWx1ZSBmb3IgdGhlIGZlYXR1cmUgYXMgaW4gcGxhY2VIb2xkZXJJbkNhcEJpdG1hcCBpbiB3bGFuX2hhbF9tc2cuaC4KKworICAgT1VUCisgICAgTk9ORQorCisgIFJFVFVSTiBWQUxVRQorICAgIDAgLSBpbXBsaWVzIGZlYXR1cmUgaXMgTk9UIFN1cHBvcnRlZAorICAgIGFueSBub24gemVybyB2YWx1ZSAtIGltcGxpZXMgZmVhdHVyZSBpcyBTVVBQT1JURUQKKyAgICAKKyAgU0lERSBFRkZFQ1RTCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3RBTklfVTggV0RBX2dldEZ3V2xhbkZlYXRDYXBzKHRBTklfVTggZmVhdEVudW1WYWx1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9XREEvaW5jL3dsYW5fcWN0X3dkYV9tc2cuaCBiL0NPUkUvV0RBL2luYy93bGFuX3FjdF93ZGFfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyYzIxNwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RBL2luYy93bGFuX3FjdF93ZGFfbXNnLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgV0xBTl9RQ1RfTVNHX01BUF9ICisjZGVmaW5lIFdMQU5fUUNUX01TR19NQVBfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICBXIEwgQSBOICAgREVWSUNFIEFEQVBUQVRJT04gICBMIEEgWSBFIFIgCisgICAgICAgICAgICAgICAgICAgICAgIE1TRyBNQVBQSU5HICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAKK0RFU0NSSVBUSU9OCisgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZXh0ZXJuYWwgQVBJIGV4cG9zZWQgYnkgdGhlIHdsYW4gYWRhcHRhdGlvbiBsYXllciAKKyAgCisgICAgICAKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKK3doZW4gICAgICAgIHdobyAgICAgICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgICAtLS0gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyNS8wOC8yMDEwICBhZHdpdmVkaSAgICAgTUFQIFdEQSBtZXNzYWdlcyBvbiBMZWdhY3kgSEFMIG1lc3NhZ2VzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogQWRkIEluY2x1ZGUgKi8KKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWNrX2FsaWduLmgiCisKKworI2RlZmluZSAgICAgIFdEQV9DT05GSUdfUEFSQU1fVVBEQVRFX1JFUSAgICBTSVJfQ0ZHX1BBUkFNX1VQREFURV9JTkQKKworI2RlZmluZSAgICAgQUxJR05FRF9XT1JEX1NJWkUgICAgICAgNAorCisvKiBDb25maWcgZm9ybWF0IHJlcXVpcmVkIGJ5IEhBTCBmb3IgZWFjaCBDRkcgaXRlbSovCitXUFRfUEFDS19TVEFSVAordHlwZWRlZiBXUFRfUEFDS19QUkUgc3RydWN0Cit7CisgICAvKiBDZmcgSWQuIFRoZSBJZCByZXF1aXJlZCBieSBIQUwgaXMgZXhwb3J0ZWQgYnkgSEFMCisgICAgKiBpbiBzaGFyZWQgaGVhZGVyIGZpbGUgYmV0d2VlbiBVTUFDIGFuZCBIQUwuKi8KKyAgIHRBTklfVTE2ICAgdHlwZTsKKworICAgLyogTGVuZ3RoIG9mIHRoZSBDZmcuIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gZ28gdG8gbmV4dCBjZmcgCisgICAgKiBpbiB0aGUgVExWIGZvcm1hdC4qLworICAgdEFOSV9VMTYgICBsZW5ndGg7CisKKyAgIC8qIFBhZGRpbmcgYnl0ZXMgZm9yIHVuYWxpZ25lZCBhZGRyZXNzJ3MgKi8KKyAgIHRBTklfVTE2ICAgIHBhZEJ5dGVzOworCisgICAvKiBSZXNlcnZlIGJ5dGVzIGZvciBtYWtpbmcgY2ZnVmFsIHRvIGFsaWduIGFkZHJlc3MgKi8KKyAgIHRBTklfVTE2ICAgIHJlc2VydmVkOworCisgICAvKiBGb2xsb3dpbmcgdGhlIHVDZmdMZW4gZmllbGQgdGhlcmUgc2hvdWxkIGJlIGEgJ3VDZmdMZW4nIGJ5dGVzCisgICAgKiBjb250YWluaW5nIHRoZSB1Q2ZnVmFsdWUgOyB0QU5JX1U4IHVDZmdWYWx1ZVt1Q2ZnTGVuXSAqLworfVdQVF9QQUNLX1BPU1QgdEhhbENmZywgKnRwSGFsQ2ZnOworV1BUX1BBQ0tfRU5ECisKKy8vLy8vI2RlZmluZSBXREFfVVQKKyNpZmRlZiBXREFfVVQKKyNkZWZpbmUgICAgICBXREFfV0RJX0VWRU5UX01TRyAgICAgICAgICAgICAgICAweDAwRkYKK3ZvaWQgV0RJX3Byb2Nlc3NFdmVudCh2b2lkICp3ZGlFdmVudERhdGEsIHZvaWQgKnBVc2VyRGF0YSk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1dEQS9zcmMvd2xhbl9udi5jIGIvQ09SRS9XREEvc3JjL3dsYW5fbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I0NTNiCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREEvc3JjL3dsYW5fbnYuYwpAQCAtMCwwICsxLDg3NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisKKworICAgIFxmaWxlIHdsYW5fbnYuYworCisgICBcYnJpZWYgQ29udGFpbnMgY29sbGVjdGlvbiBvZiB0YWJsZSBkZWZhdWx0IHZhbHVlcyB0byB1c2UgaW4KKyAgICAgICAgICBjYXNlIGEgdGFibGUgaXMgbm90IGZvdW5kIGluIE5WCisKKyAgICAkSWQkCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgV0xBTl9OVl9DCisjZGVmaW5lIFdMQU5fTlZfQworCisjaWZuZGVmIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQworCisjaW5jbHVkZSAid2xhbl9udi5oIgorCitjb25zdCBzSGFsTnYgbnZEZWZhdWx0cyA9Cit7CisgICAgeworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdEFOSV9VMTYgIHByb2R1Y3RJZDsKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRBTklfVTggICBwcm9kdWN0QmFuZHM7CisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0QU5JX1U4ICAgd2xhbk52UmV2SWQ7IC8vMDogV0NOMTMxMiwgMTogV0NOMTMxNCwgMjogV0NOMzY2MAorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdEFOSV9VOCAgIG51bU9mVHhDaGFpbnM7CisgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0QU5JX1U4ICAgbnVtT2ZSeENoYWluczsKKyAgICAgICAgeyAweDAwLCAweERFLCAweEFELCAweEJFLCAweEVGLCAweDAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRBTklfVTggICBtYWNBZGRyW05WX0ZJRUxEX01BQ19BRERSX1NJWkVdOworICAgICAgICB7ICJcMCIgfQorICAgIH0sIC8vZmllbGRzCisKKyAgICB7CisgICAgICAgIC8vIE5WX1RBQkxFX1JBVEVfUE9XRVJfU0VUVElOR1MKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdHlwZWRlZiB0QU5JX1M4IHRQb3dlcmRCbTsKKyAgICAgICAgICAgIC8vdHlwZWRlZiB0UG93ZXJkQm0gdFJhdGVHcm91cFB3cltOVU1fSEFMX1BIWV9SQVRFU107CisgICAgICAgICAgICAvL3RSYXRlR3JvdXBQd3IgICAgICAgcHdyT3B0aW11bVtOVU1fUkZfU1VCQkFORFNdOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLzgwMi4xMWIgUmF0ZXMKKyAgICAgICAgICAgICAgICB7MjE1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfTE9OR18xX01CUFMsCisgICAgICAgICAgICAgICAgezIxNTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX0xPTkdfMl9NQlBTLAorICAgICAgICAgICAgICAgIHsyMTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9MT05HXzVfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsyMTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9MT05HXzExX01CUFMsCisgICAgICAgICAgICAgICAgezIxNTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX1NIT1JUXzJfTUJQUywKKyAgICAgICAgICAgICAgICB7MjE1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfU0hPUlRfNV81X01CUFMsCisgICAgICAgICAgICAgICAgezIxNTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX1NIT1JUXzExX01CUFMsCisKKyAgICAgICAgICAgICAgICAgICAgLy9TTFIgUmF0ZXMKKyAgICAgICAgICAgICAgICB7MjE1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9TTFJfMF8yNV9NQlBTLAorICAgICAgICAgICAgICAgIHsyMTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX1NMUl8wXzVfTUJQUywKKworICAgICAgICAgICAgICAgICAgICAvLzExQSAyME1IeiBSYXRlcworICAgICAgICAgICAgICAgIHsxNzUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV82X01CUFMsCisgICAgICAgICAgICAgICAgezE3NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzlfTUJQUywKKyAgICAgICAgICAgICAgICB7MTc1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfMTJfTUJQUywKKyAgICAgICAgICAgICAgICB7MTc1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfMThfTUJQUywKKyAgICAgICAgICAgICAgICB7MTc1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfMjRfTUJQUywKKyAgICAgICAgICAgICAgICB7MTc1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfMzZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTc1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfNDhfTUJQUywKKyAgICAgICAgICAgICAgICB7MTc1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfNTRfTUJQUywKKworICAgICAgICAgICAgICAgICAgICAvL01DUyBJbmRleCAjMC0xNSAoMjBNSHopCisgICAgICAgICAgICAgICAgezE3NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNl81X01CUFMsCisgICAgICAgICAgICAgICAgezE3NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMTNfTUJQUywKKyAgICAgICAgICAgICAgICB7MTc1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU18xOV81X01CUFMsCisgICAgICAgICAgICAgICAgezE3NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMjZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTc1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU18zOV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNzUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzUyX01CUFMsCisgICAgICAgICAgICAgICAgezE2NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNThfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzY1X01CUFMsCisgICAgICAgICAgICAgICAgezE3NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfN18yX01CUFMsCisgICAgICAgICAgICAgICAgezE3NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfMTRfNF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNzUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzIxXzdfTUJQUywKKyAgICAgICAgICAgICAgICB7MTc1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR18yOF85X01CUFMsCisgICAgICAgICAgICAgICAgezE3NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfNDNfM19NQlBTLAorICAgICAgICAgICAgICAgIHsxNzUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzU3XzhfTUJQUywKKyAgICAgICAgICAgICAgICB7MTY1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR182NV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSAgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzcyXzJfTUJQUywKKyAgICAgICAgICAgIH0sICAvLyAgICBSRl9TVUJCQU5EXzJfNF9HSFosCisgICAgICAgIH0sCisKKworICAgICAgICAvLyBOVl9UQUJMRV9SRUdVTEFUT1JZX0RPTUFJTlMKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdHlwZWRlZiBzdHJ1Y3QKKyAgICAgICAgICAgIC8vIHsKKyAgICAgICAgICAgIC8vICAgICB0QU5JX0JPT0xFQU4gZW5hYmxlZDsKKyAgICAgICAgICAgIC8vICAgICB0UG93ZXJkQm0gcHdyTGltaXQ7CisgICAgICAgICAgICAvLyB9c1JlZ3VsYXRvcnlDaGFubmVsOworCisgICAgICAgICAgICAvLyB0eXBlZGVmIHN0cnVjdAorICAgICAgICAgICAgLy8geworICAgICAgICAgICAgLy8gICAgIHNSZWd1bGF0b3J5Q2hhbm5lbCBjaGFubmVsc1tOVU1fUkZfQ0hBTk5FTFNdOworICAgICAgICAgICAgLy8gICAgIHVBYnNQd3JQcmVjaXNpb24gYW50ZW5uYUdhaW5bTlVNX1JGX1NVQkJBTkRTXTsKKyAgICAgICAgICAgIC8vICAgICB1QWJzUHdyUHJlY2lzaW9uIGJSYXRlUG93ZXJPZmZzZXRbTlVNXzJfNEdIWl9DSEFOTkVMU107CisgICAgICAgICAgICAvLyB9c1JlZ3VsYXRvcnlEb21haW5zOworCisgICAgICAgICAgICAvL3NSZWd1bGF0b3J5RG9tYWlucyAgcmVnRG9tYWluc1tOVU1fUkVHX0RPTUFJTlNdOworCisKKyAgICAgICAgICAgIHsgICAvLyBSRUdfRE9NQUlOX0ZDQyBzdGFydAorICAgICAgICAgICAgICAgIHsgLy9zUmVndWxhdG9yeUNoYW5uZWwgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9lbmFibGVkLCBwd3JMaW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIzfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIzfSwgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIzfSwgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIzfSwgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIzfSwgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIzfSwgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIzfSwgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIzfSwgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIzfSwgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIyfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMn0sICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fRkFMU0UsIDMwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9GQUxTRSwgMzB9LCAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX0ZBTFNFLCAzMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisKKyAgICAgICAgICAgICAgICB9LCAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBlbmQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgLy8gUkZfU1VCQkFORF8yXzRfR0haCisgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIHsgLy8gYlJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9LCAvLyBiUmF0ZVBvd2VyT2Zmc2V0IGVuZAorCisgICAgICAgICAgICAgICAgeyAvLyBnblJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IGVuZAorICAgICAgICAgICAgfSwgLy8gUkVHX0RPTUFJTl9GQ0MgZW5kCisKKyAgICAgICAgICAgIHsgICAvLyBSRUdfRE9NQUlOX0VUU0kgc3RhcnQKKyAgICAgICAgICAgICAgICB7IC8vc1JlZ3VsYXRvcnlDaGFubmVsIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxlZCwgcHdyTGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE5fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxOX0sICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fRkFMU0UsIDMwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKworICAgICAgICAgICAgICAgIH0sIC8vc1JlZ3VsYXRvcnlDaGFubmVsIGVuZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAvLyBSRl9TVUJCQU5EXzJfNF9HSFoKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgeyAvLyBiUmF0ZVBvd2VyT2Zmc2V0IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorICAgICAgICAgICAgICAgIH0sIC8vIGJSYXRlUG93ZXJPZmZzZXQgZW5kCisKKyAgICAgICAgICAgICAgICB7IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorICAgICAgICAgICAgICAgIH0gLy8gZ25SYXRlUG93ZXJPZmZzZXQgZW5kCisgICAgICAgICAgICB9LCAvLyBSRUdfRE9NQUlOX0VUU0kgZW5kCisKKyAgICAgICAgICAgIHsgICAvLyBSRUdfRE9NQUlOX0pBUEFOIHN0YXJ0CisgICAgICAgICAgICAgICAgeyAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvL2VuYWJsZWQsIHB3ckxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE4fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKworICAgICAgICAgICAgICAgIH0sIC8vc1JlZ3VsYXRvcnlDaGFubmVsIGVuZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAvLyBSRl9TVUJCQU5EXzJfNF9HSFoKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgeyAvLyBiUmF0ZVBvd2VyT2Zmc2V0IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorICAgICAgICAgICAgICAgIH0sIC8vIGJSYXRlUG93ZXJPZmZzZXQgZW5kCisKKyAgICAgICAgICAgICAgICB7IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorICAgICAgICAgICAgICAgIH0gLy8gZ25SYXRlUG93ZXJPZmZzZXQgZW5kCisgICAgICAgICAgICB9LCAvLyBSRUdfRE9NQUlOX0pBUEFOIGVuZAorCisgICAgICAgICAgICB7ICAgLy8gUkVHX0RPTUFJTl9XT1JMRCBzdGFydAorICAgICAgICAgICAgICAgIHsgLy9zUmVndWxhdG9yeUNoYW5uZWwgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9lbmFibGVkLCBwd3JMaW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fRkFMU0UsIDB9LCAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX0ZBTFNFLCAwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9GQUxTRSwgMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisKKyAgICAgICAgICAgICAgICB9LCAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBlbmQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgLy8gUkZfU1VCQkFORF8yXzRfR0haCisgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIHsgLy8gYlJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9LCAvLyBiUmF0ZVBvd2VyT2Zmc2V0IGVuZAorCisgICAgICAgICAgICAgICAgeyAvLyBnblJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IGVuZAorICAgICAgICAgICAgfSwgLy8gUkVHX0RPTUFJTl9XT1JMRCBlbmQKKworICAgICAgICAgICAgeyAgIC8vIFJFR19ET01BSU5fTl9BTUVSX0VYQ19GQ0Mgc3RhcnQKKyAgICAgICAgICAgICAgICB7IC8vc1JlZ3VsYXRvcnlDaGFubmVsIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxlZCwgcHdyTGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTZ9LCAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX0ZBTFNFLCAzMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fRkFMU0UsIDMwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9GQUxTRSwgMzB9LCAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorCisgICAgICAgICAgICAgICAgfSwgLy9zUmVndWxhdG9yeUNoYW5uZWwgZW5kCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgIC8vIFJGX1NVQkJBTkRfMl80X0dIWgorICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB7IC8vIGJSYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSwgLy8gYlJhdGVQb3dlck9mZnNldCBlbmQKKworICAgICAgICAgICAgICAgIHsgLy8gZ25SYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSAvLyBnblJhdGVQb3dlck9mZnNldCBlbmQKKyAgICAgICAgICAgIH0sICAgLy8gUkVHX0RPTUFJTl9OX0FNRVJfRVhDX0ZDQyBlbmQKKworICAgICAgICAgICAgeyAgIC8vIFJFR19ET01BSU5fQVBBQyBzdGFydAorICAgICAgICAgICAgICAgIHsgLy9zUmVndWxhdG9yeUNoYW5uZWwgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9lbmFibGVkLCBwd3JMaW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAyNn0sICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMjZ9LCAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9GQUxTRSwgMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisKKyAgICAgICAgICAgICAgICB9LCAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBlbmQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgLy8gUkZfU1VCQkFORF8yXzRfR0haCisgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIHsgLy8gYlJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9LCAvLyBiUmF0ZVBvd2VyT2Zmc2V0IGVuZAorCisgICAgICAgICAgICAgICAgeyAvLyBnblJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IGVuZAorICAgICAgICAgICAgfSwgLy8gUkVHX0RPTUFJTl9BUEFDIGVuZAorCisgICAgICAgICAgICB7ICAgLy8gUkVHX0RPTUFJTl9LT1JFQSBzdGFydAorICAgICAgICAgICAgICAgIHsgLy9zUmVndWxhdG9yeUNoYW5uZWwgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9lbmFibGVkLCBwd3JMaW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNX0sICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTV9LCAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9GQUxTRSwgMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisKKyAgICAgICAgICAgICAgICB9LCAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBlbmQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgLy8gUkZfU1VCQkFORF8yXzRfR0haCisgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIHsgLy8gYlJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9LCAvLyBiUmF0ZVBvd2VyT2Zmc2V0IGVuZAorCisgICAgICAgICAgICAgICAgeyAvLyBnblJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IGVuZAorICAgICAgICAgICAgfSwgLy8gUkVHX0RPTUFJTl9LT1JFQSBlbmQKKworICAgICAgICAgICAgeyAgIC8vIFJFR19ET01BSU5fSElfNUdIWiBzdGFydAorICAgICAgICAgICAgICAgIHsgLy9zUmVndWxhdG9yeUNoYW5uZWwgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9lbmFibGVkLCBwd3JMaW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxNH0sICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTR9LCAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9GQUxTRSwgMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisKKyAgICAgICAgICAgICAgICB9LCAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBlbmQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgLy8gUkZfU1VCQkFORF8yXzRfR0haCisgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIHsgLy8gYlJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9LCAvLyBiUmF0ZVBvd2VyT2Zmc2V0IGVuZAorCisgICAgICAgICAgICAgICAgeyAvLyBnblJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IGVuZAorICAgICAgICAgICAgfSwgLy8gUkVHX0RPTUFJTl9ISV81R0haIGVuZAorCisgICAgICAgICAgICB7ICAgLy8gUkVHX0RPTUFJTl9OT181R0haIHN0YXJ0CisgICAgICAgICAgICAgICAgeyAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvL2VuYWJsZWQsIHB3ckxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX1RSVUUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAge2VBTklfQk9PTEVBTl9UUlVFLCAxMn0sICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHtlQU5JX0JPT0xFQU5fVFJVRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7ZUFOSV9CT09MRUFOX0ZBTFNFLCAwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKworICAgICAgICAgICAgICAgIH0sIC8vc1JlZ3VsYXRvcnlDaGFubmVsIGVuZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAvLyBSRl9TVUJCQU5EXzJfNF9HSFoKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgeyAvLyBiUmF0ZVBvd2VyT2Zmc2V0IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorICAgICAgICAgICAgICAgIH0sIC8vIGJSYXRlUG93ZXJPZmZzZXQgZW5kCisKKyAgICAgICAgICAgICAgICB7IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorICAgICAgICAgICAgICAgIH0gLy8gZ25SYXRlUG93ZXJPZmZzZXQgZW5kCisgICAgICAgICAgICB9IC8vIFJFR19ET01BSU5fTk9fNUdIWiBlbmQKKyAgICAgICAgfSwKKworICAgICAgICAvLyBOVl9UQUJMRV9ERUZBVUxUX0NPVU5UUlkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdHlwZWRlZiBzdHJ1Y3QKKyAgICAgICAgICAgIC8vIHsKKyAgICAgICAgICAgIC8vICAgICB0QU5JX1U4IHJlZ0RvbWFpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnJvbSBlUmVnRG9tYWluSWQKKyAgICAgICAgICAgIC8vICAgICB0QU5JX1U4IGNvdW50cnlDb2RlW05WX0ZJRUxEX0NPVU5UUllfQ09ERV9TSVpFXTsgICAgLy8gc3RyaW5nIGlkZW50aWZpZXIKKyAgICAgICAgICAgIC8vIH1zRGVmYXVsdENvdW50cnk7CisKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLy8gcmVnRG9tYWluCisgICAgICAgICAgICB7ICdVJywgJ1MnLCAnSScgfSAgIC8vIGNvdW50cnlDb2RlCisgICAgICAgIH0sCisKKyAgICAgICAgLy9OVl9UQUJMRV9UUENfUE9XRVJfVEFCTEUKKyAgICAgICAgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgMCAgLCAvLzAKKyAgICAgICAgICAgICAgICAgICAgNDEgLCAvLzEKKyAgICAgICAgICAgICAgICAgICAgNDMgLCAvLzIKKyAgICAgICAgICAgICAgICAgICAgNDUgLCAvLzMKKyAgICAgICAgICAgICAgICAgICAgNDcgLCAvLzQKKyAgICAgICAgICAgICAgICAgICAgNDkgLCAvLzUKKyAgICAgICAgICAgICAgICAgICAgNTEgLCAvLzYKKyAgICAgICAgICAgICAgICAgICAgNTMgLCAvLzcKKyAgICAgICAgICAgICAgICAgICAgNTUgLCAvLzgKKyAgICAgICAgICAgICAgICAgICAgNTYgLCAvLzkKKyAgICAgICAgICAgICAgICAgICAgNTggLCAvLzEwCisgICAgICAgICAgICAgICAgICAgIDU5ICwgLy8xMQorICAgICAgICAgICAgICAgICAgICA2MCAsIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgNjIgLCAvLzEzCisgICAgICAgICAgICAgICAgICAgIDYzICwgLy8xNAorICAgICAgICAgICAgICAgICAgICA2NCAsIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgNjUgLCAvLzE2CisgICAgICAgICAgICAgICAgICAgIDY3ICwgLy8xNworICAgICAgICAgICAgICAgICAgICA2OCAsIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgNjkgLCAvLzE5CisgICAgICAgICAgICAgICAgICAgIDcwICwgLy8yMAorICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgNzIgLCAvLzIyCisgICAgICAgICAgICAgICAgICAgIDczICwgLy8yMworICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI1CisgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNgorICAgICAgICAgICAgICAgICAgICA3NiAsIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI4CisgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8yOQorICAgICAgICAgICAgICAgICAgICA3OCAsIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzMxCisgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMgorICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgODIgLCAvLzM0CisgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zNQorICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM3CisgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zOAorICAgICAgICAgICAgICAgICAgICA4NSAsIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgODYgLCAvLzQwCisgICAgICAgICAgICAgICAgICAgIDg2ICwgLy80MQorICAgICAgICAgICAgICAgICAgICA4NyAsIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgODggLCAvLzQzCisgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80NAorICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ2CisgICAgICAgICAgICAgICAgICAgIDkxICwgLy80NworICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ5CisgICAgICAgICAgICAgICAgICAgIDkyICwgLy81MAorICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUyCisgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81MworICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU1CisgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81NgorICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU4CisgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81OQorICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzYxCisgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MgorICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgOTggLCAvLzY0CisgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NQorICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY3CisgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82OAorICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzcwCisgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MQorICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzczCisgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83NAorICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzc2CisgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NworICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc5CisgICAgICAgICAgICAgICAgICAgIDEwMywgLy84MAorICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODEKKyAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgyCisgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MworICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODQKKyAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg1CisgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NgorICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODcKKyAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg4CisgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84OQorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkxCisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MgorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk0CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NQorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk3CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85OAorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMAorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAxCisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMworICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA0CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNgorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA3CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwOQorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEwCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMgorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEzCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNQorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE2CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExOAorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE5CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMQorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIyCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNAorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI1CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAwICAsIC8vMAorICAgICAgICAgICAgICAgICAgICA0MSAsIC8vMQorICAgICAgICAgICAgICAgICAgICA0MyAsIC8vMgorICAgICAgICAgICAgICAgICAgICA0NSAsIC8vMworICAgICAgICAgICAgICAgICAgICA0NyAsIC8vNAorICAgICAgICAgICAgICAgICAgICA0OSAsIC8vNQorICAgICAgICAgICAgICAgICAgICA1MSAsIC8vNgorICAgICAgICAgICAgICAgICAgICA1MiAsIC8vNworICAgICAgICAgICAgICAgICAgICA1NCAsIC8vOAorICAgICAgICAgICAgICAgICAgICA1NiAsIC8vOQorICAgICAgICAgICAgICAgICAgICA1NyAsIC8vMTAKKyAgICAgICAgICAgICAgICAgICAgNTkgLCAvLzExCisgICAgICAgICAgICAgICAgICAgIDYwICwgLy8xMgorICAgICAgICAgICAgICAgICAgICA2MSAsIC8vMTMKKyAgICAgICAgICAgICAgICAgICAgNjIgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgIDY0ICwgLy8xNQorICAgICAgICAgICAgICAgICAgICA2NSAsIC8vMTYKKyAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE3CisgICAgICAgICAgICAgICAgICAgIDY3ICwgLy8xOAorICAgICAgICAgICAgICAgICAgICA2OCAsIC8vMTkKKyAgICAgICAgICAgICAgICAgICAgNjkgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgIDcwICwgLy8yMQorICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjIKKyAgICAgICAgICAgICAgICAgICAgNzIgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgIDczICwgLy8yNAorICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjUKKyAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNworICAgICAgICAgICAgICAgICAgICA3NiAsIC8vMjgKKyAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI5CisgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8zMAorICAgICAgICAgICAgICAgICAgICA3OSAsIC8vMzEKKyAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMworICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzQKKyAgICAgICAgICAgICAgICAgICAgODIgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zNgorICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzcKKyAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgIDg1ICwgLy8zOQorICAgICAgICAgICAgICAgICAgICA4NSAsIC8vNDAKKyAgICAgICAgICAgICAgICAgICAgODYgLCAvLzQxCisgICAgICAgICAgICAgICAgICAgIDg3ICwgLy80MgorICAgICAgICAgICAgICAgICAgICA4OCAsIC8vNDMKKyAgICAgICAgICAgICAgICAgICAgODggLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80NQorICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDYKKyAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgIDkxICwgLy80OAorICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDkKKyAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgIDkyICwgLy81MQorICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNTIKKyAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81NAorICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTUKKyAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81NworICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTgKKyAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU5CisgICAgICAgICAgICAgICAgICAgIDk2ICwgLy82MAorICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNjEKKyAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzYyCisgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MworICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjQKKyAgICAgICAgICAgICAgICAgICAgOTggLCAvLzY1CisgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NgorICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjcKKyAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY4CisgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82OQorICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNzAKKyAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzcxCisgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MgorICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzMKKyAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzc0CisgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83NQorICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzYKKyAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzc3CisgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OAorICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzkKKyAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzgwCisgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MQorICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODIKKyAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgzCisgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NAorICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODUKKyAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg2CisgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NworICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODgKKyAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg5CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MAorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTEKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkyCisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MworICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTQKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk1CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NgorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTcKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk4CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85OQorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAwCisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMgorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTAzCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNQorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA2CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwOAorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA5CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMQorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEyCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNAorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE1CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNworICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE4CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMAorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIxCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMworICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI0CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNgorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI3CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgICwgLy8wCisgICAgICAgICAgICAgICAgICAgICAgICA0MSAsIC8vMQorICAgICAgICAgICAgICAgICAgICAgICAgNDMgLCAvLzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ1ICwgLy8zCisgICAgICAgICAgICAgICAgICAgICAgICA0NyAsIC8vNAorICAgICAgICAgICAgICAgICAgICAgICAgNDkgLCAvLzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDUxICwgLy82CisgICAgICAgICAgICAgICAgICAgICAgICA1MiAsIC8vNworICAgICAgICAgICAgICAgICAgICAgICAgNTQgLCAvLzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDU1ICwgLy85CisgICAgICAgICAgICAgICAgICAgICAgICA1NyAsIC8vMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDU4ICwgLy8xMQorICAgICAgICAgICAgICAgICAgICAgICAgNjAgLCAvLzEyCisgICAgICAgICAgICAgICAgICAgICAgICA2MSAsIC8vMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDYyICwgLy8xNAorICAgICAgICAgICAgICAgICAgICAgICAgNjQgLCAvLzE1CisgICAgICAgICAgICAgICAgICAgICAgICA2NSAsIC8vMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDY2ICwgLy8xNworICAgICAgICAgICAgICAgICAgICAgICAgNjcgLCAvLzE4CisgICAgICAgICAgICAgICAgICAgICAgICA2OCAsIC8vMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDY5ICwgLy8yMAorICAgICAgICAgICAgICAgICAgICAgICAgNzAgLCAvLzIxCisgICAgICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDcyICwgLy8yMworICAgICAgICAgICAgICAgICAgICAgICAgNzMgLCAvLzI0CisgICAgICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNgorICAgICAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI3CisgICAgICAgICAgICAgICAgICAgICAgICA3NiAsIC8vMjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yOQorICAgICAgICAgICAgICAgICAgICAgICAgNzggLCAvLzMwCisgICAgICAgICAgICAgICAgICAgICAgICA3OCAsIC8vMzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDc5ICwgLy8zMgorICAgICAgICAgICAgICAgICAgICAgICAgODAgLCAvLzMzCisgICAgICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zNQorICAgICAgICAgICAgICAgICAgICAgICAgODIgLCAvLzM2CisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zOAorICAgICAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM5CisgICAgICAgICAgICAgICAgICAgICAgICA4NSAsIC8vNDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy80MQorICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzQyCisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vNDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDg4ICwgLy80NAorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQ1CisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80NworICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ4CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy81MAorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzUxCisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy81MworICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzU0CisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81NgorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU3CisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81OQorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzYwCisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy82MgorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzYzCisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82NQorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY2CisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82OAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy83MQorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzcyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83NAorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzc1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83NworICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy84MAorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzgxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MworICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTEwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTExCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTEyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTEzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTIxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTIyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTIzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTI0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTI1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTI2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTI3CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMCAgLCAvLzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDQyICwgLy8xCisgICAgICAgICAgICAgICAgICAgICAgICA0NCAsIC8vMgorICAgICAgICAgICAgICAgICAgICAgICAgNDYgLCAvLzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICwgLy80CisgICAgICAgICAgICAgICAgICAgICAgICA0OSAsIC8vNQorICAgICAgICAgICAgICAgICAgICAgICAgNTEgLCAvLzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDUzICwgLy83CisgICAgICAgICAgICAgICAgICAgICAgICA1NSAsIC8vOAorICAgICAgICAgICAgICAgICAgICAgICAgNTcgLCAvLzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDU4ICwgLy8xMAorICAgICAgICAgICAgICAgICAgICAgICAgNjAgLCAvLzExCisgICAgICAgICAgICAgICAgICAgICAgICA2MSAsIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDYyICwgLy8xMworICAgICAgICAgICAgICAgICAgICAgICAgNjMgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgICAgICA2NCAsIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDY2ICwgLy8xNgorICAgICAgICAgICAgICAgICAgICAgICAgNjcgLCAvLzE3CisgICAgICAgICAgICAgICAgICAgICAgICA2OCAsIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDY5ICwgLy8xOQorICAgICAgICAgICAgICAgICAgICAgICAgNzAgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDcyICwgLy8yMgorICAgICAgICAgICAgICAgICAgICAgICAgNzMgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNQorICAgICAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgICAgICA3NiAsIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yOAorICAgICAgICAgICAgICAgICAgICAgICAgNzggLCAvLzI5CisgICAgICAgICAgICAgICAgICAgICAgICA3OCAsIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDc5ICwgLy8zMQorICAgICAgICAgICAgICAgICAgICAgICAgODAgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zNAorICAgICAgICAgICAgICAgICAgICAgICAgODIgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zNworICAgICAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgICAgICA4NSAsIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy80MAorICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzQxCisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDg4ICwgLy80MworICAgICAgICAgICAgICAgICAgICAgICAgODggLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80NgorICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80OQorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy81MgorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81NQorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81OAorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU5CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy82MQorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzYyCisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82NAorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzY1CisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NworICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy83MAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzcxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MworICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzc0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzc3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzgwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vODEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl80CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAwICAsIC8vMAorICAgICAgICAgICAgICAgICAgICAgICAgNDEgLCAvLzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDQzICwgLy8yCisgICAgICAgICAgICAgICAgICAgICAgICA0NSAsIC8vMworICAgICAgICAgICAgICAgICAgICAgICAgNDcgLCAvLzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ5ICwgLy81CisgICAgICAgICAgICAgICAgICAgICAgICA1MSAsIC8vNgorICAgICAgICAgICAgICAgICAgICAgICAgNTMgLCAvLzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDU0ICwgLy84CisgICAgICAgICAgICAgICAgICAgICAgICA1NiAsIC8vOQorICAgICAgICAgICAgICAgICAgICAgICAgNTcgLCAvLzEwCisgICAgICAgICAgICAgICAgICAgICAgICA1OSAsIC8vMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDYwICwgLy8xMgorICAgICAgICAgICAgICAgICAgICAgICAgNjIgLCAvLzEzCisgICAgICAgICAgICAgICAgICAgICAgICA2MyAsIC8vMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDY1ICwgLy8xNQorICAgICAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE2CisgICAgICAgICAgICAgICAgICAgICAgICA2NyAsIC8vMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDY4ICwgLy8xOAorICAgICAgICAgICAgICAgICAgICAgICAgNjkgLCAvLzE5CisgICAgICAgICAgICAgICAgICAgICAgICA2OSAsIC8vMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDcxICwgLy8yMQorICAgICAgICAgICAgICAgICAgICAgICAgNzIgLCAvLzIyCisgICAgICAgICAgICAgICAgICAgICAgICA3MiAsIC8vMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDczICwgLy8yNAorICAgICAgICAgICAgICAgICAgICAgICAgNzQgLCAvLzI1CisgICAgICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDc2ICwgLy8yNworICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI4CisgICAgICAgICAgICAgICAgICAgICAgICA3OCAsIC8vMjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDc5ICwgLy8zMAorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzMxCisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDgxICwgLy8zMworICAgICAgICAgICAgICAgICAgICAgICAgODIgLCAvLzM0CisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNgorICAgICAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM3CisgICAgICAgICAgICAgICAgICAgICAgICA4NSAsIC8vMzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy8zOQorICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzQwCisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vNDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDg4ICwgLy80MgorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQzCisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80NQorICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ2CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80OAorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ5CisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy81MQorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzUyCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81NAorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU1CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NworICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU4CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy82MAorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzYxCisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MworICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY0CisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzcwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MgorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzczCisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NQorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgICwgLy8wCisgICAgICAgICAgICAgICAgICAgICAgICA0MSAsIC8vMQorICAgICAgICAgICAgICAgICAgICAgICAgNDMgLCAvLzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ1ICwgLy8zCisgICAgICAgICAgICAgICAgICAgICAgICA0NyAsIC8vNAorICAgICAgICAgICAgICAgICAgICAgICAgNDkgLCAvLzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDUxICwgLy82CisgICAgICAgICAgICAgICAgICAgICAgICA1MyAsIC8vNworICAgICAgICAgICAgICAgICAgICAgICAgNTUgLCAvLzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDU2ICwgLy85CisgICAgICAgICAgICAgICAgICAgICAgICA1OCAsIC8vMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDU5ICwgLy8xMQorICAgICAgICAgICAgICAgICAgICAgICAgNjEgLCAvLzEyCisgICAgICAgICAgICAgICAgICAgICAgICA2MiAsIC8vMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDYzICwgLy8xNAorICAgICAgICAgICAgICAgICAgICAgICAgNjQgLCAvLzE1CisgICAgICAgICAgICAgICAgICAgICAgICA2NSAsIC8vMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDY2ICwgLy8xNworICAgICAgICAgICAgICAgICAgICAgICAgNjggLCAvLzE4CisgICAgICAgICAgICAgICAgICAgICAgICA2OSAsIC8vMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDcwICwgLy8yMAorICAgICAgICAgICAgICAgICAgICAgICAgNzEgLCAvLzIxCisgICAgICAgICAgICAgICAgICAgICAgICA3MiAsIC8vMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDczICwgLy8yMworICAgICAgICAgICAgICAgICAgICAgICAgNzQgLCAvLzI0CisgICAgICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDc2ICwgLy8yNgorICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI3CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8yOQorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzMwCisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMgorICAgICAgICAgICAgICAgICAgICAgICAgODEgLCAvLzMzCisgICAgICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNQorICAgICAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM2CisgICAgICAgICAgICAgICAgICAgICAgICA4NCAsIC8vMzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDg1ICwgLy8zOAorICAgICAgICAgICAgICAgICAgICAgICAgODYgLCAvLzM5CisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vNDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDg3ICwgLy80MQorICAgICAgICAgICAgICAgICAgICAgICAgODggLCAvLzQyCisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80NAorICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ1CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80NworICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ4CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy81MAorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUxCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81MworICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU0CisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NgorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU3CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81OQorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzYwCisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MgorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzYzCisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NQorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82OAorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MQorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzcyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NAorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NworICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84MworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTEwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTExCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI3CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMCAgLCAvLzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDQxICwgLy8xCisgICAgICAgICAgICAgICAgICAgICAgICA0MyAsIC8vMgorICAgICAgICAgICAgICAgICAgICAgICAgNDUgLCAvLzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ3ICwgLy80CisgICAgICAgICAgICAgICAgICAgICAgICA0OSAsIC8vNQorICAgICAgICAgICAgICAgICAgICAgICAgNTEgLCAvLzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDUzICwgLy83CisgICAgICAgICAgICAgICAgICAgICAgICA1NSAsIC8vOAorICAgICAgICAgICAgICAgICAgICAgICAgNTYgLCAvLzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDU4ICwgLy8xMAorICAgICAgICAgICAgICAgICAgICAgICAgNjAgLCAvLzExCisgICAgICAgICAgICAgICAgICAgICAgICA2MSAsIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDYyICwgLy8xMworICAgICAgICAgICAgICAgICAgICAgICAgNjMgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgICAgICA2NCAsIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDY2ICwgLy8xNgorICAgICAgICAgICAgICAgICAgICAgICAgNjcgLCAvLzE3CisgICAgICAgICAgICAgICAgICAgICAgICA2OCAsIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDY5ICwgLy8xOQorICAgICAgICAgICAgICAgICAgICAgICAgNzAgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDcyICwgLy8yMgorICAgICAgICAgICAgICAgICAgICAgICAgNzMgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNQorICAgICAgICAgICAgICAgICAgICAgICAgNzYgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yOAorICAgICAgICAgICAgICAgICAgICAgICAgNzggLCAvLzI5CisgICAgICAgICAgICAgICAgICAgICAgICA3OSAsIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMQorICAgICAgICAgICAgICAgICAgICAgICAgODAgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zNAorICAgICAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgICAgICA4NCAsIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zNworICAgICAgICAgICAgICAgICAgICAgICAgODUgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgICAgICA4NiAsIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDg3ICwgLy80MAorICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzQxCisgICAgICAgICAgICAgICAgICAgICAgICA4OCAsIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDg4ICwgLy80MworICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80NgorICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80OQorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy81MgorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81NQorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81OAorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU5CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy82MQorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzYyCisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NAorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY1CisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NworICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MAorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzcxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MworICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzc0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl83CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAwICAsIC8vMAorICAgICAgICAgICAgICAgICAgICAgICAgNDAgLCAvLzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDQyICwgLy8yCisgICAgICAgICAgICAgICAgICAgICAgICA0NSAsIC8vMworICAgICAgICAgICAgICAgICAgICAgICAgNDcgLCAvLzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ5ICwgLy81CisgICAgICAgICAgICAgICAgICAgICAgICA1MSAsIC8vNgorICAgICAgICAgICAgICAgICAgICAgICAgNTIgLCAvLzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDU0ICwgLy84CisgICAgICAgICAgICAgICAgICAgICAgICA1NiAsIC8vOQorICAgICAgICAgICAgICAgICAgICAgICAgNTggLCAvLzEwCisgICAgICAgICAgICAgICAgICAgICAgICA1OSAsIC8vMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDYxICwgLy8xMgorICAgICAgICAgICAgICAgICAgICAgICAgNjIgLCAvLzEzCisgICAgICAgICAgICAgICAgICAgICAgICA2MyAsIC8vMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDY1ICwgLy8xNQorICAgICAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE2CisgICAgICAgICAgICAgICAgICAgICAgICA2NyAsIC8vMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDY4ICwgLy8xOAorICAgICAgICAgICAgICAgICAgICAgICAgNjkgLCAvLzE5CisgICAgICAgICAgICAgICAgICAgICAgICA3MCAsIC8vMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDcxICwgLy8yMQorICAgICAgICAgICAgICAgICAgICAgICAgNzIgLCAvLzIyCisgICAgICAgICAgICAgICAgICAgICAgICA3MyAsIC8vMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDc0ICwgLy8yNAorICAgICAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI1CisgICAgICAgICAgICAgICAgICAgICAgICA3NiAsIC8vMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yNworICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI4CisgICAgICAgICAgICAgICAgICAgICAgICA3OCAsIC8vMjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDc5ICwgLy8zMAorICAgICAgICAgICAgICAgICAgICAgICAgODAgLCAvLzMxCisgICAgICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDgxICwgLy8zMworICAgICAgICAgICAgICAgICAgICAgICAgODIgLCAvLzM0CisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zNgorICAgICAgICAgICAgICAgICAgICAgICAgODUgLCAvLzM3CisgICAgICAgICAgICAgICAgICAgICAgICA4NiAsIC8vMzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy8zOQorICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzQwCisgICAgICAgICAgICAgICAgICAgICAgICA4OCAsIC8vNDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80MgorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQzCisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80NQorICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ2CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80OAorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzQ5CisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81MQorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzUyCisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81NAorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU1CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81NworICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU4CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MAorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzYxCisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82MworICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzcwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MgorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzczCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzgyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzg4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgICwgLy8wCisgICAgICAgICAgICAgICAgICAgICAgICA0MSAsIC8vMQorICAgICAgICAgICAgICAgICAgICAgICAgNDQgLCAvLzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ2ICwgLy8zCisgICAgICAgICAgICAgICAgICAgICAgICA0OCAsIC8vNAorICAgICAgICAgICAgICAgICAgICAgICAgNTAgLCAvLzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDUyICwgLy82CisgICAgICAgICAgICAgICAgICAgICAgICA1NCAsIC8vNworICAgICAgICAgICAgICAgICAgICAgICAgNTYgLCAvLzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDU4ICwgLy85CisgICAgICAgICAgICAgICAgICAgICAgICA1OSAsIC8vMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDYwICwgLy8xMQorICAgICAgICAgICAgICAgICAgICAgICAgNjIgLCAvLzEyCisgICAgICAgICAgICAgICAgICAgICAgICA2MyAsIC8vMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDY0ICwgLy8xNAorICAgICAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE1CisgICAgICAgICAgICAgICAgICAgICAgICA2NyAsIC8vMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDY4ICwgLy8xNworICAgICAgICAgICAgICAgICAgICAgICAgNjkgLCAvLzE4CisgICAgICAgICAgICAgICAgICAgICAgICA3MCAsIC8vMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDcxICwgLy8yMAorICAgICAgICAgICAgICAgICAgICAgICAgNzIgLCAvLzIxCisgICAgICAgICAgICAgICAgICAgICAgICA3MyAsIC8vMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDc0ICwgLy8yMworICAgICAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI0CisgICAgICAgICAgICAgICAgICAgICAgICA3NiAsIC8vMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yNgorICAgICAgICAgICAgICAgICAgICAgICAgNzggLCAvLzI3CisgICAgICAgICAgICAgICAgICAgICAgICA3OSAsIC8vMjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDc5ICwgLy8yOQorICAgICAgICAgICAgICAgICAgICAgICAgODAgLCAvLzMwCisgICAgICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zMgorICAgICAgICAgICAgICAgICAgICAgICAgODMgLCAvLzMzCisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zNQorICAgICAgICAgICAgICAgICAgICAgICAgODUgLCAvLzM2CisgICAgICAgICAgICAgICAgICAgICAgICA4NiAsIC8vMzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDg3ICwgLy8zOAorICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzM5CisgICAgICAgICAgICAgICAgICAgICAgICA4OCAsIC8vNDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80MQorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQyCisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80NAorICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ1CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80NworICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzQ4CisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81MAorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzUxCisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81MworICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU0CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81NgorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU3CisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy81OQorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzYwCisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82MgorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzYzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NQorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82OAorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzY5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83MQorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzcyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83NworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzc4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vNzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzgxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84MworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzg0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzg3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzk5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTAxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTAyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTAzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTExCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI3CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMCAgLCAvLzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDQxICwgLy8xCisgICAgICAgICAgICAgICAgICAgICAgICA0MyAsIC8vMgorICAgICAgICAgICAgICAgICAgICAgICAgNDcgLCAvLzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICwgLy80CisgICAgICAgICAgICAgICAgICAgICAgICA1MCAsIC8vNQorICAgICAgICAgICAgICAgICAgICAgICAgNTIgLCAvLzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDUzICwgLy83CisgICAgICAgICAgICAgICAgICAgICAgICA1NSAsIC8vOAorICAgICAgICAgICAgICAgICAgICAgICAgNTcgLCAvLzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDU4ICwgLy8xMAorICAgICAgICAgICAgICAgICAgICAgICAgNjAgLCAvLzExCisgICAgICAgICAgICAgICAgICAgICAgICA2MiAsIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDYzICwgLy8xMworICAgICAgICAgICAgICAgICAgICAgICAgNjQgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgICAgICA2NSAsIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDY3ICwgLy8xNgorICAgICAgICAgICAgICAgICAgICAgICAgNjggLCAvLzE3CisgICAgICAgICAgICAgICAgICAgICAgICA2OSAsIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDcwICwgLy8xOQorICAgICAgICAgICAgICAgICAgICAgICAgNzEgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgICAgICA3MiAsIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDczICwgLy8yMgorICAgICAgICAgICAgICAgICAgICAgICAgNzQgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDc2ICwgLy8yNQorICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8yOAorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzI5CisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDgxICwgLy8zMQorICAgICAgICAgICAgICAgICAgICAgICAgODIgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zNAorICAgICAgICAgICAgICAgICAgICAgICAgODUgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgICAgICA4NSAsIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy8zNworICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgICAgICA4OCAsIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80MAorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQxCisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80MworICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80NgorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy80OQorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81MgorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81NQorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy81OAorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzU5CisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82MQorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzYyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82NAorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy82NworICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzY4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83MAorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzcxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83MworICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy83NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzc3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy83OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzgwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzgzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzg2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzg5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy85MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzkyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy85NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzk1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy85NworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzk4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMCAgLCAvLzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDQyICwgLy8xCisgICAgICAgICAgICAgICAgICAgICAgICA0NCAsIC8vMgorICAgICAgICAgICAgICAgICAgICAgICAgNDcgLCAvLzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ5ICwgLy80CisgICAgICAgICAgICAgICAgICAgICAgICA1MSAsIC8vNQorICAgICAgICAgICAgICAgICAgICAgICAgNTIgLCAvLzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDU0ICwgLy83CisgICAgICAgICAgICAgICAgICAgICAgICA1NSAsIC8vOAorICAgICAgICAgICAgICAgICAgICAgICAgNTcgLCAvLzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDU4ICwgLy8xMAorICAgICAgICAgICAgICAgICAgICAgICAgNjAgLCAvLzExCisgICAgICAgICAgICAgICAgICAgICAgICA2MSAsIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDYzICwgLy8xMworICAgICAgICAgICAgICAgICAgICAgICAgNjQgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgICAgICA2NSAsIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDY2ICwgLy8xNgorICAgICAgICAgICAgICAgICAgICAgICAgNjcgLCAvLzE3CisgICAgICAgICAgICAgICAgICAgICAgICA2OSAsIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDcwICwgLy8xOQorICAgICAgICAgICAgICAgICAgICAgICAgNzEgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgICAgICA3MiAsIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDczICwgLy8yMgorICAgICAgICAgICAgICAgICAgICAgICAgNzQgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDc2ICwgLy8yNQorICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8yOAorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzI5CisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDgxICwgLy8zMQorICAgICAgICAgICAgICAgICAgICAgICAgODIgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNAorICAgICAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgICAgICA4NSAsIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy8zNworICAgICAgICAgICAgICAgICAgICAgICAgODYgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDg4ICwgLy80MAorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQxCisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80MworICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80NgorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy80OQorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81MgorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81NQorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy81OAorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzU5CisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82MQorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzYyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NAorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82NworICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzY4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MAorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzcxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83MworICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMCAgLCAvLzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDQxICwgLy8xCisgICAgICAgICAgICAgICAgICAgICAgICA0NCAsIC8vMgorICAgICAgICAgICAgICAgICAgICAgICAgNDYgLCAvLzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICwgLy80CisgICAgICAgICAgICAgICAgICAgICAgICA1MCAsIC8vNQorICAgICAgICAgICAgICAgICAgICAgICAgNTIgLCAvLzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDU0ICwgLy83CisgICAgICAgICAgICAgICAgICAgICAgICA1NiAsIC8vOAorICAgICAgICAgICAgICAgICAgICAgICAgNTcgLCAvLzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDU5ICwgLy8xMAorICAgICAgICAgICAgICAgICAgICAgICAgNjAgLCAvLzExCisgICAgICAgICAgICAgICAgICAgICAgICA2MSAsIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDYzICwgLy8xMworICAgICAgICAgICAgICAgICAgICAgICAgNjQgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgICAgICA2NSAsIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDY2ICwgLy8xNgorICAgICAgICAgICAgICAgICAgICAgICAgNjcgLCAvLzE3CisgICAgICAgICAgICAgICAgICAgICAgICA2OSAsIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDcwICwgLy8xOQorICAgICAgICAgICAgICAgICAgICAgICAgNzEgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgICAgICA3MiAsIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDczICwgLy8yMgorICAgICAgICAgICAgICAgICAgICAgICAgNzQgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDc2ICwgLy8yNQorICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8yOAorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzI5CisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMQorICAgICAgICAgICAgICAgICAgICAgICAgODEgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNAorICAgICAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgICAgICA4NCAsIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDg1ICwgLy8zNworICAgICAgICAgICAgICAgICAgICAgICAgODYgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgICAgICA4NiAsIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDg3ICwgLy80MAorICAgICAgICAgICAgICAgICAgICAgICAgODggLCAvLzQxCisgICAgICAgICAgICAgICAgICAgICAgICA4OCAsIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80MworICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80NgorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy80OQorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81MgorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NQorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81OAorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU5CisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MQorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzYyCisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NworICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MAorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzcxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MworICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzgwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy85MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzkyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMCAgLCAvLzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDQyICwgLy8xCisgICAgICAgICAgICAgICAgICAgICAgICA0NCAsIC8vMgorICAgICAgICAgICAgICAgICAgICAgICAgNDYgLCAvLzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICwgLy80CisgICAgICAgICAgICAgICAgICAgICAgICA1MCAsIC8vNQorICAgICAgICAgICAgICAgICAgICAgICAgNTIgLCAvLzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDU0ICwgLy83CisgICAgICAgICAgICAgICAgICAgICAgICA1NiAsIC8vOAorICAgICAgICAgICAgICAgICAgICAgICAgNTggLCAvLzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDU5ICwgLy8xMAorICAgICAgICAgICAgICAgICAgICAgICAgNjAgLCAvLzExCisgICAgICAgICAgICAgICAgICAgICAgICA2MSAsIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDYzICwgLy8xMworICAgICAgICAgICAgICAgICAgICAgICAgNjQgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgICAgICA2NSAsIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDY2ICwgLy8xNgorICAgICAgICAgICAgICAgICAgICAgICAgNjggLCAvLzE3CisgICAgICAgICAgICAgICAgICAgICAgICA2OSAsIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDcwICwgLy8xOQorICAgICAgICAgICAgICAgICAgICAgICAgNzEgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgICAgICA3MiAsIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDczICwgLy8yMgorICAgICAgICAgICAgICAgICAgICAgICAgNzQgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNQorICAgICAgICAgICAgICAgICAgICAgICAgNzYgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8yOAorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzI5CisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMQorICAgICAgICAgICAgICAgICAgICAgICAgODEgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNAorICAgICAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgICAgICA4NCAsIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDg1ICwgLy8zNworICAgICAgICAgICAgICAgICAgICAgICAgODYgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgICAgICA4NiAsIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDg3ICwgLy80MAorICAgICAgICAgICAgICAgICAgICAgICAgODggLCAvLzQxCisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80MworICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80NgorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy80OQorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81MgorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NQorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81OAorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzU5CisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82MQorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzYyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82NworICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MAorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzcxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83MworICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8wCisgICAgICAgICAgICAgICAgICAgICAgIDQwLCAgLy8xCisgICAgICAgICAgICAgICAgICAgICAgIDQzLCAgLy8yCisgICAgICAgICAgICAgICAgICAgICAgIDQ1LCAgLy8zCisgICAgICAgICAgICAgICAgICAgICAgIDQ3LCAgLy80CisgICAgICAgICAgICAgICAgICAgICAgIDQ5LCAgLy81CisgICAgICAgICAgICAgICAgICAgICAgIDUwLCAgLy82CisgICAgICAgICAgICAgICAgICAgICAgIDUyLCAgLy83CisgICAgICAgICAgICAgICAgICAgICAgIDU0LCAgLy84CisgICAgICAgICAgICAgICAgICAgICAgIDU2LCAgLy85CisgICAgICAgICAgICAgICAgICAgICAgIDU3LCAgLy8xMAorICAgICAgICAgICAgICAgICAgICAgICA1OCwgIC8vMTEKKyAgICAgICAgICAgICAgICAgICAgICAgNTksICAvLzEyCisgICAgICAgICAgICAgICAgICAgICAgIDYwLCAgLy8xMworICAgICAgICAgICAgICAgICAgICAgICA2MiwgIC8vMTQKKyAgICAgICAgICAgICAgICAgICAgICAgNjMsICAvLzE1CisgICAgICAgICAgICAgICAgICAgICAgIDY0LCAgLy8xNgorICAgICAgICAgICAgICAgICAgICAgICA2NSwgIC8vMTcKKyAgICAgICAgICAgICAgICAgICAgICAgNjYsICAvLzE4CisgICAgICAgICAgICAgICAgICAgICAgIDY3LCAgLy8xOQorICAgICAgICAgICAgICAgICAgICAgICA2OCwgIC8vMjAKKyAgICAgICAgICAgICAgICAgICAgICAgNjksICAvLzIxCisgICAgICAgICAgICAgICAgICAgICAgIDcwLCAgLy8yMgorICAgICAgICAgICAgICAgICAgICAgICA3MSwgIC8vMjMKKyAgICAgICAgICAgICAgICAgICAgICAgNzIsICAvLzI0CisgICAgICAgICAgICAgICAgICAgICAgIDczLCAgLy8yNQorICAgICAgICAgICAgICAgICAgICAgICA3NCwgIC8vMjYKKyAgICAgICAgICAgICAgICAgICAgICAgNzQsICAvLzI3CisgICAgICAgICAgICAgICAgICAgICAgIDc1LCAgLy8yOAorICAgICAgICAgICAgICAgICAgICAgICA3NiwgIC8vMjkKKyAgICAgICAgICAgICAgICAgICAgICAgNzcsICAvLzMwCisgICAgICAgICAgICAgICAgICAgICAgIDc4LCAgLy8zMQorICAgICAgICAgICAgICAgICAgICAgICA3OCwgIC8vMzIKKyAgICAgICAgICAgICAgICAgICAgICAgNzksICAvLzMzCisgICAgICAgICAgICAgICAgICAgICAgIDgwLCAgLy8zNAorICAgICAgICAgICAgICAgICAgICAgICA4MSwgIC8vMzUKKyAgICAgICAgICAgICAgICAgICAgICAgODIsICAvLzM2CisgICAgICAgICAgICAgICAgICAgICAgIDgzLCAgLy8zNworICAgICAgICAgICAgICAgICAgICAgICA4MywgIC8vMzgKKyAgICAgICAgICAgICAgICAgICAgICAgODQsICAvLzM5CisgICAgICAgICAgICAgICAgICAgICAgIDg1LCAgLy80MAorICAgICAgICAgICAgICAgICAgICAgICA4NSwgIC8vNDEKKyAgICAgICAgICAgICAgICAgICAgICAgODYsICAvLzQyCisgICAgICAgICAgICAgICAgICAgICAgIDg3LCAgLy80MworICAgICAgICAgICAgICAgICAgICAgICA4NywgIC8vNDQKKyAgICAgICAgICAgICAgICAgICAgICAgODgsICAvLzQ1CisgICAgICAgICAgICAgICAgICAgICAgIDg5LCAgLy80NgorICAgICAgICAgICAgICAgICAgICAgICA4OSwgIC8vNDcKKyAgICAgICAgICAgICAgICAgICAgICAgOTAsICAvLzQ4CisgICAgICAgICAgICAgICAgICAgICAgIDkwLCAgLy80OQorICAgICAgICAgICAgICAgICAgICAgICA5MSwgIC8vNTAKKyAgICAgICAgICAgICAgICAgICAgICAgOTEsICAvLzUxCisgICAgICAgICAgICAgICAgICAgICAgIDkyLCAgLy81MgorICAgICAgICAgICAgICAgICAgICAgICA5MiwgIC8vNTMKKyAgICAgICAgICAgICAgICAgICAgICAgOTMsICAvLzU0CisgICAgICAgICAgICAgICAgICAgICAgIDkzLCAgLy81NQorICAgICAgICAgICAgICAgICAgICAgICA5NCwgIC8vNTYKKyAgICAgICAgICAgICAgICAgICAgICAgOTQsICAvLzU3CisgICAgICAgICAgICAgICAgICAgICAgIDk1LCAgLy81OAorICAgICAgICAgICAgICAgICAgICAgICA5NSwgIC8vNTkKKyAgICAgICAgICAgICAgICAgICAgICAgOTYsICAvLzYwCisgICAgICAgICAgICAgICAgICAgICAgIDk2LCAgLy82MQorICAgICAgICAgICAgICAgICAgICAgICA5NiwgIC8vNjIKKyAgICAgICAgICAgICAgICAgICAgICAgOTcsICAvLzYzCisgICAgICAgICAgICAgICAgICAgICAgIDk3LCAgLy82NAorICAgICAgICAgICAgICAgICAgICAgICA5NywgIC8vNjUKKyAgICAgICAgICAgICAgICAgICAgICAgOTgsICAvLzY2CisgICAgICAgICAgICAgICAgICAgICAgIDk4LCAgLy82NworICAgICAgICAgICAgICAgICAgICAgICA5OCwgIC8vNjgKKyAgICAgICAgICAgICAgICAgICAgICAgOTgsICAvLzY5CisgICAgICAgICAgICAgICAgICAgICAgIDk5LCAgLy83MAorICAgICAgICAgICAgICAgICAgICAgICA5OSwgIC8vNzEKKyAgICAgICAgICAgICAgICAgICAgICAgOTksICAvLzcyCisgICAgICAgICAgICAgICAgICAgICAgIDk5LCAgLy83MworICAgICAgICAgICAgICAgICAgICAgICA5OSwgIC8vNzQKKyAgICAgICAgICAgICAgICAgICAgICAgOTksICAvLzc1CisgICAgICAgICAgICAgICAgICAgICAgIDk5LCAgLy83NgorICAgICAgICAgICAgICAgICAgICAgICA5OSwgIC8vNzcKKyAgICAgICAgICAgICAgICAgICAgICAgOTksICAvLzc4CisgICAgICAgICAgICAgICAgICAgICAgIDk5LCAgLy83OQorICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzgwCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vODEKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy84MgorICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzgzCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vODQKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy84NQorICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzg2CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vODcKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy84OAorICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzg5CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy85MQorICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzkyCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy85NAorICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzk1CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy85NworICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vOTgKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzk5CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEwMQorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTAyCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEwNAorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTA1CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEwNworICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTA4CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzExMAorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTExCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzExMworICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTE0CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzExNgorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTE3CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzExOQorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTIwCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEyMgorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTIzCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEyNQorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTI2CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xNAorICAgICAgICB9LAorCisgICAgICAgIC8vTlZfVEFCTEVfVFBDX1BEQURDX09GRlNFVFMKKyAgICAgICAgeworICAgICAgICAgICAgOTgsICAvLyBSRl9DSEFOXzEKKyAgICAgICAgICAgIDEwMSwgIC8vIFJGX0NIQU5fMgorICAgICAgICAgICAgMTAxLCAgLy8gUkZfQ0hBTl8zCisgICAgICAgICAgICAxMDAsICAvLyBSRl9DSEFOXzQKKyAgICAgICAgICAgIDk4LCAgLy8gUkZfQ0hBTl81CisgICAgICAgICAgICA5NywgIC8vIFJGX0NIQU5fNgorICAgICAgICAgICAgOTQsICAvLyBSRl9DSEFOXzcKKyAgICAgICAgICAgIDk0LCAgLy8gUkZfQ0hBTl84CisgICAgICAgICAgICA5MiwgIC8vIFJGX0NIQU5fOQorICAgICAgICAgICAgOTAsICAvLyBSRl9DSEFOXzEwCisgICAgICAgICAgICA5NCwgIC8vIFJGX0NIQU5fMTEKKyAgICAgICAgICAgIDk1LCAgLy8gUkZfQ0hBTl8xMgorICAgICAgICAgICAgOTcsICAvLyBSRl9DSEFOXzEzCisgICAgICAgICAgICAxMDQgICAvLyBSRl9DSEFOXzE0CisgICAgICAgIH0sCisjaWYgMAorICAgICAgICAvL05WX1RBQkxFX0NBTF9NRU1PUlkKKyAgICAgICAgeworICAgICAgICAgICAgMHg3RkZGLCAgICAgIC8vIHRBTklfVTE2ICAgIHByb2Nlc3NfbW9uaXRvcjsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBoZGV0X2NhbF9jb2RlOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHJ4ZmVfZ21fMjsKKworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHR4X2JiZl9ydHVuZTsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBwYV9ydHVuZV9yZWc7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcnRfY29kZTsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBiaWFzX3J0dW5lOworCisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgYmJfYncxOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIGJiX2J3MjsKKyAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAgICAgICAgLy8gdEFOSV9VOCAgICAgcmVzZXJ2ZWRbMl07CisKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBiYl9idzM7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgYmJfYnc0OworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIGJiX2J3NTsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBiYl9idzY7CisKKyAgICAgICAgICAgIDB4N0ZGRiwgICAgICAvLyB0QU5JX1UxNiAgICByY01lYXN1cmVkOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHR4X2JiZl9jdDsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICB0eF9iYmZfY3RyOworCisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgY3NoX21heGdhaW5fcmVnOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIGNzaF8wZGJfcmVnOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIGNzaF9tM2RiX3JlZzsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBjc2hfbTZkYl9yZWc7CisKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBjZmZfMGRiX3JlZzsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBjZmZfbTNkYl9yZWc7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgY2ZmX202ZGJfcmVnOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHJ4ZmVfZ3Bpb19jdGxfMTsKKworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIG1peF9iYWxfY250XzI7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9TOCAgICAgcnhmZV9sbmFfaGlnaGdhaW5fYmlhc19jdGxfZGVsdGE7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcnhmZV9sbmFfbG9hZF9jdHVuZTsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICByeGZlX2xuYV9uZ21fcnR1bmU7CisKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICByeF9pbTJfaV9jZmcwOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHJ4X2ltMl9pX2NmZzE7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcnhfaW0yX3FfY2ZnMDsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICByeF9pbTJfcV9jZmcxOworCisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcGxsX3ZmY19yZWczX2IwOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHBsbF92ZmNfcmVnM19iMTsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBwbGxfdmZjX3JlZzNfYjI7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcGxsX3ZmY19yZWczX2IzOworCisgICAgICAgICAgICAweDdGRkYsICAgICAgICAvLyB0QU5JX1UxNiAgICB0ZW1wU3RhcnQ7CisgICAgICAgICAgICAweDdGRkYsICAgICAgICAvLyB0QU5JX1UxNiAgICB0ZW1wRmluaXNoOworCisgICAgICAgICAgICB7IC8vdHhMb0NvcnJlY3Rpb25zCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8zCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl82CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl85CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0gIC8vUkZfQ0hBTl8xNAorICAgICAgICAgICAgfSwgICAgICAgIC8vIHRUeExvQ29ycmVjdGlvbnMgICAgdHhMb1ZhbHVlczsKKworICAgICAgICAgICAgeyAvL3NUeElRQ2hhbm5lbAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8yCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl81CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl84CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9ICAvL1JGX0NIQU5fMTQKKyAgICAgICAgICAgIH0sICAgICAgICAvLyBzVHhJUUNoYW5uZWwgICAgICAgIHR4SXFWYWx1ZXM7CisKKyAgICAgICAgICAgIHsgLy9zUnhJUUNoYW5uZWwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFJYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBSWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gUlhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFJYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl80CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBSWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gUlhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFJYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl83CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBSWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gUlhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFJYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gUlhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzExCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBSWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFJYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gUlhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSAgLy9SRl9DSEFOXzE0CisgICAgICAgICAgICB9LCAgICAgICAgLy8gc1J4SVFDaGFubmVsICAgICAgICByeElxVmFsdWVzOworCisgICAgICAgICAgICB7IC8vIHRUcGNDb25maWcgICAgICAgICAgY2xwY0RhdGFbTUFYX1RQQ19DSEFOTkVMU10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSwgLy8gUkZfQ0hBTl8xCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF81CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy9DQUxfUE9JTlRfNworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBQSFlfVFhfQ0hBSU5fMAorICAgICAgICAgICAgICAgICAgICB9IC8vIGVtcGlyaWNhbAorICAgICAgICAgICAgICAgIH0sIC8vIFJGX0NIQU5fMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF82CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vQ0FMX1BPSU5UXzcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gUEhZX1RYX0NIQUlOXzAKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbXBpcmljYWwKKyAgICAgICAgICAgICAgICB9LCAvLyBSRl9DSEFOXzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSwgLy8gUkZfQ0hBTl80CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF81CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy9DQUxfUE9JTlRfNworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBQSFlfVFhfQ0hBSU5fMAorICAgICAgICAgICAgICAgICAgICB9IC8vIGVtcGlyaWNhbAorICAgICAgICAgICAgICAgIH0sIC8vIFJGX0NIQU5fNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF82CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vQ0FMX1BPSU5UXzcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gUEhZX1RYX0NIQUlOXzAKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbXBpcmljYWwKKyAgICAgICAgICAgICAgICB9LCAvLyBSRl9DSEFOXzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSwgLy8gUkZfQ0hBTl83CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF81CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy9DQUxfUE9JTlRfNworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBQSFlfVFhfQ0hBSU5fMAorICAgICAgICAgICAgICAgICAgICB9IC8vIGVtcGlyaWNhbAorICAgICAgICAgICAgICAgIH0sIC8vIFJGX0NIQU5fOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF82CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vQ0FMX1BPSU5UXzcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gUEhZX1RYX0NIQUlOXzAKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbXBpcmljYWwKKyAgICAgICAgICAgICAgICB9LCAvLyBSRl9DSEFOXzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSwgLy8gUkZfQ0hBTl8xMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF82CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vQ0FMX1BPSU5UXzcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gUEhZX1RYX0NIQUlOXzAKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbXBpcmljYWwKKyAgICAgICAgICAgICAgICB9LCAvLyBSRl9DSEFOXzExCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF81CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy9DQUxfUE9JTlRfNworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBQSFlfVFhfQ0hBSU5fMAorICAgICAgICAgICAgICAgICAgICB9IC8vIGVtcGlyaWNhbAorICAgICAgICAgICAgICAgIH0sIC8vIFJGX0NIQU5fMTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSwgIC8vIFJGX0NIQU5fMTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSAgLy8gUkZfQ0hBTl8xNAorICAgICAgICAgICAgfSwgICAgICAgIC8vIHRUcGNDb25maWcgICAgICAgICAgY2xwY0RhdGFbTUFYX1RQQ19DSEFOTkVMU107CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7IDB4MDAwMCwgeyAweDAwLCAweDAwIH0gfSwgLy8gUkZfQ0hBTl8xOiBwZGFkY19vZmZzZXQsIHJlc2VydmVkWzJdCisgICAgICAgICAgICAgICAgeyAweDAwMDAsIHsgMHgwMCwgMHgwMCB9IH0sIC8vIFJGX0NIQU5fMjogcGRhZGNfb2Zmc2V0LCByZXNlcnZlZFsyXQorICAgICAgICAgICAgICAgIHsgMHgwMDAwLCB7IDB4MDAsIDB4MDAgfSB9LCAvLyBSRl9DSEFOXzM6IHBkYWRjX29mZnNldCwgcmVzZXJ2ZWRbMl0KKyAgICAgICAgICAgICAgICB7IDB4MDAwMCwgeyAweDAwLCAweDAwIH0gfSwgLy8gUkZfQ0hBTl80OiBwZGFkY19vZmZzZXQsIHJlc2VydmVkWzJdCisgICAgICAgICAgICAgICAgeyAweDAwMDAsIHsgMHgwMCwgMHgwMCB9IH0sIC8vIFJGX0NIQU5fNTogcGRhZGNfb2Zmc2V0LCByZXNlcnZlZFsyXQorICAgICAgICAgICAgICAgIHsgMHgwMDAwLCB7IDB4MDAsIDB4MDAgfSB9LCAvLyBSRl9DSEFOXzY6IHBkYWRjX29mZnNldCwgcmVzZXJ2ZWRbMl0KKyAgICAgICAgICAgICAgICB7IDB4MDAwMCwgeyAweDAwLCAweDAwIH0gfSwgLy8gUkZfQ0hBTl83OiBwZGFkY19vZmZzZXQsIHJlc2VydmVkWzJdCisgICAgICAgICAgICAgICAgeyAweDAwMDAsIHsgMHgwMCwgMHgwMCB9IH0sIC8vIFJGX0NIQU5fODogcGRhZGNfb2Zmc2V0LCByZXNlcnZlZFsyXQorICAgICAgICAgICAgICAgIHsgMHgwMDAwLCB7IDB4MDAsIDB4MDAgfSB9LCAvLyBSRl9DSEFOXzk6IHBkYWRjX29mZnNldCwgcmVzZXJ2ZWRbMl0KKyAgICAgICAgICAgICAgICB7IDB4MDAwMCwgeyAweDAwLCAweDAwIH0gfSwgLy8gUkZfQ0hBTl8xMDogcGRhZGNfb2Zmc2V0LCByZXNlcnZlZFsyXQorICAgICAgICAgICAgICAgIHsgMHgwMDAwLCB7IDB4MDAsIDB4MDAgfSB9LCAvLyBSRl9DSEFOXzExOiBwZGFkY19vZmZzZXQsIHJlc2VydmVkWzJdCisgICAgICAgICAgICAgICAgeyAweDAwMDAsIHsgMHgwMCwgMHgwMCB9IH0sIC8vIFJGX0NIQU5fMTI6IHBkYWRjX29mZnNldCwgcmVzZXJ2ZWRbMl0KKyAgICAgICAgICAgICAgICB7IDB4MDAwMCwgeyAweDAwLCAweDAwIH0gfSwgLy8gUkZfQ0hBTl8xMzogcGRhZGNfb2Zmc2V0LCByZXNlcnZlZFsyXQorICAgICAgICAgICAgICAgIHsgMHgwMDAwLCB7IDB4MDAsIDB4MDAgfSB9ICAvLyBSRl9DSEFOXzE0OiBwZGFkY19vZmZzZXQsIHJlc2VydmVkWzJdCisgICAgICAgICAgICB9ICAgICAgICAvLyB0VHBjUGFyYW1zICAgICAgICAgIGNscGNQYXJhbXNbTUFYX1RQQ19DSEFOTkVMU107CisKKyAgICAgICAgfSwgLy9OVl9UQUJMRV9DQUxfTUVNT1JZCisKKyAgICAgICAgLy9OVl9UQUJMRV9DQUxfU1RBVFVTCisgICAgICAgIHsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBvdmVyYWxsOworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIGZ3SW5pdDsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBoZGV0X2RjbzsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBydHVuZXI7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgY3R1bmVyOworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIGluc2l0dTsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBwcm9jZXNzX21vbml0b3I7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcGxsVmNvTGluZWFyaXR5OworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIHR4SVE7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcnhJUTsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICByeERjbzsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICB0eExvOworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIGxuYUJpYXM7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgbG5hQmFuZFR1bmluZzsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBsbmFHYWluQWRqdXN0OworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIGltMlVzaW5nTm9pc2VQd3I7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgdGVtcGVyYXR1cmU7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgY2xwYzsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBjbHBjX3RlbXBfYWRqdXN0OworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIHR4RHBkOworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIGNoYW5uZWxUdW5lOworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIHJ4R21TdGFnZUxpbmVhcml0eTsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBpbTJVc2luZ1RvbmVHZW47CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgICAgIDB4MDAKKyAgICAgICAgICAgIH0gICAgICAgIC8vIHRBTklfVTggICAgIHVudXNlZFs5XTsKKyAgICAgICAgfSwKKyNlbmRpZgorICAgICAgICAvL05WX1RBQkxFX1JTU0lfQ0hBTk5FTF9PRkZTRVRTCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vUEhZX1JYX0NIQUlOXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2JSc3NpT2Zmc2V0CisgICAgICAgICAgICAgICAgezMwMCwgMzAwLCAzMDAsIDMwMCwgMzAwLCAzMDAsIDMwMCwgMzAwLCAzMDAsIDMwMCwgMzAwLCAzMDAsIDMwMCwgMzAwfSwKKworICAgICAgICAgICAgICAgIC8vZ25Sc3NpT2Zmc2V0CisgICAgICAgICAgICAgICAgezMwMCwgMzAwLCAzMDAsIDMwMCwgMzAwLCAzMDAsIDMwMCwgMzAwLCAzMDAsIDMwMCwgMzAwLCAzMDAsIDMwMCwgMzAwfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC8vcnN2ZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vYlJzc2lPZmZzZXQKKyAgICAgICAgICAgICAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisKKyAgICAgICAgICAgICAgICAvL2duUnNzaU9mZnNldAorICAgICAgICAgICAgICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQorICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIC8vTlZfVEFCTEVfUkZfQ0FMX1ZBTFVFUworICAgICAgICB7CisgICAgICAgICAgICAvL3R5cGVkZWYgc3RydWN0CisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHRBTklfVTMyIGNhbFN0YXR1czsgIC8vdXNlIGVOdkNhbElECisgICAgICAgICAgICAvLyAgICBzQ2FsRGF0YSBjYWxEYXRhOworICAgICAgICAgICAgLy99c1JGQ2FsVmFsdWVzOworCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgIC8vY2FsU3RhdHVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcHJvY2Vzc19tb25pdG9yOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2hkZXRfY2FsX2NvZGU7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcnhmZV9nbV8yOworCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vdHhfYmJmX3J0dW5lOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3BhX3J0dW5lX3JlZzsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9ydF9jb2RlOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2JpYXNfcnR1bmU7CisKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9iYl9idzE7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vYmJfYncyOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3Jlc2VydmVkMDsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9yZXNlcnZlZDExOworCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vYmJfYnczOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2JiX2J3NDsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9iYl9idzU7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vYmJfYnc2OworCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcmNNZWFzdXJlZDsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy90eF9iYmZfY3Q7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vdHhfYmJmX2N0cjsKKworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2NzaF9tYXhnYWluX3JlZzsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9jc2hfMGRiX3JlZzsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9jc2hfbTNkYl9yZWc7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vY3NoX202ZGJfcmVnOworCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vY2ZmXzBkYl9yZWc7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vY2ZmX20zZGJfcmVnOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2NmZl9tNmRiX3JlZzsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9yeGZlX2dwaW9fY3RsXzE7CisKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9taXhfYmFsX2NudF8yOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3J4ZmVfbG5hX2hpZ2hnYWluX2JpYXNfY3RsX2RlbHRhOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3J4ZmVfbG5hX2xvYWRfY3R1bmU7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcnhmZV9sbmFfbmdtX3J0dW5lOworCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcnhfaW0yX3NwYXJlMDsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9yeF9pbTJfc3BhcmUxOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2hkZXRfZGNvCisKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9wbGxfdmZjX3JlZzNfYjA7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcGxsX3ZmY19yZWczX2IxOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3BsbF92ZmNfcmVnM19iMjsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9wbGxfdmZjX3JlZzNfYjM7CisKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy90ZW1wU3RhcnQ7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcm9vbVRlbXA7CisKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9hbWJpZW50Q2FsVGVtcDsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9hbWJpZW50Q2FsVGVtcFZhbGlkOworICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAvL3Jlc2VydmVkMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICAvL05WX1RBQkxFX0FOVEVOTkFfUEFUSF9MT1NTCisgICAgICAgIHsKKyAgICAgICAgICAgIDI4MCwgIC8vIFJGX0NIQU5fMQorICAgICAgICAgICAgMjcwLCAgLy8gUkZfQ0hBTl8yCisgICAgICAgICAgICAyNzAsICAvLyBSRl9DSEFOXzMKKyAgICAgICAgICAgIDI3MCwgIC8vIFJGX0NIQU5fNAorICAgICAgICAgICAgMjcwLCAgLy8gUkZfQ0hBTl81CisgICAgICAgICAgICAyNzAsICAvLyBSRl9DSEFOXzYKKyAgICAgICAgICAgIDI4MCwgIC8vIFJGX0NIQU5fNworICAgICAgICAgICAgMjgwLCAgLy8gUkZfQ0hBTl84CisgICAgICAgICAgICAyOTAsICAvLyBSRl9DSEFOXzkKKyAgICAgICAgICAgIDMwMCwgIC8vIFJGX0NIQU5fMTAKKyAgICAgICAgICAgIDMwMCwgIC8vIFJGX0NIQU5fMTEKKyAgICAgICAgICAgIDMxMCwgIC8vIFJGX0NIQU5fMTIKKyAgICAgICAgICAgIDMxMCwgIC8vIFJGX0NIQU5fMTMKKyAgICAgICAgICAgIDMxMCAgIC8vIFJGX0NIQU5fMTQKKyAgICAgICAgfSwKKworICAgICAgICAvL05WX1RBQkxFX1BBQ0tFVF9UWVBFX1BPV0VSX0xJTUlUUworICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgMjE1MCwgIC8vIFJGX0NIQU5fMQorICAgICAgICAgICAgICAgIDIxNTAsICAvLyBSRl9DSEFOXzIKKyAgICAgICAgICAgICAgICAyMTUwLCAgLy8gUkZfQ0hBTl8zCisgICAgICAgICAgICAgICAgMjE1MCwgIC8vIFJGX0NIQU5fNAorICAgICAgICAgICAgICAgIDIxNTAsICAvLyBSRl9DSEFOXzUKKyAgICAgICAgICAgICAgICAyMTUwLCAgLy8gUkZfQ0hBTl82CisgICAgICAgICAgICAgICAgMjE1MCwgIC8vIFJGX0NIQU5fNworICAgICAgICAgICAgICAgIDIxNTAsICAvLyBSRl9DSEFOXzgKKyAgICAgICAgICAgICAgICAyMTUwLCAgLy8gUkZfQ0hBTl85CisgICAgICAgICAgICAgICAgMjE1MCwgIC8vIFJGX0NIQU5fMTAKKyAgICAgICAgICAgICAgICAyMTUwLCAgLy8gUkZfQ0hBTl8xMQorICAgICAgICAgICAgICAgIDIxNTAsICAvLyBSRl9DSEFOXzEyCisgICAgICAgICAgICAgICAgMjE1MCwgIC8vIFJGX0NIQU5fMTMKKyAgICAgICAgICAgICAgICAyMTUwICAgLy8gUkZfQ0hBTl8xNAorICAgICAgICAgICAgfSwvL01PREVfODAyXzExQgorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgMTg1MCwgIC8vIFJGX0NIQU5fMQorICAgICAgICAgICAgICAgIDE5NTAsICAvLyBSRl9DSEFOXzIKKyAgICAgICAgICAgICAgICAxOTUwLCAgLy8gUkZfQ0hBTl8zCisgICAgICAgICAgICAgICAgMTk1MCwgIC8vIFJGX0NIQU5fNAorICAgICAgICAgICAgICAgIDE5NTAsICAvLyBSRl9DSEFOXzUKKyAgICAgICAgICAgICAgICAxOTUwLCAgLy8gUkZfQ0hBTl82CisgICAgICAgICAgICAgICAgMTk1MCwgIC8vIFJGX0NIQU5fNworICAgICAgICAgICAgICAgIDE5NTAsICAvLyBSRl9DSEFOXzgKKyAgICAgICAgICAgICAgICAxOTUwLCAgLy8gUkZfQ0hBTl85CisgICAgICAgICAgICAgICAgMTk1MCwgIC8vIFJGX0NIQU5fMTAKKyAgICAgICAgICAgICAgICAxNzUwLCAgLy8gUkZfQ0hBTl8xMQorICAgICAgICAgICAgICAgIDE5NTAsICAvLyBSRl9DSEFOXzEyCisgICAgICAgICAgICAgICAgMTk1MCwgIC8vIFJGX0NIQU5fMTMKKyAgICAgICAgICAgICAgICAxOTUwICAgLy8gUkZfQ0hBTl8xNAorICAgICAgICAgICAgfSwvL01PREVfODAyXzExQUcKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDE3NTAsICAvLyBSRl9DSEFOXzEKKyAgICAgICAgICAgICAgICAxNzUwLCAgLy8gUkZfQ0hBTl8yCisgICAgICAgICAgICAgICAgMTc1MCwgIC8vIFJGX0NIQU5fMworICAgICAgICAgICAgICAgIDE3NTAsICAvLyBSRl9DSEFOXzQKKyAgICAgICAgICAgICAgICAxNzUwLCAgLy8gUkZfQ0hBTl81CisgICAgICAgICAgICAgICAgMTc1MCwgIC8vIFJGX0NIQU5fNgorICAgICAgICAgICAgICAgIDE3NTAsICAvLyBSRl9DSEFOXzcKKyAgICAgICAgICAgICAgICAxNzUwLCAgLy8gUkZfQ0hBTl84CisgICAgICAgICAgICAgICAgMTc1MCwgIC8vIFJGX0NIQU5fOQorICAgICAgICAgICAgICAgIDE3NTAsICAvLyBSRl9DSEFOXzEwCisgICAgICAgICAgICAgICAgMTc1MCwgIC8vIFJGX0NIQU5fMTEKKyAgICAgICAgICAgICAgICAxNzUwLCAgLy8gUkZfQ0hBTl8xMgorICAgICAgICAgICAgICAgIDE3NTAsICAvLyBSRl9DSEFOXzEzCisgICAgICAgICAgICAgICAgMTc1MCAgIC8vIFJGX0NIQU5fMTQKKyAgICAgICAgICAgIH0sLy9NT0RFXzgwMl8xMUFHCisgICAgICAgIH0sCisKKyAgICAgICAgLy9OVl9UQUJMRV9PRkRNX0NNRF9QV1JfT0ZGU0VUCisgICAgICAgIHsKKyAgICAgICAgICAgIDAsIDAKKyAgICAgICAgfSwKKworICAgICAgICAvL05WX1RBQkxFX1RYX0JCX0ZJTFRFUl9NT0RFCisgICAgICAgIHsKKyAgICAgICAgICAgIDAKKyAgICAgICAgfQorCisgICAgfSAvLyB0YWJsZXMKK307CisKKyNlbHNlIAorCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJ3bGFuX252LmgiCisvLyNpbmNsdWRlICJ3bGFuX2hhbF9tc2cuaCIKKworY29uc3Qgc0hhbE52IG52RGVmYXVsdHMgPQoreworICAgIHsKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRBTklfVTE2ICBwcm9kdWN0SWQ7CisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0QU5JX1U4ICAgcHJvZHVjdEJhbmRzOworICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdEFOSV9VOCAgIHdsYW5OdlJldklkOyAvLzA6IFdDTjEzMTIsIDE6IFdDTjEzMTQsIDI6IFdDTjM2NjAKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRBTklfVTggICBudW1PZlR4Q2hhaW5zOworICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdEFOSV9VOCAgIG51bU9mUnhDaGFpbnM7CisgICAgICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0QU5JX1U4ICAgbWFjQWRkcltOVl9GSUVMRF9NQUNfQUREUl9TSVpFXTsKKyAgICAgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRBTklfVTggICBtYWNBZGRyW05WX0ZJRUxEX01BQ19BRERSX1NJWkVdOworICAgICAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdEFOSV9VOCAgIG1hY0FkZHJbTlZfRklFTERfTUFDX0FERFJfU0laRV07CisgICAgICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0QU5JX1U4ICAgbWFjQWRkcltOVl9GSUVMRF9NQUNfQUREUl9TSVpFXTsKKyAgICAgICAgeyAiXDAiIH0sCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0QU5JX1U4ICAgMCA6IEludGVybmFsIGNvdXBsZXIsIDEgOiBFeHRlcm5hbCBjb3VwbGVyCisgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNlcnZlZCBCeXRlIHRvIG1ha2UgYWxpZ25tZW50CisgICAgfSwgLy9maWVsZHMKKworICAgIHsKKyAgICAgICAgLy8gTlZfVEFCTEVfUkFURV9QT1dFUl9TRVRUSU5HUworICAgICAgICB7CisgICAgICAgICAgICAvLyB0eXBlZGVmIHRBTklfUzggdFBvd2VyZEJtOworICAgICAgICAgICAgLy90eXBlZGVmIHRQb3dlcmRCbSB0UmF0ZUdyb3VwUHdyW05VTV9IQUxfUEhZX1JBVEVTXTsKKyAgICAgICAgICAgIC8vdFJhdGVHcm91cFB3ciAgICAgICBwd3JPcHRpbXVtW05VTV9SRl9TVUJCQU5EU107CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vODAyLjExYiBSYXRlcworICAgICAgICAgICAgICAgIHsxOTAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9MT05HXzFfTUJQUywKKyAgICAgICAgICAgICAgICB7MTkwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfTE9OR18yX01CUFMsCisgICAgICAgICAgICAgICAgezE5MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX0xPTkdfNV81X01CUFMsCisgICAgICAgICAgICAgICAgezE5MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX0xPTkdfMTFfTUJQUywKKyAgICAgICAgICAgICAgICB7MTkwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfU0hPUlRfMl9NQlBTLAorICAgICAgICAgICAgICAgIHsxOTAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9TSE9SVF81XzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTkwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfU0hPUlRfMTFfTUJQUywKKworICAgICAgICAgICAgICAgIC8vMTFBIDIwTUh6IFJhdGVzCisgICAgICAgICAgICAgICAgezE3MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTcwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfOV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNzAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV8xMl9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV8xOF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV8yNF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV8zNl9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV80OF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV81NF9NQlBTLAorCisgICAgICAgICAgICAgICAgLy9EVVAgMTFBIDQwTUh6IFJhdGVzCisgICAgICAgICAgICAgICAgezE3MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF82X01CUFMsCisgICAgICAgICAgICAgICAgezE3MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF85X01CUFMsCisgICAgICAgICAgICAgICAgezE3MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF8xMl9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV9EVVBfMThfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzI0X01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF8zNl9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV9EVVBfNDhfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzU0X01CUFMsCisKKyAgICAgICAgICAgICAgICAvL01DUyBJbmRleCAjMC03KDIwLzQwTUh6KQorICAgICAgICAgICAgICAgIHsxNzAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzZfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNzAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzEzX01CUFMsCisgICAgICAgICAgICAgICAgezE2NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMTlfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzI2X01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMzlfTUJQUywKKyAgICAgICAgICAgICAgICB7MTU1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU181Ml9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzU4XzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTMwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU182NV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNzAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzdfMl9NQlBTLAorICAgICAgICAgICAgICAgIHsxNzAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzE0XzRfTUJQUywKKyAgICAgICAgICAgICAgICB7MTY1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR18yMV83X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfMjhfOV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzQzXzNfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR181N184X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfNjVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTMwMH0sICAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfNzJfMl9NQlBTLAorCisgICAgICAgICAgICAgICAgLy9NQ1MgSW5kZXggIzgtMTUoMjAvNDBNSHopCisgICAgICAgICAgICAgICAgezE3MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfMTNfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNzAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzI3X01CUFMsCisgICAgICAgICAgICAgICAgezE2NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfNDBfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzU0X01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfODFfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl8xMDhfTUJQUywKKyAgICAgICAgICAgICAgICB7MTQwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl8xMjFfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMzAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzEzNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNzAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHX0NCXzE1X01CUFMsCisgICAgICAgICAgICAgICAgezE3MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMzBfTUJQUywKKyAgICAgICAgICAgICAgICB7MTY1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl80NV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHX0NCXzYwX01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfOTBfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl8xMjBfTUJQUywKKyAgICAgICAgICAgICAgICB7MTQwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl8xMzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTM1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl8xNTBfTUJQUywKKyAgICAgICAgICAgICAgICB9LCAgLy8gICAgUkZfU1VCQkFORF8yXzRfR0haCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy84MDIuMTFiIFJhdGVzCisgICAgICAgICAgICAgICAgezB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX0xPTkdfMV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9MT05HXzJfTUJQUywKKyAgICAgICAgICAgICAgICB7MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfTE9OR181XzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfTE9OR18xMV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9TSE9SVF8yX01CUFMsCisgICAgICAgICAgICAgICAgezB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX1NIT1JUXzVfNV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9TSE9SVF8xMV9NQlBTLAorCisgICAgICAgICAgICAgICAgLy8xMUEgMjBNSHogUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfNl9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV85X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzEyX01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzE4X01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzI0X01CUFMsCisgICAgICAgICAgICAgICAgezE0NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzM2X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzQ4X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzU0X01CUFMsCisKKyAgICAgICAgICAgICAgICAvL0RVUCAxMUEgNDBNSHogUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzlfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzEyX01CUFMsCisgICAgICAgICAgICAgICAgezE2NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF8xOF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV9EVVBfMjRfTUJQUywKKyAgICAgICAgICAgICAgICB7MTQ1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzM2X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF80OF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV9EVVBfNTRfTUJQUywKKworICAgICAgICAgICAgICAgIC8vTUNTIEluZGV4ICMwLTcoMjAvNDBNSHopCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNl81X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMTNfTUJQUywKKyAgICAgICAgICAgICAgICB7MTU1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU18xOV81X01CUFMsCisgICAgICAgICAgICAgICAgezE1MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMjZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTQ1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU18zOV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzUyX01CUFMsCisgICAgICAgICAgICAgICAgezEzNTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNThfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzY1X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfN18yX01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfMTRfNF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzIxXzdfTUJQUywKKyAgICAgICAgICAgICAgICB7MTU1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR18yOF85X01CUFMsCisgICAgICAgICAgICAgICAgezE0NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfNDNfM19NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzU3XzhfTUJQUywKKyAgICAgICAgICAgICAgICB7MTMwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR182NV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzcyXzJfTUJQUywKKworICAgICAgICAgICAgICAgIC8vTUNTIEluZGV4ICM4LTE1KDIwLzQwTUh6KQorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzEzXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl8yN19NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzQwXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl81NF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzgxX01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfMTA4X01CUFMsCisgICAgICAgICAgICAgICAgezEzMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfMTIxXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTIwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl8xMzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl8xNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHX0NCXzMwX01CUFMsCisgICAgICAgICAgICAgICAgezE1MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfNDVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl82MF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHX0NCXzkwX01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTIwX01CUFMsCisgICAgICAgICAgICAgICAgezEzMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTM1X01CUFMsCisgICAgICAgICAgICAgICAgezEyMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTUwX01CUFMsCisgICAgICAgICAgICAgICAgfSwgIC8vICAgIFJGX1NVQkJBTkRfNV9MT1dfR0haCisKKyAgICAgICAgICAgICAgICAvLyA1RyBNaWQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy84MDIuMTFiIFJhdGVzCisgICAgICAgICAgICAgICAgezB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX0xPTkdfMV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9MT05HXzJfTUJQUywKKyAgICAgICAgICAgICAgICB7MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfTE9OR181XzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfTE9OR18xMV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9TSE9SVF8yX01CUFMsCisgICAgICAgICAgICAgICAgezB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX1NIT1JUXzVfNV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9TSE9SVF8xMV9NQlBTLAorCisgICAgICAgICAgICAgICAgLy8xMUEgMjBNSHogUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfNl9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV85X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzEyX01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzE4X01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzI0X01CUFMsCisgICAgICAgICAgICAgICAgezE0NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzM2X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzQ4X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzU0X01CUFMsCisKKyAgICAgICAgICAgICAgICAvL0RVUCAxMUEgNDBNSHogUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzlfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzEyX01CUFMsCisgICAgICAgICAgICAgICAgezE2NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF8xOF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV9EVVBfMjRfTUJQUywKKyAgICAgICAgICAgICAgICB7MTQ1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzM2X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF80OF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV9EVVBfNTRfTUJQUywKKworICAgICAgICAgICAgICAgIC8vTUNTIEluZGV4ICMwLTcoMjAvNDBNSHopCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNl81X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMTNfTUJQUywKKyAgICAgICAgICAgICAgICB7MTU1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU18xOV81X01CUFMsCisgICAgICAgICAgICAgICAgezE1MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMjZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTQ1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU18zOV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzUyX01CUFMsCisgICAgICAgICAgICAgICAgezEzNTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNThfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzY1X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfN18yX01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfMTRfNF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzIxXzdfTUJQUywKKyAgICAgICAgICAgICAgICB7MTU1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR18yOF85X01CUFMsCisgICAgICAgICAgICAgICAgezE0NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfNDNfM19NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzU3XzhfTUJQUywKKyAgICAgICAgICAgICAgICB7MTMwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR182NV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzcyXzJfTUJQUywKKworICAgICAgICAgICAgICAgIC8vTUNTIEluZGV4ICM4LTE1KDIwLzQwTUh6KQorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzEzXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl8yN19NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzQwXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl81NF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzgxX01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfMTA4X01CUFMsCisgICAgICAgICAgICAgICAgezEzMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfMTIxXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTIwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl8xMzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl8xNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHX0NCXzMwX01CUFMsCisgICAgICAgICAgICAgICAgezE1MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfNDVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl82MF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHX0NCXzkwX01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTIwX01CUFMsCisgICAgICAgICAgICAgICAgezEzMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTM1X01CUFMsCisgICAgICAgICAgICAgICAgezEyMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTUwX01CUFMsCisgICAgICAgICAgICAgICAgfSwgIC8vICAgIC8vICAgICBSRl9TVUJCQU5EXzVfTUlEX0dIWgorICAgICAgICAgICAgICAgIC8vIDVHIEhpZ2gKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy84MDIuMTFiIFJhdGVzCisgICAgICAgICAgICAgICAgezB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX0xPTkdfMV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9MT05HXzJfTUJQUywKKyAgICAgICAgICAgICAgICB7MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfTE9OR181XzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfTE9OR18xMV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9TSE9SVF8yX01CUFMsCisgICAgICAgICAgICAgICAgezB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX1NIT1JUXzVfNV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9TSE9SVF8xMV9NQlBTLAorCisgICAgICAgICAgICAgICAgLy8xMUEgMjBNSHogUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfNl9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV85X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzEyX01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzE4X01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzI0X01CUFMsCisgICAgICAgICAgICAgICAgezE0NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzM2X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzQ4X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzU0X01CUFMsCisKKyAgICAgICAgICAgICAgICAvL0RVUCAxMUEgNDBNSHogUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzlfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzEyX01CUFMsCisgICAgICAgICAgICAgICAgezE2NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF8xOF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV9EVVBfMjRfTUJQUywKKyAgICAgICAgICAgICAgICB7MTQ1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzM2X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF80OF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV9EVVBfNTRfTUJQUywKKworICAgICAgICAgICAgICAgIC8vTUNTIEluZGV4ICMwLTcoMjAvNDBNSHopCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNl81X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMTNfTUJQUywKKyAgICAgICAgICAgICAgICB7MTU1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU18xOV81X01CUFMsCisgICAgICAgICAgICAgICAgezE1MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMjZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTQ1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU18zOV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzUyX01CUFMsCisgICAgICAgICAgICAgICAgezEzNTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNThfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzY1X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfN18yX01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfMTRfNF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzIxXzdfTUJQUywKKyAgICAgICAgICAgICAgICB7MTU1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR18yOF85X01CUFMsCisgICAgICAgICAgICAgICAgezE0NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfNDNfM19NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzU3XzhfTUJQUywKKyAgICAgICAgICAgICAgICB7MTMwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR182NV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzcyXzJfTUJQUywKKworICAgICAgICAgICAgICAgIC8vTUNTIEluZGV4ICM4LTE1KDIwLzQwTUh6KQorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzEzXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl8yN19NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzQwXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl81NF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzgxX01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfMTA4X01CUFMsCisgICAgICAgICAgICAgICAgezEzMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfMTIxXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTIwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl8xMzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl8xNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHX0NCXzMwX01CUFMsCisgICAgICAgICAgICAgICAgezE1MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfNDVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl82MF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHX0NCXzkwX01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTIwX01CUFMsCisgICAgICAgICAgICAgICAgezEzMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTM1X01CUFMsCisgICAgICAgICAgICAgICAgezEyMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTUwX01CUFMsCisgICAgICAgICAgICAgICAgfSwgIC8vICAgIFJGX1NVQkJBTkRfNV9ISUdIX0dIWiwKKyAgICAgICAgICAgICAgICAvLyA0LjlHCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy84MDIuMTFiIFJhdGVzCisgICAgICAgICAgICAgICAgezB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX0xPTkdfMV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9MT05HXzJfTUJQUywKKyAgICAgICAgICAgICAgICB7MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfTE9OR181XzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUJfTE9OR18xMV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9TSE9SVF8yX01CUFMsCisgICAgICAgICAgICAgICAgezB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFCX1NIT1JUXzVfNV9NQlBTLAorICAgICAgICAgICAgICAgIHswfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQl9TSE9SVF8xMV9NQlBTLAorCisgICAgICAgICAgICAgICAgLy8xMUEgMjBNSHogUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfNl9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV85X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzEyX01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzE4X01CUFMsCisgICAgICAgICAgICAgICAgezE1NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzI0X01CUFMsCisgICAgICAgICAgICAgICAgezE0NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzM2X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzQ4X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBXzU0X01CUFMsCisKKyAgICAgICAgICAgICAgICAvL0RVUCAxMUEgNDBNSHogUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzlfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzEyX01CUFMsCisgICAgICAgICAgICAgICAgezE2NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF8xOF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV9EVVBfMjRfTUJQUywKKyAgICAgICAgICAgICAgICB7MTQ1MH0sICAgIC8vIEhBTF9QSFlfUkFURV8xMUFfRFVQXzM2X01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfMTFBX0RVUF80OF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFXzExQV9EVVBfNTRfTUJQUywKKworICAgICAgICAgICAgICAgIC8vTUNTIEluZGV4ICMwLTcoMjAvNDBNSHopCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNl81X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMTNfTUJQUywKKyAgICAgICAgICAgICAgICB7MTU1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU18xOV81X01CUFMsCisgICAgICAgICAgICAgICAgezE1MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfMjZfTUJQUywKKyAgICAgICAgICAgICAgICB7MTQ1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU18zOV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzUyX01CUFMsCisgICAgICAgICAgICAgICAgezEzNTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfNThfNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTXzY1X01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfN18yX01CUFMsCisgICAgICAgICAgICAgICAgezE2MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfMTRfNF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzIxXzdfTUJQUywKKyAgICAgICAgICAgICAgICB7MTU1MH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR18yOF85X01CUFMsCisgICAgICAgICAgICAgICAgezE0NTB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfNDNfM19NQlBTLAorICAgICAgICAgICAgICAgIHsxNDAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzU3XzhfTUJQUywKKyAgICAgICAgICAgICAgICB7MTMwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR182NV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHXzcyXzJfTUJQUywKKworICAgICAgICAgICAgICAgIC8vTUNTIEluZGV4ICM4LTE1KDIwLzQwTUh6KQorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzEzXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl8yN19NQlBTLAorICAgICAgICAgICAgICAgIHsxNTUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzQwXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl81NF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX0NCXzgxX01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfMTA4X01CUFMsCisgICAgICAgICAgICAgICAgezEzMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfQ0JfMTIxXzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTIwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19DQl8xMzVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTYwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl8xNV9NQlBTLAorICAgICAgICAgICAgICAgIHsxNjAwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHX0NCXzMwX01CUFMsCisgICAgICAgICAgICAgICAgezE1MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfNDVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTUwMH0sICAgIC8vIEhBTF9QSFlfUkFURV9NQ1NfMU5TU19NTV9TR19DQl82MF9NQlBTLAorICAgICAgICAgICAgICAgIHsxNDUwfSwgICAgLy8gSEFMX1BIWV9SQVRFX01DU18xTlNTX01NX1NHX0NCXzkwX01CUFMsCisgICAgICAgICAgICAgICAgezE0MDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTIwX01CUFMsCisgICAgICAgICAgICAgICAgezEzMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTM1X01CUFMsCisgICAgICAgICAgICAgICAgezEyMDB9LCAgICAvLyBIQUxfUEhZX1JBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTUwX01CUFMsCisgICAgICAgICAgICAgICAgfSwgIC8vICAgIFJGX1NVQkJBTkRfNF85X0dIWgorICAgICAgICB9LAorCisgICAgICAgIC8vIE5WX1RBQkxFX1JFR1VMQVRPUllfRE9NQUlOUworICAgICAgICB7CisgICAgICAgICAgICAvLyB0eXBlZGVmIHN0cnVjdAorICAgICAgICAgICAgLy8geworICAgICAgICAgICAgLy8gICAgIHRBTklfQk9PTEVBTiBlbmFibGVkOworICAgICAgICAgICAgLy8gICAgIHRQb3dlcmRCbSBwd3JMaW1pdDsKKyAgICAgICAgICAgIC8vIH1zUmVndWxhdG9yeUNoYW5uZWw7CisKKyAgICAgICAgICAgIC8vIHR5cGVkZWYgc3RydWN0CisgICAgICAgICAgICAvLyB7CisgICAgICAgICAgICAvLyAgICAgc1JlZ3VsYXRvcnlDaGFubmVsIGNoYW5uZWxzW05VTV9SRl9DSEFOTkVMU107CisgICAgICAgICAgICAvLyAgICAgdUFic1B3clByZWNpc2lvbiBhbnRlbm5hR2FpbltOVU1fUkZfU1VCQkFORFNdOworICAgICAgICAgICAgLy8gICAgIHVBYnNQd3JQcmVjaXNpb24gYlJhdGVQb3dlck9mZnNldFtOVU1fMl80R0haX0NIQU5ORUxTXTsKKyAgICAgICAgICAgIC8vIH1zUmVndWxhdG9yeURvbWFpbnM7CisKKyAgICAgICAgICAgIC8vc1JlZ3VsYXRvcnlEb21haW5zICByZWdEb21haW5zW05VTV9SRUdfRE9NQUlOU107CisKKworICAgICAgICAgICAgeyAgIC8vIFJFR19ET01BSU5fRkNDIHN0YXJ0CisgICAgICAgICAgICAgICAgeyAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvL2VuYWJsZWQsIHB3ckxpbWl0CisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMn0sICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAzMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDMwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNC45R0h6IEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yNDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjQ0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI0OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yNTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjA4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzIxMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yMTYsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IExvdyAmIE1pZCBVLU5JSSBCYW5kLCBub25lIENCCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgICAvL1JGX0NIQU5fMzYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgICAvL1JGX0NIQU5fNDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgICAvL1JGX0NIQU5fNDQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgICAvL1JGX0NIQU5fNDgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RGUywgMjR9LCAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RGUywgMjR9LCAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNTYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RGUywgMjR9LCAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNjAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RGUywgMjR9LCAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNjQsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IE1pZCBCYW5kIC0gRVRTSSwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDIyfSwgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMDQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RGUywgMjR9LCAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTA4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMTYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgICAvL1JGX0NIQU5fMTIwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAgLy9SRl9DSEFOXzEyNCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMjgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RGUywgMjR9LCAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTMyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNDAsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IEhpZ2ggVS1OSUkgQmFuZCwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTQ5LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTUzLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTU3LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTYxLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDB9LCAgICAgICAgICAgICAvL1JGX0NIQU5fMTY1LAorCisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzMsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzUsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzcsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzksCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTEsCisKKyAgICAgICAgICAgICAgICAgICAgLy8gNC45R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzI0MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjQ2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8yNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzIxMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjE0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBMb3cgJiBNaWQgVS1OSUkgQmFuZCwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80NiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzU0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyNX0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNjIsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IE1pZCBCYW5kIC0gRVRTSSwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEwMgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTA2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTAKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTE0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzExOAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMjIKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTI2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEzMAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTM0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzgKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogSGlnaCBVLU5JSSBCYW5kLCAgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1MSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1NSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1OSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE2MworICAgICAgICAgICAgICAgIH0sIC8vc1JlZ3VsYXRvcnlDaGFubmVsIGVuZAorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgIC8vIFJGX1NVQkJBTkRfMl80X0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0sICAgLy8gUkZfU1VCQkFORF81X0xPV19HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9LCAgIC8vIFJGX1NVQkJBTkRfNV9NSURfR0haCisgICAgICAgICAgICAgICAgICAgIHswfSwgICAvLyBSRl9TVUJCQU5EXzVfSElHSF9HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9ICAgIC8vIFJGX1NVQkJBTkRfNF85X0dIWgorICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB7IC8vIGJSYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSwgLy8gYlJhdGVQb3dlck9mZnNldCBlbmQKKworICAgICAgICAgICAgICAgIHsgLy8gZ25SYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9hcHBseSB0byBhbGwgMi40IGFuZCA1RyBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSAvLyBnblJhdGVQb3dlck9mZnNldCBlbmQKKyAgICAgICAgICAgIH0sIC8vIFJFR19ET01BSU5fRkNDIGVuZAorCisgICAgICAgICAgICB7ICAgLy8gUkVHX0RPTUFJTl9FVFNJIHN0YXJ0CisgICAgICAgICAgICAgICAgeyAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvL2VuYWJsZWQsIHB3ckxpbWl0CisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE5fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxOX0sICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNC45R0h6IEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzI0MCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzI0NCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzI0OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzI1MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzIwOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzIxMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzIxNiwKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogTG93ICYgTWlkIFUtTklJIEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzM2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fNDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl80NCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzQ4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzUyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzU2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzYwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzY0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBNaWQgQmFuZCAtIEVUU0ksIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTA0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzEwOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTE2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTIwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTI0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTI4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzEzMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMzYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTQwLAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBIaWdoIFUtTklJIEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE0OSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE1MywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE1NywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE2MSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE2NSwKKworICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kLCBjaGFubmVsIGJvbmRlZCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8zLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF82LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF83LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF84LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF85LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTEsCisKKyAgICAgICAgICAgICAgICAgICAgLy8gNC45R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzI0MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjQ2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8yNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzIxMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjE0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBMb3cgJiBNaWQgVS1OSUkgQmFuZCwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80NiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzU0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNjIsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IE1pZCBCYW5kIC0gRVRTSSwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEwMgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTA2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTAKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTE0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzExOAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMjIKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTI2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEzMAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTM0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzgKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogSGlnaCBVLU5JSSBCYW5kLCAgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTUxLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xNTUsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1OSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE2MworICAgICAgICAgICAgICAgIH0sIC8vc1JlZ3VsYXRvcnlDaGFubmVsIGVuZAorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgIC8vIFJGX1NVQkJBTkRfMl80X0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0sICAgLy8gUkZfU1VCQkFORF81X0xPV19HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9LCAgIC8vIFJGX1NVQkJBTkRfNV9NSURfR0haCisgICAgICAgICAgICAgICAgICAgIHswfSwgICAvLyBSRl9TVUJCQU5EXzVfSElHSF9HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9ICAgIC8vIFJGX1NVQkJBTkRfNF85X0dIWgorICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB7IC8vIGJSYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSwgLy8gYlJhdGVQb3dlck9mZnNldCBlbmQKKworICAgICAgICAgICAgICAgIHsgLy8gZ25SYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9hcHBseSB0byBhbGwgMi40IGFuZCA1RyBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSAvLyBnblJhdGVQb3dlck9mZnNldCBlbmQKKyAgICAgICAgICAgIH0sIC8vIFJFR19ET01BSU5fRVRTSSBlbmQKKworICAgICAgICAgICAgeyAgIC8vIFJFR19ET01BSU5fSkFQQU4gc3RhcnQKKyAgICAgICAgICAgICAgICB7IC8vc1JlZ3VsYXRvcnlDaGFubmVsIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxlZCwgcHdyTGltaXQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZCwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjB9LCAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxOH0sICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisKKyAgICAgICAgICAgICAgICAgICAgLy80LjlHSHogQmFuZCwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI0MCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yNDQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjQ4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI1MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yMDgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzIxNiwKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogTG93ICYgTWlkIFUtTklJIEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxN30sICAgICAgICAgICAgLy9SRl9DSEFOXzM2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE3fSwgICAgICAgICAgICAvL1JGX0NIQU5fNDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl80NCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxN30sICAgICAgICAgICAgLy9SRl9DSEFOXzQ4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fNTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RGUywgMjR9LCAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81NiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fNjQsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IE1pZCBCYW5kIC0gRVRTSSwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDIyfSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTAwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTA0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTA4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTE2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDB9LCAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDB9LCAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTI0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDB9LCAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTI4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTMyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTM2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQwLAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBIaWdoIFUtTklJIEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xNDksCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTUzLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE1NywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xNjEsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xNjUsCisKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZCwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMn0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMn0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfOSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMSwKKworICAgICAgICAgICAgICAgICAgICAvLyA0LjlHSHogQmFuZCwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjQyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8yNDYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzI1MCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjEwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8yMTQsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IExvdyAmIE1pZCBVLU5JSSBCYW5kLCBjaGFubmVsIGJvbmRlZCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8zOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNDIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQ2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81MCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNTQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzU4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI1fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF82MiwKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogTWlkIEJhbmQgLSBFVFNJLCBjaGFubmVsIGJvbmRlZCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTAyCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMDYKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzExMAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTQKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTE4CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEyMgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMjYKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTMwCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzQKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEzOAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBIaWdoIFUtTklJIEJhbmQsICBjaGFubmVsIGJvbmRlZCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTUxLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTU1LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTU5LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTYzCisgICAgICAgICAgICAgICAgfSwgLy9zUmVndWxhdG9yeUNoYW5uZWwgZW5kCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgLy8gUkZfU1VCQkFORF8yXzRfR0haCisgICAgICAgICAgICAgICAgICAgIHswfSwgICAvLyBSRl9TVUJCQU5EXzVfTE9XX0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0sICAgLy8gUkZfU1VCQkFORF81X01JRF9HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9LCAgIC8vIFJGX1NVQkJBTkRfNV9ISUdIX0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0gICAgLy8gUkZfU1VCQkFORF80XzlfR0haCisgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIHsgLy8gYlJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9LCAvLyBiUmF0ZVBvd2VyT2Zmc2V0IGVuZAorCisgICAgICAgICAgICAgICAgeyAvLyBnblJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvL2FwcGx5IHRvIGFsbCAyLjQgYW5kIDVHIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IGVuZAorICAgICAgICAgICAgfSwgLy8gUkVHX0RPTUFJTl9KQVBBTiBlbmQKKworICAgICAgICAgICAgeyAgIC8vIFJFR19ET01BSU5fV09STEQgc3RhcnQKKyAgICAgICAgICAgICAgICB7IC8vc1JlZ3VsYXRvcnlDaGFubmVsIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxlZCwgcHdyTGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTZ9LCAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNC45R0h6IEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yNDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjQ0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI0OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yNTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjA4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzIxMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yMTYsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IExvdyAmIE1pZCBVLU5JSSBCYW5kLCBub25lIENCCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8zNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxN30sICAgICAgICAgICAgLy9SRl9DSEFOXzQwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE3fSwgICAgICAgICAgICAvL1JGX0NIQU5fNDQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl80OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ERlMsIDI0fSwgICAgICAgICAgICAgICAvL1JGX0NIQU5fNTYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RGUywgMjR9LCAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82MCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzY0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBNaWQgQmFuZCAtIEVUU0ksIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyMn0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwNCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAwfSwgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAwfSwgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyNCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAwfSwgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfREZTLCAyNH0sICAgICAgICAgICAgICAgLy9SRl9DSEFOXzE0MCwKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogSGlnaCBVLU5JSSBCYW5kLCBub25lIENCCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTQ5LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE1MywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xNTcsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTYxLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTY1LAorCisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzMsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzUsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzcsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzksCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTEsCisKKyAgICAgICAgICAgICAgICAgICAgLy8gNC45R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzI0MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjQ2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8yNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzIxMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjE0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBMb3cgJiBNaWQgVS1OSUkgQmFuZCwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80NiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzU0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyNX0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNjIsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IE1pZCBCYW5kIC0gRVRTSSwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEwMgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTA2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTAKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTE0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzExOAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMjIKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTI2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEzMAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTM0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzgKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogSGlnaCBVLU5JSSBCYW5kLCAgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1MSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1NSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1OSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE2MworICAgICAgICAgICAgICAgIH0sIC8vc1JlZ3VsYXRvcnlDaGFubmVsIGVuZAorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgIC8vIFJGX1NVQkJBTkRfMl80X0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0sICAgLy8gUkZfU1VCQkFORF81X0xPV19HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9LCAgIC8vIFJGX1NVQkJBTkRfNV9NSURfR0haCisgICAgICAgICAgICAgICAgICAgIHswfSwgICAvLyBSRl9TVUJCQU5EXzVfSElHSF9HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9ICAgIC8vIFJGX1NVQkJBTkRfNF85X0dIWgorICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB7IC8vIGJSYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSwgLy8gYlJhdGVQb3dlck9mZnNldCBlbmQKKworICAgICAgICAgICAgICAgIHsgLy8gZ25SYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9hcHBseSB0byBhbGwgMi40IGFuZCA1RyBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSAvLyBnblJhdGVQb3dlck9mZnNldCBlbmQKKyAgICAgICAgICAgIH0sIC8vIFJFR19ET01BSU5fV09STEQgZW5kCisKKyAgICAgICAgICAgIHsgICAvLyBSRUdfRE9NQUlOX05fQU1FUl9FWENfRkNDIHN0YXJ0CisgICAgICAgICAgICAgICAgeyAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvL2VuYWJsZWQsIHB3ckxpbWl0CisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNn0sICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTZ9LCAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAzMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDMwfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNC45R0h6IEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yNDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjQ0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI0OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yNTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjA4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzIxMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yMTYsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IExvdyAmIE1pZCBVLU5JSSBCYW5kLCBub25lIENCCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8zNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxN30sICAgICAgICAgICAgLy9SRl9DSEFOXzQwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE3fSwgICAgICAgICAgICAvL1JGX0NIQU5fNDQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl80OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl81MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl81NiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl82MCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl82NCwKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogTWlkIEJhbmQgLSBFVFNJLCBub25lIENCCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIyfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTAwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzEwNCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMDgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzExNiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzEyMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzEyNCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzEyOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMzIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTM2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE0MCwKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogSGlnaCBVLU5JSSBCYW5kLCBub25lIENCCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xNDksCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xNTMsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xNTcsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xNjEsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE2NSwKKworICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kLCBjaGFubmVsIGJvbmRlZCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIyfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8zLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF82LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF83LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF84LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIyfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF85LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzExLAorCisgICAgICAgICAgICAgICAgICAgIC8vIDQuOUdIeiBCYW5kLCBjaGFubmVsIGJvbmRlZCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8yNDIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzI0NiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjUwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8yMTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzIxNCwKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogTG93ICYgTWlkIFUtTklJIEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzM4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNDYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzUwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81NCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNTgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjV9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzYyLAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBNaWQgQmFuZCAtIEVUU0ksIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMDIKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEwNgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTEwCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzExNAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTgKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTIyCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEyNgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzAKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEzNAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTM4CisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IEhpZ2ggVS1OSUkgQmFuZCwgIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xNTEsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xNTUsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDMwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xNTksCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xNjMKKyAgICAgICAgICAgICAgICB9LCAvL3NSZWd1bGF0b3J5Q2hhbm5lbCBlbmQKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAvLyBSRl9TVUJCQU5EXzJfNF9HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9LCAgIC8vIFJGX1NVQkJBTkRfNV9MT1dfR0haCisgICAgICAgICAgICAgICAgICAgIHswfSwgICAvLyBSRl9TVUJCQU5EXzVfTUlEX0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0sICAgLy8gUkZfU1VCQkFORF81X0hJR0hfR0haCisgICAgICAgICAgICAgICAgICAgIHswfSAgICAvLyBSRl9TVUJCQU5EXzRfOV9HSFoKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgeyAvLyBiUmF0ZVBvd2VyT2Zmc2V0IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorICAgICAgICAgICAgICAgIH0sIC8vIGJSYXRlUG93ZXJPZmZzZXQgZW5kCisKKyAgICAgICAgICAgICAgICB7IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vYXBwbHkgdG8gYWxsIDIuNCBhbmQgNUcgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fNywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fOSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTAsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzExLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMiwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzE0LAorICAgICAgICAgICAgICAgIH0gLy8gZ25SYXRlUG93ZXJPZmZzZXQgZW5kCisgICAgICAgICAgICB9LCAgIC8vIFJFR19ET01BSU5fTl9BTUVSX0VYQ19GQ0MgZW5kCisKKyAgICAgICAgICAgIHsgICAvLyBSRUdfRE9NQUlOX0FQQUMgc3RhcnQKKyAgICAgICAgICAgICAgICB7IC8vc1JlZ3VsYXRvcnlDaGFubmVsIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxlZCwgcHdyTGltaXQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZCwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyNn0sICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjZ9LCAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE2fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisKKyAgICAgICAgICAgICAgICAgICAgLy80LjlHSHogQmFuZCwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI0MCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yNDQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjQ4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI1MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yMDgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzIxNiwKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogTG93ICYgTWlkIFUtTklJIEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxN30sICAgICAgICAgICAgLy9SRl9DSEFOXzM2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE3fSwgICAgICAgICAgICAvL1JGX0NIQU5fNDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl80NCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxN30sICAgICAgICAgICAgLy9SRl9DSEFOXzQ4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzUyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzU2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzYwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzY0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBNaWQgQmFuZCAtIEVUU0ksIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTA0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzEwOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTE2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTIwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTI0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTI4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzEzMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMzYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTQwLAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBIaWdoIFUtTklJIEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE0OSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE1MywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE1NywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE2MSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTY1LAorCisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzMsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzUsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzcsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzksCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTEsCisKKyAgICAgICAgICAgICAgICAgICAgLy8gNC45R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzI0MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjQ2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8yNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzIxMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjE0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBMb3cgJiBNaWQgVS1OSUkgQmFuZCwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80NiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzU0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyNX0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNjIsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IE1pZCBCYW5kIC0gRVRTSSwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEwMgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTA2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTAKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTE0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzExOAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMjIKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTI2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEzMAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTM0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzgKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogSGlnaCBVLU5JSSBCYW5kLCAgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1MSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1NSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1OSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE2MworICAgICAgICAgICAgICAgIH0sIC8vc1JlZ3VsYXRvcnlDaGFubmVsIGVuZAorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgIC8vIFJGX1NVQkJBTkRfMl80X0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0sICAgLy8gUkZfU1VCQkFORF81X0xPV19HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9LCAgIC8vIFJGX1NVQkJBTkRfNV9NSURfR0haCisgICAgICAgICAgICAgICAgICAgIHswfSwgICAvLyBSRl9TVUJCQU5EXzVfSElHSF9HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9ICAgIC8vIFJGX1NVQkJBTkRfNF85X0dIWgorICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB7IC8vIGJSYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSwgLy8gYlJhdGVQb3dlck9mZnNldCBlbmQKKworICAgICAgICAgICAgICAgIHsgLy8gZ25SYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9hcHBseSB0byBhbGwgMi40IGFuZCA1RyBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSAvLyBnblJhdGVQb3dlck9mZnNldCBlbmQKKyAgICAgICAgICAgIH0sIC8vIFJFR19ET01BSU5fQVBBQyBlbmQKKworICAgICAgICAgICAgeyAgIC8vIFJFR19ET01BSU5fS09SRUEgc3RhcnQKKyAgICAgICAgICAgICAgICB7IC8vc1JlZ3VsYXRvcnlDaGFubmVsIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxlZCwgcHdyTGltaXQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZCwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNX0sICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTV9LCAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE1fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisKKyAgICAgICAgICAgICAgICAgICAgLy80LjlHSHogQmFuZCwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI0MCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yNDQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjQ4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI1MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yMDgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzIxNiwKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogTG93ICYgTWlkIFUtTklJIEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxN30sICAgICAgICAgICAgLy9SRl9DSEFOXzM2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE3fSwgICAgICAgICAgICAvL1JGX0NIQU5fNDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl80NCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxN30sICAgICAgICAgICAgLy9SRl9DSEFOXzQ4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzUyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzU2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzYwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzY0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBNaWQgQmFuZCAtIEVUU0ksIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTA0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzEwOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTE2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTIwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTI0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTI4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzEzMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMzYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTQwLAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBIaWdoIFUtTklJIEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE0OSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE1MywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE1NywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE2MSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTY1LAorCisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzMsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzUsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzcsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzksCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTEsCisKKyAgICAgICAgICAgICAgICAgICAgLy8gNC45R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzI0MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjQ2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8yNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzIxMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjE0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBMb3cgJiBNaWQgVS1OSUkgQmFuZCwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80NiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzU0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyNX0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNjIsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IE1pZCBCYW5kIC0gRVRTSSwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEwMgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTA2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTAKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTE0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzExOAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMjIKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTI2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEzMAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTM0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzgKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogSGlnaCBVLU5JSSBCYW5kLCAgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1MSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1NSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1OSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE2MworICAgICAgICAgICAgICAgIH0sIC8vc1JlZ3VsYXRvcnlDaGFubmVsIGVuZAorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgIC8vIFJGX1NVQkJBTkRfMl80X0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0sICAgLy8gUkZfU1VCQkFORF81X0xPV19HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9LCAgIC8vIFJGX1NVQkJBTkRfNV9NSURfR0haCisgICAgICAgICAgICAgICAgICAgIHswfSwgICAvLyBSRl9TVUJCQU5EXzVfSElHSF9HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9ICAgIC8vIFJGX1NVQkJBTkRfNF85X0dIWgorICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB7IC8vIGJSYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSwgLy8gYlJhdGVQb3dlck9mZnNldCBlbmQKKworICAgICAgICAgICAgICAgIHsgLy8gZ25SYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9hcHBseSB0byBhbGwgMi40IGFuZCA1RyBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSAvLyBnblJhdGVQb3dlck9mZnNldCBlbmQKKyAgICAgICAgICAgIH0sIC8vIFJFR19ET01BSU5fS09SRUEgZW5kCisKKyAgICAgICAgICAgIHsgICAvLyBSRUdfRE9NQUlOX0hJXzVHSFogc3RhcnQKKyAgICAgICAgICAgICAgICB7IC8vc1JlZ3VsYXRvcnlDaGFubmVsIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxlZCwgcHdyTGltaXQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZCwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxNH0sICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTR9LCAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE0fSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisKKyAgICAgICAgICAgICAgICAgICAgLy80LjlHSHogQmFuZCwgbm9uZSBDQgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI0MCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yNDQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjQ4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzI1MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjN9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8yMDgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDIzfSwgICAgICAgICAgICAvL1JGX0NIQU5fMjEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyM30sICAgICAgICAgICAgLy9SRl9DSEFOXzIxNiwKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogTG93ICYgTWlkIFUtTklJIEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxN30sICAgICAgICAgICAgLy9SRl9DSEFOXzM2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDE3fSwgICAgICAgICAgICAvL1JGX0NIQU5fNDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl80NCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxN30sICAgICAgICAgICAgLy9SRl9DSEFOXzQ4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzUyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzU2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzYwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzY0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBNaWQgQmFuZCAtIEVUU0ksIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMDAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTA0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzEwOCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMTIsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTE2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTIwLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTI0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTI4LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyNH0sICAgICAgICAgICAgLy9SRl9DSEFOXzEzMiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl8xMzYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI0fSwgICAgICAgICAgICAvL1JGX0NIQU5fMTQwLAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBIaWdoIFUtTklJIEJhbmQsIG5vbmUgQ0IKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE0OSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE1MywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE1NywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAzMH0sICAgICAgICAgICAgLy9SRl9DSEFOXzE2MSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fMTY1LAorCisgICAgICAgICAgICAgICAgICAgIC8vMi40R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzMsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzUsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzYsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzcsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjJ9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzksCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTEsCisKKyAgICAgICAgICAgICAgICAgICAgLy8gNC45R0h6IEJhbmQsIGNoYW5uZWwgYm9uZGVkIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzI0MiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjQ2LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8yNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzIxMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMjE0LAorCisgICAgICAgICAgICAgICAgICAgIC8vNUdIeiBMb3cgJiBNaWQgVS1OSUkgQmFuZCwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMzgsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzQyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDIwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF80NiwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNTAsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMjd9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzU0LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF81OCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAyNX0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfNjIsCisKKyAgICAgICAgICAgICAgICAgICAgLy81R0h6IE1pZCBCYW5kIC0gRVRTSSwgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMjR9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEwMgorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTA2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMTAKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTE0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzExOAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAwfSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMjIKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTI2CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzEzMAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9ESVNBQkxFLCAyN30sICAgICAgICAgICAgLy9SRl9DSEFOX0JPTkRfMTM0CisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0RJU0FCTEUsIDI3fSwgICAgICAgICAgICAvL1JGX0NIQU5fQk9ORF8xMzgKKworICAgICAgICAgICAgICAgICAgICAvLzVHSHogSGlnaCBVLU5JSSBCYW5kLCAgY2hhbm5lbCBib25kZWQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1MSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1NSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMzB9LCAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE1OSwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAgIC8vUkZfQ0hBTl9CT05EXzE2MworICAgICAgICAgICAgICAgIH0sIC8vc1JlZ3VsYXRvcnlDaGFubmVsIGVuZAorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgIC8vIFJGX1NVQkJBTkRfMl80X0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0sICAgLy8gUkZfU1VCQkFORF81X0xPV19HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9LCAgIC8vIFJGX1NVQkJBTkRfNV9NSURfR0haCisgICAgICAgICAgICAgICAgICAgIHswfSwgICAvLyBSRl9TVUJCQU5EXzVfSElHSF9HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9ICAgIC8vIFJGX1NVQkJBTkRfNF85X0dIWgorICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB7IC8vIGJSYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSwgLy8gYlJhdGVQb3dlck9mZnNldCBlbmQKKworICAgICAgICAgICAgICAgIHsgLy8gZ25SYXRlUG93ZXJPZmZzZXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9hcHBseSB0byBhbGwgMi40IGFuZCA1RyBjaGFubmVscworICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSAvLyBnblJhdGVQb3dlck9mZnNldCBlbmQKKyAgICAgICAgICAgIH0sIC8vIFJFR19ET01BSU5fSElfNUdIWiBlbmQKKworICAgICAgICAgICAgeyAgIC8vIFJFR19ET01BSU5fTk9fNUdIWiBzdGFydAorICAgICAgICAgICAgICAgIHsgLy9zUmVndWxhdG9yeUNoYW5uZWwgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgLy9lbmFibGVkLCBwd3JMaW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8yLjRHSHogQmFuZAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl8yLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl8zLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl80LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl81LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl82LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl83LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl84LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl85LAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMCwKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRU5BQkxFLCAxMn0sICAgICAgICAgICAvL1JGX0NIQU5fMTEsCisgICAgICAgICAgICAgICAgICAgIHtOVl9DSEFOTkVMX0VOQUJMRSwgMTJ9LCAgICAgICAgICAgLy9SRl9DSEFOXzEyLAorICAgICAgICAgICAgICAgICAgICB7TlZfQ0hBTk5FTF9FTkFCTEUsIDEyfSwgICAgICAgICAgIC8vUkZfQ0hBTl8xMywKKyAgICAgICAgICAgICAgICAgICAge05WX0NIQU5ORUxfRElTQUJMRSwgMH0sICAgICAgICAgICAvL1JGX0NIQU5fMTQsCisgICAgICAgICAgICAgICAgfSwgLy9zUmVndWxhdG9yeUNoYW5uZWwgZW5kCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgLy8gUkZfU1VCQkFORF8yXzRfR0haCisgICAgICAgICAgICAgICAgICAgIHswfSwgICAvLyBSRl9TVUJCQU5EXzVfTE9XX0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0sICAgLy8gUkZfU1VCQkFORF81X01JRF9HSFoKKyAgICAgICAgICAgICAgICAgICAgezB9LCAgIC8vIFJGX1NVQkJBTkRfNV9ISUdIX0dIWgorICAgICAgICAgICAgICAgICAgICB7MH0gICAgLy8gUkZfU1VCQkFORF80XzlfR0haCisgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIHsgLy8gYlJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLzIuNEdIeiBCYW5kCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9LCAvLyBiUmF0ZVBvd2VyT2Zmc2V0IGVuZAorCisgICAgICAgICAgICAgICAgeyAvLyBnblJhdGVQb3dlck9mZnNldCBzdGFydAorICAgICAgICAgICAgICAgICAgICAvL2FwcGx5IHRvIGFsbCAyLjQgYW5kIDVHIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzMsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzQsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzUsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzYsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzcsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzgsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzksCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEwLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xMSwKKyAgICAgICAgICAgICAgICAgICAgeyAwIH0sICAgICAgICAgICAgICAgICAgICAgICAvL1JGX0NIQU5fMTIsCisgICAgICAgICAgICAgICAgICAgIHsgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLy9SRl9DSEFOXzEzLAorICAgICAgICAgICAgICAgICAgICB7IDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8vUkZfQ0hBTl8xNCwKKyAgICAgICAgICAgICAgICB9IC8vIGduUmF0ZVBvd2VyT2Zmc2V0IGVuZAorICAgICAgICAgICAgfSAvLyBSRUdfRE9NQUlOX05PXzVHSFogZW5kCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gTlZfVEFCTEVfREVGQVVMVF9DT1VOVFJZCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHR5cGVkZWYgc3RydWN0CisgICAgICAgICAgICAvLyB7CisgICAgICAgICAgICAvLyAgICAgdEFOSV9VOCByZWdEb21haW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Zyb20gZVJlZ0RvbWFpbklkCisgICAgICAgICAgICAvLyAgICAgdEFOSV9VOCBjb3VudHJ5Q29kZVtOVl9GSUVMRF9DT1VOVFJZX0NPREVfU0laRV07ICAgIC8vIHN0cmluZyBpZGVudGlmaWVyCisgICAgICAgICAgICAvLyB9c0RlZmF1bHRDb3VudHJ5OworCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8vIHJlZ0RvbWFpbgorICAgICAgICAgICAgeyAnVScsICdTJywgJ0knIH0gICAvLyBjb3VudHJ5Q29kZQorICAgICAgICB9LAorCisgICAgICAgIC8vTlZfVEFCTEVfVFBDX1BPV0VSX1RBQkxFCisgICAgICAgIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIDAgICwgLy8wCisgICAgICAgICAgICAgICAgICAgIDQxICwgLy8xCisgICAgICAgICAgICAgICAgICAgIDQzICwgLy8yCisgICAgICAgICAgICAgICAgICAgIDQ1ICwgLy8zCisgICAgICAgICAgICAgICAgICAgIDQ3ICwgLy80CisgICAgICAgICAgICAgICAgICAgIDQ5ICwgLy81CisgICAgICAgICAgICAgICAgICAgIDUxICwgLy82CisgICAgICAgICAgICAgICAgICAgIDUzICwgLy83CisgICAgICAgICAgICAgICAgICAgIDU1ICwgLy84CisgICAgICAgICAgICAgICAgICAgIDU2ICwgLy85CisgICAgICAgICAgICAgICAgICAgIDU4ICwgLy8xMAorICAgICAgICAgICAgICAgICAgICA1OSAsIC8vMTEKKyAgICAgICAgICAgICAgICAgICAgNjAgLCAvLzEyCisgICAgICAgICAgICAgICAgICAgIDYyICwgLy8xMworICAgICAgICAgICAgICAgICAgICA2MyAsIC8vMTQKKyAgICAgICAgICAgICAgICAgICAgNjQgLCAvLzE1CisgICAgICAgICAgICAgICAgICAgIDY1ICwgLy8xNgorICAgICAgICAgICAgICAgICAgICA2NyAsIC8vMTcKKyAgICAgICAgICAgICAgICAgICAgNjggLCAvLzE4CisgICAgICAgICAgICAgICAgICAgIDY5ICwgLy8xOQorICAgICAgICAgICAgICAgICAgICA3MCAsIC8vMjAKKyAgICAgICAgICAgICAgICAgICAgNzEgLCAvLzIxCisgICAgICAgICAgICAgICAgICAgIDcyICwgLy8yMgorICAgICAgICAgICAgICAgICAgICA3MyAsIC8vMjMKKyAgICAgICAgICAgICAgICAgICAgNzQgLCAvLzI0CisgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNQorICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjYKKyAgICAgICAgICAgICAgICAgICAgNzYgLCAvLzI3CisgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yOAorICAgICAgICAgICAgICAgICAgICA3OCAsIC8vMjkKKyAgICAgICAgICAgICAgICAgICAgNzggLCAvLzMwCisgICAgICAgICAgICAgICAgICAgIDc5ICwgLy8zMQorICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzIKKyAgICAgICAgICAgICAgICAgICAgODEgLCAvLzMzCisgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zNAorICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzUKKyAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM2CisgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNworICAgICAgICAgICAgICAgICAgICA4NCAsIC8vMzgKKyAgICAgICAgICAgICAgICAgICAgODUgLCAvLzM5CisgICAgICAgICAgICAgICAgICAgIDg2ICwgLy80MAorICAgICAgICAgICAgICAgICAgICA4NiAsIC8vNDEKKyAgICAgICAgICAgICAgICAgICAgODcgLCAvLzQyCisgICAgICAgICAgICAgICAgICAgIDg4ICwgLy80MworICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDQKKyAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQ1CisgICAgICAgICAgICAgICAgICAgIDkwICwgLy80NgorICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDcKKyAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ4CisgICAgICAgICAgICAgICAgICAgIDkyICwgLy80OQorICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNTAKKyAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUxCisgICAgICAgICAgICAgICAgICAgIDkzICwgLy81MgorICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTMKKyAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzU0CisgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81NQorICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTYKKyAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU3CisgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81OAorICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTkKKyAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzYwCisgICAgICAgICAgICAgICAgICAgIDk3ICwgLy82MQorICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjIKKyAgICAgICAgICAgICAgICAgICAgOTggLCAvLzYzCisgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82NAorICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjUKKyAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY2CisgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NworICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjgKKyAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY5CisgICAgICAgICAgICAgICAgICAgIDEwMCwgLy83MAorICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzEKKyAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzcyCisgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MworICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzQKKyAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzc1CisgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83NgorICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzcKKyAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc4CisgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OQorICAgICAgICAgICAgICAgICAgICAxMDMsIC8vODAKKyAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgxCisgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MgorICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODMKKyAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg0CisgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NQorICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODYKKyAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg3CisgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84OAorICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODkKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkwCisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MQorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTIKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkzCisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NAorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTUKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk2CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NworICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTgKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk5CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMQorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAyCisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNAorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA1CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNworICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA4CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMAorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTExCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMworICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE0CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNgorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE3CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExOQorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIwCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMgorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIzCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNQorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI2CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgMTA3LAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAwICAsIC8vMAorICAgICAgICAgICAgICAgICAgICA0MSAsIC8vMQorICAgICAgICAgICAgICAgICAgICA0MyAsIC8vMgorICAgICAgICAgICAgICAgICAgICA0NSAsIC8vMworICAgICAgICAgICAgICAgICAgICA0NyAsIC8vNAorICAgICAgICAgICAgICAgICAgICA0OSAsIC8vNQorICAgICAgICAgICAgICAgICAgICA1MSAsIC8vNgorICAgICAgICAgICAgICAgICAgICA1MiAsIC8vNworICAgICAgICAgICAgICAgICAgICA1NCAsIC8vOAorICAgICAgICAgICAgICAgICAgICA1NiAsIC8vOQorICAgICAgICAgICAgICAgICAgICA1NyAsIC8vMTAKKyAgICAgICAgICAgICAgICAgICAgNTkgLCAvLzExCisgICAgICAgICAgICAgICAgICAgIDYwICwgLy8xMgorICAgICAgICAgICAgICAgICAgICA2MSAsIC8vMTMKKyAgICAgICAgICAgICAgICAgICAgNjIgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgIDY0ICwgLy8xNQorICAgICAgICAgICAgICAgICAgICA2NSAsIC8vMTYKKyAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE3CisgICAgICAgICAgICAgICAgICAgIDY3ICwgLy8xOAorICAgICAgICAgICAgICAgICAgICA2OCAsIC8vMTkKKyAgICAgICAgICAgICAgICAgICAgNjkgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgIDcwICwgLy8yMQorICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjIKKyAgICAgICAgICAgICAgICAgICAgNzIgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgIDczICwgLy8yNAorICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjUKKyAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNworICAgICAgICAgICAgICAgICAgICA3NiAsIC8vMjgKKyAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI5CisgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8zMAorICAgICAgICAgICAgICAgICAgICA3OSAsIC8vMzEKKyAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMworICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzQKKyAgICAgICAgICAgICAgICAgICAgODIgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zNgorICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzcKKyAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgIDg1ICwgLy8zOQorICAgICAgICAgICAgICAgICAgICA4NSAsIC8vNDAKKyAgICAgICAgICAgICAgICAgICAgODYgLCAvLzQxCisgICAgICAgICAgICAgICAgICAgIDg3ICwgLy80MgorICAgICAgICAgICAgICAgICAgICA4OCAsIC8vNDMKKyAgICAgICAgICAgICAgICAgICAgODggLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80NQorICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDYKKyAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgIDkxICwgLy80OAorICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDkKKyAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgIDkyICwgLy81MQorICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNTIKKyAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81NAorICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTUKKyAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81NworICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTgKKyAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU5CisgICAgICAgICAgICAgICAgICAgIDk2ICwgLy82MAorICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNjEKKyAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzYyCisgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MworICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjQKKyAgICAgICAgICAgICAgICAgICAgOTggLCAvLzY1CisgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NgorICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjcKKyAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY4CisgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82OQorICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNzAKKyAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzcxCisgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MgorICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzMKKyAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzc0CisgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83NQorICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzYKKyAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzc3CisgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OAorICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzkKKyAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzgwCisgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MQorICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODIKKyAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgzCisgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NAorICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODUKKyAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg2CisgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NworICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODgKKyAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg5CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MAorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTEKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkyCisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MworICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTQKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk1CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NgorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTcKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk4CisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85OQorICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAwCisgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMgorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTAzCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNQorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA2CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwOAorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA5CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMQorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEyCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNAorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE1CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNworICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE4CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMAorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIxCisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMworICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI0CisgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNgorICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI3CisgICAgICAgICAgICAgICAgICAgIDEwNywKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMCAgLCAvLzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDQxICwgLy8xCisgICAgICAgICAgICAgICAgICAgICAgICA0MyAsIC8vMgorICAgICAgICAgICAgICAgICAgICAgICAgNDUgLCAvLzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ3ICwgLy80CisgICAgICAgICAgICAgICAgICAgICAgICA0OSAsIC8vNQorICAgICAgICAgICAgICAgICAgICAgICAgNTEgLCAvLzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDUyICwgLy83CisgICAgICAgICAgICAgICAgICAgICAgICA1NCAsIC8vOAorICAgICAgICAgICAgICAgICAgICAgICAgNTUgLCAvLzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDU3ICwgLy8xMAorICAgICAgICAgICAgICAgICAgICAgICAgNTggLCAvLzExCisgICAgICAgICAgICAgICAgICAgICAgICA2MCAsIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDYxICwgLy8xMworICAgICAgICAgICAgICAgICAgICAgICAgNjIgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgICAgICA2NCAsIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDY1ICwgLy8xNgorICAgICAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE3CisgICAgICAgICAgICAgICAgICAgICAgICA2NyAsIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDY4ICwgLy8xOQorICAgICAgICAgICAgICAgICAgICAgICAgNjkgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgICAgICA3MCAsIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDcxICwgLy8yMgorICAgICAgICAgICAgICAgICAgICAgICAgNzIgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgICAgICA3MyAsIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDc0ICwgLy8yNQorICAgICAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDc2ICwgLy8yOAorICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI5CisgICAgICAgICAgICAgICAgICAgICAgICA3OCAsIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8zMQorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDgxICwgLy8zNAorICAgICAgICAgICAgICAgICAgICAgICAgODIgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNworICAgICAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgICAgICA4NCAsIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDg1ICwgLy80MAorICAgICAgICAgICAgICAgICAgICAgICAgODYgLCAvLzQxCisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDg3ICwgLy80MworICAgICAgICAgICAgICAgICAgICAgICAgODggLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80NgorICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80OQorICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy81MgorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81NQorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81OAorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU5CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy82MQorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzYyCisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82NAorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzY1CisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NworICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy83MAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzcxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MworICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzc0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzc3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzgwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vODEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8zCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAwICAsIC8vMAorICAgICAgICAgICAgICAgICAgICAgICAgNDIgLCAvLzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ0ICwgLy8yCisgICAgICAgICAgICAgICAgICAgICAgICA0NiAsIC8vMworICAgICAgICAgICAgICAgICAgICAgICAgNDggLCAvLzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ5ICwgLy81CisgICAgICAgICAgICAgICAgICAgICAgICA1MSAsIC8vNgorICAgICAgICAgICAgICAgICAgICAgICAgNTMgLCAvLzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDU1ICwgLy84CisgICAgICAgICAgICAgICAgICAgICAgICA1NyAsIC8vOQorICAgICAgICAgICAgICAgICAgICAgICAgNTggLCAvLzEwCisgICAgICAgICAgICAgICAgICAgICAgICA2MCAsIC8vMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDYxICwgLy8xMgorICAgICAgICAgICAgICAgICAgICAgICAgNjIgLCAvLzEzCisgICAgICAgICAgICAgICAgICAgICAgICA2MyAsIC8vMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDY0ICwgLy8xNQorICAgICAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE2CisgICAgICAgICAgICAgICAgICAgICAgICA2NyAsIC8vMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDY4ICwgLy8xOAorICAgICAgICAgICAgICAgICAgICAgICAgNjkgLCAvLzE5CisgICAgICAgICAgICAgICAgICAgICAgICA3MCAsIC8vMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDcxICwgLy8yMQorICAgICAgICAgICAgICAgICAgICAgICAgNzIgLCAvLzIyCisgICAgICAgICAgICAgICAgICAgICAgICA3MyAsIC8vMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDc0ICwgLy8yNAorICAgICAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI1CisgICAgICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDc2ICwgLy8yNworICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI4CisgICAgICAgICAgICAgICAgICAgICAgICA3OCAsIC8vMjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8zMAorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzMxCisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDgxICwgLy8zMworICAgICAgICAgICAgICAgICAgICAgICAgODIgLCAvLzM0CisgICAgICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNgorICAgICAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM3CisgICAgICAgICAgICAgICAgICAgICAgICA4NCAsIC8vMzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDg1ICwgLy8zOQorICAgICAgICAgICAgICAgICAgICAgICAgODYgLCAvLzQwCisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vNDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDg3ICwgLy80MgorICAgICAgICAgICAgICAgICAgICAgICAgODggLCAvLzQzCisgICAgICAgICAgICAgICAgICAgICAgICA4OCAsIC8vNDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80NQorICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ2CisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80OAorICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ5CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy81MQorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUyCisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81NAorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzU1CisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81NworICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU4CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy82MAorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzYxCisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MworICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzY0CisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NgorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY3CisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzcwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MgorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzczCisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83NQorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzc2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OAorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vODAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy84MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NworICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgICwgLy8wCisgICAgICAgICAgICAgICAgICAgICAgICA0MSAsIC8vMQorICAgICAgICAgICAgICAgICAgICAgICAgNDMgLCAvLzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ1ICwgLy8zCisgICAgICAgICAgICAgICAgICAgICAgICA0NyAsIC8vNAorICAgICAgICAgICAgICAgICAgICAgICAgNDkgLCAvLzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDUxICwgLy82CisgICAgICAgICAgICAgICAgICAgICAgICA1MyAsIC8vNworICAgICAgICAgICAgICAgICAgICAgICAgNTQgLCAvLzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDU2ICwgLy85CisgICAgICAgICAgICAgICAgICAgICAgICA1NyAsIC8vMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDU5ICwgLy8xMQorICAgICAgICAgICAgICAgICAgICAgICAgNjAgLCAvLzEyCisgICAgICAgICAgICAgICAgICAgICAgICA2MiAsIC8vMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDYzICwgLy8xNAorICAgICAgICAgICAgICAgICAgICAgICAgNjUgLCAvLzE1CisgICAgICAgICAgICAgICAgICAgICAgICA2NiAsIC8vMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDY3ICwgLy8xNworICAgICAgICAgICAgICAgICAgICAgICAgNjggLCAvLzE4CisgICAgICAgICAgICAgICAgICAgICAgICA2OSAsIC8vMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDY5ICwgLy8yMAorICAgICAgICAgICAgICAgICAgICAgICAgNzEgLCAvLzIxCisgICAgICAgICAgICAgICAgICAgICAgICA3MiAsIC8vMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDcyICwgLy8yMworICAgICAgICAgICAgICAgICAgICAgICAgNzMgLCAvLzI0CisgICAgICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNgorICAgICAgICAgICAgICAgICAgICAgICAgNzYgLCAvLzI3CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8yOQorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzMwCisgICAgICAgICAgICAgICAgICAgICAgICA3OSAsIC8vMzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMgorICAgICAgICAgICAgICAgICAgICAgICAgODEgLCAvLzMzCisgICAgICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNQorICAgICAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM2CisgICAgICAgICAgICAgICAgICAgICAgICA4NCAsIC8vMzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDg1ICwgLy8zOAorICAgICAgICAgICAgICAgICAgICAgICAgODYgLCAvLzM5CisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vNDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDg3ICwgLy80MQorICAgICAgICAgICAgICAgICAgICAgICAgODggLCAvLzQyCisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80NAorICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ1CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80NworICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ4CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy81MAorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUxCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81MworICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU0CisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NgorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU3CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81OQorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzYwCisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MgorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzYzCisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NQorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82OAorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MQorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzcyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83NAorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NworICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84MworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTEwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTExCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTEyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTEzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTE5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTIxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTIyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTIzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTI0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTI1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTI2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTI3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMCAgLCAvLzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDQxICwgLy8xCisgICAgICAgICAgICAgICAgICAgICAgICA0MyAsIC8vMgorICAgICAgICAgICAgICAgICAgICAgICAgNDUgLCAvLzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ3ICwgLy80CisgICAgICAgICAgICAgICAgICAgICAgICA0OSAsIC8vNQorICAgICAgICAgICAgICAgICAgICAgICAgNTEgLCAvLzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDUzICwgLy83CisgICAgICAgICAgICAgICAgICAgICAgICA1NSAsIC8vOAorICAgICAgICAgICAgICAgICAgICAgICAgNTYgLCAvLzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDU4ICwgLy8xMAorICAgICAgICAgICAgICAgICAgICAgICAgNTkgLCAvLzExCisgICAgICAgICAgICAgICAgICAgICAgICA2MSAsIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDYyICwgLy8xMworICAgICAgICAgICAgICAgICAgICAgICAgNjMgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgICAgICA2NCAsIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDY1ICwgLy8xNgorICAgICAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE3CisgICAgICAgICAgICAgICAgICAgICAgICA2OCAsIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDY5ICwgLy8xOQorICAgICAgICAgICAgICAgICAgICAgICAgNzAgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDcyICwgLy8yMgorICAgICAgICAgICAgICAgICAgICAgICAgNzMgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNQorICAgICAgICAgICAgICAgICAgICAgICAgNzYgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yOAorICAgICAgICAgICAgICAgICAgICAgICAgNzggLCAvLzI5CisgICAgICAgICAgICAgICAgICAgICAgICA3OSAsIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMQorICAgICAgICAgICAgICAgICAgICAgICAgODAgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zNAorICAgICAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zNworICAgICAgICAgICAgICAgICAgICAgICAgODUgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgICAgICA4NiAsIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDg3ICwgLy80MAorICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzQxCisgICAgICAgICAgICAgICAgICAgICAgICA4OCAsIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80MworICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80NgorICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80OQorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81MgorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81NQorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81OAorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU5CisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MQorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzYyCisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NworICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MAorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzcxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MworICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzgzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl82CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAwICAsIC8vMAorICAgICAgICAgICAgICAgICAgICAgICAgNDEgLCAvLzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDQzICwgLy8yCisgICAgICAgICAgICAgICAgICAgICAgICA0NSAsIC8vMworICAgICAgICAgICAgICAgICAgICAgICAgNDcgLCAvLzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ5ICwgLy81CisgICAgICAgICAgICAgICAgICAgICAgICA1MSAsIC8vNgorICAgICAgICAgICAgICAgICAgICAgICAgNTMgLCAvLzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDU1ICwgLy84CisgICAgICAgICAgICAgICAgICAgICAgICA1NiAsIC8vOQorICAgICAgICAgICAgICAgICAgICAgICAgNTggLCAvLzEwCisgICAgICAgICAgICAgICAgICAgICAgICA2MCAsIC8vMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDYxICwgLy8xMgorICAgICAgICAgICAgICAgICAgICAgICAgNjIgLCAvLzEzCisgICAgICAgICAgICAgICAgICAgICAgICA2MyAsIC8vMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDY0ICwgLy8xNQorICAgICAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE2CisgICAgICAgICAgICAgICAgICAgICAgICA2NyAsIC8vMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDY4ICwgLy8xOAorICAgICAgICAgICAgICAgICAgICAgICAgNjkgLCAvLzE5CisgICAgICAgICAgICAgICAgICAgICAgICA3MCAsIC8vMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDcxICwgLy8yMQorICAgICAgICAgICAgICAgICAgICAgICAgNzIgLCAvLzIyCisgICAgICAgICAgICAgICAgICAgICAgICA3MyAsIC8vMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDc0ICwgLy8yNAorICAgICAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI1CisgICAgICAgICAgICAgICAgICAgICAgICA3NiAsIC8vMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yNworICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI4CisgICAgICAgICAgICAgICAgICAgICAgICA3OCAsIC8vMjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDc5ICwgLy8zMAorICAgICAgICAgICAgICAgICAgICAgICAgODAgLCAvLzMxCisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDgxICwgLy8zMworICAgICAgICAgICAgICAgICAgICAgICAgODIgLCAvLzM0CisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zNgorICAgICAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM3CisgICAgICAgICAgICAgICAgICAgICAgICA4NSAsIC8vMzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy8zOQorICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzQwCisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vNDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDg4ICwgLy80MgorICAgICAgICAgICAgICAgICAgICAgICAgODggLCAvLzQzCisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80NQorICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQ2CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80OAorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ5CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy81MQorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzUyCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81NAorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU1CisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NworICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU4CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy82MAorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzYxCisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MworICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY0CisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzcwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy83MgorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzczCisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83NQorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OAorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwMworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwNworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEwOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExMworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExNworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzExOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyMworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzEyNworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgICwgLy8wCisgICAgICAgICAgICAgICAgICAgICAgICA0MCAsIC8vMQorICAgICAgICAgICAgICAgICAgICAgICAgNDIgLCAvLzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ1ICwgLy8zCisgICAgICAgICAgICAgICAgICAgICAgICA0NyAsIC8vNAorICAgICAgICAgICAgICAgICAgICAgICAgNDkgLCAvLzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDUxICwgLy82CisgICAgICAgICAgICAgICAgICAgICAgICA1MiAsIC8vNworICAgICAgICAgICAgICAgICAgICAgICAgNTQgLCAvLzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDU2ICwgLy85CisgICAgICAgICAgICAgICAgICAgICAgICA1OCAsIC8vMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDU5ICwgLy8xMQorICAgICAgICAgICAgICAgICAgICAgICAgNjEgLCAvLzEyCisgICAgICAgICAgICAgICAgICAgICAgICA2MiAsIC8vMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDYzICwgLy8xNAorICAgICAgICAgICAgICAgICAgICAgICAgNjUgLCAvLzE1CisgICAgICAgICAgICAgICAgICAgICAgICA2NiAsIC8vMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDY3ICwgLy8xNworICAgICAgICAgICAgICAgICAgICAgICAgNjggLCAvLzE4CisgICAgICAgICAgICAgICAgICAgICAgICA2OSAsIC8vMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDcwICwgLy8yMAorICAgICAgICAgICAgICAgICAgICAgICAgNzEgLCAvLzIxCisgICAgICAgICAgICAgICAgICAgICAgICA3MiAsIC8vMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDczICwgLy8yMworICAgICAgICAgICAgICAgICAgICAgICAgNzQgLCAvLzI0CisgICAgICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDc2ICwgLy8yNgorICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI3CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDc4ICwgLy8yOQorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzMwCisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDgxICwgLy8zMgorICAgICAgICAgICAgICAgICAgICAgICAgODEgLCAvLzMzCisgICAgICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNQorICAgICAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM2CisgICAgICAgICAgICAgICAgICAgICAgICA4NSAsIC8vMzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy8zOAorICAgICAgICAgICAgICAgICAgICAgICAgODYgLCAvLzM5CisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vNDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDg4ICwgLy80MQorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQyCisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80NAorICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ1CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80NworICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ4CisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy81MAorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzUxCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81MworICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzU0CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NgorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU3CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81OQorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzYwCisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82MgorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzYzCisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NQorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82OAorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MQorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzcyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NAorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83NworICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzgxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84MworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTAzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vMTA0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTA5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTExCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTEzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTE5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTIzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vMTI3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMCAgLCAvLzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDQxICwgLy8xCisgICAgICAgICAgICAgICAgICAgICAgICA0NCAsIC8vMgorICAgICAgICAgICAgICAgICAgICAgICAgNDYgLCAvLzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICwgLy80CisgICAgICAgICAgICAgICAgICAgICAgICA1MCAsIC8vNQorICAgICAgICAgICAgICAgICAgICAgICAgNTIgLCAvLzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDU0ICwgLy83CisgICAgICAgICAgICAgICAgICAgICAgICA1NiAsIC8vOAorICAgICAgICAgICAgICAgICAgICAgICAgNTggLCAvLzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDU5ICwgLy8xMAorICAgICAgICAgICAgICAgICAgICAgICAgNjAgLCAvLzExCisgICAgICAgICAgICAgICAgICAgICAgICA2MiAsIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDYzICwgLy8xMworICAgICAgICAgICAgICAgICAgICAgICAgNjQgLCAvLzE0CisgICAgICAgICAgICAgICAgICAgICAgICA2NiAsIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDY3ICwgLy8xNgorICAgICAgICAgICAgICAgICAgICAgICAgNjggLCAvLzE3CisgICAgICAgICAgICAgICAgICAgICAgICA2OSAsIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDcwICwgLy8xOQorICAgICAgICAgICAgICAgICAgICAgICAgNzEgLCAvLzIwCisgICAgICAgICAgICAgICAgICAgICAgICA3MiAsIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDczICwgLy8yMgorICAgICAgICAgICAgICAgICAgICAgICAgNzQgLCAvLzIzCisgICAgICAgICAgICAgICAgICAgICAgICA3NSAsIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDc2ICwgLy8yNQorICAgICAgICAgICAgICAgICAgICAgICAgNzcgLCAvLzI2CisgICAgICAgICAgICAgICAgICAgICAgICA3OCAsIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDc5ICwgLy8yOAorICAgICAgICAgICAgICAgICAgICAgICAgNzkgLCAvLzI5CisgICAgICAgICAgICAgICAgICAgICAgICA4MCAsIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgICAgIDgxICwgLy8zMQorICAgICAgICAgICAgICAgICAgICAgICAgODIgLCAvLzMyCisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zNAorICAgICAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM1CisgICAgICAgICAgICAgICAgICAgICAgICA4NSAsIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy8zNworICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzM4CisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgICAgIDg4ICwgLy80MAorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQxCisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80MworICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ0CisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80NgorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ3CisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy80OQorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzUwCisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81MgorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzUzCisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NQorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU2CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy81OAorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzU5CisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82MQorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzYyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82NworICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MAorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzcxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83MworICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy83OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzgwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy84MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzgzCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzg2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzg5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzkyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vOTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy85NworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzk4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMDkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy8xMjcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl85CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAwICAsIC8vMAorICAgICAgICAgICAgICAgICAgICAgICAgNDEgLCAvLzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDQzICwgLy8yCisgICAgICAgICAgICAgICAgICAgICAgICA0NyAsIC8vMworICAgICAgICAgICAgICAgICAgICAgICAgNDggLCAvLzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDUwICwgLy81CisgICAgICAgICAgICAgICAgICAgICAgICA1MiAsIC8vNgorICAgICAgICAgICAgICAgICAgICAgICAgNTMgLCAvLzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDU1ICwgLy84CisgICAgICAgICAgICAgICAgICAgICAgICA1NyAsIC8vOQorICAgICAgICAgICAgICAgICAgICAgICAgNTggLCAvLzEwCisgICAgICAgICAgICAgICAgICAgICAgICA2MCAsIC8vMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDYyICwgLy8xMgorICAgICAgICAgICAgICAgICAgICAgICAgNjMgLCAvLzEzCisgICAgICAgICAgICAgICAgICAgICAgICA2NCAsIC8vMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDY1ICwgLy8xNQorICAgICAgICAgICAgICAgICAgICAgICAgNjcgLCAvLzE2CisgICAgICAgICAgICAgICAgICAgICAgICA2OCAsIC8vMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDY5ICwgLy8xOAorICAgICAgICAgICAgICAgICAgICAgICAgNzAgLCAvLzE5CisgICAgICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDcyICwgLy8yMQorICAgICAgICAgICAgICAgICAgICAgICAgNzMgLCAvLzIyCisgICAgICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNAorICAgICAgICAgICAgICAgICAgICAgICAgNzYgLCAvLzI1CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yNworICAgICAgICAgICAgICAgICAgICAgICAgNzggLCAvLzI4CisgICAgICAgICAgICAgICAgICAgICAgICA3OSAsIC8vMjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMAorICAgICAgICAgICAgICAgICAgICAgICAgODEgLCAvLzMxCisgICAgICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDgzICwgLy8zMworICAgICAgICAgICAgICAgICAgICAgICAgODQgLCAvLzM0CisgICAgICAgICAgICAgICAgICAgICAgICA4NSAsIC8vMzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDg1ICwgLy8zNgorICAgICAgICAgICAgICAgICAgICAgICAgODYgLCAvLzM3CisgICAgICAgICAgICAgICAgICAgICAgICA4NyAsIC8vMzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDg4ICwgLy8zOQorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQwCisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80MgorICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQzCisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80NQorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ2CisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy80OAorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzQ5CisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81MQorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzUyCisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NAorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU1CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy81NworICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzU4CisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82MAorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzYxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82MworICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy82NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzY3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy82OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzcwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83MgorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzczCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy83NQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzc2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vNzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy83OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzc5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzgyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzg1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDYsIC8vODYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwgLy84NworICAgICAgICAgICAgICAgICAgICAgICAgMTA2LCAvLzg4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vODkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy85MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzkxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vOTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy85MworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzk0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy85NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzk3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDcsIC8vOTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNywgLy85OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwMworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwNworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEwOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExMworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExNworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzExOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyMworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA3LCAvLzEyNworICAgICAgICAgICAgICAgICAgICAgICAgMTA3LAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAwICAsIC8vMAorICAgICAgICAgICAgICAgICAgICAgICAgNDIgLCAvLzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ0ICwgLy8yCisgICAgICAgICAgICAgICAgICAgICAgICA0NyAsIC8vMworICAgICAgICAgICAgICAgICAgICAgICAgNDkgLCAvLzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDUxICwgLy81CisgICAgICAgICAgICAgICAgICAgICAgICA1MiAsIC8vNgorICAgICAgICAgICAgICAgICAgICAgICAgNTQgLCAvLzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDU1ICwgLy84CisgICAgICAgICAgICAgICAgICAgICAgICA1NyAsIC8vOQorICAgICAgICAgICAgICAgICAgICAgICAgNTggLCAvLzEwCisgICAgICAgICAgICAgICAgICAgICAgICA2MCAsIC8vMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDYxICwgLy8xMgorICAgICAgICAgICAgICAgICAgICAgICAgNjMgLCAvLzEzCisgICAgICAgICAgICAgICAgICAgICAgICA2NCAsIC8vMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDY1ICwgLy8xNQorICAgICAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE2CisgICAgICAgICAgICAgICAgICAgICAgICA2NyAsIC8vMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDY5ICwgLy8xOAorICAgICAgICAgICAgICAgICAgICAgICAgNzAgLCAvLzE5CisgICAgICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDcyICwgLy8yMQorICAgICAgICAgICAgICAgICAgICAgICAgNzMgLCAvLzIyCisgICAgICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNAorICAgICAgICAgICAgICAgICAgICAgICAgNzYgLCAvLzI1CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yNworICAgICAgICAgICAgICAgICAgICAgICAgNzggLCAvLzI4CisgICAgICAgICAgICAgICAgICAgICAgICA3OSAsIC8vMjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMAorICAgICAgICAgICAgICAgICAgICAgICAgODEgLCAvLzMxCisgICAgICAgICAgICAgICAgICAgICAgICA4MiAsIC8vMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zMworICAgICAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM0CisgICAgICAgICAgICAgICAgICAgICAgICA4NCAsIC8vMzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDg1ICwgLy8zNgorICAgICAgICAgICAgICAgICAgICAgICAgODYgLCAvLzM3CisgICAgICAgICAgICAgICAgICAgICAgICA4NiAsIC8vMzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDg3ICwgLy8zOQorICAgICAgICAgICAgICAgICAgICAgICAgODggLCAvLzQwCisgICAgICAgICAgICAgICAgICAgICAgICA4OSAsIC8vNDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80MgorICAgICAgICAgICAgICAgICAgICAgICAgOTAgLCAvLzQzCisgICAgICAgICAgICAgICAgICAgICAgICA5MSAsIC8vNDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80NQorICAgICAgICAgICAgICAgICAgICAgICAgOTIgLCAvLzQ2CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy80OAorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzQ5CisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81MQorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzUyCisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NAorICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU1CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81NworICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzU4CisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82MAorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzYxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82MworICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy82OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzcwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83MgorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzczCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NQorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vNzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzg4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vODkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzExCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAwICAsIC8vMAorICAgICAgICAgICAgICAgICAgICAgICAgNDEgLCAvLzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ0ICwgLy8yCisgICAgICAgICAgICAgICAgICAgICAgICA0NiAsIC8vMworICAgICAgICAgICAgICAgICAgICAgICAgNDggLCAvLzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDUwICwgLy81CisgICAgICAgICAgICAgICAgICAgICAgICA1MiAsIC8vNgorICAgICAgICAgICAgICAgICAgICAgICAgNTQgLCAvLzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDU2ICwgLy84CisgICAgICAgICAgICAgICAgICAgICAgICA1NyAsIC8vOQorICAgICAgICAgICAgICAgICAgICAgICAgNTkgLCAvLzEwCisgICAgICAgICAgICAgICAgICAgICAgICA2MCAsIC8vMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDYxICwgLy8xMgorICAgICAgICAgICAgICAgICAgICAgICAgNjMgLCAvLzEzCisgICAgICAgICAgICAgICAgICAgICAgICA2NCAsIC8vMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDY1ICwgLy8xNQorICAgICAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE2CisgICAgICAgICAgICAgICAgICAgICAgICA2NyAsIC8vMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDY5ICwgLy8xOAorICAgICAgICAgICAgICAgICAgICAgICAgNzAgLCAvLzE5CisgICAgICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDcyICwgLy8yMQorICAgICAgICAgICAgICAgICAgICAgICAgNzMgLCAvLzIyCisgICAgICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNAorICAgICAgICAgICAgICAgICAgICAgICAgNzYgLCAvLzI1CisgICAgICAgICAgICAgICAgICAgICAgICA3NyAsIC8vMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yNworICAgICAgICAgICAgICAgICAgICAgICAgNzggLCAvLzI4CisgICAgICAgICAgICAgICAgICAgICAgICA3OSAsIC8vMjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMAorICAgICAgICAgICAgICAgICAgICAgICAgODAgLCAvLzMxCisgICAgICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zMworICAgICAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM0CisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zNgorICAgICAgICAgICAgICAgICAgICAgICAgODUgLCAvLzM3CisgICAgICAgICAgICAgICAgICAgICAgICA4NiAsIC8vMzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy8zOQorICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzQwCisgICAgICAgICAgICAgICAgICAgICAgICA4OCAsIC8vNDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDg4ICwgLy80MgorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQzCisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDkwICwgLy80NQorICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ2CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDkyICwgLy80OAorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzQ5CisgICAgICAgICAgICAgICAgICAgICAgICA5MyAsIC8vNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81MQorICAgICAgICAgICAgICAgICAgICAgICAgOTQgLCAvLzUyCisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk1ICwgLy81NAorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU1CisgICAgICAgICAgICAgICAgICAgICAgICA5NiAsIC8vNTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NworICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU4CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MAorICAgICAgICAgICAgICAgICAgICAgICAgOTggLCAvLzYxCisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDk5ICwgLy82MworICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzY0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzcwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy83MgorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzczCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NQorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83OAorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vODAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NworICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy85MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzkxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vOTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy85MworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAwICAsIC8vMAorICAgICAgICAgICAgICAgICAgICAgICAgNDIgLCAvLzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ0ICwgLy8yCisgICAgICAgICAgICAgICAgICAgICAgICA0NiAsIC8vMworICAgICAgICAgICAgICAgICAgICAgICAgNDggLCAvLzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDUwICwgLy81CisgICAgICAgICAgICAgICAgICAgICAgICA1MiAsIC8vNgorICAgICAgICAgICAgICAgICAgICAgICAgNTQgLCAvLzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDU2ICwgLy84CisgICAgICAgICAgICAgICAgICAgICAgICA1OCAsIC8vOQorICAgICAgICAgICAgICAgICAgICAgICAgNTkgLCAvLzEwCisgICAgICAgICAgICAgICAgICAgICAgICA2MCAsIC8vMTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDYxICwgLy8xMgorICAgICAgICAgICAgICAgICAgICAgICAgNjMgLCAvLzEzCisgICAgICAgICAgICAgICAgICAgICAgICA2NCAsIC8vMTQKKyAgICAgICAgICAgICAgICAgICAgICAgIDY1ICwgLy8xNQorICAgICAgICAgICAgICAgICAgICAgICAgNjYgLCAvLzE2CisgICAgICAgICAgICAgICAgICAgICAgICA2OCAsIC8vMTcKKyAgICAgICAgICAgICAgICAgICAgICAgIDY5ICwgLy8xOAorICAgICAgICAgICAgICAgICAgICAgICAgNzAgLCAvLzE5CisgICAgICAgICAgICAgICAgICAgICAgICA3MSAsIC8vMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDcyICwgLy8yMQorICAgICAgICAgICAgICAgICAgICAgICAgNzMgLCAvLzIyCisgICAgICAgICAgICAgICAgICAgICAgICA3NCAsIC8vMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIDc1ICwgLy8yNAorICAgICAgICAgICAgICAgICAgICAgICAgNzUgLCAvLzI1CisgICAgICAgICAgICAgICAgICAgICAgICA3NiAsIC8vMjYKKyAgICAgICAgICAgICAgICAgICAgICAgIDc3ICwgLy8yNworICAgICAgICAgICAgICAgICAgICAgICAgNzggLCAvLzI4CisgICAgICAgICAgICAgICAgICAgICAgICA3OSAsIC8vMjkKKyAgICAgICAgICAgICAgICAgICAgICAgIDgwICwgLy8zMAorICAgICAgICAgICAgICAgICAgICAgICAgODAgLCAvLzMxCisgICAgICAgICAgICAgICAgICAgICAgICA4MSAsIC8vMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIDgyICwgLy8zMworICAgICAgICAgICAgICAgICAgICAgICAgODMgLCAvLzM0CisgICAgICAgICAgICAgICAgICAgICAgICA4MyAsIC8vMzUKKyAgICAgICAgICAgICAgICAgICAgICAgIDg0ICwgLy8zNgorICAgICAgICAgICAgICAgICAgICAgICAgODUgLCAvLzM3CisgICAgICAgICAgICAgICAgICAgICAgICA4NiAsIC8vMzgKKyAgICAgICAgICAgICAgICAgICAgICAgIDg2ICwgLy8zOQorICAgICAgICAgICAgICAgICAgICAgICAgODcgLCAvLzQwCisgICAgICAgICAgICAgICAgICAgICAgICA4OCAsIC8vNDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDg5ICwgLy80MgorICAgICAgICAgICAgICAgICAgICAgICAgODkgLCAvLzQzCisgICAgICAgICAgICAgICAgICAgICAgICA5MCAsIC8vNDQKKyAgICAgICAgICAgICAgICAgICAgICAgIDkxICwgLy80NQorICAgICAgICAgICAgICAgICAgICAgICAgOTEgLCAvLzQ2CisgICAgICAgICAgICAgICAgICAgICAgICA5MiAsIC8vNDcKKyAgICAgICAgICAgICAgICAgICAgICAgIDkzICwgLy80OAorICAgICAgICAgICAgICAgICAgICAgICAgOTMgLCAvLzQ5CisgICAgICAgICAgICAgICAgICAgICAgICA5NCAsIC8vNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIDk0ICwgLy81MQorICAgICAgICAgICAgICAgICAgICAgICAgOTUgLCAvLzUyCisgICAgICAgICAgICAgICAgICAgICAgICA5NSAsIC8vNTMKKyAgICAgICAgICAgICAgICAgICAgICAgIDk2ICwgLy81NAorICAgICAgICAgICAgICAgICAgICAgICAgOTYgLCAvLzU1CisgICAgICAgICAgICAgICAgICAgICAgICA5NyAsIC8vNTYKKyAgICAgICAgICAgICAgICAgICAgICAgIDk3ICwgLy81NworICAgICAgICAgICAgICAgICAgICAgICAgOTcgLCAvLzU4CisgICAgICAgICAgICAgICAgICAgICAgICA5OCAsIC8vNTkKKyAgICAgICAgICAgICAgICAgICAgICAgIDk4ICwgLy82MAorICAgICAgICAgICAgICAgICAgICAgICAgOTkgLCAvLzYxCisgICAgICAgICAgICAgICAgICAgICAgICA5OSAsIC8vNjIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy82MworICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzY0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vNjUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwgLy82NgorICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAvLzY3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDEsIC8vNjgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMiwgLy82OQorICAgICAgICAgICAgICAgICAgICAgICAgMTAyLCAvLzcwCisgICAgICAgICAgICAgICAgICAgICAgICAxMDIsIC8vNzEKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83MgorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzczCisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzQKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMywgLy83NQorICAgICAgICAgICAgICAgICAgICAgICAgMTAzLCAvLzc2CisgICAgICAgICAgICAgICAgICAgICAgICAxMDMsIC8vNzcKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy83OAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzc5CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODAKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84MQorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzgyCisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODMKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NAorICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg1CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODYKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNCwgLy84NworICAgICAgICAgICAgICAgICAgICAgICAgMTA0LCAvLzg4CisgICAgICAgICAgICAgICAgICAgICAgICAxMDQsIC8vODkKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzkxCisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTIKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85MworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk0CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85NgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzk3CisgICAgICAgICAgICAgICAgICAgICAgICAxMDUsIC8vOTgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwgLy85OQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwMworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwNworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEwOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExMworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExNworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExOAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzExOQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyMworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNAorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNQorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNgorICAgICAgICAgICAgICAgICAgICAgICAgMTA1LCAvLzEyNworICAgICAgICAgICAgICAgICAgICAgICAgMTA1LAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLzAKKyAgICAgICAgICAgICAgICAgICAgICAgNDAsICAvLzEKKyAgICAgICAgICAgICAgICAgICAgICAgNDMsICAvLzIKKyAgICAgICAgICAgICAgICAgICAgICAgNDUsICAvLzMKKyAgICAgICAgICAgICAgICAgICAgICAgNDcsICAvLzQKKyAgICAgICAgICAgICAgICAgICAgICAgNDksICAvLzUKKyAgICAgICAgICAgICAgICAgICAgICAgNTAsICAvLzYKKyAgICAgICAgICAgICAgICAgICAgICAgNTIsICAvLzcKKyAgICAgICAgICAgICAgICAgICAgICAgNTQsICAvLzgKKyAgICAgICAgICAgICAgICAgICAgICAgNTYsICAvLzkKKyAgICAgICAgICAgICAgICAgICAgICAgNTcsICAvLzEwCisgICAgICAgICAgICAgICAgICAgICAgIDU4LCAgLy8xMQorICAgICAgICAgICAgICAgICAgICAgICA1OSwgIC8vMTIKKyAgICAgICAgICAgICAgICAgICAgICAgNjAsICAvLzEzCisgICAgICAgICAgICAgICAgICAgICAgIDYyLCAgLy8xNAorICAgICAgICAgICAgICAgICAgICAgICA2MywgIC8vMTUKKyAgICAgICAgICAgICAgICAgICAgICAgNjQsICAvLzE2CisgICAgICAgICAgICAgICAgICAgICAgIDY1LCAgLy8xNworICAgICAgICAgICAgICAgICAgICAgICA2NiwgIC8vMTgKKyAgICAgICAgICAgICAgICAgICAgICAgNjcsICAvLzE5CisgICAgICAgICAgICAgICAgICAgICAgIDY4LCAgLy8yMAorICAgICAgICAgICAgICAgICAgICAgICA2OSwgIC8vMjEKKyAgICAgICAgICAgICAgICAgICAgICAgNzAsICAvLzIyCisgICAgICAgICAgICAgICAgICAgICAgIDcxLCAgLy8yMworICAgICAgICAgICAgICAgICAgICAgICA3MiwgIC8vMjQKKyAgICAgICAgICAgICAgICAgICAgICAgNzMsICAvLzI1CisgICAgICAgICAgICAgICAgICAgICAgIDc0LCAgLy8yNgorICAgICAgICAgICAgICAgICAgICAgICA3NCwgIC8vMjcKKyAgICAgICAgICAgICAgICAgICAgICAgNzUsICAvLzI4CisgICAgICAgICAgICAgICAgICAgICAgIDc2LCAgLy8yOQorICAgICAgICAgICAgICAgICAgICAgICA3NywgIC8vMzAKKyAgICAgICAgICAgICAgICAgICAgICAgNzgsICAvLzMxCisgICAgICAgICAgICAgICAgICAgICAgIDc4LCAgLy8zMgorICAgICAgICAgICAgICAgICAgICAgICA3OSwgIC8vMzMKKyAgICAgICAgICAgICAgICAgICAgICAgODAsICAvLzM0CisgICAgICAgICAgICAgICAgICAgICAgIDgxLCAgLy8zNQorICAgICAgICAgICAgICAgICAgICAgICA4MiwgIC8vMzYKKyAgICAgICAgICAgICAgICAgICAgICAgODMsICAvLzM3CisgICAgICAgICAgICAgICAgICAgICAgIDgzLCAgLy8zOAorICAgICAgICAgICAgICAgICAgICAgICA4NCwgIC8vMzkKKyAgICAgICAgICAgICAgICAgICAgICAgODUsICAvLzQwCisgICAgICAgICAgICAgICAgICAgICAgIDg1LCAgLy80MQorICAgICAgICAgICAgICAgICAgICAgICA4NiwgIC8vNDIKKyAgICAgICAgICAgICAgICAgICAgICAgODcsICAvLzQzCisgICAgICAgICAgICAgICAgICAgICAgIDg3LCAgLy80NAorICAgICAgICAgICAgICAgICAgICAgICA4OCwgIC8vNDUKKyAgICAgICAgICAgICAgICAgICAgICAgODksICAvLzQ2CisgICAgICAgICAgICAgICAgICAgICAgIDg5LCAgLy80NworICAgICAgICAgICAgICAgICAgICAgICA5MCwgIC8vNDgKKyAgICAgICAgICAgICAgICAgICAgICAgOTAsICAvLzQ5CisgICAgICAgICAgICAgICAgICAgICAgIDkxLCAgLy81MAorICAgICAgICAgICAgICAgICAgICAgICA5MSwgIC8vNTEKKyAgICAgICAgICAgICAgICAgICAgICAgOTIsICAvLzUyCisgICAgICAgICAgICAgICAgICAgICAgIDkyLCAgLy81MworICAgICAgICAgICAgICAgICAgICAgICA5MywgIC8vNTQKKyAgICAgICAgICAgICAgICAgICAgICAgOTMsICAvLzU1CisgICAgICAgICAgICAgICAgICAgICAgIDk0LCAgLy81NgorICAgICAgICAgICAgICAgICAgICAgICA5NCwgIC8vNTcKKyAgICAgICAgICAgICAgICAgICAgICAgOTUsICAvLzU4CisgICAgICAgICAgICAgICAgICAgICAgIDk1LCAgLy81OQorICAgICAgICAgICAgICAgICAgICAgICA5NiwgIC8vNjAKKyAgICAgICAgICAgICAgICAgICAgICAgOTYsICAvLzYxCisgICAgICAgICAgICAgICAgICAgICAgIDk2LCAgLy82MgorICAgICAgICAgICAgICAgICAgICAgICA5NywgIC8vNjMKKyAgICAgICAgICAgICAgICAgICAgICAgOTcsICAvLzY0CisgICAgICAgICAgICAgICAgICAgICAgIDk3LCAgLy82NQorICAgICAgICAgICAgICAgICAgICAgICA5OCwgIC8vNjYKKyAgICAgICAgICAgICAgICAgICAgICAgOTgsICAvLzY3CisgICAgICAgICAgICAgICAgICAgICAgIDk4LCAgLy82OAorICAgICAgICAgICAgICAgICAgICAgICA5OCwgIC8vNjkKKyAgICAgICAgICAgICAgICAgICAgICAgOTksICAvLzcwCisgICAgICAgICAgICAgICAgICAgICAgIDk5LCAgLy83MQorICAgICAgICAgICAgICAgICAgICAgICA5OSwgIC8vNzIKKyAgICAgICAgICAgICAgICAgICAgICAgOTksICAvLzczCisgICAgICAgICAgICAgICAgICAgICAgIDk5LCAgLy83NAorICAgICAgICAgICAgICAgICAgICAgICA5OSwgIC8vNzUKKyAgICAgICAgICAgICAgICAgICAgICAgOTksICAvLzc2CisgICAgICAgICAgICAgICAgICAgICAgIDk5LCAgLy83NworICAgICAgICAgICAgICAgICAgICAgICA5OSwgIC8vNzgKKyAgICAgICAgICAgICAgICAgICAgICAgOTksICAvLzc5CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vODAKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy84MQorICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzgyCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vODMKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy84NAorICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzg1CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vODYKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy84NworICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzg4CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vODkKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy85MAorICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzkxCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vOTIKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy85MworICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzk0CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgIC8vOTUKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAgLy85NgorICAgICAgICAgICAgICAgICAgICAgICAxMDAsICAvLzk3CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy85OAorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vOTkKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEwMAorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTAxCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMDIKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEwMworICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTA0CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMDUKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEwNgorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTA3CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMDgKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEwOQorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTEwCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMTEKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzExMgorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTEzCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMTQKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzExNQorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTE2CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMTcKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzExOAorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTE5CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMjAKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEyMQorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTIyCisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMjMKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEyNAorICAgICAgICAgICAgICAgICAgICAgICAxMDAsIC8vMTI1CisgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgLy8xMjYKKyAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAvLzEyNworICAgICAgICAgICAgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMTQKKyAgICAgICAgfSwKKworICAgICAgICAvL05WX1RBQkxFX1RQQ19QREFEQ19PRkZTRVRTCisgICAgICAgIHsKKyAgICAgICAgICAgIDk4LCAgLy8gUkZfQ0hBTl8xCisgICAgICAgICAgICAxMDEsICAvLyBSRl9DSEFOXzIKKyAgICAgICAgICAgIDEwMSwgIC8vIFJGX0NIQU5fMworICAgICAgICAgICAgMTAwLCAgLy8gUkZfQ0hBTl80CisgICAgICAgICAgICA5OCwgIC8vIFJGX0NIQU5fNQorICAgICAgICAgICAgOTcsICAvLyBSRl9DSEFOXzYKKyAgICAgICAgICAgIDk0LCAgLy8gUkZfQ0hBTl83CisgICAgICAgICAgICA5NCwgIC8vIFJGX0NIQU5fOAorICAgICAgICAgICAgOTIsICAvLyBSRl9DSEFOXzkKKyAgICAgICAgICAgIDkwLCAgLy8gUkZfQ0hBTl8xMAorICAgICAgICAgICAgOTQsICAvLyBSRl9DSEFOXzExCisgICAgICAgICAgICA5NSwgIC8vIFJGX0NIQU5fMTIKKyAgICAgICAgICAgIDk3LCAgLy8gUkZfQ0hBTl8xMworICAgICAgICAgICAgMTA0LCAgIC8vIFJGX0NIQU5fMTQKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzI0MAorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fMjQ0CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl8yNDgKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzI1MgorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fMjA4CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl8yMTIKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzIxNgorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fMzYKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzQwCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl80NAorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fNDgKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzUyCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl81NgorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fNjAKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzY0CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl8xMDAKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzEwNAorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fMTA4CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl8xMTIKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzExNgorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fMTIwIAorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fMTI0CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl8xMjgKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzEzMgorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fMTM2CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl8xNDAKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzE0OQorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fMTUzCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl8xNTcKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOXzE2MQorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fMTY1CisgICAgICAgICAgICAvL0NIQU5ORUwgQk9OREVEIENIQU5ORUxTCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzMgCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzQKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfNQorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fQk9ORF82CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzcKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfOAorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fQk9ORF85CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzEwCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzExCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzI0MgorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fQk9ORF8yNDYKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfMjUwCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzIxMAorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fQk9ORF8yMTQKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfMzgKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfNDIKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfNDYKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfNTAgCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzU0CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzU4CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzYyCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzEwMgorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fQk9ORF8xMDYKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfMTEwCisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzExNCAKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfMTE4IAorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fQk9ORF8xMjIKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfMTI2CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzEzMAorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fQk9ORF8xMzQKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfMTM4CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzE1MQorICAgICAgICAgICAgMTAwLCAgIC8vIFJGX0NIQU5fQk9ORF8xNTUKKyAgICAgICAgICAgIDEwMCwgICAvLyBSRl9DSEFOX0JPTkRfMTU5CisgICAgICAgICAgICAxMDAsICAgLy8gUkZfQ0hBTl9CT05EXzE2MworICAgICAgICB9LAorCisgICAgICAgIC8vTlZfVEFCTEVfVklSVFVBTF9SQVRFCisgICAgICAgIC8vIHR5cGVkZWYgdEFOSV9TMTYgdFBvd2VyZEJtOworICAgICAgICAvL3R5cGVkZWYgdFBvd2VyZEJtIHRSYXRlR3JvdXBQd3JbTlVNX0hBTF9QSFlfUkFURVNdOworICAgICAgICAvL3RSYXRlR3JvdXBQd3IgICAgICAgcHdyT3B0aW11bVtOVU1fUkZfU1VCQkFORFNdOworICAgICAgICB7CisgICAgICAgICAgICAvLyAyLjRHIFJGIFN1YmJhbmQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLzgwMi4xMWIgUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV8xMUFfNTRfTUJQUywKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV9NQ1NfMU5TU182NV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBIQUxfUEhZX1ZSQVRFX01DU18xTlNTX01NX1NHXzcyXzJfTUJQUywKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV9NQ1NfMU5TU19DQl8xMzVfTUJQUworICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBIQUxfUEhZX1ZSQVRFX01DU18xTlNTX01NX1NHX0NCXzE1MF9NQlBTLAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgLy8gNUcgTG93IFJGIFN1YmJhbmQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLzgwMi4xMWIgUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV8xMUFfNTRfTUJQUywKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV9NQ1NfMU5TU182NV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBIQUxfUEhZX1ZSQVRFX01DU18xTlNTX01NX1NHXzcyXzJfTUJQUywKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV9NQ1NfMU5TU19DQl8xMzVfTUJQUworICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBIQUxfUEhZX1ZSQVRFX01DU18xTlNTX01NX1NHX0NCXzE1MF9NQlBTLAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgLy8gNUcgTWlkZGxlIFJGIFN1YmJhbmQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLzgwMi4xMWIgUmF0ZXMKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV8xMUFfNTRfTUJQUywKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV9NQ1NfMU5TU182NV9NQlBTLAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBIQUxfUEhZX1ZSQVRFX01DU18xTlNTX01NX1NHXzcyXzJfTUJQUywKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV9NQ1NfMU5TU19DQl8xMzVfTUJQUworICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBIQUxfUEhZX1ZSQVRFX01DU18xTlNTX01NX1NHX0NCXzE1MF9NQlBTLAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgLy8gNUcgSGlnaCBSRiBTdWJiYW5kCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy84MDIuMTFiIFJhdGVzCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIEhBTF9QSFlfVlJBVEVfMTFBXzU0X01CUFMsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIEhBTF9QSFlfVlJBVEVfTUNTXzFOU1NfNjVfTUJQUywKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV9NQ1NfMU5TU19NTV9TR183Ml8yX01CUFMsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIEhBTF9QSFlfVlJBVEVfTUNTXzFOU1NfQ0JfMTM1X01CUFMKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gSEFMX1BIWV9WUkFURV9NQ1NfMU5TU19NTV9TR19DQl8xNTBfTUJQUywKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC8vIDQuOUcgUkYgU3ViYmFuZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vODAyLjExYiBSYXRlcworICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBIQUxfUEhZX1ZSQVRFXzExQV81NF9NQlBTLAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBIQUxfUEhZX1ZSQVRFX01DU18xTlNTXzY1X01CUFMsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIEhBTF9QSFlfVlJBVEVfTUNTXzFOU1NfTU1fU0dfNzJfMl9NQlBTLAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBIQUxfUEhZX1ZSQVRFX01DU18xTlNTX0NCXzEzNV9NQlBTCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIEhBTF9QSFlfVlJBVEVfTUNTXzFOU1NfTU1fU0dfQ0JfMTUwX01CUFMsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgICAgICB7MTAwfSwgICAgLy8gUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgezEwMH0sICAgIC8vIFJFU0VSVkVELAorICAgICAgICAgICAgICAgIHsxMDB9LCAgICAvLyBSRVNFUlZFRCwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworI2lmIDAgLy9GSVhNRV9QUklNQQorICAgICAgICAvL05WX1RBQkxFX0NBTF9NRU1PUlkKKyAgICAgICAgeworICAgICAgICAgICAgMHg3RkZGLCAgICAgIC8vIHRBTklfVTE2ICAgIHByb2Nlc3NfbW9uaXRvcjsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBoZGV0X2NhbF9jb2RlOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHJ4ZmVfZ21fMjsKKworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHR4X2JiZl9ydHVuZTsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBwYV9ydHVuZV9yZWc7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcnRfY29kZTsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBiaWFzX3J0dW5lOworCisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgYmJfYncxOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIGJiX2J3MjsKKyAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAgICAgICAgLy8gdEFOSV9VOCAgICAgcmVzZXJ2ZWRbMl07CisKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBiYl9idzM7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgYmJfYnc0OworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIGJiX2J3NTsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBiYl9idzY7CisKKyAgICAgICAgICAgIDB4N0ZGRiwgICAgICAvLyB0QU5JX1UxNiAgICByY01lYXN1cmVkOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHR4X2JiZl9jdDsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICB0eF9iYmZfY3RyOworCisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgY3NoX21heGdhaW5fcmVnOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIGNzaF8wZGJfcmVnOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIGNzaF9tM2RiX3JlZzsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBjc2hfbTZkYl9yZWc7CisKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBjZmZfMGRiX3JlZzsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBjZmZfbTNkYl9yZWc7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgY2ZmX202ZGJfcmVnOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHJ4ZmVfZ3Bpb19jdGxfMTsKKworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIG1peF9iYWxfY250XzI7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9TOCAgICAgcnhmZV9sbmFfaGlnaGdhaW5fYmlhc19jdGxfZGVsdGE7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcnhmZV9sbmFfbG9hZF9jdHVuZTsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICByeGZlX2xuYV9uZ21fcnR1bmU7CisKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICByeF9pbTJfaV9jZmcwOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHJ4X2ltMl9pX2NmZzE7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcnhfaW0yX3FfY2ZnMDsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICByeF9pbTJfcV9jZmcxOworCisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcGxsX3ZmY19yZWczX2IwOworICAgICAgICAgICAgMHgwMCwgICAgICAgIC8vIHRBTklfVTggICAgIHBsbF92ZmNfcmVnM19iMTsKKyAgICAgICAgICAgIDB4MDAsICAgICAgICAvLyB0QU5JX1U4ICAgICBwbGxfdmZjX3JlZzNfYjI7CisgICAgICAgICAgICAweDAwLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcGxsX3ZmY19yZWczX2IzOworCisgICAgICAgICAgICAweDdGRkYsICAgICAgICAvLyB0QU5JX1UxNiAgICB0ZW1wU3RhcnQ7CisgICAgICAgICAgICAweDdGRkYsICAgICAgICAvLyB0QU5JX1UxNiAgICB0ZW1wRmluaXNoOworCisgICAgICAgICAgICB7IC8vdHhMb0NvcnJlY3Rpb25zCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8zCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl82CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl85CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0gIC8vUkZfQ0hBTl8xNAorICAgICAgICAgICAgfSwgICAgICAgIC8vIHRUeExvQ29ycmVjdGlvbnMgICAgdHhMb1ZhbHVlczsKKworICAgICAgICAgICAgeyAvL3NUeElRQ2hhbm5lbAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8yCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl81CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl84CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFRYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gVFhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzEzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBUWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFRYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gVFhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBUWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9ICAvL1JGX0NIQU5fMTQKKyAgICAgICAgICAgIH0sICAgICAgICAvLyBzVHhJUUNoYW5uZWwgICAgICAgIHR4SXFWYWx1ZXM7CisKKyAgICAgICAgICAgIHsgLy9zUnhJUUNoYW5uZWwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFJYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBSWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gUlhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFJYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl80CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBSWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gUlhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFJYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl83CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBSWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gUlhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFJYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gUlhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSwgLy9SRl9DSEFOXzExCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF80CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzYKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF83CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzkKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzExCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzE0CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9ICAvLyBSWF9HQUlOX1NURVBfMTUKKyAgICAgICAgICAgICAgICB9LCAvL1JGX0NIQU5fMTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8yCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF81CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzcKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF84CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfOQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEwCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTEKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMgorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEzCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTQKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0gIC8vIFJYX0dBSU5fU1RFUF8xNQorICAgICAgICAgICAgICAgIH0sIC8vUkZfQ0hBTl8xMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8wCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzIKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8zCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzUKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF82CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfNworICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzgKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF85CisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTAKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xMQorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLy8gUlhfR0FJTl9TVEVQXzEyCisgICAgICAgICAgICAgICAgICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvLyBSWF9HQUlOX1NURVBfMTMKKyAgICAgICAgICAgICAgICAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8vIFJYX0dBSU5fU1RFUF8xNAorICAgICAgICAgICAgICAgICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSAgLy8gUlhfR0FJTl9TVEVQXzE1CisgICAgICAgICAgICAgICAgfSAgLy9SRl9DSEFOXzE0CisgICAgICAgICAgICB9LCAgICAgICAgLy8gc1J4SVFDaGFubmVsICAgICAgICByeElxVmFsdWVzOworCisgICAgICAgICAgICB7IC8vIHRUcGNDb25maWcgICAgICAgICAgY2xwY0RhdGFbTUFYX1RQQ19DSEFOTkVMU10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSwgLy8gUkZfQ0hBTl8xCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF81CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy9DQUxfUE9JTlRfNworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBQSFlfVFhfQ0hBSU5fMAorICAgICAgICAgICAgICAgICAgICB9IC8vIGVtcGlyaWNhbAorICAgICAgICAgICAgICAgIH0sIC8vIFJGX0NIQU5fMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF82CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vQ0FMX1BPSU5UXzcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gUEhZX1RYX0NIQUlOXzAKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbXBpcmljYWwKKyAgICAgICAgICAgICAgICB9LCAvLyBSRl9DSEFOXzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSwgLy8gUkZfQ0hBTl80CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF81CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy9DQUxfUE9JTlRfNworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBQSFlfVFhfQ0hBSU5fMAorICAgICAgICAgICAgICAgICAgICB9IC8vIGVtcGlyaWNhbAorICAgICAgICAgICAgICAgIH0sIC8vIFJGX0NIQU5fNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF82CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vQ0FMX1BPSU5UXzcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gUEhZX1RYX0NIQUlOXzAKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbXBpcmljYWwKKyAgICAgICAgICAgICAgICB9LCAvLyBSRl9DSEFOXzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSwgLy8gUkZfQ0hBTl83CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF81CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy9DQUxfUE9JTlRfNworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBQSFlfVFhfQ0hBSU5fMAorICAgICAgICAgICAgICAgICAgICB9IC8vIGVtcGlyaWNhbAorICAgICAgICAgICAgICAgIH0sIC8vIFJGX0NIQU5fOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF82CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vQ0FMX1BPSU5UXzcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gUEhZX1RYX0NIQUlOXzAKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbXBpcmljYWwKKyAgICAgICAgICAgICAgICB9LCAvLyBSRl9DSEFOXzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSwgLy8gUkZfQ0hBTl8xMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF82CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0gIC8vQ0FMX1BPSU5UXzcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gUEhZX1RYX0NIQUlOXzAKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbXBpcmljYWwKKyAgICAgICAgICAgICAgICB9LCAvLyBSRl9DSEFOXzExCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF81CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSAgLy9DQUxfUE9JTlRfNworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBQSFlfVFhfQ0hBSU5fMAorICAgICAgICAgICAgICAgICAgICB9IC8vIGVtcGlyaWNhbAorICAgICAgICAgICAgICAgIH0sIC8vIFJGX0NIQU5fMTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSwgIC8vIFJGX0NIQU5fMTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9LCAvL0NBTF9QT0lOVF80CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwIH0sIC8vQ0FMX1BPSU5UXzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAgfSwgLy9DQUxfUE9JTlRfNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCB9ICAvL0NBTF9QT0lOVF83CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIFBIWV9UWF9DSEFJTl8wCisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW1waXJpY2FsCisgICAgICAgICAgICAgICAgfSAgLy8gUkZfQ0hBTl8xNAorICAgICAgICAgICAgfSwgICAgICAgIC8vIHRUcGNDb25maWcgICAgICAgICAgY2xwY0RhdGFbTUFYX1RQQ19DSEFOTkVMU107CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7IDB4MDAwMCwgeyAweDAwLCAweDAwIH0gfSwgLy8gUkZfQ0hBTl8xOiBwZGFkY19vZmZzZXQsIHJlc2VydmVkWzJdCisgICAgICAgICAgICAgICAgeyAweDAwMDAsIHsgMHgwMCwgMHgwMCB9IH0sIC8vIFJGX0NIQU5fMjogcGRhZGNfb2Zmc2V0LCByZXNlcnZlZFsyXQorICAgICAgICAgICAgICAgIHsgMHgwMDAwLCB7IDB4MDAsIDB4MDAgfSB9LCAvLyBSRl9DSEFOXzM6IHBkYWRjX29mZnNldCwgcmVzZXJ2ZWRbMl0KKyAgICAgICAgICAgICAgICB7IDB4MDAwMCwgeyAweDAwLCAweDAwIH0gfSwgLy8gUkZfQ0hBTl80OiBwZGFkY19vZmZzZXQsIHJlc2VydmVkWzJdCisgICAgICAgICAgICAgICAgeyAweDAwMDAsIHsgMHgwMCwgMHgwMCB9IH0sIC8vIFJGX0NIQU5fNTogcGRhZGNfb2Zmc2V0LCByZXNlcnZlZFsyXQorICAgICAgICAgICAgICAgIHsgMHgwMDAwLCB7IDB4MDAsIDB4MDAgfSB9LCAvLyBSRl9DSEFOXzY6IHBkYWRjX29mZnNldCwgcmVzZXJ2ZWRbMl0KKyAgICAgICAgICAgICAgICB7IDB4MDAwMCwgeyAweDAwLCAweDAwIH0gfSwgLy8gUkZfQ0hBTl83OiBwZGFkY19vZmZzZXQsIHJlc2VydmVkWzJdCisgICAgICAgICAgICAgICAgeyAweDAwMDAsIHsgMHgwMCwgMHgwMCB9IH0sIC8vIFJGX0NIQU5fODogcGRhZGNfb2Zmc2V0LCByZXNlcnZlZFsyXQorICAgICAgICAgICAgICAgIHsgMHgwMDAwLCB7IDB4MDAsIDB4MDAgfSB9LCAvLyBSRl9DSEFOXzk6IHBkYWRjX29mZnNldCwgcmVzZXJ2ZWRbMl0KKyAgICAgICAgICAgICAgICB7IDB4MDAwMCwgeyAweDAwLCAweDAwIH0gfSwgLy8gUkZfQ0hBTl8xMDogcGRhZGNfb2Zmc2V0LCByZXNlcnZlZFsyXQorICAgICAgICAgICAgICAgIHsgMHgwMDAwLCB7IDB4MDAsIDB4MDAgfSB9LCAvLyBSRl9DSEFOXzExOiBwZGFkY19vZmZzZXQsIHJlc2VydmVkWzJdCisgICAgICAgICAgICAgICAgeyAweDAwMDAsIHsgMHgwMCwgMHgwMCB9IH0sIC8vIFJGX0NIQU5fMTI6IHBkYWRjX29mZnNldCwgcmVzZXJ2ZWRbMl0KKyAgICAgICAgICAgICAgICB7IDB4MDAwMCwgeyAweDAwLCAweDAwIH0gfSwgLy8gUkZfQ0hBTl8xMzogcGRhZGNfb2Zmc2V0LCByZXNlcnZlZFsyXQorICAgICAgICAgICAgICAgIHsgMHgwMDAwLCB7IDB4MDAsIDB4MDAgfSB9ICAvLyBSRl9DSEFOXzE0OiBwZGFkY19vZmZzZXQsIHJlc2VydmVkWzJdCisgICAgICAgICAgICB9ICAgICAgICAvLyB0VHBjUGFyYW1zICAgICAgICAgIGNscGNQYXJhbXNbTUFYX1RQQ19DSEFOTkVMU107CisKKyAgICAgICAgfSwgLy9OVl9UQUJMRV9DQUxfTUVNT1JZCisjZW5kaWYKKyAgICAgICAgLy9OVl9UQUJMRV9DQUxfU1RBVFVTCisgICAgICAgIHsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBvdmVyYWxsOworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIGZ3SW5pdDsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBoZGV0X2RjbzsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBydHVuZXI7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgY3R1bmVyOworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIGluc2l0dTsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBwcm9jZXNzX21vbml0b3I7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcGxsVmNvTGluZWFyaXR5OworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIHR4SVE7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcnhJUTsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICByeERjbzsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICB0eExvOworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIGxuYUJpYXM7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgbG5hQmFuZFR1bmluZzsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBsbmFHYWluQWRqdXN0OworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIGltMlVzaW5nTm9pc2VQd3I7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgdGVtcGVyYXR1cmU7CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgY2xwYzsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBjbHBjX3RlbXBfYWRqdXN0OworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIHR4RHBkOworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIGNoYW5uZWxUdW5lOworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIHJ4R21TdGFnZUxpbmVhcml0eTsKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICBpbTJVc2luZ1RvbmVHZW47CisgICAgICAgICAgICAweEZGLCAgICAgICAgLy8gdEFOSV9VOCAgICAgcnhCYmZUdW5pbmcKKyAgICAgICAgICAgIDB4RkYsICAgICAgICAvLyB0QU5JX1U4ICAgICB0eEJiZlR1bmluZworICAgICAgICAgICAgMHhGRiwgICAgICAgIC8vIHRBTklfVTggICAgIHBhQ1R1bmluZworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwCisgICAgICAgICAgICB9ICAgICAgICAvLyB0QU5JX1U4ICAgICB1bnVzZWRbOV07CisgICAgICAgIH0sCisKKyAgICAgICAgLy9OVl9UQUJMRV9SU1NJX0NIQU5ORUxfT0ZGU0VUUworICAgICAgICB7CisgICAgICAgICAgICAvL1BIWV9SWF9DSEFJTl8wCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9iUnNzaU9mZnNldAorICAgICAgICAgICAgICAgIHszMDB9LCAvLyBhcHBseSB0byBhbGwgY2hhbm5sZXMKKworICAgICAgICAgICAgICAgIC8vZ25Sc3NpT2Zmc2V0CisgICAgICAgICAgICAgICAgezMwMH0gIC8vIGFwcGx5IHRvIGFsbCBjaGFubmxlcworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC8vcnN2ZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vYlJzc2lPZmZzZXQKKyAgICAgICAgICAgICAgICB7MH0sICAgLy8gYXBwbHkgdG8gYWxsIGNoYW5ubGVzCisKKyAgICAgICAgICAgICAgICAvL2duUnNzaU9mZnNldAorICAgICAgICAgICAgICAgIHswfSAgICAvLyBhcHBseSB0byBhbGwgY2hhbm5sZXMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICAvL05WX1RBQkxFX1JGX0NBTF9WQUxVRVMKKyAgICAgICAgeworICAgICAgICAgICAgLy90eXBlZGVmIHN0cnVjdAorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICB0QU5JX1UzMiBjYWxTdGF0dXM7ICAvL3VzZSBlTnZDYWxJRAorICAgICAgICAgICAgLy8gICAgc0NhbERhdGEgY2FsRGF0YTsKKyAgICAgICAgICAgIC8vfXNSRkNhbFZhbHVlczsKKworICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAvL2NhbFN0YXR1cworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3Byb2Nlc3NfbW9uaXRvcjsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9oZGV0X2NhbF9jb2RlOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3J4ZmVfZ21fMjsKKworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3R4X2JiZl9ydHVuZTsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9wYV9ydHVuZV9yZWc7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcnRfY29kZTsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9iaWFzX3J0dW5lOworCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vYmJfYncxOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2JiX2J3MjsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9yZXNlcnZlZDA7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcmVzZXJ2ZWQxMTsKKworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2JiX2J3MzsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9iYl9idzQ7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vYmJfYnc1OworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2JiX2J3NjsKKworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3JjTWVhc3VyZWQ7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vdHhfYmJmX2N0OworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3R4X2JiZl9jdHI7CisKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9jc2hfbWF4Z2Fpbl9yZWc7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vY3NoXzBkYl9yZWc7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vY3NoX20zZGJfcmVnOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2NzaF9tNmRiX3JlZzsKKworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2NmZl8wZGJfcmVnOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL2NmZl9tM2RiX3JlZzsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9jZmZfbTZkYl9yZWc7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcnhmZV9ncGlvX2N0bF8xOworCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vbWl4X2JhbF9jbnRfMjsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9yeGZlX2xuYV9oaWdoZ2Fpbl9iaWFzX2N0bF9kZWx0YTsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9yeGZlX2xuYV9sb2FkX2N0dW5lOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3J4ZmVfbG5hX25nbV9ydHVuZTsKKworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3J4X2ltMl9zcGFyZTA7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcnhfaW0yX3NwYXJlMTsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9oZGV0X2RjbworCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcGxsX3ZmY19yZWczX2IwOworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3BsbF92ZmNfcmVnM19iMTsKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgLy9wbGxfdmZjX3JlZzNfYjI7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vcGxsX3ZmY19yZWczX2IzOworCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vdGVtcFN0YXJ0OworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAvL3Jvb21UZW1wOworCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vYW1iaWVudENhbFRlbXA7CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIC8vYW1iaWVudENhbFRlbXBWYWxpZDsKKyAgICAgICAgICAgICAgICAwICAgICAgICAgICAgLy9yZXNlcnZlZDI7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICAvL05WX1RBQkxFX0FOVEVOTkFfUEFUSF9MT1NTCisgICAgICAgIHsKKyAgICAgICAgICAgIDI4MCwgIC8vIFJGX0NIQU5fMQorICAgICAgICAgICAgMjcwLCAgLy8gUkZfQ0hBTl8yCisgICAgICAgICAgICAyNzAsICAvLyBSRl9DSEFOXzMKKyAgICAgICAgICAgIDI3MCwgIC8vIFJGX0NIQU5fNAorICAgICAgICAgICAgMjcwLCAgLy8gUkZfQ0hBTl81CisgICAgICAgICAgICAyNzAsICAvLyBSRl9DSEFOXzYKKyAgICAgICAgICAgIDI4MCwgIC8vIFJGX0NIQU5fNworICAgICAgICAgICAgMjgwLCAgLy8gUkZfQ0hBTl84CisgICAgICAgICAgICAyOTAsICAvLyBSRl9DSEFOXzkKKyAgICAgICAgICAgIDMwMCwgIC8vIFJGX0NIQU5fMTAKKyAgICAgICAgICAgIDMwMCwgIC8vIFJGX0NIQU5fMTEKKyAgICAgICAgICAgIDMxMCwgIC8vIFJGX0NIQU5fMTIKKyAgICAgICAgICAgIDMxMCwgIC8vIFJGX0NIQU5fMTMKKyAgICAgICAgICAgIDMxMCwgICAvLyBSRl9DSEFOXzE0CisgICAgICAgICAgICAyODAsICAvLyBSRl9DSEFOXzI0MAorICAgICAgICAgICAgMjgwLCAgLy8gUkZfQ0hBTl8yNDQKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOXzI0OAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fMjUyCisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl8yMDgKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOXzIxMgorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fMjE2CisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl8zNgorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fNDAKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOXzQ0CisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl80OAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fNTIKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOXzU2CisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl82MAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fNjQKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOXzEwMAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fMTA0CisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl8xMDgKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOXzExMgorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fMTE2CisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl8xMjAgCisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl8xMjQKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOXzEyOAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fMTMyCisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl8xMzYKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOXzE0MAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fMTQ5CisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl8xNTMKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOXzE1NworICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fMTYxCisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl8xNjUKKyAgICAgICAgICAgIC8vQ0hBTk5FTCBCT05ERUQgQ0hBTk5FTFMKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfMyAKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfNAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF81CisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl9CT05EXzYKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfNworICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF84CisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl9CT05EXzkKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfMTAKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfMTEKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfMjQyCisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl9CT05EXzI0NgorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF8yNTAKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfMjEwCisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl9CT05EXzIxNAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF8zOAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF80MgorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF80NgorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF81MCAKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfNTQKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfNTgKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfNjIKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfMTAyCisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl9CT05EXzEwNgorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF8xMTAKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfMTE0IAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF8xMTggCisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl9CT05EXzEyMgorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF8xMjYKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfMTMwCisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl9CT05EXzEzNAorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF8xMzgKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfMTUxCisgICAgICAgICAgICAyODAsICAgLy8gUkZfQ0hBTl9CT05EXzE1NQorICAgICAgICAgICAgMjgwLCAgIC8vIFJGX0NIQU5fQk9ORF8xNTkKKyAgICAgICAgICAgIDI4MCwgICAvLyBSRl9DSEFOX0JPTkRfMTYzCisgICAgICAgIH0sCisKKyAgICAgICAgLy9OVl9UQUJMRV9QQUNLRVRfVFlQRV9QT1dFUl9MSU1JVFMKKyAgICAgICAgeworICAgICAgICAgICAgeyAyMTUwIH0sIC8vIGFwcGxpZWQgdG8gYWxsIGNoYW5uZWxzLCBNT0RFXzgwMl8xMUIKKyAgICAgICAgICAgIHsgMTg1MCB9LCAvLyBhcHBsaWVkIHRvIGFsbCBjaGFubmVscyxNT0RFXzgwMl8xMUFHCisgICAgICAgICAgICB7IDE3NTAgfSAgLy8gYXBwbGllZCB0byBhbGwgY2hhbm5lbHMsTU9ERV84MDJfMTFOIAorICAgICAgICB9LAorCisgICAgICAgIC8vTlZfVEFCTEVfT0ZETV9DTURfUFdSX09GRlNFVAorICAgICAgICB7CisgICAgICAgICAgICAwLCAwCisgICAgICAgIH0sCisKKyAgICAgICAgLy9OVl9UQUJMRV9UWF9CQl9GSUxURVJfTU9ERQorICAgICAgICB7CisgICAgICAgICAgICAwCisgICAgICAgIH0KKworICAgIH0gLy8gdGFibGVzCit9OworCisjZW5kaWYgCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9DT1JFL1dEQS9zcmMvd2xhbl9xY3Rfd2RhLmMgYi9DT1JFL1dEQS9zcmMvd2xhbl9xY3Rfd2RhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0ODY4MAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RBL3NyYy93bGFuX3FjdF93ZGEuYwpAQCAtMCwwICsxLDEyNjQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICBXIEwgQSBOIF8gUSBDIFQgXyBXREEgLiBDCisKKyAgT1ZFUlZJRVc6CisKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBUcmFuc3BvcnQgTGF5ZXIuCisKKyAgVGhlIGZ1bmN0aW9ucyBleHRlcm5hbGl6ZWQgYnkgdGhpcyBtb2R1bGUgYXJlIHRvIGJlIGNhbGxlZCBPTkxZIGJ5IG90aGVyCisgIFdMQU4gbW9kdWxlcyB0aGF0IHByb3Blcmx5IHJlZ2lzdGVyIHdpdGggdGhlIFRyYW5zcG9ydCBMYXllciBpbml0aWFsbHkuCisKKyAgREVQRU5ERU5DSUVTOgorCisgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorCisKKyAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICAkSGVhZGVyJCREYXRlVGltZSQkQXV0aG9yJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLS0tICAgIC0tLSAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxMC8wNS8yMDExICAgIGhhcGFybmEgICAgIEFkZGluZyBzdXBwb3J0IGZvciBLZWVwIEFsaXZlIEZlYXR1cmUKKzIwMTAtMTItMzAgICAgc21pcnlhbGEgICAgIFVNQUMgY29udmVyZ2VuY2UgY2hhbmdlcworMjAxMC0wOC0xOSAgICBhZHdpdmVkaSAgICBXTEFOIERBTCBBTChXREEpIGxheWVyIGZvciBQcmltYQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisKKyNpbmNsdWRlICJ2b3NfbXEuaCIgCisjaW5jbHVkZSAidm9zX2FwaS5oIiAKKyNpbmNsdWRlICJ2b3NfcGFja2V0LmgiIAorI2luY2x1ZGUgInZvc19udml0ZW0uaCIKKyNpbmNsdWRlICJzaXJBcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfcGFja2V0LmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RhX21zZy5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9jZmcuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfZHMuaCIKKyNpbmNsdWRlICJ3bGFuX2hhbF9jZmcuaCIKKy8qKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInduaUFwaS5oIgorI2luY2x1ZGUgImNmZ0FwaS5oIgorI2luY2x1ZGUgImxpbUFwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3RsLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfdGxpX2JhLmgiCisjaW5jbHVkZSAibGltVXRpbHMuaCIKKyNpbmNsdWRlICJidGNBcGkuaCIKKyNpbmNsdWRlICJ2b3Nfc2NoZWQuaCIKKworI2lmZGVmIEFOSV9NQU5GX0RJQUcKKyNpbmNsdWRlICJwdHRNc2dBcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9zeXMuaCIKKyNlbmRpZiAvKiBBTklfTUFORl9ESUFHICovCisKKy8qIFVzZWQgTUFDUk8ncyAqLworLyogR2V0IFdEQSBjb250ZXh0IGZyb20gdk9TUyBtb2R1bGUgKi8KKyNkZWZpbmUgVk9TX0dFVF9XREFfQ1RYVChhKSAgICAgICAgICAgIHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1dEQSwgYSkKKyNkZWZpbmUgVk9TX0dFVF9NQUNfQ1RYVChhKSAgICAgICAgICAgIHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1BFLCBhKQorI2RlZmluZSBPRkZTRVRfT0Yoc3RydWN0VHlwZSxmbGROYW1lKSAgICgmKChzdHJ1Y3RUeXBlKikwKS0+ZmxkTmFtZSkKKyNkZWZpbmUgV0RBX0JBX1RYX0ZSTV9USFJFU0hPTEQgKDUpCisKKyNkZWZpbmUgIENPTlZFUlRfV0RJMlNJUl9TVEFUVVMoeCkgXAorICAgKChXRElfU1RBVFVTX1NVQ0NFU1MgIT0gKHgpKSA/IGVTSVJfRkFJTFVSRSA6IGVTSVJfU1VDQ0VTUykKKworI2RlZmluZSAgSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykgXAorICAgKChXRElfU1RBVFVTX1NVQ0NFU1MgIT0gKHN0YXR1cykpICYmIChXRElfU1RBVFVTX1BFTkRJTkcgIT0gKHN0YXR1cykpKQorCisjZGVmaW5lICBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHgpIFwKKyAgICgoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHgpKSA/IFZPU19TVEFUVVNfRV9GQUlMVVJFICA6IFZPU19TVEFUVVNfU1VDQ0VTUykKKworLyogbWFjcm8ncyBmb3IgYWNlc3NpbmcgVEwgQVBJL2RhdGEgc3RydWN0dXJlcyAqLworCisjZGVmaW5lIFdEQV9UTF9HRVRfVFhfUEtUQ09VTlQoYSwgYiwgYywgZCkgV0xBTlRMX0dldFR4UGt0Q291bnQoYSwgYiwgYywgZCkKKworI2RlZmluZSBXREFfR0VUX0JBX1RYRkxBRyhhLCBiLCBjKSAgXAorICAgKCgoYSktPndkYVN0YUluZm9bKGIpXS51Y1VzZUJhQml0bWFwKSAmICgxIDw8IChjKSkpICAKKworI2RlZmluZSBXREFfU0VUX0JBX1RYRkxBRyhhLCBiLCBjKSAgXAorICAgKCgoYSktPndkYVN0YUluZm9bKGIpXS51Y1VzZUJhQml0bWFwKSB8PSAoMSA8PCAoYykpKSAKKworI2RlZmluZSBXREFfQ0xFQVJfQkFfVFhGTEFHKGEsIGIsIGMpICBcCisgICAoKChhKS0+d2RhU3RhSW5mb1tiXS51Y1VzZUJhQml0bWFwKSAmPSB+KDEgPDwgYykpCisKKyNkZWZpbmUgV0RBX1RMX0JBX1NFU1NJT05fQUREKGEsIGIsIGMsIGQsIGUsIGYsIGcpIFwKKyAgIFdMQU5UTF9CYVNlc3Npb25BZGQoYSwgYiwgYywgZCwgZSwgZiwgZykKKworLyogdGltZXIgcmVsYXRlZCBNYWNyb3MgKi8KKyNkZWZpbmUgV0RBX0NSRUFURV9USU1FUihhLCBiLCBjLCBkLCBlLCBmLCBnKSBcCisgICB0eF90aW1lcl9jcmVhdGUoYSwgYiwgYywgZCwgZSwgZiwgZykKKyNkZWZpbmUgV0RBX1NUQVJUX1RJTUVSKGEpIHR4X3RpbWVyX2FjdGl2YXRlKGEpCisjZGVmaW5lIFdEQV9TVE9QX1RJTUVSKGEpIHR4X3RpbWVyX2RlYWN0aXZhdGUoYSkKKyNkZWZpbmUgV0RBX0RFU1RST1lfVElNRVIoYSkgdHhfdGltZXJfZGVsZXRlKGEpCisKKyNkZWZpbmUgV0RBX1dESV9TVEFSVF9USU1FT1VUIDE1MDAwCisKKyNkZWZpbmUgV0RBX0xBU1RfUE9MTEVEX1RIUkVTSE9MRChhLCBjdXJTdGEsIHRpZCkgXAorICAgKChhKS0+d2RhU3RhSW5mb1tjdXJTdGFdLmZyYW1lc1R4ZWRbdGlkXSArIFdEQV9CQV9UWF9GUk1fVEhSRVNIT0xEKQorCisjZGVmaW5lIFdEQV9CQV9NQVhfV0lOU0laRSAgICg2NCkKKworI2RlZmluZSBXREFfSU5WQUxJRF9LRVlfSU5ERVggIDB4RkYKKworI2RlZmluZSBXREFfTlVNX1BXUl9TQVZFX0NGRyAgICAgICAxMQorCisjZGVmaW5lIFdEQV9UWF9DT01QTEVURV9USU1FX09VVF9WQUxVRSAxMDAwCisgIAorCisjZGVmaW5lIFdEQV9NQVhfUkVUUklFU19USUxMX1JJTkdfRU1QVFkgIDEwMCAgIC8qIE1BWCAxMDAwbXNlYyB3YWl0ICovCisKKyNkZWZpbmUgV0RBX1dBSVRfTVNFQ19USUxMX1JJTkdfRU1QVFkgICAgMTAwICAgIC8qIDEwMCBtc2VjIHdhaXQgcGVyIGN5Y2xlICovCisvKiBleHRlcm4gZGVjbGFyYXRpb25zICovCitleHRlcm4gdm9pZCB2b3NfV0RBQ29tcGxldGVfY2JhY2sodl9QVk9JRF90IHBWb3NDb250ZXh0KTsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3ZvaWQgV0RBX1NlbmRNc2codFdEQV9DYkNvbnRleHQgKnBXREEsIHRBTklfVTE2IG1zZ1R5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBCb2R5cHRyLCB0QU5JX1UzMiBib2R5VmFsKSA7CitWT1NfU1RBVFVTIFdEQV9wcmVwYXJlQ29uZmlnVExWKHZfUFZPSURfdCBwVm9zQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9TdGFydFJlcVBhcmFtc1R5cGUgICp3ZGlTdGFydFBhcmFtcyApIDsKKworVk9TX1NUQVRVUyBXREFfd2RpQ29tcGxldGVDQih2X1BWT0lEX3QgcFZvc0NvbnRleHQpIDsKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZXRUeFBlclRyYWNraW5nUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCB0U2lyVHhQZXJUcmFja2luZ1BhcmFtICpwVHhQZXJUcmFja2luZ1BhcmFtcyk7CisKK2V4dGVybiB2X0JPT0xfdCBzeXNfdmFsaWRhdGVTdGFDb25maWcoIHZvaWQgKnBJbWFnZSwgdW5zaWduZWQgbG9uZyBjYkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnBwU3RhQ29uZmlnLCB2X1NJWkVfdCAqcGNiU3RhQ29uZmlnICkgOwordm9pZCBwcm9jZXNzQ2ZnRG93bmxvYWRSZXEodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMTYgbGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyICpwQ29uZmlnKSA7Cit2b2lkIFdEQV9VcGRhdGVCU1NQYXJhbXModFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICBXRElfQ29uZmlnQlNTUmVxSW5mb1R5cGUgKndkaUJzc1BhcmFtcywgdEFkZEJzc1BhcmFtcyAqd2RhQnNzUGFyYW1zKSA7Cit2b2lkIFdEQV9VcGRhdGVTVEFQYXJhbXModFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICBXRElfQ29uZmlnU3RhUmVxSW5mb1R5cGUgKndkaVN0YVBhcmFtcywgdEFkZFN0YVBhcmFtcyAqd2RhU3RhUGFyYW1zKSA7Cit2b2lkIFdEQV9sb3dMZXZlbEluZENhbGxiYWNrKFdESV9Mb3dMZXZlbEluZFR5cGUgKndkaUxvd0xldmVsSW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEgKSA7CitzdGF0aWMgVk9TX1NUQVRVUyB3ZGFDcmVhdGVUaW1lcnModFdEQV9DYkNvbnRleHQgKnBXREEpIDsKK3N0YXRpYyBWT1NfU1RBVFVTIHdkYURlc3Ryb3lUaW1lcnModFdEQV9DYkNvbnRleHQgKnBXREEpOwordm9pZCBXREFfQmFDaGVja0FjdGl2aXR5KHRXREFfQ2JDb250ZXh0ICpwV0RBKSA7Cit2b2lkIFdEQV9IQUxEdW1wQ21kQ2FsbGJhY2soV0RJX0hBTER1bXBDbWRSc3BQYXJhbXNUeXBlICp3ZGlSc3BQYXJhbXMsIHZvaWQqIHBVc2VyRGF0YSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0FnZ3JBZGRUU1JlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgdEFnZ3JBZGRUc1BhcmFtcyAqcEFnZ3JBZGRUc1JlcVBhcmFtcyk7CisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworCit2b2lkIFdEQV9UaW1lckhhbmRsZXIodl9WT0lEX3QgKnBXREEsIHRBTklfVTMyIHRpbWVySW5mbykgOwordm9pZCBXREFfUHJvY2Vzc1R4Q29tcGxldGVUaW1lT3V0SW5kKHRXREFfQ2JDb250ZXh0KiBwQ29udGV4dCkgOworVk9TX1NUQVRVUyBXREFfUmVzdW1lRGF0YVR4KHRXREFfQ2JDb250ZXh0ICpwV0RBKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworc3RhdGljIFZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZXRQcmVmTmV0d29ya1JlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgdFNpclBOT1NjYW5SZXEgKnBQTk9TY2FuUmVxUGFyYW1zKTsKK3N0YXRpYyBWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzU2V0UnNzaUZpbHRlclJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgdFNpclNldFJTU0lGaWx0ZXJSZXEqIHBSc3NpRmlsdGVyUGFyYW1zKTsKK3N0YXRpYyBWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzVXBkYXRlU2NhblBhcmFtcyh0V0RBX0NiQ29udGV4dCAqcFdEQSwgdFNpclVwZGF0ZVNjYW5QYXJhbXMgKnBVcGRhdGVTY2FuUGFyYW1zKTsKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCitzdGF0aWMgVk9TX1NUQVRVUyBXREFfUHJvY2VzczgwMjNNdWx0aWNhc3RMaXN0UmVxICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRXREFfQ2JDb250ZXh0ICpwV0RBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclJjdkZsdE1jQWRkckxpc3QgKnBSY3ZGbHRNY0FkZHJMaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK3N0YXRpYyBWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzUmVjZWl2ZUZpbHRlclNldEZpbHRlclJlcSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRXREFfQ2JDb250ZXh0ICpwV0RBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyUmN2UGt0RmlsdGVyQ2ZnVHlwZSAqcFJjdlBrdEZpbHRlckNmZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitzdGF0aWMgVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1BhY2tldEZpbHRlck1hdGNoQ291bnRSZXEgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0V0RBX0NiQ29udGV4dCAqcFdEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJSY3ZGbHRQa3RNYXRjaFJzcCBwUmN2Rmx0UGt0TWF0Y2hSc3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitzdGF0aWMgVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlclJlcSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFdEQV9DYkNvbnRleHQgKnBXREEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclJjdkZsdFBrdENsZWFyUGFyYW0gKnBSY3ZGbHRQa3RDbGVhclBhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZXRQb3dlclBhcmFtc1JlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgdFNpclNldFBvd2VyUGFyYW1zUmVxICpwUG93ZXJQYXJhbXMpOworCitzdGF0aWMgVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1R4Q29udHJvbEluZCh0V0RBX0NiQ29udGV4dCAqcFdEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwVHhDb250cm9sUGFyYW1zIHBUeEN0cmxQYXJhbSk7CisKK1ZPU19TVEFUVVMgV0RBX0dldFdlcEtleXNGcm9tQ2ZnKCB0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBEZWZhdWx0S2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgKnBOdW1LZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RJX0tleXNUeXBlICpwV2RpS2V5cyApOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECitzdGF0aWMgVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0dUS09mZmxvYWRSZXEodFdEQV9DYkNvbnRleHQgKnBXREEsIHRwU2lyR3RrT2ZmbG9hZFBhcmFtcyBwR3RrT2ZmbG9hZFBhcmFtcyk7CitzdGF0aWMgVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0dUS09mZmxvYWRHZXRJbmZvUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCB0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zIHBHdGtPZmZsb2FkR2V0SW5mb1JzcCk7CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZXRUbUxldmVsUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFuaVNldFRtTGV2ZWxSZXEgKnNldFRtTGV2ZWxSZXEpOworLyoKKyAqIEZVTkNUSU9OOiBXREFfb3BlbgorICogQWxsb2NhdGUgdGhlIFdEQSBjb250ZXh0IAorICovIAorVk9TX1NUQVRVUyBXREFfb3Blbih2X1BWT0lEX3QgcFZvc0NvbnRleHQsIHZfUFZPSURfdCBwT1NDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdE1hY09wZW5QYXJhbWV0ZXJzICpwTWFjUGFyYW1zICkKK3sKKyAgIHRXREFfQ2JDb250ZXh0ICp3ZGFDb250ZXh0OworICAgVk9TX1NUQVRVUyBzdGF0dXM7CisgICBXRElfRGV2aWNlQ2FwYWJpbGl0eVR5cGUgd2RpRGV2Q2FwYWJpbGl0eSA9IHswfSA7CisKKyAgIC8qIEFsbG9jYXRlIFdEQSBjb250ZXh0ICovCisgICBzdGF0dXMgPSB2b3NfYWxsb2NfY29udGV4dChwVm9zQ29udGV4dCwgVk9TX01PRFVMRV9JRF9XREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfVk9JRF90ICoqKSZ3ZGFDb250ZXh0LCBzaXplb2YodFdEQV9DYkNvbnRleHQpKSA7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICAvKl9fYXNtIGludCAzOyovCisgICB2b3NfbWVtX3plcm8od2RhQ29udGV4dCxzaXplb2YodFdEQV9DYkNvbnRleHQpKTsKKyAgIAorICAgLyogSW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgIHdkYUNvbnRleHQtPnBWb3NDb250ZXh0ID0gcFZvc0NvbnRleHQ7CisgICB3ZGFDb250ZXh0LT53ZGFTdGF0ZSA9IFdEQV9JTklUX1NUQVRFOworICAgd2RhQ29udGV4dC0+dVR4Rmxvd01hc2sgPSBXREFfVFhGTE9XTUFTSzsKKyAgIAorICAgLyogSW5pdGlhbGl6ZSBXREEtV0RJIHN5bmNocm9uaXphdGlvbiBldmVudCAqLworICAgc3RhdHVzID0gdm9zX2V2ZW50X2luaXQoJndkYUNvbnRleHQtPndkYVdkaUV2ZW50KTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldESSBTeW5jIEV2ZW50IGluaXQgZmFpbGVkIC0gc3RhdHVzID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLyogSW5pdCBGcmFtZSB0cmFuc2ZlciBldmVudCAqLworICAgc3RhdHVzID0gdm9zX2V2ZW50X2luaXQoJndkYUNvbnRleHQtPnR4RnJhbWVFdmVudCk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJWT1MgTWdtdCBGcmFtZSBFdmVudCBpbml0IGZhaWxlZCAtIHN0YXR1cyA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHN0YXR1cyA9IHZvc19ldmVudF9pbml0KCZ3ZGFDb250ZXh0LT5zdXNwZW5kRGF0YVR4RXZlbnQpOworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICJWT1Mgc3VzcGVuZCBkYXRhIHR4IEV2ZW50IGluaXQgZmFpbGVkIC0gc3RhdHVzID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgc3RhdHVzID0gdm9zX2V2ZW50X2luaXQoJndkYUNvbnRleHQtPndhaXRPbldkaUluZGljYXRpb25DYWxsQmFjayk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIlZPUyB3YWl0IE9uIFdkaSBJbmQgRXZlbnQgaW5pdCBmYWlsZWQgLSBzdGF0dXMgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICB2b3NfdHJhY2Vfc2V0TGV2ZWwoVk9TX01PRFVMRV9JRF9XREEsVk9TX1RSQUNFX0xFVkVMX0VSUk9SKTsKKworICAgd2RhQ29udGV4dC0+ZHJpdmVyTW9kZSA9IHBNYWNQYXJhbXMtPmRyaXZlclR5cGU7CisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0luaXQocE9TQ29udGV4dCwgJndkYUNvbnRleHQtPnBXZGlDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2RpRGV2Q2FwYWJpbGl0eSwgcE1hY1BhcmFtcy0+ZHJpdmVyVHlwZSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldESSBJbml0IGZhaWxlZCIgKTsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgZWxzZSAKKyAgIHsKKyAgICAgIHBNYWNQYXJhbXMtPm1heFN0YXRpb24gPSB3ZGlEZXZDYXBhYmlsaXR5LnVjTWF4U1RBU3VwcG9ydGVkIDsKKyAgICAgIHBNYWNQYXJhbXMtPm1heEJzc0lkID0gIHdkaURldkNhcGFiaWxpdHkudWNNYXhCU1NTdXBwb3J0ZWQ7CisgICAgICBwTWFjUGFyYW1zLT5mcmFtZVRyYW5zUmVxdWlyZWQgPSB3ZGlEZXZDYXBhYmlsaXR5LmJGcmFtZVh0bFN1cHBvcnRlZDsKKworICAgICAgLyogdXBkYXRlIG1heCBTVEEgaW4gV0RBIHVzZWQgZm9yIEJBICovCisgICAgICB3ZGFDb250ZXh0LT53ZGFNYXhTdGEgPSBwTWFjUGFyYW1zLT5tYXhTdGF0aW9uOworICAgICAgLyogc3RvcmUgdGhlIGZyYW1lVHJhbnNSZXF1aXJlZCBmbGFnIGluIHdkYUNvbnRleHQsIHRvIHNlbmQgdGhpcyB0byBIQUwgCisgICAgICAgKiBpbiBXREFfU3RhcnQKKyAgICAgICAqLworICAgICAgd2RhQ29udGV4dC0+ZnJhbWVUcmFuc1JlcXVpcmVkID0gd2RpRGV2Q2FwYWJpbGl0eS5iRnJhbWVYdGxTdXBwb3J0ZWQ7CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfcHJlU3RhcnQKKyAqIFRyaWdnZXIgREFMLUFMIHRvIHN0YXJ0IENGRyBkb3dubG9hZCAKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX3ByZVN0YXJ0KHZfUFZPSURfdCBwVm9zQ29udGV4dCkKK3sgICAKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdm9zX21zZ190IHdkYU1zZyA9IHswfSA7CisKKyAgIC8qCisgICAgKiB0cmlnZ2VyIENGRyBkb3dubG9hZCBpbiBXREEgYnkgc2VuZGluZyBXREFfQ0ZHX0ROTEQgbWVzc2FnZQorICAgICovIAorICAgd2RhTXNnLnR5cGUgPSBXTklfQ0ZHX0ROTERfUkVRIDsgCisgICB3ZGFNc2cuYm9keXB0ciA9IE5VTEw7CisgICB3ZGFNc2cuYm9keXZhbCA9IDA7CisKKyAgIC8qIHBvc3QgdGhlIG1lc3NhZ2UuLiAqLworICAgdm9zU3RhdHVzID0gdm9zX21xX3Bvc3RfbWVzc2FnZSggVk9TX01RX0lEX1dEQSwgJndkYU1zZyApOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQorICAgeworICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0JBRE1TRzsKKyAgIH0KKworICAgcmV0dXJuKCB2b3NTdGF0dXMgKTsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfd2RpU3RhcnRDYWxsYmFjaworICogT25jZSBXRElfU3RhcnQgaXMgZmluaXNoZWQsIFdESSBzdGFydCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBieSBXREkKKyAqIHRvIGluZGljYXRlIGNvbXBsZXRpb24gb2YgV0RJX1N0YXJ0LgorICovCit2b2lkIFdEQV93ZGlTdGFydENhbGxiYWNrKFdESV9TdGFydFJzcFBhcmFtc1R5cGUgKndkaVJzcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBWb3NDb250ZXh0KQoreworICAgdFdEQV9DYkNvbnRleHQgKndkYUNvbnRleHQ7CisgICBWT1NfU1RBVFVTIHN0YXR1czsKKworICAgaWYgKE5VTEwgPT0gcFZvc0NvbnRleHQpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICIlczogSW52b2tlZCB3aXRoIGludmFsaWQgcFZvc0NvbnRleHQiLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgd2RhQ29udGV4dCA9IFZPU19HRVRfV0RBX0NUWFQocFZvc0NvbnRleHQpOworICAgaWYgKE5VTEwgPT0gd2RhQ29udGV4dCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZva2VkIHdpdGggaW52YWxpZCB3ZGFDb250ZXh0IiwgX19GVU5DVElPTl9fICk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmIChXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd2RpUnNwUGFyYW1zLT53ZGlTdGF0dXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICIlczogV0RJX1N0YXJ0KCkgZmFpbHVyZSByZXBvcnRlZCIsIF9fRlVOQ1RJT05fXyApOworICAgfQorICAgZWxzZQorICAgeworICAgICAgd2RhQ29udGV4dC0+d2RhU3RhdGUgPSBXREFfU1RBUlRfU1RBVEU7CisgICB9CisKKyAgIC8qIGV4dHJhY3QgYW5kIHNhdmUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBTdGFydCBSZXNwb25zZSAqLworICAgd2RhQ29udGV4dC0+d2Nuc3NXbGFuQ29tcGlsZWRWZXJzaW9uLm1ham9yID0KKyAgICAgIHdkaVJzcFBhcmFtcy0+d2xhbkNvbXBpbGVkVmVyc2lvbi5tYWpvcjsKKyAgIHdkYUNvbnRleHQtPndjbnNzV2xhbkNvbXBpbGVkVmVyc2lvbi5taW5vciA9CisgICAgICB3ZGlSc3BQYXJhbXMtPndsYW5Db21waWxlZFZlcnNpb24ubWlub3I7CisgICB3ZGFDb250ZXh0LT53Y25zc1dsYW5Db21waWxlZFZlcnNpb24udmVyc2lvbiA9CisgICAgICB3ZGlSc3BQYXJhbXMtPndsYW5Db21waWxlZFZlcnNpb24udmVyc2lvbjsKKyAgIHdkYUNvbnRleHQtPndjbnNzV2xhbkNvbXBpbGVkVmVyc2lvbi5yZXZpc2lvbiA9CisgICAgICB3ZGlSc3BQYXJhbXMtPndsYW5Db21waWxlZFZlcnNpb24ucmV2aXNpb247CisgICB3ZGFDb250ZXh0LT53Y25zc1dsYW5SZXBvcnRlZFZlcnNpb24ubWFqb3IgPQorICAgICAgd2RpUnNwUGFyYW1zLT53bGFuUmVwb3J0ZWRWZXJzaW9uLm1ham9yOworICAgd2RhQ29udGV4dC0+d2Nuc3NXbGFuUmVwb3J0ZWRWZXJzaW9uLm1pbm9yID0KKyAgICAgIHdkaVJzcFBhcmFtcy0+d2xhblJlcG9ydGVkVmVyc2lvbi5taW5vcjsKKyAgIHdkYUNvbnRleHQtPndjbnNzV2xhblJlcG9ydGVkVmVyc2lvbi52ZXJzaW9uID0KKyAgICAgIHdkaVJzcFBhcmFtcy0+d2xhblJlcG9ydGVkVmVyc2lvbi52ZXJzaW9uOworICAgd2RhQ29udGV4dC0+d2Nuc3NXbGFuUmVwb3J0ZWRWZXJzaW9uLnJldmlzaW9uID0KKyAgICAgIHdkaVJzcFBhcmFtcy0+d2xhblJlcG9ydGVkVmVyc2lvbi5yZXZpc2lvbjsKKyAgIHdwYWxNZW1vcnlDb3B5KHdkYUNvbnRleHQtPndjbnNzU29mdHdhcmVWZXJzaW9uU3RyaW5nLAorICAgICAgICAgICB3ZGlSc3BQYXJhbXMtPndjbnNzU29mdHdhcmVWZXJzaW9uLAorICAgICAgICAgICBzaXplb2Yod2RhQ29udGV4dC0+d2Nuc3NTb2Z0d2FyZVZlcnNpb25TdHJpbmcpKTsKKyAgIHdwYWxNZW1vcnlDb3B5KHdkYUNvbnRleHQtPndjbnNzSGFyZHdhcmVWZXJzaW9uU3RyaW5nLAorICAgICAgICAgICB3ZGlSc3BQYXJhbXMtPndjbnNzSGFyZHdhcmVWZXJzaW9uLAorICAgICAgICAgICBzaXplb2Yod2RhQ29udGV4dC0+d2Nuc3NIYXJkd2FyZVZlcnNpb25TdHJpbmcpKTsKKworICAgLyogTm90aWZ5IFdEQV9zdGFydCB0aGF0IFdESV9TdGFydCBoYXMgY29tcGxldGVkICovCisgICBzdGF0dXMgPSB2b3NfZXZlbnRfc2V0KCZ3ZGFDb250ZXh0LT53ZGFXZGlFdmVudCk7CisgICBpZiAoV0RJX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gdW5ibG9jayBXREFfc3RhcnQiLCBfX0ZVTkNUSU9OX18gKTsKKyAgIH0KKworICAgcmV0dXJuOworfQorCisKKy8qCisgKiBGVU5DVElPTjogV0RBX3N0YXJ0CisgKiBQcmVwYXJlIFRMViBjb25maWd1cmF0aW9uIGFuZCBjYWxsIFdESV9TdGFydC4KKyAqLworCitWT1NfU1RBVFVTIFdEQV9zdGFydCh2X1BWT0lEX3QgcFZvc0NvbnRleHQpCit7CisgICB0V0RBX0NiQ29udGV4dCAqd2RhQ29udGV4dDsKKyAgIFZPU19TVEFUVVMgc3RhdHVzOworICAgV0RJX1N0YXR1cyB3ZGlTdGF0dXM7CisgICBXRElfU3RhcnRSZXFQYXJhbXNUeXBlIHdkaVN0YXJ0UGFyYW07CisKKyAgIGlmIChOVUxMID09IHBWb3NDb250ZXh0KQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEludm9rZWQgd2l0aCBpbnZhbGlkIHBWb3NDb250ZXh0IiwgX19GVU5DVElPTl9fICk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHdkYUNvbnRleHQgPSBWT1NfR0VUX1dEQV9DVFhUKHBWb3NDb250ZXh0KTsKKyAgIGlmIChOVUxMID09IHdkYUNvbnRleHQpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogSW52b2tlZCB3aXRoIGludmFsaWQgd2RhQ29udGV4dCIsIF9fRlVOQ1RJT05fXyApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKiBOb24tRlRNIG1vZGUsIFdEQSBzdGF0dXMgZm9yIFNUQVJUIG11c3QgYmUgSU5JVAorICAgICogRlRNIG1vZGUsIFdEQSBTdGF0dXMgZm9yIFNUQVJUIGNhbiBiZSBJTklUIG9yIFNUT1AgKi8KKyAgIGlmICggKFdEQV9JTklUX1NUQVRFICE9IHdkYUNvbnRleHQtPndkYVN0YXRlKSAmJgorICAgICAgICAoV0RBX1NUT1BfU1RBVEUgIT0gd2RhQ29udGV4dC0+d2RhU3RhdGUpICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZva2VkIGZyb20gd3Jvbmcgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdkYUNvbnRleHQtPndkYVN0YXRlICk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIGluaXRpYWxpemUgdGhlIHdkaVN0YXJ0UGFyYW0uICBOb3RlIHRoYXQgd2UgY2FuIGNyZWF0ZSB0aGlzIG9uCisgICAgICB0aGUgc3RhY2sgc2luY2Ugd2Ugd29uJ3QgZXhpdCB1bnRpbCBXRElfU3RhcnQoKSBjb21wbGV0ZXMgb3IKKyAgICAgIHRpbWVzIG91dCAqLworICAgdm9zX21lbV9zZXQoJndkaVN0YXJ0UGFyYW0sIHNpemVvZih3ZGlTdGFydFBhcmFtKSwgMCk7CisKKyAgIHdkaVN0YXJ0UGFyYW0ud2RpRHJpdmVyVHlwZSA9IHdkYUNvbnRleHQtPmRyaXZlck1vZGU7CisKKyAgIC8qIHByZXBhcmUgdGhlIGNvbmZpZyBUTFYgZm9yIHRoZSBXREkgKi8KKyAgIHN0YXR1cyA9IFdEQV9wcmVwYXJlQ29uZmlnVExWKHBWb3NDb250ZXh0LCAmd2RpU3RhcnRQYXJhbSk7CisgICBpZiAoICFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogVW5hYmxlIHRvIHByZXBhcmUgQ29uZmlnIFRMViIsIF9fRlVOQ1RJT05fXyApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKiBub3RlIGZyb20gaGVyZSBvbndhcmRzIGlmIGFuIGVycm9yIG9jY3VycyB3ZSBtdXN0CisgICAgICByZWNsYWltIHRoZSBjb25maWcgVExWIGJ1ZmZlciAqLworCisgICB3ZGlTdGFydFBhcmFtLndkaUxvd0xldmVsSW5kQ0IgPSBXREFfbG93TGV2ZWxJbmRDYWxsYmFjazsKKyAgIHdkaVN0YXJ0UGFyYW0ucEluZFVzZXJEYXRhID0gKHZfUFZPSURfdCAqKXdkYUNvbnRleHQ7CisgICB3ZGlTdGFydFBhcmFtLndkaVJlcVN0YXR1c0NCID0gTlVMTDsKKworICAgLyogaW5pdGlhbGl6ZSB0aGUgV0RBLVdESSBzeW5jaHJvbml6YXRpb24gZXZlbnQgKi8KKyAgIHZvc19ldmVudF9yZXNldCgmd2RhQ29udGV4dC0+d2RhV2RpRXZlbnQpOworCisgICAvKiBjYWxsIFdESSBzdGFydCAqLworICAgd2RpU3RhdHVzID0gV0RJX1N0YXJ0KCZ3ZGlTdGFydFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfU3RhcnRSc3BDYilXREFfd2RpU3RhcnRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAodl9WT0lEX3QgKilwVm9zQ29udGV4dCk7CisgICBpZiAoIElTX1dESV9TVEFUVVNfRkFJTFVSRSh3ZGlTdGF0dXMpICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgIiVzOiBXREkgU3RhcnQgZmFpbGVkIiwgX19GVU5DVElPTl9fICk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpU3RhcnRQYXJhbS5wQ29uZmlnQnVmZmVyKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLyogd2FpdCBmb3IgV0RJIHN0YXJ0IHRvIGludm9rZSBvdXIgY2FsbGJhY2sgKi8KKyAgIHN0YXR1cyA9IHZvc193YWl0X3NpbmdsZV9ldmVudCggJndkYUNvbnRleHQtPndkYVdkaUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfV0RJX1NUQVJUX1RJTUVPVVQgKTsKKyAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkKKyAgIHsKKyAgICAgIGlmICggVk9TX1NUQVRVU19FX1RJTUVPVVQgPT0gc3RhdHVzICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBUaW1lb3V0IG9jY3VycmVkIGR1cmluZyBXRElfU3RhcnQiLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBFcnJvciAlZCB3aGlsZSB3YWl0aW5nIGZvciBXRElfU3RhcnQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisgICAgICB9CisgICAgICB2b3NfbWVtX2ZyZWUod2RpU3RhcnRQYXJhbS5wQ29uZmlnQnVmZmVyKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLyogV0RJX1N0YXJ0KCkgaGFzIGNvbXBsZXRlZCBzbyB3ZSBjYW4gcmVzdW1lIG91ciB3b3JrICovCisKKyAgIC8qIHdlIG5vIGxvbmdlciBuZWVkIHRoZSBjb25maWcgVExWICovCisgICB2b3NfbWVtX2ZyZWUod2RpU3RhcnRQYXJhbS5wQ29uZmlnQnVmZmVyKTsKKworICAgLyogaWYgd2UgYXJlIG5vdCBpbiB0aGUgU1RBUlQgc3RhdGUgdGhlbiBXRElfU3RhcnQoKSBmYWlsZWQgKi8KKyAgIGlmIChXREFfU1RBUlRfU1RBVEUgIT0gd2RhQ29udGV4dC0+d2RhU3RhdGUpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogV0RJX1N0YXJ0KCkgZmFpbHVyZSBkZXRlY3RlZCIsIF9fRlVOQ1RJT05fXyApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKiBGVE0gbW9kZSBkb2VzIG5vdCBuZWVkIHRvIG1vbml0b3IgQkEgYWN0aXZpdHkgKi8KKyAgIGlmICggZURSSVZFUl9UWVBFX01GRyAhPSB3ZGFDb250ZXh0LT5kcml2ZXJNb2RlICkKKyAgIHsKKyAgICAgIHN0YXR1cyA9IHdkYUNyZWF0ZVRpbWVycyh3ZGFDb250ZXh0KSA7CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfcHJlcGFyZUNvbmZpZ1RMVgorICogRnVuY3Rpb24gdG8gcHJlcGFyZSBDRkcgZm9yIERBTChXREEpCisgKi8KK1ZPU19TVEFUVVMgV0RBX3ByZXBhcmVDb25maWdUTFYodl9QVk9JRF90IHBWb3NDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfU3RhcnRSZXFQYXJhbXNUeXBlICAqd2RpU3RhcnRQYXJhbXMgKQoreworICAgLyogZ2V0IHBNYWMgdG8gYWNlc3MgQ0ZHIGRhdGEgYmFzZSAqLworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCApVk9TX0dFVF9NQUNfQ1RYVChwVm9zQ29udGV4dCk7CisgICB0V0RBX0NiQ29udGV4dCAqd2RhQ29udGV4dD0gKHRXREFfQ2JDb250ZXh0ICopVk9TX0dFVF9XREFfQ1RYVChwVm9zQ29udGV4dCk7CisgICB0SGFsQ2ZnICAgICAgICAqdGx2U3RydWN0ID0gTlVMTCA7CisgICB0QU5JX1U4ICAgICAgICAqdGx2U3RydWN0U3RhcnQgPSBOVUxMIDsKKyAgIHRBTklfVTMyICAgICAgIHN0ckxlbmd0aCA9IFdOSV9DRkdfU1RBX0lEX0xFTjsKKyAgIHZfUFZPSURfdCAgICAgICpjb25maWdQYXJhbTsKKyAgIHRBTklfVTMyICAgICAgIGNvbmZpZ1BhcmFtU2l6ZTsKKyAgIHRBTklfVTMyICAgICAgICpjb25maWdEYXRhVmFsdWU7CisgICBXRElfV2xhblZlcnNpb25UeXBlIHdjbnNzQ29tcGlsZWRBcGlWZXJzaW9uOworCisgICBpZiAoKE5VTEwgPT0gcE1hYyl8fChOVUxMID09IHdkYUNvbnRleHQpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEludm9rZWQgd2l0aCBpbnZhbGlkIHdkYUNvbnRleHQgb3IgcE1hYyIsIF9fRlVOQ1RJT05fXyApOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgY29uZmlnUGFyYW1TaXplID0gKHNpemVvZih0SGFsQ2ZnKSAqIFFXTEFOX0hBTF9DRkdfTUFYX1BBUkFNUykgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfU1RBX0lEX0xFTiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0VEQ0FfV01FX0FDQktfTEVOICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOSV9DRkdfRURDQV9XTUVfQUNCRV9MRU4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgV05JX0NGR19FRENBX1dNRV9BQ1ZJX0xFTiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXTklfQ0ZHX0VEQ0FfV01FX0FDVk9fTEVOICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFFXTEFOX0hBTF9DRkdfSU5URUdFUl9QQVJBTSAqIHNpemVvZih0QU5JX1UzMikpOworCisgICAvKiBtYWxsb2MgbWVtb3J5IGZvciBhbGwgY29uZmlncyBpbiBvbmUgc2hvdCAqLyAKKyAgIGNvbmZpZ1BhcmFtID0gdm9zX21lbV9tYWxsb2MoY29uZmlnUGFyYW1TaXplKTsKKyAgIAorICAgaWYoTlVMTCA9PSBjb25maWdQYXJhbSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6Y29uZmlnUGFyYW0gaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICB2b3NfbWVtX3NldChjb25maWdQYXJhbSwgY29uZmlnUGFyYW1TaXplLCAwKTsKKworICAgd2RpU3RhcnRQYXJhbXMtPnBDb25maWdCdWZmZXIgPSBjb25maWdQYXJhbTsKKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKiljb25maWdQYXJhbTsKKyAgIHRsdlN0cnVjdFN0YXJ0ID0gKHRBTklfVTggKiljb25maWdQYXJhbTsKKworICAgLyogVE9ETzogUmVtb3ZlIExhdGVyICovCisgICAvKiBRV0xBTl9IQUxfQ0ZHX1NUQV9JRCAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19TVEFfSUQ7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIqKSgodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgKyBzaXplb2YodEhhbENmZykpOworICAgaWYod2xhbl9jZmdHZXRTdHIocE1hYywgV05JX0NGR19TVEFfSUQsICh0QU5JX1U4Kiljb25maWdEYXRhVmFsdWUsICZzdHJMZW5ndGgpICE9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfU1RBX0lEIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorICAgdGx2U3RydWN0LT5sZW5ndGggPSBzdHJMZW5ndGggOworICAgLyogY2FsY3VsYXRlIHRoZSBwYWQgYnl0ZXMgdG8gaGF2ZSB0aGUgQ0ZHIGluIGFsaWduZWQgZm9ybWF0ICovCisgICB0bHZTdHJ1Y3QtPnBhZEJ5dGVzID0gQUxJR05FRF9XT1JEX1NJWkUgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0bHZTdHJ1Y3QtPmxlbmd0aCAmIChBTElHTkVEX1dPUkRfU0laRSAtIDEpKTsKKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoICsgdGx2U3RydWN0LT5wYWRCeXRlcykpIDsKKworICAgLyogUVdMQU5fSEFMX0NGR19DVVJSRU5UX1RYX0FOVEVOTkEgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19DVVJSRU5UX1RYX0FOVEVOTkEsIGNvbmZpZ0RhdGFWYWx1ZSApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfQ1VSUkVOVF9UWF9BTlRFTk5BIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19DVVJSRU5UX1JYX0FOVEVOTkEgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19DVVJSRU5UX1JYX0FOVEVOTkEsIGNvbmZpZ0RhdGFWYWx1ZSkgIT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0NVUlJFTlRfUlhfQU5URU5OQSIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkpIDsgCisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfTE9XX0dBSU5fT1ZFUlJJREUgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfTE9XX0dBSU5fT1ZFUlJJREU7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFLCBjb25maWdEYXRhVmFsdWUgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOworIAorICAgLyogUVdMQU5fSEFMX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU4gKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhVmFsdWUgKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTiIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkpOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19DQUxfUEVSSU9EICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX0NBTF9QRVJJT0Q7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0NBTF9QRVJJT0QsIGNvbmZpZ0RhdGFWYWx1ZSApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0NBTF9QRVJJT0QiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKTsKKworICAgLyogUVdMQU5fSEFMX0NGR19DQUxfQ09OVFJPTCAgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfQ0FMX0NPTlRST0wgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19DQUxfQ09OVFJPTCwgY29uZmlnRGF0YVZhbHVlICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0NBTF9DT05UUk9MIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSk7CisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfUFJPWElNSVRZICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19QUk9YSU1JVFkgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QUk9YSU1JVFksIGNvbmZpZ0RhdGFWYWx1ZSApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19QUk9YSU1JVFkiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19ORVRXT1JLX0RFTlNJVFkgICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX05FVFdPUktfREVOU0lUWSA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX05FVFdPUktfREVOU0lUWSwgY29uZmlnRGF0YVZhbHVlICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX05FVFdPUktfREVOU0lUWSIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkpOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19NQVhfTUVESVVNX1RJTUUgICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX01BWF9NRURJVU1fVElNRSA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX01BWF9NRURJVU1fVElNRSwgY29uZmlnRGF0YVZhbHVlICkgIT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfTUFYX01FRElVTV9USU1FIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSk7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX01BWF9NUERVU19JTl9BTVBEVSAgICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX01BWF9NUERVU19JTl9BTVBEVSAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19NQVhfTVBEVVNfSU5fQU1QRFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0RhdGFWYWx1ZSApICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfTUFYX01QRFVTX0lOX0FNUERVIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOworCisgICAvKiBRV0xBTl9IQUxfQ0ZHX1JUU19USFJFU0hPTEQgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19SVFNfVEhSRVNIT0xEICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1JUU19USFJFU0hPTEQsIGNvbmZpZ0RhdGFWYWx1ZSApICE9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19SVFNfVEhSRVNIT0xEIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSk7CisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfU0hPUlRfUkVUUllfTElNSVQgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19TSE9SVF9SRVRSWV9MSU1JVCAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19TSE9SVF9SRVRSWV9MSU1JVCwgY29uZmlnRGF0YVZhbHVlICkgIT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfU0hPUlRfUkVUUllfTElNSVQiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKSA7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX0xPTkdfUkVUUllfTElNSVQgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19MT05HX1JFVFJZX0xJTUlUICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVQsIGNvbmZpZ0RhdGFWYWx1ZSApICE9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0xPTkdfUkVUUllfTElNSVQiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKSA7CisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhVmFsdWUgKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOworCisgICAvKiBRV0xBTl9IQUxfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk8gICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhVmFsdWUgKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk8iKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKTsKKyAKKyAgIC8qIFFXTEFOX0hBTF9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FICAgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhVmFsdWUgKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORSIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkpOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV08gICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV08gIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfVFdPLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0RhdGFWYWx1ZSApICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfVFdPIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSk7CisgCisgICAvKiBRV0xBTl9IQUxfQ0ZHX0ZJWEVEX1JBVEUgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19GSVhFRF9SQVRFICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0ZJWEVEX1JBVEUsIGNvbmZpZ0RhdGFWYWx1ZSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0ZJWEVEX1JBVEUiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKTsKKyAKKyAgIC8qIFFXTEFOX0hBTF9DRkdfUkVUUllSQVRFX1BPTElDWSAgICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX1JFVFJZUkFURV9QT0xJQ1kgIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUkVUUllSQVRFX1BPTElDWSwgY29uZmlnRGF0YVZhbHVlICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1kiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKTsKKyAKKyAgIC8qIFFXTEFOX0hBTF9DRkdfUkVUUllSQVRFX1NFQ09OREFSWSAgICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX1JFVFJZUkFURV9TRUNPTkRBUlkgIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUkVUUllSQVRFX1NFQ09OREFSWSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRGF0YVZhbHVlICkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19SRVRSWVJBVEVfVEVSVElBUlkgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19SRVRSWVJBVEVfVEVSVElBUlkgIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhVmFsdWUgKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWSIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKSA7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OICAgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04gIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0RhdGFWYWx1ZSApICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04iKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCk7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzI0R0haICAgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFogIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0RhdGFWYWx1ZSApICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFoiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCk7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFogICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF81R0haICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0RhdGFWYWx1ZSApICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWiIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKTsgCisgICAKKyNpZiAwIC8qRklYTUVfUFJJTUEgOiBFbmFibGUgdGhpcyBhZnRlciB0aGUgUkEgaXMgZW5hYmxlZCBpbiBIQUwqLworICAgLyogUVdMQU5fSEFMX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFogICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFogIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhVmFsdWUgKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWiIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKTsgCisjZW5kaWYKKyAgIC8qIFFXTEFOX0hBTF9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzVHSFogICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWiAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRGF0YVZhbHVlICkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWiIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCk7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX01BWF9CQV9TRVNTSU9OUyAgICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX01BWF9CQV9TRVNTSU9OUyAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19NQVhfQkFfU0VTU0lPTlMsIGNvbmZpZ0RhdGFWYWx1ZSApICE9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfTUFYX0JBX1NFU1NJT05TIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKTsKKyAKKyAgIC8qIFFXTEFOX0hBTF9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVQgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVCAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0RhdGFWYWx1ZSApICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKTsgCisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVIgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUiAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRGF0YVZhbHVlICkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUiIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCk7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1IgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19QU19FTkFCTEVfUlNTSV9NT05JVE9SICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0RhdGFWYWx1ZSApICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUiIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0UgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0UgIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRGF0YVZhbHVlICkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRSIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpOworIAorICAgLyogUVdMQU5fSEFMX0NGR19TVEFUU19QRVJJT0QgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19TVEFUU19QRVJJT0QgIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfU1RBVFNfUEVSSU9ELCBjb25maWdEYXRhVmFsdWUgKSAhPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX1NUQVRTX1BFUklPRCIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKTsgCisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfQ0ZQX01BWF9EVVJBVElPTiAgICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX0NGUF9NQVhfRFVSQVRJT04gIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQ0ZQX01BWF9EVVJBVElPTiwgY29uZmlnRGF0YVZhbHVlICkgIT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19DRlBfTUFYX0RVUkFUSU9OIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpIDsgCisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfRlJBTUVfVFJBTlNfRU5BQkxFRCAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19GUkFNRV9UUkFOU19FTkFCTEVEICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICB2b3NfbWVtX2NvcHkoY29uZmlnRGF0YVZhbHVlLCAmd2RhQ29udGV4dC0+ZnJhbWVUcmFuc1JlcXVpcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRBTklfVTMyKSk7CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19EVElNX1BFUklPRCAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19EVElNX1BFUklPRCAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19EVElNX1BFUklPRCwgY29uZmlnRGF0YVZhbHVlKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfRFRJTV9QRVJJT0QiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19FRENBX1dNTV9BQ0JLICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX0VEQ0FfV01NX0FDQksgIDsKKyAgIHN0ckxlbmd0aCA9IFdOSV9DRkdfRURDQV9XTUVfQUNCS19MRU47CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0VEQ0FfV01FX0FDQkssICh0QU5JX1U4ICopY29uZmlnRGF0YVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ckxlbmd0aCkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19FRENBX1dNRV9BQ0JLIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorICAgdGx2U3RydWN0LT5sZW5ndGggPSBzdHJMZW5ndGg7CisgICAvKiBjYWxjdWxhdGUgdGhlIHBhZCBieXRlcyB0byBoYXZlIHRoZSBDRkcgaW4gYWxpZ25lZCBmb3JtYXQgKi8KKyAgIHRsdlN0cnVjdC0+cGFkQnl0ZXMgPSBBTElHTkVEX1dPUkRfU0laRSAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRsdlN0cnVjdC0+bGVuZ3RoICYgKEFMSUdORURfV09SRF9TSVpFIC0gMSkpOworCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoICsgdGx2U3RydWN0LT5wYWRCeXRlcykgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19FRENBX1dNTV9BQ0JFICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX0VEQ0FfV01NX0FDQkUgIDsKKyAgIHN0ckxlbmd0aCA9IFdOSV9DRkdfRURDQV9XTUVfQUNCRV9MRU47CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0VEQ0FfV01FX0FDQkUsICh0QU5JX1U4ICopY29uZmlnRGF0YVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ckxlbmd0aCkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19FRENBX1dNRV9BQ0JFIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorICAgdGx2U3RydWN0LT5sZW5ndGggPSBzdHJMZW5ndGg7CisgICAvKiBjYWxjdWxhdGUgdGhlIHBhZCBieXRlcyB0byBoYXZlIHRoZSBDRkcgaW4gYWxpZ25lZCBmb3JtYXQgKi8KKyAgIHRsdlN0cnVjdC0+cGFkQnl0ZXMgPSBBTElHTkVEX1dPUkRfU0laRSAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRsdlN0cnVjdC0+bGVuZ3RoICYgKEFMSUdORURfV09SRF9TSVpFIC0gMSkpOworCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoICsgdGx2U3RydWN0LT5wYWRCeXRlcykgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19FRENBX1dNTV9BQ1ZJICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX0VEQ0FfV01NX0FDVk8gIDsKKyAgIHN0ckxlbmd0aCA9IFdOSV9DRkdfRURDQV9XTUVfQUNWSV9MRU47CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0VEQ0FfV01FX0FDVk8sICh0QU5JX1U4ICopY29uZmlnRGF0YVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ckxlbmd0aCkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19FRENBX1dNRV9BQ1ZJIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorICAgdGx2U3RydWN0LT5sZW5ndGggPSBzdHJMZW5ndGg7CisgICAvKiBjYWxjdWxhdGUgdGhlIHBhZCBieXRlcyB0byBoYXZlIHRoZSBDRkcgaW4gYWxpZ25lZCBmb3JtYXQgKi8KKyAgIHRsdlN0cnVjdC0+cGFkQnl0ZXMgPSBBTElHTkVEX1dPUkRfU0laRSAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRsdlN0cnVjdC0+bGVuZ3RoICYgKEFMSUdORURfV09SRF9TSVpFIC0gMSkpOworCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoICsgdGx2U3RydWN0LT5wYWRCeXRlcykgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19FRENBX1dNTV9BQ1ZPICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX0VEQ0FfV01NX0FDVkkgIDsKKyAgIHN0ckxlbmd0aCA9IFdOSV9DRkdfRURDQV9XTUVfQUNWT19MRU47CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldFN0cihwTWFjLCBXTklfQ0ZHX0VEQ0FfV01FX0FDVkksICh0QU5JX1U4ICopY29uZmlnRGF0YVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ckxlbmd0aCkgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19FRENBX1dNRV9BQ1ZPIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorICAgdGx2U3RydWN0LT5sZW5ndGggPSBzdHJMZW5ndGg7CisgICAvKiBjYWxjdWxhdGUgdGhlIHBhZCBieXRlcyB0byBoYXZlIHRoZSBDRkcgaW4gYWxpZ25lZCBmb3JtYXQgKi8KKyAgIHRsdlN0cnVjdC0+cGFkQnl0ZXMgPSBBTElHTkVEX1dPUkRfU0laRSAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRsdlN0cnVjdC0+bGVuZ3RoICYgKEFMSUdORURfV09SRF9TSVpFIC0gMSkpOworCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoICsgdGx2U3RydWN0LT5wYWRCeXRlcykgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19CQV9USFJFU0hPTERfSElHSCAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19CQV9USFJFU0hPTERfSElHSCAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19CQV9USFJFU0hPTERfSElHSCwgY29uZmlnRGF0YVZhbHVlKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfQkFfVEhSRVNIT0xEX0hJR0giKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19NQVhfQkFfQlVGRkVSUyAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19NQVhfQkFfQlVGRkVSUyAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19NQVhfQkFfQlVGRkVSUywgY29uZmlnRGF0YVZhbHVlKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfTUFYX0JBX0JVRkZFUlMiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19EWU5BTUlDX1BTX1BPTExfVkFMVUUgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX0RZTkFNSUNfUFNfUE9MTF9WQUxVRSwgY29uZmlnRGF0YVZhbHVlKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfRFlOQU1JQ19QU19QT0xMX1ZBTFVFIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpIDsgCisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfVEVMRV9CQ05fVFJBTlNfTEkgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfVEVMRV9CQ05fVFJBTlNfTEkgIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTEksIGNvbmZpZ0RhdGFWYWx1ZSkgCisgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSA7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX1RFTEVfQkNOX1RSQU5TX0xJX0lETEVfQkNOUyAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlMgIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTElfSURMRV9CQ05TLCBjb25maWdEYXRhVmFsdWUpIAorICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlMiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpIDsgCisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfVEVMRV9CQ05fTUFYX0xJICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX1RFTEVfQkNOX01BWF9MSSAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19URUxFX0JDTl9NQVhfTEksIGNvbmZpZ0RhdGFWYWx1ZSkgCisgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSSIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlMgIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJX0lETEVfQkNOUywgY29uZmlnRGF0YVZhbHVlKSAKKyAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJX0lETEVfQkNOUyIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19URUxFX0JDTl9XQUtFVVBfRU4gKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICBpZih3bGFuX2NmZ0dldEludChwTWFjLCBXTklfQ0ZHX1RFTEVfQkNOX1dBS0VVUF9FTiwgY29uZmlnRGF0YVZhbHVlKSAKKyAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfVEVMRV9CQ05fV0FLRVVQX0VOIik7CisgICAgICBnb3RvIGhhbmRsZV9mYWlsdXJlOworICAgfQorICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSA7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX0lORlJBX1NUQV9LRUVQX0FMSVZFX1BFUklPRCAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0QgIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfSU5GUkFfU1RBX0tFRVBfQUxJVkVfUEVSSU9ELCBjb25maWdEYXRhVmFsdWUpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gZVNJUl9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19JTkZSQV9TVEFfS0VFUF9BTElWRV9QRVJJT0QiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgLypRV0xBTl9IQUxfQ0ZHX1RYX1BXUl9DVFJMX0VOQUJMRSovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX1RYX1BXUl9DVFJMX0VOQUJMRSAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19UWF9QV1JfQ1RSTF9FTkFCTEUsIGNvbmZpZ0RhdGFWYWx1ZSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX1RYX1BXUl9DVFJMX0VOQUJMRSIpOworICAgICAgZ290byBoYW5kbGVfZmFpbHVyZTsKKyAgIH0KKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSA7CisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfRU5BQkxFX0NMT1NFX0xPT1AgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19FTkFCTEVfQ0xPU0VfTE9PUCAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19FTkFCTEVfQ0xPU0VfTE9PUCwgY29uZmlnRGF0YVZhbHVlKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIFdOSV9DRkdfRU5BQkxFX0NMT1NFX0xPT1AiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKyAgIC8qIFFXTEFOX0hBTF9DRkdfQVBfS0VFUEFMSVZFX1RJTUVPVVQgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19BUF9LRUVQQUxJVkVfVElNRU9VVCAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhVmFsdWUgKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19BUF9LRUVQX0FMSVZFX1RJTUVPVVQiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKyAgIC8qIFFXTEFOX0hBTF9DRkdfR09fS0VFUEFMSVZFX1RJTUVPVVQgICAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19HT19LRUVQQUxJVkVfVElNRU9VVCAgOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgaWYod2xhbl9jZmdHZXRJbnQocE1hYywgV05JX0NGR19HT19LRUVQX0FMSVZFX1RJTUVPVVQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdEYXRhVmFsdWUgKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgV05JX0NGR19HT19LRUVQX0FMSVZFX1RJTUVPVVQiKTsKKyAgICAgIGdvdG8gaGFuZGxlX2ZhaWx1cmU7CisgICB9CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgLyogW0NPRVhdIHN0cmljdGx5IHNwZWFraW5nLCB0aGUgQ29leCBwYXJhbWV0ZXJzIGFyZSBub3QgcGFydCBvZiB0aGUgV0xBTl9DRkdfRklMRSBiaW5hcnksIAorICAgKiBidXQgYXJlIGZyb20gdGhlIFdMQU5fSU5JX0ZJTEUgZmlsZS4gIEhvd2V2ZXIsIHRoaXMgaXMgdGhlIG9ubHkgcGFyYW1ldGVyIGRvd25sb2FkIHJvdXRpbmUKKyAgICogaW50byBGVywgc28gdGhlIHBhcmFtZXRlcnMgYXJlIGFkZGVkIGhlcmUuCisgICAqLworCisgICAvKiBbQ09FWF0gUVdMQU5fSEFMX0NGR19CVENfRVhFQ1VUSU9OX01PREUgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfQlRDX0VYRUNVVElPTl9NT0RFICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICAqY29uZmlnRGF0YVZhbHVlID0gcE1hYy0+YnRjLmJ0Y0NvbmZpZy5idGNFeGVjdXRpb25Nb2RlOyAKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgLyogW0NPRVhdIFFXTEFOX0hBTF9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0sgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfQlRDX0RIQ1BfQlRfU0xPVFNfVE9fQkxPQ0sgIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgICpjb25maWdEYXRhVmFsdWUgPSBwTWFjLT5idGMuYnRjQ29uZmlnLmJ0Y0NvbnNCdFNsb3RzVG9CbG9ja0R1cmluZ0RoY3A7IAorICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSA7IAorCisgICAvKiBbQ09FWF0gUVdMQU5fSEFMX0NGR19CVENfQTJEUF9ESENQX0JUX1NVQl9JTlRFUlZBTFMgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfQlRDX0EyRFBfREhDUF9CVF9TVUJfSU5URVJWQUxTICA7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICAqY29uZmlnRGF0YVZhbHVlID0gcE1hYy0+YnRjLmJ0Y0NvbmZpZy5idGNBMkRQQnRTdWJJbnRlcnZhbHNEdXJpbmdEaGNwOyAKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgLyogW0NPRVhdIFFXTEFOX0hBTF9DRkdfV0NOU1NfQVBJX1ZFUlNJT04gKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfV0NOU1NfQVBJX1ZFUlNJT04gIDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgIFdESV9HZXRXY25zc0NvbXBpbGVkQXBpVmVyc2lvbigmd2Nuc3NDb21waWxlZEFwaVZlcnNpb24pOworICAgKmNvbmZpZ0RhdGFWYWx1ZSA9IFdMQU5fSEFMX0NPTlNUUlVDVF9BUElfVkVSU0lPTih3Y25zc0NvbXBpbGVkQXBpVmVyc2lvbi5tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Nuc3NDb21waWxlZEFwaVZlcnNpb24ubWlub3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjbnNzQ29tcGlsZWRBcGlWZXJzaW9uLnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjbnNzQ29tcGlsZWRBcGlWZXJzaW9uLnJldmlzaW9uKTsKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkgOyAKKworICAgd2RpU3RhcnRQYXJhbXMtPnVzQ29uZmlnQnVmZmVyTGVuID0gKHRBTklfVTggKil0bHZTdHJ1Y3QgLSB0bHZTdHJ1Y3RTdGFydCA7CisKKyNpZmRlZiBXTEFOX0RFQlVHCisgICB7CisgICAgICBpbnQgaTsKKworICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICIqKioqKiogRHVtcGluZyBDRkcgVExWICoqKioqICIpOworICAgICAgZm9yIChpPTA7IChpKzcpIDwgd2RpU3RhcnRQYXJhbXMtPnVzQ29uZmlnQnVmZmVyTGVuOyBpKz04KQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCIsIAorICAgICAgICAgICAgICAgICAgICB0bHZTdHJ1Y3RTdGFydFtpXSwKKyAgICAgICAgICAgICAgICAgICAgdGx2U3RydWN0U3RhcnRbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgdGx2U3RydWN0U3RhcnRbaSsyXSwKKyAgICAgICAgICAgICAgICAgICAgdGx2U3RydWN0U3RhcnRbaSszXSwKKyAgICAgICAgICAgICAgICAgICAgdGx2U3RydWN0U3RhcnRbaSs0XSwKKyAgICAgICAgICAgICAgICAgICAgdGx2U3RydWN0U3RhcnRbaSs1XSwKKyAgICAgICAgICAgICAgICAgICAgdGx2U3RydWN0U3RhcnRbaSs2XSwKKyAgICAgICAgICAgICAgICAgICAgdGx2U3RydWN0U3RhcnRbaSs3XSk7CisgICAgICB9CisgICAgICAvKiBEdW1wIHRoZSBieXRlcyBpbiB0aGUgbGFzdCBsaW5lKi8KKyAgICAgIGZvciAoOyBpIDwgd2RpU3RhcnRQYXJhbXMtPnVzQ29uZmlnQnVmZmVyTGVuOyBpKyspCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAiJTAyeCAiLHRsdlN0cnVjdFN0YXJ0W2ldKTsKKyAgICAgIH0KKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqICIpOworICAgfQorI2VuZGlmCisKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1MgOworCitoYW5kbGVfZmFpbHVyZToKKyAgIHZvc19tZW1fZnJlZShjb25maWdQYXJhbSk7CisgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX3dkaUNvbXBsZXRlQ0IKKyAqIGNhbGwgdGhlIHZvc3MgY2FsbCBiYWNrIGZ1bmN0aW9uCisgKi8gCit2b2lkIFdEQV9zdG9wQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZfUFZPSURfdCAqcFZvc0NvbnRleHQpCit7CisgICB0V0RBX0NiQ29udGV4dCAqd2RhQ29udGV4dD0gKHRXREFfQ2JDb250ZXh0ICopVk9TX0dFVF9XREFfQ1RYVChwVm9zQ29udGV4dCk7CisKKyAgIGlmIChOVUxMID09IHdkYUNvbnRleHQpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogSW52b2tlZCB3aXRoIGludmFsaWQgd2RhQ29udGV4dCIsIF9fRlVOQ1RJT05fXyApOworICAgICAgcmV0dXJuIDsKKyAgIH0KKworICAgLyogZnJlZSB0aGUgY29uZmlnIHN0cnVjdHVyZSAqLworICAgaWYod2RhQ29udGV4dC0+d2RhV2RpQXBpTXNnUGFyYW0gIT0gTlVMTCkKKyAgIHsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGFDb250ZXh0LT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB3ZGFDb250ZXh0LT53ZGFXZGlBcGlNc2dQYXJhbSA9IE5VTEw7CisgICB9CisKKyAgIGlmKFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldESSBzdG9wIGNhbGxiYWNrIHJldHVybmVkIGZhaWx1cmUiICk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHdkYUNvbnRleHQtPndkYVN0YXRlID0gV0RBX1NUT1BfU1RBVEU7CisgICB9CisKKyAgIC8qIEluZGljYXRlIFZPU1MgYWJvdXQgdGhlIHN0YXJ0IGNvbXBsZXRlICovCisgICB2b3NfV0RBQ29tcGxldGVfY2JhY2socFZvc0NvbnRleHQpOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9zdG9wCisgKiBjYWxsIFdESV9zdG9wCisgKi8gCisKK1ZPU19TVEFUVVMgV0RBX3N0b3Aodl9QVk9JRF90IHBWb3NDb250ZXh0LCB0QU5JX1U4IHJlYXNvbikKK3sKKyAgIFdESV9TdGF0dXMgd2RpU3RhdHVzOworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICBXRElfU3RvcFJlcVBhcmFtc1R5cGUgKndkaVN0b3BSZXE7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKVZPU19HRVRfV0RBX0NUWFQocFZvc0NvbnRleHQpOworCisgICBpZiAoTlVMTCA9PSBwV0RBKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEludm9rZWQgd2l0aCBpbnZhbGlkIHBXREEiLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIEZUTSBtb2RlIHN0YXkgU1RBUlRfU1RBVEUgKi8KKyAgIGlmKCAoV0RBX1JFQURZX1NUQVRFICE9IHBXREEtPndkYVN0YXRlKSAmJgorICAgICAgIChXREFfSU5JVF9TVEFURSAhPSBwV0RBLT53ZGFTdGF0ZSkgJiYKKyAgICAgICAoV0RBX1NUQVJUX1NUQVRFICE9IHBXREEtPndkYVN0YXRlKSApCisgICB7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgfQorCisgICB3ZGlTdG9wUmVxID0gKFdESV9TdG9wUmVxUGFyYW1zVHlwZSAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc19tZW1fbWFsbG9jKHNpemVvZihXRElfU3RvcFJlcVBhcmFtc1R5cGUpKTsKKyAgIGlmKE5VTEwgPT0gd2RpU3RvcFJlcSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB3ZGlTdG9wUmVxLT53ZGlTdG9wUmVhc29uID0gcmVhc29uOworICAgd2RpU3RvcFJlcS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworCisgICBpZihOVUxMICE9IHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOndkYVdkaUFwaU1zZ1BhcmFtIGlzIG5vdCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpU3RvcFJlcSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIGlmICggZURSSVZFUl9UWVBFX01GRyAhPSBwV0RBLT5kcml2ZXJNb2RlICkKKyAgIHsKKyAgICAgIHdkYURlc3Ryb3lUaW1lcnMocFdEQSk7CisgICB9CisgICBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2X1BWT0lEX3QgKil3ZGlTdG9wUmVxOworCisgICAvKiBjYWxsIFdESSBzdG9wICovCisgICB3ZGlTdGF0dXMgPSBXRElfU3RvcCh3ZGlTdG9wUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9TdG9wUnNwQ2IpV0RBX3N0b3BDYWxsYmFjaywgcFZvc0NvbnRleHQpOworCisgICBpZiAoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHdkaVN0YXR1cykgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBpbiBXREEgU3RvcCIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSA9IE5VTEw7CisgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfY2xvc2UKKyAqIGNhbGwgV0RJX2Nsb3NlIGFuZCBmcmVlIHRoZSBXREEgY29udGV4dAorICovIAorVk9TX1NUQVRVUyBXREFfY2xvc2Uodl9QVk9JRF90IHBWb3NDb250ZXh0KQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1M7CisgICB0V0RBX0NiQ29udGV4dCAqd2RhQ29udGV4dD0gKHRXREFfQ2JDb250ZXh0ICopVk9TX0dFVF9XREFfQ1RYVChwVm9zQ29udGV4dCk7CisKKyAgIGlmIChOVUxMID09IHdkYUNvbnRleHQpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogSW52b2tlZCB3aXRoIGludmFsaWQgd2RhQ29udGV4dCIsIF9fRlVOQ1RJT05fXyApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBpZigoV0RBX0lOSVRfU1RBVEUgIT0gd2RhQ29udGV4dC0+d2RhU3RhdGUpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdEQV9TVE9QX1NUQVRFICE9IHdkYUNvbnRleHQtPndkYVN0YXRlKSkKKyAgIHsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICB9CisKKyAgIC8qY2FsbCBXREkgY2xvc2UqLworICAgc3RhdHVzID0gV0RJX0Nsb3NlKCk7CisgICBpZiAoIHN0YXR1cyAhPSBXRElfU1RBVFVTX1NVQ0NFU1MgKQorICAgeworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHdkYUNvbnRleHQtPndkYVN0YXRlID0gV0RBX0NMT1NFX1NUQVRFOworCisgICAvKiBEZXN0cm95IHRoZSBldmVudHMgKi8KKyAgIHN0YXR1cyA9IHZvc19ldmVudF9kZXN0cm95KCZ3ZGFDb250ZXh0LT53ZGFXZGlFdmVudCk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXREkgU3luYyBFdmVudCBkZXN0cm95IGZhaWxlZCAtIHN0YXR1cyA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHN0YXR1cyA9IHZvc19ldmVudF9kZXN0cm95KCZ3ZGFDb250ZXh0LT50eEZyYW1lRXZlbnQpOworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIlZPUyBFdmVudCBkZXN0cm95IGZhaWxlZCAtIHN0YXR1cyA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICBzdGF0dXMgPSB2b3NfZXZlbnRfZGVzdHJveSgmd2RhQ29udGV4dC0+c3VzcGVuZERhdGFUeEV2ZW50KTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJWT1MgRXZlbnQgZGVzdHJveSBmYWlsZWQgLSBzdGF0dXMgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgc3RhdHVzID0gdm9zX2V2ZW50X2Rlc3Ryb3koJndkYUNvbnRleHQtPndhaXRPbldkaUluZGljYXRpb25DYWxsQmFjayk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiVk9TIEV2ZW50IGRlc3Ryb3kgZmFpbGVkIC0gc3RhdHVzID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLyogZnJlZSBXREEgY29udGV4dCAqLworICAgc3RhdHVzID0gdm9zX2ZyZWVfY29udGV4dChwVm9zQ29udGV4dCwgVk9TX01PRFVMRV9JRF9XREEsIHdkYUNvbnRleHQpOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBpbiBXREEgY2xvc2UgIiApOworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Jc1djbnNzV2xhbkNvbXBpbGVkVmVyc2lvbkdyZWF0ZXJUaGFuT3JFcXVhbAorICogcmV0dXJucyAxIGlmIHRoZSBjb21waWxlZCB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgaW5wdXQgdmVyc2lvbgorICovIAorCit1aW50OCBXREFfSXNXY25zc1dsYW5Db21waWxlZFZlcnNpb25HcmVhdGVyVGhhbk9yRXF1YWwodWludDggbWFqb3IsIHVpbnQ4IG1pbm9yLCB1aW50OCB2ZXJzaW9uLCB1aW50OCByZXZpc2lvbikKK3sgICAgCisgICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgdl9DT05URVhUX3Qgdm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9XREEsIE5VTEwpOworICAgIHRTaXJWZXJzaW9uVHlwZSBjb21waWxlZFZlcnNpb247CisKKyAgICBzdGF0dXMgPSBXREFfR2V0V2Nuc3NXbGFuQ29tcGlsZWRWZXJzaW9uKHZvc0NvbnRleHQsICZjb21waWxlZFZlcnNpb24pOworCisgICAgaWYgKChjb21waWxlZFZlcnNpb24ubWFqb3IgPiBtYWpvcikgfHwgKChjb21waWxlZFZlcnNpb24ubWFqb3IgPT0gbWFqb3IpJiYgKGNvbXBpbGVkVmVyc2lvbi5taW5vciA+IG1pbm9yKSkgfHwKKyAgICAgICAgKChjb21waWxlZFZlcnNpb24ubWFqb3IgPT0gbWFqb3IpJiYgKGNvbXBpbGVkVmVyc2lvbi5taW5vciA9PSBtaW5vcikgJiYoY29tcGlsZWRWZXJzaW9uLnZlcnNpb24gPiB2ZXJzaW9uKSkgfHwKKyAgICAgICAgKChjb21waWxlZFZlcnNpb24ubWFqb3IgPT0gbWFqb3IpJiYgKGNvbXBpbGVkVmVyc2lvbi5taW5vciA9PSBtaW5vcikgJiYoY29tcGlsZWRWZXJzaW9uLnZlcnNpb24gPT0gdmVyc2lvbikgJiYKKyAgICAgICAgKGNvbXBpbGVkVmVyc2lvbi5yZXZpc2lvbiA+PSByZXZpc2lvbikpKSAgICAgICAgCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0lzV2Nuc3NXbGFuUmVwb3J0ZWRWZXJzaW9uR3JlYXRlclRoYW5PckVxdWFsCisgKiByZXR1cm5zIDEgaWYgdGhlIGNvbXBpbGVkIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBpbnB1dCB2ZXJzaW9uCisgKi8gCisKK3VpbnQ4IFdEQV9Jc1djbnNzV2xhblJlcG9ydGVkVmVyc2lvbkdyZWF0ZXJUaGFuT3JFcXVhbCh1aW50OCBtYWpvciwgdWludDggbWlub3IsIHVpbnQ4IHZlcnNpb24sIHVpbnQ4IHJldmlzaW9uKQoreyAgICAKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB2X0NPTlRFWFRfdCB2b3NDb250ZXh0ID0gdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1dEQSwgTlVMTCk7CisgICAgdFNpclZlcnNpb25UeXBlIHJlcG9ydGVkVmVyc2lvbjsKKworICAgIHN0YXR1cyA9IFdEQV9HZXRXY25zc1dsYW5SZXBvcnRlZFZlcnNpb24odm9zQ29udGV4dCwgJnJlcG9ydGVkVmVyc2lvbik7CisKKyAgICBpZiAoKHJlcG9ydGVkVmVyc2lvbi5tYWpvciA+IG1ham9yKSB8fCAoKHJlcG9ydGVkVmVyc2lvbi5tYWpvciA9PSBtYWpvcikmJiAocmVwb3J0ZWRWZXJzaW9uLm1pbm9yID4gbWlub3IpKSB8fAorICAgICAgICAoKHJlcG9ydGVkVmVyc2lvbi5tYWpvciA9PSBtYWpvcikmJiAocmVwb3J0ZWRWZXJzaW9uLm1pbm9yID09IG1pbm9yKSAmJihyZXBvcnRlZFZlcnNpb24udmVyc2lvbiA+IHZlcnNpb24pKSB8fAorICAgICAgICAoKHJlcG9ydGVkVmVyc2lvbi5tYWpvciA9PSBtYWpvcikmJiAocmVwb3J0ZWRWZXJzaW9uLm1pbm9yID09IG1pbm9yKSAmJihyZXBvcnRlZFZlcnNpb24udmVyc2lvbiA9PSB2ZXJzaW9uKSAmJgorICAgICAgICAocmVwb3J0ZWRWZXJzaW9uLnJldmlzaW9uID49IHJldmlzaW9uKSkpICAgICAgICAKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfR2V0V2Nuc3NXbGFuQ29tcGlsZWRWZXJzaW9uCisgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBXQ05TUyBXTEFOIEFQSSB3aXRoIHdoaWNoIHRoZSBIT1NUCisgKiBkZXZpY2UgZHJpdmVyIHdhcyBjb21waWxlZAorICovIAorVk9TX1NUQVRVUyBXREFfR2V0V2Nuc3NXbGFuQ29tcGlsZWRWZXJzaW9uKHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyVmVyc2lvblR5cGUgKnBWZXJzaW9uKQoreworICAgdFdEQV9DYkNvbnRleHQgKnBXREE7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzOiBFbnRlcmVkIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYgKChOVUxMID09IHB2b3NHQ3R4KSB8fCAoTlVMTCA9PSBwVmVyc2lvbikpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IEludm9rZWQgd2l0aCBpbnZhbGlkIHBhcmFtZXRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopVk9TX0dFVF9XREFfQ1RYVChwdm9zR0N0eCk7CisgICBpZiAoTlVMTCA9PSBwV0RBICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBXREEgY29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAqcFZlcnNpb24gPSBwV0RBLT53Y25zc1dsYW5Db21waWxlZFZlcnNpb247CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9HZXRXY25zc1dsYW5SZXBvcnRlZFZlcnNpb24KKyAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIFdDTlNTIFdMQU4gQVBJIHdpdGggd2hpY2ggdGhlIFdDTlNTCisgKiBkZXZpY2UgZHJpdmVyIHdhcyBjb21waWxlZAorICovIAorVk9TX1NUQVRVUyBXREFfR2V0V2Nuc3NXbGFuUmVwb3J0ZWRWZXJzaW9uKHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyVmVyc2lvblR5cGUgKnBWZXJzaW9uKQoreworICAgdFdEQV9DYkNvbnRleHQgKnBXREE7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzOiBFbnRlcmVkIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYgKChOVUxMID09IHB2b3NHQ3R4KSB8fCAoTlVMTCA9PSBwVmVyc2lvbikpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IEludm9rZWQgd2l0aCBpbnZhbGlkIHBhcmFtZXRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopVk9TX0dFVF9XREFfQ1RYVChwdm9zR0N0eCk7CisgICBpZiAoTlVMTCA9PSBwV0RBICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBXREEgY29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAqcFZlcnNpb24gPSBwV0RBLT53Y25zc1dsYW5SZXBvcnRlZFZlcnNpb247CisgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9HZXRXY25zc1NvZnR3YXJlVmVyc2lvbgorICogUmV0dXJucyB0aGUgV0NOU1MgU29mdHdhcmUgdmVyc2lvbiBzdHJpbmcKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX0dldFdjbnNzU29mdHdhcmVWZXJzaW9uKHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggKnBWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMzIgdmVyc2lvbkJ1ZmZlclNpemUpCit7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQTsKKworICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiJXM6IEVudGVyZWQiLCBfX0ZVTkNUSU9OX18pOworCisgICBpZiAoKE5VTEwgPT0gcHZvc0dDdHgpIHx8IChOVUxMID09IHBWZXJzaW9uKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogSW52b2tlZCB3aXRoIGludmFsaWQgcGFyYW1ldGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilWT1NfR0VUX1dEQV9DVFhUKHB2b3NHQ3R4KTsKKyAgIGlmIChOVUxMID09IHBXREEgKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFdEQSBjb250ZXh0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHdwYWxNZW1vcnlDb3B5KHBWZXJzaW9uLCBwV0RBLT53Y25zc1NvZnR3YXJlVmVyc2lvblN0cmluZywgdmVyc2lvbkJ1ZmZlclNpemUpOworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfR2V0V2Nuc3NIYXJkd2FyZVZlcnNpb24KKyAqIFJldHVybnMgdGhlIFdDTlNTIEhhcmR3YXJlIHZlcnNpb24gc3RyaW5nCisgKi8gCitWT1NfU1RBVFVTIFdEQV9HZXRXY25zc0hhcmR3YXJlVmVyc2lvbih2X1BWT0lEX3QgcHZvc0dDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1U4ICpwVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTMyIHZlcnNpb25CdWZmZXJTaXplKQoreworICAgdFdEQV9DYkNvbnRleHQgKnBXREE7CisKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzOiBFbnRlcmVkIiwgX19GVU5DVElPTl9fKTsKKworICAgaWYgKChOVUxMID09IHB2b3NHQ3R4KSB8fCAoTlVMTCA9PSBwVmVyc2lvbikpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IEludm9rZWQgd2l0aCBpbnZhbGlkIHBhcmFtZXRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopVk9TX0dFVF9XREFfQ1RYVChwdm9zR0N0eCk7CisgICBpZiAoTlVMTCA9PSBwV0RBICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBXREEgY29udGV4dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICB3cGFsTWVtb3J5Q29weShwVmVyc2lvbiwgcFdEQS0+d2Nuc3NIYXJkd2FyZVZlcnNpb25TdHJpbmcsIHZlcnNpb25CdWZmZXJTaXplKTsKKyAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1duaUNmZ0RubGQKKyAqIFRyaWdnZXIgQ0ZHIERvd25sb2FkCisgKi8gCitWT1NfU1RBVFVTIFdEQV9XbmlDZmdEbmxkKHRXREFfQ2JDb250ZXh0ICpwV0RBKSAKK3sKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwgKVZPU19HRVRfTUFDX0NUWFQocFdEQS0+cFZvc0NvbnRleHQpOworCisgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworCisgICB2X1ZPSURfdCAqcEZpbGVJbWFnZSA9IE5VTEw7CisgICB2X1NJWkVfdCBjYkZpbGVJbWFnZVNpemUgPSAwOworCisgICB2X1ZPSURfdCAqcENmZ0JpbmFyeSA9IE5VTEw7CisgICB2X1NJWkVfdCBjYkNmZ0JpbmFyeVNpemUgPSAwOworICAgCisgICB2X0JPT0xfdCBiU3RhdHVzID0gVk9TX0ZBTFNFOworCisgICBpZiAoTlVMTCA9PSBwTWFjICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZva2VkIHdpdGggaW52YWxpZCBNQUMgY29udGV4dCAiLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBDRkcgQmluYXJ5Li4uICovCisgICB2b3NTdGF0dXMgPSB2b3NfZ2V0X2JpbmFyeV9ibG9iKCBWT1NfQklOQVJZX0lEX0NPTkZJRywgTlVMTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JGaWxlSW1hZ2VTaXplICk7CisgICBpZiAoIFZPU19TVEFUVVNfRV9OT01FTSAhPSB2b3NTdGF0dXMgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NZUywgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiRXJyb3Igb2J0YWluaW5nIGJpbmFyeSBzaXplIiApOworICAgICAgZ290byBmYWlsOworICAgfQorCisgICAvLyBtYWxsb2MgYSBidWZmZXIgdG8gcmVhZCBpbiB0aGUgQ29uZmlndXJhdGlvbiBiaW5hcnkgZmlsZS4KKyAgIHBGaWxlSW1hZ2UgPSB2b3NfbWVtX21hbGxvYyggY2JGaWxlSW1hZ2VTaXplICk7CisKKyAgIGlmICggTlVMTCA9PSBwRmlsZUltYWdlICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBDRkcgYmluYXJ5IFtzaXplPSAlZCBieXRlc10iLAorICAgICAgICAgICAgICAgICBjYkZpbGVJbWFnZVNpemUgKTsKKworICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX05PTUVNOworICAgICAgZ290byBmYWlsOworICAgfQorICAgCisgICAvKiBHZXQgdGhlIGVudGlyZSBDRkcgZmlsZSBpbWFnZS4uLiAqLworICAgdm9zU3RhdHVzID0gdm9zX2dldF9iaW5hcnlfYmxvYiggVk9TX0JJTkFSWV9JRF9DT05GSUcsIHBGaWxlSW1hZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNiRmlsZUltYWdlU2l6ZSApOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKCB2b3NTdGF0dXMgKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiRXJyb3I6IENhbm5vdCByZXRyaWV2ZSBDRkcgZmlsZSBpbWFnZSBmcm9tIHZPU1MuIFtzaXplPSAlZCBieXRlc10iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiRmlsZUltYWdlU2l6ZSApOworICAgICAgZ290byBmYWlsOworICAgfQorICAgCisgICAvKiAKKyAgICAqIFZhbGlkYXRlIHRoZSBiaW5hcnkgaW1hZ2UuICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcG9pbnRlciAKKyAgICAqIGFuZCBsZW5ndGggd2hlcmUgdGhlIENGRyBiaW5hcnkgaXMgbG9jYXRlZCB3aXRoaW4gdGhlIGJpbmFyeSBpbWFnZSBmaWxlLgorICAgICovCisgICBiU3RhdHVzID0gc3lzX3ZhbGlkYXRlU3RhQ29uZmlnKCBwRmlsZUltYWdlLCBjYkZpbGVJbWFnZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2ZnQmluYXJ5LCAmY2JDZmdCaW5hcnlTaXplICk7CisgICBpZiAoIFZPU19GQUxTRSA9PSBiU3RhdHVzICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkVycm9yOiBDYW5ub3QgZmluZCBTVEEgQ0ZHIGluIGJpbmFyeSBpbWFnZSBmaWxlIiApOworICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICBnb3RvIGZhaWw7CisgICB9CisKKyAgIC8qCisgICAgKiBUT0RPOiBjYWxsIHRoZSBjb25maWcgZG93bmxvYWQgZnVuY3Rpb24gCisgICAgKiBmb3Igbm93IGNhbGxpbmcgdGhlIGV4aXN0aW5nIGNmZyBkb3dubG9hZCBBUEkgCisgICAgKi8KKyAgIHByb2Nlc3NDZmdEb3dubG9hZFJlcShwTWFjLGNiQ2ZnQmluYXJ5U2l6ZSxwQ2ZnQmluYXJ5KTsKKworICAgaWYoIHBGaWxlSW1hZ2UgIT0gTlVMTCApCisgICB7CisgICAgICB2b3NfbWVtX2ZyZWUoIHBGaWxlSW1hZ2UgKTsKKyAgIH0KKyAgIHJldHVybiB2b3NTdGF0dXM7CisgICAKK2ZhaWw6CisgICBpZihwQ2ZnQmluYXJ5ICE9IE5VTEwpCisgICAgICB2b3NfbWVtX2ZyZWUoIHBGaWxlSW1hZ2UgKTsKKyAgIAorICAgcmV0dXJuIHZvc1N0YXR1czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdESSBpbnRlcmZhY2UgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBGVU5DVElPTjogV0RBX3N1c3BlbmREYXRhVHhDYWxsYmFjaworICogY2FsbCBiYWNrIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIFRMIGFmdGVyIHN1c3BlbmQgVHJhbnNtaXNzaW9uCisgKi8gCitWT1NfU1RBVFVTIFdEQV9TdXNwZW5kRGF0YVR4Q2FsbGJhY2soIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QqICAgICAgICB1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTICAgICB2b3NTdGF0dXMpCit7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKVZPU19HRVRfV0RBX0NUWFQocHZvc0dDdHgpOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6IEVudGVyZWQgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYgKE5VTEwgPT0gcFdEQSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogSW52b2tlZCB3aXRoIGludmFsaWQgV0RBIGNvbnRleHQgIiwgX19GVU5DVElPTl9fICk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgaWYoVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpIAorICAgeworICAgICAgcFdEQS0+dHhTdGF0dXMgPSBXREFfVExfVFhfU1VTUEVORF9TVUNDRVNTOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcFdEQS0+dHhTdGF0dXMgPSBXREFfVExfVFhfU1VTUEVORF9GQUlMVVJFOyAgICAgICAgCisgICB9CisKKyAgIC8qIFRyaWdnZXIgdGhlIGV2ZW50IHRvIGJyaW5nIHRoZSBXREEgVEwgc3VzcGVuZCBmdW5jdGlvbiB0byBjb21lIAorICAgICogb3V0IG9mIHdhaXQqLworICAgdm9zU3RhdHVzID0gdm9zX2V2ZW50X3NldCgmcFdEQS0+c3VzcGVuZERhdGFUeEV2ZW50KTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgIk5FVyBWT1MgRXZlbnQgU2V0IGZhaWxlZCAtIHN0YXR1cyA9ICVkIFxuIiwgdm9zU3RhdHVzKTsKKyAgIH0KKworICAgLyogSWYgVEwgc3VzcGVuZGVkIGhhZCB0aW1lZG91dCBiZWZvcmUgdGhpcyBjYWxsYmFjayB3YXMgY2FsbGVkLCByZXN1bWUgYmFjayAKKyAgICogVEwuKi8KKyAgIGlmIChwV0RBLT50eFN1c3BlbmRUaW1lZE91dCkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiTGF0ZSBUTFN1c3BlbmRDYWxsYmFjaywgcmVzdW1pbmcgVEwgYmFjayBhZ2FpblxuIik7CisgICAgICBXREFfUmVzdW1lRGF0YVR4KHBXREEpOworICAgICAgcFdEQS0+dHhTdXNwZW5kVGltZWRPdXQgPSBGQUxTRTsKKyAgIH0KKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfc3VzcGVuZERhdGFUeAorICogVXBkYXRlIFRMIHRvIHN1c3BlbmQgdGhlIGRhdGEgVHJhbnNtaXNzaW9uCisgKi8gCitWT1NfU1RBVFVTIFdEQV9TdXNwZW5kRGF0YVR4KHRXREFfQ2JDb250ZXh0ICpwV0RBKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIHRBTklfVTggZXZlbnRJZHggPSAwOworICAgdEFOSV9VOCB1Y1NUQUlkID0gMDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBFbnRlcmVkICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHBXREEtPnR4U3RhdHVzID0gV0RBX1RMX1RYX1NVU1BFTkRfRkFJTFVSRTsKKworICAgaWYgKHBXREEtPnR4U3VzcGVuZFRpbWVkT3V0KSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJUTCBzdXNwZW5kIHRpbWVkb3V0IHByZXZpb3VzbHksIENCIG5vdCBjYWxsZWQgeWV0XG4iKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgLyogUmVzZXQgdGhlIGV2ZW50IHRvIGJlIG5vdCBzaWduYWxsZWQgKi8KKyAgIHN0YXR1cyA9IHZvc19ldmVudF9yZXNldCgmcFdEQS0+c3VzcGVuZERhdGFUeEV2ZW50KTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZPUyBFdmVudCByZXNldCBmYWlsZWQgLSBzdGF0dXMgPSAlZFxuIixzdGF0dXMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKkluZGljYXRlIFRMIHRvIHN1c3BlbmQgdHJhbnNtaXNzaW9uIGZvciBhbGwgU3RhIElkICovCisgICB1Y1NUQUlkID0gV0xBTl9BTExfU1RBOworICAgc3RhdHVzID0gV0xBTlRMX1N1c3BlbmREYXRhVHgocFdEQS0+cFZvc0NvbnRleHQsICZ1Y1NUQUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RBX1N1c3BlbmREYXRhVHhDYWxsYmFjayk7CisgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQorICAgeworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgLyogV2FpdCBmb3IgdGhlIGV2ZW50IHRvIGJlIHNldCBieSB0aGUgVEwsIHRvIGdldCB0aGUgcmVzcG9uc2Ugb2YgCisgICAgKiBzdXNwZW5kaW5nIHRoZSBUWCBxdWV1ZXMsIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHNldCBieSB0aGUgQ2FsbGJhY2sgCisgICAgKiBmdW5jdGlvbiBjYWxsZWQgYnkgVEwqLworICAgc3RhdHVzID0gdm9zX3dhaXRfZXZlbnRzKCZwV0RBLT5zdXNwZW5kRGF0YVR4RXZlbnQsIDEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfVExfU1VTUEVORF9USU1FT1VULCAmZXZlbnRJZHgpOworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgIiVzOiBTdGF0dXMgJWQgd2hlbiB3YWl0aW5nIGZvciBTdXNwZW5kIERhdGEgVFggRXZlbnQiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisgICAgICAvKiBTZXQgdGhpcyBmbGFnIHRvIHRydWUgd2hlbiBUTCBzdXNwZW5kIHRpbWVzIG91dCwgc28gdGhhdCB3aGVuIFRMIAorICAgICAgICogc3VzcGVuZCBldmVudHVhbGx5IGhhcHBlbnMgYW5kIGNhbGxzIHRoZSBjYWxsYmFjaywgVEwgY2FuIGJlIHJlc3VtZWQgCisgICAgICAgKiByaWdodCBhd2F5IGJ5IGxvb2tpbmcgYXQgdGhpcyBmbGFnIHdoZW4gdHJ1ZS4qLworICAgICAgcFdEQS0+dHhTdXNwZW5kVGltZWRPdXQgPSBUUlVFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcFdEQS0+dHhTdXNwZW5kVGltZWRPdXQgPSBGQUxTRTsKKyAgIH0KKworICAgaWYoV0RBX1RMX1RYX1NVU1BFTkRfU1VDQ0VTUyA9PSBwV0RBLT50eFN0YXR1cykKKyAgIHsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfcmVzdW1lRGF0YVR4CisgKiBVcGRhdGUgVEwgdG8gcmVzdW1lIHRoZSBkYXRhIFRyYW5zbWlzc2lvbgorICovIAorVk9TX1NUQVRVUyBXREFfUmVzdW1lRGF0YVR4KHRXREFfQ2JDb250ZXh0ICpwV0RBKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB0QU5JX1U4IHVjU1RBSWQgPSAwOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6IEVudGVyZWQgIiAsX19GVU5DVElPTl9fKTsKKyAgIHVjU1RBSWQgPSBXTEFOX0FMTF9TVEE7CisgICBzdGF0dXMgPSBXTEFOVExfUmVzdW1lRGF0YVR4KHBXREEtPnBWb3NDb250ZXh0LCAmdWNTVEFJZCk7CisgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Jbml0U2NhblJlcUNhbGxiYWNrCisgKiBUcmlnZ2VyIEluaXQgU0NBTiBjYWxsYmFjaworICovIAordm9pZCBXREFfSW5pdFNjYW5SZXFDYWxsYmFjayhXRElfU3RhdHVzIHdkaVN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7IAorICAgdFdEQV9DYkNvbnRleHQgKnBXREE7IAorICAgdEluaXRTY2FuUGFyYW1zICpwV0RBX1NjYW5QYXJhbSA7CisgICBWT1NfU1RBVFVTICAgICAgc3RhdHVzOyAgICAgIAorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIHBXREFfU2NhblBhcmFtID0gKHRJbml0U2NhblBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtOworCisgICBpZihOVUxMID09IHBXREFfU2NhblBhcmFtKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIiVzOiBwV0RBX1NjYW5QYXJhbSByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKworICAgaWYoV0RJX1NUQVRVU19TVUNDRVNTICE9IHdkaVN0YXR1cykKKyAgIHsKKyAgICAgIHN0YXR1cyA9IFdEQV9SZXN1bWVEYXRhVHgocFdEQSkgOworCisgICAgICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBlcnJvciBpbiBSZXN1bWUgVHggIiwgX19GVU5DVElPTl9fICk7CisgICAgICB9CisgICB9CisKKyAgIC8qIGZyZWUgV0RJIGNvbW1hbmQgYnVmZmVyICovCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICAKKyAgIC8qIGFzc2lnbiBzdGF0dXMgdG8gc2NhbiBwYXJhbXMgKi8KKyAgIHBXREFfU2NhblBhcmFtLT5zdGF0dXMgPSBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHdkaVN0YXR1cykgOworCisgICAvKiBzZW5kIFNDQU4gUlNQIG1lc3NhZ2UgYmFjayB0byBQRSAqLworICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX0lOSVRfU0NBTl9SU1AsICh2b2lkICopcFdEQV9TY2FuUGFyYW0sIDApIDsKKworICAgcmV0dXJuIDsKK30KKyAgCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzSW5pdFNjYW5SZXEKKyAqIFRyaWdnZXIgSW5pdCBTQ0FOIGluIERBTAorICovIAorVk9TX1NUQVRVUyAgV0RBX1Byb2Nlc3NJbml0U2NhblJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJbml0U2NhblBhcmFtcyAqaW5pdFNjYW5QYXJhbXMpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICBXRElfSW5pdFNjYW5SZXFQYXJhbXNUeXBlICp3ZGlJbml0U2NhblBhcmFtID0gCisgICAgICAgICAgICAgICAgICAoV0RJX0luaXRTY2FuUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0luaXRTY2FuUmVxUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zOworICAgdEFOSV9VOCBpID0gMDsKKyAgIAorICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHdkaUluaXRTY2FuUGFyYW0pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOlZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlJbml0U2NhblBhcmFtKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICAKKyAgIC8qIENvcHkgaW5pdCBTY2FuIHBhcmFtcyB0byBXREkgc3RydWN0dXJlICovCisgICB3ZGlJbml0U2NhblBhcmFtLT53ZGlSZXFJbmZvLndkaVNjYW5Nb2RlID0gaW5pdFNjYW5QYXJhbXMtPnNjYW5Nb2RlIDsKKyAgIHZvc19tZW1fY29weSh3ZGlJbml0U2NhblBhcmFtLT53ZGlSZXFJbmZvLm1hY0JTU0lELCBpbml0U2NhblBhcmFtcy0+YnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKSA7CisgICB3ZGlJbml0U2NhblBhcmFtLT53ZGlSZXFJbmZvLmJOb3RpZnlCU1MgPSBpbml0U2NhblBhcmFtcy0+bm90aWZ5QnNzIDsKKyAgIHdkaUluaXRTY2FuUGFyYW0tPndkaVJlcUluZm8udWNGcmFtZVR5cGUgPSBpbml0U2NhblBhcmFtcy0+ZnJhbWVUeXBlIDsKKyAgIHdkaUluaXRTY2FuUGFyYW0tPndkaVJlcUluZm8udWNGcmFtZUxlbmd0aCA9IGluaXRTY2FuUGFyYW1zLT5mcmFtZUxlbmd0aCA7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgd2RpSW5pdFNjYW5QYXJhbS0+d2RpUmVxSW5mby5iVXNlTk9BID0gaW5pdFNjYW5QYXJhbXMtPnVzZU5vQTsKKyAgIHdkaUluaXRTY2FuUGFyYW0tPndkaVJlcUluZm8uc2NhbkR1cmF0aW9uID0gaW5pdFNjYW5QYXJhbXMtPnNjYW5EdXJhdGlvbjsKKyNlbHNlCisgICB3ZGlJbml0U2NhblBhcmFtLT53ZGlSZXFJbmZvLmJVc2VOT0EgPSAwOworICAgd2RpSW5pdFNjYW5QYXJhbS0+d2RpUmVxSW5mby5zY2FuRHVyYXRpb24gPSAwOworI2VuZGlmCisgICB3ZGlJbml0U2NhblBhcmFtLT53ZGlSZXFJbmZvLndkaVNjYW5FbnRyeS5hY3RpdmVCU1NjbnQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0U2NhblBhcmFtcy0+c2NhbkVudHJ5LmFjdGl2ZUJTU2NudCA7CisKKyAgIGZvciAoaT0wOyBpIDwgaW5pdFNjYW5QYXJhbXMtPnNjYW5FbnRyeS5hY3RpdmVCU1NjbnQ7IGkrKykKKyAgIHsKKyAgICAgICB3ZGlJbml0U2NhblBhcmFtLT53ZGlSZXFJbmZvLndkaVNjYW5FbnRyeS5ic3NJZHhbaV0gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0U2NhblBhcmFtcy0+c2NhbkVudHJ5LmJzc0lkeFtpXSA7CisgICB9CisgICAgCisgICAvKiBpZiBGcmFtZSBsZW5ndGgsIGNvcHkgbWFjTWdtdEhkciBvciBXREkgc3RydWN0dXJlICovIAorICAgaWYoMCAhPSB3ZGlJbml0U2NhblBhcmFtLT53ZGlSZXFJbmZvLnVjRnJhbWVMZW5ndGgpCisgICB7CisgICAgICB2b3NfbWVtX2NvcHkoJndkaUluaXRTY2FuUGFyYW0tPndkaVJlcUluZm8ud2RpTUFDTWdtdEhkciwgCisgICAgICAgICAgICAgICAgICAgICAgICZpbml0U2NhblBhcmFtcy0+bWFjTWdtdEhkciwgc2l6ZW9mKHRTaXJNYWNNZ210SGRyKSkgOworICAgfSAKKyAgIHdkaUluaXRTY2FuUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKworICAgLyogU3RvcmUgSW5pdCBSZXEgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IGluaXRTY2FuUGFyYW1zOworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSB3ZGlJbml0U2NhblBhcmFtOworCisgICAvKiBmaXJzdCB0cnkgdG8gc3VzcGVuZCBUWCAqLworICAgc3RhdHVzID0gV0RBX1N1c3BlbmREYXRhVHgocFdEQSkgOworCisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgZ290byBoYW5kbGVXZGlGYWlsdXJlOworICAgfQorCisgICAvKiBjYWxsIERBTCBBUEkgdG8gcGFzcyBpbml0IHNjYW4gcmVxdWVzdCB0byBEQUwgKi8KKyAgIHN0YXR1cyA9IFdESV9Jbml0U2NhblJlcSh3ZGlJbml0U2NhblBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFdEQV9Jbml0U2NhblJlcUNhbGxiYWNrLCBwV2RhUGFyYW1zKSA7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBpbiBXREEgSW5pdCBTY2FuLCBSZXN1bWUgVHggIiApOworICAgICAgc3RhdHVzID0gV0RBX1Jlc3VtZURhdGFUeChwV0RBKSA7CisKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAKKyAgICAgIGdvdG8gaGFuZGxlV2RpRmFpbHVyZTsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7CisKK2hhbmRsZVdkaUZhaWx1cmU6CisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gV0RJIEFwaSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAvKiBmcmVlIFdESSBjb21tYW5kIGJ1ZmZlciAqLworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisKKyAgIC8qIHNlbmQgRmFpbHVyZSB0byBQRSAqLworICAgaW5pdFNjYW5QYXJhbXMtPnN0YXR1cyA9IGVTSVJfRkFJTFVSRSA7CisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfSU5JVF9TQ0FOX1JTUCwgKHZvaWQgKilpbml0U2NhblBhcmFtcywgMCkgOworCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworCisvKgorICogRlVOQ1RJT046IFdEQV9TdGFydFNjYW5SZXFDYWxsYmFjaworICogc2VuZCBTdGFydCBTQ0FOIFJTUCBiYWNrIHRvIFBFCisgKi8gCit2b2lkIFdEQV9TdGFydFNjYW5SZXFDYWxsYmFjayhXRElfU3RhcnRTY2FuUnNwUGFyYW1zVHlwZSAqcFNjYW5Sc3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOyAKKyAgIHRTdGFydFNjYW5QYXJhbXMgKnBXREFfU2NhblBhcmFtOworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIHBXREFfU2NhblBhcmFtID0gKHRTdGFydFNjYW5QYXJhbXMgKilwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbTsKKworICAgaWYoTlVMTCA9PSBwV0RBX1NjYW5QYXJhbSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IHBXREFfU2NhblBhcmFtIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIiVzOiB3ZGFXZGlBcGlNc2dQYXJhbSBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisKKyAgIAorICAgLyogYXNzaWduIHN0YXR1cyB0byBzY2FuIHBhcmFtcyAqLworICAgcFdEQV9TY2FuUGFyYW0tPnN0YXR1cyA9IENPTlZFUlRfV0RJMlNJUl9TVEFUVVMocFNjYW5Sc3AtPndkaVN0YXR1cykgOworCisgICAvKiBzZW5kIFNDQU4gUlNQIG1lc3NhZ2UgYmFjayB0byBQRSAqLworICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX1NUQVJUX1NDQU5fUlNQLCAodm9pZCAqKXBXREFfU2NhblBhcmFtLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKworCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzU3RhcnRTY2FuUmVxCisgKiBUcmlnZ2VyIHN0YXJ0IFNDQU4gaW4gV0RJCisgKi8gCitWT1NfU1RBVFVTICBXREFfUHJvY2Vzc1N0YXJ0U2NhblJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFN0YXJ0U2NhblBhcmFtcyAqc3RhcnRTY2FuUGFyYW1zKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1M7CisgICBXRElfU3RhcnRTY2FuUmVxUGFyYW1zVHlwZSAqd2RpU3RhcnRTY2FuUGFyYW1zID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9TdGFydFNjYW5SZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX1N0YXJ0U2NhblJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtczsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHdkaVN0YXJ0U2NhblBhcmFtcykgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpU3RhcnRTY2FuUGFyYW1zKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIC8qIENvcHkgaW5pdCBTY2FuIHBhcmFtcyB0byBXREkgc3RydWN0dXJlICovCisgICB3ZGlTdGFydFNjYW5QYXJhbXMtPnVjQ2hhbm5lbCA9IHN0YXJ0U2NhblBhcmFtcy0+c2NhbkNoYW5uZWwgOworICAgd2RpU3RhcnRTY2FuUGFyYW1zLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEwgOworCisKKyAgIC8qIFN0b3JlIEluaXQgUmVxIHBvaW50ZXIsIGFzIHRoaXMgd2lsbCBiZSB1c2VkIGZvciByZXNwb25zZSAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IHN0YXJ0U2NhblBhcmFtczsKKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gd2RpU3RhcnRTY2FuUGFyYW1zOworCisgICAvKiBjYWxsIERBTCBBUEkgdG8gcGFzcyBpbml0IHNjYW4gcmVxdWVzdCB0byBEQUwgKi8KKyAgIHN0YXR1cyA9IFdESV9TdGFydFNjYW5SZXEod2RpU3RhcnRTY2FuUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEQV9TdGFydFNjYW5SZXFDYWxsYmFjaywgcFdkYVBhcmFtcykgOworCisgICAvKiBmYWlsdXJlIHJldHVybmVkIGJ5IFdESSBBUEkgKi8KKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gU3RhcnQgU2NhbiBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICJJdCBzaG91bGQgYmUgZHVlIHRvIHByZXZpb3VzIGFib3J0IHNjYW4uIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICAgICBzdGFydFNjYW5QYXJhbXMtPnN0YXR1cyA9IGVTSVJfRkFJTFVSRSA7CisgICAgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfU1RBUlRfU0NBTl9SU1AsICh2b2lkICopc3RhcnRTY2FuUGFyYW1zLCAwKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9FbmRTY2FuUmVxQ2FsbGJhY2sKKyAqIEVORCBTQ0FOIGNhbGxiYWNrCisgKi8gCit2b2lkIFdEQV9FbmRTY2FuUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOyAKKyAgIHRFbmRTY2FuUGFyYW1zICplbmRTY2FuUGFyYW07CisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisgICBlbmRTY2FuUGFyYW0gPSAodEVuZFNjYW5QYXJhbXMgKilwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbTsKKworICAgaWYoTlVMTCA9PSBlbmRTY2FuUGFyYW0pCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIiVzOiBlbmRTY2FuUGFyYW0gcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9IAorICAgCisgICAvKiBGcmVlIFdESSBjb21tYW5kIGJ1ZmZlciAqLworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisKKyAgIC8qIGFzc2lnbiBzdGF0dXMgdG8gc2NhbiBwYXJhbXMgKi8KKyAgIGVuZFNjYW5QYXJhbS0+c3RhdHVzID0gQ09OVkVSVF9XREkyU0lSX1NUQVRVUyhzdGF0dXMpIDsKKworICAgLyogc2VuZCByZXNwb25zZSBiYWNrIHRvIFBFICovCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfRU5EX1NDQU5fUlNQLCAodm9pZCAqKWVuZFNjYW5QYXJhbSwgMCkgOworICAgcmV0dXJuIDsKK30KKworCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzRW5kU2NhblJlcQorICogVHJpZ2dlciBFTkQgU0NBTiBpbiBXREkKKyAqLyAKK1ZPU19TVEFUVVMgIFdEQV9Qcm9jZXNzRW5kU2NhblJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEVuZFNjYW5QYXJhbXMgKmVuZFNjYW5QYXJhbXMpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgIFdESV9FbmRTY2FuUmVxUGFyYW1zVHlwZSAqd2RpRW5kU2NhblBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9FbmRTY2FuUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9FbmRTY2FuUmVxUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHdkaUVuZFNjYW5QYXJhbXMpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaUVuZFNjYW5QYXJhbXMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgLyogQ29weSBpbml0IFNjYW4gcGFyYW1zIHRvIFdESSBzdHJ1Y3R1cmUgKi8KKyAgIHdkaUVuZFNjYW5QYXJhbXMtPnVjQ2hhbm5lbCA9IGVuZFNjYW5QYXJhbXMtPnNjYW5DaGFubmVsIDsKKyAgIHdkaUVuZFNjYW5QYXJhbXMtPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgIC8qIFN0b3JlIEluaXQgUmVxIHBvaW50ZXIsIGFzIHRoaXMgd2lsbCBiZSB1c2VkIGZvciByZXNwb25zZSAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IGVuZFNjYW5QYXJhbXM7CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaUVuZFNjYW5QYXJhbXM7CisKKyAgIC8qIGNhbGwgREFMIEFQSSB0byBwYXNzIGluaXQgc2NhbiByZXF1ZXN0IHRvIERBTCAqLworICAgc3RhdHVzID0gV0RJX0VuZFNjYW5SZXEod2RpRW5kU2NhblBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfRW5kU2NhblJlcUNhbGxiYWNrLCBwV2RhUGFyYW1zKSA7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gRW5kIFNjYW4gV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiCisgICAgICAgICAgICAgICAgICAgICAiSXQgc2hvdWxkIGJlIGR1ZSB0byBwcmV2aW91cyBhYm9ydCBzY2FuLiIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgICAgZW5kU2NhblBhcmFtcy0+c3RhdHVzID0gZVNJUl9GQUlMVVJFIDsKKyAgICAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9FTkRfU0NBTl9SU1AsICh2b2lkICopZW5kU2NhblBhcmFtcywgMCkgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfRmluaXNoU2NhblJlcUNhbGxiYWNrCisgKiBUcmlnZ2VyIEZpbmlzaCBTQ0FOIGNhbGxiYWNrCisgKi8gCit2b2lkIFdEQV9GaW5pc2hTY2FuUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyB3ZGlTdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOyAKKyAgIHRGaW5pc2hTY2FuUGFyYW1zICpmaW5pc2hTY2FuUGFyYW07IAorICAgVk9TX1NUQVRVUyAgICAgIHN0YXR1czsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICAKKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIGZpbmlzaFNjYW5QYXJhbSA9ICh0RmluaXNoU2NhblBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtOworCisgICBpZihOVUxMID09IGZpbmlzaFNjYW5QYXJhbSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICIlczogZmluaXNoU2NhblBhcmFtIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKworICAgLyogCisgICAgKiBOb3cgUmVzdW1lIFRYLCBpZiB3ZSByZWFjaGVkIGhlcmUgbWVhbnMsIFRYIGlzIGFscmVhZHkgc3VzcGVuZGVkLCB3ZSAKKyAgICAqIGhhdmUgdG8gcmVzdW1lIGl0IHVuY29uZGl0aW9uYWx5CisgICAgKi8KKyAgIHN0YXR1cyA9IFdEQV9SZXN1bWVEYXRhVHgocFdEQSkgOworICAgICAgIAorICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZXJyb3IgaW4gUmVzdW1lIFR4ICIsIF9fRlVOQ1RJT05fXyApOworICAgfQorCisgICBmaW5pc2hTY2FuUGFyYW0tPnN0YXR1cyA9IENPTlZFUlRfV0RJMlNJUl9TVEFUVVMod2RpU3RhdHVzKSA7CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9GSU5JU0hfU0NBTl9SU1AsICh2b2lkICopZmluaXNoU2NhblBhcmFtLCAwKSA7CisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzRmluc2hTY2FuUmVxCisgKiBUcmlnZ2VyIEZpbmlzaCBTQ0FOIGluIFdESQorICovIAorVk9TX1NUQVRVUyAgV0RBX1Byb2Nlc3NGaW5pc2hTY2FuUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RmluaXNoU2NhblBhcmFtcyAqZmluaXNoU2NhblBhcmFtcykKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTOworICAgV0RJX0ZpbmlzaFNjYW5SZXFQYXJhbXNUeXBlICp3ZGlGaW5pc2hTY2FuUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0ZpbmlzaFNjYW5SZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9GaW5pc2hTY2FuUmVxUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKyAgIHRBTklfVTggaSA9IDA7CisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpRmluaXNoU2NhblBhcmFtcykgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpRmluaXNoU2NhblBhcmFtcyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICAvKiBDb3B5IGluaXQgU2NhbiBwYXJhbXMgdG8gV0RJIHN0cnVjdHVyZSAqLworICAgd2RpRmluaXNoU2NhblBhcmFtcy0+d2RpUmVxSW5mby53ZGlTY2FuTW9kZSA9IGZpbmlzaFNjYW5QYXJhbXMtPnNjYW5Nb2RlIDsKKyAgIHZvc19tZW1fY29weSh3ZGlGaW5pc2hTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaFNjYW5QYXJhbXMtPmJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpKSA7CisKKyAgIHdkaUZpbmlzaFNjYW5QYXJhbXMtPndkaVJlcUluZm8uYk5vdGlmeUJTUyA9IGZpbmlzaFNjYW5QYXJhbXMtPm5vdGlmeUJzcyA7CisgICB3ZGlGaW5pc2hTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLnVjRnJhbWVUeXBlID0gZmluaXNoU2NhblBhcmFtcy0+ZnJhbWVUeXBlIDsKKyAgIHdkaUZpbmlzaFNjYW5QYXJhbXMtPndkaVJlcUluZm8udWNGcmFtZUxlbmd0aCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoU2NhblBhcmFtcy0+ZnJhbWVMZW5ndGggOworICAgd2RpRmluaXNoU2NhblBhcmFtcy0+d2RpUmVxSW5mby51Y0N1cnJlbnRPcGVyYXRpbmdDaGFubmVsID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaFNjYW5QYXJhbXMtPmN1cnJlbnRPcGVyQ2hhbm5lbCA7CisgICB3ZGlGaW5pc2hTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLndkaUNCU3RhdGUgPSBmaW5pc2hTY2FuUGFyYW1zLT5jYlN0YXRlIDsKKyAgIHdkaUZpbmlzaFNjYW5QYXJhbXMtPndkaVJlcUluZm8ud2RpU2NhbkVudHJ5LmFjdGl2ZUJTU2NudCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaFNjYW5QYXJhbXMtPnNjYW5FbnRyeS5hY3RpdmVCU1NjbnQgOworCisgICBmb3IgKGkgPSAwOyBpIDwgZmluaXNoU2NhblBhcmFtcy0+c2NhbkVudHJ5LmFjdGl2ZUJTU2NudDsgaSsrKQorICAgeworICAgICAgIHdkaUZpbmlzaFNjYW5QYXJhbXMtPndkaVJlcUluZm8ud2RpU2NhbkVudHJ5LmJzc0lkeFtpXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaFNjYW5QYXJhbXMtPnNjYW5FbnRyeS5ic3NJZHhbaV0gOworICAgfQorICAgCisgCisKKyAgIC8qIGlmIEZyYW1lIGxlbmd0aCwgY29weSBtYWNNZ210SGRyIHJvIFdESSBzdHJ1Y3R1cmUgKi8gCisgICBpZigwICE9IHdkaUZpbmlzaFNjYW5QYXJhbXMtPndkaVJlcUluZm8udWNGcmFtZUxlbmd0aCkKKyAgIHsKKyAgICAgIHZvc19tZW1fY29weSgmd2RpRmluaXNoU2NhblBhcmFtcy0+d2RpUmVxSW5mby53ZGlNQUNNZ210SGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaW5pc2hTY2FuUGFyYW1zLT5tYWNNZ210SGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9NYWNNZ210SGRyKSkgOworICAgfSAKKyAgIHdkaUZpbmlzaFNjYW5QYXJhbXMtPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgIC8qIFN0b3JlIEluaXQgUmVxIHBvaW50ZXIsIGFzIHRoaXMgd2lsbCBiZSB1c2VkIGZvciByZXNwb25zZSAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IGZpbmlzaFNjYW5QYXJhbXM7CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaUZpbmlzaFNjYW5QYXJhbXM7CisKKyAgIC8qIGNhbGwgREFMIEFQSSB0byBwYXNzIGluaXQgc2NhbiByZXF1ZXN0IHRvIERBTCAqLworICAgc3RhdHVzID0gV0RJX0ZpbmlzaFNjYW5SZXEod2RpRmluaXNoU2NhblBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfRmluaXNoU2NhblJlcUNhbGxiYWNrLCBwV2RhUGFyYW1zKSA7CisKKyAgIAorICAgLyogCisgICAgKiBXREkgQVBJIHJldHVybnMgZmFpbHVyZS4uCisgICAgKi8KKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRSggc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJGYWlsdXJlIGluIEZpbmlzaCBTY2FuIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisKKyAgICAgIGZpbmlzaFNjYW5QYXJhbXMtPnN0YXR1cyA9IGVTSVJfRkFJTFVSRSA7CisgICAgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfRklOSVNIX1NDQU5fUlNQLCAodm9pZCAqKWZpbmlzaFNjYW5QYXJhbXMsIDApIDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBU1NPQyBBUEkncworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogRlVOQ1RJT046IFdEQV9Kb2luUmVxQ2FsbGJhY2sKKyAqIFRyaWdnZXIgSW5pdCBTQ0FOIGNhbGxiYWNrCisgKi8gCit2b2lkIFdEQV9Kb2luUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOyAKKyAgIHRTd2l0Y2hDaGFubmVsUGFyYW1zICpqb2luUmVxUGFyYW07CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisgICBqb2luUmVxUGFyYW0gPSAodFN3aXRjaENoYW5uZWxQYXJhbXMgKilwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbTsKKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICAvKiByZXNldCBtYWNCU1NJRCAqLworICAgdm9zX21lbV9zZXQocFdEQS0+bWFjQlNTSUQsIHNpemVvZihwV0RBLT5tYWNCU1NJRCksMCApOworCisgICAvKiByZXNldCBtYWNTVEFTZWxmICovCisgICB2b3NfbWVtX3NldChwV0RBLT5tYWNTVEFTZWxmLCBzaXplb2YocFdEQS0+bWFjU1RBU2VsZiksMCApOworCisgICBqb2luUmVxUGFyYW0tPnN0YXR1cyA9IENPTlZFUlRfV0RJMlNJUl9TVEFUVVMoc3RhdHVzKSA7CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9TV0lUQ0hfQ0hBTk5FTF9SU1AsICh2b2lkICopam9pblJlcVBhcmFtICwgMCkgOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzSm9pblJlcQorICogVHJpZ2dlciBKb2luIFJFUSBpbiBXREkKKyAqLyAKKworVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0pvaW5SZXEodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U3dpdGNoQ2hhbm5lbFBhcmFtcyogam9pblJlcVBhcmFtKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworCisgICBXRElfSm9pblJlcVBhcmFtc1R5cGUgKndkaUpvaW5SZXFQYXJhbSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0pvaW5SZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXRElfSm9pblJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlKb2luUmVxUGFyYW0pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaUpvaW5SZXFQYXJhbSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICAvKiBjb3B5IHRoZSBCU1NJRCBmb3IgcFdEQSAqLworICAgdm9zX21lbV9jb3B5KHdkaUpvaW5SZXFQYXJhbS0+d2RpUmVxSW5mby5tYWNCU1NJRCwgcFdEQS0+bWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkgOworCisgICB2b3NfbWVtX2NvcHkod2RpSm9pblJlcVBhcmFtLT53ZGlSZXFJbmZvLm1hY1NUQVNlbGYsIAorICAgICAgICAgICAgICAgIHBXREEtPm1hY1NUQVNlbGYsIHNpemVvZih0U2lyTWFjQWRkcikpIDsKKworICAgd2RpSm9pblJlcVBhcmFtLT53ZGlSZXFJbmZvLndkaUNoYW5uZWxJbmZvLnVjQ2hhbm5lbCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5SZXFQYXJhbS0+Y2hhbm5lbE51bWJlciA7CisjaWZuZGVmIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgIHdkaUpvaW5SZXFQYXJhbS0+d2RpUmVxSW5mby53ZGlDaGFubmVsSW5mby51Y0xvY2FsUG93ZXJDb25zdHJhaW50ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luUmVxUGFyYW0tPmxvY2FsUG93ZXJDb25zdHJhaW50IDsKKyNlbmRpZgorICAgd2RpSm9pblJlcVBhcmFtLT53ZGlSZXFJbmZvLndkaUNoYW5uZWxJbmZvLndkaVNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luUmVxUGFyYW0tPnNlY29uZGFyeUNoYW5uZWxPZmZzZXQgOworICAgd2RpSm9pblJlcVBhcmFtLT53ZGlSZXFJbmZvLmxpbmtTdGF0ZSA9IHBXREEtPmxpbmtTdGF0ZTsKKyAgIAorICAgd2RpSm9pblJlcVBhcmFtLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEwgOworCisgICAvKiBTdG9yZSBJbml0IFJlcSBwb2ludGVyLCBhcyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgcmVzcG9uc2UgKi8KKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSBqb2luUmVxUGFyYW07CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaUpvaW5SZXFQYXJhbTsKKworICAgc3RhdHVzID0gV0RJX0pvaW5SZXEod2RpSm9pblJlcVBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0pvaW5Sc3BDYiApV0RBX0pvaW5SZXFDYWxsYmFjaywgcFdkYVBhcmFtcykgOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBKb2luIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICAgICBqb2luUmVxUGFyYW0tPnN0YXR1cyA9IGVTSVJfRkFJTFVSRSA7CisgICAgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfU1dJVENIX0NIQU5ORUxfUlNQLCAodm9pZCAqKWpvaW5SZXFQYXJhbSwgMCkgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfU3dpdGNoQ2hhbm5lbFJlcUNhbGxiYWNrCisgKiBzZW5kIFN3aXRjaCBjaGFubmVsIFJTUCBiYWNrIHRvIFBFCisgKi8gCit2b2lkIFdEQV9Td2l0Y2hDaGFubmVsUmVxQ2FsbGJhY2soCisgICAgICAgICAgICAgICBXRElfU3dpdGNoQ0hSc3BQYXJhbXNUeXBlICAgKndkaVN3aXRjaENoYW5Sc3AsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhIDsgCisgICB0V0RBX0NiQ29udGV4dCAqcFdEQTsgCisgICB0U3dpdGNoQ2hhbm5lbFBhcmFtcyAqcFN3aXRjaENoYW5QYXJhbXM7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisgICBwU3dpdGNoQ2hhblBhcmFtcyA9ICh0U3dpdGNoQ2hhbm5lbFBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtOworICAgCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgcFN3aXRjaENoYW5QYXJhbXMtPnR4TWdtdFBvd2VyICA9ICB3ZGlTd2l0Y2hDaGFuUnNwLT51Y1R4TWdtdFBvd2VyOworI2VuZGlmCisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICBwU3dpdGNoQ2hhblBhcmFtcy0+c3RhdHVzID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlZFUlRfV0RJMlNJUl9TVEFUVVMod2RpU3dpdGNoQ2hhblJzcC0+d2RpU3RhdHVzKSA7CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9TV0lUQ0hfQ0hBTk5FTF9SU1AsICh2b2lkICopcFN3aXRjaENoYW5QYXJhbXMgLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NDaGFubmVsU3dpdGNoUmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byBzd2l0Y2ggY2hhbm5lbCBSRVEgcGFyYW1zLgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0NoYW5uZWxTd2l0Y2hSZXEodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFN3aXRjaENoYW5uZWxQYXJhbXMgKnBTd2l0Y2hDaGFuUGFyYW1zKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworICAgV0RJX1N3aXRjaENoUmVxUGFyYW1zVHlwZSAqd2RpU3dpdGNoQ2hhblBhcmFtID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9Td2l0Y2hDaFJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9Td2l0Y2hDaFJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlTd2l0Y2hDaGFuUGFyYW0pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaVN3aXRjaENoYW5QYXJhbSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB3ZGlTd2l0Y2hDaGFuUGFyYW0tPndkaUNoSW5mby51Y0NoYW5uZWwgPSBwU3dpdGNoQ2hhblBhcmFtcy0+Y2hhbm5lbE51bWJlcjsKKyNpZm5kZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgd2RpU3dpdGNoQ2hhblBhcmFtLT53ZGlDaEluZm8udWNMb2NhbFBvd2VyQ29uc3RyYWludCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3aXRjaENoYW5QYXJhbXMtPmxvY2FsUG93ZXJDb25zdHJhaW50OworI2VuZGlmCisgICB3ZGlTd2l0Y2hDaGFuUGFyYW0tPndkaUNoSW5mby53ZGlTZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN3aXRjaENoYW5QYXJhbXMtPnNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CisgICB3ZGlTd2l0Y2hDaGFuUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgIC8qIFN0b3JlIHJlcSBwb2ludGVyLCBhcyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgcmVzcG9uc2UgKi8KKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSBwU3dpdGNoQ2hhblBhcmFtczsKKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gd2RpU3dpdGNoQ2hhblBhcmFtOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgd2RpU3dpdGNoQ2hhblBhcmFtLT53ZGlDaEluZm8uY01heFR4UG93ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwU3dpdGNoQ2hhblBhcmFtcy0+bWF4VHhQb3dlcjsKKyAgIHZvc19tZW1fY29weSh3ZGlTd2l0Y2hDaGFuUGFyYW0tPndkaUNoSW5mby5tYWNTZWxmU3RhTWFjQWRkciwgCisgICAgICAgICAgICAgICAgICAgIHBTd2l0Y2hDaGFuUGFyYW1zIC0+c2VsZlN0YU1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworI2VuZGlmCisgICB2b3NfbWVtX2NvcHkod2RpU3dpdGNoQ2hhblBhcmFtLT53ZGlDaEluZm8ubWFjQlNTSWQsIAorICAgICAgICAgICAgICAgICAgICAgcFN3aXRjaENoYW5QYXJhbXMtPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgIHN0YXR1cyA9IFdESV9Td2l0Y2hDaFJlcSh3ZGlTd2l0Y2hDaGFuUGFyYW0sIAorICAgICAgICAgICAgICAgICAgICAgKFdESV9Td2l0Y2hDaFJzcENiKVdEQV9Td2l0Y2hDaGFubmVsUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAiRmFpbHVyZSBpbiBwcm9jZXNzIGNoYW5uZWwgc3dpdGNoIFJlcSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgICAgcFN3aXRjaENoYW5QYXJhbXMtPnN0YXR1cyA9IGVTSVJfRkFJTFVSRSA7CisgICAgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfU1dJVENIX0NIQU5ORUxfUlNQLCAodm9pZCAqKXBTd2l0Y2hDaGFuUGFyYW1zLCAwKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Db25maWdCc3NSZXFDYWxsYmFjaworICogY29uZmlnIEJTUyBSZXEgQ2FsbGJhY2ssIGNhbGxlZCBieSBXREkKKyAqLyAKK3ZvaWQgV0RBX0NvbmZpZ0Jzc1JlcUNhbGxiYWNrKFdESV9Db25maWdCU1NSc3BQYXJhbXNUeXBlICp3ZGlDb25maWdCc3NSc3AgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsgCisgICB0V0RBX0NiQ29udGV4dCAqcFdEQTsgCisgICB0QWRkQnNzUGFyYW1zICpjb25maWdCc3NSZXFQYXJhbTsKKyAgIHRBZGRTdGFQYXJhbXMgKnN0YUNvbmZpZ0Jzc1BhcmFtOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisgICBjb25maWdCc3NSZXFQYXJhbSA9ICh0QWRkQnNzUGFyYW1zICopcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW07CisgICBzdGFDb25maWdCc3NQYXJhbSA9ICZjb25maWdCc3NSZXFQYXJhbS0+c3RhQ29udGV4dCA7CisKKyAgIGNvbmZpZ0Jzc1JlcVBhcmFtLT5zdGF0dXMgPSAKKyAgICAgICAgICAgICAgICAgICAgIENPTlZFUlRfV0RJMlNJUl9TVEFUVVMod2RpQ29uZmlnQnNzUnNwLT53ZGlTdGF0dXMpOworCisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgPT0gd2RpQ29uZmlnQnNzUnNwLT53ZGlTdGF0dXMpCisgICB7CisgICAgICB2b3NfbWVtX2NvcHkoY29uZmlnQnNzUmVxUGFyYW0tPmJzc0lkLCB3ZGlDb25maWdCc3NSc3AtPm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICAgICAgY29uZmlnQnNzUmVxUGFyYW0tPmJzc0lkeCA9IHdkaUNvbmZpZ0Jzc1JzcC0+dWNCU1NJZHg7CisgICAgICBjb25maWdCc3NSZXFQYXJhbS0+YmNhc3REcHVTaWduYXR1cmUgPSB3ZGlDb25maWdCc3NSc3AtPnVjQmNhc3RTaWc7CisgICAgICBjb25maWdCc3NSZXFQYXJhbS0+bWdtdERwdVNpZ25hdHVyZSA9IHdkaUNvbmZpZ0Jzc1JzcC0+dWNVY2FzdFNpZzsKKyAgICAgIAorICAgICAgaWYgKGNvbmZpZ0Jzc1JlcVBhcmFtLT5vcGVyTW9kZSA9PSBCU1NfT1BFUkFUSU9OQUxfTU9ERV9TVEEpIAorICAgICAgeworICAgICAgICAgaWYoY29uZmlnQnNzUmVxUGFyYW0tPmJzc1R5cGUgPT0gZVNJUl9JQlNTX01PREUpIAorICAgICAgICAgeworICAgICAgICAgICAgcFdEQS0+d2RhR2xvYmFsU3lzdGVtUm9sZSA9IGVTWVNURU1fU1RBX0lOX0lCU1NfUk9MRTsKKyAgICAgICAgICAgIHN0YUNvbmZpZ0Jzc1BhcmFtLT5zdGFUeXBlID0gU1RBX0VOVFJZX0JTU0lEOworICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiAoKGNvbmZpZ0Jzc1JlcVBhcmFtLT5ic3NUeXBlID09IGVTSVJfQlRBTVBfU1RBX01PREUpICYmCisgICAgICAgICAgICAgICAgIChzdGFDb25maWdCc3NQYXJhbS0+c3RhVHlwZSA9PSBTVEFfRU5UUllfU0VMRikpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSAxc3QgYWRkIEJTUyBSZXEgZm9yIHRoZSBCVEFNUCBTVEEgKi8KKyAgICAgICAgICAgIHBXREEtPndkYUdsb2JhbFN5c3RlbVJvbGUgPSBlU1lTVEVNX0JUQU1QX1NUQV9ST0xFOworICAgICAgICAgICAgc3RhQ29uZmlnQnNzUGFyYW0tPnN0YVR5cGUgPSBTVEFfRU5UUllfQlNTSUQ7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmICgoY29uZmlnQnNzUmVxUGFyYW0tPmJzc1R5cGUgPT0gZVNJUl9CVEFNUF9BUF9NT0RFKSAmJgorICAgICAgICAgICAgICAgIChzdGFDb25maWdCc3NQYXJhbS0+c3RhVHlwZSA9PSBTVEFfRU5UUllfUEVFUikpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSAybmQgQUREIEJTUyBSZXF1ZXN0IHRoYXQgaXMgc2VudAorICAgICAgICAgICAgICogb24gdGhlIEJUQU1QIFNUQSBzaWRlLiBUaGUgU3RhIHR5cGUgaXMKKyAgICAgICAgICAgICAqIHNldCB0byBTVEFfRU5UUllfUEVFUiBoZXJlLiovCisgICAgICAgICAgICBwV0RBLT53ZGFHbG9iYWxTeXN0ZW1Sb2xlID0gZVNZU1RFTV9CVEFNUF9TVEFfUk9MRTsKKyAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiAoKGNvbmZpZ0Jzc1JlcVBhcmFtLT5ic3NUeXBlID09IGVTSVJfQlRBTVBfQVBfTU9ERSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAoc3RhQ29uZmlnQnNzUGFyYW0tPnN0YVR5cGUgPT0gU1RBX0VOVFJZX1NFTEYpKQorICAgICAgICAgeworICAgICAgICAgICAgLyogc3RhdHlwZSBpcyBhbHJlYWR5IHNldCBieSBQRS4KKyAgICAgICAgICAgICAqIE9ubHkgMSBBREQgQlNTIFJlcSBpcyBzZW50IG9uIHRoZSBCVEFNUCBBUCBzaWRlLiovCisgICAgICAgICAgICBwV0RBLT53ZGFHbG9iYWxTeXN0ZW1Sb2xlID0gZVNZU1RFTV9CVEFNUF9BUF9ST0xFOworICAgICAgICAgICAgc3RhQ29uZmlnQnNzUGFyYW0tPnN0YVR5cGUgPSBTVEFfRU5UUllfQlNTSUQ7CisgICAgICAgICB9IAorICAgICAgICAgZWxzZSAKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBXREEtPndkYUdsb2JhbFN5c3RlbVJvbGUgPSBlU1lTVEVNX1NUQV9ST0xFOworICAgICAgICAgICAgc3RhQ29uZmlnQnNzUGFyYW0tPnN0YVR5cGUgPSBTVEFfRU5UUllfUEVFUjsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNvbmZpZ0Jzc1JlcVBhcmFtLT5vcGVyTW9kZSA9PSBCU1NfT1BFUkFUSU9OQUxfTU9ERV9BUCkgCisgICAgICB7CisgICAgICAgICBwV0RBLT53ZGFHbG9iYWxTeXN0ZW1Sb2xlID0gZVNZU1RFTV9BUF9ST0xFOworICAgICAgICAgc3RhQ29uZmlnQnNzUGFyYW0tPnN0YVR5cGUgPSBTVEFfRU5UUllfU0VMRjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG9wZXJhdGlvbiBtb2RlIHNwZWNpZmllZCIpOworICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc3RhQ29uZmlnQnNzUGFyYW0tPnN0YUlkeCA9IHdkaUNvbmZpZ0Jzc1JzcC0+dWNTVEFJZHg7CisKKyAgICAgIHN0YUNvbmZpZ0Jzc1BhcmFtLT5ic3NJZHggPSB3ZGlDb25maWdCc3NSc3AtPnVjQlNTSWR4OworCisgICAgICBzdGFDb25maWdCc3NQYXJhbS0+dWNVY2FzdFNpZyA9IHdkaUNvbmZpZ0Jzc1JzcC0+dWNVY2FzdFNpZzsKKworICAgICAgc3RhQ29uZmlnQnNzUGFyYW0tPnVjQmNhc3RTaWcgPSB3ZGlDb25maWdCc3NSc3AtPnVjQmNhc3RTaWc7CisKKyAgICAgIHZvc19tZW1fY29weShzdGFDb25maWdCc3NQYXJhbS0+c3RhTWFjLCB3ZGlDb25maWdCc3NSc3AtPm1hY1NUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgIHN0YUNvbmZpZ0Jzc1BhcmFtLT50eENoYW5uZWxXaWR0aFNldCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0Jzc1JlcVBhcmFtLT50eENoYW5uZWxXaWR0aFNldDsKKworICAgICAgaWYoc3RhQ29uZmlnQnNzUGFyYW0tPnN0YVR5cGUgPT0gU1RBX0VOVFJZX1BFRVIgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFDb25maWdCc3NQYXJhbS0+aHRDYXBhYmxlKQorICAgICAgeworICAgICAgICAgcFdEQS0+d2RhU3RhSW5mb1tzdGFDb25maWdCc3NQYXJhbS0+c3RhSWR4XS5ic3NJZHggPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlDb25maWdCc3NSc3AtPnVjQlNTSWR4OworICAgICAgICAgcFdEQS0+d2RhU3RhSW5mb1tzdGFDb25maWdCc3NQYXJhbS0+c3RhSWR4XS51Y1ZhbGlkU3RhSW5kZXggPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEQV9WQUxJRF9TVEFfSU5ERVggOworICAgICAgfQorCisgICAgICBpZihXRElfRFNfU2V0U3RhSWR4UGVyQnNzSWR4KHBXREEtPnBXZGlDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlDb25maWdCc3NSc3AtPnVjQlNTSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlDb25maWdCc3NSc3AtPnVjU1RBSWR4KSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBmYWlsIHRvIHNldCBTVEEgaWR4IGFzc29jaWF0ZWQgd2l0aCBCU1MgaW5kZXgiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICB9CisKKyAgICAgIGlmKFdESV9EU19BZGRTVEFNZW1Qb29sKHBXREEtPnBXZGlDb250ZXh0LCB3ZGlDb25maWdCc3NSc3AtPnVjU1RBSWR4KSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBhZGQgQlNTIGludG8gbWVtcG9vbCBmYWlsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgICAgY29uZmlnQnNzUmVxUGFyYW0tPnR4TWdtdFBvd2VyID0gd2RpQ29uZmlnQnNzUnNwLT51Y1R4TWdtdFBvd2VyOworI2VuZGlmCisgICB9CisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfQUREX0JTU19SU1AsICh2b2lkICopY29uZmlnQnNzUmVxUGFyYW0gLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1VwZGF0ZUVkY2FQYXJhbXNGb3JBQworICogVXBkYXRlIFdESSBFRENBIHBhcmFtcyB3aXRoIFBFIGVkY2EgcGFyYW1zCisgKi8gCit2b2lkIFdEQV9VcGRhdGVFZGNhUGFyYW1zRm9yQUModFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9FZGNhUGFyYW1SZWNvcmQgKndkaUVkY2FQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJNYWNFZGNhUGFyYW1SZWNvcmQgKm1hY0VkY2FQYXJhbSkKK3sKKyAgIHdkaUVkY2FQYXJhbS0+d2RpQUNJLmFpZnNuID0gbWFjRWRjYVBhcmFtLT5hY2kuYWlmc247CisgICB3ZGlFZGNhUGFyYW0tPndkaUFDSS5hY209IG1hY0VkY2FQYXJhbS0+YWNpLmFjbTsKKyAgIHdkaUVkY2FQYXJhbS0+d2RpQUNJLmFjaSA9IG1hY0VkY2FQYXJhbS0+YWNpLmFjaTsKKyAgIHdkaUVkY2FQYXJhbS0+d2RpQ1cubWluID0gbWFjRWRjYVBhcmFtLT5jdy5taW47CisgICB3ZGlFZGNhUGFyYW0tPndkaUNXLm1heCA9IG1hY0VkY2FQYXJhbS0+Y3cubWF4OworICAgd2RpRWRjYVBhcmFtLT51c1RYT1BMaW1pdCA9IG1hY0VkY2FQYXJhbS0+dHhvcGxpbWl0OworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzQ29uZmlnQnNzUmVxCisgKiBDb25maWd1cmUgQlNTIGJlZm9yZSBzdGFydGluZyBBc3NvYyB3aXRoIEFQCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzQ29uZmlnQnNzUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFkZEJzc1BhcmFtcyogY29uZmlnQnNzUmVxUGFyYW0pCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisKKyAgIFdESV9Db25maWdCU1NSZXFQYXJhbXNUeXBlICp3ZGlDb25maWdCc3NSZXFQYXJhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfQ29uZmlnQlNTUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0NvbmZpZ0JTU1JlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlDb25maWdCc3NSZXFQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpQ29uZmlnQnNzUmVxUGFyYW0pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgdm9zX21lbV9zZXQod2RpQ29uZmlnQnNzUmVxUGFyYW0sIHNpemVvZihXRElfQ29uZmlnQlNTUmVxUGFyYW1zVHlwZSksIDApOworCisgICBXREFfVXBkYXRlQlNTUGFyYW1zKHBXREEsICZ3ZGlDb25maWdCc3NSZXFQYXJhbS0+d2RpUmVxSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0Jzc1JlcVBhcmFtKSA7CisKKyAgIC8qIFN0b3JlIEluaXQgUmVxIHBvaW50ZXIsIGFzIHRoaXMgd2lsbCBiZSB1c2VkIGZvciByZXNwb25zZSAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IGNvbmZpZ0Jzc1JlcVBhcmFtOworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSB3ZGlDb25maWdCc3NSZXFQYXJhbTsKKworICAgc3RhdHVzID0gV0RJX0NvbmZpZ0JTU1JlcSh3ZGlDb25maWdCc3NSZXFQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0NvbmZpZ0JTU1JzcENiIClXREFfQ29uZmlnQnNzUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpIDsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gQ29uZmlnIEJTUyBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICAgICBjb25maWdCc3NSZXFQYXJhbS0+c3RhdHVzID0gZVNJUl9GQUlMVVJFIDsKKworICAgICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX0FERF9CU1NfUlNQLCAodm9pZCAqKWNvbmZpZ0Jzc1JlcVBhcmFtLCAwKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisjaWZkZWYgRU5BQkxFX0hBTF9DT01CSU5FRF9NRVNTQUdFUworLyoKKyAqIEZVTkNUSU9OOiBXREFfUG9zdEFzc29jUmVxQ2FsbGJhY2sKKyAqIFBvc3QgQVNTT0MgcmVxIGNhbGxiYWNrLCBzZW5kIFJTUCBiYWNrIHRvIFBFCisgKi8gCit2b2lkIFdEQV9Qb3N0QXNzb2NSZXFDYWxsYmFjayhXRElfUG9zdEFzc29jUnNwUGFyYW1zVHlwZSAqd2RpUG9zdEFzc29jUnNwLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9DYkNvbnRleHQgKnBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwVXNlckRhdGEgOyAKKyAgIHRQb3N0QXNzb2NQYXJhbXMgKnBvc3RBc3NvY1JlcVBhcmFtID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0UG9zdEFzc29jUGFyYW1zICopcFdEQS0+d2RhTXNnUGFyYW0gOworICAgLypTVEEgY29udGV4dCB3aXRoaW4gdGhlIEJTUyBQYXJhbXMqLworICAgdEFkZFN0YVBhcmFtcyAqc3RhUG9zdEFzc29jUGFyYW0gPSAKKyAgICAgICZwb3N0QXNzb2NSZXFQYXJhbS0+YWRkQnNzUGFyYW1zLnN0YUNvbnRleHQgOworICAgLypTVEEgUGFyYW1zIGZvciBzZWxmIFNUQSovCisgICB0QWRkU3RhUGFyYW1zICpzZWxmU3RhUG9zdEFzc29jUGFyYW0gPSAKKyAgICAgICZwb3N0QXNzb2NSZXFQYXJhbS0+YWRkU3RhUGFyYW1zIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBwb3N0QXNzb2NSZXFQYXJhbS0+c3RhdHVzID0gCisgICAgICAgICAgICAgICAgICAgQ09OVkVSVF9XREkyU0lSX1NUQVRVUyh3ZGlQb3N0QXNzb2NSc3AtPndkaVN0YXR1cykgOworCisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgPT0gd2RpUG9zdEFzc29jUnNwLT53ZGlTdGF0dXMpCisgICB7CisgICAgICBzdGFQb3N0QXNzb2NQYXJhbS0+c3RhSWR4ID0gd2RpUG9zdEFzc29jUnNwLT5ic3NQYXJhbXMudWNTVEFJZHggOworICAgICAgdm9zX21lbV9jb3B5KHN0YVBvc3RBc3NvY1BhcmFtLT5zdGFNYWMsIHdkaVBvc3RBc3NvY1JzcC0+YnNzUGFyYW1zLm1hY1NUQSwgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkgOworICAgICAgc3RhUG9zdEFzc29jUGFyYW0tPnVjVWNhc3RTaWcgPSB3ZGlQb3N0QXNzb2NSc3AtPmJzc1BhcmFtcy51Y1VjYXN0U2lnIDsKKyAgICAgIHN0YVBvc3RBc3NvY1BhcmFtLT51Y0JjYXN0U2lnID0gd2RpUG9zdEFzc29jUnNwLT5ic3NQYXJhbXMudWNCY2FzdFNpZyA7CisgICAgICBzdGFQb3N0QXNzb2NQYXJhbS0+YnNzSWR4ID0gd2RpUG9zdEFzc29jUnNwLT5ic3NQYXJhbXMudWNCU1NJZHg7CisKKyAgICAgIHNlbGZTdGFQb3N0QXNzb2NQYXJhbS0+c3RhSWR4ID0gd2RpUG9zdEFzc29jUnNwLT5zdGFQYXJhbXMudWNTVEFJZHg7CisgICB9CisgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgIHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtID0gTlVMTDsKKyAgIHBXREEtPndkYU1zZ1BhcmFtID0gTlVMTDsKKworICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX1BPU1RfQVNTT0NfUlNQLCAodm9pZCAqKXBvc3RBc3NvY1JlcVBhcmFtLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NQb3N0QXNzb2NSZXEKKyAqIFRyaWdnZXIgUE9TVCBBU1NPQyBwcm9jZXNzaW5nIGluIFdESQorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1Bvc3RBc3NvY1JlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UG9zdEFzc29jUGFyYW1zICpwb3N0QXNzb2NSZXFQYXJhbSkKK3sKKworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworICAgCisgICBXRElfUG9zdEFzc29jUmVxUGFyYW1zVHlwZSAqd2RpUG9zdEFzc29jUmVxUGFyYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9Qb3N0QXNzb2NSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXRElfUG9zdEFzc29jUmVxUGFyYW1zVHlwZSkpIDsKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworCisgICBpZihOVUxMID09IHdkaVBvc3RBc3NvY1JlcVBhcmFtKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKyAgIAorICAgaWYoKE5VTEwgIT0gcFdEQS0+d2RhTXNnUGFyYW0pIHx8IChOVUxMICE9IHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAiJXM6IHdkYU1zZ1BhcmFtIG9yIHdkYVdkaUFwaU1zZ1BhcmFtIGlzIG5vdCBOVUxMIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisKKyAgIC8qIHVwZGF0ZSBCU1MgcGFyYW1zIGludG8gV0RJIHN0cnVjdHVyZSAqLworICAgV0RBX1VwZGF0ZUJTU1BhcmFtcyhwV0RBLCAmd2RpUG9zdEFzc29jUmVxUGFyYW0tPndkaUJTU1BhcmFtcywgCisgICAgICAgICAgICAgICAgICAgICAgICZwb3N0QXNzb2NSZXFQYXJhbS0+YWRkQnNzUGFyYW1zKSA7CisgICAvKiB1cGRhdGUgU1RBIHBhcmFtcyBpbnRvIFdESSBzdHJ1Y3R1cmUgKi8KKyAgIFdEQV9VcGRhdGVTVEFQYXJhbXMocFdEQSwgJndkaVBvc3RBc3NvY1JlcVBhcmFtLT53ZGlTVEFQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgICAgICAmcG9zdEFzc29jUmVxUGFyYW0tPmFkZFN0YVBhcmFtcykgOworICAgCisgICB3ZGlQb3N0QXNzb2NSZXFQYXJhbS0+d2RpQlNTUGFyYW1zLnVjRURDQVBhcmFtc1ZhbGlkID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QXNzb2NSZXFQYXJhbS0+YWRkQnNzUGFyYW1zLmhpZ2hQZXJmb3JtYW5jZTsKKyAgIFdEQV9VcGRhdGVFZGNhUGFyYW1zRm9yQUMocFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAmd2RpUG9zdEFzc29jUmVxUGFyYW0tPndkaUJTU1BhcmFtcy53ZGlCRUVEQ0FQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAmcG9zdEFzc29jUmVxUGFyYW0tPmFkZEJzc1BhcmFtcy5hY2JlKTsKKyAgIFdEQV9VcGRhdGVFZGNhUGFyYW1zRm9yQUMocFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAmd2RpUG9zdEFzc29jUmVxUGFyYW0tPndkaUJTU1BhcmFtcy53ZGlCS0VEQ0FQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAmcG9zdEFzc29jUmVxUGFyYW0tPmFkZEJzc1BhcmFtcy5hY2JrKTsKKyAgIFdEQV9VcGRhdGVFZGNhUGFyYW1zRm9yQUMocFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAmd2RpUG9zdEFzc29jUmVxUGFyYW0tPndkaUJTU1BhcmFtcy53ZGlWSUVEQ0FQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAmcG9zdEFzc29jUmVxUGFyYW0tPmFkZEJzc1BhcmFtcy5hY3ZpKTsKKyAgIFdEQV9VcGRhdGVFZGNhUGFyYW1zRm9yQUMocFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAmd2RpUG9zdEFzc29jUmVxUGFyYW0tPndkaUJTU1BhcmFtcy53ZGlWT0VEQ0FQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAmcG9zdEFzc29jUmVxUGFyYW0tPmFkZEJzc1BhcmFtcy5hY3ZvKTsKKworICAgLyogU3RvcmUgSW5pdCBSZXEgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICBwV0RBLT53ZGFNc2dQYXJhbSA9ICh2b2lkICopcG9zdEFzc29jUmVxUGFyYW0gOworCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKil3ZGlQb3N0QXNzb2NSZXFQYXJhbSA7CisKKyAgIHN0YXR1cyA9IFdESV9Qb3N0QXNzb2NSZXEod2RpUG9zdEFzc29jUmVxUGFyYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9Qb3N0QXNzb2NSc3BDYiApV0RBX1Bvc3RBc3NvY1JlcUNhbGxiYWNrLCBwV0RBKSA7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJGYWlsdXJlIGluIFBvc3QgQXNzb2MgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgICAgIHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtID0gTlVMTDsKKyAgICAgIHBXREEtPndkYU1zZ1BhcmFtID0gTlVMTDsKKworICAgICAgcG9zdEFzc29jUmVxUGFyYW0tPnN0YXR1cyA9IGVTSVJfRkFJTFVSRSA7CisKKyAgICAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9QT1NUX0FTU09DX1JTUCwgKHZvaWQgKilwb3N0QXNzb2NSZXFQYXJhbSwgMCkgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKyNlbmRpZgorCisvKgorICogRlVOQ1RJT046IFdEQV9BZGRTdGFSZXFDYWxsYmFjaworICogQUREIFNUQSByZXEgY2FsbGJhY2ssIHNlbmQgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX0FkZFN0YVJlcUNhbGxiYWNrKFdESV9Db25maWdTVEFSc3BQYXJhbXNUeXBlICp3ZGlDb25maWdTdGFSc3AsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsgCisgICB0V0RBX0NiQ29udGV4dCAqcFdEQTsgCisgICB0QWRkU3RhUGFyYW1zICphZGRTdGFSZXFQYXJhbTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIiVzOiBwV2RhUGFyYW1zIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorICAgcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBXZGFQYXJhbXMtPnBXZGFDb250ZXh0OworICAgYWRkU3RhUmVxUGFyYW0gPSAodEFkZFN0YVBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtOworCisgICBhZGRTdGFSZXFQYXJhbS0+c3RhdHVzID0gCisgICAgICAgICAgICAgICAgICAgQ09OVkVSVF9XREkyU0lSX1NUQVRVUyh3ZGlDb25maWdTdGFSc3AtPndkaVN0YXR1cykgOworCisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgPT0gd2RpQ29uZmlnU3RhUnNwLT53ZGlTdGF0dXMpCisgICB7CisgICAgICBhZGRTdGFSZXFQYXJhbS0+c3RhSWR4ID0gd2RpQ29uZmlnU3RhUnNwLT51Y1NUQUlkeDsKKyAgICAgIC8qVE9ETzogVU1BQyBzdHJ1Y3R1cmUgZG9lc24ndCBoYXZlIHRoZXNlIGZpZWxkcyovCisgICAgICAvKmFkZFN0YVJlcVBhcmFtLT4gPSB3ZGlDb25maWdTdGFSc3AtPnVjRHB1SW5kZXg7CisgICAgICBhZGRTdGFSZXFQYXJhbS0+ID0gd2RpQ29uZmlnU3RhUnNwLT51Y0JjYXN0RHB1SW5kZXg7CisgICAgICBhZGRTdGFSZXFQYXJhbS0+ID0gd2RpQ29uZmlnU3RhUnNwLT51Y0JjYXN0TWdtdERwdUlkeDsgKi8KKyAgICAgIGFkZFN0YVJlcVBhcmFtLT51Y1VjYXN0U2lnID0gd2RpQ29uZmlnU3RhUnNwLT51Y1VjYXN0U2lnOworICAgICAgYWRkU3RhUmVxUGFyYW0tPnVjQmNhc3RTaWcgPSB3ZGlDb25maWdTdGFSc3AtPnVjQmNhc3RTaWc7CisgICAgICAvKiB1cGRhdGUgc3RhSW5kZXggYXMgdmFsaWQgaW5kZXggZm9yIEJBIGlmIFNUQSBpcyBIVCBjYXBhYmxlKi8KKyAgICAgIGlmKGFkZFN0YVJlcVBhcmFtLT5zdGFUeXBlID09IFNUQV9FTlRSWV9QRUVSICYmIGFkZFN0YVJlcVBhcmFtLT5odENhcGFibGUpCisgICAgICB7CisgICAgICAgICBwV0RBLT53ZGFTdGFJbmZvW2FkZFN0YVJlcVBhcmFtLT5zdGFJZHhdLmJzc0lkeCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkaUNvbmZpZ1N0YVJzcC0+dWNCc3NJZHg7CisgICAgICAgICBwV0RBLT53ZGFTdGFJbmZvW2FkZFN0YVJlcVBhcmFtLT5zdGFJZHhdLnVjVmFsaWRTdGFJbmRleCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RBX1ZBTElEX1NUQV9JTkRFWCA7CisgICAgICB9CisgICAgICBpZihXRElfRFNfQWRkU1RBTWVtUG9vbChwV0RBLT5wV2RpQ29udGV4dCwgd2RpQ29uZmlnU3RhUnNwLT51Y1NUQUlkeCkpCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICIlczogYWRkIFNUQSBpbnRvIG1lbXBvb2wgZmFpbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgICAgIHJldHVybiA7CisgICAgICB9CisgICB9CisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKworICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX0FERF9TVEFfUlNQLCAodm9pZCAqKWFkZFN0YVJlcVBhcmFtLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0NvbmZpZ1N0YVJlcQorICogVHJpZ2dlciBDb25maWcgU1RBIHByb2Nlc3NpbmcgaW4gV0RJCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzQWRkU3RhUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBZGRTdGFQYXJhbXMgKmFkZFN0YVJlcVBhcmFtKQoreworCisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisKKyAgIFdESV9Db25maWdTVEFSZXFQYXJhbXNUeXBlICp3ZGlDb25maWdTdGFSZXFQYXJhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0NvbmZpZ1NUQVJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9Db25maWdTVEFSZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpQ29uZmlnU3RhUmVxUGFyYW0pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaUNvbmZpZ1N0YVJlcVBhcmFtKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHZvc19tZW1fc2V0KHdkaUNvbmZpZ1N0YVJlcVBhcmFtLCBzaXplb2YoV0RJX0NvbmZpZ1NUQVJlcVBhcmFtc1R5cGUpLCAwKTsKKworICAgLyogdXBkYXRlIFNUQSBwYXJhbXMgaW50byBXREkgc3RydWN0dXJlICovCisgICBXREFfVXBkYXRlU1RBUGFyYW1zKHBXREEsICZ3ZGlDb25maWdTdGFSZXFQYXJhbS0+d2RpUmVxSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgIGFkZFN0YVJlcVBhcmFtKSA7CisKKyAgIC8qIFN0b3JlIEluaXQgUmVxIHBvaW50ZXIsIGFzIHRoaXMgd2lsbCBiZSB1c2VkIGZvciByZXNwb25zZSAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IGFkZFN0YVJlcVBhcmFtOworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSB3ZGlDb25maWdTdGFSZXFQYXJhbTsKKworICAgc3RhdHVzID0gV0RJX0NvbmZpZ1NUQVJlcSh3ZGlDb25maWdTdGFSZXFQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0NvbmZpZ1NUQVJzcENiIClXREFfQWRkU3RhUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpIDsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gQ29uZmlnIFNUQSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICAgICBhZGRTdGFSZXFQYXJhbS0+c3RhdHVzID0gZVNJUl9GQUlMVVJFIDsKKworICAgICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX0FERF9TVEFfUlNQLCAodm9pZCAqKWFkZFN0YVJlcVBhcmFtLCAwKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9EZWxCU1NSZXFDYWxsYmFjaworICogRGVucyBERUwgQlNTIFJTUCBiYWNrIHRvIFBFCisgKi8gCit2b2lkIFdEQV9EZWxCU1NSZXFDYWxsYmFjayhXRElfRGVsQlNTUnNwUGFyYW1zVHlwZSAqd2RpRGVsQnNzUnNwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOyAKKyAgIHREZWxldGVCc3NQYXJhbXMgKmRlbEJzc1JlcVBhcmFtOworICAgdEFOSV9VOCAgc3RhSWR4LHRpZDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisgICBkZWxCc3NSZXFQYXJhbSA9ICh0RGVsZXRlQnNzUGFyYW1zICopcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW07CisKKyAgIGRlbEJzc1JlcVBhcmFtLT5zdGF0dXMgPSBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHdkaURlbEJzc1JzcC0+d2RpU3RhdHVzKSA7CisKKyAgIGlmKFdESV9TVEFUVVNfU1VDQ0VTUyA9PSB3ZGlEZWxCc3NSc3AtPndkaVN0YXR1cykKKyAgIHsKKyAgICAgIHZvc19tZW1fY29weShkZWxCc3NSZXFQYXJhbS0+YnNzaWQsIHdkaURlbEJzc1JzcC0+bWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkgOworICAgfQorCisgICBpZihXRElfRFNfR2V0U3RhSWR4RnJvbUJzc0lkeChwV0RBLT5wV2RpQ29udGV4dCwgZGVsQnNzUmVxUGFyYW0tPmJzc0lkeCwgJnN0YUlkeCkpCisgICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBHZXQgU1RBIGluZGV4IGZyb20gQlNTIGluZGV4IEZhaWwiLCBfX0ZVTkNUSU9OX18pOworICAgICBWT1NfQVNTRVJUKDApIDsKKyAgIH0KKworICAgaWYoV0RJX0RTX0RlbFNUQU1lbVBvb2wocFdEQS0+cFdkaUNvbnRleHQsIHN0YUlkeCkpCisgICB7CisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBERUwgU1RBIGZyb20gTWVtUG9vbCBGYWlsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgVk9TX0FTU0VSVCgwKSA7CisgICB9CisKKyAgIGlmKFdESV9EU19DbGVhclN0YUlkeFBlckJzc0lkeChwV0RBLT5wV2RpQ29udGV4dCwgZGVsQnNzUmVxUGFyYW0tPmJzc0lkeCwgc3RhSWR4KSkKKyAgIHsKKyAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IENsZWFyIFNUQSBpbmRleCBmb3JtIHRhYmxlIEZhaWwiLCBfX0ZVTkNUSU9OX18pOworICAgICBWT1NfQVNTRVJUKDApIDsKKyAgIH0KKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisKKyAgIC8qIHJlc2V0IHRoZSB0aGUgc3lzdGVtIHJvbGUqLworICAgcFdEQS0+d2RhR2xvYmFsU3lzdGVtUm9sZSA9IGVTWVNURU1fVU5LTk9XTl9ST0xFOworICAgCisgICAvKiBSZXNldCB0aGUgQkEgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLworICAgZm9yKHN0YUlkeD0wOyBzdGFJZHggPCBXREFfTUFYX1NUQTsgc3RhSWR4KyspCisgICB7CisgICAgICBpZiggcFdEQS0+d2RhU3RhSW5mb1tzdGFJZHhdLmJzc0lkeCA9PSB3ZGlEZWxCc3NSc3AtPnVjQnNzSWR4ICkKKyAgICAgIHsKKyAgICAgICAgIHBXREEtPndkYVN0YUluZm9bc3RhSWR4XS51Y1ZhbGlkU3RhSW5kZXggPSBXREFfSU5WQUxJRF9TVEFfSU5ERVg7CisgICAgICAgICBwV0RBLT53ZGFTdGFJbmZvW3N0YUlkeF0udWNVc2VCYUJpdG1hcCA9IDA7CisgICAgICAgICAvKiBSZXNldCBmcmFtZXNUeGVkIGNvdW50ZXJzIGhlcmUgKi8KKyAgICAgICAgIGZvcih0aWQgPSAwOyB0aWQgPCBTVEFDRkdfTUFYX1RDOyB0aWQrKykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBXREEtPndkYVN0YUluZm9bc3RhSWR4XS5mcmFtZXNUeGVkW3RpZF0gPSAwOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfREVMRVRFX0JTU19SU1AsICh2b2lkICopZGVsQnNzUmVxUGFyYW0gLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc0RlbEJzc1JlcQorICogSW5pdCBERUwgQlNTIHJlcSB3aXRoIFdESQorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0RlbEJzc1JlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERlbGV0ZUJzc1BhcmFtcyAqZGVsQnNzUGFyYW0pCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisKKyAgIFdESV9EZWxCU1NSZXFQYXJhbXNUeXBlICp3ZGlEZWxCc3NSZXFQYXJhbSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0RlbEJTU1JlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9EZWxCU1NSZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpRGVsQnNzUmVxUGFyYW0pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaURlbEJzc1JlcVBhcmFtKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaURlbEJzc1JlcVBhcmFtLT51Y0Jzc0lkeCA9IGRlbEJzc1BhcmFtLT5ic3NJZHg7CisgICB3ZGlEZWxCc3NSZXFQYXJhbS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMIDsKKyAgIAorICAgLyogU3RvcmUgSW5pdCBSZXEgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gZGVsQnNzUGFyYW07CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaURlbEJzc1JlcVBhcmFtOworCisgICBzdGF0dXMgPSBXRElfRGVsQlNTUmVxKHdkaURlbEJzc1JlcVBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIChXRElfRGVsQlNTUnNwQ2IgKVdEQV9EZWxCU1NSZXFDYWxsYmFjaywgcFdkYVBhcmFtcykgOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBEZWwgQlNTIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICAgICBkZWxCc3NQYXJhbS0+c3RhdHVzID0gZVNJUl9GQUlMVVJFIDsKKyAgICAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9ERUxFVEVfQlNTX1JTUCwgKHZvaWQgKilkZWxCc3NQYXJhbSwgMCkgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfRGVsU1RBUmVxQ2FsbGJhY2sKKyAqIERlbnMgREVMIFNUQSBSU1AgYmFjayB0byBQRQorICovIAordm9pZCBXREFfRGVsU1RBUmVxQ2FsbGJhY2soV0RJX0RlbFNUQVJzcFBhcmFtc1R5cGUgKndkaURlbFN0YVJzcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsgCisgICB0V0RBX0NiQ29udGV4dCAqcFdEQTsgCisgICB0RGVsZXRlU3RhUGFyYW1zICpkZWxTdGFSZXFQYXJhbTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisgICBkZWxTdGFSZXFQYXJhbSA9ICh0RGVsZXRlU3RhUGFyYW1zICopcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW07CisKKyAgIGRlbFN0YVJlcVBhcmFtLT5zdGF0dXMgPSBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHdkaURlbFN0YVJzcC0+d2RpU3RhdHVzKSA7CisKKyAgIGlmKFdESV9TVEFUVVNfU1VDQ0VTUyA9PSB3ZGlEZWxTdGFSc3AtPndkaVN0YXR1cykKKyAgIHsKKyAgICAgIGlmKFdESV9EU19EZWxTVEFNZW1Qb29sKHBXREEtPnBXZGlDb250ZXh0LCB3ZGlEZWxTdGFSc3AtPnVjU1RBSWR4KSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBERUwgU1RBIGZyb20gTWVtUG9vbCBGYWlsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgfQorICAgICAgZGVsU3RhUmVxUGFyYW0tPnN0YUlkeCA9IHdkaURlbFN0YVJzcC0+dWNTVEFJZHggOworICAgfQorICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisKKyAgIC8qUmVzZXQgdGhlIEJBIGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBTVEFJZHggKi8KKyAgIHBXREEtPndkYVN0YUluZm9bd2RpRGVsU3RhUnNwLT51Y1NUQUlkeF0udWNWYWxpZFN0YUluZGV4ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfSU5WQUxJRF9TVEFfSU5ERVg7CisgICBwV0RBLT53ZGFTdGFJbmZvW3dkaURlbFN0YVJzcC0+dWNTVEFJZHhdLnVjVXNlQmFCaXRtYXAgPSAwOworICAgCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfREVMRVRFX1NUQV9SU1AsICh2b2lkICopZGVsU3RhUmVxUGFyYW0gLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NEZWxTdGFSZXEKKyAqIEluaXQgREVMIFNUQSByZXEgd2l0aCBXREkKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NEZWxTdGFSZXEodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RGVsZXRlU3RhUGFyYW1zICpkZWxTdGFQYXJhbSkKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTIDsKKworICAgV0RJX0RlbFNUQVJlcVBhcmFtc1R5cGUgKndkaURlbFN0YVJlcVBhcmFtID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfRGVsU1RBUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0RlbFNUQVJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlEZWxTdGFSZXFQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpRGVsU3RhUmVxUGFyYW0pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgd2RpRGVsU3RhUmVxUGFyYW0tPnVjU1RBSWR4ID0gZGVsU3RhUGFyYW0tPnN0YUlkeCA7CisgICB3ZGlEZWxTdGFSZXFQYXJhbS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMIDsKKworICAgLyogU3RvcmUgSW5pdCBSZXEgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gZGVsU3RhUGFyYW07CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaURlbFN0YVJlcVBhcmFtOworCisgICBzdGF0dXMgPSBXRElfRGVsU1RBUmVxKHdkaURlbFN0YVJlcVBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIChXRElfRGVsU1RBUnNwQ2IgKVdEQV9EZWxTVEFSZXFDYWxsYmFjaywgcFdkYVBhcmFtcykgOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsdXJlIGluIERlbCBTVEEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSBzdGF0dXMgPSAlZCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICAgICBkZWxTdGFQYXJhbS0+c3RhdHVzID0gZVNJUl9GQUlMVVJFIDsKKyAgICAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9ERUxFVEVfU1RBX1JTUCwgKHZvaWQgKilkZWxTdGFQYXJhbSwgMCkgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKwordm9pZCBXREFfUHJvY2Vzc0FkZFN0YVNlbGZSc3AoV0RJX0FkZFNUQVNlbGZSc3BQYXJhbXNUeXBlKiBwd2RpQWRkU1RBU2VsZlJzcCwgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7IAorICAgdFdEQV9DYkNvbnRleHQgKnBXREE7IAorICAgdEFkZFN0YVNlbGZQYXJhbXMgKnBBZGRTdGFTZWxmUnNwID0gTlVMTDsgCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIHBBZGRTdGFTZWxmUnNwID0gKHRBZGRTdGFTZWxmUGFyYW1zKilwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbTsKKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKworICAgcEFkZFN0YVNlbGZSc3AtPnN0YXR1cyA9IENPTlZFUlRfV0RJMlNJUl9TVEFUVVMocHdkaUFkZFNUQVNlbGZSc3AtPndkaVN0YXR1cyk7CisgICB2b3NfbWVtX2NvcHkocEFkZFN0YVNlbGZSc3AtPnNlbGZNYWNBZGRyLCAKKyAgICAgICAgICAgICAgICBwd2RpQWRkU1RBU2VsZlJzcC0+bWFjU2VsZlN0YSwgCisgICAgICAgICAgICAgICAgc2l6ZW9mKHBBZGRTdGFTZWxmUnNwLT5zZWxmTWFjQWRkcikpOworCisgICBXREFfU2VuZE1zZyggcFdEQSwgV0RBX0FERF9TVEFfU0VMRl9SU1AsICh2b2lkICopcEFkZFN0YVNlbGZSc3AsIDApIDsKKworICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc0FkZFN0YVNlbGZSZXEKKyAqIAorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0FkZFN0YVNlbGZSZXEoIHRXREFfQ2JDb250ZXh0ICpwV0RBLCB0cEFkZFN0YVNlbGZQYXJhbXMgcEFkZFN0YVNlbGZSZXEpCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIFdESV9BZGRTVEFTZWxmUmVxUGFyYW1zVHlwZSAqd2RpQWRkU3RhU2VsZlJlcSA9IAorICAgICAgKFdESV9BZGRTVEFTZWxmUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgc2l6ZW9mKFdESV9BZGRTVEFTZWxmUmVxUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zOyAKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworICAgaWYoIE5VTEwgPT0gd2RpQWRkU3RhU2VsZlJlcSApCisgICB7CisgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgIiAsX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiggVk9TX1NUQVRVU19FX05PTUVNICk7CisgICB9CisKKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisKKyAgIGlmKCBOVUxMID09IHBXZGFQYXJhbXMgKQorICAgeworICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICIgLF9fRlVOQ1RJT05fXyk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpQWRkU3RhU2VsZlJlcSkgOworICAgICAgcmV0dXJuKCBWT1NfU1RBVFVTX0VfTk9NRU0gKTsKKyAgIH0KKworICAgd2RpQWRkU3RhU2VsZlJlcS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworCisgICB2b3NfbWVtX2NvcHkoIHdkaUFkZFN0YVNlbGZSZXEtPndkaUFkZFNUQVNlbGZJbmZvLnNlbGZNYWNBZGRyLCBwQWRkU3RhU2VsZlJlcS0+c2VsZk1hY0FkZHIsIDYpOworICAgLyogU3RvcmUgSW5pdCBSZXEgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcEFkZFN0YVNlbGZSZXE7CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaUFkZFN0YVNlbGZSZXE7IAorCisgICBzdGF0dXMgPSBXRElfQWRkU1RBU2VsZlJlcSggd2RpQWRkU3RhU2VsZlJlcSwgV0RBX1Byb2Nlc3NBZGRTdGFTZWxmUnNwLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBBZGQgU2VsZiBTdGEgUmVxdWVzdCBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgc3RhdHVzID0gJWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgICAgcEFkZFN0YVNlbGZSZXEtPnN0YXR1cyA9IGVTSVJfRkFJTFVSRSA7CisgICAgICBXREFfU2VuZE1zZyggcFdEQSwgV0RBX0FERF9TVEFfU0VMRl9SU1AsICh2b2lkICopcEFkZFN0YVNlbGZSZXEsIDApIDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0RlbFNUQVNlbGZSZXNwQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfRGVsU1RBU2VsZlJlc3BDYWxsYmFjayhXRElfRGVsU1RBU2VsZlJzcFBhcmFtc1R5cGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlEZWxTdGFTZWxmUnNwUGFyYW1zICwgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgICAgICAgICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICAgICAgICAqcFdEQTsgCisgICB0RGVsU3RhU2VsZlBhcmFtcyAgICAgKmRlbFN0YVNlbGZQYXJhbXM7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYgKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBXZGFQYXJhbXMgcG9pbnRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuOworICAgfQorCisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisgICBkZWxTdGFTZWxmUGFyYW1zID0gKHREZWxTdGFTZWxmUGFyYW1zICopcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW07CisKKyAgIGRlbFN0YVNlbGZQYXJhbXMtPnN0YXR1cyA9IAorICAgICAgICAgICAgICAgQ09OVkVSVF9XREkyU0lSX1NUQVRVUyh3ZGlEZWxTdGFTZWxmUnNwUGFyYW1zLT53ZGlTdGF0dXMpIDsKKyAgIAorICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICAKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9ERUxfU1RBX1NFTEZfUlNQLCAodm9pZCAqKWRlbFN0YVNlbGZQYXJhbXMgLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0RlbFNUQVNlbGZSZXFDYWxsYmFjaworICogCisgKi8KK3ZvaWQgV0RBX0RlbFNUQVNlbGZSZXFDYWxsYmFjayhXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgICAgICAgICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICAgICAgICAqcFdEQTsgCisgICB0RGVsU3RhU2VsZlBhcmFtcyAgICAgKmRlbFN0YVNlbGZQYXJhbXM7CisgICAKKyAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIjwtLS0tLS0gJXMsIHdkaVN0YXR1czogJWQgcFdkYVBhcmFtczogMHgleCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2RpU3RhdHVzLCBwV2RhUGFyYW1zKTsgCisKKyAgIGlmIChOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogSW52YWxpZCBwV2RhUGFyYW1zIHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBXZGFQYXJhbXMtPnBXZGFDb250ZXh0OworICAgZGVsU3RhU2VsZlBhcmFtcyA9ICh0RGVsU3RhU2VsZlBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtOworCisgICBkZWxTdGFTZWxmUGFyYW1zLT5zdGF0dXMgPSBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHdkaVN0YXR1cykgOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUod2RpU3RhdHVzKSkKKyAgIHsKKyAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKyAgICAgICAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9ERUxfU1RBX1NFTEZfUlNQLCAodm9pZCAqKWRlbFN0YVNlbGZQYXJhbXMgLCAwKSA7CisgICB9CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0RlbFNUQVNlbGZSZXEKKyAqIFRyaWdnZXIgQ29uZmlnIFNUQSBwcm9jZXNzaW5nIGluIFdESQorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0RlbFNUQVNlbGZSZXEodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERlbFN0YVNlbGZQYXJhbXMqIHBEZWxTdGFTZWxmUmVxUGFyYW0pCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gTlVMTDsgCisgICBXRElfRGVsU1RBU2VsZlJlcVBhcmFtc1R5cGUgKndkaURlbFN0YVNlbGZSZXEgPSAKKyAgICAgICAgICAgICAgICAoV0RJX0RlbFNUQVNlbGZSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0RlbFNUQVNlbGZSZXFQYXJhbXNUeXBlKSkgOworCisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKyAgIGlmKCBOVUxMID09IHdkaURlbFN0YVNlbGZSZXEgKQorICAgeworICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICIgLF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4oIFZPU19TVEFUVVNfRV9OT01FTSApOworICAgfQorICAgCisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoIE5VTEwgPT0gcFdkYVBhcmFtcyApCisgICB7CisgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICIgLF9fRlVOQ1RJT05fXyk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpRGVsU3RhU2VsZlJlcSkgOworICAgICAgcmV0dXJuKCBWT1NfU1RBVFVTX0VfTk9NRU0gKTsKKyAgIH0KKworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgLyogU3RvcmUgcGFyYW0gcG9pbnRlciBhcyBwYXNzZWQgaW4gYnkgY2FsbGVyICovCisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IHBEZWxTdGFTZWxmUmVxUGFyYW07CisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKil3ZGlEZWxTdGFTZWxmUmVxOworCisgICB2b3NfbWVtX2NvcHkoIHdkaURlbFN0YVNlbGZSZXEtPndkaURlbFN0YVNlbGZJbmZvLnNlbGZNYWNBZGRyLCAKKyAgICAgICAgICAgICAgICAgcERlbFN0YVNlbGZSZXFQYXJhbS0+c2VsZk1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgCisgICAgd2RpRGVsU3RhU2VsZlJlcS0+d2RpUmVxU3RhdHVzQ0IgPSBXREFfRGVsU1RBU2VsZlJlcUNhbGxiYWNrOworICAgIHdkaURlbFN0YVNlbGZSZXEtPnBVc2VyRGF0YSA9IHBXZGFQYXJhbXM7CisKKyAgIHN0YXR1cyA9IFdESV9EZWxTVEFTZWxmUmVxKHdkaURlbFN0YVNlbGZSZXEsIAorICAgICAgICAgICAgICAgICAgICAgIChXRElfRGVsU1RBU2VsZlJzcENiKVdEQV9EZWxTVEFTZWxmUmVzcENhbGxiYWNrLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluIERlbCBTdGEgU2VsZiBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICAgICBwRGVsU3RhU2VsZlJlcVBhcmFtLT5zdGF0dXMgPSBlU0lSX0ZBSUxVUkUgOworICAgICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX0RFTF9TVEFfU0VMRl9SU1AsICh2b2lkICopcERlbFN0YVNlbGZSZXFQYXJhbSwgMCkgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworCisKKy8qCisgKiBGVU5DVElPTjogV0RBX1NlbmRNc2cKKyAqIFNlbmQgTWVzc2FnZSBiYWNrIHRvIFBFCisgKi8gCit2b2lkIFdEQV9TZW5kTXNnKHRXREFfQ2JDb250ZXh0ICpwV0RBLCB0QU5JX1UxNiBtc2dUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQm9keXB0ciwgdEFOSV9VMzIgYm9keVZhbCkKK3sKKyAgIHRTaXJNc2dRIG1zZyA9IHswfSA7CisgICB0QU5JX1UzMiBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1MgOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCApVk9TX0dFVF9NQUNfQ1RYVChwV0RBLT5wVm9zQ29udGV4dCk7CisKKyAgIG1zZy50eXBlICAgICAgICA9IG1zZ1R5cGU7CisgICBtc2cuYm9keXZhbCAgICAgPSBib2R5VmFsOworICAgbXNnLmJvZHlwdHIgICAgID0gcEJvZHlwdHI7CisKKyAgIHN0YXR1cyA9IGxpbVBvc3RNc2dBcGkocE1hYywgJm1zZyk7CisKKyAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gc3RhdHVzKQorICAgeworICAgICAgaWYoTlVMTCAhPSBwQm9keXB0cikKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZShwQm9keXB0cik7CisgICAgICB9CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBsaW1Qb3N0TXNnQXBpIGlzIGZhaWxlZCAiICxfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICB9CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1VwZGF0ZUJTU1BhcmFtcworICogVHJhbnNsYXRlZCBXREEvUEUgQlNTIGluZm8gaW50byBXREkgQlNTIGluZm8uLgorICovCit2b2lkIFdEQV9VcGRhdGVCU1NQYXJhbXModFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9Db25maWdCU1NSZXFJbmZvVHlwZSAqd2RpQnNzUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICB0QWRkQnNzUGFyYW1zICp3ZGFCc3NQYXJhbXMpCit7CisgICB2X1U4X3Qga2V5SW5kZXggPSAwOworCisgICAvKiBjb3B5IGJzc1JlcSBQYXJhbXMgdG8gV0RJIHN0cnVjdHVyZSAqLworICAgdm9zX21lbV9jb3B5KHdkaUJzc1BhcmFtcy0+bWFjQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGFCc3NQYXJhbXMtPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKSA7CisgICB2b3NfbWVtX2NvcHkod2RpQnNzUGFyYW1zLT5tYWNTZWxmQWRkciwgd2RhQnNzUGFyYW1zLT5zZWxmTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpIDsKKyAgIHdkaUJzc1BhcmFtcy0+d2RpQlNTVHlwZSA9IHdkYUJzc1BhcmFtcy0+YnNzVHlwZSA7CisgICB3ZGlCc3NQYXJhbXMtPnVjT3Blck1vZGUgPSB3ZGFCc3NQYXJhbXMtPm9wZXJNb2RlIDsKKyAgIHdkaUJzc1BhcmFtcy0+d2RpTldUeXBlICAgPSB3ZGFCc3NQYXJhbXMtPm53VHlwZSA7CisKKyAgIHdkaUJzc1BhcmFtcy0+dWNTaG9ydFNsb3RUaW1lU3VwcG9ydGVkID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RhQnNzUGFyYW1zLT5zaG9ydFNsb3RUaW1lU3VwcG9ydGVkIDsKKworICAgd2RpQnNzUGFyYW1zLT51Y2xsYUNvZXhpc3QgID0gd2RhQnNzUGFyYW1zLT5sbGFDb2V4aXN0IDsKKyAgIHdkaUJzc1BhcmFtcy0+dWNsbGJDb2V4aXN0ICA9IHdkYUJzc1BhcmFtcy0+bGxiQ29leGlzdCA7CisgICB3ZGlCc3NQYXJhbXMtPnVjbGxnQ29leGlzdCAgPSB3ZGFCc3NQYXJhbXMtPmxsZ0NvZXhpc3QgOworICAgd2RpQnNzUGFyYW1zLT51Y0hUMjBDb2V4aXN0ID0gd2RhQnNzUGFyYW1zLT5odDIwQ29leGlzdCA7CisgICB3ZGlCc3NQYXJhbXMtPnVjT2Jzc1Byb3RFbmFibGVkID0gd2RhQnNzUGFyYW1zLT5vYnNzUHJvdEVuYWJsZWQgOworCisgICB3ZGlCc3NQYXJhbXMtPnVjbGxuTm9uR0ZDb2V4aXN0ID0gd2RhQnNzUGFyYW1zLT5sbG5Ob25HRkNvZXhpc3QgOworICAgd2RpQnNzUGFyYW1zLT51Y1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RhQnNzUGFyYW1zLT5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgOworCisgICB3ZGlCc3NQYXJhbXMtPnVjUklGU01vZGUgPSB3ZGFCc3NQYXJhbXMtPmZSSUZTTW9kZSA7CisgICB3ZGlCc3NQYXJhbXMtPnVzQmVhY29uSW50ZXJ2YWwgPSB3ZGFCc3NQYXJhbXMtPmJlYWNvbkludGVydmFsIDsKKworICAgd2RpQnNzUGFyYW1zLT51Y0RUSU1QZXJpb2QgPSB3ZGFCc3NQYXJhbXMtPmR0aW1QZXJpb2QgOworCisgICB3ZGlCc3NQYXJhbXMtPnVjVFhDaGFubmVsV2lkdGhTZXQgPSB3ZGFCc3NQYXJhbXMtPnR4Q2hhbm5lbFdpZHRoU2V0IDsKKyAgIHdkaUJzc1BhcmFtcy0+dWNDdXJyZW50T3BlckNoYW5uZWwgPSB3ZGFCc3NQYXJhbXMtPmN1cnJlbnRPcGVyQ2hhbm5lbCA7CisgICB3ZGlCc3NQYXJhbXMtPnVjQ3VycmVudEV4dENoYW5uZWwgPSB3ZGFCc3NQYXJhbXMtPmN1cnJlbnRFeHRDaGFubmVsIDsKKyAgIHdkaUJzc1BhcmFtcy0+YkhpZGRlblNTSURFbiA9IHdkYUJzc1BhcmFtcy0+YkhpZGRlblNTSURFbiA7CisKKyAgIC8qIGNvcHkgU1NJRCBpbnRvIFdESSBzdHJ1Y3R1cmUgKi8KKyAgIHdkaUJzc1BhcmFtcy0+d2RpU1NJRC51Y0xlbmd0aCA9IHdkYUJzc1BhcmFtcy0+c3NJZC5sZW5ndGggOworICAgdm9zX21lbV9jb3B5KHdkaUJzc1BhcmFtcy0+d2RpU1NJRC5zU1NJRCwKKyAgICAgICAgICAgICAgICAgd2RhQnNzUGFyYW1zLT5zc0lkLnNzSWQsIHdkYUJzc1BhcmFtcy0+c3NJZC5sZW5ndGgpIDsKKworICAgV0RBX1VwZGF0ZVNUQVBhcmFtcyhwV0RBLCAmd2RpQnNzUGFyYW1zLT53ZGlTVEFDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgJndkYUJzc1BhcmFtcy0+c3RhQ29udGV4dCkgOworCisgICB3ZGlCc3NQYXJhbXMtPndkaUFjdGlvbiA9IHdkYUJzc1BhcmFtcy0+dXBkYXRlQnNzOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgd2RpQnNzUGFyYW1zLT5jTWF4VHhQb3dlciA9IHdkYUJzc1BhcmFtcy0+bWF4VHhQb3dlcjsKKyNlbmRpZgorCisgICB3ZGlCc3NQYXJhbXMtPnVjUGVyc29uYSA9IHdkYUJzc1BhcmFtcy0+aGFsUGVyc29uYTsKKworICAgd2RpQnNzUGFyYW1zLT5iU3BlY3RydW1NZ3RFbiA9IHdkYUJzc1BhcmFtcy0+YlNwZWN0cnVtTWd0RW5hYmxlZDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgICB3ZGlCc3NQYXJhbXMtPmJFeHRTZXRTdGFLZXlQYXJhbVZhbGlkID0gd2RhQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbVZhbGlkOworCisgICBpZih3ZGlCc3NQYXJhbXMtPmJFeHRTZXRTdGFLZXlQYXJhbVZhbGlkKQorICAgeworICAgICAgLyogY29weSBzZXQgU1RBIGtleSBwYXJhbXMgdG8gV0RJIHN0cnVjdHVyZSAqLworICAgICAgd2RpQnNzUGFyYW1zLT53ZGlFeHRTZXRLZXlQYXJhbS51Y1NUQUlkeCA9IAorICAgICAgICAgd2RhQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5zdGFJZHg7CisgICAgICB3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLndkaUVuY1R5cGUgPSAKKyAgICAgICAgIHdkYUJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0uZW5jVHlwZTsKKyAgICAgIHdkaUJzc1BhcmFtcy0+d2RpRXh0U2V0S2V5UGFyYW0ud2RpV0VQVHlwZSA9IAorICAgICAgICAgd2RhQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS53ZXBUeXBlOworICAgICAgd2RpQnNzUGFyYW1zLT53ZGlFeHRTZXRLZXlQYXJhbS51Y0RlZldFUElkeCA9IAorICAgICAgICAgd2RhQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5kZWZXRVBJZHg7CisKKyAgICAgIGlmKHdkYUJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0uZW5jVHlwZSAhPSBlU0lSX0VEX05PTkUpCisgICAgICB7CisgICAgICAgICBpZiggKHdkaUJzc1BhcmFtcy0+d2RpRXh0U2V0S2V5UGFyYW0ud2RpV0VQVHlwZSA9PSBlU0lSX1dFUF9TVEFUSUMpICYmIAorICAgICAgICAgICAgIChXREFfSU5WQUxJRF9LRVlfSU5ERVggPT0gd2RhQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5kZWZXRVBJZHgpICYmCisgICAgICAgICAgICAgKGVTWVNURU1fQVBfUk9MRSAhPSBwV0RBLT53ZGFHbG9iYWxTeXN0ZW1Sb2xlKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFdEQV9HZXRXZXBLZXlzRnJvbUNmZyggcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLnVjRGVmV0VQSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndkaUJzc1BhcmFtcy0+d2RpRXh0U2V0S2V5UGFyYW0udWNOdW1LZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLndkaUtleSApOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgICAgIGZvcigga2V5SW5kZXg9MDsga2V5SW5kZXggPCBTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUluZGV4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVtrZXlJbmRleF0ua2V5SWQgPQorICAgICAgICAgICAgICAgICAgd2RhQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlba2V5SW5kZXhdLmtleUlkOworICAgICAgICAgICAgICAgd2RpQnNzUGFyYW1zLT53ZGlFeHRTZXRLZXlQYXJhbS53ZGlLZXlba2V5SW5kZXhdLnVuaWNhc3QgPQorICAgICAgICAgICAgICAgICAgd2RhQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlba2V5SW5kZXhdLnVuaWNhc3Q7CisgICAgICAgICAgICAgICB3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVtrZXlJbmRleF0ua2V5RGlyZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgIHdkYUJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5W2tleUluZGV4XS5rZXlEaXJlY3Rpb247CisKKyAgICAgICAgICAgICAgIHZvc19tZW1fY29weSh3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVtrZXlJbmRleF0ua2V5UnNjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGFCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleVtrZXlJbmRleF0ua2V5UnNjLCBXTEFOX01BWF9LRVlfUlNDX0xFTik7CisgICAgICAgICAgICAgICB3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVtrZXlJbmRleF0ucGFlUm9sZSA9CisgICAgICAgICAgICAgICAgICB3ZGFCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleVtrZXlJbmRleF0ucGFlUm9sZTsKKyAgICAgICAgICAgICAgIHdkaUJzc1BhcmFtcy0+d2RpRXh0U2V0S2V5UGFyYW0ud2RpS2V5W2tleUluZGV4XS5rZXlMZW5ndGggPQorICAgICAgICAgICAgICAgICAgd2RhQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlba2V5SW5kZXhdLmtleUxlbmd0aDsKKyAgICAgICAgICAgICAgIHZvc19tZW1fY29weSh3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVtrZXlJbmRleF0ua2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGFCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleVtrZXlJbmRleF0ua2V5LCBTSVJfTUFDX01BWF9LRVlfTEVOR1RIKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2RpQnNzUGFyYW1zLT53ZGlFeHRTZXRLZXlQYXJhbS51Y051bUtleXMgPSAKKyAgICAgICAgICAgICAgIFNJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVM7CisjZWxzZQorICAgICAgICAgICAgd2RpQnNzUGFyYW1zLT53ZGlFeHRTZXRLZXlQYXJhbS53ZGlLZXlbMF0ua2V5SWQgPQorICAgICAgICAgICAgICAgd2RhQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbS5rZXkua2V5SWQ7CisgICAgICAgICAgICB3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVswXS51bmljYXN0ID0gCisgICAgICAgICAgICAgICB3ZGFCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleS51bmljYXN0OworICAgICAgICAgICAgd2RpQnNzUGFyYW1zLT53ZGlFeHRTZXRLZXlQYXJhbS53ZGlLZXlbMF0ua2V5RGlyZWN0aW9uID0KKyAgICAgICAgICAgICAgIHdkYUJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5LmtleURpcmVjdGlvbjsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSh3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVswXS5rZXlSc2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHdkYUJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5LmtleVJzYywgV0xBTl9NQVhfS0VZX1JTQ19MRU4pOworICAgICAgICAgICAgd2RpQnNzUGFyYW1zLT53ZGlFeHRTZXRLZXlQYXJhbS53ZGlLZXlbMF0ucGFlUm9sZSA9CisgICAgICAgICAgICAgICB3ZGFCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLmtleS5wYWVSb2xlOworICAgICAgICAgICAgd2RpQnNzUGFyYW1zLT53ZGlFeHRTZXRLZXlQYXJhbS53ZGlLZXlbMF0ua2V5TGVuZ3RoID0KKyAgICAgICAgICAgICAgIHdkYUJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5LmtleUxlbmd0aDsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSh3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVswXS5rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgIHdkYUJzc1BhcmFtcy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5W2tleUluZGV4XS5rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUFYX0tFWV9MRU5HVEgpOworICAgICAgICAgICAgd2RpQnNzUGFyYW1zLT53ZGlFeHRTZXRLZXlQYXJhbS51Y051bUtleXMgPSAxOworI2VuZGlmCisgICAgICAgICB9CisgICAgICB9CisgICAgICB3ZGlCc3NQYXJhbXMtPndkaUV4dFNldEtleVBhcmFtLnVjU2luZ2xlVGlkUmMgPSB3ZGFCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtLnNpbmdsZVRpZFJjOworICAgfQorICAgZWxzZSAvKiB3ZGFCc3NQYXJhbXMtPmJFeHRTZXRTdGFLZXlQYXJhbVZhbGlkIGlzIG5vdCB2YWxpZCAqLworICAgeworICAgICAgdm9zX21lbV96ZXJvKCAmd2RhQnNzUGFyYW1zLT5leHRTZXRTdGFLZXlQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgIHNpemVvZih3ZGFCc3NQYXJhbXMtPmV4dFNldFN0YUtleVBhcmFtKSApOworICAgfQorI2VuZGlmIC8qV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIqLworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9VcGRhdGVTVEFQYXJhbXMKKyAqIFRyYW5zbGF0ZWQgV0RBL1BFIEJTUyBpbmZvIGludG8gV0RJIEJTUyBpbmZvLi4KKyAqLwordm9pZCBXREFfVXBkYXRlU1RBUGFyYW1zKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfQ29uZmlnU3RhUmVxSW5mb1R5cGUgKndkaVN0YVBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QWRkU3RhUGFyYW1zICp3ZGFTdGFQYXJhbXMpCit7CisgICB0QU5JX1U4IGkgPSAwOworICAgLyogVXBkYXRlIFNUQSBwYXJhbXMgKi8KKyAgIHZvc19tZW1fY29weSh3ZGlTdGFQYXJhbXMtPm1hY0JTU0lELCB3ZGFTdGFQYXJhbXMtPmJzc0lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkgOworICAgd2RpU3RhUGFyYW1zLT51c0Fzc29jSWQgPSB3ZGFTdGFQYXJhbXMtPmFzc29jSWQ7CisgICB3ZGlTdGFQYXJhbXMtPndkaVNUQVR5cGUgPSB3ZGFTdGFQYXJhbXMtPnN0YVR5cGU7CisgICAKKyAgIHdkaVN0YVBhcmFtcy0+dWNTaG9ydFByZWFtYmxlU3VwcG9ydGVkID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RhU3RhUGFyYW1zLT5zaG9ydFByZWFtYmxlU3VwcG9ydGVkOworICAgdm9zX21lbV9jb3B5KHdkaVN0YVBhcmFtcy0+bWFjU1RBLCB3ZGFTdGFQYXJhbXMtPnN0YU1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpIDsKKyAgIHdkaVN0YVBhcmFtcy0+dXNMaXN0ZW5JbnRlcnZhbCA9IHdkYVN0YVBhcmFtcy0+bGlzdGVuSW50ZXJ2YWw7CisgICAKKyAgIHdkaVN0YVBhcmFtcy0+dWNXTU1FbmFibGVkID0gd2RhU3RhUGFyYW1zLT53bW1FbmFibGVkOworICAgCisgICB3ZGlTdGFQYXJhbXMtPnVjSFRDYXBhYmxlID0gd2RhU3RhUGFyYW1zLT5odENhcGFibGU7CisgICB3ZGlTdGFQYXJhbXMtPnVjVFhDaGFubmVsV2lkdGhTZXQgPSB3ZGFTdGFQYXJhbXMtPnR4Q2hhbm5lbFdpZHRoU2V0OworICAgd2RpU3RhUGFyYW1zLT51Y1JJRlNNb2RlID0gd2RhU3RhUGFyYW1zLT5yaWZzTW9kZTsKKyAgIHdkaVN0YVBhcmFtcy0+dWNMU0lHVHhvcFByb3RlY3Rpb24gPSB3ZGFTdGFQYXJhbXMtPmxzaWdUeG9wUHJvdGVjdGlvbjsKKyAgIHdkaVN0YVBhcmFtcy0+dWNNYXhBbXBkdVNpemUgPSB3ZGFTdGFQYXJhbXMtPm1heEFtcGR1U2l6ZTsKKyAgIHdkaVN0YVBhcmFtcy0+dWNNYXhBbXBkdURlbnNpdHkgPSB3ZGFTdGFQYXJhbXMtPm1heEFtcGR1RGVuc2l0eTsKKyAgIHdkaVN0YVBhcmFtcy0+dWNNYXhBbXNkdVNpemUgPSB3ZGFTdGFQYXJhbXMtPm1heEFtc2R1U2l6ZTsKKyAgIAorICAgd2RpU3RhUGFyYW1zLT51Y1Nob3J0R0k0ME1oeiA9IHdkYVN0YVBhcmFtcy0+ZlNob3J0R0k0ME1oejsKKyAgIHdkaVN0YVBhcmFtcy0+dWNTaG9ydEdJMjBNaHogPSB3ZGFTdGFQYXJhbXMtPmZTaG9ydEdJMjBNaHo7CisKKyAgIHdkaVN0YVBhcmFtcy0+d2RpU3VwcG9ydGVkUmF0ZXMub3BSYXRlTW9kZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGFTdGFQYXJhbXMtPnN1cHBvcnRlZFJhdGVzLm9wUmF0ZU1vZGU7CisKKyAgIGZvcihpID0gMDtpIDwgV0RJX05VTV8xMUJfUkFURVM7aSsrKQorICAgeworICAgICB3ZGlTdGFQYXJhbXMtPndkaVN1cHBvcnRlZFJhdGVzLmxsYlJhdGVzW2ldID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RhU3RhUGFyYW1zLT5zdXBwb3J0ZWRSYXRlcy5sbGJSYXRlc1tpXTsKKyAgIH0KKyAgIGZvcihpID0gMDtpIDwgV0RJX05VTV8xMUFfUkFURVM7aSsrKQorICAgeworICAgICB3ZGlTdGFQYXJhbXMtPndkaVN1cHBvcnRlZFJhdGVzLmxsYVJhdGVzW2ldID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RhU3RhUGFyYW1zLT5zdXBwb3J0ZWRSYXRlcy5sbGFSYXRlc1tpXTsKKyAgIH0KKyAgIGZvcihpID0gMDtpIDwgU0lSX05VTV9QT0xBUklTX1JBVEVTO2krKykKKyAgIHsKKyAgICAgd2RpU3RhUGFyYW1zLT53ZGlTdXBwb3J0ZWRSYXRlcy5hTGVnYWN5UmF0ZXNbaV0gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGFTdGFQYXJhbXMtPnN1cHBvcnRlZFJhdGVzLmFuaUxlZ2FjeVJhdGVzW2ldOworICAgfQorICAgd2RpU3RhUGFyYW1zLT53ZGlTdXBwb3J0ZWRSYXRlcy51RW5oYW5jZWRSYXRlQml0bWFwID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RhU3RhUGFyYW1zLT5zdXBwb3J0ZWRSYXRlcy5hbmlFbmhhbmNlZFJhdGVCaXRtYXA7CisgICBmb3IoaSA9IDA7aSA8U0lSX01BQ19NQVhfU1VQUE9SVEVEX01DU19TRVQ7aSsrKQorICAgeworICAgICB3ZGlTdGFQYXJhbXMtPndkaVN1cHBvcnRlZFJhdGVzLmFTdXBwb3J0ZWRNQ1NTZXRbaV0gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGFTdGFQYXJhbXMtPnN1cHBvcnRlZFJhdGVzLnN1cHBvcnRlZE1DU1NldFtpXTsKKyAgIH0KKyAgIHdkaVN0YVBhcmFtcy0+d2RpU3VwcG9ydGVkUmF0ZXMuYVJ4SGlnaGVzdERhdGFSYXRlID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGFTdGFQYXJhbXMtPnN1cHBvcnRlZFJhdGVzLnJ4SGlnaGVzdERhdGFSYXRlOworICAgCisgICB3ZGlTdGFQYXJhbXMtPnVjUk1GRW5hYmxlZCA9IHdkYVN0YVBhcmFtcy0+cm1mRW5hYmxlZDsKKyAgIAorICAgd2RpU3RhUGFyYW1zLT53ZGlBY3Rpb24gPSB3ZGFTdGFQYXJhbXMtPnVwZGF0ZVN0YTsgCisgICAKKyAgIHdkaVN0YVBhcmFtcy0+dWNBUFNEID0gd2RhU3RhUGFyYW1zLT51QVBTRDsKKyAgIHdkaVN0YVBhcmFtcy0+dWNNYXhTUExlbiA9IHdkYVN0YVBhcmFtcy0+bWF4U1BMZW47CisgICB3ZGlTdGFQYXJhbXMtPnVjR3JlZW5GaWVsZENhcGFibGUgPSB3ZGFTdGFQYXJhbXMtPmdyZWVuRmllbGRDYXBhYmxlOworICAgCisgICB3ZGlTdGFQYXJhbXMtPnVjRGVsYXllZEJBU3VwcG9ydCA9IHdkYVN0YVBhcmFtcy0+ZGVsQkFTdXBwb3J0OworICAgd2RpU3RhUGFyYW1zLT51czMyTWF4QW1wZHVEdXJhdGlvID0gd2RhU3RhUGFyYW1zLT51czMyTWF4QW1wZHVEdXJhdGlvbjsKKyAgIHdkaVN0YVBhcmFtcy0+dWNEc3NzQ2NrTW9kZTQwTWh6ID0gd2RhU3RhUGFyYW1zLT5mRHNzc0Nja01vZGU0ME1oejsKKyAgIHdkaVN0YVBhcmFtcy0+dWNFbmNyeXB0VHlwZSA9IHdkYVN0YVBhcmFtcy0+ZW5jcnlwdFR5cGU7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgd2RpU3RhUGFyYW1zLT51Y1AycENhcGFibGVTdGEgPSB3ZGFTdGFQYXJhbXMtPnAycENhcGFibGVTdGE7CisjZW5kaWYKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDRkcgdXBkYXRlIHRvIFdESQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqLworIAorIC8qCisgKiBGVU5DVElPTjogV0RBX0NvbnZlcnRXbmlDZmdJZFRvSEFMQ2ZnSWQKKyAqIENvbnZlcnQgdGhlIFdOSSBDRkcgSUQgdG8gSEFMIENGRyBJRAorICovIAorc3RhdGljIGlubGluZSB2X1U4X3QgV0RBX0NvbnZlcnRXbmlDZmdJZFRvSEFMQ2ZnSWQodl9VOF90IHduaUNmZ0lkKQoreworICAgc3dpdGNoKHduaUNmZ0lkKQorICAgeworICAgICAgY2FzZSBXTklfQ0ZHX1NUQV9JRDoKKyAgICAgICAgIHJldHVybiBRV0xBTl9IQUxfQ0ZHX1NUQV9JRDsKKyAgICAgIGNhc2UgV05JX0NGR19DVVJSRU5UX1RYX0FOVEVOTkE6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19DVVJSRU5UX1RYX0FOVEVOTkE7CisgICAgICBjYXNlIFdOSV9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfQ1VSUkVOVF9SWF9BTlRFTk5BOworICAgICAgY2FzZSBXTklfQ0ZHX0xPV19HQUlOX09WRVJSSURFOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfTE9XX0dBSU5fT1ZFUlJJREU7CisgICAgICBjYXNlIFdOSV9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfUE9XRVJfU1RBVEVfUEVSX0NIQUlOOworICAgICAgY2FzZSBXTklfQ0ZHX0NBTF9QRVJJT0Q6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19DQUxfUEVSSU9EOworICAgICAgY2FzZSBXTklfQ0ZHX0NBTF9DT05UUk9MOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfQ0FMX0NPTlRST0w7CisgICAgICBjYXNlIFdOSV9DRkdfUFJPWElNSVRZOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfUFJPWElNSVRZOworICAgICAgY2FzZSBXTklfQ0ZHX05FVFdPUktfREVOU0lUWToKKyAgICAgICAgIHJldHVybiBRV0xBTl9IQUxfQ0ZHX05FVFdPUktfREVOU0lUWTsKKyAgICAgIGNhc2UgV05JX0NGR19NQVhfTUVESVVNX1RJTUU6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19NQVhfTUVESVVNX1RJTUU7CisgICAgICBjYXNlIFdOSV9DRkdfTUFYX01QRFVTX0lOX0FNUERVOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfTUFYX01QRFVTX0lOX0FNUERVOworICAgICAgY2FzZSBXTklfQ0ZHX1JUU19USFJFU0hPTEQ6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19SVFNfVEhSRVNIT0xEOworICAgICAgY2FzZSBXTklfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlUOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfU0hPUlRfUkVUUllfTElNSVQ7CisgICAgICBjYXNlIFdOSV9DRkdfTE9OR19SRVRSWV9MSU1JVDoKKyAgICAgICAgIHJldHVybiBRV0xBTl9IQUxfQ0ZHX0xPTkdfUkVUUllfTElNSVQ7CisgICAgICBjYXNlIFdOSV9DRkdfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDsKKyAgICAgIGNhc2UgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfRFlOQU1JQ19USFJFU0hPTERfWkVSTzsKKyAgICAgIGNhc2UgV05JX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9PTkU6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9PTkU7CisgICAgICBjYXNlIFdOSV9DRkdfRFlOQU1JQ19USFJFU0hPTERfVFdPOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfRFlOQU1JQ19USFJFU0hPTERfVFdPOworICAgICAgY2FzZSBXTklfQ0ZHX0ZJWEVEX1JBVEU6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19GSVhFRF9SQVRFOworICAgICAgY2FzZSBXTklfQ0ZHX1JFVFJZUkFURV9QT0xJQ1k6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19SRVRSWVJBVEVfUE9MSUNZOworICAgICAgY2FzZSBXTklfQ0ZHX1JFVFJZUkFURV9TRUNPTkRBUlk6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZOworICAgICAgY2FzZSBXTklfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWToKKyAgICAgICAgIHJldHVybiBRV0xBTl9IQUxfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWTsKKyAgICAgIGNhc2UgV05JX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTjoKKyAgICAgICAgIHJldHVybiBRV0xBTl9IQUxfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OOworICAgICAgY2FzZSBXTklfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzI0R0haOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFo7CisgICAgICBjYXNlIFdOSV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWjoKKyAgICAgICAgIHJldHVybiBRV0xBTl9IQUxfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFo7CisgICAgICBjYXNlIFdOSV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzI0R0haOworICAgICAgY2FzZSBXTklfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzVHSFo7CisgICAgICBjYXNlIFdOSV9DRkdfTUFYX0JBX1NFU1NJT05TOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfTUFYX0JBX1NFU1NJT05TOworICAgICAgY2FzZSBXTklfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVQ7CisgICAgICBjYXNlIFdOSV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVI6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUjsKKyAgICAgIGNhc2UgV05JX0NGR19QU19FTkFCTEVfUlNTSV9NT05JVE9SOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUjsKKyAgICAgIGNhc2UgV05JX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0U6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0U7CisgICAgICBjYXNlIFdOSV9DRkdfU1RBVFNfUEVSSU9EOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfU1RBVFNfUEVSSU9EOworICAgICAgY2FzZSBXTklfQ0ZHX0NGUF9NQVhfRFVSQVRJT046CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19DRlBfTUFYX0RVUkFUSU9OOworI2lmIDAgLypUaGlzIGlzIG5vdCBwYXJ0IG9mIENGRyovCisgICAgICBjYXNlIFdOSV9DRkdfRlJBTUVfVFJBTlNfRU5BQkxFRDoKKyAgICAgICAgIHJldHVybiBRV0xBTl9IQUxfQ0ZHX0ZSQU1FX1RSQU5TX0VOQUJMRUQ7CisjZW5kaWYKKyAgICAgIGNhc2UgV05JX0NGR19EVElNX1BFUklPRDoKKyAgICAgICAgIHJldHVybiBRV0xBTl9IQUxfQ0ZHX0RUSU1fUEVSSU9EOworICAgICAgY2FzZSBXTklfQ0ZHX0VEQ0FfV01FX0FDQks6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19FRENBX1dNTV9BQ0JLOworICAgICAgY2FzZSBXTklfQ0ZHX0VEQ0FfV01FX0FDQkU6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19FRENBX1dNTV9BQ0JFOworICAgICAgY2FzZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVkk6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19FRENBX1dNTV9BQ1ZJOworICAgICAgY2FzZSBXTklfQ0ZHX0VEQ0FfV01FX0FDVk86CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19FRENBX1dNTV9BQ1ZPOworI2lmIDAKKyAgICAgIGNhc2UgV05JX0NGR19URUxFX0JDTl9XQUtFVVBfRU46CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19URUxFX0JDTl9XQUtFVVBfRU47CisgICAgICBjYXNlIFdOSV9DRkdfVEVMRV9CQ05fVFJBTlNfTEk6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19URUxFX0JDTl9UUkFOU19MSTsKKyAgICAgIGNhc2UgV05JX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlM6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19URUxFX0JDTl9UUkFOU19MSV9JRExFX0JDTlM7CisgICAgICBjYXNlIFdOSV9DRkdfVEVMRV9CQ05fTUFYX0xJOgorICAgICAgICAgcmV0dXJuIFFXTEFOX0hBTF9DRkdfVEVMRV9CQ05fTUFYX0xJOworICAgICAgY2FzZSBXTklfQ0ZHX1RFTEVfQkNOX01BWF9MSV9JRExFX0JDTlM6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19URUxFX0JDTl9NQVhfTElfSURMRV9CQ05TOworI2VuZGlmCisgICAgICBjYXNlIFdOSV9DRkdfRU5BQkxFX0NMT1NFX0xPT1A6CisgICAgICAgICByZXR1cm4gUVdMQU5fSEFMX0NGR19FTkFCTEVfQ0xPU0VfTE9PUDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJUaGVyZSBpcyBubyBIQUwgQ0ZHIElkIGNvcnJlc3BvbmRpbmcgdG8gV05JIENGRyBJZDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHduaUNmZ0lkKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CisgICAgICB9CisgICB9Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1VwZGF0ZUNmZ0NhbGxiYWNrCisgKiAKKyAqLyAKK3ZvaWQgV0RBX1VwZGF0ZUNmZ0NhbGxiYWNrKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFVzZXJEYXRhIDsgCisgICBXRElfVXBkYXRlQ2ZnUmVxUGFyYW1zVHlwZSAqd2RpQ2ZnUGFyYW0gPSAKKyAgICAgICAgICAgICAgICAgIChXRElfVXBkYXRlQ2ZnUmVxUGFyYW1zVHlwZSAqKXBXREEtPndkYVdkaUNmZ0FwaU1zZ1BhcmFtIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICAvKgorICAgICogY3VycmVudGx5IHRoZXJlIGlzIG5vIHJlc3BvbnNlIG1lc3NhZ2UgaXMgZXhwZWN0ZWQgYmV0d2VlbiBQRSBhbmQKKyAgICAqIFdEQSwgRmFpbHVyZSByZXR1cm4gZnJvbSBXREkgaXMgYSBBU1NFUlQgY29uZGl0aW9uCisgICAgKi8KKyAgIGlmKFdESV9TVEFUVVNfU1VDQ0VTUyAhPSB3ZGlTdGF0dXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICIlczogQ0ZHICglZCkgY29uZmlnIGZhaWx1cmUgXG4iLCBfX0ZVTkNUSU9OX18sIAorICAgICAgICAgICAgICAoKHRIYWxDZmcgKikod2RpQ2ZnUGFyYW0tPnBDb25maWdCdWZmZXIpKS0+dHlwZSk7CisgICB9CisgICAKKyAgIHZvc19tZW1fZnJlZSh3ZGlDZmdQYXJhbS0+cENvbmZpZ0J1ZmZlcikgOworICAgdm9zX21lbV9mcmVlKHBXREEtPndkYVdkaUNmZ0FwaU1zZ1BhcmFtKSA7CisgICBwV0RBLT53ZGFXZGlDZmdBcGlNc2dQYXJhbSA9IE5VTEw7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1VwZGF0ZUNmZworICogCisgKi8gCitWT1NfU1RBVFVTIFdEQV9VcGRhdGVDZmcodFdEQV9DYkNvbnRleHQgKnBXREEsIHRTaXJNc2dRICpjZmdQYXJhbSkKK3sKKyAgIAorICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworICAgdEFOSV9VMzIgdmFsID0wOworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCApVk9TX0dFVF9NQUNfQ1RYVChwV0RBLT5wVm9zQ29udGV4dCkgOworICAgdEhhbENmZyAqY29uZmlnRGF0YTsKKyAgIFdESV9VcGRhdGVDZmdSZXFQYXJhbXNUeXBlICp3ZGlDZmdSZXFQYXJhbSA9IE5VTEwgOworICAgdEFOSV9VOCAgICAgICAgKmNvbmZpZ0RhdGFWYWx1ZTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZiAoTlVMTCA9PSBwTWFjICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZva2VkIHdpdGggaW52YWxpZCBNQUMgY29udGV4dCAiLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgaWYoV0RBX1NUQVJUX1NUQVRFICE9IHBXREEtPndkYVN0YXRlKQorICAgeworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgCisgICBpZihOVUxMICE9IHBXREEtPndkYVdkaUNmZ0FwaU1zZ1BhcmFtKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOndkYVdkaUNmZ0FwaU1zZ1BhcmFtIGlzIG5vdCBOVUxMIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgCisgICB3ZGlDZmdSZXFQYXJhbSA9IChXRElfVXBkYXRlQ2ZnUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX1VwZGF0ZUNmZ1JlcVBhcmFtc1R5cGUpKSA7CisKKyAgIGlmKE5VTEwgPT0gd2RpQ2ZnUmVxUGFyYW0pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB3ZGlDZmdSZXFQYXJhbS0+cENvbmZpZ0J1ZmZlciA9ICB2b3NfbWVtX21hbGxvYyhzaXplb2YodEhhbENmZykgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0QU5JX1UzMikpIDsKKworICAgaWYoTlVMTCA9PSB3ZGlDZmdSZXFQYXJhbS0+cENvbmZpZ0J1ZmZlcikKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpQ2ZnUmVxUGFyYW0pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICAKKyAgIC8qY29udmVydCB0aGUgV05JIENGRyBJZCB0byBIQUwgQ0ZHIElkKi8KKyAgICgodEhhbENmZyAqKXdkaUNmZ1JlcVBhcmFtLT5wQ29uZmlnQnVmZmVyKS0+dHlwZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEQV9Db252ZXJ0V25pQ2ZnSWRUb0hBTENmZ0lkKGNmZ1BhcmFtLT5ib2R5dmFsKTsKKyAgIAorICAgLypUT0RPOiByZXZpc2l0IHRoaXMgZm9yIGhhbmRsaW5nIHN0cmluZyBwYXJhbWV0ZXJzICovCisgICBpZiAod2xhbl9jZmdHZXRJbnQocE1hYywgKHRBTklfVTE2KSBjZmdQYXJhbS0+Ym9keXZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKSAhPSBlU0lSX1NVQ0NFU1MpCisgICB7CisgICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNmZyBnZXQgaWQgJWRcbiIsIGNmZ1BhcmFtLT5ib2R5dmFsKTsKKyAgICAgICB2b3NfbWVtX2ZyZWUod2RpQ2ZnUmVxUGFyYW0tPnBDb25maWdCdWZmZXIpOworICAgICAgIHZvc19tZW1fZnJlZSh3ZGlDZmdSZXFQYXJhbSk7CisgICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRTsKKyAgIH0KKworICAgKCh0SGFsQ2ZnICopd2RpQ2ZnUmVxUGFyYW0tPnBDb25maWdCdWZmZXIpLT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YSA9KCh0SGFsQ2ZnICopd2RpQ2ZnUmVxUGFyYW0tPnBDb25maWdCdWZmZXIpIDsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICgodEFOSV9VOCAqKWNvbmZpZ0RhdGEgKyBzaXplb2YodEhhbENmZykpOworICAgdm9zX21lbV9jb3B5KCBjb25maWdEYXRhVmFsdWUsICZ2YWwsIHNpemVvZih0QU5JX1UzMikpOworICAgd2RpQ2ZnUmVxUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisgICAKKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdEQS0+d2RhV2RpQ2ZnQXBpTXNnUGFyYW0gPSAodm9pZCAqKXdkaUNmZ1JlcVBhcmFtIDsKKworI2lmZGVmIEZFQVRVUkVfSEFMX1NVUFBPUlRfRFlOQU1JQ19VUERBVEVfQ0ZHCisgICBzdGF0dXMgPSBXRElfVXBkYXRlQ2ZnUmVxKHdkaUNmZ1JlcVBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAoV0RJX1VwZGF0ZUNmZ1JzcENiIClXREFfVXBkYXRlQ2ZnQ2FsbGJhY2ssIHBXREEpIDsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gVXBkYXRlIENGRyBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlDZmdSZXFQYXJhbS0+cENvbmZpZ0J1ZmZlcikgOworICAgICAgdm9zX21lbV9mcmVlKHBXREEtPndkYVdkaUNmZ0FwaU1zZ1BhcmFtKSA7CisgICAgICBwV0RBLT53ZGFXZGlDZmdBcGlNc2dQYXJhbSA9IE5VTEw7CisgICAgICAvKiBGYWlsdXJlIGlzIG5vdCBleHBlY3RlZCAqLworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICB9CisjZWxzZQorICAgdm9zX21lbV9mcmVlKHdkaUNmZ1JlcVBhcmFtLT5wQ29uZmlnQnVmZmVyKSA7CisgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhV2RpQ2ZnQXBpTXNnUGFyYW0pIDsKKyAgIHBXREEtPndkYVdkaUNmZ0FwaU1zZ1BhcmFtID0gTlVMTDsKKyNlbmRpZgorICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisKKworVk9TX1NUQVRVUyBXREFfR2V0V2VwS2V5c0Zyb21DZmcoIHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcERlZmF1bHRLZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCAqcE51bUtleXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfS2V5c1R5cGUgKnBXZGlLZXlzICkKK3sKKyAgIHZfVTMyX3QgaSwgaiwgZGVmS2V5SWQgPSAwOworICAgdl9VMzJfdCB2YWwgPSBTSVJfTUFDX0tFWV9MRU5HVEg7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwgKVZPU19HRVRfTUFDX0NUWFQocFdEQS0+cFZvc0NvbnRleHQpIDsKKworICAgaWYgKE5VTEwgPT0gcE1hYyApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogSW52b2tlZCB3aXRoIGludmFsaWQgTUFDIGNvbnRleHQgIiwgX19GVU5DVElPTl9fICk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIGlmKCBlU0lSX1NVQ0NFU1MgIT0gd2xhbl9jZmdHZXRJbnQoIHBNYWMsIFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZLZXlJZCApKQorICAgeworICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiVW5hYmxlIHRvIHJldHJpZXZlIGRlZmF1bHRLZXlJZCBmcm9tIENGRy4gRGVmYXVsdGluZyB0byAwLi4uIik7CisgICB9CisgICAKKyAgKnBEZWZhdWx0S2V5SWQgPSAodl9VOF90KWRlZktleUlkOworCisgICAvKiBOZWVkIHRvIGV4dHJhY3QgQUxMIG9mIHRoZSBjb25maWd1cmVkIFdFUCBLZXlzICovCisgICBmb3IoIGkgPSAwLCBqID0gMDsgaSA8IFNJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVM7IGkrKyApCisgICB7CisgICAgICB2YWwgPSBTSVJfTUFDX0tFWV9MRU5HVEg7CisgICAgICBpZiggZVNJUl9TVUNDRVNTICE9IHdsYW5fY2ZnR2V0U3RyKCBwTWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VMTZfdCkgKFdOSV9DRkdfV0VQX0RFRkFVTFRfS0VZXzEgKyBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV2RpS2V5c1tqXS5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbCApKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXRVAgS2V5IGluZGV4IFslZF0gbWF5IG5vdCBjb25maWd1cmVkIGluIENGR1xuIixpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHBXZGlLZXlzW2pdLmtleUlkID0gKHRBTklfVTgpIGk7CisgICAgICAgICAvKiAKKyAgICAgICAgICogQWN0dWFsbHksIGEgREMgKERvbid0IENhcmUpIGJlY2F1c2UKKyAgICAgICAgICogdGhpcyBpcyBkZXRlcm1pbmVkIChhbmQgc2V0KSBieSBQRS9NTE1FCisgICAgICAgICAqLworICAgICAgICAgcFdkaUtleXNbal0udW5pY2FzdCA9IDA7CisgICAgICAgICAvKgorICAgICAgICAgKiAgQW5vdGhlciBEQyAoRG9uJ3QgQ2FyZSkKKyAgICAgICAgICovCisgICAgICAgICBwV2RpS2V5c1tqXS5rZXlEaXJlY3Rpb24gPSBlU0lSX1RYX1JYOworICAgICAgICAgLyogQW5vdGhlciBEQyAoRG9uJ3QgQ2FyZSkuIFVudXNlZCBmb3IgV0VQICovCisgICAgICAgICBwV2RpS2V5c1tqXS5wYWVSb2xlID0gMDsKKyAgICAgICAgIC8qIERldGVybWluZWQgZnJvbSB3bGFuX2NmZ0dldFN0cigpIGFib3ZlLiovCisgICAgICAgICBwV2RpS2V5c1tqXS5rZXlMZW5ndGggPSAodEFOSV9VMTYpIHZhbDsKKworICAgICAgICAgaisrOworICAgICAgICAgKnBOdW1LZXlzID0gKHRBTklfVTgpIGo7CisgICAgICB9CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1NldEJzc0tleVJlcUNhbGxiYWNrCisgKiBzZW5kIFNFVCBCU1Mga2V5IFJTUCBiYWNrIHRvIFBFCisgKi8gCit2b2lkIFdEQV9TZXRCc3NLZXlSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7IAorICAgdFdEQV9DYkNvbnRleHQgKnBXREE7IAorICAgdFNldEJzc0tleVBhcmFtcyAqc2V0QnNzS2V5UGFyYW1zOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBwV2RhUGFyYW1zIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorICAgcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBXZGFQYXJhbXMtPnBXZGFDb250ZXh0OworICAgc2V0QnNzS2V5UGFyYW1zID0gKHRTZXRCc3NLZXlQYXJhbXMgKilwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbTsKKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICBzZXRCc3NLZXlQYXJhbXMtPnN0YXR1cyA9IENPTlZFUlRfV0RJMlNJUl9TVEFUVVMoc3RhdHVzKSA7CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9TRVRfQlNTS0VZX1JTUCwgKHZvaWQgKilzZXRCc3NLZXlQYXJhbXMgLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NTZXRCc3NLZXlSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIGZvciBwcm9ncmFtbWluZyB0aGUgQlNTIGtleSgga2V5IGZvciAKKyAqIGJyb2FkY2FzdC9tdWx0aWNhc3QgZnJhbWVzIEVuY3J5cHRpb24pCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzU2V0QnNzS2V5UmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTZXRCc3NLZXlQYXJhbXMgKnNldEJzc0tleVBhcmFtcyApCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICBXRElfU2V0QlNTS2V5UmVxUGFyYW1zVHlwZSAqd2RpU2V0QnNzS2V5UGFyYW0gPSAKKyAgICAgICAgICAgICAgICAgIChXRElfU2V0QlNTS2V5UmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX1NldEJTU0tleVJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIHZfVThfdCBrZXlJbmRleDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHdkaVNldEJzc0tleVBhcmFtKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlTZXRCc3NLZXlQYXJhbSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB2b3NfbWVtX3plcm8od2RpU2V0QnNzS2V5UGFyYW0sIHNpemVvZihXRElfU2V0QlNTS2V5UmVxUGFyYW1zVHlwZSkpOworCisgICAvKiBjb3B5IHNldCBCU1MgcGFyYW1zIHRvIFdESSBzdHJ1Y3R1cmUgKi8KKyAgIHdkaVNldEJzc0tleVBhcmFtLT53ZGlCU1NLZXlJbmZvLnVjQnNzSWR4ID0gc2V0QnNzS2V5UGFyYW1zLT5ic3NJZHg7CisgICB3ZGlTZXRCc3NLZXlQYXJhbS0+d2RpQlNTS2V5SW5mby53ZGlFbmNUeXBlID0gc2V0QnNzS2V5UGFyYW1zLT5lbmNUeXBlOworICAgd2RpU2V0QnNzS2V5UGFyYW0tPndkaUJTU0tleUluZm8udWNOdW1LZXlzID0gc2V0QnNzS2V5UGFyYW1zLT5udW1LZXlzOworCisgICBpZihzZXRCc3NLZXlQYXJhbXMtPmVuY1R5cGUgIT0gZVNJUl9FRF9OT05FKQorICAgeworICAgICAgaWYoIHNldEJzc0tleVBhcmFtcy0+bnVtS2V5cyA9PSAwICYmIAorICAgICAgICAgKCggc2V0QnNzS2V5UGFyYW1zLT5lbmNUeXBlID09IGVTSVJfRURfV0VQNDApfHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJzc0tleVBhcmFtcy0+ZW5jVHlwZSA9PSBlU0lSX0VEX1dFUDEwNCkpCisgICAgICB7CisgICAgICAgICB0QU5JX1U4IGRlZmF1bHRLZXlJZCA9IDA7CisKKyAgICAgICAgIFdEQV9HZXRXZXBLZXlzRnJvbUNmZyggcFdEQSwgJmRlZmF1bHRLZXlJZCwgCisgICAgICAgICAgICAmd2RpU2V0QnNzS2V5UGFyYW0tPndkaUJTU0tleUluZm8udWNOdW1LZXlzLAorICAgICAgICAgICAgd2RpU2V0QnNzS2V5UGFyYW0tPndkaUJTU0tleUluZm8uYUtleXMgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGZvcigga2V5SW5kZXg9MDsga2V5SW5kZXggPCBzZXRCc3NLZXlQYXJhbXMtPm51bUtleXM7IGtleUluZGV4KyspCisgICAgICAgICB7CisgICAgICAgICAgICB3ZGlTZXRCc3NLZXlQYXJhbS0+d2RpQlNTS2V5SW5mby5hS2V5c1trZXlJbmRleF0ua2V5SWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QnNzS2V5UGFyYW1zLT5rZXlba2V5SW5kZXhdLmtleUlkOworICAgICAgICAgICAgd2RpU2V0QnNzS2V5UGFyYW0tPndkaUJTU0tleUluZm8uYUtleXNba2V5SW5kZXhdLnVuaWNhc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QnNzS2V5UGFyYW1zLT5rZXlba2V5SW5kZXhdLnVuaWNhc3Q7CisgICAgICAgICAgICB3ZGlTZXRCc3NLZXlQYXJhbS0+d2RpQlNTS2V5SW5mby5hS2V5c1trZXlJbmRleF0ua2V5RGlyZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJzc0tleVBhcmFtcy0+a2V5W2tleUluZGV4XS5rZXlEaXJlY3Rpb247CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkod2RpU2V0QnNzS2V5UGFyYW0tPndkaUJTU0tleUluZm8uYUtleXNba2V5SW5kZXhdLmtleVJzYywgCisgICAgICAgICAgICAgICAgICBzZXRCc3NLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ua2V5UnNjLCBXTEFOX01BWF9LRVlfUlNDX0xFTik7CisgICAgICAgICAgICB3ZGlTZXRCc3NLZXlQYXJhbS0+d2RpQlNTS2V5SW5mby5hS2V5c1trZXlJbmRleF0ucGFlUm9sZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJzc0tleVBhcmFtcy0+a2V5W2tleUluZGV4XS5wYWVSb2xlOworICAgICAgICAgICAgd2RpU2V0QnNzS2V5UGFyYW0tPndkaUJTU0tleUluZm8uYUtleXNba2V5SW5kZXhdLmtleUxlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJzc0tleVBhcmFtcy0+a2V5W2tleUluZGV4XS5rZXlMZW5ndGg7CisgICAgICAgICAgICB2b3NfbWVtX2NvcHkod2RpU2V0QnNzS2V5UGFyYW0tPndkaUJTU0tleUluZm8uYUtleXNba2V5SW5kZXhdLmtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRCc3NLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ua2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUFYX0tFWV9MRU5HVEgpOworICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICB3ZGlTZXRCc3NLZXlQYXJhbS0+d2RpQlNTS2V5SW5mby51Y1NpbmdsZVRpZFJjID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJzc0tleVBhcmFtcy0+c2luZ2xlVGlkUmM7CisgICB3ZGlTZXRCc3NLZXlQYXJhbS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMIDsKKworICAgLyogU3RvcmUgc2V0IGtleSBwb2ludGVyLCBhcyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgcmVzcG9uc2UgKi8KKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSBzZXRCc3NLZXlQYXJhbXM7CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaVNldEJzc0tleVBhcmFtOworCisgICBzdGF0dXMgPSBXRElfU2V0QlNTS2V5UmVxKHdkaVNldEJzc0tleVBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfU2V0QlNTS2V5UnNwQ2IpV0RBX1NldEJzc0tleVJlcUNhbGxiYWNrICxwV2RhUGFyYW1zKTsKKyAgIAorICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gU2V0IEJTUyBLZXkgUmVxIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICAgICBzZXRCc3NLZXlQYXJhbXMtPnN0YXR1cyA9IGVTSVJfRkFJTFVSRSA7CisgICAgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfU0VUX0JTU0tFWV9SU1AsICh2b2lkICopc2V0QnNzS2V5UGFyYW1zLCAwKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9SZW1vdmVCc3NLZXlSZXFDYWxsYmFjaworICogc2VuZCBTRVQgQlNTIGtleSBSU1AgYmFjayB0byBQRQorICovIAordm9pZCBXREFfUmVtb3ZlQnNzS2V5UmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOyAKKyAgIHRSZW1vdmVCc3NLZXlQYXJhbXMgKnJlbW92ZUJzc0tleVBhcmFtczsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisgICByZW1vdmVCc3NLZXlQYXJhbXMgPSAodFJlbW92ZUJzc0tleVBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtOworCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKyAgIAorICAgcmVtb3ZlQnNzS2V5UGFyYW1zLT5zdGF0dXMgPSBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHN0YXR1cykgOworCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfUkVNT1ZFX0JTU0tFWV9SU1AsICh2b2lkICopcmVtb3ZlQnNzS2V5UGFyYW1zICwgMCkgOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzUmVtb3ZlQnNzS2V5UmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byByZW1vdmUgdGhlIEJTUyBrZXkoIGtleSBmb3IgYnJvYWRjYXN0L211bHRpY2FzdCAKKyAqIGZyYW1lcyBFbmNyeXB0aW9uKQorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1JlbW92ZUJzc0tleVJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UmVtb3ZlQnNzS2V5UGFyYW1zICpyZW1vdmVCc3NLZXlQYXJhbXMgKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworICAgV0RJX1JlbW92ZUJTU0tleVJlcVBhcmFtc1R5cGUgKndkaVJlbW92ZUJzc0tleVBhcmFtID0gCisgICAgICAgICAgICAgICAgICAoV0RJX1JlbW92ZUJTU0tleVJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9SZW1vdmVCU1NLZXlSZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpUmVtb3ZlQnNzS2V5UGFyYW0pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaVJlbW92ZUJzc0tleVBhcmFtKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIC8qIGNvcHkgUmVtb3ZlIEJTUyBrZXkgcGFyYW1zIHRvIFdESSBzdHJ1Y3R1cmUqLworICAgd2RpUmVtb3ZlQnNzS2V5UGFyYW0tPndkaUtleUluZm8udWNCc3NJZHggPSByZW1vdmVCc3NLZXlQYXJhbXMtPmJzc0lkeDsKKyAgIHdkaVJlbW92ZUJzc0tleVBhcmFtLT53ZGlLZXlJbmZvLndkaUVuY1R5cGUgPSByZW1vdmVCc3NLZXlQYXJhbXMtPmVuY1R5cGU7CisgICB3ZGlSZW1vdmVCc3NLZXlQYXJhbS0+d2RpS2V5SW5mby51Y0tleUlkID0gcmVtb3ZlQnNzS2V5UGFyYW1zLT5rZXlJZDsKKyAgIHdkaVJlbW92ZUJzc0tleVBhcmFtLT53ZGlLZXlJbmZvLndkaVdFUFR5cGUgPSByZW1vdmVCc3NLZXlQYXJhbXMtPndlcFR5cGU7CisgICB3ZGlSZW1vdmVCc3NLZXlQYXJhbS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMIDsKKworICAgLyogU3RvcmUgcmVtb3ZlIGtleSBwb2ludGVyLCBhcyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgcmVzcG9uc2UgKi8KKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSByZW1vdmVCc3NLZXlQYXJhbXM7CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaVJlbW92ZUJzc0tleVBhcmFtOworCisgICBzdGF0dXMgPSBXRElfUmVtb3ZlQlNTS2V5UmVxKHdkaVJlbW92ZUJzc0tleVBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgIChXRElfUmVtb3ZlQlNTS2V5UnNwQ2IpV0RBX1JlbW92ZUJzc0tleVJlcUNhbGxiYWNrLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluIFJlbW92ZSBCU1MgS2V5IFJlcSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgICAgcmVtb3ZlQnNzS2V5UGFyYW1zLT5zdGF0dXMgPSBlU0lSX0ZBSUxVUkUgOworICAgICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX1JFTU9WRV9CU1NLRVlfUlNQLCAodm9pZCAqKXJlbW92ZUJzc0tleVBhcmFtcywgMCkgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfU2V0QnNzS2V5UmVxQ2FsbGJhY2sKKyAqIHNlbmQgU0VUIEJTUyBrZXkgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX1NldFN0YUtleVJlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsgCisgICB0V0RBX0NiQ29udGV4dCAqcFdEQTsgCisgICB0U2V0U3RhS2V5UGFyYW1zICpzZXRTdGFLZXlQYXJhbXM7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUgorICAgICAgICAgICAgICAgICwiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisgICBzZXRTdGFLZXlQYXJhbXMgPSAodFNldFN0YUtleVBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtOworCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKworICAgc2V0U3RhS2V5UGFyYW1zLT5zdGF0dXMgPSBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHN0YXR1cykgOworCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfU0VUX1NUQUtFWV9SU1AsICh2b2lkICopc2V0U3RhS2V5UGFyYW1zICwgMCkgOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzU2V0U3RhS2V5UmVxCisgKiBSZXF1ZXN0IHRvIFdESSBmb3IgcHJvZ3JhbW1pbmcgdGhlIFNUQSBrZXkoIGtleSBmb3IgVW5pY2FzdCBmcmFtZXMgCisgKiBFbmNyeXB0aW9uKQorICovCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzU2V0U3RhS2V5UmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTZXRTdGFLZXlQYXJhbXMgKnNldFN0YUtleVBhcmFtcyApCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICBXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZSAqd2RpU2V0U3RhS2V5UGFyYW0gPSAKKyAgICAgICAgICAgICAgICAgIChXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX1NldFNUQUtleVJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIHZfVThfdCBrZXlJbmRleDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHdkaVNldFN0YUtleVBhcmFtKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlTZXRTdGFLZXlQYXJhbSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB2b3NfbWVtX3NldCh3ZGlTZXRTdGFLZXlQYXJhbSwgc2l6ZW9mKFdESV9TZXRTVEFLZXlSZXFQYXJhbXNUeXBlKSwgMCk7CisKKyAgIHZvc19tZW1femVybyh3ZGlTZXRTdGFLZXlQYXJhbSwgc2l6ZW9mKFdESV9TZXRTVEFLZXlSZXFQYXJhbXNUeXBlKSk7CisKKyAgIC8qIGNvcHkgc2V0IFNUQSBrZXkgcGFyYW1zIHRvIFdESSBzdHJ1Y3R1cmUgKi8KKyAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLnVjU1RBSWR4ID0gc2V0U3RhS2V5UGFyYW1zLT5zdGFJZHg7CisgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlFbmNUeXBlID0gc2V0U3RhS2V5UGFyYW1zLT5lbmNUeXBlOworICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpV0VQVHlwZSA9IHNldFN0YUtleVBhcmFtcy0+d2VwVHlwZTsKKyAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLnVjRGVmV0VQSWR4ID0gc2V0U3RhS2V5UGFyYW1zLT5kZWZXRVBJZHg7CisKKyAgIGlmKHNldFN0YUtleVBhcmFtcy0+ZW5jVHlwZSAhPSBlU0lSX0VEX05PTkUpCisgICB7CisgICAgICBpZiggKHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLndkaVdFUFR5cGUgPT0gZVNJUl9XRVBfU1RBVElDKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgKFdEQV9JTlZBTElEX0tFWV9JTkRFWCA9PSBzZXRTdGFLZXlQYXJhbXMtPmRlZldFUElkeCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGVTWVNURU1fQVBfUk9MRSAhPSBwV0RBLT53ZGFHbG9iYWxTeXN0ZW1Sb2xlKSkKKyAgICAgIHsKKyAgICAgICAgIFdEQV9HZXRXZXBLZXlzRnJvbUNmZyggcFdEQSwgCisgICAgICAgICAgICAmd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8udWNEZWZXRVBJZHgsIAorICAgICAgICAgICAgJndkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLnVjTnVtS2V5cywKKyAgICAgICAgICAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLndkaUtleSApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgICAgIGZvcigga2V5SW5kZXg9MDsga2V5SW5kZXggPCBTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUluZGV4KyspCisgICAgICAgICB7CisgICAgICAgICAgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLmtleUlkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ua2V5SWQ7CisgICAgICAgICAgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLnVuaWNhc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YUtleVBhcmFtcy0+a2V5W2tleUluZGV4XS51bmljYXN0OworICAgICAgICAgICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpS2V5W2tleUluZGV4XS5rZXlEaXJlY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YUtleVBhcmFtcy0+a2V5W2tleUluZGV4XS5rZXlEaXJlY3Rpb247CisKKyAgICAgICAgICAgIHZvc19tZW1fY29weSh3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLmtleVJzYywgCisgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ua2V5UnNjLCBXTEFOX01BWF9LRVlfUlNDX0xFTik7CisgICAgICAgICAgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLnBhZVJvbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ucGFlUm9sZTsKKyAgICAgICAgICAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLndkaUtleVtrZXlJbmRleF0ua2V5TGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhS2V5UGFyYW1zLT5rZXlba2V5SW5kZXhdLmtleUxlbmd0aDsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSh3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLmtleSwgCisgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ua2V5LCBTSVJfTUFDX01BWF9LRVlfTEVOR1RIKTsKKyAgICAgICAgICAgIC8qIHNldCBkZWZhdWx0IGluZGV4IHRvIGluZGV4IHdoaWNoIGhhdmUga2V5IGRpcmVjdGlvbiBhcyAgV0RJX1RYX0RFRkFVTFQgKi8KKyAgICAgICAgICAgIGlmIChXRElfVFhfREVGQVVMVCA9PSB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLmtleURpcmVjdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby51Y0RlZldFUElkeCA9IGtleUluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby51Y051bUtleXMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUFYX05VTV9PRl9ERUZBVUxUX0tFWVM7CisjZWxzZQorICAgICAgICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpS2V5WzBdLmtleUlkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YUtleVBhcmFtcy0+a2V5LmtleUlkOworICAgICAgICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpS2V5WzBdLnVuaWNhc3QgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YUtleVBhcmFtcy0+a2V5LnVuaWNhc3Q7CisgICAgICAgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlbMF0ua2V5RGlyZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YUtleVBhcmFtcy0+a2V5LmtleURpcmVjdGlvbjsKKyAgICAgICAgIHZvc19tZW1fY29weSh3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlbMF0ua2V5UnNjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YUtleVBhcmFtcy0+a2V5LmtleVJzYywgV0xBTl9NQVhfS0VZX1JTQ19MRU4pOworICAgICAgICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpS2V5WzBdLnBhZVJvbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleS5wYWVSb2xlOworICAgICAgICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpS2V5WzBdLmtleUxlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleS5rZXlMZW5ndGg7CisgICAgICAgICB2b3NfbWVtX2NvcHkod2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpS2V5WzBdLmtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YUtleVBhcmFtcy0+a2V5W2tleUluZGV4XS5rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJUl9NQUNfTUFYX0tFWV9MRU5HVEgpOworICAgICAgICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8udWNOdW1LZXlzID0gMTsKKyNlbmRpZgorICAgICAgfQorICAgfQorICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8udWNTaW5nbGVUaWRSYyA9IHNldFN0YUtleVBhcmFtcy0+c2luZ2xlVGlkUmM7CisgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMIDsKKworICAgLyogU3RvcmUgc2V0IGtleSBwb2ludGVyLCBhcyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgcmVzcG9uc2UgKi8KKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSBzZXRTdGFLZXlQYXJhbXM7CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaVNldFN0YUtleVBhcmFtOworCisgICBzdGF0dXMgPSBXRElfU2V0U1RBS2V5UmVxKHdkaVNldFN0YUtleVBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9TZXRTVEFLZXlSc3BDYilXREFfU2V0U3RhS2V5UmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBzZXQgU1RBIEtleSBSZXEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKyAgICAgIHNldFN0YUtleVBhcmFtcy0+c3RhdHVzID0gZVNJUl9GQUlMVVJFIDsKKyAgICAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9TRVRfU1RBS0VZX1JTUCwgKHZvaWQgKilzZXRTdGFLZXlQYXJhbXMsIDApIDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1NldEJjYXN0U3RhS2V5UmVxQ2FsbGJhY2sKKyAqIHNlbmQgU0VUIEJjYXN0IFNUQSBrZXkgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX1NldEJjYXN0U3RhS2V5UmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOyAKKyAgIHRTZXRTdGFLZXlQYXJhbXMgKnNldFN0YUtleVBhcmFtczsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIHNldFN0YUtleVBhcmFtcyA9ICh0U2V0U3RhS2V5UGFyYW1zICopcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW07CisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICBzZXRTdGFLZXlQYXJhbXMtPnN0YXR1cyA9IENPTlZFUlRfV0RJMlNJUl9TVEFUVVMoc3RhdHVzKSA7CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9TRVRfU1RBX0JDQVNUS0VZX1JTUCwgKHZvaWQgKilzZXRTdGFLZXlQYXJhbXMgLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1NldEJjYXN0U3RhS2V5UmVxCisgKiBSZXF1ZXN0IHRvIFdESSBmb3IgcHJvZ3JhbW1pbmcgdGhlIEJjYXN0IFNUQSBrZXkoIGtleSBmb3IgQnJvYWRjYXN0IGZyYW1lcyAKKyAqIEVuY3J5cHRpb24pCisgKi8KK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZXRCY2FzdFN0YUtleVJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2V0U3RhS2V5UGFyYW1zICpzZXRTdGFLZXlQYXJhbXMgKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworICAgV0RJX1NldFNUQUtleVJlcVBhcmFtc1R5cGUgKndkaVNldFN0YUtleVBhcmFtID0gCisgICAgICAgICAgICAgICAgICAoV0RJX1NldFNUQUtleVJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9TZXRTVEFLZXlSZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICB2X1U4X3Qga2V5SW5kZXg7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlTZXRTdGFLZXlQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpU2V0U3RhS2V5UGFyYW0pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgdm9zX21lbV9zZXQod2RpU2V0U3RhS2V5UGFyYW0sIHNpemVvZihXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZSksIDApOworCisgICB2b3NfbWVtX3plcm8od2RpU2V0U3RhS2V5UGFyYW0sIHNpemVvZihXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZSkpOworCisgICAvKiBjb3B5IHNldCBTVEEga2V5IHBhcmFtcyB0byBXREkgc3RydWN0dXJlICovCisgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby51Y1NUQUlkeCA9IHNldFN0YUtleVBhcmFtcy0+c3RhSWR4OworICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpRW5jVHlwZSA9IHNldFN0YUtleVBhcmFtcy0+ZW5jVHlwZTsKKyAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLndkaVdFUFR5cGUgPSBzZXRTdGFLZXlQYXJhbXMtPndlcFR5cGU7CisgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby51Y0RlZldFUElkeCA9IHNldFN0YUtleVBhcmFtcy0+ZGVmV0VQSWR4OworCisgICBpZihzZXRTdGFLZXlQYXJhbXMtPmVuY1R5cGUgIT0gZVNJUl9FRF9OT05FKQorICAgeworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgICAgIGZvcigga2V5SW5kZXg9MDsga2V5SW5kZXggPCBTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUluZGV4KyspCisgICAgICB7CisgICAgICAgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLmtleUlkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ua2V5SWQ7CisgICAgICAgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLnVuaWNhc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YUtleVBhcmFtcy0+a2V5W2tleUluZGV4XS51bmljYXN0OworICAgICAgICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpS2V5W2tleUluZGV4XS5rZXlEaXJlY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YUtleVBhcmFtcy0+a2V5W2tleUluZGV4XS5rZXlEaXJlY3Rpb247CisKKyAgICAgICAgIHZvc19tZW1fY29weSh3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLmtleVJzYywgCisgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ua2V5UnNjLCBXTEFOX01BWF9LRVlfUlNDX0xFTik7CisgICAgICAgICB3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLnBhZVJvbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ucGFlUm9sZTsKKyAgICAgICAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLndkaUtleVtrZXlJbmRleF0ua2V5TGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhS2V5UGFyYW1zLT5rZXlba2V5SW5kZXhdLmtleUxlbmd0aDsKKyAgICAgICAgIHZvc19tZW1fY29weSh3ZGlTZXRTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLmtleSwgCisgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ua2V5LCBTSVJfTUFDX01BWF9LRVlfTEVOR1RIKTsKKyAgICAgIH0KKworICAgICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8udWNOdW1LZXlzID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01BWF9OVU1fT0ZfREVGQVVMVF9LRVlTOworI2Vsc2UKKyAgICAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLndkaUtleVswXS5rZXlJZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleS5rZXlJZDsKKyAgICAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLndkaUtleVswXS51bmljYXN0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleS51bmljYXN0OworICAgICAgd2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpS2V5WzBdLmtleURpcmVjdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleS5rZXlEaXJlY3Rpb247CisgICAgICB2b3NfbWVtX2NvcHkod2RpU2V0U3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpS2V5WzBdLmtleVJzYywgCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleS5rZXlSc2MsIFdMQU5fTUFYX0tFWV9SU0NfTEVOKTsKKyAgICAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLndkaUtleVswXS5wYWVSb2xlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhS2V5UGFyYW1zLT5rZXkucGFlUm9sZTsKKyAgICAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLndkaUtleVswXS5rZXlMZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhS2V5UGFyYW1zLT5rZXkua2V5TGVuZ3RoOworICAgICAgdm9zX21lbV9jb3B5KHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLndkaUtleVswXS5rZXksIAorICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGFLZXlQYXJhbXMtPmtleVtrZXlJbmRleF0ua2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX01BWF9LRVlfTEVOR1RIKTsKKyAgICAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLnVjTnVtS2V5cyA9IDE7CisjZW5kaWYKKyAgIH0KKyAgIHdkaVNldFN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLnVjU2luZ2xlVGlkUmMgPSBzZXRTdGFLZXlQYXJhbXMtPnNpbmdsZVRpZFJjOworCisgICAvKiBTdG9yZSBzZXQga2V5IHBvaW50ZXIsIGFzIHRoaXMgd2lsbCBiZSB1c2VkIGZvciByZXNwb25zZSAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IHNldFN0YUtleVBhcmFtczsKKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gd2RpU2V0U3RhS2V5UGFyYW07CisKKyAgIHN0YXR1cyA9IFdESV9TZXRTVEFCY2FzdEtleVJlcSh3ZGlTZXRTdGFLZXlQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfU2V0U1RBS2V5UnNwQ2IpV0RBX1NldEJjYXN0U3RhS2V5UmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiRmFpbHVyZSBpbiBzZXQgQkNBU1QgU1RBIEtleSBSZXEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKyAgICAgIHNldFN0YUtleVBhcmFtcy0+c3RhdHVzID0gZVNJUl9GQUlMVVJFIDsKKyAgICAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9TRVRfU1RBX0JDQVNUS0VZX1JTUCwgKHZvaWQgKilzZXRTdGFLZXlQYXJhbXMsIDApIDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1JlbW92ZVN0YUtleVJlcUNhbGxiYWNrCisgKiBzZW5kIFNFVCBCU1Mga2V5IFJTUCBiYWNrIHRvIFBFCisgKi8gCit2b2lkIFdEQV9SZW1vdmVTdGFLZXlSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7IAorICAgdFdEQV9DYkNvbnRleHQgKnBXREE7IAorICAgdFJlbW92ZVN0YUtleVBhcmFtcyAqcmVtb3ZlU3RhS2V5UGFyYW1zOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIHJlbW92ZVN0YUtleVBhcmFtcyA9ICh0UmVtb3ZlU3RhS2V5UGFyYW1zICopcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW07CisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICByZW1vdmVTdGFLZXlQYXJhbXMtPnN0YXR1cyA9IENPTlZFUlRfV0RJMlNJUl9TVEFUVVMoc3RhdHVzKSA7CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9SRU1PVkVfU1RBS0VZX1JTUCwgKHZvaWQgKilyZW1vdmVTdGFLZXlQYXJhbXMgLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1JlbW92ZVN0YUtleVJlcQorICogUmVxdWVzdCB0byBXREkgdG8gcmVtb3ZlIHRoZSBTVEEga2V5KCBrZXkgZm9yIFVuaWNhc3QgZnJhbWVzIEVuY3J5cHRpb24pCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzUmVtb3ZlU3RhS2V5UmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRSZW1vdmVTdGFLZXlQYXJhbXMgKnJlbW92ZVN0YUtleVBhcmFtcyApCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICBXRElfUmVtb3ZlU1RBS2V5UmVxUGFyYW1zVHlwZSAqd2RpUmVtb3ZlU3RhS2V5UGFyYW0gPSAKKyAgICAgICAgICAgICAgICAgIChXRElfUmVtb3ZlU1RBS2V5UmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX1JlbW92ZVNUQUtleVJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlSZW1vdmVTdGFLZXlQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpUmVtb3ZlU3RhS2V5UGFyYW0pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgLyogY29weSByZW1vdmUgU1RBIGtleSBwYXJhbXMgdG8gV0RJIHN0cnVjdHVyZSovCisgICB3ZGlSZW1vdmVTdGFLZXlQYXJhbS0+d2RpS2V5SW5mby51Y1NUQUlkeCA9IHJlbW92ZVN0YUtleVBhcmFtcy0+c3RhSWR4OworICAgd2RpUmVtb3ZlU3RhS2V5UGFyYW0tPndkaUtleUluZm8ud2RpRW5jVHlwZSA9IHJlbW92ZVN0YUtleVBhcmFtcy0+ZW5jVHlwZTsKKyAgIHdkaVJlbW92ZVN0YUtleVBhcmFtLT53ZGlLZXlJbmZvLnVjS2V5SWQgPSByZW1vdmVTdGFLZXlQYXJhbXMtPmtleUlkOworICAgd2RpUmVtb3ZlU3RhS2V5UGFyYW0tPndkaUtleUluZm8udWNVbmljYXN0ID0gcmVtb3ZlU3RhS2V5UGFyYW1zLT51bmljYXN0OworICAgd2RpUmVtb3ZlU3RhS2V5UGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgIC8qIFN0b3JlIHJlbW92ZSBrZXkgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcmVtb3ZlU3RhS2V5UGFyYW1zOworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSB3ZGlSZW1vdmVTdGFLZXlQYXJhbTsKKworICAgc3RhdHVzID0gV0RJX1JlbW92ZVNUQUtleVJlcSh3ZGlSZW1vdmVTdGFLZXlQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAoV0RJX1JlbW92ZVNUQUtleVJzcENiKVdEQV9SZW1vdmVTdGFLZXlSZXFDYWxsYmFjaywgcFdkYVBhcmFtcyk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gcmVtb3ZlIFNUQSBLZXkgUmVxIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICAgICByZW1vdmVTdGFLZXlQYXJhbXMtPnN0YXR1cyA9IGVTSVJfRkFJTFVSRSA7CisgICAgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfUkVNT1ZFX1NUQUtFWV9SU1AsICh2b2lkICopcmVtb3ZlU3RhS2V5UGFyYW1zLCAwKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Jc0hhbmRsZVNldExpbmtTdGF0ZVJlcQorICogVXBkYXRlIHRoZSBXREEgc3RhdGUgYW5kIHJldHVybiB0aGUgc3RhdHVzIHRvIGhhbmRsZSB0aGlzIG1lc3NhZ2Ugb3Igbm90CisgKi8gCisKK1dEQV9wcm9jZXNzU2V0TGlua1N0YXRlU3RhdHVzIFdEQV9Jc0hhbmRsZVNldExpbmtTdGF0ZVJlcSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRXREFfQ2JDb250ZXh0ICpwV0RBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdExpbmtTdGF0ZVBhcmFtcyAqbGlua1N0YXRlUGFyYW1zKQoreworICAgV0RBX3Byb2Nlc3NTZXRMaW5rU3RhdGVTdGF0dXMgc3RhdHVzID0gV0RBX1BST0NFU1NfU0VUX0xJTktfU1RBVEU7CisKKyAgIHN3aXRjaChsaW5rU3RhdGVQYXJhbXMtPnN0YXRlKQorICAgeworICAgICAgY2FzZSBlU0lSX0xJTktfUFJFQVNTT0NfU1RBVEU6CisgICAgICBjYXNlIGVTSVJfTElOS19CVEFNUF9QUkVBU1NPQ19TVEFURToKKyAgICAgICAgLyogCisgICAgICAgICAqIHNldCB0aGUgV0RBIHN0YXRlIHRvIFBSRSBBU1NPQyAKKyAgICAgICAgICogY29weSB0aGUgQlNTSUQgaW50byBwV0RBIHRvIHVzZSBpdCBpbiBqb2luIHJlcXVlc3QgYW5kIHJldHVybiwgCisgICAgICAgICAqIE5vIG5lZWQgdG8gaGFuZGxlIHRoZXNlIG1lc3NhZ2VzLgorICAgICAgICAgKi8KKyAgICAgICAgIHZvc19tZW1fY29weShwV0RBLT5tYWNCU1NJRCxsaW5rU3RhdGVQYXJhbXMtPmJzc2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgICAgICB2b3NfbWVtX2NvcHkocFdEQS0+bWFjU1RBU2VsZixsaW5rU3RhdGVQYXJhbXMtPnNlbGZNYWNBZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgLyogVU1BQyBpcyBpc3N1aW5nIHRoZSBzZXRsaW5rIHN0YXRlIHdpdGggUFJFQVNTT0MgdHdpY2UgKGJlZm9yZSBzZXQgCisgICAgICAgICAqY2hhbm5lbCBhbmQgYWZ0ZXIgKSBzbyByZXNldCB0aGUgV0RBIHN0YXRlIHRvIHJlYWR5IHdoZW4gdGhlIHNlY29uZCAKKyAgICAgICAgICogdGltZSBVTUFDIGlzc3VlIHRoZSBsaW5rIHN0YXRlIHdpdGggUFJFQVNTT0MgCisgICAgICAgICAqLworICAgICAgICAgaWYoV0RBX1BSRV9BU1NPQ19TVEFURSA9PSBwV0RBLT53ZGFTdGF0ZSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJFU0VUIFdEQSBzdGF0ZSBiYWNrIHRvIFdEQV9SRUFEWV9TVEFURSAqLworICAgICAgICAgICAgcFdEQS0+d2RhU3RhdGUgPSBXREFfUkVBRFlfU1RBVEU7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBwV0RBLT53ZGFTdGF0ZSA9IFdEQV9QUkVfQVNTT0NfU1RBVEU7CisgICAgICAgICB9CisgICAgICAgICAvL3BvcHVsYXRlIGxpbmtTdGF0ZSBpbmZvIGluIFdEQUNiQ3R4dAorICAgICAgICAgcFdEQS0+bGlua1N0YXRlID0gbGlua1N0YXRlUGFyYW1zLT5zdGF0ZTsKKyAgICAgICAgIHN0YXR1cyA9IFdEQV9JR05PUkVfU0VUX0xJTktfU1RBVEU7CisgICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGlmKHBXREEtPndkYVN0YXRlICE9IFdEQV9SRUFEWV9TVEFURSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiU2V0IGxpbmsgc3RhdGUgY2FsbGVkIHdoZW4gV0RBIGlzIG5vdCBpbiBSRUFEWSBTVEFURSAiICk7CisgICAgICAgICAgICAgc3RhdHVzID0gV0RBX0lHTk9SRV9TRVRfTElOS19TVEFURTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgfQorICAgCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9TZXRMaW5rU3RhdGVDYWxsYmFjaworICogY2FsbCBiYWNrIGZ1bmN0aW9uIGZvciBzZXQgbGluayBzdGF0ZSBmcm9tIFdESQorICovIAordm9pZCBXREFfU2V0TGlua1N0YXRlQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOworICAgdExpbmtTdGF0ZVBhcmFtcyAqbGlua1N0YXRlUGFyYW1zOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7IAorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIiVzOiBwV2RhUGFyYW1zIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorCisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisKKyAgIGxpbmtTdGF0ZVBhcmFtcyA9ICh0TGlua1N0YXRlUGFyYW1zICopcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gOworCisgICAvKgorICAgICogSW4gU1RBIG1vZGUgc3RhcnQgdGhlIEJBIGFjdGl2aXR5IGNoZWNrIHRpbWVyIGFmdGVyIGFzc29jaWF0aW9uCisgICAgKiBhbmQgaW4gQVAgbW9kZSBzdGFydCBCQSBhY3Rpdml0eSBjaGVjayB0aW1lciBhZnRlciBCU1Mgc3RhcnQgKi8KKyAgIGlmKCAoKGxpbmtTdGF0ZVBhcmFtcy0+c3RhdGUgPT0gZVNJUl9MSU5LX1BPU1RBU1NPQ19TVEFURSkgJiYKKyAgICAgICAgIHN0YXR1cyA9PSBXRElfU1RBVFVTX1NVQ0NFU1MpIHx8ICAoKHN0YXR1cyA9PSBXRElfU1RBVFVTX1NVQ0NFU1MpICYmCisgICAgICAgKGxpbmtTdGF0ZVBhcmFtcy0+c3RhdGUgPT0gZVNJUl9MSU5LX0FQX1NUQVRFKSkgKQorICAgeworICAgICAgV0RBX1NUQVJUX1RJTUVSKCZwV0RBLT53ZGFUaW1lcnMuYmFBY3Rpdml0eUNoa1Rtcik7CisgICB9CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9TRVRfTElOS19TVEFURV9SU1AsICh2b2lkICopbGlua1N0YXRlUGFyYW1zICwgMCkgOworCisgICAvKiAKKyAgICAqIE5vIHJlc3BvbmUgcmVxdWlyZWQgZm9yIFdEQV9TRVRfTElOS19TVEFURSBzbyBmcmVlIHRoZSByZXF1ZXN0IAorICAgICogcGFyYW0gaGVyZQorICAgICovCisgICBpZiggcFdkYVBhcmFtcyAhPSBOVUxMICkKKyAgIHsKKyAgICAgIGlmKCBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSAhPSBOVUxMICkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgICAgfQorICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgfQorICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1NldExpbmtTdGF0ZQorICogUmVxdWVzdCB0byBXREkgdG8gc2V0IHRoZSBsaW5rIHN0YXR1cy4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZXRMaW5rU3RhdGUodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMaW5rU3RhdGVQYXJhbXMgKmxpbmtTdGF0ZVBhcmFtcykKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTIDsKKyAgIFdESV9TZXRMaW5rUmVxUGFyYW1zVHlwZSAqd2RpU2V0TGlua1N0YXRlUGFyYW0gPSAKKyAgICAgICAgICAgICAgICAgIChXRElfU2V0TGlua1JlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9TZXRMaW5rUmVxUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWM7CisgICBwTWFjID0gKHRwQW5pU2lyR2xvYmFsIClWT1NfR0VUX01BQ19DVFhUKHBXREEtPnBWb3NDb250ZXh0KTsKKworICAgaWYoTlVMTCA9PSBwTWFjKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOnBNYWMgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpU2V0TGlua1N0YXRlUGFyYW0pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaVNldExpbmtTdGF0ZVBhcmFtKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIGlmKFdEQV9JR05PUkVfU0VUX0xJTktfU1RBVEUgPT0gCisgICAgICAgICAgICAgICAgICBXREFfSXNIYW5kbGVTZXRMaW5rU3RhdGVSZXEocFdEQSxsaW5rU3RhdGVQYXJhbXMpKQorICAgeworICAgICAgc3RhdHVzID0gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICB2b3NfbWVtX2NvcHkod2RpU2V0TGlua1N0YXRlUGFyYW0tPndkaUxpbmtJbmZvLm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rU3RhdGVQYXJhbXMtPmJzc2lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICAgICAgdm9zX21lbV9jb3B5KHdkaVNldExpbmtTdGF0ZVBhcmFtLT53ZGlMaW5rSW5mby5tYWNTZWxmU3RhTWFjQWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1N0YXRlUGFyYW1zLT5zZWxmTWFjQWRkciwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICAgIHdkaVNldExpbmtTdGF0ZVBhcmFtLT53ZGlMaW5rSW5mby53ZGlMaW5rU3RhdGUgPSBsaW5rU3RhdGVQYXJhbXMtPnN0YXRlOworICAgICAgd2RpU2V0TGlua1N0YXRlUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgICAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgICAgIC8qIFN0b3JlIHJlbW92ZSBrZXkgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICAgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9ICh2b2lkICopbGlua1N0YXRlUGFyYW1zIDsKKworICAgICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICAgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2b2lkICopd2RpU2V0TGlua1N0YXRlUGFyYW0gOworICAgICAgLyogU3RvcCBUaW1lciBvbmx5IG90aGVyIHRoYW4gR08gcm9sZSBhbmQgY29uY3VycmVudCBzZXNzaW9uICovCisgICAgICBpZiggKGxpbmtTdGF0ZVBhcmFtcy0+c3RhdGUgPT0gZVNJUl9MSU5LX0lETEVfU1RBVEUpCisgICAgICAgICAgJiYgIXZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSAmJgorICAgICAgICAgICh3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpICE9IGVTWVNURU1fQVBfUk9MRSkgKQorICAgICAgeworICAgICAgICAgV0RBX1NUT1BfVElNRVIoJnBXREEtPndkYVRpbWVycy5iYUFjdGl2aXR5Q2hrVG1yKTsKKyAgICAgIH0KKworICAgICAgc3RhdHVzID0gV0RJX1NldExpbmtTdGF0ZVJlcSh3ZGlTZXRMaW5rU3RhdGVQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX1NldExpbmtTdGF0ZVJzcENiKVdEQV9TZXRMaW5rU3RhdGVDYWxsYmFjaywgcFdkYVBhcmFtcyk7CisKKyAgICAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICJGYWlsdXJlIGluIHNldCBsaW5rIHN0YXRlIFJlcSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpU2V0TGlua1N0YXRlUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShsaW5rU3RhdGVQYXJhbXMpOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfR2V0U3RhdHNSZXFQYXJhbXNDYWxsYmFjaworICogc2VuZCB0aGUgcmVzcG9uc2UgdG8gUEUgd2l0aCBTdGF0cyByZWNlaXZlZCBmcm9tIFdESQorICovIAordm9pZCBXREFfR2V0U3RhdHNSZXFQYXJhbXNDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9HZXRTdGF0c1JzcFBhcmFtc1R5cGUgKndkaUdldFN0YXRzUnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9DYkNvbnRleHQgKnBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwVXNlckRhdGEgOworICAgdEFuaUdldFBFU3RhdHNSc3AgKnBHZXRQRVN0YXRzUnNwUGFyYW1zOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHBHZXRQRVN0YXRzUnNwUGFyYW1zID0gCisgICAgICAgKHRBbmlHZXRQRVN0YXRzUnNwICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRBbmlHZXRQRVN0YXRzUnNwKSArCisgICAgICAgKHdkaUdldFN0YXRzUnNwLT51c01zZ0xlbiAtIHNpemVvZihXRElfR2V0U3RhdHNSc3BQYXJhbXNUeXBlKSkpOworCisgICBpZihOVUxMID09IHBHZXRQRVN0YXRzUnNwUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHZvc19tZW1fc2V0KHBHZXRQRVN0YXRzUnNwUGFyYW1zLCB3ZGlHZXRTdGF0c1JzcC0+dXNNc2dMZW4sIDApOworICAgcEdldFBFU3RhdHNSc3BQYXJhbXMtPm1zZ1R5cGUgPSB3ZGlHZXRTdGF0c1JzcC0+dXNNc2dUeXBlOworICAgcEdldFBFU3RhdHNSc3BQYXJhbXMtPm1zZ0xlbiA9IHNpemVvZih0QW5pR2V0UEVTdGF0c1JzcCkgKyAKKyAgICAgICAgICAgICAgICAgICAod2RpR2V0U3RhdHNSc3AtPnVzTXNnTGVuIC0gc2l6ZW9mKFdESV9HZXRTdGF0c1JzcFBhcmFtc1R5cGUpKTsKKyAgIHBHZXRQRVN0YXRzUnNwUGFyYW1zLT5tc2dMZW4gID0gd2RpR2V0U3RhdHNSc3AtPnVzTXNnTGVuICsgc2l6ZW9mKHRBTklfVTgpOworCisgIC8vRmlsbCB0aGUgU2Vzc2lvbiBJZCBQcm9wZXJseSBpbiBQRQorICAgcEdldFBFU3RhdHNSc3BQYXJhbXMtPnNlc3Npb25JZCA9IDA7CisgICBwR2V0UEVTdGF0c1JzcFBhcmFtcy0+cmMgPSAKKyAgICAgICAgICAgICAgICAgICAgICBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHdkaUdldFN0YXRzUnNwLT53ZGlTdGF0dXMpOworICAgcEdldFBFU3RhdHNSc3BQYXJhbXMtPnN0YUlkICAgPSB3ZGlHZXRTdGF0c1JzcC0+dWNTVEFJZHg7CisgICBwR2V0UEVTdGF0c1JzcFBhcmFtcy0+c3RhdHNNYXNrID0gd2RpR2V0U3RhdHNSc3AtPnVTdGF0c01hc2s7CisKKyAgIHZvc19tZW1fY29weSggcEdldFBFU3RhdHNSc3BQYXJhbXMgKyAxLAorICAgICAgICAgICAgICAgICAgd2RpR2V0U3RhdHNSc3AgKyAxLAorICAgICAgICAgICAgICAgICAgd2RpR2V0U3RhdHNSc3AtPnVzTXNnTGVuIC0gc2l6ZW9mKFdESV9HZXRTdGF0c1JzcFBhcmFtc1R5cGUpKTsKKworICAvKiBzZW5kIHJlc3BvbnNlIHRvIFVNQUMqLworICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX0dFVF9TVEFUSVNUSUNTX1JTUCwgcEdldFBFU3RhdHNSc3BQYXJhbXMgLCAwKSA7CisgICAKKyAgIHJldHVybjsKK30KKworCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzR2V0U3RhdHNSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIGdldCB0aGUgc3RhdGlzdGljcworICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0dldFN0YXRzUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFuaUdldFBFU3RhdHNSZXEgKnBHZXRTdGF0c1BhcmFtcykKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTIDsKKyAgIFdESV9HZXRTdGF0c1JlcVBhcmFtc1R5cGUgd2RpR2V0U3RhdHNQYXJhbTsKKyAgIHRBbmlHZXRQRVN0YXRzUnNwICpwR2V0UEVTdGF0c1JzcFBhcmFtczsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICB3ZGlHZXRTdGF0c1BhcmFtLndkaUdldFN0YXRzUGFyYW1zSW5mby51Y1NUQUlkeCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdldFN0YXRzUGFyYW1zLT5zdGFJZDsKKyAgIHdkaUdldFN0YXRzUGFyYW0ud2RpR2V0U3RhdHNQYXJhbXNJbmZvLnVTdGF0c01hc2sgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHZXRTdGF0c1BhcmFtcy0+c3RhdHNNYXNrOworCisgICB3ZGlHZXRTdGF0c1BhcmFtLndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgIHN0YXR1cyA9IFdESV9HZXRTdGF0c1JlcSgmd2RpR2V0U3RhdHNQYXJhbSwgCisgICAgICAgKFdESV9HZXRTdGF0c1JzcENiKVdEQV9HZXRTdGF0c1JlcVBhcmFtc0NhbGxiYWNrLCBwV0RBKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgIkZhaWx1cmUgaW4gR2V0IFN0YXRzIFJlcSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHBHZXRQRVN0YXRzUnNwUGFyYW1zID0gCisgICAgICAgICAodEFuaUdldFBFU3RhdHNSc3AgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodEFuaUdldFBFU3RhdHNSc3ApKTsKKyAgICAgIGlmKE5VTEwgPT0gcEdldFBFU3RhdHNSc3BQYXJhbXMpIAorICAgICAgeworICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgICAgfQorCisgICAgICBwR2V0UEVTdGF0c1JzcFBhcmFtcy0+bXNnVHlwZSA9IFdEQV9HRVRfU1RBVElTVElDU19SU1A7CisgICAgICBwR2V0UEVTdGF0c1JzcFBhcmFtcy0+bXNnTGVuID0gc2l6ZW9mKHRBbmlHZXRQRVN0YXRzUnNwKTsKKyAgICAgIHBHZXRQRVN0YXRzUnNwUGFyYW1zLT5zdGFJZCA9IHBHZXRTdGF0c1BhcmFtcy0+c3RhSWQ7CisgICAgICBwR2V0UEVTdGF0c1JzcFBhcmFtcy0+cmMgICAgPSBlU0lSX0ZBSUxVUkU7CisgICAgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfR0VUX1NUQVRJU1RJQ1NfUlNQLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEdldFBFU3RhdHNSc3BQYXJhbXMsIDApIDsKKyAgIH0KKworICAgLyogRnJlZSB0aGUgcmVxdWVzdCBtZXNzYWdlICovCisgICB2b3NfbWVtX2ZyZWUocEdldFN0YXRzUGFyYW1zKTsKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1VwZGF0ZUVEQ0FQYXJhbUNhbGxiYWNrCisgKiBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIFVwZGF0ZSBFRENBIHBhcmFtcyBmcm9tIFdESQorICovIAordm9pZCBXREFfVXBkYXRlRURDQVBhcmFtQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRFZGNhUGFyYW1zICpwRWRjYVBhcmFtczsgCisgICAKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICBwRWRjYVBhcmFtcyA9ICh0RWRjYVBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtIDsKKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICB2b3NfbWVtX2ZyZWUocEVkY2FQYXJhbXMpOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzVXBkYXRlRURDQVBhcmFtUmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byBVcGRhdGUgdGhlIEVEQ0EgcGFyYW1zLgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1VwZGF0ZUVEQ0FQYXJhbVJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RWRjYVBhcmFtcyAqcEVkY2FQYXJhbXMpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICBXRElfVXBkYXRlRURDQVBhcmFtc1R5cGUgKndkaUVkY2FQYXJhbSA9IAorICAgICAgICAgICAgICAgICAgICAgKFdESV9VcGRhdGVFRENBUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9VcGRhdGVFRENBUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHdkaUVkY2FQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpRWRjYVBhcmFtKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaUVkY2FQYXJhbS0+d2RpRURDQUluZm8udWNCc3NJZHggPSBwRWRjYVBhcmFtcy0+YnNzSWR4OworICAgd2RpRWRjYVBhcmFtLT53ZGlFRENBSW5mby51Y0VEQ0FQYXJhbXNWYWxpZCA9IHBFZGNhUGFyYW1zLT5oaWdoUGVyZm9ybWFuY2U7CisgICBXREFfVXBkYXRlRWRjYVBhcmFtc0ZvckFDKHBXREEsICZ3ZGlFZGNhUGFyYW0tPndkaUVEQ0FJbmZvLndkaUVkY2FCRUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRWRjYVBhcmFtcy0+YWNiZSk7CisgICBXREFfVXBkYXRlRWRjYVBhcmFtc0ZvckFDKHBXREEsICZ3ZGlFZGNhUGFyYW0tPndkaUVEQ0FJbmZvLndkaUVkY2FCS0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRWRjYVBhcmFtcy0+YWNiayk7CisgICBXREFfVXBkYXRlRWRjYVBhcmFtc0ZvckFDKHBXREEsICZ3ZGlFZGNhUGFyYW0tPndkaUVEQ0FJbmZvLndkaUVkY2FWSUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRWRjYVBhcmFtcy0+YWN2aSk7CisgICBXREFfVXBkYXRlRWRjYVBhcmFtc0ZvckFDKHBXREEsICZ3ZGlFZGNhUGFyYW0tPndkaUVEQ0FJbmZvLndkaUVkY2FWT0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRWRjYVBhcmFtcy0+YWN2byk7CisgICB3ZGlFZGNhUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIC8qIFN0b3JlIHJlbW92ZSBrZXkgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9ICh2b2lkICopcEVkY2FQYXJhbXMgOworCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKil3ZGlFZGNhUGFyYW0gOworCisgICBzdGF0dXMgPSBXRElfVXBkYXRlRURDQVBhcmFtcyh3ZGlFZGNhUGFyYW0sIAorICAgICAgICAgICAgICAgKFdESV9VcGRhdGVFRENBUGFyYW1zUnNwQ2IpV0RBX1VwZGF0ZUVEQ0FQYXJhbUNhbGxiYWNrLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluIFVwZGF0ZSBFRENBIFBhcmFtcyBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgICAgdm9zX21lbV9mcmVlKHBFZGNhUGFyYW1zKTsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0FkZEJBUmVxQ2FsbGJhY2sKKyAqIHNlbmQgQUREIEJBIFJTUCBiYWNrIHRvIFBFCisgKi8gCit2b2lkIFdEQV9BZGRCQVJlcUNhbGxiYWNrKFdESV9BZGRCQVJzcGluZm9UeXBlICpwQWRkQkFSc3BQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7IAorICAgdFdEQV9DYkNvbnRleHQgKnBXREE7CisgICB0QWRkQkFQYXJhbXMgKnBBZGRCQVJlcVBhcmFtczsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzOiBwV2RhUGFyYW1zIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorICAgcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBXZGFQYXJhbXMtPnBXZGFDb250ZXh0OworICAgcEFkZEJBUmVxUGFyYW1zID0gKHRBZGRCQVBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtOworCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKworICAgcEFkZEJBUmVxUGFyYW1zLT5zdGF0dXMgPSBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHBBZGRCQVJzcFBhcmFtcy0+d2RpU3RhdHVzKSA7CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9BRERCQV9SU1AsICh2b2lkICopcEFkZEJBUmVxUGFyYW1zICwgMCkgOworCisgICByZXR1cm4gOworfQorCisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NBZGRCQVJlcQorICogUmVxdWVzdCB0byBXREkgdG8gVXBkYXRlIHRoZSBBRERCQSBSRVEgcGFyYW1zLgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0FkZEJBUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCBWT1NfU1RBVFVTIHN0YXR1cywKKyAgICAgICAgICAgdEFOSV9VMTYgYmFTZXNzaW9uSUQsIHRBTklfVTggc3RhSWR4LCB0QWRkQkFQYXJhbXMgKnBBZGRCQVJlcVBhcmFtcykKK3sKKyAgIFdESV9BZGRCQVJlcVBhcmFtc1R5cGUgKndkaUFkZEJBUmVxUGFyYW0gPSAKKyAgICAgICAgICAgICAgICAgICAgIChXRElfQWRkQkFSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0FkZEJBUmVxUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHdkaUFkZEJBUmVxUGFyYW0pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaUFkZEJBUmVxUGFyYW0pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgZG8KKyAgIHsKKyAgICAgIFdESV9BZGRCQVJlcWluZm9UeXBlICp3ZGlBZGRCYUluZm8gPSAmd2RpQWRkQkFSZXFQYXJhbS0+d2RpQkFJbmZvVHlwZSA7CisKKyAgICAgIHdkaUFkZEJhSW5mby0+dWNTVEFJZHggPSBzdGFJZHggOworICAgICAgd2RpQWRkQmFJbmZvLT51Y0JhU2Vzc2lvbklEID0gYmFTZXNzaW9uSUQgOworICAgICAgd2RpQWRkQmFJbmZvLT51Y1dpblNpemUgICAgID0gV0RBX0JBX01BWF9XSU5TSVpFIDsKKworICAgfSB3aGlsZSgwKSA7CisgICB3ZGlBZGRCQVJlcVBhcmFtLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEwgOworCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKil3ZGlBZGRCQVJlcVBhcmFtIDsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcEFkZEJBUmVxUGFyYW1zOworCisgICBzdGF0dXMgPSBXRElfQWRkQkFSZXEod2RpQWRkQkFSZXFQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0FkZEJBUnNwQ2IpV0RBX0FkZEJBUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gQUREIEJBIFJFUSBQYXJhbXMgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgICAgIHBBZGRCQVJlcVBhcmFtcy0+c3RhdHVzID0gZVNJUl9GQUlMVVJFOworICAgICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX0FEREJBX1JTUCwgKHZvaWQgKilwQWRkQkFSZXFQYXJhbXMgLCAwKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworCit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0FkZEJBU2Vzc2lvblJlcUNhbGxiYWNrCisgKiBzZW5kIEFERCBCQSBTRVNTSU9OIFJTUCBiYWNrIHRvIFBFLyhvciBUTCkKKyAqLyAKK3ZvaWQgV0RBX0FkZEJBU2Vzc2lvblJlcUNhbGxiYWNrKAorICAgICAgICAgICAgICBXRElfQWRkQkFTZXNzaW9uUnNwUGFyYW1zVHlwZSAqd2RpQWRkQmFTZXNzaW9uLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUyA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsgCisgICB0V0RBX0NiQ29udGV4dCAqcFdEQTsgCisgICB0QWRkQkFQYXJhbXMgKnBBZGRCQVJlcVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIHBBZGRCQVJlcVBhcmFtcyA9ICh0QWRkQkFQYXJhbXMgKilwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbTsKKworICAgaWYoIE5VTEwgPT0gcEFkZEJBUmVxUGFyYW1zICkKKyAgIHsKKworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwQWRkQkFSZXFQYXJhbXMgcmVjZWl2ZWQgTlVMTCAiICxfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgcmV0dXJuIDsKKyAgIH0KKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisKKyAgIC8qIAorICAgICogaWYgV0RBIGluIHVwZGF0ZSBUTCBzdGF0ZSwgdXBkYXRlIFRMIHdpdGggQkEgc2Vzc2lvbiBwYXJhbWEgYW5kIHNlbmQKKyAgICAqIGFub3RoZXIgcmVxdWVzdCB0byBIQUwoL1dESSkgKEFERF9CQV9SRVEpCisgICAgKi8KKyAgIAorICAgaWYoKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSAKKyAgICAgICAgICAgICAgICAgICAgICAgQ09OVkVSVF9XREkyVk9TX1NUQVRVUyh3ZGlBZGRCYVNlc3Npb24tPndkaVN0YXR1cykpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdEQV9CQV9VUERBVEVfVExfU1RBVEUgPT0gcFdEQS0+d2RhU3RhdGUpKQorICAgeworICAgICAgLyogVXBkYXRlIFRMIHdpdGggQkEgaW5mbyByZWNlaXZlZCBmcm9tIEhBTC9XREkgKi8KKyAgICAgIHN0YXR1cyA9ICBXREFfVExfQkFfU0VTU0lPTl9BREQocFdEQS0+cFZvc0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RpQWRkQmFTZXNzaW9uLT51c0JhU2Vzc2lvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkaUFkZEJhU2Vzc2lvbi0+dWNTVEFJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RpQWRkQmFTZXNzaW9uLT51Y0JhVElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkaUFkZEJhU2Vzc2lvbi0+dWNCYUJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RpQWRkQmFTZXNzaW9uLT51Y1dpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RpQWRkQmFTZXNzaW9uLT51c0JhU1NOICk7CisKKyAgICAgIFdEQV9Qcm9jZXNzQWRkQkFSZXEocFdEQSwgc3RhdHVzLCB3ZGlBZGRCYVNlc3Npb24tPnVzQmFTZXNzaW9uSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlBZGRCYVNlc3Npb24tPnVjU1RBSWR4LCBwQWRkQkFSZXFQYXJhbXMpIDsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBBZGRCQVJlcVBhcmFtcy0+c3RhdHVzID0gCisgICAgICAgICAgICBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHdkaUFkZEJhU2Vzc2lvbi0+d2RpU3RhdHVzKSA7CisgIAorICAgICAgLyogU2V0dGluZyBGbGFnIHRvIGluZGljYXRlIHRoYXQgU2V0IEJBIGlzIHN1Y2Nlc3MgKi8KKyAgICAgIGlmKFdESV9TVEFUVVNfU1VDQ0VTUyA9PSB3ZGlBZGRCYVNlc3Npb24tPndkaVN0YXR1cykKKyAgICAgIHsKKyAgICAgICAgIHRBTklfVTE2IGN1clN0YSA9IHdkaUFkZEJhU2Vzc2lvbi0+dWNTVEFJZHg7CisgICAgICAgICB0QU5JX1U4IHRpZCA9IHdkaUFkZEJhU2Vzc2lvbi0+dWNCYVRJRDsKKyAgICAgICAgIFdEQV9TRVRfQkFfVFhGTEFHKHBXREEsIGN1clN0YSwgdGlkKSA7CisgICAgICB9CisgICAgICBwV0RBLT53ZGFNc2dQYXJhbSA9IE5VTEw7CisgICAgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfQUREQkFfUlNQLCAodm9pZCAqKXBBZGRCQVJlcVBhcmFtcyAsIDApIDsKKyAgIH0KKworICAgLypSZXNldCB0aGUgV0RBIHN0YXRlIHRvIFJFQURZICovCisgICBwV0RBLT53ZGFTdGF0ZSA9IFdEQV9SRUFEWV9TVEFURTsKKworICAgcmV0dXJuIDsKK30KKworCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzQWRkQkFTZXNzaW9uUmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byBVcGRhdGUgdGhlIEFEREJBIFJFUSBwYXJhbXMuCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzQWRkQkFTZXNzaW9uUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFkZEJBUGFyYW1zICpwQWRkQkFSZXFQYXJhbXMpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICBXRElfQWRkQkFTZXNzaW9uUmVxUGFyYW1zVHlwZSAqd2RpQWRkQkFTZXNzaW9uUmVxUGFyYW0gPSAKKyAgICAgICAgICAgICAgICAgICAgIChXRElfQWRkQkFTZXNzaW9uUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0FkZEJBU2Vzc2lvblJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlBZGRCQVNlc3Npb25SZXFQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpQWRkQkFTZXNzaW9uUmVxUGFyYW0pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgLyoKKyAgICAqIFBvcHVsYXRlIEFERCBCQSBwYXJhbWV0ZXJzIGFuZCBwYXNzIHRoZXNlIHBhYXJtZXRlcnMgdG8gV0RJLgorICAgICogQUREIEJBIFNFU1NJT04gUkVRIHdpbGwgdXBkYXRlIEhBTCB3aXRoIEJBIHBhcmFtcywgV0RBLCB3aWxsIGNoYW5nZXMKKyAgICAqIHRoZSBzdGF0ZSB0byB0cmFjayBpZiB0aGVzZSBpcyBCQSByZWNpcGllbnQgY2FzZSBvciBCQSBpbml0aWF0b3IgCisgICAgKiBjYXNlLgorICAgICovCisgICBkbworICAgeworICAgICAgV0RJX0FkZEJBU2Vzc2lvblJlcWluZm9UeXBlICp3ZGlCQUluZm9UeXBlID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndkaUFkZEJBU2Vzc2lvblJlcVBhcmFtLT53ZGlCQVNlc3Npb25JbmZvVHlwZSA7CisgICAgICAvKiB2b3NfbWVtX2NvcHkod2RpQkFJbmZvVHlwZS0+bWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRCQVJlcVBhcmFtcy0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOyovCisgICAgICB3ZGlCQUluZm9UeXBlLT51Y1NUQUlkeCA9IHBBZGRCQVJlcVBhcmFtcy0+c3RhSWR4OworICAgICAgdm9zX21lbV9jb3B5KHdkaUJBSW5mb1R5cGUtPm1hY1BlZXJBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICBwQWRkQkFSZXFQYXJhbXMtPnBlZXJNYWNBZGRyLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICAgICAgd2RpQkFJbmZvVHlwZS0+dWNCYVRJRCA9IHBBZGRCQVJlcVBhcmFtcy0+YmFUSUQ7CisKKyAgICAgIHdkaUJBSW5mb1R5cGUtPnVjQmFQb2xpY3kgPSBwQWRkQkFSZXFQYXJhbXMtPmJhUG9saWN5OworICAgICAgd2RpQkFJbmZvVHlwZS0+dXNCYUJ1ZmZlclNpemUgPSBwQWRkQkFSZXFQYXJhbXMtPmJhQnVmZmVyU2l6ZTsKKyAgICAgIHdkaUJBSW5mb1R5cGUtPnVzQmFUaW1lb3V0ID0gcEFkZEJBUmVxUGFyYW1zLT5iYVRpbWVvdXQ7CisgICAgICB3ZGlCQUluZm9UeXBlLT51c0JhU1NOID0gcEFkZEJBUmVxUGFyYW1zLT5iYVNTTjsKKyAgICAgIHdkaUJBSW5mb1R5cGUtPnVjQmFEaXJlY3Rpb24gPSBwQWRkQkFSZXFQYXJhbXMtPmJhRGlyZWN0aW9uOworCisgICAgICAvKiBjaGVjayB0aGUgQkEgZGlyZWN0aW9uIGFuZCB1cGRhdGUgc3RhdGUgYWNjb3JkaW5nbHkgKi8KKyAgICAgIChlQkFfUkVDSVBJRU5UID09IHdkaUJBSW5mb1R5cGUtPnVjQmFEaXJlY3Rpb24pIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAocFdEQS0+d2RhU3RhdGUgPSBXREFfQkFfVVBEQVRFX1RMX1NUQVRFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocFdEQS0+d2RhU3RhdGUgPSBXREFfQkFfVVBEQVRFX0xJTV9TVEFURSk7CisgCisgICB9d2hpbGUoMCkgOworICAgd2RpQWRkQkFTZXNzaW9uUmVxUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIC8qIFN0b3JlIEFERCBCQSBwb2ludGVyLCBhcyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgcmVzcG9uc2UgKi8KKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gKHZvaWQgKilwQWRkQkFSZXFQYXJhbXMgOworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2b2lkICopd2RpQWRkQkFTZXNzaW9uUmVxUGFyYW0gOworCisgICBzdGF0dXMgPSBXRElfQWRkQkFTZXNzaW9uUmVxKHdkaUFkZEJBU2Vzc2lvblJlcVBhcmFtLCAKKyAgICAgICAgICAgICAgKFdESV9BZGRCQVNlc3Npb25Sc3BDYilXREFfQWRkQkFTZXNzaW9uUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAiRmFpbHVyZSBpbiBBREQgQkEgU2Vzc2lvbiBSRVEgUGFyYW1zIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKKworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9EZWxCQU5vdGlmeVRMCisgKiBzZW5kIERFTCBCQSBJTkQgdG8gVEwKKyAqLyAKK3ZvaWQgV0RBX0RlbEJBTm90aWZ5VEwodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREZWxCQVBhcmFtcyAqcERlbEJBUmVxUGFyYW1zKQoreworICAgdHBEZWxCQUluZCBwRGVsQkFJbmQgPSAodHBEZWxCQUluZCl2b3NfbWVtX21hbGxvYyhzaXplb2YoIHREZWxCQUluZCApKTsKKyAgIC8vdFNpck1zZ1EgbXNnOworICAgdm9zX21zZ190IHZvc01zZzsKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworCisgICBpZihOVUxMID09IHBEZWxCQUluZCkgCisgICB7IAorICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApIDsgCisgICAgICByZXR1cm47IAorICAgfSAKKworICAgcERlbEJBSW5kLT5tZXNnVHlwZSA9IFdEQV9ERUxFVEVCQV9JTkQ7CisgICBwRGVsQkFJbmQtPnN0YUlkeCA9ICh0QU5JX1U4KSBwRGVsQkFSZXFQYXJhbXMtPnN0YUlkeDsKKyAgIHBEZWxCQUluZC0+YmFUSUQgPSAodEFOSV9VOCkgcERlbEJBUmVxUGFyYW1zLT5iYVRJRDsKKyAgIHBEZWxCQUluZC0+bWVzZ0xlbiA9IHNpemVvZiggdERlbEJBSW5kICk7CisKKyAKKyAgIHZvc01zZy50eXBlID0gV0RBX0RFTEVURUJBX0lORDsKKyAgIHZvc01zZy5ib2R5cHRyID0gcERlbEJBSW5kOworICAgdm9zU3RhdHVzID0gdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfVEwsICZ2b3NNc2cpOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQorICAgeworICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0JBRE1TRzsKKyAgIH0KK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfRGVsQkFSZXFDYWxsYmFjaworICogc2VuZCBERUwgQkEgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX0RlbEJBUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOyAKKyAgIHREZWxCQVBhcmFtcyAqcERlbEJBUmVxUGFyYW1zOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBwV2RhUGFyYW1zIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorICAgcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBXZGFQYXJhbXMtPnBXZGFDb250ZXh0OworICAgcERlbEJBUmVxUGFyYW1zID0gKHREZWxCQVBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtIDsKKworICAgLyogTm90aWZ5IFRMIGFib3V0IERFTCBCQSBpbiBjYXNlIG9mIHJlY2lwaW5ldCAqLworICAgaWYoKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZUJBX1JFQ0lQSUVOVCA9PSBwRGVsQkFSZXFQYXJhbXMtPmJhRGlyZWN0aW9uKSkKKyAgIHsKKyAgICAgIFdEQV9EZWxCQU5vdGlmeVRMKHBXREEsIHBEZWxCQVJlcVBhcmFtcyk7CisgICB9CisKKyAgIC8qIAorICAgICogTm8gcmVzcG9uZSByZXF1aXJlZCBmb3IgV0RBX0RFTEJBX0lORCBzbyBqdXN0IGZyZWUgdGhlIHJlcXVlc3QgCisgICAgKiBwYXJhbSBoZXJlCisgICAgKi8KKyAgIHZvc19tZW1fZnJlZShwRGVsQkFSZXFQYXJhbXMpOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgIHJldHVybiA7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc0RlbEJBUmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byBVcGRhdGUgdGhlIERFTEJBIFJFUSBwYXJhbXMuCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzRGVsQkFSZXEodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdERlbEJBUGFyYW1zICpwRGVsQkFSZXFQYXJhbXMpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICBXRElfRGVsQkFSZXFQYXJhbXNUeXBlICp3ZGlEZWxCQVJlcVBhcmFtID0gCisgICAgICAgICAgICAgICAgICAgICAoV0RJX0RlbEJBUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9EZWxCQVJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisgICB0QU5JX1UxNiBzdGFJZHggPSAwOworICAgdEFOSV9VOCB0aWQgPSAwOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpRGVsQkFSZXFQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpRGVsQkFSZXFQYXJhbSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB3ZGlEZWxCQVJlcVBhcmFtLT53ZGlCQUluZm8udWNTVEFJZHggPSBwRGVsQkFSZXFQYXJhbXMtPnN0YUlkeDsKKyAgIHdkaURlbEJBUmVxUGFyYW0tPndkaUJBSW5mby51Y0JhVElEID0gcERlbEJBUmVxUGFyYW1zLT5iYVRJRDsKKyAgIHdkaURlbEJBUmVxUGFyYW0tPndkaUJBSW5mby51Y0JhRGlyZWN0aW9uID0gcERlbEJBUmVxUGFyYW1zLT5iYURpcmVjdGlvbjsKKyAgIHdkaURlbEJBUmVxUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIC8qIFN0b3JlIERFTCBCQSBwb2ludGVyLCBhcyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgcmVzcG9uc2UgKi8KKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gKHZvaWQgKilwRGVsQkFSZXFQYXJhbXMgOworCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKil3ZGlEZWxCQVJlcVBhcmFtIDsKKworICAgLyogaWYgQkEgZXhjaGFuZ2Ugb3ZlciB0aGUgYWlyIGlzIGZhaWxlZCwgY2xlYXIgdGhpcyB0aWQgaW4gQmFCaXRtYXAKKyAgICAqIG1haW50YWluZWQgaW4gV0RBLCBzbyB0aGF0IFdEQSBjYW4gcmV0cnkgZm9yIGFub3RoZXIgQkEgc2Vzc2lvbgorICAgICovCisgICBzdGFJZHggPSBwRGVsQkFSZXFQYXJhbXMtPnN0YUlkeDsKKyAgIHRpZCA9IHBEZWxCQVJlcVBhcmFtcy0+YmFUSUQ7CisgICBXREFfQ0xFQVJfQkFfVFhGTEFHKHBXREEsIHN0YUlkeCwgdGlkKTsKKworICAgc3RhdHVzID0gV0RJX0RlbEJBUmVxKHdkaURlbEJBUmVxUGFyYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfRGVsQkFSc3BDYilXREFfRGVsQkFSZXFDYWxsYmFjaywgcFdkYVBhcmFtcyk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBERUwgQkEgUkVRIFBhcmFtcyBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7CisKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfQWRkVFNSZXFDYWxsYmFjaworICogc2VuZCBBREQgVFMgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX0FkZFRTUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOyAKKyAgIHRBZGRUc1BhcmFtcyAqcEFkZFRzUmVxUGFyYW1zOworICAgCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBwV2RhUGFyYW1zIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorICAgcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKSBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIHBBZGRUc1JlcVBhcmFtcyA9ICh0QWRkVHNQYXJhbXMgKilwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgIAorICAgcEFkZFRzUmVxUGFyYW1zLT5zdGF0dXMgPSBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHN0YXR1cykgOworCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfQUREX1RTX1JTUCwgKHZvaWQgKilwQWRkVHNSZXFQYXJhbXMgLCAwKSA7CisKKyAgIHJldHVybiA7Cit9CisKKworCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzQWRkVFNSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIFVwZGF0ZSB0aGUgQUREIFRTICBSRVEgcGFyYW1zLgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0FkZFRTUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBZGRUc1BhcmFtcyAqcEFkZFRzUmVxUGFyYW1zKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworICAgV0RJX0FkZFRTUmVxUGFyYW1zVHlwZSAqd2RpQWRkVFNSZXFQYXJhbSA9IAorICAgICAgICAgICAgICAgICAgICAgKFdESV9BZGRUU1JlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXRElfQWRkVFNSZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpQWRkVFNSZXFQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpQWRkVFNSZXFQYXJhbSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB3ZGlBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8udWNTVEFJZHggPSBwQWRkVHNSZXFQYXJhbXMtPnN0YUlkeDsKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby51Y1RzcGVjSWR4ID0gcEFkZFRzUmVxUGFyYW1zLT50c3BlY0lkeDsKKworICAgLy9UUyBJRQorICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpVHNJbmZvLndkaVRzcGVjSUUudWNUeXBlID0gcEFkZFRzUmVxUGFyYW1zLT50c3BlYy50eXBlOworICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpVHNJbmZvLndkaVRzcGVjSUUudWNMZW5ndGggPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRUc1JlcVBhcmFtcy0+dHNwZWMubGVuZ3RoOworICAgCisgICAvL1RTIElFIDogVFMgSU5GTyA6IFRSQUZGSUMKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLndkaVRTaW5mby53ZGlUcmFmZmljLmFja1BvbGljeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLnRzaW5mby50cmFmZmljLmFja1BvbGljeTsKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLndkaVRTaW5mby53ZGlUcmFmZmljLnVzZXJQcmlvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRUc1JlcVBhcmFtcy0+dHNwZWMudHNpbmZvLnRyYWZmaWMudXNlclByaW87CisgICB3ZGlBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8ud2RpVHNwZWNJRS53ZGlUU2luZm8ud2RpVHJhZmZpYy5wc2IgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZFRzUmVxUGFyYW1zLT50c3BlYy50c2luZm8udHJhZmZpYy5wc2I7CisgICB3ZGlBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8ud2RpVHNwZWNJRS53ZGlUU2luZm8ud2RpVHJhZmZpYy5hZ2dyZWdhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLnRzaW5mby50cmFmZmljLmFnZ3JlZ2F0aW9uOworICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpVHNJbmZvLndkaVRzcGVjSUUud2RpVFNpbmZvLndkaVRyYWZmaWMuYWNjZXNzUG9saWN5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRUc1JlcVBhcmFtcy0+dHNwZWMudHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5OworICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpVHNJbmZvLndkaVRzcGVjSUUud2RpVFNpbmZvLndkaVRyYWZmaWMuZGlyZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRUc1JlcVBhcmFtcy0+dHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uOworICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpVHNJbmZvLndkaVRzcGVjSUUud2RpVFNpbmZvLndkaVRyYWZmaWMudHNpZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLnRzaW5mby50cmFmZmljLnRzaWQ7CisgICB3ZGlBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8ud2RpVHNwZWNJRS53ZGlUU2luZm8ud2RpVHJhZmZpYy50cmFmZmljVHlwZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLnRzaW5mby50cmFmZmljLnRyYWZmaWNUeXBlOworICAgCisgICAvL1RTIElFIDogVFMgSU5GTyA6IFNDSEVEVUxFCisgICB3ZGlBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8ud2RpVHNwZWNJRS53ZGlUU2luZm8ud2RpU2NoZWR1bGUuc2NoZWR1bGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRUc1JlcVBhcmFtcy0+dHNwZWMudHNpbmZvLnNjaGVkdWxlLnNjaGVkdWxlOworICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpVHNJbmZvLndkaVRzcGVjSUUud2RpVFNpbmZvLndkaVNjaGVkdWxlLnJzdmQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRUc1JlcVBhcmFtcy0+dHNwZWMudHNpbmZvLnNjaGVkdWxlLnJzdmQ7CisKKyAgIC8vVFMgSUUKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLnVzTm9tTXNkdVN6ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLm5vbU1zZHVTejsKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLnVzTWF4TXNkdVN6ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLm1heE1zZHVTejsKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLnVNaW5TdmNJbnRlcnZhbCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZFRzUmVxUGFyYW1zLT50c3BlYy5taW5TdmNJbnRlcnZhbDsKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLnVNYXhTdmNJbnRlcnZhbCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZFRzUmVxUGFyYW1zLT50c3BlYy5tYXhTdmNJbnRlcnZhbDsKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLnVJbmFjdEludGVydmFsID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLmluYWN0SW50ZXJ2YWw7CisgICB3ZGlBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8ud2RpVHNwZWNJRS51U3VzcGVuZEludGVydmFsID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLnN1c3BlbmRJbnRlcnZhbDsKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLnVTdmNTdGFydFRpbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRUc1JlcVBhcmFtcy0+dHNwZWMuc3ZjU3RhcnRUaW1lOworICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpVHNJbmZvLndkaVRzcGVjSUUudU1pbkRhdGFSYXRlID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLm1pbkRhdGFSYXRlOworICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpVHNJbmZvLndkaVRzcGVjSUUudU1lYW5EYXRhUmF0ZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZFRzUmVxUGFyYW1zLT50c3BlYy5tZWFuRGF0YVJhdGU7CisgICB3ZGlBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8ud2RpVHNwZWNJRS51UGVha0RhdGFSYXRlID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLnBlYWtEYXRhUmF0ZTsKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLnVNYXhCdXJzdFN6ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLm1heEJ1cnN0U3o7CisgICB3ZGlBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8ud2RpVHNwZWNJRS51RGVsYXlCb3VuZCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZFRzUmVxUGFyYW1zLT50c3BlYy5kZWxheUJvdW5kOworICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpVHNJbmZvLndkaVRzcGVjSUUudU1pblBoeVJhdGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRUc1JlcVBhcmFtcy0+dHNwZWMubWluUGh5UmF0ZTsKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLnVzU3VycGx1c0J3ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkVHNSZXFQYXJhbXMtPnRzcGVjLnN1cnBsdXNCdzsKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby53ZGlUc3BlY0lFLnVzTWVkaXVtVGltZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZFRzUmVxUGFyYW1zLT50c3BlYy5tZWRpdW1UaW1lOworCisgICAvKiBUT0RPOiB0QWRkVHNQYXJhbXMgZG9lc24ndCBoYXZlIHRoZSBmb2xsb3dpbmcgZmllbGRzICovCisjaWYgMCAKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby51Y1VhcHNkRmxhZ3MgPSAKKyAgIHdkaUFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby51Y1NlcnZpY2VJbnRlcnZhbCA9IAorICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpVHNJbmZvLnVjU3VzcGVuZEludGVydmFsID0gCisgICB3ZGlBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8udWNEZWxheWVkSW50ZXJ2YWwgPSAKKyNlbmRpZgorICAgd2RpQWRkVFNSZXFQYXJhbS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMIDsKKyAgIAorICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgLyogU3RvcmUgQUREIFRTIHBvaW50ZXIsIGFzIHRoaXMgd2lsbCBiZSB1c2VkIGZvciByZXNwb25zZSAqLworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSAodm9pZCAqKXBBZGRUc1JlcVBhcmFtcyA7CisKKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSAodm9pZCAqKXdkaUFkZFRTUmVxUGFyYW0gOworCisgICBzdGF0dXMgPSBXRElfQWRkVFNSZXEod2RpQWRkVFNSZXFQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgKFdESV9BZGRUc1JzcENiKVdEQV9BZGRUU1JlcUNhbGxiYWNrLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluIEFERCBUUyBSRVEgUGFyYW1zIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICAgICBwQWRkVHNSZXFQYXJhbXMtPnN0YXR1cyA9IGVTSVJfRkFJTFVSRSA7CisgICAgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfQUREX1RTX1JTUCwgKHZvaWQgKilwQWRkVHNSZXFQYXJhbXMgLCAwKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworCit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfRGVsVFNSZXFDYWxsYmFjaworICogc2VuZCBERUwgVFMgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX0RlbFRTUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSkgOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworCisgICAvKiAKKyAgICAqIE5vIHJlc3BvbmUgcmVxdWlyZWQgZm9yIFdEQV9ERUxfVFNfUkVRIHNvIGp1c3QgZnJlZSB0aGUgcmVxdWVzdCAKKyAgICAqIHBhcmFtIGhlcmUKKyAgICAqLworCisgICByZXR1cm4gOworfQorCisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NEZWxUU1JlcQorICogUmVxdWVzdCB0byBXREkgdG8gVXBkYXRlIHRoZSBERUxUUyBSRVEgcGFyYW1zLgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0RlbFRTUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RGVsVHNQYXJhbXMgKnBEZWxUU1JlcVBhcmFtcykKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTIDsKKyAgIFdESV9EZWxUU1JlcVBhcmFtc1R5cGUgKndkaURlbFRTUmVxUGFyYW0gPSAKKyAgICAgICAgICAgICAgICAgICAgIChXRElfRGVsVFNSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0RlbFRTUmVxUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHdkaURlbFRTUmVxUGFyYW0pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaURlbFRTUmVxUGFyYW0pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgdm9zX21lbV9jb3B5KHdkaURlbFRTUmVxUGFyYW0tPndkaURlbFRTSW5mby5tYWNCU1NJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbFRTUmVxUGFyYW1zLT5ic3NJZCwgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisgICB3ZGlEZWxUU1JlcVBhcmFtLT53ZGlEZWxUU0luZm8udWNTVEFJZHggPSBwRGVsVFNSZXFQYXJhbXMtPnN0YUlkeDsKKyAgIHdkaURlbFRTUmVxUGFyYW0tPndkaURlbFRTSW5mby51Y1RzcGVjSWR4ID0gcERlbFRTUmVxUGFyYW1zLT50c3BlY0lkeDsKKyAgIHdkaURlbFRTUmVxUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIC8qIFN0b3JlIERFTCBUUyBwb2ludGVyLCBhcyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgcmVzcG9uc2UgKi8KKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gKHZvaWQgKilwRGVsVFNSZXFQYXJhbXMgOworCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKil3ZGlEZWxUU1JlcVBhcmFtIDsKKworICAgc3RhdHVzID0gV0RJX0RlbFRTUmVxKHdkaURlbFRTUmVxUGFyYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0RlbFRzUnNwQ2IpV0RBX0RlbFRTUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gREVMIFRTIFJFUSBQYXJhbXMgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworCit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1VwZGF0ZUJlYWNvblBhcmFtc0NhbGxiYWNrCisgKiAgRnJlZSB0aGUgbWVtb3J5LiBObyBuZWVkIHRvIHNlbmQgYW55IHJlc3BvbnNlIHRvIFBFIGluIHRoaXMgY2FzZQorICovIAordm9pZCBXREFfVXBkYXRlQmVhY29uUGFyYW1zQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICAvKiAKKyAgICAqIE5vIHJlc3BvbmUgcmVxdWlyZWQgZm9yIFdEQV9VUERBVEVfQkVBQ09OX0lORCBzbyBqdXN0IGZyZWUgdGhlIHJlcXVlc3QgCisgICAgKiBwYXJhbSBoZXJlCisgICAgKi8KKworICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1VwZGF0ZUJlYWNvblBhcmFtcworICogUmVxdWVzdCB0byBXREkgdG8gc2VuZCAgdGhlIGJlYWNvbiBwYXJhbWV0ZXJzIHRvIEhBTCB0byB1cGRhdGUgdGhlIEhhcmR3YXJlCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzVXBkYXRlQmVhY29uUGFyYW1zKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRVcGRhdGVCZWFjb25QYXJhbXMgKnBVcGRhdGVCZWFjb25QYXJhbXMpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICBXRElfVXBkYXRlQmVhY29uUGFyYW1zVHlwZSAqd2RpVXBkYXRlQmVhY29uUGFyYW1zID0gCisgICAgICAgICAgICAgICAgICAgICAoV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXRElfVXBkYXRlQmVhY29uUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHdkaVVwZGF0ZUJlYWNvblBhcmFtcykgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpVXBkYXRlQmVhY29uUGFyYW1zKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaVVwZGF0ZUJlYWNvblBhcmFtcy0+d2RpVXBkYXRlQmVhY29uUGFyYW1zSW5mby51Y0Jzc0lkeCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVwZGF0ZUJlYWNvblBhcmFtcy0+YnNzSWR4OworICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjZlNob3J0UHJlYW1ibGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVcGRhdGVCZWFjb25QYXJhbXMtPmZTaG9ydFByZWFtYmxlOworICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjZlNob3J0U2xvdFRpbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVcGRhdGVCZWFjb25QYXJhbXMtPmZTaG9ydFNsb3RUaW1lOworICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVzQmVhY29uSW50ZXJ2YWwgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVcGRhdGVCZWFjb25QYXJhbXMtPmJlYWNvbkludGVydmFsOworICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjbGxhQ29leGlzdCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVwZGF0ZUJlYWNvblBhcmFtcy0+bGxhQ29leGlzdDsKKyAgIHdkaVVwZGF0ZUJlYWNvblBhcmFtcy0+d2RpVXBkYXRlQmVhY29uUGFyYW1zSW5mby51Y2xsYkNvZXhpc3QgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVcGRhdGVCZWFjb25QYXJhbXMtPmxsYkNvZXhpc3Q7CisgICB3ZGlVcGRhdGVCZWFjb25QYXJhbXMtPndkaVVwZGF0ZUJlYWNvblBhcmFtc0luZm8udWNsbGdDb2V4aXN0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXBkYXRlQmVhY29uUGFyYW1zLT5sbGdDb2V4aXN0OworICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjSHQyME1oekNvZXhpc3Q9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVwZGF0ZUJlYWNvblBhcmFtcy0+aHQyME1oekNvZXhpc3Q7CisgICB3ZGlVcGRhdGVCZWFjb25QYXJhbXMtPndkaVVwZGF0ZUJlYWNvblBhcmFtc0luZm8udWNsbG5Ob25HRkNvZXhpc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVwZGF0ZUJlYWNvblBhcmFtcy0+bGxuTm9uR0ZDb2V4aXN0OworICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXBkYXRlQmVhY29uUGFyYW1zLT5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisgICB3ZGlVcGRhdGVCZWFjb25QYXJhbXMtPndkaVVwZGF0ZUJlYWNvblBhcmFtc0luZm8udWNmUklGU01vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVwZGF0ZUJlYWNvblBhcmFtcy0+ZlJJRlNNb2RlOworICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVzQ2hhbmdlQml0bWFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVcGRhdGVCZWFjb25QYXJhbXMtPnBhcmFtQ2hhbmdlQml0bWFwOworICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEwgOworICAgCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICAvKiBTdG9yZSBVcGRhdGVCZWFjb24gUmVxIHBvaW50ZXIsIGFzIHRoaXMgd2lsbCBiZSB1c2VkIGZvciByZXNwb25zZSAqLworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSAodm9pZCAqKXBVcGRhdGVCZWFjb25QYXJhbXMgOworCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKil3ZGlVcGRhdGVCZWFjb25QYXJhbXMgOworCisgICBzdGF0dXMgPSBXRElfVXBkYXRlQmVhY29uUGFyYW1zUmVxKHdkaVVwZGF0ZUJlYWNvblBhcmFtcywgCisgICAgICAgICAgICAgICAgIChXRElfVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2IpV0RBX1VwZGF0ZUJlYWNvblBhcmFtc0NhbGxiYWNrLAorICAgICAgICAgICAgICAgICBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICJGYWlsdXJlIGluIFVQREFURSBCRUFDT04gUkVRIFBhcmFtcyBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7CisKK30KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfVFNNU3RhdHNSZXFDYWxsYmFjaworICogc2VuZCBUU00gU3RhdHMgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX1RTTVN0YXRzUmVxQ2FsbGJhY2soV0RJX1RTTVN0YXRzUnNwUGFyYW1zVHlwZSAqcHdkaVRTTVN0YXRzUnNwUGFyYW1zLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsgCisgICB0V0RBX0NiQ29udGV4dCAqcFdEQSA9IE5VTEw7IAorICAgdFRTTVN0YXRzICpwVHNtUnNwUGFyYW1zID0gTlVMTDsKKyAKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gRW50ZXJpbmc6ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBwV2RhUGFyYW1zIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorICAgcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKSBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIHBUc21Sc3BQYXJhbXMgPSAodFRTTVN0YXRzICopcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gOworCisgICBpZiggTlVMTCA9PSBwVHNtUnNwUGFyYW1zICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcFRzbVJzcFBhcmFtcyByZWNlaXZlZCBOVUxMICIgLF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICByZXR1cm4gOworICAgfQorCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgIAorICAgcFRzbVJzcFBhcmFtcy0+dHNtTWV0cmljcy5VcGxpbmtQa3RRdWV1ZURseSA9IHB3ZGlUU01TdGF0c1JzcFBhcmFtcy0+VXBsaW5rUGt0UXVldWVEbHk7CisgICB2b3NfbWVtX2NvcHkocFRzbVJzcFBhcmFtcy0+dHNtTWV0cmljcy5VcGxpbmtQa3RRdWV1ZURseUhpc3QsCisgICAgICAgICAgICAgICAgIHB3ZGlUU01TdGF0c1JzcFBhcmFtcy0+VXBsaW5rUGt0UXVldWVEbHlIaXN0LAorICAgICAgICAgICAgICAgICBzaXplb2YocHdkaVRTTVN0YXRzUnNwUGFyYW1zLT5VcGxpbmtQa3RRdWV1ZURseUhpc3QpLworICAgICAgICAgICAgICAgICBzaXplb2YocHdkaVRTTVN0YXRzUnNwUGFyYW1zLT5VcGxpbmtQa3RRdWV1ZURseUhpc3RbMF0pKTsKKyAgIHBUc21Sc3BQYXJhbXMtPnRzbU1ldHJpY3MuVXBsaW5rUGt0VHhEbHkgPSBwd2RpVFNNU3RhdHNSc3BQYXJhbXMtPlVwbGlua1BrdFR4RGx5OworICAgcFRzbVJzcFBhcmFtcy0+dHNtTWV0cmljcy5VcGxpbmtQa3RMb3NzID0gcHdkaVRTTVN0YXRzUnNwUGFyYW1zLT5VcGxpbmtQa3RMb3NzOworICAgcFRzbVJzcFBhcmFtcy0+dHNtTWV0cmljcy5VcGxpbmtQa3RDb3VudCA9IHB3ZGlUU01TdGF0c1JzcFBhcmFtcy0+VXBsaW5rUGt0Q291bnQ7CisgICBwVHNtUnNwUGFyYW1zLT50c21NZXRyaWNzLlJvYW1pbmdDb3VudCA9IHB3ZGlUU01TdGF0c1JzcFBhcmFtcy0+Um9hbWluZ0NvdW50OworICAgcFRzbVJzcFBhcmFtcy0+dHNtTWV0cmljcy5Sb2FtaW5nRGx5ID0gcHdkaVRTTVN0YXRzUnNwUGFyYW1zLT5Sb2FtaW5nRGx5OworCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfVFNNX1NUQVRTX1JTUCwgKHZvaWQgKilwVHNtUnNwUGFyYW1zICwgMCkgOworCisgICByZXR1cm4gOworfQorCisKKworCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzVHNtU3RhdHNSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIGdldCB0aGUgVFNNIFN0YXRzIHBhcmFtcy4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NUc21TdGF0c1JlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0VFNNU3RhdHMgKnBUc21TdGF0cykKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTIDsKKyAgIFdESV9UU01TdGF0c1JlcVBhcmFtc1R5cGUgKndkaVRTTVJlcVBhcmFtID0gTlVMTDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gTlVMTDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiBFbnRlcmluZzogJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoKE5VTEwgIT0gcFdEQS0+d2RhTXNnUGFyYW0pIHx8IChOVUxMICE9IHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAiJXM6IHdkYU1zZ1BhcmFtIG9yICB3ZGFXZGlBcGlNc2dQYXJhbSBpcyBub3QgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICB3ZGlUU01SZXFQYXJhbSA9IChXRElfVFNNU3RhdHNSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX1RTTVN0YXRzUmVxUGFyYW1zVHlwZSkpOworICAgaWYoTlVMTCA9PSB3ZGlUU01SZXFQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlUU01SZXFQYXJhbSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB3ZGlUU01SZXFQYXJhbS0+d2RpVHNtU3RhdHNQYXJhbXNJbmZvLnVjVGlkID0gcFRzbVN0YXRzLT50aWQ7CisgICB2b3NfbWVtX2NvcHkod2RpVFNNUmVxUGFyYW0tPndkaVRzbVN0YXRzUGFyYW1zSW5mby5ic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHNtU3RhdHMtPmJzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yod3B0X21hY0FkZHIpKTsKKyAgIHdkaVRTTVJlcVBhcmFtLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEwgOworICAgCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICAvKiBTdG9yZSBUU00gU3RhdHMgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9ICh2b2lkICopcFRzbVN0YXRzIDsKKworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2b2lkICopd2RpVFNNUmVxUGFyYW0gOworCisgICBzdGF0dXMgPSBXRElfVFNNU3RhdHNSZXEod2RpVFNNUmVxUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX1RzbVJzcENiKVdEQV9UU01TdGF0c1JlcUNhbGxiYWNrLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIkZhaWx1cmUgaW4gVFNNIFNUQVRTIFJFUSBQYXJhbXMgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICB9CisKKyAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9IAorI2VuZGlmCisvKgorICogRlVOQ1RJT046IFdEQV9TZW5kQmVhY29uUGFyYW1zQ2FsbGJhY2sKKyAqIE5vIG5lZWQgdG8gc2VuZCBhbnkgcmVzcG9uc2UgdG8gUEUgaW4gdGhpcyBjYXNlCisgKi8gCit2b2lkIFdEQV9TZW5kQmVhY29uUGFyYW1zQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NTZW5kQmVhY29uCisgKiBSZXF1ZXN0IHRvIFdESSB0byBzZW5kIHRoZSBiZWFjb24gdGVtcGxhdGUgdG8gSEFMIHRvIHVwZGF0ZSB0aGUgVFBFIG1lbW9yeSBhbmQgCisgKiBzdGFydCBiZWFjb24gdHJhc21pc3Npb24KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZW5kQmVhY29uKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTZW5kYmVhY29uUGFyYW1zICpwU2VuZGJlYWNvblBhcmFtcykKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTIDsKKyAgIFdESV9TZW5kQmVhY29uUGFyYW1zVHlwZSB3ZGlTZW5kQmVhY29uUmVxUGFyYW07IAorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHZvc19tZW1fY29weSh3ZGlTZW5kQmVhY29uUmVxUGFyYW0ud2RpU2VuZEJlYWNvblBhcmFtc0luZm8ubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlbmRiZWFjb25QYXJhbXMtPmJzc0lkLCBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgIHdkaVNlbmRCZWFjb25SZXFQYXJhbS53ZGlTZW5kQmVhY29uUGFyYW1zSW5mby5iZWFjb25MZW5ndGggPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZW5kYmVhY29uUGFyYW1zLT5iZWFjb25MZW5ndGg7CisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgd2RpU2VuZEJlYWNvblJlcVBhcmFtLndkaVNlbmRCZWFjb25QYXJhbXNJbmZvLnRpbUllT2Zmc2V0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VuZGJlYWNvblBhcmFtcy0+dGltSWVPZmZzZXQ7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICB3ZGlTZW5kQmVhY29uUmVxUGFyYW0ud2RpU2VuZEJlYWNvblBhcmFtc0luZm8udXNQMlBJZU9mZnNldCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlbmRiZWFjb25QYXJhbXMtPnAycEllT2Zmc2V0OworI2VuZGlmCisKKyAgIC8qIENvcHkgdGhlIGJlYWNvbiB0ZW1wbGF0ZSB0byBsb2NhbCBidWZmZXIgKi8KKyAgIHZvc19tZW1fY29weSh3ZGlTZW5kQmVhY29uUmVxUGFyYW0ud2RpU2VuZEJlYWNvblBhcmFtc0luZm8uYmVhY29uLCAKKyAgICAgICAgICAgICAgICAgcFNlbmRiZWFjb25QYXJhbXMtPmJlYWNvbiwgcFNlbmRiZWFjb25QYXJhbXMtPmJlYWNvbkxlbmd0aCk7CisgICB3ZGlTZW5kQmVhY29uUmVxUGFyYW0ud2RpUmVxU3RhdHVzQ0IgPSBOVUxMIDsKKworCisgICBzdGF0dXMgPSBXRElfU2VuZEJlYWNvblBhcmFtc1JlcSgmd2RpU2VuZEJlYWNvblJlcVBhcmFtLCAKKyAgICAgICAgICAgIChXRElfU2VuZEJlYWNvblBhcmFtc1JzcENiKVdEQV9TZW5kQmVhY29uUGFyYW1zQ2FsbGJhY2ssIHBXREEpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiRmFpbHVyZSBpbiBTRU5EIEJFQUNPTiBSRVEgUGFyYW1zIFdESSBBUEkiICk7CisgICB9CisKKyAgIHZvc19tZW1fZnJlZShwU2VuZGJlYWNvblBhcmFtcyk7CisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpOworCit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1VwZGF0ZVByb2JlUnNwUGFyYW1zQ2FsbGJhY2sKKyAqIE5vIG5lZWQgdG8gc2VuZCBhbnkgcmVzcG9uc2UgdG8gUEUgaW4gdGhpcyBjYXNlCisgKi8gCit2b2lkIFdEQV9VcGRhdGVQcm9iZVJzcFBhcmFtc0NhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgcmV0dXJuIDsKK30KKworCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZQorICogUmVxdWVzdCB0byBXREkgdG8gc2VuZCB0aGUgcHJvYmUgcmVzcG9uc2UgdGVtcGxhdGUgdG8gSEFMIHRvIHVwZGF0ZSB0aGUgVFBFIG1lbW9yeSBhbmQgCisgKiBzZW5kIHByb2JlIHJlc3BvbnNlCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2VuZFByb2JlUmVzcFBhcmFtcyAqcFNlbmRQcm9iZVJzcFBhcmFtcykKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTIDsKKyAgIFdESV9VcGRhdGVQcm9iZVJzcFRlbXBsYXRlUGFyYW1zVHlwZSB3ZGlTZW5kUHJvYmVSc3BQYXJhbTsgCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qQ29weSB1cGRhdGUgcHJvYmUgcmVzcG9uc2UgcGFyYW1ldGVycyovCisgICB2b3NfbWVtX2NvcHkod2RpU2VuZFByb2JlUnNwUGFyYW0ud2RpUHJvYmVSc3BUZW1wbGF0ZUluZm8ubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlbmRQcm9iZVJzcFBhcmFtcy0+YnNzSWQsIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgd2RpU2VuZFByb2JlUnNwUGFyYW0ud2RpUHJvYmVSc3BUZW1wbGF0ZUluZm8udVByb2JlUmVzcFRlbXBsYXRlTGVuID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VuZFByb2JlUnNwUGFyYW1zLT5wcm9iZVJlc3BUZW1wbGF0ZUxlbjsKKworICAgLyogQ29weSB0aGUgUHJvYmUgUmVzcG9uc2UgdGVtcGxhdGUgdG8gbG9jYWwgYnVmZmVyICovCisgICB2b3NfbWVtX2NvcHkoCisgICAgICAgICAgIHdkaVNlbmRQcm9iZVJzcFBhcmFtLndkaVByb2JlUnNwVGVtcGxhdGVJbmZvLnBQcm9iZVJlc3BUZW1wbGF0ZSwKKyAgICAgICAgICAgcFNlbmRQcm9iZVJzcFBhcmFtcy0+cFByb2JlUmVzcFRlbXBsYXRlLCAKKyAgICAgICAgICAgcFNlbmRQcm9iZVJzcFBhcmFtcy0+cHJvYmVSZXNwVGVtcGxhdGVMZW4pOworICAgdm9zX21lbV9jb3B5KAorICAgICB3ZGlTZW5kUHJvYmVSc3BQYXJhbS53ZGlQcm9iZVJzcFRlbXBsYXRlSW5mby51YVByb3h5UHJvYmVSZXFWYWxpZElFQm1hcCwKKyAgICAgcFNlbmRQcm9iZVJzcFBhcmFtcy0+dWNQcm94eVByb2JlUmVxVmFsaWRJRUJtYXAsCisgICAgIFdESV9QUk9CRV9SRVFfQklUTUFQX0lFX0xFTik7CisgICAKKyAgIHdkaVNlbmRQcm9iZVJzcFBhcmFtLndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisgICAKKworICAgc3RhdHVzID0gV0RJX1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSZXEoJndkaVNlbmRQcm9iZVJzcFBhcmFtLCAKKyAgICAgKFdESV9VcGRhdGVQcm9iZVJzcFRlbXBsYXRlUnNwQ2IpV0RBX1VwZGF0ZVByb2JlUnNwUGFyYW1zQ2FsbGJhY2ssIHBXREEpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAiRmFpbHVyZSBpbiBTRU5EIFByb2JlIFJTUCBQYXJhbXMgV0RJIEFQSSIgKTsKKyAgIH0KKworICAgdm9zX21lbV9mcmVlKHBTZW5kUHJvYmVSc3BQYXJhbXMpOworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKTsKKworfQorCisjaWYgZGVmaW5lZChXTEFOX0ZFQVRVUkVfVk9XSUZJKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9DQ1gpCisvKgorICogRlVOQ1RJT046IFdEQV9TZXRNYXhUeFBvd2VyQ2FsbEJhY2sKKyAqIHNlbmQgdGhlIHJlc3BvbnNlIHRvIFBFIHdpdGggcG93ZXIgdmFsdWUgcmVjZWl2ZWQgZnJvbSBXREkKKyAqLyAKK3ZvaWQgV0RBX1NldE1heFR4UG93ZXJDYWxsQmFjayhXRElfU2V0TWF4VHhQb3dlclJzcE1zZyAqIHB3ZGlTZXRNYXhUeFBvd2VyUnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQSA9IE5VTEw7CisgICB0TWF4VHhQb3dlclBhcmFtcyAqcE1heFR4UG93ZXJQYXJhbXMgPSBOVUxMOyAKKyAgIAorICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisKKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKikgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQ7CisgICBwTWF4VHhQb3dlclBhcmFtcyA9ICh0TWF4VHhQb3dlclBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtIDsKKworICAgaWYoIE5VTEwgPT0gcE1heFR4UG93ZXJQYXJhbXMgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwTWF4VHhQb3dlclBhcmFtcyByZWNlaXZlZCBOVUxMICIgLF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICByZXR1cm4gOworICAgfQorCisgIAorICAvKm5lZWQgdG8gZnJlZSBtZW1vcnkgZm9yIHRoZSBwb2ludGVycyB1c2VkIGluIHRoZSAKKyAgICBXREEgUHJvY2Vzcy5TZXQgTWF4IFR4IFBvd2VyIFJlcSBmdW5jdGlvbiovCisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworCisgICBwTWF4VHhQb3dlclBhcmFtcy0+cG93ZXIgPSBwd2RpU2V0TWF4VHhQb3dlclJzcC0+dWNQb3dlcjsKKworICAKKyAgLyogc2VuZCByZXNwb25zZSB0byBVTUFDKi8KKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9TRVRfTUFYX1RYX1BPV0VSX1JTUCwgcE1heFR4UG93ZXJQYXJhbXMgLCAwKSA7CisgICAKKyAgIHJldHVybjsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfU2V0TWF4VHhQb3dlckNhbGxCYWNrCisgKiBSZXF1ZXN0IHRvIFdESSB0byBzZW5kIHNldCBNYXggVHggUG93ZXIgUmVxdWVzdAorICovIAorIFZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZXRNYXhUeFBvd2VyUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdE1heFR4UG93ZXJQYXJhbXMgKk1heFR4UG93ZXJQYXJhbXMpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgIFdESV9TZXRNYXhUeFBvd2VyUGFyYW1zVHlwZSAqd2RpU2V0TWF4VHhQb3dlclBhcmFtcyA9IE5VTEw7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9IE5VTEw7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoKE5VTEwgIT0gcFdEQS0+d2RhTXNnUGFyYW0pIHx8KE5VTEwgIT0gcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICIlczogd2RhTXNnUGFyYW0gb3IgIHdkYVdkaUFwaU1zZ1BhcmFtIGlzIG5vdCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHdkaVNldE1heFR4UG93ZXJQYXJhbXMgPSAoV0RJX1NldE1heFR4UG93ZXJQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX1NldE1heFR4UG93ZXJQYXJhbXNUeXBlKSk7CisgICBpZihOVUxMID09IHdkaVNldE1heFR4UG93ZXJQYXJhbXMpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgdm9zX21lbV9mcmVlKHdkaVNldE1heFR4UG93ZXJQYXJhbXMpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIC8qIENvcHkuTWF4LlR4LlBvd2VyIFBhcmFtcyB0byBXREkgc3RydWN0dXJlICovCisgICB2b3NfbWVtX2NvcHkod2RpU2V0TWF4VHhQb3dlclBhcmFtcy0+d2RpTWF4VHhQb3dlckluZm8ubWFjQlNTSWQsCisgICAgICAgICAgICAgICAgIE1heFR4UG93ZXJQYXJhbXMtPmJzc0lkLCAKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgIHZvc19tZW1fY29weSh3ZGlTZXRNYXhUeFBvd2VyUGFyYW1zLT53ZGlNYXhUeFBvd2VySW5mby5tYWNTZWxmU3RhTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgTWF4VHhQb3dlclBhcmFtcy0+c2VsZlN0YU1hY0FkZHIsIAorICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKworICAgd2RpU2V0TWF4VHhQb3dlclBhcmFtcy0+d2RpTWF4VHhQb3dlckluZm8udWNQb3dlciA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heFR4UG93ZXJQYXJhbXMtPnBvd2VyOworCisgICB3ZGlTZXRNYXhUeFBvd2VyUGFyYW1zLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEwgOworCisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9ICh2b2lkICopTWF4VHhQb3dlclBhcmFtcyA7CisKKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSAodm9pZCAqKXdkaVNldE1heFR4UG93ZXJQYXJhbXMgOworCisgICBzdGF0dXMgPSBXRElfU2V0TWF4VHhQb3dlclJlcSh3ZGlTZXRNYXhUeFBvd2VyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAoV0RBX1NldE1heFR4UG93ZXJSc3BDYilXREFfU2V0TWF4VHhQb3dlckNhbGxCYWNrLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICJGYWlsdXJlIGluIFNFVCBNQVggVFggUG93ZXIgUkVRIFBhcmFtcyBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgfQorICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKTsKKyAgIAorfQorCisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfU2V0UDJQR09OT0FSZXFQYXJhbXNDYWxsYmFjaworICogIEZyZWUgdGhlIG1lbW9yeS4gTm8gbmVlZCB0byBzZW5kIGFueSByZXNwb25zZSB0byBQRSBpbiB0aGlzIGNhc2UKKyAqLyAKK3ZvaWQgV0RBX1NldFAyUEdPTk9BUmVxUGFyYW1zQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFVzZXJEYXRhIDsgCisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgdm9zX21lbV9mcmVlKHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSA9IE5VTEw7CisgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhTXNnUGFyYW0pIDsKKyAgIHBXREEtPndkYU1zZ1BhcmFtID0gTlVMTDsKKworICAgLyogCisgICAgKiBObyByZXNwb25lIHJlcXVpcmVkIGZvciBTSVJfSEFMX1NFVF9QMlBfR09fTk9BX1JFUSAKKyAgICAqIHNvIGp1c3QgZnJlZSB0aGUgcmVxdWVzdCBwYXJhbSBoZXJlCisgICAgKi8KKworICAgcmV0dXJuIDsKK30KKworCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzU2V0UDJQR09OT0FSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIHNldCB0aGUgUDJQIEdyb3VwIE93bmVyIE5vdGljZSBvZiBBYnNlbmNlIFJlcSAKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZXRQMlBHT05PQVJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQMnBQc1BhcmFtcyAqcFAycFBzQ29uZmlnUGFyYW1zKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworICAgV0RJX1NldFAyUEdPTk9BUmVxUGFyYW1zVHlwZSAqd2RpU2V0UDJQR09OT0FSZXFQYXJhbSA9IAorICAgICAgICAgICAgICAgIChXRElfU2V0UDJQR09OT0FSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXRElfU2V0UDJQR09OT0FSZXFQYXJhbXNUeXBlKSkgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpU2V0UDJQR09OT0FSZXFQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaVNldFAyUEdPTk9BUmVxUGFyYW0tPndkaVAyUEdPTk9BSW5mby51Y09wcF9wcyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFAycFBzQ29uZmlnUGFyYW1zLT5vcHBfcHM7CisgICB3ZGlTZXRQMlBHT05PQVJlcVBhcmFtLT53ZGlQMlBHT05PQUluZm8udUN0V2luZG93ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUDJwUHNDb25maWdQYXJhbXMtPmN0V2luZG93OworICAgd2RpU2V0UDJQR09OT0FSZXFQYXJhbS0+d2RpUDJQR09OT0FJbmZvLnVjQ291bnQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQMnBQc0NvbmZpZ1BhcmFtcy0+Y291bnQ7CisgICB3ZGlTZXRQMlBHT05PQVJlcVBhcmFtLT53ZGlQMlBHT05PQUluZm8udUR1cmF0aW9uID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUDJwUHNDb25maWdQYXJhbXMtPmR1cmF0aW9uOworICAgd2RpU2V0UDJQR09OT0FSZXFQYXJhbS0+d2RpUDJQR09OT0FJbmZvLnVJbnRlcnZhbCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFAycFBzQ29uZmlnUGFyYW1zLT5pbnRlcnZhbDsKKyAgIHdkaVNldFAyUEdPTk9BUmVxUGFyYW0tPndkaVAyUEdPTk9BSW5mby51U2luZ2xlX25vYV9kdXJhdGlvbiA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFAycFBzQ29uZmlnUGFyYW1zLT5zaW5nbGVfbm9hX2R1cmF0aW9uOworICAgd2RpU2V0UDJQR09OT0FSZXFQYXJhbS0+d2RpUDJQR09OT0FJbmZvLnVjUHNTZWxlY3Rpb24gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQMnBQc0NvbmZpZ1BhcmFtcy0+cHNTZWxlY3Rpb247CisKKyAgIGlmKChOVUxMICE9IHBXREEtPndkYU1zZ1BhcmFtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlVMTCAhPSBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6d2RhV2RpQXBpTXNnUGFyYW0gaXMgbm90IE5VTEwiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpU2V0UDJQR09OT0FSZXFQYXJhbSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHdkaVNldFAyUEdPTk9BUmVxUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisgICAvKiBTdG9yZSBtc2cgcG9pbnRlciBmcm9tIFBFLCBhcyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgcmVzcG9uc2UgKi8KKyAgIHBXREEtPndkYU1zZ1BhcmFtID0gKHZvaWQgKilwUDJwUHNDb25maWdQYXJhbXMgOworCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKil3ZGlTZXRQMlBHT05PQVJlcVBhcmFtIDsKKworICAgc3RhdHVzID0gV0RJX1NldFAyUEdPTk9BUmVxKHdkaVNldFAyUEdPTk9BUmVxUGFyYW0sIAorICAgICAgIChXRElfU2V0UDJQR09OT0FSZXFQYXJhbXNSc3BDYilXREFfU2V0UDJQR09OT0FSZXFQYXJhbXNDYWxsYmFjaywgcFdEQSk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICJGYWlsdXJlIGluIFNldCBQMlAgR08gTk9BIFJlcSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXREEtPndkYU1zZ1BhcmFtKTsKKyAgICAgIHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtID0gTlVMTDsKKyAgICAgIHBXREEtPndkYU1zZ1BhcmFtID0gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKTsKKworCit9CisjZW5kaWYKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisvKgorICogRlVOQ1RJT046IFdEQV9BZ2dyQWRkVFNSZXFDYWxsYmFjaworICogc2VuZCBBREQgQUdHUkVHQVRFRCBUUyBSU1AgYmFjayB0byBQRQorICovIAordm9pZCBXREFfQWdnckFkZFRTUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFVzZXJEYXRhIDsgCisgICB0QWdnckFkZFRzUGFyYW1zICpwQWdnckFkZFRzUmVxUGFyYW1zID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodEFnZ3JBZGRUc1BhcmFtcyAqKXBXREEtPndkYU1zZ1BhcmFtIDsKKyAgIGludCBpOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHZvc19tZW1fZnJlZShwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0gPSBOVUxMOworICAgcFdEQS0+d2RhTXNnUGFyYW0gPSBOVUxMOworICAgCisgICBmb3IoIGkgPSAwOyBpIDwgSEFMX1FPU19OVU1fQUNfTUFYOyBpKysgKQorICAgeworICAgICAgcEFnZ3JBZGRUc1JlcVBhcmFtcy0+c3RhdHVzW2ldID0gQ09OVkVSVF9XREkyU0lSX1NUQVRVUyhzdGF0dXMpIDsKKyAgIH0KKworICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX0FHR1JfUU9TX1JTUCwgKHZvaWQgKilwQWdnckFkZFRzUmVxUGFyYW1zICwgMCkgOworCisgICByZXR1cm4gOworfS8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NBZGRUU1JlcQorICogUmVxdWVzdCB0byBXREkgdG8gc2VuZCBhbiB1cGRhdGUgd2l0aCBBR0dSRUdBVEVEIEFERCBUUyBSRVEgcGFyYW1zLgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0FnZ3JBZGRUU1JlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QWdnckFkZFRzUGFyYW1zICpwQWdnckFkZFRzUmVxUGFyYW1zKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworICAgaW50IGk7CisgICBXRElfQWdnckFkZFRTUmVxUGFyYW1zVHlwZSAqd2RpQWdnckFkZFRTUmVxUGFyYW07CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKyAgIGlmKChOVUxMICE9IHBXREEtPndkYU1zZ1BhcmFtKSB8fCAoTlVMTCAhPSBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6d2RhV2RpQXBpTXNnUGFyYW0gaXMgbm90IE5VTEwiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICAKKyAgIHdkaUFnZ3JBZGRUU1JlcVBhcmFtID0gKFdESV9BZ2dyQWRkVFNSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0FnZ3JBZGRUU1JlcVBhcmFtc1R5cGUpKSA7CisgICBpZihOVUxMID09IHdkaUFnZ3JBZGRUU1JlcVBhcmFtKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgd2RpQWdnckFkZFRTUmVxUGFyYW0tPndkaUFnZ3JUc0luZm8udWNTVEFJZHggPSBwQWdnckFkZFRzUmVxUGFyYW1zLT5zdGFJZHg7CisgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby51Y1RzcGVjSWR4ID0gCisgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY0lkeDsKKworICAgZm9yKCBpID0gMDsgaSA8IFdESV9NQVhfTk9fQUM7IGkrKyApCisgICB7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVjVHlwZSA9IHBBZ2dyQWRkVHNSZXFQYXJhbXMtPnRzcGVjW2ldLnR5cGU7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVjTGVuZ3RoID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY1tpXS5sZW5ndGg7CisKKyAgICAgIHdkaUFnZ3JBZGRUU1JlcVBhcmFtLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0ud2RpVFNpbmZvLndkaVRyYWZmaWMuYWNrUG9saWN5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZ2dyQWRkVHNSZXFQYXJhbXMtPnRzcGVjW2ldLnRzaW5mby50cmFmZmljLmFja1BvbGljeTsKKyAgICAgIHdkaUFnZ3JBZGRUU1JlcVBhcmFtLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0ud2RpVFNpbmZvLndkaVRyYWZmaWMudXNlclByaW8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFnZ3JBZGRUc1JlcVBhcmFtcy0+dHNwZWNbaV0udHNpbmZvLnRyYWZmaWMudXNlclByaW87CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLndkaVRTaW5mby53ZGlUcmFmZmljLnBzYiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY1tpXS50c2luZm8udHJhZmZpYy5wc2I7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLndkaVRTaW5mby53ZGlUcmFmZmljLmFnZ3JlZ2F0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZ2dyQWRkVHNSZXFQYXJhbXMtPnRzcGVjW2ldLnRzaW5mby50cmFmZmljLmFnZ3JlZ2F0aW9uOworICAgICAgd2RpQWdnckFkZFRTUmVxUGFyYW0tPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS53ZGlUU2luZm8ud2RpVHJhZmZpYy5hY2Nlc3NQb2xpY3kgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFnZ3JBZGRUc1JlcVBhcmFtcy0+dHNwZWNbaV0udHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5OworICAgICAgd2RpQWdnckFkZFRTUmVxUGFyYW0tPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS53ZGlUU2luZm8ud2RpVHJhZmZpYy5kaXJlY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFnZ3JBZGRUc1JlcVBhcmFtcy0+dHNwZWNbaV0udHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uOworICAgICAgd2RpQWdnckFkZFRTUmVxUGFyYW0tPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS53ZGlUU2luZm8ud2RpVHJhZmZpYy50c2lkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZ2dyQWRkVHNSZXFQYXJhbXMtPnRzcGVjW2ldLnRzaW5mby50cmFmZmljLnRzaWQ7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLndkaVRTaW5mby53ZGlUcmFmZmljLnRyYWZmaWNUeXBlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZ2dyQWRkVHNSZXFQYXJhbXMtPnRzcGVjW2ldLnRzaW5mby50cmFmZmljLnRyYWZmaWNUeXBlOworCisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLndkaVRTaW5mby53ZGlTY2hlZHVsZS5zY2hlZHVsZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFnZ3JBZGRUc1JlcVBhcmFtcy0+dHNwZWNbaV0udHNpbmZvLnNjaGVkdWxlLnNjaGVkdWxlOworCisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVzTm9tTXNkdVN6ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY1tpXS5ub21Nc2R1U3o7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVzTWF4TXNkdVN6ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY1tpXS5tYXhNc2R1U3o7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVNaW5TdmNJbnRlcnZhbCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFnZ3JBZGRUc1JlcVBhcmFtcy0+dHNwZWNbaV0ubWluU3ZjSW50ZXJ2YWw7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVNYXhTdmNJbnRlcnZhbCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFnZ3JBZGRUc1JlcVBhcmFtcy0+dHNwZWNbaV0ubWF4U3ZjSW50ZXJ2YWw7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVJbmFjdEludGVydmFsID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY1tpXS5pbmFjdEludGVydmFsOworICAgICAgd2RpQWdnckFkZFRTUmVxUGFyYW0tPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS51U3VzcGVuZEludGVydmFsID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY1tpXS5zdXNwZW5kSW50ZXJ2YWw7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVTdmNTdGFydFRpbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZ2dyQWRkVHNSZXFQYXJhbXMtPnRzcGVjW2ldLnN2Y1N0YXJ0VGltZTsKKyAgICAgIHdkaUFnZ3JBZGRUU1JlcVBhcmFtLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0udU1pbkRhdGFSYXRlID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY1tpXS5taW5EYXRhUmF0ZTsKKyAgICAgIHdkaUFnZ3JBZGRUU1JlcVBhcmFtLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0udU1lYW5EYXRhUmF0ZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFnZ3JBZGRUc1JlcVBhcmFtcy0+dHNwZWNbaV0ubWVhbkRhdGFSYXRlOworICAgICAgd2RpQWdnckFkZFRTUmVxUGFyYW0tPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS51UGVha0RhdGFSYXRlID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY1tpXS5wZWFrRGF0YVJhdGU7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVNYXhCdXJzdFN6ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY1tpXS5tYXhCdXJzdFN6OworICAgICAgd2RpQWdnckFkZFRTUmVxUGFyYW0tPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS51RGVsYXlCb3VuZCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFnZ3JBZGRUc1JlcVBhcmFtcy0+dHNwZWNbaV0uZGVsYXlCb3VuZDsKKyAgICAgIHdkaUFnZ3JBZGRUU1JlcVBhcmFtLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0udU1pblBoeVJhdGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZ2dyQWRkVHNSZXFQYXJhbXMtPnRzcGVjW2ldLm1pblBoeVJhdGU7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVzU3VycGx1c0J3ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWdnckFkZFRzUmVxUGFyYW1zLT50c3BlY1tpXS5zdXJwbHVzQnc7CisgICAgICB3ZGlBZ2dyQWRkVFNSZXFQYXJhbS0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVzTWVkaXVtVGltZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFnZ3JBZGRUc1JlcVBhcmFtcy0+dHNwZWNbaV0ubWVkaXVtVGltZTsKKyAgIH0KKyAgIAorICAgLyogVE9ETzogdEFnZ3JBZGRUc1BhcmFtcyBkb2Vzbid0IGhhdmUgdGhlIGZvbGxvd2luZyBmaWVsZHMgKi8KKyNpZiAwIAorICAgd2RpQWdnckFkZFRTUmVxUGFyYW0tPndkaVRzSW5mby51Y1VhcHNkRmxhZ3MgPSAKKyAgIHdkaUFnZ3JBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8udWNTZXJ2aWNlSW50ZXJ2YWwgPSAKKyAgIHdkaUFnZ3JBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8udWNTdXNwZW5kSW50ZXJ2YWwgPSAKKyAgIHdkaUFnZ3JBZGRUU1JlcVBhcmFtLT53ZGlUc0luZm8udWNEZWxheWVkSW50ZXJ2YWwgPSAKKyNlbmRpZgorICAgd2RpQWdnckFkZFRTUmVxUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisgICAKKyAgIC8qIFN0b3JlIEFERCBUUyBwb2ludGVyLCBhcyB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgcmVzcG9uc2UgKi8KKyAgIHBXREEtPndkYU1zZ1BhcmFtID0gKHZvaWQgKilwQWdnckFkZFRzUmVxUGFyYW1zIDsKKworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2b2lkICopd2RpQWdnckFkZFRTUmVxUGFyYW0gOworCisgICBzdGF0dXMgPSBXRElfQWdnckFkZFRTUmVxKHdkaUFnZ3JBZGRUU1JlcVBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9BZ2dyQWRkVHNSc3BDYilXREFfQWdnckFkZFRTUmVxQ2FsbGJhY2ssIHBXREEpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gQUREIFRTIFJFUSBQYXJhbXMgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV0RBLT53ZGFNc2dQYXJhbSk7CisgICAgICBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSA9IE5VTEw7CisgICAgICBwV0RBLT53ZGFNc2dQYXJhbSA9IE5VTEw7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorI2VuZGlmCisKKy8qCisgKiBGVU5DVElPTjogV0RBX0VudGVySW1wc1JlcUNhbGxiYWNrCisgKiBzZW5kIEVudGVyIElNUFMgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX0VudGVySW1wc1JlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBVc2VyRGF0YSA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX0VOVEVSX0lNUFNfUlNQLCBOVUxMICwgQ09OVkVSVF9XREkyU0lSX1NUQVRVUyhzdGF0dXMpKSA7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NFbnRlckltcHNSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIEVudGVyIElNUFMgcG93ZXIgc3RhdGUuCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzRW50ZXJJbXBzUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHN0YXR1cyA9IFdESV9FbnRlckltcHNSZXEoKFdESV9FbnRlckltcHNSc3BDYilXREFfRW50ZXJJbXBzUmVxQ2FsbGJhY2ssIHBXREEpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gRW50ZXIgSU1QUyBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSA9IE5VTEw7CisgICAgICBwV0RBLT53ZGFNc2dQYXJhbSA9IE5VTEw7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9FeGl0SW1wc1JlcUNhbGxiYWNrCisgKiBzZW5kIEV4aXQgSU1QUyBSU1AgYmFjayB0byBQRQorICovIAordm9pZCBXREFfRXhpdEltcHNSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9DYkNvbnRleHQgKnBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwVXNlckRhdGEgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9FWElUX0lNUFNfUlNQLCBOVUxMICwgQ09OVkVSVF9XREkyU0lSX1NUQVRVUyhzdGF0dXMpKSA7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NFeGl0SW1wc1JlcQorICogUmVxdWVzdCB0byBXREkgdG8gRXhpdCBJTVBTIHBvd2VyIHN0YXRlLgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0V4aXRJbXBzUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHN0YXR1cyA9IFdESV9FeGl0SW1wc1JlcSgoV0RJX0V4aXRJbXBzUnNwQ2IpV0RBX0V4aXRJbXBzUmVxQ2FsbGJhY2ssIHBXREEpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gRXhpdCBJTVBTIFJFUSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtID0gTlVMTDsKKyAgICAgIHBXREEtPndkYU1zZ1BhcmFtID0gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0VudGVyQm1wc1JlcUNhbGxiYWNrCisgKiBzZW5kIEVudGVyIEJNUFMgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX0VudGVyQm1wc1JlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKworICAgcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBXZGFQYXJhbXMtPnBXZGFDb250ZXh0IDsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfRU5URVJfQk1QU19SU1AsIE5VTEwgLCBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHN0YXR1cykpIDsKKworICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc0VudGVyQm1wc1JlcQorICogUmVxdWVzdCB0byBXREkgdG8gRW50ZXIgQk1QUyBwb3dlciBzdGF0ZS4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NFbnRlckJtcHNSZXEodFdEQV9DYkNvbnRleHQgKnBXREEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRFbnRlckJtcHNQYXJhbXMgKnBFbnRlckJtcHNSZXFQYXJhbXMpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgIFdESV9FbnRlckJtcHNSZXFQYXJhbXNUeXBlICp3ZGlFbnRlckJtcHNSZXFQYXJhbXM7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtczsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZiAoKE5VTEwgPT0gcFdEQSkgfHwgKE5VTEwgPT0gcEVudGVyQm1wc1JlcVBhcmFtcykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGludmFsaWQgcGFyYW0iLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgd2RpRW50ZXJCbXBzUmVxUGFyYW1zID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKFdESV9FbnRlckJtcHNSZXFQYXJhbXNUeXBlKSk7CisgICBpZiAoTlVMTCA9PSB3ZGlFbnRlckJtcHNSZXFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpOworICAgaWYgKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpRW50ZXJCbXBzUmVxUGFyYW1zKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaUVudGVyQm1wc1JlcVBhcmFtcy0+d2RpRW50ZXJCbXBzSW5mby51Y0Jzc0lkeCA9IHBFbnRlckJtcHNSZXFQYXJhbXMtPmJzc0lkeDsKKyAgIHdkaUVudGVyQm1wc1JlcVBhcmFtcy0+d2RpRW50ZXJCbXBzSW5mby51Y0R0aW1Db3VudCA9IHBFbnRlckJtcHNSZXFQYXJhbXMtPmR0aW1Db3VudDsKKyAgIHdkaUVudGVyQm1wc1JlcVBhcmFtcy0+d2RpRW50ZXJCbXBzSW5mby51Y0R0aW1QZXJpb2QgPSBwRW50ZXJCbXBzUmVxUGFyYW1zLT5kdGltUGVyaW9kOworICAgd2RpRW50ZXJCbXBzUmVxUGFyYW1zLT53ZGlFbnRlckJtcHNJbmZvLnVUYnR0ID0gcEVudGVyQm1wc1JlcVBhcmFtcy0+dGJ0dDsKKworICAgLy8gRm9yIENDWCBhbmQgMTFSIFJvYW1pbmcKKyAgIHdkaUVudGVyQm1wc1JlcVBhcmFtcy0+d2RpRW50ZXJCbXBzSW5mby5yc3NpRmlsdGVyUGVyaW9kID0gKHdwdF91aW50MzIpcEVudGVyQm1wc1JlcVBhcmFtcy0+cnNzaUZpbHRlclBlcmlvZDsKKyAgIHdkaUVudGVyQm1wc1JlcVBhcmFtcy0+d2RpRW50ZXJCbXBzSW5mby5udW1CZWFjb25QZXJSc3NpQXZlcmFnZSA9ICh3cHRfdWludDMyKXBFbnRlckJtcHNSZXFQYXJhbXMtPm51bUJlYWNvblBlclJzc2lBdmVyYWdlOworICAgd2RpRW50ZXJCbXBzUmVxUGFyYW1zLT53ZGlFbnRlckJtcHNJbmZvLmJSc3NpRmlsdGVyRW5hYmxlID0gKHdwdF91aW50OClwRW50ZXJCbXBzUmVxUGFyYW1zLT5iUnNzaUZpbHRlckVuYWJsZTsKKyAgIHdkaUVudGVyQm1wc1JlcVBhcmFtcy0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworCisgICAvLyB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBpbnB1dAorICAgdm9zX21lbV9mcmVlKHBFbnRlckJtcHNSZXFQYXJhbXMpOworCisgICAvKiBTdG9yZSBwYXJhbSBwb2ludGVyIGFzIHBhc3NlZCBpbiBieSBjYWxsZXIgKi8KKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSB3ZGlFbnRlckJtcHNSZXFQYXJhbXM7CisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IE5VTEw7CisKKyAgIHN0YXR1cyA9IFdESV9FbnRlckJtcHNSZXEod2RpRW50ZXJCbXBzUmVxUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAoV0RJX0VudGVyQm1wc1JzcENiKVdEQV9FbnRlckJtcHNSZXFDYWxsYmFjaywgcFdkYVBhcmFtcyk7CisKKyAgIGlmIChJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gRW50ZXIgQk1QUyBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0V4aXRCbXBzUmVxQ2FsbGJhY2sKKyAqIHNlbmQgRXhpdCBCTVBTIFJTUCBiYWNrIHRvIFBFCisgKi8gCit2b2lkIFdEQV9FeGl0Qm1wc1JlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOworICAgdEV4aXRCbXBzUGFyYW1zICpwRXhpdEJtcHNSZXFQYXJhbXM7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisKKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA7CisgICBwRXhpdEJtcHNSZXFQYXJhbXMgPSAodEV4aXRCbXBzUGFyYW1zICopcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gOworCisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisKKyAgIHBFeGl0Qm1wc1JlcVBhcmFtcy0+c3RhdHVzID0gQ09OVkVSVF9XREkyU0lSX1NUQVRVUyhzdGF0dXMpIDsKKworICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX0VYSVRfQk1QU19SU1AsICh2b2lkICopcEV4aXRCbXBzUmVxUGFyYW1zICwgMCkgOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzRXhpdEJtcHNSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIEV4aXQgQk1QUyBwb3dlciBzdGF0ZS4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NFeGl0Qm1wc1JlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEV4aXRCbXBzUGFyYW1zICpwRXhpdEJtcHNSZXFQYXJhbXMpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICBXRElfRXhpdEJtcHNSZXFQYXJhbXNUeXBlICp3ZGlFeGl0Qm1wc1JlcVBhcmFtcyA9IAorICAgICAgKFdESV9FeGl0Qm1wc1JlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgIHNpemVvZihXRElfRXhpdEJtcHNSZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpRXhpdEJtcHNSZXFQYXJhbXMpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaUV4aXRCbXBzUmVxUGFyYW1zKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaUV4aXRCbXBzUmVxUGFyYW1zLT53ZGlFeGl0Qm1wc0luZm8udWNTZW5kRGF0YU51bGwgPSBwRXhpdEJtcHNSZXFQYXJhbXMtPnNlbmREYXRhTnVsbDsKKyAgICAgIAorICAgd2RpRXhpdEJtcHNSZXFQYXJhbXMtPndkaVJlcVN0YXR1c0NCID0gTlVMTDsKKyAgICAgIAorICAgLyogU3RvcmUgcGFyYW0gcG9pbnRlciBhcyBwYXNzZWQgaW4gYnkgY2FsbGVyICovCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gd2RpRXhpdEJtcHNSZXFQYXJhbXM7CisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IHBFeGl0Qm1wc1JlcVBhcmFtczsKKworICAgc3RhdHVzID0gV0RJX0V4aXRCbXBzUmVxKHdkaUV4aXRCbXBzUmVxUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0V4aXRCbXBzUnNwQ2IpV0RBX0V4aXRCbXBzUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gRXhpdCBCTVBTIFJFUSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9FbnRlclVhcHNkUmVxQ2FsbGJhY2sKKyAqIHNlbmQgRW50ZXIgVUFQU0QgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX0VudGVyVWFwc2RSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQTsKKyAgIHRVYXBzZFBhcmFtcyAqcEVudGVyVWFwc2RSZXFQYXJhbXM7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisKKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA7CisKKyAgIHBFbnRlclVhcHNkUmVxUGFyYW1zID0gKHRVYXBzZFBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtIDsKKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisKKyAgIHBFbnRlclVhcHNkUmVxUGFyYW1zLT5zdGF0dXMgPSBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHN0YXR1cykgOworCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfRU5URVJfVUFQU0RfUlNQLCAodm9pZCAqKXBFbnRlclVhcHNkUmVxUGFyYW1zICwgMCkgOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzRW50ZXJVYXBzZFJlcQorICogUmVxdWVzdCB0byBXREkgdG8gRW50ZXIgVUFQU0QgcG93ZXIgc3RhdGUuCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzRW50ZXJVYXBzZFJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRVYXBzZFBhcmFtcyAqcEVudGVyVWFwc2RSZXFQYXJhbXMpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICBXRElfRW50ZXJVYXBzZFJlcVBhcmFtc1R5cGUgKndkaUVudGVyVWFwc2RSZXFQYXJhbXMgPSAKKyAgICAgIChXRElfRW50ZXJVYXBzZFJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgIHNpemVvZihXRElfRW50ZXJVYXBzZFJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlFbnRlclVhcHNkUmVxUGFyYW1zKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlFbnRlclVhcHNkUmVxUGFyYW1zKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaUVudGVyVWFwc2RSZXFQYXJhbXMtPndkaUVudGVyVWFwc2RJbmZvLnVjQmVEZWxpdmVyeUVuYWJsZWQgPSAKKyAgICAgIHBFbnRlclVhcHNkUmVxUGFyYW1zLT5iZURlbGl2ZXJ5RW5hYmxlZDsKKyAgIHdkaUVudGVyVWFwc2RSZXFQYXJhbXMtPndkaUVudGVyVWFwc2RJbmZvLnVjQmVUcmlnZ2VyRW5hYmxlZCA9IAorICAgICAgcEVudGVyVWFwc2RSZXFQYXJhbXMtPmJlVHJpZ2dlckVuYWJsZWQ7CisgICB3ZGlFbnRlclVhcHNkUmVxUGFyYW1zLT53ZGlFbnRlclVhcHNkSW5mby51Y0JrRGVsaXZlcnlFbmFibGVkID0gCisgICAgICBwRW50ZXJVYXBzZFJlcVBhcmFtcy0+YmtEZWxpdmVyeUVuYWJsZWQ7CisgICB3ZGlFbnRlclVhcHNkUmVxUGFyYW1zLT53ZGlFbnRlclVhcHNkSW5mby51Y0JrVHJpZ2dlckVuYWJsZWQgPSAKKyAgICAgIHBFbnRlclVhcHNkUmVxUGFyYW1zLT5ia1RyaWdnZXJFbmFibGVkOworICAgd2RpRW50ZXJVYXBzZFJlcVBhcmFtcy0+d2RpRW50ZXJVYXBzZEluZm8udWNWaURlbGl2ZXJ5RW5hYmxlZCA9IAorICAgICAgcEVudGVyVWFwc2RSZXFQYXJhbXMtPnZpRGVsaXZlcnlFbmFibGVkOworICAgd2RpRW50ZXJVYXBzZFJlcVBhcmFtcy0+d2RpRW50ZXJVYXBzZEluZm8udWNWaVRyaWdnZXJFbmFibGVkID0gCisgICAgICBwRW50ZXJVYXBzZFJlcVBhcmFtcy0+dmlUcmlnZ2VyRW5hYmxlZDsKKyAgIHdkaUVudGVyVWFwc2RSZXFQYXJhbXMtPndkaUVudGVyVWFwc2RJbmZvLnVjVm9EZWxpdmVyeUVuYWJsZWQgPSAKKyAgICAgIHBFbnRlclVhcHNkUmVxUGFyYW1zLT52b0RlbGl2ZXJ5RW5hYmxlZDsKKyAgIHdkaUVudGVyVWFwc2RSZXFQYXJhbXMtPndkaUVudGVyVWFwc2RJbmZvLnVjVm9UcmlnZ2VyRW5hYmxlZCA9IAorICAgICAgcEVudGVyVWFwc2RSZXFQYXJhbXMtPnZvVHJpZ2dlckVuYWJsZWQ7CisKKyAgIHdkaUVudGVyVWFwc2RSZXFQYXJhbXMtPndkaVJlcVN0YXR1c0NCID0gTlVMTDsgCisKKworICAgLyogU3RvcmUgcGFyYW0gcG9pbnRlciBhcyBwYXNzZWQgaW4gYnkgY2FsbGVyICovCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gd2RpRW50ZXJVYXBzZFJlcVBhcmFtczsKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcEVudGVyVWFwc2RSZXFQYXJhbXM7CisKKyAgIHN0YXR1cyA9IFdESV9FbnRlclVhcHNkUmVxKHdkaUVudGVyVWFwc2RSZXFQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0VudGVyVWFwc2RSc3BDYilXREFfRW50ZXJVYXBzZFJlcUNhbGxiYWNrLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluIEVudGVyIFVBUFNEIFJFUSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9FeGl0VWFwc2RSZXFDYWxsYmFjaworICogc2VuZCBFeGl0IFVBUFNEIFJTUCBiYWNrIHRvIFBFCisgKi8gCit2b2lkIFdEQV9FeGl0VWFwc2RSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9DYkNvbnRleHQgKnBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwVXNlckRhdGEgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9FWElUX1VBUFNEX1JTUCwgTlVMTCAsIENPTlZFUlRfV0RJMlNJUl9TVEFUVVMoc3RhdHVzKSkgOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzRXhpdFVhcHNkUmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byBFeGl0IFVBUFNEIHBvd2VyIHN0YXRlLgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0V4aXRVYXBzZFJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSkKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBzdGF0dXMgPSBXRElfRXhpdFVhcHNkUmVxKChXRElfRXhpdFVhcHNkUnNwQ2IpV0RBX0V4aXRVYXBzZFJlcUNhbGxiYWNrLCBwV0RBKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluIEV4aXQgVUFQU0QgUkVRIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0gPSBOVUxMOworICAgICAgcFdEQS0+d2RhTXNnUGFyYW0gPSBOVUxMOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworCisvKgorICogRlVOQ1RJT046IFdEQV9TZXRQd3JTYXZlQ2ZnUmVxQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfU2V0UHdyU2F2ZUNmZ1JlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKworICAgaWYoIHBXZGFQYXJhbXMgIT0gTlVMTCApCisgICB7CisgICAgICBpZiggcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gIT0gTlVMTCApCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgICAgfQorICAgICAgaWYoIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtICE9IE5VTEwgKQorICAgICAgeworICAgICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICAgICB9CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgfQorCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzU2V0UHdyU2F2ZUNmZ1JlcQorICogUmVxdWVzdCB0byBXREkgdG8gc2V0IHRoZSBwb3dlciBzYXZlIHBhcmFtcyBhdCBzdGFydC4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZXRQd3JTYXZlQ2ZnUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJQb3dlclNhdmVDZmcgKnBQb3dlclNhdmVDZmcpCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICB0SGFsQ2ZnICAgICAgICAqdGx2U3RydWN0ID0gTlVMTCA7CisgICB0QU5JX1U4ICAgICAgICAqdGx2U3RydWN0U3RhcnQgPSBOVUxMIDsKKyAgIHZfUFZPSURfdCAgICAgICpjb25maWdQYXJhbTsKKyAgIHRBTklfVTMyICAgICAgIGNvbmZpZ1BhcmFtU2l6ZTsKKyAgIHRBTklfVTMyICAgICAgICpjb25maWdEYXRhVmFsdWU7CisgICBXRElfVXBkYXRlQ2ZnUmVxUGFyYW1zVHlwZSAqd2RpUG93ZXJTYXZlQ2ZnOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXM7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYgKChOVUxMID09IHBXREEpIHx8IChOVUxMID09IHBQb3dlclNhdmVDZmcpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBpbnZhbGlkIHBhcmFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHdkaVBvd2VyU2F2ZUNmZyA9IHZvc19tZW1fbWFsbG9jKHNpemVvZihXRElfVXBkYXRlQ2ZnUmVxUGFyYW1zVHlwZSkpOworICAgaWYgKE5VTEwgPT0gd2RpUG93ZXJTYXZlQ2ZnKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpUG93ZXJTYXZlQ2ZnKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIGNvbmZpZ1BhcmFtU2l6ZSA9IChzaXplb2YodEhhbENmZykgKyAoc2l6ZW9mKHRBTklfVTMyKSkpICogV0RBX05VTV9QV1JfU0FWRV9DRkc7CisgICBjb25maWdQYXJhbSA9IHZvc19tZW1fbWFsbG9jKGNvbmZpZ1BhcmFtU2l6ZSk7CisKKyAgIGlmKE5VTEwgPT0gY29uZmlnUGFyYW0pCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpUG93ZXJTYXZlQ2ZnKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB2b3NfbWVtX3NldChjb25maWdQYXJhbSwgY29uZmlnUGFyYW1TaXplLCAwKTsKKyAgIHdkaVBvd2VyU2F2ZUNmZy0+cENvbmZpZ0J1ZmZlciA9IGNvbmZpZ1BhcmFtOworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKiljb25maWdQYXJhbTsKKyAgIHRsdlN0cnVjdFN0YXJ0ID0gKHRBTklfVTggKiljb25maWdQYXJhbTsKKworICAgLyogUVdMQU5fSEFMX0NGR19QU19CUk9BRENBU1RfRlJBTUVfRklMVEVSX0VOQUJMRSAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19QU19CUk9BRENBU1RfRlJBTUVfRklMVEVSX0VOQUJMRTsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgICpjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIpcFBvd2VyU2F2ZUNmZy0+YnJvYWRjYXN0RnJhbWVGaWx0ZXI7CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKSA7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX1BTX0hFQVJUX0JFQVRfVEhSRVNIT0xEICovCisgICB0bHZTdHJ1Y3QtPnR5cGUgPSBRV0xBTl9IQUxfQ0ZHX1BTX0hFQVJUX0JFQVRfVEhSRVNIT0xEOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgKmNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMilwUG93ZXJTYXZlQ2ZnLT5IZWFydEJlYXRDb3VudDsKKworICAgdGx2U3RydWN0ID0gKHRIYWxDZmcgKikoKCAodEFOSV9VOCAqKSB0bHZTdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEhhbENmZykgKyB0bHZTdHJ1Y3QtPmxlbmd0aCkpIDsgCisKKyAgIC8qIFFXTEFOX0hBTF9DRkdfUFNfSUdOT1JFX0RUSU0gKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfUFNfSUdOT1JFX0RUSU07CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICAqY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyKXBQb3dlclNhdmVDZmctPmlnbm9yZUR0aW07CisKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKSA7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX1BTX0xJU1RFTl9JTlRFUlZBTCAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19QU19MSVNURU5fSU5URVJWQUw7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICAqY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyKXBQb3dlclNhdmVDZmctPmxpc3RlbkludGVydmFsOworCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19QU19NQVhfUFNfUE9MTCAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19QU19NQVhfUFNfUE9MTDsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgICpjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIpcFBvd2VyU2F2ZUNmZy0+bWF4UHNQb2xsOworCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19QU19NSU5fUlNTSV9USFJFU0hPTEQgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfUFNfTUlOX1JTU0lfVEhSRVNIT0xEOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgKmNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMilwUG93ZXJTYXZlQ2ZnLT5taW5Sc3NpVGhyZXNob2xkOworCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19QU19OVEhfQkVBQ09OX0ZJTFRFUiAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19QU19OVEhfQkVBQ09OX0ZJTFRFUjsKKyAgIHRsdlN0cnVjdC0+bGVuZ3RoID0gc2l6ZW9mKHRBTklfVTMyKTsKKyAgIGNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMiAqKSh0bHZTdHJ1Y3QgKyAxKTsKKyAgICpjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIpcFBvd2VyU2F2ZUNmZy0+bnRoQmVhY29uRmlsdGVyOworCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19QU19FTkFCTEVfQkNOX0VBUkxZX1RFUk0gKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfUFNfRU5BQkxFX0JDTl9FQVJMWV9URVJNOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgKmNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMilwUG93ZXJTYXZlQ2ZnLT5mRW5hYmxlQmVhY29uRWFybHlUZXJtaW5hdGlvbjsKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKSA7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX0JDTl9FQVJMWV9URVJNX1dBS0VVUF9JTlRFUlZBTCAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19CQ05fRUFSTFlfVEVSTV9XQUtFVVBfSU5URVJWQUw7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICAqY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyKXBQb3dlclNhdmVDZmctPmJjbkVhcmx5VGVybVdha2VJbnRlcnZhbDsKKyAgIHRsdlN0cnVjdCA9ICh0SGFsQ2ZnICopKCggKHRBTklfVTggKikgdGx2U3RydWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHRIYWxDZmcpICsgdGx2U3RydWN0LT5sZW5ndGgpKSA7IAorCisgICAvKiBRV0xBTl9IQUxfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRSAqLworICAgdGx2U3RydWN0LT50eXBlID0gUVdMQU5fSEFMX0NGR19OVU1fQkVBQ09OX1BFUl9SU1NJX0FWRVJBR0U7CisgICB0bHZTdHJ1Y3QtPmxlbmd0aCA9IHNpemVvZih0QU5JX1UzMik7CisgICBjb25maWdEYXRhVmFsdWUgPSAodEFOSV9VMzIgKikodGx2U3RydWN0ICsgMSk7CisgICAqY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyKXBQb3dlclNhdmVDZmctPm51bUJlYWNvblBlclJzc2lBdmVyYWdlOworCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOyAKKworICAgLyogUVdMQU5fSEFMX0NGR19QU19SU1NJX0ZJTFRFUl9QRVJJT0QgKi8KKyAgIHRsdlN0cnVjdC0+dHlwZSA9IFFXTEFOX0hBTF9DRkdfUFNfUlNTSV9GSUxURVJfUEVSSU9EOworICAgdGx2U3RydWN0LT5sZW5ndGggPSBzaXplb2YodEFOSV9VMzIpOworICAgY29uZmlnRGF0YVZhbHVlID0gKHRBTklfVTMyICopKHRsdlN0cnVjdCArIDEpOworICAgKmNvbmZpZ0RhdGFWYWx1ZSA9ICh0QU5JX1UzMilwUG93ZXJTYXZlQ2ZnLT5yc3NpRmlsdGVyUGVyaW9kOworCisgICB0bHZTdHJ1Y3QgPSAodEhhbENmZyAqKSgoICh0QU5JX1U4ICopIHRsdlN0cnVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih0SGFsQ2ZnKSArIHRsdlN0cnVjdC0+bGVuZ3RoKSkgOyAKKworICAgd2RpUG93ZXJTYXZlQ2ZnLT51Q29uZmlnQnVmZmVyTGVuID0gKHRBTklfVTggKil0bHZTdHJ1Y3QgLSB0bHZTdHJ1Y3RTdGFydCA7CisKKyAgIHdkaVBvd2VyU2F2ZUNmZy0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gY29uZmlnUGFyYW07CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaVBvd2VyU2F2ZUNmZzsKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKworICAgc3RhdHVzID0gV0RJX1NldFB3clNhdmVDZmdSZXEod2RpUG93ZXJTYXZlQ2ZnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfU2V0UHdyU2F2ZUNmZ0NiKVdEQV9TZXRQd3JTYXZlQ2ZnUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gU2V0IFB3ciBTYXZlIENGRyBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgIH0KKworICAgdm9zX21lbV9mcmVlKHBQb3dlclNhdmVDZmcpOworCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9TZXRVYXBzZEFjUGFyYW1zUmVxQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfU2V0VWFwc2RBY1BhcmFtc1JlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YSA7IAorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworCisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1NldFVhcHNkQWNQYXJhbXNSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIHNldCB0aGUgVUFQU0QgcGFyYW1zIGZvciBhbiBhYyAoc3RhIG1vZGUpLgorICovIAorVk9TX1NUQVRVUyBXREFfU2V0VWFwc2RBY1BhcmFtc1JlcSh2X1BWT0lEX3QgcFZvc0NvbnRleHQsIHZfVThfdCBzdGFJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFVhcHNkSW5mbyAqcFVhcHNkSW5mbykKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTOworICAgdFdEQV9DYkNvbnRleHQgKnBXREEgPSBOVUxMIDsgCisgICBXRElfU2V0VWFwc2RBY1BhcmFtc1JlcVBhcmFtc1R5cGUgKndkaVVhcHNkUGFyYW1zID0gCisgICAgICAoV0RJX1NldFVhcHNkQWNQYXJhbXNSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICBzaXplb2YoV0RJX1NldFVhcHNkQWNQYXJhbXNSZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpVWFwc2RQYXJhbXMpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaVVhcHNkUGFyYW1zKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaVVhcHNkUGFyYW1zLT53ZGlVYXBzZEluZm8udWNBYyA9IHBVYXBzZEluZm8tPmFjOworICAgd2RpVWFwc2RQYXJhbXMtPndkaVVhcHNkSW5mby51RGVsYXlJbnRlcnZhbCA9IHBVYXBzZEluZm8tPmRlbGF5SW50ZXJ2YWw7CisgICB3ZGlVYXBzZFBhcmFtcy0+d2RpVWFwc2RJbmZvLnVTcnZJbnRlcnZhbCA9IHBVYXBzZEluZm8tPnNydkludGVydmFsOworICAgd2RpVWFwc2RQYXJhbXMtPndkaVVhcHNkSW5mby51Y1NUQUlkeCA9IHBVYXBzZEluZm8tPnN0YWlkeDsKKyAgIHdkaVVhcHNkUGFyYW1zLT53ZGlVYXBzZEluZm8udVN1c0ludGVydmFsID0gcFVhcHNkSW5mby0+c3VzSW50ZXJ2YWw7CisgICB3ZGlVYXBzZFBhcmFtcy0+d2RpVWFwc2RJbmZvLnVjVXAgPSBwVWFwc2RJbmZvLT51cDsKKworICAgd2RpVWFwc2RQYXJhbXMtPndkaVJlcVN0YXR1c0NCID0gTlVMTDsKKworICAgcFdEQSA9IHZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9XREEsIHBWb3NDb250ZXh0ICk7CisKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIC8qIFN0b3JlIHBhcmFtIHBvaW50ZXIgYXMgcGFzc2VkIGluIGJ5IGNhbGxlciAqLworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSBwVWFwc2RJbmZvOworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2b2lkICopd2RpVWFwc2RQYXJhbXM7CisKKyAgIHN0YXR1cyA9IFdESV9TZXRVYXBzZEFjUGFyYW1zUmVxKHdkaVVhcHNkUGFyYW1zLCAKKyAgICAgICAgICAgICAgKFdESV9TZXRVYXBzZEFjUGFyYW1zQ2IpV0RBX1NldFVhcHNkQWNQYXJhbXNSZXFDYWxsYmFjaywKKyAgICAgICAgICAgICAgcFdkYVBhcmFtcyk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBTZXQgVUFQU0QgcGFyYW1zIFJFUSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgfQorCisgICBpZigoV0RJX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgfHwgKFdESV9TVEFUVVNfUEVORElORyA9PSBzdGF0dXMpKQorICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworICAgZWxzZQorICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisKKworCit9CisvKiAKKyAqIEZVTkNUSU9OOiBXREFfQ2xlYXJVYXBzZEFjUGFyYW1zUmVxIAorICogQ3VycmVudGx5IHRoZSBXREEgQVBJIGlzIGEgTk9QLiBJdCBoYXMgYmVlbiBhZGRlZCBmb3Igc3ltbWV0cnkgJiBBbHNvIGl0IHdhcworICogZGVjaWRlZCB0aGF0IHRoZSBpZiB0aGUgVVBBU0QgcGFyYW1ldGVycyBjaGFuZ2UsIEZXIHdvdWxkIGdldCBhIGV4aXQgVUFQU0QKKyAqIGFuZCBhZ2FpbiBlbnRlciB0aGUgVVBBU0Qgd2l0aCB0aGUgbW9kaWZpZWQgcGFyYW1zLiBIZW5jZSB0aGUgZGlzYWJsZQorICogZnVuY3Rpb24gd2FzIGtlcHQgZW1wdHkuCisgKiAKKyAqLworVk9TX1NUQVRVUyBXREFfQ2xlYXJVYXBzZEFjUGFyYW1zUmVxKHZfUFZPSURfdCBwVm9zQ29udGV4dCwgdl9VOF90IHN0YUlkeCwgd3B0X3VpbnQ4IGFjKQoreworICAgLyogZG8gbm90aGluZyAqLworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfVXBkYXRlVWFwc2RQYXJhbXNSZXFDYWxsYmFjaworICogCisgKi8gCit2b2lkIFdEQV9VcGRhdGVVYXBzZFBhcmFtc1JlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBVc2VyRGF0YSA7IAorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHZvc19tZW1fZnJlZShwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0gPSBOVUxMOworICAgcFdEQS0+d2RhTXNnUGFyYW0gPSBOVUxMOworCisKKyAgIC8vcHJpbnQgYSBtc2csIG5vdGhpbmcgZWxzZSB0byBkbworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICJXREFfVXBkYXRlVWFwc2RQYXJhbXNSZXFDYWxsYmFjayBpbnZva2VkICIgKTsKKworICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfVXBkYXRlVWFwc2RQYXJhbXNSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIHVwZGF0ZSBVQVBTRCBwYXJhbXMgKGluIHNvZnRBUCBtb2RlKSBmb3IgYSBzdGF0aW9uLgorICovIAorVk9TX1NUQVRVUyBXREFfVXBkYXRlVWFwc2RQYXJhbXNSZXEodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFVwZGF0ZVVhcHNkUGFyYW1zKiBwVXBkYXRlVWFwc2RJbmZvKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICBXRElfVXBkYXRlVWFwc2RSZXFQYXJhbXNUeXBlICp3ZGlVcGRhdGVVYXBzZFBhcmFtcyA9IAorICAgICAgKFdESV9VcGRhdGVVYXBzZFJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgIHNpemVvZihXRElfVXBkYXRlVWFwc2RSZXFQYXJhbXNUeXBlKSkgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpVXBkYXRlVWFwc2RQYXJhbXMpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB3ZGlVcGRhdGVVYXBzZFBhcmFtcy0+d2RpVXBkYXRlVWFwc2RJbmZvLnVNYXhTcExlbiA9IHBVcGRhdGVVYXBzZEluZm8tPm1heFNwTGVuOworICAgd2RpVXBkYXRlVWFwc2RQYXJhbXMtPndkaVVwZGF0ZVVhcHNkSW5mby51Y1NUQUlkeCA9IHBVcGRhdGVVYXBzZEluZm8tPnN0YUlkeDsKKyAgIHdkaVVwZGF0ZVVhcHNkUGFyYW1zLT53ZGlVcGRhdGVVYXBzZEluZm8udWNVYXBzZEFDTWFzayA9IHBVcGRhdGVVYXBzZEluZm8tPnVhcHNkQUNNYXNrOworCisgICBpZigoTlVMTCAhPSBwV0RBLT53ZGFNc2dQYXJhbSkgfHwKKyAgICAgICAgICAgICAgICAgIChOVUxMICE9IHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczp3ZGFXZGlBcGlNc2dQYXJhbSBpcyBub3QgTlVMTCIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgdm9zX21lbV9mcmVlKHdkaVVwZGF0ZVVhcHNkUGFyYW1zKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIFN0b3JlIHBhcmFtIHBvaW50ZXIgYXMgcGFzc2VkIGluIGJ5IGNhbGxlciAqLworICAgcFdEQS0+d2RhTXNnUGFyYW0gPSBwVXBkYXRlVWFwc2RJbmZvOworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2b2lkICopd2RpVXBkYXRlVWFwc2RQYXJhbXM7CisKKyAgIHN0YXR1cyA9IFdESV9VcGRhdGVVYXBzZFBhcmFtc1JlcSh3ZGlVcGRhdGVVYXBzZFBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9VcGRhdGVVYXBzZFBhcmFtc0NiKVdEQV9VcGRhdGVVYXBzZFBhcmFtc1JlcUNhbGxiYWNrLCBwV0RBKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluIFNldCBVQVBTRCBwYXJhbXMgUkVRIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhTXNnUGFyYW0pOworICAgICAgcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0gPSBOVUxMOworICAgICAgcFdEQS0+d2RhTXNnUGFyYW0gPSBOVUxMOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfQ29uZmlndXJlUnhwRmlsdGVyQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfQ29uZmlndXJlUnhwRmlsdGVyQ2FsbGJhY2soV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGEgOyAKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd2RpU3RhdHVzKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiJXM6IFJYUCBjb25maWcgZmlsdGVyIGZhaWx1cmUgXG4iLCBfX0ZVTkNUSU9OX18gKTsKKyAgIH0KKworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NDb25maWd1cmVSeHBGaWx0ZXJSZXEKKyAqIAorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0NvbmZpZ3VyZVJ4cEZpbHRlclJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJXbGFuU2V0UnhwRmlsdGVycyAqcFdsYW5TdXNwZW5kUGFyYW0pCit7CisgICAKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0RJX0NvbmZpZ3VyZVJ4cEZpbHRlclJlcVBhcmFtc1R5cGUgKndkaVJ4cEZpbHRlclBhcmFtcyA9IAorICAgICAgKFdESV9Db25maWd1cmVSeHBGaWx0ZXJSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICBzaXplb2YoV0RJX0NvbmZpZ3VyZVJ4cEZpbHRlclJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlSeHBGaWx0ZXJQYXJhbXMpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdsYW5TdXNwZW5kUGFyYW0pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlSeHBGaWx0ZXJQYXJhbXMpOworICAgICAgdm9zX21lbV9mcmVlKHBXbGFuU3VzcGVuZFBhcmFtKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaVJ4cEZpbHRlclBhcmFtcy0+d2RpUnhwRmlsdGVyUGFyYW0udWNTZXRNY3N0QmNzdEZpbHRlciA9IAorICAgICAgICAgICAgIHBXbGFuU3VzcGVuZFBhcmFtLT5zZXRNY3N0QmNzdEZpbHRlcjsKKyAgIHdkaVJ4cEZpbHRlclBhcmFtcy0+d2RpUnhwRmlsdGVyUGFyYW0udWNTZXRNY3N0QmNzdEZpbHRlclNldHRpbmcgPSAKKyAgICAgICAgICAgICBwV2xhblN1c3BlbmRQYXJhbS0+Y29uZmlndXJlZE1jc3RCY3N0RmlsdGVyU2V0dGluZzsKKyAgIAorICAgd2RpUnhwRmlsdGVyUGFyYW1zLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcFdsYW5TdXNwZW5kUGFyYW07CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2b2lkICopd2RpUnhwRmlsdGVyUGFyYW1zOworCisgICBzdGF0dXMgPSBXRElfQ29uZmlndXJlUnhwRmlsdGVyUmVxKHdkaVJ4cEZpbHRlclBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgICAgKFdESV9Db25maWd1cmVSeHBGaWx0ZXJDYilXREFfQ29uZmlndXJlUnhwRmlsdGVyQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgcFdkYVBhcmFtcyk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBjb25maWd1cmUgUlhQIGZpbHRlciBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9XZGlJbmRpY2F0aW9uQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfV2RpSW5kaWNhdGlvbkNhbGxiYWNrKCBXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKQoreworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NXbGFuU3VzcGVuZEluZAorICogCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzV2xhblN1c3BlbmRJbmQodFdEQV9DYkNvbnRleHQgKnBXREEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyV2xhblN1c3BlbmRQYXJhbSAqcFdsYW5TdXNwZW5kUGFyYW0pCit7CisgICBXRElfU3RhdHVzIHdkaVN0YXR1czsKKyAgIFdESV9TdXNwZW5kUGFyYW1zVHlwZSB3ZGlTdXNwZW5kUGFyYW1zOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHdkaVN1c3BlbmRQYXJhbXMud2RpU3VzcGVuZFBhcmFtcy51Y0NvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgICBwV2xhblN1c3BlbmRQYXJhbS0+Y29uZmlndXJlZE1jc3RCY3N0RmlsdGVyU2V0dGluZzsKKyAgIHdkaVN1c3BlbmRQYXJhbXMud2RpUmVxU3RhdHVzQ0IgPSBXREFfV2RpSW5kaWNhdGlvbkNhbGxiYWNrOworICAgd2RpU3VzcGVuZFBhcmFtcy5wVXNlckRhdGEgPSBwV0RBOworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogJWQiICxfX0ZVTkNUSU9OX18sIHBXbGFuU3VzcGVuZFBhcmFtLT5jb25maWd1cmVkTWNzdEJjc3RGaWx0ZXJTZXR0aW5nKTsKKworICAgV0RBX1NUT1BfVElNRVIoJnBXREEtPndkYVRpbWVycy5iYUFjdGl2aXR5Q2hrVG1yKTsKKworICAgd2RpU3RhdHVzID0gV0RJX0hvc3RTdXNwZW5kSW5kKCZ3ZGlTdXNwZW5kUGFyYW1zKTsKKyAgIGlmKFdESV9TVEFUVVNfUEVORElORyA9PSB3ZGlTdGF0dXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIlBlbmRpbmcgcmVjZWl2ZWQgZm9yICVzOiVkICIsX19GVU5DVElPTl9fLF9fTElORV9fICk7CisKKyAgIH0KKyAgIGVsc2UgaWYoIFdESV9TVEFUVVNfU1VDQ0VTU19TWU5DICE9IHdkaVN0YXR1cyApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluICVzOiVkICIsX19GVU5DVElPTl9fLF9fTElORV9fICk7CisgICB9CisKKyAgIHZvc19tZW1fZnJlZShwV2xhblN1c3BlbmRQYXJhbSk7CisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyh3ZGlTdGF0dXMpIDsKK30KKworCisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NXbGFuUmVzdW1lQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfUHJvY2Vzc1dsYW5SZXN1bWVDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIFdESV9TdXNwZW5kUmVzdW1lUnNwUGFyYW1zVHlwZSAgICpyZXN1bWVSc3BQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7IAorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKworICAgaWYoV0RJX1NUQVRVU19TVUNDRVNTICE9IHJlc3VtZVJzcFBhcmFtcy0+d2RpU3RhdHVzKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiJXM6IFByb2Nlc3MgV2xhbiBSZXN1bWUgZmFpbHVyZSBcbiIsIF9fRlVOQ1RJT05fXyApOworICAgfQorCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NXbGFuUmVzdW1lUmVxCisgKiAKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NXbGFuUmVzdW1lUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpcldsYW5SZXN1bWVQYXJhbSAqcFdsYW5SZXN1bWVQYXJhbSkKK3sKKyAgIFdESV9TdGF0dXMgd2RpU3RhdHVzOworICAgV0RJX1Jlc3VtZVBhcmFtc1R5cGUgKndkaVJlc3VtZVBhcmFtcyA9IAorICAgICAgICAgICAgKFdESV9SZXN1bWVQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX1Jlc3VtZVBhcmFtc1R5cGUpICkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpUmVzdW1lUGFyYW1zKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlSZXN1bWVQYXJhbXMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgd2RpUmVzdW1lUGFyYW1zLT53ZGlSZXN1bWVQYXJhbXMudWNDb25maWd1cmVkTWNzdEJjc3RGaWx0ZXJTZXR0aW5nID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFdsYW5SZXN1bWVQYXJhbS0+Y29uZmlndXJlZE1jc3RCY3N0RmlsdGVyU2V0dGluZzsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICIlczogJWQiICxfX0ZVTkNUSU9OX18sIHBXbGFuUmVzdW1lUGFyYW0tPmNvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmcpOworICAgd2RpUmVzdW1lUGFyYW1zLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IHBXbGFuUmVzdW1lUGFyYW07CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaVJlc3VtZVBhcmFtczsKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKworICAgV0RBX1NUQVJUX1RJTUVSKCZwV0RBLT53ZGFUaW1lcnMuYmFBY3Rpdml0eUNoa1RtcikgOworCisgICB3ZGlTdGF0dXMgPSBXRElfSG9zdFJlc3VtZVJlcSh3ZGlSZXN1bWVQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgICAgIChXRElfSG9zdFJlc3VtZUV2ZW50UnNwQ2IpV0RBX1Byb2Nlc3NXbGFuUmVzdW1lQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgcFdkYVBhcmFtcyk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRSh3ZGlTdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBIb3N0IFJlc3VtZSBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyh3ZGlTdGF0dXMpIDsKK30KKworCisKKy8qCisgKiBGVU5DVElPTjogV0RBX1NldEJlYWNvbkZpbHRlclJlcUNhbGxiYWNrCisgKiAKKyAqLyAKK3ZvaWQgV0RBX1NldEJlYWNvbkZpbHRlclJlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIAorICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKyAgIC8qIAorICAgICogTm8gcmVzcG9uZSByZXF1aXJlZCBmb3IgU2V0QmVhY29uRmlsdGVyIHJlcSBzbyBqdXN0IGZyZWUgdGhlIHJlcXVlc3QgCisgICAgKiBwYXJhbSBoZXJlCisgICAgKi8KKworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9TZXRCZWFjb25GaWx0ZXJSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIHNlbmQgdGhlIGJlYWNvbiBmaWx0ZXJpbmcgcmVsYXRlZCBpbmZvcm1hdGlvbi4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1NldEJlYWNvbkZpbHRlclJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJlYWNvbkZpbHRlck1zZyogcEJlYWNvbkZpbHRlckluZm8pCit7CisgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgIHRBTklfVTggICAgICAgICAgICAqZHN0UHRyLCAqc3JjUHRyOworICAgdEFOSV9VOCAgICAgICAgICAgICBmaWx0ZXJMZW5ndGg7CisgICBXRElfQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZSAqd2RpQmVhY29uRmlsdGVySW5mbyA9IAorICAgICAgICAgICAgKFdESV9CZWFjb25GaWx0ZXJSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0JlYWNvbkZpbHRlclJlcVBhcmFtc1R5cGUpICkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpQmVhY29uRmlsdGVySW5mbykgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpQmVhY29uRmlsdGVySW5mbyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB3ZGlCZWFjb25GaWx0ZXJJbmZvLT53ZGlCZWFjb25GaWx0ZXJJbmZvLnVzQmVhY29uSW50ZXJ2YWwgPSAKKyAgICAgIHBCZWFjb25GaWx0ZXJJbmZvLT5iZWFjb25JbnRlcnZhbDsKKyAgIHdkaUJlYWNvbkZpbHRlckluZm8tPndkaUJlYWNvbkZpbHRlckluZm8udXNDYXBhYmlsaXR5SW5mbyA9IAorICAgICAgcEJlYWNvbkZpbHRlckluZm8tPmNhcGFiaWxpdHlJbmZvOworICAgd2RpQmVhY29uRmlsdGVySW5mby0+d2RpQmVhY29uRmlsdGVySW5mby51c0NhcGFiaWxpdHlNYXNrID0gCisgICAgICBwQmVhY29uRmlsdGVySW5mby0+Y2FwYWJpbGl0eU1hc2s7CisgICB3ZGlCZWFjb25GaWx0ZXJJbmZvLT53ZGlCZWFjb25GaWx0ZXJJbmZvLnVzSWVOdW0gPSBwQmVhY29uRmlsdGVySW5mby0+aWVOdW07CisKKyAgIC8vRmlsbCBzdHJ1Y3R1cmUgd2l0aCBpbmZvIGNvbnRhaW5lZCBpbiB0aGUgYmVhY29uRmlsdGVyVGFibGUKKyAgIGRzdFB0ciA9ICh0QU5JX1U4ICopd2RpQmVhY29uRmlsdGVySW5mbyArIHNpemVvZihXRElfQmVhY29uRmlsdGVySW5mb1R5cGUpOworICAgc3JjUHRyID0gKHRBTklfVTggKilwQmVhY29uRmlsdGVySW5mbyArIHNpemVvZih0QmVhY29uRmlsdGVyTXNnKTsKKyAgIGZpbHRlckxlbmd0aCA9IHdkaUJlYWNvbkZpbHRlckluZm8tPndkaUJlYWNvbkZpbHRlckluZm8udXNJZU51bSAqIHNpemVvZih0QmVhY29uRmlsdGVySWUpOworICAgaWYoV0RJX0JFQUNPTl9GSUxURVJfTEVOIDwgZmlsdGVyTGVuZ3RoKQorICAgeworICAgICAgZmlsdGVyTGVuZ3RoID0gV0RJX0JFQUNPTl9GSUxURVJfTEVOOworICAgfQorICAgdm9zX21lbV9jb3B5KGRzdFB0ciwgc3JjUHRyLCBmaWx0ZXJMZW5ndGgpOworCisgICB3ZGlCZWFjb25GaWx0ZXJJbmZvLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisgICAvKiBTdG9yZSBwYXJhbSBwb2ludGVyIGFzIHBhc3NlZCBpbiBieSBjYWxsZXIgKi8KKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSB3ZGlCZWFjb25GaWx0ZXJJbmZvOworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSBwQmVhY29uRmlsdGVySW5mbzsKKworCisgICBzdGF0dXMgPSBXRElfU2V0QmVhY29uRmlsdGVyUmVxKHdkaUJlYWNvbkZpbHRlckluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX1NldEJlYWNvbkZpbHRlckNiKVdEQV9TZXRCZWFjb25GaWx0ZXJSZXFDYWxsYmFjaywgcFdkYVBhcmFtcyk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBTZXQgQmVhY29uIEZpbHRlciBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUmVtQmVhY29uRmlsdGVyUmVxQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfUmVtQmVhY29uRmlsdGVyUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFVzZXJEYXRhIDsgCisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgdm9zX21lbV9mcmVlKHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSA9IE5VTEw7CisgICBwV0RBLT53ZGFNc2dQYXJhbSA9IE5VTEw7CisgICAKKworICAgLy9wcmludCBhIG1zZywgbm90aGluZyBlbHNlIHRvIGRvCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIldEQV9SZW1CZWFjb25GaWx0ZXJSZXFDYWxsYmFjayBpbnZva2VkICIgKTsKKworICAgcmV0dXJuIDsKK30KKworICAgIC8vIFRPRE86IFBFIGRvZXMgbm90IGhhdmUgdGhpcyBmZWF0dXJlIGZvciBub3cgaW1wbGVtZW50ZWQsCisgICAgLy8gYnV0IHRoZSBzdXBwb3J0IGZvciByZW1vdmluZyBiZWFjb24gZmlsdGVyIGV4aXN0cyBiZXR3ZWVuCisgICAgLy8gSEFMIGFuZCBGVy4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHdoZW5ldmVyIFBFIGRlZmluZXMKKyAgICAvLyBhIG5ldyBtZXNzYWdlIGZvciBiZWFjb24gZmlsdGVyIHJlbW92YWwKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUmVtQmVhY29uRmlsdGVyUmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byBzZW5kIHRoZSByZW1vdmFsIG9mIGJlYWNvbiBmaWx0ZXJpbmcgcmVsYXRlZCBpbmZvcm1hdGlvbi4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1JlbUJlYWNvbkZpbHRlclJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFJlbUJlYWNvbkZpbHRlck1zZyogcEJlYWNvbkZpbHRlckluZm8pCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIFdESV9SZW1CZWFjb25GaWx0ZXJSZXFQYXJhbXNUeXBlICp3ZGlCZWFjb25GaWx0ZXJJbmZvID0gCisgICAgICAoV0RJX1JlbUJlYWNvbkZpbHRlclJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgIHNpemVvZihXRElfUmVtQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZSkgKyBwQmVhY29uRmlsdGVySW5mby0+dWNJZUNvdW50KSA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlCZWFjb25GaWx0ZXJJbmZvKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgd2RpQmVhY29uRmlsdGVySW5mby0+d2RpQmVhY29uRmlsdGVySW5mby51Y0llQ291bnQgPSAKKyAgICAgIHBCZWFjb25GaWx0ZXJJbmZvLT51Y0llQ291bnQ7CisKKyAgIC8vRmlsbCBzdHJ1Y3R1cmUgd2l0aCBpbmZvIGNvbnRhaW5lZCBpbiB0aGUgdWNSZW1JZUlkCisgICB2b3NfbWVtX2NvcHkod2RpQmVhY29uRmlsdGVySW5mby0+d2RpQmVhY29uRmlsdGVySW5mby51Y1JlbUllSWQsIAorICAgICAgICAgICAgICAgIHBCZWFjb25GaWx0ZXJJbmZvLT51Y1JlbUllSWQsCisgICAgICAgICAgICAgICAgd2RpQmVhY29uRmlsdGVySW5mby0+d2RpQmVhY29uRmlsdGVySW5mby51Y0llQ291bnQpOworICAgd2RpQmVhY29uRmlsdGVySW5mby0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworCisgICBpZigoTlVMTCAhPSBwV0RBLT53ZGFNc2dQYXJhbSkgfHwKKyAgICAgICAgICAgICAgICAgIChOVUxMICE9IHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczp3ZGFXZGlBcGlNc2dQYXJhbSBpcyBub3QgTlVMTCIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgdm9zX21lbV9mcmVlKHdkaUJlYWNvbkZpbHRlckluZm8pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIAorICAgLyogU3RvcmUgcGFyYW0gcG9pbnRlciBhcyBwYXNzZWQgaW4gYnkgY2FsbGVyICovCisgICBwV0RBLT53ZGFNc2dQYXJhbSA9IHBCZWFjb25GaWx0ZXJJbmZvOworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2b2lkICopd2RpQmVhY29uRmlsdGVySW5mbzsKKworICAgc3RhdHVzID0gV0RJX1JlbUJlYWNvbkZpbHRlclJlcSh3ZGlCZWFjb25GaWx0ZXJJbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9SZW1CZWFjb25GaWx0ZXJDYilXREFfUmVtQmVhY29uRmlsdGVyUmVxQ2FsbGJhY2ssIHBXREEpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gUmVtb3ZlIEJlYWNvbiBGaWx0ZXIgUkVRIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhTXNnUGFyYW0pOworICAgICAgcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0gPSBOVUxMOworICAgICAgcFdEQS0+d2RhTXNnUGFyYW0gPSBOVUxMOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfU2V0UlNTSVRocmVzaG9sZHNSZXFDYWxsYmFjaworICogCisgKi8gCit2b2lkIFdEQV9TZXRSU1NJVGhyZXNob2xkc1JlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIAorICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisKKworICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfU2V0UlNTSVRocmVzaG9sZHNSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIHNldCB0aGUgUlNTSSB0aHJlc2hvbGRzIChzdGEgbW9kZSkuCisgKi8gCitWT1NfU1RBVFVTIFdEQV9TZXRSU1NJVGhyZXNob2xkc1JlcSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyUlNTSVRocmVzaG9sZHMgKnBCbXBzVGhyZXNob2xkcykKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdFdEQV9DYkNvbnRleHQgKnBXREEgPSBOVUxMIDsKKyAgIHZfUFZPSURfdCBwVm9zQ29udGV4dCA9IE5VTEw7IAorICAgV0RJX1NldFJTU0lUaHJlc2hvbGRzUmVxUGFyYW1zVHlwZSAqd2RpUlNTSVRocmVzaG9sZHNJbmZvID0gCisgICAgICAoV0RJX1NldFJTU0lUaHJlc2hvbGRzUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgc2l6ZW9mKFdESV9TZXRSU1NJVGhyZXNob2xkc1JlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlSU1NJVGhyZXNob2xkc0luZm8pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaVJTU0lUaHJlc2hvbGRzSW5mbyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB3ZGlSU1NJVGhyZXNob2xkc0luZm8tPndkaVJTU0lUaHJlc2hvbGRzSW5mby5iUmVzZXJ2ZWQxMCA9IHBCbXBzVGhyZXNob2xkcy0+YlJlc2VydmVkMTA7CisKKyAgIHdkaVJTU0lUaHJlc2hvbGRzSW5mby0+d2RpUlNTSVRocmVzaG9sZHNJbmZvLnVjUnNzaVRocmVzaG9sZDEgPSBwQm1wc1RocmVzaG9sZHMtPnVjUnNzaVRocmVzaG9sZDE7CisgICB3ZGlSU1NJVGhyZXNob2xkc0luZm8tPndkaVJTU0lUaHJlc2hvbGRzSW5mby51Y1Jzc2lUaHJlc2hvbGQyID0gcEJtcHNUaHJlc2hvbGRzLT51Y1Jzc2lUaHJlc2hvbGQyOworICAgd2RpUlNTSVRocmVzaG9sZHNJbmZvLT53ZGlSU1NJVGhyZXNob2xkc0luZm8udWNSc3NpVGhyZXNob2xkMyA9IHBCbXBzVGhyZXNob2xkcy0+dWNSc3NpVGhyZXNob2xkMzsKKworICAgd2RpUlNTSVRocmVzaG9sZHNJbmZvLT53ZGlSU1NJVGhyZXNob2xkc0luZm8uYlJzc2lUaHJlczFOZWdOb3RpZnkgPSBwQm1wc1RocmVzaG9sZHMtPmJSc3NpVGhyZXMxTmVnTm90aWZ5OworICAgd2RpUlNTSVRocmVzaG9sZHNJbmZvLT53ZGlSU1NJVGhyZXNob2xkc0luZm8uYlJzc2lUaHJlczJOZWdOb3RpZnkgPSBwQm1wc1RocmVzaG9sZHMtPmJSc3NpVGhyZXMyTmVnTm90aWZ5OworICAgd2RpUlNTSVRocmVzaG9sZHNJbmZvLT53ZGlSU1NJVGhyZXNob2xkc0luZm8uYlJzc2lUaHJlczNOZWdOb3RpZnkgPSBwQm1wc1RocmVzaG9sZHMtPmJSc3NpVGhyZXMzTmVnTm90aWZ5OworCisgICB3ZGlSU1NJVGhyZXNob2xkc0luZm8tPndkaVJTU0lUaHJlc2hvbGRzSW5mby5iUnNzaVRocmVzMVBvc05vdGlmeSA9IHBCbXBzVGhyZXNob2xkcy0+YlJzc2lUaHJlczFQb3NOb3RpZnk7CisgICB3ZGlSU1NJVGhyZXNob2xkc0luZm8tPndkaVJTU0lUaHJlc2hvbGRzSW5mby5iUnNzaVRocmVzMlBvc05vdGlmeSA9IHBCbXBzVGhyZXNob2xkcy0+YlJzc2lUaHJlczJQb3NOb3RpZnk7CisgICB3ZGlSU1NJVGhyZXNob2xkc0luZm8tPndkaVJTU0lUaHJlc2hvbGRzSW5mby5iUnNzaVRocmVzM1Bvc05vdGlmeSA9IHBCbXBzVGhyZXNob2xkcy0+YlJzc2lUaHJlczNQb3NOb3RpZnk7CisKKyAgIHdkaVJTU0lUaHJlc2hvbGRzSW5mby0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworCisgICBwVm9zQ29udGV4dCA9IHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9QRSwgKHZvaWQgKilwTWFjKTsKKyAgIHBXREEgPSB2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfV0RBLCBwVm9zQ29udGV4dCApOworCisKKyAgIC8qIFN0b3JlIHBhcmFtIHBvaW50ZXIgYXMgcGFzc2VkIGluIGJ5IGNhbGxlciAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaVJTU0lUaHJlc2hvbGRzSW5mbzsKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcEJtcHNUaHJlc2hvbGRzOworCisgICBzdGF0dXMgPSBXRElfU2V0UlNTSVRocmVzaG9sZHNSZXEod2RpUlNTSVRocmVzaG9sZHNJbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX1NldFJTU0lUaHJlc2hvbGRzQ2IpV0RBX1NldFJTU0lUaHJlc2hvbGRzUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gU2V0IFJTU0kgdGhyZXNob2xkcyBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7CisKK30vKldEQV9TZXRSU1NJVGhyZXNob2xkc1JlcSovCisKKy8qCisgKiBGVU5DVElPTjogV0RBX0hvc3RPZmZsb2FkUmVxQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfSG9zdE9mZmxvYWRSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGEgOyAKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIAorICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICAvL3ByaW50IGEgbXNnLCBub3RoaW5nIGVsc2UgdG8gZG8KKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiV0RBX0hvc3RPZmZsb2FkUmVxQ2FsbGJhY2sgaW52b2tlZCAiICk7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NIb3N0T2ZmbG9hZFJlcQorICogUmVxdWVzdCB0byBXREkgdG8gc2V0IHRoZSBmaWx0ZXIgdG8gbWluaW1pemUgdW5uZWNlc3NhcnkgaG9zdCB3YWtldXAgZHVlIAorICogdG8gYnJvYWRjYXN0IHRyYWZmaWMgICAoc3RhIG1vZGUpLgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc0hvc3RPZmZsb2FkUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lySG9zdE9mZmxvYWRSZXEgKnBIb3N0T2ZmbG9hZFBhcmFtcykKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0RJX0hvc3RPZmZsb2FkUmVxUGFyYW1zVHlwZSAqd2RpSG9zdE9mZmxvYWRJbmZvID0gCisgICAgICAoV0RJX0hvc3RPZmZsb2FkUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgc2l6ZW9mKFdESV9Ib3N0T2ZmbG9hZFJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXM6IG9mZmxvYWRUeXBlPSV4IiAsX19GVU5DVElPTl9fLCBwSG9zdE9mZmxvYWRQYXJhbXMtPm9mZmxvYWRUeXBlKTsKKworICAgaWYoTlVMTCA9PSB3ZGlIb3N0T2ZmbG9hZEluZm8pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpSG9zdE9mZmxvYWRJbmZvKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaUhvc3RPZmZsb2FkSW5mby0+d2RpSG9zdE9mZmxvYWRJbmZvLnVjT2ZmbG9hZFR5cGUgPSAKKyAgICAgIHBIb3N0T2ZmbG9hZFBhcmFtcy0+b2ZmbG9hZFR5cGU7CisgICB3ZGlIb3N0T2ZmbG9hZEluZm8tPndkaUhvc3RPZmZsb2FkSW5mby51Y0VuYWJsZU9yRGlzYWJsZSA9IAorICAgICAgcEhvc3RPZmZsb2FkUGFyYW1zLT5lbmFibGVPckRpc2FibGU7CisKKyAgIHN3aXRjaCAod2RpSG9zdE9mZmxvYWRJbmZvLT53ZGlIb3N0T2ZmbG9hZEluZm8udWNPZmZsb2FkVHlwZSkKKyAgIHsKKyAgICAgIGNhc2UgU0lSX0lQVjRfQVJQX1JFUExZX09GRkxPQUQ6CisgICAgICAgICB2b3NfbWVtX2NvcHkod2RpSG9zdE9mZmxvYWRJbmZvLT53ZGlIb3N0T2ZmbG9hZEluZm8ucGFyYW1zLmFIb3N0SXB2NEFkZHIsCisgICAgICAgICAgICAgICAgICAgcEhvc3RPZmZsb2FkUGFyYW1zLT5wYXJhbXMuaG9zdElwdjRBZGRyLAorICAgICAgICAgICAgICAgICAgIDQpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNJUl9JUFY2X05FSUdIQk9SX0RJU0NPVkVSWV9PRkZMT0FEOgorICAgICAgICAgdm9zX21lbV9jb3B5KHdkaUhvc3RPZmZsb2FkSW5mby0+d2RpSG9zdE9mZmxvYWRJbmZvLnBhcmFtcy5hSG9zdElwdjZBZGRyLAorICAgICAgICAgICAgICAgICAgIHBIb3N0T2ZmbG9hZFBhcmFtcy0+cGFyYW1zLmhvc3RJcHY2QWRkciwKKyAgICAgICAgICAgICAgICAgICAxNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0lSX0lQVjZfTlNfT0ZGTE9BRDoKKyAgICAgICAgIHZvc19tZW1fY29weSh3ZGlIb3N0T2ZmbG9hZEluZm8tPndkaUhvc3RPZmZsb2FkSW5mby5wYXJhbXMuYUhvc3RJcHY2QWRkciwKKyAgICAgICAgICAgICAgICAgICBwSG9zdE9mZmxvYWRQYXJhbXMtPnBhcmFtcy5ob3N0SXB2NkFkZHIsCisgICAgICAgICAgICAgICAgICAgMTYpOworCisjaWZkZWYgV0xBTl9OU19PRkZMT0FECisgICAgICAgICBpZihwSG9zdE9mZmxvYWRQYXJhbXMtPm5zT2ZmbG9hZEluZm8uc3JjSVB2NkFkZHJWYWxpZCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSh3ZGlIb3N0T2ZmbG9hZEluZm8tPndkaU5zT2ZmbG9hZFBhcmFtcy5zcmNJUHY2QWRkciwKKyAgICAgICAgICAgICAgICAgICBwSG9zdE9mZmxvYWRQYXJhbXMtPm5zT2ZmbG9hZEluZm8uc3JjSVB2NkFkZHIsCisgICAgICAgICAgICAgICAgICAgMTYpOworICAgICAgICAgICAgd2RpSG9zdE9mZmxvYWRJbmZvLT53ZGlOc09mZmxvYWRQYXJhbXMuc3JjSVB2NkFkZHJWYWxpZCA9IDE7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICB3ZGlIb3N0T2ZmbG9hZEluZm8tPndkaU5zT2ZmbG9hZFBhcmFtcy5zcmNJUHY2QWRkclZhbGlkID0gMDsKKyAgICAgICAgIH0KKworICAgICAgICAgdm9zX21lbV9jb3B5KHdkaUhvc3RPZmZsb2FkSW5mby0+d2RpTnNPZmZsb2FkUGFyYW1zLnNlbGZJUHY2QWRkciwKKyAgICAgICAgICAgICAgICAgICBwSG9zdE9mZmxvYWRQYXJhbXMtPm5zT2ZmbG9hZEluZm8uc2VsZklQdjZBZGRyLAorICAgICAgICAgICAgICAgICAgIDE2KTsKKyAgICAgICAgIHZvc19tZW1fY29weSh3ZGlIb3N0T2ZmbG9hZEluZm8tPndkaU5zT2ZmbG9hZFBhcmFtcy5zZWxmTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICBwSG9zdE9mZmxvYWRQYXJhbXMtPm5zT2ZmbG9hZEluZm8uc2VsZk1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgNik7CisKKyAgICAgICAgIC8vT25seSB0d28gYXJlIHN1cHBvcnRlZCBzbyBsZXQncyBnbyB0aHJvdWdoIHRoZW0gd2l0aG91dCBhIGxvb3AKKyAgICAgICAgIGlmKHBIb3N0T2ZmbG9hZFBhcmFtcy0+bnNPZmZsb2FkSW5mby50YXJnZXRJUHY2QWRkclZhbGlkWzBdKQorICAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV9jb3B5KHdkaUhvc3RPZmZsb2FkSW5mby0+d2RpTnNPZmZsb2FkUGFyYW1zLnRhcmdldElQdjZBZGRyMSwKKyAgICAgICAgICAgICAgICAgICAgICBwSG9zdE9mZmxvYWRQYXJhbXMtPm5zT2ZmbG9hZEluZm8udGFyZ2V0SVB2NkFkZHJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgMTYpOworICAgICAgICAgICAgd2RpSG9zdE9mZmxvYWRJbmZvLT53ZGlOc09mZmxvYWRQYXJhbXMudGFyZ2V0SVB2NkFkZHIxVmFsaWQgPSAxOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgd2RpSG9zdE9mZmxvYWRJbmZvLT53ZGlOc09mZmxvYWRQYXJhbXMudGFyZ2V0SVB2NkFkZHIxVmFsaWQgPSAwOworICAgICAgICAgfQorCisgICAgICAgICBpZihwSG9zdE9mZmxvYWRQYXJhbXMtPm5zT2ZmbG9hZEluZm8udGFyZ2V0SVB2NkFkZHJWYWxpZFsxXSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19tZW1fY29weSh3ZGlIb3N0T2ZmbG9hZEluZm8tPndkaU5zT2ZmbG9hZFBhcmFtcy50YXJnZXRJUHY2QWRkcjIsCisgICAgICAgICAgICAgICAgICAgICAgcEhvc3RPZmZsb2FkUGFyYW1zLT5uc09mZmxvYWRJbmZvLnRhcmdldElQdjZBZGRyWzFdLAorICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyAgICAgICAgICAgIHdkaUhvc3RPZmZsb2FkSW5mby0+d2RpTnNPZmZsb2FkUGFyYW1zLnRhcmdldElQdjZBZGRyMlZhbGlkID0gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHdkaUhvc3RPZmZsb2FkSW5mby0+d2RpTnNPZmZsb2FkUGFyYW1zLnRhcmdldElQdjZBZGRyMlZhbGlkID0gMDsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vV0xBTl9OU19PRkZMT0FECisgICAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBIYW5kbGluZyBmb3IgT2ZmbG9hZCBUeXBlICV4IGluIFdEQSAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgd2RpSG9zdE9mZmxvYWRJbmZvLT53ZGlIb3N0T2ZmbG9hZEluZm8udWNPZmZsb2FkVHlwZSk7CisgICAgICAgICAvL1dEQV9WT1NfQVNTRVJUKDApIDsKKyAgICAgIH0KKyAgIH0KKworICAgd2RpSG9zdE9mZmxvYWRJbmZvLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIGlmKChOVUxMICE9IHBXREEtPndkYU1zZ1BhcmFtKSB8fAorICAgICAgICAgICAgICAgICAgKE5VTEwgIT0gcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOndkYVdkaUFwaU1zZ1BhcmFtIGlzIG5vdCBOVUxMIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaUhvc3RPZmZsb2FkSW5mbyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIFN0b3JlIHBhcmFtIHBvaW50ZXIgYXMgcGFzc2VkIGluIGJ5IGNhbGxlciAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaUhvc3RPZmZsb2FkSW5mbzsKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcEhvc3RPZmZsb2FkUGFyYW1zOworCisgICBzdGF0dXMgPSBXRElfSG9zdE9mZmxvYWRSZXEod2RpSG9zdE9mZmxvYWRJbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0hvc3RPZmZsb2FkQ2IpV0RBX0hvc3RPZmZsb2FkUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gaG9zdCBvZmZsb2FkIFJFUSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7CisKK30vKldEQV9Ib3N0T2ZmbG9hZFJlcSovCisKKy8qCisgKiBGVU5DVElPTjogV0RBX0tlZXBBbGl2ZVJlcUNhbGxiYWNrCisgKiAKKyAqLyAKK3ZvaWQgV0RBX0tlZXBBbGl2ZVJlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBVc2VyRGF0YSA7IAorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHZvc19tZW1fZnJlZShwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhTXNnUGFyYW0pOworICAgcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0gPSBOVUxMOworICAgcFdEQS0+d2RhTXNnUGFyYW0gPSBOVUxMOyAKKyAgIAorCisgICAvL3ByaW50IGEgbXNnLCBub3RoaW5nIGVsc2UgdG8gZG8KKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiV0RBX0tlZXBBbGl2ZVJlcUNhbGxiYWNrIGludm9rZWQgIiApOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzS2VlcEFsaXZlUmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byBzZW5kIEtlZXAgQWxpdmUgcGFja2V0cyB0byBtaW5pbWl6ZSB1bm5lY2Vzc2FyeSBob3N0IAorICogd2FrZXVwIGR1ZSB0byBicm9hZGNhc3QgdHJhZmZpYyAgIChzdGEgbW9kZSkuCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzS2VlcEFsaXZlUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpcktlZXBBbGl2ZVJlcSAqcEtlZXBBbGl2ZVBhcmFtcykKK3sKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBXRElfS2VlcEFsaXZlUmVxUGFyYW1zVHlwZSAqd2RpS2VlcEFsaXZlSW5mbyA9IAorICAgICAgKFdESV9LZWVwQWxpdmVSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICBzaXplb2YoV0RJX0tlZXBBbGl2ZVJlcVBhcmFtc1R5cGUpKSA7CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZihOVUxMID09IHdkaUtlZXBBbGl2ZUluZm8pIAorICAgIHsKKyAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICAgfQorCisgICAgd2RpS2VlcEFsaXZlSW5mby0+d2RpS2VlcEFsaXZlSW5mby51Y1BhY2tldFR5cGUgPSAKKyAgICAgIHBLZWVwQWxpdmVQYXJhbXMtPnBhY2tldFR5cGU7CisgICAgd2RpS2VlcEFsaXZlSW5mby0+d2RpS2VlcEFsaXZlSW5mby51Y1RpbWVQZXJpb2QgPSAKKyAgICAgIHBLZWVwQWxpdmVQYXJhbXMtPnRpbWVQZXJpb2Q7CisKKyAgICBpZihwS2VlcEFsaXZlUGFyYW1zLT5wYWNrZXRUeXBlID09IFNJUl9LRUVQX0FMSVZFX1VOU09MSUNJVF9BUlBfUlNQKQorICAgIHsKKyAgICAgICB2b3NfbWVtX2NvcHkoJndkaUtlZXBBbGl2ZUluZm8tPndkaUtlZXBBbGl2ZUluZm8uYUhvc3RJcHY0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgcEtlZXBBbGl2ZVBhcmFtcy0+aG9zdElwdjRBZGRyLAorICAgICAgICAgICAgICAgICAgICBTSVJfSVBWNF9BRERSX0xFTik7CisgICAgICAgdm9zX21lbV9jb3B5KCZ3ZGlLZWVwQWxpdmVJbmZvLT53ZGlLZWVwQWxpdmVJbmZvLmFEZXN0SXB2NEFkZHIsCisgICAgICAgICAgICAgICAgICAgIHBLZWVwQWxpdmVQYXJhbXMtPmRlc3RJcHY0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgU0lSX0lQVjRfQUREUl9MRU4pOyAgIAorICAgICAgIHZvc19tZW1fY29weSgmd2RpS2VlcEFsaXZlSW5mby0+d2RpS2VlcEFsaXZlSW5mby5hRGVzdE1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgIHBLZWVwQWxpdmVQYXJhbXMtPmRlc3RNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICBTSVJfTUFDX0FERFJfTEVOKTsKKyAgICB9CisgICAgZWxzZSBpZihwS2VlcEFsaXZlUGFyYW1zLT5wYWNrZXRUeXBlID09IFNJUl9LRUVQX0FMSVZFX05VTExfUEtUKQorICAgIHsKKyAgICAgICAgdm9zX21lbV9zZXQoJndkaUtlZXBBbGl2ZUluZm8tPndkaUtlZXBBbGl2ZUluZm8uYUhvc3RJcHY0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgU0lSX0lQVjRfQUREUl9MRU4sCisgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICB2b3NfbWVtX3NldCgmd2RpS2VlcEFsaXZlSW5mby0+d2RpS2VlcEFsaXZlSW5mby5hRGVzdElwdjRBZGRyLAorICAgICAgICAgICAgICAgICAgICBTSVJfSVBWNF9BRERSX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgMCk7ICAgCisgICAgICAgIHZvc19tZW1fc2V0KCZ3ZGlLZWVwQWxpdmVJbmZvLT53ZGlLZWVwQWxpdmVJbmZvLmFEZXN0TWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgU0lSX01BQ19BRERSX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgfQorCisgICAgd2RpS2VlcEFsaXZlSW5mby0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworCisgICAgaWYoKE5VTEwgIT0gcFdEQS0+d2RhTXNnUGFyYW0pIHx8CisgICAgICAgKE5VTEwgIT0gcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pKQorICAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczp3ZGFXZGlBcGlNc2dQYXJhbSBpcyBub3QgTlVMTCIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlLZWVwQWxpdmVJbmZvKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBTdG9yZSBwYXJhbSBwb2ludGVyIGFzIHBhc3NlZCBpbiBieSBjYWxsZXIgKi8KKyAgICBwV0RBLT53ZGFNc2dQYXJhbSA9IHBLZWVwQWxpdmVQYXJhbXM7CisgICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICAgcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0gPSAodm9pZCAqKXdkaUtlZXBBbGl2ZUluZm87CisKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywiV0RBIEhJUCA6ICVkLiVkLiVkLiVkIiwKKyAgICAgICAgICAgICAgd2RpS2VlcEFsaXZlSW5mby0+d2RpS2VlcEFsaXZlSW5mby5hSG9zdElwdjRBZGRyWzBdLAorICAgICAgICAgICAgICB3ZGlLZWVwQWxpdmVJbmZvLT53ZGlLZWVwQWxpdmVJbmZvLmFIb3N0SXB2NEFkZHJbMV0sCisgICAgICAgICAgICAgIHdkaUtlZXBBbGl2ZUluZm8tPndkaUtlZXBBbGl2ZUluZm8uYUhvc3RJcHY0QWRkclsyXSwKKyAgICAgICAgICAgICAgd2RpS2VlcEFsaXZlSW5mby0+d2RpS2VlcEFsaXZlSW5mby5hSG9zdElwdjRBZGRyWzNdKTsgCisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIldEQSBESVAgOiAlZC4lZC4lZC4lZCIsCisgICAgICAgICAgICAgIHdkaUtlZXBBbGl2ZUluZm8tPndkaUtlZXBBbGl2ZUluZm8uYURlc3RJcHY0QWRkclswXSwKKyAgICAgICAgICAgICAgd2RpS2VlcEFsaXZlSW5mby0+d2RpS2VlcEFsaXZlSW5mby5hRGVzdElwdjRBZGRyWzFdLAorICAgICAgICAgICAgICB3ZGlLZWVwQWxpdmVJbmZvLT53ZGlLZWVwQWxpdmVJbmZvLmFEZXN0SXB2NEFkZHJbMl0sCisgICAgICAgICAgICAgIHdkaUtlZXBBbGl2ZUluZm8tPndkaUtlZXBBbGl2ZUluZm8uYURlc3RJcHY0QWRkclszXSk7IAorICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiV0RBIERNQUMgOiAlZDolZDolZDolZDolZDolZCIsCisgICAgICAgICAgICAgIHdkaUtlZXBBbGl2ZUluZm8tPndkaUtlZXBBbGl2ZUluZm8uYURlc3RNYWNBZGRyWzBdLAorICAgICAgICAgICAgICB3ZGlLZWVwQWxpdmVJbmZvLT53ZGlLZWVwQWxpdmVJbmZvLmFEZXN0TWFjQWRkclsxXSwKKyAgICAgICAgICAgICAgd2RpS2VlcEFsaXZlSW5mby0+d2RpS2VlcEFsaXZlSW5mby5hRGVzdE1hY0FkZHJbMl0sCisgICAgICAgICAgICAgIHdkaUtlZXBBbGl2ZUluZm8tPndkaUtlZXBBbGl2ZUluZm8uYURlc3RNYWNBZGRyWzNdLAorICAgICAgICAgICAgICB3ZGlLZWVwQWxpdmVJbmZvLT53ZGlLZWVwQWxpdmVJbmZvLmFEZXN0TWFjQWRkcls0XSwKKyAgICAgICAgICAgICAgd2RpS2VlcEFsaXZlSW5mby0+d2RpS2VlcEFsaXZlSW5mby5hRGVzdE1hY0FkZHJbNV0pOyAKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICJUaW1lUGVyaW9kICVkIFBhY2tldFR5cGUgJWQiLCAKKyAgICAgICAgICAgICAgd2RpS2VlcEFsaXZlSW5mby0+d2RpS2VlcEFsaXZlSW5mby51Y1RpbWVQZXJpb2QsCisgICAgICAgICAgICAgIHdkaUtlZXBBbGl2ZUluZm8tPndkaUtlZXBBbGl2ZUluZm8udWNQYWNrZXRUeXBlKTsgCisKKyAgICBzdGF0dXMgPSBXRElfS2VlcEFsaXZlUmVxKHdkaUtlZXBBbGl2ZUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0tlZXBBbGl2ZUNiKVdEQV9LZWVwQWxpdmVSZXFDYWxsYmFjaywgcFdEQSk7CisKKyAgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgICB7CisgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBLZWVwIEFsaXZlIFJFUSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgICAgdm9zX21lbV9mcmVlKHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICAgIHZvc19tZW1fZnJlZShwV0RBLT53ZGFNc2dQYXJhbSk7CisgICAgICAgIHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtID0gTlVMTDsKKyAgICAgICAgcFdEQS0+d2RhTXNnUGFyYW0gPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworCit9LypXREFfS2VlcEFsaXZlUmVxKi8KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfV293bEFkZEJjUHRyblJlcUNhbGxiYWNrCisgKiAKKyAqLyAKK3ZvaWQgV0RBX1dvd2xBZGRCY1B0cm5SZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKworICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1dvd2xBZGRCY1B0cm5SZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIGFkZCBXT1dMIEJjYXN0IHBhdHRlcm4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NXb3dsQWRkQmNQdHJuUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJXb3dsQWRkQmNhc3RQdHJuICpwV293bEFkZEJjUHRyblBhcmFtcykKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0RJX1dvd2xBZGRCY1B0cm5SZXFQYXJhbXNUeXBlICp3ZGlXb3dsQWRkQmNQdHJuSW5mbyA9IAorICAgICAgKFdESV9Xb3dsQWRkQmNQdHJuUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgc2l6ZW9mKFdESV9Xb3dsQWRkQmNQdHJuUmVxUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHdkaVdvd2xBZGRCY1B0cm5JbmZvKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlXb3dsQWRkQmNQdHJuSW5mbyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICB3ZGlXb3dsQWRkQmNQdHJuSW5mby0+d2RpV293bEFkZEJjUHRybkluZm8udWNQYXR0ZXJuSWQgPSAKKyAgICAgIHBXb3dsQWRkQmNQdHJuUGFyYW1zLT51Y1BhdHRlcm5JZDsKKyAgIHdkaVdvd2xBZGRCY1B0cm5JbmZvLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm5CeXRlT2Zmc2V0ID0gCisgICAgICBwV293bEFkZEJjUHRyblBhcmFtcy0+dWNQYXR0ZXJuQnl0ZU9mZnNldDsKKyAgIHdkaVdvd2xBZGRCY1B0cm5JbmZvLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm5NYXNrU2l6ZSA9IAorICAgICAgcFdvd2xBZGRCY1B0cm5QYXJhbXMtPnVjUGF0dGVybk1hc2tTaXplOworICAgd2RpV293bEFkZEJjUHRybkluZm8tPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVyblNpemUgPSAKKyAgICAgIHBXb3dsQWRkQmNQdHJuUGFyYW1zLT51Y1BhdHRlcm5TaXplOworCisgICBpZiAod2RpV293bEFkZEJjUHRybkluZm8tPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVyblNpemUgPD0gV0RJX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRSkKKyAgIHsKKyAgICAgICB2b3NfbWVtX2NvcHkod2RpV293bEFkZEJjUHRybkluZm8tPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgcFdvd2xBZGRCY1B0cm5QYXJhbXMtPnVjUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgd2RpV293bEFkZEJjUHRybkluZm8tPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVyblNpemUpOworICAgICAgIHZvc19tZW1fY29weSh3ZGlXb3dsQWRkQmNQdHJuSW5mby0+d2RpV293bEFkZEJjUHRybkluZm8udWNQYXR0ZXJuTWFzaywKKyAgICAgICAgICAgICAgICAgICAgcFdvd2xBZGRCY1B0cm5QYXJhbXMtPnVjUGF0dGVybk1hc2ssCisgICAgICAgICAgICAgICAgICAgIHdkaVdvd2xBZGRCY1B0cm5JbmZvLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm5NYXNrU2l6ZSk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAgdm9zX21lbV9jb3B5KHdkaVdvd2xBZGRCY1B0cm5JbmZvLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgIHBXb3dsQWRkQmNQdHJuUGFyYW1zLT51Y1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgIFdESV9XT1dMX0JDQVNUX1BBVFRFUk5fTUFYX1NJWkUpOworICAgICAgIHZvc19tZW1fY29weSh3ZGlXb3dsQWRkQmNQdHJuSW5mby0+d2RpV293bEFkZEJjUHRybkluZm8udWNQYXR0ZXJuTWFzaywKKyAgICAgICAgICAgICAgICAgICAgcFdvd2xBZGRCY1B0cm5QYXJhbXMtPnVjUGF0dGVybk1hc2ssCisgICAgICAgICAgICAgICAgICAgIFdESV9XT1dMX0JDQVNUX1BBVFRFUk5fTUFYX1NJWkUpOworCisgICAgICAgdm9zX21lbV9jb3B5KHdkaVdvd2xBZGRCY1B0cm5JbmZvLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm5FeHQsCisgICAgICAgICAgICAgICAgICAgIHBXb3dsQWRkQmNQdHJuUGFyYW1zLT51Y1BhdHRlcm5FeHQsCisgICAgICAgICAgICAgICAgICAgIHdkaVdvd2xBZGRCY1B0cm5JbmZvLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm5TaXplIC0gV0RJX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRSk7CisgICAgICAgdm9zX21lbV9jb3B5KHdkaVdvd2xBZGRCY1B0cm5JbmZvLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm5NYXNrRXh0LAorICAgICAgICAgICAgICAgICAgICBwV293bEFkZEJjUHRyblBhcmFtcy0+dWNQYXR0ZXJuTWFza0V4dCwKKyAgICAgICAgICAgICAgICAgICAgd2RpV293bEFkZEJjUHRybkluZm8tPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVybk1hc2tTaXplIC0gV0RJX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRSk7CisgICB9CisKKyAgIHdkaVdvd2xBZGRCY1B0cm5JbmZvLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIC8qIFN0b3JlIHBhcmFtIHBvaW50ZXIgYXMgcGFzc2VkIGluIGJ5IGNhbGxlciAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaVdvd2xBZGRCY1B0cm5JbmZvOworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSBwV293bEFkZEJjUHRyblBhcmFtczsKKworICAgc3RhdHVzID0gV0RJX1dvd2xBZGRCY1B0cm5SZXEod2RpV293bEFkZEJjUHRybkluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9Xb3dsQWRkQmNQdHJuQ2IpV0RBX1dvd2xBZGRCY1B0cm5SZXFDYWxsYmFjaywgcFdkYVBhcmFtcyk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBXb3dsIGFkZCBCY2FzdCBwdHJuIFJFUSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworCit9LypXREFfUHJvY2Vzc1dvd2xBZGRCY1B0cm5SZXEqLworCisvKgorICogRlVOQ1RJT046IFdEQV9Xb3dsRGVsQmNQdHJuUmVxQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfV293bERlbEJjUHRyblJlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzV293bERlbEJjUHRyblJlcQorICogUmVxdWVzdCB0byBXREkgdG8gZGVsZXRlIFdPV0wgQmNhc3QgcGF0dGVybgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1dvd2xEZWxCY1B0cm5SZXEodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpcldvd2xEZWxCY2FzdFB0cm4gKnBXb3dsRGVsQmNQdHJuUGFyYW1zKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICBXRElfV293bERlbEJjUHRyblJlcVBhcmFtc1R5cGUgKndkaVdvd2xEZWxCY1B0cm5JbmZvID0gCisgICAgICAoV0RJX1dvd2xEZWxCY1B0cm5SZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICBzaXplb2YoV0RJX1dvd2xEZWxCY1B0cm5SZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpV293bERlbEJjUHRybkluZm8pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaVdvd2xEZWxCY1B0cm5JbmZvKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHdkaVdvd2xEZWxCY1B0cm5JbmZvLT53ZGlXb3dsRGVsQmNQdHJuSW5mby51Y1BhdHRlcm5JZCA9IAorICAgICAgcFdvd2xEZWxCY1B0cm5QYXJhbXMtPnVjUGF0dGVybklkOworCisgICB3ZGlXb3dsRGVsQmNQdHJuSW5mby0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworCisgICAvKiBTdG9yZSBwYXJhbSBwb2ludGVyIGFzIHBhc3NlZCBpbiBieSBjYWxsZXIgKi8KKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSB3ZGlXb3dsRGVsQmNQdHJuSW5mbzsKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcFdvd2xEZWxCY1B0cm5QYXJhbXM7CisKKyAgIHN0YXR1cyA9IFdESV9Xb3dsRGVsQmNQdHJuUmVxKHdkaVdvd2xEZWxCY1B0cm5JbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfV293bERlbEJjUHRybkNiKVdEQV9Xb3dsRGVsQmNQdHJuUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gV293bCBkZWxldGUgQmNhc3QgcHRybiBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKKworfS8qV0RBX1Byb2Nlc3NXb3dsRGVsQmNQdHJuUmVxKi8KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfV293bEVudGVyUmVxQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfV293bEVudGVyUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOworICAgdFdEQV9DYkNvbnRleHQgKnBXREE7CisgICB0U2lySGFsV293bEVudGVyUGFyYW1zICpwV293bEVudGVyUGFyYW1zOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBwV2RhUGFyYW1zIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorCisgICBwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgOworICAgcFdvd2xFbnRlclBhcmFtcyA9ICAodFNpckhhbFdvd2xFbnRlclBhcmFtcyAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtIDsKKworCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKworCisgICBwV293bEVudGVyUGFyYW1zLT5zdGF0dXMgPSBDT05WRVJUX1dESTJTSVJfU1RBVFVTKHN0YXR1cykgOworCisgICBXREFfU2VuZE1zZyhwV0RBLCBXREFfV09XTF9FTlRFUl9SU1AsICh2b2lkICopcFdvd2xFbnRlclBhcmFtcyAsIDApIDsKKworICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1dvd2xFbnRlclJlcQorICogUmVxdWVzdCB0byBXREkgdG8gZW50ZXIgV09XTCAKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NXb3dsRW50ZXJSZXEodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lySGFsV293bEVudGVyUGFyYW1zICpwV293bEVudGVyUGFyYW1zKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICBXRElfV293bEVudGVyUmVxUGFyYW1zVHlwZSAqd2RpV293bEVudGVySW5mbyA9IAorICAgICAgKFdESV9Xb3dsRW50ZXJSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICBzaXplb2YoV0RJX1dvd2xFbnRlclJlcVBhcmFtc1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlXb3dsRW50ZXJJbmZvKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlXb3dsRW50ZXJJbmZvKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHZvc19tZW1fY29weSh3ZGlXb3dsRW50ZXJJbmZvLT53ZGlXb3dsRW50ZXJJbmZvLm1hZ2ljUHRybiwKKyAgICAgICAgICAgICAgICBwV293bEVudGVyUGFyYW1zLT5tYWdpY1B0cm4sCisgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgIHdkaVdvd2xFbnRlckluZm8tPndkaVdvd2xFbnRlckluZm8udWNNYWdpY1BrdEVuYWJsZSA9IAorICAgICAgcFdvd2xFbnRlclBhcmFtcy0+dWNNYWdpY1BrdEVuYWJsZTsKKworICAgd2RpV293bEVudGVySW5mby0+d2RpV293bEVudGVySW5mby51Y1BhdHRlcm5GaWx0ZXJpbmdFbmFibGUgPSAKKyAgICAgIHBXb3dsRW50ZXJQYXJhbXMtPnVjUGF0dGVybkZpbHRlcmluZ0VuYWJsZTsKKworICAgd2RpV293bEVudGVySW5mby0+d2RpV293bEVudGVySW5mby51Y1VjYXN0UGF0dGVybkZpbHRlcmluZ0VuYWJsZSA9IAorICAgICAgcFdvd2xFbnRlclBhcmFtcy0+dWNVY2FzdFBhdHRlcm5GaWx0ZXJpbmdFbmFibGU7CisKKyAgIHdkaVdvd2xFbnRlckluZm8tPndkaVdvd2xFbnRlckluZm8udWNXb3dDaG5sU3dpdGNoUmN2ID0gCisgICAgICBwV293bEVudGVyUGFyYW1zLT51Y1dvd0NobmxTd2l0Y2hSY3Y7CisKKyAgIHdkaVdvd2xFbnRlckluZm8tPndkaVdvd2xFbnRlckluZm8udWNXb3dEZWF1dGhSY3YgPSAKKyAgICAgIHBXb3dsRW50ZXJQYXJhbXMtPnVjV293RGVhdXRoUmN2OworCisgICB3ZGlXb3dsRW50ZXJJbmZvLT53ZGlXb3dsRW50ZXJJbmZvLnVjV293RGlzYXNzb2NSY3YgPSAKKyAgICAgIHBXb3dsRW50ZXJQYXJhbXMtPnVjV293RGlzYXNzb2NSY3Y7CisKKyAgIHdkaVdvd2xFbnRlckluZm8tPndkaVdvd2xFbnRlckluZm8udWNXb3dNYXhNaXNzZWRCZWFjb25zID0gCisgICAgICBwV293bEVudGVyUGFyYW1zLT51Y1dvd01heE1pc3NlZEJlYWNvbnM7CisKKyAgIHdkaVdvd2xFbnRlckluZm8tPndkaVdvd2xFbnRlckluZm8udWNXb3dNYXhTbGVlcFVzZWMgPSAKKyAgICAgIHBXb3dsRW50ZXJQYXJhbXMtPnVjV293TWF4U2xlZXBVc2VjOworCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisgICB3ZGlXb3dsRW50ZXJJbmZvLT53ZGlXb3dsRW50ZXJJbmZvLnVjV29XRUFQSURSZXF1ZXN0RW5hYmxlID0gCisgICAgICBwV293bEVudGVyUGFyYW1zLT51Y1dvV0VBUElEUmVxdWVzdEVuYWJsZTsKKworICAgd2RpV293bEVudGVySW5mby0+d2RpV293bEVudGVySW5mby51Y1dvV0VBUE9MNFdheUVuYWJsZSA9CisgICAgICBwV293bEVudGVyUGFyYW1zLT51Y1dvV0VBUE9MNFdheUVuYWJsZTsKKworICAgd2RpV293bEVudGVySW5mby0+d2RpV293bEVudGVySW5mby51Y1dvd05ldFNjYW5PZmZsb2FkTWF0Y2ggPSAKKyAgICAgIHBXb3dsRW50ZXJQYXJhbXMtPnVjV293TmV0U2Nhbk9mZmxvYWRNYXRjaDsKKworICAgd2RpV293bEVudGVySW5mby0+d2RpV293bEVudGVySW5mby51Y1dvd0dUS1Jla2V5RXJyb3IgPSAKKyAgICAgIHBXb3dsRW50ZXJQYXJhbXMtPnVjV293R1RLUmVrZXlFcnJvcjsKKworICAgd2RpV293bEVudGVySW5mby0+d2RpV293bEVudGVySW5mby51Y1dvV0JTU0Nvbm5Mb3NzID0gCisgICAgICBwV293bEVudGVyUGFyYW1zLT51Y1dvV0JTU0Nvbm5Mb3NzOworI2VuZGlmIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworCisgICB3ZGlXb3dsRW50ZXJJbmZvLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIC8qIFN0b3JlIHBhcmFtIHBvaW50ZXIgYXMgcGFzc2VkIGluIGJ5IGNhbGxlciAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaVdvd2xFbnRlckluZm87CisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IHBXb3dsRW50ZXJQYXJhbXM7CisKKyAgIHN0YXR1cyA9IFdESV9Xb3dsRW50ZXJSZXEod2RpV293bEVudGVySW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfV293bEVudGVyUmVxQ2IpV0RBX1dvd2xFbnRlclJlcUNhbGxiYWNrLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluIFdvd2wgZW50ZXIgUkVRIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7CisKK30vKldEQV9Qcm9jZXNzV293bEVudGVyUmVxKi8KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfV293bEV4aXRSZXFDYWxsYmFjaworICogCisgKi8gCit2b2lkIFdEQV9Xb3dsRXhpdFJlcUNhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBVc2VyRGF0YSA7IAorCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9XT1dMX0VYSVRfUlNQLCBOVUxMICwgQ09OVkVSVF9XREkyU0lSX1NUQVRVUyhzdGF0dXMpKSA7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NXb3dsRXhpdFJlcQorICogUmVxdWVzdCB0byBXREkgdG8gYWRkIFdPV0wgQmNhc3QgcGF0dGVybgorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1dvd2xFeGl0UmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgc3RhdHVzID0gV0RJX1dvd2xFeGl0UmVxKChXRElfV293bEV4aXRSZXFDYilXREFfV293bEV4aXRSZXFDYWxsYmFjaywgcFdEQSk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBXb3dsIGV4aXQgUkVRIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhTXNnUGFyYW0pOworICAgICAgcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0gPSBOVUxMOworICAgICAgcFdEQS0+d2RhTXNnUGFyYW0gPSBOVUxMOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKKworfS8qV0RBX1Byb2Nlc3NXb3dsRXhpdFJlcSovCisKKy8qCisgKiBGVU5DVElPTjogV0RBX0lzSHdGcmFtZVR4VHJhbnNsYXRpb25DYXBhYmxlCisgKiBSZXF1ZXN0IHRvIFdESSB0byBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIHN0YXRpb24gaXMgY2FwYWJsZSBvZiAKKyAqIHVzaW5nIEhXLWJhc2VkIGZyYW1lIHRyYW5zbGF0aW9uCisgKi8gCit2X0JPT0xfdCBXREFfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUodl9QVk9JRF90IHBWb3NHQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggc3RhSWR4KQoreworICAgcmV0dXJuIFdESV9Jc0h3RnJhbWVUeFRyYW5zbGF0aW9uQ2FwYWJsZShzdGFJZHgpOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9OdkRvd25sb2FkUmVxQ2FsbGJhY2sKKyAqIHNlbmQgTlYgRG93bmxvYWQgUlNQIGJhY2sgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX052RG93bmxvYWRSZXFDYWxsYmFjayhXRElfTnZEb3dubG9hZFJzcEluZm9UeXBlICpwTnZEb3dubG9hZFJzcFBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpCit7CisKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBPSAoIHRXREFfQ2JDb250ZXh0ICopcFVzZXJEYXRhOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qQ2xlYW5pbmcgKi8KKyAgIHZvc19tZW1fZnJlZShwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0gPSBOVUxMOworICAgcFdEQS0+d2RhTXNnUGFyYW0gPSBOVUxMOworCisgICB2b3NfV0RBQ29tcGxldGVfY2JhY2socFdEQS0+cFZvc0NvbnRleHQpOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzTnZEb3dubG9hZFJlcQorICogUmVhZCB0aGUgTlYgYmxvYiB0byBhIGJ1ZmZlciBhbmQgc2VuZCBhIHJlcXVlc3QgdG8gV0RJIHRvIGRvd25sb2FkIHRoZSBibG9iIHRvIE5WIG1lbW9yeS4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX05WRG93bmxvYWRfU3RhcnQodl9QVk9JRF90IHBWb3NDb250ZXh0KQoreworICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgVmFyaWFibGVzKi8KKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopVk9TX0dFVF9XREFfQ1RYVChwVm9zQ29udGV4dCk7CisgICB2X1ZPSURfdCAqcE52QnVmZmVyPU5VTEw7CisgICB2X1NJWkVfdCBidWZmZXJTaXplID0gMDsKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgICBXRElfTnZEb3dubG9hZFJlcVBhcmFtc1R5cGUgKiB3ZGlOdkRvd25sb2FkUmVxUGFyYW0gPU5VTEw7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSBwV0RBKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczpwV0RBIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIGlmKE5VTEwgIT0gcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6d2RhV2RpQXBpTXNnUGFyYW0gaXMgbm90IE5VTEwiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIAorICAgLyogR2V0IHRoZSBOViBzdHJ1Y3R1cmUgYmFzZSBhZGRyZXNzIGFuZCBzaXplIGZyb20gVk9TICovCisgICB2b3NfbnZfZ2V0TlZCdWZmZXIoJnBOdkJ1ZmZlciwmYnVmZmVyU2l6ZSk7CisKKyAgIHdkaU52RG93bmxvYWRSZXFQYXJhbSA9IChXRElfTnZEb3dubG9hZFJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXRElfTnZEb3dubG9hZFJlcVBhcmFtc1R5cGUpKSA7CisKKyAgIGlmKE5VTEwgPT0gd2RpTnZEb3dubG9hZFJlcVBhcmFtKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgLyogQ29weSBQYXJhbXMgdG8gd2RpTnZEb3dubG9hZFJlcVBhcmFtKi8KKyAgIHdkaU52RG93bmxvYWRSZXFQYXJhbS0+d2RpQmxvYkluZm8ucEJsb2JBZGRyZXNzID0gcE52QnVmZmVyOworICAgd2RpTnZEb3dubG9hZFJlcVBhcmFtLT53ZGlCbG9iSW5mby51QmxvYlNpemUgPSBidWZmZXJTaXplOworCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKil3ZGlOdkRvd25sb2FkUmVxUGFyYW0gOworCisgICB3ZGlOdkRvd25sb2FkUmVxUGFyYW0tPndkaVJlcVN0YXR1c0NCID0gTlVMTCA7CisKKyAgIHN0YXR1cyA9IFdESV9OdkRvd25sb2FkUmVxKHdkaU52RG93bmxvYWRSZXFQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgIChXRElfTnZEb3dubG9hZFJzcENiKVdEQV9OdkRvd25sb2FkUmVxQ2FsbGJhY2ssKHZvaWQgKilwV0RBKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiRmFpbHVyZSBpbiBOViBEb3dubG9hZCBSRVEgUGFyYW1zIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXREEtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSA9IE5VTEw7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworCit9CisvKgorICogRlVOQ1RJT046IFdEQV9GbHVzaEFjUmVxQ2FsbGJhY2sKKyAqIHNlbmQgRmx1c2ggQUMgUlNQIGJhY2sgdG8gVEwKKyAqLyAKK3ZvaWQgV0RBX0ZsdXNoQWNSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdm9zX21zZ190IHdkYU1zZyA9IHswfSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsgCisgICB0Rmx1c2hBQ1JlcSAqcEZsdXNoQUNSZXFQYXJhbXM7CisgICB0Rmx1c2hBQ1JzcCAqcEZsdXNoQUNSc3BQYXJhbXM7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBwV2RhUGFyYW1zIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorICAgCisgICBwRmx1c2hBQ1JlcVBhcmFtcyA9ICh0Rmx1c2hBQ1JlcSAqKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtOworICAgcEZsdXNoQUNSc3BQYXJhbXMgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodEZsdXNoQUNSc3ApKTsKKyAgIGlmKE5VTEwgPT0gcEZsdXNoQUNSc3BQYXJhbXMpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gOworICAgfQorICAgdm9zX21lbV96ZXJvKHBGbHVzaEFDUnNwUGFyYW1zLHNpemVvZih0Rmx1c2hBQ1JzcCkpOyAgIAorICAgcEZsdXNoQUNSc3BQYXJhbXMtPm1lc2dMZW4gPSBzaXplb2YodEZsdXNoQUNSc3ApOworICAgcEZsdXNoQUNSc3BQYXJhbXMtPm1lc2dUeXBlID0gV0RBX1RMX0ZMVVNIX0FDX1JTUDsKKyAgIHBGbHVzaEFDUnNwUGFyYW1zLT51Y1NUQUlkID0gcEZsdXNoQUNSZXFQYXJhbXMtPnVjU1RBSWQ7CisgICBwRmx1c2hBQ1JzcFBhcmFtcy0+dWNUaWQgPSBwRmx1c2hBQ1JlcVBhcmFtcy0+dWNUaWQ7CisgICBwRmx1c2hBQ1JzcFBhcmFtcy0+c3RhdHVzID0gQ09OVkVSVF9XREkyU0lSX1NUQVRVUyhzdGF0dXMpIDsKKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworCisgICB3ZGFNc2cudHlwZSA9IFdEQV9UTF9GTFVTSF9BQ19SU1AgOyAKKyAgIHdkYU1zZy5ib2R5cHRyID0gKHZvaWQgKilwRmx1c2hBQ1JzcFBhcmFtczsKKyAgIC8vIFBPU1QgbWVzc2FnZSB0byBUTAorICAgdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfVEwsICh2b3NfbXNnX3QgKikgJndkYU1zZyk7CisKKworICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc0ZsdXNoQWNSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIFVwZGF0ZSB0aGUgREVMQkEgUkVRIHBhcmFtcy4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NGbHVzaEFjUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRGbHVzaEFDUmVxICpwRmx1c2hBY1JlcVBhcmFtcykKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTIDsKKyAgIFdESV9GbHVzaEFjUmVxUGFyYW1zVHlwZSAqd2RpRmx1c2hBY1JlcVBhcmFtID0gCisgICAgICAgICAgICAgICAoV0RJX0ZsdXNoQWNSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0ZsdXNoQWNSZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBpZihOVUxMID09IHdkaUZsdXNoQWNSZXFQYXJhbSkgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpRmx1c2hBY1JlcVBhcmFtKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgd2RpRmx1c2hBY1JlcVBhcmFtLT53ZGlGbHVzaEFjSW5mby51Y1NUQUlkID0gcEZsdXNoQWNSZXFQYXJhbXMtPnVjU1RBSWQ7CisgICB3ZGlGbHVzaEFjUmVxUGFyYW0tPndkaUZsdXNoQWNJbmZvLnVjVGlkID0gcEZsdXNoQWNSZXFQYXJhbXMtPnVjVGlkOworICAgd2RpRmx1c2hBY1JlcVBhcmFtLT53ZGlGbHVzaEFjSW5mby51c01lc2dMZW4gPSBwRmx1c2hBY1JlcVBhcmFtcy0+bWVzZ0xlbjsKKyAgIHdkaUZsdXNoQWNSZXFQYXJhbS0+d2RpRmx1c2hBY0luZm8udXNNZXNnVHlwZSA9IHBGbHVzaEFjUmVxUGFyYW1zLT5tZXNnVHlwZTsKKworICAgLyogU3RvcmUgRmx1c2ggQUMgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcEZsdXNoQWNSZXFQYXJhbXM7CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaUZsdXNoQWNSZXFQYXJhbTsKKworICAgc3RhdHVzID0gV0RJX0ZsdXNoQWNSZXEod2RpRmx1c2hBY1JlcVBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfRmx1c2hBY1JzcENiKVdEQV9GbHVzaEFjUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gRmx1c2ggQUMgUkVRIFBhcmFtcyBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICAgICAvL1RPRE86IHJlc3BvbmQgdG8gVEwgd2l0aCBmYWlsdXJlCisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworCit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0J0QW1wRXZlbnRSZXFDYWxsYmFjaworICogCisgKi8gCit2b2lkIFdEQV9CdEFtcEV2ZW50UmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOyAKKyAgIFdESV9CdEFtcEV2ZW50UGFyYW1zVHlwZSAqd2RpQnRBbXBFdmVudFBhcmFtOyAKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIHdkaUJ0QW1wRXZlbnRQYXJhbSA9IChXRElfQnRBbXBFdmVudFBhcmFtc1R5cGUgKilwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbTsKKyAgIGlmKEJUQU1QX0VWRU5UX0NPTk5FQ1RJT05fVEVSTUlOQVRFRCA9PSAKKyAgICAgIHdkaUJ0QW1wRXZlbnRQYXJhbS0+d2RpQnRBbXBFdmVudEluZm8udWNCdEFtcEV2ZW50VHlwZSkKKyAgIHsKKyAgICAgIHBXREEtPndkYUFtcFNlc3Npb25PbiA9IFZPU19GQUxTRTsKKyAgIH0KKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKyAgIC8qIAorICAgICogTm8gcmVzcG9uZSByZXF1aXJlZCBmb3IgV0RBX1NJR05BTF9CVEFNUF9FVkVOVCBzbyBqdXN0IGZyZWUgdGhlIHJlcXVlc3QgCisgICAgKiBwYXJhbSBoZXJlCisgICAgKi8KKworICAgcmV0dXJuIDsKK30KKworCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzQnRBbXBFdmVudFJlcQorICogUmVxdWVzdCB0byBXREkgdG8gVXBkYXRlIHdpdGggQlQgQU1QIGV2ZW50cy4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NCdEFtcEV2ZW50UmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTbWVCdEFtcEV2ZW50ICpwQnRBbXBFdmVudFBhcmFtcykKK3sKKyAgIFdESV9TdGF0dXMgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTIDsKKyAgIFdESV9CdEFtcEV2ZW50UGFyYW1zVHlwZSAqd2RpQnRBbXBFdmVudFBhcmFtID0gCisgICAgICAgICAgICAoV0RJX0J0QW1wRXZlbnRQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX0J0QW1wRXZlbnRQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpQnRBbXBFdmVudFBhcmFtKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlCdEFtcEV2ZW50UGFyYW0pOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgd2RpQnRBbXBFdmVudFBhcmFtLT53ZGlCdEFtcEV2ZW50SW5mby51Y0J0QW1wRXZlbnRUeXBlID0gCisgICAgICBwQnRBbXBFdmVudFBhcmFtcy0+YnRBbXBFdmVudFR5cGU7CisKKyAgIHdkaUJ0QW1wRXZlbnRQYXJhbS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworCisgICAvKiBTdG9yZSBCVCBBTVAgZXZlbnQgcG9pbnRlciwgYXMgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIHJlc3BvbnNlICovCisgICAvKiBzdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcEJ0QW1wRXZlbnRQYXJhbXM7CisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IHdkaUJ0QW1wRXZlbnRQYXJhbTsKKworICAgc3RhdHVzID0gV0RJX0J0QW1wRXZlbnRSZXEod2RpQnRBbXBFdmVudFBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfQnRBbXBFdmVudFJzcENiKVdEQV9CdEFtcEV2ZW50UmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gQlQgQU1QIGV2ZW50IFJFUSBQYXJhbXMgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgfQorCisgICBpZihCVEFNUF9FVkVOVF9DT05ORUNUSU9OX1NUQVJUID09IHdkaUJ0QW1wRXZlbnRQYXJhbS0+d2RpQnRBbXBFdmVudEluZm8udWNCdEFtcEV2ZW50VHlwZSkKKyAgIHsKKyAgICAgIHBXREEtPndkYUFtcFNlc3Npb25PbiA9IFZPU19UUlVFOworICAgfQorICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7CisKK30KKworCisjaWZkZWYgQU5JX01BTkZfRElBRworLyoKKyAqIEZVTkNUSU9OOiBXREFfRlRNQ29tbWFuZFJlcUNhbGxiYWNrCisgKiBIYW5kbGUgRlRNIENNRCByZXNwb25zZSBjYW1lIGZyb20gSEFMCisgKiBSb3V0ZSByZXNwb25jZSB0byBIREQgRlRNCisgKi8gCit2b2lkIFdEQV9GVE1Db21tYW5kUmVxQ2FsbGJhY2sodm9pZCAqZnRtQ21kUnNwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c3JEYXRhKQoreworICAgdFdEQV9DYkNvbnRleHQgKnBXREEgPSAodFdEQV9DYkNvbnRleHQgKil1c3JEYXRhIDsKKworICAgaWYoKE5VTEwgPT0gcFdEQSkgfHwgKE5VTEwgPT0gZnRtQ21kUnNwRGF0YSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXMsIGludmFsaWQgaW5wdXQgMHgleCwgMHgleCIsX19GVU5DVElPTl9fLCAgcFdEQSwgZnRtQ21kUnNwRGF0YSk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIFJlbGVhc2UgQ3VycmVudCBGVE0gQ29tbWFuZCBSZXF1ZXN0ICovCisgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhRlRNQ21kUmVxKTsKKyAgIHBXREEtPndkYUZUTUNtZFJlcSA9IE5VTEw7CisKKyNpZm5kZWYgV0xBTl9GVE1fU1RVQgorICAgLyogUG9zdCBGVE0gUmVzcG9uY2UgdG8gSEREIEZUTSAqLworICAgd2xhbl9zeXNfZnRtKGZ0bUNtZFJzcERhdGEpOworI2VuZGlmIC8qIFdMQU5fRlRNX1NUVUIgKi8KKworICAgcmV0dXJuOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzRlRNQ29tbWFuZAorICogU2VuZCBGVE0gY29tbWFuZCB0byBXREkKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NGVE1Db21tYW5kKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQdHRNc2didWZmZXIgICpwUFRURnRtQ21kKQoreworICAgV0RJX1N0YXR1cyAgICAgICAgICAgICBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1M7CisgICBXRElfRlRNQ29tbWFuZFJlcVR5cGUgKmZ0bUNNRFJlcSA9IE5VTEw7CisKKyAgIGZ0bUNNRFJlcSA9IChXRElfRlRNQ29tbWFuZFJlcVR5cGUgKikKKyAgICAgICAgICAgICAgICB2b3NfbWVtX21hbGxvYyhzaXplb2YoV0RJX0ZUTUNvbW1hbmRSZXFUeXBlKSk7CisgICBpZihOVUxMID09IGZ0bUNNRFJlcSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXREEgRlRNIENvbW1hbmQgYnVmZmVyIGFsbG9jIGZhaWwiKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIGZ0bUNNRFJlcS0+Ym9keUxlbmd0aCAgICAgPSBwUFRURnRtQ21kLT5tc2dCb2R5TGVuZ3RoOworICAgZnRtQ01EUmVxLT5GVE1Db21tYW5kQm9keSA9ICh2b2lkICopcFBUVEZ0bUNtZDsKKworICAgcFdEQS0+d2RhRlRNQ21kUmVxICAgICAgICA9ICh2b2lkICopZnRtQ01EUmVxOworCisgICAvKiBTZW5kIGNvbW1hbmQgdG8gV0RJICovCisgICBzdGF0dXMgPSBXRElfRlRNQ29tbWFuZFJlcShmdG1DTURSZXEsIFdEQV9GVE1Db21tYW5kUmVxQ2FsbGJhY2ssIHBXREEpOworCisgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIEFOSV9NQU5GX0RJQUcgKi8KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfU2V0VHhQZXJUcmFja2luZ1JlcUNhbGxiYWNrCisgKiAKKyAqLyAKK3ZvaWQgV0RBX1NldFR4UGVyVHJhY2tpbmdSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICAKKyAgIGlmKE5VTEwgIT0gcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pCisgICB7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pOworICAgfQorCisgICBpZihOVUxMICE9IHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKQorICAgeworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIH0KKyAgIAorICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworCisgICByZXR1cm4gOworfQorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisvKgorICogRlVOQ1RJT046IFdEQV9Ib3N0T2ZmbG9hZFJlcUNhbGxiYWNrCisgKiAKKyAqLyAKK3ZvaWQgV0RBX0dUS09mZmxvYWRSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7CisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgVk9TX0FTU0VSVChOVUxMICE9IHBXZGFQYXJhbXMpOworICAgCisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pIDsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworCisgICAvL3ByaW50IGEgbXNnLCBub3RoaW5nIGVsc2UgdG8gZG8KKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiV0RBX0dUS09mZmxvYWRSZXFDYWxsYmFjayBpbnZva2VkICIgKTsKKworICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc0dUS09mZmxvYWRSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIHNldCB0aGUgZmlsdGVyIHRvIG1pbmltaXplIHVubmVjZXNzYXJ5IGhvc3Qgd2FrZXVwIGR1ZSAKKyAqIHRvIGJyb2FkY2FzdCB0cmFmZmljICAgKHN0YSBtb2RlKS4KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NHVEtPZmZsb2FkUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwU2lyR3RrT2ZmbG9hZFBhcmFtcyBwR3RrT2ZmbG9hZFBhcmFtcykKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0RJX0d0a09mZmxvYWRSZXFNc2cgKndkaUd0a09mZmxvYWRSZXFNc2cgPSAKKyAgICAgIChXRElfR3RrT2ZmbG9hZFJlcU1zZyAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgc2l6ZW9mKFdESV9HdGtPZmZsb2FkUmVxTXNnKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gd2RpR3RrT2ZmbG9hZFJlcU1zZykgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlHdGtPZmZsb2FkUmVxTXNnKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIC8vCisgICAvLyBGaWxsIHdkaUd0a09mZmxvYWRJbmZvIGZyb20gcEd0a09mZmxvYWRQYXJhbXMKKyAgIC8vCisgICB3ZGlHdGtPZmZsb2FkUmVxTXNnLT5ndGtPZmZsb2FkUmVxUGFyYW1zLnVsRmxhZ3MgPSBwR3RrT2ZmbG9hZFBhcmFtcy0+dWxGbGFnczsKKyAgIC8vIENvcHkgS0NLCisgICB2b3NfbWVtX2NvcHkoJih3ZGlHdGtPZmZsb2FkUmVxTXNnLT5ndGtPZmZsb2FkUmVxUGFyYW1zLmFLQ0tbMF0pLCAmKHBHdGtPZmZsb2FkUGFyYW1zLT5hS0NLWzBdKSwgMTYpOworICAgLy8gQ29weSBLRUsKKyAgIHZvc19tZW1fY29weSgmKHdkaUd0a09mZmxvYWRSZXFNc2ctPmd0a09mZmxvYWRSZXFQYXJhbXMuYUtFS1swXSksICYocEd0a09mZmxvYWRQYXJhbXMtPmFLRUtbMF0pLCAxNik7CisgICAvLyBDb3B5IEtleVJlcGxheUNvdW50ZXIKKyAgIHZvc19tZW1fY29weSgmKHdkaUd0a09mZmxvYWRSZXFNc2ctPmd0a09mZmxvYWRSZXFQYXJhbXMudWxsS2V5UmVwbGF5Q291bnRlciksIAorICAgICAgICAgICAgICAgICYocEd0a09mZmxvYWRQYXJhbXMtPnVsbEtleVJlcGxheUNvdW50ZXIpLCBzaXplb2Yodl9VNjRfdCkpOworCisgICB3ZGlHdGtPZmZsb2FkUmVxTXNnLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIFZPU19BU1NFUlQoKE5VTEwgPT0gcFdEQS0+d2RhTXNnUGFyYW0pICYmIAorICAgICAgICAgICAgICAoTlVMTCA9PSBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkpOworCisgICAvKiBTdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKil3ZGlHdGtPZmZsb2FkUmVxTXNnOworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgLyogU3RvcmUgcGFyYW0gcG9pbnRlciBhcyBwYXNzZWQgaW4gYnkgY2FsbGVyICovCisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IHBHdGtPZmZsb2FkUGFyYW1zOworCisgICBzdGF0dXMgPSBXRElfR1RLT2ZmbG9hZFJlcSh3ZGlHdGtPZmZsb2FkUmVxTXNnLCAoV0RJX0d0a09mZmxvYWRDYilXREFfR1RLT2ZmbG9hZFJlcUNhbGxiYWNrLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluIFdEQV9Qcm9jZXNzR1RLT2ZmbG9hZFJlcSgpLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX0d0a09mZmxvYWRHZXRJbmZvQ2FsbGJhY2sgCisgKiAKKyAqLyAKK3ZvaWQgV0RBX0d0a09mZmxvYWRHZXRJbmZvQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQgKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBOworICAgdHBTaXJHdGtPZmZsb2FkR2V0SW5mb1JzcFBhcmFtcyBwR3RrT2ZmbG9hZEdldEluZm9SZXE7CisgICB0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zIHBHdGtPZmZsb2FkR2V0SW5mb1JzcCA9IHZvc19tZW1fbWFsbG9jKHNpemVvZih0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zKSkgOworICAgdEFOSV9VOCBpOworICAgdm9zX21zZ190IHZvc01zZzsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBWT1NfQVNTRVJUKE5VTEwgIT0gcFdkYVBhcmFtcyk7CisKKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA7CisgICBwR3RrT2ZmbG9hZEdldEluZm9SZXEgPSAodHBTaXJHdGtPZmZsb2FkR2V0SW5mb1JzcFBhcmFtcylwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbTsKKworICAgLy8gRmlsbCBwR3RrT2ZmbG9hZEdldEluZm9Sc3AgZnJvbSB0U2lyR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXMKKyAgIHZvc19tZW1femVybyhwR3RrT2ZmbG9hZEdldEluZm9Sc3AsIHNpemVvZih0U2lyR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXMpKTsKKworICAgLyogTWVzc2FnZSBIZWFkZXIgKi8KKyAgIHBHdGtPZmZsb2FkR2V0SW5mb1JzcC0+bWVzZ1R5cGUgPSBlV05JX1BNQ19HVEtfT0ZGTE9BRF9HRVRJTkZPX1JTUDsKKyAgIHBHdGtPZmZsb2FkR2V0SW5mb1JzcC0+bWVzZ0xlbiA9IHNpemVvZih0cFNpckd0a09mZmxvYWRHZXRJbmZvUnNwUGFyYW1zKTsKKworICAgcEd0a09mZmxvYWRHZXRJbmZvUnNwLT51bFN0YXR1cyAgICAgICAgICAgID0gcEd0a09mZmxvYWRHZXRJbmZvUmVxLT51bFN0YXR1czsKKyAgIHBHdGtPZmZsb2FkR2V0SW5mb1JzcC0+dWxsS2V5UmVwbGF5Q291bnRlciA9IHBHdGtPZmZsb2FkR2V0SW5mb1JlcS0+dWxsS2V5UmVwbGF5Q291bnRlcjsKKyAgIHBHdGtPZmZsb2FkR2V0SW5mb1JzcC0+dWxUb3RhbFJla2V5Q291bnQgICA9IHBHdGtPZmZsb2FkR2V0SW5mb1JlcS0+dWxUb3RhbFJla2V5Q291bnQ7CisgICBwR3RrT2ZmbG9hZEdldEluZm9Sc3AtPnVsR1RLUmVrZXlDb3VudCAgICAgPSBwR3RrT2ZmbG9hZEdldEluZm9SZXEtPnVsR1RLUmVrZXlDb3VudDsKKyAgIHBHdGtPZmZsb2FkR2V0SW5mb1JzcC0+dWxJR1RLUmVrZXlDb3VudCAgICA9IHBHdGtPZmZsb2FkR2V0SW5mb1JlcS0+dWxJR1RLUmVrZXlDb3VudDsKKworICAgLyogVk9TIG1lc3NhZ2Ugd3JhcHBlciAqLworICAgdm9zTXNnLnR5cGUgPSBlV05JX1BNQ19HVEtfT0ZGTE9BRF9HRVRJTkZPX1JTUDsKKyAgIHZvc01zZy5ib2R5cHRyID0gKHZvaWQgKilwR3RrT2ZmbG9hZEdldEluZm9Sc3A7CisgICB2b3NNc2cuYm9keXZhbCA9IDA7CisKKyAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfU01FLCAodm9zX21zZ190Kikmdm9zTXNnKSkKKyAgIHsKKyAgICAgIC8qIGZyZWUgdGhlIG1lbSBhbmQgcmV0dXJuICovCisgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICopIHBHdGtPZmZsb2FkR2V0SW5mb1JzcCk7CisgICB9CisKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSkgOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7Cit9CisjZW5kaWYKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1NldFR4UGVyVHJhY2tpbmdSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIHNldCBUeCBQZXIgVHJhY2tpbmcgY29uZmlndXJhdGlvbnMKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NTZXRUeFBlclRyYWNraW5nUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCB0U2lyVHhQZXJUcmFja2luZ1BhcmFtICpwVHhQZXJUcmFja2luZ1BhcmFtcykKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0RJX1NldFR4UGVyVHJhY2tpbmdSZXFQYXJhbXNUeXBlICpwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcyA9IAorICAgICAgKFdESV9TZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgc2l6ZW9mKFdESV9TZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zVHlwZSkpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHB3ZGlTZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICB2b3NfbWVtX2ZyZWUocFR4UGVyVHJhY2tpbmdQYXJhbXMpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIHZvc19tZW1fZnJlZShwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcyk7CisgICAgICB2b3NfbWVtX2ZyZWUocFR4UGVyVHJhY2tpbmdQYXJhbXMpOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHB3ZGlTZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zLT53ZGlUeFBlclRyYWNraW5nUGFyYW0udWNUeFBlclRyYWNraW5nRW5hYmxlID0gCisgICAgICBwVHhQZXJUcmFja2luZ1BhcmFtcy0+dWNUeFBlclRyYWNraW5nRW5hYmxlOworICAgcHdkaVNldFR4UGVyVHJhY2tpbmdSZXFQYXJhbXMtPndkaVR4UGVyVHJhY2tpbmdQYXJhbS51Y1R4UGVyVHJhY2tpbmdQZXJpb2QgPSAKKyAgICAgIHBUeFBlclRyYWNraW5nUGFyYW1zLT51Y1R4UGVyVHJhY2tpbmdQZXJpb2Q7CisgICBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcy0+d2RpVHhQZXJUcmFja2luZ1BhcmFtLnVjVHhQZXJUcmFja2luZ1JhdGlvID0gCisgICAgICBwVHhQZXJUcmFja2luZ1BhcmFtcy0+dWNUeFBlclRyYWNraW5nUmF0aW87CisgICBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcy0+d2RpVHhQZXJUcmFja2luZ1BhcmFtLnVUeFBlclRyYWNraW5nV2F0ZXJtYXJrID0gCisgICAgICBwVHhQZXJUcmFja2luZ1BhcmFtcy0+dVR4UGVyVHJhY2tpbmdXYXRlcm1hcms7CisKKyAgIHB3ZGlTZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIC8qIFN0b3JlIHBhcmFtIHBvaW50ZXIgYXMgcGFzc2VkIGluIGJ5IGNhbGxlciAqLworICAgLyogc3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJIAorICAgICAgSWRlYWxseSwgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgaGVyZSB3aWxsIGJlIGZyZWUgYXQgV0RBX1NldFR4UGVyVHJhY2tpbmdSZXFDYWxsYmFjayAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtczsKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcFR4UGVyVHJhY2tpbmdQYXJhbXM7CisKKyAgIHN0YXR1cyA9IFdESV9TZXRUeFBlclRyYWNraW5nUmVxKHB3ZGlTZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfU2V0VHhQZXJUcmFja2luZ1JzcENiKVdEQV9TZXRUeFBlclRyYWNraW5nUmVxQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gU2V0IFR4IFBFUiBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKKworfS8qV0RBX1Byb2Nlc3NTZXRUeFBlclRyYWNraW5nUmVxKi8KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfSEFMRHVtcENtZENhbGxiYWNrCisgKiBTZW5kIHRoZSBWT1MgY29tcGxldGUgLiAKKyAqLwordm9pZCBXREFfSEFMRHVtcENtZENhbGxiYWNrKFdESV9IQUxEdW1wQ21kUnNwUGFyYW1zVHlwZSAqd2RpUnNwUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRBTklfVTggKmJ1ZmZlciA9IE5VTEw7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQSA9IE5VTEw7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsKKworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisgICAKKyAgIHBXREEgPSBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKyAgIGJ1ZmZlciA9ICh0QU5JX1U4ICopcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW07CisKKyAgIGlmKHdkaVJzcFBhcmFtcy0+dXNCdWZmZXJMZW4gPiAwKQorICAgeworICAgICAgLypDb3B5IHRoZSBSZXNwIGRhdGEgdG8gVU1BQyBzdXBwbGllZCBidWZmZXIqLworICAgICAgdm9zX21lbV9jb3B5KGJ1ZmZlciwgd2RpUnNwUGFyYW1zLT5wQnVmZmVyLCB3ZGlSc3BQYXJhbXMtPnVzQnVmZmVyTGVuKTsKKyAgIH0KKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgIAorICAgLyogSW5kaWNhdGUgVk9TUyBhYm91dCB0aGUgc3RhcnQgY29tcGxldGUgKi8KKyAgIHZvc19XREFDb21wbGV0ZV9jYmFjayhwV0RBLT5wVm9zQ29udGV4dCk7CisKKyAgIHJldHVybiA7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc0hBTER1bXBDbWRSZXEKKyAqIFNlbmQgRHVtcCBjb21tYW5kIHRvIFdESQorICovIAorVk9TX1NUQVRVUyBXREFfSEFMRHVtcENtZFJlcSh0cEFuaVNpckdsb2JhbCAgIHBNYWMsIHRBTklfVTMyICBjbWQsIAorICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgIGFyZzEsIHRBTklfVTMyICAgYXJnMiwgdEFOSV9VMzIgICBhcmczLAorICAgICAgICAgICAgICAgICB0QU5JX1UzMiAgIGFyZzQsIHRBTklfVTggICAqcEJ1ZmZlcikKK3sKKyAgIFdESV9TdGF0dXMgICAgICAgICAgICAgc3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTOworICAgV0RJX0hBTER1bXBDbWRSZXFQYXJhbXNUeXBlICp3ZGlIQUxEdW1wQ21kUmVxUGFyYW0gPSBOVUxMOworICAgV0RJX0hBTER1bXBDbWRSZXFJbmZvVHlwZSAqd2RpSGFsRHVtcENtZEluZm8gPSBOVUxMIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKyAgIHBWb3NDb250ZXh0VHlwZSBwVm9zQ29udGV4dCA9IE5VTEw7IAorICAgVk9TX1NUQVRVUyB2U3RhdHVzOworCisgICBwVm9zQ29udGV4dCA9IChwVm9zQ29udGV4dFR5cGUpdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1BFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBNYWMpOworICAgCisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIC8qIEFsbG9jYXRlIG1lbW9yeSBXREkgcmVxdWVzdCBzdHJ1Y3R1cmUqLworICAgd2RpSEFMRHVtcENtZFJlcVBhcmFtID0gKFdESV9IQUxEdW1wQ21kUmVxUGFyYW1zVHlwZSAqKQorICAgICAgICAgICAgICAgIHZvc19tZW1fbWFsbG9jKHNpemVvZihXRElfSEFMRHVtcENtZFJlcVBhcmFtc1R5cGUpKTsKKyAgIGlmKE5VTEwgPT0gd2RpSEFMRHVtcENtZFJlcVBhcmFtKQorICAgeworICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIldEQSBIQUwgRFVNUCBDb21tYW5kIGJ1ZmZlciBhbGxvYyBmYWlsIik7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHdkaUhhbER1bXBDbWRJbmZvID0gJndkaUhBTER1bXBDbWRSZXFQYXJhbS0+d2RpSEFMRHVtcENtZEluZm9UeXBlOworCisgICAvKiBFeHRyYWN0IHRoZSBhcmd1bWVudHMgKi8KKyAgIHdkaUhhbER1bXBDbWRJbmZvLT5jb21tYW5kICAgICA9IGNtZDsKKyAgIHdkaUhhbER1bXBDbWRJbmZvLT5hcmd1bWVudDEgICA9IGFyZzE7CisgICB3ZGlIYWxEdW1wQ21kSW5mby0+YXJndW1lbnQyICAgPSBhcmcyOworICAgd2RpSGFsRHVtcENtZEluZm8tPmFyZ3VtZW50MyAgID0gYXJnMzsKKyAgIHdkaUhhbER1bXBDbWRJbmZvLT5hcmd1bWVudDQgICA9IGFyZzQ7CisKKyAgIHdkaUhBTER1bXBDbWRSZXFQYXJhbS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMIDsKKworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwVm9zQ29udGV4dC0+cFdEQUNvbnRleHQ7CisgICAKKyAgIC8qICBSZXNwb25zZSBtZXNzYWdlIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdGhlIGJ1ZmZlciAqLworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSAodm9pZCAqKXBCdWZmZXI7CisgICAKKyAgIC8qIHN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSAodm9pZCAqKXdkaUhBTER1bXBDbWRSZXFQYXJhbSA7CisKKyAgIC8qIFNlbmQgY29tbWFuZCB0byBXREkgKi8KKyAgIHN0YXR1cyA9IFdESV9IQUxEdW1wQ21kUmVxKHdkaUhBTER1bXBDbWRSZXFQYXJhbSwgV0RBX0hBTER1bXBDbWRDYWxsYmFjaywgcFdkYVBhcmFtcyk7CisKKyAgIHZTdGF0dXMgPSB2b3Nfd2FpdF9zaW5nbGVfZXZlbnQoICYocFZvc0NvbnRleHQtPndkYUNvbXBsZXRlRXZlbnQpLCAxMDAwICk7CisKKyAgIGlmICggdlN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MgKQorICAgeworICAgICAgaWYgKCB2U3RhdHVzID09IFZPU19TVEFUVVNfRV9USU1FT1VUICkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IFRpbWVvdXQgb2NjdXJlZCBiZWZvcmUgV0RBX0hBTERVTVAgY29tcGxldGVcbiIsX19GVU5DVElPTl9fKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9WT1NTLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAiJXM6IFdEQV9IQUxEVU1QIHJlcG9ydGluZyAgb3RoZXIgZXJyb3IgXG4iLF9fRlVOQ1RJT05fXyk7CisgICAgICB9CisgICAgICBWT1NfQVNTRVJUKDApOworICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc0dUS09mZmxvYWRnZXRJbmZvUmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byBnZXQgR1RLIE9mZmxvYWQgSW5mb3JtYXRpb24KKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NHVEtPZmZsb2FkR2V0SW5mb1JlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBTaXJHdGtPZmZsb2FkR2V0SW5mb1JzcFBhcmFtcyBwR3RrT2ZmbG9hZEdldEluZm9Sc3ApCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIFdESV9HdGtPZmZsb2FkR2V0SW5mb1JlcU1zZyAqcHdkaUd0a09mZmxvYWRHZXRJbmZvUmVxTXNnID0gCisgICAgICAoV0RJX0d0a09mZmxvYWRHZXRJbmZvUmVxTXNnICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKFdESV9HdGtPZmZsb2FkR2V0SW5mb1JlcU1zZykpOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBpZihOVUxMID09IHB3ZGlHdGtPZmZsb2FkR2V0SW5mb1JlcU1zZykgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZShwd2RpR3RrT2ZmbG9hZEdldEluZm9SZXFNc2cpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgcHdkaUd0a09mZmxvYWRHZXRJbmZvUmVxTXNnLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIFZPU19BU1NFUlQoKE5VTEwgPT0gcFdEQS0+d2RhTXNnUGFyYW0pICYmIAorICAgICAgICAgICAgICAoTlVMTCA9PSBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkpOworCisgICAvKiBTdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKilwd2RpR3RrT2ZmbG9hZEdldEluZm9SZXFNc2c7CisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICAvKiBTdG9yZSBwYXJhbSBwb2ludGVyIGFzIHBhc3NlZCBpbiBieSBjYWxsZXIgKi8KKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcEd0a09mZmxvYWRHZXRJbmZvUnNwOworCisgICBzdGF0dXMgPSBXRElfR1RLT2ZmbG9hZEdldEluZm9SZXEocHdkaUd0a09mZmxvYWRHZXRJbmZvUmVxTXNnLCAoV0RJX0d0a09mZmxvYWRHZXRJbmZvQ2IpV0RBX0d0a09mZmxvYWRHZXRJbmZvQ2FsbGJhY2ssIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIC8qIGZhaWx1cmUgcmV0dXJuZWQgYnkgV0RJIEFQSSAqLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBXREFfUHJvY2Vzc0dUS09mZmxvYWRHZXRJbmZvUmVxKCksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICAgICBwR3RrT2ZmbG9hZEdldEluZm9Sc3AtPnVsU3RhdHVzID0gZVNJUl9GQUlMVVJFIDsKKyAgICAgIFdEQV9TZW5kTXNnKHBXREEsIFdEQV9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JTUCwgKHZvaWQgKilwR3RrT2ZmbG9hZEdldEluZm9Sc3AsIDApIDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEQVRBIGludGVyZmFjZSB3aXRoIFdESSBmb3IgTWdtdCBGcmFtZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKi8KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfVHhDb21wbGV0ZQorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBXREFfVHhQYWNrZXQKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1R4Q29tcGxldGUoIHZfUFZPSURfdCBwVm9zQ29udGV4dCwgdm9zX3BrdF90ICpwRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTIHN0YXR1cyApCit7CisgICAKKyAgIHRXREFfQ2JDb250ZXh0ICp3ZGFDb250ZXh0PSAodFdEQV9DYkNvbnRleHQgKilWT1NfR0VUX1dEQV9DVFhUKHBWb3NDb250ZXh0KTsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwpVk9TX0dFVF9NQUNfQ1RYVCgodm9pZCAqKXBWb3NDb250ZXh0KSA7CisKKyAgIGlmKE5VTEwgPT0gd2RhQ29udGV4dCkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczpwV0RBIGlzIE5VTEwiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgLypjaGVjayB3aGV0aGVyIHRoZSBjYWxsYmFjayBpcyBudWxsIG9yIG5vdCxtYWRlIG51bGwgZHVyaW5nIFdEQV9UTF9UWF9GUkFNRV9USU1FT1VUIHRpbWVvdXQqLworICAgaWYoIE5VTEwhPXdkYUNvbnRleHQtPnBUeENiRnVuYykgCisgICB7CisgICAgICAvKmNoZWNrIGlmIHBhY2tldCBpcyBmcmVlZCBhbHJlYWR5Ki8KKyAgICAgIGlmKHZvc19hdG9taWNfc2V0X1UzMigmd2RhQ29udGV4dC0+Vm9zUGFja2V0VG9GcmVlLCAodl9VMzJfdClXREFfVFhfUEFDS0VUX0ZSRUVEKSA9PSAodl9VMzJfdClwRGF0YSkKKyAgICAgIHsKKyAgICAgICAgIHdkYUNvbnRleHQtPnBUeENiRnVuYyhwTWFjLCBwRGF0YSk7IAorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6cGFja2V0ICgweCVYKSBpcyBhbHJlYWR5IGZyZWVkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBEYXRhKTsKKyAgICAgICAgIC8vUmV0dXJuIGZyb20gaGVyZSBzaW5jZSB3ZSByZWFjaGluZyBoZXJlIGJlY2F1c2UgdGhlIHBhY2tldCBhbHJlYWR5IHRpbWVvdXQKKyAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICB9CisKKyAgIH0KKworICAgLyogCisgICAgKiBUcmlnZ2VyIHRoZSBldmVudCB0byBicmluZyB0aGUgSEFMIFRMIFR4IGNvbXBsZXRlIGZ1bmN0aW9uIHRvIGNvbWUgCisgICAgKiBvdXQgb2Ygd2FpdCAKKyAgICAqIExldCB0aGUgY29lIGFib3ZlIHRvIGNvbXBsZXRlIHRoZSBwYWNrZXQgZmlyc3QuIFdoZW4gdGhpcyBldmVudCBpcyBzZXQsCisgICAgKiB0aGUgdGhyZWFkIHdhaXRpbmcgZm9yIHRoZSBldmVudCBtYXkgcnVuIGFuZCBzZXQgVm9zcGFja2V0X2ZyZWVkIGNhdXNpbmcgdGhlIG9yaWdpbmFsCisgICAgKiBwYWNrZXQgbm90IGJlaW5nIGZyZWVkLgorICAgICovCisgICBzdGF0dXMgID0gdm9zX2V2ZW50X3NldCgmd2RhQ29udGV4dC0+dHhGcmFtZUV2ZW50KTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICAgIk5FVyBWT1MgRXZlbnQgU2V0IGZhaWxlZCAtIHN0YXR1cyA9ICVkIFxuIiwgc3RhdHVzKTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfVHhQYWNrZXQKKyAqIEZvcndhcmQgVFggbWFuYWdlbWVudCBmcmFtZSB0byBXREkKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1R4UGFja2V0KHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBGcm1CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0QU5JX1UxNiBmcm1MZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlRnJhbWVUeXBlIGZybVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlRnJhbWVUeERpciB0eERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTggdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdEQVR4UnhDb21wRnVuYyBwQ29tcEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXREFBY2tGblR4Q29tcCBwQWNrVHhDb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VOCB0eEZsYWcpCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUyA7CisgICB0cFNpck1hY0ZyYW1lQ3RsIHBGYyA9ICh0cFNpck1hY0ZyYW1lQ3RsICkgcERhdGE7CisgICB0QU5JX1U4IHVjVHlwZVN1YlR5cGUgPSBwRmMtPnR5cGUgPDw0IHwgcEZjLT5zdWJUeXBlOworICAgdEFOSV9VOCBldmVudElkeCA9IDA7CisgICB0QnNzU3lzdGVtUm9sZSBzeXN0ZW1Sb2xlID0gZVNZU1RFTV9VTktOT1dOX1JPTEU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjOworCisgICBpZigoTlVMTCA9PSBwV0RBKXx8KE5VTEwgPT0gcEZybUJ1ZikpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOnBXREEgJXggb3IgcEZybUJ1ZiAleCBpcyBOVUxMIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18scFdEQSxwRnJtQnVmKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILCAKKyAgICAgICAgICAgICAgICJUeCBNZ210IEZyYW1lIFN1YnR5cGU6ICVkIGFsbG9jKCV4KVxuIiwgcEZjLT5zdWJUeXBlLCBwRnJtQnVmKTsKKworICAgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCApVk9TX0dFVF9NQUNfQ1RYVChwV0RBLT5wVm9zQ29udGV4dCk7CisgICBpZihOVUxMID09IHBNYWMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6cE1hYyBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgCisgICAKKyAgIAorICAgLyogc3RvcmUgdGhlIGNhbGwgYmFjayBmdW5jdGlvbiBpbiBXREEgY29udGV4dCAqLworICAgcFdEQS0+cFR4Q2JGdW5jID0gcENvbXBGdW5jOworICAgLyogc3RvcmUgdGhlIGNhbGwgYmFjayBmb3IgdGhlIGZ1bmN0aW9uIG9mIGFja1R4Q29tcGxldGUgKi8KKyAgIGlmKCBwQWNrVHhDb21wICkKKyAgIHsKKyAgICAgIGlmKCBOVUxMID09IHBXREEtPnBBY2tUeENiRnVuYyApCisgICAgICB7CisgICAgICAgICB0eEZsYWcgfD0gSEFMX1RYQ09NUF9SRVFVRVNURURfTUFTSzsKKyAgICAgICAgIHBXREEtPnBBY2tUeENiRnVuYyA9IHBBY2tUeENvbXA7CisgICAgICAgICBpZiggVk9TX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAgICAgICAgICAgIFdEQV9TVEFSVF9USU1FUigmcFdEQS0+d2RhVGltZXJzLlR4Q29tcGxldGVUaW1lcikgKSAKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHggQ29tcGxldGUgVGltZXIgU3RhcnQgRmFpbGVkICIpOworICAgICAgICAgICAgcFdEQS0+cEFja1R4Q2JGdW5jID0gTlVMTDsKKyAgICAgICAgICAgIHBDb21wRnVuYyhWT1NfR0VUX01BQ19DVFhUKHBXREEtPnBWb3NDb250ZXh0KSwgKHZvc19wa3RfdCAqKXBGcm1CdWYpOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLyogQWxyZWFkeSBUeENvbXAgaXMgYWN0aXZlIG5vIG5lZWQgdG8gYWN0aXZlIGFnYWluICovCisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgaXMgYWxyZWFkeSBvbmUgcmVxdWVzdCBwZW5kaW5nIGZvciB0eCBjb21wbGV0ZVxuIik7CisgICAgICAgICBwQ29tcEZ1bmMocFdEQS0+cFZvc0NvbnRleHQsICh2b3NfcGt0X3QgKilwRnJtQnVmKTsKKyAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIH0KKyAgIH0gCisKKyAgIC8qIFJlc2V0IHRoZSBldmVudCB0byBiZSBub3Qgc2lnbmFsbGVkICovCisgICBzdGF0dXMgPSB2b3NfZXZlbnRfcmVzZXQoJnBXREEtPnR4RnJhbWVFdmVudCk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWT1MgRXZlbnQgcmVzZXQgZmFpbGVkIC0gc3RhdHVzID0gJWRcbiIsc3RhdHVzKTsKKyAgICAgIHBDb21wRnVuYyhwV0RBLT5wVm9zQ29udGV4dCwgKHZvc19wa3RfdCAqKXBGcm1CdWYpOworICAgICAgaWYoIHBBY2tUeENvbXAgKQorICAgICAgeworICAgICAgICAgcFdEQS0+cEFja1R4Q2JGdW5jID0gTlVMTDsKKyAgICAgICAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEQV9TVE9QX1RJTUVSKCZwV0RBLT53ZGFUaW1lcnMuVHhDb21wbGV0ZVRpbWVyKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR4IENvbXBsZXRlIHRpbWVvdXQgVGltZXIgU3RvcCBGYWlsZWQgIik7CisgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIEdldCBzeXN0ZW0gcm9sZSwgdXNlIHRoZSBzZWxmIHN0YXRpb24gaWYgaW4gdW5rbm93biByb2xlIG9yIFNUQSByb2xlICovCisgICBzeXN0ZW1Sb2xlID0gd2RhR2V0R2xvYmFsU3lzdGVtUm9sZShwTWFjKTsKKworICAgaWYgKCggZVNZU1RFTV9VTktOT1dOX1JPTEUgPT0gc3lzdGVtUm9sZSApIHx8IAorICAgICAgICgoIGVTWVNURU1fU1RBX1JPTEUgPT0gc3lzdGVtUm9sZSApCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgJiYgZnJtVHlwZSA9PSBIQUxfVFhSWF9GUk1fODAyXzExX01HTVQKKyNlbmRpZgorICAgICAgICAgICAgKSkKKyAgIHsKKyAgICAgICB0eEZsYWcgfD0gSEFMX1VTRV9TRUxGX1NUQV9SRVFVRVNURURfTUFTSzsKKyAgIH0KKworICAgLyogRG8gbm90IGRpdmVydCBEaXNhc3NvYy9EZWF1dGggZnJhbWVzIHRocm91Z2ggc2VsZiBzdGF0aW9uIGJlY2F1c2UgYSBkZWxheSBvZgorICAgICogMzAwbXMgaXMgYWRkZWQgYmVvZnJlIHRyaWdlcnJpbmcgREVMIFNUQSBzbyBsZXQgZGV1YXRoIGdldHMgZGVsaXZlcmVkIGF0IFRJTSAqLworICAgaWYgKChwRmMtPnR5cGUgPT0gU0lSX01BQ19NR01UX0ZSQU1FKSkgCisgICB7CisgICAgICAgaWYgKChwRmMtPnN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0RJU0FTU09DKSB8fCAKKyAgICAgICAgICAgICAgIChwRmMtPnN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0RFQVVUSCkgfHwgCisgICAgICAgICAgICAgICAocEZjLT5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9SRUFTU09DX1JTUCkgfHwgCisgICAgICAgICAgICAgICAocEZjLT5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SRVEpKSAKKyAgICAgICB7CisgICAgICAgICAgIGlmKCAoc3lzdGVtUm9sZSA9PSBlU1lTVEVNX0FQX1JPTEUpICYmICggKHBGYy0+c3ViVHlwZSA9PSBTSVJfTUFDX01HTVRfREVBVVRIKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRmMtPnN1YlR5cGUgPT0gU0lSX01BQ19NR01UX0RJU0FTU09DKSApICkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAvKkRvIG5vdCByZXF1ZXN0IHNlbGYgU1RBIGZvciBkZWF1dGgvZGlzYXNzb2MgbGV0IGl0IGdvIHRocm91Z2ggcGVlciBTVEEgYW5kCisgICAgICAgICAgICAgICAqYnJvYWRjYXN0IFNUQSBhbmQgZ2V0IGRlbGl2ZXJlZCBhdCBUSU0gZm9yIHBvd2VyIHNhdmUgc3RhdGlvbnMqLworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgIC8qU2VuZCBQcm9iZSByZXF1ZXN0IGZyYW1lcyBvbiBzZWxmIHN0YSBpZHgqLworICAgICAgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX1NFTEZfU1RBX1JFUVVFU1RFRF9NQVNLOworICAgICAgICAgICB9CisgICAgICAgfSAKKyAgICAgICAvKiBTaW5jZSB3ZSBkb25vdCB3YW50IHByb2JlIHJlc3BvbnNlcyB0byBiZSByZXRyaWVkLCBzZW5kIHByb2JlIHJlc3BvbnNlcworICAgICAgICAgIHRocm91Z2ggdGhlIE5PX0FDSyBxdWV1ZXMgKi8KKyAgICAgICBpZiAocEZjLT5zdWJUeXBlID09IFNJUl9NQUNfTUdNVF9QUk9CRV9SU1ApIAorICAgICAgIHsKKyAgICAgICAgICAgLy9wcm9iZSByZXNwb25zZSBpcyBzZW50IG91dCB1c2luZyBzZWxmIHN0YXRpb24gYW5kIG5vIHJldHJpZXMgb3B0aW9ucy4KKyAgICAgICAgICAgdHhGbGFnIHw9IChIQUxfVVNFX05PX0FDS19SRVFVRVNURURfTUFTSyB8IEhBTF9VU0VfU0VMRl9TVEFfUkVRVUVTVEVEX01BU0spOworICAgICAgIH0KKyAgICAgICBpZihWT1NfVFJVRSA9PSBwV0RBLT53ZGFBbXBTZXNzaW9uT24pCisgICAgICAgeworICAgICAgICAgIHR4RmxhZyB8PSBIQUxfVVNFX0JEX1JBVEUyX0ZPUl9NQU5BR0VNRU5UX0ZSQU1FOworICAgICAgIH0KKyAgIH0KKyAgIAorICAgdm9zX2F0b21pY19zZXRfVTMyKCZwV0RBLT5Wb3NQYWNrZXRUb0ZyZWUsICh2X1UzMl90KXBGcm1CdWYpOy8qc2V0IFZvc1BhY2tldF9mcmVlZCB0byBwRnJtQnVmKi8KKworICAgLypTZXQgZnJhbWUgdGFnIHRvIDAgCisgICAgIFdlIHdpbGwgdXNlIHRoZSBXREEgdXNlciBkYXRhIGluIG9yZGVyIHRvIHRhZyBhIGZyYW1lIGFzIGV4cGlyZWQqLworICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggKHZvc19wa3RfdCAqKXBGcm1CdWYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1dEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpMCk7CisgICAKKworICAgaWYoKHN0YXR1cyA9IFdMQU5UTF9UeE1nbXRGcm0ocFdEQS0+cFZvc0NvbnRleHQsICh2b3NfcGt0X3QgKilwRnJtQnVmLCAKKyAgICAgICAgICAgICAgICAgICAgIGZybUxlbiwgdWNUeXBlU3ViVHlwZSwgdGlkLCAKKyAgICAgICAgICAgICAgICAgICAgIFdEQV9UeENvbXBsZXRlLCBOVUxMLCB0eEZsYWcpKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIlNlbmRpbmcgTWdtdCBGcmFtZSBmYWlsZWQgLSBzdGF0dXMgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgIHBDb21wRnVuYyhWT1NfR0VUX01BQ19DVFhUKHBXREEtPnBWb3NDb250ZXh0KSwgKHZvc19wa3RfdCAqKXBGcm1CdWYpOworICAgICAgdm9zX2F0b21pY19zZXRfVTMyKCZwV0RBLT5Wb3NQYWNrZXRUb0ZyZWUsICh2X1UzMl90KVdEQV9UWF9QQUNLRVRfRlJFRUQpOy8qcmVzZXQgdGhlIFZvc1BhY2tldF9mcmVlZCovCisgICAgICBpZiggcEFja1R4Q29tcCApCisgICAgICB7CisgICAgICAgICBwV0RBLT5wQWNrVHhDYkZ1bmMgPSBOVUxMOworICAgICAgICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RBX1NUT1BfVElNRVIoJnBXREEtPndkYVRpbWVycy5UeENvbXBsZXRlVGltZXIpKQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHggQ29tcGxldGUgdGltZW91dCBUaW1lciBTdG9wIEZhaWxlZCAiKTsKKyAgICAgICAgIH0KKyAgICAgIH0gCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIAorICAgICogV2FpdCBmb3IgdGhlIGV2ZW50IHRvIGJlIHNldCBieSB0aGUgVEwsIHRvIGdldCB0aGUgcmVzcG9uc2Ugb2YgVFggCisgICAgKiBjb21wbGV0ZSwgdGhpcyBldmVudCBzaG91bGQgYmUgc2V0IGJ5IHRoZSBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgYnkgVEwgCisgICAgKi8KKyAgIHN0YXR1cyA9IHZvc193YWl0X2V2ZW50cygmcFdEQS0+dHhGcmFtZUV2ZW50LCAxLCBXREFfVExfVFhfRlJBTUVfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRJZHgpOworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgIiVzOiBTdGF0dXMgJWQgd2hlbiB3YWl0aW5nIGZvciBUWCBGcmFtZSBFdmVudCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKworICAgICAgcFdEQS0+cFR4Q2JGdW5jID0gTlVMTDsgICAvKlRvIHN0b3AgdGhlIGxpbVR4Q29tcGxldGUgYmVpbmcgY2FsbGVkIGFnYWluICAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciB0aGUgcGFja2V0IGdldHMgY29tcGxldGVkKHBhY2tldCBmcmVlZCBvbmNlKSovCisKKyAgICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIHBhY2tldCB3YXMgZnJlZWQgYWxyZWFkeSxzbyBuZWVkIG5vdCBmcmVlIGFnYWluIHdoZW4gCisgICAgICAqIFRMIGNhbGxzIHRoZSBXREFfVHhjb21wbGV0ZSByb3V0aW5lCisgICAgICAqLworICAgICAgaWYodm9zX2F0b21pY19zZXRfVTMyKCZwV0RBLT5Wb3NQYWNrZXRUb0ZyZWUsICh2X1UzMl90KVdEQV9UWF9QQUNLRVRfRlJFRUQpID09ICh2X1UzMl90KXBGcm1CdWYpIAorICAgICAgeworICAgICAgICAgcENvbXBGdW5jKFZPU19HRVRfTUFDX0NUWFQocFdEQS0+cFZvc0NvbnRleHQpLCAodm9zX3BrdF90ICopcEZybUJ1Zik7CisgICAgICB9CisgICAgICBpZiggcEFja1R4Q29tcCApCisgICAgICB7CisgICAgICAgICBwV0RBLT5wQWNrVHhDYkZ1bmMgPSBOVUxMOworICAgICAgICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RBX1NUT1BfVElNRVIoJnBXREEtPndkYVRpbWVycy5UeENvbXBsZXRlVGltZXIpKQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHggQ29tcGxldGUgdGltZW91dCBUaW1lciBTdG9wIEZhaWxlZCAiKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBGVU5DVElPTjogV0RBX01jUHJvY2Vzc01zZworICogVHJpZ2dlciBEQUwtQUwgdG8gc3RhcnQgQ0ZHIGRvd25sb2FkIAorICovIAorVk9TX1NUQVRVUyBXREFfTWNQcm9jZXNzTXNnKCB2X0NPTlRFWFRfdCBwVm9zQ29udGV4dCwgdm9zX21zZ190ICpwTXNnICkKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgdFdEQV9DYkNvbnRleHQgKnBXREEgPSBOVUxMIDsgCisKKyAgIGlmKE5VTEwgPT0gcE1zZykgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6cE1zZyBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgICAgICAgICI9PT09PT09PT0+ICVzIG1zZ1R5cGU6ICV4ICIgLF9fRlVOQ1RJT05fXywgcE1zZy0+dHlwZSk7CisgICAKKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKil2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfV0RBLCBwVm9zQ29udGV4dCApOworICAgaWYoTlVMTCA9PSBwV0RBICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczpwV0RBIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIFByb2Nlc3MgYWxsIHRoZSBXREEgbWVzc2FnZXMuLiAqLworICAgc3dpdGNoKCBwTXNnLT50eXBlICkKKyAgIHsKKyAgICAgIGNhc2UgV05JX0NGR19ETkxEX1JFUToKKyAgICAgIHsKKyAgICAgICAgIHN0YXR1cyA9IFdEQV9XbmlDZmdEbmxkKHBXREEpOworCisgICAgICAgICAvKiBjYWxsIFdEQSBjb21wbGV0ZSBldmVudCBpZiBjb25maWcgZG93bmxvYWQgc3VjY2VzcyAqLworICAgICAgICAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19XREFDb21wbGV0ZV9jYmFjayhwVm9zQ29udGV4dCk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldEQSBDb25maWcgRG93bmxvYWQgZmFpbHVyZSIgKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrIDsKKyAgICAgIH0KKworICAgICAgLyogCisgICAgICAgKiBJbml0IFNDQU4gcmVxdWVzdCBmcm9tIFBFLCBjb252ZXJ0IGl0IGludG8gREFMIGZvcm1hdCAKKyAgICAgICAqIGFuZCBzZW5kIGl0IHRvIERBTCAKKyAgICAgICAqLyAKKyAgICAgIGNhc2UgV0RBX0lOSVRfU0NBTl9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc0luaXRTY2FuUmVxKHBXREEsICh0SW5pdFNjYW5QYXJhbXMgKilwTXNnLT5ib2R5cHRyKSA7CisgICAgICAgICBicmVhayA7ICAgIAorICAgICAgfQorICAgICAgLyogc3RhcnQgU0NBTiByZXF1ZXN0IGZyb20gUEUgKi8KKyAgICAgIGNhc2UgV0RBX1NUQVJUX1NDQU5fUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NTdGFydFNjYW5SZXEocFdEQSwgKHRTdGFydFNjYW5QYXJhbXMgKilwTXNnLT5ib2R5cHRyKSA7CisgICAgICAgICBicmVhayA7ICAgIAorICAgICAgfQorICAgICAgLyogZW5kIFNDQU4gcmVxdWVzdCBmcm9tIFBFICovCisgICAgICBjYXNlIFdEQV9FTkRfU0NBTl9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc0VuZFNjYW5SZXEocFdEQSwgKHRFbmRTY2FuUGFyYW1zICopcE1zZy0+Ym9keXB0cikgOworICAgICAgICAgYnJlYWsgOworICAgICAgfQorICAgICAgLyogZW5kIFNDQU4gcmVxdWVzdCBmcm9tIFBFICovCisgICAgICBjYXNlIFdEQV9GSU5JU0hfU0NBTl9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc0ZpbmlzaFNjYW5SZXEocFdEQSwgKHRGaW5pc2hTY2FuUGFyYW1zICopcE1zZy0+Ym9keXB0cikgOworICAgICAgICAgYnJlYWsgOyAgICAKKyAgICAgIH0KKyAgICAgIC8qIGpvaW4gcmVxdWVzdCBmcm9tIFBFICovCisgICAgICBjYXNlIFdEQV9DSE5MX1NXSVRDSF9SRVE6CisgICAgICB7CisgICAgICAgICBpZihXREFfUFJFX0FTU09DX1NUQVRFID09IHBXREEtPndkYVN0YXRlKQorICAgICAgICAgeworICAgICAgICAgICAgV0RBX1Byb2Nlc3NKb2luUmVxKHBXREEsICh0U3dpdGNoQ2hhbm5lbFBhcmFtcyAqKXBNc2ctPmJvZHlwdHIpIDsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFdEQV9Qcm9jZXNzQ2hhbm5lbFN3aXRjaFJlcShwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0U3dpdGNoQ2hhbm5lbFBhcmFtcyopcE1zZy0+Ym9keXB0cikgOworICAgICAgICAgfQorICAgICAgICAgYnJlYWsgOworICAgICAgfQorICAgICAgLyogQUREIEJTUyByZXF1ZXN0IGZyb20gUEUgKi8KKyAgICAgIGNhc2UgV0RBX0FERF9CU1NfUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NDb25maWdCc3NSZXEocFdEQSwgKHRBZGRCc3NQYXJhbXMqKXBNc2ctPmJvZHlwdHIpIDsKKyAgICAgICAgIGJyZWFrIDsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX0FERF9TVEFfUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NBZGRTdGFSZXEocFdEQSwgKHRBZGRTdGFQYXJhbXMgKilwTXNnLT5ib2R5cHRyKSA7CisgICAgICAgICBicmVhayA7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9ERUxFVEVfQlNTX1JFUToKKyAgICAgIHsKKyAgICAgICAgIHdwdF91aW50OCAgc3RhSWR4OworICAgICAgICAgd3B0X3VpbnQ4ICBic3NJZHggPSAoKHREZWxldGVCc3NQYXJhbXMgKilwTXNnLT5ib2R5cHRyKS0+YnNzSWR4OworICAgICAgICAgd3B0X3VpbnQ4ICByZXNlcnZlZFJlc291cmNlQnlTdGE7CisgICAgICAgICB3cHRfdWludDggIHdhaXRMb29wID0gMDsKKworICAgICAgICAgaWYgKFdESV9EU19HZXRTdGFJZHhGcm9tQnNzSWR4KHBXREEtPnBXZGlDb250ZXh0LCBic3NJZHgsICZzdGFJZHgpKQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEdldCBTVEEgaW5kZXggZnJvbSBCU1MgaW5kZXggRmFpbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgICAgIH0KKyAgICAgICAgIHdoaWxlICgxKSAKKyAgICAgICAgIHsKKyAgICAgICAgICAgICByZXNlcnZlZFJlc291cmNlQnlTdGEgPSBXRElfRFNfR2V0UmVzZXJ2ZWRSZXNDb3VudFBlclNUQShwV0RBLT5wV2RpQ29udGV4dCwgV0RJX0RBVEFfUE9PTF9JRCwgc3RhSWR4KTsKKyAgICAgICAgICAgICAvKiBXYWl0IHRpbGwgcmVzZXJ2ZWQgcmVzb3VyY2UgYnkgU1RBIG11c3QgYmUgbm9uZSAqLworICAgICAgICAgICAgIGlmIChyZXNlcnZlZFJlc291cmNlQnlTdGEgPT0gMCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVEEgJWQgQlNTICVkIFRYIFJJTkcgZW1wdHkgJWQiLCBzdGFJZHgsIGJzc0lkeCApOworICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBpZih3YWl0TG9vcCA+IFdEQV9NQVhfUkVUUklFU19USUxMX1JJTkdfRU1QVFkpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRYIFJpbmcgY291bGQgbm90IGVtcHR5LCBub3Qgbm9ybWFsIiApOworICAgICAgICAgICAgICAgICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIHZvc19zbGVlcChXREFfV0FJVF9NU0VDX1RJTExfUklOR19FTVBUWSk7CisgICAgICAgICAgICAgICAgIHdhaXRMb29wKys7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgV0RBX1Byb2Nlc3NEZWxCc3NSZXEocFdEQSwgKHREZWxldGVCc3NQYXJhbXMgKilwTXNnLT5ib2R5cHRyKSA7CisgICAgICAgICBicmVhayA7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9ERUxFVEVfU1RBX1JFUToKKyAgICAgIHsKKyAgICAgICAgIHREZWxldGVTdGFQYXJhbXMgKmRlbFN0YSA9ICh0RGVsZXRlU3RhUGFyYW1zICopcE1zZy0+Ym9keXB0cjsKKyAgICAgICAgIHdwdF91aW50OCByZXNlcnZlZFJlc291cmNlQnlTdGE7CisgICAgICAgICB3cHRfdWludDggIHdhaXRMb29wID0gMDsKKworICAgICAgICAgd2hpbGUgKDEpIAorICAgICAgICAgeworICAgICAgICAgICAgIHJlc2VydmVkUmVzb3VyY2VCeVN0YSA9IFdESV9EU19HZXRSZXNlcnZlZFJlc0NvdW50UGVyU1RBKHBXREEtPnBXZGlDb250ZXh0LCBXRElfREFUQV9QT09MX0lELCBkZWxTdGEtPnN0YUlkeCk7CisgICAgICAgICAgICAgLyogV2FpdCB0aWxsIHJlc2VydmVkIHJlc291cmNlIGJ5IFNUQSBtdXN0IGJlIG5vbmUgKi8KKyAgICAgICAgICAgICBpZiAocmVzZXJ2ZWRSZXNvdXJjZUJ5U3RhID09IDApCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RBICVkIFRYIFJJTkcgZW1wdHkgJWQiLCBkZWxTdGEtPnN0YUlkeCApOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaWYod2FpdExvb3AgPiBXREFfTUFYX1JFVFJJRVNfVElMTF9SSU5HX0VNUFRZKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWCBSaW5nIGNvdWxkIG5vdCBlbXB0eSwgbm90IG5vcm1hbCIgKTsKKyAgICAgICAgICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB2b3Nfc2xlZXAoV0RBX1dBSVRfTVNFQ19USUxMX1JJTkdfRU1QVFkpOworICAgICAgICAgICAgICAgICB3YWl0TG9vcCsrOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIFdEQV9Qcm9jZXNzRGVsU3RhUmVxKHBXREEsICh0RGVsZXRlU3RhUGFyYW1zICopcE1zZy0+Ym9keXB0cikgOworICAgICAgICAgYnJlYWsgOworICAgICAgfQorICAgICAgY2FzZSBXREFfQ09ORklHX1BBUkFNX1VQREFURV9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfVXBkYXRlQ2ZnKHBXREEsICh0U2lyTXNnUSAqKXBNc2cpIDsKKyAgICAgICAgIGJyZWFrIDsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1NFVF9CU1NLRVlfUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NTZXRCc3NLZXlSZXEocFdEQSwgKHRTZXRCc3NLZXlQYXJhbXMgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrIDsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1NFVF9TVEFLRVlfUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NTZXRTdGFLZXlSZXEocFdEQSwgKHRTZXRTdGFLZXlQYXJhbXMgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrIDsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1NFVF9TVEFfQkNBU1RLRVlfUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NTZXRCY2FzdFN0YUtleVJlcShwV0RBLCAodFNldFN0YUtleVBhcmFtcyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWsgOworICAgICAgfQorICAgICAgY2FzZSBXREFfUkVNT1ZFX0JTU0tFWV9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1JlbW92ZUJzc0tleVJlcShwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0UmVtb3ZlQnNzS2V5UGFyYW1zICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhayA7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9SRU1PVkVfU1RBS0VZX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzUmVtb3ZlU3RhS2V5UmVxKHBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRSZW1vdmVTdGFLZXlQYXJhbXMgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrIDsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1JFTU9WRV9TVEFfQkNBU1RLRVlfUkVROgorICAgICAgeworICAgICAgICAgLyogVE9ETzogY3VycmVudGx5IFVNQUMgaXMgbm90IHNlbmRpbmcgdGhpcyByZXF1ZXN0LCBBZGQgdGhlIGNvZGUgZm9yIAorICAgICAgICAgaGFuZGxpbmcgdGhpcyByZXF1ZXN0IHdoZW4gVU1BQyBzdXBwb3J0cyAqLworICAgICAgICAgYnJlYWs7CisgICAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgICAgY2FzZSBXREFfVFNNX1NUQVRTX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzVHNtU3RhdHNSZXEocFdEQSwgKHRUU01TdGF0cyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGNhc2UgV0RBX1VQREFURV9FRENBX1BST0ZJTEVfSU5EOgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NVcGRhdGVFRENBUGFyYW1SZXEocFdEQSwgKHRFZGNhUGFyYW1zICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX0FERF9UU19SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc0FkZFRTUmVxKHBXREEsICh0QWRkVHNQYXJhbXMgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBXREFfREVMX1RTX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzRGVsVFNSZXEocFdEQSwgKHREZWxUc1BhcmFtcyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9BRERCQV9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc0FkZEJBU2Vzc2lvblJlcShwV0RBLCAodEFkZEJBUGFyYW1zICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX0RFTEJBX0lORDoKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzRGVsQkFSZXEocFdEQSwgKHREZWxCQVBhcmFtcyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9TRVRfTElOS19TVEFURToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzU2V0TGlua1N0YXRlKHBXREEsICh0TGlua1N0YXRlUGFyYW1zICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX0dFVF9TVEFUSVNUSUNTX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzR2V0U3RhdHNSZXEocFdEQSwgKHRBbmlHZXRQRVN0YXRzUmVxICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1BXUl9TQVZFX0NGRzoKKyAgICAgIHsKKyAgICAgICAgIGlmKHBXREEtPndkYVN0YXRlID09IFdEQV9SRUFEWV9TVEFURSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFdEQV9Qcm9jZXNzU2V0UHdyU2F2ZUNmZ1JlcShwV0RBLCAodFNpclBvd2VyU2F2ZUNmZyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgaWYoTlVMTCAhPSBwTXNnLT5ib2R5cHRyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJXREFfUFdSX1NBVkVfQ0ZHIHJlcSBpbiB3cm9uZyBzdGF0ZSAlZCIsIHBXREEtPndkYVN0YXRlICk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX0VOVEVSX0lNUFNfUkVROgorICAgICAgeworICAgICAgICAgaWYocFdEQS0+d2RhU3RhdGUgPT0gV0RBX1JFQURZX1NUQVRFKQorICAgICAgICAgeworICAgICAgICAgICAgV0RBX1Byb2Nlc3NFbnRlckltcHNSZXEocFdEQSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIldEQV9FTlRFUl9JTVBTX1JFUSByZXEgaW4gd3Jvbmcgc3RhdGUgJWQiLCBwV0RBLT53ZGFTdGF0ZSApOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9FWElUX0lNUFNfUkVROgorICAgICAgeworICAgICAgICAgaWYocFdEQS0+d2RhU3RhdGUgPT0gV0RBX1JFQURZX1NUQVRFKQorICAgICAgICAgeworICAgICAgICAgICAgV0RBX1Byb2Nlc3NFeGl0SW1wc1JlcShwV0RBKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAiV0RBX0VYSVRfSU1QU19SRVEgcmVxIGluIHdyb25nIHN0YXRlICVkIiwgcFdEQS0+d2RhU3RhdGUgKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBXREFfRU5URVJfQk1QU19SRVE6CisgICAgICB7CisgICAgICAgICBpZihwV0RBLT53ZGFTdGF0ZSA9PSBXREFfUkVBRFlfU1RBVEUpCisgICAgICAgICB7CisgICAgICAgICAgICBXREFfUHJvY2Vzc0VudGVyQm1wc1JlcShwV0RBLCAodEVudGVyQm1wc1BhcmFtcyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJXREFfRU5URVJfQk1QU19SRVEgcmVxIGluIHdyb25nIHN0YXRlICVkIiwgcFdEQS0+d2RhU3RhdGUgKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBXREFfRVhJVF9CTVBTX1JFUToKKyAgICAgIHsKKyAgICAgICAgIGlmKHBXREEtPndkYVN0YXRlID09IFdEQV9SRUFEWV9TVEFURSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFdEQV9Qcm9jZXNzRXhpdEJtcHNSZXEocFdEQSwgKHRFeGl0Qm1wc1BhcmFtcyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJXREFfRVhJVF9CTVBTX1JFUSByZXEgaW4gd3Jvbmcgc3RhdGUgJWQiLCBwV0RBLT53ZGFTdGF0ZSApOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9FTlRFUl9VQVBTRF9SRVE6CisgICAgICB7CisgICAgICAgICBpZihwV0RBLT53ZGFTdGF0ZSA9PSBXREFfUkVBRFlfU1RBVEUpCisgICAgICAgICB7CisgICAgICAgICAgICBXREFfUHJvY2Vzc0VudGVyVWFwc2RSZXEocFdEQSwgKHRVYXBzZFBhcmFtcyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJXREFfRU5URVJfVUFQU0RfUkVRIHJlcSBpbiB3cm9uZyBzdGF0ZSAlZCIsIHBXREEtPndkYVN0YXRlICk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX0VYSVRfVUFQU0RfUkVROgorICAgICAgeworICAgICAgICAgaWYocFdEQS0+d2RhU3RhdGUgPT0gV0RBX1JFQURZX1NUQVRFKQorICAgICAgICAgeworICAgICAgICAgICAgV0RBX1Byb2Nlc3NFeGl0VWFwc2RSZXEocFdEQSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIldEQV9FWElUX1VBUFNEX1JFUSByZXEgaW4gd3Jvbmcgc3RhdGUgJWQiLCBwV0RBLT53ZGFTdGF0ZSApOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9VUERBVEVfVUFQU0RfSU5EOgorICAgICAgeworICAgICAgICAgaWYocFdEQS0+d2RhU3RhdGUgPT0gV0RBX1JFQURZX1NUQVRFKQorICAgICAgICAgeworICAgICAgICAgICAgV0RBX1VwZGF0ZVVhcHNkUGFyYW1zUmVxKHBXREEsICh0VXBkYXRlVWFwc2RQYXJhbXMgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAiV0RBX1VQREFURV9VQVBTRF9JTkQgcmVxIGluIHdyb25nIHN0YXRlICVkIiwgcFdEQS0+d2RhU3RhdGUgKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFdEQV9SRUdJU1RFUl9QRV9DQUxMQkFDSyA6CisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhbmRsaW5nIG1zZyB0eXBlIFdEQV9SRUdJU1RFUl9QRV9DQUxMQkFDSyAiICk7CisgICAgICAgICAvKlRPRE86IHN0b3JlIHRoZSBQRSBjYWxsYmFjayAqLworICAgICAgICAgLyogRG8gTm90aGluZz8gTVNHIEJvZHkgc2hvdWxkIGJlIGZyZWVkIGF0IGhlcmUgKi8KKyAgICAgICAgIGlmKE5VTEwgIT0gcE1zZy0+Ym9keXB0cikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBXREFfU1lTX1JFQURZX0lORCA6CisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIYW5kbGluZyBtc2cgdHlwZSBXREFfU1lTX1JFQURZX0lORCAiICk7CisgICAgICAgICBwV0RBLT53ZGFTdGF0ZSA9IFdEQV9SRUFEWV9TVEFURTsKKyAgICAgICAgIGlmKE5VTEwgIT0gcE1zZy0+Ym9keXB0cikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBXREFfQkVBQ09OX0ZJTFRFUl9JTkQgIDoKKyAgICAgIHsKKyAgICAgICAgIFdEQV9TZXRCZWFjb25GaWx0ZXJSZXEocFdEQSwgKHRCZWFjb25GaWx0ZXJNc2cgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBXREFfQlRDX1NFVF9DRkc6CisgICAgICB7CisgICAgICAgICAvKlRPRE86IGhhbmRsZSB0aGlzIHdoaWxlIGRlYWxpbmcgd2l0aCBCVEMgKi8KKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhbmRsaW5nIG1zZyB0eXBlIFdEQV9CVENfU0VUX0NGRyAgIiApOworICAgICAgICAgLyogRG8gTm90aGluZz8gTVNHIEJvZHkgc2hvdWxkIGJlIGZyZWVkIGF0IGhlcmUgKi8KKyAgICAgICAgIGlmKE5VTEwgIT0gcE1zZy0+Ym9keXB0cikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHZvc19tZW1fZnJlZShwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBXREFfU0lHTkFMX0JUX0VWRU5UOgorICAgICAgeworICAgICAgICAgLypUT0RPOiBoYW5kbGUgdGhpcyB3aGlsZSBkZWFsaW5nIHdpdGggQlRDICovCisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIYW5kbGluZyBtc2cgdHlwZSBXREFfU0lHTkFMX0JUX0VWRU5UICAiICk7CisgICAgICAgICAvKiBEbyBOb3RoaW5nPyBNU0cgQm9keSBzaG91bGQgYmUgZnJlZWQgYXQgaGVyZSAqLworICAgICAgICAgaWYoTlVMTCAhPSBwTXNnLT5ib2R5cHRyKQorICAgICAgICAgeworICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBNc2ctPmJvZHlwdHIpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9DRkdfUlhQX0ZJTFRFUl9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc0NvbmZpZ3VyZVJ4cEZpbHRlclJlcShwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRTaXJXbGFuU2V0UnhwRmlsdGVycyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9TRVRfSE9TVF9PRkZMT0FEOgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NIb3N0T2ZmbG9hZFJlcShwV0RBLCAodFNpckhvc3RPZmZsb2FkUmVxICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1NFVF9LRUVQX0FMSVZFOgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NLZWVwQWxpdmVSZXEocFdEQSwgKHRTaXJLZWVwQWxpdmVSZXEgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorICAgICAgY2FzZSBXREFfU0VUX05TX09GRkxPQUQ6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc0hvc3RPZmZsb2FkUmVxKHBXREEsICh0U2lySG9zdE9mZmxvYWRSZXEgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmIC8vV0xBTl9OU19PRkZMT0FECisgICAgICBjYXNlIFdEQV9BRERfU1RBX1NFTEZfUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NBZGRTdGFTZWxmUmVxKHBXREEsICh0QWRkU3RhU2VsZlBhcmFtcyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgV0RBX0RFTF9TVEFfU0VMRl9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc0RlbFNUQVNlbGZSZXEocFdEQSwgKHREZWxTdGFTZWxmUGFyYW1zICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1dPV0xfQUREX0JDQVNUX1BUUk46CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1dvd2xBZGRCY1B0cm5SZXEocFdEQSwgKHRTaXJXb3dsQWRkQmNhc3RQdHJuICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1dPV0xfREVMX0JDQVNUX1BUUk46CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1dvd2xEZWxCY1B0cm5SZXEocFdEQSwgKHRTaXJXb3dsRGVsQmNhc3RQdHJuICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1dPV0xfRU5URVJfUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NXb3dsRW50ZXJSZXEocFdEQSwgKHRTaXJIYWxXb3dsRW50ZXJQYXJhbXMgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBXREFfV09XTF9FWElUX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzV293bEV4aXRSZXEocFdEQSk7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1RMX0ZMVVNIX0FDX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzRmx1c2hBY1JlcShwV0RBLCAodEZsdXNoQUNSZXEgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBXREFfU0lHTkFMX0JUQU1QX0VWRU5UOgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NCdEFtcEV2ZW50UmVxKHBXREEsICh0U21lQnRBbXBFdmVudCAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisjaWZkZWYgV0RBX1VUCisgICAgICBjYXNlIFdEQV9XRElfRVZFTlRfTVNHOgorICAgICAgeworICAgICAgICAgV0RJX3Byb2Nlc3NFdmVudChwTXNnLT5ib2R5cHRyLCh2b2lkICopcE1zZy0+Ym9keXZhbCk7CisgICAgICAgICBicmVhayA7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGNhc2UgV0RBX1VQREFURV9CRUFDT05fSU5EOgorICAgICAgeworICAgICAgICAgIFdEQV9Qcm9jZXNzVXBkYXRlQmVhY29uUGFyYW1zKHBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRVcGRhdGVCZWFjb25QYXJhbXMgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1NFTkRfQkVBQ09OX1JFUToKKyAgICAgIHsKKyAgICAgICAgICBXREFfUHJvY2Vzc1NlbmRCZWFjb24ocFdEQSwgKHRTZW5kYmVhY29uUGFyYW1zICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9VUERBVEVfUFJPQkVfUlNQX1RFTVBMQVRFX0lORDoKKyAgICAgIHsKKyAgICAgICAgICBXREFfUHJvY2Vzc1VwZGF0ZVByb2JlUnNwVGVtcGxhdGUocFdEQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0U2VuZFByb2JlUmVzcFBhcmFtcyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorI2lmIGRlZmluZWQoV0xBTl9GRUFUVVJFX1ZPV0lGSSkgfHwgZGVmaW5lZChGRUFUVVJFX1dMQU5fQ0NYKQorICAgICAgY2FzZSBXREFfU0VUX01BWF9UWF9QT1dFUl9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1NldE1heFR4UG93ZXJSZXEocFdEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0TWF4VHhQb3dlclBhcmFtcyAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgICBjYXNlIFdEQV9TRVRfUDJQX0dPX05PQV9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1NldFAyUEdPTk9BUmVxKHBXREEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodFAycFBzUGFyYW1zICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgLyogdGltZXIgcmVsYXRlZCBtZXNzYWdlcyAqLworICAgICAgY2FzZSBXREFfVElNRVJfQkFfQUNUSVZJVFlfUkVROgorICAgICAgeworICAgICAgICAgV0RBX0JhQ2hlY2tBY3Rpdml0eShwV0RBKSA7CisgICAgICAgICBicmVhayA7CisgICAgICB9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgIGNhc2UgV0RBX0FHR1JfUU9TX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzQWdnckFkZFRTUmVxKHBXREEsICh0QWdnckFkZFRzUGFyYW1zICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCisjaWZkZWYgQU5JX01BTkZfRElBRworICAgICAgY2FzZSBXREFfRlRNX0NNRF9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc0ZUTUNvbW1hbmQocFdEQSwgKHRQdHRNc2didWZmZXIgKilwTXNnLT5ib2R5cHRyKSA7CisgICAgICAgICBicmVhayA7CisgICAgICB9CisjZW5kaWYgLyogQU5JX01BTkZfRElBRyAqLworCisKKyAgICAgIC8qIFR4IENvbXBsZXRlIFRpbWUgb3V0IEluZGljYXRpb24gKi8KKyAgICAgIGNhc2UgV0RBX1RYX0NPTVBMRVRFX1RJTUVPVVRfSU5EOgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NUeENvbXBsZXRlVGltZU91dEluZChwV0RBKTsgCisgICAgICAgICBicmVhazsKKyAgICAgIH0gICAgICAgICAKKyAgICAgIGNhc2UgV0RBX1dMQU5fU1VTUEVORF9JTkQ6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1dsYW5TdXNwZW5kSW5kKHBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgKHRTaXJXbGFuU3VzcGVuZFBhcmFtICopcE1zZy0+Ym9keXB0cikgOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgV0RBX1dMQU5fUkVTVU1FX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzV2xhblJlc3VtZVJlcShwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICh0U2lyV2xhblJlc3VtZVBhcmFtICopcE1zZy0+Ym9keXB0cikgOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGNhc2UgV0RBX1VQREFURV9DRl9JTkQ6CisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90KilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIHBNc2ctPmJvZHlwdHIgPSBOVUxMOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisgICAgICBjYXNlIFdEQV9TRVRfUE5PX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzU2V0UHJlZk5ldHdvcmtSZXEocFdEQSwgKHRTaXJQTk9TY2FuUmVxICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1VQREFURV9TQ0FOX1BBUkFNU19SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1VwZGF0ZVNjYW5QYXJhbXMocFdEQSwgKHRTaXJVcGRhdGVTY2FuUGFyYW1zICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RBX1NFVF9SU1NJX0ZJTFRFUl9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1NldFJzc2lGaWx0ZXJSZXEocFdEQSwgKHRTaXJTZXRSU1NJRmlsdGVyUmVxICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworICAgICAgY2FzZSBXREFfU0VUX1RYX1BFUl9UUkFDS0lOR19SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1NldFR4UGVyVHJhY2tpbmdSZXEocFdEQSwgKHRTaXJUeFBlclRyYWNraW5nUGFyYW0gKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKyAgICAgIGNhc2UgV0RBXzgwMjNfTVVMVElDQVNUX0xJU1RfUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3M4MDIzTXVsdGljYXN0TGlzdFJlcShwV0RBLCAodFNpclJjdkZsdE1jQWRkckxpc3QgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFdEQV9SRUNFSVZFX0ZJTFRFUl9TRVRfRklMVEVSX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzUmVjZWl2ZUZpbHRlclNldEZpbHRlclJlcShwV0RBLCAodFNpclJjdlBrdEZpbHRlckNmZ1R5cGUgKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFdEQV9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NQYWNrZXRGaWx0ZXJNYXRjaENvdW50UmVxKHBXREEsICh0cFNpclJjdkZsdFBrdE1hdGNoUnNwKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgV0RBX1JFQ0VJVkVfRklMVEVSX0NMRUFSX0ZJTFRFUl9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlclJlcShwV0RBLCAodFNpclJjdkZsdFBrdENsZWFyUGFyYW0gKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisgIAorICAKKyAgICAgIGNhc2UgV0RBX1RSQU5TTUlTU0lPTl9DT05UUk9MX0lORDoKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzVHhDb250cm9sSW5kKHBXREEsICh0cFR4Q29udHJvbFBhcmFtcylwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFdEQV9TRVRfUE9XRVJfUEFSQU1TX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzU2V0UG93ZXJQYXJhbXNSZXEocFdEQSwgKHRTaXJTZXRQb3dlclBhcmFtc1JlcSAqKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKyAgICAgIGNhc2UgV0RBX0dUS19PRkZMT0FEX1JFUToKKyAgICAgIHsKKyAgICAgICAgIFdEQV9Qcm9jZXNzR1RLT2ZmbG9hZFJlcShwV0RBLCAodHBTaXJHdGtPZmZsb2FkUGFyYW1zKXBNc2ctPmJvZHlwdHIpOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgV0RBX0dUS19PRkZMT0FEX0dFVElORk9fUkVROgorICAgICAgeworICAgICAgICAgV0RBX1Byb2Nlc3NHVEtPZmZsb2FkR2V0SW5mb1JlcShwV0RBLCAodHBTaXJHdGtPZmZsb2FkR2V0SW5mb1JzcFBhcmFtcylwTXNnLT5ib2R5cHRyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmIC8vV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisKKyAgICAgIGNhc2UgV0RBX1NFVF9UTV9MRVZFTF9SRVE6CisgICAgICB7CisgICAgICAgICBXREFfUHJvY2Vzc1NldFRtTGV2ZWxSZXEocFdEQSwgKHRBbmlTZXRUbUxldmVsUmVxICopcE1zZy0+Ym9keXB0cik7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gSGFuZGxpbmcgZm9yIG1zZyB0eXBlICV4IGluIFdEQSAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxwTXNnLT50eXBlKTsKKyAgICAgICAgIC8qIERvIE5vdGhpbmc/IE1TRyBCb2R5IHNob3VsZCBiZSBmcmVlZCBhdCBoZXJlICovCisgICAgICAgICBpZihOVUxMICE9IHBNc2ctPmJvZHlwdHIpCisgICAgICAgICB7CisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUocE1zZy0+Ym9keXB0cik7CisgICAgICAgICB9CisgICAgICAgICAvL1dEQV9WT1NfQVNTRVJUKDApIDsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIHN0YXR1cyA7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfTG93TGV2ZWxJbmRDYWxsYmFjaworICogSU5EIEFQSSBjYWxsYmFjayBmcm9tIFdESSwgc2VuZCBJbmQgdG8gUEUKKyAqLyAKK3ZvaWQgV0RBX2xvd0xldmVsSW5kQ2FsbGJhY2soV0RJX0xvd0xldmVsSW5kVHlwZSAqd2RpTG93TGV2ZWxJbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhICkKK3sKKyAgIHRXREFfQ2JDb250ZXh0ICpwV0RBID0gKHRXREFfQ2JDb250ZXh0ICopcFVzZXJEYXRhOworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgIHRTaXJSU1NJTm90aWZpY2F0aW9uIHJzc2lOb3RpZmljYXRpb247CisjZW5kaWYKKworICAgaWYoTlVMTCA9PSBwV0RBKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOnBXREEgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiA7CisgICB9CisgICAKKyAgIHN3aXRjaCh3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvblR5cGUpCisgICB7CisgICAgICBjYXNlIFdESV9SU1NJX05PVElGSUNBVElPTl9JTkQ6CisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBXRElfSEFMX1JTU0lfTk9USUZJQ0FUSU9OX0lORCBmcm9tIFdESSAiKTsKKworI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKKyAgICAgICAgIHJzc2lOb3RpZmljYXRpb24uYlJlc2VydmVkID0gCisgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpTG93UlNTSUluZm8uYlJlc2VydmVkOworICAgICAgICAgcnNzaU5vdGlmaWNhdGlvbi5iUnNzaVRocmVzMU5lZ0Nyb3NzID0gCisgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpTG93UlNTSUluZm8uYlJzc2lUaHJlczFOZWdDcm9zczsKKyAgICAgICAgIHJzc2lOb3RpZmljYXRpb24uYlJzc2lUaHJlczFQb3NDcm9zcyA9IAorICAgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaUxvd1JTU0lJbmZvLmJSc3NpVGhyZXMxUG9zQ3Jvc3M7CisgICAgICAgICByc3NpTm90aWZpY2F0aW9uLmJSc3NpVGhyZXMyTmVnQ3Jvc3MgPSAKKyAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlMb3dSU1NJSW5mby5iUnNzaVRocmVzMk5lZ0Nyb3NzOworICAgICAgICAgcnNzaU5vdGlmaWNhdGlvbi5iUnNzaVRocmVzMlBvc0Nyb3NzID0gCisgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpTG93UlNTSUluZm8uYlJzc2lUaHJlczJQb3NDcm9zczsKKyAgICAgICAgIHJzc2lOb3RpZmljYXRpb24uYlJzc2lUaHJlczNOZWdDcm9zcyA9IAorICAgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaUxvd1JTU0lJbmZvLmJSc3NpVGhyZXMzTmVnQ3Jvc3M7CisgICAgICAgICByc3NpTm90aWZpY2F0aW9uLmJSc3NpVGhyZXMzUG9zQ3Jvc3MgPSAKKyAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlMb3dSU1NJSW5mby5iUnNzaVRocmVzM1Bvc0Nyb3NzOworCisgICAgICAgICBXTEFOVExfQk1QU1JTU0lSZWdpb25DaGFuZ2VkTm90aWZpY2F0aW9uKAorICAgICAgICAgICAgcFdEQS0+cFZvc0NvbnRleHQsCisgICAgICAgICAgICAmcnNzaU5vdGlmaWNhdGlvbik7CisjZW5kaWYKKyAgICAgICAgIGJyZWFrIDsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RJX01JU1NFRF9CRUFDT05fSU5EOgorICAgICAgeworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgV0RJX01JU1NFRF9CRUFDT05fSU5EIGZyb20gV0RJICIpOworCisgICAgICAgICAvKiBzZW5kIElORCB0byBQRSAqLworICAgICAgICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX01JU1NFRF9CRUFDT05fSU5ELCBOVUxMLCAwKSA7CisgICAgICAgICBicmVhayA7CisgICAgICB9CisgICAgICBjYXNlIFdESV9VTktOT1dOX0FERFIyX0ZSQU1FX1JYX0lORDoKKyAgICAgIHsKKyAgICAgICAgIC8qIFRPRE86IERlY29kZSBJbmQgYW5kIHNlbmQgSW5kIHRvIFBFICovCisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBXRElfVU5LTk9XTl9BRERSMl9GUkFNRV9SWF9JTkQgZnJvbSBXREkgIik7CisgICAgICAgICBicmVhayA7CisgICAgICB9CisgICAgICAgCisgICAgICBjYXNlIFdESV9NSUNfRkFJTFVSRV9JTkQ6CisgICAgICB7CisgICAgICAgICB0cFNpclNtZU1pY0ZhaWx1cmVJbmQgcE1pY0luZCA9CisgICAgICAgICAgICh0cFNpclNtZU1pY0ZhaWx1cmVJbmQpdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJTbWVNaWNGYWlsdXJlSW5kKSk7CisKKyAgICAgICAgIGlmKE5VTEwgPT0gcE1pY0luZCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBXRElfTUlDX0ZBSUxVUkVfSU5EIGZyb20gV0RJICIpOworCisgICAgICAgICBwTWljSW5kLT5tZXNzYWdlVHlwZSA9IGVXTklfU01FX01JQ19GQUlMVVJFX0lORDsKKyAgICAgICAgIHBNaWNJbmQtPmxlbmd0aCA9IHNpemVvZih0U2lyU21lTWljRmFpbHVyZUluZCk7CisgICAgICAgICB2b3NfbWVtX2NvcHkocE1pY0luZC0+YnNzSWQsCisgICAgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaU1JQ0ZhaWx1cmVJbmZvLmJzc0lkLAorICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgdm9zX21lbV9jb3B5KHBNaWNJbmQtPmluZm8uc3JjTWFjQWRkciwKKyAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpTUlDRmFpbHVyZUluZm8ubWFjU3JjQWRkciwKKyAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgIHZvc19tZW1fY29weShwTWljSW5kLT5pbmZvLnRhTWFjQWRkciwKKyAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpTUlDRmFpbHVyZUluZm8ubWFjVGFBZGRyLAorICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgdm9zX21lbV9jb3B5KHBNaWNJbmQtPmluZm8uZHN0TWFjQWRkciwKKyAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpTUlDRmFpbHVyZUluZm8ubWFjRHN0QWRkciwKKyAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgICAgICAgIHZvc19tZW1fY29weShwTWljSW5kLT5pbmZvLnJ4TWFjQWRkciwKKyAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpTUlDRmFpbHVyZUluZm8ubWFjUnhBZGRyLAorICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworICAgICAgICAgcE1pY0luZC0+aW5mby5tdWx0aWNhc3QgPSAKKyAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpTUlDRmFpbHVyZUluZm8udWNNdWx0aWNhc3Q7CisgICAgICAgICBwTWljSW5kLT5pbmZvLmtleUlkPSAKKyAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpTUlDRmFpbHVyZUluZm8ua2V5SWQ7CisgICAgICAgICBwTWljSW5kLT5pbmZvLklWMT0gCisgICAgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaU1JQ0ZhaWx1cmVJbmZvLnVjSVYxOworICAgICAgICAgdm9zX21lbV9jb3B5KHBNaWNJbmQtPmluZm8uVFNDLAorICAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlNSUNGYWlsdXJlSW5mby5UU0MsU0lSX0NJUEhFUl9TRVFfQ1RSX1NJWkUpOworCisgICAgICAgICBXREFfU2VuZE1zZyhwV0RBLCBTSVJfSEFMX01JQ19GQUlMVVJFX0lORCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBNaWNJbmQgLCAwKSA7CisgICAgICAgICBicmVhayA7CisgICAgICB9CisgICAgICBjYXNlIFdESV9GQVRBTF9FUlJPUl9JTkQ6CisgICAgICB7CisgICAgICAgICAvKiBUT0RPOiBEZWNvZGUgSW5kIGFuZCBzZW5kIEluZCB0byBQRSAqLworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVkIFdESV9GQVRBTF9FUlJPUl9JTkQgZnJvbSBXREkgIik7CisgICAgICAgICBicmVhayA7CisgICAgICB9CisgICAgICBjYXNlIFdEQV9CRUFDT05fUFJFX0lORDoKKyAgICAgIHsKKyAgICAgICAgIHRCZWFjb25HZW5QYXJhbXMgKnBCZWFjb25HZW5QYXJhbXMgPSAKKyAgICAgICAgICAgICh0QmVhY29uR2VuUGFyYW1zICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodEJlYWNvbkdlblBhcmFtcykpIDsKKyAgICAgICAgIGlmKE5VTEwgPT0gcEJlYWNvbkdlblBhcmFtcykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUgLSBwQmVhY29uR2VuUGFyYW1zIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVkIFdEQV9CRUFDT05fUFJFX0lORCBmcm9tIFdESSAiKTsKKworICAgICAgICAgLyogVE9ETzogZmlsbCB0aGUgcEJlYWNvbkdlblBhcmFtcyBzdHJ1Y3V0cmUgKi8KKyAgICAgICAgIFdEQV9TZW5kTXNnKHBXREEsIFNJUl9MSU1fQkVBQ09OX0dFTl9JTkQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQmVhY29uR2VuUGFyYW1zICwgMCkgOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFdESV9ERUxfU1RBX0lORDoKKyAgICAgIHsKKworICAgICAgICAgdHBEZWxldGVTdGFDb250ZXh0ICBwRGVsU1RBQ3R4ID0gCisgICAgICAgICAgICAodHBEZWxldGVTdGFDb250ZXh0KXZvc19tZW1fbWFsbG9jKHNpemVvZih0RGVsZXRlU3RhQ29udGV4dCkpOworICAgICAgICAgCisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgV0RJX0RFTF9TVEFfSU5EIGZyb20gV0RJICIpOworICAgICAgICAgaWYoTlVMTCA9PSBwRGVsU1RBQ3R4KQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgdm9zX21lbV9jb3B5KHBEZWxTVEFDdHgtPmFkZHIyLAorICAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlEZWxldGVTVEFJbmRUeXBlLm1hY0FERFIyLAorICAgICAgICAgICAgIHNpemVvZih0U2lyTWFjQWRkcikpOworCisgICAgICAgICB2b3NfbWVtX2NvcHkocERlbFNUQUN0eC0+YnNzSWQsCisgICAgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaURlbGV0ZVNUQUluZFR5cGUubWFjQlNTSUQsCisgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgICAgICAgIHBEZWxTVEFDdHgtPmFzc29jSWQgICAgPSAKKyAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpRGVsZXRlU1RBSW5kVHlwZS51c0Fzc29jSWQ7CisgICAgICAgICBwRGVsU1RBQ3R4LT5yZWFzb25Db2RlID0gCisgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaURlbGV0ZVNUQUluZFR5cGUud3B0UmVhc29uQ29kZTsKKyAgICAgICAgIHBEZWxTVEFDdHgtPnN0YUlkICAgICAgPSAKKyAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpRGVsZXRlU1RBSW5kVHlwZS51Y1NUQUlkeDsKKworICAgICAgICAgV0RBX1NlbmRNc2cocFdEQSwgU0lSX0xJTV9ERUxFVEVfU1RBX0NPTlRFWFRfSU5ELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlbFNUQUN0eCAsIDApIDsKKworICAgICAgICAgYnJlYWsgOworICAgICAgfQorICAgICAgY2FzZSBXRElfQ09FWF9JTkQ6CisgICAgICB7CisgICAgICAgICB0QU5JX1UzMiBpbmRleDsKKyAgICAgICAgIHZvc19tc2dfdCB2b3NNc2c7CisgICAgICAgICB0U2lyU21lQ29leEluZCAqcFNtZUNvZXhJbmQgPSAodFNpclNtZUNvZXhJbmQgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFNpclNtZUNvZXhJbmQpKTsKKyAgICAgICAgIGlmKE5VTEwgPT0gcFNtZUNvZXhJbmQpCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlLXBTbWVDb2V4SW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVkIFdESV9DT0VYX0lORCBmcm9tIFdESSAiKTsKKworICAgICAgICAgLyogTWVzc2FnZSBIZWFkZXIgKi8KKyAgICAgICAgIHBTbWVDb2V4SW5kLT5tZXNnVHlwZSA9IGVXTklfU01FX0NPRVhfSU5EOworICAgICAgICAgcFNtZUNvZXhJbmQtPm1lc2dMZW4gPSBzaXplb2YodFNpclNtZUNvZXhJbmQpOworCisgICAgICAgICAvKiBJbmZvIGZyb20gV0RJIEluZGljYXRpb24gKi8KKyAgICAgICAgIHBTbWVDb2V4SW5kLT5jb2V4SW5kVHlwZSA9IHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlDb2V4SW5mby5jb2V4SW5kVHlwZTsgCisgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTSVJfQ09FWF9JTkRfREFUQV9TSVpFOyBpbmRleCsrKQorICAgICAgICAgeworICAgICAgICAgICAgcFNtZUNvZXhJbmQtPmNvZXhJbmREYXRhW2luZGV4XSA9IHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlDb2V4SW5mby5jb2V4SW5kRGF0YVtpbmRleF07IAorICAgICAgICAgfQorCisgICAgICAgICAvKiBWT1MgbWVzc2FnZSB3cmFwcGVyICovCisgICAgICAgICB2b3NNc2cudHlwZSA9IGVXTklfU01FX0NPRVhfSU5EOworICAgICAgICAgdm9zTXNnLmJvZHlwdHIgPSAodm9pZCAqKXBTbWVDb2V4SW5kOworICAgICAgICAgdm9zTXNnLmJvZHl2YWwgPSAwOworCisgICAgICAgICAvKiBTZW5kIG1lc3NhZ2UgdG8gU01FICovCisgICAgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01RX0lEX1NNRSwgKHZvc19tc2dfdCopJnZvc01zZykpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBmcmVlIHRoZSBtZW0gYW5kIHJldHVybiAqLworICAgICAgICAgICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCAqKXBTbWVDb2V4SW5kKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERFQlVHICovCisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICJbQ09FWCBXREFdIENvZXggSW5kIFR5cGUgKCV4KSBkYXRhICgleCAleCAleCAleCkiLAorICAgICAgICAgICAgICAgICAgICAgIHBTbWVDb2V4SW5kLT5jb2V4SW5kVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgcFNtZUNvZXhJbmQtPmNvZXhJbmREYXRhWzBdLCAKKyAgICAgICAgICAgICAgICAgICAgICBwU21lQ29leEluZC0+Y29leEluZERhdGFbMV0sIAorICAgICAgICAgICAgICAgICAgICAgIHBTbWVDb2V4SW5kLT5jb2V4SW5kRGF0YVsyXSwgCisgICAgICAgICAgICAgICAgICAgICAgcFNtZUNvZXhJbmQtPmNvZXhJbmREYXRhWzNdKTsgCisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgV0RJX1RYX0NPTVBMRVRFX0lORDoKKyAgICAgIHsKKyAgICAgICAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwgKVZPU19HRVRfTUFDX0NUWFQocFdEQS0+cFZvc0NvbnRleHQpIDsKKyAgICAgICAgIC8qIENhbGxpbmcgVHhDb21wbGV0ZUFjayBJbmRpY2F0aW9uIGZyb20gd2RhIGNvbnRleHQqLworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxldGUgSW5kaWNhdGlvbiByZWNlaXZlZCBmcm9tIEhBTCIpOworICAgICAgICAgaWYoIHBXREEtPnBBY2tUeENiRnVuYyApCisgICAgICAgICB7CisgICAgICAgICAgICBpZiggVk9TX1NUQVRVU19TVUNDRVNTICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfU1RPUF9USU1FUigmcFdEQS0+d2RhVGltZXJzLlR4Q29tcGxldGVUaW1lcikpCisgICAgICAgICAgICB7ICAKKyAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHggQ29tcGxldGUgdGltZW91dCBUaW1lciBTdG9wIEZhaWxlZCAiKTsKKyAgICAgICAgICAgIH0gIAorICAgICAgICAgICAgcFdEQS0+cEFja1R4Q2JGdW5jKCBwTWFjLCB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEudHhfY29tcGxldGVfc3RhdHVzKTsKKyAgICAgICAgICAgIHBXREEtPnBBY2tUeENiRnVuYyA9IE5VTEw7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVHggQ29tcGxldGUgSW5kaWNhdGlvbiBpcyByZWNlaXZlZCBhZnRlciB0aW1lb3V0ICIpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICB9CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgICAgY2FzZSBXRElfUDJQX05PQV9BVFRSX0lORCA6CisgICAgICB7CisgICAgICAgICB0U2lyUDJQTm9hQXR0ciAgICpwUDJwTm9hQXR0ciA9IAorICAgICAgICAgICAgKHRTaXJQMlBOb2FBdHRyICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJQMlBOb2FBdHRyKSk7CisKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVkIFdESV9QMlBfTk9BX0FUVFJfSU5EIGZyb20gV0RJIik7CisKKyAgICAgICAgIGlmIChOVUxMID09IHBQMnBOb2FBdHRyKQorICAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAiV0RJX1AyUF9OT0FfQVRUUl9JTkQgbm90IGZvcndhcmRlZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgIHBQMnBOb2FBdHRyLT5pbmRleCAgICAgICAgICAgID0gCisgICAgICAgICAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby51Y0luZGV4OworICAgICAgICAgcFAycE5vYUF0dHItPm9wcFBzRmxhZyAgICAgICAgPSAKKyAgICAgICAgICAgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaVAycE5vYUF0dHJJbmZvLnVjT3BwUHNGbGFnOworICAgICAgICAgcFAycE5vYUF0dHItPmN0V2luICAgICAgICAgICAgPSAKKyAgICAgICAgICAgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaVAycE5vYUF0dHJJbmZvLnVzQ3RXaW47CisgICAgICAgICAKKyAgICAgICAgIHBQMnBOb2FBdHRyLT51Tm9hMUludGVydmFsQ250ID0gCisgICAgICAgICAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby51c05vYTFJbnRlcnZhbENudDsKKyAgICAgICAgIHBQMnBOb2FBdHRyLT51Tm9hMUR1cmF0aW9uICAgID0gCisgICAgICAgICAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby51c2xOb2ExRHVyYXRpb247CisgICAgICAgICBwUDJwTm9hQXR0ci0+dU5vYTFJbnRlcnZhbCAgICA9IAorICAgICAgICAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpUDJwTm9hQXR0ckluZm8udXNsTm9hMUludGVydmFsOworICAgICAgICAgcFAycE5vYUF0dHItPnVOb2ExU3RhcnRUaW1lICAgPSAKKyAgICAgICAgICAgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaVAycE5vYUF0dHJJbmZvLnVzbE5vYTFTdGFydFRpbWU7CisKKyAgICAgICAgIHBQMnBOb2FBdHRyLT51Tm9hMkludGVydmFsQ250ID0gCisgICAgICAgICAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby51c05vYTJJbnRlcnZhbENudDsKKyAgICAgICAgIHBQMnBOb2FBdHRyLT51Tm9hMkR1cmF0aW9uICAgID0gCisgICAgICAgICAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby51c2xOb2EyRHVyYXRpb247CisgICAgICAgICBwUDJwTm9hQXR0ci0+dU5vYTJJbnRlcnZhbCAgICA9IAorICAgICAgICAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpUDJwTm9hQXR0ckluZm8udXNsTm9hMkludGVydmFsOworICAgICAgICAgcFAycE5vYUF0dHItPnVOb2EyU3RhcnRUaW1lICAgPSAKKyAgICAgICAgICAgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaVAycE5vYUF0dHJJbmZvLnVzbE5vYTJTdGFydFRpbWU7CisKKyAgICAgICAgIFdEQV9TZW5kTXNnKHBXREEsIFNJUl9IQUxfUDJQX05PQV9BVFRSX0lORCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBQMnBOb2FBdHRyICwgMCkgOworICAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworICAgICAgY2FzZSBXRElfUFJFRl9ORVRXT1JLX0ZPVU5EX0lORDoKKyAgICAgIHsKKyAgICAgICAgIHZvc19tc2dfdCB2b3NNc2c7CisgICAgICAgICB0U2lyUHJlZk5ldHdvcmtGb3VuZEluZCAqcFByZWZOZXR3b3JrRm91bmRJbmQgPSAodFNpclByZWZOZXR3b3JrRm91bmRJbmQgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFNpclByZWZOZXR3b3JrRm91bmRJbmQpKTsKKworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgV0RJX1BSRUZfTkVUV09SS19GT1VORF9JTkQgZnJvbSBXREkiKTsKKworICAgICAgICAgaWYgKE5VTEwgPT0gcFByZWZOZXR3b3JrRm91bmRJbmQpCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJXRElfUFJFRl9ORVRXT1JLX0ZPVU5EX0lORCBub3QgZm9yd2FyZGVkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogTWVzc2FnZSBIZWFkZXIgKi8KKyAgICAgICAgIHBQcmVmTmV0d29ya0ZvdW5kSW5kLT5tZXNnVHlwZSA9IGVXTklfU01FX1BSRUZfTkVUV09SS19GT1VORF9JTkQ7CisgICAgICAgICBwUHJlZk5ldHdvcmtGb3VuZEluZC0+bWVzZ0xlbiA9IHNpemVvZigqcFByZWZOZXR3b3JrRm91bmRJbmQpOworCisgICAgICAgICAvKiBJbmZvIGZyb20gV0RJIEluZGljYXRpb24gKi8gCisgICAgICAgICBwUHJlZk5ldHdvcmtGb3VuZEluZC0+c3NJZC5sZW5ndGggPSAKKyAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQcmVmTmV0d29ya0ZvdW5kSW5kLnNzSWQudWNMZW5ndGg7CisKKyAgICAgICAgIHZvc19tZW1fc2V0KCBwUHJlZk5ldHdvcmtGb3VuZEluZC0+c3NJZC5zc0lkLCAzMiwgMCk7CisKKyAgICAgICAgIHZvc19tZW1fY29weSggcFByZWZOZXR3b3JrRm91bmRJbmQtPnNzSWQuc3NJZCwgCisgICAgICAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpUHJlZk5ldHdvcmtGb3VuZEluZC5zc0lkLnNTU0lELCAKKyAgICAgICAgICAgICAgICAgIHBQcmVmTmV0d29ya0ZvdW5kSW5kLT5zc0lkLmxlbmd0aCk7CisKKyAgICAgICAgIHBQcmVmTmV0d29ya0ZvdW5kSW5kIC0+cnNzaSA9IHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQcmVmTmV0d29ya0ZvdW5kSW5kLnJzc2k7IAorCisgICAgICAgICAvKiBWT1MgbWVzc2FnZSB3cmFwcGVyICovCisgICAgICAgICB2b3NNc2cudHlwZSA9IGVXTklfU01FX1BSRUZfTkVUV09SS19GT1VORF9JTkQ7CisgICAgICAgICB2b3NNc2cuYm9keXB0ciA9ICh2b2lkICopIHBQcmVmTmV0d29ya0ZvdW5kSW5kOworICAgICAgICAgdm9zTXNnLmJvZHl2YWwgPSAwOworCisgICAgICAgICAvKiBTZW5kIG1lc3NhZ2UgdG8gU01FICovCisgICAgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01RX0lEX1NNRSwgKHZvc19tc2dfdCopJnZvc01zZykpCisgICAgICAgICB7CisgICAgICAgICAgICAvKiBmcmVlIHRoZSBtZW0gYW5kIHJldHVybiAqLworICAgICAgICAgICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCAqKSBwUHJlZk5ldHdvcmtGb3VuZEluZCk7CisgICAgICAgICB9CisKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworICAgICAgCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisgICAgICBjYXNlIFdESV9XQUtFX1JFQVNPTl9JTkQ6CisgICAgICB7CisgICAgICAgICB2b3NfbXNnX3Qgdm9zTXNnOworICAgICAgICAgdEFOSV9VMzIgYWxsb2NTaXplID0gc2l6ZW9mKHRTaXJXYWtlUmVhc29uSW5kKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpV2FrZVJlYXNvbkluZC51bFN0b3JlZERhdGFMZW4gLSAxKTsKKyAgICAgICAgIHRTaXJXYWtlUmVhc29uSW5kICpwV2FrZVJlYXNvbkluZCA9ICh0U2lyV2FrZVJlYXNvbkluZCAqKXZvc19tZW1fbWFsbG9jKGFsbG9jU2l6ZSk7CisKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIltXQUtFX1JFQVNPTiBXREldIFdBS0VfUkVBU09OX0lORCBUeXBlICgweCV4KSBkYXRhICh1bFJlYXNvbj0weCV4LCB1bFJlYXNvbkFyZz0weCV4LCB1bFN0b3JlZERhdGFMZW49MHgleCkiLAorICAgICAgICAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlXYWtlUmVhc29uSW5kLnVsUmVhc29uLAorICAgICAgICAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpV2FrZVJlYXNvbkluZC51bFJlYXNvbkFyZywKKyAgICAgICAgICAgICAgICAgICAgd2RpTG93TGV2ZWxJbmQtPndkaUluZGljYXRpb25EYXRhLndkaVdha2VSZWFzb25JbmQudWxTdG9yZWREYXRhTGVuKTsKKworICAgICAgICAgaWYgKE5VTEwgPT0gcFdha2VSZWFzb25JbmQpCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJXRElfV0FLRV9SRUFTT05fSU5EIG5vdCBmb3J3YXJkZWQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisgICAgICAgICB2b3NfbWVtX3plcm8ocFdha2VSZWFzb25JbmQsIGFsbG9jU2l6ZSk7CisKKyAgICAgICAgIC8qIE1lc3NhZ2UgSGVhZGVyICovCisgICAgICAgICBwV2FrZVJlYXNvbkluZC0+bWVzZ1R5cGUgPSBlV05JX1NNRV9XQUtFX1JFQVNPTl9JTkQ7CisgICAgICAgICBwV2FrZVJlYXNvbkluZC0+bWVzZ0xlbiA9IGFsbG9jU2l6ZTsKKworICAgICAgICAgLyogSW5mbyBmcm9tIFdESSBJbmRpY2F0aW9uICovCisgICAgICAgICAvLyBGaWxsIHBXYWtlUmVhc29uSW5kIHN0cnVjdHVyZSBmcm9tIHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlXYWtlUmVhc29uSW5kCisgICAgICAgICBwV2FrZVJlYXNvbkluZC0+dWxSZWFzb24gPSB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpV2FrZVJlYXNvbkluZC51bFJlYXNvbjsKKyAgICAgICAgIHBXYWtlUmVhc29uSW5kLT51bFJlYXNvbkFyZyA9IHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlXYWtlUmVhc29uSW5kLnVsUmVhc29uQXJnOworICAgICAgICAgcFdha2VSZWFzb25JbmQtPnVsU3RvcmVkRGF0YUxlbiA9IHdkaUxvd0xldmVsSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlXYWtlUmVhc29uSW5kLnVsU3RvcmVkRGF0YUxlbjsKKyAgICAgICAgIHBXYWtlUmVhc29uSW5kLT51bEFjdHVhbERhdGFMZW4gPSB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpV2FrZVJlYXNvbkluZC51bEFjdHVhbERhdGFMZW47ICAgICAgICAgCisgICAgICAgICB2b3NfbWVtX2NvcHkoICh2b2lkICopJihwV2FrZVJlYXNvbkluZC0+YURhdGFTdGFydFswXSksIAorICAgICAgICAgICAgICAgICAgICAgICAgJih3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpV2FrZVJlYXNvbkluZC5hRGF0YVN0YXJ0WzBdKSwgCisgICAgICAgICAgICAgICAgICAgICAgICB3ZGlMb3dMZXZlbEluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpV2FrZVJlYXNvbkluZC51bFN0b3JlZERhdGFMZW4pOworCisgICAgICAgICAvKiBWT1MgbWVzc2FnZSB3cmFwcGVyICovCisgICAgICAgICB2b3NNc2cudHlwZSA9IGVXTklfU01FX1dBS0VfUkVBU09OX0lORDsKKyAgICAgICAgIHZvc01zZy5ib2R5cHRyID0gKHZvaWQgKikgcFdha2VSZWFzb25JbmQ7CisgICAgICAgICB2b3NNc2cuYm9keXZhbCA9IDA7CisKKyAgICAgICAgIC8qIFNlbmQgbWVzc2FnZSB0byBTTUUgKi8KKyAgICAgICAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfU01FLCAodm9zX21zZ190Kikmdm9zTXNnKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZyZWUgdGhlIG1lbSBhbmQgcmV0dXJuICovCisgICAgICAgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICopIHBXYWtlUmVhc29uSW5kKTsKKyAgICAgICAgIH0KKworICAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisgICAgICAKKyAgICAgIGNhc2UgV0RJX1RYX1BFUl9ISVRfSU5EOgorICAgICAgeworICAgICAgICAgdm9zX21zZ190IHZvc01zZzsKKyAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJHZXQgV0RJX1RYX1BFUl9ISVRfSU5EIik7CisgICAgICAgICAvKiBzZW5kIElORCB0byBQRSBlV05JX1NNRV9UWF9QRVJfSElUX0lORCovCisgICAgICAgICAvKiBWT1MgbWVzc2FnZSB3cmFwcGVyICovCisgICAgICAgICB2b3NNc2cudHlwZSA9IGVXTklfU01FX1RYX1BFUl9ISVRfSU5EOworICAgICAgICAgdm9zTXNnLmJvZHlwdHIgPSBOVUxMOworICAgICAgICAgdm9zTXNnLmJvZHl2YWwgPSAwOworCisgICAgICAgICAvKiBTZW5kIG1lc3NhZ2UgdG8gU01FICovCisgICAgICAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01RX0lEX1NNRSwgKHZvc19tc2dfdCopJnZvc01zZykpCisgICAgICAgICB7CisgICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9XQVJOLCAicG9zdCBlV05JX1NNRV9UWF9QRVJfSElUX0lORCB0byBTTUUgRmFpbGVkIik7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgCisgICAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICAgLyogVE9ETyBlcnJvciAqLworICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBVTktOT1dOIEluZGljYXRpb24gZnJvbSBXREkgIik7CisgICAgICB9IAorICAgfQorICAgcmV0dXJuIDsKK30KKworCisvKgorICogQkEgcmVsYXRlZCBwcm9jZXNzaW5nIGluIFdEQS4KKyAqLworCit2b2lkIFdEQV9UcmlnZ2VyQmFSZXFDYWxsYmFjayhXRElfVHJpZ2dlckJBUnNwUGFyYW1zVHlwZSAqd2RpVHJpZ2dlckJhUnNwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsgCisgICB0V0RBX0NiQ29udGV4dCAqcFdEQTsKKworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisKKyAgIHBXREEgPSAodFdEQV9DYkNvbnRleHQgKilwV2RhUGFyYW1zLT5wV2RhQ29udGV4dDsKKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgPT0gd2RpVHJpZ2dlckJhUnNwLT53ZGlTdGF0dXMpCisgICB7CisgICAgICB0QU5JX1U4IGkgPSAwIDsKKyAgICAgIHRCYUFjdGl2aXR5SW5kICpiYUFjdGl2aXR5SW5kID0gTlVMTCA7CisgICAgICB0QU5JX1U4IGJhQ2FuZGlkYXRlQ291bnQgPSB3ZGlUcmlnZ2VyQmFSc3AtPnVzQmFDYW5kaWRhdGVDbnQgOworICAgICAgdEFOSV9VOCBhbGxvY1NpemUgPSBzaXplb2YodEJhQWN0aXZpdHlJbmQpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YodEFkZEJhQ2FuZGlkYXRlKSAqIChiYUNhbmRpZGF0ZUNvdW50KSA7CisgICAgICBXRElfVHJpZ2dlckJBUnNwQ2FuZGlkYXRlVHlwZSAqd2RpQmFDYW5kaWRhdGUgPSBOVUxMIDsgCisgICAgICB0QWRkQmFDYW5kaWRhdGUgKmJhQ2FuZGlkYXRlID0gTlVMTCA7CisKKyAgICAgIGJhQWN0aXZpdHlJbmQgPSAgKHRCYUFjdGl2aXR5SW5kICopdm9zX21lbV9tYWxsb2MoYWxsb2NTaXplKSA7CisKKyAgICAgIGlmKE5VTEwgPT0gYmFBY3Rpdml0eUluZCkgCisgICAgICB7IAorICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgICAgIHJldHVybjsgCisgICAgICB9CisKKyAgICAgIHZvc19tZW1fY29weShiYUFjdGl2aXR5SW5kLT5ic3NJZCwgd2RpVHJpZ2dlckJhUnNwLT5tYWNCU1NJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkgOworICAgICAgYmFBY3Rpdml0eUluZC0+YmFDYW5kaWRhdGVDbnQgPSBiYUNhbmRpZGF0ZUNvdW50IDsKKyAgICAgICAKKyAgICAgIHdkaUJhQ2FuZGlkYXRlID0gKFdESV9UcmlnZ2VyQkFSc3BDYW5kaWRhdGVUeXBlKikod2RpVHJpZ2dlckJhUnNwICsgMSkgOworICAgICAgYmFDYW5kaWRhdGUgPSAodEFkZEJhQ2FuZGlkYXRlKikoYmFBY3Rpdml0eUluZCArIDEpIDsKKyAKKyAgICAgIGZvcihpID0gMCA7IGkgPCBiYUNhbmRpZGF0ZUNvdW50IDsgaSsrKQorICAgICAgeworICAgICAgICAgdEFOSV9VOCB0aWQgPSAwIDsKKyAgICAgICAgIHdkaUJhQ2FuZGlkYXRlID0gKHdkaUJhQ2FuZGlkYXRlICsgaSkgOworICAgICAgICAgYmFDYW5kaWRhdGUgPSAoYmFDYW5kaWRhdGUgKyBpKSA7CisgICAgICAgICB2b3NfbWVtX2NvcHkoYmFDYW5kaWRhdGUtPnN0YUFkZHIsIHdkaUJhQ2FuZGlkYXRlLT5tYWNTVEEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSkgOworCisgICAgICAgICBmb3IodGlkID0gMCA7IHRpZCA8IFNUQUNGR19NQVhfVEM7IHRpZCsrKQorICAgICAgICAgeworICAgICAgICAgICAgIGJhQ2FuZGlkYXRlLT5iYUluZm9bdGlkXS5mQmFFbmFibGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkaUJhQ2FuZGlkYXRlLT53ZGlCQUluZm9bdGlkXS5mQmFFbmFibGUgOworICAgICAgICAgICAgIGJhQ2FuZGlkYXRlLT5iYUluZm9bdGlkXS5zdGFydGluZ1NlcU51bSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RpQmFDYW5kaWRhdGUtPndkaUJBSW5mb1t0aWRdLnN0YXJ0aW5nU2VxTnVtIDsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgV0RBX1NlbmRNc2cocFdEQSwgU0lSX0xJTV9BRERfQkFfSU5ELCAodm9pZCAqKWJhQWN0aXZpdHlJbmQgLCAwKSA7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJBIFRyaWdnZXIgUlNQIHdpdGggRmFpbHVyZSByZWNlaXZlZCAiKTsKKyAgIH0KKworICAgcmV0dXJuIDsKKworfQorCisvKgorICogQkEgQWN0aXZpdHkgY2hlY2sgdGltZXIgaGFuZGxlcgorICovCit2b2lkIFdEQV9CYUNoZWNrQWN0aXZpdHkodFdEQV9DYkNvbnRleHQgKnBXREEpCit7CisgICB0QU5JX1U4IGN1clN0YSA9IDAgOworICAgdEFOSV9VOCB0aWQgPSAwIDsKKyAgIHRBTklfVTggc2l6ZSA9IDAgOworICAgdEFOSV9VOCBiYUNhbmRpZGF0ZUNvdW50ID0gMCA7CisgICB0QU5JX1U4IG5ld0JhQ2FuZGlkYXRlID0gMCA7CisgICBXRElfVHJpZ2dlckJBUmVxQ2FuZGlkYXRlVHlwZSBiYUNhbmRpZGF0ZVtXREFfTUFYX1NUQV0gPSB7ezB9fSA7CisgICAKKyAgIGlmKE5VTEwgPT0gcFdEQSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczpwV0RBIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gOworICAgfQorICAgaWYoV0RBX01BWF9TVEEgPCBwV0RBLT53ZGFNYXhTdGEpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5jb25zaXN0ZW50IFNUQSBlbnRyaWVzIGluIFdEQSIpOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICB9ICAKKyAgIC8qIHdhbGsgdGhyb3VnaCBhbGwgU1RBIGVudHJpZXMgYW5kIGZpbmQgb3V0IFRYIHBhY2tldCBjb3VudCAqLyAKKyAgIGZvcihjdXJTdGEgPSAwIDsgY3VyU3RhIDwgcFdEQS0+d2RhTWF4U3RhIDsgY3VyU3RhKyspCisgICB7CisgICAgICBmb3IodGlkID0gMCA7IHRpZCA8IFNUQUNGR19NQVhfVEMgOyB0aWQrKykKKyAgICAgIHsKKyAgICAgICAgIHRBTklfVTMyIHR4UGt0Q291bnQgPSAwIDsKKyAgICAgICAgIHRBTklfVTggdmFsaWRTdGFJbmRleCA9IHBXREEtPndkYVN0YUluZm9bY3VyU3RhXS51Y1ZhbGlkU3RhSW5kZXggOworCisgICAgICAgICBpZigoV0RBX1ZBTElEX1NUQV9JTkRFWCA9PSB2YWxpZFN0YUluZGV4KSAmJgorICAgICAgICAgICAgKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSBXREFfVExfR0VUX1RYX1BLVENPVU5UKCBwV0RBLT5wVm9zQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJTdGEsIHRpZCwgJnR4UGt0Q291bnQpKSkKKyAgICAgICAgIHsKKyNpZiAwCisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgIioqKioqKioqKioqKiogJWQ6JWQsICVkICIsY3VyU3RhLCB0eFBrdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdEQS0+d2RhU3RhSW5mb1tjdXJTdGFdLmZyYW1lc1R4ZWRbdGlkXSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmKCFXREFfR0VUX0JBX1RYRkxBRyhwV0RBLCBjdXJTdGEsIHRpZCkgCisgICAgICAgICAgICAgICAgICAgJiYgKHR4UGt0Q291bnQgPj0gV0RBX0xBU1RfUE9MTEVEX1RIUkVTSE9MRChwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clN0YSwgdGlkKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBnZXQgcHJlcGFyZSBmb3Igc2VuZGluZyBtZXNzYWdlIHRvIEhBTCAqLworICAgICAgICAgICAgICAgLy9iYUNhbmRpZGF0ZVtiYUNhbmRpZGF0ZUNvdW50XS5zdGFJZHggPSBjdXJTdGEgOworICAgICAgICAgICAgICAgYmFDYW5kaWRhdGVbYmFDYW5kaWRhdGVDb3VudF0udWNUaWRCaXRtYXAgfD0gMSA8PCB0aWQgOworICAgICAgICAgICAgICAgbmV3QmFDYW5kaWRhdGUgPSBXREFfRU5BQkxFX0JBIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBXREEtPndkYVN0YUluZm9bY3VyU3RhXS5mcmFtZXNUeGVkW3RpZF0gPSB0eFBrdENvdW50IDsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogZmlsbCB0aGUgZW50cnkgZm9yIGFsbCB0aGUgc3RhIHdpdGggZ2l2ZW4gVElEJ3MgKi8KKyAgICAgIGlmKFdEQV9FTkFCTEVfQkEgPT0gbmV3QmFDYW5kaWRhdGUpCisgICAgICB7IAorICAgICAgICAgLyogbW92ZSB0byBuZXh0IEJBIGNhbmRpZGF0ZSAqLworICAgICAgICAgYmFDYW5kaWRhdGVbYmFDYW5kaWRhdGVDb3VudF0udWNTVEFJZHggPSBjdXJTdGEgOworICAgICAgICAgc2l6ZSArPSBzaXplb2YoV0RJX1RyaWdnZXJCQVJlcUNhbmRpZGF0ZVR5cGUpIDsgCisgICAgICAgICBiYUNhbmRpZGF0ZUNvdW50KysgOworICAgICAgICAgbmV3QmFDYW5kaWRhdGUgPSBXREFfRElTQUJMRV9CQSA7CisgICAgICB9IAorICAgfQorCisgICAvKiBwcmVwYXJlIGFuZCBzZW5kIG1lc3NhZ2UgdG8gaGFsICovCisgICBpZiggMCA8IGJhQ2FuZGlkYXRlQ291bnQpCisgICB7CisgICAgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUyA7CisgICAgICBXRElfVHJpZ2dlckJBUmVxUGFyYW1zVHlwZSAqd2RpVHJpZ2dlckJhUmVxOworICAgICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAKKyAgICAgICAgICAgICAgICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKworICAgICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKSAKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICAgICBWT1NfQVNTRVJUKDApIDsgCisgICAgICAgICByZXR1cm47IAorICAgICAgfQorICAgICAgd2RpVHJpZ2dlckJhUmVxID0gKFdESV9UcmlnZ2VyQkFSZXFQYXJhbXNUeXBlICopCisgICAgICAgICAgICAgICAgICAgIHZvc19tZW1fbWFsbG9jKHNpemVvZihXRElfVHJpZ2dlckJBUmVxUGFyYW1zVHlwZSkgKyBzaXplKSA7CisgICAgICBpZihOVUxMID09IHdkaVRyaWdnZXJCYVJlcSkgCisgICAgICB7CisgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgICAgVk9TX0FTU0VSVCgwKSA7IAorICAgICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgICAgICAgcmV0dXJuOyAKKyAgICAgIH0KKworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgIFdESV9UcmlnZ2VyQkFSZXFpbmZvVHlwZSAqdHJpZ2dlckJhSW5mbyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2RpVHJpZ2dlckJhUmVxLT53ZGlUcmlnZ2VyQkFJbmZvVHlwZSA7CisgICAgICAgICB0cmlnZ2VyQmFJbmZvLT51c0JBQ2FuZGlkYXRlQ250ID0gYmFDYW5kaWRhdGVDb3VudCA7CisgICAgICAgICAvKiBURU1QX0ZJWDogTmVlZCB0byBzZWUgaWYgV0RJIG5lZWQgY2hlY2sgZm9yIGFzc29jIHNlc3Npb24gZm9yIAorICAgICAgICAgICogZm9yIGVhY2ggcmVxdWVzdCAqLworICAgICAgICAgdHJpZ2dlckJhSW5mby0+dWNTVEFJZHggPSBiYUNhbmRpZGF0ZVswXS51Y1NUQUlkeCA7CisgICAgICAgICB0cmlnZ2VyQmFJbmZvLT51Y0JBU2Vzc2lvbklEID0gMDsKKyAgICAgICAgIHZvc19tZW1fY29weSgod2RpVHJpZ2dlckJhUmVxICsgMSksIGJhQ2FuZGlkYXRlLCBzaXplKSA7CisgICAgICB9IHdoaWxlKDApIDsKKyAgICAgIHdkaVRyaWdnZXJCYVJlcS0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMIDsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSB3ZGlUcmlnZ2VyQmFSZXEgOworICAgICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSBOVUxMOyAKKyAgICAgIHN0YXR1cyA9IFdESV9UcmlnZ2VyQkFSZXEod2RpVHJpZ2dlckJhUmVxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RBX1RyaWdnZXJCYVJlcUNhbGxiYWNrLCBwV2RhUGFyYW1zKSA7CisgICAgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gVHJpZ2dlciBCQSBSRVEgUGFyYW1zIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICAgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBpcyBubyBUSUQgZm9yIGluaXRpYXRpbmcgQkEiKTsKKyAgIH0KKworICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSAKKyAgICAgICAgIFdEQV9TVE9QX1RJTUVSKCZwV0RBLT53ZGFUaW1lcnMuYmFBY3Rpdml0eUNoa1RtcikpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCQSBBY3Rpdml0eSBUaW1lciBTdG9wIEZhaWxlZCAiKTsKKyAgICAgIHJldHVybiA7CisgICB9CisgICBpZiggVk9TX1NUQVRVU19TVUNDRVNTICE9IAorICAgICAgV0RBX1NUQVJUX1RJTUVSKCZwV0RBLT53ZGFUaW1lcnMuYmFBY3Rpdml0eUNoa1RtcikpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCQSBBY3Rpdml0eSBUaW1lciBTdGFydCBGYWlsZWQgIik7CisgICAgICByZXR1cm47CisgICB9CisgICByZXR1cm4gOworfQorCisvKgorICogV0RBIGNvbW1vbiByb3V0aW5lIHRvIGNyZWF0ZSB0aW1lciB1c2VkIGJ5IFdEQS4KKyAqLworc3RhdGljIFZPU19TVEFUVVMgd2RhQ3JlYXRlVGltZXJzKHRXREFfQ2JDb250ZXh0ICpwV0RBKQoreworCisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUyA7CisgICB0QU5JX1UzMiB2YWwgPSAwIDsKKyAgIHRwQW5pU2lyR2xvYmFsIHBNYWMgPSAodHBBbmlTaXJHbG9iYWwgKVZPU19HRVRfTUFDX0NUWFQocFdEQS0+cFZvc0NvbnRleHQpOworICAgCisgICBpZihOVUxMID09IHBNYWMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6TUFDIGNvbnRleHQgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIGlmKHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfQkFfQUNUSVZJVFlfQ0hFQ0tfVElNRU9VVCwgJnZhbCApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGVTSVJfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBXTklfQ0ZHX0NVUlJFTlRfVFhfQU5URU5OQSIpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKHZhbCkgOworIAorICAgLyogQkEgYWN0aXZpdHkgY2hlY2sgdGltZXIgKi8KKyAgIHN0YXR1cyA9IFdEQV9DUkVBVEVfVElNRVIoJnBXREEtPndkYVRpbWVycy5iYUFjdGl2aXR5Q2hrVG1yLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQkEgQWN0aXZpdHkgQ2hlY2sgdGltZXIiLCBXREFfVGltZXJIYW5kbGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBXREFfVElNRVJfQkFfQUNUSVZJVFlfUkVRLCB2YWwsIHZhbCwgVFhfTk9fQUNUSVZBVEUpIDsKKyAgIGlmKHN0YXR1cyAhPSBUWF9TVUNDRVNTKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIEJBIGFjdGl2aXR5IHRpbWVyIik7CisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFIDsKKyAgIH0KKworICAgdmFsID0gU1lTX01TX1RPX1RJQ0tTKCBXREFfVFhfQ09NUExFVEVfVElNRV9PVVRfVkFMVUUgKSA7IAorCisgICAvKiBUeCBDb21wbGV0ZSBUaW1lb3V0IHRpbWVyICovCisgICBzdGF0dXMgPSBXREFfQ1JFQVRFX1RJTUVSKCZwV0RBLT53ZGFUaW1lcnMuVHhDb21wbGV0ZVRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJUeCBDb21wbGV0ZSBDaGVjayB0aW1lciIsIFdEQV9UaW1lckhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV0RBX1RYX0NPTVBMRVRFX1RJTUVPVVRfSU5ELCB2YWwsIHZhbCwgVFhfTk9fQUNUSVZBVEUpIDsKKworICAgaWYoc3RhdHVzICE9IFRYX1NVQ0NFU1MpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgVHggQ29tcGxldGUgVGltZW91dCB0aW1lciIpOworICAgICAgLyogRGVzdHJveSB0aW1lciBvZiBCQSBhY3Rpdml0eSBjaGVjayB0aW1lciAqLworICAgICAgc3RhdHVzID0gV0RBX0RFU1RST1lfVElNRVIoJnBXREEtPndkYVRpbWVycy5iYUFjdGl2aXR5Q2hrVG1yKTsgCisgICAgICBpZihzdGF0dXMgIT0gVFhfU1VDQ0VTUykKKyAgICAgIHsKKyAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIERlc3Ryb3kgQkEgYWN0aXZpdHkgdGltZXIiKTsKKyAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkUgOworICAgICAgfSAKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkUgOworICAgfQorCisgICByZXR1cm4gZVNJUl9TVUNDRVNTIDsKK30KKworLyoKKyAqIFdEQSBjb21tb24gcm91dGluZSB0byBkZXN0cm95IHRpbWVyIHVzZWQgYnkgV0RBLgorICovCitzdGF0aWMgVk9TX1NUQVRVUyB3ZGFEZXN0cm95VGltZXJzKHRXREFfQ2JDb250ZXh0ICpwV0RBKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1MgOworCisgICBzdGF0dXMgPSBXREFfREVTVFJPWV9USU1FUigmcFdEQS0+d2RhVGltZXJzLlR4Q29tcGxldGVUaW1lcik7CisgICBpZihzdGF0dXMgIT0gVFhfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIERlc3Ryb3kgVHggQ29tcGxldGUgVGltZW91dCB0aW1lciIpOworICAgICAgcmV0dXJuIGVTSVJfRkFJTFVSRSA7CisgICB9CisKKyAgIHN0YXR1cyA9IFdEQV9ERVNUUk9ZX1RJTUVSKCZwV0RBLT53ZGFUaW1lcnMuYmFBY3Rpdml0eUNoa1Rtcik7CisgICBpZihzdGF0dXMgIT0gVFhfU1VDQ0VTUykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIERlc3Ryb3kgQkEgYWN0aXZpdHkgdGltZXIiKTsKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkUgOworICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICByZXR1cm4gZVNJUl9TVUNDRVNTIDsKK30KKworLyoKKyAqIFdEQSB0aW1lciBoYW5kbGVyLgorICovCit2b2lkIFdEQV9UaW1lckhhbmRsZXIodl9WT0lEX3QqIHBDb250ZXh0LCB0QU5JX1UzMiB0aW1lckluZm8pCit7CisgICBWT1NfU1RBVFVTIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZvc19tc2dfdCB3ZGFNc2cgPSB7MH0gOworCisgICAvKgorICAgICogdHJpZ2dlciBDRkcgZG93bmxvYWQgaW4gV0RBIGJ5IHNlbmRpbmcgV0RBX0NGR19ETkxEIG1lc3NhZ2UKKyAgICAqLyAKKyAgIHdkYU1zZy50eXBlID0gdGltZXJJbmZvIDsgCisgICB3ZGFNc2cuYm9keXB0ciA9IE5VTEw7CisgICB3ZGFNc2cuYm9keXZhbCA9IDA7CisKKyAgIC8qIHBvc3QgdGhlIG1lc3NhZ2UuLiAqLworICAgdm9zU3RhdHVzID0gdm9zX21xX3Bvc3RfbWVzc2FnZSggVk9TX01RX0lEX1dEQSwgJndkYU1zZyApOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQorICAgeworICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0JBRE1TRzsKKyAgIH0KKworfQorCisvKgorICogV0RBIFR4IENvbXBsZXRlIHRpbWVvdXQgSW5kaWNhdGlvbi4KKyAqLwordm9pZCBXREFfUHJvY2Vzc1R4Q29tcGxldGVUaW1lT3V0SW5kKHRXREFfQ2JDb250ZXh0KiBwV0RBKQoreworICAgdHBBbmlTaXJHbG9iYWwgcE1hYyA9ICh0cEFuaVNpckdsb2JhbCApVk9TX0dFVF9NQUNfQ1RYVChwV0RBLT5wVm9zQ29udGV4dCkgOworCisgICBpZiggcFdEQS0+cEFja1R4Q2JGdW5jICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR4Q29tcGxldGUgdGltZXIgZXhwaXJlZFxuIik7CisgICAgICBwV0RBLT5wQWNrVHhDYkZ1bmMoIHBNYWMsIDApOworICAgICAgcFdEQS0+cEFja1R4Q2JGdW5jID0gTlVMTDsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICJUaGVyZSBpcyBubyByZXF1ZXN0IHBlbmRpbmcgZm9yIFR4Q29tcGxldGUgYW5kIHdhaXQgdGltZXIgZXhwaXJlZFxuIik7CisgICB9CisKK30KKworLyoKKyAqIFdEQSBTZXQgUkVHIERvbWFpbiB0byBWT1MgTlYKKyAqLworZUhhbFN0YXR1cyBXREFfU2V0UmVnRG9tYWluKHZvaWQgKiBjbGllbnRDdHh0LCB2X1JFR0RPTUFJTl90IHJlZ0lkKQoreworICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19udl9zZXRSZWdEb21haW4oY2xpZW50Q3R4dCwgcmVnSWQpKQorICAgeworICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworICAgfQorICAgcmV0dXJuIGVIQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYgIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKy8qCisgKiBGVU5DVElPTjogV0RBX1BOT1NjYW5SZXFDYWxsYmFjaworICogCisgKi8gCit2b2lkIFdEQV9QTk9TY2FuUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOyAKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisKKyAgIGlmKCBwV2RhUGFyYW1zICE9IE5VTEwgKQorICAgeworICAgICAgaWYoIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtICE9IE5VTEwgKQorICAgICAgeworICAgICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKTsKKyAgICAgIH0KKworICAgICAgaWYoIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pOworICAgICAgfQorCisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgfQorCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9VcGRhdGVTY2FuUGFyYW1zQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfVXBkYXRlU2NhblBhcmFtc0NhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsgCisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBwV2RhUGFyYW1zIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorCisgICBpZiggcFdkYVBhcmFtcyAhPSBOVUxMICkKKyAgIHsKKyAgICAgIGlmKCBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSAhPSBOVUxMICkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB9CisKKyAgICAgIGlmKCBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKTsKKyAgICAgIH0KKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICB9CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1NldFBvd2VyUGFyYW1zQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfU2V0UG93ZXJQYXJhbXNDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCogcFVzZXJEYXRhKQoreworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKilwVXNlckRhdGE7IAorCisgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIiVzOiBwV2RhUGFyYW1zIHJlY2VpdmVkIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKSA7CisgICAgICByZXR1cm4gOworICAgfQorCisgICBpZiggcFdkYVBhcmFtcyAhPSBOVUxMICkKKyAgIHsKKyAgICAgIGlmKCBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSAhPSBOVUxMICkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB9CisKKyAgICAgIGlmKCBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKTsKKyAgICAgIH0KKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICB9CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NTZXRQcmVmZXJyZWROZXR3b3JrTGlzdAorICogUmVxdWVzdCB0byBXREkgdG8gc2V0IFByZWZlcnJlZCBOZXR3b3JrIExpc3QuT2ZmbG9hZAorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1NldFByZWZOZXR3b3JrUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJQTk9TY2FuUmVxICpwUE5PU2NhblJlcVBhcmFtcykKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0RJX1BOT1NjYW5SZXFQYXJhbXNUeXBlICpwd2RpUE5PU2NhblJlcUluZm8gPSAKKyAgICAgIChXRElfUE5PU2NhblJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYyhzaXplb2YoV0RJX1BOT1NjYW5SZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworICAgdl9VOF90ICAgaTsgCisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSBwd2RpUE5PU2NhblJlcUluZm8pIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUocHdkaVBOT1NjYW5SZXFJbmZvKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIC8vCisgICAvLyBGaWxsIHdkaVBOT1NjYW5SZXFJbmZvLT53ZGlQTk9TY2FuSW5mbyBmcm9tIHBQTk9TY2FuUmVxUGFyYW1zCisgICAvLworICAgcHdkaVBOT1NjYW5SZXFJbmZvLT53ZGlQTk9TY2FuSW5mby5iRW5hYmxlID0gcFBOT1NjYW5SZXFQYXJhbXMtPmVuYWJsZTsKKyAgIHB3ZGlQTk9TY2FuUmVxSW5mby0+d2RpUE5PU2NhbkluZm8ud2RpTW9kZVBOTyA9IHBQTk9TY2FuUmVxUGFyYW1zLT5tb2RlUE5POworCisgICBwd2RpUE5PU2NhblJlcUluZm8tPndkaVBOT1NjYW5JbmZvLnVjTmV0d29ya3NDb3VudCA9IAorICAgICAgKCBwUE5PU2NhblJlcVBhcmFtcy0+dWNOZXR3b3Jrc0NvdW50IDwgV0RJX1BOT19NQVhfU1VQUF9ORVRXT1JLUyApPyAKKyAgICAgICAgcFBOT1NjYW5SZXFQYXJhbXMtPnVjTmV0d29ya3NDb3VudCA6IFdESV9QTk9fTUFYX1NVUFBfTkVUV09SS1MgOworCisgICBmb3IgKCBpID0gMDsgaSA8IHB3ZGlQTk9TY2FuUmVxSW5mby0+d2RpUE5PU2NhbkluZm8udWNOZXR3b3Jrc0NvdW50IDsgaSsrKQorICAgeworICAgICAgdm9zX21lbV9jb3B5KCZwd2RpUE5PU2NhblJlcUluZm8tPndkaVBOT1NjYW5JbmZvLmFOZXR3b3Jrc1tpXSwKKyAgICAgICAgICAgICAgICAgICAmcFBOT1NjYW5SZXFQYXJhbXMtPmFOZXR3b3Jrc1tpXSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YocHdkaVBOT1NjYW5SZXFJbmZvLT53ZGlQTk9TY2FuSW5mby5hTmV0d29ya3NbaV0pKTsKKyAgIH0KKworICAgLypTY2FuIHRpbWVyIGludGVydmFscyovCisgICB2b3NfbWVtX2NvcHkoJnB3ZGlQTk9TY2FuUmVxSW5mby0+d2RpUE5PU2NhbkluZm8uc2NhblRpbWVycywKKyAgICAgICAgICAgICAgICAmcFBOT1NjYW5SZXFQYXJhbXMtPnNjYW5UaW1lcnMsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHB3ZGlQTk9TY2FuUmVxSW5mby0+d2RpUE5PU2NhbkluZm8uc2NhblRpbWVycykpOworCisgICAvKlByb2JlIHRlbXBsYXRlIGZvciAyLjRHSHogYmFuZCovCisgICBwd2RpUE5PU2NhblJlcUluZm8tPndkaVBOT1NjYW5JbmZvLnVzMjRHUHJvYmVTaXplID0gCisgICAgICAocFBOT1NjYW5SZXFQYXJhbXMtPnVzMjRHUHJvYmVUZW1wbGF0ZUxlbjxXRElfUE5PX01BWF9QUk9CRV9TSVpFKT8KKyAgICAgIHBQTk9TY2FuUmVxUGFyYW1zLT51czI0R1Byb2JlVGVtcGxhdGVMZW46V0RJX1BOT19NQVhfUFJPQkVfU0laRTsgCisKKyAgIHZvc19tZW1fY29weSggJnB3ZGlQTk9TY2FuUmVxSW5mby0+d2RpUE5PU2NhbkluZm8uYTI0R1Byb2JlVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgcFBOT1NjYW5SZXFQYXJhbXMtPnAyNEdQcm9iZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgIHB3ZGlQTk9TY2FuUmVxSW5mby0+d2RpUE5PU2NhbkluZm8udXMyNEdQcm9iZVNpemUpOworCisgICAvKlByb2JlIHRlbXBsYXRlIGZvciA1R0h6IGJhbmQqLworICAgcHdkaVBOT1NjYW5SZXFJbmZvLT53ZGlQTk9TY2FuSW5mby51czVHUHJvYmVTaXplID0gCisgICAgICAocFBOT1NjYW5SZXFQYXJhbXMtPnVzNUdQcm9iZVRlbXBsYXRlTGVuPFdESV9QTk9fTUFYX1BST0JFX1NJWkUpPworICAgICAgcFBOT1NjYW5SZXFQYXJhbXMtPnVzNUdQcm9iZVRlbXBsYXRlTGVuOldESV9QTk9fTUFYX1BST0JFX1NJWkU7IAorCisgICB2b3NfbWVtX2NvcHkoICZwd2RpUE5PU2NhblJlcUluZm8tPndkaVBOT1NjYW5JbmZvLmE1R1Byb2JlVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgcFBOT1NjYW5SZXFQYXJhbXMtPnA1R1Byb2JlVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgcHdkaVBOT1NjYW5SZXFJbmZvLT53ZGlQTk9TY2FuSW5mby51czVHUHJvYmVTaXplKTsKKworICAgcHdkaVBOT1NjYW5SZXFJbmZvLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIGlmKChOVUxMICE9IHBXREEtPndkYU1zZ1BhcmFtKSB8fCAoTlVMTCAhPSBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIiVzOiB3ZGFNc2dQYXJhbSBvciB3ZGFXZGlBcGlNc2dQYXJhbSBpcyBub3QgTlVMTCIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZShwd2RpUE5PU2NhblJlcUluZm8pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIAorICAgLyogU3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2b2lkICopcHdkaVBOT1NjYW5SZXFJbmZvOworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgLyogU3RvcmUgcGFyYW0gcG9pbnRlciBhcyBwYXNzZWQgaW4gYnkgY2FsbGVyICovCisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IHBQTk9TY2FuUmVxUGFyYW1zOworCisgICBzdGF0dXMgPSBXRElfU2V0UHJlZmVycmVkTmV0d29ya1JlcShwd2RpUE5PU2NhblJlcUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9QTk9TY2FuQ2IpV0RBX1BOT1NjYW5SZXFDYWxsYmFjaywgcFdkYVBhcmFtcyk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBTZXQgUE5PIFJFUSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKTsKKyAgICAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gTlVMTDsKKyAgICAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Jzc2lGaWx0ZXJDYWxsYmFjaworICogCisgKi8gCit2b2lkIFdEQV9Sc3NpRmlsdGVyQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIFZPU19BU1NFUlQoTlVMTCAhPSBwV2RhUGFyYW1zKTsKKyAgIAorICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKworICAgcmV0dXJuIDsKK30KKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NTZXRQcmVmZXJyZWROZXR3b3JrTGlzdAorICogUmVxdWVzdCB0byBXREkgdG8gc2V0IFByZWZlcnJlZCBOZXR3b3JrIExpc3QuT2ZmbG9hZAorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1NldFJzc2lGaWx0ZXJSZXEodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJTZXRSU1NJRmlsdGVyUmVxKiBwUnNzaUZpbHRlclBhcmFtcykKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0RJX1NldFJzc2lGaWx0ZXJSZXFQYXJhbXNUeXBlICpwd2RpU2V0UnNzaUZpbHRlclJlcUluZm8gPSAKKyAgICAgIChXRElfU2V0UnNzaUZpbHRlclJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYyhzaXplb2YoV0RJX1NldFJzc2lGaWx0ZXJSZXFQYXJhbXNUeXBlKSkgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gcHdkaVNldFJzc2lGaWx0ZXJSZXFJbmZvKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHB3ZGlTZXRSc3NpRmlsdGVyUmVxSW5mbyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICBwd2RpU2V0UnNzaUZpbHRlclJlcUluZm8tPnJzc2lUaHJlc2hvbGQgPSBwUnNzaUZpbHRlclBhcmFtcy0+cnNzaVRocmVzaG9sZDsKKyAgIHB3ZGlTZXRSc3NpRmlsdGVyUmVxSW5mby0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworCisgICBpZigoTlVMTCAhPSBwV0RBLT53ZGFNc2dQYXJhbSkgfHwgKE5VTEwgIT0gcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICIlczogd2RhTXNnUGFyYW0gb3Igd2RhV2RpQXBpTXNnUGFyYW0gaXMgbm90IE5VTEwiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUocHdkaVNldFJzc2lGaWx0ZXJSZXFJbmZvKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIFN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSAodm9pZCAqKXB3ZGlTZXRSc3NpRmlsdGVyUmVxSW5mbzsKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIC8qIFN0b3JlIHBhcmFtIHBvaW50ZXIgYXMgcGFzc2VkIGluIGJ5IGNhbGxlciAqLworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSBwUnNzaUZpbHRlclBhcmFtczsKKworICAgc3RhdHVzID0gV0RJX1NldFJzc2lGaWx0ZXJSZXEoIHB3ZGlTZXRSc3NpRmlsdGVyUmVxSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX1BOT1NjYW5DYilXREFfUnNzaUZpbHRlckNhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gU2V0IFJTU0kgRmlsdGVyIFJFUSBXREkgQVBJLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSkgOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKTsKKyAgICAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gTlVMTDsKKyAgICAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIENPTlZFUlRfV0RJMlZPU19TVEFUVVMoc3RhdHVzKSA7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1VwZGF0ZVNjYW5QYXJhbXMKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIHVwZGF0ZSBTY2FuIFBhcmFtZXRlcnMKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NVcGRhdGVTY2FuUGFyYW1zKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJVcGRhdGVTY2FuUGFyYW1zICpwVXBkYXRlU2NhblBhcmFtcykKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0RJX1VwZGF0ZVNjYW5QYXJhbXNJbmZvVHlwZSAqd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlID0gCisgICAgICAoV0RJX1VwZGF0ZVNjYW5QYXJhbXNJbmZvVHlwZSAqKXZvc19tZW1fbWFsbG9jKAorICAgICAgICAgc2l6ZW9mKFdESV9VcGRhdGVTY2FuUGFyYW1zSW5mb1R5cGUpKSA7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA7CisgICB2X1U4X3QgaTsgCisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSB3ZGlVcGRhdGVTY2FuUGFyYW1zSW5mb1R5cGUpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYgKCBOVUxMID09IHBXZGFQYXJhbXMgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUod2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIC8vCisgICAvLyBGaWxsIHdkaVVwZGF0ZVNjYW5QYXJhbXNJbmZvVHlwZS0+d2RpVXBkYXRlU2NhblBhcmFtc0luZm8gZnJvbSBwVXBkYXRlU2NhblBhcmFtcworICAgLy8KKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgIlVwZGF0ZSBTY2FuIFBhcmFtZXRlcnMgYjExZEVuYWJsZWQgJWQgYjExZFJlc29sdmVkICVkICIKKyAgICAgICAgICAidWNDaGFubmVsQ291bnQgJWQgdXNQYXNzaXZlTWluQ2hUaW1lICVkIHVzUGFzc2l2ZU1heENoVGltZSIKKyAgICAgICAgICAiICVkIHVzQWN0aXZlTWluQ2hUaW1lICVkIHVzQWN0aXZlTWF4Q2hUaW1lICVkIHNpemVvZiAiCisgICAgICAgICAgInNpciBzdHJ1Y3QgJWQgd2RpIHN0cnVjdCAlZCIsCisgICAgICAgICAgICAgIHBVcGRhdGVTY2FuUGFyYW1zLT5iMTFkRW5hYmxlZCwKKyAgICAgICAgICAgICAgcFVwZGF0ZVNjYW5QYXJhbXMtPmIxMWRSZXNvbHZlZCwKKyAgICAgICAgICAgICAgcFVwZGF0ZVNjYW5QYXJhbXMtPnVjQ2hhbm5lbENvdW50LCAKKyAgICAgICAgICAgICAgcFVwZGF0ZVNjYW5QYXJhbXMtPnVzUGFzc2l2ZU1pbkNoVGltZSwgCisgICAgICAgICAgICAgIHBVcGRhdGVTY2FuUGFyYW1zLT51c1Bhc3NpdmVNYXhDaFRpbWUsIAorICAgICAgICAgICAgICBwVXBkYXRlU2NhblBhcmFtcy0+dXNBY3RpdmVNaW5DaFRpbWUsCisgICAgICAgICAgICAgIHBVcGRhdGVTY2FuUGFyYW1zLT51c0FjdGl2ZU1heENoVGltZSwKKyAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJVcGRhdGVTY2FuUGFyYW1zKSwKKyAgICAgICAgICAgICAgc2l6ZW9mKHdkaVVwZGF0ZVNjYW5QYXJhbXNJbmZvVHlwZS0+d2RpVXBkYXRlU2NhblBhcmFtc0luZm8pICk7IAorCisKKyAgIHdkaVVwZGF0ZVNjYW5QYXJhbXNJbmZvVHlwZS0+d2RpVXBkYXRlU2NhblBhcmFtc0luZm8uYjExZEVuYWJsZWQgID0KKyAgICAgIHBVcGRhdGVTY2FuUGFyYW1zLT5iMTFkRW5hYmxlZDsKKworICAgd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlLT53ZGlVcGRhdGVTY2FuUGFyYW1zSW5mby5iMTFkUmVzb2x2ZWQgPQorICAgICAgcFVwZGF0ZVNjYW5QYXJhbXMtPmIxMWRSZXNvbHZlZDsKKworICAgd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlLT53ZGlVcGRhdGVTY2FuUGFyYW1zSW5mby5jYlN0YXRlID0gCisgICAgICBwVXBkYXRlU2NhblBhcmFtcy0+dWNDQlN0YXRlOworCisgICB3ZGlVcGRhdGVTY2FuUGFyYW1zSW5mb1R5cGUtPndkaVVwZGF0ZVNjYW5QYXJhbXNJbmZvLnVzQWN0aXZlTWF4Q2hUaW1lICA9CisgICAgICBwVXBkYXRlU2NhblBhcmFtcy0+dXNBY3RpdmVNYXhDaFRpbWU7IAorICAgd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlLT53ZGlVcGRhdGVTY2FuUGFyYW1zSW5mby51c0FjdGl2ZU1pbkNoVGltZSAgPSAKKyAgICAgIHBVcGRhdGVTY2FuUGFyYW1zLT51c0FjdGl2ZU1pbkNoVGltZTsKKyAgIHdkaVVwZGF0ZVNjYW5QYXJhbXNJbmZvVHlwZS0+d2RpVXBkYXRlU2NhblBhcmFtc0luZm8udXNQYXNzaXZlTWF4Q2hUaW1lID0gCisgICAgICBwVXBkYXRlU2NhblBhcmFtcy0+dXNQYXNzaXZlTWF4Q2hUaW1lOworICAgd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlLT53ZGlVcGRhdGVTY2FuUGFyYW1zSW5mby51c1Bhc3NpdmVNaW5DaFRpbWUgPSAKKyAgICAgcFVwZGF0ZVNjYW5QYXJhbXMtPnVzUGFzc2l2ZU1pbkNoVGltZTsKKworCisgICB3ZGlVcGRhdGVTY2FuUGFyYW1zSW5mb1R5cGUtPndkaVVwZGF0ZVNjYW5QYXJhbXNJbmZvLnVjQ2hhbm5lbENvdW50ID0gCisgICAgICAocFVwZGF0ZVNjYW5QYXJhbXMtPnVjQ2hhbm5lbENvdW50IDwgV0RJX1BOT19NQVhfTkVUV19DSEFOTkVMUyk/CisgICAgICBwVXBkYXRlU2NhblBhcmFtcy0+dWNDaGFubmVsQ291bnQ6V0RJX1BOT19NQVhfTkVUV19DSEFOTkVMUzsKKworCisgICBmb3IgKCBpID0gMDsgaSA8IAorICAgICAgICAgd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlLT53ZGlVcGRhdGVTY2FuUGFyYW1zSW5mby51Y0NoYW5uZWxDb3VudCA7IAorICAgICAgICAgaSsrKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIlVwZGF0ZSBTY2FuIFBhcmFtZXRlcnMgY2hhbm5lbDogJWQiLAorICAgICAgICAgICAgICAgICBwVXBkYXRlU2NhblBhcmFtcy0+YUNoYW5uZWxzW2ldKTsKKyAgIAorICAgICAgd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlLT53ZGlVcGRhdGVTY2FuUGFyYW1zSW5mby5hQ2hhbm5lbHNbaV0gPSAKKyAgICAgICAgIHBVcGRhdGVTY2FuUGFyYW1zLT5hQ2hhbm5lbHNbaV07CisgICB9CisKKworICAgd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIGlmKChOVUxMICE9IHBXREEtPndkYU1zZ1BhcmFtKSB8fCAoTlVMTCAhPSBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIiVzOiB3ZGFNc2dQYXJhbSBvciB3ZGFXZGlBcGlNc2dQYXJhbSBpcyBub3QgTlVMTCIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKTsKKyAgICAgIHZvc19tZW1fZnJlZSh3ZGlVcGRhdGVTY2FuUGFyYW1zSW5mb1R5cGUpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAgIC8qIFN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSB3ZGlVcGRhdGVTY2FuUGFyYW1zSW5mb1R5cGU7CisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICAvKiBTdG9yZSBwYXJhbSBwb2ludGVyIGFzIHBhc3NlZCBpbiBieSBjYWxsZXIgKi8KKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcFVwZGF0ZVNjYW5QYXJhbXM7CisKKyAKKworICAgc3RhdHVzID0gV0RJX1VwZGF0ZVNjYW5QYXJhbXNSZXEod2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgKFdESV9VcGRhdGVTY2FuUGFyYW1zQ2IpV0RBX1VwZGF0ZVNjYW5QYXJhbXNDYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gVXBkYXRlIFNjYW4gUGFyYW1zIEVRIFdESSBBUEksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisvKgorICogRlVOQ1RJT046IFdEQV84MDIzTXVsdGljYXN0TGlzdFJlcUNhbGxiYWNrCisgKiAKKyAqLyAKK3ZvaWQgV0RBXzgwMjNNdWx0aWNhc3RMaXN0UmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQgKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIAorICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKworICAgLy9wcmludCBhIG1zZywgbm90aGluZyBlbHNlIHRvIGRvCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIldEQV84MDIzTXVsdGljYXN0TGlzdFJlcUNhbGxiYWNrIGludm9rZWQgIiApOworCisgICByZXR1cm4gOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9Qcm9jZXNzODAyM011bHRpY2FzdExpc3RSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIGFkZCA4MDIzIE11bHRpY2FzdCBMaXN0CisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzODAyM011bHRpY2FzdExpc3RSZXEgKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTaXJSY3ZGbHRNY0FkZHJMaXN0ICpwUmN2Rmx0TWNBZGRyTGlzdCkKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0RJX1JjdkZsdFBrdFNldE1jTGlzdFJlcVBhcmFtc1R5cGUgKnB3ZGlGbHRQa3RTZXRNY0xpc3RSZXFQYXJhbXNUeXBlID0gTlVMTDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKyAgIHRBTklfVTggICAgICAgICBpOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIHB3ZGlGbHRQa3RTZXRNY0xpc3RSZXFQYXJhbXNUeXBlID0gCisgICAgICAoV0RJX1JjdkZsdFBrdFNldE1jTGlzdFJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9SY3ZGbHRQa3RTZXRNY0xpc3RSZXFQYXJhbXNUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDsKKyAgIGlmKE5VTEwgPT0gcHdkaUZsdFBrdFNldE1jTGlzdFJlcVBhcmFtc1R5cGUpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgdm9zX21lbV9mcmVlKHB3ZGlGbHRQa3RTZXRNY0xpc3RSZXFQYXJhbXNUeXBlKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIGlmKChOVUxMICE9IHBXREEtPndkYU1zZ1BhcmFtKSB8fCAoTlVMTCAhPSBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIiVzOiB3ZGFNc2dQYXJhbSBvciB3ZGFXZGlBcGlNc2dQYXJhbSBpcyBub3QgTlVMTCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICB2b3NfbWVtX2ZyZWUocHdkaUZsdFBrdFNldE1jTGlzdFJlcVBhcmFtc1R5cGUpOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvLworICAgLy8gRmlsbCBwd2RpRmx0UGt0U2V0TWNMaXN0UmVxUGFyYW1zVHlwZSBmcm9tIHBSY3ZGbHRNY0FkZHJMaXN0CisgICAvLworICAgcHdkaUZsdFBrdFNldE1jTGlzdFJlcVBhcmFtc1R5cGUtPm1jQWRkckxpc3QudWxNdWx0aWNhc3RBZGRyQ250ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSY3ZGbHRNY0FkZHJMaXN0LT51bE11bHRpY2FzdEFkZHJDbnQ7IAorICAgZm9yKCBpID0gMDsgaSA8IHBSY3ZGbHRNY0FkZHJMaXN0LT51bE11bHRpY2FzdEFkZHJDbnQ7IGkrKyApCisgICB7CisgICAgICB2b3NfbWVtX2NvcHkoJihwd2RpRmx0UGt0U2V0TWNMaXN0UmVxUGFyYW1zVHlwZS0+bWNBZGRyTGlzdC5tdWx0aWNhc3RBZGRyW2ldKSwKKyAgICAgICAgICAgICAgICAgICAmKHBSY3ZGbHRNY0FkZHJMaXN0LT5tdWx0aWNhc3RBZGRyW2ldKSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgIH0KKworICAgcHdkaUZsdFBrdFNldE1jTGlzdFJlcVBhcmFtc1R5cGUtPndkaVJlcVN0YXR1c0NCID0gTlVMTDsKKworICAvKiBXREFfVk9TX0FTU0VSVCgoTlVMTCA9PSBwV0RBLT53ZGFNc2dQYXJhbSkgJiYgCisgICAgICAgICAgICAgICAgICAoTlVMTCA9PSBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkpOyAqLworCisgICAvKiBTdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKilwd2RpRmx0UGt0U2V0TWNMaXN0UmVxUGFyYW1zVHlwZTsKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIC8qIFN0b3JlIHBhcmFtIHBvaW50ZXIgYXMgcGFzc2VkIGluIGJ5IGNhbGxlciAqLworICAgcFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0gPSBwUmN2Rmx0TWNBZGRyTGlzdDsKKworICAgc3RhdHVzID0gV0RJXzgwMjNNdWx0aWNhc3RMaXN0UmVxKAorICAgICAgICAgICAgICAgICAgICAgICAgcHdkaUZsdFBrdFNldE1jTGlzdFJlcVBhcmFtc1R5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgKFdESV84MDIzTXVsdGljYXN0TGlzdENiKVdEQV84MDIzTXVsdGljYXN0TGlzdFJlcUNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgcFdkYVBhcmFtcyk7CisKKyAgIGlmKElTX1dESV9TVEFUVVNfRkFJTFVSRShzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiRmFpbHVyZSBpbiBXREFfUHJvY2VzczgwMjNNdWx0aWNhc3RMaXN0UmVxKCksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUmVjZWl2ZUZpbHRlclNldEZpbHRlclJlcUNhbGxiYWNrCisgKiAKKyAqLyAKK3ZvaWQgV0RBX1JlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCAqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qV0RBX1ZPU19BU1NFUlQoTlVMTCAhPSBwV2RhUGFyYW1zKTsqLworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIAorICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKworICAgLy9wcmludCBhIG1zZywgbm90aGluZyBlbHNlIHRvIGRvCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIldEQV9SZWNlaXZlRmlsdGVyU2V0RmlsdGVyUmVxQ2FsbGJhY2sgaW52b2tlZCAiICk7CisKKyAgIHJldHVybiA7Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NSZWNlaXZlRmlsdGVyU2V0RmlsdGVyUmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byBzZXQgUmVjZWl2ZSBGaWx0ZXJzCisgKi8gCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzUmVjZWl2ZUZpbHRlclNldEZpbHRlclJlcSAodFdEQV9DYkNvbnRleHQgKnBXREEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclJjdlBrdEZpbHRlckNmZ1R5cGUgKnBSY3ZQa3RGaWx0ZXJDZmcpCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHZfU0laRV90ICAgYWxsb2NTaXplID0gc2l6ZW9mKFdESV9TZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlKSArIAorICAgICAgKChwUmN2UGt0RmlsdGVyQ2ZnLT5udW1GaWVsZFBhcmFtcyAtIDEpICogc2l6ZW9mKHRTaXJSY3ZQa3RGaWx0ZXJGaWVsZFBhcmFtcykpOworICAgV0RJX1NldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUgKnB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlID0gCisgICAgICAoV0RJX1NldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYyhhbGxvY1NpemUpIDsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKyAgIHRBTklfVTggICAgICAgICBpOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUocHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUtPndkaVBrdEZpbHRlckNmZy5maWx0ZXJJZCA9IHBSY3ZQa3RGaWx0ZXJDZmctPmZpbHRlcklkOworICAgcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUtPndkaVBrdEZpbHRlckNmZy5maWx0ZXJUeXBlID0gcFJjdlBrdEZpbHRlckNmZy0+ZmlsdGVyVHlwZTsgICAKKyAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT53ZGlQa3RGaWx0ZXJDZmcubnVtRmllbGRQYXJhbXMgPSBwUmN2UGt0RmlsdGVyQ2ZnLT5udW1GaWVsZFBhcmFtczsKKyAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT53ZGlQa3RGaWx0ZXJDZmcuY29hbGVzY2VUaW1lID0gcFJjdlBrdEZpbHRlckNmZy0+Y29hbGVzY2VUaW1lOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIkZJRCAlZCBGVCAlZCBOUGFyYW1zICVkIENUICVkIiwKKyAgICAgICAgICAgICAgcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUtPndkaVBrdEZpbHRlckNmZy5maWx0ZXJJZCwgCisgICAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT53ZGlQa3RGaWx0ZXJDZmcuZmlsdGVyVHlwZSwKKyAgICAgICAgICAgICAgcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUtPndkaVBrdEZpbHRlckNmZy5udW1GaWVsZFBhcmFtcywgCisgICAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT53ZGlQa3RGaWx0ZXJDZmcuY29hbGVzY2VUaW1lKTsKKworICAgZm9yICggaSA9IDA7IGkgPCBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxUGFyYW1zVHlwZS0+d2RpUGt0RmlsdGVyQ2ZnLm51bUZpZWxkUGFyYW1zOyBpKysgKQorICAgeworICAgICB3cGFsTWVtb3J5Q29weSgmcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUtPndkaVBrdEZpbHRlckNmZy5wYXJhbXNEYXRhW2ldLAorICAgICAgICAgICAgICAgICAgICAmcFJjdlBrdEZpbHRlckNmZy0+cGFyYW1zRGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT53ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXSkpOworCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgICJQcm90byAlZCBDb21wIEZsYWcgJWQgXG4iLAorICAgICAgICAgICAgICAgICBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxUGFyYW1zVHlwZS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgd2RpUGt0RmlsdGVyQ2ZnLnBhcmFtc0RhdGFbaV0ucHJvdG9jb2xMYXllciwgCisgICAgICAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXS5jbXBGbGFnKTsKKworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICAgICAiRGF0YSBPZmZzZXQgJWQgRGF0YSBMZW4gJWRcbiIsCisgICAgICAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXS5kYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUtPgorICAgICAgICAgICAgICAgICAgICAgICAgIHdkaVBrdEZpbHRlckNmZy5wYXJhbXNEYXRhW2ldLmRhdGFMZW5ndGgpOworCisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgICJDRGF0YTogJWQ6JWQ6JWQ6JWQ6JWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXS5jb21wYXJlRGF0YVswXSwgCisgICAgICAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXS5jb21wYXJlRGF0YVsxXSwgCisgICAgICAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXS5jb21wYXJlRGF0YVsyXSwgCisgICAgICAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXS5jb21wYXJlRGF0YVszXSwKKyAgICAgICAgICAgICAgICAgcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUtPgorICAgICAgICAgICAgICAgICAgICAgICAgIHdkaVBrdEZpbHRlckNmZy5wYXJhbXNEYXRhW2ldLmNvbXBhcmVEYXRhWzRdLCAKKyAgICAgICAgICAgICAgICAgcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUtPgorICAgICAgICAgICAgICAgICAgICAgICAgIHdkaVBrdEZpbHRlckNmZy5wYXJhbXNEYXRhW2ldLmNvbXBhcmVEYXRhWzVdKTsKKworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sIAorICAgICAgICAgICAgICAgICAiTURhdGE6ICVkOiVkOiVkOiVkOiVkOiVkXG4iLAorICAgICAgICAgICAgICAgICBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxUGFyYW1zVHlwZS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgd2RpUGt0RmlsdGVyQ2ZnLnBhcmFtc0RhdGFbaV0uZGF0YU1hc2tbMF0sIAorICAgICAgICAgICAgICAgICBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxUGFyYW1zVHlwZS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgd2RpUGt0RmlsdGVyQ2ZnLnBhcmFtc0RhdGFbaV0uZGF0YU1hc2tbMV0sIAorICAgICAgICAgICAgICAgICBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxUGFyYW1zVHlwZS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgd2RpUGt0RmlsdGVyQ2ZnLnBhcmFtc0RhdGFbaV0uZGF0YU1hc2tbMl0sIAorICAgICAgICAgICAgICAgICBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxUGFyYW1zVHlwZS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgd2RpUGt0RmlsdGVyQ2ZnLnBhcmFtc0RhdGFbaV0uZGF0YU1hc2tbM10sCisgICAgICAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXS5kYXRhTWFza1s0XSwgCisgICAgICAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFQYXJhbXNUeXBlLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXS5kYXRhTWFza1s1XSk7CisKKyAgIH0KKworICAgcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUtPndkaVJlcVN0YXR1c0NCID0gTlVMTDsKKworICAgLyogU3RvcmUgUGFyYW1zIHBhc3MgaXQgdG8gV0RJICovCisgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9ICh2b2lkICopcHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGU7CisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICAvKiBTdG9yZSBwYXJhbSBwb2ludGVyIGFzIHBhc3NlZCBpbiBieSBjYWxsZXIgKi8KKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcFJjdlBrdEZpbHRlckNmZzsKKworICAgc3RhdHVzID0gV0RJX1JlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJSZXEocHdkaVNldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUsCisgICAgICAgICAgIChXRElfUmVjZWl2ZUZpbHRlclNldEZpbHRlckNiKVdEQV9SZWNlaXZlRmlsdGVyU2V0RmlsdGVyUmVxQ2FsbGJhY2ssCisgICAgICAgICAgIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gU2V0RmlsdGVyKCksZnJlZSBhbGwgdGhlIG1lbW9yeSxzdGF0dXMgJWQgIixzdGF0dXMpOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfRmlsdGVyTWF0Y2hDb3VudFJlcUNhbGxiYWNrCisgKiAKKyAqLyAKK3ZvaWQgV0RBX0ZpbHRlck1hdGNoQ291bnRSZXFDYWxsYmFjayhXRElfU3RhdHVzIHN0YXR1cywgdm9pZCAqIHBVc2VyRGF0YSkKK3sKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopcFVzZXJEYXRhOworICAgdFdEQV9DYkNvbnRleHQgKnBXREE7CisgICB0cFNpclJjdkZsdFBrdE1hdGNoUnNwIHBSY3ZGbHRQa3RNYXRjaENudFJlcTsKKyAgIHRwU2lyUmN2Rmx0UGt0TWF0Y2hSc3AgcFJjdkZsdFBrdE1hdGNoQ250UnNwID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRTaXJSY3ZGbHRQa3RNYXRjaFJzcCkpOworICAgdEFOSV9VOCAgICAgICAgIGk7CisgICB2b3NfbXNnX3Qgdm9zTXNnOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LS0tLS0tICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qV0RBX1ZPU19BU1NFUlQoTlVMTCAhPSBwV2RhUGFyYW1zKTsqLworCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKworICAgcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXBXZGFQYXJhbXMtPnBXZGFDb250ZXh0IDsKKyAgIHBSY3ZGbHRQa3RNYXRjaENudFJlcSA9ICh0cFNpclJjdkZsdFBrdE1hdGNoUnNwKXBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtOworCisgICAvLyBGaWxsIHBSY3ZGbHRQa3RNYXRjaENudFJzcCBmcm9tIHBSY3ZGbHRQa3RNYXRjaENudFJlcQorICAgdm9zX21lbV96ZXJvKHBSY3ZGbHRQa3RNYXRjaENudFJzcCxzaXplb2YodFNpclJjdkZsdFBrdE1hdGNoUnNwKSk7CisKKyAgIC8qIE1lc3NhZ2UgSGVhZGVyICovCisgICBwUmN2Rmx0UGt0TWF0Y2hDbnRSc3AtPm1lc2dUeXBlID0gZVdOSV9QTUNfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JTUDsKKyAgIHBSY3ZGbHRQa3RNYXRjaENudFJzcC0+bWVzZ0xlbiA9IHNpemVvZih0U2lyUmN2Rmx0UGt0TWF0Y2hSc3ApOworCisgICBwUmN2Rmx0UGt0TWF0Y2hDbnRSc3AtPnN0YXR1cyA9IHBSY3ZGbHRQa3RNYXRjaENudFJlcS0+c3RhdHVzOworCisgICBmb3IgKGkgPSAwOyBpIDwgU0lSX01BWF9OVU1fRklMVEVSUzsgaSsrKQorICAgeyAgIAorICAgICAgcFJjdkZsdFBrdE1hdGNoQ250UnNwLT5maWx0ZXJNYXRjaENudFtpXS5maWx0ZXJJZCA9IHBSY3ZGbHRQa3RNYXRjaENudFJlcS0+ZmlsdGVyTWF0Y2hDbnRbaV0uZmlsdGVySWQ7CisgICAgICBwUmN2Rmx0UGt0TWF0Y2hDbnRSc3AtPmZpbHRlck1hdGNoQ250W2ldLm1hdGNoQ250ID0gcFJjdkZsdFBrdE1hdGNoQ250UmVxLT5maWx0ZXJNYXRjaENudFtpXS5tYXRjaENudDsKKyAgIH0KKworICAgLyogVk9TIG1lc3NhZ2Ugd3JhcHBlciAqLworICAgdm9zTXNnLnR5cGUgPSBlV05JX1BNQ19QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUlNQOworICAgdm9zTXNnLmJvZHlwdHIgPSAodm9pZCAqKXBSY3ZGbHRQa3RNYXRjaENudFJzcDsKKyAgIHZvc01zZy5ib2R5dmFsID0gMDsKKyAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX21xX3Bvc3RfbWVzc2FnZShWT1NfTVFfSURfU01FLCAodm9zX21zZ190Kikmdm9zTXNnKSkKKyAgIHsKKyAgICAgIC8qIGZyZWUgdGhlIG1lbSBhbmQgcmV0dXJuICovCisgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICopcFJjdkZsdFBrdE1hdGNoQ250UnNwKTsKKyAgIH0KKworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1BhY2tldEZpbHRlck1hdGNoQ291bnRSZXEKKyAqIFJlcXVlc3QgdG8gV0RJIHRvIGdldCBQQyBGaWx0ZXIgTWF0Y2ggQ291bnQKKyAqLyAKK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NQYWNrZXRGaWx0ZXJNYXRjaENvdW50UmVxICh0V0RBX0NiQ29udGV4dCAqcFdEQSwgdHBTaXJSY3ZGbHRQa3RNYXRjaFJzcCBwUmN2Rmx0UGt0TWF0Y2hSc3ApCit7CisgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIFdESV9SY3ZGbHRQa3RNYXRjaENudFJlcVBhcmFtc1R5cGUgKnB3ZGlSY3ZGbHRQa3RNYXRjaENudFJlcVBhcmFtc1R5cGUgPSAKKyAgICAgIChXRElfUmN2Rmx0UGt0TWF0Y2hDbnRSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKFdESV9SY3ZGbHRQa3RNYXRjaENudFJlcVBhcmFtc1R5cGUpKTsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHB3ZGlSY3ZGbHRQa3RNYXRjaENudFJlcVBhcmFtc1R5cGUpIAorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICBwV2RhUGFyYW1zID0gKHRXREFfUmVxUGFyYW1zICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKHRXREFfUmVxUGFyYW1zKSkgOworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBWT1MgTUVNIEFsbG9jIEZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUocHdkaVJjdkZsdFBrdE1hdGNoQ250UmVxUGFyYW1zVHlwZSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICBpZigoTlVMTCAhPSBwV0RBLT53ZGFNc2dQYXJhbSkgfHwgKE5VTEwgIT0gcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICIlczogd2RhTXNnUGFyYW0gb3Igd2RhV2RpQXBpTXNnUGFyYW0gaXMgbm90IE5VTEwiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUocHdkaVJjdkZsdFBrdE1hdGNoQ250UmVxUGFyYW1zVHlwZSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHB3ZGlSY3ZGbHRQa3RNYXRjaENudFJlcVBhcmFtc1R5cGUtPndkaVJlcVN0YXR1c0NCID0gTlVMTDsKKworCisgICAvKiBTdG9yZSBQYXJhbXMgcGFzcyBpdCB0byBXREkgKi8KKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gKHZvaWQgKilwd2RpUmN2Rmx0UGt0TWF0Y2hDbnRSZXFQYXJhbXNUeXBlOworICAgcFdkYVBhcmFtcy0+cFdkYUNvbnRleHQgPSBwV0RBOworICAgLyogU3RvcmUgcGFyYW0gcG9pbnRlciBhcyBwYXNzZWQgaW4gYnkgY2FsbGVyICovCisgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IHBSY3ZGbHRQa3RNYXRjaFJzcDsKKworICAgc3RhdHVzID0gV0RJX0ZpbHRlck1hdGNoQ291bnRSZXEocHdkaVJjdkZsdFBrdE1hdGNoQ250UmVxUGFyYW1zVHlwZSwgCisgICAgICAgICAgICAgICAgIChXRElfRmlsdGVyTWF0Y2hDb3VudENiKVdEQV9GaWx0ZXJNYXRjaENvdW50UmVxQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIC8qIGZhaWx1cmUgcmV0dXJuZWQgYnkgV0RJIEFQSSAqLworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiRmFpbHVyZSBpbiBXRElfRmlsdGVyTWF0Y2hDb3VudFJlcSgpLCBmcmVlIGFsbCB0aGUgbWVtb3J5ICIgKTsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgICAgcFJjdkZsdFBrdE1hdGNoUnNwLT5zdGF0dXMgPSBlU0lSX0ZBSUxVUkUgOworICAgICAgV0RBX1NlbmRNc2cocFdEQSwgV0RBX1BBQ0tFVF9DT0FMRVNDSU5HX0ZJTFRFUl9NQVRDSF9DT1VOVF9SU1AsICh2b2lkICopcFJjdkZsdFBrdE1hdGNoUnNwLCAwKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9SZWNlaXZlRmlsdGVyU2V0RmlsdGVyUmVxQ2FsbGJhY2sKKyAqIAorICovIAordm9pZCBXREFfUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyUmVxQ2FsbGJhY2soV0RJX1N0YXR1cyBzdGF0dXMsIHZvaWQgKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC0tLS0tLSAlcyAiICxfX0ZVTkNUSU9OX18pOworCisvKiAgIFdEQV9WT1NfQVNTRVJUKE5VTEwgIT0gcFdkYVBhcmFtcyk7ICovCisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogcFdkYVBhcmFtcyByZWNlaXZlZCBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCkgOworICAgICAgcmV0dXJuIDsKKyAgIH0KKyAgIAorICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtKSA7CisgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMpIDsKKworICAgLy9wcmludCBhIG1zZywgbm90aGluZyBlbHNlIHRvIGRvCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIldEQV9SZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJSZXFDYWxsYmFjayBpbnZva2VkICIgKTsKKworICAgcmV0dXJuIDsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlclJlcQorICogUmVxdWVzdCB0byBXREkgdG8gY2xlYXIgUmVjZWl2ZSBGaWx0ZXJzCisgKi8KK1ZPU19TVEFUVVMgV0RBX1Byb2Nlc3NSZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJSZXEgKHRXREFfQ2JDb250ZXh0ICpwV0RBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpclJjdkZsdFBrdENsZWFyUGFyYW0gKnBSY3ZGbHRQa3RDbGVhclBhcmFtKQoreworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICBXRElfUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlICpwd2RpUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlID0KKyAgICAgIChXRElfUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlICopdm9zX21lbV9tYWxsb2Moc2l6ZW9mKFdESV9SY3ZGbHRQa3RDbGVhclJlcVBhcmFtc1R5cGUpKTsKKyAgIHRXREFfUmVxUGFyYW1zICpwV2RhUGFyYW1zIDsKKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICBpZihOVUxMID09IHB3ZGlSY3ZGbHRQa3RDbGVhclJlcVBhcmFtc1R5cGUpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICB2b3NfbWVtX2ZyZWUocHdkaVJjdkZsdFBrdENsZWFyUmVxUGFyYW1zVHlwZSk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX05PTUVNOworICAgfQorCisgICBwd2RpUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlLT5maWx0ZXJDbGVhclBhcmFtLnN0YXR1cyA9IHBSY3ZGbHRQa3RDbGVhclBhcmFtLT5zdGF0dXM7CisgICBwd2RpUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlLT5maWx0ZXJDbGVhclBhcmFtLmZpbHRlcklkID0gcFJjdkZsdFBrdENsZWFyUGFyYW0tPmZpbHRlcklkOworCisgICBwd2RpUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIC8qIFN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSAodm9pZCAqKXB3ZGlSY3ZGbHRQa3RDbGVhclJlcVBhcmFtc1R5cGU7CisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICAvKiBTdG9yZSBwYXJhbSBwb2ludGVyIGFzIHBhc3NlZCBpbiBieSBjYWxsZXIgKi8KKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcFJjdkZsdFBrdENsZWFyUGFyYW07CisKKyAgIHN0YXR1cyA9IFdESV9SZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJSZXEocHdkaVJjdkZsdFBrdENsZWFyUmVxUGFyYW1zVHlwZSwKKyAgICAgICAoV0RJX1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlckNiKVdEQV9SZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJSZXFDYWxsYmFjaywKKyAgICAgICBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYWlsdXJlIGluIFdEQV9Qcm9jZXNzUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyUmVxKCksIGZyZWUgYWxsIHRoZSBtZW1vcnkgIiApOworICAgICAgdm9zX21lbV9mcmVlKHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtKSA7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisKKworLyoKKyAqIEZVTkNUSU9OOiBXREFfUHJvY2Vzc1NldFBvd2VyUGFyYW1zUmVxCisgKiBSZXF1ZXN0IHRvIFdESSB0byBzZXQgcG93ZXIgcGFyYW1zIAorICovIAorVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1NldFBvd2VyUGFyYW1zUmVxKHRXREFfQ2JDb250ZXh0ICpwV0RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U2lyU2V0UG93ZXJQYXJhbXNSZXEgKnBQb3dlclBhcmFtcykKK3sKKyAgIFZPU19TVEFUVVMgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgV0RJX1NldFBvd2VyUGFyYW1zUmVxUGFyYW1zVHlwZSAqcHdkaVNldFBvd2VyUGFyYW1zUmVxSW5mbyA9IAorICAgICAgKFdESV9TZXRQb3dlclBhcmFtc1JlcVBhcmFtc1R5cGUgKil2b3NfbWVtX21hbGxvYyhzaXplb2YoV0RJX1NldFBvd2VyUGFyYW1zUmVxUGFyYW1zVHlwZSkpIDsKKworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworCisgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tLS0+ICVzICIgLF9fRlVOQ1RJT05fXyk7CisKKyAgIGlmKE5VTEwgPT0gcHdkaVNldFBvd2VyUGFyYW1zUmVxSW5mbykgCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIHBXZGFQYXJhbXMgPSAodFdEQV9SZXFQYXJhbXMgKil2b3NfbWVtX21hbGxvYyhzaXplb2YodFdEQV9SZXFQYXJhbXMpKSA7CisgICBpZihOVUxMID09IHBXZGFQYXJhbXMpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZPUyBNRU0gQWxsb2MgRmFpbHVyZSIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZShwd2RpU2V0UG93ZXJQYXJhbXNSZXFJbmZvKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIAorICAgcHdkaVNldFBvd2VyUGFyYW1zUmVxSW5mby0+d2RpU2V0UG93ZXJQYXJhbXNJbmZvLnVJZ25vcmVEVElNICAgICAgID0gCisgICAgICBwUG93ZXJQYXJhbXMtPnVJZ25vcmVEVElNOworCisgICBwd2RpU2V0UG93ZXJQYXJhbXNSZXFJbmZvLT53ZGlTZXRQb3dlclBhcmFtc0luZm8udURUSU1QZXJpb2QgICAgICAgPSAKKyAgICAgIHBQb3dlclBhcmFtcy0+dURUSU1QZXJpb2Q7CisKKyAgIHB3ZGlTZXRQb3dlclBhcmFtc1JlcUluZm8tPndkaVNldFBvd2VyUGFyYW1zSW5mby51TGlzdGVuSW50ZXJ2YWwgICA9IAorICAgICAgcFBvd2VyUGFyYW1zLT51TGlzdGVuSW50ZXJ2YWw7CisgICBwd2RpU2V0UG93ZXJQYXJhbXNSZXFJbmZvLT53ZGlTZXRQb3dlclBhcmFtc0luZm8udUJjYXN0TWNhc3RGaWx0ZXIgPSAKKyAgICAgIHBQb3dlclBhcmFtcy0+dUJjYXN0TWNhc3RGaWx0ZXI7CisgICBwd2RpU2V0UG93ZXJQYXJhbXNSZXFJbmZvLT53ZGlTZXRQb3dlclBhcmFtc0luZm8udUVuYWJsZUJFVCAgICAgICAgPSAKKyAgICAgIHBQb3dlclBhcmFtcy0+dUVuYWJsZUJFVDsKKyAgIHB3ZGlTZXRQb3dlclBhcmFtc1JlcUluZm8tPndkaVNldFBvd2VyUGFyYW1zSW5mby51QkVUSW50ZXJ2YWwgICAgICA9IAorICAgICAgcFBvd2VyUGFyYW1zLT51QkVUSW50ZXJ2YWw7IAorCisgICBwd2RpU2V0UG93ZXJQYXJhbXNSZXFJbmZvLT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisKKyAgIGlmKChOVUxMICE9IHBXREEtPndkYU1zZ1BhcmFtKSB8fCAoTlVMTCAhPSBwV0RBLT53ZGFXZGlBcGlNc2dQYXJhbSkpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgIiVzOiB3ZGFNc2dQYXJhbSBvciB3ZGFXZGlBcGlNc2dQYXJhbSBpcyBub3QgTlVMTCIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIHZvc19tZW1fZnJlZShwd2RpU2V0UG93ZXJQYXJhbXNSZXFJbmZvKSA7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcyk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIFN0b3JlIFBhcmFtcyBwYXNzIGl0IHRvIFdESSAqLworICAgcFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0gPSAodm9pZCAqKXB3ZGlTZXRQb3dlclBhcmFtc1JlcUluZm87CisgICBwV2RhUGFyYW1zLT5wV2RhQ29udGV4dCA9IHBXREE7CisgICAvKiBTdG9yZSBwYXJhbSBwb2ludGVyIGFzIHBhc3NlZCBpbiBieSBjYWxsZXIgKi8KKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gcFBvd2VyUGFyYW1zOworCisgICBzdGF0dXMgPSBXRElfU2V0UG93ZXJQYXJhbXNSZXEoIHB3ZGlTZXRQb3dlclBhcmFtc1JlcUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9TZXRQb3dlclBhcmFtc0NiKVdEQV9TZXRQb3dlclBhcmFtc0NhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXZGFQYXJhbXMpOworCisgICBpZihJU19XRElfU1RBVFVTX0ZBSUxVUkUoc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZhaWx1cmUgaW4gU2V0IHBvd2VyIHBhcmFtcyBSRVEgV0RJIEFQSSwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhV2RpQXBpTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSk7CisgICAgICBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSA9IE5VTEw7CisgICAgICBwV2RhUGFyYW1zLT53ZGFNc2dQYXJhbSA9IE5VTEw7CisgICB9CisKKyAgIHJldHVybiBDT05WRVJUX1dESTJWT1NfU1RBVFVTKHN0YXR1cykgOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9TZXRUbUxldmVsUnNwQ2FsbGJhY2sKKyAqIFNldCBUTSBMZXZlbCByZXNwb25zZQorICovIAordm9pZCBXREFfU2V0VG1MZXZlbFJzcENhbGxiYWNrKFdESV9TdGF0dXMgc3RhdHVzLCB2b2lkKiBwVXNlckRhdGEpCit7CisgICB0V0RBX1JlcVBhcmFtcyAqcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXBVc2VyRGF0YTsgCisKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwtLS0tLS0gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoTlVMTCA9PSBwV2RhUGFyYW1zKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiJXM6IHBXZGFQYXJhbXMgcmVjZWl2ZWQgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBWT1NfQVNTRVJUKDApIDsKKyAgICAgIHJldHVybiA7CisgICB9CisKKyAgIC8qIERvc2Ugbm90IG5lZWQgdG8gc2VuZCBub3RpZmljYXRpb24gdG8gdXBwZXIgbGF5ZXIKKyAgICAqIEp1c3QgZnJlZSBhbGxvY2F0ZWQgcmVzb3VyY2VzICovCisgICBpZiggcFdkYVBhcmFtcyAhPSBOVUxMICkKKyAgIHsKKyAgICAgIGlmKCBwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSAhPSBOVUxMICkKKyAgICAgIHsKKyAgICAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB9CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zKSA7CisgICB9Cit9CisKKy8qCisgKiBGVU5DVElPTjogV0RBX1Byb2Nlc3NTZXRUbUxldmVsUmVxCisgKiBTZXQgVE0gTGV2ZWwgcmVxdWVzdAorICovCitWT1NfU1RBVFVTIFdEQV9Qcm9jZXNzU2V0VG1MZXZlbFJlcSh0V0RBX0NiQ29udGV4dCAqcFdEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBbmlTZXRUbUxldmVsUmVxICpzZXRUbUxldmVsUmVxKQoreworICAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1MgOworICAgdFdEQV9SZXFQYXJhbXMgKnBXZGFQYXJhbXMgOworICAgV0RJX1NldFRtTGV2ZWxSZXFUeXBlICp3ZGlTZXRUbUxldmVsUmVxID0gCisgICAgICAgICAgICAgICAoV0RJX1NldFRtTGV2ZWxSZXFUeXBlICopdm9zX21lbV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0RJX1NldFRtTGV2ZWxSZXFUeXBlKSkgOworICAgaWYoTlVMTCA9PSB3ZGlTZXRUbUxldmVsUmVxKSAKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgcFdkYVBhcmFtcyA9ICh0V0RBX1JlcVBhcmFtcyAqKXZvc19tZW1fbWFsbG9jKHNpemVvZih0V0RBX1JlcVBhcmFtcykpIDsKKyAgIGlmKE5VTEwgPT0gcFdkYVBhcmFtcykKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVk9TIE1FTSBBbGxvYyBGYWlsdXJlIiwgX19GVU5DVElPTl9fKTsgCisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgdm9zX21lbV9mcmVlKHdkaVNldFRtTGV2ZWxSZXEpOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKKyAgIH0KKworICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tPiAlcyAiICxfX0ZVTkNUSU9OX18pOworCisgICB3ZGlTZXRUbUxldmVsUmVxLT50bU1vZGUgID0gc2V0VG1MZXZlbFJlcS0+dG1Nb2RlOworICAgd2RpU2V0VG1MZXZlbFJlcS0+dG1MZXZlbCA9IHNldFRtTGV2ZWxSZXEtPm5ld1RtTGV2ZWw7CisKKyAgIHBXZGFQYXJhbXMtPnBXZGFDb250ZXh0ID0gcFdEQTsKKyAgIHBXZGFQYXJhbXMtPndkYU1zZ1BhcmFtID0gc2V0VG1MZXZlbFJlcTsKKyAgIHBXZGFQYXJhbXMtPndkYVdkaUFwaU1zZ1BhcmFtID0gd2RpU2V0VG1MZXZlbFJlcTsKKworICAgc3RhdHVzID0gV0RJX1NldFRtTGV2ZWxSZXEod2RpU2V0VG1MZXZlbFJlcSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX1NldFRtTGV2ZWxDYilXREFfU2V0VG1MZXZlbFJzcENhbGxiYWNrLCBwV2RhUGFyYW1zKTsKKworICAgaWYoSVNfV0RJX1NUQVRVU19GQUlMVVJFKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJGYWlsdXJlIHNldCB0aGVybmFsIG1pdGlnYXRpb24gbGV2ZWwgZnJlZSBhbGwgdGhlIG1lbW9yeSAiICk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcy0+d2RhTXNnUGFyYW0pIDsKKyAgICAgIHZvc19tZW1fZnJlZShwV2RhUGFyYW1zLT53ZGFXZGlBcGlNc2dQYXJhbSk7CisgICAgICB2b3NfbWVtX2ZyZWUocFdkYVBhcmFtcykgOworICAgfQorCisgICByZXR1cm4gQ09OVkVSVF9XREkyVk9TX1NUQVRVUyhzdGF0dXMpIDsKK30KKworVk9TX1NUQVRVUyBXREFfUHJvY2Vzc1R4Q29udHJvbEluZCh0V0RBX0NiQ29udGV4dCAqcFdEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBUeENvbnRyb2xQYXJhbXMgcFR4Q3RybFBhcmFtKQoreworICAgVk9TX1NUQVRVUyB3ZGFTdGF0dXM7CisgICAKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0tLT4gJXMgIiAsX19GVU5DVElPTl9fKTsKKworICAgaWYoIHBUeEN0cmxQYXJhbSA9PSBOVUxMICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogSW5wdXQgdHBUeENvbnRyb2xQYXJhbXMgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBpZiggcFR4Q3RybFBhcmFtLT5zdG9wVHggPT0gZUFOSV9CT09MRUFOX1RSVUUgKQorICAgeworICAgICAgd2RhU3RhdHVzID0gV0RBX1N1c3BlbmREYXRhVHgocFdEQSk7CisgICB9CisgICBlbHNlIC8qIHBUeEN0cmxQYXJhbS0+c3RvcFR4ID09IGVBTklfQk9PTEVBTl9GQUxTRSAqLworICAgeworICAgICAgd2RhU3RhdHVzID0gV0RBX1Jlc3VtZURhdGFUeChwV0RBKTsKKyAgIH0KKworICAgcmV0dXJuIHdkYVN0YXR1czsKK30KKworIC8qICBGVU5DVElPTiAgICBXREFfZmVhdHVyZUNhcHNFeGNoYW5nZQorICAqICBXREEgQVBJIHRvIGludm9rZSBjYXBhYmlsaXR5IGV4Y2hhbmdlIGJldHdlZW4gaG9zdCBhbmQgRlcuCisgICovCit2b2lkIFdEQV9mZWF0dXJlQ2Fwc0V4Y2hhbmdlKHZfUFZPSURfdCBwVm9zQ29udGV4dCkKK3sKKyAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgIiVzOmVudGVyIiwgX19GVU5DVElPTl9fICk7CisgICBXRElfZmVhdHVyZUNhcHNFeGNoYW5nZVJlcSggTlVMTCwgcFZvc0NvbnRleHQpOworfQorCisgLyogIEZVTkNUSU9OICAgIFdEQV9nZXRIb3N0V2xhbkZlYXRDYXBzCisgICogIFdyYXBwZXIgZm9yIFdESSBBUEksIHRoYXQgd2lsbCByZXR1cm4gaWYgdGhlIGZlYXR1cmUgKGVudW0gdmFsdWUpLnBhc3NlZAorICAqICB0byB0aGlzIEFQSSBpcyBzdXBwb3J0ZWQgb3Igbm90IGluIEhvc3QKKyAgKiAgcmV0dXJuIHZhbHVlCisgICogICAgIDAgLSBpbXBsaWVzIGZlYXR1cmUgaXMgTk9UIFN1cHBvcnRlZAorICAqICAgICBhbnkgbm9uIHplcm8gdmFsdWUgLSBpbXBsaWVzIGZlYXR1cmUgaXMgU1VQUE9SVEVECisgICovCit0QU5JX1U4IFdEQV9nZXRIb3N0V2xhbkZlYXRDYXBzKHRBTklfVTggZmVhdEVudW1WYWx1ZSkKK3sKKyAgIHJldHVybiBXRElfZ2V0SG9zdFdsYW5GZWF0Q2FwcyhmZWF0RW51bVZhbHVlKTsKK30KKworIC8qICBGVU5DVElPTiAgICBXREFfZ2V0RndXbGFuRmVhdENhcHMKKyAgKiAgV3JhcHBlciBmb3IgV0RJIEFQSSwgdGhhdCB3aWxsIHJldHVybiBpZiB0aGUgZmVhdHVyZSAoZW51bSB2YWx1ZSkucGFzc2VkCisgICogIHRvIHRoaXMgQVBJIGlzIHN1cHBvcnRlZCBvciBub3QgaW4gRlcKKyAgKiAgcmV0dXJuIHZhbHVlCisgICogICAgIDAgLSBpbXBsaWVzIGZlYXR1cmUgaXMgTk9UIFN1cHBvcnRlZAorICAqICAgICBhbnkgbm9uIHplcm8gdmFsdWUgLSBpbXBsaWVzIGZlYXR1cmUgaXMgU1VQUE9SVEVECisgICovCit0QU5JX1U4IFdEQV9nZXRGd1dsYW5GZWF0Q2Fwcyh0QU5JX1U4IGZlYXRFbnVtVmFsdWUpCit7CisgICByZXR1cm4gV0RJX2dldEZ3V2xhbkZlYXRDYXBzKGZlYXRFbnVtVmFsdWUpOworfQorCisvKgorICogRlVOQ1RJT046IFdEQV9zaHV0ZG93bgorICogU2h1dGRvd24gV0RBL1dESSB3aXRob3V0IGhhbmRzaGFraW5nIHdpdGggUml2YS4KKyAqIFN5bmNocm9ub3VzIGZ1bmN0aW9uLgorICovCitWT1NfU1RBVFVTIFdEQV9zaHV0ZG93bih2X1BWT0lEX3QgcFZvc0NvbnRleHQsIHdwdF9ib29sZWFuIGNsb3NlVHJhbnNwb3J0KQoreworICAgV0RJX1N0YXR1cyB3ZGlTdGF0dXM7CisgICAvL3RBTklfVTggICAgZXZlbnRJZHggPSAwOworICAgVk9TX1NUQVRVUyBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICB0V0RBX0NiQ29udGV4dCAqcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKVZPU19HRVRfV0RBX0NUWFQocFZvc0NvbnRleHQpOworCisgICBpZiAoTlVMTCA9PSBwV0RBKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIiVzOiBJbnZva2VkIHdpdGggaW52YWxpZCBwV0RBIiwgX19GVU5DVElPTl9fICk7CisgICAgICBWT1NfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKiBGVE0gbW9kZSBzdGF5IFNUQVJUX1NUQVRFICovCisgICBpZiggKFdEQV9SRUFEWV9TVEFURSAhPSBwV0RBLT53ZGFTdGF0ZSkgJiYKKyAgICAgICAgIChXREFfSU5JVF9TVEFURSAhPSBwV0RBLT53ZGFTdGF0ZSkgJiYKKyAgICAgICAgIChXREFfU1RBUlRfU1RBVEUgIT0gcFdEQS0+d2RhU3RhdGUpICkKKyAgIHsKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICB9CisKKyAgIGlmKE5VTEwgIT0gcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6d2RhV2RpQXBpTXNnUGFyYW0gaXMgbm90IE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgVk9TX0FTU0VSVCgwKTsKKyAgICAgIC8qIHRoZSBsYXN0IHJlcXVlc3Qgd2FzIG5vdCBmcmVlZCwgcHJvYmFibHkgYSBTU1IKKyAgICAgICAqIGluaXRpYXRlZCBieSBXTEFOIGRyaXZlciAoV0RJIHRpbWVvdXQpICovCisgICAgICB2b3NfbWVtX2ZyZWUocFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0pOworICAgfQorCisgICBpZiAoIGVEUklWRVJfVFlQRV9NRkcgIT0gcFdEQS0+ZHJpdmVyTW9kZSApCisgICB7CisgICAgICB3ZGFEZXN0cm95VGltZXJzKHBXREEpOworICAgfQorICAgcFdEQS0+d2RhV2RpQXBpTXNnUGFyYW0gPSBOVUxMOworCisgICAvKiBjYWxsIFdESSBzaHV0ZG93biAqLworICAgd2RpU3RhdHVzID0gV0RJX1NodXRkb3duKGNsb3NlVHJhbnNwb3J0KTsKKworICAgaWYgKElTX1dESV9TVEFUVVNfRkFJTFVSRSh3ZGlTdGF0dXMpICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgaW4gV0RBIFN0b3AiICk7CisgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIC8qIFdESSBzdG9wIGlzIHN5bmNocm5vdXMsIHNodXRkb3duIGlzIGNvbXBsZXRlIHdoZW4gaXQgcmV0dXJucyAqLworICAgcFdEQS0+d2RhU3RhdGUgPSBXREFfU1RPUF9TVEFURTsKKworCisgICAvKiBzaHV0ZG93biBzaG91bGQgcGVyZm9ybSB0aGUgc3RvcCAmIGNsb3NlIGFjdGlvbnMuICovCisgICAvKiBEZXN0cm95IHRoZSBldmVudCAqLworICAgc3RhdHVzID0gdm9zX2V2ZW50X2Rlc3Ryb3koJnBXREEtPnR4RnJhbWVFdmVudCk7CisgICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiVk9TIEV2ZW50IGRlc3Ryb3kgZmFpbGVkIC0gc3RhdHVzID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIHN0YXR1cyA9IHZvc19ldmVudF9kZXN0cm95KCZwV0RBLT5zdXNwZW5kRGF0YVR4RXZlbnQpOworICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIlZPUyBFdmVudCBkZXN0cm95IGZhaWxlZCAtIHN0YXR1cyA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisgICBzdGF0dXMgPSB2b3NfZXZlbnRfZGVzdHJveSgmcFdEQS0+d2FpdE9uV2RpSW5kaWNhdGlvbkNhbGxCYWNrKTsKKyAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJWT1MgRXZlbnQgZGVzdHJveSBmYWlsZWQgLSBzdGF0dXMgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKiBmcmVlIFdEQSBjb250ZXh0ICovCisgICBzdGF0dXMgPSB2b3NfZnJlZV9jb250ZXh0KHBWb3NDb250ZXh0LFZPU19NT0RVTEVfSURfV0RBLHBXREEpOworICAgaWYgKCAhVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBpbiBXREEgY2xvc2UgIiApOworICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9DT1JFL1dEQS9zcmMvd2xhbl9xY3Rfd2RhX2RlYnVnLmMgYi9DT1JFL1dEQS9zcmMvd2xhbl9xY3Rfd2RhX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhMjY2ZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RBL3NyYy93bGFuX3FjdF93ZGFfZGVidWcuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICB3bGFuX3FjdF93ZGFfZGVidWcuYworCisgIE9WRVJWSUVXOgorCisgIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gRGV2aWNlIEFkYXB0YXRpb24KKyAgTGF5ZXIgZm9yIGRlYnVnZ2luZyBBUElzLgorCisgIFRoZSBmdW5jdGlvbnMgZXh0ZXJuYWxpemVkIGJ5IHRoaXMgbW9kdWxlIGFyZSB0byBiZSBjYWxsZWQgT05MWSBieSBvdGhlcgorICBXTEFOIG1vZHVsZXMgdGhhdCBwcm9wZXJseSByZWdpc3RlciB3aXRoIHRoZSBUcmFuc3BvcnQgTGF5ZXIgaW5pdGlhbGx5LgorCisgIERFUEVOREVOQ0lFUzoKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKworCisgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorCisjaW5jbHVkZSAicGFsVHlwZXMuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGFfZGVidWcuaCIKKwordm9pZCB3ZGFMb2codHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKnBTdHJpbmcsLi4uKSB7CisgICAgdmFfbGlzdCBtYXJrZXI7CisgICAgCisgICAgaWYobG9nbGV2ZWwgPiBwTWFjLT51dGlscy5nTG9nRGJnTGV2ZWxbV0RBX0RFQlVHX0xPR0lEWF0pCisgICAgICAgIHJldHVybjsKKyAgIAorICAgIHZhX3N0YXJ0KCBtYXJrZXIsIHBTdHJpbmcgKTsgICAgIC8qIEluaXRpYWxpemUgdmFyaWFibGUgYXJndW1lbnRzLiAqLworICAgIAorICAgIGxvZ0RlYnVnKHBNYWMsIFNJUl9XREFfTU9EVUxFX0lELCBsb2dsZXZlbCwgcFN0cmluZywgbWFya2VyKTsKKyAgICAKKyAgICB2YV9lbmQoIG1hcmtlciApOyAgICAgICAgICAgICAgLyogUmVzZXQgdmFyaWFibGUgYXJndW1lbnRzLiAgICAgICovCit9CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KZGlmZiAtLWdpdCBhL0NPUkUvV0RBL3NyYy93bGFuX3FjdF93ZGFfZGVidWcuaCBiL0NPUkUvV0RBL3NyYy93bGFuX3FjdF93ZGFfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWI3NGM5Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREEvc3JjL3dsYW5fcWN0X3dkYV9kZWJ1Zy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fV0RBX0RFQlVHX0hfXworI2RlZmluZSBfX1dEQV9ERUJVR19IX18KKyNpZiAoIWRlZmluZWQgQU5JX09TX1RZUEVfT1NYICYmICFkZWZpbmVkIChBTklfT1NfVFlQRV9BTkRST0lEKSkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJ1dGlsc0FwaS5oIgorI2luY2x1ZGUgInNpckRlYnVnLmgiCisjaW5jbHVkZSAic2lyUGFyYW1zLmgiCisjZGVmaW5lIFdEQV9ERUJVR19MT0dJRFggICggTE9HX0lOREVYX0ZPUl9NT0RVTEUoU0lSX1dEQV9NT0RVTEVfSUQpICkKKworCisKKyNpZmRlZiBXTEFOX0RFQlVHCisKKyNkZWZpbmUgV0RBTE9HUCh4MCkgIHgwCisjZGVmaW5lIFdEQUxPR0UoeDApICB4MAorI2RlZmluZSBXREFMT0dXKHgwKSAgeDAKKyNkZWZpbmUgV0RBTE9HMSh4MCkgIHgwCisKKyNpZmRlZiBIQUxfREVCVUdfTE9HMgorI2RlZmluZSBXREFMT0cyKHgwKSAgeDAKKyNlbHNlCisgI2RlZmluZSBXREFMT0cyKHgwKQorI2VuZGlmCisKKyNpZmRlZiBIQUxfREVCVUdfTE9HMworI2RlZmluZSBXREFMT0czKHgwKSAgeDAKKyNlbHNlCisgI2RlZmluZSBXREFMT0czKHgwKQorI2VuZGlmCisKKyNpZmRlZiBIQUxfREVCVUdfTE9HNAorI2RlZmluZSBXREFMT0c0KHgwKSAgeDAKKyNlbHNlCisgI2RlZmluZSBXREFMT0c0KHgwKQorI2VuZGlmCisKKyNkZWZpbmUgU1RSKHgpICB4CisKKyNlbHNlCisKKyNkZWZpbmUgV0RBTE9HUCh4KSAgeAorI2RlZmluZSBXREFMT0dFKHgpICB7fQorI2RlZmluZSBXREFMT0dXKHgpICB7fQorI2RlZmluZSBXREFMT0cxKHgpICB7fQorI2RlZmluZSBXREFMT0cyKHgpICB7fQorI2RlZmluZSBXREFMT0czKHgpICB7fQorI2RlZmluZSBXREFMT0c0KHgpICB7fQorI2RlZmluZSBTVFIoeCkgICAgICAiIgorI2VuZGlmCisKK3ZvaWQgd2RhTG9nKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIGxvZ2xldmVsLCBjb25zdCBjaGFyICpwU3RyaW5nLC4uLik7CisKKyNlbmRpZiAvLyBfX1dEQV9ERUJVR19IX18KKwpkaWZmIC0tZ2l0IGEvQ09SRS9XREEvc3JjL3dsYW5fcWN0X3dkYV9kcy5jIGIvQ09SRS9XREEvc3JjL3dsYW5fcWN0X3dkYV9kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjM4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dEQS9zcmMvd2xhbl9xY3Rfd2RhX2RzLmMKQEAgLTAsMCArMSwxNjI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisgICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIFdEQSBfIERTIC4gQworCisgIE9WRVJWSUVXOgorCisgIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgV0xBTiBEYXRhIEFidHJhY3Rpb24gQVBJcworICBmb3IgdGhlIFdMQU4gVHJhbnNwb3J0IExheWVyLgorCisgIERFUEVOREVOQ0lFUzoKKworICBBcmUgbGlzdGVkIGZvciBlYWNoIEFQSSBiZWxvdy4KKworCisgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAkSGVhZGVyOiQgJERhdGVUaW1lOiAkICRBdXRob3I6ICQKKworCit3aGVuICAgICAgICB3aG8gICAgICAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0gICAgLS0tICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMTIvMDgvMjAxMCAgc2Vva3lvdW4gICAgQ3JlYXRlZC4gTW92ZSBkb3duIEhBTCBpbnRlcmZhY2VzIGZyb20gVEwgdG8gV0RBCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVU1BQyBjb252ZXJnZW5jZSBidHdlZW4gVm9sYW5zL0xpYnJhIGFuZCBQcmltYQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGEuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3RsaS5oIgorI2luY2x1ZGUgInRsRGVidWcuaCIKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fTk9OX0lOVEVHUkFURURfU09DICkKKyNpbmNsdWRlICJ3bGFuX2JhbF9taXNjLmgiCisjZW5kaWYKKworI2RlZmluZSBXREFfRFNfRFhFX1JFU19DT1VOVCAgIFdEQV9UTElfTUlOX1JFU19EQVRBICsgMjAKKworI2RlZmluZSBWT1NfVE9fV1BBTF9QS1QoX3Zvc19wa3QpICgod3B0X3BhY2tldCopX3Zvc19wa3QpCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorI2RlZmluZSBXREFfSElfRkxPV19NQVNLIDB4RjAKKyNkZWZpbmUgV0RBX0xPX0ZMT1dfTUFTSyAweDBGCisKK3N0YXRpYyB2X1ZPSURfdCAKK1dEQV9EU19UeENvbXBsZXRlQ0IKKygKKyB2X1BWT0lEX3QgcHZvc0dDdHgsIAorIHZfUFZPSURfdCBwRnJhbWVEYXRhQnVmZgorKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX05PTl9JTlRFR1JBVEVEX1NPQyApCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfUHJlcGFyZUJESGVhZGVyCisKKyAgREVTQ1JJUFRJT04KKyAgICBJbmxpbmUgZnVuY3Rpb24gZm9yIHByZXBhcmluZyBCRCBoZWFkZXIgYmVmb3JlIEhBTCBwcm9jZXNzaW5nLgorCisgIERFUEVOREVOQ0lFUworICAgIEp1c3Qgbm90aWZ5IEhBTCB0aGF0IHN1c3BlbmQgaW4gVEwgaXMgY29tcGxldGUuCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgIHZvc0RhdGFCdWZmOiAgICAgIHZvcyBkYXRhIGJ1ZmZlcgorICAgIHVjRGlzYWJsZUZybVh0bDogIGlzIGZyYW1lIHh0bCBkaXNhYmxlZAorCisgICBPVVQKKyAgICBwcHZCREhlYWRlcjogICAgICBpdCB3aWxsIGNvbnRhaW4gdGhlIEJEIGhlYWRlcgorICAgIHB2RGVzdE1hY0FkZHI6ICAgaXQgd2lsbCBjb250YWluIHRoZSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcworICAgIHB2b3NTdGF0dXM6ICAgICAgIHN0YXR1cyBvZiB0aGUgY29tYmluZWQgcHJvY2Vzc2luZworICAgIHB1c1BrdExlbjogICAgICAgIHBhY2tldCBsZW4uCisKKyAgUkVUVVJOIFZBTFVFCisgICAgTm8gcmV0dXJuLgorCisgIFNJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQKK1dEQV9EU19QcmVwYXJlQkRIZWFkZXIKKygKKyAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAorICB2X1BWT0lEX3QqICAgICAgcHB2QkRIZWFkZXIsCisgIHZfTUFDQUREUl90KiAgICBwdkRlc3RNYWNBZGRyLAorICB2X1U4X3QgICAgICAgICAgdWNEaXNhYmxlRnJtWHRsLAorICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKKyAgdl9VMTZfdCogICAgICAgIHB1c1BrdExlbiwKKyAgdl9VOF90ICAgICAgICAgIHVjUW9zRW5hYmxlZCwKKyAgdl9VOF90ICAgICAgICAgIHVjV0RTRW5hYmxlZCwKKyAgdl9VOF90ICAgICAgICAgIGV4dHJhSGVhZFNwYWNlCispCit7CisgIHZfVThfdCAgICAgIHVjSGVhZGVyT2Zmc2V0OworICB2X1U4X3QgICAgICB1Y0hlYWRlckxlbjsKKyNpZm5kZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICB2X1BWT0lEX3QgICBwdlBlZWtEYXRhOworI2VuZGlmCisgIHZfVThfdCAgICAgIHVjQkRIZWFkZXJMZW4gPSBXTEFOVExfQkRfSEVBREVSX0xFTih1Y0Rpc2FibGVGcm1YdGwpOworCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgaGVhZGVyIHBvaW50ZXIgZnJvbSBWT1NTCisgICAgISEhIG1ha2Ugc3VyZSByZXNlcnZlIGhlYWQgemVyb3Mgb3V0IHRoZSBtZW1vcnkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgcHVzUGt0TGVuKTsKKworICBpZiAoIFdMQU5UTF9NQUNfSEVBREVSX0xFTih1Y0Rpc2FibGVGcm1YdGwpID4gKnB1c1BrdExlbiApCisgIHsKKyAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDogTGVuZ3RoIG9mIHRoZSBwYWNrZXQgc21hbGxlciB0aGFuIGV4cGVjdGVkIG5ldHdvcmsiCisgICAgICAgICAgICAgICAiIGhlYWRlciAlZCIsICpwdXNQa3RMZW4gKSk7CisKKyAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICByZXR1cm47CisgIH0KKworICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsIHBwdkJESGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgdWNCREhlYWRlckxlbiApOworICBpZiAoIE5VTEwgPT0gKnBwdkJESGVhZGVyICkKKyAgeworICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiV0xBTiBUTDpWT1NTIHBhY2tldCBjb3JydXB0ZWQgb24gQXR0YWNoIEJEIGhlYWRlciIpKTsKKyAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICByZXR1cm47CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBNQUMgYWRkcmVzcworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIFdMQU5fU09GVEFQX0ZFQVRVUkUKKyAgeworICAgdl9TSVpFX3QgdXNNYWNBZGRyU2l6ZSA9IFZPU19NQUNfQUREUl9TSVpFOworICAgKnB2b3NTdGF0dXMgPSB2b3NfcGt0X2V4dHJhY3RfZGF0YSggdm9zRGF0YUJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNCREhlYWRlckxlbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01BQ19BRERSX0FMSUdOKHVjRGlzYWJsZUZybVh0bCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwdkRlc3RNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c01hY0FkZHJTaXplICk7CisgIH0KKyNlbHNlCisgICpwdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0RhdGFCdWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQkRIZWFkZXJMZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTih1Y0Rpc2FibGVGcm1YdGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2UGVla0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01BQ19BRERSX1NJWkUgKTsKKworICAvKkZpeCBtZSovCisgIHZvc19jb3B5X21hY2FkZHIocHZEZXN0TWFjQWRkciwgKHZfTUFDQUREUl90KilwdlBlZWtEYXRhKTsKKyNlbmRpZgorICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSAqcHZvc1N0YXR1cyApCisgIHsKKyAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGV4dHJhY3QgTUFDIEFkZHIgJWQiLAorICAgICAgICAgICAgICAgICpwdm9zU3RhdHVzKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRmlsbCBNUERVIGluZm8gZmllbGRzOgorICAgICAgICAgIC0gTVBEVSBkYXRhIHN0YXJ0IG9mZnNldAorICAgICAgICAgIC0gTVBEVSBoZWFkZXIgc3RhcnQgb2Zmc2V0CisgICAgICAgICAgLSBNUERVIGhlYWRlciBsZW5ndGgKKyAgICAgICAgICAtIE1QRFUgbGVuZ3RoIC0gdGhpcyBpcyBhIDE2YiBmaWVsZCAtIG5lZWRzIHN3YXBwaW5nCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHVjSGVhZGVyT2Zmc2V0ID0gdWNCREhlYWRlckxlbjsKKyAgICB1Y0hlYWRlckxlbiAgICA9IFdMQU5UTF9NQUNfSEVBREVSX0xFTih1Y0Rpc2FibGVGcm1YdGwpOworCisgICAgaWYgKCAwICE9IHVjRGlzYWJsZUZybVh0bCApCisgICAgeworICAgICAgaWYgKCAwICE9IHVjUW9zRW5hYmxlZCApCisgICAgICB7CisgICAgICAgIHVjSGVhZGVyTGVuICs9IFdMQU5UTF84MDJfMTFfSEVBREVSX1FPU19DVEw7CisgICAgICB9CisKKyAgICAgIC8vIFNpbWlsYXIgdG8gUW9zIHdlIG5lZWQgc29tZXRoaW5nIGZvciBXRFMgZm9ybWF0ICEKKyAgICAgIGlmICggdWNXRFNFbmFibGVkICE9IDAgKQorICAgICAgeworICAgICAgICAvLyBJZiB3ZSBoYXZlIGZyYW1lIHRyYW5zbGF0aW9uIGVuYWJsZWQKKyAgICAgICAgdWNIZWFkZXJMZW4gICAgKz0gV0xBTlRMXzgwMl8xMV9IRUFERVJfQUREUjRfTEVOOworICAgICAgfQorICAgICAgaWYgKCBleHRyYUhlYWRTcGFjZSAhPSAwICkKKyAgICAgIHsKKyAgICAgICAgLy8gRGVjcmVhc2UgdGhlIHBhY2tldCBsZW5ndGggd2l0aCB0aGUgZXh0cmEgcGFkZGluZyBhZnRlciB0aGUgaGVhZGVyCisgICAgICAgICpwdXNQa3RMZW4gPSAqcHVzUGt0TGVuIC0gZXh0cmFIZWFkU3BhY2U7CisgICAgICB9CisgICAgfQorCisgICAgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9IRUFERVJfTEVOKCAqcHB2QkRIZWFkZXIsIHVjSGVhZGVyTGVuKTsKKyAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0hFQURFUl9PRkZTRVQoICpwcHZCREhlYWRlciwgdWNIZWFkZXJPZmZzZXQpOworICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfREFUQV9PRkZTRVQoICpwcHZCREhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjSGVhZGVyT2Zmc2V0ICsgdWNIZWFkZXJMZW4gKyBleHRyYUhlYWRTcGFjZSk7CisgICAgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9MRU4oICpwcHZCREhlYWRlciwgKnB1c1BrdExlbik7CisKKyAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICJXTEFOIFRMOiBWQUxVRVMgQVJFIEhMZW49JXggSG9mZj0leCBkb2ZmPSV4IGxlbj0leCBleD0lZCIsCisgICAgICAgICAgICAgICAgdWNIZWFkZXJMZW4sIHVjSGVhZGVyT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAodWNIZWFkZXJPZmZzZXQgKyB1Y0hlYWRlckxlbiArIGV4dHJhSGVhZFNwYWNlKSwgCisgICAgICAgICAgICAgICAgKnB1c1BrdExlbiwgZXh0cmFIZWFkU3BhY2UpKTsKKyAgfS8qIGlmIHBlZWsgTUFDIHN1Y2Nlc3MqLworCit9LyogV0xBTlRMX1ByZXBhcmVCREhlYWRlciAqLworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9OT05fSU5URUdSQVRFRF9TT0MgKi8KKworI2lmZGVmIFdMQU5fUEVSRgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGVU5DVElPTiAgICBXREFfVExJX0Zhc3RId0Z3ZERhdGFGcmFtZQorCisgIERFU0NSSVBUSU9OIAorICAgIEZvciBOT04gaW50ZWdyYXRlZCBTT0MsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFRMLgorCisgICAgRmFzdCBwYXRoIGZ1bmN0aW9uIHRvIHF1aWNrbHkgZm9yd2FyZCBhIGRhdGEgZnJhbWUgaWYgSEFMIGRldGVybWluZXMgQkQgCisgICAgc2lnbmF0dXJlIGNvbXB1dGVkIGhlcmUgbWF0Y2hlcyB0aGUgc2lnbmF0dXJlIGluc2lkZSBjdXJyZW50IFZPU1MgcGFja2V0LiAKKyAgICBJZiB0aGVyZSBpcyBhIG1hdGNoLCBIQUwgYW5kIFRMIGZpbGxzIGluIHRoZSBzd2FwcGVkIHBhY2tldCBsZW5ndGggaW50byAKKyAgICBCRCBoZWFkZXIgYW5kIER4RSBoZWFkZXIsIHJlc3BlY3RpdmVseS4gT3RoZXJ3aXNlLCBwYWNrZXQgZ29lcyBiYWNrIHRvIAorICAgIG5vcm1hbCAoc2xvdykgcGF0aCBhbmQgYSBuZXcgQkQgc2lnbmF0dXJlIHdvdWxkIGJlIHRhZ2dlZCBpbnRvIEJEIGluIHRoaXMKKyAgICBWT1NTIHBhY2tldCBsYXRlciBieSB0aGUgV0xBTkhBTF9GaWxsVHhCZCgpIGZ1bmN0aW9uLgorCisgIFRPRE8gIEZvciBpbnRlZ3JhdGVkIFNPQywgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgeWV0LiBQaW1hIFNMTS9IQUwgCisgICAgICAgIHNob3VsZCBwcm92aWRlIHRoZSBlcXVpdmVsYW50IGZ1bmN0aW9uYWxpdHkuCisKKyAgREVQRU5ERU5DSUVTIAorICAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgSU4KKyAgICAgICAgcHZvc0dDdHggICAgVk9TIGNvbnRleHQKKyAgICAgICAgdm9zRGF0YUJ1ZmYgUHRyIHRvIFZPU1MgcGFja2V0CisgICAgICAgIHBNZXRhSW5mbyAgIEZvciBnZXR0aW5nIGZyYW1lJ3MgVElECisgICAgICAgIHBTdGFJbmZvICAgIEZvciBjaGVja2luZyBTVEEgdHlwZQorICAgIAorICAgT1VUCisgICAgICAgIHB2b3NTdGF0dXMgIHJldHVybmVkIHN0YXR1cworICAgICAgICBwdUZhc3RGd2RPSyBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgZnJhbWUgY291bGQgYmUgZmFzdCBmb3J3YXJkZWQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBObyByZXR1cm4uICAgCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBXREFfVExJX0Zhc3RId0Z3ZERhdGFGcmFtZQorKAorICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAorICB2b3NfcGt0X3QqICAgIHZvc0RhdGFCdWZmLAorICBWT1NfU1RBVFVTKiAgIHB2b3NTdGF0dXMsCisgIHZfVTMyX3QqICAgICAgIHB1RmFzdEZ3ZE9LLAorICBXTEFOVExfTWV0YUluZm9UeXBlKiAgcE1ldGFJbmZvLAorICBXTEFOX1NUQURlc2NUeXBlKiAgcFN0YUluZm8KKykKK3sKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorICAvKiBGSVhNRSBXREkvV0RBIHNob3VsZCBzdXBwb3J0IHRoaXMgZnVuY3Rpb24KKyAgICAgb25jZSBIQUwgc3VwcG9ydHMgaXQKKyAgICovCisjZWxzZSAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKyAgIHZfUFZPSURfdCAgIHB2UGVla0RhdGE7CisgICB2X1U4X3QgICAgICB1Y0R4RUJEV0xBTkhlYWRlckxlbiA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKDApICsgc2l6ZW9mKFdMQU5CQUxfc0RYRUhlYWRlclR5cGUpOyAKKyAgIHZfVThfdCAgICAgIHVjSXNVbmljYXN0OworICAgV0xBTkJBTF9zRFhFSGVhZGVyVHlwZSAgKnBEeEVIZWFkZXI7CisgICB2X1BWT0lEX3QgICBwdkJESGVhZGVyOworICAgdl9QVk9JRF90ICAgcHVjQnVmZlB0cjsKKyAgIHZfVTE2X3QgICAgICB1c1BrdExlbjsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcGFja2V0IGxlbmd0aAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgJnVzUGt0TGVuKTsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgTUFDIGFkZHJlc3MKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAqcHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUFDX0FERFJfQUxJR04oMCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTUFDX0FERFJfU0laRSApOworCisgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSAqcHZvc1N0YXR1cyApIAorICAgeworICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBleHRyYWN0IE1BQyBBZGRyICVkIiwgCisgICAgICAgICAgICAgICAgICpwdm9zU3RhdHVzKSk7CisgICAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJlc2VydmUgaGVhZCByb29tIGZvciBEeEUgaGVhZGVyLCBCRCwgYW5kIFdMQU4gaGVhZGVyCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsICZwdWNCdWZmUHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHVjRHhFQkRXTEFOSGVhZGVyTGVuICk7CisgICBpZiAoIE5VTEwgPT0gcHVjQnVmZlB0ciApCisgICB7CisgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpObyBlbm91Z2ggc3BhY2UgaW4gVk9TUyBwYWNrZXQgJXAgZm9yIER4RS9CRC9XTEFOIGhlYWRlciIsIHZvc0RhdGFCdWZmKSk7CisgICAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgICAgICByZXR1cm47CisgICB9CisgICBwRHhFSGVhZGVyID0gKFdMQU5CQUxfc0RYRUhlYWRlclR5cGUgICopcHVjQnVmZlB0cjsKKyAgIHB2QkRIZWFkZXIgPSAodl9QVk9JRF90KSAmcER4RUhlYWRlclsxXTsKKworICAgLyogVU1BIFR4IGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkLiAKKyAgICAqIFVNQSB3b3VsZCBoZWxwIGNvbnZlcnQgZnJhbWVzIHRvIDgwMi4xMSwgZmlsbCBwYXJ0aWFsIEJEIGZpZWxkcyBhbmQgCisgICAgKiBjb25zdHJ1Y3QgTExDIGhlYWRlci4gVG8gZnVydGhlciBhY2NlbGVyYXRlIHRoaXMga2luZCBvZiBmcmFtZXMsCisgICAgKiBIQUwgd291bGQgYXR0ZW1wdCB0byByZXVzZSB0aGUgQkQgZGVzY3JpcHRvciBpZiB0aGUgQkQgc2lnbmF0dXJlIAorICAgICogbWF0Y2hlcyB0byB0aGUgc2F2ZWQgQkQgZGVzY3JpcHRvci4KKyAgICAqLworICAgaWYocFN0YUluZm8tPndTVEFUeXBlID09IFdMQU5fU1RBX0lCU1MpCisgICAgICB1Y0lzVW5pY2FzdCA9ICEoKCh0QU5JX1U4ICopcHZQZWVrRGF0YSlbMF0gJiAweDAxKTsKKyAgIGVsc2UKKyAgICAgIHVjSXNVbmljYXN0ID0gMTsKKyAKKyAgICpwdUZhc3RGd2RPSyA9ICh2X1UzMl90KSBXTEFOSEFMX1R4QmRGYXN0RndkKHB2b3NHQ3R4LCBwdlBlZWtEYXRhLCBwTWV0YUluZm8tPnVjVElELCB1Y0lzVW5pY2FzdCwgcHZCREhlYWRlciwgdXNQa3RMZW4gKTsKKyAgICAKKyAgIC8qIENhbid0IGJlIGZhc3QgZm9yd2FyZGVkLiBUcmltIHRoZSBWT1MgaGVhZCBiYWNrIHRvIG9yaWdpbmFsIGxvY2F0aW9uLiAqLworICAgaWYoISAqcHVGYXN0RndkT0speworICAgICAgIHZvc19wa3RfdHJpbV9oZWFkKHZvc0RhdGFCdWZmLCB1Y0R4RUJEV0xBTkhlYWRlckxlbik7CisgICB9ZWxzZXsKKyAgICAgIC8qIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkLiBOb3cgbm90aWZ5IEJBTCBEeEUgaGVhZGVyIGZpbGxpbmcgY291bGQgYmUgY29tcGxldGVseSBza2lwcGVkCisgICAgICAgKi8KKyAgICAgIHZfVTMyX3QgdVBhY2tldFNpemUgPSBXTEFOVExfQkRfSEVBREVSX0xFTigwKSArIHVzUGt0TGVuOworICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCisgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpdVBhY2tldFNpemUpOworICAgICAgcER4RUhlYWRlci0+c2l6ZSAgPSBTV0FQX0VORElBTl9VSU5UMzIodVBhY2tldFNpemUpOworICAgfQorCisgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgIHJldHVybjsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KK30KKyNlbmRpZiAvKldMQU5fUEVSRiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0RBX0RTX1JlZ2lzdGVyCisKKyAgREVTQ1JJUFRJT04gCisgICAgUmVnaXN0ZXIgVEwgY2xpZW50IHRvIFdEQS4gVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgVEwgUlgvVFggZnVuY3Rpb25zCisgICAgdG8gV0RJIGJ5IGNhbGxpbmcgV0RJX0RTX1JlZ2lzdGVyLgorCisKKyAgICBGb3IgTk9OIGludGVncmF0ZWQgU09DLCB0aGlzIGZ1bmN0aW9uIGNhbGxzIFdMQU5CQUxfUmVnVGxDYkZ1bmN0aW9ucworICAgIHRvIHJlZ2lzdGVyIFRMJ3MgUlgvVFggZnVuY3Rpb25zIHRvIEJBTAorCisgIFRPRE8gCisgICAgRm9yIFByaW1hLCBwZm5SZXNvdXJjZUNCIGdldHMgY2FsbGVkIGluIFdEVFNfT09SZXNvdXJjZU5vdGlmaWNhdGlvbi4KKyAgICBUaGUgdUNvdW50IHBhcmFtZXRlciBpcyBBQyBtYXNrLiBJdCBzaG91bGQgYmUgcmVkZWZpbmVkIHRvIHVzZSB0aGUKKyAgICBzYW1lIHJlc291cmNlIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgIERFUEVOREVOQ0lFUyAKKyAgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgIElOCisgICAgICAgIHB2b3NHQ3R4ICAgIFZPUyBjb250ZXh0CisgICAgICAgIHBmblR4Q29tcGxldGVDYWxsYmFjayAgICAgICBUWCBjb21wbGV0ZSBjYWxsYmFjayB1cG9uIFRYIGNvbXBsZXRpb24KKyAgICAgICAgcGZuUnhQYWNrZXRDYWxsYmFjayAgICAgICAgIFJYIGNhbGxiYWNrCisgICAgICAgIHBmblR4UGFja2V0Q2FsbGJhY2sgICAgICAgICBUWCBjYWxsYmFjaworICAgICAgICBwZm5SZXNvdXJjZUNCICAgICAgICAgICAgICAgZ2V0cyBjYWxsZWQgd2hlbiB1cGRhdGluZyBUWCBQRFUgbnVtYmVyCisgICAgICAgIHVSZXNUaGVzaG9sZCAgICAgICAgICAgICAgICBtaW5pbXVtIFRYIFBEVSBzaXplIGZvciBhIHBhY2tldAorICAgICAgICBwQ2FsbGJhY2tDb250ZXh0ICAgICAgICAgICAgV0RJIGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPUyBnbG9iYWwgY29udGV4dCBwb2ludGVyCisgICBPVVQKKyAgICAgICAgdUF2YWlsYWJsZVR4QnVmICAgICAgIGF2YWlsYWJsZSBUWCBQRFUgbnVtYmRlci4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUwgcmV0dXJucyBpdCBmb3IgTk9OIGludGVncmF0ZWQgU09DCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciBpcyBOVUxMIGFuZCBvdGhlciBlcnJvcnMgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUyBXREFfRFNfUmVnaXN0ZXIgCisoIAorICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgIHB2b3NHQ3R4LCAKKyAgV0RBX0RTX1R4Q29tcGxldGVDYWxsYmFjayBwZm5UeENvbXBsZXRlQ2FsbGJhY2ssCisgIFdEQV9EU19SeFBhY2tldENhbGxiYWNrICAgcGZuUnhQYWNrZXRDYWxsYmFjaywgCisgIFdEQV9EU19UeFBhY2tldENhbGxiYWNrICAgcGZuVHhQYWNrZXRDYWxsYmFjaywKKyAgV0RBX0RTX1Jlc291cmNlQ0IgICAgICAgICBwZm5SZXNvdXJjZUNCLAorICB2X1UzMl90ICAgICAgICAgICAgICAgICAgIHVSZXNUaGVzaG9sZCwKKyAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICBwQ2FsbGJhY2tDb250ZXh0LAorICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICp1QXZhaWxhYmxlVHhCdWYKKykKK3sKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorICB0V0RBX0NiQ29udGV4dCAgICAgICp3ZGFDb250ZXh0ID0gTlVMTDsKKyAgV0RJX1N0YXR1cyAgICAgICAgICB3ZGlTdGF0dXM7CisKKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJXTEFOIFdEQTogV0RBX0RTX1JlZ2lzdGVyIiApOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoICggTlVMTCA9PSBwdm9zR0N0eCApIHx8CisgICAgICAgKCBOVUxMID09IHBmblR4UGFja2V0Q2FsbGJhY2sgKSB8fAorICAgICAgICggTlVMTCA9PSBwZm5UeENvbXBsZXRlQ2FsbGJhY2sgKSB8fAorICAgICAgICggTlVMTCA9PSBwZm5SeFBhY2tldENhbGxiYWNrICkgfHwKKyAgICAgICAoIE5VTEwgPT0gcGZuUmVzb3VyY2VDQikgKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gV0RBOkludmFsaWQgcG9pbnRlcnMgb24gV0RBX0RTX1JlZ2lzdGVyIiApOworICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgV0RBIGNvbnRleHQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkYUNvbnRleHQgPSAodFdEQV9DYkNvbnRleHQgKil2b3NfZ2V0X2NvbnRleHQoIFZPU19NT0RVTEVfSURfV0RBLCBwdm9zR0N0eCApOworICBpZiAoIE5VTEwgPT0gd2RhQ29udGV4dCApCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBXREE6SW52YWxpZCB3ZGEgY29udGV4dCBwb2ludGVyICIKKyAgICAgICAgICAgICAgICJmcm9tIHB2b3NHQ3R4IG9uIFdEQV9EU19SZWdpc3RlciIgKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSZWdpc3RlciB3aXRoIFdESSBhcyB0cmFuc3BvcnQgbGF5ZXIgY2xpZW50CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIldEQTogV0RBX0RTX1JlZ2lzdGVyIik7CisKKyAgd2RhQ29udGV4dC0+cGZuVHhSZXNvdXJjZUNCICAgICAgID0gcGZuUmVzb3VyY2VDQjsKKyAgd2RhQ29udGV4dC0+cGZuVHhDb21wbGV0ZUNhbGxiYWNrID0gcGZuVHhDb21wbGV0ZUNhbGxiYWNrOworCisgIHdkaVN0YXR1cyA9IFdESV9EU19SZWdpc3Rlciggd2RhQ29udGV4dC0+cFdkaUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdESV9EU19UeENvbXBsZXRlQ2FsbGJhY2spV0RBX0RTX1R4Q29tcGxldGVDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0RJX0RTX1J4UGFja2V0Q2FsbGJhY2spcGZuUnhQYWNrZXRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfRFNfVHhGbG93Q29udHJvbENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2b3NHQ3R4ICk7CisKKyAgaWYgKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd2RpU3RhdHVzICkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6VEwgZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggREFMLCBFcnI6ICVkIiwgd2RpU3RhdHVzICk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICB9CisgICAKKyAgLyogVE9ETyBPdXQtb2YtcmVzb3VyY2UgY29uZGl0aW9uIGlmIFBEVSBzaXplIGlzIGxlc3MgdGhhbiBXTEFOVExfTUlOX1JFU19NRiAKKyAgICAgUHV0IGhhcmRjb2RlZCB2YWx1ZSBub3QgdG8gcHV0IFRMIGludG8gT09SLiBSZXZpc2l0IGl0ICovCisgICp1QXZhaWxhYmxlVHhCdWYgPSBXREFfRFNfRFhFX1JFU19DT1VOVDsgCisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbHNlIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKKyAgV0xBTkJBTF9UbFJlZ1R5cGUgICB0bFJlZzsKKworICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgIldMQU4gV0RBOiBXREFfRFNfUmVnaXN0ZXIiICk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggKCBOVUxMID09IHB2b3NHQ3R4ICkgfHwKKyAgICAgICAoIE5VTEwgPT0gcGZuVHhQYWNrZXRDYWxsYmFjayApIHx8CisgICAgICAgKCBOVUxMID09IHBmblR4Q29tcGxldGVDYWxsYmFjayApIHx8CisgICAgICAgKCBOVUxMID09IHBmblJ4UGFja2V0Q2FsbGJhY2sgKSB8fAorICAgICAgICggTlVMTCA9PSBwZm5SZXNvdXJjZUNCICkgKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBXREE6SW52YWxpZCBwb2ludGVycyBvbiBXREFfRFNfUmVnaXN0ZXIiICk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUmVnaXN0ZXIgd2l0aCBCQUwgYXMgdHJhbnNwb3J0IGxheWVyIGNsaWVudAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB0bFJlZy5yZWNlaXZlRnJhbWVDQiA9IHBmblJ4UGFja2V0Q2FsbGJhY2s7CisgIHRsUmVnLmdldFRYRnJhbWVDQiAgID0gcGZuVHhQYWNrZXRDYWxsYmFjazsKKyAgdGxSZWcudHhDb21wbGV0ZUNCICAgPSBwZm5UeENvbXBsZXRlQ2FsbGJhY2s7CisgIHRsUmVnLnR4UmVzb3VyY2VDQiAgID0gcGZuUmVzb3VyY2VDQjsKKyAgdGxSZWcudHhSZXNvdXJjZVRocmVhc2hvbGQgPSB1UmVzVGhlc2hvbGQ7CisgIHRsUmVnLnRsVXNyRGF0YSAgICAgID0gcHZvc0dDdHg7CisKKyAgdm9zU3RhdHVzID0gV0xBTkJBTF9SZWdUbENiRnVuY3Rpb25zKCBwdm9zR0N0eCwgJnRsUmVnICk7CisKKyAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICJXTEFOIFRMOiBUTCBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBCQUwsIEVycjogJWQiLCB2b3NTdGF0dXMgKTsKKyAgICByZXR1cm4gdm9zU3RhdHVzOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSZXF1ZXN0IHJlc291cmNlcyBmb3IgdHggZnJvbSBidXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdm9zU3RhdHVzID0gV0xBTkJBTF9HZXRUeFJlc291cmNlcyggcHZvc0dDdHgsIHVBdmFpbGFibGVUeEJ1ZiApOworCisgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFRMOlRMIGZhaWxlZCB0byBnZXQgcmVzb3VyY2VzIGZyb20gQkFMLCBFcnI6ICVkIiwKKyAgICAgICAgICAgICAgIHZvc1N0YXR1cyApOworICAgIHJldHVybiB2b3NTdGF0dXM7CisgIH0KKworICByZXR1cm4gdm9zU3RhdHVzOworI2VuZGlmCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgV0RBX0RTX1N0YXJ0WG1pdAorCisgIERFU0NSSVBUSU9OIAorICAgIFNlcmlhbGl6ZSBUWCB0cmFuc21pdCByZXF1ZXMgdG8gVFggdGhyZWFkLiAKKworICBUT0RPIFRoaXMgc2VuZHMgVFggdHJhbnNtaXQgcmVxdWVzdCB0byBUTC4gSXQgc2hvdWxkIHNlbmQgdG8gV0RJIGZvcgorICAgICAgICAgYWJzdHJhY3Rpb24uCisKKyAgICBGb3IgTk9OIGludGVncmF0ZWQgU09DLCB0aGlzIGZ1bmN0aW9uIGNhbGxzIFdMQU5CQUxfU3RhcnRYbWl0CisKKyAgREVQRU5ERU5DSUVTIAorICAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgSU4KKyAgICAgICAgcHZvc0dDdHggICAgVk9TIGNvbnRleHQKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMgCisgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXREFfRFNfU3RhcnRYbWl0CisoCisgIHZfUFZPSURfdCBwdm9zR0N0eAorKQoreworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgIHZvc19tc2dfdCAgICAgICAgICAgICAgICAgICAgc01lc3NhZ2U7CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIGlmICggTlVMTCA9PSBwdm9zR0N0eCApCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXTEFOIFdEQTpJbnZhbGlkIHBvaW50ZXJzIG9uIFdEQV9EU19TdGFydFhtaXQiICk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qIFNlcmlhbGl6ZSBvdXIgZXZlbnQgICovCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAgICAgICAiU2VyaWFsaXppbmcgV0RBIFRYIFN0YXJ0IFhtaXQgZXZlbnQiICk7CisKKyAgdm9zX21lbV96ZXJvKCAmc01lc3NhZ2UsIHNpemVvZih2b3NfbXNnX3QpICk7CisKKyAgc01lc3NhZ2UuYm9keXB0ciA9IE5VTEw7CisgIHNNZXNzYWdlLnR5cGUgICAgPSBXREFfRFNfVFhfU1RBUlRfWE1JVDsKKworICByZXR1cm4gdm9zX3R4X21xX3NlcmlhbGl6ZShWT1NfTVFfSURfVEwsICZzTWVzc2FnZSk7CisjZWxzZSAgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisgIHJldHVybiBXTEFOQkFMX1N0YXJ0WG1pdCggcHZvc0dDdHggKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZVTkNUSU9OICAgIFdEQV9EU19GaW5pc2hVTEEKKworICBERVNDUklQVElPTiAKKyAgICBTZXJpYWxpemUgRmluaXNoIFVwcGVyIExldmVsIEF1dGhlbnRpY2F0aW9uIHJlcXVlcyB0byBUWCB0aHJlYWQuIAorCisgIERFUEVOREVOQ0lFUyAKKyAgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgIElOCisgICAgICAgIGNhbGxiYWNrUm91dGluZSAgICByb3V0aW5lIHRvIGJlIGNhbGxlZCBpbiBUWCB0aHJlYWQKKyAgICAgICAgY2FsbGJhY2tDb250ZXh0ICAgIHVzZXIgZGF0YSBmb3IgdGhlIGFib3ZlIHJvdXRpbmUgCisgICAKKyAgUkVUVVJOIFZBTFVFCisgICAgcGxlYXNlIHNlZSB2b3NfdHhfbXFfc2VyaWFsaXplCisKKyAgU0lERSBFRkZFQ1RTIAorICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0RBX0RTX0ZpbmlzaFVMQQorKAorIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQpLAorIHZvaWQgICpjYWxsYmFja0NvbnRleHQKKykKK3sKKyAgdm9zX21zZ190ICAgICAgICAgICAgICAgICAgICBzTWVzc2FnZTsKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyogU2VyaWFsaXplIG91ciBldmVudCAgKi8KKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICJTZXJpYWxpemluZyBXREFfRFNfRmluaXNoVUxBIGV2ZW50IiApOworCisgIHZvc19tZW1femVybyggJnNNZXNzYWdlLCBzaXplb2Yodm9zX21zZ190KSApOworCisgIHNNZXNzYWdlLmJvZHl2YWwgID0gKHZfVTMyX3QpY2FsbGJhY2tDb250ZXh0OworICBzTWVzc2FnZS5ib2R5cHRyICA9IGNhbGxiYWNrUm91dGluZTsKKyAgc01lc3NhZ2UudHlwZSAgICAgPSBXREFfRFNfRklOSVNIX1VMQTsKKworICByZXR1cm4gdm9zX3R4X21xX3NlcmlhbGl6ZShWT1NfTVFfSURfVEwsICZzTWVzc2FnZSk7Cit9LypXREFfRFNfRmluaXNoVUxBKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvCisKKyAgREVTQ1JJUFRJT04KKyAgICBCdWlsZCBUWCBtZXRhIGluZm8gZm9yIGludGVncmF0ZWQgU09DLgorICAgIAorICAgIFNhbWUgZnVuY3Rpb24gY2FsbHMgSEFMIGZvciByZXNlcnZlIEJEIGhlYWRlciBzcGFjZSBpbnRvIFZPUyBwYWNrZXQgYW5kCisgICAgSEFMIGZ1bmN0aW9uIHRvIGZpbGwgaXQuCisgICAgCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0CisgICAgdm9zRGF0YUJ1ZmYgICAgICB2b3MgZGF0YSBidWZmZXIKKyAgICBwdkRlc3RNYWNBZGRyICAgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgcG9udGVyCisgICAgdWNEaXNhYmxlRnJtWHRsICBJcyBmcmFtZSB4dGwgZGlzYWJsZWQ/CisgICAgdWNRb3NFbmFibGVkICAgICBJcyBRb1MgZW5hYmxlZD8KKyAgICB1Y1dEU0VuYWJsZWQgICAgIElzIFdEUyBlbmFibGVkPworICAgIGV4dHJhSGVhZFNwYWNlICAgRXh0cmEgaGVhZCBieXRlcy4gSWYgaXQncyBub3QgMCBkdWUgdG8gNCBieXRlcyBhbGlnbgorICAgICAgICAgICAgICAgICAgICAgb2YgQkQgaGVhZGVyLgorICAgIHR5cGVTdWJ0eXBlICAgICAgdHlwZVN1YnR5cGUgZnJvbSBNQUMgaGVhZGVyIG9yIFRYIG1ldGFpbmZvL0JECisgICAgcEFkZHIyICAgICAgICAgICBhZGRyZXNzIDIKKyAgICB1VGlkICAgICAgICAgICAgIHRpZAorICAgIHR4RmxhZworICAgIHRpbWVTdGFtcAorICAgIHVjSXNFYXBvbAorICAgIHVjVVAKKworICAgT1VUCisgICAgKnB1c1BrdExlbiAgICAgICBQYWNrZXQgbGVuZ3RoCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciBpcyBOVUxMIGFuZCBvdGhlciBlcnJvcnMgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvCisoCisgIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKKyAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAorICB2X01BQ0FERFJfdCogICAgcHZEZXN0TWFjQWRkciwKKyAgdl9VOF90ICAgICAgICAgIHVjRGlzYWJsZUZybVh0bCwKKyAgdl9VMTZfdCogICAgICAgIHB1c1BrdExlbiwKKyAgdl9VOF90ICAgICAgICAgIHVjUW9zRW5hYmxlZCwKKyAgdl9VOF90ICAgICAgICAgIHVjV0RTRW5hYmxlZCwKKyAgdl9VOF90ICAgICAgICAgIGV4dHJhSGVhZFNwYWNlLAorICB2X1U4X3QgICAgICAgICAgdHlwZVN1YnR5cGUsCisgIHZfUFZPSURfdCAgICAgICBwQWRkcjIsCisgIHZfVThfdCAgICAgICAgICB1VGlkLAorICB2X1U4X3QgICAgICAgICAgdHhGbGFnLAorICB2X1UzMl90ICAgICAgICAgdGltZVN0YW1wLAorICB2X1U4X3QgICAgICAgICAgdWNJc0VhcG9sLAorICB2X1U4X3QgICAgICAgICAgdWNVUAorKQoreworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgIFZPU19TVEFUVVMgICAgICAgICAgICAgdm9zU3RhdHVzOworICBXRElfRFNfVHhNZXRhSW5mb1R5cGUqIHBUeE1ldGFJbmZvID0gTlVMTDsKKyAgdl9TSVpFX3QgICAgICAgICAgICAgICB1c01hY0FkZHJTaXplOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCAoIE5VTEwgPT0gcHZvc0dDdHggKSB8fCAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKSB8fCAoIE5VTEwgPT0gcHZEZXN0TWFjQWRkciApICkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREE6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXREFfRFNfQnVpbGRUeFBhY2tldEluZm8iICk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBUWCBNZXRhIEluZm8gcG9pbnRlciBmcm9tIFBBTCBwYWNrZXQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBUeE1ldGFJbmZvID0gV0RJX0RTX0V4dHJhY3RUeE1ldGFEYXRhKCBWT1NfVE9fV1BBTF9QS1Qodm9zRGF0YUJ1ZmYpICApOworICBpZiAoIE5VTEwgPT0gcFR4TWV0YUluZm8gKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICJXTEFOIFRMOkludmFsaWQgUnhNZXRhSW5mbyBwb2ludGVyIGZyb20gUEFMIHBhY2tldCBvbiBXTEFOVExfUnhGcmFtZXMiKTsKKyAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qIFplcm8gb3V0IG1lbWVvcnkgKi8KKyAgdm9zX21lbV96ZXJvKCBwVHhNZXRhSW5mbywgc2l6ZW9mKCBXRElfRFNfVHhNZXRhSW5mb1R5cGUgKSApOworCisgIC8qIEZpbGwgdGhlIFRYIE1ldGEgaW5mbyAqLworICBwVHhNZXRhSW5mby0+dHhGbGFncyAgICA9IHR4RmxhZzsKKyAgcFR4TWV0YUluZm8tPnFvc0VuYWJsZWQgPSB1Y1Fvc0VuYWJsZWQ7CisgIHBUeE1ldGFJbmZvLT5mZW5hYmxlV0RTID0gdWNXRFNFbmFibGVkOworICBwVHhNZXRhSW5mby0+YWMgICAgICAgICA9IHVjVVA7CisgIHBUeE1ldGFJbmZvLT5mVVAgICAgICAgID0gdVRpZDsKKyAgcFR4TWV0YUluZm8tPmlzRWFwb2wgICAgPSB1Y0lzRWFwb2w7CisgIHBUeE1ldGFJbmZvLT5mZGlzYWJsZUZybVhsdCA9IHVjRGlzYWJsZUZybVh0bDsKKyAgcFR4TWV0YUluZm8tPmZybVR5cGUgICAgID0gKCAoIHR5cGVTdWJ0eXBlICYgMHgzMCApID4+IDQgKTsKKyAgcFR4TWV0YUluZm8tPnR5cGVTdWJ0eXBlID0gdHlwZVN1YnR5cGU7CisKKyAgLyogTGVuZ3RoID0gTUFDIGhlYWRlciArIHBheWxvYWQgKi8KKyAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsIHB1c1BrdExlbik7CisgIHBUeE1ldGFJbmZvLT5mUGt0bGVuID0gKnB1c1BrdExlbjsKKworICAvLyBEc3QgYWRkcmVzcworICB1c01hY0FkZHJTaXplID0gVk9TX01BQ19BRERSX1NJWkU7CisgIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NEYXRhQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01BQ19BRERSX0FMSUdOKCB1Y0Rpc2FibGVGcm1YdGwgKSwKKyAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwdkRlc3RNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAmdXNNYWNBZGRyU2l6ZSApOworICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0RBOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGV4dHJhY3QgTUFDIEFkZHIgJWQiLAorICAgICAgICAgICAgICAgIHZvc1N0YXR1cyApOworICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgVk9TX0FTU0VSVCh1c01hY0FkZHJTaXplID09IFZPU19NQUNfQUREUl9TSVpFKTsKKworICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKXBUeE1ldGFJbmZvLT5mU1RBTUFDQWRkcmVzcywgcHZEZXN0TWFjQWRkciApOworCisgIC8vIEFERFIyCisgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopcFR4TWV0YUluZm8tPmFkZHIyTUFDQWRkcmVzcywgcEFkZHIyICk7CisKKyAgLyogRHVtcCBUWCBtZXRhIGluZnJvIGZvciBkZWJ1Z2dpbmcgKi8KKyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCisgICAgICAgICAgICAgIldMQU4gVEw6IER1bXAgVFggbWV0YSBpbmZvOiAiCisgICAgICAgICAgICAgInR4RmxhZ3M6JWQsIHFvc0VuYWJsZWQ6JWQsIGFjOiVkLCAiCisgICAgICAgICAgICAgImlzRWFwb2w6JWQsIGZkaXNhYmxlRnJtWGx0OiVkIiAiZnJtVHlwZSVkIiwKKyAgICAgICAgICAgICBwVHhNZXRhSW5mby0+dHhGbGFncywgdWNRb3NFbmFibGVkLCBwVHhNZXRhSW5mby0+YWMsCisgICAgICAgICAgICAgcFR4TWV0YUluZm8tPmlzRWFwb2wsIHBUeE1ldGFJbmZvLT5mZGlzYWJsZUZybVhsdCwgcFR4TWV0YUluZm8tPmZybVR5cGUgKTsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworI2Vsc2UgIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworICBWT1NfU1RBVFVTICAgdm9zU3RhdHVzOworICB2X1BWT0lEX3QgICAgcHZCREhlYWRlcjsKKworICBXREFfRFNfUHJlcGFyZUJESGVhZGVyKCB2b3NEYXRhQnVmZiwgJnB2QkRIZWFkZXIsIHB2RGVzdE1hY0FkZHIsIHVjRGlzYWJsZUZybVh0bCwKKyAgICAgICAgICAgICAgICAgICZ2b3NTdGF0dXMsIHB1c1BrdExlbiwgdWNRb3NFbmFibGVkLCB1Y1dEU0VuYWJsZWQsIGV4dHJhSGVhZFNwYWNlICk7CisKKyAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gcHJlcGFyZSBCRCAlZCIsIHZvc1N0YXR1cyApOworICAgIHJldHVybiB2b3NTdGF0dXM7CisgIH0KKworICB2b3NTdGF0dXMgPSBXTEFOSEFMX0ZpbGxUeEJkKCBwdm9zR0N0eCwgdHlwZVN1YnR5cGUsIHB2RGVzdE1hY0FkZHIsIHBBZGRyMiwKKyAgICAgICAgICAgICAgICAgICAgJnVUaWQsIHVjRGlzYWJsZUZybVh0bCwgcHZCREhlYWRlciwgdHhGbGFnLCB0aW1lU3RhbXAgKTsKKworICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmaWxsIEJEICVkIiwgdm9zU3RhdHVzICk7CisgICAgcmV0dXJuIHZvc1N0YXR1czsKKyAgfQorCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXRFNfRFNfVHJpbVJ4UGFja2V0SW5mbworCisgIERFU0NSSVBUSU9OCisgICAgVHJpbS9SZW1vdmUgUlggQkQgaGVhZGVyIGZvciBOT04gaW50ZWdyYXRlZCBTT0MuCisgICAgSXQgZG9lcyBub3RoaW5nIGZvciBpbnRlZ3JhdGVkIFNPQy4KKyAgICAKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgIHZvc0RhdGFCdWZmICAgICAgdm9zIGRhdGEgYnVmZmVyCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciBpcyBOVUxMIGFuZCBvdGhlciBlcnJvcnMgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0RBX0RTX1RyaW1SeFBhY2tldEluZm8KKyggCisgIHZvc19wa3RfdCAqdm9zRGF0YUJ1ZmYKKykKK3sKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorICAvKiBOb3RoaW5nIHRvIHRyaW0KKyAgICogRG8gTm90aGluZyAqLworCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisjZWxzZSAgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisgIFZPU19TVEFUVVMgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICB2X1UxNl90ICB1c1BrdExlbjsKKyAgdl9VOF90ICAgdWNNUERVSE9mZnNldDsKKyAgdl9VMTZfdCAgdXNNUERVRE9mZnNldDsKKyAgdl9VMTZfdCAgdXNNUERVTGVuOworICB2X1U4X3QgICB1Y01QRFVITGVuID0gMDsKKyAgdl9VOF90ICAgYXVjQkRIZWFkZXJbV0xBTkhBTF9SWF9CRF9IRUFERVJfU0laRV07CisKKyAgdm9zX3BrdF9wb3BfaGVhZCggdm9zRGF0YUJ1ZmYsIGF1Y0JESGVhZGVyLCBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFKTsKKworICB1Y01QRFVIT2Zmc2V0ID0gKHZfVThfdClXTEFOSEFMX1JYX0JEX0dFVF9NUERVX0hfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKKyAgdXNNUERVRE9mZnNldCA9ICh2X1UxNl90KVdMQU5IQUxfUlhfQkRfR0VUX01QRFVfRF9PRkZTRVQoYXVjQkRIZWFkZXIpOworICB1c01QRFVMZW4gICAgID0gKHZfVTE2X3QpV0xBTkhBTF9SWF9CRF9HRVRfTVBEVV9MRU4oYXVjQkRIZWFkZXIpOworICB1Y01QRFVITGVuICAgID0gKHZfVThfdClXTEFOSEFMX1JYX0JEX0dFVF9NUERVX0hfTEVOKGF1Y0JESGVhZGVyKTsKKyAgCisgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKKyAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgcHJvY2Vzc2luZyBkYXRhOiBITyAlZCBETyAlZCBMZW4gJWQgSExlbiAlZCIKKyAgICAgICAiIFRpZCAlZCBCRCAlZCIsCisgICAgICAgdWNNUERVSE9mZnNldCwgdXNNUERVRE9mZnNldCwgdXNNUERVTGVuLCB1Y01QRFVITGVuLAorICAgICAgIFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUgKTsKKworICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgJnVzUGt0TGVuKTsKKworICBpZiAoKCB1Y01QRFVIT2Zmc2V0ID49IFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUgKSAmJgorICAgICAgKCB1c01QRFVET2Zmc2V0ID4gIHVjTVBEVUhPZmZzZXQgKSAmJgorICAgICAgKCB1c01QRFVMZW4gICAgID49IHVjTVBEVUhMZW4gKSAmJgorICAgICAgKCB1c1BrdExlbiA+PSB1c01QRFVMZW4gKSkKKyAgeworICAgIGlmKCh1Y01QRFVIT2Zmc2V0IC0gV0xBTkhBTF9SWF9CRF9IRUFERVJfU0laRSkgPiAwKQorICAgIHsKKyAgICAgIHZvc19wa3RfdHJpbV9oZWFkKCB2b3NEYXRhQnVmZiwgdWNNUERVSE9mZnNldCAtIFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byB0cmltCisgICAgICAgKiBEbyBOb3RoaW5nICovCisgICAgfQorICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgfQorICBlbHNlCisgIHsKKyAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIHJldHVybiB2b3NTdGF0dXM7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfUGVla1J4UGFja2V0SW5mbworCisgIERFU0NSSVBUSU9OCisgICAgUmV0dXJuIFJYIG1ldGFpbmZvIHBvaW50ZXIgZm9yIGZvciBpbnRlZ3JhdGVkIFNPQy4KKyAgICAKKyAgICBTYW1lIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEJEIGhlYWRlciBwb2ludGVyLgorICAgIAorICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgdm9zRGF0YUJ1ZmYgICAgICB2b3MgZGF0YSBidWZmZXIKKworICAgIHB2RGVzdE1hY0FkZHIgICBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyBwb250ZXIKKyAgICBiU3dhcCAgICAgICAgICAgIFdhbnQgdG8gc3dhcCBCRCBoZWFkZXI/IEZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5CisgICAgICAgICAgICAgICAgICAgICBJdCBkb2VzIG5vdGhpbmcgZm9yIGludGVncmF0ZWQgU09DCisgICBPVVQKKyAgICAqcHBSeEhlYWRlciAgICAgIFJYIG1ldGFpbmZvIHBvaW50ZXIKKworICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXREFfRFNfUGVla1J4UGFja2V0SW5mbworKAorICB2b3NfcGt0X3QgKnZvc0RhdGFCdWZmLAorICB2X1BWT0lEX3QgKnBwUnhIZWFkZXIsCisgIHZfQk9PTF90ICBiU3dhcAorKQoreworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoICBOVUxMID09IHZvc0RhdGFCdWZmICkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREE6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXREFfRFNfUGVla1J4UGFja2V0SW5mbyIgKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOworICB9CisKKyAgKnBwUnhIZWFkZXIgPSBXRElfRFNfRXh0cmFjdFJ4TWV0YURhdGEoICh3cHRfcGFja2V0Kil2b3NEYXRhQnVmZiApOworCisgIGlmICggTlVMTCA9PSAqcHBSeEhlYWRlciApCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0RBOkZhaWxlZCB0byBnZXQgUlggbWV0YSBkYXRhIGZyb20gV0RJIiApOworICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKyAgICAgCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisjZWxzZSAgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworCisgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NEYXRhQnVmZiwgMCwgKHZfUFZPSURfdClwcFJ4SGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFKTsKKworICBpZiAoICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8ICggTlVMTCA9PSAodl9QVk9JRF90KXBwUnhIZWFkZXIgKSApCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREEgOkNhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIgKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICBpZiAoIFZPU19UUlVFID09IGJTd2FwICkKKyAgeworICAgIFdMQU5IQUxfU3dhcFJ4QmQoICpwcFJ4SGVhZGVyICk7CisgIH0KKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgV0RBX0RTX0dldEZyYW1lVHlwZVN1YlR5cGUKKworICBERVNDUklQVElPTgorICAgIEdldCB0eXBlU3VidHlwZSBmcm9tIHRoZSBwYWNrZXQuIFRoZSBCRCBoZWFkZXIgc2hvdWxkIGhhdmUgdGhpcy4KKyAgICBCdXQgc29tZSByZWFzb24sIExpYnJhL1ZvbGFucyByZWFkIGl0IGZyb20gODAyLjExIGhlYWRlciBhbmQgc2F2ZSBpdAorICAgIGJhY2sgdG8gQkQgaGVhZGVyLiBTbyBmb3IgTk9OIGludGVncmF0ZWQgU09DLCB0aGlzIGZ1bmN0aW9uIGRvZXMKKyAgICB0aGUgc2FtZS4KKworICAgIEZvciBpbnRlZ3JhdGVkIFNPQywgV0RJIGRvZXMgdGhlIHNhbWUsIG5vdCBUTC4gCisgICAgSXQgZG9lcyByZXR1cm4gdHlwZVN1YnR5cGUgZnJvbSBSWCBtZXRhIGluZm8gZm9yIGludGVncmF0ZWQgU09DLgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0CisgICAgdm9zRGF0YUJ1ZmYgICAgICB2b3MgZGF0YSBidWZmZXIKKyAgICBwUnhIZWFkZXIgICAgICAgIFJYIG1ldGEgaW5mbyBvciBCRCBoZWFkZXIgcG9pbnRlcgorCisgICBPVVQKKyAgICB1Y1R5cGVTdWJ0eXBlICAgIHR5cGVTdWJ0eXBlCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciBpcyBOVUxMIGFuZCBvdGhlciBlcnJvcnMgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0RBX0RTX0dldEZyYW1lVHlwZVN1YlR5cGUKKygKKyAgdl9QVk9JRF90IHB2b3NHQ3R4LAorICB2b3NfcGt0X3QgKnZvc0RhdGFCdWZmLAorICB2X1BWT0lEX3QgcFJ4SGVhZGVyLAorICB2X1U4X3QgICAgKnVjVHlwZVN1YnR5cGUKKykKK3sKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBOVUxMID09IHBSeEhlYWRlciApCisgIHsKKyAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0RBOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0RBX0RTX0dldEZyYW1lVHlwZVN1YlR5cGUiICk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgICp1Y1R5cGVTdWJ0eXBlID0gKCBXREFfR0VUX1JYX1RZUEUoIHBSeEhlYWRlciApIDw8IDQgKSB8IFdEQV9HRVRfUlhfU1VCVFlQRSggcFJ4SGVhZGVyICk7CisKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbHNlICAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKyAgdl9QVk9JRF90ICAgICAgICAgICBwdkJESGVhZGVyID0gcFJ4SGVhZGVyOworICB2X1UxNl90ICAgICAgICAgICAgIHVzRnJtQ3RybCAgPSAwOyAKKyAgdl9VOF90ICAgICAgICAgICAgICB1Y0ZybVR5cGU7CisgIHZfU0laRV90ICAgICAgICAgICAgdXNGcm1DdHJsU2l6ZSA9IHNpemVvZih1c0ZybUN0cmwpOyAKKyAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IGZyYW1lIGNvbnRyb2wgZmllbGQgZnJvbSA4MDIuMTEgaGVhZGVyIGlmIHByZXNlbnQgCisgICAgKGZyYW1lIHRyYW5zbGF0aW9uIG5vdCBkb25lKSAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc0RhdGFCdWZmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgKCAwID09IFdMQU5IQUxfUlhfQkRfR0VUX0ZUKHB2QkRIZWFkZXIpICkgPworICAgICAgICAgICAgICAgICAgICAgICBXTEFOSEFMX1JYX0JEX0dFVF9NUERVX0hfT0ZGU0VUKHB2QkRIZWFkZXIpOgorICAgICAgICAgICAgICAgICAgICAgICBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAmdXNGcm1DdHJsLCAmdXNGcm1DdHJsU2l6ZSApOworCisgIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSB8fCAKKyAgICAgICggc2l6ZW9mKHVzRnJtQ3RybCkgIT0gdXNGcm1DdHJsU2l6ZSApKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0xBTiBUTDogQ2Fubm90IGV4dHJhY3QgRnJhbWUgQ29udHJvbCBGaWVsZCIgKTsKKyAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworCisgIHVjRnJtVHlwZSA9ICh2X1U4X3QpV0xBTkhBTF9SeEJEX0dldEZyYW1lVHlwZVN1YlR5cGUoIHB2QkRIZWFkZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0ZybUN0cmwpOworICBXTEFOSEFMX1JYX0JEX1NFVF9UWVBFX1NVQlRZUEUocHZCREhlYWRlciwgdWNGcm1UeXBlKTsKKworICAqdWNUeXBlU3VidHlwZSA9IHVjRnJtVHlwZTsKKyAgCisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgV0RBX0RTX1J4QW1zZHVCZEZpeAorCisgIERFU0NSSVBUSU9OCisgICAgRm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgd2l0aCBMaWJyYS9Wb2xhbnMuIE5lZWQgdG8gY2FsbCBIQUwgZnVuY3Rpb24KKyAgICBmb3IgSFcgQkQgYnVnIGZpeAorCisgICAgSXQgZG9lcyBub3RoaW5nIGZvciBpbnRlZ3JhdGVkIFNPQy4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgcHZvc0dDdHggICAgICAgICBWT1MgY29udGV4dAorICAgIHB2QkRIZWFkZXIgICAgICAgQkQgaGVhZGVyIHBvaW50ZXIKKworICAgT1VUCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciBpcyBOVUxMIGFuZCBvdGhlciBlcnJvcnMgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0RBX0RTX1J4QW1zZHVCZEZpeAorKAorICB2X1BWT0lEX3QgcHZvc0dDdHgsCisgIHZfUFZPSURfdCBwdkJESGVhZGVyCispCit7CisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgLyogRG8gbm90aGluZyBmb3IgUHJpbWEgKi8KKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbHNlICAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKyAgLyogQU1TRFUgSFcgYnVnIGZpeAorICAgKiBBZnRlciAybmQgQU1TRFUgc3ViZnJhbWUgSFcgY291bGQgbm90IGhhbmRsZSBCRCBjb3JyZWN0bHkKKyAgICogSEFMIHdvcmthcm91bmQgaXMgbmVlZGVkICovCisgIFdMQU5IQUxfUnhBbXNkdUJkRml4KHB2b3NHQ3R4LCBwdkJESGVhZGVyKTsKKyAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgV0RBX0RTX0dldFJzc2kKKworICBERVNDUklQVElPTgorICAgIEdldCBSU1NJIAorCisgIFRPRE8gSXQgcmV0dXJucyBoYXJkY29kZWQgdmFsdWUgaW4gdGhlIG1lYW50aW1lIHNpbmNlIFdEQS9XREkgZG9lcyBub3RoaW5nCisgICAgICAgc3VwcG9ydCBpdCB5ZXQgZm9yIFByaW1hLgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICB2b3NEYXRhQnVmZiAgICAgIHZvcyBkYXRhIGJ1ZmZlcgorCisgICBPVVQKKyAgICBwdVJzc2kgICAgICAgICAgIFJTU0kKKworICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXREFfRFNfR2V0UnNzaQorKAorICB2X1BWT0lEX3QgcHZvc0dDdHgsCisgIHZfUzdfdCogICBwdVJzc2kKKykKK3sKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJXREE6aGFsUFNfR2V0UnNzaSBubyBsb25nZXIgc3VwcG9ydGVkLiBOZWVkIHJlcGxhY2VtZW50Iik7CisKKyAgKnB1UnNzaSA9IC0zMDsKKworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworI2Vsc2UgIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworICBoYWxQU19HZXRSc3NpKHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1NNRSwgcHZvc0dDdHgpLCBwdVJzc2kpOworICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfR2V0VHhSZXNvdXJjZXMKKworICBERVNDUklQVElPTgorICAgIEl0IGRvZXMgcmV0dXJuIGhhcmRjb2RlZCB2YWx1ZS4gSXQgc2hvdWxkIGJpZ2dlciBudW1iZXIgdGhhbiAwLgorICAgIFJldHVybmluZyAwIHdpbGwgcHV0IFRMIGluIG91dC1vZi1yZXNvdXJjZSBjb25kaXRpb24gZm9yIFRYLgorCisgICAgUmV0dXJuIGN1cnJlbnQgUERVIHJlc291cmNlcyBmcm9tIEJBTCBmb3IgTk9OIGludGVncmF0ZWQgU09DLgorICAgIAorICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgdm9zRGF0YUJ1ZmYgICAgICB2b3MgZGF0YSBidWZmZXIKKyAgIAorICAgT1VUCisgICAgcHVSZXNDb3VudCAgICAgICAgYXZhaWxhYmxlIFBEVSBudW1iZXIgZm9yIFRYCisKKyAgUkVUVVJOIFZBTFVFCisgICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciBpcyBOVUxMIGFuZCBvdGhlciBlcnJvcnMgCisgICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVk9TX1NUQVRVUworV0RBX0RTX0dldFR4UmVzb3VyY2VzCisoIAorICB2X1BWT0lEX3QgcHZvc0dDdHgsCisgIHZfVTMyX3QqICBwdVJlc0NvdW50CispCit7CisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgLyogUmV0dXJuIG1pbmltdW0gbmVjZXNzYXJ5IG51bWJlciBvZiBwYWNrZXQoRFhFIGRlc2NyaXB0b3IpIGZvciBkYXRhICovCisgIC8qIFRPRE8gTmVlZCB0byBnZXQgdGhpcyBmcm9tIERYRT8/PyAqLworICAqcHVSZXNDb3VudCA9IFdEQV9UTElfQkRfUERVX1JFU0VSVkVfVEhSRVNIT0xEICsgNTA7CisgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisjZWxzZSAgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisgIHJldHVybiBXTEFOQkFMX0dldFR4UmVzb3VyY2VzKCBwdm9zR0N0eCwgcHVSZXNDb3VudCApOworI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgV0RBX0RTX0dldFJlcGxheUNvdW50ZXIKKworICBERVNDUklQVElPTgorICAgIFJldHVybiByZXBsYXkgY291bnRlciBmcm9tIEJEIGhlYWRlciBvciBSWCBtZXRhIGluZm8KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgcFJ4SGVhZGVyICAgICAgICBSWCBtZXRhIGluZm8gb3IgQkQgaGVhZGVyIHBvaW50ZXIKKworICAgT1VUCisKKyAgUkVUVVJOIFZBTFVFCisgICAgUmVwbGF5IENvdW50ZXIKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2X1U2NF90CitXREFfRFNfR2V0UmVwbGF5Q291bnRlcgorKAorICB2X1BWT0lEX3QgcFJ4SGVhZGVyCispCit7CisjaWYgZGVmaW5lZCggRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICkKKyAgcmV0dXJuIFdEQV9HRVRfUlhfUkVQTEFZX0NPVU5UKCBwUnhIZWFkZXIgKTsKKyNlbHNlICAvKiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKi8KKyAgIHZfVThfdCAqcHVjUnhCREhlYWRlciA9IHBSeEhlYWRlcjsKKworLyogNDgtYml0IHJlcGxheSBjb3VudGVyIGlzIGNyZWF0ZWQgYXMgZm9sbG93cworICAgZnJvbSBSWCBCRCA2IGJ5dGUgUE1JIGNvbW1hbmQ6CisgICBBZGRyIDogQUVTL1RLSVAKKyAgIDB4MzggOiBwbjMvdHNjMworICAgMHgzOSA6IHBuMi90c2MyCisgICAweDNhIDogcG4xL3RzYzEKKyAgIDB4M2IgOiBwbjAvdHNjMAorCisgICAweDNjIDogcG41L3RzYzUKKyAgIDB4M2QgOiBwbjQvdHNjNCAqLworCisjaWZkZWYgQU5JX0JJR19CWVRFX0VORElBTgorICAgIHZfVTY0X3QgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAwOworICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCisgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSBXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjBUTzIzKHB1Y1J4QkRIZWFkZXIpOyAKKyAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA8PD0gMTY7CisgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgfD0gKCggV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzI0VE8yNShwdWNSeEJESGVhZGVyKSAmIDB4RkZGRjAwMDApID4+IDE2KTsKKyAgICByZXR1cm4gdWxsY3VycmVudFJlcGxheUNvdW50ZXI7CisjZWxzZQorICAgIHZfVTY0X3QgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAwOworICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCisgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAoV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzI0VE8yNShwdWNSeEJESGVhZGVyKSAmIDB4MDAwMEZGRkYpOyAKKyAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA8PD0gMzI7IAorICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIHw9IFdMQU5IQUxfUlhfQkRfR0VUX1BNSUNNRF8yMFRPMjMocHVjUnhCREhlYWRlcik7IAorICAgIHJldHVybiB1bGxjdXJyZW50UmVwbGF5Q291bnRlcjsKKyNlbmRpZgorCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCit9CisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgV0RBX0RTX1R4RnJhbWVzCisKKyAgREVTQ1JJUFRJT04KKyAgICBQdWxsIHBhY2tldHMgZnJvbSBUTCBhbmQgcHVzaCB0aGVtIHRvIFdESS4gSXQgZ2V0cyBpbnZva2VkIHVwb24KKyAgICBXREFfRFNfVFhfU1RBUlRfWE1JVC4KKworICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZlbGFudCBvZiBXTEFOU1NDX1RyYW5zbWl0IGluIExpYnJhL1ZvbGFucy4KKworICBUT0RPCisgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYW5kIG1vdmVkIGluIFdESS4KKworICBERVBFTkRFTkNJRVMKKworICBQQVJBTUVURVJTCisKKyAgIElOCisgICAgcHZvc0dDdHggICAgICAgICBWT1MgY29udGV4dAorCisgICBPVVQKKworICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK1ZPU19TVEFUVVMKK1dEQV9EU19UeEZyYW1lcworKCAKKyAgdl9QVk9JRF90IHB2b3NHQ3R4IAorKQoreworICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyAgdm9zX3BrdF90ICAqcFR4TWdtdENoYWluID0gTlVMTDsKKyAgdm9zX3BrdF90ICAqcFR4RGF0YUNoYWluID0gTlVMTDsKKyAgdm9zX3BrdF90ICAqcFR4UGFja2V0ID0gTlVMTDsKKyAgdl9CT09MX3QgICBiVXJnZW50OworICB3cHRfdWludDMyICB1Y1R4UmVzUmVxOworICBXRElfU3RhdHVzIHdkaVN0YXR1czsKKyAgdFdEQV9DYkNvbnRleHQgKndkYUNvbnRleHQgPSBOVUxMOworICB2X1UzMl90ICAgICB1TWdtdEF2YWlsUmVzOworICB2X1UzMl90ICAgICB1RGF0YUF2YWlsUmVzOworICBXTEFOVExfVHhDb21wQ0JUeXBlICBwZm5UeENvbXAgPSBOVUxMOworCisgIHdkYUNvbnRleHQgPSAodFdEQV9DYkNvbnRleHQgKil2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9XREEsIHB2b3NHQ3R4KTsKKyAgaWYgKCBOVUxMID09IHdkYUNvbnRleHQgKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldEQTpJbnZhbGlkIHdkYSBjb250ZXh0IHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXREFfRFNfVHhGcmFtZXMiICk7CisgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBOZWVkIHRvIGZldGNoIHNlcGFyYXRlbGx5IGZvciBNZ210IGFuZCBEYXRhIGZyYW1lcyBiZWNhdXNlIFRMIGlzIG5vdAorICAgICBhd2FyZSBvZiBzZXBhcmF0ZSByZXNvdXJjZSBtYW5hZ2VtZW50IGF0IHRoZSBsb3dlciBsZXZlbHMgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKk1nbXQgdHgqLworICB1TWdtdEF2YWlsUmVzID0gV0RJX0dldEF2YWlsYWJsZVJlc0NvdW50KHdkYUNvbnRleHQtPnBXZGlDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfTUdNVF9QT09MX0lEKTsKKyAgCisgIHVjVHhSZXNSZXEgPSBXTEFOVExfR2V0RnJhbWVzKCBwdm9zR0N0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFR4TWdtdENoYWluLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TWdtdEF2YWlsUmVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZGFDb250ZXh0LT51VHhGbG93TWFzayAmIFdEQV9ISV9GTE9XX01BU0spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJVcmdlbnQgKTsKKworICAvLyBXZSBuZWVkIHRvIGluaXRpYWxpemUgdnNvU3RhdHVzIGluIGNhc2Ugd2UgZG9uJ3QgZW50ZXIgdGhlICJ3aGlsZSIKKyAgLy8gbG9vcC4gIElmIHdlIGRvbid0IGVudGVyIHRoZSBsb29wLCBpdCBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBwYWNrZXRzLAorICAvLyBhdmFpbGFibGUsIGFuZCB0aGF0IGlzIGNvbnNpZGVyZWQgc3VjY2Vzcy4gIElmIHdlIGVudGVyIHRoZSBsb29wLAorICAvLyB2b3NTdGF0dXMgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbnNpZGUgdGhlIGxvb3AKKyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOworICAgICAgCisgIHdoaWxlICggTlVMTCAhPSBwVHhNZ210Q2hhaW4gKQorICB7CisgICAgLyogV2FsayB0aGUgY2hhaW4gYW5kIHVuY2hhaW4gdGhlIHBhY2tldCAqLworICAgIHBUeFBhY2tldCA9IHBUeE1nbXRDaGFpbjsKKyAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCBwVHhNZ210Q2hhaW4sICZwVHhNZ210Q2hhaW4sIFZPU19UUlVFICk7CisKKyAgICBpZiggKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpICYmCisgICAgICAgIChWT1NfU1RBVFVTX0VfRU1QVFkgIT0gdm9zU3RhdHVzKSApCisgICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiV0RBIFdhbGtpbmcgcGFja2V0IGNoYWluIHJldHVybmVkIHN0YXR1cyA6ICVkIiwgdm9zU3RhdHVzICk7CisgICAgICBWT1NfQVNTRVJUKCAwICk7CisgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICggVk9TX1NUQVRVU19FX0VNUFRZID09IHZvc1N0YXR1cyApCisgICAgeworICAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICB3ZGlTdGF0dXMgPSBXRElfRFNfVHhQYWNrZXQoIHdkYUNvbnRleHQtPnBXZGlDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3cHRfcGFja2V0KilwVHhQYWNrZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBtb3JlICovICk7CisgICAgaWYgKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd2RpU3RhdHVzICkKKyAgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiV0RBIDogUHVzaGluZyBhIHBhY2tldCB0byBXREkgZmFpbGVkLiIpOworICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgLy9XZSBuZWVkIHRvIGZyZWUgdGhlIHBhY2tldCBoZXJlCisgICAgICB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKHBUeFBhY2tldCwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsICh2b2lkICoqKSZwZm5UeENvbXApOworICAgICAgaWYocGZuVHhDb21wKQorICAgICAgeworICAgICAgICAgcGZuVHhDb21wKHB2b3NHQ3R4LCBwVHhQYWNrZXQsIFZPU19TVEFUVVNfRV9GQUlMVVJFKTsKKyAgICAgIH0KKyAgICB9CisKKyAgfTsKKworICAvKkRhdGEgdHgqLworICB1RGF0YUF2YWlsUmVzID0gV0RJX0dldEF2YWlsYWJsZVJlc0NvdW50KHdkYUNvbnRleHQtPnBXZGlDb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfREFUQV9QT09MX0lEKTsKKworICB1Y1R4UmVzUmVxID0gV0xBTlRMX0dldEZyYW1lcyggcHZvc0dDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUeERhdGFDaGFpbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKldEQV9EU19EWEVfUkVTX0NPVU5UKi8gdURhdGFBdmFpbFJlcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2RhQ29udGV4dC0+dVR4Rmxvd01hc2sgJiBXREFfTE9fRkxPV19NQVNLKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiVXJnZW50ICk7CisKKyAgLy8gV2UgbmVlZCB0byBpbml0aWFsaXplIHZzb1N0YXR1cyBpbiBjYXNlIHdlIGRvbid0IGVudGVyIHRoZSAid2hpbGUiCisgIC8vIGxvb3AuICBJZiB3ZSBkb24ndCBlbnRlciB0aGUgbG9vcCwgaXQgbWVhbnMgdGhhdCB0aGVyZSBhcmUgbm8gcGFja2V0cywKKyAgLy8gYXZhaWxhYmxlLCBhbmQgdGhhdCBpcyBjb25zaWRlcmVkIHN1Y2Nlc3MuICBJZiB3ZSBlbnRlciB0aGUgbG9vcCwKKyAgLy8gdm9zU3RhdHVzIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHkgaW5zaWRlIHRoZSBsb29wCisgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICB3aGlsZSAoIE5VTEwgIT0gcFR4RGF0YUNoYWluICkKKyAgeworICAgIC8qIFdhbGsgdGhlIGNoYWluIGFuZCB1bmNoYWluIHRoZSBwYWNrZXQgKi8KKyAgICBwVHhQYWNrZXQgPSBwVHhEYXRhQ2hhaW47CisgICAgdm9zU3RhdHVzID0gdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggcFR4RGF0YUNoYWluLCAmcFR4RGF0YUNoYWluLCBWT1NfVFJVRSApOworCisgICAgaWYoIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKSAmJgorICAgICAgICAoVk9TX1NUQVRVU19FX0VNUFRZICE9IHZvc1N0YXR1cykgKQorICAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldEQSBXYWxraW5nIHBhY2tldCBjaGFpbiByZXR1cm5lZCBzdGF0dXMgOiAlZCIsIHZvc1N0YXR1cyApOworICAgICAgVk9TX0FTU0VSVCggMCApOworICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIFZPU19TVEFUVVNfRV9FTVBUWSA9PSB2b3NTdGF0dXMgKQorICAgIHsKKyAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgd2RpU3RhdHVzID0gV0RJX0RTX1R4UGFja2V0KCB3ZGFDb250ZXh0LT5wV2RpQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod3B0X3BhY2tldCopcFR4UGFja2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogbW9yZSAqLyApOworICAgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IHdkaVN0YXR1cyApCisgICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIldEQSA6IFB1c2hpbmcgYSBwYWNrZXQgdG8gV0RJIGZhaWxlZC4iKTsKKyAgICAgIC8qIFRPRE8gV2Qgc2hvdWxkIHJldHVybiB0aGlzIHBhY2tldCB0byBWT1NTLiBPdGhlcndpc2UKKyAgICAgICAgIFVNQUMgaXMgZ29pbmcgaW4gbG93IHJlc291cmNlIGNvbmRpdGlvbi4KKyAgICAgICAgIFdobyBuZWVkcyB0byBkbyBpdD8gRFhFLCBXREk/IAorICAgICAgICAgKi8KKyAgICAgIFZPU19BU1NFUlQoIDAgKTsKKyAgICAgIC8vV2UgbmVlZCB0byBmcmVlIHRoZSBwYWNrZXQgaGVyZQorICAgICAgdm9zX3BrdF9nZXRfdXNlcl9kYXRhX3B0cihwVHhQYWNrZXQsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLCAodm9pZCAqKikmcGZuVHhDb21wKTsKKyAgICAgIGlmKHBmblR4Q29tcCkKKyAgICAgIHsKKyAgICAgICAgIHBmblR4Q29tcChwdm9zR0N0eCwgcFR4UGFja2V0LCBWT1NfU1RBVFVTX0VfRkFJTFVSRSk7CisgICAgICB9CisgICAgfQorCisgIH07CisKKyAgV0RJX0RTX1R4Q29tcGxldGUod2RhQ29udGV4dC0+cFdkaUNvbnRleHQsIHVjVHhSZXNSZXEpOworCisgIHJldHVybiB2b3NTdGF0dXM7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRlVOQ1RJT04gICAgV0RBX0RTX1R4Rmxvd0NvbnRyb2xDYWxsYmFjaworCisgIERFU0NSSVBUSU9OCisgICAgSW52b2tlZCBieSBXREkgdG8gY29udHJvbCBUWCBmbG93LgorCisgIERFUEVOREVOQ0lFUworCisgIFBBUkFNRVRFUlMKKworICAgSU4KKyAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0CisgICAgdUZsb3dNYXNrICAgICAgICBUWCBjaGFubmVsIG1hc2sgZm9yIGZsb3cgY29udHJvbAorICAgICAgICAgICAgICAgICAgICAgRGVmaW5lZCBpbiBXREFfVFhGbG93RW51bVR5cGUKKworICAgT1VUCisKKyAgUkVUVVJOIFZBTFVFCisKKyAgU0lERSBFRkZFQ1RTCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9WT0lEX3QKK1dEQV9EU19UeEZsb3dDb250cm9sQ2FsbGJhY2sKKygKKyAgIHZfUFZPSURfdCBwdm9zR0N0eCwKKyAgIHZfVThfdCAgICB1Y0Zsb3dNYXNrCispCit7CisgICB0V0RBX0NiQ29udGV4dCogd2RhQ29udGV4dCA9IE5VTEw7CisgICAgdl9VOF90ICAgICAgICAgIHVjT2xkRmxvd01hc2s7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggTlVMTCA9PSBwdm9zR0N0eCApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJXREE6IEludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0RBX0RTX1R4Rmxvd0NvbnRyb2xDYWxsYmFjayIgKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgd2RhQ29udGV4dCA9ICh0V0RBX0NiQ29udGV4dCAqKXZvc19nZXRfY29udGV4dCggVk9TX01PRFVMRV9JRF9XREEsIHB2b3NHQ3R4ICk7CisgICBpZiAoIE5VTEwgPT0gd2RhQ29udGV4dCApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJXREE6IEludmFsaWQgY29udGV4dCBvbiBXREFfRFNfVHhGbG93Q29udHJvbENhbGxiYWNrIiApOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiB0d28gcGh5c2ljYWwgRFhFIGNoYW5uZWxzCisgICAgICAxKSBkYXRhIHBhY2tldHMoYWxsIGZvdXIgQUMpIGFuZCBCQVAgZm9yIHRoZSBsb3cgcHJpb3JpdHkgY2hhbm5lbChsb3dlciA0IGJpdHMpIAorICAgICAgMikgbWFuYWdlbWVudCBwYWNrZXRzIGZvciBoaWdoIHByaW9yaXR5IGNoYW5uZWwoNXRoIGJpdCkKKyAgICovCisKKworICAgLypTYXZlIGFuZCByZXNldCAqLworICAgdWNPbGRGbG93TWFzayAgICAgICAgICAgPSB3ZGFDb250ZXh0LT51VHhGbG93TWFzazsgCisgICB3ZGFDb250ZXh0LT51VHhGbG93TWFzayA9IHVjRmxvd01hc2s7CisKKyAgIC8qSWYgdGhlIEFDIGlzIGJlaW5nIGVuYWJsZWQgLSByZXN1bWUgZGF0YSB4ZmVyIAorICAgIAorICAgIEFzc3VtZSBwcmV2aW91cyB2YWx1ZSBvZiB3ZGFDb250ZXh0LT51VHhGbG93TWFzazogCisgICAgCisgICAgREFUQVxNR00gfCAgT04gIHwgT0ZGCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBPTiAgIHwgMUYgICB8IDBGICoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE9GRiAgfCAgMTAgKnwgMDAgKgorICAgIAorICAgICAgICAqIC0gc3RhdGVzIGluIHdoaWNoIGEgY2hhbm5lbCBjYW4gYmUgZW5hYmxlZAorICAgIAorICAgICAgdWNGbG93TWFzayB3aWxsIHRlbGwgd2hpY2ggY2hhbm5lbCBtdXN0IGJlIGVuYWJsZWQKKyAgICAgIHRvIGVuYWJsZSBhIGNoYW5uZWwgYSBuZXcgYml0IG11c3QgYmUgdHVybmVkIG9uID0+CisgICAgICB1Y0Zsb3dNYXNrID4gd2RhQ29udGV4dC0+dVR4Rmxvd01hc2sgd2hlbiBlbmFibGUgaGFwcGVucworICAgKi8KKworICAgaWYgKCB1Y0Zsb3dNYXNrID4gdWNPbGRGbG93TWFzayAgKQorICAgeworICAgICBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKKyAgIH0KKworfQorI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBGVU5DVElPTiAgICBXREFfRFNfR2V0VHhGbG93TWFzaworCisgIERFU0NSSVBUSU9OCisgICAgcmV0dXJuIFRYIGZsb3cgbWFzayBjb250cm9sIHZhbHVlCisKKyAgREVQRU5ERU5DSUVTCisKKyAgUEFSQU1FVEVSUworCisgICBJTgorICAgIHB2b3NHQ3R4ICAgICAgICAgVk9TIGNvbnRleHQKKworICAgT1VUCisgICAgdUZsb3dNYXNrICAgICAgICBUWCBjaGFubmVsIG1hc2sgZm9yIGZsb3cgY29udHJvbAorICAgICAgICAgICAgICAgICAgICAgRGVmaW5lZCBpbiBXREFfVFhGbG93RW51bVR5cGUKKworICBSRVRVUk4gVkFMVUUKKyAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBwb2ludGVyIGlzIE5VTEwgYW5kIG90aGVyIGVycm9ycyAKKyAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKKworICBTSURFIEVGRkVDVFMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitWT1NfU1RBVFVTCitXREFfRFNfR2V0VHhGbG93TWFzaworKAorIHZfUFZPSURfdCBwdm9zR0N0eCwKKyB2X1U4X3QqICAgcHVGbG93TWFzaworKQoreworI2lmIGRlZmluZWQoIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyApCisgICB0V0RBX0NiQ29udGV4dCogd2RhQ29udGV4dCA9IE5VTEw7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggKCBOVUxMID09IHB2b3NHQ3R4ICkgfHwgKCBOVUxMID09IHB1Rmxvd01hc2sgKSApCisgICB7CisgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfV0RBLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJXREE6IEludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0RBX0RTX0dldFR4Rmxvd01hc2siICk7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICB3ZGFDb250ZXh0ID0gKHRXREFfQ2JDb250ZXh0ICopdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX1dEQSwgcHZvc0dDdHggKTsKKyAgIGlmICggTlVMTCA9PSB3ZGFDb250ZXh0ICkKKyAgIHsKKyAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldEQTogSW52YWxpZCBjb250ZXh0IG9uIFdEQV9EU19HZXRUeEZsb3dNYXNrIiApOworICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgKnB1Rmxvd01hc2sgPSB3ZGFDb250ZXh0LT51VHhGbG93TWFzazsKKworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbHNlCisgICAqcHVGbG93TWFzayA9IFdEQV9UWEZMT1dNQVNLOworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKyNlbmRpZiAgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCit9CisKKyNpZiBkZWZpbmVkKCBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MgKQordl9WT0lEX3QgCitXREFfRFNfVHhDb21wbGV0ZUNCCisoCisgdl9QVk9JRF90IHB2b3NHQ3R4LCAKKyB2X1BWT0lEX3QgcEZyYW1lRGF0YUJ1ZmYKKykKK3sKKyAgdFdEQV9DYkNvbnRleHQqICAgICAgICB3ZGFDb250ZXh0ID0gTlVMTDsKKyAgV0RJX0RTX1R4TWV0YUluZm9UeXBlKiBwVHhNZXRhZGF0YTsKKyAgVk9TX1NUQVRVUyAgICAgICAgICAgICB2b3NTdGF0dXM7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICBpZiAoICggTlVMTCA9PSBwdm9zR0N0eCApIHx8ICggTlVMTCA9PSBwRnJhbWVEYXRhQnVmZiApICkKKyAgeworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9XREEsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREE6IEludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0RBX0RTX1R4Q29tcGxldGVDQiIgKTsKKyAgICByZXR1cm47CisgIH0KKworICB3ZGFDb250ZXh0ID0gKHRXREFfQ2JDb250ZXh0ICopdm9zX2dldF9jb250ZXh0KCBWT1NfTU9EVUxFX0lEX1dEQSwgcHZvc0dDdHggKTsKKyAgaWYgKCBOVUxMID09IHdkYUNvbnRleHQgKQorICB7CisgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldEQTogSW52YWxpZCBjb250ZXh0IG9uIFdEQV9EU19UeENvbXBsZXRlQ0IiICk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIFBBTCBwYWNrZXQKKyAgcFR4TWV0YWRhdGEgPSBXRElfRFNfRXh0cmFjdFR4TWV0YURhdGEoICh3cHRfcGFja2V0KilwRnJhbWVEYXRhQnVmZiApOworICAKKyAgaWYgKCBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgPT0gcFR4TWV0YWRhdGEtPnR4Q29tcGxldGVTdGF0dXMgKQorICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgZWxzZSAKKyAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKworICB3ZGFDb250ZXh0LT5wZm5UeENvbXBsZXRlQ2FsbGJhY2soIHB2b3NHQ3R4LCBwRnJhbWVEYXRhQnVmZiwgdm9zU3RhdHVzICk7Cit9CisjZW5kaWYgIC8qIEZFQVRVUkVfV0xBTl9JTlRFR1JBVEVEX1NPQyAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9XREEvc3JjL3dsYW5fcWN0X3dkYV9sZWdhY3kuYyBiL0NPUkUvV0RBL3NyYy93bGFuX3FjdF93ZGFfbGVnYWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzNjdkMgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RBL3NyYy93bGFuX3FjdF93ZGFfbGVnYWN5LmMKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgd2xhbl9xY3Rfd2RhX2xlZ2FjeS5jCisKKyAgT1ZFUlZJRVc6CisKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBEZXZpY2UgQWRhcHRhdGlvbgorICBMYXllciBmb3IgdGhlIGxlZ2FjeSBmdW5jdGlvbmFsaXRpZXMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIG9sZCBIQUwuCisKKyAgVGhlIGZ1bmN0aW9ucyBleHRlcm5hbGl6ZWQgYnkgdGhpcyBtb2R1bGUgYXJlIHRvIGJlIGNhbGxlZCBPTkxZIGJ5IG90aGVyCisgIFdMQU4gbW9kdWxlcyB0aGF0IHByb3Blcmx5IHJlZ2lzdGVyIHdpdGggdGhlIFRyYW5zcG9ydCBMYXllciBpbml0aWFsbHkuCisKKyAgREVQRU5ERU5DSUVTOgorCisgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorCisKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogU3RhbmRhcmQgaW5jbHVkZSBmaWxlcyAqLworLyogQXBwbGljYXRpb24gU3BlY2lmaWMgaW5jbHVkZSBmaWxlcyAqLworI2luY2x1ZGUgImxpbUFwaS5oIgorI2luY2x1ZGUgInBtbUFwaS5oIgorI2luY2x1ZGUgImNmZ0FwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkYV9kZWJ1Zy5oIgorCisvKiBMb2NhbGx5IHVzZWQgRGVmaW5lcyAqLworCisjZGVmaW5lIEhBTF9NTUhfTUJfTVNHX1RZUEVfTUFTSyAgICAweEZGMDAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiB3ZGFQb3N0Q3RybE1zZworICoKKyAqIEZVTkNUSU9OOgorICogICAgIFBvc3RzIFdEQSBtZXNzYWdlcyB0byBNQyB0aHJlYWQKKyAqCisgKiBMT0dJQzoKKyAqCisgKiBBU1NVTVBUSU9OUzpwbAorICoKKyAqCisgKiBOT1RFOgorICoKKyAqIEBwYXJhbSB0cEFuaVNpckdsb2JhbCBNQUMgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBwTXNnIHBvaW50ZXIgd2l0aCBtZXNzYWdlCisgKiBAcmV0dXJuIFN1Y2Nlc3Mgb3IgRmFpbHVyZQorICovCisKK3RTaXJSZXRTdGF0dXMKK3dkYVBvc3RDdHJsTXNnKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRTaXJNc2dRICpwTXNnKQoreworICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01RX0lEX1dEQSwgKHZvc19tc2dfdCAqKSBwTXNnKSkKKyAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICBlbHNlCisgICAgICByZXR1cm4gZVNJUl9TVUNDRVNTOworfSAvLyBoYWxQb3N0TXNnKCkKKworLyoqCisgKiB3ZGFQb3N0Q2ZnTXNnCisgKgorICogRlVOQ1RJT046CisgKiAgICAgUG9zdHMgTU5UIG1lc3NhZ2VzIHRvIGdTaXJNbnRNc2dRCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHRwQW5pU2lyR2xvYmFsIE1BQyBwYXJhbWV0ZXJzIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2cgQSBwb2ludGVyIHRvIHRoZSBtc2cKKyAqIEByZXR1cm4gU3VjY2VzcyBvciBGYWlsdXJlCisgKi8KKwordFNpclJldFN0YXR1cword2RhUG9zdENmZ01zZyh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSAqcE1zZykKK3sKKyAgIHRTaXJSZXRTdGF0dXMgcmMgPSBlU0lSX1NVQ0NFU1M7CisKKyAgIGRvCisgICB7CisjaWZkZWYgQU5JX09TX1RZUEVfUlRBSV9MSU5VWAorCisgICAgICAvLyBQb3N0cyBtZXNzYWdlIHRvIHRoZSBxdWV1ZQorCisgICAgICBpZiAodHhfcXVldWVfc2VuZCgmcE1hYy0+c3lzLmdTaXJNbnRNc2dRLCBwTXNnLAorICAgICAgICAgICAgICAgICAgICAgICBUWF9OT19XQUlUKSAhPSBUWF9TVUNDRVNTKQorICAgICAgeworICAgICAgICAgd2RhTG9nKHBNYWMsIExPR1AsIEZMKCJRdWV1ZSBzZW5kIEZhaWxlZCEgcmMgKCVYKVxuIiksCisgICAgICAgICAgICAgICAgZVNJUl9TWVNfVFhfUV9TRU5EX0ZBSUxFRCk7CisgICAgICAgICByYyA9IGVTSVJfU1lTX1RYX1FfU0VORF9GQUlMRUQ7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworI2Vsc2UKKyAgICAgIC8vIEZvciBXaW5kb3dzIGJhc2VkIE1BQywgaW5zdGVhZCBvZiBwb3N0aW5nIG1lc3NhZ2UgdG8gZGlmZmVyZW50CisgICAgICAvLyBxdWV1ZXMgd2Ugd2lsbCBjYWxsIHRoZSBoYW5kbGVyIHJvdXRpbmVzIGRpcmVjdGx5CisKKyAgICAgIGNmZ1Byb2Nlc3NNYk1zZyhwTWFjLCAodFNpck1iTXNnKilwTXNnLT5ib2R5cHRyKTsKKyAgICAgIHJjID0gZVNJUl9TVUNDRVNTOworI2VuZGlmCisgICB9IHdoaWxlICgwKTsKKworICAgcmV0dXJuIHJjOworfSAvLyBoYWxNbnRQb3N0TXNnKCkKKworI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyNpZiBkZWZpbmVkKEFOSV9NQU5GX0RJQUcpIHx8IGRlZmluZWQoQU5JX1BIWV9ERUJVRykKKyNpbmNsdWRlICJwdHRNb2R1bGVBcGkuaCIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogaGFsTmltUFRUUG9zdE1zZ0FwaQorICoKKyAqIEZVTkNUSU9OOgorICogICAgIFBvc3RzIE5JTSBtZXNzYWdlcyB0byBnTklNIHRocmVhZAorICoKKyAqIExPR0lDOgorICoKKyAqIEFTU1VNUFRJT05TOnBsCisgKgorICoKKyAqIE5PVEU6CisgKgorICogQHBhcmFtIHRwQW5pU2lyR2xvYmFsIE1BQyBwYXJhbWV0ZXJzIHN0cnVjdHVyZQorICogQHBhcmFtIHBNc2cgcG9pbnRlciB3aXRoIG1lc3NhZ2UKKyAqIEByZXR1cm4gU3VjY2VzcyBvciBGYWlsdXJlCisgKi8KKwordFNpclJldFN0YXR1cworaGFsTmltUFRUUG9zdE1zZ0FwaSh0cEFuaVNpckdsb2JhbCBwTWFjLCB0U2lyTXNnUSAqcE1zZykKK3sKKyAgIHRTaXJSZXRTdGF0dXMgcmMgPSBlU0lSX1NVQ0NFU1M7CisKKyAgIGRvCisgICB7CisjaWZkZWYgQU5JX09TX1RZUEVfUlRBSV9MSU5VWAorCisgICAgICAvLyBQb3N0cyBtZXNzYWdlIHRvIHRoZSBxdWV1ZQorICAgICAgaWYgKHR4X3F1ZXVlX3NlbmQoJnBNYWMtPnN5cy5nU2lyTmltUkRNc2dRLCBwTXNnLAorICAgICAgICAgICAgICAgICAgICAgICBUWF9OT19XQUlUKSAhPSBUWF9TVUNDRVNTKQorICAgICAgeworICAgICAgICAgcmMgPSBlU0lSX0ZBSUxVUkU7CisgICAgICAgICB3ZGFMb2cocE1hYywgTE9HUCwKKyAgICAgICAgICAgICAgICBGTCgiUG9zdGluZyBhIE1zZyB0byBuaW1Nc2dRIGZhaWxlZCFcbiIpKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgfQorI2Vsc2UKKyAgICAgIC8vIEZvciBXaW5kb3dzIGJhc2VkIE1BQywgaW5zdGVhZCBvZiBwb3N0aW5nIG1lc3NhZ2UgdG8gZGlmZmVyZW50CisgICAgICAvLyBxdWV1ZXMsIHdlIHdpbGwgY2FsbCB0aGUgaGFuZGxlciByb3V0aW5lcyBkaXJlY3RseQorICAgICAgd2RhTG9nKHBNYWMsIExPR0UsICJFUlJPUjogUmVjZWl2ZWQgUFRUIG1lc3NhZ2UgaW4gb2Jzb2xldGUgY29kZSBwYXRoLlxuIik7CisgICAgICB3ZGFMb2cocE1hYywgTE9HUCwgIlRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHdyb25nIE9JRCBpcyBiZWluZyB1c2VkIC0gY2xlYW4gcmVnaXN0cnkgYW5kIHByZXZpb3VzIGluZiBmaWxlcy5cbiIpOworICAgICAgLyoKKyAgICAgIHRQdHRNc2didWZmZXIgKm1zZ1B0ciA9ICh0UHR0TXNnYnVmZmVyICopKHBNc2ctPmJvZHkpOyAgLy9mb3Igc29tZSByZWFzb24sIGJvZHkgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBhcyBpZiBpdCB3ZXJlIGEgdm9pZCAqCisgICAgICBwdHRQcm9jZXNzTXNnKHBNYWMsIG1zZ1B0cik7CisgICAgICAqLworCisgICAgICAvL1RPRE86IHRoZSByZXNvbnNlIGlzIG5vdyBwYWNrYWdlZCBpbiAoKHRQdHRNc2didWZmZXIgKikmcE1zZy0+Ym9keSktPm1zZ1Jlc3BvbnNlIGFuZCBuZWVkcyB0byBiZSBzZW50IGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uCisKKyAgICAgIHJjID0gZVNJUl9TVUNDRVNTOworI2VuZGlmCisgICB9CisgICB3aGlsZSAoMCk7CisKKyAgIHJldHVybiByYzsKK30gLy8gaGFsTmltUFRUUG9zdE1zZ0FwaSgpCisKKworI2VuZGlmICAvL0FOSV9NQU5GX0RJQUcKKyNlbmRpZiAgLy9GRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiB1TWFjUG9zdEN0cmxNc2cKKyAqCisgKiBGVU5DVElPTjoKKyAqICAgICBGb3J3YXJkcyB0aGUgY29tcGxldGVseSByZWNlaXZlZCBtZXNzYWdlIHRvIHRoZSByZXNwZWN0aXZlCisgKiAgICBtb2R1bGVzIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKgorICogTE9HSUM6CisgKgorICogQVNTVU1QVElPTlM6CisgKiAgICBGcmVlaW5nIHVwIG9mIHRoZSBtZXNzYWdlIGJ1ZmZlciBpcyBsZWZ0IHRvIHRoZSBkZXN0aW5hdGlvbiBtb2R1bGUuCisgKgorICogTk9URToKKyAqICBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBBUEkgZmlsZSBiZWNhdXNlIGZvciBNQUMgcnVubmluZworICogIG9uIFdpbmRvd3MgaG9zdCwgdGhlIGhvc3QgbW9kdWxlIHdpbGwgY2FsbCB0aGlzIHJvdXRpbmUgZGlyZWN0bHkgdG8KKyAqICBzZW5kIGFueSBtYWlsYm94IG1lc3NhZ2VzLiBNYWtpbmcgdGhpcyBmdW5jdGlvbiBhbiBBUEkgbWFrZXMgc3VyZSB0aGF0CisgKiAgb3V0c2lkZSB3b3JsZCAoYW55IG1vZHVsZSBvdXRzaWRlIE1NSCkgb25seSBjYWxscyBBUElzIHRvIHVzZSBNTUgKKyAqICBzZXJ2aWNlcyBhbmQgbm90IGFuIGludGVybmFsIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBwTWIgQSBwb2ludGVyIHRvIHRoZSBtYWlib3ggbWVzc2FnZQorICogQHJldHVybiBOT05FCisgKi8KKwordFNpclJldFN0YXR1cyB1TWFjUG9zdEN0cmxNc2codm9pZCogcFNpckdsb2JhbCwgdFNpck1iTXNnKiBwTWIpCit7CisgICB0U2lyTXNnUSBtc2c7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gKHRwQW5pU2lyR2xvYmFsKXBTaXJHbG9iYWw7CisKKyNpZmRlZiBBTklfT1NfVFlQRV9SVEFJX0xJTlVYCisKKyAgIG1zZy50eXBlID0gcE1iLT50eXBlOworICAgbXNnLmJvZHlwdHIgPSBwTWI7CisgICBtc2cuYm9keXZhbCA9IDA7CisgICBXREFMT0czKCB3ZGFMb2cocE1hYywgTE9HMywgRkwoIm1zZ1R5cGUgJWQsIG1zZ0xlbiAlZFxuIiApLAorICAgICAgICBwTWItPnR5cGUsIHBNYi0+bXNnTGVuKSk7CisjZWxzZQorCisgICB0U2lyTWJNc2cqIHBNYkxvY2FsOworICAgbXNnLnR5cGUgPSBwTWItPnR5cGU7CisgICBtc2cuYm9keXZhbCA9IDA7CisKKyAgIFdEQUxPRzMod2RhTG9nKHBNYWMsIExPRzMsIEZMKCJtc2dUeXBlICVkLCBtc2dMZW4gJWRcbiIgKSwKKyAgICAgICAgcE1iLT50eXBlLCBwTWItPm1zZ0xlbikpOworCisgICAvLyBjb3B5IHRoZSBtZXNzYWdlIGZyb20gaG9zdCBidWZmZXIgdG8gZmlybXdhcmUgYnVmZmVyCisgICAvLyB0aGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgZmlybXdhcmUgYWxsb2NhdGVzLCB1c2VzIGFuZCBmcmVlcworICAgLy8gaXQncyBvd24gYnVmZmVycyBmb3IgbWFpbGJveCBtZXNzYWdlIGluc3RlYWQgb2Ygd29ya2luZyBvbgorICAgLy8gaG9zdCBidWZmZXIKKworICAgLy8gc2Vjb25kIHBhcmFtZXRlciwgJ3dhaXQgb3B0aW9uJywgdG8gcGFsQWxsb2NhdGVNZW1vcnkgaXMgaWdub3JlZCBvbiBXaW5kb3dzCisgICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBwYWxBbGxvY2F0ZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQgKiopJnBNYkxvY2FsLCBwTWItPm1zZ0xlbikpCisgICB7CisgICAgICBXREFMT0dFKCB3ZGFMb2cocE1hYywgTE9HRSwgRkwoIkJ1ZmZlciBBbGxvY2F0aW9uIGZhaWxlZCFcbiIpKSk7CisgICAgICByZXR1cm4gZVNJUl9GQUlMVVJFOworICAgfQorCisgICBwYWxDb3B5TWVtb3J5KHBNYWMsICh2b2lkICopcE1iTG9jYWwsICh2b2lkICopcE1iLCBwTWItPm1zZ0xlbik7CisgICBtc2cuYm9keXB0ciA9IHBNYkxvY2FsOworI2VuZGlmCisKKyAgIHN3aXRjaCAobXNnLnR5cGUgJiBIQUxfTU1IX01CX01TR19UWVBFX01BU0spCisgICB7CisgICBjYXNlIFdEQV9NU0dfVFlQRVNfQkVHSU46ICAgIC8vIFBvc3RzIGEgbWVzc2FnZSB0byB0aGUgSEFMIE1zZ1EKKyAgICAgIHdkYVBvc3RDdHJsTXNnKHBNYWMsICZtc2cpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgU0lSX0xJTV9NU0dfVFlQRVNfQkVHSU46ICAgIC8vIFBvc3RzIGEgbWVzc2FnZSB0byB0aGUgTElNIE1zZ1EKKyAgICAgIGxpbVBvc3RNc2dBcGkocE1hYywgJm1zZyk7CisgICAgICBicmVhazsKKworICAgY2FzZSBTSVJfQ0ZHX01TR19UWVBFU19CRUdJTjogICAgLy8gUG9zdHMgYSBtZXNzYWdlIHRvIHRoZSBDRkcgTXNnUQorICAgICAgd2RhUG9zdENmZ01zZyhwTWFjLCAmbXNnKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNJUl9QTU1fTVNHX1RZUEVTX0JFR0lOOiAgICAvLyBQb3N0cyBhIG1lc3NhZ2UgdG8gdGhlIFBNTSBNc2dRCisgICAgICBwbW1Qb3N0TWVzc2FnZShwTWFjLCAmbXNnKTsKKyAgICAgIGJyZWFrOworCisjaWYgZGVmaW5lZChBTklfTUFORl9ESUFHKSB8fCBkZWZpbmVkKEFOSV9QSFlfREVCVUcpCisgICBjYXNlIFNJUl9QVFRfTVNHX1RZUEVTX0JFR0lOOgorI2lmbmRlZiBGRUFUVVJFX1dMQU5fSU5URUdSQVRFRF9TT0MKKyAgICAgIGhhbE5pbVBUVFBvc3RNc2dBcGkocE1hYywgJm1zZyk7IC8vIFBvc3RzIGEgbWVzc2FnZSB0byB0aGUgTklNIFBUVCBNc2dRCisjZW5kaWYgLyogRkVBVFVSRV9XTEFOX0lOVEVHUkFURURfU09DICovCisgICAgICBicmVhazsKKworI2VuZGlmCisKKyAgIGRlZmF1bHQ6CisgICAgICBXREFMT0dXKCB3ZGFMb2cocE1hYywgTE9HVywgRkwoIlVua25vd24gbWVzc2FnZSB0eXBlID0gIgorICAgICAgICAgICAgICIweCVYXG4iKSwKKyAgICAgICAgICAgICBtc2cudHlwZSkpOworCisgICAgICAvLyBSZWxlYXNlIHRoZSBtZW1vcnkuCisgICAgICBpZiAocGFsRnJlZU1lbW9yeSggcE1hYy0+aEhkZCwgKHZvaWQqKShtc2cuYm9keXB0cikpICE9IGVTSVJfU1VDQ0VTUykKKyAgICAgIHsKKyAgICAgICAgIFdEQUxPR0UoIHdkYUxvZyhwTWFjLCBMT0dFLCBGTCgiQnVmZmVyIEFsbG9jYXRpb24gZmFpbGVkIVxuIikpKTsKKyAgICAgICAgIHJldHVybiBlU0lSX0ZBSUxVUkU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIH0KKworICAgcmV0dXJuIGVTSVJfU1VDQ0VTUzsKKworfSAvLyB1TWFjUG9zdEN0cmxNc2coKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRlVOQ1RJT046ICB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKCkKKyAqCisgKiBHZXQgdGhlIGdsb2JhbCBIQUwgc3lzdGVtIHJvbGUuIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3RCc3NTeXN0ZW1Sb2xlIHdkYUdldEdsb2JhbFN5c3RlbVJvbGUodHBBbmlTaXJHbG9iYWwgcE1hYykKK3sKKyAgIHZfVk9JRF90ICogcFZvc0NvbnRleHQgPSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfV0RBLCBOVUxMKTsKKyAgIHRXREFfQ2JDb250ZXh0ICp3ZGFDb250ZXh0ID0gCisgICAgICAgICAgICAgICAgICAgICAgIHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1dEQSwgcFZvc0NvbnRleHQpOworICAgaWYoTlVMTCA9PSB3ZGFDb250ZXh0KQorICAgeworICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1dEQSwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOldEQSBjb250ZXh0IGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOyAKKyAgICAgIFZPU19BU1NFUlQoMCk7CisgICAgICByZXR1cm4gZVNZU1RFTV9VTktOT1dOX1JPTEU7CisgICB9CisgICBXREFMT0cxKCB3ZGFMb2cocE1hYywgTE9HMSwgRkwoIiByZXR1cm5pbmcgICVkIHJvbGVcbiIpLAorICAgICAgICAgICAgIHdkYUNvbnRleHQtPndkYUdsb2JhbFN5c3RlbVJvbGUpKTsKKyAgIHJldHVybiAgd2RhQ29udGV4dC0+d2RhR2xvYmFsU3lzdGVtUm9sZTsKK30KKwpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvQ1AvaW5jL3dsYW5fZGVmcy5oIGIvQ09SRS9XREkvQ1AvaW5jL3dsYW5fZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Y2RiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9DUC9pbmMvd2xhbl9kZWZzLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogIEBmaWxlOiAgICAgd2xhbl9kZWZzLmgKKyAqCisgKiAgQGJyaWVmOiAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgY29tbW9uIHR5cGVkZWZzCisgKgorICogIEBhdXRob3I6ICAgR2FnYW4gSmFpbgorICoKKyAqICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAxMCwgUXVhbGNvbW0sIEluYy4gCisgKiAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZm5kZWYgX19XTEFOX0RFRlNfSF9fCisjZGVmaW5lIF9fV0xBTl9ERUZTX0hfXworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5jbHVkZSBGaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3R5cGUuaCIgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB3cHRfdWludDMyICAgdWludDMyOyAgICAgIC8qIFVuc2lnbmVkIDMyIGJpdCB2YWx1ZSAqLworCit0eXBlZGVmIHdwdF91aW50MTYgICB1aW50MTY7ICAgICAgLyogVW5zaWduZWQgMTYgYml0IHZhbHVlICovCisKK3R5cGVkZWYgd3B0X3VpbnQ4ICAgIHVpbnQ4OyAgICAgICAvKiBVbnNpZ25lZCA4ICBiaXQgdmFsdWUgKi8KKwordHlwZWRlZiB3cHRfaW50MzIgICAgaW50MzI7ICAgICAgIC8qIFNpZ25lZCAzMiBiaXQgdmFsdWUgKi8KKwordHlwZWRlZiB3cHRfaW50MTYgICAgaW50MTY7ICAgICAgIC8qIFNpZ25lZCAxNiBiaXQgdmFsdWUgKi8KKwordHlwZWRlZiB3cHRfaW50OCAgICAgaW50ODsgICAgICAgIC8qIFNpZ25lZCA4ICBiaXQgdmFsdWUgKi8KKwordHlwZWRlZiB3cHRfaW50NjQgICAgaW50NjQ7ICAgICAgIC8qIFNpZ25lZCA2NCBiaXQgdmFsdWUgKi8KKwordHlwZWRlZiB3cHRfdWludDY0ICAgdWludDY0OyAgICAgIC8qIFVuc2lnbmVkIDY0IGJpdCB2YWx1ZSAqLworCit0eXBlZGVmIHdwdF9ieXRlICAgICBieXRlOyAgICAgICAgLyogYnl0ZSB0eXBlICovCisKK3R5cGVkZWYgd3B0X2Jvb2xlYW4gIGJvb2xlYW47ICAgICAvKiBCb29sZWFuIFR5cGUgKi8KKworI2VuZGlmIC8vX19XTEFOX0RFRlNfSF9fCmRpZmYgLS1naXQgYS9DT1JFL1dESS9DUC9pbmMvd2xhbl9xY3Rfd2RpLmggYi9DT1JFL1dESS9DUC9pbmMvd2xhbl9xY3Rfd2RpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhOWQ4OAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL0NQL2luYy93bGFuX3FjdF93ZGkuaApAQCAtMCwwICsxLDg2NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFdMQU5fUUNUX1dESV9ICisjZGVmaW5lIFdMQU5fUUNUX1dESV9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgIFcgTCBBIE4gICBEIEUgViBJIEMgRSAgIEEgQiBTIFQgUiBBIEMgVCBJIE8gTiAgIEwgQSBZIEUgUiAKKyAgICAgICAgICAgICAgICAgICAgICAgRSBYIFQgRSBSIE4gQSBMICBBIFAgSQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIAorREVTQ1JJUFRJT04KKyAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBleHRlcm5hbCBBUEkgZXhwb3NlZCBieSB0aGUgd2xhbiB0cmFuc3BvcnQgbGF5ZXIgCisgIG1vZHVsZS4KKyAgCisgICAgICAKKyAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjokICREYXRlVGltZTogJCAkQXV0aG9yOiAkCisKKword2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxMC8wNS8xMSAgICBoYXAgICAgIEFkZGluZyBzdXBwb3J0IGZvciBLZWVwIEFsaXZlCiswOC8wNC8xMCAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTIEZPUiBNT0RVTEUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfYXBpLmgiIAorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90eXBlLmgiIAorI2luY2x1ZGUgIndsYW5fcWN0X3BhY2tfYWxpZ24uaCIgCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2NmZy5oIiAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZiAKKyAKKy8qIE1BQyBBRERSRVNTIExFTkdUSCAtIHBlciBzcGVjKi8KKyNkZWZpbmUgV0RJX01BQ19BRERSX0xFTiA2CisKKy8qIE1heCBudW1iZXIgb2YgMTFiIHJhdGVzIC0+IDEsMiw1LjUsMTEgKi8KKyNkZWZpbmUgV0RJX05VTV8xMUJfUkFURVMgICAgICAgICAgICAgICAgIDQgIAorCisvKiBNYXggbnVtYmVyIG9mIDExZyByYXRlcyAtPiA2LDksMTIsMTgsMjQsMzYsNDgsNTQqLworI2RlZmluZSBXRElfTlVNXzExQV9SQVRFUyAgICAgICAgICAgICAgICAgOCAgCisKKy8qIE1heCBudW1iZXIgb2YgbGVnYWN5IHJhdGVzIC0+IDcyLCA5NiwgMTA4Ki8KKyNkZWZpbmUgV0RJX05VTV9QT0xBUklTX1JBVEVTICAgICAgICAgICAgIDMgIAorCisvKiBNYXggc3VwcG9ydGVkIE1DUyBzZXQqLworI2RlZmluZSBXRElfTUFDX01BWF9TVVBQT1JURURfTUNTX1NFVCAgICAxNgorCisvKk1heCBudW1iZXIgb2YgQWNjZXNzIENhdGVnb3JpZXMgZm9yIFFvUyAtIHBlciBzcGVjICovCisjZGVmaW5lIFdESV9NQVhfTk9fQUMgICAgICAgICAgICAgICAgICAgICA0CisKKy8qTWF4LiBzaXplIGZvciByZXNlcnZpbmcgdGhlIEJlYWNvbiBUZW1wbGF0ZSAqLworI2RlZmluZSBXRElfQkVBQ09OX1RFTVBMQVRFX1NJWkUgIDB4MTgwCisKKyNkZWZpbmUgV0RJX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRSAxMjgKKworI2RlZmluZSBXRElfV09XTF9CQ0FTVF9NQVhfTlVNX1BBVFRFUk5TIDE2CisKKyNkZWZpbmUgV0RJX01BWF9TU0lEX1NJWkUgIDMyCisKKy8qIFRoZSBzaGFyZWQgbWVtb3J5IGJldHdlZW4gV0RJIGFuZCBIQUwgaXMgNEsgc28gbWF4aW11bSBkYXRhIGNhbiBiZSB0cmFuc2ZlcnJlZAorZnJvbSBXREkgdG8gSEFMIGlzIDRLLlRoaXMgNEsgc2hvdWxkIGFsc28gaW5jbHVkZSB0aGUgTWVzc2FnZSBoZWFkZXIgc28gc2VuZGluZyA0Sworb2YgTlYgZnJhZ21lbnQgaXMgbnQgcG9zc2JpbGUuVGhlIG5leHQgbXVsdGlwbGUgb2YgMUtiIGlzIDNLICovCisKKyNkZWZpbmUgRlJBR01FTlRfU0laRSAzMDcyCisKKy8qIE1hY3JvIHRvIGZpbmQgdGhlIHRvdGFsIG51bWJlciBmcmFnbWVudHMgb2YgdGhlIE5WIEltYWdlKi8KKyNkZWZpbmUgVE9UQUxGUkFHTUVOVFMoeCkgKCh4JUZSQUdNRU5UX1NJWkUpPT0gMCkgPyAoeC9GUkFHTUVOVF9TSVpFKTooKHgvRlJBR01FTlRfU0laRSkrMSkKKworLyogQmVhY29uIEZpbHRlciBMZW5ndGgqLworI2RlZmluZSBXRElfQkVBQ09OX0ZJTFRFUl9MRU4gNzAKKworLyogQ29leCBJbmRpY2F0aW9uIGRhdGEgc2l6ZSAtIHNob3VsZCBtYXRjaCBXTEFOX0NPRVhfSU5EX0RBVEFfU0laRSAqLworI2RlZmluZSBXRElfQ09FWF9JTkRfREFUQV9TSVpFICg0KQorCisjZGVmaW5lIFdESV9DSVBIRVJfU0VRX0NUUl9TSVpFIDYKKworI2RlZmluZSBXRElfTlVNX0JTU0lEICAgMgorCisvKlZlcnNpb24gc3RyaW5nIG1heCBsZW5ndGggKGluY2x1ZGluZyBOVUwpICovCisjZGVmaW5lIFdESV9WRVJTSU9OX0xFTkdUSCAgNjQKKworCisvKldESSBSZXNwb25zZSB0aW1lb3V0IC0gaG93IGxvbmcgd2lsbCBXREkgd2FpdCBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBkZXZpY2UKKyAgICAtIGl0IHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdG8gYWxsb3cgYW55IG90aGVyIGZhaWx1cmUgbWVjaGFuaXNtIHRvIGtpY2sKKyAgICAgIGluIGJlZm9yZSB3ZSBnZXQgdG8gYSB0aW1lb3V0IChtcyB1bml0cykqLworI2RlZmluZSBXRElfUkVTUE9OU0VfVElNRU9VVCAgIDEwMDAwCisKKyNkZWZpbmUgV0RJX1NFVF9QT1dFUl9TVEFURV9USU1FT1VUICAxMDAwMCAvKiBpbiBtc2VjIGEgdmVyeSBoaWdoIHVwcGVyIGxpbWl0ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgIEdFTkVSSUMgU1RSVUNUVVJFUyAKKyAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBXREkgVmVyc2lvbiBJbmZvcm1hdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgcmV2aXNpb247CisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgdmVyc2lvbjsKKyAgICB3cHRfdWludDggICAgICAgICAgICAgICAgICBtaW5vcjsKKyAgICB3cHRfdWludDggICAgICAgICAgICAgICAgICBtYWpvcjsKK30gV0RJX1dsYW5WZXJzaW9uVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBXREkgRGV2aWNlIENhcGFiaWxpdHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgLypJZiB0aGlzIGZsYWcgaXMgdHJ1ZSBpdCBtZWFucyB0aGF0IHRoZSBkZXZpY2UgY2FuIHN1cHBvcnQgODAyLjMvRVRIMiB0bworICAgIDgwMi4xMSB0cmFuc2xhdGlvbiovCisgIHdwdF9ib29sZWFuICAgYkZyYW1lWHRsU3VwcG9ydGVkOyAKKworICAvKk1heGltdW0gbnVtYmVyIG9mIEJTU2VzIHN1cHBvcnRlZCBieSB0aGUgRGV2aWNlICovCisgIHdwdF91aW50OCAgICAgdWNNYXhCU1NTdXBwb3J0ZWQ7CisKKyAgLypNYXhpbXVtIG51bWJlciBvZiBzdGF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIERldmljZSAqLworICB3cHRfdWludDggICAgIHVjTWF4U1RBU3VwcG9ydGVkOworfVdESV9EZXZpY2VDYXBhYmlsaXR5VHlwZTsgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgV0RJIENoYW5uZWwgT2Zmc2V0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgIFdESV9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfTk9ORSAgID0gMCwKKyAgV0RJX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVF9VUCAgICAgPSAxLAorICBXRElfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX0RPV04gICA9IDMKK31XRElfSFRTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfTWFjRnJhbWVDdGwKKyAgIEZyYW1lIGNvbnRyb2wgZmllbGQgZm9ybWF0ICgyIGJ5dGVzKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgIHN0cnVjdCAKK3sKKyAgICB3cHRfdWludDggcHJvdFZlciA6MjsKKyAgICB3cHRfdWludDggdHlwZSA6MjsKKyAgICB3cHRfdWludDggc3ViVHlwZSA6NDsKKworICAgIHdwdF91aW50OCB0b0RTIDoxOworICAgIHdwdF91aW50OCBmcm9tRFMgOjE7CisgICAgd3B0X3VpbnQ4IG1vcmVGcmFnIDoxOworICAgIHdwdF91aW50OCByZXRyeSA6MTsKKyAgICB3cHRfdWludDggcG93ZXJNZ210IDoxOworICAgIHdwdF91aW50OCBtb3JlRGF0YSA6MTsKKyAgICB3cHRfdWludDggd2VwIDoxOworICAgIHdwdF91aW50OCBvcmRlciA6MTsKKworfSBXRElfTWFjRnJhbWVDdGw7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESSBTZXF1ZW5jZSBjb250cm9sIGZpZWxkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIHdwdF91aW50OCBmcmFnTnVtICA6IDQ7CisgIHdwdF91aW50OCBzZXFOdW1MbyA6IDQ7CisgIHdwdF91aW50OCBzZXFOdW1IaSA6IDg7Cit9IFdESV9NYWNTZXFDdGw7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE1hbmFnZW1lbnQgaGVhZGVyIGZvcm1hdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreworICAgIFdESV9NYWNGcmFtZUN0bCAgICAgZmM7CisgICAgd3B0X3VpbnQ4ICAgICAgICAgICBkdXJhdGlvbkxvOworICAgIHdwdF91aW50OCAgICAgICAgICAgZHVyYXRpb25IaTsKKyAgICB3cHRfdWludDggICAgICAgICAgIGRhW1dESV9NQUNfQUREUl9MRU5dOworICAgIHdwdF91aW50OCAgICAgICAgICAgc2FbV0RJX01BQ19BRERSX0xFTl07CisgICAgd3B0X21hY0FkZHIgICAgICAgICBic3NJZDsKKyAgICBXRElfTWFjU2VxQ3RsICAgICAgIHNlcUNvbnRyb2w7Cit9IFdESV9NYWNNZ210SGRyOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBOViBCbG9iIG1hbmFnZW1lbnQgc3R1cmN0dXJlCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIE5WIGltYWdlICBmcmFnbWVudHMgY291bnQgKi8KKyAgd3B0X3VpbnQxNiB1c1RvdGFsRnJhZ21lbnQ7CisKKyAgLyogTlYgZnJhZ21lbnQgc2l6ZSAqLworICB3cHRfdWludDE2IHVzRnJhZ21lbnRTaXplOworCisgIC8qIGN1cnJlbnQgZnJhZ21lbnQgdG8gYmUgc2VudCAqLworICB3cHRfdWludDE2IHVzQ3VycmVudEZyYWdtZW50OworCit9IFdESV9OdkJsb2JJbmZvUGFyYW1zOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGEgcGF0aCBlbnVtcyBtZW1vcnkgcG9vbCByZXNvdXJjZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0KK3sKKyAgLyogbWFuYWdtZW50IHJlc291cmNlIHBvb2wgSUQgKi8KKyAgV0RJX01HTVRfUE9PTF9JRCA9IDAsCisgIC8qIERhdGEgcmVzb3VyY2UgcG9vbCBJRCAqLworICBXRElfREFUQV9QT09MX0lEID0gMQorfVdESV9SZXNQb29sVHlwZTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgR0VORVJJQyBTVFJVQ1RVUkVTIC0gRU5ECisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESSBTdGF0dXMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICBXRElfU1RBVFVTX1NVQ0NFU1MsICAgICAgIC8qIE9wZXJhdGlvbiBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSovCisgICBXRElfU1RBVFVTX1NVQ0NFU1NfU1lOQywgIC8qIE9wZXJhdGlvbiBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9ub3VzIHdheSAtIG5vIHJzcCB3aWxsIGJlIGdlbmVyYXRlZCovCisgICBXRElfU1RBVFVTX1BFTkRJTkcsICAgICAgIC8qIE9wZXJhdGlvbiByZXN1bHQgaXMgcGVuZGluZyBhbmQgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCBhc3luY2hyb25vdXNseSB0aHJvdWdoIHRoZSBSZXEgU3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrICovCisgICBXRElfU1RBVFVTX0VfRkFJTFVSRSwgICAgIC8qIE9wZXJhdGlvbiBoYXMgZW5kZWQgaW4gYSBnZW5lcmljIGZhaWx1cmUqLworICAgV0RJX1NUQVRVU19SRVNfRkFJTFVSRSwgICAvKiBPcGVyYXRpb24gaGFzIGVuZGVkIGluIGEgcmVzb3VyY2UgZmFpbHVyZSovCisgICBXRElfU1RBVFVTX01FTV9GQUlMVVJFLCAgIC8qIE9wZXJhdGlvbiBoYXMgZW5kZWQgaW4gYSBtZW1vcnkgYWxsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUqLworICAgV0RJX1NUQVRVU19FX05PVF9BTExPV0VELCAvKiBPcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZHJpdmVyKi8KKyAgIFdESV9TVEFUVVNfRV9OT1RfSU1QTEVNRU5ULCAvKiBPcGVyYXRpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZCovCisKKyAgIFdESV9TVEFUVVNfREVWX0lOVEVSTkFMX0ZBSUxVUkUsIC8qQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkIGluIHRoZSBkZXZpY2UqLworICAgV0RJX1NUQVRVU19NQVgKKworfVdESV9TdGF0dXM7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9SZXFTdGF0dXNDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgdG8gZGVsaXZlciB0byBVTUFDIHRoZSByZXN1bHQgb2YgcG9zdGluZworICAgYSBwcmV2aW91cyByZXF1ZXN0IGZvciB3aGljaCB0aGUgcmV0dXJuIHN0YXR1cyB3YXMgUEVORElORy4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIHRoZSBDb250cm9sIFRyYW5zcG9ydAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisgCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgKCpXRElfUmVxU3RhdHVzQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfTG93TGV2ZWxJbmRFbnVtVHlwZQorICAgIFR5cGVzIG9mIGluZGljYXRpb24gdGhhdCBjYW4gYmUgcG9zdGVkIHRvIFVNQUMgYnkgREFMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgIC8qV2hlbiBSU1NJIG1vbml0b3JpbmcgaXMgZW5hYmxlZCBvZiB0aGUgTG93ZXIgTUFDIGFuZCBhIHRocmVzaG9sZCBoYXMgYmVlbgorICAgIHBhc3NlZC4gKi8KKyAgV0RJX1JTU0lfTk9USUZJQ0FUSU9OX0lORCwKKworICAvKkxpbmsgbG9zcyBpbiB0aGUgbG93IE1BQyAqLworICBXRElfTUlTU0VEX0JFQUNPTl9JTkQsCisKKyAgLyp3aGVuIGhhcmR3YXJlIGhhcyBzaWduYWxlZCBhbiB1bmtub3duIGFkZHIyIGZyYW1lcy4gVGhlIGluZGljYXRpb24gd2lsbAorICBjb250YWluIGluZm8gZnJvbSBmcmFtZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBVTUFDLCB0aGlzIG1heSB1c2UgdGhpcyBpbmZvIHRvCisgIGRlYXV0aCB0aGUgU1RBKi8KKyAgV0RJX1VOS05PV05fQUREUjJfRlJBTUVfUlhfSU5ELAorCisgIC8qTUlDIEZhaWx1cmUgZGV0ZWN0ZWQgYnkgSFcqLworICBXRElfTUlDX0ZBSUxVUkVfSU5ELAorCisgIC8qRmF0YWwgRXJyb3IgSW5kKi8KKyAgV0RJX0ZBVEFMX0VSUk9SX0lORCwgCisKKyAgLypEZWxldGUgU3RhdGlvbiBJbmQqLworICBXRElfREVMX1NUQV9JTkQsIAorCisgIC8qSW5kaWNhdGlvbiBmcm9tIENvZXgqLworICBXRElfQ09FWF9JTkQsCisKKyAgLyogSW5kaWNhdGlvbiBmb3IgVHggQ29tcGxldGUgKi8KKyAgV0RJX1RYX0NPTVBMRVRFX0lORCwKKworICAvKi5QMlBfTk9BX0F0dHJfSW5kaWNhdGlvbiAqLworICBXRElfUDJQX05PQV9BVFRSX0lORCwKKworICAvKiBQcmVmZXJyZWQgTmV0d29yayBGb3VuZCBJbmRpY2F0aW9uICovCisgIFdESV9QUkVGX05FVFdPUktfRk9VTkRfSU5ELAorCisgIFdESV9XQUtFX1JFQVNPTl9JTkQsCisKKyAgLyogVHggUEVSIFRyYWNraW5nIEluZGljYXRpb24gKi8KKyAgV0RJX1RYX1BFUl9ISVRfSU5ELAorICAKKyAgV0RJX01BWF9JTkQKK31XRElfTG93TGV2ZWxJbmRFbnVtVHlwZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfTG93UlNTSVRoSW5kVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qUG9zaXRpdmUgY3Jvc3Npbmcgb2YgUnNzaSBUaHJlc2gxKi8KKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgYlJzc2lUaHJlczFQb3NDcm9zcyA6IDE7CisgIC8qTmVnYXRpdmUgY3Jvc3Npbmcgb2YgUnNzaSBUaHJlc2gxKi8KKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgYlJzc2lUaHJlczFOZWdDcm9zcyA6IDE7CisgIC8qUG9zaXRpdmUgY3Jvc3Npbmcgb2YgUnNzaSBUaHJlc2gyKi8KKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgYlJzc2lUaHJlczJQb3NDcm9zcyA6IDE7CisgIC8qTmVnYXRpdmUgY3Jvc3Npbmcgb2YgUnNzaSBUaHJlc2gyKi8KKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgYlJzc2lUaHJlczJOZWdDcm9zcyA6IDE7CisgIC8qUG9zaXRpdmUgY3Jvc3Npbmcgb2YgUnNzaSBUaHJlc2gzKi8KKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgYlJzc2lUaHJlczNQb3NDcm9zcyA6IDE7CisgIC8qTmVnYXRpdmUgY3Jvc3Npbmcgb2YgUnNzaSBUaHJlc2gzKi8KKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgYlJzc2lUaHJlczNOZWdDcm9zcyA6IDE7CisKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgYlJlc2VydmVkICAgICAgICAgICA6IDI2OworCit9V0RJX0xvd1JTU0lUaEluZFR5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1Vua0FkZHIyRnJtUnhJbmRUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypSeCBCZCBkYXRhIG9mIHRoZSB1bmtub3duIHJlY2VpdmVkIGFkZHIyIGZyYW1lLiovCisgIHZvaWQqICBidWZSeEJkOworCisgIC8qQnVmZmVyIExlbmd0aCovCisgIHdwdF91aW50MTYgIHVzQnVmTGVuOyAKK31XRElfVW5rQWRkcjJGcm1SeEluZFR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9EZWxldGVTVEFJbmRUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qQVNTT0MgSUQsIGFzIGFzc2lnbmVkIGJ5IFVNQUMqLworICAgd3B0X3VpbnQxNiAgICB1c0Fzc29jSWQ7CisKKyAgIC8qU1RBIEluZGV4IHJldHVybmVkIGR1cmluZyBEQUxfUG9zdEFzc29jUmVxIG9yIERBTF9Db25maWdTdGFSZXEqLworICAgd3B0X3VpbnQ4ICAgICB1Y1NUQUlkeDsKKworICAgLypCU1NJRCBvZiBTVEEqLworICAgd3B0X21hY0FkZHIgICBtYWNCU1NJRDsgCisKKyAgICAvKk1BQyBBRERSIG9mIFNUQSovCisgICAgd3B0X21hY0FkZHIgIG1hY0FERFIyOyAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgLyogVG8gdW5pZnkgdGhlIGtlZXBhbGl2ZSAvIHVua25vd24gQTIgLyB0aW0tYmFzZWQgZGlzYSovCisgICAgd3B0X3VpbnQxNiAgIHdwdFJlYXNvbkNvZGU7ICAgCisKK31XRElfRGVsZXRlU1RBSW5kVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX01pY0ZhaWx1cmVJbmRUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAvKmN1cnJlbnQgQlNTSUQqLworIHdwdF9tYWNBZGRyIGJzc0lkOworICAKKyAgLypTb3VyY2UgbWFjIGFkZHJlc3MqLworIHdwdF9tYWNBZGRyIG1hY1NyY0FkZHI7CisKKyAvKlRyYW5zbWl0dGVyIG1hYyBhZGRyZXNzKi8KKyB3cHRfbWFjQWRkciBtYWNUYUFkZHI7CisKKyAvKkRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzKi8KKyB3cHRfbWFjQWRkciBtYWNEc3RBZGRyOworCisgLypNdWx0aWNhc3QgZmxhZyovCisgd3B0X3VpbnQ4ICAgdWNNdWx0aWNhc3Q7CisKKyAvKkZpcnN0IGJ5dGUgb2YgSVYqLworIHdwdF91aW50OCAgIHVjSVYxOworCisgLypLZXkgSWQqLworIHdwdF91aW50OCAgIGtleUlkOworCisgLypTZXF1ZW5jZSBOdW1iZXIqLworIHdwdF91aW50OCAgIFRTQ1tXRElfQ0lQSEVSX1NFUV9DVFJfU0laRV07CisKKyAvKnJlY2VpdmUgYWRkcmVzcyAqLworIHdwdF9tYWNBZGRyICAgbWFjUnhBZGRyOworfVdESV9NaWNGYWlsdXJlSW5kVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0NvZXhJbmRUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgd3B0X3VpbnQzMiAgY29leEluZFR5cGU7CisgIHdwdF91aW50MzIgIGNvZXhJbmREYXRhW1dESV9DT0VYX0lORF9EQVRBX1NJWkVdOworfSBXRElfQ29leEluZFR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9NYWNTU2lkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgICAgd3B0X3VpbnQ4ICAgICAgICB1Y0xlbmd0aDsKKyAgICB3cHRfdWludDggICAgICAgIHNTU0lEW1dESV9NQVhfU1NJRF9TSVpFXTsKK30gV0RJX01hY1NTaWQ7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9QcmVmTmV0d29ya0ZvdW5kSW5kICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7ICAKKyAgLyogTmV0d29yayB0aGF0IHdhcyBmb3VuZCB3aXRoIHRoZSBoaWdoZXN0IFJTU0kqLworICBXRElfTWFjU1NpZCBzc0lkOworICAvKiBJbmRpY2F0ZXMgdGhlIFJTU0kgKi8KKyAgd3B0X3VpbnQ4ICByc3NpOworfSBXRElfUHJlZk5ldHdvcmtGb3VuZEluZDsKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKldESV9QMnBOb2FBdHRySW5kVHlwZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgd3B0X3VpbnQ4ICAgICAgIHVjSW5kZXggOworICB3cHRfdWludDggICAgICAgdWNPcHBQc0ZsYWcgOworICB3cHRfdWludDE2ICAgICAgdXNDdFdpbiAgOworCisgIHdwdF91aW50MTYgICAgICB1c05vYTFJbnRlcnZhbENudDsKKyAgd3B0X3VpbnQxNiAgICAgIHVzUnN2ZDEgOworICB3cHRfdWludDMyICAgICAgdXNsTm9hMUR1cmF0aW9uOworICB3cHRfdWludDMyICAgICAgdXNsTm9hMUludGVydmFsOworICB3cHRfdWludDMyICAgICAgdXNsTm9hMVN0YXJ0VGltZTsKKworICB3cHRfdWludDE2ICAgICAgdXNOb2EySW50ZXJ2YWxDbnQ7CisgIHdwdF91aW50MTYgICAgICB1c1JzdmQyOworICB3cHRfdWludDMyICAgICAgdXNsTm9hMkR1cmF0aW9uOworICB3cHRfdWludDMyICAgICAgdXNsTm9hMkludGVydmFsOworICB3cHRfdWludDMyICAgICAgdXNsTm9hMlN0YXJ0VGltZTsKKworICB3cHRfdWludDMyICAgICAgc3RhdHVzOworfVdESV9QMnBOb2FBdHRySW5kVHlwZTsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfV2FrZVJlYXNvbkluZFR5cGUgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sgIAorICAgIHdwdF91aW50MzIgICAgICB1bFJlYXNvbjsgICAgICAgIC8qIHNlZSB0V2FrZVJlYXNvblR5cGUgKi8KKyAgICB3cHRfdWludDMyICAgICAgdWxSZWFzb25Bcmc7ICAgICAvKiBhcmd1bWVudCBzcGVjaWZpYyB0byB0aGUgcmVhc29uIHR5cGUgKi8KKyAgICB3cHRfdWludDMyICAgICAgdWxTdG9yZWREYXRhTGVuOyAvKiBsZW5ndGggb2Ygb3B0aW9uYWwgZGF0YSBzdG9yZWQgaW4gdGhpcyBtZXNzYWdlLCBpbiBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUwgdHJ1bmNhdGVzIHRoZSBkYXRhIChpLmUuIGRhdGEgcGFja2V0cykgdGhpcyBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSBhY3R1YWwgbGVuZ3RoICovCisgICAgd3B0X3VpbnQzMiAgICAgIHVsQWN0dWFsRGF0YUxlbjsgLyogYWN0dWFsIGxlbmd0aCBvZiBkYXRhICovCisgICAgd3B0X3VpbnQ4ICAgICAgIGFEYXRhU3RhcnRbMV07ICAvKiB2YXJpYWJsZSBsZW5ndGggc3RhcnQgb2YgZGF0YSAobGVuZ3RoID09IHN0b3JlZERhdGFMZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBzcGVjaWZpYyB3YWtlIHR5cGUgKi8gCit9IFdESV9XYWtlUmVhc29uSW5kVHlwZTsKKyNlbmRpZiAvLyBXTEFOX1dBS0VVUF9FVkVOVFMKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0xvd0xldmVsSW5kVHlwZQorICAgIEluaWRjYXRpb24gdHlwZSBhbmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluZGljYXRpb24gYmVpbmcgY2FycmllZAorICAgIG92ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkluaWRjYXRpb24gdHlwZSovCisgIFdESV9Mb3dMZXZlbEluZEVudW1UeXBlICB3ZGlJbmRpY2F0aW9uVHlwZTsgCisKKyAgLypJbmRpY2F0aW9uIGRhdGEqLworICB1bmlvbgorICB7CisgICAgLypSU1NJIFRocmVzaG9sZCBJbmZvIGZvciBXRElfTE9XX1JTU0lfSU5EKi8KKyAgICBXRElfTG93UlNTSVRoSW5kVHlwZSAgICAgICAgd2RpTG93UlNTSUluZm87IAorCisgICAgLypBZGRyMiBGcmFtZSBJbmZvIGZvciBXRElfVU5LTk9XTl9BRERSMl9GUkFNRV9SWF9JTkQqLworICAgIFdESV9VbmtBZGRyMkZybVJ4SW5kVHlwZSAgICB3ZGlVbmtBZGRyMkZybUluZm87CisKKyAgICAvKk1JQyBGYWlsdXJlIGluZm8gZm9yIFdESV9NSUNfRkFJTFVSRV9JTkQqLworICAgIFdESV9NaWNGYWlsdXJlSW5kVHlwZSAgICAgICB3ZGlNSUNGYWlsdXJlSW5mbzsgCisKKyAgICAvKkVycm9yIGNvZGUgZm9yIFdESV9GQVRBTF9FUlJPUl9JTkQqLworICAgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICB1c0Vycm9yQ29kZTsKKworICAgIC8qRGVsZXRlIFNUQSBJbmRpY2F0aW9uKi8KKyAgICBXRElfRGVsZXRlU1RBSW5kVHlwZSAgICAgICAgd2RpRGVsZXRlU1RBSW5kVHlwZTsgCisgICAgCisgICAgLypDb2V4IEluZGljYXRpb24qLworICAgIFdESV9Db2V4SW5kVHlwZSAgICAgICAgICAgICB3ZGlDb2V4SW5mbzsKKworICAgIC8qIFR4IENvbXBsZXRlIEluZGljYXRpb24gKi8KKyAgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgdHhfY29tcGxldGVfc3RhdHVzOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICAgIC8qIFAyUCBOT0EgQVRUUiBJbmRpY2F0aW9uICovCisgICAgV0RJX1AycE5vYUF0dHJJbmRUeXBlICAgICAgICB3ZGlQMnBOb2FBdHRySW5mbzsKKyNlbmRpZgorCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKyAgICBXRElfUHJlZk5ldHdvcmtGb3VuZEluZCAgICAgd2RpUHJlZk5ldHdvcmtGb3VuZEluZDsKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUworICAgIFdESV9XYWtlUmVhc29uSW5kVHlwZSAgICAgICAgd2RpV2FrZVJlYXNvbkluZDsKKyNlbmRpZiAvLyBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgfSAgd2RpSW5kaWNhdGlvbkRhdGE7Cit9V0RJX0xvd0xldmVsSW5kVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0xvd0xldmVsSW5kQ0JUeXBlCisKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHRvIGRlbGl2ZXIgdG8gVU1BQyBjZXJ0YWluIGluZGljYXRpb25zCisgICB0aGF0IGhhcyBlaXRoZXIgcmVjZWl2ZWQgZnJvbSB0aGUgbG93ZXIgZGV2aWNlIG9yIGhhcyBnZW5lcmF0ZWQgaXRzZWxmLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcHdkaUluZDogIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbmRpY2F0aW9uIHNlbnQgb3ZlcgorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSBwcm92aWRlZCBieSBVTUFDIGR1cmluZyByZWdpc3RyYXRpb24gCisgCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgKCpXRElfTG93TGV2ZWxJbmRDQlR5cGUpKFdESV9Mb3dMZXZlbEluZFR5cGUqIHB3ZGlJbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Ecml2ZXJUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICAgV0RJX0RSSVZFUl9UWVBFX1BST0RVQ1RJT04gID0gMCwKKyAgICBXRElfRFJJVkVSX1RZUEVfTUZHICAgICAgICAgPSAxLAorICAgIFdESV9EUklWRVJfVFlQRV9EVlQgICAgICAgICA9IDIKK30gV0RJX0RyaXZlclR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TdGFydFJlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKlRoaXMgaXMgYSBUTFYgZm9ybWF0dGVkIGJ1ZmZlciBjb250YWluaW5nIGFsbCBjb25maWcgdmFsdWVzIHRoYXQgY2FuCisgICBiZSBzZXQgdGhyb3VnaCB0aGUgREFMIEludGVyZmFjZQorIAorICAgVGhlIFRMViBpcyBleHBlY3RlZCB0byBiZSBmb3JtYXR0ZWQgbGlrZSB0aGlzOgorIAorICAgMCAgICAgICAgICAgIDcgICAgICAgICAgMTUgICAgICAgICAgICAgIDMxIC4uLi4gCisgICB8IENPTkZJRyBJRCAgfCAgQ0ZHIExFTiB8ICAgUkVTRVJWRUQgICAgfCAgQ0ZHIEJPRFkgIHwKKyAKKyAgIE9yIGZyb20gYSBDIGNvbnN0cnVjdCBwb2ludCBvZiBWVSBpdCB3b3VsZCBsb29rIGxpa2UgdGhpczoKKyAKKyAgIHR5cGVkZWYgc3RydWN0IFdQVF9QQUNLX1BPU1QKKyAgIHsKKyAgICAgICAjaWZkZWYgIFdQVF9CSUdfRU5ESUFOCisgICAgICAgICB3cHRfdWludDMyICAgdWNDZmdJZDo4OworICAgICAgICAgd3B0X3VpbnQzMiAgIHVjQ2ZnTGVuOjg7CisgICAgICAgICB3cHRfdWludDMyICAgdXNSZXNlcnZlZDoxNjsKKyAgICAgICAjZWxzZQorICAgICAgICAgd3B0X3VpbnQzMiAgIHVzUmVzZXJ2ZWQ6MTY7CisgICAgICAgICB3cHRfdWludDMyICAgdWNDZmdMZW46ODsKKyAgICAgICAgIHdwdF91aW50MzIgICB1Y0NmZ0lkOjg7CisgICAgICAgI2VuZGlmCisgCisgICAgICAgd3B0X3VpbnQ4ICAgdWNDZmdCb2R5W3VjQ2ZnTGVuXTsKKyAgIH1XRElfQ29uZmlnVHlwZTsgCisgCisgICBNdWx0aXBsZSBzdWNoIHR1cGxldHMgYXJlIHRvIGJlIHBsYWNlZCBpbiB0aGUgY29uZmlnIGJ1ZmZlci4gT25lIGZvcgorICAgZWFjaCByZXF1aXJlZCBjb25maWd1cmF0aW9uIGl0ZW06CisgCisgICAgIHwgVExWIDEgfCAgVExWMiB8IC4uLi4KKyAKKyAgIFRoZSBidWZmZXIgaXMgZXhwZWN0ZWQgdG8gYmUgYSBmbGF0IGFyZWEgb2YgbWVtb3J5IHRoYXQgY2FuIGJlIG1hbmlwdWxhdGVkCisgICB3aXRoIHN0YW5kYXJkIG1lbW9yeSByb3V0aW5lcy4KKyAKKyAgIEZvciBtb3JlIGluZm8gcGxlYXNlIGNoZWNrIHBhcmFncmFwaCAyLjMuMSBDb25maWcgU3RydWN0dXJlIGZyb20gdGhlCisgICBIQUwgTExELgorIAorICAgRm9yIGEgbGlzdCBvZiBhY2NlcHRlZCBjb25maWd1cmF0aW9uIGxpc3QgYW5kIElEcyBwbGVhc2UgbG9vayB1cAorICAgd2xhbl9xY3RfZGFsX2NmZy5oCisgCisgICovCisgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBDb25maWdCdWZmZXI7IAorCisgIC8qTGVuZ3RoIG9mIHRoZSBjb25maWcgYnVmZmVyIGFib3ZlKi8KKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgdXNDb25maWdCdWZmZXJMZW47CisKKyAgLypQcm9kdWN0aW9uIG9yIEZUTSBkcml2ZXIqLworICBXRElfRHJpdmVyVHlwZSAgICAgICAgICB3ZGlEcml2ZXJUeXBlOyAKKworICAvKlNob3VsZCBkZXZpY2UgZW5hYmxlIGZyYW1lIHRyYW5zbGF0aW9uICovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgIGJGcmFtZVRyYW5zRW5hYmxlZDsKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhOworCisgIC8qSW5kaWNhdGlvbiBjYWxsYmFjayBnaXZlbiBieSBVTUFDIHRvIGJlIGNhbGxlZCBieSB0aGUgV0xBTiBEQUwgd2hlbiBpdAorICAgIHdpc2hlcyB0byBzZW5kIHNvbWV0aGluZyBiYWNrIGluZGVwZW5kZW50IG9mIGEgcmVxdWVzdCovCisgIFdESV9Mb3dMZXZlbEluZENCVHlwZSAgIHdkaUxvd0xldmVsSW5kQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgaW5kaWNhdGlvbgorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgcEluZFVzZXJEYXRhOworfVdESV9TdGFydFJlcVBhcmFtc1R5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1N0YXJ0UnNwUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qU3RhdHVzIG9mIHRoZSByZXNwb25zZSovCisgIFdESV9TdGF0dXMgICAgd2RpU3RhdHVzOworCisgIC8qTWF4IG51bWJlciBvZiBTVEEgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UqLworICB3cHRfdWludDggICAgIHVjTWF4U3RhdGlvbnM7CisKKyAgLypNYXggbnVtYmVyIG9mIEJTUyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSovCisgIHdwdF91aW50OCAgICAgdWNNYXhCc3NpZHM7CisKKyAgLypWZXJzaW9uIG9mIHRoZSBXTEFOIEhBTCBBUEkgd2l0aCB3aGljaCB3ZSB3ZXJlIGNvbXBpbGVkKi8KKyAgV0RJX1dsYW5WZXJzaW9uVHlwZSB3bGFuQ29tcGlsZWRWZXJzaW9uOworCisgIC8qVmVyc2lvbiBvZiB0aGUgV0xBTiBIQUwgQVBJIHRoYXQgd2FzIHJlcG9ydGVkKi8KKyAgV0RJX1dsYW5WZXJzaW9uVHlwZSB3bGFuUmVwb3J0ZWRWZXJzaW9uOworCisgIC8qV0NOU1MgU29mdHdhcmUgdmVyc2lvbiBzdHJpbmcqLworICB3cHRfdWludDggd2Nuc3NTb2Z0d2FyZVZlcnNpb25bV0RJX1ZFUlNJT05fTEVOR1RIXTsKKworICAvKldDTlNTIEhhcmR3YXJlIHZlcnNpb24gc3RyaW5nKi8KKyAgd3B0X3VpbnQ4IHdjbnNzSGFyZHdhcmVWZXJzaW9uW1dESV9WRVJTSU9OX0xFTkdUSF07Cit9V0RJX1N0YXJ0UnNwUGFyYW1zVHlwZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfU3RvcFR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgLypEZXZpY2UgaXMgYmVpbmcgc3RvcHBlZCBkdWUgdG8gYSByZXNldCovCisgIFdESV9TVE9QX1RZUEVfU1lTX1JFU0VULAorCisgIC8qRGV2aWNlIGlzIGJlaW5nIHN0b3BwZWQgZHVlIHRvIGVudGVyaW5nIGRlZXAgc2xlZXAqLworICBXRElfU1RPUF9UWVBFX1NZU19ERUVQX1NMRUVQLAorCisgIC8qRGV2aWNlIGlzIGJlaW5nIHN0b3BwZWQgYmVjYXVzZSB0aGUgUkYgbmVlZHMgdG8gc2h1dCBvZmYKKyAgICAoZS5nLjpBaXJwbGFuZSBtb2RlKSovCisgIFdESV9TVE9QX1RZUEVfUkZfS0lMTCAKK31XRElfU3RvcFR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TdG9wUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgLypUaGUgcmVhc29uIGZvciB3aGljaCB0aGUgZGV2aWNlIGlzIGJlaW5nIHN0b3BwZWQqLworICBXRElfU3RvcFR5cGUgICB3ZGlTdG9wUmVhc29uOworCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7Cit9V0RJX1N0b3BSZXFQYXJhbXNUeXBlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TY2FuTW9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICBXRElfU0NBTl9NT0RFX05PUk1BTCA9IDAsCisgIFdESV9TQ0FOX01PREVfTEVBUk4sCisgIFdESV9TQ0FOX01PREVfU0NBTiwKKyAgV0RJX1NDQU5fTU9ERV9QUk9NSVNDLAorICBXRElfU0NBTl9NT0RFX1NVU1BFTkRfTElOSworfSBXRElfU2Nhbk1vZGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TY2FuRW50cnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgd3B0X3VpbnQ4IGJzc0lkeFtXRElfTlVNX0JTU0lEXTsKKyAgd3B0X3VpbnQ4IGFjdGl2ZUJTU2NudDsKK31XRElfU2NhbkVudHJ5OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfSW5pdFNjYW5SZXFJbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAvKkxFQVJOIC0gQVAgUm9sZQorICAgIFNDQU4gLSBTVEEgUm9sZSovCisgIFdESV9TY2FuTW9kZSAgICAgd2RpU2Nhbk1vZGU7CisKKyAgLypCU1NJRCBvZiB0aGUgQlNTKi8KKyAgd3B0X21hY0FkZHIgICAgICBtYWNCU1NJRDsKKworICAvKldoZXRoZXIgQlNTIG5lZWRzIHRvIGJlIG5vdGlmaWVkKi8KKyAgd3B0X2Jvb2xlYW4gICAgICBiTm90aWZ5QlNTOworCisgIC8qS2luZCBvZiBmcmFtZSB0byBiZSB1c2VkIGZvciBub3RpZnlpbmcgdGhlIEJTUyAoRGF0YSBOdWxsLCBRb1MgTnVsbCwgb3IKKyAgQ1RTIHRvIFNlbGYpLiBNdXN0IGFsd2F5cyBiZSBhIHZhbGlkIGZyYW1lIHR5cGUuKi8KKyAgd3B0X3VpbnQ4ICAgICAgICB1Y0ZyYW1lVHlwZTsKKworICAvKlVNQUMgaGFzIHRoZSBvcHRpb24gb2YgcGFzc2luZyB0aGUgTUFDIGZyYW1lIHRvIGJlIHVzZWQgZm9yIG5vdGlmeWluZworICAgdGhlIEJTUy4gSWYgbm9uLXplcm8sIEhBTCB3aWxsIHVzZSB0aGUgTUFDIGZyYW1lIGJ1ZmZlciBwb2ludGVkIHRvIGJ5CisgICBtYWNNZ210SGRyLiBJZiB6ZXJvLCBIQUwgd2lsbCBnZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgTUFDIGZyYW1lIGJhc2VkIG9uCisgICBmcmFtZVR5cGUuKi8KKyAgd3B0X3VpbnQ4ICAgICAgICB1Y0ZyYW1lTGVuZ3RoOworCisgIC8qUG9pbnRlciB0byB0aGUgTUFDIGZyYW1lIGJ1ZmZlci4gVXNlZCBvbmx5IGlmIHVjRnJhbWVMZW5ndGggaXMgbm9uLXplcm8uKi8KKyAgV0RJX01hY01nbXRIZHIgICB3ZGlNQUNNZ210SGRyOworCisgIC8qRW50cnkgdG8gaG9sZCBudW1iZXIgb2YgYWN0aXZlIEJTUyB0byBzZW5kIE5VTEwgZnJhbWVzIGJlZm9yZSAKKyAgICogaW5pdGlhdGluZyBTQ0FOKi8KKyAgV0RJX1NjYW5FbnRyeSAgICB3ZGlTY2FuRW50cnk7CisKKyAgLyogRmxhZyB0byBlbmFibGUvZGlzYWJsZSBTaW5nbGUgTk9BKi8KKyAgd3B0X2Jvb2xlYW4gICAgICBiVXNlTk9BOworCisgIC8qIEluZGljYXRlcyB0aGUgc2NhbiBkdXJhdGlvbiAoaW4gbXMpICovCisgIHdwdF91aW50MTYgICAgICAgc2NhbkR1cmF0aW9uOworCit9V0RJX0luaXRTY2FuUmVxSW5mb1R5cGU7IAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfSW5pdFNjYW5SZXFQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypUaGUgaW5mbyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QgdGhhdCBuZWVkcyB0byBiZSBzZW50IG92ZXIgdG8gdGhlCisgICAgZGV2aWNlKi8KKyAgV0RJX0luaXRTY2FuUmVxSW5mb1R5cGUgIHdkaVJlcUluZm87IAorCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfSW5pdFNjYW5SZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfU3RhcnRTY2FuUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qSW5kaWNhdGVzIHRoZSBjaGFubmVsIHRvIHNjYW4qLworICB3cHRfdWludDggICAgICAgICB1Y0NoYW5uZWw7CisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfU3RhcnRTY2FuUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1N0YXJ0U2NhblJzcFBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkluZGljYXRlcyB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24gKi8KKyAgV0RJX1N0YXR1cyAgICAgICAgd2RpU3RhdHVzOworCisjaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgIHdwdF91aW50MzIgICAgICAgIGFTdGFydFRTRlsyXTsKKyAgd3B0X2ludDggICAgICAgICAgdWNUeE1nbXRQb3dlcjsKKyNlbmRpZgorfVdESV9TdGFydFNjYW5Sc3BQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfRW5kU2NhblJlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkluZGljYXRlcyB0aGUgY2hhbm5lbCB0byBzdG9wIHNjYW5uaW5nLiAgTm90IHVzZWQgcmVhbGx5LiBCdXQgcmV0YWluZWQKKyAgICBmb3Igc3ltbWV0cnkgd2l0aCAic3RhcnQgU2NhbiIgbWVzc2FnZS4gSXQgY2FuIGFsc28gaGVscCBpbiBlcnJvcgorICAgIGNoZWNrIGlmIG5lZWRlZC4qLworICB3cHRfdWludDggICAgICAgICB1Y0NoYW5uZWw7CisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfRW5kU2NhblJlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9QaHlDaGFuQm9uZFN0YXRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgIFdESV9QSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQgPSAwLCAgICAgICAgICAgIAorICBXRElfUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZID0gMSwgICAgIAorICBXRElfUEhZX0RPVUJMRV9DSEFOTkVMX0NFTlRFUkVEID0gMiwgICAgICAgICAgICAKKyAgV0RJX1BIWV9ET1VCTEVfQ0hBTk5FTF9ISUdIX1BSSU1BUlkgPSAzICAgICAKK30gV0RJX1BoeUNoYW5Cb25kU3RhdGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9GaW5pc2hTY2FuUmVxSW5mb1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgLypMRUFSTiAtIEFQIFJvbGUKKyAgICBTQ0FOIC0gU1RBIFJvbGUqLworICBXRElfU2Nhbk1vZGUgICAgICAgICAgd2RpU2Nhbk1vZGU7CisKKyAgLypPcGVyYXRpbmcgY2hhbm5lbCB0byB0dW5lIHRvLiovCisgIHdwdF91aW50OCAgICAgICAgICAgICB1Y0N1cnJlbnRPcGVyYXRpbmdDaGFubmVsOworCisgIC8qQ2hhbm5lbCBCb25kaW5nIHN0YXRlIElmIDIwLzQwIE1IeiBpcyBvcGVyYXRpb25hbCwgdGhpcyB3aWxsIGluZGljYXRlIHRoZQorICA0MCBNSHogZXh0ZW5zaW9uIGNoYW5uZWwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgY29udHJvbCBjaGFubmVsKi8KKyAgV0RJX1BoeUNoYW5Cb25kU3RhdGUgIHdkaUNCU3RhdGU7CisKKyAgLypCU1NJRCBvZiB0aGUgQlNTKi8KKyAgd3B0X21hY0FkZHIgICAgICAgICAgIG1hY0JTU0lEOworCisgIC8qV2hldGhlciBCU1MgbmVlZHMgdG8gYmUgbm90aWZpZWQqLworICB3cHRfYm9vbGVhbiAgICAgICAgICAgYk5vdGlmeUJTUzsKKworICAvKktpbmQgb2YgZnJhbWUgdG8gYmUgdXNlZCBmb3Igbm90aWZ5aW5nIHRoZSBCU1MgKERhdGEgTnVsbCwgUW9TIE51bGwsIG9yCisgIENUUyB0byBTZWxmKS4gTXVzdCBhbHdheXMgYmUgYSB2YWxpZCBmcmFtZSB0eXBlLiovCisgIHdwdF91aW50OCAgICAgICAgICAgICB1Y0ZyYW1lVHlwZTsKKworICAvKlVNQUMgaGFzIHRoZSBvcHRpb24gb2YgcGFzc2luZyB0aGUgTUFDIGZyYW1lIHRvIGJlIHVzZWQgZm9yIG5vdGlmeWluZworICAgdGhlIEJTUy4gSWYgbm9uLXplcm8sIEhBTCB3aWxsIHVzZSB0aGUgTUFDIGZyYW1lIGJ1ZmZlciBwb2ludGVkIHRvIGJ5CisgICBtYWNNZ210SGRyLiBJZiB6ZXJvLCBIQUwgd2lsbCBnZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgTUFDIGZyYW1lIGJhc2VkIG9uCisgICBmcmFtZVR5cGUuKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgIHVjRnJhbWVMZW5ndGg7CisKKyAgLypQb2ludGVyIHRvIHRoZSBNQUMgZnJhbWUgYnVmZmVyLiBVc2VkIG9ubHkgaWYgdWNGcmFtZUxlbmd0aCBpcyBub24temVyby4qLworICBXRElfTWFjTWdtdEhkciAgICAgICAgd2RpTUFDTWdtdEhkcjsKKworICAvKkVudHJ5IHRvIGhvbGQgbnVtYmVyIG9mIGFjdGl2ZSBCU1MgdG8gc2VuZCBOVUxMIGZyYW1lcyBhZnRlciBTQ0FOKi8KKyAgV0RJX1NjYW5FbnRyeSAgICB3ZGlTY2FuRW50cnk7CisKK31XRElfRmluaXNoU2NhblJlcUluZm9UeXBlOyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1N3aXRjaENoUmVxSW5mb1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkluZGljYXRlcyB0aGUgY2hhbm5lbCB0byBzd2l0Y2ggdG8uKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgdWNDaGFubmVsOworCisgIC8qTG9jYWwgcG93ZXIgY29uc3RyYWludCovCisgIHdwdF91aW50OCAgICAgICAgIHVjTG9jYWxQb3dlckNvbnN0cmFpbnQ7CisKKyAgLypTZWNvbmRhcnkgY2hhbm5lbCBvZmZzZXQgKi8KKyAgV0RJX0hUU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCAgd2RpU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgd3B0X2ludDggICAgICBjTWF4VHhQb3dlcjsKKworICAvKlNlbGYgU1RBIE1hYyBhZGRyZXNzKi8KKyAgd3B0X21hY0FkZHIgICBtYWNTZWxmU3RhTWFjQWRkcjsKKyNlbmRpZgorICAvKiBWTyBXaWZpIGNvbW1lbnQ6IEJTU0lEIGlzIG5lZWRlZCB0byBpZGVudGlmeSB3aGljaCBzZXNzaW9uIGlzc3VlZCB0aGlzIHJlcXVlc3QuIEFzIHRoZSAKKyAgICAgcmVxdWVzdCBoYXMgcG93ZXIgY29uc3RyYWludHMsIHRoaXMgc2hvdWxkIGJlIGFwcGxpZWQgb25seSB0byB0aGF0IHNlc3Npb24gKi8KKyAgLyogViBJTVA6IEtlZXAgYnNzSWQgZmllbGQgYXQgdGhlIGVuZCBvZiB0aGlzIG1zZy4gSXQgaXMgdXNlZCB0byBtYW50YWluIGJhY2t3YXJkIGNvbXBhdGJpbGl0eQorICAgKiBieSB3YXkgb2YgaWdub3JpbmcgaWYgdXNpbmcgbmV3IGhvc3Qvb2xkIEZXIG9yIG9sZCBob3N0L25ldyBGVyBzaW5jZSBpdCBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgc3RydWN0CisgICAqLworICB3cHRfbWFjQWRkciAgIG1hY0JTU0lkOworCit9V0RJX1N3aXRjaENoUmVxSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Td2l0Y2hDaFJlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkNoYW5uZWwgSW5mbyovCisgIFdESV9Td2l0Y2hDaFJlcUluZm9UeXBlICB3ZGlDaEluZm87IAorCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7Cit9V0RJX1N3aXRjaENoUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0ZpbmlzaFNjYW5SZXFQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypJbmZvIGZvciB0aGUgRmluaXNoIFNjYW4gcmVxdWVzdCB0aGF0IHdpbGwgYmUgc2VudCBkb3duIHRvIHRoZSBkZXZpY2UqLworICBXRElfRmluaXNoU2NhblJlcUluZm9UeXBlICB3ZGlSZXFJbmZvOyAKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9GaW5pc2hTY2FuUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0pvaW5SZXFJbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qSW5kaWNhdGVzIHRoZSBCU1NJRCB0byB3aGljaCBTVEEgaXMgZ29pbmcgdG8gYXNzb2NpYXRlKi8KKyAgd3B0X21hY0FkZHIgICBtYWNCU1NJRDsgCisKKyAgLypJbmRpY2F0ZXMgdGhlIE1BQyBBZGRyZXNzIG9mIHRoZSBjdXJyZW50IFNlbGYgU1RBKi8KKyAgd3B0X21hY0FkZHIgICBtYWNTVEFTZWxmOyAKKyAKKyAgLypJbmRpY2F0ZXMgdGhlIGxpbmsgU3RhdGUgZGV0ZXJtaW5pbmcgdGhlIGVudGl0eSBUeXBlIGUuZy4gQlRBTVAtU1RBLCBTVEEgZXRjLiovCisgIHdwdF91aW50MzIgICAgbGlua1N0YXRlOworICAKKyAgLypJbmRpY2F0ZXMgdGhlIGNoYW5uZWwgdG8gc3dpdGNoIHRvLiovCisgIFdESV9Td2l0Y2hDaFJlcUluZm9UeXBlICB3ZGlDaGFubmVsSW5mbzsgCisKK31XRElfSm9pblJlcUluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfSm9pblJlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkluZm8gZm9yIHRoZSBKb2luIHJlcXVlc3QgdGhhdCB3aWxsIGJlIHNlbnQgZG93biB0byB0aGUgZGV2aWNlKi8KKyAgV0RJX0pvaW5SZXFJbmZvVHlwZSAgIHdkaVJlcUluZm87IAorCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfSm9pblJlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Cc3NUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIAoreworICBXRElfSU5GUkFTVFJVQ1RVUkVfTU9ERSwKKyAgV0RJX0lORlJBX0FQX01PREUsICAgICAgICAgICAgICAgICAgICAvL0FkZGVkIGZvciBzb2Z0QVAgc3VwcG9ydAorICBXRElfSUJTU19NT0RFLAorICBXRElfQlRBTVBfU1RBX01PREUsIAorICBXRElfQlRBTVBfQVBfTU9ERSwKKyAgV0RJX0JTU19BVVRPX01PREUsCit9V0RJX0Jzc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Od1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0gCit7CisgIFdESV8xMUFfTldfVFlQRSwKKyAgV0RJXzExQl9OV19UWVBFLAorICBXRElfMTFHX05XX1RZUEUsCisgIFdESV8xMU5fTldfVFlQRSwKK30gV0RJX053VHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0NvbmZpZ0FjdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSAKK3sKKyAgV0RJX0FERF9CU1MsCisgIFdESV9VUERBVEVfQlNTCit9IFdESV9Db25maWdBY3Rpb247CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9IVE9wZXJhdGluZ01vZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgV0RJX0hUX09QX01PREVfUFVSRSwKKyAgV0RJX0hUX09QX01PREVfT1ZFUkxBUF9MRUdBQ1ksICAKKyAgV0RJX0hUX09QX01PREVfTk9fTEVHQUNZXzIwTUhaX0hULCAgCisgIFdESV9IVF9PUF9NT0RFX01JWEVECisKK30gV0RJX0hUT3BlcmF0aW5nTW9kZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfU1RBRW50cnlUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIAoreworICBXRElfU1RBX0VOVFJZX1NFTEYsCisgIFdESV9TVEFfRU5UUllfUEVFUiwKKyAgV0RJX1NUQV9FTlRSWV9CU1NJRCwKKyAgV0RJX1NUQV9FTlRSWV9CQ0FTVAorfVdESV9TVEFFbnRyeVR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Db25maWdBY3Rpb25UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIAoreworICBXRElfQUREX1NUQSwKKyAgV0RJX1VQREFURV9TVEEKK30gV0RJX0NvbmZpZ0FjdGlvblR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgRWFjaCBzdGF0aW9uIGFkZGVkIGhhcyBhIHJhdGUgbW9kZSB3aGljaCBzcGVjaWZpZXMgdGhlIHN0YSBhdHRyaWJ1dGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIAoreworICAgIFdESV9SRVNFUlZFRF8xID0gMCwKKyAgICBXRElfUkVTRVJWRURfMiwKKyAgICBXRElfUkVTRVJWRURfMywKKyAgICBXRElfMTFiLAorICAgIFdESV8xMWJnLAorICAgIFdESV8xMWEsCisgICAgV0RJXzExbiwKK30gV0RJX1JhdGVNb2RlVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1N1cHBvcnRlZFJhdGVzVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0ICAKK3sKKyAgICAvKgorICAgICogRm9yIFNlbGYgU1RBIEVudHJ5OiB0aGlzIHJlcHJlc2VudHMgU2VsZiBNb2RlLgorICAgICogRm9yIFBlZXIgU3RhdGlvbnMsIHRoaXMgcmVwcmVzZW50cyB0aGUgbW9kZSBvZiB0aGUgcGVlci4KKyAgICAqIE9uIFN0YXRpb246CisgICAgKiAtLXRoaXMgbW9kZSBpcyB1cGRhdGVkIHdoZW4gUEUgYWRkcyB0aGUgU2VsZiBFbnRyeS4KKyAgICAqIC0tIE9SIHdoZW4gUEUgc2VuZHMgJ0FERF9CU1MnIG1lc3NhZ2UgYW5kIHN0YXRpb24gY29udGV4dCBpbiBCU1MgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgbW9kZSBvZiB0aGUgQVAuCisgICAgKiBPTiBBUDoKKyAgICAqIC0tIHRoaXMgbW9kZSBpcyB1cGRhdGVkIHdoZW4gUEUgc2VuZHMgJ0FERF9CU1MnIGFuZCBTdGEgZW50cnkgZm9yIHRoYXQgQlNTIGlzIHVzZWQKKyAgICAqICAgICB0byBpbmRpY2F0ZSB0aGUgc2VsZiBtb2RlIG9mIHRoZSBBUC4KKyAgICAqIC0tIE9SIHdoZW4gYSBzdGF0aW9uIGlzIGFzc29jaWF0ZWQsIFBFIHNlbmRzICdBRERfU1RBJyBtZXNzYWdlIHdpdGggdGhpcyBtb2RlIHVwZGF0ZWQuCisgICAgKi8KKworICAgIFdESV9SYXRlTW9kZVR5cGUgICBvcFJhdGVNb2RlOworCisgICAgLyogMTFiLCAxMWEgYW5kIGFuaUxlZ2FjeVJhdGVzIGFyZSBJRSByYXRlcyB3aGljaCBnaXZlcyByYXRlIGluIHVuaXQgb2YgNTAwS2JwcyAqLworICAgIHdwdF91aW50MTYgICAgICAgICBsbGJSYXRlc1tXRElfTlVNXzExQl9SQVRFU107CisgICAgd3B0X3VpbnQxNiAgICAgICAgIGxsYVJhdGVzW1dESV9OVU1fMTFBX1JBVEVTXTsKKyAgICB3cHRfdWludDE2ICAgICAgICAgYUxlZ2FjeVJhdGVzW1dESV9OVU1fUE9MQVJJU19SQVRFU107CisKKyAgICAvKlRhdXJ1cyBvbmx5IHN1cHBvcnRzIDI2IFRpdGFuIFJhdGVzKG5vIEVTRi9jb25jYXQgUmF0ZXMgd2lsbCBiZSBzdXBwb3J0ZWQpCisgICAgICBGaXJzdCAyNiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgdGhvc2UgVGl0YW4gcmF0ZXMgYW5kCisgICAgIHRoZSBsYXN0IDQgYml0cyhiaXQyOC0zMSkgZm9yIFRhdXJ1cywgMihiaXQyNi0yNykgYml0cyBhcmUgcmVzZXJ2ZWQuKi8KKyAgICB3cHRfdWludDMyICAgICAgICAgdUVuaGFuY2VkUmF0ZUJpdG1hcDsgLy9UaXRhbiBhbmQgVGF1cnVzIFJhdGVzCisKKyAgICAvKgorICAgICogMC03NiBiaXRzIHVzZWQsIHJlbWFpbmluZyByZXNlcnZlZAorICAgICogYml0cyAwLTE1IGFuZCAzMiBzaG91bGQgYmUgc2V0LgorICAgICovCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICBhU3VwcG9ydGVkTUNTU2V0W1dESV9NQUNfTUFYX1NVUFBPUlRFRF9NQ1NfU0VUXTsKKworICAgIC8qCisgICAgICogUlggSGlnaGVzdCBTdXBwb3J0ZWQgRGF0YSBSYXRlIGRlZmluZXMgdGhlIGhpZ2hlc3QgZGF0YQorICAgICAqIHJhdGUgdGhhdCB0aGUgU1RBIGlzIGFibGUgdG8gcmVjZWl2ZSwgaW4gdW5pdGVzIG9mIDFNYnBzLgorICAgICAqIFRoaXMgdmFsdWUgaXMgZGVyaXZlZCBmcm9tICJTdXBwb3J0ZWQgTUNTIFNldCBmaWVsZCIgaW5zaWRlCisgICAgICogdGhlIEhUIGNhcGFiaWxpdHkgZWxlbWVudC4KKyAgICAgKi8KKyAgICB3cHRfdWludDE2ICAgICAgICAgYVJ4SGlnaGVzdERhdGFSYXRlOworCit9IFdESV9TdXBwb3J0ZWRSYXRlczsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgV0RJX0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIAorICAgIFNwYXRpYWwgTXVsdGlwbGV4aW5nKFNNKSBQb3dlciBTYXZlIG1vZGUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0gCit7CisgIFdESV9IVF9NSU1PX1BTX1NUQVRJQyAgID0gMCwgICAgLy8gU3RhdGljIFNNIFBvd2VyIFNhdmUgbW9kZQorICBXRElfSFRfTUlNT19QU19EWU5BTUlDICA9IDEsICAgLy8gRHluYW1pYyBTTSBQb3dlciBTYXZlIG1vZGUKKyAgV0RJX0hUX01JTU9fUFNfTkEgICAgICAgPSAyLCAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgV0RJX0hUX01JTU9fUFNfTk9fTElNSVQgPSAzLCAgLy8gU00gUG93ZXIgU2F2ZSBkaXNhYmxlZAorfSBXRElfSFRNSU1PUG93ZXJTYXZlU3RhdGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Db25maWdTdGFSZXFJbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qQlNTSUQgb2YgU1RBKi8KKyAgd3B0X21hY0FkZHIgICAgICAgICAgICAgICBtYWNCU1NJRDsKKworICAvKkFTU09DIElELCBhcyBhc3NpZ25lZCBieSBVTUFDKi8KKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICB1c0Fzc29jSWQ7CisKKyAgLypVc2VkIGZvciBjb25maWd1cmF0aW9uIG9mIGRpZmZlcmVudCBIVyBtb2R1bGVzLiovCisgIFdESV9TVEFFbnRyeVR5cGUgICAgICAgICAgd2RpU1RBVHlwZTsKKworICAvKlNob3J0IFByZWFtYmxlIFN1cHBvcnRlZC4qLworICB3cHRfdWludDggICAgICAgICAgICAgICAgIHVjU2hvcnRQcmVhbWJsZVN1cHBvcnRlZDsKKworICAvKk1BQyBBZGRyZXNzIG9mIFNUQSovCisgIHdwdF9tYWNBZGRyICAgICAgICAgICAgICAgbWFjU1RBOworCisgIC8qTGlzdGVuIGludGVydmFsIG9mIHRoZSBTVEEqLworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgIHVzTGlzdGVuSW50ZXJ2YWw7CisKKyAgLypTdXBwb3J0IGZvciAxMWUvV01NKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICB1Y1dNTUVuYWJsZWQ7CisKKyAgLyoxMW4gSFQgY2FwYWJsZSBTVEEqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgIHVjSFRDYXBhYmxlOworCisgIC8qVFggV2lkdGggU2V0OiAwIC0gMjAgTUh6IG9ubHksIDEgLSAyMC80MCBNSHoqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgIHVjVFhDaGFubmVsV2lkdGhTZXQ7CisKKyAgLypSSUZTIG1vZGUgMCAtIE5BLCAxIC0gQWxsb3dlZCovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgdWNSSUZTTW9kZTsKKworICAvKkwtU0lHIFRYT1AgUHJvdGVjdGlvbiBtZWNoYW5pc20KKyAgMCAtIE5vIFN1cHBvcnQsIDEgLSBTdXBwb3J0ZWQKKyAgICAgIFNHIC0gdGhlcmUgaXMgZ2xvYmFsIGZpZWxkKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICB1Y0xTSUdUeG9wUHJvdGVjdGlvbjsKKworICAvKk1heCBBbXBkdSBTaXplIHN1cHBvcnRlZCBieSBTVEEuIERldmljZSBwcm9ncmFtbWluZy4KKyAgICAwIDogOGsgLCAxIDogMTZrLCAyIDogMzJrLCAzIDogNjRrICovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgdWNNYXhBbXBkdVNpemU7CisKKyAgLypNYXggQW1wZHUgZGVuc2l0eS4gVXNlZCBieSBSQS4gMyA6IDB+NyA6IDJeKDExbkFNUERVZGVuc2l0eSAtNCkqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgIHVjTWF4QW1wZHVEZW5zaXR5OworCisgIC8qTWF4IEFNU0RVIHNpemUgMSA6IDM4MzkgYnl0ZXMsIDAgOiA3OTM1IGJ5dGVzKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICB1Y01heEFtc2R1U2l6ZTsKKworICAvKlNob3J0IEdJIHN1cHBvcnQgZm9yIDQwTWh6IHBhY2tldHMqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgIHVjU2hvcnRHSTQwTWh6OworCisgIC8qU2hvcnQgR0kgc3VwcG9ydCBmb3IgMjBNaHogcGFja2V0cyovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgdWNTaG9ydEdJMjBNaHo7CisKKyAgLypUaGVzZSByYXRlcyBhcmUgdGhlIGludGVyc2VjdGlvbiBvZiBwZWVyIGFuZCBzZWxmIGNhcGFiaWxpdGllcy4qLworICBXRElfU3VwcG9ydGVkUmF0ZXMgICAgICAgIHdkaVN1cHBvcnRlZFJhdGVzOworCisgIC8qUm9idXN0IE1hbmFnZW1lbnQgRnJhbWUgKFJNRikgZW5hYmxlZC9kaXNhYmxlZCovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgdWNSTUZFbmFibGVkOworCisgIC8qIFRoZSB1bmljYXN0IGVuY3J5cHRpb24gdHlwZSBpbiB0aGUgYXNzb2NpYXRpb24gKi8KKyAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICB1Y0VuY3J5cHRUeXBlOworCisgIC8qSEFMIHNob3VsZCB1cGRhdGUgdGhlIGV4aXN0aW5nIFNUQSBlbnRyeSwgaWYgdGhpcyBmbGFnIGlzIHNldC4gVU1BQyAKKyAgIHdpbGwgc2V0IHRoaXMgZmxhZyBpbiBjYXNlIG9mIFJFLUFTU09DLCB3aGVyZSB3ZSB3YW50IHRvIHJldXNlIHRoZSBvbGQKKyAgIFNUQSBJRC4qLworICBXRElfQ29uZmlnQWN0aW9uVHlwZSAgICAgIHdkaUFjdGlvbjsKKworICAvKlUtQVBTRCBGbGFnczogMWIgcGVyIEFDLiAgRW5jb2RlZCBhcyBmb2xsb3dzOgorICAgICBiNyBiNiBiNSBiNCBiMyBiMiBiMSBiMCA9CisgICAgIFggIFggIFggIFggIEJFIEJLIFZJIFZPCisgICovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgdWNBUFNEOworCisgIC8qTWF4IFNQIExlbmd0aCovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgdWNNYXhTUExlbjsKKworICAvKjExbiBHcmVlbiBGaWVsZCBwcmVhbWJsZSBzdXBwb3J0Ki8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICB1Y0dyZWVuRmllbGRDYXBhYmxlOworCisgIC8qTUlNTyBQb3dlciBTYXZlIG1vZGUqLworICBXRElfSFRNSU1PUG93ZXJTYXZlU3RhdGUgIHdkaU1JTU9QUzsKKworICAvKkRlbGF5ZWQgQkEgU3VwcG9ydCovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgdWNEZWxheWVkQkFTdXBwb3J0OworCisgIC8qTWF4IEFNUERVIGR1cmF0aW9uIGluIDMydXMqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgIHVzMzJNYXhBbXBkdUR1cmF0aW87CisKKyAgLypIVCBTVEEgc2hvdWxkIHNldCBpdCB0byAxIGlmIGl0IGlzIGVuYWJsZWQgaW4gQlNTCisgICBIVCBTVEEgc2hvdWxkIHNldCBpdCB0byAwIGlmIEFQIGRvZXMgbm90IHN1cHBvcnQgaXQuIFRoaXMgaW5kaWNhdGlvbiBpcworICAgc2VudCB0byBIQUwgYW5kIEhBTCB1c2VzIHRoaXMgZmxhZyB0byBwaWNrdXAgdXAgYXBwcm9wcmlhdGUgNDBNaHogcmF0ZXMuCisgICovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgdWNEc3NzQ2NrTW9kZTQwTWh6OworCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgdWNQMnBDYXBhYmxlU3RhOworfVdESV9Db25maWdTdGFSZXFJbmZvVHlwZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfUmF0ZVNldAorIAorICAxMiBCeXRlcyBsb25nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHJhdGUKKyAgYW5kIGV4dGVuZGVkIHJhdGUgc2V0IElFcworICBUaGUgcGFyc2VyIGFzc3VtZSB0aGlzIHRvIGJlIGF0IGxlYXN0IDEyIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0RJX1JBVEVTRVRfRUlEX01BWCAgICAgICAgICAgIDEyCisKK3R5cGVkZWYgc3RydWN0IAoreworICAgIHdwdF91aW50OCAgdWNOdW1SYXRlczsKKyAgICB3cHRfdWludDggIGFSYXRlc1tXRElfUkFURVNFVF9FSURfTUFYXTsKK30gV0RJX1JhdGVTZXQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9BY2lBaWZzblR5cGUKKyAgIGFjY2VzcyBjYXRlZ29yeSByZWNvcmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICB3cHRfdWludDggIHJzdmQgIDogMTsKKyAgICB3cHRfdWludDggIGFjaSAgIDogMjsKKyAgICB3cHRfdWludDggIGFjbSAgIDogMTsKKyAgICB3cHRfdWludDggIGFpZnNuIDogNDsKK30gV0RJX0FjaUFpZnNuVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0NXVHlwZQorICAgY29udGVudGlvbiB3aW5kb3cgc2l6ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreworICAgIHdwdF91aW50OCAgbWF4IDogNDsKKyAgICB3cHRfdWludDggIG1pbiA6IDQ7Cit9IFdESV9DV1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9FZGNhUGFyYW1SZWNvcmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICAvKkFjY2VzcyBDYXRlZ29yeSBSZWNvcmQqLworICAgIFdESV9BY2lBaWZzblR5cGUgIHdkaUFDSTsKKworICAgIC8qQ29udGVudGlvbiBXSW5kb3cgU2l6ZSovCisgICAgV0RJX0NXVHlwZSAgICAgICAgd2RpQ1c7CisKKyAgICAvKlRYIE9wb3J0dW5pdHkgTGltaXQqLworICAgIHdwdF91aW50MTYgICAgICAgIHVzVFhPUExpbWl0OworfSBXRElfRWRjYVBhcmFtUmVjb3JkOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfRURDQVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkJTUyBJbmRleCovCisgIHdwdF91aW50OCAgICAgIHVjQlNTSWR4OworICAKKyAgLyo/Ki8KKyAgd3B0X2Jvb2xlYW4gICAgYkhpZ2hQZXJmb3JtYW5jZTsKKworICAvKkJlc3QgRWZmb3J0Ki8KKyAgV0RJX0VkY2FQYXJhbVJlY29yZCB3ZGlBQ0JFOyAKKyAgICAgICAgICAgCisgIC8qQmFja2dyb3VuZCovCisgIFdESV9FZGNhUGFyYW1SZWNvcmQgd2RpQUNCSzsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8qVmlkZW8qLworICBXRElfRWRjYVBhcmFtUmVjb3JkIHdkaUFDVkk7IAorICAKKyAgLypWb2ljZSovCisgIFdESV9FZGNhUGFyYW1SZWNvcmQgYWN2bzsgLy8gdm9pY2UKK30gV0RJX0VEQ0FQYXJhbXNUeXBlOworCisvKiBvcGVyTW9kZSBpbiBBREQgQlNTIG1lc3NhZ2UgKi8KKyNkZWZpbmUgV0RJX0JTU19PUEVSQVRJT05BTF9NT0RFX0FQICAgICAwCisjZGVmaW5lIFdESV9CU1NfT1BFUkFUSU9OQUxfTU9ERV9TVEEgICAgMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfQ29uZmlnQlNTUnNwUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qU3RhdHVzIG9mIHRoZSByZXNwb25zZSovCisgIFdESV9TdGF0dXMgICB3ZGlTdGF0dXM7IAorCisgIC8qQlNTSUQgb2YgdGhlIEJTUyovCisgIHdwdF9tYWNBZGRyICBtYWNCU1NJRDsgCisKKyAgLypCU1MgSW5kZXgqLworICB3cHRfdWludDggICAgdWNCU1NJZHg7CisKKyAgLypVbmljYXN0IERQVSBzaWduYXR1cmUqLworICB3cHRfdWludDggICAgdWNVY2FzdFNpZzsKKworICAvKkJyb2FkY2FzdCBEUFUgU2lnbmF0dXJlKi8KKyAgd3B0X3VpbnQ4ICAgIHVjQmNhc3RTaWc7CisKKyAgLypNQUMgQWRkcmVzcyBvZiBTVEEqLyAKKyAgd3B0X21hY0FkZHIgIG1hY1NUQTsKKworICAvKkJTUyBTVEEgSUQqLworICB3cHRfdWludDggICAgdWNTVEFJZHg7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgIC8qSEFMIGZpbGxzIGluIHRoZSB0eCBwb3dlciB1c2VkIGZvciBtZ210IGZyYW1lcyBpbiB0aGlzIGZpZWxkICovCisgIHdwdF9pbnQ4ICAgIHVjVHhNZ210UG93ZXI7CisjZW5kaWYKKworfVdESV9Db25maWdCU1NSc3BQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfRGVsQlNTUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAvKkJTUyBJbmRleCBvZiB0aGUgQlNTKi8KKyAgIHdwdF91aW50OCAgICAgIHVjQnNzSWR4OworCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7Cit9V0RJX0RlbEJTU1JlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9EZWxCU1NSc3BQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypTdGF0dXMgb2YgdGhlIHJlc3BvbnNlKi8KKyAgV0RJX1N0YXR1cyAgIHdkaVN0YXR1czsgCisKKyAgLypCU1NJRCBvZiB0aGUgQlNTKi8KKyAgd3B0X21hY0FkZHIgIG1hY0JTU0lEOyAKKworICB3cHRfdWludDggICAgdWNCc3NJZHg7CisKK31XRElfRGVsQlNTUnNwUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0NvbmZpZ1NUQVJzcFBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKlN0YXR1cyBvZiB0aGUgcmVzcG9uc2UqLworICBXRElfU3RhdHVzICAgICAgd2RpU3RhdHVzOworCisgIC8qU1RBIElkeCBhbGxvY2F0ZWQgYnkgSEFMKi8KKyAgd3B0X3VpbnQ4ICAgICAgIHVjU1RBSWR4OworCisgIC8qTUFDIEFkZHJlc3Mgb2YgU1RBKi8KKyAgd3B0X21hY0FkZHIgICAgIG1hY1NUQTsKKworICAvKiBCU1NJRCBJbmRleCBvZiBCU1MgdG8gd2hpY2ggdGhlIHN0YXRpb24gaXMgYXNzb2NpYXRlZCAqLworICB3cHRfdWludDggICAgICAgdWNCc3NJZHg7CisgIAorICAvKiBEUFUgSW5kZXggIC0gUFRLICovCisgIHdwdF91aW50OCAgICAgICB1Y0RwdUluZGV4OworCisgIC8qIEJjYXN0IERQVSBJbmRleCAgLSBHVEsgKi8gIAorICB3cHRfdWludDggICAgICAgdWNCY2FzdERwdUluZGV4OworCisgIC8qIE1hbmFnZW1lbnQgRFBVIEluZGV4IC0gSUdUSyAtIFdoeSBpcyBpdCBjYWxsZWQgYmNhc3RNZ210RHB1SWR4PyAqLworICB3cHRfdWludDggICAgICAgdWNCY2FzdE1nbXREcHVJZHg7CisKKyAgLypVbmljYXN0IERQVSBzaWduYXR1cmUqLworICB3cHRfdWludDggICAgICAgdWNVY2FzdFNpZzsKKworICAvKkJyb2FkY2FzdCBEUFUgU2lnbmF0dXJlKi8KKyAgd3B0X3VpbnQ4ICAgICAgIHVjQmNhc3RTaWc7CisKKyAgLyogSUdUSyBEUFUgc2lnbmF0dXJlKi8KKyAgd3B0X3VpbnQ4ICAgICAgIHVjTWdtdFNpZzsKKworfVdESV9Db25maWdTVEFSc3BQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfUG9zdEFzc29jUnNwUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qU3RhdHVzIG9mIHRoZSByZXNwb25zZSovCisgIFdESV9TdGF0dXMgICB3ZGlTdGF0dXM7IAorCisgIC8qUGFyYW1ldGVycyByZWxhdGVkIHRvIHRoZSBCU1MqLworICBXRElfQ29uZmlnQlNTUnNwUGFyYW1zVHlwZSBic3NQYXJhbXM7CisKKyAgLypQYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gdGhlIHNlbGYgU1RBKi8KKyAgV0RJX0NvbmZpZ1NUQVJzcFBhcmFtc1R5cGUgc3RhUGFyYW1zOworCit9V0RJX1Bvc3RBc3NvY1JzcFBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9EZWxTVEFSZXFQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypTVEEgSW5kZXggcmV0dXJuZWQgZHVyaW5nIERBTF9Qb3N0QXNzb2NSZXEgb3IgREFMX0NvbmZpZ1N0YVJlcSovCisgIHdwdF91aW50OCAgICAgICAgIHVjU1RBSWR4OworCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7Cit9V0RJX0RlbFNUQVJlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9EZWxTVEFSc3BQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAvKlN0YXR1cyBvZiB0aGUgcmVzcG9uc2UqLworICBXRElfU3RhdHVzICAgd2RpU3RhdHVzOyAKKworICAvKlNUQSBJbmRleCByZXR1cm5lZCBkdXJpbmcgREFMX1Bvc3RBc3NvY1JlcSBvciBEQUxfQ29uZmlnU3RhUmVxKi8KKyAgd3B0X3VpbnQ4ICAgIHVjU1RBSWR4OworfVdESV9EZWxTVEFSc3BQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfRW5jcnlwdFR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0gCit7CisgICAgV0RJX0VOQ1JfTk9ORSwKKyAgICBXRElfRU5DUl9XRVA0MCwKKyAgICBXRElfRU5DUl9XRVAxMDQsCisgICAgV0RJX0VOQ1JfVEtJUCwKKyAgICBXRElfRU5DUl9DQ01QLAorI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX1dBUEkpCisgICAgV0RJX0VOQ1JfV1BJLAorI2VuZGlmCisgICAgV0RJX0VOQ1JfQUVTXzEyOF9DTUFDCit9IFdESV9FbmNyeXB0VHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0tleURpcmVjdGlvblR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICBXRElfVFhfT05MWSwKKyAgICBXRElfUlhfT05MWSwKKyAgICBXRElfVFhfUlgsCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgIFdESV9UWF9ERUZBVUxULAorI2VuZGlmCisgICAgV0RJX0RPTk9UX1VTRV9LRVlfRElSRUNUSU9OCit9IFdESV9LZXlEaXJlY3Rpb25UeXBlOworCisjZGVmaW5lIFdESV9NQVhfRU5DUl9LRVlTIDQKKyNkZWZpbmUgV0RJX01BWF9LRVlfTEVOR1RIIDMyCisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKyNkZWZpbmUgV0RJX01BWF9LRVlfUlNDX0xFTiAgICAgICAgIDE2CisjZGVmaW5lIFdESV9XQVBJX0tFWV9SU0NfTEVOICAgICAgICAxNgorI2Vsc2UKKyNkZWZpbmUgV0RJX01BWF9LRVlfUlNDX0xFTiAgICAgICAgIDgKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEtleSBJRCAqLworICAgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgIGtleUlkOworICAgIC8qIDAgZm9yIG11bHRpY2FzdCAqLworICAgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgIHVuaWNhc3Q7ICAgICAKKyAgICAvKiBLZXkgRGlyZWN0aW9uICovCisgICAgV0RJX0tleURpcmVjdGlvblR5cGUgICAgICAga2V5RGlyZWN0aW9uOworICAgIC8qIFVzYWdlIGlzIHVua25vd24gKi8KKyAgICB3cHRfdWludDggICAgICAgICAgICAgICAgICBrZXlSc2NbV0RJX01BWF9LRVlfUlNDX0xFTl07ICAgCisgICAgLyogPTEgZm9yIGF1dGhlbnRpY2F0b3IsID0wIGZvciBzdXBwbGljYW50ICovCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgcGFlUm9sZTsgICAgIAorICAgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgIGtleUxlbmd0aDsKKyAgICB3cHRfdWludDggICAgICAgICAgICAgICAgICBrZXlbV0RJX01BWF9LRVlfTEVOR1RIXTsKKworfVdESV9LZXlzVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1NldEJTU0tleVJlcUluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qQlNTIEluZGV4IG9mIHRoZSBCU1MqLworICB3cHRfdWludDggICAgICB1Y0Jzc0lkeDsgCisKKyAgLypFbmNyeXB0aW9uIFR5cGUgdXNlZCB3aXRoIHBlZXIqLworICBXRElfRW5jcnlwdFR5cGUgIHdkaUVuY1R5cGU7CisKKyAgLypOdW1iZXIgb2Yga2V5cyovCisgIHdwdF91aW50OCAgICAgICAgdWNOdW1LZXlzOworCisgIC8qQXJyYXkgb2Yga2V5cy4qLworICBXRElfS2V5c1R5cGUgICAgIGFLZXlzW1dESV9NQVhfRU5DUl9LRVlTXTsgCisKKyAgLypDb250cm9sIGZvciBSZXBsYXkgQ291bnQsIDE9IFNpbmdsZSBUSUQgYmFzZWQgcmVwbGF5IGNvdW50IG9uIFR4CisgICAgMCA9IFBlciBUSUQgYmFzZWQgcmVwbGF5IGNvdW50IG9uIFRYICovCisgIHdwdF91aW50OCAgICAgICAgdWNTaW5nbGVUaWRSYzsgCit9V0RJX1NldEJTU0tleVJlcUluZm9UeXBlOyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1NldEJTU0tleVJlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKktleSBJbmZvICovCisgIFdESV9TZXRCU1NLZXlSZXFJbmZvVHlwZSAgd2RpQlNTS2V5SW5mbzsgCisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9TZXRCU1NLZXlSZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfV2VwVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSAKK3sKKyAgV0RJX1dFUF9TVEFUSUMsCisgIFdESV9XRVBfRFlOQU1JQworCit9IFdESV9XZXBUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfUmVtb3ZlQlNTS2V5UmVxSW5mb1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgLypCU1MgSW5kZXggb2YgdGhlIEJTUyovCisgIHdwdF91aW50OCAgICAgIHVjQnNzSWR4OyAKKworICAvKkVuY3J5cHRpb24gVHlwZSB1c2VkIHdpdGggcGVlciovCisgIFdESV9FbmNyeXB0VHlwZSAgd2RpRW5jVHlwZTsKKworICAvKktleSBJZCovCisgIHdwdF91aW50OCAgICB1Y0tleUlkOworCisgIC8qU1RBVElDL0RZTkFNSUMuIFVzZWQgaW4gTnVsbGlmeWluZyBpbiBLZXkgRGVzY3JpcHRvcnMgZm9yIFN0YXRpYy9EeW5hbWljCisgICAga2V5cyovCisgIFdESV9XZXBUeXBlICB3ZGlXRVBUeXBlOworfVdESV9SZW1vdmVCU1NLZXlSZXFJbmZvVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1JlbW92ZUJTU0tleVJlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKktleSBJbmZvICovCisgIFdESV9SZW1vdmVCU1NLZXlSZXFJbmZvVHlwZSAgd2RpS2V5SW5mbzsgCisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfUmVtb3ZlQlNTS2V5UmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1NldFNUQUtleVJlcUluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qU1RBIEluZGV4Ki8KKyAgd3B0X3VpbnQ4ICAgICAgICB1Y1NUQUlkeDsgCisKKyAgLypFbmNyeXB0aW9uIFR5cGUgdXNlZCB3aXRoIHBlZXIqLworICBXRElfRW5jcnlwdFR5cGUgIHdkaUVuY1R5cGU7CisKKyAgLypTVEFUSUMvRFlOQU1JQyovCisgIFdESV9XZXBUeXBlICAgICAgd2RpV0VQVHlwZTsKKworICAvKkRlZmF1bHQgV0VQIGtleSwgdmFsaWQgb25seSBmb3Igc3RhdGljIFdFUCwgbXVzdCBiZXR3ZWVuIDAgYW5kIDMuKi8KKyAgd3B0X3VpbnQ4ICAgICAgICB1Y0RlZldFUElkeDsKKworICAvKk51bWJlciBvZiBrZXlzKi8KKyAgd3B0X3VpbnQ4ICAgICAgICB1Y051bUtleXM7CisKKyAgLypBcnJheSBvZiBrZXlzLiovCisgIFdESV9LZXlzVHlwZSAgICAgd2RpS2V5W1dESV9NQVhfRU5DUl9LRVlTXTsgCisKKyAgLypDb250cm9sIGZvciBSZXBsYXkgQ291bnQsIDE9IFNpbmdsZSBUSUQgYmFzZWQgcmVwbGF5IGNvdW50IG9uIFR4CisgICAgMCA9IFBlciBUSUQgYmFzZWQgcmVwbGF5IGNvdW50IG9uIFRYICovCisgIHdwdF91aW50OCAgICAgICAgdWNTaW5nbGVUaWRSYzsgCit9V0RJX1NldFNUQUtleVJlcUluZm9UeXBlOyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0NvbmZpZ0JTU1JlcUluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypQZWVyIEJTU0lEKi8KKyAgd3B0X21hY0FkZHIgICAgICAgICAgICAgIG1hY0JTU0lEOworCisgIC8qU2VsZiBNQUMgQWRkcmVzcyovCisgIHdwdF9tYWNBZGRyICAgICAgICAgICAgICBtYWNTZWxmQWRkcjsgCisKKyAgLypCU1MgVHlwZSovCisgIFdESV9Cc3NUeXBlICAgICAgICAgICAgICB3ZGlCU1NUeXBlOworCisgIC8qT3BlcmF0aW9uYWwgTW9kZTogQVAgPTAsIFNUQSA9IDEqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgdWNPcGVyTW9kZTsKKworICAvKk5ldHdvcmsgVHlwZSovCisgIFdESV9Od1R5cGUgICAgICAgICAgICAgICB3ZGlOV1R5cGU7CisKKyAgLypVc2VkIHRvIGNsYXNzaWZ5IFBVUkVfMTFHLzExR19NSVhFRCB0byBwcm9ncmFtIE1UVSovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICB1Y1Nob3J0U2xvdFRpbWVTdXBwb3J0ZWQ7CisKKyAgLypDby1leGlzdCB3aXRoIDExYSBTVEEqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgdWNsbGFDb2V4aXN0OworCisgIC8qQ28tZXhpc3Qgd2l0aCAxMWIgU1RBKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgIHVjbGxiQ29leGlzdDsKKworICAvKkNvLWV4aXN0IHdpdGggMTFnIFNUQSovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICB1Y2xsZ0NvZXhpc3Q7CisKKyAgLypDb2V4aXN0ZW5jZSB3aXRoIDExbiBTVEEqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgdWNIVDIwQ29leGlzdDsKKworICAvKk5vbiBHRiBjb2V4aXN0IGZsYWcqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgdWNsbG5Ob25HRkNvZXhpc3Q7CisKKyAgLypUWE9QIHByb3RlY3Rpb24gc3VwcG9ydCovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICB1Y1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQ7CisKKyAgLypSSUZTIG1vZGUqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgdWNSSUZTTW9kZTsKKworICAvKkJlYWNvbiBJbnRlcnZhbCBpbiBUVSovCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c0JlYWNvbkludGVydmFsOworCisgIC8qRFRJTSBwZXJpb2QqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgdWNEVElNUGVyaW9kOworCisgIC8qVFggV2lkdGggU2V0OiAwIC0gMjAgTUh6IG9ubHksIDEgLSAyMC80MCBNSHoqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgdWNUWENoYW5uZWxXaWR0aFNldDsKKworICAvKk9wZXJhdGluZyBjaGFubmVsKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgIHVjQ3VycmVudE9wZXJDaGFubmVsOworCisgIC8qRXh0ZW5zaW9uIGNoYW5uZWwgZm9yIGNoYW5uZWwgYm9uZGluZyovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICB1Y0N1cnJlbnRFeHRDaGFubmVsOworCisgIC8qQ29udGV4dCBvZiB0aGUgc3RhdGlvbiBiZWluZyBhZGRlZCBpbiBIVy4qLworICBXRElfQ29uZmlnU3RhUmVxSW5mb1R5cGUgd2RpU1RBQ29udGV4dDsKKworICAvKlNTSUQgb2YgdGhlIEJTUyovCisgIFdESV9NYWNTU2lkICAgICAgICAgICAgICB3ZGlTU0lEOworCisgIC8qSEFMIHNob3VsZCB1cGRhdGUgdGhlIGV4aXN0aW5nIEJTUyBlbnRyeSwgaWYgdGhpcyBmbGFnIGlzIHNldC4gVU1BQyB3aWxsCisgICAgc2V0IHRoaXMgZmxhZyBpbiBjYXNlIG9mIFJFLUFTU09DLCB3aGVyZSB3ZSB3YW50IHRvIHJldXNlIHRoZSBvbGQgQlNTSUQqLworICBXRElfQ29uZmlnQWN0aW9uICAgICAgICAgd2RpQWN0aW9uOworCisgIC8qQmFzaWMgUmF0ZSBTZXQqLworICBXRElfUmF0ZVNldCAgICAgICAgICAgICAgd2RpUmF0ZVNldDsKKworICAvKkVuYWJsZS9EaXNhYmxlIEhUIGNhcGFiaWxpdGllcyBvZiB0aGUgQlNTKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgIHVjSFRDYXBhYmxlOworCisgIC8qIEVuYWJsZS9EaXNhYmxlIE9CU1MgcHJvdGVjdGlvbiAqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgdWNPYnNzUHJvdEVuYWJsZWQ7CisKKyAgLypSTUYgZW5hYmxlZC9kaXNhYmxlZCovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICB1Y1JNRkVuYWJsZWQ7CisKKyAgLypEZXRlcm1pbmVzIHRoZSBjdXJyZW50IEhUIE9wZXJhdGluZyBNb2RlIG9wZXJhdGluZyBtb2RlIG9mIHRoZQorICAgIDgwMi4xMW4gU1RBKi8KKyAgV0RJX0hUT3BlcmF0aW5nTW9kZSAgICAgIHdkaUhUT3Blck1vZDsKKworICAvKkR1YWwgQ1RTIFByb3RlY3Rpb246IDAgLSBVbnVzZWQsIDEgLSBVc2VkKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgIHVjRHVhbENUU1Byb3RlY3Rpb247CisKKyAgICAvKiBQcm9iZSBSZXNwb25zZSBNYXggcmV0cmllcyAqLworICB3cHRfdWludDggICB1Y01heFByb2JlUmVzcFJldHJ5TGltaXQ7CisKKyAgLyogVG8gRW5hYmxlIEhpZGRlbiBzc2lkICovCisgIHdwdF91aW50OCAgIGJIaWRkZW5TU0lERW47CisKKyAgLyogVG8gRW5hYmxlIERpc2FibGUgRlcgUHJveHkgUHJvYmUgUmVzcCAqLworICB3cHRfdWludDggICBiUHJveHlQcm9iZVJlc3BFbjsKKworIC8qIEJvb2xlYW4gdG8gaW5kaWNhdGUgaWYgRURDQSBwYXJhbXMgYXJlIHZhbGlkLiBVTUFDIG1pZ2h0IG5vdCBoYXZlIHZhbGlkIAorICAgIEVEQ0EgcGFyYW1zIG9yIG1pZ2h0IG5vdCBkZXNpcmUgdG8gYXBwbHkgRURDQSBwYXJhbXMgZHVyaW5nIGNvbmZpZyBCU1MuIAorICAgIDAgaW1wbGllcyBOb3QgVmFsaWQgOyBOb24tWmVybyBpbXBsaWVzIHZhbGlkKi8KKyAgd3B0X3VpbnQ4ICAgdWNFRENBUGFyYW1zVmFsaWQ7CisKKyAgIC8qRURDQSBQYXJhbWV0ZXJzIGZvciBCSyovICAKKyAgV0RJX0VkY2FQYXJhbVJlY29yZCAgICAgICB3ZGlCS0VEQ0FQYXJhbXM7IAorCisgICAvKkVEQ0EgUGFyYW1ldGVycyBmb3IgQkUqLyAgCisgIFdESV9FZGNhUGFyYW1SZWNvcmQgICAgICAgd2RpQkVFRENBUGFyYW1zOyAKKworICAgLypFRENBIFBhcmFtZXRlcnMgZm9yIFZJKi8gIAorICBXRElfRWRjYVBhcmFtUmVjb3JkICAgICAgIHdkaVZJRURDQVBhcmFtczsgCisKKyAgIC8qRURDQSBQYXJhbWV0ZXJzIGZvciBWTyovICAKKyAgV0RJX0VkY2FQYXJhbVJlY29yZCAgICAgICB3ZGlWT0VEQ0FQYXJhbXM7IAorCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgLyptYXggcG93ZXIgdG8gYmUgdXNlZCBhZnRlciBhcHBseWluZyB0aGUgcG93ZXIgY29uc3RyYWludCwgaWYgYW55ICovCisgIHdwdF9pbnQ4ICAgICAgICAgICAgICAgICAgY01heFR4UG93ZXI7CisjZW5kaWYKKworICAvKiBQZXJzb25hIGZvciB0aGUgQlNTIGNhbiBiZSBTVEEsQVAsR08sQ0xJRU5ULCBzYW1lIGFzIENvbm5lY3Rpb24gTW9kZSAqLyAgCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgdWNQZXJzb25hOworCisgIC8qIFNwZWN0cnVtIE1hbmdlbWVudCBJbmRpY2F0b3IgKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICBiU3BlY3RydW1NZ3RFbjsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgYkV4dFNldFN0YUtleVBhcmFtVmFsaWQ7CisgIFdESV9TZXRTVEFLZXlSZXFJbmZvVHlwZSAgd2RpRXh0U2V0S2V5UGFyYW07CisjZW5kaWYKKworfVdESV9Db25maWdCU1NSZXFJbmZvVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1Bvc3RBc3NvY1JlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkNvbmZpZyBTVEEgYXJndW1lbnRzLiovCisgIFdESV9Db25maWdTdGFSZXFJbmZvVHlwZSAgd2RpU1RBUGFyYW1zOyAKKworICAgLypDb25maWcgQlNTIEFyZ3VtZW50cyovCisgIFdESV9Db25maWdCU1NSZXFJbmZvVHlwZSAgd2RpQlNTUGFyYW1zOworCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9Qb3N0QXNzb2NSZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfQ29uZmlnQlNTUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qSW5mbyBmb3IgdGhlIEpvaW4gcmVxdWVzdCB0aGF0IHdpbGwgYmUgc2VudCBkb3duIHRvIHRoZSBkZXZpY2UqLworICBXRElfQ29uZmlnQlNTUmVxSW5mb1R5cGUgICB3ZGlSZXFJbmZvOyAKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9Db25maWdCU1NSZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qS2V5IEluZm8qLworICBXRElfU2V0U1RBS2V5UmVxSW5mb1R5cGUgIHdkaUtleUluZm87CisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1JlbW92ZVNUQUtleVJlcUluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypTVEEgSW5kZXgqLworICB3cHRfdWludDggICAgICAgIHVjU1RBSWR4OyAKKworICAvKkVuY3J5cHRpb24gVHlwZSB1c2VkIHdpdGggcGVlciovCisgIFdESV9FbmNyeXB0VHlwZSAgd2RpRW5jVHlwZTsKKworICAvKktleSBJZCovCisgIHdwdF91aW50OCAgICAgICAgdWNLZXlJZDsKKworICAvKldoZXRoZXIgdG8gaW52YWxpZGF0ZSB0aGUgQnJvYWRjYXN0IGtleSBvciBVbmljYXN0IGtleS4gSW4gY2FzZSBvZiBXRVAsCisgIHRoZSBzYW1lIGtleSBpcyB1c2VkIGZvciBib3RoIGJyb2FkY2FzdCBhbmQgdW5pY2FzdC4qLworICB3cHRfdWludDggICAgICAgIHVjVW5pY2FzdDsKK31XRElfUmVtb3ZlU1RBS2V5UmVxSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9SZW1vdmVTVEFLZXlSZXFQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypLZXkgSW5mbyAqLworICBXRElfUmVtb3ZlU1RBS2V5UmVxSW5mb1R5cGUgIHdkaUtleUluZm87IAorCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7Cit9V0RJX1JlbW92ZVNUQUtleVJlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU9TIFBhcmFtZXRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9UU0luZm9UZmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICB3cHRfdWludDE2ICAgICAgIGFja1BvbGljeToyOworICAgIHdwdF91aW50MTYgICAgICAgdXNlclByaW86MzsKKyAgICB3cHRfdWludDE2ICAgICAgIHBzYjoxOworICAgIHdwdF91aW50MTYgICAgICAgYWdncmVnYXRpb24gOiAxOworICAgIHdwdF91aW50MTYgICAgICAgYWNjZXNzUG9saWN5IDogMjsKKyAgICB3cHRfdWludDE2ICAgICAgIGRpcmVjdGlvbiA6IDI7CisgICAgd3B0X3VpbnQxNiAgICAgICB0c2lkIDogNDsKKyAgICB3cHRfdWludDE2ICAgICAgIHRyYWZmaWNUeXBlIDogMTsKK30gV0RJX1RTSW5mb1RmYzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1RTSW5mb1NjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreworICAgIHdwdF91aW50OCAgICAgICAgcnN2ZCA6IDc7CisgICAgd3B0X3VpbnQ4ICAgICAgICBzY2hlZHVsZSA6IDE7Cit9IFdESV9UU0luZm9TY2g7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9UU0luZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgICAgV0RJX1RTSW5mb1RmYyAgd2RpVHJhZmZpYzsKKyAgICBXRElfVFNJbmZvU2NoICB3ZGlTY2hlZHVsZTsKK30gV0RJX1RTSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Uc3BlY0lFVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreworICAgIHdwdF91aW50OCAgICAgICAgICAgICB1Y1R5cGU7CisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgIHVjTGVuZ3RoOworICAgIFdESV9UU0luZm9UeXBlICAgICAgICB3ZGlUU2luZm87CisgICAgd3B0X3VpbnQxNiAgICAgICAgICAgIHVzTm9tTXNkdVN6OworICAgIHdwdF91aW50MTYgICAgICAgICAgICB1c01heE1zZHVTejsKKyAgICB3cHRfdWludDMyICAgICAgICAgICAgdU1pblN2Y0ludGVydmFsOworICAgIHdwdF91aW50MzIgICAgICAgICAgICB1TWF4U3ZjSW50ZXJ2YWw7CisgICAgd3B0X3VpbnQzMiAgICAgICAgICAgIHVJbmFjdEludGVydmFsOworICAgIHdwdF91aW50MzIgICAgICAgICAgICB1U3VzcGVuZEludGVydmFsOworICAgIHdwdF91aW50MzIgICAgICAgICAgICB1U3ZjU3RhcnRUaW1lOworICAgIHdwdF91aW50MzIgICAgICAgICAgICB1TWluRGF0YVJhdGU7CisgICAgd3B0X3VpbnQzMiAgICAgICAgICAgIHVNZWFuRGF0YVJhdGU7CisgICAgd3B0X3VpbnQzMiAgICAgICAgICAgIHVQZWFrRGF0YVJhdGU7CisgICAgd3B0X3VpbnQzMiAgICAgICAgICAgIHVNYXhCdXJzdFN6OworICAgIHdwdF91aW50MzIgICAgICAgICAgICB1RGVsYXlCb3VuZDsKKyAgICB3cHRfdWludDMyICAgICAgICAgICAgdU1pblBoeVJhdGU7CisgICAgd3B0X3VpbnQxNiAgICAgICAgICAgIHVzU3VycGx1c0J3OworICAgIHdwdF91aW50MTYgICAgICAgICAgICB1c01lZGl1bVRpbWU7Cit9V0RJX1RzcGVjSUVUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfQWRkVFNSZXFJbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qU1RBIEluZGV4Ki8KKyAgd3B0X3VpbnQ4ICAgICAgICAgdWNTVEFJZHg7IAorCisgIC8qSWRlbnRpZmllciBmb3IgVFNwZWMqLworICB3cHRfdWludDE2ICAgICAgICB1Y1RzcGVjSWR4OworCisgIC8qVHNwZWMgSUUgbmVnb3RpYXRlZCBPVEEqLworICBXRElfVHNwZWNJRVR5cGUgICB3ZGlUc3BlY0lFOworCisgIC8qVUFQU0QgZGVsaXZlcnkgYW5kIHRyaWdnZXIgZW5hYmxlZCBmbGFncyAqLworICB3cHRfdWludDggICAgICAgICB1Y1VhcHNkRmxhZ3M7CisKKyAgLypTSSBmb3IgZWFjaCBBQyovCisgIHdwdF91aW50OCAgICAgICAgIHVjU2VydmljZUludGVydmFsW1dESV9NQVhfTk9fQUNdOworCisgIC8qU3VzcGVuZCBJbnRlcnZhbCBmb3IgZWFjaCBBQyovCisgIHdwdF91aW50OCAgICAgICAgIHVjU3VzcGVuZEludGVydmFsW1dESV9NQVhfTk9fQUNdOworCisgIC8qREkgZm9yIGVhY2ggQUMqLworICB3cHRfdWludDggICAgICAgICB1Y0RlbGF5ZWRJbnRlcnZhbFtXRElfTUFYX05PX0FDXTsKKworfVdESV9BZGRUU1JlcUluZm9UeXBlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9BZGRUU1JlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKlRTcGVjIEluZm8gKi8KKyAgV0RJX0FkZFRTUmVxSW5mb1R5cGUgIHdkaVRzSW5mbzsgCisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfQWRkVFNSZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfRGVsVFNSZXFJbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qU1RBIEluZGV4Ki8KKyAgd3B0X3VpbnQ4ICAgICAgICAgdWNTVEFJZHg7IAorCisgIC8qSWRlbnRpZmllciBmb3IgVFNwZWMqLworICB3cHRfdWludDE2ICAgICAgICB1Y1RzcGVjSWR4OworCisgIC8qQlNTSUQgb2YgdGhlIEJTUyovCisgIHdwdF9tYWNBZGRyICAgICAgbWFjQlNTSUQ7Cit9V0RJX0RlbFRTUmVxSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9EZWxUU1JlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkRlbCBUU3BlYyBJbmZvKi8KKyAgV0RJX0RlbFRTUmVxSW5mb1R5cGUgIHdkaURlbFRTSW5mbzsKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9EZWxUU1JlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9VcGRhdGVFRENBSW5mb1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgLypCU1MgSW5kZXggb2YgdGhlIEJTUyovCisgICB3cHRfdWludDggICAgICB1Y0Jzc0lkeDsKKworICAvKiBCb29sZWFuIHRvIGluZGljYXRlIGlmIEVEQ0EgcGFyYW1zIGFyZSB2YWxpZC4gVU1BQyBtaWdodCBub3QgaGF2ZSB2YWxpZCAKKyAgICBFRENBIHBhcmFtcyBvciBtaWdodCBub3QgZGVzaXJlIHRvIGFwcGx5IEVEQ0EgcGFyYW1zIGR1cmluZyBjb25maWcgQlNTLiAKKyAgICAwIGltcGxpZXMgTm90IFZhbGlkIDsgTm9uLVplcm8gaW1wbGllcyB2YWxpZCovCisgIHdwdF91aW50OCAgIHVjRURDQVBhcmFtc1ZhbGlkOworCisgIC8qRURDQSBwYXJhbXMgZm9yIEJFKi8KKyAgV0RJX0VkY2FQYXJhbVJlY29yZCB3ZGlFZGNhQkVJbmZvOworCisgIC8qRURDQSBwYXJhbXMgZm9yIEJLKi8KKyAgV0RJX0VkY2FQYXJhbVJlY29yZCB3ZGlFZGNhQktJbmZvOworCisgIC8qRURDQSBwYXJhbXMgZm9yIFZJKi8KKyAgV0RJX0VkY2FQYXJhbVJlY29yZCB3ZGlFZGNhVklJbmZvOworCisgIC8qRURDQSBwYXJhbXMgZm9yIFZPKi8KKyAgV0RJX0VkY2FQYXJhbVJlY29yZCB3ZGlFZGNhVk9JbmZvOworCit9V0RJX1VwZGF0ZUVEQ0FJbmZvVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1VwZGF0ZUVEQ0FQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypFRENBIEluZm8gKi8KKyAgV0RJX1VwZGF0ZUVEQ0FJbmZvVHlwZSAgd2RpRURDQUluZm87CisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfVXBkYXRlRURDQVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9BZGRCQVNlc3Npb25SZXFpbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qSW5kaWNhdGVzIHRoZSBzdGF0aW9uIGZvciB3aGljaCBCQSBpcyBhZGRlZC4uKi8KKyAgd3B0X3VpbnQ4ICAgICAgICB1Y1NUQUlkeDsKKworICAvKlRoZSBwZWVyIG1hYyBhZGRyZXNzKi8KKyAgd3B0X21hY0FkZHIgICAgICBtYWNQZWVyQWRkcjsKKworICAvKlRJRCBmb3Igd2hpY2ggQkEgd2FzIG5lZ290aWF0ZWQqLworICB3cHRfdWludDggICAgICAgIHVjQmFUSUQ7CisKKyAgLypEZWxheWVkIG9yIGltZWRpYXRlICovCisgIHdwdF91aW50OCAgICAgICAgdWNCYVBvbGljeTsKKworICAvKlRoZSBudW1iZXIgb2YgYnVmZmVycyBmb3IgdGhpcyBUSUQgKGJhVElEKSovCisgIHdwdF91aW50MTYgICAgICAgdXNCYUJ1ZmZlclNpemU7CisgIAorICAvKkJBIHRpbWVvdXQgaW4gVFUncyovCisgIHdwdF91aW50MTYgICAgICAgdXNCYVRpbWVvdXQ7CisgIAorICAvKmIwLi5iMyAtIEZyYWdtZW50IE51bWJlciAtIEFsd2F5cyBzZXQgdG8gMAorICAgYjQuLmIxNSAtIFN0YXJ0aW5nIFNlcXVlbmNlIE51bWJlciBvZiBmaXJzdCBNU0RVIGZvciB3aGljaCB0aGlzIEJBIGlzIHNldHVwKi8KKyAgd3B0X3VpbnQxNiAgICAgICB1c0JhU1NOOworICAKKyAgLypPcmlnaW5hdG9yL1JlY2lwaWVudCovCisgIHdwdF91aW50OCAgICAgICAgdWNCYURpcmVjdGlvbjsKKyAgCit9V0RJX0FkZEJBU2Vzc2lvblJlcWluZm9UeXBlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9BZGRCQVNlc3Npb25SZXFQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypCQSBTZXNzaW9uIEluZm8gVHlwZSovCisgIFdESV9BZGRCQVNlc3Npb25SZXFpbmZvVHlwZSAgd2RpQkFTZXNzaW9uSW5mb1R5cGU7IAorCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfQWRkQkFTZXNzaW9uUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0FkZEJBU2Vzc2lvblJzcFBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKlN0YXR1cyBvZiB0aGUgcmVzcG9uc2UqLworICBXRElfU3RhdHVzICAgd2RpU3RhdHVzOyAKKyAgCisgIC8qIERpYWxvZyB0b2tlbiAqLworICB3cHRfdWludDggICAgdWNCYURpYWxvZ1Rva2VuOworICAKKyAgLyogVElEIGZvciB3aGljaCB0aGUgQkEgc2Vzc2lvbiBoYXMgYmVlbiBzZXR1cCAqLworICB3cHRfdWludDggICAgdWNCYVRJRDsKKyAgCisgIC8qIEJBIEJ1ZmZlciBTaXplIGFsbG9jYXRlZCBmb3IgdGhlIGN1cnJlbnQgQkEgc2Vzc2lvbiAqLworICB3cHRfdWludDggICAgdWNCYUJ1ZmZlclNpemU7CisKKyAgLyogQkEgc2Vzc2lvbiBJRCAqLworICB3cHRfdWludDE2ICAgdXNCYVNlc3Npb25JRDsKKyAgCisgIC8qIFJlb3JkZXJpbmcgV2luZG93IGJ1ZmZlciAqLworICB3cHRfdWludDggICAgdWNXaW5TaXplOworICAKKyAgLypTdGF0aW9uIEluZGV4IHRvIGlkIHRoZSBzdGEgKi8KKyAgd3B0X3VpbnQ4ICAgIHVjU1RBSWR4OworICAKKyAgLyogU3RhcnRpbmcgU2VxdWVuY2UgTnVtYmVyICovCisgIHdwdF91aW50MTYgICB1c0JhU1NOOworCit9V0RJX0FkZEJBU2Vzc2lvblJzcFBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9BZGRCQVJlcWluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypJbmRpY2F0ZXMgdGhlIHN0YXRpb24gZm9yIHdoaWNoIEJBIGlzIGFkZGVkLi4qLworICB3cHRfdWludDggICAgICAgIHVjU1RBSWR4OworCisgIC8qIFNlc3Npb24gSWQgKi8KKyAgd3B0X3VpbnQ4ICAgICAgICB1Y0JhU2Vzc2lvbklEOworICAKKyAgLyogUmVvcmRlciBXaW5kb3cgU2l6ZSAqLworICB3cHRfdWludDggICAgICAgIHVjV2luU2l6ZTsKKyAgCisjaWZkZWYgRkVBVFVSRV9PTl9DSElQX1JFT1JERVJJTkcKKyAgd3B0X2Jvb2xlYW4gICAgICBiSXNSZW9yZGVyaW5nRG9uZU9uQ2hpcDsKKyNlbmRpZgorCit9V0RJX0FkZEJBUmVxaW5mb1R5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0FkZEJBUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qQkEgSW5mbyBUeXBlKi8KKyAgV0RJX0FkZEJBUmVxaW5mb1R5cGUgIHdkaUJBSW5mb1R5cGU7IAorCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfQWRkQkFSZXFQYXJhbXNUeXBlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9BZGRCQVJzcGluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypTdGF0dXMgb2YgdGhlIHJlc3BvbnNlKi8KKyAgV0RJX1N0YXR1cyAgIHdkaVN0YXR1czsgCisKKyAgLyogRGlhbG9nIHRva2VuICovCisgIHdwdF91aW50OCAgICB1Y0JhRGlhbG9nVG9rZW47CisKK31XRElfQWRkQkFSc3BpbmZvVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1RyaWdnZXJCQVJlcUNhbmRpZGF0ZVR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBTVEEgaW5kZXggKi8KKyAgd3B0X3VpbnQ4ICAgdWNTVEFJZHg7CisKKyAgLyogVElEIGJpdCBtYXAgZm9yIHRoZSBTVEEncyovCisgIHdwdF91aW50OCAgIHVjVGlkQml0bWFwOworCit9V0RJX1RyaWdnZXJCQVJlcUNhbmRpZGF0ZVR5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1RyaWdnZXJCQVJlcWluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypJbmRpY2F0ZXMgdGhlIHN0YXRpb24gZm9yIHdoaWNoIEJBIGlzIGFkZGVkLi4qLworICB3cHRfdWludDggICAgICAgIHVjU1RBSWR4OworCisgIC8qIFNlc3Npb24gSWQgKi8KKyAgd3B0X3VpbnQ4ICAgICAgICB1Y0JBU2Vzc2lvbklEOworCisgIC8qIFRyaWdnZXIgQkEgUmVxdWVzdCBjYW5kaWRhdGUgY291bnQgKi8KKyAgd3B0X3VpbnQxNiAgICAgICB1c0JBQ2FuZGlkYXRlQ250OworCisgIC8qIFdESV9UcmlnZ2VyQkFSZXFDYW5kaWRhdGVUeXBlICBmb2xsb3dlZCBieSB0aGlzKi8KKworfVdESV9UcmlnZ2VyQkFSZXFpbmZvVHlwZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfVHJpZ2dlckJBUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qQkEgVHJpZ2dlciBJbmZvIFR5cGUqLworICBXRElfVHJpZ2dlckJBUmVxaW5mb1R5cGUgIHdkaVRyaWdnZXJCQUluZm9UeXBlOyAKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgICAgICBwVXNlckRhdGE7Cit9V0RJX1RyaWdnZXJCQVJlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9BZGRCQUluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgd3B0X3VpbnQxNiBmQmFFbmFibGUgOiAxOworICB3cHRfdWludDE2IHN0YXJ0aW5nU2VxTnVtOiAxMjsKKyAgd3B0X3VpbnQxNiByZXNlcnZlZCA6IDM7Cit9V0RJX0FkZEJBSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9UcmlnZ2VyQkFSc3BDYW5kaWRhdGVUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVEFfTUFYX1RDIDgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogU1RBIGluZGV4ICovCisgIHdwdF9tYWNBZGRyICAgICAgIG1hY1NUQTsKKworICAvKiBCQSBJbmZvICovCisgIFdESV9BZGRCQUluZm9UeXBlIHdkaUJBSW5mb1tTVEFfTUFYX1RDXTsKK31XRElfVHJpZ2dlckJBUnNwQ2FuZGlkYXRlVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1RyaWdnZXJCQVJzcFBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKlN0YXR1cyBvZiB0aGUgcmVzcG9uc2UqLworICBXRElfU3RhdHVzICAgd2RpU3RhdHVzOyAKKworICAvKkJTU0lEIG9mIHRoZSBCU1MqLworICB3cHRfbWFjQWRkciAgbWFjQlNTSUQ7CisKKyAgLyogVHJpZ2dlciBCQSByZXNwb25zZSBjYW5kaWRhdGUgY291bnQgKi8KKyAgd3B0X3VpbnQxNiAgIHVzQmFDYW5kaWRhdGVDbnQ7CisKKyAgLyogV0RJX1RyaWdnZXJCQVJzcENhbmRpZGF0ZVR5cGUgIGZvbGxvd2VkIGJ5IHRoaXMqLworCit9V0RJX1RyaWdnZXJCQVJzcFBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9EZWxCQVJlcWluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypJbmRpY2F0ZXMgdGhlIHN0YXRpb24gZm9yIHdoaWNoIEJBIGlzIGFkZGVkLi4qLworICB3cHRfdWludDggICAgICAgIHVjU1RBSWR4OworCisgIC8qVElEIGZvciB3aGljaCBCQSB3YXMgbmVnb3RpYXRlZCovCisgIHdwdF91aW50OCAgICAgICAgdWNCYVRJRDsKKworICAvKk9yaWdpbmF0b3IvUmVjaXBpZW50Ki8KKyAgd3B0X3VpbnQ4ICAgICAgICB1Y0JhRGlyZWN0aW9uOworICAKK31XRElfRGVsQkFSZXFpbmZvVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0RlbEJBUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qQkEgSW5mbyAqLworICBXRElfRGVsQkFSZXFpbmZvVHlwZSAgd2RpQkFJbmZvOyAKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9EZWxCQVJlcVBhcmFtc1R5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1N3aXRjaENIUnNwUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAvKlN0YXR1cyBvZiB0aGUgcmVzcG9uc2UqLworICBXRElfU3RhdHVzICAgIHdkaVN0YXR1czsKKworICAvKkluZGljYXRlcyB0aGUgY2hhbm5lbCB0aGF0IFdMQU4gaXMgb24qLworICB3cHRfdWludDggICAgIHVjQ2hhbm5lbDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgLypIQUwgZmlsbHMgaW4gdGhlIHR4IHBvd2VyIHVzZWQgZm9yIG1nbXQgZnJhbWVzIGluIHRoaXMgZmllbGQuKi8KKyAgd3B0X2ludDggICAgIHVjVHhNZ210UG93ZXI7CisjZW5kaWYKKworfVdESV9Td2l0Y2hDSFJzcFBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Db25maWdTVEFSZXFQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypJbmZvIGZvciB0aGUgSm9pbiByZXF1ZXN0IHRoYXQgd2lsbCBiZSBzZW50IGRvd24gdG8gdGhlIGRldmljZSovCisgIFdESV9Db25maWdTdGFSZXFJbmZvVHlwZSAgIHdkaVJlcUluZm87IAorCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgICAgICAgICAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGE7Cit9V0RJX0NvbmZpZ1NUQVJlcVBhcmFtc1R5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1VwZGF0ZUJlYWNvblBhcmFtc0luZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgLypCU1MgSW5kZXggb2YgdGhlIEJTUyovCisgICB3cHRfdWludDggICAgICB1Y0Jzc0lkeDsKKworICAgIC8qc2hvcnRQcmVhbWJsZSBtb2RlLiBIQUwgc2hvdWxkIHVwZGF0ZSBhbGwgdGhlIFNUQSByYXRlcyB3aGVuIGl0CisgICAgcmVjZWl2ZXMgdGhpcyBtZXNzYWdlKi8KKyAgICB3cHRfdWludDggdWNmU2hvcnRQcmVhbWJsZTsKKyAgICAvKiBzaG9ydCBTbG90IHRpbWUuKi8KKyAgICB3cHRfdWludDggdWNmU2hvcnRTbG90VGltZTsKKyAgICAvKiBCZWFjb24gSW50ZXJ2YWwgKi8KKyAgICB3cHRfdWludDE2IHVzQmVhY29uSW50ZXJ2YWw7CisgICAgLypQcm90ZWN0aW9uIHJlbGF0ZWQgKi8KKyAgICB3cHRfdWludDggdWNsbGFDb2V4aXN0OworICAgIHdwdF91aW50OCB1Y2xsYkNvZXhpc3Q7CisgICAgd3B0X3VpbnQ4IHVjbGxnQ29leGlzdDsKKyAgICB3cHRfdWludDggdWNIdDIwTWh6Q29leGlzdDsKKyAgICB3cHRfdWludDggdWNsbG5Ob25HRkNvZXhpc3Q7CisgICAgd3B0X3VpbnQ4IHVjZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OworICAgIHdwdF91aW50OCB1Y2ZSSUZTTW9kZTsKKworICAgIHdwdF91aW50MTYgdXNDaGFuZ2VCaXRtYXA7Cit9V0RJX1VwZGF0ZUJlYWNvblBhcmFtc0luZm9UeXBlOworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKlVwZGF0ZSBCZWFjb24gUGFyYW1zICBJbmZvKi8KKyAgV0RJX1VwZGF0ZUJlYWNvblBhcmFtc0luZm9UeXBlICB3ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvOworCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7Cit9V0RJX1VwZGF0ZUJlYWNvblBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TZW5kQmVhY29uUGFyYW1zSW5mb1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IHsKKworICAgLypCU1NJRCBvZiB0aGUgQlNTKi8KKyAgIHdwdF9tYWNBZGRyICBtYWNCU1NJRDsKKworICAgLyogQmVhY29uIGRhdGEgKi8KKyAgIHdwdF91aW50OCAgICBiZWFjb25bV0RJX0JFQUNPTl9URU1QTEFURV9TSVpFXTsgICAgIAorCisgICAvKiBsZW5ndGggb2YgdGhlIHRlbXBsYXRlICovCisgICB3cHRfdWludDMyICAgYmVhY29uTGVuZ3RoOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICAgLyogVElNIElFIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlbXBsYXRlLiovCisgICB3cHRfdWludDMyICAgdGltSWVPZmZzZXQ7IAorI2VuZGlmCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAvKiBQMlAgSUUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVtcGxhdGUgKi8KKyAgIHdwdF91aW50MTYgICB1c1AyUEllT2Zmc2V0OworI2VuZGlmCit9IFdESV9TZW5kQmVhY29uUGFyYW1zSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TZW5kQmVhY29uUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qU2VuZCBCZWFjb24gUGFyYW1zICBJbmZvKi8KKyAgV0RJX1NlbmRCZWFjb25QYXJhbXNJbmZvVHlwZSAgd2RpU2VuZEJlYWNvblBhcmFtc0luZm87CisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfU2VuZEJlYWNvblBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9MaW5rU3RhdGVUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIAoreworICAgIFdESV9MSU5LX0lETEVfU1RBVEUgICAgICAgICAgICAgID0gMCwKKyAgICBXRElfTElOS19QUkVBU1NPQ19TVEFURSAgICAgICAgICA9IDEsCisgICAgV0RJX0xJTktfUE9TVEFTU09DX1NUQVRFICAgICAgICAgPSAyLAorICAgIFdESV9MSU5LX0FQX1NUQVRFICAgICAgICAgICAgICAgID0gMywKKyAgICBXRElfTElOS19JQlNTX1NUQVRFICAgICAgICAgICAgICA9IDQsCisKKyAgICAvLyBCVC1BTVAgQ2FzZQorICAgIFdESV9MSU5LX0JUQU1QX1BSRUFTU09DX1NUQVRFICAgID0gNSwKKyAgICBXRElfTElOS19CVEFNUF9QT1NUQVNTT0NfU1RBVEUgICA9IDYsCisgICAgV0RJX0xJTktfQlRBTVBfQVBfU1RBVEUgICAgICAgICAgPSA3LAorICAgIFdESV9MSU5LX0JUQU1QX1NUQV9TVEFURSAgICAgICAgID0gOCwKKyAgICAKKyAgICAvLyBSZXNlcnZlZCBmb3IgSEFMIGludGVybmFsIHVzZQorICAgIFdESV9MSU5LX0xFQVJOX1NUQVRFICAgICAgICAgICAgID0gOSwKKyAgICBXRElfTElOS19TQ0FOX1NUQVRFICAgICAgICAgICAgICA9IDEwLAorICAgIFdESV9MSU5LX0ZJTklTSF9TQ0FOX1NUQVRFICAgICAgID0gMTEsCisgICAgV0RJX0xJTktfSU5JVF9DQUxfU1RBVEUgICAgICAgICAgPSAxMiwKKyAgICBXRElfTElOS19GSU5JU0hfQ0FMX1NUQVRFICAgICAgICA9IDEzLAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgICBXRElfTElOS19MSVNURU5fU1RBVEUgICAgICAgICAgICA9IDE0LAorI2VuZGlmCisgICAgV0RJX0xJTktfTUFYICAgICAgICAgICAgICAgICAgICAgPSAweDdGRkZGRkZGCit9IFdESV9MaW5rU3RhdGVUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfU2V0TGlua1JlcUluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypCU1NJRCBvZiB0aGUgQlNTKi8KKyAgd3B0X21hY0FkZHIgICAgICAgICAgIG1hY0JTU0lEOworCisgIC8qTGluayBzdGF0ZSovCisgIFdESV9MaW5rU3RhdGVUeXBlICAgICB3ZGlMaW5rU3RhdGU7CisKKyAgLypCU1NJRCBvZiB0aGUgQlNTKi8KKyAgd3B0X21hY0FkZHIgICAgICAgICAgIG1hY1NlbGZTdGFNYWNBZGRyOworfVdESV9TZXRMaW5rUmVxSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TZXRMaW5rUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qTGluayBJbmZvKi8KKyAgV0RJX1NldExpbmtSZXFJbmZvVHlwZSAgd2RpTGlua0luZm87CisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfU2V0TGlua1JlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9HZXRTdGF0c1BhcmFtc0luZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypJbmRpY2F0ZXMgdGhlIHN0YXRpb24gZm9yIHdoaWNoIEdldCBTdGF0cyBhcmUgcmVxdWVzdGVkLi4qLworICB3cHRfdWludDggICAgICAgIHVjU1RBSWR4OworCisgIC8qIGNhdGVnb3JpZXMgb2Ygc3RhdHMgcmVxdWVzdGVkICovCisgIHdwdF91aW50MzIgICAgICAgdVN0YXRzTWFzazsKK31XRElfR2V0U3RhdHNQYXJhbXNJbmZvVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0dldFN0YXRzUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qR2V0IFN0YXRzIFBhcmFtcyAgSW5mbyovCisgIFdESV9HZXRTdGF0c1BhcmFtc0luZm9UeXBlICB3ZGlHZXRTdGF0c1BhcmFtc0luZm87CisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfR2V0U3RhdHNSZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfR2V0U3RhdHNSc3BQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyptZXNzYWdlIHR5cGUgaXMgc2FtZSBhcyB0aGUgcmVxdWVzdCB0eXBlKi8KKyAgd3B0X3VpbnQxNiAgICAgICB1c01zZ1R5cGU7CisKKyAgLyogbGVuZ3RoIG9mIHRoZSBlbnRpcmUgcmVxdWVzdCwgaW5jbHVkZXMgdGhlIHBTdGF0c0J1ZiBsZW5ndGggdG9vKi8KKyAgd3B0X3VpbnQxNiAgICAgICB1c01zZ0xlbjsKKyAgCisgIC8qUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24qLworICBXRElfU3RhdHVzICAgICAgIHdkaVN0YXR1czsKKworICAvKkluZGljYXRlcyB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggR2V0IFN0YXRzIGFyZSByZXF1ZXN0ZWQuLiovCisgIHdwdF91aW50OCAgICAgICAgdWNTVEFJZHg7CisKKyAgLyogY2F0ZWdvcmllcyBvZiBzdGF0cyByZXF1ZXN0ZWQgKi8KKyAgd3B0X3VpbnQzMiAgICAgICB1U3RhdHNNYXNrOworCisgIC8qIFRoZSBTdGF0cyBidWZmZXIgc3RhcnRzIGhlcmUgYW5kIGNhbiBiZSBhbiBhZ2dyZWdhdGUgb2YgbW9yZSB0aGFuIG9uZSBzdGF0aXN0aWNzIAorICAgKiBzdHJ1Y3R1cmUgZGVwZW5kaW5nIG9uIHN0YXRzTWFzay4qLworfVdESV9HZXRTdGF0c1JzcFBhcmFtc1R5cGU7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfVFNNU3RhdHNQYXJhbXNJbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qSW5kaWNhdGVzIHRoZSBzdGF0aW9uIGZvciB3aGljaCBHZXQgU3RhdHMgYXJlIHJlcXVlc3RlZC4uKi8KKyAgd3B0X3VpbnQ4ICAgICAgICB1Y1RpZDsKKworICB3cHRfbWFjQWRkciAgICAgIGJzc2lkOworfVdESV9UU01TdGF0c1BhcmFtc0luZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfVFNNU3RhdHNSZXFQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypHZXQgVFNNIFN0YXRzIFBhcmFtcyAgSW5mbyovCisgIFdESV9UU01TdGF0c1BhcmFtc0luZm9UeXBlICB3ZGlUc21TdGF0c1BhcmFtc0luZm87CisKKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKKworfVdESV9UU01TdGF0c1JlcVBhcmFtc1R5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1RTTVN0YXRzUnNwUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qSW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbiAqLworICBXRElfU3RhdHVzICAgICAgd2RpU3RhdHVzOworCisgIHdwdF91aW50MTYgICAgICBVcGxpbmtQa3RRdWV1ZURseTsKKyAgd3B0X3VpbnQxNiAgICAgIFVwbGlua1BrdFF1ZXVlRGx5SGlzdFs0XTsKKyAgd3B0X3VpbnQzMiAgICAgIFVwbGlua1BrdFR4RGx5OworICB3cHRfdWludDE2ICAgICAgVXBsaW5rUGt0TG9zczsKKyAgd3B0X3VpbnQxNiAgICAgIFVwbGlua1BrdENvdW50OworICB3cHRfdWludDggICAgICAgUm9hbWluZ0NvdW50OworICB3cHRfdWludDE2ICAgICAgUm9hbWluZ0RseTsKK31XRElfVFNNU3RhdHNSc3BQYXJhbXNUeXBlOworCisKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1VwZGF0ZUNmZ1JlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKlRoaXMgaXMgYSBUTFYgZm9ybWF0dGVkIGJ1ZmZlciBjb250YWluaW5nIGFsbCBjb25maWcgdmFsdWVzIHRoYXQgY2FuCisgICBiZSBzZXQgdGhyb3VnaCB0aGUgREFMIEludGVyZmFjZQorIAorICAgVGhlIFRMViBpcyBleHBlY3RlZCB0byBiZSBmb3JtYXR0ZWQgbGlrZSB0aGlzOgorIAorICAgMCAgICAgICAgICAgIDcgICAgICAgICAgMTUgICAgICAgICAgICAgIDMxIC4uLi4gCisgICB8IENPTkZJRyBJRCAgfCAgQ0ZHIExFTiB8ICAgUkVTRVJWRUQgICAgfCAgQ0ZHIEJPRFkgIHwKKyAKKyAgIE9yIGZyb20gYSBDIGNvbnN0cnVjdCBwb2ludCBvZiBWVSBpdCB3b3VsZCBsb29rIGxpa2UgdGhpczoKKyAKKyAgIHR5cGVkZWYgc3RydWN0IFdQVF9QQUNLX1BPU1QKKyAgIHsKKyAgICAgICAjaWZkZWYgIFdQVF9CSUdfRU5ESUFOCisgICAgICAgICB3cHRfdWludDMyICAgdWNDZmdJZDo4OworICAgICAgICAgd3B0X3VpbnQzMiAgIHVjQ2ZnTGVuOjg7CisgICAgICAgICB3cHRfdWludDMyICAgdXNSZXNlcnZlZDoxNjsKKyAgICAgICAjZWxzZQorICAgICAgICAgd3B0X3VpbnQzMiAgIHVzUmVzZXJ2ZWQ6MTY7CisgICAgICAgICB3cHRfdWludDMyICAgdWNDZmdMZW46ODsKKyAgICAgICAgIHdwdF91aW50MzIgICB1Y0NmZ0lkOjg7CisgICAgICAgI2VuZGlmCisgCisgICAgICAgd3B0X3VpbnQ4ICAgdWNDZmdCb2R5W3VjQ2ZnTGVuXTsKKyAgIH1XRElfQ29uZmlnVHlwZTsgCisgCisgICBNdWx0aXBsZSBzdWNoIHR1cGxldHMgYXJlIHRvIGJlIHBsYWNlZCBpbiB0aGUgY29uZmlnIGJ1ZmZlci4gT25lIGZvcgorICAgZWFjaCByZXF1aXJlZCBjb25maWd1cmF0aW9uIGl0ZW06CisgCisgICAgIHwgVExWIDEgfCAgVExWMiB8IC4uLi4KKyAKKyAgIFRoZSBidWZmZXIgaXMgZXhwZWN0ZWQgdG8gYmUgYSBmbGF0IGFyZWEgb2YgbWVtb3J5IHRoYXQgY2FuIGJlIG1hbmlwdWxhdGVkCisgICB3aXRoIHN0YW5kYXJkIG1lbW9yeSByb3V0aW5lcy4KKyAKKyAgIEZvciBtb3JlIGluZm8gcGxlYXNlIGNoZWNrIHBhcmFncmFwaCAyLjMuMSBDb25maWcgU3RydWN0dXJlIGZyb20gdGhlCisgICBIQUwgTExELgorIAorICAgRm9yIGEgbGlzdCBvZiBhY2NlcHRlZCBjb25maWd1cmF0aW9uIGxpc3QgYW5kIElEcyBwbGVhc2UgbG9vayB1cAorICAgd2xhbl9xY3RfZGFsX2NmZy5oCisgICovCisgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBDb25maWdCdWZmZXI7IAorCisgIC8qTGVuZ3RoIG9mIHRoZSBjb25maWcgYnVmZmVyIGFib3ZlKi8KKyAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgdUNvbmZpZ0J1ZmZlckxlbjsKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9VcGRhdGVDZmdSZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZUluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy9EZWZhdWx0IEJlYWNvbiB0ZW1wbGF0ZSBzaXplCisjZGVmaW5lIFdESV9QUk9CRV9SU1BfVEVNUExBVEVfU0laRSAweDE4MAorCisjZGVmaW5lIFdESV9QUk9CRV9SRVFfQklUTUFQX0lFX0xFTiA4CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qQlNTSUQgZm9yIHdoaWNoIHRoZSBQcm9iZSBUZW1wbGF0ZSBpcyB0byBiZSB1c2VkKi8KKyAgd3B0X21hY0FkZHIgICAgIG1hY0JTU0lEOworCisgIC8qUHJvYmUgcmVzcG9uc2UgdGVtcGxhdGUqLworICB3cHRfdWludDggICAgICAqcFByb2JlUmVzcFRlbXBsYXRlW1dESV9QUk9CRV9SU1BfVEVNUExBVEVfU0laRV07CisKKyAgLypUZW1wbGF0ZSBMZW4qLworICB3cHRfdWludDMyICAgICAgdVByb2JlUmVzcFRlbXBsYXRlTGVuOworCisgIC8qQml0bWFwIGZvciB0aGUgSUVzIHRoYXQgYXJlIHRvIGJlIGhhbmRsZWQgYXQgU0xNIGxldmVsKi8KKyAgd3B0X3VpbnQzMiAgICAgIHVhUHJveHlQcm9iZVJlcVZhbGlkSUVCbWFwW1dESV9QUk9CRV9SRVFfQklUTUFQX0lFX0xFTl07CisKK31XRElfVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZUluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfVXBkYXRlUHJvYmVSc3BQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypMaW5rIEluZm8qLworICBXRElfVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZUluZm9UeXBlICB3ZGlQcm9iZVJzcFRlbXBsYXRlSW5mbzsKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9VcGRhdGVQcm9iZVJzcFRlbXBsYXRlUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX052RG93bmxvYWRSZXFCbG9iSW5mbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogQmxvYiBzdGFydGluZyBhZGRyZXNzKi8KKyAgdm9pZCAqcEJsb2JBZGRyZXNzOworCisgIC8qIEJsb2Igc2l6ZSAqLworICB3cHRfdWludDMyIHVCbG9iU2l6ZTsKKyAgCit9V0RJX052RG93bmxvYWRSZXFCbG9iSW5mbzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBXRElfTnZEb3dubG9hZFJlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKk5WIEJsb2IgSW5mbyovCisgIFdESV9OdkRvd25sb2FkUmVxQmxvYkluZm8gIHdkaUJsb2JJbmZvOyAKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgICAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgICAgICBwVXNlckRhdGE7CisgIAorfVdESV9OdkRvd25sb2FkUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX052RG93bmxvYWRSc3BJbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qU3RhdHVzIG9mIHRoZSByZXNwb25zZSovCisgIFdESV9TdGF0dXMgICB3ZGlTdGF0dXM7IAorCit9V0RJX052RG93bmxvYWRSc3BJbmZvVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1NldE1heFR4UG93ZXJJbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypCU1NJRCBpcyBuZWVkZWQgdG8gaWRlbnRpZnkgd2hpY2ggc2Vzc2lvbiBpc3N1ZWQgdGhpcyByZXF1ZXN0LiBBcyB0aGUgcmVxdWVzdCBoYXMgCisgICAgcG93ZXIgY29uc3RyYWludHMsIHRoaXMgc2hvdWxkIGJlIGFwcGxpZWQgb25seSB0byB0aGF0IHNlc3Npb24qLworICB3cHRfbWFjQWRkciBtYWNCU1NJZDsKKworCisgIHdwdF9tYWNBZGRyIG1hY1NlbGZTdGFNYWNBZGRyOworCisgIC8qIEluIHJlcXVlc3QgIHBvd2VyID09IE1heFR4cG93ZXIgdG8gYmUgdXNlZC4qLworICB3cHRfaW50OCAgdWNQb3dlcjsKKworfVdESV9TZXRNYXhUeFBvd2VySW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TZXRNYXhUeFBvd2VyUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qTGluayBJbmZvKi8KKyAgV0RJX1NldE1heFR4UG93ZXJJbmZvVHlwZSAgd2RpTWF4VHhQb3dlckluZm87CisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfU2V0TWF4VHhQb3dlclBhcmFtc1R5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1NldE1heFR4UG93ZXJSc3BNc2cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIEluIHJlc3BvbnNlLCBwb3dlcj09dHggcG93ZXIgdXNlZCBmb3IgbWFuYWdlbWVudCBmcmFtZXMqLworICB3cHRfaW50OCAgdWNQb3dlcjsKKyAgCisgIC8qUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24qLworICBXRElfU3RhdHVzIHdkaVN0YXR1czsKKyAKK31XRElfU2V0TWF4VHhQb3dlclJzcE1zZzsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKK3R5cGVkZWYgc3RydWN0Cit7CisgIHdwdF91aW50OCAgIHVjT3BwX3BzOworICB3cHRfdWludDMyICB1Q3RXaW5kb3c7CisgIHdwdF91aW50OCAgIHVjQ291bnQ7IAorICB3cHRfdWludDMyICB1RHVyYXRpb247CisgIHdwdF91aW50MzIgIHVJbnRlcnZhbDsKKyAgd3B0X3VpbnQzMiAgdVNpbmdsZV9ub2FfZHVyYXRpb247CisgIHdwdF91aW50OCAgIHVjUHNTZWxlY3Rpb247Cit9V0RJX1NldFAyUEdPTk9BUmVxSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TZXRQMlBHT05PQVJlcVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKlAyUCBHTyBOT0EgUmVxKi8KKyAgV0RJX1NldFAyUEdPTk9BUmVxSW5mb1R5cGUgIHdkaVAyUEdPTk9BSW5mbzsKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9TZXRQMlBHT05PQVJlcVBhcmFtc1R5cGU7CisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfU2V0QWRkU1RBU2VsZlBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKlNlbGYgU3RhdGlvbiBNQUMgYWRkcmVzcyovCisgIHdwdF9tYWNBZGRyIHNlbGZNYWNBZGRyOworCisgIC8qU3RhdHVzIG9mIHRoZSBvcGVyYXRpb24qLworICB3cHRfdWludDMyICB1U3RhdHVzOworfVdESV9BZGRTVEFTZWxmSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TZXRBZGRTVEFTZWxmUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIEFkZCBTdGEgU2VsZiBSZXEgKi8KKyAgV0RJX0FkZFNUQVNlbGZJbmZvVHlwZSAgd2RpQWRkU1RBU2VsZkluZm87CisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfQWRkU1RBU2VsZlJlcVBhcmFtc1R5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0FkZFNUQVNlbGZSc3BQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAvKlN0YXR1cyBvZiB0aGUgcmVzcG9uc2UqLworICBXRElfU3RhdHVzICAgd2RpU3RhdHVzOyAKKworICAvKlNUQSBJZHggYWxsb2NhdGVkIGJ5IEhBTCovCisgIHdwdF91aW50OCAgICB1Y1NUQVNlbGZJZHg7CisKKyAgLyogRFBVIEluZGV4IChJR1RLLCBQVEssIEdUSyBhbGwgc2FtZSkgKi8KKyAgd3B0X3VpbnQ4ICAgIGRwdUlkeDsKKworICAvKiBEUFUgU2lnbmF0dXJlICovCisgIHdwdF91aW50OCAgICBkcHVTaWduYXR1cmU7CisKKyAgLypTZWxmIFNUQSBNYWMqLworICB3cHRfbWFjQWRkciAgbWFjU2VsZlN0YTsKKworfVdESV9BZGRTVEFTZWxmUnNwUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0RlbFNUQVNlbGZSZXFQYXJhbXNUeXBlCisgIERlbCBTdGEgU2VsZiBpbmZvIHBhc3NlZCB0byBXREkgZm9ybSBXREEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgd3B0X21hY0FkZHIgICAgICAgc2VsZk1hY0FkZHI7CisKK31XRElfRGVsU1RBU2VsZkluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfRGVsU1RBU2VsZlJlcVBhcmFtc1R5cGUKKyAgRGVsIFN0YSBTZWxmIGluZm8gcGFzc2VkIHRvIFdESSBmb3JtIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qRGVsIFN0YSBTZWxmIEluZm8gVHlwZSAqLworICAgV0RJX0RlbFNUQVNlbGZJbmZvVHlwZSAgICAgd2RpRGVsU3RhU2VsZkluZm87IAorICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLyAKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9V0RJX0RlbFNUQVNlbGZSZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfRGVsU1RBU2VsZlJzcFBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworIC8qU3RhdHVzIG9mIHRoZSByZXNwb25zZSovCisgIFdESV9TdGF0dXMgICB3ZGlTdGF0dXM7IAorCisgIC8qU1RBIEluZGV4IHJldHVybmVkIGR1cmluZyBEQUxfUG9zdEFzc29jUmVxIG9yIERBTF9Db25maWdTdGFSZXEqLworLy8gIHdwdF91aW50OCAgIHVjU1RBSWR4OworfVdESV9EZWxTVEFTZWxmUnNwUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1VhcHNkSW5mb1R5cGUKKyAgVUFQU0QgcGFyYW1ldGVycyBwYXNzZWQgcGVyIEFDIHRvIFdEQSBmcm9tIFVNQUMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAgCit7CisgICB3cHRfdWludDggIHVjU1RBSWR4OyAgICAgICAgLy8gU1RBIGluZGV4CisgICB3cHRfdWludDggIHVjQWM7ICAgICAgICAgICAgLy8gQWNjZXNzIENhdGVnb3J5CisgICB3cHRfdWludDggIHVjVXA7ICAgICAgICAgICAgLy8gVXNlciBQcmlvcml0eQorICAgd3B0X3VpbnQzMiB1U3J2SW50ZXJ2YWw7ICAgLy8gU2VydmljZSBJbnRlcnZhbAorICAgd3B0X3VpbnQzMiB1U3VzSW50ZXJ2YWw7ICAgLy8gU3VzcGVuZCBJbnRlcnZhbAorICAgd3B0X3VpbnQzMiB1RGVsYXlJbnRlcnZhbDsgLy8gRGVsYXkgSW50ZXJ2YWwKK30gV0RJX1VhcHNkSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TZXRVYXBzZEFjUGFyYW1zUmVxUGFyYW1zVHlwZQorICBVQVBTRCBwYXJhbWV0ZXJzIHBhc3NlZCBwZXIgQUMgdG8gV0RJIGZyb20gV0RBCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7IAorICAgLypFbnRlciBCTVBTIEluZm8gVHlwZSwgc2FtZSBhcyB0RW50ZXJCbXBzUGFyYW1zICovIAorICAgV0RJX1VhcHNkSW5mb1R5cGUgd2RpVWFwc2RJbmZvOyAKKyAgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50IHJlcQorICAgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcgdGhlIG1lc3NhZ2UKKyAgIG92ZXIgdGhlIEJVUyAqLyAKKyAgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKyAgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8gCisgICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7IAorfVdESV9TZXRVYXBzZEFjUGFyYW1zUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0VudGVyQm1wc1JlcWluZm9UeXBlCisgIEVudGVyIEJNUFMgcGFyYW1ldGVycyBwYXNzZWQgdG8gV0RBIGZyb20gVU1BQworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAvL1RCVFQgdmFsdWUgZGVyaXZlZCBmcm9tIHRoZSBsYXN0IGJlYWNvbgorICAgd3B0X3VpbnQ4ICAgICAgICAgdWNCc3NJZHg7CisgICB3cHRfdWludDY0ICAgICAgICB1VGJ0dDsKKyAgIHdwdF91aW50OCAgICAgICAgIHVjRHRpbUNvdW50OworICAgLy9EVElNIHBlcmlvZCBnaXZlbiB0byBIQUwgZHVyaW5nIGFzc29jaWF0aW9uIG1heSBub3QgYmUgdmFsaWQsCisgICAvL2lmIGFzc29jaWF0aW9uIGlzIGJhc2VkIG9uIFByb2JlUnNwIGluc3RlYWQgb2YgYmVhY29uLgorICAgd3B0X3VpbnQ4ICAgICAgICAgdWNEdGltUGVyaW9kOworICAgLyogRFhFIHBoeXNpY2FsIGFkZHIgdG8gYmUgcGFzc2VkIGRvd24gdG8gUklWQS4gUklWQSBIQUwgd2lsbCB1c2UgaXQgdG8gcHJvZ3JhbQorICAgRFhFIHdoZW4gRFhFIHdha2VzIHVwIGZyb20gcG93ZXIgc2F2ZSovCisgICB1bnNpZ25lZCBpbnQgICAgICBkeGVQaHlBZGRyOworCisgICAvLyBGb3IgQ0NYIGFuZCAxMVIgUm9hbWluZworICAgd3B0X3VpbnQzMiByc3NpRmlsdGVyUGVyaW9kOworICAgd3B0X3VpbnQzMiBudW1CZWFjb25QZXJSc3NpQXZlcmFnZTsKKyAgIHdwdF91aW50OCAgYlJzc2lGaWx0ZXJFbmFibGU7Cit9V0RJX0VudGVyQm1wc1JlcWluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfRW50ZXJCbXBzUmVxUGFyYW1zVHlwZQorICBFbnRlciBCTVBTIHBhcmFtZXRlcnMgcGFzc2VkIHRvIFdESSBmcm9tIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qRW50ZXIgQk1QUyBJbmZvIFR5cGUsIHNhbWUgYXMgdEVudGVyQm1wc1BhcmFtcyAqLyAKKyAgIFdESV9FbnRlckJtcHNSZXFpbmZvVHlwZSB3ZGlFbnRlckJtcHNJbmZvOyAKKyAgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50IHJlcQorICAgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcgdGhlIG1lc3NhZ2UKKyAgIG92ZXIgdGhlIEJVUyAqLyAKKyAgIFdESV9SZXFTdGF0dXNDYiAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisgICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovIAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9V0RJX0VudGVyQm1wc1JlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9FeGl0Qm1wc1JlcWluZm9UeXBlCisgIEV4aXQgQk1QUyBwYXJhbWV0ZXJzIHBhc3NlZCB0byBXREEgZnJvbSBVTUFDCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHdwdF91aW50OCAgICAgdWNTZW5kRGF0YU51bGw7Cit9V0RJX0V4aXRCbXBzUmVxaW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9FeGl0Qm1wc1JlcVBhcmFtc1R5cGUKKyAgRXhpdCBCTVBTIHBhcmFtZXRlcnMgcGFzc2VkIHRvIFdESSBmcm9tIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qRXhpdCBCTVBTIEluZm8gVHlwZSwgc2FtZSBhcyB0RXhpdEJtcHNQYXJhbXMgKi8gCisgICBXRElfRXhpdEJtcHNSZXFpbmZvVHlwZSB3ZGlFeGl0Qm1wc0luZm87IAorICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLyAKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9V0RJX0V4aXRCbXBzUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0VudGVyVWFwc2RSZXFpbmZvVHlwZQorICBFbnRlciBVQVBTRCBwYXJhbWV0ZXJzIHBhc3NlZCB0byBXREEgZnJvbSBVTUFDCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHdwdF91aW50OCAgICAgdWNCa0RlbGl2ZXJ5RW5hYmxlZDoxOworICAgd3B0X3VpbnQ4ICAgICB1Y0JlRGVsaXZlcnlFbmFibGVkOjE7CisgICB3cHRfdWludDggICAgIHVjVmlEZWxpdmVyeUVuYWJsZWQ6MTsKKyAgIHdwdF91aW50OCAgICAgdWNWb0RlbGl2ZXJ5RW5hYmxlZDoxOworICAgd3B0X3VpbnQ4ICAgICB1Y0JrVHJpZ2dlckVuYWJsZWQ6MTsKKyAgIHdwdF91aW50OCAgICAgdWNCZVRyaWdnZXJFbmFibGVkOjE7CisgICB3cHRfdWludDggICAgIHVjVmlUcmlnZ2VyRW5hYmxlZDoxOworICAgd3B0X3VpbnQ4ICAgICB1Y1ZvVHJpZ2dlckVuYWJsZWQ6MTsKK31XRElfRW50ZXJVYXBzZFJlcWluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfRW50ZXJVYXBzZFJlcWluZm9UeXBlCisgIEVudGVyIFVBUFNEIHBhcmFtZXRlcnMgcGFzc2VkIHRvIFdESSBmcm9tIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qRW50ZXIgVUFQU0QgSW5mbyBUeXBlLCBzYW1lIGFzIHRVYXBzZFBhcmFtcyAqLyAKKyAgIFdESV9FbnRlclVhcHNkUmVxaW5mb1R5cGUgd2RpRW50ZXJVYXBzZEluZm87IAorICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisgICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovIAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGE7IAorfVdESV9FbnRlclVhcHNkUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1VwZGF0ZVVhcHNkUmVxaW5mb1R5cGUKKyAgVXBkYXRlIFVBUFNEIHBhcmFtZXRlcnMgcGFzc2VkIHRvIFdEQSBmcm9tIFVNQUMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgd3B0X3VpbnQ4ICB1Y1NUQUlkeDsKKyAgIHdwdF91aW50OCAgdWNVYXBzZEFDTWFzazsgCisgICB3cHRfdWludDMyIHVNYXhTcExlbjsgICAgCit9V0RJX1VwZGF0ZVVhcHNkUmVxaW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9VcGRhdGVVYXBzZFJlcVBhcmFtc1R5cGUKKyAgVXBkYXRlIFVBUFNEIHBhcmFtZXRlcnMgcGFzc2VkIHRvIFdESSBmb3JtIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qVXBkYXRlIFVBUFNEIEluZm8gVHlwZSwgc2FtZSBhcyB0VXBkYXRlVWFwc2RQYXJhbXMgKi8gCisgICBXRElfVXBkYXRlVWFwc2RSZXFpbmZvVHlwZSB3ZGlVcGRhdGVVYXBzZEluZm87IAorICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLyAKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9V0RJX1VwZGF0ZVVhcHNkUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0NvbmZpZ3VyZVJ4cEZpbHRlclJlcVBhcmFtc1R5cGUKKyAgUlhQIGZpbHRlciBwYXJhbWV0ZXJzIHBhc3NlZCB0byBXREkgZm9ybSBXREEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgLyogTW9kZSBvZiBNY2FzdCBhbmQgQmNhc3QgZmlsdGVycyBjb25maWd1cmVkICovCisgIHdwdF91aW50OCB1Y1NldE1jc3RCY3N0RmlsdGVyU2V0dGluZzsKKworICAvKiBNY2FzdCBCY2FzdCBGaWx0ZXJzIGVuYWJsZS9kaXNhYmxlKi8KKyAgd3B0X3VpbnQ4IHVjU2V0TWNzdEJjc3RGaWx0ZXI7Cit9V0RJX1J4cEZpbHRlclJlcVBhcmFtc1R5cGU7CisKK3R5cGVkZWYgc3RydWN0IAoreworICAvKiBSeHAgRmlsdGVyICovCisgIFdESV9SeHBGaWx0ZXJSZXFQYXJhbXNUeXBlIHdkaVJ4cEZpbHRlclBhcmFtOworICAKKyAgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50IHJlcQorICAgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcgdGhlIG1lc3NhZ2UKKyAgIG92ZXIgdGhlIEJVUyAqLyAKKyAgIFdESV9SZXFTdGF0dXNDYiAgICAgICAgICAgIHdkaVJlcVN0YXR1c0NCOyAKKyAgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8gCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGE7IAorfVdESV9Db25maWd1cmVSeHBGaWx0ZXJSZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfQmVhY29uRmlsdGVySW5mb1R5cGUKKyAgQmVhY29uIEZpbHRlcmluZyBkYXRhIHN0cnVjdHVyZXMgcGFzc2VkIHRvIFdEQSBmb3JtIFVNQUMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sgCisgICB3cHRfdWludDE2ICAgIHVzQ2FwYWJpbGl0eUluZm87CisgICB3cHRfdWludDE2ICAgIHVzQ2FwYWJpbGl0eU1hc2s7CisgICB3cHRfdWludDE2ICAgIHVzQmVhY29uSW50ZXJ2YWw7CisgICB3cHRfdWludDE2ICAgIHVzSWVOdW07Cit9V0RJX0JlYWNvbkZpbHRlckluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZQorICBCZWFjb24gRmlsdGVyaW5nIHBhcmFtZXRlcnMgcGFzc2VkIHRvIFdESSBmb3JtIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qQmVhY29uIEZpbHRlcmluZyBJbmZvIFR5cGUsIHNhbWUgYXMgdEJlYWNvbkZpbHRlck1zZyAqLyAKKyAgIFdESV9CZWFjb25GaWx0ZXJJbmZvVHlwZSB3ZGlCZWFjb25GaWx0ZXJJbmZvOyAKKyAgIC8qQmVhY29uIEZpbHRlcihzKSBmb2xsb3cgdGhlICJ1c0llTnVtIiBmaWVsZCwgaGVuY2UgdGhlIGFycmF5IHRvIGVhc2UgdGhlCisgICBjb3B5IG9mIHBhcmFtcyBmcm9tIFdEQSB0byBXREkgKi8gCisgICB3cHRfdWludDggYUZpbHRlcnNbV0RJX0JFQUNPTl9GSUxURVJfTEVOXTsKKyAgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50IHJlcQorICAgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcgdGhlIG1lc3NhZ2UKKyAgIG92ZXIgdGhlIEJVUyAqLyAKKyAgIFdESV9SZXFTdGF0dXNDYiAgICAgICAgICAgIHdkaVJlcVN0YXR1c0NCOyAKKyAgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8gCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGE7IAorfVdESV9CZWFjb25GaWx0ZXJSZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfUmVtQmVhY29uRmlsdGVySW5mb1R5cGUKKyAgQmVhY29uIEZpbHRlcmluZyBkYXRhIHN0cnVjdHVyZXMgKHRvIGJlIHJlb21vdmVkKSBwYXNzZWQgdG8gV0RBIGZvcm0gVU1BQworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIHdwdF91aW50OCAgdWNJZUNvdW50OworICAgd3B0X3VpbnQ4ICB1Y1JlbUllSWRbMV07Cit9V0RJX1JlbUJlYWNvbkZpbHRlckluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfUmVtQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZQorICBCZWFjb24gRmlsdGVyaW5nIHBhcmFtZXRlcnMgKHRvIGJlIHJlb21vdmVkKXBhc3NlZCB0byBXREkgZm9ybSBXREEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sgCisgICAvKkJlYWNvbiBGaWx0ZXJpbmcgSW5mbyBUeXBlLCBzYW1lIGFzIHRCZWFjb25GaWx0ZXJNc2cgKi8gCisgICBXRElfUmVtQmVhY29uRmlsdGVySW5mb1R5cGUgd2RpQmVhY29uRmlsdGVySW5mbzsgCisgICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudCByZXEKKyAgIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nIHRoZSBtZXNzYWdlCisgICBvdmVyIHRoZSBCVVMgKi8gCisgICBXRElfUmVxU3RhdHVzQ2IgICAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisgICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovIAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhOyAKK31XRElfUmVtQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1JTU0lUaHJlc2hvbGRzVHlwZQorICBSU1NJIHRocmVzaG9sZHMgZGF0YSBzdHJ1Y3R1cmVzICh0byBiZSByZW9tb3ZlZCkgcGFzc2VkIHRvIFdEQSBmb3JtIFVNQUMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHdwdF9pbnQ4ICAgIHVjUnNzaVRocmVzaG9sZDEgICAgIDogODsKKyAgICB3cHRfaW50OCAgICB1Y1Jzc2lUaHJlc2hvbGQyICAgICA6IDg7CisgICAgd3B0X2ludDggICAgdWNSc3NpVGhyZXNob2xkMyAgICAgOiA4OworICAgIHdwdF91aW50OCAgIGJSc3NpVGhyZXMxUG9zTm90aWZ5IDogMTsKKyAgICB3cHRfdWludDggICBiUnNzaVRocmVzMU5lZ05vdGlmeSA6IDE7CisgICAgd3B0X3VpbnQ4ICAgYlJzc2lUaHJlczJQb3NOb3RpZnkgOiAxOworICAgIHdwdF91aW50OCAgIGJSc3NpVGhyZXMyTmVnTm90aWZ5IDogMTsKKyAgICB3cHRfdWludDggICBiUnNzaVRocmVzM1Bvc05vdGlmeSA6IDE7CisgICAgd3B0X3VpbnQ4ICAgYlJzc2lUaHJlczNOZWdOb3RpZnkgOiAxOworICAgIHdwdF91aW50OCAgIGJSZXNlcnZlZDEwICAgICAgICAgIDogMjsKK30gV0RJX1JTU0lUaHJlc2hvbGRzVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1NldFJTU0lUaHJlc2hvbGRzUmVxUGFyYW1zVHlwZQorICBSU1NJIHRocmVzaG9sZHMgcGFyYW1ldGVycyAodG8gYmUgcmVvbW92ZWQpcGFzc2VkIHRvIFdESSBmb3JtIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qUlNTSSB0aHJlc2hvbGRzIEluZm8gVHlwZSwgc2FtZSBhcyBXRElfUlNTSVRocmVzaG9sZHMgKi8gCisgICBXRElfUlNTSVRocmVzaG9sZHNUeXBlICAgICB3ZGlSU1NJVGhyZXNob2xkc0luZm87IAorICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLyAKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9V0RJX1NldFJTU0lUaHJlc2hvbGRzUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0hvc3RPZmZsb2FkUmVxVHlwZQorICBob3N0IG9mZmxvYWQgaW5mbyBwYXNzZWQgdG8gV0RBIGZvcm0gVU1BQworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBXTEFOX05TX09GRkxPQUQKK3R5cGVkZWYgc3RydWN0Cit7CisgICB3cHRfdWludDggc3JjSVB2NkFkZHJbMTZdOworICAgd3B0X3VpbnQ4IHNlbGZJUHY2QWRkclsxNl07CisgICAvL09ubHkgc3VwcG9ydCAyIHBvc3NpYmxlIE5ldHdvcmsgQWR2ZXJ0aXNlbWVudCBJUHY2IGFkZHJlc3MKKyAgIHdwdF91aW50OCB0YXJnZXRJUHY2QWRkcjFbMTZdOworICAgd3B0X3VpbnQ4IHRhcmdldElQdjZBZGRyMlsxNl07CisgICB3cHRfdWludDggc2VsZk1hY0FkZHJbNl07CisgICB3cHRfdWludDggc3JjSVB2NkFkZHJWYWxpZCA6IDE7CisgICB3cHRfdWludDggdGFyZ2V0SVB2NkFkZHIxVmFsaWQgOiAxOworICAgd3B0X3VpbnQ4IHRhcmdldElQdjZBZGRyMlZhbGlkIDogMTsKK30gV0RJX05TT2ZmbG9hZFBhcmFtczsKKyNlbmRpZiAvL1dMQU5fTlNfT0ZGTE9BRAorCit0eXBlZGVmIHN0cnVjdAoreworICAgd3B0X3VpbnQ4IHVjT2ZmbG9hZFR5cGU7CisgICB3cHRfdWludDggdWNFbmFibGVPckRpc2FibGU7CisgICB1bmlvbgorICAgeworICAgICAgIHdwdF91aW50OCBhSG9zdElwdjRBZGRyIFs0XTsKKyAgICAgICB3cHRfdWludDggYUhvc3RJcHY2QWRkciBbMTZdOworICAgfSBwYXJhbXM7Cit9IFdESV9Ib3N0T2ZmbG9hZFJlcVR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Ib3N0T2ZmbG9hZFJlcVBhcmFtc1R5cGUKKyAgaG9zdCBvZmZsb2FkIGluZm8gcGFzc2VkIHRvIFdESSBmb3JtIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qSG9zdCBvZmZsb2FkIEluZm8gVHlwZSwgc2FtZSBhcyB0SGFsSG9zdE9mZmxvYWRSZXEgKi8gCisgICBXRElfSG9zdE9mZmxvYWRSZXFUeXBlICAgICB3ZGlIb3N0T2ZmbG9hZEluZm87IAorI2lmZGVmIFdMQU5fTlNfT0ZGTE9BRAorICAgV0RJX05TT2ZmbG9hZFBhcmFtcyAgICAgICAgd2RpTnNPZmZsb2FkUGFyYW1zOworI2VuZGlmIC8vV0xBTl9OU19PRkZMT0FECisgICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudCByZXEKKyAgIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nIHRoZSBtZXNzYWdlCisgICBvdmVyIHRoZSBCVVMgKi8gCisgICBXRElfUmVxU3RhdHVzQ2IgICAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisgICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovIAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhOyAKK31XRElfSG9zdE9mZmxvYWRSZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfS2VlcEFsaXZlUmVxVHlwZQorICBLZWVwIEFsaXZlIGluZm8gcGFzc2VkIHRvIFdEQSBmb3JtIFVNQUMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHdwdF91aW50OCAgdWNQYWNrZXRUeXBlOworICAgIHdwdF91aW50MzIgdWNUaW1lUGVyaW9kOworICAgIHdwdF91aW50OCAgYUhvc3RJcHY0QWRkcls0XTsKKyAgICB3cHRfdWludDggIGFEZXN0SXB2NEFkZHJbNF07CisgICAgd3B0X3VpbnQ4ICBhRGVzdE1hY0FkZHJbNl07Cit9IFdESV9LZWVwQWxpdmVSZXFUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfS2VlcEFsaXZlUmVxUGFyYW1zVHlwZQorICBLZWVwIEFsaXZlIHBhc3NlZCB0byBXREkgZm9ybSBXREEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sgCisgICAvKiBLZWVwIEFsaXZlIEluZm8gVHlwZSwgc2FtZSBhcyB0SGFsS2VlcEFsaXZlUmVxICovIAorICAgV0RJX0tlZXBBbGl2ZVJlcVR5cGUgICAgIHdkaUtlZXBBbGl2ZUluZm87IAorICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLyAKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9V0RJX0tlZXBBbGl2ZVJlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Xb3dsQWRkQmNQdHJuSW5mb1R5cGUKKyAgV293bCBhZGQgcHRybiBpbmZvIHBhc3NlZCB0byBXREEgZm9ybSBVTUFDCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHdwdF91aW50OCAgdWNQYXR0ZXJuSWQ7ICAgICAgICAgICAvLyBQYXR0ZXJuIElECisgICAvLyBQYXR0ZXJuIGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHRoZSA4MDIuMTEgcGFja2V0IHRvIHN0YXJ0IG9mIHRoZQorICAgLy8gd2FrZS11cCBwYXR0ZXJuCisgICB3cHRfdWludDggIHVjUGF0dGVybkJ5dGVPZmZzZXQ7ICAgCisgICB3cHRfdWludDggIHVjUGF0dGVyblNpemU7ICAgICAgICAgLy8gTm9uLVplcm8gUGF0dGVybiBzaXplCisgICB3cHRfdWludDggIHVjUGF0dGVybltXRElfV09XTF9CQ0FTVF9QQVRURVJOX01BWF9TSVpFXTsgLy8gUGF0dGVybgorICAgd3B0X3VpbnQ4ICB1Y1BhdHRlcm5NYXNrU2l6ZTsgICAgIC8vIE5vbi16ZXJvIHBhdHRlcm4gbWFzayBzaXplCisgICB3cHRfdWludDggIHVjUGF0dGVybk1hc2tbV0RJX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRV07IC8vIFBhdHRlcm4gbWFzaworICAgd3B0X3VpbnQ4ICB1Y1BhdHRlcm5FeHRbV0RJX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRV07IC8vIEV4dHJhIHBhdHRlcm4KKyAgIHdwdF91aW50OCAgdWNQYXR0ZXJuTWFza0V4dFtXRElfV09XTF9CQ0FTVF9QQVRURVJOX01BWF9TSVpFXTsgLy8gRXh0cmEgcGF0dGVybiBtYXNrCit9IFdESV9Xb3dsQWRkQmNQdHJuSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Xb3dsQWRkQmNQdHJuUmVxUGFyYW1zVHlwZQorICBXb3dsIGFkZCBwdHJuIGluZm8gcGFzc2VkIHRvIFdESSBmb3JtIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qV293bCBhZGQgcHRybiBJbmZvIFR5cGUsIHNhbWUgYXMgdHBTaXJXb3dsQWRkQmNhc3RQdHJuICovIAorICAgV0RJX1dvd2xBZGRCY1B0cm5JbmZvVHlwZSAgICAgd2RpV293bEFkZEJjUHRybkluZm87IAorICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLyAKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9V0RJX1dvd2xBZGRCY1B0cm5SZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfV293bERlbEJjUHRybkluZm9UeXBlCisgIFdvd2wgYWRkIHB0cm4gaW5mbyBwYXNzZWQgdG8gV0RBIGZvcm0gVU1BQworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAvKiBQYXR0ZXJuIElEIG9mIHRoZSB3YWtldXAgcGF0dGVybiB0byBiZSBkZWxldGVkICovCisgICB3cHRfdWludDggIHVjUGF0dGVybklkOworfSBXRElfV293bERlbEJjUHRybkluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfV293bERlbEJjUHRyblJlcVBhcmFtc1R5cGUKKyAgV293bCBhZGQgcHRybiBpbmZvIHBhc3NlZCB0byBXREkgZm9ybSBXREEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sgCisgICAvKldvd2wgZGVsZXRlIHB0cm4gSW5mbyBUeXBlLCBzYW1lIGFzIFdESV9Xb3dsRGVsQmNhc3RQdHJuICovIAorICAgV0RJX1dvd2xEZWxCY1B0cm5JbmZvVHlwZSAgICAgd2RpV293bERlbEJjUHRybkluZm87IAorICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLyAKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9V0RJX1dvd2xEZWxCY1B0cm5SZXFQYXJhbXNUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfV293bEVudGVySW5mb1R5cGUKKyAgV293bCBlbnRlciBpbmZvIHBhc3NlZCB0byBXREEgZm9ybSBVTUFDCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qIEVuYWJsZXMvZGlzYWJsZXMgbWFnaWMgcGFja2V0IGZpbHRlcmluZyAqLworICAgd3B0X3VpbnQ4ICAgdWNNYWdpY1BrdEVuYWJsZTsgCisKKyAgIC8qIE1hZ2ljIHBhdHRlcm4gKi8KKyAgIHdwdF9tYWNBZGRyIG1hZ2ljUHRybjsKKworICAgLyogRW5hYmxlcy9kaXNhYmxlcyBwYWNrZXQgcGF0dGVybiBmaWx0ZXJpbmcgaW4gZmlybXdhcmUuIAorICAgICAgRW5hYmxpbmcgdGhpcyBmbGFnIGVuYWJsZXMgYnJvYWRjYXN0IHBhdHRlcm4gbWF0Y2hpbmcgCisgICAgICBpbiBGaXJtd2FyZS4gSWYgdW5pY2FzdCBwYXR0ZXJuIG1hdGNoaW5nIGlzIGFsc28gZGVzaXJlZCwgIAorICAgICAgdWNVY2FzdFBhdHRlcm5GaWx0ZXJpbmdFbmFibGUgZmxhZyBtdXN0IGJlIHNldCB0b3QgdHJ1ZSAKKyAgICAgIGFzIHdlbGwgCisgICAqLworICAgd3B0X3VpbnQ4ICAgdWNQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlOworCisgICAvKiBFbmFibGVzL2Rpc2FibGVzIHVuaWNhc3QgcGFja2V0IHBhdHRlcm4gZmlsdGVyaW5nLiAKKyAgICAgIFRoaXMgZmxhZyBzcGVjaWZpZXMgd2hldGhlciB3ZSB3YW50IHRvIGRvIHBhdHRlcm4gbWF0Y2ggCisgICAgICBvbiB1bmljYXN0IHBhY2tldHMgYXMgd2VsbCBhbmQgbm90IGp1c3QgYnJvYWRjYXN0IHBhY2tldHMuIAorICAgICAgVGhpcyBmbGFnIGhhcyBubyBlZmZlY3QgaWYgdGhlIHVjUGF0dGVybkZpbHRlcmluZ0VuYWJsZSAKKyAgICAgIChtYWluIGNvbnRyb2xsaW5nIGZsYWcpIGlzIHNldCB0byBmYWxzZQorICAgKi8KKyAgIHdwdF91aW50OCAgIHVjVWNhc3RQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlOyAgICAgICAgICAgICAgICAgICAgIAorCisgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQgb25seSB3aGVuIG1hZ2ljUGt0RW5hYmxlPTEuIAorICAgICogSXQgcmVxdWVzdHMgaGFyZHdhcmUgdG8gd2FrZSB1cCB3aGVuIGl0IHJlY2VpdmVzIHRoZSAKKyAgICAqIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBGcmFtZS4KKyAgICAqLworICAgd3B0X3VpbnQ4ICAgdWNXb3dDaG5sU3dpdGNoUmN2OworCisgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQgb25seSB3aGVuIG1hZ2ljUGt0RW5hYmxlPTEuIAorICAgICogSXQgcmVxdWVzdHMgaGFyZHdhcmUgdG8gd2FrZSB1cCB3aGVuIGl0IHJlY2VpdmVzIHRoZSAKKyAgICAqIERlYXV0aGVudGljYXRpb24gRnJhbWUuIAorICAgICovCisgICB3cHRfdWludDggICB1Y1dvd0RlYXV0aFJjdjsKKworICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGlzIHZhbGlkIG9ubHkgd2hlbiBtYWdpY1BrdEVuYWJsZT0xLiAKKyAgICAqIEl0IHJlcXVlc3RzIGhhcmR3YXJlIHRvIHdha2UgdXAgd2hlbiBpdCByZWNlaXZlcyB0aGUgCisgICAgKiBEaXNhc3NvY2lhdGlvbiBGcmFtZS4gCisgICAgKi8KKyAgIHdwdF91aW50OCAgIHVjV293RGlzYXNzb2NSY3Y7CisKKyAgIC8qIFRoaXMgY29uZmlndXJhdGlvbiBpcyB2YWxpZCBvbmx5IHdoZW4gbWFnaWNQa3RFbmFibGU9MS4gCisgICAgKiBJdCByZXF1ZXN0cyBoYXJkd2FyZSB0byB3YWtlIHVwIHdoZW4gaXQgaGFzIG1pc3NlZAorICAgICogY29uc2VjdXRpdmUgYmVhY29ucy4gVGhpcyBpcyBhIGhhcmR3YXJlIHJlZ2lzdGVyCisgICAgKiBjb25maWd1cmF0aW9uIChOT1QgYSBmaXJtd2FyZSBjb25maWd1cmF0aW9uKS4gCisgICAgKi8KKyAgIHdwdF91aW50OCAgIHVjV293TWF4TWlzc2VkQmVhY29uczsKKworICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGlzIHZhbGlkIG9ubHkgd2hlbiBtYWdpY1BrdEVuYWJsZT0xLiAKKyAgICAqIFRoaXMgaXMgYSB0aW1lb3V0IHZhbHVlIGluIHVuaXRzIG9mIG1pY3Jvc2VjLiBJdCByZXF1ZXN0cworICAgICogaGFyZHdhcmUgdG8gdW5jb25kaXRpb25hbGx5IHdha2UgdXAgYWZ0ZXIgaXQgaGFzIHN0YXllZAorICAgICogaW4gV29XTEFOIG1vZGUgZm9yIHNvbWUgdGltZS4gU2V0IDAgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuICAgICAgCisgICAgKi8KKyAgIHdwdF91aW50OCAgIHVjV293TWF4U2xlZXBVc2VjOworCisjaWZkZWYgV0xBTl9XQUtFVVBfRVZFTlRTCisgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGRpcmVjdHMgdGhlIFdvVyBwYWNrZXQgZmlsdGVyaW5nIHRvIGxvb2sgZm9yIEVBUC1JRAorICAgICAqIHJlcXVlc3RzIGVtYmVkZGVkIGluIEVBUE9MIGZyYW1lcyBhbmQgdXNlIHRoaXMgYXMgYSB3YWtlIHNvdXJjZS4KKyAgICAgKi8KKyAgICB3cHRfdWludDggICB1Y1dvV0VBUElEUmVxdWVzdEVuYWJsZTsKKworICAgIC8qIFRoaXMgY29uZmlndXJhdGlvbiBkaXJlY3RzIHRoZSBXb1cgcGFja2V0IGZpbHRlcmluZyB0byBsb29rIGZvciBFQVBPTC00V0FZCisgICAgICogcmVxdWVzdHMgYW5kIHVzZSB0aGlzIGFzIGEgd2FrZSBzb3VyY2UuCisgICAgICovCisgICAgd3B0X3VpbnQ4ICAgdWNXb1dFQVBPTDRXYXlFbmFibGU7CisKKyAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gYWxsb3dzIGEgaG9zdCB3YWtldXAgb24gYW4gbmV0d29yayBzY2FuIG9mZmxvYWQgbWF0Y2guCisgICAgICovCisgICAgd3B0X3VpbnQ4ICAgdWNXb3dOZXRTY2FuT2ZmbG9hZE1hdGNoOworCisgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGFsbG93cyBhIGhvc3Qgd2FrZXVwIG9uIGFueSBHVEsgcmVrZXlpbmcgZXJyb3IuCisgICAgICovCisgICAgd3B0X3VpbnQ4ICAgdWNXb3dHVEtSZWtleUVycm9yOworCisgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGFsbG93cyBhIGhvc3Qgd2FrZXVwIG9uIEJTUyBjb25uZWN0aW9uIGxvc3MuCisgICAgICovCisgICAgd3B0X3VpbnQ4ICAgdWNXb1dCU1NDb25uTG9zczsKKyNlbmRpZiAvLyBXTEFOX1dBS0VVUF9FVkVOVFMKK30gV0RJX1dvd2xFbnRlckluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfV293bEVudGVyUmVxUGFyYW1zVHlwZQorICBXb3dsIGVudGVyIGluZm8gcGFzc2VkIHRvIFdESSBmb3JtIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qV293bCBkZWxldGUgcHRybiBJbmZvIFR5cGUsIHNhbWUgYXMgV0RJX1NtZVdvd2xFbnRlclBhcmFtcyAqLyAKKyAgIFdESV9Xb3dsRW50ZXJJbmZvVHlwZSAgICAgd2RpV293bEVudGVySW5mbzsgCisgICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudCByZXEKKyAgIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nIHRoZSBtZXNzYWdlCisgICBvdmVyIHRoZSBCVVMgKi8gCisgICBXRElfUmVxU3RhdHVzQ2IgICAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisgICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovIAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhOyAKK31XRElfV293bEVudGVyUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZVJlcVBhcmFtc1R5cGUKKyAgQXBwcyBDcHUgV2FrZXVwIFN0YXRlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIFdESSBmb3JtIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qRGVwaWN0cyB0aGUgc3RhdGUgb2YgdGhlIEFwcHMgQ1BVICovIAorICAgd3B0X2Jvb2xlYW4gICAgICAgICAgICAgICAgYklzQXBwc0F3YWtlOworICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLyAKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9V0RJX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZVJlcVBhcmFtc1R5cGU7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfRmx1c2hBY1JlcWluZm9UeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8vIE1lc3NhZ2UgVHlwZQorICAgd3B0X3VpbnQxNiB1c01lc2dUeXBlOworCisgICAvLyBNZXNzYWdlIExlbmd0aAorICAgd3B0X3VpbnQxNiB1c01lc2dMZW47CisKKyAgIC8vIFN0YXRpb24gSW5kZXguIG9yaWdpbmF0ZXMgZnJvbSBIQUwKKyAgIHdwdF91aW50OCAgdWNTVEFJZDsKKworICAgLy8gVElEIGZvciB3aGljaCB0aGUgdHJhbnNtaXQgcXVldWUgaXMgYmVpbmcgZmx1c2hlZCAKKyAgIHdwdF91aW50OCAgdWNUaWQ7CisgIAorfVdESV9GbHVzaEFjUmVxaW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9GbHVzaEFjUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qQUMgSW5mbyAqLworICBXRElfRmx1c2hBY1JlcWluZm9UeXBlICB3ZGlGbHVzaEFjSW5mbzsgCisKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfRmx1c2hBY1JlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9CdEFtcEV2ZW50aW5mb1R5cGUKKyAgICAgIEJULUFNUCBFdmVudCBTdHJ1Y3R1cmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICB3cHRfdWludDggdWNCdEFtcEV2ZW50VHlwZTsKKworfSBXRElfQnRBbXBFdmVudGluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfQnRBbXBFdmVudFBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkJUIEFNUCBldmVudCBJbmZvICovCisgIFdESV9CdEFtcEV2ZW50aW5mb1R5cGUgIHdkaUJ0QW1wRXZlbnRJbmZvOyAKKworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9CdEFtcEV2ZW50UGFyYW1zVHlwZTsKKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9BZ2dyQWRkVFNSZXFJbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qU1RBIEluZGV4Ki8KKyAgd3B0X3VpbnQ4ICAgICAgICAgdWNTVEFJZHg7IAorCisgIC8qSWRlbnRpZmllciBmb3IgVFNwZWMqLworICB3cHRfdWludDggICAgICAgICB1Y1RzcGVjSWR4OworCisgIC8qVHNwZWMgSUUgbmVnb3RpYXRlZCBPVEEqLworICBXRElfVHNwZWNJRVR5cGUgICB3ZGlUc3BlY0lFW1dESV9NQVhfTk9fQUNdOworCisgIC8qVUFQU0QgZGVsaXZlcnkgYW5kIHRyaWdnZXIgZW5hYmxlZCBmbGFncyAqLworICB3cHRfdWludDggICAgICAgICB1Y1VhcHNkRmxhZ3M7CisKKyAgLypTSSBmb3IgZWFjaCBBQyovCisgIHdwdF91aW50OCAgICAgICAgIHVjU2VydmljZUludGVydmFsW1dESV9NQVhfTk9fQUNdOworCisgIC8qU3VzcGVuZCBJbnRlcnZhbCBmb3IgZWFjaCBBQyovCisgIHdwdF91aW50OCAgICAgICAgIHVjU3VzcGVuZEludGVydmFsW1dESV9NQVhfTk9fQUNdOworCisgIC8qREkgZm9yIGVhY2ggQUMqLworICB3cHRfdWludDggICAgICAgICB1Y0RlbGF5ZWRJbnRlcnZhbFtXRElfTUFYX05PX0FDXTsKKworfVdESV9BZ2dyQWRkVFNSZXFJbmZvVHlwZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfQWdnckFkZFRTUmVxUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qVFNwZWMgSW5mbyAqLworICBXRElfQWdnckFkZFRTUmVxSW5mb1R5cGUgIHdkaUFnZ3JUc0luZm87IAorCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7Cit9V0RJX0FnZ3JBZGRUU1JlcVBhcmFtc1R5cGU7CisKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCisjaWZkZWYgQU5JX01BTkZfRElBRworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0ZUTUNvbW1hbmRSZXFUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qIEZUTSBDb21tYW5kIEJvZHkgbGVuZ3RoICovCisgICB3cHRfdWludDMyICAgYm9keUxlbmd0aDsKKyAgIC8qIEFjdHVhbCBGVE0gQ29tbWFuZCBib2R5ICovCisgICB2b2lkICAgICAgICAqRlRNQ29tbWFuZEJvZHk7Cit9V0RJX0ZUTUNvbW1hbmRSZXFUeXBlOworI2VuZGlmIC8qIEFOSV9NQU5GX0RJQUcgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1dsYW5TdXNwZW5kSW5mb1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgLyogTW9kZSBvZiBNY2FzdCBhbmQgQmNhc3QgZmlsdGVycyBjb25maWd1cmVkICovCisgIHdwdF91aW50OCB1Y0NvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmc7Cit9V0RJX1dsYW5TdXNwZW5kSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TdXNwZW5kUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIFdESV9XbGFuU3VzcGVuZEluZm9UeXBlIHdkaVN1c3BlbmRQYXJhbXM7CisKKyAgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7CisKK31XRElfU3VzcGVuZFBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9XbGFuUmVzdW1lSW5mb1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgLyogTW9kZSBvZiBNY2FzdCBhbmQgQmNhc3QgZmlsdGVycyBjb25maWd1cmVkICovCisgIHdwdF91aW50OCB1Y0NvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmc7Cit9V0RJX1dsYW5SZXN1bWVJbmZvVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1Jlc3VtZVBhcmFtc1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICBXRElfV2xhblJlc3VtZUluZm9UeXBlIHdkaVJlc3VtZVBhcmFtczsKKworICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKKworfVdESV9SZXN1bWVQYXJhbXNUeXBlOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV0RJX0dUS19PRkZMT0FEX1JFUQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHdwdF91aW50MzIgICAgIHVsRmxhZ3M7ICAgICAgICAgICAgIC8qIG9wdGlvbmFsIGZsYWdzICovCisgIHdwdF91aW50OCAgICAgIGFLQ0tbMTZdOyAgICAgICAgICAgIC8qIEtleSBjb25maXJtYXRpb24ga2V5ICovIAorICB3cHRfdWludDggICAgICBhS0VLWzE2XTsgICAgICAgICAgICAvKiBrZXkgZW5jcnlwdGlvbiBrZXkgKi8KKyAgd3B0X3VpbnQ2NCAgICAgdWxsS2V5UmVwbGF5Q291bnRlcjsgLyogcmVwbGF5IGNvdW50ZXIgKi8KK30gV0RJX0d0a09mZmxvYWRSZXFQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICBXRElfR3RrT2ZmbG9hZFJlcVBhcmFtcyBndGtPZmZsb2FkUmVxUGFyYW1zOworCisgICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgcFVzZXJEYXRhOworfSBXRElfR3RrT2ZmbG9hZFJlcU1zZzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdESV9HVEtfT0ZGTE9BRF9SU1AKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBzdWNjZXNzIG9yIGZhaWx1cmUgKi8KKyAgICB3cHRfdWludDMyICAgdWxTdGF0dXM7Cit9IFdESV9HdGtPZmZsb2FkUnNwUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdAoreworICAgV0RJX0d0a09mZmxvYWRSc3BQYXJhbXMgZ3RrT2ZmbG9hZFJzcFBhcmFtczsKKworICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK30gV0RJX0d0a09mZmxvYWRSc3BNc2c7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogV0RJX0dUS19PRkZMT0FEX0dFVElORk9fUkVRCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK30gV0RJX0d0a09mZmxvYWRHZXRJbmZvUmVxTXNnOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBXRElfR1RLX09GRkxPQURfR0VUSU5GT19SU1AKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgd3B0X3VpbnQzMiAgIHVsU3RhdHVzOyAgICAgICAgICAgICAvKiBzdWNjZXNzIG9yIGZhaWx1cmUgKi8KKyAgIHdwdF91aW50NjQgICB1bGxLZXlSZXBsYXlDb3VudGVyOyAgLyogY3VycmVudCByZXBsYXkgY291bnRlciB2YWx1ZSAqLworICAgd3B0X3VpbnQzMiAgIHVsVG90YWxSZWtleUNvdW50OyAgICAvKiB0b3RhbCByZWtleSBhdHRlbXB0cyAqLworICAgd3B0X3VpbnQzMiAgIHVsR1RLUmVrZXlDb3VudDsgICAgICAvKiBzdWNjZXNzZnVsIEdUSyByZWtleXMgKi8KKyAgIHdwdF91aW50MzIgICB1bElHVEtSZWtleUNvdW50OyAgICAgLyogc3VjY2Vzc2Z1bCBpR1RLIHJla2V5cyAqLworfSBXRElfR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICBXRElfR3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXMgZ3RrT2ZmbG9hZEdldEluZm9Sc3BQYXJhbXM7CisKKyAgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKworICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7Cit9ICBXRElfR3RrT2ZmbG9hZEdldEluZm9Sc3BNc2c7CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TdXNwZW5kUmVzdW1lUnNwUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qU3RhdHVzIG9mIHRoZSByZXNwb25zZSovCisgIFdESV9TdGF0dXMgICB3ZGlTdGF0dXM7IAorfVdESV9TdXNwZW5kUmVzdW1lUnNwUGFyYW1zVHlwZTsKKworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisKKy8qTWF4IG51bWJlciBvZiBjaGFubmVscyBmb3IgYSBnaXZlbiBuZXR3b3JrIHN1cHBvcnRlZCBieSBQTk8qLworI2RlZmluZSBXRElfUE5PX01BWF9ORVRXX0NIQU5ORUxTICAyNgorCisvKlRoZSBtYXggbnVtYmVyIG9mIHByb2dyYW1hYmxlIG5ldHdvcmtzIGZvciBQTk8qLworI2RlZmluZSBXRElfUE5PX01BWF9TVVBQX05FVFdPUktTICAxNgorCisvKlRoZSBtYXggbnVtYmVyIG9mIHNjYW4gdGltZXJzIHByb2dyYW1hYmxlIGluIFJpdmEqLworI2RlZmluZSBXRElfUE5PX01BWF9TQ0FOX1RJTUVSUyAgICAxMAorCisjZGVmaW5lIFdESV9QTk9fTUFYX1BST0JFX1NJWkUgICAgNDUwCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX0F1dGhUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIAoreworICAgIFdESV9BVVRIX1RZUEVfQU5ZICAgICA9IDAsIAorCisgICAgV0RJX0FVVEhfVFlQRV9OT05FLCAgIAorICAgIFdESV9BVVRIX1RZUEVfT1BFTl9TWVNURU0sCisgICAgV0RJX0FVVEhfVFlQRV9TSEFSRURfS0VZLAorCisgICAgV0RJX0FVVEhfVFlQRV9XUEEsCisgICAgV0RJX0FVVEhfVFlQRV9XUEFfUFNLLAorICAgIFdESV9BVVRIX1RZUEVfV1BBX05PTkUsCisKKyAgICBXRElfQVVUSF9UWVBFX1JTTiwKKyAgICBXRElfQVVUSF9UWVBFX1JTTl9QU0ssCisgICAgV0RJX0FVVEhfVFlQRV9GVF9SU04sCisgICAgV0RJX0FVVEhfVFlQRV9GVF9SU05fUFNLLAorICAgIFdESV9BVVRIX1RZUEVfV0FQSV9XQUlfQ0VSVElGSUNBVEUsCisgICAgV0RJX0FVVEhfVFlQRV9XQVBJX1dBSV9QU0ssCisgICAgV0RJX0FVVEhfVFlQRV9NQVggPSAweEZGRkZGRkZGIC8qZXhwYW5kaW5nIHRoZSB0eXBlIHRvIFVJTlQzMiovCisKK31XRElfQXV0aFR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9FZFR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICBXRElfRURfQU5ZICAgICAgICA9IDAsIAorICAgIFdESV9FRF9OT05FLCAKKyAgICBXRElfRURfV0VQNDAsCisgICAgV0RJX0VEX1dFUDEwNCwKKyAgICBXRElfRURfVEtJUCwKKyAgICBXRElfRURfQ0NNUCwKKyAgICBXRElfRURfV1BJLAorICAgIFdESV9FRF9BRVNfMTI4X0NNQUMsCisgICAgV0RJX0VEX01BWCA9IDB4RkZGRkZGRkYgLypleHBhbmRpbmcgdGhlIHR5cGUgdG8gVUlOVDMyKi8KK30gV0RJX0VkVHlwZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfUE5PTW9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAvKk5ldHdvcmsgb2ZmbG9hZCBpcyB0byBzdGFydCBpbW1lZGlhdGVseSovCisgIFdESV9QTk9fTU9ERV9JTU1FRElBVEUsCisKKyAgLypOZXR3b3JrIG9mZmxvYWQgaXMgdG8gc3RhcnQgb24gaG9zdCBzdXNwZW5kKi8KKyAgV0RJX1BOT19NT0RFX09OX1NVU1BFTkQsCisKKyAgLypOZXR3b3JrIG9mZmxvYWQgaXMgdG8gc3RhcnQgb24gaG9zdCByZXN1bWUqLworICBXRElfUE5PX01PREVfT05fUkVTVU1FLAorICBXRElfUE5PX01PREVfTUFYID0gMHhGRkZGRkZGRgorfSBXRElfUE5PTW9kZTsKKworLyogU1NJRCBicm9hZGNhc3QgIHR5cGUgKi8KK3R5cGVkZWYgZW51bSAKK3sKKyAgV0RJX0JDQVNUX1VOS05PV04gICAgICA9IDAsCisgIFdESV9CQ0FTVF9OT1JNQUwgICAgICAgPSAxLAorICBXRElfQkNBU1RfSElEREVOICAgICAgID0gMiwKKworICBXRElfQkNBU1RfVFlQRV9NQVggICAgID0gMHhGRkZGRkZGRgorfSBXRElfU1NJREJjYXN0VHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX05ldHdvcmtUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIC8qVGhlIFNTSUQgb2YgdGhlIHByZWZlcnJlZCBuZXR3b3JrKi8KKyAgV0RJX01hY1NTaWQgIHNzSWQ7CisKKyAgLypUaGUgYXV0aGVudGljYXRpb24gbWV0aG9kIG9mIHRoZSBwcmVmZXJyZWQgbmV0d29yayovCisgIFdESV9BdXRoVHlwZSB3ZGlBdXRoOyAKKworICAvKlRoZSBlbmNyeXB0aW9uIG1ldGhvZCBvZiB0aGUgcHJlZmVycmVkIG5ldHdvcmsqLworICBXRElfRWRUeXBlICAgd2RpRW5jcnlwdGlvbjsgCisKKyAgLypTU0lEIGJyb2FkY2FzdCB0eXBlLCBub3JtYWwsIGhpZGRlbiBvciB1bmtub3duKi8KKyAgV0RJX1NTSURCY2FzdFR5cGUgd2RpQmNhc3ROZXR3b3JrVHlwZTsKKworICAvKmNoYW5uZWwgY291bnQgLSAwIGZvciBhbGwgY2hhbm5lbHMqLworICB3cHRfdWludDggICAgdWNDaGFubmVsQ291bnQ7CisKKyAgLyp0aGUgYWN0dWFsIGNoYW5uZWxzKi8KKyAgd3B0X3VpbnQ4ICAgIGFDaGFubmVsc1tXRElfUE5PX01BWF9ORVRXX0NIQU5ORUxTXTsKKworICAvKnJzc2kgdGhyZXNob2xkIHRoYXQgYSBuZXR3b3JrIG11c3QgbWVldCB0byBiZSBjb25zaWRlcmVkLCAwIC0gZm9yIGFueSovCisgIHdwdF91aW50OCAgICByc3NpVGhyZXNob2xkOworfSBXRElfTmV0d29ya1R5cGU7IAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TY2FuVGltZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgLypUaGUgdGltZXIgdmFsdWUqLworICB3cHRfdWludDMyICAgIHVUaW1lclZhbHVlOyAKKworICAvKlRoZSBhbW91bnQgb2YgdGltZSB3ZSBzaG91bGQgYmUgcmVwZWF0aW5nIHRoZSBpbnRlcnZhbCovCisgIHdwdF91aW50MzIgICAgdVRpbWVyUmVwZWF0OyAKK30gV0RJX1NjYW5UaW1lcjsgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TY2FuVGltZXJzVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qVGhlIG51bWJlciBvZiB2YWx1ZSBwYWlyIGludGVydmFscyBwcmVzZW50IGluIHRoZSBhcnJheSovCisgIHdwdF91aW50OCAgICAgIHVjU2NhblRpbWVyc0NvdW50OyAKKworICAvKlRoZSB0aW1lLXJlcGVhdCB2YWx1ZSBwYWlycyovCisgIFdESV9TY2FuVGltZXIgIGFUaW1lclZhbHVlc1tXRElfUE5PX01BWF9TQ0FOX1RJTUVSU107IAorfSBXRElfU2NhblRpbWVyc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9QTk9TY2FuUmVxVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreworICAvKkVuYWJsZSBvciBkaXNhYmxlIFBOTyBmZWF0dXJlKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICBiRW5hYmxlOworCisgIC8qUE5PIG1vZGUgcmVxdWVzdGVkKi8KKyAgV0RJX1BOT01vZGUgICAgICAgICB3ZGlNb2RlUE5POworCisgIC8qTmV0d29yayBjb3VudCovCisgIHdwdF91aW50OCAgICAgICAgICAgdWNOZXR3b3Jrc0NvdW50OyAKKworICAvKlRoZSBuZXR3b3JrcyB0byBsb29rIGZvciovCisgIFdESV9OZXR3b3JrVHlwZSAgICAgYU5ldHdvcmtzW1dESV9QTk9fTUFYX1NVUFBfTkVUV09SS1NdOworCisgIC8qU2NhbiB0aW1lciBpbnRlcnZhbHMqLworICBXRElfU2NhblRpbWVyc1R5cGUgIHNjYW5UaW1lcnM7IAorCisgIC8qUHJvYmUgdGVtcGxhdGUgZm9yIDIuNEdIeiBiYW5kKi8KKyAgd3B0X3VpbnQxNiAgICAgICAgICB1czI0R1Byb2JlU2l6ZTsgCisgIHdwdF91aW50OCAgICAgICAgICAgYTI0R1Byb2JlVGVtcGxhdGVbV0RJX1BOT19NQVhfUFJPQkVfU0laRV07CisKKyAgLypQcm9iZSB0ZW1wbGF0ZSBmb3IgNUdIeiBiYW5kKi8KKyAgd3B0X3VpbnQxNiAgICAgICAgICB1czVHUHJvYmVTaXplOyAKKyAgd3B0X3VpbnQ4ICAgICAgICAgICBhNUdQcm9iZVRlbXBsYXRlW1dESV9QTk9fTUFYX1BST0JFX1NJWkVdOworfSBXRElfUE5PU2NhblJlcVR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9QTk9TY2FuUmVxUGFyYW1zVHlwZQorICBQTk8gaW5mbyBwYXNzZWQgdG8gV0RJIGZvcm0gV0RBCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7IAorICAgLyogUE5PIEluZm8gVHlwZSwgc2FtZSBhcyB0UHJlZk5ldHdMaXN0UGFyYW1zICovIAorICAgV0RJX1BOT1NjYW5SZXFUeXBlICAgICAgICB3ZGlQTk9TY2FuSW5mbzsgCisgICAvKiBSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgLyogVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8gCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGE7IAorfSBXRElfUE5PU2NhblJlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TZXRSc3NpRmlsdGVyUmVxUGFyYW1zVHlwZQorICBQTk8gaW5mbyBwYXNzZWQgdG8gV0RJIGZvcm0gV0RBCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7IAorICAgLyogUlNTSSBUaHJlc2hvbGQgKi8gCisgICB3cHRfdWludDggICAgICAgICAgICAgICAgICByc3NpVGhyZXNob2xkOyAKKyAgIC8qIFJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudCByZXEKKyAgIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nIHRoZSBtZXNzYWdlCisgICBvdmVyIHRoZSBCVVMgKi8gCisgICBXRElfUmVxU3RhdHVzQ2IgICAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisgICAvKiBUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLyAKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9IFdESV9TZXRSc3NpRmlsdGVyUmVxUGFyYW1zVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1VwZGF0ZVNjYW5QYXJhbXNJbmZvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIC8qSXMgMTFkIGVuYWJsZWQqLworICB3cHRfdWludDggICAgYjExZEVuYWJsZWQ7IAorCisgIC8qV2FzIFVNQWMgYWJsZSB0byBmaW5kIHRoZSByZWd1bGF0b3J5IGRvbWFpbiovCisgIHdwdF91aW50OCAgICBiMTFkUmVzb2x2ZWQ7CisKKyAgLypOdW1iZXIgb2YgY2hhbm5lbCBhbGxvd2VkIGluIHRoZSByZWd1bGF0b3J5IGRvbWFpbiovCisgIHdwdF91aW50OCAgICB1Y0NoYW5uZWxDb3VudDsgCisKKyAgLypUaGUgYWN0dWFsIGNoYW5uZWxzIGFsbG93ZWQgaW4gdGhlIHJlZ3VsYXRvcnkgZG9tYWluKi8KKyAgd3B0X3VpbnQ4ICAgIGFDaGFubmVsc1tXRElfUE5PX01BWF9ORVRXX0NIQU5ORUxTXTsgCisKKyAgLypQYXNzaXZlIG1pbiBjaGFubmVsIHRpbWUqLworICB3cHRfdWludDE2ICAgdXNQYXNzaXZlTWluQ2hUaW1lOyAKKworICAvKlBhc3NpdmUgbWF4IGNoYW5uZWwgdGltZSovCisgIHdwdF91aW50MTYgICB1c1Bhc3NpdmVNYXhDaFRpbWU7IAorCisgIC8qQWN0aXZlIG1pbiBjaGFubmVsIHRpbWUqLworICB3cHRfdWludDE2ICAgdXNBY3RpdmVNaW5DaFRpbWU7IAorCisgIC8qQWN0aXZlIG1heCBjaGFubmVsIHRpbWUqLworICB3cHRfdWludDE2ICAgdXNBY3RpdmVNYXhDaFRpbWU7IAorCisgIC8qY2hhbm5lbCBib25kaW5nIGluZm8qLworICB3cHRfdWludDggICAgY2JTdGF0ZTsgCit9IFdESV9VcGRhdGVTY2FuUGFyYW1zSW5mbzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV0RJX1VwZGF0ZVNjYW5QYXJhbXNJbmZvVHlwZQorICBVcGRhdGVTY2FuUGFyYW1zIGluZm8gcGFzc2VkIHRvIFdESSBmb3JtIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgIC8qIFBOTyBJbmZvIFR5cGUsIHNhbWUgYXMgdFVwZGF0ZVNjYW5QYXJhbXMgKi8gCisgICBXRElfVXBkYXRlU2NhblBhcmFtc0luZm8gICB3ZGlVcGRhdGVTY2FuUGFyYW1zSW5mbzsgCisgICAvKiBSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZQorICAgb3ZlciB0aGUgQlVTICovIAorICAgV0RJX1JlcVN0YXR1c0NiICAgICAgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgLyogVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8gCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGE7IAorfSBXRElfVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlOworI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfVXBkYXRlU2NhblBhcmFtc0luZm8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgIC8qICBJZ25vcmUgRFRJTSAqLworICB3cHRfdWludDMyIHVJZ25vcmVEVElNOworCisgIC8qRFRJTSBQZXJpb2QqLworICB3cHRfdWludDMyIHVEVElNUGVyaW9kOworCisgIC8qIExpc3RlbiBJbnRlcnZhbCAqLworICB3cHRfdWludDMyIHVMaXN0ZW5JbnRlcnZhbDsKKworICAvKiBCcm9hZGNhc3QgTXVsdGljYXMgRmlsdGVyICAqLworICB3cHRfdWludDMyIHVCY2FzdE1jYXN0RmlsdGVyOworCisgIC8qIEJlYWNvbiBFYXJseSBUZXJtaW5hdGlvbiAqLworICB3cHRfdWludDMyIHVFbmFibGVCRVQ7CisKKyAgLyogQmVhY29uIEVhcmx5IFRlcm1pbmF0aW9uIEludGVydmFsICovCisgIHdwdF91aW50MzIgdUJFVEludGVydmFsOyAKKworfSBXRElfU2V0UG93ZXJQYXJhbXNJbmZvOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlCisgIFVwZGF0ZVNjYW5QYXJhbXMgaW5mbyBwYXNzZWQgdG8gV0RJIGZvcm0gV0RBCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7IAorICAgLyogUG93ZXIgcGFyYW1zIEluZm8gVHlwZSwgc2FtZSBhcyB0U2V0UG93ZXJQYXJhbXNSZXEgKi8gCisgICBXRElfU2V0UG93ZXJQYXJhbXNJbmZvICAgICB3ZGlTZXRQb3dlclBhcmFtc0luZm87IAorICAgLyogUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50IHJlcQorICAgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcgdGhlIG1lc3NhZ2UKKyAgIG92ZXIgdGhlIEJVUyAqLyAKKyAgIFdESV9SZXFTdGF0dXNDYiAgICAgICAgICAgIHdkaVJlcVN0YXR1c0NCOyAKKyAgIC8qIFRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovIAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhOworfVdESV9TZXRQb3dlclBhcmFtc1JlcVBhcmFtc1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TZXRUeFBlclRyYWNraW5nQ29uZlR5cGUKKyAgV293bCBhZGQgcHRybiBpbmZvIHBhc3NlZCB0byBXREEgZm9ybSBVTUFDCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHdwdF91aW50OCAgdWNUeFBlclRyYWNraW5nRW5hYmxlOyAgICAgLyogMDogZGlzYWJsZSwgMTplbmFibGUgKi8KKyAgIHdwdF91aW50OCAgdWNUeFBlclRyYWNraW5nUGVyaW9kOyAgICAgICAgLyogQ2hlY2sgcGVyaW9kLCB1bml0IGlzIHNlYy4gKi8KKyAgIHdwdF91aW50OCAgdWNUeFBlclRyYWNraW5nUmF0aW87ICAgICAgLyogKEZhaWwgVFggcGFja2V0KS8oVG90YWwgVFggcGFja2V0KSByYXRpbywgdGhlIHVuaXQgaXMgMTAlLiAqLworICAgd3B0X3VpbnQzMiB1VHhQZXJUcmFja2luZ1dhdGVybWFyazsgICAgICAgICAvKiBBIHdhdGVybWFyayBvZiBjaGVjayBudW1iZXIsIG9uY2UgdGhlIHR4IHBhY2tldCBleGNlZWQgdGhpcyBudW1iZXIsIHdlIGRvIHRoZSBjaGVjaywgZGVmYXVsdCBpcyA1ICovCit9IFdESV9UeFBlclRyYWNraW5nUGFyYW1UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtc1R5cGUKKyAgVHggUEVSIFRyYWNraW5nIHBhcmFtZXRlcnMgcGFzc2VkIHRvIFdESSBmcm9tIFdEQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreyAKKyAgLyogQ29uZmlndXJhdGlvbnMgZm9yIFR4IFBFUiBUcmFja2luZyAqLyAKKyAgV0RJX1R4UGVyVHJhY2tpbmdQYXJhbVR5cGUgICAgIHdkaVR4UGVyVHJhY2tpbmdQYXJhbTsKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQgcmVxCisgICAgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcgdGhlIG1lc3NhZ2UKKyAgICBvdmVyIHRoZSBCVVMgKi8gCisgIFdESV9SZXFTdGF0dXNDYiAgICAgICAgICAgIHdkaVJlcVN0YXR1c0NCOyAKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8gCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsgCit9V0RJX1NldFR4UGVyVHJhY2tpbmdSZXFQYXJhbXNUeXBlOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFBhY2tldCBGaWx0ZXJpbmcgUGFyYW1ldGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSAgICBXRElfSVBWNF9BRERSX0xFTiAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgICAgV0RJX01BQ19BRERSX0xFTiAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lICAgIFdESV9NQVhfRklMVEVSX1RFU1RfREFUQV9MRU4gICAgICAgOAorI2RlZmluZSAgICBXRElfTUFYX05VTV9NVUxUSUNBU1RfQUREUkVTUyAgICAyNDAKKyNkZWZpbmUgICAgV0RJX01BWF9OVU1fRklMVEVSUyAgICAgICAgICAgICAgIDIwIAorI2RlZmluZSAgICBXRElfTUFYX05VTV9URVNUU19QRVJfRklMVEVSICAgICAgMTAgCisKKy8vCisvLyBSZWNlaXZlIEZpbHRlciBQYXJhbWV0ZXJzCisvLwordHlwZWRlZiBlbnVtCit7CisgIFdESV9SQ1ZfRklMVEVSX1RZUEVfSU5WQUxJRCwKKyAgV0RJX1JDVl9GSUxURVJfVFlQRV9GSUxURVJfUEtULAorICBXRElfUkNWX0ZJTFRFUl9UWVBFX0JVRkZFUl9QS1QsCisgIFdESV9SQ1ZfRklMVEVSX1RZUEVfTUFYX0VOVU1fU0laRQorfVdESV9SZWNlaXZlUGFja2V0RmlsdGVyVHlwZTsKKwordHlwZWRlZiBlbnVtIAoreworICBXRElfRklMVEVSX0hEUl9UWVBFX0lOVkFMSUQsCisgIFdESV9GSUxURVJfSERSX1RZUEVfTUFDLAorICBXRElfRklMVEVSX0hEUl9UWVBFX0FSUCwKKyAgV0RJX0ZJTFRFUl9IRFJfVFlQRV9JUFY0LAorICBXRElfRklMVEVSX0hEUl9UWVBFX0lQVjYsCisgIFdESV9GSUxURVJfSERSX1RZUEVfVURQLAorICBXRElfRklMVEVSX0hEUl9UWVBFX01BWAorfVdESV9SY3ZQa3RGbHRQcm90b2NvbFR5cGU7CisKK3R5cGVkZWYgZW51bSAKK3sKKyAgV0RJX0ZJTFRFUl9DTVBfVFlQRV9JTlZBTElELAorICBXRElfRklMVEVSX0NNUF9UWVBFX0VRVUFMLAorICBXRElfRklMVEVSX0NNUF9UWVBFX01BU0tfRVFVQUwsCisgIFdESV9GSUxURVJfQ01QX1RZUEVfTk9UX0VRVUFMLAorICBXRElfRklMVEVSX0NNUF9UWVBFX01BU0tfTk9UX0VRVUFMLAorICBXRElfRklMVEVSX0NNUF9UWVBFX01BWAorfVdESV9SY3ZQa3RGbHRDbXBGbGFnVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgV0RJX1JjdlBrdEZsdFByb3RvY29sVHlwZSAgICAgICAgICBwcm90b2NvbExheWVyOworICBXRElfUmN2UGt0Rmx0Q21wRmxhZ1R5cGUgICAgICAgICAgIGNtcEZsYWc7CisvKiBMZW5ndGggb2YgdGhlIGRhdGEgdG8gY29tcGFyZSAqLworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGg7IAorLyogZnJvbSBzdGFydCBvZiB0aGUgcmVzcGVjdGl2ZSBmcmFtZSBoZWFkZXIgKi8gIAorICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQ7IAorICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkOyAvKiBSZXNlcnZlZCBmaWVsZCAqLworLyogRGF0YSB0byBjb21wYXJlICovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZURhdGFbV0RJX01BWF9GSUxURVJfVEVTVF9EQVRBX0xFTl07ICAKKy8qIE1hc2sgdG8gYmUgYXBwbGllZCBvbiB0aGUgcmVjZWl2ZWQgcGFja2V0IGRhdGEgYmVmb3JlIGNvbXBhcmUgKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTWFza1tXRElfTUFYX0ZJTFRFUl9URVNUX0RBVEFfTEVOXTsgICAKK31XRElfUmN2UGt0RmlsdGVyRmllbGRQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVySWQ7IAorICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclR5cGU7CisgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgbnVtRmllbGRQYXJhbXM7CisgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgY29hbGVzY2VUaW1lOworICBXRElfUmN2UGt0RmlsdGVyRmllbGRQYXJhbXMgICAgIHBhcmFtc0RhdGFbMV07Cit9V0RJX1JjdlBrdEZpbHRlckNmZ1R5cGU7CisKK3R5cGVkZWYgc3RydWN0IAoreworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICB3ZGlSZXFTdGF0dXNDQjsgCisgICAgCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKKyAgICAKKyAgLy8gVmFyaWFibGUgbGVuZ3RoIHBhY2tldCBmaWx0ZXIgZmllbGQgcGFyYW1zCisgIFdESV9SY3ZQa3RGaWx0ZXJDZmdUeXBlIHdkaVBrdEZpbHRlckNmZzsKK30gV0RJX1NldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGU7CisKKy8vCisvLyBGaWx0ZXIgUGFja2V0IE1hdGNoIENvdW50IFBhcmFtZXRlcnMKKy8vCit0eXBlZGVmIHN0cnVjdAoreworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICB3ZGlSZXFTdGF0dXNDQjsgCisgICAgCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK30gV0RJX1JjdkZsdFBrdE1hdGNoQ250UmVxUGFyYW1zVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgd3B0X3VpbnQ4ICAgIGZpbHRlcklkOworICB3cHRfdWludDMyICAgbWF0Y2hDbnQ7Cit9IFdESV9SY3ZGbHRQa3RNYXRjaENudDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogU3VjY2VzcyBvciBGYWlsdXJlICovCisgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgV0RJX1JjdkZsdFBrdE1hdGNoQ250ICAgIGZpbHRlck1hdGNoQ250W1dESV9NQVhfTlVNX0ZJTFRFUlNdOworICAKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgIAorICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7Cit9IFdESV9SY3ZGbHRQa3RNYXRjaFJzcFBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgV0RJX1JjdkZsdFBrdE1hdGNoUnNwUGFyYW1zIGZsdFBrdE1hdGNoUnNwUGFyYW1zOworICAvKlJlcXVlc3Qgc3RhdHVzIGNhbGxiYWNrIG9mZmVyZWQgYnkgVU1BQyAtIGl0IGlzIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICAgIHJlcSBoYXMgcmV0dXJuZWQgUEVORElORyBhcyBzdGF0dXM7IGl0IGRlbGl2ZXJzIHRoZSBzdGF0dXMgb2Ygc2VuZGluZworICAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICB3ZGlSZXFTdGF0dXNDQjsgCisgICAgCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgICBmdW5jdGlvbiBwb2ludGVyIHdpbGwgYmUgY2FsbGVkICovCisgIHZvaWQqICAgICAgICAgICAgIHBVc2VyRGF0YTsKK30gV0RJX1JjdkZsdFBrdE1hdGNoQ250UnNwUGFyYW1zVHlwZTsKKworCisvLworLy8gUmVjZWl2ZSBGaWx0ZXIgQ2xlYXIgUGFyYW1ldGVycworLy8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHdwdF91aW50MzIgICBzdGF0dXM7ICAvKiBvbmx5IHZhbGlkIGZvciByZXNwb25zZSBtZXNzYWdlICovCisgIHdwdF91aW50OCAgICBmaWx0ZXJJZDsKK31XRElfUmN2Rmx0UGt0Q2xlYXJQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgV0RJX1JjdkZsdFBrdENsZWFyUGFyYW0gICAgIGZpbHRlckNsZWFyUGFyYW07CisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgIHdkaVJlcVN0YXR1c0NCOyAKKyAgICAKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgcFVzZXJEYXRhOworfSBXRElfUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlOworCisvLworLy8gTXVsdGljYXN0IEFkZHJlc3MgTGlzdCBQYXJhbWV0ZXJzCisvLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIHdwdF91aW50MzIgICAgIHVsTXVsdGljYXN0QWRkckNudDsKKyAgd3B0X21hY0FkZHIgICAgbXVsdGljYXN0QWRkcltXRElfTUFYX05VTV9NVUxUSUNBU1RfQUREUkVTU107Cit9IFdESV9SY3ZGbHRNY0FkZHJMaXN0VHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgV0RJX1JjdkZsdE1jQWRkckxpc3RUeXBlICAgICAgICAgbWNBZGRyTGlzdDsKKyAgLypSZXF1ZXN0IHN0YXR1cyBjYWxsYmFjayBvZmZlcmVkIGJ5IFVNQUMgLSBpdCBpcyBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKKyAgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgICB0aGUgbWVzc2FnZSBvdmVyIHRoZSBCVVMgKi8KKyAgV0RJX1JlcVN0YXR1c0NiICAgd2RpUmVxU3RhdHVzQ0I7IAorICAgIAorICAvKlRoZSB1c2VyIGRhdGEgcGFzc2VkIGluIGJ5IFVNQUMsIGl0IHdpbGwgYmUgc2VudCBiYWNrIHdoZW4gdGhlIGFib3ZlCisgICAgZnVuY3Rpb24gcG9pbnRlciB3aWxsIGJlIGNhbGxlZCAqLworICB2b2lkKiAgICAgICAgICAgICBwVXNlckRhdGE7Cit9IFdESV9SY3ZGbHRQa3RTZXRNY0xpc3RSZXFQYXJhbXNUeXBlOworI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9IQUxEdW1wQ21kUmVxSW5mb1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKmNvbW1hbmQqLworICB3cHRfdWludDMyIGNvbW1hbmQ7CisKKyAgLypBcmd1bWVudHMqLworICB3cHRfdWludDMyIGFyZ3VtZW50MTsKKyAgd3B0X3VpbnQzMiBhcmd1bWVudDI7CisgIHdwdF91aW50MzIgYXJndW1lbnQzOworICB3cHRfdWludDMyIGFyZ3VtZW50NDsKKworfVdESV9IQUxEdW1wQ21kUmVxSW5mb1R5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgV0RJX0hBTER1bXBDbWRSZXFQYXJhbXNUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLypOViBCbG9iIEluZm8qLworICBXRElfSEFMRHVtcENtZFJlcUluZm9UeXBlICB3ZGlIQUxEdW1wQ21kSW5mb1R5cGU7IAorCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICByZXEgaGFzIHJldHVybmVkIFBFTkRJTkcgYXMgc3RhdHVzOyBpdCBkZWxpdmVycyB0aGUgc3RhdHVzIG9mIHNlbmRpbmcKKyAgIHRoZSBtZXNzYWdlIG92ZXIgdGhlIEJVUyAqLworICBXRElfUmVxU3RhdHVzQ2IgICAgICAgd2RpUmVxU3RhdHVzQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgYWJvdmUKKyAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgIHBVc2VyRGF0YTsKKyAgCit9V0RJX0hBTER1bXBDbWRSZXFQYXJhbXNUeXBlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9IQUxEdW1wQ21kUnNwUGFyYW1zVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24qLworICBXRElfU3RhdHVzICAgICAgIHdkaVN0YXR1czsKKworICAvKiBsZW5ndGggb2YgdGhlIGJ1ZmZlciAqLworICB3cHRfdWludDE2ICAgICAgIHVzQnVmZmVyTGVuOworICAgIAorICAvKiBCdWZmZXIgKi8KKyAgd3B0X3VpbnQ4ICAgICAgICpwQnVmZmVyOworfVdESV9IQUxEdW1wQ21kUnNwUGFyYW1zVHlwZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfU2V0VG1MZXZlbFJlcVR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICB3cHRfdWludDE2ICAgICAgIHRtTW9kZTsKKyAgd3B0X3VpbnQxNiAgICAgICB0bUxldmVsOworICB2b2lkKiAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfU2V0VG1MZXZlbFJlcVR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9TZXRUbUxldmVsUnNwVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIFdESV9TdGF0dXMgICAgICAgd2RpU3RhdHVzOworICB2b2lkKiAgICAgICAgICAgIHBVc2VyRGF0YTsKK31XRElfU2V0VG1MZXZlbFJzcFR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICBXREkgY2FsbGJhY2sgdHlwZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1N0YXJ0UnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgU3RhcnQgcmVzcG9uc2UgZnJvbQorICAgdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpUnNwUGFyYW1zOiAgcmVzcG9uc2UgcGFyYW1ldGVycyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogICAgICB1c2VyIGRhdGEgIAorICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICgqV0RJX1N0YXJ0UnNwQ2IpKFdESV9TdGFydFJzcFBhcmFtc1R5cGUqICAgcHdkaVJzcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU3RhcnRSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBTdG9wIHJlc3BvbnNlIGZyb20KKyAgIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisgCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgKCpXRElfU3RvcFJzcENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU3RhcnRSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYW4gSW5pdCBTY2FuIHJlc3BvbnNlCisgICBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfSW5pdFNjYW5Sc3BDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TdGFydFJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFN0YXJ0U2NhbiByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlQYXJhbXM6ICByZXNwb25zZSBwYXJhbXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1N0YXJ0U2NhblJzcENiKShXRElfU3RhcnRTY2FuUnNwUGFyYW1zVHlwZSogIHdkaVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1N0YXJ0UnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgRW5kIFNjYW4gcmVzcG9uc2UKKyAgIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9FbmRTY2FuUnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TdGFydFJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIEZpbmlzaCBTY2FuIHJlc3BvbnNlCisgICBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfRmluaXNoU2NhblJzcENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU3RhcnRSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBKb2luIHJlc3BvbnNlIGZyb20KKyAgIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisgCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0pvaW5Sc3BDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1N0YXJ0UnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgQ29uZmlnIEJTUyByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlDb25maWdCU1NSc3A6ICByZXNwb25zZSBwYXJhbWV0ZXJzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgICAgIHVzZXIgZGF0YSAgCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0NvbmZpZ0JTU1JzcENiKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfQ29uZmlnQlNTUnNwUGFyYW1zVHlwZSogICBwd2RpQ29uZmlnQlNTUnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1N0YXJ0UnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgRGVsIEJTUyByZXNwb25zZSBmcm9tCisgICB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlEZWxCU1NSc3A6ICByZXNwb25zZSBwYXJhbWV0ZXJzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgICAgIHVzZXIgZGF0YSAgCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0RlbEJTU1JzcENiKShXRElfRGVsQlNTUnNwUGFyYW1zVHlwZSogIHB3ZGlEZWxCU1NSc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TdGFydFJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFBvc3QgQXNzb2MgcmVzcG9uc2UKKyAgIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpUnNwUGFyYW1zOiAgcmVzcG9uc2UgcGFyYW1ldGVycyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogICAgICB1c2VyIGRhdGEgIAorICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9Qb3N0QXNzb2NSc3BDYikoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RJX1Bvc3RBc3NvY1JzcFBhcmFtc1R5cGUqICBwd2RpUG9zdEFzc29jUnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1N0YXJ0UnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgRGVsIFNUQSByZXNwb25zZSBmcm9tCisgICB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlEZWxTVEFSc3A6ICByZXNwb25zZSBwYXJhbWV0ZXJzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgICAgIHVzZXIgZGF0YSAgCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0RlbFNUQVJzcENiKShXRElfRGVsU1RBUnNwUGFyYW1zVHlwZSogICBwd2RpRGVsU1RBUnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhKTsKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU3RhcnRSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBTZXQgQlNTIEtleSByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1NldEJTU0tleVJzcENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU3RhcnRSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBSZW1vdmUgQlNTIEtleQorICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1JlbW92ZUJTU0tleVJzcENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU3RhcnRSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBTZXQgU1RBIEtleSByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorICAKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfU2V0U1RBS2V5UnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TdGFydFJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFJlbW92ZSBTVEEgS2V5CisgICByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfUmVtb3ZlU1RBS2V5UnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWCAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfVHNtUnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgVFNNIFN0YXRzIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgcFRTTVN0YXRzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9Uc21Sc3BDYikoV0RJX1RTTVN0YXRzUnNwUGFyYW1zVHlwZSAqcFRTTVN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1N0YXJ0UnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgQWRkIFRTIHJlc3BvbnNlIGZyb20KKyAgIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfQWRkVHNSc3BDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU3RhcnRSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBEZWwgVFMgcmVzcG9uc2UgZnJvbQorICAgdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9EZWxUc1JzcENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TdGFydFJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhbiBVcGRhdGUgRURDQSBQYXJhbXMKKyAgIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKyAKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfVXBkYXRlRURDQVBhcmFtc1JzcENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1N0YXJ0UnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgQWRkIEJBIHJlc3BvbnNlIGZyb20KKyAgIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfQWRkQkFTZXNzaW9uUnNwQ2IpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9BZGRCQVNlc3Npb25Sc3BQYXJhbXNUeXBlKiB3ZGlBZGRCQVNlc3Npb25Sc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhKTsKKworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TdGFydFJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIERlbCBCQSByZXNwb25zZSBmcm9tCisgICB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorICAgIAorICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9EZWxCQVJzcENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TdGFydFJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFN3aXRjaCBDaCByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlSc3BQYXJhbXM6ICByZXNwb25zZSBwYXJhbWV0ZXJzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgICAgIHVzZXIgZGF0YSAgCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1N3aXRjaENoUnNwQ2IpKFdESV9Td2l0Y2hDSFJzcFBhcmFtc1R5cGUqICBwd2RpU3dpdGNoQ2hSc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEpOworCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1N0YXJ0UnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgQ29uZmlnIFNUQSByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlSc3BQYXJhbXM6ICByZXNwb25zZSBwYXJhbWV0ZXJzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgICAgIHVzZXIgZGF0YSAgCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0NvbmZpZ1NUQVJzcENiKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfQ29uZmlnU1RBUnNwUGFyYW1zVHlwZSogIHB3ZGlDb25maWdTVEFSc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEpOworCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1N0YXJ0UnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgU2V0IExpbmsgU3RhdGUKKyAgIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpUnNwUGFyYW1zOiAgcmVzcG9uc2UgcGFyYW1ldGVycyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogICAgICB1c2VyIGRhdGEgIAorICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9TZXRMaW5rU3RhdGVSc3BDYikoIFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU3RhcnRSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBHZXQgU3RhdHMgcmVzcG9uc2UKKyAgIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpUnNwUGFyYW1zOiAgcmVzcG9uc2UgcGFyYW1ldGVycyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogICAgICB1c2VyIGRhdGEgIAorICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9HZXRTdGF0c1JzcENiKShXRElfR2V0U3RhdHNSc3BQYXJhbXNUeXBlKiAgcHdkaUdldFN0YXRzUnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhKTsKKworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TdGFydFJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFVwZGF0ZSBDZmcgcmVzcG9uc2UKKyAgIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfVXBkYXRlQ2ZnUnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9BZGRCQVJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIEFERCBCQSByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9BZGRCQVJzcENiKShXRElfQWRkQkFSc3BpbmZvVHlwZSogICB3ZGlBZGRCQVJzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1RyaWdnZXJCQVJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIEFERCBCQSByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9UcmlnZ2VyQkFSc3BDYikoV0RJX1RyaWdnZXJCQVJzcFBhcmFtc1R5cGUqICAgd2RpVHJpZ2dlckJBUnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9VcGRhdGVCZWFjb25QYXJhbXNSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBVcGRhdGUgQmVhY29uIFBhcmFtcyByZXNwb25zZSBmcm9tCisgICB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1JzcENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TZW5kQmVhY29uUGFyYW1zUnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgU2VuZCBCZWFjb24gUGFyYW1zIHJlc3BvbnNlIGZyb20KKyAgIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfU2VuZEJlYWNvblBhcmFtc1JzcENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdEQV9TZXRNYXhUeFBvd2VyUnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgc2V0IG1heCBUeCBQb3dlciByZXNwb25zZSBmcm9tCisgICB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgKCpXREFfU2V0TWF4VHhQb3dlclJzcENiKShXRElfU2V0TWF4VHhQb3dlclJzcE1zZyAqd2RpU2V0TWF4VHhQb3dlclJzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZVJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFByb2JlIFJTUCBUZW1wbGF0ZQorICAgVXBkYXRlICByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisgICAgCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSc3BDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1NldFAyUEdPTk9BUmVxUGFyYW1zUnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgUDJQIEdPIE5PQSBQYXJhbXMgcmVzcG9uc2UgZnJvbQorICAgdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9TZXRQMlBHT05PQVJlcVBhcmFtc1JzcENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU2V0UHdyU2F2ZUNmZ0NiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIHNldCBQb3dlciBTYXZlIENGRworICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1NldFB3clNhdmVDZmdDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TZXRVYXBzZEFjUGFyYW1zQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgc2V0IFVBUFNEIHBhcmFtcworICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1NldFVhcHNkQWNQYXJhbXNDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9FbnRlckltcHNSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBFbnRlciBJTVBTIHJlc3BvbnNlCisgICBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfRW50ZXJJbXBzUnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9FeGl0SW1wc1JzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIEV4aXQgSU1QUyByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0V4aXRJbXBzUnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9FbnRlckJtcHNSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBlbnRlciBCTVBTIHJlc3BvbnNlCisgICBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfRW50ZXJCbXBzUnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9FeGl0Qm1wc1JzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIGV4aXQgQk1QUyByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0V4aXRCbXBzUnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9FbnRlclVhcHNkUnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgZW50ZXIgVUFQU0QgcmVzcG9uc2UKKyAgIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9FbnRlclVhcHNkUnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9FeGl0VWFwc2RSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBleGl0IFVBUFNEIHJlc3BvbnNlCisgICBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfRXhpdFVhcHNkUnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9VcGRhdGVVYXBzZFBhcmFtc0NiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIHVwZGF0ZSBVQVBTRCBwYXJhbXMKKyAgIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9VcGRhdGVVYXBzZFBhcmFtc0NiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX0NvbmZpZ3VyZVJ4cEZpbHRlckNiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIGNvbmZpZyBSWFAgZmlsdGVyCisgICByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfQ29uZmlndXJlUnhwRmlsdGVyQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TZXRCZWFjb25GaWx0ZXJDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBzZXQgYmVhY29uIGZpbHRlcgorICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1NldEJlYWNvbkZpbHRlckNiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfUmVtQmVhY29uRmlsdGVyQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgcmVtb3ZlIGJlYWNvbiBmaWx0ZXIKKyAgIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9SZW1CZWFjb25GaWx0ZXJDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1NldFJTU0lUaHJlc2hvbGRzQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgc2V0IFJTU0kgdGhyZXNob2xkcworICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1NldFJTU0lUaHJlc2hvbGRzQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX0hvc3RPZmZsb2FkQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgaG9zdCBvZmZsb2FkCisgICByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfSG9zdE9mZmxvYWRDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfS2VlcEFsaXZlQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgS2VlcCBBbGl2ZQorICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0tlZXBBbGl2ZUNiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9Xb3dsQWRkQmNQdHJuQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgV293bCBhZGQgQmNhc3QgcHRybgorICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1dvd2xBZGRCY1B0cm5DYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9Xb3dsRGVsQmNQdHJuQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgV293bCBkZWxldGUgQmNhc3QgcHRybgorICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1dvd2xEZWxCY1B0cm5DYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9Xb3dsRW50ZXJSZXFDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBXb3dsIGVudGVyCisgICByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfV293bEVudGVyUmVxQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9Xb3dsRXhpdFJlcUNiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFdvd2wgZXhpdAorICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1dvd2xFeGl0UmVxQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZUNiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIGNvbmZpZyBBcHBzIENwdSBXYWtldXAKKyAgIFN0YXRlIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9Db25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9OdkRvd25sb2FkUnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgTlYgRG93bmxvYWQgcmVzcG9uc2UKKyAgIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgSU4KKyAgIHdkaVN0YXR1czpyZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6dXNlciBkYXRhICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfTnZEb3dubG9hZFJzcENiKShXRElfTnZEb3dubG9hZFJzcEluZm9UeXBlKiB3ZGlOdkRvd25sb2FkUnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogIHBVc2VyRGF0YSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX0ZsdXNoQWNSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBGbHVzaCBBQyByZXNwb25zZSBmcm9tCisgICB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorICAgIAorICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9GbHVzaEFjUnNwQ2IpKFdESV9TdGF0dXMgICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfQnRBbXBFdmVudFJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIEJ0IEFNUCBldmVudCByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0J0QW1wRXZlbnRSc3BDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX0hvc3RSZXN1bWVFdmVudFJzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIEJ0IEFNUCBldmVudCByZXNwb25zZQorICAgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0hvc3RSZXN1bWVFdmVudFJzcENiKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdESV9TdXNwZW5kUmVzdW1lUnNwUGFyYW1zVHlwZSAgICpyZXN1bWVSc3BQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfQWdnckFkZFRzUnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgQWdncmVnYXRlZCBBZGQgVFMKKyAgIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9BZ2dyQWRkVHNSc3BDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKyNpZmRlZiBBTklfTUFORl9ESUFHCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX0ZUTUNvbW1hbmRSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIEZUTSBDb21tYW5kIHJlc3BvbnNlIENCCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICBmdG1DTURSc3BkYXRhOiAgRlRNIHJlc3BvbnNlIGRhdGEgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIE5PTkUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgKCpXRElfRlRNQ29tbWFuZFJzcENiKSh2b2lkICpmdG1DTURSc3BkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFVzZXJEYXRhKTsKKyNlbmRpZiAvKiBBTklfTUFORl9ESUFHICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfQWRkU1RBU2VsZlBhcmFtc1JzcENiIAorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBBZGQgU3RhIFNlbGYgUGFyYW1zCisgICByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaUFkZFNlbGZTVEFSc3A6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX0FkZFNUQVNlbGZQYXJhbXNSc3BDYikoCisgICAgICAgICAgICAgICAgICAgIFdESV9BZGRTVEFTZWxmUnNwUGFyYW1zVHlwZSogcHdkaUFkZFNlbGZTVEFSc3AsCisgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX0RlbFNUQVNlbGZSc3BDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBob3N0IG9mZmxvYWQKKyAgIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9EZWxTVEFTZWxmUnNwQ2IpCisoCitXRElfRGVsU1RBU2VsZlJzcFBhcmFtc1R5cGUqICAgICB3ZGlEZWxTdGFTZWxmUnNwUGFyYW1zLAordm9pZCogICAgICAgIHBVc2VyRGF0YQorKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9QTk9TY2FuQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgU2V0IFBOTworICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1BOT1NjYW5DYikoV0RJX1N0YXR1cyAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1BOT1NjYW5DYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBTZXQgUE5PCisgICByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfUnNzaUZpbHRlckNiKShXRElfU3RhdHVzICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfVXBkYXRlU2NhblBhcmFtc0NiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFVwZGF0ZSBTY2FuIFBhcmFtcworICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1VwZGF0ZVNjYW5QYXJhbXNDYikoV0RJX1N0YXR1cyAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgIHBVc2VyRGF0YSk7CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU2V0VHhQZXJUcmFja2luZ1JzcENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFR4IFBFUiBUcmFja2luZworICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1NldFR4UGVyVHJhY2tpbmdSc3BDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV84MDIzTXVsdGljYXN0TGlzdENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIDgwMjMgTXVsdGljYXN0IExpc3QKKyAgIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV84MDIzTXVsdGljYXN0TGlzdENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9SZWNlaXZlRmlsdGVyU2V0RmlsdGVyQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgUmVjZWl2ZSBGaWx0ZXIgU2V0IEZpbHRlcgorICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1JlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJDYikoV0RJX1N0YXR1cyAgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9GaWx0ZXJNYXRjaENvdW50Q2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgRG8gUEMgRmlsdGVyIE1hdGNoIENvdW50CisgICByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfRmlsdGVyTWF0Y2hDb3VudENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlckNiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIFJlY2VpdmUgRmlsdGVyIENsZWFyIEZpbHRlcgorICAgcmVzcG9uc2UgZnJvbSB0aGUgdW5kZXJseWluZyBkZXZpY2UuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlTdGF0dXM6ICByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBIQUwKKyAgICBwVXNlckRhdGE6ICB1c2VyIGRhdGEgIAorCisgICAgCisgIAorICBSRVRVUk4gVkFMVUUgCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgICgqV0RJX1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlckNiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9IQUxEdW1wQ21kUnNwQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgSEFMIERVTVAgQ29tbWFuZCAKK3Jlc3BvbnNlIGZyb20KKyAgIHRoZSBIQUwgbGF5ZXIuCisgCisgICBQQVJBTUVURVJTIAorCisgICAgSU4KKyAgICB3ZGlIYWxEdW1wQ21kUnNwOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9IQUxEdW1wQ21kUnNwQ2IpKFdESV9IQUxEdW1wQ21kUnNwUGFyYW1zVHlwZSogd2RpSGFsRHVtcENtZFJzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogIHBVc2VyRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfU2V0UG93ZXJQYXJhbXNDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBTZXQgUG93ZXIgUGFyYW0KKyAgIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9TZXRQb3dlclBhcmFtc0NiKShXRElfU3RhdHVzICB3ZGlTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgIHBVc2VyRGF0YSk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXRElfR3RrT2ZmbG9hZENiCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IERBTCB3aGVuIGl0IGhhcyByZWNlaXZlZCBhIEdUSyBvZmZsb2FkCisgICByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdkaVN0YXR1czogIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmcm9tIEhBTAorICAgIHBVc2VyRGF0YTogIHVzZXIgZGF0YSAgCisKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfR3RrT2ZmbG9hZENiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX0d0a09mZmxvYWRHZXRJbmZvQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgR1RLIG9mZmxvYWQKKyAgIGluZm9ybWF0aW9uIHJlc3BvbnNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorIAorICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9HdGtPZmZsb2FkR2V0SW5mb0NiKShXRElfU3RhdHVzICAgd2RpU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgcFVzZXJEYXRhKTsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESV9TZXRUbUxldmVsQ2IKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgREFMIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgU2V0IE5ldyBUTSBMZXZlbAorICAgZG9uZSByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKworICAgUEFSQU1FVEVSUyAKKworICAgIElOCisgICAgd2RpU3RhdHVzOiAgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZyb20gSEFMCisgICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAKKworICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICAoKldESV9TZXRUbUxldmVsQ2IpKFdESV9TdGF0dXMgIHdkaVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICBwVXNlckRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgV0RJX2ZlYXR1cmVDYXBzRXhjaGFuZ2VDYgorIAorICAgREVTQ1JJUFRJT04gICAKKyAKKyAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSBEQUwgd2hlbiBpdCBoYXMgcmVjZWl2ZWQgYSBIQUwgRmVhdHVyZSBDYXBiaWxpdHkgCisgICBFeGNoYW5nZSBSZXNwb25zZSB0aGUgSEFMIGxheWVyLiBUaGlzIGNhbGxiYWNrIGlzIHB1dCB0byBtYW50YWluIGNvZGUKKyAgIHNpbWlsYXJpdHkgYW5kIGlzIG5vdCBiZWluZyB1c2VkIHJpZ2h0IG5vdy4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgIElOCisgICB3ZGlGZWF0Q2FwUnNwUGFyYW1zOiAgcmVzcG9uc2UgcGFyYW1ldGVycyByZWNlaXZlZCBmcm9tIEhBTAorICAgcFVzZXJEYXRhOiAgdXNlciBkYXRhICAgICAKKyAgCisgICBSRVRVUk4gVkFMVUUgCisgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdm9pZCAgKCpXRElfZmVhdHVyZUNhcHNFeGNoYW5nZUNiKSh2b2lkKiB3ZGlGZWF0Q2FwUnNwUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEb2N1bWVudGF0aW9uCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5JVElBTElaQVRJT04gQVBJcworIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgV0RJX0luaXQgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBEQUwuCisgCisgREFMIHdpbGwgYWxsb2NhdGUgYWxsIHRoZSByZXNvdXJjZXMgaXQgbmVlZHMuIEl0IHdpbGwgb3BlbiBQQUwsIGl0IHdpbGwgYWxzbworIG9wZW4gYm90aCB0aGUgZGF0YSBhbmQgdGhlIGNvbnRyb2wgdHJhbnNwb3J0IHdoaWNoIGluIHRoZWlyIHR1cm4gd2lsbCBvcGVuCisgRFhFL1NNRCBvciBhbnkgb3RoZXIgZHJpdmVycyB0aGF0IHRoZXkgbmVlZC4gCisgCisgQHBhcmFtIHBPU0NvbnRleHQ6IHBvaW50ZXIgdG8gdGhlIE9TIGNvbnRleHQgcHJvdmlkZWQgYnkgdGhlIFVNQUMKKyAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwYXNzZWQgb24gdG8gUEFMIG9uIE9wZW4KKyAgICAgICAgcHBXRElHbG9iYWxDdHg6IG91dHB1dCBwb2ludGVyIG9mIEdsb2JhbCBDb250ZXh0CisgICAgICAgIHBXZGlEZXZDYXBhYmlsaXR5OiBvdXRwdXQgcG9pbnRlciBvZiBkZXZpY2UgY2FwYWJpbGl0eQorCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0luaXQKKyggCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBPU0NvbnRleHQsCisgIHZvaWQqKiAgICAgICAgICAgICAgICAgICAgIHBwV0RJR2xvYmFsQ3R4LAorICBXRElfRGV2aWNlQ2FwYWJpbGl0eVR5cGUqICBwV2RpRGV2Q2FwYWJpbGl0eSwKKyAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgZHJpdmVyVHlwZQorKTsKKworLyoqCisgQGJyaWVmIFdESV9TdGFydCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgaXMgcmVhZHkgdG8KKyAgICAgICAgY29tbWVuY2Ugb3BlcmF0aW9uIHdpdGggdGhlIFdMQU4gRGV2aWNlLiBVcG9uIHRoZSBjYWxsCisgICAgICAgIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgU3RhcnQKKyAgICAgICAgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIHRoZSBTTUQgY2hhbm5lbAorICAgICAgICBoYXMgYmVlbiBmdWxseSBvcGVuZWQgYW5kIHRoZSBSSVZBIHN1YnN5c3RlbSBpcyB1cC4KKworICAgICAgICAgSWYgdGhlIFJJVkEgc3ViLXN5c3RlbSBpcyBub3QgeWV0IHVwIGFuZCBydW5uaW5nIERBTAorICAgICAgICAgd2lsbCBxdWV1ZSB0aGUgcmVxdWVzdCBmb3IgT3BlbiBhbmQgd2lsbCB3YWl0IGZvciB0aGUKKyAgICAgICAgIFNNRCBub3RpZmljYXRpb24gYmVmb3JlIGF0dGVtcHRpbmcgdG8gc2VuZCBkb3duIHRoZQorICAgICAgICAgbWVzc2FnZSB0byBIQUwuIAorCisgV0RJX0luaXQgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaVN0YXJ0UGFyYW1zOiB0aGUgc3RhcnQgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVN0YXJ0UnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlIG9mCisgICAgICAgIHRoZSBzdGFydCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9TdGFydAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TdGFydAorKAorICBXRElfU3RhcnRSZXFQYXJhbXNUeXBlKiAgcHdkaVN0YXJ0UGFyYW1zLAorICBXRElfU3RhcnRSc3BDYiAgICAgICAgICAgd2RpU3RhcnRSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworCisvKioKKyBAYnJpZWYgV0RJX1N0b3Agd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIGlzIHJlYWR5IHRvCisgICAgICAgIHN0b3AgYW55IG9wZXJhdGlvbiB3aXRoIHRoZSBXTEFOIERldmljZS4gVXBvbiB0aGUgY2FsbAorICAgICAgICBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIFN0b3AKKyAgICAgICAgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIHRoZSBEQUwgQ29yZSBpcworICAgICAgICBpbiBzdGFydGVkIHN0YXRlLgorCisgICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4KKyAgCisgICAgICAgICBSZXF1ZXN0IHdpbGwgbm90IGJlIGFjY2VwdGVkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfU3RhcnQgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaVN0b3BQYXJhbXM6IHRoZSBzdG9wIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5IAorICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlTdG9wUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlIG9mCisgICAgICAgIHRoZSBzdG9wIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1N0YXJ0CisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1N0b3AKKygKKyAgV0RJX1N0b3BSZXFQYXJhbXNUeXBlKiAgcHdkaVN0b3BQYXJhbXMsCisgIFdESV9TdG9wUnNwQ2IgICAgICAgICAgIHdkaVN0b3BSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX0Nsb3NlIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBubyBsb25nZXIgCisgICAgICAgIG5lZWRzIHRvIGludGVycmFjdCB3aXRoIERBTC4gREFMIHdpbGwgZnJlZSBpdHMgY29udHJvbAorICAgICAgICBibG9jay4KKyAgCisgICAgICAgIEl0IGlzIG9ubHkgYWNjZXB0ZWQgaW4gc3RhdGUgU1RPUFBFRC4gIAorCisgV0RJX1N0b3AgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIG5vbmUKKyAgCisgQHNlZSBXRElfU3RvcAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9DbG9zZQorKAorICB2b2lkCispOworCisKKy8qKgorIEBicmllZiAgV0RJX1NodXRkb3duIHdpbGwgYmUgY2FsbGVkIGR1cmluZyAnU1NSIHNodXRkb3duJyBvcGVyYXRpb24uCisgICAgICAgICBUaGlzIHdpbGwgZG8gbW9zdCBvZiB0aGUgV0RJIHN0b3AgJiBjbG9zZQorICAgICAgICAgb3BlcmF0aW9ucyB3aXRob3V0IGRvaW5nIGFueSBoYW5kc2hha2Ugd2l0aCBSaXZhCisKKyAgICAgICAgIFRoaXMgd2lsbCBhbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb250cm9sIHRyYW5zcG9ydAorICAgICAgICAgd2lsbCBOT1QgYmUgY2xvc2VkLgorCisgICAgICAgICBUaGlzIHJlcXVlc3Qgd2lsbCBub3QgYmUgcXVldWVkLgorCisKKyBXRElfU3RhcnQgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtICBjbG9zZVRyYW5zcG9ydDogIENsb3NlIGNvbnRyb2wgY2hhbm5lbCBpZiB0aGlzIGlzIHNldAorCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfU2h1dGRvd24KKygKKyB3cHRfYm9vbGVhbiBjbG9zZVRyYW5zcG9ydAorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQU4gQVBJcworIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgV0RJX0luaXRTY2FuUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB3YW50cyAKKyAgICAgICAgdGhlIFdMQU4gRGV2aWNlIHRvIGdldCByZWFkeSBmb3IgYSBzY2FuIHByb2NlZHVyZS4gVXBvbgorICAgICAgICB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEKKyAgICAgICAgSEFMIEluaXQgU2NhbiByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfU3RhcnQgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaUluaXRTY2FuUGFyYW1zOiB0aGUgaW5pdCBzY2FuIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUluaXRTY2FuUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlCisgICAgICAgIG9mIHRoZSBpbml0IHNjYW4gb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU3RhcnQKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfSW5pdFNjYW5SZXEKKygKKyAgV0RJX0luaXRTY2FuUmVxUGFyYW1zVHlwZSogIHB3ZGlJbml0U2NhblBhcmFtcywKKyAgV0RJX0luaXRTY2FuUnNwQ2IgICAgICAgICAgIHdkaUluaXRTY2FuUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfU3RhcnRTY2FuUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2lzaGVzIHRvIGNoYW5nZSB0aGUgU2NhbiBjaGFubmVsIG9uIHRoZSBXTEFOIERldmljZS4KKyAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZAorICAgICAgICBzZW5kIGEgSEFMIFN0YXJ0IFNjYW4gcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX0luaXRTY2FuUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlTdGFydFNjYW5QYXJhbXM6IHRoZSBzdGFydCBzY2FuIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlTdGFydFNjYW5Sc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHN0YXJ0IHNjYW4gb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfSW5pdFNjYW5SZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU3RhcnRTY2FuUmVxCisoCisgIFdESV9TdGFydFNjYW5SZXFQYXJhbXNUeXBlKiAgcHdkaVN0YXJ0U2NhblBhcmFtcywKKyAgV0RJX1N0YXJ0U2NhblJzcENiICAgICAgICAgICB3ZGlTdGFydFNjYW5Sc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFdESV9FbmRTY2FuUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBpcyAKKyAgICAgICAgd2FudHMgdG8gZW5kIHNjYW5uaW5nIGZvciBhIHBhcnRpY3VsYXIgY2hhbm5lbCB0aGF0IGl0CisgICAgICAgIGhhZCBzZXQgYmVmb3JlIGJ5IGNhbGxpbmcgU2NhbiBTdGFydCBvbiB0aGUgV0xBTiBEZXZpY2UuCisgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQKKyAgICAgICAgc2VuZCBhIEhBTCBFbmQgU2NhbiByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfU3RhcnRTY2FuUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlFbmRTY2FuUGFyYW1zOiB0aGUgZW5kIHNjYW4gcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgCisgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUVuZFNjYW5Sc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIGVuZCBzY2FuIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1N0YXJ0U2NhblJlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9FbmRTY2FuUmVxCisoCisgIFdESV9FbmRTY2FuUmVxUGFyYW1zVHlwZSogcHdkaUVuZFNjYW5QYXJhbXMsCisgIFdESV9FbmRTY2FuUnNwQ2IgICAgICAgICAgd2RpRW5kU2NhblJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworCisvKioKKyBAYnJpZWYgV0RJX0ZpbmlzaFNjYW5SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIGhhcyAKKyAgICAgICAgY29tcGxldGVkIHRoZSBzY2FuIHByb2Nlc3Mgb24gdGhlIFdMQU4gRGV2aWNlLiBVcG9uIHRoZQorICAgICAgICBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwKKyAgICAgICAgRmluaXNoIFNjYW4gUmVxdWVzdCByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfSW5pdFNjYW5SZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaUZpbmlzaFNjYW5QYXJhbXM6IHRoZSBmaW5pc2ggc2NhbiAgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUZpbmlzaFNjYW5Sc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIGZpbmlzaCBzY2FuIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX0luaXRTY2FuUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0ZpbmlzaFNjYW5SZXEKKygKKyAgV0RJX0ZpbmlzaFNjYW5SZXFQYXJhbXNUeXBlKiBwd2RpRmluaXNoU2NhblBhcmFtcywKKyAgV0RJX0ZpbmlzaFNjYW5Sc3BDYiAgICAgICAgICB3ZGlGaW5pc2hTY2FuUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTT0NJQVRJT04gQVBJcworIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgV0RJX0pvaW5SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIGlzIHJlYWR5IAorICAgICAgICB0byBzdGFydCBhbiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgdG8gYSBCU1MuIFVwb24gdGhlCisgICAgICAgIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTAorICAgICAgICBKb2luIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmCisgICAgICAgIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9TdGFydCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpSm9pblBhcmFtczogdGhlIGpvaW4gcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUpvaW5Sc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGpvaW4gb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU3RhcnQKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfSm9pblJlcQorKAorICBXRElfSm9pblJlcVBhcmFtc1R5cGUqIHB3ZGlKb2luUGFyYW1zLAorICBXRElfSm9pblJzcENiICAgICAgICAgIHdkaUpvaW5Sc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfQ29uZmlnQlNTUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2lzaGVzIHRvIGNvbmZpZ3VyZSB0aGUgbmV3bHkgYWNxdWlyZWQgb3IgaW4gcHJvY2VzcyBvZgorICAgICAgICBiZWluZyBhY3F1aXJlZCBCU1MgdG8gdGhlIEhXIC4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSQorICAgICAgICB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIENvbmZpZyBCU1MgcmVxdWVzdAorICAgICAgICBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlCisgICAgICAgIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX0pvaW5SZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaUNvbmZpZ0JTU1BhcmFtczogdGhlIGNvbmZpZyBCU1MgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUNvbmZpZ0JTU1JzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgY29uZmlnIEJTUyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Kb2luUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0NvbmZpZ0JTU1JlcQorKAorICBXRElfQ29uZmlnQlNTUmVxUGFyYW1zVHlwZSogcHdkaUNvbmZpZ0JTU1BhcmFtcywKKyAgV0RJX0NvbmZpZ0JTU1JzcENiICAgICAgICAgIHdkaUNvbmZpZ0JTU1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX0RlbEJTU1JlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgaXMgCisgICAgICAgIGRpc3Nhc29jaWF0aW5nIGZyb20gdGhlIEJTUyBhbmQgd2lzaGVzIHRvIG5vdGlmeSBIVy4KKyAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZAorICAgICAgICBzZW5kIGEgSEFMIERlbCBCU1MgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX0NvbmZpZ0JTU1JlcSBvciBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlEZWxCU1NQYXJhbXM6IHRoZSBkZWwgQlNTIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5IAorICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlEZWxCU1NSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIGRlbCBic3Mgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfQ29uZmlnQlNTUmVxLCBXRElfUG9zdEFzc29jUmVxIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9EZWxCU1NSZXEKKygKKyAgV0RJX0RlbEJTU1JlcVBhcmFtc1R5cGUqIHB3ZGlEZWxCU1NQYXJhbXMsCisgIFdESV9EZWxCU1NSc3BDYiAgICAgICAgICB3ZGlEZWxCU1NSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworLyoqCisgQGJyaWVmIFdESV9Qb3N0QXNzb2NSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIGhhcyAKKyAgICAgICAgYXNzb2NpYXRlZCB0byBhIEJTUyBhbmQgd2lzaGVzIHRvIGNvbmZpZ3VyZSBIVyBmb3IKKyAgICAgICAgYXNzb2NpYXRlZCBzdGF0ZS4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwKKyAgICAgICAgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIFBvc3QgQXNzb2MgcmVxdWVzdCBtZXNzYWdlIHRvCisgICAgICAgIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX0pvaW5SZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaVBvc3RBc3NvY1JlcVBhcmFtczogdGhlIGFzc29jIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVBvc3RBc3NvY1JzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgcG9zdCBhc3NvYyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Kb2luUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1Bvc3RBc3NvY1JlcQorKAorICBXRElfUG9zdEFzc29jUmVxUGFyYW1zVHlwZSogcHdkaVBvc3RBc3NvY1JlcVBhcmFtcywKKyAgV0RJX1Bvc3RBc3NvY1JzcENiICAgICAgICAgIHdkaVBvc3RBc3NvY1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX0RlbFNUQVJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgd2hlbiBhbiAKKyAgICAgICAgYXNzb2NpYXRpb24gd2l0aCBhbm90aGVyIFNUQSBoYXMgZW5kZWQgYW5kIHRoZSBzdGF0aW9uCisgICAgICAgIG11c3QgYmUgZGVsZXRlZCBmcm9tIEhXLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZQorICAgICAgICBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgRGVsIFNUQSByZXF1ZXN0CisgICAgICAgIG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUKKyAgICAgICAgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlEZWxTVEFQYXJhbXM6IHRoZSBEZWwgU1RBIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5IAorICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlEZWxTVEFSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIGRlbCBTVEEgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0RlbFNUQVJlcQorKAorICBXRElfRGVsU1RBUmVxUGFyYW1zVHlwZSogcHdkaURlbFNUQVBhcmFtcywKKyAgV0RJX0RlbFNUQVJzcENiICAgICAgICAgIHdkaURlbFNUQVJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVVJJVFkgQVBJcworIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgV0RJX1NldEJTU0tleVJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgaXRvIAorICAgICAgICBpbnN0YWxsIGEgQlNTIGVuY3J5cHRpb24ga2V5IG9uIHRoZSBIVy4gVXBvbiB0aGUgY2FsbCBvZgorICAgICAgICB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIFN0YXJ0CisgICAgICAgIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcworICAgICAgICBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaVNldEJTU0tleVBhcmFtczogdGhlIEJTUyBLZXkgc2V0IHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlTZXRCU1NLZXlSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHNldCBCU1MgS2V5IG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZXRCU1NLZXlSZXEKKygKKyAgV0RJX1NldEJTU0tleVJlcVBhcmFtc1R5cGUqIHB3ZGlTZXRCU1NLZXlQYXJhbXMsCisgIFdESV9TZXRCU1NLZXlSc3BDYiAgICAgICAgICB3ZGlTZXRCU1NLZXlSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworCisvKioKKyBAYnJpZWYgV0RJX1JlbW92ZUJTU0tleVJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgdG8KKyAgICAgICAgdW5pbnN0YWxsIGEgQlNTIGtleSBmcm9tIEhXLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJCisgICAgICAgIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgUmVtb3ZlIEJTUyBLZXkKKyAgICAgICAgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzCisgICAgICAgIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1NldEJTU0tleVJlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpUmVtb3ZlQlNTS2V5UGFyYW1zOiB0aGUgcmVtb3ZlIEJTUyBrZXkgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVJlbW92ZUJTU0tleVJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgcmVtb3ZlIEJTUyBrZXkgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20KKyAgICAgICAgdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU2V0QlNTS2V5UmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1JlbW92ZUJTU0tleVJlcQorKAorICBXRElfUmVtb3ZlQlNTS2V5UmVxUGFyYW1zVHlwZSogcHdkaVJlbW92ZUJTU0tleVBhcmFtcywKKyAgV0RJX1JlbW92ZUJTU0tleVJzcENiICAgICAgICAgIHdkaVJlbW92ZUJTU0tleVJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisKKy8qKgorIEBicmllZiBXRElfU2V0U1RBS2V5UmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBpcyAKKyAgICAgICAgcmVhZHkgdG8gaW5zdGFsbCBhIFNUQShhc3QpIGVuY3J5cHRpb24ga2V5IGluIEhXLiBVcG9uCisgICAgICAgIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYQorICAgICAgICBIQUwgU2V0IFNUQSBLZXkgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpU2V0U1RBS2V5UGFyYW1zOiB0aGUgc2V0IFNUQSBrZXkgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVNldFNUQUtleVJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgc2V0IFNUQSBrZXkgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NldFNUQUtleVJlcQorKAorICBXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZSogcHdkaVNldFNUQUtleVBhcmFtcywKKyAgV0RJX1NldFNUQUtleVJzcENiICAgICAgICAgIHdkaVNldFNUQUtleVJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisKKy8qKgorIEBicmllZiBXRElfUmVtb3ZlU1RBS2V5UmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2FudHMgdG8gdW5pc3RhbGwgYSBwcmV2aW91c2x5IHNldCBTVEEga2V5IGluIEhXLiBVcG9uCisgICAgICAgIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYQorICAgICAgICBIQUwgUmVtb3ZlIFNUQSBLZXkgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1NldFNUQUtleVJlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpUmVtb3ZlU1RBS2V5UGFyYW1zOiB0aGUgcmVtb3ZlIFNUQSBrZXkgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVJlbW92ZVNUQUtleVJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgcmVtb3ZlIFNUQSBrZXkgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20KKyAgICAgICAgdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU2V0U1RBS2V5UmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1JlbW92ZVNUQUtleVJlcQorKAorICBXRElfUmVtb3ZlU1RBS2V5UmVxUGFyYW1zVHlwZSogcHdkaVJlbW92ZVNUQUtleVBhcmFtcywKKyAgV0RJX1JlbW92ZVNUQUtleVJzcENiICAgICAgICAgIHdkaVJlbW92ZVNUQUtleVJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX1NldFNUQUJjYXN0S2V5UmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2FudHMgdG8gaW5zdGFsbCBhIFNUQSBCY2FzdCBlbmNyeXB0aW9uIGtleSBvbiB0aGUgSFcuCisgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQKKyAgICAgICAgc2VuZCBhIEhBTCBTdGFydCByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpU2V0U1RBQmNhc3RLZXlQYXJhbXM6IHRoZSBCU1MgS2V5IHNldCBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU2V0U1RBQmNhc3RLZXlSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHNldCBCU1MgS2V5IG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZXRTVEFCY2FzdEtleVJlcQorKAorICBXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZSogcHdkaVNldFNUQUJjYXN0S2V5UGFyYW1zLAorICBXRElfU2V0U1RBS2V5UnNwQ2IgICAgICAgICAgd2RpU2V0U1RBQmNhc3RLZXlSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworCisvKioKKyBAYnJpZWYgV0RJX1JlbW92ZVNUQUJjYXN0S2V5UmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIAorICAgICAgICBNQUMgdG8gdW5pbnN0YWxsIGEgU1RBIEJjYXN0IGtleSBmcm9tIEhXLiBVcG9uIHRoZSBjYWxsCisgICAgICAgIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgUmVtb3ZlCisgICAgICAgIFNUQSBCY2FzdCBLZXkgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1NldFNUQUJjYXN0S2V5UmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpUmVtb3ZlU1RBQmNhc3RLZXlQYXJhbXM6IHRoZSByZW1vdmUgQlNTIGtleSAKKyAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlSZW1vdmVTVEFCY2FzdEtleVJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgcmVtb3ZlIFNUQSBCY2FzdCBrZXkgb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU2V0U1RBQmNhc3RLZXlSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfUmVtb3ZlU1RBQmNhc3RLZXlSZXEKKygKKyAgV0RJX1JlbW92ZVNUQUtleVJlcVBhcmFtc1R5cGUqIHB3ZGlSZW1vdmVTVEFCY2FzdEtleVBhcmFtcywKKyAgV0RJX1JlbW92ZVNUQUtleVJzcENiICAgICAgICAgIHdkaVJlbW92ZVNUQUJjYXN0S2V5UnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfU2V0TWF4VHhQb3dlclJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciAKKyAgICAgICAgTUFDIHdhbnRzIHRvIHNldCBNYXggVHggUG93ZXIgdG8gSFcuIFVwb24gdGhlCisgICAgICAgIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTAorICAgICAgICBSZW1vdmUgU1RBIEJjYXN0IEtleSByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfU2V0U1RBQmNhc3RLZXlSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlSZW1vdmVTVEFCY2FzdEtleVBhcmFtczogdGhlIHJlbW92ZSBCU1Mga2V5IAorICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVJlbW92ZVNUQUJjYXN0S2V5UnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSByZW1vdmUgU1RBIEJjYXN0IGtleSBvcGVyYXRpb24gcmVjZWl2ZWQKKyAgICAgICAgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9TZXRNYXhUeFBvd2VyUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NldE1heFR4UG93ZXJSZXEKKygKKyAgV0RJX1NldE1heFR4UG93ZXJQYXJhbXNUeXBlKiAgIHB3ZGlTZXRNYXhUeFBvd2VyUGFyYW1zLAorICBXREFfU2V0TWF4VHhQb3dlclJzcENiICAgICAgICAgd2RpUmVxU3RhdHVzQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisvKioKKyBAYnJpZWYgV0RJX1RTTVN0YXRzUmVxIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSB1cHBlciBNQUMgdG8gZmV0Y2ggCisgICAgICAgIFRyYWZmaWMgU3RyZWFtIG1ldHJpY3MuIAorICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBAcGFyYW0gd2RpQWRkVHNSZXFQYXJhbXM6IHRoZSBhZGQgVFMgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpQWRkVHNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGFkZCBUUyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfVFNNU3RhdHNSZXEKKygKKyAgV0RJX1RTTVN0YXRzUmVxUGFyYW1zVHlwZSogcHdkaVRzbVN0YXRzUmVxUGFyYW1zLAorICBXRElfVHNtUnNwQ2IgICAgICAgICAgd2RpVHNtU3RhdHNSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRb1MgYW5kIEJBIEFQSXMKKyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgQGJyaWVmIFdESV9BZGRUU1JlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgdG8gaW5mb3JtCisgICAgICAgIHRoZSBkZXZpY2Ugb2YgYSBzdWNjZXNzZnVsIGFkZCBUU3BlYyBuZWdvdGlhdGlvbi4gSFcKKyAgICAgICAgbmVlZHMgdG8gcmVjZWl2ZSB0aGUgVFNwZWMgSW5mbyBmcm9tIHRoZSBVTUFDIGluIG9yZGVyCisgICAgICAgIHRvIGNvbmZpZ3VyZSBwcm9wZXJseSB0aGUgUW9TIGRhdGEgdHJhZmZpYy4gVXBvbiB0aGUKKyAgICAgICAgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMCisgICAgICAgIEFkZCBUUyByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZgorICAgICAgICBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlBZGRUc1JlcVBhcmFtczogdGhlIGFkZCBUUyBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlBZGRUc1JzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZSBvZgorICAgICAgICB0aGUgYWRkIFRTIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9BZGRUU1JlcQorKAorICBXRElfQWRkVFNSZXFQYXJhbXNUeXBlKiBwd2RpQWRkVHNSZXFQYXJhbXMsCisgIFdESV9BZGRUc1JzcENiICAgICAgICAgIHdkaUFkZFRzUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworCisKKy8qKgorIEBicmllZiBXRElfRGVsVFNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIGhhcyBlbmRlZAorICAgICAgICBhZG1pc3Npb24gb24gYSBzcGVjaWZpYyBBQy4gVGhpcyBpcyB0byBpbmZvcm0gSFcgdGhhdAorICAgICAgICBRb1MgdHJhZmZpYyBwYXJhbWV0ZXJzIG11c3QgYmUgcmVzdC4gVXBvbiB0aGUgY2FsbCBvZgorICAgICAgICB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIERlbCBUUworICAgICAgICByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMKKyAgICAgICAgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfQWRkVFNSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaURlbFRzUmVxUGFyYW1zOiB0aGUgZGVsIFRTIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaURlbFRzUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlIG9mCisgICAgICAgIHRoZSBkZWwgVFMgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfQWRkVFNSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfRGVsVFNSZXEKKygKKyAgV0RJX0RlbFRTUmVxUGFyYW1zVHlwZSogcHdkaURlbFRzUmVxUGFyYW1zLAorICBXRElfRGVsVHNSc3BDYiAgICAgICAgICB3ZGlEZWxUc1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKworCisvKioKKyBAYnJpZWYgV0RJX1VwZGF0ZUVEQ0FQYXJhbXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3aXNoZXMgdG8gdXBkYXRlIHRoZSBFRENBIHBhcmFtZXRlcnMgdXNlZCBieSBIVyBmb3IgUW9TCisgICAgICAgIGRhdGEgdHJhZmZpYy4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwKKyAgICAgICAgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIFVwZGF0ZSBFRENBIFBhcmFtcyByZXF1ZXN0CisgICAgICAgIG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUKKyAgICAgICAgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlVcGRhdGVFRENBUGFyYW1zOiB0aGUgc3RhcnQgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgCisgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVVwZGF0ZUVEQ0FQYXJhbXNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHN0YXJ0IG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9VcGRhdGVFRENBUGFyYW1zCisoCisgIFdESV9VcGRhdGVFRENBUGFyYW1zVHlwZSogICAgcHdkaVVwZGF0ZUVEQ0FQYXJhbXMsCisgIFdESV9VcGRhdGVFRENBUGFyYW1zUnNwQ2IgICAgd2RpVXBkYXRlRURDQVBhcmFtc1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworCisKKy8qKgorIEBicmllZiBXRElfQWRkQkFTZXNzaW9uUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBoYXMgc2V0dXAKKyAgICAgICAgc3VjY2Vzc2Z1bGx5IGEgQkEgc2Vzc2lvbiBhbmQgbmVlZHMgdG8gbm90aWZ5IHRoZSBIVyBmb3IKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHNldHRpbmdzIHRvIHRha2UgcGxhY2UuIFVwb24gdGhlIGNhbGwgb2YKKyAgICAgICAgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBBZGQgQkEKKyAgICAgICAgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzCisgICAgICAgIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpQWRkQkFSZXFQYXJhbXM6IHRoZSBhZGQgQkEgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpQWRkQkFSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGFkZCBCQSBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfQWRkQkFTZXNzaW9uUmVxCisoCisgIFdESV9BZGRCQVNlc3Npb25SZXFQYXJhbXNUeXBlKiBwd2RpQWRkQkFTZXNzaW9uUmVxUGFyYW1zLAorICBXRElfQWRkQkFTZXNzaW9uUnNwQ2IgICAgICAgICAgd2RpQWRkQkFTZXNzaW9uUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFdESV9EZWxCQVJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgd2FudHMgdG8gCisgICAgICAgIGluZm9ybSBIVyB0aGF0IGl0IGhhcyBkZWxldGVkIGEgcHJldmlvdXNseSBjcmVhdGVkIEJBCisgICAgICAgIHNlc3Npb24uIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwKKyAgICAgICAgcGFjayBhbmQgc2VuZCBhIEhBTCBEZWwgQkEgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlcgorICAgICAgICBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX0FkZEJBUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlEZWxCQVJlcVBhcmFtczogdGhlIGRlbCBCQSBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlEZWxCQVJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZSBvZgorICAgICAgICB0aGUgZGVsIEJBIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX0FkZEJBUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0RlbEJBUmVxCisoCisgIFdESV9EZWxCQVJlcVBhcmFtc1R5cGUqIHB3ZGlEZWxCQVJlcVBhcmFtcywKKyAgV0RJX0RlbEJBUnNwQ2IgICAgICAgICAgd2RpRGVsQkFSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1JlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgd2FudHMgdG8gCisgICAgICAgIGluZm9ybSBIVyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSBiZWFjb24gcGFyYW1ldGVycworICAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbAorICAgICAgICBwYWNrIGFuZCBzZW5kIGEgVXBkYXRlQmVhY29uIFBhcmFtcyBtZXNzYWdlIHRvIHRoZSBsb3dlcgorICAgICAgICBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1R5cGU6IHRoZSBVcGRhdGUgQmVhY29uIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIFdESV9VcGRhdGVCZWFjb25QYXJhbXNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIFVwZGF0ZSBCZWFjb24gUGFyYW1zIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX0FkZEJBUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCisKK1dESV9TdGF0dXMgCitXRElfVXBkYXRlQmVhY29uUGFyYW1zUmVxCisoCisgIFdESV9VcGRhdGVCZWFjb25QYXJhbXNUeXBlICogICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLAorICBXRElfVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2IgICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFdESV9TZW5kQmVhY29uUGFyYW1zUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB3YW50cyB0byAKKyAgICAgICAgdXBkYXRlIHRoZSBiZWFjb24gdGVtcGxhdGUgdG8gYmUgdHJhbnNtaXR0ZWQgYXMgQlQgTUFQIFNUQS9JQlNTL1NvZnQgQVAKKyAgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwKKyAgICAgICAgcGFjayBhbmQgc2VuZCB0aGUgYmVhY29uIFRlbXBsYXRlICBtZXNzYWdlIHRvIHRoZSBsb3dlcgorICAgICAgICBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1NlbmRCZWFjb25QYXJhbXNSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIFdESV9TZW5kQmVhY29uUGFyYW1zVHlwZTogdGhlIFVwZGF0ZSBCZWFjb24gcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgV0RJX1NlbmRCZWFjb25QYXJhbXNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIFNlbmQgQmVhY29uIFBhcmFtcyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9BZGRCQVJlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworCitXRElfU3RhdHVzIAorV0RJX1NlbmRCZWFjb25QYXJhbXNSZXEKKygKKyAgV0RJX1NlbmRCZWFjb25QYXJhbXNUeXBlKiAgICBwd2RpU2VuZEJlYWNvblBhcmFtcywKKyAgV0RJX1NlbmRCZWFjb25QYXJhbXNSc3BDYiAgICB3ZGlTZW5kQmVhY29uUGFyYW1zUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisKKy8qKgorIEBicmllZiBXRElfVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZVJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSAKKyAgICAgICAgdXBwZXIgTUFDIHdhbnRzIHRvIHVwZGF0ZSB0aGUgcHJvYmUgcmVzcG9uc2UgdGVtcGxhdGUgdG8KKyAgICAgICAgYmUgdHJhbnNtaXR0ZWQgYXMgU29mdCBBUAorICAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbAorICAgICAgICBwYWNrIGFuZCBzZW5kIHRoZSBwcm9iZSByc3AgdGVtcGxhdGUgIG1lc3NhZ2UgdG8gdGhlCisgICAgICAgIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKworIEBwYXJhbSBwd2RpVXBkYXRlUHJvYmVSc3BQYXJhbXM6IHRoZSBVcGRhdGUgQmVhY29uIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlTZW5kQmVhY29uUGFyYW1zUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBTZW5kIEJlYWNvbiBQYXJhbXMgb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfQWRkQkFSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KKworV0RJX1N0YXR1cyAKK1dESV9VcGRhdGVQcm9iZVJzcFRlbXBsYXRlUmVxCisoCisgIFdESV9VcGRhdGVQcm9iZVJzcFRlbXBsYXRlUGFyYW1zVHlwZSogICAgcHdkaVVwZGF0ZVByb2JlUnNwUGFyYW1zLAorICBXRElfVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZVJzcENiICAgICAgICAgIHdkaVNlbmRCZWFjb25QYXJhbXNSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorLyoqCisgQGJyaWVmIFdESV9TZXRQMlBHT05PQVJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSAKKyAgICAgICAgdXBwZXIgTUFDIHdhbnRzIHRvIHNlbmQgTm90aWNlIG9mIEFic2VuY2UKKyAgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwKKyAgICAgICAgcGFjayBhbmQgc2VuZCB0aGUgcHJvYmUgcnNwIHRlbXBsYXRlICBtZXNzYWdlIHRvIHRoZQorICAgICAgICBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisKKyBAcGFyYW0gcHdkaVVwZGF0ZVByb2JlUnNwUGFyYW1zOiB0aGUgVXBkYXRlIEJlYWNvbiBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU2VuZEJlYWNvblBhcmFtc1JzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgU2VuZCBCZWFjb24gUGFyYW1zIG9wZXJhdGlvbiByZWNlaXZlZAorICAgICAgICBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX0FkZEJBUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfU2V0UDJQR09OT0FSZXEKKygKKyAgV0RJX1NldFAyUEdPTk9BUmVxUGFyYW1zVHlwZSogICAgcHdkaVAyUEdPTk9BUmVxUGFyYW1zLAorICBXRElfU2V0UDJQR09OT0FSZXFQYXJhbXNSc3BDYiAgICB3ZGlQMlBHT05PQVJlcVBhcmFtc1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisjZW5kaWYKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlciBTYXZlIEFQSXMKKyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgQGJyaWVmIFdESV9TZXRQd3JTYXZlQ2ZnUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2FudHMgdG8gc2V0IHRoZSBwb3dlciBzYXZlIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMgb2YKKyAgICAgICAgdGhlIFdMQU4gRGV2aWNlLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTAorICAgICAgICB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgVXBkYXRlIENGRyByZXF1ZXN0IG1lc3NhZ2UgdG8KKyAgICAgICAgdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfU3RhcnQgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlQb3dlclNhdmVDZmc6IHRoZSBwb3dlciBzYXZlIGNmZyBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU2V0UHdyU2F2ZUNmZ0NiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgc2V0IHBvd2VyIHNhdmUgY2ZnIG9wZXJhdGlvbiByZWNlaXZlZAorICAgICAgICBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1N0YXJ0CisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwgIAorKi8gCitXRElfU3RhdHVzIAorV0RJX1NldFB3clNhdmVDZmdSZXEKKygKKyAgV0RJX1VwZGF0ZUNmZ1JlcVBhcmFtc1R5cGUqICAgcHdkaVBvd2VyU2F2ZUNmZywKKyAgV0RJX1NldFB3clNhdmVDZmdDYiAgICAgd2RpU2V0UHdyU2F2ZUNmZ0NiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfRW50ZXJJbXBzUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB0byAKKyAgICAgICAgcmVxdWVzdCB0aGUgZGV2aWNlIHRvIGdldCBpbnRvIElNUFMgcG93ZXIgc3RhdGUuIFVwb24KKyAgICAgICAgdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgc2VuZCBhIEhBTCBFbnRlcgorICAgICAgICBJTVBTIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTAorICAgICAgICBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworICAKKyBAcGFyYW0gd2RpRW50ZXJJbXBzUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIAorICAgICAgICByZXNwb25zZSBvZiB0aGUgRW50ZXIgSU1QUyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9TdGFydAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9FbnRlckltcHNSZXEKKygKKyAgIFdESV9FbnRlckltcHNSc3BDYiAgd2RpRW50ZXJJbXBzUnNwQ2IsCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfRXhpdEltcHNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHRvIAorICAgICAgICByZXF1ZXN0IHRoZSBkZXZpY2UgdG8gZ2V0IG91dCBvZiBJTVBTIHBvd2VyIHN0YXRlLiBVcG9uCisgICAgICAgIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHNlbmQgYSBIQUwgRXhpdAorICAgICAgICBJTVBTIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTAorICAgICAgICBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIAorCisgQHBhcmFtIHdkaUV4aXRJbXBzUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlIAorICAgICAgICBvZiB0aGUgRXhpdCBJTVBTIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1N0YXJ0CisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0V4aXRJbXBzUmVxCisoCisgICBXRElfRXhpdEltcHNSc3BDYiAgd2RpRXhpdEltcHNSc3BDYiwKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworLyoqCisgQGJyaWVmIFdESV9FbnRlckJtcHNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHRvIAorICAgICAgICByZXF1ZXN0IHRoZSBkZXZpY2UgdG8gZ2V0IGludG8gQk1QUyBwb3dlciBzdGF0ZS4gVXBvbgorICAgICAgICB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEKKyAgICAgICAgSEFMIEVudGVyIEJNUFMgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gcHdkaUVudGVyQm1wc1JlcVBhcmFtczogdGhlIEVudGVyIEJNUFMgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUVudGVyQm1wc1JzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgRW50ZXIgQk1QUyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfRW50ZXJCbXBzUmVxCisoCisgICBXRElfRW50ZXJCbXBzUmVxUGFyYW1zVHlwZSAqcHdkaUVudGVyQm1wc1JlcVBhcmFtcywKKyAgIFdESV9FbnRlckJtcHNSc3BDYiAgd2RpRW50ZXJCbXBzUnNwQ2IsCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfRXhpdEJtcHNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHRvIAorICAgICAgICByZXF1ZXN0IHRoZSBkZXZpY2UgdG8gZ2V0IG91dCBvZiBCTVBTIHBvd2VyIHN0YXRlLiBVcG9uCisgICAgICAgIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYQorICAgICAgICBIQUwgRXhpdCBCTVBTIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlFeGl0Qm1wc1JlcVBhcmFtczogdGhlIEV4aXQgQk1QUyBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpRXhpdEJtcHNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIEV4aXQgQk1QUyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfRXhpdEJtcHNSZXEKKygKKyAgIFdESV9FeGl0Qm1wc1JlcVBhcmFtc1R5cGUgKnB3ZGlFeGl0Qm1wc1JlcVBhcmFtcywKKyAgIFdESV9FeGl0Qm1wc1JzcENiICB3ZGlFeGl0Qm1wc1JzcENiLAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX0VudGVyVWFwc2RSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHRvIAorICAgICAgICByZXF1ZXN0IHRoZSBkZXZpY2UgdG8gZ2V0IGludG8gVUFQU0QgcG93ZXIgc3RhdGUuIFVwb24KKyAgICAgICAgdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhCisgICAgICAgIEhBTCBFbnRlciBVQVBTRCByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyBXRElfU2V0VWFwc2RBY1BhcmFtc1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIAorIEBwYXJhbSBwd2RpRW50ZXJVYXBzZFJlcVBhcmFtczogdGhlIEVudGVyIFVBUFNEIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlFbnRlclVhcHNkUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBFbnRlciBVQVBTRCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEsIFdESV9TZXRVYXBzZEFjUGFyYW1zUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0VudGVyVWFwc2RSZXEKKygKKyAgIFdESV9FbnRlclVhcHNkUmVxUGFyYW1zVHlwZSAqcHdkaUVudGVyVWFwc2RSZXFQYXJhbXMsCisgICBXRElfRW50ZXJVYXBzZFJzcENiICB3ZGlFbnRlclVhcHNkUnNwQ2IsCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfRXhpdFVhcHNkUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB0byAKKyAgICAgICAgcmVxdWVzdCB0aGUgZGV2aWNlIHRvIGdldCBvdXQgb2YgVUFQU0QgcG93ZXIgc3RhdGUuIFVwb24KKyAgICAgICAgdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgc2VuZCBhIEhBTCBFeGl0CisgICAgICAgIFVBUFNEIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmCisgICAgICAgIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaUV4aXRVYXBzZFJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSAKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIEV4aXQgVUFQU0Qgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0V4aXRVYXBzZFJlcQorKAorICAgV0RJX0V4aXRVYXBzZFJzcENiICB3ZGlFeGl0VWFwc2RSc3BDYiwKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworLyoqCisgQGJyaWVmIFdESV9VcGRhdGVVYXBzZFBhcmFtc1JlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciAKKyAgICAgICAgTUFDIHdhbnRzIHRvIHNldCB0aGUgVUFQU0QgcmVsYXRlZCBjb25maWd1cmF0aW9ucworICAgICAgICBvZiBhbiBhc3NvY2lhdGVkIFNUQSAod2hpbGUgYWN0aW5nIGFzIGFuIEFQKSB0byB0aGUgV0xBTgorICAgICAgICBEZXZpY2UuIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjaworICAgICAgICBhbmQgc2VuZCBhIEhBTCBVcGRhdGUgVUFQU0QgcGFyYW1zIHJlcXVlc3QgbWVzc2FnZSB0bworICAgICAgICB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Db25maWdCU1NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlVcGRhdGVVYXBzZFJlcVBhcmFtczogdGhlIFVBUFNEIHBhcmFtZXRlcnMgCisgICAgICAgICAgICAgICAgICAgICAgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlVcGRhdGVVYXBzZFBhcmFtc0NiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgdXBkYXRlIFVBUFNEIHBhcmFtcyBvcGVyYXRpb24gcmVjZWl2ZWQKKyAgICAgICAgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Db25maWdCU1NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfVXBkYXRlVWFwc2RQYXJhbXNSZXEKKygKKyAgIFdESV9VcGRhdGVVYXBzZFJlcVBhcmFtc1R5cGUgKnB3ZGlVcGRhdGVVYXBzZFJlcVBhcmFtcywKKyAgIFdESV9VcGRhdGVVYXBzZFBhcmFtc0NiICB3ZGlVcGRhdGVVYXBzZFBhcmFtc0NiLAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX1NldFVhcHNkQWNQYXJhbXNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgCisgICAgICAgIE1BQyB3YW50cyB0byBzZXQgdGhlIFVBUFNEIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMgYmVmb3JlCisgICAgICAgIHJlcXVlc3RpbmcgZm9yIGVudGVyIFVBUFNEIHBvd2VyIHN0YXRlIHRvIHRoZSBXTEFOCisgICAgICAgIERldmljZS4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrCisgICAgICAgIGFuZCBzZW5kIGEgSEFMIFNldCBVQVBTRCBwYXJhbXMgcmVxdWVzdCBtZXNzYWdlIHRvCisgICAgICAgIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gcHdkaVVhcHNkSW5mbzogdGhlIFVBUFNEIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVNldFVhcHNkQWNQYXJhbXNDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHNldCBVQVBTRCBwYXJhbXMgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20KKyAgICAgICAgdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NldFVhcHNkQWNQYXJhbXNSZXEKKygKKyAgV0RJX1NldFVhcHNkQWNQYXJhbXNSZXFQYXJhbXNUeXBlKiAgICAgIHB3ZGlQb3dlclNhdmVDZmcsCisgIFdESV9TZXRVYXBzZEFjUGFyYW1zQ2IgIHdkaVNldFVhcHNkQWNQYXJhbXNDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX0NvbmZpZ3VyZVJ4cEZpbHRlclJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciAKKyAgICAgICAgTUFDIHdhbnRzIHRvIHNldC9yZXNldCB0aGUgUlhQIGZpbHRlcnMgZm9yIHJlY2VpdmVkIHBrdHMKKyAgICAgICAgKE1DLCBCQyBldGMuKS4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrCisgICAgICAgIGFuZCBzZW5kIGEgSEFMIGNvbmZpZ3VyZSBSWFAgZmlsdGVyIHJlcXVlc3QgbWVzc2FnZSB0bworICAgICAgICB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtLgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworICAKKyBAcGFyYW0gcHdkaUNvbmZpZ3VyZVJ4cEZpbHRlclJlcVBhcmFtczogdGhlIFJYUCAKKyAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUNvbmZpZ3VyZVJ4cEZpbHRlckNiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgY29uZmlndXJlIFJYUCBmaWx0ZXIgb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0NvbmZpZ3VyZVJ4cEZpbHRlclJlcQorKAorICAgV0RJX0NvbmZpZ3VyZVJ4cEZpbHRlclJlcVBhcmFtc1R5cGUgKnB3ZGlDb25maWd1cmVSeHBGaWx0ZXJSZXFQYXJhbXMsCisgICBXRElfQ29uZmlndXJlUnhwRmlsdGVyQ2IgICAgICAgICAgICAgd2RpQ29uZmlndXJlUnhwRmlsdGVyQ2IsCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX1NldEJlYWNvbkZpbHRlclJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMKKyAgICAgICAgd2FudHMgdG8gc2V0IHRoZSBiZWFjb24gZmlsdGVycyB3aGlsZSBpbiBwb3dlciBzYXZlLgorICAgICAgICBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kCisgICAgICAgIHNlbmQgYSBCZWFjb24gZmlsdGVyIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUKKyAgICAgICAgbG93ZXIgUklWQSBzdWItc3lzdGVtLgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworICAKKyBAcGFyYW0gcHdkaUJlYWNvbkZpbHRlclJlcVBhcmFtczogdGhlIGJlYWNvbiAKKyAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUJlYWNvbkZpbHRlckNiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgc2V0IGJlYWNvbiBmaWx0ZXIgb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NldEJlYWNvbkZpbHRlclJlcQorKAorICAgV0RJX0JlYWNvbkZpbHRlclJlcVBhcmFtc1R5cGUgICAqcHdkaUJlYWNvbkZpbHRlclJlcVBhcmFtcywKKyAgIFdESV9TZXRCZWFjb25GaWx0ZXJDYiAgICAgICAgICAgIHdkaUJlYWNvbkZpbHRlckNiLAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX1JlbUJlYWNvbkZpbHRlclJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMKKyAgICAgICAgd2FudHMgdG8gcmVtb3ZlIHRoZSBiZWFjb24gZmlsdGVyIGZvciBwZXJ0aWN1bGFyIElFCisgICAgICAgIHdoaWxlIGluIHBvd2VyIHNhdmUuIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4KKyAgICAgICAgREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIHJlbW92ZSBCZWFjb24gZmlsdGVyIHJlcXVlc3QKKyAgICAgICAgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtLgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworICAKKyBAcGFyYW0gcHdkaUJlYWNvbkZpbHRlclJlcVBhcmFtczogdGhlIGJlYWNvbiAKKyAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUJlYWNvbkZpbHRlckNiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgcmVtb3ZlIGJlYWNvbiBmaWx0ZXIgb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1JlbUJlYWNvbkZpbHRlclJlcQorKAorICAgV0RJX1JlbUJlYWNvbkZpbHRlclJlcVBhcmFtc1R5cGUgKnB3ZGlCZWFjb25GaWx0ZXJSZXFQYXJhbXMsCisgICBXRElfUmVtQmVhY29uRmlsdGVyQ2IgICAgICAgICAgICAgd2RpQmVhY29uRmlsdGVyQ2IsCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX1NldFJTU0lUaHJlc2hvbGRzUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIAorICAgICAgICBNQUMgd2FudHMgdG8gc2V0IHRoZSBSU1NJIHRocmVzaG9sZHMgcmVsYXRlZAorICAgICAgICBjb25maWd1cmF0aW9ucyB3aGlsZSBpbiBwb3dlciBzYXZlLiBVcG9uIHRoZSBjYWxsIG9mCisgICAgICAgIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgU2V0IFJTU0kKKyAgICAgICAgdGhyZXNob2xkcyByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpVWFwc2RJbmZvOiB0aGUgVUFQU0QgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU2V0VWFwc2RBY1BhcmFtc0NiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgc2V0IFVBUFNEIHBhcmFtcyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbQorICAgICAgICB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU2V0UlNTSVRocmVzaG9sZHNSZXEKKygKKyAgV0RJX1NldFJTU0lUaHJlc2hvbGRzUmVxUGFyYW1zVHlwZSogICAgICBwd2RpUlNTSVRocmVzaG9sZHNQYXJhbXMsCisgIFdESV9TZXRSU1NJVGhyZXNob2xkc0NiICAgICAgICAgICAgICAgICAgd2RpU2V0UlNTSVRocmVzaG9sZHNDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfSG9zdE9mZmxvYWRSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3YW50cyB0byBzZXQgdGhlIGZpbHRlciB0byBtaW5pbWl6ZSB1bm5lY2Vzc2FyeSBob3N0CisgICAgICAgIHdha2V1cCBkdWUgdG8gYnJvYWRjYXN0IHRyYWZmaWMgd2hpbGUgaW4gcG93ZXIgc2F2ZS4KKyAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZAorICAgICAgICBzZW5kIGEgSEFMIGhvc3Qgb2ZmbG9hZCByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlCisgICAgICAgIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpSG9zdE9mZmxvYWRQYXJhbXM6IHRoZSBob3N0IG9mZmxvYWQgYXMgc3BlY2lmaWVkIAorICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlIb3N0T2ZmbG9hZENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZQorICAgICAgICBvZiB0aGUgaG9zdCBvZmZsb2FkIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9Ib3N0T2ZmbG9hZFJlcQorKAorICBXRElfSG9zdE9mZmxvYWRSZXFQYXJhbXNUeXBlKiAgICAgIHB3ZGlIb3N0T2ZmbG9hZFBhcmFtcywKKyAgV0RJX0hvc3RPZmZsb2FkQ2IgICAgICAgICAgICAgICAgICB3ZGlIb3N0T2ZmbG9hZENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworLyoqCisgQGJyaWVmIFdESV9LZWVwQWxpdmVSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3YW50cyB0byBzZXQgdGhlIGZpbHRlciB0byBzZW5kIE5VTEwgb3IgdW5zb2xpY2l0ZWQgQVJQIHJlc3BvbnNlcyAKKyAgICAgICAgYW5kIG1pbmltaXplIHVubmVjZXNzYXJ5IGhvc3Qgd2FrZXVwcyBkdWUgdG8gd2hpbGUgaW4gcG93ZXIgc2F2ZS4KKyAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZAorICAgICAgICBzZW5kIGEgSEFMIEtlZXAgQWxpdmUgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZQorICAgICAgICBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gcHdkaUtlZXBBbGl2ZVBhcmFtczogdGhlIEtlZXAgQWxpdmUgYXMgc3BlY2lmaWVkIAorICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlLZWVwQWxpdmVDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIEtlZXAgQWxpdmUgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0tlZXBBbGl2ZVJlcQorKAorICBXRElfS2VlcEFsaXZlUmVxUGFyYW1zVHlwZSogICAgICAgIHB3ZGlLZWVwQWxpdmVQYXJhbXMsCisgIFdESV9LZWVwQWxpdmVDYiAgICAgICAgICAgICAgICAgICAgd2RpS2VlcEFsaXZlQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX1dvd2xBZGRCY1B0cm5SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3YW50cyB0byBzZXQgdGhlIFdvd2wgQmNhc3QgcHRybiB0byBtaW5pbWl6ZSB1bm5lY2Vzc2FyeQorICAgICAgICBob3N0IHdha2V1cCBkdWUgdG8gYnJvYWRjYXN0IHRyYWZmaWMgd2hpbGUgaW4gcG93ZXIKKyAgICAgICAgc2F2ZS4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrCisgICAgICAgIGFuZCBzZW5kIGEgSEFMIFdvd2wgQmNhc3QgcHRybiByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlCisgICAgICAgIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpV293bEFkZEJjUHRyblBhcmFtczogdGhlIFdvd2wgYmNhc3QgcHRybiBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVdvd2xBZGRCY1B0cm5DYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIGFkZCBXb3dsIGJjYXN0IHB0cm4gb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1dvd2xBZGRCY1B0cm5SZXEKKygKKyAgV0RJX1dvd2xBZGRCY1B0cm5SZXFQYXJhbXNUeXBlKiAgICBwd2RpV293bEFkZEJjUHRyblBhcmFtcywKKyAgV0RJX1dvd2xBZGRCY1B0cm5DYiAgICAgICAgICAgICAgICB3ZGlXb3dsQWRkQmNQdHJuQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX1dvd2xEZWxCY1B0cm5SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3YW50cyB0byBjbGVhciB0aGUgV293bCBCY2FzdCBwdHJuLiBVcG9uIHRoZSBjYWxsIG9mCisgICAgICAgIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgZGVsZXRlCisgICAgICAgIFdvd2wgQmNhc3QgcHRybiByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfV293bEFkZEJjUHRyblJlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gcHdkaVdvd2xEZWxCY1B0cm5QYXJhbXM6IHRoZSBXb3dsIGJjYXN0IHB0cm4gYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlXb3dsRGVsQmNQdHJuQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBkZWwgV293bCBiY2FzdCBwdHJuIG9wZXJhdGlvbiByZWNlaXZlZAorICAgICAgICBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1dvd2xBZGRCY1B0cm5SZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfV293bERlbEJjUHRyblJlcQorKAorICBXRElfV293bERlbEJjUHRyblJlcVBhcmFtc1R5cGUqICAgIHB3ZGlXb3dsRGVsQmNQdHJuUGFyYW1zLAorICBXRElfV293bERlbEJjUHRybkNiICAgICAgICAgICAgICAgIHdkaVdvd2xEZWxCY1B0cm5DYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfV293bEVudGVyUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2FudHMgdG8gZW50ZXIgdGhlIFdvd2wgc3RhdGUgdG8gbWluaW1pemUgdW5uZWNlc3NhcnkKKyAgICAgICAgaG9zdCB3YWtldXAgd2hpbGUgaW4gcG93ZXIgc2F2ZS4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzCisgICAgICAgIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIFdvd2wgZW50ZXIKKyAgICAgICAgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzCisgICAgICAgIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gcHdkaVdvd2xFbnRlclJlcVBhcmFtczogdGhlIFdvd2wgZW50ZXIgaW5mbyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVdvd2xFbnRlclJlcUNiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgZW50ZXIgV293bCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfV293bEVudGVyUmVxCisoCisgIFdESV9Xb3dsRW50ZXJSZXFQYXJhbXNUeXBlKiAgICBwd2RpV293bEVudGVyUGFyYW1zLAorICBXRElfV293bEVudGVyUmVxQ2IgICAgICAgICAgICAgd2RpV293bEVudGVyQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfV293bEV4aXRSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3YW50cyB0byBleGl0IHRoZSBXb3dsIHN0YXRlLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJCisgICAgICAgIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgV293bCBleGl0IHJlcXVlc3QKKyAgICAgICAgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZQorICAgICAgICBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Xb3dsRW50ZXJSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlXb3dsRXhpdFJlcVBhcmFtczogdGhlIFdvd2wgZXhpdCBpbmZvIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpV293bEV4aXRSZXFDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIGV4aXQgV293bCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Xb3dsRW50ZXJSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfV293bEV4aXRSZXEKKygKKyAgV0RJX1dvd2xFeGl0UmVxQ2IgICAgICAgICAgICAgIHdkaVdvd2xFeGl0Q2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gCisgICAgICAgIHRoZSB1cHBlciBNQUMgd2FudHMgdG8gZHluYW1pY2FsbHkgYWRqdXN0cyB0aGUgbGlzdGVuCisgICAgICAgIGludGVydmFsIGJhc2VkIG9uIHRoZSBXTEFOL01TTSBhY3Rpdml0eS4gVXBvbiB0aGUgY2FsbAorICAgICAgICBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMCisgICAgICAgIGNvbmZpZ3VyZSBBcHBzIENwdSBXYWtldXAgU3RhdGUgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZQorICAgICAgICBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0uCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgIAorIEBwYXJhbSBwd2RpQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlUmVxUGFyYW1zOiB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgQXBwcyBDcHUgV2FrZXVwIFN0YXRlIGFzIHNwZWNpZmllZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlDb25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcKKyAgICAgICAgYmFjayB0aGUgcmVzcG9uc2Ugb2YgdGhlIGNvbmZpZ3VyZSBBcHBzIENwdSBXYWtldXAgU3RhdGUKKyAgICAgICAgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZVJlcQorKAorICAgV0RJX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZVJlcVBhcmFtc1R5cGUgKnB3ZGlDb25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVSZXFQYXJhbXMsCisgICBXRElfQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlQ2IgICAgICAgICAgICAgd2RpQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlQ2IsCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworLyoqCisgQGJyaWVmIFdESV9GbHVzaEFjUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB3YW50cyAKKyAgICAgICAgdG8gdG8gcGVyZm9ybSBhIGZsdXNoIG9wZXJhdGlvbiBvbiBhIGdpdmVuIEFDLiBVcG9uIHRoZQorICAgICAgICBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwKKyAgICAgICAgRmx1c2ggQUMgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYKKyAgICAgICAgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgIAorIEBwYXJhbSBwd2RpRmx1c2hBY1JlcVBhcmFtczogdGhlIEZsdXNoIEFDIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlGbHVzaEFjUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlCisgICAgICAgIG9mIHRoZSBGbHVzaCBBQyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9GbHVzaEFjUmVxCisoCisgIFdESV9GbHVzaEFjUmVxUGFyYW1zVHlwZSogcHdkaUZsdXNoQWNSZXFQYXJhbXMsCisgIFdESV9GbHVzaEFjUnNwQ2IgICAgICAgICAgd2RpRmx1c2hBY1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworLyoqCisgQGJyaWVmIFdESV9CdEFtcEV2ZW50UmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2FudHMgdG8gbm90aWZ5IHRoZSBsb3dlciBtYWMgb24gYSBCVCBBTVAgZXZlbnQuIFRoaXMgaXMKKyAgICAgICAgdG8gaW5mb3JtIEJUQy1TTE0gdGhhdCBzb21lIEJUIEFNUCBldmVudCBvY2N1cnJlZC4gVXBvbgorICAgICAgICB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEKKyAgICAgICAgSEFMIEJUIEFNUCBldmVudCByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyAgCisgQHBhcmFtIHdkaUJ0QW1wRXZlbnRSZXFQYXJhbXM6IHRoZSBCVCBBTVAgZXZlbnQgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUJ0QW1wRXZlbnRSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIEJUIEFNUCBldmVudCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9CdEFtcEV2ZW50UmVxCisoCisgIFdESV9CdEFtcEV2ZW50UGFyYW1zVHlwZSogcHdkaUJ0QW1wRXZlbnRSZXFQYXJhbXMsCisgIFdESV9CdEFtcEV2ZW50UnNwQ2IgICAgICAgd2RpQnRBbXBFdmVudFJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVFJPTCBBUElzCisgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioKKyBAYnJpZWYgV0RJX1N3aXRjaENoUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB3YW50cyAKKyAgICAgICAgdGhlIFdMQU4gSFcgdG8gY2hhbmdlIHRoZSBjdXJyZW50IGNoYW5uZWwgb2Ygb3BlcmF0aW9uLgorICAgICAgICBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kCisgICAgICAgIHNlbmQgYSBIQUwgU3RhcnQgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1N0YXJ0IG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlTd2l0Y2hDaFJlcVBhcmFtczogdGhlIHN3aXRjaCBjaCBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU3dpdGNoQ2hSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIHN3aXRjaCBjaCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9TdGFydAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9Td2l0Y2hDaFJlcQorKAorICBXRElfU3dpdGNoQ2hSZXFQYXJhbXNUeXBlKiBwd2RpU3dpdGNoQ2hSZXFQYXJhbXMsCisgIFdESV9Td2l0Y2hDaFJzcENiICAgICAgICAgIHdkaVN3aXRjaENoUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworCisKKy8qKgorIEBicmllZiBXRElfQ29uZmlnU1RBUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2lzaGVzIHRvIGFkZCBvciB1cGRhdGUgYSBTVEEgaW4gSFcuIFVwb24gdGhlIGNhbGwgb2YKKyAgICAgICAgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBTdGFydAorICAgICAgICBtZXNzYWdlIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmCisgICAgICAgIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9TdGFydCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpQ29uZmlnU1RBUmVxUGFyYW1zOiB0aGUgY29uZmlnIFNUQSBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpQ29uZmlnU1RBUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBjb25maWcgU1RBIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1N0YXJ0CisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0NvbmZpZ1NUQVJlcQorKAorICBXRElfQ29uZmlnU1RBUmVxUGFyYW1zVHlwZSogcHdkaUNvbmZpZ1NUQVJlcVBhcmFtcywKKyAgV0RJX0NvbmZpZ1NUQVJzcENiICAgICAgICAgIHdkaUNvbmZpZ1NUQVJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX1NldExpbmtTdGF0ZVJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgCisgICAgICAgIHdhbnRzIHRvIGNoYW5nZSB0aGUgc3RhdGUgb2YgYW4gb25nb2luZyBsaW5rLiBVcG9uIHRoZQorICAgICAgICBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwKKyAgICAgICAgU3RhcnQgbWVzc2FnZSByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfSm9pblJlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpU2V0TGlua1N0YXRlUmVxUGFyYW1zOiB0aGUgc2V0IGxpbmsgc3RhdGUgcGFyYW1ldGVycyAKKyAgICAgICAgICAgICAgICAgICAgICBhcyBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVNldExpbmtTdGF0ZVJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgc2V0IGxpbmsgc3RhdGUgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20KKyAgICAgICAgdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfSm9pblN0YXJ0UmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NldExpbmtTdGF0ZVJlcQorKAorICBXRElfU2V0TGlua1JlcVBhcmFtc1R5cGUqIHB3ZGlTZXRMaW5rU3RhdGVSZXFQYXJhbXMsCisgIFdESV9TZXRMaW5rU3RhdGVSc3BDYiAgICAgd2RpU2V0TGlua1N0YXRlUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisKKy8qKgorIEBicmllZiBXRElfR2V0U3RhdHNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHdhbnRzIAorICAgICAgICB0byBnZXQgc3RhdGlzdGljcyAoTUlCIGNvdW50ZXJzKSBmcm9tIHRoZSBkZXZpY2UuIFVwb24KKyAgICAgICAgdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhCisgICAgICAgIEhBTCBTdGFydCByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbQorICAgICAgICBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfU3RhcnQgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaUdldFN0YXRzUmVxUGFyYW1zOiB0aGUgc3RhdHMgcGFyYW1ldGVycyB0byBnZXQgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlHZXRTdGF0c1JzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZQorICAgICAgICBvZiB0aGUgZ2V0IHN0YXRzIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1N0YXJ0CisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0dldFN0YXRzUmVxCisoCisgIFdESV9HZXRTdGF0c1JlcVBhcmFtc1R5cGUqIHB3ZGlHZXRTdGF0c1JlcVBhcmFtcywKKyAgV0RJX0dldFN0YXRzUnNwQ2IgICAgICAgICAgd2RpR2V0U3RhdHNSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisKKy8qKgorIEBicmllZiBXRElfVXBkYXRlQ2ZnUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB3aGVuIAorICAgICAgICBpdCB3aXNoZXMgdG8gY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBXTEFOCisgICAgICAgIERldmljZS4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrCisgICAgICAgIGFuZCBzZW5kIGEgSEFMIFVwZGF0ZSBDRkcgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlcgorICAgICAgICBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1N0YXJ0IG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlVcGRhdGVDZmdSZXFQYXJhbXM6IHRoZSB1cGRhdGUgY2ZnIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlVcGRhdGVDZmdzUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSB1cGRhdGUgY2ZnIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1N0YXJ0CisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1VwZGF0ZUNmZ1JlcQorKAorICBXRElfVXBkYXRlQ2ZnUmVxUGFyYW1zVHlwZSogcHdkaVVwZGF0ZUNmZ1JlcVBhcmFtcywKKyAgV0RJX1VwZGF0ZUNmZ1JzcENiICAgICAgICAgIHdkaVVwZGF0ZUNmZ3NSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworLyoqCisgQGJyaWVmIFdESV9OdkRvd25sb2FkUmVxIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBVTUFDIHRvIGRvd2xvYWQgdGhlIE5WIGJsb2IKKyB0byB0aGUgTlYgbWVtb3J5LgorCisgICAgQHBhcmFtIHdkaU52RG93bmxvYWRSZXFQYXJhbXM6IHRoZSBOViBEb3dubG9hZCBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCBieQorICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgICAKKyAgICAgIHdkaU52RG93bmxvYWRSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgIHRoZSBOViBEb3dubG9hZCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgCisgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfTnZEb3dubG9hZFJlcQorKAorICBXRElfTnZEb3dubG9hZFJlcVBhcmFtc1R5cGUqIHB3ZGlOdkRvd25sb2FkUmVxUGFyYW1zLAorICBXRElfTnZEb3dubG9hZFJzcENiICAgICAgd2RpTnZEb3dubG9hZFJzcENiLAorICAgdm9pZCogICAgICBwVXNlckRhdGEKKyk7CisvKioKKyBAYnJpZWYgV0RJX0FkZEJBUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBoYXMgc2V0dXAKKyAgICAgICAgc3VjY2Vzc2Z1bGx5IGEgQkEgc2Vzc2lvbiBhbmQgbmVlZHMgdG8gbm90aWZ5IHRoZSBIVyBmb3IKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHNldHRpbmdzIHRvIHRha2UgcGxhY2UuIFVwb24gdGhlIGNhbGwgb2YKKyAgICAgICAgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBBZGQgQkEKKyAgICAgICAgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzCisgICAgICAgIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpQWRkQkFSZXFQYXJhbXM6IHRoZSBhZGQgQkEgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpQWRkQkFSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGFkZCBCQSBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfQWRkQkFSZXEKKygKKyAgV0RJX0FkZEJBUmVxUGFyYW1zVHlwZSogcHdkaUFkZEJBUmVxUGFyYW1zLAorICBXRElfQWRkQkFSc3BDYiAgICAgICAgICB3ZGlBZGRCQVJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfVHJpZ2dlckJBUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBoYXMgc2V0dXAKKyAgICAgICAgc3VjY2Vzc2Z1bGx5IGEgQkEgc2Vzc2lvbiBhbmQgbmVlZHMgdG8gbm90aWZ5IHRoZSBIVyBmb3IKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHNldHRpbmdzIHRvIHRha2UgcGxhY2UuIFVwb24gdGhlIGNhbGwgb2YKKyAgICAgICAgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBBZGQgQkEKKyAgICAgICAgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzCisgICAgICAgIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpQWRkQkFSZXFQYXJhbXM6IHRoZSBhZGQgQkEgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpQWRkQkFSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGFkZCBCQSBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfVHJpZ2dlckJBUmVxCisoCisgIFdESV9UcmlnZ2VyQkFSZXFQYXJhbXNUeXBlKiBwd2RpVHJpZ2dlckJBUmVxUGFyYW1zLAorICBXRElfVHJpZ2dlckJBUnNwQ2IgICAgICAgICAgd2RpVHJpZ2dlckJBUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFdESV9Jc0h3RnJhbWVUeFRyYW5zbGF0aW9uQ2FwYWJsZSBjaGVja3MgdG8gc2VlIGlmIEhXIAorICAgICAgICBmcmFtZSB4dGwgaXMgZW5hYmxlZCBmb3IgYSBwYXJ0aWN1bGFyIFNUQS4KKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHVTVEFJZHg6IFNUQSBpbmRleCAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCit3cHRfYm9vbGVhbiBXRElfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUKKygKKyAgd3B0X3VpbnQ4IHVTVEFJZHgKKyk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyoqCisgQGJyaWVmIFdESV9BZ2dyQWRkVFNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHRvIGluZm9ybQorICAgICAgICB0aGUgZGV2aWNlIG9mIGEgc3VjY2Vzc2Z1bCBhZGQgVFNwZWMgbmVnb3RpYXRpb24gZm9yIDExci4gSFcKKyAgICAgICAgbmVlZHMgdG8gcmVjZWl2ZSB0aGUgVFNwZWMgSW5mbyBmcm9tIHRoZSBVTUFDIGluIG9yZGVyCisgICAgICAgIHRvIGNvbmZpZ3VyZSBwcm9wZXJseSB0aGUgUW9TIGRhdGEgdHJhZmZpYy4gVXBvbiB0aGUKKyAgICAgICAgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMCisgICAgICAgIEFnZ3JlZ2F0ZWQgQWRkIFRTIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmCisgICAgICAgIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaUFnZ3JBZGRUc1JlcVBhcmFtczogdGhlIGFkZCBUUyBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlBZ2dyQWRkVHNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGFkZCBUUyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfQWdnckFkZFRTUmVxCisoCisgIFdESV9BZ2dyQWRkVFNSZXFQYXJhbXNUeXBlKiBwd2RpQWRkVHNSZXFQYXJhbXMsCisgIFdESV9BZ2dyQWRkVHNSc3BDYiAgICAgICAgICB3ZGlBZ2dyQWRkVHNSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlSW5pdCAtIEluaXRpYWxpemVzIHRoZSBTVEEgdGFibGVzLiAKKyAgICAgICAgQWxsb2NhdGVzIHRoZSBuZWNlc2FyeSBtZW1vcnkuCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworCitXRElfU3RhdHVzIFdESV9TdHViUnVuVGVzdAorKAorICAgd3B0X3VpbnQ4ICAgdWNUZXN0Tm8KKyk7CisKKyNpZmRlZiBBTklfTUFORl9ESUFHCisvKioKKyBAYnJpZWYgV0RJX0ZUTUNvbW1hbmRSZXEgLSAgCisgICAgICAgIFJvdXRlIEZUTVJlcXVlc3QgQ29tbWFuZCB0byBIQUwKKyAKKyBAcGFyYW0gIGZ0bUNvbW1hbmRSZXE6ICAgICAgICAgRlRNIHJlcXVlc3QgY29tbWFuZCBib2R5IAorIEBwYXJhbSAgZnRtQ29tbWFuZFJzcENiOiAgICAgICBSZXNwb25zZSBDQgorIEBwYXJhbSAgcFVzZXJEYXRhOiAgICAgICAgICAgICBVc2VyIGRhdGEgd2lsbCBiZSBpbmNsdWRlZCB3aXRoIENCCisKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgV0RJX0ZUTUNvbW1hbmRSZXEKKygKKyAgV0RJX0ZUTUNvbW1hbmRSZXFUeXBlICpmdG1Db21tYW5kUmVxLAorICBXRElfRlRNQ29tbWFuZFJzcENiICAgIGZ0bUNvbW1hbmRSc3BDYiwKKyAgdm9pZCAgICAgICAgICAgICAgICAgICpwVXNlckRhdGEKKyk7CisjZW5kaWYgLyogQU5JX01BTkZfRElBRyAqLworCisvKioKKyBAYnJpZWYgV0RJX0hvc3RSZXN1bWVSZXEgd2lsbCBiZSBjYWxsZWQgCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisKKyBAcGFyYW0gcHdkaVJlc3VtZVJlcVBhcmFtczogIGFzIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlSZXN1bWVSZXFSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIFJlc3VtZSBSZXEgcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfSG9zdFJlc3VtZVJlcQorKAorICBXRElfUmVzdW1lUGFyYW1zVHlwZSogICAgICAgICAgICBwd2RpUmVzdW1lUmVxUGFyYW1zLAorICBXRElfSG9zdFJlc3VtZUV2ZW50UnNwQ2IgICAgICAgICB3ZGlSZXN1bWVSZXFSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX0dldEF2YWlsYWJsZVJlc0NvdW50IC0gRnVuY3Rpb24gdG8gZ2V0IHRoZSBhdmFpbGFibGUgcmVzb3VyY2UKKyAgICAgICAgZm9yIGRhdGEgYW5kIG1hbmFnZW1udCBmcmFtZXMuIAorICAgICAgICAKKyBAcGFyYW0gIHBDb250ZXh0OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdESSBjb250ZXh0IAorIEBwYXJhbSAgd2RpUmVzUG9vbDogICAgICAgdHlwZSBvZiByZXNvdXJjZSBwb29sIHJlcXVlc3RpbmcKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCisKK3dwdF91aW50MzIgV0RJX0dldEF2YWlsYWJsZVJlc0NvdW50CisoCisgIHZvaWQgICAgICAgICAgICAqcENvbnRleHQsCisgIFdESV9SZXNQb29sVHlwZSB3ZGlSZXNQb29sCispOworCisvKioKKyBAYnJpZWYgV0RJX1NldEFkZFNUQVNlbGZSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUKKyAgICAgICAgVU1BQyB3YW50ZWQgdG8gYWRkIHNlbGYgU1RBIHdoaWxlIG9wZW5pbmcgYW55IG5ldyBzZXNzaW9uCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLgorCisKKyBAcGFyYW0gcHdkaUFkZFNUQVNlbGZQYXJhbXM6IHRoZSBhZGQgc2VsZiBzdGEgcGFyYW1ldGVycyBhcworICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sKKworIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9BZGRTVEFTZWxmUmVxCisoCisgIFdESV9BZGRTVEFTZWxmUmVxUGFyYW1zVHlwZSogICAgcHdkaUFkZFNUQVNlbGZSZXFQYXJhbXMsCisgIFdESV9BZGRTVEFTZWxmUGFyYW1zUnNwQ2IgICAgICAgd2RpQWRkU1RBU2VsZlJlcVBhcmFtc1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworCisvKioKKyBAYnJpZWYgV0RJX0RlbFNUQVNlbGZSZXEgd2lsbCBiZSBjYWxsZWQgLgorCisgQHBhcmFtIFdESV9EZWxTVEFTZWxmUmVxUGFyYW1zVHlwZQorICAKKyAgICAgICAgV0RJX0RlbFNUQVNlbGZSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIGRlbCBzdGEgc2VsZiAgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0RlbFNUQVNlbGZSZXEKKygKKyAgV0RJX0RlbFNUQVNlbGZSZXFQYXJhbXNUeXBlKiAgICBwd2RpRGVsU3RhU2VsZlBhcmFtcywKKyAgV0RJX0RlbFNUQVNlbGZSc3BDYiAgICAgICAgICAgICB3ZGlEZWxTdGFTZWxmUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX0hvc3RTdXNwZW5kSW5kIAorICAKKyAgICAgICAgU3VzcGVuZCBJbmRpY2F0aW9uIGZyb20gdGhlIHVwcGVyIGxheWVyIHdpbGwgYmUgc2VudAorICAgICAgICBkb3duIHRvIEhBTAorICAKKyBAcGFyYW0gV0RJX1N1c3BlbmRQYXJhbXNUeXBlCisgCisgQHNlZSAKKyAgCisgQHJldHVybiBTdGF0dXMgb2YgdGhlIHJlcXVlc3QKKyovCitXRElfU3RhdHVzIAorV0RJX0hvc3RTdXNwZW5kSW5kCisoCisgIFdESV9TdXNwZW5kUGFyYW1zVHlwZSogICAgcHdkaVN1c3BlbmRJbmRQYXJhbXMKKyk7CisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKy8qKgorIEBicmllZiBXRElfU2V0UHJlZmVycmVkTmV0d29ya0xpc3QKKworIEBwYXJhbSBwd2RpUE5PU2NhblJlcVBhcmFtczogdGhlIFNldCBQTk8gYXMgc3BlY2lmaWVkIAorICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlQTk9TY2FuQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlCisgICAgICAgIG9mIHRoZSBTZXQgUE5PIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZXRQcmVmZXJyZWROZXR3b3JrUmVxCisoCisgIFdESV9QTk9TY2FuUmVxUGFyYW1zVHlwZSogcHdkaVBOT1NjYW5SZXFQYXJhbXMsCisgIFdESV9QTk9TY2FuQ2IgICAgICAgICAgICAgd2RpUE5PU2NhbkNiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfU2V0UnNzaUZpbHRlclJlcQorCisgQHBhcmFtIHB3ZGlSc3NpRmlsdGVyUmVxUGFyYW1zOiB0aGUgU2V0IFJTU0kgRmlsdGVyIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpUnNzaUZpbHRlckNiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZQorICAgICAgICBvZiB0aGUgU2V0IFJTU0kgRmlsdGVyIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZXRSc3NpRmlsdGVyUmVxCisoCisgIFdESV9TZXRSc3NpRmlsdGVyUmVxUGFyYW1zVHlwZSogcHdkaVJzc2lGaWx0ZXJSZXFQYXJhbXMsCisgIFdESV9Sc3NpRmlsdGVyQ2IgICAgICAgICAgICAgICAgd2RpUnNzaUZpbHRlckNiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworLyoqCisgQGJyaWVmIFdESV9VcGRhdGVTY2FuUGFyYW1zCisKKyBAcGFyYW0gcHdkaVVwZGF0ZVNjYW5QYXJhbXNJbmZvVHlwZTogdGhlIFVwZGF0ZSBTY2FuIFBhcmFtcyBhcyBzcGVjaWZpZWQgCisgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVVwZGF0ZVNjYW5QYXJhbXNDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIFNldCBQTk8gb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1VwZGF0ZVNjYW5QYXJhbXNSZXEKKygKKyAgV0RJX1VwZGF0ZVNjYW5QYXJhbXNJbmZvVHlwZSogcHdkaVVwZGF0ZVNjYW5QYXJhbXNJbmZvVHlwZSwKKyAgV0RJX1VwZGF0ZVNjYW5QYXJhbXNDYiAgICAgICAgd2RpVXBkYXRlU2NhblBhcmFtc0NiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisKKy8qKgorIEBicmllZiBXRElfU2V0VHhQZXJUcmFja2luZ1JlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgCisgICAgICAgIHdhbnRzIHRvIHNldCB0aGUgVHggUGVyIFRyYWNraW5nIGNvbmZpZ3VyYXRpb25zLiAKKyAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrCisgICAgICAgIGFuZCBzZW5kIGEgSEFMIFNldCBUeCBQZXIgVHJhY2tpbmcgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZQorICAgICAgICBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgQHBhcmFtIHdkaVNldFR4UGVyVHJhY2tpbmdDb25mOiB0aGUgU2V0IFR4IFBFUiBUcmFja2luZyBjb25maWd1cmF0aW9ucyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVNldFR4UGVyVHJhY2tpbmdDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHNldCBUeCBQRVIgVHJhY2tpbmcgY29uZmlndXJhdGlvbnMgb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NldFR4UGVyVHJhY2tpbmdSZXEKKygKKyAgV0RJX1NldFR4UGVyVHJhY2tpbmdSZXFQYXJhbXNUeXBlKiAgICAgIHB3ZGlTZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zLAorICBXRElfU2V0VHhQZXJUcmFja2luZ1JzcENiICAgICAgICAgICAgICAgcHdkaVNldFR4UGVyVHJhY2tpbmdSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworLyoqCisgQGJyaWVmIFdESV9TZXRUbUxldmVsUmVxCisgICAgICAgIElmIEhXIFRoZXJtYWwgY29uZGl0aW9uIGNoYW5nZWQsIGRyaXZlciBzaG91bGQgcmVhY3QgYmFzZWQgb24gbmV3IAorICAgICAgICBIVyB0aGVybWFsIGNvbmRpdGlvbi4KKworIEBwYXJhbSBwd2RpU2V0VG1MZXZlbFJlcTogTmV3IHRoZXJtYWwgY29uZGl0aW9uIGluZm9ybWF0aW9uCisgIAorICAgICAgICBwd2RpU2V0VG1MZXZlbFJzcENiOiBjYWxsYmFjaworICAKKyAgICAgICAgdXNyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1NldFRtTGV2ZWxSZXEKKygKKyAgIFdESV9TZXRUbUxldmVsUmVxVHlwZSAgICAgICAgKnB3ZGlTZXRUbUxldmVsUmVxLAorICAgV0RJX1NldFRtTGV2ZWxDYiAgICAgICAgICAgICAgcHdkaVNldFRtTGV2ZWxSc3BDYiwKKyAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKnVzckRhdGEgIAorKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisvKioKKyBAYnJpZWYgV0RJXzgwMjNNdWx0aWNhc3RMaXN0UmVxCisKKyBAcGFyYW0gcHdkaVJjdkZsdFBrdFNldE1jTGlzdFJlcUluZm86IHRoZSBTZXQgODAyMyBNdWx0aWNhc3QgCisgICAgICAgIExpc3QgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGk4MDIzTXVsdGljYXN0TGlzdENhbGxiYWNrOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrCisgICAgICAgIHRoZSByZXNwb25zZSBvZiB0aGUgU2V0IDgwMjMgTXVsdGljYXN0IExpc3Qgb3BlcmF0aW9uCisgICAgICAgIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJXzgwMjNNdWx0aWNhc3RMaXN0UmVxCisoCisgIFdESV9SY3ZGbHRQa3RTZXRNY0xpc3RSZXFQYXJhbXNUeXBlKiAgcHdkaVJjdkZsdFBrdFNldE1jTGlzdFJlcUluZm8sCisgIFdESV84MDIzTXVsdGljYXN0TGlzdENiICAgICAgICAgICAgICAgd2RpODAyM011bHRpY2FzdExpc3RDYWxsYmFjaywKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfUmVjZWl2ZUZpbHRlclNldEZpbHRlclJlcQorCisgQHBhcmFtIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFJbmZvOiB0aGUgU2V0IFJlY2VpdmUgRmlsdGVyIGFzIAorICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVJlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJSZXFDYWxsYmFjazogY2FsbGJhY2sgZm9yCisgICAgICAgIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YgdGhlIFNldCBSZWNlaXZlIEZpbHRlcgorICAgICAgICBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfUmVjZWl2ZUZpbHRlclNldEZpbHRlclJlcQorKAorICBXRElfU2V0UmN2UGt0RmlsdGVyUmVxUGFyYW1zVHlwZSogcHdkaVNldFJjdlBrdEZpbHRlclJlcUluZm8sCisgIFdESV9SZWNlaXZlRmlsdGVyU2V0RmlsdGVyQ2IgICAgICB3ZGlSZWNlaXZlRmlsdGVyU2V0RmlsdGVyUmVxQ2FsbGJhY2ssCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfUENGaWx0ZXJNYXRjaENvdW50UmVxCisKKyBAcGFyYW0gcHdkaVJjdkZsdFBrdE1hdGNoQ250UmVxSW5mbzogZ2V0IEQwIFBDIEZpbHRlciBNYXRjaCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50CisgIAorICAgICAgICB3ZGlQQ0ZpbHRlck1hdGNoQ291bnRDYWxsYmFjazogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjaworICAgICAgICB0aGUgcmVzcG9uc2Ugb2YgdGhlIEQwIFBDIEZpbHRlciBNYXRjaCBDb3VudCBvcGVyYXRpb24KKyAgICAgICAgcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfRmlsdGVyTWF0Y2hDb3VudFJlcQorKAorICBXRElfUmN2Rmx0UGt0TWF0Y2hDbnRSZXFQYXJhbXNUeXBlKiBwd2RpUmN2Rmx0UGt0TWF0Y2hDbnRSZXFJbmZvLAorICBXRElfRmlsdGVyTWF0Y2hDb3VudENiICAgICAgICAgICAgICB3ZGlGaWx0ZXJNYXRjaENvdW50Q2FsbGJhY2ssCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKworLyoqCisgQGJyaWVmIFdESV9SZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJSZXEKKworIEBwYXJhbSBwd2RpUmN2Rmx0UGt0Q2xlYXJSZXFJbmZvOiB0aGUgQ2xlYXIgRmlsdGVyIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyQ2FsbGJhY2s6IGNhbGxiYWNrIGZvcgorICAgICAgICBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlIG9mIHRoZSBDbGVhciBGaWx0ZXIKKyAgICAgICAgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlclJlcQorKAorICBXRElfUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlKiAgcHdkaVJjdkZsdFBrdENsZWFyUmVxSW5mbywKKyAgV0RJX1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlckNiICAgIHdkaVJlY2VpdmVGaWx0ZXJDbGVhckZpbHRlckNhbGxiYWNrLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisKKy8qKgorIEBicmllZiBXRElfSEFMRHVtcENtZFJlcQorICAgICAgICBQb3N0IEhBTCBEVU1QIENvbW1hbmQgRXZlbnQKKyAKKyBAcGFyYW0gIGhhbER1bXBDbWRSZXFQYXJhbXM6ICAgSGFsIER1bXAgQ29tbWFuZCBCb2R5IAorIEBwYXJhbSAgaGFsRHVtcENtZFJzcENiOiAgICAgICAgIGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgCisgQHBhcmFtICBwVXNlckRhdGE6ICAgICAgIENsaWVudCBEYXRhCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgV0RJX0hBTER1bXBDbWRSZXEoCisgIFdESV9IQUxEdW1wQ21kUmVxUGFyYW1zVHlwZSAqaGFsRHVtcENtZFJlcVBhcmFtcywKKyAgV0RJX0hBTER1bXBDbWRSc3BDYiAgICBoYWxEdW1wQ21kUnNwQ2IsCisgIHZvaWQgICAgICAgICAgICAgICAgICAqcFVzZXJEYXRhCispOworCisKKy8qKgorIEBicmllZiBXRElfU2V0UG93ZXJQYXJhbXNSZXEKKworIEBwYXJhbSBwd2RpUG93ZXJQYXJhbXNSZXFQYXJhbXM6IHRoZSBTZXQgUG93ZXIgUGFyYW1zIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpUG93ZXJQYXJhbXNDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIFNldCBQb3dlciBQYXJhbXMgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NldFBvd2VyUGFyYW1zUmVxCisoCisgIFdESV9TZXRQb3dlclBhcmFtc1JlcVBhcmFtc1R5cGUqIHB3ZGlQb3dlclBhcmFtc1JlcVBhcmFtcywKKyAgV0RJX1NldFBvd2VyUGFyYW1zQ2IgICAgICAgICAgICAgd2RpUG93ZXJQYXJhbXNDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisvKioKKyBAYnJpZWYgV0RJX0dUS09mZmxvYWRSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3YW50cyB0byBzZXQgR1RLIFJla2V5IENvdW50ZXIgd2hpbGUgaW4gcG93ZXIgc2F2ZS4gVXBvbgorICAgICAgICB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEKKyAgICAgICAgSEFMIEdUSyBvZmZsb2FkIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlHdGtPZmZsb2FkUGFyYW1zOiB0aGUgR1RLIG9mZmxvYWQgYXMgc3BlY2lmaWVkIAorICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlHdGtPZmZsb2FkQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlCisgICAgICAgIG9mIHRoZSBHVEsgb2ZmbG9hZCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfR1RLT2ZmbG9hZFJlcQorKAorICBXRElfR3RrT2ZmbG9hZFJlcU1zZyogICAgICBwd2RpR3RrT2ZmbG9hZFJlcU1zZywKKyAgV0RJX0d0a09mZmxvYWRDYiAgICAgICAgICAgd2RpR3RrT2ZmbG9hZENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKyk7CisKKy8qKgorIEBicmllZiBXRElfR1RLT2ZmbG9hZEdldEluZm9SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgCisgICAgICAgICAgTUFDIHdhbnRzIHRvIGdldCBHVEsgUmVrZXkgQ291bnRlciB3aGlsZSBpbiBwb3dlciBzYXZlLgorICAgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQKKyAgICAgICAgICBzZW5kIGEgSEFMIEdUSyBvZmZsb2FkIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlHdGtPZmZsb2FkR2V0SW5mb1JlcU1zZzogdGhlIEdUSyBPZmZsb2FkIAorICAgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb24gTWVzc2FnZSBhcyBzcGVjaWZpZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICAgIHdkaUd0a09mZmxvYWRHZXRJbmZvQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIEdUSyBvZmZsb2FkIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0dUS09mZmxvYWRHZXRJbmZvUmVxCisoCisgIFdESV9HdGtPZmZsb2FkR2V0SW5mb1JlcU1zZyogIHB3ZGlHdGtPZmZsb2FkR2V0SW5mb1JlcU1zZywKKyAgV0RJX0d0a09mZmxvYWRHZXRJbmZvQ2IgICAgICAgd2RpR3RrT2ZmbG9hZEdldEluZm9DYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKTsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKworLyoqCisgQGJyaWVmIFdESV9mZWF0dXJlQ2Fwc0V4Y2hhbmdlUmVxCisgICAgICAgIFBvc3QgZmVhdHVyZSBjYXBhYmlsaXR5IGJpdG1hcCBleGNoYW5nZSBldmVudC4KKyAgICAgICAgSG9zdCB3aWxsIHNlbmQgaXRzIG93biBjYXBhYmlsaXR5IHRvIEZXIGluIHRoaXMgcmVxIGFuZCAKKyAgICAgICAgZXhwZWN0IEZXIHRvIHNlbmQgaXRzIGNhcGFiaWxpdHkgYmFjayBhcyBhIGJpdG1hcCBpbiBSZXNwb25zZQorIAorIEBwYXJhbSAKKyAgCisgICAgICAgIHdkaUZlYXRDYXBzRXhjUnNwQ2I6IGNhbGxiYWNrIGNhbGxlZCBvbiBnZXR0aW5nIHRoZSByZXNwb25zZS4KKyAgICAgICAgSXQgaXMga2VwdCB0byBtYW50YWluIHNpbWlsYXJpdHkgYmV0d2VlbiBXREkgcmVxcyBhbmQgaWYgbmVlZGVkLCBjYW4KKyAgICAgICAgYmUgdXNlZCBpbiBmdXR1cmUuIEN1cnJlbnRseSwgSXQgaXMgc2V0IHRvIE5VTEwKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9mZWF0dXJlQ2Fwc0V4Y2hhbmdlUmVxCisoCisgIFdESV9mZWF0dXJlQ2Fwc0V4Y2hhbmdlQ2IgICAgIHdkaUZlYXR1cmVDYXBzRXhjaGFuZ2VDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX2dldEhvc3RXbGFuRmVhdENhcHMKKyAgICAgICAgV0RJIEFQSSB0aGF0IHJldHVybnMgd2hldGhlciB0aGUgZmVhdHVyZSBwYXNzZWQgdG8gaXQgYXMgZW51bSB2YWx1ZSBpbgorICAgICAgICAicGxhY2VIb2xkZXJJbkNhcEJpdG1hcCIgaXMgc3VwcG9ydGVkIGJ5IEhvc3Qgb3Igbm90LiBJdCB1c2VzIFdESSBnbG9iYWwKKyAgICAgICAgdmFyaWFibGUgc3RvcmluZyBob3N0IGNhcGFiaWxpdHkgYml0bWFwIHRvIGZpbmQgdGhpcy4gVGhpcyBjYW4gYmUgdXNlZCBieQorICAgICAgICBvdGhlciBtb2R1ZWxzIHRvIGRlY2lkZSBjZXJ0YWluIHRoaW5ncyBsaWtlIGNhbGwgZGlmZmVyZW50IEFQSXMgYmFzZWQgb24KKyAgICAgICAgd2hldGhlciBhIHBhcnRpY3VsYXIgZmVhdHVyZSBpcyBzdXBwb3J0ZWQuCisgCisgQHBhcmFtIAorICAKKyAgICAgICAgZmVhdF9lbnVtX3ZhbHVlOiBlbnVtIHZhbHVlIGZvciB0aGUgZmVhdHVyZSBhcyBpbiBwbGFjZUhvbGRlckluQ2FwQml0bWFwIGluIHdsYW5faGFsX21zZy5oLgorCisgQHNlZQorIEByZXR1cm4gCisgICAgICAgIDAgLSBpZiB0aGUgZmVhdHVyZSBpcyBOT1Qgc3VwcG9ydGVkIGluIGhvc3QKKyAgICAgICAgYW55IG5vbi16ZXJvIHZhbHVlIC0gaWYgdGhlIGZlYXR1cmUgaXMgU1VQUE9SVEVEIGluIGhvc3QuCisqLword3B0X3VpbnQ4IFdESV9nZXRIb3N0V2xhbkZlYXRDYXBzKHdwdF91aW50OCBmZWF0X2VudW1fdmFsdWUpOworCisvKioKKyBAYnJpZWYgV0RJX2dldEZ3V2xhbkZlYXRDYXBzCisgICAgICAgIFdESSBBUEkgdGhhdCByZXR1cm5zIHdoZXRoZXIgdGhlIGZlYXR1cmUgcGFzc2VkIHRvIGl0IGFzIGVudW0gdmFsdWUgaW4KKyAgICAgICAgInBsYWNlSG9sZGVySW5DYXBCaXRtYXAiIGlzIHN1cHBvcnRlZCBieSBGVyBvciBub3QuIEl0IHVzZXMgV0RJIGdsb2JhbAorICAgICAgICB2YXJpYWJsZSBzdG9yaW5nIGhvc3QgY2FwYWJpbGl0eSBiaXRtYXAgdG8gZmluZCB0aGlzLiBUaGlzIGNhbiBiZSB1c2VkIGJ5CisgICAgICAgIG90aGVyIG1vZHVlbHMgdG8gZGVjaWRlIGNlcnRhaW4gdGhpbmdzIGxpa2UgY2FsbCBkaWZmZXJlbnQgQVBJcyBiYXNlZCBvbgorICAgICAgICB3aGV0aGVyIGEgcGFydGljdWxhciBmZWF0dXJlIGlzIHN1cHBvcnRlZC4KKyAKKyBAcGFyYW0gCisgIAorICAgICAgICBmZWF0X2VudW1fdmFsdWU6IGVudW0gdmFsdWUgZm9yIHRoZSBmZWF0dXJlIGFzIGluIHBsYWNlSG9sZGVySW5DYXBCaXRtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHdsYW5faGFsX21zZy5oLgorCisgQHNlZQorIEByZXR1cm4gCisgICAgICAgIDAgLSBpZiB0aGUgZmVhdHVyZSBpcyBOT1Qgc3VwcG9ydGVkIGluIEZXCisgICAgICAgIGFueSBub24temVybyB2YWx1ZSAtIGlmIHRoZSBmZWF0dXJlIGlzIFNVUFBPUlRFRCBpbiBGVy4KKyovCit3cHRfdWludDggV0RJX2dldEZ3V2xhbkZlYXRDYXBzKHdwdF91aW50OCBmZWF0X2VudW1fdmFsdWUpOworCisvKioKKyBAYnJpZWYgV0RJX0dldFdjbnNzQ29tcGlsZWRBcGlWZXJzaW9uIC0gRnVuY3Rpb24gdG8gZ2V0IHdjbnNzIGNvbXBpbGVkICAKKyAgICAgICAgYXBpIHZlcnNpb24gCisgICAgICAgIAorIEBwYXJhbSAgV0RJX1dsYW5WZXJzaW9uVHlwZTogV2xhbiB2ZXJzaW9uIHN0cnVjdHVyZSAKKyBAc2VlCisgQHJldHVybiBub25lCisqLworCit2b2lkIFdESV9HZXRXY25zc0NvbXBpbGVkQXBpVmVyc2lvbgorKAorICBXRElfV2xhblZlcnNpb25UeXBlICAgICAqcFdjbnNzQXBpVmVyc2lvbgorKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworIH0KKyNlbmRpZiAKKworCisjZW5kaWYgLyogI2lmbmRlZiBXTEFOX1FDVF9XRElfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvQ1AvaW5jL3dsYW5fcWN0X3dkaV9iZC5oIGIvQ09SRS9XREkvQ1AvaW5jL3dsYW5fcWN0X3dkaV9iZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOTFiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9DUC9pbmMvd2xhbl9xY3Rfd2RpX2JkLmgKQEAgLTAsMCArMSwxMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBXTEFOX1FDVF9XRElfQkRfSAorI2RlZmluZSBXTEFOX1FDVF9XRElfQkRfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICBXIEwgQSBOICAgRCBFIFYgSSBDIEUgICBBIEIgUyBUIFIgQSBDIFQgSSBPIE4gICBMIEEgWSBFIFIgCisgICAgICAgICAgICAgIEkgTiBUIEUgUiBOIEEgTCAgICAgQSBQIEkgICAgICAgRiBPIFIgICAgVCBIIEUKKyAgICAgICAgICAgICAgICBCIEQgICBIIEUgQSBEIEUgUiAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgCitERVNDUklQVElPTgorICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludGVybmFsIEJEIGRlZmluaXRpb24gZXhwb3NlZCBieSB0aGUgREFMIENvbnRyb2wgICAgICAgCisgIFBhdGggQ29yZSBtb2R1bGUgdG8gYmUgdXNlZCBieSB0aGUgREFMIERhdGEgUGF0aCBDb3JlLiAKKyAgCisgICAgICAKKyAgQ29weXJpZ2h0IChjKSAyMDEwIFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKK3doZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDgvMTkvMTAgICAgbHRpICAgICBDcmVhdGVkIG1vZHVsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90eXBlLmgiCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgICAgICAgCisgICAgIEJEIFNUUlVDVFVSRSBEZWZpbmVzICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgCisgIFdESV9SeEJkVHlwZSAtIFRoZSBmb3JtYXQgb2YgdGhlIFJYIEJEIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreworICAgICAgICAvKiAweDAwICovCisjaWZkZWYgV1BUX0JJR19CWVRFX0VORElBTgorICAgIAorICAgICAgICAvKiogKE9ubHkgdXNlZCBieSB0aGUgRFBVKQorICAgICAgICBUaGlzIHJvdXRpbmcgZmxhZyBpbmRpY2F0ZXMgdGhlIFdRIG51bWJlciB0byB3aGljaCB0aGUgRFBVIHdpbGwgcHVzaCB0aGUKKyAgICAgICAgZnJhbWUgYWZ0ZXIgaXQgZmluaXNoZWQgcHJvY2Vzc2luZyBpdC4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiBkcHVSRjo4OworICAgIAorICAgICAgICAvKiogVGhpcyBpcyBEUFUgc2lnIGluc2VydGVkIGJ5IFJYUC4gU2lnbmF0dXJlIG9uIFJBJ3MgRFBVIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBkcHVTaWduYXR1cmU6MzsKKyAgICAKKyAgICAgICAgLyoqIFdoZW4gc2V0IFN0YSBpcyBhdXRoZW50aWNhdGVkLiBTVyBuZWVkcyB0byBzZXQgYml0CisgICAgICAgIGFkZHIyX2F1dGhfZXh0cmFjdF9lbmFibGUgaW4gcnhwX2NvbmZpZzIgcmVnaXN0ZXIuIFRoZW4gUlhQIHdpbGwgdXNlIGJpdCAzCisgICAgICAgIGluIERQVSBzaWcgdG8gc2F5IHdoZXRoZXIgU1RBIGlzIGF1dGhlbnRpY2F0ZWQgb3Igbm90LiBJbiB0aGlzIGNhc2Ugb25seQorICAgICAgICBsb3dlciAyYml0cyBvZiBEUFUgU2lnIGlzIHZhbGlkICovCisgICAgICAgIHdwdF91aW50MzIgc3RBdUY6MTsKKyAgICAKKyAgICAgICAgLyoqIFdoZW4gc2V0IGFkZHJlc3MyIGlzIG5vdCB2YWxpZCAqLworICAgICAgICB3cHRfdWludDMyIEEySEY6MTsKKyAgICAKKyAgICAgICAgLyoqIFdoZW4gc2V0IGl0IGluZGljYXRlcyBUUEUgaGFzIHNlbnQgdGhlIEJlYWNvbiBmcmFtZSAqLworICAgICAgICB3cHRfdWludDMyIGJzZjoxOworICAgIAorICAgICAgICAvKiogVGhpcyBiaXQgZmlsbGVkIGJ5IHJ4cCB3aGVuIHNldCBpbmRpY2F0ZXMgaWYgdGhlIGN1cnJlbnQgdHNmIGlzIHNtYWxsZXIKKyAgICAgICAgdGhhbiByZWNlaXZlZCB0c2YgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBydHNmOjE7CisgICAgCisgICAgICAgIC8qKiBUaGVzZSB0d28gZmllbGRzIGFyZSB1c2VkIGJ5IFNXIHRvIGNhcnJ5IHRoZSBSeCBDaGFubmVsIG51bWJlciBhbmQgU0NBTiBiaXQgaW4gUnhCRCovCisgICAgICAgIHdwdF91aW50MzIgcnhDaGFubmVsOjQ7CisgICAgICAgIHdwdF91aW50MzIgc2NhbkxlYXJuOjE7CisKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDA6MTsKKyAgICAKKyAgICAgICAgLyoqIExMQyBSZW1vdmVkCisgICAgICAgIFRoaXMgYml0IGlzIG9ubHkgdXNlZCBpbiBMaWJyYSByc3ZkIGZvciBWaXJnbzEuMC9WaXJnbzIuMAorICAgICAgICBGaWxsZWQgYnkgQURVIHdoZW4gaXQgaXMgc2V0IExMQyBpcyByZW1vdmVkIGZyb20gcGFja2V0ICovCisgICAgICAgIHdwdF91aW50MzIgbGxjcjoxOworICAgICAgICAKKyAgICAgICAgd3B0X3VpbnQzMiB1bWFCeVBhc3M6MTsKKyAgICAKKyAgICAgICAgLyoqIFRoaXMgYml0IGlzIG9ubHkgYXZhaWxhYmxlIGluIFZpcmdvMi4wL2xpYnJhIGl0IGlzIHJlc2VydmVkIGluIFZpcmdvMS4wCisgICAgICAgIFJvYnVzdCBNYW5hZ2VtZW50IGZyYW1lLiBUaGlzIGJpdCBpbmRpY2F0ZXMgdG8gRFBVIHRoYXQgdGhlIHBhY2tldCBpcyBhCisgICAgICAgIHJvYnVzdCBtYW5hZ2VtZW50IGZyYW1lIHdoaWNoIHJlcXVpcmVzIGRlY3J5cHRpb24odGhpcyBiaXQgaXMgb25seSB2YWxpZCBmb3IKKyAgICAgICAgbWFuYWdlbWVudCB1bmljYXN0IGVuY3J5cHRlZCBmcmFtZXMpCisgICAgICAgIDEgLSBOZWVkcyBkZWNyeXB0aW9uCisgICAgICAgIDAgLSBObyBkZWNyeXB0aW9uIHJlcXVpcmVkICovCisgICAgICAgIHdwdF91aW50MzIgcm1mOjE7CisgICAgCisgICAgICAgIC8qKiAKKyAgICAgICAgVGhpcyBiaXQgaXMgb25seSBpbiBWaXJnbzIuMC9saWJyYSBpdCBpcyByZXNlcnZlZCBpbiBWaXJnbyAxLjAKKyAgICAgICAgVGhpcyAxLWJpdCBmaWVsZCBpbmRpY2F0ZXMgdG8gRFBVIFVuaWNhc3QvQkMvTUMgcGFja2V0CisgICAgICAgIDAgLSBVbmljYXN0IHBhY2tldAorICAgICAgICAxIC0gQnJvYWRjYXN0L011bHRpY2FzdCBwYWNrZXQKKyAgICAgICAgVGhpcyBiaXQgaXMgb25seSB2YWxpZCB3aGVuIFJNRiBiaXQgaXMgMSAqLworICAgICAgICB3cHRfdWludDMyIHViOjE7CisgICAgCisgICAgICAgIC8qKiBUaGlzIGlzIHRoZSBLRVkgSUQgZXh0cmFjdGVkIGZyb20gV0VQIHBhY2tldHMgYW5kIGlzIHVzZWQgZm9yIGRldGVybWluZQorICAgICAgICB0aGUgUlggS2V5IEluZGV4IHRvIHVzZSBpbiB0aGUgRFBVIERlc2NyaXB0cm9yLgorICAgICAgICBUaGlzIGZpZWxkICBpcyAyYml0cyBmb3IgdmlyZ28gMS4wCisgICAgICAgIEFuZCAzIGJpdHMgaW4gdmlyZ28yLjAgYW5kIExpYnJhCisgICAgICAgIEluIHZpcmdvMi4wL2xpYnJhIGl0IGlzIDNiaXRzIGZvciB0aGUgQkMvTUMgcGFja2V0cyAqLworICAgICAgICB3cHRfdWludDMyIHJ4S2V5SWQ6MzsKKyAgICAgICAgCisgICAgICAgIC8qKiAgKE9ubHkgdXNlZCBieSB0aGUgRFBVKSAgICAKKyAgICAgICAgTm8gZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgICAgICAgIDA6IE5vIGFjdGlvbgorICAgICAgICAxOiBEUFUgd2lsbCBub3QgZW5jcnlwdC9kZWNyeXB0IHRoZSBmcmFtZSwgYW5kIGRpc2NhcmQgYW55IGVuY3J5cHRpb24KKyAgICAgICAgcmVsYXRlZCBzZXR0aW5ncyBpbiB0aGUgUERVIGRlc2NyaXB0b3IuICovCisgICAgICAgIHdwdF91aW50MzIgZHB1TkU6MTsKKyAgICAKKyAgICAgICAgLyoqIAorICAgICAgICBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGluIGxpYnJhL3ZpcmdvMi4wICBpdCBpcyByZXNlcnZlZCBmb3IgdmlyZ28xLjAKKyAgICAgICAgVGhpcyBiaXQgaXMgZmlsbGVkIGJ5IFJYUCBhbmQgbW9kaWZpZWQgYnkgQURVCisgICAgICAgIFRoaXMgYml0IGluZGljYXRlcyB0byBBRFUvVU1BIG1vZHVsZSB0aGF0IHRoZSBwYWNrZXQgcmVxdWlyZXMgODAyLjExbiB0bworICAgICAgICA4MDIuMyBmcmFtZSB0cmFuc2xhdGlvbi4gT25jZSBBRFUvVU1BIGlzIGRvbmUgd2l0aCB0cmFuc2xhdGlvbiB0aGV5CisgICAgICAgIG92ZXJ3cml0ZSBpdCB3aXRoIDEnYjAvMSdiMSBkZXBlbmRpbmcgb24gaG93IHRoZSB0cmFuc2xhdGlvbiByZXN1bHRlZAorICAgICAgICBXaGVuIHVzZWQgYnkgQURVIAorICAgICAgICAwIC0gTm8gZnJhbWUgdHJhbnNsYXRpb24gcmVxdWlyZWQKKyAgICAgICAgMSAtIEZyYW1lIFRyYW5zbGF0aW9uIHJlcXVpcmVkCisgICAgICAgIFdoZW4gdXNlZCBieSBTVworICAgICAgICAwIC0gRnJhbWUgdHJhbnNsYXRpb24gbm90IGRvbmUsIE1QRFUgaGVhZGVyIG9mZnNldCBwb2ludHMgdG8gODAyLjExIGhlYWRlci4uCisgICAgICAgIDEgLSBGcmFtZSB0cmFuc2xhdGlvbiBkb25lIDsgIGhlbmNlIE1QRFUgaGVhZGVyIG9mZnNldCB3aWxsIHBvaW50IHRvIGEKKyAgICAgICAgODAyLjMgaGVhZGVyICovCisgICAgICAgIHdwdF91aW50MzIgZnQ6MTsKKyAgICAKKyAgICAgICAgLyoqIChPbmx5IHVzZWQgYnkgdGhlIERQVSkKKyAgICAgICAgQkQgVHlwZSAKKyAgICAgICAgMDA6ICdHZW5lcmljIEJEJywgYXMgaW5kaWN0ZWQgYWJvdmUKKyAgICAgICAgMDE6IERlLWZyYWdtZW50YXRpb24gZm9ybWF0IAorICAgICAgICAxMC0xMTogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICovCisgICAgICAgIHdwdF91aW50MzIgYmR0OjI7CisgICAgICAgIAorI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiBiZHQ6MjsKKyAgICAgICAgd3B0X3VpbnQzMiBmdDoxOworICAgICAgICB3cHRfdWludDMyIGRwdU5FOjE7CisgICAgICAgIHdwdF91aW50MzIgcnhLZXlJZDozOworICAgICAgICB3cHRfdWludDMyIHViOjE7CisgICAgICAgIHdwdF91aW50MzIgcm1mOjE7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQxOjE7CisgICAgICAgIHdwdF91aW50MzIgbGxjOjE7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQwOjE7CisgICAgICAgIHdwdF91aW50MzIgc2NhbkxlYXJuOjE7CisgICAgICAgIHdwdF91aW50MzIgcnhDaGFubmVsOjQ7CisgICAgICAgIHdwdF91aW50MzIgcnRzZjoxOworICAgICAgICB3cHRfdWludDMyIGJzZjoxOworICAgICAgICB3cHRfdWludDMyIEEySEY6MTsKKyAgICAgICAgd3B0X3VpbnQzMiBzdEF1RjoxOworICAgICAgICB3cHRfdWludDMyIGRwdVNpZ25hdHVyZTozOworICAgICAgICB3cHRfdWludDMyIGRwdVJGOjg7CisjZW5kaWYKKyAgICAKKyAgICAgICAgLyogMHgwNCAqLworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAKKyAgICAgICAgLyoqIFRoaXMgaXMgdXNlZCBmb3IgQU1TRFUgdGhpcyBpcyB0aGUgUERVIGluZGV4IG9mIHRoZSBQRFUgd2hpY2ggaXMgdGhlCisgICAgICAgIG9uZSBiZWZvcmUgbGFzdCBQRFU7IGZvciBhbGwgbm9uIEFNU0RVIGZyYW1lcywgdGhpcyBmaWVsZCBTSEFMTCBiZSAwLgorICAgICAgICBVc2VkIGluIEFEVSAoZm9yIEFNU0RVIGRlYWdncmVnYXRpb24pICovCisgICAgICAgIHdwdF91aW50MzIgcGVudWx0aW1hdGVQZHVJZHg6MTY7CisgICAgCisgICAgICAgIHdwdF91aW50MzIgYWR1RmVlZGJhY2s6ODsKKyAgICAKKyAgICAgICAgLyoqIERQVSBmZWVkYmFjayAqLworICAgICAgICB3cHRfdWludDMyIGRwdUZlZWRiYWNrOjg7CisgICAgICAgIAorI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiBkcHVGZWVkYmFjazo4OworICAgICAgICB3cHRfdWludDMyIGFkdUZlZWRiYWNrOjg7CisgICAgICAgIHdwdF91aW50MzIgcGVudWx0aW1hdGVQZHVJZHg6MTY7CisjZW5kaWYKKyAgICAKKyAgICAgICAgLyogMHgwOCAqLworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAKKyAgICAgICAgLyoqIEluIGNhc2UgUERVcyBhcmUgbGlua2VkIHRvIHRoZSBCRCwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGluZGV4IG9mCisgICAgICAgIHRoZSBmaXJzdCBQRFUgbGlua2VkIHRvIHRoZSBCRC4gV2hlbiBQRFUgY291bnQgaXMgemVybywgdGhpcyBmaWVsZCBoYXMgYW4KKyAgICAgICAgdW5kZWZpbmVkIHZhbHVlLiAqLworICAgICAgICB3cHRfdWludDMyIGhlYWRQZHVJZHg6MTY7CisgICAgCisgICAgICAgIC8qKiBJbiBjYXNlIFBEVXMgYXJlIGxpbmtlZCB0byB0aGUgQkQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBpbmRleCBvZgorICAgICAgICB0aGUgbGFzdCBQRFUuIFdoZW4gUERVIGNvdW50IGlzIHplcm8sIHRoaXMgZmllbGQgaGFzIGFuIHVuZGVmaW5lZCB2YWx1ZS4qLworICAgICAgICB3cHRfdWludDMyIHRhaWxQZHVJZHg6MTY7CisgICAgICAgIAorI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiB0YWlsUGR1SWR4OjE2OworICAgICAgICB3cHRfdWludDMyIGhlYWRQZHVJZHg6MTY7CisjZW5kaWYKKyAgICAKKyAgICAgICAgLyogMHgwYyAqLworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAKKyAgICAgICAgLyoqIFRoZSBsZW5ndGggKGluIG51bWJlciBvZiBieXRlcykgb2YgdGhlIE1QRFUgaGVhZGVyLiAKKyAgICAgICAgTGltaXRhdGlvbjogVGhlIE1QRFUgaGVhZGVyIG9mZnNldCArIE1QRFUgaGVhZGVyIGxlbmd0aCBjYW4gbmV2ZXIgZ28gYmV5b25kCisgICAgICAgIHRoZSBlbmQgb2YgdGhlIGZpcnN0IFBEVSAqLworICAgICAgICB3cHRfdWludDMyIG1wZHVIZWFkZXJMZW5ndGg6ODsKKyAgICAKKyAgICAgICAgLyoqIFRoZSBzdGFydCBieXRlIG51bWJlciBvZiB0aGUgTVBEVSBoZWFkZXIuIAorICAgICAgICBUaGUgYnl0ZSBudW1iZXJpbmcgaXMgZG9uZSBpbiB0aGUgQkUgZm9ybWF0LiBXb3JkIDB4MCwgYml0cyBbMzE6MjRdIGhhcworICAgICAgICBieXRlIGluZGV4IDAuICovCisgICAgICAgIHdwdF91aW50MzIgbXBkdUhlYWRlck9mZnNldDo4OworICAgIAorICAgICAgICAvKiogVGhlIHN0YXJ0IGJ5dGUgbnVtYmVyIG9mIHRoZSBNUERVIGRhdGEuIAorICAgICAgICBUaGUgYnl0ZSBudW1iZXJpbmcgaXMgZG9uZSBpbiB0aGUgQkUgZm9ybWF0LiBXb3JkIDB4MCwgYml0cyBbMzE6MjRdIGhhcworICAgICAgICBieXRlIGluZGV4IDAuIE5vdGUgdGhhdCB0aGlzIG9mZnNldCBjYW4gcG9pbnQgYWxsIHRoZSB3YXkgaW50byB0aGUgZmlyc3QKKyAgICAgICAgbGlua2VkIFBEVS4KKyAgICAgICAgTGltaXRhdGlvbjogTVBEVSBEQVRBIE9GRlNFVCBjYW4gbm90IHBvaW50IGludG8gdGhlIDJuZCBsaW5rZWQgUERVICovCisgICAgICAgIHdwdF91aW50MzIgbXBkdURhdGFPZmZzZXQ6OTsKKyAgICAKKyAgICAgICAgLyoqIFRoZSBudW1iZXIgb2YgUERVcyBsaW5rZWQgdG8gdGhlIEJELiAKKyAgICAgICAgVGhpcyBmaWVsZCBzaG91bGQgYWx3YXlzIGluZGljYXRlIHRoZSBjb3JyZWN0IGFtb3VudC4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiBwZHVDb3VudDo3OworI2Vsc2UKKyAgICAKKyAgICAgICAgd3B0X3VpbnQzMiBwZHVDb3VudDo3OworICAgICAgICB3cHRfdWludDMyIG1wZHVEYXRhT2Zmc2V0Ojk7CisgICAgICAgIHdwdF91aW50MzIgbXBkdUhlYWRlck9mZnNldDo4OworICAgICAgICB3cHRfdWludDMyIG1wZHVIZWFkZXJMZW5ndGg6ODsKKyNlbmRpZgorICAgIAorICAgICAgICAvKiAweDEwICovCisjaWZkZWYgV1BUX0JJR19CWVRFX0VORElBTgorICAgIAorICAgICAgICAvKiogVGhpcyBpcyB0aGUgbGVuZ3RoIChpbiBudW1iZXIgb2YgYnl0ZXMpIG9mIHRoZSBlbnRpcmUgTVBEVSAKKyAgICAgICAgKGhlYWRlciBhbmQgZGF0YSkuIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgRkNTIGZpZWxkLiAqLworICAgICAgICB3cHRfdWludDMyIG1wZHVMZW5ndGg6MTY7CisgICAgCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQzOjQ7CisgICAgCisgICAgICAgIC8qKiBUcmFmZmljIElkZW50aWZpZXIKKyAgICAgICAgSW5kaWNhdGVzIHRoZSB0cmFmZmljIGNsYXNzIHRoZSBmcmFtZSBiZWxvbmdzIHRvLiBGb3Igbm9uIFFvUyBmcmFtZXMsCisgICAgICAgIHRoaXMgZmllbGQgaXMgc2V0IHRvIHplcm8uICovCisgICAgICAgIHdwdF91aW50MzIgdGlkOjQ7CisgICAgICAgIAorICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkNDo4OworI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDQ6ODsKKyAgICAgICAgd3B0X3VpbnQzMiB0aWQ6NDsKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDM6NDsKKyAgICAgICAgd3B0X3VpbnQzMiBtcGR1TGVuZ3RoOjE2OworI2VuZGlmCisgICAgCisgICAgICAgIC8qIDB4MTQgKi8KKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgCisgICAgICAgIC8qKiAoT25seSB1c2VkIGJ5IHRoZSBEUFUpCisgICAgICAgIFRoZSBEUFUgZGVzY3JpcHRvciBpbmRleCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB3aGVyZSBpbiBtZW1vcnkgdGhlIERQVSBjYW4KKyAgICAgICAgZmluZCB0aGUgRFBVIGRlc2NyaXB0b3IgcmVsYXRlZCB0byB0aGlzIGZyYW1lLiBUaGUgRFBVIGNhbGN1bGF0ZXMgdGhlCisgICAgICAgIGFkZHJlc3MgYnkgbXVsdGlwbHlpbmcgdGhpcyBpbmRleCB3aXRoIHRoZSBEUFUgZGVzY3JpcHRvciBzaXplIGFuZCBhZGRpbmcKKyAgICAgICAgdGhlIERQVSBkZXNjcmlwdG9ycyBiYXNlIGFkZHJlc3MuIFRoZSBEUFUgZGVzY3JpcHRvciBjb250YWlucyBpbmZvcm1hdGlvbgorICAgICAgICBzcGVjaWZ5aW5nIHRoZSBlbmNyeXB0aW9uIGFuZCBjb21wcmVzc2lvbiB0eXBlIGFuZCBjb250YWlucyByZWZlcmVuY2VzIHRvCisgICAgICAgIHdoZXJlIGVuY3J5cHRpb24ga2V5cyBjYW4gYmUgZm91bmQuICovCisgICAgICAgIHdwdF91aW50MzIgZHB1RGVzY0lkeDo4OworICAgIAorICAgICAgICAvKiogVGhlIHJlc3VsdCBmcm9tIHRoZSBiaW5hcnkgYWRkcmVzcyBzZWFyY2ggb24gdGhlIEFERFIxIG9mIHRoZSBpbmNvbWluZworICAgICAgICBmcmFtZS4gU2VlIGNoYXB0ZXI6IFJYUCBmaWx0ZXIgZm9yIGVuY29kaW5nIG9mIHRoaXMgZmllbGQuICovCisgICAgICAgIHdwdF91aW50MzIgYWRkcjFJbmRleDo4OworICAgIAorICAgICAgICAvKiogVGhlIHJlc3VsdCBmcm9tIHRoZSBiaW5hcnkgYWRkcmVzcyBzZWFyY2ggb24gdGhlIEFERFIyIG9mIHRoZSBpbmNvbWluZworICAgICAgICBmcmFtZS4gU2VlIGNoYXB0ZXI6IFJYUCBmaWx0ZXIgZm9yIGVuY29kaW5nIG9mIHRoaXMgZmllbGQuICovCisgICAgICAgIHdwdF91aW50MzIgYWRkcjJJbmRleDo4OworICAgIAorICAgICAgICAvKiogVGhlIHJlc3VsdCBmcm9tIHRoZSBiaW5hcnkgYWRkcmVzcyBzZWFyY2ggb24gdGhlIEFERFIzIG9mIHRoZSBpbmNvbWluZworICAgICAgICBmcmFtZS4gU2VlIGNoYXB0ZXI6IFJYUCBmaWx0ZXIgZm9yIGVuY29kaW5nIG9mIHRoaXMgZmllbGQuICovCisgICAgICAgIHdwdF91aW50MzIgYWRkcjNJbmRleDo4OworI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiBhZGRyM0luZGV4Ojg7CisgICAgICAgIHdwdF91aW50MzIgYWRkcjJJbmRleDo4OworICAgICAgICB3cHRfdWludDMyIGFkZHIxSW5kZXg6ODsKKyAgICAgICAgd3B0X3VpbnQzMiBkcHVEZXNjSWR4Ojg7CisjZW5kaWYKKyAgICAKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgCisgICAgICAgIC8qKiBJbmRpY2F0ZXMgUmF0ZSBJbmRleCBvZiBwYWNrZXQgcmVjZWl2ZWQgICovCisgICAgICAgIHdwdF91aW50MzIgcmF0ZUluZGV4Ojk7CisgICAgCisgICAgICAgIC8qKiBBbiBvdmVydmlldyBvZiBSWFAgc3RhdHVzIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcmVjZWl2aW5nIHRoZSBmcmFtZS4qLworICAgICAgICB3cHRfdWludDMyIHJ4cEZsYWdzOjIzOyAKKyAgICAKKyNlbHNlCisgICAgCisgICAgICAgIHdwdF91aW50MzIgcnhwRmxhZ3M6MjM7ICAgICAgICAgICAgICAgICAgICAgLyogUnhQIGZsYWdzKi8KKyAgICAgICAgd3B0X3VpbnQzMiByYXRlSW5kZXg6OTsKKyAgICAKKyNlbmRpZgorICAgICAgICAvKiAweDFjLCAyMCAqLworICAgICAgICAvKiogVGhlIFBIWSBjYW4gYmUgcHJvZ3JhbW1lZCB0byBwdXQgYWxsIHRoZSBQSFkgU1RBVFMgcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgUEhZIHdoZW4gcmVjZWl2aW5nIGEgZnJhbWUgaW4gdGhlIEJELiAgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBwaHlTdGF0czA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBIWSBzdGF0dXMgd29yZCAwKi8KKyAgICAgICAgd3B0X3VpbnQzMiBwaHlTdGF0czE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBIWSBzdGF0dXMgd29yZCAxKi8KKyAgICAKKyAgICAgICAgLyogMHgyNCAqLworICAgICAgICAvKiogVGhlIHZhbHVlIG9mIHRoZSBUU0ZbMzE6MF0gYml0cyBhdCB0aGUgbW9tZW50IHRoYXQgdGhlIFJYUCBzdGFydAorICAgICAgICByZWNlaXZpbmcgYSBmcmFtZSBmcm9tIHRoZSBQSFkgUlguICovCisgICAgICAgIHdwdF91aW50MzIgbWNsa1J4VGltZXN0YW1wOyAgICAgICAgICAgICAgICAvKiBSeCB0aW1lc3RhbXAsIG1pY3Jvc2Vjb25kIGJhc2VkKi8KKyAgICAKKyAgICAgICAgLyogMHgyOH4weDM4ICovCisgICAgICAgIC8qKiBUaGUgYml0cyBmcm9tIHRoZSBQTUkgY29tbWFuZCBhcyByZWNlaXZlZCBmcm9tIHRoZSBQSFkgUlguICovCisgICAgICAgIHdwdF91aW50MzIgcG1pQ21kNHRvMjNbNV07ICAgICAgICAgICAgICAgLyogUE1JIGNtZCByY3ZkIGZyb20gUnhQICovCisgICAgCisgICAgICAgIC8qIDB4M2MgKi8KKyAgICAgICAgLyoqIFRoZSBiaXRzIGZyb20gdGhlIFBNSSBjb21tYW5kIGFzIHJlY2VpdmVkIGZyb20gdGhlIFBIWSBSWC4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiBwbWlDbWQyNHRvMjU7CisgICAgCisgICAgICAgIC8qIDB4NDAgKi8KKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgCisgICAgICAgIC8qKiBHaXZlcyBjb21tYW5kcyB0byBzb2Z0d2FyZSB1cG9uIHdoaWNoIGhvc3Qgd2lsbCBwZXJmb3JtIHNvbWUgY29tbWFuZHMuCisgICAgICAgIFBsZWFzZSByZWZlciB0byBmb2xsb3dpbmcgUlBFIGRvY3VtZW50IGZvciBkZXNjcmlwdGlvbiBvZiBhbGwgZGlmZmVyZW50CisgICAgICAgIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiByZW9yZGVyT3Bjb2RlOjQ7CisgICAgCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ2OjEyOworICAgIAorICAgICAgICAvKiogRmlsbGVkIGJ5IFJQRSB0byBJbmRpY2F0ZSB0byB0aGUgaG9zdCB1cCB0byB3aGljaCBzbG90IHRoZSBob3N0IG5lZWRzCisgICAgICAgIHRvIGZvcndhcmQgdGhlIHBhY2tldHMgdG8gdXBwZXIgTWFjIGxheWVyLiBUaGlzIGZpZWxkIG1vc3RseSB1c2VkIGZvciBBTURQVQorICAgICAgICBwYWNrZXRzICovCisgICAgICAgIHdwdF91aW50MzIgcmVvcmRlckZ3ZElkeDo2OworICAgIAorICAgICAgICAvKiogRmlsbGVkIGJ5IFJQRSB3aGljaCBpbmRpY2F0ZXMgdG8gdGhlIGhvc3Qgd2hpY2ggb25lIG9mIHNsb3RzIGluIHRoZQorICAgICAgICBhdmFpbGFibGUgNjQgc2xvdHMgc2hvdWxkIHRoZSBob3N0IFF1ZXVlIHRoZSBwYWNrZXQuIFRoaXMgZmllbGQgb25seQorICAgICAgICBhcHBsaWVkIHRvIEFNUERVIHBhY2tldHMuICovCisgICAgICAgIHdwdF91aW50MzIgcmVvcmRlclNsb3RJZHg6NjsKKyAgICAgICAgCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ3OjQ7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkNzo0OworICAgICAgICB3cHRfdWludDMyIHJlb3JkZXJTbG90SWR4OjY7CisgICAgICAgIHdwdF91aW50MzIgcmVvcmRlckZ3ZElkeDo2OworICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkNjoxMjsKKyAgICAgICAgd3B0X3VpbnQzMiByZW9yZGVyT3Bjb2RlOjQ7CisjZW5kaWYKKyAgICAKKyAgICAgICAgLyogMHg0NCAqLworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAgICAgLyoqIHJlc2VydmVkOCBmcm9tIGEgaGFyZHdhcmUgcGVyc3BlY3RpdmUuCisgICAgICAgIFVzZWQgYnkgU1cgdG8gcHJvcG9nYXRlIGZyYW1lIHR5cGUvc3VidHlwZSBpbmZvcm1hdGlvbiAqLworICAgICAgICB3cHRfdWludDMyIGZyYW1lVHlwZVN1YnR5cGU6ODsKKyAgICAKKyAgICAgICAgLyoqIEZpbGxlZCBSUEUgZ2l2ZXMgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyIGluIGJpdG1hcCAqLworICAgICAgICB3cHRfdWludDMyIGN1cnJlbnRQa3RTZXFObzoxMjsKKyAgICAKKyAgICAgICAgLyoqIEZpbGxlZCBieSBSUEUgd2hpY2ggZ2l2ZXMgdGhlIHNlcXVlbmNlIG51bWJlciBvZiBuZXh0IGV4cGVjdGVkIHBhY2tldAorICAgICAgICBpbiBiaXRtYXAgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBleHBlY3RlZFBrdFNlcU5vOjEyOworI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiBleHBlY3RlZFBrdFNlcU5vOjEyOworICAgICAgICB3cHRfdWludDMyIGN1cnJlbnRQa3RTZXFObzoxMjsKKyAgICAgICAgd3B0X3VpbnQzMiBmcmFtZVR5cGVTdWJ0eXBlOjg7CisjZW5kaWYKKyAgICAKKyAgICAgICAgLyogMHg0OCAqLworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAKKyAgICAgICAgLyoqIFdoZW4gc2V0IGl0IGlzIHRoZSBBTVNEVSBzdWJmcmFtZSAqLworICAgICAgICB3cHRfdWludDMyIGFzZjoxOworICAgIAorICAgICAgICAvKiogV2hlbiBzZXQgaXQgaXMgdGhlIEZpcnN0IHN1YmZyYW1lIG9mIHRoZSBBTVNEVSBwYWNrZXQgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBlc2Y6MTsKKyAgICAKKyAgICAgICAgLyoqIFdoZW4gc2V0IGl0IGlzIHRoZSBsYXN0IHN1YmZyYW1lIG9mIHRoZSBBTVNEVSBwYWNrZXQgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBsc2Y6MTsKKyAgICAKKyAgICAgICAgLyoqIFdoZW4gc2V0IGl0IGluZGljYXRlcyBhbiBFcnJvcmVkIEFNU0RVIHBhY2tldCAqLworICAgICAgICB3cHRfdWludDMyIGFlZjoxOworICAgICAgICAKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDk6NDsKKyAgICAKKyAgICAgICAgLyoqIEl0IGdpdmVzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgQU1TRFUgcGFja2V0IGlzIHByb2Nlc3NlZAorICAgICAgICBCYXNpY2FsbHkgdGhpcyBpcyBhIG51bWJlciB3aGljaCBpbmNyZW1lbnRzIGJ5IG9uZSBmb3IgZXZlcnkgQU1TRFUgZnJhbWUKKyAgICAgICAgcmVjZWl2ZWQuIE1haW5seSBmb3IgZGVidWdnaW5nIHB1cnBvc2UuICovCisgICAgICAgIHdwdF91aW50MzIgcHJvY2Vzc09yZGVyOjQ7CisgICAgCisgICAgICAgIC8qKiBJdCBpcyB0aGUgb3JkZXIgb2YgdGhlIHN1YmZyYW1lIG9mIEFNU0RVIHRoYXQgaXMgcHJvY2Vzc2VkIGJ5IEFEVS4KKyAgICAgICAgVGhpcyBpcyByZXNldCB0byAwIHdoZW4gQURVIGRlYWdncmVnYXRlcyB0aGUgZmlyc3Qgc3ViZnJhbWUgZnJvbSBhIG5ldworICAgICAgICBBTVNEVSBhbmQgaW5jcmVtZW50cyBieSAxIGZvciBldmVyeSBuZXcgc3ViZnJhbWUgZGVhZ2dyZWdhdGVkIHdpdGhpbiB0aGUKKyAgICAgICAgQU1TRFUsIGFmdGVyIGl0IHJlYWNoZXMgNCdoZiBpdCBzdG9wcyBpbmNyZW1lbnRpbmcuIFRoYXQgbWVhbnMgaG9zdCBzaG91bGQKKyAgICAgICAgbm90IHJlbHkgb24gdGhpcyBmaWVsZCBhcyBpbmRleCBmb3Igc3ViZnJhbWUgcXVldWluZy4gIFRoZW9yZXRpY2FsbHkgdGhlcmUKKyAgICAgICAgY2FuIGJlIHdheSBtb3JlIHRoYW4gMTYgc3ViZnJhbWVzIGluIGFuIEFNU0RVLiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVidWcKKyAgICAgICAgcHVycG9zZSwgU1cgc2hvdWxkIHVzZSBMU0YgYW5kIEZTRiBiaXRzIHRvIGRldGVybWluZSBmaXJzdCBhbmQgbGFzdAorICAgICAgICBzdWJmcmFtZXMuICovCisgICAgICAgIHdwdF91aW50MzIgc3liRnJhbWVJZHg6NDsKKyAgICAKKyAgICAgICAgLyoqIEZpbGxlZCBieSBBRFUgdGhpcyBpcyB0aGUgdG90YWwgQU1TRFUgc2l6ZSAqLworICAgICAgICB3cHRfdWludDMyIHRvdGFsTXNkdVNpemU6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIHRvdGFsTXNkdVNpemU6MTY7CisgICAgICAgIHdwdF91aW50MzIgc3liRnJhbWVJZHg6NDsKKyAgICAgICAgd3B0X3VpbnQzMiBwcm9jZXNzT3JkZXI6NDsKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDk6NDsKKyAgICAgICAgd3B0X3VpbnQzMiBhZWY6MTsKKyAgICAgICAgd3B0X3VpbnQzMiBsc2Y6MTsKKyAgICAgICAgd3B0X3VpbnQzMiBlc2Y6MTsKKyAgICAgICAgd3B0X3VpbnQzMiBhc2Y6MTsKKyNlbmRpZgorCit9IFdESV9SeEJkVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAKKyAgV0RJX1J4RmNCZFR5cGUgLSBUaGUgZm9ybWF0IG9mIHRoZSBSWCBzcGVjaWFsIGZsb3cgY29udHJvbCBCRCAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICAgICAgLyogMHgwMCAqLworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAKKyAgICAgICAgLyoqIChPbmx5IHVzZWQgYnkgdGhlIERQVSkKKyAgICAgICAgVGhpcyByb3V0aW5nIGZsYWcgaW5kaWNhdGVzIHRoZSBXUSBudW1iZXIgdG8gd2hpY2ggdGhlIERQVSB3aWxsIHB1c2ggdGhlCisgICAgICAgIGZyYW1lIGFmdGVyIGl0IGZpbmlzaGVkIHByb2Nlc3NpbmcgaXQuICovCisgICAgICAgIHdwdF91aW50MzIgZHB1UkY6ODsKKyAgICAKKyAgICAgICAgLyoqIFRoaXMgaXMgRFBVIHNpZyBpbnNlcnRlZCBieSBSWFAuIFNpZ25hdHVyZSBvbiBSQSdzIERQVSBkZXNjcmlwdG9yICovCisgICAgICAgIHdwdF91aW50MzIgZHB1U2lnbmF0dXJlOjM7CisgICAgCisgICAgICAgIC8qKiBXaGVuIHNldCBTdGEgaXMgYXV0aGVudGljYXRlZC4gU1cgbmVlZHMgdG8gc2V0IGJpdAorICAgICAgICBhZGRyMl9hdXRoX2V4dHJhY3RfZW5hYmxlIGluIHJ4cF9jb25maWcyIHJlZ2lzdGVyLiBUaGVuIFJYUCB3aWxsIHVzZSBiaXQgMworICAgICAgICBpbiBEUFUgc2lnIHRvIHNheSB3aGV0aGVyIFNUQSBpcyBhdXRoZW50aWNhdGVkIG9yIG5vdC4gSW4gdGhpcyBjYXNlIG9ubHkKKyAgICAgICAgbG93ZXIgMmJpdHMgb2YgRFBVIFNpZyBpcyB2YWxpZCAqLworICAgICAgICB3cHRfdWludDMyIHN0QXVGOjE7CisgICAgCisgICAgICAgIC8qKiBXaGVuIHNldCBhZGRyZXNzMiBpcyBub3QgdmFsaWQgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBBMkhGOjE7CisgICAgCisgICAgICAgIC8qKiBXaGVuIHNldCBpdCBpbmRpY2F0ZXMgVFBFIGhhcyBzZW50IHRoZSBCZWFjb24gZnJhbWUgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBic2Y6MTsKKyAgICAKKyAgICAgICAgLyoqIFRoaXMgYml0IGZpbGxlZCBieSByeHAgd2hlbiBzZXQgaW5kaWNhdGVzIGlmIHRoZSBjdXJyZW50IHRzZiBpcyBzbWFsbGVyCisgICAgICAgIHRoYW4gcmVjZWl2ZWQgdHNmICovCisgICAgICAgIHdwdF91aW50MzIgcnRzZjoxOworICAgIAorICAgICAgICAvKiogVGhlc2UgdHdvIGZpZWxkcyBhcmUgdXNlZCBieSBTVyB0byBjYXJyeSB0aGUgUnggQ2hhbm5lbCBudW1iZXIgYW5kIFNDQU4gYml0IGluIFJ4QkQqLworICAgICAgICB3cHRfdWludDMyIHJ4Q2hhbm5lbDo0OworICAgICAgICB3cHRfdWludDMyIHNjYW5MZWFybjoxOworCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQwOjE7CisgICAgCisgICAgICAgIC8qKiBMTEMgUmVtb3ZlZAorICAgICAgICBUaGlzIGJpdCBpcyBvbmx5IHVzZWQgaW4gTGlicmEgcnN2ZCBmb3IgVmlyZ28xLjAvVmlyZ28yLjAKKyAgICAgICAgRmlsbGVkIGJ5IEFEVSB3aGVuIGl0IGlzIHNldCBMTEMgaXMgcmVtb3ZlZCBmcm9tIHBhY2tldCAqLworICAgICAgICB3cHRfdWludDMyIGxsY3I6MTsKKyAgICAgICAgCisgICAgICAgIHdwdF91aW50MzIgdW1hQnlQYXNzOjE7CisgICAgCisgICAgICAgIC8qKiBUaGlzIGJpdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBWaXJnbzIuMC9saWJyYSBpdCBpcyByZXNlcnZlZCBpbiBWaXJnbzEuMAorICAgICAgICBSb2J1c3QgTWFuYWdlbWVudCBmcmFtZS4gVGhpcyBiaXQgaW5kaWNhdGVzIHRvIERQVSB0aGF0IHRoZSBwYWNrZXQgaXMgYQorICAgICAgICByb2J1c3QgbWFuYWdlbWVudCBmcmFtZSB3aGljaCByZXF1aXJlcyBkZWNyeXB0aW9uKHRoaXMgYml0IGlzIG9ubHkgdmFsaWQgZm9yCisgICAgICAgIG1hbmFnZW1lbnQgdW5pY2FzdCBlbmNyeXB0ZWQgZnJhbWVzKQorICAgICAgICAxIC0gTmVlZHMgZGVjcnlwdGlvbgorICAgICAgICAwIC0gTm8gZGVjcnlwdGlvbiByZXF1aXJlZCAqLworICAgICAgICB3cHRfdWludDMyIHJtZjoxOworICAgIAorICAgICAgICAvKiogCisgICAgICAgIFRoaXMgYml0IGlzIG9ubHkgaW4gVmlyZ28yLjAvbGlicmEgaXQgaXMgcmVzZXJ2ZWQgaW4gVmlyZ28gMS4wCisgICAgICAgIFRoaXMgMS1iaXQgZmllbGQgaW5kaWNhdGVzIHRvIERQVSBVbmljYXN0L0JDL01DIHBhY2tldAorICAgICAgICAwIC0gVW5pY2FzdCBwYWNrZXQKKyAgICAgICAgMSAtIEJyb2FkY2FzdC9NdWx0aWNhc3QgcGFja2V0CisgICAgICAgIFRoaXMgYml0IGlzIG9ubHkgdmFsaWQgd2hlbiBSTUYgYml0IGlzIDEgKi8KKyAgICAgICAgd3B0X3VpbnQzMiB1YjoxOworICAgIAorICAgICAgICAvKiogVGhpcyBpcyB0aGUgS0VZIElEIGV4dHJhY3RlZCBmcm9tIFdFUCBwYWNrZXRzIGFuZCBpcyB1c2VkIGZvciBkZXRlcm1pbmUKKyAgICAgICAgdGhlIFJYIEtleSBJbmRleCB0byB1c2UgaW4gdGhlIERQVSBEZXNjcmlwdHJvci4KKyAgICAgICAgVGhpcyBmaWVsZCAgaXMgMmJpdHMgZm9yIHZpcmdvIDEuMAorICAgICAgICBBbmQgMyBiaXRzIGluIHZpcmdvMi4wIGFuZCBMaWJyYQorICAgICAgICBJbiB2aXJnbzIuMC9saWJyYSBpdCBpcyAzYml0cyBmb3IgdGhlIEJDL01DIHBhY2tldHMgKi8KKyAgICAgICAgd3B0X3VpbnQzMiByeEtleUlkOjM7CisgICAgICAgIAorICAgICAgICAvKiogIChPbmx5IHVzZWQgYnkgdGhlIERQVSkgICAgCisgICAgICAgIE5vIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorICAgICAgICAwOiBObyBhY3Rpb24KKyAgICAgICAgMTogRFBVIHdpbGwgbm90IGVuY3J5cHQvZGVjcnlwdCB0aGUgZnJhbWUsIGFuZCBkaXNjYXJkIGFueSBlbmNyeXB0aW9uCisgICAgICAgIHJlbGF0ZWQgc2V0dGluZ3MgaW4gdGhlIFBEVSBkZXNjcmlwdG9yLiAqLworICAgICAgICB3cHRfdWludDMyIGRwdU5FOjE7CisgICAgCisgICAgICAgIC8qKiAKKyAgICAgICAgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBsaWJyYS92aXJnbzIuMCAgaXQgaXMgcmVzZXJ2ZWQgZm9yIHZpcmdvMS4wCisgICAgICAgIFRoaXMgYml0IGlzIGZpbGxlZCBieSBSWFAgYW5kIG1vZGlmaWVkIGJ5IEFEVQorICAgICAgICBUaGlzIGJpdCBpbmRpY2F0ZXMgdG8gQURVL1VNQSBtb2R1bGUgdGhhdCB0aGUgcGFja2V0IHJlcXVpcmVzIDgwMi4xMW4gdG8KKyAgICAgICAgODAyLjMgZnJhbWUgdHJhbnNsYXRpb24uIE9uY2UgQURVL1VNQSBpcyBkb25lIHdpdGggdHJhbnNsYXRpb24gdGhleQorICAgICAgICBvdmVyd3JpdGUgaXQgd2l0aCAxJ2IwLzEnYjEgZGVwZW5kaW5nIG9uIGhvdyB0aGUgdHJhbnNsYXRpb24gcmVzdWx0ZWQKKyAgICAgICAgV2hlbiB1c2VkIGJ5IEFEVSAKKyAgICAgICAgMCAtIE5vIGZyYW1lIHRyYW5zbGF0aW9uIHJlcXVpcmVkCisgICAgICAgIDEgLSBGcmFtZSBUcmFuc2xhdGlvbiByZXF1aXJlZAorICAgICAgICBXaGVuIHVzZWQgYnkgU1cKKyAgICAgICAgMCAtIEZyYW1lIHRyYW5zbGF0aW9uIG5vdCBkb25lLCBNUERVIGhlYWRlciBvZmZzZXQgcG9pbnRzIHRvIDgwMi4xMSBoZWFkZXIuLgorICAgICAgICAxIC0gRnJhbWUgdHJhbnNsYXRpb24gZG9uZSA7ICBoZW5jZSBNUERVIGhlYWRlciBvZmZzZXQgd2lsbCBwb2ludCB0byBhCisgICAgICAgIDgwMi4zIGhlYWRlciAqLworICAgICAgICB3cHRfdWludDMyIGZ0OjE7CisgICAgCisgICAgICAgIC8qKiAoT25seSB1c2VkIGJ5IHRoZSBEUFUpCisgICAgICAgIEJEIFR5cGUgCisgICAgICAgIDAwOiAnR2VuZXJpYyBCRCcsIGFzIGluZGljdGVkIGFib3ZlCisgICAgICAgIDAxOiBEZS1mcmFnbWVudGF0aW9uIGZvcm1hdCAKKyAgICAgICAgMTAtMTE6IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqLworICAgICAgICB3cHRfdWludDMyIGJkdDoyOworICAgICAgICAKKyNlbHNlCisgICAgICAgIHdwdF91aW50MzIgYmR0OjI7CisgICAgICAgIHdwdF91aW50MzIgZnQ6MTsKKyAgICAgICAgd3B0X3VpbnQzMiBkcHVORToxOworICAgICAgICB3cHRfdWludDMyIHJ4S2V5SWQ6MzsKKyAgICAgICAgd3B0X3VpbnQzMiB1YjoxOworICAgICAgICB3cHRfdWludDMyIHJtZjoxOworICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMToxOworICAgICAgICB3cHRfdWludDMyIGxsYzoxOworICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMDoxOworICAgICAgICB3cHRfdWludDMyIHNjYW5MZWFybjoxOworICAgICAgICB3cHRfdWludDMyIHJ4Q2hhbm5lbDo0OworICAgICAgICB3cHRfdWludDMyIHJ0c2Y6MTsKKyAgICAgICAgd3B0X3VpbnQzMiBic2Y6MTsKKyAgICAgICAgd3B0X3VpbnQzMiBBMkhGOjE7CisgICAgICAgIHdwdF91aW50MzIgc3RBdUY6MTsKKyAgICAgICAgd3B0X3VpbnQzMiBkcHVTaWduYXR1cmU6MzsKKyAgICAgICAgd3B0X3VpbnQzMiBkcHVSRjo4OworI2VuZGlmCisgICAgCisgICAgICAgIC8qIDB4MDQgKi8KKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgCisgICAgICAgIC8qKiBUaGlzIGlzIHVzZWQgZm9yIEFNU0RVIHRoaXMgaXMgdGhlIFBEVSBpbmRleCBvZiB0aGUgUERVIHdoaWNoIGlzIHRoZQorICAgICAgICBvbmUgYmVmb3JlIGxhc3QgUERVOyBmb3IgYWxsIG5vbiBBTVNEVSBmcmFtZXMsIHRoaXMgZmllbGQgU0hBTEwgYmUgMC4KKyAgICAgICAgVXNlZCBpbiBBRFUgKGZvciBBTVNEVSBkZWFnZ3JlZ2F0aW9uKSAqLworICAgICAgICB3cHRfdWludDMyIHBlbnVsdGltYXRlUGR1SWR4OjE2OworICAgIAorICAgICAgICB3cHRfdWludDMyIGFkdUZlZWRiYWNrOjg7CisgICAgCisgICAgICAgIC8qKiBEUFUgZmVlZGJhY2sgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBkcHVGZWVkYmFjazo4OworICAgICAgICAKKyNlbHNlCisgICAgICAgIHdwdF91aW50MzIgZHB1RmVlZGJhY2s6ODsKKyAgICAgICAgd3B0X3VpbnQzMiBhZHVGZWVkYmFjazo4OworICAgICAgICB3cHRfdWludDMyIHBlbnVsdGltYXRlUGR1SWR4OjE2OworI2VuZGlmCisgICAgCisgICAgICAgIC8qIDB4MDggKi8KKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgCisgICAgICAgIC8qKiBJbiBjYXNlIFBEVXMgYXJlIGxpbmtlZCB0byB0aGUgQkQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBpbmRleCBvZgorICAgICAgICB0aGUgZmlyc3QgUERVIGxpbmtlZCB0byB0aGUgQkQuIFdoZW4gUERVIGNvdW50IGlzIHplcm8sIHRoaXMgZmllbGQgaGFzIGFuCisgICAgICAgIHVuZGVmaW5lZCB2YWx1ZS4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiBoZWFkUGR1SWR4OjE2OworICAgIAorICAgICAgICAvKiogSW4gY2FzZSBQRFVzIGFyZSBsaW5rZWQgdG8gdGhlIEJELCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGUgaW5kZXggb2YKKyAgICAgICAgdGhlIGxhc3QgUERVLiBXaGVuIFBEVSBjb3VudCBpcyB6ZXJvLCB0aGlzIGZpZWxkIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUuKi8KKyAgICAgICAgd3B0X3VpbnQzMiB0YWlsUGR1SWR4OjE2OworICAgICAgICAKKyNlbHNlCisgICAgICAgIHdwdF91aW50MzIgdGFpbFBkdUlkeDoxNjsKKyAgICAgICAgd3B0X3VpbnQzMiBoZWFkUGR1SWR4OjE2OworI2VuZGlmCisgICAgCisgICAgICAgIC8qIDB4MGMgKi8KKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgCisgICAgICAgIC8qKiBUaGUgbGVuZ3RoIChpbiBudW1iZXIgb2YgYnl0ZXMpIG9mIHRoZSBNUERVIGhlYWRlci4gCisgICAgICAgIExpbWl0YXRpb246IFRoZSBNUERVIGhlYWRlciBvZmZzZXQgKyBNUERVIGhlYWRlciBsZW5ndGggY2FuIG5ldmVyIGdvIGJleW9uZAorICAgICAgICB0aGUgZW5kIG9mIHRoZSBmaXJzdCBQRFUgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBtcGR1SGVhZGVyTGVuZ3RoOjg7CisgICAgCisgICAgICAgIC8qKiBUaGUgc3RhcnQgYnl0ZSBudW1iZXIgb2YgdGhlIE1QRFUgaGVhZGVyLiAKKyAgICAgICAgVGhlIGJ5dGUgbnVtYmVyaW5nIGlzIGRvbmUgaW4gdGhlIEJFIGZvcm1hdC4gV29yZCAweDAsIGJpdHMgWzMxOjI0XSBoYXMKKyAgICAgICAgYnl0ZSBpbmRleCAwLiAqLworICAgICAgICB3cHRfdWludDMyIG1wZHVIZWFkZXJPZmZzZXQ6ODsKKyAgICAKKyAgICAgICAgLyoqIFRoZSBzdGFydCBieXRlIG51bWJlciBvZiB0aGUgTVBEVSBkYXRhLiAKKyAgICAgICAgVGhlIGJ5dGUgbnVtYmVyaW5nIGlzIGRvbmUgaW4gdGhlIEJFIGZvcm1hdC4gV29yZCAweDAsIGJpdHMgWzMxOjI0XSBoYXMKKyAgICAgICAgYnl0ZSBpbmRleCAwLiBOb3RlIHRoYXQgdGhpcyBvZmZzZXQgY2FuIHBvaW50IGFsbCB0aGUgd2F5IGludG8gdGhlIGZpcnN0CisgICAgICAgIGxpbmtlZCBQRFUuCisgICAgICAgIExpbWl0YXRpb246IE1QRFUgREFUQSBPRkZTRVQgY2FuIG5vdCBwb2ludCBpbnRvIHRoZSAybmQgbGlua2VkIFBEVSAqLworICAgICAgICB3cHRfdWludDMyIG1wZHVEYXRhT2Zmc2V0Ojk7CisgICAgCisgICAgICAgIC8qKiBUaGUgbnVtYmVyIG9mIFBEVXMgbGlua2VkIHRvIHRoZSBCRC4gCisgICAgICAgIFRoaXMgZmllbGQgc2hvdWxkIGFsd2F5cyBpbmRpY2F0ZSB0aGUgY29ycmVjdCBhbW91bnQuICovCisgICAgICAgIHdwdF91aW50MzIgcGR1Q291bnQ6NzsKKyNlbHNlCisgICAgCisgICAgICAgIHdwdF91aW50MzIgcGR1Q291bnQ6NzsKKyAgICAgICAgd3B0X3VpbnQzMiBtcGR1RGF0YU9mZnNldDo5OworICAgICAgICB3cHRfdWludDMyIG1wZHVIZWFkZXJPZmZzZXQ6ODsKKyAgICAgICAgd3B0X3VpbnQzMiBtcGR1SGVhZGVyTGVuZ3RoOjg7CisjZW5kaWYKKyAgICAKKyAgICAgICAgLyogMHgxMCAqLworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAKKyAgICAgICAgLyoqIFRoaXMgaXMgdGhlIGxlbmd0aCAoaW4gbnVtYmVyIG9mIGJ5dGVzKSBvZiB0aGUgZW50aXJlIE1QRFUgCisgICAgICAgIChoZWFkZXIgYW5kIGRhdGEpLiBOb3RlIHRoYXQgdGhlIGxlbmd0aCBkb2VzIG5vdCBpbmNsdWRlIEZDUyBmaWVsZC4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiBtcGR1TGVuZ3RoOjE2OworICAgIAorICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMzo0OworICAgIAorICAgICAgICAvKiogVHJhZmZpYyBJZGVudGlmaWVyCisgICAgICAgIEluZGljYXRlcyB0aGUgdHJhZmZpYyBjbGFzcyB0aGUgZnJhbWUgYmVsb25ncyB0by4gRm9yIG5vbiBRb1MgZnJhbWVzLAorICAgICAgICB0aGlzIGZpZWxkIGlzIHNldCB0byB6ZXJvLiAqLworICAgICAgICB3cHRfdWludDMyIHRpZDo0OworICAgICAgICAKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDQ6NzsKKyAgICAgICAgd3B0X3VpbnQzMiBmYzoxOyAgICAgICAgLy9pZiBzZXQgdGhlbiBpdHMgc3BlY2lhbCBmbG93IGNvbnRyb2wgQkQuCisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZjOjE7ICAgICAgICAvL2lmIHNldCB0aGVuIGl0cyBzcGVjaWFsIGZsb3cgY29udHJvbCBCRC4KKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDQ6NzsKKyAgICAgICAgd3B0X3VpbnQzMiB0aWQ6NDsKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDM6NDsKKyAgICAgICAgd3B0X3VpbnQzMiBtcGR1TGVuZ3RoOjE2OworI2VuZGlmCisgICAgCisgICAgICAgIC8qIDB4MTQgKi8KKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgCisgICAgICAgIC8qKiAoT25seSB1c2VkIGJ5IHRoZSBEUFUpCisgICAgICAgIFRoZSBEUFUgZGVzY3JpcHRvciBpbmRleCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB3aGVyZSBpbiBtZW1vcnkgdGhlIERQVSBjYW4KKyAgICAgICAgZmluZCB0aGUgRFBVIGRlc2NyaXB0b3IgcmVsYXRlZCB0byB0aGlzIGZyYW1lLiBUaGUgRFBVIGNhbGN1bGF0ZXMgdGhlCisgICAgICAgIGFkZHJlc3MgYnkgbXVsdGlwbHlpbmcgdGhpcyBpbmRleCB3aXRoIHRoZSBEUFUgZGVzY3JpcHRvciBzaXplIGFuZCBhZGRpbmcKKyAgICAgICAgdGhlIERQVSBkZXNjcmlwdG9ycyBiYXNlIGFkZHJlc3MuIFRoZSBEUFUgZGVzY3JpcHRvciBjb250YWlucyBpbmZvcm1hdGlvbgorICAgICAgICBzcGVjaWZ5aW5nIHRoZSBlbmNyeXB0aW9uIGFuZCBjb21wcmVzc2lvbiB0eXBlIGFuZCBjb250YWlucyByZWZlcmVuY2VzIHRvCisgICAgICAgIHdoZXJlIGVuY3J5cHRpb24ga2V5cyBjYW4gYmUgZm91bmQuICovCisgICAgICAgIHdwdF91aW50MzIgZHB1RGVzY0lkeDo4OworICAgIAorICAgICAgICAvKiogVGhlIHJlc3VsdCBmcm9tIHRoZSBiaW5hcnkgYWRkcmVzcyBzZWFyY2ggb24gdGhlIEFERFIxIG9mIHRoZSBpbmNvbWluZworICAgICAgICBmcmFtZS4gU2VlIGNoYXB0ZXI6IFJYUCBmaWx0ZXIgZm9yIGVuY29kaW5nIG9mIHRoaXMgZmllbGQuICovCisgICAgICAgIHdwdF91aW50MzIgYWRkcjFJbmRleDo4OworICAgIAorICAgICAgICAvKiogVGhlIHJlc3VsdCBmcm9tIHRoZSBiaW5hcnkgYWRkcmVzcyBzZWFyY2ggb24gdGhlIEFERFIyIG9mIHRoZSBpbmNvbWluZworICAgICAgICBmcmFtZS4gU2VlIGNoYXB0ZXI6IFJYUCBmaWx0ZXIgZm9yIGVuY29kaW5nIG9mIHRoaXMgZmllbGQuICovCisgICAgICAgIHdwdF91aW50MzIgYWRkcjJJbmRleDo4OworICAgIAorICAgICAgICAvKiogVGhlIHJlc3VsdCBmcm9tIHRoZSBiaW5hcnkgYWRkcmVzcyBzZWFyY2ggb24gdGhlIEFERFIzIG9mIHRoZSBpbmNvbWluZworICAgICAgICBmcmFtZS4gU2VlIGNoYXB0ZXI6IFJYUCBmaWx0ZXIgZm9yIGVuY29kaW5nIG9mIHRoaXMgZmllbGQuICovCisgICAgICAgIHdwdF91aW50MzIgYWRkcjNJbmRleDo4OworI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiBhZGRyM0luZGV4Ojg7CisgICAgICAgIHdwdF91aW50MzIgYWRkcjJJbmRleDo4OworICAgICAgICB3cHRfdWludDMyIGFkZHIxSW5kZXg6ODsKKyAgICAgICAgd3B0X3VpbnQzMiBkcHVEZXNjSWR4Ojg7CisjZW5kaWYKKyAgICAKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgCisgICAgICAgIC8qKiBJbmRpY2F0ZXMgUmF0ZSBJbmRleCBvZiBwYWNrZXQgcmVjZWl2ZWQgICovCisgICAgICAgIHdwdF91aW50MzIgcmF0ZUluZGV4Ojk7CisgICAgCisgICAgICAgIC8qKiBBbiBvdmVydmlldyBvZiBSWFAgc3RhdHVzIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcmVjZWl2aW5nIHRoZSBmcmFtZS4qLworICAgICAgICB3cHRfdWludDMyIHJ4cEZsYWdzOjIzOyAKKyAgICAKKyNlbHNlCisgICAgCisgICAgICAgIHdwdF91aW50MzIgcnhwRmxhZ3M6MjM7ICAgICAgICAgICAgICAgICAgICAgLyogUnhQIGZsYWdzKi8KKyAgICAgICAgd3B0X3VpbnQzMiByYXRlSW5kZXg6OTsKKyAgICAKKyNlbmRpZgorICAgICAgICAvKiAweDFjLCAyMCAqLworICAgICAgICAvKiogVGhlIFBIWSBjYW4gYmUgcHJvZ3JhbW1lZCB0byBwdXQgYWxsIHRoZSBQSFkgU1RBVFMgcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgUEhZIHdoZW4gcmVjZWl2aW5nIGEgZnJhbWUgaW4gdGhlIEJELiAgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBwaHlTdGF0czA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBIWSBzdGF0dXMgd29yZCAwKi8KKyAgICAgICAgd3B0X3VpbnQzMiBwaHlTdGF0czE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBIWSBzdGF0dXMgd29yZCAxKi8KKyAgICAKKyAgICAgICAgLyogMHgyNCAqLworICAgICAgICAvKiogVGhlIHZhbHVlIG9mIHRoZSBUU0ZbMzE6MF0gYml0cyBhdCB0aGUgbW9tZW50IHRoYXQgdGhlIFJYUCBzdGFydAorICAgICAgICByZWNlaXZpbmcgYSBmcmFtZSBmcm9tIHRoZSBQSFkgUlguICovCisgICAgICAgIHdwdF91aW50MzIgbWNsa1J4VGltZXN0YW1wOyAgICAgICAgICAgICAgICAvKiBSeCB0aW1lc3RhbXAsIG1pY3Jvc2Vjb25kIGJhc2VkKi8KKyAgICAKKyAgICAgICAvKiAweDI4IC0gMHgyYyovICAgICAKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOICAKKyAgICAgICAgLyoqIE9uZSBiaXQgcGVyIFNUQS4gQml0IFggZm9yIFNUQSBpZCBYLCBYPTB+Ny4gV2hlbiBzZXQsIGNvcnJlc3BvbmRpbmcgU1RBIGlzIHZhbGlkIGluIEZXJ3MgU1RBIHRhYmxlLiovCisgICAgICAgIHdwdF91aW50MzIgZmNTVEFWYWxpZE1hc2s6MTY7CisgICAgICAgIC8qKiBPbmUgYml0IHBlciBTVEEuIEJpdCBYIGZvciBTVEEgaWQgWCwgWD0wfjcuIFZhbGlkIG9ubHkgd2hlbiBjb3JyZXNwb25kaW5nIGJpdCBpbiBmY1NUQVZhbGlzTWFzayBpcyBzZXQuKi8KKyAgICAgICAgd3B0X3VpbnQzMiBmY1NUQVB3clNhdmVTdGF0ZU1hc2s6MTY7CisgICAgICAgIC8qKiBPbmUgYml0IHBlciBTVEEuIEJpdCBYIGZvciBTVEEgaWQgWCwgWD0wfjcuIFZhbGlkIG9ubHkgd2hlbiBjb3JyZXNwb25kaW5nIGJpdCBpbiBmY1NUQVZhbGlzTWFzayBpcyBzZXQuIAorICAgICAgICBXaGVuIHNldCwgY29ycmVzcG9uZGluZyBmY1NUQVRocmVzaEVuYWJsZU1hc2sgYml0IGluIHByZXZpb3VzIGZsb3cgY29udHJvbCByZXF1ZXN0IHBhY2tldCBmcmFtZSB3YXMgZW5hYmxlZCAKKyAgICAgICAgQU5EIHRoZSBTVEEgVHhRIGxlbmd0aCBpcyBsb3dlciB0aGFuIGNvbmZpZ3VyZWQgZmNTVEFUaHJlc2g8WD4gdmFsdWUuICovICAgICAgICAKKyAgICAgICAgd3B0X3VpbnQzMiBmY1NUQVRocmVzaEluZE1hc2s6MTY7CisgICAgICAgIC8qKiBCaXQgMCB1bml0OiAxPUJEIGNvdW50KExpYnJhIFNvZnRBUCBwcm9qZWN0IGRlZmF1bHQpLiAwPXBhY2tldCBjb3VudC4gQml0IDctMTogUmVzZXJ2ZWQgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBmY1NUQVR4UVN0YXR1czoxNjsKKyNlbHNlCisgICAgICAgIHdwdF91aW50MzIgZmNTVEFUeFFTdGF0dXM6MTY7CisgICAgICAgIHdwdF91aW50MzIgZmNTVEFUaHJlc2hJbmRNYXNrOjE2OworICAgICAgICB3cHRfdWludDMyIGZjU1RBUHdyU2F2ZVN0YXRlTWFzazoxNjsKKyAgICAgICAgd3B0X3VpbnQzMiBmY1NUQVZhbGlkTWFzazoxNjsKKyNlbmRpZgorICAgICAgICAvKiAweDMwICovCisjaWZkZWYgV1BUX0JJR19CWVRFX0VORElBTiAKKyAgICAgICAgd3B0X3VpbnQzMiBmY1N0YVR4RGlzYWJsZWRCaXRtYXA6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ1OjE2OworI2Vsc2UgICAKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDU6MTY7CisgICAgICAgIHdwdF91aW50MzIgZmNTdGFUeERpc2FibGVkQml0bWFwOjE2OworI2VuZGlmCisgICAgICAgIAorICAgICAgICAvLyB3aXRoIEhBTF9OVU1fU1RBIGFzIDEyIAorICAgICAgICAvKiAweDM0IHRvIDB4M0EqLworICAgICAgICB3cHRfdWludDMyICBmY1NUQVR4UUxlblsxMl07ICAgICAgICAgICAgLy8gb25lIGJ5dGUgcGVyIFNUQS4gCisgICAgICAgIHdwdF91aW50MzIgIGZjU1RBQ3VyVHhSYXRlWzEyXTsgICAgICAgICAvLyBjdXJyZW50IFR4IHJhdGUgZm9yIGVhY2ggc3RhLiAKKworfSBXRElfRmNSeEJkVHlwZTsgLy9mbG93IGNvbnRyb2wgQkQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAKKyAgV0RJX1R4QmRUeXBlIC0gVGhlIGZvcm1hdCBvZiB0aGUgVFggQkQgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgICAgICAgIC8qIDB4MDAgKi8KKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIC8qKiAoT25seSB1c2VkIGJ5IHRoZSBEUFUpIFRoaXMgcm91dGluZyBmbGFnIGluZGljYXRlcyB0aGUgV1EgbnVtYmVyIHRvCisgICAgICAgIHdoaWNoIHRoZSBEUFUgd2lsbCBwdXNoIHRoZSBmcmFtZSBhZnRlciBpdCBmaW5pc2hlZCBwcm9jZXNzaW5nIGl0LiAqLworICAgICAgICB3cHRfdWludDMyIGRwdVJGOjg7CisgICAgCisgICAgICAgIC8qKiBEUFUgc2lnbmF0dXJlLiBGaWxsZWQgYnkgSG9zdCBpbiBWaXJnbyAxLjAgYnV0IGJ5IEFEVSBpbiBWaXJnbyAyLjAgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBkcHVTaWduYXR1cmU6MzsKKyAgICAKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDA6MTI7CisgICAgCisgICAgICAgIC8qKiBPbmx5IGF2YWlsYWJsZSBpbiBWaXJnbyAyLjAgYW5kIHJlc2VydmVkIGluIFZpcmdvIDEuMC4KKyAgICAgICAgVGhpcyBiaXQgaW5kaWNhdGVzIHRvIERQVSB0aGF0IHRoZSBwYWNrZXQgaXMgYSByb2J1c3QgbWFuYWdlbWVudCBmcmFtZQorICAgICAgICB3aGljaCByZXF1aXJlcyAgZW5jcnlwdGlvbih0aGlzIGJpdCBpcyBvbmx5IHZhbGlkIGZvciBjZXJ0YWluIG1hbmFnZW1lbnQKKyAgICAgICAgZnJhbWVzKQorICAgICAgICAxIC0gTmVlZHMgZW5jcnlwdGlvbgorICAgICAgICAwIC0gTm8gZW5jcnl0aW9uIHJlcXVpcmVkCisgICAgICAgIEl0IGlzIG9ubHkgc2V0IHdoZW4gUHJpdmFjeSBiaXQ9MSBBTkQgdHlwZS9zdWJ0eXBlPURlYXV0aCwgQWN0aW9uLAorICAgICAgICBEaXNhc3NvYy4gT3RoZXJ3aXNlIGl0IHNob3VsZCBhbHdheXMgYmUgMC4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiBybWY6MTsKKyAgICAKKyAgICAgICAgLyoqIFRoaXMgYml0IGlzIG9ubHkgaW4gVmlyZ28yLjAvbGlicmEgaXQgaXMgcmVzZXJ2ZWQgaW4gVmlyZ28gMS4wCisgICAgICAgIFRoaXMgMS1iaXQgZmllbGQgaW5kaWNhdGVzIHRvIERQVSBVbmljYXN0L0JDL01DIHBhY2tldAorICAgICAgICAwIC0gVW5pY2FzdCBwYWNrZXQKKyAgICAgICAgMSAtIEJyb2FkY2FzdC9NdWx0aWNhc3QgcGFja2V0CisgICAgICAgIFRoaXMgYml0IGlzIHZhbGlkIG9ubHkgaWYgUk1GIGJpdCBpcyBzZXQgKi8KKyAgICAgICAgd3B0X3VpbnQzMiB1YjoxOworICAgIAorICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMToxOworICAgIAorICAgICAgICAvKiogIFRoaXMgYml0IGlzIG9ubHkgaW4gVmlyZ28yLjAvbGlicmEgaXQgaXMgcmVzZXJ2ZWQgaW4gVmlyZ28gMS4wCisgICAgICAgIFRoaXMgYml0IGluZGljYXRlcyBUUEUgaGFzIHRvIGFzc2VydCB0aGUgVFggY29tcGxldGUgaW50ZXJydXB0LgorICAgICAgICAwIC0gbm8gaW50ZXJydXB0CisgICAgICAgIDEgLSBnZW5lcmF0ZSBpbnRlcnJ1cHQgKi8KKyAgICAgICAgd3B0X3VpbnQzMiB0eENvbXBsZXRlMToxOworICAgICAgICB3cHRfdWludDMyIGZ3VHhDb21wbGV0ZTA6MTsKKyAgICAgICAgCisgICAgICAgIC8qKiAoT25seSB1c2VkIGJ5IHRoZSBEUFUpCisgICAgICAgIE5vIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorICAgICAgICAwOiBObyBhY3Rpb24KKyAgICAgICAgMTogRFBVIHdpbGwgbm90IGVuY3J5cHQvZGVjcnlwdCB0aGUgZnJhbWUsIGFuZCBkaXNjYXJkIGFueSBlbmNyeXB0aW9uCisgICAgICAgIHJlbGF0ZWQgc2V0dGluZ3MgaW4gdGhlIFBEVSBkZXNjcmlwdG9yLiAqLworICAgICAgICB3cHRfdWludDMyIGRwdU5FOjE7CisgICAgCisgICAgICAgIAorICAgICAgICAvKiogVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBsaWJyYS92aXJnbzIuMCAgaXQgaXMgcmVzZXJ2ZWQgZm9yIHZpcmdvMS4wCisgICAgICAgIFRoaXMgYml0IGluZGljYXRlcyB0byBBRFUvVU1BIG1vZHVsZSB0aGF0IHRoZSBwYWNrZXQgcmVxdWlyZXMgODAyLjExbgorICAgICAgICB0byA4MDIuMyBmcmFtZSB0cmFuc2xhdGlvbi4gV2hlbiB1c2VkIGJ5IEFEVSAKKyAgICAgICAgMCAtIE5vIGZyYW1lIHRyYW5zbGF0aW9uIHJlcXVpcmVkCisgICAgICAgIDEgLSBGcmFtZSBUcmFuc2xhdGlvbiByZXF1aXJlZCAqLworICAgICAgICB3cHRfdWludDMyIGZ0OjE7CisgICAgCisgICAgICAgIC8qKiBCRCBUeXBlIAorICAgICAgICAwMDogJ0dlbmVyaWMgQkQnLCBhcyBpbmRpY3RlZCBhYm92ZQorICAgICAgICAwMTogRGUtZnJhZ21lbnRhdGlvbiBmb3JtYXQgCisgICAgICAgIDEwLTExOiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiBiZHQ6MjsKKyNlbHNlCisgICAgICAgIHdwdF91aW50MzIgYmR0OjI7CisgICAgICAgIHdwdF91aW50MzIgZnQ6MTsKKyAgICAgICAgd3B0X3VpbnQzMiBkcHVORToxOworICAgICAgICB3cHRfdWludDMyIGZ3VHhDb21wbGV0ZTA6MTsgCisgICAgICAgIHdwdF91aW50MzIgdHhDb21wbGV0ZTE6MTsKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDE6MTsKKyAgICAgICAgd3B0X3VpbnQzMiB1YjoxOworICAgICAgICB3cHRfdWludDMyIHJtZjoxOworICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMDoxMjsKKyAgICAgICAgd3B0X3VpbnQzMiBkcHVTaWduYXR1cmU6MzsKKyAgICAgICAgd3B0X3VpbnQzMiBkcHVSRjo4OworI2VuZGlmCisgICAgCisgICAgICAgIC8qIDB4MDQgKi8KKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQyOjE2OyAvKiBNVVNUIEJFIDAgb3RoZXJ3aXNlIHRyaWdnZXJzIEJNVSBlcnJvciovCisgICAgICAgIHdwdF91aW50MzIgYWR1RmVlZGJhY2s6ODsKKyAgICAKKyAgICAgICAgLyogRFBVIGZlZWRiYWNrIGluIFR4IHBhdGguKi8KKyAgICAgICAgd3B0X3VpbnQzMiBkcHVGZWVkYmFjazo4OworICAgIAorI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiBkcHVGZWVkYmFjazo4OworICAgICAgICB3cHRfdWludDMyIGFkdUZlZWRiYWNrOjg7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQyOjE2OworI2VuZGlmCisgICAgCisgICAgICAgIC8qIDB4MDggKi8KKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIC8qKiBJdCBpcyBpbml0aWFsbHkgZmlsbGVkIGJ5IERYRSB0aGVuIGlmIGVuY3J5cHRpb24gaXMgb24sIHRoZW4gRFBVIHdpbGwKKyAgICAgICAgb3ZlcndyaXRlIHRoZXNlIGZpZWxkcy4gSW4gY2FzZSBQRFVzIGFyZSBsaW5rZWQgdG8gdGhlIEJELCB0aGlzIGZpZWxkCisgICAgICAgIGluZGljYXRlcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IFBEVSBsaW5rZWQgdG8gdGhlIEJELiBXaGVuIFBEVSBjb3VudCBpcworICAgICAgICB6ZXJvLCB0aGlzIGZpZWxkIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUuICovCisgICAgICAgIHdwdF91aW50MzIgaGVhZFBkdUlkeDoxNjsKKyAgICAKKyAgICAgICAgLyoqICBJdCBpcyBpbml0aWFsbHkgZmlsbGVkIGJ5IERYRSB0aGVuIGlmIGVuY3J5cHRpb24gaXMgb24sIHRoZW4gRFBVIHdpbGwKKyAgICAgICAgb3ZlcndyaXRlIHRoZXNlIGZpZWxkcy5JbiBjYXNlIFBEVXMgYXJlIGxpbmtlZCB0byB0aGUgQkQsIHRoaXMgZmllbGQKKyAgICAgICAgaW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBQRFUuIFdoZW4gUERVIGNvdW50IGlzIHplcm8sIHRoaXMgZmllbGQKKyAgICAgICAgaGFzIGFuIHVuZGVmaW5lZCB2YWx1ZS4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiB0YWlsUGR1SWR4OjE2OworI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiB0YWlsUGR1SWR4OjE2OworICAgICAgICB3cHRfdWludDMyIGhlYWRQZHVJZHg6MTY7CisjZW5kaWYKKyAgICAKKyAgICAgICAgLyogMHgwYyAqLworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAgICAgLyoqIFRoaXMgaXMgZmlsbGVkIGJ5IEhvc3QgaW4gVmlyZ28gMS4wIGJ1dCBpdCBnZXRzIGNoYW5nZWQgYnkgQURVIGluCisgICAgICAgIFZpcmdvMi4wL0xpYnJhLiBUaGUgbGVuZ3RoIChpbiBudW1iZXIgb2YgYnl0ZXMpIG9mIHRoZSBNUERVIGhlYWRlci4KKyAgICAgICAgTGltaXRhdGlvbjogVGhlIE1QRFUgaGVhZGVyIG9mZnNldCArIE1QRFUgaGVhZGVyIGxlbmd0aCBjYW4gbmV2ZXIgZ28gYmV5b25kCisgICAgICAgIHRoZSBlbmQgb2YgdGhlIGZpcnN0IFBEVSAqLworICAgICAgICB3cHRfdWludDMyIG1wZHVIZWFkZXJMZW5ndGg6ODsKKyAgICAKKyAgICAgICAgLyoqIFRoaXMgaXMgZmlsbGVkIGJ5IEhvc3QgaW4gVmlyZ28gMS4wIGJ1dCBpdCBnZXRzIGNoYW5nZWQgYnkgQURVIGluCisgICAgICAgIFZpcmdvMi4wL0xpYnJhLiBUaGUgc3RhcnQgYnl0ZSBudW1iZXIgb2YgdGhlIE1QRFUgaGVhZGVyLiBUaGUgYnl0ZSBudW1iZXJpbmcKKyAgICAgICAgaXMgZG9uZSBpbiB0aGUgQkUgZm9ybWF0LiBXb3JkIDB4MCwgYml0cyBbMzE6MjRdIGhhcyBieXRlIGluZGV4IDAuICovCisgICAgICAgIHdwdF91aW50MzIgbXBkdUhlYWRlck9mZnNldDo4OworICAgIAorICAgICAgICAvKiogVGhpcyBpcyBmaWxsZWQgYnkgSG9zdCBpbiBWaXJnbyAxLjAgYnV0IGl0IGdldHMgY2hhbmdlZCBieSBBRFUgaW4KKyAgICAgICAgVmlyZ28yLjAvTGlicmEuIFRoZSBzdGFydCBieXRlIG51bWJlciBvZiB0aGUgTVBEVSBkYXRhLiAgVGhlIGJ5dGUgbnVtYmVyaW5nCisgICAgICAgIGlzIGRvbmUgaW4gdGhlIEJFIGZvcm1hdC4gV29yZCAweDAsIGJpdHMgWzMxOjI0XSBoYXMgYnl0ZSBpbmRleCAwLgorICAgICAgICBOb3RlIHRoYXQgdGhpcyBvZmZzZXQgY2FuIHBvaW50IGFsbCB0aGUgd2F5IGludG8gdGhlIGZpcnN0IGxpbmtlZCBQRFUuIAorICAgICAgICBMaW1pdGF0aW9uOiBNUERVIERBVEEgT0ZGU0VUIGNhbiBub3QgcG9pbnQgaW50byB0aGUgMm5kIGxpbmtlZCBQRFUgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBtcGR1RGF0YU9mZnNldDo5OworICAgIAorICAgICAgICAvKiogSXQgaXMgaW5pdGlhbGx5IGZpbGxlZCBieSBEWEUgdGhlbiBpZiBlbmNyeXB0aW9uIGlzIG9uLCB0aGVuIERQVSB3aWxsCisgICAgICAgIG92ZXJ3cml0ZSB0aGVzZSBmaWVsZHMuIFRoZSBudW1iZXIgb2YgUERVcyBsaW5rZWQgdG8gdGhlIEJELiBUaGlzIGZpZWxkCisgICAgICAgIHNob3VsZCBhbHdheXMgaW5kaWNhdGUgdGhlIGNvcnJlY3QgYW1vdW50LiAqLworICAgICAgICB3cHRfdWludDMyIHBkdUNvdW50Ojc7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIHBkdUNvdW50Ojc7CisgICAgICAgIHdwdF91aW50MzIgbXBkdURhdGFPZmZzZXQ6OTsKKyAgICAgICAgd3B0X3VpbnQzMiBtcGR1SGVhZGVyT2Zmc2V0Ojg7CisgICAgICAgIHdwdF91aW50MzIgbXBkdUhlYWRlckxlbmd0aDo4OworI2VuZGlmCisgICAgCisgICAgICAgIC8qIDB4MTAgKi8KKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIC8qKiBUaGlzIGlzIGZpbGxlZCBieSBIb3N0IGluIFZpcmdvIDEuMCBidXQgaXQgZ2V0cyBjaGFuZ2VkIGJ5IEFEVSBpbgorICAgICAgICBWaXJnbzIuMC9MaWJyYU1QRFUgbGVuZ3RoLlRoaXMgY292ZXJzIE1QRFUgaGVhZGVyIGxlbmd0aCArIE1QRFUgZGF0YSBsZW5ndGguCisgICAgICAgIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBGQ1MuIEZvciBzaW5nbGUgZnJhbWUgdHJhbnNtaXNzaW9uLCBQU0RVIHNpemUgaXMKKyAgICAgICAgbXBkdUxlbmd0aCArIDQuKi8KKyAgICAgICAgd3B0X3VpbnQzMiBtcGR1TGVuZ3RoOjE2OworICAgIAorICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMzoyOworICAgICAgICAvKiogU2VxdWVuY2UgbnVtYmVyIGluc2VydGlvbiBieSBEUFUKKyAgICAgICAgMDA6IExlYXZlIHNlcXVlbmNlIG51bWJlciBhcyBpcywgYXMgZmlsbGVkIGJ5IGhvc3QKKyAgICAgICAgMDE6IERQVSB0byBpbnNlcnQgbm9uIFRJRCBiYXNlZCBzZXF1ZW5jZSBudW1iZXIgKElmIGl0IGlzIG5vdCBUSUQgYmFzZWQsCisgICAgICAgIHRoZW4gaG93IGRvZXMgRFBVIGtub3cgd2hhdCBzZXEgdG8gZmlsbD8gSXMgdGhpcyB0aGUgbm9uLVFvcy9NZ210IHNlcXVlbmNlCisgICAgICAgIG51bWJlcj8KKyAgICAgICAgMTA6IERQVSB0byBpbnNlcnQgYSBzZXF1ZW5jZSBudW1iZXIgYmFzZWQgb24gVElELgorICAgICAgICAxMTogUmVzZXJ2ZWQgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBiZF9zc246MjsKKyAgICAKKyAgICAgICAgLyoqIFRyYWZmaWMgSWRlbnRpZmllcgorICAgICAgICBJbmRpY2F0ZXMgdGhlIHRyYWZmaWMgY2xhc3MgdGhlIGZyYW1lIGJlbG9uZ3MgdG8uIEZvciBub24gUW9TIGZyYW1lcywgdGhpcworICAgICAgICBmaWVsZCBpcyBzZXQgdG8gemVyby4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiB0aWQ6NDsKKyAgICAgICAgCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ0Ojg7CisgICAgCisjZWxzZQorICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkNDo4OworICAgICAgICB3cHRfdWludDMyIHRpZDo0OworICAgICAgICB3cHRfdWludDMyIGJkX3NzbjoyOworICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMzoyOworICAgICAgICB3cHRfdWludDMyIG1wZHVMZW5ndGg6MTY7CisjZW5kaWYKKyAgICAKKyAgICAgICAgLyogMHgxNCAqLworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAgICAgLyoqIChPbmx5IHVzZWQgYnkgdGhlIERQVSkKKyAgICAgICAgVGhpcyBpcyBmaWxsZWQgYnkgSG9zdCBpbiBWaXJnbyAxLjAgYnV0IGl0IGdldHMgZmlsbGVkIGJ5IEFEVSBpbgorICAgICAgICBWaXJnbzIuMC9MaWJyYS4gVGhlIERQVSBkZXNjcmlwdG9yIGluZGV4IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHdoZXJlIGluCisgICAgICAgIG1lbW9yeSB0aGUgRFBVIGNhbiBmaW5kIHRoZSBEUFUgZGVzY3JpcHRvciByZWxhdGVkIHRvIHRoaXMgZnJhbWUuIFRoZSBEUFUKKyAgICAgICAgY2FsY3VsYXRlcyB0aGUgYWRkcmVzcyBieSBtdWx0aXBseWluZyB0aGlzIGluZGV4IHdpdGggdGhlIERQVSBkZXNjcmlwdG9yCisgICAgICAgIHNpemUgYW5kIGFkZGluZyB0aGUgRFBVIGRlc2NyaXB0b3JzIGJhc2UgYWRkcmVzcy4gVGhlIERQVSBkZXNjcmlwdG9yCisgICAgICAgIGNvbnRhaW5zIGluZm9ybWF0aW9uIHNwZWNpZnlpbmcgdGhlIGVuY3J5cHRpb24gYW5kIGNvbXByZXNzaW9uIHR5cGUgYW5kCisgICAgICAgIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gd2hlcmUgZW5jcnlwdGlvbiBrZXlzIGNhbiBiZSBmb3VuZC4gKi8KKyAgICAgICAgd3B0X3VpbnQzMiBkcHVEZXNjSWR4Ojg7CisgICAgCisgICAgICAgIC8qKiBUaGlzIGlzIGZpbGxlZCBieSBIb3N0IGluIFZpcmdvIDEuMCBidXQgaXQgZ2V0cyBmaWxsZWQgYnkgQURVIGluCisgICAgICAgIFZpcmdvMi4wL0xpYnJhLiBUaGUgU1RBaWQgb2YgdGhlIFJBIGFkZHJlc3MgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBzdGFJbmRleDo4OworICAgIAorICAgICAgICAvKiogQSBmaWVsZCBwYXNzZWQgb24gdG8gVFBFIHdoaWNoIGluZmx1ZW5jZXMgdGhlIEFDSyBwb2xpY3kgdG8gYmUgdXNlZCBmb3IKKyAgICAgICAgdGhpcyBmcmFtZQorICAgICAgICAwMCAtIElhY2sKKyAgICAgICAgMDEsMTAsMTEgLSBObyBBY2sgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBhcDoyOworICAgIAorICAgICAgICAvKiogT3ZlcndyaXRlIG9wdGlvbiBmb3IgdGhlIHRyYW5zbWl0IHJhdGUKKyAgICAgICAgMDA6IFVzZSByYXRlIHByb2dyYW1tZWQgaW4gdGhlIFRQRSBTVEEgZGVzY3JpcHRvcgorICAgICAgICAwMTogVXNlIFRQRSBCRCByYXRlIDEKKyAgICAgICAgMTA6IFVzZSBUUEUgQkQgcmF0ZSAyCisgICAgICAgIDExOiBEZWxheWVkIFVzZSBUUEUgQkQgcmF0ZSAzICovCisgICAgICAgIHdwdF91aW50MzIgYmRSYXRlOjI7CisgICAgCisgICAgICAgIC8qKiAKKyAgICAgICAgVGhpcyBpcyBmaWxsZWQgYnkgSG9zdCBpbiBWaXJnbyAxLjAgYnV0IGl0IGdldHMgZmlsbGVkIGJ5IEFEVSBpbgorICAgICAgICBWaXJnbzIuMC9MaWJyYS4gUXVldWUgSUQgKi8KKyAgICAgICAgd3B0X3VpbnQzMiBxdWV1ZUlkOjU7CisgICAgCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ1Ojc7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkNTo3OworICAgICAgICB3cHRfdWludDMyIHF1ZXVlSWQ6NTsKKyAgICAgICAgd3B0X3VpbnQzMiBiZFJhdGU6MjsKKyAgICAgICAgd3B0X3VpbnQzMiBhcDoyOworICAgICAgICB3cHRfdWludDMyIHN0YUluZGV4Ojg7CisgICAgICAgIHdwdF91aW50MzIgZHB1RGVzY0lkeDo4OworI2VuZGlmCisKKyAgICAgICAgd3B0X3VpbnQzMiB0eEJkU2lnbmF0dXJlOworCisgICAgICAgIC8qIDB4MUMgKi8KKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDY7CisgICAgICAgIC8qIDB4MjAgKi8KKyAgICAgICAgLyogVGltZXN0YW1wIGZpbGxlZCBieSBEWEUuIFRpbWVzdGFtcCBmb3IgY3VycmVudCB0cmFuc2ZlciAqLworICAgICAgICB3cHRfdWludDMyIGR4ZUgyQlN0YXJ0VGltZXN0YW1wOworICAgIAorICAgICAgICAvKiAweDI0ICovCisgICAgICAgIC8qIFRpbWVzdGFtcCBmaWxsZWQgYnkgRFhFLiBUaW1lc3RhbXAgZm9yIHByZXZpb3VzIHRyYW5zZmVyICovCisgICAgICAgIHdwdF91aW50MzIgZHhlSDJCRW5kVGltZXN0YW1wOworCit9IFdESV9UeEJkVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAKKyAgV0RJX1J4RGVGcmFnQmRUeXBlIC0gVGhlIGZvcm1hdCBvZiB0aGUgUlggQkQgRGVmcmFnbWVudGVkIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IAoreworICAgICAgICAvKiAweDAwICovCisjaWZkZWYgV1BUX0JJR19CWVRFX0VORElBTgorICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMTozMDsKKyAgICAgICAgd3B0X3VpbnQzMiBiZHQ6MjsKKyNlbHNlCisgICAgICAgIHdwdF91aW50MzIgYmR0OjI7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQxOjMwOworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQyOjI0OworICAgICAgICB3cHRfdWludDMyIGRwdUZlZWRCYWNrOjg7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGRwdUZlZWRCYWNrOjg7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQyOjI0OworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQzOjE2OworICAgICAgICB3cHRfdWludDMyIGZyYWcwQmRJZHg6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZyYWcwQmRJZHg6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQzOjE2OworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ0OjE2OworICAgICAgICB3cHRfdWludDMyIGZyYWcxQmRJZHg6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZyYWcxQmRJZHg6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ0OjE2OworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgZnJhZzJCZElkeDoxNjsKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDU6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZyYWcyQmRJZHg6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ1OjE2OworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ2OjE2OworICAgICAgICB3cHRfdWludDMyIGZyYWczQmRJZHg6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZyYWczQmRJZHg6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ2OjE2OworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ3OjE2OworICAgICAgICB3cHRfdWludDMyIGZyYWc0QmRJZHg6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZyYWc0QmRJZHg6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ3OjE2OworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ4OjE2OworICAgICAgICB3cHRfdWludDMyIGZyYWc1QmRJZHg6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZyYWc1QmRJZHg6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ4OjE2OworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ5OjE2OworICAgICAgICB3cHRfdWludDMyIGZyYWc2QmRJZHg6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZyYWc2QmRJZHg6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQ5OjE2OworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQxMDoxNjsKKyAgICAgICAgd3B0X3VpbnQzMiBmcmFnN0JkSWR4OjE2OworI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiBmcmFnN0JkSWR4OjE2OworICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMTA6MTY7CisjZW5kaWYKKworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDExOjE2OworICAgICAgICB3cHRfdWludDMyIGZyYWc4QmRJZHg6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZyYWc4QmRJZHg6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQxMToxNjsKKyNlbmRpZgorCisjaWZkZWYgV1BUX0JJR19CWVRFX0VORElBTgorICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMTI6MTY7CisgICAgICAgIHdwdF91aW50MzIgZnJhZzlCZElkeDoxNjsKKyNlbHNlCisgICAgICAgIHdwdF91aW50MzIgZnJhZzlCZElkeDoxNjsKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDEyOjE2OworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQxMzoxNjsKKyAgICAgICAgd3B0X3VpbnQzMiBmcmFnMTBCZElkeDoxNjsKKyNlbHNlCisgICAgICAgIHdwdF91aW50MzIgZnJhZzEwQmRJZHg6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQxMzoxNjsKKyNlbmRpZgorCisjaWZkZWYgV1BUX0JJR19CWVRFX0VORElBTgorICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMTQ6MTY7CisgICAgICAgIHdwdF91aW50MzIgZnJhZzExQmRJZHg6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZyYWcxMUJkSWR4OjE2OworICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMTQ6MTY7CisjZW5kaWYKKworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDE1OjE2OworICAgICAgICB3cHRfdWludDMyIGZyYWcxMkJkSWR4OjE2OworI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiBmcmFnMTJCZElkeDoxNjsKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDE1OjE2OworI2VuZGlmCisKKyNpZmRlZiBXUFRfQklHX0JZVEVfRU5ESUFOCisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQxNjoxNjsKKyAgICAgICAgd3B0X3VpbnQzMiBmcmFnMTNCZElkeDoxNjsKKyNlbHNlCisgICAgICAgIHdwdF91aW50MzIgZnJhZzEzQmRJZHg6MTY7CisgICAgICAgIHdwdF91aW50MzIgcmVzZXJ2ZWQxNjoxNjsKKyNlbmRpZgorCisjaWZkZWYgV1BUX0JJR19CWVRFX0VORElBTgorICAgICAgICB3cHRfdWludDMyIGZyYWcxNEJkSWR4OjE2OworICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMTc6MTY7CisjZWxzZQorICAgICAgICB3cHRfdWludDMyIGZyYWcxNEJkSWR4OjE2OworICAgICAgICB3cHRfdWludDMyIHJlc2VydmVkMTc6MTY7CisjZW5kaWYKKworI2lmZGVmIFdQVF9CSUdfQllURV9FTkRJQU4KKyAgICAgICAgd3B0X3VpbnQzMiBmcmFnMTVCZElkeDoxNjsKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDE4OjE2OworI2Vsc2UKKyAgICAgICAgd3B0X3VpbnQzMiBmcmFnMTVCZElkeDoxNjsKKyAgICAgICAgd3B0X3VpbnQzMiByZXNlcnZlZDE4OjE2OworI2VuZGlmCisKK30gV0RJX1J4RGVGcmFnQmRUeXBlOworCisjZW5kaWYgLypXTEFOX1FDVF9XRElfQkRfSCovCmRpZmYgLS1naXQgYS9DT1JFL1dESS9DUC9pbmMvd2xhbl9xY3Rfd2RpX2NmZy5oIGIvQ09SRS9XREkvQ1AvaW5jL3dsYW5fcWN0X3dkaV9jZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTJiMTExCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvQ1AvaW5jL3dsYW5fcWN0X3dkaV9jZmcuaApAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgV0xBTl9RQ1RfV0RJX0NGR19ICisjZGVmaW5lIFdMQU5fUUNUX1dESV9DRkdfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICBXIEwgQSBOICAgRCBFIFYgSSBDIEUgICBBIEIgUyBUIFIgQSBDIFQgSSBPIE4gICBMIEEgWSBFIFIgCisgICAgICAgICAgICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICBEIEUgRiBJIE4gRSBTCisgICAgICAgICAgICAgICAgICAgICAgICAgRSBYIFQgRSBSIE4gQSBMICAgQSBQIEkgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgCitERVNDUklQVElPTgorICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gZGVmaW5lcyB0byBiZSB1c2VkIGJ5IHRoZSBVTUFDIGZvcgorICBzZXR0aW5nIHVwIHRoZSBjb25maWcgcGFyYW1ldGVycyBpbiBEQUwuCisgCisgICEhIFRoZSB2YWx1ZXMgaW4gaGVyZSBzaG91bGQgYmUgYW4gaWRlbnRpY2FsIG1hdGNoIG9mIHRoZSBIQUwgZGVmaW5lcworICBieSB0aGUgc2FtZSBuYW1lICEhIAorICAKKyAgICAgIAorICBDb3B5cmlnaHQgKGMpIDIwMTAgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjokICREYXRlVGltZTogJCAkQXV0aG9yOiAkCisKKword2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswOC8xOS8xMCAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXRElfTUFYX0NGR19MRU5HVEggICAgICAgICAgICAgICAgICAweDA2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBDb25maWd1cmF0aW9uIFBhcmFtZXRlciBJRHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXRElfQ0ZHX1NUQV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXRElfQ0ZHX0NVUlJFTlRfVFhfQU5URU5OQSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXRElfQ0ZHX0NVUlJFTlRfUlhfQU5URU5OQSAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXRElfQ0ZHX0xPV19HQUlOX09WRVJSSURFICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXRElfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTiAgICAgICAgICAgICAgNAorI2RlZmluZSBXRElfQ0ZHX0NBTF9QRVJJT0QgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBXRElfQ0ZHX0NBTF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXRElfQ0ZHX1BST1hJTUlUWSAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBXRElfQ0ZHX05FVFdPUktfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXRElfQ0ZHX01BWF9NRURJVU1fVElNRSAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBXRElfQ0ZHX01BWF9NUERVU19JTl9BTVBEVSAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV0RJX0NGR19SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFdESV9DRkdfU0hPUlRfUkVUUllfTElNSVQgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBXRElfQ0ZHX0xPTkdfUkVUUllfTElNSVQgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgV0RJX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAgICAgICAgICAgIDE0CisjZGVmaW5lIFdESV9DRkdfRFlOQU1JQ19USFJFU0hPTERfWkVSTyAgICAgICAgICAgICAxNQorI2RlZmluZSBXRElfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX09ORSAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgV0RJX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV08gICAgICAgICAgICAgIDE3CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBXRElfQ0ZHX1JFVFJZUkFURV9QT0xJQ1kgICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgV0RJX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFdESV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBXRElfQ0ZHX0ZPUkNFX1BPTElDWV9QUk9URUNUSU9OICAgICAgICAgICAgMjIKKyNkZWZpbmUgV0RJX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWiAgICAgICAgIDIzCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWiAgICAgICAgICAyNAorI2RlZmluZSBXRElfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWiAgICAgICAgICAgMjUKKyNkZWZpbmUgV0RJX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWiAgICAgICAgICAgIDI2CisjZGVmaW5lIFdESV9DRkdfTUFYX0JBX1NFU1NJT05TICAgICAgICAgICAgICAgICAgICAyNworI2RlZmluZSBXRElfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUICAgICAgICAgMjgKKyNkZWZpbmUgV0RJX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUiAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFdESV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUiAgICAgICAgICAgICAzMAorI2RlZmluZSBXRElfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRSAgICAgICAgMzEKKyNkZWZpbmUgV0RJX0NGR19TVEFUU19QRVJJT0QgICAgICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFdESV9DRkdfQ0ZQX01BWF9EVVJBVElPTiAgICAgICAgICAgICAgICAgICAzMworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgbWluLCBtYXgsIGRlZmF1bHRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogV0RJX0NGR19DVVJSRU5UX1RYX0FOVEVOTkEgKi8KKyNkZWZpbmUgV0RJX0NGR19DVVJSRU5UX1RYX0FOVEVOTkFfU1RBTUlOICAgICAgICAgIDEKKyNkZWZpbmUgV0RJX0NGR19DVVJSRU5UX1RYX0FOVEVOTkFfU1RBTUFYICAgICAgICAgIDEKKyNkZWZpbmUgV0RJX0NGR19DVVJSRU5UX1RYX0FOVEVOTkFfU1RBREVGICAgICAgICAgIDEKKworLyogV0RJX0NGR19DVVJSRU5UX1JYX0FOVEVOTkEgKi8KKyNkZWZpbmUgV0RJX0NGR19DVVJSRU5UX1JYX0FOVEVOTkFfU1RBTUlOICAgICAgICAgIDEKKyNkZWZpbmUgV0RJX0NGR19DVVJSRU5UX1JYX0FOVEVOTkFfU1RBTUFYICAgICAgICAgIDIKKyNkZWZpbmUgV0RJX0NGR19DVVJSRU5UX1JYX0FOVEVOTkFfU1RBREVGICAgICAgICAgIDEKKworLyogV0RJX0NGR19MT1dfR0FJTl9PVkVSUklERSAqLworI2RlZmluZSBXRElfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQU1JTiAgICAgICAgICAgMAorI2RlZmluZSBXRElfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQU1BWCAgICAgICAgICAgMQorI2RlZmluZSBXRElfQ0ZHX0xPV19HQUlOX09WRVJSSURFX1NUQURFRiAgICAgICAgICAgMAorCisvKiBXRElfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTiAqLworI2RlZmluZSBXRElfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9TVEFNSU4gICAgICAgICAgICAgMAorI2RlZmluZSBXRElfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9TVEFNQVggICAgICAgICAgICAgNjU1MzUKKyNkZWZpbmUgV0RJX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU5fU1RBREVGICAgICAgICAgICAgIDc4NQorI2RlZmluZSBXRElfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9PRkYgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXRElfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9PTiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXRElfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9UWCAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXRElfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9SWCAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXRElfQ0ZHX1BPV0VSX1NUQVRFX1BFUl9DSEFJTl9NQVNLICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgV0RJX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU5fQ0hBSU5fMF9PRkZTRVQgICAgIDAKKyNkZWZpbmUgV0RJX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU5fQ0hBSU5fMV9PRkZTRVQgICAgIDQKKyNkZWZpbmUgV0RJX0NGR19QT1dFUl9TVEFURV9QRVJfQ0hBSU5fQ0hBSU5fMl9PRkZTRVQgICAgIDgKKworLyogV0RJX0NGR19DQUxfUEVSSU9EICovCisjZGVmaW5lIFdESV9DRkdfQ0FMX1BFUklPRF9TVEFNSU4gICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdESV9DRkdfQ0FMX1BFUklPRF9TVEFNQVggICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXRElfQ0ZHX0NBTF9QRVJJT0RfU1RBREVGICAgICAgICAgICAgICAgICAgNQorCisvKiBXRElfQ0ZHX0NBTF9DT05UUk9MICovCisjZGVmaW5lIFdESV9DRkdfQ0FMX0NPTlRST0xfU1RBTUlOICAgIDAKKyNkZWZpbmUgV0RJX0NGR19DQUxfQ09OVFJPTF9TVEFNQVggICAgMQorI2RlZmluZSBXRElfQ0ZHX0NBTF9DT05UUk9MX1NUQURFRiAgICAwCisKKy8qIFdESV9DRkdfUFJPWElNSVRZICovCisjZGVmaW5lIFdESV9DRkdfUFJPWElNSVRZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdESV9DRkdfUFJPWElNSVRZX1NUQU1BWCAgICAxCisjZGVmaW5lIFdESV9DRkdfUFJPWElNSVRZX1NUQURFRiAgICAwCisjZGVmaW5lIFdESV9DRkdfUFJPWElNSVRZX09GRiAgICAgICAwCisjZGVmaW5lIFdESV9DRkdfUFJPWElNSVRZX09OICAgICAgICAxCisKKy8qIFdESV9DRkdfTkVUV09SS19ERU5TSVRZICovCisjZGVmaW5lIFdESV9DRkdfTkVUV09SS19ERU5TSVRZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdESV9DRkdfTkVUV09SS19ERU5TSVRZX1NUQU1BWCAgICAzCisjZGVmaW5lIFdESV9DRkdfTkVUV09SS19ERU5TSVRZX1NUQURFRiAgICAzCisjZGVmaW5lIFdESV9DRkdfTkVUV09SS19ERU5TSVRZX0xPVyAgICAgICAwCisjZGVmaW5lIFdESV9DRkdfTkVUV09SS19ERU5TSVRZX01FRElVTSAgICAxCisjZGVmaW5lIFdESV9DRkdfTkVUV09SS19ERU5TSVRZX0hJR0ggICAgICAyCisjZGVmaW5lIFdESV9DRkdfTkVUV09SS19ERU5TSVRZX0FEQVBUSVZFICAzCisKKy8qIFdESV9DRkdfTUFYX01FRElVTV9USU1FICovCisjZGVmaW5lIFdESV9DRkdfTUFYX01FRElVTV9USU1FX1NUQU1JTiAgICAwCisjZGVmaW5lIFdESV9DRkdfTUFYX01FRElVTV9USU1FX1NUQU1BWCAgICA2NTUzNQorI2RlZmluZSBXRElfQ0ZHX01BWF9NRURJVU1fVElNRV9TVEFERUYgICAgMTAyNAorCisvKiBXRElfQ0ZHX01BWF9NUERVU19JTl9BTVBEVSAqLworI2RlZmluZSBXRElfQ0ZHX01BWF9NUERVU19JTl9BTVBEVV9TVEFNSU4gICAgMAorI2RlZmluZSBXRElfQ0ZHX01BWF9NUERVU19JTl9BTVBEVV9TVEFNQVggICAgNjU1MzUKKyNkZWZpbmUgV0RJX0NGR19NQVhfTVBEVVNfSU5fQU1QRFVfU1RBREVGICAgIDY0CisKKy8qIFdESV9DRkdfUlRTX1RIUkVTSE9MRCAqLworI2RlZmluZSBXRElfQ0ZHX1JUU19USFJFU0hPTERfU1RBTUlOICAgICAgICAgICAgICAgMAorI2RlZmluZSBXRElfQ0ZHX1JUU19USFJFU0hPTERfU1RBTUFYICAgICAgICAgICAgICAgMjM0NworI2RlZmluZSBXRElfQ0ZHX1JUU19USFJFU0hPTERfU1RBREVGICAgICAgICAgICAgICAgMjM0NworCisvKiBXRElfQ0ZHX1NIT1JUX1JFVFJZX0xJTUlUICovCisjZGVmaW5lIFdESV9DRkdfU0hPUlRfUkVUUllfTElNSVRfU1RBTUlOICAgIDAKKyNkZWZpbmUgV0RJX0NGR19TSE9SVF9SRVRSWV9MSU1JVF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdESV9DRkdfU0hPUlRfUkVUUllfTElNSVRfU1RBREVGICAgIDYKKworLyogV0RJX0NGR19MT05HX1JFVFJZX0xJTUlUICovCisjZGVmaW5lIFdESV9DRkdfTE9OR19SRVRSWV9MSU1JVF9TVEFNSU4gICAgMAorI2RlZmluZSBXRElfQ0ZHX0xPTkdfUkVUUllfTElNSVRfU1RBTUFYICAgIDI1NQorI2RlZmluZSBXRElfQ0ZHX0xPTkdfUkVUUllfTElNSVRfU1RBREVGICAgIDYKKworLyogV0RJX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAqLworI2RlZmluZSBXRElfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX1NUQU1JTiAgICAyNTYKKyNkZWZpbmUgV0RJX0NGR19GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRF9TVEFNQVggICAgODAwMAorI2RlZmluZSBXRElfQ0ZHX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEX1NUQURFRiAgICA4MDAwCisKKy8qIFdESV9DRkdfRFlOQU1JQ19USFJFU0hPTERfWkVSTyAqLworI2RlZmluZSBXRElfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1pFUk9fU1RBTUlOICAgIDAKKyNkZWZpbmUgV0RJX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV0RJX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9aRVJPX1NUQURFRiAgICAyCisKKy8qIFdESV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FICovCisjZGVmaW5lIFdESV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FX1NUQU1JTiAgICAwCisjZGVmaW5lIFdESV9DRkdfRFlOQU1JQ19USFJFU0hPTERfT05FX1NUQU1BWCAgICAyNTUKKyNkZWZpbmUgV0RJX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9PTkVfU1RBREVGICAgIDQKKworLyogV0RJX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV08gKi8KKyNkZWZpbmUgV0RJX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV09fU1RBTUlOICAgIDAKKyNkZWZpbmUgV0RJX0NGR19EWU5BTUlDX1RIUkVTSE9MRF9UV09fU1RBTUFYICAgIDI1NQorI2RlZmluZSBXRElfQ0ZHX0RZTkFNSUNfVEhSRVNIT0xEX1RXT19TVEFERUYgICAgNgorCisvKiBXRElfQ0ZHX0ZJWEVEX1JBVEUgKi8KKyNkZWZpbmUgV0RJX0NGR19GSVhFRF9SQVRFX1NUQU1JTiAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV0RJX0NGR19GSVhFRF9SQVRFX1NUQU1BWCAgICAgICAgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV9TVEFERUYgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV8xTUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV8yTUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV81XzVNQlBTICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV8xMU1CUFMgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV82TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV85TUJQUyAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV8xMk1CUFMgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV8xOE1CUFMgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV8yNE1CUFMgICAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV8zNk1CUFMgICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXRElfQ0ZHX0ZJWEVEX1JBVEVfNDhNQlBTICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgV0RJX0NGR19GSVhFRF9SQVRFXzU0TUJQUyAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV82XzVNQlBTX01DUzBfMjBNSFpfU0lNTyAgICAgICAxMworI2RlZmluZSBXRElfQ0ZHX0ZJWEVEX1JBVEVfMTNNQlBTX01DUzFfMjBNSFpfU0lNTyAgICAgICAgMTQKKyNkZWZpbmUgV0RJX0NGR19GSVhFRF9SQVRFXzE5XzVNQlBTX01DUzJfMjBNSFpfU0lNTyAgICAgIDE1CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV8yNk1CUFNfTUNTM18yME1IWl9TSU1PICAgICAgICAxNgorI2RlZmluZSBXRElfQ0ZHX0ZJWEVEX1JBVEVfMzlNQlBTX01DUzRfMjBNSFpfU0lNTyAgICAgICAgMTcKKyNkZWZpbmUgV0RJX0NGR19GSVhFRF9SQVRFXzUyTUJQU19NQ1M1XzIwTUhaX1NJTU8gICAgICAgIDE4CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV81OF81TUJQU19NQ1M2XzIwTUhaX1NJTU8gICAgICAxOQorI2RlZmluZSBXRElfQ0ZHX0ZJWEVEX1JBVEVfNjVNQlBTX01DUzdfMjBNSFpfU0lNTyAgICAgICAgMjAKKyNkZWZpbmUgV0RJX0NGR19GSVhFRF9SQVRFXzdfMk1CUFNfTUNTMF8yME1IWl9TSU1PX1NHSSAgIDIxCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV8xNF80TUJQU19NQ1MxXzIwTUhaX1NJTU9fU0dJICAyMgorI2RlZmluZSBXRElfQ0ZHX0ZJWEVEX1JBVEVfMjFfN01CUFNfTUNTMl8yME1IWl9TSU1PX1NHSSAgMjMKKyNkZWZpbmUgV0RJX0NGR19GSVhFRF9SQVRFXzI4XzlNQlBTX01DUzNfMjBNSFpfU0lNT19TR0kgIDI0CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV80M18zTUJQU19NQ1M0XzIwTUhaX1NJTU9fU0dJICAyNQorI2RlZmluZSBXRElfQ0ZHX0ZJWEVEX1JBVEVfNTdfOE1CUFNfTUNTNV8yME1IWl9TSU1PX1NHSSAgMjYKKyNkZWZpbmUgV0RJX0NGR19GSVhFRF9SQVRFXzY1TUJQU19NQ1M2XzIwTUhaX1NJTU9fU0dJICAgIDI3CisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV83Ml8yTUJQU19NQ1M3XzIwTUhaX1NJTU9fU0dJICAyOAorI2RlZmluZSBXRElfQ0ZHX0ZJWEVEX1JBVEVfMF8yNU1CUFNfU0xSXzIwTUhaX1NJTU8gICAgICAgMjkKKyNkZWZpbmUgV0RJX0NGR19GSVhFRF9SQVRFXzBfNU1CUFNfU0xSXzIwTUhaX1NJTU8gICAgICAgIDMwCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV82OF8yNU1CUFNfUUNfUFJPUF8yME1IWl9TSU1PICAzMQorCisvKiBXRElfQ0ZHX1JFVFJZUkFURV9QT0xJQ1kgKi8KKyNkZWZpbmUgV0RJX0NGR19SRVRSWVJBVEVfUE9MSUNZX1NUQU1JTiAgICAgICAgIDAKKyNkZWZpbmUgV0RJX0NGR19SRVRSWVJBVEVfUE9MSUNZX1NUQU1BWCAgICAgICAgIDI1NQorI2RlZmluZSBXRElfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfU1RBREVGICAgICAgICAgNAorI2RlZmluZSBXRElfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfTUlOX1NVUFBPUlRFRCAgMAorI2RlZmluZSBXRElfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfUFJJTUFSWSAgICAgICAgMQorI2RlZmluZSBXRElfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfUkVTRVJWRUQgICAgICAgMgorI2RlZmluZSBXRElfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfQ0xPU0VTVCAgICAgICAgMworI2RlZmluZSBXRElfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfQVVUT1NFTEVDVCAgICAgNAorI2RlZmluZSBXRElfQ0ZHX1JFVFJZUkFURV9QT0xJQ1lfTUFYICAgICAgICAgICAgNQorCisvKiBXRElfQ0ZHX1JFVFJZUkFURV9TRUNPTkRBUlkgKi8KKyNkZWZpbmUgV0RJX0NGR19SRVRSWVJBVEVfU0VDT05EQVJZX1NUQU1JTiAgICAwCisjZGVmaW5lIFdESV9DRkdfUkVUUllSQVRFX1NFQ09OREFSWV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdESV9DRkdfUkVUUllSQVRFX1NFQ09OREFSWV9TVEFERUYgICAgMAorCisvKiBXRElfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWSAqLworI2RlZmluZSBXRElfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWV9TVEFNSU4gICAgMAorI2RlZmluZSBXRElfQ0ZHX1JFVFJZUkFURV9URVJUSUFSWV9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdESV9DRkdfUkVUUllSQVRFX1RFUlRJQVJZX1NUQURFRiAgICAwCisKKy8qIFdESV9DRkdfRk9SQ0VfUE9MSUNZX1BST1RFQ1RJT04gKi8KKyNkZWZpbmUgV0RJX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9TVEFNSU4gICAgIDAKKyNkZWZpbmUgV0RJX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9TVEFNQVggICAgIDUKKyNkZWZpbmUgV0RJX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9TVEFERUYgICAgIDUKKyNkZWZpbmUgV0RJX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9ESVNBQkxFICAgIDAKKyNkZWZpbmUgV0RJX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9DVFMgICAgICAgIDEKKyNkZWZpbmUgV0RJX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9SVFMgICAgICAgIDIKKyNkZWZpbmUgV0RJX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9EVUFMX0NUUyAgIDMKKyNkZWZpbmUgV0RJX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9SVFNfQUxXQVlTIDQKKyNkZWZpbmUgV0RJX0NGR19GT1JDRV9QT0xJQ1lfUFJPVEVDVElPTl9BVVRPICAgICAgIDUKKworLyogV0RJX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF8yNEdIWiAqLworI2RlZmluZSBXRElfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzI0R0haX1NUQU1JTiAgICAwCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFpfU1RBTUFYICAgIDMxCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfMjRHSFpfU1RBREVGICAgIDEKKworLyogV0RJX0NGR19GSVhFRF9SQVRFX01VTFRJQ0FTVF81R0haICovCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWl9TVEFNSU4gICAgMAorI2RlZmluZSBXRElfQ0ZHX0ZJWEVEX1JBVEVfTVVMVElDQVNUXzVHSFpfU1RBTUFYICAgIDMxCisjZGVmaW5lIFdESV9DRkdfRklYRURfUkFURV9NVUxUSUNBU1RfNUdIWl9TVEFERUYgICAgNQorCisvKiBXRElfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWiAqLworI2RlZmluZSBXRElfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWl9TVEFNSU4gICAgMAorI2RlZmluZSBXRElfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF8yNEdIWl9TVEFNQVggICAgMzEKKyNkZWZpbmUgV0RJX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfMjRHSFpfU1RBREVGICAgIDEKKworLyogV0RJX0NGR19ERUZBVUxUX1JBVEVfSU5ERVhfNUdIWiAqLworI2RlZmluZSBXRElfQ0ZHX0RFRkFVTFRfUkFURV9JTkRFWF81R0haX1NUQU1JTiAgICAwCisjZGVmaW5lIFdESV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzVHSFpfU1RBTUFYICAgIDExCisjZGVmaW5lIFdESV9DRkdfREVGQVVMVF9SQVRFX0lOREVYXzVHSFpfU1RBREVGICAgIDUKKworLyogV0RJX0NGR19NQVhfQkFfU0VTU0lPTlMgKi8KKyNkZWZpbmUgV0RJX0NGR19NQVhfQkFfU0VTU0lPTlNfU1RBTUlOICAgIDAKKyNkZWZpbmUgV0RJX0NGR19NQVhfQkFfU0VTU0lPTlNfU1RBTUFYICAgIDY0CisjZGVmaW5lIFdESV9DRkdfTUFYX0JBX1NFU1NJT05TX1NUQURFRiAgICAxNgorCisvKiBXRElfQ0ZHX1BTX0RBVEFfSU5BQ1RJVklUWV9USU1FT1VUICovCisjZGVmaW5lIFdESV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfU1RBTUlOICAgIDEKKyNkZWZpbmUgV0RJX0NGR19QU19EQVRBX0lOQUNUSVZJVFlfVElNRU9VVF9TVEFNQVggICAgMjU1CisjZGVmaW5lIFdESV9DRkdfUFNfREFUQV9JTkFDVElWSVRZX1RJTUVPVVRfU1RBREVGICAgIDIwCisKKy8qIFdESV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVIgKi8KKyNkZWZpbmUgV0RJX0NGR19QU19FTkFCTEVfQkNOX0ZJTFRFUl9TVEFNSU4gICAgMAorI2RlZmluZSBXRElfQ0ZHX1BTX0VOQUJMRV9CQ05fRklMVEVSX1NUQU1BWCAgICAxCisjZGVmaW5lIFdESV9DRkdfUFNfRU5BQkxFX0JDTl9GSUxURVJfU1RBREVGICAgIDEKKworLyogV0RJX0NGR19QU19FTkFCTEVfUlNTSV9NT05JVE9SICovCisjZGVmaW5lIFdESV9DRkdfUFNfRU5BQkxFX1JTU0lfTU9OSVRPUl9TVEFNSU4gICAgMAorI2RlZmluZSBXRElfQ0ZHX1BTX0VOQUJMRV9SU1NJX01PTklUT1JfU1RBTUFYICAgIDEKKyNkZWZpbmUgV0RJX0NGR19QU19FTkFCTEVfUlNTSV9NT05JVE9SX1NUQURFRiAgICAxCisKKy8qIFdESV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFICovCisjZGVmaW5lIFdESV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFX1NUQU1JTiAgICAxCisjZGVmaW5lIFdESV9DRkdfTlVNX0JFQUNPTl9QRVJfUlNTSV9BVkVSQUdFX1NUQU1BWCAgICAyMAorI2RlZmluZSBXRElfQ0ZHX05VTV9CRUFDT05fUEVSX1JTU0lfQVZFUkFHRV9TVEFERUYgICAgMjAKKworLyogV0RJX0NGR19TVEFUU19QRVJJT0QgKi8KKyNkZWZpbmUgV0RJX0NGR19TVEFUU19QRVJJT0RfU1RBTUlOICAgIDEKKyNkZWZpbmUgV0RJX0NGR19TVEFUU19QRVJJT0RfU1RBTUFYICAgIDEwCisjZGVmaW5lIFdESV9DRkdfU1RBVFNfUEVSSU9EX1NUQURFRiAgICAxMAorCisvKiBXRElfQ0ZHX0NGUF9NQVhfRFVSQVRJT04gKi8KKyNkZWZpbmUgV0RJX0NGR19DRlBfUEVSSU9EX1NUQU1JTiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV0RJX0NGR19DRlBfUEVSSU9EX1NUQU1BWCAgICAgICAgICAgICAgICAgIDI1NQorI2RlZmluZSBXRElfQ0ZHX0NGUF9QRVJJT0RfU1RBREVGICAgICAgICAgICAgICAgICAgMQorCisjZW5kaWYgLypXTEFOX1FDVF9XRElfQ0ZHX0gqLwpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvQ1AvaW5jL3dsYW5fcWN0X3dkaV9kcC5oIGIvQ09SRS9XREkvQ1AvaW5jL3dsYW5fcWN0X3dkaV9kcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMGQ4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9DUC9pbmMvd2xhbl9xY3Rfd2RpX2RwLmgKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFdMQU5fUUNUX1dESV9EUF9ICisjZGVmaW5lIFdMQU5fUUNUX1dESV9EUF9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgIFcgTCBBIE4gICBEIEUgViBJIEMgRSAgIEEgQiBTIFQgUiBBIEMgVCBJIE8gTiAgIEwgQSBZIEUgUiAKKyAgICAgICAgICAgICAgSSBOIFQgRSBSIE4gQSBMICAgICBBIFAgSSAgICAgICBGIE8gUiAgICBUIEggRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRCBBIFQgQSAgIFAgQSBUIEggCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgCitERVNDUklQVElPTgorICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludGVybmFsIEFQSSBleHBvc2VkIGJ5IHRoZSBEQUwgQ29udHJvbCBQYXRoIENvcmUgCisgIG1vZHVsZSB0byBiZSB1c2VkIGJ5IHRoZSBEQUwgRGF0YSBQYXRoIENvcmUuIAorICAKKyAgICAgIAorICBDb3B5cmlnaHQgKGMpIDIwMTAgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjokICREYXRlVGltZTogJCAkQXV0aG9yOiAkCisKKword2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswOC8xOS8xMCAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3R5cGUuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9iZC5oIgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgICBCRCBNYWNybyBEZWZpbmVzICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBCRCBEZWZpbml0aW9ucyB1c2VkIGJ5IHRoZSBEQUwgZGF0YSBwYXRoIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXRElfVFhCRF9CRFJBVEVfREVGQVVMVCAwCisjZGVmaW5lIFdESV9UWEJEX0JEUkFURV9GSVJTVCAgIDEKKyNkZWZpbmUgV0RJX1RYQkRfQkRSQVRFX1NFQ09ORCAgMgorI2RlZmluZSBXRElfVFhCRF9CRFJBVEVfVEhJUkQgICAzCisKKyNkZWZpbmUgV0RJX0ZSQU1FX1RZUEVfTUFTSyAgICAgMHgzMAorI2RlZmluZSBXRElfRlJBTUVfVFlQRV9PRkZTRVQgICAweDQKKyNkZWZpbmUgV0RJX0ZSQU1FX1NVQlRZUEVfTUFTSyAgMHgwRgorCisjZGVmaW5lIFdESV9UWEJEX0JEX1NTTl9GSUxMX0hPU1QgICAgICAgICAwCisjZGVmaW5lIFdESV9UWEJEX0JEX1NTTl9GSUxMX0RQVV9OT05fUU9TICAxCisjZGVmaW5lIFdESV9UWEJEX0JEX1NTTl9GSUxMX0RQVV9RT1MgICAgICAyCisKKyNkZWZpbmUgV0RJX0FDS1BPTElDWV9BQ0tfUkVRVUlSRUQgICAgICAgIDAKKyNkZWZpbmUgV0RJX0FDS1BPTElDWV9BQ0tfTk9UUkVRVUlSRUQgICAgIDEKKworI2RlZmluZSBXRElfQkRSQVRFX0JDREFUQV9GUkFNRSAgICAgICAgICAgMQorI2RlZmluZSBXRElfQkRSQVRFX0JDTUdNVF9GUkFNRSAgICAgICAgICAgMgorI2RlZmluZSBXRElfQkRSQVRFX0NUUkxfRlJBTUUgICAgICAgICAgICAgMworICAgIAorLyogRGVmYXVsdCB2YWx1ZXMgZm9yIEZpbGxUeCBCRCAqLworI2RlZmluZSBXRElfREVGQVVMVF9VTklDQVNUX0VOQUJMRUQgICAgICAgMQorI2RlZmluZSBXRElfUk1GX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXRElfUk1GX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXRElfTk9fRU5DUllQVElPTl9ESVNBQkxFRCAgICAgICAgMAorI2RlZmluZSBXRElfTk9fRU5DUllQVElPTl9FTkFCTEVEICAgICAgICAgMQorICAgIAorI2RlZmluZSBXRElfUlhfQkRfQUREUjNfU0VMRl9JRFggICAgICAgICAgMAorCisjZGVmaW5lIFdESV9UWENPTVBfUkVRVUVTVEVEX01BU0sgICAgICAgICAgIDB4MSAgLy9iaXQgMCBmb3IgVHhDb21wIGludHIgcmVxdWVzdGVkLiAKKyNkZWZpbmUgV0RJX1VTRV9TRUxGX1NUQV9SRVFVRVNURURfTUFTSyAgICAgMHgyICAvL2JpdCAxIGZvciBTVEEgb3ZlcndyaXRlIHdpdGggc2VsZlN0YSBSZXF1ZXN0ZWQuCisjZGVmaW5lIFdESV9UWF9OT19FTkNSWVBUSU9OX01BU0sgICAgICAgICAgIDB4NCAgLy9iaXQgMi4gSWYgc2V0LCB0aGUgZnJhbWUgaXMgbm90IHRvIGJlIGVuY3J5cHRlZAorI2lmIGRlZmluZWQoTElCUkFfV0FQSV9TVVBQT1JUKQorI2RlZmluZSBXRElfV0FQSV9TVEFfTUFTSyAgICAgICAgICAgIDB4OCAgLy9iaXQgMy4gSWYgc2V0LCB0aGlzIGZyYW1lIGlzIGZvciBXQVBJIHN0YXRpb24KKyNlbmRpZgorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1VBUFNEX0ZXX1RSR19GUkFNRVMKKyNkZWZpbmUgV0RJX1RSSUdHRVJfRU5BQkxFRF9BQ19NQVNLICAgICAgICAgMHgxMCAvL2JpdCA0IGZvciBkYXRhIGZyYW1lcyBiZWxvbmdpbmcgdG8gdHJpZ2dlciBlbmFibGVkIEFDCisjZW5kaWYKKyNkZWZpbmUgV0RJX1VTRV9OT19BQ0tfUkVRVUVTVEVEX01BU0sgICAgICAgMHgyMAorCisjZGVmaW5lIFdESV9VU0VfQkRfUkFURTJfRk9SX01BTkFHRU1FTlRfRlJBTUUgMHg0MCAvLyBCaXQgNiB3aWxsIGJlIHVzZWQgdG8gY29udHJvbCBCRCByYXRlIGZvciBNYW5hZ2VtZW50IGZyYW1lcworCisKKy8qTWFjcm8gZm9yIGdldHRpbmcgdGhlIHNpemUgb2YgdGhlIFRYIEJEKi8KKyNkZWZpbmUgV0RJX1RYX0JEX0hFQURFUl9TSVpFICAgICAgICBzaXplb2YoV0RJX1R4QmRUeXBlKQorCisvKk1hY3JvIGZvciBnZXR0aW5nIHRoZSBzaXplIG9mIHRoZSBSWCBCRCovCisjZGVmaW5lIFdESV9SWF9CRF9IRUFERVJfU0laRSAgICAgICAgc2l6ZW9mKFdESV9SeEJkVHlwZSkKKworI2RlZmluZSBXRElfUlhfQkRfSEVBREVSX09GRlNFVCAgICAgICAwCisKKyNkZWZpbmUgV0RJX0RQVV9GRUVEQkFDS19PRkZTRVQgICAgICAgMQorCisvLyBGcmFtZSBUeXBlIGRlZmluaXRpb25zCisKKyNkZWZpbmUgV0RJX01BQ19NR01UX0ZSQU1FICAgIDB4MAorI2RlZmluZSBXRElfTUFDX0NUUkxfRlJBTUUgICAgMHgxCisjZGVmaW5lIFdESV9NQUNfREFUQV9GUkFNRSAgICAweDIKKworLy8gRGF0YSBmcmFtZSBzdWJ0eXBlIGRlZmluaXRpb25zCisjZGVmaW5lIFdESV9NQUNfREFUQV9EQVRBICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdESV9NQUNfREFUQV9EQVRBX0FDSyAgICAgICAgICAgICAxCisjZGVmaW5lIFdESV9NQUNfREFUQV9EQVRBX1BPTEwgICAgICAgICAgICAyCisjZGVmaW5lIFdESV9NQUNfREFUQV9EQVRBX0FDS19QT0xMICAgICAgICAzCisjZGVmaW5lIFdESV9NQUNfREFUQV9OVUxMICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdESV9NQUNfREFUQV9OVUxMX0FDSyAgICAgICAgICAgICA1CisjZGVmaW5lIFdESV9NQUNfREFUQV9OVUxMX1BPTEwgICAgICAgICAgICA2CisjZGVmaW5lIFdESV9NQUNfREFUQV9OVUxMX0FDS19QT0xMICAgICAgICA3CisjZGVmaW5lIFdESV9NQUNfREFUQV9RT1NfREFUQSAgICAgICAgICAgICA4CisjZGVmaW5lIFdESV9NQUNfREFUQV9RT1NfREFUQV9BQ0sgICAgICAgICA5CisjZGVmaW5lIFdESV9NQUNfREFUQV9RT1NfREFUQV9QT0xMICAgICAgICAxMAorI2RlZmluZSBXRElfTUFDX0RBVEFfUU9TX0RBVEFfQUNLX1BPTEwgICAgMTEKKyNkZWZpbmUgV0RJX01BQ19EQVRBX1FPU19OVUxMICAgICAgICAgICAgIDEyCisjZGVmaW5lIFdESV9NQUNfREFUQV9RT1NfTlVMTF9BQ0sgICAgICAgICAxMworI2RlZmluZSBXRElfTUFDX0RBVEFfUU9TX05VTExfUE9MTCAgICAgICAgMTQKKyNkZWZpbmUgV0RJX01BQ19EQVRBX1FPU19OVUxMX0FDS19QT0xMICAgIDE1CisKKyNkZWZpbmUgV0RJX01BQ19GUkFNRV9TVUJUWVBFX1NUQVJUICAgICAgIDAKKyNkZWZpbmUgV0RJX01BQ19GUkFNRV9TVUJUWVBFX0VORCAgICAgICAgIDE2CisKKyNkZWZpbmUgV0RJX01BQ19EQVRBX1FPU19NQVNLICAgICAgICAgICAgIDgKKyNkZWZpbmUgV0RJX01BQ19EQVRBX05VTExfTUFTSyAgICAgICAgICAgIDQKKyNkZWZpbmUgV0RJX01BQ19EQVRBX1BPTExfTUFTSyAgICAgICAgICAgIDIKKyNkZWZpbmUgV0RJX01BQ19EQVRBX0FDS19NQVNLICAgICAgICAgICAgIDEKKworLy8gTWFuYWdlbWVudCBmcmFtZSBzdWJ0eXBlIGRlZmluaXRpb25zCisKKyNkZWZpbmUgV0RJX01BQ19NR01UX0FTU09DX1JFUSAgICAweDAKKyNkZWZpbmUgV0RJX01BQ19NR01UX0FTU09DX1JTUCAgICAweDEKKyNkZWZpbmUgV0RJX01BQ19NR01UX1JFQVNTT0NfUkVRICAweDIKKyNkZWZpbmUgV0RJX01BQ19NR01UX1JFQVNTT0NfUlNQICAweDMKKyNkZWZpbmUgV0RJX01BQ19NR01UX1BST0JFX1JFUSAgICAweDQKKyNkZWZpbmUgV0RJX01BQ19NR01UX1BST0JFX1JTUCAgICAweDUKKyNkZWZpbmUgV0RJX01BQ19NR01UX0JFQUNPTiAgICAgICAweDgKKyNkZWZpbmUgV0RJX01BQ19NR01UX0FUSU0gICAgICAgICAweDkKKyNkZWZpbmUgV0RJX01BQ19NR01UX0RJU0FTU09DICAgICAweEEKKyNkZWZpbmUgV0RJX01BQ19NR01UX0FVVEggICAgICAgICAweEIKKyNkZWZpbmUgV0RJX01BQ19NR01UX0RFQVVUSCAgICAgICAweEMKKyNkZWZpbmUgV0RJX01BQ19NR01UX0FDVElPTiAgICAgICAweEQKKyNkZWZpbmUgV0RJX01BQ19NR01UX1JFU0VSVkVEMTUgICAweEYKKworLy8gQWN0aW9uIGZyYW1lIGNhdGVnb3JpZXMKKworI2RlZmluZSBXRElfTUFDX0FDVElPTl9TUEVDVFJVTV9NR01UICAgIDAKKyNkZWZpbmUgV0RJX01BQ19BQ1RJT05fUU9TX01HTVQgICAgICAgICAxCisjZGVmaW5lIFdESV9NQUNfQUNUSU9OX0RMUCAgICAgICAgICAgICAgMgorI2RlZmluZSBXRElfTUFDX0FDVElPTl9CTEtBQ0sgICAgICAgICAgIDMKKyNkZWZpbmUgV0RJX01BQ19BQ1RJT05fSFQgICAgICAgICAgICAgICA3CisjZGVmaW5lIFdESV9NQUNfQUNUSU9OX1dNRSAgICAgICAgICAgICAgMTcKKworLy8gUW9TIG1hbmFnZW1lbnQgYWN0aW9uIGNvZGVzCisKKyNkZWZpbmUgV0RJX01BQ19RT1NfQUREX1RTX1JFUSAgICAgIDAKKyNkZWZpbmUgV0RJX01BQ19RT1NfQUREX1RTX1JTUCAgICAgIDEKKyNkZWZpbmUgV0RJX01BQ19RT1NfREVMX1RTX1JFUSAgICAgIDIKKyNkZWZpbmUgV0RJX01BQ19RT1NfU0NIRURVTEUgICAgICAgIDMKKy8vIGFuZCB0aGVzZSBhcmUgcHJvcHJpZXRhcnkKKyNkZWZpbmUgV0RJX01BQ19RT1NfREVGX0JBX1JFUSAgICAgIDQKKyNkZWZpbmUgV0RJX01BQ19RT1NfREVGX0JBX1JTUCAgICAgIDUKKyNkZWZpbmUgV0RJX01BQ19RT1NfREVMX0JBX1JFUSAgICAgIDYKKyNkZWZpbmUgV0RJX01BQ19RT1NfREVMX0JBX1JTUCAgICAgIDcKKworI2lmZGVmIFdMQU5fUEVSRgorLyogVHhCRCBzaWduYXR1cmUgZmllbGRzCisgKiBzZXJpYWwoOCk6IGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHNlcmlhbCAjIHdoZW5ldmVyIHRoZXJlIGlzIGEgQWRkL0RlbCBTVEEgb3IgQWRkL0RlbCBLZXkgZXZlbnQKKyAqIG1hY0hhc2goMTYpOiBIYXNoIHZhbHVlIG9mIERBCisgKiB0aWQoNCk6ICAgIFRJRAorICogdWNhc3QoMSk6ICBVbmljYXN0IG9yIEJyb2FkY2FzdCBkYXRhIGZyYW1lCisgKi8KKyNkZWZpbmUgV0RJX1RYQkRfU0lHX1NFUklBTF9PRkZTRVQgICAgICAgIDAgICAKKyNkZWZpbmUgV0RJX1RYQkRfU0lHX1RJRF9PRkZTRVQgICAgICAgICAgIDgKKyNkZWZpbmUgV0RJX1RYQkRfU0lHX1VDQVNUX0RBVEFfT0ZGU0VUICAgIDkKKyNkZWZpbmUgV0RJX1RYQkRfU0lHX01BQ0FERFJfSEFTSF9PRkZTRVQgIDE2CisjZGVmaW5lIFdESV9UWEJEX1NJR19NR01UX01BR0lDICAgICAgICAgICAweGJkYmRiZGJkCisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBCRCBoZWFkZXIgbWFjcm9zIC0gdXNlZCBieSB0aGUgZGF0YSBwYXRoIHRvIGdldCBvciBzZXQgdmFyaW91cyB2YWx1ZXMKKyAgIGluc2lkZSB0aGUgcGFja2V0IEJEIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXRElfUlhfQkRfR0VUX01QRFVfSF9PRkZTRVQoIF9wdkJESGVhZGVyICkgICAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+bXBkdUhlYWRlck9mZnNldCkKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX01QRFVfRF9PRkZTRVQoIF9wdkJESGVhZGVyICkgICAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+bXBkdURhdGFPZmZzZXQpCisKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9NUERVX0xFTiggX3B2QkRIZWFkZXIgKSAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPm1wZHVMZW5ndGgpCisKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9NUERVX0hfTEVOKCBfcHZCREhlYWRlciApICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPm1wZHVIZWFkZXJMZW5ndGgpCisKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX0ZUKCBfcHZCREhlYWRlciApICAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmZ0KQorCisjZGVmaW5lIFdESV9SWF9CRF9HRVRfRFBVX0ZFRURCQUNLKCBfcHZCREhlYWRlciApICAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmRwdUZlZWRiYWNrKQorCisjZGVmaW5lIFdESV9SWF9CRF9HRVRfUlhfQ0hBTk5FTCggX3B2QkRIZWFkZXIgKSAgICAgICAgIFwKKyAgICAgICAgKCggKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPnJlc2VydmVkMCkgPDwgNCkgfCAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+cnhDaGFubmVsKSkKKworI2RlZmluZSBXRElfRlJBTUVfVFlQRV9NQVNLICAgICAweDMwCisjZGVmaW5lIFdESV9GUkFNRV9UWVBFX09GRlNFVCAgIDB4NAorI2RlZmluZSBXRElfRlJBTUVfU1VCVFlQRV9NQVNLICAweDBGCisKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9TVUJUWVBFKCBfcHZCREhlYWRlciApICAgICAgICAoKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmZyYW1lVHlwZVN1YnR5cGUpICYgV0RJX0ZSQU1FX1NVQlRZUEVfTUFTSykKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX1RZUEUoIF9wdkJESGVhZGVyICkgICAgICAoKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmZyYW1lVHlwZVN1YnR5cGUpICYgV0RJX0ZSQU1FX1RZUEVfTUFTSykgPj4gV0RJX0ZSQU1FX1RZUEVfT0ZGU0VUOworCisjZGVmaW5lIFdESV9SWF9CRF9HRVRfUlRTRiggX3B2QkRIZWFkZXIgKSAgICAgICAgICgoKFdESV9SeEJkVHlwZSopX3B2QkRIZWFkZXIpLT5ydHNmKQorCisjZGVmaW5lIFdESV9SWF9CRF9HRVRfQlNGKCBfcHZCREhlYWRlciApICAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmJzZikKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX1NDQU4oIF9wdkJESGVhZGVyICkgICAgICAgICAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+c2NhbkxlYXJuKQorCisjZGVmaW5lIFdESV9SWF9CRF9HRVRfRFBVX1NJRyggX3B2QkRIZWFkZXIgKSAgICAgICAgICgoKFdESV9SeEJkVHlwZSopX3B2QkRIZWFkZXIpLT5kcHVTaWduYXR1cmUpCisKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9ORSggX3B2QkRIZWFkZXIgKSAgICAgICAgICgoKFdESV9SeEJkVHlwZSopX3B2QkRIZWFkZXIpLT5kcHVORSkKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX0xMQ1IoIF9wdkJESGVhZGVyICkgICAgICAgICAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+bGxjKQorCisjZGVmaW5lIFdESV9SWF9CRF9HRVRfVElNRVNUQU1QKCBfcHZCREhlYWRlciApICAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPm1jbGtSeFRpbWVzdGFtcCkKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX1JYUEZMQUdTKCBfcHZCREhlYWRlciApICAgICAgICAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+cnhwRmxhZ3MpCisKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9SQVRFSU5ERVgoIF9wdkJESGVhZGVyICkgICAgICAgICgoKFdESV9SeEJkVHlwZSopX3B2QkRIZWFkZXIpLT5yYXRlSW5kZXgpCisKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9BTVNEVV9TSVpFKCBfcHZCREhlYWRlciApICAgICAgICAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+dG90YWxNc2R1U2l6ZSkKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX0xMQyggX3B2QkRIZWFkZXIgKSAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmxsYykKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX1RJRCggX3B2QkRIZWFkZXIgKSAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPnRpZCkKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX0FTRiggX3B2QkRIZWFkZXIgKSAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmFzZikKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX0FFRiggX3B2QkRIZWFkZXIgKSAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmFlZikKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX0xTRiggX3B2QkRIZWFkZXIgKSAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmxzZikKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX0VTRiggX3B2QkRIZWFkZXIgKSAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmVzZikKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX1NUQV9JRCggX3B2QkRIZWFkZXIgKSAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmFkZHIySW5kZXgpCisjZGVmaW5lIFdESV9SWF9CRF9HRVRfVUIoIF9wdkJESGVhZGVyICkgICAgICgoKFdESV9SeEJkVHlwZSopX3B2QkRIZWFkZXIpLT51YikKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9BRERSM19JRFgoIF9wdkJESGVhZGVyICkgICgoKFdESV9SeEJkVHlwZSopX3B2QkRIZWFkZXIpLT5hZGRyM0luZGV4KQorI2RlZmluZSBXRElfUlhfQkRfR0VUX0FERFIxX0lEWCggX3B2QkRIZWFkZXIgKSAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPmFkZHIxSW5kZXgpCisKKyNkZWZpbmUgV0RJX1RYX0JEX0dFVF9USUQoIF9wdkJESGVhZGVyICkgICAoKChXRElfVHhCZFR5cGUqKV9wdkJESGVhZGVyKS0+dGlkKQorI2RlZmluZSBXRElfVFhfQkRfR0VUX1NUQV9JRCggX3B2QkRIZWFkZXIgKSAoKChXRElfVHhCZFR5cGUqKV9wdkJESGVhZGVyKS0+c3RhSW5kZXgpCisKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9EUFVfU0lHKCBfcHZCREhlYWRlciApICAgICAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+ZHB1U2lnbmF0dXJlKQorCisvL2Zsb3cgY29udHJvbCByZWxhdGVkLgorI2RlZmluZSBXRElfUlhfRkNfQkRfR0VUX1NUQV9UWF9ESVNBQkxFRF9CSVRNQVAoIF9wdkJESGVhZGVyICkgICAgICgoKFdESV9GY1J4QmRUeXBlKilfcHZCREhlYWRlciktPmZjU3RhVHhEaXNhYmxlZEJpdG1hcCkKKyNkZWZpbmUgV0RJX1JYX0ZDX0JEX0dFVF9GQyggX3B2QkRIZWFkZXIgKSAgICAgKCgoV0RJX0ZjUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+ZmMpCisjZGVmaW5lIFdESV9SWF9GQ19CRF9HRVRfU1RBX1ZBTElEX01BU0soIF9wdkJESGVhZGVyICkgICAgICgoKFdESV9GY1J4QmRUeXBlKilfcHZCREhlYWRlciktPmZjU1RBVmFsaWRNYXNrKQorCisKKy8qLS0tLS0tLS0tLS0tIFJTU0kgYW5kIFNOUiBJbmZvcm1hdGlvbiBleHRyYWN0aW9uIC0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXRElfUlhfQkRfR0VUX1JTU0kwKCBfcHZCREhlYWRlciApICBcCisgICAgKCgoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+cGh5U3RhdHMwKSA+PiAyNCkgJiAweGZmKQorI2RlZmluZSBXRElfUlhfQkRfR0VUX1JTU0kxKCBfcHZCREhlYWRlciApICBcCisgICAgKCgoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+cGh5U3RhdHMwKSA+PiAxNikgJiAweGZmKQorI2RlZmluZSBXRElfUlhfQkRfR0VUX1JTU0kyKCBfcHZCREhlYWRlciApICBcCisgICAgKCgoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+cGh5U3RhdHMwKSA+PiAwKSAmIDB4ZmYpCisjZGVmaW5lIFdESV9SWF9CRF9HRVRfUlNTSTMoIF9wdkJESGVhZGVyICkgIFwKKyAgICAoKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPnBoeVN0YXRzMCkgJiAweGZmKQorCisvLyBHZXQgdGhlIGF2ZXJhZ2Ugb2YgdGhlIDQgdmFsdWVzLgorI2RlZmluZSBXRElfR0VUX1JTU0lfQVZFUkFHRSggX3B2QkRIZWFkZXIgKSBcCisgICAgKCgoV0RJX1JYX0JEX0dFVF9SU1NJMChfcHZCREhlYWRlcikpICsgXAorICAgICAgKFdESV9SWF9CRF9HRVRfUlNTSTEoX3B2QkRIZWFkZXIpKSArIFwKKyAgICAgIChXRElfUlhfQkRfR0VUX1JTU0kyKF9wdkJESGVhZGVyKSkgKyBcCisgICAgICAoV0RJX1JYX0JEX0dFVF9SU1NJMyhfcHZCREhlYWRlcikpKSAvIDQpCisKKy8vIEdldCB0aGUgU05SIHZhbHVlIGZyb20gUEhZIFN0YXRzCisjZGVmaW5lIFdESV9SWF9CRF9HRVRfU05SKCBfcHZCREhlYWRlciApICAgIFwKKyAgICAoKCgoKFdESV9SeEJkVHlwZSopX3B2QkRIZWFkZXIpLT5waHlTdGF0czEpID4+IDI0KSAmIDB4ZmYpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBXRElfVFhfQkRfU0VUX01QRFVfREFUQV9PRkZTRVQoIF9iZCwgX29mZiApICAgICAgKCgoV0RJX1R4QmRUeXBlKilfYmQpLT5tcGR1RGF0YU9mZnNldCA9IF9vZmYpCisgCisjZGVmaW5lIFdESV9UWF9CRF9TRVRfTVBEVV9IRUFERVJfT0ZGU0VUKCBfYmQsIF9vZmYgKSAgICAoKChXRElfVHhCZFR5cGUqKV9iZCktPm1wZHVIZWFkZXJPZmZzZXQgPSBfb2ZmKQorCisjZGVmaW5lIFdESV9UWF9CRF9TRVRfTVBEVV9IRUFERVJfTEVOKCBfYmQsIF9sZW4gKSAgICAgICAoKChXRElfVHhCZFR5cGUqKV9iZCktPm1wZHVIZWFkZXJMZW5ndGggPSBfbGVuKQorCisjZGVmaW5lIFdESV9UWF9CRF9TRVRfTVBEVV9MRU4oIF9iZCwgX2xlbiApICAgICAgICAgICAgICAoKChXRElfVHhCZFR5cGUqKV9iZCktPm1wZHVMZW5ndGggPSBfbGVuKQorCisjZGVmaW5lIFdESV9SWF9CRF9HRVRfQkFfT1BDT0RFKF9wdkJESGVhZGVyKSAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPnJlb3JkZXJPcGNvZGUpCisKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9CQV9GSShfcHZCREhlYWRlcikgICAgICAgICAgICAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+cmVvcmRlckZ3ZElkeCkKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX0JBX1NJKF9wdkJESGVhZGVyKSAgICAgICAgICAgICgoKFdESV9SeEJkVHlwZSopX3B2QkRIZWFkZXIpLT5yZW9yZGVyU2xvdElkeCkKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX0JBX0NTTihfcHZCREhlYWRlcikgICAgICAgICAgICgoKFdESV9SeEJkVHlwZSopX3B2QkRIZWFkZXIpLT5jdXJyZW50UGt0U2VxTm8pCisKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9CQV9FU04oX3B2QkRIZWFkZXIpICAgICAgICAgICAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+ZXhwZWN0ZWRQa3RTZXFObykKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX1JYUF9GTEFHUyhfcHZCREhlYWRlcikgICAgICAgICgoKFdESV9SeEJkVHlwZSopX3B2QkRIZWFkZXIpLT5yeHBGbGFncykKKworI2RlZmluZSBXRElfUlhfQkRfR0VUX1BNSUNNRF8yMFRPMjMoX3B2QkRIZWFkZXIpICAgICAgICAoKChXRElfUnhCZFR5cGUqKV9wdkJESGVhZGVyKS0+cG1pQ21kNHRvMjNbNF0pCisKKyNkZWZpbmUgV0RJX1JYX0JEX0dFVF9QTUlDTURfMjRUTzI1KF9wdkJESGVhZGVyKSAgICAgICAgKCgoV0RJX1J4QmRUeXBlKilfcHZCREhlYWRlciktPnBtaUNtZDI0dG8yNSkKKworI2RlZmluZSBXRElfUlhfQkRfQVNGX1NFVCAgICAgICAgICAgICAgIDEgLypUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIHdoZW4gc2V0IGFuZCBwa3QgaXMgQU1TRFUqLworCisjZGVmaW5lIFdESV9SWF9CRF9GU0ZfU0VUICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdESV9SWF9CRF9MU0ZfU0VUICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdESV9SWF9CRF9BRUZfU0VUICAgICAgICAgICAgICAgMQorCisgCisjZGVmaW5lIFdESV9SWF9CRF9MTENfUFJFU0VOVCAgICAgICAgICAgMCAvKlRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgd2hlbiBMTEMgaXMgcHJlc2VudCovCisKKyNkZWZpbmUgV0RJX1JYX0JEX0ZUX0RPTkUgICAgICAgICAgICAgICAgMSAvKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIHdoZW4gZnJhbWUgeHRsIHdhcyBkb25lKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgQVBJIERlZmluaXRpb24gIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovIAorCisKKy8qKgorIEBicmllZiBXRElfUnhCRF9HZXRGcmFtZVR5cGVTdWJUeXBlIC0gQ2FsbGVkIGJ5IHRoZSBkYXRhIHBhdGggCisgICAgICAgIHRvIHJldHJpZXZlIHRoZSB0eXBlL3N1YnR5cGUgb2YgdGhlIHJlY2VpdmVkIGZyYW1lLgorICAKKyBAcGFyYW0gICAgICAgcHZCREhlYWRlcjogICAgVm9pZCBwb2ludGVyIHRvIHRoZSBSeEJEIGJ1ZmZlci4KKyAgICB1c0ZybUN0cmw6ICAgICB0aGUgZnJhbWUgY3RybCBvZiB0aGUgODAyLjExIGhlYWRlciAKKyAgCisgQHJldHVybiAgIEEgYnl0ZSB3aGljaCBjb250YWlucyBib3RoIHR5cGUgYW5kIHN1YnR5cGUgaW5mby4gTFNCIGZvdXIgYnl0ZXMgCisgKGIwIHRvIGIzKWlzIHN1YnR5cGUgYW5kIGI1LWI2IGlzIHR5cGUgaW5mby4gCisqLworCit3cHRfdWludDggCitXRElfUnhCRF9HZXRGcmFtZVR5cGVTdWJUeXBlCisoCisgIHZvaWQqICAgICAgIF9wdkJESGVhZGVyLCAKKyAgd3B0X3VpbnQxNiAgdXNGcm1DdHJsCispOworCisKKy8qKgorIEBicmllZiBXRElfRmlsbFR4QmQgLSBDYWxsZWQgYnkgdGhlIGRhdGEgcGF0aCB0byBmaWxsIHRoZSBUWCBCRCAKKyAgCisgQHBhcmFtICAgICAgIHBXRElDdHg6ICAgICAgIENvbnRleHQgdG8gdGhlIFdESQorICAgICB1Y1R5cGVTdWJ0eXBlOiBvZiB0aGUgZnJhbWUKKyAgICAgcERlc3RNYWNBZGRyOiAgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKyAgICAgcFRpZDogICAgICAgICAgcG9pbnRlciB0byB0aGUgVElEIChpbi9vdXQgdmFsdWUgaW4gY2FzZSBEQUwgQ3RybCBjYXVzZXMKKyAgICAgICAgICAgICAgICAgICAgYSBUSUQgZG93bmdyYWRlIC0gbm90IGRvbmUgZm9yIG5vdykKKyAgICAgdWNEaXNhYmxlRnJtWHRsOiBzZXQgdG8gMSBpZiB0aGlzIGZyYW1lIGlzIG5vdCB0byBiZSB0cmFuc2xhdGVkIGJ5IEhXCisgICAgIHBUeEJkOiAgICAgICAgICBwb2ludGVyIHRvIHRoZSBUWCBCRAorICAgICB1Y1R4RmxhZzogICAgICAgY2FuIGhhdmUgYXBwcm9wcmlhdGUgYml0IHNldHRpbmcgYXMgcmVxdWlyZWQKKyAgICAgdVRpbWVzdGFtcDogICAgIHBrdCB0aW1lc3RhbXAKKyAgCisgIAorIEByZXR1cm4gc3VjY2VzcyBvciBub3QKKyovCisKK1dESV9TdGF0dXMKK1dESV9GaWxsVHhCZAorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1R5cGVTdWJ0eXBlLCAKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgIHBEZXN0TWFjQWRkciwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgIHBBZGRyMiwKKyAgICB3cHRfdWludDgqICAgICAgICAgICAgIHBUaWQsIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNEaXNhYmxlRnJtWHRsLCAKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgIHBUeEJkLCAKKyAgICB3cHRfdWludDggICAgICAgICAgICAgIHVjVHhGbGFnLCAKKyAgICB3cHRfdWludDMyICAgICAgICAgICAgIHVUaW1lU3RhbXAsCisgICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICBzdGFJbmRleAorKTsKKworLyoqCisgQGJyaWVmIFdESV9Td2FwUnhCZCBzd2FwcyB0aGUgUlggQkQuCisKKyAgCisgQHBhcmFtIHBCZCAtIHBvaW50ZXIgdG8gdGhlIEJEIChpbi9vdXQpCisgIAorIEByZXR1cm4gTm9uZQorKi8KK3ZvaWQgCitXRElfU3dhcFJ4QmQKKygKKyAgd3B0X3VpbnQ4ICpwQmQKKyk7CisKKy8qKgorIEBicmllZiBXRElfU3dhcFR4QmQgLSBTd2FwcyB0aGUgVFggQkQKKyAgCisgQHBhcmFtICBwQmQgLSBwb2ludGVyIHRvIHRoZSBCRCAoaW4vb3V0KQorICAKKyBAcmV0dXJuICAgbm9uZQorKi8KK3ZvaWQgCitXRElfU3dhcFR4QmQKKygKKyAgd3B0X3VpbnQ4ICpwQmQKKyk7CisKKy8qKgorIEBicmllZiBXRElfUnhBbXNkdUJkRml4IC0gZml4IGZvciBIVyBpc3N1ZSBmb3IgQU1TRFUgCisKKyAgCisgQHBhcmFtICAgcFdESUN0eDogICAgICAgQ29udGV4dCB0byB0aGUgV0RJCisgICAgICAgICAgcEJESGVhZGVyIC0gcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCisgIAorIEByZXR1cm4gTm9uZQorKi8KK3ZvaWQgCitXRElfUnhBbXNkdUJkRml4CisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwgCisgIHZvaWQqICAgICAgICAgICAgICAgICAgcEJESGVhZGVyCispOworCisjaWZkZWYgV0xBTl9QRVJGCisvKioKKyBAYnJpZWYgV0RJX1R4QmRGYXN0RndkIC0gZXZhbHVhdGVzIGlmIGEgZnJhbWUgY2FuIGJlIGZhc3QgCisgICAgICAgIGZvcndhcmRlZCAKKyAgCisgQHBhcmFtICAgcFdESUN0eDogQ29udGV4dCB0byB0aGUgV0RJIAorICAgICAgICAgIHBEZXN0TWFjOiBEZXN0aW5hdGlvbiBNQUMKKyAgICAgICAgICB1Y1RpZDogcGFja2V0IFRJRCBwQkRIZWFkZXIKKyAgICAgICAgICB1Y1VuaWNhc3REc3Q6IGlzIHBhY2tldCB1bmljYXN0CisgICAgICAgICAgcFR4QmQ6ICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgorICAgICAgICAgIHVzTXBkdUxlbmd0aDogbGVuIAorICAKKyBAcmV0dXJuIDEgLSBpZiB0aGUgZnJhbWUgY2FuIGJlIGZhc3QgZndkLWVkIDsgMCBpZiBub3QgCisqLword3B0X3VpbnQzMiAKK1dESV9UeEJkRmFzdEZ3ZAorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsICAKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICBwRGVzdE1hYywgCisgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNUaWQsIAorICB3cHRfdWludDggICAgICAgICAgICAgIHVjVW5pY2FzdERzdCwgIAorICB2b2lkKiAgICAgICAgICAgICAgICAgIHBUeEJkLCAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICB1c01wZHVMZW5ndGgpOworI2VuZGlmIC8qV0xBTl9QRVJGKi8KKworLyoqCisgQGJyaWVmIFdESV9EUF9VdGlsc0luaXQgLSBJbnRpYWxpemVzIHRoZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIHRvIAorICAgICAgICBpbnRlcmFjdCB3aXRoIHRoZSBkYXRhIHBhdGgKKyAgCisgQHBhcmFtICAgICAgIHBXRElDdHg6ICAgIHBvaW50ZXIgdG8gdGhlIG1haW4gV0RJIEN0cmwgQmxvY2sKKyAgCisgQHJldHVybiAgIHN1Y2Nlc3MgYWx3YXlzCisqLworV0RJX1N0YXR1cyAKK1dESV9EUF9VdGlsc0luaXQKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4CispOworCisvKioKKyBAYnJpZWYgV0RJX0RQX1V0aWxzRXhpdCAtIENsZWFycyB0aGUgcGFyYW1ldGVycyByZXF1aXJlZCB0bworICAgICAgICBpbnRlcmFjdCB3aXRoIHRoZSBkYXRhIHBhdGgKKyAgCisgQHBhcmFtICAgICAgIHBXRElDdHg6ICAgIHBvaW50ZXIgdG8gdGhlIG1haW4gV0RJIEN0cmwgQmxvY2sKKyAgCisgQHJldHVybiAgIHN1Y2Nlc3MgYWx3YXlzCisqLworV0RJX1N0YXR1cworV0RJX0RQX1V0aWxzRXhpdAorKCAKKyAgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgKKyk7CisKKyNlbmRpZiAvKldMQU5fUUNUX1dESV9EUF9IKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvQ1AvaW5jL3dsYW5fcWN0X3dkaV9pLmggYi9DT1JFL1dESS9DUC9pbmMvd2xhbl9xY3Rfd2RpX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRjOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvQ1AvaW5jL3dsYW5fcWN0X3dkaV9pLmgKQEAgLTAsMCArMSw0ODkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBXTEFOX1FDVF9XRElfSV9ICisjZGVmaW5lIFdMQU5fUUNUX1dESV9JX0gKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgVyBMIEEgTiAgIEQgRSBWIEkgQyBFICAgQSBCIFMgVCBSIEEgQyBUIEkgTyBOICAgTCBBIFkgRSBSIAorICAgICAgICAgICAgICBJIE4gVCBFIFIgTiBBIEwgICAgIEEgUCBJICAgICAgIEYgTyBSICAgIFQgSCBFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEIEEgVCBBICAgUCBBIFQgSCAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAKK0RFU0NSSVBUSU9OCisgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW50ZXJuYWwgQVBJIGV4cG9zZWQgYnkgdGhlIERBTCBDb250cm9sIFBhdGggQ29yZSAKKyAgbW9kdWxlIHRvIGJlIHVzZWQgYnkgdGhlIERBTCBEYXRhIFBhdGggQ29yZS4gCisgIAorICAgICAgCisgIENvcHlyaWdodCAoYykgMjAxMCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAkSGVhZGVyOiQgJERhdGVUaW1lOiAkICRBdXRob3I6ICQKKworCit3aGVuICAgICAgICB3aG8gICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEwLzA1LzExICAgIGhhcCAgICAgQWRkaW5nIHN1cHBvcnQgZm9yIEtlZXAgQWxpdmUKKzA4LzE5LzEwICAgIGx0aSAgICAgQ3JlYXRlZCBtb2R1bGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfbGlzdC5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zeW5jLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3RpbWVyLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2N0cy5oIiAKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfYmQuaCIgCisKKyNpbmNsdWRlICJ3bGFuX2hhbF9tc2cuaCIKKyNpbmNsdWRlICJ3bGFuX3N0YXR1c19jb2RlLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfZGV2X2RlZnMuaCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKkFzc2VydCBtYWNybyAtIHJlZGVmaW5lZCBmb3IgV0RJIHNvIGl0IGlzIG1vcmUgZmxleGlibGUgaW4gZGlzYWJsaW5nKi8KKyNkZWZpbmUgV0RJX0FTU0VSVChfY29uZCkgV1BBTF9BU1NFUlQoX2NvbmQpCisKKy8qRXJyb3IgY29kZXMgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgV0RJIC0gdGhlIEhBTCBFcnJvciBjb2RlcyBhcmUgbm90IAorIHByb3BhZ2F0ZWQgb3V0c2lkZSBXREkgYmVjYXVzZSB0aGV5IGFyZSB0b28gZXhwbGljaXQgd2hlbiByZWZlcmluZyB0byBSSVZBCisgSFcgZXJyb3JzIC0gdGhleSBhcmUgbWFza2VkIHVuZGVyIGRldiBpbnRlcm5hbCBmYWlsdXJlKi8KKyNkZWZpbmUgV0RJX0VSUl9CQVNJQ19PUF9GQUlMVVJFICAgICAgICAgICAwIAorI2RlZmluZSBXRElfRVJSX1RSQU5TUE9SVF9GQUlMVVJFICAgICAgICAgIDEgCisjZGVmaW5lIFdESV9FUlJfSU5WQUxJRF9SU1BfRk1UICAgICAgICAgICAgMiAKKyNkZWZpbmUgV0RJX0VSUl9SU1BfVElNRU9VVCAgICAgICAgICAgICAgICAzIAorI2RlZmluZSBXRElfRVJSX0RFVl9JTlRFUk5BTF9GQUlMVVJFICAgICAgIDQKKworLypJbiBwcmltYSAxMiBIVyBzdGF0aW9ucyBhcmUgc3VwcG9ydGVkIGluY2x1ZGluZyBCQ0FTVCBTVEEoc3RhSWQgMCkKKyBhbmQgU0VMRiBTVEEoc3RhSWQgMSkgc28gdG90YWwgQVNTT0Mgc3RhdGlvbnMgd2hpY2ggY2FuIGNvbm5lY3QgdG8gUHJpbWEKKyBTb2Z0QVAgPSAxMiAtIDEoU2VsZiBTVGEpIC0gMShCY2FzdCBTdGEpID0gMTAgU3RhdGlvbnMuICovCisjZGVmaW5lIFdESV9NQVhfU1VQUE9SVEVEX1NUQVMgICAgMTIgCisjZGVmaW5lIFdESV9NQVhfU1VQUE9SVEVEX0JTUyAgICAgNSAKKworLyogQ29udHJvbCB0cmFuc3BvcnQgY2hhbm5lbCBzaXplKi8KKyNkZWZpbmUgV0RJX0NUX0NIQU5ORUxfU0laRSA0MDk2CisKKy8qSW52YWxpZCBCU1MgaW5kZXggISBUTyBETzogTXVzdCBjb21lIGZyb20gdGhlIEhBTCBoZWFkZXIgZmlsZSovCisjZGVmaW5lIFdESV9CU1NfSU5WQUxJRF9JRFggMHhGRgorCisjaWZkZWYgQU5JX01BTkZfRElBRworI2RlZmluZSBXRElfRlRNX01BWF9SRUNFSVZFX0JVRkZFUiAgIDY1MDAKKyNlbmRpZiAvKiBBTklfTUFORl9ESUFHICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERBTCBDb250cm9sIFBhdGggTWFpbiBTdGF0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgCit0eXBlZGVmIGVudW0KK3sKKyAgLyogVHJhbnNpdGlvbiBpbiB0aGlzIHN0YXRlIG1hZGUgdXBvbiBjcmVhdGlvbiBhbmQgd2hlbiBhIGNsb3NlIHJlcXVlc3QgaXMgCisgICAgIHJlY2VpdmVkKi8KKyAgV0RJX0lOSVRfU1QgPSAwLCAgICAgIAorCisgIC8qIFRyYW5zaXRpb24gaGFwcGVucyBhZnRlciBhIFN0YXJ0IHJlc3BvbnNlIHdhcyByZWNlaXZlZCBmcm9tIEhBTCAoYXMgYQorICByZXN1bHQgb2YgYSBwcmV2aW91c2x5IHNlbnQgSEFMIFJlcXVlc3QpKi8KKyAgV0RJX1NUQVJURURfU1QsICAgICAKKworICAvKiBUcmFuc2l0aW9uIGhhcHBlbnMgd2hlbiBhIFN0b3AgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgKi8KKyAgV0RJX1NUT1BQRURfU1QsIAorCisgIC8qIFRyYW5zaXRpb24gaGFwcGVucyB3aGVuIGEgcmVxdWVzdCBpcyBiZWluZyBzZW50IGRvd24gdG8gSEFMIGFuZCB3ZSBhcmUKKyAgICB3YWl0aW5nIGZvciB0aGUgcmVzcG9uc2UgKi8KKyAgV0RJX0JVU1lfU1QsICAKKworICAvKiBUcmFuc2l0aW9uIGhhcHBlbnMgd2hlbiAnU1NSJyBzaHV0ZG93biByZXF1ZXN0IGlzIHJlY2lldmVkLiovCisgIFdESV9TSFVURE9XTl9TVCwKKworICBXRElfTUFYX1NUCit9V0RJX01haW5TdGF0ZVR5cGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgREFMIENvbnRyb2wgUGF0aCBTY2FuIFN0YXRlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAKK3R5cGVkZWYgZW51bQoreworICAvKlRoZSBmbGFnIHdpbGwgYmUgc2V0IHRvIHRoaXMgc3RhdGUgd2hlbiBpbml0IGlzIGNhbGxlZC4gT25jZSB0aGUgZmxhZyBoYXMgICAKKyAgICB0aGlzIHZhbHVlIHRoZSBvbmx5IHR3byBzY2FubmluZyBBUEkgY2FsbHMgYWxsb3dlZCBhcmUgU2NhbiBTdGFydCBhbmQgCisgICAgU2NhbiBGaW5pc2hlZCovCisgIFdESV9TQ0FOX0lOSVRJQUxJWkVEX1NUID0gMCwgCisKKyAgLypUaGUgZmxhZyB3aWxsIGJlIHNldCB0byB0aGlzIHZhbHVlIG9uY2UgdGhlIFN0YXJ0IFNjYW4gQVBJIGlzIGNhbGxlZC4gICAKKyAgICBXaGVuIHRoZSBmbGFnIGhhcyB0aGlzIHZhbHVlIG9ubHkgU2NhbiBFbmQgQVBJIHdpbGwgYmUgYWxsb3dlZC4gKi8KKyAgV0RJX1NDQU5fU1RBUlRFRF9TVCAgICAgPSAxLCAKKworICAvKlRoZSBmbGFnIHdpbGwgYmUgc2V0IHRvIHRoaXMgdmFsdWUgd2hlbiBFbmQgU2NhbiBBUEkgaXMgY2FsbGVkLiBXaGVuIHRoZSAgIAorICAgIGZsYWcgaXMgc2V0IHRvIHRoaXMgdmFsdWUgdGhlIG9ubHkgdHdvIFNjYW4gQVBJcyBhbGxvd2VkIGFyZSBTdGFydCBhbmQgCisgICAgRmluaXNoLiAqLworICBXRElfU0NBTl9FTkRFRF9TVCAgICAgICA9IDIsIAorCisgIC8qVGhlIGZsYWcgd2lsbCBiZSBzZXQgdG8gdGhpcyB2YWx1ZSBpbiB0aGUgYmVnaW5uaW5nIGJlZm9yZSBpbml0IGlzIGNhbGxlZCAgIAorICAgIGFuZCBhZnRlciB0aGUgRmluaXNoIEFQSSBpcyBjYWxsZWQuIE5vIG90aGVyIHNjYW4gQVBJcyB3aWxsIGJlIGFsbG93ZWQgCisgICAgaW4gdGhpcyBzdGF0ZSB1bnRpbCBTY2FuIEluaXQgaXMgY2FsbGVkIGFnYWluLiAqLworICBXRElfU0NBTl9GSU5JU0hFRF9TVCAgICA9IDMsCisKKyAgV0RJX1NDQU5fTUFYX1NUCit9V0RJX1NjYW5TdGF0ZVR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgV0xBTiBEQUwgQlNTIFNlc3Npb24gVHlwZSAtIHVzZWQgdG8gYWxsb3cgc2ltdWxhdG5lb3VzIGFzc29jaWF0aW9uCisgICBhbmQga2VlcCB0cmFjayBvZiBlYWNoIGFzc29jaWF0ZWQgc2Vzc2lvbiAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXRElfTUFYX0JTU19TRVNTSU9OUyAgMTAKKwordHlwZWRlZiBlbnVtCit7CisgIC8qSW5pdCBzdGF0ZSovCisgIFdESV9BU1NPQ19JTklUX1NULCAKKworICAvKkpvaW5pbmcgU3RhdGUqLworICBXRElfQVNTT0NfSk9JTklOR19TVCwgCisKKyAgLypBc3NvY2lhdGVkIHN0YXRlKi8KKyAgV0RJX0FTU09DX1BPU1RfU1QsCisKKyAgV0RJX0FTU09DX01BWF9TVAorfVdESV9Bc3NvY1N0YXRlVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICBXTEFOIERBTCBTdXBwb3J0ZWQgUmVxdWVzdCBUeXBlcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgLypXTEFOIERBTCBTVEFSVCBSZXF1ZXN0Ki8KKyAgV0RJX1NUQVJUX1JFUSAgPSAwLCAKKworICAvKldMQU4gREFMIFNUT1AgUmVxdWVzdCovCisgIFdESV9TVE9QX1JFUSAgID0gMSwgCisKKyAgLypXTEFOIERBTCBTVE9QIFJlcXVlc3QqLworICBXRElfQ0xPU0VfUkVRICA9IDIsIAorCisKKyAgLypTQ0FOKi8KKyAgLypXTEFOIERBTCBJbml0IFNjYW4gUmVxdWVzdCovCisgIFdESV9JTklUX1NDQU5fUkVRICAgID0gMywgCisKKyAgLypXTEFOIERBTCBTdGFydCBTY2FuIFJlcXVlc3QqLworICBXRElfU1RBUlRfU0NBTl9SRVEgICA9IDQsIAorCisgIC8qV0xBTiBEQUwgRW5kIFNjYW4gUmVxdWVzdCovCisgIFdESV9FTkRfU0NBTl9SRVEgICAgID0gNSwgCisKKyAgLypXTEFOIERBTCBGaW5pc2ggU2NhbiBSZXF1ZXN0Ki8KKyAgV0RJX0ZJTklTSF9TQ0FOX1JFUSAgPSA2LCAKKworCisgIC8qQVNTT0NJQVRJT04qLworICAvKldMQU4gREFMIEpvaW4gUmVxdWVzdCovCisgIFdESV9KT0lOX1JFUSAgICAgICAgICA9IDcsIAorCisgIC8qV0xBTiBEQUwgQ29uZmlnIEJTUyBSZXF1ZXN0Ki8KKyAgV0RJX0NPTkZJR19CU1NfUkVRICAgID0gOCwgCisKKyAgLypXTEFOIERBTCBEZWwgQlNTIFJlcXVlc3QqLworICBXRElfREVMX0JTU19SRVEgICAgICAgPSA5LCAKKworICAvKldMQU4gREFMIFBvc3QgQXNzb2MgUmVxdWVzdCovCisgIFdESV9QT1NUX0FTU09DX1JFUSAgICA9IDEwLCAKKworICAvKldMQU4gREFMIERlbCBTVEEgUmVxdWVzdCovCisgIFdESV9ERUxfU1RBX1JFUSAgICAgICA9IDExLCAKKworICAvKlNlY3VyaXR5Ki8KKyAgLypXTEFOIERBTCBTZXQgQlNTIEtleSBSZXF1ZXN0Ki8KKyAgV0RJX1NFVF9CU1NfS0VZX1JFUSAgID0gMTIsCisgIAorICAvKldMQU4gREFMIFJlbW92ZSBCU1MgS2V5IFJlcXVlc3QqLyAKKyAgV0RJX1JNVl9CU1NfS0VZX1JFUSAgID0gMTMsCisgIAorICAvKldMQU4gREFMIFNldCBTVEEgS2V5IFJlcXVlc3QqLyAKKyAgV0RJX1NFVF9TVEFfS0VZX1JFUSAgID0gMTQsCisgIAorICAvKldMQU4gREFMIFJlbW92ZSBTVEEgS2V5IFJlcXVlc3QqLyAKKyAgV0RJX1JNVl9TVEFfS0VZX1JFUSAgID0gMTUsIAorCisgIC8qUU9TIGFuZCBCQSovCisgIC8qV0xBTiBEQUwgQWRkIFRTcGVjIFJlcXVlc3QqLworICBXRElfQUREX1RTX1JFUSAgICAgICAgPSAxNiwKKyAgCisgIC8qV0xBTiBEQUwgRGVsZXRlIFRTcGVjIFJlcXVlc3QqLyAKKyAgV0RJX0RFTF9UU19SRVEgICAgICAgID0gMTcsCisgIAorICAvKldMQU4gREFMIFVwZGF0ZSBFRENBIFBhcmFtcyBSZXF1ZXN0Ki8gCisgIFdESV9VUERfRURDQV9QUk1TX1JFUSA9IDE4LAorCisgIC8qV0xBTiBEQUwgQWRkIEJBIFNlc3Npb24gUmVxdWVzdCovCisgIFdESV9BRERfQkFfU0VTU0lPTl9SRVEgPSAxOSwKKworICAvKldMQU4gREFMIERlbGV0ZSBCQSBSZXF1ZXN0Ki8gCisgIFdESV9ERUxfQkFfUkVRICAgICAgICA9IDIwLAorCisgICAvKiBNaXNjZWxsYW5lb3VzIENvbnRyb2wgKi8KKyAgLypXTEFOIERBTCBDaGFubmVsIFN3aXRjaCBSZXF1ZXN0Ki8gCisgIFdESV9DSF9TV0lUQ0hfUkVRICAgICA9IDIxLAorICAKKyAgLypXTEFOIERBTCBDb25maWcgU1RBIFJlcXVlc3QqLyAKKyAgV0RJX0NPTkZJR19TVEFfUkVRICAgID0gMjIsIAorCisgIC8qV0xBTiBEQUwgU2V0IExpbmsgU3RhdGUgUmVxdWVzdCovIAorICBXRElfU0VUX0xJTktfU1RfUkVRICAgPSAyMywKKyAgCisgIC8qV0xBTiBEQUwgR2V0IFN0YXRzIFJlcXVlc3QqLyAKKyAgV0RJX0dFVF9TVEFUU19SRVEgICAgID0gMjQsIAorCisgLypXTEFOIERBTCBVcGRhdGUgQ29uZmlnIFJlcXVlc3QqLyAKKyAgV0RJX1VQREFURV9DRkdfUkVRICAgID0gMjUsIAorCisgIC8qIFdESSBBREQgQkEgUmVxdWVzdCAqLworICBXRElfQUREX0JBX1JFUSAgICAgICAgPSAyNiwKKworICAvKiBXREkgVHJpZ2dlciBCQSBSZXF1ZXN0ICovCisgIFdESV9UUklHR0VSX0JBX1JFUSAgICA9IDI3LAorCisgIC8qV0xBTiBEQUwgVXBkYXRlIEJlYWNvbiBQYXJhbXMgUmVxdWVzdCovIAorICBXRElfVVBEX0JDT05fUFJNU19SRVEgPSAyOCwKKworICAvKldMQU4gREFMIFNlbmQgQmVhY29uIHRlbXBsYXRlIFJlcXVlc3QqLyAKKyAgV0RJX1NORF9CQ09OX1JFUSAgICAgID0gMjksCisKKyAgLypXTEFOIERBTCBTZW5kIFByb2JlIFJlc3BvbnNlIFRlbXBsYXRlIFJlcXVlc3QqLyAKKyAgV0RJX1VQRF9QUk9CRV9SU1BfVEVNUExBVEVfUkVRID0gMzAsCisKKyAgLypXTEFOIERBTCBTZXQgU1RBIEJjYXN0IEtleSBSZXF1ZXN0Ki8gCisgIFdESV9TRVRfU1RBX0JDQVNUX0tFWV9SRVEgICAgICA9IDMxLAorICAKKyAgLypXTEFOIERBTCBSZW1vdmUgU1RBIEJjYXN0IEtleSBSZXF1ZXN0Ki8gCisgIFdESV9STVZfU1RBX0JDQVNUX0tFWV9SRVEgICAgICA9IDMyLCAKKworICAvKldMQU4gREFMIFNldCBNYXggVHggUG93ZXIgUmVxdWVzdCovCisgIFdESV9TRVRfTUFYX1RYX1BPV0VSX1JFUSAgICAgICA9IDMzLAorICAKKyAgLyogV0xBTiBEQUwgUDJQIEdPIE5vdGljZSBPZiBBYnNlbmNlIFJlcXVlc3QgKi8KKyAgV0RJX1AyUF9HT19OT1RJQ0VfT0ZfQUJTRU5DRV9SRVEgICAgPSAzNCwKKworICAvKldMQU4gREFMIEVudGVyIElNUFMgUmVxdWVzdCovIAorICBXRElfRU5URVJfSU1QU19SRVEgICAgPSAzNSwgCisKKyAgLypXTEFOIERBTCBFeGl0IElNUFMgUmVxdWVzdCovIAorICBXRElfRVhJVF9JTVBTX1JFUSAgICAgPSAzNiwgCisKKyAgLypXTEFOIERBTCBFbnRlciBCTVBTIFJlcXVlc3QqLyAKKyAgV0RJX0VOVEVSX0JNUFNfUkVRICAgID0gMzcsIAorCisgIC8qV0xBTiBEQUwgRXhpdCBCTVBTIFJlcXVlc3QqLyAKKyAgV0RJX0VYSVRfQk1QU19SRVEgICAgID0gMzgsIAorCisgIC8qV0xBTiBEQUwgRW50ZXIgVUFQU0QgUmVxdWVzdCovIAorICBXRElfRU5URVJfVUFQU0RfUkVRICAgPSAzOSwgCisKKyAgLypXTEFOIERBTCBFeGl0IFVBUFNEIFJlcXVlc3QqLyAKKyAgV0RJX0VYSVRfVUFQU0RfUkVRICAgID0gNDAsIAorCisgIC8qV0xBTiBEQUwgU2V0IFVBUFNEIFBhcmFtIFJlcXVlc3QqLyAgCisgIFdESV9TRVRfVUFQU0RfUEFSQU1fUkVRID0gNDEsIAorCisgIC8qV0xBTiBEQUwgVXBkYXRlIFVBUFNEIFBhcmFtIChTb2Z0QVAgbW9kZSkgUmVxdWVzdCovCisgIFdESV9VUERBVEVfVUFQU0RfUEFSQU1fUkVRID0gNDIsIAorCisgIC8qV0xBTiBEQUwgQ29uZmlndXJlIFJYUCBmaWx0ZXIgUmVxdWVzdCovCisgIFdESV9DT05GSUdVUkVfUlhQX0ZJTFRFUl9SRVEgPSA0MywgCisKKyAgLypXTEFOIERBTCBDb25maWd1cmUgQmVhY29uIGZpbHRlciBSZXF1ZXN0Ki8KKyAgV0RJX1NFVF9CRUFDT05fRklMVEVSX1JFUSA9IDQ0LCAKKworICAvKldMQU4gREFMIFJlbW92ZSBCZWFjb24gZmlsdGVyIFJlcXVlc3QqLworICBXRElfUkVNX0JFQUNPTl9GSUxURVJfUkVRID0gNDUsIAorCisgIC8qV0xBTiBEQUwgU2V0IFJTU0kgdGhyZXNob2xkcyBSZXF1ZXN0Ki8KKyAgV0RJX1NFVF9SU1NJX1RIUkVTSE9MRFNfUkVRID0gNDYsIAorCisgIC8qV0xBTiBEQUwgaG9zdCBvZmZsb2FkIFJlcXVlc3QqLworICBXRElfSE9TVF9PRkZMT0FEX1JFUSA9IDQ3LCAKKworICAvKldMQU4gREFMIGFkZCB3b3dsIGJjIHB0cm4gUmVxdWVzdCovCisgIFdESV9XT1dMX0FERF9CQ19QVFJOX1JFUSA9IDQ4LCAKKworICAvKldMQU4gREFMIGRlbGV0ZSB3b3dsIGJjIHB0cm4gUmVxdWVzdCovCisgIFdESV9XT1dMX0RFTF9CQ19QVFJOX1JFUSA9IDQ5LCAKKworICAvKldMQU4gREFMIGVudGVyIHdvd2wgUmVxdWVzdCovCisgIFdESV9XT1dMX0VOVEVSX1JFUSA9IDUwLCAKKworICAvKldMQU4gREFMIGV4aXQgd293bCBSZXF1ZXN0Ki8KKyAgV0RJX1dPV0xfRVhJVF9SRVEgPSA1MSwgCisKKyAgLypXTEFOIERBTCBDb25maWd1cmUgQXBwcyBDUFUgV2FrZXVwIHN0YXRlIFJlcXVlc3QqLworICBXRElfQ09ORklHVVJFX0FQUFNfQ1BVX1dBS0VVUF9TVEFURV9SRVEgPSA1MiwgCisKKyAgLyogV0xBTiAgTlYgRG93bmxvYWQgUmVxdWVzdCAqLworICBXRElfTlZfRE9XTkxPQURfUkVRICAgPSA1MywKKyAgLypXTEFOIERBTCBGbHVzaCBBQyBSZXF1ZXN0Ki8gCisgIFdESV9GTFVTSF9BQ19SRVEgICAgICA9IDU0LCAKKworICAvKldMQU4gREFMIEJUIEFNUCBldmVudCBSZXF1ZXN0Ki8gCisgIFdESV9CVEFNUF9FVkVOVF9SRVEgICA9IDU1LCAKKyAgLypXTEFOIERBTCBBZ2dyZWdhdGVkIEFkZCBUU3BlYyBSZXF1ZXN0Ki8KKyAgV0RJX0FHR1JfQUREX1RTX1JFUSAgID0gNTYsCisKKyAgV0RJX0FERF9TVEFfU0VMRl9SRVEgICAgICAgPSA1NywKKworICBXRElfREVMX1NUQV9TRUxGX1JFUSAgICAgICA9IDU4LAorCisgIC8qIFdMQU4gRlRNIENvbW1hbmQgcmVxdWVzdCAqLworICBXRElfRlRNX0NNRF9SRVEgICAgICAgICAgICA9IDU5LAorCisgIC8qV0xBTiBTVEFSVCBJTk5BViBNRUFTIFJlcXVlc3QqLworICBXRElfU1RBUlRfSU5OQVZfTUVBU19SRVEgICA9IDYwLAorICAvKiBXTEFOIGhvc3QgcmVzdW1lIHJlcXVlc3QgKi8KKyAgV0RJX0hPU1RfUkVTVU1FX1JFUSAgICAgID0gNjEsCisgIAorICBXRElfS0VFUF9BTElWRV9SRVEgICAgICAgPSA2MiwgIAorCisgIC8qIFNldCBQTk8gKi8KKyAgV0RJX1NFVF9QUkVGX05FVFdPUktfUkVRICAgICA9IDYzLAorCisgIC8qUlNTSSBGaWx0ZXIgUmVxdWVzdCovCisgIFdESV9TRVRfUlNTSV9GSUxURVJfUkVRICAgICAgPSA2NCwKKworICAvKiBVcGRhdGUgU2NhbiBQYXJhbWV0ZXJzKi8KKyAgV0RJX1VQREFURV9TQ0FOX1BBUkFNU19SRVEgICA9IDY1LAorCisgIFdESV9TRVRfVFhfUEVSX1RSQUNLSU5HX1JFUSA9IDY2LAorCisgIFdESV84MDIzX01VTFRJQ0FTVF9MSVNUX1JFUSAgICAgICAgICAgICAgICAgICA9IDY3LAorICBXRElfUkVDRUlWRV9GSUxURVJfU0VUX0ZJTFRFUl9SRVEgICAgICAgICAgICAgPSA2OCwKKyAgV0RJX1BBQ0tFVF9DT0FMRVNDSU5HX0ZJTFRFUl9NQVRDSF9DT1VOVF9SRVEgID0gNjksCisgIFdESV9SRUNFSVZFX0ZJTFRFUl9DTEVBUl9GSUxURVJfUkVRICAgICAgICAgICA9IDcwLAorICAKKyAgLypUaGlzIGlzIHRlbXAgZml4LiBTaG91bGQgYmUgcmVtb3ZlZCBvbmNlIAorICAgKiBIb3N0IGFuZCBSaXZhIGNvZGUgaXMgaW4gc3luYyovCisgIFdESV9JTklUX1NDQU5fQ09OX1JFUSAgICAgICAgICAgICAgICAgICAgICAgICA9IDcxLCAKKworICAvKiBXTEFOIEhBTCBEVU1QIENvbW1hbmQgcmVxdWVzdCAqLworICBXRElfSEFMX0RVTVBfQ01EX1JFUSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MiwKKworICAvKiBXTEFOIERBTCBTaHV0ZG93biBSZXF1ZXN0ICovCisgIFdESV9TSFVURE9XTl9SRVEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczLAorCisgIC8qU2V0IHBvd2VyIHBhcmFtZXRlcnMgb24gdGhlIGRldmljZSovCisgIFdESV9TRVRfUE9XRVJfUEFSQU1TX1JFUSAgICAgICAgICAgICAgICAgICAgICA9IDc0LAorCisgIC8qIFRyYWZmaWMgU3RyZWFtIE1ldHJpY3Mgc3RhdGlzdGljIHJlcXVlc3QgKi8KKyAgV0RJX1RTTV9TVEFUU19SRVEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzUsCisgIC8qIEdUSyBSZWtleSBPZmZsb2FkICovCisgIFdESV9HVEtfT0ZGTE9BRF9SRVEgICAgICAgICAgICAgPSA3NiwgCisgIFdESV9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JFUSAgID0gNzcsIAorCisgIC8qU2V0IFRoZXJtYWwgTWlncmF0aW9uIGxldmVsIHRvIFJJVkEqLworICBXRElfU0VUX1RNX0xFVkVMX1JFUSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OCwgCisKKyAgLyogU2VuZCBhIGNhcGFiaWxpdHkgZXhjaGFuZ2UgbWVzc2FnZSB0byBIQUwgKi8KKyAgV0RJX0ZFQVRVUkVfQ0FQU19FWENIQU5HRV9SRVEgICAgICAgICAgICAgICAgID0gNzksCisKKyAgV0RJX01BWF9SRVEsCisKKyAgLypTZW5kIGEgc3VzcGVuZCBJbmRpY2F0aW9uIGRvd24gdG8gSEFMKi8KKyAgV0RJX0hPU1RfU1VTUEVORF9JTkQgICAgICAgICAgPSBXRElfTUFYX1JFUSAsCisKKyAgLypLZWVwIGFkZGluZyB0aGUgaW5kaWNhdGlvbnMgdG8gdGhlIG1heCByZXF1ZXN0CisgICAgc3VjaCB0aGF0IHdlIGtlZXAgdGhlbSBzZXBwYXJhdGUgKi8KKworICBXRElfTUFYX1VNQUNfSU5ECit9V0RJX1JlcXVlc3RFbnVtVHlwZTsgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgV0xBTiBEQUwgU3VwcG9ydGVkIFJlc3BvbnNlIFR5cGVzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAvKldMQU4gREFMIFNUQVJUIFJlc3BvbnNlKi8KKyAgV0RJX1NUQVJUX1JFU1AgID0gMCwgCisKKyAgLypXTEFOIERBTCBTVE9QIFJlc3BvbnNlKi8KKyAgV0RJX1NUT1BfUkVTUCAgID0gMSwgCisKKyAgLypXTEFOIERBTCBTVE9QIFJlc3BvbnNlKi8KKyAgV0RJX0NMT1NFX1JFU1AgID0gMiwgCisKKyAgLypTQ0FOKi8KKyAgLypXTEFOIERBTCBJbml0IFNjYW4gUmVzcG9uc2UqLworICBXRElfSU5JVF9TQ0FOX1JFU1AgICAgPSAzLCAKKworICAvKldMQU4gREFMIFN0YXJ0IFNjYW4gUmVzcG9uc2UqLworICBXRElfU1RBUlRfU0NBTl9SRVNQICAgPSA0LCAKKworICAvKldMQU4gREFMIEVuZCBTY2FuIFJlc3BvbnNlKi8KKyAgV0RJX0VORF9TQ0FOX1JFU1AgICAgID0gNSwgCisKKyAgLypXTEFOIERBTCBGaW5pc2ggU2NhbiBSZXNwb25zZSovCisgIFdESV9GSU5JU0hfU0NBTl9SRVNQICA9IDYsIAorCisKKyAgLypBU1NPQ0lBVElPTiovCisgIC8qV0xBTiBEQUwgSm9pbiBSZXNwb25zZSovCisgIFdESV9KT0lOX1JFU1AgICAgICAgICAgPSA3LCAKKworICAvKldMQU4gREFMIENvbmZpZyBCU1MgUmVzcG9uc2UqLworICBXRElfQ09ORklHX0JTU19SRVNQICAgID0gOCwgCisKKyAgLypXTEFOIERBTCBEZWwgQlNTIFJlc3BvbnNlKi8KKyAgV0RJX0RFTF9CU1NfUkVTUCAgICAgICA9IDksIAorCisgIC8qV0xBTiBEQUwgUG9zdCBBc3NvYyBSZXNwb25zZSovCisgIFdESV9QT1NUX0FTU09DX1JFU1AgICAgPSAxMCwgCisKKyAgLypXTEFOIERBTCBEZWwgU1RBIFJlc3BvbnNlKi8KKyAgV0RJX0RFTF9TVEFfUkVTUCAgICAgICA9IDExLCAKKworICAvKldMQU4gREFMIFNldCBCU1MgS2V5IFJlc3BvbnNlKi8KKyAgV0RJX1NFVF9CU1NfS0VZX1JFU1AgICA9IDEyLAorICAKKyAgLypXTEFOIERBTCBSZW1vdmUgQlNTIEtleSBSZXNwb25zZSovIAorICBXRElfUk1WX0JTU19LRVlfUkVTUCAgID0gMTMsCisgIAorICAvKldMQU4gREFMIFNldCBTVEEgS2V5IFJlc3BvbnNlKi8gCisgIFdESV9TRVRfU1RBX0tFWV9SRVNQICAgPSAxNCwKKyAgCisgIC8qV0xBTiBEQUwgUmVtb3ZlIFNUQSBLZXkgUmVzcG9uc2UqLyAKKyAgV0RJX1JNVl9TVEFfS0VZX1JFU1AgICA9IDE1LCAKKworICAvKldMQU4gREFMIEFkZCBUU3BlYyBSZXNwb25zZSovCisgIFdESV9BRERfVFNfUkVTUCAgICAgICAgPSAxNiwKKyAgCisgIC8qV0xBTiBEQUwgRGVsZXRlIFRTcGVjIFJlc3BvbnNlKi8gCisgIFdESV9ERUxfVFNfUkVTUCAgICAgICAgPSAxNywKKyAgCisgIC8qV0xBTiBEQUwgVXBkYXRlIEVEQ0EgUGFyYW1zIFJlc3BvbnNlKi8gCisgIFdESV9VUERfRURDQV9QUk1TX1JFU1AgPSAxOCwKKworICAvKldMQU4gREFMIEFkZCBCQSBTZXNzaW9uIFJlc3BvbnNlKi8KKyAgV0RJX0FERF9CQV9TRVNTSU9OX1JFU1AgPSAxOSwKKworICAvKldMQU4gREFMIERlbGV0ZSBCQSBSZXNwb25zZSovIAorICBXRElfREVMX0JBX1JFU1AgICAgICAgID0gMjAsCisKKyAgLypXTEFOIERBTCBDaGFubmVsIFN3aXRjaCBSZXNwb25zZSovIAorICBXRElfQ0hfU1dJVENIX1JFU1AgICAgID0gMjEsCisgIAorICAvKldMQU4gREFMIENvbmZpZyBTVEEgUmVzcG9uc2UqLyAKKyAgV0RJX0NPTkZJR19TVEFfUkVTUCAgICA9IDIyLCAKKworICAvKldMQU4gREFMIFNldCBMaW5rIFN0YXRlIFJlc3BvbnNlKi8gCisgIFdESV9TRVRfTElOS19TVF9SRVNQICAgPSAyMywKKyAgCisgIC8qV0xBTiBEQUwgR2V0IFN0YXRzIFJlc3BvbnNlKi8gCisgIFdESV9HRVRfU1RBVFNfUkVTUCAgICAgPSAyNCwgCisKKyAgLypXTEFOIERBTCBVcGRhdGUgQ29uZmlnIFJlc3BvbnNlKi8gCisgIFdESV9VUERBVEVfQ0ZHX1JFU1AgICAgPSAyNSwgCisKKyAgLyogV0RJIEFERCBCQSBSZXNwb25zZSAqLworICBXRElfQUREX0JBX1JFU1AgICAgICAgID0gMjYsCisKKyAgLyogV0RJIFRyaWdnZXIgQkEgUmVzcG9uc2UgKi8KKyAgV0RJX1RSSUdHRVJfQkFfUkVTUCAgICA9IDI3LAorCisgLypXTEFOIERBTCBVcGRhdGUgYmVhY29uIHBhcmFtcyAgUmVzcG9uc2UqLworICBXRElfVVBEX0JDT05fUFJNU19SRVNQID0gMjgsCisgIAorIC8qV0xBTiBEQUwgU2VuZCBiZWFjb24gdGVtcGxhdGUgUmVzcG9uc2UqLworICBXRElfU05EX0JDT05fUkVTUCA9IDI5LAorCisgIC8qV0xBTiBEQUwgVXBkYXRlIFByb2JlIFJlc3BvbnNlIFRlbXBsYXRlIFJlc3BvbnNlKi8KKyAgV0RJX1VQRF9QUk9CRV9SU1BfVEVNUExBVEVfUkVTUCA9IDMwLAorCisgIC8qV0xBTiBEQUwgU2V0IFNUQSBLZXkgUmVzcG9uc2UqLyAKKyAgV0RJX1NFVF9TVEFfQkNBU1RfS0VZX1JFU1AgICAgICA9IDMxLAorICAKKyAgLypXTEFOIERBTCBSZW1vdmUgU1RBIEtleSBSZXNwb25zZSovIAorICBXRElfUk1WX1NUQV9CQ0FTVF9LRVlfUkVTUCAgICAgID0gMzIsIAorCisgIC8qV0xBTiBEQUwgU2V0IE1heCBUeCBQb3dlciBSZXNwb25zZSovCisgIFdESV9TRVRfTUFYX1RYX1BPV0VSX1JFU1AgICAgICAgPSAzMywKKworICAvKldMQU4gREFMIEVudGVyIElNUFMgUmVzcG9uc2UqLyAKKyAgV0RJX0VOVEVSX0lNUFNfUkVTUCAgICAgPSAzNCwgCisKKyAgLypXTEFOIERBTCBFeGl0IElNUFMgUmVzcG9uc2UqLyAKKyAgV0RJX0VYSVRfSU1QU19SRVNQICAgICAgPSAzNSwgCisKKyAgLypXTEFOIERBTCBFbnRlciBCTVBTIFJlc3BvbnNlKi8gCisgIFdESV9FTlRFUl9CTVBTX1JFU1AgICAgPSAzNiwgCisKKyAgLypXTEFOIERBTCBFeGl0IEJNUFMgUmVzcG9uc2UqLyAKKyAgV0RJX0VYSVRfQk1QU19SRVNQICAgICAgPSAzNywgCisKKyAgLypXTEFOIERBTCBFbnRlciBVQVBTRCBSZXNwb25zZSovIAorICBXRElfRU5URVJfVUFQU0RfUkVTUCAgICA9IDM4LCAKKworICAvKldMQU4gREFMIEV4aXQgVUFQU0QgUmVzcG9uc2UqLyAKKyAgV0RJX0VYSVRfVUFQU0RfUkVTUCAgICAgPSAzOSwgCisKKyAgLypXTEFOIERBTCBTZXQgVUFQU0QgUGFyYW0gUmVzcG9uc2UqLyAgCisgIFdESV9TRVRfVUFQU0RfUEFSQU1fUkVTUCA9IDQwLCAKKworICAvKldMQU4gREFMIFVwZGF0ZSBVQVBTRCBQYXJhbSAoU29mdEFQIG1vZGUpIFJlc3BvbnNlKi8KKyAgV0RJX1VQREFURV9VQVBTRF9QQVJBTV9SRVNQID0gNDEsIAorCisgIC8qV0xBTiBEQUwgQ29uZmlndXJlIFJYUCBmaWx0ZXIgUmVzcG9uc2UqLworICBXRElfQ09ORklHVVJFX1JYUF9GSUxURVJfUkVTUCA9IDQyLCAKKworICAvKldMQU4gREFMIFNldCBCZWFjb24gZmlsdGVyIFJlc3BvbnNlKi8KKyAgV0RJX1NFVF9CRUFDT05fRklMVEVSX1JFU1AgPSA0MywgCisKKyAgLypXTEFOIERBTCBSZW1vdmUgQmVhY29uIGZpbHRlciBSZXNwb25zZSovCisgIFdESV9SRU1fQkVBQ09OX0ZJTFRFUl9SRVNQID0gNDQsIAorCisgIC8qV0xBTiBEQUwgU2V0IFJTU0kgdGhyZXNob2xkcyBSZXNwb25zZSovCisgIFdESV9TRVRfUlNTSV9USFJFU0hPTERTX1JFU1AgPSA0NSwgCisKKyAgLypXTEFOIERBTCBTZXQgUlNTSSB0aHJlc2hvbGRzIFJlc3BvbnNlKi8KKyAgV0RJX0hPU1RfT0ZGTE9BRF9SRVNQID0gNDYsIAorCisgIC8qV0xBTiBEQUwgYWRkIHdvd2wgYmMgcHRybiBSZXNwb25zZSovCisgIFdESV9XT1dMX0FERF9CQ19QVFJOX1JFU1AgPSA0NywgCisKKyAgLypXTEFOIERBTCBkZWxldGUgd293bCBiYyBwdHJuIFJlc3BvbnNlKi8KKyAgV0RJX1dPV0xfREVMX0JDX1BUUk5fUkVTUCA9IDQ4LCAKKworICAvKldMQU4gREFMIGVudGVyIHdvd2wgUmVzcG9uc2UqLworICBXRElfV09XTF9FTlRFUl9SRVNQID0gNDksIAorCisgIC8qV0xBTiBEQUwgZXhpdCB3b3dsIFJlc3BvbnNlKi8KKyAgV0RJX1dPV0xfRVhJVF9SRVNQID0gNTAsIAorCisgIC8qV0xBTiBEQUwgQ29uZmlndXJlIEFwcHMgQ1BVIFdha2V1cCBzdGF0ZSBSZXNwb25zZSovCisgIFdESV9DT05GSUdVUkVfQVBQU19DUFVfV0FLRVVQX1NUQVRFX1JFU1AgPSA1MSwKKyAgCisgIC8qIFdMQU4gTlYgRG93bmxvYWQgcmVzcG9uY2UgKi8KKyAgV0RJX05WX0RPV05MT0FEX1JFU1AgPSA1MiwKKworICAvKldMQU4gREFMIEZsdXNoIEFDIFJlc3BvbnNlKi8gCisgIFdESV9GTFVTSF9BQ19SRVNQICAgICAgPSA1MywKKworICAvKldMQU4gREFMIEZsdXNoIEFDIFJlc3BvbnNlKi8gCisgIFdESV9CVEFNUF9FVkVOVF9SRVNQICAgPSA1NCwKKworICAvKldMQU4gREFMIEFkZCBBZ2dyZWdhdGVkIFRTcGVjIFJlc3BvbnNlKi8KKyAgV0RJX0FHR1JfQUREX1RTX1JFU1AgID0gNTUsCisKKyAgLypBZGQgU2VsZiBTVEEgUmVzcG9uc2UqLworICBXRElfQUREX1NUQV9TRUxGX1JFU1AgPSA1NiwKKyAgCisgIC8qRGVsZXRlIFNlbGYgU1RBIFJlc3BvbnNlKi8KKyAgV0RJX0RFTF9TVEFfU0VMRl9SRVNQICAgICAgID0gNTcsCisKKyAgLypXTEFOIFNUQVJUIElOTkFWIE1FQVMgUmVzcG9uc2UqLworICBXRElfU1RBUlRfSU5OQVZfTUVBU19SRVNQICAgPSA1OCwKKworICAvKiBXTEFOIGhvc3QgcmVzdW1lIHJlcXVlc3QgKi8KKyAgV0RJX0hPU1RfUkVTVU1FX1JFU1AgICAgICAgID0gNTksCisKKyAgLyogV0xBTiBEQUwgUDJQIEdPIE5vdGljZSBPZiBBYnNlbmNlIFJlc3BvbnNlICovCisgIFdESV9QMlBfR09fTk9USUNFX09GX0FCU0VOQ0VfUkVTUCAgICA9IDYwLAorCisgIC8qIEZUTSBSZXNwb25zZSBmcm9tIEhBTCAqLworICBXRElfRlRNX0NNRF9SRVNQICAgICAgICAgICAgICAgICAgICAgPSA2MSwKKworICAvKktlZXAgYWxpdmUgcmVzcG9uc2UgKi8KKyAgV0RJX0tFRVBfQUxJVkVfUkVTUCAgICAgICAgICAgICAgICAgID0gNjIsCisKKyAgLyogU2V0IFBOTyBSZXNwb25zZSAqLworICBXRElfU0VUX1BSRUZfTkVUV09SS19SRVNQICAgICAgICAgICAgPSA2MywKKworICAvKiBTZXQgUlNTSSBGaWx0ZXIgUmVzcG9uc2UgKi8KKyAgV0RJX1NFVF9SU1NJX0ZJTFRFUl9SRVNQICAgICAgICAgICAgID0gNjQsCisKKyAgLyogVXBkYXRlIFNjYW4gUGFyYW1ldGVycyBSZXNwICovCisgIFdESV9VUERBVEVfU0NBTl9QQVJBTVNfUkVTUCAgICAgICAgICA9IDY1LAorCisgIC8vVHggUEVSIFRyYWNraW5nCisgIFdESV9TRVRfVFhfUEVSX1RSQUNLSU5HX1JFU1AgICAgICAgPSA2NiwKKworCisgIAorICAvKiBQYWNrZXQgRmlsdGVyaW5nIFJlc3BvbnNlICovCisgIFdESV84MDIzX01VTFRJQ0FTVF9MSVNUX1JFU1AgICAgICAgICAgICAgICAgICA9IDY3LAorCisgIFdESV9SRUNFSVZFX0ZJTFRFUl9TRVRfRklMVEVSX1JFU1AgICAgICAgICAgICA9IDY4LAorCisgIFdESV9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUkVTUCA9IDY5LAorCisgIFdESV9SRUNFSVZFX0ZJTFRFUl9DTEVBUl9GSUxURVJfUkVTUCAgICAgICAgICA9IDcwLAorCisgIAorICAvKiBXTEFOIEhBTCBEVU1QIENvbW1hbmQgUmVzcG9uc2UgKi8KKyAgV0RJX0hBTF9EVU1QX0NNRF9SRVNQICAgICAgICAgICAgICAgICAgICAgICAgID0gNzEsCisKKyAgLyogV0xBTiBTaHV0ZG93biBSZXNwb25zZSAqLworICBXRElfU0hVVERPV05fUkVTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MiwKKworICAvKlNldCBwb3dlciBwYXJhbWV0ZXJzIHJlc3BvbnNlICovCisgIFdESV9TRVRfUE9XRVJfUEFSQU1TX1JFU1AgICAgICAgICAgICAgICAgICAgICA9IDczLAorCisgIFdESV9UU01fU1RBVFNfUkVTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0LAorICAvKiBHVEsgUmVrZXkgT2ZmbG9hZCAqLworICBXRElfR1RLX09GRkxPQURfUkVTUCAgICAgICAgICAgICAgICAgICAgPSA3NSwgCisgIFdESV9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JFU1AgICAgICAgICA9IDc2LCAKKworICBXRElfU0VUX1RNX0xFVkVMX1JFU1AgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NywKKworICAvKiBGVyBzZW5kcyBpdHMgY2FwYWJpbGl0eSBiaXRtYXAgYXMgYSByZXNwb25zZSAqLworICBXRElfRkVBVFVSRV9DQVBTX0VYQ0hBTkdFX1JFU1AgICAgICAgICAgICAgICAgPSA3OCwKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJbmRpY2F0aW9ucworICAgICAhISBLZWVwIHRoZXNlIGxhc3QgaW4gdGhlIGVudW0gaWYgcG9zc2libGUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgV0RJX0hBTF9JTkRfTUlOICAgICAgICAgICAgICAgICAgICAgLCAKKyAgLypXaGVuIFJTU0kgbW9uaXRvcmluZyBpcyBlbmFibGVkIG9mIHRoZSBMb3dlciBNQUMgYW5kIGEgdGhyZXNob2xkIGhhcyBiZWVuCisgICAgcGFzc2VkLiAqLworICBXRElfSEFMX1JTU0lfTk9USUZJQ0FUSU9OX0lORCAgICAgICA9IFdESV9IQUxfSU5EX01JTiwgCisKKyAgLypMaW5rIGxvc3MgaW4gdGhlIGxvdyBNQUMgKi8KKyAgV0RJX0hBTF9NSVNTRURfQkVBQ09OX0lORCAgICAgICAgICAgPSBXRElfSEFMX0lORF9NSU4gKyAxLAorCisgIC8qV2hlbiBoYXJkd2FyZSBoYXMgc2lnbmFsZWQgYW4gdW5rbm93biBhZGRyMiBmcmFtZXMuIFRoZSBpbmRpY2F0aW9uIHdpbGwKKyAgY29udGFpbiBpbmZvIGZyb20gZnJhbWVzIHRvIGJlIHBhc3NlZCB0byB0aGUgVU1BQywgdGhpcyBtYXkgdXNlIHRoaXMgaW5mbyB0bworICBkZWF1dGggdGhlIFNUQSovCisgIFdESV9IQUxfVU5LTk9XTl9BRERSMl9GUkFNRV9SWF9JTkQgID0gV0RJX0hBTF9JTkRfTUlOICsgMiwKKworICAvKk1JQyBGYWlsdXJlIGRldGVjdGVkIGJ5IEhXKi8KKyAgV0RJX0hBTF9NSUNfRkFJTFVSRV9JTkQgICAgICAgICAgICAgPSBXRElfSEFMX0lORF9NSU4gKyAzLAorCisgIC8qRmF0YWwgRXJyb3IgSW5kKi8KKyAgV0RJX0hBTF9GQVRBTF9FUlJPUl9JTkQgICAgICAgICAgICAgPSBXRElfSEFMX0lORF9NSU4gKyA0LCAKKworICAvKlJlY2VpdmVkIHdoZW4gdGhlIFJJVkEgU1cgZGVjaWRlcyB0byBhdXRvbm9tb3VzbHkgZGVsZXRlIGFuIGFzc29jaWF0ZQorICAgIHN0YXRpb24gKGUuZy4gU29mdCBBUCBUSU0gYmFzZWQgZGlzc2Fzc29jKSAqLworICBXRElfSEFMX0RFTF9TVEFfSU5EICAgICAgICAgICAgICAgICA9IFdESV9IQUxfSU5EX01JTiArIDUsCisKKyAgLypDb2V4IGluZGljYXRpb24qLworICBXRElfSEFMX0NPRVhfSU5EICAgICAgICAgICAgICAgICAgICA9IFdESV9IQUxfSU5EX01JTiArIDYsCisKKyAgLyogVHggQ29tcGxldGUgSW5kaWNhdGlvbiAqLworICBXRElfSEFMX1RYX0NPTVBMRVRFX0lORCAgICAgICAgICAgICA9IFdESV9IQUxfSU5EX01JTiArIDcsCisKKyAgV0RJX0hBTF9QMlBfTk9BX0FUVFJfSU5EICAgICAgICAgICAgPSBXRElfSEFMX0lORF9NSU4gKyA4LAorCisgIC8qIFByZWZlcnJlZCBOZXR3b3JrIEZvdW5kIEluZGljYXRpb24gKi8KKyAgV0RJX0hBTF9QUkVGX05FVFdPUktfRk9VTkRfSU5EICAgICAgPSBXRElfSEFMX0lORF9NSU4gKyA5LAorCisgIC8qIFdha2V1cCBSZWFzb24gSW5kaWNhdGlvbiAqLworICBXRElfSEFMX1dBS0VfUkVBU09OX0lORCAgICAgICAgICAgICAgPSBXRElfSEFMX0lORF9NSU4gKyAxMCwKKworICAvKiBUeCBQRVIgSGl0IEluZGljYXRpb24gKi8KKyAgV0RJX0hBTF9UWF9QRVJfSElUX0lORCAgICAgICAgICAgICAgPSBXRElfSEFMX0lORF9NSU4gKyAxMSwKKyAgCisgIFdESV9NQVhfUkVTUAorfVdESV9SZXNwb25zZUVudW1UeXBlOyAKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIC8qRmxhZyB0aGF0IG1hcmtzIGEgc2Vzc2lvbiBhcyBiZWluZyBpbiB1c2UqLworICB3cHRfYm9vbGVhbiAgICAgICAgIGJJblVzZTsgCisKKyAgLypGbGFnIHRoYXQga2VlcHMgdHJhY2sgaWYgYSBzZXJpZXMgb2YgYXNzb2MgcmVxdWVzdHMgZm9yIHRoaXMgQlNTIGFyZQorICAgIGN1cnJlbnRseSBwZW5kaW5nIGluIHRoZSBxdWV1ZSBvciBwcm9jZXNzZWQKKyAgICAtIHRoZSBmbGFnIGlzIHNldCB0byB0cnVlIHdoZW4gdGhlIEpvaW4gcmVxdWVzdCBlbmRzIHVwIGJlaW5nIHF1ZXVlZAorICAgIC0gYW5kIHJlc2V0IHRvIGZhbHNlIHdoZW4gdGhlIFBlbmRpbmcgcXVldWUgaXMgZW1wdHkgKi8KKyAgd3B0X2Jvb2xlYW4gICAgICAgICBiQXNzb2NSZXFRdWV1ZWQ7CisKKyAgLypCU1NJRCBvZiB0aGUgc2Vzc2lvbiovCisgIHdwdF9tYWNBZGRyICAgICAgICAgbWFjQlNTSUQ7IAorCisgIC8qQlNTIEluZGV4IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJTU0lEKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICB1Y0JTU0lkeDsgCisKKyAgLypBc3NvY2lhdGVkIHN0YXRlIG9mIHRoZSBjdXJyZW50IEJTUyovCisgIFdESV9Bc3NvY1N0YXRlVHlwZSAgd2RpQXNzb2NTdGF0ZTsKKworICAvKldESSBQZW5kaW5nIFJlcXVlc3QgUXVldWUqLworICB3cHRfbGlzdCAgICAgICAgICAgIHdwdFBlbmRpbmdRdWV1ZTsKKworICAvKkRQVSBJbmZvcm1hdGlvbiBmb3IgdGhpcyBCU1MqLworICB3cHRfdWludDggICAgICAgICAgIGJjYXN0RHB1SW5kZXg7CisgIHdwdF91aW50OCAgICAgICAgICAgYmNhc3REcHVTaWduYXR1cmU7CisgIHdwdF91aW50OCAgICAgICAgICAgYmNhc3RNZ210RHB1SW5kZXg7CisgIHdwdF91aW50OCAgICAgICAgICAgYmNhc3RNZ210RHB1U2lnbmF0dXJlOworCisgIC8qUk1GIGVuYWJsZWQvZGlzYWJsZWQqLworICB3cHRfdWludDggICAgICAgICAgIHVjUm1mRW5hYmxlZDsKKworICAvKkJjYXN0IFNUQSBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBCU1Mgc2Vzc2lvbiAqLworICB3cHRfdWludDggICAgICAgICAgIGJjYXN0U3RhSWR4OworCisgIC8qVGhlIHR5cGUgb2YgdGhlIEJTUyBpbiB0aGUgc2Vzc2lvbiAqLworICBXRElfQnNzVHlwZSAgICAgICAgIHdkaUJzc1R5cGU7Cit9V0RJX0JTU1Nlc3Npb25UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfQ29uZmlnQlNTUnNwSW5mb1R5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIFdQVF9QQUNLX1BSRSBzdHJ1Y3QgCit7CisgIC8qQlNTIGluZGV4IGFsbG9jYXRlZCBieSBIQUwqLworICB3cHRfdWludDggICAgdWNCU1NJZHg7CisKKyAgLypCU1NJRCBvZiB0aGUgQlNTKi8KKyAgd3B0X21hY0FkZHIgIG1hY0JTU0lEOyAKKworICAvKkJyb2FkY2FzdCBEUFUgZGVzY3JpcHRvciBpbmRleCBhbGxvY2F0ZWQgYnkgSEFMIGFuZCB1c2VkIGZvcgorICBicm9hZGNhc3QvbXVsdGljYXN0IHBhY2tldHMuKi8KKyAgd3B0X3VpbnQ4ICAgIHVjQmNhc3REcHVEZXNjSW5keDsKKworICAvKkRQVSBzaWduYXR1cmUgdG8gYmUgdXNlZCBmb3IgYnJvYWRjYXN0L211bHRpY2FzdCBwYWNrZXRzKi8KKyAgd3B0X3VpbnQ4ICAgIHVjQmNhc3REcHVTaWduYXR1cmU7CisgIAorICAvKkRQVSBkZXNjcmlwdG9yIGluZGV4IGFsbG9jYXRlZCBieSBIQUwsIHVzZWQgZm9yIGJjYXN0L21jYXN0IG1hbmFnZW1lbnQKKyAgcGFja2V0cyovCisgIHdwdF91aW50OCAgICB1Y01nbXREcHVEZXNjSW5keDsKKworICAvKkRQVSBzaWduYXR1cmUgdG8gYmUgdXNlZCBmb3IgYmNhc3QvbWNhc3QgbWFuYWdlbWVudCBwYWNrZXRzKi8KKyAgd3B0X3VpbnQ4ICAgIHVjTWdtdERwdVNpZ25hdHVyZTsKKworICAvKlN0YXR1cyBvZiB0aGUgcmVxdWVzdCByZWNlaXZlZCBmcm9tIEhBTCAqLworICBlSGFsU3RhdHVzICAgaGFsU3RhdHVzOworfVdQVF9QQUNLX1BPU1QgV0RJX0NvbmZpZ0JTU1JzcEluZm9UeXBlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9Qb3N0QXNzb2NSc3BJbmZvVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgV1BUX1BBQ0tfUFJFIHN0cnVjdAoreworICAvKlNUQSBJbmRleCBhbGxvY2F0ZWQgYnkgSEFMLiovCisgIHdwdF91aW50MTYgICB1c1NUQUlkeDsKKyAgCisgIC8qTUFDIEFkZHJlc3Mgb2YgU1RBKi8gCisgIHdwdF9tYWNBZGRyICBtYWNTVEE7CisgIAorICAvKlVuaWNhc3QgRFBVIHNpZ25hdHVyZSovCisgIHdwdF91aW50OCAgICB1Y1VjYXN0U2lnOworCisgIC8qQnJvYWRjYXN0IERQVSBTaWduYXR1cmUqLworICB3cHRfdWludDggICAgdWNCY2FzdFNpZzsKKworICAvKkJTU0lEIG9mIHRoZSBCU1MqLworICB3cHRfbWFjQWRkciAgbWFjQlNTSUQ7IAorCisgIC8qSEFMIFN0YXR1cyAqLworICBlSGFsU3RhdHVzICAgaGFsU3RhdHVzOworfVdQVF9QQUNLX1BPU1QgV0RJX1Bvc3RBc3NvY1JzcEluZm9UeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgIFdMQU4gREFMIEZTTSBFdmVudCBJbmZvIFR5cGUgCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qRXZlbnRzIGNhbiBiZSBsaW5rZWQgaW4gYSBsaXN0IC0gcHV0IGEgbm9kZSBpbiBmcm9udCBmb3IgdGhhdCwgaXQgd2lsbCBiZQorICAgdXNlZCBieSB3cHQgdG8gbGluayB0aGVtKi8KKyAgd3B0X2xpc3Rfbm9kZSAgICAgICAgICB3cHRMaXN0Tm9kZTsgCisKKyAgLypSZXF1ZXN0IFJlY2VpdmVkICovCisgIFdESV9SZXF1ZXN0RW51bVR5cGUgICAgd2RpUmVxdWVzdDsKKworICAvKlJlc3BvbnNlIFJlY2VpdmVkICovCisgIFdESV9SZXNwb25zZUVudW1UeXBlICAgd2RpUmVzcG9uc2U7CisKKyAgLypEYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdCAqLworICB2b2lkKiAgICAgICAgICAgICAgICAgIHBFdmVudERhdGE7CisKKyAgLypEYXRhIFNpemUqLworICB3cHRfdWludDMyICAgICAgICAgICAgIHVFdmVudERhdGFTaXplOworCisgIC8qQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHJlY2VpdmluZyB0aGUgcmVzcG9uc2UgdG8gdGhlIGV2ZW50Ki8KKyAgdm9pZCogICAgICAgICAgICAgICAgICBwQ0JmbmM7CisKKyAgLypVc2VyIGRhdGEgdG8gYmUgc2VudCBhbG9uZyB3aXRoIHRoZSBDQiBmdW5jdGlvbiBjYWxsKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICBwVXNlckRhdGE7Cit9V0RJX0V2ZW50SW5mb1R5cGU7IAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgIFdMQU4gREFMIFNlc3Npb24gSW5kZXggVHlwZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAvKkV2ZW50cyBjYW4gYmUgbGlua2VkIGluIGEgbGlzdCAtIHB1dCBhIG5vZGUgaW4gZnJvbnQgZm9yIHRoYXQsIGl0IHdpbGwgYmUKKyAgIHVzZWQgYnkgd3B0IHRvIGxpbmsgdGhlbSovCisgIHdwdF9saXN0X25vZGUgICAgICAgICAgd3B0TGlzdE5vZGU7IAorCisgIC8qU2Vzc2lvbiBpZCBmb3IgdGhlIG5ldyBhc3NvY2lhdGlvbiB0byBiZSBwcm9jZXNzZWQqLworICB3cHRfdWludDggICAgICAgICAgICAgIHVjSW5kZXg7IAorCit9V0RJX05leHRTZXNzaW9uSWRUeXBlOyAKKworI2RlZmluZSBXRElfQ09OVFJPTF9CTE9DS19NQUdJQyAgMHg2NzczNjg4NyAgLyogV0RJQyBpbiBsaXR0bGUgZW5kaWFuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgIFdMQU4gREFMIENvbnRyb2wgQmxvY2sgVHlwZSAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyptYWdpYyBudW1iZXIgc28gY2FsbGJhY2tzIGNhbiB2YWxpZGF0ZSB0aGVpciBjb250ZXh0IHBvaW50ZXJzKi8KKyAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgIG1hZ2ljOworCisgIC8qUHRyIHRvIHRoZSBPUyBDb250ZXh0IHJlY2VpdmVkIGZyb20gdGhlIFVNQUMqLworICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcE9TQ29udGV4dDsKKworICAvKlB0ciB0byB0aGUgUEFMIENvbnRleHQgcmVjZWl2ZWQgZnJvbSBQQUwqLworICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcFBBTENvbnRleHQ7IAorCisgIC8qUHRyIHRvIHRoZSBEYXRhcGF0aCBDb250ZXh0IHJlY2VpdmVkIGZyb20gUEFMKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBEUENvbnRleHQ7IAorCisgIC8qUHRyIHRvIHRoZSBEYXRhcGF0aCBUcmFuc3BvcnQgRHJpdmVyIENvbnRleHQgcmVjZWl2ZWQgZnJvbSBQQUwqLworICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcERURHJpdmVyQ29udGV4dDsgCisKKyAgLypIYW5sZGUgdG8gdGhlIGNvbnRyb2wgdHJhbnNwb3J0IHNlcnZpY2UqLworICBXQ1RTX0hhbmRsZVR5cGUgICAgICAgICAgICAgd2N0c0hhbmRsZTsKKworICAvKkZsYWcgdGhhdCBrZWVwcyB0cmFjayBpZiBDVCBpcyBPcGVuZWQgb3Igbm90Ki8KKyAgd3B0X2Jvb2xlYW4gICAgICAgICAgICAgICAgIGJDVE9wZW5lZDsKKworICAvKlRoZSBnbG9iYWwgc3RhdGUgb2YgdGhlIERBTCBDb250cm9sIFBhdGgqLworICBXRElfTWFpblN0YXRlVHlwZSAgICAgICAgICAgdUdsb2JhbFN0YXRlOyAKKworICAvKkZsYWcgdG8ga2VlcCB0cmFjayBvZiB0aGUgZXhwZWN0ZWQgc3RhdGUgdHJhbnNpdGlvbiBhZnRlciBwcm9jZXNzaW5nCisgICAgb2YgYSByZXNwb25zZSAqLworICBXRElfTWFpblN0YXRlVHlwZSAgICAgICAgICAgdWNFeHBlY3RlZFN0YXRlVHJhbnNpdGlvbjsKKworICAvKk1haW4gU3luY2hyb25pemF0aW9uIE9iamVjdCBmb3IgdGhlIFdESSBDQiovCisgIHdwdF9tdXRleCAgICAgICAgICAgICAgICAgICB3cHRNdXRleDsKKworICAvKldESSByZXNwb25zZSB0aW1lciovCisgIHdwdF90aW1lciAgICAgICAgICAgICAgICAgICB3cHRSZXNwb25zZVRpbWVyOworCisgIC8qV0RJIFBlbmRpbmcgUmVxdWVzdCBRdWV1ZSovCisgIHdwdF9saXN0ICAgICAgICAgICAgICAgICAgICB3cHRQZW5kaW5nUXVldWU7CisjaWYgMAorICAvKlRoZSBzdGF0ZSBvZiB0aGUgREFMIGR1cmluZyBhIHNjYW5uaW5nIHByb2NlZHVyZSovCisgIFdESV9TY2FuU3RhdGVUeXBlICAgICAgICAgICB1U2NhblN0YXRlOyAgCisKKyAgLypGbGFnIHRoYXQga2VlcHMgdHJhY2sgaWYgYSBTY2FuIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyovCisgIHdwdF9ib29sZWFuICAgICAgICAgICAgICAgICBiU2NhbkluUHJvZ3Jlc3M7CisjZW5kaWYKKyAgLypGbGFnIHRoYXQga2VlcHMgdHJhY2sgaWYgYW4gQXNzb2NpYXRpb24gaXMgY3VycmVudGx5IGluIHByb2dyZXNzKi8KKyAgd3B0X2Jvb2xlYW4gICAgICAgICAgICAgICAgIGJBc3NvY2lhdGlvbkluUHJvZ3Jlc3M7IAorCisgIC8qQXJyYXkgb2Ygc2ltdWx0YW5lb3VzIEJTUyBTZXNzaW9ucyovCisgIFdESV9CU1NTZXNzaW9uVHlwZSAgICAgICAgICBhQlNTU2Vzc2lvbnNbV0RJX01BWF9CU1NfU0VTU0lPTlNdOworCisgIC8qV0RJIFBlbmRpbmcgQXNzb2NpYXRpb24gU2Vzc2lvbiBJZCBRdWV1ZSAtIGl0IGtlZXBzIHRyYWNrIG9mIHRoZQorICAgIG9yZGVyIGluIHdoaWNoIHF1ZXVlZCBhc3NvYyByZXF1ZXN0cyBjYW1lIGluKi8KKyAgd3B0X2xpc3QgICAgICAgICAgICAgICAgICAgIHdwdFBlbmRpbmdBc3NvY1Nlc3Npb25JZFF1ZXVlOworCisgIC8qISBUTyBETyA6IC0gZ3JvdXAgdGhlc2UgaW4gYSB1bmlvbiwgb25seSBvbmUgY2FjaGVkIHJlcSBjYW4gZXhpc3QgYXQgYQorICAgICAgdGltZSAgKi8KKworICAvKkNhY2hlZCBwb3N0IGFzc29jIHJlcXVlc3QgLSB0aGVyZSBjYW4gb25seSBiZSBvbmUgaW4gdGhlIHN5c3RlbSBhcworICAgIG9ubHkgb25lIHJlcXVlc3QgZ29lcyBkb3duIHRvIGhhbCB1cCB1bnRpbCBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkCisgICAgVGhlIHZhbHVlcyBjYWNoZWQgYXJlIHVzZWQgb24gcmVzcG9uc2UgdG8gc2F2ZSBhIHN0YXRpb24gaWYgbmVlZGVkICovCisgIFdESV9Qb3N0QXNzb2NSZXFQYXJhbXNUeXBlICB3ZGlDYWNoZWRQb3N0QXNzb2NSZXE7IAorCisgIC8qQ2FjaGVkIGNvbmZpZyBzdGEgcmVxdWVzdCAtIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBpbiB0aGUgc3lzdGVtIGFzCisgICAgb25seSBvbmUgcmVxdWVzdCBnb2VzIGRvd24gdG8gaGFsIHVwIHVudGlsIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQKKyAgICBUaGUgdmFsdWVzIGNhY2hlZCBhcmUgdXNlZCBvbiByZXNwb25zZSB0byBzYXZlIGEgc3RhdGlvbiBpZiBuZWVkZWQgKi8KKyAgV0RJX0NvbmZpZ1NUQVJlcVBhcmFtc1R5cGUgIHdkaUNhY2hlZENvbmZpZ1N0YVJlcTsgCisKKyAgLypDYWNoZWQgY29uZmlnIHN0YSByZXF1ZXN0IC0gdGhlcmUgY2FuIG9ubHkgYmUgb25lIGluIHRoZSBzeXN0ZW0gYXMKKyAgICBvbmx5IG9uZSByZXF1ZXN0IGdvZXMgZG93biB0byBoYWwgdXAgdW50aWwgYSByZXNwb25zZSBpcyByZWNlaXZlZAorICAgIFRoZSB2YWx1ZXMgY2FjaGVkIGFyZSB1c2VkIG9uIHJlc3BvbnNlIHRvIHNhdmUgYSBCU1MgaWYgbmVlZGVkICovCisgIFdESV9Db25maWdCU1NSZXFQYXJhbXNUeXBlICB3ZGlDYWNoZWRDb25maWdCc3NSZXE7IAorCisgIC8qQ2FjaGVkIHNldCBsaW5rIHN0YXRlIHJlcXVlc3QgLSB0aGVyZSBjYW4gb25seSBiZSBvbmUgaW4gdGhlIHN5c3RlbSBhcworICAgIG9ubHkgb25lIHJlcXVlc3QgZ29lcyBkb3duIHRvIGhhbCB1cCB1bnRpbCBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkCisgICAgVGhlIHZhbHVlcyBjYWNoZWQgYXJlIHVzZWQgb24gcmVzcG9uc2UgdG8gZGVsZXRlIGEgQlNTIGlmIG5lZWRlZCAqLworICBXRElfU2V0TGlua1JlcVBhcmFtc1R5cGUgICAgIHdkaUNhY2hlU2V0TGlua1N0UmVxOyAKKworICAvKkNhY2hlZCBhZGQgU1RBIHNlbGYgcmVxdWVzdCAtIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBpbiB0aGUgc3lzdGVtIGFzCisgICAgb25seSBvbmUgcmVxdWVzdCBnb2VzIGRvd24gdG8gaGFsIHVwIHVudGlsIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQKKyAgICBUaGUgdmFsdWVzIGNhY2hlZCBhcmUgdXNlZCBvbiByZXNwb25zZSB0byBzYXZlIHRoZSBzZWxmIFNUQSBpbiB0aGUgdGFibGUgKi8KKyAgV0RJX0FkZFNUQVNlbGZSZXFQYXJhbXNUeXBlICB3ZGlDYWNoZUFkZFNUQVNlbGZSZXE7CisKKyAgLypDdXJyZW50IHNlc3Npb24gYmVpbmcgaGFuZGxlZCovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICB1Y0N1cnJlbnRCU1NTZXNJZHg7CisKKyAgLypQb2ludGVyIHRvIHRoZSByZXNwb25zZSBDQiBvZiB0aGUgcGVuZGluZyByZXF1ZXN0Ki8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBmbmNSc3BDQjsKKworICAvKlBvaW50ZXIgdG8gdGhlIHVzZXIgZGF0YSB0byBiZSBzZW50IGFsb25nIHdpdGggdGhlIHJlc3BvbnNlIENCKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBSc3BDQlVzZXJEYXRhOyAKKworICAvKlRoZSBleHBlY3RlZCByZXNwb25zZSBmcm9tIEhBTCovCisgIFdESV9SZXNwb25zZUVudW1UeXBlICAgICAgICB3ZGlFeHBlY3RlZFJlc3BvbnNlOworCisgIC8qUmVxdWVzdCBzdGF0dXMgY2FsbGJhY2sgb2ZmZXJlZCBieSBVTUFDIC0gaXQgaXMgY2FsbGVkIGlmIHRoZSBjdXJyZW50CisgICAgcmVxIGhhcyByZXR1cm5lZCBQRU5ESU5HIGFzIHN0YXR1czsgaXQgZGVsaXZlcnMgdGhlIHN0YXR1cyBvZiBzZW5kaW5nCisgICAgdGhlIG1lc3NhZ2Ugb3ZlciB0aGUgQlVTICovCisgIFdESV9SZXFTdGF0dXNDYiAgICAgICAgICAgICB3ZGlSZXFTdGF0dXNDQjsgCisKKyAgLypUaGUgdXNlciBkYXRhIHBhc3NlZCBpbiBieSBVTUFDLCBpdCB3aWxsIGJlIHNlbnQgYmFjayB3aGVuIHRoZSBhYm92ZQorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBSZXFTdGF0dXNVc2VyRGF0YTsKKworICAgLypJbmRpY2F0aW9uIGNhbGxiYWNrIGdpdmVuIGJ5IFVNQUMgdG8gYmUgY2FsbGVkIGJ5IHRoZSBXTEFOIERBTCB3aGVuIGl0CisgICAgd2lzaGVzIHRvIHNlbmQgc29tZXRoaW5nIGJhY2sgaW5kZXBlbmRlbnQgb2YgYSByZXF1ZXN0Ki8KKyAgV0RJX0xvd0xldmVsSW5kQ0JUeXBlICAgICAgIHdkaUxvd0xldmVsSW5kQ0I7IAorCisgIC8qVGhlIHVzZXIgZGF0YSBwYXNzZWQgaW4gYnkgVU1BQywgaXQgd2lsbCBiZSBzZW50IGJhY2sgd2hlbiB0aGUgaW5kaWNhdGlvbgorICAgIGZ1bmN0aW9uIHBvaW50ZXIgd2lsbCBiZSBjYWxsZWQgKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBJbmRVc2VyRGF0YTsKKworICAvKkNhY2hlZCBzdGFydCByZXNwb25zZSBwYXJhbWV0ZXJzKi8KKyAgV0RJX1N0YXJ0UnNwUGFyYW1zVHlwZSAgICAgIHdkaUNhY2hlZFN0YXJ0UnNwUGFyYW1zOworICAKKyAgLyogSW5mb3JtYXRpb24gcmVsYXRlZCB0byBOViBJbWFnZSovCisgIFdESV9OdkJsb2JJbmZvUGFyYW1zICAgICAgICB3ZGlOdkJsb2JJbmZvOworCisgIC8qU1RBIFRhYmxlIEluZm9ybWF0aW9uKi8KKyAgLypNYXggbnVtYmVyIG9mIHN0YXRpb25zIGFsbG93ZWQgYnkgZGV2aWNlICovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICB1Y01heFN0YXRpb25zOworCisgIC8qTWF4IG51bWJlciBvZiBCU1NlcyBhbGxvd2VkIGJ5IGRldmljZSAqLworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgdWNNYXhCc3NpZHM7CisKKyAgLyogR2xvYmFsIEJTUyBhbmQgU1RBIHRhYmxlIC0gIE1lbW9yeSBpcyBhbGxvY2F0ZWQgd2hlbiBuZWVkZWQuKi8KKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHN0YVRhYmxlOworCisjaWZuZGVmIEhBTF9TRUxGX1NUQV9QRVJfQlNTCisgIC8qSW5kZXggb2YgdGhlIFNlbGYgU1RBICovCisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICB1Y1NlbGZTdGFJZDsKKworICAvKiBTZWxmIFNUQSBEUFUgSW5kZXggKi8KKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgIHVzU2VsZlN0YURwdUlkOworCisgIC8qU2VsZiBTVEEgTWFjKi8KKyAgd3B0X21hY0FkZHIgICAgICAgICAgICAgICAgIG1hY1NlbGZTdGE7CisjZW5kaWYKKworICAvKklzIGZyYW1lIHRyYW5zbGF0aW9uIGVuYWJsZWQgKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgIGJGcmFtZVRyYW5zRW5hYmxlZDsKKworICAvKkFNU0RVIEJEIEZpeCBNYXNrIC0gdXNlZCBieSB0aGUgRml4aW5nIHJvdXRpbmUgZm9yIERhdGEgUGF0aCAqLworICBXRElfUnhCZFR5cGUgICAgICAgICAgICAgICAgd2RpUnhBbXNkdUJkRml4TWFzazsKKworICAvKkZpcnN0IEFNU0RVIEJEIC0gdXNlZCBieSB0aGUgRml4aW5nIHJvdXRpbmUgZm9yIERhdGEgUGF0aCAqLworICBXRElfUnhCZFR5cGUgICAgICAgICAgICAgICAgd2RpUnhBbXNkdUZpcnN0QmRDYWNoZTsKKworICAvKlRoaXMgbXVzdCBiZSBpbmNyZW1lbnRlZCBvbiBzdGEgY2hhbmdlICovCisgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICB1QmRTaWdTZXJpYWxOdW07CisKKyAgLyogZHB1IHJvdXRpbmcgZmxhZworICAhIFRPIERPOiAtIG11c3QgYmUgc2V0L3Jlc2V0IHdoZW4gUFMgaXMgZW5hYmxlZCBmb3IgVUFQU0QgKi8gIAorICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgdWNEcHVSRjsgICAgCisgIC8qIEV2ZW50IHRvIHdhaXQgZm9yIHdoZW4gV0NUUyBpcyB0b2xkIHRvIHBlcmZvcm0gYW4gYWN0aW9uICovCisgIHdwdF9ldmVudCAgICAgICAgICAgICAgICAgICB3Y3RzQWN0aW9uRXZlbnQ7CisgIC8qIEV2ZW50IHRvIHdhaXQgZm9yIEFDSyBmcm9tIERYRSBhZnRlciB0aGUgcG93ZXIgc3RhdGUgaXMgc2V0ICovCisgIHdwdF9ldmVudCAgICAgICAgICAgICAgICAgICBzZXRQb3dlclN0YXRlRXZlbnQ7CisgIC8qIERYRSBwaHlzaWNhbCBhZGRyIHRvIGJlIHBhc3NlZCBkb3duIHRvIFJJVkEuIFJJVkEgSEFMIHdpbGwgdXNlIGl0IHRvIHByb2dyYW0KKyAgRFhFIHdoZW4gRFhFIHdha2VzIHVwIGZyb20gcG93ZXIgc2F2ZSovCisgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBkeGVQaHlBZGRyOworCisgIC8qTlYgZG93bmxvYWQgcmVxdWVzdCBwYXJhbWV0ZXJzICAqLworICBXRElfTnZEb3dubG9hZFJlcVBhcmFtc1R5cGUgICB3ZGlDYWNoZWROdkRvd25sb2FkUmVxOworCisgIC8qIERyaXZlciBUeXBlICovCisgIHREcml2ZXJUeXBlICAgICAgICAgICAgICAgICBkcml2ZXJNb2RlOyAgCisKKyNpZmRlZiBBTklfTUFORl9ESUFHCisgIC8qIFN0YXRpY2FsbHkgYWxsb2NhdGVkIEZUTSBSZXNwb25zZSBCdWZmZXIgKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgIHVjRlRNQ29tbWFuZFJzcEJ1ZmZlcltXRElfRlRNX01BWF9SRUNFSVZFX0JVRkZFUl07CisjZW5kaWYgLyogQU5JX01BTkZfRElBRyAqLworCisgIC8qRHJpdmVyIGluIEJNUFMgc3RhdGUqLworICB3cHRfYm9vbGVhbiAgICAgICAgICAgICAgICAgYkluQm1wczsKKworICAvKnZlcnNpb24gb2YgdGhlIFBOTyBpbXBsZW1lbnRhdGlvbiBpbiBSSVZBKi8KKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgIHdkaVBOT1ZlcnNpb247Cit9V0RJX0NvbnRyb2xCbG9ja1R5cGU7IAorCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIERFU0NSSVBUSU9OIAorICAgIFdMQU4gREFMIFJlcXVlc3QgUHJvY2Vzc2luZyBmdW5jdGlvbiBkZWZpbml0aW9uLiAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgSU4KKyAgIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorIAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgV0RJX1N0YXR1cyAoKldESV9SZXFQcm9jRnVuY1R5cGUpKCBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIERFU0NSSVBUSU9OIAorICAgIFdMQU4gREFMIFJlc3BvbnNlIFByb2Nlc3NpbmcgZnVuY3Rpb24gZGVmaW5pdGlvbi4gCisgICAgCisgIFBBUkFNRVRFUlMgCisKKyAgIElOCisgICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAKKyAgIAorICBSRVRVUk4gVkFMVUUKKyAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiAgCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIFdESV9TdGF0dXMgKCpXRElfUnNwUHJvY0Z1bmNUeXBlKSggV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YSk7CisKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgTUFJTiBEQUwgRlNNIERlZmluaXRpb25zIGFuZCBEZWNsYXJhdGlvbnMgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgREFMIENvbnRyb2wgUGF0aCBNYWluIEZTTSAgCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0RJX1NUQVRFX1RSQU5TSVRJT04oX3BjdHgsIF9zdCkgICAoX3BjdHgtPnVHbG9iYWxTdGF0ZSA9IF9zdCkKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERBTCBNYWluIEV2ZW50IHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgCit0eXBlZGVmIGVudW0KK3sKKyAgLyogU3RhcnQgcmVxdWVzdCByZWNlaXZlZCBmcm9tIFVNQUMgKi8KKyAgV0RJX1NUQVJUX0VWRU5UICAgICAgICAgID0gMCwKKworICAvKiBTdG9wIHJlcXVlc3QgcmVjZWl2ZWQgZnJvbSBVTUFDICovCisgIFdESV9TVE9QX0VWRU5UICAgICAgICAgICA9IDEsCisKKyAgLyogSEFMIHJlcXVlc3QgcmVjZWl2ZWQgZnJvbSBVTUFDKi8KKyAgV0RJX1JFUVVFU1RfRVZFTlQgICAgICAgID0gMiwKKworICAvKiBIQUwgUmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBkZXZpY2UgKi8KKyAgV0RJX1JFU1BPTlNFX0VWRU5UICAgICAgID0gMywKKworICAvKiBDbG9zZSByZXF1ZXN0IHJlY2VpdmVkIGZyb20gVU1BQyAqLworICBXRElfQ0xPU0VfRVZFTlQgICAgICAgICAgPSA0LAorCisgIC8qIFNodXRkb3duIHJlcXVlc3QgcmVjZWl2ZWQgZnJvbSBVTUFDICovCisgIFdESV9TSFVURE9XTl9FVkVOVCAgICAgICA9IDUsCisKKyAgV0RJX01BWF9FVkVOVAorCit9V0RJX01haW5FdmVudFR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgREVTQ1JJUFRJT04gCisgICAgTWFpbiBEQUwgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAKKyAgICAKKyAgUEFSQU1FVEVSUyAKKworICAgSU4KKyAgIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorIAorICAgCisgIFJFVFVSTiBWQUxVRQorICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uICAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgV0RJX1N0YXR1cyAoKldESV9NYWluRnVuY1R5cGUpKCBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTUFJTiBEQUwgRlNNIEVudHJ5IHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgCit0eXBlZGVmIHN0cnVjdAoreworICBXRElfTWFpbkZ1bmNUeXBlICBwZm5NYWluVGJsW1dESV9NQVhfRVZFTlRdOworfSBXRElfTWFpbkZzbUVudHJ5VHlwZTsKKworLypNYWNybyB0byBjaGVjayBmb3IgdmFsaWQgc2Vzc2lvbiBpZCovCisjZGVmaW5lIFdESV9WQUxJRF9TRVNTSU9OX0lEWChfaWR4KSAgKCBfaWR4IDwgV0RJX01BWF9CU1NfU0VTU0lPTlMgKSAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAKKyAgICAgICAgICAgICAgICAgICAgICBEQUwgSU5URVJOQUwgRlVOQ1RJT04gREVDTEFSQVRJT04KKyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8gCisKKy8qKgorIEBicmllZiBIZWxwZXIgcm91dGluZSBmb3IgcmV0cmlldmluZyB0aGUgUEFMIENvbnRleHQgZnJvbSBXREkgLSAKKyAgICAgICAgY2FuIGJlIHVzZWQgYnkgQ1RTLCBEVFMsIERYRSBhbmQgb3RoZSBEQUwgaW50ZXJuYWxzIAorIAorIEBwYXJhbSAgTm9uZQorICAKKyBAc2VlCisgQHJldHVybiBwb2ludGVyIHRvIHRoZSBjb250ZXh0IAorKi8KK1dQVF9JTkxJTkUgdm9pZCogV0RJX0dFVF9QQUxfQ1RYKCB2b2lkICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgIE1BSU4gREFMIEZTTSBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgCisvKioKKyBAYnJpZWYgV0RJX1Bvc3RNYWluRXZlbnQgLSBQb3N0cyBhbiBldmVudCB0byB0aGUgTWFpbiBGU00KKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgd2RpRVY6ICAgICAgICAgICBldmVudCBwb3N0ZWQgdG8gdGhlIG1haW4gREFMIEZTTQorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbgorICAgICAgICAgc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUG9zdE1haW5FdmVudAorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsIAorICBXRElfTWFpbkV2ZW50VHlwZSAgICAgIHdkaUVWLCAKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCisgIAorKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJTklUIFN0YXRlIEZ1bmN0aW9ucyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKgorIEBicmllZiBNYWluIEZTTSBTdGFydCBmdW5jdGlvbiBmb3IgYWxsIHN0YXRlcyBleGNlcHQgQlVTWQorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5TdGFydAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBNYWluIEZTTSBSZXNwb25zZSBmdW5jdGlvbiBmb3Igc3RhdGUgSU5JVAorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5Sc3BJbml0CisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIE1haW4gRlNNIENsb3NlIGZ1bmN0aW9uIGZvciBhbGwgc3RhdGVzIGV4Y2VwdCBCVVNZCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAgICAgICAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5DbG9zZQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU1RBUlRFRCBTdGF0ZSBGdW5jdGlvbnMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU3RhcnQgZnVuY3Rpb24gZm9yIHN0YXRlIFNUQVJURUQKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgICAgICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfTWFpblN0YXJ0U3RhcnRlZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBNYWluIEZTTSBTdG9wIGZ1bmN0aW9uIGZvciBzdGF0ZSBTVEFSVEVECisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAgICAgICAgdUV2ZW50RGF0YVNpemU6ICBzaXplIG9mIHRoZSBkYXRhIHNlbnQgaW4gZXZlbnQKKyAgICAgICAgIHBDQmZuYzogICAgICAgICAgY2IgZnVuY3Rpb24gZm9yIGV2ZW50IHJlc3BvbnNlCisgICAgICAgICBwVXNlckRhdGE6ICAgICAgIHVzZXIgZGF0YSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5TdG9wU3RhcnRlZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBNYWluIEZTTSBSZXF1ZXN0IGZ1bmN0aW9uIGZvciBzdGF0ZSBzdGFydGVkCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAgICAgICAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5SZXFTdGFydGVkCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIE1haW4gRlNNIFJlc3BvbnNlIGZ1bmN0aW9uIGZvciBhbGwgc3RhdGVzIGV4Y2VwdCBJTklUCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfTWFpblJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU1RPUFBFRCBTdGF0ZSBGdW5jdGlvbnMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU3RvcCBmdW5jdGlvbiBmb3Igc3RhdGUgU1RPUFBFRAorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5TdG9wU3RvcHBlZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyAgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBCVVNZIFN0YXRlIEZ1bmN0aW9ucyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKgorIEBicmllZiBNYWluIEZTTSBTdGFydCBmdW5jdGlvbiBmb3Igc3RhdGUgQlVTWQorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5TdGFydEJ1c3kKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU3RvcCBmdW5jdGlvbiBmb3Igc3RhdGUgQlVTWQorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5TdG9wQnVzeQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBNYWluIEZTTSBSZXF1ZXN0IGZ1bmN0aW9uIGZvciBzdGF0ZSBCVVNZCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfTWFpblJlcUJ1c3kKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgTWFpbiBGU00gQ2xvc2UgZnVuY3Rpb24gZm9yIHN0YXRlIEJVU1kKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9NYWluQ2xvc2VCdXN5CisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIE1haW4gRlNNIFNodXRkb3duIGZ1bmN0aW9uIGZvciBJTklUICYgU1RBUlRFRCBzdGF0ZXMKKworCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlCisKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfTWFpblNodXRkb3duCisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU2h1dGRvd24gZnVuY3Rpb24gZm9yIEJVU1kgc3RhdGUKKworCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlCisKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfTWFpblNodXRkb3duQnVzeQorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICBNYWluIERBTCBDb250cm9sIFBhdGggUmVxdWVzdCBQcm9jZXNzaW5nIEFQSSAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFN0YXJ0IFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNIAorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTdGFydFJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU3RvcCBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTSAKKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU3RvcFJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQ2xvc2UgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0Nsb3NlUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2h1dGRvd24gUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00KKyAgICAgICAgYWxsb3dzIGl0KQorCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlCisKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NodXRkb3duUmVxCisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEluaXQgU2NhbiBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTQorICAgICAgICBhbGxvd3MgaXQpCisKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKworIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzSW5pdFNjYW5SZXEKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU3RhcnQgU2NhbiBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIAorICAgICAgICBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKworIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU3RhcnRTY2FuUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBFbmQgU2NhbiBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTSAKKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRW5kU2NhblJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRmluaXNoIFNjYW4gUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiAKKyAgICAgICAgRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0ZpbmlzaFNjYW5SZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEpvaW4gUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0pvaW5SZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIENvbmZpZyBCU1MgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiAKKyAgICAgICAgRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0NvbmZpZ0JTU1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRGVsIEJTUyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTSAKKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRGVsQlNTUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgUG9zdCBBc3NvYyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIAorICAgICAgICBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzUG9zdEFzc29jUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRGVsIFNUQSBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTSAKKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRGVsU1RBUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IEJTUyBLZXkgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00KKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0QnNzS2V5UmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgUmVtb3ZlIEJTUyBLZXkgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiAgICAKKyAgICAgICAgRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlbW92ZUJzc0tleVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFNldCBTVEEgS2V5UmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFN0YUtleVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFJlbW92ZSBTVEEgS2V5IFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIAorICAgICAgICBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NSZW1vdmVTdGFLZXlSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgU1RBIEtleVJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNIAorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRTdGFCY2FzdEtleVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFJlbW92ZSBTVEEgS2V5IFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIAorICAgICAgICBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NSZW1vdmVTdGFCY2FzdEtleVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIEFkZCBUU3BlYyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTQorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NBZGRUU3BlY1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRGVsIFRTcGVjIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0RlbFRTcGVjUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgVXBkYXRlIEVEQ0EgUGFyYW1zIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuCisgICAgICAgIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1VwZGF0ZUVEQ0FQYXJhbXNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBBZGQgQkEgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0FkZEJBU2Vzc2lvblJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIERlbCBCQSBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTSAKKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRGVsQkFSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorLyoqCisgQGJyaWVmIFByb2Nlc3MgVFNNIFN0YXRzIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNCisgICAgICAgIGFsbG93cyBpdCkKKworIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0CisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZQorCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NUU01TdGF0c1JlcQorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKyNlbmRpZgorCisvKioKKyBAYnJpZWYgUHJvY2VzcyBDaGFubmVsIFN3aXRjaCBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiAKKyAgICAgICAgTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQ2hhbm5lbFN3aXRjaFJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIENvbmZpZyBTVEEgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0NvbmZpZ1N0YVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IExpbmsgU3RhdGUgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gCisgICAgICAgIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldExpbmtTdGF0ZVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgR2V0IFN0YXRzIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0dldFN0YXRzUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgVXBkYXRlIENmZyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIAorICAgICAgICBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzVXBkYXRlQ2ZnUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQWRkIEJBIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNIAorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NBZGRCQVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFRyaWdnZXIgQkEgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1RyaWdnZXJCQVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFVwZGF0ZSBCZWFjb24gUGFyYW1zIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gCisgICAgICAgIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NVcGRhdGVCZWFjb25QYXJhbXNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBVcGRhdGUgQmVhY29uIHRlbXBsYXRlIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gCisgICAgICAgIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZW5kQmVhY29uUGFyYW1zUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgVXBkYXRlIEJlYWNvbiBQYXJhbXMgIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworLyoqCisgQGJyaWVmIFByb2Nlc3MgTlYgYmxvYiBkb3dubG9hZCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc052RG93bmxvYWRSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgTWF4IFR4IFBvd2VyIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gICAgCisgICAgICAgIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyBXRElfUHJvY2Vzc1NldE1heFR4UG93ZXJSZXEKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisvKioKKyBAYnJpZWYgUHJvY2VzcyBQMlAgTm90aWNlIE9mIEFic2VuY2UgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00KKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzUDJQR09OT0FSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworI2VuZGlmCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEVudGVyIElNUFMgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gCisgICAgICAgIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0VudGVySW1wc1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIEV4aXQgSU1QUyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiAKKyAgICAgICAgTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRXhpdEltcHNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBFbnRlciBCTVBTIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gCisgICAgICAgIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NFbnRlckJtcHNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBFeGl0IEJNUFMgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00KKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRXhpdEJtcHNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBFbnRlciBVQVBTRCBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIAorICAgICAgICBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRW50ZXJVYXBzZFJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIEV4aXQgVUFQU0QgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gCisgICAgICAgIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0V4aXRVYXBzZFJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFNldCBVQVBTRCBwYXJhbXMgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gCisgICAgICAgIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFVhcHNkQWNQYXJhbXNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyB1cGRhdGUgVUFQU0QgcGFyYW1zIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NVcGRhdGVVYXBzZFBhcmFtc1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIENvbmZpZ3VyZSBSWFAgZmlsdGVyIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NDb25maWd1cmVSeHBGaWx0ZXJSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBzZXQgYmVhY29uIGZpbHRlciBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgCisgICAgICAgIHdoZW4gTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0QmVhY29uRmlsdGVyUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgcmVtb3ZlIGJlYWNvbiBmaWx0ZXIgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIAorICAgICAgICB3aGVuIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlbUJlYWNvbkZpbHRlclJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIHNldCBSU1NJIHRocmVzaG9sZHMgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIAorICAgICAgICB3aGVuIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFJTU0lUaHJlc2hvbGRzUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3Mgc2V0IFJTU0kgdGhyZXNob2xkcyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgCisgICAgICAgIHdoZW4gTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzSG9zdE9mZmxvYWRSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBLZWVwIEFsaXZlIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NLZWVwQWxpdmVSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFdvd2wgYWRkIGJjIHB0cm4gUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIAorICAgICAgICB3aGVuIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1dvd2xBZGRCY1B0cm5SZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBXb3dsIGRlbGV0ZSBiYyBwdHJuIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NXb3dsRGVsQmNQdHJuUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgV293bCBlbnRlciBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgCisgICAgICAgIHdoZW4gTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzV293bEVudGVyUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgV293bCBleGl0IFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1dvd2xFeGl0UmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQ29uZmlndXJlIEFwcHMgQ3B1IFdha2V1cCBTdGF0ZSBSZXF1ZXN0IGZ1bmN0aW9uCisgICAgICAgIChjYWxsZWQgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NDb25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBGbHVzaCBBQyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTSAKKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRmx1c2hBY1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgSG9zdCBSZXN1bWUgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiAKKyAgICAgICAgRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0hvc3RSZXN1bWVSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBCVCBBTVAgZXZlbnQgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiAKKyAgICAgICAgRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0J0QW1wRXZlbnRSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBBZGQgU1RBIHNlbGYgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00KKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQWRkU1RBU2VsZlJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIERlbCBTdGEgU2VsZiBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIAorICAgICAgICBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRGVsU1RBU2VsZlJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIHNldCBUeCBQZXIgVHJhY2tpbmcgY29uZmlndXJhdGlvbnMgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIAorICAgICAgICB3aGVuIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFR4UGVyVHJhY2tpbmdSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgUG93ZXIgUGFyYW1zIFJlcXVlc3QgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFBvd2VyUGFyYW1zUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IFRoZXJtYWwgTWl0aWdhdGlvbiBsZXZlbCBDaGFuZ2VkIHJlcXVlc3QKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFRtTGV2ZWxSZXEKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpY2F0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFN1c3BlbmQgSW5kaWNhdGlvbnMgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0hvc3RTdXNwZW5kSW5kCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgIE1haW4gREFMIENvbnRyb2wgUGF0aCBSZXNwb25zZSBQcm9jZXNzaW5nIEFQSSAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU3RhcnQgUmVzcG9uc2UgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU3RhcnRSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFN0b3AgUmVzcG9uc2UgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU3RvcFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQ2xvc2UgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0Nsb3NlUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2h1dGRvd24gUnNwIGZ1bmN0aW9uCisgICAgICAgIFRoZXJlIGlzIG5vIHNodXRkb3duIHJlc3BvbnNlIGNvbW1pbmcgZnJvbSBIQUwKKyAgICAgICAgLSBmdW5jdGlvbiBqdXN0IGtlcHQgZm9yIHNpbW1ldHJ5CisKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKworIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2h1dGRvd25Sc3AKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIEluaXQgU2NhbiBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzSW5pdFNjYW5Sc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFN0YXJ0IFNjYW4gUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1N0YXJ0U2NhblJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRW5kIFNjYW4gUmVzcG9uc2UgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0VuZFNjYW5Sc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEZpbmlzaCBTY2FuIFJlc3BvbnNlIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIAorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NGaW5pc2hTY2FuUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBKb2luIFJlc3BvbnNlIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0pvaW5Sc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIENvbmZpZyBCU1MgUmVzcG9uc2UgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0NvbmZpZ0JTU1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRGVsIEJTUyBSZXNwb25zZSBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NEZWxCU1NSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBQb3N0IEFzc29jIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NQb3N0QXNzb2NSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBEZWwgU1RBIEtleSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRGVsU1RBUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IEJTUyBLZXkgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldEJzc0tleVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFJlbW92ZSBCU1MgS2V5IFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NSZW1vdmVCc3NLZXlSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFNldCBTVEEgS2V5IFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRTdGFLZXlSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBSZW1vdmUgU1RBIEtleSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlbW92ZVN0YUtleVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IFNUQSBCY2FzdCBLZXkgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIAorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRTdGFCY2FzdEtleVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFJlbW92ZSBTVEEgQmNhc3QgS2V5IFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYQorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NSZW1vdmVTdGFCY2FzdEtleVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIEFkZCBUU3BlYyBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQWRkVFNwZWNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIERlbCBUU3BlYyBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRGVsVFNwZWNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBVcGRhdGUgRURDQSBQYXJhbWV0ZXJzIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSAgCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1VwZGF0ZUVEQ0FQYXJhbXNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEFkZCBCQSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQWRkQkFTZXNzaW9uUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBEZWwgQkEgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0RlbEJBUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKy8qKgorIEBicmllZiBQcm9jZXNzIFRTTSBzdGF0cyBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlCisKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1RzbVN0YXRzUnNwCisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisjZW5kaWYKKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBDaGFubmVsIFN3aXRjaCBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQ2hhbm5lbFN3aXRjaFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQ29uZmlnIFNUQSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQ29uZmlnU3RhUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgTGluayBTdGF0ZSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldExpbmtTdGF0ZVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIEdldCBTdGF0cyBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UgaXMgICAKKyAgICAgICAgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzR2V0U3RhdHNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFVwZGF0ZSBDZmcgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlIGlzICAKKyAgICAgICAgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzVXBkYXRlQ2ZnUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQWRkIEJBIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NBZGRCQVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIEFkZCBCQSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzVHJpZ2dlckJBUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgVXBkYXRlIEJlYWNvbiBQYXJhbXMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlIGlzICAKKyAgICAgICAgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzVXBkYXRlQmVhY29uUGFyYW1zUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2VuZCBCZWFjb24gdGVtcGxhdGUgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlIGlzICAKKyAgICAgICAgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2VuZEJlYWNvblBhcmFtc1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFVwZGF0ZSBQcm9iZSBSZXNwIFRlbXBsYXRlIFJzcCBmdW5jdGlvbiAoY2FsbGVkIAorICAgICAgICB3aGVuIGEgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisgIC8qKgorIEBicmllZiBQcm9jZXNzIFNldCBNYXggVHggUG93ZXIgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldE1heFR4UG93ZXJSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgICAgICAgICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgICAgICAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgTnYgZG93bmxvYWQoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NOdkRvd25sb2FkUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKy8qKgorIEBicmllZiBQcm9jZXNzIFAyUCBHcm91cCBPd25lciBOb3RpY2UgT2YgQWJzZW5zZSBSc3AgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBhIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1AyUEdPTk9BUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKyNlbmRpZgorCisvKioKKyBAYnJpZWYgUHJvY2VzcyBFbnRlciBJTVBTIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSAKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRW50ZXJJbXBzUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRXhpdCBJTVBTIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSAKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRXhpdEltcHNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBFbnRlciBCTVBTIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSAKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRW50ZXJCbXBzUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRXhpdCBCTVBTIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSAKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRXhpdEJtcHNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBFbnRlciBVQVBTRCBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRW50ZXJVYXBzZFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIEV4aXQgVUFQU0QgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlIAorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NFeGl0VWFwc2RSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBzZXQgVUFQU0QgcGFyYW1zIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSAKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0VWFwc2RBY1BhcmFtc1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIHVwZGF0ZSBVQVBTRCBwYXJhbXMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIAorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NVcGRhdGVVYXBzZFBhcmFtc1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIENvbmZpZ3VyZSBSWFAgZmlsdGVyIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYQorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NDb25maWd1cmVSeHBGaWx0ZXJSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgYmVhY29uIGZpbHRlciBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0QmVhY29uRmlsdGVyUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgcmVtb3ZlIGJlYWNvbiBmaWx0ZXIgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlbUJlYWNvbkZpbHRlclJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIHNldCBSU1NJIHRocmVzaG9sZHMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFJTU0lUaHJlc29sZHNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBob3N0IG9mZmxvYWQgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0hvc3RPZmZsb2FkUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgS2VlcCBBbGl2ZSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzS2VlcEFsaXZlUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyB3b3dsIGFkZCBwdHJuIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYQorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NXb3dsQWRkQmNQdHJuUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3Mgd293bCBkZWxldGUgcHRybiBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1dvd2xEZWxCY1B0cm5Sc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyB3b3dsIGVudGVyIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSAKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzV293bEVudGVyUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3Mgd293bCBleGl0IFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSAKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzV293bEV4aXRSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBDb25maWd1cmUgQXBwcyBDUFUgd2FrZXVwIFN0YXRlIFJzcCBmdW5jdGlvbiAKKyAgICAgICAgKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzCisgICAgICAgIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKy8qKgorIEBicmllZiBQcm9jZXNzIEZsdXNoIEFDIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NGbHVzaEFjUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQlQgQU1QIGV2ZW50IFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSAKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQnRBbXBFdmVudFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIEFERCBTRUxGIFNUQSBSc3AgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBhIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0FkZFNUQVNlbGZSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisgLyoqCisgQGJyaWVmIFdESV9Qcm9jZXNzRGVsU1RBU2VsZlJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSAKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRGVsU1RBU2VsZlJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKworIC8qKgorIEBicmllZiBXRElfUHJvY2Vzc0hvc3RSZXN1bWVSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0hvc3RSZXN1bWVSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBzZXQgdHggcGVyIHRyYWNraW5nIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYQorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRUeFBlclRyYWNraW5nUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgUG93ZXIgUGFyYW1zIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYQorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRQb3dlclBhcmFtc1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFNldCBUTSBMZXZlbCBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0VG1MZXZlbFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEluZGljYXRpb25zIGZyb20gSEFMCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoqCisgQGJyaWVmIFByb2Nlc3MgTG93IFJTU0kgSW5kaWNhdGlvbiBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYW4gCisgICAgICAgIGluZGljYXRpb24gb2YgdGhpcyBraW5kIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cworICAgICAgICBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0xvd1JTU0lJbmQKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBNaXNzZWQgQmVhY29uIEluZGljYXRpb24gZnVuY3Rpb24gKGNhbGxlZCB3aGVuIAorICAgICAgICBhbiBpbmRpY2F0aW9uIG9mIHRoaXMga2luZCBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZQorICAgICAgICBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NNaXNzZWRCZWFjb25JbmQKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFVuayBBZGRyIEZyYW1lIEluZGljYXRpb24gZnVuY3Rpb24gKGNhbGxlZCB3aGVuIAorICAgICAgICBhbiBpbmRpY2F0aW9uIG9mIHRoaXMga2luZCBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZQorICAgICAgICBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NVbmtBZGRyRnJhbWVJbmQKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIE1JQyBGYWlsdXJlIEluZGljYXRpb24gZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGFuIAorICAgICAgICBpbmRpY2F0aW9uIG9mIHRoaXMga2luZCBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMKKyAgICAgICAgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NNaWNGYWlsdXJlSW5kCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRmF0YWwgRmFpbHVyZSBJbmRpY2F0aW9uIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiAKKyAgICAgICAgYW4gaW5kaWNhdGlvbiBvZiB0aGlzIGtpbmQgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUKKyAgICAgICAgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRmF0YWxFcnJvckluZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIERlbGV0ZSBTVEEgSW5kaWNhdGlvbiBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gCisgICAgICAgIGFuIGluZGljYXRpb24gb2YgdGhpcyBraW5kIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlCisgICAgICAgIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0RlbFNUQUluZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorKkBicmllZiBQcm9jZXNzIENvZXggSW5kaWNhdGlvbiBmdW5jdGlvbiAoY2FsbGVkIHdoZW4KKyAgICAgICAgYW4gaW5kaWNhdGlvbiBvZiB0aGlzIGtpbmQgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUKKyAgICAgICAgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQ29leEluZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorKkBicmllZiBQcm9jZXNzIFR4IENvbXBsZXRlIEluZGljYXRpb24gZnVuY3Rpb24gKGNhbGxlZCB3aGVuCisgICAgICAgIGFuIGluZGljYXRpb24gb2YgdGhpcyBraW5kIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlCisgICAgICAgIGJ1cyBmcm9tIEhBTCkKKworIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0CisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZQorCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NUeENvbXBsZXRlSW5kCisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorLyoqCisqQGJyaWVmIFByb2Nlc3MgTm9hIEF0dHIgSW5kaWNhdGlvbiBmdW5jdGlvbiAoY2FsbGVkIHdoZW4KKyAgICAgICAgYW4gaW5kaWNhdGlvbiBvZiB0aGlzIGtpbmQgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUKKyAgICAgICAgYnVzIGZyb20gSEFMKQorCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlCisKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1AycE5vYUF0dHJJbmQKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisjZW5kaWYKKworLyoqCisqQGJyaWVmIFByb2Nlc3MgVHggUGVyIEhpdCBJbmRpY2F0aW9uIGZ1bmN0aW9uIChjYWxsZWQgd2hlbgorICAgICAgICBhbiBpbmRpY2F0aW9uIG9mIHRoaXMga2luZCBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZQorICAgICAgICBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NUeFBlckhpdEluZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyoqCisgQGJyaWVmIFByb2Nlc3MgQWdncmdhdGVkIEFkZCBUU3BlYyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTQorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NBZ2dyQWRkVFNwZWNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBBZGQgVFNwZWMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0FnZ3JBZGRUU3BlY1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAqLworCisjaWZkZWYgQU5JX01BTkZfRElBRworLyoqCisgQGJyaWVmIFdESV9Qcm9jZXNzRlRNQ29tbWFuZFJlcQorICAgICAgICBQcm9jZXNzIEZUTSBDb21tYW5kLCBzaW1wbHkgcm91dGUgdG8gSEFMCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NGVE1Db21tYW5kUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFdESV9Qcm9jZXNzRlRNQ29tbWFuZFJzcAorICAgICAgICBQcm9jZXNzIEZUTSBDb21tYW5kIFJlc3BvbnNlIGZyb20gSEFMLCBzaW1wbHkgcm91dGUgdG8gSEREIEZUTQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRlRNQ29tbWFuZFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisjZW5kaWYgLyogQU5JX01BTkZfRElBRyAqLworLyoqCisgQGJyaWVmIFdESV9Qcm9jZXNzSEFMRHVtcENtZFJlcQorICAgICAgICBQcm9jZXNzIEhhbCBEdW1wIENvbW1hbmQsIHNpbXBseSByb3V0ZSB0byBIQUwKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0hBTER1bXBDbWRSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgV0RJX1Byb2Nlc3NIQUxEdW1wQ21kUnNwCisgICAgICAgIFByb2Nlc3MgSGFsIER1bXAgQ29tbWFuZCBSZXNwb25zZSBmcm9tIEhBTCwgc2ltcGx5IHJvdXRlIHRvIEhERCBGVE0KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0hBTER1bXBDbWRSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgIEludGVybmFsIEhlbHBlciBSb3V0aW5lcyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorIEBicmllZiBXRElfQ2xlYW5DQiAtIGludGVybmFsIGhlbHBlciByb3V0aW5lIHVzZWQgdG8gY2xlYW4gdGhlIAorICAgICAgICBXREkgTWFpbiBDb250cm9sIEJsb2NrCisgCisgQHBhcmFtIHBXRElDdHggLSBwb2ludGVyIHRvIHRoZSBjb250cm9sIGJsb2NrCisKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dQVF9JTkxJTkUgV0RJX1N0YXR1cworV0RJX0NsZWFuQ0IKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4CispOworCisvKioKKyBAYnJpZWYgTWFpbiBGU00gQ2xvc2UgZnVuY3Rpb24gZm9yIGFsbCBzdGF0ZXMgZXhjZXB0IEJVU1kKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dQVF9JTkxJTkUgV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NSZXF1ZXN0CisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgR2V0IG1lc3NhZ2UgaGVscGVyIGZ1bmN0aW9uIC0gaXQgYWxsb2NhdGVzIG1lbW9yeSBmb3IgYSAKKyAgICAgICAgbWVzc2FnZSB0aGF0IGlzIHRvIGJlIHNlbnQgdG8gSEFMIGFjY3Jvc3MgdGhlIGJ1cyBhbmQKKyAgICAgICAgcHJlZml4ZXMgaXQgd2l0aCBhIHNlbmQgbWVzc2FnZSBoZWFkZXIgCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICB3ZGlSZXFUeXBlOiAgICAgIHR5cGUgb2YgdGhlIHJlcXVlc3QgYmVpbmcgc2VudAorICAgICAgICAgdUJ1ZmZlckxlbjogICAgICBtZXNzYWdlIGJ1ZmZlciBsZW4KKyAgICAgICAgIHBNc2dCdWZmZXI6ICAgICAgcmVzdWx0aW5nIGFsbG9jYXRlZCBidWZmZXIKKyAgICAgICAgIHB1RGF0YU9mZnNldDogICAgb2Zmc2V0IGluIHRoZSBidWZmZXIgd2hlcmUgdGhlIGNhbGxlcgorICAgICAgICAgY2FuIHN0YXJ0IGNvcHlpbmcgaXRzIG1lc3NhZ2UgZGF0YQorICAgICAgICAgcHVCdWZmZXJTaXplOiAgICB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBzaXplIChvZmZzZXQrYnVmZgorICAgICAgICAgbGVuKQorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfR2V0TWVzc2FnZUJ1ZmZlcgorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAKKyAgV0RJX1JlcXVlc3RFbnVtVHlwZSAgICB3ZGlSZXFUeXBlLCAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICB1c0J1ZmZlckxlbiwKKyAgd3B0X3VpbnQ4KiogICAgICAgICAgICBwTXNnQnVmZmVyLCAKKyAgd3B0X3VpbnQxNiogICAgICAgICAgICBwdXNEYXRhT2Zmc2V0LCAKKyAgd3B0X3VpbnQxNiogICAgICAgICAgICBwdXNCdWZmZXJTaXplCispOworCisvKioKKyBAYnJpZWYgV0RJX0RldGVjdGVkRGV2aWNlRXJyb3IgLSBjYWxsZWQgaW50ZXJuYWxseSBieSBEQUwgd2hlbiAKKyAgICAgICAgaXQgaGFzIGRldGVjdGVkIGEgZmFpbHVyZSBpbiB0aGUgZGV2aWNlIAorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICB1c0Vycm9yQ29kZTogICAgZXJyb3IgY29kZSBkZXRlY3RlZCBieSBXREkgb3IgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIEhBTAorICAKKyBAc2VlCisgQHJldHVybiBOb25lIAorKi8KK3ZvaWQKK1dESV9EZXRlY3RlZERldmljZUVycm9yCisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICB1c0Vycm9yQ29kZQorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgUVVFVUUgU1VQUE9SVCBVVElMSVRZIEZVTkNUSU9OUyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgICAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBEQUwgQ29yZSB0byBoZWxwIHF1ZXVlIGEgCisgICAgICAgICAgIHJlcXVlc3QgdGhhdCBjYW5ub3QgYmUgcHJvY2Vzc2VkIHJpZ2h0IGF3YXkuIAorIEBwYXJhbSAKKyAgICAKKyAgICBwV0RJQ3R4OiAtIHBvaW50ZXIgdG8gdGhlIFdESSBjb250cm9sIGJsb2NrCisgICAgcEV2ZW50RGF0YTogLSBwb2ludGVyIHRvIHRoZSBldm50IGluZm8gdGhhdCBuZWVkcyB0byBiZQorICAgIHF1ZXVlZCAKKyAgICAKKyBAc2VlIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIAorKi8KK1dESV9TdGF0dXMKK1dESV9RdWV1ZVBlbmRpbmdSZXEKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIERBTCBDb3JlIHRvIGNsZWFyIGFueSAKKyAgICAgICAgICAgcGVuZGluZyByZXF1ZXN0cyAtIGFsbCByZXEgY2Igd2lsbCBiZSBjYWxsZWQgd2l0aAorICAgICAgICAgICBmYWlsdXJlIGFuZCB0aGUgcXVldWUgd2lsbCBiZSBlbXB0aWVkLgorIEBwYXJhbSAKKyAgICAKKyAgICBwV0RJQ3R4OiAtIHBvaW50ZXIgdG8gdGhlIFdESSBjb250cm9sIGJsb2NrCisgICAgCisgQHNlZSAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICAKKyovCitXRElfU3RhdHVzCitXRElfQ2xlYXJQZW5kaW5nUmVxdWVzdHMKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eAorKTsKKworLyoqCisgQGJyaWVmICAgIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSB0aGUgd3B0IHdoZW4gYSB0aW1lciB0aGF0IAorICAgICAgICAgICB3ZSBzdGFydGVkIG9uIHNlbmQgbWVzc2FnZSBoYXMgZXhwaXJlIC0gdGhpcyBzaG91bGQKKyAgICAgICAgICAgbmV2ZXIgaGFwcGVuIC0gaXQgbWVhbnMgZGV2aWNlIGlzIHN0dWNrIGFuZCBjYW5ub3QKKyAgICAgICAgICAgcmVwbHkgLSB0cmlnZ2VyIGNhdGFzdHJvcGhpYyBmYWlsdXJlIAorIEBwYXJhbSAKKyAgICAKKyAgICBwVXNlckRhdGE6IHRoZSBjYWxsYmFjayBkYXRhIG9mIHRoZSB1c2VyIChwdHIgdG8gV0RJIENCKQorICAgIAorIEBzZWUgCisgQHJldHVybiBOb25lIAorKi8KK3ZvaWQgCitXRElfUmVzcG9uc2VUaW1lckNCCisoCisgIHZvaWQgKnBVc2VyRGF0YQorKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgQ09OVFJMIFRSQU5TUE9SVCBJTlRFUkFDVElPTgorIAorICAgIENhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY29udHJvbCB0cmFuc3BvcnQgLSBmb3IgcmVjZWl2aW5nCisgICAgbm90aWZpY2F0aW9ucyBhbmQgcGFja2V0cyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qKgorIEBicmllZiAgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgdGhlIGNvbnRyb2wgdHJhbnNwb3J0IAorICAgd2hlbiBpdCB3aXNoZXMgdG8gc2VuZCB1cCBhIG5vdGlmaWNhdGlvbiBsaWtlIHRoZSBvbmVzCisgICBtZW50aW9uZWQgYWJvdmUuCisgCisgQHBhcmFtCisgICAgCisgICAgd2N0c0hhbmRsZTogICAgICAgaGFuZGxlIHRvIHRoZSBjb250cm9sIHRyYW5zcG9ydCBzZXJ2aWNlIAorICAgIHdjdHNFdmVudDogICAgICAgIHRoZSBldmVudCBiZWluZyBub3RpZmllZAorICAgIHdjdHNOb3RpZnlDQkRhdGE6IHRoZSBjYWxsYmFjayBkYXRhIG9mIHRoZSB1c2VyIAorICAgIAorIEBzZWUgIFdDVFNfT3BlblRyYW5zcG9ydAorICAKKyBAcmV0dXJuIE5vbmUgCisqLwordm9pZCAKK1dESV9Ob3RpZnlNc2dDVFNDQgorKAorICBXQ1RTX0hhbmRsZVR5cGUgICAgICAgIHdjdHNIYW5kbGUsIAorICBXQ1RTX05vdGlmeUV2ZW50VHlwZSAgIHdjdHNFdmVudCwKKyAgdm9pZCogICAgICAgICAgICAgICAgICB3Y3RzTm90aWZ5Q0JEYXRhCispOworCisvKioKKyBAYnJpZWYgICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IHRoZSBjb250cm9sIHRyYW5zcG9ydCAKKyAgICAgICAgICAgd2hlbiBpdCB3aXNoZXMgdG8gc2VuZCB1cCBhIHBhY2tldCByZWNlaXZlZCBvdmVyIHRoZQorICAgICAgICAgICBidXMuCisgCisgQHBhcmFtCisgICAgCisgICAgd2N0c0hhbmRsZTogIGhhbmRsZSB0byB0aGUgY29udHJvbCB0cmFuc3BvcnQgc2VydmljZSAKKyAgICBwTXNnOiAgICAgICAgdGhlIHBhY2tldAorICAgIHVMZW46ICAgICAgICB0aGUgcGFja2V0IGxlbmd0aAorICAgIHdjdHNSeE1zZ0NCRGF0YTogdGhlIGNhbGxiYWNrIGRhdGEgb2YgdGhlIHVzZXIgCisgICAgCisgQHNlZSAgV0NUU19PcGVuVHJhbnNwb3J0CisgIAorIEByZXR1cm4gTm9uZSAKKyovCit2b2lkIAorV0RJX1JYTXNnQ1RTQ0IgCisoCisgIFdDVFNfSGFuZGxlVHlwZSAgICAgICB3Y3RzSGFuZGxlLCAKKyAgdm9pZCogICAgICAgICAgICAgICAgIHBNc2csCisgIHdwdF91aW50MzIgICAgICAgICAgICB1TGVuLAorICB2b2lkKiAgICAgICAgICAgICAgICAgd2N0c1J4TXNnQ0JEYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyByZXNwb25zZSBoZWxwZXIgZnVuY3Rpb24gCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1Jlc3BvbnNlCisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgU2VuZCBtZXNzYWdlIGhlbHBlciBmdW5jdGlvbiAtIHNlbmRzIGEgbWVzc2FnZSBvdmVyIHRoZSAKKyAgICAgICAgYnVzIHVzaW5nIHRoZSBjb250cm9sIHRyYW5wb3J0IGFuZCBzYXZlcyBzb21lIGluZm8gaW4KKyAgICAgICAgdGhlIENCIAorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcFNlbmRCdWZmZXI6ICAgICBidWZmZXIgdG8gYmUgc2VudAorICAKKyAgICAgICAgIHVTZW5kU2l6ZSAgICAgICAgICBzaXplIG9mIHRoZSBidWZmZXIgdG8gYmUgc2VudAorICAgICAgICAgcFJzcENiOiAgICAgICAgICAgIHJlc3BvbnNlIGNhbGxiYWNrIC0gc2F2ZSBpbiB0aGUgV0RJCisgICAgICAgICBDQgorICAgICAgICAgcFVzZXJEYXRhOiAgICAgICAgIHVzZXIgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICAgICBjYWxsYmFjaworICAgICAgICAgd2RpRXhwZWN0ZWRSZXNwb25zZTogdGhlIGNvZGUgb2YgdGhlIHJlc3BvbnNlIHRoYXQgaXMKKyAgICAgICAgIGV4cGVjdGVkIHRvIGJlIHJ4LWVkIGZvciB0aGlzIHJlcXVlc3QKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZW5kTXNnCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsICAKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICBwU2VuZEJ1ZmZlciwgCisgIHdwdF91aW50MzIgICAgICAgICAgICAgdVNlbmRTaXplLCAKKyAgdm9pZCogICAgICAgICAgICAgICAgICBwUnNwQ2IsIAorICB2b2lkKiAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YSwKKyAgV0RJX1Jlc3BvbnNlRW51bVR5cGUgICB3ZGlFeHBlY3RlZFJlc3BvbnNlCispOworCisKKy8qKgorIEBicmllZiBTZW5kIGluZGljYXRpb24gaGVscGVyIGZ1bmN0aW9uIC0gc2VuZHMgYSBtZXNzYWdlIG92ZXIgCisgICAgICAgIHRoZSBidXMgdXNpbmcgdGhlIGNvbnRyb2wgdHJhbnNwb3J0IGFuZCBzYXZlcyBzb21lIGluZm8KKyAgICAgICAgaW4gdGhlIENCCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwU2VuZEJ1ZmZlcjogICAgIGJ1ZmZlciB0byBiZSBzZW50CisgICAgICAgICB1c1NlbmRTaXplOiBzaXplIG9mIHRoZSBidWZmZXIgdG8gYmUgc2VudAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NlbmRJbmRpY2F0aW9uCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsICAKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICBwU2VuZEJ1ZmZlciwgCisgIHdwdF91aW50MzIgICAgICAgICAgICAgdXNTZW5kU2l6ZQorKTsKKworLyoqCisgQGJyaWVmICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSB0aGUgREFMIENvcmUgdG8gaGVscCBkZXF1ZXVlCisgICAgICAgICAgIGFuZCBzY2hlZHVsZSBmb3IgZXhlY3V0aW9uIGEgcGVuZGluZyByZXF1ZXN0IAorIEBwYXJhbSAKKyAgICAKKyAgICBwV0RJQ3R4OiAtIHBvaW50ZXIgdG8gdGhlIFdESSBjb250cm9sIGJsb2NrCisgICAgcEV2ZW50RGF0YTogLSBwb2ludGVyIHRvIHRoZSBldm50IGluZm8gdGhhdCBuZWVkcyB0byBiZQorICAgIHF1ZXVlZCAKKyAgICAKKyBAc2VlIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIAorKi8KK1dESV9TdGF0dXMKK1dESV9EZXF1ZXVlUGVuZGluZ1JlcQorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgKKyk7CisKKy8qKgorIEBicmllZiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIERBTCBDb3JlIHRvIGhlbHAgcXVldWUgCisgICAgICAgICAgIGFuIGFzc29jaWF0aW9uIHJlcXVlc3QgdGhhdCBjYW5ub3QgYmUgcHJvY2Vzc2VkIHJpZ2h0CisgICAgICAgICAgIGF3YXkuLSBUaGUgYXNzb2MgcmVxdWVzdHMgd2lsbCBiZSBxdWV1ZWQgYnkgQlNTSUQgCisgQHBhcmFtIAorICAgIAorICAgIHBXRElDdHg6IC0gcG9pbnRlciB0byB0aGUgV0RJIGNvbnRyb2wgYmxvY2sKKyAgICBwRXZlbnREYXRhOiBwb2ludGVyIHRvIHRoZSBldm50IGluZm8gdGhhdCBuZWVkcyB0byBiZSBxdWV1ZWQKKyAgICBtYWNCU1NJRDogYnNzaWQKKyAgICAKKyBAc2VlIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIAorKi8KK1dESV9TdGF0dXMKK1dESV9RdWV1ZU5ld0Fzc29jUmVxdWVzdAorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YSwKKyAgd3B0X21hY0FkZHIgICAgICAgICAgICBtYWNCU1NJRAorKTsgCisKKy8qKgorIEBicmllZiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIERBTCBDb3JlIHRvIGhlbHAgcXVldWUgCisgICAgICAgICAgIGFuIGFzc29jaWF0aW9uIHJlcXVlc3QgdGhhdCBjYW5ub3QgYmUgcHJvY2Vzc2VkIHJpZ2h0CisgICAgICAgICAgIGF3YXkuLSBUaGUgYXNzb2MgcmVxdWVzdHMgd2lsbCBiZSBxdWV1ZWQgYnkgQlNTSUQgCisgQHBhcmFtIAorICAgIAorICAgIHBXRElDdHg6IC0gcG9pbnRlciB0byB0aGUgV0RJIGNvbnRyb2wgYmxvY2sKKyAgICBwU2Vzc2lvbjogLSBzZXNzaW9uIGluIHdoaWNoIHRvIHF1ZXVlCisgICAgcEV2ZW50RGF0YTogcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mbyB0aGF0IG5lZWRzIHRvIGJlCisgICAgcXVldWVkCisgICAgCisgQHNlZSAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICAKKyovCitXRElfU3RhdHVzCitXRElfUXVldWVBc3NvY1JlcXVlc3QKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfQlNTU2Vzc2lvblR5cGUqICAgIHBTZXNzaW9uLAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIERBTCBDb3JlIHRvIGhlbHAgZGVxdWV1ZQorICAgICAgICAgICBhbiBhc3NvY2lhdGlvbiByZXF1ZXN0IHRoYXQgd2FzIHBlbmRpbmcKKyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQgdXAgaW4gZnJvbnQgb2YgdGhlIG1haW4KKyAgICAgICAgICAgcGVuZGluZyBxdWV1ZSBmb3IgaW1tZWRpYXRlIHByb2Nlc3NpbmcKKyBAcGFyYW0gCisgICAgCisgICAgcFdESUN0eDogLSBwb2ludGVyIHRvIHRoZSBXREkgY29udHJvbCBibG9jaworICAKKyAgICAKKyBAc2VlIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIAorKi8KK1dESV9TdGF0dXMKK1dESV9EZXF1ZXVlQXNzb2NSZXF1ZXN0CisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eAorKTsKKworLyoqCisgQGJyaWVmIEhlbHBlciByb3V0aW5lIHVzZWQgdG8gaW5pdCB0aGUgQlNTIFNlc3Npb25zIGluIHRoZSBXREkgY29udHJvbCBibG9jayAKKyAgCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAKKyBAc2VlCisqLwordm9pZAorV0RJX1Jlc2V0QXNzb2NTZXNzaW9ucworKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICAgcFdESUN0eAorKTsKKworLyoqCisgQGJyaWVmIEhlbHBlciByb3V0aW5lIHVzZWQgdG8gZmluZCBhbiBlbXB0eSBzZXNzaW9uIGluIHRoZSBXREkgCisgICAgICAgIENCCisgIAorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBTZXNzaW9uOiAgICAgIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gKGlmIGZvdW5kKSAKKyAgCisgQHNlZQorIEByZXR1cm4gSW5kZXggb2YgdGhlIHNlc3Npb24gaW4gdGhlIGFycmF5IAorKi8KK3dwdF91aW50OAorV0RJX0ZpbmRFbXB0eVNlc3Npb24KKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgIHBXRElDdHgsCisgIFdESV9CU1NTZXNzaW9uVHlwZSoqICAgIHBwU2Vzc2lvbgorKTsKKworLyoqCisgQGJyaWVmIEhlbHBlciByb3V0aW5lIHVzZWQgdG8gZ2V0IHRoZSB0b3RhbCBjb3VudCBvZiBhY3RpdmUgCisgICAgICAgIHNlc3Npb25zCisgIAorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgCisgQHNlZQorIEByZXR1cm4gTnVtYmVyIG9mIHNlc3Npb25zIGluIHVzZQorKi8KK3dwdF91aW50OAorV0RJX0dldEFjdGl2ZVNlc3Npb25zQ291bnQKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgIHBXRElDdHgKKyk7CisKKy8qKgorIEBicmllZiBIZWxwZXIgcm91dGluZSB1c2VkIHRvIGRlbGV0ZSBzZXNzaW9uIGluIHRoZSBXREkgCisgICAgICAgIENCCisgIAorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBTZXNzaW9uOiAgICAgIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gKGlmIGZvdW5kKSAKKyAgCisgQHNlZQorIEByZXR1cm4gSW5kZXggb2YgdGhlIHNlc3Npb24gaW4gdGhlIGFycmF5IAorKi8KK3ZvaWQgCitXRElfRGVsZXRlU2Vzc2lvbgorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICAgcFdESUN0eCwKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgcHBTZXNzaW9uCispOworCisvKioKKyBAYnJpZWYgSGVscGVyIHJvdXRpbmUgdXNlZCB0byBmaW5kIGEgc2Vzc2lvbiBiYXNlZCBvbiB0aGUgQlNTSUQgCisgIAorIAorIEBwYXJhbSAgcFdESUN0eDogICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgbWFjQlNTSUQ6ICBCU1NJRCBvZiB0aGUgc2Vzc2lvbgorICAgICAgICAgcHBTZXNzaW9uOiBvdXQgcG9pbnRlciB0byB0aGUgc2Vzc2lvbiAoaWYgZm91bmQpCisgIAorIEBzZWUKKyBAcmV0dXJuIEluZGV4IG9mIHRoZSBzZXNzaW9uIGluIHRoZSBhcnJheSAKKyovCit3cHRfdWludDgKK1dESV9GaW5kQXNzb2NTZXNzaW9uCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogICBwV0RJQ3R4LAorICB3cHRfbWFjQWRkciAgICAgICAgICAgICBtYWNCU1NJRCwKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiogICAgcHBTZXNzaW9uCispOworCisKKy8qKgorIEBicmllZiBIZWxwZXIgcm91dGluZSB1c2VkIHRvIGZpbmQgYSBzZXNzaW9uIGJhc2VkIG9uIHRoZSBCU1NJRCAKKyAgCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICB1c0Jzc0lkeDogIEJTUyBJbmRleCBvZiB0aGUgc2Vzc2lvbgorICAgICAgICAgcHBTZXNzaW9uOiBvdXQgcG9pbnRlciB0byB0aGUgc2Vzc2lvbiAoaWYgZm91bmQpCisgIAorIEBzZWUKKyBAcmV0dXJuIEluZGV4IG9mIHRoZSBzZXNzaW9uIGluIHRoZSBhcnJheSAKKyovCit3cHRfdWludDgKK1dESV9GaW5kQXNzb2NTZXNzaW9uQnlCU1NJZHgKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgIHBXRElDdHgsCisgIHdwdF91aW50MTYgICAgICAgICAgICAgIHVzQnNzSWR4LAorICBXRElfQlNTU2Vzc2lvblR5cGUqKiAgICBwcFNlc3Npb24KKyk7CisKKy8qKgorIEBicmllZiBIZWxwZXIgcm91dGluZSB1c2VkIHRvIGZpbmQgYSBzZXNzaW9uIGJhc2VkIG9uIHRoZSBCU1NJRCAKKyAgCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICB1c0Jzc0lkeDogIEJTUyBJbmRleCBvZiB0aGUgc2Vzc2lvbgorICAgICAgICAgcHBTZXNzaW9uOiBvdXQgcG9pbnRlciB0byB0aGUgc2Vzc2lvbiAoaWYgZm91bmQpCisgIAorIEBzZWUKKyBAcmV0dXJuIEluZGV4IG9mIHRoZSBzZXNzaW9uIGluIHRoZSBhcnJheSAKKyovCit3cHRfdWludDgKK1dESV9GaW5kQXNzb2NTZXNzaW9uQnlJZHgKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgIHBXRElDdHgsCisgIHdwdF91aW50MTYgICAgICAgICAgICAgIHVzQnNzSWR4LAorICBXRElfQlNTU2Vzc2lvblR5cGUqKiAgICBwcFNlc3Npb24KKyk7CisKKy8qKgorIEBicmllZiBIZWxwZXIgcm91dGluZSB1c2VkIHRvIGZpbmQgYSBzZXNzaW9uIGJhc2VkIG9uIHRoZSBCU1NJRCAKKyBAcGFyYW0gIHBDb250ZXh0OiAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgQHBhcmFtICBwRFBDb250ZXh0OiAgIHBvaW50ZXIgdG8gdGhlIERhdGFwYXRoIGNvbnRleHQgCisgIAorIEBzZWUKKyBAcmV0dXJuIAorKi8KK1dQVF9JTkxJTkUgdm9pZCAKK1dESV9EU19Bc3NpZ25EYXRhcGF0aENvbnRleHQgCisoCisgIHZvaWQgKnBDb250ZXh0LCAKKyAgdm9pZCAqcERQQ29udGV4dAorKTsKKworLyoqCisgQGJyaWVmIEhlbHBlciByb3V0aW5lIHVzZWQgdG8gZmluZCBhIHNlc3Npb24gYmFzZWQgb24gdGhlIEJTU0lEIAorICAKKyAKKyBAcGFyYW0gIHBDb250ZXh0OiAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgIAorIEBzZWUKKyBAcmV0dXJuIHBvaW50ZXIgdG8gRGF0YXBhdGggY29udGV4dAorKi8KK1dQVF9JTkxJTkUgdm9pZCAqIAorV0RJX0RTX0dldERhdGFwYXRoQ29udGV4dCAKKygKKyAgdm9pZCAqcENvbnRleHQKKyk7CisKKy8qKgorIEBicmllZiBIZWxwZXIgcm91dGluZSB1c2VkIHRvIGZpbmQgYSBzZXNzaW9uIGJhc2VkIG9uIHRoZSBCU1NJRCAKKyAgCisgCisgQHBhcmFtICBwQ29udGV4dDogICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorIEBwYXJhbSAgcERURHJpdmVyQ29udGV4dDogICBwb2ludGVyIHRvIHRoZSBUcmFuc3BvcnQgRHJpdmVyIGNvbnRleHQgCisgIAorIEBzZWUKKyBAcmV0dXJuIHZvaWQKKyovCitXUFRfSU5MSU5FIHZvaWQgIAorV0RUX0Fzc2lnblRyYW5zcG9ydERyaXZlckNvbnRleHQgCisoCisgIHZvaWQgKnBDb250ZXh0LCAKKyAgdm9pZCAqcERURHJpdmVyQ29udGV4dAorKTsKKworLyoqCisgQGJyaWVmIEhlbHBlciByb3V0aW5lIHVzZWQgdG8gZmluZCBhIHNlc3Npb24gYmFzZWQgb24gdGhlIEJTU0lEIAorICAKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgCisgQHNlZQorIEByZXR1cm4gcG9pbnRlciB0byBkYXRhcGF0aCBjb250ZXh0IAorKi8KK1dQVF9JTkxJTkUgdm9pZCAqIAorV0RUX0dldFRyYW5zcG9ydERyaXZlckNvbnRleHQgCisoCisgIHZvaWQgKnBDb250ZXh0CispOworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgUHJlZmVycmVkIE5ldHdvcmsgTGlzdCBSZXF1ZXN0IGZ1bmN0aW9uCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRQcmVmZXJyZWROZXR3b3JrUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IFJTU0kgRmlsdGVyIFJlcXVlc3QgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFJzc2lGaWx0ZXJSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBVcGRhdGUgU2NhbiBQYXJhbXMgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1VwZGF0ZVNjYW5QYXJhbXNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBQcmVmZXJyZWQgTmV0d29yayBGb3VuZCBJbmRpY2F0aW9uIGZ1bmN0aW9uCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NQcmVmTmV0d29ya0ZvdW5kSW5kCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgUE5PIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYQorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRQcmVmZXJyZWROZXR3b3JrUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgUlNTSSBGaWx0ZXIgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFJzc2lGaWx0ZXJSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBVcGRhdGUgU2NhbiBQYXJhbXMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1VwZGF0ZVNjYW5QYXJhbXNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKy8qKgorIEBicmllZiBQcm9jZXNzIDgwMjMgTXVsdGljYXN0IExpc3QgUmVxdWVzdCBmdW5jdGlvbgorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzODAyM011bHRpY2FzdExpc3RSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBSZWNlaXZlIEZpbHRlciBTZXQgRmlsdGVyIFJlcXVlc3QgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBEMCBQQyBGaWx0ZXIgTWF0Y2ggQ291bnQgUmVxdWVzdCBmdW5jdGlvbgorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRmlsdGVyTWF0Y2hDb3VudFJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFJlY2VpdmUgRmlsdGVyIENsZWFyIEZpbHRlciBSZXF1ZXN0IGZ1bmN0aW9uCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NSZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyA4MDIzIE11bHRpY2FzdCBMaXN0IFJlc3BvbnNlIGZ1bmN0aW9uCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3M4MDIzTXVsdGljYXN0TGlzdFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFJlY2VpdmUgRmlsdGVyIFNldCBGaWx0ZXIgUmVzcG9uc2UgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBEMCBQQyBGaWx0ZXIgTWF0Y2ggQ291bnQgUmVzcG9uc2UgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0ZpbHRlck1hdGNoQ291bnRSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispOworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBSZWNlaXZlIEZpbHRlciBDbGVhciBGaWx0ZXIgUmVzcG9uc2UgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlclJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorLyoqCisgQGJyaWVmIFByb2Nlc3Mgc2V0IEdUSyBPZmZsb2FkIFJlcXVlc3QgZnVuY3Rpb24gCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NHVEtPZmZsb2FkUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgR1RLIE9mZmxvYWQgR2V0IEluZm9ybWF0aW9uIFJlcXVlc3QgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0dUS09mZmxvYWRHZXRJbmZvUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgaG9zdCBvZmZsb2FkIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYQorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NHdGtPZmZsb2FkUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgR1RLIE9mZmxvYWQgR2V0IEluZm9ybWF0aW9uIFJlc3BvbnNlIGZ1bmN0aW9uCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NHVEtPZmZsb2FkR2V0SW5mb1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzV2FrZVJlYXNvbkluZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEhvc3QtRlcgQ2FwYWJpbGl0eSBFeGNoYW5nZSBSZXF1ZXN0IGZ1bmN0aW9uCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NGZWF0dXJlQ2Fwc0V4Y2hhbmdlUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgSG9zdC1GVyBDYXBhYmlsaXR5IEV4Y2hhbmdlIFJlc3BvbnNlIGZ1bmN0aW9uCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NGZWF0dXJlQ2Fwc0V4Y2hhbmdlUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKTsKKworI2VuZGlmIC8qV0xBTl9RQ1RfV0RJX0lfSCovCisKZGlmZiAtLWdpdCBhL0NPUkUvV0RJL0NQL2luYy93bGFuX3FjdF93ZGlfc3RhLmggYi9DT1JFL1dESS9DUC9pbmMvd2xhbl9xY3Rfd2RpX3N0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZWE3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9DUC9pbmMvd2xhbl9xY3Rfd2RpX3N0YS5oCkBAIC0wLDAgKzEsNDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBXTEFOX1FDVF9EQUxfU1RBX0gKKyNkZWZpbmUgV0xBTl9RQ1RfREFMX1NUQV9ICisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgIFcgTCBBIE4gICBEIEUgViBJIEMgRSAgIEEgQiBTIFQgUiBBIEMgVCBJIE8gTiAgIEwgQSBZIEUgUiAKKyAgICAgICAgICAgICAgSSBOIFQgRSBSIE4gQSBMICAgICBBIFAgSSAgICAgICBGIE8gUiAgICBUIEggRQorICAgICAgICAgICAgICAgICAgICAgICBTIFQgQSBUIEkgTyBOICAgIE0gRyBNIFQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAKK0RFU0NSSVBUSU9OCisgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW50ZXJuYWwgQVBJIGV4cG9zZWQgYnkgdGhlIFNUQSBNYW5hZ2VtZW50IGVudGl0eSB0bworICBiZSB1c2VkIGJ5IHRoZSBEQUwgQ29udHJvbCBQYXRoIENvcmUgLiAKKyAgCisgICAgICAKKyAgQ29weXJpZ2h0IChjKSAyMDEwIFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICRIZWFkZXI6JCAkRGF0ZVRpbWU6ICQgJEF1dGhvcjogJAorCisKK3doZW4gICAgICAgIHdobyAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMDgvMTkvMTAgICAgbHRpICAgICBDcmVhdGVkIG1vZHVsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90eXBlLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX2FwaS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgUHJlcHJvY2Vzb3IgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKkludmFsaWQgc3RhdGlvbiBpbmRleCAqLworI2RlZmluZSBXRElfU1RBX0lOVkFMSURfSURYIDB4RkYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdESV9BZGRTdGFQYXJhbXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgd3B0X3VpbnQ4ICAgIHVjU1RBSWR4OyAKKyAgd3B0X3VpbnQ4ICAgIHVjV21tRW5hYmxlZDsKKyAgd3B0X3VpbnQ4ICAgIHVjSFRDYXBhYmxlOyAKKworICAvKiBNQUMgQWRkcmVzcyBvZiBTVEEgKi8KKyAgd3B0X21hY0FkZHIgc3RhTWFjQWRkcjsKKworICAvKk1BQyBBZGRyZXNzIG9mIHRoZSBCU1MqLworICB3cHRfbWFjQWRkciAgbWFjQlNTSUQ7CisKKyAgLyogRmllbGQgdG8gaW5kaWNhdGUgaWYgdGhpcyBpcyBzdGEgZW50cnkgZm9yIGl0c2VsZiBTVEEgYWRkaW5nIGVudHJ5IGZvciBpdHNlbGYKKyAgICAgb3IgcmVtb3RlIChBUCBhZGRpbmcgU1RBIGFmdGVyIHN1Y2Nlc3NmdWwgYXNzb2NpYXRpb24uCisgICAgIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgcmVxdWlyZWQgaW4gcHJvZHVjdGlvbiBkcml2ZXIuCisgICAgIDAgLSBTZWxmLCAxIG90aGVyL3JlbW90ZSwgMiAtIGJzc2lkICovCisgIHdwdF91aW50OCAgIHVjU3RhVHlwZTsgICAgICAgCisKKworICAvKkRQVSBJbmZvcm1hdGlvbiovCisgIHdwdF91aW50OCAgIGRwdUluZGV4OyAgICAgICAgICAgICAgICAgICAgICAvLyBEUFUgdGFibGUgaW5kZXgKKyAgd3B0X3VpbnQ4ICAgZHB1U2lnOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERQVSBzaWduYXR1cmUKKyAgd3B0X3VpbnQ4ICAgYmNhc3REcHVJbmRleDsKKyAgd3B0X3VpbnQ4ICAgYmNhc3REcHVTaWduYXR1cmU7CisgIHdwdF91aW50OCAgIGJjYXN0TWdtdERwdUluZGV4OworICB3cHRfdWludDggICBiY2FzdE1nbXREcHVTaWduYXR1cmU7CisKKworICAvKlJNRiBlbmFibGVkL2Rpc2FibGVkKi8KKyAgd3B0X3VpbnQ4ICAgdWNSbWZFbmFibGVkOworCisgIC8qIEluZGV4IGludG8gdGhlIEJTUyBTZXNzaW9uIHRhYmxlICovCisgIHdwdF91aW50OCAgIHVjQlNTSWR4OworCit9V0RJX0FkZFN0YVBhcmFtczsgCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXRElfU3RhU3RydWN0CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgd3B0X21hY0FkZHIgc3RhQWRkcjsgICAgICAgICAgICAgICAgLy8gU3RhIEFkZHIKKyAgICAgCisgIHdwdF91aW50OCB2YWxpZDoxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZWQvZnJlZSBmbGFnICAgIAorICB3cHRfdWludDggcm1mRW5hYmxlZDoxOworICB3cHRfdWludDggaHRFbmFibGVkOjE7CisKKyAgLyogMTFlIG9yIFdNTSBlbmFibGVkLCBmbGFnIHVzZWQgZm9yIGhlYWRlciBsZW5ndGgqLworICB3cHRfdWludDggcW9zRW5hYmxlZDoxOyAgICAgICAgIAorCisgIHdwdF91aW50OCBic3NJZHg7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJTUyBJbmRleAorICB3cHRfdWludDggc3RhSWQ7CisKKyAgd3B0X21hY0FkZHIgbWFjQlNTSUQ7CisgIC8vIEZpZWxkIHRvIGluZGljYXRlIGlmIHRoaXMgaXMgc3RhIGVudHJ5IGZvciBpdHNlbGYgU1RBIGFkZGluZyBlbnRyeSBmb3IgaXRzZWxmCisgIC8vIG9yIHJlbW90ZSAoQVAgYWRkaW5nIFNUQSBhZnRlciBzdWNjZXNzZnVsIGFzc29jaWF0aW9uLgorICAvLyBUaGlzIG1heSBvciBtYXkgbm90IGJlIHJlcXVpcmVkIGluIHByb2R1Y3Rpb24gZHJpdmVyLgorICAvLyAwIC0gU2VsZiwgMSBvdGhlci9yZW1vdGUsIDIgLSBic3NpZAorICB3cHRfdWludDggICB1Y1N0YVR5cGU7ICAgICAgIAorCisKKyAgLypEUFUgSW5mb3JtYXRpb24qLworICB3cHRfdWludDggZHB1SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgIC8vIERQVSB0YWJsZSBpbmRleAorICB3cHRfdWludDggZHB1U2lnOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERQVSBzaWduYXR1cmUKKyAgd3B0X3VpbnQ4IGJjYXN0RHB1SW5kZXg7CisgIHdwdF91aW50OCBiY2FzdERwdVNpZ25hdHVyZTsKKyAgd3B0X3VpbnQ4IGJjYXN0TWdtdERwdUluZGV4OworICB3cHRfdWludDggYmNhc3RNZ210RHB1U2lnbmF0dXJlOworICAgICAKK30gV0RJX1N0YVN0cnVjdDsKKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZUluaXQgLSBJbml0aWFsaXplcyB0aGUgU1RBIHRhYmxlcy4gCisgICAgICAgIEFsbG9jYXRlcyB0aGUgbmVjZXNhcnkgbWVtb3J5LgorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgV0RJX1NUQVRhYmxlSW5pdAorKAorICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4CispOworCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlU3RhcnQgLSByZXNldHMgdGhlIG1heCBhbmQgbnVtYmVyIHZhbHVlcyBvZiAKKyAgICAgICAgU1RBdGlvbnMKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NUQVRhYmxlU3RhcnQKKygKKyAgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgKKyk7CisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVTdG9wIC0gY2xlYXJzIHRoZSBzdGEgdGFibGUKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NUQVRhYmxlU3RvcAorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eAorKTsKKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZUNsb3NlIC0gZnJlZXMgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBTVEEgCisgICAgICAgIHRhYmxlLgorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVDbG9zZQorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgKKyk7CisKKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZUFkZFN0YSAtIEZ1bmN0aW9uIHRvIEFkZCBTdGF0aW9uCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcHdkaVBhcmFtOiAgIHN0YXRpb24gcGFyYW1ldGVycyAgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9TVEFUYWJsZUFkZFN0YQorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgICBXRElfQWRkU3RhUGFyYW1zKiAgICAgIHB3ZGlQYXJhbQorKTsKKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZURlbFN0YSAtIEZ1bmN0aW9uIHRvIERlbGV0ZSBhIFN0YXRpb24KKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgdWNTVEFJZHg6ICAgICAgICBzdGF0aW9uIHRvIGJlIGRlbGV0ZWQKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1NUQVRhYmxlRGVsU3RhCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNTVEFJZHgKKyk7CisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVCU1NEZWxTdGEgLSBGdW5jdGlvbiB0byBEZWxldGUgU3RhdGlvbnMgaW4gdGhpcyBCU1MKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgYnNzSWR4OiAgICAgICAgQlNTIGluZGV4IAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfU1RBVGFibGVCU1NEZWxTdGEKKygKKyAgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y0Jzc0lkeAorKTsKKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZUdldFN0YUJTU0lEQWRkciAtIEdldHMgdGhlIEJTU0lEIGFzc29jaWF0ZWQgCisgICAgICAgIHdpdGggdGhpcyBzdGF0aW9uCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHVjU1RBSWR4OiAgICAgICAgc3RhdGlvbiBpbmRleAorICAgICAgICAgcG1hY0JTU0lEOiAgICAgIG91dCBCU1NJRCBmb3IgdGhpcyBTVEEKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TVEFUYWJsZUdldFN0YUJTU0lEQWRkcgorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwgIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNTVEFJZHgsIAorICAgIHdwdF9tYWNBZGRyKiAgICAgICAgICAgcG1hY0JTU0lECispOworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZUdldFN0YVFvc0VuYWJsZWQgLSBHZXRzIGlzIHFvcyBpcyBlbmFibGVkIAorICAgICAgICBmb3IgYSBzdGEKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgdWNTVEFJZHg6ICAgICAgICBzdGF0aW9uIGluZGV4CisgICAgICAgICBxb3NFbmFibGVkOiAgICAgIG91dCBxb3MgZW5hYmxlZAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NUQVRhYmxlR2V0U3RhUW9zRW5hYmxlZAorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwgIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNTVEFJZHgsIAorICAgIHdwdF91aW50OCogICAgICAgICAgICAgcW9zRW5hYmxlZAorKTsKKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZVNldFN0YVFvc0VuYWJsZWQgLSBzZXQgcW9zIG1vZGUgZm9yIFNUQQorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgdWNTVEFJZHg6ICAgc3RhdGlvbiBpbmRleAorICAgICAgICAgcW9zRW5hYmxlZDogcW9zIGVuYWJsZWQKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TVEFUYWJsZVNldFN0YVFvc0VuYWJsZWQKKygKKyAgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsICAKKyAgICB3cHRfdWludDggICAgICAgICAgICAgIHVjU1RBSWR4LCAKKyAgICB3cHRfdWludDggICAgICAgICAgICAgIHFvc0VuYWJsZWQKKyk7CisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVHZXRTdGFUeXBlIC0gZ2V0IHN0YSB0eXBlIGZvciBTVEEKKworIAorIEBwYXJhbSAgcFdESUN0eDogICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgdWNTVEFJZHg6ICBzdGF0aW9uIGluZGV4CisgICAgICAgICBwU3RhVHlwZTogIHFvcyBlbmFibGVkCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVHZXRTdGFUeXBlCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1NUQUlkeCwgCisgICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICBwU3RhVHlwZQorKTsKKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZVNldFN0YVR5cGUgLSBzZXRzIHN0YSB0eXBlIGZvciBTVEEKKworIAorIEBwYXJhbSAgcFdESUN0eDogICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgdWNTVEFJZHg6ICBzdGF0aW9uIGluZGV4CisgICAgICAgICBzdGFUeXBlOiAgIHN0YSB0eXBlCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVTZXRTdGFUeXBlCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1NUQUlkeCwgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICBzdGFUeXBlCispOworCisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVGaW5kU3RhaWRCeUFkZHIgLSBHaXZlbiBhIHN0YXRpb24gbWFjIGFkZHJlc3MsIHNlYXJjaAorICAgICAgICBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGlvbiBpbmRleCBmcm9tIHRoZSBTdGF0aW9uIFRhYmxlLgorIAorIEBwYXJhbSAgcFdESUN0eDogIFdESSBDb250ZXh0IHBvaW50ZXIKKyAgICAgICAgIHN0YUFkZHI6ICBzdGF0aW9uIGFkZHJlc3MKKyAgICAgICAgIHB1Y1N0YUlkOiBvdXRwdXQgc3RhdGlvbiBpZCAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1NUQVRhYmxlRmluZFN0YWlkQnlBZGRyCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAKKyAgICB3cHRfbWFjQWRkciAgICAgICAgICAgIHN0YUFkZHIsIAorICAgIHdwdF91aW50OCogICAgICAgICAgICAgcHVjU3RhSWQKKyk7CisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVHZXRTdGFBZGRyIC0gZ2V0IHN0YXRpb24gYWRkcmVzcworIAorIEBwYXJhbSAgcFdESUN0eDogIFdESSBDb250ZXh0IHBvaW50ZXIKKyAgICAgICAgIHVjU1RBSWR4OiAgc3RhdGlvbiBpbmRleAorICAgICAgICAgcFN0YUFkZHI6IG91dHB1dCBzdGF0aW9uIGFkZHJlc3MgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVHZXRTdGFBZGRyCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1NUQUlkeCwgCisgICAgd3B0X3VpbnQ4KiogICAgICAgICAgICBwU3RhQWRkcgorKTsKKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZVNldFN0YUFkZHIgLSBzZXQgc3RhdGlvbiBhZGRyZXNzCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgV0RJIENvbnRleHQgcG9pbnRlcgorICAgICAgICAgdWNTVEFJZHg6ICAgc3RhdGlvbiBpbmRleAorICAgICAgICAgcFN0YUFkZHI6IG91dHB1dCBzdGF0aW9uIGFkZHJlc3MgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVTZXRTdGFBZGRyCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1NUQUlkeCwgCisgICAgd3B0X21hY0FkZHIgICAgICAgICAgICBzdGFBZGRyCispOworCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlU2V0QlNTSUQgLSBzZXQgc3RhdGlvbiBjb3JyZXNwb25kaW5nIEJTU0lECisgCisgQHBhcmFtICBwV0RJQ3R4OiAgV0RJIENvbnRleHQgcG9pbnRlcgorICAgICAgICAgdWNTVEFJZHg6ICAgc3RhdGlvbiBpbmRleAorICAgICAgICAgcFN0YUFkZHI6IG91dHB1dCBzdGF0aW9uIGFkZHJlc3MgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVTZXRCU1NJRAorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwgIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNTVEFJZHgsIAorICAgIHdwdF9tYWNBZGRyICAgICAgICAgICAgbWFjQlNTSUQKKyk7CisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVTZXRCU1NJZHggLSBzZXQgc3RhdGlvbiBjb3JyZXNwb25kaW5nIEJTUyBpbmRleAorIAorIEBwYXJhbSAgcFdESUN0eDogIFdESSBDb250ZXh0IHBvaW50ZXIKKyAgICAgICAgIHVjU1RBSWR4OiAgIHN0YXRpb24gaW5kZXgKKyAgICAgICAgIGJzc0lkeDogICBCU1MgaW5kZXggCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVTZXRCU1NJZHgKKygKKyAgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsICAKKyAgICB3cHRfdWludDggICAgICAgICAgICAgIHVjU1RBSWR4LCAKKyAgICB3cHRfdWludDggICAgICAgICAgICAgIHVjQlNTSWR4CispOworCisjZW5kaWYgLypXTEFOX1FDVF9XRElfU1RBX0gqLworCmRpZmYgLS1naXQgYS9DT1JFL1dESS9DUC9zcmMvd2xhbl9xY3Rfd2RpLmMgYi9DT1JFL1dESS9DUC9zcmMvd2xhbl9xY3Rfd2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhOTUzNgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL0NQL3NyYy93bGFuX3FjdF93ZGkuYwpAQCAtMCwwICsxLDI0MTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICBXIEwgQSBOIF8gUSBDIFQgXyBXIEQgSS4gQworCisgIE9WRVJWSUVXOgorCisgIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gRGV2aWNlIEFic3RyYWN0aW9uICAgICAKKyAgTGF5ZXIgSW50ZXJmYWNlLgorCisgIFRoZSBmdW5jdGlvbnMgZXh0ZXJuYWxpemVkIGJ5IHRoaXMgbW9kdWxlIGFyZSB0byBiZSBjYWxsZWQgYnkgYW55IHVwcGVyICAgICAKKyAgTUFDIGltcGxlbWVudGF0aW9uIHRoYXQgd2lzaGVzIHRvIHVzZSB0aGUgV0xBTiBEZXZpY2UuCisKKyAgREVQRU5ERU5DSUVTOgorCisgIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgorCisKKyAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisKKyAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCisgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKKworICAgJEhlYWRlciQkRGF0ZVRpbWUkJEF1dGhvciQKKworCisgIHdoZW4gICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQorLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEwLzA1LzExICAgICAgaGFwICAgICBBZGRpbmcgc3VwcG9ydCBmb3IgS2VlcCBBbGl2ZQorMjAxMC0wOC0wOSAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpLmgiIAorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9pLmgiIAorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9zdGEuaCIgCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2RwLmgiIAorCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2N0cy5oIiAKKworI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zdGF0dXMuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfc3luYy5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9tc2cuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHJhY2UuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfcGFja2V0LmgiCisKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfZHRzLmgiIAorCisjaW5jbHVkZSAid2xhbl9oYWxfbXNnLmgiCisKKyNpZmRlZiBBTklfTUFORl9ESUFHCisjaW5jbHVkZSAicHR0TXNnQXBpLmgiCisjZW5kaWYgLyogQU5JX01BTkZfRElBRyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgV0xBTiBEQUwgQ29udHJvbCBQYXRoIEludGVybmFsIERhdGEgRGVmaW5pdGlvbnMgYW5kIERlY2xhcmF0aW9ucyAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBXRElfV0NUU19BQ1RJT05fVElNRU9VVCAgICAgICAyMDAwIC8qIGluIG1zZWMgYSB2ZXJ5IGhpZ2ggdXBwZXIgbGltaXQgKi8KKworCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisjZGVmaW5lIFdESV9QTk9fVkVSU0lPTl9NQVNLIDB4ODAwMAorI2VuZGlmCisKKy8qIGhvc3QgY2FwYWJpbGl0eSBiaXRtYXAgZ2xvYmFsICovCitzdGF0aWMgdFdsYW5GZWF0Q2FwcyAqZ3BIb3N0V2xhbkZlYXRDYXBzID0gTlVMTDsKKy8qIEZXIGNhcGFiaWxpdHkgYml0bWFwIGdsb2JhbCAqLworc3RhdGljIHRXbGFuRmVhdENhcHMgKmdwRndXbGFuRmVhdENhcHMgPSBOVUxMOworLyogYXJyYXkgb2YgZmVhdHVyZXMgc3VwcG9ydGVkLiBOZWVkIHRvIGFkZCBhIG5ldyBmZWF0dXJlCisgKiBhbmQgb3RoZXIgdHdvIHBsYWNlcyAtIHdsYW5faGFsX21zZy5oIGFuZCBoYWxNc2cuYyAoRlcgZmlsZSkKKyAqLworc3RhdGljIHBsYWNlSG9sZGVySW5DYXBCaXRtYXAgc3VwcG9ydEVuYWJsZWRGZWF0dXJlc1tdID0KKyAgIHtNQ0MsIFAyUH07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICBXTEFOIERBTCAgU3RhdGUgTWFjaGluZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1dQVF9TVEFUSUMgY29uc3QgV0RJX01haW5Gc21FbnRyeVR5cGUgd2RpTWFpbkZTTVtXRElfTUFYX1NUXSA9IAoreworICAvKldESV9JTklUX1NUKi8KKyAge3sKKyAgICBXRElfTWFpblN0YXJ0LCAgICAgICAgICAgICAgLypXRElfU1RBUlRfRVZFTlQqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKldESV9TVE9QX0VWRU5UKi8KKyAgICBXRElfTWFpblJlcUJ1c3ksICAgICAgICAgICAgLypXRElfUkVRVUVTVF9FVkVOVCovCisgICAgV0RJX01haW5Sc3BJbml0LCAgICAgICAgICAgIC8qV0RJX1JFU1BPTlNFX0VWRU5UKi8KKyAgICBXRElfTWFpbkNsb3NlLCAgICAgICAgICAgICAgLypXRElfQ0xPU0VfRVZFTlQqLworICAgIFdESV9NYWluU2h1dGRvd24gICAgICAgICAgICAvKldESV9TSFVURE9XTl9FVkVOVCovCisgIH19LAorCisgIC8qV0RJX1NUQVJURURfU1QqLworICB7eworICAgIFdESV9NYWluU3RhcnRTdGFydGVkLCAgICAgICAvKldESV9TVEFSVF9FVkVOVCovCisgICAgV0RJX01haW5TdG9wU3RhcnRlZCwgICAgICAgIC8qV0RJX1NUT1BfRVZFTlQqLworICAgIFdESV9NYWluUmVxU3RhcnRlZCwgICAgICAgICAvKldESV9SRVFVRVNUX0VWRU5UKi8KKyAgICBXRElfTWFpblJzcCwgICAgICAgICAgICAgICAgLypXRElfUkVTUE9OU0VfRVZFTlQqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKldESV9DTE9TRV9FVkVOVCovCisgICAgV0RJX01haW5TaHV0ZG93biAgICAgICAgICAgIC8qV0RJX1NIVVRET1dOX0VWRU5UKi8KKyAgfX0sCisKKyAgLypXRElfU1RPUFBFRF9TVCovCisgIHt7CisgICAgV0RJX01haW5TdGFydCwgICAgICAgICAgICAgIC8qV0RJX1NUQVJUX0VWRU5UKi8KKyAgICBXRElfTWFpblN0b3BTdG9wcGVkLCAgICAgICAgLypXRElfU1RPUF9FVkVOVCovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qV0RJX1JFUVVFU1RfRVZFTlQqLworICAgIFdESV9NYWluUnNwLCAgICAgICAgICAgICAgICAvKldESV9SRVNQT05TRV9FVkVOVCovCisgICAgV0RJX01haW5DbG9zZSwgICAgICAgICAgICAgIC8qV0RJX0NMT1NFX0VWRU5UKi8KKyAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLypXRElfU0hVVERPV05fRVZFTlQqLworICB9fSwKKworICAvKldESV9CVVNZX1NUKi8KKyAge3sKKyAgICBXRElfTWFpblN0YXJ0QnVzeSwgICAgICAgICAgLypXRElfU1RBUlRfRVZFTlQqLworICAgIFdESV9NYWluU3RvcEJ1c3ksICAgICAgICAgICAvKldESV9TVE9QX0VWRU5UKi8KKyAgICBXRElfTWFpblJlcUJ1c3ksICAgICAgICAgICAgLypXRElfUkVRVUVTVF9FVkVOVCovCisgICAgV0RJX01haW5Sc3AsICAgICAgICAgICAgICAgIC8qV0RJX1JFU1BPTlNFX0VWRU5UKi8KKyAgICBXRElfTWFpbkNsb3NlQnVzeSwgICAgICAgICAgLypXRElfQ0xPU0VfRVZFTlQqLworICAgIFdESV9NYWluU2h1dGRvd25CdXN5ICAgICAgICAvKldESV9TSFVURE9XTl9FVkVOVCovCisgIH19Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgREFMIFJlcXVlc3QgUHJvY2Vzc2luZyBBcnJheSAgLSB0aGUgZnVuY3Rpb25zIGluIHRoaXMgdGFibGUgd2lsbCBvbmx5IGJlCisgIGNhbGxlZCB3aGVuIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBzcGVjaWZpYyByZXF1ZXN0IGlzIGFsbG93ZWQgYnkgdGhlCisgIE1haW4gRlNNIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitXRElfUmVxUHJvY0Z1bmNUeXBlICBwZm5SZXFQcm9jVGJsW1dESV9NQVhfVU1BQ19JTkRdID0gCit7CisgIC8qSU5JVCovCisgIFdESV9Qcm9jZXNzU3RhcnRSZXEsICAgICAgLyogV0RJX1NUQVJUX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NTdG9wUmVxLCAgICAgICAvKiBXRElfU1RPUF9SRVEgICovCisgIFdESV9Qcm9jZXNzQ2xvc2VSZXEsICAgICAgLyogV0RJX0NMT1NFX1JFUSAgKi8KKworICAvKlNDQU4qLworICBXRElfUHJvY2Vzc0luaXRTY2FuUmVxLCAgIC8qIFdESV9JTklUX1NDQU5fUkVRICAqLworICBXRElfUHJvY2Vzc1N0YXJ0U2NhblJlcSwgIC8qIFdESV9TVEFSVF9TQ0FOX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NFbmRTY2FuUmVxLCAgICAvKiBXRElfRU5EX1NDQU5fUkVRICAqLworICBXRElfUHJvY2Vzc0ZpbmlzaFNjYW5SZXEsIC8qIFdESV9GSU5JU0hfU0NBTl9SRVEgICovCisKKyAgLypBU1NPQ0lBVElPTiovCisgIFdESV9Qcm9jZXNzSm9pblJlcSwgICAgICAgLyogV0RJX0pPSU5fUkVRICAqLworICBXRElfUHJvY2Vzc0NvbmZpZ0JTU1JlcSwgIC8qIFdESV9DT05GSUdfQlNTX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NEZWxCU1NSZXEsICAgICAvKiBXRElfREVMX0JTU19SRVEgICovCisgIFdESV9Qcm9jZXNzUG9zdEFzc29jUmVxLCAgLyogV0RJX1BPU1RfQVNTT0NfUkVRICAqLworICBXRElfUHJvY2Vzc0RlbFNUQVJlcSwgICAgIC8qIFdESV9ERUxfU1RBX1JFUSAgKi8KKworICAvKiBTZWN1cml0eSAqLworICBXRElfUHJvY2Vzc1NldEJzc0tleVJlcSwgICAgICAgIC8qIFdESV9TRVRfQlNTX0tFWV9SRVEgICovCisgIFdESV9Qcm9jZXNzUmVtb3ZlQnNzS2V5UmVxLCAgICAgLyogV0RJX1JNVl9CU1NfS0VZX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NTZXRTdGFLZXlSZXEsICAgICAgICAvKiBXRElfU0VUX1NUQV9LRVlfUkVRICAqLworICBXRElfUHJvY2Vzc1JlbW92ZVN0YUtleVJlcSwgICAgIC8qIFdESV9STVZfQlNTX0tFWV9SRVEgICovCisKKyAgLyogUW9TIGFuZCBCQSBBUElzICovCisgIFdESV9Qcm9jZXNzQWRkVFNwZWNSZXEsICAgICAgICAgIC8qIFdESV9BRERfVFNfUkVRICAqLworICBXRElfUHJvY2Vzc0RlbFRTcGVjUmVxLCAgICAgICAgICAvKiBXRElfREVMX1RTX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NVcGRhdGVFRENBUGFyYW1zUmVxLCAgLyogV0RJX1VQRF9FRENBX1BSTVNfUkVRICAqLworICBXRElfUHJvY2Vzc0FkZEJBU2Vzc2lvblJlcSwgICAgICAvKiBXRElfQUREX0JBX1NFU1NJT05fUkVRICAqLworICBXRElfUHJvY2Vzc0RlbEJBUmVxLCAgICAgICAgICAgICAvKiBXRElfREVMX0JBX1JFUSAgKi8KKworICAvKiBNaXNjZWxsYW5lb3VzIENvbnRyb2wgQVBJcyAqLworICBXRElfUHJvY2Vzc0NoYW5uZWxTd2l0Y2hSZXEsICAgICAvKiBXRElfQ0hfU1dJVENIX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NDb25maWdTdGFSZXEsICAgICAgICAgLyogV0RJX0NPTkZJR19TVEFfUkVRICAqLworICBXRElfUHJvY2Vzc1NldExpbmtTdGF0ZVJlcSwgICAgICAvKiBXRElfU0VUX0xJTktfU1RfUkVRICAqLworICBXRElfUHJvY2Vzc0dldFN0YXRzUmVxLCAgICAgICAgICAvKiBXRElfR0VUX1NUQVRTX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NVcGRhdGVDZmdSZXEsICAgICAgICAgLyogV0RJX1VQREFURV9DRkdfUkVRICAqLworCisgIC8qQkEgQVBJcyovCisgIFdESV9Qcm9jZXNzQWRkQkFSZXEsICAgICAgICAgICAgIC8qIFdESV9BRERfQkFfUkVRICAqLworICBXRElfUHJvY2Vzc1RyaWdnZXJCQVJlcSwgICAgICAgICAvKiBXRElfVFJJR0dFUl9CQV9SRVEgICovCisKKyAgLypCZWFjb24gcHJvY2Vzc2luZyBBUElzKi8KKyAgV0RJX1Byb2Nlc3NVcGRhdGVCZWFjb25QYXJhbXNSZXEsIC8qIFdESV9VUERfQkNPTl9QUk1TX1JFUSAqLworICBXRElfUHJvY2Vzc1NlbmRCZWFjb25QYXJhbXNSZXEsIC8qIFdESV9TTkRfQkNPTl9SRVEgKi8KKworICBXRElfUHJvY2Vzc1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSZXEsIC8qIFdESV9VUERfUFJPQkVfUlNQX1RFTVBMQVRFX1JFUSAqLworICBXRElfUHJvY2Vzc1NldFN0YUJjYXN0S2V5UmVxLCAgICAgICAgLyogV0RJX1NFVF9TVEFfQkNBU1RfS0VZX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NSZW1vdmVTdGFCY2FzdEtleVJlcSwgICAgIC8qIFdESV9STVZfU1RBX0JDQVNUX0tFWV9SRVEgICovCisgIFdESV9Qcm9jZXNzU2V0TWF4VHhQb3dlclJlcSwgICAgICAgICAvKldESV9TRVRfTUFYX1RYX1BPV0VSX1JFUSovCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICBXRElfUHJvY2Vzc1AyUEdPTk9BUmVxLCAgICAgICAgICAgICAgLyogV0RJX1AyUF9HT19OT1RJQ0VfT0ZfQUJTRU5DRV9SRVEgKi8KKyNlbHNlCisgIE5VTEwsCisjZW5kaWYKKyAgLyogUG93ZXJTYXZlIEFQSXMgKi8KKyAgV0RJX1Byb2Nlc3NFbnRlckltcHNSZXEsICAgICAgICAgLyogV0RJX0VOVEVSX0lNUFNfUkVRICAqLworICBXRElfUHJvY2Vzc0V4aXRJbXBzUmVxLCAgICAgICAgICAvKiBXRElfRVhJVF9JTVBTX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NFbnRlckJtcHNSZXEsICAgICAgICAgLyogV0RJX0VOVEVSX0JNUFNfUkVRICAqLworICBXRElfUHJvY2Vzc0V4aXRCbXBzUmVxLCAgICAgICAgICAvKiBXRElfRVhJVF9CTVBTX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NFbnRlclVhcHNkUmVxLCAgICAgICAgLyogV0RJX0VOVEVSX1VBUFNEX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NFeGl0VWFwc2RSZXEsICAgICAgICAgLyogV0RJX0VYSVRfVUFQU0RfUkVRICAqLworICBXRElfUHJvY2Vzc1NldFVhcHNkQWNQYXJhbXNSZXEsICAvKiBXRElfU0VUX1VBUFNEX1BBUkFNX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NVcGRhdGVVYXBzZFBhcmFtc1JlcSwgLyogV0RJX1VQREFURV9VQVBTRF9QQVJBTV9SRVEgICovCisgIFdESV9Qcm9jZXNzQ29uZmlndXJlUnhwRmlsdGVyUmVxLCAvKiBXRElfQ09ORklHVVJFX1JYUF9GSUxURVJfUkVRICAqLworICBXRElfUHJvY2Vzc1NldEJlYWNvbkZpbHRlclJlcSwgICAvKiBXRElfU0VUX0JFQUNPTl9GSUxURVJfUkVRICAqLworICBXRElfUHJvY2Vzc1JlbUJlYWNvbkZpbHRlclJlcSwgICAvKiBXRElfUkVNX0JFQUNPTl9GSUxURVJfUkVRICAqLworICBXRElfUHJvY2Vzc1NldFJTU0lUaHJlc2hvbGRzUmVxLCAvKiBXRElfU0VUX1JTU0lfVEhSRVNIT0xEU19SRVEgICovCisgIFdESV9Qcm9jZXNzSG9zdE9mZmxvYWRSZXEsICAgICAgIC8qIFdESV9IT1NUX09GRkxPQURfUkVRICAqLworICBXRElfUHJvY2Vzc1dvd2xBZGRCY1B0cm5SZXEsICAgICAvKiBXRElfV09XTF9BRERfQkNfUFRSTl9SRVEgICovCisgIFdESV9Qcm9jZXNzV293bERlbEJjUHRyblJlcSwgICAgIC8qIFdESV9XT1dMX0RFTF9CQ19QVFJOX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NXb3dsRW50ZXJSZXEsICAgICAgICAgLyogV0RJX1dPV0xfRU5URVJfUkVRICAqLworICBXRElfUHJvY2Vzc1dvd2xFeGl0UmVxLCAgICAgICAgICAvKiBXRElfV09XTF9FWElUX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NDb25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVSZXEsIC8qIFdESV9DT05GSUdVUkVfQVBQU19DUFVfV0FLRVVQX1NUQVRFX1JFUSAgKi8KKyAgLypOViBEb3dubG9hZCBBUElzKi8KKyAgV0RJX1Byb2Nlc3NOdkRvd25sb2FkUmVxLCAgICAgIC8qIFdESV9OVl9ET1dOTE9BRF9SRVEqLworICBXRElfUHJvY2Vzc0ZsdXNoQWNSZXEsICAgICAgICAgICAvKiBXRElfRkxVU0hfQUNfUkVRICAqLworICBXRElfUHJvY2Vzc0J0QW1wRXZlbnRSZXEsICAgICAgICAvKiBXRElfQlRBTVBfRVZFTlRfUkVRICAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgIFdESV9Qcm9jZXNzQWdnckFkZFRTcGVjUmVxLCAgICAgIC8qIFdESV9BR0dSX0FERF9UU19SRVEgKi8KKyNlbHNlCisgIE5VTEwsCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKyAgV0RJX1Byb2Nlc3NBZGRTVEFTZWxmUmVxLCAgICAgICAgIC8qIFdESV9BRERfU1RBX1NFTEZfUkVRICovCisgIFdESV9Qcm9jZXNzRGVsU1RBU2VsZlJlcSwgICAgICAgICAgLyogV0RJIERFTCBTVEEgU0VMRiBSRVEgKi8KKyNpZmRlZiBBTklfTUFORl9ESUFHCisgIFdESV9Qcm9jZXNzRlRNQ29tbWFuZFJlcSwgICAgICAgICAgICAvKiBXRElfRlRNX0NNRF9SRVEgKi8KKyNlbHNlCisgIE5VTEwsCisjZW5kaWYgLyogQU5JX01BTkZfRElBRyAqLworICAKKyAgTlVMTCwKKyAgV0RJX1Byb2Nlc3NIb3N0UmVzdW1lUmVxLCAgICAgICAgICAgIC8qV0RJX0hPU1RfUkVTVU1FX1JFUSovCisgIAorICBXRElfUHJvY2Vzc0tlZXBBbGl2ZVJlcSwgICAgICAgLyogV0RJX0tFRVBfQUxJVkVfUkVRICovICAgIAorCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisgIFdESV9Qcm9jZXNzU2V0UHJlZmVycmVkTmV0d29ya1JlcSwgIC8qIFdESV9TRVRfUFJFRl9ORVRXT1JLX1JFUSAqLworICBXRElfUHJvY2Vzc1NldFJzc2lGaWx0ZXJSZXEsICAgICAgICAvKiBXRElfU0VUX1JTU0lfRklMVEVSX1JFUSAqLworICBXRElfUHJvY2Vzc1VwZGF0ZVNjYW5QYXJhbXNSZXEsICAgICAvKiBXRElfVVBEQVRFX1NDQU5fUEFSQU1TX1JFUSAqLworI2Vsc2UKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8gKi8KKworICBXRElfUHJvY2Vzc1NldFR4UGVyVHJhY2tpbmdSZXEsICAgICAvKiBXRElfU0VUX1RYX1BFUl9UUkFDS0lOR19SRVEgICovCisgIAorI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisgIC8qIFdESV84MDIzX01VTFRJQ0FTVF9MSVNUX1JFUSAqLworICBXRElfUHJvY2VzczgwMjNNdWx0aWNhc3RMaXN0UmVxLCAgICAgICAgICAKKyAgLyogV0RJX1JFQ0VJVkVfRklMVEVSX1NFVF9GSUxURVJfUkVRICovCisgIFdESV9Qcm9jZXNzUmVjZWl2ZUZpbHRlclNldEZpbHRlclJlcSwgICAgIAorICAvKiBXRElfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JFUSAqLworICBXRElfUHJvY2Vzc0ZpbHRlck1hdGNoQ291bnRSZXEsICAgIAorICAvKiBXRElfUkVDRUlWRV9GSUxURVJfQ0xFQVJfRklMVEVSX1JFUSAqLworICBXRElfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlclJlcSwgICAKKyNlbHNlCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisjZW5kaWYgLy8gV0xBTl9GRUFUVVJFX1BBQ0tFVF9GSUxURVJJTkcKKyAgV0RJX1Byb2Nlc3NJbml0U2NhblJlcSwgICAgICAgICAgICAgICAvKiBXRElfSU5JVF9TQ0FOX0NPTl9SRVEgKi8gCisgIFdESV9Qcm9jZXNzSEFMRHVtcENtZFJlcSwgICAgICAgICAgICAgLypXRElfSEFMX0RVTVBfQ01EX1JFUSAqLworICBXRElfUHJvY2Vzc1NodXRkb3duUmVxLCAgICAgICAgICAgICAgIC8qIFdESV9TSFVURE9XTl9SRVEgICovCisKKyAgV0RJX1Byb2Nlc3NTZXRQb3dlclBhcmFtc1JlcSwgICAgICAgICAvKldESV9TRVRfUE9XRVJfUEFSQU1TX1JFUSovCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICBXRElfUHJvY2Vzc1RTTVN0YXRzUmVxLCAgICAgICAgICAvKiBXRElfVFNNX1NUQVRTX1JFUSAqLworI2Vsc2UKKyAgTlVMTCwKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisgIFdESV9Qcm9jZXNzR1RLT2ZmbG9hZFJlcSwgICAgICAgICAgLyogV0RJX0dUS19PRkZMT0FEX1JFUSAgKi8KKyAgV0RJX1Byb2Nlc3NHVEtPZmZsb2FkR2V0SW5mb1JlcSwgICAvKiBXRElfR1RLX09GRkxPQURfR0VUSU5GT19SRVEgICovCisjZWxzZQorICBOVUxMLAorICBOVUxMLAorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorCisgIFdESV9Qcm9jZXNzU2V0VG1MZXZlbFJlcSwgICAgICAgICAgICAgLypXRElfU0VUX1RNX0xFVkVMX1JFUSovCisgIFdESV9Qcm9jZXNzRmVhdHVyZUNhcHNFeGNoYW5nZVJlcSwgICAgLyogV0RJX0ZFQVRVUkVfQ0FQU19FWENIQU5HRV9SRVEgKi8KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSW5kaWNhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFdESV9Qcm9jZXNzSG9zdFN1c3BlbmRJbmQsICAgICAgICAgICAgLyogV0RJX0hPU1RfU1VTUEVORF9JTkQqLworfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgREFMIFJlcXVlc3QgUHJvY2Vzc2luZyBBcnJheSAgLSB0aGUgZnVuY3Rpb25zIGluIHRoaXMgdGFibGUgd2lsbCBvbmx5IGJlCisgIGNhbGxlZCB3aGVuIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBzcGVjaWZpYyByZXF1ZXN0IGlzIGFsbG93ZWQgYnkgdGhlCisgIE1haW4gRlNNIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitXRElfUnNwUHJvY0Z1bmNUeXBlICBwZm5Sc3BQcm9jVGJsW1dESV9NQVhfUkVTUF0gPSAKK3sKKyAgLypJTklUKi8KKyAgV0RJX1Byb2Nlc3NTdGFydFJzcCwgICAgICAgICAgICAvKiBXRElfU1RBUlRfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NTdG9wUnNwLCAgICAgICAgICAgICAvKiBXRElfU1RPUF9SRVNQICAqLworICBXRElfUHJvY2Vzc0Nsb3NlUnNwLCAgICAgICAgICAgIC8qIFdESV9DTE9TRV9SRVNQICAqLworCisgIC8qU0NBTiovCisgIFdESV9Qcm9jZXNzSW5pdFNjYW5Sc3AsICAgICAgICAgLyogV0RJX0lOSVRfU0NBTl9SRVNQICAqLworICBXRElfUHJvY2Vzc1N0YXJ0U2NhblJzcCwgICAgICAgIC8qIFdESV9TVEFSVF9TQ0FOX1JFU1AgICovCisgIFdESV9Qcm9jZXNzRW5kU2NhblJzcCwgICAgICAgICAgLyogV0RJX0VORF9TQ0FOX1JFU1AgICovCisgIFdESV9Qcm9jZXNzRmluaXNoU2NhblJzcCwgICAgICAgLyogV0RJX0ZJTklTSF9TQ0FOX1JFU1AgICovCisKKyAgLyogQVNTT0NJQVRJT04qLworICBXRElfUHJvY2Vzc0pvaW5Sc3AsICAgICAgICAgICAgIC8qIFdESV9KT0lOX1JFU1AgICovCisgIFdESV9Qcm9jZXNzQ29uZmlnQlNTUnNwLCAgICAgICAgLyogV0RJX0NPTkZJR19CU1NfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NEZWxCU1NSc3AsICAgICAgICAgICAvKiBXRElfREVMX0JTU19SRVNQICAqLworICBXRElfUHJvY2Vzc1Bvc3RBc3NvY1JzcCwgICAgICAgIC8qIFdESV9QT1NUX0FTU09DX1JFU1AgICovCisgIFdESV9Qcm9jZXNzRGVsU1RBUnNwLCAgICAgICAgICAgLyogV0RJX0RFTF9TVEFfUkVTUCAgKi8KKworICAvKiBTZWN1cml0eSAqLworICBXRElfUHJvY2Vzc1NldEJzc0tleVJzcCwgICAgICAgIC8qIFdESV9TRVRfQlNTX0tFWV9SRVNQICAqLworICBXRElfUHJvY2Vzc1JlbW92ZUJzc0tleVJzcCwgICAgIC8qIFdESV9STVZfQlNTX0tFWV9SRVNQICAqLworICBXRElfUHJvY2Vzc1NldFN0YUtleVJzcCwgICAgICAgIC8qIFdESV9TRVRfU1RBX0tFWV9SRVNQICAqLworICBXRElfUHJvY2Vzc1JlbW92ZVN0YUtleVJzcCwgICAgIC8qIFdESV9STVZfQlNTX0tFWV9SRVNQICAqLworCisgIC8qIFFvUyBhbmQgQkEgQVBJcyAqLworICBXRElfUHJvY2Vzc0FkZFRTcGVjUnNwLCAgICAgICAgICAvKiBXRElfQUREX1RTX1JFU1AgICovCisgIFdESV9Qcm9jZXNzRGVsVFNwZWNSc3AsICAgICAgICAgIC8qIFdESV9ERUxfVFNfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NVcGRhdGVFRENBUGFyYW1zUnNwLCAgLyogV0RJX1VQRF9FRENBX1BSTVNfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NBZGRCQVNlc3Npb25Sc3AsICAgICAgLyogV0RJX0FERF9CQV9TRVNTSU9OX1JFU1AgICovCisgIFdESV9Qcm9jZXNzRGVsQkFSc3AsICAgICAgICAgICAgIC8qIFdESV9ERUxfQkFfUkVTUCAgKi8KKworICAvKiBNaXNjZWxsYW5lb3VzIENvbnRyb2wgQVBJcyAqLworICBXRElfUHJvY2Vzc0NoYW5uZWxTd2l0Y2hSc3AsICAgICAvKiBXRElfQ0hfU1dJVENIX1JFU1AgICovCisgIFdESV9Qcm9jZXNzQ29uZmlnU3RhUnNwLCAgICAgICAgIC8qIFdESV9DT05GSUdfU1RBX1JFU1AgICovCisgIFdESV9Qcm9jZXNzU2V0TGlua1N0YXRlUnNwLCAgICAgIC8qIFdESV9TRVRfTElOS19TVF9SRVNQICAqLworICBXRElfUHJvY2Vzc0dldFN0YXRzUnNwLCAgICAgICAgICAvKiBXRElfR0VUX1NUQVRTX1JFU1AgICovCisgIFdESV9Qcm9jZXNzVXBkYXRlQ2ZnUnNwLCAgICAgICAgIC8qIFdESV9VUERBVEVfQ0ZHX1JFU1AgICovCisKKyAgLyogQkEgQVBJcyovCisgIFdESV9Qcm9jZXNzQWRkQkFSc3AsICAgICAgICAgICAgIC8qIFdESV9BRERfQkFfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NUcmlnZ2VyQkFSc3AsICAgICAgICAgLyogV0RJX1RSSUdHRVJfQkFfUkVTUCAgKi8KKyAgCisgIC8qIElCU1MgQVBJcyovCisgIFdESV9Qcm9jZXNzVXBkYXRlQmVhY29uUGFyYW1zUnNwLCAvKiBXRElfVVBEX0JDT05fUFJNU19SU1AgKi8KKyAgV0RJX1Byb2Nlc3NTZW5kQmVhY29uUGFyYW1zUnNwLCAgIC8qIFdESV9TTkRfQkNPTl9SU1AgKi8KKworICAvKlNvZnQgQVAgQVBJcyovCisgIFdESV9Qcm9jZXNzVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZVJzcCwvKldESV9VUERfUFJPQkVfUlNQX1RFTVBMQVRFX1JFU1AgKi8KKyAgV0RJX1Byb2Nlc3NTZXRTdGFCY2FzdEtleVJzcCwgICAgICAgIC8qV0RJX1NFVF9TVEFfQkNBU1RfS0VZX1JFU1AgKi8KKyAgV0RJX1Byb2Nlc3NSZW1vdmVTdGFCY2FzdEtleVJzcCwgICAgIC8qV0RJX1JNVl9TVEFfQkNBU1RfS0VZX1JFU1AgKi8KKyAgV0RJX1Byb2Nlc3NTZXRNYXhUeFBvd2VyUnNwLCAgICAgICAgIC8qV0RJX1NFVF9NQVhfVFhfUE9XRVJfUkVTUCAqLworCisgIC8qIFBvd2VyU2F2ZSBBUElzICovCisgIFdESV9Qcm9jZXNzRW50ZXJJbXBzUnNwLCAgICAgICAgIC8qIFdESV9FTlRFUl9JTVBTX1JFU1AgICovCisgIFdESV9Qcm9jZXNzRXhpdEltcHNSc3AsICAgICAgICAgIC8qIFdESV9FWElUX0lNUFNfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NFbnRlckJtcHNSc3AsICAgICAgICAgLyogV0RJX0VOVEVSX0JNUFNfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NFeGl0Qm1wc1JzcCwgICAgICAgICAgLyogV0RJX0VYSVRfQk1QU19SRVNQICAqLworICBXRElfUHJvY2Vzc0VudGVyVWFwc2RSc3AsICAgICAgICAvKiBXRElfRU5URVJfVUFQU0RfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NFeGl0VWFwc2RSc3AsICAgICAgICAgLyogV0RJX0VYSVRfVUFQU0RfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NTZXRVYXBzZEFjUGFyYW1zUnNwLCAgLyogV0RJX1NFVF9VQVBTRF9QQVJBTV9SRVNQICAqLworICBXRElfUHJvY2Vzc1VwZGF0ZVVhcHNkUGFyYW1zUnNwLCAvKiBXRElfVVBEQVRFX1VBUFNEX1BBUkFNX1JFU1AgICovCisgIFdESV9Qcm9jZXNzQ29uZmlndXJlUnhwRmlsdGVyUnNwLC8qIFdESV9DT05GSUdVUkVfUlhQX0ZJTFRFUl9SRVNQICAqLworICBXRElfUHJvY2Vzc1NldEJlYWNvbkZpbHRlclJzcCwgICAvKiBXRElfU0VUX0JFQUNPTl9GSUxURVJfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NSZW1CZWFjb25GaWx0ZXJSc3AsICAgLyogV0RJX1JFTV9CRUFDT05fRklMVEVSX1JFU1AgICovCisgIFdESV9Qcm9jZXNzU2V0UlNTSVRocmVzb2xkc1JzcCwgIC8qIFdESV9TRVRfUlNTSV9USFJFU0hPTERTX1JFU1AgICovCisgIFdESV9Qcm9jZXNzSG9zdE9mZmxvYWRSc3AsICAgICAgIC8qIFdESV9IT1NUX09GRkxPQURfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NXb3dsQWRkQmNQdHJuUnNwLCAgICAgLyogV0RJX1dPV0xfQUREX0JDX1BUUk5fUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NXb3dsRGVsQmNQdHJuUnNwLCAgICAgLyogV0RJX1dPV0xfREVMX0JDX1BUUk5fUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NXb3dsRW50ZXJSc3AsICAgICAgICAgLyogV0RJX1dPV0xfRU5URVJfUkVTUCAgKi8KKyAgV0RJX1Byb2Nlc3NXb3dsRXhpdFJzcCwgICAgICAgICAgLyogV0RJX1dPV0xfRVhJVF9SRVNQICAqLworICBXRElfUHJvY2Vzc0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZVJzcCwgLyogV0RJX0NPTkZJR1VSRV9BUFBTX0NQVV9XQUtFVVBfU1RBVEVfUkVTUCAgKi8KKyAgCisKKyAgV0RJX1Byb2Nlc3NOdkRvd25sb2FkUnNwLCAvKiBXRElfTlZfRE9XTkxPQURfUkVTUCovCisKKyAgV0RJX1Byb2Nlc3NGbHVzaEFjUnNwLCAgICAgICAgICAgLyogV0RJX0ZMVVNIX0FDX1JFU1AgICovCisgIFdESV9Qcm9jZXNzQnRBbXBFdmVudFJzcCwgICAgICAgIC8qIFdESV9CVEFNUF9FVkVOVF9SRVNQICAqLworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgIFdESV9Qcm9jZXNzQWdnckFkZFRTcGVjUnNwLCAgICAgICAvKiBXRElfQUdHUl9BRERfVFNfUkVTUCAgKi8KKyNlbHNlCisgIE5VTEwsCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKyAgV0RJX1Byb2Nlc3NBZGRTVEFTZWxmUnNwLCAgICAgICAgICAvKiBXRElfQUREX1NUQV9TRUxGX1JFU1AgKi8KKyAgV0RJX1Byb2Nlc3NEZWxTVEFTZWxmUnNwLCAgICAgICAgICAvKiBXRElfREVMX1NUQV9TRUxGX1JFU1AgKi8KKyAgTlVMTCwKKyAgV0RJX1Byb2Nlc3NIb3N0UmVzdW1lUnNwLCAgICAgICAgLypXRElfSE9TVF9SRVNVTUVfUkVTUCovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgIFdESV9Qcm9jZXNzUDJQR09OT0FSc3AsICAgICAgICAgICAvKldESV9QMlBfR09fTk9USUNFX09GX0FCU0VOQ0VfUkVTUCAqLworI2Vsc2UKKyAgTlVMTCwKKyNlbmRpZgorCisjaWZkZWYgQU5JX01BTkZfRElBRworICBXRElfUHJvY2Vzc0ZUTUNvbW1hbmRSc3AsICAgICAgICAgLyogV0RJX0ZUTV9DTURfUkVTUCAqLworI2Vsc2UKKyAgTlVMTCwKKyNlbmRpZiAvKiBBTklfTUFORl9ESUFHICovCisKKyAgV0RJX1Byb2Nlc3NLZWVwQWxpdmVSc3AsICAgICAgIC8qIFdESV9LRUVQX0FMSVZFX1JFU1AgICovICAKKyAgCisjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisgIFdESV9Qcm9jZXNzU2V0UHJlZmVycmVkTmV0d29ya1JzcCwgICAgIC8qIFdESV9TRVRfUFJFRl9ORVRXT1JLX1JFU1AgKi8KKyAgV0RJX1Byb2Nlc3NTZXRSc3NpRmlsdGVyUnNwLCAgICAgICAgICAgLyogV0RJX1NFVF9SU1NJX0ZJTFRFUl9SRVNQICovCisgIFdESV9Qcm9jZXNzVXBkYXRlU2NhblBhcmFtc1JzcCwgICAgICAgIC8qIFdESV9VUERBVEVfU0NBTl9QQVJBTVNfUkVTUCAqLworI2Vsc2UKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworICBXRElfUHJvY2Vzc1NldFR4UGVyVHJhY2tpbmdSc3AsICAgICAgLyogV0RJX1NFVF9UWF9QRVJfVFJBQ0tJTkdfUkVTUCAgKi8KKyAgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSW5kaWNhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworICAvKiBXRElfODAyM19NVUxUSUNBU1RfTElTVF9SRVNQICovCisgIFdESV9Qcm9jZXNzODAyM011bHRpY2FzdExpc3RSc3AsICAgICAgICAgIAorICAvKiBXRElfUkVDRUlWRV9GSUxURVJfU0VUX0ZJTFRFUl9SRVNQICovCisgIFdESV9Qcm9jZXNzUmVjZWl2ZUZpbHRlclNldEZpbHRlclJzcCwgICAgIAorICAvKiBXRElfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JFU1AgKi8KKyAgV0RJX1Byb2Nlc3NGaWx0ZXJNYXRjaENvdW50UnNwLCAgIAorICAvKiBXRElfUkVDRUlWRV9GSUxURVJfQ0xFQVJfRklMVEVSX1JFU1AgKi8KKyAgV0RJX1Byb2Nlc3NSZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJSc3AsICAgCisjZWxzZQorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisKKyAgV0RJX1Byb2Nlc3NIQUxEdW1wQ21kUnNwLCAgICAgICAvKiBXRElfSEFMX0RVTVBfQ01EX1JFU1AgKi8KKyAgV0RJX1Byb2Nlc3NTaHV0ZG93blJzcCwgICAgICAgICAvKiBXRElfU0hVVERPV05fUkVTUCAqLworICAKKyAgV0RJX1Byb2Nlc3NTZXRQb3dlclBhcmFtc1JzcCwgICAgICAgICAvKldESV9TRVRfUE9XRVJfUEFSQU1TX1JFU1AqLworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgV0RJX1Byb2Nlc3NUc21TdGF0c1JzcCwgICAgICAgICAgLyogV0RJX1RTTV9TVEFUU19SRVNQICAqLworI2Vsc2UKKyAgTlVMTCwKKyNlbmRpZgorICAKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKyAgV0RJX1Byb2Nlc3NHdGtPZmZsb2FkUnNwLCAgICAgICAgICAgLyogV0RJX0dUS19PRkZMT0FEX1JFU1AgICovCisgIFdESV9Qcm9jZXNzR1RLT2ZmbG9hZEdldEluZm9Sc3AsICAgIC8qIFdESV9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JFU1AgICovCisjZWxzZQorICBOVUxMLAorICBOVUxMLAorI2VuZGlmIC8vIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorICBXRElfUHJvY2Vzc1NldFRtTGV2ZWxSc3AsICAgICAgIC8qIFdESV9TRVRfVE1fTEVWRUxfUkVTUCAqLworICBXRElfUHJvY2Vzc0ZlYXR1cmVDYXBzRXhjaGFuZ2VSc3AsICAgICAvKiBXRElfRkVBVFVSRV9DQVBTX0VYQ0hBTkdFX1JFU1AgKi8gIAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSW5kaWNhdGlvbnMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgV0RJX1Byb2Nlc3NMb3dSU1NJSW5kLCAgICAgICAgICAgIC8qIEp1c3QgdGhyZXNob2xkIGNyb3NzaW5nIG5vdCByZWFsbHkgbG93IFdESV9IQUxfUlNTSV9OT1RJRklDQVRJT05fSU5EICAqLworICBXRElfUHJvY2Vzc01pc3NlZEJlYWNvbkluZCwgICAgICAgLyogV0RJX0hBTF9NSVNTRURfQkVBQ09OX0lORCAgKi8KKyAgV0RJX1Byb2Nlc3NVbmtBZGRyRnJhbWVJbmQsICAgICAgIC8qIFdESV9IQUxfVU5LTk9XTl9BRERSMl9GUkFNRV9SWF9JTkQgICovCisgIFdESV9Qcm9jZXNzTWljRmFpbHVyZUluZCwgICAgICAgICAvKiBXRElfSEFMX01JQ19GQUlMVVJFX0lORCAgKi8KKyAgV0RJX1Byb2Nlc3NGYXRhbEVycm9ySW5kLCAgICAgICAgIC8qIFdESV9IQUxfRkFUQUxfRVJST1JfSU5EICAqLworICBXRElfUHJvY2Vzc0RlbFNUQUluZCwgICAgICAgICAgICAgLyogV0RJX0hBTF9ERUxfU1RBX0lORCAgKi8KKworICBXRElfUHJvY2Vzc0NvZXhJbmQsICAgICAgICAgICAgICAgLyogV0RJX0hBTF9DT0VYX0lORCAgKi8KKworICBXRElfUHJvY2Vzc1R4Q29tcGxldGVJbmQsICAgICAgICAgLyogV0RJX0hBTF9UWF9DT01QTEVURV9JTkQgICovCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgIFdESV9Qcm9jZXNzUDJwTm9hQXR0ckluZCwgICAgICAgICAvKldESV9IT1NUX05PQV9BVFRSX0lORCovCisjZWxzZQorICBOVUxMLAorI2VuZGlmCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKyAgV0RJX1Byb2Nlc3NQcmVmTmV0d29ya0ZvdW5kSW5kLCAgIC8qIFdESV9IQUxfUFJFRl9ORVRXT1JLX0ZPVU5EX0lORCAqLworI2Vsc2UKKyAgTlVMTCwKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKworI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUworICBXRElfUHJvY2Vzc1dha2VSZWFzb25JbmQsICAgICAgICAgIC8qIFdESV9XQUtFX1JFQVNPTl9JTkQgKi8KKyNlbHNlIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworICBOVUxMLAorI2VuZGlmIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworCisgIFdESV9Qcm9jZXNzVHhQZXJIaXRJbmQsICAgICAgICAgICAgICAgLyogV0RJX0hBTF9UWF9QRVJfSElUX0lORCAgKi8KK307CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFdMQU4gREFMIEdsb2JhbCBDb250cm9sIEJsb2NrCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1dESV9Db250cm9sQmxvY2tUeXBlICBnV0RJQ2I7IAorc3RhdGljIHdwdF91aW50OCAgICAgIGdXRElJbml0aWFsaXplZCA9IGVXTEFOX1BBTF9GQUxTRTsKKworY29uc3Qgd3B0X3VpbnQ4IHN6VHJhbnNwb3J0Q2hOYW1lW10gPSAiV0xBTl9DVFJMIjsgCisKKy8qSGVscGVyIHJvdXRpbmUgZm9yIHJldHJpZXZpbmcgdGhlIFBBTCBDb250ZXh0IGZyb20gV0RJKi8KK1dQVF9JTkxJTkUgCit2b2lkKiBXRElfR0VUX1BBTF9DVFgoIHZvaWQgKQoreworICByZXR1cm4gZ1dESUNiLnBQQUxDb250ZXh0OyAKK30vKldESV9HRVRfUEFMX0NUWCovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgSGVscGVyIGlubGluZSBjb252ZXJ0ZXJzCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKkNvbnZlcnQgV0RJIGRyaXZlciB0eXBlIGludG8gSEFMIGRyaXZlciB0eXBlKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSBXRElfU3RhdHVzCitXRElfSEFMXzJfV0RJX1NUQVRVUworKAorICBlSGFsU3RhdHVzIGhhbFN0YXR1cworKTsKKworLypDb252ZXJ0IFdESSByZXF1ZXN0IHR5cGUgaW50byBIQUwgcmVxdWVzdCB0eXBlKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSB0SGFsSG9zdE1zZ1R5cGUKK1dESV8yX0hBTF9SRVFfVFlQRQorKAorICBXRElfUmVxdWVzdEVudW1UeXBlICAgIHdkaVJlcVR5cGUKKyk7CisKKy8qQ29udmVydCBXREkgcmVzcG9uc2UgdHlwZSBpbnRvIEhBTCByZXNwb25zZSB0eXBlKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSBXRElfUmVzcG9uc2VFbnVtVHlwZQorSEFMXzJfV0RJX1JTUF9UWVBFCisoCisgIHRIYWxIb3N0TXNnVHlwZSBoYWxNc2cKKyk7CisKKy8qQ29udmVydCBXREkgZHJpdmVyIHR5cGUgaW50byBIQUwgZHJpdmVyIHR5cGUqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHREcml2ZXJUeXBlCitXRElfMl9IQUxfRFJWX1RZUEUKKygKKyAgV0RJX0RyaXZlclR5cGUgd2RpRHJpdmVyVHlwZQorKTsKKworLypDb252ZXJ0IFdESSBzdG9wIHJlYXNvbiBpbnRvIEhBTCBzdG9wIHJlYXNvbiovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdEhhbFN0b3BUeXBlCitXRElfMl9IQUxfU1RPUF9SRUFTT04KKygKKyAgV0RJX1N0b3BUeXBlIHdkaVN0b3BUeXBlCispOworCisvKkNvbnZlcnQgV0RJIHNjYW4gbW9kZSB0eXBlIGludG8gSEFMIHNjYW4gbW9kZSB0eXBlKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSBlSGFsU3lzTW9kZQorV0RJXzJfSEFMX1NDQU5fTU9ERQorKAorICBXRElfU2Nhbk1vZGUgd2RpU2Nhbk1vZGUKKyk7CisKKy8qQ29udmVydCBXREkgc2VjIGNoIG9mZnNldCBpbnRvIEhBTCBzZWMgY2ggb2Zmc2V0IHR5cGUqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHRTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQKK1dESV8yX0hBTF9TRUNfQ0hfT0ZGU0VUCisoCisgIFdESV9IVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgd2RpU2VjQ2hPZmZzZXQKKyk7CisKKy8qQ29udmVydCBXREkgQlNTIHR5cGUgaW50byBIQUwgQlNTIHR5cGUqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHRTaXJCc3NUeXBlCitXRElfMl9IQUxfQlNTX1RZUEUKKygKKyAgV0RJX0Jzc1R5cGUgd2RpQlNTVHlwZQorKTsKKworLypDb252ZXJ0IFdESSBOVyB0eXBlIGludG8gSEFMIE5XIHR5cGUqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHRTaXJOd1R5cGUKK1dESV8yX0hBTF9OV19UWVBFCisoCisgIFdESV9Od1R5cGUgd2RpTldUeXBlCispOworCisvKkNvbnZlcnQgV0RJIGNoYW5lbCBib25kaW5nIHR5cGUgaW50byBIQUwgY2IgdHlwZSovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgZVBoeUNoYW5Cb25kU3RhdGUKK1dESV8yX0hBTF9DQl9TVEFURQorKAorICBXRElfUGh5Q2hhbkJvbmRTdGF0ZSB3ZGlDYlN0YXRlCispOworCisvKkNvbnZlcnQgV0RJIGNoYW5lbCBib25kaW5nIHR5cGUgaW50byBIQUwgY2IgdHlwZSovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdFNpck1hY0hUT3BlcmF0aW5nTW9kZQorV0RJXzJfSEFMX0hUX09QRVJfTU9ERQorKAorICBXRElfSFRPcGVyYXRpbmdNb2RlIHdkaUhUT3Blck1vZGUKKyk7CisKKy8qQ29udmVydCBXREkgbWltbyBQUyB0eXBlIGludG8gSEFMIG1pbW8gUFMgdHlwZSovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdFNpck1hY0hUTUlNT1Bvd2VyU2F2ZVN0YXRlCitXRElfMl9IQUxfTUlNT19QUworKAorICBXRElfSFRNSU1PUG93ZXJTYXZlU3RhdGUgd2RpSFRPcGVyTW9kZQorKTsKKworLypDb252ZXJ0IFdESSBFTkMgdHlwZSBpbnRvIEhBTCBFTkMgdHlwZSovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdEFuaUVkVHlwZQorV0RJXzJfSEFMX0VOQ19UWVBFCisoCisgIFdESV9FbmNyeXB0VHlwZSB3ZGlFbmNUeXBlCispOworCisvKkNvbnZlcnQgV0RJIFdFUCB0eXBlIGludG8gSEFMIFdFUCB0eXBlKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSB0QW5pV2VwVHlwZQorV0RJXzJfSEFMX1dFUF9UWVBFCisoCisgIFdESV9XZXBUeXBlICB3ZGlXRVBUeXBlCispOworCisvKkNvbnZlcnQgV0RJIExpbmsgU3RhdGUgaW50byBIQUwgTGluayBTdGF0ZSovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdFNpckxpbmtTdGF0ZQorV0RJXzJfSEFMX0xJTktfU1RBVEUKKygKKyAgV0RJX0xpbmtTdGF0ZVR5cGUgIHdkaUxpbmtTdGF0ZQorKTsKKworLypUcmFuc2xhdGUgYSBTVEEgQ29udGV4dCBmcm9tIFdESSBpbnRvIEhBTCovIAorV1BUX1NUQVRJQyBXUFRfSU5MSU5FIAordm9pZAorV0RJX0NvcHlXRElTdGFDdHhUb0hBTFN0YUN0eAorKCAKKyAgdENvbmZpZ1N0YVBhcmFtcyogICAgICAgICAgcGhhbENvbmZpZ1N0YSwKKyAgV0RJX0NvbmZpZ1N0YVJlcUluZm9UeXBlKiAgcHdkaUNvbmZpZ1N0YQorKTsKKyAKKy8qVHJhbnNsYXRlIGEgUmF0ZSBzZXQgaW5mbyBmcm9tIFdESSBpbnRvIEhBTCovIAorV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHZvaWQgCitXRElfQ29weVdESVJhdGVTZXRUb0hBTFJhdGVTZXQKKyggCisgIHRTaXJNYWNSYXRlU2V0KiBwSGFsUmF0ZVNldCwKKyAgV0RJX1JhdGVTZXQqICAgIHB3ZGlSYXRlU2V0CispOworCisvKlRyYW5zbGF0ZSBhbiBFRENBIFBhcmFtZXRlciBSZWNvcmQgZnJvbSBXREkgaW50byBIQUwqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHZvaWQKK1dESV9Db3B5V0RJRURDQVBhcmFtc1RvSEFMRURDQVBhcmFtcworKCAKKyAgdFNpck1hY0VkY2FQYXJhbVJlY29yZCogcGhhbEVkY2FQYXJhbSwKKyAgV0RJX0VkY2FQYXJhbVJlY29yZCogICAgcFdESUVkY2FQYXJhbQorKTsKKworLypDb3B5IGEgbWFuYWdlbWVudCBmcmFtZSBoZWFkZXIgZnJvbSBXREkgZm10IGludG8gSEFMIGZtdCovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdm9pZAorV0RJX0NvcHlXRElNZ21GcmFtZUhkclRvSEFMTWdtRnJhbWVIZHIKKygKKyAgdFNpck1hY01nbXRIZHIqIHBtYWNNZ210SGRyLAorICBXRElfTWFjTWdtdEhkciogcHdkaU1hY01nbXRIZHIKKyk7CisKKy8qQ29weSBjb25maWcgYnNzIHBhcmFtZXRlcnMgZnJvbSBXREkgZm10IGludG8gSEFMIGZtdCovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdm9pZAorV0RJX0NvcHlXRElDb25maWdCU1NUb0hBTENvbmZpZ0JTUworKAorICB0Q29uZmlnQnNzUGFyYW1zKiAgICAgICAgIHBoYWxDb25maWdCU1MsCisgIFdESV9Db25maWdCU1NSZXFJbmZvVHlwZSogcHdkaUNvbmZpZ0JTUworKTsKKworLypFeHRyYWN0IHRoZSByZXF1ZXN0IENCIGZ1bmN0aW9uIGFuZCB1c2VyIGRhdGEgZnJvbSBhIHJlcXVlc3Qgc3RydWN0dXJlIAorICBwb2ludGVkIHRvIGJ5IHVzZXIgZGF0YSAqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHZvaWQKK1dESV9FeHRyYWN0UmVxdWVzdENCRnJvbUV2ZW50CisoCisgIFdESV9FdmVudEluZm9UeXBlKiBwRXZlbnQsCisgIFdESV9SZXFTdGF0dXNDYiogICBwcGZuUmVxQ0IsIAorICB2b2lkKiogICAgICAgICAgICAgcHBVc2VyRGF0YQorKTsKKword3B0X3VpbnQ4CitXRElfRmluZEVtcHR5U2Vzc2lvbgorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICAgcFdESUN0eCwKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiogICAgcHBTZXNzaW9uCispOworCit2b2lkCitXRElfQWRkQmNhc3RTVEF0b1NUQVRhYmxlCisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0FkZFN0YVBhcmFtcyAqICAgICBzdGFQYXJhbXMsCisgIHdwdF91aW50MTYgICAgICAgICAgICAgdXNCY2FzdFN0YUlkeAorKTsKKworV0RJX1N0YXR1cyBXRElfU2VuZE52QmxvYlJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKyk7CisKK3ZvaWQKK1dESV9TZXRQb3dlclN0YXRlQ2IKKygKKyAgIHdwdF9zdGF0dXMgc3RhdHVzLAorICAgdW5zaWduZWQgaW50IGR4ZVBoeUFkZHIsCisgICB2b2lkICAgICAgKnBDb250ZXh0CispOworCisjZGVmaW5lIENBU0VfUkVUVVJOX1NUUklORyggc3RyICkgICAgICAgICAgIFwKKyAgICBjYXNlICggKCBzdHIgKSApOiByZXR1cm4oICNzdHIgKTsgYnJlYWsgXAorCisvKioKKyBAYnJpZWYgV0RJX2dldFJlcU1zZ1N0cmluZyBwcmludHMgdGhlIFdESSByZXF1ZXN0IG1lc3NhZ2UgaW4gc3RyaW5nLgorICAKKyBAcGFyYW0gd2RpUmVxTXNnSWQ6IFdESSBNZXNzYWdlIHJlcXVlc3QgSWQgCisgIAorIEBzZWUgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitzdGF0aWMgY2hhciAqV0RJX2dldFJlcU1zZ1N0cmluZyh3cHRfdWludDE2IHdkaVJlcU1zZ0lkKQoreworICBzd2l0Y2ggKHdkaVJlcU1zZ0lkKQorICB7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU1RBUlRfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU1RPUF9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9DTE9TRV9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9JTklUX1NDQU5fUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU1RBUlRfU0NBTl9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9FTkRfU0NBTl9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9GSU5JU0hfU0NBTl9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9KT0lOX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0NPTkZJR19CU1NfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfREVMX0JTU19SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9QT1NUX0FTU09DX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0RFTF9TVEFfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX0JTU19LRVlfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfUk1WX0JTU19LRVlfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX1NUQV9LRVlfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfUk1WX1NUQV9LRVlfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfQUREX1RTX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0RFTF9UU19SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9VUERfRURDQV9QUk1TX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0FERF9CQV9TRVNTSU9OX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0RFTF9CQV9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9DSF9TV0lUQ0hfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfQ09ORklHX1NUQV9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9TRVRfTElOS19TVF9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9HRVRfU1RBVFNfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfVVBEQVRFX0NGR19SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9BRERfQkFfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfVFJJR0dFUl9CQV9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9VUERfQkNPTl9QUk1TX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NORF9CQ09OX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1VQRF9QUk9CRV9SU1BfVEVNUExBVEVfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX1NUQV9CQ0FTVF9LRVlfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfUk1WX1NUQV9CQ0FTVF9LRVlfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX01BWF9UWF9QT1dFUl9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9QMlBfR09fTk9USUNFX09GX0FCU0VOQ0VfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfRU5URVJfSU1QU19SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9FWElUX0lNUFNfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfRU5URVJfQk1QU19SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9FWElUX0JNUFNfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfRU5URVJfVUFQU0RfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfRVhJVF9VQVBTRF9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9TRVRfVUFQU0RfUEFSQU1fUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfVVBEQVRFX1VBUFNEX1BBUkFNX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0NPTkZJR1VSRV9SWFBfRklMVEVSX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NFVF9CRUFDT05fRklMVEVSX1JFUSk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfUkVNX0JFQUNPTl9GSUxURVJfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX1JTU0lfVEhSRVNIT0xEU19SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9IT1NUX09GRkxPQURfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfV09XTF9BRERfQkNfUFRSTl9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9XT1dMX0RFTF9CQ19QVFJOX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1dPV0xfRU5URVJfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfV09XTF9FWElUX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0NPTkZJR1VSRV9BUFBTX0NQVV9XQUtFVVBfU1RBVEVfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfTlZfRE9XTkxPQURfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfRkxVU0hfQUNfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfQlRBTVBfRVZFTlRfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfQUdHUl9BRERfVFNfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfQUREX1NUQV9TRUxGX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0RFTF9TVEFfU0VMRl9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9GVE1fQ01EX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NUQVJUX0lOTkFWX01FQVNfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfSE9TVF9SRVNVTUVfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfS0VFUF9BTElWRV9SRVEpOworICAjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX1BSRUZfTkVUV09SS19SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9TRVRfUlNTSV9GSUxURVJfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfVVBEQVRFX1NDQU5fUEFSQU1TX1JFUSApOworICAjZW5kaWYKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9TRVRfVFhfUEVSX1RSQUNLSU5HX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJXzgwMjNfTVVMVElDQVNUX0xJU1RfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfUkVDRUlWRV9GSUxURVJfU0VUX0ZJTFRFUl9SRVEgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfUkVDRUlWRV9GSUxURVJfQ0xFQVJfRklMVEVSX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0lOSVRfU0NBTl9DT05fUkVRICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfSEFMX0RVTVBfQ01EX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NIVVRET1dOX1JFUSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NFVF9QT1dFUl9QQVJBTVNfUkVRICk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVbmtub3duIFdESSBNZXNzYWdlSWQiOworICB9Cit9CisKKworCisvKioKKyBAYnJpZWYgV0RJX2dldFJlc3BNc2dTdHJpbmcgcHJpbnRzIHRoZSBXREkgcmVzb25zZSBtZXNzYWdlIGluIHN0cmluZy4KKyAgCisgQHBhcmFtIHdkaVJlc3BNc2dJZDogV0RJIE1lc3NhZ2UgcmVzcG9uc2UgSWQgCisgIAorIEBzZWUgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitzdGF0aWMgY2hhciAqV0RJX2dldFJlc3BNc2dTdHJpbmcod3B0X3VpbnQxNiB3ZGlSZXNwTXNnSWQpCit7CisgIHN3aXRjaCAod2RpUmVzcE1zZ0lkKQorICB7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU1RBUlRfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NUT1BfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0NMT1NFX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9JTklUX1NDQU5fUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NUQVJUX1NDQU5fUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0VORF9TQ0FOX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9GSU5JU0hfU0NBTl9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfSk9JTl9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfQ09ORklHX0JTU19SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfREVMX0JTU19SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfUE9TVF9BU1NPQ19SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfREVMX1NUQV9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX0JTU19LRVlfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1JNVl9CU1NfS0VZX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9TRVRfU1RBX0tFWV9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfUk1WX1NUQV9LRVlfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0FERF9UU19SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfREVMX1RTX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9VUERfRURDQV9QUk1TX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9BRERfQkFfU0VTU0lPTl9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfREVMX0JBX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9DSF9TV0lUQ0hfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0NPTkZJR19TVEFfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NFVF9MSU5LX1NUX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9HRVRfU1RBVFNfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1VQREFURV9DRkdfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0FERF9CQV9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfVFJJR0dFUl9CQV9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfVVBEX0JDT05fUFJNU19SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU05EX0JDT05fUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1VQRF9QUk9CRV9SU1BfVEVNUExBVEVfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NFVF9TVEFfQkNBU1RfS0VZX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9STVZfU1RBX0JDQVNUX0tFWV9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX01BWF9UWF9QT1dFUl9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfUDJQX0dPX05PVElDRV9PRl9BQlNFTkNFX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9FTlRFUl9JTVBTX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9FWElUX0lNUFNfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0VOVEVSX0JNUFNfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0VYSVRfQk1QU19SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfRU5URVJfVUFQU0RfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0VYSVRfVUFQU0RfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NFVF9VQVBTRF9QQVJBTV9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfVVBEQVRFX1VBUFNEX1BBUkFNX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9DT05GSUdVUkVfUlhQX0ZJTFRFUl9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX0JFQUNPTl9GSUxURVJfUkVTUCk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfUkVNX0JFQUNPTl9GSUxURVJfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NFVF9SU1NJX1RIUkVTSE9MRFNfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0hPU1RfT0ZGTE9BRF9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfV09XTF9BRERfQkNfUFRSTl9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfV09XTF9ERUxfQkNfUFRSTl9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfV09XTF9FTlRFUl9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfV09XTF9FWElUX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9DT05GSUdVUkVfQVBQU19DUFVfV0FLRVVQX1NUQVRFX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9OVl9ET1dOTE9BRF9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfRkxVU0hfQUNfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0JUQU1QX0VWRU5UX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9BR0dSX0FERF9UU19SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfQUREX1NUQV9TRUxGX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9ERUxfU1RBX1NFTEZfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0ZUTV9DTURfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1NUQVJUX0lOTkFWX01FQVNfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX0hPU1RfUkVTVU1FX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9LRUVQX0FMSVZFX1JFU1ApOworICAjaWZkZWYgRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX1BSRUZfTkVUV09SS19SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX1JTU0lfRklMVEVSX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9VUERBVEVfU0NBTl9QQVJBTVNfUkVTUCApOworICAjZW5kaWYKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9TRVRfVFhfUEVSX1RSQUNLSU5HX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV84MDIzX01VTFRJQ0FTVF9MSVNUX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9SRUNFSVZFX0ZJTFRFUl9TRVRfRklMVEVSX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUkVTUCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggV0RJX1JFQ0VJVkVfRklMVEVSX0NMRUFSX0ZJTFRFUl9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfSEFMX0RVTVBfQ01EX1JFU1AgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFdESV9TSFVURE9XTl9SRVNQICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBXRElfU0VUX1BPV0VSX1BBUkFNU19SRVNQICk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVbmtub3duIFdESSBNZXNzYWdlSWQiOworICB9Cit9CisKKy8qKgorIEBicmllZiBXRElfZ2V0SEFMU3RhdHVzTXNnU3RyaW5nIHByaW50cyB0aGUgSEFMIHN0YXR1cyBpbiBzdHJpbmcuCisgIAorIEBwYXJhbSBoYWxTdGF0dXNJZDogSEFMIHN0YXR1cyBJZCAKKyAgCisgQHNlZSAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK3N0YXRpYyBjaGFyICpXRElfZ2V0SEFMU3RhdHVzTXNnU3RyaW5nKHdwdF91aW50MTYgaGFsU3RhdHVzSWQpCit7CisgIHN3aXRjaCAoaGFsU3RhdHVzSWQpCisgIHsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFBBTF9TVEFUVVNfSU5WQUwgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIFBBTF9TVEFUVVNfQUxSRUFEWSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggUEFMX1NUQVRVU19FTVBUWSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggUEFMX1NUQVRVU19GQUlMVVJFICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlSEFMX1NUQVRVU19GQUlMVVJFICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlSEFMX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUiApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggZUhBTF9TVEFUVVNfSU5WQUxJRF9TVEFJRFggKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVIQUxfU1RBVFVTX0RQVV9ERVNDUklQVE9SX1RBQkxFX0ZVTEwgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVIQUxfU1RBVFVTX05PX0lOVEVSUlVQVFMgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVIQUxfU1RBVFVTX0lOVEVSUlVQVF9QUkVTRU5UICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlSEFMX1NUQVRVU19TVEFfVEFCTEVfRlVMTCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggZUhBTF9TVEFUVVNfRFVQTElDQVRFX1NUQSApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggZUhBTF9TVEFUVVNfQlNTSURfSU5WQUxJRCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggZUhBTF9TVEFUVVNfU1RBX0lOVkFMSUQgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVIQUxfU1RBVFVTX0RVUExJQ0FURV9CU1NJRCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggZUhBTF9TVEFUVVNfSU5WQUxJRF9CU1NJRFggKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVIQUxfU1RBVFVTX0JTU0lEX1RBQkxFX0ZVTEwgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVIQUxfU1RBVFVTX0lOVkFMSURfU0lHTkFUVVJFICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlSEFMX1NUQVRVU19JTlZBTElEX0tFWUlEICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlSEFMX1NUQVRVU19TRVRfQ0hBTl9BTFJFQURZX09OX1JFUVVFU1RFRF9DSEFOICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlSEFMX1NUQVRVU19VTUFfREVTQ1JJUFRPUl9UQUJMRV9GVUxMICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlSEFMX1NUQVRVU19EUFVfTUlDS0VZX1RBQkxFX0ZVTEwgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVIQUxfU1RBVFVTX0JBX1JYX0JVRkZFUlNfRlVMTCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggZUhBTF9TVEFUVVNfQkFfUlhfTUFYX1NFU1NJT05TX1JFQUNIRUQgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVIQUxfU1RBVFVTX0JBX1JYX0lOVkFMSURfU0VTU0lPTl9JRCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggZUhBTF9TVEFUVVNfVElNRVJfU1RBUlRfRkFJTEVEICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlSEFMX1NUQVRVU19USU1FUl9TVE9QX0ZBSUxFRCApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggZUhBTF9TVEFUVVNfRkFJTEVEX0FMTE9DICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlSEFMX1NUQVRVU19OT1RJRllfQlNTX0ZBSUwgKTsKKyAgICBDQVNFX1JFVFVSTl9TVFJJTkcoIGVIQUxfU1RBVFVTX0RFTF9TVEFfU0VMRl9JR05PUkVEX1JFRl9DT1VOVF9OT1RfWkVSTyApOworICAgIENBU0VfUkVUVVJOX1NUUklORyggZUhBTF9TVEFUVVNfQUREX1NUQV9TRUxGX0lHTk9SRURfUkVGX0NPVU5UX05PVF9aRVJPICk7CisgICAgQ0FTRV9SRVRVUk5fU1RSSU5HKCBlSEFMX1NUQVRVU19GV19TRU5EX01TR19GQUlMRUQgKTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlVua25vd24gSEFMIHN0YXR1cyI7CisgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSVRJQUxJWkFUSU9OIEFQSXMKKyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgQGJyaWVmIFdESV9Jbml0IGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgREFMLgorIAorIERBTCB3aWxsIGFsbG9jYXRlIGFsbCB0aGUgcmVzb3VyY2VzIGl0IG5lZWRzLiBJdCB3aWxsIG9wZW4gUEFMLCBpdCB3aWxsIGFsc28KKyBvcGVuIGJvdGggdGhlIGRhdGEgYW5kIHRoZSBjb250cm9sIHRyYW5zcG9ydCB3aGljaCBpbiB0aGVpciB0dXJuIHdpbGwgb3BlbgorIERYRS9TTUQgb3IgYW55IG90aGVyIGRyaXZlcnMgdGhhdCB0aGV5IG5lZWQuIAorIAorIEBwYXJhbSBwT1NDb250ZXh0OiBwb2ludGVyIHRvIHRoZSBPUyBjb250ZXh0IHByb3ZpZGVkIGJ5IHRoZSBVTUFDCisgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcGFzc2VkIG9uIHRvIFBBTCBvbiBPcGVuCisgICAgICAgIHBwV0RJR2xvYmFsQ3R4OiBvdXRwdXQgcG9pbnRlciBvZiBHbG9iYWwgQ29udGV4dAorICAgICAgICBwV2RpRGV2Q2FwYWJpbGl0eTogb3V0cHV0IHBvaW50ZXIgb2YgZGV2aWNlIGNhcGFiaWxpdHkKKworIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9Jbml0CisoIAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwT1NDb250ZXh0LAorICB2b2lkKiogICAgICAgICAgICAgICAgICAgICBwcFdESUdsb2JhbEN0eCwKKyAgV0RJX0RldmljZUNhcGFiaWxpdHlUeXBlKiAgcFdkaURldkNhcGFiaWxpdHksCisgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGRyaXZlclR5cGUKKykKK3sKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgaTsKKyAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgd3B0U3RhdHVzOyAKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgICAgd2RpU3RhdHVzOworICBXQ1RTX1RyYW5zcG9ydENCc1R5cGUgICB3Y3RzQ0JzOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwcFdESUdsb2JhbEN0eCApIHx8ICggTlVMTCA9PSBwV2RpRGV2Q2FwYWJpbGl0eSApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgaW4gV0RJX0luaXQiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIHRvIHNlZSBpZiB0aGUgbW9kdWxlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgb3Igbm90IAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSAhPSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiV0RJIG1vZHVsZSBhbHJlYWR5IGluaXRpYWxpemVkIC0gcmV0dXJuIik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKKyAgfQorCisgIC8qTW9kdWxlIGlzIG5vdyBpbml0aWFsaXplZCAtIHRoaXMgZmxhZyBpcyB0byBlbnN1cmUgdGhlIGZhY3QgdGhhdCBtdWx0aXBsZQorICAgaW5pdCB3aWxsIG5vdCBoYXBwZW4gb24gV0RJCisgICAhISAtIHBvdGVudGlhbCByYWNlIGRvZXMgZXhpc3QgYmVjYXVzZSByZWFkIGFuZCBzZXQgYXJlIG5vdCBhdG9taWMsCisgICBob3dldmVyIGFuIGF0b21pYyBvcGVyYXRpb24gd291bGQgYmUgY2xvc2VseSBoZXJlIC0gcmVhbmFseXplIGlmIG5lY2Vzc2FyeSovCisgIGdXRElJbml0aWFsaXplZCA9IGVXTEFOX1BBTF9UUlVFOyAKKworICAvKlNldHVwIHRoZSBjb250cm9sIGJsb2NrICovCisgIFdESV9DbGVhbkNCKCZnV0RJQ2IpOworICBnV0RJQ2IucE9TQ29udGV4dCA9IHBPU0NvbnRleHQ7IAorCisgIC8qU2V0dXAgdGhlIFNUQSBUYWJsZSovCisgIHdkaVN0YXR1cyA9IFdESV9TVEFUYWJsZUluaXQoJmdXRElDYik7CisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IHdkaVN0YXR1cyApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgIiVzOiBGYWlsdXJlIHdoaWxlIGluaXRpYWxpemluZyBTVEEgVGFibGUsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdkaVN0YXR1cyk7CisgICAgZ290byBmYWlsX1NUQVRhYmxlSW5pdDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgT3BlbiB0aGUgUEFMCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cHRTdGF0dXMgPSAgd3BhbE9wZW4oJmdXRElDYi5wUEFMQ29udGV4dCwgcE9TQ29udGV4dCk7CisgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHdwdFN0YXR1cyApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gb3BlbiBQQUwsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdwdFN0YXR1cyk7CisgICAgZ290byBmYWlsX3dwYWxPcGVuOworICB9CisKKyAgLypJbml0aWFsaXplIG1haW4gc3luY2hybyBtdXRleCAtIGl0IHdpbGwgYmUgdXNlZCB0byBlbnN1cmUgaW50ZWdyaXR5IG9mCisgICB0aGUgbWFpbiBXREkgQ29udHJvbCBCbG9jayovCisgIHdwdFN0YXR1cyA9ICB3cGFsTXV0ZXhJbml0KCZnV0RJQ2Iud3B0TXV0ZXgpOworICBpZiAoIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSAgd3B0U3RhdHVzICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBpbml0IG11dGV4LCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3cHRTdGF0dXMpOworICAgIGdvdG8gZmFpbF9tdXRleDsKKyAgfQorCisgIC8qSW5pdGlhbGl6ZSB0aGUgcmVzcG9uc2UgdGltZXIgLSBpdCB3aWxsIGJlIHVzZWQgdG8gdGltZSBhbGwgbWVzc2FnZXMKKyAgICBleHBlY3RlZCBhcyByZXNwb25zZSBmcm9tIGRldmljZSovCisgIHdwdFN0YXR1cyA9IHdwYWxUaW1lckluaXQoICZnV0RJQ2Iud3B0UmVzcG9uc2VUaW1lciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9SZXNwb25zZVRpbWVyQ0IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ1dESUNiKTsKKyAgaWYgKCBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gd3B0U3RhdHVzICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGluaXQgcmVzcG9uc2UgdGltZXIsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdwdFN0YXR1cyk7CisgICAgZ290byBmYWlsX3RpbWVyOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgIFdESSBQZW5kaW5nIFJlcXVlc3QgUXVldWUqLworICB3cHRTdGF0dXMgPSB3cGFsX2xpc3RfaW5pdCgmKGdXRElDYi53cHRQZW5kaW5nUXVldWUpKTsKKyAgaWYgKCBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gd3B0U3RhdHVzICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGluaXQgcGVuZGluZyByZXF1ZXN0IHF1ZXVlLCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3cHRTdGF0dXMpOworICAgIGdvdG8gZmFpbF9wZW5kX3F1ZXVlOworICB9CisKKyAgLypJbml0IFdESSBQZW5kaW5nIEFzc29jIElkIFF1ZXVlICovCisgIHdwdFN0YXR1cyA9IHdwYWxfbGlzdF9pbml0KCYoZ1dESUNiLndwdFBlbmRpbmdBc3NvY1Nlc3Npb25JZFF1ZXVlKSk7CisgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9ICB3cHRTdGF0dXMgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gaW5pdCBhc3NvYyBzZXNzaW9uIHF1ZXVlLCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3cHRTdGF0dXMpOworICAgIGdvdG8gZmFpbF9hc3NvY19xdWV1ZTsKKyAgfQorCisgIC8qSW5pdGlhbGl6ZSB0aGUgQlNTIHNlc3Npb25zIHBlbmRpbmcgUXVldWUgKi8KKyAgZm9yICggaSA9IDA7IGkgPCBXRElfTUFYX0JTU19TRVNTSU9OUzsgaSsrICkKKyAgeworICAgIHdwdFN0YXR1cyA9IHdwYWxfbGlzdF9pbml0KCYoZ1dESUNiLmFCU1NTZXNzaW9uc1tpXS53cHRQZW5kaW5nUXVldWUpKTsKKyAgICBpZiAoIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSAgd3B0U3RhdHVzICkKKyAgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBpbml0IEJTUyAlZCBwZW5kaW5nIHF1ZXVlLCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIHdwdFN0YXR1cyk7CisgICAgICBnb3RvIGZhaWxfYnNzX3F1ZXVlOworICAgIH0KKyAgfQorCisgIC8qSW5kaWNhdGUgdGhlIGNvbnRyb2wgYmxvY2sgaXMgc3VmZmljaWVudGx5IGluaXRpYWxpemVkIGZvciBjYWxsYmFja3MqLworICBnV0RJQ2IubWFnaWMgPSBXRElfQ09OVFJPTF9CTE9DS19NQUdJQzsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEluaXRpYWxpemUgdGhlIERhdGEgUGF0aCBVdGlsaXR5IE1vZHVsZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpU3RhdHVzID0gV0RJX0RQX1V0aWxzSW5pdCgmZ1dESUNiKTsKKyAgaWYgKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd2RpU3RhdHVzICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBEUCBVdGlsIE1vZHVsZSwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2RpU3RhdHVzKTsKKyAgICBnb3RvIGZhaWxfZHBfdXRpbF9pbml0OworICB9CisKKyAgLyogSW5pdCBTZXQgcG93ZXIgc3RhdGUgZXZlbnQgKi8KKyAgd3B0U3RhdHVzID0gd3BhbEV2ZW50SW5pdCgmZ1dESUNiLnNldFBvd2VyU3RhdGVFdmVudCk7CisgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHdwdFN0YXR1cyApIAorICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwb3dlciBzdGF0ZSBldmVudCwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdwdFN0YXR1cyk7CisgICAgIGdvdG8gZmFpbF9wb3dlcl9ldmVudDsKKyAgfQorCisgIC8qIEluaXQgV0NUUyBhY3Rpb24gZXZlbnQgKi8KKyAgd3B0U3RhdHVzID0gd3BhbEV2ZW50SW5pdCgmZ1dESUNiLndjdHNBY3Rpb25FdmVudCk7CisgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9ICB3cHRTdGF0dXMgKSAKKyAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgV0NUUyBhY3Rpb24gZXZlbnQsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3cHRTdGF0dXMpOworICAgICBnb3RvIGZhaWxfd2N0c19ldmVudDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgT3BlbiB0aGUgVHJhbnNwb3J0IFNlcnZpY2VzIGZvciBDb250cm9sIGFuZCBEYXRhIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2N0c0NCcy53Y3RzTm90aWZ5Q0IgICAgICA9IFdESV9Ob3RpZnlNc2dDVFNDQjsKKyAgd2N0c0NCcy53Y3RzTm90aWZ5Q0JEYXRhICA9ICZnV0RJQ2I7CisgIHdjdHNDQnMud2N0c1J4TXNnQ0IgICAgICAgPSBXRElfUlhNc2dDVFNDQjsgCisgIHdjdHNDQnMud2N0c1J4TXNnQ0JEYXRhICAgPSAmZ1dESUNiOworCisgIGdXRElDYi5iQ1RPcGVuZWQgICAgICAgICAgPSBlV0xBTl9QQUxfRkFMU0U7IAorICBnV0RJQ2Iud2N0c0hhbmRsZSA9IFdDVFNfT3BlblRyYW5zcG9ydCggc3pUcmFuc3BvcnRDaE5hbWUgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RJX0NUX0NIQU5ORUxfU0laRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2N0c0NCcyApOyAKKworICBpZiAoIE5VTEwgPT0gZ1dESUNiLndjdHNIYW5kbGUgKQorICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gb3BlbiBXQ1RTIHRyYW5zcG9ydCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIGdvdG8gZmFpbF93Y3RzX29wZW47CisgIH0KKworICBnV0RJQ2IuZHJpdmVyTW9kZSA9ICh0RHJpdmVyVHlwZSlkcml2ZXJUeXBlOworICAvKiBGVE0gbW9kZSBub3QgbmVlZCB0byBvcGVuIFRyYW5zcG9ydCBEcml2ZXIgKi8KKyAgaWYoZURSSVZFUl9UWVBFX01GRyAhPSAodERyaXZlclR5cGUpZHJpdmVyVHlwZSkKKyAgeyAgCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgT3BlbiB0aGUgRGF0YSBUcmFuc3BvcnQKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gV0RUU19vcGVuVHJhbnNwb3J0KCZnV0RJQ2IpKQorICAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIG9wZW4gdGhlIERUIFRyYW5zcG9ydCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBnb3RvIGZhaWxfd2R0c19vcGVuOworICAgIH0KKyAgfQorCisgIC8qVGhlIFdESSBpcyBpbml0aWFsaXplZCAtIHNldCBzdGF0ZSB0byBpbml0ICovCisgIGdXRElDYi51R2xvYmFsU3RhdGUgPSBXRElfSU5JVF9TVDsgCisKKyAgLypTZW5kIHRoZSBjb250ZXh0IGFzIGEgcHRyIHRvIHRoZSBnbG9iYWwgV0RJIENvbnRyb2wgQmxvY2sqLworICAqcHBXRElHbG9iYWxDdHggPSAmZ1dESUNiOworCisgIC8qRmlsbCBpbiB0aGUgZGV2aWNlIGNhcGFiaWxpdGllcyovCisgIHBXZGlEZXZDYXBhYmlsaXR5LT5iRnJhbWVYdGxTdXBwb3J0ZWQgPSBlV0xBTl9QQUxfRkFMU0U7IAorICBwV2RpRGV2Q2FwYWJpbGl0eS0+dWNNYXhTVEFTdXBwb3J0ZWQgID0gZ1dESUNiLnVjTWF4U3RhdGlvbnM7CisgIHBXZGlEZXZDYXBhYmlsaXR5LT51Y01heEJTU1N1cHBvcnRlZCAgPSBnV0RJQ2IudWNNYXhCc3NpZHM7CisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7CisKKyAgLyogRVJST1IgaGFuZGxlcnMKKyAgICAgVW5kbyBldmVyeXRoaW5nIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworCisgZmFpbF93ZHRzX29wZW46CisgIHsKKyAgICAgd3B0X3N0YXR1cyAgICAgICAgICAgICBldmVudFN0YXR1czsKKworICAgICAvKiBDbG9zaW5nIFdDVFMgaW4gdGhpcyBzY2VuYXJpbyBpcyB0cmlja3kgc2luY2UgaXQgaGFzIHRvIGNsb3NlCisgICAgICAgIHRoZSBTTUQgY2hhbm5lbCBhbmQgdGhlbiB3ZSBnZXQgbm90aWZpZWQgYXN5bmNocm9ub3VzbHkgd2hlbgorICAgICAgICB0aGUgY2hhbm5lbCBoYXMgYmVlbiBjbG9zZWQuIFNvIHdlIHRha2Ugc29tZSBvZiB0aGUgbG9naWMgZnJvbQorICAgICAgICB0aGUgIm5vcm1hbCIgY2xvc2UgcHJvY2VkdXJlIGluIFdESV9DbG9zZSgpCisgICAgICovCisKKyAgICAgZXZlbnRTdGF0dXMgPSB3cGFsRXZlbnRSZXNldCgmZ1dESUNiLndjdHNBY3Rpb25FdmVudCk7CisgICAgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IGV2ZW50U3RhdHVzICkgCisgICAgIHsKKyAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHJlc2V0IFdDVFMgYWN0aW9uIGV2ZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgfQorCisgICAgIFdDVFNfQ2xvc2VUcmFuc3BvcnQoZ1dESUNiLndjdHNIYW5kbGUpOworCisgICAgIC8qIFdhaXQgZm9yIFdDVFMgdG8gY2xvc2UgdGhlIGNvbnRyb2wgdHJhbnNwb3J0LiAgSWYgd2Ugd2VyZSBhYmxlCisgICAgICAgIHRvIHJlc2V0IHRoZSBldmVudCBmbGFnLCB0aGVuIHdlJ2xsIHdhaXQgZm9yIHRoZSBldmVudCwKKyAgICAgICAgb3RoZXJ3aXNlIHdlJ2xsIHdhaXQgZm9yIGEgbWF4aW11bSBhbW91bnQgb2YgdGltZSByZXF1aXJlZCBmb3IKKyAgICAgICAgdGhlIGNoYW5uZWwgdG8gYmUgY2xvc2VkICovCisgICAgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTID09IGV2ZW50U3RhdHVzICkKKyAgICAgeworICAgICAgICBldmVudFN0YXR1cyA9IHdwYWxFdmVudFdhaXQoJmdXRElDYi53Y3RzQWN0aW9uRXZlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RJX1dDVFNfQUNUSU9OX1RJTUVPVVQpOworICAgICAgICBpZiAoIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBldmVudFN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHdhaXQgb24gV0NUUyBhY3Rpb24gZXZlbnQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgIHdwYWxTbGVlcChXRElfV0NUU19BQ1RJT05fVElNRU9VVCk7CisgICAgIH0KKyAgfQorIGZhaWxfd2N0c19vcGVuOgorICB3cGFsRXZlbnREZWxldGUoJmdXRElDYi53Y3RzQWN0aW9uRXZlbnQpOworIGZhaWxfd2N0c19ldmVudDoKKyAgd3BhbEV2ZW50RGVsZXRlKCZnV0RJQ2Iuc2V0UG93ZXJTdGF0ZUV2ZW50KTsKKyBmYWlsX3Bvd2VyX2V2ZW50OgorICBXRElfRFBfVXRpbHNFeGl0KCZnV0RJQ2IpOworIGZhaWxfZHBfdXRpbF9pbml0OgorICBnV0RJQ2IubWFnaWMgPSAwOworIGZhaWxfYnNzX3F1ZXVlOgorICAvKiBlbnRyaWVzIDAgdGhydSBpLTEgd2VyZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgKi8KKyAgd2hpbGUgKDAgPCBpKQorICB7CisgICAgIGktLTsKKyAgICAgd3BhbF9saXN0X2Rlc3Ryb3koJihnV0RJQ2IuYUJTU1Nlc3Npb25zW2ldLndwdFBlbmRpbmdRdWV1ZSkpOworICB9CisgIHdwYWxfbGlzdF9kZXN0cm95KCYoZ1dESUNiLndwdFBlbmRpbmdBc3NvY1Nlc3Npb25JZFF1ZXVlKSk7CisgZmFpbF9hc3NvY19xdWV1ZToKKyAgd3BhbF9saXN0X2Rlc3Ryb3koJihnV0RJQ2Iud3B0UGVuZGluZ1F1ZXVlKSk7CisgZmFpbF9wZW5kX3F1ZXVlOgorICB3cGFsVGltZXJEZWxldGUoJmdXRElDYi53cHRSZXNwb25zZVRpbWVyKTsKKyBmYWlsX3RpbWVyOgorICB3cGFsTXV0ZXhEZWxldGUoJmdXRElDYi53cHRNdXRleCk7CisgZmFpbF9tdXRleDoKKyAgd3BhbENsb3NlKGdXRElDYi5wUEFMQ29udGV4dCk7CisgZmFpbF93cGFsT3BlbjoKKyAgV0RJX1NUQVRhYmxlQ2xvc2UoJmdXRElDYik7CisgZmFpbF9TVEFUYWJsZUluaXQ6CisgIGdXRElJbml0aWFsaXplZCA9IGVXTEFOX1BBTF9GQUxTRTsgCisKKyAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKworfS8qV0RJX0luaXQqLzsKKworLyoqCisgQGJyaWVmIFdESV9TdGFydCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgaXMgcmVhZHkgdG8KKyAgICAgICAgY29tbWVuY2Ugb3BlcmF0aW9uIHdpdGggdGhlIFdMQU4gRGV2aWNlLiBVcG9uIHRoZSBjYWxsCisgICAgICAgIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgU3RhcnQKKyAgICAgICAgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIHRoZSBTTUQgY2hhbm5lbAorICAgICAgICBoYXMgYmVlbiBmdWxseSBvcGVuZWQgYW5kIHRoZSBSSVZBIHN1YnN5c3RlbSBpcyB1cC4KKworICAgICAgICAgSWYgdGhlIFJJVkEgc3ViLXN5c3RlbSBpcyBub3QgeWV0IHVwIGFuZCBydW5uaW5nIERBTAorICAgICAgICAgd2lsbCBxdWV1ZSB0aGUgcmVxdWVzdCBmb3IgT3BlbiBhbmQgd2lsbCB3YWl0IGZvciB0aGUKKyAgICAgICAgIFNNRCBub3RpZmljYXRpb24gYmVmb3JlIGF0dGVtcHRpbmcgdG8gc2VuZCBkb3duIHRoZQorICAgICAgICAgbWVzc2FnZSB0byBIQUwuIAorCisgV0RJX0luaXQgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaVN0YXJ0UGFyYW1zOiB0aGUgc3RhcnQgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVN0YXJ0UnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlIG9mCisgICAgICAgIHRoZSBzdGFydCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9TdGFydAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TdGFydAorKAorICBXRElfU3RhcnRSZXFQYXJhbXNUeXBlKiAgcHdkaVN0YXJ0UGFyYW1zLAorICBXRElfU3RhcnRSc3BDYiAgICAgICAgICAgd2RpU3RhcnRSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1NUQVJUX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlTdGFydFBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlTdGFydFBhcmFtcyk7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpU3RhcnRSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX1N0YXJ0Ki8KKworLyoqCisgQGJyaWVmIFdESV9TdG9wIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBpcyByZWFkeSB0bworICAgICAgICBzdG9wIGFueSBvcGVyYXRpb24gd2l0aCB0aGUgV0xBTiBEZXZpY2UuIFVwb24gdGhlIGNhbGwKKyAgICAgICAgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBTdG9wCisgICAgICAgIG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiB0aGUgREFMIENvcmUgaXMKKyAgICAgICAgaW4gc3RhcnRlZCBzdGF0ZS4KKworICAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuCisgIAorICAgICAgICAgUmVxdWVzdCB3aWxsIG5vdCBiZSBhY2NlcHRlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1N0YXJ0IG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlTdG9wUGFyYW1zOiB0aGUgc3RvcCBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCBieSAKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU3RvcFJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZSBvZgorICAgICAgICB0aGUgc3RvcCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9TdGFydAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TdG9wCisoCisgIFdESV9TdG9wUmVxUGFyYW1zVHlwZSogIHB3ZGlTdG9wUGFyYW1zLAorICBXRElfU3RvcFJzcENiICAgICAgICAgICB3ZGlTdG9wUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qIEZyZWUgdGhlIGdsb2JhbCB2YXJpYWJsZXMgKi8KKyAgd3BhbE1lbW9yeUZyZWUoZ3BIb3N0V2xhbkZlYXRDYXBzKTsKKyAgd3BhbE1lbW9yeUZyZWUoZ3BGd1dsYW5GZWF0Q2Fwcyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfU1RPUF9SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpU3RvcFBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlTdG9wUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlTdG9wUnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfU1RPUF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9TdG9wKi8KKworCisKKy8qKgorIEBicmllZiBXRElfQ2xvc2Ugd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIG5vIGxvbmdlciAKKyAgICAgICAgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCBEQUwuIERBTCB3aWxsIGZyZWUgaXRzIGNvbnRyb2wKKyAgICAgICAgYmxvY2suCisgIAorICAgICAgICBJdCBpcyBvbmx5IGFjY2VwdGVkIGluIHN0YXRlIFNUT1BQRUQuICAKKworIFdESV9TdG9wIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBub25lCisgIAorIEBzZWUgV0RJX1N0b3AKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfQ2xvc2UKKygKKyAgdm9pZAorKQoreworICB3cHRfdWludDggICAgICAgICAgICAgIGk7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICB3cHRfc3RhdHVzICAgICAgICAgICAgIHdwdFN0YXR1czsKKyAgd3B0X3N0YXR1cyAgICAgICAgICAgICBldmVudFN0YXR1czsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qUmVzZXQgV0NUUyBhY3Rpb24gZXZlbnQgcHJpb3IgdG8gcG9zdGluZyB0aGUgV0RJX0NMT1NFX1JFUQorICAgKHRoZSBjb250cm9sIHRyYW5zcG9ydCB3aWxsIGJlIGNsb3NlZCBieSB0aGUgRlNNIGFuZCB3ZSdsbCB3YW50CisgICB0byB3YWl0IHVudGlsIHRoYXQgY29tcGxldGVzKSovCisgIGV2ZW50U3RhdHVzID0gd3BhbEV2ZW50UmVzZXQoJmdXRElDYi53Y3RzQWN0aW9uRXZlbnQpOworICBpZiAoIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBldmVudFN0YXR1cyApIAorICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byByZXNldCBXQ1RTIGFjdGlvbiBldmVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIC8qIGZhbGwgdGhyb3VnaCBhbmQgdHJ5IHRvIGZpbmlzaCBjbG9zaW5nIHZpYSB0aGUgRlNNICovCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9DTE9TRV9SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBOVUxMOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IDA7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gTlVMTDsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBOVUxMOworCisgIGdXRElJbml0aWFsaXplZCA9IGVXTEFOX1BBTF9GQUxTRTsKKworICB3cHRTdGF0dXMgPSBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfQ0xPU0VfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCisgIC8qV2FpdCBmb3IgV0NUUyB0byBjbG9zZSB0aGUgY29udHJvbCB0cmFuc3BvcnQKKyAgICAoYnV0IG9ubHkgaWYgd2Ugd2VyZSBhYmxlIHRvIHJlc2V0IHRoZSBldmVudCBmbGFnKi8KKyAgaWYgKCBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgPT0gZXZlbnRTdGF0dXMgKQorICB7CisgICAgIGV2ZW50U3RhdHVzID0gd3BhbEV2ZW50V2FpdCgmZ1dESUNiLndjdHNBY3Rpb25FdmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfV0NUU19BQ1RJT05fVElNRU9VVCk7CisgICAgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IGV2ZW50U3RhdHVzICkKKyAgICAgeworICAgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gd2FpdCBvbiBXQ1RTIGFjdGlvbiBldmVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgIH0KKyAgfQorCisgIC8qIERlc3Ryb3kgdGhlIFdDVFMgYWN0aW9uIGV2ZW50ICovCisgIHdwdFN0YXR1cyA9IHdwYWxFdmVudERlbGV0ZSgmZ1dESUNiLndjdHNBY3Rpb25FdmVudCk7CisgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9ICB3cHRTdGF0dXMgKQorICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiV0RJIENsb3NlIGZhaWxlZCB0byBkZXN0cm95IGFuIGV2ZW50Iik7CisgICAgIFdESV9BU1NFUlQoMCk7IAorICB9CisKKyAgIC8qIERlc3Ryb3kgdGhlIFNldCBQb3dlciBTdGF0ZSBldmVudCAqLworICAgd3B0U3RhdHVzID0gd3BhbEV2ZW50RGVsZXRlKCZnV0RJQ2Iuc2V0UG93ZXJTdGF0ZUV2ZW50KTsKKyAgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9ICB3cHRTdGF0dXMgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICJXREkgQ2xvc2UgZmFpbGVkIHRvIGRlc3Ryb3kgYW4gZXZlbnQiKTsKKworICAgICAgV0RJX0FTU0VSVCgwKTsgCisgICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDbG9zZXMgdGhlIERhdGEgUGF0aCBVdGlsaXR5IE1vZHVsZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0RQX1V0aWxzRXhpdCgmZ1dESUNiKSkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIldESSBJbml0IGZhaWxlZCB0byBjbG9zZSB0aGUgRFAgVXRpbCBNb2R1bGUiKTsKKworICAgIFdESV9BU1NFUlQoMCk7IAorICB9CisKKyAgLypkZXN0cm95IHRoZSBCU1Mgc2Vzc2lvbnMgcGVuZGluZyBRdWV1ZSAqLworICBmb3IgKCBpID0gMDsgaSA8IFdESV9NQVhfQlNTX1NFU1NJT05TOyBpKysgKQorICB7CisgICAgd3BhbF9saXN0X2Rlc3Ryb3koJihnV0RJQ2IuYUJTU1Nlc3Npb25zW2ldLndwdFBlbmRpbmdRdWV1ZSkpOworICB9CisKKyAgLyogZGVzdHJveSB0aGUgV0RJIFBlbmRpbmcgQXNzb2MgSWQgUmVxdWVzdCBRdWV1ZSovCisgIHdwYWxfbGlzdF9kZXN0cm95KCYoZ1dESUNiLndwdFBlbmRpbmdBc3NvY1Nlc3Npb25JZFF1ZXVlKSk7CisKKyAgLyogZGVzdHJveSB0aGUgV0RJIFBlbmRpbmcgUmVxdWVzdCBRdWV1ZSovCisgIHdwYWxfbGlzdF9kZXN0cm95KCYoZ1dESUNiLndwdFBlbmRpbmdRdWV1ZSkpOworICAKKyAgLypkZXN0cm95IHRoZSByZXNwb25zZSB0aW1lciAqLworICB3cHRTdGF0dXMgPSB3cGFsVGltZXJEZWxldGUoICZnV0RJQ2Iud3B0UmVzcG9uc2VUaW1lcik7CisKKyAgLyppbnZhbGlkYXRlIHRoZSBtYWluIHN5bmNocm8gbXV0ZXggKi8KKyAgd3B0U3RhdHVzID0gd3BhbE11dGV4RGVsZXRlKCZnV0RJQ2Iud3B0TXV0ZXgpOworICBpZiAoIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSAgd3B0U3RhdHVzICkKKyAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZGVsZXRlIG11dGV4ICVkIiwgd3B0U3RhdHVzKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgfQorCisgIC8qQ2xlYXIgY29udHJvbCBibG9jay4gIG5vdGUgdGhhdCB0aGlzIHdpbGwgY2xlYXIgdGhlICJtYWdpYyIKKyAgICB3aGljaCB3aWxsIGluaGliaXQgYWxsIGFzeW5jaHJvbm91cyBjYWxsYmFja3MqLworICBXRElfQ2xlYW5DQigmZ1dESUNiKTsKKworICByZXR1cm4gd3B0U3RhdHVzOworCit9LypXRElfQ2xvc2UqLworCisvKioKKyBAYnJpZWYgIFdESV9TaHV0ZG93biB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgJ1NTUiBzaHV0ZG93bicgb3BlcmF0aW9uLgorICAgICAgICAgVGhpcyB3aWxsIGRvIG1vc3Qgb2YgdGhlIFdESSBzdG9wICYgY2xvc2UKKyAgICAgICAgIG9wZXJhdGlvbnMgd2l0aG91dCBkb2luZyBhbnkgaGFuZHNoYWtlIHdpdGggUml2YQorCisgICAgICAgICBUaGlzIHdpbGwgYWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUgY29udHJvbCB0cmFuc3BvcnQKKyAgICAgICAgIHdpbGwgTk9UIGJlIGNsb3NlZC4KKworICAgICAgICAgVGhpcyByZXF1ZXN0IHdpbGwgbm90IGJlIHF1ZXVlZC4KKworCisgV0RJX1N0YXJ0IG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSAgY2xvc2VUcmFuc3BvcnQ6ICBDbG9zZSBjb250cm9sIGNoYW5uZWwgaWYgdGhpcyBpcyBzZXQKKworIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1NodXRkb3duCisoCisgd3B0X2Jvb2xlYW4gY2xvc2VUcmFuc3BvcnQKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICB3cHRTdGF0dXM7CisgICBpbnQgICAgICAgICAgICAgICAgICAgIGkgPSAwOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7CisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfU0hVVERPV05fUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IE5VTEw7CisgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gMDsKKworICAgLyogU2h1dGRvd24gd2lsbCBub3QgYmUgcXVldWVkLCBpZiB0aGUgc3RhdGUgaXMgYnVzeSB0aW1lciB3aWxsIGJlCisgICAgKiBzdG9wcGVkICYgdGhpcyBtZXNzYWdlIHdpbGwgYmUgcHJvY2Vzc2VkLiovCisgICB3cHRTdGF0dXMgPSBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfU0hVVERPV05fRVZFTlQsICZ3ZGlFdmVudERhdGEpOworICAgaWYgKCBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gd3B0U3RhdHVzICkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBwcm9jZXNzIHNodXRkb3duIGV2ZW50IiwgX19GVU5DVElPTl9fKTsKKyAgIH0KKyAgIC8qIERlc3Ryb3kgdGhlIFNldCBQb3dlciBTdGF0ZSBldmVudCAqLworICAgd3B0U3RhdHVzID0gd3BhbEV2ZW50RGVsZXRlKCZnV0RJQ2Iuc2V0UG93ZXJTdGF0ZUV2ZW50KTsKKyAgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9ICB3cHRTdGF0dXMgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgIldESSBDbG9zZSBmYWlsZWQgdG8gZGVzdHJveSBhbiBldmVudCIpOworCisgICAgICBXRElfQVNTRVJUKDApOworICAgfQorICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgQ2xvc2VzIHRoZSBEYXRhIFBhdGggVXRpbGl0eSBNb2R1bGUKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9EUF9VdGlsc0V4aXQoJmdXRElDYikpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAiV0RJIEluaXQgZmFpbGVkIHRvIGNsb3NlIHRoZSBEUCBVdGlsIE1vZHVsZSIpOworCisgICAgICBXRElfQVNTRVJUKDApOworICAgfQorICAgaWYgKCBjbG9zZVRyYW5zcG9ydCApCisgICB7CisgICAgICAvKiBDbG9zZSBjb250cm9sIHRyYW5zcG9ydCwgY2FsbGVkIGZyb20gbW9kdWxlIHVubG9hZCAqLworICAgICAgV0NUU19DbG9zZVRyYW5zcG9ydChnV0RJQ2Iud2N0c0hhbmRsZSk7CisgICB9CisKKyAgIC8qZGVzdHJveSB0aGUgQlNTIHNlc3Npb25zIHBlbmRpbmcgUXVldWUgKi8KKyAgIGZvciAoIGkgPSAwOyBpIDwgV0RJX01BWF9CU1NfU0VTU0lPTlM7IGkrKyApCisgICB7CisgICAgICB3cGFsX2xpc3RfZGVzdHJveSgmKGdXRElDYi5hQlNTU2Vzc2lvbnNbaV0ud3B0UGVuZGluZ1F1ZXVlKSk7CisgICB9CisKKyAgIC8qIGRlc3Ryb3kgdGhlIFdESSBQZW5kaW5nIEFzc29jIElkIFJlcXVlc3QgUXVldWUqLworICAgd3BhbF9saXN0X2Rlc3Ryb3koJihnV0RJQ2Iud3B0UGVuZGluZ0Fzc29jU2Vzc2lvbklkUXVldWUpKTsKKyAgIC8qIGRlc3Ryb3kgdGhlIFdESSBQZW5kaW5nIFJlcXVlc3QgUXVldWUqLworICAgd3BhbF9saXN0X2Rlc3Ryb3koJihnV0RJQ2Iud3B0UGVuZGluZ1F1ZXVlKSk7CisgICAvKmRlc3Ryb3kgdGhlIHJlc3BvbnNlIHRpbWVyICovCisgICB3cHRTdGF0dXMgPSB3cGFsVGltZXJEZWxldGUoICZnV0RJQ2Iud3B0UmVzcG9uc2VUaW1lcik7CisKKyAgIC8qaW52YWxpZGF0ZSB0aGUgbWFpbiBzeW5jaHJvIG11dGV4ICovCisgICB3cHRTdGF0dXMgPSB3cGFsTXV0ZXhEZWxldGUoJmdXRElDYi53cHRNdXRleCk7CisgICBpZiAoIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSAgd3B0U3RhdHVzICkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBkZWxldGUgbXV0ZXggJWQiLCAgX19GVU5DVElPTl9fLCB3cHRTdGF0dXMpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgIH0KKworICAgLypDbGVhciBjb250cm9sIGJsb2NrLiAgbm90ZSB0aGF0IHRoaXMgd2lsbCBjbGVhciB0aGUgIm1hZ2ljIgorICAgICB3aGljaCB3aWxsIGluaGliaXQgYWxsIGFzeW5jaHJvbm91cyBjYWxsYmFja3MqLworICAgV0RJX0NsZWFuQ0IoJmdXRElDYik7CisgICByZXR1cm4gd3B0U3RhdHVzOworCit9LypXRElfU2h1dGRvd24qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FOIEFQSXMKKyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgQGJyaWVmIFdESV9Jbml0U2NhblJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgd2FudHMgCisgICAgICAgIHRoZSBXTEFOIERldmljZSB0byBnZXQgcmVhZHkgZm9yIGEgc2NhbiBwcm9jZWR1cmUuIFVwb24KKyAgICAgICAgdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhCisgICAgICAgIEhBTCBJbml0IFNjYW4gcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1N0YXJ0IG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlJbml0U2NhblBhcmFtczogdGhlIGluaXQgc2NhbiBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlJbml0U2NhblJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZQorICAgICAgICBvZiB0aGUgaW5pdCBzY2FuIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1N0YXJ0CisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0luaXRTY2FuUmVxCisoCisgIFdESV9Jbml0U2NhblJlcVBhcmFtc1R5cGUqICBwd2RpSW5pdFNjYW5QYXJhbXMsCisgIFdESV9Jbml0U2NhblJzcENiICAgICAgICAgICB3ZGlJbml0U2NhblJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfSU5JVF9TQ0FOX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlJbml0U2NhblBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlJbml0U2NhblBhcmFtcyk7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpSW5pdFNjYW5Sc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0luaXRTY2FuUmVxKi8KKworLyoqCisgQGJyaWVmIFdESV9TdGFydFNjYW5SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3aXNoZXMgdG8gY2hhbmdlIHRoZSBTY2FuIGNoYW5uZWwgb24gdGhlIFdMQU4gRGV2aWNlLgorICAgICAgICBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kCisgICAgICAgIHNlbmQgYSBIQUwgU3RhcnQgU2NhbiByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfSW5pdFNjYW5SZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaVN0YXJ0U2NhblBhcmFtczogdGhlIHN0YXJ0IHNjYW4gcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVN0YXJ0U2NhblJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgc3RhcnQgc2NhbiBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Jbml0U2NhblJlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TdGFydFNjYW5SZXEKKygKKyAgV0RJX1N0YXJ0U2NhblJlcVBhcmFtc1R5cGUqICBwd2RpU3RhcnRTY2FuUGFyYW1zLAorICBXRElfU3RhcnRTY2FuUnNwQ2IgICAgICAgICAgIHdkaVN0YXJ0U2NhblJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1NUQVJUX1NDQU5fUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVN0YXJ0U2NhblBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlTdGFydFNjYW5QYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVN0YXJ0U2NhblJzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfU3RhcnRTY2FuUmVxKi8KKworCisvKioKKyBAYnJpZWYgV0RJX0VuZFNjYW5SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIGlzIAorICAgICAgICB3YW50cyB0byBlbmQgc2Nhbm5pbmcgZm9yIGEgcGFydGljdWxhciBjaGFubmVsIHRoYXQgaXQKKyAgICAgICAgaGFkIHNldCBiZWZvcmUgYnkgY2FsbGluZyBTY2FuIFN0YXJ0IG9uIHRoZSBXTEFOIERldmljZS4KKyAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZAorICAgICAgICBzZW5kIGEgSEFMIEVuZCBTY2FuIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9TdGFydFNjYW5SZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaUVuZFNjYW5QYXJhbXM6IHRoZSBlbmQgc2NhbiBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCAKKyAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpRW5kU2NhblJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZQorICAgICAgICBvZiB0aGUgZW5kIHNjYW4gb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU3RhcnRTY2FuUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0VuZFNjYW5SZXEKKygKKyAgV0RJX0VuZFNjYW5SZXFQYXJhbXNUeXBlKiBwd2RpRW5kU2NhblBhcmFtcywKKyAgV0RJX0VuZFNjYW5Sc3BDYiAgICAgICAgICB3ZGlFbmRTY2FuUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfRU5EX1NDQU5fUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaUVuZFNjYW5QYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpRW5kU2NhblBhcmFtcyk7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpRW5kU2NhblJzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfRW5kU2NhblJlcSovCisKKworLyoqCisgQGJyaWVmIFdESV9GaW5pc2hTY2FuUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBoYXMgCisgICAgICAgIGNvbXBsZXRlZCB0aGUgc2NhbiBwcm9jZXNzIG9uIHRoZSBXTEFOIERldmljZS4gVXBvbiB0aGUKKyAgICAgICAgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMCisgICAgICAgIEZpbmlzaCBTY2FuIFJlcXVlc3QgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX0luaXRTY2FuUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlGaW5pc2hTY2FuUGFyYW1zOiB0aGUgZmluaXNoIHNjYW4gIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlGaW5pc2hTY2FuUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBmaW5pc2ggc2NhbiBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Jbml0U2NhblJlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9GaW5pc2hTY2FuUmVxCisoCisgIFdESV9GaW5pc2hTY2FuUmVxUGFyYW1zVHlwZSogcHdkaUZpbmlzaFNjYW5QYXJhbXMsCisgIFdESV9GaW5pc2hTY2FuUnNwQ2IgICAgICAgICAgd2RpRmluaXNoU2NhblJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0ZJTklTSF9TQ0FOX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlGaW5pc2hTY2FuUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaUZpbmlzaFNjYW5QYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUZpbmlzaFNjYW5Sc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0ZpbmlzaFNjYW5SZXEqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTT0NJQVRJT04gQVBJcworIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgV0RJX0pvaW5SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIGlzIHJlYWR5IAorICAgICAgICB0byBzdGFydCBhbiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgdG8gYSBCU1MuIFVwb24gdGhlCisgICAgICAgIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTAorICAgICAgICBKb2luIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmCisgICAgICAgIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9TdGFydCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpSm9pblBhcmFtczogdGhlIGpvaW4gcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUpvaW5Sc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGpvaW4gb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU3RhcnQKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfSm9pblJlcQorKAorICBXRElfSm9pblJlcVBhcmFtc1R5cGUqIHB3ZGlKb2luUGFyYW1zLAorICBXRElfSm9pblJzcENiICAgICAgICAgIHdkaUpvaW5Sc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9KT0lOX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlKb2luUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaUpvaW5QYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUpvaW5Sc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0pvaW5SZXEqLworCisvKioKKyBAYnJpZWYgV0RJX0NvbmZpZ0JTU1JlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgCisgICAgICAgIHdpc2hlcyB0byBjb25maWd1cmUgdGhlIG5ld2x5IGFjcXVpcmVkIG9yIGluIHByb2Nlc3Mgb2YKKyAgICAgICAgYmVpbmcgYWNxdWlyZWQgQlNTIHRvIHRoZSBIVyAuIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkKKyAgICAgICAgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBDb25maWcgQlNTIHJlcXVlc3QKKyAgICAgICAgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZQorICAgICAgICBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Kb2luUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlDb25maWdCU1NQYXJhbXM6IHRoZSBjb25maWcgQlNTIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlDb25maWdCU1NSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIGNvbmZpZyBCU1Mgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfSm9pblJlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9Db25maWdCU1NSZXEKKygKKyAgV0RJX0NvbmZpZ0JTU1JlcVBhcmFtc1R5cGUqIHB3ZGlDb25maWdCU1NQYXJhbXMsCisgIFdESV9Db25maWdCU1NSc3BDYiAgICAgICAgICB3ZGlDb25maWdCU1NSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0NPTkZJR19CU1NfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaUNvbmZpZ0JTU1BhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlDb25maWdCU1NQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUNvbmZpZ0JTU1JzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfQ29uZmlnQlNTUmVxKi8KKworLyoqCisgQGJyaWVmIFdESV9EZWxCU1NSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIGlzIAorICAgICAgICBkaXNhc3NvY2lhdGluZyBmcm9tIHRoZSBCU1MgYW5kIHdpc2hlcyB0byBub3RpZnkgSFcuCisgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQKKyAgICAgICAgc2VuZCBhIEhBTCBEZWwgQlNTIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Db25maWdCU1NSZXEgb3IgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpRGVsQlNTUGFyYW1zOiB0aGUgZGVsIEJTUyBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCBieSAKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpRGVsQlNTUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlCisgICAgICAgIG9mIHRoZSBkZWwgYnNzIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX0NvbmZpZ0JTU1JlcSwgV0RJX1Bvc3RBc3NvY1JlcSAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfRGVsQlNTUmVxCisoCisgIFdESV9EZWxCU1NSZXFQYXJhbXNUeXBlKiBwd2RpRGVsQlNTUGFyYW1zLAorICBXRElfRGVsQlNTUnNwQ2IgICAgICAgICAgd2RpRGVsQlNTUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9ERUxfQlNTX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlEZWxCU1NQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpRGVsQlNTUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlEZWxCU1NSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0RlbEJTU1JlcSovCisKKy8qKgorIEBicmllZiBXRElfUG9zdEFzc29jUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBoYXMgCisgICAgICAgIGFzc29jaWF0ZWQgdG8gYSBCU1MgYW5kIHdpc2hlcyB0byBjb25maWd1cmUgSFcgZm9yCisgICAgICAgIGFzc29jaWF0ZWQgc3RhdGUuIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMCisgICAgICAgIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBQb3N0IEFzc29jIHJlcXVlc3QgbWVzc2FnZSB0bworICAgICAgICB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Kb2luUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlQb3N0QXNzb2NSZXFQYXJhbXM6IHRoZSBhc3NvYyBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlQb3N0QXNzb2NSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHBvc3QgYXNzb2Mgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfSm9pblJlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9Qb3N0QXNzb2NSZXEKKygKKyAgV0RJX1Bvc3RBc3NvY1JlcVBhcmFtc1R5cGUqIHB3ZGlQb3N0QXNzb2NSZXFQYXJhbXMsCisgIFdESV9Qb3N0QXNzb2NSc3BDYiAgICAgICAgICB3ZGlQb3N0QXNzb2NSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1BPU1RfQVNTT0NfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVBvc3RBc3NvY1JlcVBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlQb3N0QXNzb2NSZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVBvc3RBc3NvY1JzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfUG9zdEFzc29jUmVxKi8KKworLyoqCisgQGJyaWVmIFdESV9EZWxTVEFSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHdoZW4gYW4gCisgICAgICAgIGFzc29jaWF0aW9uIHdpdGggYW5vdGhlciBTVEEgaGFzIGVuZGVkIGFuZCB0aGUgc3RhdGlvbgorICAgICAgICBtdXN0IGJlIGRlbGV0ZWQgZnJvbSBIVy4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUKKyAgICAgICAgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIERlbCBTVEEgcmVxdWVzdAorICAgICAgICBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlCisgICAgICAgIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpRGVsU1RBUGFyYW1zOiB0aGUgRGVsIFNUQSBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCBieSAKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpRGVsU1RBUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlCisgICAgICAgIG9mIHRoZSBkZWwgU1RBIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9EZWxTVEFSZXEKKygKKyAgV0RJX0RlbFNUQVJlcVBhcmFtc1R5cGUqIHB3ZGlEZWxTVEFQYXJhbXMsCisgIFdESV9EZWxTVEFSc3BDYiAgICAgICAgICB3ZGlEZWxTVEFSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0RFTF9TVEFfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaURlbFNUQVBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlEZWxTVEFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaURlbFNUQVJzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfRGVsU1RBUmVxKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1VSSVRZIEFQSXMKKyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgQGJyaWVmIFdESV9TZXRCU1NLZXlSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHdhbnRzIHRvCisgICAgICAgIGluc3RhbGwgYSBCU1MgZW5jcnlwdGlvbiBrZXkgb24gdGhlIEhXLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMKKyAgICAgICAgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBTZXQgQlNTIEtleSByZXF1ZXN0CisgICAgICAgIG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUKKyAgICAgICAgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlTZXRCU1NLZXlQYXJhbXM6IHRoZSBCU1MgS2V5IHNldCBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU2V0QlNTS2V5UnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBzZXQgQlNTIEtleSBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU2V0QlNTS2V5UmVxCisoCisgIFdESV9TZXRCU1NLZXlSZXFQYXJhbXNUeXBlKiBwd2RpU2V0QlNTS2V5UGFyYW1zLAorICBXRElfU2V0QlNTS2V5UnNwQ2IgICAgICAgICAgd2RpU2V0QlNTS2V5UnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9TRVRfQlNTX0tFWV9SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpU2V0QlNTS2V5UGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVNldEJTU0tleVBhcmFtcyk7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpU2V0QlNTS2V5UnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9TZXRCU1NLZXlSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX1JlbW92ZUJTU0tleVJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgd2FudHMgdG8KKyAgICAgICAgdW5pbnN0YWxsIGEgQlNTIGtleSBmcm9tIEhXLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZQorICAgICAgICBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgUmVtb3ZlIEJTUyBLZXkgcmVxdWVzdAorICAgICAgICBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlCisgICAgICAgIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1NldEJTU0tleVJlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpUmVtb3ZlQlNTS2V5UGFyYW1zOiB0aGUgcmVtb3ZlIEJTUyBrZXkgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVJlbW92ZUJTU0tleVJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgcmVtb3ZlIEJTUyBrZXkgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20KKyAgICAgICAgdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU2V0QlNTS2V5UmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1JlbW92ZUJTU0tleVJlcQorKAorICBXRElfUmVtb3ZlQlNTS2V5UmVxUGFyYW1zVHlwZSogcHdkaVJlbW92ZUJTU0tleVBhcmFtcywKKyAgV0RJX1JlbW92ZUJTU0tleVJzcENiICAgICAgICAgIHdkaVJlbW92ZUJTU0tleVJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfUk1WX0JTU19LRVlfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVJlbW92ZUJTU0tleVBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlSZW1vdmVCU1NLZXlQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVJlbW92ZUJTU0tleVJzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfUmVtb3ZlQlNTS2V5UmVxKi8KKworCisvKioKKyBAYnJpZWYgV0RJX1NldFNUQUtleVJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgaXMgCisgICAgICAgIHJlYWR5IHRvIGluc3RhbGwgYSBTVEEoYXN0KSBlbmNyeXB0aW9uIGtleSBpbiBIVy4gVXBvbgorICAgICAgICB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEKKyAgICAgICAgSEFMIFNldCBTVEEgS2V5IHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaVNldFNUQUtleVBhcmFtczogdGhlIHNldCBTVEEga2V5IHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlTZXRTVEFLZXlSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHNldCBTVEEga2V5IG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZXRTVEFLZXlSZXEKKygKKyAgV0RJX1NldFNUQUtleVJlcVBhcmFtc1R5cGUqIHB3ZGlTZXRTVEFLZXlQYXJhbXMsCisgIFdESV9TZXRTVEFLZXlSc3BDYiAgICAgICAgICB3ZGlTZXRTVEFLZXlSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1NFVF9TVEFfS0VZX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlTZXRTVEFLZXlQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpU2V0U1RBS2V5UGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlTZXRTVEFLZXlSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX1NldFNUQUtleVJlcSovCisKKworLyoqCisgQGJyaWVmIFdESV9SZW1vdmVTVEFLZXlSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3YW50cyB0byB1bmluc3RhbGwgYSBwcmV2aW91c2x5IHNldCBTVEEga2V5IGluIEhXLiBVcG9uCisgICAgICAgIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYQorICAgICAgICBIQUwgUmVtb3ZlIFNUQSBLZXkgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1NldFNUQUtleVJlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpUmVtb3ZlU1RBS2V5UGFyYW1zOiB0aGUgcmVtb3ZlIFNUQSBrZXkgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVJlbW92ZVNUQUtleVJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgcmVtb3ZlIFNUQSBrZXkgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20KKyAgICAgICAgdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU2V0U1RBS2V5UmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1JlbW92ZVNUQUtleVJlcQorKAorICBXRElfUmVtb3ZlU1RBS2V5UmVxUGFyYW1zVHlwZSogcHdkaVJlbW92ZVNUQUtleVBhcmFtcywKKyAgV0RJX1JlbW92ZVNUQUtleVJzcENiICAgICAgICAgIHdkaVJlbW92ZVNUQUtleVJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfUk1WX1NUQV9LRVlfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVJlbW92ZVNUQUtleVBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlSZW1vdmVTVEFLZXlQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVJlbW92ZVNUQUtleVJzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfUmVtb3ZlU1RBS2V5UmVxKi8KKworCisvKioKKyBAYnJpZWYgV0RJX1NldFNUQUJjYXN0S2V5UmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2FudHMgdG8gaW5zdGFsbCBhIFNUQSBCY2FzdCBlbmNyeXB0aW9uIGtleSBvbiB0aGUgSFcuCisgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQKKyAgICAgICAgc2VuZCBhIEhBTCBTdGFydCByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpU2V0U1RBQmNhc3RLZXlQYXJhbXM6IHRoZSBCU1MgS2V5IHNldCBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU2V0U1RBQmNhc3RLZXlSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHNldCBCU1MgS2V5IG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZXRTVEFCY2FzdEtleVJlcQorKAorICBXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZSogcHdkaVNldFNUQUJjYXN0S2V5UGFyYW1zLAorICBXRElfU2V0U1RBS2V5UnNwQ2IgICAgICAgICAgd2RpU2V0U1RBQmNhc3RLZXlSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQorCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfU0VUX1NUQV9CQ0FTVF9LRVlfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVNldFNUQUJjYXN0S2V5UGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVNldFNUQUJjYXN0S2V5UGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlTZXRTVEFCY2FzdEtleVJzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfU2V0U1RBQmNhc3RLZXlSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX1JlbW92ZVNUQUJjYXN0S2V5UmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIAorICAgICAgICBNQUMgd2FudHMgdG8gdW5pbnN0YWxsIGEgU1RBIEJjYXN0IGtleSBmcm9tIEhXLiBVcG9uIHRoZQorICAgICAgICBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwKKyAgICAgICAgUmVtb3ZlIFNUQSBCY2FzdCBLZXkgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1NldFNUQUJjYXN0S2V5UmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpUmVtb3ZlU1RBQmNhc3RLZXlQYXJhbXM6IHRoZSByZW1vdmUgQlNTIGtleSAKKyAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlSZW1vdmVTVEFCY2FzdEtleVJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgcmVtb3ZlIFNUQSBCY2FzdCBrZXkgb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU2V0U1RBQmNhc3RLZXlSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfUmVtb3ZlU1RBQmNhc3RLZXlSZXEKKygKKyAgV0RJX1JlbW92ZVNUQUtleVJlcVBhcmFtc1R5cGUqIHB3ZGlSZW1vdmVTVEFCY2FzdEtleVBhcmFtcywKKyAgV0RJX1JlbW92ZVNUQUtleVJzcENiICAgICAgICAgIHdkaVJlbW92ZVNUQUJjYXN0S2V5UnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9STVZfU1RBX0JDQVNUX0tFWV9SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpUmVtb3ZlU1RBQmNhc3RLZXlQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpUmVtb3ZlU1RBQmNhc3RLZXlQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVJlbW92ZVNUQUJjYXN0S2V5UnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9SZW1vdmVTVEFCY2FzdEtleVJlcSovCisKKy8qKgorIEBicmllZiBXRElfU2V0TWF4VHhQb3dlclJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciAKKyAgICAgICAgTUFDIHdhbnRzIHRvIHNldCBNYXggVHggUG93ZXIgdG8gSFcuIFVwb24gdGhlCisgICAgICAgIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTAorICAgICAgICBSZW1vdmUgU1RBIEJjYXN0IEtleSByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfU2V0U1RBQmNhc3RLZXlSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlSZW1vdmVTVEFCY2FzdEtleVBhcmFtczogdGhlIHJlbW92ZSBCU1Mga2V5IAorICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVJlbW92ZVNUQUJjYXN0S2V5UnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSByZW1vdmUgU1RBIEJjYXN0IGtleSBvcGVyYXRpb24gcmVjZWl2ZWQKKyAgICAgICAgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9TZXRNYXhUeFBvd2VyUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NldE1heFR4UG93ZXJSZXEKKygKKyAgV0RJX1NldE1heFR4UG93ZXJQYXJhbXNUeXBlKiAgIHB3ZGlTZXRNYXhUeFBvd2VyUGFyYW1zLAorICBXREFfU2V0TWF4VHhQb3dlclJzcENiICAgICAgICAgd2RpUmVxU3RhdHVzQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9TRVRfTUFYX1RYX1BPV0VSX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlTZXRNYXhUeFBvd2VyUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVNldE1heFR4UG93ZXJQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVJlcVN0YXR1c0NiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfQorCisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorV0RJX1N0YXR1cworV0RJX1RTTVN0YXRzUmVxCisoCisgICBXRElfVFNNU3RhdHNSZXFQYXJhbXNUeXBlKiAgICAgICAgcHdkaVRzbVJlcVBhcmFtcywKKyAgIFdESV9Uc21Sc3BDYiAgICAgICAgICAgICAgICAgd2RpUmVxU3RhdHVzQ2IsCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9UU01fU1RBVFNfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVRzbVJlcVBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlUc21SZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVJlcVN0YXR1c0NiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9CisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUW9TIGFuZCBCQSBBUElzCisgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorIEBicmllZiBXRElfQWRkVFNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHRvIGluZm9ybQorICAgICAgICB0aGUgZGV2aWNlIG9mIGEgc3VjY2Vzc2Z1bCBhZGQgVFNwZWMgbmVnb3RpYXRpb24uIEhXCisgICAgICAgIG5lZWRzIHRvIHJlY2VpdmUgdGhlIFRTcGVjIEluZm8gZnJvbSB0aGUgVU1BQyBpbiBvcmRlcgorICAgICAgICB0byBjb25maWd1cmUgcHJvcGVybHkgdGhlIFFvUyBkYXRhIHRyYWZmaWMuIFVwb24gdGhlCisgICAgICAgIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTAorICAgICAgICBBZGQgVFMgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYKKyAgICAgICAgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpQWRkVHNSZXFQYXJhbXM6IHRoZSBhZGQgVFMgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpQWRkVHNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGFkZCBUUyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfQWRkVFNSZXEKKygKKyAgV0RJX0FkZFRTUmVxUGFyYW1zVHlwZSogcHdkaUFkZFRzUmVxUGFyYW1zLAorICBXRElfQWRkVHNSc3BDYiAgICAgICAgICB3ZGlBZGRUc1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9BRERfVFNfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaUFkZFRzUmVxUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaUFkZFRzUmVxUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlBZGRUc1JzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfQWRkVFNSZXEqLworCisKKworLyoqCisgQGJyaWVmIFdESV9EZWxUU1JlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgaGFzIGVuZGVkCisgICAgICAgIGFkbWlzc2lvbiBvbiBhIHNwZWNpZmljIEFDLiBUaGlzIGlzIHRvIGluZm9ybSBIVyB0aGF0CisgICAgICAgIFFvUyB0cmFmZmljIHBhcmFtZXRlcnMgbXVzdCBiZSByZXN0LiBVcG9uIHRoZSBjYWxsIG9mCisgICAgICAgIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgRGVsIFRTCisgICAgICAgIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcworICAgICAgICBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9BZGRUU1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpRGVsVHNSZXFQYXJhbXM6IHRoZSBkZWwgVFMgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpRGVsVHNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGRlbCBUUyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9BZGRUU1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9EZWxUU1JlcQorKAorICBXRElfRGVsVFNSZXFQYXJhbXNUeXBlKiBwd2RpRGVsVHNSZXFQYXJhbXMsCisgIFdESV9EZWxUc1JzcENiICAgICAgICAgIHdkaURlbFRzUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0RFTF9UU19SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpRGVsVHNSZXFQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpRGVsVHNSZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaURlbFRzUnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9EZWxUU1JlcSovCisKKworCisvKioKKyBAYnJpZWYgV0RJX1VwZGF0ZUVEQ0FQYXJhbXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3aXNoZXMgdG8gdXBkYXRlIHRoZSBFRENBIHBhcmFtZXRlcnMgdXNlZCBieSBIVyBmb3IgUW9TCisgICAgICAgIGRhdGEgdHJhZmZpYy4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwKKyAgICAgICAgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIFVwZGF0ZSBFRENBIFBhcmFtcyByZXF1ZXN0CisgICAgICAgIG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUKKyAgICAgICAgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlVcGRhdGVFRENBUGFyYW1zOiB0aGUgc3RhcnQgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgCisgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVVwZGF0ZUVEQ0FQYXJhbXNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHN0YXJ0IG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9VcGRhdGVFRENBUGFyYW1zCisoCisgIFdESV9VcGRhdGVFRENBUGFyYW1zVHlwZSogICAgcHdkaVVwZGF0ZUVEQ0FQYXJhbXMsCisgIFdESV9VcGRhdGVFRENBUGFyYW1zUnNwQ2IgICAgd2RpVXBkYXRlRURDQVBhcmFtc1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1VQRF9FRENBX1BSTVNfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVVwZGF0ZUVEQ0FQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpVXBkYXRlRURDQVBhcmFtcyk7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpVXBkYXRlRURDQVBhcmFtc1JzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfVXBkYXRlRURDQVBhcmFtcyovCisKKworLyoqCisgQGJyaWVmIFdESV9BZGRCQVNlc3Npb25SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIGhhcyBzZXR1cAorICAgICAgICBzdWNjZXNzZnVsbHkgYSBCQSBzZXNzaW9uIGFuZCBuZWVkcyB0byBub3RpZnkgdGhlIEhXIGZvcgorICAgICAgICB0aGUgYXBwcm9wcmlhdGUgc2V0dGluZ3MgdG8gdGFrZSBwbGFjZS4gVXBvbiB0aGUgY2FsbCBvZgorICAgICAgICB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIEFkZCBCQQorICAgICAgICByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMKKyAgICAgICAgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlBZGRCQVJlcVBhcmFtczogdGhlIGFkZCBCQSBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlBZGRCQVJzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZSBvZgorICAgICAgICB0aGUgYWRkIEJBIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9BZGRCQVNlc3Npb25SZXEKKygKKyAgV0RJX0FkZEJBU2Vzc2lvblJlcVBhcmFtc1R5cGUqIHB3ZGlBZGRCQVNlc3Npb25SZXFQYXJhbXMsCisgIFdESV9BZGRCQVNlc3Npb25Sc3BDYiAgICAgICAgICB3ZGlBZGRCQVNlc3Npb25Sc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0FERF9CQV9TRVNTSU9OX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlBZGRCQVNlc3Npb25SZXFQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpQWRkQkFTZXNzaW9uUmVxUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlBZGRCQVNlc3Npb25Sc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0FkZEJBU2Vzc2lvblJlcSovCisKKy8qKgorIEBicmllZiBXRElfRGVsQkFSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHdhbnRzIHRvIAorICAgICAgICBpbmZvcm0gSFcgdGhhdCBpdCBoYXMgZGVsZXRlZCBhIHByZXZpb3VzbHkgY3JlYXRlZCBCQQorICAgICAgICBzZXNzaW9uLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsCisgICAgICAgIHBhY2sgYW5kIHNlbmQgYSBIQUwgRGVsIEJBIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIKKyAgICAgICAgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9BZGRCQVJlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpRGVsQkFSZXFQYXJhbXM6IHRoZSBkZWwgQkEgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpRGVsQkFSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGRlbCBCQSBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9BZGRCQVJlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9EZWxCQVJlcQorKAorICBXRElfRGVsQkFSZXFQYXJhbXNUeXBlKiBwd2RpRGVsQkFSZXFQYXJhbXMsCisgIFdESV9EZWxCQVJzcENiICAgICAgICAgIHdkaURlbEJBUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0RFTF9CQV9SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpRGVsQkFSZXFQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpRGVsQkFSZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaURlbEJBUnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9EZWxCQVJlcSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyIFNhdmUgQVBJcworIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgV0RJX1NldFB3clNhdmVDZmdSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3YW50cyB0byBzZXQgdGhlIHBvd2VyIHNhdmUgcmVsYXRlZCBjb25maWd1cmF0aW9ucyBvZgorICAgICAgICB0aGUgV0xBTiBEZXZpY2UuIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMCisgICAgICAgIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBVcGRhdGUgQ0ZHIHJlcXVlc3QgbWVzc2FnZSB0bworICAgICAgICB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9TdGFydCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gcHdkaVBvd2VyU2F2ZUNmZzogdGhlIHBvd2VyIHNhdmUgY2ZnIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlTZXRQd3JTYXZlQ2ZnQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBzZXQgcG93ZXIgc2F2ZSBjZmcgb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU3RhcnQKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbCAgCisqLyAKK1dESV9TdGF0dXMgCitXRElfU2V0UHdyU2F2ZUNmZ1JlcQorKAorICBXRElfVXBkYXRlQ2ZnUmVxUGFyYW1zVHlwZSogICBwd2RpUG93ZXJTYXZlQ2ZnLAorICBXRElfU2V0UHdyU2F2ZUNmZ0NiICAgICB3ZGlTZXRQd3JTYXZlQ2ZnQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1VQREFURV9DRkdfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVBvd2VyU2F2ZUNmZzsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlQb3dlclNhdmVDZmcpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVNldFB3clNhdmVDZmdDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX1NldFB3clNhdmVDZmdSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX0VudGVySW1wc1JlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgdG8gCisgICAgICAgIHJlcXVlc3QgdGhlIGRldmljZSB0byBnZXQgaW50byBJTVBTIHBvd2VyIHN0YXRlLiBVcG9uCisgICAgICAgIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHNlbmQgYSBIQUwgRW50ZXIKKyAgICAgICAgSU1QUyByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwKKyAgICAgICAgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyAgCisgQHBhcmFtIHdkaUVudGVySW1wc1JzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSAKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIEVudGVyIElNUFMgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU3RhcnQKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfRW50ZXJJbXBzUmVxCisoCisgICBXRElfRW50ZXJJbXBzUnNwQ2IgIHdkaUVudGVySW1wc1JzcENiLAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfRU5URVJfSU1QU19SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBOVUxMOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IDA7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpRW50ZXJJbXBzUnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9FbnRlckltcHNSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX0V4aXRJbXBzUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB0byAKKyAgICAgICAgcmVxdWVzdCB0aGUgZGV2aWNlIHRvIGdldCBvdXQgb2YgSU1QUyBwb3dlciBzdGF0ZS4gVXBvbgorICAgICAgICB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBzZW5kIGEgSEFMIEV4aXQKKyAgICAgICAgSU1QUyByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwKKyAgICAgICAgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyAKKworIEBwYXJhbSB3ZGlFeGl0SW1wc1JzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZSAKKyAgICAgICAgb2YgdGhlIEV4aXQgSU1QUyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9TdGFydAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9FeGl0SW1wc1JlcQorKAorICAgV0RJX0V4aXRJbXBzUnNwQ2IgIHdkaUV4aXRJbXBzUnNwQ2IsCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9FWElUX0lNUFNfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gTlVMTDsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSAwOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUV4aXRJbXBzUnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9FeGl0SW1wc1JlcSovCisKKy8qKgorIEBicmllZiBXRElfRW50ZXJCbXBzUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB0byAKKyAgICAgICAgcmVxdWVzdCB0aGUgZGV2aWNlIHRvIGdldCBpbnRvIEJNUFMgcG93ZXIgc3RhdGUuIFVwb24KKyAgICAgICAgdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhCisgICAgICAgIEhBTCBFbnRlciBCTVBTIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlFbnRlckJtcHNSZXFQYXJhbXM6IHRoZSBFbnRlciBCTVBTIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlFbnRlckJtcHNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIEVudGVyIEJNUFMgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0VudGVyQm1wc1JlcQorKAorICAgV0RJX0VudGVyQm1wc1JlcVBhcmFtc1R5cGUgKnB3ZGlFbnRlckJtcHNSZXFQYXJhbXMsCisgICBXRElfRW50ZXJCbXBzUnNwQ2IgIHdkaUVudGVyQm1wc1JzcENiLAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfRU5URVJfQk1QU19SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpRW50ZXJCbXBzUmVxUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaUVudGVyQm1wc1JlcVBhcmFtcyk7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpRW50ZXJCbXBzUnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9FbnRlckJtcHNSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX0V4aXRCbXBzUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB0byAKKyAgICAgICAgcmVxdWVzdCB0aGUgZGV2aWNlIHRvIGdldCBvdXQgb2YgQk1QUyBwb3dlciBzdGF0ZS4gVXBvbgorICAgICAgICB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEKKyAgICAgICAgSEFMIEV4aXQgQk1QUyByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpRXhpdEJtcHNSZXFQYXJhbXM6IHRoZSBFeGl0IEJNUFMgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUV4aXRCbXBzUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlCisgICAgICAgIG9mIHRoZSBFeGl0IEJNUFMgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0V4aXRCbXBzUmVxCisoCisgICBXRElfRXhpdEJtcHNSZXFQYXJhbXNUeXBlICpwd2RpRXhpdEJtcHNSZXFQYXJhbXMsCisgICBXRElfRXhpdEJtcHNSc3BDYiAgd2RpRXhpdEJtcHNSc3BDYiwKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0VYSVRfQk1QU19SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpRXhpdEJtcHNSZXFQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpRXhpdEJtcHNSZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUV4aXRCbXBzUnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9FeGl0Qm1wc1JlcSovCisKKy8qKgorIEBicmllZiBXRElfRW50ZXJVYXBzZFJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgdG8gCisgICAgICAgIHJlcXVlc3QgdGhlIGRldmljZSB0byBnZXQgaW50byBVQVBTRCBwb3dlciBzdGF0ZS4gVXBvbgorICAgICAgICB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEKKyAgICAgICAgSEFMIEVudGVyIFVBUFNEIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorIFdESV9TZXRVYXBzZEFjUGFyYW1zUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgCisgQHBhcmFtIHB3ZGlFbnRlclVhcHNkUmVxUGFyYW1zOiB0aGUgRW50ZXIgVUFQU0QgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUVudGVyVWFwc2RSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIEVudGVyIFVBUFNEIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcSwgV0RJX1NldFVhcHNkQWNQYXJhbXNSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfRW50ZXJVYXBzZFJlcQorKAorICAgV0RJX0VudGVyVWFwc2RSZXFQYXJhbXNUeXBlICpwd2RpRW50ZXJVYXBzZFJlcVBhcmFtcywKKyAgIFdESV9FbnRlclVhcHNkUnNwQ2IgIHdkaUVudGVyVWFwc2RSc3BDYiwKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0VOVEVSX1VBUFNEX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlFbnRlclVhcHNkUmVxUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaUVudGVyVWFwc2RSZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUVudGVyVWFwc2RSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0VudGVyVWFwc2RSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX0V4aXRVYXBzZFJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgdG8gCisgICAgICAgIHJlcXVlc3QgdGhlIGRldmljZSB0byBnZXQgb3V0IG9mIFVBUFNEIHBvd2VyIHN0YXRlLiBVcG9uCisgICAgICAgIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHNlbmQgYSBIQUwgRXhpdAorICAgICAgICBVQVBTRCByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZgorICAgICAgICBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlFeGl0VWFwc2RSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBFeGl0IFVBUFNEIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9FeGl0VWFwc2RSZXEKKygKKyAgIFdESV9FeGl0VWFwc2RSc3BDYiAgd2RpRXhpdFVhcHNkUnNwQ2IsCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9FWElUX1VBUFNEX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IE5VTEw7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gMDsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlFeGl0VWFwc2RSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0V4aXRVYXBzZFJlcSovCisKKy8qKgorIEBicmllZiBXRElfVXBkYXRlVWFwc2RQYXJhbXNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgCisgICAgICAgIE1BQyB3YW50cyB0byBzZXQgdGhlIFVBUFNEIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMKKyAgICAgICAgb2YgYW4gYXNzb2NpYXRlZCBTVEEgKHdoaWxlIGFjdGluZyBhcyBhbiBBUCkgdG8gdGhlIFdMQU4KKyAgICAgICAgRGV2aWNlLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sKKyAgICAgICAgYW5kIHNlbmQgYSBIQUwgVXBkYXRlIFVBUFNEIHBhcmFtcyByZXF1ZXN0IG1lc3NhZ2UgdG8KKyAgICAgICAgdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfQ29uZmlnQlNTUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpVXBkYXRlVWFwc2RSZXFQYXJhbXM6IHRoZSBVQVBTRCBwYXJhbWV0ZXJzIAorICAgICAgICAgICAgICAgICAgICAgIGFzIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpVXBkYXRlVWFwc2RQYXJhbXNDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHVwZGF0ZSBVQVBTRCBwYXJhbXMgb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfQ29uZmlnQlNTUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1VwZGF0ZVVhcHNkUGFyYW1zUmVxCisoCisgICBXRElfVXBkYXRlVWFwc2RSZXFQYXJhbXNUeXBlICpwd2RpVXBkYXRlVWFwc2RSZXFQYXJhbXMsCisgICBXRElfVXBkYXRlVWFwc2RQYXJhbXNDYiAgd2RpVXBkYXRlVWFwc2RQYXJhbXNDYiwKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1VQREFURV9VQVBTRF9QQVJBTV9SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpVXBkYXRlVWFwc2RSZXFQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpVXBkYXRlVWFwc2RSZXFQYXJhbXMpOzsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlVcGRhdGVVYXBzZFBhcmFtc0NiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfVXBkYXRlVWFwc2RQYXJhbXNSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX1NldFVhcHNkQWNQYXJhbXNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgCisgICAgICAgIE1BQyB3YW50cyB0byBzZXQgdGhlIFVBUFNEIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMgYmVmb3JlCisgICAgICAgIHJlcXVlc3RpbmcgZm9yIGVudGVyIFVBUFNEIHBvd2VyIHN0YXRlIHRvIHRoZSBXTEFOCisgICAgICAgIERldmljZS4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrCisgICAgICAgIGFuZCBzZW5kIGEgSEFMIFNldCBVQVBTRCBwYXJhbXMgcmVxdWVzdCBtZXNzYWdlIHRvCisgICAgICAgIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gcHdkaVVhcHNkSW5mbzogdGhlIFVBUFNEIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVNldFVhcHNkQWNQYXJhbXNDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHNldCBVQVBTRCBwYXJhbXMgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20KKyAgICAgICAgdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NldFVhcHNkQWNQYXJhbXNSZXEKKygKKyAgV0RJX1NldFVhcHNkQWNQYXJhbXNSZXFQYXJhbXNUeXBlKiAgICAgIHB3ZGlVYXBzZEluZm8sCisgIFdESV9TZXRVYXBzZEFjUGFyYW1zQ2IgIHdkaVNldFVhcHNkQWNQYXJhbXNDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfU0VUX1VBUFNEX1BBUkFNX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlVYXBzZEluZm87IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpVWFwc2RJbmZvKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlTZXRVYXBzZEFjUGFyYW1zQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9TZXRVYXBzZEFjUGFyYW1zUmVxKi8KKworLyoqCisgQGJyaWVmIFdESV9Db25maWd1cmVSeHBGaWx0ZXJSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgCisgICAgICAgIE1BQyB3YW50cyB0byBzZXQvcmVzZXQgdGhlIFJYUCBmaWx0ZXJzIGZvciByZWNlaXZlZCBwa3RzCisgICAgICAgIChNQywgQkMgZXRjLikuIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjaworICAgICAgICBhbmQgc2VuZCBhIEhBTCBjb25maWd1cmUgUlhQIGZpbHRlciByZXF1ZXN0IG1lc3NhZ2UgdG8KKyAgICAgICAgdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbS4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyAgCisgQHBhcmFtIHB3ZGlDb25maWd1cmVSeHBGaWx0ZXJSZXFQYXJhbXM6IHRoZSBSWFAgCisgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIGFzIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlDb25maWd1cmVSeHBGaWx0ZXJDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIGNvbmZpZ3VyZSBSWFAgZmlsdGVyIG9wZXJhdGlvbiByZWNlaXZlZAorICAgICAgICBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9Db25maWd1cmVSeHBGaWx0ZXJSZXEKKygKKyAgIFdESV9Db25maWd1cmVSeHBGaWx0ZXJSZXFQYXJhbXNUeXBlICpwd2RpQ29uZmlndXJlUnhwRmlsdGVyUmVxUGFyYW1zLAorICAgV0RJX0NvbmZpZ3VyZVJ4cEZpbHRlckNiICAgICAgICAgICAgIHdkaUNvbmZpZ3VyZVJ4cEZpbHRlckNiLAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0NPTkZJR1VSRV9SWFBfRklMVEVSX1JFUTsKKyAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpQ29uZmlndXJlUnhwRmlsdGVyUmVxUGFyYW1zOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlDb25maWd1cmVSeHBGaWx0ZXJSZXFQYXJhbXMpOyAKKyAgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlDb25maWd1cmVSeHBGaWx0ZXJDYjsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfS8qV0RJX0NvbmZpZ3VyZVJ4cEZpbHRlclJlcSovCisKKy8qKgorIEBicmllZiBXRElfU2V0QmVhY29uRmlsdGVyUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQworICAgICAgICB3YW50cyB0byBzZXQgdGhlIGJlYWNvbiBmaWx0ZXJzIHdoaWxlIGluIHBvd2VyIHNhdmUuCisgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQKKyAgICAgICAgc2VuZCBhIEJlYWNvbiBmaWx0ZXIgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZQorICAgICAgICBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0uCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgIAorIEBwYXJhbSBwd2RpQmVhY29uRmlsdGVyUmVxUGFyYW1zOiB0aGUgYmVhY29uIAorICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciBhcyBzcGVjaWZpZWQgYnkgdGhlIERldmljZQorICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpQmVhY29uRmlsdGVyQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBzZXQgYmVhY29uIGZpbHRlciBvcGVyYXRpb24gcmVjZWl2ZWQKKyAgICAgICAgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU2V0QmVhY29uRmlsdGVyUmVxCisoCisgICBXRElfQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZSAgICpwd2RpQmVhY29uRmlsdGVyUmVxUGFyYW1zLAorICAgV0RJX1NldEJlYWNvbkZpbHRlckNiICAgICAgICAgICAgd2RpQmVhY29uRmlsdGVyQ2IsCisgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9TRVRfQkVBQ09OX0ZJTFRFUl9SRVE7CisgICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaUJlYWNvbkZpbHRlclJlcVBhcmFtczsgCisgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpQmVhY29uRmlsdGVyUmVxUGFyYW1zKTs7IAorICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUJlYWNvbkZpbHRlckNiOyAKKyAgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7Cit9LypXRElfU2V0QmVhY29uRmlsdGVyUmVxKi8KKworLyoqCisgQGJyaWVmIFdESV9SZW1CZWFjb25GaWx0ZXJSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDCisgICAgICAgIHdhbnRzIHRvIHJlbW92ZSB0aGUgYmVhY29uIGZpbHRlciBmb3IgcGFydGljdWxhciBJRQorICAgICAgICB3aGlsZSBpbiBwb3dlciBzYXZlLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOCisgICAgICAgIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSByZW1vdmUgQmVhY29uIGZpbHRlciByZXF1ZXN0CisgICAgICAgIG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbS4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyAgCisgQHBhcmFtIHB3ZGlCZWFjb25GaWx0ZXJSZXFQYXJhbXM6IHRoZSBiZWFjb24gCisgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIGFzIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlCZWFjb25GaWx0ZXJDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHJlbW92ZSBiZWFjb24gZmlsdGVyIG9wZXJhdGlvbiByZWNlaXZlZAorICAgICAgICBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9SZW1CZWFjb25GaWx0ZXJSZXEKKygKKyAgIFdESV9SZW1CZWFjb25GaWx0ZXJSZXFQYXJhbXNUeXBlICpwd2RpQmVhY29uRmlsdGVyUmVxUGFyYW1zLAorICAgV0RJX1JlbUJlYWNvbkZpbHRlckNiICAgICAgICAgICAgIHdkaUJlYWNvbkZpbHRlckNiLAorICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1JFTV9CRUFDT05fRklMVEVSX1JFUTsKKyAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpQmVhY29uRmlsdGVyUmVxUGFyYW1zOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlCZWFjb25GaWx0ZXJSZXFQYXJhbXMpOzsgCisgICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpQmVhY29uRmlsdGVyQ2I7IAorICAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKK30vKldESV9SZW1CZWFjb25GaWx0ZXJSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX1NldFJTU0lUaHJlc2hvbGRzUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIAorICAgICAgICBNQUMgd2FudHMgdG8gc2V0IHRoZSBSU1NJIHRocmVzaG9sZHMgcmVsYXRlZAorICAgICAgICBjb25maWd1cmF0aW9ucyB3aGlsZSBpbiBwb3dlciBzYXZlLiBVcG9uIHRoZSBjYWxsIG9mCisgICAgICAgIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwgU2V0IFJTU0kKKyAgICAgICAgdGhyZXNob2xkcyByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpVWFwc2RJbmZvOiB0aGUgVUFQU0QgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU2V0VWFwc2RBY1BhcmFtc0NiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgc2V0IFVBUFNEIHBhcmFtcyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbQorICAgICAgICB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU2V0UlNTSVRocmVzaG9sZHNSZXEKKygKKyAgV0RJX1NldFJTU0lUaHJlc2hvbGRzUmVxUGFyYW1zVHlwZSogICAgICBwd2RpUlNTSVRocmVzaG9sZHNQYXJhbXMsCisgIFdESV9TZXRSU1NJVGhyZXNob2xkc0NiICAgICAgICAgICAgICAgICAgd2RpU2V0UlNTSVRocmVzaG9sZHNDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9TRVRfUlNTSV9USFJFU0hPTERTX1JFUTsKKyAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpUlNTSVRocmVzaG9sZHNQYXJhbXM7IAorICAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVJTU0lUaHJlc2hvbGRzUGFyYW1zKTs7IAorICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVNldFJTU0lUaHJlc2hvbGRzQ2I7IAorICAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKK30vKiBXRElfU2V0UlNTSVRocmVzaG9sZHNSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX0hvc3RPZmZsb2FkUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2FudHMgdG8gc2V0IHRoZSBmaWx0ZXIgdG8gbWluaW1pemUgdW5uZWNlc3NhcnkgaG9zdAorICAgICAgICB3YWtldXAgZHVlIHRvIGJyb2FkY2FzdCB0cmFmZmljIHdoaWxlIGluIHBvd2VyIHNhdmUuCisgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQKKyAgICAgICAgc2VuZCBhIEhBTCBob3N0IG9mZmxvYWQgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZQorICAgICAgICBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gcHdkaUhvc3RPZmZsb2FkUGFyYW1zOiB0aGUgaG9zdCBvZmZsb2FkIGFzIHNwZWNpZmllZCAKKyAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpSG9zdE9mZmxvYWRDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIGhvc3Qgb2ZmbG9hZCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfSG9zdE9mZmxvYWRSZXEKKygKKyAgV0RJX0hvc3RPZmZsb2FkUmVxUGFyYW1zVHlwZSogICAgICBwd2RpSG9zdE9mZmxvYWRQYXJhbXMsCisgIFdESV9Ib3N0T2ZmbG9hZENiICAgICAgICAgICAgICAgICAgd2RpSG9zdE9mZmxvYWRDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9IT1NUX09GRkxPQURfUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlIb3N0T2ZmbG9hZFBhcmFtczsgCisgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpSG9zdE9mZmxvYWRQYXJhbXMpOzsgCisgICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpSG9zdE9mZmxvYWRDYjsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfS8qV0RJX0hvc3RPZmZsb2FkUmVxKi8KKworLyoqCisgQGJyaWVmIFdESV9LZWVwQWxpdmVSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3YW50cyB0byBzZXQgdGhlIGZpbHRlciB0byBzZW5kIE5VTEwgb3IgdW5zb2xpY2l0ZWQgQVJQIHJlc3BvbnNlcyAKKyAgICAgICAgYW5kIG1pbmltaXplIHVubmVjZXNzYXJ5IGhvc3Qgd2FrZXVwcyBkdWUgdG8gd2hpbGUgaW4gcG93ZXIgc2F2ZS4KKyAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZAorICAgICAgICBzZW5kIGEgSEFMIEtlZXAgQWxpdmUgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZQorICAgICAgICBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gcHdkaUtlZXBBbGl2ZVBhcmFtczogdGhlIEtlZXAgQWxpdmUgYXMgc3BlY2lmaWVkIAorICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlLZWVwQWxpdmVDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIEtlZXAgQWxpdmUgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0tlZXBBbGl2ZVJlcQorKAorICBXRElfS2VlcEFsaXZlUmVxUGFyYW1zVHlwZSogICAgICAgIHB3ZGlLZWVwQWxpdmVQYXJhbXMsCisgIFdESV9LZWVwQWxpdmVDYiAgICAgICAgICAgICAgICAgICAgd2RpS2VlcEFsaXZlQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgICAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgICB7CisgICAgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiV0RJX0tlZXBBbGl2ZVJlcTogV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgIgorICAgICAgICAgICAgICAgICAgICAiaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0tFRVBfQUxJVkVfUkVROworICAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpS2VlcEFsaXZlUGFyYW1zOyAKKyAgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpS2VlcEFsaXZlUGFyYW1zKTsgCisgICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUtlZXBBbGl2ZUNiOyAKKyAgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKK30vKldESV9LZWVwQWxpdmVSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX1dvd2xBZGRCY1B0cm5SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3YW50cyB0byBzZXQgdGhlIFdvd2wgQmNhc3QgcHRybiB0byBtaW5pbWl6ZSB1bm5lY2Vzc2FyeQorICAgICAgICBob3N0IHdha2V1cCBkdWUgdG8gYnJvYWRjYXN0IHRyYWZmaWMgd2hpbGUgaW4gcG93ZXIKKyAgICAgICAgc2F2ZS4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrCisgICAgICAgIGFuZCBzZW5kIGEgSEFMIFdvd2wgQmNhc3QgcHRybiByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlCisgICAgICAgIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpV293bEFkZEJjUHRyblBhcmFtczogdGhlIFdvd2wgYmNhc3QgcHRybiBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVdvd2xBZGRCY1B0cm5DYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIGFkZCBXb3dsIGJjYXN0IHB0cm4gb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1dvd2xBZGRCY1B0cm5SZXEKKygKKyAgV0RJX1dvd2xBZGRCY1B0cm5SZXFQYXJhbXNUeXBlKiAgICBwd2RpV293bEFkZEJjUHRyblBhcmFtcywKKyAgV0RJX1dvd2xBZGRCY1B0cm5DYiAgICAgICAgICAgICAgICB3ZGlXb3dsQWRkQmNQdHJuQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfV09XTF9BRERfQkNfUFRSTl9SRVE7CisgICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXM7IAorICAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMpOzsgCisgICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpV293bEFkZEJjUHRybkNiOyAKKyAgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7Cit9LypXRElfV293bEFkZEJjUHRyblJlcSovCisKKy8qKgorIEBicmllZiBXRElfV293bERlbEJjUHRyblJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgCisgICAgICAgIHdhbnRzIHRvIGNsZWFyIHRoZSBXb3dsIEJjYXN0IHB0cm4uIFVwb24gdGhlIGNhbGwgb2YKKyAgICAgICAgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBkZWxldGUKKyAgICAgICAgV293bCBCY2FzdCBwdHJuIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Xb3dsQWRkQmNQdHJuUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpV293bERlbEJjUHRyblBhcmFtczogdGhlIFdvd2wgYmNhc3QgcHRybiBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVdvd2xEZWxCY1B0cm5DYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIGRlbCBXb3dsIGJjYXN0IHB0cm4gb3BlcmF0aW9uIHJlY2VpdmVkCisgICAgICAgIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfV293bEFkZEJjUHRyblJlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9Xb3dsRGVsQmNQdHJuUmVxCisoCisgIFdESV9Xb3dsRGVsQmNQdHJuUmVxUGFyYW1zVHlwZSogICAgcHdkaVdvd2xEZWxCY1B0cm5QYXJhbXMsCisgIFdESV9Xb3dsRGVsQmNQdHJuQ2IgICAgICAgICAgICAgICAgd2RpV293bERlbEJjUHRybkNiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1dPV0xfREVMX0JDX1BUUk5fUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlXb3dsRGVsQmNQdHJuUGFyYW1zOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlXb3dsRGVsQmNQdHJuUGFyYW1zKTs7IAorICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVdvd2xEZWxCY1B0cm5DYjsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfS8qV0RJX1dvd2xEZWxCY1B0cm5SZXEqLworCisvKioKKyBAYnJpZWYgV0RJX1dvd2xFbnRlclJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgCisgICAgICAgIHdhbnRzIHRvIGVudGVyIHRoZSBXb3dsIHN0YXRlIHRvIG1pbmltaXplIHVubmVjZXNzYXJ5CisgICAgICAgIGhvc3Qgd2FrZXVwIHdoaWxlIGluIHBvd2VyIHNhdmUuIFVwb24gdGhlIGNhbGwgb2YgdGhpcworICAgICAgICBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBXb3dsIGVudGVyCisgICAgICAgIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcworICAgICAgICBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlXb3dsRW50ZXJSZXFQYXJhbXM6IHRoZSBXb3dsIGVudGVyIGluZm8gYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlXb3dsRW50ZXJSZXFDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIGVudGVyIFdvd2wgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1dvd2xFbnRlclJlcQorKAorICBXRElfV293bEVudGVyUmVxUGFyYW1zVHlwZSogICAgcHdkaVdvd2xFbnRlclBhcmFtcywKKyAgV0RJX1dvd2xFbnRlclJlcUNiICAgICAgICAgICAgIHdkaVdvd2xFbnRlckNiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfV09XTF9FTlRFUl9SRVE7CisgICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVdvd2xFbnRlclBhcmFtczsgCisgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpV293bEVudGVyUGFyYW1zKTs7IAorICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVdvd2xFbnRlckNiOyAKKyAgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7Cit9LypXRElfV293bEVudGVyUmVxKi8KKworLyoqCisgQGJyaWVmIFdESV9Xb3dsRXhpdFJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgCisgICAgICAgIHdhbnRzIHRvIGV4aXQgdGhlIFdvd2wgc3RhdGUuIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkKKyAgICAgICAgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBXb3dsIGV4aXQgcmVxdWVzdAorICAgICAgICBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlCisgICAgICAgIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1dvd2xFbnRlclJlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gcHdkaVdvd2xFeGl0UmVxUGFyYW1zOiB0aGUgV293bCBleGl0IGluZm8gYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlXb3dsRXhpdFJlcUNiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZQorICAgICAgICBvZiB0aGUgZXhpdCBXb3dsIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1dvd2xFbnRlclJlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9Xb3dsRXhpdFJlcQorKAorICBXRElfV293bEV4aXRSZXFDYiAgICAgICAgICAgICAgd2RpV293bEV4aXRDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1dPV0xfRVhJVF9SRVE7CisgICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gTlVMTDsgCisgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gMDsgCisgICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpV293bEV4aXRDYjsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfS8qV0RJX1dvd2xFeGl0UmVxKi8KKworLyoqCisgQGJyaWVmIFdESV9Db25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiAKKyAgICAgICAgdGhlIHVwcGVyIE1BQyB3YW50cyB0byBkeW5hbWljYWxseSBhZGp1c3RzIHRoZSBsaXN0ZW4KKyAgICAgICAgaW50ZXJ2YWwgYmFzZWQgb24gdGhlIFdMQU4vTVNNIGFjdGl2aXR5LiBVcG9uIHRoZSBjYWxsCisgICAgICAgIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwKKyAgICAgICAgY29uZmlndXJlIEFwcHMgQ3B1IFdha2V1cCBTdGF0ZSByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlCisgICAgICAgIGxvd2VyIFJJVkEgc3ViLXN5c3RlbS4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyAgCisgQHBhcmFtIHB3ZGlDb25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVSZXFQYXJhbXM6IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICBBcHBzIENwdSBXYWtldXAgU3RhdGUgYXMgc3BlY2lmaWVkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUNvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZUNiOiBjYWxsYmFjayBmb3IgcGFzc2luZworICAgICAgICBiYWNrIHRoZSByZXNwb25zZSBvZiB0aGUgY29uZmlndXJlIEFwcHMgQ3B1IFdha2V1cCBTdGF0ZQorICAgICAgICBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlUmVxCisoCisgICBXRElfQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlUmVxUGFyYW1zVHlwZSAqcHdkaUNvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZVJlcVBhcmFtcywKKyAgIFdESV9Db25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVDYiAgICAgICAgICAgICB3ZGlDb25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVDYiwKKyAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9DT05GSUdVUkVfQVBQU19DUFVfV0FLRVVQX1NUQVRFX1JFUTsKKyAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlUmVxUGFyYW1zOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlDb25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVSZXFQYXJhbXMpOyAKKyAgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlDb25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVDYjsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfS8qV0RJX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZVJlcSovCisvKioKKyBAYnJpZWYgV0RJX0ZsdXNoQWNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIHdhbnRzIAorICAgICAgICB0byB0byBwZXJmb3JtIGEgZmx1c2ggb3BlcmF0aW9uIG9uIGEgZ2l2ZW4gQUMuIFVwb24gdGhlCisgICAgICAgIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTAorICAgICAgICBGbHVzaCBBQyByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEgc3ViLXN5c3RlbSBpZgorICAgICAgICBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfQWRkQkFSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlGbHVzaEFjUmVxUGFyYW1zOiB0aGUgRmx1c2ggQUMgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUZsdXNoQWNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIEZsdXNoIEFDIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX0FkZEJBUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0ZsdXNoQWNSZXEKKygKKyAgV0RJX0ZsdXNoQWNSZXFQYXJhbXNUeXBlKiBwd2RpRmx1c2hBY1JlcVBhcmFtcywKKyAgV0RJX0ZsdXNoQWNSc3BDYiAgICAgICAgICB3ZGlGbHVzaEFjUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfRkxVU0hfQUNfUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlGbHVzaEFjUmVxUGFyYW1zOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlGbHVzaEFjUmVxUGFyYW1zKTsgCisgICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpRmx1c2hBY1JzcENiOyAKKyAgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9GbHVzaEFjUmVxKi8KKworLyoqCisgQGJyaWVmIFdESV9CdEFtcEV2ZW50UmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2FudHMgdG8gbm90aWZ5IHRoZSBsb3dlciBtYWMgb24gYSBCVCBBTVAgZXZlbnQuIFRoaXMgaXMKKyAgICAgICAgdG8gaW5mb3JtIEJUQy1TTE0gdGhhdCBzb21lIEJUIEFNUCBldmVudCBvY2N1cnJlZC4gVXBvbgorICAgICAgICB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEKKyAgICAgICAgSEFMIEJUIEFNUCBldmVudCByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyAgCisgQHBhcmFtIHdkaUJ0QW1wRXZlbnRSZXFQYXJhbXM6IHRoZSBCVCBBTVAgZXZlbnQgcGFyYW1ldGVycyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUJ0QW1wRXZlbnRSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIEJUIEFNUCBldmVudCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9CdEFtcEV2ZW50UmVxCisoCisgIFdESV9CdEFtcEV2ZW50UGFyYW1zVHlwZSogcHdkaUJ0QW1wRXZlbnRSZXFQYXJhbXMsCisgIFdESV9CdEFtcEV2ZW50UnNwQ2IgICAgICAgd2RpQnRBbXBFdmVudFJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0JUQU1QX0VWRU5UX1JFUTsKKyAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpQnRBbXBFdmVudFJlcVBhcmFtczsgCisgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpQnRBbXBFdmVudFJlcVBhcmFtcyk7IAorICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUJ0QW1wRXZlbnRSc3BDYjsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfQnRBbXBFdmVudFJlcSovCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVFJPTCBBUElzCisgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioKKyBAYnJpZWYgV0RJX1N3aXRjaENoUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB3YW50cyAKKyAgICAgICAgdGhlIFdMQU4gSFcgdG8gY2hhbmdlIHRoZSBjdXJyZW50IGNoYW5uZWwgb2Ygb3BlcmF0aW9uLgorICAgICAgICBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kCisgICAgICAgIHNlbmQgYSBIQUwgU3RhcnQgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBCisgICAgICAgIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1N0YXJ0IG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlTd2l0Y2hDaFJlcVBhcmFtczogdGhlIHN3aXRjaCBjaCBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU3dpdGNoQ2hSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIHN3aXRjaCBjaCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9TdGFydAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9Td2l0Y2hDaFJlcQorKAorICBXRElfU3dpdGNoQ2hSZXFQYXJhbXNUeXBlKiBwd2RpU3dpdGNoQ2hSZXFQYXJhbXMsCisgIFdESV9Td2l0Y2hDaFJzcENiICAgICAgICAgIHdkaVN3aXRjaENoUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0NIX1NXSVRDSF9SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpU3dpdGNoQ2hSZXFQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpU3dpdGNoQ2hSZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVN3aXRjaENoUnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9Td2l0Y2hDaFJlcSovCisKKworLyoqCisgQGJyaWVmIFdESV9Db25maWdTVEFSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3aXNoZXMgdG8gYWRkIG9yIHVwZGF0ZSBhIFNUQSBpbiBIVy4gVXBvbiB0aGUgY2FsbCBvZgorICAgICAgICB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIFN0YXJ0CisgICAgICAgIG1lc3NhZ2UgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYKKyAgICAgICAgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1N0YXJ0IG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlDb25maWdTVEFSZXFQYXJhbXM6IHRoZSBjb25maWcgU1RBIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlDb25maWdTVEFSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIGNvbmZpZyBTVEEgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlCisgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU3RhcnQKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfQ29uZmlnU1RBUmVxCisoCisgIFdESV9Db25maWdTVEFSZXFQYXJhbXNUeXBlKiBwd2RpQ29uZmlnU1RBUmVxUGFyYW1zLAorICBXRElfQ29uZmlnU1RBUnNwQ2IgICAgICAgICAgd2RpQ29uZmlnU1RBUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9DT05GSUdfU1RBX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlDb25maWdTVEFSZXFQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpQ29uZmlnU1RBUmVxUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlDb25maWdTVEFSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0NvbmZpZ1NUQVJlcSovCisKKy8qKgorIEBicmllZiBXRElfU2V0TGlua1N0YXRlUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2FudHMgdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZiBhbiBvbmdvaW5nIGxpbmsuIFVwb24gdGhlCisgICAgICAgIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTAorICAgICAgICBTdGFydCBtZXNzYWdlIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Kb2luU3RhcnRSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaVNldExpbmtTdGF0ZVJlcVBhcmFtczogdGhlIHNldCBsaW5rIHN0YXRlIHBhcmFtZXRlcnMgCisgICAgICAgICAgICAgICAgICAgICAgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlTZXRMaW5rU3RhdGVSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHNldCBsaW5rIHN0YXRlIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tCisgICAgICAgIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX0pvaW5TdGFydFJlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZXRMaW5rU3RhdGVSZXEKKygKKyAgV0RJX1NldExpbmtSZXFQYXJhbXNUeXBlKiBwd2RpU2V0TGlua1N0YXRlUmVxUGFyYW1zLAorICBXRElfU2V0TGlua1N0YXRlUnNwQ2IgICAgIHdkaVNldExpbmtTdGF0ZVJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1NFVF9MSU5LX1NUX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlTZXRMaW5rU3RhdGVSZXFQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpU2V0TGlua1N0YXRlUmVxUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlTZXRMaW5rU3RhdGVSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX1NldExpbmtTdGF0ZVJlcSovCisKKworLyoqCisgQGJyaWVmIFdESV9HZXRTdGF0c1JlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgd2FudHMgCisgICAgICAgIHRvIGdldCBzdGF0aXN0aWNzIChNSUIgY291bnRlcnMpIGZyb20gdGhlIGRldmljZS4gVXBvbgorICAgICAgICB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEKKyAgICAgICAgSEFMIFN0YXJ0IHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtCisgICAgICAgIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9TdGFydCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpR2V0U3RhdHNSZXFQYXJhbXM6IHRoZSBzdGF0cyBwYXJhbWV0ZXJzIHRvIGdldCBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUdldFN0YXRzUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlCisgICAgICAgIG9mIHRoZSBnZXQgc3RhdHMgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfU3RhcnQKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfR2V0U3RhdHNSZXEKKygKKyAgV0RJX0dldFN0YXRzUmVxUGFyYW1zVHlwZSogcHdkaUdldFN0YXRzUmVxUGFyYW1zLAorICBXRElfR2V0U3RhdHNSc3BDYiAgICAgICAgICB3ZGlHZXRTdGF0c1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9HRVRfU1RBVFNfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaUdldFN0YXRzUmVxUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaUdldFN0YXRzUmVxUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlHZXRTdGF0c1JzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfR2V0U3RhdHNSZXEqLworCisKKy8qKgorIEBicmllZiBXRElfVXBkYXRlQ2ZnUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB3aGVuIAorICAgICAgICBpdCB3aXNoZXMgdG8gY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBXTEFOCisgICAgICAgIERldmljZS4gVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrCisgICAgICAgIGFuZCBzZW5kIGEgSEFMIFVwZGF0ZSBDRkcgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlcgorICAgICAgICBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1N0YXJ0IG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSB3ZGlVcGRhdGVDZmdSZXFQYXJhbXM6IHRoZSB1cGRhdGUgY2ZnIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlVcGRhdGVDZmdzUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSB1cGRhdGUgY2ZnIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1N0YXJ0CisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1VwZGF0ZUNmZ1JlcQorKAorICBXRElfVXBkYXRlQ2ZnUmVxUGFyYW1zVHlwZSogcHdkaVVwZGF0ZUNmZ1JlcVBhcmFtcywKKyAgV0RJX1VwZGF0ZUNmZ1JzcENiICAgICAgICAgIHdkaVVwZGF0ZUNmZ3NSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1VQREFURV9DRkdfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVVwZGF0ZUNmZ1JlcVBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlVcGRhdGVDZmdSZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVVwZGF0ZUNmZ3NSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX1VwZGF0ZUNmZ1JlcSovCisKKworCisvKioKKyBAYnJpZWYgV0RJX0FkZEJBUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBoYXMgc2V0dXAKKyAgICAgICAgc3VjY2Vzc2Z1bGx5IGEgQkEgc2Vzc2lvbiBhbmQgbmVlZHMgdG8gbm90aWZ5IHRoZSBIVyBmb3IKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHNldHRpbmdzIHRvIHRha2UgcGxhY2UuIFVwb24gdGhlIGNhbGwgb2YKKyAgICAgICAgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBBZGQgQkEKKyAgICAgICAgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzCisgICAgICAgIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpQWRkQkFSZXFQYXJhbXM6IHRoZSBhZGQgQkEgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpQWRkQkFSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGFkZCBCQSBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfQWRkQkFSZXEKKygKKyAgV0RJX0FkZEJBUmVxUGFyYW1zVHlwZSogcHdkaUFkZEJBUmVxUGFyYW1zLAorICBXRElfQWRkQkFSc3BDYiAgICAgICAgICB3ZGlBZGRCQVJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9BRERfQkFfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaUFkZEJBUmVxUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaUFkZEJBUmVxUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlBZGRCQVJzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfQWRkQkFSZXEqLworCisKKy8qKgorIEBicmllZiBXRElfVHJpZ2dlckJBUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyBoYXMgc2V0dXAKKyAgICAgICAgc3VjY2Vzc2Z1bGx5IGEgQkEgc2Vzc2lvbiBhbmQgbmVlZHMgdG8gbm90aWZ5IHRoZSBIVyBmb3IKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHNldHRpbmdzIHRvIHRha2UgcGxhY2UuIFVwb24gdGhlIGNhbGwgb2YKKyAgICAgICAgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBBZGQgQkEKKyAgICAgICAgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzCisgICAgICAgIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgV0RJX1Bvc3RBc3NvY1JlcSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisKKyBAcGFyYW0gd2RpQWRkQkFSZXFQYXJhbXM6IHRoZSBhZGQgQkEgcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpQWRkQkFSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIGFkZCBCQSBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfVHJpZ2dlckJBUmVxCisoCisgIFdESV9UcmlnZ2VyQkFSZXFQYXJhbXNUeXBlKiBwd2RpVHJpZ2dlckJBUmVxUGFyYW1zLAorICBXRElfVHJpZ2dlckJBUnNwQ2IgICAgICAgICAgd2RpVHJpZ2dlckJBUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9UUklHR0VSX0JBX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlUcmlnZ2VyQkFSZXFQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpVHJpZ2dlckJBUmVxUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlUcmlnZ2VyQkFSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0FkZEJBUmVxKi8KKworLyoqCisgQGJyaWVmIFdESV9VcGRhdGVCZWFjb25QYXJhbXNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3aXNoZXMgdG8gdXBkYXRlIGFueSBvZiB0aGUgQmVhY29uIHBhcmFtZXRlcnMgdXNlZCBieSBIVy4KKyAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrIGFuZCBzZW5kIGEgSEFMIFVwZGF0ZSBCZWFjb24gUGFyYW1zIHJlcXVlc3QKKyAgICAgICAgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZQorICAgICAgICBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaVVwZGF0ZUJlYWNvblBhcmFtczogdGhlIEJlYWNvbiBwYXJhbWV0ZXJzIGFzIHNwZWNpZmllZCAKKyAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBzdGFydCBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIFdESV9Qb3N0QXNzb2NSZXEKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfVXBkYXRlQmVhY29uUGFyYW1zUmVxCisoCisgIFdESV9VcGRhdGVCZWFjb25QYXJhbXNUeXBlKiAgICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLAorICBXRElfVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2IgICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfVVBEX0JDT05fUFJNU19SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpVXBkYXRlQmVhY29uUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVVwZGF0ZUJlYWNvblBhcmFtcyk7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9VcGRhdGVCZWFjb25QYXJhbXNSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX1NlbmRCZWFjb25QYXJhbXNSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgTUFDIAorICAgICAgICB3aXNoZXMgdG8gdXBkYXRlICB0aGUgQmVhY29uIHRlbXBsYXRlIHVzZWQgYnkgSFcuCisgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhIEhBTCBVcGRhdGUgQmVhY29uIHRlbXBsYXRlIHJlcXVlc3QKKyAgICAgICAgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZQorICAgICAgICBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaVNlbmRCZWFjb25QYXJhbXM6IHRoZSBCZWFjb24gcGFyYW1ldGVycyBhcyBzcGVjaWZpZWQgCisgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVNlbmRCZWFjb25QYXJhbXNSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUKKyAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIHN0YXJ0IG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZW5kQmVhY29uUGFyYW1zUmVxCisoCisgIFdESV9TZW5kQmVhY29uUGFyYW1zVHlwZSogICAgcHdkaVNlbmRCZWFjb25QYXJhbXMsCisgIFdESV9TZW5kQmVhY29uUGFyYW1zUnNwQ2IgICAgd2RpU2VuZEJlYWNvblBhcmFtc1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1NORF9CQ09OX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlTZW5kQmVhY29uUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVNlbmRCZWFjb25QYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVNlbmRCZWFjb25QYXJhbXNSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX1NlbmRCZWFjb25QYXJhbXNSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgCisgICAgICAgIHVwcGVyIE1BQyB3YW50cyB0byB1cGRhdGUgdGhlIHByb2JlIHJlc3BvbnNlIHRlbXBsYXRlIHRvCisgICAgICAgIGJlIHRyYW5zbWl0dGVkIGFzIFNvZnQgQVAKKyAgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwKKyAgICAgICAgcGFjayBhbmQgc2VuZCB0aGUgcHJvYmUgcnNwIHRlbXBsYXRlICBtZXNzYWdlIHRvIHRoZQorICAgICAgICBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisKKyBAcGFyYW0gcHdkaVVwZGF0ZVByb2JlUnNwUGFyYW1zOiB0aGUgVXBkYXRlIEJlYWNvbiBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU2VuZEJlYWNvblBhcmFtc1JzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgU2VuZCBCZWFjb24gUGFyYW1zIG9wZXJhdGlvbiByZWNlaXZlZAorICAgICAgICBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX0FkZEJBUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCisKK1dESV9TdGF0dXMgCitXRElfVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZVJlcQorKAorICBXRElfVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZVBhcmFtc1R5cGUqICAgIHB3ZGlVcGRhdGVQcm9iZVJzcFBhcmFtcywKKyAgV0RJX1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSc3BDYiAgICAgICAgICB3ZGlVcGRhdGVQcm9iZVJzcFBhcmFtc1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1VQRF9QUk9CRV9SU1BfVEVNUExBVEVfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVVwZGF0ZVByb2JlUnNwUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVVwZGF0ZVByb2JlUnNwUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlVcGRhdGVQcm9iZVJzcFBhcmFtc1JzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZVJlcSovCisKKy8qKgorIEBicmllZiBXRElfTnZEb3dubG9hZFJlcSB3aWxsIGJlIGNhbGxlZCBieSB0aGUgVU1BQyB0byBkb3dubG9hZCB0aGUgTlYgYmxvYgorICAgICAgICB0byB0aGUgTlYgbWVtb3J5LgorCisKKyBAcGFyYW0gd2RpTnZEb3dubG9hZFJlcVBhcmFtczogdGhlIE5WIERvd25sb2FkIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaU52RG93bmxvYWRSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlIE5WIERvd25sb2FkIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX1Bvc3RBc3NvY1JlcQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9OdkRvd25sb2FkUmVxCisoCisgIFdESV9OdkRvd25sb2FkUmVxUGFyYW1zVHlwZSogcHdkaU52RG93bmxvYWRSZXFQYXJhbXMsCisgIFdESV9OdkRvd25sb2FkUnNwQ2IgICAgICAgIHdkaU52RG93bmxvYWRSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX05WX0RPV05MT0FEX1JFUTsgICAgICAgICAgICAKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9ICh2b2lkICopcHdkaU52RG93bmxvYWRSZXFQYXJhbXM7IAorICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpTnZEb3dubG9hZFJlcVBhcmFtcyk7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpTnZEb3dubG9hZFJzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1NUQVJUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX05WRG93bmxvYWRSZXEqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorLyoqCisgQGJyaWVmIFdESV9TZXRQMlBHT05PQVJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSAKKyAgICAgICAgdXBwZXIgTUFDIHdhbnRzIHRvIHNlbmQgTm90aWNlIG9mIEFic2VuY2UKKyAgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwKKyAgICAgICAgcGFjayBhbmQgc2VuZCB0aGUgcHJvYmUgcnNwIHRlbXBsYXRlICBtZXNzYWdlIHRvIHRoZQorICAgICAgICBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisKKyBAcGFyYW0gcHdkaVVwZGF0ZVByb2JlUnNwUGFyYW1zOiB0aGUgVXBkYXRlIEJlYWNvbiBwYXJhbWV0ZXJzIGFzIAorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpU2VuZEJlYWNvblBhcmFtc1JzcENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZQorICAgICAgICByZXNwb25zZSBvZiB0aGUgU2VuZCBCZWFjb24gUGFyYW1zIG9wZXJhdGlvbiByZWNlaXZlZAorICAgICAgICBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEBzZWUgV0RJX0FkZEJBUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfU2V0UDJQR09OT0FSZXEKKygKKyAgV0RJX1NldFAyUEdPTk9BUmVxUGFyYW1zVHlwZSogICAgcHdkaVAyUEdPTk9BUmVxUGFyYW1zLAorICBXRElfU2V0UDJQR09OT0FSZXFQYXJhbXNSc3BDYiAgICB3ZGlQMlBHT05PQVJlcVBhcmFtc1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9QMlBfR09fTk9USUNFX09GX0FCU0VOQ0VfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVAyUEdPTk9BUmVxUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVAyUEdPTk9BUmVxUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlQMlBHT05PQVJlcVBhcmFtc1JzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfU2V0UDJQR09OT0FSZXEqLworI2VuZGlmCisKKy8qKgorIEBicmllZiBXRElfQWRkU1RBU2VsZlJlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSAKKyAgICAgICAgVU1BQyB3YW50ZWQgdG8gYWRkIFNUQSBzZWxmIHdoaWxlIG9wZW5pbmcgYW55IG5ldyBzZXNzaW9uCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworCisgQHBhcmFtIHB3ZGlBZGRTVEFTZWxmUGFyYW1zOiB0aGUgYWRkIHN0YSBzZWxmIHBhcmFtZXRlcnMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAc2VlIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX0FkZFNUQVNlbGZSZXEKKygKKyAgV0RJX0FkZFNUQVNlbGZSZXFQYXJhbXNUeXBlKiBwd2RpQWRkU1RBU2VsZlJlcVBhcmFtcywKKyAgV0RJX0FkZFNUQVNlbGZQYXJhbXNSc3BDYiAgICB3ZGlBZGRTVEFTZWxmUmVxUGFyYW1zUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfQUREX1NUQV9TRUxGX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlBZGRTVEFTZWxmUmVxUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaUFkZFNUQVNlbGZSZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUFkZFNUQVNlbGZSZXFQYXJhbXNSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0FkZFNUQVNlbGZSZXEqLworCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUiAKKy8qKgorIEBicmllZiBXRElfQWdnckFkZFRTUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyB0byBpbmZvcm0KKyAgICAgICAgdGhlIGRldmljZSBvZiBhIHN1Y2Nlc3NmdWwgYWRkIFRTcGVjIG5lZ290aWF0aW9uLiBIVworICAgICAgICBuZWVkcyB0byByZWNlaXZlIHRoZSBUU3BlYyBJbmZvIGZyb20gdGhlIFVNQUMgaW4gb3JkZXIKKyAgICAgICAgdG8gY29uZmlndXJlIHByb3Blcmx5IHRoZSBRb1MgZGF0YSB0cmFmZmljLiBVcG9uIHRoZQorICAgICAgICBjYWxsIG9mIHRoaXMgQVBJIHRoZSBXTEFOIERBTCB3aWxsIHBhY2sgYW5kIHNlbmQgYSBIQUwKKyAgICAgICAgQWRkIFRTIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQSBzdWItc3lzdGVtIGlmCisgICAgICAgIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHdkaUFkZFRzUmVxUGFyYW1zOiB0aGUgYWRkIFRTIHBhcmFtZXRlcnMgYXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaUFkZFRzUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlIG9mCisgICAgICAgIHRoZSBhZGQgVFMgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0FnZ3JBZGRUU1JlcQorKAorICBXRElfQWdnckFkZFRTUmVxUGFyYW1zVHlwZSogcHdkaUFnZ3JBZGRUc1JlcVBhcmFtcywKKyAgV0RJX0FnZ3JBZGRUc1JzcENiICAgICAgICAgIHdkaUFnZ3JBZGRUc1JzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9BR0dSX0FERF9UU19SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpQWdnckFkZFRzUmVxUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaUFnZ3JBZGRUc1JlcVBhcmFtcyk7IAorICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpQWdnckFkZFRzUnNwQ2I7IAorICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7CisKK30vKldESV9BZ2dyQWRkVFNSZXEqLworCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworI2lmZGVmIEFOSV9NQU5GX0RJQUcKKy8qKgorIEBicmllZiBXRElfRlRNQ29tbWFuZFJlcQorICAgICAgICBQb3N0IEZUTSBDb21tYW5kIEV2ZW50CisgCisgQHBhcmFtICBmdG1Db21tYW5kUmVxOiAgIEZUTSBDb21tYW5kIEJvZHkgCisgQHBhcmFtICBmdG1Db21tYW5kUnNwQ2I6IEZUTSBSZXNwb25zZSBmcm9tIEhBTCBDQiAKKyBAcGFyYW0gIHBVc2VyRGF0YTogICAgICAgQ2xpZW50IERhdGEKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9GVE1Db21tYW5kUmVxCisoCisgIFdESV9GVE1Db21tYW5kUmVxVHlwZSAqZnRtQ29tbWFuZFJlcSwKKyAgV0RJX0ZUTUNvbW1hbmRSc3BDYiAgICBmdG1Db21tYW5kUnNwQ2IsCisgIHZvaWQgICAgICAgICAgICAgICAgICAqcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICA9IFdESV9GVE1fQ01EX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgID0gKHZvaWQgKilmdG1Db21tYW5kUmVxOworICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgPSBmdG1Db21tYW5kUmVxLT5ib2R5TGVuZ3RoICsgc2l6ZW9mKHdwdF91aW50MzIpOworICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgPSBmdG1Db21tYW5kUnNwQ2I7CisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfQorI2VuZGlmIC8qIEFOSV9NQU5GX0RJQUcgKi8gCisvKioKKyBAYnJpZWYgV0RJX0hvc3RSZXN1bWVSZXEgd2lsbCBiZSBjYWxsZWQgCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisKKyBAcGFyYW0gcHdkaVJlc3VtZVJlcVBhcmFtczogIGFzIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlSZXN1bWVSZXFSc3BDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2Ugb2YKKyAgICAgICAgdGhlICBSZXN1bWUgUmVxIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfSG9zdFJlc3VtZVJlcQorKAorICBXRElfUmVzdW1lUGFyYW1zVHlwZSogICAgICAgICAgICBwd2RpUmVzdW1lUmVxUGFyYW1zLAorICBXRElfSG9zdFJlc3VtZUV2ZW50UnNwQ2IgICAgICAgICB3ZGlSZXN1bWVSZXFSc3BDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfSE9TVF9SRVNVTUVfUkVROworICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVJlc3VtZVJlcVBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlSZXN1bWVSZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVJlc3VtZVJlcVJzcENiOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfSG9zdFJlc3VtZVJlcSovCisKKy8qKgorIEBicmllZiBXRElfRGVsU1RBU2VsZlJlcSB3aWxsIGJlIGNhbGxlZCAKKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKworIEBwYXJhbSBwd2RpRGVsU3RhU2VsZlJlcVBhcmFtczogIGFzIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICAgIHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlEZWxTdGFTZWxmUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlIG9mCisgICAgICAgIHRoZSBhZGQgVFMgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0RlbFNUQVNlbGZSZXEKKygKKyAgV0RJX0RlbFNUQVNlbGZSZXFQYXJhbXNUeXBlKiAgICAgIHB3ZGlEZWxTdGFTZWxmUmVxUGFyYW1zLAorICBXRElfRGVsU1RBU2VsZlJzcENiICAgICAgICAgICAgICAgd2RpRGVsU3RhU2VsZlJzcENiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfREVMX1NUQV9TRUxGX1JFUTsKKyAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlEZWxTdGFTZWxmUmVxUGFyYW1zOyAKKyAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaURlbFN0YVNlbGZSZXFQYXJhbXMpOyAKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaURlbFN0YVNlbGZSc3BDYjsgCisgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0FnZ3JBZGRUU1JlcSovCisKKy8qKgorIEBicmllZiBXRElfU2V0VHhQZXJUcmFja2luZ1JlcSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB1cHBlciBNQUMgCisgICAgICAgIHdhbnRzIHRvIHNldCB0aGUgVHggUGVyIFRyYWNraW5nIGNvbmZpZ3VyYXRpb25zLiAKKyAgICAgICAgVXBvbiB0aGUgY2FsbCBvZiB0aGlzIEFQSSB0aGUgV0xBTiBEQUwgd2lsbCBwYWNrCisgICAgICAgIGFuZCBzZW5kIGEgSEFMIFNldCBUeCBQZXIgVHJhY2tpbmcgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZQorICAgICAgICBsb3dlciBSSVZBIHN1Yi1zeXN0ZW0gaWYgREFMIGlzIGluIHN0YXRlIFNUQVJURUQuCisKKyAgICAgICAgSW4gc3RhdGUgQlVTWSB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQuIFJlcXVlc3Qgd29uJ3QKKyAgICAgICAgYmUgYWxsb3dlZCBpbiBhbnkgb3RoZXIgc3RhdGUuIAorCisgQHBhcmFtIHB3ZGlTZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zOiB0aGUgU2V0IFR4IFBFUiBUcmFja2luZyBjb25maWd1cmF0aW9ucyBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHB3ZGlTZXRUeFBlclRyYWNraW5nUnNwQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgIHJlc3BvbnNlIG9mIHRoZSBzZXQgVHggUEVSIFRyYWNraW5nIGNvbmZpZ3VyYXRpb25zIG9wZXJhdGlvbiByZWNlaXZlZAorICAgICAgICBmcm9tIHRoZSBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZXRUeFBlclRyYWNraW5nUmVxCisoCisgIFdESV9TZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zVHlwZSogICAgICBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcywKKyAgV0RJX1NldFR4UGVyVHJhY2tpbmdSc3BDYiAgICAgICAgICAgICAgIHB3ZGlTZXRUeFBlclRyYWNraW5nUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9TRVRfVFhfUEVSX1RSQUNLSU5HX1JFUTsKKyAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtczsgCisgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcyk7CisgICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gcHdkaVNldFR4UGVyVHJhY2tpbmdSc3BDYjsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfU2V0VHhQZXJUcmFja2luZ1JlcSovCisKKy8qKgorIEBicmllZiBXRElfU2V0VG1MZXZlbFJlcQorICAgICAgICBJZiBIVyBUaGVybWFsIGNvbmRpdGlvbiBjaGFuZ2VkLCBkcml2ZXIgc2hvdWxkIHJlYWN0IGJhc2VkIG9uIG5ldyAKKyAgICAgICAgSFcgdGhlcm1hbCBjb25kaXRpb24uCisKKyBAcGFyYW0gcHdkaVNldFRtTGV2ZWxSZXE6IE5ldyB0aGVybWFsIGNvbmRpdGlvbiBpbmZvcm1hdGlvbgorICAKKyAgICAgICAgcHdkaVNldFRtTGV2ZWxSc3BDYjogY2FsbGJhY2sKKyAgCisgICAgICAgIHVzckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9TZXRUbUxldmVsUmVxCisoCisgICBXRElfU2V0VG1MZXZlbFJlcVR5cGUgICAgICAgICpwd2RpU2V0VG1MZXZlbFJlcSwKKyAgIFdESV9TZXRUbUxldmVsQ2IgICAgICAgICAgICAgIHB3ZGlTZXRUbUxldmVsUnNwQ2IsCisgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICp1c3JEYXRhICAKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9TRVRfVE1fTEVWRUxfUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlTZXRUbUxldmVsUmVxOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlTZXRUbUxldmVsUmVxKTsKKyAgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSBwd2RpU2V0VG1MZXZlbFJzcENiOyAKKyAgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSB1c3JEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfQorCisvKioKKyBAYnJpZWYgV0RJX0hvc3RTdXNwZW5kSW5kIAorICAKKyAgICAgICAgU3VzcGVuZCBJbmRpY2F0aW9uIGZyb20gdGhlIHVwcGVyIGxheWVyIHdpbGwgYmUgc2VudAorICAgICAgICBkb3duIHRvIEhBTAorICAKKyBAcGFyYW0gV0RJX1N1c3BlbmRSZXN1bWVJbmRQYXJhbXNUeXBlCisgCisgQHNlZSAKKyAgCisgQHJldHVybiBTdGF0dXMgb2YgdGhlIHJlcXVlc3QKKyovCitXRElfU3RhdHVzIAorV0RJX0hvc3RTdXNwZW5kSW5kCisoCisgIFdESV9TdXNwZW5kUGFyYW1zVHlwZSogICAgcHdkaVN1c3BlbmRJbmRQYXJhbXMKKykKK3sKKworICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0hPU1RfU1VTUEVORF9JTkQ7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpU3VzcGVuZEluZFBhcmFtczsgCisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlTdXNwZW5kSW5kUGFyYW1zKTsgCisgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSBOVUxMOyAKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IE5VTEw7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKKworfS8qV0RJX0hvc3RTdXNwZW5kSW5kKi8KKworLyoqCisgQGJyaWVmIFdESV9IQUxEdW1wQ21kUmVxCisgICAgICAgIFBvc3QgSEFMIERVTVAgQ29tbWFuZCBFdmVudAorIAorIEBwYXJhbSAgaGFsRHVtcENtZFJlcVBhcmFtczogICBIYWwgRHVtcCBDb21tYW5kIEJvZHkgCisgQHBhcmFtICBoYWxEdW1wQ21kUnNwQ2I6IEhBTCBEVU1QIFJlc3BvbnNlIGZyb20gSEFMIENCIAorIEBwYXJhbSAgcFVzZXJEYXRhOiAgICAgICBDbGllbnQgRGF0YQorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIFdESV9IQUxEdW1wQ21kUmVxCisoCisgIFdESV9IQUxEdW1wQ21kUmVxUGFyYW1zVHlwZSAqaGFsRHVtcENtZFJlcVBhcmFtcywKKyAgV0RJX0hBTER1bXBDbWRSc3BDYiAgICBoYWxEdW1wQ21kUnNwQ2IsCisgIHZvaWQgICAgICAgICAgICAgICAgICAqcFVzZXJEYXRhCispCit7CisgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICA9ICAgV0RJX0hBTF9EVU1QX0NNRF9SRVE7CisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICA9ICAgKHZvaWQgKiloYWxEdW1wQ21kUmVxUGFyYW1zOworICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgPSAgIHNpemVvZihXRElfSEFMRHVtcENtZFJlcVBhcmFtc1R5cGUpOworICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgPSAgIGhhbER1bXBDbWRSc3BDYjsKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgID0gICBwVXNlckRhdGE7CisKKyAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorIAorICAgICAgICAgICAgREFMIENvbnRyb2wgUGF0aCBNYWluIEZTTSBGdW5jdGlvbiBJbXBsZW1lbnRhdGlvbgorIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU3RhcnQgZnVuY3Rpb24gZm9yIGFsbCBzdGF0ZXMgZXhjZXB0IEJVU1kKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgd2RpRVY6ICAgICAgICAgICBldmVudCBwb3N0ZWQgdG8gdGhlIG1haW4gREFMIEZTTQorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbgorICAgICAgICAgc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUG9zdE1haW5FdmVudAorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsIAorICBXRElfTWFpbkV2ZW50VHlwZSAgICAgIHdkaUVWLCAKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCisgIAorKQoreworICBXRElfU3RhdHVzICAgICAgICAgd2RpU3RhdHVzOyAKKyAgV0RJX01haW5GdW5jVHlwZSAgIHBmbldESU1haW5FdkhkbHI7IAorICBXRElfTWFpblN0YXRlVHlwZSAgd2RpT2xkU3RhdGU7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBwV0RJQ3R4LT51R2xvYmFsU3RhdGUgPj0gV0RJX01BWF9TVCApIHx8CisgICAgICAoIHdkaUVWID49IFdESV9NQVhfRVZFTlQgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgc3RhdGUgb3IgZXZlbnQgaW4gUG9zdCBNYWluIEV2IGZ1bmN0aW9uIFNUOiAlZCBFVjogJWQiLAorICAgICAgICAgICAgICAgcFdESUN0eC0+dUdsb2JhbFN0YXRlLCB3ZGlFVik7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLypBY2Nlc3MgdG8gdGhlIGdsb2JhbCBzdGF0ZSBtdXN0IGJlIGxvY2tlZCAqLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLypGZXRjaCBldmVudCBoYW5kbGVyIGZvciBzdGF0ZSovCisgIHBmbldESU1haW5FdkhkbHIgPSB3ZGlNYWluRlNNW3BXRElDdHgtPnVHbG9iYWxTdGF0ZV0ucGZuTWFpblRibFt3ZGlFVl07IAorCisgIHdkaU9sZFN0YXRlID0gcFdESUN0eC0+dUdsb2JhbFN0YXRlOworCisgIC8qCisgIC0tSW5jYXNlIG9mIFdESSBldmVudCBpcyBXRElfUkVTUE9OU0VfRVZFTlQgYW5kIHRoaXMgaXMgY2FsbGVkIHdoZW4gYSAKKyAgcmVzcG9uc2UgY29tZXMgZnJvbSBDQ1BVIGZvciB0aGUgcmVxdWVzdCBzZW50IGJ5IGhvc3Q6IAorICB0aGUgV0RJIGdsb2JhbCBzdGF0ZSB3aWxsIGJlIGluIFdESV9CVVNZX1NUIGFscmVhZHksIHNvIGRvIG5vdCBzZXQgaXQgdG8gQlVTWSBhZ2Fpbi4gCisgIFRoaXMgc3RhdGUgd2lsbCBiZSBzZXQgdG8gV0RJX1NUQVJURURfU1QgaW4gV0RJX01haW5Sc3AsIGlmIGl0IGlzIGEgZXhwZWN0ZWQgcmVzcG9uc2UuCisgIC0tSW5jYXNlIG9mIFdESSBldmVudCBpcyBXRElfUkVTUE9OU0VfRVZFTlQgYW5kIGl0IGlzIGFuIGluZGljYXRpb24gZnJvbSB0aGUgCisgIENDUFU6CisgIGRvbid0IGNoYW5nZSB0aGUgc3RhdGUgKi8KKyAgaWYgKCBXRElfUkVTUE9OU0VfRVZFTlQgIT0gd2RpRVYpCisgIHsKKyAgICAvKlRyYW5zaXRpb24gdG8gQlVTWSBTdGF0ZSAtIHRoZSByZXF1ZXN0IGlzIG5vdyBiZWluZyBwcm9jZXNzZWQgYnkgdGhlIEZTTSwKKyAgICAgaWYgdGhlIHJlcXVlc3QgZmFpbHMgd2Ugc2hhbGwgdHJhbnNpdGlvbiBiYWNrIHRvIHRoZSBvbGQgc3RhdGUsIGlmIG5vdAorICAgICB0aGUgcmVxdWVzdCB3aWxsIG1hbmFnZSBpdHMgb3duIHN0YXRlIHRyYW5zaXRpb24qLworICAgIFdESV9TVEFURV9UUkFOU0lUSU9OKCBwV0RJQ3R4LCBXRElfQlVTWV9TVCk7CisgIH0KKyAgLyogSWYgdGhlIHN0YXRlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgRVYgaXMgTlVMTCBpdCBtZWFucyB0aGF0IHRoaXMKKyAgICAgZXZlbnQgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBzdGF0ZSovCisgIGlmICggTlVMTCAhPSBwZm5XRElNYWluRXZIZGxyICkgCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJQb3N0aW5nIGV2ZW50ICVkIGluIHN0YXRlOiAlZCB0byB0aGUgTWFpbiBGU00iLCAKKyAgICAgICAgICAgICAgd2RpRVYsIHdkaU9sZFN0YXRlKTsKKyAgICB3ZGlTdGF0dXMgPSBwZm5XRElNYWluRXZIZGxyKCBwV0RJQ3R4LCBwRXZlbnREYXRhKTsgCisgIH0KKyAgZWxzZQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZXZlbnQgJWQgaW4gc3RhdGU6ICVkIiwgCisgICAgICAgICAgICAgIHdkaUVWLCB3ZGlPbGRTdGF0ZSk7CisgICAgd2RpU3RhdHVzID0gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qIElmIGEgcmVxdWVzdCBoYW5kbGVzIGl0c2VsZiB3ZWxsIGl0IHdpbGwgZW5kIHVwIGluIGEgc3VjY2VzcyBvciBpbiBhCisgICAgIHBlbmRpbmcKKyAgICAgU3VjY2VzcyAtIG1lYW5zIHRoYXQgdGhlIHJlcXVlc3Qgd2FzIHByb2Nlc3NlZCBhbmQgdGhlIHByb3BlciBzdGF0ZQorICAgICB0cmFuc2l0aW9uIGFscmVhZHkgb2NjdXJyZWQgb3Igd2lsbCBvY2N1ciB3aGVuIHRoZSByZXNwIGlzIHJlY2VpdmVkCisgICAgIC0gTk8gb3RoZXIgc3RhdGUgdHJhbnNpdGlvbiBvciBkZXF1ZXVlaW5nIGlzIHJlcXVpcmVkCisgCisgICAgIFBlbmRpbmcgLSBtZWFucyB0aGUgcmVxdWVzdCBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkIGF0IHRoaXMgbW9tZW50IGluIHRpbWUKKyAgICAgYmVjYXVzZSB0aGUgRlNNIHdhcyBhbHJlYWR5IGJ1c3kgc28gbm8gc3RhdGUgdHJhbnNpdGlvbiBvciBkZXF1ZXVlaW5nCisgICAgIGlzIG5lY2Vzc2FyeSBhbnltb3JlCisgCisgICAgIFN1Y2Nlc3MgZm9yIHN5bmNocm9ub3VzIGNhc2UgbWVhbnMgdGhhdCB0aGUgdHJhbnNpdGlvbiBtYXkgb2NjdXIgYW5kCisgICAgIHByb2Nlc3Npbmcgb2YgcGVuZGluZyByZXF1ZXN0cyBtYXkgY29udGludWUgLSBzbyBpdCBzaG91bGQgZ28gdGhyb3VnaAorICAgICBhbmQgcmVzdG9yZXMgdGhlIHN0YXRlIGFuZCBjb250aW51ZSBwcm9jZXNzaW5nIHF1ZXVlZCByZXF1ZXN0cyovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSB3ZGlTdGF0dXMgKSYmCisgICAgICAoIFdESV9TVEFUVVNfUEVORElORyAhPSB3ZGlTdGF0dXMgKSkKKyAgeworICAgIGlmICggV0RJX1JFU1BPTlNFX0VWRU5UICE9IHdkaUVWKQorICAgIHsKKyAgICAgIC8qVGhlIHJlcXVlc3QgaGFzIGZhaWxlZCBvciBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkIC0gdHJhbnNpdGlvbiBiYWNrIHRvCisgICAgICAgIHRoZSBvbGQgc3RhdGUgLSBjaGVjayB0byBzZWUgaWYgYW55dGhpbmcgd2FzIHF1ZXVlZCBhbmQgdHJ5IHRvIGV4ZWN1dGUKKyAgICAgICAgVGhlIGRlcXVldWUgbG9naWMgc2hvdWxkIHBvc3QgYSBtZXNzYWdlIHRvIGEgdGhyZWFkIGFuZCByZXR1cm4gLSBubworICAgICAgICBhY3R1YWwgcHJvY2Vzc2luZyBjYW4gb2NjdXIgKi8KKyAgICAgIFdESV9TVEFURV9UUkFOU0lUSU9OKCBwV0RJQ3R4LCB3ZGlPbGRTdGF0ZSk7CisgICAgfQorICAgIFdESV9EZXF1ZXVlUGVuZGluZ1JlcShwV0RJQ3R4KTsKKyAgICAgICAgCisgIH0KKworICAvKiB3ZSBoYXZlIGNvbXBsZXRlZCBwcm9jZXNzaW5nIHRoZSBldmVudCAqLworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgcmV0dXJuIHdkaVN0YXR1czsgCisKK30vKldESV9Qb3N0TWFpbkV2ZW50Ki8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIElOSVQgU3RhdGUgRnVuY3Rpb25zIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqCisgQGJyaWVmIE1haW4gRlNNIFN0YXJ0IGZ1bmN0aW9uIGZvciBhbGwgc3RhdGVzIGV4Y2VwdCBCVVNZCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfTWFpblN0YXJ0CisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSAgcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgIkludmFsaWQgcGFyYW1ldGVycyBvbiBNYWluIFN0YXJ0ICV4ICV4IiwgCisgICAgICAgICAgICAgICBwV0RJQ3R4LCBwRXZlbnREYXRhKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgQ2hlY2sgaWYgdGhlIENvbnRyb2wgVHJhbnNwb3J0IGhhcyBiZWVuIG9wZW5lZCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IHBXRElDdHgtPmJDVE9wZW5lZCApCisgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgIkNvbnRyb2wgVHJhbnNwb3J0IG5vdCB5ZXQgT3BlbiAtIHF1ZXVlaW5nIHRoZSByZXF1ZXN0Iik7CisKKyAgICAgV0RJX1NUQVRFX1RSQU5TSVRJT04oIHBXRElDdHgsIFdESV9JTklUX1NUKTsKKyAgICAgV0RJX1F1ZXVlUGVuZGluZ1JlcSggcFdESUN0eCwgcEV2ZW50RGF0YSk7IAorCisgICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfUEVORElORzsKKyAgfQorIAorICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLypSZXR1cm4gU3VjY2VzcyovCisgIHJldHVybiBXRElfUHJvY2Vzc1JlcXVlc3QoIHBXRElDdHgsIHBFdmVudERhdGEgKTsKKworfS8qV0RJX01haW5TdGFydCovCisKKy8qKgorIEBicmllZiBNYWluIEZTTSBSZXNwb25zZSBmdW5jdGlvbiBmb3Igc3RhdGUgSU5JVAorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5Sc3BJbml0CisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE5vdCBleHBlY3RpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBkZXZpY2UgYmVmb3JlIGl0IGlzIHN0YXJ0ZWQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFdESV9BU1NFUlQoMCk7IAorCisgIC8qUmV0dXJuIFN1Y2Nlc3MqLworICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOworfS8qIFdESV9NYWluUnNwSW5pdCAqLworCisvKioKKyBAYnJpZWYgTWFpbiBGU00gQ2xvc2UgZnVuY3Rpb24gZm9yIGFsbCBzdGF0ZXMgZXhjZXB0IEJVU1kKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9NYWluQ2xvc2UKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09ICBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiSW52YWxpZCBwYXJhbWV0ZXJzIG9uIE1haW4gQ2xvc2UgJXggJXgiLCAKKyAgICAgICAgICAgICAgIHBXRElDdHgsIHBFdmVudERhdGEpOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICAvKlJldHVybiBTdWNjZXNzKi8KKyAgcmV0dXJuIFdESV9Qcm9jZXNzUmVxdWVzdCggcFdESUN0eCwgcEV2ZW50RGF0YSApOworCit9LypXRElfTWFpbkNsb3NlKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU1RBUlRFRCBTdGF0ZSBGdW5jdGlvbnMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU3RhcnQgZnVuY3Rpb24gZm9yIHN0YXRlIFNUQVJURUQKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9NYWluU3RhcnRTdGFydGVkCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhcnRSc3BDYiAgICAgICAgICAgd2RpU3RhcnRSc3BDYiA9IE5VTEw7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gIHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHBhcmFtZXRlcnMgb24gTWFpbiBTdGFydCAleCAleCIsIAorICAgICAgICAgICAgICAgcFdESUN0eCwgcEV2ZW50RGF0YSk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgTm90aGluZyB0byBkbyB0cmFuc3BvcnQgd2FzIGFscmVhZHkgc3RhcnRlZCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAiUmVjZWl2ZWQgc3RhcnQgd2hpbGUgdHJhbnNwb3J0IHdhcyBhbHJlYWR5IHN0YXJ0ZWQgLSBub3RoaW5nIHRvIGRvIik7IAorCisgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKlRyYW5zaXRpb24gYmFjayB0byBzdGFydGVkIGJlY2F1c2UgdGhlIHBvc3QgZnVuY3Rpb24gdHJhbnNpdGlvbmVkIHVzIHRvCisgICAgYnVzeSovCisgIFdESV9TVEFURV9UUkFOU0lUSU9OKCBwV0RJQ3R4LCBXRElfU1RBUlRFRF9TVCk7CisKKyAgLypDaGVjayB0byBzZWUgaWYgYW55IHJlcXVlc3QgaXMgcGVuZGluZyovCisgIFdESV9EZXF1ZXVlUGVuZGluZ1JlcShwV0RJQ3R4KTsKKyAgCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKlRlbGwgVU1BQyBTdWNjZXNzKi8KKyAgd2RpU3RhcnRSc3BDYiA9IChXRElfU3RhcnRSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmM7IAorICAKKyAgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlTdGFydFJzcENiKCAmcFdESUN0eC0+d2RpQ2FjaGVkU3RhcnRSc3BQYXJhbXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICAvKlJldHVybiBTdWNjZXNzKi8KKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKKworfS8qV0RJX01haW5TdGFydFN0YXJ0ZWQqLworCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU3RvcCBmdW5jdGlvbiBmb3Igc3RhdGUgU1RBUlRFRAorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5TdG9wU3RhcnRlZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09ICBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgcGFyYW1ldGVycyBvbiBNYWluIFN0YXJ0ICV4ICV4IiwgCisgICAgICAgICAgICAgICBwV0RJQ3R4LCBwRXZlbnREYXRhKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgLypTdGF0ZSBhdCB0aGlzIHBvaW50IGlzIEJVU1kgLSBiZWNhdXNlIHdlIGVudGVyIHRoaXMgc3RhdGUgYmVmb3JlIHBvc3RpbmcKKyAgICBhbiBldmVudCB0byB0aGUgRlNNIGluIG9yZGVyIHRvIHByZXZlbnQgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyovCisKKyAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgIlByb2Nlc3Npbmcgc3RvcCByZXF1ZXN0IGluIEZTTSIpOworCisgIC8qUmV0dXJuIFN1Y2Nlc3MqLworICByZXR1cm4gV0RJX1Byb2Nlc3NSZXF1ZXN0KCBwV0RJQ3R4LCBwRXZlbnREYXRhICk7CisKK30vKldESV9NYWluU3RvcFN0YXJ0ZWQqLworLyoqCisgQGJyaWVmIE1haW4gRlNNIFJlcXVlc3QgZnVuY3Rpb24gZm9yIHN0YXRlIHN0YXJ0ZWQKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9NYWluUmVxU3RhcnRlZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gIHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHBhcmFtZXRlcnMgb24gTWFpbiBSZXEgU3RhcnRlZCAleCAleCIsIAorICAgICAgICAgICAgICAgcFdESUN0eCwgcEV2ZW50RGF0YSk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIC8qU3RhdGUgYXQgdGhpcyBwb2ludCBpcyBCVVNZIC0gYmVjYXVzZSB3ZSBlbnRlciB0aGlzIHN0YXRlIGJlZm9yZSBwb3N0aW5nCisgICAgYW4gZXZlbnQgdG8gdGhlIEZTTSBpbiBvcmRlciB0byBwcmV2ZW50IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMqLworCisgIC8qUmV0dXJuIFN1Y2Nlc3MqLworICByZXR1cm4gV0RJX1Byb2Nlc3NSZXF1ZXN0KCBwV0RJQ3R4LCBwRXZlbnREYXRhICk7CisKK30vKldESV9NYWluUmVxU3RhcnRlZCovCisKKy8qKgorIEBicmllZiBNYWluIEZTTSBSZXNwb25zZSBmdW5jdGlvbiBmb3IgYWxsIHN0YXRlcyBleGNlcHQgSU5JVAorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfTWFpblJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgd2RpU3RhdHVzOyAKKyAgd3B0X2Jvb2xlYW4gZXhwZWN0ZWRSZXNwb25zZTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gIHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHBhcmFtZXRlcnMgb24gTWFpbiBSZXNwb25zZSAleCAleCIsIAorICAgICAgICAgICAgICAgcFdESUN0eCwgcEV2ZW50RGF0YSk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIGlmICggcEV2ZW50RGF0YS0+d2RpUmVzcG9uc2UgPT0gIHBXRElDdHgtPndkaUV4cGVjdGVkUmVzcG9uc2UgKQorICB7CisgICAgLyogd2UgcmVjZWl2ZWQgYW4gZXhwZWN0ZWQgcmVzcG9uc2UgKi8KKyAgICBleHBlY3RlZFJlc3BvbnNlID0gZVdMQU5fUEFMX1RSVUU7CisKKyAgICAvKldlIGV4cGVjdCB0aGF0IHdlIHdpbGwgdHJhbnNpdGlvbiB0byBzdGFydGVkIGFmdGVyIHRoaXMgcHJvY2Vzc2luZyovCisgICAgcFdESUN0eC0+dWNFeHBlY3RlZFN0YXRlVHJhbnNpdGlvbiA9IFdESV9TVEFSVEVEX1NUOworCisgICAgLyogd2UgYXJlIG5vIGxvbmdlciBleHBlY3RpbmcgYSByZXNwb25zZSAqLworICAgICBwV0RJQ3R4LT53ZGlFeHBlY3RlZFJlc3BvbnNlID0gV0RJX01BWF9SRVNQOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIHdlIHJlY2VpdmVkIGFuIGluZGljYXRpb24gb3IgdW5leHBlY3RlZCByZXNwb25zZSAqLworICAgIGV4cGVjdGVkUmVzcG9uc2UgPSBlV0xBTl9QQUxfRkFMU0U7CisgICAgLyogZm9yIGluZGljYXRpb25zIG5vIG5lZWQgdG8gdXBkYXRlIHN0YXRlIGZyb20gd2hhdCBpdCBpcyByaWdodAorICAgICAgIG5vdywgdW5sZXNzIGl0IGV4cGxpY2l0bHkgZG9lcyBpdCBpbiB0aGUgaW5kaWNhdGlvbiBoYW5kbGVyIChzYXkKKyAgICAgICBmb3IgZGV2aWNlIGZhaWx1cmUgaW5kKSAqLworICAgIHBXRElDdHgtPnVjRXhwZWN0ZWRTdGF0ZVRyYW5zaXRpb24gPSBwV0RJQ3R4LT51R2xvYmFsU3RhdGU7CisgIH0KKworICAvKlByb2Nlc3MgdGhlIHJlc3BvbnNlIGFuZCBpbmRpY2F0aW9uICovCisgIHdkaVN0YXR1cyA9IFdESV9Qcm9jZXNzUmVzcG9uc2UoIHBXRElDdHgsIHBFdmVudERhdGEgKTsKKworICAvKkxvY2sgdGhlIENCIGFzIHdlIGFyZSBhYm91dCB0byBkbyBhIHN0YXRlIHRyYW5zaXRpb24qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLypUcmFuc2l0aW9uIHRvIHRoZSBleHBlY3RlZCBzdGF0ZSBhZnRlciB0aGUgcmVzcG9uc2UgcHJvY2Vzc2luZworICAtIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzdGFydGVkIHN0YXRlIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorICAxLiBwcm9jZXNzaW5nIG9mIGEgZmFpbGVkIHN0YXJ0IHJlc3BvbnNlCisgIDIuIGRldmljZSBmYWlsdXJlIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgcmVzcG9uc2UKKyAgMy4gc3RvcCByZXNwb25zZSByZWNlaXZlZCovCisgIFdESV9TVEFURV9UUkFOU0lUSU9OKCBwV0RJQ3R4LCBwV0RJQ3R4LT51Y0V4cGVjdGVkU3RhdGVUcmFuc2l0aW9uKTsKKyAKKyAgLypEZXF1ZXVlIHJlcXVlc3QgdGhhdCBtYXkgaGF2ZSBiZWVuIHF1ZXVlZCB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmcgZm9yIHRoZQorICAgIHJlc3BvbnNlICovCisgIGlmICggZXhwZWN0ZWRSZXNwb25zZSApCisgIHsKKyAgICAgV0RJX0RlcXVldWVQZW5kaW5nUmVxKHBXRElDdHgpOyAKKyAgfQorCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKlJldHVybiBTdWNjZXNzIC0gYWx3YXlzICovCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorCit9LypXRElfTWFpblJzcCovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU1RPUFBFRCBTdGF0ZSBGdW5jdGlvbnMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU3RvcCBmdW5jdGlvbiBmb3Igc3RhdGUgU1RPUFBFRAorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5TdG9wU3RvcHBlZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09ICBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgcGFyYW1ldGVycyBvbiBNYWluIFN0b3AgU3RvcHBlZCAleCAleCIsIAorICAgICAgICAgICAgICAgcFdESUN0eCwgcEV2ZW50RGF0YSk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIC8qV2Ugc2hvdWxkIG5vcm1hbGx5IG5vdCBnZXQgYSBTVE9QIHJlcXVlc3QgaWYgd2UgYXJlIGFscmVhZHkgc3RvcHBlZAorICAgIHNpbmNlIHdlIHNob3VsZCBub3JtYWxseSBiZSBzdG9wcGVkIGJ5IHRoZSBVTUFDLiAgSG93ZXZlciBpbiBzb21lCisgICAgZXJyb3Igc2l0dWF0aW9ucyB3ZSBwdXQgb3Vyc2VsdmVzIGluIHRoZSBzdG9wcGVkIHN0YXRlIHdpdGhvdXQgdGhlCisgICAgVU1BQyBrbm93aW5nLCBzbyB3aGVuIHdlIGdldCBhIFNUT1AgcmVxdWVzdCBpbiB0aGlzIHN0YXRlIHdlIHN0aWxsCisgICAgcHJvY2VzcyBpdCBzaW5jZSB3ZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSB1bmRlcmx5aW5nIHN0YXRlICovCisgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiUHJvY2Vzc2luZyBzdG9wIHJlcXVlc3Qgd2hpbGUgc3RvcHBlZCBpbiBGU00iKTsKKworICAvKlJldHVybiBTdWNjZXNzKi8KKyAgcmV0dXJuIFdESV9Qcm9jZXNzUmVxdWVzdCggcFdESUN0eCwgcEV2ZW50RGF0YSApOworCit9LypXRElfTWFpblN0b3BTdG9wcGVkKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBCVVNZIFN0YXRlIEZ1bmN0aW9ucyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKgorIEBicmllZiBNYWluIEZTTSBTdGFydCBmdW5jdGlvbiBmb3Igc3RhdGUgQlVTWQorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5TdGFydEJ1c3kKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSAgcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgIkludmFsaWQgcGFyYW1ldGVycyBvbiBNYWluIFN0YXJ0IGluIEJVU1kgJXggJXgiLCAKKyAgICAgICAgICAgICAgIHBXRElDdHgsIHBFdmVudERhdGEpOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIENoZWNrIGlmIHRoZSBDb250cm9sIFRyYW5zcG9ydCBoYXMgYmVlbiBvcGVuZWQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICJXREkgQnVzeSBzdGF0ZSAtIHF1ZXVlIHN0YXJ0IHJlcXVlc3QiKTsKKworICAvKlF1ZXVlIHRoZSBzdGFydCByZXF1ZXN0Ki8KKyAgV0RJX1F1ZXVlUGVuZGluZ1JlcSggcFdESUN0eCwgcEV2ZW50RGF0YSk7IAorCisgIC8qUmV0dXJuIFN1Y2Nlc3MqLworICByZXR1cm4gV0RJX1NUQVRVU19QRU5ESU5HOworfS8qV0RJX01haW5TdGFydEJ1c3kqLworCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU3RvcCBmdW5jdGlvbiBmb3Igc3RhdGUgQlVTWQorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5TdG9wQnVzeQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09ICBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiSW52YWxpZCBwYXJhbWV0ZXJzIG9uIE1haW4gU3RvcCBpbiBCVVNZICV4ICV4IiwgCisgICAgICAgICAgICAgICBwV0RJQ3R4LCBwRXZlbnREYXRhKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBDaGVjayBpZiB0aGUgQ29udHJvbCBUcmFuc3BvcnQgaGFzIGJlZW4gb3BlbmVkIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAiV0RJIEJ1c3kgc3RhdGUgLSBxdWV1ZSBzdG9wIHJlcXVlc3QiKTsKKworICBXRElfUXVldWVQZW5kaW5nUmVxKCBwV0RJQ3R4LCBwRXZlbnREYXRhKTsgCisgIHJldHVybiBXRElfU1RBVFVTX1BFTkRJTkc7CisgIAorfS8qV0RJX01haW5TdG9wQnVzeSovCisKKy8qKgorIEBicmllZiBNYWluIEZTTSBSZXF1ZXN0IGZ1bmN0aW9uIGZvciBzdGF0ZSBCVVNZCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfTWFpblJlcUJ1c3kKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSAgcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgIkludmFsaWQgcGFyYW1ldGVycyBvbiBNYWluIFJlcXVlc3QgaW4gQlVTWSAleCAleCIsIAorICAgICAgICAgICAgICAgcFdESUN0eCwgcEV2ZW50RGF0YSk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgQ2hlY2sgaWYgdGhlIENvbnRyb2wgVHJhbnNwb3J0IGhhcyBiZWVuIG9wZW5lZCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgIldESSBCdXN5IHN0YXRlIC0gcXVldWUgcmVxdWVzdCAlZCBiZWNhdXNlIHdhaXRpbmcgZm9yIHJlc3BvbnNlICVkIiwKKyAgICAgICAgICAgICBwRXZlbnREYXRhLT53ZGlSZXF1ZXN0LCBwV0RJQ3R4LT53ZGlFeHBlY3RlZFJlc3BvbnNlKTsKKworICBXRElfUXVldWVQZW5kaW5nUmVxKCBwV0RJQ3R4LCBwRXZlbnREYXRhKTsgCisgIHJldHVybiBXRElfU1RBVFVTX1BFTkRJTkc7CisgIAorfS8qV0RJX01haW5SZXFCdXN5Ki8KKy8qKgorIEBicmllZiBNYWluIEZTTSBDbG9zZSBmdW5jdGlvbiBmb3Igc3RhdGUgQlVTWQorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX01haW5DbG9zZUJ1c3kKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSAgcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgIkludmFsaWQgcGFyYW1ldGVycyBvbiBNYWluIENsb3NlIGluIEJVU1kgJXggJXgiLCAKKyAgICAgICAgICAgICAgIHBXRElDdHgsIHBFdmVudERhdGEpOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIENoZWNrIGlmIHRoZSBDb250cm9sIFRyYW5zcG9ydCBoYXMgYmVlbiBvcGVuZWQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICJXREkgQnVzeSBzdGF0ZSAtIHF1ZXVlIGNsb3NlIHJlcXVlc3QiKTsKKworICBXRElfUXVldWVQZW5kaW5nUmVxKCBwV0RJQ3R4LCBwRXZlbnREYXRhKTsgCisgIHJldHVybiBXRElfU1RBVFVTX1BFTkRJTkc7CisgIAorfS8qV0RJX01haW5DbG9zZUJ1c3kqLworCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU2h1dGRvd24gZnVuY3Rpb24gZm9yIElOSVQgJiBTVEFSVEVEIHN0YXRlcworCisKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKworIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9NYWluU2h1dGRvd24KKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gIHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBwYXJhbWV0ZXJzIG9uIE1haW4gU3RhcnQgJXggJXgiLAorICAgICAgICAgICAgICAgcFdESUN0eCwgcEV2ZW50RGF0YSk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIC8qU3RhdGUgYXQgdGhpcyBwb2ludCBpcyBCVVNZIC0gYmVjYXVzZSB3ZSBlbnRlciB0aGlzIHN0YXRlIGJlZm9yZSBwb3N0aW5nCisgICAgYW4gZXZlbnQgdG8gdGhlIEZTTSBpbiBvcmRlciB0byBwcmV2ZW50IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMqLworCisgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAiUHJvY2Vzc2luZyBzaHV0ZG93biByZXF1ZXN0IGluIEZTTSIpOworCisgIC8qUmV0dXJuIFN1Y2Nlc3MqLworICByZXR1cm4gV0RJX1Byb2Nlc3NSZXF1ZXN0KCBwV0RJQ3R4LCBwRXZlbnREYXRhICk7CisKK30vKldESV9NYWluU2h1dGRvd24qLworCisvKioKKyBAYnJpZWYgTWFpbiBGU00gU2h1dGRvd24gZnVuY3Rpb24gZm9yIEJVU1kgc3RhdGUKKworCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlCisKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfTWFpblNodXRkb3duQnVzeQorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjaworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSAgcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHBhcmFtZXRlcnMgb24gTWFpbiBTdGFydCAleCAleCIsCisgICAgICAgICAgICAgICBwV0RJQ3R4LCBwRXZlbnREYXRhKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgLyogSWYgeW91IGFyZSB3YWl0aW5nIGZvciBhIEhBTCByZXNwb25zZSBhdCB0aGlzIHN0YWdlLCB5b3UgYXJlIG5vdAorICAgKiBnb2luZyB0byBnZXQgaXQuIFJpdmEgaXMgYWxyZWFkeSBzaHV0ZG93bi9jcmFzaGVkLgorICAgKi8KKyAgd3BhbFRpbWVyU3RvcCgmZ1dESUNiLndwdFJlc3BvbnNlVGltZXIpOworCisgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAiUHJvY2Vzc2luZyBzaHV0ZG93biByZXF1ZXN0IGluIEZTTTogQnVzeSBzdGF0ZSAiKTsKKworICByZXR1cm4gV0RJX1Byb2Nlc3NSZXF1ZXN0KCBwV0RJQ3R4LCBwRXZlbnREYXRhICk7CisKK30vKldESV9NYWluU2h1dGRvd25CdXN5Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorIAorICAgICAgICAgICBXTEFOIERBTCBDb250cm9sIFBhdGggTWFpbiBQcm9jZXNzaW5nIEZ1bmN0aW9ucworIAorKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICBNYWluIERBTCBDb250cm9sIFBhdGggUmVxdWVzdCBQcm9jZXNzaW5nIEFQSSAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTdGFydCBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTSAKKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU3RhcnRSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGFydFJlcVBhcmFtc1R5cGUqIHB3ZGlTdGFydFBhcmFtcyAgICA9IE5VTEw7CisgIFdESV9TdGFydFJzcENiICAgICAgICAgIHdkaVN0YXJ0UnNwQ2IgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgPSAwOworCisgIHRIYWxNYWNTdGFydFJlcU1zZyAgICAgIGhhbFN0YXJ0UmVxOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgdXNMZW4gICAgICAgICAgICAgID0gMDsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IChwd2RpU3RhcnRQYXJhbXMgPSAoV0RJX1N0YXJ0UmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAoIE5VTEwgPT0gKHdkaVN0YXJ0UnNwQ2IgICA9IChXRElfU3RhcnRSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVzTGVuID0gc2l6ZW9mKGhhbFN0YXJ0UmVxLnN0YXJ0UmVxUGFyYW1zKSArIAorICAgICAgICAgIHB3ZGlTdGFydFBhcmFtcy0+dXNDb25maWdCdWZmZXJMZW47CisKKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfU1RBUlRfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyB1c0xlbiApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIHN0YXJ0IHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVN0YXJ0UGFyYW1zLCB3ZGlTdGFydFJzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIGluIHRoZSBtZXNzYWdlCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaGFsU3RhcnRSZXEuc3RhcnRSZXFQYXJhbXMuZHJpdmVyVHlwZSA9IAorICAgICBXRElfMl9IQUxfRFJWX1RZUEUocHdkaVN0YXJ0UGFyYW1zLT53ZGlEcml2ZXJUeXBlKTsgCisKKyAgaGFsU3RhcnRSZXEuc3RhcnRSZXFQYXJhbXMudUNvbmZpZ0J1ZmZlckxlbiA9IAorICAgICAgICAgICAgICAgICAgcHdkaVN0YXJ0UGFyYW1zLT51c0NvbmZpZ0J1ZmZlckxlbjsgCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgJmhhbFN0YXJ0UmVxLnN0YXJ0UmVxUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTdGFydFJlcS5zdGFydFJlcVBhcmFtcykpOyAKKworICB1c0RhdGFPZmZzZXQgICs9IHNpemVvZihoYWxTdGFydFJlcS5zdGFydFJlcVBhcmFtcyk7IAorICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgIHB3ZGlTdGFydFBhcmFtcy0+cENvbmZpZ0J1ZmZlciwgCisgICAgICAgICAgICAgICAgICBwd2RpU3RhcnRQYXJhbXMtPnVzQ29uZmlnQnVmZmVyTGVuKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVN0YXJ0UGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVN0YXJ0UGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qU2F2ZSBMb3cgTGV2ZWwgSW5kIENCIGFuZCBhc3NvY2lhdGVkIHVzZXIgZGF0YSAtIGl0IHdpbGwgYmUgdXNlZCBmdXJ0aGVyCisgICAgb24gd2hlbiBhbiBpbmRpY2F0aW9uIGlzIGNvbWluZyBmcm9tIHRoZSBsb3dlciBNQUMqLworICBwV0RJQ3R4LT53ZGlMb3dMZXZlbEluZENCICAgPSBwd2RpU3RhcnRQYXJhbXMtPndkaUxvd0xldmVsSW5kQ0I7CisgIHBXRElDdHgtPnBJbmRVc2VyRGF0YSAgICAgICA9IHB3ZGlTdGFydFBhcmFtcy0+cEluZFVzZXJEYXRhOyAKKworICBwV0RJQ3R4LT5iRnJhbWVUcmFuc0VuYWJsZWQgPSBwd2RpU3RhcnRQYXJhbXMtPmJGcmFtZVRyYW5zRW5hYmxlZDsgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgU3RhcnQgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaVN0YXJ0UnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX1NUQVJUX1JFU1ApOworCisgIAorfS8qV0RJX1Byb2Nlc3NTdGFydFJlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFN0b3AgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1N0b3BSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdG9wUmVxUGFyYW1zVHlwZSogcHdkaVN0b3BQYXJhbXMgICAgICA9IE5VTEw7CisgIFdESV9TdG9wUnNwQ2IgICAgICAgICAgd2RpU3RvcFJzcENiICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworCisgIHRIYWxNYWNTdG9wUmVxTXNnICAgICAgaGFsU3RvcFJlcTsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gKHB3ZGlTdG9wUGFyYW1zID0gKFdESV9TdG9wUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAoIE5VTEwgPT0gKHdkaVN0b3BSc3BDYiAgID0gKFdESV9TdG9wUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX1NUT1BfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTdG9wUmVxLnN0b3BSZXFQYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsU3RvcFJlcS5zdG9wUmVxUGFyYW1zKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc3RvcCByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlTdG9wUGFyYW1zLCB3ZGlTdG9wUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gdGhlIG1lc3NhZ2UKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoYWxTdG9wUmVxLnN0b3BSZXFQYXJhbXMucmVhc29uID0gV0RJXzJfSEFMX1NUT1BfUkVBU09OKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVN0b3BQYXJhbXMtPndkaVN0b3BSZWFzb24pOworCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgJmhhbFN0b3BSZXEuc3RvcFJlcVBhcmFtcywgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU3RvcFJlcS5zdG9wUmVxUGFyYW1zKSk7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlTdG9wUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVN0b3BQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgLyohIFRPIERPOiBzdG9wIHRoZSBkYXRhIHNlcnZpY2VzICovCisgIGlmICggZURSSVZFUl9UWVBFX01GRyAhPSBwV0RJQ3R4LT5kcml2ZXJNb2RlICkKKyAgeworICAgICAvKlN0b3AgdGhlIFNUQSBUYWJsZSAhVVQtIGNoZWNrIHRoaXMgbG9naWMgYWdhaW4KKyAgICAgIEl0IGlzIHNhZmVyIHRvIGRvIGl0IGhlcmUgdGhhbiBvbiB0aGUgcmVzcG9uc2UgLSBiZWNhdXNlIGEgc3RvcCBpcyBpbW1pbmVudCovCisgICAgIFdESV9TVEFUYWJsZVN0b3AocFdESUN0eCk7CisKKyAgICAgLyogUmVzZXQgdGhlIGV2ZW50IHRvIGJlIG5vdCBzaWduYWxsZWQgKi8KKyAgICAgaWYoV0RJX1NUQVRVU19TVUNDRVNTICE9IHdwYWxFdmVudFJlc2V0KCZwV0RJQ3R4LT5zZXRQb3dlclN0YXRlRXZlbnQpICkKKyAgICAgeworICAgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiV0RJIEluaXQgZmFpbGVkIHRvIHJlc2V0IHBvd2VyIHN0YXRlIGV2ZW50Iik7CisKKyAgICAgICAgV0RJX0FTU0VSVCgwKTsgCisgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgfQorICAgICAvKiBTdG9wIFRyYW5zcG9ydCBEcml2ZXIsIERYRSAqLworICAgICBXRFRTX1NldFBvd2VyU3RhdGUocFdESUN0eCwgV0RUU19QT1dFUl9TVEFURV9ET1dOLCBXRElfU2V0UG93ZXJTdGF0ZUNiKTsKKyAgICAgLyoKKyAgICAgICogV2FpdCBmb3IgdGhlIGV2ZW50IHRvIGJlIHNldCBvbmNlIHRoZSBBQ0sgY29tZXMgYmFjayBmcm9tIERYRSAKKyAgICAgICovCisgICAgIGlmKFdESV9TVEFUVVNfU1VDQ0VTUyAhPSB3cGFsRXZlbnRXYWl0KCZwV0RJQ3R4LT5zZXRQb3dlclN0YXRlRXZlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfU0VUX1BPV0VSX1NUQVRFX1RJTUVPVVQpKQorICAgICB7CisgICAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICJXREkgSW5pdCBmYWlsZWQgdG8gd2FpdCBvbiBhbiBldmVudCIpOworCisgICAgICAgIFdESV9BU1NFUlQoMCk7IAorICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFN0b3AgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaVN0b3BSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfU1RPUF9SRVNQKTsKKworfS8qV0RJX1Byb2Nlc3NTdG9wUmVxKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQ2xvc2UgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0Nsb3NlUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgd3B0X3N0YXR1cyAgICAgICAgICAgICAgd3B0U3RhdHVzOyAKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLypMb2NrIGNvbnRyb2wgYmxvY2sgZm9yIGNsZWFudXAqLworICAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgICAgIAorICAgLypDbGVhciBhbGwgcGVuZGluZyByZXF1ZXN0Ki8KKyAgIFdESV9DbGVhclBlbmRpbmdSZXF1ZXN0cyhwV0RJQ3R4KTsKKworICAgLyogQ2xvc2UgQ29udHJvbCB0cmFuc3BvcnQqLworICAgV0NUU19DbG9zZVRyYW5zcG9ydChwV0RJQ3R4LT53Y3RzSGFuZGxlKTsgCisKKyAgIC8qIENsb3NlIERhdGEgdHJhbnNwb3J0Ki8KKyAgIC8qIEZUTSBtb2RlIGRvZXMgbm90IG9wZW4gRGF0YSBQYXRoICovCisgICBpZiAoIGVEUklWRVJfVFlQRV9NRkcgIT0gcFdESUN0eC0+ZHJpdmVyTW9kZSApCisgICB7CisgICAgICBXRFRTX0Nsb3NlKHBXRElDdHgpOworICAgfQorCisgICAvKkNsb3NlIHRoZSBTVEEgVGFibGUgIVVULSBjaGVjayB0aGlzIGxvZ2ljIGFnYWluKi8KKyAgIFdESV9TVEFUYWJsZUNsb3NlKHBXRElDdHgpOworCisgICAvKmNsb3NlIHRoZSBQQUwgKi8KKyAgIHdwdFN0YXR1cyA9IHdwYWxDbG9zZShwV0RJQ3R4LT5wUEFMQ29udGV4dCk7CisgICBpZiAoIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSAgd3B0U3RhdHVzICkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gd3BhbCBDbG9zZSAlZCIsIHdwdFN0YXR1cyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICB9CisKKyAgIC8qVHJhbnNpdGlvbiBiYWNrIHRvIGluaXQgc3RhdGUqLworICAgV0RJX1NUQVRFX1RSQU5TSVRJT04oIHBXRElDdHgsIFdESV9JTklUX1NUKTsKKworICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgICAvKk1ha2Ugc3VyZSB0aGUgZXhwZWN0ZWQgc3RhdGUgaXMgcHJvcGVybHkgZGVmYXVsdGVkIHRvIEluaXQqLworICAgcFdESUN0eC0+dWNFeHBlY3RlZFN0YXRlVHJhbnNpdGlvbiA9IFdESV9JTklUX1NUOyAKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0Nsb3NlUmVxKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgU0NBTklORyBSRVFVRVNUIFBST0NFU1NJTkcgQVBJIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgSW5pdCBTY2FuIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0luaXRTY2FuUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfSW5pdFNjYW5SZXFQYXJhbXNUeXBlKiAgcHdkaUluaXRTY2FuUGFyYW1zICAgID0gTlVMTDsKKyAgV0RJX0luaXRTY2FuUnNwQ2IgICAgICAgICAgIHdkaUluaXRTY2FuUnNwQ2IgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgICAgPSAwOworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgdEhhbEluaXRTY2FuUmVxTXNnICAgICAgICAgIGhhbEluaXRTY2FuUmVxTXNnOworCisgIC8qVGhpcyBpcyB0ZW1wb3JhcnkgZml4LiAKKyAgICogSXQgc2hvbGQgYmUgcmVtb3ZlZCBvbmNlIGhvc3QgYW5kIHJpdmEgY2hhbmdlcyBhcmUgaW4gc3luYyovCisgIHRIYWxJbml0U2NhbkNvblJlcU1zZyAgICAgICBoYWxJbml0U2NhbkNvblJlcU1zZzsKKworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IChwd2RpSW5pdFNjYW5QYXJhbXMgPSAoV0RJX0luaXRTY2FuUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAoIE5VTEwgPT0gKHdkaUluaXRTY2FuUnNwQ2IgICA9IChXRElfSW5pdFNjYW5Sc3BDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICBXRElfQVNTRVJUKDApOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworI2lmIDAKKyAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIFNDQU4gaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAtIGlmIHNvIHJlamVjdCB0aGUgcmVxCisgICAgV2Ugb25seSBhbGxvdyBvbmUgc2NhbiBhdCBhIHRpbWUKKyAgICAhIFRPIERPOiAtIHJldmlzaXQgdGhpcyBjb25zdHJhaW50IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBwV0RJQ3R4LT5iU2NhbkluUHJvZ3Jlc3MgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAiU2NhbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzIC0gc3Vic2VxdWVudCBzY2FuIGlzIG5vdCBhbGxvd2VkIgorICAgICAgICAiIHVudGlsIHRoZSBmaXJzdCBzY2FuIGNvbXBsZXRlcyIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgcFdESUN0eC0+YlNjYW5JblByb2dyZXNzID0gZVdMQU5fUEFMX1RSVUU7IAorICBwV0RJQ3R4LT51U2NhblN0YXRlICAgICAgPSBXRElfU0NBTl9JTklUSUFMSVpFRF9TVDsgCisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworI2VuZGlmCisKKyAgaWYgKHB3ZGlJbml0U2NhblBhcmFtcy0+d2RpUmVxSW5mby5iVXNlTk9BKQorICB7CisgICAgLypUaGlzIGlzIHRlbXBvcmFyeSBmaXguIAorICAgICAqIEl0IHNob2xkIGJlIHJlbW92ZWQgb25jZSBob3N0IGFuZCByaXZhIGNoYW5nZXMgYXJlIGluIHN5bmMqLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0lOSVRfU0NBTl9DT05fUkVRLCAKKyAgICAgICAgICAgIHNpemVvZihoYWxJbml0U2NhbkNvblJlcU1zZy5pbml0U2NhblBhcmFtcyksCisgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKGhhbEluaXRTY2FuQ29uUmVxTXNnLmluaXRTY2FuUGFyYW1zKSApKSkKKyAgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBpbml0IHNjYW4gcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpSW5pdFNjYW5QYXJhbXMsIHdkaUluaXRTY2FuUnNwQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICAgfQorCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBGaWxsIGluIHRoZSBtZXNzYWdlCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaGFsSW5pdFNjYW5Db25SZXFNc2cuaW5pdFNjYW5QYXJhbXMuc2Nhbk1vZGUgPSAKKyAgICAgIFdESV8yX0hBTF9TQ0FOX01PREUocHdkaUluaXRTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLndkaVNjYW5Nb2RlKTsKKworICAgIHdwYWxNZW1vcnlDb3B5KGhhbEluaXRTY2FuQ29uUmVxTXNnLmluaXRTY2FuUGFyYW1zLmJzc2lkLAorICAgICAgICBwd2RpSW5pdFNjYW5QYXJhbXMtPndkaVJlcUluZm8ubWFjQlNTSUQsIFdESV9NQUNfQUREUl9MRU4pOworCisgICAgaGFsSW5pdFNjYW5Db25SZXFNc2cuaW5pdFNjYW5QYXJhbXMubm90aWZ5QnNzID0gCisgICAgICBwd2RpSW5pdFNjYW5QYXJhbXMtPndkaVJlcUluZm8uYk5vdGlmeUJTUzsKKyAgICBoYWxJbml0U2NhbkNvblJlcU1zZy5pbml0U2NhblBhcmFtcy5mcmFtZVR5cGUgPSAKKyAgICAgIHB3ZGlJbml0U2NhblBhcmFtcy0+d2RpUmVxSW5mby51Y0ZyYW1lVHlwZTsKKyAgICBoYWxJbml0U2NhbkNvblJlcU1zZy5pbml0U2NhblBhcmFtcy5mcmFtZUxlbmd0aCA9IAorICAgICAgcHdkaUluaXRTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLnVjRnJhbWVMZW5ndGg7CisKKyAgICBXRElfQ29weVdESU1nbUZyYW1lSGRyVG9IQUxNZ21GcmFtZUhkciggJmhhbEluaXRTY2FuQ29uUmVxTXNnLmluaXRTY2FuUGFyYW1zLm1hY01nbXRIZHIsCisgICAgICAgICZwd2RpSW5pdFNjYW5QYXJhbXMtPndkaVJlcUluZm8ud2RpTUFDTWdtdEhkcik7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgICAgaGFsSW5pdFNjYW5Db25SZXFNc2cuaW5pdFNjYW5QYXJhbXMudXNlTm9BID0gcHdkaUluaXRTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLmJVc2VOT0E7CisgICAgaGFsSW5pdFNjYW5Db25SZXFNc2cuaW5pdFNjYW5QYXJhbXMuc2NhbkR1cmF0aW9uID0gcHdkaUluaXRTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLnNjYW5EdXJhdGlvbjsKKyNlbmRpZgorCisgICAgaGFsSW5pdFNjYW5Db25SZXFNc2cuaW5pdFNjYW5QYXJhbXMuc2NhbkVudHJ5LmFjdGl2ZUJTU2NudCA9IAorICAgICAgcHdkaUluaXRTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLndkaVNjYW5FbnRyeS5hY3RpdmVCU1NjbnQ7CisKKyAgICBmb3IgKGk9MDsgaSA8IHB3ZGlJbml0U2NhblBhcmFtcy0+d2RpUmVxSW5mby53ZGlTY2FuRW50cnkuYWN0aXZlQlNTY250OyBpKyspCisgICAgeworICAgICAgaGFsSW5pdFNjYW5Db25SZXFNc2cuaW5pdFNjYW5QYXJhbXMuc2NhbkVudHJ5LmJzc0lkeFtpXSA9IAorICAgICAgICBwd2RpSW5pdFNjYW5QYXJhbXMtPndkaVJlcUluZm8ud2RpU2NhbkVudHJ5LmJzc0lkeFtpXTsKKyAgICB9CisKKyAgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgJmhhbEluaXRTY2FuQ29uUmVxTXNnLmluaXRTY2FuUGFyYW1zLCAKKyAgICAgICAgc2l6ZW9mKGhhbEluaXRTY2FuQ29uUmVxTXNnLmluaXRTY2FuUGFyYW1zKSk7IAorICB9CisgIGVsc2UKKyAgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0lOSVRfU0NBTl9SRVEsIAorICAgICAgICAgICAgc2l6ZW9mKGhhbEluaXRTY2FuUmVxTXNnLmluaXRTY2FuUGFyYW1zKSwKKyAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsSW5pdFNjYW5SZXFNc2cuaW5pdFNjYW5QYXJhbXMpICkpKQorICAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIGluaXQgc2NhbiByZXEgJXggJXggJXgiLAorICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlJbml0U2NhblBhcmFtcywgd2RpSW5pdFNjYW5Sc3BDYik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgICB9CisKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIEZpbGwgaW4gdGhlIG1lc3NhZ2UKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBoYWxJbml0U2NhblJlcU1zZy5pbml0U2NhblBhcmFtcy5zY2FuTW9kZSA9IAorICAgICAgV0RJXzJfSEFMX1NDQU5fTU9ERShwd2RpSW5pdFNjYW5QYXJhbXMtPndkaVJlcUluZm8ud2RpU2Nhbk1vZGUpOworCisgICAgd3BhbE1lbW9yeUNvcHkoaGFsSW5pdFNjYW5SZXFNc2cuaW5pdFNjYW5QYXJhbXMuYnNzaWQsCisgICAgICAgIHB3ZGlJbml0U2NhblBhcmFtcy0+d2RpUmVxSW5mby5tYWNCU1NJRCwgV0RJX01BQ19BRERSX0xFTik7CisKKyAgICBoYWxJbml0U2NhblJlcU1zZy5pbml0U2NhblBhcmFtcy5ub3RpZnlCc3MgPSAKKyAgICAgIHB3ZGlJbml0U2NhblBhcmFtcy0+d2RpUmVxSW5mby5iTm90aWZ5QlNTOworICAgIGhhbEluaXRTY2FuUmVxTXNnLmluaXRTY2FuUGFyYW1zLmZyYW1lVHlwZSA9IAorICAgICAgcHdkaUluaXRTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLnVjRnJhbWVUeXBlOworICAgIGhhbEluaXRTY2FuUmVxTXNnLmluaXRTY2FuUGFyYW1zLmZyYW1lTGVuZ3RoID0gCisgICAgICBwd2RpSW5pdFNjYW5QYXJhbXMtPndkaVJlcUluZm8udWNGcmFtZUxlbmd0aDsKKworICAgIFdESV9Db3B5V0RJTWdtRnJhbWVIZHJUb0hBTE1nbUZyYW1lSGRyKCAmaGFsSW5pdFNjYW5SZXFNc2cuaW5pdFNjYW5QYXJhbXMubWFjTWdtdEhkciwKKyAgICAgICAgJnB3ZGlJbml0U2NhblBhcmFtcy0+d2RpUmVxSW5mby53ZGlNQUNNZ210SGRyKTsKKworICAgIGhhbEluaXRTY2FuUmVxTXNnLmluaXRTY2FuUGFyYW1zLnNjYW5FbnRyeS5hY3RpdmVCU1NjbnQgPSAKKyAgICAgIHB3ZGlJbml0U2NhblBhcmFtcy0+d2RpUmVxSW5mby53ZGlTY2FuRW50cnkuYWN0aXZlQlNTY250OworCisgICAgZm9yIChpPTA7IGkgPCBwd2RpSW5pdFNjYW5QYXJhbXMtPndkaVJlcUluZm8ud2RpU2NhbkVudHJ5LmFjdGl2ZUJTU2NudDsgaSsrKQorICAgIHsKKyAgICAgIGhhbEluaXRTY2FuUmVxTXNnLmluaXRTY2FuUGFyYW1zLnNjYW5FbnRyeS5ic3NJZHhbaV0gPSAKKyAgICAgICAgcHdkaUluaXRTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLndkaVNjYW5FbnRyeS5ic3NJZHhbaV07CisgICAgfQorCisgICAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICZoYWxJbml0U2NhblJlcU1zZy5pbml0U2NhblBhcmFtcywgCisgICAgICAgIHNpemVvZihoYWxJbml0U2NhblJlcU1zZy5pbml0U2NhblBhcmFtcykpOyAKKyAgfQorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlJbml0U2NhblBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlJbml0U2NhblBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIEluaXQgU2NhbiBSZXF1ZXN0IHRvIEhBTCAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgd2RpSW5pdFNjYW5Sc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfSU5JVF9TQ0FOX1JFU1ApOworCit9LypXRElfUHJvY2Vzc0luaXRTY2FuUmVxKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU3RhcnQgU2NhbiBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIAorICAgICAgICBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU3RhcnRTY2FuUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhcnRTY2FuUmVxUGFyYW1zVHlwZSogIHB3ZGlTdGFydFNjYW5QYXJhbXMgICAgPSBOVUxMOworICBXRElfU3RhcnRTY2FuUnNwQ2IgICAgICAgICAgIHdkaVN0YXJ0U2NhblJzcENiICAgICAgPSBOVUxMOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgICAgID0gMDsKKworICB0SGFsU3RhcnRTY2FuUmVxTXNnICAgICAgICAgIGhhbFN0YXJ0U2NhblJlcU1zZzsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IChwd2RpU3RhcnRTY2FuUGFyYW1zID0gKFdESV9TdGFydFNjYW5SZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICggTlVMTCA9PSAod2RpU3RhcnRTY2FuUnNwQ2IgICA9IChXRElfU3RhcnRTY2FuUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyNpZiAwCisgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIHRvIHNlZSBpZiBTQ0FOIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgLSBzdGFydCBzY2FuIGlzIG9ubHkKKyAgICBhbGxvd2VkIHdoZW4gYSBzY2FuIGlzIG9uZ29pbmcgYW5kIHRoZSBzdGF0ZSBvZiB0aGUgc2NhbiBwcm9jZWR1cmUKKyAgICBpcyBlaXRoZXIgaW5pdCBvciBlbmQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggIXBXRElDdHgtPmJTY2FuSW5Qcm9ncmVzcyApIHx8IAorICAgICAgKCggV0RJX1NDQU5fSU5JVElBTElaRURfU1QgIT0gcFdESUN0eC0+dVNjYW5TdGF0ZSApICYmCisgICAgICAgKCBXRElfU0NBTl9FTkRFRF9TVCAhPSBwV0RJQ3R4LT51U2NhblN0YXRlICkpKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiU2NhbiBzdGFydCBub3QgYWxsb3dlZCBpbiB0aGlzIHN0YXRlICVkICVkIiwKKyAgICAgICAgICAgICAgIHBXRElDdHgtPmJTY2FuSW5Qcm9ncmVzcywgcFdESUN0eC0+dVNjYW5TdGF0ZSk7CisgICAgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgcFdESUN0eC0+dVNjYW5TdGF0ZSAgICAgID0gV0RJX1NDQU5fU1RBUlRFRF9TVDsgCisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworI2VuZGlmCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX1NUQVJUX1NDQU5fUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTdGFydFNjYW5SZXFNc2cuc3RhcnRTY2FuUGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKGhhbFN0YXJ0U2NhblJlcU1zZy5zdGFydFNjYW5QYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBzdGFydCBzY2FuIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVN0YXJ0U2NhblBhcmFtcywgd2RpU3RhcnRTY2FuUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgaGFsU3RhcnRTY2FuUmVxTXNnLnN0YXJ0U2NhblBhcmFtcy5zY2FuQ2hhbm5lbCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVN0YXJ0U2NhblBhcmFtcy0+dWNDaGFubmVsOworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxTdGFydFNjYW5SZXFNc2cuc3RhcnRTY2FuUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTdGFydFNjYW5SZXFNc2cuc3RhcnRTY2FuUGFyYW1zKSk7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlTdGFydFNjYW5QYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpU3RhcnRTY2FuUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgU3RhcnQgU2NhbiBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgd2RpU3RhcnRTY2FuUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX1NUQVJUX1NDQU5fUkVTUCk7Cit9LypXRElfUHJvY2Vzc1N0YXJ0U2NhblJlcSovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRW5kIFNjYW4gUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0VuZFNjYW5SZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9FbmRTY2FuUmVxUGFyYW1zVHlwZSogIHB3ZGlFbmRTY2FuUGFyYW1zICAgID0gTlVMTDsKKyAgV0RJX0VuZFNjYW5Sc3BDYiAgICAgICAgICAgd2RpRW5kU2NhblJzcENiICAgICAgPSBOVUxMOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgID0gMDsKKworICB0SGFsRW5kU2NhblJlcU1zZyAgICAgICAgICBoYWxFbmRTY2FuUmVxTXNnOyAgICAgICAgICAgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IChwd2RpRW5kU2NhblBhcmFtcyA9IChXRElfRW5kU2NhblJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGEpKSB8fAorICAgICAgKCBOVUxMID09ICh3ZGlFbmRTY2FuUnNwQ2IgICA9IChXRElfRW5kU2NhblJzcENiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qIGNvbW1lbnRpbmcgdGhpcyBjaGVjayBhcyBVTUFDIGlzIHNlbmRpbmcgRU5EX1NDQU5fUkVRIGFmdGVyIEZJTklTSF9TQ0FOIAorICAqIHNvbWV0aW1lcyAgYmVjYXVzZSBvZiB0aGlzIGNoZWNrIHRoZSBzY2FuIHJlcXVlc3QgaXMgbm90IGJlaW5nIAorICAqIGZvcndhcmRlZCB0byBIQUwgYW5kIHJlc3VsdCBpbiBoYW5nKi8KKyNpZiAwCisgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIHRvIHNlZSBpZiBTQ0FOIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgLSBlbmQgc2NhbiBpcyBvbmx5CisgICAgYWxsb3dlZCB3aGVuIGEgc2NhbiBpcyBvbmdvaW5nIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHNjYW4gcHJvY2VkdXJlCisgICAgaXMgc3RhcnRlZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoICFwV0RJQ3R4LT5iU2NhbkluUHJvZ3Jlc3MgKSB8fCAKKyAgICAgICggV0RJX1NDQU5fU1RBUlRFRF9TVCAhPSBwV0RJQ3R4LT51U2NhblN0YXRlICkpCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIkVuZCBzdGFydCBub3QgYWxsb3dlZCBpbiB0aGlzIHN0YXRlICVkICVkIiwKKyAgICAgICAgICAgICAgIHBXRElDdHgtPmJTY2FuSW5Qcm9ncmVzcywgcFdESUN0eC0+dVNjYW5TdGF0ZSk7CisgICAgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgcFdESUN0eC0+dVNjYW5TdGF0ZSAgICAgID0gV0RJX1NDQU5fRU5ERURfU1Q7IAorCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyNlbmRpZgorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9FTkRfU0NBTl9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbEVuZFNjYW5SZXFNc2cuZW5kU2NhblBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxFbmRTY2FuUmVxTXNnLmVuZFNjYW5QYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBzdGFydCBzY2FuIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaUVuZFNjYW5QYXJhbXMsIHdkaUVuZFNjYW5Sc3BDYik7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBoYWxFbmRTY2FuUmVxTXNnLmVuZFNjYW5QYXJhbXMuc2NhbkNoYW5uZWwgPSBwd2RpRW5kU2NhblBhcmFtcy0+dWNDaGFubmVsOworCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgJmhhbEVuZFNjYW5SZXFNc2cuZW5kU2NhblBhcmFtcywgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsRW5kU2NhblJlcU1zZy5lbmRTY2FuUGFyYW1zKSk7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlFbmRTY2FuUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaUVuZFNjYW5QYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2VuZCBFbmQgU2NhbiBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgd2RpRW5kU2NhblJzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9FTkRfU0NBTl9SRVNQKTsKK30vKldESV9Qcm9jZXNzRW5kU2NhblJlcSovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRmluaXNoIFNjYW4gUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiAKKyAgICAgICAgRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0ZpbmlzaFNjYW5SZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9GaW5pc2hTY2FuUmVxUGFyYW1zVHlwZSogIHB3ZGlGaW5pc2hTY2FuUGFyYW1zOworICBXRElfRmluaXNoU2NhblJzcENiICAgICAgICAgICB3ZGlGaW5pc2hTY2FuUnNwQ2I7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICAgPSAwOworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgICBpICAgICAgICAgICAgICAgICAgICA9IDA7CisKKyAgdEhhbEZpbmlzaFNjYW5SZXFNc2cgICAgICAgICAgaGFsRmluaXNoU2NhblJlcU1zZzsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cENCZm5jKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBwd2RpRmluaXNoU2NhblBhcmFtcyA9IChXRElfRmluaXNoU2NhblJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaUZpbmlzaFNjYW5Sc3BDYiAgID0gKFdESV9GaW5pc2hTY2FuUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworICAvKiBjb21tZW50aW5nIHRoaXMgY2hlY2sgYXMgVU1BQyBpcyBzZW5kaW5nIEVORF9TQ0FOX1JFUSBhZnRlciBGSU5JU0hfU0NBTiAKKyAgKiBzb21ldGltZXMgIGJlY2F1c2Ugb2YgdGhpcyBjaGVjayB0aGUgc2NhbiByZXF1ZXN0IGlzIG5vdCBiZWluZyAKKyAgKiBmb3J3YXJkZWQgdG8gSEFMIGFuZCByZXN1bHQgaW4gaGFuZyovCisjaWYgMAorICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIFNDQU4gaXMgYWxyZWFkeSBpbiBwcm9ncmVzcworICAgIEZpbmlzaCBzY2FuIGdldHMgaW52b2tlZCBhbnkgc2NhbiBzdGF0ZXMuIGllLiBhYm9ydCBzY2FuCisgICAgSXQgc2hvdWxkIGJlIGFsbG93ZWQgaW4gYW55IHN0YXRlcy4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoICFwV0RJQ3R4LT5iU2NhbkluUHJvZ3Jlc3MgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJGaW5pc2ggc3RhcnQgbm90IGFsbG93ZWQgaW4gdGhpcyBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICBwV0RJQ3R4LT5iU2NhbkluUHJvZ3Jlc3MgKTsKKworICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJdCBpcyBzYWZlIHRvIHJlc2V0IHRoZSBzY2FuIGZsYWdzIGhlcmUgYmVjYXVzZSB1bnRpbCB0aGUgcmVzcG9uc2UgY29tZXMKKyAgICBiYWNrIGFsbCBzdWJzZXF1ZW50IHJlcXVlc3RzIHdpbGwgYmUgYmxvY2tlZCBhdCBCVVNZIHN0YXRlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBXRElDdHgtPnVTY2FuU3RhdGUgICAgICA9IFdESV9TQ0FOX0ZJTklTSEVEX1NUOyAKKyAgcFdESUN0eC0+YlNjYW5JblByb2dyZXNzID0gZVdMQU5fUEFMX0ZBTFNFOyAKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworI2VuZGlmCisKKyAgaWYgKCBwV0RJQ3R4LT5iSW5CbXBzICkKKyAgeworICAgICAvLyBub3RpZnkgRFRTIHRoYXQgd2UgYXJlIGVudGVyaW5nIEJNUFMKKyAgICAgV0RUU19TZXRQb3dlclN0YXRlKHBXRElDdHgsIFdEVFNfUE9XRVJfU1RBVEVfQk1QUywgTlVMTCk7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfRklOSVNIX1NDQU5fUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxGaW5pc2hTY2FuUmVxTXNnLmZpbmlzaFNjYW5QYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsRmluaXNoU2NhblJlcU1zZy5maW5pc2hTY2FuUGFyYW1zKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc3RhcnQgc2NhbiByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlGaW5pc2hTY2FuUGFyYW1zLCB3ZGlGaW5pc2hTY2FuUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgaGFsRmluaXNoU2NhblJlcU1zZy5maW5pc2hTY2FuUGFyYW1zLnNjYW5Nb2RlID0gCisgICAgV0RJXzJfSEFMX1NDQU5fTU9ERShwd2RpRmluaXNoU2NhblBhcmFtcy0+d2RpUmVxSW5mby53ZGlTY2FuTW9kZSk7CisKKyAgaGFsRmluaXNoU2NhblJlcU1zZy5maW5pc2hTY2FuUGFyYW1zLmN1cnJlbnRPcGVyQ2hhbm5lbCA9IAorICAgIHB3ZGlGaW5pc2hTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLnVjQ3VycmVudE9wZXJhdGluZ0NoYW5uZWw7CisKKyAgaGFsRmluaXNoU2NhblJlcU1zZy5maW5pc2hTY2FuUGFyYW1zLmNiU3RhdGUgPSAKKyAgICBXRElfMl9IQUxfQ0JfU1RBVEUocHdkaUZpbmlzaFNjYW5QYXJhbXMtPndkaVJlcUluZm8ud2RpQ0JTdGF0ZSk7CisKKyAgd3BhbE1lbW9yeUNvcHkoaGFsRmluaXNoU2NhblJlcU1zZy5maW5pc2hTY2FuUGFyYW1zLmJzc2lkLAorICAgICAgICAgICAgICAgICBwd2RpRmluaXNoU2NhblBhcmFtcy0+d2RpUmVxSW5mby5tYWNCU1NJRCwgV0RJX01BQ19BRERSX0xFTik7CisKKyAgaGFsRmluaXNoU2NhblJlcU1zZy5maW5pc2hTY2FuUGFyYW1zLm5vdGlmeUJzcyAgID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpRmluaXNoU2NhblBhcmFtcy0+d2RpUmVxSW5mby5iTm90aWZ5QlNTIDsKKyAgaGFsRmluaXNoU2NhblJlcU1zZy5maW5pc2hTY2FuUGFyYW1zLmZyYW1lVHlwZSAgID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpRmluaXNoU2NhblBhcmFtcy0+d2RpUmVxSW5mby51Y0ZyYW1lVHlwZSA7CisgIGhhbEZpbmlzaFNjYW5SZXFNc2cuZmluaXNoU2NhblBhcmFtcy5mcmFtZUxlbmd0aCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaUZpbmlzaFNjYW5QYXJhbXMtPndkaVJlcUluZm8udWNGcmFtZUxlbmd0aCA7CisKKyAgaGFsRmluaXNoU2NhblJlcU1zZy5maW5pc2hTY2FuUGFyYW1zLnNjYW5FbnRyeS5hY3RpdmVCU1NjbnQgPSAKKyAgICAgICAgICAgICAgICAgICBwd2RpRmluaXNoU2NhblBhcmFtcy0+d2RpUmVxSW5mby53ZGlTY2FuRW50cnkuYWN0aXZlQlNTY250IDsKKworICBmb3IgKGkgPSAwOyBpIDwgcHdkaUZpbmlzaFNjYW5QYXJhbXMtPndkaVJlcUluZm8ud2RpU2NhbkVudHJ5LmFjdGl2ZUJTU2NudDsgaSsrKQorICB7CisgICAgaGFsRmluaXNoU2NhblJlcU1zZy5maW5pc2hTY2FuUGFyYW1zLnNjYW5FbnRyeS5ic3NJZHhbaV0gPSAKKyAgICAgICAgICAgICAgIHB3ZGlGaW5pc2hTY2FuUGFyYW1zLT53ZGlSZXFJbmZvLndkaVNjYW5FbnRyeS5ic3NJZHhbaV0gOworICB9CisKKyAgV0RJX0NvcHlXRElNZ21GcmFtZUhkclRvSEFMTWdtRnJhbWVIZHIoICZoYWxGaW5pc2hTY2FuUmVxTXNnLmZpbmlzaFNjYW5QYXJhbXMubWFjTWdtdEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwd2RpRmluaXNoU2NhblBhcmFtcy0+d2RpUmVxSW5mby53ZGlNQUNNZ210SGRyKTsKKworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxGaW5pc2hTY2FuUmVxTXNnLmZpbmlzaFNjYW5QYXJhbXMsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbEZpbmlzaFNjYW5SZXFNc2cuZmluaXNoU2NhblBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpRmluaXNoU2NhblBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlGaW5pc2hTY2FuUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgRmluaXNoIFNjYW4gUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaUZpbmlzaFNjYW5Sc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfRklOSVNIX1NDQU5fUkVTUCk7Cit9LypXRElfUHJvY2Vzc0ZpbmlzaFNjYW5SZXEqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgQVNTT0NJQVRJT04gUkVRVUVTVCBBUEkgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioKKyBAYnJpZWYgUHJvY2VzcyBCU1MgSm9pbiBmb3IgYSBnaXZlbiBTZXNzaW9uIAorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQlNTU2Vzc2lvbkpvaW5SZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgIHBXRElDdHgsCisgIFdESV9Kb2luUmVxUGFyYW1zVHlwZSogIHB3ZGlKb2luUGFyYW1zLAorICBXRElfSm9pblJzcENiICAgICAgICAgICB3ZGlKb2luUnNwQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICBXRElfQlNTU2Vzc2lvblR5cGUqICAgICBwQlNTU2VzICAgICAgICAgICAgID0gTlVMTDsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgPSAwOyAKKworICB0SGFsSm9pblJlcU1zZyAgICAgICAgICBoYWxKb2luUmVxTXNnOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW55IHNlc3Npb24gd2l0aCB0aGlzIEJTU0lEIGFscmVhZHkgc3RvcmVkLCB3ZQorICAgIHNob3VsZCBub3QKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdWNDdXJyZW50QlNTU2VzSWR4ID0gV0RJX0ZpbmRBc3NvY1Nlc3Npb24oIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpSm9pblBhcmFtcy0+d2RpUmVxSW5mby5tYWNCU1NJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCU1NTZXMpOyAgCisKKyAgaWYgKCBOVUxMICE9IHBCU1NTZXMgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBmb3IgdGhpcyBCU1NJRCBpcyBhbHJlYWR5IGluIHBsYWNlIik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGZXRjaCBhbiBlbXB0eSBzZXNzaW9uIGJsb2NrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB1Y0N1cnJlbnRCU1NTZXNJZHggPSBXRElfRmluZEVtcHR5U2Vzc2lvbiggcFdESUN0eCwgJnBCU1NTZXMpOyAKKyAgaWYgKCBOVUxMID09IHBCU1NTZXMgKQorICB7CisKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkRBTCBoYXMgbm8gZnJlZSBzZXNzaW9ucyAtIGNhbm5vdCBydW4gYW5vdGhlciBqb2luIik7CisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfUkVTX0ZBSUxVUkU7IAorICB9CisKKyAgLypTYXZlIEJTUyBTZXNzaW9uIEluZm8qLworICBwQlNTU2VzLT5iSW5Vc2UgPSBlV0xBTl9QQUxfVFJVRTsgCisgIHdwYWxNZW1vcnlDb3B5KCBwQlNTU2VzLT5tYWNCU1NJRCwgcHdkaUpvaW5QYXJhbXMtPndkaVJlcUluZm8ubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTik7CisKKyAgLypUcmFuc2l0aW9uIHRvIHN0YXRlIEpvaW5pbmcqLworICBwQlNTU2VzLT53ZGlBc3NvY1N0YXRlICAgICAgPSBXRElfQVNTT0NfSk9JTklOR19TVDsgCisgIHBXRElDdHgtPnVjQ3VycmVudEJTU1Nlc0lkeCA9IHVjQ3VycmVudEJTU1Nlc0lkeDsKKyAgCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfSk9JTl9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbEpvaW5SZXFNc2cuam9pblJlcVBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxKb2luUmVxTXNnLmpvaW5SZXFQYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBqb2luIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcFVzZXJEYXRhLCBwd2RpSm9pblBhcmFtcywgd2RpSm9pblJzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdwYWxNZW1vcnlDb3B5KGhhbEpvaW5SZXFNc2cuam9pblJlcVBhcmFtcy5ic3NJZCwKKyAgICAgICAgICAgICAgICAgcHdkaUpvaW5QYXJhbXMtPndkaVJlcUluZm8ubWFjQlNTSUQsIFdESV9NQUNfQUREUl9MRU4pOyAKKworICB3cGFsTWVtb3J5Q29weShoYWxKb2luUmVxTXNnLmpvaW5SZXFQYXJhbXMuc2VsZlN0YU1hY0FkZHIsCisgICAgICAgICAgICAgICAgIHB3ZGlKb2luUGFyYW1zLT53ZGlSZXFJbmZvLm1hY1NUQVNlbGYsIAorICAgICAgICAgICAgICAgICBXRElfTUFDX0FERFJfTEVOKTsgCisKKyAgaGFsSm9pblJlcU1zZy5qb2luUmVxUGFyYW1zLnVjQ2hhbm5lbCA9IAorICAgIHB3ZGlKb2luUGFyYW1zLT53ZGlSZXFJbmZvLndkaUNoYW5uZWxJbmZvLnVjQ2hhbm5lbDsKKworICBoYWxKb2luUmVxTXNnLmpvaW5SZXFQYXJhbXMubGlua1N0YXRlID0gcHdkaUpvaW5QYXJhbXMtPndkaVJlcUluZm8ubGlua1N0YXRlOworCisjaWZuZGVmIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgaGFsSm9pblJlcU1zZy5qb2luUmVxUGFyYW1zLnVjTG9jYWxQb3dlckNvbnN0cmFpbnQgPSAKKyAgICBwd2RpSm9pblBhcmFtcy0+d2RpUmVxSW5mby53ZGlDaGFubmVsSW5mby51Y0xvY2FsUG93ZXJDb25zdHJhaW50OworI2VuZGlmCisKKyAgaGFsSm9pblJlcU1zZy5qb2luUmVxUGFyYW1zLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSAgICAgCisgICAgIFdESV8yX0hBTF9TRUNfQ0hfT0ZGU0VUKHB3ZGlKb2luUGFyYW1zLT53ZGlSZXFJbmZvLndkaUNoYW5uZWxJbmZvLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlTZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKKworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxKb2luUmVxTXNnLmpvaW5SZXFQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbEpvaW5SZXFNc2cuam9pblJlcVBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpSm9pblBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlKb2luUGFyYW1zLT5wVXNlckRhdGE7ICAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIEpvaW4gUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaUpvaW5Sc3BDYiwgcFVzZXJEYXRhLCBXRElfSk9JTl9SRVNQKTsgCisKK30vKldESV9Qcm9jZXNzQlNTU2Vzc2lvbkpvaW5SZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBKb2luIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNIAorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NKb2luUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgICAgICB3ZGlTdGF0dXMgICAgICAgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7CisgIFdESV9Kb2luUmVxUGFyYW1zVHlwZSogIHB3ZGlKb2luUGFyYW1zICAgICA9IE5VTEw7CisgIFdESV9Kb2luUnNwQ2IgICAgICAgICAgIHdkaUpvaW5Sc3BDYiAgICAgICA9IE5VTEw7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IChwd2RpSm9pblBhcmFtcyA9IChXRElfSm9pblJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGEpKSB8fAorICAgICAgKCBOVUxMID09ICh3ZGlKb2luUnNwQ2IgICA9IChXRElfSm9pblJzcENiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorICAKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgIT0gcFdESUN0eC0+YkFzc29jaWF0aW9uSW5Qcm9ncmVzcyApCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gaXMgY3VycmVudGx5IGluIHByb2dyZXNzLCBxdWV1ZWluZyBuZXcgam9pbiByZXEiKTsKKworICAgIC8qQXNzb2NpYXRpb24gaXMgaW4gcHJvZ3Jlc3MgLSBxdWV1ZSBjdXJyZW50IG9uZSovCisgICAgd2RpU3RhdHVzID0gV0RJX1F1ZXVlTmV3QXNzb2NSZXF1ZXN0KHBXRElDdHgsIHBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpSm9pblBhcmFtcy0+d2RpUmVxSW5mby5tYWNCU1NJRCk7CisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgICByZXR1cm4gd2RpU3RhdHVzOyAKKyAgfQorCisgIC8qU3RhcnRpbmcgYSBuZXcgYXNzb2NpYXRpb24gKi8KKyAgcFdESUN0eC0+YkFzc29jaWF0aW9uSW5Qcm9ncmVzcyA9IGVXTEFOX1BBTF9UUlVFOworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLypQcm9jZXNzIHRoZSBKb2luIFJlcXVlc3QqLworICByZXR1cm4gV0RJX1Byb2Nlc3NCU1NTZXNzaW9uSm9pblJlcSggcFdESUN0eCwgcHdkaUpvaW5QYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlKb2luUnNwQ2IscEV2ZW50RGF0YS0+cFVzZXJEYXRhKTsKKworfS8qV0RJX1Byb2Nlc3NKb2luUmVxKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBDb25maWcgQlNTIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gCisgICAgICAgIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NDb25maWdCU1NSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9Db25maWdCU1NSZXFQYXJhbXNUeXBlKiAgcHdkaUNvbmZpZ0JTU1BhcmFtczsKKyAgV0RJX0NvbmZpZ0JTU1JzcENiICAgICAgICAgICB3ZGlDb25maWdCU1NSc3BDYjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgICB1Y0N1cnJlbnRCU1NTZXNJZHggID0gMDsgCisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgICAgICAgcEJTU1NlcyAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdU1zZ1NpemUgICAgICAgICAgICA9IDA7IAorICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgICAgICAgICB3ZGlTdGF0dXMgICAgICAgICAgID0gV0RJX1NUQVRVU19TVUNDRVNTOyAKKworICB0Q29uZmlnQnNzUmVxTXNnICAgICAgICAgICAgIGhhbENvbmZpZ0Jzc1JlcU1zZzsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHB3ZGlDb25maWdCU1NQYXJhbXMgPSAoV0RJX0NvbmZpZ0JTU1JlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaUNvbmZpZ0JTU1JzcENiICAgPSAoV0RJX0NvbmZpZ0JTU1JzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uKCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlDb25maWdCU1NQYXJhbXMtPndkaVJlcUluZm8ubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCU1NTZXMpOyAKKworICBpZiAoIE5VTEwgPT0gcEJTU1NlcyApIAorICB7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIEZldGNoIGFuIGVtcHR5IHNlc3Npb24gYmxvY2sgCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgdWNDdXJyZW50QlNTU2VzSWR4ID0gV0RJX0ZpbmRFbXB0eVNlc3Npb24oIHBXRElDdHgsICZwQlNTU2VzKTsgCisgICAgICBpZiAoIE5VTEwgPT0gcEJTU1NlcyApCisgICAgICB7CisgICAgCisgICAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIkRBTCBoYXMgbm8gZnJlZSBzZXNzaW9ucyAtIGNhbm5vdCBydW4gYW5vdGhlciBqb2luIik7CisgICAgCisgICAgICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICAgICAgcmV0dXJuIFdESV9TVEFUVVNfUkVTX0ZBSUxVUkU7IAorICAgICAgfQorICAgIAorICAgICAgLypTYXZlIEJTUyBTZXNzaW9uIEluZm8qLworICAgICAgcEJTU1Nlcy0+YkluVXNlID0gZVdMQU5fUEFMX1RSVUU7IAorICAgICAgd3BhbE1lbW9yeUNvcHkoIHBCU1NTZXMtPm1hY0JTU0lELCBwd2RpQ29uZmlnQlNTUGFyYW1zLT53ZGlSZXFJbmZvLm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgICAgICBXRElfTUFDX0FERFJfTEVOKTsKKyAgICAKKyAgICAgIC8qVHJhbnNpdGlvbiB0byBzdGF0ZSBKb2luaW5nKi8KKyAgICAgIHBCU1NTZXMtPndkaUFzc29jU3RhdGUgICAgICA9IFdESV9BU1NPQ19KT0lOSU5HX1NUOyAKKyAgICAgIHBXRElDdHgtPnVjQ3VycmVudEJTU1Nlc0lkeCA9IHVjQ3VycmVudEJTU1Nlc0lkeDsKKyNlbHNlCisgICAgLyogSWYgdGhlIEJTUyB0eXBlIGlzIElCU1MgY3JlYXRlIHRoZSBzZXNzaW9uIGhlcmUgYXMgdGhlcmUgaXMgbm8gSm9pbiAKKyAgICAgKiBSZXF1ZXN0IGluIGNhc2Ugb2YgSUJTUyovCisgICAgaWYoKHB3ZGlDb25maWdCU1NQYXJhbXMtPndkaVJlcUluZm8ud2RpQlNTVHlwZSA9PSBXRElfSUJTU19NT0RFKSB8fAorICAgICAgIChwd2RpQ29uZmlnQlNTUGFyYW1zLT53ZGlSZXFJbmZvLndkaUJTU1R5cGUgPT0gV0RJX0lORlJBX0FQX01PREUpIHx8CisgICAgICAgKHB3ZGlDb25maWdCU1NQYXJhbXMtPndkaVJlcUluZm8ud2RpQlNTVHlwZSA9PSBXRElfQlRBTVBfQVBfTU9ERSkgfHwKKyAgICAgICAocHdkaUNvbmZpZ0JTU1BhcmFtcy0+d2RpUmVxSW5mby53ZGlCU1NUeXBlID09IFdESV9CVEFNUF9TVEFfTU9ERSkpCisgICAgeworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRmV0Y2ggYW4gZW1wdHkgc2Vzc2lvbiBibG9jayAKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICB1Y0N1cnJlbnRCU1NTZXNJZHggPSBXRElfRmluZEVtcHR5U2Vzc2lvbiggcFdESUN0eCwgJnBCU1NTZXMpOyAKKyAgICAgIGlmICggTlVMTCA9PSBwQlNTU2VzICkKKyAgICAgIHsKKyAgICAKKyAgICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAiREFMIGhhcyBubyBmcmVlIHNlc3Npb25zIC0gY2Fubm90IHJ1biBhbm90aGVyIGpvaW4iKTsKKyAgICAKKyAgICAgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgICAgICByZXR1cm4gV0RJX1NUQVRVU19SRVNfRkFJTFVSRTsgCisgICAgICB9CisgICAgCisgICAgICAvKlNhdmUgQlNTIFNlc3Npb24gSW5mbyovCisgICAgICBwQlNTU2VzLT5iSW5Vc2UgPSBlV0xBTl9QQUxfVFJVRTsgCisgICAgICB3cGFsTWVtb3J5Q29weSggcEJTU1Nlcy0+bWFjQlNTSUQsIHB3ZGlDb25maWdCU1NQYXJhbXMtPndkaVJlcUluZm8ubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICAgIFdESV9NQUNfQUREUl9MRU4pOworICAgIAorICAgICAgLypUcmFuc2l0aW9uIHRvIHN0YXRlIEpvaW5pbmcqLworICAgICAgcEJTU1Nlcy0+d2RpQXNzb2NTdGF0ZSAgICAgID0gV0RJX0FTU09DX0pPSU5JTkdfU1Q7IAorICAgICAgcFdESUN0eC0+dWNDdXJyZW50QlNTU2VzSWR4ID0gdWNDdXJyZW50QlNTU2VzSWR4OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBkb2VzIG5vdCB5ZXQgZXhpc3QiKTsKKyAgICAgIC8qIGZvciBJQlNTIHRlc3RpbmcgKi8KKyAgICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgIH0KKyNlbmRpZgorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiB0aGlzIEJTUyBpcyBiZWluZyBjdXJyZW50bHkgcHJvY2Vzc2VkIG9yIHF1ZXVlZCwKKyAgICBpZiBxdWV1ZWQgLSBxdWV1ZSB0aGUgbmV3IHJlcXVlc3QgYXMgd2VsbCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfVFJVRSA9PSBwQlNTU2VzLT5iQXNzb2NSZXFRdWV1ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZXhpc3RzIGJ1dCBjdXJyZW50bHkgcXVldWVkIik7CisKKyAgICB3ZGlTdGF0dXMgPSBXRElfUXVldWVBc3NvY1JlcXVlc3QoIHBXRElDdHgsIHBCU1NTZXMsIHBFdmVudERhdGEpOyAKKworICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICB9CisKKyAgLyogQ2FjaGUgdGhlIHJlcXVlc3QgZm9yIHJlc3BvbnNlIHByb2Nlc3NpbmcgKi8KKyAgd3BhbE1lbW9yeUNvcHkoJnBXRElDdHgtPndkaUNhY2hlZENvbmZpZ0Jzc1JlcSwgCisgICAgICAgICAgICAgICAgIHB3ZGlDb25maWdCU1NQYXJhbXMsIAorICAgICAgICAgICAgICAgICBzaXplb2YocFdESUN0eC0+d2RpQ2FjaGVkQ29uZmlnQnNzUmVxKSk7CisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIHVNc2dTaXplID0gc2l6ZW9mKGhhbENvbmZpZ0Jzc1JlcU1zZy5jb25maWdCc3NQYXJhbXMpOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfQ09ORklHX0JTU19SRVEsIAorICAgICAgICAgICAgICAgICAgICB1TXNnU2l6ZSwgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyB1TXNnU2l6ZSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gY29uZmlnIGJzcyByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlDb25maWdCU1NQYXJhbXMsIHdkaUNvbmZpZ0JTU1JzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qQ29weSB0aGUgQlNTIHJlcXVlc3QgKi8KKyAgV0RJX0NvcHlXRElDb25maWdCU1NUb0hBTENvbmZpZ0JTUyggJmhhbENvbmZpZ0Jzc1JlcU1zZy5jb25maWdCc3NQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwd2RpQ29uZmlnQlNTUGFyYW1zLT53ZGlSZXFJbmZvKTsKKworICAvKiBOZWVkIHRvIGZpbGwgaW4gdGhlIFNUQSBJbmRleCB0byBpbnZhbGlkLCBzaW5jZSBhdCB0aGlzIHBvaW50IHdlIGhhdmUgbm90CisgICAgIHlldCByZWNlaXZlZCBpdCBmcm9tIEhBTCAqLworICBoYWxDb25maWdCc3NSZXFNc2cuY29uZmlnQnNzUGFyYW1zLnN0YUNvbnRleHQuc3RhSWR4ID0gV0RJX1NUQV9JTlZBTElEX0lEWDsKKworICAvKiBOZWVkIHRvIGZpbGwgaW4gdGhlIEJTUyBpbmRleCAqLworICBoYWxDb25maWdCc3NSZXFNc2cuY29uZmlnQnNzUGFyYW1zLnN0YUNvbnRleHQuYnNzSWR4ID0gcEJTU1Nlcy0+dWNCU1NJZHg7CisgIAorICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxDb25maWdCc3NSZXFNc2cuY29uZmlnQnNzUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxDb25maWdCc3NSZXFNc2cuY29uZmlnQnNzUGFyYW1zKSk7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlDb25maWdCU1NQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpQ29uZmlnQlNTUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgQ29uZmlnIEJTUyBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgd2RpQ29uZmlnQlNTUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgIFdESV9DT05GSUdfQlNTX1JFU1ApOworCit9LypXRElfUHJvY2Vzc0NvbmZpZ0JTU1JlcSovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRGVsIEJTUyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTSAKKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRGVsQlNTUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfRGVsQlNTUmVxUGFyYW1zVHlwZSogIHB3ZGlEZWxCU1NQYXJhbXMgICAgPSBOVUxMOworICBXRElfRGVsQlNTUnNwQ2IgICAgICAgICAgIHdkaURlbEJTU1JzcENiICAgICAgPSBOVUxMOworICB3cHRfdWludDggICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgPSAwOyAKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgICBwQlNTU2VzICAgICAgICAgICAgID0gTlVMTDsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIFdESV9TdGF0dXMgICAgICAgICAgICAgICAgd2RpU3RhdHVzICAgICAgICAgICA9IFdESV9TVEFUVVNfU1VDQ0VTUzsgCisKKyAgdERlbGV0ZUJzc1JlcU1zZyAgICAgICAgICBoYWxCc3NSZXFNc2c7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSAocHdkaURlbEJTU1BhcmFtcyA9IChXRElfRGVsQlNTUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAoIE5VTEwgPT0gKHdkaURlbEJTU1JzcENiICAgPSAoV0RJX0RlbEJTU1JzcENiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBhc3NvY2lhdGlvbiwgaWYgc28gcXVldWUsIGlmCisgICAgbm90IGl0IG1lYW5zIGl0IGlzIGZyZWUgdG8gcHJvY2VzcyByZXF1ZXN0IAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmluZCB0aGUgQlNTIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB1Y0N1cnJlbnRCU1NTZXNJZHggPSBXRElfRmluZEFzc29jU2Vzc2lvbkJ5QlNTSWR4KCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlEZWxCU1NQYXJhbXMtPnVjQnNzSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCU1NTZXMpOyAKKworICBpZiAoIE5VTEwgPT0gcEJTU1NlcyApIAorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZG9lcyBub3QgeWV0IGV4aXN0Iik7CisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhpcyBCU1MgaXMgYmVpbmcgY3VycmVudGx5IHByb2Nlc3NlZCBvciBxdWV1ZWQsCisgICAgaWYgcXVldWVkIC0gcXVldWUgdGhlIG5ldyByZXF1ZXN0IGFzIHdlbGwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gcEJTU1Nlcy0+YkFzc29jUmVxUXVldWVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGV4aXN0cyBidXQgY3VycmVudGx5IHF1ZXVlZCIpOworCisgICAgd2RpU3RhdHVzID0gV0RJX1F1ZXVlQXNzb2NSZXF1ZXN0KCBwV0RJQ3R4LCBwQlNTU2VzLCBwRXZlbnREYXRhKTsgCisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgICByZXR1cm4gd2RpU3RhdHVzOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJZiB3ZSByZWNlaXZlIGEgRGVsIEJTUyByZXF1ZXN0IGZvciBhbiBhc3NvY2lhdGlvbiB0aGF0IGlzIGFscmVhZHkgaW4KKyAgICBwcm9ncmVzcywgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGFzc29jIGhhcyBmYWlsZWQgPT4gd2Ugbm8gbG9uZ2VyIGhhdmUKKyAgICBhbiBhc3NvY2lhdGlvbiBpbiBwcm9ncmVzcyA9PiB3ZSBtdXN0IGNoZWNrIGZvciBwZW5kaW5nIGFzc29jaWF0aW9ucworICAgIHRoYXQgd2VyZSBxdWV1ZWQgYW5kIHN0YXJ0IGFzIHNvb24gYXMgdGhlIERlbCBCU1MgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCB1Y0N1cnJlbnRCU1NTZXNJZHggPT0gcFdESUN0eC0+dWNDdXJyZW50QlNTU2VzSWR4ICkKKyAgeworICAgIC8qV2UgY2FuIHN3aXRjaCB0byBmYWxzZSBoZXJlIGJlY2F1c2UgZXZlbiBpZiBhIHN1YnNlcXVlbnQgSm9pbiBjb21lcyBpbgorICAgICAgaXQgd2lsbCBvbmx5IGJlIHByb2Nlc3NlZCB3aGVuIERBTCB0cmFuc2l0aW9ucyBvdXQgb2YgQlVTWSBzdGF0ZSB3aGljaAorICAgICAgaGFwcGVucyB3aGVuIHRoZSBEZWwgQlNTIHJlcXVlc3QgY29tZXMgKi8KKyAgICAgcFdESUN0eC0+YkFzc29jaWF0aW9uSW5Qcm9ncmVzcyA9IGVXTEFOX1BBTF9GQUxTRTsKKworICAgICAvKkZvcm1lciBhc3NvY2lhdGlvbiBpcyBjb21wbGV0ZSAtIHByZXBhcmUgbmV4dCBwZW5kaW5nIGFzc29jIGZvcgorICAgICAgIHByb2Nlc3NpbmcgKi8KKyAgICAgV0RJX0RlcXVldWVBc3NvY1JlcXVlc3QocFdESUN0eCk7CisgIH0KKworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9ERUxfQlNTX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsQnNzUmVxTXNnLmRlbGV0ZUJzc1BhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxCc3NSZXFNc2cuZGVsZXRlQnNzUGFyYW1zKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc3RhcnQgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpRGVsQlNTUGFyYW1zLCB3ZGlEZWxCU1NSc3BDYik7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKkZpbGwgaW4gdGhlIG1lc3NhZ2UgcmVxdWVzdCBzdHJ1Y3R1cmUqLworCisgIC8qQlNTIEluZGV4IGlzIHNhdmVkIG9uIGNvbmZpZyBCU1MgcmVzcG9uc2UgYW5kIFBvc3QgQXNzb2MgUmVzcG9uc2UgKi8KKyAgaGFsQnNzUmVxTXNnLmRlbGV0ZUJzc1BhcmFtcy5ic3NJZHggPSBwQlNTU2VzLT51Y0JTU0lkeDsgCisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmaGFsQnNzUmVxTXNnLmRlbGV0ZUJzc1BhcmFtcywgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsQnNzUmVxTXNnLmRlbGV0ZUJzc1BhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpRGVsQlNTUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaURlbEJTU1BhcmFtcy0+cFVzZXJEYXRhOyAKKworIAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIERlbCBCU1MgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaURlbEJTU1JzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9ERUxfQlNTX1JFU1ApOworCisgIAorfS8qV0RJX1Byb2Nlc3NEZWxCU1NSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBQb3N0IEFzc29jIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gCisgICAgICAgIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NQb3N0QXNzb2NSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9Qb3N0QXNzb2NSZXFQYXJhbXNUeXBlKiBwd2RpUG9zdEFzc29jUGFyYW1zICAgPSBOVUxMOworICBXRElfUG9zdEFzc29jUnNwQ2IgICAgICAgICAgd2RpUG9zdEFzc29jUnNwQ2IgICAgID0gTlVMTDsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgICA9IDA7IAorICBXRElfQlNTU2Vzc2lvblR5cGUqICAgICAgICAgcEJTU1NlcyAgICAgICAgICAgICAgID0gTlVMTDsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICB1TXNnU2l6ZSAgICAgICAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgdU9mZnNldCAgICAgICAgICAgICAgID0gMDsKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgICAgICAgIHdkaVN0YXR1cyAgICAgICAgICAgICA9IFdESV9TVEFUVVNfU1VDQ0VTUzsgCisKKyAgdFBvc3RBc3NvY1JlcU1zZyAgICAgICAgICAgIGhhbFBvc3RBc3NvY1JlcU1zZzsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IChwd2RpUG9zdEFzc29jUGFyYW1zID0gKFdESV9Qb3N0QXNzb2NSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICggTlVMTCA9PSAod2RpUG9zdEFzc29jUnNwQ2IgICA9IChXRElfUG9zdEFzc29jUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uKCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlQb3N0QXNzb2NQYXJhbXMtPndkaUJTU1BhcmFtcy5tYWNCU1NJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJTU1Nlcyk7IAorCisgIGlmICggTlVMTCA9PSBwQlNTU2VzICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCAtICIKKyAgICAgICAgICAgICAgIm9wZXJhdGlvbiBub3QgYWxsb3dlZCIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiB0aGlzIEJTUyBpcyBiZWluZyBjdXJyZW50bHkgcHJvY2Vzc2VkIG9yIHF1ZXVlZCwKKyAgICBpZiBxdWV1ZWQgLSBxdWV1ZSB0aGUgbmV3IHJlcXVlc3QgYXMgd2VsbCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfVFJVRSA9PSBwQlNTU2VzLT5iQXNzb2NSZXFRdWV1ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZXhpc3RzIGJ1dCBjdXJyZW50bHkgcXVldWVkIik7CisKKyAgICB3ZGlTdGF0dXMgPSBXRElfUXVldWVBc3NvY1JlcXVlc3QoIHBXRElDdHgsIHBCU1NTZXMsIHBFdmVudERhdGEpOyAKKworICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIElmIFBvc3QgQXNzb2Mgd2FzIG5vdCB5ZXQgcmVjZWl2ZWQgLSB0aGUgY3VycmVudCBhc3NvY2lhdGlvbiBtdXN0CisgICAgYmUgaW4gcHJvZ3Jlc3MKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIHVjQ3VycmVudEJTU1Nlc0lkeCAhPSBwV0RJQ3R4LT51Y0N1cnJlbnRCU1NTZXNJZHggKSB8fCAKKyAgICAgICggZVdMQU5fUEFMX0ZBTFNFID09IHBXRElDdHgtPmJBc3NvY2lhdGlvbkluUHJvZ3Jlc3MgKSkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGFzc29jaWF0aW9uIG5vIGxvbmdlciBpbiAiCisgICAgICAgICAgICAgICJwcm9ncmVzcyAtIG5vdCBhbGxvd2VkIik7CisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUG9zdCBBc3NvYyBSZXF1ZXN0IGlzIG9ubHkgYWxsb3dlZCBpbiBKb2luaW5nIHN0YXRlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0RJX0FTU09DX0pPSU5JTkdfU1QgIT0gcEJTU1Nlcy0+d2RpQXNzb2NTdGF0ZSkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiUG9zdCBBc3NvYyBub3QgYWxsb3dlZCBiZWZvcmUgSk9JTiAtIGZhaWxpbmcgcmVxdWVzdCIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIHVNc2dTaXplID0gc2l6ZW9mKGhhbFBvc3RBc3NvY1JlcU1zZy5wb3N0QXNzb2NSZXFQYXJhbXMuY29uZmlnU3RhUGFyYW1zKSArCisgICAgICAgICAgICAgc2l6ZW9mKGhhbFBvc3RBc3NvY1JlcU1zZy5wb3N0QXNzb2NSZXFQYXJhbXMuY29uZmlnQnNzUGFyYW1zKSA7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaWxsIG1lc3NhZ2UgZm9yIHR4IG92ZXIgdGhlIGJ1cyAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9QT1NUX0FTU09DX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICB1TXNnU2l6ZSwmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHVNc2dTaXplICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBzdGFydCByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlQb3N0QXNzb2NQYXJhbXMsIHdkaVBvc3RBc3NvY1JzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qQ29weSB0aGUgU1RBIHBhcmFtZXRlcnMgKi8KKyAgV0RJX0NvcHlXRElTdGFDdHhUb0hBTFN0YUN0eCgmaGFsUG9zdEFzc29jUmVxTXNnLnBvc3RBc3NvY1JlcVBhcmFtcy5jb25maWdTdGFQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB3ZGlQb3N0QXNzb2NQYXJhbXMtPndkaVNUQVBhcmFtcyApOworCisgIC8qIE5lZWQgdG8gZmlsbCBpbiB0aGUgc2VsZiBTVEEgSW5kZXggKi8KKyAgaWYgKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gCisgICAgICAgV0RJX1NUQVRhYmxlRmluZFN0YWlkQnlBZGRyKHBXRElDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlQb3N0QXNzb2NQYXJhbXMtPndkaVNUQVBhcmFtcy5tYWNTVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3cHRfdWludDgqKSZoYWxQb3N0QXNzb2NSZXFNc2cucG9zdEFzc29jUmVxUGFyYW1zLmNvbmZpZ1N0YVBhcmFtcy5zdGFJZHggKSkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICJUaGlzIHN0YXRpb24gZG9lcyBub3QgZXhpc3QgaW4gdGhlIFdESSBTdGF0aW9uIFRhYmxlICVkIik7CisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKiBOZWVkIHRvIGZpbGwgaW4gdGhlIEJTUyBpbmRleCAqLworICBoYWxQb3N0QXNzb2NSZXFNc2cucG9zdEFzc29jUmVxUGFyYW1zLmNvbmZpZ1N0YVBhcmFtcy5ic3NJZHggPSAKKyAgICAgcEJTU1Nlcy0+dWNCU1NJZHg7CisKKyAgLypDb3B5IHRoZSBCU1MgcGFyYW1ldGVycyAqLworICBXRElfQ29weVdESUNvbmZpZ0JTU1RvSEFMQ29uZmlnQlNTKCAmaGFsUG9zdEFzc29jUmVxTXNnLnBvc3RBc3NvY1JlcVBhcmFtcy5jb25maWdCc3NQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwd2RpUG9zdEFzc29jUGFyYW1zLT53ZGlCU1NQYXJhbXMpOworCisgIC8qIE5lZWQgdG8gZmlsbCBpbiB0aGUgU1RBIGluZGV4IG9mIHRoZSBwZWVyICovCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IAorICAgICAgIFdESV9TVEFUYWJsZUZpbmRTdGFpZEJ5QWRkcihwV0RJQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpUG9zdEFzc29jUGFyYW1zLT53ZGlCU1NQYXJhbXMud2RpU1RBQ29udGV4dC5tYWNTVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3cHRfdWludDgqKSZoYWxQb3N0QXNzb2NSZXFNc2cucG9zdEFzc29jUmVxUGFyYW1zLmNvbmZpZ0Jzc1BhcmFtcy5zdGFDb250ZXh0LnN0YUlkeCkpIAorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgIlRoaXMgc3RhdGlvbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgV0RJIFN0YXRpb24gVGFibGUgJWQiKTsKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qIE5lZWQgdG8gZmlsbCBpbiB0aGUgQlNTIGluZGV4ICovCisgIGhhbFBvc3RBc3NvY1JlcU1zZy5wb3N0QXNzb2NSZXFQYXJhbXMuY29uZmlnU3RhUGFyYW1zLmJzc0lkeCA9IAorICAgICBwQlNTU2VzLT51Y0JTU0lkeDsKKworICAKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmaGFsUG9zdEFzc29jUmVxTXNnLnBvc3RBc3NvY1JlcVBhcmFtcy5jb25maWdTdGFQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFBvc3RBc3NvY1JlcU1zZy5wb3N0QXNzb2NSZXFQYXJhbXMuY29uZmlnU3RhUGFyYW1zKSk7IAorCisgIHVPZmZzZXQgPSBzaXplb2YoaGFsUG9zdEFzc29jUmVxTXNnLnBvc3RBc3NvY1JlcVBhcmFtcy5jb25maWdTdGFQYXJhbXMpOworCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQgKyB1T2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxQb3N0QXNzb2NSZXFNc2cucG9zdEFzc29jUmVxUGFyYW1zLmNvbmZpZ0Jzc1BhcmFtcywgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsUG9zdEFzc29jUmVxTXNnLnBvc3RBc3NvY1JlcVBhcmFtcy5jb25maWdCc3NQYXJhbXMpKTsgCisKKyAKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVBvc3RBc3NvY1BhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlQb3N0QXNzb2NQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAKKyAgd3BhbE1lbW9yeUNvcHkoICZwV0RJQ3R4LT53ZGlDYWNoZWRQb3N0QXNzb2NSZXEsIAorICAgICAgICAgICAgICAgICAgcHdkaVBvc3RBc3NvY1BhcmFtcywKKyAgICAgICAgICAgICAgICAgIHNpemVvZihwV0RJQ3R4LT53ZGlDYWNoZWRQb3N0QXNzb2NSZXEpKTsgIAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgUG9zdCBBc3NvYyBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgd2RpUG9zdEFzc29jUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX1BPU1RfQVNTT0NfUkVTUCk7CisKKyAgCit9LypXRElfUHJvY2Vzc1Bvc3RBc3NvY1JlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIERlbCBTVEEgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0RlbFNUQVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0RlbFNUQVJlcVBhcmFtc1R5cGUqICBwd2RpRGVsU1RBUGFyYW1zOworICBXRElfRGVsU1RBUnNwQ2IgICAgICAgICAgIHdkaURlbFNUQVJzcENiOworICB3cHRfdWludDggICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgPSAwOyAKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgICBwQlNTU2VzICAgICAgICAgICAgID0gTlVMTDsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIHdwdF9tYWNBZGRyICAgICAgICAgICAgICAgbWFjQlNTSUQ7IAorICBXRElfU3RhdHVzICAgICAgICAgICAgICAgIHdkaVN0YXR1cyAgICAgICAgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7CisKKyAgdERlbGV0ZVN0YVJlcU1zZyAgICAgICAgICBoYWxEZWxTdGFSZXFNc2c7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHB3ZGlEZWxTVEFQYXJhbXMgPSAoV0RJX0RlbFNUQVJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaURlbFNUQVJzcENiICAgPSAoV0RJX0RlbFNUQVJzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgYW5kIGlkZW50aWZ5IFdESSBzZXNzaW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9TVEFUYWJsZUdldFN0YUJTU0lEQWRkcihwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlEZWxTVEFQYXJhbXMtPnVjU1RBSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWNCU1NJRCkpCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAiVGhpcyBzdGF0aW9uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBXREkgU3RhdGlvbiBUYWJsZSAlZCIpOworICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgdWNDdXJyZW50QlNTU2VzSWR4ID0gV0RJX0ZpbmRBc3NvY1Nlc3Npb24oIHBXRElDdHgsIG1hY0JTU0lELCAmcEJTU1Nlcyk7IAorICBpZiAoIE5VTEwgPT0gcEJTU1NlcyApIAorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZG9lcyBub3QgeWV0IGV4aXN0Iik7CisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIGlmIHRoaXMgQlNTIGlzIGJlaW5nIGN1cnJlbnRseSBwcm9jZXNzZWQgb3IgcXVldWVkLAorICAgIGlmIHF1ZXVlZCAtIHF1ZXVlIHRoZSBuZXcgcmVxdWVzdCBhcyB3ZWxsIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9UUlVFID09IHBCU1NTZXMtPmJBc3NvY1JlcVF1ZXVlZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBleGlzdHMgYnV0IGN1cnJlbnRseSBxdWV1ZWQiKTsKKworICAgIHdkaVN0YXR1cyA9IFdESV9RdWV1ZUFzc29jUmVxdWVzdCggcFdESUN0eCwgcEJTU1NlcywgcEV2ZW50RGF0YSk7IAorICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gd2RpU3RhdHVzOyAKKyAgfQorCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0RFTF9TVEFfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxEZWxTdGFSZXFNc2cuZGVsU3RhUGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKGhhbERlbFN0YVJlcU1zZy5kZWxTdGFQYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBzdGFydCByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlEZWxTVEFQYXJhbXMsIHdkaURlbFNUQVJzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIGhhbERlbFN0YVJlcU1zZy5kZWxTdGFQYXJhbXMuc3RhSWR4ID0gcHdkaURlbFNUQVBhcmFtcy0+dWNTVEFJZHg7IAorICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxEZWxTdGFSZXFNc2cuZGVsU3RhUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxEZWxTdGFSZXFNc2cuZGVsU3RhUGFyYW1zKSk7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlEZWxTVEFQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpRGVsU1RBUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgRGVsIFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgd2RpRGVsU1RBUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX0RFTF9TVEFfUkVTUCk7CisKK30vKldESV9Qcm9jZXNzRGVsU1RBUmVxKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIFNFQ1VSSVRZIFJFUVVFU1QgUFJPQ0VTU0lORyBBUEkgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgQlNTIEtleSBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTQorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRCc3NLZXlSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TZXRCU1NLZXlSZXFQYXJhbXNUeXBlKiAgcHdkaVNldEJTU0tleVBhcmFtczsKKyAgV0RJX1NldEJTU0tleVJzcENiICAgICAgICAgICB3ZGlTZXRCU1NLZXlSc3BDYjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgICB1Y0N1cnJlbnRCU1NTZXNJZHggID0gMDsgCisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgICAgICAgcEJTU1NlcyAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgICAgIHdkaVN0YXR1cyAgICAgICAgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7IAorICB0U2V0QnNzS2V5UmVxTXNnICAgICAgICAgICAgIGhhbFNldEJzc0tleVJlcU1zZyAgPSB7ezB9fTsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgICBrZXlJbmRleCAgICAgICAgICAgID0gMDsKKworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHB3ZGlTZXRCU1NLZXlQYXJhbXMgPSAoV0RJX1NldEJTU0tleVJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaVNldEJTU0tleVJzcENiICAgPSAoV0RJX1NldEJTU0tleVJzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uQnlCU1NJZHgoIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVNldEJTU0tleVBhcmFtcy0+d2RpQlNTS2V5SW5mby51Y0Jzc0lkeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwQlNTU2VzKTsgCisKKyAgaWYgKCBOVUxMID09IHBCU1NTZXMgKSAKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiB0aGlzIEJTUyBpcyBiZWluZyBjdXJyZW50bHkgcHJvY2Vzc2VkIG9yIHF1ZXVlZCwKKyAgICBpZiBxdWV1ZWQgLSBxdWV1ZSB0aGUgbmV3IHJlcXVlc3QgYXMgd2VsbCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfVFJVRSA9PSBwQlNTU2VzLT5iQXNzb2NSZXFRdWV1ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZXhpc3RzIGJ1dCBjdXJyZW50bHkgcXVldWVkIik7CisKKyAgICB3ZGlTdGF0dXMgPSBXRElfUXVldWVBc3NvY1JlcXVlc3QoIHBXRElDdHgsIHBCU1NTZXMsIHBFdmVudERhdGEpOyAKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIHdkaVN0YXR1czsgCisgIH0KKworCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX1NFVF9CU1NfS0VZX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU2V0QnNzS2V5UmVxTXNnLnNldEJzc0tleVBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxTZXRCc3NLZXlSZXFNc2cuc2V0QnNzS2V5UGFyYW1zKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc2V0IGJzcyBrZXkgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpU2V0QlNTS2V5UGFyYW1zLCB3ZGlTZXRCU1NLZXlSc3BDYik7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ29weSB0aGUgS2V5IHBhcmFtZXRlcnMgaW50byB0aGUgSEFMIG1lc3NhZ2UKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGhhbFNldEJzc0tleVJlcU1zZy5zZXRCc3NLZXlQYXJhbXMuYnNzSWR4ID0gdWNDdXJyZW50QlNTU2VzSWR4OyAKKworICBoYWxTZXRCc3NLZXlSZXFNc2cuc2V0QnNzS2V5UGFyYW1zLmVuY1R5cGUgPSAKKyAgICAgICAgICAgICBXRElfMl9IQUxfRU5DX1RZUEUgKHB3ZGlTZXRCU1NLZXlQYXJhbXMtPndkaUJTU0tleUluZm8ud2RpRW5jVHlwZSk7CisKKyAgaGFsU2V0QnNzS2V5UmVxTXNnLnNldEJzc0tleVBhcmFtcy5udW1LZXlzID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVNldEJTU0tleVBhcmFtcy0+d2RpQlNTS2V5SW5mby51Y051bUtleXM7CisKKyAgZm9yKGtleUluZGV4ID0gMDsga2V5SW5kZXggPCBwd2RpU2V0QlNTS2V5UGFyYW1zLT53ZGlCU1NLZXlJbmZvLnVjTnVtS2V5cyA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUluZGV4KyspCisgIHsKKyAgICBoYWxTZXRCc3NLZXlSZXFNc2cuc2V0QnNzS2V5UGFyYW1zLmtleVtrZXlJbmRleF0ua2V5SWQgPSAKKyAgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0QlNTS2V5UGFyYW1zLT53ZGlCU1NLZXlJbmZvLmFLZXlzW2tleUluZGV4XS5rZXlJZDsKKyAgICBoYWxTZXRCc3NLZXlSZXFNc2cuc2V0QnNzS2V5UGFyYW1zLmtleVtrZXlJbmRleF0udW5pY2FzdCA9CisgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0QlNTS2V5UGFyYW1zLT53ZGlCU1NLZXlJbmZvLmFLZXlzW2tleUluZGV4XS51bmljYXN0OworICAgIGhhbFNldEJzc0tleVJlcU1zZy5zZXRCc3NLZXlQYXJhbXMua2V5W2tleUluZGV4XS5rZXlEaXJlY3Rpb24gPQorICAgICAgICAgICAgICAgIHB3ZGlTZXRCU1NLZXlQYXJhbXMtPndkaUJTU0tleUluZm8uYUtleXNba2V5SW5kZXhdLmtleURpcmVjdGlvbjsKKyAgICB3cGFsTWVtb3J5Q29weShoYWxTZXRCc3NLZXlSZXFNc2cuc2V0QnNzS2V5UGFyYW1zLmtleVtrZXlJbmRleF0ua2V5UnNjLAorICAgICAgICAgICAgICAgICAgICAgcHdkaVNldEJTU0tleVBhcmFtcy0+d2RpQlNTS2V5SW5mby5hS2V5c1trZXlJbmRleF0ua2V5UnNjLCAKKyAgICAgICAgICAgICAgICAgICAgIFdESV9NQVhfS0VZX1JTQ19MRU4pOworICAgIGhhbFNldEJzc0tleVJlcU1zZy5zZXRCc3NLZXlQYXJhbXMua2V5W2tleUluZGV4XS5wYWVSb2xlID0gCisgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0QlNTS2V5UGFyYW1zLT53ZGlCU1NLZXlJbmZvLmFLZXlzW2tleUluZGV4XS5wYWVSb2xlOworICAgIGhhbFNldEJzc0tleVJlcU1zZy5zZXRCc3NLZXlQYXJhbXMua2V5W2tleUluZGV4XS5rZXlMZW5ndGggPSAKKyAgICAgICAgICAgICAgICAgICBwd2RpU2V0QlNTS2V5UGFyYW1zLT53ZGlCU1NLZXlJbmZvLmFLZXlzW2tleUluZGV4XS5rZXlMZW5ndGg7CisgICAgd3BhbE1lbW9yeUNvcHkoaGFsU2V0QnNzS2V5UmVxTXNnLnNldEJzc0tleVBhcmFtcy5rZXlba2V5SW5kZXhdLmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0QlNTS2V5UGFyYW1zLT53ZGlCU1NLZXlJbmZvLmFLZXlzW2tleUluZGV4XS5rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgV0RJX01BWF9LRVlfTEVOR1RIKTsKKyAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgJmhhbFNldEJzc0tleVJlcU1zZy5zZXRCc3NLZXlQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU2V0QnNzS2V5UmVxTXNnLnNldEJzc0tleVBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpU2V0QlNTS2V5UGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVNldEJTU0tleVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFNldCBCU1MgS2V5IFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlTZXRCU1NLZXlSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgV0RJX1NFVF9CU1NfS0VZX1JFU1ApOyAKKworfS8qV0RJX1Byb2Nlc3NTZXRCc3NLZXlSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBSZW1vdmUgQlNTIEtleSBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluICAgIAorICAgICAgICBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzUmVtb3ZlQnNzS2V5UmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfUmVtb3ZlQlNTS2V5UmVxUGFyYW1zVHlwZSogIHB3ZGlSZW1vdmVCU1NLZXlQYXJhbXM7CisgIFdESV9SZW1vdmVCU1NLZXlSc3BDYiAgICAgICAgICAgd2RpUmVtb3ZlQlNTS2V5UnNwQ2I7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgICAgdWNDdXJyZW50QlNTU2VzSWR4ICAgICA9IDA7IAorICBXRElfQlNTU2Vzc2lvblR5cGUqICAgICAgICAgICAgIHBCU1NTZXMgICAgICAgICAgICAgICAgPSBOVUxMOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgICAgID0gMDsKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICB3ZGlTdGF0dXMgICAgICAgICAgICAgID0gV0RJX1NUQVRVU19TVUNDRVNTOyAKKyAgdFJlbW92ZUJzc0tleVJlcU1zZyAgICAgICAgICAgICBoYWxSZW1vdmVCc3NLZXlSZXFNc2cgID0ge3swfX07CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cENCZm5jICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgcHdkaVJlbW92ZUJTU0tleVBhcmFtcyA9IChXRElfUmVtb3ZlQlNTS2V5UmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgd2RpUmVtb3ZlQlNTS2V5UnNwQ2IgICA9IChXRElfUmVtb3ZlQlNTS2V5UnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYW4gYXNzb2NpYXRpb24sIGlmIHNvIHF1ZXVlLCBpZgorICAgIG5vdCBpdCBtZWFucyBpdCBpcyBmcmVlIHRvIHByb2Nlc3MgcmVxdWVzdCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbmQgdGhlIEJTUyBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZSAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdWNDdXJyZW50QlNTU2VzSWR4ID0gV0RJX0ZpbmRBc3NvY1Nlc3Npb25CeUJTU0lkeCggcFdESUN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpUmVtb3ZlQlNTS2V5UGFyYW1zLT53ZGlLZXlJbmZvLnVjQnNzSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCU1NTZXMpOyAKKworICBpZiAoIE5VTEwgPT0gcEJTU1NlcyApIAorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZG9lcyBub3QgeWV0IGV4aXN0Iik7CisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIGlmIHRoaXMgQlNTIGlzIGJlaW5nIGN1cnJlbnRseSBwcm9jZXNzZWQgb3IgcXVldWVkLAorICAgIGlmIHF1ZXVlZCAtIHF1ZXVlIHRoZSBuZXcgcmVxdWVzdCBhcyB3ZWxsIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9UUlVFID09IHBCU1NTZXMtPmJBc3NvY1JlcVF1ZXVlZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBleGlzdHMgYnV0IGN1cnJlbnRseSBxdWV1ZWQiKTsKKworICAgIHdkaVN0YXR1cyA9IFdESV9RdWV1ZUFzc29jUmVxdWVzdCggcFdESUN0eCwgcEJTU1NlcywgcEV2ZW50RGF0YSk7IAorICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gd2RpU3RhdHVzOyAKKyAgfQorCisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9STVZfQlNTX0tFWV9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFJlbW92ZUJzc0tleVJlcU1zZy5yZW1vdmVCc3NLZXlQYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsUmVtb3ZlQnNzS2V5UmVxTXNnLnJlbW92ZUJzc0tleVBhcmFtcykgKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIHNldCBic3Mga2V5IHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVJlbW92ZUJTU0tleVBhcmFtcywgd2RpUmVtb3ZlQlNTS2V5UnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDb3B5IHRoZSBLZXkgcGFyYW1ldGVycyBpbnRvIHRoZSBIQUwgbWVzc2FnZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGhhbFJlbW92ZUJzc0tleVJlcU1zZy5yZW1vdmVCc3NLZXlQYXJhbXMuYnNzSWR4ID0gdWNDdXJyZW50QlNTU2VzSWR4OworCisgIGhhbFJlbW92ZUJzc0tleVJlcU1zZy5yZW1vdmVCc3NLZXlQYXJhbXMuZW5jVHlwZSA9IAorICAgICAgV0RJXzJfSEFMX0VOQ19UWVBFIChwd2RpUmVtb3ZlQlNTS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUVuY1R5cGUpOworCisgIGhhbFJlbW92ZUJzc0tleVJlcU1zZy5yZW1vdmVCc3NLZXlQYXJhbXMua2V5SWQgPSBwd2RpUmVtb3ZlQlNTS2V5UGFyYW1zLT53ZGlLZXlJbmZvLnVjS2V5SWQ7CisKKyAgaGFsUmVtb3ZlQnNzS2V5UmVxTXNnLnJlbW92ZUJzc0tleVBhcmFtcy53ZXBUeXBlID0gCisgICAgICBXRElfMl9IQUxfV0VQX1RZUEUocHdkaVJlbW92ZUJTU0tleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlXRVBUeXBlKTsKKworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgJmhhbFJlbW92ZUJzc0tleVJlcU1zZy5yZW1vdmVCc3NLZXlQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsUmVtb3ZlQnNzS2V5UmVxTXNnLnJlbW92ZUJzc0tleVBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpUmVtb3ZlQlNTS2V5UGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVJlbW92ZUJTU0tleVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFJlbW92ZSBCU1MgS2V5IFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlSZW1vdmVCU1NLZXlSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBXRElfUk1WX0JTU19LRVlfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NSZW1vdmVCc3NLZXlSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgU1RBIEtleVJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNIAorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRTdGFLZXlSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TZXRTVEFLZXlSZXFQYXJhbXNUeXBlKiAgcHdkaVNldFNUQUtleVBhcmFtczsKKyAgV0RJX1NldFNUQUtleVJzcENiICAgICAgICAgICB3ZGlTZXRTVEFLZXlSc3BDYjsKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgICAgICBwQlNTU2VzICAgICAgICAgICAgID0gTlVMTDsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIFdESV9TdGF0dXMgICAgICAgICAgICAgICAgICAgd2RpU3RhdHVzICAgICAgICAgICA9IFdESV9TVEFUVVNfU1VDQ0VTUzsgCisgIHdwdF9tYWNBZGRyICAgICAgICAgICAgICAgICAgbWFjQlNTSUQ7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgdWNDdXJyZW50QlNTU2VzSWR4OyAKKyAgdFNldFN0YUtleVJlcU1zZyAgICAgICAgICAgICBoYWxTZXRTdGFLZXlSZXFNc2cgID0ge3swfX07CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAga2V5SW5kZXggICAgICAgICAgICA9IDA7CisKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wQ0JmbmMgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAgcHdkaVNldFNUQUtleVBhcmFtcyA9IChXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgIHdkaVNldFNUQUtleVJzcENiICAgPSAoV0RJX1NldFNUQUtleVJzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgYW5kIGlkZW50aWZ5IFdESSBzZXNzaW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9TVEFUYWJsZUdldFN0YUJTU0lEQWRkcihwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLnVjU1RBSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFjQlNTSUQpKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgIlRoaXMgc3RhdGlvbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgV0RJIFN0YXRpb24gVGFibGUgJWQiKTsKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uKCBwV0RJQ3R4LCBtYWNCU1NJRCwgJnBCU1NTZXMpOyAKKyAgaWYgKCBOVUxMID09IHBCU1NTZXMgKSAKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhpcyBCU1MgaXMgYmVpbmcgY3VycmVudGx5IHByb2Nlc3NlZCBvciBxdWV1ZWQsCisgICAgaWYgcXVldWVkIC0gcXVldWUgdGhlIG5ldyByZXF1ZXN0IGFzIHdlbGwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gcEJTU1Nlcy0+YkFzc29jUmVxUXVldWVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGV4aXN0cyBidXQgY3VycmVudGx5IHF1ZXVlZCIpOworCisgICAgd2RpU3RhdHVzID0gV0RJX1F1ZXVlQXNzb2NSZXF1ZXN0KCBwV0RJQ3R4LCBwQlNTU2VzLCBwRXZlbnREYXRhKTsgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICB9CisKKworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9TRVRfU1RBX0tFWV9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcykgKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIHNldCBic3Mga2V5IHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVNldFNUQUtleVBhcmFtcywgd2RpU2V0U1RBS2V5UnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDb3B5IHRoZSBTVEEgS2V5IHBhcmFtZXRlcnMgaW50byB0aGUgSEFMIG1lc3NhZ2UKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmVuY1R5cGUgPSAKKyAgICAgIFdESV8yX0hBTF9FTkNfVFlQRSAocHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlFbmNUeXBlKTsKKworICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLndlcFR5cGUgPSAKKyAgICAgIFdESV8yX0hBTF9XRVBfVFlQRSAocHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlXRVBUeXBlICk7CisKKyAgaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcy5zdGFJZHggPSBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLnVjU1RBSWR4OworCisgIGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMuZGVmV0VQSWR4ID0gcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby51Y0RlZldFUElkeDsKKworICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLnNpbmdsZVRpZFJjID0gcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby51Y1NpbmdsZVRpZFJjOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICBmb3Ioa2V5SW5kZXggPSAwOyBrZXlJbmRleCA8IHB3ZGlTZXRTVEFLZXlQYXJhbXMtPndkaUtleUluZm8udWNOdW1LZXlzIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SW5kZXgrKykKKyAgeworICAgIGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5W2tleUluZGV4XS5rZXlJZCA9IAorICAgICAgICAgICAgICAgICAgICAgIHB3ZGlTZXRTVEFLZXlQYXJhbXMtPndkaUtleUluZm8ud2RpS2V5W2tleUluZGV4XS5rZXlJZDsKKyAgICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmtleVtrZXlJbmRleF0udW5pY2FzdCA9CisgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUtleVtrZXlJbmRleF0udW5pY2FzdDsKKyAgICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmtleVtrZXlJbmRleF0ua2V5RGlyZWN0aW9uID0KKyAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUtleVtrZXlJbmRleF0ua2V5RGlyZWN0aW9uOworICAgIHdwYWxNZW1vcnlDb3B5KGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5W2tleUluZGV4XS5rZXlSc2MsCisgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUtleVtrZXlJbmRleF0ua2V5UnNjLCAKKyAgICAgICAgICAgICAgICAgICAgIFdESV9NQVhfS0VZX1JTQ19MRU4pOworICAgIGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5W2tleUluZGV4XS5wYWVSb2xlID0gCisgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUtleVtrZXlJbmRleF0ucGFlUm9sZTsKKyAgICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmtleVtrZXlJbmRleF0ua2V5TGVuZ3RoID0gCisgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLmtleUxlbmd0aDsKKyAgICB3cGFsTWVtb3J5Q29weShoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmtleVtrZXlJbmRleF0ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlTZXRTVEFLZXlQYXJhbXMtPndkaUtleUluZm8ud2RpS2V5W2tleUluZGV4XS5rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgV0RJX01BWF9LRVlfTEVOR1RIKTsKKyAgIH0KKyNlbHNlCisgIGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5LmtleUlkID0gCisgICAgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlbMF0ua2V5SWQ7CisgIGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5LnVuaWNhc3QgPQorICAgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlbMF0udW5pY2FzdDsKKyAgaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcy5rZXkua2V5RGlyZWN0aW9uID0KKyAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUtleVswXS5rZXlEaXJlY3Rpb247CisgIHdwYWxNZW1vcnlDb3B5KGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5LmtleVJzYywKKyAgICAgICAgICAgICAgICAgICAgIHB3ZGlTZXRTVEFLZXlQYXJhbXMtPndkaUtleUluZm8ud2RpS2V5WzBdLmtleVJzYywgCisgICAgICAgICAgICAgICAgICAgICBXRElfTUFYX0tFWV9SU0NfTEVOKTsKKyAgaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcy5rZXkucGFlUm9sZSA9IAorICAgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlbMF0ucGFlUm9sZTsKKyAgaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcy5rZXkua2V5TGVuZ3RoID0gCisgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlbMF0ua2V5TGVuZ3RoOworICB3cGFsTWVtb3J5Q29weShoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmtleS5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlbMF0ua2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFdESV9NQVhfS0VZX0xFTkdUSCk7CisjZW5kaWYKKworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgJmhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVNldFNUQUtleVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFNldCBTVEEgS2V5IFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlTZXRTVEFLZXlSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgV0RJX1NFVF9TVEFfS0VZX1JFU1ApOyAKKworfS8qV0RJX1Byb2Nlc3NTZXRTVEFLZXlSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBSZW1vdmUgU1RBIEtleSBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiAKKyAgICAgICAgTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzUmVtb3ZlU3RhS2V5UmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfUmVtb3ZlU1RBS2V5UmVxUGFyYW1zVHlwZSogIHB3ZGlSZW1vdmVTVEFLZXlQYXJhbXM7CisgIFdESV9SZW1vdmVTVEFLZXlSc3BDYiAgICAgICAgICAgd2RpUmVtb3ZlU1RBS2V5UnNwQ2I7CisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgICAgICAgICAgcEJTU1NlcyAgICAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgICAgPSAwOworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgICAgICAgIHdkaVN0YXR1cyAgICAgICAgICAgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7IAorICB3cHRfbWFjQWRkciAgICAgICAgICAgICAgICAgICAgIG1hY0JTU0lEOworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeDsKKyAgdFJlbW92ZVN0YUtleVJlcU1zZyAgICAgICAgICAgICBoYWxSZW1vdmVTdGFLZXlSZXFNc2cgID0ge3swfX07CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wQ0JmbmMgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBwd2RpUmVtb3ZlU1RBS2V5UGFyYW1zID0gKFdESV9SZW1vdmVTVEFLZXlSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhOworICB3ZGlSZW1vdmVTVEFLZXlSc3BDYiAgID0gKFdESV9SZW1vdmVTVEFLZXlSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmM7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBhc3NvY2lhdGlvbiwgaWYgc28gcXVldWUsIGlmCisgICAgbm90IGl0IG1lYW5zIGl0IGlzIGZyZWUgdG8gcHJvY2VzcyByZXF1ZXN0IAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmluZCB0aGUgQlNTIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIGFuZCBpZGVudGlmeSBXREkgc2Vzc2lvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfU1RBVGFibGVHZXRTdGFCU1NJREFkZHIocFdESUN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlSZW1vdmVTVEFLZXlQYXJhbXMtPndkaUtleUluZm8udWNTVEFJZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFjQlNTSUQpKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgIlRoaXMgc3RhdGlvbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgV0RJIFN0YXRpb24gVGFibGUgJWQiKTsKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uKCBwV0RJQ3R4LCBtYWNCU1NJRCwgJnBCU1NTZXMpOyAKKyAgaWYgKCBOVUxMID09IHBCU1NTZXMgKSAKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhpcyBCU1MgaXMgYmVpbmcgY3VycmVudGx5IHByb2Nlc3NlZCBvciBxdWV1ZWQsCisgICAgaWYgcXVldWVkIC0gcXVldWUgdGhlIG5ldyByZXF1ZXN0IGFzIHdlbGwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gcEJTU1Nlcy0+YkFzc29jUmVxUXVldWVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGV4aXN0cyBidXQgY3VycmVudGx5IHF1ZXVlZCIpOworCisgICAgd2RpU3RhdHVzID0gV0RJX1F1ZXVlQXNzb2NSZXF1ZXN0KCBwV0RJQ3R4LCBwQlNTU2VzLCBwRXZlbnREYXRhKTsgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICB9CisKKworCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX1JNVl9TVEFfS0VZX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsUmVtb3ZlU3RhS2V5UmVxTXNnLnJlbW92ZVN0YUtleVBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxSZW1vdmVTdGFLZXlSZXFNc2cucmVtb3ZlU3RhS2V5UGFyYW1zKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc2V0IGJzcyBrZXkgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpUmVtb3ZlU1RBS2V5UGFyYW1zLCB3ZGlSZW1vdmVTVEFLZXlSc3BDYik7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ29weSB0aGUgS2V5IHBhcmFtZXRlcnMgaW50byB0aGUgSEFMIG1lc3NhZ2UKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGhhbFJlbW92ZVN0YUtleVJlcU1zZy5yZW1vdmVTdGFLZXlQYXJhbXMuc3RhSWR4ID0gCisgICAgICBwd2RpUmVtb3ZlU1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLnVjU1RBSWR4OworCisgIGhhbFJlbW92ZVN0YUtleVJlcU1zZy5yZW1vdmVTdGFLZXlQYXJhbXMuZW5jVHlwZSA9IAorICAgICAgV0RJXzJfSEFMX0VOQ19UWVBFIChwd2RpUmVtb3ZlU1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUVuY1R5cGUpOworCisgIGhhbFJlbW92ZVN0YUtleVJlcU1zZy5yZW1vdmVTdGFLZXlQYXJhbXMua2V5SWQgPSAKKyAgICAgIHB3ZGlSZW1vdmVTVEFLZXlQYXJhbXMtPndkaUtleUluZm8udWNLZXlJZDsKKworICBoYWxSZW1vdmVTdGFLZXlSZXFNc2cucmVtb3ZlU3RhS2V5UGFyYW1zLnVuaWNhc3QgPSAKKyAgICAgIHB3ZGlSZW1vdmVTVEFLZXlQYXJhbXMtPndkaUtleUluZm8udWNVbmljYXN0OworCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAmaGFsUmVtb3ZlU3RhS2V5UmVxTXNnLnJlbW92ZVN0YUtleVBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxSZW1vdmVTdGFLZXlSZXFNc2cucmVtb3ZlU3RhS2V5UGFyYW1zKSk7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlSZW1vdmVTVEFLZXlQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpUmVtb3ZlU1RBS2V5UGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgUmVtb3ZlIFNUQSBLZXkgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaVJlbW92ZVNUQUtleVJzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIFdESV9STVZfU1RBX0tFWV9SRVNQKTsgCisKK30vKldESV9Qcm9jZXNzUmVtb3ZlU1RBS2V5UmVxKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IFNUQSBLZXlSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTSAKKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0U3RhQmNhc3RLZXlSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TZXRTVEFLZXlSZXFQYXJhbXNUeXBlKiAgcHdkaVNldFNUQUtleVBhcmFtczsKKyAgV0RJX1NldFNUQUtleVJzcENiICAgICAgICAgICB3ZGlTZXRTVEFLZXlSc3BDYjsKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgICAgICBwQlNTU2VzICAgICAgICAgICAgID0gTlVMTDsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIFdESV9TdGF0dXMgICAgICAgICAgICAgICAgICAgd2RpU3RhdHVzICAgICAgICAgICA9IFdESV9TVEFUVVNfU1VDQ0VTUzsgCisgIHdwdF9tYWNBZGRyICAgICAgICAgICAgICAgICAgbWFjQlNTSUQ7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgdWNDdXJyZW50QlNTU2VzSWR4OyAKKyAgdFNldFN0YUtleVJlcU1zZyAgICAgICAgICAgICBoYWxTZXRTdGFLZXlSZXFNc2cgID0ge3swfX07CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAga2V5SW5kZXggICAgICAgICAgICA9IDA7CisKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wQ0JmbmMgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAgcHdkaVNldFNUQUtleVBhcmFtcyA9IChXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgIHdkaVNldFNUQUtleVJzcENiICAgPSAoV0RJX1NldFNUQUtleVJzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgYW5kIGlkZW50aWZ5IFdESSBzZXNzaW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9TVEFUYWJsZUdldFN0YUJTU0lEQWRkcihwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLnVjU1RBSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFjQlNTSUQpKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgIlRoaXMgc3RhdGlvbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgV0RJIFN0YXRpb24gVGFibGUgJWQiKTsKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uKCBwV0RJQ3R4LCBtYWNCU1NJRCwgJnBCU1NTZXMpOyAKKyAgaWYgKCBOVUxMID09IHBCU1NTZXMgKSAKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhpcyBCU1MgaXMgYmVpbmcgY3VycmVudGx5IHByb2Nlc3NlZCBvciBxdWV1ZWQsCisgICAgaWYgcXVldWVkIC0gcXVldWUgdGhlIG5ldyByZXF1ZXN0IGFzIHdlbGwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gcEJTU1Nlcy0+YkFzc29jUmVxUXVldWVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGV4aXN0cyBidXQgY3VycmVudGx5IHF1ZXVlZCIpOworCisgICAgd2RpU3RhdHVzID0gV0RJX1F1ZXVlQXNzb2NSZXF1ZXN0KCBwV0RJQ3R4LCBwQlNTU2VzLCBwRXZlbnREYXRhKTsgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICB9CisKKworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9TRVRfU1RBX0tFWV9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcykgKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIHNldCBic3Mga2V5IHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVNldFNUQUtleVBhcmFtcywgd2RpU2V0U1RBS2V5UnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDb3B5IHRoZSBTVEEgS2V5IHBhcmFtZXRlcnMgaW50byB0aGUgSEFMIG1lc3NhZ2UKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmVuY1R5cGUgPSAKKyAgICAgIFdESV8yX0hBTF9FTkNfVFlQRSAocHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlFbmNUeXBlKTsKKworICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLndlcFR5cGUgPSAKKyAgICAgIFdESV8yX0hBTF9XRVBfVFlQRSAocHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlXRVBUeXBlICk7CisKKyAgaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcy5zdGFJZHggPSBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLnVjU1RBSWR4OworCisgIGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMuZGVmV0VQSWR4ID0gcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby51Y0RlZldFUElkeDsKKworICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLnNpbmdsZVRpZFJjID0gcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby51Y1NpbmdsZVRpZFJjOworCisjaWZkZWYgV0xBTl9TT0ZUQVBfRkVBVFVSRQorICBmb3Ioa2V5SW5kZXggPSAwOyBrZXlJbmRleCA8IHB3ZGlTZXRTVEFLZXlQYXJhbXMtPndkaUtleUluZm8udWNOdW1LZXlzIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SW5kZXgrKykKKyAgeworICAgIGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5W2tleUluZGV4XS5rZXlJZCA9IAorICAgICAgICAgICAgICAgICAgICAgIHB3ZGlTZXRTVEFLZXlQYXJhbXMtPndkaUtleUluZm8ud2RpS2V5W2tleUluZGV4XS5rZXlJZDsKKyAgICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmtleVtrZXlJbmRleF0udW5pY2FzdCA9CisgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUtleVtrZXlJbmRleF0udW5pY2FzdDsKKyAgICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmtleVtrZXlJbmRleF0ua2V5RGlyZWN0aW9uID0KKyAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUtleVtrZXlJbmRleF0ua2V5RGlyZWN0aW9uOworICAgIHdwYWxNZW1vcnlDb3B5KGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5W2tleUluZGV4XS5rZXlSc2MsCisgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUtleVtrZXlJbmRleF0ua2V5UnNjLCAKKyAgICAgICAgICAgICAgICAgICAgIFdESV9NQVhfS0VZX1JTQ19MRU4pOworICAgIGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5W2tleUluZGV4XS5wYWVSb2xlID0gCisgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUtleVtrZXlJbmRleF0ucGFlUm9sZTsKKyAgICBoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmtleVtrZXlJbmRleF0ua2V5TGVuZ3RoID0gCisgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlba2V5SW5kZXhdLmtleUxlbmd0aDsKKyAgICB3cGFsTWVtb3J5Q29weShoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmtleVtrZXlJbmRleF0ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlTZXRTVEFLZXlQYXJhbXMtPndkaUtleUluZm8ud2RpS2V5W2tleUluZGV4XS5rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgV0RJX01BWF9LRVlfTEVOR1RIKTsKKyAgIH0KKyNlbHNlCisgIGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5LmtleUlkID0gCisgICAgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlbMF0ua2V5SWQ7CisgIGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5LnVuaWNhc3QgPQorICAgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlbMF0udW5pY2FzdDsKKyAgaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcy5rZXkua2V5RGlyZWN0aW9uID0KKyAgICAgICAgICAgICAgICBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlLZXlJbmZvLndkaUtleVswXS5rZXlEaXJlY3Rpb247CisgIHdwYWxNZW1vcnlDb3B5KGhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMua2V5LmtleVJzYywKKyAgICAgICAgICAgICAgICAgICAgIHB3ZGlTZXRTVEFLZXlQYXJhbXMtPndkaUtleUluZm8ud2RpS2V5WzBdLmtleVJzYywgCisgICAgICAgICAgICAgICAgICAgICBXRElfTUFYX0tFWV9SU0NfTEVOKTsKKyAgaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcy5rZXkucGFlUm9sZSA9IAorICAgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlbMF0ucGFlUm9sZTsKKyAgaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcy5rZXkua2V5TGVuZ3RoID0gCisgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlbMF0ua2V5TGVuZ3RoOworICB3cGFsTWVtb3J5Q29weShoYWxTZXRTdGFLZXlSZXFNc2cuc2V0U3RhS2V5UGFyYW1zLmtleS5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVNldFNUQUtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlLZXlbMF0ua2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFdESV9NQVhfS0VZX0xFTkdUSCk7CisjZW5kaWYKKworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgJmhhbFNldFN0YUtleVJlcU1zZy5zZXRTdGFLZXlQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU2V0U3RhS2V5UmVxTXNnLnNldFN0YUtleVBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpU2V0U1RBS2V5UGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVNldFNUQUtleVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFNldCBTVEEgS2V5IFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlTZXRTVEFLZXlSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgV0RJX1NFVF9TVEFfS0VZX1JFU1ApOyAKKworfS8qV0RJX1Byb2Nlc3NTZXRTVEFCY2FzdEtleVJlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFJlbW92ZSBTVEEgS2V5IFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIAorICAgICAgICBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NSZW1vdmVTdGFCY2FzdEtleVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1JlbW92ZVNUQUtleVJlcVBhcmFtc1R5cGUqICBwd2RpUmVtb3ZlU1RBQmNhc3RLZXlQYXJhbXM7CisgIFdESV9SZW1vdmVTVEFLZXlSc3BDYiAgICAgICAgICAgd2RpUmVtb3ZlU1RBS2V5UnNwQ2I7CisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgICAgICAgICAgcEJTU1NlcyAgICAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgICAgPSAwOworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgICAgICAgIHdkaVN0YXR1cyAgICAgICAgICAgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7IAorICB3cHRfbWFjQWRkciAgICAgICAgICAgICAgICAgICAgIG1hY0JTU0lEOworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeDsKKyAgdFJlbW92ZVN0YUtleVJlcU1zZyAgICAgICAgICAgICBoYWxSZW1vdmVTdGFCY2FzdEtleVJlcU1zZyA9IHt7MH19OworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cENCZm5jICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgcHdkaVJlbW92ZVNUQUJjYXN0S2V5UGFyYW1zID0gKFdESV9SZW1vdmVTVEFLZXlSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhOworICB3ZGlSZW1vdmVTVEFLZXlSc3BDYiAgID0gKFdESV9SZW1vdmVTVEFLZXlSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmM7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBhc3NvY2lhdGlvbiwgaWYgc28gcXVldWUsIGlmCisgICAgbm90IGl0IG1lYW5zIGl0IGlzIGZyZWUgdG8gcHJvY2VzcyByZXF1ZXN0IAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmluZCB0aGUgQlNTIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIGFuZCBpZGVudGlmeSBXREkgc2Vzc2lvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfU1RBVGFibGVHZXRTdGFCU1NJREFkZHIocFdESUN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlSZW1vdmVTVEFCY2FzdEtleVBhcmFtcy0+d2RpS2V5SW5mby51Y1NUQUlkeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWNCU1NJRCkpCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAiVGhpcyBzdGF0aW9uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBXREkgU3RhdGlvbiBUYWJsZSAlZCIpOworICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgdWNDdXJyZW50QlNTU2VzSWR4ID0gV0RJX0ZpbmRBc3NvY1Nlc3Npb24oIHBXRElDdHgsIG1hY0JTU0lELCAmcEJTU1Nlcyk7IAorICBpZiAoIE5VTEwgPT0gcEJTU1NlcyApIAorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZG9lcyBub3QgeWV0IGV4aXN0Iik7CisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKyAKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiB0aGlzIEJTUyBpcyBiZWluZyBjdXJyZW50bHkgcHJvY2Vzc2VkIG9yIHF1ZXVlZCwKKyAgICBpZiBxdWV1ZWQgLSBxdWV1ZSB0aGUgbmV3IHJlcXVlc3QgYXMgd2VsbCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfVFJVRSA9PSBwQlNTU2VzLT5iQXNzb2NSZXFRdWV1ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZXhpc3RzIGJ1dCBjdXJyZW50bHkgcXVldWVkIik7CisKKyAgICB3ZGlTdGF0dXMgPSBXRElfUXVldWVBc3NvY1JlcXVlc3QoIHBXRElDdHgsIHBCU1NTZXMsIHBFdmVudERhdGEpOyAKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIHdkaVN0YXR1czsgCisgIH0KKworCisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfUk1WX1NUQV9CQ0FTVF9LRVlfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxSZW1vdmVTdGFCY2FzdEtleVJlcU1zZy5yZW1vdmVTdGFLZXlQYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsUmVtb3ZlU3RhQmNhc3RLZXlSZXFNc2cucmVtb3ZlU3RhS2V5UGFyYW1zKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc2V0IGJzcyBrZXkgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpUmVtb3ZlU1RBQmNhc3RLZXlQYXJhbXMsIHdkaVJlbW92ZVNUQUtleVJzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDb3B5IHRoZSBLZXkgcGFyYW1ldGVycyBpbnRvIHRoZSBIQUwgbWVzc2FnZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgaGFsUmVtb3ZlU3RhQmNhc3RLZXlSZXFNc2cucmVtb3ZlU3RhS2V5UGFyYW1zLnN0YUlkeCA9IAorICAgICAgcHdkaVJlbW92ZVNUQUJjYXN0S2V5UGFyYW1zLT53ZGlLZXlJbmZvLnVjU1RBSWR4OworCisgIGhhbFJlbW92ZVN0YUJjYXN0S2V5UmVxTXNnLnJlbW92ZVN0YUtleVBhcmFtcy5lbmNUeXBlID0gCisgICAgICBXRElfMl9IQUxfRU5DX1RZUEUgKHB3ZGlSZW1vdmVTVEFCY2FzdEtleVBhcmFtcy0+d2RpS2V5SW5mby53ZGlFbmNUeXBlKTsKKworICBoYWxSZW1vdmVTdGFCY2FzdEtleVJlcU1zZy5yZW1vdmVTdGFLZXlQYXJhbXMua2V5SWQgPSAKKyAgICAgIHB3ZGlSZW1vdmVTVEFCY2FzdEtleVBhcmFtcy0+d2RpS2V5SW5mby51Y0tleUlkOworCisgIGhhbFJlbW92ZVN0YUJjYXN0S2V5UmVxTXNnLnJlbW92ZVN0YUtleVBhcmFtcy51bmljYXN0ID0gCisgICAgICBwd2RpUmVtb3ZlU1RBQmNhc3RLZXlQYXJhbXMtPndkaUtleUluZm8udWNVbmljYXN0OworCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAmaGFsUmVtb3ZlU3RhQmNhc3RLZXlSZXFNc2cucmVtb3ZlU3RhS2V5UGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFJlbW92ZVN0YUJjYXN0S2V5UmVxTXNnLnJlbW92ZVN0YUtleVBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpUmVtb3ZlU1RBQmNhc3RLZXlQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpUmVtb3ZlU1RBQmNhc3RLZXlQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2VuZCBSZW1vdmUgU1RBIEtleSBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgd2RpUmVtb3ZlU1RBS2V5UnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgV0RJX1JNVl9TVEFfS0VZX1JFU1ApOyAKKworfS8qV0RJX1Byb2Nlc3NSZW1vdmVTVEFCY2FzdEtleVJlcSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICBRT1MgYW5kIEJBIFBST0NFU1NJTkcgUkVRVUVTVCBBUEkgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioKKyBAYnJpZWYgUHJvY2VzcyBBZGQgVFNwZWMgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00KKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQWRkVFNwZWNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9BZGRUU1JlcVBhcmFtc1R5cGUqICBwd2RpQWRkVFNQYXJhbXM7CisgIFdESV9BZGRUc1JzcENiICAgICAgICAgICB3ZGlBZGRUU1JzcENiOworICB3cHRfdWludDggICAgICAgICAgICAgICAgdWNDdXJyZW50QlNTU2VzSWR4ICA9IDA7IAorICBXRElfQlNTU2Vzc2lvblR5cGUqICAgICAgcEJTU1NlcyAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgd2RpU3RhdHVzICAgICAgICAgICA9IFdESV9TVEFUVVNfU1VDQ0VTUzsgCisgIHdwdF9tYWNBZGRyICAgICAgICAgICAgICBtYWNCU1NJRDsKKyAgdEFkZFRzUGFyYW1zICAgICAgICAgICAgIGhhbEFkZFRzUGFyYW1zICAgICAgPSB7MH07CisgIAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHB3ZGlBZGRUU1BhcmFtcyA9IChXRElfQWRkVFNSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhOworICB3ZGlBZGRUU1JzcENiICAgPSAoV0RJX0FkZFRzUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYW4gYXNzb2NpYXRpb24sIGlmIHNvIHF1ZXVlLCBpZgorICAgIG5vdCBpdCBtZWFucyBpdCBpcyBmcmVlIHRvIHByb2Nlc3MgcmVxdWVzdCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbmQgdGhlIEJTUyBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZSBhbmQgaWRlbnRpZnkgV0RJIHNlc3Npb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX1NUQVRhYmxlR2V0U3RhQlNTSURBZGRyKHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlBZGRUU1BhcmFtcy0+d2RpVHNJbmZvLnVjU1RBSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFjQlNTSUQpKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgIlRoaXMgc3RhdGlvbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgV0RJIFN0YXRpb24gVGFibGUgJWQiKTsKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uKCBwV0RJQ3R4LCBtYWNCU1NJRCwgJnBCU1NTZXMpOyAKKyAgaWYgKCBOVUxMID09IHBCU1NTZXMgKSAKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhpcyBCU1MgaXMgYmVpbmcgY3VycmVudGx5IHByb2Nlc3NlZCBvciBxdWV1ZWQsCisgICAgaWYgcXVldWVkIC0gcXVldWUgdGhlIG5ldyByZXF1ZXN0IGFzIHdlbGwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gcEJTU1Nlcy0+YkFzc29jUmVxUXVldWVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGV4aXN0cyBidXQgY3VycmVudGx5IHF1ZXVlZCIpOworCisgICAgd2RpU3RhdHVzID0gV0RJX1F1ZXVlQXNzb2NSZXF1ZXN0KCBwV0RJQ3R4LCBwQlNTU2VzLCBwRXZlbnREYXRhKTsgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICB9CisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0FERF9UU19SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxBZGRUc1BhcmFtcyksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKGhhbEFkZFRzUGFyYW1zKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc2V0IGJzcyBrZXkgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpQWRkVFNQYXJhbXMsIHdkaUFkZFRTUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgaGFsQWRkVHNQYXJhbXMuc3RhSWR4ID0gcHdkaUFkZFRTUGFyYW1zLT53ZGlUc0luZm8udWNTVEFJZHg7CisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjSWR4ID0gcHdkaUFkZFRTUGFyYW1zLT53ZGlUc0luZm8udWNUc3BlY0lkeDsKKworICAvL1RTUEVDIElFCisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLnR5cGUgPSBwd2RpQWRkVFNQYXJhbXMtPndkaVRzSW5mby53ZGlUc3BlY0lFLnVjVHlwZTsKKyAgaGFsQWRkVHNQYXJhbXMudHNwZWMubGVuZ3RoID0gcHdkaUFkZFRTUGFyYW1zLT53ZGlUc0luZm8ud2RpVHNwZWNJRS51Y0xlbmd0aDsKKyAgaGFsQWRkVHNQYXJhbXMudHNwZWMubm9tTXNkdVN6ID0gCisgICAgIHB3ZGlBZGRUU1BhcmFtcy0+d2RpVHNJbmZvLndkaVRzcGVjSUUudXNOb21Nc2R1U3o7CisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLm1heE1zZHVTeiA9IAorICAgICBwd2RpQWRkVFNQYXJhbXMtPndkaVRzSW5mby53ZGlUc3BlY0lFLnVzTWF4TXNkdVN6OworICBoYWxBZGRUc1BhcmFtcy50c3BlYy5taW5TdmNJbnRlcnZhbCA9IAorICAgICBwd2RpQWRkVFNQYXJhbXMtPndkaVRzSW5mby53ZGlUc3BlY0lFLnVNaW5TdmNJbnRlcnZhbDsKKyAgaGFsQWRkVHNQYXJhbXMudHNwZWMubWF4U3ZjSW50ZXJ2YWwgPSAKKyAgICAgcHdkaUFkZFRTUGFyYW1zLT53ZGlUc0luZm8ud2RpVHNwZWNJRS51TWF4U3ZjSW50ZXJ2YWw7CisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLmluYWN0SW50ZXJ2YWwgPSAKKyAgICAgcHdkaUFkZFRTUGFyYW1zLT53ZGlUc0luZm8ud2RpVHNwZWNJRS51SW5hY3RJbnRlcnZhbDsKKyAgaGFsQWRkVHNQYXJhbXMudHNwZWMuc3VzcGVuZEludGVydmFsID0gCisgICAgIHB3ZGlBZGRUU1BhcmFtcy0+d2RpVHNJbmZvLndkaVRzcGVjSUUudVN1c3BlbmRJbnRlcnZhbDsKKyAgaGFsQWRkVHNQYXJhbXMudHNwZWMuc3ZjU3RhcnRUaW1lID0gCisgICAgIHB3ZGlBZGRUU1BhcmFtcy0+d2RpVHNJbmZvLndkaVRzcGVjSUUudVN2Y1N0YXJ0VGltZTsKKyAgaGFsQWRkVHNQYXJhbXMudHNwZWMubWluRGF0YVJhdGUgPSAKKyAgICAgcHdkaUFkZFRTUGFyYW1zLT53ZGlUc0luZm8ud2RpVHNwZWNJRS51TWluRGF0YVJhdGU7CisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLm1lYW5EYXRhUmF0ZSA9IAorICAgICBwd2RpQWRkVFNQYXJhbXMtPndkaVRzSW5mby53ZGlUc3BlY0lFLnVNZWFuRGF0YVJhdGU7CisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLnBlYWtEYXRhUmF0ZSA9IAorICAgICBwd2RpQWRkVFNQYXJhbXMtPndkaVRzSW5mby53ZGlUc3BlY0lFLnVQZWFrRGF0YVJhdGU7CisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLm1heEJ1cnN0U3ogPSAKKyAgICAgcHdkaUFkZFRTUGFyYW1zLT53ZGlUc0luZm8ud2RpVHNwZWNJRS51TWF4QnVyc3RTejsKKyAgaGFsQWRkVHNQYXJhbXMudHNwZWMuZGVsYXlCb3VuZCA9IAorICAgICBwd2RpQWRkVFNQYXJhbXMtPndkaVRzSW5mby53ZGlUc3BlY0lFLnVEZWxheUJvdW5kOworICBoYWxBZGRUc1BhcmFtcy50c3BlYy5taW5QaHlSYXRlID0gCisgICAgIHB3ZGlBZGRUU1BhcmFtcy0+d2RpVHNJbmZvLndkaVRzcGVjSUUudU1pblBoeVJhdGU7CisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLnN1cnBsdXNCdyA9IAorICAgICBwd2RpQWRkVFNQYXJhbXMtPndkaVRzSW5mby53ZGlUc3BlY0lFLnVzU3VycGx1c0J3OworICBoYWxBZGRUc1BhcmFtcy50c3BlYy5tZWRpdW1UaW1lID0gCisgICAgIHB3ZGlBZGRUU1BhcmFtcy0+d2RpVHNJbmZvLndkaVRzcGVjSUUudXNNZWRpdW1UaW1lOworCisgIC8vVFNQRUMgSUUgOiBUUyBJTkZPIDogVFJBRkZJQworICBoYWxBZGRUc1BhcmFtcy50c3BlYy50c2luZm8udHJhZmZpYy5hY2tQb2xpY3kgPSAKKyAgICAgcHdkaUFkZFRTUGFyYW1zLT53ZGlUc0luZm8ud2RpVHNwZWNJRS53ZGlUU2luZm8ud2RpVHJhZmZpYy5hY2Nlc3NQb2xpY3k7CisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLnRzaW5mby50cmFmZmljLnVzZXJQcmlvID0gCisgICAgIHB3ZGlBZGRUU1BhcmFtcy0+d2RpVHNJbmZvLndkaVRzcGVjSUUud2RpVFNpbmZvLndkaVRyYWZmaWMudXNlclByaW87CisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLnRzaW5mby50cmFmZmljLnBzYiA9IAorICAgICBwd2RpQWRkVFNQYXJhbXMtPndkaVRzSW5mby53ZGlUc3BlY0lFLndkaVRTaW5mby53ZGlUcmFmZmljLnBzYjsKKyAgaGFsQWRkVHNQYXJhbXMudHNwZWMudHNpbmZvLnRyYWZmaWMuYWdncmVnYXRpb24gPSAKKyAgICAgcHdkaUFkZFRTUGFyYW1zLT53ZGlUc0luZm8ud2RpVHNwZWNJRS53ZGlUU2luZm8ud2RpVHJhZmZpYy5hZ2dyZWdhdGlvbjsKKyAgaGFsQWRkVHNQYXJhbXMudHNwZWMudHNpbmZvLnRyYWZmaWMuZGlyZWN0aW9uID0gCisgICAgIHB3ZGlBZGRUU1BhcmFtcy0+d2RpVHNJbmZvLndkaVRzcGVjSUUud2RpVFNpbmZvLndkaVRyYWZmaWMuZGlyZWN0aW9uOworICBoYWxBZGRUc1BhcmFtcy50c3BlYy50c2luZm8udHJhZmZpYy50c2lkID0gCisgICAgIHB3ZGlBZGRUU1BhcmFtcy0+d2RpVHNJbmZvLndkaVRzcGVjSUUud2RpVFNpbmZvLndkaVRyYWZmaWMudHNpZDsKKyAgaGFsQWRkVHNQYXJhbXMudHNwZWMudHNpbmZvLnRyYWZmaWMudHJhZmZpY1R5cGUgPSAKKyAgICAgcHdkaUFkZFRTUGFyYW1zLT53ZGlUc0luZm8ud2RpVHNwZWNJRS53ZGlUU2luZm8ud2RpVHJhZmZpYy50cmFmZmljVHlwZTsKKworICAvL1RTUEVDIElFIDogVFMgSU5GTyA6IFNDSEVEVUxFCisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLnRzaW5mby5zY2hlZHVsZS5yc3ZkID0gCisgICAgIHB3ZGlBZGRUU1BhcmFtcy0+d2RpVHNJbmZvLndkaVRzcGVjSUUud2RpVFNpbmZvLndkaVNjaGVkdWxlLnJzdmQ7CisgIGhhbEFkZFRzUGFyYW1zLnRzcGVjLnRzaW5mby5zY2hlZHVsZS5zY2hlZHVsZSA9IAorICAgICBwd2RpQWRkVFNQYXJhbXMtPndkaVRzSW5mby53ZGlUc3BlY0lFLndkaVRTaW5mby53ZGlTY2hlZHVsZS5zY2hlZHVsZTsKKworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxBZGRUc1BhcmFtcywgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsQWRkVHNQYXJhbXMpKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaUFkZFRTUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaUFkZFRTUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgQWRkIFRTIFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlBZGRUU1JzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIFdESV9BRERfVFNfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NBZGRUU3BlY1JlcSovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRGVsIFRTcGVjIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0RlbFRTcGVjUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfRGVsVFNSZXFQYXJhbXNUeXBlKiAgICAgIHB3ZGlEZWxUU1BhcmFtczsKKyAgV0RJX0RlbFRzUnNwQ2IgICAgICAgICAgICAgICB3ZGlEZWxUU1JzcENiOworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgPSAwOyAKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgICAgICBwQlNTU2VzICAgICAgICAgICAgID0gTlVMTDsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIFdESV9TdGF0dXMgICAgICAgICAgICAgICAgICAgd2RpU3RhdHVzICAgICAgICAgICA9IFdESV9TVEFUVVNfU1VDQ0VTUzsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cENCZm5jICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgcHdkaURlbFRTUGFyYW1zID0gKFdESV9EZWxUU1JlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaURlbFRTUnNwQ2IgICA9IChXRElfRGVsVHNSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmM7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uKCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlEZWxUU1BhcmFtcy0+d2RpRGVsVFNJbmZvLm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCU1NTZXMpOyAKKworICBpZiAoIE5VTEwgPT0gcEJTU1NlcyApIAorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZG9lcyBub3QgeWV0IGV4aXN0Iik7CisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIGlmIHRoaXMgQlNTIGlzIGJlaW5nIGN1cnJlbnRseSBwcm9jZXNzZWQgb3IgcXVldWVkLAorICAgIGlmIHF1ZXVlZCAtIHF1ZXVlIHRoZSBuZXcgcmVxdWVzdCBhcyB3ZWxsIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9UUlVFID09IHBCU1NTZXMtPmJBc3NvY1JlcVF1ZXVlZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBleGlzdHMgYnV0IGN1cnJlbnRseSBxdWV1ZWQiKTsKKworICAgIHdkaVN0YXR1cyA9IFdESV9RdWV1ZUFzc29jUmVxdWVzdCggcFdESUN0eCwgcEJTU1NlcywgcEV2ZW50RGF0YSk7IAorICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gd2RpU3RhdHVzOyAKKyAgfQorCisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0RFTF9UU19SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB3ZGlEZWxUU1BhcmFtcy0+d2RpRGVsVFNJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHB3ZGlEZWxUU1BhcmFtcy0+d2RpRGVsVFNJbmZvKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc2V0IGJzcyBrZXkgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpRGVsVFNQYXJhbXMsIHdkaURlbFRTUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmcHdkaURlbFRTUGFyYW1zLT53ZGlEZWxUU0luZm8sIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB3ZGlEZWxUU1BhcmFtcy0+d2RpRGVsVFNJbmZvKSk7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlEZWxUU1BhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlEZWxUU1BhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIERlbCBUUyBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgd2RpRGVsVFNSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfREVMX1RTX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzRGVsVFNwZWNSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBVcGRhdGUgRURDQSBQYXJhbXMgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4KKyAgICAgICAgTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzVXBkYXRlRURDQVBhcmFtc1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1VwZGF0ZUVEQ0FQYXJhbXNUeXBlKiAgICBwd2RpVXBkYXRlRURDQVBhcmFtczsKKyAgV0RJX1VwZGF0ZUVEQ0FQYXJhbXNSc3BDYiAgICB3ZGlVcGRhdGVFRENBUnNwQ2I7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgdWNDdXJyZW50QlNTU2VzSWR4ICA9IDA7IAorICBXRElfQlNTU2Vzc2lvblR5cGUqICAgICAgICAgIHBCU1NTZXMgICAgICAgICAgICAgPSBOVUxMOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICAgPSAwOworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgICAgIHdkaVN0YXR1czsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cENCZm5jICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgcHdkaVVwZGF0ZUVEQ0FQYXJhbXMgPSAoV0RJX1VwZGF0ZUVEQ0FQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhOworICB3ZGlVcGRhdGVFRENBUnNwQ2IgICA9IChXRElfVXBkYXRlRURDQVBhcmFtc1JzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uQnlCU1NJZHgoIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVVwZGF0ZUVEQ0FQYXJhbXMtPndkaUVEQ0FJbmZvLnVjQnNzSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCU1NTZXMpOyAKKworICBpZiAoIE5VTEwgPT0gcEJTU1NlcyApIAorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZG9lcyBub3QgeWV0IGV4aXN0Iik7CisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIGlmIHRoaXMgQlNTIGlzIGJlaW5nIGN1cnJlbnRseSBwcm9jZXNzZWQgb3IgcXVldWVkLAorICAgIGlmIHF1ZXVlZCAtIHF1ZXVlIHRoZSBuZXcgcmVxdWVzdCBhcyB3ZWxsIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9UUlVFID09IHBCU1NTZXMtPmJBc3NvY1JlcVF1ZXVlZCApCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBleGlzdHMgYnV0IGN1cnJlbnRseSBxdWV1ZWQiKTsKKworICAgIHdkaVN0YXR1cyA9IFdESV9RdWV1ZUFzc29jUmVxdWVzdCggcFdESUN0eCwgcEJTU1NlcywgcEV2ZW50RGF0YSk7IAorICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gd2RpU3RhdHVzOyAKKyAgfQorCisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX1VQRF9FRENBX1BSTVNfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwd2RpVXBkYXRlRURDQVBhcmFtcy0+d2RpRURDQUluZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YocHdkaVVwZGF0ZUVEQ0FQYXJhbXMtPndkaUVEQ0FJbmZvKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc2V0IGJzcyBrZXkgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpVXBkYXRlRURDQVBhcmFtcywgd2RpVXBkYXRlRURDQVJzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgJnB3ZGlVcGRhdGVFRENBUGFyYW1zLT53ZGlFRENBSW5mbywgCisgICAgICAgICAgICAgICAgICBzaXplb2YocHdkaVVwZGF0ZUVEQ0FQYXJhbXMtPndkaUVEQ0FJbmZvKSk7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlVcGRhdGVFRENBUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVVwZGF0ZUVEQ0FQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2VuZCBVcGRhdGUgRURDQSBQYXJhbXMgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaVVwZGF0ZUVEQ0FSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgV0RJX1VQRF9FRENBX1BSTVNfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NVcGRhdGVFRENBUGFyYW1zUmVxKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQWRkIEJBIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNIAorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NBZGRCQVNlc3Npb25SZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9BZGRCQVNlc3Npb25SZXFQYXJhbXNUeXBlKiAgcHdkaUFkZEJBU2Vzc2lvblBhcmFtczsKKyAgV0RJX0FkZEJBU2Vzc2lvblJzcENiICAgICAgICAgICB3ZGlBZGRCQVNlc3Npb25Sc3BDYjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgICAgICB1Y0N1cnJlbnRCU1NTZXNJZHggID0gMDsgCisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgICAgICAgICAgcEJTU1NlcyAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgICAgICAgIHdkaVN0YXR1cyAgICAgICAgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7IAorICB3cHRfbWFjQWRkciAgICAgICAgICAgICAgICAgICAgIG1hY0JTU0lEOworCisgIHRBZGRCQVNlc3Npb25SZXFNc2cgICAgICAgICAgICAgaGFsQWRkQkFTZXNzaW9uUmVxOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHB3ZGlBZGRCQVNlc3Npb25QYXJhbXMgPSAKKyAgICAgICAgICAgICAgICAgIChXRElfQWRkQkFTZXNzaW9uUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgd2RpQWRkQkFTZXNzaW9uUnNwQ2IgPSAKKyAgICAgICAgICAgICAgICAgIChXRElfQWRkQkFTZXNzaW9uUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYW4gYXNzb2NpYXRpb24sIGlmIHNvIHF1ZXVlLCBpZgorICAgIG5vdCBpdCBtZWFucyBpdCBpcyBmcmVlIHRvIHByb2Nlc3MgcmVxdWVzdCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbmQgdGhlIEJTUyBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZSAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX1NUQVRhYmxlR2V0U3RhQlNTSURBZGRyKHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgIHB3ZGlBZGRCQVNlc3Npb25QYXJhbXMtPndkaUJBU2Vzc2lvbkluZm9UeXBlLnVjU1RBSWR4LCAKKyAgICAgICAgICAgICAgICAgICAmbWFjQlNTSUQpKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgIlRoaXMgc3RhdGlvbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgV0RJIFN0YXRpb24gVGFibGUgJWQiKTsKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisKKyAgdWNDdXJyZW50QlNTU2VzSWR4ID0gV0RJX0ZpbmRBc3NvY1Nlc3Npb24oIHBXRElDdHgsIG1hY0JTU0lELCAmcEJTU1Nlcyk7IAorCisgIGlmICggTlVMTCA9PSBwQlNTU2VzICkgCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBkb2VzIG5vdCB5ZXQgZXhpc3QiKTsKKworICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhpcyBCU1MgaXMgYmVpbmcgY3VycmVudGx5IHByb2Nlc3NlZCBvciBxdWV1ZWQsCisgICAgaWYgcXVldWVkIC0gcXVldWUgdGhlIG5ldyByZXF1ZXN0IGFzIHdlbGwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gcEJTU1Nlcy0+YkFzc29jUmVxUXVldWVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGV4aXN0cyBidXQgY3VycmVudGx5IHF1ZXVlZCIpOworCisgICAgd2RpU3RhdHVzID0gV0RJX1F1ZXVlQXNzb2NSZXF1ZXN0KCBwV0RJQ3R4LCBwQlNTU2VzLCBwRXZlbnREYXRhKTsgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICB9CisKKworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgV0RJX0FERF9CQV9TRVNTSU9OX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsQWRkQkFTZXNzaW9uUmVxLmFkZEJBU2Vzc2lvblBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgCisgICAgICAgICAgICAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKGhhbEFkZEJBU2Vzc2lvblJlcS5hZGRCQVNlc3Npb25QYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBBZGQgQkEgc2Vzc2lvbiByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlBZGRCQVNlc3Npb25QYXJhbXMsIHdkaUFkZEJBU2Vzc2lvblJzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIGhhbEFkZEJBU2Vzc2lvblJlcS5hZGRCQVNlc3Npb25QYXJhbXMuc3RhSWR4ID0KKyAgICAgICAgICAgICAgICAgIHB3ZGlBZGRCQVNlc3Npb25QYXJhbXMtPndkaUJBU2Vzc2lvbkluZm9UeXBlLnVjU1RBSWR4OworICB3cGFsTWVtb3J5Q29weShoYWxBZGRCQVNlc3Npb25SZXEuYWRkQkFTZXNzaW9uUGFyYW1zLnBlZXJNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgcHdkaUFkZEJBU2Vzc2lvblBhcmFtcy0+d2RpQkFTZXNzaW9uSW5mb1R5cGUubWFjUGVlckFkZHIsCisgICAgICAgICAgICAgICAgICBXRElfTUFDX0FERFJfTEVOKTsKKyAgaGFsQWRkQkFTZXNzaW9uUmVxLmFkZEJBU2Vzc2lvblBhcmFtcy5iYVRJRCA9CisgICAgICAgICAgICAgICAgICBwd2RpQWRkQkFTZXNzaW9uUGFyYW1zLT53ZGlCQVNlc3Npb25JbmZvVHlwZS51Y0JhVElEOworICBoYWxBZGRCQVNlc3Npb25SZXEuYWRkQkFTZXNzaW9uUGFyYW1zLmJhUG9saWN5ID0KKyAgICAgICAgICAgICAgICAgIHB3ZGlBZGRCQVNlc3Npb25QYXJhbXMtPndkaUJBU2Vzc2lvbkluZm9UeXBlLnVjQmFQb2xpY3k7CisgIGhhbEFkZEJBU2Vzc2lvblJlcS5hZGRCQVNlc3Npb25QYXJhbXMuYmFCdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICAgIHB3ZGlBZGRCQVNlc3Npb25QYXJhbXMtPndkaUJBU2Vzc2lvbkluZm9UeXBlLnVzQmFCdWZmZXJTaXplOworICBoYWxBZGRCQVNlc3Npb25SZXEuYWRkQkFTZXNzaW9uUGFyYW1zLmJhVGltZW91dCA9CisgICAgICAgICAgICAgICAgICBwd2RpQWRkQkFTZXNzaW9uUGFyYW1zLT53ZGlCQVNlc3Npb25JbmZvVHlwZS51c0JhVGltZW91dDsKKyAgaGFsQWRkQkFTZXNzaW9uUmVxLmFkZEJBU2Vzc2lvblBhcmFtcy5iYVNTTiA9CisgICAgICAgICAgICAgICAgICBwd2RpQWRkQkFTZXNzaW9uUGFyYW1zLT53ZGlCQVNlc3Npb25JbmZvVHlwZS51c0JhU1NOOworICBoYWxBZGRCQVNlc3Npb25SZXEuYWRkQkFTZXNzaW9uUGFyYW1zLmJhRGlyZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgIHB3ZGlBZGRCQVNlc3Npb25QYXJhbXMtPndkaUJBU2Vzc2lvbkluZm9UeXBlLnVjQmFEaXJlY3Rpb247CisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmaGFsQWRkQkFTZXNzaW9uUmVxLmFkZEJBU2Vzc2lvblBhcmFtcywgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsQWRkQkFTZXNzaW9uUmVxLmFkZEJBU2Vzc2lvblBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpQWRkQkFTZXNzaW9uUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaUFkZEJBU2Vzc2lvblBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFN0YXJ0IFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpQWRkQkFTZXNzaW9uUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICBXRElfQUREX0JBX1NFU1NJT05fUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NBZGRCQVNlc3Npb25SZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBEZWwgQkEgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0RlbEJBUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfRGVsQkFSZXFQYXJhbXNUeXBlKiAgICAgIHB3ZGlEZWxCQVBhcmFtczsKKyAgV0RJX0RlbEJBUnNwQ2IgICAgICAgICAgICAgICB3ZGlEZWxCQVJzcENiOworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgPSAwOyAKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgICAgICBwQlNTU2VzICAgICAgICAgICAgID0gTlVMTDsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIFdESV9TdGF0dXMgICAgICAgICAgICAgICAgICAgd2RpU3RhdHVzICAgICAgICAgICA9IFdESV9TVEFUVVNfU1VDQ0VTUzsgCisgIHdwdF9tYWNBZGRyICAgICAgICAgICAgICAgICAgbWFjQlNTSUQ7CisgIHREZWxCQVBhcmFtcyAgICAgICAgICAgICAgICAgaGFsRGVsQkFwYXJhbTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wQ0JmbmMgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBwd2RpRGVsQkFQYXJhbXMgPSAoV0RJX0RlbEJBUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgd2RpRGVsQkFSc3BDYiAgID0gKFdESV9EZWxCQVJzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9TVEFUYWJsZUdldFN0YUJTU0lEQWRkcihwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpRGVsQkFQYXJhbXMtPndkaUJBSW5mby51Y1NUQUlkeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hY0JTU0lEKSkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICJUaGlzIHN0YXRpb24gZG9lcyBub3QgZXhpc3QgaW4gdGhlIFdESSBTdGF0aW9uIFRhYmxlICVkIik7CisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB1Y0N1cnJlbnRCU1NTZXNJZHggPSBXRElfRmluZEFzc29jU2Vzc2lvbiggcFdESUN0eCwgbWFjQlNTSUQsICZwQlNTU2VzKTsgCisKKyAgaWYgKCBOVUxMID09IHBCU1NTZXMgKSAKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiB0aGlzIEJTUyBpcyBiZWluZyBjdXJyZW50bHkgcHJvY2Vzc2VkIG9yIHF1ZXVlZCwKKyAgICBpZiBxdWV1ZWQgLSBxdWV1ZSB0aGUgbmV3IHJlcXVlc3QgYXMgd2VsbCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfVFJVRSA9PSBwQlNTU2VzLT5iQXNzb2NSZXFRdWV1ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZXhpc3RzIGJ1dCBjdXJyZW50bHkgcXVldWVkIik7CisKKyAgICB3ZGlTdGF0dXMgPSBXRElfUXVldWVBc3NvY1JlcXVlc3QoIHBXRElDdHgsIHBCU1NTZXMsIHBFdmVudERhdGEpOyAKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIHdkaVN0YXR1czsgCisgIH0KKworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0RFTF9CQV9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbERlbEJBcGFyYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsRGVsQkFwYXJhbSkgKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGZvciBERUwgQkEgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpRGVsQkFQYXJhbXMsIHdkaURlbEJBUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgaGFsRGVsQkFwYXJhbS5zdGFJZHggPSBwd2RpRGVsQkFQYXJhbXMtPndkaUJBSW5mby51Y1NUQUlkeDsKKyAgaGFsRGVsQkFwYXJhbS5iYVRJRCA9IHB3ZGlEZWxCQVBhcmFtcy0+d2RpQkFJbmZvLnVjQmFUSUQ7CisgIGhhbERlbEJBcGFyYW0uYmFEaXJlY3Rpb24gPSBwd2RpRGVsQkFQYXJhbXMtPndkaUJBSW5mby51Y0JhRGlyZWN0aW9uOworCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgJmhhbERlbEJBcGFyYW0sIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbERlbEJBcGFyYW0pKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaURlbEJBUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaURlbEJBUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgU3RhcnQgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaURlbEJBUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX0RFTF9CQV9SRVNQKTsgCit9LypXRElfUHJvY2Vzc0RlbEJBUmVxKi8KKworI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NUU01TdGF0c1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1RTTVN0YXRzUmVxUGFyYW1zVHlwZSogIHB3ZGlUU01QYXJhbXM7CisgIFdESV9Uc21Sc3BDYiAgICAgICAgICAgICAgICB3ZGlUU01Sc3BDYjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgID0gMDsgCisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgICAgICBwQlNTU2VzICAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICAgPSAwOworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgICAgd2RpU3RhdHVzICAgICAgICAgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7IAorICB0VHNtU3RhdHNQYXJhbXMgICAgICAgICAgICAgaGFsVHNtU3RhdHNSZXFQYXJhbXMgPSB7MH07CisgIAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBwd2RpVFNNUGFyYW1zID0gKFdESV9UU01TdGF0c1JlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaVRTTVJzcENiICAgPSAoV0RJX1RzbVJzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgdWNDdXJyZW50QlNTU2VzSWR4ID0gV0RJX0ZpbmRBc3NvY1Nlc3Npb24oIHBXRElDdHgsIHB3ZGlUU01QYXJhbXMtPndkaVRzbVN0YXRzUGFyYW1zSW5mby5ic3NpZCwgJnBCU1NTZXMpOyAKKyAgaWYgKCBOVUxMID09IHBCU1NTZXMgKSAKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiB0aGlzIEJTUyBpcyBiZWluZyBjdXJyZW50bHkgcHJvY2Vzc2VkIG9yIHF1ZXVlZCwKKyAgICBpZiBxdWV1ZWQgLSBxdWV1ZSB0aGUgbmV3IHJlcXVlc3QgYXMgd2VsbCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfVFJVRSA9PSBwQlNTU2VzLT5iQXNzb2NSZXFRdWV1ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBleGlzdHMgYnV0IGN1cnJlbnRseSBxdWV1ZWQiKTsKKworICAgIHdkaVN0YXR1cyA9IFdESV9RdWV1ZUFzc29jUmVxdWVzdCggcFdESUN0eCwgcEJTU1NlcywgcEV2ZW50RGF0YSk7IAorICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gd2RpU3RhdHVzOyAKKyAgfQorCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICEgVE8gRE8gOiBwcm9wZXIgY29udmVyc2lvbiBpbnRvIHRoZSBIQUwgTWVzc2FnZSBSZXF1ZXN0IEZvcm1hdCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9UU01fU1RBVFNfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsVHNtU3RhdHNSZXFQYXJhbXMpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsVHNtU3RhdHNSZXFQYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBzZXQgYnNzIGtleSByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlUU01QYXJhbXMsIHdkaVRTTVJzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIGhhbFRzbVN0YXRzUmVxUGFyYW1zLnRzbVRJRCA9IHB3ZGlUU01QYXJhbXMtPndkaVRzbVN0YXRzUGFyYW1zSW5mby51Y1RpZDsKKyAgd3BhbE1lbW9yeUNvcHkoaGFsVHNtU3RhdHNSZXFQYXJhbXMuYnNzSWQsCisgICAgICAgICAgICAgICAgIHB3ZGlUU01QYXJhbXMtPndkaVRzbVN0YXRzUGFyYW1zSW5mby5ic3NpZCwKKyAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTik7CisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgJmhhbFRzbVN0YXRzUmVxUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxUc21TdGF0c1JlcVBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpVFNNUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVRTTVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFRTTSBTdGF0cyBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgd2RpVFNNUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgV0RJX1RTTV9TVEFUU19SRVNQKTsgCit9LypXRElfUHJvY2Vzc1RTTVN0YXRzUmVxKi8KKworI2VuZGlmCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRmx1c2ggQUMgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0ZsdXNoQWNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfRmx1c2hBY1JlcVBhcmFtc1R5cGUqICAgIHB3ZGlGbHVzaEFjUGFyYW1zID0gTlVMTDsKKyAgIFdESV9GbHVzaEFjUnNwQ2IgICAgICAgICAgICAgd2RpRmx1c2hBY1JzcENiOworICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wQ0JmbmMgKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgcHdkaUZsdXNoQWNQYXJhbXMgPSAoV0RJX0ZsdXNoQWNSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhOworICAgd2RpRmx1c2hBY1JzcENiICAgPSAoV0RJX0ZsdXNoQWNSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmM7CisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9GTFVTSF9BQ19SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwd2RpRmx1c2hBY1BhcmFtcy0+d2RpRmx1c2hBY0luZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihwd2RpRmx1c2hBY1BhcmFtcy0+d2RpRmx1c2hBY0luZm8pICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBzZXQgYnNzIGtleSByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpRmx1c2hBY1BhcmFtcywgd2RpRmx1c2hBY1JzcENiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAmcHdkaUZsdXNoQWNQYXJhbXMtPndkaUZsdXNoQWNJbmZvLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YocHdkaUZsdXNoQWNQYXJhbXMtPndkaUZsdXNoQWNJbmZvKSk7IAorCisgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpRmx1c2hBY1BhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpRmx1c2hBY1BhcmFtcy0+cFVzZXJEYXRhOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgU3RhcnQgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaUZsdXNoQWNSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfRkxVU0hfQUNfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NGbHVzaEFjUmVxKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQlQgQU1QIGV2ZW50IFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gCisgICAgICAgIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NCdEFtcEV2ZW50UmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX0J0QW1wRXZlbnRQYXJhbXNUeXBlKiAgICBwd2RpQnRBbXBFdmVudFBhcmFtcyA9IE5VTEw7CisgICBXRElfQnRBbXBFdmVudFJzcENiICAgICAgICAgIHdkaUJ0QW1wRXZlbnRSc3BDYjsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisKKyAgIHRCdEFtcEV2ZW50TXNnICAgICAgICAgICAgICAgaGFsdEJ0QW1wRXZlbnRNc2c7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cENCZm5jICkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIHB3ZGlCdEFtcEV2ZW50UGFyYW1zID0gKFdESV9CdEFtcEV2ZW50UGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgIHdkaUJ0QW1wRXZlbnRSc3BDYiAgID0gKFdESV9CdEFtcEV2ZW50UnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfQlRBTVBfRVZFTlRfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsdEJ0QW1wRXZlbnRNc2cuYnRBbXBFdmVudFBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKGhhbHRCdEFtcEV2ZW50TXNnLmJ0QW1wRXZlbnRQYXJhbXMpICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBCVCBBTVAgZXZlbnQgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaUJ0QW1wRXZlbnRQYXJhbXMsIHdkaUJ0QW1wRXZlbnRSc3BDYik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgaGFsdEJ0QW1wRXZlbnRNc2cuYnRBbXBFdmVudFBhcmFtcy5idEFtcEV2ZW50VHlwZSA9IAorICAgICAgcHdkaUJ0QW1wRXZlbnRQYXJhbXMtPndkaUJ0QW1wRXZlbnRJbmZvLnVjQnRBbXBFdmVudFR5cGU7CisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAmaGFsdEJ0QW1wRXZlbnRNc2cuYnRBbXBFdmVudFBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbHRCdEFtcEV2ZW50TXNnLmJ0QW1wRXZlbnRQYXJhbXMpKTsgCisKKyAgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlCdEFtcEV2ZW50UGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlCdEFtcEV2ZW50UGFyYW1zLT5wVXNlckRhdGE7IAorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2VuZCBTdGFydCBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpQnRBbXBFdmVudFJzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9CVEFNUF9FVkVOVF9SRVNQKTsgCit9LypXRElfUHJvY2Vzc0J0QW1wRXZlbnRSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBBZGQgU1RBIHNlbGYgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00KKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQWRkU1RBU2VsZlJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0FkZFNUQVNlbGZSZXFQYXJhbXNUeXBlKiAgICAgICAgICBwd2RpQWRkU1RBU2VsZlJlcVBhcmFtczsKKyAgV0RJX0FkZFNUQVNlbGZQYXJhbXNSc3BDYiAgICAgICAgICAgICB3ZGlBZGRTVEFTZWxmUmVxUnNwQ2I7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICB0QWRkU3RhU2VsZlBhcmFtcyAgICAgICAgICAgICAgICAgICAgIGhhbEFkZFNUQVNlbGZQYXJhbXM7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYykpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgcHdkaUFkZFNUQVNlbGZSZXFQYXJhbXMgPSAKKyAgICAoV0RJX0FkZFNUQVNlbGZSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhOworICB3ZGlBZGRTVEFTZWxmUmVxUnNwQ2IgPSAKKyAgICAoV0RJX0FkZFNUQVNlbGZQYXJhbXNSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmM7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgV0RJX0FERF9TVEFfU0VMRl9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRBZGRTdGFTZWxmUGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHRBZGRTdGFTZWxmUGFyYW1zKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gQUREIFNUQSBTRUxGIFJFUSAleCAleCAleCIsCisgICAgIHBFdmVudERhdGEsIHB3ZGlBZGRTVEFTZWxmUmVxUGFyYW1zLCB3ZGlBZGRTVEFTZWxmUmVxUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyogQ2FjaGUgdGhlIHJlcXVlc3QgZm9yIHJlc3BvbnNlIHByb2Nlc3NpbmcgKi8KKyAgd3BhbE1lbW9yeUNvcHkoJnBXRElDdHgtPndkaUNhY2hlQWRkU1RBU2VsZlJlcSwgcHdkaUFkZFNUQVNlbGZSZXFQYXJhbXMsIAorICAgICAgICAgICAgICAgICBzaXplb2YocFdESUN0eC0+d2RpQ2FjaGVBZGRTVEFTZWxmUmVxKSk7CisKKyAgd3BhbE1lbW9yeUNvcHkoaGFsQWRkU1RBU2VsZlBhcmFtcy5zZWxmTWFjQWRkciwgCisgICAgICAgICAgICAgICAgICAgcHdkaUFkZFNUQVNlbGZSZXFQYXJhbXMtPndkaUFkZFNUQVNlbGZJbmZvLnNlbGZNYWNBZGRyLCA2KSA7CisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgJmhhbEFkZFNUQVNlbGZQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodEFkZFN0YVNlbGZQYXJhbXMpKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaUFkZFNUQVNlbGZSZXFQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpQWRkU1RBU2VsZlJlcVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFVwZGF0ZSBQcm9iZSBSZXNwIFRlbXBsYXRlIFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlBZGRTVEFTZWxmUmVxUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgIFdESV9BRERfU1RBX1NFTEZfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NBZGRTVEFTZWxmUmVxKi8KKworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIERlbCBTdGEgU2VsZiBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIAorICAgICAgICBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRGVsU1RBU2VsZlJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0RlbFNUQVNlbGZSZXFQYXJhbXNUeXBlKiAgICAgIHB3ZGlEZWxTdGFTZWxmUmVxUGFyYW1zOworICBXRElfRGVsU1RBU2VsZlJzcENiICAgICAgICAgICAgICAgd2RpRGVsU3RhU2VsZlJzcENiOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgdERlbFN0YVNlbGZQYXJhbXMgICAgICAgICAgICBoYWxTZXREZWxTZWxmU1RBUGFyYW1zOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHB3ZGlEZWxTdGFTZWxmUmVxUGFyYW1zID0gCisgICAgICAgICAgICAgICAgIChXRElfRGVsU1RBU2VsZlJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaURlbFN0YVNlbGZSc3BDYiAgICAgID0gKFdESV9EZWxTVEFTZWxmUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0RFTF9TVEFfU0VMRl9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwd2RpRGVsU3RhU2VsZlJlcVBhcmFtcy0+d2RpRGVsU3RhU2VsZkluZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgKCB1c1NlbmRTaXplIDwgCisgICAgICAgICAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHB3ZGlEZWxTdGFTZWxmUmVxUGFyYW1zLT53ZGlEZWxTdGFTZWxmSW5mbykgKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIERlbCBTdGEgU2VsZiByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpRGVsU3RhU2VsZlJlcVBhcmFtcywgd2RpRGVsU3RhU2VsZlJzcENiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd3BhbE1lbW9yeUNvcHkoaGFsU2V0RGVsU2VsZlNUQVBhcmFtcy5zZWxmTWFjQWRkciwgCisgICAgICAgICAgICAgICAgICAgcHdkaURlbFN0YVNlbGZSZXFQYXJhbXMtPndkaURlbFN0YVNlbGZJbmZvLnNlbGZNYWNBZGRyLCA2KSA7CisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgJmhhbFNldERlbFNlbGZTVEFQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodERlbFN0YVNlbGZQYXJhbXMpKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaURlbFN0YVNlbGZSZXFQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpRGVsU3RhU2VsZlJlcVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2VuZCBTdGFydCBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICB3ZGlEZWxTdGFTZWxmUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9ERUxfU1RBX1NFTEZfUkVTUCk7CisKK30KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBIb3N0IFJlc3VtZSBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIAorICAgICAgICBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzSG9zdFJlc3VtZVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1Jlc3VtZVBhcmFtc1R5cGUqICAgICAgICAgIHB3ZGlIb3N0UmVzdW1lUGFyYW1zID0gTlVMTDsKKyAgV0RJX0hvc3RSZXN1bWVFdmVudFJzcENiICAgICAgIHdkaUhvc3RSZXN1bWVSc3BDYjsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIHRIYWxXbGFuSG9zdFJlc3VtZVJlcVBhcmFtICAgICBoYWxSZXN1bWVSZXFQYXJhbXM7CisKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cENCZm5jICkpCisgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMgIixfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAgcHdkaUhvc3RSZXN1bWVQYXJhbXMgPSAoV0RJX1Jlc3VtZVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgICB3ZGlIb3N0UmVzdW1lUnNwQ2IgICA9IChXRElfSG9zdFJlc3VtZUV2ZW50UnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgV0RJX0hPU1RfUkVTVU1FX1JFUSwgc2l6ZW9mKGhhbFJlc3VtZVJlcVBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICAodXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsUmVzdW1lUmVxUGFyYW1zKSkpKQorICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIFN0YXJ0IEluIE5hdiBNZWFzIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlIb3N0UmVzdW1lUGFyYW1zLCB3ZGlIb3N0UmVzdW1lUnNwQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBoYWxSZXN1bWVSZXFQYXJhbXMuY29uZmlndXJlZE1jc3RCY3N0RmlsdGVyU2V0dGluZyA9IAorICAgICBwd2RpSG9zdFJlc3VtZVBhcmFtcy0+d2RpUmVzdW1lUGFyYW1zLnVjQ29uZmlndXJlZE1jc3RCY3N0RmlsdGVyU2V0dGluZzsKKyAgICAgICAKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmaGFsUmVzdW1lUmVxUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxSZXN1bWVSZXFQYXJhbXMpKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaUhvc3RSZXN1bWVQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpSG9zdFJlc3VtZVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFN0YXJ0IFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpSG9zdFJlc3VtZVJzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfSE9TVF9SRVNVTUVfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NIb3N0UmVzdW1lUmVxKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3Mgc2V0IFR4IFBlciBUcmFja2luZyBQYXJhbWV0ZXJzIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRUeFBlclRyYWNraW5nUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1NldFR4UGVyVHJhY2tpbmdSZXFQYXJhbXNUeXBlKiBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcyA9IE5VTEw7CisgICBXRElfU2V0VHhQZXJUcmFja2luZ1JzcENiICAgICAgICAgIHB3ZGlTZXRUeFBlclRyYWNraW5nUnNwQ2IgPSBOVUxMOworICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgIHRIYWxUeFBlclRyYWNraW5nUmVxUGFyYW0gICAgIGhhbFR4UGVyVHJhY2tpbmdSZXFQYXJhbTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wQ0JmbmMgKSkKKyAgIHsKKyAgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyAiLF9fRlVOQ1RJT05fXyk7CisgICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcyA9IChXRElfU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgICBwd2RpU2V0VHhQZXJUcmFja2luZ1JzcENiICAgPSAoV0RJX1NldFR4UGVyVHJhY2tpbmdSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmM7CisgICAKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAgICEgVE8gRE8gOiBwcm9wZXIgY29udmVyc2lvbiBpbnRvIHRoZSBIQUwgTWVzc2FnZSBSZXF1ZXN0IEZvcm1hdCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX1NFVF9UWF9QRVJfVFJBQ0tJTkdfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsVHhQZXJUcmFja2luZ1JlcVBhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsVHhQZXJUcmFja2luZ1JlcVBhcmFtKSApKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc2V0IHR4IHBlciB0cmFja2luZyByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVNldFR4UGVyVHJhY2tpbmdSZXFQYXJhbXMsIHB3ZGlTZXRUeFBlclRyYWNraW5nUnNwQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisgICAKKyAgIGhhbFR4UGVyVHJhY2tpbmdSZXFQYXJhbS51Y1R4UGVyVHJhY2tpbmdFbmFibGUgPSBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcy0+d2RpVHhQZXJUcmFja2luZ1BhcmFtLnVjVHhQZXJUcmFja2luZ0VuYWJsZTsKKyAgIGhhbFR4UGVyVHJhY2tpbmdSZXFQYXJhbS51Y1R4UGVyVHJhY2tpbmdQZXJpb2QgPSBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcy0+d2RpVHhQZXJUcmFja2luZ1BhcmFtLnVjVHhQZXJUcmFja2luZ1BlcmlvZDsKKyAgIGhhbFR4UGVyVHJhY2tpbmdSZXFQYXJhbS51Y1R4UGVyVHJhY2tpbmdSYXRpbyA9IHB3ZGlTZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zLT53ZGlUeFBlclRyYWNraW5nUGFyYW0udWNUeFBlclRyYWNraW5nUmF0aW87CisgICBoYWxUeFBlclRyYWNraW5nUmVxUGFyYW0udVR4UGVyVHJhY2tpbmdXYXRlcm1hcmsgPSBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcy0+d2RpVHhQZXJUcmFja2luZ1BhcmFtLnVUeFBlclRyYWNraW5nV2F0ZXJtYXJrOworICAgICAgCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAmaGFsVHhQZXJUcmFja2luZ1JlcVBhcmFtLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsVHhQZXJUcmFja2luZ1JlcVBhcmFtKSk7IAorCisgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVNldFR4UGVyVHJhY2tpbmdSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfU0VUX1RYX1BFUl9UUkFDS0lOR19SRVNQKTsgCit9LypXRElfUHJvY2Vzc1NldFR4UGVyVHJhY2tpbmdSZXEqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTdXNwZW5kIEluZGljYXRpb25zIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NIb3N0U3VzcGVuZEluZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N1c3BlbmRQYXJhbXNUeXBlICAgICAgICAgICpwU3VzcGVuZEluZFBhcmFtczsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIFdESV9TdGF0dXMgICAgICAgICAgICAgICAgICAgICB3ZGlTdGF0dXM7CisgIHRIYWxXbGFuSG9zdFN1c3BlbmRJbmRQYXJhbSAgICBoYWxXbGFuU3VzcGVuZEluZHBhcmFtczsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApKQorICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIGluIFN1c3BlbmQgaW5kIixfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBwU3VzcGVuZEluZFBhcmFtcyA9IChXRElfU3VzcGVuZFBhcmFtc1R5cGUgKilwRXZlbnREYXRhLT5wRXZlbnREYXRhOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9IT1NUX1NVU1BFTkRfSU5ELCAKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxXbGFuU3VzcGVuZEluZHBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICAodXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsV2xhblN1c3BlbmRJbmRwYXJhbXMpKSkpCisgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gU3VzcGVuZCBJbmQgIik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIGhhbFdsYW5TdXNwZW5kSW5kcGFyYW1zLmNvbmZpZ3VyZWRNY3N0QmNzdEZpbHRlclNldHRpbmcgPQorICAgICAgIHBTdXNwZW5kSW5kUGFyYW1zLT53ZGlTdXNwZW5kUGFyYW1zLnVjQ29uZmlndXJlZE1jc3RCY3N0RmlsdGVyU2V0dGluZzsKKworICBoYWxXbGFuU3VzcGVuZEluZHBhcmFtcy5hY3RpdmVTZXNzaW9uQ291bnQgPSAKKyAgICAgICBXRElfR2V0QWN0aXZlU2Vzc2lvbnNDb3VudChwV0RJQ3R4KTsKKworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAmaGFsV2xhblN1c3BlbmRJbmRwYXJhbXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodEhhbFdsYW5Ib3N0U3VzcGVuZEluZFBhcmFtKSk7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgU3VzcGVuZCBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHBTdXNwZW5kSW5kUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcFN1c3BlbmRJbmRQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgd2RpU3RhdHVzID0gV0RJX1NlbmRJbmRpY2F0aW9uKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSk7IAorICByZXR1cm4gICggd2RpU3RhdHVzICE9IFdESV9TVEFUVVNfU1VDQ0VTUyApP3dkaVN0YXR1czpXRElfU1RBVFVTX1NVQ0NFU1NfU1lOQzsKK30vKldESV9Qcm9jZXNzSG9zdFN1c3BlbmRJbmQqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICBNSVNDIENPTlRST0wgUFJPQ0VTU0lORyBSRVFVRVNUIEFQSSAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qKgorIEBicmllZiBQcm9jZXNzIENoYW5uZWwgU3dpdGNoIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIAorICAgICAgICBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NDaGFubmVsU3dpdGNoUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3dpdGNoQ2hSZXFQYXJhbXNUeXBlKiAgIHB3ZGlTd2l0Y2hDaFBhcmFtczsKKyAgV0RJX1N3aXRjaENoUnNwQ2IgICAgICAgICAgICB3ZGlTd2l0Y2hDaFJzcENiOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgdFN3aXRjaENoYW5uZWxSZXFNc2cgICAgICAgICBoYWxTd2l0Y2hDaGFubmVsUmVxID0ge3swfX07CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cENCZm5jICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgcHdkaVN3aXRjaENoUGFyYW1zID0gKFdESV9Td2l0Y2hDaFJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaVN3aXRjaENoUnNwQ2IgICA9IChXRElfU3dpdGNoQ2hSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmM7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfQ0hfU1dJVENIX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU3dpdGNoQ2hhbm5lbFJlcS5zd2l0Y2hDaGFubmVsUGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKGhhbFN3aXRjaENoYW5uZWxSZXEuc3dpdGNoQ2hhbm5lbFBhcmFtcykgKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIGNoYW5uZWwgc3dpdGNoIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVN3aXRjaENoUGFyYW1zLCB3ZGlTd2l0Y2hDaFJzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIGhhbFN3aXRjaENoYW5uZWxSZXEuc3dpdGNoQ2hhbm5lbFBhcmFtcy5jaGFubmVsTnVtYmVyID0gCisgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlTd2l0Y2hDaFBhcmFtcy0+d2RpQ2hJbmZvLnVjQ2hhbm5lbDsKKyNpZm5kZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSSAgICAKKyAgaGFsU3dpdGNoQ2hhbm5lbFJlcS5zd2l0Y2hDaGFubmVsUGFyYW1zLmxvY2FsUG93ZXJDb25zdHJhaW50ID0gCisgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlTd2l0Y2hDaFBhcmFtcy0+d2RpQ2hJbmZvLnVjTG9jYWxQb3dlckNvbnN0cmFpbnQ7CisjZW5kaWYKKyAgaGFsU3dpdGNoQ2hhbm5lbFJlcS5zd2l0Y2hDaGFubmVsUGFyYW1zLnNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgcHdkaVN3aXRjaENoUGFyYW1zLT53ZGlDaEluZm8ud2RpU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsKKworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRkkKKyAgaGFsU3dpdGNoQ2hhbm5lbFJlcS5zd2l0Y2hDaGFubmVsUGFyYW1zLm1heFR4UG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHB3ZGlTd2l0Y2hDaFBhcmFtcy0+d2RpQ2hJbmZvLmNNYXhUeFBvd2VyOyAKKyAgd3BhbE1lbW9yeUNvcHkoaGFsU3dpdGNoQ2hhbm5lbFJlcS5zd2l0Y2hDaGFubmVsUGFyYW1zLnNlbGZTdGFNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgcHdkaVN3aXRjaENoUGFyYW1zLT53ZGlDaEluZm8ubWFjU2VsZlN0YU1hY0FkZHIsCisgICAgICAgICAgICAgICAgICBXRElfTUFDX0FERFJfTEVOKTsKKyAgd3BhbE1lbW9yeUNvcHkoaGFsU3dpdGNoQ2hhbm5lbFJlcS5zd2l0Y2hDaGFubmVsUGFyYW1zLmJzc0lkLAorICAgICAgICAgICAgICAgICAgcHdkaVN3aXRjaENoUGFyYW1zLT53ZGlDaEluZm8ubWFjQlNTSWQsCisgICAgICAgICAgICAgICAgICBXRElfTUFDX0FERFJfTEVOKTsKKyNlbmRpZgorICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxTd2l0Y2hDaGFubmVsUmVxLnN3aXRjaENoYW5uZWxQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFN3aXRjaENoYW5uZWxSZXEuc3dpdGNoQ2hhbm5lbFBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpU3dpdGNoQ2hQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpU3dpdGNoQ2hQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2VuZCBTd2l0Y2ggQ2hhbm5lbCBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgd2RpU3dpdGNoQ2hSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfQ0hfU1dJVENIX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzQ2hhbm5lbFN3aXRjaFJlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIENvbmZpZyBTVEEgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0NvbmZpZ1N0YVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0NvbmZpZ1NUQVJlcVBhcmFtc1R5cGUqICBwd2RpQ29uZmlnU1RBUGFyYW1zOworICBXRElfQ29uZmlnU1RBUnNwQ2IgICAgICAgICAgIHdkaUNvbmZpZ1NUQVJzcENiOworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgPSAwOyAKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgICAgICBwQlNTU2VzICAgICAgICAgICAgID0gTlVMTDsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIFdESV9TdGF0dXMgICAgICAgICAgICAgICAgICAgd2RpU3RhdHVzICAgICAgICAgICA9IFdESV9TVEFUVVNfU1VDQ0VTUzsgCisKKyAgdENvbmZpZ1N0YVJlcU1zZyAgICAgICAgICAgICBoYWxDb25maWdTdGFSZXFNc2c7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHB3ZGlDb25maWdTVEFQYXJhbXMgPSAoV0RJX0NvbmZpZ1NUQVJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaUNvbmZpZ1NUQVJzcENiICAgPSAoV0RJX0NvbmZpZ1NUQVJzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uKCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlDb25maWdTVEFQYXJhbXMtPndkaVJlcUluZm8ubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJTU1Nlcyk7IAorCisgIGlmICggTlVMTCA9PSBwQlNTU2VzICkgCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBkb2VzIG5vdCB5ZXQgZXhpc3QiKTsKKworICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhpcyBCU1MgaXMgYmVpbmcgY3VycmVudGx5IHByb2Nlc3NlZCBvciBxdWV1ZWQsCisgICAgaWYgcXVldWVkIC0gcXVldWUgdGhlIG5ldyByZXF1ZXN0IGFzIHdlbGwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gcEJTU1Nlcy0+YkFzc29jUmVxUXVldWVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGV4aXN0cyBidXQgY3VycmVudGx5IHF1ZXVlZCIpOworCisgICAgd2RpU3RhdHVzID0gV0RJX1F1ZXVlQXNzb2NSZXF1ZXN0KCBwV0RJQ3R4LCBwQlNTU2VzLCBwRXZlbnREYXRhKTsgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICB9CisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfQ09ORklHX1NUQV9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbENvbmZpZ1N0YVJlcU1zZy5jb25maWdTdGFQYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsQ29uZmlnU3RhUmVxTXNnLmNvbmZpZ1N0YVBhcmFtcykgKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIGNvbmZpZyBzdGEgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpQ29uZmlnU1RBUGFyYW1zLCB3ZGlDb25maWdTVEFSc3BDYik7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKkNvcHkgdGhlIHN0YXRpb24gY29udGV4dCovCisgIFdESV9Db3B5V0RJU3RhQ3R4VG9IQUxTdGFDdHgoICZoYWxDb25maWdTdGFSZXFNc2cuY29uZmlnU3RhUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHdkaUNvbmZpZ1NUQVBhcmFtcy0+d2RpUmVxSW5mbyk7CisKKyAgaWYocHdkaUNvbmZpZ1NUQVBhcmFtcy0+d2RpUmVxSW5mby53ZGlTVEFUeXBlID09IFdESV9TVEFfRU5UUllfU0VMRikKKyAgeworICAgIC8qIE5lZWQgdG8gZmlsbCBpbiB0aGUgc2VsZiBTVEEgSW5kZXggKi8KKyAgICBpZiAoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSAKKyAgICAgICAgIFdESV9TVEFUYWJsZUZpbmRTdGFpZEJ5QWRkcihwV0RJQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlDb25maWdTVEFQYXJhbXMtPndkaVJlcUluZm8ubWFjU1RBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3cHRfdWludDgqKSZoYWxDb25maWdTdGFSZXFNc2cuY29uZmlnU3RhUGFyYW1zLnN0YUlkeCApKQorICAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgIlRoaXMgc3RhdGlvbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgV0RJIFN0YXRpb24gVGFibGUgJWQiKTsKKyAgICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAvKiBOZWVkIHRvIGZpbGwgaW4gdGhlIFNUQSBJbmRleCB0byBpbnZhbGlkLCBzaW5jZSBhdCB0aGlzIHBvaW50IHdlIGhhdmUgbm90CisgICAgIHlldCByZWNlaXZlZCBpdCBmcm9tIEhBTCAqLworICAgIGhhbENvbmZpZ1N0YVJlcU1zZy5jb25maWdTdGFQYXJhbXMuc3RhSWR4ID0gV0RJX1NUQV9JTlZBTElEX0lEWDsKKyAgfQorCisgIC8qIE5lZWQgdG8gZmlsbCBpbiB0aGUgQlNTIGluZGV4ICovCisgIGhhbENvbmZpZ1N0YVJlcU1zZy5jb25maWdTdGFQYXJhbXMuYnNzSWR4ID0gcEJTU1Nlcy0+dWNCU1NJZHg7CisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmaGFsQ29uZmlnU3RhUmVxTXNnLmNvbmZpZ1N0YVBhcmFtcywgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsQ29uZmlnU3RhUmVxTXNnLmNvbmZpZ1N0YVBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpQ29uZmlnU1RBUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaUNvbmZpZ1NUQVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICB3cGFsTWVtb3J5Q29weSggJnBXRElDdHgtPndkaUNhY2hlZENvbmZpZ1N0YVJlcSwgCisgICAgICAgICAgICAgICAgICBwd2RpQ29uZmlnU1RBUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihwV0RJQ3R4LT53ZGlDYWNoZWRDb25maWdTdGFSZXEpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIENvbmZpZyBTVEEgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaUNvbmZpZ1NUQVJzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9DT05GSUdfU1RBX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzQ29uZmlnU3RhUmVxKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgTGluayBTdGF0ZSBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiAKKyAgICAgICAgTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0TGlua1N0YXRlUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU2V0TGlua1JlcVBhcmFtc1R5cGUqICAgIHB3ZGlTZXRMaW5rUGFyYW1zOworICBXRElfU2V0TGlua1N0YXRlUnNwQ2IgICAgICAgIHdkaVNldExpbmtSc3BDYjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgICB1Y0N1cnJlbnRCU1NTZXNJZHggID0gMDsgCisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgICAgICAgcEJTU1NlcyAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgICAgIHdkaVN0YXR1cyAgICAgICAgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7CisgIHRMaW5rU3RhdGVQYXJhbXMgICAgICAgICAgICAgaGFsTGlua1N0YXRlUmVxTXNnOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wQ0JmbmMgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBwd2RpU2V0TGlua1BhcmFtcyA9IChXRElfU2V0TGlua1JlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaVNldExpbmtSc3BDYiAgID0gKFdESV9TZXRMaW5rU3RhdGVSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmM7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBhc3NvY2lhdGlvbiwgaWYgc28gcXVldWUsIGlmCisgICAgbm90IGl0IG1lYW5zIGl0IGlzIGZyZWUgdG8gcHJvY2VzcyByZXF1ZXN0IAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmluZCB0aGUgQlNTIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB1Y0N1cnJlbnRCU1NTZXNJZHggPSBXRElfRmluZEFzc29jU2Vzc2lvbiggcFdESUN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpU2V0TGlua1BhcmFtcy0+d2RpTGlua0luZm8ubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJTU1Nlcyk7IAorCisgIGlmICggTlVMTCA9PSBwQlNTU2VzICkgCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiU2V0IGxpbmsgcmVxdWVzdCByZWNlaXZlZCBvdXRzaWRlIGFzc29jaWF0aW9uIHNlc3Npb24iKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgQ2hlY2sgaWYgdGhpcyBCU1MgaXMgYmVpbmcgY3VycmVudGx5IHByb2Nlc3NlZCBvciBxdWV1ZWQsCisgICAgICBpZiBxdWV1ZWQgLSBxdWV1ZSB0aGUgbmV3IHJlcXVlc3QgYXMgd2VsbCAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gcEJTU1Nlcy0+YkFzc29jUmVxUXVldWVkICkKKyAgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGV4aXN0cyBidXQgY3VycmVudGx5IHF1ZXVlZCIpOworICAKKyAgICAgIHdkaVN0YXR1cyA9IFdESV9RdWV1ZUFzc29jUmVxdWVzdCggcFdESUN0eCwgcEJTU1NlcywgcEV2ZW50RGF0YSk7IAorICAgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgICAgcmV0dXJuIHdkaVN0YXR1czsgCisgICAgfQorICB9CisgIC8qIElmIHRoZSBsaW5rIGlzIHNldCB0byBlbnRlciBJRExFIC0gdGhlIFNlc3Npb24gYWxsb2NhdGVkIGZvciB0aGlzIEJTUworICAgICB3aWxsIGJlIGRlbGV0ZWQgb24gdGhlIFNldCBMaW5rIFN0YXRlIHJlc3BvbnNlIGNvbWluZyBmcm9tIEhBTAorICAgLSBjYWNoZSB0aGUgcmVxdWVzdCBmb3IgcmVzcG9uc2UgcHJvY2Vzc2luZyAqLworICB3cGFsTWVtb3J5Q29weSgmcFdESUN0eC0+d2RpQ2FjaGVTZXRMaW5rU3RSZXEsIHB3ZGlTZXRMaW5rUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHBXRElDdHgtPndkaUNhY2hlU2V0TGlua1N0UmVxKSk7CisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIAorICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9TRVRfTElOS19TVF9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbExpbmtTdGF0ZVJlcU1zZyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxMaW5rU3RhdGVSZXFNc2cpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBzZXQgYnNzIGtleSByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlTZXRMaW5rUGFyYW1zLCB3ZGlTZXRMaW5rUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd3BhbE1lbW9yeUNvcHkoaGFsTGlua1N0YXRlUmVxTXNnLmJzc2lkLAorICAgICAgICAgICAgICAgICBwd2RpU2V0TGlua1BhcmFtcy0+d2RpTGlua0luZm8ubWFjQlNTSUQsIFdESV9NQUNfQUREUl9MRU4pOworCisgIHdwYWxNZW1vcnlDb3B5KGhhbExpbmtTdGF0ZVJlcU1zZy5zZWxmTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgcHdkaVNldExpbmtQYXJhbXMtPndkaUxpbmtJbmZvLm1hY1NlbGZTdGFNYWNBZGRyLCBXRElfTUFDX0FERFJfTEVOKTsKKworICBoYWxMaW5rU3RhdGVSZXFNc2cuc3RhdGUgPSAKKyAgICAgV0RJXzJfSEFMX0xJTktfU1RBVEUocHdkaVNldExpbmtQYXJhbXMtPndkaUxpbmtJbmZvLndkaUxpbmtTdGF0ZSk7CisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmaGFsTGlua1N0YXRlUmVxTXNnLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxMaW5rU3RhdGVSZXFNc2cpKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVNldExpbmtQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpU2V0TGlua1BhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFNldCBMaW5rIFN0YXRlIFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlTZXRMaW5rUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX1NFVF9MSU5LX1NUX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzU2V0TGlua1N0YXRlUmVxKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBHZXQgU3RhdHMgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00KKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzR2V0U3RhdHNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9HZXRTdGF0c1JlcVBhcmFtc1R5cGUqICAgcHdkaUdldFN0YXRzUGFyYW1zOworICBXRElfR2V0U3RhdHNSc3BDYiAgICAgICAgICAgIHdkaUdldFN0YXRzUnNwQ2I7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgPSAwOyAKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgICAgICBwQlNTU2VzICAgICAgICAgICAgID0gTlVMTDsKKyAgd3B0X21hY0FkZHIgICAgICAgICAgICAgICAgICBtYWNCU1NJRDsKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgICAgICAgICB3ZGlTdGF0dXMgICAgICAgICAgID0gV0RJX1NUQVRVU19TVUNDRVNTOyAKKyAgdEhhbFN0YXRzUmVxTXNnICAgICAgICAgICAgICBoYWxTdGF0c1JlcU1zZzsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApICkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBwd2RpR2V0U3RhdHNQYXJhbXMgPSAoV0RJX0dldFN0YXRzUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgd2RpR2V0U3RhdHNSc3BDYiAgID0gKFdESV9HZXRTdGF0c1JzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYW4gYXNzb2NpYXRpb24sIGlmIHNvIHF1ZXVlLCBpZgorICAgIG5vdCBpdCBtZWFucyBpdCBpcyBmcmVlIHRvIHByb2Nlc3MgcmVxdWVzdCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbmQgdGhlIEJTUyBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZSAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX1NUQVRhYmxlR2V0U3RhQlNTSURBZGRyKHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgcHdkaUdldFN0YXRzUGFyYW1zLT53ZGlHZXRTdGF0c1BhcmFtc0luZm8udWNTVEFJZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgJm1hY0JTU0lEKSkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICJUaGlzIHN0YXRpb24gZG9lcyBub3QgZXhpc3QgaW4gdGhlIFdESSBTdGF0aW9uIFRhYmxlICVkIik7CisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB1Y0N1cnJlbnRCU1NTZXNJZHggPSBXRElfRmluZEFzc29jU2Vzc2lvbiggcFdESUN0eCwgbWFjQlNTSUQsICZwQlNTU2VzKTsgCisgIGlmICggTlVMTCA9PSBwQlNTU2VzICkgCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBkb2VzIG5vdCB5ZXQgZXhpc3QiKTsKKworICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhpcyBCU1MgaXMgYmVpbmcgY3VycmVudGx5IHByb2Nlc3NlZCBvciBxdWV1ZWQsCisgICAgaWYgcXVldWVkIC0gcXVldWUgdGhlIG5ldyByZXF1ZXN0IGFzIHdlbGwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gcEJTU1Nlcy0+YkFzc29jUmVxUXVldWVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGV4aXN0cyBidXQgY3VycmVudGx5IHF1ZXVlZCIpOworCisgICAgd2RpU3RhdHVzID0gV0RJX1F1ZXVlQXNzb2NSZXF1ZXN0KCBwV0RJQ3R4LCBwQlNTU2VzLCBwRXZlbnREYXRhKTsgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICB9CisKKworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0dFVF9TVEFUU19SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFN0YXRzUmVxTXNnLnN0YXRzUmVxUGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKGhhbFN0YXRzUmVxTXNnLnN0YXRzUmVxUGFyYW1zKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc2V0IGJzcyBrZXkgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpR2V0U3RhdHNQYXJhbXMsIHdkaUdldFN0YXRzUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgaGFsU3RhdHNSZXFNc2cuc3RhdHNSZXFQYXJhbXMuc3RhSWQgPSAKKyAgICAgICAgICAgICAgICAgIHB3ZGlHZXRTdGF0c1BhcmFtcy0+d2RpR2V0U3RhdHNQYXJhbXNJbmZvLnVjU1RBSWR4OworICBoYWxTdGF0c1JlcU1zZy5zdGF0c1JlcVBhcmFtcy5zdGF0c01hc2sgPSAKKyAgICAgICAgICAgICAgICAgIHB3ZGlHZXRTdGF0c1BhcmFtcy0+d2RpR2V0U3RhdHNQYXJhbXNJbmZvLnVTdGF0c01hc2s7CisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgJmhhbFN0YXRzUmVxTXNnLnN0YXRzUmVxUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTdGF0c1JlcU1zZy5zdGF0c1JlcVBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpR2V0U3RhdHNQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpR2V0U3RhdHNQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2VuZCBHZXQgU1RBIFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlHZXRTdGF0c1JzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9HRVRfU1RBVFNfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NHZXRTdGF0c1JlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFVwZGF0ZSBDZmcgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiAKKyAgICAgICAgRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1VwZGF0ZUNmZ1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1VwZGF0ZUNmZ1JlcVBhcmFtc1R5cGUqICBwd2RpVXBkYXRlQ2ZnUGFyYW1zID0gTlVMTDsKKyAgV0RJX1VwZGF0ZUNmZ1JzcENiICAgICAgICAgICB3ZGlVcGRhdGVDZmdSc3BDYiA9IE5VTEw7CisKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYykpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgcHdkaVVwZGF0ZUNmZ1BhcmFtcyA9IChXRElfVXBkYXRlQ2ZnUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgd2RpVXBkYXRlQ2ZnUnNwQ2IgICA9IChXRElfVXBkYXRlQ2ZnUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9VUERBVEVfQ0ZHX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICBwd2RpVXBkYXRlQ2ZnUGFyYW1zLT51Q29uZmlnQnVmZmVyTGVuICsgc2l6ZW9mKHdwdF91aW50MzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyAgcHdkaVVwZGF0ZUNmZ1BhcmFtcy0+dUNvbmZpZ0J1ZmZlckxlbikpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBzZXQgYnNzIGtleSByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlVcGRhdGVDZmdQYXJhbXMsIHdkaVVwZGF0ZUNmZ1JzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgJnB3ZGlVcGRhdGVDZmdQYXJhbXMtPnVDb25maWdCdWZmZXJMZW4sIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHdwdF91aW50MzIpKTsgCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQrc2l6ZW9mKHdwdF91aW50MzIpLCAKKyAgICAgICAgICAgICAgICAgIHB3ZGlVcGRhdGVDZmdQYXJhbXMtPnBDb25maWdCdWZmZXIsIAorICAgICAgICAgICAgICAgICAgcHdkaVVwZGF0ZUNmZ1BhcmFtcy0+dUNvbmZpZ0J1ZmZlckxlbik7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlVcGRhdGVDZmdQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpVXBkYXRlQ2ZnUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgVXBkYXRlIENmZyBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlVcGRhdGVDZmdSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfVVBEQVRFX0NGR19SRVNQKTsgCisKK30vKldESV9Qcm9jZXNzVXBkYXRlQ2ZnUmVxKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBBZGQgQkEgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00gCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0FkZEJBUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfQWRkQkFSZXFQYXJhbXNUeXBlKiAgcHdkaUFkZEJBUGFyYW1zOworICBXRElfQWRkQkFSc3BDYiAgICAgICAgICAgd2RpQWRkQkFSc3BDYjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgPSAwOyAKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgIHBCU1NTZXMgICAgICAgICAgICAgPSBOVUxMOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgICAgIHdkaVN0YXR1cyAgICAgICAgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7IAorICB3cHRfbWFjQWRkciAgICAgICAgICAgICAgbWFjQlNTSUQ7CisKKyAgdEFkZEJBUmVxTXNnICAgICAgICAgICAgIGhhbEFkZEJBUmVxOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHB3ZGlBZGRCQVBhcmFtcyA9IChXRElfQWRkQkFSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhOworICB3ZGlBZGRCQVJzcENiICAgPSAoV0RJX0FkZEJBUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBhc3NvY2lhdGlvbiwgaWYgc28gcXVldWUsIGlmCisgICAgbm90IGl0IG1lYW5zIGl0IGlzIGZyZWUgdG8gcHJvY2VzcyByZXF1ZXN0IAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmluZCB0aGUgQlNTIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfU1RBVGFibGVHZXRTdGFCU1NJREFkZHIocFdESUN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaUFkZEJBUGFyYW1zLT53ZGlCQUluZm9UeXBlLnVjU1RBSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFjQlNTSUQpKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgIlRoaXMgc3RhdGlvbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgV0RJIFN0YXRpb24gVGFibGUgJWQiKTsKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uKCBwV0RJQ3R4LCBtYWNCU1NJRCwgJnBCU1NTZXMpOyAKKyAgaWYgKCBOVUxMID09IHBCU1NTZXMgKSAKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCIpOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiB0aGlzIEJTUyBpcyBiZWluZyBjdXJyZW50bHkgcHJvY2Vzc2VkIG9yIHF1ZXVlZCwKKyAgICBpZiBxdWV1ZWQgLSBxdWV1ZSB0aGUgbmV3IHJlcXVlc3QgYXMgd2VsbCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfVFJVRSA9PSBwQlNTU2VzLT5iQXNzb2NSZXFRdWV1ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZXhpc3RzIGJ1dCBjdXJyZW50bHkgcXVldWVkIik7CisKKyAgICB3ZGlTdGF0dXMgPSBXRElfUXVldWVBc3NvY1JlcXVlc3QoIHBXRElDdHgsIHBCU1NTZXMsIHBFdmVudERhdGEpOyAKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIHdkaVN0YXR1czsgCisgIH0KKworCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0FERF9CQV9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbEFkZEJBUmVxLmFkZEJBUGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAKKyAgICAgICAgICAgICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsQWRkQkFSZXEuYWRkQkFQYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBBZGQgQkEgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpQWRkQkFQYXJhbXMsIHdkaUFkZEJBUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgaGFsQWRkQkFSZXEuYWRkQkFQYXJhbXMuYmFTZXNzaW9uSUQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaUFkZEJBUGFyYW1zLT53ZGlCQUluZm9UeXBlLnVjQmFTZXNzaW9uSUQ7CisgIGhhbEFkZEJBUmVxLmFkZEJBUGFyYW1zLndpblNpemUgPSBwd2RpQWRkQkFQYXJhbXMtPndkaUJBSW5mb1R5cGUudWNXaW5TaXplOworI2lmZGVmIEZFQVRVUkVfT05fQ0hJUF9SRU9SREVSSU5HCisgIGhhbEFkZEJBUmVxLmFkZEJBUGFyYW1zLmlzUmVvcmRlcmluZ0RvbmVPbkNoaXAgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgcHdkaUFkZEJBUGFyYW1zLT53ZGlCQUluZm9UeXBlLmJJc1Jlb3JkZXJpbmdEb25lT25DaGlwOworI2VuZGlmCisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmaGFsQWRkQkFSZXEuYWRkQkFQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbEFkZEJBUmVxLmFkZEJBUGFyYW1zKSk7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlBZGRCQVBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlBZGRCQVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFN0YXJ0IFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpQWRkQkFSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFdESV9BRERfQkFfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NBZGRCQVJlcSovCisKKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBUcmlnZ2VyIEJBIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNIAorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NUcmlnZ2VyQkFSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9UcmlnZ2VyQkFSZXFQYXJhbXNUeXBlKiAgcHdkaVRyaWdnZXJCQVBhcmFtczsKKyAgV0RJX1RyaWdnZXJCQVJzcENiICAgICAgICAgICB3ZGlUcmlnZ2VyQkFSc3BDYjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgICB1Y0N1cnJlbnRCU1NTZXNJZHggID0gMDsgCisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgICAgICAgcEJTU1NlcyAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgICAgIHdkaVN0YXR1cyAgICAgICAgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgIGluZGV4OworICB3cHRfbWFjQWRkciAgICAgICAgICAgICAgICAgIG1hY0JTU0lEOworICAKKyAgdFRyaWdnZXJCQVJlcU1zZyAgICAgICAgICAgICAgIGhhbFRyaWdnZXJCQVJlcTsKKyAgdFRyaWdnZXJCYVJlcUNhbmRpZGF0ZSogICAgICAgIGhhbFRyaWdnZXJCQUNhbmRpZGF0ZTsKKyAgV0RJX1RyaWdnZXJCQVJlcUNhbmRpZGF0ZVR5cGUqIHdkaVRyaWdnZXJCQUNhbmRpZGF0ZTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cENCZm5jICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgcHdkaVRyaWdnZXJCQVBhcmFtcyA9IChXRElfVHJpZ2dlckJBUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgd2RpVHJpZ2dlckJBUnNwQ2IgPSAoV0RJX1RyaWdnZXJCQVJzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzc29jaWF0aW9uLCBpZiBzbyBxdWV1ZSwgaWYKKyAgICBub3QgaXQgbWVhbnMgaXQgaXMgZnJlZSB0byBwcm9jZXNzIHJlcXVlc3QgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9TVEFUYWJsZUdldFN0YUJTU0lEQWRkcihwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpVHJpZ2dlckJBUGFyYW1zLT53ZGlUcmlnZ2VyQkFJbmZvVHlwZS51Y1NUQUlkeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hY0JTU0lEKSkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICJUaGlzIHN0YXRpb24gZG9lcyBub3QgZXhpc3QgaW4gdGhlIFdESSBTdGF0aW9uIFRhYmxlICVkIik7CisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB1Y0N1cnJlbnRCU1NTZXNJZHggPSBXRElfRmluZEFzc29jU2Vzc2lvbiggcFdESUN0eCwgbWFjQlNTSUQsICZwQlNTU2VzKTsgCisgIGlmICggTlVMTCA9PSBwQlNTU2VzICkgCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBkb2VzIG5vdCB5ZXQgZXhpc3QiKTsKKworICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ2hlY2sgaWYgdGhpcyBCU1MgaXMgYmVpbmcgY3VycmVudGx5IHByb2Nlc3NlZCBvciBxdWV1ZWQsCisgICAgaWYgcXVldWVkIC0gcXVldWUgdGhlIG5ldyByZXF1ZXN0IGFzIHdlbGwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gcEJTU1Nlcy0+YkFzc29jUmVxUXVldWVkICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGV4aXN0cyBidXQgY3VycmVudGx5IHF1ZXVlZCIpOworCisgICAgd2RpU3RhdHVzID0gV0RJX1F1ZXVlQXNzb2NSZXF1ZXN0KCBwV0RJQ3R4LCBwQlNTU2VzLCBwRXZlbnREYXRhKTsgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICB9CisKKworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgV0RJX1RSSUdHRVJfQkFfUkVRLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxUcmlnZ2VyQkFSZXEudHJpZ2dlckJBUGFyYW1zKSArCisgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHRUcmlnZ2VyQmFSZXFDYW5kaWRhdGUpICogCisgICAgICAgICAgICAgICAgICBwd2RpVHJpZ2dlckJBUGFyYW1zLT53ZGlUcmlnZ2VyQkFJbmZvVHlwZS51c0JBQ2FuZGlkYXRlQ250KSwKKyAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAKKyAgICAgICAgICAgICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsVHJpZ2dlckJBUmVxLnRyaWdnZXJCQVBhcmFtcykrCisgICAgICAgICAgICAgICAoc2l6ZW9mKHRUcmlnZ2VyQmFSZXFDYW5kaWRhdGUpICogCisgICAgICAgICAgICAgICBwd2RpVHJpZ2dlckJBUGFyYW1zLT53ZGlUcmlnZ2VyQkFJbmZvVHlwZS51c0JBQ2FuZGlkYXRlQ250KSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gVHJpZ2dlciBCQSByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlUcmlnZ2VyQkFQYXJhbXMsIHdkaVRyaWdnZXJCQVJzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIGhhbFRyaWdnZXJCQVJlcS50cmlnZ2VyQkFQYXJhbXMuYmFTZXNzaW9uSUQgPSAKKyAgICAgICAgICAgICAgICAgIHB3ZGlUcmlnZ2VyQkFQYXJhbXMtPndkaVRyaWdnZXJCQUluZm9UeXBlLnVjQkFTZXNzaW9uSUQ7CisgIGhhbFRyaWdnZXJCQVJlcS50cmlnZ2VyQkFQYXJhbXMuYmFDYW5kaWRhdGVDbnQgPSAKKyAgICAgICAgICAgICAgICAgIHB3ZGlUcmlnZ2VyQkFQYXJhbXMtPndkaVRyaWdnZXJCQUluZm9UeXBlLnVzQkFDYW5kaWRhdGVDbnQ7CisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmaGFsVHJpZ2dlckJBUmVxLnRyaWdnZXJCQVBhcmFtcywgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsVHJpZ2dlckJBUmVxLnRyaWdnZXJCQVBhcmFtcykpOyAKKworICB3ZGlUcmlnZ2VyQkFDYW5kaWRhdGUgPSAKKyAgICAoV0RJX1RyaWdnZXJCQVJlcUNhbmRpZGF0ZVR5cGUqKShwd2RpVHJpZ2dlckJBUGFyYW1zICsgMSk7CisgIGhhbFRyaWdnZXJCQUNhbmRpZGF0ZSA9ICh0VHJpZ2dlckJhUmVxQ2FuZGlkYXRlKikocFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0KworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFRyaWdnZXJCQVJlcS50cmlnZ2VyQkFQYXJhbXMpKTsKKyAgCisgIGZvcihpbmRleCA9IDAgOyBpbmRleCA8IGhhbFRyaWdnZXJCQVJlcS50cmlnZ2VyQkFQYXJhbXMuYmFDYW5kaWRhdGVDbnQgOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KyspCisgIHsKKyAgICBoYWxUcmlnZ2VyQkFDYW5kaWRhdGUtPnN0YUlkeCA9IHdkaVRyaWdnZXJCQUNhbmRpZGF0ZS0+dWNTVEFJZHg7CisgICAgaGFsVHJpZ2dlckJBQ2FuZGlkYXRlLT50aWRCaXRtYXAgPSB3ZGlUcmlnZ2VyQkFDYW5kaWRhdGUtPnVjVGlkQml0bWFwOworICAgIGhhbFRyaWdnZXJCQUNhbmRpZGF0ZSsrOworICAgIHdkaVRyaWdnZXJCQUNhbmRpZGF0ZSsrOworICB9CisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVRyaWdnZXJCQVBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlUcmlnZ2VyQkFQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2VuZCBTdGFydCBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaVRyaWdnZXJCQVJzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgV0RJX1RSSUdHRVJfQkFfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NUcmlnZ2VyQkFSZXEqLworCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgVXBkYXRlIEJlYWNvbiBQYXJhbXMgIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1VwZGF0ZUJlYWNvblBhcmFtc1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1R5cGUqICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zOworICBXRElfVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2IgIHdkaVVwZGF0ZUJlYWNvblBhcmFtc1JzcENiOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgdFVwZGF0ZUJlYWNvblBhcmFtcyAgICAgICAgICBoYWxVcGRhdGVCZWFjb25QYXJhbXM7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYykpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgcHdkaVVwZGF0ZUJlYWNvblBhcmFtcyA9IChXRElfVXBkYXRlQmVhY29uUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgd2RpVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2IgPSAoV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1JzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX1VQRF9CQ09OX1BSTVNfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxVcGRhdGVCZWFjb25QYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsVXBkYXRlQmVhY29uUGFyYW1zKSApKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gc2V0IGJzcyBrZXkgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLCB3ZGlVcGRhdGVCZWFjb25QYXJhbXNSc3BDYik7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKkJTUyBJbmRleCBvZiB0aGUgQlNTKi8KKyAgaGFsVXBkYXRlQmVhY29uUGFyYW1zLmJzc0lkeCA9CisgICAgcHdkaVVwZGF0ZUJlYWNvblBhcmFtcy0+d2RpVXBkYXRlQmVhY29uUGFyYW1zSW5mby51Y0Jzc0lkeDsKKyAgLypzaG9ydFByZWFtYmxlIG1vZGUuIEhBTCBzaG91bGQgdXBkYXRlIGFsbCB0aGUgU1RBIHJhdGVzIHdoZW4gaXQKKyAgICByZWNlaXZlcyB0aGlzIG1lc3NhZ2UqLworICBoYWxVcGRhdGVCZWFjb25QYXJhbXMuZlNob3J0UHJlYW1ibGUgPSAKKyAgICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjZlNob3J0UHJlYW1ibGU7CisgIC8qIHNob3J0IFNsb3QgdGltZS4qLworICBoYWxVcGRhdGVCZWFjb25QYXJhbXMuZlNob3J0U2xvdFRpbWUgPSAKKyAgICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjZlNob3J0U2xvdFRpbWU7CisgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworICBoYWxVcGRhdGVCZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWwgPSAKKyAgICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVzQmVhY29uSW50ZXJ2YWw7CisKKyAgLypQcm90ZWN0aW9uIHJlbGF0ZWQgKi8KKyAgaGFsVXBkYXRlQmVhY29uUGFyYW1zLmxsYUNvZXhpc3QgPSAKKyAgICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjbGxhQ29leGlzdDsKKyAgaGFsVXBkYXRlQmVhY29uUGFyYW1zLmxsYkNvZXhpc3QgPSAKKyAgICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjbGxiQ29leGlzdDsKKyAgaGFsVXBkYXRlQmVhY29uUGFyYW1zLmxsZ0NvZXhpc3QgPSAKKyAgICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjbGxnQ29leGlzdDsKKyAgaGFsVXBkYXRlQmVhY29uUGFyYW1zLmh0MjBNaHpDb2V4aXN0ICA9IAorICAgIHB3ZGlVcGRhdGVCZWFjb25QYXJhbXMtPndkaVVwZGF0ZUJlYWNvblBhcmFtc0luZm8udWNIdDIwTWh6Q29leGlzdDsKKyAgaGFsVXBkYXRlQmVhY29uUGFyYW1zLmxsbk5vbkdGQ29leGlzdCA9IAorICAgIHB3ZGlVcGRhdGVCZWFjb25QYXJhbXMtPndkaVVwZGF0ZUJlYWNvblBhcmFtc0luZm8udWNsbG5Ob25HRkNvZXhpc3Q7CisgIGhhbFVwZGF0ZUJlYWNvblBhcmFtcy5mTHNpZ1RYT1BQcm90ZWN0aW9uRnVsbFN1cHBvcnQgPSAKKyAgICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjZkxzaWdUWE9QUHJvdGVjdGlvbkZ1bGxTdXBwb3J0OworICBoYWxVcGRhdGVCZWFjb25QYXJhbXMuZlJJRlNNb2RlID0KKyAgICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVjZlJJRlNNb2RlOworICBoYWxVcGRhdGVCZWFjb25QYXJhbXMucGFyYW1DaGFuZ2VCaXRtYXAgPSAKKyAgICBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlVcGRhdGVCZWFjb25QYXJhbXNJbmZvLnVzQ2hhbmdlQml0bWFwOworCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsICZoYWxVcGRhdGVCZWFjb25QYXJhbXMsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFVwZGF0ZUJlYWNvblBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpVXBkYXRlQmVhY29uUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVVwZGF0ZUJlYWNvblBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIERlbCBUUyBSZXF1ZXN0IHRvIEhBTCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX1VQRF9CQ09OX1BSTVNfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NVcGRhdGVCZWFjb25QYXJhbXNSZXEqLworCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2VuZCBCZWFjb24gdGVtcGxhdGUgIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NlbmRCZWFjb25QYXJhbXNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TZW5kQmVhY29uUGFyYW1zVHlwZSogICAgcHdkaVNlbmRCZWFjb25QYXJhbXM7CisgIFdESV9TZW5kQmVhY29uUGFyYW1zUnNwQ2IgICAgd2RpU2VuZEJlYWNvblBhcmFtc1JzcENiOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIHRTZW5kQmVhY29uUmVxTXNnICAgICAgICAgICAgaGFsU2VuZEJlYWNvblJlcTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wQ0JmbmMgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBwd2RpU2VuZEJlYWNvblBhcmFtcyA9IChXRElfU2VuZEJlYWNvblBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaVNlbmRCZWFjb25QYXJhbXNSc3BDYiAgID0gKFdESV9TZW5kQmVhY29uUGFyYW1zUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfU05EX0JDT05fUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTZW5kQmVhY29uUmVxLnNlbmRCZWFjb25QYXJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxTZW5kQmVhY29uUmVxLnNlbmRCZWFjb25QYXJhbSkgKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIHNlbmQgYmVhY29uIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVNlbmRCZWFjb25QYXJhbXMsIHdkaVNlbmRCZWFjb25QYXJhbXNSc3BDYik7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3cGFsTWVtb3J5Q29weShoYWxTZW5kQmVhY29uUmVxLnNlbmRCZWFjb25QYXJhbS5ic3NJZCwKKyAgICAgICAgICAgICAgICAgIHB3ZGlTZW5kQmVhY29uUGFyYW1zLT53ZGlTZW5kQmVhY29uUGFyYW1zSW5mby5tYWNCU1NJRCwKKyAgICAgICAgICAgICAgICAgIFdESV9NQUNfQUREUl9MRU4pOworICBoYWxTZW5kQmVhY29uUmVxLnNlbmRCZWFjb25QYXJhbS5iZWFjb25MZW5ndGggPSAKKyAgICAgICAgICAgICAgICAgIHB3ZGlTZW5kQmVhY29uUGFyYW1zLT53ZGlTZW5kQmVhY29uUGFyYW1zSW5mby5iZWFjb25MZW5ndGg7CisgIHdwYWxNZW1vcnlDb3B5KGhhbFNlbmRCZWFjb25SZXEuc2VuZEJlYWNvblBhcmFtLmJlYWNvbiwKKyAgICAgICAgICAgICAgICAgIHB3ZGlTZW5kQmVhY29uUGFyYW1zLT53ZGlTZW5kQmVhY29uUGFyYW1zSW5mby5iZWFjb24sCisgICAgICAgICAgICAgICAgICBwd2RpU2VuZEJlYWNvblBhcmFtcy0+d2RpU2VuZEJlYWNvblBhcmFtc0luZm8uYmVhY29uTGVuZ3RoKTsKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgIGhhbFNlbmRCZWFjb25SZXEuc2VuZEJlYWNvblBhcmFtLnRpbUllT2Zmc2V0ID0gCisgICAgICAgICAgICAgICAgICBwd2RpU2VuZEJlYWNvblBhcmFtcy0+d2RpU2VuZEJlYWNvblBhcmFtc0luZm8udGltSWVPZmZzZXQ7CisjZW5kaWYKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgIGhhbFNlbmRCZWFjb25SZXEuc2VuZEJlYWNvblBhcmFtLnAycEllT2Zmc2V0ID0gCisgICAgICAgICAgICAgICAgICBwd2RpU2VuZEJlYWNvblBhcmFtcy0+d2RpU2VuZEJlYWNvblBhcmFtc0luZm8udXNQMlBJZU9mZnNldDsKKyNlbmRpZgorCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgJmhhbFNlbmRCZWFjb25SZXEuc2VuZEJlYWNvblBhcmFtLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTZW5kQmVhY29uUmVxLnNlbmRCZWFjb25QYXJhbSkpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpU2VuZEJlYWNvblBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlTZW5kQmVhY29uUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgRGVsIFRTIFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlTZW5kQmVhY29uUGFyYW1zUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX1NORF9CQ09OX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzU2VuZEJlYWNvblBhcmFtc1JlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFVwZGF0ZSBCZWFjb24gUGFyYW1zICBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTQorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NVcGRhdGVQcm9iZVJzcFRlbXBsYXRlUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZVBhcmFtc1R5cGUqICBwd2RpVXBkYXRlUHJvYmVSZXNwVG1wbFBhcmFtczsKKyAgV0RJX1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSc3BDYiAgICAgICAgd2RpVXBkYXRlUHJvYmVSZXNwVG1wbFJzcENiOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgdFNlbmRQcm9iZVJlc3BSZXFQYXJhbXMgICAgICAgICAgICAgICAgaGFsVXBkYXRlUHJvYmVSc3BUbXBsUGFyYW1zOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wQ0JmbmMpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHB3ZGlVcGRhdGVQcm9iZVJlc3BUbXBsUGFyYW1zID0gCisgICAgKFdESV9VcGRhdGVQcm9iZVJzcFRlbXBsYXRlUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgd2RpVXBkYXRlUHJvYmVSZXNwVG1wbFJzcENiID0gCisgICAgKFdESV9VcGRhdGVQcm9iZVJzcFRlbXBsYXRlUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfVVBEX1BST0JFX1JTUF9URU1QTEFURV9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFVwZGF0ZVByb2JlUnNwVG1wbFBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxVcGRhdGVQcm9iZVJzcFRtcGxQYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBzZXQgYnNzIGtleSByZXEgJXggJXggJXgiLAorICAgICBwRXZlbnREYXRhLCBwd2RpVXBkYXRlUHJvYmVSZXNwVG1wbFBhcmFtcywgd2RpVXBkYXRlUHJvYmVSZXNwVG1wbFJzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdwYWxNZW1vcnlDb3B5KGhhbFVwZGF0ZVByb2JlUnNwVG1wbFBhcmFtcy5ic3NJZCwKKyAgICAgICAgICAgICAgICAgcHdkaVVwZGF0ZVByb2JlUmVzcFRtcGxQYXJhbXMtPndkaVByb2JlUnNwVGVtcGxhdGVJbmZvLm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTik7CisKKyAgaGFsVXBkYXRlUHJvYmVSc3BUbXBsUGFyYW1zLnByb2JlUmVzcFRlbXBsYXRlTGVuID0gCisgICAgcHdkaVVwZGF0ZVByb2JlUmVzcFRtcGxQYXJhbXMtPndkaVByb2JlUnNwVGVtcGxhdGVJbmZvLnVQcm9iZVJlc3BUZW1wbGF0ZUxlbjsKKworICB3cGFsTWVtb3J5Q29weShoYWxVcGRhdGVQcm9iZVJzcFRtcGxQYXJhbXMucFByb2JlUmVzcFRlbXBsYXRlLAorICAgIHB3ZGlVcGRhdGVQcm9iZVJlc3BUbXBsUGFyYW1zLT53ZGlQcm9iZVJzcFRlbXBsYXRlSW5mby5wUHJvYmVSZXNwVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgIEJFQUNPTl9URU1QTEFURV9TSVpFKTsgICAgIAorCisKKyAgd3BhbE1lbW9yeUNvcHkoaGFsVXBkYXRlUHJvYmVSc3BUbXBsUGFyYW1zLnVjUHJveHlQcm9iZVJlcVZhbGlkSUVCbWFwLAorICAgICAgICAgICBwd2RpVXBkYXRlUHJvYmVSZXNwVG1wbFBhcmFtcy0+d2RpUHJvYmVSc3BUZW1wbGF0ZUluZm8udWFQcm94eVByb2JlUmVxVmFsaWRJRUJtYXAsCisgICAgICAgICAgICAgICAgIFdESV9QUk9CRV9SRVFfQklUTUFQX0lFX0xFTik7CisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmaGFsVXBkYXRlUHJvYmVSc3BUbXBsUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxVcGRhdGVQcm9iZVJzcFRtcGxQYXJhbXMpKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVVwZGF0ZVByb2JlUmVzcFRtcGxQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpVXBkYXRlUHJvYmVSZXNwVG1wbFBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIFVwZGF0ZSBQcm9iZSBSZXNwIFRlbXBsYXRlIFJlcXVlc3QgdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICB3ZGlVcGRhdGVQcm9iZVJlc3BUbXBsUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgIFdESV9VUERfUFJPQkVfUlNQX1RFTVBMQVRFX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzVXBkYXRlUHJvYmVSc3BUZW1wbGF0ZVJlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIE5WIGJsb2IgZG93bmxvYWQgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNIAorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NOdkRvd25sb2FkUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworCisgIFdESV9OdkRvd25sb2FkUmVxUGFyYW1zVHlwZSogIHB3ZGlOdkRvd25sb2FkUmVxUGFyYW1zID0gTlVMTDsKKyAgV0RJX052RG93bmxvYWRSc3BDYiAgICAgIHdkaU52RG93bmxvYWRSc3BDYiA9IE5VTEw7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAgICAgICAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IChwd2RpTnZEb3dubG9hZFJlcVBhcmFtcyA9IAorICAgICAgICAgICAgICAgICAoV0RJX052RG93bmxvYWRSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICggTlVMTCA9PSAod2RpTnZEb3dubG9hZFJzcENiID0gCisgICAgICAgICAgICAgICAgKFdESV9OdkRvd25sb2FkUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jKSkpCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICBXRElfQVNTRVJUKDApOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKkludGlhbGl6ZSB0aGUgTnYgQmxvYiBJbmZvICovCisgIHBXRElDdHgtPndkaU52QmxvYkluZm8udXNUb3RhbEZyYWdtZW50ID0gCisgICAgICAgICAgICAgICAgVE9UQUxGUkFHTUVOVFMocHdkaU52RG93bmxvYWRSZXFQYXJhbXMtPndkaUJsb2JJbmZvLnVCbG9iU2l6ZSk7CisKKyAgLypjYWNoZSB0aGUgd2RpIG52IHJlcXVlc3QgbWVzc2FnZSBoZXJlIGlmIHRoZSB0aGUgZmlyc3QgZnJhZ21lbnQKKyAgICogVG8gaXNzdWUgdGhlIHJlcXVlc3QgdG8gSEFMIGZvciB0aGUgbmV4dCBmcmFnbWVudCAqLworICBpZiggMCA9PSBwV0RJQ3R4LT53ZGlOdkJsb2JJbmZvLnVzQ3VycmVudEZyYWdtZW50KQorICB7CisgICAgd3BhbE1lbW9yeUNvcHkoJnBXRElDdHgtPndkaUNhY2hlZE52RG93bmxvYWRSZXEsIAorICAgICAgICAgICAgICAgICBwd2RpTnZEb3dubG9hZFJlcVBhcmFtcywgCisgICAgICAgICAgICAgICAgIHNpemVvZihwV0RJQ3R4LT53ZGlDYWNoZWROdkRvd25sb2FkUmVxKSk7IAorCisgICAgcFdESUN0eC0+cGZuY1JzcENCID0gcEV2ZW50RGF0YS0+cENCZm5jOworICAgIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhID0gcEV2ZW50RGF0YS0+cFVzZXJEYXRhOworICB9CisKKyAgcmV0dXJuIFdESV9TZW5kTnZCbG9iUmVxKHBXRElDdHgscEV2ZW50RGF0YSk7Cit9CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFNldCBNYXggVHggUG93ZXIgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiAgICAKKyAgICAgICAgRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIFdESV9Qcm9jZXNzU2V0TWF4VHhQb3dlclJlcQorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU2V0TWF4VHhQb3dlclBhcmFtc1R5cGUqICAgICAgcHdkaVNldE1heFR4UG93ZXJQYXJhbXMgPSBOVUxMOworICBXREFfU2V0TWF4VHhQb3dlclJzcENiICAgICAgICAgICAgd2RpU2V0TWF4VHhQb3dlclJzcENiOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgdFNldE1heFR4UHdyUmVxICAgICAgICAgICAgICAgICAgIGhhbFNldE1heFR4UG93ZXI7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKyAgcHdkaVNldE1heFR4UG93ZXJQYXJhbXMgPSAKKyAgICAoV0RJX1NldE1heFR4UG93ZXJQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhOworICB3ZGlTZXRNYXhUeFBvd2VyUnNwQ2IgPSAKKyAgICAoV0RBX1NldE1heFR4UG93ZXJSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmM7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9TRVRfTUFYX1RYX1BPV0VSX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU2V0TWF4VHhQb3dlci5zZXRNYXhUeFB3clBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxTZXRNYXhUeFBvd2VyLnNldE1heFR4UHdyUGFyYW1zKSAKKykpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgU2V0IE1heCBUeCBQb3dlciByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlTZXRNYXhUeFBvd2VyUGFyYW1zLCB3ZGlTZXRNYXhUeFBvd2VyUnNwQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd3BhbE1lbW9yeUNvcHkoaGFsU2V0TWF4VHhQb3dlci5zZXRNYXhUeFB3clBhcmFtcy5ic3NJZCwKKyAgICAgICAgICAgICAgICAgIHB3ZGlTZXRNYXhUeFBvd2VyUGFyYW1zLT53ZGlNYXhUeFBvd2VySW5mby5tYWNCU1NJZCwKKyAgICAgICAgICAgICAgICAgIFdESV9NQUNfQUREUl9MRU4pOworCisgIHdwYWxNZW1vcnlDb3B5KGhhbFNldE1heFR4UG93ZXIuc2V0TWF4VHhQd3JQYXJhbXMuc2VsZlN0YU1hY0FkZHIsCisgICAgICAgICAgICAgICAgICBwd2RpU2V0TWF4VHhQb3dlclBhcmFtcy0+d2RpTWF4VHhQb3dlckluZm8ubWFjU2VsZlN0YU1hY0FkZHIsCisgICAgICAgICAgICAgICAgICBXRElfTUFDX0FERFJfTEVOKTsKKyAgaGFsU2V0TWF4VHhQb3dlci5zZXRNYXhUeFB3clBhcmFtcy5wb3dlciA9IAorICAgICAgICAgICAgICAgICAgcHdkaVNldE1heFR4UG93ZXJQYXJhbXMtPndkaU1heFR4UG93ZXJJbmZvLnVjUG93ZXI7CisgIAorICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxTZXRNYXhUeFBvd2VyLnNldE1heFR4UHdyUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTZXRNYXhUeFBvd2VyLnNldE1heFR4UHdyUGFyYW1zKSk7IAorCisgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlTZXRNYXhUeFBvd2VyUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVNldE1heFR4UG93ZXJQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2VuZCBEZWwgVFMgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaVNldE1heFR4UG93ZXJSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9TRVRfTUFYX1RYX1BPV0VSX1JFU1ApOyAKKyAgCit9CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFAyUCBOb3RpY2UgT2YgQWJzZW5jZSBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTQorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NQMlBHT05PQVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1NldFAyUEdPTk9BUmVxUGFyYW1zVHlwZSogICAgICAgICAgcHdkaVAyUEdPTk9BUmVxUGFyYW1zOworICBXRElfU2V0UDJQR09OT0FSZXFQYXJhbXNSc3BDYiAgICAgICAgICB3ZGlQMlBHT05PQVJlcVJzcENiOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgdFNldFAyUEdPTk9BUGFyYW1zICAgICAgICAgICAgICAgICAgICAgaGFsU2V0UDJQR09OT0FQYXJhbXM7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBDQmZuYykpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgcHdkaVAyUEdPTk9BUmVxUGFyYW1zID0gCisgICAgKFdESV9TZXRQMlBHT05PQVJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaVAyUEdPTk9BUmVxUnNwQ2IgPSAKKyAgICAoV0RJX1NldFAyUEdPTk9BUmVxUGFyYW1zUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFdESV9QMlBfR09fTk9USUNFX09GX0FCU0VOQ0VfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTZXRQMlBHT05PQVBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxTZXRQMlBHT05PQVBhcmFtcykgKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIHNldCBQMlAgR08gTk9BIFJFUSAleCAleCAleCIsCisgICAgIHBFdmVudERhdGEsIHB3ZGlQMlBHT05PQVJlcVBhcmFtcywgd2RpUDJQR09OT0FSZXFSc3BDYik7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBoYWxTZXRQMlBHT05PQVBhcmFtcy5vcHBfcHMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlQMlBHT05PQVJlcVBhcmFtcy0+d2RpUDJQR09OT0FJbmZvLnVjT3BwX3BzOworICBoYWxTZXRQMlBHT05PQVBhcmFtcy5jdFdpbmRvdyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVAyUEdPTk9BUmVxUGFyYW1zLT53ZGlQMlBHT05PQUluZm8udUN0V2luZG93OworICBoYWxTZXRQMlBHT05PQVBhcmFtcy5jb3VudCA9IHB3ZGlQMlBHT05PQVJlcVBhcmFtcy0+d2RpUDJQR09OT0FJbmZvLnVjQ291bnQ7CisgIGhhbFNldFAyUEdPTk9BUGFyYW1zLmR1cmF0aW9uID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpUDJQR09OT0FSZXFQYXJhbXMtPndkaVAyUEdPTk9BSW5mby51RHVyYXRpb247CisgIGhhbFNldFAyUEdPTk9BUGFyYW1zLmludGVydmFsID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpUDJQR09OT0FSZXFQYXJhbXMtPndkaVAyUEdPTk9BSW5mby51SW50ZXJ2YWw7CisgIGhhbFNldFAyUEdPTk9BUGFyYW1zLnNpbmdsZV9ub2FfZHVyYXRpb24gPSAKKyAgICAgICAgICAgICAgICAgcHdkaVAyUEdPTk9BUmVxUGFyYW1zLT53ZGlQMlBHT05PQUluZm8udVNpbmdsZV9ub2FfZHVyYXRpb247CisgIGhhbFNldFAyUEdPTk9BUGFyYW1zLnBzU2VsZWN0aW9uID0gCisgICAgICAgICAgICAgICAgICAgcHdkaVAyUEdPTk9BUmVxUGFyYW1zLT53ZGlQMlBHT05PQUluZm8udWNQc1NlbGVjdGlvbjsKKworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxTZXRQMlBHT05PQVBhcmFtcywgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU2V0UDJQR09OT0FQYXJhbXMpKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVAyUEdPTk9BUmVxUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVAyUEdPTk9BUmVxUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgVXBkYXRlIFByb2JlIFJlc3AgVGVtcGxhdGUgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaVAyUEdPTk9BUmVxUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgIFdESV9QMlBfR09fTk9USUNFX09GX0FCU0VOQ0VfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NQMlBHT05PQVJlcSovCisKKyNlbmRpZgorCisKKy8qKgorIEBicmllZiAgICBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGFjayBmcm9tIERYRSBvbmNlIHRoZSBwb3dlciAKKyAgICAgICAgICAgc3RhdGUgaXMgc2V0LgorIEBwYXJhbSAgICBOb25lIAorICAgIAorIEBzZWUgCisgQHJldHVybiB2b2lkIAorKi8KK3ZvaWQKK1dESV9TZXRQb3dlclN0YXRlQ2IKKygKKyAgIHdwdF9zdGF0dXMgc3RhdHVzLAorICAgdW5zaWduZWQgaW50IGR4ZVBoeUFkZHIsCisgICB2b2lkICAgICAgKnBDb250ZXh0CispCit7CisgICB3cHRfc3RhdHVzICAgICAgICAgICAgICB3cHRTdGF0dXM7CisgICBXRElfQ29udHJvbEJsb2NrVHlwZSAqcENCID0gTlVMTDsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworICAgaWYoZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkUgPT0gc3RhdHVzICkKKyAgIHsKKyAgICAgIC8vaXQgc2hvdWxkbid0IGhhcHBlbiwgcHV0IGFuIGVycm9yIG1zZworICAgfQorICAgLyogCisgICAgKiBUcmlnZ2VyIHRoZSBldmVudCB0byBicmluZyB0aGUgRW50ZXIgQk1QUyByZXEgZnVuY3Rpb24gdG8gY29tZSAKKyAgICAqIG91dCBvZiB3YWl0IAorKi8KKyAgIGlmKCBOVUxMICE9IHBDb250ZXh0ICkKKyAgIHsKKyAgICAgIHBDQiA9IChXRElfQ29udHJvbEJsb2NrVHlwZSAqKXBDb250ZXh0OyAKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIC8vcHV0IGFuIGVycm9yIG1zZyAKKyAgICAgIHBDQiA9ICZnV0RJQ2I7CisgICB9CisgICBwQ0ItPmR4ZVBoeUFkZHIgPSBkeGVQaHlBZGRyOworICAgd3B0U3RhdHVzICA9IHdwYWxFdmVudFNldCgmcENCLT5zZXRQb3dlclN0YXRlRXZlbnQpOworICAgaWYgKCBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT0gIHdwdFN0YXR1cyApCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgYW4gZXZlbnQiKTsKKworICAgICAgV0RJX0FTU0VSVCgwKTsgCisgICB9CisgICByZXR1cm47Cit9CisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRW50ZXIgSU1QUyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiAKKyAgICAgICAgTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRW50ZXJJbXBzUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX0VudGVySW1wc1JzcENiICAgICAgIHdkaUVudGVySW1wc1JzcENiID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlFbnRlckltcHNSc3BDYiAgID0gKFdESV9FbnRlckltcHNSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfRU5URVJfSU1QU19SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIEVudGVyIElNUFMgcmVxICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgd2RpRW50ZXJJbXBzUnNwQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8qIFJlc2V0IHRoZSBldmVudCB0byBiZSBub3Qgc2lnbmFsbGVkICovCisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd3BhbEV2ZW50UmVzZXQoJnBXRElDdHgtPnNldFBvd2VyU3RhdGVFdmVudCkgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICJXREkgSW5pdCBmYWlsZWQgdG8gcmVzZXQgYW4gZXZlbnQiKTsKKworICAgICAgV0RJX0FTU0VSVCgwKTsgCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vIG5vdGlmeSBEVFMgdGhhdCB3ZSBhcmUgZW50ZXJpbmcgSU1QUworICAgV0RUU19TZXRQb3dlclN0YXRlKHBXRElDdHgsIFdEVFNfUE9XRVJfU1RBVEVfSU1QUywgV0RJX1NldFBvd2VyU3RhdGVDYik7CisKKyAgIC8qCisgICAgKiBXYWl0IGZvciB0aGUgZXZlbnQgdG8gYmUgc2V0IG9uY2UgdGhlIEFDSyBjb21lcyBiYWNrIGZyb20gRFhFIAorICAgICovCisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd3BhbEV2ZW50V2FpdCgmcFdESUN0eC0+c2V0UG93ZXJTdGF0ZUV2ZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9TRVRfUE9XRVJfU1RBVEVfVElNRU9VVCkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIldESSBJbml0IGZhaWxlZCB0byB3YWl0IG9uIGFuIGV2ZW50Iik7CisKKyAgICAgIFdESV9BU1NFUlQoMCk7IAorICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2VuZCBHZXQgU1RBIFJlcXVlc3QgdG8gSEFMIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICB3ZGlFbnRlckltcHNSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfRU5URVJfSU1QU19SRVNQKTsgCit9LypXRElfUHJvY2Vzc0VudGVySW1wc1JlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEV4aXQgSU1QUyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiAKKyAgICAgICAgTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRXhpdEltcHNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfRXhpdEltcHNSc3BDYiAgICAgICAgd2RpRXhpdEltcHNSc3BDYiA9IE5VTEw7CisgICB3cHRfdWludDgqICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSAod2RpRXhpdEltcHNSc3BDYiAgID0gKFdESV9FeGl0SW1wc1JzcENiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9FWElUX0lNUFNfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBFeGl0IElNUFMgcmVxICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgd2RpRXhpdEltcHNSc3BDYik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpRXhpdEltcHNSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfRVhJVF9JTVBTX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzRXhpdEltcHNSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBFbnRlciBCTVBTIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gCisgICAgICAgIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NFbnRlckJtcHNSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfRW50ZXJCbXBzUmVxUGFyYW1zVHlwZSogIHB3ZGlFbnRlckJtcHNSZXFQYXJhbXMgPSBOVUxMOworICAgV0RJX0VudGVyQm1wc1JzcENiICAgICAgICAgICB3ZGlFbnRlckJtcHNSc3BDYiA9IE5VTEw7CisgICB3cHRfdWludDgqICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICAgdEhhbEVudGVyQm1wc1JlcVBhcmFtcyAgIGVudGVyQm1wc1JlcTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IChwd2RpRW50ZXJCbXBzUmVxUGFyYW1zID0gKFdESV9FbnRlckJtcHNSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHdkaUVudGVyQm1wc1JzcENiICAgPSAoV0RJX0VudGVyQm1wc1JzcENiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9FTlRFUl9CTVBTX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVudGVyQm1wc1JlcSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKGVudGVyQm1wc1JlcSkgKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIEVudGVyIEJNUFMgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaUVudGVyQm1wc1JlcVBhcmFtcywgd2RpRW50ZXJCbXBzUnNwQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8qIFJlc2V0IHRoZSBldmVudCB0byBiZSBub3Qgc2lnbmFsbGVkICovCisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd3BhbEV2ZW50UmVzZXQoJnBXRElDdHgtPnNldFBvd2VyU3RhdGVFdmVudCkgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICJXREkgSW5pdCBmYWlsZWQgdG8gcmVzZXQgYW4gZXZlbnQiKTsKKworICAgICAgV0RJX0FTU0VSVCgwKTsgCisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIC8vIG5vdGlmeSBEVFMgdGhhdCB3ZSBhcmUgZW50ZXJpbmcgQk1QUworICAgV0RUU19TZXRQb3dlclN0YXRlKHBXRElDdHgsIFdEVFNfUE9XRVJfU1RBVEVfQk1QUywgV0RJX1NldFBvd2VyU3RhdGVDYik7CisKKy8qCisgICAgKiBXYWl0IGZvciB0aGUgZXZlbnQgdG8gYmUgc2V0IG9uY2UgdGhlIEFDSyBjb21lcyBiYWNrIGZyb20gRFhFIAorICAgICovCisgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd3BhbEV2ZW50V2FpdCgmcFdESUN0eC0+c2V0UG93ZXJTdGF0ZUV2ZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9TRVRfUE9XRVJfU1RBVEVfVElNRU9VVCkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIldESSBJbml0IGZhaWxlZCB0byB3YWl0IG9uIGFuIGV2ZW50Iik7CisKKyAgICAgIFdESV9BU1NFUlQoMCk7IAorICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBwV0RJQ3R4LT5iSW5CbXBzID0gZVdMQU5fUEFMX1RSVUU7CisKKyAgIGVudGVyQm1wc1JlcS5ic3NJZHggPSBwd2RpRW50ZXJCbXBzUmVxUGFyYW1zLT53ZGlFbnRlckJtcHNJbmZvLnVjQnNzSWR4OworICAgZW50ZXJCbXBzUmVxLnRidHQgPSBwd2RpRW50ZXJCbXBzUmVxUGFyYW1zLT53ZGlFbnRlckJtcHNJbmZvLnVUYnR0OworICAgZW50ZXJCbXBzUmVxLmR0aW1Db3VudCA9IHB3ZGlFbnRlckJtcHNSZXFQYXJhbXMtPndkaUVudGVyQm1wc0luZm8udWNEdGltQ291bnQ7CisgICBlbnRlckJtcHNSZXEuZHRpbVBlcmlvZCA9IHB3ZGlFbnRlckJtcHNSZXFQYXJhbXMtPndkaUVudGVyQm1wc0luZm8udWNEdGltUGVyaW9kOworCisgICAvLyBGb3IgQ0NYIGFuZCAxMVIgUm9hbWluZworICAgZW50ZXJCbXBzUmVxLnJzc2lGaWx0ZXJQZXJpb2QgPSBwd2RpRW50ZXJCbXBzUmVxUGFyYW1zLT53ZGlFbnRlckJtcHNJbmZvLnJzc2lGaWx0ZXJQZXJpb2Q7CisgICBlbnRlckJtcHNSZXEubnVtQmVhY29uUGVyUnNzaUF2ZXJhZ2UgPSBwd2RpRW50ZXJCbXBzUmVxUGFyYW1zLT53ZGlFbnRlckJtcHNJbmZvLm51bUJlYWNvblBlclJzc2lBdmVyYWdlOworICAgZW50ZXJCbXBzUmVxLmJSc3NpRmlsdGVyRW5hYmxlID0gcHdkaUVudGVyQm1wc1JlcVBhcmFtcy0+d2RpRW50ZXJCbXBzSW5mby5iUnNzaUZpbHRlckVuYWJsZTsKKworICAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgJmVudGVyQm1wc1JlcSwgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVudGVyQm1wc1JlcSkpOyAKKworICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaUVudGVyQm1wc1JlcVBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpRW50ZXJCbXBzUmVxUGFyYW1zLT5wVXNlckRhdGE7IAorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2VuZCBHZXQgU1RBIFJlcXVlc3QgdG8gSEFMIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICB3ZGlFbnRlckJtcHNSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfRU5URVJfQk1QU19SRVNQKTsgCit9LypXRElfUHJvY2Vzc0VudGVyQm1wc1JlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEV4aXQgQk1QUyBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBNYWluIEZTTQorICAgICAgICBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NFeGl0Qm1wc1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9FeGl0Qm1wc1JlcVBhcmFtc1R5cGUqICBwd2RpRXhpdEJtcHNSZXFQYXJhbXMgPSBOVUxMOworICAgV0RJX0V4aXRCbXBzUnNwQ2IgICAgICAgICAgIHdkaUV4aXRCbXBzUnNwQ2IgPSBOVUxMOworICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgIHRIYWxFeGl0Qm1wc1JlcVBhcmFtcyAgICBleGl0Qm1wc1JlcTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHB3ZGlFeGl0Qm1wc1JlcVBhcmFtcyA9IChXRElfRXhpdEJtcHNSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHdkaUV4aXRCbXBzUnNwQ2IgICA9IChXRElfRXhpdEJtcHNSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfRVhJVF9CTVBTX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGV4aXRCbXBzUmVxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoZXhpdEJtcHNSZXEpICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBFeGl0IEJNUFMgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaUV4aXRCbXBzUmVxUGFyYW1zLCB3ZGlFeGl0Qm1wc1JzcENiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorICAgZXhpdEJtcHNSZXEuc2VuZERhdGFOdWxsID0gcHdkaUV4aXRCbXBzUmVxUGFyYW1zLT53ZGlFeGl0Qm1wc0luZm8udWNTZW5kRGF0YU51bGw7CisKKyAgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICZleGl0Qm1wc1JlcSwgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGV4aXRCbXBzUmVxKSk7IAorCisgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpRXhpdEJtcHNSZXFQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaUV4aXRCbXBzUmVxUGFyYW1zLT5wVXNlckRhdGE7IAorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2VuZCBHZXQgU1RBIFJlcXVlc3QgdG8gSEFMIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICB3ZGlFeGl0Qm1wc1JzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9FWElUX0JNUFNfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NFeGl0Qm1wc1JlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEVudGVyIFVBUFNEIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gCisgICAgICAgIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NFbnRlclVhcHNkUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX0VudGVyVWFwc2RSZXFQYXJhbXNUeXBlKiAgcHdkaUVudGVyVWFwc2RSZXFQYXJhbXMgPSBOVUxMOworICAgV0RJX0VudGVyVWFwc2RSc3BDYiAgICAgICAgICAgd2RpRW50ZXJVYXBzZFJzcENiID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgICB0VWFwc2RSZXFQYXJhbXMgICAgICAgICAgZW50ZXJVYXBzZFJlcTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHB3ZGlFbnRlclVhcHNkUmVxUGFyYW1zID0gKFdESV9FbnRlclVhcHNkUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlFbnRlclVhcHNkUnNwQ2IgICA9IChXRElfRW50ZXJVYXBzZFJzcENiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9FTlRFUl9VQVBTRF9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlbnRlclVhcHNkUmVxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoZW50ZXJVYXBzZFJlcSkgKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIEVudGVyIFVBUFNEIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlFbnRlclVhcHNkUmVxUGFyYW1zLCB3ZGlFbnRlclVhcHNkUnNwQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIGVudGVyVWFwc2RSZXEuYmVEZWxpdmVyeUVuYWJsZWQgID0gcHdkaUVudGVyVWFwc2RSZXFQYXJhbXMtPndkaUVudGVyVWFwc2RJbmZvLnVjQmVEZWxpdmVyeUVuYWJsZWQ7CisgICBlbnRlclVhcHNkUmVxLmJlVHJpZ2dlckVuYWJsZWQgICA9IHB3ZGlFbnRlclVhcHNkUmVxUGFyYW1zLT53ZGlFbnRlclVhcHNkSW5mby51Y0JlVHJpZ2dlckVuYWJsZWQ7CisgICBlbnRlclVhcHNkUmVxLmJrRGVsaXZlcnlFbmFibGVkICA9IHB3ZGlFbnRlclVhcHNkUmVxUGFyYW1zLT53ZGlFbnRlclVhcHNkSW5mby51Y0JrRGVsaXZlcnlFbmFibGVkOworICAgZW50ZXJVYXBzZFJlcS5ia1RyaWdnZXJFbmFibGVkICAgPSBwd2RpRW50ZXJVYXBzZFJlcVBhcmFtcy0+d2RpRW50ZXJVYXBzZEluZm8udWNCa1RyaWdnZXJFbmFibGVkOworICAgZW50ZXJVYXBzZFJlcS52aURlbGl2ZXJ5RW5hYmxlZCAgPSBwd2RpRW50ZXJVYXBzZFJlcVBhcmFtcy0+d2RpRW50ZXJVYXBzZEluZm8udWNWaURlbGl2ZXJ5RW5hYmxlZDsKKyAgIGVudGVyVWFwc2RSZXEudmlUcmlnZ2VyRW5hYmxlZCAgID0gcHdkaUVudGVyVWFwc2RSZXFQYXJhbXMtPndkaUVudGVyVWFwc2RJbmZvLnVjVmlUcmlnZ2VyRW5hYmxlZDsKKyAgIGVudGVyVWFwc2RSZXEudm9EZWxpdmVyeUVuYWJsZWQgID0gcHdkaUVudGVyVWFwc2RSZXFQYXJhbXMtPndkaUVudGVyVWFwc2RJbmZvLnVjVm9EZWxpdmVyeUVuYWJsZWQ7CisgICBlbnRlclVhcHNkUmVxLnZvVHJpZ2dlckVuYWJsZWQgICA9IHB3ZGlFbnRlclVhcHNkUmVxUGFyYW1zLT53ZGlFbnRlclVhcHNkSW5mby51Y1ZvVHJpZ2dlckVuYWJsZWQ7CisKKyAgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICZlbnRlclVhcHNkUmVxLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoZW50ZXJVYXBzZFJlcSkpOyAKKworICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaUVudGVyVWFwc2RSZXFQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaUVudGVyVWFwc2RSZXFQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaUVudGVyVWFwc2RSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfRU5URVJfVUFQU0RfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NFbnRlclVhcHNkUmVxKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRXhpdCBVQVBTRCBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgd2hlbiAKKyAgICAgICAgTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRXhpdFVhcHNkUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX0V4aXRVYXBzZFJzcENiICAgICAgIHdkaUV4aXRVYXBzZFJzcENiID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlFeGl0VWFwc2RSc3BDYiAgID0gKFdESV9FeGl0VWFwc2RSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfRVhJVF9VQVBTRF9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIEV4aXQgVUFQU0QgcmVxICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgd2RpRXhpdFVhcHNkUnNwQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpRXhpdFVhcHNkUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX0VYSVRfVUFQU0RfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NFeGl0VWFwc2RSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgVUFQU0QgcGFyYW1zIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIAorICAgICAgICBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRVYXBzZEFjUGFyYW1zUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU2V0VWFwc2RBY1BhcmFtc1JlcVBhcmFtc1R5cGUqICBwd2RpU2V0VWFwc2RBY1BhcmFtcyA9IE5VTEw7CisgIFdESV9TZXRVYXBzZEFjUGFyYW1zQ2IgICAgICAgICAgICAgIHdkaVNldFVhcHNkQWNQYXJhbXNDYiA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICB0VWFwc2RJbmZvICAgICAgICAgICAgICAgdWFwc2RBY1BhcmFtc1JlcTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gKHB3ZGlTZXRVYXBzZEFjUGFyYW1zID0gKFdESV9TZXRVYXBzZEFjUGFyYW1zUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAoIE5VTEwgPT0gKHdkaVNldFVhcHNkQWNQYXJhbXNDYiAgID0gKFdESV9TZXRVYXBzZEFjUGFyYW1zQ2IpcEV2ZW50RGF0YS0+cENCZm5jKSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICEgVE8gRE8gOiBwcm9wZXIgY29udmVyc2lvbiBpbnRvIHRoZSBIQUwgTWVzc2FnZSBSZXF1ZXN0IEZvcm1hdCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9TRVRfVUFQU0RfUEFSQU1fUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1YXBzZEFjUGFyYW1zUmVxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHVhcHNkQWNQYXJhbXNSZXEpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBTZXQgVUFQU0QgcGFyYW1zIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVNldFVhcHNkQWNQYXJhbXMsIHdkaVNldFVhcHNkQWNQYXJhbXNDYik7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB1YXBzZEFjUGFyYW1zUmVxLmFjID0gcHdkaVNldFVhcHNkQWNQYXJhbXMtPndkaVVhcHNkSW5mby51Y0FjOworICB1YXBzZEFjUGFyYW1zUmVxLnN0YWlkeCA9IHB3ZGlTZXRVYXBzZEFjUGFyYW1zLT53ZGlVYXBzZEluZm8udWNTVEFJZHg7CisgIHVhcHNkQWNQYXJhbXNSZXEudXAgPSBwd2RpU2V0VWFwc2RBY1BhcmFtcy0+d2RpVWFwc2RJbmZvLnVjVXA7CisgIHVhcHNkQWNQYXJhbXNSZXEuZGVsYXlJbnRlcnZhbCA9IHB3ZGlTZXRVYXBzZEFjUGFyYW1zLT53ZGlVYXBzZEluZm8udURlbGF5SW50ZXJ2YWw7CisgIHVhcHNkQWNQYXJhbXNSZXEuc3J2SW50ZXJ2YWwgPSBwd2RpU2V0VWFwc2RBY1BhcmFtcy0+d2RpVWFwc2RJbmZvLnVTcnZJbnRlcnZhbDsKKyAgdWFwc2RBY1BhcmFtc1JlcS5zdXNJbnRlcnZhbCA9IHB3ZGlTZXRVYXBzZEFjUGFyYW1zLT53ZGlVYXBzZEluZm8udVN1c0ludGVydmFsOworCisgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgJnVhcHNkQWNQYXJhbXNSZXEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVhcHNkQWNQYXJhbXNSZXEpKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVNldFVhcHNkQWNQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpU2V0VWFwc2RBY1BhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaVNldFVhcHNkQWNQYXJhbXNDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfU0VUX1VBUFNEX1BBUkFNX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzU2V0VWFwc2RBY1BhcmFtc1JlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIHVwZGF0ZSBVQVBTRCBwYXJhbXMgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIAorICAgICAgICB3aGVuIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1VwZGF0ZVVhcHNkUGFyYW1zUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1VwZGF0ZVVhcHNkUmVxUGFyYW1zVHlwZSogIHB3ZGlVcGRhdGVVYXBzZFJlcVBhcmFtcyA9IE5VTEw7CisgICBXRElfVXBkYXRlVWFwc2RQYXJhbXNDYiAgICAgICAgd2RpVXBkYXRlVWFwc2RQYXJhbXNDYiA9IE5VTEw7CisgICB3cHRfdWludDgqICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSAocHdkaVVwZGF0ZVVhcHNkUmVxUGFyYW1zID0gKFdESV9VcGRhdGVVYXBzZFJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGEpKSB8fAorICAgICAgICggTlVMTCA9PSAod2RpVXBkYXRlVWFwc2RQYXJhbXNDYiAgID0gKFdESV9VcGRhdGVVYXBzZFBhcmFtc0NiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9VUERBVEVfVUFQU0RfUEFSQU1fUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHdkaVVwZGF0ZVVhcHNkUmVxUGFyYW1zLT53ZGlVcGRhdGVVYXBzZEluZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihwd2RpVXBkYXRlVWFwc2RSZXFQYXJhbXMtPndkaVVwZGF0ZVVhcHNkSW5mbykgKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIFVwZGF0ZSBVQVBTRCBwYXJhbXMgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVVwZGF0ZVVhcHNkUmVxUGFyYW1zLCB3ZGlVcGRhdGVVYXBzZFBhcmFtc0NiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAmcHdkaVVwZGF0ZVVhcHNkUmVxUGFyYW1zLT53ZGlVcGRhdGVVYXBzZEluZm8sIAorICAgICAgICAgICAgICAgICAgIHNpemVvZihwd2RpVXBkYXRlVWFwc2RSZXFQYXJhbXMtPndkaVVwZGF0ZVVhcHNkSW5mbykpOyAKKworICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVVwZGF0ZVVhcHNkUmVxUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlVcGRhdGVVYXBzZFJlcVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpVXBkYXRlVWFwc2RQYXJhbXNDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfVVBEQVRFX1VBUFNEX1BBUkFNX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzVXBkYXRlVWFwc2RQYXJhbXNSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBDb25maWd1cmUgUlhQIGZpbHRlciBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgCisgICAgICAgIHdoZW4gTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQ29uZmlndXJlUnhwRmlsdGVyUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfQ29uZmlndXJlUnhwRmlsdGVyUmVxUGFyYW1zVHlwZSogIHB3ZGlSeHBGaWx0ZXJQYXJhbXMgPSBOVUxMOworICBXRElfQ29uZmlndXJlUnhwRmlsdGVyQ2IgICAgICAgICAgICAgIHdkaUNvbmZpZ3VyZVJ4cEZpbHRlckNiID0gTlVMTDsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIHRIYWxDb25maWd1cmVSeHBGaWx0ZXJSZXFQYXJhbXMgICAgIGhhbFJ4cEZpbHRlclBhcmFtczsKKworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSAocHdkaVJ4cEZpbHRlclBhcmFtcyA9IChXRElfQ29uZmlndXJlUnhwRmlsdGVyUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAoIE5VTEwgPT0gKHdkaUNvbmZpZ3VyZVJ4cEZpbHRlckNiICAgPSAoV0RJX0NvbmZpZ3VyZVJ4cEZpbHRlckNiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9DT05GSUdVUkVfUlhQX0ZJTFRFUl9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFJ4cEZpbHRlclBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxSeHBGaWx0ZXJQYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBTZXQgVUFQU0QgcGFyYW1zIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVJ4cEZpbHRlclBhcmFtcywgd2RpQ29uZmlndXJlUnhwRmlsdGVyQ2IpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgaGFsUnhwRmlsdGVyUGFyYW1zLnNldE1jc3RCY3N0RmlsdGVyU2V0dGluZyA9IAorICAgICAgcHdkaVJ4cEZpbHRlclBhcmFtcy0+d2RpUnhwRmlsdGVyUGFyYW0udWNTZXRNY3N0QmNzdEZpbHRlclNldHRpbmc7CisgIGhhbFJ4cEZpbHRlclBhcmFtcy5zZXRNY3N0QmNzdEZpbHRlciA9IAorICAgICAgcHdkaVJ4cEZpbHRlclBhcmFtcy0+d2RpUnhwRmlsdGVyUGFyYW0udWNTZXRNY3N0QmNzdEZpbHRlcjsKKworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxSeHBGaWx0ZXJQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFJ4cEZpbHRlclBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpUnhwRmlsdGVyUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVJ4cEZpbHRlclBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaUNvbmZpZ3VyZVJ4cEZpbHRlckNiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9DT05GSUdVUkVfUlhQX0ZJTFRFUl9SRVNQKTsgCit9LypXRElfUHJvY2Vzc0NvbmZpZ3VyZVJ4cEZpbHRlclJlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIHNldCBiZWFjb24gZmlsdGVyIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRCZWFjb25GaWx0ZXJSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZSogIHB3ZGlCZWFjb25GaWx0ZXJQYXJhbXMgPSBOVUxMOworICAgV0RJX1NldEJlYWNvbkZpbHRlckNiICAgICAgICAgICB3ZGlCZWFjb25GaWx0ZXJDYiA9IE5VTEw7CisgICB3cHRfdWludDgqICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSAocHdkaUJlYWNvbkZpbHRlclBhcmFtcyA9IChXRElfQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlCZWFjb25GaWx0ZXJDYiAgID0gKFdESV9TZXRCZWFjb25GaWx0ZXJDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfU0VUX0JFQUNPTl9GSUxURVJfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHdkaUJlYWNvbkZpbHRlclBhcmFtcy0+d2RpQmVhY29uRmlsdGVySW5mbykgKyBwd2RpQmVhY29uRmlsdGVyUGFyYW1zLT53ZGlCZWFjb25GaWx0ZXJJbmZvLnVzSWVOdW0gKiBzaXplb2YodEJlYWNvbkZpbHRlckllKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YocHdkaUJlYWNvbkZpbHRlclBhcmFtcy0+d2RpQmVhY29uRmlsdGVySW5mbykgKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIFNldCBiZWFjb24gZmlsdGVyIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlCZWFjb25GaWx0ZXJQYXJhbXMsIHdkaUJlYWNvbkZpbHRlckNiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAmcHdkaUJlYWNvbkZpbHRlclBhcmFtcy0+d2RpQmVhY29uRmlsdGVySW5mbywgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB3ZGlCZWFjb25GaWx0ZXJQYXJhbXMtPndkaUJlYWNvbkZpbHRlckluZm8pKTsgCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0K3NpemVvZihwd2RpQmVhY29uRmlsdGVyUGFyYW1zLT53ZGlCZWFjb25GaWx0ZXJJbmZvKSwgCisgICAgICAgICAgICAgICAgICAgJnB3ZGlCZWFjb25GaWx0ZXJQYXJhbXMtPmFGaWx0ZXJzWzBdLCAKKyAgICAgICAgICAgICAgICAgICBwd2RpQmVhY29uRmlsdGVyUGFyYW1zLT53ZGlCZWFjb25GaWx0ZXJJbmZvLnVzSWVOdW0gKiBzaXplb2YodEJlYWNvbkZpbHRlckllKSk7IAorCisgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpQmVhY29uRmlsdGVyUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlCZWFjb25GaWx0ZXJQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaUJlYWNvbkZpbHRlckNiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9TRVRfQkVBQ09OX0ZJTFRFUl9SRVNQKTsgCit9LypXRElfUHJvY2Vzc1NldEJlYWNvbkZpbHRlclJlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIHJlbW92ZSBiZWFjb24gZmlsdGVyIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NSZW1CZWFjb25GaWx0ZXJSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfUmVtQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZSogIHB3ZGlCZWFjb25GaWx0ZXJQYXJhbXMgPSBOVUxMOworICAgV0RJX1JlbUJlYWNvbkZpbHRlckNiICAgICAgICAgICAgICB3ZGlCZWFjb25GaWx0ZXJDYiA9IE5VTEw7CisgICB3cHRfdWludDgqICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSAocHdkaUJlYWNvbkZpbHRlclBhcmFtcyA9IChXRElfUmVtQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlCZWFjb25GaWx0ZXJDYiAgID0gKFdESV9SZW1CZWFjb25GaWx0ZXJDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfUkVNX0JFQUNPTl9GSUxURVJfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHdkaUJlYWNvbkZpbHRlclBhcmFtcy0+d2RpQmVhY29uRmlsdGVySW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHB3ZGlCZWFjb25GaWx0ZXJQYXJhbXMtPndkaUJlYWNvbkZpbHRlckluZm8pICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiByZW1vdmUgYmVhY29uIGZpbHRlciByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaUJlYWNvbkZpbHRlclBhcmFtcywgd2RpQmVhY29uRmlsdGVyQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICZwd2RpQmVhY29uRmlsdGVyUGFyYW1zLT53ZGlCZWFjb25GaWx0ZXJJbmZvLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YocHdkaUJlYWNvbkZpbHRlclBhcmFtcy0+d2RpQmVhY29uRmlsdGVySW5mbykpOyAKKworICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaUJlYWNvbkZpbHRlclBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpQmVhY29uRmlsdGVyUGFyYW1zLT5wVXNlckRhdGE7IAorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2VuZCBHZXQgU1RBIFJlcXVlc3QgdG8gSEFMIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICB3ZGlCZWFjb25GaWx0ZXJDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfUkVNX0JFQUNPTl9GSUxURVJfUkVTUCk7IAorfQorCisvKioKKyBAYnJpZWYgUHJvY2VzcyBzZXQgUlNTSSB0aHJlc2hvbGRzIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRSU1NJVGhyZXNob2xkc1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9TZXRSU1NJVGhyZXNob2xkc1JlcVBhcmFtc1R5cGUqICBwd2RpUlNTSVRocmVzaG9sZHNQYXJhbXMgPSBOVUxMOworICAgV0RJX1NldFJTU0lUaHJlc2hvbGRzQ2IgICAgICAgICAgICAgIHdkaVJTU0lUaHJlc2hvbGRzQ2IgPSBOVUxMOworICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgIHRIYWxSU1NJVGhyZXNob2xkcyAgICAgICByc3NpVGhyZXNob2xkc1JlcTsKKyAgIFdESV9TdGF0dXMgICAgICAgICAgICAgICByZXRfc3RhdHVzID0gMDsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcyA9IChXRElfU2V0UlNTSVRocmVzaG9sZHNSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHdkaVJTU0lUaHJlc2hvbGRzQ2IgICA9IChXRElfU2V0UlNTSVRocmVzaG9sZHNDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfU0VUX1JTU0lfVEhSRVNIT0xEU19SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyc3NpVGhyZXNob2xkc1JlcSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHJzc2lUaHJlc2hvbGRzUmVxKSApKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gcmVtb3ZlIGJlYWNvbiBmaWx0ZXIgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcywgd2RpUlNTSVRocmVzaG9sZHNDYik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgcnNzaVRocmVzaG9sZHNSZXEuYlJlc2VydmVkMTAgPSAKKyAgICAgIHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcy0+d2RpUlNTSVRocmVzaG9sZHNJbmZvLmJSZXNlcnZlZDEwOworICAgcnNzaVRocmVzaG9sZHNSZXEuYlJzc2lUaHJlczFOZWdOb3RpZnkgPSAKKyAgICAgIHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcy0+d2RpUlNTSVRocmVzaG9sZHNJbmZvLmJSc3NpVGhyZXMxTmVnTm90aWZ5OworICAgcnNzaVRocmVzaG9sZHNSZXEuYlJzc2lUaHJlczFQb3NOb3RpZnkgPSAKKyAgICAgIHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcy0+d2RpUlNTSVRocmVzaG9sZHNJbmZvLmJSc3NpVGhyZXMxUG9zTm90aWZ5OworICAgcnNzaVRocmVzaG9sZHNSZXEuYlJzc2lUaHJlczJOZWdOb3RpZnkgPSAKKyAgICAgIHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcy0+d2RpUlNTSVRocmVzaG9sZHNJbmZvLmJSc3NpVGhyZXMyTmVnTm90aWZ5OworICAgcnNzaVRocmVzaG9sZHNSZXEuYlJzc2lUaHJlczJQb3NOb3RpZnkgPSAKKyAgICAgIHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcy0+d2RpUlNTSVRocmVzaG9sZHNJbmZvLmJSc3NpVGhyZXMyUG9zTm90aWZ5OworICAgcnNzaVRocmVzaG9sZHNSZXEuYlJzc2lUaHJlczNOZWdOb3RpZnkgPSAKKyAgICAgIHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcy0+d2RpUlNTSVRocmVzaG9sZHNJbmZvLmJSc3NpVGhyZXMzTmVnTm90aWZ5OworICAgcnNzaVRocmVzaG9sZHNSZXEuYlJzc2lUaHJlczNQb3NOb3RpZnkgPSAKKyAgICAgIHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcy0+d2RpUlNTSVRocmVzaG9sZHNJbmZvLmJSc3NpVGhyZXMzUG9zTm90aWZ5OworICAgcnNzaVRocmVzaG9sZHNSZXEudWNSc3NpVGhyZXNob2xkMSA9IAorICAgICAgcHdkaVJTU0lUaHJlc2hvbGRzUGFyYW1zLT53ZGlSU1NJVGhyZXNob2xkc0luZm8udWNSc3NpVGhyZXNob2xkMTsKKyAgIHJzc2lUaHJlc2hvbGRzUmVxLnVjUnNzaVRocmVzaG9sZDIgPSAKKyAgICAgIHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcy0+d2RpUlNTSVRocmVzaG9sZHNJbmZvLnVjUnNzaVRocmVzaG9sZDI7CisgICByc3NpVGhyZXNob2xkc1JlcS51Y1Jzc2lUaHJlc2hvbGQzID0gCisgICAgICBwd2RpUlNTSVRocmVzaG9sZHNQYXJhbXMtPndkaVJTU0lUaHJlc2hvbGRzSW5mby51Y1Jzc2lUaHJlc2hvbGQzOworCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAmcnNzaVRocmVzaG9sZHNSZXEsIAorICAgICAgICAgICAgICAgICAgIHNpemVvZihyc3NpVGhyZXNob2xkc1JlcSkpOyAKKworICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVJTU0lUaHJlc2hvbGRzUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlSU1NJVGhyZXNob2xkc1BhcmFtcy0+cFVzZXJEYXRhOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgU2V0IHRocmVzaG9sZCByZXEgdG8gSEFMIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKHJldF9zdGF0dXMgPSBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpUlNTSVRocmVzaG9sZHNDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfU0VUX1JTU0lfVEhSRVNIT0xEU19SRVNQKSkgPT0gV0RJX1NUQVRVU19TVUNDRVNTKQorICAgeworICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gaWRsZSBzdGF0ZSBXRElfU1RBUlRFRF9TVCBhbmQgd2UgcmVjZWl2ZSBpbmRpY2F0aW9uIGZvciB0aHJlc2hvbGQKKyAgICAgIC8vIHJlcS4gVGhlbiBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIHRoZSB0aHJlc2hvbGQgY3Jvc3MgaW5kLCB3ZSB0cmlnZ2VyCisgICAgICAvLyBhIFNldCB0aHJlc2hvbGQgcmVxLCB0aGVuIHdlIG5lZWQgdG8gaW5kaWNhdGUgdG8gV0RJIHRoYXQgaXQgbmVlZHMgdG8gCisgICAgICAvLyBnbyB0byBidXN5IHN0YXRlIGFzIGEgcmVzdWx0IG9mIHRoZSBpbmRpY2F0aW9uIGFzIHdlIHNlbnQgYSByZXEgaW4gdGhlIAorICAgICAgLy8gc2FtZSBXREkgY29udGV4dC4KKyAgICAgIC8vIEhlbmNlIGV4cGVjdGVkIHN0YXRlIHRyYW5zaXRpb24gaXMgdG8gYnVzeS4KKyAgICAgIHBXRElDdHgtPnVjRXhwZWN0ZWRTdGF0ZVRyYW5zaXRpb24gPSAgV0RJX0JVU1lfU1Q7CisgICB9CisKKyAgIHJldHVybiByZXRfc3RhdHVzOworfQorCisvKioKKyBAYnJpZWYgUHJvY2VzcyBzZXQgUlNTSSB0aHJlc2hvbGRzIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NIb3N0T2ZmbG9hZFJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9Ib3N0T2ZmbG9hZFJlcVBhcmFtc1R5cGUqICBwd2RpSG9zdE9mZmxvYWRQYXJhbXMgPSBOVUxMOworICAgV0RJX0hvc3RPZmZsb2FkQ2IgICAgICAgICAgICAgIHdkaUhvc3RPZmZsb2FkQ2IgPSBOVUxMOworICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgIHRIYWxIb3N0T2ZmbG9hZFJlcSAgICAgICBob3N0T2ZmbG9hZFBhcmFtczsKKyAgIHRIYWxOU09mZmxvYWRQYXJhbXMgICAgICBuc09mZmxvYWRQYXJhbXM7CisKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHB3ZGlIb3N0T2ZmbG9hZFBhcmFtcyA9IChXRElfSG9zdE9mZmxvYWRSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHdkaUhvc3RPZmZsb2FkQ2IgICA9IChXRElfSG9zdE9mZmxvYWRDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfSE9TVF9PRkZMT0FEX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhvc3RPZmZsb2FkUGFyYW1zKStzaXplb2YobnNPZmZsb2FkUGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaG9zdE9mZmxvYWRQYXJhbXMpICsgc2l6ZW9mKG5zT2ZmbG9hZFBhcmFtcykgKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIGhvc3Qgb2ZmbG9hZCByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaUhvc3RPZmZsb2FkUGFyYW1zLCB3ZGlIb3N0T2ZmbG9hZENiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICBob3N0T2ZmbG9hZFBhcmFtcy5vZmZsb2FkVHlwZSA9IHB3ZGlIb3N0T2ZmbG9hZFBhcmFtcy0+d2RpSG9zdE9mZmxvYWRJbmZvLnVjT2ZmbG9hZFR5cGU7CisgICBob3N0T2ZmbG9hZFBhcmFtcy5lbmFibGVPckRpc2FibGUgPSBwd2RpSG9zdE9mZmxvYWRQYXJhbXMtPndkaUhvc3RPZmZsb2FkSW5mby51Y0VuYWJsZU9yRGlzYWJsZTsKKyAgIGlmKCBIQUxfSVBWNF9BUlBfUkVQTFlfT0ZGTE9BRCA9PSBob3N0T2ZmbG9hZFBhcmFtcy5vZmZsb2FkVHlwZSApCisgICB7CisgICAgICAvLyBBUlAgT2ZmbG9hZAorICAgICAgd3BhbE1lbW9yeUNvcHkoaG9zdE9mZmxvYWRQYXJhbXMucGFyYW1zLmhvc3RJcHY0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgIHB3ZGlIb3N0T2ZmbG9hZFBhcmFtcy0+d2RpSG9zdE9mZmxvYWRJbmZvLnBhcmFtcy5hSG9zdElwdjRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgNCk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICAvLyBOUyBPZmZsb2FkCisgICAgICB3cGFsTWVtb3J5Q29weShob3N0T2ZmbG9hZFBhcmFtcy5wYXJhbXMuaG9zdElwdjZBZGRyLAorICAgICAgICAgICAgICAgICAgICAgcHdkaUhvc3RPZmZsb2FkUGFyYW1zLT53ZGlIb3N0T2ZmbG9hZEluZm8ucGFyYW1zLmFIb3N0SXB2NkFkZHIsCisgICAgICAgICAgICAgICAgICAgICAxNik7CisKKyNpZmRlZiBXTEFOX05TX09GRkxPQUQKKyAgICAgICAgLy8gY29weSBwd2RpSG9zdE9mZmxvYWRQYXJhbXMtPndkaU5zT2ZmbG9hZFBhcmFtcyBpbnRvIG5zT2ZmbG9hZFBhcmFtcworICAgICAgICB3cGFsTWVtb3J5Q29weShuc09mZmxvYWRQYXJhbXMuc3JjSVB2NkFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBwd2RpSG9zdE9mZmxvYWRQYXJhbXMtPndkaU5zT2ZmbG9hZFBhcmFtcy5zcmNJUHY2QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyAgICAgICAgd3BhbE1lbW9yeUNvcHkobnNPZmZsb2FkUGFyYW1zLnNlbGZJUHY2QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlIb3N0T2ZmbG9hZFBhcmFtcy0+d2RpTnNPZmZsb2FkUGFyYW1zLnNlbGZJUHY2QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyAgICAgICAgd3BhbE1lbW9yeUNvcHkobnNPZmZsb2FkUGFyYW1zLnRhcmdldElQdjZBZGRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlIb3N0T2ZmbG9hZFBhcmFtcy0+d2RpTnNPZmZsb2FkUGFyYW1zLnRhcmdldElQdjZBZGRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyAgICAgICAgd3BhbE1lbW9yeUNvcHkobnNPZmZsb2FkUGFyYW1zLnRhcmdldElQdjZBZGRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlIb3N0T2ZmbG9hZFBhcmFtcy0+d2RpTnNPZmZsb2FkUGFyYW1zLnRhcmdldElQdjZBZGRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyAgICAgICAgd3BhbE1lbW9yeUNvcHkobnNPZmZsb2FkUGFyYW1zLnNlbGZNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgcHdkaUhvc3RPZmZsb2FkUGFyYW1zLT53ZGlOc09mZmxvYWRQYXJhbXMuc2VsZk1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICA2KTsKKyAgICAgICAgbnNPZmZsb2FkUGFyYW1zLnNyY0lQdjZBZGRyVmFsaWQgPSBwd2RpSG9zdE9mZmxvYWRQYXJhbXMtPndkaU5zT2ZmbG9hZFBhcmFtcy5zcmNJUHY2QWRkclZhbGlkOworICAgICAgICBuc09mZmxvYWRQYXJhbXMudGFyZ2V0SVB2NkFkZHIxVmFsaWQgPSBwd2RpSG9zdE9mZmxvYWRQYXJhbXMtPndkaU5zT2ZmbG9hZFBhcmFtcy50YXJnZXRJUHY2QWRkcjFWYWxpZDsKKyAgICAgICAgbnNPZmZsb2FkUGFyYW1zLnRhcmdldElQdjZBZGRyMlZhbGlkID0gcHdkaUhvc3RPZmZsb2FkUGFyYW1zLT53ZGlOc09mZmxvYWRQYXJhbXMudGFyZ2V0SVB2NkFkZHIyVmFsaWQ7CisjZW5kaWYgLy8gV0xBTl9OU19PRkZMT0FECisgICB9CisKKyAgIC8vIGNvcHkgaG9zdE9mZmxvYWRQYXJhbXMgaW50byBwU2VuZEJ1ZmZlcgorICAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgJmhvc3RPZmZsb2FkUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoaG9zdE9mZmxvYWRQYXJhbXMpKTsgCisKKyNpZmRlZiBXTEFOX05TX09GRkxPQUQKKyAgIGlmKCBIQUxfSVBWNl9OU19PRkZMT0FEID09IGhvc3RPZmZsb2FkUGFyYW1zLm9mZmxvYWRUeXBlICkKKyAgIHsKKyAgICAgICAvLyBjb3B5IG5zT2ZmbG9hZFBhcmFtcyBpbnRvIHBTZW5kQnVmZmVyCisgICAgICAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCtzaXplb2YoaG9zdE9mZmxvYWRQYXJhbXMpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgJm5zT2ZmbG9hZFBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuc09mZmxvYWRQYXJhbXMpKTsgCisgICB9CisjZW5kaWYgLy8gV0xBTl9OU19PRkZMT0FECisKKyAgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlIb3N0T2ZmbG9hZFBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpSG9zdE9mZmxvYWRQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaUhvc3RPZmZsb2FkQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX0hPU1RfT0ZGTE9BRF9SRVNQKTsgCit9LypXRElfUHJvY2Vzc0hvc3RPZmZsb2FkUmVxKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgS2VlcCBBbGl2ZSBSZXF1ZXN0IGZ1bmN0aW9uIChjYWxsZWQgCisgICAgICAgIHdoZW4gTWFpbiBGU00gYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzS2VlcEFsaXZlUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX0tlZXBBbGl2ZVJlcVBhcmFtc1R5cGUqICBwd2RpS2VlcEFsaXZlUGFyYW1zID0gTlVMTDsKKyAgIFdESV9LZWVwQWxpdmVDYiAgICAgICAgICAgICAgd2RpS2VlcEFsaXZlQ2IgPSBOVUxMOworICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgPSBOVUxMOyAKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgID0gMDsKKyAgIHRIYWxLZWVwQWxpdmVSZXEgICAgICAgICBrZWVwQWxpdmVSZXE7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IChwd2RpS2VlcEFsaXZlUGFyYW1zID0gKFdESV9LZWVwQWxpdmVSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHdkaUtlZXBBbGl2ZUNiICAgPSAoV0RJX0tlZXBBbGl2ZUNiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIkludmFsaWQgcGFyYW1ldGVycyBpbiBLZWVwIEFsaXZlIHJlcSIpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAgICEgVE8gRE8gOiBwcm9wZXIgY29udmVyc2lvbiBpbnRvIHRoZSBIQUwgTWVzc2FnZSBSZXF1ZXN0IEZvcm1hdCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0tFRVBfQUxJVkVfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa2VlcEFsaXZlUmVxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2Yoa2VlcEFsaXZlUmVxKSApKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIGtlZXAgYWxpdmUgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlLZWVwQWxpdmVQYXJhbXMsIHdkaUtlZXBBbGl2ZUNiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICBrZWVwQWxpdmVSZXEucGFja2V0VHlwZSA9IHB3ZGlLZWVwQWxpdmVQYXJhbXMtPndkaUtlZXBBbGl2ZUluZm8udWNQYWNrZXRUeXBlOworICAga2VlcEFsaXZlUmVxLnRpbWVQZXJpb2QgPSBwd2RpS2VlcEFsaXZlUGFyYW1zLT53ZGlLZWVwQWxpdmVJbmZvLnVjVGltZVBlcmlvZDsKKworICAgaWYocHdkaUtlZXBBbGl2ZVBhcmFtcy0+d2RpS2VlcEFsaXZlSW5mby51Y1BhY2tldFR5cGUgPT0gMikKKyAgIHsKKyAgIHdwYWxNZW1vcnlDb3B5KGtlZXBBbGl2ZVJlcS5ob3N0SXB2NEFkZHIsCisgICAgICAgICAgICAgICAgICAgICBwd2RpS2VlcEFsaXZlUGFyYW1zLT53ZGlLZWVwQWxpdmVJbmZvLmFIb3N0SXB2NEFkZHIsCisgICAgICAgICAgICAgICAgICAgICBIQUxfSVBWNF9BRERSX0xFTik7CisgICB3cGFsTWVtb3J5Q29weShrZWVwQWxpdmVSZXEuZGVzdElwdjRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgcHdkaUtlZXBBbGl2ZVBhcmFtcy0+d2RpS2VlcEFsaXZlSW5mby5hRGVzdElwdjRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgSEFMX0lQVjRfQUREUl9MRU4pOyAgIAorICAgd3BhbE1lbW9yeUNvcHkoa2VlcEFsaXZlUmVxLmRlc3RNYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgcHdkaUtlZXBBbGl2ZVBhcmFtcy0+d2RpS2VlcEFsaXZlSW5mby5hRGVzdE1hY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICBIQUxfTUFDX0FERFJfTEVOKTsKKyAgIH0KKyAgICAgIAorICAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgJmtlZXBBbGl2ZVJlcSwgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtlZXBBbGl2ZVJlcSkpOyAKKworICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiUHJvY2VzcyBrZWVwIGFsaXZlIHJlcSAlZCIsc2l6ZW9mKGtlZXBBbGl2ZVJlcSkpOworCisgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICJQcm9jZXNzIGtlZXAgYWxpdmUgcmVxIHRpbWUgcGVyaW9kICVkIixrZWVwQWxpdmVSZXEudGltZVBlcmlvZCk7CisKKyAgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlLZWVwQWxpdmVQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaUtlZXBBbGl2ZVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgIlNlbmRpbmcga2VlcCBhbGl2ZSByZXEgdG8gSEFMIik7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaUtlZXBBbGl2ZUNiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9LRUVQX0FMSVZFX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzS2VlcEFsaXZlUmVxKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBXb3dsIGFkZCBiYyBwdHJuIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NXb3dsQWRkQmNQdHJuUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1dvd2xBZGRCY1B0cm5SZXFQYXJhbXNUeXBlKiAgcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMgPSBOVUxMOworICAgV0RJX1dvd2xBZGRCY1B0cm5DYiAgICAgICAgICAgICAgd2RpV293bEFkZEJjUHRybkNiID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgICB0SGFsV293bEFkZEJjYXN0UHRybiAgICAgd293bEFkZEJjUHRyblJlcTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHB3ZGlXb3dsQWRkQmNQdHJuUGFyYW1zID0gKFdESV9Xb3dsQWRkQmNQdHJuUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlXb3dsQWRkQmNQdHJuQ2IgICA9IChXRElfV293bEFkZEJjUHRybkNiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9XT1dMX0FERF9CQ19QVFJOX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHdvd2xBZGRCY1B0cm5SZXEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZih3b3dsQWRkQmNQdHJuUmVxKSApKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gV293bCBhZGQgYmMgcHRybiByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMsIHdkaVdvd2xBZGRCY1B0cm5DYik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgd293bEFkZEJjUHRyblJlcS51Y1BhdHRlcm5JZCA9IAorICAgICAgcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMtPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVybklkOworICAgd293bEFkZEJjUHRyblJlcS51Y1BhdHRlcm5CeXRlT2Zmc2V0ID0gCisgICAgICBwd2RpV293bEFkZEJjUHRyblBhcmFtcy0+d2RpV293bEFkZEJjUHRybkluZm8udWNQYXR0ZXJuQnl0ZU9mZnNldDsKKyAgIHdvd2xBZGRCY1B0cm5SZXEudWNQYXR0ZXJuTWFza1NpemUgPSAKKyAgICAgIHB3ZGlXb3dsQWRkQmNQdHJuUGFyYW1zLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm5NYXNrU2l6ZTsKKyAgIHdvd2xBZGRCY1B0cm5SZXEudWNQYXR0ZXJuU2l6ZSA9IAorICAgICAgcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMtPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVyblNpemU7CisKKyAgIGlmIChwd2RpV293bEFkZEJjUHRyblBhcmFtcy0+d2RpV293bEFkZEJjUHRybkluZm8udWNQYXR0ZXJuU2l6ZSA8PSBIQUxfV09XTF9CQ0FTVF9QQVRURVJOX01BWF9TSVpFKQorICAgeworICAgICAgIHdwYWxNZW1vcnlDb3B5KHdvd2xBZGRCY1B0cm5SZXEudWNQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgIHB3ZGlXb3dsQWRkQmNQdHJuUGFyYW1zLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMtPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVyblNpemUpOworICAgICAgIHdwYWxNZW1vcnlDb3B5KHdvd2xBZGRCY1B0cm5SZXEudWNQYXR0ZXJuTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICBwd2RpV293bEFkZEJjUHRyblBhcmFtcy0+d2RpV293bEFkZEJjUHRybkluZm8udWNQYXR0ZXJuTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICBwd2RpV293bEFkZEJjUHRyblBhcmFtcy0+d2RpV293bEFkZEJjUHRybkluZm8udWNQYXR0ZXJuTWFza1NpemUpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgIHdwYWxNZW1vcnlDb3B5KHdvd2xBZGRCY1B0cm5SZXEudWNQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgIHB3ZGlXb3dsQWRkQmNQdHJuUGFyYW1zLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgSEFMX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRSk7CisgICAgICAgd3BhbE1lbW9yeUNvcHkod293bEFkZEJjUHRyblJlcS51Y1BhdHRlcm5NYXNrLAorICAgICAgICAgICAgICAgICAgICAgIHB3ZGlXb3dsQWRkQmNQdHJuUGFyYW1zLT53ZGlXb3dsQWRkQmNQdHJuSW5mby51Y1BhdHRlcm5NYXNrLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9XT1dMX0JDQVNUX1BBVFRFUk5fTUFYX1NJWkUpOworCisgICAgICAgd3BhbE1lbW9yeUNvcHkod293bEFkZEJjUHRyblJlcS51Y1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMtPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICBwd2RpV293bEFkZEJjUHRyblBhcmFtcy0+d2RpV293bEFkZEJjUHRybkluZm8udWNQYXR0ZXJuTWFza1NpemUgLSBIQUxfV09XTF9CQ0FTVF9QQVRURVJOX01BWF9TSVpFKTsKKyAgICAgICB3cGFsTWVtb3J5Q29weSh3b3dsQWRkQmNQdHJuUmVxLnVjUGF0dGVybk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMtPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVybk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMtPndkaVdvd2xBZGRCY1B0cm5JbmZvLnVjUGF0dGVybk1hc2tTaXplIC0gSEFMX1dPV0xfQkNBU1RfUEFUVEVSTl9NQVhfU0laRSk7CisgICB9CisKKyAgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICZ3b3dsQWRkQmNQdHJuUmVxLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2Yod293bEFkZEJjUHRyblJlcSkpOyAKKworICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVdvd2xBZGRCY1B0cm5QYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaVdvd2xBZGRCY1B0cm5DYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfV09XTF9BRERfQkNfUFRSTl9SRVNQKTsgCit9LypXRElfUHJvY2Vzc1dvd2xBZGRCY1B0cm5SZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBXb3dsIGRlbGV0ZSBiYyBwdHJuIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBNYWluIEZTTSBhbGxvd3MgaXQpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NXb3dsRGVsQmNQdHJuUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1dvd2xEZWxCY1B0cm5SZXFQYXJhbXNUeXBlKiAgcHdkaVdvd2xEZWxCY1B0cm5QYXJhbXMgPSBOVUxMOworICAgV0RJX1dvd2xEZWxCY1B0cm5DYiAgICAgICAgICAgICAgd2RpV293bERlbEJjUHRybkNiID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgICB0SGFsV293bERlbEJjYXN0UHRybiAgICAgd293bERlbEJjUHRyblJlcTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHB3ZGlXb3dsRGVsQmNQdHJuUGFyYW1zID0gKFdESV9Xb3dsRGVsQmNQdHJuUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlXb3dsRGVsQmNQdHJuQ2IgICA9IChXRElfV293bERlbEJjUHRybkNiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9XT1dMX0RFTF9CQ19QVFJOX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHdvd2xEZWxCY1B0cm5SZXEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZih3b3dsRGVsQmNQdHJuUmVxKSApKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gV293bCBkZWwgYmMgcHRybiByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaVdvd2xEZWxCY1B0cm5QYXJhbXMsIHdkaVdvd2xEZWxCY1B0cm5DYik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgd293bERlbEJjUHRyblJlcS51Y1BhdHRlcm5JZCA9IAorICAgICAgcHdkaVdvd2xEZWxCY1B0cm5QYXJhbXMtPndkaVdvd2xEZWxCY1B0cm5JbmZvLnVjUGF0dGVybklkOworICAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgJndvd2xEZWxCY1B0cm5SZXEsIAorICAgICAgICAgICAgICAgICAgIHNpemVvZih3b3dsRGVsQmNQdHJuUmVxKSk7IAorCisgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpV293bERlbEJjUHRyblBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpV293bERlbEJjUHRyblBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpV293bERlbEJjUHRybkNiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9XT1dMX0RFTF9CQ19QVFJOX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzV293bERlbEJjUHRyblJlcSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFdvd2wgZW50ZXIgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIAorICAgICAgICB3aGVuIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1dvd2xFbnRlclJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9Xb3dsRW50ZXJSZXFQYXJhbXNUeXBlKiAgcHdkaVdvd2xFbnRlclBhcmFtcyA9IE5VTEw7CisgICBXRElfV293bEVudGVyUmVxQ2IgICAgICAgICAgIHdkaVdvd2xFbnRlckNiID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgICB0SGFsV293bEVudGVyUGFyYW1zICAgICAgd293bEVudGVyUmVxOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSAocHdkaVdvd2xFbnRlclBhcmFtcyA9IChXRElfV293bEVudGVyUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlXb3dsRW50ZXJDYiAgID0gKFdESV9Xb3dsRW50ZXJSZXFDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAgISBUTyBETyA6IHByb3BlciBjb252ZXJzaW9uIGludG8gdGhlIEhBTCBNZXNzYWdlIFJlcXVlc3QgRm9ybWF0IAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfV09XTF9FTlRFUl9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih3b3dsRW50ZXJSZXEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZih3b3dsRW50ZXJSZXEpICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBXb3dsIGVudGVyIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpV293bEVudGVyUGFyYW1zLCB3ZGlXb3dsRW50ZXJDYik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgd293bEVudGVyUmVxLnVjTWFnaWNQa3RFbmFibGUgPSAKKyAgICAgIHB3ZGlXb3dsRW50ZXJQYXJhbXMtPndkaVdvd2xFbnRlckluZm8udWNNYWdpY1BrdEVuYWJsZTsKKyAgIHdvd2xFbnRlclJlcS51Y1BhdHRlcm5GaWx0ZXJpbmdFbmFibGUgPSAKKyAgICAgIHB3ZGlXb3dsRW50ZXJQYXJhbXMtPndkaVdvd2xFbnRlckluZm8udWNQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlOworICAgd293bEVudGVyUmVxLnVjVWNhc3RQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlID0gCisgICAgICBwd2RpV293bEVudGVyUGFyYW1zLT53ZGlXb3dsRW50ZXJJbmZvLnVjVWNhc3RQYXR0ZXJuRmlsdGVyaW5nRW5hYmxlOworICAgd293bEVudGVyUmVxLnVjV293Q2hubFN3aXRjaFJjdiA9IAorICAgICAgcHdkaVdvd2xFbnRlclBhcmFtcy0+d2RpV293bEVudGVySW5mby51Y1dvd0NobmxTd2l0Y2hSY3Y7CisgICB3b3dsRW50ZXJSZXEudWNXb3dEZWF1dGhSY3YgPSAKKyAgICAgIHB3ZGlXb3dsRW50ZXJQYXJhbXMtPndkaVdvd2xFbnRlckluZm8udWNXb3dEZWF1dGhSY3Y7CisgICB3b3dsRW50ZXJSZXEudWNXb3dEaXNhc3NvY1JjdiA9IAorICAgICAgcHdkaVdvd2xFbnRlclBhcmFtcy0+d2RpV293bEVudGVySW5mby51Y1dvd0Rpc2Fzc29jUmN2OworICAgd293bEVudGVyUmVxLnVjV293TWF4TWlzc2VkQmVhY29ucyA9IAorICAgICAgcHdkaVdvd2xFbnRlclBhcmFtcy0+d2RpV293bEVudGVySW5mby51Y1dvd01heE1pc3NlZEJlYWNvbnM7CisgICB3b3dsRW50ZXJSZXEudWNXb3dNYXhTbGVlcFVzZWMgPSAKKyAgICAgIHB3ZGlXb3dsRW50ZXJQYXJhbXMtPndkaVdvd2xFbnRlckluZm8udWNXb3dNYXhTbGVlcFVzZWM7CisKKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgIHdvd2xFbnRlclJlcS51Y1dvV0VBUElEUmVxdWVzdEVuYWJsZSA9IAorICAgICAgcHdkaVdvd2xFbnRlclBhcmFtcy0+d2RpV293bEVudGVySW5mby51Y1dvV0VBUElEUmVxdWVzdEVuYWJsZTsKKworICAgd293bEVudGVyUmVxLnVjV29XRUFQT0w0V2F5RW5hYmxlID0KKyAgICAgIHB3ZGlXb3dsRW50ZXJQYXJhbXMtPndkaVdvd2xFbnRlckluZm8udWNXb1dFQVBPTDRXYXlFbmFibGU7CisKKyAgIHdvd2xFbnRlclJlcS51Y1dvd05ldFNjYW5PZmZsb2FkTWF0Y2ggPSAKKyAgICAgIHB3ZGlXb3dsRW50ZXJQYXJhbXMtPndkaVdvd2xFbnRlckluZm8udWNXb3dOZXRTY2FuT2ZmbG9hZE1hdGNoOworCisgICB3b3dsRW50ZXJSZXEudWNXb3dHVEtSZWtleUVycm9yID0gCisgICAgICBwd2RpV293bEVudGVyUGFyYW1zLT53ZGlXb3dsRW50ZXJJbmZvLnVjV293R1RLUmVrZXlFcnJvcjsKKworICAgd293bEVudGVyUmVxLnVjV29XQlNTQ29ubkxvc3MgPSAKKyAgICAgIHB3ZGlXb3dsRW50ZXJQYXJhbXMtPndkaVdvd2xFbnRlckluZm8udWNXb1dCU1NDb25uTG9zczsKKyNlbmRpZiAvLyBXTEFOX1dBS0VVUF9FVkVOVFMKKworICAgd3BhbE1lbW9yeUNvcHkod293bEVudGVyUmVxLm1hZ2ljUHRybiwKKyAgICAgICAgICAgICAgICAgIHB3ZGlXb3dsRW50ZXJQYXJhbXMtPndkaVdvd2xFbnRlckluZm8ubWFnaWNQdHJuLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTaXJNYWNBZGRyKSk7CisKKyAgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICZ3b3dsRW50ZXJSZXEsIAorICAgICAgICAgICAgICAgICAgIHNpemVvZih3b3dsRW50ZXJSZXEpKTsgCisKKyAgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlXb3dsRW50ZXJQYXJhbXMtPndkaVJlcVN0YXR1c0NCOworICAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVdvd2xFbnRlclBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpV293bEVudGVyQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX1dPV0xfRU5URVJfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NXb3dsRW50ZXJSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBXb3dsIGV4aXQgUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00KKyAgICAgICAgYWxsb3dzIGl0KQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzV293bEV4aXRSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfV293bEV4aXRSZXFDYiAgICAgICAgICAgd2RpV293bEV4aXRDYiA9IE5VTEw7CisgICB3cHRfdWludDgqICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSAod2RpV293bEV4aXRDYiAgID0gKFdESV9Xb3dsRXhpdFJlcUNiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9XT1dMX0VYSVRfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBXb3dsIEV4aXQgcmVxICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgd2RpV293bEV4aXRDYik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpV293bEV4aXRDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfV09XTF9FWElUX1JFU1ApOyAKK30vKldESV9Qcm9jZXNzV293bEV4aXRSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBDb25maWd1cmUgQXBwcyBDcHUgV2FrZXVwIFN0YXRlIFJlcXVlc3QgZnVuY3Rpb24KKyAgICAgICAgKGNhbGxlZCB3aGVuIE1haW4gRlNNIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZVJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9Db25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVSZXFQYXJhbXNUeXBlKiAgcHdkaUFwcHNDcHVXYWtldXBTdGF0ZVBhcmFtcyA9IE5VTEw7CisgICBXRElfQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlQ2IgICAgICAgICAgICAgIHdkaUNvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZUNiID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICA9IDA7CisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgICB0SGFsQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlUmVxUGFyYW1zICBoYWxDZmdBcHBzQ3B1V2FrZXVwU3RhdGVSZXFQYXJhbXM7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IChwd2RpQXBwc0NwdVdha2V1cFN0YXRlUGFyYW1zID0gKFdESV9Db25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHdkaUNvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZUNiICAgPSAoV0RJX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZUNiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfQ09ORklHVVJFX0FQUFNfQ1BVX1dBS0VVUF9TVEFURV9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxDZmdBcHBzQ3B1V2FrZXVwU3RhdGVSZXFQYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZihwd2RpQXBwc0NwdVdha2V1cFN0YXRlUGFyYW1zLT5iSXNBcHBzQXdha2UpICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBBcHBzIENQVSBXYWtldXAgU3RhdGUgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaUFwcHNDcHVXYWtldXBTdGF0ZVBhcmFtcywgd2RpQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIGhhbENmZ0FwcHNDcHVXYWtldXBTdGF0ZVJlcVBhcmFtcy5pc0FwcHNDcHVBd2FrZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaUFwcHNDcHVXYWtldXBTdGF0ZVBhcmFtcy0+YklzQXBwc0F3YWtlOworCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAmaGFsQ2ZnQXBwc0NwdVdha2V1cFN0YXRlUmVxUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsQ2ZnQXBwc0NwdVdha2V1cFN0YXRlUmVxUGFyYW1zKSk7IAorCisgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpQXBwc0NwdVdha2V1cFN0YXRlUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlBcHBzQ3B1V2FrZXVwU3RhdGVQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaUNvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZUNiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgV0RJX0NPTkZJR1VSRV9BUFBTX0NQVV9XQUtFVVBfU1RBVEVfUkVTUCk7IAorfS8qV0RJX1Byb2Nlc3NDb25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVSZXEqLworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKy8qKgorIEBicmllZiBQcm9jZXNzIEFnZ3JlZ2F0ZWQgQWRkIFRTcGVjIFJlcXVlc3QgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIE1haW4gRlNNCisgICAgICAgIGFsbG93cyBpdCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0FnZ3JBZGRUU3BlY1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0FnZ3JBZGRUU1JlcVBhcmFtc1R5cGUqICBwd2RpQWdnckFkZFRTUGFyYW1zOworICBXRElfQWdnckFkZFRzUnNwQ2IgICAgICAgICAgIHdkaUFnZ3JBZGRUU1JzcENiOworICB3cHRfdWludDggICAgICAgICAgICAgICAgdWNDdXJyZW50QlNTU2VzSWR4ICA9IDA7IAorICBXRElfQlNTU2Vzc2lvblR5cGUqICAgICAgcEJTU1NlcyAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgID0gTlVMTDsgCisgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgPSAwOworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgd2RpU3RhdHVzICAgICAgICAgICA9IFdESV9TVEFUVVNfU1VDQ0VTUzsgCisgIHdwdF9tYWNBZGRyICAgICAgICAgICAgICBtYWNCU1NJRDsKKyAgdEFnZ3JBZGRUc1JlcSAgICAgICAgICAgIGhhbEFnZ3JBZGRUc1JlcTsKKyAgaW50IGk7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cENCZm5jICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisgIHdwYWxNZW1vcnlGaWxsKCAmaGFsQWdnckFkZFRzUmVxLCBzaXplb2YodEFnZ3JBZGRUc1JlcSksIDAgKTsKKyAgcHdkaUFnZ3JBZGRUU1BhcmFtcyA9IChXRElfQWdnckFkZFRTUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgd2RpQWdnckFkZFRTUnNwQ2IgICA9IChXRElfQWdnckFkZFRzUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYW4gYXNzb2NpYXRpb24sIGlmIHNvIHF1ZXVlLCBpZgorICAgIG5vdCBpdCBtZWFucyBpdCBpcyBmcmVlIHRvIHByb2Nlc3MgcmVxdWVzdCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbmQgdGhlIEJTUyBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZSBhbmQgaWRlbnRpZnkgV0RJIHNlc3Npb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX1NUQVRhYmxlR2V0U3RhQlNTSURBZGRyKHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8udWNTVEFJZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWNCU1NJRCkpCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAiVGhpcyBzdGF0aW9uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBXREkgU3RhdGlvbiBUYWJsZSAlZCIpOworICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgdWNDdXJyZW50QlNTU2VzSWR4ID0gV0RJX0ZpbmRBc3NvY1Nlc3Npb24oIHBXRElDdHgsIG1hY0JTU0lELCAmcEJTU1Nlcyk7IAorICBpZiAoIE5VTEwgPT0gcEJTU1NlcyApIAorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZG9lcyBub3QgeWV0IGV4aXN0Iik7CisKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKyAKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDaGVjayBpZiB0aGlzIEJTUyBpcyBiZWluZyBjdXJyZW50bHkgcHJvY2Vzc2VkIG9yIHF1ZXVlZCwKKyAgICBpZiBxdWV1ZWQgLSBxdWV1ZSB0aGUgbmV3IHJlcXVlc3QgYXMgd2VsbCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBlV0xBTl9QQUxfVFJVRSA9PSBwQlNTU2VzLT5iQXNzb2NSZXFRdWV1ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJBc3NvY2lhdGlvbiBzZXF1ZW5jZSBmb3IgdGhpcyBCU1MgZXhpc3RzIGJ1dCBjdXJyZW50bHkgcXVldWVkIik7CisKKyAgICB3ZGlTdGF0dXMgPSBXRElfUXVldWVBc3NvY1JlcXVlc3QoIHBXRElDdHgsIHBCU1NTZXMsIHBFdmVudERhdGEpOyAKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIHdkaVN0YXR1czsgCisgIH0KKworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgICAhIFRPIERPIDogcHJvcGVyIGNvbnZlcnNpb24gaW50byB0aGUgSEFMIE1lc3NhZ2UgUmVxdWVzdCBGb3JtYXQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfQUdHUl9BRERfVFNfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0QWdnckFkZFRzUGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHRBZ2dyQWRkVHNQYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBzZXQgYnNzIGtleSByZXEgJXggJXggJXgiLAorICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlBZ2dyQWRkVFNQYXJhbXMsIHdkaUFnZ3JBZGRUU1JzcENiKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS5zdGFJZHggPSAKKyAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby51Y1NUQUlkeDsKKyAgaGFsQWdnckFkZFRzUmVxLmFnZ3JBZGRUc1BhcmFtLnRzcGVjSWR4ID0gCisgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8udWNUc3BlY0lkeDsKKworICBmb3IoIGkgPSAwOyBpIDwgV0xBTl9IQUxfTUFYX0FDOyBpKysgKQorICB7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS50eXBlID0gCisgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS51Y1R5cGU7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS5sZW5ndGggPSAKKyAgICAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVjTGVuZ3RoOworICAgICBoYWxBZ2dyQWRkVHNSZXEuYWdnckFkZFRzUGFyYW0udHNwZWNbaV0udHNpbmZvLnRyYWZmaWMuYWNrUG9saWN5ID0gCisgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS53ZGlUU2luZm8ud2RpVHJhZmZpYy4KKyAgICAgICAgYWNrUG9saWN5OworICAgICBoYWxBZ2dyQWRkVHNSZXEuYWdnckFkZFRzUGFyYW0udHNwZWNbaV0udHNpbmZvLnRyYWZmaWMuYWNjZXNzUG9saWN5ID0gCisgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS53ZGlUU2luZm8ud2RpVHJhZmZpYy4KKyAgICAgICAgYWNjZXNzUG9saWN5OworICAgICBoYWxBZ2dyQWRkVHNSZXEuYWdnckFkZFRzUGFyYW0udHNwZWNbaV0udHNpbmZvLnRyYWZmaWMudXNlclByaW8gPSAKKyAgICAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLndkaVRTaW5mby53ZGlUcmFmZmljLgorICAgICAgICB1c2VyUHJpbzsKKyAgICAgaGFsQWdnckFkZFRzUmVxLmFnZ3JBZGRUc1BhcmFtLnRzcGVjW2ldLnRzaW5mby50cmFmZmljLnBzYiA9IAorICAgICAgICBwd2RpQWdnckFkZFRTUGFyYW1zLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0ud2RpVFNpbmZvLndkaVRyYWZmaWMuCisgICAgICAgIHBzYjsKKyAgICAgaGFsQWdnckFkZFRzUmVxLmFnZ3JBZGRUc1BhcmFtLnRzcGVjW2ldLnRzaW5mby50cmFmZmljLmFnZ3JlZ2F0aW9uID0gCisgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS53ZGlUU2luZm8ud2RpVHJhZmZpYy4KKyAgICAgICAgYWdncmVnYXRpb247CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS50c2luZm8udHJhZmZpYy5kaXJlY3Rpb24gPSAKKyAgICAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLndkaVRTaW5mby53ZGlUcmFmZmljLgorICAgICAgICBkaXJlY3Rpb247CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS50c2luZm8udHJhZmZpYy50c2lkID0gCisgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS53ZGlUU2luZm8ud2RpVHJhZmZpYy4KKyAgICAgICAgdHJhZmZpY1R5cGU7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS50c2luZm8udHJhZmZpYy50c2lkID0gCisgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS53ZGlUU2luZm8ud2RpVHJhZmZpYy4KKyAgICAgICAgdHJhZmZpY1R5cGU7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS50c2luZm8uc2NoZWR1bGUucnN2ZCA9IAorICAgICAgICBwd2RpQWdnckFkZFRTUGFyYW1zLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0ud2RpVFNpbmZvLndkaVNjaGVkdWxlLnJzdmQ7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS50c2luZm8uc2NoZWR1bGUuc2NoZWR1bGUgPSAKKyAgICAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLndkaVRTaW5mby53ZGlTY2hlZHVsZS5zY2hlZHVsZTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAKKyAgICAgaGFsQWdnckFkZFRzUmVxLmFnZ3JBZGRUc1BhcmFtLnRzcGVjW2ldLm5vbU1zZHVTeiA9IAorICAgICAgICBwd2RpQWdnckFkZFRTUGFyYW1zLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0udXNOb21Nc2R1U3o7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS5tYXhNc2R1U3ogPSAKKyAgICAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVzTWF4TXNkdVN6OworICAgICBoYWxBZ2dyQWRkVHNSZXEuYWdnckFkZFRzUGFyYW0udHNwZWNbaV0ubWluU3ZjSW50ZXJ2YWwgPSAKKyAgICAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVNaW5TdmNJbnRlcnZhbDsKKyAgICAgaGFsQWdnckFkZFRzUmVxLmFnZ3JBZGRUc1BhcmFtLnRzcGVjW2ldLm1heFN2Y0ludGVydmFsID0gCisgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS51TWF4U3ZjSW50ZXJ2YWw7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS5pbmFjdEludGVydmFsID0gCisgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS51SW5hY3RJbnRlcnZhbDsKKyAgICAgaGFsQWdnckFkZFRzUmVxLmFnZ3JBZGRUc1BhcmFtLnRzcGVjW2ldLnN1c3BlbmRJbnRlcnZhbCA9IAorICAgICAgICBwd2RpQWdnckFkZFRTUGFyYW1zLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0udVN1c3BlbmRJbnRlcnZhbDsKKyAgICAgaGFsQWdnckFkZFRzUmVxLmFnZ3JBZGRUc1BhcmFtLnRzcGVjW2ldLnN2Y1N0YXJ0VGltZSA9IAorICAgICAgICBwd2RpQWdnckFkZFRTUGFyYW1zLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0udVN2Y1N0YXJ0VGltZTsKKyAgICAgaGFsQWdnckFkZFRzUmVxLmFnZ3JBZGRUc1BhcmFtLnRzcGVjW2ldLm1pbkRhdGFSYXRlID0gCisgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS51TWluRGF0YVJhdGU7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS5tZWFuRGF0YVJhdGUgPSAKKyAgICAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVNZWFuRGF0YVJhdGU7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS5wZWFrRGF0YVJhdGUgPSAKKyAgICAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVQZWFrRGF0YVJhdGU7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS5tYXhCdXJzdFN6ID0gCisgICAgICAgIHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPndkaUFnZ3JUc0luZm8ud2RpVHNwZWNJRVtpXS51TWF4QnVyc3RTejsKKyAgICAgaGFsQWdnckFkZFRzUmVxLmFnZ3JBZGRUc1BhcmFtLnRzcGVjW2ldLmRlbGF5Qm91bmQgPSAKKyAgICAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVEZWxheUJvdW5kOworICAgICBoYWxBZ2dyQWRkVHNSZXEuYWdnckFkZFRzUGFyYW0udHNwZWNbaV0ubWluUGh5UmF0ZSA9IAorICAgICAgICBwd2RpQWdnckFkZFRTUGFyYW1zLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0udU1pblBoeVJhdGU7CisgICAgIGhhbEFnZ3JBZGRUc1JlcS5hZ2dyQWRkVHNQYXJhbS50c3BlY1tpXS5zdXJwbHVzQncgPSAKKyAgICAgICAgcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpQWdnclRzSW5mby53ZGlUc3BlY0lFW2ldLnVzU3VycGx1c0J3OworICAgICBoYWxBZ2dyQWRkVHNSZXEuYWdnckFkZFRzUGFyYW0udHNwZWNbaV0ubWVkaXVtVGltZSA9IAorICAgICAgICBwd2RpQWdnckFkZFRTUGFyYW1zLT53ZGlBZ2dyVHNJbmZvLndkaVRzcGVjSUVbaV0udXNNZWRpdW1UaW1lOworICB9CisKKyAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAmaGFsQWdnckFkZFRzUmVxLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxBZ2dyQWRkVHNSZXEpKTsgCisKKyAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaUFnZ3JBZGRUU1BhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlBZ2dyQWRkVFNQYXJhbXMtPnBVc2VyRGF0YTsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2VuZCBBZGQgVFMgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHdkaUFnZ3JBZGRUU1JzcENiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIFdESV9BR0dSX0FERF9UU19SRVNQKTsgCit9LypXRElfUHJvY2Vzc0FnZ3JBZGRUU3BlY1JlcSovCisjZW5kaWYgLyogV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIgKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2h1dGRvd24gUmVxdWVzdCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gTWFpbiBGU00KKyAgICAgICAgYWxsb3dzIGl0KQorCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlCisKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NodXRkb3duUmVxCisoCisgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorICkKK3sKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgIHdwdFN0YXR1czsKKworCisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCBOVUxMID09IHBFdmVudERhdGEgKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKworCisgICBnV0RJSW5pdGlhbGl6ZWQgPSBlV0xBTl9QQUxfRkFMU0U7CisgICAvKiEgVE8gRE86IHN0b3AgdGhlIGRhdGEgc2VydmljZXMgKi8KKyAgIGlmICggZURSSVZFUl9UWVBFX01GRyAhPSBwV0RJQ3R4LT5kcml2ZXJNb2RlICkKKyAgIHsKKyAgICAgIC8qU3RvcCB0aGUgU1RBIFRhYmxlICFVVC0gY2hlY2sgdGhpcyBsb2dpYyBhZ2FpbgorICAgICAgICBJdCBpcyBzYWZlciB0byBkbyBpdCBoZXJlIHRoYW4gb24gdGhlIHJlc3BvbnNlIC0gYmVjYXVzZSBhIHN0b3AgaXMgaW1taW5lbnQqLworICAgICAgV0RJX1NUQVRhYmxlU3RvcChwV0RJQ3R4KTsKKworICAgICAgLyogU3RvcCBUcmFuc3BvcnQgRHJpdmVyLCBEWEUgKi8KKyAgICAgIFdEVFNfU3RvcChwV0RJQ3R4KTsKKyAgIH0KKworICAgLypDbGVhciBhbGwgcGVuZGluZyByZXF1ZXN0Ki8KKyAgIFdESV9DbGVhclBlbmRpbmdSZXF1ZXN0cyhwV0RJQ3R4KTsKKyAgIC8qIENsb3NlIERhdGEgdHJhbnNwb3J0Ki8KKyAgIC8qIEZUTSBtb2RlIGRvZXMgbm90IG9wZW4gRGF0YSBQYXRoICovCisgICBpZiAoIGVEUklWRVJfVFlQRV9NRkcgIT0gcFdESUN0eC0+ZHJpdmVyTW9kZSApCisgICB7CisgICAgICBXRFRTX0Nsb3NlKHBXRElDdHgpOworICAgfQorICAgLypDbG9zZSB0aGUgU1RBIFRhYmxlICFVVC0gY2hlY2sgdGhpcyBsb2dpYyBhZ2FpbiovCisgICBXRElfU1RBVGFibGVDbG9zZShwV0RJQ3R4KTsKKyAgIC8qY2xvc2UgdGhlIFBBTCAqLworICAgd3B0U3RhdHVzID0gd3BhbENsb3NlKHBXRElDdHgtPnBQQUxDb250ZXh0KTsKKyAgIGlmICggZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9ICB3cHRTdGF0dXMgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICJGYWlsZWQgdG8gd3BhbCBDbG9zZSAlZCIsIHdwdFN0YXR1cyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgfQorCisgICAvKlRyYW5zaXRpb24gYmFjayB0byBpbml0IHN0YXRlKi8KKyAgIFdESV9TVEFURV9UUkFOU0lUSU9OKCBwV0RJQ3R4LCBXRElfSU5JVF9TVCk7CisKKyAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAgLypNYWtlIHN1cmUgdGhlIGV4cGVjdGVkIHN0YXRlIGlzIHByb3Blcmx5IGRlZmF1bHRlZCB0byBJbml0Ki8KKyAgIHBXRElDdHgtPnVjRXhwZWN0ZWRTdGF0ZVRyYW5zaXRpb24gPSBXRElfSU5JVF9TVDsgCisKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1NodXRkb3duUmVxKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICBNYWluIERBTCBDb250cm9sIFBhdGggUmVzcG9uc2UgUHJvY2Vzc2luZyBBUEkgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTdGFydCBSZXNwb25zZSBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTdGFydFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXJ0UnNwUGFyYW1zVHlwZSAgIHdkaVJzcFBhcmFtczsKKyAgV0RJX1N0YXJ0UnNwQ2IgICAgICAgICAgIHdkaVN0YXJ0UnNwQ2IgPSBOVUxMOworCisgIHRIYWxNYWNTdGFydFJzcFBhcmFtcyogICBzdGFydFJzcFBhcmFtczsKKworI2lmbmRlZiBIQUxfU0VMRl9TVEFfUEVSX0JTUworICBXRElfQWRkU3RhUGFyYW1zICAgICAgICAgd2RpQWRkU1RBUGFyYW0gPSB7MH07CisjZW5kaWYKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIHdkaVN0YXJ0UnNwQ2IgPSAoV0RJX1N0YXJ0UnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOyAKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSB8fAorICAgICAgKCBOVUxMID09IHdkaVN0YXJ0UnNwQ2IgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggc2l6ZW9mKHRIYWxNYWNTdGFydFJzcFBhcmFtcykgPiBwRXZlbnREYXRhLT51RXZlbnREYXRhU2l6ZSApCisgIHsKKyAgICAgLy8gbm90IGVub3VnaCBkYXRhIHdhcyByZWNlaXZlZAorICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVzcG9uc2UgbGVuZ3RoIGluIFN0YXJ0IFJlc3AgRXhwZWN0ICV4IFJjdmQgJXgiLAorICAgICAgICAgICAgICAgICBzaXplb2YodEhhbE1hY1N0YXJ0UnNwUGFyYW1zKSwgcEV2ZW50RGF0YS0+dUV2ZW50RGF0YVNpemUpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVW5wYWNrIEhBTCBSZXNwb25zZSBNZXNzYWdlIC0gdGhlIGhlYWRlciB3YXMgYWxyZWFkeSBleHRyYWN0ZWQgYnkgdGhlCisgICAgbWFpbiBSZXNwb25zZSBIYW5kbGluZyBwcm9jZWR1cmUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBzdGFydFJzcFBhcmFtcyA9ICh0SGFsTWFjU3RhcnRSc3BQYXJhbXMgKikgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKworICB3ZGlSc3BQYXJhbXMudWNNYXhCc3NpZHMgICA9IHN0YXJ0UnNwUGFyYW1zLT51Y01heEJzc2lkczsKKyAgd2RpUnNwUGFyYW1zLnVjTWF4U3RhdGlvbnMgPSBzdGFydFJzcFBhcmFtcy0+dWNNYXhTdGF0aW9uczsKKyAgd2RpUnNwUGFyYW1zLndsYW5Db21waWxlZFZlcnNpb24ubWFqb3IgPSBXTEFOX0hBTF9WRVJfTUFKT1I7CisgIHdkaVJzcFBhcmFtcy53bGFuQ29tcGlsZWRWZXJzaW9uLm1pbm9yID0gV0xBTl9IQUxfVkVSX01JTk9SOworICB3ZGlSc3BQYXJhbXMud2xhbkNvbXBpbGVkVmVyc2lvbi52ZXJzaW9uID0gV0xBTl9IQUxfVkVSX1ZFUlNJT047CisgIHdkaVJzcFBhcmFtcy53bGFuQ29tcGlsZWRWZXJzaW9uLnJldmlzaW9uID0gV0xBTl9IQUxfVkVSX1JFVklTSU9OOworICB3ZGlSc3BQYXJhbXMud2xhblJlcG9ydGVkVmVyc2lvbi5tYWpvciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRSc3BQYXJhbXMtPndjbnNzV2xhblZlcnNpb24ubWFqb3I7CisgIHdkaVJzcFBhcmFtcy53bGFuUmVwb3J0ZWRWZXJzaW9uLm1pbm9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFJzcFBhcmFtcy0+d2Nuc3NXbGFuVmVyc2lvbi5taW5vcjsKKyAgd2RpUnNwUGFyYW1zLndsYW5SZXBvcnRlZFZlcnNpb24udmVyc2lvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRSc3BQYXJhbXMtPndjbnNzV2xhblZlcnNpb24udmVyc2lvbjsKKyAgd2RpUnNwUGFyYW1zLndsYW5SZXBvcnRlZFZlcnNpb24ucmV2aXNpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UnNwUGFyYW1zLT53Y25zc1dsYW5WZXJzaW9uLnJldmlzaW9uOworICB3cGFsTWVtb3J5Q29weSh3ZGlSc3BQYXJhbXMud2Nuc3NTb2Z0d2FyZVZlcnNpb24sCisgICAgICAgICAgc3RhcnRSc3BQYXJhbXMtPndjbnNzQ3JtVmVyc2lvblN0cmluZywKKyAgICAgICAgICBzaXplb2Yod2RpUnNwUGFyYW1zLndjbnNzU29mdHdhcmVWZXJzaW9uKSk7CisgIHdwYWxNZW1vcnlDb3B5KHdkaVJzcFBhcmFtcy53Y25zc0hhcmR3YXJlVmVyc2lvbiwKKyAgICAgICAgICBzdGFydFJzcFBhcmFtcy0+d2Nuc3NXbGFuVmVyc2lvblN0cmluZywKKyAgICAgICAgICBzaXplb2Yod2RpUnNwUGFyYW1zLndjbnNzSGFyZHdhcmVWZXJzaW9uKSk7CisgIHdkaVJzcFBhcmFtcy53ZGlTdGF0dXMgICAgID0gV0RJX0hBTF8yX1dESV9TVEFUVVMoc3RhcnRSc3BQYXJhbXMtPnN0YXR1cyk7CisKKyAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICBpZiAoIFdESV9TVEFUVVNfU1VDQ0VTUyA9PSB3ZGlSc3BQYXJhbXMud2RpU3RhdHVzICApCisgIHsKKyAgICBwV0RJQ3R4LT51Y0V4cGVjdGVkU3RhdGVUcmFuc2l0aW9uID0gIFdESV9TVEFSVEVEX1NUOworCisgICAgLypDYWNoZSB0aGUgc3RhcnQgcmVzcG9uc2UgZm9yIGZ1cnRoZXIgdXNlKi8KKyAgICB3cGFsTWVtb3J5Q29weSggJnBXRElDdHgtPndkaUNhY2hlZFN0YXJ0UnNwUGFyYW1zICwKKyAgICAgICAgICAgICAgICAgICZ3ZGlSc3BQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBXRElDdHgtPndkaUNhY2hlZFN0YXJ0UnNwUGFyYW1zKSk7CisKKyAgfQorICBlbHNlCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHN0YXJ0IGRldmljZSB3aXRoIHN0YXR1cyAlcyglZCkiLAorICAgICAgICAgICAgICAgV0RJX2dldEhBTFN0YXR1c01zZ1N0cmluZyhzdGFydFJzcFBhcmFtcy0+c3RhdHVzKSwKKyAgICAgICAgICAgICAgIHN0YXJ0UnNwUGFyYW1zLT5zdGF0dXMpOworCisgICAgLypTZXQgdGhlIGV4cGVjdGVkIHN0YXRlIHRyYW5zaXRpb24gdG8gc3RvcHBlZCAtIGJlY2F1c2UgdGhlIHN0YXJ0IGhhcworICAgICAgZmFpbGVkKi8KKyAgICBwV0RJQ3R4LT51Y0V4cGVjdGVkU3RhdGVUcmFuc2l0aW9uID0gIFdESV9TVE9QUEVEX1NUOworCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgICAgIC8qTm90aWZ5IFVNQUMqLworICAgIHdkaVN0YXJ0UnNwQ2IoICZ3ZGlSc3BQYXJhbXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKyAgICAKKyAgICBXRElfRGV0ZWN0ZWREZXZpY2VFcnJvcihwV0RJQ3R4LCB3ZGlSc3BQYXJhbXMud2RpU3RhdHVzKTsKKworICAgIC8qQWx0aG91Z2ggdGhlIHJlc3BvbnNlIGlzIGFuIGVycm9yIC0gaXQgd2FzIHByb2Nlc3NlZCBieSBvdXIgZnVuY3Rpb24KKyAgICBzbyBhcyBmYXIgYXMgdGhlIGNhbGxlciBpcyBjb25jZXJuZWQgdGhpcyBpcyBhIHN1Y2Nlc2Z1bCByZXBvbnNlIHByb2Nlc3NpbmcqLworICAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7CisgIH0KKyAgCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKworICBpZihlRFJJVkVSX1RZUEVfTUZHID09IHBXRElDdHgtPmRyaXZlck1vZGUpCisgIHsKKyAgICAvKiBGVE0gbW9kZSBkb2VzIG5vdCBuZWVkIHRvIGV4ZWN1dGUgYmVsb3cgKi8KKyAgICAvKiBOb3RpZnkgVU1BQyAqLworICAgIHdkaVN0YXJ0UnNwQ2IoICZ3ZGlSc3BQYXJhbXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworICB9CisKKyAgLyogU1RBUlQgdGhlIERhdGEgdHJhbnNwb3J0ICovCisgIFdEVFNfc3RhcnRUcmFuc3BvcnQocFdESUN0eCk7CisKKyAgLypTdGFydCB0aGUgU1RBIFRhYmxlICEtIGNoZWNrIHRoaXMgbG9naWMgYWdhaW4qLworICBXRElfU1RBVGFibGVTdGFydChwV0RJQ3R4KTsKKworI2lmbmRlZiBIQUxfU0VMRl9TVEFfUEVSX0JTUworICAvKiBTdG9yZSB0aGUgU2VsZiBTVEEgSW5kZXggKi8KKyAgcFdESUN0eC0+dWNTZWxmU3RhSWQgPSBoYWxTdGFydFJzcE1zZy5zdGFydFJzcFBhcmFtcy5zZWxmU3RhSWR4OworCisgIHBXRElDdHgtPnVzU2VsZlN0YURwdUlkID0gd2RpUnNwUGFyYW1zLnVzU2VsZlN0YURwdUlkOworICB3cGFsTWVtb3J5Q29weShwV0RJQ3R4LT5tYWNTZWxmU3RhLCB3ZGlSc3BQYXJhbXMubWFjU2VsZlN0YSwKKyAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTik7CisKKyAgLyogQXQgdGhpcyBwb2ludCBhZGQgdGhlIHNlbGYtU1RBICovCisKKyAgLyohIFRPIERPOiB3ZGlBZGRTVEFQYXJhbS5iY2FzdE1nbXREcHVTaWduYXR1cmUgKi8KKyAgLyogIVRPIERPOiB3ZGlBZGRTVEFQYXJhbS5iY2FzdERwdVNpZ25hdHVyZSAqLworICAvKiEgVE8gRE86IHdkaUFkZFNUQVBhcmFtLmRwdVNpZyAqLworICAvKiEgVE8gRE86IHdkaUFkZFNUQVBhcmFtLnVjV21tRW5hYmxlZCAqLworICAvKiEgVE8gRE86IHdkaUFkZFNUQVBhcmFtLnVjSFRDYXBhYmxlICovCisgIC8qISBUTyBETzogd2RpQWRkU1RBUGFyYW0udWNSbWZFbmFibGVkICovCisKKyAgLy9hbGwgRFBVIGluZGljZXMgYXJlIHRoZSBzYW1lIGZvciBzZWxmIFNUQQorICB3ZGlBZGRTVEFQYXJhbS5iY2FzdERwdUluZGV4ID0gd2RpUnNwUGFyYW1zLnVzU2VsZlN0YURwdUlkOworICB3ZGlBZGRTVEFQYXJhbS5iY2FzdE1nbXREcHVJbmRleCA9IHdkaVJzcFBhcmFtcy51c1NlbGZTdGFEcHVJZDsKKyAgd2RpQWRkU1RBUGFyYW0uZHB1SW5kZXggPSB3ZGlSc3BQYXJhbXMudXNTZWxmU3RhRHB1SWQ7OworICB3cGFsTWVtb3J5Q29weSh3ZGlBZGRTVEFQYXJhbS5zdGFNYWNBZGRyLCB3ZGlSc3BQYXJhbXMubWFjU2VsZlN0YSwKKyAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTik7CisgIHdkaUFkZFNUQVBhcmFtLnVjU3RhVHlwZSA9IFdESV9TVEFfRU5UUllfU0VMRjsgLyogMCAtIHNlbGYgKi8KKyAgd2RpQWRkU1RBUGFyYW0udWNTVEFJZHggPSBoYWxTdGFydFJzcE1zZy5zdGFydFJzcFBhcmFtcy5zZWxmU3RhSWR4OworCisgIC8qIE5vdGU6IFNpbmNlIHdlIGRvbid0IGdldCBhbiBleHBsaWNpdCBjb25maWcgU1RBIHJlcXVlc3QgZm9yIHNlbGYgU1RBLCB3ZQorICAgICBhZGQgdGhlIHNlbGYgU1RBIHVwb24gcmVjZWl2aW5nIHRoZSBTdGFydCByZXNwb25zZSBtZXNzYWdlLiBCdXQgdGhlCisgICAgIHNlbGYgU1RBIGVudHJ5IGluIHRoZSB0YWJsZSBpcyBkZWxldGVkIHdoZW4gV0RJIGdldHMgYW4gZXhwbGljaXQgZGVsZXRlIFNUQQorICAgICByZXF1ZXN0ICovCisgICh2b2lkKVdESV9TVEFUYWJsZUFkZFN0YShwV0RJQ3R4LCZ3ZGlBZGRTVEFQYXJhbSk7CisjZW5kaWYKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpU3RhcnRSc3BDYiggJndkaVJzcFBhcmFtcywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NTdGFydFJzcCovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU3RvcCBSZXNwb25zZSBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTdG9wUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgIHdkaVN0YXR1czsKKyAgV0RJX1N0b3BSc3BDYiAgICAgICB3ZGlTdG9wUnNwQ2IgPSBOVUxMOworCisgIHRIYWxNYWNTdG9wUnNwTXNnICAgaGFsTWFjU3RvcFJzcE1zZzsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICB3ZGlTdG9wUnNwQ2IgPSAoV0RJX1N0b3BSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7IAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpIHx8CisgICAgICAoIE5VTEwgPT0gd2RpU3RvcFJzcENiICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIHNpemVvZihoYWxNYWNTdG9wUnNwTXNnKSA8IHBFdmVudERhdGEtPnVFdmVudERhdGFTaXplICkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIkludmFsaWQgcmVzcG9uc2UgbGVuZ3RoIGluIFN0b3AgUmVzcCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+dUV2ZW50RGF0YVNpemUpOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVW5wYWNrIEhBTCBSZXNwb25zZSBNZXNzYWdlIC0gdGhlIGhlYWRlciB3YXMgYWxyZWFkeSBleHRyYWN0ZWQgYnkgdGhlCisgICAgbWFpbiBSZXNwb25zZSBIYW5kbGluZyBwcm9jZWR1cmUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weSggJmhhbE1hY1N0b3BSc3BNc2cuc3RvcFJzcFBhcmFtcywgIAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsTWFjU3RvcFJzcE1zZy5zdG9wUnNwUGFyYW1zKSk7CisKKyAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbE1hY1N0b3BSc3BNc2cuc3RvcFJzcFBhcmFtcy5zdGF0dXMpOyAKKworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENoZWNrIHRvIHNlZSBpZiB0aGUgc3RvcCB3ZW50IE9LIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IHdkaVN0YXR1cyAgKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzdG9wIHRoZSBkZXZpY2Ugd2l0aCBzdGF0dXMgJXMgKCVkKSIsCisgICAgICAgICAgICAgICBXRElfZ2V0SEFMU3RhdHVzTXNnU3RyaW5nKGhhbE1hY1N0b3BSc3BNc2cuc3RvcFJzcFBhcmFtcy5zdGF0dXMpLAorICAgICAgICAgICAgICAgaGFsTWFjU3RvcFJzcE1zZy5zdG9wUnNwUGFyYW1zLnN0YXR1cyk7CisKKyAgICBXRElfRGV0ZWN0ZWREZXZpY2VFcnJvciggcFdESUN0eCwgV0RJX0VSUl9CQVNJQ19PUF9GQUlMVVJFKTsgCisgICAgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKyAgCisgIHBXRElDdHgtPnVjRXhwZWN0ZWRTdGF0ZVRyYW5zaXRpb24gPSBXRElfU1RPUFBFRF9TVDsKKworICAvKlRyYW5zaXRpb24gbm93IGFzIFdESSBtYXkgZ2V0IHByZWVtcHRlZCBpbWVkaWF0ZWx5IGFmdGVyIGl0IHNlbmRzCisgIHVwIHRoZSBTdG9wIFJlc3BvbnNlIGFuZCBpdCB3aWxsIG5vdCBnZXQgdG8gcHJvY2VzcyB0aGUgc3RhdGUgdHJhbnNpdGlvbgorICBmcm9tIE1haW4gUnNwIGZ1bmN0aW9uKi8KKyAgV0RJX1NUQVRFX1RSQU5TSVRJT04oIHBXRElDdHgsIHBXRElDdHgtPnVjRXhwZWN0ZWRTdGF0ZVRyYW5zaXRpb24pOworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyohIFRPIERPOiAtIFNUT1AgdGhlIERhdGEgdHJhbnNwb3J0ICovCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaVN0b3BSc3BDYiggd2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1N0b3BSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBDbG9zZSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQ2xvc2VSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIC8qVGhlcmUgaXMgbm8gY2xvc2UgcmVzcG9uc2UgY29tbWluZyBmcm9tIEhBTCAtIGZ1bmN0aW9uIGp1c3Qga2VwdCBmb3IKKyAgc2ltbWV0cnkgKi8KKyAgV0RJX0FTU0VSVCgwKTsKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0Nsb3NlUnNwKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICBTQ0FOIFJFU1BPTlNFIFBST0NFU1NJTkcgQVBJIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEluaXQgU2NhbiBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzSW5pdFNjYW5Sc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgICAgICB3ZGlTdGF0dXM7CisgIFdESV9Jbml0U2NhblJzcENiICAgICB3ZGlJbml0U2NhblJzcENiOworICB0SGFsSW5pdFNjYW5Sc3BNc2cgICAgaGFsSW5pdFNjYW5Sc3BNc2c7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaUluaXRTY2FuUnNwQ2IgPSAoV0RJX0luaXRTY2FuUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworICBpZiggTlVMTCA9PSB3ZGlJbml0U2NhblJzcENiKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAiJXM6IGNhbGwgYmFjayBmdW5jdGlvbiBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFVucGFjayBIQUwgUmVzcG9uc2UgTWVzc2FnZSAtIHRoZSBoZWFkZXIgd2FzIGFscmVhZHkgZXh0cmFjdGVkIGJ5IHRoZQorICAgIG1haW4gUmVzcG9uc2UgSGFuZGxpbmcgcHJvY2VkdXJlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE1lbW9yeUNvcHkoICZoYWxJbml0U2NhblJzcE1zZy5pbml0U2NhblJzcFBhcmFtcywgCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxJbml0U2NhblJzcE1zZy5pbml0U2NhblJzcFBhcmFtcykpOworCisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxJbml0U2NhblJzcE1zZy5pbml0U2NhblJzcFBhcmFtcy5zdGF0dXMpOyAKKworICBpZiAoIHBXRElDdHgtPmJJbkJtcHMgKQorICB7CisgICAgIC8vIG5vdGlmeSBEVFMgdGhhdCB3ZSBhcmUgZW50ZXJpbmcgRnVsbCBwb3dlcgorICAgICBXRFRTX1NldFBvd2VyU3RhdGUocFdESUN0eCwgV0RUU19QT1dFUl9TVEFURV9GVUxMLCBOVUxMKTsKKyAgfQorCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlJbml0U2NhblJzcENiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzSW5pdFNjYW5Sc3AqLworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFN0YXJ0IFNjYW4gUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1N0YXJ0U2NhblJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXJ0U2NhblJzcFBhcmFtc1R5cGUgICB3ZGlTdGFydFNjYW5QYXJhbXM7CisgIFdESV9TdGFydFNjYW5Sc3BDYiAgICAgICAgICAgd2RpU3RhcnRTY2FuUnNwQ2I7CisgIAorICB0SGFsU3RhcnRTY2FuUnNwTXNnICAgICAgICAgIGhhbFN0YXJ0U2NhblJzcE1zZzsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpU3RhcnRTY2FuUnNwQ2IgPSAoV0RJX1N0YXJ0U2NhblJzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKyAgaWYoIE5VTEwgPT0gd2RpU3RhcnRTY2FuUnNwQ2IpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICIlczogY2FsbCBiYWNrIGZ1bmN0aW9uIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weSggJmhhbFN0YXJ0U2NhblJzcE1zZy5zdGFydFNjYW5Sc3BQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU3RhcnRTY2FuUnNwTXNnLnN0YXJ0U2NhblJzcFBhcmFtcykpOworCisgIHdkaVN0YXJ0U2NhblBhcmFtcy53ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFN0YXJ0U2NhblJzcE1zZy5zdGFydFNjYW5Sc3BQYXJhbXMuc3RhdHVzKTsKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJCisgIHdkaVN0YXJ0U2NhblBhcmFtcy51Y1R4TWdtdFBvd2VyID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFN0YXJ0U2NhblJzcE1zZy5zdGFydFNjYW5Sc3BQYXJhbXMudHhNZ210UG93ZXI7CisgIHdwYWxNZW1vcnlDb3B5KCB3ZGlTdGFydFNjYW5QYXJhbXMuYVN0YXJ0VFNGLCAKKyAgICAgICAgICAgICAgICAgIGhhbFN0YXJ0U2NhblJzcE1zZy5zdGFydFNjYW5Sc3BQYXJhbXMuc3RhcnRUU0YsCisgICAgICAgICAgICAgICAgICAyKTsKKyNlbmRpZiAKKworICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gaGFsU3RhcnRTY2FuUnNwTXNnLnN0YXJ0U2NhblJzcFBhcmFtcy5zdGF0dXMgKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIlN0YXJ0IHNjYW4gZmFpbGVkIHdpdGggc3RhdHVzICVzICglZCkiLAorICAgICAgICAgICAgICBXRElfZ2V0SEFMU3RhdHVzTXNnU3RyaW5nKGhhbFN0YXJ0U2NhblJzcE1zZy5zdGFydFNjYW5Sc3BQYXJhbXMuc3RhdHVzKSwKKyAgICAgICAgICAgICAgaGFsU3RhcnRTY2FuUnNwTXNnLnN0YXJ0U2NhblJzcFBhcmFtcy5zdGF0dXMpOworICAgICAvKiBzZW5kIHRoZSBzdGF0dXMgdG8gVU1BQywgZG9uJ3QgcmV0dXJuIGZyb20gaGVyZSovCisgIH0KKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpU3RhcnRTY2FuUnNwQ2IoICZ3ZGlTdGFydFNjYW5QYXJhbXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKKworfS8qV0RJX1Byb2Nlc3NTdGFydFNjYW5Sc3AqLworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEVuZCBTY2FuIFJlc3BvbnNlIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIAorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NFbmRTY2FuUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgICAgd2RpU3RhdHVzOworICB0SGFsRW5kU2NhblJzcE1zZyAgICAgaGFsRW5kU2NhblJzcE1zZzsKKyAgV0RJX0VuZFNjYW5Sc3BDYiAgICAgIHdkaUVuZFNjYW5Sc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlFbmRTY2FuUnNwQ2IgPSAoV0RJX0VuZFNjYW5Sc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weSggJmhhbEVuZFNjYW5Sc3BNc2cuZW5kU2NhblJzcFBhcmFtcywgCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxFbmRTY2FuUnNwTXNnLmVuZFNjYW5Sc3BQYXJhbXMpKTsKKworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsRW5kU2NhblJzcE1zZy5lbmRTY2FuUnNwUGFyYW1zLnN0YXR1cyk7IAorCisgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBoYWxFbmRTY2FuUnNwTXNnLmVuZFNjYW5Sc3BQYXJhbXMuc3RhdHVzICkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJFbmQgU2NhbiBmYWlsZWQgd2l0aCBzdGF0dXMgJXMgKCVkICkiLAorICAgICAgICAgICAgICBXRElfZ2V0SEFMU3RhdHVzTXNnU3RyaW5nKGhhbEVuZFNjYW5Sc3BNc2cuZW5kU2NhblJzcFBhcmFtcy5zdGF0dXMpLAorICAgICAgICAgICAgICBoYWxFbmRTY2FuUnNwTXNnLmVuZFNjYW5Sc3BQYXJhbXMuc3RhdHVzKTsKKyAgICAgLyogc2VuZCB0aGUgc3RhdHVzIHRvIFVNQUMsIGRvbid0IHJldHVybiBmcm9tIGhlcmUqLworICB9CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUVuZFNjYW5Sc3BDYiggd2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0VuZFNjYW5Sc3AqLworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEZpbmlzaCBTY2FuIFJlc3BvbnNlIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIAorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NGaW5pc2hTY2FuUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKSAgCit7CisgIFdESV9TdGF0dXMgICAgICAgICAgICB3ZGlTdGF0dXM7CisgIFdESV9GaW5pc2hTY2FuUnNwQ2IgICB3ZGlGaW5pc2hTY2FuUnNwQ2I7CisgIAorICB0SGFsRmluaXNoU2NhblJzcE1zZyAgaGFsRmluaXNoU2NhblJzcE1zZzsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpRmluaXNoU2NhblJzcENiID0gKFdESV9GaW5pc2hTY2FuUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE1lbW9yeUNvcHkoICh2b2lkICopJmhhbEZpbmlzaFNjYW5Sc3BNc2cuZmluaXNoU2NhblJzcFBhcmFtcy5zdGF0dXMsIAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsRmluaXNoU2NhblJzcE1zZy5maW5pc2hTY2FuUnNwUGFyYW1zLnN0YXR1cykpOworCisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxGaW5pc2hTY2FuUnNwTXNnLmZpbmlzaFNjYW5Sc3BQYXJhbXMuc3RhdHVzKTsgCisKKyAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgICAgICAgICAgICAiRmluaXNoIHNjYW4gcmVzcG9uc2UgcmVwb3J0ZWQgc3RhdHVzOiAlZCIsIAorICAgICAgICAgICAgICBoYWxGaW5pc2hTY2FuUnNwTXNnLmZpbmlzaFNjYW5Sc3BQYXJhbXMuc3RhdHVzKTsKKworICBpZiAoKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IGhhbEZpbmlzaFNjYW5Sc3BNc2cuZmluaXNoU2NhblJzcFBhcmFtcy5zdGF0dXMgKSYmCisgICAgICAoIGVIQUxfU1RBVFVTX05PVElGWV9CU1NfRkFJTCAgIT0gaGFsRmluaXNoU2NhblJzcE1zZy5maW5pc2hTY2FuUnNwUGFyYW1zLnN0YXR1cyApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkZpbmlzaCBTY2FuIGZhaWxlZCB3aXRoIHN0YXR1cyAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgV0RJX2dldEhBTFN0YXR1c01zZ1N0cmluZyhoYWxGaW5pc2hTY2FuUnNwTXNnLmZpbmlzaFNjYW5Sc3BQYXJhbXMuc3RhdHVzKSwKKyAgICAgICAgICAgICAgaGFsRmluaXNoU2NhblJzcE1zZy5maW5pc2hTY2FuUnNwUGFyYW1zLnN0YXR1cyk7CisgICAgIC8qIHNlbmQgdGhlIHN0YXR1cyB0byBVTUFDLCBkb24ndCByZXR1cm4gZnJvbSBoZXJlKi8KKyAgfQorCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlGaW5pc2hTY2FuUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NGaW5pc2hTY2FuUnNwKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgSm9pbiBSZXNwb25zZSBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NKb2luUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgICAgICAgICAgICB3ZGlTdGF0dXM7CisgIFdESV9Kb2luUnNwQ2IgICAgICAgICAgICAgICAgIHdkaUpvaW5Sc3BDYjsKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgICAgICAgcEJTU1NlcyAgICAgICAgICAgICA9IE5VTEw7CisgIAorICB0SGFsSm9pblJzcE1zZyAgICAgICAgICAgICAgICBoYWxKb2luUnNwTXNnOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8CisgICAgICAoIE5VTEwgPT0gcFdESUN0eC0+cGZuY1JzcENCICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlKb2luUnNwQ2IgPSAoV0RJX0pvaW5Sc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weSggJmhhbEpvaW5Sc3BNc2cuam9pblJzcFBhcmFtcywgCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxKb2luUnNwTXNnLmpvaW5Sc3BQYXJhbXMpKTsKKworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsSm9pblJzcE1zZy5qb2luUnNwUGFyYW1zLnN0YXR1cyk7IAorCisgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgSm9pbiByZXNwb25zZSBjYW4gb25seSBiZSByZWNlaXZlZCBmb3IgYW4gZXhpc3RpbmcgYXNzb2MgdGhhdAorICAgIGlzIGN1cnJlbnQgYW5kIGluIHByb2dyZXNzIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggIVdESV9WQUxJRF9TRVNTSU9OX0lEWChwV0RJQ3R4LT51Y0N1cnJlbnRCU1NTZXNJZHggKSkgfHwgCisgICAgICAoIGVXTEFOX1BBTF9GQUxTRSA9PSBwV0RJQ3R4LT5iQXNzb2NpYXRpb25JblByb2dyZXNzICkpCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIHNlcXVlbmNlIGZvciB0aGlzIEJTUyBkb2VzIG5vdCB5ZXQgZXhpc3Qgb3IgIgorICAgICAgICAgICAgICAiYXNzb2NpYXRpb24gbm8gbG9uZ2VyIGluIHByb2dyZXNzIC0gbXlzdGVyaW91cyBIQUwgcmVzcG9uc2UiKTsKKworICAgIFdESV9EZXRlY3RlZERldmljZUVycm9yKCBwV0RJQ3R4LCBXRElfRVJSX0JBU0lDX09QX0ZBSUxVUkUpOyAKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworICBwQlNTU2VzID0gJnBXRElDdHgtPmFCU1NTZXNzaW9uc1twV0RJQ3R4LT51Y0N1cnJlbnRCU1NTZXNJZHhdOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBKb2luIFJlc3BvbnNlIGlzIG9ubHkgYWxsb3dlZCBpbiBpbml0IHN0YXRlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0RJX0FTU09DX0pPSU5JTkdfU1QgIT0gcEJTU1Nlcy0+d2RpQXNzb2NTdGF0ZSkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiSm9pbiBvbmx5IGFsbG93ZWQgaW4gSm9pbmluZyBzdGF0ZSAtIGZhaWx1cmUgc3RhdGUgaXMgJWQgIgorICAgICAgICAgICAgICAic3RyYW5nZSBIQUwgcmVzcG9uc2UiLCBwQlNTU2VzLT53ZGlBc3NvY1N0YXRlKTsKKworICAgIFdESV9EZXRlY3RlZERldmljZUVycm9yKCBwV0RJQ3R4LCBXRElfRVJSX0JBU0lDX09QX0ZBSUxVUkUpOyAKKyAgICAKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgIH0KKworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJZiBhc3NvYyBoYXMgZmFpbGVkIHRoZSBjdXJyZW50IHNlc3Npb24gd2lsbCBiZSBkZWxldGVkIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IHdkaVN0YXR1cyApCisgIHsKKyAgICAvKkFzc29jaWF0aW9uIHdhcyBmYWlsZWQgYnkgSEFMIC0gcmVtb3ZlIHNlc3Npb24qLworICAgIFdESV9EZWxldGVTZXNzaW9uKHBXRElDdHgsIHBCU1NTZXMpOworCisgICAgLypBc3NvY2lhdGlvbiBubyBsb25nZXIgaW4gcHJvZ3Jlc3MgICovCisgICAgcFdESUN0eC0+YkFzc29jaWF0aW9uSW5Qcm9ncmVzcyA9IGVXTEFOX1BBTF9GQUxTRTsKKworICAgIC8qQXNzb2NpYXRpb24gbm8gbG9uZ2VyIGluIHByb2dyZXNzIC0gcHJlcGFyZSBwZW5kaW5nIGFzc29jIGZvciBwcm9jZXNzaW5nKi8KKyAgICBXRElfRGVxdWV1ZUFzc29jUmVxdWVzdChwV0RJQ3R4KTsKKyAgCisgIH0KKyAgZWxzZQorICB7CisgICAgLypUcmFuc2l0aW9uIHRvIHN0YXRlIEpvaW5pbmcgLSB0aGlzIG1heSBiZSByZWR1bmRhbnQgYXMgd2UgYXJlIHN1cHBvc2VkCisgICAgICB0byBiZSBpbiB0aGlzIHN0YXRlIGFscmVhZHkgLSBidXQganVzdCB0byBiZSBzYWZlKi8KKyAgICBwQlNTU2VzLT53ZGlBc3NvY1N0YXRlID0gV0RJX0FTU09DX0pPSU5JTkdfU1Q7IAorICB9CisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlKb2luUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NKb2luUnNwKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBDb25maWcgQlNTIFJlc3BvbnNlIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIAorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NDb25maWdCU1NSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9Db25maWdCU1NSc3BQYXJhbXNUeXBlICAgIHdkaUNvbmZpZ0JTU1BhcmFtczsKKyAgV0RJX0NvbmZpZ0JTU1JzcENiICAgICAgICAgICAgd2RpQ29uZmlnQlNTUnNwQ2I7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgPSAwOyAKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgICAgICAgcEJTU1NlcyAgICAgICAgICAgICA9IE5VTEw7CisKKyAgdENvbmZpZ0Jzc1JzcE1zZyAgICAgICAgICAgICAgaGFsQ29uZmlnQnNzUnNwTXNnOyAKKyAgV0RJX0FkZFN0YVBhcmFtcyAgICAgICAgICAgICAgd2RpQmNhc3RBZGRTVEFQYXJhbSA9IHswfTsKKyAgV0RJX0FkZFN0YVBhcmFtcyAgICAgICAgICAgICAgd2RpQWRkU1RBUGFyYW0gPSB7MH07CisgIAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlDb25maWdCU1NSc3BDYiA9IChXRElfQ29uZmlnQlNTUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQyAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMpKTsKKworICB3ZGlDb25maWdCU1NQYXJhbXMud2RpU3RhdHVzID0gV0RJX0hBTF8yX1dESV9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcy5zdGF0dXMpOworICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgPT0gd2RpQ29uZmlnQlNTUGFyYW1zLndkaVN0YXR1cykKKyAgeworICAgIHdwYWxNZW1vcnlDb3B5KCB3ZGlDb25maWdCU1NQYXJhbXMubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICBwV0RJQ3R4LT53ZGlDYWNoZWRDb25maWdCc3NSZXEud2RpUmVxSW5mby5tYWNCU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTik7CisgIAorICAgIHdkaUNvbmZpZ0JTU1BhcmFtcy51Y0JTU0lkeCA9IGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMuYnNzSWR4OworICAKKyAgICB3ZGlDb25maWdCU1NQYXJhbXMudWNCY2FzdFNpZyA9IAorICAgICAgIGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMuYmNhc3REcHVTaWduYXR1cmU7CisgIAorICAgIHdkaUNvbmZpZ0JTU1BhcmFtcy51Y1VjYXN0U2lnID0gCisgICAgICAgaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcy51Y2FzdERwdVNpZ25hdHVyZTsKKyAgCisgICAgd2RpQ29uZmlnQlNTUGFyYW1zLnVjU1RBSWR4ID0gaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcy5ic3NTdGFJZHg7CisgIAorICAjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICAgIHdkaUNvbmZpZ0JTU1BhcmFtcy51Y1R4TWdtdFBvd2VyID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcy50eE1nbXRQb3dlcjsKKyAgI2VuZGlmCisgICAgIHdwYWxNZW1vcnlDb3B5KCB3ZGlDb25maWdCU1NQYXJhbXMubWFjU1RBLAorICAgICAgICAgICAgICAgICAgICAgaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcy5zdGFNYWMsCisgICAgICAgICAgICAgICAgICAgICBXRElfTUFDX0FERFJfTEVOICk7CisgIAorICAgIHdwYWxNdXRleEFjcXVpcmUoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgRmluZCB0aGUgQlNTIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgdWNDdXJyZW50QlNTU2VzSWR4ID0gV0RJX0ZpbmRBc3NvY1Nlc3Npb24oIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlDb25maWdCU1NQYXJhbXMubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQlNTU2VzKTsgCisgIAorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIENvbmZpZyBCU1MgcmVzcG9uc2UgY2FuIG9ubHkgYmUgcmVjZWl2ZWQgZm9yIGFuIGV4aXN0aW5nIGFzc29jIHRoYXQKKyAgICAgIGlzIGN1cnJlbnQgYW5kIGluIHByb2dyZXNzIAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggTlVMTCA9PSBwQlNTU2VzICkKKyAgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCAiCisgICAgICAgICAgICAgICAgIi0gbXlzdGVyaW91cyBIQUwgcmVzcG9uc2UiKTsKKyAgCisgICAgICBXRElfRGV0ZWN0ZWREZXZpY2VFcnJvciggcFdESUN0eCwgV0RJX0VSUl9CQVNJQ19PUF9GQUlMVVJFKTsgCisgICAgICAKKyAgICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgIH0KKyAgCisgICAgLypTYXZlIGRhdGEgZm9yIHRoaXMgQlNTKi8KKyAgICBwQlNTU2VzLT53ZGlCc3NUeXBlID0gcFdESUN0eC0+d2RpQ2FjaGVkQ29uZmlnQnNzUmVxLndkaVJlcUluZm8ud2RpQlNTVHlwZTsKKyAgICBwQlNTU2VzLT51Y0JTU0lkeCA9IGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMuYnNzSWR4OworICAgIHBCU1NTZXMtPmJjYXN0RHB1SW5kZXggICAgID0gCisgICAgICBoYWxDb25maWdCc3NSc3BNc2cuY29uZmlnQnNzUnNwUGFyYW1zLmJjYXN0RHB1RGVzY0luZHg7CisgICAgcEJTU1Nlcy0+YmNhc3REcHVTaWduYXR1cmUgPSAKKyAgICAgIGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMuYmNhc3REcHVTaWduYXR1cmU7CisgICAgcEJTU1Nlcy0+YmNhc3RNZ210RHB1SW5kZXggPSAKKyAgICAgIGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMubWdtdERwdURlc2NJbmR4OworICAgIHBCU1NTZXMtPmJjYXN0TWdtdERwdVNpZ25hdHVyZSA9IAorICAgICAgaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcy5tZ210RHB1U2lnbmF0dXJlOworICAgIHBCU1NTZXMtPnVjUm1mRW5hYmxlZCAgICAgID0gCisgICAgICBwV0RJQ3R4LT53ZGlDYWNoZWRDb25maWdCc3NSZXEud2RpUmVxSW5mby51Y1JNRkVuYWJsZWQ7CisgICAgcEJTU1Nlcy0+YmNhc3RTdGFJZHggPQorICAgICAgIGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMuYnNzQmNhc3RTdGFJZHg7CisgIAorICAgIC8qICFUTyBETzogU2h1b3VsZCB3ZSBiZSB1cGRhdGluZyB0aGUgUk1GIENhcGFiaWxpdHkgb2Ygc2VsZiBTVEEgaGVyZT8gKi8KKyAgCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIEFkZCBQZWVyIFNUQQorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgd2RpQWRkU1RBUGFyYW0udWNTVEFJZHggPSBoYWxDb25maWdCc3NSc3BNc2cuY29uZmlnQnNzUnNwUGFyYW1zLmJzc1N0YUlkeDsgCisgICAgd2RpQWRkU1RBUGFyYW0uZHB1SW5kZXggPSBoYWxDb25maWdCc3NSc3BNc2cuY29uZmlnQnNzUnNwUGFyYW1zLmRwdURlc2NJbmR4OworICAgIHdkaUFkZFNUQVBhcmFtLmRwdVNpZyAgID0gaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcy51Y2FzdERwdVNpZ25hdHVyZTsKKyAgICAgCisgICAgIC8qVGhpcyBpbmZvIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgY2FjaGVkIGluaXRpYWwgcmVxdWVzdCovCisgICAgd2RpQWRkU1RBUGFyYW0udWNXbW1FbmFibGVkID0gCisgICAgICAgIHBXRElDdHgtPndkaUNhY2hlZENvbmZpZ0Jzc1JlcS53ZGlSZXFJbmZvLndkaVNUQUNvbnRleHQudWNXTU1FbmFibGVkOworICAgIHdkaUFkZFNUQVBhcmFtLnVjSFRDYXBhYmxlICA9IAorICAgICAgICBwV0RJQ3R4LT53ZGlDYWNoZWRDb25maWdCc3NSZXEud2RpUmVxSW5mby53ZGlTVEFDb250ZXh0LnVjSFRDYXBhYmxlOyAKKyAgICB3ZGlBZGRTVEFQYXJhbS51Y1N0YVR5cGUgICAgPSAKKyAgICAgICAgcFdESUN0eC0+d2RpQ2FjaGVkQ29uZmlnQnNzUmVxLndkaVJlcUluZm8ud2RpU1RBQ29udGV4dC53ZGlTVEFUeXBlOyAgCisgIAorICAgICAvKiBNQUMgQWRkcmVzcyBvZiBTVEEgKi8KKyAgICB3cGFsTWVtb3J5Q29weSh3ZGlBZGRTVEFQYXJhbS5zdGFNYWNBZGRyLCAKKyAgICAgICAgICAgICAgICAgICBoYWxDb25maWdCc3NSc3BNc2cuY29uZmlnQnNzUnNwUGFyYW1zLnN0YU1hYywgCisgICAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTik7CisgIAorICAgIHdwYWxNZW1vcnlDb3B5KHdkaUFkZFNUQVBhcmFtLm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgICBwV0RJQ3R4LT53ZGlDYWNoZWRDb25maWdCc3NSZXEud2RpUmVxSW5mby53ZGlTVEFDb250ZXh0Lm1hY0JTU0lEICwgCisgICAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTik7IAorICAgICAKKyAgICAvKkFkZCBCU1Mgc3BlY2lmaWMgcGFyYW1ldGVycyovCisgICAgd2RpQWRkU1RBUGFyYW0uYmNhc3RNZ210RHB1SW5kZXggICAgID0gCisgICAgICAgIGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMubWdtdERwdURlc2NJbmR4OworICAgIHdkaUFkZFNUQVBhcmFtLmJjYXN0TWdtdERwdVNpZ25hdHVyZSA9IAorICAgICAgICBoYWxDb25maWdCc3NSc3BNc2cuY29uZmlnQnNzUnNwUGFyYW1zLm1nbXREcHVTaWduYXR1cmU7CisgICAgd2RpQWRkU1RBUGFyYW0uYmNhc3REcHVJbmRleCAgICAgICAgID0gCisgICAgICAgIGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMuYmNhc3REcHVEZXNjSW5keDsKKyAgICB3ZGlBZGRTVEFQYXJhbS5iY2FzdERwdVNpZ25hdHVyZSAgICAgPSAKKyAgICAgICAgaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcy5iY2FzdERwdVNpZ25hdHVyZTsKKyAgICB3ZGlBZGRTVEFQYXJhbS51Y1JtZkVuYWJsZWQgICAgICAgICAgPSAgCisgICAgICAgIHBXRElDdHgtPndkaUNhY2hlZENvbmZpZ0Jzc1JlcS53ZGlSZXFJbmZvLnVjUk1GRW5hYmxlZDsKKyAgICB3ZGlBZGRTVEFQYXJhbS51Y0JTU0lkeCA9IAorICAgICAgIGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMuYnNzSWR4OworICAKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgIkFkZCBTVEEgdG8gdGhlIHRhYmxlIGluZGV4OiAlZCIsIHdkaUFkZFNUQVBhcmFtLnVjU1RBSWR4ICk7CisgIAorICAgIFdESV9TVEFUYWJsZUFkZFN0YShwV0RJQ3R4LCZ3ZGlBZGRTVEFQYXJhbSk7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIEFkZCBCcm9hZGNhc3QgU1RBIG9ubHkgaW4gQVAgbW9kZQorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYoIHBXRElDdHgtPndkaUNhY2hlZENvbmZpZ0Jzc1JlcS53ZGlSZXFJbmZvLnVjT3Blck1vZGUgPT0gCisgICAgICAgIFdESV9CU1NfT1BFUkFUSU9OQUxfTU9ERV9BUCApCisgICAgeworICAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICJBZGQgQkNBU1QgU1RBIHRvIHRhYmxlIGZvciBpbmRleDogJWQiLAorICAgICAgICAgICAgICAgICAgaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcy5ic3NCY2FzdFN0YUlkeCApOworICAKKyAgICAgICB3cGFsTWVtb3J5Q29weSggJndkaUJjYXN0QWRkU1RBUGFyYW0sICZ3ZGlBZGRTVEFQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXRElfQWRkU3RhUGFyYW1zKSApOworICAKKyAgICAgICBXRElfQWRkQmNhc3RTVEF0b1NUQVRhYmxlKCBwV0RJQ3R4LCAmd2RpQmNhc3RBZGRTVEFQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxDb25maWdCc3NSc3BNc2cuY29uZmlnQnNzUnNwUGFyYW1zLmJzc0JjYXN0U3RhSWR4ICk7CisgICAgfQorICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIkNvbmZpZyBCU1MgUlNQIGZhaWxlZCB3aXRoIHN0YXR1cyA6ICVzKCVkKSIsCisgICAgICAgICAgICAgICAgICBXRElfZ2V0SEFMU3RhdHVzTXNnU3RyaW5nKAorICAgICAgICAgICAgICAgICAgaGFsQ29uZmlnQnNzUnNwTXNnLmNvbmZpZ0Jzc1JzcFBhcmFtcy5zdGF0dXMpLCAKKyAgICAgICAgICAgICAgICAgIGhhbENvbmZpZ0Jzc1JzcE1zZy5jb25maWdCc3NSc3BQYXJhbXMuc3RhdHVzKTsKKworICAgIAorICAgIC8qQXNzb2NpYXRpb24gd2FzIGZhaWxlZCBieSBIQUwgLSByZW1vdmUgc2Vzc2lvbiovCisgICAgV0RJX0RlbGV0ZVNlc3Npb24ocFdESUN0eCwgcEJTU1Nlcyk7CisKKyAgICAvKkFzc29jaWF0aW9uIG5vIGxvbmdlciBpbiBwcm9ncmVzcyAgKi8KKyAgICBwV0RJQ3R4LT5iQXNzb2NpYXRpb25JblByb2dyZXNzID0gZVdMQU5fUEFMX0ZBTFNFOworCisgICAgLypBc3NvY2lhdGlvbiBubyBsb25nZXIgaW4gcHJvZ3Jlc3MgLSBwcmVwYXJlIHBlbmRpbmcgYXNzb2MgZm9yIHByb2Nlc3NpbmcqLworICAgIFdESV9EZXF1ZXVlQXNzb2NSZXF1ZXN0KHBXRElDdHgpOworCisgIH0KKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpQ29uZmlnQlNTUnNwQ2IoICZ3ZGlDb25maWdCU1NQYXJhbXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzQ29uZmlnQlNTUnNwKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBEZWwgQlNTIFJlc3BvbnNlIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0RlbEJTU1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0RlbEJTU1JzcFBhcmFtc1R5cGUgICAgICAgd2RpRGVsQlNTUGFyYW1zOworICBXRElfRGVsQlNTUnNwQ2IgICAgICAgICAgICAgICB3ZGlEZWxCU1NSc3BDYjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgICAgdWNDdXJyZW50QlNTU2VzSWR4ICA9IDA7IAorICBXRElfQlNTU2Vzc2lvblR5cGUqICAgICAgICAgICBwQlNTU2VzICAgICAgICAgICAgID0gTlVMTDsKKworICB0RGVsZXRlQnNzUnNwTXNnICAgICAgICAgICAgICBoYWxEZWxCc3NSc3BNc2c7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlEZWxCU1NSc3BDYiA9IChXRElfRGVsQlNTUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQyAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsRGVsQnNzUnNwTXNnLmRlbGV0ZUJzc1JzcFBhcmFtcywgCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxEZWxCc3NSc3BNc2cuZGVsZXRlQnNzUnNwUGFyYW1zKSk7CisKKworICB3ZGlEZWxCU1NQYXJhbXMud2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsRGVsQnNzUnNwTXNnLmRlbGV0ZUJzc1JzcFBhcmFtcy5zdGF0dXMpOyAKKworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGaW5kIHRoZSBCU1MgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uQnlCU1NJZHgoIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxEZWxCc3NSc3BNc2cuZGVsZXRlQnNzUnNwUGFyYW1zLmJzc0lkeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQlNTU2VzKTsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIERlbCBCU1MgcmVzcG9uc2UgY2FuIG9ubHkgYmUgcmVjZWl2ZWQgZm9yIGFuIGV4aXN0aW5nIGFzc29jIHRoYXQKKyAgICBpcyBjdXJyZW50IGFuZCBpbiBwcm9ncmVzcyAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggTlVMTCA9PSBwQlNTU2VzICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCBvciAiCisgICAgICAgICAgICAgICJhc3NvY2lhdGlvbiBubyBsb25nZXIgaW4gcHJvZ3Jlc3MgLSBteXN0ZXJpb3VzIEhBTCByZXNwb25zZSIpOworCisgICAgV0RJX0RldGVjdGVkRGV2aWNlRXJyb3IoIHBXRElDdHgsIFdESV9FUlJfQkFTSUNfT1BfRkFJTFVSRSk7IAorICAgIAorICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qRXh0cmFjdCBCU1NJRCBmb3IgdGhlIHJlc3BvbnNlIHRvIFVNQUMqLworICB3cGFsTWVtb3J5Q29weSh3ZGlEZWxCU1NQYXJhbXMubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICBwQlNTU2VzLT5tYWNCU1NJRCwgV0RJX01BQ19BRERSX0xFTik7CisKKyAgd2RpRGVsQlNTUGFyYW1zLnVjQnNzSWR4ID0gaGFsRGVsQnNzUnNwTXNnLmRlbGV0ZUJzc1JzcFBhcmFtcy5ic3NJZHg7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRoZSBjdXJyZW50IHNlc3Npb24gd2lsbCBiZSBkZWxldGVkIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFdESV9EZWxldGVTZXNzaW9uKHBXRElDdHgsIHBCU1NTZXMpOworCisgIC8qIERlbGV0ZSB0aGUgQkNBU1QgU1RBIGVudHJ5IGZyb20gdGhlIFNUQSB0YWJsZSBpZiBTQVAvR08gc2Vzc2lvbiBpcyBkZWxldGVkICovCisgIGlmKFdESV9JTkZSQV9BUF9NT0RFID09IHBCU1NTZXMtPndkaUJzc1R5cGUpCisgIHsKKyAgICAodm9pZClXRElfU1RBVGFibGVEZWxTdGEoIHBXRElDdHgsIHBCU1NTZXMtPmJjYXN0U3RhSWR4ICk7CisgIH0KKyAgCisgICAvKiBEZWxldGUgdGhlIFNUQSdzIGluIHRoaXMgQlNTICovCisgIFdESV9TVEFUYWJsZUJTU0RlbFN0YShwV0RJQ3R4LCBoYWxEZWxCc3NSc3BNc2cuZGVsZXRlQnNzUnNwUGFyYW1zLmJzc0lkeCk7CisgIAorICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaURlbEJTU1JzcENiKCAmd2RpRGVsQlNTUGFyYW1zLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0RlbEJTU1JzcCovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFBvc3QgQXNzb2MgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1Bvc3RBc3NvY1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1Bvc3RBc3NvY1JzcFBhcmFtc1R5cGUgICAgd2RpUG9zdEFzc29jUGFyYW1zOworICBXRElfUG9zdEFzc29jUnNwQ2IgICAgICAgICAgICB3ZGlQb3N0QXNzb2NSc3BDYjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgICAgdWNDdXJyZW50QlNTU2VzSWR4ICAgICA9IDA7IAorICBXRElfQlNTU2Vzc2lvblR5cGUqICAgICAgICAgICBwQlNTU2VzICAgICAgICAgICAgICAgID0gTlVMTDsKKyAgdFBvc3RBc3NvY1JzcE1zZyAgICAgICAgICAgICAgaGFsUG9zdEFzc29jUnNwTXNnOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpUG9zdEFzc29jUnNwQ2IgPSAoV0RJX1Bvc3RBc3NvY1JzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsUG9zdEFzc29jUnNwTXNnLnBvc3RBc3NvY1JzcFBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFBvc3RBc3NvY1JzcE1zZy5wb3N0QXNzb2NSc3BQYXJhbXMpKTsKKworICAvKkV4dHJhY3QgdGhlIFBvc3QgQXNzb2MgU1RBIFBhcmFtcyAqLworCisgIHdkaVBvc3RBc3NvY1BhcmFtcy5zdGFQYXJhbXMudWNTVEFJZHggICA9IAorICAgIGhhbFBvc3RBc3NvY1JzcE1zZy5wb3N0QXNzb2NSc3BQYXJhbXMuY29uZmlnU3RhUnNwUGFyYW1zLnN0YUlkeDsKKyAgd2RpUG9zdEFzc29jUGFyYW1zLnN0YVBhcmFtcy51Y1VjYXN0U2lnID0gCisgICAgaGFsUG9zdEFzc29jUnNwTXNnLnBvc3RBc3NvY1JzcFBhcmFtcy5jb25maWdTdGFSc3BQYXJhbXMudWNVY2FzdFNpZzsKKyAgd2RpUG9zdEFzc29jUGFyYW1zLnN0YVBhcmFtcy51Y0JjYXN0U2lnID0gCisgICAgaGFsUG9zdEFzc29jUnNwTXNnLnBvc3RBc3NvY1JzcFBhcmFtcy5jb25maWdTdGFSc3BQYXJhbXMudWNCY2FzdFNpZzsKKworIHdkaVBvc3RBc3NvY1BhcmFtcy53ZGlTdGF0dXMgPSAKKyAgICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxQb3N0QXNzb2NSc3BNc2cucG9zdEFzc29jUnNwUGFyYW1zLmNvbmZpZ1N0YVJzcFBhcmFtcy5zdGF0dXMpOyAKKworIC8qQ29weSB0aGUgTUFDIGFkZHJlc3NlcyBmcm9tIHRoZSBjYWNoZWQgc3RvcmFnZSBpbiB0aGUgV0RJIENCIGFzIHRoZXkgYXJlIG5vdAorICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlICovCisgIHdwYWxNZW1vcnlDb3B5KCB3ZGlQb3N0QXNzb2NQYXJhbXMuc3RhUGFyYW1zLm1hY1NUQSwgCisgICAgICAgICAgICAgICAgICBwV0RJQ3R4LT53ZGlDYWNoZWRQb3N0QXNzb2NSZXEud2RpU1RBUGFyYW1zLm1hY1NUQSwgCisgICAgICAgICAgICAgICAgICBXRElfTUFDX0FERFJfTEVOKTsKKworICAvKiBFeHRyYWN0IFBvc3QgQXNzb2MgQlNTIFBhcmFtcyAqLworCisgIHdwYWxNZW1vcnlDb3B5KCB3ZGlQb3N0QXNzb2NQYXJhbXMuYnNzUGFyYW1zLm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgIHBXRElDdHgtPndkaUNhY2hlZFBvc3RBc3NvY1JlcS53ZGlCU1NQYXJhbXMubWFjQlNTSUQsIAorICAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTik7IAorCisgIC8qQ29weSB0aGUgTUFDIGFkZHJlc3NlcyBmcm9tIHRoZSBjYWNoZWQgc3RvcmFnZSBpbiB0aGUgV0RJIENCIGFzIHRoZXkgYXJlIG5vdAorICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlICovCisgIHdwYWxNZW1vcnlDb3B5KCB3ZGlQb3N0QXNzb2NQYXJhbXMuYnNzUGFyYW1zLm1hY1NUQSwgCisgICAgICAgICAgICAgICAgICBwV0RJQ3R4LT53ZGlDYWNoZWRQb3N0QXNzb2NSZXEud2RpQlNTUGFyYW1zLndkaVNUQUNvbnRleHQKKyAgICAgICAgICAgICAgICAgIC5tYWNTVEEsIFdESV9NQUNfQUREUl9MRU4pOworCisgIHdkaVBvc3RBc3NvY1BhcmFtcy5ic3NQYXJhbXMudWNCY2FzdFNpZyA9IAorICAgICBoYWxQb3N0QXNzb2NSc3BNc2cucG9zdEFzc29jUnNwUGFyYW1zLmNvbmZpZ1N0YVJzcFBhcmFtcy51Y0JjYXN0U2lnOworCisgIHdkaVBvc3RBc3NvY1BhcmFtcy5ic3NQYXJhbXMudWNVY2FzdFNpZyA9IAorICAgICBoYWxQb3N0QXNzb2NSc3BNc2cucG9zdEFzc29jUnNwUGFyYW1zLmNvbmZpZ1N0YVJzcFBhcmFtcy51Y1VjYXN0U2lnOworCisgIHdkaVBvc3RBc3NvY1BhcmFtcy5ic3NQYXJhbXMudWNCU1NJZHggPQorICAgICBoYWxQb3N0QXNzb2NSc3BNc2cucG9zdEFzc29jUnNwUGFyYW1zLmNvbmZpZ0Jzc1JzcFBhcmFtcy5ic3NJZHg7CisKKyAgd2RpUG9zdEFzc29jUGFyYW1zLmJzc1BhcmFtcy51Y1NUQUlkeCA9IAorICAgICBoYWxQb3N0QXNzb2NSc3BNc2cucG9zdEFzc29jUnNwUGFyYW1zLmNvbmZpZ0Jzc1JzcFBhcmFtcy5ic3NTdGFJZHg7CisKKyAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRmluZCB0aGUgQlNTIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB1Y0N1cnJlbnRCU1NTZXNJZHggPSBXRElfRmluZEFzc29jU2Vzc2lvbiggcFdESUN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZGlQb3N0QXNzb2NQYXJhbXMuYnNzUGFyYW1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQlNTSUQsICZwQlNTU2VzKTsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBvc3QgYXNzb2MgcmVzcG9uc2UgY2FuIG9ubHkgYmUgcmVjZWl2ZWQgZm9yIGFuIGV4aXN0aW5nIGFzc29jIHRoYXQKKyAgICBpcyBjdXJyZW50IGFuZCBpbiBwcm9ncmVzcyAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEJTU1NlcyApIHx8CisgICAgICAoIHVjQ3VycmVudEJTU1Nlc0lkeCAhPSBwV0RJQ3R4LT51Y0N1cnJlbnRCU1NTZXNJZHggKSB8fCAKKyAgICAgICggZVdMQU5fUEFMX0ZBTFNFID09IHBXRElDdHgtPmJBc3NvY2lhdGlvbkluUHJvZ3Jlc3MgKSkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQXNzb2NpYXRpb24gc2VxdWVuY2UgZm9yIHRoaXMgQlNTIGRvZXMgbm90IHlldCBleGlzdCBvciAiCisgICAgICAgICAgICAgICJhc3NvY2lhdGlvbiBubyBsb25nZXIgaW4gcHJvZ3Jlc3MgLSBteXN0ZXJpb3VzIEhBTCByZXNwb25zZSIpOworCisgICAgV0RJX0RldGVjdGVkRGV2aWNlRXJyb3IoIHBXRElDdHgsIFdESV9FUlJfQkFTSUNfT1BfRkFJTFVSRSk7IAorICAgIAorICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBQb3N0IEFzc29jIFJlcXVlc3QgaXMgb25seSBhbGxvd2VkIGluIEpvaW5pbmcgc3RhdGUgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBXRElfQVNTT0NfSk9JTklOR19TVCAhPSBwQlNTU2VzLT53ZGlBc3NvY1N0YXRlKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJQb3N0IEFzc29jIG5vdCBhbGxvd2VkIGJlZm9yZSBKT0lOIC0gZmFpbGluZyByZXF1ZXN0ICIKKyAgICAgICAgICAgICAgInN0cmFuZ2UgSEFMIHJlc3BvbnNlIik7CisKKyAgICBXRElfRGV0ZWN0ZWREZXZpY2VFcnJvciggcFdESUN0eCwgV0RJX0VSUl9CQVNJQ19PUF9GQUlMVVJFKTsgCisgICAgCisgICAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIElmIGFzc29jIGhhcyBmYWlsZWQgdGhlIGN1cnJlbnQgc2Vzc2lvbiB3aWxsIGJlIGRlbGV0ZWQgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd2RpUG9zdEFzc29jUGFyYW1zLndkaVN0YXR1cyApCisgIHsKKyAgICAvKkFzc29jaWF0aW9uIHdhcyBmYWlsZWQgYnkgSEFMIC0gcmVtb3ZlIHNlc3Npb24qLworICAgIFdESV9EZWxldGVTZXNzaW9uKHBXRElDdHgsIHBCU1NTZXMpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qVHJhbnNpdGlvbiB0byBzdGF0ZSBQT1NUIEFzc29jKi8KKyAgICBwQlNTU2VzLT53ZGlBc3NvY1N0YXRlID0gV0RJX0FTU09DX1BPU1RfU1Q7IAorCisgICAgLypTYXZlIERQVSBJbmZvKi8KKyAgICBwQlNTU2VzLT5iY2FzdE1nbXREcHVJbmRleCAgICAgPSAKKyAgICAgIGhhbFBvc3RBc3NvY1JzcE1zZy5wb3N0QXNzb2NSc3BQYXJhbXMuY29uZmlnQnNzUnNwUGFyYW1zLm1nbXREcHVEZXNjSW5keDsKKyAgICBwQlNTU2VzLT5iY2FzdE1nbXREcHVTaWduYXR1cmUgPSAKKyAgICAgIGhhbFBvc3RBc3NvY1JzcE1zZy5wb3N0QXNzb2NSc3BQYXJhbXMuY29uZmlnQnNzUnNwUGFyYW1zLm1nbXREcHVTaWduYXR1cmU7CisgICAgcEJTU1Nlcy0+YmNhc3REcHVJbmRleCAgICAgICAgID0gCisgICAgICBoYWxQb3N0QXNzb2NSc3BNc2cucG9zdEFzc29jUnNwUGFyYW1zLmNvbmZpZ0Jzc1JzcFBhcmFtcy5iY2FzdERwdURlc2NJbmR4OworICAgIHBCU1NTZXMtPmJjYXN0RHB1U2lnbmF0dXJlICAgICA9IAorICAgICAgaGFsUG9zdEFzc29jUnNwTXNnLnBvc3RBc3NvY1JzcFBhcmFtcy5jb25maWdCc3NSc3BQYXJhbXMuYmNhc3REcHVTaWduYXR1cmU7CisKKyAgICBwQlNTU2VzLT51Y0JTU0lkeCAgICAgICAgICAgICAgPSAKKyAgICAgIGhhbFBvc3RBc3NvY1JzcE1zZy5wb3N0QXNzb2NSc3BQYXJhbXMuY29uZmlnQnNzUnNwUGFyYW1zLmJzc0lkeDsKKyAgfQorCisgIC8qQXNzb2NpYXRpb24gbm8gbG9uZ2VyIGluIHByb2dyZXNzICAqLworICBwV0RJQ3R4LT5iQXNzb2NpYXRpb25JblByb2dyZXNzID0gZVdMQU5fUEFMX0ZBTFNFOworCisgIC8qQXNzb2NpYXRpb24gbm8gbG9uZ2VyIGluIHByb2dyZXNzIC0gcHJlcGFyZSBwZW5kaW5nIGFzc29jIGZvciBwcm9jZXNzaW5nKi8KKyAgV0RJX0RlcXVldWVBc3NvY1JlcXVlc3QocFdESUN0eCk7CisKKyAgd3BhbE11dGV4UmVsZWFzZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlQb3N0QXNzb2NSc3BDYiggJndkaVBvc3RBc3NvY1BhcmFtcywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NQb3N0QXNzb2NSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBEZWwgU1RBIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSBpcyAKKyAgICAgICAgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRGVsU1RBUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfRGVsU1RBUnNwUGFyYW1zVHlwZSAgIHdkaURlbFNUQVJzcDsKKyAgV0RJX0RlbFNUQVJzcENiICAgICAgICAgICB3ZGlEZWxTVEFSc3BDYjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICBzdGFUeXBlOworICB0RGVsZXRlU3RhUnNwTXNnICAgICAgICAgIGhhbERlbFN0YVJzcE1zZzsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpRGVsU1RBUnNwQ2IgPSAoV0RJX0RlbFNUQVJzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsRGVsU3RhUnNwTXNnLmRlbFN0YVJzcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbERlbFN0YVJzcE1zZy5kZWxTdGFSc3BQYXJhbXMpKTsKKworICB3ZGlEZWxTVEFSc3AudWNTVEFJZHggICAgPSBoYWxEZWxTdGFSc3BNc2cuZGVsU3RhUnNwUGFyYW1zLnN0YUlkOworICB3ZGlEZWxTVEFSc3Aud2RpU3RhdHVzICAgPSAgIAorICAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbERlbFN0YVJzcE1zZy5kZWxTdGFSc3BQYXJhbXMuc3RhdHVzKTsgCisKKyAgV0RJX1NUQVRhYmxlR2V0U3RhVHlwZShwV0RJQ3R4LCB3ZGlEZWxTVEFSc3AudWNTVEFJZHgsICZzdGFUeXBlKTsKKworICAvKiBJZiB0aGUgREVMIFNUQSByZXF1ZXN0IGlzIGZvciBzZWxmIFNUQSBkbyBub3QgZGVsZXRlIGl0IC0gUmVhbGx5IHdlaXJkISFXaGF0IGhhcHBlbnMgaW4gY29uY3VycmVuY3kgKi8KKyAgaWYoc3RhVHlwZSA9PSBXRElfU1RBX0VOVFJZX1NFTEYpCisgIHsKKyAgICBXRElfU3RhU3RydWN0KiBwU1RBVGFibGUgPSAoV0RJX1N0YVN0cnVjdCopIHBXRElDdHgtPnN0YVRhYmxlOworCisgICAgLyogQXQgdGhpcyBwb2ludCBhZGQgdGhlIHNlbGYtU1RBICovCisKKyAgICAvKiEgVE8gRE86IHdkaUFkZFNUQVBhcmFtLnVjV21tRW5hYmxlZCAqLworICAgIC8qISBUTyBETzogd2RpQWRkU1RBUGFyYW0udWNIVENhcGFibGUgKi8KKyAgICAvKiEgVE8gRE86IHdkaUFkZFNUQVBhcmFtLnVjUm1mRW5hYmxlZCAqLworCisjZGVmaW5lIFdESV9EUFVfU0VMRl9TVEFfREVGQVVMVF9JRFggMAorI2RlZmluZSBXRElfRFBVX1NFTEZfU1RBX0RFRkFVTFRfU0lHIDAKKworICAgIC8vYWxsIERQVSBpbmRpY2VzIGFyZSB0aGUgc2FtZSBmb3Igc2VsZiBTVEEKKyAgICBwU1RBVGFibGVbd2RpRGVsU1RBUnNwLnVjU1RBSWR4XS5kcHVJbmRleCA9IFdESV9EUFVfU0VMRl9TVEFfREVGQVVMVF9JRFg7CisgICAgcFNUQVRhYmxlW3dkaURlbFNUQVJzcC51Y1NUQUlkeF0uYmNhc3REcHVJbmRleCA9IFdESV9EUFVfU0VMRl9TVEFfREVGQVVMVF9JRFg7CisgICAgcFNUQVRhYmxlW3dkaURlbFNUQVJzcC51Y1NUQUlkeF0uYmNhc3RNZ210RHB1SW5kZXggPSBXRElfRFBVX1NFTEZfU1RBX0RFRkFVTFRfSURYOworICAgIHBTVEFUYWJsZVt3ZGlEZWxTVEFSc3AudWNTVEFJZHhdLmJjYXN0RHB1U2lnbmF0dXJlID0gV0RJX0RQVV9TRUxGX1NUQV9ERUZBVUxUX1NJRzsKKyAgICBwU1RBVGFibGVbd2RpRGVsU1RBUnNwLnVjU1RBSWR4XS5iY2FzdE1nbXREcHVTaWduYXR1cmUgPSBXRElfRFBVX1NFTEZfU1RBX0RFRkFVTFRfU0lHOworICAgIHBTVEFUYWJsZVt3ZGlEZWxTVEFSc3AudWNTVEFJZHhdLmRwdVNpZyA9IFdESV9EUFVfU0VMRl9TVEFfREVGQVVMVF9TSUc7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy9EZWxldGUgdGhlIHN0YXRpb24gaW4gdGhlIHRhYmxlCisgICAgV0RJX1NUQVRhYmxlRGVsU3RhKCBwV0RJQ3R4LCB3ZGlEZWxTVEFSc3AudWNTVEFJZHgpOworICB9CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaURlbFNUQVJzcENiKCAmd2RpRGVsU1RBUnNwLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0RlbFNUQVJzcCovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5IFJlc3BvbnNlIFByb2Nlc3NpbmcgRnVuY3Rpb25zIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgQlNTIEtleSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0QnNzS2V5UnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgICAgICAgaGFsU3RhdHVzOworICBXRElfU2V0QlNTS2V5UnNwQ2IgICAgd2RpU2V0QlNTS2V5UnNwQ2I7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpU2V0QlNTS2V5UnNwQ2IgPSAoV0RJX1NldEJTU0tleVJzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IGhhbFN0YXR1cyApCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiU2V0IEJTUyBLZXkgZmFpbGVkIHdpdGggc3RhdHVzICVzICglZCkiLAorICAgICAgICAgICAgICBXRElfZ2V0SEFMU3RhdHVzTXNnU3RyaW5nKGhhbFN0YXR1cyksCisgICAgICAgICAgICAgIGhhbFN0YXR1cyk7CisgICAgIC8qIHNlbmQgdGhlIHN0YXR1cyB0byBVTUFDLCBkb24ndCByZXR1cm4gZnJvbSBoZXJlKi8KKyAgfQorCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlTZXRCU1NLZXlSc3BDYiggd2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1NldEJzc0tleVJzcCovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFJlbW92ZSBCU1MgS2V5IFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NSZW1vdmVCc3NLZXlSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgICAgICAgIHdkaVN0YXR1czsKKyAgZUhhbFN0YXR1cyAgICAgICAgICAgICAgaGFsU3RhdHVzOworICBXRElfUmVtb3ZlQlNTS2V5UnNwQ2IgICB3ZGlSZW1vdmVCU1NLZXlSc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlSZW1vdmVCU1NLZXlSc3BDYiA9IChXRElfUmVtb3ZlQlNTS2V5UnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gaGFsU3RhdHVzICkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJSZW1vdmUgQlNTIEtleSBmYWlsZWQgd2l0aCBzdGF0dXMgJXMgKCVkICkiLAorICAgICAgICAgICAgICBXRElfZ2V0SEFMU3RhdHVzTXNnU3RyaW5nKGhhbFN0YXR1cyksCisgICAgICAgICAgICAgIGhhbFN0YXR1cyk7CisgICAgIC8qIHNlbmQgdGhlIHN0YXR1cyB0byBVTUFDLCBkb24ndCByZXR1cm4gZnJvbSBoZXJlKi8KKyAgfQorCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlSZW1vdmVCU1NLZXlSc3BDYiggd2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1NldEJzc0tleVJzcCovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IFNUQSBLZXkgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFN0YUtleVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgIHdkaVN0YXR1czsKKyAgZUhhbFN0YXR1cyAgICAgICAgICAgIGhhbFN0YXR1czsKKyAgV0RJX1NldFNUQUtleVJzcENiICAgIHdkaVNldFNUQUtleVJzcENiOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaVNldFNUQUtleVJzcENiID0gKFdESV9TZXRTVEFLZXlSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBoYWxTdGF0dXMgKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIlNldCBTVEEgS2V5IGZhaWxlZCB3aXRoIHN0YXR1cyAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgV0RJX2dldEhBTFN0YXR1c01zZ1N0cmluZyhoYWxTdGF0dXMpLAorICAgICAgICAgICAgICBoYWxTdGF0dXMpOworICAgICAvKiBzZW5kIHRoZSBzdGF0dXMgdG8gVU1BQywgZG9uJ3QgcmV0dXJuIGZyb20gaGVyZSovCisgIH0KKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpU2V0U1RBS2V5UnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NTZXRTVEFLZXlSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBSZW1vdmUgU1RBIEtleSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlbW92ZVN0YUtleVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgICAgICAgICBoYWxTdGF0dXM7CisgIFdESV9SZW1vdmVTVEFLZXlSc3BDYiAgIHdkaVJlbW92ZVNUQUtleVJzcENiOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaVJlbW92ZVNUQUtleVJzcENiID0gKFdESV9SZW1vdmVTVEFLZXlSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyAhPSBoYWxTdGF0dXMgKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIlJlbW92ZSBTVEEgS2V5IGZhaWxlZCB3aXRoIHN0YXR1cyAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgV0RJX2dldEhBTFN0YXR1c01zZ1N0cmluZyhoYWxTdGF0dXMpLAorICAgICAgICAgICAgICBoYWxTdGF0dXMpOworICAgICAvKiBzZW5kIHRoZSBzdGF0dXMgdG8gVU1BQywgZG9uJ3QgcmV0dXJuIGZyb20gaGVyZSovCisgIH0KKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpUmVtb3ZlU1RBS2V5UnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NSZW1vdmVTdGFLZXlSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgU1RBIEJjYXN0IEtleSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFN0YUJjYXN0S2V5UnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgICAgICAgaGFsU3RhdHVzOworICBXRElfU2V0U1RBS2V5UnNwQ2IgICAgd2RpU2V0U1RBQmNhc3RLZXlSc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlTZXRTVEFCY2FzdEtleVJzcENiID0gKFdESV9TZXRTVEFLZXlSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weSggJmhhbFN0YXR1cywgCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTdGF0dXMpKTsKKworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IGhhbFN0YXR1cyApCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiU2V0IFNUQSBLZXkgZmFpbGVkIHdpdGggc3RhdHVzICVzICglZCkiLAorICAgICAgICAgICAgICBXRElfZ2V0SEFMU3RhdHVzTXNnU3RyaW5nKGhhbFN0YXR1cyksCisgICAgICAgICAgICAgIGhhbFN0YXR1cyk7CisgICAgIC8qIHNlbmQgdGhlIHN0YXR1cyB0byBVTUFDLCBkb24ndCByZXR1cm4gZnJvbSBoZXJlKi8KKyAgfQorCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlTZXRTVEFCY2FzdEtleVJzcENiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzU2V0U1RBQmNhc3RLZXlSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBSZW1vdmUgU1RBIEJjYXN0IEtleSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzUmVtb3ZlU3RhQmNhc3RLZXlSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgICAgICAgIHdkaVN0YXR1czsKKyAgZUhhbFN0YXR1cyAgICAgICAgICAgICAgaGFsU3RhdHVzOworICBXRElfUmVtb3ZlU1RBS2V5UnNwQ2IgICB3ZGlSZW1vdmVTVEFCY2FzdEtleVJzcENiOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaVJlbW92ZVNUQUJjYXN0S2V5UnNwQ2IgPSAoV0RJX1JlbW92ZVNUQUtleVJzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsU3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFN0YXR1cykpOworCisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICBpZiAoIGVIQUxfU1RBVFVTX1NVQ0NFU1MgIT0gaGFsU3RhdHVzICkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJSZW1vdmUgU1RBIEtleSBmYWlsZWQgd2l0aCBzdGF0dXMgJXMgKCVkKSIsCisgICAgICAgICAgICAgIFdESV9nZXRIQUxTdGF0dXNNc2dTdHJpbmcoaGFsU3RhdHVzKSwKKyAgICAgICAgICAgICAgaGFsU3RhdHVzKTsKKyAgICAgLyogc2VuZCB0aGUgc3RhdHVzIHRvIFVNQUMsIGRvbid0IHJldHVybiBmcm9tIGhlcmUqLworICB9CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaVJlbW92ZVNUQUJjYXN0S2V5UnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NSZW1vdmVTdGFCY2FzdEtleVJzcCovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgIFFvUyBhbmQgQkEgUmVzcG9uc2UgUHJvY2Vzc2luZyBGdW5jdGlvbnMgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEFkZCBUU3BlYyBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQWRkVFNwZWNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgIGhhbFN0YXR1czsKKyAgV0RJX0FkZFRzUnNwQ2IgICB3ZGlBZGRUc1JzcENiOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaUFkZFRzUnNwQ2IgPSAoV0RJX0FkZFRzUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpQWRkVHNSc3BDYiggd2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0FkZFRTcGVjUnNwKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBEZWwgVFNwZWMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0RlbFRTcGVjUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgIHdkaVN0YXR1czsKKyAgZUhhbFN0YXR1cyAgICAgICBoYWxTdGF0dXM7CisgIFdESV9EZWxUc1JzcENiICAgd2RpRGVsVHNSc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlEZWxUc1JzcENiID0gKFdESV9EZWxUc1JzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaURlbFRzUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NEZWxUU3BlY1JzcCovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFVwZGF0ZSBFRENBIFBhcmFtZXRlcnMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhICAKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzVXBkYXRlRURDQVBhcmFtc1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgICAgICB3ZGlTdGF0dXM7CisgIGVIYWxTdGF0dXMgICAgICAgaGFsU3RhdHVzOworICBXRElfVXBkYXRlRURDQVBhcmFtc1JzcENiICAgd2RpVXBkYXRlRURDQVBhcmFtc1JzcENiOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaVVwZGF0ZUVEQ0FQYXJhbXNSc3BDYiA9IChXRElfVXBkYXRlRURDQVBhcmFtc1JzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaVVwZGF0ZUVEQ0FQYXJhbXNSc3BDYiggd2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1VwZGF0ZUVEQ0FQYXJhbXNSc3AqLworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEFkZCBCQSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQWRkQkFTZXNzaW9uUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfQWRkQkFTZXNzaW9uUnNwQ2IgICB3ZGlBZGRCQVNlc3Npb25Sc3BDYjsKKworICB0QWRkQkFTZXNzaW9uUnNwUGFyYW1zICAgICAgICBoYWxCQVNlc3Npb25Sc3A7CisgIFdESV9BZGRCQVNlc3Npb25Sc3BQYXJhbXNUeXBlIHdkaUJBU2Vzc2lvblJzcDsKKworICAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlBZGRCQVNlc3Npb25Sc3BDYiA9IChXRElfQWRkQkFTZXNzaW9uUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE1lbW9yeUNvcHkoICZoYWxCQVNlc3Npb25Sc3AsIAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsQkFTZXNzaW9uUnNwKSk7CisKKyAgd2RpQkFTZXNzaW9uUnNwLndkaVN0YXR1cyA9IFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbEJBU2Vzc2lvblJzcC5zdGF0dXMpOworCisgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSB3ZGlCQVNlc3Npb25Sc3Aud2RpU3RhdHVzICkKKyAgeworICAgIHdkaUJBU2Vzc2lvblJzcC51Y0JhRGlhbG9nVG9rZW4gPSBoYWxCQVNlc3Npb25Sc3AuYmFEaWFsb2dUb2tlbjsKKyAgICB3ZGlCQVNlc3Npb25Sc3AudWNCYVRJRCA9IGhhbEJBU2Vzc2lvblJzcC5iYVRJRDsKKyAgICB3ZGlCQVNlc3Npb25Sc3AudWNCYUJ1ZmZlclNpemUgPSBoYWxCQVNlc3Npb25Sc3AuYmFCdWZmZXJTaXplOworICAgIHdkaUJBU2Vzc2lvblJzcC51c0JhU2Vzc2lvbklEID0gaGFsQkFTZXNzaW9uUnNwLmJhU2Vzc2lvbklEOworICAgIHdkaUJBU2Vzc2lvblJzcC51Y1dpblNpemUgPSBoYWxCQVNlc3Npb25Sc3Aud2luU2l6ZTsKKyAgICB3ZGlCQVNlc3Npb25Sc3AudWNTVEFJZHggPSBoYWxCQVNlc3Npb25Sc3AuU1RBSUQ7CisgICAgd2RpQkFTZXNzaW9uUnNwLnVzQmFTU04gPSBoYWxCQVNlc3Npb25Sc3AuU1NOOworICB9CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUFkZEJBU2Vzc2lvblJzcENiKCAmd2RpQkFTZXNzaW9uUnNwLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0FkZFNlc3Npb25CQVJzcCovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRGVsIEJBIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NEZWxCQVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgICAgICB3ZGlTdGF0dXM7CisgIGVIYWxTdGF0dXMgICAgICAgaGFsU3RhdHVzOworICBXRElfRGVsQkFSc3BDYiAgIHdkaURlbEJBUnNwQ2I7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpRGVsQkFSc3BDYiA9IChXRElfRGVsQkFSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBoYWxTdGF0dXMgKQorICB7CisgICAgLyohIFRPIERPOiBJIHNob3VsZCBub3RpZnkgdGhlIERBTCBEYXRhIFBhdGggdGhhdCB0aGUgQkEgd2FzIGRlbGV0ZWQqLworICB9CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaURlbEJBUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NEZWxCQVJzcCovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYCisvKioKKyBAYnJpZWYgUHJvY2VzcyBUU00gU3RhdHMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1RzbVN0YXRzUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfVHNtUnNwQ2IgICAgICAgICAgd2RpVHNtU3RhdHNSc3BDYjsKKyAgdFRzbVN0YXRzUnNwTXNnICAgICAgIGhhbFRzbVN0YXRzUnNwTXNnOyAKKyAgV0RJX1RTTVN0YXRzUnNwUGFyYW1zVHlwZSAgd2RpVHNtU3RhdHNSc3BQYXJhbXM7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaVRzbVN0YXRzUnNwQ2IgPSAoV0RJX1RzbVJzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBVbnBhY2sgSEFMIFJlc3BvbnNlIE1lc3NhZ2UgLSB0aGUgaGVhZGVyIHdhcyBhbHJlYWR5IGV4dHJhY3RlZCBieSB0aGUKKyAgICBtYWluIFJlc3BvbnNlIEhhbmRsaW5nIHByb2NlZHVyZSAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsVHNtU3RhdHNSc3BNc2cudHNtU3RhdHNSc3BQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsVHNtU3RhdHNSc3BNc2cudHNtU3RhdHNSc3BQYXJhbXMpKTsKKworICB3ZGlUc21TdGF0c1JzcFBhcmFtcy5VcGxpbmtQa3RRdWV1ZURseSA9IGhhbFRzbVN0YXRzUnNwTXNnLnRzbVN0YXRzUnNwUGFyYW1zLlVwbGlua1BrdFF1ZXVlRGx5OworICB3cGFsTWVtb3J5Q29weSggd2RpVHNtU3RhdHNSc3BQYXJhbXMuVXBsaW5rUGt0UXVldWVEbHlIaXN0LAorICAgICAgICAgICAgICAgICAgaGFsVHNtU3RhdHNSc3BNc2cudHNtU3RhdHNSc3BQYXJhbXMuVXBsaW5rUGt0UXVldWVEbHlIaXN0LAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFRzbVN0YXRzUnNwTXNnLnRzbVN0YXRzUnNwUGFyYW1zLlVwbGlua1BrdFF1ZXVlRGx5SGlzdCkvCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsVHNtU3RhdHNSc3BNc2cudHNtU3RhdHNSc3BQYXJhbXMuVXBsaW5rUGt0UXVldWVEbHlIaXN0WzBdKSk7CisgIHdkaVRzbVN0YXRzUnNwUGFyYW1zLlVwbGlua1BrdFR4RGx5ID0gaGFsVHNtU3RhdHNSc3BNc2cudHNtU3RhdHNSc3BQYXJhbXMuVXBsaW5rUGt0VHhEbHk7CisgIHdkaVRzbVN0YXRzUnNwUGFyYW1zLlVwbGlua1BrdExvc3MgPSBoYWxUc21TdGF0c1JzcE1zZy50c21TdGF0c1JzcFBhcmFtcy5VcGxpbmtQa3RMb3NzOworICB3ZGlUc21TdGF0c1JzcFBhcmFtcy5VcGxpbmtQa3RDb3VudCA9IGhhbFRzbVN0YXRzUnNwTXNnLnRzbVN0YXRzUnNwUGFyYW1zLlVwbGlua1BrdENvdW50OworICB3ZGlUc21TdGF0c1JzcFBhcmFtcy5Sb2FtaW5nQ291bnQgPSBoYWxUc21TdGF0c1JzcE1zZy50c21TdGF0c1JzcFBhcmFtcy5Sb2FtaW5nQ291bnQ7CisgIHdkaVRzbVN0YXRzUnNwUGFyYW1zLlJvYW1pbmdEbHkgPSBoYWxUc21TdGF0c1JzcE1zZy50c21TdGF0c1JzcFBhcmFtcy5Sb2FtaW5nRGx5OworICB3ZGlUc21TdGF0c1JzcFBhcmFtcy53ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFRzbVN0YXRzUnNwTXNnLnRzbVN0YXRzUnNwUGFyYW1zLnN0YXR1cyk7CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaVRzbVN0YXRzUnNwQ2IoICZ3ZGlUc21TdGF0c1JzcFBhcmFtcywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NUc21TdGF0c1JzcCovCisKKyNlbmRpZgorCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRmx1c2ggQUMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0ZsdXNoQWNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgIGhhbFN0YXR1czsKKyAgV0RJX0ZsdXNoQWNSc3BDYiB3ZGlGbHVzaEFjUnNwQ2I7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpRmx1c2hBY1JzcENiID0gKFdESV9GbHVzaEFjUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE1lbW9yeUNvcHkoICZoYWxTdGF0dXMsIAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU3RhdHVzKSk7CisKKyAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlGbHVzaEFjUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NGbHVzaEFjUnNwKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQlQgQU1QIGV2ZW50IFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSAKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQnRBbXBFdmVudFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9TdGF0dXMgICAgICAgd2RpU3RhdHVzOworICAgZUhhbFN0YXR1cyAgICAgICBoYWxTdGF0dXM7CisgICBXRElfQnRBbXBFdmVudFJzcENiIHdkaUJ0QW1wRXZlbnRSc3BDYjsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgd2RpQnRBbXBFdmVudFJzcENiID0gKFdESV9CdEFtcEV2ZW50UnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHdwYWxNZW1vcnlDb3B5KCAmaGFsU3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU3RhdHVzKSk7CisKKyAgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAgLypOb3RpZnkgVU1BQyovCisgICB3ZGlCdEFtcEV2ZW50UnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzQnRBbXBFdmVudFJzcCovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQUREIFNUQSBTRUxGIFJzcCBmdW5jdGlvbiAoY2FsbGVkIAorICAgICAgICB3aGVuIGEgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQWRkU1RBU2VsZlJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0FkZFNUQVNlbGZSc3BQYXJhbXNUeXBlICB3ZGlBZGRTVEFTZWxmUGFyYW1zOworICBXRElfQWRkU1RBU2VsZlBhcmFtc1JzcENiICAgIHdkaUFkZFNUQVNlbGZSZXFQYXJhbXNSc3BDYjsKKyAgdEFkZFN0YVNlbGZSc3BNc2cgICAgICAgICAgICBoYWxBZGRTdGFTZWxmUnNwOworICBXRElfQWRkU3RhUGFyYW1zICAgICAgICAgICAgIHdkaUFkZFNUQVBhcmFtID0gezB9OworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaUFkZFNUQVNlbGZSZXFQYXJhbXNSc3BDYiA9IAorICAgICAgICAgICAgICAgICAgICAgICAgIChXRElfQWRkU1RBU2VsZlBhcmFtc1JzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsQWRkU3RhU2VsZlJzcC5hZGRTdGFTZWxmUnNwUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbEFkZFN0YVNlbGZSc3AuYWRkU3RhU2VsZlJzcFBhcmFtcykpOworCisKKyAgd2RpQWRkU1RBU2VsZlBhcmFtcy53ZGlTdGF0dXMgICA9ICAgCisgICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsQWRkU3RhU2VsZlJzcC5hZGRTdGFTZWxmUnNwUGFyYW1zLnN0YXR1cyk7IAorCisgIHdkaUFkZFNUQVNlbGZQYXJhbXMudWNTVEFTZWxmSWR4ICAgPSAKKyAgICBoYWxBZGRTdGFTZWxmUnNwLmFkZFN0YVNlbGZSc3BQYXJhbXMuc2VsZlN0YUlkeDsKKyAgd2RpQWRkU1RBU2VsZlBhcmFtcy5kcHVJZHggPSAKKyAgICBoYWxBZGRTdGFTZWxmUnNwLmFkZFN0YVNlbGZSc3BQYXJhbXMuZHB1SWR4OworICB3ZGlBZGRTVEFTZWxmUGFyYW1zLmRwdVNpZ25hdHVyZSA9IAorICAgIGhhbEFkZFN0YVNlbGZSc3AuYWRkU3RhU2VsZlJzcFBhcmFtcy5kcHVTaWduYXR1cmU7CisKKyAgd3BhbE1lbW9yeUNvcHkod2RpQWRkU1RBU2VsZlBhcmFtcy5tYWNTZWxmU3RhLAorICAgICAgICAgICAgICAgICBwV0RJQ3R4LT53ZGlDYWNoZUFkZFNUQVNlbGZSZXEud2RpQWRkU1RBU2VsZkluZm8uc2VsZk1hY0FkZHIsCisgICAgICAgICAgICAgICAgIFdESV9NQUNfQUREUl9MRU4pOworCisKKyNpZmRlZiBIQUxfU0VMRl9TVEFfUEVSX0JTUworCisgIC8qIEF0IHRoaXMgcG9pbnQgYWRkIHRoZSBzZWxmLVNUQSAqLworCisgIC8qISBUTyBETzogd2RpQWRkU1RBUGFyYW0udWNXbW1FbmFibGVkICovCisgIC8qISBUTyBETzogd2RpQWRkU1RBUGFyYW0udWNIVENhcGFibGUgKi8KKyAgLyohIFRPIERPOiB3ZGlBZGRTVEFQYXJhbS51Y1JtZkVuYWJsZWQgKi8KKworICAvL2FsbCBEUFUgaW5kaWNlcyBhcmUgdGhlIHNhbWUgZm9yIHNlbGYgU1RBCisKKyAgLypEUFUgSW5mb3JtYXRpb24qLworICB3ZGlBZGRTVEFQYXJhbS5kcHVJbmRleCAgICAgICAgICAgICAgPSB3ZGlBZGRTVEFTZWxmUGFyYW1zLmRwdUlkeDsgCisgIHdkaUFkZFNUQVBhcmFtLmRwdVNpZyAgICAgICAgICAgICAgICA9IHdkaUFkZFNUQVNlbGZQYXJhbXMuZHB1U2lnbmF0dXJlOworICB3ZGlBZGRTVEFQYXJhbS5iY2FzdERwdVNpZ25hdHVyZSAgICAgPSB3ZGlBZGRTVEFTZWxmUGFyYW1zLmRwdVNpZ25hdHVyZTsKKyAgd2RpQWRkU1RBUGFyYW0uYmNhc3RNZ210RHB1U2lnbmF0dXJlID0gd2RpQWRkU1RBU2VsZlBhcmFtcy5kcHVTaWduYXR1cmU7CisgIHdkaUFkZFNUQVBhcmFtLmJjYXN0RHB1SW5kZXggICAgICAgICA9IHdkaUFkZFNUQVNlbGZQYXJhbXMuZHB1SWR4OworICB3ZGlBZGRTVEFQYXJhbS5iY2FzdE1nbXREcHVJbmRleCAgICAgPSB3ZGlBZGRTVEFTZWxmUGFyYW1zLmRwdUlkeDsKKworICB3cGFsTWVtb3J5Q29weSh3ZGlBZGRTVEFQYXJhbS5zdGFNYWNBZGRyLCB3ZGlBZGRTVEFTZWxmUGFyYW1zLm1hY1NlbGZTdGEsCisgICAgICAgICAgICAgICAgIFdESV9NQUNfQUREUl9MRU4pOworCisgIHdkaUFkZFNUQVBhcmFtLnVjU3RhVHlwZSA9IFdESV9TVEFfRU5UUllfU0VMRjsgLyogMCAtIHNlbGYgKi8KKyAgd2RpQWRkU1RBUGFyYW0udWNTVEFJZHggPSB3ZGlBZGRTVEFTZWxmUGFyYW1zLnVjU1RBU2VsZklkeDsKKworICBpZihoYWxBZGRTdGFTZWxmUnNwLmFkZFN0YVNlbGZSc3BQYXJhbXMuc3RhdHVzIAorICAgICAhPSBlSEFMX1NUQVRVU19BRERfU1RBX1NFTEZfSUdOT1JFRF9SRUZfQ09VTlRfTk9UX1pFUk8pCisgIHsKKyAgICAgKHZvaWQpV0RJX1NUQVRhYmxlQWRkU3RhKHBXRElDdHgsJndkaUFkZFNUQVBhcmFtKTsKKyAgfQorI2VuZGlmCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUFkZFNUQVNlbGZSZXFQYXJhbXNSc3BDYiggJndkaUFkZFNUQVNlbGZQYXJhbXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzQWRkU1RBU2VsZlJzcCovCisKKworCisvKioKKyBAYnJpZWYgV0RJX1Byb2Nlc3NEZWxTVEFTZWxmUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIAorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NEZWxTVEFTZWxmUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfRGVsU1RBU2VsZlJzcFBhcmFtc1R5cGUgICAgIHdkaURlbFN0YVNlbGZSc3BQYXJhbXM7CisgIFdESV9EZWxTVEFTZWxmUnNwQ2IgICAgICAgICAgICAgd2RpRGVsU3RhU2VsZlJzcENiOworICB0RGVsU3RhU2VsZlJzcFBhcmFtcyAgICAgICAgICAgIGRlbFN0YVNlbGZSc3BQYXJhbXM7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgICAgdWNTdGFJZHg7CisKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpRGVsU3RhU2VsZlJzcENiID0gKFdESV9EZWxTVEFTZWxmUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIHdwYWxNZW1vcnlDb3B5KCAmZGVsU3RhU2VsZlJzcFBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgICAgICAod3B0X3VpbnQ4KilwRXZlbnREYXRhLT5wRXZlbnREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHREZWxTdGFTZWxmUnNwUGFyYW1zKSk7CisKKyAgd2RpRGVsU3RhU2VsZlJzcFBhcmFtcy53ZGlTdGF0dXMgICA9ICAgCisgICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoZGVsU3RhU2VsZlJzcFBhcmFtcy5zdGF0dXMpOyAKKworICAvKiBkZWxTdGFTZWxmUnNwUGFyYW1zLnN0YXR1cyBpcyBub3QgCisgICBlSEFMX1NUQVRVU19ERUxfU1RBX1NFTEZfSUdOT1JFRF9SRUZfQ09VTlRfTk9UX1pFUk8qLworICBpZiggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSBkZWxTdGFTZWxmUnNwUGFyYW1zLnN0YXR1cyApCisgIHsKKyAgICBXRElfU3RhdHVzIHdkaVN0YXR1czsKKyAgICB3ZGlTdGF0dXMgPSBXRElfU1RBVGFibGVGaW5kU3RhaWRCeUFkZHIocFdESUN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsU3RhU2VsZlJzcFBhcmFtcy5zZWxmTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWNTdGFJZHgpOworICAgIGlmKFdESV9TVEFUVVNfRV9GQUlMVVJFID09IHdkaVN0YXR1cykKKyAgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBVbmFibGUgdG8gZXh0cmFjdCB0aGUgU1RBIElkeCAiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICAgfQorICAgIFdESV9TVEFUYWJsZURlbFN0YShwV0RJQ3R4LCB1Y1N0YUlkeCk7CisgIH0KKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpRGVsU3RhU2VsZlJzcENiKCZ3ZGlEZWxTdGFTZWxmUnNwUGFyYW1zLCAodm9pZCopIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgTWlzY2VsbGFuZW91cyBDb250cm9sIFJlc3BvbnNlIFByb2Nlc3NpbmcgQVBJIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQ2hhbm5lbCBTd2l0Y2ggUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0NoYW5uZWxTd2l0Y2hSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9Td2l0Y2hDSFJzcFBhcmFtc1R5cGUgICB3ZGlTd2l0Y2hDaFJzcDsKKyAgV0RJX1N3aXRjaENoUnNwQ2IgICAgICAgICAgIHdkaUNoU3dpdGNoUnNwQ2I7CisgIHRTd2l0Y2hDaGFubmVsUnNwUGFyYW1zICAgICBoYWxTd2l0Y2hDaGFubmVsUnNwOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaUNoU3dpdGNoUnNwQ2IgPSAoV0RJX1N3aXRjaENoUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE1lbW9yeUNvcHkoICZoYWxTd2l0Y2hDaGFubmVsUnNwLCAKKyAgICAgICAgICAgICAgICAgICh3cHRfdWludDgqKXBFdmVudERhdGEtPnBFdmVudERhdGEsCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsU3dpdGNoQ2hhbm5lbFJzcCkpOworCisgIHdkaVN3aXRjaENoUnNwLndkaVN0YXR1cyAgID0gIAorICAgICAgICAgICAgICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3dpdGNoQ2hhbm5lbFJzcC5zdGF0dXMpOyAKKyAgd2RpU3dpdGNoQ2hSc3AudWNDaGFubmVsID0gaGFsU3dpdGNoQ2hhbm5lbFJzcC5jaGFubmVsTnVtYmVyOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICB3ZGlTd2l0Y2hDaFJzcC51Y1R4TWdtdFBvd2VyID0gIGhhbFN3aXRjaENoYW5uZWxSc3AudHhNZ210UG93ZXI7IAorI2VuZGlmCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUNoU3dpdGNoUnNwQ2IoICZ3ZGlTd2l0Y2hDaFJzcCwgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NDaGFubmVsU3dpdGNoUnNwKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBDb25maWcgU1RBIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NDb25maWdTdGFSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9Db25maWdTVEFSc3BQYXJhbXNUeXBlICAgIHdkaUNmZ1NUQVBhcmFtczsKKyAgV0RJX0NvbmZpZ1NUQVJzcENiICAgICAgICAgICAgd2RpQ29uZmlnU1RBUnNwQ2I7CisgIFdESV9BZGRTdGFQYXJhbXMgICAgICAgICAgICAgIHdkaUFkZFNUQVBhcmFtOworCisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgICAgICAgIHBCU1NTZXMgICAgICAgICAgICAgPSBOVUxMOworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgICB1Y0N1cnJlbnRCU1NTZXNJZHggID0gMDsgCisKKyAgdENvbmZpZ1N0YVJzcE1zZyAgICAgICAgICAgICAgaGFsQ29uZmlnU3RhUnNwOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlDb25maWdTVEFSc3BDYiA9IChXRElfQ29uZmlnU1RBUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE1lbW9yeUNvcHkoICZoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMpKTsKKworCisgIHdkaUNmZ1NUQVBhcmFtcy51Y1NUQUlkeCAgICA9IGhhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMuc3RhSWR4OworICB3ZGlDZmdTVEFQYXJhbXMudWNCc3NJZHggICAgPSBoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLmJzc0lkeDsKKyAgd2RpQ2ZnU1RBUGFyYW1zLnVjVWNhc3RTaWcgID0gaGFsQ29uZmlnU3RhUnNwLmNvbmZpZ1N0YVJzcFBhcmFtcy51Y1VjYXN0U2lnOworICB3ZGlDZmdTVEFQYXJhbXMudWNCY2FzdFNpZyAgPSBoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLnVjQmNhc3RTaWc7CisgIHdkaUNmZ1NUQVBhcmFtcy51Y01nbXRTaWcgICA9IGhhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMudWNNZ210U2lnOworCisgICAvKiBNQUMgQWRkcmVzcyBvZiBTVEEgLSB0YWtlIGZyb20gY2FjaGUgYXMgaXQgZG9lcyBub3QgY29tZSBiYWNrIGluIHRoZQorICAgcmVzcG9uc2UqLworICAgd3BhbE1lbW9yeUNvcHkoIHdkaUNmZ1NUQVBhcmFtcy5tYWNTVEEsCisgICAgICAgICAgcFdESUN0eC0+d2RpQ2FjaGVkQ29uZmlnU3RhUmVxLndkaVJlcUluZm8ubWFjU1RBLCAKKyAgICAgICAgICBXRElfTUFDX0FERFJfTEVOKTsKKyAgCisgIHdkaUNmZ1NUQVBhcmFtcy53ZGlTdGF0dXMgICA9ICAgCisgICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsQ29uZmlnU3RhUnNwLmNvbmZpZ1N0YVJzcFBhcmFtcy5zdGF0dXMpOyAKKworICB3ZGlDZmdTVEFQYXJhbXMudWNEcHVJbmRleCA9IGhhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMuZHB1SW5kZXg7CisgIHdkaUNmZ1NUQVBhcmFtcy51Y0JjYXN0RHB1SW5kZXggPSBoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLmJjYXN0RHB1SW5kZXg7CisgIHdkaUNmZ1NUQVBhcmFtcy51Y0JjYXN0TWdtdERwdUlkeCA9IGhhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMuYmNhc3RNZ210RHB1SWR4OworCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTID09IHdkaUNmZ1NUQVBhcmFtcy53ZGlTdGF0dXMgKQorICB7CisgICAgaWYgKCBXRElfQUREX1NUQSA9PSBwV0RJQ3R4LT53ZGlDYWNoZWRDb25maWdTdGFSZXEud2RpUmVxSW5mby53ZGlBY3Rpb24gKQorICAgIHsKKyAgICAgIC8qIEFERCBTVEEgdG8gdGFibGUgKi8KKyAgICAgIHdkaUFkZFNUQVBhcmFtLnVjU1RBSWR4ID0gaGFsQ29uZmlnU3RhUnNwLmNvbmZpZ1N0YVJzcFBhcmFtcy5zdGFJZHg7IAorICAgICAgd2RpQWRkU1RBUGFyYW0uZHB1U2lnICAgPSBoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLnVjVWNhc3RTaWc7CisgICAgICB3ZGlBZGRTVEFQYXJhbS5kcHVJbmRleCA9IGhhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMuZHB1SW5kZXg7CisgICAgICAgCisgICAgICAvKlRoaXMgaW5mbyBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGNhY2hlZCBpbml0aWFsIHJlcXVlc3QqLworICAgICAgd2RpQWRkU1RBUGFyYW0udWNXbW1FbmFibGVkID0gCisgICAgICAgIHBXRElDdHgtPndkaUNhY2hlZENvbmZpZ1N0YVJlcS53ZGlSZXFJbmZvLnVjV01NRW5hYmxlZDsKKyAgICAgIHdkaUFkZFNUQVBhcmFtLnVjSFRDYXBhYmxlICA9IAorICAgICAgICBwV0RJQ3R4LT53ZGlDYWNoZWRDb25maWdTdGFSZXEud2RpUmVxSW5mby51Y0hUQ2FwYWJsZTsgCisgICAgICB3ZGlBZGRTVEFQYXJhbS51Y1N0YVR5cGUgICAgPSAKKyAgICAgICAgcFdESUN0eC0+d2RpQ2FjaGVkQ29uZmlnU3RhUmVxLndkaVJlcUluZm8ud2RpU1RBVHlwZTsgIAorICAgCisgICAgICAvKiBNQUMgQWRkcmVzcyBvZiBTVEEgKi8KKyAgICAgIHdwYWxNZW1vcnlDb3B5KHdkaUFkZFNUQVBhcmFtLnN0YU1hY0FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgcFdESUN0eC0+d2RpQ2FjaGVkQ29uZmlnU3RhUmVxLndkaVJlcUluZm8ubWFjU1RBLCAKKyAgICAgICAgICAgICAgICAgICAgIFdESV9NQUNfQUREUl9MRU4pOworICAKKyAgICAgIHdwYWxNZW1vcnlDb3B5KHdkaUFkZFNUQVBhcmFtLm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgICAgIHBXRElDdHgtPndkaUNhY2hlZENvbmZpZ1N0YVJlcS53ZGlSZXFJbmZvLm1hY0JTU0lEICwgCisgICAgICAgICAgICAgICAgICAgICBXRElfTUFDX0FERFJfTEVOKTsgCisgIAorICAgICAgdWNDdXJyZW50QlNTU2VzSWR4ID0gV0RJX0ZpbmRBc3NvY1Nlc3Npb24oIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICBwV0RJQ3R4LT53ZGlDYWNoZWRDb25maWdTdGFSZXEud2RpUmVxSW5mby5tYWNCU1NJRCwgCisgICAgICAgICAgICAgICAgICAgICZwQlNTU2VzKTsgIAorCisgICAgICBpZiAoIE5VTEwgPT0gcEJTU1NlcyApCisgICAgICB7CisgICAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIkFzc29jaWF0aW9uIGZvciB0aGlzIEJTU0lEIGlzIG5vdCBpbiBwbGFjZSIpOworICAgIAorICAgICAgICBXRElfQVNTRVJUKDApOworICAgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgICAgIH0KKworICAgICAgLypBZGQgQlNTIHNwZWNpZmljIHBhcmFtZXRlcnMqLworICAgICAgd2RpQWRkU1RBUGFyYW0uYmNhc3RNZ210RHB1SW5kZXggPSAKKyAgICAgICAgIGhhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMuYmNhc3RNZ210RHB1SWR4OworICAgICAgd2RpQWRkU1RBUGFyYW0uYmNhc3RNZ210RHB1U2lnbmF0dXJlID0gCisgICAgICAgICBoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLnVjTWdtdFNpZzsKKyAgICAgIHdkaUFkZFNUQVBhcmFtLmJjYXN0RHB1SW5kZXggID0gCisgICAgICAgICBoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLmJjYXN0RHB1SW5kZXg7CisgICAgICB3ZGlBZGRTVEFQYXJhbS5iY2FzdERwdVNpZ25hdHVyZSA9IAorICAgICAgICAgaGFsQ29uZmlnU3RhUnNwLmNvbmZpZ1N0YVJzcFBhcmFtcy51Y0JjYXN0U2lnOworICAgICAgd2RpQWRkU1RBUGFyYW0udWNSbWZFbmFibGVkICAgICAgICAgID0gcEJTU1Nlcy0+dWNSbWZFbmFibGVkOworICAgICAgd2RpQWRkU1RBUGFyYW0udWNCU1NJZHggICAgICAgICAgICAgID0gdWNDdXJyZW50QlNTU2VzSWR4OworICAgICAgCisgICAgICBXRElfU1RBVGFibGVBZGRTdGEocFdESUN0eCwmd2RpQWRkU1RBUGFyYW0pOworICAgIH0KKyAgICBpZiggV0RJX1VQREFURV9TVEEgPT0gcFdESUN0eC0+d2RpQ2FjaGVkQ29uZmlnU3RhUmVxLndkaVJlcUluZm8ud2RpQWN0aW9uICkKKyAgICB7CisgICAgICAgV0RJX1N0YVN0cnVjdCogcFNUQVRhYmxlID0gKFdESV9TdGFTdHJ1Y3QqKSBwV0RJQ3R4LT5zdGFUYWJsZTsKKworICAgICAgIHBTVEFUYWJsZVtoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLnN0YUlkeF0uYmNhc3REcHVJbmRleCA9IAorICAgICAgICAgIGhhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMuYmNhc3REcHVJbmRleDsKKyAgICAgICBwU1RBVGFibGVbaGFsQ29uZmlnU3RhUnNwLmNvbmZpZ1N0YVJzcFBhcmFtcy5zdGFJZHhdLmJjYXN0RHB1U2lnbmF0dXJlID0gCisgICAgICAgICAgaGFsQ29uZmlnU3RhUnNwLmNvbmZpZ1N0YVJzcFBhcmFtcy51Y0JjYXN0U2lnOworICAgICAgIHBTVEFUYWJsZVtoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLnN0YUlkeF0uYmNhc3RNZ210RHB1SW5kZXggPSAKKyAgICAgICAgICBoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLmJjYXN0TWdtdERwdUlkeDsKKyAgICAgICBwU1RBVGFibGVbaGFsQ29uZmlnU3RhUnNwLmNvbmZpZ1N0YVJzcFBhcmFtcy5zdGFJZHhdLmJjYXN0TWdtdERwdVNpZ25hdHVyZSA9IAorICAgICAgICAgIGhhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMudWNNZ210U2lnOworICAgICAgIHBTVEFUYWJsZVtoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLnN0YUlkeF0uYnNzSWR4ID0gCisgICAgICAgICAgaGFsQ29uZmlnU3RhUnNwLmNvbmZpZ1N0YVJzcFBhcmFtcy5ic3NJZHg7CisgICAgICAgcFNUQVRhYmxlW2hhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMuc3RhSWR4XS5kcHVJbmRleCA9IAorICAgICAgICAgIGhhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMuZHB1SW5kZXg7CisgICAgICAgcFNUQVRhYmxlW2hhbENvbmZpZ1N0YVJzcC5jb25maWdTdGFSc3BQYXJhbXMuc3RhSWR4XS5kcHVTaWcgPSAKKyAgICAgICAgICBoYWxDb25maWdTdGFSc3AuY29uZmlnU3RhUnNwUGFyYW1zLnVjVWNhc3RTaWc7CisgICAgfQorICB9CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUNvbmZpZ1NUQVJzcENiKCAmd2RpQ2ZnU1RBUGFyYW1zLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0NvbmZpZ1N0YVJzcCovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IExpbmsgU3RhdGUgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIAorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRMaW5rU3RhdGVSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgICAgICAgIHdkaVN0YXR1czsKKyAgZUhhbFN0YXR1cyAgICAgICAgICAgICAgaGFsU3RhdHVzOworICBXRElfU2V0TGlua1N0YXRlUnNwQ2IgICB3ZGlTZXRMaW5rU3RhdGVSc3BDYjsKKworICBXRElfQlNTU2Vzc2lvblR5cGUqICAgICBwQlNTU2VzICAgICAgICAgICAgICA9IE5VTEw7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgIHVjQ3VycmVudEJTU1Nlc0lkeCAgID0gMDsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpU2V0TGlua1N0YXRlUnNwQ2IgPSAoV0RJX1NldExpbmtTdGF0ZVJzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLypJZiB0aGUgbGluayBpcyBiZWluZyB0cmFuc2l0aW9uZWQgdG8gaWRsZSAtIHRoZSBCU1MgaXMgdG8gYmUgZGVsZXRlZAorICAtIHRoaXMgdHlwZSBvZiBlbmRpbmcgYSBzZXNzaW9uIGlzIHBvc3NpYmxlIHdoZW4gVU1BQyBoYXMgZmFpbGVkIGFuCisgIC0gYXNzb2NpYXRpb24gc2Vzc2lvbiBkdXJpbmcgSm9pbiovCisgIGlmICggV0RJX0xJTktfSURMRV9TVEFURSA9PSAKKyAgICAgICBwV0RJQ3R4LT53ZGlDYWNoZVNldExpbmtTdFJlcS53ZGlMaW5rSW5mby53ZGlMaW5rU3RhdGUgKQorICB7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIEZpbmQgdGhlIEJTUyBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZSAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHVjQ3VycmVudEJTU1Nlc0lkeCA9IFdESV9GaW5kQXNzb2NTZXNzaW9uKCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBXRElDdHgtPndkaUNhY2hlU2V0TGlua1N0UmVxLndkaUxpbmtJbmZvLm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICZwQlNTU2VzKTsgCisgIAorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIERlbCBCU1MgcmVzcG9uc2UgY2FuIG9ubHkgYmUgcmVjZWl2ZWQgZm9yIGFuIGV4aXN0aW5nIGFzc29jIHRoYXQKKyAgICAgIGlzIGN1cnJlbnQgYW5kIGluIHByb2dyZXNzIAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICggTlVMTCA9PSBwQlNTU2VzICkKKyAgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICJTZXQgbGluayByZXNwb25zZSByZWNlaXZlZCBvdXRzaWRlIGFzc29jaWF0aW9uIHNlc3Npb24iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZvciBCVCBBTVAgcm9sZXMgbm8gbmVlZCB0byBkZWxldGUgdGhlIHNlc3Npb25zIGlmIGFzc29jIGZhaWxzLiBUaGVyZQorICAgICAgd2lsbCBiZSBkZWwgQlNTIGNvbWluZyBhZnRlciB0aGlzIHRvIHN0b3AgdGhlIGJlYWNvbmluZyAmIGNsZWFuaW5nIHVwIHRoZQorICAgICAgc2Vzc2lvbnMqLworICAgICAgaWYoKCBXRElfQlRBTVBfU1RBX01PREUgIT0gcEJTU1Nlcy0+d2RpQnNzVHlwZSApJiYKKyAgICAgICAgICggV0RJX0JUQU1QX0FQX01PREUgIT0gcEJTU1Nlcy0+d2RpQnNzVHlwZSApKQorICAgICAgeworICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICBUaGUgY3VycmVudCBzZXNzaW9uIHdpbGwgYmUgZGVsZXRlZCAKKyAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgIFdESV9EZWxldGVTZXNzaW9uKHBXRElDdHgsIHBCU1NTZXMpOworCisgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgIENoZWNrIHRvIHNlZSBpZiB0aGlzIGFzc29jaWF0aW9uIGlzIGluIHByb2dyZXNzIC0gaWYgc28gZGlzYWJsZSB0aGUKKyAgICAgICAgICAgZmxhZyBhcyB0aGlzIGhhcyBlbmRlZAorICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICAgaWYgKCB1Y0N1cnJlbnRCU1NTZXNJZHggPT0gcFdESUN0eC0+dWNDdXJyZW50QlNTU2VzSWR4ICkKKyAgICAgICAgIHsgIAorICAgICAgICAgICAvKkFzc29jaWF0aW9uIG5vIGxvbmdlciBpbiBwcm9ncmVzcyAgKi8KKyAgICAgICAgICAgcFdESUN0eC0+YkFzc29jaWF0aW9uSW5Qcm9ncmVzcyA9IGVXTEFOX1BBTF9GQUxTRTsKKyAgICAgICAgICAgLypBc3NvY2lhdGlvbiBubyBsb25nZXIgaW4gcHJvZ3Jlc3MgLSBwcmVwYXJlIHBlbmRpbmcgYXNzb2MgZm9yIHByb2Nlc3NpbmcqLworICAgICAgICAgICBXRElfRGVxdWV1ZUFzc29jUmVxdWVzdChwV0RJQ3R4KTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogSWYgdGhlIGxpbmsgc3RhdGUgaGFzIGJlZW4gc2V0IHRvIFBPU1QgQVNTT0MsIHJlc2V0IHRoZSAiYXNzb2NpYXRpb24gaW4KKyAgICAgcHJvZ3Jlc3MiIGZsYWcgKi8KKyAgaWYgKCBXRElfTElOS19QT1NUQVNTT0NfU1RBVEUgPT0gCisgICAgICAgcFdESUN0eC0+d2RpQ2FjaGVTZXRMaW5rU3RSZXEud2RpTGlua0luZm8ud2RpTGlua1N0YXRlICkKKyAgeworICAgICBwV0RJQ3R4LT5iQXNzb2NpYXRpb25JblByb2dyZXNzID0gZVdMQU5fUEFMX0ZBTFNFOworICAgICBXRElfRGVxdWV1ZUFzc29jUmVxdWVzdChwV0RJQ3R4KTsKKyAgfQorCisgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsU3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFN0YXR1cykpOworCisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpU2V0TGlua1N0YXRlUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NTZXRMaW5rU3RhdGVSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBHZXQgU3RhdHMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlIGlzICAgCisgICAgICAgIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0dldFN0YXRzUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfR2V0U3RhdHNSc3BQYXJhbXNUeXBlICAgKndkaUdldFN0YXRzUnNwOworICBXRElfR2V0U3RhdHNSc3BDYiAgICAgICAgICAgd2RpR2V0U3RhdHNSc3BDYjsKKyAgdEhhbFN0YXRzUnNwUGFyYW1zKiAgICAgICAgIHBIYWxTdGF0c1JzcFBhcmFtczsKKyAgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwSGFsU3RhdHNSc3BQYXJhbXMgPSAodEhhbFN0YXRzUnNwUGFyYW1zICopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKworICAvKmFsbG9jYXRlIHRoZSBzdGF0cyByZXNwb25zZSBidWZmZXIgKi8KKyAgd2RpR2V0U3RhdHNSc3AgPSAoV0RJX0dldFN0YXRzUnNwUGFyYW1zVHlwZSAqKXdwYWxNZW1vcnlBbGxvY2F0ZSgKKyAgICAgICAgICAgICAgcEhhbFN0YXRzUnNwUGFyYW1zLT5tc2dMZW4gLSBzaXplb2YodEhhbFN0YXRzUnNwUGFyYW1zKQorICAgICAgICAgICAgICArIHNpemVvZihXRElfR2V0U3RhdHNSc3BQYXJhbXNUeXBlKSk7CisKKyAgaWYoTlVMTCA9PSB3ZGlHZXRTdGF0c1JzcCkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiBHZXQgU3RhdHMgUmVzcG9uc2UgJXggJXggJXggIiwKKyAgICAgICAgICAgICAgICAgcFdESUN0eCwgcEV2ZW50RGF0YSwgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpR2V0U3RhdHNSc3BDYiA9IChXRElfR2V0U3RhdHNSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgd3BhbE1lbW9yeVplcm8od2RpR2V0U3RhdHNSc3AsIHBIYWxTdGF0c1JzcFBhcmFtcy0+bXNnTGVuKTsKKyAgd2RpR2V0U3RhdHNSc3AtPnVzTXNnVHlwZSAgPSBwSGFsU3RhdHNSc3BQYXJhbXMtPm1zZ1R5cGU7CisgIHdkaUdldFN0YXRzUnNwLT51c01zZ0xlbiAgID0gcEhhbFN0YXRzUnNwUGFyYW1zLT5tc2dMZW47CisgIHdkaUdldFN0YXRzUnNwLT53ZGlTdGF0dXMgID0gV0RJX0hBTF8yX1dESV9TVEFUVVMocEhhbFN0YXRzUnNwUGFyYW1zLT5zdGF0dXMpOworICB3ZGlHZXRTdGF0c1JzcC0+dWNTVEFJZHggICA9IHBIYWxTdGF0c1JzcFBhcmFtcy0+c3RhSWQ7CisgIHdkaUdldFN0YXRzUnNwLT51U3RhdHNNYXNrID0gcEhhbFN0YXRzUnNwUGFyYW1zLT5zdGF0c01hc2s7CisKKyAgLyogY29weSB0aGUgc3RhdHMgZnJvbSBidWZmZXIgYXQgdGhlIGVuZCBvZiB0aGUgdEhhbFN0YXRzUnNwUGFyYW1zIG1lc3NhZ2UgKi8KKyAgd3BhbE1lbW9yeUNvcHkod2RpR2V0U3RhdHNSc3AgKyAxLAorICAgKHdwdF91aW50OCopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSArIHNpemVvZih0SGFsU3RhdHNSc3BQYXJhbXMpLAorICAgcEhhbFN0YXRzUnNwUGFyYW1zLT5tc2dMZW4gLSBzaXplb2YodEhhbFN0YXRzUnNwUGFyYW1zKSk7CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUdldFN0YXRzUnNwQ2IoIHdkaUdldFN0YXRzUnNwLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgd3BhbE1lbW9yeUZyZWUod2RpR2V0U3RhdHNSc3ApOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NHZXRTdGF0c1JzcCovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgVXBkYXRlIENmZyBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UgaXMgIAorICAgICAgICBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NVcGRhdGVDZmdSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsU3RhdHVzOworICBXRElfVXBkYXRlQ2ZnUnNwQ2IgICB3ZGlVcGRhdGVDZmdSc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlVcGRhdGVDZmdSc3BDYiA9IChXRElfVXBkYXRlQ2ZnUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpVXBkYXRlQ2ZnUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NVcGRhdGVDZmdSc3AqLworCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQWRkIEJBIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NBZGRCQVJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0FkZEJBUnNwQ2IgICAgICAgICAgd2RpQWRkQkFSc3BDYjsKKworICB0QWRkQkFSc3BQYXJhbXMgICAgICAgICBoYWxBZGRCQVJzcDsKKyAgV0RJX0FkZEJBUnNwaW5mb1R5cGUgICAgd2RpQWRkQkFSc3A7CisKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlBZGRCQVJzcENiID0gKFdESV9BZGRCQVJzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsQWRkQkFSc3AsIAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsQWRkQkFSc3ApKTsKKworICB3ZGlBZGRCQVJzcC53ZGlTdGF0dXMgPSBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxBZGRCQVJzcC5zdGF0dXMpOworCisgIGlmICggZUhBTF9TVEFUVVNfU1VDQ0VTUyA9PSB3ZGlBZGRCQVJzcC53ZGlTdGF0dXMgKQorICB7CisgICAgd2RpQWRkQkFSc3AudWNCYURpYWxvZ1Rva2VuID0gaGFsQWRkQkFSc3AuYmFEaWFsb2dUb2tlbjsKKyAgfQorCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlBZGRCQVJzcENiKCAmd2RpQWRkQkFSc3AsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzQWRkU2Vzc2lvbkJBUnNwKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgQWRkIEJBIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NUcmlnZ2VyQkFSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9UcmlnZ2VyQkFSc3BDYiAgICAgIHdkaVRyaWdnZXJCQVJzcENiOworCisgIHRUcmlnZ2VyQkFSc3BQYXJhbXMqICAgICAgICAgICBoYWxUcmlnZ2VyQkFSc3A7CisgIHRUcmlnZ2VyQmFSc3BDYW5kaWRhdGUqICAgICAgICBoYWxCYUNhbmRpZGF0ZTsKKyAgV0RJX1RyaWdnZXJCQVJzcFBhcmFtc1R5cGUqICAgIHdkaVRyaWdnZXJCQVJzcDsKKyAgV0RJX1RyaWdnZXJCQVJzcENhbmRpZGF0ZVR5cGUqIHdkaVRyaWdnZXJCQVJzcENhbmRpZGF0ZTsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgIGluZGV4OworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgVGlkSW5kZXg7CisgIAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaVRyaWdnZXJCQVJzcENiID0gKFdESV9UcmlnZ2VyQkFSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoYWxUcmlnZ2VyQkFSc3AgPSAodFRyaWdnZXJCQVJzcFBhcmFtcyAqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisKKyAgd2RpVHJpZ2dlckJBUnNwID0gd3BhbE1lbW9yeUFsbG9jYXRlKHNpemVvZihXRElfVHJpZ2dlckJBUnNwUGFyYW1zVHlwZSkgKyAKKyAgICAgICAgICAgICAgICAgICAgICBoYWxUcmlnZ2VyQkFSc3AtPmJhQ2FuZGlkYXRlQ250ICogCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdESV9UcmlnZ2VyQkFSc3BDYW5kaWRhdGVUeXBlKSk7CisgIGlmKE5VTEwgPT0gd2RpVHJpZ2dlckJBUnNwKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgaW4gVHJpZ2dlciBCQSBSZXNwb25zZSAleCAleCAleCAiLAorICAgICAgICAgICAgICAgICBwV0RJQ3R4LCBwRXZlbnREYXRhLCBwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgICB3cGFsTWVtb3J5RnJlZShoYWxUcmlnZ2VyQkFSc3ApOworICAgIFdESV9BU1NFUlQoMCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaVRyaWdnZXJCQVJzcC0+d2RpU3RhdHVzID0gV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsVHJpZ2dlckJBUnNwLT5zdGF0dXMpOworCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTID09IHdkaVRyaWdnZXJCQVJzcC0+d2RpU3RhdHVzKQorICB7CisgICAgd2RpVHJpZ2dlckJBUnNwLT51c0JhQ2FuZGlkYXRlQ250ID0gaGFsVHJpZ2dlckJBUnNwLT5iYUNhbmRpZGF0ZUNudDsKKyAgICB3cGFsTWVtb3J5Q29weSh3ZGlUcmlnZ2VyQkFSc3AtPm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFRyaWdnZXJCQVJzcC0+YnNzSWQgLCBXRElfTUFDX0FERFJfTEVOKTsKKworICAgIHdkaVRyaWdnZXJCQVJzcENhbmRpZGF0ZSA9IChXRElfVHJpZ2dlckJBUnNwQ2FuZGlkYXRlVHlwZSopKHdkaVRyaWdnZXJCQVJzcCArIDEpOworICAgIGhhbEJhQ2FuZGlkYXRlID0gKHRUcmlnZ2VyQmFSc3BDYW5kaWRhdGUqKShoYWxUcmlnZ2VyQkFSc3AgKyAxKTsKKworICAgIGZvcihpbmRleCA9IDA7IGluZGV4IDwgd2RpVHJpZ2dlckJBUnNwLT51c0JhQ2FuZGlkYXRlQ250OyBpbmRleCsrKQorICAgIHsKKyAgICAgIHdwYWxNZW1vcnlDb3B5KHdkaVRyaWdnZXJCQVJzcENhbmRpZGF0ZS0+bWFjU1RBLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxCYUNhbmRpZGF0ZS0+c3RhQWRkciwgV0RJX01BQ19BRERSX0xFTik7CisgICAgICBmb3IoVGlkSW5kZXggPSAwOyBUaWRJbmRleCA8IFNUQV9NQVhfVEM7IFRpZEluZGV4KyspCisgICAgICB7CisgICAgICAgIHdkaVRyaWdnZXJCQVJzcENhbmRpZGF0ZS0+d2RpQkFJbmZvW1RpZEluZGV4XS5mQmFFbmFibGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxCYUNhbmRpZGF0ZS0+YmFJbmZvW1RpZEluZGV4XS5mQmFFbmFibGU7CisgICAgICAgIHdkaVRyaWdnZXJCQVJzcENhbmRpZGF0ZS0+d2RpQkFJbmZvW1RpZEluZGV4XS5zdGFydGluZ1NlcU51bSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbEJhQ2FuZGlkYXRlLT5iYUluZm9bVGlkSW5kZXhdLnN0YXJ0aW5nU2VxTnVtOworICAgICAgfQorICAgICAgd2RpVHJpZ2dlckJBUnNwQ2FuZGlkYXRlKys7CisgICAgICBoYWxCYUNhbmRpZGF0ZSsrOworICAgIH0KKyAgfQorCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlUcmlnZ2VyQkFSc3BDYiggd2RpVHJpZ2dlckJBUnNwLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgd3BhbE1lbW9yeUZyZWUod2RpVHJpZ2dlckJBUnNwKTsKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0FkZFNlc3Npb25CQVJzcCovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFVwZGF0ZSBCZWFjb24gUGFyYW1zIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NVcGRhdGVCZWFjb25QYXJhbXNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgIGhhbFN0YXR1czsKKyAgV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1JzcENiICAgd2RpVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2I7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2IgPSAoV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1JzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsU3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFN0YXR1cykpOworCisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpVXBkYXRlQmVhY29uUGFyYW1zUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NVcGRhdGVCZWFjb25QYXJhbXNSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZW5kIEJlYWNvbiB0ZW1wbGF0ZSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2VuZEJlYWNvblBhcmFtc1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgICAgICB3ZGlTdGF0dXM7CisgIGVIYWxTdGF0dXMgICAgICAgaGFsU3RhdHVzOworICBXRElfU2VuZEJlYWNvblBhcmFtc1JzcENiICAgd2RpU2VuZEJlYWNvblBhcmFtc1JzcENiOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaVNlbmRCZWFjb25QYXJhbXNSc3BDYiA9IChXRElfU2VuZEJlYWNvblBhcmFtc1JzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsU3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFN0YXR1cykpOworCisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpU2VuZEJlYWNvblBhcmFtc1JzcENiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzU2VuZEJlYWNvblBhcmFtc1JzcCovCisKKyAgCisvKioKKyBAYnJpZWYgUHJvY2VzcyBVcGRhdGUgUHJvYmUgUmVzcCBUZW1wbGF0ZSBSc3AgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBhIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgIGhhbFN0YXR1czsKKyAgV0RJX1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSc3BDYiAgIHdkaVVwZFByb2JlUnNwVGVtcGxSc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlVcGRQcm9iZVJzcFRlbXBsUnNwQ2IgPSAoV0RJX1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weSggJmhhbFN0YXR1cywgCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxTdGF0dXMpKTsKKworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaVVwZFByb2JlUnNwVGVtcGxSc3BDYiggd2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1VwZGF0ZVByb2JlUnNwVGVtcGxhdGVSc3AqLworCisgIC8qKgorIEBicmllZiBQcm9jZXNzIFNldCBNYXggVHggUG93ZXIgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldE1heFR4UG93ZXJSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgICAgICAgICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgICAgICAgICAgcEV2ZW50RGF0YQorKQoreworICB0U2V0TWF4VHhQd3JSc3BNc2cgICAgICAgICAgICAgaGFsVHhwb3dlcnJzcDsKKyAgCisgIFdESV9TZXRNYXhUeFBvd2VyUnNwTXNnICAgICAgICB3ZGlTZXRNYXhUeFBvd2VyUnNwTXNnOworICAKKyAgV0RBX1NldE1heFR4UG93ZXJSc3BDYiAgICAgICAgIHdkaVJlcVN0YXR1c0NiOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaVJlcVN0YXR1c0NiID0gKFdEQV9TZXRNYXhUeFBvd2VyUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE1lbW9yeUNvcHkoICZoYWxUeHBvd2VycnNwLnNldE1heFR4UHdyUnNwUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFR4cG93ZXJyc3Auc2V0TWF4VHhQd3JSc3BQYXJhbXMpKTsgCisKKyAgaWYgKCBlSEFMX1NUQVRVU19TVUNDRVNTICE9IGhhbFR4cG93ZXJyc3Auc2V0TWF4VHhQd3JSc3BQYXJhbXMuc3RhdHVzICkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJFcnJvciBzdGF0dXMgcmV0dXJuZWQgaW4gU2V0IE1heCBUeCBQb3dlciBSZXNwb25zZSAiKTsKKyAgICAgV0RJX0RldGVjdGVkRGV2aWNlRXJyb3IoIHBXRElDdHgsIFdESV9FUlJfQkFTSUNfT1BfRkFJTFVSRSk7IAorICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpU2V0TWF4VHhQb3dlclJzcE1zZy53ZGlTdGF0dXMgPSAKKyAgICAgICAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFR4cG93ZXJyc3Auc2V0TWF4VHhQd3JSc3BQYXJhbXMuc3RhdHVzKTsKKyAgd2RpU2V0TWF4VHhQb3dlclJzcE1zZy51Y1Bvd2VyICA9IGhhbFR4cG93ZXJyc3Auc2V0TWF4VHhQd3JSc3BQYXJhbXMucG93ZXI7IAorCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlSZXFTdGF0dXNDYiggJndkaVNldE1heFR4UG93ZXJSc3BNc2csIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKy8qKgorIEBicmllZiBQcm9jZXNzIFAyUCBHcm91cCBPd25lciBOb3RpY2UgT2YgQWJzZW5zZSBSc3AgZnVuY3Rpb24gKGNhbGxlZCAKKyAgICAgICAgd2hlbiBhIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1AyUEdPTk9BUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgIHdkaVN0YXR1czsKKyAgZUhhbFN0YXR1cyAgICAgICBoYWxTdGF0dXM7CisgIFdESV9TZXRQMlBHT05PQVJlcVBhcmFtc1JzcENiICAgd2RpUDJQR09OT0FSZXFQYXJhbXNSc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlQMlBHT05PQVJlcVBhcmFtc1JzcENiID0gKFdESV9TZXRQMlBHT05PQVJlcVBhcmFtc1JzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsU3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFN0YXR1cykpOworCisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpUDJQR09OT0FSZXFQYXJhbXNSc3BDYiggd2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1AyUEdPTk9BUnNwKi8KKyNlbmRpZgorLyoqCisgQGJyaWVmIFByb2Nlc3MgRW50ZXIgSU1QUyBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UgCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0VudGVySW1wc1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgIFdESV9FbnRlckltcHNSc3BDYiAgIHdkaUVudGVySW1wc1JzcENiOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaUVudGVySW1wc1JzcENiID0gKFdESV9FbnRlckltcHNSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUVudGVySW1wc1JzcENiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzRW50ZXJJbXBzUnNwKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgRXhpdCBJTVBTIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSAKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRXhpdEltcHNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsU3RhdHVzOworICBXRElfRXhpdEltcHNSc3BDYiAgICB3ZGlFeGl0SW1wc1JzcENiOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdkaUV4aXRJbXBzUnNwQ2IgPSAoV0RJX0V4aXRJbXBzUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAvLyBub3RpZnkgRFRTIHRoYXQgd2UgYXJlIGVudGVyaW5nIEZ1bGwgcG93ZXIKKyAgV0RUU19TZXRQb3dlclN0YXRlKHBXRElDdHgsIFdEVFNfUE9XRVJfU1RBVEVfRlVMTCwgTlVMTCk7CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUV4aXRJbXBzUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NFeGl0SW1wc1JzcCovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEVudGVyIEJNUFMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlIAorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NFbnRlckJtcHNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsU3RhdHVzOworICBXRElfRW50ZXJCbXBzUnNwQ2IgICB3ZGlFbnRlckJtcHNSc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlFbnRlckJtcHNSc3BDYiA9IChXRElfRW50ZXJCbXBzUnNwQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpRW50ZXJCbXBzUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NFbnRlckJtcHNSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBFeGl0IEJNUFMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlIAorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NFeGl0Qm1wc1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgIFdESV9FeGl0Qm1wc1JzcENiICAgd2RpRXhpdEJtcHNSc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlFeGl0Qm1wc1JzcENiID0gKFdESV9FeGl0Qm1wc1JzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgLy8gbm90aWZ5IERUUyB0aGF0IHdlIGFyZSBlbnRlcmluZyBGdWxsIHBvd2VyCisgIFdEVFNfU2V0UG93ZXJTdGF0ZShwV0RJQ3R4LCBXRFRTX1BPV0VSX1NUQVRFX0ZVTEwsIE5VTEwpOworCisgIHBXRElDdHgtPmJJbkJtcHMgPSBlV0xBTl9QQUxfRkFMU0U7CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUV4aXRCbXBzUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NFeGl0Qm1wc1JzcCovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEVudGVyIFVBUFNEIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NFbnRlclVhcHNkUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgV0RJX0VudGVyVWFwc2RSc3BDYiAgIHdkaUVudGVyVWFwc2RSc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlFbnRlclVhcHNkUnNwQ2IgPSAoV0RJX0VudGVyVWFwc2RSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgIGlmKFdESV9TVEFUVVNfU1VDQ0VTUyA9PSB3ZGlTdGF0dXMpCisgIHsKKyAgIC8vIFNldCB0aGUgRFBVIHJvdXRpbmcgZmxhZyB0byB0aGUgRlcgV1EsIGFsbCB0aGUgVFggZnJhbWVzIHdvdWxkIGJlIG5vdyBwdXNoZWQKKyAgIC8vIGZyb20gRFBVIHRvIHRoZSBGVy1XUSAoNSkgaW4gVUFQU0QuIEZXIHdvdWxkIGJlIGluIGRhdGEgcGF0aCwgbW9uaXRvcmluZworICAgLy8gdGhlIHRyYWZmaWMgdG8gZGVjaWRlIHdoZW4gdG8gc3VzcGVuZCB0aGUgdHJpZ2dlciBmcmFtZXMgd2hlbiB0aGVyZSBpcyBubyB0cmFmZmljCisgICAvLyBhY3Rpdml0eSBvbiB0aGUgdHJpZ2dlciBlbmFibGVkIEFDcworICAgcFdESUN0eC0+dWNEcHVSRiA9IEJNVVdRX0ZXX0RQVV9UWDsKKworI2lmZGVmIFdMQU5fUEVSRgorICAgLy8gSW5jcmVtZW50IHRoZSBCRCBzaWduYXR1cmUgdG8gcmVmcmVzaCB0aGUgZmFzdCBwYXRoIEJEIHV0aWxpemF0aW9uCisgICBwV0RJQ3R4LT51QmRTaWdTZXJpYWxOdW0rKzsKKyNlbmRpZgorICB9CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUVudGVyVWFwc2RSc3BDYiggd2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0VudGVyVWFwc2RSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBFeGl0IFVBUFNEIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSAKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRXhpdFVhcHNkUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgV0RJX0V4aXRVYXBzZFJzcENiICAgd2RpRXhpdFVhcHNkUnNwQ2I7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpRXhpdFVhcHNkUnNwQ2IgPSAoV0RJX0V4aXRVYXBzZFJzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgIC8vIFJlc3RvcmUgYmFjayB0aGUgRFBVIHJvdXRpbmcgZmxhZyBpbiB0aGUgVHhCRCwgZm9yIERQVSB0byBwdXNoIHRoZSBUeEJEcyB0byBCVFFNCisgICAvLyBkaXJlY3RseSBpbnN0ZWFkIG9mIHRoZSBGVyBXUS4KKyAgIHBXRElDdHgtPnVjRHB1UkYgPSBCTVVXUV9CVFFNX1RYX01HTVQ7CisKKyNpZmRlZiBXTEFOX1BFUkYKKyAgIC8vIEluY3JlbWVudCB0aGUgQkQgc2lnbmF0dXJlIHRvIHJlZnJlc2ggdGhlIGZhc3QgcGF0aCBCRCB1dGlsaXphdGlvbgorICAgcFdESUN0eC0+dUJkU2lnU2VyaWFsTnVtKys7CisjZW5kaWYKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpRXhpdFVhcHNkUnNwQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NFeGl0VWFwc2RSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBzZXQgVUFQU0QgcGFyYW1zIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSAKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0VWFwc2RBY1BhcmFtc1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgIFdESV9TZXRVYXBzZEFjUGFyYW1zQ2IgICB3ZGlTZXRVYXBzZEFjUGFyYW1zQ2I7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpU2V0VWFwc2RBY1BhcmFtc0NiID0gKFdESV9TZXRVYXBzZEFjUGFyYW1zQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpU2V0VWFwc2RBY1BhcmFtc0NiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzU2V0VWFwc2RBY1BhcmFtc1JzcCovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIHVwZGF0ZSBVQVBTRCBwYXJhbXMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIAorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NVcGRhdGVVYXBzZFBhcmFtc1JzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgIFdESV9VcGRhdGVVYXBzZFBhcmFtc0NiICAgd2RpVXBkYXRlVWFwc2RQYXJhbXNDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlVcGRhdGVVYXBzZFBhcmFtc0NiID0gKFdESV9VcGRhdGVVYXBzZFBhcmFtc0NiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaVVwZGF0ZVVhcHNkUGFyYW1zQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NVcGRhdGVVYXBzZFBhcmFtc1JzcCovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIENvbmZpZ3VyZSBSWFAgZmlsdGVyIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYQorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NDb25maWd1cmVSeHBGaWx0ZXJSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsU3RhdHVzOworICBXRElfQ29uZmlndXJlUnhwRmlsdGVyQ2IgICB3ZGlDb25maWd1cmVSeHBGaWx0ZXJDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlDb25maWd1cmVSeHBGaWx0ZXJDYiA9IChXRElfQ29uZmlndXJlUnhwRmlsdGVyQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpQ29uZmlndXJlUnhwRmlsdGVyQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NDb25maWd1cmVSeHBGaWx0ZXJSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgYmVhY29uIGZpbHRlciBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0QmVhY29uRmlsdGVyUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsU3RhdHVzOworICAgV0RJX1NldEJlYWNvbkZpbHRlckNiICAgd2RpQmVhY29uRmlsdGVyQ2I7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIHdkaUJlYWNvbkZpbHRlckNiID0gKFdESV9TZXRCZWFjb25GaWx0ZXJDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgIC8qTm90aWZ5IFVNQUMqLworICAgd2RpQmVhY29uRmlsdGVyQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzU2V0QmVhY29uRmlsdGVyUnNwKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgcmVtb3ZlIGJlYWNvbiBmaWx0ZXIgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlbUJlYWNvbkZpbHRlclJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgIFdESV9SZW1CZWFjb25GaWx0ZXJDYiAgIHdkaUJlYWNvbkZpbHRlckNiOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3ZGlCZWFjb25GaWx0ZXJDYiA9IChXRElfUmVtQmVhY29uRmlsdGVyQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgICAvKk5vdGlmeSBVTUFDKi8KKyAgIHdkaUJlYWNvbkZpbHRlckNiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1JlbUJlYWNvbkZpbHRlclJzcCovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIHNldCBSU1NJIHRocmVzaG9sZHMgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFJTU0lUaHJlc29sZHNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgICBXRElfU2V0UlNTSVRocmVzaG9sZHNDYiAgIHdkaVJTU0lUaHJlc2hvbGRzQ2I7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIHdkaVJTU0lUaHJlc2hvbGRzQ2IgPSAoV0RJX1NldFJTU0lUaHJlc2hvbGRzQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgICAvKk5vdGlmeSBVTUFDKi8KKyAgIHdkaVJTU0lUaHJlc2hvbGRzQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzU2V0UlNTSVRocmVzb2xkc1JzcCovCisKKy8qKgorIEBicmllZiBQcm9jZXNzIGhvc3Qgb2ZmbG9hZCBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzSG9zdE9mZmxvYWRSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgICBXRElfSG9zdE9mZmxvYWRDYiAgICB3ZGlIb3N0T2ZmbG9hZENiOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3ZGlIb3N0T2ZmbG9hZENiID0gKFdESV9Ib3N0T2ZmbG9hZENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAgLypOb3RpZnkgVU1BQyovCisgICB3ZGlIb3N0T2ZmbG9hZENiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0hvc3RPZmZsb2FkUnNwKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3Mga2VlcCBhbGl2ZSBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzS2VlcEFsaXZlUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsU3RhdHVzOworICAgV0RJX0tlZXBBbGl2ZUNiICAgICAgd2RpS2VlcEFsaXZlQ2I7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiUmVjZWl2ZWQgV0RJX1Byb2Nlc3NLZWVwQWxpdmVSc3AgQ2FsbGJhY2sgZnJvbSBIQUwiKTsKKworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgd2RpS2VlcEFsaXZlQ2IgPSAoV0RJX0tlZXBBbGl2ZUNiKXBXRElDdHgtPnBmbmNSc3BDQjsgCisgICAKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgIC8qTm90aWZ5IFVNQUMqLworICAgd2RpS2VlcEFsaXZlQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzS2VlcEFsaXZlUnNwKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3Mgd293bCBhZGQgcHRybiBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzV293bEFkZEJjUHRyblJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgIFdESV9Xb3dsQWRkQmNQdHJuQ2IgICAgd2RpV293bEFkZEJjUHRybkNiOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3ZGlXb3dsQWRkQmNQdHJuQ2IgPSAoV0RJX1dvd2xBZGRCY1B0cm5DYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgIC8qTm90aWZ5IFVNQUMqLworICAgd2RpV293bEFkZEJjUHRybkNiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1dvd2xBZGRCY1B0cm5Sc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyB3b3dsIGRlbGV0ZSBwdHJuIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSAKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzV293bERlbEJjUHRyblJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgIFdESV9Xb3dsRGVsQmNQdHJuQ2IgICAgd2RpV293bERlbEJjUHRybkNiOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3ZGlXb3dsRGVsQmNQdHJuQ2IgPSAoV0RJX1dvd2xEZWxCY1B0cm5DYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgIC8qTm90aWZ5IFVNQUMqLworICAgd2RpV293bERlbEJjUHRybkNiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1dvd2xEZWxCY1B0cm5Sc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyB3b3dsIGVudGVyIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSAKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzV293bEVudGVyUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsU3RhdHVzOworICAgV0RJX1dvd2xFbnRlclJlcUNiICAgd2RpV293bEVudGVyQ2I7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIHdkaVdvd2xFbnRlckNiID0gKFdESV9Xb3dsRW50ZXJSZXFDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgIC8qTm90aWZ5IFVNQUMqLworICAgd2RpV293bEVudGVyQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzV293bEVudGVyUnNwKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3Mgd293bCBleGl0IFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZSAKKyAgICAgICAgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzV293bEV4aXRSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgICBXRElfV293bEV4aXRSZXFDYiAgIHdkaVdvd2xFeGl0Q2I7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIHdkaVdvd2xFeGl0Q2IgPSAoV0RJX1dvd2xFeGl0UmVxQ2IpcFdESUN0eC0+cGZuY1JzcENCOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgICAvKk5vdGlmeSBVTUFDKi8KKyAgIHdkaVdvd2xFeGl0Q2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzV293bEV4aXRSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBDb25maWd1cmUgQXBwcyBDUFUgd2FrZXVwIFN0YXRlIFJzcCBmdW5jdGlvbiAKKyAgICAgICAgKGNhbGxlZCB3aGVuIGEgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzCisgICAgICAgIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsU3RhdHVzOworICAgV0RJX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZUNiICAgd2RpQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlQ2I7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIHdkaUNvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZUNiID0gKFdESV9Db25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgIC8qTm90aWZ5IFVNQUMqLworICAgd2RpQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlQ2IoIHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzQ29uZmlndXJlQXBwc0NwdVdha2V1cFN0YXRlUnNwKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBOdiBkb3dubG9hZChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlCisgICAgICAgIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCx3aWxsIGNoZWNrIGlmIHRoZSByZXNwb25jZSBpcyApCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NOdkRvd25sb2FkUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworCisgIFdESV9OdkRvd25sb2FkUnNwQ2IgICAgd2RpTnZEb3dubG9hZFJzcENiOworICB0SGFsTnZJbWdEb3dubG9hZFJzcFBhcmFtcyBoYWxOdkRvd25sb2FkUnNwOworICBXRElfTnZEb3dubG9hZFJzcEluZm9UeXBlIHdkaU52RG93bmxvYWRSc3A7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbE1lbW9yeUNvcHkoICZoYWxOdkRvd25sb2FkUnNwLCAKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbE52RG93bmxvYWRSc3ApKTsKKworICB3ZGlOdkRvd25sb2FkUnNwLndkaVN0YXR1cyA9IFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbE52RG93bmxvYWRSc3Auc3RhdHVzKTsKKworICBpZigod2RpTnZEb3dubG9hZFJzcC53ZGlTdGF0dXMgPT0gV0RJX1NUQVRVU19TVUNDRVNTKSAmJgorICAgIChwV0RJQ3R4LT53ZGlOdkJsb2JJbmZvLnVzQ3VycmVudEZyYWdtZW50ICE9IAorICAgICAgICAgcFdESUN0eC0+d2RpTnZCbG9iSW5mby51c1RvdGFsRnJhZ21lbnQgKSkgCisgIHsKKyAgICBXRElfTnZEb3dubG9hZFJlcSgmcFdESUN0eC0+d2RpQ2FjaGVkTnZEb3dubG9hZFJlcSwKKyAgICAgICAoV0RJX052RG93bmxvYWRSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0IsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsgCisgIH0KKyAgZWxzZQorICB7CisgICAgLypSZXNldCB0aGUgTnYgcmVsYXRlZCBnbG9iYWwgaW5mb3JtYXRpb24gaW4gV0RJIGNvbnRleHQgaW5mb3JtYXRpb24gKi8KKyAgICBwV0RJQ3R4LT53ZGlOdkJsb2JJbmZvLnVzVG90YWxGcmFnbWVudCA9IDA7CisgICAgcFdESUN0eC0+d2RpTnZCbG9iSW5mby51c0ZyYWdtZW50U2l6ZSA9IDA7CisgICAgcFdESUN0eC0+d2RpTnZCbG9iSW5mby51c0N1cnJlbnRGcmFnbWVudCA9IDA7CisgICAgLypjYWxsIFdEQSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgbGFzdCBmcmFnbWVudCAqLworICAgIHdkaU52RG93bmxvYWRSc3BDYiA9IChXRElfTnZEb3dubG9hZFJzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsKKyAgICB3ZGlOdkRvd25sb2FkUnNwQ2IoICZ3ZGlOdkRvd25sb2FkUnNwLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisgIH0KKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30KKyNpZmRlZiBXTEFOX0ZFQVRVUkVfVk9XSUZJXzExUgorLyoqCisgQGJyaWVmIFByb2Nlc3MgQWRkIFRTcGVjIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYSByZXNwb25zZQorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NBZ2dyQWRkVFNwZWNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdGF0dXMgICAgICAgICAgICB3ZGlTdGF0dXM7CisgIHRBZ2dyQWRkVHNSc3BQYXJhbXMgICBhZ2dyQWRkVHNSc3A7CisgIFdESV9BZ2dyQWRkVHNSc3BDYiAgICB3ZGlBZ2dyQWRkVHNSc3BDYjsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlBZ2dyQWRkVHNSc3BDYiA9IChXRElfQWRkVHNSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weSggJmFnZ3JBZGRUc1JzcCwgCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihhZ2dyQWRkVHNSc3ApKTsKKworICAvKiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc3RhdHVzMCBhbmQgc3RhdHVzMT8gKi8KKyAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGFnZ3JBZGRUc1JzcC5zdGF0dXMwKTsgCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUFnZ3JBZGRUc1JzcENiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzQWRkVFNwZWNSc3AqLworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisKKy8qKgorIEBicmllZiBXRElfUHJvY2Vzc0hvc3RSZXN1bWVSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEgCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0hvc3RSZXN1bWVSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9TdXNwZW5kUmVzdW1lUnNwUGFyYW1zVHlwZSAgICAgd2RpUmVzdW1lUnNwUGFyYW1zOworICBXRElfSG9zdFJlc3VtZUV2ZW50UnNwQ2IgICAgICAgICAgIHdkaUhvc3RSZXN1bWVSc3BDYjsKKyAgdEhhbEhvc3RSZXN1bWVSc3BQYXJhbXMgICAgICAgICAgICBob3N0UmVzdW1lUnNwTXNnOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd2RpSG9zdFJlc3VtZVJzcENiID0gKFdESV9Ib3N0UmVzdW1lRXZlbnRSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgd3BhbE1lbW9yeUNvcHkoICZob3N0UmVzdW1lUnNwTXNnLCAKKyAgICAgICh3cHRfdWludDgqKXBFdmVudERhdGEtPnBFdmVudERhdGEsCisgICAgICBzaXplb2YoaG9zdFJlc3VtZVJzcE1zZykpOworCisgIHdkaVJlc3VtZVJzcFBhcmFtcy53ZGlTdGF0dXMgICA9ICAgCisgICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaG9zdFJlc3VtZVJzcE1zZy5zdGF0dXMpOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgd2RpSG9zdFJlc3VtZVJzcENiKCZ3ZGlSZXN1bWVSc3BQYXJhbXMsICh2b2lkKikgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFNldCBUeCBQRVIgUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhIHJlc3BvbnNlIAorICAgICAgICBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRUeFBlclRyYWNraW5nUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgV0RJX1NldFR4UGVyVHJhY2tpbmdSc3BDYiAgIHB3ZGlTZXRUeFBlclRyYWNraW5nUnNwQ2I7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorICAKKyAgcHdkaVNldFR4UGVyVHJhY2tpbmdSc3BDYiA9IChXRElfU2V0VHhQZXJUcmFja2luZ1JzcENiKXBXRElDdHgtPnBmbmNSc3BDQjsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgIC8qTm90aWZ5IFVNQUMqLworICBwd2RpU2V0VHhQZXJUcmFja2luZ1JzcENiKCB3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzU2V0VHhQZXJUcmFja2luZ1JzcCovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEluZGljYXRpb25zIGZyb20gSEFMCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoqCisgQGJyaWVmIFByb2Nlc3MgTG93IFJTU0kgSW5kaWNhdGlvbiBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYW4gCisgICAgICAgIGluZGljYXRpb24gb2YgdGhpcyBraW5kIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cworICAgICAgICBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0xvd1JTU0lJbmQKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9Mb3dMZXZlbEluZFR5cGUgIHdkaUluZDsKKyAgdEhhbFJTU0lOb3RpZmljYXRpb25JbmRNc2cgICBoYWxSU1NJTm90aWZpY2F0aW9uSW5kTXNnOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgaW5kaWNhdGlvbiBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weSggKHZvaWQgKikmaGFsUlNTSU5vdGlmaWNhdGlvbkluZE1zZy5yc3NpTm90aWZpY2F0aW9uUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRIYWxSU1NJTm90aWZpY2F0aW9uKSk7CisKKyAgLypGaWxsIGluIHRoZSBpbmRpY2F0aW9uIHBhcmFtZXRlcnMqLworICB3ZGlJbmQud2RpSW5kaWNhdGlvblR5cGUgPSBXRElfUlNTSV9OT1RJRklDQVRJT05fSU5EOyAKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaUxvd1JTU0lJbmZvLmJSc3NpVGhyZXMxUG9zQ3Jvc3MgPQorICAgICBoYWxSU1NJTm90aWZpY2F0aW9uSW5kTXNnLnJzc2lOb3RpZmljYXRpb25QYXJhbXMuYlJzc2lUaHJlczFQb3NDcm9zczsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaUxvd1JTU0lJbmZvLmJSc3NpVGhyZXMxTmVnQ3Jvc3MgPQorICAgICBoYWxSU1NJTm90aWZpY2F0aW9uSW5kTXNnLnJzc2lOb3RpZmljYXRpb25QYXJhbXMuYlJzc2lUaHJlczFOZWdDcm9zczsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaUxvd1JTU0lJbmZvLmJSc3NpVGhyZXMyUG9zQ3Jvc3MgPQorICAgICBoYWxSU1NJTm90aWZpY2F0aW9uSW5kTXNnLnJzc2lOb3RpZmljYXRpb25QYXJhbXMuYlJzc2lUaHJlczJQb3NDcm9zczsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaUxvd1JTU0lJbmZvLmJSc3NpVGhyZXMyTmVnQ3Jvc3MgPQorICAgICBoYWxSU1NJTm90aWZpY2F0aW9uSW5kTXNnLnJzc2lOb3RpZmljYXRpb25QYXJhbXMuYlJzc2lUaHJlczJOZWdDcm9zczsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaUxvd1JTU0lJbmZvLmJSc3NpVGhyZXMzUG9zQ3Jvc3MgPQorICAgICBoYWxSU1NJTm90aWZpY2F0aW9uSW5kTXNnLnJzc2lOb3RpZmljYXRpb25QYXJhbXMuYlJzc2lUaHJlczNQb3NDcm9zczsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaUxvd1JTU0lJbmZvLmJSc3NpVGhyZXMzTmVnQ3Jvc3MgPQorICAgICBoYWxSU1NJTm90aWZpY2F0aW9uSW5kTXNnLnJzc2lOb3RpZmljYXRpb25QYXJhbXMuYlJzc2lUaHJlczNOZWdDcm9zczsKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgcFdESUN0eC0+d2RpTG93TGV2ZWxJbmRDQiggJndkaUluZCwgcFdESUN0eC0+cEluZFVzZXJEYXRhICk7CisgIAorICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzTG93UlNTSUluZCovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgTWlzc2VkIEJlYWNvbiBJbmRpY2F0aW9uIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiAKKyAgICAgICAgYW4gaW5kaWNhdGlvbiBvZiB0aGlzIGtpbmQgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUKKyAgICAgICAgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzTWlzc2VkQmVhY29uSW5kCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgV0RJX0xvd0xldmVsSW5kVHlwZSAgd2RpSW5kOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgaW5kaWNhdGlvbiBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiEgVE8gRE86IFBhcmFtZXRlcnMgbmVlZCB0byBiZSB1bnBhY2tlZCBhY2NvcmRpbmcgdG8gSEFMIHN0cnVjdCovCisgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgLypGaWxsIGluIHRoZSBpbmRpY2F0aW9uIHBhcmFtZXRlcnMqLworICB3ZGlJbmQud2RpSW5kaWNhdGlvblR5cGUgPSBXRElfTUlTU0VEX0JFQUNPTl9JTkQ7IAorICAKKyAgLypOb3RpZnkgVU1BQyovCisgIHBXRElDdHgtPndkaUxvd0xldmVsSW5kQ0IoICZ3ZGlJbmQsIHBXRElDdHgtPnBJbmRVc2VyRGF0YSApOworICAKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc01pc3NlZEJlYWNvbkluZCovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgVW5rIEFkZHIgRnJhbWUgSW5kaWNhdGlvbiBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gCisgICAgICAgIGFuIGluZGljYXRpb24gb2YgdGhpcyBraW5kIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlCisgICAgICAgIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1Vua0FkZHJGcmFtZUluZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgIFdESV9Mb3dMZXZlbEluZFR5cGUgIHdkaUluZDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFeHRyYWN0IGluZGljYXRpb24gYW5kIHNlbmQgaXQgdG8gVU1BQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyohIFRPIERPOiBQYXJhbWV0ZXJzIG5lZWQgdG8gYmUgdW5wYWNrZWQgYWNjb3JkaW5nIHRvIEhBTCBzdHJ1Y3QqLworICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgIC8qRmlsbCBpbiB0aGUgaW5kaWNhdGlvbiBwYXJhbWV0ZXJzKi8KKyAgd2RpSW5kLndkaUluZGljYXRpb25UeXBlID0gV0RJX1VOS05PV05fQUREUjJfRlJBTUVfUlhfSU5EOyAKKyAgLyogISBUTyBETyAtIGZpbGwgaW4gZnJvbSBIQUwgc3RydWN0OgorICAgIHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlVbmtBZGRyMkZybUluZm8qLworCisgIC8qTm90aWZ5IFVNQUMqLworICBwV0RJQ3R4LT53ZGlMb3dMZXZlbEluZENCKCAmd2RpSW5kLCBwV0RJQ3R4LT5wSW5kVXNlckRhdGEgKTsKKyAgCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NVbmtBZGRyRnJhbWVJbmQqLworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIE1JQyBGYWlsdXJlIEluZGljYXRpb24gZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGFuIAorICAgICAgICBpbmRpY2F0aW9uIG9mIHRoaXMga2luZCBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMKKyAgICAgICAgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NNaWNGYWlsdXJlSW5kCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfTG93TGV2ZWxJbmRUeXBlICB3ZGlJbmQ7CisgIHRwU2lyTWljRmFpbHVyZUluZCAgIHBIYWxNaWNGYWlsdXJlSW5kOworCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisgIAorICBwSGFsTWljRmFpbHVyZUluZCA9ICh0cFNpck1pY0ZhaWx1cmVJbmQpcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBpbmRpY2F0aW9uIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgLypGaWxsIGluIHRoZSBpbmRpY2F0aW9uIHBhcmFtZXRlcnMqLworICB3ZGlJbmQud2RpSW5kaWNhdGlvblR5cGUgPSBXRElfTUlDX0ZBSUxVUkVfSU5EOyAKKyAgd3BhbE1lbW9yeUNvcHkod2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaU1JQ0ZhaWx1cmVJbmZvLmJzc0lkLAorICAgICAgICAgICAgICAgICBwSGFsTWljRmFpbHVyZUluZC0+YnNzSWQsIFdESV9NQUNfQUREUl9MRU4pOworICB3cGFsTWVtb3J5Q29weSh3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpTUlDRmFpbHVyZUluZm8ubWFjU3JjQWRkciwKKyAgICAgICAgICAgICAgICAgcEhhbE1pY0ZhaWx1cmVJbmQtPmluZm8uc3JjTWFjQWRkciwgV0RJX01BQ19BRERSX0xFTik7CisgIHdwYWxNZW1vcnlDb3B5KHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlNSUNGYWlsdXJlSW5mby5tYWNUYUFkZHIsCisgICAgICAgICAgICAgICAgIHBIYWxNaWNGYWlsdXJlSW5kLT5pbmZvLnRhTWFjQWRkciwgV0RJX01BQ19BRERSX0xFTik7CisgIHdwYWxNZW1vcnlDb3B5KHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlNSUNGYWlsdXJlSW5mby5tYWNEc3RBZGRyLAorICAgICAgICAgICAgICAgICBwSGFsTWljRmFpbHVyZUluZC0+aW5mby5kc3RNYWNBZGRyLCBXRElfTUFDX0FERFJfTEVOKTsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaU1JQ0ZhaWx1cmVJbmZvLnVjTXVsdGljYXN0ID0gCisgICAgICAgICAgICAgICAgIHBIYWxNaWNGYWlsdXJlSW5kLT5pbmZvLm11bHRpY2FzdDsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaU1JQ0ZhaWx1cmVJbmZvLnVjSVYxID0gCisgICAgICAgICAgICAgICAgIHBIYWxNaWNGYWlsdXJlSW5kLT5pbmZvLklWMTsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaU1JQ0ZhaWx1cmVJbmZvLmtleUlkPSAKKyAgICAgICAgICAgICAgICAgcEhhbE1pY0ZhaWx1cmVJbmQtPmluZm8ua2V5SWQ7CisgIHdwYWxNZW1vcnlDb3B5KHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlNSUNGYWlsdXJlSW5mby5UU0MsCisgICAgICAgICAgICAgICAgIHBIYWxNaWNGYWlsdXJlSW5kLT5pbmZvLlRTQyxXRElfQ0lQSEVSX1NFUV9DVFJfU0laRSk7CisgIHdwYWxNZW1vcnlDb3B5KHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlNSUNGYWlsdXJlSW5mby5tYWNSeEFkZHIsCisgICAgICAgICAgICAgICAgIHBIYWxNaWNGYWlsdXJlSW5kLT5pbmZvLnJ4TWFjQWRkciwgV0RJX01BQ19BRERSX0xFTik7CisgIC8qTm90aWZ5IFVNQUMqLworICBwV0RJQ3R4LT53ZGlMb3dMZXZlbEluZENCKCAmd2RpSW5kLCBwV0RJQ3R4LT5wSW5kVXNlckRhdGEgKTsKKyAgCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NNaWNGYWlsdXJlSW5kKi8KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBGYXRhbCBGYWlsdXJlIEluZGljYXRpb24gZnVuY3Rpb24gKGNhbGxlZCB3aGVuIAorICAgICAgICBhbiBpbmRpY2F0aW9uIG9mIHRoaXMga2luZCBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZQorICAgICAgICBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NGYXRhbEVycm9ySW5kCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgV0RJX0xvd0xldmVsSW5kVHlwZSAgd2RpSW5kOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgaW5kaWNhdGlvbiBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIC8qISBUTyBETzogUGFyYW1ldGVycyBuZWVkIHRvIGJlIHVucGFja2VkIGFjY29yZGluZyB0byBIQUwgc3RydWN0Ki8KKyAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJGYXRhbCBmYWlsdXJlIHJlY2VpdmVkIGZyb20gZGV2aWNlICVkICIsIGhhbFN0YXR1cyApOworICAKKyAgLypGaWxsIGluIHRoZSBpbmRpY2F0aW9uIHBhcmFtZXRlcnMqLworICB3ZGlJbmQud2RpSW5kaWNhdGlvblR5cGUgICAgICAgICAgICAgPSBXRElfRkFUQUxfRVJST1JfSU5EOyAKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLnVzRXJyb3JDb2RlID0gV0RJX0VSUl9ERVZfSU5URVJOQUxfRkFJTFVSRTsgCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHBXRElDdHgtPndkaUxvd0xldmVsSW5kQ0IoICZ3ZGlJbmQsIHBXRElDdHgtPnBJbmRVc2VyRGF0YSApOworICAKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0ZhdGFsRXJyb3JJbmQqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBEZWxldGUgU1RBIEluZGljYXRpb24gZnVuY3Rpb24gKGNhbGxlZCB3aGVuIAorICAgICAgICBhbiBpbmRpY2F0aW9uIG9mIHRoaXMga2luZCBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZQorICAgICAgICBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NEZWxTVEFJbmQKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIHREZWxldGVTdGFDb250ZXh0UGFyYW1zICAgIGhhbERlbFNUQUN0eDsKKyAgV0RJX0xvd0xldmVsSW5kVHlwZSAgICAgICAgd2RpSW5kOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgaW5kaWNhdGlvbiBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIC8qIFBhcmFtZXRlcnMgbmVlZCB0byBiZSB1bnBhY2tlZCBhY2NvcmRpbmcgdG8gSEFMIHN0cnVjdCovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsRGVsU1RBQ3R4LCAKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBFdmVudERhdGEsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbERlbFNUQUN0eCkpOworCisgIC8qRmlsbCBpbiB0aGUgaW5kaWNhdGlvbiBwYXJhbWV0ZXJzKi8KKyAgd2RpSW5kLndkaUluZGljYXRpb25UeXBlICAgICAgICAgICAgID0gV0RJX0RFTF9TVEFfSU5EOyAKKworICB3cGFsTWVtb3J5Q29weSh3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpRGVsZXRlU1RBSW5kVHlwZS5tYWNBRERSMiwKKyAgICAgICAgICAgICAgICAgaGFsRGVsU1RBQ3R4LmFkZHIyLCBXRElfTUFDX0FERFJfTEVOKTsKKyAgd3BhbE1lbW9yeUNvcHkod2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaURlbGV0ZVNUQUluZFR5cGUubWFjQlNTSUQsCisgICAgICAgICAgICAgICAgIGhhbERlbFNUQUN0eC5ic3NJZCwgV0RJX01BQ19BRERSX0xFTik7CisKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaURlbGV0ZVNUQUluZFR5cGUudXNBc3NvY0lkID0gCisgICAgaGFsRGVsU1RBQ3R4LmFzc29jSWQ7CisgIHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlEZWxldGVTVEFJbmRUeXBlLnVjU1RBSWR4ICA9IAorICAgIGhhbERlbFNUQUN0eC5zdGFJZDsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaURlbGV0ZVNUQUluZFR5cGUud3B0UmVhc29uQ29kZSA9IAorICAgIGhhbERlbFNUQUN0eC5yZWFzb25Db2RlOyAKKworICAvKk5vdGlmeSBVTUFDKi8KKyAgcFdESUN0eC0+d2RpTG93TGV2ZWxJbmRDQiggJndkaUluZCwgcFdESUN0eC0+cEluZFVzZXJEYXRhICk7CisgIAorICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9Qcm9jZXNzRGVsU1RBSW5kKi8KKworLyoqCisqQGJyaWVmIFByb2Nlc3MgQ29leCBJbmRpY2F0aW9uIGZ1bmN0aW9uIChjYWxsZWQgd2hlbgorICAgICAgICBhbiBpbmRpY2F0aW9uIG9mIHRoaXMga2luZCBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZQorICAgICAgICBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NDb2V4SW5kCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfTG93TGV2ZWxJbmRUeXBlICB3ZGlJbmQ7CisgIHRDb2V4SW5kTXNnICAgICAgICAgIGhhbENvZXhJbmRNc2c7CisgIHdwdF91aW50MzIgICAgICAgICAgIGluZGV4OworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoIDAgKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgaW5kaWNhdGlvbiBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weSggJmhhbENvZXhJbmRNc2cuY29leEluZFBhcmFtcywgCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxDb2V4SW5kTXNnLmNvZXhJbmRQYXJhbXMpICk7CisKKyAgLypGaWxsIGluIHRoZSBpbmRpY2F0aW9uIHBhcmFtZXRlcnMqLworICB3ZGlJbmQud2RpSW5kaWNhdGlvblR5cGUgPSBXRElfQ09FWF9JTkQ7IAorICB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpQ29leEluZm8uY29leEluZFR5cGUgPSBoYWxDb2V4SW5kTXNnLmNvZXhJbmRQYXJhbXMuY29leEluZFR5cGU7IAorICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBXRElfQ09FWF9JTkRfREFUQV9TSVpFOyBpbmRleCsrKQorICB7CisgICAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaUNvZXhJbmZvLmNvZXhJbmREYXRhW2luZGV4XSA9IGhhbENvZXhJbmRNc2cuY29leEluZFBhcmFtcy5jb2V4SW5kRGF0YVtpbmRleF07IAorICB9CisKKyAgLy8gREVCVUcKKyAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICJbQ09FWCBXREldIENvZXggSW5kIFR5cGUgKCV4KSBkYXRhICgleCAleCAleCAleCkiLAorICAgICAgICAgICAgICB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpQ29leEluZm8uY29leEluZFR5cGUsIAorICAgICAgICAgICAgICB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpQ29leEluZm8uY29leEluZERhdGFbMF0sIAorICAgICAgICAgICAgICB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpQ29leEluZm8uY29leEluZERhdGFbMV0sIAorICAgICAgICAgICAgICB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpQ29leEluZm8uY29leEluZERhdGFbMl0sIAorICAgICAgICAgICAgICB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpQ29leEluZm8uY29leEluZERhdGFbM10gKTsgCisKKyAgLypOb3RpZnkgVU1BQyovCisgIHBXRElDdHgtPndkaUxvd0xldmVsSW5kQ0IoICZ3ZGlJbmQsIHBXRElDdHgtPnBJbmRVc2VyRGF0YSApOworICAKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc0NvZXhJbmQqLworCisvKioKKypAYnJpZWYgUHJvY2VzcyBUeCBDb21wbGV0ZSBJbmRpY2F0aW9uIGZ1bmN0aW9uIChjYWxsZWQgd2hlbgorICAgICAgICBhbiBpbmRpY2F0aW9uIG9mIHRoaXMga2luZCBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZQorICAgICAgICBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NUeENvbXBsZXRlSW5kCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfTG93TGV2ZWxJbmRUeXBlICB3ZGlJbmQ7CisgIHRUeENvbXBsSW5kTXNnICAgICAgIGhhbFR4Q29tcGxJbmRNc2c7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKCAwICk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgaW5kaWNhdGlvbiBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weSggJmhhbFR4Q29tcGxJbmRNc2cudHhDb21wbFBhcmFtcywgCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxUeENvbXBsSW5kTXNnLnR4Q29tcGxQYXJhbXMpICk7CisKKyAgLypGaWxsIGluIHRoZSBpbmRpY2F0aW9uIHBhcmFtZXRlcnMqLworICB3ZGlJbmQud2RpSW5kaWNhdGlvblR5cGUgPSBXRElfVFhfQ09NUExFVEVfSU5EOyAKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLnR4X2NvbXBsZXRlX3N0YXR1cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbFR4Q29tcGxJbmRNc2cudHhDb21wbFBhcmFtcy5zdGF0dXM7IAorCisgIC8qTm90aWZ5IFVNQUMqLworICBwV0RJQ3R4LT53ZGlMb3dMZXZlbEluZENCKCAmd2RpSW5kLCBwV0RJQ3R4LT5wSW5kVXNlckRhdGEgKTsKKyAgCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NUeENvbXBsZXRlSW5kKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKy8qKgorKkBicmllZiBQcm9jZXNzIE5vYSBBdHRyIEluZGljYXRpb24gZnVuY3Rpb24gKGNhbGxlZCB3aGVuCisgICAgICAgIGFuIGluZGljYXRpb24gb2YgdGhpcyBraW5kIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlCisgICAgICAgIGJ1cyBmcm9tIEhBTCkKKworIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0CisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZQorCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NQMnBOb2FBdHRySW5kCisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9Mb3dMZXZlbEluZFR5cGUgIHdkaUluZDsKKyAgdE5vYUF0dHJJbmRNc2cgICAgICAgaGFsTm9hQXR0ckluZE1zZzsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoIDAgKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBpbmRpY2F0aW9uIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAmaGFsTm9hQXR0ckluZE1zZy5ub2FBdHRySW5kUGFyYW1zLAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxOb2FBdHRySW5kTXNnLm5vYUF0dHJJbmRQYXJhbXMpICk7CisKKyAgLypGaWxsIGluIHRoZSBpbmRpY2F0aW9uIHBhcmFtZXRlcnMqLworICB3ZGlJbmQud2RpSW5kaWNhdGlvblR5cGUgPSBXRElfUDJQX05PQV9BVFRSX0lORDsKKyAgCisgIHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby5zdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYWxOb2FBdHRySW5kTXNnLm5vYUF0dHJJbmRQYXJhbXMuc3RhdHVzOworICAKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaVAycE5vYUF0dHJJbmZvLnVjSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYWxOb2FBdHRySW5kTXNnLm5vYUF0dHJJbmRQYXJhbXMuaW5kZXg7CisgIHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby51Y09wcFBzRmxhZworICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbE5vYUF0dHJJbmRNc2cubm9hQXR0ckluZFBhcmFtcy5vcHBQc0ZsYWc7CisgIHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby51c0N0V2luCisgICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFsTm9hQXR0ckluZE1zZy5ub2FBdHRySW5kUGFyYW1zLmN0V2luOworICAKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaVAycE5vYUF0dHJJbmZvLnVzTm9hMUludGVydmFsQ250CisgICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFsTm9hQXR0ckluZE1zZy5ub2FBdHRySW5kUGFyYW1zLnVOb2ExSW50ZXJ2YWxDbnQ7CisgIHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby51c2xOb2ExRHVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYWxOb2FBdHRySW5kTXNnLm5vYUF0dHJJbmRQYXJhbXMudU5vYTFEdXJhdGlvbjsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaVAycE5vYUF0dHJJbmZvLnVzbE5vYTFJbnRlcnZhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbE5vYUF0dHJJbmRNc2cubm9hQXR0ckluZFBhcmFtcy51Tm9hMUludGVydmFsOworICB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpUDJwTm9hQXR0ckluZm8udXNsTm9hMVN0YXJ0VGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbE5vYUF0dHJJbmRNc2cubm9hQXR0ckluZFBhcmFtcy51Tm9hMVN0YXJ0VGltZTsKKyAgCisgIHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby51c05vYTJJbnRlcnZhbENudAorICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhhbE5vYUF0dHJJbmRNc2cubm9hQXR0ckluZFBhcmFtcy51Tm9hMkludGVydmFsQ250OworICB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpUDJwTm9hQXR0ckluZm8udXNsTm9hMkR1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgID0gaGFsTm9hQXR0ckluZE1zZy5ub2FBdHRySW5kUGFyYW1zLnVOb2EyRHVyYXRpb247CisgIHdkaUluZC53ZGlJbmRpY2F0aW9uRGF0YS53ZGlQMnBOb2FBdHRySW5mby51c2xOb2EySW50ZXJ2YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYWxOb2FBdHRySW5kTXNnLm5vYUF0dHJJbmRQYXJhbXMudU5vYTJJbnRlcnZhbDsKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaVAycE5vYUF0dHJJbmZvLnVzbE5vYTJTdGFydFRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoYWxOb2FBdHRySW5kTXNnLm5vYUF0dHJJbmRQYXJhbXMudU5vYTJTdGFydFRpbWU7CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHBXRElDdHgtPndkaUxvd0xldmVsSW5kQ0IoICZ3ZGlJbmQsIHBXRElDdHgtPnBJbmRVc2VyRGF0YSApOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7Cit9LypXRElfUHJvY2Vzc05vYUF0dHJJbmQqLworI2VuZGlmCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFR4IFBFUiBIaXQgSW5kaWNhdGlvbiBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gCisgICAgICAgIGFuIGluZGljYXRpb24gb2YgdGhpcyBraW5kIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlCisgICAgICAgIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1R4UGVySGl0SW5kCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfTG93TGV2ZWxJbmRUeXBlICB3ZGlJbmQ7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEV4dHJhY3QgaW5kaWNhdGlvbiBhbmQgc2VuZCBpdCB0byBVTUFDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKkZpbGwgaW4gdGhlIGluZGljYXRpb24gcGFyYW1ldGVycyovCisgIHdkaUluZC53ZGlJbmRpY2F0aW9uVHlwZSA9IFdESV9UWF9QRVJfSElUX0lORDsgCisgIAorICAvKk5vdGlmeSBVTUFDKi8KKyAgcFdESUN0eC0+d2RpTG93TGV2ZWxJbmRDQiggJndkaUluZCwgcFdESUN0eC0+cEluZFVzZXJEYXRhICk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1R4UGVySGl0SW5kKi8KKworI2lmZGVmIEFOSV9NQU5GX0RJQUcKKy8qKgorIEBicmllZiBXRElfUHJvY2Vzc0ZUTUNvbW1hbmRSZXEKKyAgICAgICAgUHJvY2VzcyBGVE0gQ29tbWFuZCwgc2ltcGx5IHJvdXRlIHRvIEhBTAorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRlRNQ29tbWFuZFJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0ZUTUNvbW1hbmRSZXFUeXBlICAqZnRtQ29tbWFuZFJlcSA9IE5VTEw7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgKmZ0bUNvbW1hbmRCdWZmZXIgPSBOVUxMOworICB3cHRfdWludDE2ICAgICAgICAgICAgICBkYXRhT2Zmc2V0OworICB3cHRfdWludDE2ICAgICAgICAgICAgICBidWZmZXJTaXplOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBmdG1Db21tYW5kUmVxID0gKFdESV9GVE1Db21tYW5kUmVxVHlwZSAqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisKKyAgLyogR2V0IE1TRyBCdWZmZXIgKi8KKyAgV0RJX0dldE1lc3NhZ2VCdWZmZXIocFdESUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgV0RJX0ZUTV9DTURfUkVRLAorICAgICAgICAgICAgICAgICAgICAgICBmdG1Db21tYW5kUmVxLT5ib2R5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAmZnRtQ29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKKworICB3cGFsTWVtb3J5Q29weShmdG1Db21tYW5kQnVmZmVyICsgZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgZnRtQ29tbWFuZFJlcS0+RlRNQ29tbWFuZEJvZHksCisgICAgICAgICAgICAgICAgIGZ0bUNvbW1hbmRSZXEtPmJvZHlMZW5ndGgpOworCisgIC8qIFNlbmQgTVNHICovCisgIHJldHVybiBXRElfU2VuZE1zZyhwV0RJQ3R4LAorICAgICAgICAgICAgICAgICAgICAgZnRtQ29tbWFuZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wQ0JmbmMsCisgICAgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICBXRElfRlRNX0NNRF9SRVNQKTsKK30KKworLyoqCisgQGJyaWVmIFdESV9Qcm9jZXNzRlRNQ29tbWFuZFJzcAorICAgICAgICBQcm9jZXNzIEZUTSBDb21tYW5kIFJlc3BvbnNlIGZyb20gSEFMLCBzaW1wbHkgcm91dGUgdG8gSEREIEZUTQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzRlRNQ29tbWFuZFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0ZUTUNvbW1hbmRSc3BDYiAgIGZ0bUNNRFJzcENiOworICB0UHJvY2Vzc1B0dFJzcFBhcmFtcyAqZnRtQ01EUnNwRGF0YSA9IE5VTEw7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICBXRElfQVNTRVJUKDApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgZnRtQ01EUnNwQ2IgPSAoV0RJX0ZUTUNvbW1hbmRSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7CisKKyAgZnRtQ01EUnNwRGF0YSA9ICh0UHJvY2Vzc1B0dFJzcFBhcmFtcyAqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisKKyAgd3BhbE1lbW9yeUNvcHkoKHZvaWQgKilwV0RJQ3R4LT51Y0ZUTUNvbW1hbmRSc3BCdWZmZXIsIAorICAgICAgICAgICAgICAgICAodm9pZCAqKSZmdG1DTURSc3BEYXRhLT5wdHRNc2dCdWZmZXIsIAorICAgICAgICAgICAgICAgICBmdG1DTURSc3BEYXRhLT5wdHRNc2dCdWZmZXIubXNnQm9keUxlbmd0aCk7CisKKyAgLypOb3RpZnkgVU1BQyovCisgIGZ0bUNNRFJzcENiKCh2b2lkICopcFdESUN0eC0+dWNGVE1Db21tYW5kUnNwQnVmZmVyLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9CisjZW5kaWYgLyogQU5JX01BTkZfRElBRyAqLworLyoqCisgQGJyaWVmIFdESV9Qcm9jZXNzSGFsRHVtcENtZFJlcQorICAgICAgICBQcm9jZXNzIGhhbCBkdW1wIENvbW1hbmQsIHNpbXBseSByb3V0ZSB0byBIQUwKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0hBTER1bXBDbWRSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIFdESV9IQUxEdW1wQ21kUmVxUGFyYW1zVHlwZSogIHB3ZGlIQUxEdW1wQ21kUGFyYW1zID0gTlVMTDsKKyAgV0RJX0hBTER1bXBDbWRSc3BDYiAgICAgICAgICAgd2RpSEFMRHVtcENtZFJzcENiID0gTlVMTDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICA9IDA7CisgIHRIYWxEdW1wQ21kUmVxTXNnICAgICAgICBoYWxEdW1wQ21kUmVxTXNnOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICA9IE5VTEw7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wQ0JmbmMgKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICBwd2RpSEFMRHVtcENtZFBhcmFtcyA9IChXRElfSEFMRHVtcENtZFJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGE7CisgIHdkaUhBTER1bXBDbWRSc3BDYiAgID0gKFdESV9IQUxEdW1wQ21kUnNwQ2IpcEV2ZW50RGF0YS0+cENCZm5jOworCisgIC8qIENvcHlpbmcgdGhlIEhBTCBEVU1QIENvbW1hbmQgSW5mb3JtYXRpb24gSEFMIFN0cnVjdHVyZSovCisgIGhhbER1bXBDbWRSZXFNc2cuZHVtcENtZFJlcVBhcmFtcy5hcmd1bWVudDEgPSAKKyAgICAgICAgICAgICAgICBwd2RpSEFMRHVtcENtZFBhcmFtcy0+d2RpSEFMRHVtcENtZEluZm9UeXBlLmNvbW1hbmQ7CisgIGhhbER1bXBDbWRSZXFNc2cuZHVtcENtZFJlcVBhcmFtcy5hcmd1bWVudDIgPSAKKyAgICAgICAgICAgICAgICBwd2RpSEFMRHVtcENtZFBhcmFtcy0+d2RpSEFMRHVtcENtZEluZm9UeXBlLmFyZ3VtZW50MTsKKyAgaGFsRHVtcENtZFJlcU1zZy5kdW1wQ21kUmVxUGFyYW1zLmFyZ3VtZW50MyA9IAorICAgICAgICAgICAgICAgIHB3ZGlIQUxEdW1wQ21kUGFyYW1zLT53ZGlIQUxEdW1wQ21kSW5mb1R5cGUuYXJndW1lbnQyOworICBoYWxEdW1wQ21kUmVxTXNnLmR1bXBDbWRSZXFQYXJhbXMuYXJndW1lbnQ0ID0gCisgICAgICAgICAgICAgICAgcHdkaUhBTER1bXBDbWRQYXJhbXMtPndkaUhBTER1bXBDbWRJbmZvVHlwZS5hcmd1bWVudDM7CisgIGhhbER1bXBDbWRSZXFNc2cuZHVtcENtZFJlcVBhcmFtcy5hcmd1bWVudDUgPSAKKyAgICAgICAgICAgICAgICBwd2RpSEFMRHVtcENtZFBhcmFtcy0+d2RpSEFMRHVtcENtZEluZm9UeXBlLmFyZ3VtZW50NDsKKyAgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9IQUxfRFVNUF9DTURfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxEdW1wQ21kUmVxTXNnLmR1bXBDbWRSZXFQYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8IAorICAgICAgICAgICAgKHVzRGF0YU9mZnNldCArIHNpemVvZihoYWxEdW1wQ21kUmVxTXNnLmR1bXBDbWRSZXFQYXJhbXMpICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBIQUwgRHVtcCBDb21tYW5kIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaUhBTER1bXBDbWRQYXJhbXMsIHdkaUhBTER1bXBDbWRSc3BDYik7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICZoYWxEdW1wQ21kUmVxTXNnLmR1bXBDbWRSZXFQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbER1bXBDbWRSZXFNc2cuZHVtcENtZFJlcVBhcmFtcykpOyAKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpSEFMRHVtcENtZFBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlIQUxEdW1wQ21kUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgU3RhcnQgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICB3ZGlIQUxEdW1wQ21kUnNwQ2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICBXRElfSEFMX0RVTVBfQ01EX1JFU1ApOyAKK30KKworLyoqCisgQGJyaWVmIFdESV9Qcm9jZXNzSGFsRHVtcENtZFJzcAorICAgICAgICBQcm9jZXNzIGhhbCBEdW1wIENvbW1hbmQgUmVzcG9uc2UgZnJvbSBIQUwsIHNpbXBseSByb3V0ZSB0byBIREQgCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NIQUxEdW1wQ21kUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfSEFMRHVtcENtZFJzcENiICAgICB3ZGlIQUxEdW1wQ21kUnNwQ2I7CisgIHRwSGFsRHVtcENtZFJzcFBhcmFtcyAgIGhhbER1bXBDbWRSc3BQYXJhbXM7CisgIFdESV9IQUxEdW1wQ21kUnNwUGFyYW1zVHlwZSB3ZGlIQUxEdW1wQ21kUnNwOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjayAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFdESUN0eCApIHx8ICggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkKKyAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICB3ZGlIQUxEdW1wQ21kUnNwQ2IgPSAoV0RJX0hBTER1bXBDbWRSc3BDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7IAorCisgIC8qSW5pdGlhbGl6ZSB0aGUgV0RJIFJlc3BvbnNlIHN0cnVjdHVyZSAqLworICB3ZGlIQUxEdW1wQ21kUnNwLnVzQnVmZmVyTGVuID0gMDsKKyAgd2RpSEFMRHVtcENtZFJzcC5wQnVmZmVyID0gTlVMTDsKKworICBoYWxEdW1wQ21kUnNwUGFyYW1zID0gKHRIYWxEdW1wQ21kUnNwUGFyYW1zICopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKyAgCisgIHdkaUhBTER1bXBDbWRSc3Aud2RpU3RhdHVzICAgPSAKKyAgICAgICAgICAgICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsRHVtcENtZFJzcFBhcmFtcy0+c3RhdHVzKTsgCisKKyAgaWYgKCggd2RpSEFMRHVtcENtZFJzcC53ZGlTdGF0dXMgID09ICBXRElfU1RBVFVTX1NVQ0NFU1MpICYmCisgICAgICAoaGFsRHVtcENtZFJzcFBhcmFtcy0+cnNwTGVuZ3RoICE9IDApKQorICB7CisgICAgICAvKiBDb3B5IHRoZSByZXNwb25zZSBkYXRhICovCisgICAgICB3ZGlIQUxEdW1wQ21kUnNwLnVzQnVmZmVyTGVuID0gaGFsRHVtcENtZFJzcFBhcmFtcy0+cnNwTGVuZ3RoOworICAgICAgd2RpSEFMRHVtcENtZFJzcC5wQnVmZmVyID0gd3BhbE1lbW9yeUFsbG9jYXRlKGhhbER1bXBDbWRSc3BQYXJhbXMtPnJzcExlbmd0aCk7CisgICAgICB3cGFsTWVtb3J5Q29weSggJmhhbER1bXBDbWRSc3BQYXJhbXMtPnJzcEJ1ZmZlciwgCisgICAgICAgICAgICAgICAgICB3ZGlIQUxEdW1wQ21kUnNwLnBCdWZmZXIsIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHdkaUhBTER1bXBDbWRSc3AudXNCdWZmZXJMZW4pKTsKKyAgfQorICAKKyAgLypOb3RpZnkgVU1BQyovCisgIHdkaUhBTER1bXBDbWRSc3BDYigmd2RpSEFMRHVtcENtZFJzcCwgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgIGlmKHdkaUhBTER1bXBDbWRSc3AucEJ1ZmZlciAhPSBOVUxMKQorICB7CisgICAgLyogRnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlciAqLworICAgIHdwYWxNZW1vcnlGcmVlKHdkaUhBTER1bXBDbWRSc3AucEJ1ZmZlcik7CisgIH0KKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgQ09OVFJMIFRSQU5TUE9SVCBJTlRFUkFDVElPTgorIAorICAgIENhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY29udHJvbCB0cmFuc3BvcnQgLSBmb3IgcmVjZWl2aW5nCisgICAgbm90aWZpY2F0aW9ucyBhbmQgcGFja2V0cyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qKgorIEBicmllZiAgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgdGhlIGNvbnRyb2wgdHJhbnNwb3J0IAorICAgd2hlbiBpdCB3aXNoZXMgdG8gc2VuZCB1cCBhIG5vdGlmaWNhdGlvbiBsaWtlIHRoZSBvbmVzCisgICBtZW50aW9uZWQgYWJvdmUuCisgCisgQHBhcmFtCisgICAgCisgICAgd2N0c0hhbmRsZTogICAgICAgaGFuZGxlIHRvIHRoZSBjb250cm9sIHRyYW5zcG9ydCBzZXJ2aWNlIAorICAgIHdjdHNFdmVudDogICAgICAgIHRoZSBldmVudCBiZWluZyBub3RpZmllZAorICAgIHdjdHNOb3RpZnlDQkRhdGE6IHRoZSBjYWxsYmFjayBkYXRhIG9mIHRoZSB1c2VyIAorICAgIAorIEBzZWUgIFdDVFNfT3BlblRyYW5zcG9ydAorICAKKyBAcmV0dXJuIE5vbmUgCisqLwordm9pZCAKK1dESV9Ob3RpZnlNc2dDVFNDQgorKAorICBXQ1RTX0hhbmRsZVR5cGUgICAgICAgIHdjdHNIYW5kbGUsIAorICBXQ1RTX05vdGlmeUV2ZW50VHlwZSAgIHdjdHNFdmVudCwKKyAgdm9pZCogICAgICAgICAgICAgICAgICB3Y3RzTm90aWZ5Q0JEYXRhCispCit7CisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCA9IChXRElfQ29udHJvbEJsb2NrVHlwZSopd2N0c05vdGlmeUNCRGF0YTsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgaWYgKE5VTEwgPT0gcFdESUN0eCApCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICBXRElfQVNTRVJUKDApOworICAgIHJldHVybjsgCisgIH0KKworICBpZiAoV0RJX0NPTlRST0xfQkxPQ0tfTUFHSUMgIT0gcFdESUN0eC0+bWFnaWMpCisgIHsKKyAgICAvKiBjYWxsYmFjayBwcmVzdW1hYmx5IG9jY3VycmVkIGFmdGVyIGNsb3NlICovCisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgY29udHJvbCBibG9jayIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuOyAKKyAgfQorCisgIGlmICggV0NUU19FVkVOVF9PUEVOID09IHdjdHNFdmVudCApCisgIHsKKyAgICAvKkZsYWcgbXVzdCBiZSBzZXQgYXRvbWljYWxseSBhcyBpdCBpcyBjaGVja2VkIGZyb20gaW5jb21pbmcgcmVxdWVzdAorICAgICAgZnVuY3Rpb25zKi8KKyAgICB3cGFsTXV0ZXhBY3F1aXJlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisgICAgcFdESUN0eC0+YkNUT3BlbmVkICAgPSBlV0xBTl9QQUxfVFJVRTsgCisKKyAgICAvKk5vdGhpbmcgdG8gZG8gLSBzbyB0cnkgdG8gZGVxdWV1ZSBhbnkgcGVuZGluZyByZXF1ZXN0IHRoYXQgbWF5IGhhdmUKKyAgICAgb2NjdXJyZWQgd2hpbGUgd2Ugd2VyZSB0cnlpbmcgdG8gZXN0YWJsaXNoIHRoaXMqLworICAgIFdESV9EZXF1ZXVlUGVuZGluZ1JlcShwV0RJQ3R4KTsKKyAgICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7ICAgCisgIH0KKyAgZWxzZSBpZiAgKCBXQ1RTX0VWRU5UX0NMT1NFID09IHdjdHNFdmVudCApIAorICB7CisgICAgLypGbGFnIG11c3QgYmUgc2V0IGF0b21pY2FsbHkgYXMgaXQgaXMgY2hlY2tlZCBmcm9tIGluY29taW5nIHJlcXVlc3QKKyAgICAgIGZ1bmN0aW9ucyovCisgICAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworICAgIHBXRElDdHgtPmJDVE9wZW5lZCAgID0gZVdMQU5fUEFMX0ZBTFNFOyAKKworICAgIC8qTm8gb3RoZXIgcmVxdWVzdCB3aWxsIGJlIHByb2Nlc3NlZCBmcm9tIG5vdyBvbiAtIGZhaWwgYWxsKi8KKyAgICBXRElfQ2xlYXJQZW5kaW5nUmVxdWVzdHMocFdESUN0eCk7IAorICAgIHdwYWxNdXRleFJlbGVhc2UoJnBXRElDdHgtPndwdE11dGV4KTsKKworICAgIC8qTm90aWZ5IHRoYXQgdGhlIENvbnRyb2wgQ2hhbm5lbCBpcyBjbG9zZWQgKi8KKyAgICB3cGFsRXZlbnRTZXQoJnBXRElDdHgtPndjdHNBY3Rpb25FdmVudCk7CisgIH0KKworfS8qV0RJX05vdGlmeU1zZ0NUU0NCKi8KKworCisvKioKKyBAYnJpZWYgICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IHRoZSBjb250cm9sIHRyYW5zcG9ydCAKKyAgICAgICAgICAgd2hlbiBpdCB3aXNoZXMgdG8gc2VuZCB1cCBhIHBhY2tldCByZWNlaXZlZCBvdmVyIHRoZQorICAgICAgICAgICBidXMuCisgCisgQHBhcmFtCisgICAgCisgICAgd2N0c0hhbmRsZTogIGhhbmRsZSB0byB0aGUgY29udHJvbCB0cmFuc3BvcnQgc2VydmljZSAKKyAgICBwTXNnOiAgICAgICAgdGhlIHBhY2tldAorICAgIHVMZW46ICAgICAgICB0aGUgcGFja2V0IGxlbmd0aAorICAgIHdjdHNSeE1zZ0NCRGF0YTogdGhlIGNhbGxiYWNrIGRhdGEgb2YgdGhlIHVzZXIgCisgICAgCisgQHNlZSAgV0NUU19PcGVuVHJhbnNwb3J0CisgIAorIEByZXR1cm4gTm9uZSAKKyovCit2b2lkIAorV0RJX1JYTXNnQ1RTQ0IgCisoCisgIFdDVFNfSGFuZGxlVHlwZSAgICAgICB3Y3RzSGFuZGxlLCAKKyAgdm9pZCogICAgICAgICAgICAgICAgIHBNc2csCisgIHdwdF91aW50MzIgICAgICAgICAgICB1TGVuLAorICB2b2lkKiAgICAgICAgICAgICAgICAgd2N0c1J4TXNnQ0JEYXRhCispCit7CisgIHRIYWxNc2dIZWFkZXIgICAgICAgICAgKnBIYWxNc2dIZWFkZXI7IAorICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsgCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCA9IChXRElfQ29udHJvbEJsb2NrVHlwZSopd2N0c1J4TXNnQ0JEYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBNc2cgKSB8fCAKKyAgICAgICggdUxlbiA8IHNpemVvZih0SGFsTXNnSGVhZGVyKSkpCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICBXRElfQVNTRVJUKDApOworICAgIHJldHVybjsgCisgIH0KKworICBpZiAoV0RJX0NPTlRST0xfQkxPQ0tfTUFHSUMgIT0gcFdESUN0eC0+bWFnaWMpCisgIHsKKyAgICAvKiBjYWxsYmFjayBwcmVzdW1hYmx5IG9jY3VycmVkIGFmdGVyIGNsb3NlICovCisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgY29udHJvbCBibG9jayIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuOyAKKyAgfQorCisgIC8qVGhlIFJYIENhbGxiYWNrIGlzIGV4cGVjdGVkIHRvIGJlIHNlcmlhbGl6ZWQgaW4gdGhlIHByb3BlciBjb250cm9sIHRocmVhZCAKKyAgICBjb250ZXh0IC0gc28gbm8gc2VyaWFsaXphdGlvbiBpcyBuZWNlc3NhcnkgaGVyZQorICAgICEgLSByZXZpc2l0IHRoaXMgYXNzdW1wdGlvbiAqLworCisgIHBIYWxNc2dIZWFkZXIgPSAodEhhbE1zZ0hlYWRlciAqKXBNc2c7CisKKyAgaWYgKCB1TGVuICE9IHBIYWxNc2dIZWFkZXItPm1zZ0xlbiApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiSW52YWxpZCBwYWNrZXQgcmVjZWl2ZWQgZnJvbSBIQUwgLSBjYXRhc3Ryb3BoaWMgZmFpbHVyZSIpOworICAgIFdESV9EZXRlY3RlZERldmljZUVycm9yKCBwV0RJQ3R4LCBXRElfRVJSX0lOVkFMSURfUlNQX0ZNVCk7IAorICAgIHJldHVybjsgCisgIH0KKworICB3ZGlFdmVudERhdGEud2RpUmVzcG9uc2UgPSBIQUxfMl9XRElfUlNQX1RZUEUoIHBIYWxNc2dIZWFkZXItPm1zZ1R5cGUgKTsKKworICAvKlRoZSBtZXNzYWdlIGl0c2VsZiBzdGFydHMgYWZ0ZXIgdGhlIGhlYWRlciovCisgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICA9ICh3cHRfdWludDgqKXBNc2cgKyBzaXplb2YodEhhbE1zZ0hlYWRlcik7CisgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSA9IHBIYWxNc2dIZWFkZXItPm1zZ0xlbiAtIHNpemVvZih0SGFsTXNnSGVhZGVyKTsKKyAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgID0gZ1dESUNiLnBmbmNSc3BDQjsKKyAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgID0gZ1dESUNiLnBSc3BDQlVzZXJEYXRhOworCisKKyAgaWYgKCB3ZGlFdmVudERhdGEud2RpUmVzcG9uc2UgPT0gIHBXRElDdHgtPndkaUV4cGVjdGVkUmVzcG9uc2UgKQorICB7CisgICAgLypTdG9wIHRoZSB0aW1lciBhcyB0aGUgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkICovCisgICAgLyohVVQgLSBjaGVjayBmb3IgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuIHN0b3AgYW5kIHJlc3BvbnNlICovCisgICAgd3BhbFRpbWVyU3RvcCgmcFdESUN0eC0+d3B0UmVzcG9uc2VUaW1lcik7CisgIH0KKyAgLyogQ2hlY2sgaWYgd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIG1lc3NhZ2Ugd2hpY2ggaXMgbm90IGV4cGVjdGVkICovCisgIGVsc2UgaWYgKCB3ZGlFdmVudERhdGEud2RpUmVzcG9uc2UgPCBXRElfSEFMX0lORF9NSU4gKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICJSZWNlaXZlZCByZXNwb25zZSAlcyAoJWQpIHdoZW4gZXhwZWN0aW5nICVzICglZCkgLSBjYXRhc3Ryb3BoaWMgZmFpbHVyZSIsCisgICAgICAgICAgICAgICBXRElfZ2V0UmVzcE1zZ1N0cmluZyh3ZGlFdmVudERhdGEud2RpUmVzcG9uc2UpLAorICAgICAgICAgICAgICAgd2RpRXZlbnREYXRhLndkaVJlc3BvbnNlLCAKKyAgICAgICAgICAgICAgIFdESV9nZXRSZXNwTXNnU3RyaW5nKHBXRElDdHgtPndkaUV4cGVjdGVkUmVzcG9uc2UpLAorICAgICAgICAgICAgICAgcFdESUN0eC0+d2RpRXhwZWN0ZWRSZXNwb25zZSk7CisgICAgLyogV0RJX0RldGVjdGVkRGV2aWNlRXJyb3IoIHBXRElDdHgsIFdESV9FUlJfSU5WQUxJRF9SU1BfRk1UKTsgKi8KKyAgICByZXR1cm47CisgIH0KKworICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgIlJ4IHNtdGggZnJvbSBIQUw6ICVkIiwgd2RpRXZlbnREYXRhLndkaVJlc3BvbnNlKTsKKworICAvKlBvc3QgcmVzcG9uc2UgZXZlbnQgdG8gdGhlIHN0YXRlIG1hY2hpbmUqLworICBXRElfUG9zdE1haW5FdmVudChwV0RJQ3R4LCBXRElfUkVTUE9OU0VfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworCit9LypXRElfUlhNc2dDVFNDQiovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgIEludGVybmFsIEhlbHBlciBSb3V0aW5lcyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorIEBicmllZiBXRElfQ2xlYW5DQiAtIGludGVybmFsIGhlbHBlciByb3V0aW5lIHVzZWQgdG8gY2xlYW4gdGhlIAorICAgICAgICBXREkgTWFpbiBDb250cm9sIEJsb2NrCisgCisgQHBhcmFtIHBXRElDdHggLSBwb2ludGVyIHRvIHRoZSBjb250cm9sIGJsb2NrCisKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dQVF9JTkxJTkUgV0RJX1N0YXR1cworV0RJX0NsZWFuQ0IKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4CispCit7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qQ2xlYW4gdGhlIFdESSBDb250cm9sIEJsb2NrKi8KKyAgd3BhbE1lbW9yeVplcm8oIHBXRElDdHgsIHNpemVvZigqcFdESUN0eCkpOyAKKworICBwV0RJQ3R4LT51R2xvYmFsU3RhdGUgID0gV0RJX01BWF9TVDsgCisgIHBXRElDdHgtPnVjTWF4QnNzaWRzICAgPSBXRElfTUFYX1NVUFBPUlRFRF9CU1M7CisgIHBXRElDdHgtPnVjTWF4U3RhdGlvbnMgPSBXRElfTUFYX1NVUFBPUlRFRF9TVEFTOworCisgIFdESV9SZXNldEFzc29jU2Vzc2lvbnMoIHBXRElDdHggKTsKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworfS8qV0RJX0NsZWFuQ0IqLworCisKKy8qKgorIEBicmllZiBQcm9jZXNzIHJlcXVlc3QgaGVscGVyIGZ1bmN0aW9uIAorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV1BUX0lOTElORSBXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlcXVlc3QKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIC8qISEgU2tpcCBzYW5pdHkgY2hlY2sgYXMgdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgRlNNIGZ1bmN0aW9uc3Mgd2hpY2ggCisgICAgYWxyZWFkeSBjaGVja2VkIHRoZXNlIHBvaW50ZXJzKi8KKworICBpZiAoKCBwRXZlbnREYXRhLT53ZGlSZXF1ZXN0IDwgV0RJX01BWF9VTUFDX0lORCApICYmCisgICAgICAoIE5VTEwgIT0gcGZuUmVxUHJvY1RibFtwRXZlbnREYXRhLT53ZGlSZXF1ZXN0XSApKQorICB7ICAKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICJDYWxsaW5nIHJlcXVlc3QgcHJvY2Vzc2luZyBmdW5jdGlvbiBmb3IgcmVxICVzICglZCkgJXgiLAorICAgICAgICAgICAgICBXRElfZ2V0UmVxTXNnU3RyaW5nKHBFdmVudERhdGEtPndkaVJlcXVlc3QpLAorICAgICAgICAgICAgICBwRXZlbnREYXRhLT53ZGlSZXF1ZXN0LCBwZm5SZXFQcm9jVGJsW3BFdmVudERhdGEtPndkaVJlcXVlc3RdKTsKKyAgICByZXR1cm4gcGZuUmVxUHJvY1RibFtwRXZlbnREYXRhLT53ZGlSZXF1ZXN0XShwV0RJQ3R4LCBwRXZlbnREYXRhKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiT3BlcmF0aW9uICVkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgIiwgCisgICAgICAgICAgICAgICBwRXZlbnREYXRhLT53ZGlSZXF1ZXN0KTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9JTVBMRU1FTlQ7CisgIH0KK30vKldESV9Qcm9jZXNzUmVxdWVzdCovCisKKworLyoqCisgQGJyaWVmIEdldCBtZXNzYWdlIGhlbHBlciBmdW5jdGlvbiAtIGl0IGFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgCisgICAgICAgIG1lc3NhZ2UgdGhhdCBpcyB0byBiZSBzZW50IHRvIEhBTCBhY2Nyb3NzIHRoZSBidXMgYW5kCisgICAgICAgIHByZWZpeGVzIGl0IHdpdGggYSBzZW5kIG1lc3NhZ2UgaGVhZGVyIAorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgd2RpUmVxVHlwZTogICAgICB0eXBlIG9mIHRoZSByZXF1ZXN0IGJlaW5nIHNlbnQKKyAgICAgICAgIHVCdWZmZXJMZW46ICAgICAgbWVzc2FnZSBidWZmZXIgbGVuCisgICAgICAgICBwTXNnQnVmZmVyOiAgICAgIHJlc3VsdGluZyBhbGxvY2F0ZWQgYnVmZmVyCisgICAgICAgICBwdXNEYXRhT2Zmc2V0OiAgICBvZmZzZXQgaW4gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgY2FsbGVyCisgICAgICAgICBjYW4gc3RhcnQgY29weWluZyBpdHMgbWVzc2FnZSBkYXRhCisgICAgICAgICBwdUJ1ZmZlclNpemU6ICAgIHRoZSByZXN1bHRpbmcgYnVmZmVyIHNpemUgKG9mZnNldCtidWZmCisgICAgICAgICBsZW4pCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9HZXRNZXNzYWdlQnVmZmVyCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsIAorICBXRElfUmVxdWVzdEVudW1UeXBlICAgIHdkaVJlcVR5cGUsIAorICB3cHRfdWludDE2ICAgICAgICAgICAgIHVzQnVmZmVyTGVuLAorICB3cHRfdWludDgqKiAgICAgICAgICAgIHBNc2dCdWZmZXIsIAorICB3cHRfdWludDE2KiAgICAgICAgICAgIHB1c0RhdGFPZmZzZXQsIAorICB3cHRfdWludDE2KiAgICAgICAgICAgIHB1c0J1ZmZlclNpemUKKykKK3sKKyAgdEhhbE1zZ0hlYWRlciAgaGFsTXNnSGVhZGVyOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgLyohISBObyBzYW5pdHkgY2hlY2sgaGVyZSBhcyB3ZSB0cnVzdCB0aGUgY2FsbGVkIC0gISBjaGVjayB0aGlzIGFzc3VtcHRpb24gCisgICAgYWdhaW4qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBUcnkgdG8gYWxsb2NhdGUgbWVzc2FnZSBidWZmZXIgZnJvbSBQQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAqcHVzQnVmZmVyU2l6ZSA9IHNpemVvZihoYWxNc2dIZWFkZXIpICsgdXNCdWZmZXJMZW47IAorICAqcE1zZ0J1ZmZlciAgID0gKHdwdF91aW50OCopd3BhbE1lbW9yeUFsbG9jYXRlKCpwdXNCdWZmZXJTaXplKTsKKyAgaWYgKCBOVUxMID09ICAqcE1zZ0J1ZmZlciApCisgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVzc2FnZSBidWZmZXIgZm9yIHJlcSAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgIFdESV9nZXRSZXFNc2dTdHJpbmcod2RpUmVxVHlwZSksCisgICAgICAgICAgICAgICB3ZGlSZXFUeXBlKTsgCisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX01FTV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIHRoZSBtZXNzYWdlIGhlYWRlcgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaGFsTXNnSGVhZGVyLm1zZ1R5cGUgPSBXRElfMl9IQUxfUkVRX1RZUEUod2RpUmVxVHlwZSk7IAorICBoYWxNc2dIZWFkZXIubXNnTGVuICA9IHNpemVvZihoYWxNc2dIZWFkZXIpICsgdXNCdWZmZXJMZW47IAorICAqcHVzRGF0YU9mZnNldCAgICAgICA9IHNpemVvZihoYWxNc2dIZWFkZXIpOyAKKyAgd3BhbE1lbW9yeUNvcHkoKnBNc2dCdWZmZXIsICZoYWxNc2dIZWFkZXIsIHNpemVvZihoYWxNc2dIZWFkZXIpKTsgCisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfR2V0TWVzc2FnZUJ1ZmZlciovCisKKworLyoqCisgQGJyaWVmIFNlbmQgbWVzc2FnZSBoZWxwZXIgZnVuY3Rpb24gLSBzZW5kcyBhIG1lc3NhZ2Ugb3ZlciB0aGUgCisgICAgICAgIGJ1cyB1c2luZyB0aGUgY29udHJvbCB0cmFucG9ydCBhbmQgc2F2ZXMgc29tZSBpbmZvIGluCisgICAgICAgIHRoZSBDQiAKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBTZW5kQnVmZmVyOiAgICAgYnVmZmVyIHRvIGJlIHNlbnQKKyAgCisgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgIHNpemUgb2YgdGhlIGJ1ZmZlciB0byBiZSBzZW50CisgICAgICAgICBwUnNwQ2I6ICAgICAgICAgICAgcmVzcG9uc2UgY2FsbGJhY2sgLSBzYXZlIGluIHRoZSBXREkKKyAgICAgICAgIENCCisgICAgICAgICBwVXNlckRhdGE6ICAgICAgICAgdXNlciBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgICAgIGNhbGxiYWNrCisgICAgICAgICB3ZGlFeHBlY3RlZFJlc3BvbnNlOiB0aGUgY29kZSBvZiB0aGUgcmVzcG9uc2UgdGhhdCBpcworICAgICAgICAgZXhwZWN0ZWQgdG8gYmUgcngtZWQgZm9yIHRoaXMgcmVxdWVzdAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NlbmRNc2cKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwgIAorICB3cHRfdWludDgqICAgICAgICAgICAgIHBTZW5kQnVmZmVyLCAKKyAgd3B0X3VpbnQzMiAgICAgICAgICAgICB1c1NlbmRTaXplLCAKKyAgdm9pZCogICAgICAgICAgICAgICAgICBwUnNwQ2IsIAorICB2b2lkKiAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YSwKKyAgV0RJX1Jlc3BvbnNlRW51bVR5cGUgICB3ZGlFeHBlY3RlZFJlc3BvbnNlCispCit7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2F2ZSBuZWVkZWQgaW5mbyBpbiB0aGUgQ0IgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhICAgICAgPSBwVXNlckRhdGE7CisgIHBXRElDdHgtPnBmbmNSc3BDQiAgICAgICAgICAgPSBwUnNwQ2I7IAorICBwV0RJQ3R4LT53ZGlFeHBlY3RlZFJlc3BvbnNlID0gd2RpRXhwZWN0ZWRSZXNwb25zZTsgCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgQ2FsbCB0aGUgQ1RTIHRvIHNlbmQgdGhpcyBtZXNzYWdlIG92ZXIgLSBmcmVlIG1lc3NhZ2UgYWZ0ZXJ3YXJkcworICAgICAtIG5vdGlmeSB0cmFuc3BvcnQgZmFpbHVyZQorICAgICBOb3RlOiBDVFMgaXMgcmVwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgbWVzc2FnZSBidWZmZXIuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIDAgIT0gV0NUU19TZW5kTWVzc2FnZSggcFdESUN0eC0+d2N0c0hhbmRsZSwgKHZvaWQqKXBTZW5kQnVmZmVyLCB1c1NlbmRTaXplICkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZW5kIG1lc3NhZ2Ugb3ZlciB0aGUgYnVzIC0gY2F0YXN0cm9waGljIGZhaWx1cmUiKTsKKworICAgICAgLypJbmZvcm0gVXBwZXIgTUFDIHRoYXQgdGhlIHJlcXVlc3QgY291bGQgbm90IGdvIHRocm91Z2gqLworICAgICAgaWYgKCBOVUxMICE9IHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICkKKyAgICAgIHsKKyAgICAgICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IoIFdESV9TVEFUVVNfRV9GQUlMVVJFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSApOyAKKyAgICAgICAgLy9TZXR0aW5nIHRoZSB3ZGlSZXFTdGF0dXNDQiBhbmQgcFJlcVN0YXR1c1VzZXJEYXRhIHRvIE5VTEwKKyAgICAgICAgLy9qdXN0IGluIGNhc2UgdGhlIGZvbGxvd2luZyByZXF1ZXN0IGZhaWxzIHRvIHNldCB0aGVtLgorICAgICAgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiA9IE5VTEw7CisgICAgICAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIC8qRnJlZSB0aGUgYnVmZmVyIHRvIHByZXZlbnQgbWVtb3J5IGxlYWsqLworICAgICAgLyp3cGFsTWVtb3J5RnJlZSggcFNlbmRCdWZmZXIpOworICAgICAgICBXQ1RTIEFQSSB0YWtlcyBvd25lcnNoaXAgb2YgdGhpcyBwb2ludGVyIGFuZCBpdCBpcyB0aGVyZWZvcmUgaW4gY2hhcmdlCisgICAgICAgIG9mIGZyZWVpbmcgaXQKKyAgICAgICoqLworICAgICAgV0RJX0RldGVjdGVkRGV2aWNlRXJyb3IoIHBXRElDdHgsIFdESV9FUlJfVFJBTlNQT1JUX0ZBSUxVUkUpOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICAvKkluZm9ybSBVcHBlciBNQUMgdGhhdCB0aGUgcmVxdWVzdCB3ZW50IHRocm91Z2gqLworICAgaWYgKCBOVUxMICE9IHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICkKKyAgIHsKKyAgICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IoIFdESV9TVEFUVVNfU1VDQ0VTUywgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhKTsgCisgICAgIC8vU2V0dGluZyB0aGUgd2RpUmVxU3RhdHVzQ0IgYW5kIHBSZXFTdGF0dXNVc2VyRGF0YSB0byBOVUxMCisgICAgIC8vanVzdCBpbiBjYXNlIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBmYWlscyB0byBzZXQgdGhlbS4KKyAgICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgPSBOVUxMOworICAgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBOVUxMOworICAgfQorCisgICAvKlN0YXJ0IHRpbWVyIGZvciB0aGUgZXhwZWN0ZWQgcmVzcG9uc2UgKi8KKyAgIHdwYWxUaW1lclN0YXJ0KCZwV0RJQ3R4LT53cHRSZXNwb25zZVRpbWVyLCBXRElfUkVTUE9OU0VfVElNRU9VVCk7CisKKyAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1NlbmRNc2cqLworCisKKworLyoqCisgQGJyaWVmIFNlbmQgaW5kaWNhdGlvbiBoZWxwZXIgZnVuY3Rpb24gLSBzZW5kcyBhIG1lc3NhZ2Ugb3ZlciAKKyAgICAgICAgdGhlIGJ1cyB1c2luZyB0aGUgY29udHJvbCB0cmFuc3BvcnQgYW5kIHNhdmVzIHNvbWUgaW5mbworICAgICAgICBpbiB0aGUgQ0IKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBTZW5kQnVmZmVyOiAgICAgYnVmZmVyIHRvIGJlIHNlbnQKKyAgICAgICAgIHVzU2VuZFNpemU6IHNpemUgb2YgdGhlIGJ1ZmZlciB0byBiZSBzZW50CisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU2VuZEluZGljYXRpb24KKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwgIAorICB3cHRfdWludDgqICAgICAgICAgICAgIHBTZW5kQnVmZmVyLCAKKyAgd3B0X3VpbnQzMiAgICAgICAgICAgICB1c1NlbmRTaXplCispCit7CisgICB3cHRfdWludDMyIHVTdGF0dXMgOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgQ2FsbCB0aGUgQ1RTIHRvIHNlbmQgdGhpcyBtZXNzYWdlIG92ZXIgCisgICAgIE5vdGU6IENUUyBpcyByZXBvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBtZXNzYWdlIGJ1ZmZlci4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHVTdGF0dXMgPSBXQ1RTX1NlbmRNZXNzYWdlKCBwV0RJQ3R4LT53Y3RzSGFuZGxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUgKTsKKworICAgLypJbmZvcm0gVXBwZXIgTUFDIGFib3V0IHRoZSBvdXRjb21lIG9mIHRoZSByZXF1ZXN0Ki8KKyAgIGlmICggTlVMTCAhPSBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiApCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgIlNlbmQgaW5kaWNhdGlvbiBzdGF0dXMgOiAlZCIsIHVTdGF0dXMpOworCisgICAgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiggKHVTdGF0dXMgIT0gMCApID8gV0RJX1NUQVRVU19FX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RJX1NUQVRVU19TVUNDRVNTLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEpOyAKKyAgIH0KKworICAgLypJZiBzZW5kaW5nIG9mIHRoZSBtZXNzYWdlIGZhaWxlZCAtIGl0IGlzIGNvbnNpZGVyZWQgY2F0YXN0cm9waGljIGFuZAorICAgICBpbmRpY2F0ZXMgYW4gZXJyb3Igd2l0aCB0aGUgZGV2aWNlKi8KKyAgIGlmICggMCAhPSB1U3RhdHVzKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNlbmQgaW5kaWNhdGlvbiBvdmVyIHRoZSBidXMgLSBjYXRhc3Ryb3BoaWMgZmFpbHVyZSIpOyAKKworICAgICAgV0RJX0RldGVjdGVkRGV2aWNlRXJyb3IoIHBXRElDdHgsIFdESV9FUlJfVFJBTlNQT1JUX0ZBSUxVUkUpOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30vKldESV9TZW5kSW5kaWNhdGlvbiovCisKKworLyoqCisgQGJyaWVmIFdESV9EZXRlY3RlZERldmljZUVycm9yIC0gY2FsbGVkIGludGVybmFsbHkgYnkgREFMIHdoZW4gCisgICAgICAgIGl0IGhhcyBkZXRlY3RlZCBhIGZhaWx1cmUgaW4gdGhlIGRldmljZSAKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgdXNFcnJvckNvZGU6ICAgIGVycm9yIGNvZGUgZGV0ZWN0ZWQgYnkgV0RJIG9yIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBIQUwKKyAgCisgQHNlZQorIEByZXR1cm4gTm9uZSAKKyovCit2b2lkCitXRElfRGV0ZWN0ZWREZXZpY2VFcnJvcgorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIHdwdF91aW50MTYgICAgICAgICAgICAgdXNFcnJvckNvZGUKKykKK3sKKyAgV0RJX0xvd0xldmVsSW5kVHlwZSAgd2RpSW5kOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgIkRldmljZSBFcnJvciBkZXRlY3RlZCBjb2RlOiAlZCAtIHRyYW5zaXRpb25pbmcgdG8gc3RvcHBlZCBzdGF0ZSIsCisgICAgICAgICAgICB1c0Vycm9yQ29kZSk7CisKKyAgd3BhbE11dGV4QWNxdWlyZSgmcFdESUN0eC0+d3B0TXV0ZXgpOworCisgIFdESV9TVEFUYWJsZVN0b3AocFdESUN0eCk7CisKKyAgV0RJX1Jlc2V0QXNzb2NTZXNzaW9ucyhwV0RJQ3R4KTsKKworICAvKlNldCB0aGUgZXhwZWN0ZWQgc3RhdGUgdHJhbnNpdGlvbiB0byBzdG9wcGVkIC0gYmVjYXVzZSB0aGUgZGV2aWNlCisgIGV4cGVyaWVuY2VkIGEgZmFpbHVyZSovCisgIHBXRElDdHgtPnVjRXhwZWN0ZWRTdGF0ZVRyYW5zaXRpb24gPSAgV0RJX1NUT1BQRURfU1Q7CisKKyAgLypUcmFuc2l0aW9uIHRvIHN0b3BwZWQgdG8gZmFpbCBhbGwgaW5jb21taW5nIHJlcXVlc3RzIGZyb20gdGhpcyBwb2ludCBvbiovCisgIFdESV9TVEFURV9UUkFOU0lUSU9OKCBwV0RJQ3R4LCBXRElfU1RPUFBFRF9TVCk7IAorCisgIFdESV9DbGVhclBlbmRpbmdSZXF1ZXN0cyhwV0RJQ3R4KTsgCisKKyAgLypUTyBETzogLSAgdGhlcmUgc2hvdWxkIGJlIGFuIGF0dGVtcHQgdG8gcmVzZXQgdGhlIGRldmljZSBoZXJlKi8KKworICB3cGFsTXV0ZXhSZWxlYXNlKCZwV0RJQ3R4LT53cHRNdXRleCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBOb3RpZnkgVU1BQyBpZiBhIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAocFdESUN0eC0+d2RpTG93TGV2ZWxJbmRDQikKKyAgeworICAgICB3ZGlJbmQud2RpSW5kaWNhdGlvblR5cGUgICAgICAgICAgICAgPSBXRElfRkFUQUxfRVJST1JfSU5EOyAKKyAgICAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLnVzRXJyb3JDb2RlID0gdXNFcnJvckNvZGU7IAorCisgICAgIHBXRElDdHgtPndkaUxvd0xldmVsSW5kQ0IoICZ3ZGlJbmQsICBwV0RJQ3R4LT5wSW5kVXNlckRhdGEpOworICB9Cit9LypXRElfRGV0ZWN0ZWREZXZpY2VFcnJvciovCisKKy8qKgorIEBicmllZiAgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgdGhlIHdwdCB3aGVuIGEgdGltZXIgdGhhdCAKKyAgICAgICAgICAgd2Ugc3RhcnRlZCBvbiBzZW5kIG1lc3NhZ2UgaGFzIGV4cGlyZSAtIHRoaXMgc2hvdWxkCisgICAgICAgICAgIG5ldmVyIGhhcHBlbiAtIGl0IG1lYW5zIGRldmljZSBpcyBzdHVjayBhbmQgY2Fubm90CisgICAgICAgICAgIHJlcGx5IC0gdHJpZ2dlciBjYXRhc3Ryb3BoaWMgZmFpbHVyZSAKKyBAcGFyYW0gCisgICAgCisgICAgcFVzZXJEYXRhOiB0aGUgY2FsbGJhY2sgZGF0YSBvZiB0aGUgdXNlciAocHRyIHRvIFdESSBDQikKKyAgICAKKyBAc2VlIAorIEByZXR1cm4gTm9uZSAKKyovCit2b2lkIAorV0RJX1Jlc3BvbnNlVGltZXJDQgorKAorICB2b2lkICpwVXNlckRhdGEKKykKK3sKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4ID0gKFdESV9Db250cm9sQmxvY2tUeXBlKilwVXNlckRhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgaWYgKE5VTEwgPT0gcFdESUN0eCApCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICBXRElfQVNTRVJUKDApOworICAgIHJldHVybjsgCisgIH0KKworICBpZiAoIFdESV9NQVhfUkVTUCAhPSBwV0RJQ3R4LT53ZGlFeHBlY3RlZFJlc3BvbnNlICkKKyAgeworCisgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAiVGltZW91dCBvY2N1cnJlZCB3aGlsZSB3YWl0aW5nIGZvciAlcyAoJWQpIG1lc3NhZ2UgZnJvbSBkZXZpY2UgIgorICAgICAgICAgICAgIiAtIGNhdGFzdHJvcGhpYyBmYWlsdXJlIiwgCisgICAgICAgICAgICBXRElfZ2V0UmVzcE1zZ1N0cmluZyhwV0RJQ3R4LT53ZGlFeHBlY3RlZFJlc3BvbnNlKSwKKyAgICAgICAgICAgIHBXRElDdHgtPndkaUV4cGVjdGVkUmVzcG9uc2UpOworICAvKiBXREkgdGltZW91dCBtZWFucyBSaXZhIGlzIG5vdCByZXNwb25kaW5nIG9yIFNNRCBjb21tdW5pY2F0aW9uIHRvIFJpdmEKKyAgICogaXMgbm90IGhhcHBlbmluZy4gVGhlIG9ubHkgcG9zc2libGUgd2F5IHRvIHJlY292ZXIgZnJvbSB0aGlzIGVycm9yCisgICAqIGlzIHRvIGluaXRpYXRlIFNTUiBmcm9tIEFQUFMgKi8KKyAgd3BhbFJpdmFTdWJ5c3RlbVJlc3RhcnQoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJUaW1lb3V0IG9jY3VycmVkIGJ1dCBub3Qgd2FpdGluZyBmb3IgYW55IHJlc3BvbnNlICVkIiwgCisgICAgICAgICAgICAgICAgIHBXRElDdHgtPndkaUV4cGVjdGVkUmVzcG9uc2UpOworICB9CisKKyAgcmV0dXJuOyAKKworfS8qV0RJX1Jlc3BvbnNlVGltZXJDQiovCisKKworLyoqCisgQGJyaWVmIFByb2Nlc3MgcmVzcG9uc2UgaGVscGVyIGZ1bmN0aW9uIAorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV1BUX0lOTElORSBXRElfU3RhdHVzCitXRElfUHJvY2Vzc1Jlc3BvbnNlCisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAvKiBTa2lwIHNhbml0eSBjaGVjayBhcyB0aGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBGU00gZnVuY3Rpb25zIHdoaWNoIAorICAgIGFscmVhZHkgY2hlY2tlZCB0aGVzZSBwb2ludGVycworICAgICEgLSByZXZpc2l0IHRoaXMgYXNzdW1wdGlvbiAqLworICBpZiAoKCBwRXZlbnREYXRhLT53ZGlSZXNwb25zZSA8IFdESV9NQVhfUkVTUCApICYmCisgICAgICAoIE5VTEwgIT0gcGZuUnNwUHJvY1RibFtwRXZlbnREYXRhLT53ZGlSZXNwb25zZV0gKSkKKyAgeyAgCisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAiQ2FsbGluZyByZXNwb25zZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIGZvciByZXNwICVzICglZCkgJXgiLCAKKyAgICAgICAgICAgICAgV0RJX2dldFJlc3BNc2dTdHJpbmcocEV2ZW50RGF0YS0+d2RpUmVzcG9uc2UpLAorICAgICAgICAgICAgICBwRXZlbnREYXRhLT53ZGlSZXNwb25zZSwgcGZuUnNwUHJvY1RibFtwRXZlbnREYXRhLT53ZGlSZXNwb25zZV0pOworICAgIHJldHVybiBwZm5Sc3BQcm9jVGJsW3BFdmVudERhdGEtPndkaVJlc3BvbnNlXShwV0RJQ3R4LCBwRXZlbnREYXRhKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiT3BlcmF0aW9uICVkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgIiwgCisgICAgICAgICAgICAgIHBFdmVudERhdGEtPndkaVJlc3BvbnNlKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9JTVBMRU1FTlQ7CisgIH0KK30vKldESV9Qcm9jZXNzUmVzcG9uc2UqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgIFFVRVVFIFNVUFBPUlQgVVRJTElUWSBGVU5DVElPTlMgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgQGJyaWVmICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSB0aGUgREFMIENvcmUgdG8gaGVscCBxdWV1ZSBhIAorICAgICAgICAgICByZXF1ZXN0IHRoYXQgY2Fubm90IGJlIHByb2Nlc3NlZCByaWdodCBhd2F5LiAKKyBAcGFyYW0gCisgICAgCisgICAgcFdESUN0eDogLSBwb2ludGVyIHRvIHRoZSBXREkgY29udHJvbCBibG9jaworICAgIHBFdmVudERhdGE6IC0gcG9pbnRlciB0byB0aGUgZXZudCBpbmZvIHRoYXQgbmVlZHMgdG8gYmUKKyAgICBxdWV1ZWQgCisgICAgCisgQHNlZSAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICAKKyovCitXRElfU3RhdHVzCitXRElfUXVldWVQZW5kaW5nUmVxCisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIHdwdF9saXN0X25vZGUqICAgICAgcE5vZGU7IAorICBXRElfRXZlbnRJbmZvVHlwZSogIHBFdmVudERhdGFRdWV1ZSA9IHdwYWxNZW1vcnlBbGxvY2F0ZShzaXplb2YoKnBFdmVudERhdGEpKTsKKyAgdm9pZCogICAgICAgICAgICAgICBwRXZlbnRJbmZvID0gTlVMTDsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICBpZiAoIE5VTEwgPT0gIHBFdmVudERhdGFRdWV1ZSApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcXVldWVpbmciKTsgCisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19NRU1fRkFJTFVSRTsKKyAgfQorCisgIHBFdmVudERhdGFRdWV1ZS0+cENCZm5jICAgICAgICAgID0gcEV2ZW50RGF0YS0+cENCZm5jOworICBwRXZlbnREYXRhUXVldWUtPnBVc2VyRGF0YSAgICAgICA9IHBFdmVudERhdGEtPnBVc2VyRGF0YTsKKyAgcEV2ZW50RGF0YVF1ZXVlLT51RXZlbnREYXRhU2l6ZSAgPSBwRXZlbnREYXRhLT51RXZlbnREYXRhU2l6ZTsKKyAgcEV2ZW50RGF0YVF1ZXVlLT53ZGlSZXF1ZXN0ICAgICAgPSBwRXZlbnREYXRhLT53ZGlSZXF1ZXN0OworICBwRXZlbnREYXRhUXVldWUtPndkaVJlc3BvbnNlICAgICA9IHBFdmVudERhdGEtPndkaVJlc3BvbnNlOyAKKworICBpZiggcEV2ZW50RGF0YS0+dUV2ZW50RGF0YVNpemUgIT0gMCAmJiBwRXZlbnREYXRhLT5wRXZlbnREYXRhICE9IE5VTEwgKQorICB7CisgICAgIHBFdmVudEluZm8gPSB3cGFsTWVtb3J5QWxsb2NhdGUocEV2ZW50RGF0YS0+dUV2ZW50RGF0YVNpemUpOworICAgCisgICAgIGlmICggTlVMTCA9PSAgcEV2ZW50SW5mbyApCisgICAgIHsKKyAgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcXVldWVpbmcgZXZlbnQgZGF0YSBpbmZvIik7IAorICAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICAgd3BhbE1lbW9yeUZyZWUocEV2ZW50RGF0YVF1ZXVlKTsKKyAgICAgICByZXR1cm4gV0RJX1NUQVRVU19NRU1fRkFJTFVSRTsKKyAgICAgfQorICAgCisgICAgIHdwYWxNZW1vcnlDb3B5KHBFdmVudEluZm8sIHBFdmVudERhdGEtPnBFdmVudERhdGEsIHBFdmVudERhdGEtPnVFdmVudERhdGFTaXplKTsKKworICB9CisgIHBFdmVudERhdGFRdWV1ZS0+cEV2ZW50RGF0YSA9IHBFdmVudEluZm87CisKKyAgLypTZW5kIHdwdCBhIHBvaW50ZXIgdG8gdGhlIG5vZGUgKHRoaXMgaXMgdGhlIDFzdCBlbGVtZW50IGluIHRoZSBldmVudCBkYXRhKSovCisgIHBOb2RlID0gKHdwdF9saXN0X25vZGUqKXBFdmVudERhdGFRdWV1ZTsgCisKKyAgd3BhbF9saXN0X2luc2VydF9iYWNrKCYocFdESUN0eC0+d3B0UGVuZGluZ1F1ZXVlKSwgcE5vZGUpOyAKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworfS8qV0RJX1F1ZXVlUGVuZGluZ1JlcSovCisKKy8qKgorIEBicmllZiAgICBDYWxsYmFjayBmdW5jdGlvbiBmb3Igc2VyaWFsaXppbmcgcXVldWVkIG1lc3NhZ2UgCisgICAgICAgICAgIHByb2Nlc3NpbmcgaW4gdGhlIGNvbnRyb2wgY29udGV4dAorIEBwYXJhbSAKKyAgICAKKyAgICBwTXNnIC0gcG9pbnRlciB0byB0aGUgbWVzc2FnZSAKKyAgICAKKyBAc2VlIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIAorKi8KK3ZvaWQgCitXRElfUEFMQ3RybE1zZ0NCCisoCisgd3B0X21zZyAqcE1zZworKQoreworICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEgPSBOVUxMOworICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHggICAgPSBOVUxMOyAKKyAgV0RJX1N0YXR1cyAgICAgICAgICAgICB3ZGlTdGF0dXM7IAorICBXRElfUmVxU3RhdHVzQ2IgICAgICAgIHBmblJlcVN0YXR1c0NCOyAKKyAgdm9pZCogICAgICAgICAgICAgICAgICBwVXNlckRhdGE7CisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICBpZiAoKCBOVUxMID09IHBNc2cgKXx8CisgICAgICAoIE5VTEwgPT0gKHBFdmVudERhdGEgPSAoV0RJX0V2ZW50SW5mb1R5cGUqKXBNc2ctPnB0cikpIHx8CisgICAgICAoIE5VTEwgPT0gKHBXRElDdHggID0gKFdESV9Db250cm9sQmxvY2tUeXBlKilwTXNnLT5wQ29udGV4dCApKSkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICJJbnZhbGlkIG1lc3NhZ2UgcmVjZWl2ZWQgb24gc2VyaWFsaXplIGN0cmwgY29udGV4dCBBUEkiKTsgCisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICByZXR1cm47IAorICB9CisKKyAgLypUcmFuc2l0aW9uIGJhY2sgdG8gdGhlIHN0YXRlIHRoYXQgd2UgaGFkIGJlZm9yZSBzZXJpYWxpemF0aW9uCisgIC0gc2VyaWFsaXphdGlvbiB0cmFuc2l0aW9ucyB1cyB0byBCVVNZIHRvIHN0b3AgYW55IGluY29tbWluZyByZXF1ZXN0cworICAhIFRPIERPIEw6IHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGhlcmUgaWYgYSByZXF1ZXN0IGNvbWVzIGluIGJldHdlZW4gdGhlCisgICBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aGUgcG9zdCBmdW5jdGlvbiovCisKKyAgV0RJX1NUQVRFX1RSQU5TSVRJT04oIHBXRElDdHgsIHBNc2ctPnZhbCk7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgQ2hlY2sgdG8gc2VlIHdoYXQgdHlwZSBvZiBldmVudCB3ZSBhcmUgc2VyaWFsaXppbmcKKyAgICAgLSByZXNwb25zZXMgYXJlIG5ldmVyIGV4cGVjdGVkIHRvIGNvbWUgdGhyb3VnaCBoZXJlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHN3aXRjaCAoIHBFdmVudERhdGEtPndkaVJlcXVlc3QgKQorICB7CisKKyAgY2FzZSBXRElfU1RPUF9SRVE6CisgICAgICAKKyAgICAgIHdkaVN0YXR1cyA9IFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9TVE9QX0VWRU5ULCBwRXZlbnREYXRhKTsKKyAgICAgIGJyZWFrOworCisKKyAgY2FzZSBXRElfTlZfRE9XTkxPQURfUkVROgorICAgICAgLy8gV2hlbiBXREkgU3RhdGUgaXMgV0RJX1NUQVJURURfU1QsIHNlbmQgV0RJIHJlcXVlc3QgbWVzc2FnZSB3aXRoIGV2ZW50IHR5cGUgV0RJX1JFUVVFU1RfRVZFTlQuCisgICAgICAvLyBJbiB0aGlzIGNhc2UsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGNhbGxlZCBmcm9tIHJlc3BvbnNlIHByb2Nlc3MsIHdlIGNvdWxkIGNhbGwgV0RJX1Byb2Nlc3NSZXF1ZXN0KCkgZGlyZWN0bHkuCisgICAgICBpZiAocFdESUN0eC0+dUdsb2JhbFN0YXRlID09IFdESV9TVEFSVEVEX1NUKSAgCisgICAgICB7CisgICAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIiVzOiBXRElfTlZfRE9XTkxPQURfUkVRIGNhbGxlZCBpbiBXRElfU1RBUlRFRF9TVCAtIHNlbmQgd2l0aCBXRElfUkVRVUVTVF9FVkVOVCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHdkaVN0YXR1cyA9IFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCBwRXZlbnREYXRhKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgd2RpU3RhdHVzID0gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1NUQVJUX0VWRU5ULCBwRXZlbnREYXRhKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgYnJlYWs7CisKKyAgZGVmYXVsdDogCisgICAgd2RpU3RhdHVzID0gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsIHBFdmVudERhdGEpOworICAgIGJyZWFrOworICB9Lypzd2l0Y2ggKCBwRXZlbnREYXRhLT53ZGlSZXF1ZXN0ICkqLworCisgIGlmICggV0RJX1NUQVRVU19TVUNDRVNTICE9IHdkaVN0YXR1cyAgKQorICB7CisgICAgV0RJX0V4dHJhY3RSZXF1ZXN0Q0JGcm9tRXZlbnQocEV2ZW50RGF0YSwgJnBmblJlcVN0YXR1c0NCLCAmcFVzZXJEYXRhKTsKKworICAgIGlmICggTlVMTCAhPSBwZm5SZXFTdGF0dXNDQiApCisgICAgeworICAgICAgLypGYWlsIHRoZSByZXF1ZXN0Ki8KKyAgICAgIHBmblJlcVN0YXR1c0NCKCB3ZGlTdGF0dXMsIHBVc2VyRGF0YSk7CisgICAgfQorICB9CisKKyAgLyogRnJlZSBkYXRhIC0gdGhhdCB3YXMgYWxsb2NhdGVkIHdoZW4gcXVldWVpbmcqLworICBpZiggcEV2ZW50RGF0YSAhPSBOVUxMICkKKyAgeworICAgICBpZiggcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSAhPSBOVUxMICkKKyAgICAgeworICAgICAgICB3cGFsTWVtb3J5RnJlZShwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgICAgfQorICAgICB3cGFsTWVtb3J5RnJlZShwRXZlbnREYXRhKTsKKyAgfQorCisgIGlmKCBwTXNnICE9IE5VTEwgKQorICB7CisgICAgIHdwYWxNZW1vcnlGcmVlKHBNc2cpOworICB9CisgIAorfS8qV0RJX1BBTEN0cmxNc2dDQiovCisKKy8qKgorIEBicmllZiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIERBTCBDb3JlIHRvIGhlbHAgZGVxdWV1ZQorICAgICAgICAgICBhbmQgc2NoZWR1bGUgZm9yIGV4ZWN1dGlvbiBhIHBlbmRpbmcgcmVxdWVzdCAKKyBAcGFyYW0gCisgICAgCisgICAgcFdESUN0eDogLSBwb2ludGVyIHRvIHRoZSBXREkgY29udHJvbCBibG9jaworICAgIHBFdmVudERhdGE6IC0gcG9pbnRlciB0byB0aGUgZXZudCBpbmZvIHRoYXQgbmVlZHMgdG8gYmUKKyAgICBxdWV1ZWQgCisgICAgCisgQHNlZSAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICAKKyovCitXRElfU3RhdHVzCitXRElfRGVxdWV1ZVBlbmRpbmdSZXEKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4CispCit7CisgIHdwdF9saXN0X25vZGUqICAgICAgcE5vZGUgICAgICA9IE5VTEw7IAorICBXRElfRXZlbnRJbmZvVHlwZSogIHBFdmVudERhdGE7CisgIHdwdF9tc2cqICAgICAgICAgICAgcGFsTXNnOyAKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIHdwYWxfbGlzdF9yZW1vdmVfZnJvbnQoJihwV0RJQ3R4LT53cHRQZW5kaW5nUXVldWUpLCAmcE5vZGUpOyAKKworICBpZiAoIE5VTEwgPT0gIHBOb2RlICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgIkxpc3QgaXMgZW1wdHkgLSByZXR1cm4iKTsgCisgICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgfQorCisgIC8qVGhlIG5vZGUgYWN0dWFsbHkgcG9pbnRzIHRvIHRoZSAxc3QgZWxlbWVudCBpbnNpZGUgdGhlIEV2ZW50IERhdGEgc3RydWN0IC0KKyAgICBqdXN0IGNhc3QgaXQgYmFjayB0byB0aGUgc3RydWN0Ki8KKyAgcEV2ZW50RGF0YSA9IChXRElfRXZlbnRJbmZvVHlwZSopcE5vZGU7IAorCisgIC8qU2VyaWFsaXplIHByb2Nlc3NpbmcgaW4gdGhlIGNvbnRyb2wgdGhyZWFkCisgICAgICFUTyBETzogLSBjaGVjayB0byBzZWUgaWYgdGhlc2UgYXJlIGFsbCB0aGUgbWVzc2FnZXMgcGFyYW1zIHRoYXQgbmVlZAorICAgICB0byBiZSBmaWxsZWQgaW4qLworICBwYWxNc2cgPSB3cGFsTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKHdwdF9tc2cpKTsKKworICBpZiAoIE5VTEwgPT0gIHBhbE1zZyApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESV9EZXF1ZXVlUGVuZGluZ1JlcTogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcGFsTXNnLiIpOyAKKyAgICBXRElfQVNTRVJUKDApOworICAgIHJldHVybiBXRElfU1RBVFVTX01FTV9GQUlMVVJFOyAKKyAgfQorICBwYWxNc2ctPnBDb250ZXh0ID0gcFdESUN0eDsgCisgIHBhbE1zZy0+Y2FsbGJhY2sgPSBXRElfUEFMQ3RybE1zZ0NCOworICBwYWxNc2ctPnB0ciAgICAgID0gcEV2ZW50RGF0YTsKKworICAvKlNhdmUgdGhlIGdsb2JhbCBzdGF0ZSBhcyB3ZSBuZWVkIGl0IG9uIHRoZSBvdGhlciBzaWRlKi8KKyAgcGFsTXNnLT52YWwgICAgICA9IHBXRElDdHgtPnVHbG9iYWxTdGF0ZTsgCisgICAgCisgIC8qVHJhbnNpdGlvbiBiYWNrIHRvIEJVU1kgYXMgd2UgbmVlZCB0byBoYW5kbGUgYSBxdWV1ZWQgcmVxdWVzdCovCisgIFdESV9TVEFURV9UUkFOU0lUSU9OKCBwV0RJQ3R4LCBXRElfQlVTWV9TVCk7CisgIAorICB3cGFsUG9zdEN0cmxNc2cocFdESUN0eC0+cFBBTENvbnRleHQsIHBhbE1zZyk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfUEVORElORzsKK30vKldESV9EZXF1ZXVlUGVuZGluZ1JlcSovCisKKworLyoqCisgQGJyaWVmICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSB0aGUgREFMIENvcmUgdG8gaGVscCBxdWV1ZSAKKyAgICAgICAgICAgYW4gYXNzb2NpYXRpb24gcmVxdWVzdCB0aGF0IGNhbm5vdCBiZSBwcm9jZXNzZWQgcmlnaHQKKyAgICAgICAgICAgYXdheS4tIFRoZSBhc3NvYyByZXF1ZXN0cyB3aWxsIGJlIHF1ZXVlZCBieSBCU1NJRCAKKyBAcGFyYW0gCisgICAgCisgICAgcFdESUN0eDogLSBwb2ludGVyIHRvIHRoZSBXREkgY29udHJvbCBibG9jaworICAgIHBFdmVudERhdGE6IHBvaW50ZXIgdG8gdGhlIGV2bnQgaW5mbyB0aGF0IG5lZWRzIHRvIGJlIHF1ZXVlZAorICAgIG1hY0JTU0lEOiBic3NpZAorICAgIAorIEBzZWUgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAgCisqLworV0RJX1N0YXR1cworV0RJX1F1ZXVlTmV3QXNzb2NSZXF1ZXN0CisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhLAorICB3cHRfbWFjQWRkciAgICAgICAgICAgIG1hY0JTU0lECispCit7CisgIHdwdF91aW50OCBpOyAKKyAgV0RJX0JTU1Nlc3Npb25UeXBlKiAgICAgcFNlc3Npb24gPSBOVUxMOyAKKyAgd3B0X2xpc3Rfbm9kZSogICAgICAgICAgcE5vZGU7IAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgICBwRXZlbnREYXRhUXVldWU7CisgIHZvaWQqICAgICAgICAgICAgICAgICAgIHBFdmVudEluZm87IAorICBXRElfTmV4dFNlc3Npb25JZFR5cGUqICBwU2Vzc2lvbklkRWxlbWVudDsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgICBTZWFyY2ggZm9yIGEgc2Vzc2lvbiB0aGF0IG1hdGNoZXMgdGhlIEJTU0lEIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGZvciAoIGkgPSAwOyBpIDwgV0RJX01BWF9CU1NfU0VTU0lPTlM7IGkrKyApCisgIHsKKyAgICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gcFdESUN0eC0+YUJTU1Nlc3Npb25zW2ldLmJJblVzZSApCisgICAgIHsKKyAgICAgICAvKkZvdW5kIGFuIGVtcHR5IHNlc3Npb24qLworICAgICAgIHBTZXNzaW9uID0gJnBXRElDdHgtPmFCU1NTZXNzaW9uc1tpXTsgCisgICAgICAgYnJlYWs7IAorICAgICB9CisgIH0KKworICBpZiAoIGkgPj0gIFdESV9NQVhfQlNTX1NFU1NJT05TICkKKyAgeworICAgIC8qQ2Fubm90IGZpbmQgYW55IGVtcHR5IHNlc3Npb25zKi8KKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisgIAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgaW4gdGhlIEJTU0lEIGZvciB0aGlzIHNlc3Npb24gYW5kIHNldCB0aGUgdXNhZ2UgZmxhZworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3cGFsTWVtb3J5Q29weShwV0RJQ3R4LT5hQlNTU2Vzc2lvbnNbaV0ubWFjQlNTSUQsIG1hY0JTU0lELCBXRElfTUFDX0FERFJfTEVOKTsKKyAgcFdESUN0eC0+YUJTU1Nlc3Npb25zW2ldLmJJblVzZSA9IGVXTEFOX1BBTF9UUlVFOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBhbmQgcGxhY2UgaXQgaW4gdGhlIHF1ZXVlIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBwRXZlbnREYXRhUXVldWUgPSAoV0RJX0V2ZW50SW5mb1R5cGUqKXdwYWxNZW1vcnlBbGxvY2F0ZShzaXplb2YoV0RJX0V2ZW50SW5mb1R5cGUpKTsKKyAgaWYgKCBOVUxMID09IHBFdmVudERhdGFRdWV1ZSApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIiVzOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBxdWV1ZSBub2RlIiwgX19GVU5DVElPTl9fKTsKKyAgICBXRElfQVNTRVJUKDApOworICAgIHJldHVybiBXRElfU1RBVFVTX01FTV9GQUlMVVJFOworICB9CisKKyAgcFNlc3Npb25JZEVsZW1lbnQgPSAoV0RJX05leHRTZXNzaW9uSWRUeXBlKil3cGFsTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKFdESV9OZXh0U2Vzc2lvbklkVHlwZSkpOworICBpZiAoIE5VTEwgPT0gcFNlc3Npb25JZEVsZW1lbnQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICIlczogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc2Vzc2lvbiBJRCIsIF9fRlVOQ1RJT05fXyk7CisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICB3cGFsTWVtb3J5RnJlZShwRXZlbnREYXRhUXVldWUpOworICAgIHJldHVybiBXRElfU1RBVFVTX01FTV9GQUlMVVJFOworICB9CisKKyAgcEV2ZW50SW5mbyA9IHdwYWxNZW1vcnlBbGxvY2F0ZShwRXZlbnREYXRhLT51RXZlbnREYXRhU2l6ZSk7CisgIGlmICggTlVMTCA9PSBwRXZlbnRJbmZvICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGV2ZW50IGRhdGEgaW5mbyIsIF9fRlVOQ1RJT05fXyk7CisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICB3cGFsTWVtb3J5RnJlZShwU2Vzc2lvbklkRWxlbWVudCk7CisgICAgd3BhbE1lbW9yeUZyZWUocEV2ZW50RGF0YVF1ZXVlKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19NRU1fRkFJTFVSRTsKKyAgfQorCisgIHBFdmVudERhdGFRdWV1ZS0+cENCZm5jICAgICAgICAgID0gcEV2ZW50RGF0YS0+cENCZm5jOworICBwRXZlbnREYXRhUXVldWUtPnBVc2VyRGF0YSAgICAgICA9IHBFdmVudERhdGEtPnBVc2VyRGF0YTsKKyAgcEV2ZW50RGF0YVF1ZXVlLT51RXZlbnREYXRhU2l6ZSAgPSBwRXZlbnREYXRhLT51RXZlbnREYXRhU2l6ZTsKKyAgcEV2ZW50RGF0YVF1ZXVlLT53ZGlSZXF1ZXN0ICAgICAgPSBwRXZlbnREYXRhLT53ZGlSZXF1ZXN0OworICBwRXZlbnREYXRhUXVldWUtPndkaVJlc3BvbnNlICAgICA9IHBFdmVudERhdGEtPndkaVJlc3BvbnNlOyAKKworICB3cGFsTWVtb3J5Q29weShwRXZlbnRJbmZvLCBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCBwRXZlbnREYXRhLT51RXZlbnREYXRhU2l6ZSk7CisgIHBFdmVudERhdGFRdWV1ZS0+cEV2ZW50RGF0YSA9IHBFdmVudEluZm87CisKKyAgLypTZW5kIHdwdCBhIHBvaW50ZXIgdG8gdGhlIG5vZGUgKHRoaXMgaXMgdGhlIDFzdCBlbGVtZW50IGluIHRoZSBldmVudCBkYXRhKSovCisgIHBOb2RlID0gKHdwdF9saXN0X25vZGUqKXBFdmVudERhdGFRdWV1ZTsgCisKKyAgLypUaGlzIGFzc29jaWF0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBxdWV1ZWQqLworICBwU2Vzc2lvbi0+YkFzc29jUmVxUXVldWVkID0gZVdMQU5fUEFMX1RSVUU7IAorCisgIHdwYWxfbGlzdF9pbnNlcnRfYmFjaygmKHBTZXNzaW9uLT53cHRQZW5kaW5nUXVldWUpLCBwTm9kZSk7IAorCisgIC8qV2UgbmVlZCB0byBtYWludGFpbiBhIHNlcGFyYXRlIGxpc3QgdGhhdCBrZWVwcyB0cmFjayBvZiB0aGUgb3JkZXIgaW4gd2hpY2gKKyAgdGhlIG5ldyBhc3NvYyByZXF1ZXN0cyBhcmUgYmVpbmcgcXVldWVkIHN1Y2ggdGhhdCB3ZSBjYW4gc3RhcnQgcHJvY2Vzc2luZworICB0aGVtIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgaGFkIGFycml2ZWQqLworICBwU2Vzc2lvbklkRWxlbWVudC0+dWNJbmRleCA9IGk7IAorICBwTm9kZSA9ICh3cHRfbGlzdF9ub2RlKilwU2Vzc2lvbklkRWxlbWVudDsgCisKKyAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICJRdWV1ZWluZyB1cCBuZXcgYXNzb2Mgc2Vzc2lvbiA6ICVkICIsIHBTZXNzaW9uSWRFbGVtZW50LT51Y0luZGV4KTsKKyAgd3BhbF9saXN0X2luc2VydF9iYWNrKCZwV0RJQ3R4LT53cHRQZW5kaW5nQXNzb2NTZXNzaW9uSWRRdWV1ZSwgcE5vZGUpOyAKKworICAvKlJldHVybiBwZW5kaW5nIGFzIHRoaXMgaXMgd2hhdCB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0IGlzIHNpbmNlIGl0IGhhcworICAgIGJlZW4gcXVldWVkKi8KKyAgcmV0dXJuIFdESV9TVEFUVVNfUEVORElORzsKK30vKldESV9RdWV1ZU5ld0Fzc29jUmVxdWVzdCovCisKKy8qKgorIEBicmllZiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIERBTCBDb3JlIHRvIGhlbHAgcXVldWUgCisgICAgICAgICAgIGFuIGFzc29jaWF0aW9uIHJlcXVlc3QgdGhhdCBjYW5ub3QgYmUgcHJvY2Vzc2VkIHJpZ2h0CisgICAgICAgICAgIGF3YXkuLSBUaGUgYXNzb2MgcmVxdWVzdHMgd2lsbCBiZSBxdWV1ZWQgYnkgQlNTSUQgCisgQHBhcmFtIAorICAgIAorICAgIHBXRElDdHg6IC0gcG9pbnRlciB0byB0aGUgV0RJIGNvbnRyb2wgYmxvY2sKKyAgICBwU2Vzc2lvbjogLSBzZXNzaW9uIGluIHdoaWNoIHRvIHF1ZXVlCisgICAgcEV2ZW50RGF0YTogcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mbyB0aGF0IG5lZWRzIHRvIGJlCisgICAgcXVldWVkCisgICAgCisgQHNlZSAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICAKKyovCitXRElfU3RhdHVzCitXRElfUXVldWVBc3NvY1JlcXVlc3QKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfQlNTU2Vzc2lvblR5cGUqICAgIHBTZXNzaW9uLAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgd3B0X2xpc3Rfbm9kZSogICAgICBwTm9kZTsgCisgIFdESV9FdmVudEluZm9UeXBlKiAgcEV2ZW50RGF0YVF1ZXVlOworICB2b2lkKiAgICAgICAgICAgICAgIHBFdmVudEluZm87IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgIAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICAgIFNhbml0eSBjaGVjaworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoIE5VTEwgPT0gcFNlc3Npb24gKSB8fCAoIE5VTEwgPT0gcFdESUN0eCApKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgYW5kIHBsYWNlIGl0IGluIHRoZSBxdWV1ZSAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcEV2ZW50RGF0YVF1ZXVlID0gKFdESV9FdmVudEluZm9UeXBlKil3cGFsTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKFdESV9FdmVudEluZm9UeXBlKSk7CisgIGlmICggTlVMTCA9PSAgcEV2ZW50RGF0YVF1ZXVlICkKKyAgeworICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiJXM6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHF1ZXVlaW5nIiwgX19GVU5DVElPTl9fKTsgCisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19NRU1fRkFJTFVSRTsKKyAgfQorCisgIHBFdmVudEluZm8gPSB3cGFsTWVtb3J5QWxsb2NhdGUocEV2ZW50RGF0YS0+dUV2ZW50RGF0YVNpemUpOworICBpZiAoIE5VTEwgPT0gIHBFdmVudEluZm8gKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICIlczogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcXVldWVpbmcgZXZlbnQgZGF0YSBpbmZvIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICB3cGFsTWVtb3J5RnJlZShwRXZlbnREYXRhUXVldWUpOworICAgIHJldHVybiBXRElfU1RBVFVTX01FTV9GQUlMVVJFOworICB9CisKKyAgcEV2ZW50RGF0YVF1ZXVlLT5wQ0JmbmMgICAgICAgICAgPSBwRXZlbnREYXRhLT5wQ0JmbmM7CisgIHBFdmVudERhdGFRdWV1ZS0+cFVzZXJEYXRhICAgICAgID0gcEV2ZW50RGF0YS0+cFVzZXJEYXRhOworICBwRXZlbnREYXRhUXVldWUtPnVFdmVudERhdGFTaXplICA9IHBFdmVudERhdGEtPnVFdmVudERhdGFTaXplOworICBwRXZlbnREYXRhUXVldWUtPndkaVJlcXVlc3QgICAgICA9IHBFdmVudERhdGEtPndkaVJlcXVlc3Q7CisgIHBFdmVudERhdGFRdWV1ZS0+d2RpUmVzcG9uc2UgICAgID0gcEV2ZW50RGF0YS0+d2RpUmVzcG9uc2U7IAorICBwRXZlbnREYXRhUXVldWUtPnBFdmVudERhdGEgICAgICA9IHBFdmVudEluZm87CisKKyAgd3BhbE1lbW9yeUNvcHkocEV2ZW50SW5mbywgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgcEV2ZW50RGF0YS0+dUV2ZW50RGF0YVNpemUpOworCisgIC8qU2VuZCB3cHQgYSBwb2ludGVyIHRvIHRoZSBub2RlICh0aGlzIGlzIHRoZSAxc3QgZWxlbWVudCBpbiB0aGUgZXZlbnQgZGF0YSkqLworICBwTm9kZSA9ICh3cHRfbGlzdF9ub2RlKilwRXZlbnREYXRhUXVldWU7IAorCisgIC8qVGhpcyBhc3NvY2lhdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgcXVldWVkKi8KKyAgcFNlc3Npb24tPmJBc3NvY1JlcVF1ZXVlZCA9IGVXTEFOX1BBTF9UUlVFOyAKKworICB3cGFsX2xpc3RfaW5zZXJ0X2JhY2soJihwU2Vzc2lvbi0+d3B0UGVuZGluZ1F1ZXVlKSwgcE5vZGUpOyAKKworICAvKlRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24gaXMgcGVuZGluZyBiZWNhdXNlIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgcXVldWVkIGFuZCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBhdCBhIGxhdGVyIG1vbWVudCBpbiB0aW1lICovCisgIHJldHVybiBXRElfU1RBVFVTX1BFTkRJTkc7Cit9LypXRElfUXVldWVBc3NvY1JlcXVlc3QqLworCisvKioKKyBAYnJpZWYgICAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBEQUwgQ29yZSB0byBoZWxwIGRlcXVldWUKKyAgICAgICAgICAgYW4gYXNzb2NpYXRpb24gcmVxdWVzdCB0aGF0IHdhcyBwZW5kaW5nCisgICAgICAgICAgIFRoZSByZXF1ZXN0IHdpbGwgYmUgcXVldWVkIHVwIGluIGZyb250IG9mIHRoZSBtYWluCisgICAgICAgICAgIHBlbmRpbmcgcXVldWUgZm9yIGltZWRpYXRlIHByb2Nlc3NpbmcKKyBAcGFyYW0gCisgICAgCisgICAgcFdESUN0eDogLSBwb2ludGVyIHRvIHRoZSBXREkgY29udHJvbCBibG9jaworICAKKyAgICAKKyBAc2VlIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIAorKi8KK1dESV9TdGF0dXMKK1dESV9EZXF1ZXVlQXNzb2NSZXF1ZXN0CisoCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eAorKQoreworICB3cHRfbGlzdF9ub2RlKiAgICAgICAgICBwTm9kZSA9IE5VTEw7IAorICBXRElfTmV4dFNlc3Npb25JZFR5cGUqICBwU2Vzc2lvbklkRWxlbWVudDsgCisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgIHBTZXNzaW9uOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgIAorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICAgIFNhbml0eSBjaGVjaworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICggTlVMTCA9PSBwV0RJQ3R4ICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQW4gYXNzb2NpYXRpb24gaGFzIGJlZW4gY29tcGxldGVkID0+IGEgbmV3IGFzc29jaWF0aW9uIGNhbiBvY2N1cgorICAgIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IHBlbmRpbmcgYXNzb2NpYXRpb25zIC0+CisgICAgSWYgc28gLCB0cmFuc2ZlciBhbGwgdGhlIHBlbmRpbmcgcmVxdWVzdHMgaW50byB0aGUgYnVzeSBxdWV1ZSBmb3IKKyAgICBwcm9jZXNzaW5nCisgICAgVGhlc2UgcmVxdWVzdHMgaGF2ZSBhcnJpdmVkIHByaW9yIHRvIHRoZSByZXF1ZXN0cyBpbiB0aGUgYnVzeSBxdWV1ZQorICAgIChiYyB0aGV5IG5lZWRlZCB0byBiZSBwcm9jZXNzZWQgaW4gb3JkZXIgdG8gYmUgcGxhY2VkIGluIHRoaXMgcXVldWUpCisgICAgPT4gdGhleSB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgZnJvbnQgb2YgdGhlIGJ1c3kgcXVldWUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgd3BhbF9saXN0X3JlbW92ZV9mcm9udCgmKHBXRElDdHgtPndwdFBlbmRpbmdBc3NvY1Nlc3Npb25JZFF1ZXVlKSwgJnBOb2RlKTsgCisKKyAgaWYgKCBOVUxMID09ICBwTm9kZSApCisgIHsKKyAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICJMaXN0IGlzIGVtcHR5IC0gcmV0dXJuIik7IAorICAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7CisgIH0KKworICAvKlRoZSBub2RlIGFjdHVhbGx5IHBvaW50cyB0byB0aGUgMXN0IGVsZW1lbnQgaW5zaWRlIHRoZSBTZXNzaW9uIElkIHN0cnVjdCAtCisgICAganVzdCBjYXN0IGl0IGJhY2sgdG8gdGhlIHN0cnVjdCovCisgIHBTZXNzaW9uSWRFbGVtZW50ID0gKFdESV9OZXh0U2Vzc2lvbklkVHlwZSopcE5vZGU7IAorCisgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAiRGVxdWV1ZWluZyBuZXcgYXNzb2Mgc2Vzc2lvbiA6ICVkICIsIHBTZXNzaW9uSWRFbGVtZW50LT51Y0luZGV4KTsKKworICBpZiAoIHBTZXNzaW9uSWRFbGVtZW50LT51Y0luZGV4IDwgV0RJX01BWF9CU1NfU0VTU0lPTlMgKQorICB7CisgICAgICBwU2Vzc2lvbiA9ICZwV0RJQ3R4LT5hQlNTU2Vzc2lvbnNbcFNlc3Npb25JZEVsZW1lbnQtPnVjSW5kZXhdOworICAgICAgCisgICAgICAvKlRyYW5zZmVyIGFsbCB0aGUgcGVuZGluZyByZXF1ZXN0cyBpbiB0aGlzIGFzc29jIHF1ZXVlIHRvCisgICAgICB0aGUgZnJvbnQgb2YgdGhlIG1haW4gd2FpdGluZyBxdWV1ZSBmb3Igc3Vic2VxdWVudCBleGVjdXRpb24qLyAgICAgIAorICAgICAgd3BhbF9saXN0X3JlbW92ZV9iYWNrKCYocFNlc3Npb24tPndwdFBlbmRpbmdRdWV1ZSksICZwTm9kZSk7IAorICAgICAgd2hpbGUgKCBOVUxMICE9ICBwTm9kZSApCisgICAgICB7CisgICAgICAgIC8qUGxhY2UgaXQgaW4gZnJvbnQgb2YgdGhlIG1haW4gcGVuZGluZyBsaXN0Ki8KKyAgICAgICAgd3BhbF9saXN0X2luc2VydF9mcm9udCggJihwV0RJQ3R4LT53cHRQZW5kaW5nUXVldWUpLCAmcE5vZGUpOyAKKyAgICAgICAgd3BhbF9saXN0X3JlbW92ZV9iYWNrKCYocFNlc3Npb24tPndwdFBlbmRpbmdRdWV1ZSksICZwTm9kZSk7IAorICAgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAiSW52YWxpZCBzZXNzaW9uIGlkIHF1ZXVlZCB1cCBmb3IgYXNzb2MiKTsgCisgICAgIFdQQUxfQVNTRVJUKDApOworICAgICB3cGFsTWVtb3J5RnJlZShwU2Vzc2lvbklkRWxlbWVudCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKyAgCisgIC8qQ2xlYW4gdGhpcyB1cCBhcyBpdCBpcyBubyBsb25nZXIgbmVlZGVkIGluIG9yZGVyIHRvIHByZXZlbnQgbWVtb3J5IGxlYWsqLworICB3cGFsTWVtb3J5RnJlZShwU2Vzc2lvbklkRWxlbWVudCk7CisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7Cit9LypXRElfRGVxdWV1ZUFzc29jUmVxdWVzdCovCisKKy8qKgorIEBicmllZiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIERBTCBDb3JlIHRvIGNsZWFyIGFueSAKKyAgICAgICAgICAgcGVuZGluZyByZXF1ZXN0cyAtIGFsbCByZXEgY2Igd2lsbCBiZSBjYWxsZWQgd2l0aAorICAgICAgICAgICBmYWlsdXJlIGFuZCB0aGUgcXVldWUgd2lsbCBiZSBlbXB0aWVkLgorIEBwYXJhbSAKKyAgICAKKyAgICBwV0RJQ3R4OiAtIHBvaW50ZXIgdG8gdGhlIFdESSBjb250cm9sIGJsb2NrCisgICAgCisgQHNlZSAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICAKKyovCitXRElfU3RhdHVzCitXRElfQ2xlYXJQZW5kaW5nUmVxdWVzdHMKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eAorKQoreworICB3cHRfbGlzdF9ub2RlKiAgICAgIHBOb2RlID0gTlVMTDsgCisgIFdESV9FdmVudEluZm9UeXBlKiAgcEV2ZW50RGF0YVF1ZXVlID0gTlVMTDsKKyAgV0RJX1JlcVN0YXR1c0NiICAgICBwZm5SZXFTdGF0dXNDQjsgCisgIHZvaWQqICAgICAgICAgICAgICAgcFVzZXJEYXRhOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgd3BhbF9saXN0X3JlbW92ZV9mcm9udCgmKHBXRElDdHgtPndwdFBlbmRpbmdRdWV1ZSksICZwTm9kZSk7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR28gdGhyb3VnaCBhbGwgdGhlIHJlcXVlc3RzIGFuZCBmYWlsIHRoZW0gLSB0aGlzIHdpbGwgb25seSBiZSBjYWxsZWQKKyAgICB3aGVuIGRldmljZSBpcyBiZWluZyBzdG9wcGVkIG9yIGFuIGVycm9yIHdhcyBkZXRlY3RlZCAtIGVpdGhlciBjYXNlIHRoZQorICAgIHBlbmRpbmcgcmVxdWVzdHMgY2FuIG5vIGxvbmdlciBiZSBzZW50IGRvd24gdG8gSEFMIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB3aGlsZSggcE5vZGUgKQorICB7CisgICAgICAvKlRoZSBub2RlIGFjdHVhbGx5IHBvaW50cyB0byB0aGUgMXN0IGVsZW1lbnQgaW5zaWRlIHRoZSBFdmVudCBEYXRhIHN0cnVjdCAtCisgICAganVzdCBjYXN0IGl0IGJhY2sgdG8gdGhlIHN0cnVjdCovCisgICAgcEV2ZW50RGF0YVF1ZXVlID0gKFdESV9FdmVudEluZm9UeXBlKilwTm9kZTsgCisgIAorICAgIFdESV9FeHRyYWN0UmVxdWVzdENCRnJvbUV2ZW50KHBFdmVudERhdGFRdWV1ZSwgJnBmblJlcVN0YXR1c0NCLCAmcFVzZXJEYXRhKTsKKyAgICBpZiAoIE5VTEwgIT0gcGZuUmVxU3RhdHVzQ0IgKQorICAgIHsKKyAgICAgIC8qRmFpbCB0aGUgcmVxdWVzdCovCisgICAgICBwZm5SZXFTdGF0dXNDQiggV0RJX1NUQVRVU19FX0ZBSUxVUkUsIHBVc2VyRGF0YSk7CisgICAgfQorICAgIC8qIEZyZWUgZGF0YSAtIHRoYXQgd2FzIGFsbG9jYXRlZCB3aGVuIHF1ZXVlaW5nICovCisgICAgaWYgKCBwRXZlbnREYXRhUXVldWUtPnBFdmVudERhdGEgIT0gTlVMTCApCisgICAgeworICAgICAgd3BhbE1lbW9yeUZyZWUocEV2ZW50RGF0YVF1ZXVlLT5wRXZlbnREYXRhKTsKKyAgICB9CisgICAgd3BhbE1lbW9yeUZyZWUocEV2ZW50RGF0YVF1ZXVlKTsKKworICAgIGlmICh3cGFsX2xpc3RfcmVtb3ZlX2Zyb250KCYocFdESUN0eC0+d3B0UGVuZGluZ1F1ZXVlKSwgJnBOb2RlKSAhPSAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IAorIAorICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworfS8qV0RJX0NsZWFyUGVuZGluZ1JlcXVlc3RzKi8KKworLyoqCisgQGJyaWVmIEhlbHBlciByb3V0aW5lIHVzZWQgdG8gaW5pdCB0aGUgQlNTIFNlc3Npb25zIGluIHRoZSBXREkgY29udHJvbCBibG9jayAKKyAgCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAKKyBAc2VlCisqLwordm9pZAorV0RJX1Jlc2V0QXNzb2NTZXNzaW9ucworKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICAgcFdESUN0eAorKQoreworICB3cHRfdWludDggaTsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE5vIFNhbml0eSBjaGVjaworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgZm9yICggaSA9IDA7IGkgPCBXRElfTUFYX0JTU19TRVNTSU9OUzsgaSsrICkKKyAgeworICAgIHdwYWxNZW1vcnlaZXJvKCAmcFdESUN0eC0+YUJTU1Nlc3Npb25zW2ldLCBzaXplb2YoV0RJX0JTU1Nlc3Npb25UeXBlKSApOyAKKyAgICBwV0RJQ3R4LT5hQlNTU2Vzc2lvbnNbaV0ud2RpQXNzb2NTdGF0ZSA9IFdESV9BU1NPQ19JTklUX1NUOworICAgIHBXRElDdHgtPmFCU1NTZXNzaW9uc1tpXS5iY2FzdFN0YUlkeCA9IFdESV9TVEFfSU5WQUxJRF9JRFg7CisgICAgcFdESUN0eC0+YUJTU1Nlc3Npb25zW2ldLnVjQlNTSWR4ID0gV0RJX0JTU19JTlZBTElEX0lEWDsKKyAgfQorfS8qV0RJX1Jlc2V0QXNzb2NTZXNzaW9ucyovCisKKy8qKgorIEBicmllZiBIZWxwZXIgcm91dGluZSB1c2VkIHRvIGZpbmQgYSBzZXNzaW9uIGJhc2VkIG9uIHRoZSBCU1NJRCAKKyAgCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgbWFjQlNTSUQ6ICAgICAgQlNTSUQgb2YgdGhlIHNlc3Npb24KKyAgICAgICAgIHBTZXNzaW9uOiAgICAgIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gKGlmIGZvdW5kKSAKKyAgCisgQHNlZQorIEByZXR1cm4gSW5kZXggb2YgdGhlIHNlc3Npb24gaW4gdGhlIGFycmF5IAorKi8KK3dwdF91aW50OAorV0RJX0ZpbmRBc3NvY1Nlc3Npb24KKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgIHBXRElDdHgsCisgIHdwdF9tYWNBZGRyICAgICAgICAgICAgIG1hY0JTU0lELAorICBXRElfQlNTU2Vzc2lvblR5cGUqKiAgICBwcFNlc3Npb24KKykKK3sKKyAgd3B0X3VpbnQ4IGk7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcHBTZXNzaW9uICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gV0RJX01BWF9CU1NfU0VTU0lPTlM7IAorICB9CisKKyAgKnBwU2Vzc2lvbiA9IE5VTEw7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgICAgU2VhcmNoIGZvciBhIHNlc3Npb24gdGhhdCBtYXRjaGVzIHRoZSBCU1NJRCAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBmb3IgKCBpID0gMDsgaSA8IFdESV9NQVhfQlNTX1NFU1NJT05TOyBpKysgKQorICB7CisgICAgIGlmICggZVdMQU5fUEFMX1RSVUUgPT0gCisgICAgICAgICAgd3BhbE1lbW9yeUNvbXBhcmUocFdESUN0eC0+YUJTU1Nlc3Npb25zW2ldLm1hY0JTU0lELCBtYWNCU1NJRCwgV0RJX01BQ19BRERSX0xFTikgKQorICAgICB7CisgICAgICAgLypGb3VuZCB0aGUgc2Vzc2lvbiovCisgICAgICAgKnBwU2Vzc2lvbiA9ICZwV0RJQ3R4LT5hQlNTU2Vzc2lvbnNbaV07IAorICAgICAgIHJldHVybiBpOworICAgICB9CisgIH0KKworICByZXR1cm4gaTsgCit9LypXRElfRmluZEFzc29jU2Vzc2lvbiovCisKKy8qKgorIEBicmllZiBIZWxwZXIgcm91dGluZSB1c2VkIHRvIGZpbmQgYSBzZXNzaW9uIGJhc2VkIG9uIHRoZSBCU1NJRCAKKyAgCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICB1Y0JTU0lkeDogIEJTUyBJbmRleCBvZiB0aGUgc2Vzc2lvbgorICAgICAgICAgcHBTZXNzaW9uOiBvdXQgcG9pbnRlciB0byB0aGUgc2Vzc2lvbiAoaWYgZm91bmQpCisgIAorIEBzZWUKKyBAcmV0dXJuIEluZGV4IG9mIHRoZSBzZXNzaW9uIGluIHRoZSBhcnJheSAKKyovCit3cHRfdWludDgKK1dESV9GaW5kQXNzb2NTZXNzaW9uQnlCU1NJZHgKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgIHBXRElDdHgsCisgIHdwdF91aW50MTYgICAgICAgICAgICAgIHVjQlNTSWR4LAorICBXRElfQlNTU2Vzc2lvblR5cGUqKiAgICBwcFNlc3Npb24KKykKK3sKKyAgd3B0X3VpbnQ4IGk7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gcHBTZXNzaW9uICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gV0RJX01BWF9CU1NfU0VTU0lPTlM7IAorICB9CisKKyAgKnBwU2Vzc2lvbiA9IE5VTEw7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgICAgU2VhcmNoIGZvciBhIHNlc3Npb24gdGhhdCBtYXRjaGVzIHRoZSBCU1NJRCAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBmb3IgKCBpID0gMDsgaSA8IFdESV9NQVhfQlNTX1NFU1NJT05TOyBpKysgKQorICB7CisgICAgIGlmICggdWNCU1NJZHggPT0gcFdESUN0eC0+YUJTU1Nlc3Npb25zW2ldLnVjQlNTSWR4ICkKKyAgICAgeworICAgICAgIC8qRm91bmQgdGhlIHNlc3Npb24qLworICAgICAgICpwcFNlc3Npb24gPSAmcFdESUN0eC0+YUJTU1Nlc3Npb25zW2ldOyAKKyAgICAgICByZXR1cm4gaTsKKyAgICAgfQorICB9CisKKyAgcmV0dXJuIGk7IAorfS8qV0RJX0ZpbmRBc3NvY1Nlc3Npb25CeUJTU0lkeCovCisKKy8qKgorIEBicmllZiBIZWxwZXIgcm91dGluZSB1c2VkIHRvIGZpbmQgYSBzZXNzaW9uIGJhc2VkIG9uIHRoZSBCU1NJRCAKKyAgCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICB1Y0JTU0lkeDogIEJTUyBJbmRleCBvZiB0aGUgc2Vzc2lvbgorICAgICAgICAgcHBTZXNzaW9uOiBvdXQgcG9pbnRlciB0byB0aGUgc2Vzc2lvbiAoaWYgZm91bmQpCisgIAorIEBzZWUKKyBAcmV0dXJuIEluZGV4IG9mIHRoZSBzZXNzaW9uIGluIHRoZSBhcnJheSAKKyovCit3cHRfdWludDgKK1dESV9GaW5kQXNzb2NTZXNzaW9uQnlJZHgKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgIHBXRElDdHgsCisgIHdwdF91aW50MTYgICAgICAgICAgICAgIHVzSWR4LAorICBXRElfQlNTU2Vzc2lvblR5cGUqKiAgICBwcFNlc3Npb24KKykKK3sKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBOVUxMID09IHBwU2Vzc2lvbiB8fCB1c0lkeCA+PSBXRElfTUFYX0JTU19TRVNTSU9OUyApCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuIFdESV9NQVhfQlNTX1NFU1NJT05TOyAKKyAgfQorCisgIC8qRm91bmQgdGhlIHNlc3Npb24qLworICAqcHBTZXNzaW9uID0gJnBXRElDdHgtPmFCU1NTZXNzaW9uc1t1c0lkeF07IAorCisgIHJldHVybiB1c0lkeDsKKyAgCit9LypXRElfRmluZEFzc29jU2Vzc2lvbkJ5QlNTSWR4Ki8KKworLyoqCisgQGJyaWVmIEhlbHBlciByb3V0aW5lIHVzZWQgdG8gZmluZCBhbiBlbXB0eSBzZXNzaW9uIGluIHRoZSBXREkgCisgICAgICAgIENCCisgIAorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBTZXNzaW9uOiAgICAgIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gKGlmIGZvdW5kKSAKKyAgCisgQHNlZQorIEByZXR1cm4gSW5kZXggb2YgdGhlIHNlc3Npb24gaW4gdGhlIGFycmF5IAorKi8KK3dwdF91aW50OAorV0RJX0ZpbmRFbXB0eVNlc3Npb24KKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgIHBXRElDdHgsCisgIFdESV9CU1NTZXNzaW9uVHlwZSoqICAgIHBwU2Vzc2lvbgorKQoreworICB3cHRfdWludDggaTsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBOVUxMID09IHBwU2Vzc2lvbiApCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuIFdESV9NQVhfQlNTX1NFU1NJT05TOyAKKyAgfQorCisgICpwcFNlc3Npb24gPSBOVUxMOyAKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICAgIFNlYXJjaCBmb3IgYSBzZXNzaW9uIHRoYXQgaXQgaXMgbm90IGluIHVzZSAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBmb3IgKCBpID0gMDsgaSA8IFdESV9NQVhfQlNTX1NFU1NJT05TOyBpKysgKQorICB7CisgICAgIGlmICggISBwV0RJQ3R4LT5hQlNTU2Vzc2lvbnNbaV0uYkluVXNlICkKKyAgICAgeworICAgICAgIC8qRm91bmQgYSBzZXNzaW9uKi8KKyAgICAgICAqcHBTZXNzaW9uID0gJnBXRElDdHgtPmFCU1NTZXNzaW9uc1tpXTsgCisgICAgICAgcmV0dXJuIGk7CisgICAgIH0KKyAgfQorCisgIHJldHVybiBpOyAKK30vKldESV9GaW5kRW1wdHlTZXNzaW9uKi8KKworCisvKioKKyBAYnJpZWYgSGVscGVyIHJvdXRpbmUgdXNlZCB0byBnZXQgdGhlIHRvdGFsIGNvdW50IG9mIGFjdGl2ZSAKKyAgICAgICAgc2Vzc2lvbnMKKyAgCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAKKyBAc2VlCisgQHJldHVybiBOdW1iZXIgb2Ygc2Vzc2lvbnMgaW4gdXNlCisqLword3B0X3VpbnQ4CitXRElfR2V0QWN0aXZlU2Vzc2lvbnNDb3VudAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICAgcFdESUN0eAorKQoreworICB3cHRfdWludDggaSwgdWNDb3VudCA9IDA7IAorICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKyAgCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgICAgQ291bnQgYWxsIHNlc3Npb25zIGluIHVzZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGZvciAoIGkgPSAwOyBpIDwgV0RJX01BWF9CU1NfU0VTU0lPTlM7IGkrKyApCisgIHsKKyAgICAgaWYgKCBwV0RJQ3R4LT5hQlNTU2Vzc2lvbnNbaV0uYkluVXNlICkKKyAgICAgeworICAgICAgIHVjQ291bnQrKzsKKyAgICAgfQorICB9CisKKyAgcmV0dXJuIHVjQ291bnQ7IAorfS8qV0RJX0dldEFjdGl2ZVNlc3Npb25zQ291bnQqLworCisvKioKKyBAYnJpZWYgSGVscGVyIHJvdXRpbmUgdXNlZCB0byBkZWxldGUgc2Vzc2lvbiBpbiB0aGUgV0RJIAorICAgICAgICBDQgorICAKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwU2Vzc2lvbjogICAgICBwb2ludGVyIHRvIHRoZSBzZXNzaW9uIChpZiBmb3VuZCkgCisgIAorIEBzZWUKKyBAcmV0dXJuIEluZGV4IG9mIHRoZSBzZXNzaW9uIGluIHRoZSBhcnJheSAKKyovCit2b2lkIAorV0RJX0RlbGV0ZVNlc3Npb24KKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgIHBXRElDdHgsCisgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgIHBwU2Vzc2lvbgorKQoreworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IGNoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCBOVUxMID09IHBwU2Vzc2lvbiApCisgIHsKKyAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuIDsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICAgIFJlc2V0IHRoZSBlbnRyaWVzIGludCBzZXNzaW9uIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxfbGlzdF9kZXN0cm95KCZwcFNlc3Npb24tPndwdFBlbmRpbmdRdWV1ZSk7CisgIHdwYWxNZW1vcnlaZXJvKHBwU2Vzc2lvbiwgIHNpemVvZigqcHBTZXNzaW9uKSk7CisgIHBwU2Vzc2lvbi0+d2RpQXNzb2NTdGF0ZSA9IFdESV9BU1NPQ19JTklUX1NUOyAKKyAgcHBTZXNzaW9uLT5iSW5Vc2UgICAgICAgID0gZVdMQU5fUEFMX0ZBTFNFOyAKKyAgcHBTZXNzaW9uLT53ZGlCc3NUeXBlICAgID0gV0RJX0lORlJBU1RSVUNUVVJFX01PREU7CisgIHdwYWxfbGlzdF9pbml0KCZwcFNlc3Npb24tPndwdFBlbmRpbmdRdWV1ZSk7CisKK30vKldESV9EZWxldGVTZXNzaW9uKi8KKworLyoqCisgQGJyaWVmICAgIFV0aWxpdHkgZnVuY3Rpb24gdG8gYWRkIHRoZSBicm9hZGNhc3QgU1RBIHRvIHRoZSB0aGUgU1RBIHRhYmxlLiAKKyBUaGUgYmNhc3QgU1RBIElEIGlzIGFzc2lnbmVkIGJ5IEhBTCBhbmQgbXVzdCBiZSB2YWxpZC4KKyBAcGFyYW0gCisgICAgCisgICAgV0RJX0FkZFN0YVBhcmFtczogLSBwb2ludGVyIHRvIHRoZSBXREkgQWRkIFNUQSBwYXJhbXMKKyAgICB1c0JjYXN0U3RhSWR4OiAtIEJyb2FkY2FzdCBTVEEgaW5kZXggcGFzc2VkIGJ5IEhBTAorICAgIAorIEBzZWUgCisgQHJldHVybiB2b2lkIAorKi8KK3ZvaWQKK1dESV9BZGRCY2FzdFNUQXRvU1RBVGFibGUKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfQWRkU3RhUGFyYW1zICogICAgIHN0YVBhcmFtcywKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICB1c0JjYXN0U3RhSWR4CispCit7CisgIFdESV9BZGRTdGFQYXJhbXMgICAgICAgICAgICAgIHdkaUFkZFNUQVBhcmFtID0gezB9OworICB3cHRfbWFjQWRkciAgYmNhc3RNYWNBZGRyID0gezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9OworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNhbml0eSBjaGVjaworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIE5VTEwgPT0gc3RhUGFyYW1zICkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuOyAKKyAgfQorCisgIHdkaUFkZFNUQVBhcmFtLmJjYXN0RHB1SW5kZXggPSBzdGFQYXJhbXMtPmJjYXN0RHB1SW5kZXg7CisgIHdkaUFkZFNUQVBhcmFtLmJjYXN0RHB1U2lnbmF0dXJlID0gc3RhUGFyYW1zLT5iY2FzdERwdVNpZ25hdHVyZTsKKyAgd2RpQWRkU1RBUGFyYW0uYmNhc3RNZ210RHB1SW5kZXggPSBzdGFQYXJhbXMtPmJjYXN0TWdtdERwdUluZGV4OworICB3ZGlBZGRTVEFQYXJhbS5iY2FzdE1nbXREcHVTaWduYXR1cmUgPSBzdGFQYXJhbXMtPmJjYXN0TWdtdERwdVNpZ25hdHVyZTsKKyAgd2RpQWRkU1RBUGFyYW0uZHB1SW5kZXggPSBzdGFQYXJhbXMtPmRwdUluZGV4OworICB3ZGlBZGRTVEFQYXJhbS5kcHVTaWcgPSBzdGFQYXJhbXMtPmRwdVNpZzsKKyAgd3BhbE1lbW9yeUNvcHkoIHdkaUFkZFNUQVBhcmFtLm1hY0JTU0lELCBzdGFQYXJhbXMtPm1hY0JTU0lELAorICAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTiApOworICB3cGFsTWVtb3J5Q29weSggd2RpQWRkU1RBUGFyYW0uc3RhTWFjQWRkciwgYmNhc3RNYWNBZGRyLCBXRElfTUFDX0FERFJfTEVOICk7CisgIHdkaUFkZFNUQVBhcmFtLnVjQlNTSWR4ID0gc3RhUGFyYW1zLT51Y0JTU0lkeDsKKyAgd2RpQWRkU1RBUGFyYW0udWNIVENhcGFibGUgPSBzdGFQYXJhbXMtPnVjSFRDYXBhYmxlOworICB3ZGlBZGRTVEFQYXJhbS51Y1JtZkVuYWJsZWQgPSBzdGFQYXJhbXMtPnVjUm1mRW5hYmxlZDsKKyAgd2RpQWRkU1RBUGFyYW0udWNTdGFUeXBlID0gV0RJX1NUQV9FTlRSWV9CQ0FTVDsKKyAgd2RpQWRkU1RBUGFyYW0udWNXbW1FbmFibGVkID0gc3RhUGFyYW1zLT51Y1dtbUVuYWJsZWQ7CisgIHdkaUFkZFNUQVBhcmFtLnVjU1RBSWR4ID0gdXNCY2FzdFN0YUlkeDsKKyAgICAKKyAgKHZvaWQpV0RJX1NUQVRhYmxlQWRkU3RhKHBXRElDdHgsJndkaUFkZFNUQVBhcmFtKTsKK30KKworLyoqCisgQGJyaWVmIE5WIGJsb2Igd2lsbCBiZSBkaXZpZGVkIGludG8gZnJhZ21lbnRzIG9mIHNpemUgNGtiIGFuZCAKKyBTZW50IHRvIEhBTCAKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyAqLworCitXRElfU3RhdHVzIFdESV9TZW5kTnZCbG9iUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworCisgIHRIYWxOdkltZ0Rvd25sb2FkUmVxTXNnICAgIGhhbE52SW1nRG93bmxvYWRQYXJhbTsKKyAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICA9IE5VTEw7CisgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgID0gMDsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgdXNDdXJyZW50RnJhZ21lbnRTaXplID0wOworICB3cHRfdWludDgqICAgICAgICAgICAgICAgICBwU3JjQnVmZmVyID0gTlVMTDsKKyAgV0RJX052RG93bmxvYWRSZXFQYXJhbXNUeXBlKiAgcHdkaU52RG93bmxvYWRSZXFQYXJhbXMgPU5VTEwgOworICBXRElfTnZEb3dubG9hZFJzcENiICAgICAgd2RpTnZEb3dubG9hZFJzcENiOworCisgIHdkaU52RG93bmxvYWRSc3BDYiA9IChXRElfTnZEb3dubG9hZFJzcENiKXBFdmVudERhdGEtPnBDQmZuYzsKKyAgV0RJX0FTU0VSVChOVUxMICE9IHdkaU52RG93bmxvYWRSc3BDYik7CisgIHB3ZGlOdkRvd25sb2FkUmVxUGFyYW1zID0gKFdESV9OdkRvd25sb2FkUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YTsKKworICAvKiBTYW5pdHkgQ2hlY2sgaXMgZG9uZSBieSB0aGUgY2FsbGVyICovIAorICBwU3JjQnVmZmVyID0od3B0X3VpbnQ4ICopIHB3ZGlOdkRvd25sb2FkUmVxUGFyYW1zLT53ZGlCbG9iSW5mby5wQmxvYkFkZHJlc3M7CisKKyAgLyogVXBkYXRlIHRoZSBjdXJyZW50ICBGcmFnbWVudCBOdW1iZXIgKi8KKyAgcFdESUN0eC0+d2RpTnZCbG9iSW5mby51c0N1cnJlbnRGcmFnbWVudCArPSAxOworCisgIC8qVXBkYXRlIHRoZSBIQUwgUkVRIHN0cnVjdHVyZSAqLworICAvKkhBTCBtYWludGFpbmluZyB0aGUgZnJhZ21lbnQgY291bnQgYXMgMCwxLDIuLi5uIHdoZXJlIGF0IFdESSBpdCBpcyByZXByZXNlbnRlZCBhcyAxLDIsMy4uIG4qLworICBoYWxOdkltZ0Rvd25sb2FkUGFyYW0ubnZJbWFnZVJlcVBhcmFtcy5mcmFnTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV0RJQ3R4LT53ZGlOdkJsb2JJbmZvLnVzQ3VycmVudEZyYWdtZW50LTE7CisKKyAgLyogICAgRGl2aWRlIHRoZSBOViBJbWFnZSB0byBzaXplIG9mICdGUkFHTUVOVF9TSVpFJyBmcmFnbWVudHMgYW5kIHNlbmQgaXQgdG8gSEFMLgorICAgICAgIElmIHRoZSBzaXplIG9mIHRoZSBJbWFnZSBpcyBsZXNzIHRoYW4gJ0ZSQUdNRU5UX1NJWkUnIHRoZW4gaW4gb25lIGl0ZXJhdGlvbiB0b3RhbCAKKyAgICAgICBpbWFnZSB3aWxsIGJlIHNlbnQgdG8gSEFMKi8KKworICBpZihwV0RJQ3R4LT53ZGlOdkJsb2JJbmZvLnVzVG90YWxGcmFnbWVudCAKKyAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwV0RJQ3R4LT53ZGlOdkJsb2JJbmZvLnVzQ3VycmVudEZyYWdtZW50KQorICB7IAorICAgIC8qICAgICBUYWtpbmcgY2FyZSBvZiBib3VuZHJ5IGNvbmRpdGlvbiAqLworICAgIGlmKCAhKHVzQ3VycmVudEZyYWdtZW50U2l6ZSA9IAorICAgICAgICAgICAgICAgICBwd2RpTnZEb3dubG9hZFJlcVBhcmFtcy0+d2RpQmxvYkluZm8udUJsb2JTaXplJUZSQUdNRU5UX1NJWkUgKSkKKyAgICAgIHVzQ3VycmVudEZyYWdtZW50U2l6ZSA9IEZSQUdNRU5UX1NJWkU7CisKKyAgICAvKlVwZGF0ZSB0aGUgSEFMIFJFUSBzdHJ1Y3R1cmUgKi8KKyAgICBoYWxOdkltZ0Rvd25sb2FkUGFyYW0ubnZJbWFnZVJlcVBhcmFtcy5pc0xhc3RGcmFnbWVudCA9IDE7CisgICAgaGFsTnZJbWdEb3dubG9hZFBhcmFtLm52SW1hZ2VSZXFQYXJhbXMubnZJbWdCdWZmZXJTaXplPSB1c0N1cnJlbnRGcmFnbWVudFNpemU7CisKKyAgfQorICBlbHNlCisgIHsgCisgICAgdXNDdXJyZW50RnJhZ21lbnRTaXplID0gRlJBR01FTlRfU0laRTsKKworICAgIC8qVXBkYXRlIHRoZSBIQUwgUkVRIHN0cnVjdHVyZSAqLworICAgIGhhbE52SW1nRG93bmxvYWRQYXJhbS5udkltYWdlUmVxUGFyYW1zLmlzTGFzdEZyYWdtZW50ID0wOworICAgIGhhbE52SW1nRG93bmxvYWRQYXJhbS5udkltYWdlUmVxUGFyYW1zLm52SW1nQnVmZmVyU2l6ZSA9IHVzQ3VycmVudEZyYWdtZW50U2l6ZTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsV0RJX05WX0RPV05MT0FEX1JFUSwKKyAgICAgICAgIHNpemVvZihoYWxOdkltZ0Rvd25sb2FkUGFyYW0ubnZJbWFnZVJlcVBhcmFtcykrIHVzQ3VycmVudEZyYWdtZW50U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICggdXNTZW5kU2l6ZSA8IAorICAgICAgICAgICAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKGhhbE52SW1nRG93bmxvYWRQYXJhbS5udkltYWdlUmVxUGFyYW1zKSArIHVzQ3VycmVudEZyYWdtZW50U2l6ZSApKSkKKyAgeworICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gTlYgRG93bmxvYWQgcmVxICV4ICV4ICIsCisgICAgICAgICBwRXZlbnREYXRhLCBwd2RpTnZEb3dubG9hZFJlcVBhcmFtcyk7CisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyogQ29weWluZyB0aGUgSGFsIE5WIGRvd25sb2FkIFJFUSBzdHJ1Y3R1cmUgKi8KKyAgd3BhbE1lbW9yeUNvcHkocFNlbmRCdWZmZXIgKyB1c0RhdGFPZmZzZXQgLCAKKyAgICAmaGFsTnZJbWdEb3dubG9hZFBhcmFtLm52SW1hZ2VSZXFQYXJhbXMgLHNpemVvZih0SGFsTnZJbWdEb3dubG9hZFJlcVBhcmFtcykpOworCisgIC8qIEFwcGVuZGluZyB0aGUgTlYgaW1hZ2UgZnJhZ21lbnQgKi8KKyAgd3BhbE1lbW9yeUNvcHkocFNlbmRCdWZmZXIgKyB1c0RhdGFPZmZzZXQgKyBzaXplb2YodEhhbE52SW1nRG93bmxvYWRSZXFQYXJhbXMpLAorICAgICAgICAodm9pZCAqKShwU3JjQnVmZmVyICsgaGFsTnZJbWdEb3dubG9hZFBhcmFtLm52SW1hZ2VSZXFQYXJhbXMuZnJhZ051bWJlciAqIEZSQUdNRU5UX1NJWkUpLAorICAgICAgICAgICAgICAgICAgdXNDdXJyZW50RnJhZ21lbnRTaXplKTsKKworICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpTnZEb3dubG9hZFJlcVBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlOdkRvd25sb2FkUmVxUGFyYW1zLT5wVXNlckRhdGE7IAorCisgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkaU52RG93bmxvYWRSc3BDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9OVl9ET1dOTE9BRF9SRVNQKTsKKworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICBIZWxwZXIgaW5saW5lIGZ1bmN0aW9ucyBmb3IgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioKKyBAYnJpZWYgSGVscGVyIHJvdXRpbmUgdXNlZCB0byBmaW5kIGEgc2Vzc2lvbiBiYXNlZCBvbiB0aGUgQlNTSUQgCisgQHBhcmFtICBwQ29udGV4dDogICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorIEBwYXJhbSAgcERQQ29udGV4dDogICBwb2ludGVyIHRvIHRoZSBEYXRhcGF0aCBjb250ZXh0IAorICAKKyBAc2VlCisgQHJldHVybiAKKyovCitXUFRfSU5MSU5FIHZvaWQgCitXRElfRFNfQXNzaWduRGF0YXBhdGhDb250ZXh0ICh2b2lkICpwQ29udGV4dCwgdm9pZCAqcERQQ29udGV4dCkKK3sKKyAgIFdESV9Db250cm9sQmxvY2tUeXBlICpwQ0IgPSAoV0RJX0NvbnRyb2xCbG9ja1R5cGUgKilwQ29udGV4dDsKKworICAgcENCLT5wRFBDb250ZXh0ID0gcERQQ29udGV4dDsKKyAgIHJldHVybjsKK30KKworLyoqCisgQGJyaWVmIEhlbHBlciByb3V0aW5lIHVzZWQgdG8gZmluZCBhIHNlc3Npb24gYmFzZWQgb24gdGhlIEJTU0lEIAorICAKKyAKKyBAcGFyYW0gIHBDb250ZXh0OiAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgIAorIEBzZWUKKyBAcmV0dXJuIHBvaW50ZXIgdG8gRGF0YXBhdGggY29udGV4dAorKi8KK1dQVF9JTkxJTkUgdm9pZCAqIAorV0RJX0RTX0dldERhdGFwYXRoQ29udGV4dCAodm9pZCAqcENvbnRleHQpCit7CisgICBXRElfQ29udHJvbEJsb2NrVHlwZSAqcENCID0gKFdESV9Db250cm9sQmxvY2tUeXBlICopcENvbnRleHQ7CisgICByZXR1cm4gcENCLT5wRFBDb250ZXh0OworfQorLyoqCisgQGJyaWVmIEhlbHBlciByb3V0aW5lIHVzZWQgdG8gZmluZCBhIHNlc3Npb24gYmFzZWQgb24gdGhlIEJTU0lEIAorICAKKyAKKyBAcGFyYW0gIHBDb250ZXh0OiAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgQHBhcmFtICBwRFREcml2ZXJDb250ZXh0OiAgIHBvaW50ZXIgdG8gdGhlIFRyYW5zcG9ydCBEcml2ZXIgY29udGV4dCAKKyAgCisgQHNlZQorIEByZXR1cm4gdm9pZAorKi8KK1dQVF9JTkxJTkUgdm9pZCAgCitXRFRfQXNzaWduVHJhbnNwb3J0RHJpdmVyQ29udGV4dCAodm9pZCAqcENvbnRleHQsIHZvaWQgKnBEVERyaXZlckNvbnRleHQpCit7CisgICBXRElfQ29udHJvbEJsb2NrVHlwZSAqcENCID0gKFdESV9Db250cm9sQmxvY2tUeXBlICopcENvbnRleHQ7CisKKyAgIHBDQi0+cERURHJpdmVyQ29udGV4dCA9IHBEVERyaXZlckNvbnRleHQ7CisgICByZXR1cm47IAorfQorCisvKioKKyBAYnJpZWYgSGVscGVyIHJvdXRpbmUgdXNlZCB0byBmaW5kIGEgc2Vzc2lvbiBiYXNlZCBvbiB0aGUgQlNTSUQgCisgIAorIAorIEBwYXJhbSAgcFdESUN0eDogICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAKKyBAc2VlCisgQHJldHVybiBwb2ludGVyIHRvIGRhdGFwYXRoIGNvbnRleHQgCisqLworV1BUX0lOTElORSB2b2lkICogCitXRFRfR2V0VHJhbnNwb3J0RHJpdmVyQ29udGV4dCAodm9pZCAqcENvbnRleHQpCit7CisgICBXRElfQ29udHJvbEJsb2NrVHlwZSAqcENCID0gKFdESV9Db250cm9sQmxvY2tUeXBlICopcENvbnRleHQ7CisgICByZXR1cm4ocENCLT5wRFREcml2ZXJDb250ZXh0KTsgCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgSGVscGVyIGlubGluZSBjb252ZXJ0ZXJzCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKkNvbnZlcnQgV0RJIGRyaXZlciB0eXBlIGludG8gSEFMIGRyaXZlciB0eXBlKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSBXRElfU3RhdHVzCitXRElfSEFMXzJfV0RJX1NUQVRVUworKAorICBlSGFsU3RhdHVzIGhhbFN0YXR1cworKQoreworICAvKkxpZ2h0d2VpZ2h0IGZ1bmN0aW9uIC0gbm8gc2FuaXR5IGNoZWNrcyBhbmQgbm8gdW5lY2Vzc2FyeSBjb2RlIHRvIGluY3JlYXNlIAorICAgIHRoZSBjaGFuY2VzIG9mIGdldHRpbmcgaW5saW5lZCovCisgIHN3aXRjaCggIGhhbFN0YXR1cyApCisgIHsKKyAgY2FzZSBlSEFMX1NUQVRVU19TVUNDRVNTOgorICBjYXNlIGVIQUxfU1RBVFVTX0FERF9TVEFfU0VMRl9JR05PUkVEX1JFRl9DT1VOVF9OT1RfWkVSTzoKKyAgY2FzZSBlSEFMX1NUQVRVU19ERUxfU1RBX1NFTEZfSUdOT1JFRF9SRUZfQ09VTlRfTk9UX1pFUk86CisgICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgY2FzZSBlSEFMX1NUQVRVU19GQUlMVVJFOgorICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgY2FzZSBlSEFMX1NUQVRVU19GQUlMRURfQUxMT0M6CisgICAgcmV0dXJuIFdESV9TVEFUVVNfTUVNX0ZBSUxVUkU7ICAgIAorICAgLypUaGUgcmVzdCBvZiB0aGUgSEFMIGVycm9yIGNvZGVzIG11c3QgYmUga2VwdCBoaWRkZW4gZnJvbSB0aGUgVU1BQyBhcyAKKyAgICAgdGhleSByZWZlciB0byBzcGVjaWZpYyBpbnRlcm5hbCBtb2R1bGVzIG9mIG91ciBkZXZpY2UqLworICBkZWZhdWx0OiAKKyAgICByZXR1cm4gV0RJX1NUQVRVU19ERVZfSU5URVJOQUxfRkFJTFVSRTsgCisgIH0gCisKKyAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKK30vKldESV9IQUxfMl9XRElfU1RBVFVTKi8KKworLypDb252ZXJ0IFdESSByZXF1ZXN0IHR5cGUgaW50byBIQUwgcmVxdWVzdCB0eXBlKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSB0SGFsSG9zdE1zZ1R5cGUKK1dESV8yX0hBTF9SRVFfVFlQRQorKAorICBXRElfUmVxdWVzdEVudW1UeXBlICAgIHdkaVJlcVR5cGUKKykKK3sKKyAgIC8qTGlnaHR3ZWlnaHQgZnVuY3Rpb24gLSBubyBzYW5pdHkgY2hlY2tzIGFuZCBubyB1bmVjZXNzYXJ5IGNvZGUgdG8gaW5jcmVhc2UgCisgICAgdGhlIGNoYW5jZXMgb2YgZ2V0dGluZyBpbmxpbmVkKi8KKyAgc3dpdGNoKCAgd2RpUmVxVHlwZSApCisgIHsgICAgCisgIGNhc2UgV0RJX1NUQVJUX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfU1RBUlRfUkVROyAKKyAgY2FzZSBXRElfU1RPUF9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1NUT1BfUkVROyAKKyAgY2FzZSBXRElfSU5JVF9TQ0FOX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfSU5JVF9TQ0FOX1JFUTsgCisgIGNhc2UgV0RJX1NUQVJUX1NDQU5fUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9TVEFSVF9TQ0FOX1JFUTsgCisgIGNhc2UgV0RJX0VORF9TQ0FOX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfRU5EX1NDQU5fUkVROyAKKyAgY2FzZSBXRElfRklOSVNIX1NDQU5fUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9GSU5JU0hfU0NBTl9SRVE7IAorICBjYXNlIFdESV9KT0lOX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfSk9JTl9SRVE7IAorICBjYXNlIFdESV9DT05GSUdfQlNTX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfQ09ORklHX0JTU19SRVE7IAorICBjYXNlIFdESV9ERUxfQlNTX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfREVMRVRFX0JTU19SRVE7IAorICBjYXNlIFdESV9QT1NUX0FTU09DX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfUE9TVF9BU1NPQ19SRVE7IAorICBjYXNlIFdESV9ERUxfU1RBX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfREVMRVRFX1NUQV9SRVE7IAorICBjYXNlIFdESV9TRVRfQlNTX0tFWV9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1NFVF9CU1NLRVlfUkVROyAKKyAgY2FzZSBXRElfUk1WX0JTU19LRVlfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9STVZfQlNTS0VZX1JFUTsgCisgIGNhc2UgV0RJX1NFVF9TVEFfS0VZX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfU0VUX1NUQUtFWV9SRVE7IAorICBjYXNlIFdESV9STVZfU1RBX0tFWV9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1JNVl9TVEFLRVlfUkVROyAKKyAgY2FzZSBXRElfU0VUX1NUQV9CQ0FTVF9LRVlfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9TRVRfQkNBU1RLRVlfUkVROyAKKyAgY2FzZSBXRElfUk1WX1NUQV9CQ0FTVF9LRVlfUkVROgorICAgIC8vU29tZSBjb25mbGljdCBpbiB0aGUgb2xkIGNvZGUgLSBjaGVjayB0aGlzOiByZXR1cm4gV0xBTl9IQUxfUk1WX0JDQVNUS0VZX1JFUTsgCisgICAgcmV0dXJuIFdMQU5fSEFMX1JNVl9TVEFLRVlfUkVROworICBjYXNlIFdESV9BRERfVFNfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9BRERfVFNfUkVROyAKKyAgY2FzZSBXRElfREVMX1RTX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfREVMX1RTX1JFUTsgCisgIGNhc2UgV0RJX1VQRF9FRENBX1BSTVNfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9VUERfRURDQV9QQVJBTVNfUkVROyAKKyAgY2FzZSBXRElfQUREX0JBX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfQUREX0JBX1JFUTsgCisgIGNhc2UgV0RJX0RFTF9CQV9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX0RFTF9CQV9SRVE7IAorI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKKyAgY2FzZSBXRElfVFNNX1NUQVRTX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfVFNNX1NUQVRTX1JFUTsgCisjZW5kaWYKKyAgY2FzZSBXRElfQ0hfU1dJVENIX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfQ0hfU1dJVENIX1JFUTsgCisgIGNhc2UgV0RJX0NPTkZJR19TVEFfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9DT05GSUdfU1RBX1JFUTsgCisgIGNhc2UgV0RJX1NFVF9MSU5LX1NUX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfU0VUX0xJTktfU1RfUkVROyAKKyAgY2FzZSBXRElfR0VUX1NUQVRTX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfR0VUX1NUQVRTX1JFUTsgCisgIGNhc2UgV0RJX1VQREFURV9DRkdfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9VUERBVEVfQ0ZHX1JFUTsgCisgIGNhc2UgV0RJX0FERF9CQV9TRVNTSU9OX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfQUREX0JBX1NFU1NJT05fUkVROworICBjYXNlIFdESV9UUklHR0VSX0JBX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfVFJJR0dFUl9CQV9SRVE7CisgIGNhc2UgV0RJX1VQRF9CQ09OX1BSTVNfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9VUERBVEVfQkVBQ09OX1JFUTsgCisgIGNhc2UgV0RJX1NORF9CQ09OX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfU0VORF9CRUFDT05fUkVROyAKKyAgY2FzZSBXRElfVVBEX1BST0JFX1JTUF9URU1QTEFURV9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1VQREFURV9QUk9CRV9SU1BfVEVNUExBVEVfUkVROworICAgY2FzZSBXRElfU0VUX01BWF9UWF9QT1dFUl9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1NFVF9NQVhfVFhfUE9XRVJfUkVROworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgY2FzZSBXRElfUDJQX0dPX05PVElDRV9PRl9BQlNFTkNFX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfU0VUX1AyUF9HT05PQV9SRVE7CisjZW5kaWYKKyAgY2FzZSBXRElfRU5URVJfSU1QU19SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX0VOVEVSX0lNUFNfUkVROyAKKyAgY2FzZSBXRElfRVhJVF9JTVBTX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfRVhJVF9JTVBTX1JFUTsgCisgIGNhc2UgV0RJX0VOVEVSX0JNUFNfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9FTlRFUl9CTVBTX1JFUTsgCisgIGNhc2UgV0RJX0VYSVRfQk1QU19SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX0VYSVRfQk1QU19SRVE7IAorICBjYXNlIFdESV9FTlRFUl9VQVBTRF9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX0VOVEVSX1VBUFNEX1JFUTsgCisgIGNhc2UgV0RJX0VYSVRfVUFQU0RfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9FWElUX1VBUFNEX1JFUTsgCisgIGNhc2UgV0RJX1NFVF9VQVBTRF9QQVJBTV9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1NFVF9VQVBTRF9BQ19QQVJBTVNfUkVROyAKKyAgY2FzZSBXRElfVVBEQVRFX1VBUFNEX1BBUkFNX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfVVBEQVRFX1VBUFNEX1BBUkFNX1JFUTsgCisgIGNhc2UgV0RJX0NPTkZJR1VSRV9SWFBfRklMVEVSX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfQ09ORklHVVJFX1JYUF9GSUxURVJfUkVROyAKKyAgY2FzZSBXRElfU0VUX0JFQUNPTl9GSUxURVJfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9BRERfQkNOX0ZJTFRFUl9SRVE7IAorICBjYXNlIFdESV9SRU1fQkVBQ09OX0ZJTFRFUl9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1JFTV9CQ05fRklMVEVSX1JFUTsKKyAgY2FzZSBXRElfU0VUX1JTU0lfVEhSRVNIT0xEU19SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1NFVF9SU1NJX1RIUkVTSF9SRVE7CisgIGNhc2UgV0RJX0hPU1RfT0ZGTE9BRF9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX0hPU1RfT0ZGTE9BRF9SRVE7CisgIGNhc2UgV0RJX1dPV0xfQUREX0JDX1BUUk5fUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9BRERfV09XTF9CQ0FTVF9QVFJOOworICBjYXNlIFdESV9XT1dMX0RFTF9CQ19QVFJOX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfREVMX1dPV0xfQkNBU1RfUFRSTjsKKyAgY2FzZSBXRElfV09XTF9FTlRFUl9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX0VOVEVSX1dPV0xfUkVROworICBjYXNlIFdESV9XT1dMX0VYSVRfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9FWElUX1dPV0xfUkVROworICBjYXNlIFdESV9DT05GSUdVUkVfQVBQU19DUFVfV0FLRVVQX1NUQVRFX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfQ09ORklHVVJFX0FQUFNfQ1BVX1dBS0VVUF9TVEFURV9SRVE7CisgICBjYXNlIFdESV9OVl9ET1dOTE9BRF9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX0RPV05MT0FEX05WX1JFUTsKKyAgY2FzZSBXRElfRkxVU0hfQUNfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9UTF9IQUxfRkxVU0hfQUNfUkVROworICBjYXNlIFdESV9CVEFNUF9FVkVOVF9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1NJR05BTF9CVEFNUF9FVkVOVF9SRVE7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKyAgY2FzZSBXRElfQUdHUl9BRERfVFNfUkVROgorICAgICByZXR1cm4gV0xBTl9IQUxfQUdHUl9BRERfVFNfUkVROworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSICovCisjaWZkZWYgQU5JX01BTkZfRElBRworICBjYXNlIFdESV9GVE1fQ01EX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfUFJPQ0VTU19QVFRfUkVROworI2VuZGlmIC8qIEFOSV9NQU5GX0RJQUcgKi8KKyAgY2FzZSBXRElfQUREX1NUQV9TRUxGX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfQUREX1NUQV9TRUxGX1JFUTsKKyAgY2FzZSBXRElfREVMX1NUQV9TRUxGX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfREVMX1NUQV9TRUxGX1JFUTsKKyAgY2FzZSBXRElfSE9TVF9SRVNVTUVfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9IT1NUX1JFU1VNRV9SRVE7CisgIGNhc2UgV0RJX0hPU1RfU1VTUEVORF9JTkQ6CisgICAgcmV0dXJuIFdMQU5fSEFMX0hPU1RfU1VTUEVORF9JTkQ7CisgIGNhc2UgV0RJX0tFRVBfQUxJVkVfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9LRUVQX0FMSVZFX1JFUTsKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworICBjYXNlIFdESV9TRVRfUFJFRl9ORVRXT1JLX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfU0VUX1BSRUZfTkVUV09SS19SRVE7CisgIGNhc2UgV0RJX1NFVF9SU1NJX0ZJTFRFUl9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1NFVF9SU1NJX0ZJTFRFUl9SRVE7CisgIGNhc2UgV0RJX1VQREFURV9TQ0FOX1BBUkFNU19SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1VQREFURV9TQ0FOX1BBUkFNX1JFUTsKKyNlbmRpZiAvLyBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKyAgY2FzZSBXRElfU0VUX1RYX1BFUl9UUkFDS0lOR19SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1NFVF9UWF9QRVJfVFJBQ0tJTkdfUkVROworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisgIGNhc2UgV0RJXzgwMjNfTVVMVElDQVNUX0xJU1RfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF84MDIzX01VTFRJQ0FTVF9MSVNUX1JFUTsKKyAgY2FzZSBXRElfUkVDRUlWRV9GSUxURVJfU0VUX0ZJTFRFUl9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1NFVF9QQUNLRVRfRklMVEVSX1JFUTsgCisgIGNhc2UgV0RJX1BBQ0tFVF9DT0FMRVNDSU5HX0ZJTFRFUl9NQVRDSF9DT1VOVF9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1BBQ0tFVF9GSUxURVJfTUFUQ0hfQ09VTlRfUkVROworICBjYXNlIFdESV9SRUNFSVZFX0ZJTFRFUl9DTEVBUl9GSUxURVJfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9DTEVBUl9QQUNLRVRfRklMVEVSX1JFUTsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworICBjYXNlIFdESV9IQUxfRFVNUF9DTURfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9EVU1QX0NPTU1BTkRfUkVROworI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorICBjYXNlIFdESV9HVEtfT0ZGTE9BRF9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX0dUS19PRkZMT0FEX1JFUTsKKyAgY2FzZSBXRElfR1RLX09GRkxPQURfR0VUSU5GT19SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX0dUS19PRkZMT0FEX0dFVElORk9fUkVROworI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRCAqLworCisgIGNhc2UgV0RJX0lOSVRfU0NBTl9DT05fUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9JTklUX1NDQU5fQ09OX1JFUTsgCisgIGNhc2UgV0RJX1NFVF9QT1dFUl9QQVJBTVNfUkVROgorICAgIHJldHVybiBXTEFOX0hBTF9TRVRfUE9XRVJfUEFSQU1TX1JFUTsgCisgIGNhc2UgV0RJX1NFVF9UTV9MRVZFTF9SRVE6CisgICAgcmV0dXJuIFdMQU5fSEFMX1NFVF9USEVSTUFMX01JVElHQVRJT05fUkVROyAKKyAgY2FzZSBXRElfRkVBVFVSRV9DQVBTX0VYQ0hBTkdFX1JFUToKKyAgICByZXR1cm4gV0xBTl9IQUxfRkVBVFVSRV9DQVBTX0VYQ0hBTkdFX1JFUTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gV0xBTl9IQUxfTVNHX01BWDsgCisgIH0KKyAgCit9LypXRElfMl9IQUxfUkVRX1RZUEUqLworCisvKkNvbnZlcnQgV0RJIHJlc3BvbnNlIHR5cGUgaW50byBIQUwgcmVzcG9uc2UgdHlwZSovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgV0RJX1Jlc3BvbnNlRW51bVR5cGUKK0hBTF8yX1dESV9SU1BfVFlQRQorKAorICB0SGFsSG9zdE1zZ1R5cGUgaGFsTXNnCispCit7CisgIC8qTGlnaHR3ZWlnaHQgZnVuY3Rpb24gLSBubyBzYW5pdHkgY2hlY2tzIGFuZCBubyB1bmVjZXNzYXJ5IGNvZGUgdG8gaW5jcmVhc2UgCisgICAgdGhlIGNoYW5jZXMgb2YgZ2V0dGluZyBpbmxpbmVkKi8KKyAgc3dpdGNoKCAgaGFsTXNnICkKKyAgeworICBjYXNlIFdMQU5fSEFMX1NUQVJUX1JTUDoKKyAgICByZXR1cm4gV0RJX1NUQVJUX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfU1RPUF9SU1A6CisgICAgcmV0dXJuIFdESV9TVE9QX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfSU5JVF9TQ0FOX1JTUDoKKyAgICByZXR1cm4gV0RJX0lOSVRfU0NBTl9SRVNQOworICBjYXNlIFdMQU5fSEFMX1NUQVJUX1NDQU5fUlNQOgorICAgIHJldHVybiBXRElfU1RBUlRfU0NBTl9SRVNQOworICBjYXNlIFdMQU5fSEFMX0VORF9TQ0FOX1JTUDoKKyAgICByZXR1cm4gV0RJX0VORF9TQ0FOX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfRklOSVNIX1NDQU5fUlNQOgorICAgIHJldHVybiBXRElfRklOSVNIX1NDQU5fUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9DT05GSUdfU1RBX1JTUDoKKyAgICByZXR1cm4gV0RJX0NPTkZJR19TVEFfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9ERUxFVEVfU1RBX1JTUDoKKyAgICByZXR1cm4gV0RJX0RFTF9TVEFfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9DT05GSUdfQlNTX1JTUDoKKyAgICByZXR1cm4gV0RJX0NPTkZJR19CU1NfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9ERUxFVEVfQlNTX1JTUDoKKyAgICByZXR1cm4gV0RJX0RFTF9CU1NfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9KT0lOX1JTUDoKKyAgICByZXR1cm4gV0RJX0pPSU5fUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9QT1NUX0FTU09DX1JTUDoKKyAgICByZXR1cm4gV0RJX1BPU1RfQVNTT0NfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9TRVRfQlNTS0VZX1JTUDoKKyAgICByZXR1cm4gV0RJX1NFVF9CU1NfS0VZX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfU0VUX1NUQUtFWV9SU1A6CisgICAgcmV0dXJuIFdESV9TRVRfU1RBX0tFWV9SRVNQOworICBjYXNlIFdMQU5fSEFMX1JNVl9CU1NLRVlfUlNQOgorICAgIHJldHVybiBXRElfUk1WX0JTU19LRVlfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9STVZfU1RBS0VZX1JTUDoKKyAgICByZXR1cm4gV0RJX1JNVl9TVEFfS0VZX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfU0VUX0JDQVNUS0VZX1JTUDoKKyAgICByZXR1cm4gV0RJX1NFVF9TVEFfQkNBU1RfS0VZX1JFU1A7CisgIC8vU29tZSBjb25mbGljdCBpbiB0aGUgb2xkIGNvZGUgLSBjaGVjayB0aGlzOiBjYXNlIFdMQU5fSEFMX1JNVl9CQ0FTVEtFWV9SU1A6CisgIC8vICByZXR1cm4gV0RJX1JNVl9TVEFfQkNBU1RfS0VZX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfQUREX1RTX1JTUDoKKyAgICByZXR1cm4gV0RJX0FERF9UU19SRVNQOworICBjYXNlIFdMQU5fSEFMX0RFTF9UU19SU1A6CisgICAgcmV0dXJuIFdESV9ERUxfVFNfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9VUERfRURDQV9QQVJBTVNfUlNQOgorICAgIHJldHVybiBXRElfVVBEX0VEQ0FfUFJNU19SRVNQOworICBjYXNlIFdMQU5fSEFMX0FERF9CQV9SU1A6CisgICAgcmV0dXJuIFdESV9BRERfQkFfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9ERUxfQkFfUlNQOgorICAgIHJldHVybiBXRElfREVMX0JBX1JFU1A7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICBjYXNlIFdMQU5fSEFMX1RTTV9TVEFUU19SU1A6CisgICAgcmV0dXJuIFdESV9UU01fU1RBVFNfUkVTUDsKKyNlbmRpZgorICBjYXNlIFdMQU5fSEFMX0NIX1NXSVRDSF9SU1A6CisgICAgcmV0dXJuIFdESV9DSF9TV0lUQ0hfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9TRVRfTElOS19TVF9SU1A6CisgICAgcmV0dXJuIFdESV9TRVRfTElOS19TVF9SRVNQOworICBjYXNlIFdMQU5fSEFMX0dFVF9TVEFUU19SU1A6CisgICAgcmV0dXJuIFdESV9HRVRfU1RBVFNfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9VUERBVEVfQ0ZHX1JTUDoKKyAgICByZXR1cm4gV0RJX1VQREFURV9DRkdfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9BRERfQkFfU0VTU0lPTl9SU1A6CisgICAgcmV0dXJuIFdESV9BRERfQkFfU0VTU0lPTl9SRVNQOworICBjYXNlIFdMQU5fSEFMX1RSSUdHRVJfQkFfUlNQOgorICAgIHJldHVybiBXRElfVFJJR0dFUl9CQV9SRVNQOworICBjYXNlIFdMQU5fSEFMX1VQREFURV9CRUFDT05fUlNQOgorICAgIHJldHVybiBXRElfVVBEX0JDT05fUFJNU19SRVNQOworICBjYXNlIFdMQU5fSEFMX1NFTkRfQkVBQ09OX1JTUDoKKyAgICByZXR1cm4gV0RJX1NORF9CQ09OX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfVVBEQVRFX1BST0JFX1JTUF9URU1QTEFURV9SU1A6CisgICAgcmV0dXJuIFdESV9VUERfUFJPQkVfUlNQX1RFTVBMQVRFX1JFU1A7CisgIC8qSW5kaWNhdGlvbnMqLworICBjYXNlIFdMQU5fSEFMX1JTU0lfTk9USUZJQ0FUSU9OX0lORDoKKyAgICByZXR1cm4gV0RJX0hBTF9SU1NJX05PVElGSUNBVElPTl9JTkQ7CisgIGNhc2UgV0xBTl9IQUxfTUlTU0VEX0JFQUNPTl9JTkQ6CisgICAgcmV0dXJuIFdESV9IQUxfTUlTU0VEX0JFQUNPTl9JTkQ7CisgIGNhc2UgV0xBTl9IQUxfVU5LTk9XTl9BRERSMl9GUkFNRV9SWF9JTkQ6CisgICAgcmV0dXJuIFdESV9IQUxfVU5LTk9XTl9BRERSMl9GUkFNRV9SWF9JTkQ7CisgIGNhc2UgV0xBTl9IQUxfTUlDX0ZBSUxVUkVfSU5EOgorICAgIHJldHVybiBXRElfSEFMX01JQ19GQUlMVVJFX0lORDsKKyAgY2FzZSBXTEFOX0hBTF9GQVRBTF9FUlJPUl9JTkQ6CisgICAgcmV0dXJuIFdESV9IQUxfRkFUQUxfRVJST1JfSU5EOworICBjYXNlIFdMQU5fSEFMX0RFTEVURV9TVEFfQ09OVEVYVF9JTkQ6CisgICAgcmV0dXJuIFdESV9IQUxfREVMX1NUQV9JTkQ7CisgIGNhc2UgV0xBTl9IQUxfQ09FWF9JTkQ6CisgICAgcmV0dXJuIFdESV9IQUxfQ09FWF9JTkQ7CisgIGNhc2UgV0xBTl9IQUxfT1RBX1RYX0NPTVBMX0lORDoKKyAgICByZXR1cm4gV0RJX0hBTF9UWF9DT01QTEVURV9JTkQ7CisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICBjYXNlIFdMQU5fSEFMX1AyUF9OT0FfQVRUUl9JTkQ6CisgICAgcmV0dXJuIFdESV9IQUxfUDJQX05PQV9BVFRSX0lORDsKKyNlbmRpZgorICBjYXNlIFdMQU5fSEFMX1RYX1BFUl9ISVRfSU5EOgorICAgIHJldHVybiBXRElfSEFMX1RYX1BFUl9ISVRfSU5EOworICBjYXNlIFdMQU5fSEFMX1NFVF9NQVhfVFhfUE9XRVJfUlNQOgorICAgIHJldHVybiBXRElfU0VUX01BWF9UWF9QT1dFUl9SRVNQOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QMlAKKyAgY2FzZSBXTEFOX0hBTF9TRVRfUDJQX0dPTk9BX1JTUDoKKyAgICByZXR1cm4gV0RJX1AyUF9HT19OT1RJQ0VfT0ZfQUJTRU5DRV9SRVNQOworI2VuZGlmCisgIGNhc2UgV0xBTl9IQUxfRU5URVJfSU1QU19SU1A6CisgICAgcmV0dXJuIFdESV9FTlRFUl9JTVBTX1JFU1A7IAorICBjYXNlIFdMQU5fSEFMX0VYSVRfSU1QU19SU1A6CisgICAgcmV0dXJuIFdESV9FWElUX0lNUFNfUkVTUDsgCisgIGNhc2UgV0xBTl9IQUxfRU5URVJfQk1QU19SU1A6CisgICAgcmV0dXJuIFdESV9FTlRFUl9CTVBTX1JFU1A7IAorICBjYXNlIFdMQU5fSEFMX0VYSVRfQk1QU19SU1A6CisgICAgcmV0dXJuIFdESV9FWElUX0JNUFNfUkVTUDsgCisgIGNhc2UgV0xBTl9IQUxfRU5URVJfVUFQU0RfUlNQOgorICAgIHJldHVybiBXRElfRU5URVJfVUFQU0RfUkVTUDsgCisgIGNhc2UgV0xBTl9IQUxfRVhJVF9VQVBTRF9SU1A6CisgICAgcmV0dXJuIFdESV9FWElUX1VBUFNEX1JFU1A7IAorICBjYXNlIFdMQU5fSEFMX1NFVF9VQVBTRF9BQ19QQVJBTVNfUlNQOgorICAgIHJldHVybiBXRElfU0VUX1VBUFNEX1BBUkFNX1JFU1A7IAorICBjYXNlIFdMQU5fSEFMX1VQREFURV9VQVBTRF9QQVJBTV9SU1A6CisgICAgcmV0dXJuIFdESV9VUERBVEVfVUFQU0RfUEFSQU1fUkVTUDsgCisgIGNhc2UgV0xBTl9IQUxfQ09ORklHVVJFX1JYUF9GSUxURVJfUlNQOgorICAgIHJldHVybiBXRElfQ09ORklHVVJFX1JYUF9GSUxURVJfUkVTUDsgCisgIGNhc2UgV0xBTl9IQUxfQUREX0JDTl9GSUxURVJfUlNQOgorICAgIHJldHVybiBXRElfU0VUX0JFQUNPTl9GSUxURVJfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9SRU1fQkNOX0ZJTFRFUl9SU1A6CisgICAgcmV0dXJuIFdESV9SRU1fQkVBQ09OX0ZJTFRFUl9SRVNQOworICBjYXNlIFdMQU5fSEFMX1NFVF9SU1NJX1RIUkVTSF9SU1A6CisgICAgcmV0dXJuIFdESV9TRVRfUlNTSV9USFJFU0hPTERTX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfSE9TVF9PRkZMT0FEX1JTUDoKKyAgICByZXR1cm4gV0RJX0hPU1RfT0ZGTE9BRF9SRVNQOworICBjYXNlIFdMQU5fSEFMX0FERF9XT1dMX0JDQVNUX1BUUk5fUlNQOgorICAgIHJldHVybiBXRElfV09XTF9BRERfQkNfUFRSTl9SRVNQOworICBjYXNlIFdMQU5fSEFMX0RFTF9XT1dMX0JDQVNUX1BUUk5fUlNQOgorICAgIHJldHVybiBXRElfV09XTF9ERUxfQkNfUFRSTl9SRVNQOworICBjYXNlIFdMQU5fSEFMX0VOVEVSX1dPV0xfUlNQOgorICAgIHJldHVybiBXRElfV09XTF9FTlRFUl9SRVNQOworICBjYXNlIFdMQU5fSEFMX0VYSVRfV09XTF9SU1A6CisgICAgcmV0dXJuIFdESV9XT1dMX0VYSVRfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9DT05GSUdVUkVfQVBQU19DUFVfV0FLRVVQX1NUQVRFX1JTUDoKKyAgICByZXR1cm4gV0RJX0NPTkZJR1VSRV9BUFBTX0NQVV9XQUtFVVBfU1RBVEVfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9ET1dOTE9BRF9OVl9SU1A6CisgICAgcmV0dXJuIFdESV9OVl9ET1dOTE9BRF9SRVNQOworICBjYXNlIFdMQU5fSEFMX1RMX0hBTF9GTFVTSF9BQ19SU1A6CisgICAgcmV0dXJuIFdESV9GTFVTSF9BQ19SRVNQOworICBjYXNlIFdMQU5fSEFMX1NJR05BTF9CVEFNUF9FVkVOVF9SU1A6CisgICAgcmV0dXJuIFdESV9CVEFNUF9FVkVOVF9SRVNQOworI2lmZGVmIEFOSV9NQU5GX0RJQUcKKyAgY2FzZSBXTEFOX0hBTF9QUk9DRVNTX1BUVF9SU1A6CisgICAgcmV0dXJuICBXRElfRlRNX0NNRF9SRVNQOworI2VuZGlmIC8qIEFOSV9NQU5GX0RJQUcgKi8KKyAgY2FzZSBXTEFOX0hBTF9BRERfU1RBX1NFTEZfUlNQOgorICAgIHJldHVybiBXRElfQUREX1NUQV9TRUxGX1JFU1A7CitjYXNlIFdMQU5fSEFMX0RFTF9TVEFfU0VMRl9SU1A6CisgICAgcmV0dXJuIFdESV9ERUxfU1RBX1NFTEZfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9IT1NUX1JFU1VNRV9SU1A6CisgICAgcmV0dXJuIFdESV9IT1NUX1JFU1VNRV9SRVNQOworICBjYXNlIFdMQU5fSEFMX0tFRVBfQUxJVkVfUlNQOgorICAgIHJldHVybiBXRElfS0VFUF9BTElWRV9SRVNQOworI2lmZGVmIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworICBjYXNlIFdMQU5fSEFMX1NFVF9QUkVGX05FVFdPUktfUlNQOgorICAgIHJldHVybiBXRElfU0VUX1BSRUZfTkVUV09SS19SRVNQOworICBjYXNlIFdMQU5fSEFMX1NFVF9SU1NJX0ZJTFRFUl9SU1A6CisgICAgcmV0dXJuIFdESV9TRVRfUlNTSV9GSUxURVJfUkVTUDsgCisgIGNhc2UgV0xBTl9IQUxfVVBEQVRFX1NDQU5fUEFSQU1fUlNQOgorICAgIHJldHVybiBXRElfVVBEQVRFX1NDQU5fUEFSQU1TX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfUFJFRl9ORVRXX0ZPVU5EX0lORDoKKyAgICByZXR1cm4gV0RJX0hBTF9QUkVGX05FVFdPUktfRk9VTkRfSU5EOworI2VuZGlmIC8vIEZFQVRVUkVfV0xBTl9TQ0FOX1BOTworICBjYXNlIFdMQU5fSEFMX1NFVF9UWF9QRVJfVFJBQ0tJTkdfUlNQOgorICAgIHJldHVybiBXRElfU0VUX1RYX1BFUl9UUkFDS0lOR19SRVNQOworI2lmZGVmIFdMQU5fRkVBVFVSRV9QQUNLRVRfRklMVEVSSU5HCisgIGNhc2UgV0xBTl9IQUxfODAyM19NVUxUSUNBU1RfTElTVF9SU1A6CisgICAgcmV0dXJuIFdESV84MDIzX01VTFRJQ0FTVF9MSVNUX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfU0VUX1BBQ0tFVF9GSUxURVJfUlNQOgorICAgIHJldHVybiBXRElfUkVDRUlWRV9GSUxURVJfU0VUX0ZJTFRFUl9SRVNQOworICBjYXNlIFdMQU5fSEFMX1BBQ0tFVF9GSUxURVJfTUFUQ0hfQ09VTlRfUlNQOgorICAgIHJldHVybiBXRElfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JFU1A7CisgIGNhc2UgV0xBTl9IQUxfQ0xFQVJfUEFDS0VUX0ZJTFRFUl9SU1A6CisgICAgcmV0dXJuIFdESV9SRUNFSVZFX0ZJTFRFUl9DTEVBUl9GSUxURVJfUkVTUDsKKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisgIGNhc2UgV0xBTl9IQUxfRFVNUF9DT01NQU5EX1JTUDoKKyAgICByZXR1cm4gV0RJX0hBTF9EVU1QX0NNRF9SRVNQOworICBjYXNlIFdMQU5fSEFMX1NFVF9QT1dFUl9QQVJBTVNfUlNQOgorICAgIHJldHVybiBXRElfU0VUX1BPV0VSX1BBUkFNU19SRVNQOworI2lmZGVmIFdMQU5fRkVBVFVSRV9WT1dJRklfMTFSCisgIGNhc2UgV0xBTl9IQUxfQUdHUl9BRERfVFNfUlNQOgorICAgIHJldHVybiBXRElfQUdHUl9BRERfVFNfUkVTUDsKKyNlbmRpZgorCisjaWZkZWYgV0xBTl9GRUFUVVJFX0dUS19PRkZMT0FECisgIGNhc2UgV0xBTl9IQUxfR1RLX09GRkxPQURfUlNQOgorICAgIHJldHVybiBXRElfR1RLX09GRkxPQURfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9HVEtfT0ZGTE9BRF9HRVRJTkZPX1JTUDoKKyAgICByZXR1cm4gV0RJX0dUS19PRkZMT0FEX0dFVElORk9fUkVTUDsKKyNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQgKi8KKyNpZmRlZiBXTEFOX1dBS0VVUF9FVkVOVFMKKyAgY2FzZSBXTEFOX0hBTF9XQUtFX1JFQVNPTl9JTkQ6CisgICAgcmV0dXJuIFdESV9IQUxfV0FLRV9SRUFTT05fSU5EOworI2VuZGlmIC8vIFdMQU5fV0FLRVVQX0VWRU5UUworCisgIGNhc2UgV0xBTl9IQUxfU0VUX1RIRVJNQUxfTUlUSUdBVElPTl9SU1A6CisgICAgcmV0dXJuIFdESV9TRVRfVE1fTEVWRUxfUkVTUDsKKyAgY2FzZSBXTEFOX0hBTF9GRUFUVVJFX0NBUFNfRVhDSEFOR0VfUlNQOgorICAgICAgcmV0dXJuIFdESV9GRUFUVVJFX0NBUFNfRVhDSEFOR0VfUkVTUDsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZURSSVZFUl9UWVBFX01BWDsgCisgIH0KKworfS8qSEFMXzJfV0RJX1JTUF9UWVBFKi8KKworCisvKkNvbnZlcnQgV0RJIGRyaXZlciB0eXBlIGludG8gSEFMIGRyaXZlciB0eXBlKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSB0RHJpdmVyVHlwZQorV0RJXzJfSEFMX0RSVl9UWVBFCisoCisgIFdESV9Ecml2ZXJUeXBlIHdkaURyaXZlclR5cGUKKykKK3sKKyAgLypMaWdodHdlaWdodCBmdW5jdGlvbiAtIG5vIHNhbml0eSBjaGVja3MgYW5kIG5vIHVuZWNlc3NhcnkgY29kZSB0byBpbmNyZWFzZSAKKyAgICB0aGUgY2hhbmNlcyBvZiBnZXR0aW5nIGlubGluZWQqLworICBzd2l0Y2goICB3ZGlEcml2ZXJUeXBlICkKKyAgeworICBjYXNlIFdESV9EUklWRVJfVFlQRV9QUk9EVUNUSU9OOgorICAgIHJldHVybiBlRFJJVkVSX1RZUEVfUFJPRFVDVElPTjsKKyAgY2FzZSBXRElfRFJJVkVSX1RZUEVfTUZHOgorICAgIHJldHVybiBlRFJJVkVSX1RZUEVfTUZHOworICBjYXNlIFdESV9EUklWRVJfVFlQRV9EVlQ6CisgICAgcmV0dXJuIGVEUklWRVJfVFlQRV9EVlQ7CisgIH0KKworICByZXR1cm4gZURSSVZFUl9UWVBFX01BWDsgCit9LypXRElfMl9IQUxfRFJWX1RZUEUqLworCisKKy8qQ29udmVydCBXREkgc3RvcCByZWFzb24gaW50byBIQUwgc3RvcCByZWFzb24qLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHRIYWxTdG9wVHlwZQorV0RJXzJfSEFMX1NUT1BfUkVBU09OCisoCisgIFdESV9TdG9wVHlwZSB3ZGlEcml2ZXJUeXBlCispCit7CisgIC8qTGlnaHR3ZWlnaHQgZnVuY3Rpb24gLSBubyBzYW5pdHkgY2hlY2tzIGFuZCBubyB1bmVjZXNzYXJ5IGNvZGUgdG8gaW5jcmVhc2UgCisgICAgdGhlIGNoYW5jZXMgb2YgZ2V0dGluZyBpbmxpbmVkKi8KKyAgc3dpdGNoKCAgd2RpRHJpdmVyVHlwZSApCisgIHsKKyAgY2FzZSBXRElfU1RPUF9UWVBFX1NZU19SRVNFVDoKKyAgICByZXR1cm4gSEFMX1NUT1BfVFlQRV9TWVNfUkVTRVQ7CisgIGNhc2UgV0RJX0RSSVZFUl9UWVBFX01GRzoKKyAgICByZXR1cm4gV0RJX1NUT1BfVFlQRV9TWVNfREVFUF9TTEVFUDsKKyAgY2FzZSBXRElfU1RPUF9UWVBFX1JGX0tJTEw6CisgICAgcmV0dXJuIEhBTF9TVE9QX1RZUEVfUkZfS0lMTDsKKyAgfQorCisgIHJldHVybiBIQUxfU1RPUF9UWVBFX01BWDsgCit9LypXRElfMl9IQUxfU1RPUF9SRUFTT04qLworCisKKy8qQ29udmVydCBXREkgc2NhbiBtb2RlIHR5cGUgaW50byBIQUwgc2NhbiBtb2RlIHR5cGUqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIGVIYWxTeXNNb2RlCitXRElfMl9IQUxfU0NBTl9NT0RFCisoCisgIFdESV9TY2FuTW9kZSB3ZGlTY2FuTW9kZQorKQoreworICAvKkxpZ2h0d2VpZ2h0IGZ1bmN0aW9uIC0gbm8gc2FuaXR5IGNoZWNrcyBhbmQgbm8gdW5lY2Vzc2FyeSBjb2RlIHRvIGluY3JlYXNlIAorICAgIHRoZSBjaGFuY2VzIG9mIGdldHRpbmcgaW5saW5lZCovCisgIHN3aXRjaCggIHdkaVNjYW5Nb2RlICkKKyAgeworICBjYXNlIFdESV9TQ0FOX01PREVfTk9STUFMOgorICAgIHJldHVybiBlSEFMX1NZU19NT0RFX05PUk1BTDsKKyAgY2FzZSBXRElfU0NBTl9NT0RFX0xFQVJOOgorICAgIHJldHVybiBlSEFMX1NZU19NT0RFX0xFQVJOOworICBjYXNlIFdESV9TQ0FOX01PREVfU0NBTjoKKyAgICByZXR1cm4gZUhBTF9TWVNfTU9ERV9TQ0FOOworICBjYXNlIFdESV9TQ0FOX01PREVfUFJPTUlTQzoKKyAgICByZXR1cm4gZUhBTF9TWVNfTU9ERV9QUk9NSVNDOyAKKyAgY2FzZSBXRElfU0NBTl9NT0RFX1NVU1BFTkRfTElOSzoKKyAgICByZXR1cm4gZUhBTF9TWVNfTU9ERV9TVVNQRU5EX0xJTks7CisgIH0KKworICByZXR1cm4gZUhBTF9TWVNfTU9ERV9NQVg7IAorfS8qV0RJXzJfSEFMX1NDQU5fTU9ERSovCisKKy8qQ29udmVydCBXREkgc2VjIGNoIG9mZnNldCBpbnRvIEhBTCBzZWMgY2ggb2Zmc2V0IHR5cGUqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHRTaXJNYWNIVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQKK1dESV8yX0hBTF9TRUNfQ0hfT0ZGU0VUCisoCisgIFdESV9IVFNlY29uZGFyeUNoYW5uZWxPZmZzZXQgd2RpU2VjQ2hPZmZzZXQKKykKK3sKKyAgLypMaWdodHdlaWdodCBmdW5jdGlvbiAtIG5vIHNhbml0eSBjaGVja3MgYW5kIG5vIHVuZWNlc3NhcnkgY29kZSB0byBpbmNyZWFzZSAKKyAgICB0aGUgY2hhbmNlcyBvZiBnZXR0aW5nIGlubGluZWQqLworICBzd2l0Y2goICB3ZGlTZWNDaE9mZnNldCApCisgIHsKKyAgY2FzZSBXRElfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX05PTkU6CisgICAgcmV0dXJuIGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfTk9ORTsKKyAgY2FzZSBXRElfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX1VQOgorICAgIHJldHVybiBlSFRfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VUX1VQOworICBjYXNlIFdESV9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfRE9XTjoKKyAgICByZXR1cm4gZUhUX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVF9ET1dOOworICB9CisKKyAgcmV0dXJuIGVIVF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVRfTUFYOyAKK30vKldESV8yX0hBTF9TRUNfQ0hfT0ZGU0VUKi8KKworLypDb252ZXJ0IFdESSBCU1MgdHlwZSBpbnRvIEhBTCBCU1MgdHlwZSovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdFNpckJzc1R5cGUKK1dESV8yX0hBTF9CU1NfVFlQRQorKAorICBXRElfQnNzVHlwZSB3ZGlCU1NUeXBlCispCit7CisgIC8qTGlnaHR3ZWlnaHQgZnVuY3Rpb24gLSBubyBzYW5pdHkgY2hlY2tzIGFuZCBubyB1bmVjZXNzYXJ5IGNvZGUgdG8gaW5jcmVhc2UgCisgICAgdGhlIGNoYW5jZXMgb2YgZ2V0dGluZyBpbmxpbmVkKi8KKyAgc3dpdGNoKCAgd2RpQlNTVHlwZSApCisgIHsKKyAgY2FzZSBXRElfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICByZXR1cm4gZVNJUl9JTkZSQVNUUlVDVFVSRV9NT0RFOworICBjYXNlIFdESV9JTkZSQV9BUF9NT0RFOgorICAgIHJldHVybiBlU0lSX0lORlJBX0FQX01PREU7CisgIGNhc2UgV0RJX0lCU1NfTU9ERToKKyAgICByZXR1cm4gZVNJUl9JQlNTX01PREU7CisgIGNhc2UgV0RJX0JUQU1QX1NUQV9NT0RFOgorICAgIHJldHVybiBlU0lSX0JUQU1QX1NUQV9NT0RFOworICBjYXNlIFdESV9CVEFNUF9BUF9NT0RFOgorICAgIHJldHVybiBlU0lSX0JUQU1QX0FQX01PREU7IAorICBjYXNlIFdESV9CU1NfQVVUT19NT0RFOgorICAgIHJldHVybiBlU0lSX0FVVE9fTU9ERTsKKyAgfQorCisgIHJldHVybiBlU0lSX0RPTk9UX1VTRV9CU1NfVFlQRTsgCit9LypXRElfMl9IQUxfQlNTX1RZUEUqLworCisvKkNvbnZlcnQgV0RJIE5XIHR5cGUgaW50byBIQUwgTlcgdHlwZSovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdFNpck53VHlwZQorV0RJXzJfSEFMX05XX1RZUEUKKygKKyAgV0RJX053VHlwZSB3ZGlOV1R5cGUKKykKK3sKKyAgLypMaWdodHdlaWdodCBmdW5jdGlvbiAtIG5vIHNhbml0eSBjaGVja3MgYW5kIG5vIHVuZWNlc3NhcnkgY29kZSB0byBpbmNyZWFzZSAKKyAgICB0aGUgY2hhbmNlcyBvZiBnZXR0aW5nIGlubGluZWQqLworICBzd2l0Y2goICB3ZGlOV1R5cGUgKQorICB7CisgIGNhc2UgV0RJXzExQV9OV19UWVBFOgorICAgIHJldHVybiBlU0lSXzExQV9OV19UWVBFOworICBjYXNlIFdESV8xMUJfTldfVFlQRToKKyAgICByZXR1cm4gZVNJUl8xMUJfTldfVFlQRTsKKyAgY2FzZSBXRElfMTFHX05XX1RZUEU6CisgICAgcmV0dXJuIGVTSVJfMTFHX05XX1RZUEU7CisgIGNhc2UgV0RJXzExTl9OV19UWVBFOgorICAgIHJldHVybiBlU0lSXzExTl9OV19UWVBFOworICB9CisKKyAgcmV0dXJuIGVTSVJfRE9OT1RfVVNFX05XX1RZUEU7IAorfS8qV0RJXzJfSEFMX05XX1RZUEUqLworCisvKkNvbnZlcnQgV0RJIGNoYW5lbCBib25kaW5nIHR5cGUgaW50byBIQUwgY2IgdHlwZSovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgZVBoeUNoYW5Cb25kU3RhdGUKK1dESV8yX0hBTF9DQl9TVEFURQorKAorICBXRElfUGh5Q2hhbkJvbmRTdGF0ZSB3ZGlDYlN0YXRlCispCit7CisgIC8qTGlnaHR3ZWlnaHQgZnVuY3Rpb24gLSBubyBzYW5pdHkgY2hlY2tzIGFuZCBubyB1bmVjZXNzYXJ5IGNvZGUgdG8gaW5jcmVhc2UgCisgICAgdGhlIGNoYW5jZXMgb2YgZ2V0dGluZyBpbmxpbmVkKi8KKyAgc3dpdGNoICggd2RpQ2JTdGF0ZSApCisgIHsKKyAgY2FzZSBXRElfUEhZX1NJTkdMRV9DSEFOTkVMX0NFTlRFUkVEOgorICAgIHJldHVybiBQSFlfU0lOR0xFX0NIQU5ORUxfQ0VOVEVSRUQ7CisgIGNhc2UgV0RJX1BIWV9ET1VCTEVfQ0hBTk5FTF9MT1dfUFJJTUFSWToKKyAgICByZXR1cm4gUEhZX0RPVUJMRV9DSEFOTkVMX0xPV19QUklNQVJZOworICBjYXNlIFdESV9QSFlfRE9VQkxFX0NIQU5ORUxfQ0VOVEVSRUQ6CisgICAgcmV0dXJuIFBIWV9ET1VCTEVfQ0hBTk5FTF9DRU5URVJFRDsKKyAgY2FzZSBXRElfUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWToKKyAgICByZXR1cm4gUEhZX0RPVUJMRV9DSEFOTkVMX0hJR0hfUFJJTUFSWTsKKyAgfQorICAKKyAgcmV0dXJuIFBIWV9DSEFOTkVMX0JPTkRJTkdfU1RBVEVfTUFYOworfS8qV0RJXzJfSEFMX0NCX1NUQVRFKi8KKworLypDb252ZXJ0IFdESSBjaGFuZWwgYm9uZGluZyB0eXBlIGludG8gSEFMIGNiIHR5cGUqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHRTaXJNYWNIVE9wZXJhdGluZ01vZGUKK1dESV8yX0hBTF9IVF9PUEVSX01PREUKKygKKyAgV0RJX0hUT3BlcmF0aW5nTW9kZSB3ZGlIVE9wZXJNb2RlCispCit7CisgIC8qTGlnaHR3ZWlnaHQgZnVuY3Rpb24gLSBubyBzYW5pdHkgY2hlY2tzIGFuZCBubyB1bmVjZXNzYXJ5IGNvZGUgdG8gaW5jcmVhc2UgCisgICAgdGhlIGNoYW5jZXMgb2YgZ2V0dGluZyBpbmxpbmVkKi8KKyAgc3dpdGNoICggd2RpSFRPcGVyTW9kZSApCisgIHsKKyAgY2FzZSBXRElfSFRfT1BfTU9ERV9QVVJFOgorICAgIHJldHVybiBlU0lSX0hUX09QX01PREVfUFVSRTsKKyAgY2FzZSBXRElfSFRfT1BfTU9ERV9PVkVSTEFQX0xFR0FDWToKKyAgICByZXR1cm4gZVNJUl9IVF9PUF9NT0RFX09WRVJMQVBfTEVHQUNZOworICBjYXNlIFdESV9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDoKKyAgICByZXR1cm4gZVNJUl9IVF9PUF9NT0RFX05PX0xFR0FDWV8yME1IWl9IVDsKKyAgY2FzZSBXRElfSFRfT1BfTU9ERV9NSVhFRDoKKyAgICByZXR1cm4gZVNJUl9IVF9PUF9NT0RFX01JWEVEOworICB9CisgIAorICByZXR1cm4gZVNJUl9IVF9PUF9NT0RFX01BWDsKK30vKldESV8yX0hBTF9IVF9PUEVSX01PREUqLworCisvKkNvbnZlcnQgV0RJIG1pbW8gUFMgdHlwZSBpbnRvIEhBTCBtaW1vIFBTIHR5cGUqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHRTaXJNYWNIVE1JTU9Qb3dlclNhdmVTdGF0ZQorV0RJXzJfSEFMX01JTU9fUFMKKygKKyAgV0RJX0hUTUlNT1Bvd2VyU2F2ZVN0YXRlIHdkaUhUT3Blck1vZGUKKykKK3sKKyAgLypMaWdodHdlaWdodCBmdW5jdGlvbiAtIG5vIHNhbml0eSBjaGVja3MgYW5kIG5vIHVuZWNlc3NhcnkgY29kZSB0byBpbmNyZWFzZSAKKyAgICB0aGUgY2hhbmNlcyBvZiBnZXR0aW5nIGlubGluZWQqLworICBzd2l0Y2ggKCB3ZGlIVE9wZXJNb2RlICkKKyAgeworICBjYXNlIFdESV9IVF9NSU1PX1BTX1NUQVRJQzoKKyAgICByZXR1cm4gZVNJUl9IVF9NSU1PX1BTX1NUQVRJQzsKKyAgY2FzZSBXRElfSFRfTUlNT19QU19EWU5BTUlDOgorICAgIHJldHVybiBlU0lSX0hUX01JTU9fUFNfRFlOQU1JQzsKKyAgY2FzZSBXRElfSFRfTUlNT19QU19OQToKKyAgICByZXR1cm4gZVNJUl9IVF9NSU1PX1BTX05BOworICBjYXNlIFdESV9IVF9NSU1PX1BTX05PX0xJTUlUOgorICAgIHJldHVybiBlU0lSX0hUX01JTU9fUFNfTk9fTElNSVQ7CisgIH0KKyAgCisgIHJldHVybiBlU0lSX0hUX01JTU9fUFNfTUFYOworfS8qV0RJXzJfSEFMX01JTU9fUFMqLworCisvKkNvbnZlcnQgV0RJIEVOQyB0eXBlIGludG8gSEFMIEVOQyB0eXBlKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSB0QW5pRWRUeXBlCitXRElfMl9IQUxfRU5DX1RZUEUKKygKKyAgV0RJX0VuY3J5cHRUeXBlIHdkaUVuY1R5cGUKKykKK3sKKyAgLypMaWdodHdlaWdodCBmdW5jdGlvbiAtIG5vIHNhbml0eSBjaGVja3MgYW5kIG5vIHVuZWNlc3NhcnkgY29kZSB0byBpbmNyZWFzZSAKKyAgICB0aGUgY2hhbmNlcyBvZiBnZXR0aW5nIGlubGluZWQqLworICBzd2l0Y2ggKCB3ZGlFbmNUeXBlICkKKyAgeworICBjYXNlIFdESV9FTkNSX05PTkU6CisgICAgcmV0dXJuIGVTSVJfRURfTk9ORTsKKworICBjYXNlIFdESV9FTkNSX1dFUDQwOgorICAgIHJldHVybiBlU0lSX0VEX1dFUDQwOworCisgIGNhc2UgV0RJX0VOQ1JfV0VQMTA0OgorICAgIHJldHVybiBlU0lSX0VEX1dFUDEwNDsKKworICBjYXNlIFdESV9FTkNSX1RLSVA6CisgICAgcmV0dXJuIGVTSVJfRURfVEtJUDsKKworICBjYXNlIFdESV9FTkNSX0NDTVA6CisgICAgcmV0dXJuIGVTSVJfRURfQ0NNUDsKKworICBjYXNlIFdESV9FTkNSX0FFU18xMjhfQ01BQzoKKyAgICByZXR1cm4gZVNJUl9FRF9BRVNfMTI4X0NNQUM7CisjaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fV0FQSSkKKyAgY2FzZSBXRElfRU5DUl9XUEk6CisgICAgcmV0dXJuIGVTSVJfRURfV1BJOworI2VuZGlmCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGVTSVJfRURfTk9UX0lNUExFTUVOVEVEOworICB9CisKK30vKldESV8yX0hBTF9FTkNfVFlQRSovCisKKy8qQ29udmVydCBXREkgV0VQIHR5cGUgaW50byBIQUwgV0VQIHR5cGUqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHRBbmlXZXBUeXBlCitXRElfMl9IQUxfV0VQX1RZUEUKKygKKyAgV0RJX1dlcFR5cGUgIHdkaVdFUFR5cGUKKykKK3sKKyAgLypMaWdodHdlaWdodCBmdW5jdGlvbiAtIG5vIHNhbml0eSBjaGVja3MgYW5kIG5vIHVuZWNlc3NhcnkgY29kZSB0byBpbmNyZWFzZSAKKyAgICB0aGUgY2hhbmNlcyBvZiBnZXR0aW5nIGlubGluZWQqLworICBzd2l0Y2ggKCB3ZGlXRVBUeXBlICkKKyAgeworICBjYXNlIFdESV9XRVBfU1RBVElDOgorICAgIHJldHVybiBlU0lSX1dFUF9TVEFUSUM7CisKKyAgY2FzZSBXRElfV0VQX0RZTkFNSUM6CisgICAgcmV0dXJuIGVTSVJfV0VQX0RZTkFNSUM7CisgIH0KKyAgCisgIHJldHVybiBlU0lSX1dFUF9NQVg7Cit9LypXRElfMl9IQUxfV0VQX1RZUEUqLworCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdFNpckxpbmtTdGF0ZQorV0RJXzJfSEFMX0xJTktfU1RBVEUKKygKKyAgV0RJX0xpbmtTdGF0ZVR5cGUgIHdkaUxpbmtTdGF0ZQorKQoreworICAvKkxpZ2h0d2VpZ2h0IGZ1bmN0aW9uIC0gbm8gc2FuaXR5IGNoZWNrcyBhbmQgbm8gdW5lY2Vzc2FyeSBjb2RlIHRvIGluY3JlYXNlIAorICAgIHRoZSBjaGFuY2VzIG9mIGdldHRpbmcgaW5saW5lZCovCisgIHN3aXRjaCAoIHdkaUxpbmtTdGF0ZSApCisgIHsKKyAgY2FzZSBXRElfTElOS19JRExFX1NUQVRFOgorICAgIHJldHVybiBlU0lSX0xJTktfSURMRV9TVEFURTsKKworICBjYXNlIFdESV9MSU5LX1BSRUFTU09DX1NUQVRFOgorICAgIHJldHVybiBlU0lSX0xJTktfUFJFQVNTT0NfU1RBVEU7CisKKyAgY2FzZSBXRElfTElOS19QT1NUQVNTT0NfU1RBVEU6CisgICAgcmV0dXJuIGVTSVJfTElOS19QT1NUQVNTT0NfU1RBVEU7CisKKyAgY2FzZSBXRElfTElOS19BUF9TVEFURToKKyAgICByZXR1cm4gZVNJUl9MSU5LX0FQX1NUQVRFOworCisgIGNhc2UgV0RJX0xJTktfSUJTU19TVEFURToKKyAgICByZXR1cm4gZVNJUl9MSU5LX0lCU1NfU1RBVEU7CisKKyAgY2FzZSBXRElfTElOS19CVEFNUF9QUkVBU1NPQ19TVEFURToKKyAgICByZXR1cm4gZVNJUl9MSU5LX0JUQU1QX1BSRUFTU09DX1NUQVRFOworCisgIGNhc2UgV0RJX0xJTktfQlRBTVBfUE9TVEFTU09DX1NUQVRFOgorICAgIHJldHVybiBlU0lSX0xJTktfQlRBTVBfUE9TVEFTU09DX1NUQVRFOworCisgIGNhc2UgV0RJX0xJTktfQlRBTVBfQVBfU1RBVEU6CisgICAgcmV0dXJuIGVTSVJfTElOS19CVEFNUF9BUF9TVEFURTsKKworICBjYXNlIFdESV9MSU5LX0JUQU1QX1NUQV9TVEFURToKKyAgICByZXR1cm4gZVNJUl9MSU5LX0JUQU1QX1NUQV9TVEFURTsKKworICBjYXNlIFdESV9MSU5LX0xFQVJOX1NUQVRFOgorICAgIHJldHVybiBlU0lSX0xJTktfTEVBUk5fU1RBVEU7CisKKyAgY2FzZSBXRElfTElOS19TQ0FOX1NUQVRFOgorICAgIHJldHVybiBlU0lSX0xJTktfU0NBTl9TVEFURTsKKworICBjYXNlIFdESV9MSU5LX0ZJTklTSF9TQ0FOX1NUQVRFOgorICAgIHJldHVybiBlU0lSX0xJTktfRklOSVNIX1NDQU5fU1RBVEU7CisKKyAgY2FzZSBXRElfTElOS19JTklUX0NBTF9TVEFURToKKyAgICByZXR1cm4gZVNJUl9MSU5LX0lOSVRfQ0FMX1NUQVRFOworCisgIGNhc2UgV0RJX0xJTktfRklOSVNIX0NBTF9TVEFURToKKyAgICByZXR1cm4gZVNJUl9MSU5LX0ZJTklTSF9DQUxfU1RBVEU7CisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCisgIGNhc2UgV0RJX0xJTktfTElTVEVOX1NUQVRFOgorICAgIHJldHVybiBlU0lSX0xJTktfTElTVEVOX1NUQVRFOworI2VuZGlmCisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZVNJUl9MSU5LX01BWDsKKyAgfSAgCit9CisKKy8qVHJhbnNsYXRlIGEgU1RBIENvbnRleHQgZnJvbSBXREkgaW50byBIQUwqLyAKK1dQVF9TVEFUSUMgV1BUX0lOTElORSAKK3ZvaWQKK1dESV9Db3B5V0RJU3RhQ3R4VG9IQUxTdGFDdHgKKyggCisgIHRDb25maWdTdGFQYXJhbXMqICAgICAgICAgIHBoYWxDb25maWdTdGEsCisgIFdESV9Db25maWdTdGFSZXFJbmZvVHlwZSogIHB3ZGlDb25maWdTdGEKKykKK3sKKyAgIHdwdF91aW50OCBpOworICAgLypMaWdodHdlaWdodCBmdW5jdGlvbiAtIG5vIHNhbml0eSBjaGVja3MgYW5kIG5vIHVuZWNlc3NhcnkgY29kZSB0byBpbmNyZWFzZSAKKyAgICB0aGUgY2hhbmNlcyBvZiBnZXR0aW5nIGlubGluZWQqLworCisgIHdwYWxNZW1vcnlDb3B5KHBoYWxDb25maWdTdGEtPmJzc0lkLCAKKyAgICAgICAgICAgICAgICAgIHB3ZGlDb25maWdTdGEtPm1hY0JTU0lELCBXRElfTUFDX0FERFJfTEVOKTsgCisgIAorICB3cGFsTWVtb3J5Q29weShwaGFsQ29uZmlnU3RhLT5zdGFNYWMsIAorICAgICAgICAgICAgICAgICAgcHdkaUNvbmZpZ1N0YS0+bWFjU1RBLCBXRElfTUFDX0FERFJfTEVOKTsgCisKKyAgcGhhbENvbmZpZ1N0YS0+YXNzb2NJZCAgICAgICAgICAgICAgICAgPSBwd2RpQ29uZmlnU3RhLT51c0Fzc29jSWQ7CisgIHBoYWxDb25maWdTdGEtPnN0YVR5cGUgICAgICAgICAgICAgICAgID0gcHdkaUNvbmZpZ1N0YS0+d2RpU1RBVHlwZTsKKyAgcGhhbENvbmZpZ1N0YS0+c2hvcnRQcmVhbWJsZVN1cHBvcnRlZCAgPSBwd2RpQ29uZmlnU3RhLT51Y1Nob3J0UHJlYW1ibGVTdXBwb3J0ZWQ7CisgIHBoYWxDb25maWdTdGEtPmxpc3RlbkludGVydmFsICAgICAgICAgID0gcHdkaUNvbmZpZ1N0YS0+dXNMaXN0ZW5JbnRlcnZhbDsKKyAgcGhhbENvbmZpZ1N0YS0+d21tRW5hYmxlZCAgICAgICAgICAgICAgPSBwd2RpQ29uZmlnU3RhLT51Y1dNTUVuYWJsZWQ7CisgIHBoYWxDb25maWdTdGEtPmh0Q2FwYWJsZSAgICAgICAgICAgICAgID0gcHdkaUNvbmZpZ1N0YS0+dWNIVENhcGFibGU7CisgIHBoYWxDb25maWdTdGEtPnR4Q2hhbm5lbFdpZHRoU2V0ICAgICAgID0gcHdkaUNvbmZpZ1N0YS0+dWNUWENoYW5uZWxXaWR0aFNldDsKKyAgcGhhbENvbmZpZ1N0YS0+cmlmc01vZGUgICAgICAgICAgICAgICAgPSBwd2RpQ29uZmlnU3RhLT51Y1JJRlNNb2RlOworICBwaGFsQ29uZmlnU3RhLT5sc2lnVHhvcFByb3RlY3Rpb24gICAgICA9IHB3ZGlDb25maWdTdGEtPnVjTFNJR1R4b3BQcm90ZWN0aW9uOworICBwaGFsQ29uZmlnU3RhLT5tYXhBbXBkdVNpemUgICAgICAgICAgICA9IHB3ZGlDb25maWdTdGEtPnVjTWF4QW1wZHVTaXplOworICBwaGFsQ29uZmlnU3RhLT5tYXhBbXBkdURlbnNpdHkgICAgICAgICA9IHB3ZGlDb25maWdTdGEtPnVjTWF4QW1wZHVEZW5zaXR5OworICBwaGFsQ29uZmlnU3RhLT5tYXhBbXNkdVNpemUgICAgICAgICAgICA9IHB3ZGlDb25maWdTdGEtPnVjTWF4QW1zZHVTaXplOworICBwaGFsQ29uZmlnU3RhLT5mU2hvcnRHSTQwTWh6ICAgICAgICAgICA9IHB3ZGlDb25maWdTdGEtPnVjU2hvcnRHSTQwTWh6OworICBwaGFsQ29uZmlnU3RhLT5mU2hvcnRHSTIwTWh6ICAgICAgICAgICA9IHB3ZGlDb25maWdTdGEtPnVjU2hvcnRHSTIwTWh6OworICBwaGFsQ29uZmlnU3RhLT5ybWZFbmFibGVkICAgICAgICAgICAgICA9IHB3ZGlDb25maWdTdGEtPnVjUk1GRW5hYmxlZDsKKyAgcGhhbENvbmZpZ1N0YS0+YWN0aW9uICAgICAgICAgICAgICAgICAgPSBwd2RpQ29uZmlnU3RhLT53ZGlBY3Rpb247CisgIHBoYWxDb25maWdTdGEtPnVBUFNEICAgICAgICAgICAgICAgICAgID0gcHdkaUNvbmZpZ1N0YS0+dWNBUFNEOworICBwaGFsQ29uZmlnU3RhLT5tYXhTUExlbiAgICAgICAgICAgICAgICA9IHB3ZGlDb25maWdTdGEtPnVjTWF4U1BMZW47CisgIHBoYWxDb25maWdTdGEtPmdyZWVuRmllbGRDYXBhYmxlICAgICAgID0gcHdkaUNvbmZpZ1N0YS0+dWNHcmVlbkZpZWxkQ2FwYWJsZTsKKyAgcGhhbENvbmZpZ1N0YS0+ZGVsYXllZEJBU3VwcG9ydCAgICAgICAgPSBwd2RpQ29uZmlnU3RhLT51Y0RlbGF5ZWRCQVN1cHBvcnQ7CisgIHBoYWxDb25maWdTdGEtPnVzMzJNYXhBbXBkdUR1cmF0aW9uICAgID0gcHdkaUNvbmZpZ1N0YS0+dXMzMk1heEFtcGR1RHVyYXRpbzsKKyAgcGhhbENvbmZpZ1N0YS0+ZkRzc3NDY2tNb2RlNDBNaHogICAgICAgPSBwd2RpQ29uZmlnU3RhLT51Y0Rzc3NDY2tNb2RlNDBNaHo7CisgIHBoYWxDb25maWdTdGEtPmVuY3J5cHRUeXBlICAgICAgICAgICAgID0gcHdkaUNvbmZpZ1N0YS0+dWNFbmNyeXB0VHlwZTsKKyAgCisgIHBoYWxDb25maWdTdGEtPm1pbW9QUyA9IFdESV8yX0hBTF9NSU1PX1BTKHB3ZGlDb25maWdTdGEtPndkaU1JTU9QUyk7CisKKyAgcGhhbENvbmZpZ1N0YS0+c3VwcG9ydGVkUmF0ZXMub3BSYXRlTW9kZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpQ29uZmlnU3RhLT53ZGlTdXBwb3J0ZWRSYXRlcy5vcFJhdGVNb2RlOworICBmb3IoaSA9IDA7IGkgPCBTSVJfTlVNXzExQl9SQVRFUzsgaSArKykKKyAgeworICAgICBwaGFsQ29uZmlnU3RhLT5zdXBwb3J0ZWRSYXRlcy5sbGJSYXRlc1tpXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpQ29uZmlnU3RhLT53ZGlTdXBwb3J0ZWRSYXRlcy5sbGJSYXRlc1tpXTsKKyAgfQorICBmb3IoaSA9IDA7IGkgPCBTSVJfTlVNXzExQV9SQVRFUzsgaSArKykKKyAgeworICAgICBwaGFsQ29uZmlnU3RhLT5zdXBwb3J0ZWRSYXRlcy5sbGFSYXRlc1tpXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpQ29uZmlnU3RhLT53ZGlTdXBwb3J0ZWRSYXRlcy5sbGFSYXRlc1tpXTsKKyAgfQorICBmb3IoaSA9IDA7IGkgPCBTSVJfTlVNX1BPTEFSSVNfUkFURVM7IGkgKyspCisgIHsKKyAgICAgcGhhbENvbmZpZ1N0YS0+c3VwcG9ydGVkUmF0ZXMuYW5pTGVnYWN5UmF0ZXNbaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpQ29uZmlnU3RhLT53ZGlTdXBwb3J0ZWRSYXRlcy5hTGVnYWN5UmF0ZXNbaV07CisgIH0KKyAgcGhhbENvbmZpZ1N0YS0+c3VwcG9ydGVkUmF0ZXMuYW5pRW5oYW5jZWRSYXRlQml0bWFwID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ZGlDb25maWdTdGEtPndkaVN1cHBvcnRlZFJhdGVzLnVFbmhhbmNlZFJhdGVCaXRtYXA7CisgIGZvcihpID0gMDsgaSA8IFNJUl9NQUNfTUFYX1NVUFBPUlRFRF9NQ1NfU0VUOyBpICsrKQorICB7CisgICAgIHBoYWxDb25maWdTdGEtPnN1cHBvcnRlZFJhdGVzLnN1cHBvcnRlZE1DU1NldFtpXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpQ29uZmlnU3RhLT53ZGlTdXBwb3J0ZWRSYXRlcy5hU3VwcG9ydGVkTUNTU2V0W2ldOworICB9CisgIHBoYWxDb25maWdTdGEtPnN1cHBvcnRlZFJhdGVzLnJ4SGlnaGVzdERhdGFSYXRlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaUNvbmZpZ1N0YS0+d2RpU3VwcG9ydGVkUmF0ZXMuYVJ4SGlnaGVzdERhdGFSYXRlOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1AyUAorICBwaGFsQ29uZmlnU3RhLT5wMnBDYXBhYmxlU3RhID0gcHdkaUNvbmZpZ1N0YS0+dWNQMnBDYXBhYmxlU3RhIDsKKyNlbmRpZgorCit9LypXRElfQ29weVdESVN0YUN0eFRvSEFMU3RhQ3R4Ki87CisgCisvKlRyYW5zbGF0ZSBhIFJhdGUgc2V0IGluZm8gZnJvbSBXREkgaW50byBIQUwqLyAKK1dQVF9TVEFUSUMgV1BUX0lOTElORSB2b2lkIAorV0RJX0NvcHlXRElSYXRlU2V0VG9IQUxSYXRlU2V0CisoIAorICB0U2lyTWFjUmF0ZVNldCogcEhhbFJhdGVTZXQsCisgIFdESV9SYXRlU2V0KiAgICBwd2RpUmF0ZVNldAorKQoreworICB3cHRfdWludDggaTsgCisgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICBwSGFsUmF0ZVNldC0+bnVtUmF0ZXMgPSAoIHB3ZGlSYXRlU2V0LT51Y051bVJhdGVzIDw9IFNJUl9NQUNfUkFURVNFVF9FSURfTUFYICk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVJhdGVTZXQtPnVjTnVtUmF0ZXM6U0lSX01BQ19SQVRFU0VUX0VJRF9NQVg7CisKKyAgZm9yICggaSA9IDA7IGkgPCBwSGFsUmF0ZVNldC0+bnVtUmF0ZXM7IGkrKyApCisgIHsKKyAgICBwSGFsUmF0ZVNldC0+cmF0ZVtpXSA9IHB3ZGlSYXRlU2V0LT5hUmF0ZXNbaV07CisgIH0KKyAgCit9LypXRElfQ29weVdESVJhdGVTZXRUb0hBTFJhdGVTZXQqLworCisKKy8qVHJhbnNsYXRlIGFuIEVEQ0EgUGFyYW1ldGVyIFJlY29yZCBmcm9tIFdESSBpbnRvIEhBTCovCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgdm9pZAorV0RJX0NvcHlXRElFRENBUGFyYW1zVG9IQUxFRENBUGFyYW1zCisoIAorICB0U2lyTWFjRWRjYVBhcmFtUmVjb3JkKiBwaGFsRWRjYVBhcmFtLAorICBXRElfRWRjYVBhcmFtUmVjb3JkKiAgICBwV0RJRWRjYVBhcmFtCispCit7CisgIC8qTGlnaHR3ZWlnaHQgZnVuY3Rpb24gLSBubyBzYW5pdHkgY2hlY2tzIGFuZCBubyB1bmVjZXNzYXJ5IGNvZGUgdG8gaW5jcmVhc2UgCisgICAgdGhlIGNoYW5jZXMgb2YgZ2V0dGluZyBpbmxpbmVkKi8KKworICBwaGFsRWRjYVBhcmFtLT5hY2kucnN2ZCAgID0gcFdESUVkY2FQYXJhbS0+d2RpQUNJLnJzdmQ7CisgIHBoYWxFZGNhUGFyYW0tPmFjaS5hY2kgICAgPSBwV0RJRWRjYVBhcmFtLT53ZGlBQ0kuYWNpOworICBwaGFsRWRjYVBhcmFtLT5hY2kuYWNtICAgID0gcFdESUVkY2FQYXJhbS0+d2RpQUNJLmFjbTsKKyAgcGhhbEVkY2FQYXJhbS0+YWNpLmFpZnNuICA9IHBXRElFZGNhUGFyYW0tPndkaUFDSS5haWZzbjsKKworICBwaGFsRWRjYVBhcmFtLT5jdy5tYXggICAgID0gcFdESUVkY2FQYXJhbS0+d2RpQ1cubWF4OworICBwaGFsRWRjYVBhcmFtLT5jdy5taW4gICAgID0gcFdESUVkY2FQYXJhbS0+d2RpQ1cubWluOworICBwaGFsRWRjYVBhcmFtLT50eG9wbGltaXQgID0gcFdESUVkY2FQYXJhbS0+dXNUWE9QTGltaXQ7Cit9LypXRElfQ29weVdESUVEQ0FQYXJhbXNUb0hBTEVEQ0FQYXJhbXMqLworCisKKy8qQ29weSBhIG1hbmFnZW1lbnQgZnJhbWUgaGVhZGVyIGZyb20gV0RJIGZtdCBpbnRvIEhBTCBmbXQqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHZvaWQKK1dESV9Db3B5V0RJTWdtRnJhbWVIZHJUb0hBTE1nbUZyYW1lSGRyCisoCisgIHRTaXJNYWNNZ210SGRyKiBwbWFjTWdtdEhkciwKKyAgV0RJX01hY01nbXRIZHIqIHB3ZGlNYWNNZ210SGRyCispCit7CisgIHBtYWNNZ210SGRyLT5mYy5wcm90VmVyICAgID0gIHB3ZGlNYWNNZ210SGRyLT5mYy5wcm90VmVyOworICBwbWFjTWdtdEhkci0+ZmMudHlwZSAgICAgICA9ICBwd2RpTWFjTWdtdEhkci0+ZmMudHlwZTsKKyAgcG1hY01nbXRIZHItPmZjLnN1YlR5cGUgICAgPSAgcHdkaU1hY01nbXRIZHItPmZjLnN1YlR5cGU7CisgIHBtYWNNZ210SGRyLT5mYy50b0RTICAgICAgID0gIHB3ZGlNYWNNZ210SGRyLT5mYy50b0RTOworICBwbWFjTWdtdEhkci0+ZmMuZnJvbURTICAgICA9ICBwd2RpTWFjTWdtdEhkci0+ZmMuZnJvbURTOworICBwbWFjTWdtdEhkci0+ZmMubW9yZUZyYWcgICA9ICBwd2RpTWFjTWdtdEhkci0+ZmMubW9yZUZyYWc7CisgIHBtYWNNZ210SGRyLT5mYy5yZXRyeSAgICAgID0gIHB3ZGlNYWNNZ210SGRyLT5mYy5yZXRyeTsKKyAgcG1hY01nbXRIZHItPmZjLnBvd2VyTWdtdCAgPSAgcHdkaU1hY01nbXRIZHItPmZjLnBvd2VyTWdtdDsKKyAgcG1hY01nbXRIZHItPmZjLm1vcmVEYXRhICAgPSAgcHdkaU1hY01nbXRIZHItPmZjLm1vcmVEYXRhOworICBwbWFjTWdtdEhkci0+ZmMud2VwICAgICAgICA9ICBwd2RpTWFjTWdtdEhkci0+ZmMud2VwOworICBwbWFjTWdtdEhkci0+ZmMub3JkZXIgICAgICA9ICBwd2RpTWFjTWdtdEhkci0+ZmMub3JkZXI7CisKKyAgcG1hY01nbXRIZHItPmR1cmF0aW9uTG8gPSAgcHdkaU1hY01nbXRIZHItPmR1cmF0aW9uTG87CisgIHBtYWNNZ210SGRyLT5kdXJhdGlvbkhpID0gIHB3ZGlNYWNNZ210SGRyLT5kdXJhdGlvbkhpOworCisgIHdwYWxNZW1vcnlDb3B5KHBtYWNNZ210SGRyLT5kYSwgCisgICAgICAgICAgICAgICAgIHB3ZGlNYWNNZ210SGRyLT5kYSwgNik7CisgIHdwYWxNZW1vcnlDb3B5KHBtYWNNZ210SGRyLT5zYSwgCisgICAgICAgICAgICAgICAgIHB3ZGlNYWNNZ210SGRyLT5zYSwgNik7CisgIHdwYWxNZW1vcnlDb3B5KHBtYWNNZ210SGRyLT5ic3NJZCwgCisgICAgICAgICAgICAgICAgIHB3ZGlNYWNNZ210SGRyLT5ic3NJZCwgNik7CisKKyAgcG1hY01nbXRIZHItPnNlcUNvbnRyb2wuZnJhZ051bSAgPSAgcHdkaU1hY01nbXRIZHItPnNlcUNvbnRyb2wuZnJhZ051bTsKKyAgcG1hY01nbXRIZHItPnNlcUNvbnRyb2wuc2VxTnVtTG8gPSAgcHdkaU1hY01nbXRIZHItPnNlcUNvbnRyb2wuc2VxTnVtTG87CisgIHBtYWNNZ210SGRyLT5zZXFDb250cm9sLnNlcU51bUhpID0gIHB3ZGlNYWNNZ210SGRyLT5zZXFDb250cm9sLnNlcU51bUhpOworCit9LypXRElfQ29weVdESU1nbUZyYW1lSGRyVG9IQUxNZ21GcmFtZUhkciovCisKKworLypDb3B5IGNvbmZpZyBic3MgcGFyYW1ldGVycyBmcm9tIFdESSBmbXQgaW50byBIQUwgZm10Ki8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSB2b2lkCitXRElfQ29weVdESUNvbmZpZ0JTU1RvSEFMQ29uZmlnQlNTCisoCisgIHRDb25maWdCc3NQYXJhbXMqICAgICAgICAgcGhhbENvbmZpZ0JTUywKKyAgV0RJX0NvbmZpZ0JTU1JlcUluZm9UeXBlKiBwd2RpQ29uZmlnQlNTCispCit7CisKKyAgd3B0X3VpbnQ4IGtleUluZGV4ID0gMDsKKyAgd3BhbE1lbW9yeUNvcHkoIHBoYWxDb25maWdCU1MtPmJzc0lkLAorICAgICAgICAgICAgICAgICAgcHdkaUNvbmZpZ0JTUy0+bWFjQlNTSUQsCisgICAgICAgICAgICAgICAgICBXRElfTUFDX0FERFJfTEVOKTsKKworI2lmZGVmIEhBTF9TRUxGX1NUQV9QRVJfQlNTCisgIHdwYWxNZW1vcnlDb3B5KCBwaGFsQ29uZmlnQlNTLT5zZWxmTWFjQWRkciwKKyAgICAgICAgICAgICAgICAgIHB3ZGlDb25maWdCU1MtPm1hY1NlbGZBZGRyLAorICAgICAgICAgICAgICAgICAgV0RJX01BQ19BRERSX0xFTik7CisjZW5kaWYKKworICBwaGFsQ29uZmlnQlNTLT5ic3NUeXBlICA9IFdESV8yX0hBTF9CU1NfVFlQRShwd2RpQ29uZmlnQlNTLT53ZGlCU1NUeXBlKTsKKworICBwaGFsQ29uZmlnQlNTLT5vcGVyTW9kZSA9IHB3ZGlDb25maWdCU1MtPnVjT3Blck1vZGU7CisgIHBoYWxDb25maWdCU1MtPm53VHlwZSAgID0gV0RJXzJfSEFMX05XX1RZUEUocHdkaUNvbmZpZ0JTUy0+d2RpTldUeXBlKTsKKworICBwaGFsQ29uZmlnQlNTLT5zaG9ydFNsb3RUaW1lU3VwcG9ydGVkID0gCisgICAgIHB3ZGlDb25maWdCU1MtPnVjU2hvcnRTbG90VGltZVN1cHBvcnRlZDsKKyAgcGhhbENvbmZpZ0JTUy0+bGxhQ29leGlzdCAgICAgICAgID0gcHdkaUNvbmZpZ0JTUy0+dWNsbGFDb2V4aXN0OworICBwaGFsQ29uZmlnQlNTLT5sbGJDb2V4aXN0ICAgICAgICAgPSBwd2RpQ29uZmlnQlNTLT51Y2xsYkNvZXhpc3Q7CisgIHBoYWxDb25maWdCU1MtPmxsZ0NvZXhpc3QgICAgICAgICA9IHB3ZGlDb25maWdCU1MtPnVjbGxnQ29leGlzdDsKKyAgcGhhbENvbmZpZ0JTUy0+aHQyMENvZXhpc3QgICAgICAgID0gcHdkaUNvbmZpZ0JTUy0+dWNIVDIwQ29leGlzdDsKKyAgcGhhbENvbmZpZ0JTUy0+bGxuTm9uR0ZDb2V4aXN0ICAgID0gcHdkaUNvbmZpZ0JTUy0+dWNsbG5Ob25HRkNvZXhpc3Q7CisgIHBoYWxDb25maWdCU1MtPmZMc2lnVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydCA9IAorICAgIHB3ZGlDb25maWdCU1MtPnVjVFhPUFByb3RlY3Rpb25GdWxsU3VwcG9ydDsKKyAgcGhhbENvbmZpZ0JTUy0+ZlJJRlNNb2RlICAgICAgICAgID0gcHdkaUNvbmZpZ0JTUy0+dWNSSUZTTW9kZTsKKyAgcGhhbENvbmZpZ0JTUy0+YmVhY29uSW50ZXJ2YWwgICAgID0gcHdkaUNvbmZpZ0JTUy0+dXNCZWFjb25JbnRlcnZhbDsKKyAgcGhhbENvbmZpZ0JTUy0+ZHRpbVBlcmlvZCAgICAgICAgID0gcHdkaUNvbmZpZ0JTUy0+dWNEVElNUGVyaW9kOworICBwaGFsQ29uZmlnQlNTLT50eENoYW5uZWxXaWR0aFNldCAgPSBwd2RpQ29uZmlnQlNTLT51Y1RYQ2hhbm5lbFdpZHRoU2V0OworICBwaGFsQ29uZmlnQlNTLT5jdXJyZW50T3BlckNoYW5uZWwgPSBwd2RpQ29uZmlnQlNTLT51Y0N1cnJlbnRPcGVyQ2hhbm5lbDsKKyAgcGhhbENvbmZpZ0JTUy0+Y3VycmVudEV4dENoYW5uZWwgID0gcHdkaUNvbmZpZ0JTUy0+dWNDdXJyZW50RXh0Q2hhbm5lbDsKKyAgcGhhbENvbmZpZ0JTUy0+YWN0aW9uICAgICAgICAgICAgID0gcHdkaUNvbmZpZ0JTUy0+d2RpQWN0aW9uOworICBwaGFsQ29uZmlnQlNTLT5odENhcGFibGUgICAgICAgICAgPSBwd2RpQ29uZmlnQlNTLT51Y0hUQ2FwYWJsZTsKKyAgcGhhbENvbmZpZ0JTUy0+b2Jzc1Byb3RFbmFibGVkICAgID0gcHdkaUNvbmZpZ0JTUy0+dWNPYnNzUHJvdEVuYWJsZWQ7CisgIHBoYWxDb25maWdCU1MtPnJtZkVuYWJsZWQgICAgICAgICA9IHB3ZGlDb25maWdCU1MtPnVjUk1GRW5hYmxlZDsKKworICBwaGFsQ29uZmlnQlNTLT5odE9wZXJNb2RlID0gCisgICAgV0RJXzJfSEFMX0hUX09QRVJfTU9ERShwd2RpQ29uZmlnQlNTLT53ZGlIVE9wZXJNb2QpOyAKKworICBwaGFsQ29uZmlnQlNTLT5kdWFsQ1RTUHJvdGVjdGlvbiAgICAgICAgPSBwd2RpQ29uZmlnQlNTLT51Y0R1YWxDVFNQcm90ZWN0aW9uOworICBwaGFsQ29uZmlnQlNTLT51Y01heFByb2JlUmVzcFJldHJ5TGltaXQgPSBwd2RpQ29uZmlnQlNTLT51Y01heFByb2JlUmVzcFJldHJ5TGltaXQ7CisgIHBoYWxDb25maWdCU1MtPmJIaWRkZW5TU0lERW4gICAgICAgICAgICA9IHB3ZGlDb25maWdCU1MtPmJIaWRkZW5TU0lERW47CisgIHBoYWxDb25maWdCU1MtPmJQcm94eVByb2JlUmVzcEVuICAgICAgICA9IHB3ZGlDb25maWdCU1MtPmJQcm94eVByb2JlUmVzcEVuOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSQorICBwaGFsQ29uZmlnQlNTLT5tYXhUeFBvd2VyICAgICAgICAgICAgICAgPSBwd2RpQ29uZmlnQlNTLT5jTWF4VHhQb3dlcjsKKyNlbmRpZgorCisgIC8qISBVc2VkIDMyIGFzIG1hZ2ljIG51bWJlciBiZWNhdXNlIHRoYXQgaXMgaG93IHRoZSBzc2lkIGlzIGRlY2xhcmVkIGluc2lkZSB0aGUKKyAgIGhhbCBoZWFkZXIgLSBoYWwgbmVlZHMgYSBtYWNybyBmb3IgaXQgKi8KKyAgcGhhbENvbmZpZ0JTUy0+c3NJZC5sZW5ndGggPSAKKyAgICAocHdkaUNvbmZpZ0JTUy0+d2RpU1NJRC51Y0xlbmd0aCA8PSAzMik/CisgICAgcHdkaUNvbmZpZ0JTUy0+d2RpU1NJRC51Y0xlbmd0aCA6IDMyOworICB3cGFsTWVtb3J5Q29weShwaGFsQ29uZmlnQlNTLT5zc0lkLnNzSWQsCisgICAgICAgICAgICAgICAgIHB3ZGlDb25maWdCU1MtPndkaVNTSUQuc1NTSUQsIAorICAgICAgICAgICAgICAgICBwaGFsQ29uZmlnQlNTLT5zc0lkLmxlbmd0aCk7IAorCisgIFdESV9Db3B5V0RJU3RhQ3R4VG9IQUxTdGFDdHgoICZwaGFsQ29uZmlnQlNTLT5zdGFDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHdkaUNvbmZpZ0JTUy0+d2RpU1RBQ29udGV4dCk7CisgIAorICBXRElfQ29weVdESVJhdGVTZXRUb0hBTFJhdGVTZXQoICZwaGFsQ29uZmlnQlNTLT5yYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwd2RpQ29uZmlnQlNTLT53ZGlSYXRlU2V0KTsKKworICBwaGFsQ29uZmlnQlNTLT5lZGNhUGFyYW1zVmFsaWQgPSBwd2RpQ29uZmlnQlNTLT51Y0VEQ0FQYXJhbXNWYWxpZDsKKworICBpZihwaGFsQ29uZmlnQlNTLT5lZGNhUGFyYW1zVmFsaWQpCisgIHsKKyAgICAgV0RJX0NvcHlXRElFRENBUGFyYW1zVG9IQUxFRENBUGFyYW1zKCAmcGhhbENvbmZpZ0JTUy0+YWNiZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHdkaUNvbmZpZ0JTUy0+d2RpQkVFRENBUGFyYW1zKTsKKyAgICAgV0RJX0NvcHlXRElFRENBUGFyYW1zVG9IQUxFRENBUGFyYW1zKCAmcGhhbENvbmZpZ0JTUy0+YWNiaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHdkaUNvbmZpZ0JTUy0+d2RpQktFRENBUGFyYW1zKTsKKyAgICAgV0RJX0NvcHlXRElFRENBUGFyYW1zVG9IQUxFRENBUGFyYW1zKCAmcGhhbENvbmZpZ0JTUy0+YWN2aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHdkaUNvbmZpZ0JTUy0+d2RpVklFRENBUGFyYW1zKTsKKyAgICAgV0RJX0NvcHlXRElFRENBUGFyYW1zVG9IQUxFRENBUGFyYW1zKCAmcGhhbENvbmZpZ0JTUy0+YWN2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHdkaUNvbmZpZ0JTUy0+d2RpVk9FRENBUGFyYW1zKTsKKyAgfQorCisgIHBoYWxDb25maWdCU1MtPmhhbFBlcnNvbmEgPSBwd2RpQ29uZmlnQlNTLT51Y1BlcnNvbmE7IAorCisgIHBoYWxDb25maWdCU1MtPmJTcGVjdHJ1bU1ndEVuYWJsZSA9IHB3ZGlDb25maWdCU1MtPmJTcGVjdHJ1bU1ndEVuOworCisjaWZkZWYgV0xBTl9GRUFUVVJFX1ZPV0lGSV8xMVIKKworICBwaGFsQ29uZmlnQlNTLT5leHRTZXRTdGFLZXlQYXJhbVZhbGlkID0gCisgICAgIHB3ZGlDb25maWdCU1MtPmJFeHRTZXRTdGFLZXlQYXJhbVZhbGlkOworICAKKyAgaWYoIHBoYWxDb25maWdCU1MtPmV4dFNldFN0YUtleVBhcmFtVmFsaWQgKQorICB7CisgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBDb3B5IHRoZSBTVEEgS2V5IHBhcmFtZXRlcnMgaW50byB0aGUgSEFMIG1lc3NhZ2UKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICBwaGFsQ29uZmlnQlNTLT5leHRTZXRTdGFLZXlQYXJhbS5lbmNUeXBlID0gCisgICAgICAgIFdESV8yX0hBTF9FTkNfVFlQRSAocHdkaUNvbmZpZ0JTUy0+d2RpRXh0U2V0S2V5UGFyYW0ud2RpRW5jVHlwZSk7CisKKyAgICAgcGhhbENvbmZpZ0JTUy0+ZXh0U2V0U3RhS2V5UGFyYW0ud2VwVHlwZSA9IAorICAgICAgICBXRElfMl9IQUxfV0VQX1RZUEUgKHB3ZGlDb25maWdCU1MtPndkaUV4dFNldEtleVBhcmFtLndkaVdFUFR5cGUgKTsKKworICAgICBwaGFsQ29uZmlnQlNTLT5leHRTZXRTdGFLZXlQYXJhbS5zdGFJZHggPSBwd2RpQ29uZmlnQlNTLT53ZGlFeHRTZXRLZXlQYXJhbS51Y1NUQUlkeDsKKworICAgICBwaGFsQ29uZmlnQlNTLT5leHRTZXRTdGFLZXlQYXJhbS5kZWZXRVBJZHggPSBwd2RpQ29uZmlnQlNTLT53ZGlFeHRTZXRLZXlQYXJhbS51Y0RlZldFUElkeDsKKworICAgICBwaGFsQ29uZmlnQlNTLT5leHRTZXRTdGFLZXlQYXJhbS5zaW5nbGVUaWRSYyA9IHB3ZGlDb25maWdCU1MtPndkaUV4dFNldEtleVBhcmFtLnVjU2luZ2xlVGlkUmM7CisKKyNpZmRlZiBXTEFOX1NPRlRBUF9GRUFUVVJFCisgICAgIGZvcihrZXlJbmRleCA9IDA7IGtleUluZGV4IDwgcHdkaUNvbmZpZ0JTUy0+d2RpRXh0U2V0S2V5UGFyYW0udWNOdW1LZXlzIDsKKyAgICAgICAgICBrZXlJbmRleCsrKQorICAgICB7CisgICAgICAgIHBoYWxDb25maWdCU1MtPmV4dFNldFN0YUtleVBhcmFtLmtleVtrZXlJbmRleF0ua2V5SWQgPSAKKyAgICAgICAgICAgcHdkaUNvbmZpZ0JTUy0+d2RpRXh0U2V0S2V5UGFyYW0ud2RpS2V5W2tleUluZGV4XS5rZXlJZDsKKyAgICAgICAgcGhhbENvbmZpZ0JTUy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5W2tleUluZGV4XS51bmljYXN0ID0KKyAgICAgICAgICAgcHdkaUNvbmZpZ0JTUy0+d2RpRXh0U2V0S2V5UGFyYW0ud2RpS2V5W2tleUluZGV4XS51bmljYXN0OworICAgICAgICBwaGFsQ29uZmlnQlNTLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlba2V5SW5kZXhdLmtleURpcmVjdGlvbiA9CisgICAgICAgICAgIHB3ZGlDb25maWdCU1MtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVtrZXlJbmRleF0ua2V5RGlyZWN0aW9uOworICAgICAgICB3cGFsTWVtb3J5Q29weShwaGFsQ29uZmlnQlNTLT5leHRTZXRTdGFLZXlQYXJhbS5rZXlba2V5SW5kZXhdLmtleVJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgcHdkaUNvbmZpZ0JTUy0+d2RpRXh0U2V0S2V5UGFyYW0ud2RpS2V5W2tleUluZGV4XS5rZXlSc2MsIAorICAgICAgICAgICAgICAgICAgICAgICBXRElfTUFYX0tFWV9SU0NfTEVOKTsKKyAgICAgICAgcGhhbENvbmZpZ0JTUy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5W2tleUluZGV4XS5wYWVSb2xlID0gCisgICAgICAgICAgIHB3ZGlDb25maWdCU1MtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVtrZXlJbmRleF0ucGFlUm9sZTsKKyAgICAgICAgcGhhbENvbmZpZ0JTUy0+ZXh0U2V0U3RhS2V5UGFyYW0ua2V5W2tleUluZGV4XS5rZXlMZW5ndGggPSAKKyAgICAgICAgICAgcHdkaUNvbmZpZ0JTUy0+d2RpRXh0U2V0S2V5UGFyYW0ud2RpS2V5W2tleUluZGV4XS5rZXlMZW5ndGg7CisgICAgICAgIHdwYWxNZW1vcnlDb3B5KHBoYWxDb25maWdCU1MtPmV4dFNldFN0YUtleVBhcmFtLmtleVtrZXlJbmRleF0ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICBwd2RpQ29uZmlnQlNTLT53ZGlFeHRTZXRLZXlQYXJhbS53ZGlLZXlba2V5SW5kZXhdLmtleSwgCisgICAgICAgICAgICAgICAgICAgICAgIFdESV9NQVhfS0VZX0xFTkdUSCk7CisgICAgIH0KKyNlbHNlCisgICAgIHBoYWxDb25maWdCU1MtPmV4dFNldFN0YUtleVBhcmFtLmtleS5rZXlJZCA9IAorICAgICAgICBwd2RpQ29uZmlnQlNTLT53ZGlFeHRTZXRLZXlQYXJhbS53ZGlLZXlbMF0ua2V5SWQ7CisgICAgIHBoYWxDb25maWdCU1MtPmV4dFNldFN0YUtleVBhcmFtLmtleS51bmljYXN0ID0KKyAgICAgICAgcHdkaUNvbmZpZ0JTUy0+d2RpRXh0U2V0S2V5UGFyYW0ud2RpS2V5WzBdLnVuaWNhc3Q7CisgICAgIHBoYWxDb25maWdCU1MtPmV4dFNldFN0YUtleVBhcmFtLmtleS5rZXlEaXJlY3Rpb24gPQorICAgICAgICBwd2RpQ29uZmlnQlNTLT53ZGlFeHRTZXRLZXlQYXJhbS53ZGlLZXlbMF0ua2V5RGlyZWN0aW9uOworICAgICB3cGFsTWVtb3J5Q29weShwaGFsQ29uZmlnQlNTLT5leHRTZXRTdGFLZXlQYXJhbS5rZXkua2V5UnNjLAorICAgICAgICAgICAgICAgICAgICBwd2RpQ29uZmlnQlNTLT53ZGlFeHRTZXRLZXlQYXJhbS53ZGlLZXlbMF0ua2V5UnNjLCAKKyAgICAgICAgICAgICAgICAgICAgV0RJX01BWF9LRVlfUlNDX0xFTik7CisgICAgIHBoYWxDb25maWdCU1MtPmV4dFNldFN0YUtleVBhcmFtLmtleS5wYWVSb2xlID0gCisgICAgICAgIHB3ZGlDb25maWdCU1MtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVswXS5wYWVSb2xlOworICAgICBwaGFsQ29uZmlnQlNTLT5leHRTZXRTdGFLZXlQYXJhbS5rZXkua2V5TGVuZ3RoID0gCisgICAgICAgIHB3ZGlDb25maWdCU1MtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVswXS5rZXlMZW5ndGg7CisgICAgIHdwYWxNZW1vcnlDb3B5KHBoYWxDb25maWdCU1MtPmV4dFNldFN0YUtleVBhcmFtLmtleS5rZXksCisgICAgICAgICAgICAgICAgICAgIHB3ZGlDb25maWdCU1MtPndkaUV4dFNldEtleVBhcmFtLndkaUtleVswXS5rZXksIAorICAgICAgICAgICAgICAgICAgICBXRElfTUFYX0tFWV9MRU5HVEgpOworI2VuZGlmCisgIH0KKyAgZWxzZS8qIHBoYWxDb25maWdCU1MtPmV4dFNldFN0YUtleVBhcmFtVmFsaWQgaXMgbm90IHNldCAqLworICB7CisgICAgIHdwYWxNZW1vcnlaZXJvKCAmcGhhbENvbmZpZ0JTUy0+ZXh0U2V0U3RhS2V5UGFyYW0sIAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBoYWxDb25maWdCU1MtPmV4dFNldFN0YUtleVBhcmFtKSApOworICB9CisKKyNlbmRpZiAvKldMQU5fRkVBVFVSRV9WT1dJRklfMTFSKi8KKworfS8qV0RJX0NvcHlXRElDb25maWdCU1NUb0hBTENvbmZpZ0JTUyovCisKKworLypFeHRyYWN0IHRoZSByZXF1ZXN0IENCIGZ1bmN0aW9uIGFuZCB1c2VyIGRhdGEgZnJvbSBhIHJlcXVlc3Qgc3RydWN0dXJlIAorICBwb2ludGVkIHRvIGJ5IHVzZXIgZGF0YSAqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHZvaWQKK1dESV9FeHRyYWN0UmVxdWVzdENCRnJvbUV2ZW50CisoCisgIFdESV9FdmVudEluZm9UeXBlKiBwRXZlbnQsCisgIFdESV9SZXFTdGF0dXNDYiogICBwcGZuUmVxQ0IsIAorICB2b2lkKiogICAgICAgICAgICAgcHBVc2VyRGF0YQorKQoreworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgIHN3aXRjaCAoIHBFdmVudC0+d2RpUmVxdWVzdCApCisgIHsKKyAgY2FzZSBXRElfU1RBUlRfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9TdGFydFJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9TdGFydFJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBXRElfU1RPUF9SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX1N0b3BSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfU3RvcFJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBXRElfSU5JVF9TQ0FOX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfSW5pdFNjYW5SZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfSW5pdFNjYW5SZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgV0RJX1NUQVJUX1NDQU5fUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9TdGFydFNjYW5SZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfU3RhcnRTY2FuUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgIGJyZWFrOworICBjYXNlIFdESV9FTkRfU0NBTl9SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX0VuZFNjYW5SZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfRW5kU2NhblJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBXRElfRklOSVNIX1NDQU5fUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9GaW5pc2hTY2FuUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX0ZpbmlzaFNjYW5SZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgV0RJX0pPSU5fUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9Kb2luUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX0pvaW5SZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgV0RJX0NPTkZJR19CU1NfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9Db25maWdCU1NSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfQ29uZmlnQlNTUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgIGJyZWFrOworICBjYXNlIFdESV9ERUxfQlNTX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfRGVsQlNTUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX0RlbEJTU1JlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBXRElfUE9TVF9BU1NPQ19SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX1Bvc3RBc3NvY1JlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9Qb3N0QXNzb2NSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgV0RJX0RFTF9TVEFfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9EZWxTVEFSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfRGVsU1RBUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgIGJyZWFrOworICBjYXNlIFdESV9ERUxfU1RBX1NFTEZfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9EZWxTVEFTZWxmUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX0RlbFNUQVNlbGZSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisKKyAgY2FzZSBXRElfU0VUX0JTU19LRVlfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9TZXRCU1NLZXlSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfU2V0QlNTS2V5UmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgIGJyZWFrOworICBjYXNlIFdESV9STVZfQlNTX0tFWV9SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX1JlbW92ZUJTU0tleVJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9SZW1vdmVCU1NLZXlSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgV0RJX1NFVF9TVEFfS0VZX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfU2V0U1RBS2V5UmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX1NldFNUQUtleVJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBXRElfUk1WX1NUQV9LRVlfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9SZW1vdmVTVEFLZXlSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfUmVtb3ZlU1RBS2V5UmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgIGJyZWFrOworICBjYXNlIFdESV9BRERfVFNfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9BZGRUU1JlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9BZGRUU1JlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBXRElfREVMX1RTX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfRGVsVFNSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfRGVsVFNSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgV0RJX1VQRF9FRENBX1BSTVNfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9VcGRhdGVFRENBUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX1VwZGF0ZUVEQ0FQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgV0RJX0FERF9CQV9TRVNTSU9OX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfQWRkQkFTZXNzaW9uUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX0FkZEJBU2Vzc2lvblJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBXRElfREVMX0JBX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfRGVsQkFSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfRGVsQkFSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisjaWZkZWYgRkVBVFVSRV9XTEFOX0NDWAorICAgY2FzZSBXRElfVFNNX1NUQVRTX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfVFNNU3RhdHNSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfVFNNU3RhdHNSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOworI2VuZGlmCisgIGNhc2UgV0RJX0NIX1NXSVRDSF9SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX1N3aXRjaENoUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX1N3aXRjaENoUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgIGJyZWFrOworICBjYXNlIFdESV9DT05GSUdfU1RBX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfQ29uZmlnU1RBUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX0NvbmZpZ1NUQVJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBXRElfU0VUX0xJTktfU1RfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9TZXRMaW5rUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX1NldExpbmtSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgV0RJX0dFVF9TVEFUU19SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX0dldFN0YXRzUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX0dldFN0YXRzUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgIGJyZWFrOworICBjYXNlIFdESV9VUERBVEVfQ0ZHX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfVXBkYXRlQ2ZnUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX1VwZGF0ZUNmZ1JlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBXRElfQUREX0JBX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfQWRkQkFSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfQWRkQkFSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgV0RJX1RSSUdHRVJfQkFfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9UcmlnZ2VyQkFSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfVHJpZ2dlckJBUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgIGJyZWFrOworICBjYXNlICBXRElfVVBEX0JDT05fUFJNU19SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX1VwZGF0ZUJlYWNvblBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9VcGRhdGVCZWFjb25QYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOworICBjYXNlICBXRElfU05EX0JDT05fUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9TZW5kQmVhY29uUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX1NlbmRCZWFjb25QYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOworICBjYXNlICBXRElfRU5URVJfQk1QU19SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX0VudGVyQm1wc1JlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9FbnRlckJtcHNSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOworICBjYXNlICBXRElfRVhJVF9CTVBTX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfRXhpdEJtcHNSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfRXhpdEJtcHNSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOworICBjYXNlICBXRElfRU5URVJfVUFQU0RfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9FbnRlclVhcHNkUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX0VudGVyVWFwc2RSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOworICBjYXNlICBXRElfVVBEQVRFX1VBUFNEX1BBUkFNX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfVXBkYXRlVWFwc2RSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfVXBkYXRlVWFwc2RSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOworICBjYXNlICBXRElfQ09ORklHVVJFX1JYUF9GSUxURVJfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9Db25maWd1cmVSeHBGaWx0ZXJSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfQ29uZmlndXJlUnhwRmlsdGVyUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgICBicmVhazsKKyAgY2FzZSAgV0RJX1NFVF9CRUFDT05fRklMVEVSX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfQmVhY29uRmlsdGVyUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX0JlYWNvbkZpbHRlclJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICAgYnJlYWs7CisgIGNhc2UgIFdESV9SRU1fQkVBQ09OX0ZJTFRFUl9SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX1JlbUJlYWNvbkZpbHRlclJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9SZW1CZWFjb25GaWx0ZXJSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOyAKKyAgY2FzZSAgV0RJX1NFVF9SU1NJX1RIUkVTSE9MRFNfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9TZXRSU1NJVGhyZXNob2xkc1JlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9TZXRSU1NJVGhyZXNob2xkc1JlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICAgYnJlYWs7CisgIGNhc2UgIFdESV9IT1NUX09GRkxPQURfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9Ib3N0T2ZmbG9hZFJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9Ib3N0T2ZmbG9hZFJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICAgYnJlYWs7CisgIGNhc2UgIFdESV9XT1dMX0FERF9CQ19QVFJOX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfV293bEFkZEJjUHRyblJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9Xb3dsQWRkQmNQdHJuUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgICBicmVhazsKKyAgY2FzZSAgV0RJX1dPV0xfREVMX0JDX1BUUk5fUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9Xb3dsRGVsQmNQdHJuUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX1dvd2xEZWxCY1B0cm5SZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOworICBjYXNlICBXRElfV09XTF9FTlRFUl9SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX1dvd2xFbnRlclJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9Xb3dsRW50ZXJSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOworICBjYXNlICBXRElfQ09ORklHVVJFX0FQUFNfQ1BVX1dBS0VVUF9TVEFURV9SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX0NvbmZpZ3VyZUFwcHNDcHVXYWtldXBTdGF0ZVJlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9Db25maWd1cmVBcHBzQ3B1V2FrZXVwU3RhdGVSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgIGJyZWFrOworICBjYXNlIFdESV9GTFVTSF9BQ19SRVE6CisgICAgKnBwZm5SZXFDQiAgID0gICgoV0RJX0ZsdXNoQWNSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfRmx1c2hBY1JlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPnBVc2VyRGF0YTsKKyAgICBicmVhazsKKyAgY2FzZSBXRElfQlRBTVBfRVZFTlRfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9CdEFtcEV2ZW50UGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+d2RpUmVxU3RhdHVzQ0I7CisgICAgKnBwVXNlckRhdGEgID0gICgoV0RJX0J0QW1wRXZlbnRQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT5wVXNlckRhdGE7CisgICAgYnJlYWs7CisgIGNhc2UgV0RJX0tFRVBfQUxJVkVfUkVROgorICAgICpwcGZuUmVxQ0IgICA9ICAoKFdESV9LZWVwQWxpdmVSZXFQYXJhbXNUeXBlKilwRXZlbnQtPnBFdmVudERhdGEpLT53ZGlSZXFTdGF0dXNDQjsKKyAgICAqcHBVc2VyRGF0YSAgPSAgKChXRElfS2VlcEFsaXZlUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICAgIGJyZWFrOworICBjYXNlIFdESV9TRVRfVFhfUEVSX1RSQUNLSU5HX1JFUToKKyAgICAqcHBmblJlcUNCICAgPSAgKChXRElfU2V0VHhQZXJUcmFja2luZ1JlcVBhcmFtc1R5cGUqKXBFdmVudC0+cEV2ZW50RGF0YSktPndkaVJlcVN0YXR1c0NCOworICAgICpwcFVzZXJEYXRhICA9ICAoKFdESV9TZXRUeFBlclRyYWNraW5nUmVxUGFyYW1zVHlwZSopcEV2ZW50LT5wRXZlbnREYXRhKS0+cFVzZXJEYXRhOworICBkZWZhdWx0OgorICAgICpwcGZuUmVxQ0IgICA9ICBOVUxMOworICAgICpwcFVzZXJEYXRhICA9ICBOVUxMOworICAgICAgYnJlYWs7IAorICB9Cit9LypXRElfRXh0cmFjdFJlcXVlc3RDQkZyb21FdmVudCovCisKKworLyoqCisgQGJyaWVmIFdESV9Jc0h3RnJhbWVUeFRyYW5zbGF0aW9uQ2FwYWJsZSBjaGVja3MgdG8gc2VlIGlmIEhXIAorICAgICAgICBmcmFtZSB4dGwgaXMgZW5hYmxlZCBmb3IgYSBwYXJ0aWN1bGFyIFNUQS4KKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHVTVEFJZHg6IFNUQSBpbmRleCAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCit3cHRfYm9vbGVhbiAKK1dESV9Jc0h3RnJhbWVUeFRyYW5zbGF0aW9uQ2FwYWJsZQorKAorICB3cHRfdWludDggdVNUQUlkeAorKQoreworICAvKiEhIEZJWCBNRSAtIHRoaXMgbXVzdCBldmVudHVhbGx5IGJlIHBlciBzdGF0aW9uIC0gZm9yIG5vdyBqdXN0IGZlZWRiYWNrIAorICAgIHVtYSB2YWx1ZSovCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU2FuaXR5IENoZWNrIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICB7CisgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgfQorCisgIAorICByZXR1cm4gZ1dESUNiLmJGcmFtZVRyYW5zRW5hYmxlZDsKK30vKldESV9Jc0h3RnJhbWVUeFRyYW5zbGF0aW9uQ2FwYWJsZSovCisKKyNpZmRlZiBGRUFUVVJFX1dMQU5fU0NBTl9QTk8KKy8qKgorIEBicmllZiBXRElfU2V0UHJlZmVycmVkTmV0d29ya0xpc3QKKworIEBwYXJhbSBwd2RpUE5PU2NhblJlcVBhcmFtczogdGhlIFNldCBQTk8gYXMgc3BlY2lmaWVkIAorICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlQTk9TY2FuQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlIHJlc3BvbnNlCisgICAgICAgIG9mIHRoZSBTZXQgUE5PIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICBkZXZpY2UKKyAgCisgICAgICAgIHBVc2VyRGF0YTogdXNlciBkYXRhIHdpbGwgYmUgcGFzc2VkIGJhY2sgd2l0aCB0aGUKKyAgICAgICAgY2FsbGJhY2sgCisgIAorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TZXRQcmVmZXJyZWROZXR3b3JrUmVxCisoCisgIFdESV9QTk9TY2FuUmVxUGFyYW1zVHlwZSogcHdkaVBOT1NjYW5SZXFQYXJhbXMsCisgIFdESV9QTk9TY2FuQ2IgICAgICAgICAgICAgd2RpUE5PU2NhbkNiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhID0ge3swfX07CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1NFVF9QUkVGX05FVFdPUktfUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlQTk9TY2FuUmVxUGFyYW1zOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlQTk9TY2FuUmVxUGFyYW1zKTsKKyAgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlQTk9TY2FuQ2I7IAorICAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKK30KKworCisvKioKKyBAYnJpZWYgV0RJX1NldFJzc2lGaWx0ZXJSZXEKKworIEBwYXJhbSBwd2RpUnNzaUZpbHRlclJlcVBhcmFtczogdGhlIFNldCBSU1NJIEZpbHRlciBhcyAKKyAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIERldmljZSBJbnRlcmZhY2UKKyAgCisgICAgICAgIHdkaVJzc2lGaWx0ZXJDYjogY2FsbGJhY2sgZm9yIHBhc3NpbmcgYmFjayB0aGUgcmVzcG9uc2UKKyAgICAgICAgb2YgdGhlIFNldCBSU1NJIEZpbHRlciBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU2V0UnNzaUZpbHRlclJlcQorKAorICBXRElfU2V0UnNzaUZpbHRlclJlcVBhcmFtc1R5cGUqIHB3ZGlSc3NpRmlsdGVyUmVxUGFyYW1zLAorICBXRElfUnNzaUZpbHRlckNiICAgICAgICAgICAgICAgIHdkaVJzc2lGaWx0ZXJDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhID0ge3swfX07CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX1NFVF9SU1NJX0ZJTFRFUl9SRVE7CisgICB3ZGlFdmVudERhdGEucEV2ZW50RGF0YSAgICAgID0gcHdkaVJzc2lGaWx0ZXJSZXFQYXJhbXM7IAorICAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVJzc2lGaWx0ZXJSZXFQYXJhbXMpOworICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVJzc2lGaWx0ZXJDYjsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfS8qV0RJX1NldFJzc2lGaWx0ZXJSZXEqLworCisvKioKKyBAYnJpZWYgV0RJX1VwZGF0ZVNjYW5QYXJhbXNSZXEKKworIEBwYXJhbSBwd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlOiB0aGUgVXBkYXRlIFNjYW4gUGFyYW1zIGFzIHNwZWNpZmllZCAKKyAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpVXBkYXRlU2NhblBhcmFtc0NiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZQorICAgICAgICBvZiB0aGUgU2V0IFBOTyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfVXBkYXRlU2NhblBhcmFtc1JlcQorKAorICBXRElfVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlKiBwd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlLAorICBXRElfVXBkYXRlU2NhblBhcmFtc0NiICAgICAgICB3ZGlVcGRhdGVTY2FuUGFyYW1zQ2IsCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGEgPSB7ezB9fTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfVVBEQVRFX1NDQU5fUEFSQU1TX1JFUTsKKyAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpVXBkYXRlU2NhblBhcmFtc0luZm9UeXBlOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlVcGRhdGVTY2FuUGFyYW1zSW5mb1R5cGUpOworICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaVVwZGF0ZVNjYW5QYXJhbXNDYjsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfQorCisvKioKKyBAYnJpZWYgSGVscGVyIGZ1bmN0aW9uIHRvIHBhY2sgU2V0IFByZWZlcnJlZCBOZXR3b3JrIExpc3QgCisgICAgICAgIFJlcXVlc3QgcGFyYW1ldGVycworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXM6ICAgICAgcG9pbnRlciB0byB0aGUgaW5mbyByZWNlaXZlZAorICAgICAgICAgZnJvbSB1cHBlciBsYXllcnMKKyAgICAgICAgIHBwU2VuZEJ1ZmZlciwgcFNpemUgLSBvdXQgcG9pbnRlcnMgb2YgdGhlIHBhY2tlZCBidWZmZXIKKyAgICAgICAgIGFuZCBpdHMgc2l6ZSAKKyAgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCisKK1dESV9TdGF0dXMKK1dESV9QYWNrUHJlZmVycmVkTmV0d29ya0xpc3QKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICAgICAgcFdESUN0eCwKKyAgV0RJX1BOT1NjYW5SZXFQYXJhbXNUeXBlKiAgcHdkaVBOT1NjYW5SZXFQYXJhbXMsCisgIHdwdF91aW50OCoqICAgICAgICAgICAgICAgIHBwU2VuZEJ1ZmZlciwKKyAgd3B0X3VpbnQxNiogICAgICAgICAgICAgICAgcFNpemUKKykKK3sKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgICA9IDA7CisgICB0UHJlZk5ldHdMaXN0UGFyYW1zICAgICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zID0gezB9OworICAgd3B0X3VpbnQ4IGk7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX1NFVF9QUkVGX05FVFdPUktfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocFByZWZOZXR3TGlzdFBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHBQcmVmTmV0d0xpc3RQYXJhbXMpICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBTZXQgUE5PIHJlcSAleCAiLAorICAgICAgICAgICAgICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRmlsbCBwcmVmTmV0d0xpc3RQYXJhbXMgZnJvbSBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcFByZWZOZXR3TGlzdFBhcmFtcy5lbmFibGUgID0gCisgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5iRW5hYmxlOworICAgcFByZWZOZXR3TGlzdFBhcmFtcy5tb2RlUE5PID0gCisgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby53ZGlNb2RlUE5POworCisgICBwUHJlZk5ldHdMaXN0UGFyYW1zLnVjTmV0d29ya3NDb3VudCA9IAorICAgICAocHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVjTmV0d29ya3NDb3VudCA8IAorICAgICAgV0xBTl9IQUxfUE5PX01BWF9TVVBQX05FVFdPUktTKT8KKyAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVjTmV0d29ya3NDb3VudCA6IAorICAgICAgV0xBTl9IQUxfUE5PX01BWF9TVVBQX05FVFdPUktTOworCisgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIldESSBTRVQgUE5POiBFbmFibGUgJWQsIE1vZGUgJWQsIE5ldHcgQ291bnQgJWQiLCAKKyAgICAgICAgICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5iRW5hYmxlLAorICAgICAgICAgICAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLndkaU1vZGVQTk8sCisgICAgICAgICAgICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8udWNOZXR3b3Jrc0NvdW50KTsKKworICAgZm9yICggaSA9IDA7IGkgPCBwUHJlZk5ldHdMaXN0UGFyYW1zLnVjTmV0d29ya3NDb3VudDsgaSsrICkKKyAgIHsKKyAgICAgLypTU0lEIG9mIHRoZSBCU1MqLworICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLmFOZXR3b3Jrc1tpXS5zc0lkLmxlbmd0aAorICAgICAgICA9IHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5hTmV0d29ya3NbaV0uc3NJZC51Y0xlbmd0aDsKKworICAgICB3cGFsTWVtb3J5Q29weSggcFByZWZOZXR3TGlzdFBhcmFtcy5hTmV0d29ya3NbaV0uc3NJZC5zc0lkLAorICAgICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5hTmV0d29ya3NbaV0uc3NJZC5zU1NJRCwKKyAgICAgICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLmFOZXR3b3Jrc1tpXS5zc0lkLmxlbmd0aCk7CisKKyAgICAgLypBdXRoZW50aWNhdGlvbiB0eXBlIGZvciB0aGUgbmV0d29yayovCisgICAgIHBQcmVmTmV0d0xpc3RQYXJhbXMuYU5ldHdvcmtzW2ldLmF1dGhlbnRpY2F0aW9uID0gCisgICAgICAgKHRBdXRoVHlwZSlwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uYU5ldHdvcmtzW2ldLndkaUF1dGg7IAorCisgICAgIC8qRW5jcnlwdGlvbiB0eXBlIGZvciB0aGUgbmV0d29yayovCisgICAgIHBQcmVmTmV0d0xpc3RQYXJhbXMuYU5ldHdvcmtzW2ldLmVuY3J5cHRpb24gPSAKKyAgICAgICAodEVkVHlwZSlwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uYU5ldHdvcmtzW2ldLndkaUVuY3J5cHRpb247IAorCisgICAgIC8qSW5kaWNhdGUgdGhlIGNoYW5uZWwgb24gd2hpY2ggdGhlIE5ldHdvcmsgY2FuIGJlIGZvdW5kIAorICAgICAgIDAgLSBpZiBhbGwgY2hhbm5lbHMgKi8KKyAgICAgcFByZWZOZXR3TGlzdFBhcmFtcy5hTmV0d29ya3NbaV0udWNDaGFubmVsQ291bnQgPSAKKyAgICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uYU5ldHdvcmtzW2ldLnVjQ2hhbm5lbENvdW50OworCisgICAgIHdwYWxNZW1vcnlDb3B5KHBQcmVmTmV0d0xpc3RQYXJhbXMuYU5ldHdvcmtzW2ldLmFDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLmFOZXR3b3Jrc1tpXS5hQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIHBQcmVmTmV0d0xpc3RQYXJhbXMuYU5ldHdvcmtzW2ldLnVjQ2hhbm5lbENvdW50KTsKKworICAgICAvKkluZGljYXRlcyB0aGUgUlNTSSB0aHJlc2hvbGQgZm9yIHRoZSBuZXR3b3JrIHRvIGJlIGNvbnNpZGVyZWQqLworICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLmFOZXR3b3Jrc1tpXS5yc3NpVGhyZXNob2xkID0KKyAgICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uYU5ldHdvcmtzW2ldLnJzc2lUaHJlc2hvbGQ7CisKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0RJIFNFVCBQTk86IFNTSUQgJWQgJXMiLCAKKyAgICAgICAgICAgICAgIHBQcmVmTmV0d0xpc3RQYXJhbXMuYU5ldHdvcmtzW2ldLnNzSWQubGVuZ3RoLAorICAgICAgICAgICAgICAgcFByZWZOZXR3TGlzdFBhcmFtcy5hTmV0d29ya3NbaV0uc3NJZC5zc0lkKTsKKyAgIH0KKworICAgcFByZWZOZXR3TGlzdFBhcmFtcy5zY2FuVGltZXJzLnVjU2NhblRpbWVyc0NvdW50ID0gCisgICAgIChwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudCA8IAorICAgICAgV0xBTl9IQUxfUE5PX01BWF9TQ0FOX1RJTUVSUyk/CisgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5zY2FuVGltZXJzLnVjU2NhblRpbWVyc0NvdW50IDoKKyAgICAgIFdMQU5fSEFMX1BOT19NQVhfU0NBTl9USU1FUlM7CisKKyAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESSBTRVQgUE5POiBTY2FuIHRpbWVycyBjb3VudCAlZCAyNEcgUCAlZCA1RyBQcm9iZSAlZCIsIAorICAgICAgICAgICAgICAgcFByZWZOZXR3TGlzdFBhcmFtcy5zY2FuVGltZXJzLnVjU2NhblRpbWVyc0NvdW50LAorICAgICAgICAgICAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVzMjRHUHJvYmVTaXplLAorICAgICAgICAgICAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVzNUdQcm9iZVNpemUpOworCisgICBmb3IgKCBpID0gMDsgaSA8IHBQcmVmTmV0d0xpc3RQYXJhbXMuc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudDsgaSsrICAgKQorICAgeworICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLnNjYW5UaW1lcnMuYVRpbWVyVmFsdWVzW2ldLnVUaW1lclZhbHVlICA9IAorICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5zY2FuVGltZXJzLmFUaW1lclZhbHVlc1tpXS51VGltZXJWYWx1ZTsKKyAgICAgcFByZWZOZXR3TGlzdFBhcmFtcy5zY2FuVGltZXJzLmFUaW1lclZhbHVlc1tpXS51VGltZXJSZXBlYXQgPSAKKyAgICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uc2NhblRpbWVycy5hVGltZXJWYWx1ZXNbaV0udVRpbWVyUmVwZWF0OworICAgfQorCisgICAvKkNvcHkgdGhlIHByb2JlIHRlbXBsYXRlKi8KKyAgIHBQcmVmTmV0d0xpc3RQYXJhbXMudXMyNEdQcm9iZVNpemUgPSAKKyAgICAgKHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby51czI0R1Byb2JlU2l6ZTwKKyAgICAgV0xBTl9IQUxfUE5PX01BWF9QUk9CRV9TSVpFKT8KKyAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVzMjRHUHJvYmVTaXplOgorICAgICBXTEFOX0hBTF9QTk9fTUFYX1BST0JFX1NJWkU7IAorCisgICB3cGFsTWVtb3J5Q29weShwUHJlZk5ldHdMaXN0UGFyYW1zLmEyNEdQcm9iZVRlbXBsYXRlLCAKKyAgICAgICAgICAgICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5hMjRHUHJvYmVUZW1wbGF0ZSwgCisgICAgICAgICAgICAgICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLnVzMjRHUHJvYmVTaXplKTsgCisKKyAgIHBQcmVmTmV0d0xpc3RQYXJhbXMudXM1R1Byb2JlU2l6ZSA9IAorICAgICAocHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVzNUdQcm9iZVNpemUgPAorICAgICBXTEFOX0hBTF9QTk9fTUFYX1BST0JFX1NJWkUpPworICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8udXM1R1Byb2JlU2l6ZToKKyAgICAgV0xBTl9IQUxfUE5PX01BWF9QUk9CRV9TSVpFOyAKKworICAgd3BhbE1lbW9yeUNvcHkocFByZWZOZXR3TGlzdFBhcmFtcy5hNUdQcm9iZVRlbXBsYXRlLCAKKyAgICAgICAgICAgICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5hNUdQcm9iZVRlbXBsYXRlLCAKKyAgICAgICAgICAgICAgICAgIHBQcmVmTmV0d0xpc3RQYXJhbXMudXM1R1Byb2JlU2l6ZSk7IAorCisgICAvKlBhY2sgdGhlIGJ1ZmZlciovCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAmcFByZWZOZXR3TGlzdFBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBQcmVmTmV0d0xpc3RQYXJhbXMpKTsgCisKKyAgIC8qU2V0IHRoZSBvdXRwdXQgdmFsdWVzKi8KKyAgICpwcFNlbmRCdWZmZXIgPSBwU2VuZEJ1ZmZlcjsKKyAgICpwU2l6ZSAgICAgICAgPSB1c1NlbmRTaXplOyAKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKK30vKldESV9QYWNrUHJlZmVycmVkTmV0d29ya0xpc3QqLworCisvKioKKyBAYnJpZWYgSGVscGVyIGZ1bmN0aW9uIHRvIHBhY2sgU2V0IFByZWZlcnJlZCBOZXR3b3JrIExpc3QgCisgICAgICAgIFJlcXVlc3QgcGFyYW1ldGVycworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXM6ICAgICAgcG9pbnRlciB0byB0aGUgaW5mbyByZWNlaXZlZAorICAgICAgICAgZnJvbSB1cHBlciBsYXllcnMKKyAgICAgICAgIHBwU2VuZEJ1ZmZlciwgcFNpemUgLSBvdXQgcG9pbnRlcnMgb2YgdGhlIHBhY2tlZCBidWZmZXIKKyAgICAgICAgIGFuZCBpdHMgc2l6ZSAKKyAgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCisKK1dESV9TdGF0dXMKK1dESV9QYWNrUHJlZmVycmVkTmV0d29ya0xpc3ROZXcKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICAgICAgcFdESUN0eCwKKyAgV0RJX1BOT1NjYW5SZXFQYXJhbXNUeXBlKiAgcHdkaVBOT1NjYW5SZXFQYXJhbXMsCisgIHdwdF91aW50OCoqICAgICAgICAgICAgICAgIHBwU2VuZEJ1ZmZlciwKKyAgd3B0X3VpbnQxNiogICAgICAgICAgICAgICAgcFNpemUKKykKK3sKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgICA9IDA7CisgICB0UHJlZk5ldHdMaXN0UGFyYW1zTmV3ICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zOworICAgd3B0X3VpbnQ4IGk7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX1NFVF9QUkVGX05FVFdPUktfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocFByZWZOZXR3TGlzdFBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHBQcmVmTmV0d0xpc3RQYXJhbXMpICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBTZXQgUE5PIHJlcSAleCAgIiwKKyAgICAgICAgICAgICAgICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgcHJlZk5ldHdMaXN0UGFyYW1zIGZyb20gcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHBQcmVmTmV0d0xpc3RQYXJhbXMuZW5hYmxlICA9IAorICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uYkVuYWJsZTsKKyAgIHBQcmVmTmV0d0xpc3RQYXJhbXMubW9kZVBOTyA9IAorICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8ud2RpTW9kZVBOTzsKKworICAgcFByZWZOZXR3TGlzdFBhcmFtcy51Y05ldHdvcmtzQ291bnQgPSAKKyAgICAgKHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby51Y05ldHdvcmtzQ291bnQgPCAKKyAgICAgIFdMQU5fSEFMX1BOT19NQVhfU1VQUF9ORVRXT1JLUyk/CisgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby51Y05ldHdvcmtzQ291bnQgOiAKKyAgICAgIFdMQU5fSEFMX1BOT19NQVhfU1VQUF9ORVRXT1JLUzsKKworICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICJXREkgU0VUIFBOTzogRW5hYmxlICVkLCBNb2RlICVkLCBOZXR3IENvdW50ICVkIiwgCisgICAgICAgICAgICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uYkVuYWJsZSwKKyAgICAgICAgICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby53ZGlNb2RlUE5PLAorICAgICAgICAgICAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVjTmV0d29ya3NDb3VudCk7CisKKyAgIGZvciAoIGkgPSAwOyBpIDwgcFByZWZOZXR3TGlzdFBhcmFtcy51Y05ldHdvcmtzQ291bnQ7IGkrKyApCisgICB7CisgICAgIC8qU1NJRCBvZiB0aGUgQlNTKi8KKyAgICAgcFByZWZOZXR3TGlzdFBhcmFtcy5hTmV0d29ya3NbaV0uc3NJZC5sZW5ndGgKKyAgICAgICAgPSBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uYU5ldHdvcmtzW2ldLnNzSWQudWNMZW5ndGg7CisKKyAgICAgd3BhbE1lbW9yeUNvcHkoIHBQcmVmTmV0d0xpc3RQYXJhbXMuYU5ldHdvcmtzW2ldLnNzSWQuc3NJZCwKKyAgICAgICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uYU5ldHdvcmtzW2ldLnNzSWQuc1NTSUQsCisgICAgICAgICAgcFByZWZOZXR3TGlzdFBhcmFtcy5hTmV0d29ya3NbaV0uc3NJZC5sZW5ndGgpOworCisgICAgIC8qQXV0aGVudGljYXRpb24gdHlwZSBmb3IgdGhlIG5ldHdvcmsqLworICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLmFOZXR3b3Jrc1tpXS5hdXRoZW50aWNhdGlvbiA9IAorICAgICAgICh0QXV0aFR5cGUpcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLmFOZXR3b3Jrc1tpXS53ZGlBdXRoOyAKKworICAgICAvKkVuY3J5cHRpb24gdHlwZSBmb3IgdGhlIG5ldHdvcmsqLworICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLmFOZXR3b3Jrc1tpXS5lbmNyeXB0aW9uID0gCisgICAgICAgKHRFZFR5cGUpcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLmFOZXR3b3Jrc1tpXS53ZGlFbmNyeXB0aW9uOyAKKworICAgICAvKlNTSUQgYmNhc3QgdHlwZSBmb3IgdGhlIG5ldHdvcmsqLworICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLmFOZXR3b3Jrc1tpXS5iY2FzdE5ldHdvcmtUeXBlID0gCisgICAgICAgKHRTU0lEQmNhc3RUeXBlKXB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5hTmV0d29ya3NbaV0ud2RpQmNhc3ROZXR3b3JrVHlwZTsgCisKKyAgICAgLypJbmRpY2F0ZSB0aGUgY2hhbm5lbCBvbiB3aGljaCB0aGUgTmV0d29yayBjYW4gYmUgZm91bmQgCisgICAgICAgMCAtIGlmIGFsbCBjaGFubmVscyAqLworICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLmFOZXR3b3Jrc1tpXS51Y0NoYW5uZWxDb3VudCA9IAorICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5hTmV0d29ya3NbaV0udWNDaGFubmVsQ291bnQ7CisKKyAgICAgd3BhbE1lbW9yeUNvcHkocFByZWZOZXR3TGlzdFBhcmFtcy5hTmV0d29ya3NbaV0uYUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uYU5ldHdvcmtzW2ldLmFDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgcFByZWZOZXR3TGlzdFBhcmFtcy5hTmV0d29ya3NbaV0udWNDaGFubmVsQ291bnQpOworCisgICAgIC8qSW5kaWNhdGVzIHRoZSBSU1NJIHRocmVzaG9sZCBmb3IgdGhlIG5ldHdvcmsgdG8gYmUgY29uc2lkZXJlZCovCisgICAgIHBQcmVmTmV0d0xpc3RQYXJhbXMuYU5ldHdvcmtzW2ldLnJzc2lUaHJlc2hvbGQgPQorICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5hTmV0d29ya3NbaV0ucnNzaVRocmVzaG9sZDsKKworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIldESSBTRVQgUE5POiBTU0lEICVkICVzIiwgCisgICAgICAgICAgICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLmFOZXR3b3Jrc1tpXS5zc0lkLmxlbmd0aCwKKyAgICAgICAgICAgICAgIHBQcmVmTmV0d0xpc3RQYXJhbXMuYU5ldHdvcmtzW2ldLnNzSWQuc3NJZCk7CisgICB9CisKKyAgIHBQcmVmTmV0d0xpc3RQYXJhbXMuc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudCA9IAorICAgICAocHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnNjYW5UaW1lcnMudWNTY2FuVGltZXJzQ291bnQgPCAKKyAgICAgIFdMQU5fSEFMX1BOT19NQVhfU0NBTl9USU1FUlMpPworICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudCA6CisgICAgICBXTEFOX0hBTF9QTk9fTUFYX1NDQU5fVElNRVJTOworCisgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIldESSBTRVQgUE5POiBTY2FuIHRpbWVycyBjb3VudCAlZCAyNEcgUCAlZCA1RyBQcm9iZSAlZCIsIAorICAgICAgICAgICAgICAgcFByZWZOZXR3TGlzdFBhcmFtcy5zY2FuVGltZXJzLnVjU2NhblRpbWVyc0NvdW50LAorICAgICAgICAgICAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVzMjRHUHJvYmVTaXplLAorICAgICAgICAgICAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVzNUdQcm9iZVNpemUpOworCisgICBmb3IgKCBpID0gMDsgaSA8IHBQcmVmTmV0d0xpc3RQYXJhbXMuc2NhblRpbWVycy51Y1NjYW5UaW1lcnNDb3VudDsgaSsrICAgKQorICAgeworICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLnNjYW5UaW1lcnMuYVRpbWVyVmFsdWVzW2ldLnVUaW1lclZhbHVlICA9IAorICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5zY2FuVGltZXJzLmFUaW1lclZhbHVlc1tpXS51VGltZXJWYWx1ZTsKKyAgICAgcFByZWZOZXR3TGlzdFBhcmFtcy5zY2FuVGltZXJzLmFUaW1lclZhbHVlc1tpXS51VGltZXJSZXBlYXQgPSAKKyAgICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8uc2NhblRpbWVycy5hVGltZXJWYWx1ZXNbaV0udVRpbWVyUmVwZWF0OworICAgfQorCisgICAvKkNvcHkgdGhlIHByb2JlIHRlbXBsYXRlKi8KKyAgIHBQcmVmTmV0d0xpc3RQYXJhbXMudXMyNEdQcm9iZVNpemUgPSAKKyAgICAgKHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby51czI0R1Byb2JlU2l6ZTwKKyAgICAgV0xBTl9IQUxfUE5PX01BWF9QUk9CRV9TSVpFKT8KKyAgICAgcHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVzMjRHUHJvYmVTaXplOgorICAgICBXTEFOX0hBTF9QTk9fTUFYX1BST0JFX1NJWkU7IAorCisgICB3cGFsTWVtb3J5Q29weShwUHJlZk5ldHdMaXN0UGFyYW1zLmEyNEdQcm9iZVRlbXBsYXRlLCAKKyAgICAgICAgICAgICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5hMjRHUHJvYmVUZW1wbGF0ZSwgCisgICAgICAgICAgICAgICAgICBwUHJlZk5ldHdMaXN0UGFyYW1zLnVzMjRHUHJvYmVTaXplKTsgCisKKyAgIHBQcmVmTmV0d0xpc3RQYXJhbXMudXM1R1Byb2JlU2l6ZSA9IAorICAgICAocHdkaVBOT1NjYW5SZXFQYXJhbXMtPndkaVBOT1NjYW5JbmZvLnVzNUdQcm9iZVNpemUgPAorICAgICBXTEFOX0hBTF9QTk9fTUFYX1BST0JFX1NJWkUpPworICAgICBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUE5PU2NhbkluZm8udXM1R1Byb2JlU2l6ZToKKyAgICAgV0xBTl9IQUxfUE5PX01BWF9QUk9CRV9TSVpFOyAKKworICAgd3BhbE1lbW9yeUNvcHkocFByZWZOZXR3TGlzdFBhcmFtcy5hNUdQcm9iZVRlbXBsYXRlLCAKKyAgICAgICAgICAgICAgICAgIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLT53ZGlQTk9TY2FuSW5mby5hNUdQcm9iZVRlbXBsYXRlLCAKKyAgICAgICAgICAgICAgICAgIHBQcmVmTmV0d0xpc3RQYXJhbXMudXM1R1Byb2JlU2l6ZSk7IAorCisgICAvKlBhY2sgdGhlIGJ1ZmZlciovCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAmcFByZWZOZXR3TGlzdFBhcmFtcywgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBQcmVmTmV0d0xpc3RQYXJhbXMpKTsgCisKKyAgIC8qU2V0IHRoZSBvdXRwdXQgdmFsdWVzKi8KKyAgICpwcFNlbmRCdWZmZXIgPSBwU2VuZEJ1ZmZlcjsKKyAgICpwU2l6ZSAgICAgICAgPSB1c1NlbmRTaXplOyAKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKK30vKldESV9QYWNrUHJlZmVycmVkTmV0d29ya0xpc3ROZXcqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgUHJlZmVycmVkIE5ldHdvcmsgTGlzdCBSZXF1ZXN0IGZ1bmN0aW9uCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFByZWZlcnJlZE5ldHdvcmtSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfUE5PU2NhblJlcVBhcmFtc1R5cGUqICBwd2RpUE5PU2NhblJlcVBhcmFtcyAgPSBOVUxMOworICAgV0RJX1BOT1NjYW5DYiAgICAgICAgICAgICAgd2RpUE5PU2NhbkNiICAgICAgICAgID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICAgID0gMDsKKyAgIFdESV9TdGF0dXMgICAgICAgICAgICAgICAgIHdkaVN0YXR1czsgCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IChwd2RpUE5PU2NhblJlcVBhcmFtcyA9IChXRElfUE5PU2NhblJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGEpKSB8fAorICAgICAgICggTlVMTCA9PSAod2RpUE5PU2NhbkNiICAgPSAoV0RJX1BOT1NjYW5DYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFBhY2sgdGhlIFBOTyByZXF1ZXN0IHN0cnVjdHVyZSBiYXNlZCBvbiB2ZXJzaW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggcFdESUN0eC0+d2RpUE5PVmVyc2lvbiA+IDAgKQorICAgeworICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAgIiVzOiBQTk8gbmV3IHZlcnNpb24gJWQgIiwgX19GVU5DVElPTl9fLCAKKyAgICAgICAgICAgICAgICAgIHBXRElDdHgtPndkaVBOT1ZlcnNpb24pOworCisgICAgIHdkaVN0YXR1cyA9IFdESV9QYWNrUHJlZmVycmVkTmV0d29ya0xpc3ROZXcoIHBXRElDdHgsIHB3ZGlQTk9TY2FuUmVxUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c1NlbmRTaXplKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgICIlczogUE5PIG9sZCB2ZXJzaW9uICVkICIsIF9fRlVOQ1RJT05fXywgCisgICAgICAgICAgICAgICAgICBwV0RJQ3R4LT53ZGlQTk9WZXJzaW9uKTsKKworICAgICB3ZGlTdGF0dXMgPSBXRElfUGFja1ByZWZlcnJlZE5ldHdvcmtMaXN0KCBwV0RJQ3R4LCBwd2RpUE5PU2NhblJlcVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNTZW5kU2l6ZSk7CisgICB9CisKKyAgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSB3ZGlTdGF0dXMgKXx8CisgICAgICAgKCBOVUxMID09IHBTZW5kQnVmZmVyICl8fCggMCA9PSB1c1NlbmRTaXplICkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBmYWlsZWQgdG8gcGFjayByZXF1ZXN0IHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiB3ZGlTdGF0dXM7IAorICAgfQorCisgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpUE5PU2NhblJlcVBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpUE5PU2NhblJlcVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgd2RpUE5PU2NhbkNiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9TRVRfUFJFRl9ORVRXT1JLX1JFU1ApOyAKK30KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IFJTU0kgRmlsdGVyIFJlcXVlc3QgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFJzc2lGaWx0ZXJSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfU2V0UnNzaUZpbHRlclJlcVBhcmFtc1R5cGUqIHB3ZGlSc3NpRmlsdGVyUmVxUGFyYW1zID0gTlVMTDsKKyAgIFdESV9Sc3NpRmlsdGVyQ2IgICAgICAgICAgICAgICAgd2RpUnNzaUZpbHRlckNiICAgICAgICAgPSBOVUxMOworICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgICAgICA9IDA7CisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgICAgID0gMDsKKyAgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgICAgdWNSc3NpVGhyZXNob2xkOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSAocHdkaVJzc2lGaWx0ZXJSZXFQYXJhbXMgPSAoV0RJX1NldFJzc2lGaWx0ZXJSZXFQYXJhbXNUeXBlKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHdkaVJzc2lGaWx0ZXJDYiAgID0gKFdESV9Sc3NpRmlsdGVyQ2IpcEV2ZW50RGF0YS0+cENCZm5jKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9TRVRfUFJFRl9ORVRXT1JLX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVjUnNzaVRocmVzaG9sZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHVjUnNzaVRocmVzaG9sZCkgKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIFNldCBQTk8gcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlSc3NpRmlsdGVyUmVxUGFyYW1zLCB3ZGlSc3NpRmlsdGVyQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIHVjUnNzaVRocmVzaG9sZCA9IHB3ZGlSc3NpRmlsdGVyUmVxUGFyYW1zLT5yc3NpVGhyZXNob2xkOworCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAmdWNSc3NpVGhyZXNob2xkLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YodWNSc3NpVGhyZXNob2xkKSk7IAorCisgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpUnNzaUZpbHRlclJlcVBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpUnNzaUZpbHRlclJlcVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpUnNzaUZpbHRlckNiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsIFdESV9TRVRfUlNTSV9GSUxURVJfUkVTUCk7IAorfQorCisKKy8qKgorIEBicmllZiBQcm9jZXNzIFVwZGF0ZSBTY2FuIFBhcmFtcyBmdW5jdGlvbgorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzVXBkYXRlU2NhblBhcmFtc1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9VcGRhdGVTY2FuUGFyYW1zSW5mb1R5cGUqIHB3ZGlVcGRhdGVTY2FuUGFyYW1zICA9IE5VTEw7CisgICBXRElfVXBkYXRlU2NhblBhcmFtc0NiICAgICAgICB3ZGlVcGRhdGVTY2FuUGFyYW1zQ2IgPSBOVUxMOworICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgICAgPSAwOworICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICAgID0gMDsKKyAgIHRVcGRhdGVTY2FuUGFyYW1zICAgICAgICAgICAgIHVwZGF0ZVNjYW5QYXJhbXMgPSB7MH07CisKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHB3ZGlVcGRhdGVTY2FuUGFyYW1zID0gKFdESV9VcGRhdGVTY2FuUGFyYW1zSW5mb1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGEpKSB8fAorICAgICAgICggTlVMTCA9PSAod2RpVXBkYXRlU2NhblBhcmFtc0NiICAgPSAoV0RJX1VwZGF0ZVNjYW5QYXJhbXNDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiQmVnaW4gV0RJIFVwZGF0ZSBTY2FuIFBhcmFtZXRlcnMiKTsKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9VUERBVEVfU0NBTl9QQVJBTVNfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodXBkYXRlU2NhblBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgc2l6ZW9mKHVwZGF0ZVNjYW5QYXJhbXMpICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBVcGRhdGUgU2NhbiBQYXJhbXMgcmVxICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlVcGRhdGVTY2FuUGFyYW1zLCB3ZGlVcGRhdGVTY2FuUGFyYW1zQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8vCisgICAvLyBGaWxsIHVwZGF0ZVNjYW5QYXJhbXMgZnJvbSBwd2RpVXBkYXRlU2NhblBhcmFtcy0+d2RpVXBkYXRlU2NhblBhcmFtc0luZm8KKyAgIC8vCisKKyAgIHVwZGF0ZVNjYW5QYXJhbXMuYjExZEVuYWJsZWQgICAgPSBwd2RpVXBkYXRlU2NhblBhcmFtcy0+d2RpVXBkYXRlU2NhblBhcmFtc0luZm8uYjExZEVuYWJsZWQ7CisgICB1cGRhdGVTY2FuUGFyYW1zLmIxMWRSZXNvbHZlZCAgID0gcHdkaVVwZGF0ZVNjYW5QYXJhbXMtPndkaVVwZGF0ZVNjYW5QYXJhbXNJbmZvLmIxMWRSZXNvbHZlZDsKKyAgIHVwZGF0ZVNjYW5QYXJhbXMudWNDaGFubmVsQ291bnQgPSAKKyAgICAgKHB3ZGlVcGRhdGVTY2FuUGFyYW1zLT53ZGlVcGRhdGVTY2FuUGFyYW1zSW5mby51Y0NoYW5uZWxDb3VudCA8CisgICAgIFdMQU5fSEFMX1BOT19NQVhfTkVUV19DSEFOTkVMUyk/CisgICAgIHB3ZGlVcGRhdGVTY2FuUGFyYW1zLT53ZGlVcGRhdGVTY2FuUGFyYW1zSW5mby51Y0NoYW5uZWxDb3VudCA6CisgICAgIFdMQU5fSEFMX1BOT19NQVhfTkVUV19DSEFOTkVMUzsKKworICAgd3BhbE1lbW9yeUNvcHkoIHVwZGF0ZVNjYW5QYXJhbXMuYUNoYW5uZWxzLCAKKyAgICAgICAgICAgICAgICAgICBwd2RpVXBkYXRlU2NhblBhcmFtcy0+d2RpVXBkYXRlU2NhblBhcmFtc0luZm8uYUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNjYW5QYXJhbXMudWNDaGFubmVsQ291bnQpOworCisgICB1cGRhdGVTY2FuUGFyYW1zLnVzQWN0aXZlTWluQ2hUaW1lICA9IHB3ZGlVcGRhdGVTY2FuUGFyYW1zLT53ZGlVcGRhdGVTY2FuUGFyYW1zSW5mby51c0FjdGl2ZU1pbkNoVGltZTsKKyAgIHVwZGF0ZVNjYW5QYXJhbXMudXNBY3RpdmVNYXhDaFRpbWUgID0gcHdkaVVwZGF0ZVNjYW5QYXJhbXMtPndkaVVwZGF0ZVNjYW5QYXJhbXNJbmZvLnVzQWN0aXZlTWF4Q2hUaW1lOworICAgdXBkYXRlU2NhblBhcmFtcy51c1Bhc3NpdmVNaW5DaFRpbWUgPSBwd2RpVXBkYXRlU2NhblBhcmFtcy0+d2RpVXBkYXRlU2NhblBhcmFtc0luZm8udXNQYXNzaXZlTWluQ2hUaW1lOworICAgdXBkYXRlU2NhblBhcmFtcy51c1Bhc3NpdmVNYXhDaFRpbWUgPSBwd2RpVXBkYXRlU2NhblBhcmFtcy0+d2RpVXBkYXRlU2NhblBhcmFtc0luZm8udXNQYXNzaXZlTWF4Q2hUaW1lOworICAgdXBkYXRlU2NhblBhcmFtcy5jYlN0YXRlICAgICAgICAgICAgPSBwd2RpVXBkYXRlU2NhblBhcmFtcy0+d2RpVXBkYXRlU2NhblBhcmFtc0luZm8uY2JTdGF0ZTsKKworICAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgJnVwZGF0ZVNjYW5QYXJhbXMsIAorICAgICAgICAgICAgICAgICAgIHNpemVvZih1cGRhdGVTY2FuUGFyYW1zKSk7IAorCisgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpVXBkYXRlU2NhblBhcmFtcy0+d2RpUmVxU3RhdHVzQ0I7CisgICBwV0RJQ3R4LT5wUmVxU3RhdHVzVXNlckRhdGEgPSBwd2RpVXBkYXRlU2NhblBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAiRW5kIFVwZGF0ZSBTY2FuIFBhcmFtZXRlcnMiKTsKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaVVwZGF0ZVNjYW5QYXJhbXNDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfVVBEQVRFX1NDQU5fUEFSQU1TX1JFU1ApOyAKK30KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgUHJlZmVycmVkIE5ldHdvcmsgRm91bmQgSW5kaWNhdGlvbiBmdW5jdGlvbgorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzUHJlZk5ldHdvcmtGb3VuZEluZAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgV0RJX0xvd0xldmVsSW5kVHlwZSAgd2RpSW5kOworICB0UHJlZk5ldHdGb3VuZEluZCAgICBwcmVmTmV0d0ZvdW5kSW5kID0ge3swfX07CisKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCggMCApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBpbmRpY2F0aW9uIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAodm9pZCAqKSZwcmVmTmV0d0ZvdW5kSW5kLnByZWZOZXR3Rm91bmRQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICBzaXplb2YodFByZWZOZXR3Rm91bmRQYXJhbXMpKTsKKworICAvKkZpbGwgaW4gdGhlIGluZGljYXRpb24gcGFyYW1ldGVycyovCisgIHdkaUluZC53ZGlJbmRpY2F0aW9uVHlwZSA9IFdESV9QUkVGX05FVFdPUktfRk9VTkRfSU5EOyAKKworICB3cGFsTWVtb3J5WmVybyh3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpUHJlZk5ldHdvcmtGb3VuZEluZC5zc0lkLnNTU0lELDMyKTsKKworICB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpUHJlZk5ldHdvcmtGb3VuZEluZC5zc0lkLnVjTGVuZ3RoID0gCisgICAgIChwcmVmTmV0d0ZvdW5kSW5kLnByZWZOZXR3Rm91bmRQYXJhbXMuc3NJZC5sZW5ndGggPCAzMSApPworICAgICAgcHJlZk5ldHdGb3VuZEluZC5wcmVmTmV0d0ZvdW5kUGFyYW1zLnNzSWQubGVuZ3RoIDogMzE7IAorCisgIHdwYWxNZW1vcnlDb3B5KCB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2RpUHJlZk5ldHdvcmtGb3VuZEluZC5zc0lkLnNTU0lELCAKKyAgICAgICAgICAgICAgICAgIHByZWZOZXR3Rm91bmRJbmQucHJlZk5ldHdGb3VuZFBhcmFtcy5zc0lkLnNzSWQsIAorICAgICAgICAgICAgICAgICAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaVByZWZOZXR3b3JrRm91bmRJbmQuc3NJZC51Y0xlbmd0aCk7CisKKyAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaVByZWZOZXR3b3JrRm91bmRJbmQucnNzaSA9CisgICAgIHByZWZOZXR3Rm91bmRJbmQucHJlZk5ldHdGb3VuZFBhcmFtcy5yc3NpOworCisgIC8vIERFQlVHCisgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgIltQTk8gV0RJXSBQUkVGX05FVFdPUktfRk9VTkRfSU5EIFR5cGUgKCV4KSBkYXRhIChTU0lEPSVzLCBSU1NJPSVkKSIsCisgICAgICAgICAgICAgIHdkaUluZC53ZGlJbmRpY2F0aW9uVHlwZSwKKyAgICAgICAgICAgICAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaVByZWZOZXR3b3JrRm91bmRJbmQuc3NJZC5zU1NJRCwKKyAgICAgICAgICAgICAgd2RpSW5kLndkaUluZGljYXRpb25EYXRhLndkaVByZWZOZXR3b3JrRm91bmRJbmQucnNzaSApOworCisgIC8qTm90aWZ5IFVNQUMqLworICBwV0RJQ3R4LT53ZGlMb3dMZXZlbEluZENCKCAmd2RpSW5kLCBwV0RJQ3R4LT5wSW5kVXNlckRhdGEgKTsKKyAgCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfQorCisvKioKKyBAYnJpZWYgUHJvY2VzcyBQTk8gUnNwIGZ1bmN0aW9uIChjYWxsZWQgd2hlbiBhCisgICAgICAgIHJlc3BvbnNlIGlzIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIGJ1cyBmcm9tIEhBTCkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFByZWZlcnJlZE5ldHdvcmtSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgICBXRElfUE5PU2NhbkNiICAgICAgIHdkaVBOT1NjYW5DYiAgID0gTlVMTDsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworCisgICB3ZGlQTk9TY2FuQ2IgPSAoV0RJX1BOT1NjYW5DYilwV0RJQ3R4LT5wZm5jUnNwQ0I7IAorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgICAvKk5vdGlmeSBVTUFDKi8KKyAgIHdkaVBOT1NjYW5DYih3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1NldFByZWZlcnJlZE5ldHdvcmtSc3AqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBSU1NJIEZpbHRlciBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0UnNzaUZpbHRlclJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgIFdESV9Sc3NpRmlsdGVyQ2IgICAgIHdkaVJzc2lGaWx0ZXJDYjsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgd2RpUnNzaUZpbHRlckNiID0gKFdESV9Sc3NpRmlsdGVyQ2IpcFdESUN0eC0+cGZuY1JzcENCOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAgLypOb3RpZnkgVU1BQyovCisgICB3ZGlSc3NpRmlsdGVyQ2Iod2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NTZXRSc3NpRmlsdGVyUnNwKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgVXBkYXRlIFNjYW4gUGFyYW1zIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYQorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NVcGRhdGVTY2FuUGFyYW1zUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1N0YXR1cyAgICAgICAgICAgICB3ZGlTdGF0dXM7CisgICB0VXBkYXRlU2NhblBhcmFtc1Jlc3AgIGhhbFVwZFNjYW5QYXJhbXM7IAorICAgV0RJX1VwZGF0ZVNjYW5QYXJhbXNDYiB3ZGlVcGRhdGVTY2FuUGFyYW1zQ2IgICA9IE5VTEw7CisgICB3cHRfdWludDMyICAgICAgICAgICAgIHVTdGF0dXM7IAorICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAiUHJvY2VzcyBVUEQgc2NhbiBwYXJhbXMgcHRyIDogJXgiLCBfX0ZVTkNUSU9OX18pOworCisgIHdkaVVwZGF0ZVNjYW5QYXJhbXNDYiA9IChXRElfVXBkYXRlU2NhblBhcmFtc0NiKXBXRElDdHgtPnBmbmNSc3BDQjsgCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHdwYWxNZW1vcnlDb3B5KCAodm9pZCAqKSZoYWxVcGRTY2FuUGFyYW1zLnN0YXR1cywgCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLT5wRXZlbnREYXRhLCAKKyAgICAgICAgICAgICAgICAgIHNpemVvZihoYWxVcGRTY2FuUGFyYW1zLnN0YXR1cykpOworCisgIHVTdGF0dXMgID0gaGFsVXBkU2NhblBhcmFtcy5zdGF0dXM7CisKKyAgLypFeHRyYWN0IFBOTyB2ZXJzaW9uIC0gMXN0IGJpdCBvZiB0aGUgc3RhdHVzICovCisgIHBXRElDdHgtPndkaVBOT1ZlcnNpb24gPSAodVN0YXR1cyAmIFdESV9QTk9fVkVSU0lPTl9NQVNLKT8gMTowOyAKKworICAvKlJlbW92ZSB2ZXJzaW9uIGJpdCovCisgIHVTdGF0dXMgPSB1U3RhdHVzICYgKCB+KFdESV9QTk9fVkVSU0lPTl9NQVNLKSk7IAorCisgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyh1U3RhdHVzKTsgCisKKyAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICJVUEQgU2NhbiBQYXJhbWV0ZXJzIHJzcCB3aXRoIHN0YXR1czogJWQiLCAKKyAgICAgICAgICAgICAgaGFsVXBkU2NhblBhcmFtcy5zdGF0dXMpOworCisgIC8qTm90aWZ5IFVNQUMqLworICB3ZGlVcGRhdGVTY2FuUGFyYW1zQ2Iod2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9CisjZW5kaWYgLy8gRkVBVFVSRV9XTEFOX1NDQU5fUE5PCisKKyNpZmRlZiBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworV0RJX1N0YXR1cyAKK1dESV84MDIzTXVsdGljYXN0TGlzdFJlcQorKAorICBXRElfUmN2Rmx0UGt0U2V0TWNMaXN0UmVxUGFyYW1zVHlwZSogIHB3ZGlSY3ZGbHRQa3RTZXRNY0xpc3RSZXFJbmZvLAorICBXRElfODAyM011bHRpY2FzdExpc3RDYiAgICAgICAgICAgICAgIHdkaTgwMjNNdWx0aWNhc3RMaXN0Q2FsbGJhY2ssCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJXzgwMjNfTVVMVElDQVNUX0xJU1RfUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlSY3ZGbHRQa3RTZXRNY0xpc3RSZXFJbmZvOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlSY3ZGbHRQa3RTZXRNY0xpc3RSZXFJbmZvKTsKKyAgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGk4MDIzTXVsdGljYXN0TGlzdENhbGxiYWNrOyAKKyAgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7Cit9CisKK1dESV9TdGF0dXMgCitXRElfUmVjZWl2ZUZpbHRlclNldEZpbHRlclJlcQorKAorICBXRElfU2V0UmN2UGt0RmlsdGVyUmVxUGFyYW1zVHlwZSogcHdkaVNldFJjdlBrdEZpbHRlclJlcUluZm8sCisgIFdESV9SZWNlaXZlRmlsdGVyU2V0RmlsdGVyQ2IgICAgICB3ZGlSZWNlaXZlRmlsdGVyU2V0RmlsdGVyQ2FsbGJhY2ssCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzIixfX0ZVTkNUSU9OX18pOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9SRUNFSVZFX0ZJTFRFUl9TRVRfRklMVEVSX1JFUTsKKyAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxSW5mbzsgCisgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpU2V0UmN2UGt0RmlsdGVyUmVxSW5mbykgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHdkaVNldFJjdlBrdEZpbHRlclJlcUluZm8tPndkaVBrdEZpbHRlckNmZy5udW1GaWVsZFBhcmFtcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihXRElfUmN2UGt0RmlsdGVyRmllbGRQYXJhbXMpIC0gMSk7CisgICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpUmVjZWl2ZUZpbHRlclNldEZpbHRlckNhbGxiYWNrOyAKKyAgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKworICAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKK30KKworV0RJX1N0YXR1cyAKK1dESV9GaWx0ZXJNYXRjaENvdW50UmVxCisoCisgIFdESV9SY3ZGbHRQa3RNYXRjaENudFJlcVBhcmFtc1R5cGUqIHB3ZGlSY3ZGbHRQa3RNYXRjaENudFJlcUluZm8sCisgIFdESV9GaWx0ZXJNYXRjaENvdW50Q2IgICAgICAgICAgICAgIHdkaUZpbHRlck1hdGNoQ291bnRDYWxsYmFjaywKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlcyIsX19GVU5DVElPTl9fKTsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JFUTsKKyAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpUmN2Rmx0UGt0TWF0Y2hDbnRSZXFJbmZvOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlSY3ZGbHRQa3RNYXRjaENudFJlcUluZm8pOworICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUZpbHRlck1hdGNoQ291bnRDYWxsYmFjazsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisKKyAgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7Cit9CisKK1dESV9TdGF0dXMgCitXRElfUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyUmVxCisoCisgIFdESV9SY3ZGbHRQa3RDbGVhclJlcVBhcmFtc1R5cGUqICBwd2RpUmN2Rmx0UGt0Q2xlYXJSZXFJbmZvLAorICBXRElfUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyQ2IgICAgd2RpUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyQ2FsbGJhY2ssCisgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzIixfX0ZVTkNUSU9OX18pOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9SRUNFSVZFX0ZJTFRFUl9DTEVBUl9GSUxURVJfUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlSY3ZGbHRQa3RDbGVhclJlcUluZm87IAorICAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVJjdkZsdFBrdENsZWFyUmVxSW5mbyk7CisgICB3ZGlFdmVudERhdGEucENCZm5jICAgICAgICAgID0gd2RpUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyQ2FsbGJhY2s7IAorICAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfQorCisvKioKKyBAYnJpZWYgUHJvY2VzcyA4MDIzIE11bHRpY2FzdCBMaXN0IFJlcXVlc3QgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2VzczgwMjNNdWx0aWNhc3RMaXN0UmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1JjdkZsdFBrdFNldE1jTGlzdFJlcVBhcmFtc1R5cGUqIHB3ZGlGbHRQa3RTZXRNY0xpc3RSZXFQYXJhbXNUeXBlICA9IE5VTEw7CisgICBXRElfODAyM011bHRpY2FzdExpc3RDYiAgICB3ZGk4MDIzTXVsdGljYXN0TGlzdENiID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgICA9IDA7CisgICB0SGFsUmN2Rmx0TWNBZGRyTGlzdFR5cGUgICByY3ZGbHRNY0FkZHJMaXN0VHlwZTsKKyAgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgIGk7CisKKyAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiJXMiLF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IChwd2RpRmx0UGt0U2V0TWNMaXN0UmVxUGFyYW1zVHlwZSA9IAorICAgICAgIChXRElfUmN2Rmx0UGt0U2V0TWNMaXN0UmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGk4MDIzTXVsdGljYXN0TGlzdENiID0gCisgICAgICAgKFdESV84MDIzTXVsdGljYXN0TGlzdENiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBXRElfODAyM19NVUxUSUNBU1RfTElTVF9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0SGFsUmN2Rmx0TWNBZGRyTGlzdFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHNpemVvZih0SGFsUmN2Rmx0TWNBZGRyTGlzdFR5cGUpKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluICIKKyAgICAgICAgICAgICAgICAgICJXRElfUHJvY2VzczgwMjNNdWx0aWNhc3RMaXN0UmVxKCkgJXggJXggJXgiLAorICAgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgcHdkaUZsdFBrdFNldE1jTGlzdFJlcVBhcmFtc1R5cGUsCisgICAgICAgICAgICAgICAgICB3ZGk4MDIzTXVsdGljYXN0TGlzdENiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICByY3ZGbHRNY0FkZHJMaXN0VHlwZS5jTXVsdGljYXN0QWRkciA9IAorICAgICAgIHB3ZGlGbHRQa3RTZXRNY0xpc3RSZXFQYXJhbXNUeXBlLT5tY0FkZHJMaXN0LnVsTXVsdGljYXN0QWRkckNudDsgCisgICBmb3IoIGkgPSAwOyBpIDwgcmN2Rmx0TWNBZGRyTGlzdFR5cGUuY011bHRpY2FzdEFkZHI7IGkrKyApCisgICB7CisgICAgICB3cGFsTWVtb3J5Q29weShyY3ZGbHRNY0FkZHJMaXN0VHlwZS5tdWx0aWNhc3RBZGRyW2ldLAorICAgICAgICAgICAgICAgICBwd2RpRmx0UGt0U2V0TWNMaXN0UmVxUGFyYW1zVHlwZS0+bWNBZGRyTGlzdC5tdWx0aWNhc3RBZGRyW2ldLAorICAgICAgICAgICAgICAgICBzaXplb2YodFNpck1hY0FkZHIpKTsKKyAgIH0KKworICAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgJnJjdkZsdE1jQWRkckxpc3RUeXBlLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YocmN2Rmx0TWNBZGRyTGlzdFR5cGUpKTsgCisKKyAgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlGbHRQa3RTZXRNY0xpc3RSZXFQYXJhbXNUeXBlLT53ZGlSZXFTdGF0dXNDQjsKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlGbHRQa3RTZXRNY0xpc3RSZXFQYXJhbXNUeXBlLT5wVXNlckRhdGE7IAorCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaTgwMjNNdWx0aWNhc3RMaXN0Q2IsIHBFdmVudERhdGEtPnBVc2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdESV84MDIzX01VTFRJQ0FTVF9MSVNUX1JFU1ApOyAKK30KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgUmVjZWl2ZSBGaWx0ZXIgU2V0IEZpbHRlciBSZXF1ZXN0IGZ1bmN0aW9uCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NSZWNlaXZlRmlsdGVyU2V0RmlsdGVyUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1NldFJjdlBrdEZpbHRlclJlcVBhcmFtc1R5cGUqIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFJbmZvICA9IE5VTEw7CisgICBXRElfUmVjZWl2ZUZpbHRlclNldEZpbHRlckNiICAgICAgd2RpUmVjZWl2ZUZpbHRlclNldEZpbHRlckNiID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgICA9IDA7CisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICB1c1JjdlBrdEZpbHRlckNmZ1NpemU7CisgICB0SGFsUmN2UGt0RmlsdGVyQ2ZnVHlwZSAgICAqcFJjdlBrdEZpbHRlckNmZzsKKyAgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgIGk7CisKKyAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiJXMiLF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IChwd2RpU2V0UmN2UGt0RmlsdGVyUmVxSW5mbyA9IAorICAgICAgIChXRElfU2V0UmN2UGt0RmlsdGVyUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlSZWNlaXZlRmlsdGVyU2V0RmlsdGVyQ2IgPSAKKyAgICAgICAoV0RJX1JlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgdXNSY3ZQa3RGaWx0ZXJDZmdTaXplID0gc2l6ZW9mKHRIYWxSY3ZQa3RGaWx0ZXJDZmdUeXBlKSArIAorICAgICAgICgocHdkaVNldFJjdlBrdEZpbHRlclJlcUluZm8tPndkaVBrdEZpbHRlckNmZy5udW1GaWVsZFBhcmFtcyAtIDEpCisgICAgICAgICogc2l6ZW9mKHRIYWxSY3ZQa3RGaWx0ZXJQYXJhbXMpKTsKKworICBwUmN2UGt0RmlsdGVyQ2ZnID0gKHRIYWxSY3ZQa3RGaWx0ZXJDZmdUeXBlICopd3BhbE1lbW9yeUFsbG9jYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzUmN2UGt0RmlsdGVyQ2ZnU2l6ZSk7CisKKyAgaWYoTlVMTCA9PSBwUmN2UGt0RmlsdGVyQ2ZnKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKyAgICAgICAgICAgICJ0SGFsUmN2UGt0RmlsdGVyQ2ZnVHlwZTogJXggJXggJXggIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcFdESUN0eCwgcEV2ZW50RGF0YSwgcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgICAgV0RJX0FTU0VSVCgwKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgd3BhbE1lbW9yeVplcm8ocFJjdlBrdEZpbHRlckNmZywgdXNSY3ZQa3RGaWx0ZXJDZmdTaXplKTsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX1JFQ0VJVkVfRklMVEVSX1NFVF9GSUxURVJfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c1JjdlBrdEZpbHRlckNmZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZW5kQnVmZmVyLCAmdXNEYXRhT2Zmc2V0LCAmdXNTZW5kU2l6ZSkpfHwKKyAgICAgICAoIHVzU2VuZFNpemUgPCAodXNEYXRhT2Zmc2V0ICsgdXNSY3ZQa3RGaWx0ZXJDZmdTaXplKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluICIKKyAgICAgICAgICAgICAgICAgICJXRElfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJSZXEoKSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxSW5mbywKKyAgICAgICAgICAgICAgICAgIHdkaVJlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJDYik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgd3BhbE1lbW9yeUZyZWUocFJjdlBrdEZpbHRlckNmZyk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICJVc0RhdGEgT2ZmICVkIFVzU2VuZCAlZCBjZmcgJWQiLHVzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgIHVzU2VuZFNpemUsdXNSY3ZQa3RGaWx0ZXJDZmdTaXplKTsKKworICAgcFJjdlBrdEZpbHRlckNmZy0+ZmlsdGVySWQgPSBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxSW5mby0+d2RpUGt0RmlsdGVyQ2ZnLmZpbHRlcklkOworICAgcFJjdlBrdEZpbHRlckNmZy0+ZmlsdGVyVHlwZSA9IHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFJbmZvLT53ZGlQa3RGaWx0ZXJDZmcuZmlsdGVyVHlwZTsgICAKKyAgIHBSY3ZQa3RGaWx0ZXJDZmctPm51bVBhcmFtcyA9IHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFJbmZvLT53ZGlQa3RGaWx0ZXJDZmcubnVtRmllbGRQYXJhbXM7CisgICBwUmN2UGt0RmlsdGVyQ2ZnLT5jb2xlYXNjZVRpbWUgPSBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxSW5mby0+d2RpUGt0RmlsdGVyQ2ZnLmNvYWxlc2NlVGltZTsKKworCisgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICJPdXQ6IEZJRCAlZCBGVCAlZCIscFJjdlBrdEZpbHRlckNmZy0+ZmlsdGVySWQsIAorICAgICAgICAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5maWx0ZXJUeXBlKTsKKyAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgIk5QYXJhbXMgJWQgQ1QgJWQiLHBSY3ZQa3RGaWx0ZXJDZmctPm51bVBhcmFtcywgCisgICAgICAgICAgICAgIHBSY3ZQa3RGaWx0ZXJDZmctPmNvbGVhc2NlVGltZSk7CisKKyAgIGZvciAoIGkgPSAwOyBpIDwgcFJjdlBrdEZpbHRlckNmZy0+bnVtUGFyYW1zOyBpKysgKQorICAgeworICAgICAgIHBSY3ZQa3RGaWx0ZXJDZmctPnBhcmFtc0RhdGFbaV0ucHJvdG9jb2xMYXllciA9IAorICAgICAgICAgICBwd2RpU2V0UmN2UGt0RmlsdGVyUmVxSW5mby0+d2RpUGt0RmlsdGVyQ2ZnLnBhcmFtc0RhdGFbaV0ucHJvdG9jb2xMYXllcjsKKyAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5wYXJhbXNEYXRhW2ldLmNtcEZsYWcgPSAKKyAgICAgICAgICAgcHdkaVNldFJjdlBrdEZpbHRlclJlcUluZm8tPndkaVBrdEZpbHRlckNmZy5wYXJhbXNEYXRhW2ldLmNtcEZsYWc7CisgICAgICAgcFJjdlBrdEZpbHRlckNmZy0+cGFyYW1zRGF0YVtpXS5kYXRhT2Zmc2V0ID0gCisgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFJbmZvLT53ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXS5kYXRhT2Zmc2V0OworICAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5wYXJhbXNEYXRhW2ldLmRhdGFMZW5ndGggPSAKKyAgICAgICAgICAgIHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFJbmZvLT53ZGlQa3RGaWx0ZXJDZmcucGFyYW1zRGF0YVtpXS5kYXRhTGVuZ3RoOworCisgICAgICAgd3BhbE1lbW9yeUNvcHkoJnBSY3ZQa3RGaWx0ZXJDZmctPnBhcmFtc0RhdGFbaV0uY29tcGFyZURhdGEsCisgICAgICAgICAgICAgICAgICAgICZwd2RpU2V0UmN2UGt0RmlsdGVyUmVxSW5mby0+d2RpUGt0RmlsdGVyQ2ZnLnBhcmFtc0RhdGFbaV0uY29tcGFyZURhdGEsCisgICAgICAgICAgICAgICAgICAgIDgpOworICAgICAgIHdwYWxNZW1vcnlDb3B5KCZwUmN2UGt0RmlsdGVyQ2ZnLT5wYXJhbXNEYXRhW2ldLmRhdGFNYXNrLAorICAgICAgICAgICAgICAgICAgICAmcHdkaVNldFJjdlBrdEZpbHRlclJlcUluZm8tPndkaVBrdEZpbHRlckNmZy5wYXJhbXNEYXRhW2ldLmRhdGFNYXNrLAorICAgICAgICAgICAgICAgICAgICA4KTsKKworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAiT3V0OlByb3RvICVkIENvbXAgRmxhZyAlZCBcbiIsCisgICAgICAgICAgIHBSY3ZQa3RGaWx0ZXJDZmctPnBhcmFtc0RhdGFbaV0ucHJvdG9jb2xMYXllciwgCisgICAgICAgICAgIHBSY3ZQa3RGaWx0ZXJDZmctPnBhcmFtc0RhdGFbaV0uY21wRmxhZyk7CisKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgIkRhdGEgT2Zmc2V0ICVkIERhdGEgTGVuICVkXG4iLAorICAgICAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5wYXJhbXNEYXRhW2ldLmRhdGFPZmZzZXQsIAorICAgICAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5wYXJhbXNEYXRhW2ldLmRhdGFMZW5ndGgpOworCisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICJDRGF0YTogJWQ6JWQ6JWQ6JWQ6JWQ6JWRcbiIsCisgICAgICAgICAgIHBSY3ZQa3RGaWx0ZXJDZmctPnBhcmFtc0RhdGFbaV0uY29tcGFyZURhdGFbMF0sIAorICAgICAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5wYXJhbXNEYXRhW2ldLmNvbXBhcmVEYXRhWzFdLCAKKyAgICAgICAgICAgcFJjdlBrdEZpbHRlckNmZy0+cGFyYW1zRGF0YVtpXS5jb21wYXJlRGF0YVsyXSwgCisgICAgICAgICAgIHBSY3ZQa3RGaWx0ZXJDZmctPnBhcmFtc0RhdGFbaV0uY29tcGFyZURhdGFbM10sCisgICAgICAgICAgIHBSY3ZQa3RGaWx0ZXJDZmctPnBhcmFtc0RhdGFbaV0uY29tcGFyZURhdGFbNF0sIAorICAgICAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5wYXJhbXNEYXRhW2ldLmNvbXBhcmVEYXRhWzVdKTsKKworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAiTURhdGE6ICVkOiVkOiVkOiVkOiVkOiVkXG4iLAorICAgICAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5wYXJhbXNEYXRhW2ldLmRhdGFNYXNrWzBdLCAKKyAgICAgICAgICAgcFJjdlBrdEZpbHRlckNmZy0+cGFyYW1zRGF0YVtpXS5kYXRhTWFza1sxXSwgCisgICAgICAgICAgIHBSY3ZQa3RGaWx0ZXJDZmctPnBhcmFtc0RhdGFbaV0uZGF0YU1hc2tbMl0sIAorICAgICAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5wYXJhbXNEYXRhW2ldLmRhdGFNYXNrWzNdLAorICAgICAgICAgICBwUmN2UGt0RmlsdGVyQ2ZnLT5wYXJhbXNEYXRhW2ldLmRhdGFNYXNrWzRdLCAKKyAgICAgICAgICAgcFJjdlBrdEZpbHRlckNmZy0+cGFyYW1zRGF0YVtpXS5kYXRhTWFza1s1XSk7CisgICB9CisKKyAgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgIHBSY3ZQa3RGaWx0ZXJDZmcsIAorICAgICAgICAgICAgICAgICAgIHVzUmN2UGt0RmlsdGVyQ2ZnU2l6ZSk7IAorCisKKyAgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFJbmZvLT53ZGlSZXFTdGF0dXNDQjsKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlTZXRSY3ZQa3RGaWx0ZXJSZXFJbmZvLT5wVXNlckRhdGE7IAorCisgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzIixfX0ZVTkNUSU9OX18pOworICAgd3BhbE1lbW9yeUZyZWUocFJjdlBrdEZpbHRlckNmZyk7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaVJlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgV0RJX1JFQ0VJVkVfRklMVEVSX1NFVF9GSUxURVJfUkVTUCk7IAorfQorCisvKioKKyBAYnJpZWYgUHJvY2VzcyBQYWNrZXQgRmlsdGVyIE1hdGNoIENvdW50IFJlcXVlc3QgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0ZpbHRlck1hdGNoQ291bnRSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfUmN2Rmx0UGt0TWF0Y2hDbnRSZXFQYXJhbXNUeXBlKiAgICBwd2RpUmN2Rmx0UGt0TWF0Y2hDbnRSZXFQYXJhbXNUeXBlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMOworICAgV0RJX0ZpbHRlck1hdGNoQ291bnRDYiAgICAgICAgICAgICAgICAgd2RpRmlsdGVyTWF0Y2hDb3VudENiICAgICAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNEYXRhT2Zmc2V0ICAgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzU2VuZFNpemUgICAgICAgICAgICA9IDA7CisKKyAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiJXMiLF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IChwd2RpUmN2Rmx0UGt0TWF0Y2hDbnRSZXFQYXJhbXNUeXBlID0gCisgICAgICAgKFdESV9SY3ZGbHRQa3RNYXRjaENudFJlcVBhcmFtc1R5cGUqKXBFdmVudERhdGEtPnBFdmVudERhdGEpKSB8fAorICAgICAgICggTlVMTCA9PSAod2RpRmlsdGVyTWF0Y2hDb3VudENiID0gCisgICAgICAgKFdESV9GaWx0ZXJNYXRjaENvdW50Q2IpcEV2ZW50RGF0YS0+cENCZm5jKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9QQUNLRVRfQ09BTEVTQ0lOR19GSUxURVJfTUFUQ0hfQ09VTlRfUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAgKCB1c1NlbmRTaXplIDwgdXNEYXRhT2Zmc2V0KSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gIgorICAgICAgICAgICAgICAgICAgIldESV9Qcm9jZXNzRmlsdGVyTWF0Y2hDb3VudFJlcSgpICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlSY3ZGbHRQa3RNYXRjaENudFJlcVBhcmFtc1R5cGUsCisgICAgICAgICAgICAgICAgICB3ZGlGaWx0ZXJNYXRjaENvdW50Q2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8vCisgICAvLyBEb24ndCBuZWVkIHRvIGZpbGwgc2VuZCBidWZmZXIgb3RoZXIgdGhhbiBoZWFkZXIKKyAgIC8vCisgICBwV0RJQ3R4LT53ZGlSZXFTdGF0dXNDQiAgICAgPSBwd2RpUmN2Rmx0UGt0TWF0Y2hDbnRSZXFQYXJhbXNUeXBlLT53ZGlSZXFTdGF0dXNDQjsKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlSY3ZGbHRQa3RNYXRjaENudFJlcVBhcmFtc1R5cGUtPnBVc2VyRGF0YTsgCisKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpRmlsdGVyTWF0Y2hDb3VudENiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICBXRElfUEFDS0VUX0NPQUxFU0NJTkdfRklMVEVSX01BVENIX0NPVU5UX1JFU1ApOyAKK30KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgUmVjZWl2ZSBGaWx0ZXIgQ2xlYXIgRmlsdGVyIFJlcXVlc3QgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlclJlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sgCisgICBXRElfUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlKiBwd2RpUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlID0gTlVMTDsKKyAgIFdESV9SZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJDYiAgIHdkaVJjdkZsdFBrdENsZWFyRmlsdGVyQ2IgICAgICAgPSBOVUxMOworICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgICAgPSAwOworICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICAgID0gMDsKKyAgIHRIYWxSY3ZGbHRQa3RDbGVhclBhcmFtICAgICAgICAgIHJjdkZsdFBrdENsZWFyUGFyYW07CisKKyAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAiJXMiLF9fRlVOQ1RJT05fXyk7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IChwd2RpUmN2Rmx0UGt0Q2xlYXJSZXFQYXJhbXNUeXBlID0KKyAgICAgICAoV0RJX1JjdkZsdFBrdENsZWFyUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlSY3ZGbHRQa3RDbGVhckZpbHRlckNiID0gCisgICAgICAgKFdESV9SZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJDYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXRElfUkVDRUlWRV9GSUxURVJfQ0xFQVJfRklMVEVSX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRIYWxSY3ZGbHRQa3RDbGVhclBhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YodEhhbFJjdkZsdFBrdENsZWFyUGFyYW0pKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluICIKKyAgICAgICAgICAgICAgICAgICJXRElfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlclJlcSgpICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlSY3ZGbHRQa3RDbGVhclJlcVBhcmFtc1R5cGUsCisgICAgICAgICAgICAgICAgICB3ZGlSY3ZGbHRQa3RDbGVhckZpbHRlckNiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisKKyAgIHJjdkZsdFBrdENsZWFyUGFyYW0uc3RhdHVzID0gcHdkaVJjdkZsdFBrdENsZWFyUmVxUGFyYW1zVHlwZS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ2xlYXJQYXJhbS5zdGF0dXM7IAorICAgcmN2Rmx0UGt0Q2xlYXJQYXJhbS5maWx0ZXJJZCA9IHB3ZGlSY3ZGbHRQa3RDbGVhclJlcVBhcmFtc1R5cGUtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckNsZWFyUGFyYW0uZmlsdGVySWQ7IAorCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAmcmN2Rmx0UGt0Q2xlYXJQYXJhbSwgCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJjdkZsdFBrdENsZWFyUGFyYW0pKTsgCisKKyAgIHBXRElDdHgtPndkaVJlcVN0YXR1c0NCICAgICA9IHB3ZGlSY3ZGbHRQa3RDbGVhclJlcVBhcmFtc1R5cGUtPndkaVJlcVN0YXR1c0NCOworICAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaVJjdkZsdFBrdENsZWFyUmVxUGFyYW1zVHlwZS0+cFVzZXJEYXRhOyAKKworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2VuZCBHZXQgU1RBIFJlcXVlc3QgdG8gSEFMIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICB3ZGlSY3ZGbHRQa3RDbGVhckZpbHRlckNiLCBwRXZlbnREYXRhLT5wVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBXRElfUkVDRUlWRV9GSUxURVJfQ0xFQVJfRklMVEVSX1JFU1ApOyAKK30KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgODAyMyBNdWx0aWNhc3QgTGlzdCBSZXNwb25zZSBmdW5jdGlvbgorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzODAyM011bHRpY2FzdExpc3RSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgICBXRElfODAyM011bHRpY2FzdExpc3RDYiB3ZGk4MDIzTXVsdGljYXN0TGlzdENiOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgIiVzIixfX0ZVTkNUSU9OX18pOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3ZGk4MDIzTXVsdGljYXN0TGlzdENiID0gKFdESV84MDIzTXVsdGljYXN0TGlzdENiKXBXRElDdHgtPnBmbmNSc3BDQjsgCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgIC8qTm90aWZ5IFVNQUMqLworICAgd2RpODAyM011bHRpY2FzdExpc3RDYih3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFNldCBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzUmVjZWl2ZUZpbHRlclNldEZpbHRlclJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgIFdESV9SZWNlaXZlRmlsdGVyU2V0RmlsdGVyQ2Igd2RpUmVjZWl2ZUZpbHRlclNldEZpbHRlckNiOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgIiVzIixfX0ZVTkNUSU9OX18pOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3ZGlSZWNlaXZlRmlsdGVyU2V0RmlsdGVyQ2IgPSAoV0RJX1JlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJDYilwV0RJQ3R4LT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZm5jUnNwQ0I7IAorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgICAvKk5vdGlmeSBVTUFDKi8KKyAgIHdkaVJlY2VpdmVGaWx0ZXJTZXRGaWx0ZXJDYih3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFBhY2tldCBGaWx0ZXIgTWF0Y2ggQ291bnQgUmVzcG9uc2UgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0ZpbHRlck1hdGNoQ291bnRSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisKKyAgIFdESV9GaWx0ZXJNYXRjaENvdW50Q2IgICB3ZGlGaWx0ZXJNYXRjaENvdW50Q2I7CisKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlcyIsX19GVU5DVElPTl9fKTsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgd2RpRmlsdGVyTWF0Y2hDb3VudENiID0gKFdESV9GaWx0ZXJNYXRjaENvdW50Q2IpcFdESUN0eC0+cGZuY1JzcENCOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAgLypOb3RpZnkgVU1BQyovCisgICB3ZGlGaWx0ZXJNYXRjaENvdW50Q2Iod2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfQorCisvKioKKyBAYnJpZWYgUHJvY2VzcyBSZWNlaXZlIEZpbHRlciBDbGVhciBGaWx0ZXIgUmVzcG9uc2UgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlclJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgIFdESV9SZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJDYiB3ZGlSZWNlaXZlRmlsdGVyQ2xlYXJGaWx0ZXJDYjsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICIlcyIsX19GVU5DVElPTl9fKTsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgd2RpUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyQ2IgPSAoV0RJX1JlY2VpdmVGaWx0ZXJDbGVhckZpbHRlckNiKXBXRElDdHgtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZm5jUnNwQ0I7IAorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgICAvKk5vdGlmeSBVTUFDKi8KKyAgIHdkaVJlY2VpdmVGaWx0ZXJDbGVhckZpbHRlckNiKHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30KKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfUEFDS0VUX0ZJTFRFUklORworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTaHV0ZG93biBSc3AgZnVuY3Rpb24KKyAgICAgICAgVGhlcmUgaXMgbm8gc2h1dGRvd24gcmVzcG9uc2UgY29tbWluZyBmcm9tIEhBTAorICAgICAgICAtIGZ1bmN0aW9uIGp1c3Qga2VwdCBmb3Igc2ltbWV0cnkKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NodXRkb3duUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAvKlRoZXJlIGlzIG5vIHNodXRkb3duIHJlc3BvbnNlIGNvbW1pbmcgZnJvbSBIQUwgLSBmdW5jdGlvbiBqdXN0IGtlcHQgZm9yCisgIHNpbW1ldHJ5ICovCisgIFdESV9BU1NFUlQoMCk7CisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7Cit9LypXRElfUHJvY2Vzc1NodXRkb3duUnNwKi8KKworLyoqCisgQGJyaWVmIFdESV9TZXRQb3dlclBhcmFtc1JlcQorCisgQHBhcmFtIHB3ZGlQb3dlclBhcmFtc1JlcVBhcmFtczogdGhlIFNldCBQb3dlciBQYXJhbXMgYXMgCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICB3ZGlQb3dlclBhcmFtc0NiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZQorICAgICAgICBvZiB0aGUgU2V0IFBvd2VyIFBhcmFtcyBvcGVyYXRpb24gcmVjZWl2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGV2aWNlCisgIAorICAgICAgICBwVXNlckRhdGE6IHVzZXIgZGF0YSB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGggdGhlCisgICAgICAgIGNhbGxiYWNrIAorICAKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU2V0UG93ZXJQYXJhbXNSZXEKKygKKyAgV0RJX1NldFBvd2VyUGFyYW1zUmVxUGFyYW1zVHlwZSogcHdkaVBvd2VyUGFyYW1zUmVxUGFyYW1zLAorICBXRElfU2V0UG93ZXJQYXJhbXNDYiAgICAgICAgICAgICB3ZGlQb3dlclBhcmFtc0NiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgICAgd2RpRXZlbnREYXRhOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgQ2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCBlV0xBTl9QQUxfRkFMU0UgPT0gZ1dESUluaXRpYWxpemVkICkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworCisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfTk9UX0FMTE9XRUQ7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBGaWxsIGluIEV2ZW50IGRhdGEgYW5kIHBvc3QgdG8gdGhlIE1haW4gRlNNCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9TRVRfUE9XRVJfUEFSQU1TX1JFUTsKKyAgIHdkaUV2ZW50RGF0YS5wRXZlbnREYXRhICAgICAgPSBwd2RpUG93ZXJQYXJhbXNSZXFQYXJhbXM7IAorICAgd2RpRXZlbnREYXRhLnVFdmVudERhdGFTaXplICA9IHNpemVvZigqcHdkaVBvd2VyUGFyYW1zUmVxUGFyYW1zKTsKKyAgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlQb3dlclBhcmFtc0NiOyAKKyAgIHdkaUV2ZW50RGF0YS5wVXNlckRhdGEgICAgICAgPSBwVXNlckRhdGE7CisKKyAgIHJldHVybiBXRElfUG9zdE1haW5FdmVudCgmZ1dESUNiLCBXRElfUkVRVUVTVF9FVkVOVCwgJndkaUV2ZW50RGF0YSk7Cit9LypXRElfU2V0UG93ZXJQYXJhbXNSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBTZXQgUG93ZXIgUGFyYW1zIFJlcXVlc3QgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFBvd2VyUGFyYW1zUmVxCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1NldFBvd2VyUGFyYW1zUmVxUGFyYW1zVHlwZSogcHdkaVBvd2VyUGFyYW1zUmVxUGFyYW1zID0gTlVMTDsKKyAgIFdESV9TZXRQb3dlclBhcmFtc0NiICAgICAgICAgICAgIHdkaVBvd2VyUGFyYW1zQ2IgICAgICAgICA9IE5VTEw7CisgICB3cHRfdWludDgqICAgICAgICAgICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgICAgICAgPSBOVUxMOyAKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgICAgICA9IDA7CisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgICAgICAgPSAwOworICAgdFNldFBvd2VyUGFyYW1zVHlwZSAgICAgICAgICAgICAgcG93ZXJQYXJhbXM7CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IChwd2RpUG93ZXJQYXJhbXNSZXFQYXJhbXMgPSAoV0RJX1NldFBvd2VyUGFyYW1zUmVxUGFyYW1zVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlQb3dlclBhcmFtc0NiICAgPSAoV0RJX1NldFBvd2VyUGFyYW1zQ2IpcEV2ZW50RGF0YS0+cENCZm5jKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9TRVRfUE9XRVJfUEFSQU1TX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBvd2VyUGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YocG93ZXJQYXJhbXMpICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBTZXQgUE5PIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpUG93ZXJQYXJhbXNSZXFQYXJhbXMsIHdkaVBvd2VyUGFyYW1zQ2IpOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgLyogIElnbm9yZSBEVElNICovCisgIHBvd2VyUGFyYW1zLnVJZ25vcmVEVElNID0gCisgICAgcHdkaVBvd2VyUGFyYW1zUmVxUGFyYW1zLT53ZGlTZXRQb3dlclBhcmFtc0luZm8udUlnbm9yZURUSU07CisKKyAgLypEVElNIFBlcmlvZCovCisgIHBvd2VyUGFyYW1zLnVEVElNUGVyaW9kID0gCisgICAgcHdkaVBvd2VyUGFyYW1zUmVxUGFyYW1zLT53ZGlTZXRQb3dlclBhcmFtc0luZm8udURUSU1QZXJpb2Q7CisKKyAgLyogTGlzdGVuIEludGVydmFsICovCisgIHBvd2VyUGFyYW1zLnVMaXN0ZW5JbnRlcnZhbD0gCisgICAgcHdkaVBvd2VyUGFyYW1zUmVxUGFyYW1zLT53ZGlTZXRQb3dlclBhcmFtc0luZm8udUxpc3RlbkludGVydmFsOworCisgIC8qIEJyb2FkY2FzdCBNdWx0aWNhcyBGaWx0ZXIgICovCisgIHBvd2VyUGFyYW1zLnVCY2FzdE1jYXN0RmlsdGVyID0gCisgICAgcHdkaVBvd2VyUGFyYW1zUmVxUGFyYW1zLT53ZGlTZXRQb3dlclBhcmFtc0luZm8udUJjYXN0TWNhc3RGaWx0ZXI7CisKKyAgLyogQmVhY29uIEVhcmx5IFRlcm1pbmF0aW9uICovCisgIHBvd2VyUGFyYW1zLnVFbmFibGVCRVQgPSAKKyAgICBwd2RpUG93ZXJQYXJhbXNSZXFQYXJhbXMtPndkaVNldFBvd2VyUGFyYW1zSW5mby51RW5hYmxlQkVUOworCisgIC8qIEJlYWNvbiBFYXJseSBUZXJtaW5hdGlvbiBJbnRlcnZhbCAqLworICBwb3dlclBhcmFtcy51QkVUSW50ZXJ2YWwgPSAKKyAgICBwd2RpUG93ZXJQYXJhbXNSZXFQYXJhbXMtPndkaVNldFBvd2VyUGFyYW1zSW5mby51QkVUSW50ZXJ2YWw7IAorICAgIAorCisgICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAmcG93ZXJQYXJhbXMsIAorICAgICAgICAgICAgICAgICAgIHNpemVvZihwb3dlclBhcmFtcykpOyAKKworICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaVBvd2VyUGFyYW1zUmVxUGFyYW1zLT53ZGlSZXFTdGF0dXNDQjsKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlQb3dlclBhcmFtc1JlcVBhcmFtcy0+cFVzZXJEYXRhOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpUG93ZXJQYXJhbXNDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfU0VUX1BPV0VSX1BBUkFNU19SRVNQKTsgCit9CisKKy8qKgorIEBicmllZiBQcm9jZXNzIFBvd2VyIFBhcmFtcyBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzU2V0UG93ZXJQYXJhbXNSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfU3RhdHVzICAgICAgICAgICB3ZGlTdGF0dXM7CisgICBlSGFsU3RhdHVzICAgICAgICAgICBoYWxTdGF0dXM7CisgICBXRElfU2V0UG93ZXJQYXJhbXNDYiAgICAgICAgICAgICB3ZGlQb3dlclBhcmFtc0NiOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3ZGlQb3dlclBhcmFtc0NiID0gKFdESV9TZXRQb3dlclBhcmFtc0NiKXBXRElDdHgtPnBmbmNSc3BDQjsgCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBFeHRyYWN0IHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaGFsU3RhdHVzID0gKigoZUhhbFN0YXR1cyopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgICB3ZGlTdGF0dXMgICA9ICAgV0RJX0hBTF8yX1dESV9TVEFUVVMoaGFsU3RhdHVzKTsgCisKKyAgIC8qTm90aWZ5IFVNQUMqLworICAgd2RpUG93ZXJQYXJhbXNDYih3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9LypXRElfUHJvY2Vzc1NldFBvd2VyUGFyYW1zUnNwKi8KKworI2lmZGVmIFdMQU5fRkVBVFVSRV9HVEtfT0ZGTE9BRAorLyoqCisgQGJyaWVmIFdESV9HVEtPZmZsb2FkUmVxIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVwcGVyIE1BQyAKKyAgICAgICAgd2FudHMgdG8gc2V0IEdUSyBSZWtleSBDb3VudGVyIHdoaWxlIGluIHBvd2VyIHNhdmUuIFVwb24KKyAgICAgICAgdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQgc2VuZCBhCisgICAgICAgIEhBTCBHVEsgb2ZmbG9hZCByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGxvd2VyIFJJVkEKKyAgICAgICAgc3ViLXN5c3RlbSBpZiBEQUwgaXMgaW4gc3RhdGUgU1RBUlRFRC4KKworICAgICAgICBJbiBzdGF0ZSBCVVNZIHRoaXMgcmVxdWVzdCB3aWxsIGJlIHF1ZXVlZC4gUmVxdWVzdCB3b24ndAorICAgICAgICBiZSBhbGxvd2VkIGluIGFueSBvdGhlciBzdGF0ZS4gCisKKyBXRElfUG9zdEFzc29jUmVxIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKworIEBwYXJhbSBwd2RpR3RrT2ZmbG9hZFBhcmFtczogdGhlIEdUSyBvZmZsb2FkIGFzIHNwZWNpZmllZCAKKyAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgRGV2aWNlIEludGVyZmFjZQorICAKKyAgICAgICAgd2RpR3RrT2ZmbG9hZENiOiBjYWxsYmFjayBmb3IgcGFzc2luZyBiYWNrIHRoZSByZXNwb25zZQorICAgICAgICBvZiB0aGUgR1RLIG9mZmxvYWQgb3BlcmF0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0dUS09mZmxvYWRSZXEKKygKKyAgV0RJX0d0a09mZmxvYWRSZXFNc2cqICAgICAgcHdkaUd0a09mZmxvYWRSZXFNc2csCisgIFdESV9HdGtPZmZsb2FkQ2IgICAgICAgICAgIHdkaUd0a09mZmxvYWRDYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcFVzZXJEYXRhCispCit7CisgICBXRElfRXZlbnRJbmZvVHlwZSAgICAgIHdkaUV2ZW50RGF0YSA9IHswfTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IENoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICggZVdMQU5fUEFMX0ZBTFNFID09IGdXRElJbml0aWFsaXplZCApCisgICB7CisgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiV0RJIEFQSSBjYWxsIGJlZm9yZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQgLSBGYWlsIHJlcXVlc3QiKTsKKworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHdkaUV2ZW50RGF0YS53ZGlSZXF1ZXN0ICAgICAgPSBXRElfR1RLX09GRkxPQURfUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlHdGtPZmZsb2FkUmVxTXNnOyAKKyAgIHdkaUV2ZW50RGF0YS51RXZlbnREYXRhU2l6ZSAgPSBzaXplb2YoKnB3ZGlHdGtPZmZsb2FkUmVxTXNnKTs7IAorICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUd0a09mZmxvYWRDYjsgCisgICB3ZGlFdmVudERhdGEucFVzZXJEYXRhICAgICAgID0gcFVzZXJEYXRhOworCisgICByZXR1cm4gV0RJX1Bvc3RNYWluRXZlbnQoJmdXRElDYiwgV0RJX1JFUVVFU1RfRVZFTlQsICZ3ZGlFdmVudERhdGEpOworfQorCisKKy8qKgorIEBicmllZiBXRElfR1RLT2ZmbG9hZEdldEluZm9SZXEgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXBwZXIgCisgICAgICAgICAgTUFDIHdhbnRzIHRvIGdldCBHVEsgUmVrZXkgQ291bnRlciB3aGlsZSBpbiBwb3dlciBzYXZlLgorICAgICAgICAgIFVwb24gdGhlIGNhbGwgb2YgdGhpcyBBUEkgdGhlIFdMQU4gREFMIHdpbGwgcGFjayBhbmQKKyAgICAgICAgICBzZW5kIGEgSEFMIEdUSyBvZmZsb2FkIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbG93ZXIgUklWQQorICAgICAgICBzdWItc3lzdGVtIGlmIERBTCBpcyBpbiBzdGF0ZSBTVEFSVEVELgorCisgICAgICAgIEluIHN0YXRlIEJVU1kgdGhpcyByZXF1ZXN0IHdpbGwgYmUgcXVldWVkLiBSZXF1ZXN0IHdvbid0CisgICAgICAgIGJlIGFsbG93ZWQgaW4gYW55IG90aGVyIHN0YXRlLiAKKworIFdESV9Qb3N0QXNzb2NSZXEgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgQHBhcmFtIHB3ZGlHdGtPZmZsb2FkR2V0SW5mb1JlcU1zZzogdGhlIEdUSyBPZmZsb2FkIAorICAgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb24gTWVzc2FnZSBhcyBzcGVjaWZpZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgSW50ZXJmYWNlCisgIAorICAgICAgICAgIHdkaUd0a09mZmxvYWRHZXRJbmZvQ2I6IGNhbGxiYWNrIGZvciBwYXNzaW5nIGJhY2sgdGhlCisgICAgICAgICAgcmVzcG9uc2Ugb2YgdGhlIEdUSyBvZmZsb2FkIG9wZXJhdGlvbiByZWNlaXZlZCBmcm9tIHRoZQorICAgICAgICAgIGRldmljZQorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZSBXRElfUG9zdEFzc29jUmVxCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX0dUS09mZmxvYWRHZXRJbmZvUmVxCisoCisgIFdESV9HdGtPZmZsb2FkR2V0SW5mb1JlcU1zZyogIHB3ZGlHdGtPZmZsb2FkR2V0SW5mb1JlcU1zZywKKyAgV0RJX0d0a09mZmxvYWRHZXRJbmZvQ2IgICAgICAgd2RpR3RrT2ZmbG9hZEdldEluZm9DYiwKKyAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyRGF0YQorKQoreworICAgV0RJX0V2ZW50SW5mb1R5cGUgICAgICB3ZGlFdmVudERhdGEgPSB7MH07CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgIldESSBBUEkgY2FsbCBiZWZvcmUgbW9kdWxlIGlzIGluaXRpYWxpemVkIC0gRmFpbCByZXF1ZXN0Iik7CisKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9OT1RfQUxMT1dFRDsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEZpbGwgaW4gRXZlbnQgZGF0YSBhbmQgcG9zdCB0byB0aGUgTWFpbiBGU00KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICB3ZGlFdmVudERhdGEud2RpUmVxdWVzdCAgICAgID0gV0RJX0dUS19PRkZMT0FEX0dFVElORk9fUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IHB3ZGlHdGtPZmZsb2FkR2V0SW5mb1JlcU1zZzsgCisgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gc2l6ZW9mKCpwd2RpR3RrT2ZmbG9hZEdldEluZm9SZXFNc2cpOworICAgd2RpRXZlbnREYXRhLnBDQmZuYyAgICAgICAgICA9IHdkaUd0a09mZmxvYWRHZXRJbmZvQ2I7IAorICAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKworICAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKK30KKworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBzZXQgR1RLIE9mZmxvYWQgUmVxdWVzdCBmdW5jdGlvbiAKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0dUS09mZmxvYWRSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfR3RrT2ZmbG9hZFJlcU1zZyogICAgcHdkaUd0a09mZmxvYWRSZXFNc2cgPSBOVUxMOworICAgV0RJX0d0a09mZmxvYWRDYiAgICAgICAgIHdkaUd0a09mZmxvYWRDYiAgICAgID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICBwU2VuZEJ1ZmZlciAgICAgICAgICA9IE5VTEw7IAorICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgIHVzRGF0YU9mZnNldCAgICAgICAgID0gMDsKKyAgIHdwdF91aW50MTYgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgICA9IDA7CisgICB0SGFsR3RrT2ZmbG9hZFJlcVBhcmFtcyAgZ3RrT2ZmbG9hZFJlcVBhcmFtcyA9IHswfTsKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHB3ZGlHdGtPZmZsb2FkUmVxTXNnID0gKFdESV9HdGtPZmZsb2FkUmVxTXNnKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKSkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHdkaUd0a09mZmxvYWRDYiAgID0gKFdESV9HdGtPZmZsb2FkQ2IpcEV2ZW50RGF0YS0+cENCZm5jKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX0dldE1lc3NhZ2VCdWZmZXIoIHBXRElDdHgsIFdESV9HVEtfT0ZGTE9BRF9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihndGtPZmZsb2FkUmVxUGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoZ3RrT2ZmbG9hZFJlcVBhcmFtcykgKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfREFMX0NUUkwsICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHNlbmQgYnVmZmVyIGluIEdUSyBvZmZsb2FkIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpR3RrT2ZmbG9hZFJlcU1zZywgd2RpR3RrT2ZmbG9hZENiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvLworICAgLy8gRmlsbCBndGtPZmZsb2FkUmVxUGFyYW1zIGZyb20gcHdkaUd0a09mZmxvYWRSZXFNc2ctPmd0a09mZmxvYWRSZXFQYXJhbXMKKyAgIC8vCisgICBndGtPZmZsb2FkUmVxUGFyYW1zLnVsRmxhZ3MgPSBwd2RpR3RrT2ZmbG9hZFJlcU1zZy0+Z3RrT2ZmbG9hZFJlcVBhcmFtcy51bEZsYWdzOworICAgLy8gQ29weSBLQ0sKKyAgIHdwYWxNZW1vcnlDb3B5KCYoZ3RrT2ZmbG9hZFJlcVBhcmFtcy5hS0NLWzBdKSwgJihwd2RpR3RrT2ZmbG9hZFJlcU1zZy0+Z3RrT2ZmbG9hZFJlcVBhcmFtcy5hS0NLWzBdKSwgMTYpOworICAgLy8gQ29weSBLRUsKKyAgIHdwYWxNZW1vcnlDb3B5KCYoZ3RrT2ZmbG9hZFJlcVBhcmFtcy5hS0VLWzBdKSwgJihwd2RpR3RrT2ZmbG9hZFJlcU1zZy0+Z3RrT2ZmbG9hZFJlcVBhcmFtcy5hS0VLWzBdKSwgMTYpOworICAgLy8gQ29weSBLZXlSZXBsYXlDb3VudGVyCisgICB3cGFsTWVtb3J5Q29weSgmKGd0a09mZmxvYWRSZXFQYXJhbXMudWxsS2V5UmVwbGF5Q291bnRlciksICYocHdkaUd0a09mZmxvYWRSZXFNc2ctPmd0a09mZmxvYWRSZXFQYXJhbXMudWxsS2V5UmVwbGF5Q291bnRlciksIHNpemVvZih2X1U2NF90KSk7CisKKyAgIHdwYWxNZW1vcnlDb3B5KCBwU2VuZEJ1ZmZlcit1c0RhdGFPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICZndGtPZmZsb2FkUmVxUGFyYW1zLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoZ3RrT2ZmbG9hZFJlcVBhcmFtcykpOyAKKworICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaUd0a09mZmxvYWRSZXFNc2ctPndkaVJlcVN0YXR1c0NCOworICAgcFdESUN0eC0+cFJlcVN0YXR1c1VzZXJEYXRhID0gcHdkaUd0a09mZmxvYWRSZXFNc2ctPnBVc2VyRGF0YTsgCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaUd0a09mZmxvYWRDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfR1RLX09GRkxPQURfUkVTUCk7IAorfQorCisKKy8qKgorIEBicmllZiBQcm9jZXNzIEdUSyBPZmZsb2FkIEdldCBJbmZvcm1hdGlvbiBSZXF1ZXN0IGZ1bmN0aW9uCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NHVEtPZmZsb2FkR2V0SW5mb1JlcQorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9HdGtPZmZsb2FkR2V0SW5mb1JlcU1zZyogICAgIHB3ZGlHdGtPZmZsb2FkR2V0SW5mb1JlcU1zZyA9IE5VTEw7CisgICBXRElfR3RrT2ZmbG9hZEdldEluZm9DYiAgICAgICAgICB3ZGlHdGtPZmZsb2FkR2V0SW5mb0NiICAgICAgPSBOVUxMOworICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICAgICAgICAgICAgcFNlbmRCdWZmZXIgICAgICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgICAgPSAwOworICAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgICAgICAgdXNTZW5kU2l6ZSAgICAgICAgICAgID0gMDsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHB3ZGlHdGtPZmZsb2FkR2V0SW5mb1JlcU1zZyA9IChXRElfR3RrT2ZmbG9hZEdldEluZm9SZXFNc2cqKXBFdmVudERhdGEtPnBFdmVudERhdGEpKSB8fAorICAgICAgICggTlVMTCA9PSAod2RpR3RrT2ZmbG9hZEdldEluZm9DYiA9IChXRElfR3RrT2ZmbG9hZEdldEluZm9DYilwRXZlbnREYXRhLT5wQ0JmbmMpKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBHZXQgbWVzc2FnZSBidWZmZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoIFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBXRElfR2V0TWVzc2FnZUJ1ZmZlciggcFdESUN0eCwgV0RJX0dUS19PRkZMT0FEX0dFVElORk9fUkVRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwU2VuZEJ1ZmZlciwgJnVzRGF0YU9mZnNldCwgJnVzU2VuZFNpemUpKXx8CisgICAgICAgKCB1c1NlbmRTaXplIDwgdXNEYXRhT2Zmc2V0KSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gV0RJX1Byb2Nlc3NHVEtPZmZsb2FkR2V0SW5mb1JlcSgpICV4ICV4ICV4IiwKKyAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEsIHB3ZGlHdGtPZmZsb2FkR2V0SW5mb1JlcU1zZywgd2RpR3RrT2ZmbG9hZEdldEluZm9DYik7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLy8KKyAgIC8vIERvbid0IG5lZWQgdG8gZmlsbCBzZW5kIGJ1ZmZlciBvdGhlciB0aGFuIGhlYWRlcgorICAgLy8KKworICAgcFdESUN0eC0+d2RpUmVxU3RhdHVzQ0IgICAgID0gcHdkaUd0a09mZmxvYWRHZXRJbmZvUmVxTXNnLT53ZGlSZXFTdGF0dXNDQjsKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlHdGtPZmZsb2FkR2V0SW5mb1JlcU1zZy0+cFVzZXJEYXRhOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNlbmQgR2V0IFNUQSBSZXF1ZXN0IHRvIEhBTCAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgcmV0dXJuICBXRElfU2VuZE1zZyggcFdESUN0eCwgcFNlbmRCdWZmZXIsIHVzU2VuZFNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpR3RrT2ZmbG9hZEdldEluZm9DYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfR1RLX09GRkxPQURfR0VUSU5GT19SRVNQKTsgCit9CisKKy8qKgorIEBicmllZiBQcm9jZXNzIGhvc3Qgb2ZmbG9hZCBSc3AgZnVuY3Rpb24gKGNhbGxlZCB3aGVuIGEKKyAgICAgICAgcmVzcG9uc2UgaXMgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgYnVzIGZyb20gSEFMKQorIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgcEV2ZW50RGF0YTogICAgICBwb2ludGVyIHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMKK1dESV9Qcm9jZXNzR3RrT2ZmbG9hZFJzcAorKCAKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9TdGF0dXMgICAgICAgICAgIHdkaVN0YXR1czsKKyAgIGVIYWxTdGF0dXMgICAgICAgICAgIGhhbFN0YXR1czsKKyAgIFdESV9HdGtPZmZsb2FkQ2IgICAgd2RpR3RrT2ZmbG9hZENiICAgPSBOVUxMOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICB3ZGlHdGtPZmZsb2FkQ2IgPSAoV0RJX0d0a09mZmxvYWRDYilwV0RJQ3R4LT5wZm5jUnNwQ0I7IAorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgRXh0cmFjdCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byBVTUFDCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGhhbFN0YXR1cyA9ICooKGVIYWxTdGF0dXMqKXBFdmVudERhdGEtPnBFdmVudERhdGEpOworICAgd2RpU3RhdHVzICAgPSAgIFdESV9IQUxfMl9XRElfU1RBVFVTKGhhbFN0YXR1cyk7IAorCisgICAvKk5vdGlmeSBVTUFDKi8KKyAgIHdkaUd0a09mZmxvYWRDYiggd2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfQorCisvKioKKyBAYnJpZWYgUHJvY2VzcyBHVEsgT2ZmbG9hZCBHZXQgSW5mb3JtYXRpb24gUmVzcG9uc2UgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0dUS09mZmxvYWRHZXRJbmZvUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsU3RhdHVzOworCisgICBXRElfR3RrT2ZmbG9hZEdldEluZm9DYiAgIHdkaUd0a09mZmxvYWRHZXRJbmZvQ2IgPSBOVUxMOworCisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIHdkaUd0a09mZmxvYWRHZXRJbmZvQ2IgPSAoV0RJX0d0a09mZmxvYWRHZXRJbmZvQ2IpcFdESUN0eC0+cGZuY1JzcENCOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwV0RJQ3R4ICkgfHwgKCBOVUxMID09IHBFdmVudERhdGEgKSB8fAorICAgICAgICggTlVMTCA9PSBwRXZlbnREYXRhLT5wRXZlbnREYXRhICkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBXRElfQVNTRVJUKDApOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAgLypOb3RpZnkgVU1BQyovCisgICAvL3dkaVVwZGF0ZVNjYW5QYXJhbXNDYih3ZGlTdGF0dXMsIHBXRElDdHgtPnBSc3BDQlVzZXJEYXRhKTsKKyAgIC8vd2RpUmVjZWl2ZUZpbHRlckNsZWFyRmlsdGVyQ2Iod2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisgICB3ZGlHdGtPZmZsb2FkR2V0SW5mb0NiKHdkaVN0YXR1cywgcFdESUN0eC0+cFJzcENCVXNlckRhdGEpOworCisgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAKK30KKyNlbmRpZiAvLyBXTEFOX0ZFQVRVUkVfR1RLX09GRkxPQUQKKworI2lmZGVmIFdMQU5fV0FLRVVQX0VWRU5UUworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NXYWtlUmVhc29uSW5kCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICBXRElfTG93TGV2ZWxJbmRUeXBlICpwV2RpSW5kOworICB0cFdha2VSZWFzb25QYXJhbXMgcFdha2VSZWFzb25QYXJhbXM7CisgIHdwdF91aW50MzIgYWxsb2NTaXplID0gMDsKKworICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAiKyVzIiwgX19GVU5DVElPTl9fKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAoIE5VTEwgPT0gcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSApKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgV0RJX0FTU0VSVCggMCApOworICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBpbmRpY2F0aW9uIGFuZCBzZW5kIGl0IHRvIFVNQUMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHBXYWtlUmVhc29uUGFyYW1zID0gKHRwV2FrZVJlYXNvblBhcmFtcykocEV2ZW50RGF0YS0+cEV2ZW50RGF0YSk7CisgIAorICBhbGxvY1NpemUgPSBzaXplb2YoV0RJX0xvd0xldmVsSW5kVHlwZSkgKyAocFdha2VSZWFzb25QYXJhbXMtPnVsU3RvcmVkRGF0YUxlbiAtIDEpOworCisgIC8vQWxsb2NhdGUgbWVtb3J5IGZvciBXRElfV2FrZVJlYXNvbkluZFR5cGUgc3RydWN0dXJlCisgIHBXZGlJbmQgPSB3cGFsTWVtb3J5QWxsb2NhdGUoYWxsb2NTaXplKSA7CisKKyAgaWYoTlVMTCA9PSBwV2RpSW5kKQorICB7CisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFdESV9XYWtlUmVhc29uSW5kVHlwZTogJXggJXggJXggIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBXRElDdHgsIHBFdmVudERhdGEsIHBFdmVudERhdGEtPnBFdmVudERhdGEpOworICAgIFdESV9BU1NFUlQoMCk7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIHdwYWxNZW1vcnlaZXJvKHBXZGlJbmQsIGFsbG9jU2l6ZSk7CisKKyAgLyogRmlsbCBpbiB0aGUgaW5kaWNhdGlvbiBwYXJhbWV0ZXJzKi8KKyAgLy8gRmlsbCB3ZGlJbmQud2RpSW5kaWNhdGlvbkRhdGEud2FrZVJlYXNvbkluZCBzdHJ1Y3R1cmUgZnJvbSB3YWtlUmVhc29uSW5kLndha2VSZWFzb25QYXJhbXMKKyAgcFdkaUluZC0+d2RpSW5kaWNhdGlvblR5cGUgPSBXRElfV0FLRV9SRUFTT05fSU5EOyAKKyAgcFdkaUluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpV2FrZVJlYXNvbkluZC51bFJlYXNvbiA9IHBXYWtlUmVhc29uUGFyYW1zLT51bFJlYXNvbjsKKyAgcFdkaUluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpV2FrZVJlYXNvbkluZC51bFJlYXNvbkFyZyA9IHBXYWtlUmVhc29uUGFyYW1zLT51bFJlYXNvbkFyZzsKKyAgcFdkaUluZC0+d2RpSW5kaWNhdGlvbkRhdGEud2RpV2FrZVJlYXNvbkluZC51bFN0b3JlZERhdGFMZW4gPSBwV2FrZVJlYXNvblBhcmFtcy0+dWxTdG9yZWREYXRhTGVuOworICBwV2RpSW5kLT53ZGlJbmRpY2F0aW9uRGF0YS53ZGlXYWtlUmVhc29uSW5kLnVsQWN0dWFsRGF0YUxlbiA9IHBXYWtlUmVhc29uUGFyYW1zLT51bEFjdHVhbERhdGFMZW47ICAgIAorICB3cGFsTWVtb3J5Q29weSggKHZvaWQgKikmKHBXZGlJbmQtPndkaUluZGljYXRpb25EYXRhLndkaVdha2VSZWFzb25JbmQuYURhdGFTdGFydFswXSksIAorICAgICAgICAgICAgICAgICAgJihwV2FrZVJlYXNvblBhcmFtcy0+YURhdGFTdGFydFswXSksIAorICAgICAgICAgICAgICAgICAgcFdha2VSZWFzb25QYXJhbXMtPnVsU3RvcmVkRGF0YUxlbik7CisKKyAgLypOb3RpZnkgVU1BQyovCisgIHBXRElDdHgtPndkaUxvd0xldmVsSW5kQ0IoIHBXZGlJbmQsIHBXRElDdHgtPnBJbmRVc2VyRGF0YSApOworICAKKyAgLy9GcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIFdESV9XYWtlUmVhc29uSW5kVHlwZSBzdHJ1Y3R1cmUKKyAgd3BhbE1lbW9yeUZyZWUocFdkaUluZCk7CisKKyAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgIi0lcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9CisjZW5kaWYgLy8gV0xBTl9XQUtFVVBfRVZFTlRTCisKK3ZvaWQgV0RJX0dldFdjbnNzQ29tcGlsZWRBcGlWZXJzaW9uCisoCisgIFdESV9XbGFuVmVyc2lvblR5cGUgICAgICpwV2Nuc3NBcGlWZXJzaW9uCispCit7CisgICAgcFdjbnNzQXBpVmVyc2lvbi0+bWFqb3IgICAgPSBXTEFOX0hBTF9WRVJfTUFKT1I7CisgICAgcFdjbnNzQXBpVmVyc2lvbi0+bWlub3IgICAgPSBXTEFOX0hBTF9WRVJfTUlOT1I7CisgICAgcFdjbnNzQXBpVmVyc2lvbi0+dmVyc2lvbiAgPSBXTEFOX0hBTF9WRVJfVkVSU0lPTjsKKyAgICBwV2Nuc3NBcGlWZXJzaW9uLT5yZXZpc2lvbiA9IFdMQU5fSEFMX1ZFUl9SRVZJU0lPTjsKK30KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IFRNIExldmVsIFJzcCBmdW5jdGlvbiAoY2FsbGVkIHdoZW4gYQorICAgICAgICByZXNwb25zZSBpcyBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBidXMgZnJvbSBIQUwpCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICBwRXZlbnREYXRhOiAgICAgIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uIHN0cnVjdHVyZSAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1Byb2Nlc3NTZXRUbUxldmVsUnNwCisoIAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgIFdESV9FdmVudEluZm9UeXBlKiAgICAgcEV2ZW50RGF0YQorKQoreworICAgV0RJX1N0YXR1cyAgICAgICAgICAgd2RpU3RhdHVzOworICAgZUhhbFN0YXR1cyAgICAgICAgICAgaGFsU3RhdHVzOworICAgV0RJX1NldFRtTGV2ZWxDYiAgICAgd2RpU2V0VG1MZXZlbENiOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICB3ZGlTZXRUbUxldmVsQ2IgPSAoV0RJX1NldFBvd2VyUGFyYW1zQ2IpcFdESUN0eC0+cGZuY1JzcENCOyAKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBoYWxTdGF0dXMgPSAqKChlSGFsU3RhdHVzKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgIHdkaVN0YXR1cyAgID0gICBXRElfSEFMXzJfV0RJX1NUQVRVUyhoYWxTdGF0dXMpOyAKKworICAgLypOb3RpZnkgVU1BQyovCisgICB3ZGlTZXRUbUxldmVsQ2Iod2RpU3RhdHVzLCBwV0RJQ3R4LT5wUnNwQ0JVc2VyRGF0YSk7CisKKyAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7IAorfS8qV0RJX1Byb2Nlc3NTZXRUbUxldmVsUnNwKi8KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgU2V0IFRoZXJtYWwgTWl0aWdhdGlvbiBsZXZlbCBDaGFuZ2VkIHJlcXVlc3QKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc1NldFRtTGV2ZWxSZXEKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICBXRElfRXZlbnRJbmZvVHlwZSogICAgIHBFdmVudERhdGEKKykKK3sKKyAgIFdESV9TZXRUbUxldmVsUmVxVHlwZSAgICAgICAgICAgKnB3ZGlTZXRUbUxldmVsUmVxID0gTlVMTDsKKyAgIFdESV9TZXRUbUxldmVsQ2IgICAgICAgICAgICAgICAgIHdkaVNldFRtTGV2ZWxDYiAgID0gTlVMTDsKKyAgIHdwdF91aW50OCogICAgICAgICAgICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgID0gTlVMTDsgCisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICA9IDA7CisgICB3cHRfdWludDE2ICAgICAgICAgICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICA9IDA7CisgICB0U2V0VGhlcm1hbE1pdGdhdGlvblR5cGUgICAgICAgICBoYWxUbU1zZzsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICAoIE5VTEwgPT0gKHB3ZGlTZXRUbUxldmVsUmVxID0gKFdESV9TZXRUbUxldmVsUmVxVHlwZSopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSkpIHx8CisgICAgICAgKCBOVUxMID09ICh3ZGlTZXRUbUxldmVsQ2IgICA9IChXRElfU2V0VG1MZXZlbENiKXBFdmVudERhdGEtPnBDQmZuYykpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwKKyAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCBtZXNzYWdlIGJ1ZmZlcgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LCBXRElfU0VUX1RNX0xFVkVMX1JFUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhhbFRtTXNnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgICggdXNTZW5kU2l6ZSA8ICh1c0RhdGFPZmZzZXQgKyBzaXplb2YoaGFsVG1Nc2cpICkpKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX1dBUk4sCisgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGdldCBzZW5kIGJ1ZmZlciBpbiBTZXQgUE5PIHJlcSAleCAleCAleCIsCisgICAgICAgICAgICAgICAgICBwRXZlbnREYXRhLCBwd2RpU2V0VG1MZXZlbFJlcSwgd2RpU2V0VG1MZXZlbENiKTsKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgfQorCisgICBoYWxUbU1zZy50aGVybWFsTWl0TW9kZSA9IHB3ZGlTZXRUbUxldmVsUmVxLT50bU1vZGU7CisgICBoYWxUbU1zZy50aGVybWFsTWl0TGV2ZWwgPSBwd2RpU2V0VG1MZXZlbFJlcS0+dG1MZXZlbDsKKworICAgd3BhbE1lbW9yeUNvcHkoIHBTZW5kQnVmZmVyK3VzRGF0YU9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgJmhhbFRtTXNnLCAKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoaGFsVG1Nc2cpKTsgCisKKyAgIHBXRElDdHgtPnBSZXFTdGF0dXNVc2VyRGF0YSA9IHB3ZGlTZXRUbUxldmVsUmVxLT5wVXNlckRhdGE7IAorICAgcFdESUN0eC0+cGZuY1JzcENCID0gTlVMTDsKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTZW5kIEdldCBTVEEgUmVxdWVzdCB0byBIQUwgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIHJldHVybiAgV0RJX1NlbmRNc2coIHBXRElDdHgsIHBTZW5kQnVmZmVyLCB1c1NlbmRTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkaVNldFRtTGV2ZWxDYiwgcEV2ZW50RGF0YS0+cFVzZXJEYXRhLCBXRElfU0VUX1RNX0xFVkVMX1JFU1ApOyAKK30KKworLyogRmlsbCB0aGUgdmFsdWUgZnJvbSB0aGUgZ2xvYmFsIGZlYXR1cmVzIGVuYWJsZWQgYXJyYXkgdG8gdGhlIGdsb2JhbCBjYXBhYmlsaXRpZXMKKyAqIGJpdG1hcCBzdHJ1Y3QgCisgKi8KK3N0YXRpYyB2b2lkIAorRmlsbEFsbEZlYXR1cmVDYXBzKHRXbGFuRmVhdENhcHMgKmZDYXBzLCBwbGFjZUhvbGRlckluQ2FwQml0bWFwICplbmFibGVkRmVhdCwgd3B0X2ludDggbGVuKQoreworICAgd3B0X2ludDggaTsKKyAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKQorICAgeworICAgICAgc2V0RmVhdENhcHMoZkNhcHMsIGVuYWJsZWRGZWF0W2ldKTsKKyAgIH0KK30KKworLyoqCisgQGJyaWVmIFdESV9mZWF0dXJlQ2Fwc0V4Y2hhbmdlUmVxCisgICAgICAgIFBvc3QgZmVhdHVyZSBjYXBhYmlsaXR5IGJpdG1hcCBleGNoYW5nZSBldmVudC4KKyAgICAgICAgSG9zdCB3aWxsIHNlbmQgaXRzIG93biBjYXBhYmlsaXR5IHRvIEZXIGluIHRoaXMgcmVxIGFuZCAKKyAgICAgICAgZXhwZWN0IEZXIHRvIHNlbmQgaXRzIGNhcGFiaWxpdHkgYmFjayBhcyBhIGJpdG1hcCBpbiBSZXNwb25zZQorIAorIEBwYXJhbSAKKyAgCisgICAgICAgIHdkaUZlYXR1cmVDYXBzRXhjaGFuZ2VDYjogY2FsbGJhY2sgY2FsbGVkIG9uIGdldHRpbmcgdGhlIHJlc3BvbnNlLgorICAgICAgICBJdCBpcyBrZXB0IHRvIG1hbnRhaW4gc2ltaWxhcml0eSBiZXR3ZWVuIFdESSByZXFzIGFuZCBpZiBuZWVkZWQsIGNhbgorICAgICAgICBiZSB1c2VkIGluIGZ1dHVyZS4gQ3VycmVudGx5LCBJdCBpcyBzZXQgdG8gTlVMTAorICAKKyAgICAgICAgcFVzZXJEYXRhOiB1c2VyIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmFjayB3aXRoIHRoZQorICAgICAgICBjYWxsYmFjayAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX2ZlYXR1cmVDYXBzRXhjaGFuZ2VSZXEKKygKKyAgV0RJX2ZlYXR1cmVDYXBzRXhjaGFuZ2VDYiAgICAgd2RpRmVhdHVyZUNhcHNFeGNoYW5nZUNiLAorICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlckRhdGEKKykKK3sKKyAgIFdESV9FdmVudEluZm9UeXBlICAgd2RpRXZlbnREYXRhOworICAgd3B0X2ludDMyICAgICAgICAgICBmQ2Fwc1N0cnVjdFNpemU7CisgICAKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBDaGVjayAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoIGVXTEFOX1BBTF9GQUxTRSA9PSBnV0RJSW5pdGlhbGl6ZWQgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJXREkgQVBJIGNhbGwgYmVmb3JlIG1vZHVsZSBpcyBpbml0aWFsaXplZCAtIEZhaWwgcmVxdWVzdCIpOworICAgCisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX05PVF9BTExPV0VEOyAKKyAgIH0KKworICAgLyogQWxsb2NhdGUgbWVtb3J5IHNlcGFyYXRlbHkgZm9yIGdsb2JhbCB2YXJpYWJsZSBjYXJyeWluZyBGVyBjYXBzICovCisgICBmQ2Fwc1N0cnVjdFNpemUgPSBzaXplb2YodFdsYW5GZWF0Q2Fwcyk7CisgICBncEhvc3RXbGFuRmVhdENhcHMgPSB3cGFsTWVtb3J5QWxsb2NhdGUoZkNhcHNTdHJ1Y3RTaXplKTsKKyAgIGlmICggTlVMTCA9PSAgZ3BIb3N0V2xhbkZlYXRDYXBzICkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgaG9zdCBjYXBhYmlsaXR5IGluZm9cbiIpOyAKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19NRU1fRkFJTFVSRTsKKyAgIH0KKworICAgd3BhbE1lbW9yeVplcm8oZ3BIb3N0V2xhbkZlYXRDYXBzLCBmQ2Fwc1N0cnVjdFNpemUpOworICAgCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgRmlsbCBpbiBFdmVudCBkYXRhIGFuZCBwb3N0IHRvIHRoZSBNYWluIEZTTQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIEZpbGxBbGxGZWF0dXJlQ2FwcyhncEhvc3RXbGFuRmVhdENhcHMsIHN1cHBvcnRFbmFibGVkRmVhdHVyZXMsCisgICAgICAoc2l6ZW9mKHN1cHBvcnRFbmFibGVkRmVhdHVyZXMpL3NpemVvZihzdXBwb3J0RW5hYmxlZEZlYXR1cmVzWzBdKSkpOworICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgImJpdCAwIC0gJXggJXggJXggJXggLSBiaXQgMTI4XG4iLAorICAgICAgZ3BIb3N0V2xhbkZlYXRDYXBzLT5mZWF0Q2Fwc1swXSwKKyAgICAgIGdwSG9zdFdsYW5GZWF0Q2Fwcy0+ZmVhdENhcHNbMV0sCisgICAgICBncEhvc3RXbGFuRmVhdENhcHMtPmZlYXRDYXBzWzJdLAorICAgICAgZ3BIb3N0V2xhbkZlYXRDYXBzLT5mZWF0Q2Fwc1szXQorICAgKTsKKyAgIAorICAgd2RpRXZlbnREYXRhLndkaVJlcXVlc3QgICAgICA9IFdESV9GRUFUVVJFX0NBUFNfRVhDSEFOR0VfUkVROworICAgd2RpRXZlbnREYXRhLnBFdmVudERhdGEgICAgICA9IGdwSG9zdFdsYW5GZWF0Q2FwczsgCisgICB3ZGlFdmVudERhdGEudUV2ZW50RGF0YVNpemUgID0gZkNhcHNTdHJ1Y3RTaXplOyAKKyAgIHdkaUV2ZW50RGF0YS5wQ0JmbmMgICAgICAgICAgPSB3ZGlGZWF0dXJlQ2Fwc0V4Y2hhbmdlQ2I7IAorICAgd2RpRXZlbnREYXRhLnBVc2VyRGF0YSAgICAgICA9IHBVc2VyRGF0YTsKKyAgIAorICAgcmV0dXJuIFdESV9Qb3N0TWFpbkV2ZW50KCZnV0RJQ2IsIFdESV9SRVFVRVNUX0VWRU5ULCAmd2RpRXZlbnREYXRhKTsKK30KKworLyoqCisgQGJyaWVmIFByb2Nlc3MgSG9zdC1GVyBDYXBhYmlsaXR5IEV4Y2hhbmdlIFJlcXVlc3QgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0ZlYXR1cmVDYXBzRXhjaGFuZ2VSZXEKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgIHdwdF91aW50OCogICAgICAgICAgICAgIHBTZW5kQnVmZmVyICAgICAgICA9IE5VTEw7IAorICB3cHRfdWludDE2ICAgICAgICAgICAgICB1c0RhdGFPZmZzZXQgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICB1c1NlbmRTaXplICAgICAgICAgPSAwOworICB3cHRfdWludDE2ICAgICAgICAgICAgICB1c0xlbiAgICAgICAgICAgICAgPSAwOyAKKworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTYW5pdHkgY2hlY2sgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDYWxsIGJhY2sgZnVuY3Rpb24gaXMgTlVMTCBzaW5jZSBub3QgcmVxdWlyZWQgZm9yIGNhcCBleGNoYW5nZSByZXEgKi8KKyAgaWYgKCggTlVMTCA9PSBwRXZlbnREYXRhICkgfHwKKyAgICAgICggTlVMTCA9PSAodFdsYW5GZWF0Q2FwcyAqKXBFdmVudERhdGEtPnBFdmVudERhdGEpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgIFdESV9BU1NFUlQoMCk7CisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgR2V0IG1lc3NhZ2UgYnVmZmVyCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdXNMZW4gPSBzaXplb2YodFdsYW5GZWF0Q2Fwcyk7CisKKyAgaWYgKCggV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9HZXRNZXNzYWdlQnVmZmVyKCBwV0RJQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgV0RJX0ZFQVRVUkVfQ0FQU19FWENIQU5HRV9SRVEsIAorICAgICAgICAgICAgICAgICAgICAgICAgdXNMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAmcFNlbmRCdWZmZXIsICZ1c0RhdGFPZmZzZXQsICZ1c1NlbmRTaXplKSl8fAorICAgICAgKCB1c1NlbmRTaXplIDwgKHVzRGF0YU9mZnNldCArIHVzTGVuICkpKQorICB7CisgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgc2VuZCBidWZmZXIgaW4gZmVhdCBjYXBzIGV4Y2hhbmdlIHJlcSAleCAleCIsCisgICAgICAgICAgICAgICAgcEV2ZW50RGF0YSwgKHRXbGFuRmVhdENhcHMgKilwRXZlbnREYXRhLT5wRXZlbnREYXRhKTsKKyAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOyAKKyAgfQorCisgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICJiaXQgMCAtICV4ICV4ICV4ICV4IC0gYml0IDEyOFxuIiwKKyAgICAgICgodFdsYW5GZWF0Q2FwcyAqKXBFdmVudERhdGEtPnBFdmVudERhdGEpLT5mZWF0Q2Fwc1swXSwKKyAgICAgICgodFdsYW5GZWF0Q2FwcyAqKXBFdmVudERhdGEtPnBFdmVudERhdGEpLT5mZWF0Q2Fwc1sxXSwKKyAgICAgICgodFdsYW5GZWF0Q2FwcyAqKXBFdmVudERhdGEtPnBFdmVudERhdGEpLT5mZWF0Q2Fwc1syXSwKKyAgICAgICgodFdsYW5GZWF0Q2FwcyAqKXBFdmVudERhdGEtPnBFdmVudERhdGEpLT5mZWF0Q2Fwc1szXQorICAgICk7CisKKyAgLyogQ29weSBob3N0IGNhcHMgYWZ0ZXIgdGhlIG9mZnNldCBpbiB0aGUgc2VuZCBidWZmZXIgKi8gIAorICB3cGFsTWVtb3J5Q29weSggcFNlbmRCdWZmZXIrdXNEYXRhT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICh0V2xhbkZlYXRDYXBzICopcEV2ZW50RGF0YS0+cEV2ZW50RGF0YSwgCisgICAgICAgICAgICAgICAgICB1c0xlbik7IAorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNlbmQgU3RhcnQgUmVxdWVzdCB0byBIQUwgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gIFdESV9TZW5kTXNnKCBwV0RJQ3R4LCBwU2VuZEJ1ZmZlciwgdXNTZW5kU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIChXRElfU3RhcnRSc3BDYilwRXZlbnREYXRhLT5wQ0JmbmMsCisgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudERhdGEtPnBVc2VyRGF0YSwgV0RJX0ZFQVRVUkVfQ0FQU19FWENIQU5HRV9SRVNQKTsKKyAgCit9LypXRElfUHJvY2Vzc0ZlYXR1cmVDYXBzRXhjaGFuZ2VSZXEqLworCisvKioKKyBAYnJpZWYgUHJvY2VzcyBIb3N0LUZXIENhcGFiaWxpdHkgRXhjaGFuZ2UgUmVzcG9uc2UgZnVuY3Rpb24KKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHBFdmVudERhdGE6ICAgICAgcG9pbnRlciB0byB0aGUgZXZlbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfUHJvY2Vzc0ZlYXR1cmVDYXBzRXhjaGFuZ2VSc3AKKyggCisgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgV0RJX0V2ZW50SW5mb1R5cGUqICAgICBwRXZlbnREYXRhCispCit7CisgICBXRElfZmVhdHVyZUNhcHNFeGNoYW5nZUNiICAgIHdkaUZlYXR1cmVDYXBzRXhjaGFuZ2VDYjsgICAKKyAgIHdwdF9pbnQzMiAgICAgICAgICAgICAgICAgICBmQ2Fwc1N0cnVjdFNpemU7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAiJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKCBOVUxMID09IHBXRElDdHggKSB8fCAoIE5VTEwgPT0gcEV2ZW50RGF0YSApIHx8CisgICAgICAgKCBOVUxMID09IHBFdmVudERhdGEtPnBFdmVudERhdGEgKSkKKyAgIHsKKyAgICAgIC8qIEl0IHdpbGwgZ28gaGVyZSB3aGVuIHJpdmEgaXMgb2xkIChkb2Vzbid0IHVuZGVyc3RhbmQgdGhpcyBtc2cpIGFuZCBob3N0IGlzIG5ldyAqLworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICB9CisKKyAgIC8qIEFsbG9jYXRlIG1lbW9yeSBzZXBhcmF0ZWx5IGZvciBnbG9iYWwgdmFyaWFibGUgY2FycnlpbmcgRlcgY2FwcyAqLworICAgZkNhcHNTdHJ1Y3RTaXplID0gc2l6ZW9mKHRXbGFuRmVhdENhcHMpOworICAgZ3BGd1dsYW5GZWF0Q2FwcyA9IHdwYWxNZW1vcnlBbGxvY2F0ZShmQ2Fwc1N0cnVjdFNpemUpOyAgIAorICAgaWYgKCBOVUxMID09ICBncEZ3V2xhbkZlYXRDYXBzICkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgaG9zdCBjYXBhYmlsaXR5IGluZm9cbiIpOyAKKyAgICAgIFdESV9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gV0RJX1NUQVRVU19NRU1fRkFJTFVSRTsKKyAgIH0KKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFVucGFjayBIQUwgUmVzcG9uc2UgTWVzc2FnZSAtIHRoZSBoZWFkZXIgd2FzIGFscmVhZHkgZXh0cmFjdGVkIGJ5IHRoZQorICAgICBtYWluIFJlc3BvbnNlIEhhbmRsaW5nIHByb2NlZHVyZSAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgIAorICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEV4dHJhY3QgcmVzcG9uc2UgYW5kIHNlbmQgaXQgdG8gVU1BQworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgIHdwYWxNZW1vcnlDb3B5KGdwRndXbGFuRmVhdENhcHMsKHRXbGFuRmVhdENhcHMgKikgcEV2ZW50RGF0YSAtPiBwRXZlbnREYXRhLAorICAgICAgICAgICAgICAgICAgICBmQ2Fwc1N0cnVjdFNpemUpOworICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgImJpdCAwIC0gJXggJXggJXggJXggLSBiaXQgMTI4XG4iLAorICAgICAgZ3BGd1dsYW5GZWF0Q2Fwcy0+ZmVhdENhcHNbMF0sCisgICAgICBncEZ3V2xhbkZlYXRDYXBzLT5mZWF0Q2Fwc1sxXSwKKyAgICAgIGdwRndXbGFuRmVhdENhcHMtPmZlYXRDYXBzWzJdLAorICAgICAgZ3BGd1dsYW5GZWF0Q2Fwcy0+ZmVhdENhcHNbM10KKyAgICAgKTsKKyAgIAorICAgd2RpRmVhdHVyZUNhcHNFeGNoYW5nZUNiID0gKFdESV9mZWF0dXJlQ2Fwc0V4Y2hhbmdlQ2IpIHBXRElDdHggLT4gcGZuY1JzcENCOyAKKworICAgLypOb3RpZnkgVU1BQyAtIHRoZXJlIGlzIG5vIGNhbGxiYWNrIHJpZ2h0IG5vdyBidXQgY2FuIGJlIHVzZWQgaW4gZnV0dXJlIGlmIHJlcWQgKi8KKyAgIGlmICh3ZGlGZWF0dXJlQ2Fwc0V4Y2hhbmdlQ2IgIT0gTlVMTCkKKyAgICAgIHdkaUZlYXR1cmVDYXBzRXhjaGFuZ2VDYihOVUxMLCBOVUxMKTsKKworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9CisKKy8qKgorIEBicmllZiBXRElfZ2V0SG9zdFdsYW5GZWF0Q2FwcworICAgICAgICBXREkgQVBJIHRoYXQgcmV0dXJucyB3aGV0aGVyIHRoZSBmZWF0dXJlIHBhc3NlZCB0byBpdCBhcyBlbnVtIHZhbHVlIGluCisgICAgICAgICJwbGFjZUhvbGRlckluQ2FwQml0bWFwIiBpcyBzdXBwb3J0ZWQgYnkgSG9zdCBvciBub3QuIEl0IHVzZXMgV0RJIGdsb2JhbAorICAgICAgICB2YXJpYWJsZSBzdG9yaW5nIGhvc3QgY2FwYWJpbGl0eSBiaXRtYXAgdG8gZmluZCB0aGlzLiBUaGlzIGNhbiBiZSB1c2VkIGJ5CisgICAgICAgIG90aGVyIG1vZHVlbHMgdG8gZGVjaWRlIGNlcnRhaW4gdGhpbmdzIGxpa2UgY2FsbCBkaWZmZXJlbnQgQVBJcyBiYXNlZCBvbgorICAgICAgICB3aGV0aGVyIGEgcGFydGljdWxhciBmZWF0dXJlIGlzIHN1cHBvcnRlZC4KKyAKKyBAcGFyYW0gCisgIAorICAgICAgICBmZWF0X2VudW1fdmFsdWU6IGVudW0gdmFsdWUgZm9yIHRoZSBmZWF0dXJlIGFzIGluIHBsYWNlSG9sZGVySW5DYXBCaXRtYXAgaW4gd2xhbl9oYWxfbXNnLmguCisKKyBAc2VlCisgQHJldHVybiAKKyAgICAgICAgMCAtIGlmIHRoZSBmZWF0dXJlIGlzIE5PVCBzdXBwb3J0ZWQgaW4gaG9zdAorICAgICAgICBhbnkgbm9uLXplcm8gdmFsdWUgLSBpZiB0aGUgZmVhdHVyZSBpcyBTVVBQT1JURUQgaW4gaG9zdC4KKyovCit3cHRfdWludDggV0RJX2dldEhvc3RXbGFuRmVhdENhcHMod3B0X3VpbnQ4IGZlYXRfZW51bV92YWx1ZSkKK3sKKyAgIHdwdF91aW50OCBmZWF0U3VwcG9ydGVkID0gMDsKKyAgIGlmIChncEhvc3RXbGFuRmVhdENhcHMgIT0gTlVMTCkKKyAgIHsKKyAgICAgIGdldEZlYXRDYXBzKGdwSG9zdFdsYW5GZWF0Q2FwcywgZmVhdF9lbnVtX3ZhbHVlLCBmZWF0U3VwcG9ydGVkKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICJDYXBzIGV4Y2hhbmdlIGZlYXR1cmUgTk9UIHN1cHBvcnRlZC4gUmV0dXJuIE5PVCBTVVBQT1JURUQgZm9yICV1IGZlYXR1cmVcbiIsIGZlYXRfZW51bV92YWx1ZSk7CisgICB9CisgICByZXR1cm4gZmVhdFN1cHBvcnRlZDsKK30KKworLyoqCisgQGJyaWVmIFdESV9nZXRGd1dsYW5GZWF0Q2FwcworICAgICAgICBXREkgQVBJIHRoYXQgcmV0dXJucyB3aGV0aGVyIHRoZSBmZWF0dXJlIHBhc3NlZCB0byBpdCBhcyBlbnVtIHZhbHVlIGluCisgICAgICAgICJwbGFjZUhvbGRlckluQ2FwQml0bWFwIiBpcyBzdXBwb3J0ZWQgYnkgRlcgb3Igbm90LiBJdCB1c2VzIFdESSBnbG9iYWwKKyAgICAgICAgdmFyaWFibGUgc3RvcmluZyBob3N0IGNhcGFiaWxpdHkgYml0bWFwIHRvIGZpbmQgdGhpcy4gVGhpcyBjYW4gYmUgdXNlZCBieQorICAgICAgICBvdGhlciBtb2R1ZWxzIHRvIGRlY2lkZSBjZXJ0YWluIHRoaW5ncyBsaWtlIGNhbGwgZGlmZmVyZW50IEFQSXMgYmFzZWQgb24KKyAgICAgICAgd2hldGhlciBhIHBhcnRpY3VsYXIgZmVhdHVyZSBpcyBzdXBwb3J0ZWQuCisgCisgQHBhcmFtIAorICAKKyAgICAgICAgZmVhdF9lbnVtX3ZhbHVlOiBlbnVtIHZhbHVlIGZvciB0aGUgZmVhdHVyZSBhcyBpbiBwbGFjZUhvbGRlckluQ2FwQml0bWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB3bGFuX2hhbF9tc2cuaC4KKworIEBzZWUKKyBAcmV0dXJuIAorICAgICAgICAwIC0gaWYgdGhlIGZlYXR1cmUgaXMgTk9UIHN1cHBvcnRlZCBpbiBGVworICAgICAgICBhbnkgbm9uLXplcm8gdmFsdWUgLSBpZiB0aGUgZmVhdHVyZSBpcyBTVVBQT1JURUQgaW4gRlcuCisqLword3B0X3VpbnQ4IFdESV9nZXRGd1dsYW5GZWF0Q2Fwcyh3cHRfdWludDggZmVhdF9lbnVtX3ZhbHVlKQoreworICAgIHdwdF91aW50OCBmZWF0U3VwcG9ydGVkID0gMDsKKyAgICBpZiAoZ3BGd1dsYW5GZWF0Q2FwcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGdldEZlYXRDYXBzKGdwRndXbGFuRmVhdENhcHMsIGZlYXRfZW51bV92YWx1ZSwgZmVhdFN1cHBvcnRlZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICJDYXBzIGV4Y2hhbmdlIGZlYXR1cmUgTk9UIHN1cHBvcnRlZC4gUmV0dXJuIE5PVCBTVVBQT1JURUQgZm9yICV1IGZlYXR1cmVcbiIsIGZlYXRfZW51bV92YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBmZWF0U3VwcG9ydGVkOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvQ1Avc3JjL3dsYW5fcWN0X3dkaV9kcC5jIGIvQ09SRS9XREkvQ1Avc3JjL3dsYW5fcWN0X3dkaV9kcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzhlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9DUC9zcmMvd2xhbl9xY3Rfd2RpX2RwLmMKQEAgLTAsMCArMSw5NzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIFcgRCBJIF8gRCBQLiBDCisKKyAgT1ZFUlZJRVc6CisKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBEZXZpY2UgQWJzdHJhY3Rpb24gICAgIAorICBMYXllciBJbnRlcm5hbCBVdGlsaXR5IHJvdXRpbmVzIHRvIGJlIHVzZWQgYnkgdGhlIERhdGEgUGF0aC4KKworICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgb25seSBieSB0aGUgV0RJIGRhdGEKKyAgcGF0aC4KKyAKKyAgVGhlIG1vZHVsZSBsZXZlcmFnZWQgYXMgbXVjaCBhcyBmdW5jdGlvbmFsaXR5IGFzIHdhcyBwb3NzaWJsZSBmcm9tIHRoZSBIQUwKKyAgaW4gTGlicmEvVm9sYW5zLgorIAorICBERVBFTkRFTkNJRVM6CisKKyAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisKKworICBDb3B5cmlnaHQgKGMpIDIwMTAgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICAkSGVhZGVyJCREYXRlVGltZSQkQXV0aG9yJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjAxMC0wOC0xOSAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfYXBpLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3R5cGUuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9zdGEuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfZHAuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfYmQuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHJhY2UuaCIKKworI2luY2x1ZGUgIndsYW5fcWN0X2Rldl9kZWZzLmgiCisKK2V4dGVybiB1aW50OCBXREFfSXNXY25zc1dsYW5Db21waWxlZFZlcnNpb25HcmVhdGVyVGhhbk9yRXF1YWwodWludDggbWFqb3IsIHVpbnQ4IG1pbm9yLCB1aW50OCB2ZXJzaW9uLCB1aW50OCByZXZpc2lvbik7CitleHRlcm4gdWludDggV0RBX0lzV2Nuc3NXbGFuUmVwb3J0ZWRWZXJzaW9uR3JlYXRlclRoYW5PckVxdWFsKHVpbnQ4IG1ham9yLCB1aW50OCBtaW5vciwgdWludDggdmVyc2lvbiwgdWludDggcmV2aXNpb24pOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgVElELT5RdWV1ZUlEIG1hcHBpbmcKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgd3B0X3VpbnQ4IGJ0cW1Rb3NUaWQyUWlkTWFwcGluZ1tdID0gCit7IAorICAgIEJUUU1fUUlEMCwgCisgICAgQlRRTV9RSUQxLCAKKyAgICBCVFFNX1FJRDIsIAorICAgIEJUUU1fUUlEMywgCisgICAgQlRRTV9RSUQ0LCAKKyAgICBCVFFNX1FJRDUsIAorICAgIEJUUU1fUUlENiwgCisgICAgQlRRTV9RSUQ3IAorfTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIEhlbHBlciBJbnRlcm5hbCBBUEkgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgQGJyaWVmIFdESV9EUF9VdGlsc0luaXQgLSBJbnRpYWxpemVzIHRoZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIHRvIAorICAgICAgICBpbnRlcmFjdCB3aXRoIHRoZSBkYXRhIHBhdGgKKyAgCisgQHBhcmFtICAgICAgIHBXRElDdHg6ICAgIHBvaW50ZXIgdG8gdGhlIG1haW4gV0RJIEN0cmwgQmxvY2sKKyAgCisgQHJldHVybiAgIHN1Y2Nlc3MgYWx3YXlzCisqLworV0RJX1N0YXR1cyAKK1dESV9EUF9VdGlsc0luaXQKKygKKyAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4CispCit7CisgIFdESV9SeEJkVHlwZSogIHBBbXNkdVJ4QmRGaXhNYXNrOyAKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9VQVBTRF9GV19UUkdfRlJBTUVTCisgICAgLy8gV1EgdG8gYmUgdXNlZCBmb3IgZmlsbGluZyB0aGUgVHhCRAorICBwV0RJQ3R4LT51Y0RwdVJGID0gQk1VV1FfQlRRTV9UWF9NR01UOyAKKyNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9VQVBTRF9GV19UUkdfRlJBTUVTCisKKyNpZmRlZiBXTEFOX1BFUkYKKyAgcFdESUN0eC0+dUJkU2lnU2VyaWFsTnVtID0gMDsKKyNlbmRpZgorCisgIHBBbXNkdVJ4QmRGaXhNYXNrID0gJnBXRElDdHgtPndkaVJ4QW1zZHVCZEZpeE1hc2s7CisKKyAgd3BhbE1lbW9yeUZpbGwocEFtc2R1UnhCZEZpeE1hc2ssc2l6ZW9mKFdESV9SeEJkVHlwZSksIDB4ZmYpOworCisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5wZW51bHRpbWF0ZVBkdUlkeCA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5oZWFkUGR1SWR4ICAgICAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT50YWlsUGR1SWR4ICAgICAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5tcGR1SGVhZGVyTGVuZ3RoICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5tcGR1SGVhZGVyT2Zmc2V0ICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5tcGR1RGF0YU9mZnNldCAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5wZHVDb3VudCAgICAgICAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5tcGR1TGVuZ3RoICAgICAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5hc2YgICAgICAgICAgICAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5lc2YgICAgICAgICAgICAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5sc2YgICAgICAgICAgICAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5wcm9jZXNzT3JkZXIgICAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5zeWJGcmFtZUlkeCAgICAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT50b3RhbE1zZHVTaXplICAgICA9IDA7CisgIHBBbXNkdVJ4QmRGaXhNYXNrLT5hZHVGZWVkYmFjayAgICAgICA9IDA7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKK30vKldESV9EUF9VdGlsc0luaXQqLworCisKKy8qKgorIEBicmllZiBXRElfRFBfVXRpbHNFeGl0IC0gQ2xlYXJzIHRoZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIHRvCisgICAgICAgIGludGVyYWN0IHdpdGggdGhlIGRhdGEgcGF0aAorICAKKyBAcGFyYW0gICAgICAgcFdESUN0eDogICAgcG9pbnRlciB0byB0aGUgbWFpbiBXREkgQ3RybCBCbG9jaworICAKKyBAcmV0dXJuICAgc3VjY2VzcyBhbHdheXMKKyovCitXRElfU3RhdHVzCitXRElfRFBfVXRpbHNFeGl0CisoIAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eAorKQoreworICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKK30vKldESV9EUF9VdGlsc0V4aXQqLworCisvKioKKyBAYnJpZWYgV0RJX1N3YXBCeXRlcyAtIFN3YXAgQnl0ZXMgb2YgYSBnaXZlbiBidWZmZXIKKyAgCisgQHBhcmFtICBwQmQ6ICAgIGJ1ZmZlciB0byBiZSBzd2FwcGVkIAorICAgICAgICAgbmJTd2FwOiBudW1iZXIgb2YgYnl0ZXMgdG8gc3dhcAorICAKKyBAcmV0dXJuICAgbm9uZQorKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSB2b2lkIAorV0RJX1N3YXBCeXRlcworKAorICAgIHdwdF91aW50OCAqcEJkLCAKKyAgICB3cHRfdWludDMyIG5iU3dhcAorKQoreworICB3cHRfdWludDMyICpwVTMyOworICB3cHRfdWludDMyIG5VMzI7CisgIHdwdF91aW50MzIgd2M7CisKKyAgblUzMiA9ICgoKG5iU3dhcCkgKyAzKT4+Mik7CisKKyAgcFUzMiA9ICh3cHRfdWludDMyICopcEJkOworICBmb3IgKCB3YyA9IDA7IHdjIDwgblUzMjsgd2MrKyApCisgIHsKKyAgICBwVTMyWyB3YyBdID0gV1BBTF9CRTMyX1RPX0NQVSggcFUzMlsgd2MgXSApOworICB9Cit9LypXRElfU3dhcEJ5dGVzKi8KKworLyoqCisgQGJyaWVmIFdESV9CbXVHZXRRaWRGb3JRT1NUaWQgLSByZXR1cm5zIHRoZSBCTVUgUUlEIGZvciBhIGdpdmVuIAorICAgICAgICBUSUQKKyAKKyBAcGFyYW0gIHVjVGlkOiAgVElECisgICAgICAgICBwUWlkOiAgIG91dCBRSUQKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9CbXVHZXRRaWRGb3JRT1NUaWQKKygKKyAgICB3cHRfdWludDggICB1Y1RpZCwgCisgICAgd3B0X3VpbnQ4KiAgcFFpZAorKQoreworICAgIGlmICh1Y1RpZCA+IEJUUU1fUVVFVUVfVFhfVElEXzcgKQorICAgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIAorICAgICpwUWlkID0gYnRxbVFvc1RpZDJRaWRNYXBwaW5nW3VjVGlkXTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworfS8qV0RJX0JtdUdldFFpZEZvclFPU1RpZCovCisKKyNpZmRlZiBXTEFOX1BFUkYKKworLyoqCisgQGJyaWVmIFdESV9Db21wdXRlVHhCZFNpZ25hdHVyZSAtIGNvbXB1dGVzIHRoZSBCRCBzaWduYXR1cmUKKyAgCisgQHBhcmFtICAgcFdESUN0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIFdESSBjb250ZXh0OworIAorICAgIHBEZXN0TWFjQWRkcjogICBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcworICAgIAorICAgIHVjVGlkOiAgICAgICAgICAgIFRJRCBvZiB0aGUgZnJhbWUKKworICAgIHVjRGlzYWJsZUZybVh0bDogIFVuaWNhc3QgZGVzdGluYXRpb24KKyAgCisgQHJldHVybiAgIHRoZSBzaWduYXR1cmUKKyovCitzdGF0aWMgd3B0X3VpbnQzMiAKK1dESV9Db21wdXRlVHhCZFNpZ25hdHVyZQorKCAgCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICAgIHdwdF91aW50OCogICAgICAgICAgICAgcERlc3RNYWMsIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNUaWQsIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNVbmljYXN0RHN0CispCit7CisgICAgd3B0X3VpbnQxNiAqcE1hY1UxNiA9ICh3cHRfdWludDE2ICopIHBEZXN0TWFjOworCisgICAgcmV0dXJuICgocE1hY1UxNlswXSBeIHBNYWNVMTZbMV0gXiBwTWFjVTE2WzJdKTw8IFdESV9UWEJEX1NJR19NQUNBRERSX0hBU0hfT0ZGU0VUIHwKKyAgICAgICAgcFdESUN0eC0+dUJkU2lnU2VyaWFsTnVtIDw8IFdESV9UWEJEX1NJR19TRVJJQUxfT0ZGU0VUIHwgCisgICAgICAgIHVjVGlkIDw8IFdESV9UWEJEX1NJR19USURfT0ZGU0VUIHwKKyAgICAgICAgdWNVbmljYXN0RHN0IDw8IFdESV9UWEJEX1NJR19VQ0FTVF9EQVRBX09GRlNFVCk7Cit9LypXRElfQ29tcHV0ZVR4QmRTaWduYXR1cmUqLworCisKKy8qKgorIEBicmllZiBXRElfVHhCZEZhc3RGd2QgLSBldmFsdWF0ZXMgaWYgYSBmcmFtZSBjYW4gYmUgZmFzdCAKKyAgICAgICAgZm9yd2FyZGVkIAorICAKKyBAcGFyYW0gICBwV0RJQ3R4OiBDb250ZXh0IHRvIHRoZSBXREkgCisgICAgICAgICAgcERlc3RNYWM6IERlc3RpbmF0aW9uIE1BQworICAgICAgICAgIHVjVGlkOiBwYWNrZXQgVElEIHBCREhlYWRlcgorICAgICAgICAgIHVjVW5pY2FzdERzdDogaXMgcGFja2V0IHVuaWNhc3QKKyAgICAgICAgICBwVHhCZDogICAgICAgcG9pbnRlciB0byB0aGUgQkQgaGVhZGVyCisgICAgICAgICAgdXNNcGR1TGVuZ3RoOiBsZW4gCisgIAorIEByZXR1cm4gMSAtIGlmIHRoZSBmcmFtZSBjYW4gYmUgZmFzdCBmd2QtZWQgOyAwIGlmIG5vdCAKKyovCit3cHRfdWludDMyIAorV0RJX1R4QmRGYXN0RndkCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LAorICAgIHdwdF91aW50OCogICAgICAgICAgICAgcERlc3RNYWMsIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNUaWQsIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNVbmljYXN0RHN0LCAKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgIHBUeEJkLCAKKyAgICB3cHRfdWludDE2ICAgICAgICAgICAgIHVzTXBkdUxlbmd0aCAKKyApCit7CisgICAgV0RJX1R4QmRUeXBlKiAgICAgcEJkICAgICAgPSAoV0RJX1R4QmRUeXBlKikgcFR4QmQ7CisgICAgd3B0X3VpbnQzMiAgICAgICAgdVJldHZhbCAgPSAwOworI2lmZGVmIFdQVF9MSVRUTEVfQllURV9FTkRJQU4KKyAgICB3cHRfdWludDE2ICAgICAgICB1c1N3YXBwZWQ7IAorICAgIHdwdF91aW50MTYqICAgICAgIHBVMTYgICAgID0gKHdwdF91aW50MTYgKikgcFR4QmQ7CisjZW5kaWYKKworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgIGlmKCBwQmQtPnR4QmRTaWduYXR1cmUgPT0gIAorICAgICAgICBXRElfQ29tcHV0ZVR4QmRTaWduYXR1cmUocFdESUN0eCwgcERlc3RNYWMsIHVjVGlkLCB1Y1VuaWNhc3REc3QpKQorICAgIHsKKworI2lmZGVmIFdQVF9MSVRUTEVfQllURV9FTkRJQU4KKyAgICAgICAvKiBXaGVuIHN3YXAgdG8gQkUgZm9ybWF0LCBtcGR1TGVuZ3RoIGZpZWxkIGlzIGF0IDh0aCBXT1JEIGxvY2F0aW9uKDE2dGggYnl0ZSkgKi8KKyAgICAgICB1c1N3YXBwZWQgPSB3cHRfY3B1X3RvX2JlMTYodXNNcGR1TGVuZ3RoKTsgCisgICAgICAgcFUxNls4XSAgID0gdXNTd2FwcGVkOworI2Vsc2UKKyAgICAgICAgLyogUmVtb3ZlIHRoZSAjZXJyb3Igd2hlbiBwb3J0ZWQgdG8gYSByZWFsIEJJRyBFTkRJQU4gbWFjaGluZSAqLworICAgICAgIC8vICNlcnJvciAiSXMgaG9zdCBieXRlIG9yZGVyIHJlYWxseSBCSUcgZW5kaWFuPyIKKyAgICAgICAvKiBXaGVuIGhvc3QgaXMgYWxyZWFkeSBpbiBCRSBmb3JtYXQsIG5vIHN3YXBwaW5nIG5lZWRlZC4qLworICAgICAgIHBCZC0+bXBkdUxlbmd0aCA9IHVzTXBkdUxlbmd0aDsKKyNlbmRpZgorICAgICAgIHVSZXR2YWwgPSAxOworICAgIH0KKyAgICByZXR1cm4gdVJldHZhbCA7Cit9LypXRElfVHhCZEZhc3RGd2QqLworCisjZW5kaWYgLypXTEFOX1BFUkYqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBBUEkgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgQGJyaWVmICAgV0xBTkhBTF9GaWxsVHhCZCAtIENhbGxlZCBieSBUTCB0byBmaWxsIGluIFR4QkQuIAorCisgICAgRm9sbG93aW5nIGFyZSB0aGUgaGlnaGxpZ2h0cyBvZiB0aGUgZnVuY3Rpb24KKworICAgIDEuIEFsbCB1bmljYXN0IGRhdGEgcGFja2V0cyBhcmUgc2VudCBieSBkYXRhIHJhdGUgZGVjaWRlZCBieSBUUEUuCisgICAgKGkuZSBCRCByYXRlcyBhcmUgZGlzYWJsZWQpLgorIAorICAgIDIuIEFsbCB1L21jYXN0IG1hbmFnZW1lbnQgcGFja2V0cyB3b3VsZCBnbyBpbiBCcm9hZGNhc3QKKyAgICBNYW5hZ2VtZW50IFJhdGVzCisgCisgICAgMy4gZHB1TkUgd291bGQgYmUgZGlzYWJsZWQgZm9yIGFsbCBkYXRhIHBhY2tldHMKKyAKKyAgICA0LiBkcHVORSB3b3VsZCBiZSBlbmFibGVkIGZvciBhbGwgbWFuYWdlbWVudCBwYWNrZXRzCisgICAgZXhjbHVkaW5nIHBhY2tldHMgd2hlbiBSTUYgaXMgZW5hYmxlZAorIAorICAgIDUuIFFJRDggYXQgc2VsZiBTVEEgaXMgZm9yIGJyb2FkY2FzdCBkYXRhIHdoaWNoIHVzZXMgbm8gQUNLCisgICAgcG9saWN5LgorIAorICAgIDYuIFFJRDkgYXQgc2VsZiBTVEEsIHdlIHVzZSBpdCBmb3IgdW5pY2FzdCBtZ210IGFuZCBzZXQgQUNLCisgICAgcG9saWN5IHRvIG5vcm1hbCBBQ0suCisgCisgICAgNy4gUUlEMTAgYXQgc2VsZiBTVEEsIHdlIHVzZSBpdCBmb3IgYi9tY2FzdCBtZ210IGFuZCBzZXQgQUNLCisgICAgcG9saWN5IHRvIE5PIEFDSy4KKyAKKyAgICBXREkgRFAgVXRpbGl0aWVzIG1vZHVsZXMgbXVzdCBiZSBpbml0aWF0aWxpemVkIGJlZm9yZSB0aGlzCisgICAgQVBJIGNhbiBiZSBjYWxsZWQuCisgCisgICBAcGFyYW0KKworICAgIElOCisgICAgcFdESUN0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIFdESSBjb250ZXh0OworIAorICAgIHVjVHlwZVN1YnR5cGU6ICAgIDgwMi4xMSBbNTo0XSB1Y1R5cGUgWzM6MF0gc3VidHlwZQorCisgICAgcERlc3RNYWNBZGRyOiAgIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisgICAgCisgICAgcFRpZDogICAgICAgICAgIHB0ciB0byBUSUQgb2YgdGhlIGZyYW1lCisKKyAgICB1Y0Rpc2FibGVGcm1YdGw6ICBXaGVuIHNldCwgZGlzYWJsZXMgVU1BIEhXIGZyYW1lCisgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uIGFuZCBXREkgbmVlZHMgdG8gZmlsbCBpbiBhbGwgQkQKKyAgICAgICAgICAgICAgICAgICAgZmllbGRzLiBXaGVuIG5vdCBzZXQsIFVNQSBwZXJmb3JtcyBCRAorICAgICAgICAgICAgICAgICAgICBmaWxsaW5nIGFuZCBmcmFtZSB0cmFuc2xhdGlvbgorCisgICAgcFR4QmQ6ICAgICAgICAgIHB0ciB0byB0aGUgVHhCRAorCisgICAgdWNUeEZsYWc6ICAgIGRpZmZlcmVudCBvcHRpb24gc2V0dGluZyBmb3IgVFguCisKKyAgICB1VGltZVN0YW1wOiAgICAgIFRpbWVzdGFtcCB3aGVuIHRoZSBmcmFtZSB3YXMgcmVjZWl2ZWQgZnJvbSBIREQuICh1c2VjKQorICAgCisgICBAcmV0dXJuCisgICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gIAorIAorKi8KKworV0RJX1N0YXR1cworV0RJX0ZpbGxUeEJkCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAKKyAgICB3cHRfdWludDggICAgICAgICAgICAgIHVjVHlwZVN1YnR5cGUsIAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgcERlc3RNYWNBZGRyLAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgcEFkZHIyLAorICAgIHdwdF91aW50OCogICAgICAgICAgICAgcFRpZCwgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y0Rpc2FibGVGcm1YdGwsIAorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgcFR4QmQsIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNUeEZsYWcsIAorICAgIHdwdF91aW50MzIgICAgICAgICAgICAgdVRpbWVTdGFtcCwKKyAgICB3cHRfdWludDgqICAgICAgICAgICAgIHN0YUluZGV4CispCit7CisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1RpZCAgICAgICAgPSAqcFRpZDsgCisgICAgV0RJX1R4QmRUeXBlKiAgICAgICAgICBwQmQgICAgICAgICAgPSAoV0RJX1R4QmRUeXBlKikgcFR4QmQ7CisgICAgV0RJX1N0YXR1cyAgICAgICAgICAgICB3ZGlTdGF0dXMgICAgPSBXRElfU1RBVFVTX1NVQ0NFU1M7CisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1VuaWNhc3REc3QgPSAwOworICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNUeXBlICAgICAgID0gMDsKKyAgICB3cHRfdWludDggICAgICAgICAgICAgIHVjU3ViVHlwZSAgICA9IDA7CisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y0lzUk1GICAgICAgPSAwOworICAgIFdESV9CU1NTZXNzaW9uVHlwZSogICAgcEJTU1NlczsKKyAgICB3cHRfdWludDggICAgICAgICAgICAgIHVjU1RBVHlwZSAgID0gMDsKKyNpZmRlZiBXTEFOX1BFUkYKKyAgICB3cHRfdWludDMyICAgICAgdVR4QmRTaWduYXR1cmUgPSBwQmQtPnR4QmRTaWduYXR1cmU7CisjZW5kaWYKKyAgICB0QU5JX1U4ICAgICAgICAgICAgICAgICB1c2VTdGFSYXRlRm9yQmNhc3RGcmFtZXMgPSAwOworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBHZXQgdHlwZSBhbmQgc3VidHlwZSBvZiB0aGUgZnJhbWUgZmlyc3QgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICB1Y1R5cGUgPSAodWNUeXBlU3VidHlwZSAmIFdESV9GUkFNRV9UWVBFX01BU0spID4+IFdESV9GUkFNRV9UWVBFX09GRlNFVDsKKyAgICB1Y1N1YlR5cGUgPSAodWNUeXBlU3VidHlwZSAmIFdESV9GUkFNRV9TVUJUWVBFX01BU0spOworCisgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwgCisgICAgICAgICAgICAgICAiVHlwZTogJWQvJWQsIE1BQyBTOiAlMDh4LiBNQUMgRDogJTA4eC4sIFRpZD0lZCwgZnJtWGxhdD0lZCwgcFR4QkQ9JTA4eCB1Y1R4RmxhZyAweCVYXG4iLCAKKyAgICAgICAgICAgICAgICB1Y1R5cGUsIHVjU3ViVHlwZSwgCisgICAgICAgICAgICAgICAgKigod3B0X3VpbnQzMiAqKSBwQWRkcjIpLCAKKyAgICAgICAgICAgICAgICooKHdwdF91aW50MzIgKikgcERlc3RNYWNBZGRyKSwgCisgICAgICAgICAgICAgICAgdWNUaWQsIAorICAgICAgICAgICAgICAgIXVjRGlzYWJsZUZybVh0bCwgcFR4QmQsIHVjVHhGbGFnICk7CisKKworICAgIC8vbG9naWMgdG8gZGV0ZXJtaW5lIHRoZSB2ZXJzaW9uIG1hdGNoIGJldHdlZW4gaG9zdCBhbmQgcml2YSB0byBmaW5kIG91dCB3aGVuIHRvIGVuYWJsZSB1c2luZyBTVEEgcmF0ZSBmb3IgYmNhc3QgZnJhbWVzLgorICAgIC8vZGV0ZXJtaW5lIGlmIFJpdmEgdnNlcnNpb24gYW5kIGhvc3QgdmVyc2lvbiBib3RoIGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4wLjIgKG1ham9yLCBtaW5vciwgdmVyc2lvbikuIGlmIHllcyB0aGVuIHVzZSBTVEEgcmF0ZSAKKyAgICAvLyBpbnN0ZWFkIG9mIEJEIHJhdGUgZm9yIEJDL01DIGZyYW1lcy4gT3RoZXJ3aXNlIHVzZSBvbGQgY29kZSB0byB1c2UgQkQgcmF0ZSBpbnN0ZWFkLgorICAgIHsgICAgCisgICAgICAgIGlmIChXREFfSXNXY25zc1dsYW5Db21waWxlZFZlcnNpb25HcmVhdGVyVGhhbk9yRXF1YWwoMCwgMCwgMiwgMCkgJiYKKyAgICAgICAgICAgIFdEQV9Jc1djbnNzV2xhblJlcG9ydGVkVmVyc2lvbkdyZWF0ZXJUaGFuT3JFcXVhbCgwLCAwLCAyLCAwKSkKKyAgICAgICAgICAgIHVzZVN0YVJhdGVGb3JCY2FzdEZyYW1lcyA9IDE7CisgICAgfQorCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgKiBTZXQgY29tbW9uIGZpZWxkcyBpbiBUeEJECisgICAgICogICAgIGJkdDogYWx3YXlzIEhXQkRfVFlQRV9HRU5FUklDCisgICAgICAgICAgIGRwdVJGOiBUaGlzIGlzIG5vdCB1c2VkIGluIEdlbjYgc2luY2UgYWxsIFdRcyBhcmUgZXhwbGljaXRseQorICAgICAgICAgICBwcm9ncmFtbWVkIHRvIGVhY2ggSFcgbW9kdWxlCisgICAgICogICAgIHVjVGlkOiBmcm9tIGNhbGxlciwgaWdub3JlZCBpZiBmcmFtZSBpcyBNR01UIGZyYW1lCisgICAgICogICAgIGZ3VHhDb21wbGV0ZTA6IGFsd2F5cyBzZXQgdG8gMAorICAgICAqICAgICB0eENvbXBsZXRlMTogSWYgVHhDb21wIGlucnMgIGlzIHJlcXVlc3RlZCwgZW5hYmxlIFR4Q29tcGxldGUgaW50ZXJydXB0CisgICAgICogICAgIGRwdUZlZWRiYWNrL2FkdUZlZWRiYWNrL3Jlc2VydmVkMjogQWx3YXlzIHNldCB0byAwCisgICAgICAgICAgIGFwOiBBQ0sgcG9saWN5IHRvIGJlIHBsYWNlZCBpbiBRb3MgY3RybCBmaWVsZC4gSWdub3JlZCBieSBIVyBpZiBub24KKyAgICAgICAgICAgUW9zIHVjVHlwZSBmcmFtZXMuCisgICAgICAgICAgIHUvYjogSWYgQWRkcjEgb2YgdGhpcyBmcmFtZSBpbiBpdHMgODAyLjExIGZvcm0gaXMgdW5pY2FzdCwgc2V0IHRvIDAuCisgICAgICAgICAgIE90aGVyd2lzZSBzZXQgdG8gMS4KKyAgICAgICAgICAgZHB1TkU6IGFsd2F5cyBzZXQgdG8gMC4gRFBVIGFsc28gdXNlcyB0aGUgcHJpdmFjeSBiaXQgaW4gODAyLjExIGhkcgorICAgICAgICAgICBmb3IgZW5jcnlwdGlvbiBkZWNpc2lvbgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcEJkLT5iZHQgICA9IEhXQkRfVFlQRV9HRU5FUklDOyAKKworI2lmZGVmIEZFQVRVUkVfV0xBTl9VQVBTRF9GV19UUkdfRlJBTUVTCisgICAgLy8gUm91dGUgYWxsIHRyaWdnZXIgZW5hYmxlZCBmcmFtZXMgdG8gRlcgV1EsIGZvciBGVyB0byBzdXNwZW5kIHRyaWdnZXIgZnJhbWUgZ2VuZXJhdGlvbiAKKyAgICAvLyB3aGVuIG5vIHRyYWZmaWMgaXMgZXhpc3RzIG9uIHRyaWdnZXIgZW5hYmxlZCBBQ3MKKyAgICBpZih1Y1R4RmxhZyAmIFdESV9UUklHR0VSX0VOQUJMRURfQUNfTUFTSykgeworICAgICAgICBwQmQtPmRwdVJGID0gcFdESUN0eC0+dWNEcHVSRjsgCisgICAgfSBlbHNlIAorI2VuZGlmIC8vRkVBVFVSRV9XTEFOX1VBUFNEX0ZXX1RSR19GUkFNRVMKKyAgICB7CisgICAgICAgIHBCZC0+ZHB1UkYgPSBCTVVXUV9CVFFNX1RYX01HTVQ7IAorICAgIH0KKworCisgICAgcEJkLT50aWQgICAgICAgICAgID0gdWNUaWQ7IAorICAgIC8vIENsZWFyIHRoZSByZXNlcnZlZCBmaWVsZCBhcyB0aGlzIGZpZWxkIGlzIHVzZWQgZm9yIGRlZmluaW5nIHNwZWNpYWwgCisgICAgLy8gZmxvdyBjb250cm9sIEJELgorICAgIHBCZC0+cmVzZXJ2ZWQ0ID0gMDsKKyAgICBwQmQtPmZ3VHhDb21wbGV0ZTAgPSAwOworCisgICAgLyogVGhpcyBiaXQgaXMgZm9yIGhvc3QgdG8gcmVnaXN0ZXIgVHhDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICBwQmQtPnR4Q29tcGxldGUxICAgPSAodWNUeEZsYWcgJiBXRElfVFhDT01QX1JFUVVFU1RFRF9NQVNLKSA/IDEgOiAwOyAKKworICAgIHBCZC0+YXAgICAgPSBXRElfQUNLUE9MSUNZX0FDS19SRVFVSVJFRDsgCisgICAgcEJkLT5kcHVORSA9IFdESV9OT19FTkNSWVBUSU9OX0RJU0FCTEVEOyAgCisKKyAgICB1Y1VuaWNhc3REc3QgPSAhKCgod3B0X3VpbnQ4ICopcERlc3RNYWNBZGRyKVswXSAmIDB4MDEpOyAgICAKKyAgICAqKCh3cHRfdWludDMyICopcEJkICsgV0RJX0RQVV9GRUVEQkFDS19PRkZTRVQpID0gMDsKKworICAgIGlmKCF1Y1VuaWNhc3REc3QpCisgICAgeworICAgICAgcEJkLT5hcCAgICA9IFdESV9BQ0tQT0xJQ1lfQUNLX05PVFJFUVVJUkVEOyAKKyAgICB9CisKKyAgICBpZiAodWNUeXBlID09IFdESV9NQUNfREFUQV9GUkFNRSkKKyAgICB7CisKKyAgICAgICAgLyogU2V0IGNvbW1vbiBmaWVsZHMgZm9yIGRhdGEgZnJhbWVzIChyZWdhcmRsZXNzIEZUIGVuYWJsZS9kaXNhYmxlKQorICAgICAgICAgKiAgICAgYmRfc3NuOiBMZXQgRFBVIGF1dG8gZ2VuZXJhdGUgc2VxICMgaWYgUW9zRGF0YSBmcmFtZS4gQWxsIG90aGVyCisgICAgICAgICAgICAgICBmcmFtZXMgRFBVIGdlbmVyYXRlcyBzZXEgdXNpbmcgbm9uUW9zIGNvdW50ZXIuCisgICAgICAgICAgICAgICBGb3IgUW9zTnVsbCwgZG9uJ3Qgb2NjdXB5IG9uZSBRb3Mgc2VxICMgdG8gYXZvaWQgYSBwb3RlbnRpYWwgCisgICAgICAgICAgICAgICBob2xlIHNlZW4gaW4gcmVvcmRlciBidWZmZXIgd2hlbiBCQSBpcyBlbmFibGVkLgorIAorICAgICAgICAgKiAgICAgYmRfcmF0ZTpIVyBkZWZhdWx0IG9yIGJyb2FkY2FzdCBkYXRhIHJhdGUKKyAgICAgICAgICogICAgIHJtZjogICAgUk1GIGRvZXNuJ3QgYXBwbHkgZm9yIGRhdGEgZnJhbWVzLiBBbHdheXMgc2V0IHRvIDAKKyAgICAgICAgICogICAgIHUvYjogSWYgQWRkcjEgb2YgdGhpcyBmcmFtZSBpbiBpdHMgODAyLjExIGZvcm0gaXMgdW5pY2FzdCwKKyAgICAgICAgICAgICAgIHNldCB0byAwLiBPdGhlcndpc2Ugc2V0IHRvIDEuCisgICAgICAgICAqIFNhbml0eTogRm9yY2UgZGlzYWJsZSBIVyBmcmFtZSB0cmFuc2xhdGlvbiBpZiBpbmNvbWluZyBmcmFtZSBpcworICAgICAgICAgICBOVUxMIGRhdGEgZnJhbWUKKyAgICAgICAgICovCisKKyAgICAgICAgaWYgKCh1Y1N1YlR5cGUgJiBXRElfTUFDX0RBVEFfUU9TX0RBVEEpJiYKKyAgICAgICAgICAgICh1Y1N1YlR5cGUgIT0gV0RJX01BQ19EQVRBX1FPU19OVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgcEJkLT5iZF9zc24gPSBXRElfVFhCRF9CRF9TU05fRklMTF9EUFVfUU9TOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJkLT5iZF9zc24gPSBXRElfVFhCRF9CRF9TU05fRklMTF9EUFVfTk9OX1FPUzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVuaWNhc3QvTWNhc3QgZGVjaXNpb246CisgICAgICAgICAqICBJbiBJbmZyYSBTVEEgcm9sZSwgYWxsIGZyYW1lcyB0byBBUCBhcmUgdW5pY2FzdCBmcmFtZXMuCisgICAgICAgICAqICBGb3IgSUJTUywgdGhlbiBjaGVjayB0aGUgYWN0dWFsIERBIE1BQyBhZGRyZXNzIAorICAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgbXVsdGkgQlNTIGFuZCBBUCBjYXNlLgorICAgICAgICAgICAgaWYoZVNZU1RFTV9TVEFfSU5fSUJTU19ST0xFID09IHN5c3RlbVJvbGUpIAorICAgICAgICAgICAgdWNVbmljYXN0RHN0ID0gISgoKHdwdF91aW50OCAqKXBEZXN0TWFjQWRkcilbMF0gJiAweDAxKTsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVjVW5pY2FzdERzdCA9IFdESV9ERUZBVUxUX1VOSUNBU1RfRU5BQkxFRDsKKyAKKyAgICAgICAgICAgIFRoZSBhYm92ZSBpcyAgb3JpZ2luYWwgSEFMIGNvZGUgLSBob3dldmVyIHRvIG1ha2UgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIG1vcmUgZWxhc3RpYyBhbmQgc3VwcG9ydGl2ZSBvZiBjb25jdXJyZW5jeSBzY2VuYXJpb3Mgd2Ugc2hhbGwganVzdAorICAgICAgICAgICAgYXNzdW1lIHRoYXQgYmNhc3QgYml0IG9mIE1BQyBhZGRkcmVzcyBjYW5ub3QgYmUgc2V0IGlmIGFkZHIgaXMgbm90CisgICAgICAgICAgICBiY2FzdDogKCEhIG1heSB3YW50IHRvIHJldmlzaXQgdGhpcyBkdXJpbmcgdGVzdGluZykgCisgICAgICAgICAqLworCisgICAgICAgIC8vQnJvYWRjYXN0IGZyYW1lcyBidWZmZXJpbmcgZG9uJ3Qgd29yayB3ZWxsIGlmIEJEIHJhdGUgaXMgdXNlZCBpbiBBUCBtb2RlLgorICAgICAgICAvL2Fsd2F5cyB1c2UgU1RBIHJhdGUgZm9yIGRhdGEgZnJhbWVzLgorICAgICAgICAvL25ldmVyIHVzZSBCRCByYXRlIGZvciBCQy9NQyBmcmFtZXMgaW4gQVAgbW9kZS4KKworCisgICAgICAgIGlmICh1c2VTdGFSYXRlRm9yQmNhc3RGcmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCZC0+YmRSYXRlID0gV0RJX1RYQkRfQkRSQVRFX0RFRkFVTFQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQmQtPmJkUmF0ZSA9ICh1Y1VuaWNhc3REc3QpPyBXRElfVFhCRF9CRFJBVEVfREVGQVVMVCA6IFdESV9CRFJBVEVfQkNEQVRBX0ZSQU1FOworICAgICAgICB9CisgICAgICAgIHBCZC0+cm1mICAgID0gV0RJX1JNRl9ESVNBQkxFRDsgICAgIAorCisgICAgICAgIC8qIHNhbml0eTogTWlnaHQgYWxyZWFkeSBiZSBzZXQgYnkgY2FsbGVyLCBidXQgZW5mb3JjZSBpdCBoZXJlIGFnYWluICovCisgICAgICAgIGlmKCBXRElfTUFDX0RBVEFfTlVMTCA9PSAodWNTdWJUeXBlICYgfldESV9NQUNfREFUQV9RT1NfREFUQSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjRGlzYWJsZUZybVh0bCA9IDE7CisgICAgICAgICAgICBpZiAodWNUeEZsYWcgJiBXRElfVFhDT01QX1JFUVVFU1RFRF9NQVNLKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlNlbmQgdG8gRlcgdG8gdHJhbnNtaXQgTlVMTCBmcmFtZXMuKi8KKyAgICAgICAgICAgICAgICBwQmQtPmRwdVJGID0gQk1VV1FfRldfVFJBTlNNSVQ7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworI2lmZGVmIExJQlJBX1dBUElfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmICh1Y1R4RmxhZyAmIFdESV9XQVBJX1NUQV9NQVNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJkLT5kcHVSRiA9IEJNVVdRX1dBUElfRFBVX1RYOworICAgICAgICAgICAgICAgICAgICAvKnNldCBORSBiaXQgdG8gMSBmb3IgdGhlIG51bGwvcW9zIG51bGwgZnJhbWVzKi8KKyAgICAgICAgICAgICAgICAgICAgcEJkLT5kcHVORSA9IFdESV9OT19FTkNSWVBUSU9OX0VOQUJMRUQ7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICB9CisjaWYgZGVmaW5lZChXTEFOX1BFUkYpIHx8IGRlZmluZWQoRkVBVFVSRV9XTEFOX1dBUEkpIHx8IGRlZmluZWQoTElCUkFfV0FQSV9TVVBQT1JUKQorICAgICAgICAvL0ZvciBub3QtTlVMTCBkYXRhIGZyYW1lcworICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorICAgICAgICAgICAgLy9JZiBjYWxsZXIgZG9lc24ndCB3YW50IHRoaXMgZnJhbWUgdG8gYmUgZW5jcnlwdGVkLCBmb3IgZXhhbXBsZSwgV0FJIHBhY2tldHMKKyAgICAgICAgICAgIGlmKCAodWNUeEZsYWcgJiBXRElfVFhfTk9fRU5DUllQVElPTl9NQVNLKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJkLT5kcHVORSA9IFdESV9OT19FTkNSWVBUSU9OX0VOQUJMRUQ7CisgICAgICAgICAgICB9CisjZW5kaWYgLy9kZWZpbmVkKEZFQVRVUkVfV0xBTl9XQVBJKQorI2lmZGVmIExJQlJBX1dBUElfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHVjVHhGbGFnICYgV0RJX1dBUElfU1RBX01BU0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJkLT5kcHVSRiA9IEJNVVdRX1dBUElfRFBVX1RYOworICAgICAgICAgICAgfQorI2VuZGlmIC8vTElCUkFfV0FQSV9TVVBQT1JUCisjaWYgZGVmaW5lZChXTEFOX1BFUkYpCisgICAgdVR4QmRTaWduYXR1cmUgPSBXRElfQ29tcHV0ZVR4QmRTaWduYXR1cmUocFdESUN0eCwgcERlc3RNYWNBZGRyLCB1Y1RpZCwgdWNVbmljYXN0RHN0KTsKKyNlbmRpZiAvL2RlZmluZWQoV0xBTl9QRVJGKQorICAgICAgICB9CisjZW5kaWYgICAgICAgIAorICAgIH0KKyAgICBlbHNlIGlmICh1Y1R5cGUgPT0gV0RJX01BQ19NR01UX0ZSQU1FKQorICAgIHsKKworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAqICBTZXQgY29tbW9uIGZpZWxkcyBmb3IgbWdtdCBmcmFtZXMKKyAgICAgICAgICogICAgIGJkX3NzbjogQWx3YXlzIGxldCBEUFUgYXV0byBnZW5lcmF0ZSBzZXEgIyBmcm9tIHRoZSBub25Rb3MKKyAgICAgICAgICAgICAgIHNlcXVlbmNlIG51bWJlciBjb3VudGVyLgorICAgICAgICAgKiAgICAgYmRfcmF0ZTp1bmljYXN0IG1nbXQgZnJhbWVzIHdpbGwgZ28gYXQgbG93ZXIgcmF0ZSAobXVsdGljYXN0IHJhdGUpLgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgIG11bHRpY2FzdCBtZ210IGZyYW1lcyB3aWxsIGdvIGF0IHRoZSBTVEEgcmF0ZSBhcyBpbiBBUCBtb2RlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgYnVmZmVyaW5nIGhhcyBhbiBpc3N1ZSBhdCBIVyBpZiBCRCByYXRlIGlzIHVzZWQuCisgICAgICAgICAqICAgICBybWY6ICAgIE5PVCBTRVQgaGVyZS4gd291bGQgYmUgc2V0IGxhdGVyIGFmdGVyIFNUQSBpZCBsb29rdXAgaXMgZG9uZS4KKyAgICAgICAgICogU2FuaXR5OiBGb3JjZSBIVyBmcmFtZSB0cmFuc2xhdGlvbiBPRkYgZm9yIG1nbXQgZnJhbWVzLgorICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICAgLyogYXBwbHkgdG8gYm90aCB1Y2FzdC9tY2FzdCBtZ210IGZyYW1lcyAqLworICAgICAgICAgaWYgKHVzZVN0YVJhdGVGb3JCY2FzdEZyYW1lcykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBwQmQtPmJkUmF0ZSA9ICh1Y1VuaWNhc3REc3QpPyBXRElfQkRSQVRFX0JDTUdNVF9GUkFNRSA6IFdESV9UWEJEX0JEUkFURV9ERUZBVUxUOyAKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBwQmQtPmJkUmF0ZSA9IFdESV9CRFJBVEVfQkNNR01UX0ZSQU1FOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoIHVjVHhGbGFnICYgV0RJX1VTRV9CRF9SQVRFMl9GT1JfTUFOQUdFTUVOVF9GUkFNRSkgCisgICAgICAgICB7CisgICAgICAgICAgIHBCZC0+YmRSYXRlID0gV0RJX0JEUkFURV9DVFJMX0ZSQU1FOworICAgICAgICAgfQorCisgICAgICAgICBwQmQtPmJkX3NzbiA9IFdESV9UWEJEX0JEX1NTTl9GSUxMX0RQVV9OT05fUU9TOworICAgICAgICAgaWYoKHVjU3ViVHlwZSA9PSBXRElfTUFDX01HTVRfQUNUSU9OKSB8fCAodWNTdWJUeXBlID09IFdESV9NQUNfTUdNVF9ERUFVVEgpIHx8IAorICAgICAgICAgICAgKHVjU3ViVHlwZSA9PSBXRElfTUFDX01HTVRfRElTQVNTT0MpKQorICAgICAgICAgICAgdWNJc1JNRiA9IDE7CisgICAgICAgICB1Y0Rpc2FibGVGcm1YdGwgPSAxOworICAgIH0gCisgICAgZWxzZSAKKyAgICB7ICAgLy8gQ29udHJvbCBQYWNrZXQKKyAgICAgICAgLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBhIGNvbnRyb2wgcGFja2V0LCBhc3NlcnRpbmcgaGVyZSBzaW5jZSBzb21ldGhpbmcKKyAgICAgICAgaXMgd3JvbmcgKi8KKyAgICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICB9CisKKyAgICBwQmQtPnViID0gIXVjVW5pY2FzdERzdDsKKworICAgIC8qIEZhc3QgcGF0aDogTGV2ZXJhZ2UgVU1BIGZvciBCRCBmaWxsaW5nL2ZyYW1lIHRyYW5zbGF0aW9uLgorICAgICAqIE11c3QgYmUgYSBkYXRhIGZyYW1lIHRvIHJlcXVlc3QgZm9yIEZULgorICAgICAqIFdoZW4gSFcgZnJhbWUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCwgVU1BIGZpbGxzIGluIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorICAgICAqICAgRFBVIFNpZyAKKyAgICAgKiAgIERQVSBkZXNjcmlwdG9yIGluZGV4CisgICAgICogICBVcGRhdGVzIE1QRFUgaGVhZGVyIG9mZnNldCwgZGF0YSBvZmZzZXQsIE1QRFUgbGVuZ3RoIGFmdGVyIHRyYW5zbGF0aW9uCisgICAgICogICBTVEEgaWQKKyAgICAgKiAgIEJUUU0gUXVldWUgSUQKKyAgICAgKi8KKworICAgIHBCZC0+ZnQgPSBwV0RJQ3R4LT5iRnJhbWVUcmFuc0VuYWJsZWQgJiAhdWNEaXNhYmxlRnJtWHRsOworCisgICAgaWYoICFwQmQtPmZ0KQorICAgIHsKKyAgICAgICAgLyogLSBTbG93IHBhdGg6IEZyYW1lIHRyYW5zbGF0aW9uIGlzIGRpc2FibGVkLiBOZWVkIHRvIHNldCB0aGUKKyAgICAgICAgZm9sbG93aW5nIGZpZWxkczoKKyAgICAgICAgICogICAgU1RBIGlkCisgICAgICAgICAqICAgIERQVSBTaWcgCisgICAgICAgICAqICAgIERQVSBkZXNjcmlwdG9yIGluZGV4CisgICAgICAgICAqICAgIEJUUU0gUXVldWUgSUQKKyAgICAgICAgICogLSBGb3IgbWdtdCBmcmFtZXMsIGFsc28gdXBkYXRlIHJtZiBiaXRzCisgICAgICAgICAqLworICAgIAorICAgICAgICBXRElfU3RhU3RydWN0KiAgcFN0YSA9IChXRElfU3RhU3RydWN0KikgcFdESUN0eC0+c3RhVGFibGU7CisgICAgICAgIHdwdF91aW50OCAgICAgICB1Y1N0YUlkOworCisgICAgICAgIC8qIERpc2FibGUgZnJhbWUgdHJhbnNsYXRpb24qLworICAgICAgICBwQmQtPmZ0ID0gMDsKKyNpZmRlZiBXTEFOX1BFUkYKKyAgICAgICAgLyogTWFyayB0aGUgQkQgY291bGQgbm90IGJlIHJldXNlZCAqLworICAgICAgICB1VHhCZFNpZ25hdHVyZSA9IFdESV9UWEJEX1NJR19NR01UX01BR0lDOyAKKyNlbmRpZgorICAgICAgICBpZih1Y1R4RmxhZyAmIFdESV9VU0VfU0VMRl9TVEFfUkVRVUVTVEVEX01BU0spCisgICAgICAgIHsKKyNpZmRlZiBIQUxfU0VMRl9TVEFfUEVSX0JTUworICAgICAgICAgICAgLy8gR2V0IHRoZSAoc2VsZikgc3RhdGlvbiBpbmRleCBmcm9tIEFERFIyLCB3aGljaCBzaG91bGQgYmUgdGhlIHNlbGYgTUFDIGFkZHIKKyAgICAgICAgICAgd2RpU3RhdHVzID0gV0RJX1NUQVRhYmxlRmluZFN0YWlkQnlBZGRyKCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHdwdF9tYWNBZGRyKilwQWRkcjIsICZ1Y1N0YUlkICk7CisgICAgICAgICAgIGlmIChXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd2RpU3RhdHVzKSAKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsICJXRElfU1RBVGFibGVGaW5kU3RhaWRCeUFkZHIgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgdWNTdGFJZCA9IHBXRElDdHgtPnVjU2VsZlN0YUlkOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgICAgICAgICAgICAgICB8ICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgIE1nbXQgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgfF9fX198X19fX19fX3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198fF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKyAgICAgICAgICAgICAgIHwgICAgfCBNb2RlICB8IERlc3RBZGRyICAgICAgICAgIHwgQWRkcjIgKHNlbGZNYWMpICAgfHwgRGVzdEFkZHIgICAgICAgICAgfCBBZGRyMiAoc2VsZk1hYykgICB8CisgICAgICAgICAgICAgICB8X19fX3xfX19fX19ffF9fX19fX19fX19fX19fX19fX198X19fX19fX19fX19fX19fX19fX3x8X19fX19fX19fX19fX19fX19fX3xfX19fX19fX19fX19fX19fX19ffAorICAgICAgICAgICAgICAgfCAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgIHwgICAgfCBTVEEgICB8IERlc3RBZGRyLT5zdGFJZHggIHwgV2hlbiBEZXN0QWRkciAgICAgfHwgRGVzdEFkZHItPnN0YUlkeCAgfCAtICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICB8ICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAgICB8IGxvb2t1cCBmYWlscywgICAgIHx8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgfCAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCBBZGRyMi0+c3RhSWR4ICAgICB8fCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgIHxVL0MgfCBJQlNTICB8IERlc3RBZGRyLT5zdGFJZHggIHwgICAgICAgIC0gICAgICAgICAgfHwgRGVzdEFkZHItPnN0YUlkeCAgfCAtICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICB8ICAgIHwgU29mdEFQfCBEZXN0QWRkci0+c3RhSWR4ICB8ICAgICAgICAtICAgICAgICAgIHx8IERlc3RBZGRyLT5zdGFJZHggIHwgV2hlbiBEZXN0QWRkciAgICAgfAorICAgICAgICAgICAgICAgfCAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICB8IGxvb2t1cCBmYWlscywgICAgIHwKKyAgICAgICAgICAgICAgIHwgICAgfCAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgfCBBZGRyMi0+U3RhSWR4ICAgICB8CisgICAgICAgICAgICAgICB8ICAgIHwgSWRsZSAgfCAgICAgTi9BICAgICAgICAgICB8ICAgICAgICBOL0EgICAgICAgIHx8ICAgICAgICAgLSAgICAgICAgIHwgQWRkcjItPlN0YUlkeCAgICAgfAorICAgICAgICAgICAgICAgfF9fX198X19fX19fX3xfX19fX19fX19fX19fX19fX19ffF9fX19fX19fX19fX19fX19fX198fF9fX19fX19fX19fX19fX19fX198X19fX19fX19fX19fX19fX19fX3wKKyAgICAgICAgICAgICAgIHwgICAgfCAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICB8ICAgIHwgU1RBICAgfCAgICAgTi9BICAgICAgICAgICB8ICAgICAgICBOL0EgICAgICAgIHx8ICAgICAgICAgLSAgICAgICAgIHwgQWRkcjItPnN0YUlkeC0+ICAgfAorICAgICAgICAgICAgICAgfCAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICB8IGJzc0lkeC0+YmNhc1N0YUlkeHwKKyAgICAgICAgICAgICAgIHxCL0MgfCBJQlNTICB8ICAgICAtICAgICAgICAgICAgIHwgQWRkcjItPnN0YUlkeC0+ICAgfHwgICAgICAgICAtICAgICAgICAgfCBBZGRyMi0+c3RhSWR4LT4gICB8CisgICAgICAgICAgICAgICB8ICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAgICB8IGJzc0lkeC0+YmNhc1N0YUlkeHx8ICAgICAgICAgICAgICAgICAgIHwgYnNzSWR4LT5iY2FzU3RhSWR4fAorICAgICAgICAgICAgICAgfCAgICB8IFNvZnRBUHwgICAgIC0gICAgICAgICAgICAgfCBBZGRyMi0+c3RhSWR4LT4gICB8fCAgICAgICAgIC0gICAgICAgICB8IEFkZHIyLT5zdGFJZHgtPiAgIHwKKyAgICAgICAgICAgICAgIHwgICAgfCAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgYnNzSWR4LT5iY2FzU3RhSWR4fHwgICAgICAgICAgICAgICAgICAgfCBic3NJZHgtPmJjYXNTdGFJZHh8CisgICAgICAgICAgICAgICB8ICAgIHwgSWRsZSAgfCAgICAgTi9BICAgICAgICAgICB8ICAgICAgICBOL0EgICAgICAgIHx8ICAgICAgICAgLSAgICAgICAgIHwgQWRkcjItPnN0YUlkeC0+ICAgfAorICAgICAgICAgICAgICAgfCAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICB8IGJzc0lkeC0+YmNhc1N0YUlkeHwKKyAgICAgICAgICAgICAgIHxfX19ffF9fX19fX198X19fX19fX19fX19fX19fX19fX3xfX19fX19fX19fX19fX19fX19ffHxfX19fX19fX19fX19fX19fX19ffF9fX19fX19fX19fX19fX19fX198Ki8KKyAgICAgICAgICAgIC8vIEdldCB0aGUgc3RhdGlvbiBpbmRleCBiYXNlZCBvbiB0aGUgYWJvdmUgdGFibGUKKyAgICAgICAgICAgaWYoIHVjVW5pY2FzdERzdCApIAorICAgICAgICAgICB7CisgICAgICAgICAgICAgd2RpU3RhdHVzID0gV0RJX1NUQVRhYmxlRmluZFN0YWlkQnlBZGRyKCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHdwdF9tYWNBZGRyKilwRGVzdE1hY0FkZHIsICZ1Y1N0YUlkICk7IAorICAgICAgICAgICAgICAgLy8gT25seSBjYXNlIHRoaXMgbG9vayB3b3VsZCBmYWlsIHdvdWxkIGJlIGluIFNUQSBtb2RlLCBpbiBBUCAmIElCU1MgbW9kZSAKKyAgICAgICAgICAgICAgIC8vIHRoaXMgbG9vayBzaG91bGQgcGFzcy4gSW4gU1RBIG1vZGUgdGhlIHVuaWNhc3QgZGF0YSBmcmFtZSBjb3VsZCBiZSAKKyAgICAgICAgICAgICAgIC8vIHRyYW5zbWl0dGVkIHRvIGEgRGVzdEFkZHIgZm9yIHdoaWNoIHRoZXJlIG1pZ2h0IG5vdCBiZSBhbiBlbnRyeSBpbiAKKyAgICAgICAgICAgICAgIC8vIEhBTCBTVEEgdGFibGUgYW5kIHRoZSBsb29rdXAgd291bGQgZmFpbC4gSW4gc3VjaCBjYXNlcyB1c2UgdGhlIEFkZHIyIAorICAgICAgICAgICAgICAgLy8gKHNlbGYgTUFDIGFkZHJlc3MpIHRvIGdldCB0aGUgc2VsZlN0YUlkeC4KKworCisgICAgICAgICAgICAgIGlmIChXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd2RpU3RhdHVzKSAKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc3RhdGlvbiBpbmRleCBmb3IgQUREUjIsIHdoaWNoIHNob3VsZCBiZSB0aGUgc2VsZiBNQUMgYWRkcgorICAgICAgICAgICAgICAgIHdkaVN0YXR1cyA9IFdESV9TVEFUYWJsZUZpbmRTdGFpZEJ5QWRkciggcFdESUN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHdwdF9tYWNBZGRyKilwQWRkcjIsICZ1Y1N0YUlkICk7IAorICAgICAgICAgICAgICAgIGlmIChXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd2RpU3RhdHVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIEZvciBiY2FzdCBmcmFtZXMgdXNlIHRoZSBiY2FzdCBzdGF0aW9uIGluZGV4CisgICAgICAgICAgICAgIHdwdF91aW50OCBic3NTZXNzSWR4OworCisgICAgICAgICAgICAgIC8vIEdldCB0aGUgc3RhdGlvbiBpbmRleCBmb3IgQUREUjIsIHdoaWNoIHNob3VsZCBiZSB0aGUgc2VsZiBNQUMgYWRkcgorICAgICAgICAgICAgICB3ZGlTdGF0dXMgPSBXRElfU1RBVGFibGVGaW5kU3RhaWRCeUFkZHIoIHBXRElDdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICood3B0X21hY0FkZHIqKXBBZGRyMiwgJnVjU3RhSWQgKTsgCisgICAgICAgICAgICAgIGlmIChXRElfU1RBVFVTX1NVQ0NFU1MgIT0gd2RpU3RhdHVzKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLy8gR2V0IHRoZSBCc3MgSW5kZXggcmVsYXRlZCB0byB0aGUgc3RhSWQKKyAgICAgICAgICAgICAgYnNzU2Vzc0lkeCA9IHBTdGFbdWNTdGFJZF0uYnNzSWR4OworCisgICAgICAgICAgICAgIC8vIEdldCB0aGUgYnJvYWRjYXN0IHN0YXRpb24gaW5kZXggZm9yIHRoaXMgYnNzCisgICAgICAgICAgICAgICh2b2lkKSBXRElfRmluZEFzc29jU2Vzc2lvbkJ5QlNTSWR4KCBwV0RJQ3R4LCBic3NTZXNzSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQlNTU2VzICk7IAorICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBwQlNTU2VzKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2Vzc2lvbiBub3QgZm91bmQgPyE/CisgICAgICAgICAgICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHVjU3RhSWQgPSBwQlNTU2VzLT5iY2FzdFN0YUlkeDsKKyAgICAgICAgICAgfQorICAgICAgICAgfSAgICAKKworICAgICAgICBwQmQtPnN0YUluZGV4ID0gdWNTdGFJZDsKKyAgICAgICAgCisgICAgICAgICpzdGFJbmRleCA9IHVjU3RhSWQ7CisKKyAgICAgICAgcFN0YSArPSB1Y1N0YUlkOyAgLy8gR28gdG8gdGhlIGN1cnJlc3BvbmRpbmcgc3RhdGlvbidzIHN0YXRpb24gdGFibGUKKworICAgICAgICBpZih1Y1R5cGUgPT0gV0RJX01BQ19NR01UX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodWNVbmljYXN0RHN0KSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBubyBhY2sgaXMgcmVxdWVzdGVkIHVzZSB0aGUgYmNhc3QgcXVldWUgKi8KKyAgICAgICAgICAgICAgICBpZiAodWNUeEZsYWcgJiBXRElfVVNFX05PX0FDS19SRVFVRVNURURfTUFTSykgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQmQtPnF1ZXVlSWQgPSBCVFFNX1FVRVVFX1NFTEZfU1RBX0JDQVNUX01HTVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEFzc2lnbmluZyBRdWV1ZSBJZCBjb25maWd1cmVkIHRvIEFjayAqLyAKKyAgICAgICAgICAgICAgICAgICAgcEJkLT5xdWV1ZUlkID0gQlRRTV9RVUVVRV9TRUxGX1NUQV9VQ0FTVF9NR01UOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEFzc2lnbmluZyB0byBRdWV1ZSBJZCBjb25maWd1cmVkIHRvIE5vIEFjayAqLyAKKyAgICAgICAgICAgICAgICBwQmQtPnF1ZXVlSWQgPSBCVFFNX1FVRVVFX1NFTEZfU1RBX0JDQVNUX01HTVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHVjSXNSTUYgJiYgcFN0YS0+cm1mRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQmQtPnJtZiA9IDE7CisgICAgICAgICAgICAgICAgaWYoIXVjVW5pY2FzdERzdCkKKyAgICAgICAgICAgICAgICAgICAgcEJkLT5kcHVEZXNjSWR4ID0gcFN0YS0+YmNhc3RNZ210RHB1SW5kZXg7IC8qIElHVEsgKi8KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBCZC0+ZHB1RGVzY0lkeCA9IHBTdGEtPmRwdUluZGV4OyAvKiBQVEsgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQmQtPmRwdU5FID0gV0RJX05PX0VOQ1JZUFRJT05fRU5BQkxFRDsgIAorICAgICAgICAgICAgICAgIHBCZC0+cm1mID0gMDsKKyAgICAgICAgICAgICAgICBwQmQtPmRwdURlc2NJZHggPSBwU3RhLT5kcHVJbmRleDsgLyogUFRLIGZvciBib3RoIHUvbWNhc3QgbWdtdCBmcmFtZXMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRhdGEgZnJhbWVzICovCisgICAgICAgICAgICAvKiBUSUQtPlFJRCBpcyBvbmUtdG8tb25lIG1hcHBpbmcsIHRoZSBzYW1lIHdheSBhcyBmb2xsb3dlZCBpbiBIL1cgKi8KKyAgICAgICAgICAgIHdwdF91aW50OCBxdWV1ZUlkID0gMDsKKworICAgCisgICAgICAgICAgICBXRElfU1RBVGFibGVHZXRTdGFUeXBlKHBXRElDdHgsIHVjU3RhSWQsICZ1Y1NUQVR5cGUpOworICAgICAgICAgICAgaWYoIXVjVW5pY2FzdERzdCkKKyAgICAgICAgICAgICAgICBwQmQtPnF1ZXVlSWQgPSBCVFFNX1FJRDA7CisjaWZuZGVmIEhBTF9TRUxGX1NUQV9QRVJfQlNTCisgICAgICAgICAgICBlbHNlIGlmKCB1Y1VuaWNhc3REc3QgJiYgKHVjU3RhSWQgPT0gcFdESUN0eC0+dWNTZWxmU3RhSWQpKQorICAgICAgICAgICAgICAgIHBCZC0+cXVldWVJZCA9IEJUUU1fUVVFVUVfU0VMRl9TVEFfVUNBU1RfREFUQTsKKyNlbHNlCisgICAgICAgICAgICBlbHNlIGlmKCB1Y1VuaWNhc3REc3QgJiYgKHVjU1RBVHlwZSA9PSBXRElfU1RBX0VOVFJZX1NFTEYpKQorICAgICAgICAgICAgICAgIHBCZC0+cXVldWVJZCA9IEJUUU1fUVVFVUVfU0VMRl9TVEFfVUNBU1RfREFUQTsKKyNlbmRpZgorICAgICAgICAgICAgZWxzZSBpZiAocFN0YS0+cW9zRW5hYmxlZCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV0RJX0JtdUdldFFpZEZvclFPU1RpZCggdWNUaWQsICZxdWV1ZUlkKTsgCisgICAgICAgICAgICAgICAgcEJkLT5xdWV1ZUlkID0gKHdwdF91aW50MzIpIHF1ZXVlSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcEJkLT5xdWV1ZUlkID0gQlRRTV9RVUVVRV9UWF9uUU9TOworCisgICAgICAgICAgICBpZih1Y1VuaWNhc3REc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJkLT5kcHVEZXNjSWR4ID0gcFN0YS0+ZHB1SW5kZXg7IC8qdW5pY2FzdCBkYXRhIGZyYW1lczogUFRLKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQmQtPmRwdURlc2NJZHggPSBwU3RhLT5iY2FzdERwdUluZGV4OyAvKiBtY2FzdCBkYXRhIGZyYW1lczogR1RLKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBCZC0+ZHB1U2lnbmF0dXJlID0gcFN0YS0+ZHB1U2lnOworCisgICAgICAgIC8qICEgUmUtYW5hbGl6ZSB0aGlzIGFzc3VtcHRpb24KKyAgICAgICAgLSBvcmlnaW5hbCBjb2RlIGZyb20gSEFMIGlzIGJlbG93IC0gaG93ZXZlciBXREkgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gYQorICAgICAgICBEUFUgaW5kZXggdGFibGUgLSBzbyBpdCBqdXN0IHN0b3JlcyB0aGUgc2lnbmF0dXJlIHRoYXQgaXQgcmVjZWl2ZXMgZnJvbSBIQUwgdXBvbgorICAgICAgICBwb3N0IGFzc29jIAorICAgICAgICBpZihlSEFMX1NUQVRVU19TVUNDRVNTID09IGhhbERwdV9HZXRTaWduYXR1cmUocE1hYywgcFN0YS0+ZHB1SW5kZXgsICZ1Y0RwdVNpZykpCisgICAgICAgICAgICBwQmQtPmRwdVNpZ25hdHVyZSA9IHVjRHB1U2lnOworICAgICAgICBlbHNleyAgIAorICAgICAgICAgICAgV1BBTF9UUkFDRSggV1BUX1dESV9DT05UUk9MX01PRFVMRSwgV1BUX01TR19MRVZFTF9ISUdILCAiaGFsRHB1X0dldFNpZ25hdHVyZSgpIGZhaWxlZCBmb3IgZHB1SWQgPSAlZFxuIiwgcEJkLT5kcHVEZXNjSWR4KSk7CisgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgICAgIH0gKi8KKworICAgIH0gCisgICAgCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBPdmVyIFNESU8gYnVzLCBTSUYgd29uJ3Qgc3dhcCBkYXRhIGJ5dGVzIHRvL2Zyb20gZGF0YSBGSUZPLiAKKyAgICAgICBJbiBvcmRlciBmb3IgTUFDIG1vZHVsZXMgdG8gcmVjb2duaXplIEJEIGluIFJpdmEncyBkZWZhdWx0IGVuZGlhbgorICAgICAgIGZvcm1hdCAoQmlnIGVuZGlhbikKKyAgICAgKiBBbGwgQkQgZmllbGRzIG5lZWQgdG8gYmUgc3dhcGVkIGhlcmUKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBXRElfU3dhcFR4QmQoKHdwdF91aW50OCAqKXBCZCk7IAorCisjaWZkZWYgV0xBTl9QRVJGCisgICAgLyogU2F2ZSB0aGUgQkQgc2lnbmF0dXJlLiBUaGlzIGZpZWxkIHdvbid0IGJlIHN3YXBwZWQgYW5kIHJlbWFpbnMgaW4gaG9zdAorICAgICAgIGJ5dGUgb3JkZXIgKi8KKyAgICBwQmQtPnR4QmRTaWduYXR1cmUgPSB1VHhCZFNpZ25hdHVyZSA7CisjZW5kaWYgICAgICAgIAorICAgIAorICAgIHJldHVybiB3ZGlTdGF0dXM7Cit9LypXRElfRmlsbFR4QmQqLworCisKKy8qKgorIEBicmllZiBXRElfUnhCRF9HZXRGcmFtZVR5cGVTdWJUeXBlIC0gQ2FsbGVkIGJ5IHRoZSBkYXRhIHBhdGggCisgICAgICAgIHRvIHJldHJpZXZlIHRoZSB0eXBlL3N1YnR5cGUgb2YgdGhlIHJlY2VpdmVkIGZyYW1lLgorICAKKyBAcGFyYW0gICAgICAgcHZCREhlYWRlcjogICAgVm9pZCBwb2ludGVyIHRvIHRoZSBSeEJEIGJ1ZmZlci4KKyAgICB1c0ZybUN0cmw6ICAgICB0aGUgZnJhbWUgY3RybCBvZiB0aGUgODAyLjExIGhlYWRlciAKKyAgCisgQHJldHVybiAgIEEgYnl0ZSB3aGljaCBjb250YWlucyBib3RoIHR5cGUgYW5kIHN1YnR5cGUgaW5mby4gTFNCIGZvdXIgYnl0ZXMgCisgKGIwIHRvIGIzKWlzIHN1YnR5cGUgYW5kIGI1LWI2IGlzIHR5cGUgaW5mby4gCisqLworCit3cHRfdWludDggCitXRElfUnhCRF9HZXRGcmFtZVR5cGVTdWJUeXBlCisoCisgICAgdm9pZCogX3B2QkRIZWFkZXIsIAorICAgIHdwdF91aW50MTYgdXNGcm1DdHJsCispCit7CisgICAgV0RJX1J4QmRUeXBlKiAgICBwUnhCZCA9IChXRElfUnhCZFR5cGUqKSBfcHZCREhlYWRlcjsKKyAgICB3cHRfdWludDggICAgICAgIHR5cGVTdWJUeXBlOworICAgIFdESV9NYWNGcmFtZUN0bCAgd2RpRnJtQ3RsOyAKKyAgICAKKyAgICBpZiAocFJ4QmQtPmZ0ICE9IFdESV9SWF9CRF9GVF9ET05FKQorICAgIHsKKyAgICAgICAgaWYgKHBSeEJkLT5hc2YpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVTdWJUeXBlID0gKFdESV9NQUNfREFUQV9GUkFNRSA8PCBXRElfRlJBTUVfVFlQRV9PRkZTRVQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfTUFDX0RBVEFfUU9TX0RBVEE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHdwYWxNZW1vcnlDb3B5KCZ3ZGlGcm1DdGwsICZ1c0ZybUN0cmwsIHNpemVvZih3ZGlGcm1DdGwpKTsgCisgICAgICAgICAgIHR5cGVTdWJUeXBlID0gKHdkaUZybUN0bC50eXBlIDw8IFdESV9GUkFNRV9UWVBFX09GRlNFVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkaUZybUN0bC5zdWJUeXBlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdwYWxNZW1vcnlDb3B5KCZ3ZGlGcm1DdGwsICZ1c0ZybUN0cmwsIHNpemVvZih3ZGlGcm1DdGwpKTsgCisgICAgICAgIHR5cGVTdWJUeXBlID0gKHdkaUZybUN0bC50eXBlIDw8IFdESV9GUkFNRV9UWVBFX09GRlNFVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgd2RpRnJtQ3RsLnN1YlR5cGU7CisgICAgfQorICAgIAorICAgIHJldHVybiB0eXBlU3ViVHlwZTsKK30vKldESV9SeEJEX0dldEZyYW1lVHlwZVN1YlR5cGUqLworCisvKioKKyBAYnJpZWYgV0RJX1N3YXBSeEJkIHN3YXBzIHRoZSBSWCBCRC4KKworICAKKyBAcGFyYW0gcEJkIC0gcG9pbnRlciB0byB0aGUgQkQgKGluL291dCkKKyAgCisgQHJldHVybiBOb25lCisqLwordm9pZCAKK1dESV9Td2FwUnhCZCh3cHRfdWludDggKnBCZCkKK3sKKyNpZm5kZWYgV0RJX0JJR19CWVRFX0VORElBTgorICAgIFdESV9Td2FwQnl0ZXMocEJkICwgV0RJX1JYX0JEX0hFQURFUl9TSVpFKTsKKyNlbmRpZgorfS8qV0RJX1N3YXBSeEJkKi8KKworCisvKioKKyBAYnJpZWYgV0RJX1N3YXBUeEJkIC0gU3dhcHMgdGhlIFRYIEJECisgIAorIEBwYXJhbSAgcEJkIC0gcG9pbnRlciB0byB0aGUgQkQgKGluL291dCkKKyAgCisgQHJldHVybiAgIG5vbmUKKyovCit2b2lkIAorV0RJX1N3YXBUeEJkKHdwdF91aW50OCAqcEJkKQoreworI2lmbmRlZiBXRElfQklHX0JZVEVfRU5ESUFOCisgICAgV0RJX1N3YXBCeXRlcyhwQmQgLCBXRElfVFhfQkRfSEVBREVSX1NJWkUpOworI2VuZGlmCit9LypXRElfU3dhcFR4QmQqLworCisvKiEgVE8gRE86ICAtIGNoZWNrIGlmIHdlIHN0aWxsIG5lZWQgdGhpcyBmb3IgUklWQSovCisvKioKKyBAYnJpZWYgV0RJX1J4QW1zZHVCZEZpeCAtIGZpeCBmb3IgSFcgaXNzdWUgZm9yIEFNU0RVIAorCisgIAorIEBwYXJhbSAgIHBXRElDdHg6ICAgICAgIENvbnRleHQgdG8gdGhlIFdESQorICAgICAgICAgIHBCREhlYWRlciAtIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgorICAKKyBAcmV0dXJuIE5vbmUKKyovCit2b2lkIAorV0RJX1J4QW1zZHVCZEZpeAorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgX3B2QkRIZWFkZXIKKykKK3sKKyAgICBXRElfUnhCZFR5cGUqICAgICAgICAgIHBSeEJkICAgPSAoV0RJX1J4QmRUeXBlKikgX3B2QkRIZWFkZXI7CisgICAgd3B0X3VpbnQzMiAqcE1vZEJkLCAqcE1hc2tCZCwgKnBGaXJzdEJkLCBpOworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAgaWYgKHBSeEJkLT5hc2YpCisgICAgeworICAgICAgICBpZiAocFJ4QmQtPnN5YkZyYW1lSWR4ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vY29weSB0aGUgQkQgb2YgZmlyc3QgQU1TRFUKKyAgICAgICAgICAgIHBXRElDdHgtPndkaVJ4QW1zZHVGaXJzdEJkQ2FjaGUgPSAqcFJ4QmQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwTW9kQmQgICA9ICh3cHRfdWludDMyKilwUnhCZDsKKyAgICAgICAgICAgIHBNYXNrQmQgID0gKHdwdF91aW50MzIqKSZwV0RJQ3R4LT53ZGlSeEFtc2R1QmRGaXhNYXNrOworICAgICAgICAgICAgcEZpcnN0QmQgPSAod3B0X3VpbnQzMiopJnBXRElDdHgtPndkaVJ4QW1zZHVGaXJzdEJkQ2FjaGU7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoV0RJX1J4QmRUeXBlKS9zaXplb2Yod3B0X3VpbnQzMiAqKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vbW9kaWZpZWQgQkQgPSB6ZXJvIG91dCBub24gQU1TRFUgcmVsYXRlZCBmaWVsZHMgaW4gdGhpcyBCRCB8CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIG5vbiBBTVNEVSByZWxhdGVkIGZpZWxkcyBmcm9tIHRoZSBmaXJzdCBCRC4KKyAgICAgICAgICAgICAgICBwTW9kQmRbaV0gPSAocE1vZEJkW2ldICYgfnBNYXNrQmRbaV0pIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEZpcnN0QmRbaV0gJiBwTWFza0JkW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9LypXRElfUnhBbXNkdUJkRml4Ki8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvQ1Avc3JjL3dsYW5fcWN0X3dkaV9zdGEuYyBiL0NPUkUvV0RJL0NQL3NyYy93bGFuX3FjdF93ZGlfc3RhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1M2VmZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL0NQL3NyYy93bGFuX3FjdF93ZGlfc3RhLmMKQEAgLTAsMCArMSw3MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIFcgRCBJIF8gUyBUIEEgLiBDCisKKyAgT1ZFUlZJRVc6CisKKyAgVGhpcyBzb2Z0d2FyZSB1bml0IGhvbGRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV0xBTiBEZXZpY2UgQWJzdHJhY3Rpb24gICAgIAorICBMYXllciBTdGF0aW9uIFRhYmxlIE1hbmFnZW1lbnQgRW50aXR5LgorCisgIFRoZSBmdW5jdGlvbnMgZXh0ZXJuYWxpemVkIGJ5IHRoaXMgbW9kdWxlIGFyZSBpbnRlcm5hbCBBUElzIGZvciBEQUwgQ29yZQorICBhbmQgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGl0LiAKKworICBERVBFTkRFTkNJRVM6CisKKyAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisKKworICBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgorICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCisKKworICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworCisgICAkSGVhZGVyJCREYXRlVGltZSQkQXV0aG9yJAorCisKKyAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5CistLS0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMjAxMC0wOC0wOSAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpLmgiIAorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9pLmgiIAorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9zdGEuaCIgCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX2FwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90cmFjZS5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb24gZGVmaW5pdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlSW5pdCAtIEluaXRpYWxpemVzIHRoZSBTVEEgdGFibGVzLiAKKyAgICAgICAgQWxsb2NhdGVzIHRoZSBuZWNlc2FyeSBtZW1vcnkuCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyBXRElfU1RBVGFibGVJbml0CisoCisgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgKKykKK3sKKyAgICB3cHRfdWludDggIHVjTWF4U3RhdGlvbnM7CisgICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovICAgIAorCisgICAgdWNNYXhTdGF0aW9ucyAgICAgPSAod3B0X3VpbnQ4KSBwV0RJQ3R4LT51Y01heFN0YXRpb25zOworICAgIAorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIEFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHN0YSB0YWJsZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcFdESUN0eC0+c3RhVGFibGUgPSB3cGFsTWVtb3J5QWxsb2NhdGUodWNNYXhTdGF0aW9ucyAqIHNpemVvZihXRElfU3RhU3RydWN0KSk7CisKKyAgICBpZiAoTlVMTCA9PSBwV0RJQ3R4LT5zdGFUYWJsZSkKKyAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgV0RJX1NUQVRhYmxlQ2xvc2UocFdESUN0eCk7CisKKyAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBvbiBXRElfU1RBVGFibGVJbml0Iik7IAorICAgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorICAgIAorICAgIHdwYWxNZW1vcnlaZXJvKCBwV0RJQ3R4LT5zdGFUYWJsZSwgdWNNYXhTdGF0aW9ucyAqIHNpemVvZiggV0RJX1N0YVN0cnVjdCApKTsKKworI2lmbmRlZiBIQUxfU0VMRl9TVEFfUEVSX0JTUworICAgIC8vIEluaXRpYWxpemUgdGhlIFNlbGYgU1RBSUQgdG8gYW4gaW52YWxpZCB2YWx1ZQorICAgIHBXRElDdHgtPnVjU2VsZlN0YUlkID0gV0RJX1NUQV9JTlZBTElEX0lEWDsKKyNlbmRpZgorCisgICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKK30vKldESV9TVEFUYWJsZUluaXQqLworCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlU3RhcnQgLSByZXNldHMgdGhlIG1heCBhbmQgbnVtYmVyIHZhbHVlcyBvZiAKKyAgICAgICAgU1RBdGlvbnMKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NUQVRhYmxlU3RhcnQKKygKKyAgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgKKykKK3sKKyAgICB3cHRfdWludDggdWNNYXhTdGF0aW9uczsKKyAgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgICAgCisgICAgdWNNYXhTdGF0aW9ucyAgICAgPSAod3B0X3VpbnQ4KSBwV0RJQ3R4LT51Y01heFN0YXRpb25zOworIAorICAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7Cit9LypXRElfU1RBVGFibGVTdGFydCovCisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVTdG9wIC0gY2xlYXJzIHRoZSBzdGEgdGFibGUKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NUQVRhYmxlU3RvcAorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eAorKQoreworICAgIHdwdF91aW50OCB1Y01heFN0YXRpb25zOworICAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworI2lmbmRlZiBIQUxfU0VMRl9TVEFfUEVSX0JTUworICAgIC8qIENsZWFuIHVwIHRoZSBTZWxmIFNUQUlEICovCisgICAgcFdESUN0eC0+dWNTZWxmU3RhSWQgPSBXRElfU1RBX0lOVkFMSURfSURYOworI2VuZGlmCisKKyAgICB1Y01heFN0YXRpb25zICAgICA9IHBXRElDdHgtPnVjTWF4U3RhdGlvbnM7CisgICAgCisgICAgd3BhbE1lbW9yeVplcm8oICh2b2lkICopIHBXRElDdHgtPnN0YVRhYmxlLAorICAgICAgICAgICAgdWNNYXhTdGF0aW9ucyAqIHNpemVvZiggV0RJX1N0YVN0cnVjdCApKTsKKworICAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7Cit9LypXRElfU1RBVGFibGVTdG9wKi8KKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZUNsb3NlIC0gZnJlZXMgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBTVEEgCisgICAgICAgIHRhYmxlLgorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVDbG9zZQorKAorICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgKKykKK3sKKyAgICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgCisgICAgLy8gRnJlZSBtZW1vcnkKKyAgICBpZiAocFdESUN0eC0+c3RhVGFibGUgIT0gTlVMTCkKKyAgICAgICAgd3BhbE1lbW9yeUZyZWUoIHBXRElDdHgtPnN0YVRhYmxlKTsKKworICAgIHBXRElDdHgtPnN0YVRhYmxlID0gTlVMTDsKKyAgICByZXR1cm4gc3RhdHVzOworfS8qV0RJX1NUQVRhYmxlQ2xvc2UqLworCisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVBZGRTdGEgLSBGdW5jdGlvbiB0byBBZGQgU3RhdGlvbgorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHB3ZGlQYXJhbTogICBzdGF0aW9uIHBhcmFtZXRlcnMgIAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfU1RBVGFibGVBZGRTdGEKKygKKyAgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgICAgV0RJX0FkZFN0YVBhcmFtcyogICAgICBwd2RpUGFyYW0KKykKK3sKKyAgICB3cHRfdWludDggICAgICAgIHVjU1RBSWR4ICA9IDA7CisgICAgV0RJX1N0YVN0cnVjdCogICBwU1RBVGFibGUgPSAoV0RJX1N0YVN0cnVjdCopIHBXRElDdHgtPnN0YVRhYmxlOworICAgIC8qLSAtIC0gLSAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICAtIC0gLSAtIC0gKi8KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFNhbml0eSBjaGVjaworICAgICAgLSBzdGF0aW9uIGlkcyBhcmUgYWxsb2NhdGVkIGJ5IHRoZSBIQUwgbG9jYXRlZCBvbiBSSVZBIFNTIC0gdGhleSBtdXN0CisgICAgICBhbHdheXMgYmUgdmFsaWQgCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoIHB3ZGlQYXJhbS0+dWNTVEFJZHggID09IFdESV9TVEFfSU5WQUxJRF9JRFgpIHx8CisgICAgICAgICggcHdkaVBhcmFtLT51Y1NUQUlkeCA+PSBwV0RJQ3R4LT51Y01heFN0YXRpb25zICkpCisgICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiU3RhdGlvbiBpZCBzZW50IGJ5IEhBTCBpcyBpbnZhbGlkIC0gbm90IE9LIik7IAorICAgICAgV0RJX0FTU0VSVCgwKTsgCisgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgIH0KKyAgICAKKyAgICB1Y1NUQUlkeCA9ICBwd2RpUGFyYW0tPnVjU1RBSWR4OworCisgICAgLypTaW5jZSB3ZSBhcmUgbm90IHRoZSBhbGxvY2F0b3Igb2YgU1RBIElkcyBidXQgSEFMIGlzIC0ganVzdCBzZXQgZmxhZyB0bworICAgICAgdmFsaWQqLworICAgIHBTVEFUYWJsZVt1Y1NUQUlkeF0udmFsaWQgPSAxOyAgICAgCisgICAgCisgICAgCisgICAgLy8gU2F2ZSB0aGUgU1RBIHR5cGUgLSB0aGlzIGlzIHVzZWQgZm9yIGxvb2t1cAorICAgIFdESV9TVEFUYWJsZVNldFN0YVR5cGUocFdESUN0eCwgdWNTVEFJZHgsIHB3ZGlQYXJhbS0+dWNTdGFUeXBlKTsKKyAgICBXRElfU1RBVGFibGVTZXRTdGFRb3NFbmFibGVkKHBXRElDdHgsIHVjU1RBSWR4LCAKKyAgICAgICAgICAod3B0X3VpbnQ4KShwd2RpUGFyYW0tPnVjV21tRW5hYmxlZCB8IHB3ZGlQYXJhbS0+dWNIVENhcGFibGUpICk7CisKKyNpZmRlZiBXTEFOX1BFUkYKKyAgICBwV0RJQ3R4LT51QmRTaWdTZXJpYWxOdW0gKys7CisjZW5kaWYKKyAgICAKKyAgICB3cGFsTWVtb3J5Q29weShwU1RBVGFibGVbdWNTVEFJZHhdLm1hY0JTU0lELCAKKyAgICAgICAgICAgICAgICAgICBwd2RpUGFyYW0tPm1hY0JTU0lELCBXRElfTUFDX0FERFJfTEVOKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBTZXQgRFBVIFJlbGF0ZWQgSW5mb3JtYXRpb24gCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwU1RBVGFibGVbdWNTVEFJZHhdLmRwdUluZGV4ICAgICAgICAgICAgICA9IHB3ZGlQYXJhbS0+ZHB1SW5kZXg7IAorICAgIHBTVEFUYWJsZVt1Y1NUQUlkeF0uZHB1U2lnICAgICAgICAgICAgICAgID0gcHdkaVBhcmFtLT5kcHVTaWc7IAorCisgICAgcFNUQVRhYmxlW3VjU1RBSWR4XS5iY2FzdERwdUluZGV4ICAgICAgICAgPSBwd2RpUGFyYW0tPmJjYXN0RHB1SW5kZXg7IAorICAgIHBTVEFUYWJsZVt1Y1NUQUlkeF0uYmNhc3REcHVTaWduYXR1cmUgICAgID0gcHdkaVBhcmFtLT5iY2FzdERwdVNpZ25hdHVyZTsgCisKKyAgICBwU1RBVGFibGVbdWNTVEFJZHhdLmJjYXN0TWdtdERwdUluZGV4ICAgICA9IHB3ZGlQYXJhbS0+YmNhc3RNZ210RHB1SW5kZXg7IAorICAgIHBTVEFUYWJsZVt1Y1NUQUlkeF0uYmNhc3RNZ210RHB1U2lnbmF0dXJlID0gcHdkaVBhcmFtLT5iY2FzdE1nbXREcHVTaWduYXR1cmU7IAorCisgICAgLypSb2J1c3QgTWdtdCBGcmFtZSBlbmFibGVkICovCisgICAgcFNUQVRhYmxlW3VjU1RBSWR4XS5ybWZFbmFibGVkICAgICAgICAgICAgPSBwd2RpUGFyYW0tPnVjUm1mRW5hYmxlZDsKKworICAgIHBTVEFUYWJsZVt1Y1NUQUlkeF0uYnNzSWR4ICAgICAgICAgICAgICAgID0gcHdkaVBhcmFtLT51Y0JTU0lkeDsKKworICAgIC8qIE5vdyB1cGRhdGUgdGhlIFNUQSBlbnRyeSB3aXRoIHRoZSBuZXcgTUFDIGFkZHJlc3MgKi8KKyAgICBpZihXRElfU1RBVFVTX1NVQ0NFU1MgIT0gV0RJX1NUQVRhYmxlU2V0U3RhQWRkciggcFdESUN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdkaVBhcmFtLT5zdGFNYWNBZGRyKSkKKyAgICB7CisgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB1cGRhdGUgc3RhdGlvbiBlbnRyeSAtIGludGVybmFsIGZhaWx1cmUiKTsKKyAgICAgICBXRElfQVNTRVJUKDApOworICAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICAgfQorCisgICAgLyogTm93IHVwZGF0ZSB0aGUgU1RBIGVudHJ5IHdpdGggdGhlIG5ldyBCU1NJRCBhZGRyZXNzICovCisgICAgaWYoV0RJX1NUQVRVU19TVUNDRVNTICE9IFdESV9TVEFUYWJsZVNldEJTU0lEKCBwV0RJQ3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2RpUGFyYW0tPm1hY0JTU0lEKSkKKyAgICB7CisgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB1cGRhdGUgc3RhdGlvbiBlbnRyeSAtIGludGVybmFsIGZhaWx1cmUiKTsKKyAgICAgICBXRElfQVNTRVJUKDApOworICAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsgCisgICAgfQorCisgICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKK30vKldESV9BZGRTdGEqLworCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlRGVsU3RhIC0gRnVuY3Rpb24gdG8gRGVsZXRlIGEgU3RhdGlvbgorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICB1Y1NUQUlkeDogICAgICAgIHN0YXRpb24gdG8gYmUgZGVsZXRlZAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfU1RBVGFibGVEZWxTdGEKKygKKyAgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1NUQUlkeAorKQoreworICAgIFdESV9TdGFTdHJ1Y3QqICAgcFNUQVRhYmxlID0gKFdESV9TdGFTdHJ1Y3QqKSBwV0RJQ3R4LT5zdGFUYWJsZTsKKyAgICAvKi0gLSAtIC0gIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAgLSAtIC0gLSAtICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBTYW5pdHkgY2hlY2sKKyAgICAgIC0gc3RhdGlvbiBpZHMgYXJlIGFsbG9jYXRlZCBieSB0aGUgSEFMIGxvY2F0ZWQgb24gUklWQSBTUyAtIHRoZXkgbXVzdAorICAgICAgYWx3YXlzIGJlIHZhbGlkIAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZigoIHVjU1RBSWR4ICA9PSBXRElfU1RBX0lOVkFMSURfSURYICl8fAorICAgICAgICAoIHVjU1RBSWR4ID49IHBXRElDdHgtPnVjTWF4U3RhdGlvbnMgKSkKKyAgICB7CisgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIlNUQSBJZCBpbnZhbGlkIG9uIERlbCBTVEEgLSBpbnRlcm5hbCBmYWlsdXJlIik7CisgICAgICAgV0RJX0FTU0VSVCgwKTsKKyAgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7IAorICAgIH0KKyAgICAKKyAgICB3cGFsTWVtb3J5WmVybygmcFNUQVRhYmxlW3VjU1RBSWR4XSwgc2l6ZW9mKHBTVEFUYWJsZVt1Y1NUQUlkeF0pKTsgCisgICAgcFNUQVRhYmxlLT52YWxpZCA9IDA7IAorICAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7Cit9LypXRElfU1RBVGFibGVEZWxTdGEqLworCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlQlNTRGVsU3RhIC0gRnVuY3Rpb24gdG8gRGVsZXRlIFN0YXRpb25zIGluIHRoaXMgQlNTCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgICAgICAgcG9pbnRlciB0byB0aGUgV0xBTiBEQUwgY29udGV4dCAKKyAgICAgICAgIHVjQlNTSWR4OiAgICAgICAgQlNTIGluZGV4IAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzCitXRElfU1RBVGFibGVCU1NEZWxTdGEKKygKKyAgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y0JTU0lkeAorKQoreworICAgIFdESV9TdGFTdHJ1Y3QqICAgcFNUQVRhYmxlID0gKFdESV9TdGFTdHJ1Y3QqKSBwV0RJQ3R4LT5zdGFUYWJsZTsKKyAgICB3cHRfdWludDggICAgICAgIHVjU1RBSWR4OworICAgIC8qLSAtIC0gLSAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICAtIC0gLSAtIC0gKi8KKworICAgIGZvciAodWNTVEFJZHggPSAwOyAodWNTVEFJZHggPCBwV0RJQ3R4LT51Y01heFN0YXRpb25zKTsgdWNTVEFJZHgrKykKKyAgICB7CisgICAgICAgIGlmKCAocFNUQVRhYmxlW3VjU1RBSWR4XS51Y1N0YVR5cGUgPT0gV0RJX1NUQV9FTlRSWV9QRUVSKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU1RBVGFibGVbdWNTVEFJZHhdLmJzc0lkeCA9PSB1Y0JTU0lkeCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdESV9TVEFUYWJsZURlbFN0YShwV0RJQ3R4LCB1Y1NUQUlkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworfS8qV0RJX1NUQVRhYmxlQlNTRGVsU3RhKi8KKworCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlR2V0U3RhQlNTSURBZGRyIC0gR2V0cyB0aGUgQlNTSUQgYXNzb2NpYXRlZCAKKyAgICAgICAgd2l0aCB0aGlzIHN0YXRpb24KKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgdWNTVEFJZHg6ICAgICAgICBzdGF0aW9uIGluZGV4CisgICAgICAgICBwbWFjQlNTSUQ6ICAgICAgb3V0IEJTU0lEIGZvciB0aGlzIFNUQQorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NUQVRhYmxlR2V0U3RhQlNTSURBZGRyCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1NUQUlkeCwgCisgICAgd3B0X21hY0FkZHIqICAgICAgICAgICBwbWFjQlNTSUQKKykKK3sKKyAgV0RJX1N0YVN0cnVjdCogcFNUQVRhYmxlID0gKFdESV9TdGFTdHJ1Y3QqKSBwV0RJQ3R4LT5zdGFUYWJsZTsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICBpZiAoKHVjU1RBSWR4IDwgcFdESUN0eC0+dWNNYXhTdGF0aW9ucykgJiYgKHBTVEFUYWJsZVt1Y1NUQUlkeF0udmFsaWQpKQorICB7CisgICAgIHdwYWxNZW1vcnlDb3B5KCpwbWFjQlNTSUQsIHBTVEFUYWJsZVt1Y1NUQUlkeF0ubWFjQlNTSUQsIFdESV9NQUNfQUREUl9MRU4pOworICAgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworICB9CisgIGVsc2UKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworfS8qV0RJX1NUQVRhYmxlR2V0U3RhUW9zRW5hYmxlZCovCisKKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZUdldFN0YVFvc0VuYWJsZWQgLSBHZXRzIGlzIHFvcyBpcyBlbmFibGVkIAorICAgICAgICBmb3IgYSBzdGEKKworIAorIEBwYXJhbSAgcFdESUN0eDogICAgICAgICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgdWNTVEFJZHg6ICAgICAgICBzdGF0aW9uIGluZGV4CisgICAgICAgICBxb3NFbmFibGVkOiAgICAgIG91dCBxb3MgZW5hYmxlZAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NUQVRhYmxlR2V0U3RhUW9zRW5hYmxlZAorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwgIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNTVEFJZHgsIAorICAgIHdwdF91aW50OCogICAgICAgICAgICAgcW9zRW5hYmxlZAorKQoreworICBXRElfU3RhU3RydWN0KiBwU1RBVGFibGUgPSAoV0RJX1N0YVN0cnVjdCopIHBXRElDdHgtPnN0YVRhYmxlOworICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgIGlmICgodWNTVEFJZHggPCBwV0RJQ3R4LT51Y01heFN0YXRpb25zKSAmJiAocFNUQVRhYmxlW3VjU1RBSWR4XS52YWxpZCkgJiYgcW9zRW5hYmxlZCkKKyAgeworICAgICAqcW9zRW5hYmxlZCA9IHBTVEFUYWJsZVt1Y1NUQUlkeF0ucW9zRW5hYmxlZDsKKyAgICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgfQorICBlbHNlCisgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKK30vKldESV9TVEFUYWJsZUdldFN0YVFvc0VuYWJsZWQqLworCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlU2V0U3RhUW9zRW5hYmxlZCAtIHNldCBxb3MgbW9kZSBmb3IgU1RBCisKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICB1Y1NUQUlkeDogICBzdGF0aW9uIGluZGV4CisgICAgICAgICBxb3NFbmFibGVkOiBxb3MgZW5hYmxlZAorICAKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIAorV0RJX1NUQVRhYmxlU2V0U3RhUW9zRW5hYmxlZAorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwgIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNTVEFJZHgsIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgcW9zRW5hYmxlZAorKQoreworICAgIFdESV9TdGFTdHJ1Y3QqIHBTVEFUYWJsZSA9IChXRElfU3RhU3RydWN0KikgcFdESUN0eC0+c3RhVGFibGU7CisgICAgaWYgKCh1Y1NUQUlkeCA8IHBXRElDdHgtPnVjTWF4U3RhdGlvbnMpICYmIChwU1RBVGFibGVbdWNTVEFJZHhdLnZhbGlkKSkKKyAgICB7CisgICAgICAgIHBTVEFUYWJsZVt1Y1NUQUlkeF0ucW9zRW5hYmxlZCA9IHFvc0VuYWJsZWQ7CisgICAgICAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworfS8qV0RJX1NUQVRhYmxlU2V0U3RhUW9zRW5hYmxlZCovCisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVHZXRTdGFUeXBlIC0gZ2V0IHN0YSB0eXBlIGZvciBTVEEKKworIAorIEBwYXJhbSAgcFdESUN0eDogICBwb2ludGVyIHRvIHRoZSBXTEFOIERBTCBjb250ZXh0IAorICAgICAgICAgdWNTVEFJZHg6ICBzdGF0aW9uIGluZGV4CisgICAgICAgICBwU3RhVHlwZTogIHFvcyBlbmFibGVkCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVHZXRTdGFUeXBlCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1NUQUlkeCwgCisgICAgd3B0X3VpbnQ4KiAgICAgICAgICAgICBwU3RhVHlwZQorKQoreworICAgIFdESV9TdGFTdHJ1Y3QqIHBTVEFUYWJsZSA9IChXRElfU3RhU3RydWN0KikgcFdESUN0eC0+c3RhVGFibGU7CisgICAgaWYgKCh1Y1NUQUlkeCA8IHBXRElDdHgtPnVjTWF4U3RhdGlvbnMpICYmIChwU1RBVGFibGVbdWNTVEFJZHhdLnZhbGlkKSkKKyAgICB7CisgICAgICAgICpwU3RhVHlwZSA9IHBTVEFUYWJsZVt1Y1NUQUlkeF0udWNTdGFUeXBlOworICAgICAgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKK30vKldESV9TVEFUYWJsZUdldFN0YVR5cGUqLworCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlU2V0U3RhVHlwZSAtIHNldHMgc3RhIHR5cGUgZm9yIFNUQQorCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgIHBvaW50ZXIgdG8gdGhlIFdMQU4gREFMIGNvbnRleHQgCisgICAgICAgICB1Y1NUQUlkeDogIHN0YXRpb24gaW5kZXgKKyAgICAgICAgIHN0YVR5cGU6ICAgc3RhIHR5cGUKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TVEFUYWJsZVNldFN0YVR5cGUKKygKKyAgICBXRElfQ29udHJvbEJsb2NrVHlwZSogIHBXRElDdHgsICAKKyAgICB3cHRfdWludDggICAgICAgICAgICAgIHVjU1RBSWR4LCAKKyAgICB3cHRfdWludDggICAgICAgICAgICAgIHN0YVR5cGUKKykKK3sKKyAgICBXRElfU3RhU3RydWN0KiBwU1RBVGFibGUgPSAoV0RJX1N0YVN0cnVjdCopIHBXRElDdHgtPnN0YVRhYmxlOworICAgIGlmICgodWNTVEFJZHggPCBwV0RJQ3R4LT51Y01heFN0YXRpb25zKSAmJiAocFNUQVRhYmxlW3VjU1RBSWR4XS52YWxpZCkpCisgICAgeworICAgICAgICBwU1RBVGFibGVbdWNTVEFJZHhdLnVjU3RhVHlwZSA9IHN0YVR5cGU7CisgICAgICAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworfS8qV0RJX1NUQVRhYmxlU2V0U3RhVHlwZSovCisKKworLyoqCisgQGJyaWVmIFdESV9Db21wYXJlTWFjQWRkciAtIGNvbXBhcmUgdGhlIE1BQyBhZGRyZXNzCisKKyAKKyBAcGFyYW0gIGFkZHIxOiBhZGRyZXNzIDEgCisgICAgICAgICBhZGRyMjogYWRkcmVzcyAyICAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHdwdF91aW50OAorV0RJX0NvbXBhcmVNYWNBZGRyCisoCisgIHdwdF91aW50OCBhZGRyMVtdLCAKKyAgd3B0X3VpbnQ4IGFkZHIyW10KKykKK3sKKyNpZiBkZWZpbmVkKCBfWDg2XyApCisgICAgd3B0X3VpbnQzMiBhbGlnbiA9ICgweDMgJiAoKHdwdF91aW50MzIpIGFkZHIxIHwgKHdwdF91aW50MzIpIGFkZHIyICkpOworCisgICAgaWYoIGFsaWduID09MCl7CisgICAgICAgIHJldHVybiAoKCooKHdwdF91aW50MTYgKikgJihhZGRyMVs0XSkpID09ICooKHdwdF91aW50MTYgKikgJihhZGRyMls0XSkpKSYmCisgICAgICAgICAgICAgICAgKCooKHdwdF91aW50MzIgKikgYWRkcjEpID09ICooKHdwdF91aW50MzIgKikgYWRkcjIpKSk7CisgICAgfWVsc2UgaWYoYWxpZ24gPT0gMil7CisgICAgICAgIHJldHVybiAoKCooKHdwdF91aW50MTYgKikgJmFkZHIxWzRdKSA9PSAqKCh3cHRfdWludDE2ICopICZhZGRyMls0XSkpICYmCisgICAgICAgICAgICAoKigod3B0X3VpbnQxNiAqKSAmYWRkcjFbMl0pID09ICooKHdwdF91aW50MTYgKikgJmFkZHIyWzJdKSkgJiYKKyAgICAgICAgICAgICgqKCh3cHRfdWludDE2ICopICZhZGRyMVswXSkgPT0gKigod3B0X3VpbnQxNiAqKSAmYWRkcjJbMF0pKSk7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiAoIChhZGRyMVs1XT09YWRkcjJbNV0pJiYKKyAgICAgICAgICAgIChhZGRyMVs0XT09YWRkcjJbNF0pJiYKKyAgICAgICAgICAgIChhZGRyMVszXT09YWRkcjJbM10pJiYKKyAgICAgICAgICAgIChhZGRyMVsyXT09YWRkcjJbMl0pJiYKKyAgICAgICAgICAgIChhZGRyMVsxXT09YWRkcjJbMV0pJiYKKyAgICAgICAgICAgIChhZGRyMVswXT09YWRkcjJbMF0pKTsKKyAgICB9CisjZWxzZQorICAgICAgICAgcmV0dXJuICggKGFkZHIxWzBdPT1hZGRyMlswXSkmJgorICAgICAgICAgICAgKGFkZHIxWzFdPT1hZGRyMlsxXSkmJgorICAgICAgICAgICAgKGFkZHIxWzJdPT1hZGRyMlsyXSkmJgorICAgICAgICAgICAgKGFkZHIxWzNdPT1hZGRyMlszXSkmJgorICAgICAgICAgICAgKGFkZHIxWzRdPT1hZGRyMls0XSkmJgorICAgICAgICAgICAgKGFkZHIxWzVdPT1hZGRyMls1XSkpOworI2VuZGlmCit9LypXRElfQ29tcGFyZU1hY0FkZHIqLworCisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVGaW5kU3RhaWRCeUFkZHIgLSBHaXZlbiBhIHN0YXRpb24gbWFjIGFkZHJlc3MsIHNlYXJjaAorICAgICAgICBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGlvbiBpbmRleCBmcm9tIHRoZSBTdGF0aW9uIFRhYmxlLgorIAorIEBwYXJhbSAgcFdESUN0eDogIFdESSBDb250ZXh0IHBvaW50ZXIKKyAgICAgICAgIHN0YUFkZHI6ICBzdGF0aW9uIGFkZHJlc3MKKyAgICAgICAgIHB1Y1N0YUlkOiBvdXRwdXQgc3RhdGlvbiBpZCAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cworV0RJX1NUQVRhYmxlRmluZFN0YWlkQnlBZGRyCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAKKyAgICB3cHRfbWFjQWRkciAgICAgICAgICAgIHN0YUFkZHIsIAorICAgIHdwdF91aW50OCogICAgICAgICAgICAgcHVjU3RhSWQKKykKK3sKKyAgICBXRElfU3RhdHVzIHdkaVN0YXR1cyA9IFdESV9TVEFUVVNfRV9GQUlMVVJFOworICAgIHdwdF91aW50OCBpOworICAgIFdESV9TdGFTdHJ1Y3QqIHBTVEFUYWJsZSA9IChXRElfU3RhU3RydWN0KikgcFdESUN0eC0+c3RhVGFibGU7CisKKyAgICBmb3IgKGk9MDsgaSA8IHBXRElDdHgtPnVjTWF4U3RhdGlvbnM7IGkrKywgcFNUQVRhYmxlKyspCisgICAgeworICAgICAgICBpZiAoIChwU1RBVGFibGUtPnZhbGlkID09IDEpICYmIChXRElfQ29tcGFyZU1hY0FkZHIocFNUQVRhYmxlLT5zdGFBZGRyLCBzdGFBZGRyKSkgKQorICAgICAgICB7CisgICAgICAgICAgICAqcHVjU3RhSWQgPSBpOworICAgICAgICAgICAgd2RpU3RhdHVzID0gV0RJX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHdkaVN0YXR1czsKK30vKldESV9TVEFUYWJsZUZpbmRTdGFpZEJ5QWRkciovCisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVHZXRTdGFBZGRyIC0gZ2V0IHN0YXRpb24gYWRkcmVzcworIAorIEBwYXJhbSAgcFdESUN0eDogIFdESSBDb250ZXh0IHBvaW50ZXIKKyAgICAgICAgIHVjU1RBSWR4OiAgc3RhdGlvbiBpbmRleAorICAgICAgICAgcFN0YUFkZHI6IG91dHB1dCBzdGF0aW9uIGFkZHJlc3MgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVHZXRTdGFBZGRyCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1NUQUlkeCwgCisgICAgd3B0X3VpbnQ4KiogICAgICAgICAgICBwU3RhQWRkcgorKQoreworICAgIFdESV9TdGFTdHJ1Y3QqIHBTVEFUYWJsZSA9IChXRElfU3RhU3RydWN0KikgcFdESUN0eC0+c3RhVGFibGU7CisgICAgaWYgKCh1Y1NUQUlkeCA8IHBXRElDdHgtPnVjTWF4U3RhdGlvbnMpICYmIChwU1RBVGFibGVbdWNTVEFJZHhdLnZhbGlkKSkKKyAgICB7CisgICAgICAgICpwU3RhQWRkciA9IHBTVEFUYWJsZVt1Y1NUQUlkeF0uc3RhQWRkcjsKKyAgICAgICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7Cit9LypXRElfU1RBVGFibGVHZXRTdGFBZGRyKi8KKworLyoqCisgQGJyaWVmIFdESV9TVEFUYWJsZVNldFN0YUFkZHIgLSBzZXQgc3RhdGlvbiBhZGRyZXNzCisgCisgQHBhcmFtICBwV0RJQ3R4OiAgV0RJIENvbnRleHQgcG9pbnRlcgorICAgICAgICAgdWNTVEFJZHg6ICAgc3RhdGlvbiBpbmRleAorICAgICAgICAgcFN0YUFkZHI6IG91dHB1dCBzdGF0aW9uIGFkZHJlc3MgCisgIAorIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgCitXRElfU1RBVGFibGVTZXRTdGFBZGRyCisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1NUQUlkeCwgCisgICAgd3B0X21hY0FkZHIgICAgICAgICAgICBzdGFBZGRyCispCit7CisgICAgV0RJX1N0YVN0cnVjdCogcFNUQVRhYmxlID0gKFdESV9TdGFTdHJ1Y3QqKSBwV0RJQ3R4LT5zdGFUYWJsZTsKKyAgICBpZiAoKHVjU1RBSWR4IDwgcFdESUN0eC0+dWNNYXhTdGF0aW9ucykgJiYgKHBTVEFUYWJsZVt1Y1NUQUlkeF0udmFsaWQpKQorICAgIHsKKyAgICAgICAgd3BhbE1lbW9yeUNvcHkgKHBTVEFUYWJsZVt1Y1NUQUlkeF0uc3RhQWRkciwgc3RhQWRkciwgNik7CisgICAgICAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworfS8qV0RJX1NUQVRhYmxlU2V0U3RhQWRkciovCisKKy8qKgorIEBicmllZiBXRElfU1RBVGFibGVTZXRCU1NJRCAtIHNldCBzdGF0aW9uIGNvcnJlc3BvbmRpbmcgQlNTSUQKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICBXREkgQ29udGV4dCBwb2ludGVyCisgICAgICAgICB1Y1NUQUlkeDogICBzdGF0aW9uIGluZGV4CisgICAgICAgICBwU3RhQWRkcjogb3V0cHV0IHN0YXRpb24gYWRkcmVzcyAKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TVEFUYWJsZVNldEJTU0lECisoCisgICAgV0RJX0NvbnRyb2xCbG9ja1R5cGUqICBwV0RJQ3R4LCAgCisgICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICB1Y1NUQUlkeCwgCisgICAgd3B0X21hY0FkZHIgICAgICAgICAgICBtYWNCU1NJRAorKQoreworICAgIFdESV9TdGFTdHJ1Y3QqIHBTVEFUYWJsZSA9IChXRElfU3RhU3RydWN0KikgcFdESUN0eC0+c3RhVGFibGU7CisgICAgaWYgKCh1Y1NUQUlkeCA8IHBXRElDdHgtPnVjTWF4U3RhdGlvbnMpICYmIChwU1RBVGFibGVbdWNTVEFJZHhdLnZhbGlkKSkKKyAgICB7CisgICAgICAgIHdwYWxNZW1vcnlDb3B5IChwU1RBVGFibGVbdWNTVEFJZHhdLm1hY0JTU0lELCBtYWNCU1NJRCwgNik7CisgICAgICAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworfS8qV0RJX1NUQVRhYmxlU2V0QlNTSUQqLworCisvKioKKyBAYnJpZWYgV0RJX1NUQVRhYmxlU2V0QlNTSWR4IC0gc2V0IHN0YXRpb24gY29ycmVzcG9uZGluZyBCU1MgaW5kZXgKKyAKKyBAcGFyYW0gIHBXRElDdHg6ICBXREkgQ29udGV4dCBwb2ludGVyCisgICAgICAgICB1Y1NUQUlkeDogICBzdGF0aW9uIGluZGV4CisgICAgICAgICB1Y0JTU0lkeDogICBCU1MgaW5kZXgKKyAgCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyAKK1dESV9TVEFUYWJsZVNldEJTU0lkeAorKAorICAgIFdESV9Db250cm9sQmxvY2tUeXBlKiAgcFdESUN0eCwgIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNTVEFJZHgsIAorICAgIHdwdF91aW50OCAgICAgICAgICAgICAgdWNCU1NJZHgKKykKK3sKKyAgICBXRElfU3RhU3RydWN0KiBwU1RBVGFibGUgPSAoV0RJX1N0YVN0cnVjdCopIHBXRElDdHgtPnN0YVRhYmxlOworICAgIGlmICgodWNTVEFJZHggPCBwV0RJQ3R4LT51Y01heFN0YXRpb25zKSAmJiAocFNUQVRhYmxlW3VjU1RBSWR4XS52YWxpZCkpCisgICAgeworICAgICAgICBwU1RBVGFibGVbdWNTVEFJZHhdLmJzc0lkeCA9IHVjQlNTSWR4OworICAgICAgICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKK30vKldESV9TVEFUYWJsZVNldEJTU0lkeCovCisKZGlmZiAtLWdpdCBhL0NPUkUvV0RJL0RQL2luYy93bGFuX3FjdF93ZGlfZHMuaCBiL0NPUkUvV0RJL0RQL2luYy93bGFuX3FjdF93ZGlfZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTNiZDBjCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvRFAvaW5jL3dsYW5fcWN0X3dkaV9kcy5oCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1dMQU5fUUNUX1dUSV9EU19IICkKKyNkZWZpbmUgX19XTEFOX1FDVF9XVElfRFNfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgCisgKiAgICAgICBcZmlsZSAgd2xhbl9xY3Rfd2RpX2RzLmgKKyAqICAgICAgICAgIAorICogICAgICAgXGJyaWVmIGRlZmluZSBEYXRhc2VydmljZSBBUEkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFdMQU4gRGV2aWNlIEFic3RyYWN0aW9uIGxheWVyIEV4dGVybmFsIEFQSSBmb3IgRGF0YXNlcnZpY2UKKyAqIERFU0NSSVBUSU9OCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBleHRlcm5hbCBBUEkgZXhwb3NlZCBieSB0aGUgCisgKiAgIHdsYW4gZGV2aWNlIGFic3RhcmN0aW9uIGxheWVyIG1vZHVsZS4KKyAqCisgKiAgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKyAqLworCisKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zdGF0dXMuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfcGFja2V0LmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpLmgiCisgICAKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgICB3cHRfdWludDMyIHR4RmxhZ3M7CisgICB3cHRfdWludDggYWM7CisgICB3cHRfdWludDggaXNFYXBvbDoxOyAvLzAgLSBub3QgZWFwb2wgMSAtIGVhcG9sCisgICB3cHRfdWludDggaXNXYWk6MTsgICAvL1dBUEkgMCAtIG5vdCBXQUkgMSBXQUkgCisgICB3cHRfdWludDggZmRpc2FibGVGcm1YbHQ6MTsgICAvLzAgLSBMZXQgQURVIGRvIEZULiAxIC0gYnlwYXNzIEFEVSBGVAorICAgd3B0X3VpbnQ4IHFvc0VuYWJsZWQ6MTsgLy8wIC0gbm9uLVFvcyAxIC0gUW9zCisgICB3cHRfdWludDggZmVuYWJsZVdEUzoxOyAvLzAgLSBub3QgV0RTIDEgV0RTCisgICB3cHRfdWludDggcmVzZXJ2ZWQxOjM7CisgICB3cHRfdWludDggdHlwZVN1YnR5cGU7CisgICB3cHRfdWludDggZlVQOworICAgd3B0X3VpbnQ4IGZTVEFNQUNBZGRyZXNzWzZdOworICAgd3B0X3VpbnQ4IGFkZHIyTUFDQWRkcmVzc1s2XTsKKyAgIHdwdF91aW50OCBmcm1UeXBlOworICAgd3B0X3VpbnQ4IGZTdGFUeXBlOworICAgd3B0X3VpbnQ4IGZQcm90ZWN0ZWRGcmFtZTsKKyAgIHdwdF91aW50MTYgZlBrdGxlbjsKKyAgIHdwdF9zdGF0dXMgdHhDb21wbGV0ZVN0YXR1czsKK30gV0RJX0RTX1R4TWV0YUluZm9UeXBlOworCisKK3R5cGVkZWYgZW51bQoreworICBXRElfRFNfT1BDT0RFX0lOVkFMSUQgICAgICAgICA9IDAsCisgIFdESV9EU19PUENPREVfUUNVUl9GV0RCVUYgICAgID0gMSwKKyAgV0RJX0RTX09QQ09ERV9GV0RCVUZfRldEQ1VSICAgPSAyLAorICBXRElfRFNfT1BDT0RFX1FDVVIgICAgICAgICAgICA9IDMsCisgIFdESV9EU19PUENPREVfRldEQlVGX1FVRVVFQ1VSID0gNCwKKyAgV0RJX0RTX09QQ09ERV9GV0RCVUZfRFJPUENVUiAgPSA1LAorICBXRElfRFNfT1BDT0RFX0ZXREFMTF9EUk9QQ1VSICA9IDYsCisgIFdESV9EU19PUENPREVfRldEQUxMX1FDVVIgICAgID0gNywKKyAgV0RJX0RTX09QQ09ERV9URUFSRE9XTiAgICAgICAgPSA4LAorICBXRElfRFNfT1BDT0RFX0RST1BDVVIgICAgICAgICA9IDksCisgIFdESV9EU19PUENPREVfTUFYCit9V0RJX0RTX0JBT3BDb2RlRW51bVR5cGU7CisKK3R5cGVkZWYgc3RydWN0IAoreworICAgd3B0X3VpbnQ4IHN0YUlkOworICAgd3B0X3VpbnQ4IGFkZHIzSWR4OworICAgd3B0X3VpbnQ4IHJ4Q2hhbm5lbDsKKyAgIHdwdF91aW50OCB0eXBlOjI7CisgICB3cHRfdWludDggc3VidHlwZTo0OworICAgd3B0X3VpbnQ4IHJlc2VydmVkMDoyOworCisgICB3cHRfdWludDE2IHJ0c2Y6MTsgIC8vRm9yIGJlYWNvbiBvbmx5LiAxIH5WIFJpdmEgVFNGIGlzIGJpZ2dlcihsYXRlcikgdGhhbiB0aGUgb25lIHJlY2VpdmVkCisgICB3cHRfdWludDE2IGJzZjoxOyAgIC8vMSBSaXZhIHNlbmRzIHRoZSBsYXN0IGJlYWNvbiwgMCBub3QuCisgICB3cHRfdWludDE2IHVua25vd25VY2FzdFBrdDoxOyAgIC8vMSB+ViB1bmljYXN0IGZyYW1lIHJlY2VpdmVkIHdpdGggdW5rbm93biBBMgorICAgd3B0X3VpbnQxNiBzY2FuOjE7ICAgLy8xIGZyYW1lIHJlY2VpdmVkIGluIHNjYW4gc3RhdGUuIDAgbm90LgorICAgd3B0X3VpbnQxNiBkcHVTaWc6MzsgICAvL0RQVSBzaWduYXR1cmUKKyAgIHdwdF91aW50MTYgZnQ6MTsgICAvLzB+V2ZyYW1lIHRyYW5zbGF0aW9uIGlzIG5vdCBkb25lLiAxfldkb25lCisgICB3cHRfdWludDE2IG5lOjE7ICAgLy8xIH5WIGZyYW1lIGlzIG5vdCBlbmNyeXB0ZWQgT1RBLiBUaGlzIGlzIGZvciBXQVBJflJzIFdBSSBwYWNrZXQuCisgICB3cHRfdWludDE2IGxsY3I6MTsgICAvLyBIYXMgdGhlIExMQyBiZWVuIHN0cmlwcGVkIGJ5IEgvVworICAgd3B0X3VpbnQxNiBiY2FzdDoxOyAgIC8vMCB+ViB1bmljYXN0IGZyYW1lIDEgflYgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZQorICAgd3B0X3VpbnQxNiB0aWQ6NDsKKyAgIHdwdF91aW50MTYgcmVzZXJ2ZWQxOjE7CisgICB3cHRfdWludDggZHB1RmVlZGJhY2s7CisgICB3cHRfaW50OCBzbnI7CisKKyAgIHdwdF91aW50MzIgY3VycmVudFBrdFNlcU5vOjEyOyAgLypjdXJyZW50IHNlcXVlbmNlIG51bWJlciAqLworICAgd3B0X3VpbnQzMiBhbXBkdV9yZW9yZGVyT3Bjb2RlOjQ7CisgICB3cHRfdWludDMyIGFtcGR1X3Jlb3JkZXJTbG90SWR4OjY7CisgICB3cHRfdWludDMyIGFtcGR1X3Jlb3JkZXJGd2RJZHg6NjsKKyAgIHdwdF91aW50MzIgcmVzZXJ2ZWQzOjQ7CisKKyAgIHdwdF91aW50MTYgYW1zZHVfc2l6ZTsKKyAgIHdwdF91aW50MzIgYW1zZHVfYXNmOjE7CisgICB3cHRfdWludDMyIGFtc2R1X2VzZjoxOworICAgd3B0X3VpbnQzMiBhbXNkdV9sc2Y6MTsKKyAgIHdwdF91aW50MzIgYW1zZHVfYWVmOjE7CisgICB3cHRfdWludDMyIHJlc2VydmVkMjo0OworCisgICB3cHRfdWludDggKm1wZHVIZWFkZXJQdHI7CisgICB3cHRfdWludDggKm1wZHVEYXRhUHRyOworICAgd3B0X3VpbnQzMiAgbXBkdUxlbmd0aDsKKyAgIHdwdF91aW50MzIgIG1wZHVIZWFkZXJMZW5ndGg7CisKKyAgIHdwdF91aW50MzIgIHJhdGVJbmRleDsKKyAgIHdwdF91aW50MzIgIHJ4cEZsYWdzOworICAgd3B0X3VpbnQzMiAgbWNsa1J4VGltZXN0YW1wOworCisgICAvL0Zsb3cgY29udHJvbCBmcmFtZXMKKyAgIHdwdF91aW50OCAgZmM7CisgICB3cHRfdWludDMyIGZjU1RBVHhRU3RhdHVzOjE2OworICAgd3B0X3VpbnQzMiBmY1NUQVRocmVzaEluZE1hc2s6MTY7CisgICB3cHRfdWludDMyIGZjU1RBUHdyU2F2ZVN0YXRlTWFzazoxNjsKKyAgIHdwdF91aW50MzIgZmNTVEFWYWxpZE1hc2s6MTY7CisKKyAgIHdwdF91aW50MTYgZmNTdGFUeERpc2FibGVkQml0bWFwOworICAgd3B0X3VpbnQ4IGZjU1RBVHhRTGVuWzEyXTsgLy8gb25lIGJ5dGUgcGVyIFNUQS4gCisgICB3cHRfdWludDggZmNTVEFDdXJUeFJhdGVbMTJdOyAvLyBjdXJyZW50IFR4IHJhdGUgZm9yIGVhY2ggc3RhLgorCisgICB3cHRfdWludDY0IHJlcGxheUNvdW50OworCisgICB3cHRfdWludDMyIHJzc2kwOworICAgd3B0X3VpbnQzMiByc3NpMTsKK30gV0RJX0RTX1J4TWV0YUluZm9UeXBlOworCit0eXBlZGVmIHN0cnVjdCBzUGt0TWV0YUluZm8KK3sKKyAgIHVuaW9uCisgICB7CisgICAgICBXRElfRFNfVHhNZXRhSW5mb1R5cGUgdHhNZXRhSW5mbzsKKyAgICAgIFdESV9EU19SeE1ldGFJbmZvVHlwZSByeE1ldGFJbmZvOworICAgfSB1OworfSBXRElfRFNfTWV0YUluZm9UeXBlOworCitXUFRfU1RBVElDIFdQVF9JTkxJTkUgV0RJX0RTX1J4TWV0YUluZm9UeXBlKiBXRElfRFNfRXh0cmFjdFJ4TWV0YURhdGEgKHdwdF9wYWNrZXQgKnBGcmFtZSkKK3sKKyAgV0RJX0RTX1J4TWV0YUluZm9UeXBlICogcFJ4TWV0YWRhdGEgPQorICAgICYoKFdESV9EU19NZXRhSW5mb1R5cGUgKilXUEFMX1BBQ0tFVF9HRVRfTUVUQUlORk9fUE9JTlRFUihwRnJhbWUpKS0+dS5yeE1ldGFJbmZvOworICByZXR1cm4gcFJ4TWV0YWRhdGE7Cit9CisKKworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIFdESV9EU19UeE1ldGFJbmZvVHlwZSogV0RJX0RTX0V4dHJhY3RUeE1ldGFEYXRhICh3cHRfcGFja2V0ICpwRnJhbWUpCit7CisgICAgICAgIFdESV9EU19UeE1ldGFJbmZvVHlwZSAqIHBUeE1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICAmKChXRElfRFNfTWV0YUluZm9UeXBlICopV1BBTF9QQUNLRVRfR0VUX01FVEFJTkZPX1BPSU5URVIocEZyYW1lKSktPnUudHhNZXRhSW5mbzsKKyAgICAgICAgcmV0dXJuIHBUeE1ldGFkYXRhOworfQorCisKK3R5cGVkZWYgdm9pZCAoKldESV9EU19UeENvbXBsZXRlQ2FsbGJhY2spKHZvaWQgKnBDb250ZXh0LCB3cHRfcGFja2V0ICpwRnJhbWUpOwordHlwZWRlZiB2b2lkICgqV0RJX0RTX1J4UGFja2V0Q2FsbGJhY2spICh2b2lkICpwQ29udGV4dCwgd3B0X3BhY2tldCAqcEZyYW1lKTsKK3R5cGVkZWYgdm9pZCAoKldESV9EU19UeEZsb3dDb250cm9sQ2FsbGJhY2spKHZvaWQgKnBDb250ZXh0LCB3cHRfdWludDggYWNfbWFzayk7CisKKworCisvKiBEQUwgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uLiAKKyAqIFBhcmFtZXRlcnM6CisgKiAgcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgCisgKiAgd2l0aCB0aGUgY2FsbGJhY2suCisgKiAgcGZuVHhDb21wbGV0ZUNhbGxiYWNrOkNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgdG8gYmUgaW52b2tlZCB0byByZXR1cm4gCisgKiAgcGFja2V0cyB3aGljaCBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQuCisgKiAgcGZuUnhQYWNrZXRDYWxsYmFjazpDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHRvIGJlIGludm9rZWQgdG8gZGVsaXZlciAKKyAqICBwYWNrZXRzIHdoaWNoIGhhdmUgYmVlbiByZWNlaXZlZAorICogIHBmblR4Rmxvd0NvbnRyb2xDYWxsYmFjazpDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHRvIGJlIGludm9rZWQgdG8gCisgKiAgaW5kaWNhdGUvY2xlYXIgY29uZ2VzdGlvbi4gCisgKgorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KK1dESV9TdGF0dXMgV0RJX0RTX1JlZ2lzdGVyKCB2b2lkICpwQ29udGV4dCwgCisgIFdESV9EU19UeENvbXBsZXRlQ2FsbGJhY2sgcGZuVHhDb21wbGV0ZUNhbGxiYWNrLAorICBXRElfRFNfUnhQYWNrZXRDYWxsYmFjayBwZm5SeFBhY2tldENhbGxiYWNrLCAKKyAgV0RJX0RTX1R4Rmxvd0NvbnRyb2xDYWxsYmFjayBwZm5UeEZsb3dDb250cm9sQ2FsbGJhY2ssCisgIHZvaWQgKnBDYWxsYmFja0NvbnRleHQpOworCisKKworLyogREFMIFRyYW5zbWl0IGZ1bmN0aW9uLiAKKyAqIFBhcmFtZXRlcnM6CisgKiAgcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2suCisgKiAgcEZyYW1lOlJlZmVybmNlIHRvIFBBTCBmcmFtZS4KKyAqICBtb3JlOiBEb2VzIHRoZSBpbnZva2VlIGhhdmUgbW9yZSB0aGFuIG9uZSBwYWNrZXQgcGVuZGluZz8KKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyAgQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICBGQUlMVVJFX1hYWCAgUmVxdWVzdCB3YXMgcmVqZWN0ZWQgZHVlIFhYWCBSZWFzb24uCisgKgorICovCisKKworV0RJX1N0YXR1cyBXRElfRFNfVHhQYWNrZXQodm9pZCAqcENvbnRleHQsCisgIHdwdF9wYWNrZXQgKnBGcmFtZSwKKyAgd3B0X2Jvb2xlYW4gbW9yZSk7CisgIAorICAKKy8qIERBTCBUcmFuc21pdCBDb21wbGV0ZSBmdW5jdGlvbi4gCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogIHVjVHhSZXNSZXE6VFggcmVzb3VyY2UgbnVtYmVyIHJlcXVpcmVkIGJ5IFRMCisgKiBSZXR1cm4gVmFsdWU6IFNVQ0NFU1MgIENvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgKiAgICAgRkFJTFVSRV9YWFggIFJlcXVlc3Qgd2FzIHJlamVjdGVkIGR1ZSBYWFggUmVhc29uLgorICoKKyAqLworCisKK1dESV9TdGF0dXMgV0RJX0RTX1R4Q29tcGxldGUodm9pZCAqcENvbnRleHQsIHdwdF91aW50MzIgdWNUeFJlc1JlcSk7CisKKy8qIERBTCBTdXNwZW5kIFRyYW5zbWl0IGZ1bmN0aW9uLiAKKyAqIFBhcmFtZXRlcnM6CisgKiAgcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2suCisgKiBSZXR1cm4gVmFsdWU6IFNVQ0NFU1MgIENvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgKiAgICAgRkFJTFVSRV9YWFggIFJlcXVlc3Qgd2FzIHJlamVjdGVkIGR1ZSBYWFggUmVhc29uLgorICoKKyAqLworCisKK1dESV9TdGF0dXMgV0RJX0RTX1R4U3VzcGVuZCh2b2lkICpwQ29udGV4dCk7CisKKworLyogREFMIFJlc3VtZSBUcmFuc21pdCBmdW5jdGlvbi4gCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KKworCitXRElfU3RhdHVzIFdESV9EU19UeFJlc3VtZSh2b2lkICpwQ29udGV4dCk7CisKKy8qIERBTCBHZXQgUmVzZXJ2ZWQgcmVzb3VyY2UgYnkgU1RBIAorICogUGFyYW1ldGVyczoKKyAqICBwQ29udGV4dDpDb29raWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxlciBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjay4KKyAqICB3ZGlSZXNQb29sOiBNZW1Qb29sLCBNR01UIG90IERBVEEKKyAqICBzdGFJZDogU1RBIElECisgKiBSZXR1cm4gVmFsdWU6IE51bWJlciBvZiByZXNlcnZlZCByZXNvdWNlIGNvdW50CisgKgorICovCit3cHRfdWludDMyIFdESV9EU19HZXRSZXNlcnZlZFJlc0NvdW50UGVyU1RBKHZvaWQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfUmVzUG9vbFR5cGUgd2RpUmVzUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3B0X3VpbnQ4IHN0YUlkKTsKKworLyogREFMIEFERCBTVEEgaW50byBtZW1Qb29sCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogIHN0YUlkOiBTVEEgSUQKKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyBvciBGQUlMCisgKgorICovCitXRElfU3RhdHVzIFdESV9EU19BZGRTVEFNZW1Qb29sKHZvaWQgKnBDb250ZXh0LCB3cHRfdWludDggc3RhSW5kZXgpOworCisvKiBEQUwgUmVtb3ZlIFNUQSBmcm9tIG1lbVBvb2wKKyAqIFBhcmFtZXRlcnM6CisgKiAgcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2suCisgKiAgc3RhSWQ6IFNUQSBJRAorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTIG9yIEZBSUwKKyAqCisgKi8KK1dESV9TdGF0dXMgV0RJX0RTX0RlbFNUQU1lbVBvb2wodm9pZCAqcENvbnRleHQsIHdwdF91aW50OCBzdGFJbmRleCk7CisKKy8qIERBTCBTZXQgU1RBIGluZGV4IGFzc29jaWF0ZWQgd2l0aCBCU1MgaW5kZXguIAorICogUGFyYW1ldGVyczoKKyAqICBwQ29udGV4dDpDb29raWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxlciBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjay4KKyAqICBic3NJZHg6IEJTUyBpbmRleAorICogIHN0YUlkOiBTVEEgaW5kZXggYXNzb2NpYXRlZCB3aXRoIEJTUyBpbmRleAorICogUmV0dXJuIFN0YXR1czogRm91bmQgZW1wdHkgc2xvdAorICoKKyAqLworV0RJX1N0YXR1cyBXRElfRFNfU2V0U3RhSWR4UGVyQnNzSWR4KHZvaWQgKnBDb250ZXh0LCB3cHRfdWludDggYnNzSWR4LCB3cHRfdWludDggc3RhSWR4KTsKKworLyogREFMIEdldCBTVEEgaW5kZXggYXNzb2NpYXRlZCB3aXRoIEJTUyBpbmRleC4gCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogIGJzc0lkeDogQlNTIGluZGV4CisgKiAgc3RhSWQ6IFNUQSBpbmRleCBhc3NvY2lhdGVkIHdpdGggQlNTIGluZGV4CisgKiBSZXR1cm4gU3RhdHVzOiBGb3VuZCBlbXB0eSBzbG90CisgKgorICovCitXRElfU3RhdHVzIFdESV9EU19HZXRTdGFJZHhGcm9tQnNzSWR4KHZvaWQgKnBDb250ZXh0LCB3cHRfdWludDggYnNzSWR4LCB3cHRfdWludDggKnN0YUlkeCk7CisKKy8qIERBTCBDbGVhciBTVEEgaW5kZXggYXNzb2NpYXRlZCB3aXRoIEJTUyBpbmRleC4gCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogIGJzc0lkeDogQlNTIGluZGV4CisgKiAgc3RhSWQ6IFNUQSBpbmRleCBhc3NvY2lhdGVkIHdpdGggQlNTIGluZGV4CisgKiBSZXR1cm4gU3RhdHVzOiBGb3VuZCBlbXB0eSBzbG90CisgKgorICovCitXRElfU3RhdHVzIFdESV9EU19DbGVhclN0YUlkeFBlckJzc0lkeCh2b2lkICpwQ29udGV4dCwgd3B0X3VpbnQ4IGJzc0lkeCwgd3B0X3VpbnQ4IHN0YUlkeCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvRFAvaW5jL3dsYW5fcWN0X3dkaV9kc19pLmggYi9DT1JFL1dESS9EUC9pbmMvd2xhbl9xY3Rfd2RpX2RzX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJjMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvRFAvaW5jL3dsYW5fcWN0X3dkaV9kc19pLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfV0RJX0RTX0lfSCApCisjZGVmaW5lIF9fV0xBTl9RQ1RfV0RJX0RTX0lfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogICAgICAgXGZpbGUgIHdsYW5fcWN0X3dkaV9kc19pLmgKKyAqCisgKiAgICAgICBcYnJpZWYgZGVmaW5lIERhdGFzZXJ2aWNlIEFQSQorICoKKyAqIFdMQU4gRGV2aWNlIEFic3RyYWN0aW9uIGxheWVyIEV4dGVybmFsIEFQSSBmb3IgRGF0YXNlcnZpY2UKKyAqIERFU0NSSVBUSU9OCisgKiAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZXh0ZXJuYWwgQVBJIGV4cG9zZWQgYnkgdGhlCisgKiAgIHdsYW4gZGV2aWNlIGFic3RhcmN0aW9uIGxheWVyIG1vZHVsZS4KKyAqCisgKiAgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKyAqLworCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3R5cGUuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfc3RhdHVzLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3BhY2tldC5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9kcy5oIgorI2luY2x1ZGUgIndsYW5fcWN0X2R4ZS5oIgorCisKKyNkZWZpbmUgV0RJX0RTX01BWF9DSFVOS19TSVpFIDEyOAorI2RlZmluZSBXRElfODAyXzExX01BWF9IRUFERVJfTEVOIDQwCisKKworLypUaGUgbnVtYmVyIG9mIHJlc291cmNlcyAoQkQgaGVhZGVycykgYXZhaWxhYmxlIGZvciB0aGUgSEkgcHJpb3JpdHkgRFhFCisgIGNoYW5uZWwKKyAgRFhFIHdpbGwgdXNlIDEgZGVzY3JpcHRvciBmb3IgdGhlIEJEIGhlYWRlciBhbmQgMSBmb3IgdGhlIGRhdGEgPT4KKyAgVGhpcyBpcyB0cnVlIGZvciBMQSBidXQgbm90IEVBLiBFQSBzZW5kcyBkb3duIDN+NCBNREwgY2hhaW4gcGVyIGEgcGFja2V0LgorICBOb3cgd2Ugc2V0IGl0IHRoZSBzYW1lIHdpdGggZnJlZSBEWEUgZGVjcmlwdG9yIG51bWJlciovCisjZGVmaW5lIFdESV9EU19ISV9QUklfUkVTX05VTSAgKFdMQU5EWEVfSElfUFJJX1JFU19OVU0pCisKKy8qVGhlIG51bWJlciBvZiByZXNvdXJjZXMgKEJEIGhlYWRlcnMpIGF2YWlsYWJsZSBmb3IgdGhlIExvdyBwcmlvcml0eSBEWEUKKyAgY2hhbm5lbCAtIHNlZSBhYm92ZQorKi8KKyNkZWZpbmUgV0RJX0RTX0xPX1BSSV9SRVNfTlVNICAoV0xBTkRYRV9MT19QUklfUkVTX05VTSkKKworLypUaGUgbnVtYmVyIG9mIEJEIGhlYWRlcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0gZm9yIFR4IG11c3QgbWF0Y2ggdGhlIG51bWJlcgorICBvZiBEWEUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlIGZvciBhY3R1YWwgdHJhbnNtaXNzaW9uLCBvdGhlcndpc2Ugd2UgaGF2ZSB0bworICBtYW5hZ2UgdHdvIGRpZmZyZW50IGxldmVsIG9mIHJlc291cmNlIHBvb2xzKi8KKworI2RlZmluZSBXRElfTUFDX0FERFJfU0laRSAoIDYgKQorLyo4MDIuMyBoZWFkZXIgZGVmaW5pdGlvbnMqLworI2RlZmluZSAgV0RJXzgwMl8zX0hFQURFUl9MRU4gICAgICAgICAgICAgMTQKKy8qIE9mZnNldCBvZiBEQSBmaWVsZCBpbiBhIDgwMi4zIGhlYWRlciovCisjZGVmaW5lICBXRElfODAyXzNfSEVBREVSX0RBX09GRlNFVCAgICAgICAgMAorLyo4MDIuMTEgaGVhZGVyIGRlZmluaXRpb25zIC0gaGVhZGVyIGxlbiB3aXRob3V0IFFPUyBjdHJsIGZpZWxkKi8KKyNkZWZpbmUgIFdESV84MDJfMTFfSEVBREVSX0xFTiAgICAgICAgICAgIDI0CisvKjgwMi4xMSBoZWFkZXIgbGVuZ3RoICsgUU9TIGN0cmwgZmllbGQqLworI2RlZmluZSAgV0RJX01QRFVfSEVBREVSX0xFTiAgICAgICAgICAgICAgMjYKKy8qODAyLjExIGhlYWRlciBkZWZpbml0aW9ucyovCisjZGVmaW5lICBXRElfODAyXzExX01BWF9IRUFERVJfTEVOICAgICAgICA0MAorLyo4MDIuMTEgaGVhZGVyIGRlZmluaXRpb25zIC0gcW9zIGN0cmwgZmllbGQgbGVuKi8KKyNkZWZpbmUgIFdESV84MDJfMTFfSEVBREVSX1FPU19DVEwgICAgICAgICAyCisvKjgwMi4xMSBBRERSNCBNQUMgYWRkciBmaWVsZCBsZW4gKi8KKyNkZWZpbmUgIFdESV84MDJfMTFfSEVBREVSX0FERFI0X0xFTiAgICAgICBXRElfTUFDX0FERFJfU0laRQorCisKKworCisKK3R5cGVkZWYgZW51bQoreworICAgRFRJX1RSQUNFX0xFVkVMX0ZBVEFMLAorICAgRFRJX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgRFRJX1RSQUNFX0xFVkVMX1dBUk4sCisgICBEVElfVFJBQ0VfTEVWRUxfSU5GTworCit9IERUSV9UUkFDRV9MRVZFTDsKKworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHZvaWQgRFRJX1RSQUNFICggRFRJX1RSQUNFX0xFVkVMIGxldmVsLCAuLi4pIHsgfTsKKworLyogISEhIE1BWCBOVU0gU1RBIGlzIG5vdCBpZGVudGlmaWVkIHlldCwgMTYgaXMgY29ycmVjdCB2YWx1ZSwKKyAgIGJ1dCBuZWVkIHRvIGdldCBmcm9tIGNvcnJlY3QgY29tbW9uIGRlZgorICAgVGhpcyBzaG91bGQgYmUgaWRlbnRpZmllZCBBU0FQICovCisjZGVmaW5lIFdESV9EU19NQVhfU1RBX0lEIDE2CisKKy8qICEhISBNQVggTlVNIFNVUFBPUlRFRCBCU1MgaXMgbm90IGlkZW50aWZpZWQgeWV0LCAyIGlzIGNvcnJlY3QgdmFsdWUsCisgICAgYnV0IG5lZWQgdG8gZ2V0IGZyb20gY29ycmVjdCBjb21tb24gZGVmCisgICBUaGlzIHNob3VsZCBiZSBpZGVudGlmaWVkIEFTQVAgKi8KKyNkZWZpbmUgV0RJX0RTX01BWF9TVVBQT1JURURfQlNTICAgMgorCisjZGVmaW5lIFdESV9EU19JTkRFWF9JTlZBTElEICAgICAgIDB4RkYKKworLyogTWVtIFBvb2wgcmVzb3JjZSBjb3VudCBwZXIgU1RBIGRhdGEgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB3cHRfdWludDggICAgdmFsaWRJZHg7CisgIHdwdF91aW50OCAgICBTVEFJbmRleDsKKyAgd3B0X3VpbnQzMiAgIG51bUNodW5rUmVzZXJ2ZWRCeVNUQTsKKyAgLyogTXV0ZXgsIGlzIG5vdCBuZWVkZWQgZm9yIGNvdW50ZXIgb3BlcmF0aW9uCisgICAgIHNpbmNlIGFsbCBUWCBEYXRhIGZyYW1lIG9wZXJhdGlvbnMgd2lsbCBoYXBwZW4gb25seSBUWCB0aHJlYWQKKyAgICAgQWxsIG9mIHRoZSBUWCBkYXRhIGZyYW1lIG9wZXJhdGlvbnMgYXJlIHNlcmlhbGl6ZWQsIG5vIHByZS1lbXB0aW9uIHdpbGwgaGFwcGVuCisgICAgIFRoaXMgaXMganVzdCBmb3IgcGxhY2UgaG9sZGVyICovCisgIHdwdF9tdXRleCAgICByZXNvdXJjZUNvdW50TG9jazsKK30gV0RJX0RTX0JkTWVtUG9vbFNUQVR5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAqcFZpcnRCYXNlQWRkcmVzczsKKyAgdm9pZCAqcFBoeXNCYXNlQWRkcmVzczsKKyAgd3B0X3VpbnQzMiBwb29sU2l6ZTsKKyAgd3B0X3VpbnQzMiBudW1DaHVua3M7CisgIHdwdF91aW50MzIgY2h1bmtTaXplOworICB3cHRfdWludDMyKiBBbGxvY2F0aW9uQml0bWFwOworICBXRElfRFNfQmRNZW1Qb29sU1RBVHlwZSBudW1DaHVua1NUQVtXRElfRFNfTUFYX1NUQV9JRCArIDFdOworfSBXRElfRFNfQmRNZW1Qb29sVHlwZTsKKworLyogU1RBIGluZGV4IGFzc29jaWF0ZWQgd2l0aCBCU1MgaW5kZXggZGF0YSB0eXBlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgd3B0X3VpbnQ4ICAgaXNVc2VkOworICAgd3B0X3VpbnQ4ICAgYnNzSWR4OworICAgd3B0X3VpbnQ4ICAgc3RhSWR4OworfSBXRElfRFNfc3RhSWR4UGVyQnNzSWR4VHlwZTsKKworV0RJX1N0YXR1cyBXRElfRFNfTWVtUG9vbENyZWF0ZShXRElfRFNfQmRNZW1Qb29sVHlwZSAqbWVtUG9vbCwgd3B0X3VpbnQ4IGNodW5rU2l6ZSwgd3B0X3VpbnQ4IG51bUNodW5rcyk7Cit2b2lkICpXRElfRFNfTWVtUG9vbEFsbG9jKFdESV9EU19CZE1lbVBvb2xUeXBlICptZW1Qb29sLCB2b2lkICoqcFBoeXNBZGRyZXNzLCBXRElfUmVzUG9vbFR5cGUgd2RpUmVzUG9vbCk7Cit2b2lkICBXRElfRFNfTWVtUG9vbEZyZWUoV0RJX0RTX0JkTWVtUG9vbFR5cGUgKm1lbVBvb2wsIHZvaWQgKnBWaXJ0QWRkcmVzcywgdm9pZCAqcFBoeXNBZGRyZXNzKTsKK3ZvaWQgV0RJX0RTX01lbVBvb2xEZXN0cm95KFdESV9EU19CZE1lbVBvb2xUeXBlICptZW1Qb29sKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGNvbnRleHQ7CisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDYWxsYmFja0NvbnRleHQ7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbmQ7CisgIFdESV9EU19CZE1lbVBvb2xUeXBlICAgICAgICAgICAgIG1nbXRNZW1Qb29sOworICBXRElfRFNfQmRNZW1Qb29sVHlwZSAgICAgICAgICAgICBkYXRhTWVtUG9vbDsKKyAgV0RJX0RTX1J4UGFja2V0Q2FsbGJhY2sgICAgICAgICAgcmVjZWl2ZUZyYW1lQ0I7CisgIFdESV9EU19UeENvbXBsZXRlQ2FsbGJhY2sgICAgICAgIHR4Q29tcGxldGVDQjsKKyAgV0RJX0RTX1R4Rmxvd0NvbnRyb2xDYWxsYmFjayAgICAgdHhSZXNvdXJjZUNCOworICBXRElfRFNfc3RhSWR4UGVyQnNzSWR4VHlwZSAgICAgICBzdGFJZHhQZXJCc3NJZHhUYWJsZVtXRElfRFNfTUFYX1NVUFBPUlRFRF9CU1NdOworfSBXRElfRFNfQ2xpZW50RGF0YVR5cGU7CisKK1dQVF9TVEFUSUMgV1BUX0lOTElORSB2b2lkIFdESV9HZXRCRFBvaW50ZXJzKHdwdF9wYWNrZXQgKnBGcmFtZSwgdm9pZCAqKnBWaXJ0LCB2b2lkICoqcFBoeXMpCit7CisgICpwVmlydCA9IFdQQUxfUEFDS0VUX0dFVF9CRF9QT0lOVEVSKHBGcmFtZSk7CisgICpwUGh5cyA9IFdQQUxfUEFDS0VUX0dFVF9CRF9QSFlTKHBGcmFtZSk7Cit9CisKKworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHZvaWQgV0RJX1NldEJEUG9pbnRlcnMod3B0X3BhY2tldCAqcEZyYW1lLCB2b2lkICpwVmlydCwgdm9pZCAqcFBoeXMpCit7CisgIFdQQUxfUEFDS0VUX1NFVF9CRF9QT0lOVEVSKHBGcmFtZSwgcFZpcnQpOworICBXUEFMX1BBQ0tFVF9TRVRfQkRfUEhZUyhwRnJhbWUsIHBQaHlzKTsKK30KKworCit2b2lkCitXRElfRFNfUHJlcGFyZUJESGVhZGVyICgKKyAgd3B0X3BhY2tldCogICAgIHBhbFBhY2tldCwKKyAgd3B0X3VpbnQ4ICAgICAgdWNEaXNhYmxlSFdGcm1YdGwsCisgIHdwdF91aW50OCAgICAgICBhbGlnbm1lbnQKKyk7CisKKy8qKgorIEBicmllZiBSZXR1cm5zIHRoZSBhdmFpbGFibGUgbnVtYmVyIG9mIHJlc291cmNlcyAoQkQgaGVhZGVycykKKyAgICAgICAgYXZhaWxhYmxlIGZvciBUWAorCisgQHBhcmFtICBwTWVtUG9vbDogICAgICAgICBwb2ludGVyIHRvIHRoZSBCRCBtZW1vcnkgcG9vbAorCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLword3B0X3VpbnQzMiBXRElfRFNfR2V0QXZhaWxhYmxlUmVzQ291bnQoV0RJX0RTX0JkTWVtUG9vbFR5cGUgKnBNZW1Qb29sKTsKKworLyoqCisgQGJyaWVmIFdESV9EU19HZXRyZXNlcnZlZFJlc0NvdW50UGVyU1RBCisgICAgICAgIFJldHVybnMgdGhlIFJlc2VydmVkIG51bWJlciBvZiByZXNvdXJjZXMgKEJEIGhlYWRlcnMpCisgICAgICAgIGF2YWlsYWJsZSBmb3IgVFgKKworIEBwYXJhbSAgcE1lbVBvb2w6ICAgICAgICAgcG9pbnRlciB0byB0aGUgQkQgbWVtb3J5IHBvb2wKKyBAcGFyYW0gIHN0YUlkICAgICAgICAgICAgIFNUQSBJRAorCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLword3B0X3VpbnQzMiBXRElfRFNfTWVtUG9vbEdldFJzdmRSZXNDb3VudFBlclNUQShXRElfRFNfQmRNZW1Qb29sVHlwZSAqcE1lbVBvb2wsIHdwdF91aW50OCAgc3RhSWQpOworCisvKioKKyBAYnJpZWYgV0RJX0RTX01lbVBvb2xBZGRTVEEKKyAgICAgICAgQWRkIE5FVyBTVEEgaW50byBtZW1wb29sCisKKyBAcGFyYW0gIHBNZW1Qb29sOiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIG1lbW9yeSBwb29sCisgQHBhcmFtICBzdGFJZCAgICAgICAgICAgICBTVEEgSUQKKworIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgV0RJX0RTX01lbVBvb2xBZGRTVEEoV0RJX0RTX0JkTWVtUG9vbFR5cGUgKm1lbVBvb2wsIHdwdF91aW50OCBzdGFJbmRleCk7CisKKy8qKgorIEBicmllZiBXRElfRFNfTWVtUG9vbEFkZFNUQQorICAgICAgICBSZW1vdmUgU1RBIGZyb20gbWVtcG9vbAorCisgQHBhcmFtICBwTWVtUG9vbDogICAgICAgICBwb2ludGVyIHRvIHRoZSBCRCBtZW1vcnkgcG9vbAorIEBwYXJhbSAgc3RhSWQgICAgICAgICAgICAgU1RBIElECisKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCitXRElfU3RhdHVzIFdESV9EU19NZW1Qb29sRGVsU1RBKFdESV9EU19CZE1lbVBvb2xUeXBlICptZW1Qb29sLCB3cHRfdWludDggc3RhSW5kZXgpOworCisvKioKKyBAYnJpZWYgSW5jcmVhc2UgcmVzZXJ2ZWQgVFggcmVzb3VyY2UgY291bnQgYnkgc3BlY2lmaWMgU1RBCisKKyBAcGFyYW0gIHBNZW1Qb29sOiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIG1lbW9yeSBwb29sCisgQHBhcmFtICBzdGFJZCAgICAgICAgICAgICBTVEEgSUQKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCit2b2lkIFdESV9EU19NZW1Qb29sSW5jcmVhc2VSZXNlcnZlQ291bnQoV0RJX0RTX0JkTWVtUG9vbFR5cGUgKm1lbVBvb2wsIHdwdF91aW50OCAgc3RhSWQpOworCisvKioKKyBAYnJpZWYgRGVjcmVhc2UgcmVzZXJ2ZWQgVFggcmVzb3VyY2UgY291bnQgYnkgc3BlY2lmaWMgU1RBCisKKyBAcGFyYW0gIHBNZW1Qb29sOiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIG1lbW9yeSBwb29sCisgQHBhcmFtICBzdGFJZCAgICAgICAgICAgICBTVEEgSUQKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCit2b2lkIFdESV9EU19NZW1Qb29sRGVjcmVhc2VSZXNlcnZlQ291bnQoV0RJX0RTX0JkTWVtUG9vbFR5cGUgKm1lbVBvb2wsIHdwdF91aW50OCAgc3RhSWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1dESS9EUC9zcmMvd2xhbl9xY3Rfd2RpX2JkLmMgYi9DT1JFL1dESS9EUC9zcmMvd2xhbl9xY3Rfd2RpX2JkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxZDMwNQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL0RQL3NyYy93bGFuX3FjdF93ZGlfYmQuYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiAgICAgICBcZmlsZSAgd2xhbl9xY3RfZHRpX2JkLmMKKyAqCisgKiAgICAgICBcYnJpZWYgRGF0YXBhdGggdXRpbGl0aWVzIGZpbGUuCisgKgorICogV0xBTiBEZXZpY2UgQWJzdHJhY3Rpb24gbGF5ZXIgRXh0ZXJuYWwgQVBJIGZvciBEYXRhc2VydmljZQorICogREVTQ1JJUFRJT04KKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSSBpbXBsZW1udGF0aW9uIGV4cG9zZWQgYnkgdGhlCisgKiAgIHdsYW4gZGV2aWNlIGFic3RhcmN0aW9uIGxheWVyIG1vZHVsZS4KKyAqCisgKiAgIENvcHlyaWdodCAoYykgMjAwOCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKyAqLworCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2RzLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2RzX2kuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfZHRzLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2RwLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3R5cGUuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfc3RhdHVzLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX2FwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9wYWNrZXQuaCIKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgRlVOQ1RJT04gICAgV0RJX0RTX1ByZXBhcmVCREhlYWRlcgorCisgREVTQ1JJUFRJT04KKyBmdW5jdGlvbiBmb3IgcHJlcGFyaW5nIEJEIGhlYWRlciBiZWZvcmUgSEFMIHByb2Nlc3NpbmcuCisKKyBQQVJBTUVURVJTCisKKyBJTgorcGFsUGFja2V0OiAgICAgUEFMIHBhY2tldCBwb2ludGVyCisKKworUkVUVVJOIFZBTFVFCitObyByZXR1cm4uCisKK1NJREUgRUZGRUNUUworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQKK1dESV9EU19QcmVwYXJlQkRIZWFkZXIgKHdwdF9wYWNrZXQqIHBhbFBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdwdF91aW50OCB1Y0Rpc2FibGVIV0ZybVh0bCwgd3B0X3VpbnQ4IGFsaWdubWVudCkKK3sKKyAgdm9pZCogICAgICAgICAgcHZCREhlYWRlcjsKKyAgd3B0X3VpbnQ4ICAgICAgdWNIZWFkZXJPZmZzZXQ7CisgIHdwdF91aW50OCAgICAgIHVjSGVhZGVyTGVuOworICB3cHRfdWludDggICAgICB1Y1Fvc0VuYWJsZWQ7CisgIHdwdF91aW50OCAgICAgIHVjV0RTRW5hYmxlZDsKKyAgd3B0X3VpbnQzMiAgICAgdWNNcGR1TGVuOworICB3cHRfdWludDMyICAgICB1Y1BrdExlbjsKKyAgV0RJX0RTX1R4TWV0YUluZm9UeXBlICAgICAqcFR4TWV0YWRhdGE7CisKKworICAvKiBFeHRyYWN0IHJldXFpcmVkIGluZm9ybWF0aW9uIGZyb20gTWV0YWRhdGEgKi8KKyAgcHZCREhlYWRlciA9IFdQQUxfUEFDS0VUX0dFVF9CRF9QT0lOVEVSKHBhbFBhY2tldCk7CisgIHBUeE1ldGFkYXRhID0gV0RJX0RTX0V4dHJhY3RUeE1ldGFEYXRhKHBhbFBhY2tldCk7CisgIHVjUW9zRW5hYmxlZCA9IHBUeE1ldGFkYXRhLT5xb3NFbmFibGVkOworICB1Y1dEU0VuYWJsZWQgPSBwVHhNZXRhZGF0YS0+ZmVuYWJsZVdEUzsKKworICBXUEFMX1BBQ0tFVF9TRVRfQkRfTEVOR1RIKHBhbFBhY2tldCwgV0RJX1RYX0JEX0hFQURFUl9TSVpFKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZpbGwgTVBEVSBpbmZvIGZpZWxkczoKKyAgICAtIE1QRFUgZGF0YSBzdGFydCBvZmZzZXQKKyAgICAtIE1QRFUgaGVhZGVyIHN0YXJ0IG9mZnNldAorICAgIC0gTVBEVSBoZWFkZXIgbGVuZ3RoCisgICAgLSBNUERVIGxlbmd0aCAtIHRoaXMgaXMgYSAxNmIgZmllbGQgLSBuZWVkcyBzd2FwcGluZworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICBpZiAoIHVjRGlzYWJsZUhXRnJtWHRsICkgeworICAgIHVjSGVhZGVyT2Zmc2V0ID0gV0RJX1RYX0JEX0hFQURFUl9TSVpFOworICAgIHVjSGVhZGVyTGVuID0gV0RJXzgwMl8xMV9IRUFERVJfTEVOOworICAgIGlmICggMCAhPSB1Y1Fvc0VuYWJsZWQgKSB7CisgICAgICB1Y0hlYWRlckxlbiArPSBXRElfODAyXzExX0hFQURFUl9RT1NfQ1RMOworICAgIH0KKyAgICBpZiAoIDAgIT0gdWNXRFNFbmFibGVkKSB7CisgICAgICB1Y0hlYWRlckxlbiAgICArPSBXRElfODAyXzExX0hFQURFUl9BRERSNF9MRU47CisgICAgfQorICB9IGVsc2UgeworICAgIHVjSGVhZGVyT2Zmc2V0ID0gV0RJX1RYX0JEX0hFQURFUl9TSVpFK1dESV84MDJfMTFfTUFYX0hFQURFUl9MRU47CisgICAgdWNIZWFkZXJMZW4gPSBXRElfODAyXzNfSEVBREVSX0xFTjsKKyAgfQorCisgIFdESV9UWF9CRF9TRVRfTVBEVV9IRUFERVJfTEVOKCBwdkJESGVhZGVyLCB1Y0hlYWRlckxlbik7CisgIFdESV9UWF9CRF9TRVRfTVBEVV9IRUFERVJfT0ZGU0VUKCBwdkJESGVhZGVyLCB1Y0hlYWRlck9mZnNldCk7CisgIFdESV9UWF9CRF9TRVRfTVBEVV9EQVRBX09GRlNFVCggcHZCREhlYWRlciwKKyAgICAgIHVjSGVhZGVyT2Zmc2V0ICsgdWNIZWFkZXJMZW4gKyBhbGlnbm1lbnQpOworCisgIC8vIHBrdCBsZW5ndGggZnJvbSBQQUwgQVBJLiBOZWVkIHRvIGNoYW5nZSBpbiBjYXNlIG9mIEhXIEZUIHVzZWQKKyAgdWNQa3RMZW4gID0gd3BhbFBhY2tldEdldExlbmd0aCggcGFsUGFja2V0ICk7IC8vIFRoaXMgaW5jbHVkZXMgQkQgbGVuZ3RoCisgIC8qKiBUaGlzIGlzIHRoZSBsZW5ndGggKGluIG51bWJlciBvZiBieXRlcykgb2YgdGhlIGVudGlyZSBNUERVCisgICAgICAoaGVhZGVyIGFuZCBkYXRhKS4gTm90ZSB0aGF0IHRoZSBsZW5ndGggSU5DTFVERVMgRkNTIGZpZWxkLiAqLworICB1Y01wZHVMZW4gPSB1Y1BrdExlbiAtIFdQQUxfUEFDS0VUX0dFVF9CRF9MRU5HVEgoIHBhbFBhY2tldCApOworICBXRElfVFhfQkRfU0VUX01QRFVfTEVOKCBwdkJESGVhZGVyLCB1Y01wZHVMZW4gKTsKKworICBEVElfVFJBQ0UoICBEVElfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICJXTEFOIERUSTogVkFMVUVTIEFSRSBITGVuPSV4IEhvZmY9JXggZG9mZj0leCBsZW49JXggZXg9JWQiLAorICAgICAgdWNIZWFkZXJMZW4sIHVjSGVhZGVyT2Zmc2V0LAorICAgICAgKHVjSGVhZGVyT2Zmc2V0ICsgdWNIZWFkZXJMZW4gKyBhbGlnbm1lbnQpLAorICAgICAgcFR4TWV0YWRhdGEtPmZQa3RsZW4sIGFsaWdubWVudCk7CisKK30vKiBXRElfRFNfUHJlcGFyZUJESGVhZGVyICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgRlVOQ1RJT05TICAgIFdESV9EU19NZW1Qb29sWFhYCisKKyBERVNDUklQVElPTgorICBBUElzIGZvciBtYW5hZ2luZyB0aGUgQkQgaGVhZGVyIG1lbW9yeSBwb29sCisgUEFSQU1FVEVSUworCisgSU4KK1dESV9EU19CZE1lbVBvb2xUeXBlOiAgICAgTWVtb3J5IHBvb2wgcG9pbnRlcgorCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBDcmVhdGUgYSBtZW1vcnkgcG9vbCB3aGljaCBpcyBETUEgY2FwYWJhbGUKKyAqLworV0RJX1N0YXR1cyBXRElfRFNfTWVtUG9vbENyZWF0ZShXRElfRFNfQmRNZW1Qb29sVHlwZSAqbWVtUG9vbCwgd3B0X3VpbnQ4IGNodW5rU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwdF91aW50OCBudW1DaHVua3MpCit7CisgIHdwdF91aW50OCBzdGFMb29wOworCisgIC8vQWxsb2NhdGUgYWxsIHRoZSBtYXggc2l6ZSBhbmQgYWxpZ24gdGhlbSB0byBhIGRvdWJsZSB3b3JkIGJvdW5kYXJ5LiBUaGUgZmlyc3QgOCBieXRlcyBhcmUgY29udHJvbCBieXRlcy4KKyAgbWVtUG9vbC0+bnVtQ2h1bmtzID0gMDsKKyAgbWVtUG9vbC0+Y2h1bmtTaXplID0gY2h1bmtTaXplICsgMTYgLSAoY2h1bmtTaXplJTgpOworICBtZW1Qb29sLT5wVmlydEJhc2VBZGRyZXNzID0gd3BhbERtYU1lbW9yeUFsbG9jYXRlKChudW1DaHVua3MgKiBtZW1Qb29sLT5jaHVua1NpemUpLAorICAgICAgICAgICYobWVtUG9vbC0+cFBoeXNCYXNlQWRkcmVzcykpOworCisgIGlmKCBtZW1Qb29sLT5wVmlydEJhc2VBZGRyZXNzID09IDApCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworCisgIG1lbVBvb2wtPkFsbG9jYXRpb25CaXRtYXAgPSAod3B0X3VpbnQzMiopd3BhbE1lbW9yeUFsbG9jYXRlKCAobnVtQ2h1bmtzLzMyICsgMSkgKiBzaXplb2Yod3B0X3VpbnQzMikpOworICBpZiggTlVMTCA9PSBtZW1Qb29sLT5BbGxvY2F0aW9uQml0bWFwKQorICAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgIHdwYWxNZW1vcnlaZXJvKG1lbVBvb2wtPkFsbG9jYXRpb25CaXRtYXAsIChudW1DaHVua3MvMzIrMSkqc2l6ZW9mKHdwdF91aW50MzIpKTsKKworICAvL0luaXRpYWxpemUgcmVzb3VyY2UgaW5mb3IgcGVyIFNUQQorICBmb3Ioc3RhTG9vcCA9IDA7IHN0YUxvb3AgPCBXRElfRFNfTUFYX1NUQV9JRDsgc3RhTG9vcCsrKQorICB7CisgICAgbWVtUG9vbC0+bnVtQ2h1bmtTVEFbc3RhTG9vcF0uU1RBSW5kZXggPSAweEZGOworICAgIG1lbVBvb2wtPm51bUNodW5rU1RBW3N0YUxvb3BdLm51bUNodW5rUmVzZXJ2ZWRCeVNUQSA9IDA7CisgICAgbWVtUG9vbC0+bnVtQ2h1bmtTVEFbc3RhTG9vcF0udmFsaWRJZHggPSAwOworICB9CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKyAqIERlc3Ryb3kgdGhlIG1lbW9yeSBwb29sCisgKi8KK3ZvaWQgV0RJX0RTX01lbVBvb2xEZXN0cm95KFdESV9EU19CZE1lbVBvb2xUeXBlICptZW1Qb29sKQoreworICAvL0FsbG9jYXRlIGFsbCB0aGUgbWF4IHNpemUuCisgIHdwYWxEbWFNZW1vcnlGcmVlKG1lbVBvb2wtPnBWaXJ0QmFzZUFkZHJlc3MpOworICB3cGFsTWVtb3J5RnJlZShtZW1Qb29sLT5BbGxvY2F0aW9uQml0bWFwKTsKKyAgd3BhbE1lbW9yeVplcm8obWVtUG9vbCwgc2l6ZW9mKCptZW1Qb29sKSk7Cit9CisvKgorICogQWxsb2NhdGUgY2h1bmsgbWVtb3J5CisgKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSBpbnQgZmluZF9sZWFkaW5nX3plcm9fYW5kX3NldGJpdCh3cHRfdWludDMyICpiaXRtYXAsIHdwdF91aW50MzIgbWF4TnVtUG9vbCkKK3sKKyAgd3B0X3VpbnQzMiBpLGosIHdvcmQ7CisKKyAgZm9yKGk9MDsgaSA8IChtYXhOdW1Qb29sLzMyICsgMSk7IGkrKyl7CisgICAgaiA9IDA7CisgICAgd29yZCA9IGJpdG1hcFtpXTsKKyAgICBmb3Ioaj0wOyBqPCAzMjsgaisrKXsKKyAgICAgIGlmKCh3b3JkICYgMSkgPT0gMCkgeworICAgICAgICBiaXRtYXBbaV0gfD0gKDEgPDwgaik7CisgICAgICAgIHJldHVybigoaTw8NSkgKyBqKTsKKyAgICAgIH0KKyAgICAgIHdvcmQgPj49IDE7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KKwordm9pZCAqV0RJX0RTX01lbVBvb2xBbGxvYyhXRElfRFNfQmRNZW1Qb29sVHlwZSAqbWVtUG9vbCwgdm9pZCAqKnBQaHlzQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRElfUmVzUG9vbFR5cGUgd2RpUmVzUG9vbCkKK3sKKyAgd3B0X3VpbnQzMiBpbmRleDsKKyAgdm9pZCAqcFZpcnRBZGRyZXNzOworICB3cHRfdWludDMyIG1heE51bVBvb2w7CisgIHN3aXRjaCh3ZGlSZXNQb29sKQorICB7CisgICAgY2FzZSBXRElfTUdNVF9QT09MX0lEOgorICAgICAgbWF4TnVtUG9vbCA9IFdESV9EU19ISV9QUklfUkVTX05VTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV0RJX0RBVEFfUE9PTF9JRDoKKyAgICAgICBtYXhOdW1Qb29sID0gV0RJX0RTX0xPX1BSSV9SRVNfTlVNOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYobWF4TnVtUG9vbCA9PSBtZW1Qb29sLT5udW1DaHVua3MpCisgIHsKKyAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLy9GaW5kIHRoZSBsZWFkaW5nIDAgaW4gdGhlIGFsbG9jYXRpb24gYml0bWFwCisKKyAgaWYoKGluZGV4ID0gZmluZF9sZWFkaW5nX3plcm9fYW5kX3NldGJpdChtZW1Qb29sLT5BbGxvY2F0aW9uQml0bWFwLCBtYXhOdW1Qb29sKSkgPT0gLTEpCisgIHsKKyAgICAgLy9EYmdCcmVha1BvaW50KCk7CisgICAgIERUSV9UUkFDRSggIERUSV9UUkFDRV9MRVZFTF9JTkZPLCAiV0RJX0RTX01lbVBvb2xBbGxvYzogaW5kZXg6JWQoTlVMTCksIG51bUNodW5rczolZCIsCisgICAgICAgICAgICAgICAgICBpbmRleCwgbWVtUG9vbC0+bnVtQ2h1bmtzICk7CisgICAgIHJldHVybiBOVUxMOworICB9CisgIG1lbVBvb2wtPm51bUNodW5rcysrOworICAvLyBUaGUgZmlyc3QgOCBieXRlcyBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSBmb3IgY29udHJvbCBiaXRzIGFuZCBoYXNoLgorICBwVmlydEFkZHJlc3MgID0gKHdwdF91aW50OCAqKW1lbVBvb2wtPnBWaXJ0QmFzZUFkZHJlc3MgKyAobWVtUG9vbC0+Y2h1bmtTaXplICogaW5kZXgpICsgODsKKyAgKnBQaHlzQWRkcmVzcyA9ICh3cHRfdWludDggKiltZW1Qb29sLT5wUGh5c0Jhc2VBZGRyZXNzICsgKG1lbVBvb2wtPmNodW5rU2l6ZSAqIGluZGV4KSArIDg7CisKKyAgRFRJX1RSQUNFKCAgRFRJX1RSQUNFX0xFVkVMX0lORk8sICJXRElfRFNfTWVtUG9vbEFsbG9jOiBpbmRleDolZCwgbnVtQ2h1bmtzOiVkIiwgaW5kZXgsIG1lbVBvb2wtPm51bUNodW5rcyApOworCisgIHJldHVybiBwVmlydEFkZHJlc3M7CisKK30KKworLyoKKyAqIEZyZWUgY2h1bmsgbWVtb3J5CisgKi8KK3ZvaWQgIFdESV9EU19NZW1Qb29sRnJlZShXRElfRFNfQmRNZW1Qb29sVHlwZSAqbWVtUG9vbCwgdm9pZCAqcFZpcnRBZGRyZXNzLCB2b2lkICpwUGh5c0FkZHJlc3MpCit7CisgIHdwdF91aW50MzIgaW5kZXggPQorICAgICgod3B0X3VpbnQ4ICopcFZpcnRBZGRyZXNzIC0gKHdwdF91aW50OCAqKW1lbVBvb2wtPnBWaXJ0QmFzZUFkZHJlc3MgLSA4KS9tZW1Qb29sLT5jaHVua1NpemU7CisgIHdwdF91aW50MzIgd29yZCA9IG1lbVBvb2wtPkFsbG9jYXRpb25CaXRtYXBbaW5kZXgvMzJdOworICB3b3JkICY9IH4oMTw8KGluZGV4JTMyKSk7CisgIG1lbVBvb2wtPkFsbG9jYXRpb25CaXRtYXBbaW5kZXgvMzJdID0gd29yZDsKKyAgbWVtUG9vbC0+bnVtQ2h1bmtzLS07CisKKyAgLy9EYmdQcmludCggIldESV9EU19NZW1Qb29sRnJlZTogaW5kZXg6JWQsIG51bUNodW5rczolZCIsIGluZGV4LCBtZW1Qb29sLT5udW1DaHVua3MgKTsKK30KKworCisvKioKKyBAYnJpZWYgUmV0dXJucyB0aGUgYXZhaWxhYmxlIG51bWJlciBvZiByZXNvdXJjZXMgKEJEIGhlYWRlcnMpCisgICAgICAgIGF2YWlsYWJsZSBmb3IgVFgKKworIEBwYXJhbSAgcE1lbVBvb2w6ICAgICAgICAgcG9pbnRlciB0byB0aGUgQkQgbWVtb3J5IHBvb2wKKworIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK3dwdF91aW50MzIgV0RJX0RTX0dldEF2YWlsYWJsZVJlc0NvdW50KFdESV9EU19CZE1lbVBvb2xUeXBlICpwTWVtUG9vbCkKK3sKKyAgcmV0dXJuIHBNZW1Qb29sLT5udW1DaHVua3M7Cit9CisKKy8qKgorIEBicmllZiBXRElfRFNfTWVtUG9vbEFkZFNUQQorICAgICAgICBBZGQgTkVXIFNUQSBpbnRvIG1lbXBvb2wKKworIEBwYXJhbSAgcE1lbVBvb2w6ICAgICAgICAgcG9pbnRlciB0byB0aGUgQkQgbWVtb3J5IHBvb2wKKyBAcGFyYW0gIHN0YUlkICAgICAgICAgICAgIFNUQSBJRAorCisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLworV0RJX1N0YXR1cyBXRElfRFNfTWVtUG9vbEFkZFNUQShXRElfRFNfQmRNZW1Qb29sVHlwZSAqbWVtUG9vbCwgd3B0X3VpbnQ4IHN0YUluZGV4KQoreworICBpZihtZW1Qb29sLT5udW1DaHVua1NUQVtzdGFJbmRleF0uU1RBSW5kZXggIT0gMHhGRikKKyAgeworICAgIC8qIEFscmVhZHkgdXNpbmcgdGhpcyBzbG90PyBEbyBub3RoaW5nICovCisgICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgfQorCisgIG1lbVBvb2wtPm51bUNodW5rU1RBW3N0YUluZGV4XS5TVEFJbmRleCA9IHN0YUluZGV4OworICBtZW1Qb29sLT5udW1DaHVua1NUQVtzdGFJbmRleF0ubnVtQ2h1bmtSZXNlcnZlZEJ5U1RBID0gMDsKKyAgbWVtUG9vbC0+bnVtQ2h1bmtTVEFbc3RhSW5kZXhdLnZhbGlkSWR4ID0gMTsKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgQGJyaWVmIFdESV9EU19NZW1Qb29sQWRkU1RBCisgICAgICAgIFJlbW92ZSBTVEEgZnJvbSBtZW1wb29sCisKKyBAcGFyYW0gIHBNZW1Qb29sOiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIG1lbW9yeSBwb29sCisgQHBhcmFtICBzdGFJZCAgICAgICAgICAgICBTVEEgSUQKKworIEBzZWUKKyBAcmV0dXJuIFJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbAorKi8KK1dESV9TdGF0dXMgV0RJX0RTX01lbVBvb2xEZWxTVEEoV0RJX0RTX0JkTWVtUG9vbFR5cGUgKm1lbVBvb2wsIHdwdF91aW50OCBzdGFJbmRleCkKK3sKKyAgaWYobWVtUG9vbC0+bnVtQ2h1bmtTVEFbc3RhSW5kZXhdLlNUQUluZGV4ID09IDB4RkYpCisgIHsKKyAgICAvKiBFbXB0eSB0aGlzIHNsb3Q/IGVycm9yLCBiYWQgYXJndW1lbnQgKi8KKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIG1lbVBvb2wtPm51bUNodW5rU1RBW3N0YUluZGV4XS5TVEFJbmRleCA9IDB4RkY7CisgIG1lbVBvb2wtPm51bUNodW5rU1RBW3N0YUluZGV4XS5udW1DaHVua1Jlc2VydmVkQnlTVEEgPSAwOworICBtZW1Qb29sLT5udW1DaHVua1NUQVtzdGFJbmRleF0udmFsaWRJZHggPSAwOworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyBAYnJpZWYgUmV0dXJucyB0aGUgcmVzZXJ2ZWQgbnVtYmVyIG9mIHJlc291cmNlcyAoQkQgaGVhZGVycykgcGVyIFNUQQorICAgICAgICBhdmFpbGFibGUgZm9yIFRYCisKKyBAcGFyYW0gIHBNZW1Qb29sOiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIG1lbW9yeSBwb29sCisgQHBhcmFtICBzdGFJZCAgICAgICAgICAgICBTVEEgSUQKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCit3cHRfdWludDMyIFdESV9EU19NZW1Qb29sR2V0UnN2ZFJlc0NvdW50UGVyU1RBKFdESV9EU19CZE1lbVBvb2xUeXBlICpwTWVtUG9vbCwgd3B0X3VpbnQ4ICBzdGFJZCkKK3sKKyAgcmV0dXJuIHBNZW1Qb29sLT5udW1DaHVua1NUQVtzdGFJZF0ubnVtQ2h1bmtSZXNlcnZlZEJ5U1RBOworfQorCisvKioKKyBAYnJpZWYgSW5jcmVhc2UgcmVzZXJ2ZWQgVFggcmVzb3VyY2UgY291bnQgYnkgc3BlY2lmaWMgU1RBCisKKyBAcGFyYW0gIHBNZW1Qb29sOiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIG1lbW9yeSBwb29sCisgQHBhcmFtICBzdGFJZCAgICAgICAgICAgICBTVEEgSUQKKyBAc2VlCisgQHJldHVybiBSZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyovCit2b2lkIFdESV9EU19NZW1Qb29sSW5jcmVhc2VSZXNlcnZlQ291bnQoV0RJX0RTX0JkTWVtUG9vbFR5cGUgKm1lbVBvb2wsIHdwdF91aW50OCAgc3RhSWQpCit7CisKKyAgaWYoKG1lbVBvb2wtPm51bUNodW5rU1RBW3N0YUlkXS52YWxpZElkeCkgJiYgKHN0YUlkIDwgV0RJX0RTX01BWF9TVEFfSUQpKQorICB7CisgICAgbWVtUG9vbC0+bnVtQ2h1bmtTVEFbc3RhSWRdLm51bUNodW5rUmVzZXJ2ZWRCeVNUQSsrOworICB9CisgIHJldHVybjsKK30KKworLyoqCisgQGJyaWVmIERlY3JlYXNlIHJlc2VydmVkIFRYIHJlc291cmNlIGNvdW50IGJ5IHNwZWNpZmljIFNUQQorCisgQHBhcmFtICBwTWVtUG9vbDogICAgICAgICBwb2ludGVyIHRvIHRoZSBCRCBtZW1vcnkgcG9vbAorIEBwYXJhbSAgc3RhSWQgICAgICAgICAgICAgU1RBIElECisgQHNlZQorIEByZXR1cm4gUmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsCisqLwordm9pZCBXRElfRFNfTWVtUG9vbERlY3JlYXNlUmVzZXJ2ZUNvdW50KFdESV9EU19CZE1lbVBvb2xUeXBlICptZW1Qb29sLCB3cHRfdWludDggIHN0YUlkKQoreworICBpZigwID09IG1lbVBvb2wtPm51bUNodW5rU1RBW3N0YUlkXS5udW1DaHVua1Jlc2VydmVkQnlTVEEpCisgIHsKKyAgICBEVElfVFJBQ0UoIERUSV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICJTQVQgJWQgcmVzZXJ2ZWQgcmVzb3VyY2UgY291bnQgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwIiwgc3RhSWQgKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZigobWVtUG9vbC0+bnVtQ2h1bmtTVEFbc3RhSWRdLnZhbGlkSWR4KSAmJiAoc3RhSWQgPCBXRElfRFNfTUFYX1NUQV9JRCkpCisgIHsKKyAgICBtZW1Qb29sLT5udW1DaHVua1NUQVtzdGFJZF0ubnVtQ2h1bmtSZXNlcnZlZEJ5U1RBLS07CisgIH0KKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvRFAvc3JjL3dsYW5fcWN0X3dkaV9kcy5jIGIvQ09SRS9XREkvRFAvc3JjL3dsYW5fcWN0X3dkaV9kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NzJjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9EUC9zcmMvd2xhbl9xY3Rfd2RpX2RzLmMKQEAgLTAsMCArMSw0NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgCisgKiAgICAgICBcZmlsZSAgd2xhbl9xY3Rfd2RpX2RzLmMKKyAqICAgICAgICAgIAorICogICAgICAgXGJyaWVmIGRlZmluZSBEYXRhc2VydmljZSBBUEkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFdMQU4gRGV2aWNlIEFic3RyYWN0aW9uIGxheWVyIEV4dGVybmFsIEFQSSBmb3IgRGF0YXNlcnZpY2UKKyAqIERFU0NSSVBUSU9OCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBleHRlcm5hbCBBUEkgaW1wbGVtbnRhdGlvbiBleHBvc2VkIGJ5IHRoZSAKKyAqICAgd2xhbiBkZXZpY2UgYWJzdGFyY3Rpb24gbGF5ZXIgbW9kdWxlLgorICoKKyAqICAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorICovCisKKworI2luY2x1ZGUgIndsYW5fcWN0X3dkaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9pLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2RzLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2RzX2kuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfZHRzLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2RwLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX3N0YS5oIgorCisKKworCisvKiBEQUwgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uLiAKKyAqIFBhcmFtZXRlcnM6CisgKiAgcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgCisgKiAgd2l0aCB0aGUgY2FsbGJhY2suCisgKiAgcGZuVHhDb21wbGV0ZUNhbGxiYWNrOkNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgdG8gYmUgaW52b2tlZCB0byByZXR1cm4gCisgKiAgcGFja2V0cyB3aGljaCBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQuCisgKiAgcGZuUnhQYWNrZXRDYWxsYmFjazpDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHRvIGJlIGludm9rZWQgdG8gZGVsaXZlciAKKyAqICBwYWNrZXRzIHdoaWNoIGhhdmUgYmVlbiByZWNlaXZlZAorICogIHBmblR4Rmxvd0NvbnRyb2xDYWxsYmFjazpDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHRvIGJlIGludm9rZWQgdG8gCisgKiAgaW5kaWNhdGUvY2xlYXIgY29uZ2VzdGlvbi4gCisgKgorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KK1dESV9TdGF0dXMgV0RJX0RTX1JlZ2lzdGVyKCB2b2lkICpwQ29udGV4dCwKKyAgV0RJX0RTX1R4Q29tcGxldGVDYWxsYmFjayBwZm5UeENvbXBsZXRlQ2FsbGJhY2ssCisgIFdESV9EU19SeFBhY2tldENhbGxiYWNrIHBmblJ4UGFja2V0Q2FsbGJhY2ssCisgIFdESV9EU19UeEZsb3dDb250cm9sQ2FsbGJhY2sgcGZuVHhGbG93Q29udHJvbENhbGxiYWNrLAorICB2b2lkICpwQ2FsbGJhY2tDb250ZXh0KQoreworICBXRElfRFNfQ2xpZW50RGF0YVR5cGUgKnBDbGllbnREYXRhOworICB3cHRfdWludDggICAgICAgICAgICAgIGJzc0xvb3A7CisKKyAgLy8gRG8gU2FuaXR5IGNoZWNrcworICBpZiAoTlVMTCA9PSBwQ29udGV4dCB8fAorICAgICAgTlVMTCA9PSBwQ2FsbGJhY2tDb250ZXh0IHx8CisgICAgICBOVUxMID09IHBmblR4Q29tcGxldGVDYWxsYmFjayB8fAorICAgICAgTlVMTCA9PSBwZm5SeFBhY2tldENhbGxiYWNrIHx8CisgICAgICBOVUxMID09IHBmblR4Rmxvd0NvbnRyb2xDYWxsYmFjaykgeworICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIHBDbGllbnREYXRhID0gKFdESV9EU19DbGllbnREYXRhVHlwZSAqKVdESV9EU19HZXREYXRhcGF0aENvbnRleHQocENvbnRleHQpOworICBpZiAoTlVMTCA9PSBwQ2xpZW50RGF0YSkKKyAgeworICAgIHJldHVybiBXRElfU1RBVFVTX01FTV9GQUlMVVJFOworICB9CisKKyAgLy8gU3RvcmUgY2FsbGJhY2tzIGluIGNsaWVudCBzdHJ1Y3R1cmUKKyAgcENsaWVudERhdGEtPnBjb250ZXh0ID0gcENvbnRleHQ7CisgIHBDbGllbnREYXRhLT5yZWNlaXZlRnJhbWVDQiA9IHBmblJ4UGFja2V0Q2FsbGJhY2s7CisgIHBDbGllbnREYXRhLT50eENvbXBsZXRlQ0IgPSBwZm5UeENvbXBsZXRlQ2FsbGJhY2s7CisgIHBDbGllbnREYXRhLT50eFJlc291cmNlQ0IgPSBwZm5UeEZsb3dDb250cm9sQ2FsbGJhY2s7CisgIHBDbGllbnREYXRhLT5wQ2FsbGJhY2tDb250ZXh0ID0gcENhbGxiYWNrQ29udGV4dDsKKworICBmb3IoYnNzTG9vcCA9IDA7IGJzc0xvb3AgPCBXRElfRFNfTUFYX1NVUFBPUlRFRF9CU1M7IGJzc0xvb3ArKykKKyAgeworICAgIHBDbGllbnREYXRhLT5zdGFJZHhQZXJCc3NJZHhUYWJsZVtic3NMb29wXS5pc1VzZWQgPSAwOworICAgIHBDbGllbnREYXRhLT5zdGFJZHhQZXJCc3NJZHhUYWJsZVtic3NMb29wXS5ic3NJZHggPSBXRElfRFNfSU5ERVhfSU5WQUxJRDsKKyAgICBwQ2xpZW50RGF0YS0+c3RhSWR4UGVyQnNzSWR4VGFibGVbYnNzTG9vcF0uc3RhSWR4ID0gV0RJX0RTX0lOREVYX0lOVkFMSUQ7CisgIH0KKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisKKy8qIERBTCBUcmFuc21pdCBmdW5jdGlvbi4KKyAqIFBhcmFtZXRlcnM6CisgKiAgcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2suCisgKiAgcEZyYW1lOlJlZmVybmNlIHRvIFBBTCBmcmFtZS4KKyAqICBtb3JlOiBEb2VzIHRoZSBpbnZva2VlIGhhdmUgbW9yZSB0aGFuIG9uZSBwYWNrZXQgcGVuZGluZz8KKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyAgQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICBGQUlMVVJFX1hYWCAgUmVxdWVzdCB3YXMgcmVqZWN0ZWQgZHVlIFhYWCBSZWFzb24uCisgKgorICovCisKKworV0RJX1N0YXR1cyBXRElfRFNfVHhQYWNrZXQodm9pZCAqcENvbnRleHQsCisgIHdwdF9wYWNrZXQgKnBGcmFtZSwKKyAgd3B0X2Jvb2xlYW4gbW9yZSkKK3sKKyAgV0RJX0RTX0NsaWVudERhdGFUeXBlICpwQ2xpZW50RGF0YTsKKyAgd3B0X3VpbnQ4ICAgICAgdWNTd0ZyYW1lVFhYbGF0aW9uOworICB3cHRfdWludDggICAgICB1Y1VQOworICB3cHRfdWludDggICAgICB1Y1R5cGVTdWJ0eXBlOworICB3cHRfdWludDggICAgICBhbGlnbm1lbnQ7CisgIHdwdF91aW50OCAgICAgIHVjVHhGbGFnOworICB3cHRfdWludDgqICAgICBwU1RBTUFDQWRkcmVzczsKKyAgd3B0X3VpbnQ4KiAgICAgcEFkZHIyTUFDQWRkcmVzczsKKyAgV0RJX0RTX1R4TWV0YUluZm9UeXBlICAgICAqcFR4TWV0YWRhdGE7CisgIHZvaWQgKnBoeXNCREhlYWRlciwgKnB2QkRIZWFkZXI7CisgIHdwdF91aW50OCAgICAgIHVjVHlwZTsKKyAgV0RJX0RTX0JkTWVtUG9vbFR5cGUgKnBNZW1Qb29sOworICB3cHRfdWludDggICAgICB1Y0JkUG9vbFR5cGU7CisgIHdwdF91aW50OCAgICAgIHN0YUlkOworCisgIC8vIERvIFNhbml0eSBjaGVja3MKKyAgaWYgKE5VTEwgPT0gcENvbnRleHQpCisgIHsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworICBwQ2xpZW50RGF0YSA9IChXRElfRFNfQ2xpZW50RGF0YVR5cGUgKikgV0RJX0RTX0dldERhdGFwYXRoQ29udGV4dChwQ29udGV4dCk7CisgIGlmIChOVUxMID09IHBDbGllbnREYXRhIHx8IHBDbGllbnREYXRhLT5zdXNwZW5kKQorICB7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICB9CisKKyAgLy8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIFBBTCBwYWNrZXQKKyAgcFR4TWV0YWRhdGEgPSBXRElfRFNfRXh0cmFjdFR4TWV0YURhdGEocEZyYW1lKTsKKyAgdWNTd0ZyYW1lVFhYbGF0aW9uID0gcFR4TWV0YWRhdGEtPmZkaXNhYmxlRnJtWGx0OworICB1Y1R5cGVTdWJ0eXBlID0gcFR4TWV0YWRhdGEtPnR5cGVTdWJ0eXBlOworICB1Y1VQID0gcFR4TWV0YWRhdGEtPmZVUDsKKyAgdWNUeEZsYWcgPSBwVHhNZXRhZGF0YS0+dHhGbGFnczsKKyAgcFNUQU1BQ0FkZHJlc3MgPSAmKHBUeE1ldGFkYXRhLT5mU1RBTUFDQWRkcmVzc1swXSk7CisgIHBBZGRyMk1BQ0FkZHJlc3MgPSAmKHBUeE1ldGFkYXRhLT5hZGRyMk1BQ0FkZHJlc3NbMF0pOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEdldCB0eXBlIGFuZCBzdWJ0eXBlIG9mIHRoZSBmcmFtZSBmaXJzdCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdWNUeXBlID0gKHVjVHlwZVN1YnR5cGUgJiBXRElfRlJBTUVfVFlQRV9NQVNLKSA+PiBXRElfRlJBTUVfVFlQRV9PRkZTRVQ7CisgIHN3aXRjaCh1Y1R5cGUpCisgIHsKKyAgICBjYXNlIFdESV9NQUNfREFUQV9GUkFNRToKKyAgICAgICBwTWVtUG9vbCA9ICYocENsaWVudERhdGEtPmRhdGFNZW1Qb29sKTsKKyAgICAgICB1Y0JkUG9vbFR5cGUgPSBXRElfREFUQV9QT09MX0lEOworICAgIGJyZWFrOworICAgIGNhc2UgV0RJX01BQ19NR01UX0ZSQU1FOgorICAgICAgIHBNZW1Qb29sID0gJihwQ2xpZW50RGF0YS0+bWdtdE1lbVBvb2wpOworICAgICAgIHVjQmRQb29sVHlwZSA9IFdESV9NR01UX1BPT0xfSUQ7CisgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTs7CisgIH0KKworICAvLyBBbGxvY2F0ZSBCRCBoZWFkZXIgZnJvbSBwb29sCisgIHB2QkRIZWFkZXIgPSBXRElfRFNfTWVtUG9vbEFsbG9jKHBNZW1Qb29sLCAmcGh5c0JESGVhZGVyLCB1Y0JkUG9vbFR5cGUpOworICBpZihOVUxMID09IHB2QkRIZWFkZXIpCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworCisgIFdESV9TZXRCRFBvaW50ZXJzKHBGcmFtZSwgcHZCREhlYWRlciwgcGh5c0JESGVhZGVyKTsKKworICBhbGlnbm1lbnQgPSAwOworICBXRElfRFNfUHJlcGFyZUJESGVhZGVyKHBGcmFtZSwgdWNTd0ZyYW1lVFhYbGF0aW9uLCBhbGlnbm1lbnQpOworCisgIGlmKFdESV9TVEFUVVNfU1VDQ0VTUyAhPSAKKyAgICAgIFdESV9GaWxsVHhCZCggcENvbnRleHQsIHVjVHlwZVN1YnR5cGUsIHBTVEFNQUNBZGRyZXNzLCBwQWRkcjJNQUNBZGRyZXNzLCAKKyAgICAgICAgJnVjVVAsIDEsIHB2QkRIZWFkZXIsIHVjVHhGbGFnIC8qIE5vIEFDSyAqLywgMCwgJnN0YUlkKSl7CisgICAgV0RJX0RTX01lbVBvb2xGcmVlKHBNZW1Qb29sLCBwdkJESGVhZGVyLCBwaHlzQkRIZWFkZXIpOworICAgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorICAvLyBTZW5kIHBhY2tldCB0byB0cmFuc3BvcnQgbGF5ZXIuCisgIGlmKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPVdEVFNfVHhQYWNrZXQocENvbnRleHQsIHBGcmFtZSkpeworICAgIFdESV9EU19NZW1Qb29sRnJlZShwTWVtUG9vbCwgcHZCREhlYWRlciwgcGh5c0JESGVhZGVyKTsKKyAgICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0gIAorCisgIC8qIHJlc291cmNlIGNvdW50IG9ubHkgZm9yIGRhdGEgcGFja2V0ICovCisgIGlmKFdESV9NQUNfREFUQV9GUkFNRSA9PSB1Y1R5cGUpCisgIHsKKyAgICBXRElfRFNfTWVtUG9vbEluY3JlYXNlUmVzZXJ2ZUNvdW50KHBNZW1Qb29sLCBzdGFJZCk7CisgIH0KKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgIAorfQorIAorIAorLyogREFMIFRyYW5zbWl0IENvbXBsZXRlIGZ1bmN0aW9uLiAKKyAqIFBhcmFtZXRlcnM6CisgKiAgcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2suCisgKiAgdWNUeFJlc1JlcTpUWCByZXNvdXJjZSBudW1iZXIgcmVxdWlyZWQgYnkgVEwKKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyAgQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICBGQUlMVVJFX1hYWCAgUmVxdWVzdCB3YXMgcmVqZWN0ZWQgZHVlIFhYWCBSZWFzb24uCisgKgorICovCisKKworV0RJX1N0YXR1cyBXRElfRFNfVHhDb21wbGV0ZSh2b2lkICpwQ29udGV4dCwgd3B0X3VpbnQzMiB1Y1R4UmVzUmVxKQoreworICAvLyBEbyBTYW5pdHkgY2hlY2tzCisgIGlmKE5VTEwgPT0gcENvbnRleHQpCisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICAKKyAgLy8gU2VuZCBub3RpZmljYXRpb24gdG8gdHJhbnNwb3J0IGxheWVyLgorICBpZihlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgIT1XRFRTX0NvbXBsZXRlVHgocENvbnRleHQsIHVjVHhSZXNSZXEpKQorICB7CisgICAgcmV0dXJuIFdESV9TVEFUVVNfRV9GQUlMVVJFOworICB9ICAKKworICByZXR1cm4gV0RJX1NUQVRVU19TVUNDRVNTOyAgCit9IAorCisvKiBEQUwgU3VzcGVuZCBUcmFuc21pdCBmdW5jdGlvbi4gCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KKworCitXRElfU3RhdHVzIFdESV9EU19UeFN1c3BlbmQodm9pZCAqcENvbnRleHQpCit7CisgIFdESV9EU19DbGllbnREYXRhVHlwZSAqcENsaWVudERhdGEgPSAgCisgICAgKFdESV9EU19DbGllbnREYXRhVHlwZSAqKSBXRElfRFNfR2V0RGF0YXBhdGhDb250ZXh0KHBDb250ZXh0KTsKKyAgcENsaWVudERhdGEtPnN1c3BlbmQgPSAxOworCisgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7ICAKKworfQorCisKKy8qIERBTCBSZXN1bWUgVHJhbnNtaXQgZnVuY3Rpb24uIAorICogUGFyYW1ldGVyczoKKyAqICBwQ29udGV4dDpDb29raWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxlciBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjay4KKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyAgQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICBGQUlMVVJFX1hYWCAgUmVxdWVzdCB3YXMgcmVqZWN0ZWQgZHVlIFhYWCBSZWFzb24uCisgKgorICovCisKKworV0RJX1N0YXR1cyBXRElfRFNfVHhSZXN1bWUodm9pZCAqcENvbnRleHQpCit7CisgIFdESV9EU19DbGllbnREYXRhVHlwZSAqcENsaWVudERhdGEgPSAgCisgICAgKFdESV9EU19DbGllbnREYXRhVHlwZSAqKSBXRElfRFNfR2V0RGF0YXBhdGhDb250ZXh0KHBDb250ZXh0KTsKKworICBwQ2xpZW50RGF0YS0+c3VzcGVuZCA9IDA7CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgIAorfQorCisvKiBEQUwgR2V0IEF2YWlsYWJsZSBSZXNvdXJjZSBDb3VudC4gCisgKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZnJlZSBkZXNjcmlyaXB0b3IgaW4gRFhFCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogIHdkaVJlc1Bvb2w6IC0gaWRlbnRpZmllciBvZiByZXNvdXJjZSBwb29sCisgKiBSZXR1cm4gVmFsdWU6IG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlCisgKiAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG51bWJlciBvZiBmcmVlIGRlc2NyaXJpcHRvciBpbiBEWEUKKyAqCisgKi8KKword3B0X3VpbnQzMiBXRElfR2V0QXZhaWxhYmxlUmVzQ291bnQodm9pZCAqcENvbnRleHQsV0RJX1Jlc1Bvb2xUeXBlIHdkaVJlc1Bvb2wpCit7CisgIFdESV9EU19DbGllbnREYXRhVHlwZSAqcENsaWVudERhdGEgPSAgCisgICAgKFdESV9EU19DbGllbnREYXRhVHlwZSAqKSBXRElfRFNfR2V0RGF0YXBhdGhDb250ZXh0KHBDb250ZXh0KTsKKworICBzd2l0Y2god2RpUmVzUG9vbCkKKyAgeworICAgIGNhc2UgV0RJX01HTVRfUE9PTF9JRDoKKyAgICAgIHJldHVybiAoV0RJX0RTX0hJX1BSSV9SRVNfTlVNIC0gMipXRElfRFNfR2V0QXZhaWxhYmxlUmVzQ291bnQoJnBDbGllbnREYXRhLT5tZ210TWVtUG9vbCkpOworICAgIGNhc2UgV0RJX0RBVEFfUE9PTF9JRDoKKyAgICAgIHJldHVybiBXRFRTX0dldEZyZWVUeERhdGFSZXNOdW1iZXIocENvbnRleHQpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKiBEQUwgR2V0IHJlc3J2ZWQgUmVzb3VyY2UgQ291bnQgcGVyIFNUQS4gCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogIHdkaVJlc1Bvb2w6IC0gaWRlbnRpZmllciBvZiByZXNvdXJjZSBwb29sCisgKiAgc3RhSWQ6IFNUQSBJRAorICogUmV0dXJuIFZhbHVlOiBudW1iZXIgb2YgcmVzb3VyY2VzIHJlc2VydmVkIHBlciBTVEEKKyAqCisgKi8KK3dwdF91aW50MzIgV0RJX0RTX0dldFJlc2VydmVkUmVzQ291bnRQZXJTVEEodm9pZCAqcENvbnRleHQsV0RJX1Jlc1Bvb2xUeXBlIHdkaVJlc1Bvb2wsIHdwdF91aW50OCBzdGFJZCkKK3sKKyAgV0RJX0RTX0NsaWVudERhdGFUeXBlICpwQ2xpZW50RGF0YSA9ICAKKyAgICAoV0RJX0RTX0NsaWVudERhdGFUeXBlICopIFdESV9EU19HZXREYXRhcGF0aENvbnRleHQocENvbnRleHQpOworICBzd2l0Y2god2RpUmVzUG9vbCkKKyAgeworICAgIGNhc2UgV0RJX01HTVRfUE9PTF9JRDoKKyAgICAgIHJldHVybiBXRElfRFNfTWVtUG9vbEdldFJzdmRSZXNDb3VudFBlclNUQSgmcENsaWVudERhdGEtPm1nbXRNZW1Qb29sLCBzdGFJZCk7CisgICAgY2FzZSBXRElfREFUQV9QT09MX0lEOgorICAgICAgcmV0dXJuIFdESV9EU19NZW1Qb29sR2V0UnN2ZFJlc0NvdW50UGVyU1RBKCZwQ2xpZW50RGF0YS0+ZGF0YU1lbVBvb2wsIHN0YUlkKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworLyogREFMIFNUQSBpbmZvIGFkZCBpbnRvIG1lbVBvb2wuIAorICogUGFyYW1ldGVyczoKKyAqICBwQ29udGV4dDpDb29raWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxlciBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjay4KKyAqICBzdGFJZDogU1RBIElECisgKiBSZXR1cm4gVmFsdWU6IG51bWJlciBvZiByZXNvdXJjZXMgcmVzZXJ2ZWQgcGVyIFNUQQorICoKKyAqLworV0RJX1N0YXR1cyBXRElfRFNfQWRkU1RBTWVtUG9vbCh2b2lkICpwQ29udGV4dCwgd3B0X3VpbnQ4IHN0YUluZGV4KQoreworICBXRElfU3RhdHVzIHN0YXR1cyA9IFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgV0RJX0RTX0NsaWVudERhdGFUeXBlICpwQ2xpZW50RGF0YSA9ICAKKyAgICAoV0RJX0RTX0NsaWVudERhdGFUeXBlICopIFdESV9EU19HZXREYXRhcGF0aENvbnRleHQocENvbnRleHQpOworCisgIHN0YXR1cyA9IFdESV9EU19NZW1Qb29sQWRkU1RBKCZwQ2xpZW50RGF0YS0+bWdtdE1lbVBvb2wsIHN0YUluZGV4KTsKKyAgaWYoV0RJX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgeworICAgIC8qIEFkZCBTVEEgaW50byBNR01UIG1lbVBvb2wgRmFpbCAqLworICAgIHJldHVybiBzdGF0dXM7CisgIH0KKworICBzdGF0dXMgPSBXRElfRFNfTWVtUG9vbEFkZFNUQSgmcENsaWVudERhdGEtPmRhdGFNZW1Qb29sLCBzdGFJbmRleCk7CisgIGlmKFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgIHsKKyAgICAvKiBBZGQgU1RBIGludG8gREFUQSBtZW1Qb29sIEZhaWwgKi8KKyAgICByZXR1cm4gc3RhdHVzOworICB9CisKKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9CisKKy8qIERBTCBTVEEgaW5mbyBkZWwgZnJvbSBtZW1Qb29sLiAKKyAqIFBhcmFtZXRlcnM6CisgKiAgcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2suCisgKiAgc3RhSWQ6IFNUQSBJRAorICogUmV0dXJuIFZhbHVlOiBudW1iZXIgb2YgcmVzb3VyY2VzIHJlc2VydmVkIHBlciBTVEEKKyAqCisgKi8KK1dESV9TdGF0dXMgV0RJX0RTX0RlbFNUQU1lbVBvb2wodm9pZCAqcENvbnRleHQsIHdwdF91aW50OCBzdGFJbmRleCkKK3sKKyAgV0RJX1N0YXR1cyBzdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1M7CisgIFdESV9EU19DbGllbnREYXRhVHlwZSAqcENsaWVudERhdGEgPSAgCisgICAgKFdESV9EU19DbGllbnREYXRhVHlwZSAqKSBXRElfRFNfR2V0RGF0YXBhdGhDb250ZXh0KHBDb250ZXh0KTsKKworICBzdGF0dXMgPSBXRElfRFNfTWVtUG9vbERlbFNUQSgmcENsaWVudERhdGEtPm1nbXRNZW1Qb29sLCBzdGFJbmRleCk7CisgIGlmKFdESV9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpCisgIHsKKyAgICAvKiBEZWwgU1RBIGZyb20gTUdNVCBtZW1Qb29sIEZhaWwgKi8KKyAgICByZXR1cm4gc3RhdHVzOworICB9CisgIHN0YXR1cyA9IFdESV9EU19NZW1Qb29sRGVsU1RBKCZwQ2xpZW50RGF0YS0+ZGF0YU1lbVBvb2wsIHN0YUluZGV4KTsKKyAgaWYoV0RJX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykKKyAgeworICAgIC8qIERlbCBTVEEgZnJvbSBEQVRBIG1lbVBvb2wgRmFpbCAqLworICAgIHJldHVybiBzdGF0dXM7CisgIH0KKyAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsgCit9CisKKy8qIERBTCBTZXQgU1RBIGluZGV4IGFzc29jaWF0ZWQgd2l0aCBCU1MgaW5kZXguIAorICogUGFyYW1ldGVyczoKKyAqICBwQ29udGV4dDpDb29raWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxlciBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjay4KKyAqICBic3NJZHg6IEJTUyBpbmRleAorICogIHN0YUlkOiBTVEEgaW5kZXggYXNzb2NpYXRlZCB3aXRoIEJTUyBpbmRleAorICogUmV0dXJuIFN0YXR1czogRm91bmQgZW1wdHkgc2xvdAorICoKKyAqLworV0RJX1N0YXR1cyBXRElfRFNfU2V0U3RhSWR4UGVyQnNzSWR4KHZvaWQgKnBDb250ZXh0LCB3cHRfdWludDggYnNzSWR4LCB3cHRfdWludDggc3RhSWR4KQoreworICBXRElfRFNfQ2xpZW50RGF0YVR5cGUgKnBDbGllbnREYXRhOworICB3cHRfdWludDggICAgICAgICAgICAgIGJzc0xvb3A7CisKKyAgcENsaWVudERhdGEgPSAoV0RJX0RTX0NsaWVudERhdGFUeXBlICopV0RJX0RTX0dldERhdGFwYXRoQ29udGV4dChwQ29udGV4dCk7CisgIGZvciAoYnNzTG9vcCA9IDA7IGJzc0xvb3AgPCBXRElfRFNfTUFYX1NVUFBPUlRFRF9CU1M7IGJzc0xvb3ArKykKKyAgeworICAgIGlmICgocENsaWVudERhdGEtPnN0YUlkeFBlckJzc0lkeFRhYmxlW2Jzc0xvb3BdLmlzVXNlZCkgJiYKKyAgICAgICAgKGJzc0lkeCA9PSBwQ2xpZW50RGF0YS0+c3RhSWR4UGVyQnNzSWR4VGFibGVbYnNzTG9vcF0uYnNzSWR4KSAmJgorICAgICAgICAoc3RhSWR4ID09IHBDbGllbnREYXRhLT5zdGFJZHhQZXJCc3NJZHhUYWJsZVtic3NMb29wXS5zdGFJZHgpKQorICAgIHsKKyAgICAgIHJldHVybiBXRElfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKDAgPT0gcENsaWVudERhdGEtPnN0YUlkeFBlckJzc0lkeFRhYmxlW2Jzc0xvb3BdLmlzVXNlZCkKKyAgICB7CisgICAgICBwQ2xpZW50RGF0YS0+c3RhSWR4UGVyQnNzSWR4VGFibGVbYnNzTG9vcF0uYnNzSWR4ID0gYnNzSWR4OworICAgICAgcENsaWVudERhdGEtPnN0YUlkeFBlckJzc0lkeFRhYmxlW2Jzc0xvb3BdLnN0YUlkeCA9IHN0YUlkeDsKKyAgICAgIHBDbGllbnREYXRhLT5zdGFJZHhQZXJCc3NJZHhUYWJsZVtic3NMb29wXS5pc1VzZWQgPSAxOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisgIH0KKworICAvKiBDb3VsZCBub3QgZmluZCBlbXB0eSBzbG90ICovCisgIHJldHVybiBXRElfU1RBVFVTX0VfRkFJTFVSRTsKK30KKworLyogREFMIEdldCBTVEEgaW5kZXggYXNzb2NpYXRlZCB3aXRoIEJTUyBpbmRleC4gCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogIGJzc0lkeDogQlNTIGluZGV4CisgKiAgc3RhSWQ6IFNUQSBpbmRleCBhc3NvY2lhdGVkIHdpdGggQlNTIGluZGV4CisgKiBSZXR1cm4gU3RhdHVzOiBGb3VuZCBlbXB0eSBzbG90CisgKgorICovCitXRElfU3RhdHVzIFdESV9EU19HZXRTdGFJZHhGcm9tQnNzSWR4KHZvaWQgKnBDb250ZXh0LCB3cHRfdWludDggYnNzSWR4LCB3cHRfdWludDggKnN0YUlkeCkKK3sKKyAgV0RJX0RTX0NsaWVudERhdGFUeXBlICpwQ2xpZW50RGF0YTsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICBic3NMb29wOworCisgIHBDbGllbnREYXRhID0gKFdESV9EU19DbGllbnREYXRhVHlwZSAqKVdESV9EU19HZXREYXRhcGF0aENvbnRleHQocENvbnRleHQpOworICBmb3IoYnNzTG9vcCA9IDA7IGJzc0xvb3AgPCBXRElfRFNfTUFYX1NVUFBPUlRFRF9CU1M7IGJzc0xvb3ArKykKKyAgeworICAgIGlmKGJzc0lkeCA9PSBwQ2xpZW50RGF0YS0+c3RhSWR4UGVyQnNzSWR4VGFibGVbYnNzTG9vcF0uYnNzSWR4KQorICAgIHsKKyAgICAgIC8qIEZvdW5kIEJTUyBpbmRleCBmcm9tIHNsb3QgKi8KKyAgICAgICpzdGFJZHggPSBwQ2xpZW50RGF0YS0+c3RhSWR4UGVyQnNzSWR4VGFibGVbYnNzTG9vcF0uc3RhSWR4OworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisgIH0KKworICAvKiBDb3VsZCBub3QgZmluZCBhc3NvY2lhdGVkIFNUQSBpbmRleCB3aXRoIEJTUyBpbmRleCAqLworICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7Cit9CisKKy8qIERBTCBDbGVhciBTVEEgaW5kZXggYXNzb2NpYXRlZCB3aXRoIEJTUyBpbmRleC4gCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogIGJzc0lkeDogQlNTIGluZGV4CisgKiAgc3RhSWQ6IFNUQSBpbmRleCBhc3NvY2lhdGVkIHdpdGggQlNTIGluZGV4CisgKiBSZXR1cm4gU3RhdHVzOiBGb3VuZCBlbXB0eSBzbG90CisgKgorICovCitXRElfU3RhdHVzIFdESV9EU19DbGVhclN0YUlkeFBlckJzc0lkeCh2b2lkICpwQ29udGV4dCwgd3B0X3VpbnQ4IGJzc0lkeCwgd3B0X3VpbnQ4IHN0YUlkeCkKK3sKKyAgV0RJX0RTX0NsaWVudERhdGFUeXBlICpwQ2xpZW50RGF0YTsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICBic3NMb29wOworCisgIHBDbGllbnREYXRhID0gKFdESV9EU19DbGllbnREYXRhVHlwZSAqKVdESV9EU19HZXREYXRhcGF0aENvbnRleHQocENvbnRleHQpOworICBmb3IoYnNzTG9vcCA9IDA7IGJzc0xvb3AgPCBXRElfRFNfTUFYX1NVUFBPUlRFRF9CU1M7IGJzc0xvb3ArKykKKyAgeworICAgIGlmKChic3NJZHggPT0gcENsaWVudERhdGEtPnN0YUlkeFBlckJzc0lkeFRhYmxlW2Jzc0xvb3BdLmJzc0lkeCkgJiYKKyAgICAgICAoc3RhSWR4ID09IHBDbGllbnREYXRhLT5zdGFJZHhQZXJCc3NJZHhUYWJsZVtic3NMb29wXS5zdGFJZHgpKQorICAgIHsKKyAgICAgIHBDbGllbnREYXRhLT5zdGFJZHhQZXJCc3NJZHhUYWJsZVtic3NMb29wXS5ic3NJZHggPSBXRElfRFNfSU5ERVhfSU5WQUxJRDsKKyAgICAgIHBDbGllbnREYXRhLT5zdGFJZHhQZXJCc3NJZHhUYWJsZVtic3NMb29wXS5zdGFJZHggPSBXRElfRFNfSU5ERVhfSU5WQUxJRDsKKyAgICAgIHBDbGllbnREYXRhLT5zdGFJZHhQZXJCc3NJZHhUYWJsZVtic3NMb29wXS5pc1VzZWQgPSAwOworICAgICAgcmV0dXJuIFdESV9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisgIH0KKworICAvKiBDb3VsZCBub3QgZmluZCBhc3NvY2lhdGVkIFNUQSBpbmRleCB3aXRoIEJTUyBpbmRleCAqLworICByZXR1cm4gV0RJX1NUQVRVU19FX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9DT1JFL1dESS9UUlAvQ1RTL2luYy93bGFuX3FjdF93ZGlfY3RzLmggYi9DT1JFL1dESS9UUlAvQ1RTL2luYy93bGFuX3FjdF93ZGlfY3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwMTM0MAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL1RSUC9DVFMvaW5jL3dsYW5fcWN0X3dkaV9jdHMuaApAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgV0xBTl9RQ1RfV0RJX0NUU19ICisjZGVmaW5lIFdMQU5fUUNUX1dESV9DVFNfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICBXIEwgQSBOICAgQyBPIE4gVCBSIE8gTCAgICBUIFIgQSBOIFMgUCBPIFIgVCAgIFMgRSBSIFYgSSBDIEUgIAorICAgICAgICAgICAgICAgICAgICAgICBFIFggVCBFIFIgTiBBIEwgIEEgUCBJCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgCitERVNDUklQVElPTgorICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSSBleHBvc2VkIGJ5IHRoZSB3bGFuIGNvbnRyb2wgdHJhbnNwb3J0CisgIHNlcnZpY2UgbW9kdWxlLgorICAKKyAgICAgIAorICBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjokICREYXRlVGltZTogJCAkQXV0aG9yOiAkCisKKword2hlbiAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkKKy0tLS0tLS0tICAgIC0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswOC8wNC8xMCAgICBtc3MgICAgIENyZWF0ZWQgbW9kdWxlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTIEZPUiBNT0RVTEUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIEZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIiAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMgYW5kIENvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisgI2VuZGlmIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUeXBlIERlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENvbnRyb2wgVHJhbnNwb3J0IFNlcnZpY2UgSGFuZGxlIFR5cGUqLwordHlwZWRlZiB2b2lkKiAgV0NUU19IYW5kbGVUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgIFdDVFNfTm90aWZ5RXZlbnRUeXBlCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAgV0NUU19FVkVOVF9PUEVOLAorICAgV0NUU19FVkVOVF9DTE9TRSwKKyAgIFdDVFNfRVZFTlRfTUFYCit9IFdDVFNfTm90aWZ5RXZlbnRUeXBlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgV0RJIGNhbGxiYWNrIHR5cGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdDVFNfTm90aWZ5Q0JUeXBlCisgCisgICBERVNDUklQVElPTiAgIAorIAorICAgVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGJ5IHRoZSBjb250cm9sIHRyYW5zcG9ydCB3aGVuIGl0IHdpc2hlcyB0byBzZW5kCisgICB1cCBhIG5vdGlmaWNhdGlvbiBsaWtlIHRoZSBvbmVzIG1lbnRpb25lZCBhYm92ZS4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdjdHNIYW5kbGU6ICAgICAgIGhhbmRsZSB0byB0aGUgY29udHJvbCB0cmFuc3BvcnQgc2VydmljZSAKKyAgICB3Y3RzRXZlbnQ6ICAgICAgICB0aGUgZXZlbnQgYmVpbmcgbm90aWZpZWQKKyAgICB3Y3RzTm90aWZ5Q0JEYXRhOiB0aGUgY2FsbGJhY2sgZGF0YSBvZiB0aGUgdXNlciAKKyAgICAKKyAgCisgIFJFVFVSTiBWQUxVRSAKKyAgICBOb25lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkICgqV0NUU19Ob3RpZnlDQlR5cGUpIChXQ1RTX0hhbmRsZVR5cGUgICAgICAgIHdjdHNIYW5kbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQ1RTX05vdGlmeUV2ZW50VHlwZSAgIHdjdHNFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICB3Y3RzTm90aWZ5Q0JEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdDVFNfUnhNc2dDQlR5cGUKKyAKKyAgIERFU0NSSVBUSU9OICAgCisgCisgICBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgdGhlIGNvbnRyb2wgdHJhbnNwb3J0IHdoZW4gaXQgd2lzaGVzIHRvIHNlbmQKKyAgIHVwIGEgcGFja2V0IHJlY2VpdmVkIG92ZXIgdGhlIGJ1cy4gVXBvbiByZXR1cm4gb2YgUnggY2FsbGJhY2ssIHRoZSBvd25lcnNoaXAKKyAgIG9mIHRoZSBtZXNzYWdlIGJlbG9uZ3MgdG8gdGhlIENUIGFuZCB0aGlzIG9uZSBpcyBmcmVlIHRvIGRlYWxsb2NhdGUgYW55CisgICBidWZmZXIgdGhhdCB3YXMgdXNlZCB0byBnZXQgdGhpcyBtZXNzYWdlLiBJZiBXREkgd2lzaGVzIHRvIG1haW50YWluIHRoZQorICAgaW5mb3JtYXRpb24gYmV5b25kIHRoZSBsaWZldGltZSBvZiB0aGUgY2FsbCwgaXQgbXVzdCBtYWtlIGEgY29weSBvZiBpdC4KKyAKKyAgIFBBUkFNRVRFUlMgCisKKyAgICBJTgorICAgIHdjdHNIYW5kbGU6ICBoYW5kbGUgdG8gdGhlIGNvbnRyb2wgdHJhbnNwb3J0IHNlcnZpY2UgCisgICAgcE1zZzogICAgICAgIHRoZSBwYWNrZXQKKyAgICB1TGVuOiAgICAgICAgdGhlIHBhY2tldCBsZW5ndGgKKyAgICB3Y3RzUnhNc2dDQkRhdGE6IHRoZSBjYWxsYmFjayBkYXRhIG9mIHRoZSB1c2VyIAorICAgIAorICAKKyAgUkVUVVJOIFZBTFVFIAorICAgIE5vbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQgKCpXQ1RTX1J4TXNnQ0JUeXBlKSAoV0NUU19IYW5kbGVUeXBlICAgICAgIHdjdHNIYW5kbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICBwTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwdF91aW50MzIgICAgICAgICAgICB1TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICB3Y3RzUnhNc2dDQkRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgIFdDVFMgVHJhbnNwb3J0IENhbGxiYWNrcyBob2xkZXIgdHlwZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgICBXQ1RTX05vdGlmeUNCVHlwZSAgICAgIHdjdHNOb3RpZnlDQjsKKyAgICAgdm9pZCogICAgICAgICAgICAgICAgICB3Y3RzTm90aWZ5Q0JEYXRhOworICAgICBXQ1RTX1J4TXNnQ0JUeXBlICAgICAgIHdjdHNSeE1zZ0NCOworICAgICB2b2lkKiAgICAgICAgICAgICAgICAgIHdjdHNSeE1zZ0NCRGF0YTsKK30gV0NUU19UcmFuc3BvcnRDQnNUeXBlOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRG9jdW1lbnRhdGlvbgorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qKgorIEBicmllZiAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBEQUwgQ29yZSB0byBpbml0aWFsaXplIHRoZSBDb250cm9sCisgICAgICAgICAgICBUcmFuc3BvcnQgZm9yIHByb2Nlc3NpbmcuIEl0IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYW55CisgICAgICAgICAgICBvdGhlciBBUElzIG9mIHRoZSBDb250cm9sIFRyYW5zcG9ydC4gCisKKworIEBwYXJhbSBzek5hbWU6ICAgdW5pcXVlIG5hbWUgZm9yIHRoZSBjaGFubmVsIHRoYXQgaXMgdG8gYmUgb3BlbmVkIAorICAgICAgICAgdVNpemU6ICAgc2l6ZSBvZiB0aGUgY2hhbm5lbCB0aGF0IG11c3QgYmUgb3BlbmVkIChzaG91bGQgZml0IHRoZQorICAgICAgICAgICAgICAgICAgbGFyZ2VzdCBzaXplIG9mICBwYWNrZXQgdGhhdCB0aGUgRGFsIENvcmUgd2lzaGVzIHRvIHNlbmQpCisgICAgICAgICB3Y3RzQ0JzOiAgYSBsaXN0IG9mIGNhbGxiYWNrcyB0aGF0IHRoZSBDVCBuZWVkcyB0byB1c2UgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uIGFuZCBtZXNzYWdlcyBiYWNrIHRvIERBTCAKKyAKKyBAc2VlIAorIEByZXR1cm4gIEEgaGFuZGxlIHRoYXQgbXVzdCBiZSB1c2VkIGZvciBmdXJ0aGVyIGNvbW11bmljYXRpb24gd2l0aCB0aGUgQ1RTLiAKKyAgICAgICAgIFRoaXMgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSBmb3IgdGhlIGNhbGxlciBhbmQgaXQgd2lsbCBiZSB1c2VkIGluCisgICAgICAgICBhbGwgY29tbXVuaWNhdGlvbnMgdG8gYW5kIGZyb20gdGhlIENUUy4gCisKKyovCitXQ1RTX0hhbmRsZVR5cGUgIAorV0NUU19PcGVuVHJhbnNwb3J0IAorKCAKKyAgY29uc3Qgd3B0X3VpbnQ4KiAgICAgICAgIHN6TmFtZSwKKyAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgIHVTaXplLCAgCisgIFdDVFNfVHJhbnNwb3J0Q0JzVHlwZSogICB3Y3RzQ0JzCispOworCisvKioKKyBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBEQUwgQ29yZSB0byB0byBjbG9zZSB0aGUKKyAgICAgICAgICAgQ29udHJvbCBUcmFuc3BvcnQgd2hlbiBpdHMgc2VydmljZXMgYXJlIG5vIGxvbmdlcgorICAgICAgICAgICBuZWVkZWQuIEZ1bGwgY2xvc2Ugbm90aWZpY2F0aW9uIHdpbGwgYmUgcmVjZWl2ZQorICAgICAgICAgICBhc3luY2hyb25vdXNseSBvbiB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgICAgICAgICAgIHJlZ2lzdGVyZWQgb24gT3BlbgorCisKKyBAcGFyYW0gd2N0c0hhbmRsZWhhbmRsZTogIHJlY2VpdmVkIHVwb24gb3BlbgorIAorIEBzZWUgCisgQHJldHVybiAgIDAgZm9yIHN1Y2Nlc3MKKyovCit3cHRfdWludDMyCitXQ1RTX0Nsb3NlVHJhbnNwb3J0IAorKAorICBXQ1RTX0hhbmRsZVR5cGUgICAgICB3Y3RzSGFuZGxlCispOworCisvKioKKyBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBEQUwgQ29yZSB0byB0byBzZW5kIGEgCisgICAgICAgICAgIG1lc3NhZ2Ugb3ZlciB0byAgdGhlIFdMQU4gc3ViLXN5c3RlbS4KKyAKKyAgICAgICAgICAgT25jZSBhIGJ1ZmZlciBoYXMgYmVlbiBwYXNzZWQgaW50byB0aGUgU2VuZCBNZXNzYWdlCisgQVBJLCBDVCB0YWtlcyBmdWxsIG93bmVyc2hpcCBvZiBpdCBhbmQgaXQgaXMgcmVzcG9uc2libGUgZm9yIAorIGZyZWVpbmcgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2VzLiAoVGhpcyBwcmV2ZW50cyBhIG1lbWNweSBpbiAKKyBjYXNlIG9mIGEgZGVmZmVyZWQgd3JpdGUpIAorCisgVGhlIG1lc3NhZ2VzIHRyYW5zcG9ydGVkIHRocm91Z2ggdGhlIENUIG9uIGJvdGggUlggYW5kIFRYIGFyZSAKKyBmbGF0IG1lbW9yeSBidWZmZXJzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGFuZCBtYW5pcHVsYXRlZCAKKyB0aHJvdWdoIHN0YW5kYXJkIG1lbW9yeSBmdW5jdGlvbnMuIAorCisgQHBhcmFtIHdjdHNIYW5kbGVoYW5kbGU6ICByZWNlaXZlZCB1cG9uIG9wZW4KKyAgICAgICAgcE1zZzogIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQKKyAgICAgICAgdUxlbjogdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZQorCisgQHNlZSAKKyBAcmV0dXJuICAgMCBmb3Igc3VjY2VzcworKi8KK3dwdF91aW50MzIKK1dDVFNfU2VuZE1lc3NhZ2UgCisoCisgIFdDVFNfSGFuZGxlVHlwZSAgICAgIHdjdHNIYW5kbGUsCisgIHZvaWQqICAgICAgICAgICAgICAgIHBNc2csCisgIHdwdF91aW50MzIgICAgICAgICAgIHVMZW4KKyk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIFdMQU5fUUNUX1dESV9DVFNfSCAqLwpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvVFJQL0NUUy9zcmMvd2xhbl9xY3Rfd2RpX2N0cy5jIGIvQ09SRS9XREkvVFJQL0NUUy9zcmMvd2xhbl9xY3Rfd2RpX2N0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYmY2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9UUlAvQ1RTL3NyYy93bGFuX3FjdF93ZGlfY3RzLmMKQEAgLTAsMCArMSw5ODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIEMgVCBTIC4gQworCisgIE9WRVJWSUVXOgorCisgIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gQ29udHJvbCBUcmFuc3BvcnQKKyAgU2VydmljZSBMYXllci4KKworICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIGJ5IHRoZSBEQUwgQ29yZQorICB0aGF0IHdpc2hlcyB0byB1c2UgYSBwbGF0Zm9ybSBhZ25vc3RpYyBBUEkgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgV0xBTiBTUy4KKworICBERVBFTkRFTkNJRVM6CisKKyAgQXJlIGxpc3RlZCBmb3IgZWFjaCBBUEkgYmVsb3cuCisKKworICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlciQkRGF0ZVRpbWUkJEF1dGhvciQKKworCisgIHdoZW4gICAgICAgICAgd2hvICAgIHdoYXQsIHdoZXJlLCB3aHkKKyAgLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMjAxMS0wMi0yOCAgICBqdGogICAgTGludXgvQW5kcm9pZCBpbXBsZW1lbnRhdGlvbiB3aGljaCB1dGlsaXplcyBTTUQKKyAgMjAxMC0wOC0wOSAgICBtc3MgICAgQ3JlYXRlZCBtb2R1bGUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUyBGT1IgTU9EVUxFCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2N0cy5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9tc2cuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfYXBpLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3RyYWNlLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfb3NfbGlzdC5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3dkaV9pLmgiCisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyNpbmNsdWRlIDxtYWNoL21zbV9zbWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2Vsc2UKKyNpbmNsdWRlICJtc21fc21kLmgiCisjZW5kaWYKKworLyogR2xvYmFsIGNvbnRleHQgZm9yIENUUyBoYW5kbGUsIGl0IGlzIHJlcXVpcmVkIHRvIGtlZXAgdGhpcyAKKyAqIHRyYW5zcG9ydCBvcGVuIGR1cmluZyBTU1Igc2h1dGRvd24gKi8KK3N0YXRpYyBXQ1RTX0hhbmRsZVR5cGUgZ3djdHNIYW5kbGU7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTWFnaWMgdmFsdWUgdG8gdmFsaWRhdGUgYSBXQ1RTIENCICh2YWx1ZSBpcyBsaXR0bGUgZW5kaWFuIEFTQ0lJOiBXQ1RTICovCisjZGVmaW5lIFdDVFNfQ0JfTUFHSUMgICAgIDB4NTM1NDQzNTcKKworLyogdGltZSB0byB3YWl0IGZvciBTTUQgY2hhbm5lbCB0byBvcGVuIChpbiBtc2VjcykgKi8KKyNkZWZpbmUgV0NUU19TTURfT1BFTl9USU1FT1VUIDUwMDAKKworLyogdGltZSB0byB3YWl0IGZvciBTTUQgY2hhbm5lbCB0byBjbG9zZSAoaW4gbXNlY3MpICovCisjZGVmaW5lIFdDVFNfU01EX0NMT1NFX1RJTUVPVVQgNTAwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFR5cGUgRGVjbGFyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBXQ1RTX1N0YXRlVHlwZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgIFdDVFNfU1RBVEVfQ0xPU0VELCAgICAgICAvKiBDbG9zZWQgKi8KKyAgIFdDVFNfU1RBVEVfT1BFTl9QRU5ESU5HLCAvKiBXYWl0aW5nIGZvciB0aGUgT1BFTiBldmVudCBmcm9tIFNNRCAqLworICAgV0NUU19TVEFURV9PUEVOLCAgICAgICAgIC8qIE9wZW4gZXZlbnQgcmVjZWl2ZWQgZnJvbSBTTUQgKi8KKyAgIFdDVFNfU1RBVEVfREVGRVJSRUQsICAgICAvKiBXcml0ZSBwZW5kaW5nLCBTTUQgY2hlbm5lbCBpcyBmdWxsICovCisgICBXQ1RTX1NUQVRFX1JFTV9DTE9TRUQsICAgLyogUmVtb3RlIGVuZCBjbG9zZWQgdGhlIFNNRCBjaGFubmVsICovCisgICBXQ1RTX1NUQVRFX01BWAorfSBXQ1RTX1N0YXRlVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIENvbnRyb2wgVHJhbnNwb3J0IENvbnRyb2wgQmxvY2sgVHlwZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgV0NUU19Ob3RpZnlDQlR5cGUgICAgICB3Y3RzTm90aWZ5Q0I7CisgICB2b2lkKiAgICAgICAgICAgICAgICAgIHdjdHNOb3RpZnlDQkRhdGE7CisgICBXQ1RTX1J4TXNnQ0JUeXBlICAgICAgIHdjdHNSeE1zZ0NCOworICAgdm9pZCogICAgICAgICAgICAgICAgICB3Y3RzUnhNc2dDQkRhdGE7CisgICBXQ1RTX1N0YXRlVHlwZSAgICAgICAgIHdjdHNTdGF0ZTsKKyAgIHNtZF9jaGFubmVsX3QqICAgICAgICAgd2N0c0NoYW5uZWw7CisgICB3cHRfbGlzdCAgICAgICAgICAgICAgIHdjdHNQZW5kaW5nUXVldWU7CisgICB3cHRfdWludDMyICAgICAgICAgICAgIHdjdHNNYWdpYzsKKyAgIHdwdF9tc2cgICAgICAgICAgICAgICAgd2N0c09wZW5Nc2c7CisgICB3cHRfbXNnICAgICAgICAgICAgICAgIHdjdHNEYXRhTXNnOworICAgd3B0X2V2ZW50ICAgICAgICAgICAgICB3Y3RzRXZlbnQ7Cit9IFdDVFNfQ29udHJvbEJsb2NrVHlwZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFdESSBDVFMgQnVmZmVyIFR5cGUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qTm9kZSBmb3IgbGlua2luZyBwZW5kaW5nIGJ1ZmZlcnMgaW50byBhIGxpbmtlZCBsaXN0ICovCisgICB3cHRfbGlzdF9ub2RlICAgICAgICAgIG5vZGU7CisKKyAgIC8qQnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdCAqLworICAgdm9pZCogICAgICAgICAgICAgICAgICBwQnVmZmVyOworCisgICAvKkJ1ZmZlciBTaXplKi8KKyAgIGludCAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZTsKKworfSBXQ1RTX0J1ZmZlclR5cGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBWYXJpYWJsZSBEZWZpbml0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgRkVBVFVSRV9SMzNECisvKiBSMzNEIHdpbGwgbm90IGNsb3NlIFNNRCBwb3J0CisgKiBJZiByZWNlaXZlIGNsb3NlIHJlcXVlc3QgZnJvbSBXREksIGp1c3QgcHJldGVuZCBhcyBwb3J0IGNsb3NlZCwKKyAqIFN0b3JlIGNvbnRyb2wgYmxvY2sgaW5mbyBzdGF0aWMgbWVtb3J5LCBhbmQgcmV1c2UgbmV4dCBvcGVuICovCitzdGF0aWMgV0NUU19Db250cm9sQmxvY2tUeXBlICAqY3RzQ0I7CisKKy8qIElmIHBvcnQgb3BlbiBvbmNlLCBub3QgdHJ5IHRvIGFjdHVhbCBvcGVuIG5leHQgdGltZSAqLworc3RhdGljIGludCAgICAgICAgICAgICAgICAgICAgIHBvcnRfb3BlbiA9IDA7CisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKy8qKgorIEBicmllZiAgICBDYWxsYmFjayBmdW5jdGlvbiBmb3Igc2VyaWFsaXppbmcgV0NUUyBPcGVuCisgICAgICAgICAgIHByb2Nlc3NpbmcgaW4gdGhlIGNvbnRyb2wgY29udGV4dAorIEBwYXJhbQorCisgICAgcE1zZyAtIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UKKworIEBzZWUKKyBAcmV0dXJuIHZvaWQKKyovCitzdGF0aWMgdm9pZAorV0NUU19QQUxPcGVuQ2FsbGJhY2sKKygKKyAgIHdwdF9tc2cgKnBNc2cKKykKK3sKKyAgIFdDVFNfQ29udHJvbEJsb2NrVHlwZSogICAgICAgIHBXQ1RTQ2I7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKiBleHRyYWN0IG91ciBjb250ZXh0IGZyb20gdGhlIG1lc3NhZ2UgKi8KKyAgIHBXQ1RTQ2IgPSBwTXNnLT5wQ29udGV4dDsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKChOVUxMID09IHBXQ1RTQ2IpIHx8IChXQ1RTX0NCX01BR0lDICE9IHBXQ1RTQ2ItPndjdHNNYWdpYykpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJXQ1RTX1BBTE9wZW5DYWxsYmFjazogSW52YWxpZCBwYXJhbWV0ZXJzIHJlY2VpdmVkLiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICBpZiAoV0NUU19TVEFURV9PUEVOX1BFTkRJTkcgIT0gcFdDVFNDYi0+d2N0c1N0YXRlKSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiV0NUU19QQUxPcGVuQ2FsbGJhY2s6IEludm9rZSBmcm9tIGludmFsaWQgc3RhdGUgJWQuIiwKKyAgICAgICAgICAgICAgICAgcFdDVFNDYi0+d2N0c1N0YXRlKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogbm90aWZpZWQgcmVnaXN0ZXJlZCBjbGllbnQgdGhhdCB0aGUgY2hhbm5lbCBpcyBvcGVuICovCisgICBwV0NUU0NiLT53Y3RzU3RhdGUgPSBXQ1RTX1NUQVRFX09QRU47CisgICBwV0NUU0NiLT53Y3RzTm90aWZ5Q0IoKFdDVFNfSGFuZGxlVHlwZSlwV0NUU0NiLAorICAgICAgICAgICAgICAgICAgICAgICAgV0NUU19FVkVOVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgcFdDVFNDYi0+d2N0c05vdGlmeUNCRGF0YSk7CisKKyAgIC8qIHNpZ25hbCBldmVudCBmb3IgV0NUU19PcGVuVHJhbnNwb3J0IHRvIHByb2NlZWQgKi8KKyAgIHdwYWxFdmVudFNldCgmcFdDVFNDYi0+d2N0c0V2ZW50KTsKKworfS8qV0NUU19QQUxPcGVuQ2FsbGJhY2sqLworCisKKworLyoqCisgQGJyaWVmICAgIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBzZXJpYWxpemluZyBXQ1RTIFJlYWQKKyAgICAgICAgICAgcHJvY2Vzc2luZyBpbiB0aGUgY29udHJvbCBjb250ZXh0CisKKyBAcGFyYW0gICAgcFdDVFNDYiAgV0NUUyBDb250cm9sIEJsb2NrCisKKyBAc2VlCisgQHJldHVybiB2b2lkCisqLworc3RhdGljIHZvaWQKK1dDVFNfUEFMUmVhZENhbGxiYWNrCisoCisgICBXQ1RTX0NvbnRyb2xCbG9ja1R5cGUqICBwV0NUU0NiCispCit7CisgICB2b2lkKiBidWZmZXI7CisgICBpbnQgcGFja2V0X3NpemU7CisgICBpbnQgYXZhaWxhYmxlOworICAgaW50IGJ5dGVzX3JlYWQ7CisKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgU2FuaXR5IGNoZWNrCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoTlVMTCA9PSBwV0NUU0NiKSB8fCAoV0NUU19DQl9NQUdJQyAhPSBwV0NUU0NiLT53Y3RzTWFnaWMpKSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiV0NUU19QQUxSZWFkQ2FsbGJhY2s6IEludmFsaWQgcGFyYW1ldGVyIHJlY2VpdmVkLiIpOworICAgICAgcmV0dXJuOworICAgfQorCisgICAvKiBpdGVyYXRlIHVudGlsIG5vIG1vcmUgcGFja2V0cyBhcmUgYXZhaWxhYmxlICovCisgICB3aGlsZSAoMSkgeworICAgICAgLyogY2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgbmV4dCBwYWNrZXQgKi8KKyAgICAgIHBhY2tldF9zaXplID0gc21kX2N1cl9wYWNrZXRfc2l6ZShwV0NUU0NiLT53Y3RzQ2hhbm5lbCk7CisgICAgICBpZiAoMCA9PSBwYWNrZXRfc2l6ZSkgeworICAgICAgICAgLyogTm8gbW9yZSBkYXRhIHRvIGJlIHJlYWQgKi8KKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaG93IG11Y2ggb2YgdGhlIGRhdGEgaXMgYXZhaWxhYmxlICovCisgICAgICBhdmFpbGFibGUgPSBzbWRfcmVhZF9hdmFpbChwV0NUU0NiLT53Y3RzQ2hhbm5lbCk7CisgICAgICBpZiAoYXZhaWxhYmxlIDwgcGFja2V0X3NpemUpIHsKKyAgICAgICAgIC8qIEVudGlyZSBwYWNrZXQgbm90IHlldCByZWFkeSB0byBiZSByZWFkIC0tCisgICAgICAgICAgICBUaGVyZSB3aWxsIGJlIGFub3RoZXIgbm90aWZpY2F0aW9uIHdoZW4gaXQgaXMgcmVhZHkgKi8KKyAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgYnVmZmVyID0gd3BhbE1lbW9yeUFsbG9jYXRlKHBhY2tldF9zaXplKTsKKyAgICAgIGlmIChOVUxMID09ICBidWZmZXIpIHsKKyAgICAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJXQ1RTX1BBTFJlYWRDYWxsYmFjazogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIpOworICAgICAgICAgV1BBTF9BU1NFUlQoMCk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGJ5dGVzX3JlYWQgPSBzbWRfcmVhZChwV0NUU0NiLT53Y3RzQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X3NpemUpOworCisgICAgICBpZiAoYnl0ZXNfcmVhZCAhPSBwYWNrZXRfc2l6ZSkgeworICAgICAgICAgLypTb21lIHByb2JsZW0sIGRvIG5vdCBmb3J3YXJkIGl0IHRvIFdESS4qLworICAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIldDVFNfUEFMUmVhZENhbGxiYWNrOiBGYWlsZWQgdG8gcmVhZCBkYXRhIGZyb20gU01EIik7CisgICAgICAgICB3cGFsTWVtb3J5RnJlZShidWZmZXIpOworICAgICAgICAgV1BBTF9BU1NFUlQoMCk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8qIGZvcndhcmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlciAqLworICAgICAgcFdDVFNDYi0+d2N0c1J4TXNnQ0IoKFdDVFNfSGFuZGxlVHlwZSlwV0NUU0NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwV0NUU0NiLT53Y3RzUnhNc2dDQkRhdGEpOworCisgICAgICAvKiBGcmVlIHRoZSBhbGxvY2F0ZWQgYnVmZmVyKi8KKyAgICAgIHdwYWxNZW1vcnlGcmVlKGJ1ZmZlcik7CisgICB9CisKK30gLypXQ1RTX1BBTFJlYWRDYWxsYmFjayovCisKKworCisvKioKKyBAYnJpZWYgICAgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHNlcmlhbGl6aW5nIFdDVFMgV3JpdGUKKyAgICAgICAgICAgcHJvY2Vzc2luZyBpbiB0aGUgY29udHJvbCBjb250ZXh0CisKKyBAcGFyYW0gICAgcFdDVFNDYiAgV0NUUyBDb250cm9sIEJsb2NrCisKKyBAc2VlCisgQHJldHVybiB2b2lkCisqLworc3RhdGljIHZvaWQKK1dDVFNfUEFMV3JpdGVDYWxsYmFjaworKAorICAgV0NUU19Db250cm9sQmxvY2tUeXBlKiAgcFdDVFNDYgorKQoreworICAgd3B0X2xpc3Rfbm9kZSogICAgICBwTm9kZTsKKyAgIFdDVFNfQnVmZmVyVHlwZSogICAgcEJ1ZmZlclF1ZXVlOworICAgdm9pZCogICAgICAgICAgICAgICBwQnVmZmVyOworICAgaW50ICAgICAgICAgICAgICAgICBsZW47CisgICBpbnQgICAgICAgICAgICAgICAgIGF2YWlsYWJsZTsKKyAgIGludCAgICAgICAgICAgICAgICAgd3JpdHRlbjsKKworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjaworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKE5VTEwgPT0gcFdDVFNDYikgfHwgKFdDVFNfQ0JfTUFHSUMgIT0gcFdDVFNDYi0+d2N0c01hZ2ljKSkgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldDVFNfUEFMV3JpdGVDYWxsYmFjazogSW52YWxpZCBwYXJhbWV0ZXIgcmVjZWl2ZWQuIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIGlmIHdlIGFyZSBub3QgZGVmZXJyZWQsIHRoZW4gdGhlcmUgYXJlIG5vIHBlbmRpbmcgcGFja2V0cyAqLworICAgaWYgKFdDVFNfU1RBVEVfREVGRVJSRUQgIT0gcFdDVFNDYi0+d2N0c1N0YXRlKSB7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIEtlZXAgc2VuZGluZyBkZWZlcnJlZCBtZXNzYWdlcyBhcyBsb25nIGFzIHRoZXJlIGlzIHJvb20gaW4KKyAgICAgIHRoZSBjaGFubmVsLiAgTm90ZSB0aGF0IHdlIGluaXRpYWxseSBwZWVrIGF0IHRoZSBoZWFkIG9mIHRoZQorICAgICAgbGlzdCB0byBhY2Nlc3MgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBuZXh0IG1lc3NhZ2U7IHdlIGRvbid0CisgICAgICBhY3R1YWxseSByZW1vdmUgdGhlIG5leHQgbWVzc2FnZSBmcm9tIHRoZSBkZWZlcnJlZCBsaXN0IHVudGlsCisgICAgICB3ZSBrbm93IHRoZSBjaGFubmVsIGNhbiBoYW5kbGUgaXQgKi8KKyAgIHdoaWxlIChlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgPT0KKyAgICAgICAgICB3cGFsX2xpc3RfcGVla19mcm9udCgmcFdDVFNDYi0+d2N0c1BlbmRpbmdRdWV1ZSwgJnBOb2RlKSkgeworICAgICAgcEJ1ZmZlclF1ZXVlID0gY29udGFpbmVyX29mKHBOb2RlLCBXQ1RTX0J1ZmZlclR5cGUsIG5vZGUpOworICAgICAgcEJ1ZmZlciA9IHBCdWZmZXJRdWV1ZS0+cEJ1ZmZlcjsKKyAgICAgIGxlbiA9IHBCdWZmZXJRdWV1ZS0+YnVmZmVyU2l6ZTsKKworICAgICAgYXZhaWxhYmxlID0gc21kX3dyaXRlX2F2YWlsKHBXQ1RTQ2ItPndjdHNDaGFubmVsKTsKKyAgICAgIGlmIChhdmFpbGFibGUgPCBsZW4pIHsKKyAgICAgICAgIC8qIGNoYW5uZWwgaGFzIG5vIHJvb20gZm9yIHRoZSBuZXh0IHBhY2tldCBzbyB3ZSBhcmUgZG9uZSAqLworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvKiB0aGVyZSBpcyByb29tIGZvciB0aGUgbmV4dCBtZXNzYWdlLCBzbyB3ZSBjYW4gbm93IHJlbW92ZQorICAgICAgICAgaXQgZnJvbSB0aGUgZGVmZXJyZWQgbWVzc2FnZSBxdWV1ZSBhbmQgc2VuZCBpdCAqLworICAgICAgd3BhbF9saXN0X3JlbW92ZV9mcm9udCgmcFdDVFNDYi0+d2N0c1BlbmRpbmdRdWV1ZSwgJnBOb2RlKTsKKworICAgICAgLyogbm90ZSB0aGF0IHBOb2RlIHdpbGwgYmUgdGhlIHNhbWUgYXMgd2hlbiB3ZSBwZWVrZWQsIHNvCisgICAgICAgICB0aGVyZSBpcyBubyBuZWVkIHRvIHVwZGF0ZSBwQnVmZmVyIG9yIGxlbiAqLworCisgICAgICB3cml0dGVuID0gc21kX3dyaXRlKHBXQ1RTQ2ItPndjdHNDaGFubmVsLCBwQnVmZmVyLCBsZW4pOworICAgICAgaWYgKHdyaXR0ZW4gIT0gbGVuKSB7CisgICAgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyAqLworICAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIldDVFNfUEFMV3JpdGVDYWxsYmFjazogY2hhbm5lbCB3cml0ZSBmYWlsdXJlIik7CisKKyAgICAgICAgIC8qIHdlIHdlcmUgdW5hYmxlIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgYXQgdGhlIGhlYWQKKyAgICAgICAgICAgIG9mIHRoZSBkZWZlcnJlZCBsaXN0LiAgdGhlcmUgaXMgbm90aGluZyBlbHNlIHdlIGNhbiBkbworICAgICAgICAgICAgb3RoZXIgdGhhbiBkcm9wIGl0LCBzbyB3ZSB3aWxsIGp1c3QgZmFsbCB0aHJvdWdoIHRvIHRoZQorICAgICAgICAgICAgInN1Y2Nlc3MiIHByb2Nlc3NpbmcuCisgICAgICAgICAgICBob3BlZnVsbHkgdGhlIGNsaWVudCBjYW4gcmVjb3ZlciBmcm9tIHRoaXMgc2luY2UgdGhlcmUgaXMKKyAgICAgICAgICAgIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8gaGVyZSAqLworICAgICAgfQorCisgICAgICAvKiB3aGV0aGVyIHdlIGhhZCBzdWNjZXNzIG9yIGZhaWx1cmUsIHJlY2xhaW0gYWxsIG1lbW9yeSAqLworICAgICAgd3BhbE1lbW9yeUZyZWUocEJ1ZmZlcik7CisgICAgICB3cGFsTWVtb3J5RnJlZShwQnVmZmVyUXVldWUpOworCisgICAgICAvKiB3ZSdsbCBjb250aW51ZSB0byBpdGVyYXRlIHVudGlsIHRoZSBjaGFubmVsIGlzIGZ1bGwgb3IgYWxsCisgICAgICAgICBvZiB0aGUgZGVmZXJyZWQgbWVzc2FnZXMgaGF2ZSBiZWVuIHNlbnQgKi8KKyAgIH0KKworICAgLyogaWYgd2UndmUgZXhpdGVkIHRoZSBsb29wLCB0aGVuIHdlIGhhdmUgZHJhaW5lZCB0aGUgZGVmZXJyZWQgcXVldWUuCisgICAgICBzZXQgdGhlIHN0YXRlIHRvIGluZGljYXRlIHdlIGFyZSBubyBsb25nZXIgZGVmZXJyZWQsIGFuZCB0dXJuIG9mZgorICAgICAgdGhlIHJlbW90ZSByZWFkIGludGVycnVwdCAqLworICAgcFdDVFNDYi0+d2N0c1N0YXRlID0gV0NUU19TVEFURV9PUEVOOworICAgc21kX2Rpc2FibGVfcmVhZF9pbnRyKHBXQ1RTQ2ItPndjdHNDaGFubmVsKTsKKworfSAvKldDVFNfUEFMV3JpdGVDYWxsYmFjayovCisKKworCisvKioKKyBAYnJpZWYgICAgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHNlcmlhbGl6aW5nIFNNRCBEQVRBIEV2ZW50CisgICAgICAgICAgIHByb2Nlc3NpbmcgaW4gdGhlIGNvbnRyb2wgY29udGV4dAorIEBwYXJhbQorCisgICAgcE1zZyAtIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UKKworIEBzZWUKKyBAcmV0dXJuIHZvaWQKKyovCitzdGF0aWMgdm9pZAorV0NUU19QQUxEYXRhQ2FsbGJhY2sKKygKKyAgIHdwdF9tc2cgKnBNc2cKKykKK3sKKyAgIFdDVFNfQ29udHJvbEJsb2NrVHlwZSogICAgICAgIHBXQ1RTQ2I7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIC8qIGV4dHJhY3Qgb3VyIGNvbnRleHQgZnJvbSB0aGUgbWVzc2FnZSAqLworICAgcFdDVFNDYiA9IHBNc2ctPnBDb250ZXh0OworCisgICAvKiBwcm9jZXNzIGFueSBpbmNvbWluZyBtZXNzYWdlcyAqLworICAgV0NUU19QQUxSZWFkQ2FsbGJhY2socFdDVFNDYik7CisKKyAgIC8qIHNlbmQgYW55IGRlZmVycmVkIG1lc3NhZ2VzICovCisgICBXQ1RTX1BBTFdyaXRlQ2FsbGJhY2socFdDVFNDYik7CisKK30gLypXQ1RTX1BBTERhdGFDYWxsYmFjayovCisKKy8qKgorIEBicmllZiAgICBUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyB1c2VkIHRvIGNsZWFuIHVwIHRoZSBwZW5kaW5nIAorICAgICAgICAgICBtZXNzYWdlcyBpbiB0aGUgdHJhbnNwb3J0IHF1ZXVlCisKKyBAcGFyYW0gd2N0c0hhbmRsZWhhbmRsZTogIHRyYW5zcG9ydCBoYW5kbGUKKworIEBzZWUKKyBAcmV0dXJuICAgMCBmb3Igc3VjY2VzcworKi8KK3N0YXRpYyB3cHRfdWludDMyCitXQ1RTX0NsZWFyUGVuZGluZ1F1ZXVlCisoCisgICBXQ1RTX0hhbmRsZVR5cGUgICAgICB3Y3RzSGFuZGxlCispCit7CisgICBXQ1RTX0NvbnRyb2xCbG9ja1R5cGUqIHBXQ1RTQ2IgPSAoV0NUU19Db250cm9sQmxvY2tUeXBlKikgd2N0c0hhbmRsZTsKKyAgIHdwdF9saXN0X25vZGUqICAgICAgcE5vZGUgPSBOVUxMOworICAgV0NUU19CdWZmZXJUeXBlKiAgICBwQnVmZmVyUXVldWUgPSBOVUxMOworICAgdm9pZCogICAgICAgICAgICAgICBwQnVmZmVyID0gTlVMTDsKKworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgaWYgKChOVUxMID09IHBXQ1RTQ2IpIHx8IChXQ1RTX0NCX01BR0lDICE9IHBXQ1RTQ2ItPndjdHNNYWdpYykpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJXQ1RTX0NsZWFyUGVuZGluZ1F1ZXVlOiBJbnZhbGlkIHBhcmFtZXRlcnMgcmVjZWl2ZWQuIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICAvKkZyZWUgdGhlIGJ1ZmZlcnMgaW4gdGhlIHBlbmRpbmcgcXVldWUuKi8KKyAgIHdoaWxlIChlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgPT0KKyAgICAgICAgICB3cGFsX2xpc3RfcmVtb3ZlX2Zyb250KCZwV0NUU0NiLT53Y3RzUGVuZGluZ1F1ZXVlLCAmcE5vZGUpKSB7CisgICAgICBwQnVmZmVyUXVldWUgPSBjb250YWluZXJfb2YocE5vZGUsIFdDVFNfQnVmZmVyVHlwZSwgbm9kZSk7CisgICAgICBwQnVmZmVyID0gcEJ1ZmZlclF1ZXVlLT5wQnVmZmVyOworICAgICAgd3BhbE1lbW9yeUZyZWUocEJ1ZmZlcik7CisgICAgICB3cGFsTWVtb3J5RnJlZShwQnVmZmVyUXVldWUpOworICAgfQorCisgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworCit9LypXQ1RTX0NsZWFyUGVuZGluZ1F1ZXVlKi8KKworCisvKioKKyAqIE5vdGlmaWNhdGlvbiBjYWxsYmFjayB3aGVuIFNNRCBuZWVkcyB0byBjb21tdW5pY2F0ZSBhc3luY2hyb25vdXNseSB3aXRoCisgKiB0aGUgY2xpZW50LgorICoKKyAqIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0OyBjbGllbnRzIG11c3QKKyAqIG5vdCBibG9jayBvciBjYWxsIGFueSBmdW5jdGlvbnMgdGhhdCBibG9jay4KKyAqCisgKiBAcGFyYW1baW5dIGRhdGEgICBUaGUgdXNlci1zdXBwbGllZCBkYXRhIHByb3ZpZGVkIHRvIHNtZF9uYW1lZF9vcGVuX29uX2VkZ2UoKQorICogQHBhcmFtW2luXSBldmVudCAgVGhlIGV2ZW50IHRoYXQgb2NjdXJyZWQKKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqLworCitzdGF0aWMgdm9pZAorV0NUU19Ob3RpZnlDYWxsYmFjaworKAorICAgdm9pZCAgICAgICAgICAgICpkYXRhLAorICAgdW5zaWduZWQgICAgICAgIGV2ZW50CispCit7CisgICB3cHRfbXNnICAgICAgICAgICAgICAgICAgICAgICAqcGFsTXNnOworICAgV0NUU19Db250cm9sQmxvY2tUeXBlKiAgICAgICAgcFdDVFNDYiA9IChXQ1RTX0NvbnRyb2xCbG9ja1R5cGUqKSBkYXRhOworCisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjaworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoV0NUU19DQl9NQUdJQyAhPSBwV0NUU0NiLT53Y3RzTWFnaWMpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogUmVjZWl2ZWQgdW5leHBlY3RlZCBTTUQgZXZlbnQgJXUiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGV2ZW50KTsKKworICAgICAgLyogVE9ET19QUklNQSB3aGF0IGVycm9yIHJlY292ZXJ5IG9wdGlvbnMgZG8gd2UgaGF2ZT8gKi8KKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogU2VyaWFsaXplIHByb2Nlc3NpbmcgaW4gdGhlIGNvbnRyb2wgdGhyZWFkICovCisgICBzd2l0Y2ggKGV2ZW50KSB7CisgICBjYXNlIFNNRF9FVkVOVF9PUEVOOgorICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiJXM6IHJlY2VpdmVkIFNNRF9FVkVOVF9PUEVOIGZyb20gU01EIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIC8qIElmIHRoZSBwcmV2IHN0YXRlIHdhcyAncmVtb3RlIGNsb3NlZCcgdGhlbiBpdCBpcyBhIFJpdmEgJ3Jlc3RhcnQnLAorICAgICAgICogc3Vic3lzdGVtIHJlc3RhcnQgcmUtaW5pdAorICAgICAgICovCisgICAgICBpZiAoV0NUU19TVEFURV9SRU1fQ0xPU0VEID09IHBXQ1RTQ2ItPndjdHNTdGF0ZSkKKyAgICAgIHsKKyAgICAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiJXM6IHJlY2VpdmVkIFNNRF9FVkVOVF9PUEVOIGluIFdDVFNfU1RBVEVfUkVNX0NMT1NFRCBzdGF0ZSIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgIC8qIGNhbGwgc3Vic3lzdGVtIHJlc3RhcnQgcmUtaW5pdCBmdW5jdGlvbiAqLworICAgICAgICAgICB3cGFsRHJpdmVyUmVJbml0KCk7CisgICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHBhbE1zZyA9ICZwV0NUU0NiLT53Y3RzT3Blbk1zZzsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFNNRF9FVkVOVF9EQVRBOgorICAgICAgaWYgKFdDVFNfU1RBVEVfUkVNX0NMT1NFRCA9PSBwV0NUU0NiLT53Y3RzU3RhdGUpCisgICAgICB7CisgICAgICAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogcmVjZWl2ZWQgU01EIGRhdGEgd2hlbiB0aGUgc3RhdGUgaXMgcmVtb3RlIGNsb3NlZCAiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAvKiB3ZSBzaG91bGQgbm90IGJlIGdldHRpbmcgYW55IGRhdGEgbm93ICovCisgICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIiVzOiByZWNlaXZlZCBTTURfRVZFTlRfREFUQSBmcm9tIFNNRCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBwYWxNc2cgPSAmcFdDVFNDYi0+d2N0c0RhdGFNc2c7CisgICAgICBicmVhazsKKworICAgY2FzZSBTTURfRVZFTlRfQ0xPU0U6CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICIlczogcmVjZWl2ZWQgU01EX0VWRU5UX0NMT1NFIGZyb20gU01EIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIC8qIFNNRCBjaGFubmVsIHdhcyBjbG9zZWQgZnJvbSB0aGUgcmVtb3RlIHNpZGUsCisgICAgICAgKiB0aGlzIHdvdWxkIGhhcHBlbiBvbmx5IHdoZW4gUml2YSBjcmFzaGVkIGFuZCBTTUQgaXMKKyAgICAgICAqIGNsb3NpbmcgdGhlIGNoYW5uZWwgb24gYmVoYWxmIG9mIFJpdmEgKi8KKyAgICAgIHBXQ1RTQ2ItPndjdHNTdGF0ZSA9IFdDVFNfU1RBVEVfUkVNX0NMT1NFRDsKKyAgICAgIFdDVFNfQ2xlYXJQZW5kaW5nUXVldWUgKHBXQ1RTQ2IpOworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiJXM6IHJlY2VpdmVkIFNNRF9FVkVOVF9DTE9TRSBXTEFOIGRyaXZlciBnb2luZyBkb3duIG5vdyIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAvKiBzdWJzeXN0ZW0gcmVzdGFydDogc2h1dGRvd24gKi8KKyAgICAgIHdwYWxEcml2ZXJTaHV0ZG93bigpOworICAgICAgcmV0dXJuOworCisgICBjYXNlIFNNRF9FVkVOVF9TVEFUVVM6CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICIlczogcmVjZWl2ZWQgU01EX0VWRU5UX1NUQVRVUyBmcm9tIFNNRCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm47CisKKyAgIGNhc2UgU01EX0VWRU5UX1JFT1BFTl9SRUFEWToKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GTywKKyAgICAgICAgICAgICAgICAgIiVzOiByZWNlaXZlZCBTTURfRVZFTlRfUkVPUEVOX1JFQURZIGZyb20gU01EIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgLyogdW5saWtlIG90aGVyIGV2ZW50cyB3aGljaCBvY2N1ciB3aGVuIG91ciBrZXJuZWwgdGhyZWFkcyBhcmUKKyAgICAgICAgIHJ1bm5pbmcsIHRoaXMgb25lIGlzIHJlY2VpdmVkIHdoZW4gdGhlIHRocmVhZHMgYXJlIGNsb3NlZCBhbmQKKyAgICAgICAgIHRoZSBybW1vZCB0aHJlYWQgaXMgd2FpdGluZy4gIHNvIGp1c3QgdW5ibG9jayB0aGF0IHRocmVhZCAqLworICAgICAgd3BhbEV2ZW50U2V0KCZwV0NUU0NiLT53Y3RzRXZlbnQpOworICAgICAgcmV0dXJuOworCisgICBkZWZhdWx0OgorICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBVbmV4cGVjdGVkIGV2ZW50ICV1IHJlY2VpdmVkIGZyb20gU01EIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBldmVudCk7CisKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogc2VyaWFsaXplIHRoaXMgZXZlbnQgKi8KKyAgIHdwYWxQb3N0Q3RybE1zZyhXRElfR0VUX1BBTF9DVFgoKSwgcGFsTXNnKTsKKworfSAvKldDVFNfTm90aWZ5Q2FsbGJhY2sqLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbGl6ZWQgRnVuY3Rpb24gRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qKgorIEBicmllZiAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBEQUwgQ29yZSB0byBpbml0aWFsaXplIHRoZSBDb250cm9sCisgICAgICAgICAgICBUcmFuc3BvcnQgZm9yIHByb2Nlc3NpbmcuIEl0IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYW55CisgICAgICAgICAgICBvdGhlciBBUElzIG9mIHRoZSBDb250cm9sIFRyYW5zcG9ydC4KKworCisgQHBhcmFtIHN6TmFtZTogICB1bmlxdWUgbmFtZSBmb3IgdGhlIGNoYW5uZWwgdGhhdCBpcyB0byBiZSBvcGVuZWQKKyAgICAgICAgIHVTaXplOiAgIHNpemUgb2YgdGhlIGNoYW5uZWwgdGhhdCBtdXN0IGJlIG9wZW5lZCAoc2hvdWxkIGZpdCB0aGUKKyAgICAgICAgICAgICAgICAgIGxhcmdlc3Qgc2l6ZSBvZiAgcGFja2V0IHRoYXQgdGhlIERhbCBDb3JlIHdpc2hlcyB0byBzZW5kKQorICAgICAgICAgd2N0c0NCczogIGEgbGlzdCBvZiBjYWxsYmFja3MgdGhhdCB0aGUgQ1QgbmVlZHMgdG8gdXNlIHRvIHNlbmQKKyAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbiBhbmQgbWVzc2FnZXMgYmFjayB0byBEQUwKKworIEBzZWUKKyBAcmV0dXJuICBBIGhhbmRsZSB0aGF0IG11c3QgYmUgdXNlZCBmb3IgZnVydGhlciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIENUUy4KKyAgICAgICAgIFRoaXMgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSBmb3IgdGhlIGNhbGxlciBhbmQgaXQgd2lsbCBiZSB1c2VkIGluCisgICAgICAgICBhbGwgY29tbXVuaWNhdGlvbnMgdG8gYW5kIGZyb20gdGhlIENUUy4KKworKi8KK1dDVFNfSGFuZGxlVHlwZQorV0NUU19PcGVuVHJhbnNwb3J0CisoCisgICBjb25zdCB3cHRfdWludDgqICAgICAgICAgc3pOYW1lLAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgIHVTaXplLAorICAgV0NUU19UcmFuc3BvcnRDQnNUeXBlKiAgIHdjdHNDQnMKKykKK3sKKyAgIFdDVFNfQ29udHJvbEJsb2NrVHlwZSogICAgcFdDVFNDYjsKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgICAgICAgc3RhdHVzOworICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBzbWRzdGF0dXM7CisKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgIGlmICgoTlVMTCA9PSB3Y3RzQ0JzKSB8fCAoTlVMTCA9PSBzek5hbWUpIHx8CisgICAgICAgKE5VTEwgPT0gd2N0c0NCcy0+d2N0c05vdGlmeUNCKSB8fCAoTlVMTCA9PSB3Y3RzQ0JzLT53Y3RzUnhNc2dDQikpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJXQ1RTX09wZW5UcmFuc3BvcnQ6IEludmFsaWQgcGFyYW1ldGVycyByZWNlaXZlZC4iKTsKKworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIC8qIFRoaXMgb3BlbiBpcyBjb21pbmcgYWZ0ZXIgYSBTU1IsIHdlIGRvbid0IG5lZWQgdG8gcmVvcGVuIFNNRCwKKyAgICAqIHRoZSBTTUQgcG9ydCB3YXMgbmV2ZXIgY2xvc2VkIGR1cmluZyBTU1IqLworICAgaWYgKGd3Y3RzSGFuZGxlKSB7CisgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgIldDVFNfT3BlblRyYW5zcG9ydCBwb3J0IGlzIGFscmVhZHkgb3BlblxuIik7CisKKyAgICAgICBwV0NUU0NiID0gZ3djdHNIYW5kbGU7CisgICAgICAgaWYgKFdDVFNfQ0JfTUFHSUMgIT0gcFdDVFNDYi0+d2N0c01hZ2ljKSB7CisgICAgICAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgIldDVFNfT3BlblRyYW5zcG9ydDogSW52YWxpZCBtYWdpYy4iKTsKKyAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgfSAgIAorICAgICAgIHBXQ1RTQ2ItPndjdHNTdGF0ZSA9IFdDVFNfU1RBVEVfT1BFTjsKKworICAgICAgIHBXQ1RTQ2ItPndjdHNOb3RpZnlDQigoV0NUU19IYW5kbGVUeXBlKXBXQ1RTQ2IsCisgICAgICAgICAgICAgICBXQ1RTX0VWRU5UX09QRU4sCisgICAgICAgICAgICAgICBwV0NUU0NiLT53Y3RzTm90aWZ5Q0JEYXRhKTsKKworICAgICAgIC8qIHdlIGluaXRpYWxseSBkb24ndCB3YW50IHJlYWQgaW50ZXJydXB0cworICAgICAgICAgKHdlIG9ubHkgd2FudCB0aGVtIGlmIHdlIGdldCBpbnRvIGRlZmVycmVkIHdyaXRlIG1vZGUpICovCisgICAgICAgc21kX2Rpc2FibGVfcmVhZF9pbnRyKHBXQ1RTQ2ItPndjdHNDaGFubmVsKTsKKworICAgICAgIHJldHVybiAoV0NUU19IYW5kbGVUeXBlKXBXQ1RTQ2I7CisgICB9CisKKyNpZmRlZiBGRUFUVVJFX1IzM0QKKyAgIGlmKHBvcnRfb3BlbikKKyAgIHsKKyAgICAgIC8qIFBvcnQgb3BlbiBiZWZvcmUsIG5vdCBuZWVkIHRvIG9wZW4gYWdhaW4gKi8KKyAgICAgIC8qIG5vdGlmaWVkIHJlZ2lzdGVyZWQgY2xpZW50IHRoYXQgdGhlIGNoYW5uZWwgaXMgb3BlbiAqLworICAgICAgY3RzQ0ItPndjdHNTdGF0ZSA9IFdDVFNfU1RBVEVfT1BFTjsKKyAgICAgIGN0c0NCLT53Y3RzTm90aWZ5Q0IoKFdDVFNfSGFuZGxlVHlwZSljdHNDQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdDVFNfRVZFTlRfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0c0NCLT53Y3RzTm90aWZ5Q0JEYXRhKTsKKyAgICAgIHJldHVybiAoV0NUU19IYW5kbGVUeXBlKWN0c0NCOworICAgfQorI2VuZGlmIC8qIEZFQVRVUkVfUjMzRCAqLworCisgICAvKiBhbGxvY2F0ZSBhIENvbnRyb2xCbG9jayB0byBob2xkIGFsbCBjb250ZXh0ICovCisgICBwV0NUU0NiID0gd3BhbE1lbW9yeUFsbG9jYXRlKHNpemVvZigqcFdDVFNDYikpOworICAgaWYgKE5VTEwgPT0gcFdDVFNDYikgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldDVFNfT3BlblRyYW5zcG9ydDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICAvKiBtYWtlIHN1cmUgdGhlIGNvbnRyb2wgYmxvY2sgaXMgaW5pdGlhbGl6ZWQuICBpbiBwYXJ0aWN1bGFyIHdlIG5lZWQKKyAgICAgIHRvIG1ha2Ugc3VyZSB0aGUgZW1iZWRkZWQgZXZlbnQgYW5kIGxpc3Qgc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgIHRvIHByZXZlbnQgIm1hZ2ljIG51bWJlciIgdGVzdHMgZnJvbSBiZWluZyBydW4gYWdhaW5zdCB1bmluaXRpYWxpemVkCisgICAgICB2YWx1ZXMgKi8KKyAgIHdwYWxNZW1vcnlaZXJvKHBXQ1RTQ2IsIHNpemVvZigqcFdDVFNDYikpOworCisjaWZkZWYgRkVBVFVSRV9SMzNECisgICBzbWRfaW5pdCgwKTsKKyAgIHBvcnRfb3BlbiA9IDE7CisgICBjdHNDQiA9IHBXQ1RTQ2I7CisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisKKyAgIC8qSW5pdGlhbGlzZSB0aGUgZXZlbnQqLworICAgd3BhbEV2ZW50SW5pdCgmcFdDVFNDYi0+d2N0c0V2ZW50KTsKKworICAgLyogc2F2ZSB0aGUgdXNlci1zdXBwbGllZCBpbmZvcm1hdGlvbiAqLworICAgcFdDVFNDYi0+d2N0c05vdGlmeUNCICAgICAgID0gd2N0c0NCcy0+d2N0c05vdGlmeUNCOworICAgcFdDVFNDYi0+d2N0c05vdGlmeUNCRGF0YSAgID0gd2N0c0NCcy0+d2N0c05vdGlmeUNCRGF0YTsKKyAgIHBXQ1RTQ2ItPndjdHNSeE1zZ0NCICAgICAgICA9IHdjdHNDQnMtPndjdHNSeE1zZ0NCOworICAgcFdDVFNDYi0+d2N0c1J4TXNnQ0JEYXRhICAgID0gd2N0c0NCcy0+d2N0c1J4TXNnQ0JEYXRhOworCisgICAvKiBpbml0aWFsaXplIHRoZSByZW1haW5pbmcgZmllbGRzICovCisgICB3cGFsX2xpc3RfaW5pdCgmcFdDVFNDYi0+d2N0c1BlbmRpbmdRdWV1ZSk7CisgICBwV0NUU0NiLT53Y3RzTWFnaWMgICA9IFdDVFNfQ0JfTUFHSUM7CisgICBwV0NUU0NiLT53Y3RzU3RhdGUgICA9IFdDVFNfU1RBVEVfT1BFTl9QRU5ESU5HOworICAgcFdDVFNDYi0+d2N0c0NoYW5uZWwgPSBOVUxMOworCisgICAvKiBzaW5jZSBTTUQgd2lsbCBjYWxsYmFjayBpbiBpbnRlcnJ1cHQgY29udGV4dCwgd2Ugd2lsbCB1c2VkCisgICAgKiBjYW5uZWQgbWVzc2FnZXMgdG8gc2VyaWFsaXplIHRoZSBTTUQgZXZlbnRzIGludG8gYSB0aHJlYWQKKyAgICAqIGNvbnRleHQKKyAgICAqLworICAgcFdDVFNDYi0+d2N0c09wZW5Nc2cuY2FsbGJhY2sgPSBXQ1RTX1BBTE9wZW5DYWxsYmFjazsKKyAgIHBXQ1RTQ2ItPndjdHNPcGVuTXNnLnBDb250ZXh0ID0gcFdDVFNDYjsKKworICAgcFdDVFNDYi0+d2N0c0RhdGFNc2cuY2FsbGJhY2sgPSBXQ1RTX1BBTERhdGFDYWxsYmFjazsKKyAgIHBXQ1RTQ2ItPndjdHNEYXRhTXNnLnBDb250ZXh0ID0gcFdDVFNDYjsKKworICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgT3BlbiB0aGUgU01EIGNoYW5uZWwKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgd3BhbEV2ZW50UmVzZXQoJnBXQ1RTQ2ItPndjdHNFdmVudCk7CisgICBzbWRzdGF0dXMgPSBzbWRfbmFtZWRfb3Blbl9vbl9lZGdlKHN6TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01EX0FQUFNfV0NOU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV0NUU0NiLT53Y3RzQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdDVFNDYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0NUU19Ob3RpZnlDYWxsYmFjayk7CisgICBpZiAoMCAhPSBzbWRzdGF0dXMpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogc21kX25hbWVkX29wZW5fb25fZWRnZSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNtZHN0YXR1cyk7CisgICAgICBnb3RvIGZhaWw7CisgICB9CisKKyAgIC8qIHdhaXQgZm9yIHRoZSBjaGFubmVsIHRvIGJlIGZ1bGx5IG9wZW5lZCBiZWZvcmUgd2UgcHJvY2VlZCAqLworICAgc3RhdHVzID0gd3BhbEV2ZW50V2FpdCgmcFdDVFNDYi0+d2N0c0V2ZW50LCBXQ1RTX1NNRF9PUEVOX1RJTUVPVVQpOworICAgaWYgKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogZmFpbGVkIHRvIHJlY2VpdmUgU01EX0VWRU5UX09QRU4iLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgLyogc2luY2Ugd2Ugb3BlbmVkIG9uZSBlbmQgb2YgdGhlIGNoYW5uZWwsIGNsb3NlIGl0ICovCisgICAgICBzbWRzdGF0dXMgPSBzbWRfY2xvc2UocFdDVFNDYi0+d2N0c0NoYW5uZWwpOworICAgICAgaWYgKDAgIT0gc21kc3RhdHVzKSB7CisgICAgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiJXM6IHNtZF9jbG9zZSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNtZHN0YXR1cyk7CisgICAgICB9CisgICAgICBnb3RvIGZhaWw7CisgICB9CisKKyAgIC8qIHdlIGluaXRpYWxseSBkb24ndCB3YW50IHJlYWQgaW50ZXJydXB0cworICAgICAgKHdlIG9ubHkgd2FudCB0aGVtIGlmIHdlIGdldCBpbnRvIGRlZmVycmVkIHdyaXRlIG1vZGUpICovCisgICBzbWRfZGlzYWJsZV9yZWFkX2ludHIocFdDVFNDYi0+d2N0c0NoYW5uZWwpOworCisgICAvKiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBvcGVuZWQgdGhlIFNNRCBjaGFubmVsICovCisgICBnd2N0c0hhbmRsZSA9IHBXQ1RTQ2I7CisgICByZXR1cm4gKFdDVFNfSGFuZGxlVHlwZSlwV0NUU0NiOworCisgZmFpbDoKKyAgIC8qIHdlIHdlcmUgdW5hYmxlIHRvIG9wZW4gdGhlIFNNRCBjaGFubmVsICovCisgICBwV0NUU0NiLT53Y3RzTWFnaWMgPSAwOworICAgd3BhbE1lbW9yeUZyZWUocFdDVFNDYik7CisgICByZXR1cm4gTlVMTDsKKworfS8qV0NUU19PcGVuVHJhbnNwb3J0Ki8KKworCisKKy8qKgorIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIERBTCBDb3JlIHRvIGNsb3NlIHRoZQorICAgICAgICAgICBDb250cm9sIFRyYW5zcG9ydCB3aGVuIGl0cyBzZXJ2aWNlcyBhcmUgbm8gbG9uZ2VyCisgICAgICAgICAgIG5lZWRlZC4gRnVsbCBjbG9zZSBub3RpZmljYXRpb24gd2lsbCBiZSByZWNlaXZlCisgICAgICAgICAgIGFzeW5jaHJvbm91c2x5IG9uIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgICAgICAgcmVnaXN0ZXJlZCBvbiBPcGVuCisKKworIEBwYXJhbSB3Y3RzSGFuZGxlaGFuZGxlOiAgcmVjZWl2ZWQgdXBvbiBvcGVuCisKKyBAc2VlCisgQHJldHVybiAgIDAgZm9yIHN1Y2Nlc3MKKyovCit3cHRfdWludDMyCitXQ1RTX0Nsb3NlVHJhbnNwb3J0CisoCisgICBXQ1RTX0hhbmRsZVR5cGUgICAgICB3Y3RzSGFuZGxlCispCit7CisgICBXQ1RTX0NvbnRyb2xCbG9ja1R5cGUqIHBXQ1RTQ2IgPSAoV0NUU19Db250cm9sQmxvY2tUeXBlKikgd2N0c0hhbmRsZTsKKyAgIHdwdF9saXN0X25vZGUqICAgICAgcE5vZGUgPSBOVUxMOworICAgV0NUU19CdWZmZXJUeXBlKiAgICBwQnVmZmVyUXVldWUgPSBOVUxMOworICAgdm9pZCogICAgICAgICAgICAgICBwQnVmZmVyID0gTlVMTDsKKyAgIHdwdF9zdGF0dXMgICAgICAgICAgc3RhdHVzOworICAgaW50ICAgICAgICAgICAgICAgICBzbWRzdGF0dXM7CisKKyAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisKKyAgIGlmICgoTlVMTCA9PSBwV0NUU0NiKSB8fCAoV0NUU19DQl9NQUdJQyAhPSBwV0NUU0NiLT53Y3RzTWFnaWMpKSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfQ1RSTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiV0NUU19DbG9zZVRyYW5zcG9ydDogSW52YWxpZCBwYXJhbWV0ZXJzIHJlY2VpdmVkLiIpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworI2lmZGVmIEZFQVRVUkVfUjMzRAorICAgLyogTm90IGFjdHVhbGx5IGNsb3NlIHBvcnQsIGp1c3QgcHJldGVuZCAqLworICAgLyogbm90aWZpZWQgcmVnaXN0ZXJlZCBjbGllbnQgdGhhdCB0aGUgY2hhbm5lbCBpcyBjbG9zZWQgKi8KKyAgIHBXQ1RTQ2ItPndjdHNTdGF0ZSA9IFdDVFNfU1RBVEVfQ0xPU0VEOworICAgcFdDVFNDYi0+d2N0c05vdGlmeUNCKChXQ1RTX0hhbmRsZVR5cGUpcFdDVFNDYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXQ1RTX0VWRU5UX0NMT1NFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBXQ1RTQ2ItPndjdHNOb3RpZnlDQkRhdGEpOworCisgICBwcmludGsoS0VSTl9FUlIgIlIzM0QgTm90IG5lZWQgdG8gY2xvc2UiKTsKKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisKKyAgIC8qRnJlZSB0aGUgYnVmZmVycyBpbiB0aGUgcGVuZGluZyBxdWV1ZS4qLworICAgd2hpbGUgKGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyA9PQorICAgICAgICAgIHdwYWxfbGlzdF9yZW1vdmVfZnJvbnQoJnBXQ1RTQ2ItPndjdHNQZW5kaW5nUXVldWUsICZwTm9kZSkpIHsKKyAgICAgIHBCdWZmZXJRdWV1ZSA9IGNvbnRhaW5lcl9vZihwTm9kZSwgV0NUU19CdWZmZXJUeXBlLCBub2RlKTsKKyAgICAgIHBCdWZmZXIgPSBwQnVmZmVyUXVldWUtPnBCdWZmZXI7CisgICAgICB3cGFsTWVtb3J5RnJlZShwQnVmZmVyKTsKKyAgICAgIHdwYWxNZW1vcnlGcmVlKHBCdWZmZXJRdWV1ZSk7CisgICB9CisKKyAgIC8qIFJlc2V0IHRoZSBzdGF0ZSAqLworICAgcFdDVFNDYi0+d2N0c1N0YXRlID0gV0NUU19TVEFURV9DTE9TRUQ7CisKKyAgIHdwYWxFdmVudFJlc2V0KCZwV0NUU0NiLT53Y3RzRXZlbnQpOworICAgc21kc3RhdHVzID0gc21kX2Nsb3NlKHBXQ1RTQ2ItPndjdHNDaGFubmVsKTsKKyAgIGlmICgwICE9IHNtZHN0YXR1cykgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBzbWRfY2xvc2UgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzbWRzdGF0dXMpOworICAgICAgLyogU01EIGRpZCBub3Qgc3VjY2Vzc2Z1bGx5IGNsb3NlIHRoZSBjaGFubmVsLCB0aGVyZWZvcmUgd2UKKyAgICAgICAgIHdvbid0IHJlY2VpdmUgYW4gYXN5bmNocm9ub3VzIGNsb3NlIG5vdGlmaWNhdGlvbiBzbyBkb24ndAorICAgICAgICAgYm90aGVyIHRvIHdhaXQgZm9yIGFuIGV2ZW50IHRoYXQgd29uJ3QgY29tZSAqLworCisgICB9IGVsc2UgeworICAgICAgLyogY2xvc2UgY29tbWFuZCB3YXMgc2VudCAtLSB3YWl0IGZvciB0aGUgY2FsbGJhY2sgdG8gY29tcGxldGUgKi8KKyAgICAgIHN0YXR1cyA9IHdwYWxFdmVudFdhaXQoJnBXQ1RTQ2ItPndjdHNFdmVudCwgV0NUU19TTURfQ0xPU0VfVElNRU9VVCk7CisgICAgICBpZiAoZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBmYWlsZWQgdG8gcmVjZWl2ZSBTTURfRVZFTlRfUkVPUEVOX1JFQURZIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIH0KKworICAgICAgLyogRHVyaW5nIHRoZSBjbG9zZSBzZXF1ZW5jZSB3ZSBkZXJlZ2lzdGVyZWQgZnJvbSBTTUQuICBBcyBwYXJ0CisgICAgICAgICBvZiBkZXJlZ2lzdHJhdGlvbiBTTUQgd2lsbCBjYWxsIGJhY2sgaW50byBvdXIgZHJpdmVyIHdpdGggYW4KKyAgICAgICAgIGV2ZW50IHRvIGxldCB1cyBrbm93IHRoZSBjaGFubmVsIGlzIGNsb3NlZC4gIFdlIG5lZWQgdG8KKyAgICAgICAgIGluc2VydCBhIGJyaWVmIGRlbGF5IHRvIGFsbG93IHRoYXQgdGhyZWFkIG9mIGV4ZWN1dGlvbiB0bworICAgICAgICAgZXhpdCBvdXIgbW9kdWxlLiAgT3RoZXJ3aXNlIG91ciBtb2R1bGUgbWF5IGJlIHVubG9hZGVkIHdoaWxlCisgICAgICAgICB0aGVyZSBpcyBzdGlsbCBjb2RlIHJ1bm5pbmcgd2l0aGluIHRoZSBhZGRyZXNzIHNwYWNlLCBhbmQKKyAgICAgICAgIHRoYXQgY29kZSB3aWxsIGNyYXNoIHdoZW4gdGhlIG1lbW9yeSBpcyB1bm1hcHBlZCAgKi8KKyAgICAgIG1zbGVlcCg1MCk7CisgICB9CisKKyAgIC8qIGNoYW5uZWwgaGFzIChob3BlZnVsbHkpIGJlZW4gY2xvc2VkICovCisgICBwV0NUU0NiLT53Y3RzTm90aWZ5Q0IoKFdDVFNfSGFuZGxlVHlwZSlwV0NUU0NiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdDVFNfRVZFTlRfQ0xPU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFdDVFNDYi0+d2N0c05vdGlmeUNCRGF0YSk7CisKKyAgIC8qIHJlbGVhc2UgdGhlIHJlc291cmNlICovCisgICBwV0NUU0NiLT53Y3RzTWFnaWMgPSAwOworICAgd3BhbE1lbW9yeUZyZWUocFdDVFNDYik7CisKKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKK30vKldDVFNfQ2xvc2VUcmFuc3BvcnQqLworCisKKworLyoqCisgQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgREFMIENvcmUgdG8gdG8gc2VuZCBhCisgICAgICAgICAgIG1lc3NhZ2Ugb3ZlciB0byB0aGUgV0xBTiBzdWItc3lzdGVtLgorCisgICAgICAgICAgIE9uY2UgYSBidWZmZXIgaGFzIGJlZW4gcGFzc2VkIGludG8gdGhlIFNlbmQgTWVzc2FnZQorIEFQSSwgQ1QgdGFrZXMgZnVsbCBvd25lcnNoaXAgb2YgaXQgYW5kIGl0IGlzIHJlc3BvbnNpYmxlIGZvcgorIGZyZWVpbmcgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2VzLiAoVGhpcyBwcmV2ZW50cyBhIG1lbWNweSBpbgorIGNhc2Ugb2YgYSBkZWZlcnJlZCB3cml0ZSkKKworIFRoZSBtZXNzYWdlcyB0cmFuc3BvcnRlZCB0aHJvdWdoIHRoZSBDVCBvbiBib3RoIFJYIGFuZCBUWCBhcmUKKyBmbGF0IG1lbW9yeSBidWZmZXJzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGFuZCBtYW5pcHVsYXRlZAorIHRocm91Z2ggc3RhbmRhcmQgbWVtb3J5IGZ1bmN0aW9ucy4KKworIEBwYXJhbSB3Y3RzSGFuZGxlaGFuZGxlOiAgcmVjZWl2ZWQgdXBvbiBvcGVuCisgICAgICAgIHBNc2c6ICB0aGUgbWVzc2FnZSB0byBiZSBzZW50CisgICAgICAgIHVMZW46IHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UKKworIEBzZWUKKyBAcmV0dXJuICAgMCBmb3Igc3VjY2VzcworKi8KK3dwdF91aW50MzIKK1dDVFNfU2VuZE1lc3NhZ2UKKygKKyAgIFdDVFNfSGFuZGxlVHlwZSAgICAgIHdjdHNIYW5kbGUsCisgICB2b2lkKiAgICAgICAgICAgICAgICBwTXNnLAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgdUxlbgorKQoreworICAgV0NUU19Db250cm9sQmxvY2tUeXBlKiAgICBwV0NUU0NiID0gKFdDVFNfQ29udHJvbEJsb2NrVHlwZSopIHdjdHNIYW5kbGU7CisgICBXQ1RTX0J1ZmZlclR5cGUqICAgICAgICAgIHBCdWZmZXJRdWV1ZTsKKyAgIGludCAgICAgICAgICAgICAgICAgICAgICAgbGVuOworICAgaW50ICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuID0gMDsKKyAgIGludCAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlOworCisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFNhbml0eSBjaGVjaworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICBpZiAoKE5VTEwgPT0gcFdDVFNDYikgfHwgKFdDVFNfQ0JfTUFHSUMgIT0gcFdDVFNDYi0+d2N0c01hZ2ljKSB8fAorICAgICAgIChOVUxMID09IHBNc2cpIHx8ICgwID09IHVMZW4pIHx8ICgweDdmZmZmZmZmIDwgdUxlbikpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJXQ1RTX1NlbmRNZXNzYWdlOiBJbnZhbGlkIHBhcmFtZXRlcnMgcmVjZWl2ZWQuIik7CisgICAgICBXUEFMX0FTU0VSVCgwKTsKKyAgICAgIGlmIChOVUxMICE9IHBNc2cpIHsKKyAgICAgICAgIHdwYWxNZW1vcnlGcmVlKHBNc2cpOworICAgICAgfQorICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLyogdGhlIFNNRCBBUEkgdXNlcyBpbnQgaW5zdGVhZCBvZiB1aW50LCBzbyBjaGFuZ2UgdHlwZXMgaGVyZSAqLworICAgbGVuID0gKGludCl1TGVuOworCisgICBpZiAoV0NUU19TVEFURV9PUEVOID09IHBXQ1RTQ2ItPndjdHNTdGF0ZSkgeworICAgICAgYXZhaWxhYmxlID0gc21kX3dyaXRlX2F2YWlsKHBXQ1RTQ2ItPndjdHNDaGFubmVsKTsKKyAgICAgIGlmIChhdmFpbGFibGUgPj0gbGVuKSB7CisgICAgICAgICB3cml0dGVuID0gc21kX3dyaXRlKHBXQ1RTQ2ItPndjdHNDaGFubmVsLCBwTXNnLCBsZW4pOworICAgICAgfQorICAgfSBlbHNlIGlmIChXQ1RTX1NUQVRFX0RFRkVSUkVEID09IHBXQ1RTQ2ItPndjdHNTdGF0ZSkgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgICAgICAgICAgICAiV0NUU19TZW5kTWVzc2FnZTogRklGTyBzcGFjZSBub3QgYXZhaWxhYmxlLCB0aGUgcGFja2V0cyB3aWxsIGJlIHF1ZXVlZCIpOworICAgfSBlbHNlIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9DVFJMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICJXQ1RTX1NlbmRNZXNzYWdlOiBDaGFubmVsIGluIGlsbGVnYWwgc3RhdGUgWyVkXS4iLAorICAgICAgICAgICAgICAgICBwV0NUU0NiLT53Y3RzU3RhdGUpOworICAgICAgLyogZm9yY2UgZm9sbG93aW5nIGxvZ2ljIHRvIHJlY2xhaW0gdGhlIGJ1ZmZlciAqLworICAgICAgd3JpdHRlbiA9IC0xOworICAgfQorCisgICBpZiAoLTEgPT0gd3JpdHRlbikgeworICAgICAgLypTb21ldGhpbmcgd3JvbmcqLworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIldDVFNfU2VuZE1lc3NhZ2U6IEZhaWxlZCB0byBzZW5kIG1lc3NhZ2Ugb3ZlciB0aGUgYnVzLiIpOworICAgICAgd3BhbE1lbW9yeUZyZWUocE1zZyk7CisgICAgICBXUEFMX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0gZWxzZSBpZiAod3JpdHRlbiA9PSBsZW4pIHsKKyAgICAgIC8qIE1lc3NhZ2Ugc2VudCEgTm8gZGVmZXJyZWQgc3RhdGUsIGZyZWUgdGhlIGJ1ZmZlciovCisgICAgICB3cGFsTWVtb3J5RnJlZShwTXNnKTsKKyAgIH0gZWxzZSB7CisgICAgICAvKiBUaGlzIG11Y2ggZGF0YSBjYW5ub3QgYmUgd3JpdHRlbiBhdCB0aGlzIHRpbWUsCisgICAgICAgICBxdWV1ZSB0aGUgcmVzdCBvZiB0aGUgZGF0YSBmb3IgbGF0ZXIqLworICAgICAgcEJ1ZmZlclF1ZXVlID0gd3BhbE1lbW9yeUFsbG9jYXRlKHNpemVvZihXQ1RTX0J1ZmZlclR5cGUpKTsKKyAgICAgIGlmIChOVUxMID09IHBCdWZmZXJRdWV1ZSkgeworICAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0NUUkwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIldDVFNfU2VuZE1lc3NhZ2U6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHF1ZXVpbmcgdGhlIGJ1ZmZlciIpOworICAgICAgICAgd3BhbE1lbW9yeUZyZWUocE1zZyk7CisgICAgICAgICBXUEFMX0FTU0VSVCgwKTsKKyAgICAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfTk9NRU07CisgICAgICB9CisKKyAgICAgIHBCdWZmZXJRdWV1ZS0+YnVmZmVyU2l6ZSA9IGxlbjsKKyAgICAgIHBCdWZmZXJRdWV1ZS0+cEJ1ZmZlciA9IHBNc2c7CisgICAgICB3cGFsX2xpc3RfaW5zZXJ0X2JhY2soJnBXQ1RTQ2ItPndjdHNQZW5kaW5nUXVldWUsICZwQnVmZmVyUXVldWUtPm5vZGUpOworCisgICAgICAvKiBpZiB3ZSBhcmUgbm90IGFscmVhZHkgaW4gdGhlIGRlZmVycmVkIHN0YXRlLCB0aGVuIHRyYW5zaXRpb24KKyAgICAgICAgIHRvIHRoYXQgc3RhdGUuICB3aGVuIHdlIGRvIHNvLCB3ZSBlbmFibGUgdGhlIHJlbW90ZSByZWFkCisgICAgICAgICBpbnRlcnJ1cHQgc28gdGhhdCB3ZSdsbCBiZSBub3RpZmllZCB3aGVuIG1lc3NhZ2VzIGFyZSByZWFkCisgICAgICAgICBmcm9tIHRoZSByZW1vdGUgZW5kICovCisgICAgICBpZiAoV0NUU19TVEFURV9ERUZFUlJFRCAhPSBwV0NUU0NiLT53Y3RzU3RhdGUpIHsKKworICAgICAgICAgLyogTWFyayB0aGUgc3RhdGUgYXMgZGVmZXJyZWQuCisgICAgICAgICAgICBMYXRlcjogV2UgbWF5IG5lZWQgdG8gcHJvdGVjdCB3Y3RzU3RhdGUgYnkgbG9ja3MqLworICAgICAgICAgcFdDVFNDYi0+d2N0c1N0YXRlID0gV0NUU19TVEFURV9ERUZFUlJFRDsKKworICAgICAgICAgc21kX2VuYWJsZV9yZWFkX2ludHIocFdDVFNDYi0+d2N0c0NoYW5uZWwpOworICAgICAgfQorICAgfQorCisgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworCit9LypXQ1RTX1NlbmRNZXNzYWdlKi8KZGlmZiAtLWdpdCBhL0NPUkUvV0RJL1RSUC9EVFMvaW5jL3dsYW5fcWN0X3dkaV9kdHMuaCBiL0NPUkUvV0RJL1RSUC9EVFMvaW5jL3dsYW5fcWN0X3dkaV9kdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDU5ZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvVFJQL0RUUy9pbmMvd2xhbl9xY3Rfd2RpX2R0cy5oCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX1dMQU5fUUNUX0RUU19ICisjZGVmaW5lIF9fV0xBTl9RQ1RfRFRTX0gKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAKKyAqICAgICAgIFxmaWxlICB3bGFuX3FjdF93ZGlfZHRzLmgKKyAqICAgICAgICAgIAorICogICAgICAgXGJyaWVmIGRlZmluZSBEYXRhcyBUcm5hc3BvcnQgU2VydmljZSBBUEkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFdMQU4gRGV2aWNlIEFic3RyYWN0aW9uIGxheWVyIGludGVyZmFjZSBmb3IgVHJhbnNwb3J0IGRyaXZlcnMgKFNESU8vRFhFKQorICogREVTQ1JJUFRJT04KKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQVBJIGV4cG9zZWQgYnkgdGhlIAorICogd2xhbiBkZXZpY2UgYWJzdGFyY3Rpb24gbGF5ZXIgbW9kdWxlIGZvciBhYnN0cmFjdGluZyBEWEUvU0RJTy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeQorICoKKyAqIEV4YW1wbGUgdXNhZ2UgZm9yIERYRS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9uIFBsYXRmb3JtIGluaXQKKyAqICAgICAgICAgREFMICB3aWxsIHRoZW4gaW52b2tlIFdEVFNfb3BlbgorICoKKyAqIE9uIERBTCBpbml0CisgKiAgICAgREFMIHdpbGwgaW52aWtlIFdEVFNfc3RhcnQKKyAqCisgKiBPbiB0cmFuc21pdDoKKyAqICAgICAgICAgREFMIHdpbGwgaW52b2tlIFdEVFNfVHhQYWNrZXQgQVBJCisgKiAKKyAqIE9uIHRyYW5zbWl0IGNvbXBsZXRlOgorICogICAgICAgICBEWEUgd2lsbCBzZXJpYWxpemUgaW50byBUWCB0aHJlYWQKKyAqICAgICAgICAgSW4gVFggdGhyZWFkIGl0IHdpbGwgaW52b2tlCisgKgorICogT24gcmVjZWl2ZToKKyAqICAgICAgICBEWEUgd2lsbCBzZXJpYWxpemUgaW50byBSWCB0aHJlYWQKKyAqICAgICAgICBJbiBUWCB0aHJlYWQgaXQgd2lsbCBpbnZva2UgV0RUU19SWFBhY2tldCBBUEkgCisgKgorICogT24gRFhFIHJpbmcgZnVsbDoKKyAqICAgICAgICBEWEUgd2lsbCBzZXJpYWxpemUgaW50byBUWCB0aHJlYWQKKyAqICAgICAgICBJbiBUWCB0aHJlYWQgaXQgd2lsbCBpbnZva2UgV0RUU19PT1Jlc291cmNlTm90aWZpY2F0aW9uIEFQSSAKKyAqLworCit0eXBlZGVmIGVudW0KK3sKKyAgIFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJLAorICAgV0RUU19DSEFOTkVMX1RYX0hJR0hfUFJJLAorICAgV0RUU19DSEFOTkVMX1JYX0xPV19QUkksCisgICBXRFRTX0NIQU5ORUxfUlhfSElHSF9QUkksCisgICBXRFRTX0NIQU5ORUxfTUFYCit9ICBXRFRTX0NoYW5uZWxUeXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgIFdEVFNfUE9XRVJfU1RBVEVfRlVMTCwKKyAgIFdEVFNfUE9XRVJfU1RBVEVfSU1QUywKKyAgIFdEVFNfUE9XRVJfU1RBVEVfQk1QUywKKyAgIFdEVFNfUE9XRVJfU1RBVEVfRE9XTiwKKyAgIFdEVFNfUE9XRVJfU1RBVEVfTUFYCit9IFdEVFNfUG93ZXJTdGF0ZVR5cGU7CisKKwordHlwZWRlZiB3cHRfc3RhdHVzICgqV0RUU19UeENvbXBsZXRlQ2JUeXBlKSh2b2lkICpwQ29udGV4dCwgd3B0X3BhY2tldCAqcEZyYW1lLCB3cHRfc3RhdHVzIHN0YXR1cyk7Cit0eXBlZGVmIHdwdF9zdGF0dXMgKCpXRFRTX1J4RnJhbWVSZWFkeUNiVHlwZSkgKHZvaWQgKnBDb250ZXh0LCB3cHRfcGFja2V0ICpwRnJhbWUsIFdEVFNfQ2hhbm5lbFR5cGUgY2hhbm5lbCk7Cit0eXBlZGVmIHdwdF9zdGF0dXMgKCpXRFRTX0xvd1Jlc291cmNlQ2JUeXBlKSh2b2lkICpwQ29udGV4dCwgV0RUU19DaGFubmVsVHlwZSBjaGFubmVsLCB3cHRfYm9vbGVhbiBvbik7Cit0eXBlZGVmIHZvaWQgICgqV0RUU19TZXRQU0NiVHlwZSkod3B0X3N0YXR1cyAgc3RhdHVzLCB1bnNpZ25lZCBpbnQgZHhlUGh5QWRkcik7CisvKiBEVFMgU2V0IHBvd2VyIHN0YXRlIEFDSyBjYWxsYmFjay4gCisgKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBiZSBpbnZva2VkIGJ5IHRoZSBEVFMgdG8gbm90aWZ5IFdESSB0aGF0IHNldAorICogcG93ZXIgc3RhdGUgcmVxdWVzdCBpcyBjb21wbGV0ZS4KKyAqIFBhcmFtZXRlcnM6CisgKiBzdGF0dXM6IHN0YXR1cyBvZiB0aGUgc2V0IG9wZXJhdGlvbgorICogcFVzZXJEYXRhOkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogUmV0dXJuIFZhbHVlOiBOb25lLgorICoKKyAqLwordHlwZWRlZiB2b2lkICAoKldEVFNfU2V0UG93ZXJTdGF0ZUNiVHlwZSkod3B0X3N0YXR1cyAgIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkeGVQaHlBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHBVc2VyRGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAqICgqb3Blbikodm9pZCk7CisgIHdwdF9zdGF0dXMgKCpzdGFydCkgKHZvaWQgKnBDb250ZXh0KTsKKyAgd3B0X3N0YXR1cyAoKnJlZ2lzdGVyX2NsaWVudCkodm9pZCAqcENvbnRleHQsIFdEVFNfUnhGcmFtZVJlYWR5Q2JUeXBlLCAKKyAgICAgIFdEVFNfVHhDb21wbGV0ZUNiVHlwZSwgV0RUU19Mb3dSZXNvdXJjZUNiVHlwZSwgdm9pZCAqY2xpZW50RGF0YSk7CisgIHdwdF9zdGF0dXMgKCp4bWl0KSAodm9pZCAqcENvbnRleHQsIHdwdF9wYWNrZXQgKnBhY2tldCwgV0RUU19DaGFubmVsVHlwZSBjaGFubmVsKTsKKyAgd3B0X3N0YXR1cyAoKnR4Q29tcGxldGUpICh2b2lkICpwQ29udGV4dCwgd3B0X3VpbnQzMiB1Y1R4UmVzUmVxKTsKKyAgd3B0X3N0YXR1cyAoKnNldFBvd2VyU3RhdGUpICh2b2lkICpwQ29udGV4dCwgV0RUU19Qb3dlclN0YXRlVHlwZSAgIHBvd2VyU3RhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEVFNfU2V0UFNDYlR5cGUgY0JhY2spOworICB3cHRfc3RhdHVzICgqc3RvcCkgKHZvaWQgKnBDb250ZXh0KTsKKyAgd3B0X3N0YXR1cyAoKmNsb3NlKSAodm9pZCAqcENvbnRleHQpOworICB3cHRfdWludDMyICgqZ2V0RnJlZVR4RGF0YVJlc051bWJlcikgKHZvaWQgKnBDb250ZXh0KTsKK30gV0RUU19UcmFuc3BvcnREcml2ZXJUcnlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgV0RUU19TZXRQb3dlclN0YXRlQ2JUeXBlIGNiYWNrOworICAgdm9pZCogICAgICAgIHBVc2VyRGF0YTsKK30gV0RUU19TZXRQb3dlclN0YXRlQ2JJbmZvVHlwZTsKKworLyogRFRTIG9wZW4gIGZ1bmN0aW9uLiAKKyAqIE9uIG9wZW4gdGhlIHRyYW5zcG9ydCBkZXZpY2Ugc2hvdWxkIGluaXRpYWxpemUgaXRzZWxmLgorICogUGFyYW1ldGVyczoKKyAqICBwQ29udGV4dDpDb29raWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxlciBhbG9uZyAKKyAqICB3aXRoIHRoZSBjYWxsYmFjay4KKyAqCisgKiBSZXR1cm4gVmFsdWU6IFNVQ0NFU1MgIENvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgKiAgICAgRkFJTFVSRV9YWFggIFJlcXVlc3Qgd2FzIHJlamVjdGVkIGR1ZSBYWFggUmVhc29uLgorIAorICovCit3cHRfc3RhdHVzIFdEVFNfb3BlblRyYW5zcG9ydCggdm9pZCAqcENvbnRleHQpOworCisKKworCisvKiBEVFMgc3RhcnQgIGZ1bmN0aW9uLiAKKyAqIE9uIHN0YXJ0IHRoZSB0cmFuc3BvcnQgZGV2aWNlIHNob3VsZCBzdGFydCBydW5uaW5nLgorICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIAorICogd2l0aCB0aGUgY2FsbGJhY2suCisgKgorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KK3dwdF9zdGF0dXMgV0RUU19zdGFydFRyYW5zcG9ydCggdm9pZCAqcENvbnRleHQpOworCisKKworCisvKiBEVFMgVHggcGFja2V0IGZ1bmN0aW9uLiAKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgYnkgdGhlIERBTCBEYXRhc2VydmljZSB0byBzY2hlZHVsZSB0cmFuc21pdCBmcmFtZSB0aHJvdWdoIERYRS9TRElPLgorICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogcEZyYW1lOlJlZmVybmNlIHRvIFBBTCBmcmFtZS4KKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyAgQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICBGQUlMVVJFX1hYWCAgUmVxdWVzdCB3YXMgcmVqZWN0ZWQgZHVlIFhYWCBSZWFzb24uCisgKgorICovCit3cHRfc3RhdHVzIFdEVFNfVHhQYWNrZXQodm9pZCAqcENvbnRleHQsIHdwdF9wYWNrZXQgKnBGcmFtZSk7CisKKy8qIERUUyBUeCBDb21wbGV0ZSBmdW5jdGlvbi4gCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBpbnZva2VkIGJ5IHRoZSBEQUwgRGF0YXNlcnZpY2UgdG8gbm90aWZ5IHR4IGNvbXBsZXRpb24gdG8gRFhFL1NESU8uCisgKiBQYXJhbWV0ZXJzOgorICogcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2suCisgKiB1Y1R4UmVzUmVxOlRYIHJlc291cmNlIG51bWJlciByZXF1aXJlZCBieSBUTAorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KK3dwdF9zdGF0dXMgV0RUU19Db21wbGV0ZVR4KHZvaWQgKnBDb250ZXh0LCB3cHRfdWludDMyIHVjVHhSZXNSZXEpOworCisvKiBEVFMgU2V0IHBvd2VyIHN0YXRlIGZ1bmN0aW9uLiAKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgYnkgdGhlIERBTCB0byBub3RpZnkgdGhlIFdMQU4gZGV2aWNlIHBvd2VyIHN0YXRlLgorICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogcG93ZXJTdGF0ZTpQb3dlciBzdGF0ZSBvZiB0aGUgV0xBTiBkZXZpY2UuCisgKiBSZXR1cm4gVmFsdWU6IFNVQ0NFU1MgIFNldCBzdWNjZXNzZnVsbHkgaW4gRFhFIGNvbnRyb2wgYmxrLgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KK3dwdF9zdGF0dXMgV0RUU19TZXRQb3dlclN0YXRlKHZvaWQgKnBDb250ZXh0LCBXRFRTX1Bvd2VyU3RhdGVUeXBlIHBvd2VyU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRFRTX1NldFBvd2VyU3RhdGVDYlR5cGUgY2JhY2spOworCisvKiBEVFMgU3RvcCBmdW5jdGlvbi4gCisgKiBTdG9wIFRyYW5zcG9ydCBkcml2ZXIsIGllIERYRSwgU0RJTworICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KK3dwdF9zdGF0dXMgV0RUU19TdG9wKHZvaWQgKnBDb250ZXh0KTsKKworLyogRFRTIENsb3NlIGZ1bmN0aW9uLiAKKyAqIENsb3NlIFRyYW5zcG9ydCBkcml2ZXIsIGllIERYRSwgU0RJTworICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KK3dwdF9zdGF0dXMgV0RUU19DbG9zZSh2b2lkICpwQ29udGV4dCk7CisKKy8qIEdldCBmcmVlIFRYIGRhdGEgZGVzY3JpcHRvciBudW1iZXIgZnJvbSBEWEUKKyAqIFBhcmFtZXRlcnM6CisgKiBwQ29udGV4dDogQ29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2suCisgKiBSZXR1cm4gVmFsdWU6IG51bWJlciBvZiBmcmVlIGRlc2NyaXB0b3JzIGZvciBUWCBkYXRhIGNoYW5uZWwKKyAqCisgKi8KK3dwdF91aW50MzIgV0RUU19HZXRGcmVlVHhEYXRhUmVzTnVtYmVyKHZvaWQgKnBDb250ZXh0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9DT1JFL1dESS9UUlAvRFRTL3NyYy93bGFuX3FjdF93ZGlfZHRzLmMgYi9DT1JFL1dESS9UUlAvRFRTL3NyYy93bGFuX3FjdF93ZGlfZHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhNTZmYgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL1RSUC9EVFMvc3JjL3dsYW5fcWN0X3dkaV9kdHMuYwpAQCAtMCwwICsxLDYxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAKKyAqICAgICAgIFxmaWxlICB3bGFuX3FjdF93ZGlfZHRzLmMKKyAqICAgICAgICAgIAorICogICAgICAgXGJyaWVmICBEYXRhIFRyYW5zcG9ydCBTZXJ2aWNlIEFQSSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogV0xBTiBEZXZpY2UgQWJzdHJhY3Rpb24gbGF5ZXIgRXh0ZXJuYWwgQVBJIGZvciBEYXRhc2VydmljZQorICogREVTQ1JJUFRJT04KKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSSBpbXBsZW1udGF0aW9uIGV4cG9zZWQgYnkgdGhlIAorICogICB3bGFuIGRldmljZSBhYnN0YXJjdGlvbiBsYXllciBtb2R1bGUuCisgKgorICogICBDb3B5cmlnaHQgKGMpIDIwMDggUVVBTENPTU0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5CisgKi8KKworCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfZHhlLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2RzLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2RzX2kuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfZHRzLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2RwLmgiCisjaW5jbHVkZSAid2xhbl9xY3Rfd2RpX3N0YS5oIgorCitzdGF0aWMgV0RUU19UcmFuc3BvcnREcml2ZXJUcnlwZSBnVHJhbnNwb3J0RHJpdmVyID0geworICBXTEFORFhFX09wZW4sIAorICBXTEFORFhFX1N0YXJ0LCAKKyAgV0xBTkRYRV9DbGllbnRSZWdpc3RyYXRpb24sIAorICBXTEFORFhFX1R4RnJhbWUsCisgIFdMQU5EWEVfQ29tcGxldGVUWCwKKyAgV0xBTkRYRV9TZXRQb3dlclN0YXRlLAorICBXTEFORFhFX1N0b3AsCisgIFdMQU5EWEVfQ2xvc2UsCisgIFdMQU5EWEVfR2V0RnJlZVR4RGF0YVJlc051bWJlcgorfTsKKworc3RhdGljIFdEVFNfU2V0UG93ZXJTdGF0ZUNiSW5mb1R5cGUgZ1NldFBvd2VyU3RhdGVDYkluZm87CisKKy8qIERUUyBUeCBwYWNrZXQgY29tcGxldGUgZnVuY3Rpb24uIAorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW52b2tlZCBieSB0aGUgdHJhbnNwb3J0IGRldmljZSB0byBpbmRpY2F0ZSAKKyAqIHRyYW5zbWl0IGNvbXBsZXRlIGZvciBhIGZyYW1lLgorICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIAorICogcEZyYW1lOlJlZmVybmNlIHRvIFBBTCBmcmFtZS4KKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyAgQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICBGQUlMVVJFX1hYWCAgUmVxdWVzdCB3YXMgcmVqZWN0ZWQgZHVlIFhYWCBSZWFzb24uCisgKgorICovCit3cHRfc3RhdHVzIFdEVFNfVHhQYWNrZXRDb21wbGV0ZSh2b2lkICpwQ29udGV4dCwgd3B0X3BhY2tldCAqcEZyYW1lLCB3cHRfc3RhdHVzIHN0YXR1cykKK3sKKyAgV0RJX0RTX0NsaWVudERhdGFUeXBlICpwQ2xpZW50RGF0YSA9IChXRElfRFNfQ2xpZW50RGF0YVR5cGUqKShwQ29udGV4dCk7CisgIFdESV9EU19UeE1ldGFJbmZvVHlwZSAgICAgKnBUeE1ldGFkYXRhOworICB2b2lkICpwdkJESGVhZGVyLCAqcGh5c0JESGVhZGVyOworICB3cHRfdWludDggc3RhSW5kZXg7CisKKyAgLy8gRG8gU2FuaXR5IGNoZWNrcworICBpZihOVUxMID09IHBDb250ZXh0IHx8IE5VTEwgPT0gcEZyYW1lKXsKKyAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKworCisgIC8vIGV4dHJhY3QgbWV0YWRhdGEgZnJvbSBQQUwgcGFja2V0CisgIHBUeE1ldGFkYXRhID0gV0RJX0RTX0V4dHJhY3RUeE1ldGFEYXRhKHBGcmFtZSk7CisgIHBUeE1ldGFkYXRhLT50eENvbXBsZXRlU3RhdHVzID0gc3RhdHVzOworCisgIC8vIEZyZWUgQkQgaGVhZGVyIGZyb20gcG9vbAorICBXRElfR2V0QkRQb2ludGVycyhwRnJhbWUsICZwdkJESGVhZGVyLCAgJnBoeXNCREhlYWRlcik7CisgIHN3aXRjaChwVHhNZXRhZGF0YS0+ZnJtVHlwZSkgCisgIHsKKyAgICBjYXNlIFdESV9NQUNfREFUQV9GUkFNRToKKyAgICAgIC8qIFNXQVAgQkQgaGVhZGVyIHRvIGdldCBTVEEgaW5kZXggZm9yIGNvbXBsZXRlZCBmcmFtZSAqLworICAgICAgV0RJX1N3YXBUeEJkKHB2QkRIZWFkZXIpOworICAgICAgc3RhSW5kZXggPSAod3B0X3VpbnQ4KVdESV9UWF9CRF9HRVRfU1RBX0lEKHB2QkRIZWFkZXIpOworICAgICAgV0RJX0RTX01lbVBvb2xGcmVlKCYocENsaWVudERhdGEtPmRhdGFNZW1Qb29sKSwgcHZCREhlYWRlciwgcGh5c0JESGVhZGVyKTsKKyAgICAgIFdESV9EU19NZW1Qb29sRGVjcmVhc2VSZXNlcnZlQ291bnQoJihwQ2xpZW50RGF0YS0+ZGF0YU1lbVBvb2wpLCBzdGFJbmRleCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdESV9NQUNfTUdNVF9GUkFNRToKKyAgICAgIFdESV9EU19NZW1Qb29sRnJlZSgmKHBDbGllbnREYXRhLT5tZ210TWVtUG9vbCksIHB2QkRIZWFkZXIsIHBoeXNCREhlYWRlcik7CisgICAgICBicmVhazsKKyAgfQorICBXRElfU2V0QkRQb2ludGVycyhwRnJhbWUsIDAsIDApOworCisgIC8vIEludm9rZSBUeCBjb21wbGV0ZSBjYWxsYmFjaworICBwQ2xpZW50RGF0YS0+dHhDb21wbGV0ZUNCKHBDbGllbnREYXRhLT5wQ2FsbGJhY2tDb250ZXh0LCBwRnJhbWUpOyAgCisgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0UmVwbGF5Q291bnRlckZyb21SeEJECisgICAgIAorICBERVNDUklQVElPTiAgIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgNDgtYml0IHJlcGxheSBwYWNrZXQgbnVtYmVyIGZyb20gUlggQkQgCisgCisgIERFUEVOREVOQ0lFUyAgVmFsaWRpdHkgb2YgcmVwbGF5IGNoZWNrIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGZ1bmN0aW9uIAorICAgICAgICAgICAgICAgIGlzIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgUEFSQU1FVEVSUyAgICBwdWNSeEhlYWRlciBwb2ludGVyIHRvIFJYIEJEIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFJFVFJVTiAgICAgICAgdl9VNjRfdCAgICBQYWNrZXQgbnVtYmVyIGV4dGFyY3RlZCBmcm9tIFJYIEJECisKKyAgU0lERSBFRkZFQ1RTICAgbm9uZQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordl9VNjRfdAorV0RUU19HZXRSZXBsYXlDb3VudGVyRnJvbVJ4QkQKKygKKyAgIHZfVThfdCAqcHVjUnhCREhlYWRlcgorKQoreworICB2X1U2NF90IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gMDsKKyAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKy8qIDQ4LWJpdCByZXBsYXkgY291bnRlciBpcyBjcmVhdGVkIGFzIGZvbGxvd3MKKyAgIGZyb20gUlggQkQgNiBieXRlIFBNSSBjb21tYW5kOgorICAgQWRkciA6IEFFUy9US0lQCisgICAweDM4IDogcG4zL3RzYzMKKyAgIDB4MzkgOiBwbjIvdHNjMgorICAgMHgzYSA6IHBuMS90c2MxCisgICAweDNiIDogcG4wL3RzYzAKKworICAgMHgzYyA6IHBuNS90c2M1CisgICAweDNkIDogcG40L3RzYzQgKi8KKyAgCisjaWZkZWYgQU5JX0JJR19CWVRFX0VORElBTgorICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCisgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSBXRElfUlhfQkRfR0VUX1BNSUNNRF8yMFRPMjMocHVjUnhCREhlYWRlcik7IAorICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIDw8PSAxNjsKKyAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciB8PSAoKCBXRElfUlhfQkRfR0VUX1BNSUNNRF8yNFRPMjUocHVjUnhCREhlYWRlcikgJiAweEZGRkYwMDAwKSA+PiAxNik7CisgICAgcmV0dXJuIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOworI2Vsc2UKKyAgICAvKiBHZXR0aW5nIDQ4LWJpdCByZXBsYXkgY291bnRlciBmcm9tIHRoZSBSWCBCRCAqLworICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gKFdESV9SWF9CRF9HRVRfUE1JQ01EXzI0VE8yNShwdWNSeEJESGVhZGVyKSAmIDB4MDAwMEZGRkYpOyAKKyAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA8PD0gMzI7IAorICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIHw9IFdESV9SWF9CRF9HRVRfUE1JQ01EXzIwVE8yMyhwdWNSeEJESGVhZGVyKTsgCisgICAgcmV0dXJuIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOworI2VuZGlmCit9CisKKworLyogRFRTIFJ4IHBhY2tldCBmdW5jdGlvbi4gCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBpbnZva2VkIGJ5IHRoZSB0cmFuc3BvcnQgZGV2aWNlIHRvIGluZGljYXRlIAorICogcmVjZXB0aW9uIG9mIGEgZnJhbWUuCisgKiBQYXJhbWV0ZXJzOgorICogcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgCisgKiBwRnJhbWU6UmVmZXJuY2UgdG8gUEFMIGZyYW1lLgorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KK3dwdF9zdGF0dXMgV0RUU19SeFBhY2tldCAodm9pZCAqcENvbnRleHQsIHdwdF9wYWNrZXQgKnBGcmFtZSwgV0RUU19DaGFubmVsVHlwZSBjaGFubmVsKQoreworICBXRElfRFNfQ2xpZW50RGF0YVR5cGUgKnBDbGllbnREYXRhID0gCisgICAgKFdESV9EU19DbGllbnREYXRhVHlwZSopKHBDb250ZXh0KTsKKyAgd3B0X2Jvb2xlYW4gICAgICAgYkFTRiwgYkZTRiwgYkxTRiwgYkFFRjsKKyAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQsIHVjTVBEVUhMZW4sIHVjVGlkOworICB3cHRfdWludDggICAgICAgICAgICAgICAgICAgKnBCREhlYWRlcjsKKyAgd3B0X3VpbnQxNiAgICAgICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQsIHVzTVBEVUxlbjsKKyAgV0RJX0RTX1J4TWV0YUluZm9UeXBlICAgICAqcFJ4TWV0YWRhdGE7CisgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgIGlzRmNCZCA9IDA7CisKKyAgdHBTaXJNYWNGcmFtZUN0bCAgcE1hY0ZyYW1lQ3RsOworICAvLyBEbyBTYW5pdHkgY2hlY2tzCisgIGlmKE5VTEwgPT0gcENvbnRleHQgfHwgTlVMTCA9PSBwRnJhbWUpeworICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRXh0cmFjdCBCRCBoZWFkZXIgYW5kIGNoZWNrIGlmIHZhbGlkCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcEJESGVhZGVyID0gKHdwdF91aW50OCopd3BhbFBhY2tldEdldFJhd0J1ZihwRnJhbWUpOworICBpZihOVUxMID09IHBCREhlYWRlcikKKyAgeworICAgIERUSV9UUkFDRSggRFRJX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciByZWNlaXZlZCBOVUxMIC0gZHJvcHBpbmcgcGFja2V0Iik7CisgICAgd3BhbFBhY2tldEZyZWUocEZyYW1lKTsKKyAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKyAgV0RJX1N3YXBSeEJkKHBCREhlYWRlcik7CisKKyAgdWNNUERVSE9mZnNldCA9ICh3cHRfdWludDgpV0RJX1JYX0JEX0dFVF9NUERVX0hfT0ZGU0VUKHBCREhlYWRlcik7CisgIHVzTVBEVURPZmZzZXQgPSAod3B0X3VpbnQxNilXRElfUlhfQkRfR0VUX01QRFVfRF9PRkZTRVQocEJESGVhZGVyKTsKKyAgdXNNUERVTGVuICAgICA9ICh3cHRfdWludDE2KVdESV9SWF9CRF9HRVRfTVBEVV9MRU4ocEJESGVhZGVyKTsKKyAgdWNNUERVSExlbiAgICA9ICh3cHRfdWludDgpV0RJX1JYX0JEX0dFVF9NUERVX0hfTEVOKHBCREhlYWRlcik7CisgIHVjVGlkICAgICAgICAgPSAod3B0X3VpbnQ4KVdESV9SWF9CRF9HRVRfVElEKHBCREhlYWRlcik7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBHYXRoZXIgQU1TRFUgaW5mb3JtYXRpb24gCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgYkFTRiA9IFdESV9SWF9CRF9HRVRfQVNGKHBCREhlYWRlcik7CisgIGJBRUYgPSBXRElfUlhfQkRfR0VUX0FFRihwQkRIZWFkZXIpOworICBiRlNGID0gV0RJX1JYX0JEX0dFVF9FU0YocEJESGVhZGVyKTsKKyAgYkxTRiA9IFdESV9SWF9CRF9HRVRfTFNGKHBCREhlYWRlcik7CisgIGlzRmNCZCA9IFdESV9SWF9GQ19CRF9HRVRfRkMocEJESGVhZGVyKTsKKworICBEVElfVFJBQ0UoIERUSV9UUkFDRV9MRVZFTF9JTkZPLAorICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIHByb2Nlc3NpbmcgZGF0YTogSE8gJWQgRE8gJWQgTGVuICVkIEhMZW4gJWQiCisgICAgICAiIFRpZCAlZCBCRCAlZCIsCisgICAgICB1Y01QRFVIT2Zmc2V0LCB1c01QRFVET2Zmc2V0LCB1c01QRFVMZW4sIHVjTVBEVUhMZW4sIHVjVGlkLAorICAgICAgV0RJX1JYX0JEX0hFQURFUl9TSVpFKTsKKworICBpZighaXNGY0JkKQorICB7CisgICAgICBpZih1c01QRFVET2Zmc2V0IDw9IHVjTVBEVUhPZmZzZXQgfHwgdXNNUERVTGVuIDwgdWNNUERVSExlbikgeworICAgICAgICBEVElfVFJBQ0UoIERUSV9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBjb3JydXB0ZWQgLSBkcm9wcGluZyBwYWNrZXQiKTsKKyAgICAgICAgLyogRHJvcCBwYWNrZXQgPz8/PyAqLyAKKyAgICAgICAgd3BhbFBhY2tldEZyZWUocEZyYW1lKTsKKyAgICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgIH0KKworICAgICAgaWYoKHVjTVBEVUhPZmZzZXQgPCBXRElfUlhfQkRfSEVBREVSX1NJWkUpICYmICAoIShiQVNGICYmICFiRlNGKSkpeworICAgICAgICAvKiBBTVNEVSBjYXNlLCB1Y01QRFVIT2Zmc2V0ID0gMCAgaXQgc2hvdWxkIGJlIGhhbmNkbGVkIHNlcGVyYXRseSAqLworICAgICAgICAvKiBEcm9wIHBhY2tldCA/Pz8/ICovIAorICAgICAgICB3cGFsUGFja2V0RnJlZShwRnJhbWUpOworICAgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgfQorCisgICAgICAvKiBBTVNEVSBmcmFtZSwgYnV0IG5vdCBmaXJzdCBzdWItZnJhbWUKKyAgICAgICAqIE5vIE1QRFUgaGVhZGVyLCBNUERVIGhlYWRlciBvZmZzZXQgaXMgMAorICAgICAgICogVG90YWwgZnJhbWUgc2l6ZSBpcyBhY3R1YWwgZnJhbWUgc2l6ZSArIE1QRFUgZGF0YSBvZmZzZXQgKi8KKyAgICAgIGlmKCh1Y01QRFVIT2Zmc2V0IDwgV0RJX1JYX0JEX0hFQURFUl9TSVpFKSAmJiAoYkFTRiAmJiAhYkZTRikpeworICAgICAgICB1Y01QRFVIT2Zmc2V0ID0gdXNNUERVRE9mZnNldDsKKyAgICAgIH0KKworICAgICAgaWYoVlBLVF9TSVpFX0JVRkZFUiA8ICh1c01QRFVMZW4rdWNNUERVSE9mZnNldCkpeworICAgICAgICBEVElfVFJBQ0UoIERUSV9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBGcmFtZSBzaXplLCBtaWdodCBtZW1vcnkgY29ycnVwdGVkIik7CisgICAgICAgIHdwYWxQYWNrZXRGcmVlKHBGcmFtZSk7CisgICAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICAgICB9CisgICAgICB3cGFsUGFja2V0U2V0UnhMZW5ndGgocEZyYW1lLCB1c01QRFVMZW4rdWNNUERVSE9mZnNldCk7CisgICAgICB3cGFsUGFja2V0UmF3VHJpbUhlYWQocEZyYW1lLCB1Y01QRFVIT2Zmc2V0KTsKKworICAgICAKKworICAgICAgcFJ4TWV0YWRhdGEgPSBXRElfRFNfRXh0cmFjdFJ4TWV0YURhdGEocEZyYW1lKTsKKworICAgICAgcFJ4TWV0YWRhdGEtPmZjID0gaXNGY0JkOworICAgICAgcFJ4TWV0YWRhdGEtPnN0YUlkID0gV0RJX1JYX0JEX0dFVF9TVEFfSUQocEJESGVhZGVyKTsKKyAgICAgIHBSeE1ldGFkYXRhLT5hZGRyM0lkeCA9IFdESV9SWF9CRF9HRVRfQUREUjNfSURYKHBCREhlYWRlcik7CisgICAgICBwUnhNZXRhZGF0YS0+cnhDaGFubmVsID0gV0RJX1JYX0JEX0dFVF9SWF9DSEFOTkVMKHBCREhlYWRlcik7CisgICAgICBwUnhNZXRhZGF0YS0+cnRzZiA9IFdESV9SWF9CRF9HRVRfUlRTRihwQkRIZWFkZXIpOworICAgICAgcFJ4TWV0YWRhdGEtPmJzZiA9IFdESV9SWF9CRF9HRVRfQlNGKHBCREhlYWRlcik7CisgICAgICBwUnhNZXRhZGF0YS0+c2NhbiA9IFdESV9SWF9CRF9HRVRfU0NBTihwQkRIZWFkZXIpOworICAgICAgcFJ4TWV0YWRhdGEtPmRwdVNpZyA9IFdESV9SWF9CRF9HRVRfRFBVX1NJRyhwQkRIZWFkZXIpOworICAgICAgcFJ4TWV0YWRhdGEtPmZ0ID0gV0RJX1JYX0JEX0dFVF9GVChwQkRIZWFkZXIpOworICAgICAgcFJ4TWV0YWRhdGEtPm5lID0gV0RJX1JYX0JEX0dFVF9ORShwQkRIZWFkZXIpOworICAgICAgcFJ4TWV0YWRhdGEtPmxsY3IgPSBXRElfUlhfQkRfR0VUX0xMQ1IocEJESGVhZGVyKTsKKyAgICAgIHBSeE1ldGFkYXRhLT5iY2FzdCA9IFdESV9SWF9CRF9HRVRfVUIocEJESGVhZGVyKTsKKyAgICAgIHBSeE1ldGFkYXRhLT50aWQgPSB1Y1RpZDsKKyAgICAgIHBSeE1ldGFkYXRhLT5kcHVGZWVkYmFjayA9IFdESV9SWF9CRF9HRVRfRFBVX0ZFRURCQUNLKHBCREhlYWRlcik7CisgICAgICBwUnhNZXRhZGF0YS0+cmF0ZUluZGV4ID0gV0RJX1JYX0JEX0dFVF9SQVRFSU5ERVgocEJESGVhZGVyKTsKKyAgICAgIHBSeE1ldGFkYXRhLT5yeHBGbGFncyA9IFdESV9SWF9CRF9HRVRfUlhQRkxBR1MocEJESGVhZGVyKTsKKyAgICAgIHBSeE1ldGFkYXRhLT5tY2xrUnhUaW1lc3RhbXAgPSBXRElfUlhfQkRfR0VUX1RJTUVTVEFNUChwQkRIZWFkZXIpOworCisgICAgICAvKiB0eXBlU3VidHlwZSBpbiBCRCBkb2Vzbid0IGxvb2sgbGlrZSBjb3JyZWN0LiBGaWxsIGZyb20gZnJhbWUgY3RybAorICAgICAgICAgVEwgZG9lcyBpdCBmb3IgVm9sYW5zIGJ1dCBUTCBkb2VzIG5vdCBrbm93IEJEIGZvciBQcmltYS4gV0RJIHNob3VsZCBkbyBpdCAqLworICAgICAgaWYgKCAwID09IFdESV9SWF9CRF9HRVRfRlQocEJESGVhZGVyKSApIHsKKyAgICAgICAgaWYgKCBiQVNGICkgeworICAgICAgICAgIHBSeE1ldGFkYXRhLT5zdWJ0eXBlID0gV0RJX01BQ19EQVRBX1FPU19EQVRBOworICAgICAgICAgIHBSeE1ldGFkYXRhLT50eXBlICAgID0gV0RJX01BQ19EQVRBX0ZSQU1FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBNYWNGcmFtZUN0bCA9ICh0cFNpck1hY0ZyYW1lQ3RsKSgoKHdwdF91aW50OCopcEJESGVhZGVyKSArIHVjTVBEVUhPZmZzZXQpOworICAgICAgICAgIHBSeE1ldGFkYXRhLT5zdWJ0eXBlID0gcE1hY0ZyYW1lQ3RsLT5zdWJUeXBlOworICAgICAgICAgIHBSeE1ldGFkYXRhLT50eXBlICAgID0gcE1hY0ZyYW1lQ3RsLT50eXBlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwTWFjRnJhbWVDdGwgPSAodHBTaXJNYWNGcmFtZUN0bCkoKCh3cHRfdWludDgqKXBCREhlYWRlcikgKyBXRElfUlhfQkRfSEVBREVSX1NJWkUpOworICAgICAgICBwUnhNZXRhZGF0YS0+c3VidHlwZSA9IHBNYWNGcmFtZUN0bC0+c3ViVHlwZTsKKyAgICAgICAgcFJ4TWV0YWRhdGEtPnR5cGUgICAgPSBwTWFjRnJhbWVDdGwtPnR5cGU7CisgICAgICB9CisKKyAgICAgIHBSeE1ldGFkYXRhLT5tcGR1SGVhZGVyUHRyID0gcEJESGVhZGVyICsgdWNNUERVSE9mZnNldDsKKyAgICAgIHBSeE1ldGFkYXRhLT5tcGR1RGF0YVB0ciA9IHBCREhlYWRlciArIHVzTVBEVURPZmZzZXQ7CisgICAgICBwUnhNZXRhZGF0YS0+bXBkdUxlbmd0aCA9IHVzTVBEVUxlbjsKKyAgICAgIHBSeE1ldGFkYXRhLT5tcGR1SGVhZGVyTGVuZ3RoID0gdWNNUERVSExlbjsKKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgR2F0aGVyIEFNUERVIGluZm9ybWF0aW9uIAorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgcFJ4TWV0YWRhdGEtPmFtcGR1X3Jlb3JkZXJPcGNvZGUgID0gKHdwdF91aW50OClXRElfUlhfQkRfR0VUX0JBX09QQ09ERShwQkRIZWFkZXIpOworICAgICAgcFJ4TWV0YWRhdGEtPmFtcGR1X3Jlb3JkZXJTbG90SWR4ID0gKHdwdF91aW50OClXRElfUlhfQkRfR0VUX0JBX1NJKHBCREhlYWRlcik7CisgICAgICBwUnhNZXRhZGF0YS0+YW1wZHVfcmVvcmRlckZ3ZElkeCAgPSAod3B0X3VpbnQ4KVdESV9SWF9CRF9HRVRfQkFfRkkocEJESGVhZGVyKTsKKyAgICAgIHBSeE1ldGFkYXRhLT5jdXJyZW50UGt0U2VxTm8gICAgICAgPSAod3B0X3VpbnQ4KVdESV9SWF9CRF9HRVRfQkFfQ1NOKHBCREhlYWRlcik7CisKKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgR2F0aGVyIEFNU0RVIGluZm9ybWF0aW9uIAorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgcFJ4TWV0YWRhdGEtPmFtc2R1X2FzZiAgPSAgYkFTRjsKKyAgICAgIHBSeE1ldGFkYXRhLT5hbXNkdV9hZWYgID0gIGJBRUY7CisgICAgICBwUnhNZXRhZGF0YS0+YW1zZHVfZXNmICA9ICBiRlNGOworICAgICAgcFJ4TWV0YWRhdGEtPmFtc2R1X2xzZiAgPSAgYkxTRjsKKyAgICAgIHBSeE1ldGFkYXRhLT5hbXNkdV9zaXplID0gIFdESV9SWF9CRF9HRVRfQU1TRFVfU0laRShwQkRIZWFkZXIpOworCisgICAgICBwUnhNZXRhZGF0YS0+cnNzaTAgPSBXRElfUlhfQkRfR0VUX1JTU0kwKHBCREhlYWRlcik7CisgICAgICBwUnhNZXRhZGF0YS0+cnNzaTEgPSBXRElfUlhfQkRfR0VUX1JTU0kxKHBCREhlYWRlcik7CisKKworICAgICAgICAvKiBNaXNzaW5nOiAKKyAgICAgIHdwdF91aW50MzIgZmNTVEFUeFFTdGF0dXM6ODsKKyAgICAgIHdwdF91aW50MzIgZmNTVEFUaHJlc2hJbmRNYXNrOjg7CisgICAgICB3cHRfdWludDMyIGZjU1RBUHdyU2F2ZVN0YXRlTWFzazo4OworICAgICAgd3B0X3VpbnQzMiBmY1NUQVZhbGlkTWFzazo4OworCisgICAgICB3cHRfdWludDggZmNTVEFUeFFMZW5bOF07IC8vIG9uZSBieXRlIHBlciBTVEEuIAorICAgICAgd3B0X3VpbnQ4IGZjU1RBQ3VyVHhSYXRlWzhdOyAvLyBjdXJyZW50IFR4IHJhdGUgZm9yIGVhY2ggc3RhLiAgIAorICAgICAgdW5rbm93blVjYXN0UGt0IAorICAgICAgKi8KKworICAgICAgcFJ4TWV0YWRhdGEtPnJlcGxheUNvdW50ID0gV0RUU19HZXRSZXBsYXlDb3VudGVyRnJvbVJ4QkQocEJESGVhZGVyKTsKKyAgICAgIHBSeE1ldGFkYXRhLT5zbnIgPSBXRElfUlhfQkRfR0VUX1NOUihwQkRIZWFkZXIpOyAKKworICAgICAgLyogCisgICAgICAgKiBQQUwgQkQgcG9pbnRlciBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBwb3B1bGF0ZWQgCisgICAgICAgKi8gCisgICAgICBXUEFMX1BBQ0tFVF9TRVRfQkRfUE9JTlRFUihwRnJhbWUsIHBCREhlYWRlcik7CisgICAgICBXUEFMX1BBQ0tFVF9TRVRfQkRfTEVOR1RIKHBGcmFtZSwgc2l6ZW9mKFdESV9SeEJkVHlwZSkpOworCisgICAgICAvLyBJbnZva2UgUnggY29tcGxldGUgY2FsbGJhY2sKKyAgICAgIHBDbGllbnREYXRhLT5yZWNlaXZlRnJhbWVDQihwQ2xpZW50RGF0YS0+cENhbGxiYWNrQ29udGV4dCwgcEZyYW1lKTsgIAorICB9CisgIGVsc2UKKyAgeworICAgICAgd3BhbFBhY2tldFNldFJ4TGVuZ3RoKHBGcmFtZSwgdXNNUERVTGVuK3VjTVBEVUhPZmZzZXQpOworICAgICAgd3BhbFBhY2tldFJhd1RyaW1IZWFkKHBGcmFtZSwgdWNNUERVSE9mZnNldCk7CisKKyAgICAgIHBSeE1ldGFkYXRhID0gV0RJX0RTX0V4dHJhY3RSeE1ldGFEYXRhKHBGcmFtZSk7CisgICAgICAvL2Zsb3cgY29udHJvbCByZWxhdGVkCisgICAgICBwUnhNZXRhZGF0YS0+ZmMgPSBpc0ZjQmQ7CisgICAgICBwUnhNZXRhZGF0YS0+ZmNTdGFUeERpc2FibGVkQml0bWFwID0gV0RJX1JYX0ZDX0JEX0dFVF9TVEFfVFhfRElTQUJMRURfQklUTUFQKHBCREhlYWRlcik7CisgICAgICBwUnhNZXRhZGF0YS0+ZmNTVEFWYWxpZE1hc2sgPSBXRElfUlhfRkNfQkRfR0VUX1NUQV9WQUxJRF9NQVNLKHBCREhlYWRlcik7CisgICAgICAvLyBJbnZva2UgUnggY29tcGxldGUgY2FsbGJhY2sKKyAgICAgIHBDbGllbnREYXRhLT5yZWNlaXZlRnJhbWVDQihwQ2xpZW50RGF0YS0+cENhbGxiYWNrQ29udGV4dCwgcEZyYW1lKTsgIAorICB9CisgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworCisKKy8qIERUUyBPdXQgb2YgUmVzb3VyY2UgcGFja2V0IGZ1bmN0aW9uLiAKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgYnkgdGhlIHRyYW5zcG9ydCBkZXZpY2UgdG8gaW5kaWNhdGUgCisgKiB0aGUgZGV2aWNlIGlzIG91dCBvZiByZXNvdXJjZXMuCisgKiBQYXJhbWV0ZXJzOgorICogcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgCisgKiBwcmlvcml0eTogaW5kaWNhdGVzIHdoaWNoIGNoYW5uZWwgaXMgb3V0IG9mIHJlc291cmNlLgorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqLword3B0X3N0YXR1cyBXRFRTX09PUmVzb3VyY2VOb3RpZmljYXRpb24odm9pZCAqcENvbnRleHQsIFdEVFNfQ2hhbm5lbFR5cGUgY2hhbm5lbCwgd3B0X2Jvb2xlYW4gb24pCit7CisgIFdESV9EU19DbGllbnREYXRhVHlwZSAqcENsaWVudERhdGEgPQorICAgIChXRElfRFNfQ2xpZW50RGF0YVR5cGUgKikgcENvbnRleHQ7CisgIHN0YXRpYyB3cHRfdWludDggYWNfbWFzayA9IDB4MWY7CisKKyAgLy8gRG8gU2FuaXR5IGNoZWNrcworICBpZihOVUxMID09IHBDb250ZXh0KXsKKyAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKyAgCisgIGlmKG9uKXsKKyAgICBhY19tYXNrIHw9ICBjaGFubmVsID09IFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJPyAgMHgwZiA6IDB4MTA7CisgIH0gZWxzZSB7CisgICAgYWNfbWFzayAmPSAgY2hhbm5lbCA9PSBXRFRTX0NIQU5ORUxfVFhfTE9XX1BSST8gIDB4MTAgOiAweDBmOworICB9CisKKworICAvLyBJbnZva2UgT09SIGNhbGxiYWNrCisgIHBDbGllbnREYXRhLT50eFJlc291cmNlQ0IocENsaWVudERhdGEtPnBDYWxsYmFja0NvbnRleHQsIGFjX21hc2spOyAKKyAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKworfQorCisvKiBEVFMgb3BlbiAgZnVuY3Rpb24uIAorICogT24gb3BlbiB0aGUgdHJhbnNwb3J0IGRldmljZSBzaG91bGQgaW5pdGlhbGl6ZSBpdHNlbGYuCisgKiBQYXJhbWV0ZXJzOgorICogIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIAorICogIHdpdGggdGhlIGNhbGxiYWNrLgorICoKKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyAgQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICBGQUlMVVJFX1hYWCAgUmVxdWVzdCB3YXMgcmVqZWN0ZWQgZHVlIFhYWCBSZWFzb24uCisgKgorICovCit3cHRfc3RhdHVzIFdEVFNfb3BlblRyYW5zcG9ydCggdm9pZCAqcENvbnRleHQpCit7CisgIHZvaWQgKnBEVERyaXZlckNvbnRleHQ7IAorICBXRElfRFNfQ2xpZW50RGF0YVR5cGUgKnBDbGllbnREYXRhOworICBXRElfU3RhdHVzIHNXZGlTdGF0dXMgPSBXRElfU1RBVFVTX1NVQ0NFU1M7CisKKyAgcENsaWVudERhdGEgPSAoV0RJX0RTX0NsaWVudERhdGFUeXBlKikgd3BhbE1lbW9yeUFsbG9jYXRlKHNpemVvZihXRElfRFNfQ2xpZW50RGF0YVR5cGUpKTsKKyAgaWYgKCFwQ2xpZW50RGF0YSl7CisgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9OT01FTTsKKyAgfQorCisgIHBDbGllbnREYXRhLT5zdXNwZW5kID0gMDsKKyAgV0RJX0RTX0Fzc2lnbkRhdGFwYXRoQ29udGV4dChwQ29udGV4dCwgKHZvaWQqKXBDbGllbnREYXRhKTsKKworICBwRFREcml2ZXJDb250ZXh0ID0gZ1RyYW5zcG9ydERyaXZlci5vcGVuKCk7IAorICBpZiggTlVMTCA9PSBwRFREcml2ZXJDb250ZXh0ICkKKyAgeworICAgICBEVElfVFJBQ0UoIERUSV9UUkFDRV9MRVZFTF9FUlJPUiwgIiAlcyBmYWlsIGZyb20gdHJhbnNwb3J0IG9wZW4iLCBfX0ZVTkNUSU9OX18pOworICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisgIH0KKyAgV0RUX0Fzc2lnblRyYW5zcG9ydERyaXZlckNvbnRleHQocENvbnRleHQsIHBEVERyaXZlckNvbnRleHQpOworICBnVHJhbnNwb3J0RHJpdmVyLnJlZ2lzdGVyX2NsaWVudChwRFREcml2ZXJDb250ZXh0LCBXRFRTX1J4UGFja2V0LCBXRFRTX1R4UGFja2V0Q29tcGxldGUsIAorICAgIFdEVFNfT09SZXNvdXJjZU5vdGlmaWNhdGlvbiwgKHZvaWQqKXBDbGllbnREYXRhKTsKKworICAvKiBDcmVhdGUgYSBtZW1vcnkgcG9vbCBmb3IgTWdtdCBCRGhlYWRlcnMuKi8KKyAgc1dkaVN0YXR1cyA9IFdESV9EU19NZW1Qb29sQ3JlYXRlKCZwQ2xpZW50RGF0YS0+bWdtdE1lbVBvb2wsIFdESV9EU19NQVhfQ0hVTktfU0laRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9EU19ISV9QUklfUkVTX05VTSk7CisgIGlmIChXRElfU1RBVFVTX1NVQ0NFU1MgIT0gc1dkaVN0YXR1cyl7CisgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9OT01FTTsKKyAgfQorCisgIC8qIENyZWF0ZSBhIG1lbW9yeSBwb29sIGZvciBEYXRhIEJEaGVhZGVycy4qLworICBzV2RpU3RhdHVzID0gV0RJX0RTX01lbVBvb2xDcmVhdGUoJnBDbGllbnREYXRhLT5kYXRhTWVtUG9vbCwgV0RJX0RTX01BWF9DSFVOS19TSVpFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdESV9EU19MT19QUklfUkVTX05VTSk7CisgIGlmIChXRElfU1RBVFVTX1NVQ0NFU1MgIT0gc1dkaVN0YXR1cyl7CisgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9OT01FTTsKKyAgfQorCisgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworCisKKy8qIERUUyBzdGFydCAgZnVuY3Rpb24uIAorICogT24gc3RhcnQgdGhlIHRyYW5zcG9ydCBkZXZpY2Ugc2hvdWxkIHN0YXJ0IHJ1bm5pbmcuCisgKiBQYXJhbWV0ZXJzOgorICogcENvbnRleHQ6Q29va2llIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYWxvbmcgCisgKiB3aXRoIHRoZSBjYWxsYmFjay4KKyAqCisgKiBSZXR1cm4gVmFsdWU6IFNVQ0NFU1MgIENvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgKiAgICAgRkFJTFVSRV9YWFggIFJlcXVlc3Qgd2FzIHJlamVjdGVkIGR1ZSBYWFggUmVhc29uLgorICoKKyAqLword3B0X3N0YXR1cyBXRFRTX3N0YXJ0VHJhbnNwb3J0KCB2b2lkICpwQ29udGV4dCkKK3sKKyAgdm9pZCAqcERURHJpdmVyQ29udGV4dCA9IFdEVF9HZXRUcmFuc3BvcnREcml2ZXJDb250ZXh0KHBDb250ZXh0KTsKKyAgZ1RyYW5zcG9ydERyaXZlci5zdGFydChwRFREcml2ZXJDb250ZXh0KTsgCisgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKK30KKworCisvKiBEVFMgVHggcGFja2V0IGZ1bmN0aW9uLiAKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgYnkgdGhlIERBTCBEYXRhc2VydmljZSB0byBzY2hlZHVsZSB0cmFuc21pdCBmcmFtZSB0aHJvdWdoIERYRS9TRElPLgorICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogcEZyYW1lOlJlZmVybmNlIHRvIFBBTCBmcmFtZS4KKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyAgQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICBGQUlMVVJFX1hYWCAgUmVxdWVzdCB3YXMgcmVqZWN0ZWQgZHVlIFhYWCBSZWFzb24uCisgKgorICovCit3cHRfc3RhdHVzIFdEVFNfVHhQYWNrZXQodm9pZCAqcENvbnRleHQsIHdwdF9wYWNrZXQgKnBGcmFtZSkKK3sKKyAgdm9pZCAqcERURHJpdmVyQ29udGV4dCA9IFdEVF9HZXRUcmFuc3BvcnREcml2ZXJDb250ZXh0KHBDb250ZXh0KTsKKyAgV0RJX0RTX1R4TWV0YUluZm9UeXBlICAgICAqcFR4TWV0YWRhdGE7CisgIFdEVFNfQ2hhbm5lbFR5cGUgY2hhbm5lbCA9IFdEVFNfQ0hBTk5FTF9UWF9MT1dfUFJJOworICB3cHRfc3RhdHVzIHN0YXR1cyA9IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAvLyBleHRyYWN0IG1ldGFkYXRhIGZyb20gUEFMIHBhY2tldAorICBwVHhNZXRhZGF0YSA9IFdESV9EU19FeHRyYWN0VHhNZXRhRGF0YShwRnJhbWUpOworCisgIC8vIGFzc2lnbiBNRFBVIHRvIGNvcnJlY3QgY2hhbm5lbD8/CisgIGNoYW5uZWwgPSAgKHBUeE1ldGFkYXRhLT5mcm1UeXBlICYgV0RJX01BQ19EQVRBX0ZSQU1FKT8gCisgICAgICBXRFRTX0NIQU5ORUxfVFhfTE9XX1BSSSA6IFdEVFNfQ0hBTk5FTF9UWF9ISUdIX1BSSTsKKyAgCisgIC8vIFNlbmQgcGFja2V0IHRvICBUcmFuc3BvcnQgRHJpdmVyLiAKKyAgc3RhdHVzID0gIGdUcmFuc3BvcnREcml2ZXIueG1pdChwRFREcml2ZXJDb250ZXh0LCBwRnJhbWUsIGNoYW5uZWwpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKiBEVFMgVHggQ29tcGxldGUgZnVuY3Rpb24uIAorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW52b2tlZCBieSB0aGUgREFMIERhdGFzZXJ2aWNlIHRvIG5vdGlmeSB0eCBjb21wbGV0aW9uIHRvIERYRS9TRElPLgorICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogdWNUeFJlc1JlcTpUWCByZXNvdXJjZSBudW1iZXIgcmVxdWlyZWQgYnkgVEwKKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyAgQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICBGQUlMVVJFX1hYWCAgUmVxdWVzdCB3YXMgcmVqZWN0ZWQgZHVlIFhYWCBSZWFzb24uCisgKgorICovCit3cHRfc3RhdHVzIFdEVFNfQ29tcGxldGVUeCh2b2lkICpwQ29udGV4dCwgd3B0X3VpbnQzMiB1Y1R4UmVzUmVxKQoreworICB2b2lkICpwRFREcml2ZXJDb250ZXh0ID0gV0RUX0dldFRyYW5zcG9ydERyaXZlckNvbnRleHQocENvbnRleHQpOworICAKKyAgLy8gTm90aWZ5IGNvbXBsZXRpb24gdG8gIFRyYW5zcG9ydCBEcml2ZXIuIAorICByZXR1cm4gZ1RyYW5zcG9ydERyaXZlci50eENvbXBsZXRlKHBEVERyaXZlckNvbnRleHQsIHVjVHhSZXNSZXEpOworfQorCisvKiBEWEUgU2V0IHBvd2VyIHN0YXRlIEFDSyBjYWxsYmFjay4gCisgKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBiZSBpbnZva2VkIGJ5IHRoZSBEWEUgdG8gbm90aWZ5IFdESSB0aGF0IHNldAorICogcG93ZXIgc3RhdGUgcmVxdWVzdCBpcyBjb21wbGV0ZS4KKyAqIFBhcmFtZXRlcnM6CisgKiBzdGF0dXM6IHN0YXR1cyBvZiB0aGUgc2V0IG9wZXJhdGlvbgorICogUmV0dXJuIFZhbHVlOiBOb25lLgorICoKKyAqLwordm9pZCAgV0RUU19TZXRQb3dlclN0YXRlQ2Iod3B0X3N0YXR1cyAgIHN0YXR1cywgdW5zaWduZWQgaW50IGR4ZVBoeUFkZHIpCit7CisgICAvL3ByaW50IGEgbXNnCisgICBpZihOVUxMICE9IGdTZXRQb3dlclN0YXRlQ2JJbmZvLmNiYWNrKSAKKyAgIHsKKyAgICAgIGdTZXRQb3dlclN0YXRlQ2JJbmZvLmNiYWNrKHN0YXR1cywgZHhlUGh5QWRkciwgZ1NldFBvd2VyU3RhdGVDYkluZm8ucFVzZXJEYXRhKTsKKyAgIH0KK30KKworCisvKiBEVFMgU2V0IHBvd2VyIHN0YXRlIGZ1bmN0aW9uLiAKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgYnkgdGhlIERBTCB0byBub3RpZnkgdGhlIFdMQU4gZGV2aWNlIHBvd2VyIHN0YXRlLgorICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogcG93ZXJTdGF0ZTpQb3dlciBzdGF0ZSBvZiB0aGUgV0xBTiBkZXZpY2UuCisgKiBSZXR1cm4gVmFsdWU6IFNVQ0NFU1MgIFNldCBzdWNjZXNzZnVsbHkgaW4gRFhFIGNvbnRyb2wgYmxrLgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KK3dwdF9zdGF0dXMgV0RUU19TZXRQb3dlclN0YXRlKHZvaWQgKnBDb250ZXh0LCBXRFRTX1Bvd2VyU3RhdGVUeXBlICBwb3dlclN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RUU19TZXRQb3dlclN0YXRlQ2JUeXBlIGNiYWNrKQoreworICAgdm9pZCAqcERURHJpdmVyQ29udGV4dCA9IFdEVF9HZXRUcmFuc3BvcnREcml2ZXJDb250ZXh0KHBDb250ZXh0KTsKKyAgIHdwdF9zdGF0dXMgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworCisgICBpZiggY2JhY2sgKQorICAgeworICAgICAgLy9zYXZlIHRoZSBjYmFjayAmIGNvb2tpZQorICAgICAgZ1NldFBvd2VyU3RhdGVDYkluZm8ucFVzZXJEYXRhID0gcENvbnRleHQ7CisgICAgICBnU2V0UG93ZXJTdGF0ZUNiSW5mby5jYmFjayA9IGNiYWNrOworICAgICAgc3RhdHVzID0gZ1RyYW5zcG9ydERyaXZlci5zZXRQb3dlclN0YXRlKHBEVERyaXZlckNvbnRleHQsIHBvd2VyU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEVFNfU2V0UG93ZXJTdGF0ZUNiKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN0YXR1cyA9IGdUcmFuc3BvcnREcml2ZXIuc2V0UG93ZXJTdGF0ZShwRFREcml2ZXJDb250ZXh0LCBwb3dlclN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogRFRTIFN0b3AgZnVuY3Rpb24uIAorICogU3RvcCBUcmFuc3BvcnQgZHJpdmVyLCBpZSBEWEUsIFNESU8KKyAqIFBhcmFtZXRlcnM6CisgKiBwQ29udGV4dDpDb29raWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxlciBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjay4KKyAqIFJldHVybiBWYWx1ZTogU1VDQ0VTUyAgQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICBGQUlMVVJFX1hYWCAgUmVxdWVzdCB3YXMgcmVqZWN0ZWQgZHVlIFhYWCBSZWFzb24uCisgKgorICovCit3cHRfc3RhdHVzIFdEVFNfU3RvcCh2b2lkICpwQ29udGV4dCkKK3sKKyAgdm9pZCAqcERURHJpdmVyQ29udGV4dCA9IFdEVF9HZXRUcmFuc3BvcnREcml2ZXJDb250ZXh0KHBDb250ZXh0KTsKKyAgd3B0X3N0YXR1cyBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgc3RhdHVzID0gIGdUcmFuc3BvcnREcml2ZXIuc3RvcChwRFREcml2ZXJDb250ZXh0KTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKiBEVFMgU3RvcCBmdW5jdGlvbi4gCisgKiBTdG9wIFRyYW5zcG9ydCBkcml2ZXIsIGllIERYRSwgU0RJTworICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OkNvb2tpZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIGFsb25nIHdpdGggdGhlIGNhbGxiYWNrLgorICogUmV0dXJuIFZhbHVlOiBTVUNDRVNTICBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICogICAgIEZBSUxVUkVfWFhYICBSZXF1ZXN0IHdhcyByZWplY3RlZCBkdWUgWFhYIFJlYXNvbi4KKyAqCisgKi8KK3dwdF9zdGF0dXMgV0RUU19DbG9zZSh2b2lkICpwQ29udGV4dCkKK3sKKyAgdm9pZCAqcERURHJpdmVyQ29udGV4dCA9IFdEVF9HZXRUcmFuc3BvcnREcml2ZXJDb250ZXh0KHBDb250ZXh0KTsKKyAgV0RJX0RTX0NsaWVudERhdGFUeXBlICpwQ2xpZW50RGF0YSA9IFdESV9EU19HZXREYXRhcGF0aENvbnRleHQocENvbnRleHQpOworICB3cHRfc3RhdHVzIHN0YXR1cyA9IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKworICAvKkRlc3Ryb3kgdGhlIG1lbSBwb29sIGZvciBtZ210IEJEIGhlYWRlcnMqLworICBXRElfRFNfTWVtUG9vbERlc3Ryb3koJnBDbGllbnREYXRhLT5tZ210TWVtUG9vbCk7CisgIAorICAvKkRlc3Ryb3kgdGhlIG1lbSBwb29sIGZvciBtZ210IEJEIGhlYWRlcnMqLworICBXRElfRFNfTWVtUG9vbERlc3Ryb3koJnBDbGllbnREYXRhLT5kYXRhTWVtUG9vbCk7CisgIAorICBzdGF0dXMgPSAgZ1RyYW5zcG9ydERyaXZlci5jbG9zZShwRFREcml2ZXJDb250ZXh0KTsKKworICB3cGFsTWVtb3J5RnJlZShwQ2xpZW50RGF0YSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyogR2V0IGZyZWUgVFggZGF0YSBkZXNjcmlwdG9yIG51bWJlciBmcm9tIERYRQorICogUGFyYW1ldGVyczoKKyAqIHBDb250ZXh0OiBDb29raWUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxlciBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjay4KKyAqIFJldHVybiBWYWx1ZTogbnVtYmVyIG9mIGZyZWUgZGVzY3JpcHRvcnMgZm9yIFRYIGRhdGEgY2hhbm5lbAorICoKKyAqLword3B0X3VpbnQzMiBXRFRTX0dldEZyZWVUeERhdGFSZXNOdW1iZXIodm9pZCAqcENvbnRleHQpCit7CisgIHJldHVybiAKKyAgICAgZ1RyYW5zcG9ydERyaXZlci5nZXRGcmVlVHhEYXRhUmVzTnVtYmVyKFdEVF9HZXRUcmFuc3BvcnREcml2ZXJDb250ZXh0KHBDb250ZXh0KSk7Cit9CmRpZmYgLS1naXQgYS9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9vc19saXN0LmggYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9vc19saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxNjFlZgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X29zX2xpc3QuaApAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19XTEFOX1FDVF9PU19MSVNUX0ggKQorI2RlZmluZSBfX1dMQU5fUUNUX09TX0xJU1RfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgd2xhbl9xY3RfcGFsX2xpc3QuaAorICAKKyAgXGJyaWVmIGRlZmluZSBsaW5rZWQgbGlzdCBQQUwgZXhwb3J0cy4gd3B0ID0gKFdsYW4gUGFsIFR5cGUpIHdwYWwgPSAoV2xhbiBQQUwpCisgICAgICAgICAgICAgICAKKyAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBkZXBlbmRlbnQuIEl0IGlzIHdpdGggVk9TUyBzdXBwb3J0LgorICAKKyAgIENvcHlyaWdodCAyMDEwIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zdGF0dXMuaCIKKy8vSW5jbHVkZSB2b3NfbGlzdC5oIGhlcmUuIEZvciBub24tVk9TUyBQQUwsIGl0IG5lZWRzIHRvIHByb3ZpZGUgaXRzIG93biBkZWZpbml0aW9uLgorI2luY2x1ZGUgInZvc19saXN0LmgiCisKK3R5cGVkZWYgdm9zX2xpc3RfdCB3cHRfbGlzdDsKK3R5cGVkZWYgdm9zX2xpc3Rfbm9kZV90IHdwdF9saXN0X25vZGU7CisKKyNkZWZpbmUgV1BBTF9MSVNUX1NUQVRVU19CQVNJQ19DSEVDSyhzdGF0dXMpICggVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgPyBcCisgICAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgOiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRSApCisKKyNkZWZpbmUgV1BBTF9MSVNUX0lTX1ZPU19TVEFUVVNfQlVTWShzdGF0dXMpIChWT1NfU1RBVFVTX0VfQlVTWSA9PSAoc3RhdHVzKSkKKyNkZWZpbmUgV1BBTF9MSVNUX1NUQVRVU19CVVNZX0NIRUNLKHN0YXR1cykgKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSA/IFwKKyAgICAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyA6IChXUEFMX0xJU1RfSVNfVk9TX1NUQVRVU19CVVNZKHN0YXR1cykgPyBcCisgICAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfQlVTWSA6IGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFKSApCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHdwYWxfbGlzdF9pbml0KCkgLSBpbml0aWFsaXplIGEgd3B0X2xpc3QgTGlua2VkIExpc3QgIAorICAgIAorICBUaGUgXGEgd3BhbF9saXN0X2luaXQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGxpbmtlZCBsaXN0CisgICdvYmplY3QnLiAgVXBvbiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLCB0aGUgc3RhdGUgb2YgdGhlIGxpc3QgCisgIGJlY29tZXMgaW5pdGlhbGl6ZWQgYW5kIGF2YWlsYWJsZSBmb3IgdXNlIHRocm91Z2ggdGhlIG90aGVyIHdwdF9saXN0X3h4eAorICBBUElzLgorCisgIEEgbGlzdCBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgd3BhbF9saXN0X2luaXQoKSBiZWZvcmUgaXQgCisgIG1heSBiZSB1c2VkIGluIGFueSBvdGhlciBsb2NrIGZ1bmN0aW9ucy4gCisgIAorICBBdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgYW4gYWxyZWFkeSBpbml0aWFsaXplZCBsaXN0IHJlc3VsdHMgaW4gCisgIGEgZmFpbHVyZS4KKyAKKyAgXHBhcmFtIHBMaXN0IC0gcG9pbnRlciB0byB0aGUgb3BhcXVlIGxpc3Qgb2JqZWN0IHRvIGluaXRpYWxpemUKKyAgCisgIFxyZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gbGlzdCB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZCAKKyAgICAgICAgICBpcyByZWFkeSB0byBiZSB1c2VkLgorICAKKyAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfUkVTT1VSQ0VTIC0gU3lzdGVtIHJlc291cmNlcyAob3RoZXIgdGhhbiBtZW1vcnkpIAorICAgICAgICAgIGFyZSB1bmF2YWlsYWJsZSB0byBpbml0aWxpemUgdGhlIGxpc3QKKworICAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9OT01FTSAtIGluc3VmZmljaWVudCBtZW1vcnkgZXhpc3RzIHRvIGluaXRpYWxpemUgCisgICAgICAgICAgdGhlIGxpc3QKKworICAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9CVVNZIC0gVGhlIGltcGxlbWVudGF0aW9uIGhhcyBkZXRlY3RlZCBhbiBhdHRlbXB0IAorICAgICAgICAgIHRvIHJlaW5pdGlhbGl6ZSB0aGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgbGlzdCwgYSBwcmV2aW91c2x5IAorICAgICAgICAgIGluaXRpYWxpemVkLCBidXQgbm90IHlldCBkZXN0cm95ZWQsIGxpc3QuCisKKyAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfRkFVTFQgIC0gcExpc3QgaXMgYW4gaW52YWxpZCBwb2ludGVyLiAgICAgCisgICAgICAgICAgCisgIFxzYSAKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgd3BhbF9saXN0X2luaXQocExpc3QpIFwKKyAgICAgICAgIFdQQUxfTElTVF9TVEFUVVNfQkFTSUNfQ0hFQ0soIHZvc19saXN0X2luaXQoICh2b3NfbGlzdF90ICopKHBMaXN0KSApICkKKworCisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgd3BhbF9saXN0X2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSB3cHRfbGlzdCBMaXN0CisKKyAgVGhlIFxhIHdwYWxfbGlzdF9kZXN0cm95KCkgZnVuY3Rpb24gc2hhbGwgZGVzdHJveSB0aGUgbGlzdCBvYmplY3QgCisgIHJlZmVyZW5jZWQgYnkgcExpc3QuICBBZnRlciBhIHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gXGEgd3BhbF9saXN0X2Rlc3Ryb3koKQorICB0aGUgbGlzdCBvYmplY3QgYmVjb21lcywgaW4gZWZmZWN0LCB1bmluaXRpYWxpemVkLgorICAgCisgIEEgZGVzdHJveWVkIGxvY2sgb2JqZWN0IGNhbiBiZSByZWluaXRpYWxpemVkIHVzaW5nIHdwYWxfbGlzdF9pbml0KCk7IAorICB0aGUgcmVzdWx0cyBvZiBvdGhlcndpc2UgcmVmZXJlbmNpbmcgdGhlIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgCisgIGFyZSB1bmRlZmluZWQuICBDYWxscyB0byB3cHRfbGlzdCBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgbGlzdCBzdWNoCisgIHdpbGwgZmFpbCBpZiB0aGUgbGlzdCBvciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgb3IgaXMgZGVzdHJveWVkLiAgCisgIFRoZXJlZm9yZSwgZG9uJ3QgdXNlIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCB1bnRpbCBpdCBoYXMgCisgIGJlZW4gcmUtaW5pdGlhbGl6ZWQuCisgIAorICBccGFyYW0gcExsaXN0IC0gcG9pbnRlciB0byB0aGUgbGlzdCBvYmplY3QgdG8gYmUgZGVzdHJveWVkLgorICAKKyAgXHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IHdhcyBzdWNjZXNzZnVsbHkgZGVzdHJveWVkLgorICAKKyAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfQlVTWSAtIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgZGV0ZWN0ZWQgYW4gYXR0ZW1wdCAKKyAgICAgICAgICB0byBkZXN0cm95IHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSBwTGlzdCB0aGF0IGlzIHN0aWxsIGhhcworICAgICAgICAgIG5vZGVzLiAgVGhlIGxpc3QgbXVzdCBiZSBlbXB0eSBiZWZvcmUgaXQgY2FuIGJlIGRlc3Ryb3llZC4gCisKKyAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUwgLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHBMaXN0IGlzIG5vdCBhIHZhbGlkLAorICAgICAgICAgIGluaXRpYWxpemVkIGxpc3Qgb2JqZWN0LgorICAgICAgICAgIAorICAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9GQVVMVCAgLSBwTGlzdCBpcyBhbiBpbnZhbGlkIHBvaW50ZXIuICAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgd3BhbF9saXN0X2Rlc3Ryb3kocExpc3QpIFwKKyAgICBXUEFMX0xJU1RfU1RBVFVTX0JVU1lfQ0hFQ0soIHZvc19saXN0X2Rlc3Ryb3koICh2b3NfbGlzdF90ICopKHBMaXN0KSApICkKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgd3BhbF9saXN0X2luc2VydF9mcm9udCgpIC0gaW5zZXJ0IG5vZGUgYXQgZnJvbnQgb2YgYSBsaW5rZWQgbGlzdCAKKworICBUaGUgd3BhbF9saXN0X2luc2VydF9mcm9udCgpIEFQSSB3aWxsIGluc2VydCBhIG5vZGUgYXQgdGhlIGZyb250IG9mCisgIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgd3B0X2xpc3Qgb2JqZWN0LiAKKyAgCisgIFxwYXJhbSBwTGlzdCAtIFBvaW50ZXIgdG8gbGlzdCBvYmplY3Qgd2hlcmUgdGhlIG5vZGUgd2lsbCBiZSBpbnNlcnRlZAorICAKKyAgXHBhcmFtIHBOb2RlIC0gUG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGxpc3QuCisgIAorICBccmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgbm9kZSB3YXMgc3VjY2Vzc2Z1bGx5IGluc2VydGVkIG9udG8gCisgICAgICAgICAgdGhlIGZyb250IG9mIHRoZSBsaXN0LgorCisgICAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkUgLSBGYWlsdXJlLgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vd3B0X3N0YXR1cyB3cGFsX2xpc3RfaW5zZXJ0X2Zyb250KCB3cHRfbGlzdCAqcExpc3QsIHdwdF9saXN0X25vZGUgKnBOb2RlICk7CisjZGVmaW5lIHdwYWxfbGlzdF9pbnNlcnRfZnJvbnQocExpc3QsIHBOb2RlKSBcCisgICAgV1BBTF9MSVNUX1NUQVRVU19CQVNJQ19DSEVDSyggdm9zX2xpc3RfaW5zZXJ0X2Zyb250KCAodm9zX2xpc3RfdCAqKShwTGlzdCksICh2b3NfbGlzdF9ub2RlX3QgKikocE5vZGUpICkgKQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHdwYWxfbGlzdF9pbnNlcnRfYmFjaygpIC0gaW5zZXJ0IG5vZGUgYXQgYmFjayBvZiBhIGxpbmtlZCBsaXN0IAorCisgIFRoZSB3cGFsX2xpc3RfaW5zZXJ0X2JhY2soKSBBUEkgd2lsbCBpbnNlcnQgYSBub2RlIGF0IHRoZSBiYWNrIG9mCisgIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgd3B0X2xpc3Qgb2JqZWN0LiAKKyAgCisgIFxwYXJhbSBwTGlzdCAtIFBvaW50ZXIgdG8gbGlzdCBvYmplY3Qgd2hlcmUgdGhlIG5vZGUgd2lsbCBiZSBpbnNlcnRlZAorICAKKyAgXHBhcmFtIHBOb2RlIC0gUG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGxpc3QuCisgIAorICBccmV0dXJuIGVXTEFOX1BBTF9fU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgd2FzIHN1Y2Nlc3NmdWxseSBpbnNlcnRlZCBvbnRvIAorICAgICAgICAgIHRoZSBiYWNrIG9mIHRoZSBsaXN0LgorCisgICAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkUgLSBGYWlsdXJlLgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vd3B0X3N0YXR1cyB3cGFsX2xpc3RfaW5zZXJ0X2JhY2soIHdwdF9saXN0ICpwTGlzdCwgd3B0X2xpc3Rfbm9kZSAqcE5vZGUgKTsKKyNkZWZpbmUgd3BhbF9saXN0X2luc2VydF9iYWNrKHBMaXN0LCBwTm9kZSkgXAorICAgIFdQQUxfTElTVF9TVEFUVVNfQkFTSUNfQ0hFQ0soIHZvc19saXN0X2luc2VydF9iYWNrKCAodm9zX2xpc3RfdCAqKShwTGlzdCksICh2b3NfbGlzdF9ub2RlX3QgKikocE5vZGUpICkgKQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHdwYWxfbGlzdF9yZW1vdmVfZnJvbnQoKSAtIHJlbW92ZSBub2RlIGF0IGZyb250IG9mIGEgbGlua2VkIGxpc3QgCisKKyAgVGhlIHdwYWxfbGlzdF9yZW1vdmVfZnJvbnQoKSBBUEkgd2lsbCByZW1vdmUgYSBub2RlIGF0IHRoZSBmcm9udCBvZgorICBhIHByb3Blcmx5IGluaXRpYWxpemVkIHdwdF9pc3Qgb2JqZWN0LiAKKyAgCisgIFxwYXJhbSBwTGlzdCAtIFBvaW50ZXIgdG8gbGlzdCBvYmplY3Qgd2hlcmUgdGhlIG5vZGUgd2lsbCBiZSByZW1vdmVkCisgIAorICBccGFyYW0gcHBOb2RlIC0gUG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIGxpc3Qgbm9kZSB0byBiZSByZW1vdmVkIAorICBmcm9tIHRoZSBsaXN0LgorICAKKyAgXHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkIGZyb20gCisgICAgICAgICAgdGhlIGZyb250IG9mIHRoZSBsaXN0LgorCisgICAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMIC0gVGhlIHZhbHVlIHNwZWNpZmllZCBieSBwTGlzdCBpcyBub3QgYSB2YWxpZCwKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IG9iamVjdC4KKworICAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9FTVBUWSAtIFRoZSBzcGVjaWZpZWQgaXMgZW1wdHkgc28gbm9kZXMgY2Fubm90IGJlIAorICAgICAgICAgIHJlbW92ZWQuCisgICAgICAgICAKKyAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfRkFVTFQgIC0gcExpc3QgaXMgYW4gaW52YWxpZCBwb2ludGVyIG9yIHBwTm9kZSBpcyBhbgorICAgICAgICAgIGludmFsaWQgcG9pbnRlci4KKyAgICAKKyAgXHNhIAorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy93cHRfc3RhdHVzIHdwYWxfbGlzdF9yZW1vdmVfZnJvbnQoIHdwdF9saXN0ICpwTGlzdCwgd3B0X2xpc3Rfbm9kZSAqKnBwTm9kZSApOworI2RlZmluZSB3cGFsX2xpc3RfcmVtb3ZlX2Zyb250KHBMaXN0LCBwcE5vZGUpIFwKKyAgICAod3B0X3N0YXR1cyl2b3NfbGlzdF9yZW1vdmVfZnJvbnQoICh2b3NfbGlzdF90ICopKHBMaXN0KSwgKHZvc19saXN0X25vZGVfdCAqKikocHBOb2RlKSApCisKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgd3BhbF9saXN0X3JlbW92ZV9iYWNrKCkgLSByZW1vdmUgbm9kZSBhdCBiYWNrIG9mIGEgbGlua2VkIGxpc3QgCisKKyAgVGhlIHdwYWxfbGlzdF9yZW1vdmVfYmFjaygpIEFQSSB3aWxsIHJlbW92ZSBhIG5vZGUgYXQgdGhlIGJhY2sgb2YKKyAgYSBwcm9wZXJseSBpbml0aWFsaXplZCB3cHRfbGlzdCBvYmplY3QuIAorICAKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCB3aGVyZSB0aGUgbm9kZSB3aWxsIGJlIHJlbW92ZWQKKyAgCisgIFxwYXJhbSBwcE5vZGUgLSBQb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHRvIGJlIHJlbW92ZWQgCisgIGZyb20gdGhlIGxpc3QuCisgIAorICBccmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgbm9kZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSAKKyAgICAgICAgICB0aGUgYmFjayBvZiB0aGUgbGlzdC4KKworICAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFIC0gRmFpbHVyZS4KKyAgICAKKyAgXHNhIAorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCisvL3dwdF9zdGF0dXMgd3BhbF9saXN0X3JlbW92ZV9iYWNrKCB3cHRfbGlzdCAqcExpc3QsIHdwdF9saXN0X25vZGUgKipwcE5vZGUgKTsKKyNkZWZpbmUgd3BhbF9saXN0X3JlbW92ZV9iYWNrKHBMaXN0LCBwcE5vZGUpIFwKKyAgICBXUEFMX0xJU1RfU1RBVFVTX0JBU0lDX0NIRUNLKCB2b3NfbGlzdF9yZW1vdmVfYmFjayggKHZvc19saXN0X3QgKikocExpc3QpLCAodm9zX2xpc3Rfbm9kZV90ICoqKShwcE5vZGUpICkgKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHdwYWxfbGlzdF9zaXplKCkgLSByZXR1cm4gdGhlIHNpemUgb2Ygb2YgYSBsaW5rZWQgbGlzdCAKKworICBUaGUgd3BhbF9saXN0X3NpemUoKSBBUEkgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBub2RlcyBvbiB0aGUgCisgIGdpdmVuIHdwdF9saXN0IG9iamVjdC4gCisgIAorICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IHdoZXJlIHRoZSBub2RlIHdpbGwgYmUgY291bnRlZAorICAKKyAgXHBhcmFtIHBTaXplIC0gUG9pbnRlciB0byBhIHNpemUgdmFyaWFibGUsIHdoZXJlIHRoZSBzaXplIG9mIHRoZSAKKyAgICAgICAgICAgICAgICAgbGlzdCB3aWxsIGJlIHJldHVybmVkLgorICAKKyAgXHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IHNpemUgb2YgdGhlIHByb3Blcmx5IGluaXRpYWxpemVkIAorICAgICAgICAgIHdwdF9saXN0IG9iamVjdCBoYXMgYmVlbiByZXR1cm5lZC4KKworICAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFIC0gRmFpbHVyZQorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorLy93cHRfc3RhdHVzIHdwYWxfbGlzdF9zaXplKCB3cHRfbGlzdCAqcExpc3QsIHdwdF91aW50MzIgKnBTaXplICk7CisjZGVmaW5lIHdwYWxfbGlzdF9zaXplKHBMaXN0LCBwU2l6ZSkgXAorICAgIFdQQUxfTElTVF9TVEFUVVNfQkFTSUNfQ0hFQ0soIHZvc19saXN0X3NpemUoICh2b3NfbGlzdF90ICopKHBMaXN0KSwgKHZfU0laRV90ICopKHBTaXplKSApICkKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgd3BhbF9saXN0X3BlZWtfZnJvbnQoKSAtIHBlZWsgYXQgdGhlIG5vZGUgYXQgZnJvbnQgb2YgYSBsaW5rZWQgbGlzdCAKKworICBUaGUgd3BhbF9saXN0X3BlZWtfZnJvbnQoKSBBUEkgd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBub2RlIGF0IHRoZSAKKyAgZnJvbnQgb2YgYSBwcm9wZXJseSBpbml0aWFsaXplZCB3cHRfbGlzdCBvYmplY3QuICBUaGUgbm9kZSB3aWxsICpub3QqIGJlCisgIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KKyAgCisgIFxwYXJhbSBwTGlzdCAtIFBvaW50ZXIgdG8gbGlzdCBvYmplY3Qgb2YgdGhlIGxpc3QgdG8gYmUgJ3BlZWtlZCcgCisgIAorICBccGFyYW0gcHBOb2RlIC0gUG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIGxpc3Qgbm9kZSB0aGF0IGV4aXN0cyBhdAorICB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisgIAorICBccmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIGxpc3Qgbm9kZSBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3Qgd2FzIAorICAgICAgICAgIHN1Y2Nlc3NmdWxseSByZXR1cm5lZC4KKworICAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9GYWlsdXJlLgorICAgIAorICBcc2EgCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAKKy8vd3B0X3N0YXR1cyB3cGFsX2xpc3RfcGVla19mcm9udCggd3B0X2xpc3QgKnBMaXN0LCB3cHRfbGlzdF9ub2RlICoqcHBOb2RlICk7CisjZGVmaW5lIHdwYWxfbGlzdF9wZWVrX2Zyb250KHBMaXN0LCBwcE5vZGUpIFwKKyAgICBXUEFMX0xJU1RfU1RBVFVTX0JBU0lDX0NIRUNLKCB2b3NfbGlzdF9wZWVrX2Zyb250KCAodm9zX2xpc3RfdCAqKShwTGlzdCksICh2b3NfbGlzdF9ub2RlX3QgKiopKHBwTm9kZSkgKSApCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHdwYWxfbGlzdF9wZWVrX2JhY2soKSAtIHBlZWsgYXQgdGhlIG5vZGUgYXQgYmFjayBvZiBhIGxpbmtlZCBsaXN0IAorCisgIFRoZSB3cGFsX2xpc3RfcGVla19iYWNrKCkgQVBJIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbm9kZSBhdCB0aGUgCisgIGJhY2sgb2YgYSBwcm9wZXJseSBpbml0aWFsaXplZCB3cHRfbGlzdCBvYmplY3QuICBUaGUgbm9kZSB3aWxsICpub3QqIGJlCisgIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KKyAgCisgIFxwYXJhbSBwTGlzdCAtIFBvaW50ZXIgdG8gbGlzdCBvYmplY3Qgb2YgdGhlIGxpc3QgdG8gYmUgJ3BlZWtlZCcgCisgIAorICBccGFyYW0gcHBOb2RlIC0gUG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIGxpc3Qgbm9kZSB0aGF0IGV4aXN0cyBhdAorICB0aGUgYmFjayBvZiB0aGUgbGlzdC4KKyAgCisgIFxyZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gbGlzdCBub2RlIGF0IHRoZSBiYWNrIG9mIHRoZSBsaXN0IHdhcyAKKyAgICAgICAgICBzdWNjZXNzZnVsbHkgcmV0dXJuZWQuCisKKyAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUuCisgICAgCisgIFxzYSAKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorLy93cHRfc3RhdHVzIHdwYWxfbGlzdF9wZWVrX2JhY2soIHdwYWxfbGlzdCAqcExpc3QsIHdwdF9saXN0X25vZGUgKipwcE5vZGUgKTsKKyNkZWZpbmUgd3BhbF9saXN0X3BlZWtfYmFjayhwTGlzdCwgcHBOb2RlKSBcCisgICAgV1BBTF9MSVNUX1NUQVRVU19CQVNJQ19DSEVDSyggdm9zX2xpc3RfcGVla19iYWNrKCAodm9zX2xpc3RfdCAqKShwTGlzdCksICh2b3NfbGlzdF9ub2RlX3QgKiopKHBwTm9kZSkgKSApCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHdwYWxfbGlzdF9wZWVrX25leHQoKSAtIHBlZWsgYXQgdGhlIG5vZGUgYWZ0ZXIgdGhlIHNwZWNpZmllZCBub2RlIAorCisgIFRoZSB3cGFsX2xpc3RfcGVla19uZXh0KCkgQVBJIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbm9kZSBmb2xsb3dpbmcgdGhlCisgIHNwZWNpZmllZCBub2RlIG9uIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgd3B0X2xpc3Qgb2JqZWN0LiAgVGhlIG5vZGUgd2lsbCAKKyAgKm5vdCogYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgorICAKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCBvZiB0aGUgbGlzdCB0byBiZSAncGVla2VkJyAKKyAgCisgIFxwYXJhbSBwTm9kZSAtIFBvaW50ZXIgdG8gdGhlIG5vZGUgdGhhdCBpcyBiZWluZyAncGVla2VkJworICAKKyAgXHBhcmFtIHBwTm9kZSAtIFBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSBsaXN0IG5vZGUgdGhhdCBmb2xsb3dzIHRoZQorICBwTm9kZSBub2RlIG9uIHRoZSBsaXN0LgorICAKKyAgXHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgZm9sbG93aW5nIHBOb2RlIG9uIHRoZSBwcm9wZXJseSAKKyAgICAgICAgICBpbml0aWFsaXplZCBsaXN0IGlzIHN1Y2Nlc3NmdWxseSByZXR1cm5lZC4KKworICAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFIC0gRmFpbHVyZS4KKyAgICAKKyAgXHNhIAorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCisvL3dwdF9zdGF0dXMgd3BhbF9saXN0X3BlZWtfbmV4dCggd3B0X2xpc3QgKnBMaXN0LCB3cHRfbGlzdF9ub2RlICpwTm9kZSwgCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cHRfbGlzdF9ub2RlICoqcHBOb2RlICk7CisjZGVmaW5lIHdwYWxfbGlzdF9wZWVrX25leHQocExpc3QsIHBOb2RlLCBwcE5vZGUpIFwKKyAgICBXUEFMX0xJU1RfU1RBVFVTX0JBU0lDX0NIRUNLKCB2b3NfbGlzdF9wZWVrX25leHQoICh2b3NfbGlzdF90ICopKHBMaXN0KSwgKHZvc19saXN0X25vZGVfdCAqKShwTm9kZSksICh2b3NfbGlzdF9ub2RlX3QgKiopKHBwTm9kZSkgKSApCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHdwYWxfbGlzdF9wZWVrX3ByZXYoKSAtIHBlZWsgYXQgdGhlIG5vZGUgYmVmb3JlIHRoZSBzcGVjaWZpZWQgbm9kZSAKKworICBUaGUgd3BhbF9saXN0X3BlZWtfcHJldigpIEFQSSB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5vZGUgYmVmb3JlIHRoZQorICBzcGVjaWZpZWQgbm9kZSBvbiBhIHByb3Blcmx5IGluaXRpYWxpemVkIHdwdF9saXN0IG9iamVjdC4gIFRoZSBub2RlIHdpbGwgCisgICpub3QqIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KKyAgCisgIFxwYXJhbSBwTGlzdCAtIFBvaW50ZXIgdG8gbGlzdCBvYmplY3Qgb2YgdGhlIGxpc3QgdG8gYmUgJ3BlZWtlZCcgCisgIAorICBccGFyYW0gcE5vZGUgLSBQb2ludGVyIHRvIHRoZSBub2RlIHRoYXQgaXMgYmVpbmcgJ3BlZWtlZCcKKyAgCisgIFxwYXJhbSBwcE5vZGUgLSBQb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgbGlzdCBub2RlIGJlZm9yZSB0aGUKKyAgcE5vZGUgbm9kZSBvbiB0aGUgbGlzdC4KKyAgCisgIFxyZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gbGlzdCBub2RlIGJlZm9yZSBwTm9kZSBvbiB0aGUgcHJvcGVybHkgCisgICAgICAgICAgaW5pdGlhbGl6ZWQgbGlzdCBpcyBzdWNjZXNzZnVsbHkgcmV0dXJuZWQuCisKKyAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUuCisgICAgCisgIFxzYSAKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8vd3B0X3N0YXR1cyB3cGFsX2xpc3RfcGVla19wcmV2KCB3cHRfbGlzdCAqcExpc3QsIHdwdF9saXN0X25vZGUgKnBOb2RlLCAKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwdF9saXN0X25vZGUgKipwcE5vZGUgKTsKKyNkZWZpbmUgd3BhbF9saXN0X3BlZWtfcHJldihwTGlzdCwgcE5vZGUsIHBwTm9kZSkgXAorICAgIFdQQUxfTElTVF9TVEFUVVNfQkFTSUNfQ0hFQ0soIHZvc19saXN0X3BlZWtfcHJldiggKHZvc19saXN0X3QgKikocExpc3QpLCAodm9zX2xpc3Rfbm9kZV90ICopKHBOb2RlKSwgKHZvc19saXN0X25vZGVfdCAqKikocHBOb2RlKSApICkKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgd3BhbF9saXN0X2luc2VydF9iZWZvcmUoKSAtIGluc2VydCBub2RlIGF0IGZyb250IG9mIGEgc3BlY2lmaWVkCisgIGxpc3Qgbm9kZSAKKworICBUaGUgd3BhbF9saXN0X2luc2VydF9iZWZvcmUoKSBBUEkgd2lsbCBpbnNlcnQgYSBub2RlIG9udG8gYSBwcm9wZXJseSAKKyAgaW5pdGlhbGl6ZWQgd3B0X2xpc3Qgb2JqZWN0IGluIGZyb250IG9mIHRoZSBzcGVjaWZpZWQgbGlzdCBub2RlLgorICAKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCB3aGVyZSB0aGUgbm9kZSB3aWxsIGJlIGluc2VydGVkCisgIAorICBccGFyYW0gcE5vZGVUb0luc2VydCAtIFBvaW50ZXIgdG8gdGhlIGxpc3Qgbm9kZSB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0LgorICAKKyAgXHBhcmFtIHBOb2RlIC0gUG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHdoZXJlIHBOb2RlVG9JbnNlcnQgd2lsbCBiZSBpbnNlcnRlZAorICBpbiBmcm9udCBvZi4KKyAgCisgIFxyZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gbGlzdCBub2RlIHdhcyBzdWNjZXNzZnVsbHkgaW5zZXJ0ZWQgb250byAKKyAgICAgICAgICB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisKKyAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0ZBSUxVUkUgLSBGYWlsdXJlLgorICAgIAorICBcc2EKKyAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vd3B0X3N0YXR1cyB3cGFsX2xpc3RfaW5zZXJ0X2JlZm9yZSggd3B0X2xpc3QgKnBMaXN0LCAKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3B0X2xpc3Rfbm9kZSAqcE5vZGVUb0luc2VydCwgCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwdF9saXN0X25vZGUgKnBOb2RlICk7CisjZGVmaW5lIHdwYWxfbGlzdF9pbnNlcnRfYmVmb3JlKHBMaXN0LCBwTm9kZVRvSW5zZXJ0LCBwTm9kZSkgXAorICAgIFdQQUxfTElTVF9TVEFUVVNfQkFTSUNfQ0hFQ0soIHZvc19saXN0X2luc2VydF9iZWZvcmUoICh2b3NfbGlzdF90ICopKHBMaXN0KSwgXAorICAgICAgICAgICAgICAgICAgKHZvc19saXN0X25vZGVfdCAqKShwTm9kZVRvSW5zZXJ0KSwgKHZvc19saXN0X25vZGVfdCAqKShwTm9kZSkgKSApCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHdwYWxfbGlzdF9pbnNlcnRfYWZ0ZXIoKSAtIGluc2VydCBub2RlIGJlaGluZCBhIHNwZWNpZmllZCBsaXN0IG5vZGUgCisKKyAgVGhlIHdwYWxfbGlzdF9pbnNlcnRfYWZ0ZXIoKSBBUEkgd2lsbCBpbnNlcnQgYSBub2RlIG9udG8gYSBwcm9wZXJseSAKKyAgaW5pdGlhbGl6ZWQgd3B0X2xpc3Qgb2JqZWN0IGFmdGVyIHRoZSBzcGVjaWZpZWQgbGlzdCBub2RlLgorICAKKyAgXHBhcmFtIHBMaXN0IC0gUG9pbnRlciB0byBsaXN0IG9iamVjdCB3aGVyZSB0aGUgbm9kZSB3aWxsIGJlIGluc2VydGVkCisgIAorICBccGFyYW0gcE5vZGVUb0luc2VydCAtIFBvaW50ZXIgdG8gdGhlIGxpc3Qgbm9kZSB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0LgorICAKKyAgXHBhcmFtIHBOb2RlIC0gUG9pbnRlciB0byB0aGUgbGlzdCBub2RlIHdoZXJlIHBOb2RlVG9JbnNlcnQgd2lsbCBiZSBpbnNlcnRlZAorICBhZnRlci4KKyAgCisgIFxyZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gbGlzdCBub2RlIHdhcyBzdWNjZXNzZnVsbHkgaW5zZXJ0ZWQgb250byAKKyAgICAgICAgICB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisKKyAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUKKyAgICAKKyAgXHNhCisgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8vd3B0X3N0YXR1cyB3cGFsX2xpc3RfaW5zZXJ0X2FmdGVyKCB3cHRfbGlzdCAqcExpc3QsIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwdF9saXN0X25vZGUgKnBOb2RlVG9JbnNlcnQsIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwdF9saXN0X25vZGUgKnBOb2RlICk7ICAgICAgICAgCisjZGVmaW5lIHdwYWxfbGlzdF9pbnNlcnRfYWZ0ZXIocExpc3QsIHBOb2RlVG9JbnNlcnQsIHBOb2RlKSBcCisgICAgV1BBTF9MSVNUX1NUQVRVU19CQVNJQ19DSEVDSyggdm9zX2xpc3RfaW5zZXJ0X2FmdGVyKCh2b3NfbGlzdF90ICopKHBMaXN0KSwgXAorICAgICAgICAgKHZvc19saXN0X25vZGVfdCAqKShwTm9kZVRvSW5zZXJ0KSwgKHZvc19saXN0X25vZGVfdCAqKShwTm9kZSkgKQorCisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgXGJyaWVmIHdwYWxfbGlzdF9yZW1vdmVfbm9kZSgpIC0gcmVtb3ZlIHNwZWNpZmllZCBub2RlIGZyb20gd3B0X2xpc3QgbGlzdCAKKworICBUaGUgd3BhbF9saXN0X3JlbW92ZV9ub2RlKCkgQVBJIHdpbGwgcmVtb3ZlIGEgc3BlY2lmaWVkIG5vZGUgZnJvbSB0aGUgCisgIHByb3Blcmx5IGluaXRpYWxpemVkIHdwdF9saXN0IG9iamVjdC4gCisgIAorICBccGFyYW0gcExpc3QgLSBQb2ludGVyIHRvIGxpc3Qgb2JqZWN0IHdoZXJlIHRoZSBub2RlIHdpbGwgYmUgcmVtb3ZlZAorICAKKyAgXHBhcmFtIHBwTm9kZSAtIFBvaW50ZXIgdG8gdGhlIG5vZGUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgorICAKKyAgXHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBsaXN0IG5vZGUgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkIGZyb20gCisgICAgICAgICAgdGhlIGxpc3QuCisKKyAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRSAtIEZhaWx1cmUuCisgICAgCisgIFxzYQorICAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgCisvL3dwdF9zdGF0dXMgd3BhbF9saXN0X3JlbW92ZV9ub2RlKCB3cHRfbGlzdCAqcExpc3QsIHdwdF9saXN0X25vZGUgKnBOb2RlVG9SZW1vdmUgKTsKKyNkZWZpbmUgd3BhbF9saXN0X3JlbW92ZV9ub2RlKHBMaXN0LCBwTm9kZVRvUmVtb3ZlKSBcCisgICAgV1BBTF9MSVNUX1NUQVRVU19CQVNJQ19DSEVDSyggdm9zX2xpc3RfcmVtb3ZlX25vZGUoICh2b3NfbGlzdF90ICopKHBMaXN0KSwgXAorICAgICAgICAgICAgKHZvc19saXN0X25vZGVfdCAqKShwTm9kZVRvUmVtb3ZlKSApICkKKworCisjZW5kaWYgLy8gX19XTEFOX1FDVF9PU19MSVNUX0gKZGlmZiAtLWdpdCBhL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X29zX3N0YXR1cy5oIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3Rfb3Nfc3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1NDRmYgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X29zX3N0YXR1cy5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfT1NfU1RBVFVTX0ggKQorI2RlZmluZSBfX1dMQU5fUUNUX09TX1NUQVRVU19ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB3bGFuX3FjdF9vc19zdGF0dXMuaAorICAKKyAgXGJyaWVmIGRlZmluZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0cyBQQUwgZXhwb3J0cy4gd3B0ID0gKFdsYW4gUGFsIFR5cGUpIHdwYWwgPSAoV2xhbiBQQUwpCisgICAgICAgICAgICAgICAKKyAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBkZXBlbmRlbnQoV2luZG93cyBYUCkuIAorICAKKyAgIENvcHlyaWdodCAyMDEwIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ2b3Nfc3RhdHVzLmgiCisKKy8qKgorICogXGJyaWVmIE1hY3JvcyB0byBkZXJpdmUgUEFMIFNUQVRVUyBmcm9tIHRoZSBWT1MgU1RBVFVTCisgKi8KKworI2RlZmluZSBXUEFMX0lTX1ZPU19TVEFUVVNfRV9SRVNPVVJDRVMoc3RhdHVzKSAoIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgPT0gKHN0YXR1cykpIAorI2RlZmluZSBXUEFMX0lTX1ZPU19TVEFUVVNfRV9OT01FTShzdGF0dXMpICggVk9TX1NUQVRVU19FX05PTUVNID09IChzdGF0dXMpKSAKKyNkZWZpbmUgV1BBTF9JU19WT1NfU1RBVFVTX0VfSU5WQUwoc3RhdHVzKSAoIFZPU19TVEFUVVNfRV9JTlZBTCA9PSAoc3RhdHVzKSkgCisjZGVmaW5lIFdQQUxfSVNfVk9TX1NUQVRVU19FX0ZBVUxUKHN0YXR1cykgKCBWT1NfU1RBVFVTX0VfRkFVTFQgPT0gKHN0YXR1cykpIAorI2RlZmluZSBXUEFMX0lTX1ZPU19TVEFUVVNfRV9CVVNZKHN0YXR1cykgKCBWT1NfU1RBVFVTX0VfQlVTWSA9PSAoc3RhdHVzKSkgCisjZGVmaW5lIFdQQUxfSVNfVk9TX1NUQVRVU19FX0NBTkNFTEVEKHN0YXR1cykgKCBWT1NfU1RBVFVTX0VfQ0FOQ0VMRUQgPT0gKHN0YXR1cykpIAorI2RlZmluZSBXUEFMX0lTX1ZPU19TVEFUVVNfRV9BQk9SVEVEKHN0YXR1cykgKCBWT1NfU1RBVFVTX0VfQUJPUlRFRCA9PSAoc3RhdHVzKSkgCisjZGVmaW5lIFdQQUxfSVNfVk9TX1NUQVRVU19FX05PU1VQUE9SVChzdGF0dXMpICggVk9TX1NUQVRVU19FX05PU1VQUE9SVCA9PSAoc3RhdHVzKSkgCisjZGVmaW5lIFdQQUxfSVNfVk9TX1NUQVRVU19FX0VNUFRZKHN0YXR1cykgKCBWT1NfU1RBVFVTX0VfRU1QVFkgPT0gKHN0YXR1cykpIAorI2RlZmluZSBXUEFMX0lTX1ZPU19TVEFUVVNfRV9FWElTVFMoc3RhdHVzKSAoIFZPU19TVEFUVVNfRV9FWElTVFMgPT0gKHN0YXR1cykpIAorI2RlZmluZSBXUEFMX0lTX1ZPU19TVEFUVVNfRV9USU1FT1VUKHN0YXR1cykgKCBWT1NfU1RBVFVTX0VfVElNRU9VVCA9PSAoc3RhdHVzKSkgCisKKworI2RlZmluZSBXUEFMX1NUQVRVU19FX1RJTUVPVVRfQ0hFQ0soc3RhdHVzKSAoIFdQQUxfSVNfVk9TX1NUQVRVU19FX1RJTUVPVVQoc3RhdHVzKT8gZVdMQU5fUEFMX1NUQVRVU19FX1RJTUVPVVQgOiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRSApCisKKyNkZWZpbmUgV1BBTF9TVEFUVVNfRV9FWElTVFNfQ0hFQ0soc3RhdHVzKSAoIFdQQUxfSVNfVk9TX1NUQVRVU19FX0VYSVNUUyhzdGF0dXMpPyBlV0xBTl9QQUxfU1RBVFVTX0VfRVhJU1RTIDogV1BBTF9TVEFUVVNfRV9USU1FT1VUX0NIRUNLKHN0YXR1cykgKQorCisjZGVmaW5lIFdQQUxfU1RBVFVTX0VfRU1QVFlfQ0hFQ0soc3RhdHVzKSAoIFdQQUxfSVNfVk9TX1NUQVRVU19FX0VNUFRZKHN0YXR1cyk/IGVXTEFOX1BBTF9TVEFUVVNfRV9FTVBUWSA6IFdQQUxfU1RBVFVTX0VfRVhJU1RTX0NIRUNLKHN0YXR1cykgKQorCisjZGVmaW5lIFdQQUxfU1RBVFVTX0VfTk9TVVBQT1JUX0NIRUNLKHN0YXR1cykgKCBXUEFMX0lTX1ZPU19TVEFUVVNfRV9OT1NVUFBPUlQoc3RhdHVzKT8gZVdMQU5fUEFMX1NUQVRVU19FX05PU1VQUE9SVCA6IFdQQUxfU1RBVFVTX0VfRU1QVFlfQ0hFQ0soc3RhdHVzKSApCisKKyNkZWZpbmUgV1BBTF9TVEFUVVNfRV9BQk9SVEVEX0NIRUNLKHN0YXR1cykgKCBXUEFMX0lTX1ZPU19TVEFUVVNfRV9BQk9SVEVEKHN0YXR1cyk/IGVXTEFOX1BBTF9TVEFUVVNfRV9BQk9SVEVEIDogV1BBTF9TVEFUVVNfRV9OT1NVUFBPUlRfQ0hFQ0soc3RhdHVzKSApCisKKyNkZWZpbmUgV1BBTF9TVEFUVVNfRV9DQU5DRUxFRF9DSEVDSyhzdGF0dXMpICggV1BBTF9JU19WT1NfU1RBVFVTX0VfQ0FOQ0VMRUQoc3RhdHVzKT8gZVdMQU5fUEFMX1NUQVRVU19FX0NBTkNFTEVEIDogV1BBTF9TVEFUVVNfRV9BQk9SVEVEX0NIRUNLKHN0YXR1cykgKQorCisjZGVmaW5lIFdQQUxfU1RBVFVTX0VfQlVTWV9DSEVDSyhzdGF0dXMpICggV1BBTF9JU19WT1NfU1RBVFVTX0VfQlVTWShzdGF0dXMpPyBlV0xBTl9QQUxfU1RBVFVTX0VfQlVTWSA6IFdQQUxfU1RBVFVTX0VfQ0FOQ0VMRURfQ0hFQ0soc3RhdHVzKSApCisKKyNkZWZpbmUgV1BBTF9TVEFUVVNfRV9GQVVMVF9DSEVDSyhzdGF0dXMpICggV1BBTF9JU19WT1NfU1RBVFVTX0VfRkFVTFQoc3RhdHVzKT8gZVdMQU5fUEFMX1NUQVRVU19FX0ZBVUxUIDogV1BBTF9TVEFUVVNfRV9CVVNZX0NIRUNLKHN0YXR1cykgKQorCisjZGVmaW5lIFdQQUxfU1RBVFVTX0VfSU5WQUxfQ0hFQ0soc3RhdHVzKSAoIFdQQUxfSVNfVk9TX1NUQVRVU19FX0lOVkFMKHN0YXR1cyk/IGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTCA6IFdQQUxfU1RBVFVTX0VfRkFVTFRfQ0hFQ0soc3RhdHVzKSApCisKKyNkZWZpbmUgV1BBTF9TVEFUVVNfRV9OT01FTV9DSEVDSyhzdGF0dXMpICggV1BBTF9JU19WT1NfU1RBVFVTX0VfTk9NRU0oc3RhdHVzKT8gZVdMQU5fUEFMX1NUQVRVU19FX05PTUVNIDogV1BBTF9TVEFUVVNfRV9JTlZBTF9DSEVDSyhzdGF0dXMpICkKKworI2RlZmluZSBXUEFMX1NUQVRVU19FX1JFU09VUkNFU19DSEVDSyhzdGF0dXMpICggV1BBTF9JU19WT1NfU1RBVFVTX0VfUkVTT1VSQ0VTKHN0YXR1cyk/IGVXTEFOX1BBTF9TVEFUVVNfRV9SRVNPVVJDRVMgOiBXUEFMX1NUQVRVU19FX05PTUVNX0NIRUNLKHN0YXR1cykgKQorCisjZGVmaW5lIFdQQUxfVk9TX1RPX1dQQUxfU1RBVFVTKHN0YXR1cykgKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKT8gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIDogV1BBTF9TVEFUVVNfRV9SRVNPVVJDRVNfQ0hFQ0soc3RhdHVzKSApCisKKyNlbmRpZiAvLyBfX1dMQU5fUUNUX09TX1NUQVRVU19ICmRpZmYgLS1naXQgYS9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9vc19zeW5jLmggYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9vc19zeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiYjQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X29zX3N5bmMuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1dMQU5fUUNUX09TX1NZTkNfSCApCisjZGVmaW5lIF9fV0xBTl9RQ1RfT1NfU1lOQ19ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB3bGFuX3FjdF9vc19zeW5jLmgKKyAgCisgIFxicmllZiBkZWZpbmUgc3luY2hyb25pemF0aW9uIG9iamVjdHMgUEFMIGV4cG9ydHMuIHdwdCA9IChXbGFuIFBhbCBUeXBlKSB3cGFsID0gKFdsYW4gUEFMKQorICAgICAgICAgICAgICAgCisgICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gZGVwZW5kZW50KExBKS4gCisgIAorICAgQ29weXJpZ2h0IDIwMTAgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgInZvc19ldmVudC5oIgorI2luY2x1ZGUgInZvc19sb2NrLmgiCisKKy8qUmV1c2UgdGhlIHZvcyBsb2NrIGFuZCB2b3MgZXZlbnQqLwordHlwZWRlZiB2b3NfbG9ja190ICB3cHRfbXV0ZXg7Cit0eXBlZGVmIHZvc19ldmVudF90IHdwdF9ldmVudDsKKworCisjZW5kaWYgLy8gX19XTEFOX1FDVF9PU19TWU5DX0gKZGlmZiAtLWdpdCBhL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X29zX3RpbWVyLmggYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9vc190aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZWRlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9vc190aW1lci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfT1NfVElNRVJfSCApCisjZGVmaW5lIF9fV0xBTl9RQ1RfT1NfVElNRVJfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgd2xhbl9xY3Rfb3NfdGltZXIuaAorICAKKyAgXGJyaWVmIGRlZmluZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0cyBQQUwgZXhwb3J0cy4gd3B0ID0gKFdsYW4gUGFsIFR5cGUpIHdwYWwgPSAoV2xhbiBQQUwpCisgICAgICAgICAgICAgICAKKyAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBkZXBlbmRlbnQgKExpbnV4IEFuZHJvaWQpLgorICAKKyAgIENvcHlyaWdodCAyMDEwIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ2b3NfdGltZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHZvc190aW1lcl90IHRpbWVyT2JqOworfSB3cHRfb3NfdGltZXI7CisKKworI2VuZGlmIC8vIF9fV0xBTl9RQ1RfT1NfVElNRVJfSApkaWZmIC0tZ2l0IGEvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3Rfb3NfdHJhY2UuaCBiL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X29zX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5ZTJiYgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X29zX3RyYWNlLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19XTEFOX1FDVF9PU19UUkFDRV9IICkKKyNkZWZpbmUgX19XTEFOX1FDVF9PU19UUkFDRV9ICisKKworI2lmZGVmIFdMQU5fREVCVUcKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyBcYnJpZWYgV1BBTF9UUkFDRSgpIC8gd3BhbFRyYWNlKCkgLSBUcmFjZSAvIGxvZ2dpbmcgQVBJCisgICAKKyBVc2VycyB3aXNoaW5nIHRvIGFkZCB0cmFjaW5nIGluZm9ybWF0aW9uIHRvIHRoZWlyIGNvZGUgc2hvdWxkIHVzZSAKKyBXUEFMX1RSQUNFLiAgV1BBTF9UUkFDRSgpIHdpbGwgY29tcGlsZSBpbnRvIGEgY2FsbCB0byB3cGFsVHJhY2UoKSB3aGVuCisgdHJhY2luZyBpcyBlbmFibGVkLgorICAKKyBccGFyYW0gbW9kdWxlIC0gbW9kdWxlIGlkZW50aWZpZXIuICAgQSBtZW1iZXIgb2YgdGhlIHdwdF9tb2R1bGVpZAorICAgICAgICAgICAgICAgICBlbnVtZXJhdGlvbiB0aGF0IGlkZW50aWZpZXMgdGhlIG1vZHVsZSBpc3N1aW5nIHRoZSB0cmFjZSBtZXNzYWdlLgorICAgICAgICAgCisgXHBhcmFtIGxldmVsIC0gdHJhY2UgbGV2ZWwuICAgQSBtZW1iZXIgb2YgdGhlIHdwdF90cmFjZWxldmVsIAorICAgICAgICAgICAgICAgIGVudW1lcmF0aW9uIGluZGljYXRpbmcgdGhlIHNldmVyaXR5IG9mIHRoZSBjb25kaXRpb24gY2F1c2luZyB0aGUKKyAgICAgICAgICAgICAgICB0cmFjZSBtZXNzYWdlIHRvIGJlIGlzc3VlZC4gICBNb3JlIHNldmVyZSBjb25kaXRpb25zIGFyZSBtb3JlIAorICAgICAgICAgICAgICAgIGxpa2VseSB0byBiZSBsb2dnZWQuCisgICAgICAgICAKKyAgIFxwYXJhbSBzdHJGb3JtYXQgLSBmb3JtYXQgc3RyaW5nLiAgVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLiAgVGhpcyBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGFpbnMgcHJpbnRmLWxpa2UgcmVwbGFjZW1lbnQgcGFyYW1ldGVycywgd2hpY2ggZm9sbG93CisgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaW4gdGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAKKyAgCisgICBccmV0dXJuICBub3RoaW5nCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgd3BhbFRyYWNlKCB3cHRfbW9kdWxlaWQgbW9kdWxlLCB3cHRfdHJhY2VsZXZlbCBsZXZlbCwgY2hhciAqc3RyRm9ybWF0LCAuLi4gKTsKKworLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyBcYnJpZWYgV1BBTF9EVU1QKCkgLyB3cGFsRHVtcCgpIC0gVHJhY2UgLyBsb2dnaW5nIEFQSQorICAgCisgVXNlcnMgd2lzaGluZyB0byBhZGQgdHJhY2luZyBtZW1vcnkgZHVtcHMgdG8gdGhlaXIgY29kZSBzaG91bGQgdXNlIAorIFdQQUxfRFVNUC4gIFdQQUxfRFVNUCgpIHdpbGwgY29tcGlsZSBpbnRvIGEgY2FsbCB0byB3cGFsRHVtcCgpIHdoZW4KKyB0cmFjaW5nIGlzIGVuYWJsZWQuCisgIAorIFxwYXJhbSBtb2R1bGUgLSBtb2R1bGUgaWRlbnRpZmllci4gICBBIG1lbWJlciBvZiB0aGUgd3B0X21vZHVsZWlkCisgICAgICAgICAgICAgICAgIGVudW1lcmF0aW9uIHRoYXQgaWRlbnRpZmllcyB0aGUgbW9kdWxlIHBlcmZvcm1pbmcgdGhlIGR1bXAKKyAgICAgICAgIAorIFxwYXJhbSBsZXZlbCAtIHRyYWNlIGxldmVsLiAgIEEgbWVtYmVyIG9mIHRoZSB3cHRfdHJhY2VsZXZlbCAKKyAgICAgICAgICAgICAgICBlbnVtZXJhdGlvbiBpbmRpY2F0aW5nIHRoZSBzZXZlcml0eSBvZiB0aGUgY29uZGl0aW9uIGNhdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgbWVtb3J5IHRvIGJlIGR1bXBlZC4gICBNb3JlIHNldmVyZSBjb25kaXRpb25zIGFyZSBtb3JlIAorICAgICAgICAgICAgICAgIGxpa2VseSB0byBiZSBsb2dnZWQuCisgICAgICAgICAKKyBccGFyYW0gcE1lbW9yeSAtIG1lbW9yeS4gIEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IHRvIGJlIGR1bXBlZAorCisgXHBhcmFtIGxlbmd0aCAtIGxlbmd0aC4gIEhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSB0byBiZSBkdW1wZWQKKyAgCisgICBccmV0dXJuICBub3RoaW5nCisgICAgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgd3BhbER1bXAoIHdwdF9tb2R1bGVpZCBtb2R1bGUsIHdwdF90cmFjZWxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgd3B0X3VpbnQ4ICptZW1vcnksIHdwdF91aW50MzIgbGVuZ3RoKTsKKworI2RlZmluZSBXUEFMX1RSQUNFIHdwYWxUcmFjZQorI2RlZmluZSBXUEFMX0RVTVAgd3BhbER1bXAKKworI2RlZmluZSBXUEFMX0FTU0VSVCggX2NvbmRpdGlvbiApICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpZiAoICEgKCBfY29uZGl0aW9uICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHByaW50ayhLRVJOX0NSSVQgIlZPUyBBU1NFUlQgaW4gJXMgTGluZSAlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKyAgIFdBUk5fT04oMSk7IFwKK30KKworI2Vsc2UgLy9XTEFOX0RFQlVHCisKKyNkZWZpbmUgV1BBTF9UUkFDRQorI2RlZmluZSBXUEFMX0RVTVAKKyNkZWZpbmUgV1BBTF9BU1NFUlQKKworI2VuZGlmIC8vV0xBTl9ERUJVRworCisjZW5kaWYgLy8gX19XTEFOX1FDVF9PU19UUkFDRV9ICmRpZmYgLS1naXQgYS9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9vc190eXBlLmggYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9vc190eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhOGUxYwotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X29zX3R5cGUuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1dMQU5fUUNUX09TX1RZUEVfSCApCisjZGVmaW5lIF9fV0xBTl9RQ1RfT1NfVFlQRV9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB3bGFuX3FjdF9wYWxfdHlwZS5oCisgIAorICBcYnJpZWYgZGVmaW5lIGJhc2kgdHlwZXMgUEFMIGV4cG9ydHMuIHdwdCA9IChXbGFuIFBhbCBUeXBlKQorICAgICAgICAgICAgICAgCisgICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gZGVwZW5kZW50LiBUaGlzIGlzIGZvciBMaW51eC9BbmRyb2lkCisgIAorICAgQ29weXJpZ2h0IDIwMTAgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgd3B0X3VpbnQzMjsKKwordHlwZWRlZiBzaWduZWQgbG9uZyB3cHRfaW50MzI7CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgd3B0X3VpbnQxNjsKKwordHlwZWRlZiBzaWduZWQgc2hvcnQgd3B0X2ludDE2OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgd3B0X3VpbnQ4OworCit0eXBlZGVmIHdwdF91aW50OCB3cHRfYnl0ZTsKKwordHlwZWRlZiBzaWduZWQgY2hhciB3cHRfaW50ODsKKwordHlwZWRlZiB3cHRfdWludDggd3B0X2Jvb2xlYW47IAorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB3cHRfdWludDY0OworCit0eXBlZGVmIGxvbmcgbG9uZyB3cHRfaW50NjQ7CisKKyNkZWZpbmUgV1BUX0lOTElORSBfX2lubGluZV9fCisjZGVmaW5lIFdQVF9TVEFUSUMgc3RhdGljCisKKworI2VuZGlmIC8vIF9fV0xBTl9RQ1RfT1NfVFlQRV9ICmRpZmYgLS1naXQgYS9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWNrX2FsaWduLmggYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWNrX2FsaWduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxYTM1MAotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X3BhY2tfYWxpZ24uaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19XTEFOX1FDVF9QQUNLX0FMSUdOX0ggKQorI2RlZmluZSBfX1dMQU5fUUNUX1BBQ0tfQUxJR05fSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgd2xhbl9wYWNrX2FsaWduLmgKKyAgCisgIFxicmllZiBwYWNrIGFuZCBhbGlnbiBwcmltaXRpdmVzCisgICAgICAgICAgICAgICAKKyAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBpbmRlcGVuZGVudCBtZWFucyBvZiBwYWNraW5nIGFuZCBhbGlnbmluZworICAgZGF0YSBzdHJ1Y3R1cmVzCisgIAorICAgQ29weXJpZ2h0IDIwMDkgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAKKyAgUGxhY2UgdGhlIG1hY3JvIFdQVF9QQUNLX1NUQVJUIGFib3ZlIGEgc3RydWN0dXJlIGRlY2xhcmF0aW9uIHRvIHBhY2suIFdlIAorICBhcmUgbm90IGdvaW5nIHRvIGFsbG93IG1vZGlmeWluZyB0aGUgcGFjayBzaXplIGJlY2F1c2UgcGFjayBzaXplIGNhbm5vdCBiZSAKKyAgc3BlY2lmaWVkIGluIEFNU1MgYW5kIEdOVS4gUGxhY2UgdGhlIG1hY3JvIFdQVF9QQUNLX0VORCBiZWxvdyBhIHN0cnVjdHVyZSAKKyAgZGVjbGFyYXRpb24gdG8gc3RvcCB0aGUgcGFjay4gVGhpcyByZXF1aXJlbWVudCBpcyBuZWNlc3NpdGF0ZWQgYnkgV2luZG93cworICB3aGljaCBuZWVkIHByYWdtYSBiYXNlZCBwcm9sb2cgYW5kIGVwaWxvZy4KKworICBQYWNrLXNpemUgPiAxLWJ5dGUgaXMgbm90IHN1cHBvcnRlZCBzaW5jZSBnY2MgYW5kIGFybSBkbyBub3Qgc3VwcG9ydCB0aGF0LgorICAKKyAgSGVyZSBhcmUgc29tZSBleGFtcGxlcworICAKKyAgMS4gUGFjay1zaXplIDEtYnl0ZSBmb29fdCBhY3Jvc3MgYWxsIHBsYXRmb3JtcyAgCisgIAorICBXUFRfUEFDS19TVEFSVAorICB0eXBlZGVmIFdQVF9QQUNLX1BSRSBzdHJ1Y3QgZm9vX3MgeyAuLi4gfSBXUFRfUEFDS19QT1NUIGZvb190OyAKKyAgV1BUX1BBQ0tfRU5ECisgIAorICAyLiAyLWJ5dGUgYWxpZ25tZW50IGZvciBmb29fdCBhY3Jvc3MgYWxsIHBsYXRmb3JtcworICAKKyAgdHlwZWRlZiBXUFRfQUxJR05fUFJFKDIpIHN0cnVjdCBmb29fcyB7IC4uLiB9IFdQVF9BTElHTl9QT1NUKDIpIGZvb190OyAKKworICAzLiBQYWNrLXNpemUgMS1ieXRlIGFuZCAyLWJ5dGUgYWxpZ25tZW50IGZvciBmb29fdCBhY3Jvc3MgYWxsIHBsYXRmb3JtcworCisgIFdQVF9QQUNLX1NUQVJUCisgIHR5cGVkZWYgV1BUX1BBQ0tfUFJFIFdQVF9BTElHTl9QUkUoMikgc3RydWN0IGZvb19zIHsgLi4uIH0gV1BUX0FMSUdOX1BPU1QoMikgV1BUX1BBQ0tfUE9TVCBmb29fdDsgCisgIFdQVF9QQUNLX0VORAorICAKKyovCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fCisKKyAgICNkZWZpbmUgV1BUX1BBQ0tfU1RBUlQgCisgICAjZGVmaW5lIFdQVF9QQUNLX0VORCAKKworICAgI2RlZmluZSBXUFRfUEFDS19QUkUgCisgICAjZGVmaW5lIFdQVF9QQUNLX1BPU1QgIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQorCisgICAjZGVmaW5lIFdQVF9BTElHTl9QUkUoX192YWx1ZSkKKyAgICNkZWZpbmUgV1BUX0FMSUdOX1BPU1QoX192YWx1ZSkgIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKF9fdmFsdWUpKSkKKworI2VsaWYgZGVmaW5lZCBfX2FybQorCisgICAjZGVmaW5lIFdQVF9QQUNLX1NUQVJUIAorICAgI2RlZmluZSBXUFRfUEFDS19FTkQgCisKKyAgICNkZWZpbmUgV1BUX1BBQ0tfUFJFICBfX3BhY2tlZAorICAgI2RlZmluZSBXUFRfUEFDS19QT1NUCisKKyAgICNkZWZpbmUgV1BUX0FMSUdOX1BSRShfX3ZhbHVlKSAgX19hbGlnbihfX3ZhbHVlKQorICAgI2RlZmluZSBXUFRfQUxJR05fUE9TVChfX3ZhbHVlKQorCisjZWxpZiBkZWZpbmVkIF9NU0NfVkVSCisKKyAgICNkZWZpbmUgV1BUX1BBQ0tfU1RBUlQgIF9fcHJhZ21hIChwYWNrKHB1c2gsMSkpCisgICAjZGVmaW5lIFdQVF9QQUNLX0VORCAgX19wcmFnbWEgKHBhY2socG9wKSkKKworICAgI2RlZmluZSBXUFRfUEFDS19QUkUgCisgICAjZGVmaW5lIFdQVF9QQUNLX1BPU1QKKworICAgI2RlZmluZSBXUFRfQUxJR05fUFJFKF9fdmFsdWUpICBfX2RlY2xzcGVjKGFsaWduKF9fdmFsdWUpKQorICAgI2RlZmluZSBXUFRfQUxJR05fUE9TVChfX3ZhbHVlKQorCisjZWxzZQorCisgICAjZXJyb3IgVW5zdXBwb3J0ZWQgY29tcGlsZXIhISEKKworI2VuZGlmCisKKyNlbmRpZiAvLyBfX1dMQU5fUUNUX1BBQ0tfQUxJR05fSApkaWZmIC0tZ2l0IGEvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX2FwaS5oIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWNiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWxfYXBpLmgKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfUEFMX0FQSV9IICkKKyNkZWZpbmUgX19XTEFOX1FDVF9QQUxfQVBJX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHdsYW5fcWN0X3BhbF9hcGkuaAorICAKKyAgXGJyaWVmIGRlZmluZSBnZW5lcmFsIEFQSXMgUEFMIGV4cG9ydHMuIHdwdCA9IChXbGFuIFBhbCBUeXBlKSB3cGFsID0gKFdsYW4gUEFMKQorICAgICAgICAgICAgICAgCisgICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQKKyAgCisgICBDb3B5cmlnaHQgMjAxMCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3R5cGUuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfc3RhdHVzLmgiCisKKyNpZmRlZiBNRU1PUllfREVCVUcKKyNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCisjZW5kaWYgLyogTUVNT1JZX0RFQlVHICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipNQUNSTyoqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIG1hY3JvIHRvIGdldCBtYXhpbXVtIG9mIHR3byB2YWx1ZXMuCisjZGVmaW5lIFdQQUxfTUFYKCBfeCwgX3kgKSAoICggKF94KSA+IChfeSkgKSA/IChfeCkgOiAoX3kpICkgIAorCisvLyBtYWNybyB0byBnZXQgbWluaW11bSBvZiB0d28gdmFsdWVzCisjZGVmaW5lIFdQQUxfTUlOKCBfeCwgX3kgKSAoICggKF94KSA8IChfeSkgKSA/IChfeCkgOiAoX3kpICApICAKKworLy8gbWFjcm8gdG8gZ2V0IHRoZSBjZWlsaW5nIG9mIGFuIGludGVnZXIgZGl2aXNpb24gb3BlcmF0aW9uLi4uCisjZGVmaW5lIFdQQUxfQ0VJTF9ESVYoIF9hLCBfYiApICggMCAhPSAoX2EpICUgKF9iKSApID8gKCAoX2EpIC8gKF9iKSArIDEgKSA6ICggKF9hKSAvIChfYikgKSAKKworLy8gbWFjcm8gdG8gcmV0dXJuIHRoZSBmbG9vciBvZiBhbiBpbnRlZ2VyIGRpdmlzaW9uIG9wZXJhdGlvbgorI2RlZmluZSBXUEFMX0ZMT09SX0RJViggX2EsIF9iICkgKCAoIChfYSkgLSAoIChfYSkgJSAoX2IpICkgKSAvIChfYikgKQorCisjZGVmaW5lIFdQQUxfU1dBUF9VMTYoX3gpIFwKKyAgICggKCAoIChfeCkgPDwgOCApICYgMHhGRjAwICkgfCAoICggKF94KSA+PiA4ICkgJiAweDAwRkYgKSApCisKKyNkZWZpbmUgV1BBTF9TV0FQX1UzMihfeCkgXAorICAgKCAoICggKF94KSA8PCAyNCApICYgMHhGRjAwMDAwMCApIHwgKCAoIChfeCkgPj4gMjQgKSAmIDB4MDAwMDAwRkYgKSApIHwgXAorICAgKCAoICggKF94KSA8PCA4ICkgJiAweDAwRkYwMDAwICkgfCAoICggKF94KSA+PiA4ICkgJiAweDAwMDBGRjAwICkgKQorCisvLyBFbmRpYW4gb3BlcmF0aW9ucyBmb3IgQmlnIEVuZGlhbiBhbmQgU21hbGwgRW5kaWFuIG1vZGVzCisjaWZuZGVmIEFOSV9CSUdfQllURV9FTkRJQU4KKworLy9UaGlzIHBvcnRpb24gaXMgZm9yIGxpdHRsZS1lbmRpYW4gY3B1CisjZGVmaW5lIFdQQUxfQ1BVX1RPX0JFMzIoX3gpIFdQQUxfU1dBUF9VMzIoX3gpCisjZGVmaW5lIFdQQUxfQkUzMl9UT19DUFUoX3gpIFdQQUxfU1dBUF9VMzIoX3gpCisjZGVmaW5lIFdQQUxfQ1BVX1RPX0JFMTYoX3gpIFdQQUxfU1dBUF9VMTYoX3gpCisjZGVmaW5lIFdQQUxfQkUxNl9UT19DUFUoX3gpIFdQQUxfU1dBUF9VMTYoX3gpCisjZGVmaW5lIFdQQUxfQ1BVX1RPX0xFMzIoX3gpIChfeCkKKyNkZWZpbmUgV1BBTF9MRTMyX1RPX0NQVShfeCkgKF94KQorI2RlZmluZSBXUEFMX0NQVV9UT19MRTE2KF94KSAoX3gpCisjZGVmaW5lIFdQQUxfTEUxNl9UT19DUFUoX3gpIChfeCkKKworI2Vsc2UgLy8jaWZuZGVmIEFOSV9CSUdfQllURV9FTkRJQU4KKworLy9UaGlzIHBvcnRpb24gaXMgZm9yIGJpZy1lbmRpYW4gY3B1CisjZGVmaW5lIFdQQUxfQ1BVX1RPX0JFMzIoX3gpIChfeCkKKyNkZWZpbmUgV1BBTF9CRTMyX1RPX0NQVShfeCkgKF94KQorI2RlZmluZSBXUEFMX0NQVV9UT19CRTE2KF94KSAoX3gpCisjZGVmaW5lIFdQQUxfQkUxNl9UT19DUFUoX3gpIChfeCkKKyNkZWZpbmUgV1BBTF9DUFVfVE9fTEUzMihfeCkgV1BBTF9TV0FQX1UzMihfeCkKKyNkZWZpbmUgV1BBTF9MRTMyX1RPX0NQVShfeCkgV1BBTF9TV0FQX1UzMihfeCkKKyNkZWZpbmUgV1BBTF9DUFVfVE9fTEUxNihfeCkgV1BBTF9TV0FQX1UxNihfeCkKKyNkZWZpbmUgV1BBTF9MRTE2X1RPX0NQVShfeCkgV1BBTF9TV0FQX1UxNihfeCkKKworI2VuZGlmIC8vI2lmbmRlZiBBTklfQklHX0JZVEVfRU5ESUFOCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkdlbmVyaWMgQVBJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbE9wZW4gLSAgSW5pdGlhbGl6ZSBQQUwKKyAgICBQYXJhbTogCisgICAgICAgcHBQYWxDb250ZXh0IJYgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgcG9pbnRlci4gSXQgaXMgb3BhcXVlIHRvIGNhbGxlci4KKyAgICAgICAgICAgICAgICAgICAgICBDYWxsZXIgc2F2ZSB0aGUgcmV0dXJuZWQgcG9pbnRlciBmb3IgZnV0dXJlIHVzZSB3aGVuIGNhbGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICBQQUwgQVBJcy4gSWYgdGhpcyBpcyBOVUxMLCBpdCBtZWFucyB0aGF0IFBBTCBkb2Vzbid0IG5lZWQgaXQuCisgICAgICAgcE9TQ29udGV4dCAtIFBvaW50ZXIgdG8gYSBjb250ZXh0IHRoYXQgaXMgT1Mgc3BlY2lmaWMuIFRoaXMgaXMgTlVMTCBpcyBhIAorICAgICAgICAgICAgICAgICAgICAgcGFydGljdWxhciBQQUwgZG9lc24ndCB1c2UgaXQgZm9yIHRoYXQgT1MuCisgICAgUmV0dXJuOgorICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIE90aGVyd2lzZSBmYWlsLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbE9wZW4odm9pZCAqKnBwUGFsQ29udGV4dCwgdm9pZCAqcE9TQ29udGV4dCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbENsb3NlIC0gUmVsZWFzZSBQQUwKKyAgICBQYXJhbTogCisgICAgICAgcFBhbENvbnRleHQgliBwb2ludGVyIHJldHVybmVkIGZyb20gd3BhbE9wZW4uCisgICAgUmV0dXJuOgorICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIE90aGVyd2lzZSBmYWlsLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbENsb3NlKHZvaWQgKnBQYWxDb250ZXh0KTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqTWVtb3J5IEFQSSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIE1FTU9SWV9ERUJVRworLyogRm9yIE1lbW9yeSBEZWJ1Z2dpbmcsIEhvb2sgdXAgUEFMIG1lbW9yeSBBUEkgdG8gVk9TIG1lbW9yeSBBUEkgKi8KKyNkZWZpbmUgd3BhbE1lbW9yeUFsbG9jYXRlIHZvc19tZW1fbWFsbG9jCisjZGVmaW5lIHdwYWxNZW1vcnlGcmVlICAgICB2b3NfbWVtX2ZyZWUKKyNlbHNlCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbE1lbW9yeUFsbG9jYXRlIC0gIEFsbG9jYXRlIG1lbW9yeQorICAgIFBhcmFtOiAKKyAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgICAgUmV0dXJuOgorICAgICAgIEEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gCisgICAgICAgTlVMTCCWIGZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCAqd3BhbE1lbW9yeUFsbG9jYXRlKHdwdF91aW50MzIgc2l6ZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbE1lbW9yeUZyZWUgLSAgRnJlZSBhbGxvY2F0ZWQgbWVtb3J5CisgICAgUGFyYW06IAorICAgICAgIHB2IJYgcG9pbnRlciB0byBidWZmZXIgdG8gYmUgZnJlZWQKKyAgICBSZXR1cm46CisgICAgICAgTm9uZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgd3BhbE1lbW9yeUZyZWUodm9pZCAqcHYpOworI2VuZGlmIC8qIE1FTU9SWV9ERUJVRyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxNZW1vcnlDb3B5IC0gIGNvcHkgbWVtb3J5CisgICAgUGFyYW06IAorICAgICAgIGRlc3QgliBhZGRyZXNzIHdoaWNoIGRhdGEgaXMgY29waWVkIHRvCisgICAgICAgc3JjIJYgYWRkcmVzcyB3aGljaCBkYXRhIGlzIGNvcGllZCBmcm9tCisgICAgICAgc2l6ZSCWIG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgICAgUmV0dXJuOgorICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUworICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfSU5WQUxJRF9QQVJBTQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbE1lbW9yeUNvcHkodm9pZCAqIGRlc3QsIHZvaWQgKiBzcmMsIHdwdF91aW50MzIgc2l6ZSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsTWVtb3J5Q29tcGFyZSAtICBjb21wYXJlIG1lbW9yeQorICAgIFBhcmFtOiAKKyAgICAgICBidWYxIJYgYWRkcmVzcyBvZiBidWZmZXIxCisgICAgICAgYnVmMiCWIGFkZHJlc3Mgb2YgYnVmZmVyMgorICAgICAgIHNpemUgliBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQorICAgIFJldHVybjoKKyAgICAgICBlV0xBTl9QQUxfVFJVRSCWIGlmIHR3byBidWZmZXJzIGhhdmUgc2FtZSBjb250ZW50CisgICAgICAgZVdMQU5fUEFMX0ZBTFNFIJYgbm90IG1hdGNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X2Jvb2xlYW4gd3BhbE1lbW9yeUNvbXBhcmUodm9pZCAqIGJ1ZjEsIHZvaWQgKiBidWYyLCB3cHRfdWludDMyIHNpemUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxNZW1vcnlaZXJvIC0gIFplcm8gbWVtb3J5CisgICAgUGFyYW06IAorICAgICAgIGJ1ZiCWIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIGJlIHplcm8KKyAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIHplcm8KKyAgICBSZXR1cm46CisgICAgICAgTm9uZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgd3BhbE1lbW9yeVplcm8odm9pZCAqYnVmLCB3cHRfdWludDMyIHNpemUpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbE1lbW9yeUZpbGwgLSAgRmlsbCBtZW1vcnkgd2l0aCBvbmUgcGF0dGVybgorICAgIFBhcmFtOiAKKyAgICAgICBidWYgliBhZGRyZXNzIG9mIGJ1ZmZlciB0byBiZSB6ZXJvCisgICAgICAgc2l6ZSCWIG51bWJlciBvZiBieXRlcyB0byB6ZXJvCisgICAgICAgYkZpbGwgLSBvbmUgYnl0ZSBvZiBkYXRhIHRvIGZpbGwgaW4gKHNpemUpIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIKKyAgICBSZXR1cm46CisgICAgICAgTm9uZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgd3BhbE1lbW9yeUZpbGwodm9pZCAqYnVmLCB3cHRfdWludDMyIHNpemUsIHdwdF9ieXRlIGJGaWxsKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxEbWFNZW1vcnlBbGxvY2F0ZSAtICBBbGxvY2F0ZSBtZW1vcnkgcmVhZHkgZm9yIERNQS4gQWxpZ25lZCBhdCA0LWJ5dGUKKyAgICBQYXJhbTogCisgICAgICAgcFBhbENvbnRleHQgLSBQQUwgY29udGV4dCBwb2ludGVyCisgICAgICAgc2l6ZSCWIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICAgICAgIHBwUGh5c2ljYWxBZGRyIJYgUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGlmIGFsbG9jYXRpb24gc3VjY2VlZHMKKyAgICBSZXR1cm46CisgICAgICAgQSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICh2aXJ0dWFsIGFkZHJlc3MpLiAKKyAgICAgICBOVUxMIJYgZmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgKndwYWxEbWFNZW1vcnlBbGxvY2F0ZSh3cHRfdWludDMyIHNpemUsIHZvaWQgKipwcFBoeXNpY2FsQWRkcik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbERtYU1lbW9yeUZyZWUgLSAgRnJlZSBtZW1vcnkgcmVhZHkgZm9yIERNQQorICAgIFBhcmFtOiAKKyAgICAgICBwUGFsQ29udGV4dCAtIFBBTCBjb250ZXh0IHBvaW50ZXIKKyAgICAgICBwdiCWIGFkZHJlc3MgZm9yIHRoZSBidWZmZXIgdG8gYmUgZnJlZWQKKyAgICBSZXR1cm46CisgICAgICAgTm9uZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgd3BhbERtYU1lbW9yeUZyZWUodm9pZCAqcHYpOworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsRGJnUmVhZFJlZ2lzdGVyIC0gIFJlYWQgcmVnaXN0ZXIgZnJvbSB0aGUgV2lGaSBCQiBjaGlwCisgICAgUGFyYW06IAorICAgICAgIHJlZ0FkZHIgLSByZWdpc3RlciBhZGRyZXNzCisgICAgICAgcHJlZ1ZhbHVlIC0gcmV0dXJuIHZhbHVlIGZyb20gcmVnaXN0ZXIgaWYgc3VjY2VzcworICAgIFJldHVybjoKKyAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxEYmdSZWFkUmVnaXN0ZXIod3B0X3VpbnQzMiByZWdBZGRyLCB3cHRfdWludDMyICpwcmVnVmFsdWUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxEYmdXcml0ZVJlZ2lzdGVyIC0gIFdyaXRlIGEgdmFsdWUgdG8gdGhlIHJlZ2lzdGVyIGluIHRoZSBXaUZpIEJCIGNoaXAKKyAgICBQYXJhbTogCisgICAgICAgcmVnQWRkciAtIHJlZ2lzdGVyIGFkZHJlc3MKKyAgICAgICByZWdWYWx1ZSAtIHZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAgICBSZXR1cm46CisgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsRGJnV3JpdGVSZWdpc3Rlcih3cHRfdWludDMyIHJlZ0FkZHIsIHdwdF91aW50MzIgcmVnVmFsdWUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxEYmdSZWFkTWVtb3J5IC0gIFJlYWQgbWVtb3J5IGZyb20gV2lGaSBCQiBjaGlwIHNwYWNlCisgICAgUGFyYW06IAorICAgICAgIG1lbUFkZHIgLSBhZGRyZXNzIG9mIG1lbW9yeQorICAgICAgIGJ1ZiAtIG91dHB1dCAKKyAgICAgICBsZW4gLSBsZW5ndGggdG8gYmUgcmVhZAorICAgIFJldHVybjoKKyAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxEYmdSZWFkTWVtb3J5KHdwdF91aW50MzIgbWVtQWRkciwgd3B0X3VpbnQ4ICpidWYsIHdwdF91aW50MzIgbGVuKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsRGJnV3JpdGVNZW1vcnkgLSAgV3JpdGUgYSB2YWx1ZSB0byB0aGUgbWVtb3J5IGluIHRoZSBXaUZpIEJCIGNoaXAgc3BhY2UKKyAgICBQYXJhbTogCisgICAgICAgbWVtQWRkciAtIG1lbW9yeSBhZGRyZXNzCisgICAgICAgYnVmIC0gdmxhdWUgdG8gYmUgd3JpdHRlbgorICAgICAgIGxlbiAtIGxlbmd0aCBvZiBidWYKKyAgICBSZXR1cm46CisgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsRGJnV3JpdGVNZW1vcnkod3B0X3VpbnQzMiBtZW1BZGRyLCB3cHRfdWludDggKmJ1Ziwgd3B0X3VpbnQzMiBsZW4pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxEcml2ZXJTaHV0ZG93biAtICBTaHV0ZG93biBXTEFOIGRyaXZlcgorCisgICAgVGhpcyBBUEkgaXMgcmVxdWllZCBieSBTU1IsIGNhbGwgaW4gdG8gJ1ZPUyBzaHV0ZG93bicgdG8gc2h1dGRvd24gV0xBTiAKKyAgICBkcml2ZXIgd2hlbiBSaXZhIGNyYXNoZXMuCisKKyAgICBQYXJhbTogCisgICAgICAgTm9uZQorICAgIFJldHVybjoKKyAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxEcml2ZXJTaHV0ZG93bih2b2lkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsRHJpdmVyU2h1dGRvd24gLSAgUmUtaW5pdCBXTEFOIGRyaXZlcgorCisgICAgVGhpcyBBUEkgaXMgcmVxdWllZCBieSBTU1IsIGNhbGwgaW4gdG8gJ1ZPUyByZS1pbml0JyB0byByZS1pbml0IFdMQU4KKyAgICBkcml2ZXIuCisKKyAgICBQYXJhbTogCisgICAgICAgTm9uZQorICAgIFJldHVybjoKKyAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxEcml2ZXJSZUluaXQodm9pZCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbFJpdmFTdWJ5c3RlbVJlc3RhcnQgLSAgSW5pdGlhdGUgUml2YSBTU1IKKworICAgIFRoaXMgQVBJIGlzIGNhbGxlZCBieSBXTEFOIGRyaXZlciB0byBpbml0aWF0ZSBSaXZhIFNTUgorCisgICAgUGFyYW06CisgICAgICAgTm9uZQorICAgIFJldHVybjoKKyAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxSaXZhU3VieXN0ZW1SZXN0YXJ0KHZvaWQpOworCisjZW5kaWYgLy8gX19XTEFOX1FDVF9QQUxfQVBJX0gKZGlmZiAtLWdpdCBhL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X3BhbF9kZXZpY2UuaCBiL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X3BhbF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2UzOTVlCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX2RldmljZS5oCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBXTEFOX1FDVF9QQUxfREVWSUNFX0gKKyNkZWZpbmUgV0xBTl9RQ1RfUEFMX0RFVklDRV9ICisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBAZmlsZSAgIHdsYW5fcWN0X3BhbF9kZXZpY2UuaAorCisgICBAYnJpZWYKKyAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGV4dGVybmFsIEFQSSBleHBvc2VkIGJ5IFdMQU4gUEFMIERldmljZSBzcGVjaWZpYyBmdW5jdGlvbmFsaXRpZXMKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEgUXVhbGNvbW0gSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkCisgICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wZXJpZXRhcnkKKworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQorCisgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KKyAgIE5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIKKworICAgV2hlbiAgICAgICAgICAgICBXaG8gICAgICAgICAgICAgICAgIFdoYXQsIFdoZXJlLCBXaHkKKyAgIC0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBGRUIvMDcvMTEgICAgICAgIHNjaCAgICAgICAgICAgICAgICAgQ3JlYXRlIG1vZHVsZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMgRk9SIE1PRFVMRVMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3R5cGUuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfc3RhdHVzLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3RyYWNlLmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICBQUkVQUk9DRVNTT1JTIEFORCBERUZJTklUSU9OUworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgICAgIERYRV9JTlRFUlJVUFRfVFhfQ09NUExFICAgICAgMHgwMgorI2RlZmluZSAgICAgRFhFX0lOVEVSUlVQVF9SWF9SRUFEWSAgICAgICAweDA0CisjZGVmaW5lICAgICBXUEFMX0lTUl9DTElFTlRfTUFYICAgICAgICAgIDB4MDgKKworI2RlZmluZSAgICAgV1BBTF9TTVNNX1dMQU5fVFhfRU5BQkxFICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgICAgIFdQQUxfU01TTV9XTEFOX1RYX1JJTkdTX0VNUFRZICAgICAweDAwMDAwMjAwCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEAgIEZ1bmN0aW9uIE5hbWUgCisgICAgICB3cGFsSXNyVHlwZQorCisgIEAgIERlc2NyaXB0aW9uIAorICAgICAgRFhFIElTUiBmdW5jdGlvIHByb3RvdHlwZQorICAgICAgRFhFIHNob3VsZCByZWdpc3RlciBJU1IgZnVuY3Rpb24gaW50byBwbGF0Zm9ybQorCisgIEAgIFBhcmFtZXRlcnMKKyAgICAgIHBWb2lkICAgICAgICAgICAgICAgICAgICAgICBwRFhFQ29udGV4dCA6IERYRSBtb2R1bGUgY29udHJvbCBibG9jaworCisgIEAgIFJldHVybgorICAgICAgTk9ORQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3R5cGVkZWYgdm9pZCAoKiB3cGFsSXNyVHlwZSkodm9pZCAqdXNyQ3R4dCk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICBHTE9CQUwgRlVOQ1RJT05TCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEAgRnVuY3Rpb24gTmFtZQorCisgICBAIERlc2NyaXB0aW9uCisKKyAgIEAgQXJndW1lbnRzCisKKyAgIEAgUmV0dXJuIHZhbHVlCisKKyAgIEAgTm90ZQorCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLword3B0X3N0YXR1cyB3cGFsRGV2aWNlSW5pdAorKAorICAgdm9pZCAgICAgICAgICAgICAgICAgKmRldmljZUNCCispOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgQCBGdW5jdGlvbiBOYW1lCisKKyAgIEAgRGVzY3JpcHRpb24KKworICAgQCBBcmd1bWVudHMKKworICAgQCBSZXR1cm4gdmFsdWUKKworICAgQCBOb3RlCisKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit3cHRfc3RhdHVzIHdwYWxEZXZpY2VDbG9zZQorKAorICAgdm9pZCAgICAgICAgICAgICAgICAgKmRldmljZUMKKyk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICBDTElFTlQgU0VSVklDRSBFWFBPU0UgRlVOQ1RJT05TIEdFTkVSSUMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoqCisgIEBicmllZiB3cGFsUmVnaXN0ZXJJbnRlcnJ1cHQgcHJvdmlkZXMgYSBtZWNoYW5zaW0gZm9yIGNsaWVudAorICAgICAgICAgdG8gcmVnaXN0ZXIgc3VwcG9ydCBmb3IgYSBnaXZlbiBpbnRlcnJ1cHQKKworICBUaGUgRFhFIGludGVyZmFjZSBzdXBwb3J0cyB0d28gaW50ZXJydXB0cywgVFggQ29tcGxldGUgYW5kIFJYCisgIEF2YWlsYWJsZS4gIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHRoZSBtZWNoYW5pc20gd2hlcmVieSBhIGNsaWVudAorICBjYW4gcmVnaXN0ZXIgdG8gc3VwcG9ydCBvbmUgb2YgdGhlc2UuICBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBjb3JlCisgIERYRSBpbXBsZW1lbnRhdGlvbiB3aWxsIGludm9rZSB0aGlzIEFQSSB0d2ljZSwgb25jZSBmb3IgZWFjaCBpbnRlcnJ1cHQuCisgIAorICBAcGFyYW0gIGludFR5cGU6ICAgICAgICAgIEVudW1lcmF0aW9uIG9mIHRoZSBpbnRlcnJ1cHQgdHlwZSAoVFggb3IgUlgpCisgIEBwYXJhbSAgY2FsbGJhY2tGdW5jdGlvbjogSVNSIGZ1bmN0aW9uIHBvaW50ZXIKKyAgQHBhcmFtICB1c3JDdHh0OiAgICAgICAgICBVc2VyIGNvbnRleHQgcGFzc2VkIGJhY2sgd2hlbmV2ZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tGdW5jdGlvbiBpcyBpbnZva2VkCisKKyAgQHJldHVybiBTVUNDRVNTIGlmIHRoZSByZWdpc3RyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyovCit3cHRfc3RhdHVzIHdwYWxSZWdpc3RlckludGVycnVwdAorKAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFR5cGUsCisgICB3cGFsSXNyVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tGdW5jdGlvbiwKKyAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1c3JDdHh0CispOworCisvKioKKyAgQGJyaWVmIHdwYWxVblJlZ2lzdGVySW50ZXJydXB0IHByb3ZpZGVzIGEgbWVjaGFuc2ltIGZvciBjbGllbnQKKyAgICAgICAgIHRvIHVuLXJlZ2lzdGVyIGZvciBhIGdpdmVuIGludGVycnVwdAorCisgIFdoZW4gRFhFIHN0b3AsIHJlbW92ZSByZWdpc3RlcmVkIGluZm9ybWF0aW9uIGZyb20gUEFMCisgIAorICBAcGFyYW0gIGludFR5cGU6ICAgICAgICAgIEVudW1lcmF0aW9uIG9mIHRoZSBpbnRlcnJ1cHQgdHlwZSAoVFggb3IgUlgpCisKKyAgQHJldHVybiBOT05FCisqLworCit2b2lkIHdwYWxVblJlZ2lzdGVySW50ZXJydXB0CisoCisgICB3cHRfdWludDMyICAgICAgaW50VHlwZQorKTsKKworLyoqCisgIEBicmllZiB3cGFsRW5hYmxlSW50ZXJydXB0IHByb3ZpZGVzIGEgbWVjaGFuc2ltIGZvciBhIGNsaWVudAorICAgICAgICAgdG8gcmVxdWVzdCB0aGF0IGEgZ2l2ZW4gaW50ZXJydXB0IGJlIGVuYWJsZWQKKworICBUaGUgRFhFIGludGVyZmFjZSBzdXBwb3J0cyB0d28gaW50ZXJydXB0cywgVFggQ29tcGxldGUgYW5kIFJYCisgIEF2YWlsYWJsZS4gIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHRoZSBtZWNoYW5pc20gd2hlcmVieSBhIGNsaWVudAorICBjYW4gcmVxdWVzdCB0aGF0IHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBhZGFwdGF0aW9uIGxheWVyIGFsbG93cyBhCisgIGdpdmVuIGludGVycnVwdCB0byBvY2N1ci4gIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGlmIGEgZ2l2ZW4KKyAgaW50ZXJydXB0IGlzIG5vdCBlbmFibGVkLCBpZiB0aGUgaW50ZXJydXB0IG9jY3VycyB0aGVuIHRoZSBBUFBTIENQVQorICB3aWxsIG5vdCBiZSBpbnRlcnJ1cHRlZC4KKyAgCisgIEBwYXJhbSAgaW50VHlwZTogICAgICAgICAgRW51bWVyYXRpb24gb2YgdGhlIGludGVycnVwdCB0eXBlIChUWCBvciBSWCkKKworICBAcmV0dXJuIFNVQ0NFU1MgaWYgdGhlIGludGVycnVwdCB3YXMgZW5hYmxlZAorKi8KK3dwdF9zdGF0dXMgd3BhbEVuYWJsZUludGVycnVwdAorKAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50VHlwZQorKTsKKworLyoqCisgIEBicmllZiB3cGFsRGlzYWJsZUludGVycnVwdCBwcm92aWRlcyBhIG1lY2hhbnNpbSBmb3IgYSBjbGllbnQKKyAgICAgICAgIHRvIHJlcXVlc3QgdGhhdCBhIGdpdmVuIGludGVycnVwdCBiZSBkaXNhYmxlZAorCisgIFRoZSBEWEUgaW50ZXJmYWNlIHN1cHBvcnRzIHR3byBpbnRlcnJ1cHRzLCBUWCBDb21wbGV0ZSBhbmQgUlgKKyAgQXZhaWxhYmxlLiAgVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIG1lY2hhbmlzbSB3aGVyZWJ5IGEgY2xpZW50CisgIGNhbiByZXF1ZXN0IHRoYXQgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGFkYXB0YXRpb24gbGF5ZXIgbm90IGFsbG93IGEKKyAgZ2l2ZW4gaW50ZXJydXB0IHRvIG9jY3VyLiAgVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQgaWYgYSBnaXZlbgorICBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQsIGlmIHRoZSBpbnRlcnJ1cHQgb2NjdXJzIHRoZW4gdGhlIEFQUFMgQ1BVCisgIHdpbGwgbm90IGJlIGludGVycnVwdGVkLgorICAKKyAgQHBhcmFtICBpbnRUeXBlOiAgICAgICAgICBFbnVtZXJhdGlvbiBvZiB0aGUgaW50ZXJydXB0IHR5cGUgKFRYIG9yIFJYKQorCisgIEByZXR1cm4gU1VDQ0VTUyBpZiB0aGUgaW50ZXJydXB0IHdhcyBkaXNhYmxlZAorKi8KK3dwdF9zdGF0dXMgd3BhbERpc2FibGVJbnRlcnJ1cHQKKygKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRUeXBlCispOworCisvKioKKyAgQGJyaWVmIHdwYWxXcml0ZVJlZ2lzdGVyIHByb3ZpZGVzIGEgbWVjaGFuc2ltIGZvciBhIGNsaWVudAorICAgICAgICAgdG8gd3JpdGUgZGF0YSBpbnRvIGEgaGFyZHdhcmUgZGF0YSByZWdpc3RlcgorCisgIEBwYXJhbSAgYWRkcmVzczogIFBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSByZWdpc3RlcgorICBAcGFyYW0gIGRhdGE6ICAgICBEYXRhIHZhbHVlIHRvIGJlIHdyaXR0ZW4KKworICBAcmV0dXJuIFNVQ0NFU1MgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSB3cml0dGVuCisqLword3B0X3N0YXR1cyB3cGFsUmVhZFJlZ2lzdGVyCisoCisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhCispOworCisvKioKKyAgQGJyaWVmIHdwYWxSZWFkUmVnaXN0ZXIgcHJvdmlkZXMgYSBtZWNoYW5zaW0gZm9yIGEgY2xpZW50CisgICAgICAgICB0byByZWFkIGRhdGEgZnJvbSBhIGhhcmR3YXJlIGRhdGEgcmVnaXN0ZXIKKworICBAcGFyYW0gIGFkZHJlc3M6ICBQaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIKKyAgQHBhcmFtICBkYXRhOiAgICAgUmV0dXJuIGxvY2F0aW9uIGZvciB2YWx1ZSB0aGF0IGlzIHJlYWQKKworICBAcmV0dXJuIFNVQ0NFU1MgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkCisqLword3B0X3N0YXR1cyB3cGFsV3JpdGVSZWdpc3RlcgorKAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQorKTsKKworLyoqCisgIEBicmllZiB3cGFsUmVhZERldmljZU1lbW9yeSBwcm92aWRlcyBhIG1lY2hhbnNpbSBmb3IgYSBjbGllbnQKKyAgICAgICAgIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBoYXJkd2FyZSBhZGRyZXNzIHNwYWNlCisKKyAgQHBhcmFtICBhZGRyZXNzOiAgU3RhcnQgYWRkcmVzcyBvZiBwaHlzaWNhbCBtZW1vcnkgdG8gYmUgcmVhZAorICBAcGFyYW0gIGRfYnVmZmVyOiBWaXJ0dWFsIGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gd2hpY2ggdGhlCisgICAgICAgICAgICAgICAgICAgIGRhdGEgd2lsbCBiZSB3cml0dGVuCisgIEBwYXJhbSAgbGVuOiAgICAgIE51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGJlIHJlYWQKKworICBAcmV0dXJuIFNVQ0NFU1MgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkCisqLword3B0X3N0YXR1cyB3cGFsUmVhZERldmljZU1lbW9yeQorKAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgd3B0X3VpbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICpEZXN0QnVmZmVyLAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4KKyk7CisKKy8qKgorICBAYnJpZWYgd3BhbFdyaXRlRGV2aWNlTWVtb3J5IHByb3ZpZGVzIGEgbWVjaGFuc2ltIGZvciBhIGNsaWVudAorICAgICAgICAgdG8gd3JpdGUgZGF0YSBpbnRvIHRoZSBoYXJkd2FyZSBhZGRyZXNzIHNwYWNlCisKKyAgQHBhcmFtICBhZGRyZXNzOiAgU3RhcnQgYWRkcmVzcyBvZiBwaHlzaWNhbCBtZW1vcnkgdG8gYmUgd3JpdHRlbgorICBAcGFyYW0gIHNfYnVmZmVyOiBWaXJ0dWFsIHNvdXJjZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIGRhdGEgd2lsbAorICAgICAgICAgICAgICAgICAgICBiZSByZWFkCisgIEBwYXJhbSAgbGVuOiAgICAgIE51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGJlIHdyaXR0ZW4KKworICBAcmV0dXJuIFNVQ0NFU1MgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSB3cml0dGVuCisqLword3B0X3N0YXR1cyB3cGFsV3JpdGVEZXZpY2VNZW1vcnkKKygKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgIHdwdF91aW50OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3JjQnVmZmVyLAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4KKyk7CisKKy8qKgorICBAYnJpZWYgd3BhbE5vdGlmeVNtc20gcHJvdmlkZXMgYSBtZWNoYW5zaW0gZm9yIGEgY2xpZW50IHRvIAorICAgICAgICAgbm90aWZ5IFNNU00gdG8gc3RhcnQgRFhFIGVuZ2luZSBhbmQvb3IgY29uZGl0aW9uIG9mIFR4CisgICAgICAgICByaW5nIGJ1ZmZlcgorCisgIEBwYXJhbSAgY2xyU3Q6ICAgYml0KHMpIHRvIGJlIGNsZWFyZWQgb24gdGhlIE1BU0sgCisgIEBwYXJhbSAgc2V0U3Q6ICAgYml0KHMpIHRvIGJlIHNldCBvbiB0aGUgTUFTSworCisgIEByZXR1cm4gU1VDQ0VTUyBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwKKyovCit3cHRfc3RhdHVzIHdwYWxOb3RpZnlTbXNtCisoCisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsclN0LAorICAgd3B0X3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdAorKTsKKworLyoqCisgIEBicmllZiB3cGFsQWN0aXZhdGVSeEludGVycnVwdCBhY3RpdmF0ZXMgd3BhbFJ4SXNyCisKKyAgQHBhcmFtICBOT05FCisKKyAgQHJldHVybiBOT05FCisqLwordm9pZCB3cGFsQWN0aXZhdGVSeEludGVycnVwdCh2b2lkKTsKKworLyoqCisgIEBicmllZiB3cGFsSW5hY3RpdmF0ZVJ4SW50ZXJydXB0IGluYWN0aXZhdGVzIHdwYWxSeElzcgorCisgIEBwYXJhbSAgTk9ORQorCisgIEByZXR1cm4gTk9ORQorKi8KK3ZvaWQgd3BhbEluYWN0aXZhdGVSeEludGVycnVwdCh2b2lkKTsKKworI2VuZGlmIC8qIFdMQU5fUUNUX1BBTF9ERVZJQ0VfSCovCmRpZmYgLS1naXQgYS9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWxfbGlzdC5oIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmYwYWExCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX2xpc3QuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1dMQU5fUUNUX1BBTF9MSVNUX0ggKQorI2RlZmluZSBfX1dMQU5fUUNUX1BBTF9MSVNUX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHdsYW5fcWN0X3BhbF9saXN0LmgKKyAgCisgIFxicmllZiBkZWZpbmUgbGlua2VkIGxpc3QgUEFMIGV4cG9ydHMuIHdwdCA9IChXbGFuIFBhbCBUeXBlKSB3cGFsID0gKFdsYW4gUEFMKQorICAgICAgICAgICAgICAgCisgICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQuIAorICAKKyAgIENvcHlyaWdodCAyMDEwIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ3bGFuX3FjdF9vc19saXN0LmgiCisKKworI2VuZGlmIC8vIF9fV0xBTl9RQ1RfUEFMX0xJU1RfSApkaWZmIC0tZ2l0IGEvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX21zZy5oIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjFjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWxfbXNnLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19XTEFOX1FDVF9QQUxfTVNHX0ggKQorI2RlZmluZSBfX1dMQU5fUUNUX1BBTF9NU0dfSAorCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgd2xhbl9xY3RfcGFsX21zZy5oCisgIAorICBcYnJpZWYgZGVmaW5lIGdlbmVyYWwgbWVzc2FnZSBBUElzIFBBTCBleHBvcnRzIHRvIHN1cHBvcnQgbGVnYWN5IFVNQUMuIAorICAgd3B0ID0gKFdsYW4gUGFsIFR5cGUpIHdwYWwgPSAoV2xhbiBQQUwpCisgICAgICAgICAgICAgICAKKyAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBkZXBlbmRlbnQuIE9ubHkgd29yayB3aXRoIGxlZ2FjeSBVTUFDLgorICAKKyAgIENvcHlyaWdodCAyMDEwIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zdGF0dXMuaCIKKwordHlwZWRlZiBzdHJ1Y3Qgc3dwdF9tc2cgd3B0X21zZzsKKwordHlwZWRlZiB2b2lkICgqd3BhbF9tc2dfY2FsbGJhY2spKHdwdF9tc2cgKnBNc2cpOworCitzdHJ1Y3Qgc3dwdF9tc2cKK3sKKyAgIHdwdF91aW50MTYgdHlwZTsKKyAgIHdwdF91aW50MTYgcmVzZXJ2ZWQ7CisgICB2b2lkICpwdHI7CisgICB3cHRfdWludDMyIHZhbDsKKyAgIHdwYWxfbXNnX2NhbGxiYWNrIGNhbGxiYWNrOworICAgdm9pZCAqcENvbnRleHQ7Cit9OyAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgd3BhbFBvc3RDdHJsTXNnIJYgUG9zdCBhIG1lc3NhZ2UgdG8gY29udHJvbCBjb250ZXh0IHNvIGl0IGNhbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHByb2Nlc3NlZCBpbiB0aGF0IGNvbnRleHQuCisgICBQYXJhbTogCisgICAgICBwUGFsQ29udGV4dCCWIEEgUEFMIGNvbnRleHQKKyAgICAgIHBNc2cgliBhIHBvaW50ZXIgdG8gY2FsbGVkIGFsbG9jYXRlZCBvYmplY3Q7IENhbGxlciByZXRhaW4gdGhlIG93bmVyc2hpcCAKKyAgICAgICAgICAgICBhZnRlciB0aGlzIEFQSSByZXR1cm5zLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFBvc3RDdHJsTXNnKHZvaWQgKnBQYWxDb250ZXh0LCB3cHRfbXNnICpwTXNnKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgd3BhbFBvc3RUeE1zZyCWIFBvc3QgYSBtZXNzYWdlIHRvIFRYIGNvbnRleHQgc28gaXQgY2FuIGJlIHByb2Nlc3NlZCBpbiB0aGF0IGNvbnRleHQuCisgICBQYXJhbTogCisgICAgICBwUGFsQ29udGV4dCCWIEEgUEFMIGNvbnRleHQKKyAgICAgIHBNc2cgliBhIHBvaW50ZXIgdG8gY2FsbGVkIGFsbG9jYXRlZCBvYmplY3Q7IENhbGxlciByZXRhaW4gdGhlIG93bmVyc2hpcCAKKyAgICAgICAgICAgICBhZnRlciB0aGlzIEFQSSByZXR1cm5zLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFBvc3RUeE1zZyh2b2lkICpwUGFsQ29udGV4dCwgd3B0X21zZyAqcE1zZyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB3cGFsUG9zdFJ4TXNnIJYgUG9zdCBhIG1lc3NhZ2UgdG8gUlggY29udGV4dCBzbyBpdCBjYW4gYmUgcHJvY2Vzc2VkIGluIHRoYXQgY29udGV4dC4KKyAgIFBhcmFtOiAKKyAgICAgIHBQYWxDb250ZXh0IJYgQSBQQUwgY29udGV4dAorICAgICAgcE1zZyCWIGEgcG9pbnRlciB0byBjYWxsZWQgYWxsb2NhdGVkIG9iamVjdDsgQ2FsbGVyIHJldGFpbiB0aGUgb3duZXJzaGlwIAorICAgICAgICAgICAgIGFmdGVyIHRoaXMgQVBJIHJldHVybnMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsUG9zdFJ4TXNnKHZvaWQgKnBQYWxDb250ZXh0LCB3cHRfbXNnICpwTXNnKTsKKworCisKKyNlbmRpZiAvLyBfX1dMQU5fUUNUX1BBTF9BUElfSApkaWZmIC0tZ2l0IGEvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX3BhY2tldC5oIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjM1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWxfcGFja2V0LmgKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfUEFMX1BBQ0tFVF9IICkKKyNkZWZpbmUgX19XTEFOX1FDVF9QQUxfUEFDS0VUX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHdsYW5fcWN0X3BhbF9wYWNrZXQuaAorICAKKyAgXGJyaWVmIGRlZmluZSBQQUwgcGFja2V0LiB3cHQgPSAoV2xhbiBQYWwgVHlwZSkKKyAgICAgICAgICAgICAgIAorICAgRGVmaW5pdGlvbnMgZm9yIHBsYXRmb3JtIGluZGVwZW5kZW50LgorICAKKyAgIENvcHlyaWdodCAyMDEwIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zdGF0dXMuaCIKKworLy8gVGhlIHNpemUgb2YgdGhlIGRhdGEgYnVmZmVyIGluIHZvcy9wYWwgcGFja2V0cworLy8gRXhwbGFuYXRpb246CisvLyBNVFUgc2l6ZSAgPSAxNTAwIGJ5dGVzCisvLyBNYXggbnVtYmVyIG9mIEJEL1BEVXMgcmVxdWlyZWQgdG8gaG9sZCBwYXlsb2FkIG9mIDE1MDAgPQorLy8gICAxMiBQRFVzICgxMjQgYnl0ZXMgZWFjaCkgKyAxIEJEICgxMiBieXRlcyBmb3IgcGF5bG9hZCkgPQorLy8gICAxMyBCRC9QRFVzID0gMTMgeCAxMjggPSAxNjY0IGJ5dGVzCisvLworLy8gSW4gY2FzZSBvZiBBLU1TRFUgd2l0aCBlYWNoIE1TRFUgaGF2aW5nIHBheWxvYWQgb2YgMTUwMCBieXRlczoKKy8vICAgMXN0IE1TRFUgPSByZXF1aXJlcyAxMyBCRC9QRFVzIGFzIHBlciB0aGUgYWJvdmUgZXF1YXRpb24uCisvLyAgIDJuZCBNU0RVID0gSFcgaW5zZXJ0cyBhbiBleHRyYSBCRCB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgMm5kCisvLyAgIE1TRFUgYW5kIHRoZSBwYXlsb2FkIHBvcnRpb24gb2YgdGhpcyBCRCBpcyB1bnVzZWQgd2hpY2ggbWVhbnMgdG8gY292ZXIKKy8vICAgMTUwMCBieXRlcyB3ZSByZXF1aXJlIDEzIFBEVXMuCisvLyAgIFNvIDEzIFBEVXMgKyAxIEJEID0gMTQgQkQvUERVcyA9IDE3OTIgYnl0ZXMuCisvLworLy8gSE9XRVZFUgorLy8gSW4gY2FzZSBvZiBBLU1TRFUgd2l0aCBlcnJvcnMsIHRoZSBBRFUgd2lsbCBwdXNoIHRvIHRoZSBob3N0IHVwIHRvCisvLyAyMzQ2IGJ5dGVzLiAgSWYgdGhhdCBpcyB0aGUgMm5kIG9yIGxhdGVyIE1TRFUgdGhlIHdvcnN0IGNhc2UgaXM6CisvLyAgIDEgUHJlcGVuZGVkIEJEL1BEVQorLy8gICAxIEJEL1BEVSBjb250YWluaW5nIHRoZSAxc3QgNCBieXRlcyBvZiB0aGUgZGVsaW1pdGVyCisvLyAgIDEgQkQvUERVIGNvbnRhaW5pbmcgdGhlIGxhc3QgMTAgYnl0ZXMgb2YgdGhlIGRlbGltaXRlcgorLy8gICAgIHBsdXMgdGhlIGZpcnN0IDExNCBvZiB0aGUgcGF5bG9hZAorLy8gICAxOCBCRC9QRFVzIGNvbnRhaW5pbmcgdGhlIHJlbWFpbmluZyAyMjMyIGJ5dGVzIG9mIHRoZSBwYXlsb2FkCisvLyAgICAgMjM0NiAtIDExNCA9IDIyMzI7IDIyMzIgLyAxMjQgPSAxOAorLy8gICBTbyAyMSBCRC9QRFVzIGFyZSByZXF1aXJlZAorI2RlZmluZSBWUEtUX1NJWkVfQlVGRkVSICAoMjEgKiAxMjgpCisKK3R5cGVkZWYgZW51bQoreworICAgLy8vUGFja2V0IGlzIHVzZWQgdG8gdHJhbnNtaXQgODAyLjExIE1hbmFnZW1lbnQgZnJhbWVzLgorICAgZVdMQU5fUEFMX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01ULAorICAgLy8vUGFja2V0IGlzIHVzZWQgdG8gdHJhbnNtaXQgODAyLjExIERhdGEgZnJhbWVzLgorICAgZVdMQU5fUEFMX1BLVF9UWVBFX1RYXzgwMl8xMV9EQVRBLAorICAgLy8vUGFja2V0IGlzIHVzZWQgdG8gdHJhbnNtaXQgODAyLjMgRGF0YSBmcmFtZXMuCisgICBlV0xBTl9QQUxfUEtUX1RZUEVfVFhfODAyXzNfREFUQSwKKyAgIC8vL1BhY2tldCBjb250YWlucyBSZWNlaXZlZCBkYXRhIG9mIGFuIHVua25vd24gZnJhbWUgdHlwZQorICAgZVdMQU5fUEFMX1BLVF9UWVBFX1JYX1JBVworfSB3cHRfcGFja2V0X3R5cGU7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc3dwdF9wYWNrZXQKK3sKKyAgIC8qCisgICBQb2ludGVyIHRvIGEgYnVmZmVyIGZvciBCRCBmb3IgVFggcGFja2V0cworICAgRm9yIFJYIHBhY2tldHMuIFRoZSBwQkQgTVVTVCBzZXQgdG8gTlVMTC4KKyAgIFBBTCBwYWNrZXQgc2hhbGwgc2V0IHRoZSBwb2ludGVyIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgZmxhdCBidWZmZXIKKyAgIHdoZXJlIHRoZSBCRCBzdGFydHMuCisgICAqLworICAgdm9pZCAqcEJEOworICAgLy9QaHlzaWNhbCBhZGRyZXNzIGZvciBwQkQgZm9yIERNQS1hYmxlIGRldmljZXMKKyAgIHZvaWQgKnBCRFBoeXM7IAorICAgLy9PUyBkZXBlbmRlbnQgc3RydWN1dHJlIHVzZWQgb25seSBieSBPUyBzcGVjaWZpYyBjb2RlLgorICAgdm9pZCAqcE9TU3RydWN0OyAgCisgICB2b2lkICpwa3RNZXRhSW5mbzsKKyAgIHdwdF9wYWNrZXRfdHlwZSBwa3RUeXBlOworICAgLy9UaGUgbnVtYmVyIG9mIGJ5dGVzIHBCRCB1c2VzLiBJdCBNVVNUIGJlIHNldCB0byAwIGZvciBSWCBwYWNrZXRzCisgICB3cHRfdWludDE2IEJETGVuZ3RoOworCisgICAvL0ludGVybmFsIGRhdGEgZm9yIFBBTCBwYWNrZXQgaW1wbGVtZW50YXRpb24gdXNhZ2Ugb25seQorICAgdm9pZCAqcEludGVybmFsRGF0YTsgCit9IHdwdF9wYWNrZXQ7CisKK3R5cGVkZWYgc3RydWN0IHN3cHRfaXRlcmF0b3IKK3sKKyAgIHZvaWQgKnBOZXh0OyAgCisgICB2b2lkICpwQ3VyOworICAgdm9pZCAqcENvbnRleHQ7Cit9IHdwdF9pdGVyYXRvcjsKKworCisvL3BQa3QgaXMgYSBwb2ludGVyIHRvIHdwdF9wYWNrZXQKKyNkZWZpbmUgV1BBTF9QQUNLRVRfU0VUX0JEX1BPSU5URVIocFBrdCwgcEJkKSAgICggKHBQa3QpLT5wQkQgPSAocEJkKSApCisjZGVmaW5lIFdQQUxfUEFDS0VUX0dFVF9CRF9QT0lOVEVSKHBQa3QpICAoIChwUGt0KS0+cEJEICkKKy8vQWNjZXNzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIEJECisjZGVmaW5lIFdQQUxfUEFDS0VUX1NFVF9CRF9QSFlTKHBQa3QsIHBCZFBoeXMpICAgKCAocFBrdCktPnBCRFBoeXMgPSAocEJkUGh5cykgKQorI2RlZmluZSBXUEFMX1BBQ0tFVF9HRVRfQkRfUEhZUyhwUGt0KSAgKCAocFBrdCktPnBCRFBoeXMgKQorI2RlZmluZSBXUEFMX1BBQ0tFVF9TRVRfQkRfTEVOR1RIKHBQa3QsIGxlbikgICAoIChwUGt0KS0+QkRMZW5ndGggPSAobGVuKSApCisjZGVmaW5lIFdQQUxfUEFDS0VUX0dFVF9CRF9MRU5HVEgocFBrdCkgICggKHBQa3QpLT5CRExlbmd0aCApCisjZGVmaW5lIFdQQUxfUEFDS0VUX1NFVF9NRVRBSU5GT19QT0lOVEVSKHBQa3QsIHApICggKHBQa3QpLT5wa3RNZXRhSW5mbyA9IChwKSApCisjZGVmaW5lIFdQQUxfUEFDS0VUX0dFVF9NRVRBSU5GT19QT0lOVEVSKHBQa3QpICggKHBQa3QpLT5wa3RNZXRhSW5mbyApCisjZGVmaW5lIFdQQUxfUEFDS0VUX1NFVF9UWVBFKHBQa3QsIHR5cGUpICAoIChwUGt0KS0+cGt0VHlwZSA9ICh0eXBlKSApCisjZGVmaW5lIFdQQUxfUEFDS0VUX0dFVF9UWVBFKHBQa3QpICAoIChwUGt0KS0+cGt0VHlwZSApCisjZGVmaW5lIFdQQUxfUEFDS0VUX1NFVF9PU19TVFJVQ1RfUE9JTlRFUihwUGt0LCBwU3RydWN0KSAgICggKHBQa3QpLT5wT1NTdHJ1Y3QgPSAocFN0cnVjdCkgKQorI2RlZmluZSBXUEFMX1BBQ0tFVF9HRVRfT1NfU1RSVUNUX1BPSU5URVIocFBrdCkgICggKHBQa3QpLT5wT1NTdHJ1Y3QgKQorI2RlZmluZSBXUEFMX1BBQ0tFVF9JU19GTEFUX0JVRihwa3RUeXBlKSAoIChlV0xBTl9QQUxfUEtUX1RZUEVfUlhfUkFXID09IChwa3RUeXBlKSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlV0xBTl9QQUxfUEtUX1RZUEVfVFhfODAyXzExX01HTVQgPT0gKHBrdFR5cGUpKSApCisKKy8qIFJYIFJBVyBwYWNrZXQgYWxsb2MgZmFpbCBkdWUgdG8gb3V0IG9mIHJlc291cmNlIENCIGZ1bmN0aW9uIHR5cGUgKi8KK3R5cGVkZWYgdm9pZCAoICp3cGFsUGFja2V0TG93UGFja2V0Q0IgKSggd3B0X3BhY2tldCAqcFBhY2tldCwgdm9pZCAqdXNyRGF0YSApOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbFBhY2tldEluaXQgliBJbml0aWFsaXplIGFsbCB3cHRfcGFja2V0IHJlbGF0ZWQgb2JqZWN0cy4gQWxsb2NhdGUgbWVtb3J5IGZvciB3cHRfcGFja2V0LiAKKyAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIFRYIG1hbmFnZW1lbnQgZnJhbWVzIGFuZCBSWCBmcmFtZXMuCisgICAgRm9yIG91ciBsZWdhY3kgVU1BQywgaXQgaXMgbm90IG5lZWRlZCBiZWNhdXNlIHZvc19wYWNrZXQgY29udGFpbnMgd3B0X3BhY2tldC4KKyAgICBQYXJhbTogCisgICAgICAgIHBQYWxDb250ZXh0IJYgQSBjb250ZXh0IFBBTCB1c2VzPz8KKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtLSBzdWNjZXNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsUGFja2V0SW5pdCh2b2lkICpwUGFsQ29udGV4dCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbFBhY2tldENsb3NlIJYgRnJlZSBhbGwgYWxsb2NhdGVkIHJlc291cmNlIGJ5IHdwYWxQYWNrZXRJbml0LgorICAgIEZvciBvdXIgbGVnYWN5IFVNQUMsIGl0IGlzIG5vdCBuZWVkZWQgYmVjYXVzZSB2b3NfcGFja2V0IGNvbnRhaW5zIHBhbF9wYWNrZXQuCisgICAgUGFyYW06IAorICAgICAgICBwUGFsQ29udGV4dCCWIEEgY29udGV4dCBQQUwgdXNlcz8/CisgICAgUmV0dXJuOgorICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLS0gc3VjY2VzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFBhY2tldENsb3NlKHZvaWQgKnBQYWxDb250ZXh0KTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxQYWNrZXRBbGxvYyCWIEFsbG9jYXRlIGEgd3B0X3BhY2tldCBmcm9tIFBBTC4KKyAgICBQYXJhbTogCisgICAgICAgIHBQYWxDb250ZXh0IJYgQSBjb250ZXh0IFBBTCB1c2VzPz8KKyAgICAgICAgcGt0VHlwZSCWIHNwZWNpZnkgdGhlIHR5cGUgb2Ygd3B0X3BhY2tldCB0byBhbGxvY2F0ZQorICAgICAgICBuUGt0U2l6ZSAtIHNwZWNpZnkgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcGFja2V0IGJ1ZmZlci4KKyAgICBSZXR1cm46CisgICAgICAgIEEgcG9pbnRlciB0byB0aGUgd3B0X3BhY2tldC4gTlVMTCBtZWFucyBmYWlsLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9wYWNrZXQgKiB3cGFsUGFja2V0QWxsb2Mod3B0X3BhY2tldF90eXBlIHBrdFR5cGUsIHdwdF91aW50MzIgblBrdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwYWxQYWNrZXRMb3dQYWNrZXRDQiByeExvd0NCLCB2b2lkICp1c3JkYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsUGFja2V0RnJlZSCWIEZyZWUgYSB3cHRfcGFja2V0IGNoYWluIGZvciBvbmUgcGFydGljdWxhciB0eXBlLgorICAgIFBhY2tldCB0eXBlIGlzIGNhcnJpZWQgaW4gd3B0X3BhY2tldCBzdHJ1Y3R1cmUuCisgICAgUGFyYW06IAorICAgICAgICBwUGFsQ29udGV4dCCWIEEgY29udGV4dCBQQUwgdXNlcz8/CisgICAgICAgIHBQa3QgLSBwb2ludGVyIHRvIGEgcGFja2V0IHRvIGJlIGZyZWVkLgorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2VzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFBhY2tldEZyZWUod3B0X3BhY2tldCAqcFBrdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbFBhY2tldEdldExlbmd0aCCWIEdldCBudW1iZXIgb2YgYnl0ZXMgaW4gYSB3cHRfcGFja2V0LgorICAgIFBhcmFtOiAKKyAgICAgICAgcFBhbENvbnRleHQgliBQQUwgY29udGV4dCByZXR1cm5lZCBmcm9tIFBBTCBvcGVuCisgICAgICAgIHBQa3QgLSBwb2ludGVyIHRvIGEgcGFja2V0IHRvIGJlIGZyZWVkLgorICAgIFJldHVybjoKKyAgICAgICAgTGVuZ3RoIG9mIHRoZSBkYXRhIGluY2x1ZGUgbGF5ZXItMiBoZWFkZXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZyYW1lIGlzIDgwMi4zLCAKKyAgICAgICAgdGhlIGxlbmd0aCBpbmNsdWRlcyB0aGUgZXRoZXJuZXQgaGVhZGVyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF91aW50MzIgd3BhbFBhY2tldEdldExlbmd0aCh3cHRfcGFja2V0ICpwUGt0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsUGFja2V0UmF3VHJpbUhlYWQgliBNb3ZlIHRoZSBzdGFydGluZyBvZmZzZXQgYW5kIHJlZHVjZSBwYWNrZXQgbGVuZ3RoLgorICAgICAgICAgIFRoZSBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggcmF3IHBhY2tldHMsCisgICAgICAgICAgd2hvc2UgYnVmZmVyIGlzIG9uZSBwaWVjZSBhbmQgYWxsb2NhdGVkIGJ5IFdMQU4gZHJpdmVyLiAKKyAgICBQYXJhbTogCisgICAgICAgIHBQa3QgLSBwb2ludGVyIHRvIGEgd3B0X3BhY2tldC4KKyAgICAgICAgc2l6ZSCWIG51bWJlciBvZiBieXRlcyB0byB0YWtlIG9mZiB0aGUgaGVhZC4KKyAgICBSZXR1cm46CisgICAgICAgIGVXUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsUGFja2V0UmF3VHJpbUhlYWQod3B0X3BhY2tldCAqcFBrdCwgd3B0X3VpbnQzMiBzaXplKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsUGFja2V0UmF3VHJpbVRhaWwgliByZWR1Y2UgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0LiBUaGUgZnVuY3Rpb24gY2FuIAorICAgICAgICAgIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBwYWNrZXRzLCB3aG9zZSBidWZmZXIgaXMgb25lIHBpZWNlIGFuZCAKKyAgICAgICAgICBhbGxvY2F0ZWQgYnkgV0xBTiBkcml2ZXIuIFRoaXMgYWxzbyByZWR1Y2UgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0LgorICAgIFBhcmFtOiAKKyAgICAgICAgcFBrdCAtIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0LgorICAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIHRha2Ugb2YgdGhlIHBhY2tldCBsZW5ndGgKKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyCWIHN1Y2Nlc3MuIE90aGVyd2lzZSBmYWlsLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFBhY2tldFJhd1RyaW1UYWlsKHdwdF9wYWNrZXQgKnBQa3QsIHdwdF91aW50MzIgc2l6ZSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsUGFja2V0R2V0UmF3QnVmIJYgUmV0dXJuIHRoZSBzdGFydGluZyBidWZmZXIncyB2aXJ0dWFsIGFkZHJlc3MgZm9yIHRoZSBSQVcgZmxhdCBidWZmZXIKKyAgICBJdCBpcyBpbmxpbmUgaW4gaG9wZSBvZiBmYXN0ZXIgaW1wbGVtZW50YXRpb24gZm9yIGNlcnRhaW4gcGxhdGZvcm0uCisgICAgUGFyYW06IAorICAgICAgICBwUGt0IC0gcG9pbnRlciB0byBhIHdwdF9wYWNrZXQuCisgICAgUmV0dXJuOgorICAgICAgICBOVUxMIC0gZmFpbC4KKyAgICAgICAgT3RoZXJ3aXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydGluZyBvZiB0aGUgYnVmZmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIFdQVF9JTkxJTkUgd3B0X3VpbnQ4ICp3cGFsUGFja2V0R2V0UmF3QnVmKHdwdF9wYWNrZXQgKnBQa3QpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbFBhY2tldFNldFJ4TGVuZ3RoIJYgU2V0IHRoZSB2YWxpZCBkYXRhIGxlbmd0aCBvbiBhIFJYIHBhY2tldC4gVGhpcyBmdW5jdGlvbiBtdXN0IAorICAgIGJlIGNhbGxlZCBvbmNlIHBlciBSWCBwYWNrZXQgcGVyIHJlY2VpdmluZy4gSXQgaW5kaWNhdGVzIHRoZSBhdmFpbGFibGUgZGF0YSBsZW5ndGggZnJvbQorICAgIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgorICAgIFBhcmFtOiAKKyAgICAgICAgcFBrdCAtIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0LgorICAgIFJldHVybjoKKyAgICAgICAgTlVMTCAtIGZhaWwuCisgICAgICAgIE90aGVyd2lzZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnRpbmcgb2YgdGhlIGJ1ZmZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBXUFRfSU5MSU5FIHdwdF9zdGF0dXMgd3BhbFBhY2tldFNldFJ4TGVuZ3RoKHdwdF9wYWNrZXQgKnBQa3QsIHdwdF91aW50MzIgbGVuKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxJdGVyYXRvckluaXQgliBJbml0aWFsaXplIGFuIGludGVyYXRvciBieSB1cGRhdGluZyBwQ3VyIHRvIGZpcnN0IGl0ZW0uCisgICAgUGFyYW06IAorICAgICAgICBwSXRlciCWIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHdwdF9pdGVyYXRvcgorICAgICAgICBwUGFja2V0IJYgcG9pbnRlciB0byBhIHdwdF9wYWNrZXQKKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxJdGVyYXRvckluaXQod3B0X2l0ZXJhdG9yICpwSXRlciwgd3B0X3BhY2tldCAqcFBhY2tldCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbEl0ZXJhdG9yTmV4dCCWIEdldCB0aGUgYWRkcmVzcyBmb3IgdGhlIG5leHQgaXRlbQorICAgIFBhcmFtOiAKKyAgICAgICAgcEl0ZXIgliBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCB3cHRfaXRlcmF0b3IKKyAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CisgICAgICAgIHBwQWRkciCWIENhbGxlciBhbGxvY2F0ZWQgcG9pbnRlciB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGl0ZW0uIEZvciBETUEtYWJsZSBkZXZpY2VzLCB0aGlzIGlzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBpdGVtLgorICAgICAgICBwTGVuIJYgVG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGl0ZW0uCisgICAgUmV0dXJuOgorICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsSXRlcmF0b3JOZXh0KHdwdF9pdGVyYXRvciAqcEl0ZXIsIHdwdF9wYWNrZXQgKnBQYWNrZXQsIHZvaWQgKipwcEFkZHIsIHdwdF91aW50MzIgKnBMZW4pOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbExvY2tQYWNrZXRGb3JUcmFuc2ZlciCWIFBhY2tldCBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgdHJhbnNmZXIgY2FuIGJlZ2luLAorICAgIHRoZSBsb2NrIHdpbGwgZW5zdXJlIHRoYXQgdGhlIERNQSBlbmdpbmUgaGFzIGFjY2VzcyB0byB0aGUgZGF0YSBwYWNrZXQKKyAgICBpbiBhIGNhY2hlIGNvaGVyZW50IG1hbm5lcgorIAorICAgIFBhcmFtOiAKKyAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CisgCisgICAgUmV0dXJuOgorICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsTG9ja1BhY2tldEZvclRyYW5zZmVyKCB3cHRfcGFja2V0ICpwUGFja2V0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsVW5sb2NrUGFja2V0IJYgT25jZSB0aGUgdHJhbnNmZXIgaGFzIGJlZW4gY29tcGxldGVkIHRoZSBwYWNrZXQgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgIGJlIHVubG9ja2VkIHNvIHRoYXQgbm9ybWFsIG9wZXJhdGlvbiBtYXkgcmVzdW1lCisgICAgUGFyYW06IAorICAgICAgICBwUGFja2V0IJYgcG9pbnRlciB0byBhIHdwdF9wYWNrZXQKKyAKKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxVbmxvY2tQYWNrZXQoIHdwdF9wYWNrZXQgKnBQYWNrZXQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxQYWNrZXRHZXRGcmFnQ291bnQgliBHZXQgY291bnQgb2YgbWVtb3J5IGNoYWlucyAoZnJhZ21lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHBhY2tldAorICAgIFBhcmFtOiAKKyAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CisgCisgICAgUmV0dXJuOgorICAgICAgICBtZW1vcnkgZnJhZ21lbnQgY291bnQgaW4gYSBwYWNrZXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfaW50MzIgd3BhbFBhY2tldEdldEZyYWdDb3VudCh3cHRfcGFja2V0ICpwUGt0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsSXNQYWNrZXRMb2NrZWQgliAgQ2hlY2sgd2hldGhlciB0aGUgUGFja2V0IGlzIGxvY2tlZCBmb3IgRE1BLgorICAgIFBhcmFtOiAKKyAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CisgCisgICAgUmV0dXJuOgorICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkUKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsSXNQYWNrZXRMb2NrZWQoIHdwdF9wYWNrZXQgKnBQYWNrZXQpOworCisjZW5kaWYgLy8gX19XTEFOX1FDVF9QQUxfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X3BhbF9zdGF0dXMuaCBiL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X3BhbF9zdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Y1MzJhCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX3N0YXR1cy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfUEFMX1NUQVRVU19IICkKKyNkZWZpbmUgX19XTEFOX1FDVF9QQUxfU1RBVFVTX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHdsYW5fcWN0X3BhbF9zdGF0dXMuaAorICAKKyAgXGJyaWVmIGRlZmluZSBzdGF0dXMgUEFMIGV4cG9ydHMuIHdwdCA9IChXbGFuIFBhbCBUeXBlKQorICAgICAgICAgICAgICAgCisgICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQuIAorICAKKyAgIENvcHlyaWdodCAyMDEwIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgZW51bQoreworICAgLy8vIFJlcXVlc3Qgc3VjY2VlZGVkIQorICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTLAorICAgCisgICAvLy8gUmVxdWVzdCBmYWlsZWQgYmVjYXVzZSBzeXN0ZW0gcmVzb3VyY2VzIChvdGhlciB0aGFuIG1lbW9yeSkgdG8gCisgICAvLy8gZnVsZmlsbCByZXF1ZXN0IGFyZSBub3QgYXZhaWxhYmxlLiAKKyAgIGVXTEFOX1BBTF9TVEFUVVNfRV9SRVNPVVJDRVMsCisgIAorICAgLy8vIFJlcXVlc3QgZmFpbGVkIGJlY2F1c2Ugbm90IGVub3VnaCBtZW1vcnkgaXMgYXZhaWxhYmxlIHRvIAorICAgLy8vIGZ1bGZpbGwgdGhlIHJlcXVlc3QuCisgICBlV0xBTl9QQUxfU1RBVFVTX0VfTk9NRU0sICAKKyAgICAgIAorICAgLy8vIFJlcXVlc3QgZmFpbGVkIGJlY2F1c2UgdGhlcmUgb2YgYW4gaW52YWxpZCByZXF1ZXN0LiAgVGhpcyBpcyAKKyAgIC8vLyB0eXBpY2FsbHkgdGhlIHJlc3VsdCBvZiBpbnZhbGlkIHBhcmFtZXRlcnMgb24gdGhlIHJlcXVlc3QuCisgICBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUwsCisgICAKKyAgIC8vLyBSZXF1ZXN0IGZhaWxlZCBiZWNhdXNlIGhhbmRsaW5nIHRoZSByZXF1ZXN0IHdvdWxkIGNhdXNlIGEgCisgICAvLy8gc3lzdGVtIGZhdWx0LiAgVGhpcyBlcnJvciBpcyB0eXBpY2FsbHkgcmV0dXJuZWQgd2hlbiBhbiAKKyAgIC8vLyBpbnZhbGlkIHBvaW50ZXIgdG8gbWVtb3J5IGlzIGRldGVjdGVkLgorICAgZVdMQU5fUEFMX1NUQVRVU19FX0ZBVUxULAorCisgICAvLy8gUmVxdWVzdCBmYWlsZWQgYmVjYXVzZSBkZXZpY2Ugb3IgcmVzb3VyY2UgaXMgYnVzeS4gCisgICBlV0xBTl9QQUxfU1RBVFVTX0VfQlVTWSwKKworICAgLy8vIFJlcXVlc3QgZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIGl0IHdhcyBjYW5jZWxlZC4KKyAgIGVXTEFOX1BBTF9TVEFUVVNfRV9DQU5DRUxFRCwKKworICAgLy8vIFJlcXVlc3QgZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIGl0IHdhcyBhYm9ydGVkLgorICAgZVdMQU5fUEFMX1NUQVRVU19FX0FCT1JURUQsCisgICAKKyAgIC8vLyBSZXF1ZXN0IGZhaWxlZCBiZWNhdXNlIHRoZSByZXF1ZXN0IGlzIHZhbGlkLCB0aG91Z2ggbm90IHN1cHBvcnRlZAorICAgLy8vIGJ5IHRoZSBlbnRpdHkgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdC4KKyAgIGVXTEFOX1BBTF9TVEFUVVNfRV9OT1NVUFBPUlQsCisgICAKKyAgIC8vLyBSZXF1ZXN0IGZhaWxlZCBiZWNhdXNlIG9mIGFuIGVtcHR5IGNvbmRpdGlvbgorICAgZVdMQU5fUEFMX1NUQVRVU19FX0VNUFRZLAorICAKKyAgIC8vLyBFeGlzdGFuY2UgZmFpbHVyZS4gIE9wZXJhdGlvbiBjb3VsZCBub3QgYmUgY29tcGxldGVkIGJlY2F1c2UKKyAgIC8vLyBzb21ldGhpbmcgZXhpc3RzIG9yIGRvZXMgbm90IGV4aXN0LiAgCisgICBlV0xBTl9QQUxfU1RBVFVTX0VfRVhJU1RTLAorICAgCisgICAvLy8gT3BlcmF0aW9uIHRpbWVkIG91dAorICAgZVdMQU5fUEFMX1NUQVRVU19FX1RJTUVPVVQsCisgICAKKyAgIC8vLyBSZXF1ZXN0IGZhaWxlZCBmb3Igc29tZSB1bmtub3duIHJlYXNvbi4gIE5vdGUgZG9uJ3QgdXNlIHRoaXMKKyAgIC8vLyBzdGF0dXMgdW5sZXNzIG5vdGhpbmcgZWxzZSBhcHBsaWVzCisgICBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRSwKK30gd3B0X3N0YXR1czsKKworCisjZGVmaW5lIFdMQU5fUEFMX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykgKCBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgPT0gKHN0YXR1cykgKQorCisjZW5kaWYgLy8gX19XTEFOX1FDVF9QQUxfU1RBVFVTX0gKZGlmZiAtLWdpdCBhL0NPUkUvV0RJL1dQQUwvaW5jL3dsYW5fcWN0X3BhbF9zeW5jLmggYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWxfc3luYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MTU4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWxfc3luYy5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKCBfX1dMQU5fUUNUX1BBTF9TWU5DX0ggKQorI2RlZmluZSBfX1dMQU5fUUNUX1BBTF9TWU5DX0gKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHdsYW5fcGFsX3N5bmMuaAorICAKKyAgXGJyaWVmIGRlZmluZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0cyBQQUwgZXhwb3J0cy4gd3B0ID0gKFdsYW4gUGFsIFR5cGUpIHdwYWwgPSAoV2xhbiBQQUwpCisgICAgICAgICAgICAgICAKKyAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBpbmRlcGVuZGVudC4gCisgIAorICAgQ29weXJpZ2h0IDIwMTAgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90eXBlLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3N0YXR1cy5oIgorI2luY2x1ZGUgIndsYW5fcWN0X29zX3N5bmMuaCIKKworCisjZGVmaW5lIFdMQU5fUEFMX1dBSVRfSU5GSU5JVEUgICAgMHhGRkZGRkZGRgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxNdXRleEluaXQgliBpbml0aWFsaXplIGEgbXV0ZXggb2JqZWN0CisgICAgUGFyYW06CisgICAgICAgIHBNdXRleCCWIGEgcG9pbnRlciB0byBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB3cHRfbXV0ZXgKKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyCWIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbE11dGV4SW5pdCh3cHRfbXV0ZXggKnBNdXRleCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbE11dGV4RGVsZXRlIJYgaW52YWxpZGF0ZSBhIG11dGV4IG9iamVjdAorICAgIFBhcmFtOgorICAgICAgICBwTXV0ZXggliBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2Ygd3B0X211dGV4CisgICAgUmV0dXJuOgorICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgliBzdWNjZXNzLiBGYWlsIG90aGVyd2lzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxNdXRleERlbGV0ZSh3cHRfbXV0ZXggKnBNdXRleCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbE11dGV4QWNxdWlyZSCWIGFjcXVpcmUgYSBtdXRleCBvYmplY3QuIEl0IGlzIGJsb2NrZWQgdW50aWwgdGhlIG9iamVjdCBpcyBhY3F1aXJlZC4KKyAgICBQYXJhbToKKyAgICAgICAgcE11dGV4IJYgYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHdwdF9tdXRleAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIJYgc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsTXV0ZXhBY3F1aXJlKHdwdF9tdXRleCAqcE11dGV4KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsTXV0ZXhSZWxlYXNlIJYgUmVsZWFzZSBhIGhlbGQgbXV0ZXggb2JqZWN0CisgICAgUGFyYW06CisgICAgICAgIHBNdXRleCCWIGEgcG9pbnRlciB0byBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB3cHRfbXV0ZXgKKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyCWIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbE11dGV4UmVsZWFzZSh3cHRfbXV0ZXggKnBNdXRleCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbEV2ZW50SW5pdCCWIGluaXRpYWxpemUgYW4gZXZlbnQgb2JqZWN0CisgICAgUGFyYW06CisgICAgICAgIHBFdmVudCCWIGEgcG9pbnRlciB0byBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB3cHRfZXZlbnQKKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyCWIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbEV2ZW50SW5pdCh3cHRfZXZlbnQgKnBFdmVudCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbEV2ZW50RGVsZXRlIJYgaW52YWxpZGF0ZSBhbiBldmVudCBvYmplY3QKKyAgICBQYXJhbToKKyAgICAgICAgcEV2ZW50IJYgYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHdwdF9ldmVudAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIJYgc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsRXZlbnREZWxldGUod3B0X2V2ZW50ICpwRXZlbnQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxFdmVudFdhaXQgliBXYWl0IG9uIGFuIGV2ZW50IG9iamVjdAorICAgIFBhcmFtOgorICAgICAgICBwRXZlbnQgliBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2Ygd3B0X2V2ZW50CisgICAgICAgIHRpbWVvdXQgliB0aW1lcm91dCB2YWx1ZSBhdCB1bml0IG9mIG1pbGxpLXNlY29uZHMuIDB4ZmZmZmZmZmYgbWVhbnMgaW5maW5pdGUgd2FpdAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIJYgc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsRXZlbnRXYWl0KHdwdF9ldmVudCAqcEV2ZW50LCB3cHRfdWludDMyIHRpbWVvdXQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxFdmVudFNldCCWIFNldCBhbiBldmVudCBvYmplY3QgdG8gc2lnbmFsZWQgc3RhdGUKKyAgICBQYXJhbToKKyAgICAgICAgcEV2ZW50IJYgYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHdwdF9ldmVudAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIJYgc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsRXZlbnRTZXQod3B0X2V2ZW50ICpwRXZlbnQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxFdmVudFJlc2V0IJYgU2V0IGFuIGV2ZW50IG9iamVjdCB0byBub24tc2lnbmFsZWQgc3RhdGUKKyAgICBQYXJhbToKKyAgICAgICAgcEV2ZW50IJYgYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHdwdF9ldmVudAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIJYgc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsRXZlbnRSZXNldCh3cHRfZXZlbnQgKnBFdmVudCk7CisKKworI2VuZGlmIC8vIF9fV0xBTl9RQ1RfUEFMX1NZTkNfSApkaWZmIC0tZ2l0IGEvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX3RpbWVyLmggYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWxfdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmRjZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX3RpbWVyLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfUEFMX1RJTUVSX0ggKQorI2RlZmluZSBfX1dMQU5fUUNUX1BBTF9USU1FUl9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB3bGFuX3FjdF9wYWxfdGltZXIuaAorICAKKyAgXGJyaWVmIGRlZmluZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0cyBQQUwgZXhwb3J0cy4gd3B0ID0gKFdsYW4gUGFsIFR5cGUpIHdwYWwgPSAoV2xhbiBQQUwpCisgICAgICAgICAgICAgICAKKyAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBpbmRlcGVuZGVudC4KKyAgCisgICBDb3B5cmlnaHQgMjAxMC0yMDExIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIAorICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zdGF0dXMuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9vc190aW1lci5oIgorCisKK3R5cGVkZWYgdm9pZCAoKndwYWxfdGltZXJfY2FsbGJhY2spKHZvaWQgKnBVc2VyRGF0YSk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICB3cHRfb3NfdGltZXIgdGltZXI7CisgICB3cGFsX3RpbWVyX2NhbGxiYWNrIGNhbGxiYWNrOworICAgdm9pZCAqcFVzZXJEYXRhOworfSB3cHRfdGltZXI7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsVGltZXJJbml0IC0gaW5pdGlhbGl6ZSBhIHdwdF90aW1lciBvYmplY3QKKyAgICBQYXJhbToKKyAgICAgICAgcFRpbWVyIC0gYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgd3B0X3RpbWVyIG9iamVjdAorICAgICAgICBjYWxsYmFjayAtIEEgY2FsbGJhY2sgZnVuY3Rpb24KKyAgICAgICAgcFVzZXJEYXRhIC0gQSBwb2ludGVyIHRvIGRhdGEgcGFzcyBhcyBwYXJhbWV0ZXIgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsVGltZXJJbml0KHdwdF90aW1lciAqIHBUaW1lciwgd3BhbF90aW1lcl9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqcFVzZXJEYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsVGltZXJEZWxldGUgLSBpbnZhbGlkYXRlIGEgd3B0X3RpbWVyIG9iamVjdAorICAgIFBhcmFtOgorICAgICAgICBwVGltZXIgLSBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCB3cHRfdGltZXIgb2JqZWN0CisgICAgUmV0dXJuOgorICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzLiBGYWlsIG90aGVyd2lzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxUaW1lckRlbGV0ZSh3cHRfdGltZXIgKiBwVGltZXIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxUaW1lclN0YXJ0IC0gc3RhcnQgYSB3cHRfdGltZXIgb2JqZWN0IHdpdGggYSB0aW1lb3V0IHZhbHVlCisgICAgUGFyYW06CisgICAgICAgIHBUaW1lciAtIGEgcG9pbnRlciB0byBjYWxsZXIgYWxsb2NhdGVkIHdwdF90aW1lciBvYmplY3QKKyAgICAgICAgdGltZW91dCAtIHRpbWVvdXQgdmFsdWUgb2YgdGhlIHRpbWVyLiBJbiB1bml0IG9mIG1pbGxpLXNlY29uZHMuCisgICAgUmV0dXJuOgorICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzLiBGYWlsIG90aGVyd2lzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxUaW1lclN0YXJ0KHdwdF90aW1lciAqIHBUaW1lciwgd3B0X3VpbnQzMiB0aW1lb3V0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsVGltZXJTdG9wIC0gc3RvcCBhIHdwdF90aW1lciBvYmplY3QuIFN0b3AgZG9lc26SdCBndWFyYW50ZWUgdGhlIHRpbWVyIGhhbmRsZXIgaXMgbm90IGNhbGxlZCBpZiBpdCBpcyBhbHJlYWR5IHRpbWVvdXQuCisgICAgUGFyYW06CisgICAgICAgIHBUaW1lciAtIGEgcG9pbnRlciB0byBjYWxsZXIgYWxsb2NhdGVkIHdwdF90aW1lciBvYmplY3QKKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFRpbWVyU3RvcCh3cHRfdGltZXIgKiBwVGltZXIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxTbGVlcCAtIHNsZWVwIGZvciBhIHNwZWNpZmllZCBpbnRlcnZhbAorICAgIFBhcmFtOgorICAgICAgICB0aW1lb3V0IC0gYW1vdW50IG9mIHRpbWUgdG8gc2xlZXAuIEluIHVuaXQgb2YgbWlsbGktc2Vjb25kcy4KKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFNsZWVwKHdwdF91aW50MzIgdGltZW91dCk7CisKKworCisjZW5kaWYgLy8gX19XTEFOX1FDVF9QQUxfVElNRVJfSApkaWZmIC0tZ2l0IGEvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX3RyYWNlLmggYi9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWxfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTJlNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX3RyYWNlLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfUEFMX1RSQUNFX0ggKQorI2RlZmluZSBfX1dMQU5fUUNUX1BBTF9UUkFDRV9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB3bGFuX3FjdF9wYWxfYXBpLmgKKyAgCisgIFxicmllZiBkZWZpbmUgZ2VuZXJhbCBBUElzIFBBTCBleHBvcnRzLiB3cHQgPSAoV2xhbiBQYWwgVHlwZSkgd3BhbCA9IChXbGFuIFBBTCkKKyAgICAgICAgICAgICAgIAorICAgRGVmaW5pdGlvbnMgZm9yIHBsYXRmb3JtIGluZGVwZW5kZW50CisgIAorICAgQ29weXJpZ2h0IDIwMTAgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90eXBlLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3N0YXR1cy5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgIC8vIE5PTkUgbWVhbnMgTk8gdHJhY2VzIHdpbGwgYmUgbG9nZ2VkLiAgVGhpcyB2YWx1ZSBpcyBpbiBwbGFjZSBmb3IgdGhlIAorICAgLy8gdm9zX3RyYWNlX3NldGxldmVsKCkgdG8gYWxsb3cgdGhlIHVzZXIgdG8gdHVybiBvZmYgYWxsIHRyYWNlcy4KKyAgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9OT05FID0gMCwKKyAgIAorICAgLy8gdGhlIGZvbGxvd2luZyB0cmFjZSBsZXZlbHMgYXJlIHRoZSBvbmVzIHRoYXQgJ2NhbGxlcnMnIG9mIFZPU19UUkFDRSgpCisgICAvLyBjYW4gc3BlY2lmeSBpbiBmb3IgdGhlIFZPU19UUkFDRV9MRVZFTCBwYXJhbWV0ZXIuICBUcmFjZXMgYXJlIGNsYXNzaWZpZWQKKyAgIC8vIGJ5IHNldmVyaXR5IChGQVRBTCBiZWluZyBtb3JlIHNlcmlvdXMgdGhhbiBJTkZPIGZvciBleGFtcGxlKS4gICAKKyAgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgCisgICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTiwgIAorICAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk8sCisgICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTUVELAorICAgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTE9XLAorICAgCisgICAvLyBBTEwgbWVhbnMgYWxsIHRyYWNlIGxldmVscyB3aWxsIGJlIGFjdGl2ZS4gIFRoaXMgdmFsdWUgaXMgaW4gcGxhY2UgZm9yIHRoZSAKKyAgIC8vIHZvc190cmFjZV9zZXRsZXZlbCgpIHRvIGFsbG93IHRoZSB1c2VyIHRvIHR1cm4gT04gYWxsIHRyYWNlcy4KKyAgIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9BTEwsIAorICAgCisgICAvLyBub3QgYSByZWFsIGxldmVsLiAgVXNlZCB0byBpZGVudGlmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgCisgICAvLyBWT1NfVFJBQ0VfTEVWRUxzIGRlZmluZWQuCisgICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfQ09VTlQKK30gd3B0X3RyYWNlbGV2ZWw7CisKKyNpbmNsdWRlICJ3bGFuX3FjdF9vc190cmFjZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB3cGFsVHJhY2VTZXRMZXZlbCgpIC0gU2V0IHRoZSB0cmFjZSBsZXZlbCBmb3IgYSBwYXJ0aWN1bGFyIG1vZHVsZQorICAKKyAgVGhpcyBpcyBhbiBleHRlcm5hbCBBUEkgdGhhdCBhbGxvd3MgdHJhY2UgbGV2ZWxzIHRvIGJlIHNldCBmb3IgZWFjaCBtb2R1bGUuCisgIAorICBccGFyYW0gbW9kdWxlIC0gaWQgb2YgdGhlIG1vZHVsZSB3aG9zIHRyYWNlIGxldmVsIGlzIGJlaW5nIG1vZGlmaWVkCisgIFxwYXJhbSBsZXZlbCAtIHRyYWNlIGxldmVsLiAgIEEgbWVtYmVyIG9mIHRoZSB3cHRfdHJhY2VsZXZlbCAKKyAgICAgICAgIGVudW1lcmF0aW9uIGluZGljYXRpbmcgdGhlIHNldmVyaXR5IG9mIHRoZSBjb25kaXRpb24gY2F1c2luZyB0aGUKKyAgICAgICAgIHRyYWNlIG1lc3NhZ2UgdG8gYmUgaXNzdWVkLiAgIE1vcmUgc2V2ZXJlIGNvbmRpdGlvbnMgYXJlIG1vcmUgCisgICAgICAgICBsaWtlbHkgdG8gYmUgbG9nZ2VkLgorICBccGFyYW0gb24gLSBib29sZWFuIHRvIGluZGljYXRlIGlmIHRyYWNpbmcgYXQgdGhlIGdpdmVuIGxldmVsIHNob3VsZCBiZQorICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgIAorICBccmV0dXJuICBub3RoaW5nCisgICAgCisgIFxzYQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHdwYWxUcmFjZVNldExldmVsKCB3cHRfbW9kdWxlaWQgbW9kdWxlLCB3cHRfdHJhY2VsZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdwdF9ib29sZWFuIG9uICk7CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFxicmllZiB3cGFsVHJhY2VDaGVja0xldmVsKCkgCisgIAorICBUaGlzIGlzIGFuIGV4dGVybmFsIEFQSSB0aGF0IHJldHVybnMgYSBib29sZWFuIHZhbHVlIHRvIHNpZ25pZnkgaWYgYSAKKyAgcGFydGljdWxhciB0cmFjZSBsZXZlbCBpcyBzZXQgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLgorICAKKyAgXHBhcmFtIGxldmVsIC0gdHJhY2UgbGV2ZWwuICAgQSBtZW1iZXIgb2YgdGhlIHdwdF90cmFjZWxldmVsIGVudW1lcmF0aW9uIAorICAgICAgICAgICAgICAgICBpbmRpY2F0aW5nIHRoZSBzZXZlcml0eSBvZiB0aGUgY29uZGl0aW9uIGNhdXNpbmcgdGhlIHRyYWNlIAorICAgICAgICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGlzc3VlZC4KKyAgICAgICAgIAorICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgaW5kaXZpZHVhbCB0cmFjZSBsZXZlbHMgYXJlIHRoZSBvbmx5IHZhbGlkIHZhbHVlcworICAgICAgICAgICAgICAgICBmb3IgdGhpcyBBUEkuICBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfTk9ORSBhbmQgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0FMTAorICAgICAgICAgICAgICAgICBhcmUgbm90IHZhbGlkIGlucHV0IGFuZCB3aWxsIHJldHVybiBGQUxTRQorCisgIFxyZXR1cm4gIGVXTEFOX1BBTF9GQUxTRSAtIHRoZSBzcGVjaWZpZWQgdHJhY2UgbGV2ZWwgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlIGlzIE9GRiAKKyAgICAKKyAgICAgICAgICAgZVdMQU5fUEFMX1RSVUUgLSB0aGUgc3BlY2lmaWVkIHRyYWNlIGxldmVsIGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZSBpcyBPTgorICAgIAorICBcc2EgCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9ib29sZWFuIHdwYWxUcmFjZUNoZWNrTGV2ZWwoIHdwdF9tb2R1bGVpZCBtb2R1bGUsIHdwdF90cmFjZWxldmVsIGxldmVsICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBcYnJpZWYgd3BhbFRyYWNlRGlzcGxheSgpIC0gRGlzcGxheSBjdXJyZW50IHN0YXRlIG9mIHRyYWNlIGxldmVsIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIG1vZHVsZXMKKyAgCisgIFRoaXMgaXMgYW4gZXh0ZXJuYWwgQVBJIHRoYXQgYWxsb3dzIHRyYWNlIGxldmVscyB0byBiZSBkaXNwbGF5ZWQgdG8KKyAgYW4gZW5kIHVzZXIKKyAgCisgIFxwYXJhbSBub25lCisKKyAgXHJldHVybiAgbm90aGluZworICAgIAorICBcc2EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCB3cGFsVHJhY2VEaXNwbGF5KHZvaWQpOworCisKKyNlbmRpZiAvLyBfX1dMQU5fUUNUX1BBTF9UUkFDRV9ICmRpZmYgLS1naXQgYS9DT1JFL1dESS9XUEFML2luYy93bGFuX3FjdF9wYWxfdHlwZS5oIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGFmZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvV1BBTC9pbmMvd2xhbl9xY3RfcGFsX3R5cGUuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZCggX19XTEFOX1FDVF9QQUxfVFlQRV9IICkKKyNkZWZpbmUgX19XTEFOX1FDVF9QQUxfVFlQRV9ICisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB3bGFuX3FjdF9wYWxfdHlwZS5oCisgIAorICBcYnJpZWYgZGVmaW5lIGJhc2ljIHR5cGVzIFBBTCBleHBvcnRzLiB3cHQgPSAoV2xhbiBQYWwgVHlwZSkKKyAgICAgICAgICAgICAgIAorICAgRGVmaW5pdGlvbnMgZm9yIHBsYXRmb3JtIGluZGVwZW5kZW50LiAKKyAgCisgICBDb3B5cmlnaHQgMjAxMCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgIndsYW5fcWN0X29zX3R5cGUuaCIKKwordHlwZWRlZiB3cHRfdWludDggd3B0X21hY0FkZHJbNl07CisKK2VudW0KK3sKKyAgIGVXTEFOX1BBTF9GQUxTRSA9IDAsCisgICBlV0xBTl9QQUxfVFJVRSA9IDEsCit9OworCit0eXBlZGVmIGVudW0KK3sKKyAgIGVXTEFOX01PRFVMRV9EQUwsCisgICBlV0xBTl9NT0RVTEVfREFMX0NUUkwsCisgICBlV0xBTl9NT0RVTEVfREFMX0RBVEEsCisgICBlV0xBTl9NT0RVTEVfUEFMLAorICAgCisgICAvL0Fsd2F5cyB0aGUgbGFzdCBvbmUKKyAgIGVXTEFOX01PRFVMRV9DT1VOVAorfSB3cHRfbW9kdWxlaWQ7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8vQklUIG9yZGVyIGlzIG1vc3QgbGlrZWx5IGxpdHRsZSBlbmRpYW4uIAorICAgLy9UaGlzIHN0cnVjdHVyZSBpcyBmb3IgbmV0b3drci1vcmRlciBieXRlIGFycmF5IChvciBiaWctZW5kaWFuIGJ5dGUgb3JkZXIpCisjaWZuZGVmIFdMQU5fUEFMX0JJR19FTkRJQU5fQklUCisgICB3cHRfYnl0ZSBwcm90VmVyIDoyOworICAgd3B0X2J5dGUgdHlwZSA6MjsKKyAgIHdwdF9ieXRlIHN1YlR5cGUgOjQ7CisKKyAgIHdwdF9ieXRlIHRvRFMgOjE7CisgICB3cHRfYnl0ZSBmcm9tRFMgOjE7CisgICB3cHRfYnl0ZSBtb3JlRnJhZyA6MTsKKyAgIHdwdF9ieXRlIHJldHJ5IDoxOworICAgd3B0X2J5dGUgcG93ZXJNZ210IDoxOworICAgd3B0X2J5dGUgbW9yZURhdGEgOjE7CisgICB3cHRfYnl0ZSB3ZXAgOjE7CisgICB3cHRfYnl0ZSBvcmRlciA6MTsKKworI2Vsc2UKKworICAgd3B0X2J5dGUgc3ViVHlwZSA6NDsKKyAgIHdwdF9ieXRlIHR5cGUgOjI7CisgICB3cHRfYnl0ZSBwcm90VmVyIDoyOworCisgICB3cHRfYnl0ZSBvcmRlciA6MTsKKyAgIHdwdF9ieXRlIHdlcCA6MTsKKyAgIHdwdF9ieXRlIG1vcmVEYXRhIDoxOworICAgd3B0X2J5dGUgcG93ZXJNZ210IDoxOworICAgd3B0X2J5dGUgcmV0cnkgOjE7CisgICB3cHRfYnl0ZSBtb3JlRnJhZyA6MTsKKyAgIHdwdF9ieXRlIGZyb21EUyA6MTsKKyAgIHdwdF9ieXRlIHRvRFMgOjE7CisKKyNlbmRpZgorCit9IHdwdF9GcmFtZUN0cmw7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAvKiBGcmFtZSBjb250cm9sIGZpZWxkICovCisgICB3cHRfRnJhbWVDdHJsIGZyYW1lQ3RybDsKKyAgIC8qIER1cmF0aW9uIElEICovCisgICB3cHRfdWludDE2IHVzRHVyYXRpb25JZDsKKyAgIC8qIEFkZHJlc3MgMSBmaWVsZCAgKi8KKyAgIHdwdF9tYWNBZGRyIHZBMTsKKyAgIC8qIEFkZHJlc3MgMiBmaWVsZCAqLworICAgd3B0X21hY0FkZHIgdkEyOworICAgLyogQWRkcmVzcyAzIGZpZWxkICovCisgICB3cHRfbWFjQWRkciB2QTM7CisgICAvKiBTZXF1ZW5jZSBjb250cm9sIGZpZWxkICovCisgICB3cHRfdWludDE2IHNTZXFDdHJsOworICAgLyogT3B0aW9uYWwgQTQgYWRkcmVzcyAqLworICAgd3B0X21hY0FkZHIgb3B0dkE0OworICAgLyogT3B0aW9uYWwgUU9TIGNvbnRyb2wgZmllbGQgKi8KKyAgIHdwdF91aW50MTYgIHVzUW9zQ3RybDsKK313cHRfODAyMTFIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICB3cHRfbWFjQWRkciBkZXN0OworICAgd3B0X21hY0FkZHIgc2VjOworICAgd3B0X3VpbnQxNiBsZW5PclR5cGU7Cit9IHdwdF84MDIzSGVhZGVyOworCisKKyNlbmRpZiAvLyBfX1dMQU5fUUNUX1BBTF9UWVBFX0gKZGlmZiAtLWdpdCBhL0NPUkUvV0RJL1dQQUwvc3JjL3dsYW5fcWN0X3BhbF9hcGkuYyBiL0NPUkUvV0RJL1dQQUwvc3JjL3dsYW5fcWN0X3BhbF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTczYjczCi0tLSAvZGV2L251bGwKKysrIGIvQ09SRS9XREkvV1BBTC9zcmMvd2xhbl9xY3RfcGFsX2FwaS5jCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHdsYW5fcWN0X3BhbF9hcGkuYworICAKKyAgXGJyaWVmIEltcGxlbWVudGF0aW9uIGdlbmVyYWwgQVBJcyBQQUwgZXhwb3J0cy4KKyAgIHdwdCA9IChXbGFuIFBhbCBUeXBlKSB3cGFsID0gKFdsYW4gUEFMKQorICAgICAgICAgICAgICAgCisgICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gV2luZG93cy4KKyAgCisgICBDb3B5cmlnaHQgMjAxMCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX2FwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90cmFjZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9kZXZpY2UuaCIKKyNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKKyNpZm5kZWYgTUVNT1JZX0RFQlVHCisjaW5jbHVkZSAidm9zX21lbW9yeS5oIgorI2VuZGlmIC8qIE1FTU9SWV9ERUJVRyAqLworI2luY2x1ZGUgInZvc19hcGkuaCIKKworI2luY2x1ZGUgImRtYS1tYXBwaW5nLmgiCisjaW5jbHVkZSA8bWFjaC9zdWJzeXN0ZW1fcmVzdGFydC5oPgorCit0eXBlZGVmIHN0cnVjdCBzUGFsU3RydWN0Cit7CisgICAvKj9tdXN0IGNoZWNrIHRoZSBkYXRhIHR5cGUqLworICAgdm9pZCogZGV2SGFuZGxlOworfSB0UGFsQ29udGV4dDsKKworI2RlZmluZSBXUEFMX0dFVF9ORElTX0hBTkRMRShwKSAgKCAoKHRQYWxDb250ZXh0ICopKHApKS0+ZGV2SGFuZGxlICkKKwordFBhbENvbnRleHQgZ0NvbnRleHQ7CisKKy8vVGhpcyBzdHJ1Y3R1cmUgbmVlZCB0byBiZSA0LWJ5dGUgYWxpZ25lZC4gTm8gcGFja2luZy4KK3R5cGVkZWYgc3RydWN0Cit7CisgICB3cHRfdWludDMyIGxlbmd0aDsKKyAgIC8vVGhlIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHdoZXJlIGl0IGlzIGFsbG9jYXRlZAorICAgd3B0X3VpbnQzMiBvZmZzZXQ7ICAgCisgICB3cHRfdWludDMyIHBoeUFkZHI7Cit9IHRQYWxEbWFNZW1JbmZvOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT05TCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemUgUEFMCisgKiAgICAgICAgSW4gY2FzZSBvZiBRTlAsIHRoaXMgZG9lcyBub3RoaW5nLgorICogQHBhcmFtIHBwUGFsQ29udGV4dCBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBwb2ludGVyLiBJdCAKKyAqICAgICAgICAgICAgICAgICAgICAgaXMgb3BhcXVlIHRvIGNhbGxlci4KKyAqICAgICAgICAgICAgICAgICAgICBDYWxsZXIgc2F2ZSB0aGUgcmV0dXJuZWQgcG9pbnRlciBmb3IgZnV0dXJlIHVzZSB3aGVuCisgKiAgICAgICAgICAgICAgICAgICAgY2FsbGluZyBQQUwgQVBJcy4KKyAqIEBwYXJhbSBwT1NDb250ZXh0IFBvaW50ZXIgdG8gYSBjb250ZXh0IHRoYXQgaXMgT1Mgc3BlY2lmaWMuIFRoaXMgaXMgTlVMTCBpcyBhIAorICAgICAgICAgICAgICAgICAgICAgcGFydGljdWxhciBQQUwgZG9lc24ndCB1c2UgaXQgZm9yIHRoYXQgT1MuCisgKiAKKyAqIEByZXR1cm4gd3B0X3N0YXR1cyBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzLiBPdGhlcndpc2UgZmFpbC4KKyAqLword3B0X3N0YXR1cyB3cGFsT3Blbih2b2lkICoqcHBQYWxDb250ZXh0LCB2b2lkICpwT1NDb250ZXh0KQoreworICAgd3B0X3N0YXR1cyBzdGF0dXM7CisKKyAgIGdDb250ZXh0LmRldkhhbmRsZSA9IHBPU0NvbnRleHQ7CisKKyAgIHN0YXR1cyA9IHdwYWxEZXZpY2VJbml0KHBPU0NvbnRleHQpOworICAgaWYgKCFXTEFOX1BBTF9JU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgICIlczogd3BhbERldmljZUluaXQgZmFpbGVkIHdpdGggc3RhdHVzICV1IiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworICAgfQorCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEBicmllZiB3cGFsQ2xvc2UgLSBSZWxlYXNlIFBBTAorICogICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgUU5QLCB0aGlzIGRvZXMgbm90aGluZy4KKyAqIEBwYXJhbSBwUGFsQ29udGV4dCBwb2ludGVyIHJldHVybmVkIGZyb20gd3BhbE9wZW4uCisgKiAKKyAqIEByZXR1cm4gd3B0X3N0YXR1cyBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzLiBPdGhlcndpc2UgZmFpbC4KKyAqLword3B0X3N0YXR1cyB3cGFsQ2xvc2Uodm9pZCAqcFBhbENvbnRleHQpCit7CisgICB3cGFsRGV2aWNlQ2xvc2UoZ0NvbnRleHQuZGV2SGFuZGxlKTsKKyAgIGdDb250ZXh0LmRldkhhbmRsZSA9IE5VTEw7CisKKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZm5kZWYgTUVNT1JZX0RFQlVHCisvKioKKyAqIEBicmllZiB3cGFsTWVtb3J5QWxsb2NhdGUgLSAgQWxsb2NhdGUgbWVtb3J5CisgKiBAcGFyYW0gc2l6ZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqIAorICogQHJldHVybiB2b2lkKiBBIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBOVUxMIC0gZmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkgCisgKi8KK3ZvaWQgKndwYWxNZW1vcnlBbGxvY2F0ZSh3cHRfdWludDMyIHNpemUpCit7CisgICByZXR1cm4gdm9zX21lbV9tYWxsb2MoIHNpemUgKTsKK30KKworLyoqCisgKiBAYnJpZWYgd3BhbE1lbW9yeUZyZWUgLSAgRnJlZSBhbGxvY2F0ZWQgbWVtb3J5CisgKiBAcGFyYW0gcHYgcG9pbnRlciB0byBidWZmZXIgdG8gYmUgZnJlZWQKKyAqLwordm9pZCB3cGFsTWVtb3J5RnJlZSh2b2lkICpwdikKK3sKKyAgIHZvc19tZW1fZnJlZSggcHYgKTsKK30KKyNlbmRpZiAvKiBNRU1PUllfREVCVUcgKi8KKy8qKgorICogQGJyaWVmIHdwYWxNZW1vcnlDb3B5IC0gIGNvcHkgbWVtb3J5CisgKiBAcGFyYW0gZGVzdCBhZGRyZXNzIHdoaWNoIGRhdGEgaXMgY29waWVkIHRvCisgKiBAcGFyYW0gc3JjIGFkZHJlc3Mgd2hpY2ggZGF0YSBpcyBjb3BpZWQgZnJvbQorICogQHBhcmFtIHNpemUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKKyAqIAorICogQHJldHVybiB3cHRfc3RhdHVzCisgKiAgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUworICogICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0lOVkFMSURfUEFSQU0KKyAqLword3B0X3N0YXR1cyB3cGFsTWVtb3J5Q29weSh2b2lkICogZGVzdCwgdm9pZCAqIHNyYywgd3B0X3VpbnQzMiBzaXplKQoreworICAgdm9zX21lbV9jb3B5KCBkZXN0LCBzcmMsIHNpemUgKTsKKworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBAYnJpZWYgd3BhbE1lbW9yeUNvbXBhcmUgLSAgY29tcGFyZSBtZW1vcnkKKyAqIEBwYXJhbSBidWYxIGFkZHJlc3Mgb2YgYnVmZmVyMQorICogQHBhcmFtIGJ1ZjIgYWRkcmVzcyBvZiBidWZmZXIyCisgKiBAcGFyYW0gc2l6ZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQorICogCisgKiBAcmV0dXJuIHdwdF9ib29sZWFuCisgKiAgICAgICAgZVdMQU5fUEFMX1RSVUUgLSBpZiB0d28gYnVmZmVycyBoYXZlIHNhbWUgY29udGVudAorICogICAgICAgIGVXTEFOX1BBTF9GQUxTRSAtIG5vdCBtYXRjaAorICovCit3cHRfYm9vbGVhbiB3cGFsTWVtb3J5Q29tcGFyZSh2b2lkICogYnVmMSwgdm9pZCAqIGJ1ZjIsIHdwdF91aW50MzIgc2l6ZSkKK3sKKyAgIHJldHVybiAod3B0X2Jvb2xlYW4pdm9zX21lbV9jb21wYXJlKCBidWYxLCBidWYyLCBzaXplICk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsTWVtb3J5WmVybyAtICBaZXJvIG1lbW9yeQorICAgIFBhcmFtOiAKKyAgICAgICBidWYgLSBhZGRyZXNzIG9mIGJ1ZmZlciB0byBiZSB6ZXJvCisgICAgICAgc2l6ZSAtIG51bWJlciBvZiBieXRlcyB0byB6ZXJvCisgICAgUmV0dXJuOgorICAgICAgIE5vbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHdwYWxNZW1vcnlaZXJvKHZvaWQgKmJ1Ziwgd3B0X3VpbnQzMiBzaXplKQoreworICAgdm9zX21lbV96ZXJvKCBidWYsIHNpemUgKTsKK30KKworLyoqCisgKiBAYnJpZWYgd3BhbE1lbW9yeUZpbGwgLSAgRmlsbCBtZW1vcnkgd2l0aCBvbmUgcGF0dGVybgorICogQHBhcmFtIGJ1ZiBhZGRyZXNzIG9mIGJ1ZmZlciB0byBiZSBmaWxsZWQKKyAqIEBwYXJhbSBzaXplIG51bWJlciBvZiBieXRlcyB0byBmaWxsCisgKiBAcGFyYW0gYkZpbGwgb25lIGJ5dGUgb2YgZGF0YSB0byBmaWxsIGluIChzaXplKSBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgCisgKiBidWZmZXIKKyAqLwordm9pZCB3cGFsTWVtb3J5RmlsbCh2b2lkICpidWYsIHdwdF91aW50MzIgc2l6ZSwgd3B0X2J5dGUgYkZpbGwpCit7CisgICB2b3NfbWVtX3NldCggYnVmLCBzaXplLCBiRmlsbCApOworfQorCisvKioKKyAqIEBicmllZiB3cGFsRG1hTWVtb3J5QWxsb2NhdGUgLSAgQWxsb2NhdGUgbWVtb3J5IHJlYWR5IGZvciBETUEuIEFsaWduZWQgYXQgNC1ieXRlCisgKiBAcGFyYW0gc2l6ZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqIEBwYXJhbSBwcFBoeXNpY2FsQWRkciBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaWYgYWxsb2NhdGlvbiBzdWNjZWVkcworICogCisgKiBAcmV0dXJuIHZvaWQqIEEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeSAodmlydHVhbCBhZGRyZXNzKS4gCisgKiAgICAgICAgICAgICAgIE5VTEwgLSBmYWlsIHRvIGFsbG9jYXRlIG1lbW9yeQorICovCit2b2lkICp3cGFsRG1hTWVtb3J5QWxsb2NhdGUod3B0X3VpbnQzMiBzaXplLCB2b2lkICoqcHBQaHlzaWNhbEFkZHIpCit7CisgICB2b2lkICpwdiA9IE5VTEw7CisgICBkbWFfYWRkcl90IFBoeUFkZHI7CisgICB3cHRfdWludDMyIHVBbGxvY0xlbiA9IHNpemUgKyBzaXplb2YodFBhbERtYU1lbUluZm8pOworICAgCisgICBwdiA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCB1QWxsb2NMZW4sICZQaHlBZGRyLCBHRlBfS0VSTkVMKTsKKyAgIGlmICggTlVMTCA9PSBwdiApIAorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICIlcyBVbmFibGUgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlclxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIAorICAgKCh0UGFsRG1hTWVtSW5mbyAqKXB2KS0+bGVuZ3RoICA9IHVBbGxvY0xlbjsKKyAgICgodFBhbERtYU1lbUluZm8gKilwdiktPnBoeUFkZHIgPSBQaHlBZGRyOworICAgKCh0UGFsRG1hTWVtSW5mbyAqKXB2KS0+b2Zmc2V0ICA9IHNpemVvZih0UGFsRG1hTWVtSW5mbyk7CisgICBwdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKHdwdF9ieXRlICopcHYgKyBzaXplb2YodFBhbERtYU1lbUluZm8pOworICAgKnBwUGh5c2ljYWxBZGRyICAgICAgICAgICAgICAgICA9ICh2b2lkKilQaHlBZGRyICsgc2l6ZW9mKHRQYWxEbWFNZW1JbmZvKTsKKworCisgICByZXR1cm4gKHB2KTsKK30vKndwYWxEbWFNZW1vcnlBbGxvY2F0ZSovCisKKworLyoqCisgKiBAYnJpZWYgd3BhbERtYU1lbW9yeUZyZWUgLSAgRnJlZSBtZW1vcnkgcmVhZHkgZm9yIERNQQorICogQHBhcmFtIHB2IGFkZHJlc3MgZm9yIHRoZSBidWZmZXIgdG8gYmUgZnJlZWQKKyAqLwordm9pZCB3cGFsRG1hTWVtb3J5RnJlZSh2b2lkICpwdikKK3sKKyAgIHRQYWxEbWFNZW1JbmZvICpwTWVtSW5mbyA9ICh0UGFsRG1hTWVtSW5mbyAqKSgoKHdwdF9ieXRlICopcHYpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRQYWxEbWFNZW1JbmZvKSk7CisgICAgaWYocHYpCisgICAgeyAKKyAgICAgICAgcHYgPSAod3B0X2J5dGUgKilwdiAtIHBNZW1JbmZvLT5vZmZzZXQ7CisgICAgICAgIGRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHBNZW1JbmZvLT5sZW5ndGgsIHB2LCBwTWVtSW5mby0+cGh5QWRkcik7CisgICAgfQorCit9Lyp3cGFsRG1hTWVtb3J5RnJlZSovCisKKy8qKgorICogQGJyaWVmIHdwYWxEYmdSZWFkUmVnaXN0ZXIgLSAgUmVhZCByZWdpc3RlciBmcm9tIHRoZSBXaUZpIEJCIAorICAgICAgICAgICAgICBjaGlwCisgKiBAcGFyYW0gcmVnQWRkciAtIHJlZ2lzdGVyIGFkZHJlc3MKKyAqIEBwYXJhbSAgcHJlZ1ZhbHVlIC0gcmV0dXJuIHZhbHVlIGZyb20gcmVnaXN0ZXIgaWYgc3VjY2VzcworICogQHJldHVybgorICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHdoZW4gZXZlcnl0aGluZyBpcyBPSworICovCit3cHRfc3RhdHVzIHdwYWxEYmdSZWFkUmVnaXN0ZXIod3B0X3VpbnQzMiByZWdBZGRyLCB3cHRfdWludDMyICpwcmVnVmFsdWUpCit7CisgICBpZiAoTlVMTCA9PSBwcmVnVmFsdWUpCisgICB7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICByZXR1cm4gd3BhbFJlYWRSZWdpc3RlcihyZWdBZGRyLCBwcmVnVmFsdWUpOworfQorCisvKiogCisgKiBAYnJpZWYgd3BhbERiZ1dyaXRlUmVnaXN0ZXIgLSAgV3JpdGUgYSB2YWx1ZSB0byB0aGUgcmVnaXN0ZXIKKyAqICBpbiB0aGUgV2lGaSBCQiBjaGlwIFBhcmFtOgorICogQHBhcmFtIHJlZ0FkZHIgLSByZWdpc3RlciBhZGRyZXNzCisgKiBAcGFyYW0gcmVnVmFsdWUgLSB2YWx1ZSB0byBiZSB3cml0dGVuCisgKiBAcmV0dXJuCisgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCisqLword3B0X3N0YXR1cyB3cGFsRGJnV3JpdGVSZWdpc3Rlcih3cHRfdWludDMyIHJlZ0FkZHIsIHdwdF91aW50MzIgcmVnVmFsdWUpCit7CisgICByZXR1cm4gd3BhbFdyaXRlUmVnaXN0ZXIocmVnQWRkciwgcmVnVmFsdWUpOworfQorCisvKiogCisgKiBAYnJpZWYgCisgICAgIHdwYWxEYmdSZWFkTWVtb3J5IC0gIFJlYWQgbWVtb3J5IGZyb20gV2lGaSBCQiBjaGlwIHNwYWNlCisgKiBAcGFyYW0gbWVtQWRkciAtIGFkZHJlc3Mgb2YgbWVtb3J5IAorICogQHBhcmFtIGJ1ZiAtIG91dHB1dCAKKyAqIEBwYXJhbSBsZW4gLSBsZW5ndGggdG8gYmUgcmVhZAorICogQHJldHVybgorICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHdoZW4gZXZlcnl0aGluZyBpcyBPSworKi8KK3dwdF9zdGF0dXMgd3BhbERiZ1JlYWRNZW1vcnkod3B0X3VpbnQzMiBtZW1BZGRyLCB3cHRfdWludDggKmJ1Ziwgd3B0X3VpbnQzMiBsZW4pCit7CisgICByZXR1cm4gd3BhbFJlYWREZXZpY2VNZW1vcnkobWVtQWRkciwgYnVmLCBsZW4pOworfQorCisvKiogCisgKiBAYnJpZWYgCisgICAgd3BhbERiZ1dyaXRlTWVtb3J5IC0gIFdyaXRlIGEgdmFsdWUgdG8gdGhlIG1lbW9yeSBpbiB0aGUgV2lGaSBCQiBjaGlwIHNwYWNlCisgKiBAcGFyYW0gbWVtQWRkciAtIG1lbW9yeSBhZGRyZXNzIAorICogQHBhcmFtIGJ1ZiAtIHZsYXVlIHRvIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSBsZW4gLSBsZW5ndGggb2YgYnVmCisgKiBAcmV0dXJuCisgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCisqLword3B0X3N0YXR1cyB3cGFsRGJnV3JpdGVNZW1vcnkod3B0X3VpbnQzMiBtZW1BZGRyLCB3cHRfdWludDggKmJ1Ziwgd3B0X3VpbnQzMiBsZW4pCit7CisgICByZXR1cm4gd3BhbFdyaXRlRGV2aWNlTWVtb3J5KG1lbUFkZHIsIGJ1ZiwgbGVuKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsRHJpdmVyU2h1dGRvd24gLSAgU2h1dGRvd24gV0xBTiBkcml2ZXIKKworICAgIFRoaXMgQVBJIGlzIHJlcXVpZWQgYnkgU1NSLCBjYWxsIGluIHRvICdWT1Mgc2h1dGRvd24nIHRvIHNodXRkb3duIFdMQU4gCisgICAgZHJpdmVyIHdoZW4gUml2YSBjcmFzaGVzLgorCisgICAgUGFyYW06IAorICAgICAgIE5vbmUKKyAgICBSZXR1cm46CisgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsRHJpdmVyU2h1dGRvd24odm9pZCkKK3sKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKyAgICB2b3NTdGF0dXMgPSB2b3Nfd2xhblNodXRkb3duKCk7CisKKyAgICBpZiAoVk9TX1NUQVRVU19TVUNDRVNTID09IHZvc1N0YXR1cykgeworICAgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOyAKKyAgICB9CisgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFOyAKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsRHJpdmVyU2h1dGRvd24gLSAgUmUtaW5pdCBXTEFOIGRyaXZlcgorCisgICAgVGhpcyBBUEkgaXMgcmVxdWllZCBieSBTU1IsIGNhbGwgaW4gdG8gJ1ZPUyByZS1pbml0JyB0byByZS1pbml0IFdMQU4KKyAgICBkcml2ZXIuCisKKyAgICBQYXJhbTogCisgICAgICAgTm9uZQorICAgIFJldHVybjoKKyAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxEcml2ZXJSZUluaXQodm9pZCkKK3sKKyAgICBWT1NfU1RBVFVTIHZvc1N0YXR1czsKKworICAgIHZvc1N0YXR1cyA9IHZvc193bGFuUmVJbml0KCk7CisgICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMpIHsKKyAgICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsgCisgICAgfQorICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsgCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbFJpdmFTdWJ5c3RlbVJlc3RhcnQgLSAgSW5pdGlhdGUgUml2YSBTU1IKKworICAgIFRoaXMgQVBJIGlzIGNhbGxlZCBieSBXTEFOIGRyaXZlciB0byBpbml0aWF0ZSBSaXZhIFNTUgorCisgICAgUGFyYW06CisgICAgICAgTm9uZQorICAgIFJldHVybjoKKyAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxSaXZhU3VieXN0ZW1SZXN0YXJ0KHZvaWQpCit7CisgICAgLyogY2FsbCBTU1Igb25seSBpZiBkcml2ZXIgaXMgbm90IGluIGxvYWQvdW5sb2FkIHByb2Nlc3MuCisgICAgICogQSBXREkgdGltZW91dCBkdXJpbmcgbG9hZC91bmxvYWQgY2Fubm90IGJlIGZpeGVkIHRocnUKKyAgICAgKiBTU1IgKi8KKyAgICBpZiAodm9zX2lzX2xvYWRfdW5sb2FkX2luX3Byb2dyZXNzKFZPU19NT0RVTEVfSURfV0RJLCBOVUxMKSkKKyAgICB7CisgICAgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9GQVRBTCwKKyAgICAgICAgICAgICAgICAgIiVzOiBsb2FkaW5nL3VubG9hZGluZyBpbiBwcm9ncmVzcywiCisgICAgICAgICAgICAgICAgICIgU1NSIHdpbGwgYmUgZG9uZSBhdCB0aGUgZW5kIG9mIHVubG9hZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisgICAgfQorICAgIGlmICgwID09IHN1YnN5c3RlbV9yZXN0YXJ0KCJyaXZhIikpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvV1BBTC9zcmMvd2xhbl9xY3RfcGFsX2RldmljZS5jIGIvQ09SRS9XREkvV1BBTC9zcmMvd2xhbl9xY3RfcGFsX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzIwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9XUEFML3NyYy93bGFuX3FjdF9wYWxfZGV2aWNlLmMKQEAgLTAsMCArMSw3NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBAZmlsZSAgd2xhbl9xY3RfcGFsX2RldmljZS5jCisgIAorICBAYnJpZWYgCisgICAgICAgICAgICAgICAKKyAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGRldmljZSBzcGVjaWZpYyBIVyBhY2Nlc3MgaW50ZXJmYWNlCisgIHJlcXVpcmVkIGJ5IHRoZSBXTEFOIFBsYXRmb3JtIEFic3RyYWN0aW9uIExheWVyIChXUEFMKQorCisgIENvcHlyaWdodCAoYykgMjAxMSBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKKworCisgIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgorICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCisKKyAgJEhlYWRlcjokICREYXRlVGltZTogJCAkQXV0aG9yOiAkCisKKworICB3aGVuICAgICAgICB3aG8gIHdoYXQsIHdoZXJlLCB3aHkKKyAgLS0tLS0tLS0tLSAgLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAyMDExLTAzLTAxICBqdGogIEluaXRpYWwgdmVyc2lvbiBmb3IgTGludXgvQW5kcm9pZCB3aXRoIFdjbnNzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSBGaWxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxtYWNoL21zbV9zbXNtLmg+CisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX2FwaS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9kZXZpY2UuaCIKKyNpbmNsdWRlICJ3bGFuX2hkZF9tYWluLmgiCisjaW5jbHVkZSAibGludXgvd2Nuc3Nfd2xhbi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8gYWRkcmVzcyBpbiB0aGUgODk2MCBwaHlzaWNhbCBtZW1vcnkgbWFwCisjZGVmaW5lIFdDTlNTX0JBU0VfQUREUkVTUyAweDAzMDAwMDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBEZWNsYXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdsb2JhbCBEYXRhIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGF0aWMgVmFyaWFibGUgRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IHdjbnNzX2VudiB7CisgICBzdHJ1Y3QgcmVzb3VyY2UgKndjbnNzX21lbW9yeTsKKyAgIHZvaWQgX19pb21lbSAgICAqbW1pbzsKKyAgIGludCAgICAgICAgICAgICAgdHhfaXJxOworICAgd3BhbElzclR5cGUgICAgICB0eF9pc3I7CisgICB2b2lkICAgICAgICAgICAgKnR4X2NvbnRleHQ7CisgICBpbnQgICAgICAgICAgICAgIHJ4X2lycTsKKyAgIHdwYWxJc3JUeXBlICAgICAgcnhfaXNyOworICAgdm9pZCAgICAgICAgICAgICpyeF9jb250ZXh0OworICAgaW50ICAgICAgICAgICAgICByeF9yZWdpc3RlcmVkOworICAgaW50ICAgICAgICAgICAgICB0eF9yZWdpc3RlcmVkOworfSAqZ3BFbnYgPSBOVUxMOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXRpYyBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgIEBicmllZiB3cGFsVHhJc3IgaXMgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgd2hpY2ggaGFuZGxlcworICAgICAgICAgdGhlIERYRSBUWCBDb21wbGV0ZSBpbnRlcnJ1cHQKKyAgCisgIHdwYWxUeElzciBpcyByZWdpc3RlcmVkIHdpdGggdGhlIE9wZXJhdGluZyBTeXN0ZW0gdG8gaGFuZGxlIHRoZQorICBEWEUgVFggQ29tcGxldGUgaW50ZXJydXB0IGR1cmluZyBzeXN0ZW0gaW5pdGlhbGl6YXRpb24uICBXaGVuIGEgRFhFCisgIFRYIENvbXBsZXRlIGludGVycnVwdCBvY2N1cnMsIGl0IGlzIGRpc3BhdGNoZWQgdG8gdGhlIGhhbmRsZXIgd2hpY2gKKyAgaGFkIHByZXZpb3VzbHkgYmVlbiByZWdpc3RlcmVkIHZpYSB3cGFsUmVnaXN0ZXJJbnRlcnJ1cHQuCisgIAorICBAcGFyYW0gIGlycTogICAgRW51bWVyYXRpb24gb2YgdGhlIGludGVycnVwdCB0aGF0IG9jY3VycmVkCisgIEBwYXJhbSAgZGV2X2lkOiBVc2VyLXN1cHBsaWVkIGRhdGEgcGFzc2VkIGJhY2sgdmlhIHRoZSBJU1IKKworICBAc2VlICAgIHdwYWxSZWdpc3RlckludGVycnVwdAorCisgIEByZXR1cm4gSVJRX0hBTkRMRUQgc2luY2UgaXQgaXMgYSBkZWRpY2F0ZWQgaW50ZXJydXB0CisqLworc3RhdGljIGlycXJldHVybl90IHdwYWxUeElzcgorKAorICAgaW50IGlycSwKKyAgIHZvaWQgKmRldl9pZAorKQoreworICAgaWYgKChOVUxMICE9IGdwRW52KSAmJiAoTlVMTCAhPSBncEVudi0+dHhfaXNyKSkgeworICAgICAgZ3BFbnYtPnR4X2lzcihncEVudi0+dHhfY29udGV4dCk7CisgICB9CisgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoqCisgIEBicmllZiB3cGFsUnhJc3IgaXMgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgd2hpY2ggaGFuZGxlcworICAgICAgICAgdGhlIERYRSBSWCBBdmFpbGFibGUgaW50ZXJydXB0CisgIAorICB3cGFsUnhJc3IgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPcGVyYXRpbmcgU3lzdGVtIHRvIGhhbmRsZSB0aGUKKyAgRFhFIFJYIEF2YWlsYWJsZSBpbnRlcnJ1cHQgZHVyaW5nIHN5c3RlbSBpbml0YWxpemF0aW9uLiAgV2hlbiBhIERYRQorICBSWCBBdmFpbGFibGUgaW50ZXJydXB0IG9jY3VycywgaXQgaXMgZGlzcGF0Y2hlZCB0byB0aGUgaGFuZGxlciB3aGljaAorICBoYWQgcHJldmlvdXNseSBiZWVuIHJlZ2lzdGVyZWQgdmlhIHdwYWxSZWdpc3RlckludGVycnVwdC4KKyAgCisgIEBwYXJhbSAgaXJxOiAgICBFbnVtZXJhdGlvbiBvZiB0aGUgaW50ZXJydXB0IHRoYXQgb2NjdXJyZWQKKyAgQHBhcmFtICBkZXZfaWQ6IFVzZXItc3VwcGxpZWQgZGF0YSBwYXNzZWQgYmFjayB2aWEgdGhlIElTUgorCisgIEBzZWUgICAgd3BhbFJlZ2lzdGVySW50ZXJydXB0CisKKyAgQHJldHVybiBJUlFfSEFORExFRCBzaW5jZSBpdCBpcyBhIGRlZGljYXRlZCBpbnRlcnJ1cHQKKyovCitzdGF0aWMgaXJxcmV0dXJuX3Qgd3BhbFJ4SXNyCisoCisgICBpbnQgaXJxLAorICAgdm9pZCAqZGV2X2lkCispCit7CisgICBpZiAoKE5VTEwgIT0gZ3BFbnYpICYmIChOVUxMICE9IGdwRW52LT5yeF9pc3IpKSB7CisgICAgICBncEVudi0+cnhfaXNyKGdwRW52LT5yeF9jb250ZXh0KTsKKyAgIH0KKyAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbGl6ZWQgRnVuY3Rpb24gRGVmaW5pdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qKgorICBAYnJpZWYgd3BhbFJlZ2lzdGVySW50ZXJydXB0IHByb3ZpZGVzIGEgbWVjaGFuc2ltIGZvciBjbGllbnQKKyAgICAgICAgIHRvIHJlZ2lzdGVyIHN1cHBvcnQgZm9yIGEgZ2l2ZW4gaW50ZXJydXB0CisKKyAgVGhlIERYRSBpbnRlcmZhY2Ugc3VwcG9ydHMgdHdvIGludGVycnVwdHMsIFRYIENvbXBsZXRlIGFuZCBSWAorICBBdmFpbGFibGUuICBUaGlzIGludGVyZmFjZSBwcm92aWRlcyB0aGUgbWVjaGFuaXNtIHdoZXJlYnkgYSBjbGllbnQKKyAgY2FuIHJlZ2lzdGVyIHRvIHN1cHBvcnQgb25lIG9mIHRoZXNlLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgY29yZQorICBEWEUgaW1wbGVtZW50YXRpb24gd2lsbCBpbnZva2UgdGhpcyBBUEkgdHdpY2UsIG9uY2UgZm9yIGVhY2ggaW50ZXJydXB0LgorICAKKyAgQHBhcmFtICBpbnRUeXBlOiAgICAgICAgICBFbnVtZXJhdGlvbiBvZiB0aGUgaW50ZXJydXB0IHR5cGUgKFRYIG9yIFJYKQorICBAcGFyYW0gIGNhbGxiYWNrRnVuY3Rpb246IElTUiBmdW5jdGlvbiBwb2ludGVyCisgIEBwYXJhbSAgdXNyQ3R4dDogICAgICAgICAgVXNlciBjb250ZXh0IHBhc3NlZCBiYWNrIHdoZW5ldmVyIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRnVuY3Rpb24gaXMgaW52b2tlZAorCisgIEByZXR1cm4gU1VDQ0VTUyBpZiB0aGUgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsCisqLworCit3cHRfc3RhdHVzIHdwYWxSZWdpc3RlckludGVycnVwdAorKAorICAgd3B0X3VpbnQzMiAgICAgIGludFR5cGUsCisgICB3cGFsSXNyVHlwZSAgICAgY2FsbGJhY2tGdW5jdGlvbiwKKyAgIHZvaWQgICAgICAgICAgICAqdXNyQ3R4dAorKQoreworICAgaWYgKE5VTEwgPT0gZ3BFbnYpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogaW52b2tlZCBiZWZvcmUgc3Vic3lzdGVtIGluaXRpYWxpemVkIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIGlmIChOVUxMID09IGNhbGxiYWNrRnVuY3Rpb24pIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogaW52b2tlZCB3aXRoIE5VTEwgY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgc3dpdGNoIChpbnRUeXBlKSB7CisKKyAgIGNhc2UgRFhFX0lOVEVSUlVQVF9UWF9DT01QTEU6CisgICAgICBpZiAoTlVMTCAhPSBncEVudi0+dHhfaXNyKSB7CisgICAgICAgICAvKiBUWCBjb21wbGV0ZSBoYW5kbGVyIGFscmVhZHkgcmVnaXN0ZXJlZCAqLworICAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IFRYIGludGVycnVwdCBoYW5kbGVyIGFscmVhZHkgcmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAvKiBmYWxsIHRob3VnaCBhbmQgYWNjZXB0IHRoZSBuZXcgdmFsdWVzICovCisgICAgICB9CisgICAgICBncEVudi0+dHhfaXNyID0gY2FsbGJhY2tGdW5jdGlvbjsKKyAgICAgIGdwRW52LT50eF9jb250ZXh0ID0gdXNyQ3R4dDsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIERYRV9JTlRFUlJVUFRfUlhfUkVBRFk6CisgICAgICBpZiAoTlVMTCAhPSBncEVudi0+cnhfaXNyKSB7CisgICAgICAgICAvKiBSWCBjb21wbGV0ZSBoYW5kbGVyIGFscmVhZHkgcmVnaXN0ZXJlZCAqLworICAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLAorICAgICAgICAgICAgICAgICAiJXM6IFJYIGludGVycnVwdCBoYW5kbGVyIGFscmVhZHkgcmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAvKiBmYWxsIHRob3VnaCBhbmQgYWNjZXB0IHRoZSBuZXcgdmFsdWVzICovCisgICAgICB9CisgICAgICBncEVudi0+cnhfaXNyID0gY2FsbGJhY2tGdW5jdGlvbjsKKyAgICAgIGdwRW52LT5yeF9jb250ZXh0ID0gdXNyQ3R4dDsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBVbmtub3duIGludGVycnVwdCB0eXBlIFsldV0iLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGludFR5cGUpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgIEBicmllZiB3cGFsVW5SZWdpc3RlckludGVycnVwdCBwcm92aWRlcyBhIG1lY2hhbnNpbSBmb3IgY2xpZW50CisgICAgICAgICB0byB1bi1yZWdpc3RlciBmb3IgYSBnaXZlbiBpbnRlcnJ1cHQKKworICBXaGVuIERYRSBzdG9wLCByZW1vdmUgcmVnaXN0ZXJlZCBpbmZvcm1hdGlvbiBmcm9tIFBBTAorICAKKyAgQHBhcmFtICBpbnRUeXBlOiAgICAgICAgICBFbnVtZXJhdGlvbiBvZiB0aGUgaW50ZXJydXB0IHR5cGUgKFRYIG9yIFJYKQorCisgIEByZXR1cm4gTk9ORQorKi8KKwordm9pZCB3cGFsVW5SZWdpc3RlckludGVycnVwdAorKAorICAgd3B0X3VpbnQzMiAgICAgIGludFR5cGUKKykKK3sKKyAgIGlmIChOVUxMID09IGdwRW52KSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IGludm9rZWQgYmVmb3JlIHN1YnN5c3RlbSBpbml0aWFsaXplZCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIHN3aXRjaCAoaW50VHlwZSkgeworCisgICBjYXNlIERYRV9JTlRFUlJVUFRfVFhfQ09NUExFOgorICAgICAgZGlzYWJsZV9pcnFfbm9zeW5jKGdwRW52LT50eF9pcnEpOworICAgICAgaWYgKGdwRW52LT50eF9yZWdpc3RlcmVkKQorICAgICAgeworICAgICAgICAgZnJlZV9pcnEoZ3BFbnYtPnR4X2lycSwgZ3BFbnYpOworICAgICAgICAgZ3BFbnYtPnR4X3JlZ2lzdGVyZWQgPSAwOworICAgICAgfQorICAgICAgZ3BFbnYtPnR4X2lzciA9IE5VTEw7CisgICAgICBncEVudi0+dHhfY29udGV4dCA9IE5VTEw7CisgICAgICBicmVhazsKKworICAgY2FzZSBEWEVfSU5URVJSVVBUX1JYX1JFQURZOgorICAgICAgZGlzYWJsZV9pcnFfbm9zeW5jKGdwRW52LT5yeF9pcnEpOworICAgICAgaWYgKGdwRW52LT5yeF9yZWdpc3RlcmVkKQorICAgICAgeworICAgICAgICAgZnJlZV9pcnEoZ3BFbnYtPnJ4X2lycSwgZ3BFbnYpOworICAgICAgICAgZ3BFbnYtPnJ4X3JlZ2lzdGVyZWQgPSAwOworICAgICAgfQorICAgICAgZ3BFbnYtPnJ4X2lzciA9IE5VTEw7CisgICAgICBncEVudi0+cnhfY29udGV4dCA9IE5VTEw7CisgICAgICBicmVhazsKKworICAgZGVmYXVsdDoKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogVW5rbm93biBpbnRlcnJ1cHQgdHlwZSBbJXVdIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbnRUeXBlKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgcmV0dXJuOworfQorCisvKioKKyAgQGJyaWVmIHdwYWxFbmFibGVJbnRlcnJ1cHQgcHJvdmlkZXMgYSBtZWNoYW5zaW0gZm9yIGEgY2xpZW50CisgICAgICAgICB0byByZXF1ZXN0IHRoYXQgYSBnaXZlbiBpbnRlcnJ1cHQgYmUgZW5hYmxlZAorCisgIFRoZSBEWEUgaW50ZXJmYWNlIHN1cHBvcnRzIHR3byBpbnRlcnJ1cHRzLCBUWCBDb21wbGV0ZSBhbmQgUlgKKyAgQXZhaWxhYmxlLiAgVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIG1lY2hhbmlzbSB3aGVyZWJ5IGEgY2xpZW50CisgIGNhbiByZXF1ZXN0IHRoYXQgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGFkYXB0YXRpb24gbGF5ZXIgYWxsb3dzIGEKKyAgZ2l2ZW4gaW50ZXJydXB0IHRvIG9jY3VyLiAgVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQgaWYgYSBnaXZlbgorICBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQsIGlmIHRoZSBpbnRlcnJ1cHQgb2NjdXJzIHRoZW4gdGhlIEFQUFMgQ1BVCisgIHdpbGwgbm90IGJlIGludGVycnVwdGVkLgorICAKKyAgQHBhcmFtICBpbnRUeXBlOiAgICAgICAgICBFbnVtZXJhdGlvbiBvZiB0aGUgaW50ZXJydXB0IHR5cGUgKFRYIG9yIFJYKQorCisgIEByZXR1cm4gU1VDQ0VTUyBpZiB0aGUgaW50ZXJydXB0IHdhcyBlbmFibGVkCisqLword3B0X3N0YXR1cyB3cGFsRW5hYmxlSW50ZXJydXB0CisoCisgICB3cHRfdWludDMyICAgIGludFR5cGUKKykKK3sKKyAgIGludCByZXQ7CisgICAKKyAgIHN3aXRjaCAoaW50VHlwZSkgCisgICB7CisgICBjYXNlIERYRV9JTlRFUlJVUFRfUlhfUkVBRFk6CisgICAgICBpZiAoIWdwRW52LT5yeF9yZWdpc3RlcmVkKSAKKyAgICAgIHsKKyAgICAgICAgIGdwRW52LT5yeF9yZWdpc3RlcmVkID0gMTsKKyAgICAgICAgIHJldCA9IHJlcXVlc3RfaXJxKGdwRW52LT5yeF9pcnEsIHdwYWxSeElzciwgSVJRRl9UUklHR0VSX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAid2Nuc3Nfd2xhbiIsIGdwRW52KTsKKyAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogUlggSVJRIHJlcXVlc3QgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgCisgICAgICAgIAorICAgICAgICAgcmV0ID0gZW5hYmxlX2lycV93YWtlKGdwRW52LT5yeF9pcnEpOworICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBlbmFibGVfaXJxX3dha2UgZmFpbGVkIGZvciBSWCBJUlEiLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgLyogbm90IGZhdGFsIC0tIGtlZXAgb24gZ29pbmcgKi8KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGVuYWJsZV9pcnEoZ3BFbnYtPnJ4X2lycSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgIGNhc2UgRFhFX0lOVEVSUlVQVF9UWF9DT01QTEU6CisgICAgICBpZiAoIWdwRW52LT50eF9yZWdpc3RlcmVkKSAKKyAgICAgIHsKKyAgICAgICAgIGdwRW52LT50eF9yZWdpc3RlcmVkID0gMTsKKyAgICAgICAgIHJldCA9IHJlcXVlc3RfaXJxKGdwRW52LT50eF9pcnEsIHdwYWxUeElzciwgSVJRRl9UUklHR0VSX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAid2Nuc3Nfd2xhbiIsIGdwRW52KTsKKyAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogVFggSVJRIHJlcXVlc3QgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgIAorICAgCisgICAgICAgICByZXQgPSBlbmFibGVfaXJxX3dha2UoZ3BFbnYtPnR4X2lycSk7CisgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGVuYWJsZV9pcnFfd2FrZSBmYWlsZWQgZm9yIFRYIElSUSIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAvKiBub3QgZmF0YWwgLS0ga2VlcCBvbiBnb2luZyAqLworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgZW5hYmxlX2lycShncEVudi0+dHhfaXJxKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgZGVmYXVsdDoKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICIlczogdW5rbm93biBpbnRlcnJ1cHQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAoaW50KWludFR5cGUpOworICAgICAgYnJlYWs7CisgICB9CisgICAvKiBvbiB0aGUgaW50ZWdyYXRlZCBwbGF0Zm9ybSB0aGVyZSBpcyBubyBwbGF0Zm9ybS1zcGVjaWZpYworICAgICAgaW50ZXJydXB0IGNvbnRyb2wgKi8KKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICBAYnJpZWYgd3BhbERpc2FibGVJbnRlcnJ1cHQgcHJvdmlkZXMgYSBtZWNoYW5zaW0gZm9yIGEgY2xpZW50CisgICAgICAgICB0byByZXF1ZXN0IHRoYXQgYSBnaXZlbiBpbnRlcnJ1cHQgYmUgZGlzYWJsZWQKKworICBUaGUgRFhFIGludGVyZmFjZSBzdXBwb3J0cyB0d28gaW50ZXJydXB0cywgVFggQ29tcGxldGUgYW5kIFJYCisgIEF2YWlsYWJsZS4gIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHRoZSBtZWNoYW5pc20gd2hlcmVieSBhIGNsaWVudAorICBjYW4gcmVxdWVzdCB0aGF0IHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBhZGFwdGF0aW9uIGxheWVyIG5vdCBhbGxvdyBhCisgIGdpdmVuIGludGVycnVwdCB0byBvY2N1ci4gIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGlmIGEgZ2l2ZW4KKyAgaW50ZXJydXB0IGlzIG5vdCBlbmFibGVkLCBpZiB0aGUgaW50ZXJydXB0IG9jY3VycyB0aGVuIHRoZSBBUFBTIENQVQorICB3aWxsIG5vdCBiZSBpbnRlcnJ1cHRlZC4KKyAgCisgIEBwYXJhbSAgaW50VHlwZTogICAgICAgICAgRW51bWVyYXRpb24gb2YgdGhlIGludGVycnVwdCB0eXBlIChUWCBvciBSWCkKKworICBAcmV0dXJuIFNVQ0NFU1MgaWYgdGhlIGludGVycnVwdCB3YXMgZGlzYWJsZWQKKyovCit3cHRfc3RhdHVzIHdwYWxEaXNhYmxlSW50ZXJydXB0CisoCisgICB3cHRfdWludDMyICAgIGludFR5cGUKKykKK3sKKyAgIHN3aXRjaCAoaW50VHlwZSkgCisgICB7CisgICBjYXNlIERYRV9JTlRFUlJVUFRfUlhfUkVBRFk6CisgICAgICBkaXNhYmxlX2lycV9ub3N5bmMoZ3BFbnYtPnJ4X2lycSk7CisgICAgICBicmVhazsKKyAgIGNhc2UgRFhFX0lOVEVSUlVQVF9UWF9DT01QTEU6CisgICAgICBkaXNhYmxlX2lycV9ub3N5bmMoZ3BFbnYtPnR4X2lycSk7CisgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiJXM6IHVua25vd24gaW50ZXJydXB0OiAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKGludClpbnRUeXBlKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICAvKiBvbiB0aGUgaW50ZWdyYXRlZCBwbGF0Zm9ybSB0aGVyZSBpcyBubyBwbGF0Zm9ybS1zcGVjaWZpYworICAgICAgaW50ZXJydXB0IGNvbnRyb2wgKi8KKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICBAYnJpZWYgd3BhbFdyaXRlUmVnaXN0ZXIgcHJvdmlkZXMgYSBtZWNoYW5zaW0gZm9yIGEgY2xpZW50CisgICAgICAgICB0byB3cml0ZSBkYXRhIGludG8gYSBoYXJkd2FyZSBkYXRhIHJlZ2lzdGVyCisKKyAgQHBhcmFtICBhZGRyZXNzOiAgUGh5c2ljYWwgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyCisgIEBwYXJhbSAgZGF0YTogICAgIERhdGEgdmFsdWUgdG8gYmUgd3JpdHRlbgorCisgIEByZXR1cm4gU1VDQ0VTUyBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4KKyovCit3cHRfc3RhdHVzIHdwYWxXcml0ZVJlZ2lzdGVyCisoCisgICB3cHRfdWludDMyICAgYWRkcmVzcywKKyAgIHdwdF91aW50MzIgICBkYXRhCispCit7CisgICBpZiAoTlVMTCA9PSBncEVudikgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBpbnZva2VkIGJlZm9yZSBzdWJzeXN0ZW0gaW5pdGlhbGl6ZWQiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgaWYgKChhZGRyZXNzIDwgZ3BFbnYtPndjbnNzX21lbW9yeS0+c3RhcnQpIHx8CisgICAgICAgKGFkZHJlc3MgPiBncEVudi0+d2Nuc3NfbWVtb3J5LT5lbmQpKSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IFJlZ2lzdGVyIGFkZHJlc3MgMHglMHggb3V0IG9mIHJhbmdlIDB4JTB4IC0gMHglMHgiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgIGdwRW52LT53Y25zc19tZW1vcnktPnN0YXJ0LCBncEVudi0+d2Nuc3NfbWVtb3J5LT5lbmQpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgaWYgKDAgIT0gKGFkZHJlc3MgJiAweDMpKSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IFJlZ2lzdGVyIGFkZHJlc3MgMHglMHggaXMgbm90IHdvcmQgYWxpZ25lZCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWRkcmVzcyk7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICB3bWIoKTsKKyAgIHdyaXRlbF9yZWxheGVkKGRhdGEsIGdwRW52LT5tbWlvICsgKGFkZHJlc3MgLSBXQ05TU19CQVNFX0FERFJFU1MpKTsKKworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgIEBicmllZiB3cGFsUmVhZFJlZ2lzdGVyIHByb3ZpZGVzIGEgbWVjaGFuc2ltIGZvciBhIGNsaWVudAorICAgICAgICAgdG8gcmVhZCBkYXRhIGZyb20gYSBoYXJkd2FyZSBkYXRhIHJlZ2lzdGVyCisKKyAgQHBhcmFtICBhZGRyZXNzOiAgUGh5c2ljYWwgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyCisgIEBwYXJhbSAgZGF0YTogICAgIFJldHVybiBsb2NhdGlvbiBmb3IgdmFsdWUgdGhhdCBpcyByZWFkCisKKyAgQHJldHVybiBTVUNDRVNTIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVhZAorKi8KK3dwdF9zdGF0dXMgd3BhbFJlYWRSZWdpc3RlcgorKAorICAgd3B0X3VpbnQzMiAgIGFkZHJlc3MsCisgICB3cHRfdWludDMyICAqZGF0YQorKQoreworICAgaWYgKE5VTEwgPT0gZ3BFbnYpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogaW52b2tlZCBiZWZvcmUgc3Vic3lzdGVtIGluaXRpYWxpemVkIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIGlmICgoYWRkcmVzcyA8IGdwRW52LT53Y25zc19tZW1vcnktPnN0YXJ0KSB8fAorICAgICAgIChhZGRyZXNzID4gZ3BFbnYtPndjbnNzX21lbW9yeS0+ZW5kKSkgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBSZWdpc3RlciBhZGRyZXNzIDB4JTB4IG91dCBvZiByYW5nZSAweCUweCAtIDB4JTB4IiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICBncEVudi0+d2Nuc3NfbWVtb3J5LT5zdGFydCwgZ3BFbnYtPndjbnNzX21lbW9yeS0+ZW5kKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIGlmICgwICE9IChhZGRyZXNzICYgMHgzKSkgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBSZWdpc3RlciBhZGRyZXNzIDB4JTB4IGlzIG5vdCB3b3JkIGFsaWduZWQiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFkZHJlc3MpOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgKmRhdGEgPSByZWFkbF9yZWxheGVkKGdwRW52LT5tbWlvICsgKGFkZHJlc3MgLSBXQ05TU19CQVNFX0FERFJFU1MpKTsKKyAgIHJtYigpOworCisgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAgQGJyaWVmIHdwYWxXcml0ZURldmljZU1lbW9yeSBwcm92aWRlcyBhIG1lY2hhbnNpbSBmb3IgYSBjbGllbnQKKyAgICAgICAgIHRvIHdyaXRlIGRhdGEgaW50byB0aGUgaGFyZHdhcmUgYWRkcmVzcyBzcGFjZQorCisgIEBwYXJhbSAgYWRkcmVzczogIFN0YXJ0IGFkZHJlc3Mgb2YgcGh5c2ljYWwgbWVtb3J5IHRvIGJlIHdyaXR0ZW4KKyAgQHBhcmFtICBzX2J1ZmZlcjogVmlydHVhbCBzb3VyY2UgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSBkYXRhIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgYmUgcmVhZAorICBAcGFyYW0gIGxlbjogICAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBiZSB3cml0dGVuCisKKyAgQHJldHVybiBTVUNDRVNTIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbgorKi8KK3dwdF9zdGF0dXMgd3BhbFdyaXRlRGV2aWNlTWVtb3J5CisoCisgIHdwdF91aW50MzIgYWRkcmVzcywKKyAgd3B0X3VpbnQ4KiBzX2J1ZmZlciwKKyAgd3B0X3VpbnQzMiBsZW4KKykKK3sKKyAgIGlmIChOVUxMID09IGdwRW52KSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IGludm9rZWQgYmVmb3JlIHN1YnN5c3RlbSBpbml0aWFsaXplZCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBpZiAoKGFkZHJlc3MgPCBncEVudi0+d2Nuc3NfbWVtb3J5LT5zdGFydCkgfHwKKyAgICAgICAoKGFkZHJlc3MgKyBsZW4pID4gZ3BFbnYtPndjbnNzX21lbW9yeS0+ZW5kKSkgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBNZW1vcnkgYWRkcmVzcyAweCUweCBsZW4gJWQgb3V0IG9mIHJhbmdlIDB4JTB4IC0gMHglMHgiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFkZHJlc3MsIGxlbiwKKyAgICAgICAgICAgICAgICAgZ3BFbnYtPndjbnNzX21lbW9yeS0+c3RhcnQsIGdwRW52LT53Y25zc19tZW1vcnktPmVuZCk7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBtZW1jcHkoZ3BFbnYtPm1taW8gKyAoYWRkcmVzcyAtIFdDTlNTX0JBU0VfQUREUkVTUyksIHNfYnVmZmVyLCBsZW4pOworICAgd21iKCk7CisKKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICBAYnJpZWYgd3BhbFJlYWREZXZpY2VNZW1vcnkgcHJvdmlkZXMgYSBtZWNoYW5zaW0gZm9yIGEgY2xpZW50CisgICAgICAgICB0byByZWFkIGRhdGEgZnJvbSB0aGUgaGFyZHdhcmUgYWRkcmVzcyBzcGFjZQorCisgIEBwYXJhbSAgYWRkcmVzczogIFN0YXJ0IGFkZHJlc3Mgb2YgcGh5c2ljYWwgbWVtb3J5IHRvIGJlIHJlYWQKKyAgQHBhcmFtICBkX2J1ZmZlcjogVmlydHVhbCBkZXN0aW5hdGlvbiBhZGRyZXNzIHRvIHdoaWNoIHRoZQorICAgICAgICAgICAgICAgICAgICBkYXRhIHdpbGwgYmUgd3JpdHRlbgorICBAcGFyYW0gIGxlbjogICAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBiZSByZWFkCisKKyAgQHJldHVybiBTVUNDRVNTIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVhZAorKi8KK3dwdF9zdGF0dXMgd3BhbFJlYWREZXZpY2VNZW1vcnkKKygKKyAgd3B0X3VpbnQzMiBhZGRyZXNzLAorICB3cHRfdWludDgqIGRfYnVmZmVyLAorICB3cHRfdWludDMyIGxlbgorKQoreworICAgaWYgKE5VTEwgPT0gZ3BFbnYpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogaW52b2tlZCBiZWZvcmUgc3Vic3lzdGVtIGluaXRpYWxpemVkIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIGlmICgoYWRkcmVzcyA8IGdwRW52LT53Y25zc19tZW1vcnktPnN0YXJ0KSB8fAorICAgICAgICgoYWRkcmVzcyArIGxlbikgPiBncEVudi0+d2Nuc3NfbWVtb3J5LT5lbmQpKSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IE1lbW9yeSBhZGRyZXNzIDB4JTB4IGxlbiAlZCBvdXQgb2YgcmFuZ2UgMHglMHggLSAweCUweCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWRkcmVzcywgbGVuLAorICAgICAgICAgICAgICAgICBncEVudi0+d2Nuc3NfbWVtb3J5LT5zdGFydCwgZ3BFbnYtPndjbnNzX21lbW9yeS0+ZW5kKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIG1lbWNweShkX2J1ZmZlciwgZ3BFbnYtPm1taW8gKyAoYWRkcmVzcyAtIFdDTlNTX0JBU0VfQUREUkVTUyksIGxlbik7CisgICBybWIoKTsKKworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgIEBicmllZiB3cGFsRGV2aWNlSW5pdCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBpbml0aWFsaXplIHRoZSBEWEUKKyAgICAgICAgIHBsYXRmb3JtIGFkYXB0YXRpb24KKworICBAcGFyYW0gIGRldmljZUNCOiAgSW1wbGVtZW50YXRpb24tc3BlY2lmaWMgZGV2aWNlIGNvbnRyb2wgYmxvY2sKKworICBAc2VlICAgIHdwYWxEZXZpY2VDbG9zZQorCisgIEByZXR1cm4gU1VDQ0VTUyBpZiB0aGUgRFhFIGFic3RyYWN0aW9uIHdhcyBvcGVuZWQKKyovCit3cHRfc3RhdHVzIHdwYWxEZXZpY2VJbml0CisoCisgICB2b2lkICogZGV2aWNlQ0IKKykKK3sKKyAgIGhkZF9jb250ZXh0X3QgKnBIZGRDdHggPSAoaGRkX2NvbnRleHRfdCAqKWRldmljZUNCOworICAgc3RydWN0IGRldmljZSAqd2Nuc3NfZGV2aWNlID0gcEhkZEN0eC0+cGFyZW50X2RldjsKKyAgIHN0cnVjdCByZXNvdXJjZSAqd2Nuc3NfbWVtb3J5OworICAgaW50IHR4X2lycTsKKyAgIGludCByeF9pcnE7CisKKyAgIGlmIChOVUxMICE9IGdwRW52KSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IGludm9rZWQgIGFmdGVyIHN1YnN5c3RlbSBpbml0aWFsaXplZCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBpZiAoTlVMTCA9PSB3Y25zc19kZXZpY2UpIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX0RBTF9EQVRBLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogaW52YWxpZCBkZXZpY2UiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgd2Nuc3NfbWVtb3J5ID0gd2Nuc3Nfd2xhbl9nZXRfbWVtb3J5X21hcCh3Y25zc19kZXZpY2UpOworICAgaWYgKE5VTEwgPT0gd2Nuc3NfbWVtb3J5KSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IFdDTlNTIG1lbW9yeSBtYXAgdW5hdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICB0eF9pcnEgPSB3Y25zc193bGFuX2dldF9keGVfdHhfaXJxKHdjbnNzX2RldmljZSk7CisgICBpZiAoMCA+IHR4X2lycSkgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBXQ05TUyBUWCBJUlEgdW5hdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICByeF9pcnEgPSB3Y25zc193bGFuX2dldF9keGVfcnhfaXJxKHdjbnNzX2RldmljZSk7CisgICBpZiAoMCA+IHJ4X2lycSkgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBXQ05TUyBSWCBJUlEgdW5hdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFOworICAgfQorCisgICBncEVudiA9IHdwYWxNZW1vcnlBbGxvY2F0ZShzaXplb2YoKmdwRW52KSk7CisgICBpZiAoTlVMTCA9PSBncEVudikgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfTk9NRU07CisgICB9CisKKyAgIG1lbXNldChncEVudiwgMCwgc2l6ZW9mKCpncEVudikpOworCisgICBncEVudi0+d2Nuc3NfbWVtb3J5ID0gd2Nuc3NfbWVtb3J5OworICAgZ3BFbnYtPnR4X2lycSA9IHR4X2lycTsKKyAgIGdwRW52LT5yeF9pcnEgPSByeF9pcnE7CisKKyAgIC8qIG5vdGUgdGhlIHdlIGRvbid0IGludm9rZSByZXF1ZXN0X21lbV9yZWdpb24oKS4KKyAgICAgIHRoZSBtZW1vcnkgZGVzY3JpYmVkIGJ5IHdjbnNzX21lbW9yeSBlbmNvbXBhc2VzIHRoZSBlbnRpcmUKKyAgICAgIHJlZ2lzdGVyIHNwYWNlIChpbmNsdWRpbmcgQlQgYW5kIEZNKSBhbmQgd2UgZG8gbm90IHdhbnQKKyAgICAgIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhhdCBtZW1vcnkgKi8KKworICAgZ3BFbnYtPm1taW8gPSBpb3JlbWFwKHdjbnNzX21lbW9yeS0+c3RhcnQsIHJlc291cmNlX3NpemUod2Nuc3NfbWVtb3J5KSk7CisgICBpZiAoTlVMTCA9PSBncEVudi0+bW1pbykgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBtZW1vcnkgcmVtYXAgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICBnb3RvIGVycl9pb3JlbWFwOworICAgfQorCisgICBncEVudi0+dHhfcmVnaXN0ZXJlZCA9IDA7CisgICBncEVudi0+cnhfcmVnaXN0ZXJlZCA9IDA7CisKKyAgIC8qIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgZW52aXJvbm1lbnQsIG1lbW9yeSBhbmQgSVJRcyAqLworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKworIGVycl9pb3JlbWFwOgorICAgd3BhbE1lbW9yeUZyZWUoZ3BFbnYpOworICAgZ3BFbnYgPSBOVUxMOworCisgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisKK30KKworCisvKioKKyAgQGJyaWVmIHdwYWxEZXZpY2VDbG9zZSBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBkZWluaXRpYWxpemUgdGhlIERYRQorICAgICAgICAgcGxhdGZvcm0gYWRhcHRhdGlvbgorCisgIEBwYXJhbSAgZGV2aWNlQ0I6ICBJbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBkZXZpY2UgY29udHJvbCBibG9jaworCisgIEBzZWUgICAgd3BhbERldmljZU9wZW4KKworICBAcmV0dXJuIFNVQ0NFU1MgaWYgdGhlIERYRSBhYnN0cmFjdGlvbiB3YXMgY2xvc2VkCisqLword3B0X3N0YXR1cyB3cGFsRGV2aWNlQ2xvc2UKKygKKyAgIHZvaWQgKiBkZXZpY2VDQgorICkKK3sKKyAgIGlmIChOVUxMID09IGdwRW52KSB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9EQUxfREFUQSwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IGludm9rZWQgYmVmb3JlIHN1YnN5c3RlbSBpbml0aWFsaXplZCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBpZiAoZ3BFbnYtPnJ4X3JlZ2lzdGVyZWQpCisgICB7CisgICAgICBmcmVlX2lycShncEVudi0+cnhfaXJxLCBncEVudik7CisgICB9CisgICBpZiAoZ3BFbnYtPnR4X3JlZ2lzdGVyZWQpCisgICB7CisgICAgICBmcmVlX2lycShncEVudi0+dHhfaXJxLCBncEVudik7CisgICB9CisgICBpb3VubWFwKGdwRW52LT5tbWlvKTsKKyAgIHdwYWxNZW1vcnlGcmVlKGdwRW52KTsKKyAgIGdwRW52ID0gTlVMTDsKKworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgIEBicmllZiB3cGFsTm90aWZ5U21zbSBwcm92aWRlcyBhIG1lY2hhbnNpbSBmb3IgYSBjbGllbnQgdG8gCisgICAgICAgICBub3RpZnkgU01TTSB0byBzdGFydCBEWEUgZW5naW5lIGFuZC9vciBjb25kaXRpb24gb2YgVHgKKyAgICAgICAgIHJpbmcgYnVmZmVyCisKKyAgQHBhcmFtICBjbHJTdDogICBiaXQocykgdG8gYmUgY2xlYXJlZCBvbiB0aGUgTUFTSyAKKyAgQHBhcmFtICBzZXRTdDogICBiaXQocykgdG8gYmUgc2V0IG9uIHRoZSBNQVNLCisKKyAgQHJldHVybiBTVUNDRVNTIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bAorKi8KK3dwdF9zdGF0dXMgd3BhbE5vdGlmeVNtc20KKygKKyAgIHdwdF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xyU3QsCisgICB3cHRfdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0CispCit7CisgICBpbnQgcmM7CisgICByYyA9IHNtc21fY2hhbmdlX3N0YXRlKFNNU01fQVBQU19TVEFURSwgY2xyU3QsIHNldFN0KTsKKyAgIGlmKDAgIT0gcmMpIAorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfREFMX0RBVEEsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIiVzOiBzbXNtX2NoYW5nZV9zdGF0ZSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFOworICAgfQorICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvV1BBTC9zcmMvd2xhbl9xY3RfcGFsX21zZy5jIGIvQ09SRS9XREkvV1BBTC9zcmMvd2xhbl9xY3RfcGFsX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZDE2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9XUEFML3NyYy93bGFuX3FjdF9wYWxfbXNnLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgd2xhbl9xY3RfcGFsX21zZy5jCisgIAorICBcYnJpZWYgSW1wbGVtZW50YXRpb24gbWVzc2FnZSBBUElzIFBBTCBleHBvcnRzLiB3cHQgPSAoV2xhbiBQYWwgVHlwZSkgd3BhbCA9IChXbGFuIFBBTCkKKyAgICAgICAgICAgICAgIAorICAgRGVmaW5pdGlvbnMgZm9yIHBsYXRmb3JtIHdpdGggbGVnYWN5IFVNQUMgc3VwcG9ydC4KKyAgCisgICBDb3B5cmlnaHQgMjAxMCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX21zZy5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9hcGkuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHJhY2UuaCIKKyNpbmNsdWRlICJ2b3NfbXEuaCIKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIHdwYWxQb3N0Q3RybE1zZyAtIFBvc3QgYSBtZXNzYWdlIHRvIGNvbnRyb2wgY29udGV4dCBzbyBpdCBjYW4gYmUgcHJvY2Vzc2VkIGluIHRoYXQgY29udGV4dC4KKyAgICBQYXJhbTogCisgICAgICAgIHBQYWxDb250ZXh0IC0gQSBQQUwgY29udGV4dAorICAgICAgICBwTXNnIC0gYSBwb2ludGVyIHRvIGNhbGxlZCBhbGxvY2F0ZWQgb3BhcXVlIG9iamVjdDsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxQb3N0Q3RybE1zZyh2b2lkICpwUGFsQ29udGV4dCwgd3B0X21zZyAqcE1zZykKK3sKKyAgIHdwdF9zdGF0dXMgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisgICB2b3NfbXNnX3QgbXNnOworCisgICBpZiAoTlVMTCA9PSBwTXNnKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICIlczogTlVMTCBtZXNzYWdlIHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgV1BBTF9BU1NFUlQoMCk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgfQorCisgICBtc2cudHlwZSA9IDA7ICAvL1RoaXMgZmllbGQgaXMgbm90IHVzZWQgYmVjYXVzZSBWT1NTIGRvZXNuJ3QgY2hlY2sgaXQuCisgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgbXNnLmJvZHl2YWwgPSAwOworICAgbXNnLmJvZHlwdHIgPSBwTXNnOworICAgaWYoVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01RX0lEX1dESSwgJm1zZykpKQorICAgeworICAgICAgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgfQorICAgZWxzZQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBmYWlsIHRvIHBvc3QgbXNnICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwTXNnLT50eXBlKTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIHdwYWxQb3N0VHhNc2cgLSBQb3N0IGEgbWVzc2FnZSB0byBUWCBjb250ZXh0IHNvIGl0IGNhbiBiZSBwcm9jZXNzZWQgaW4gdGhhdCBjb250ZXh0LgorICAgIFBhcmFtOiAKKyAgICAgICAgcFBhbENvbnRleHQgLSBBIFBBTCBjb250ZXh0IFBBTAorICAgICAgICBwTXNnIC0gYSBwb2ludGVyIHRvIGNhbGxlZCBhbGxvY2F0ZWQgb3BhcXVlIG9iamVjdDsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxQb3N0VHhNc2codm9pZCAqcFBhbENvbnRleHQsIHdwdF9tc2cgKnBNc2cpCit7CisgICB3cHRfc3RhdHVzIHN0YXR1cyA9IGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFOworICAgdm9zX21zZ190IG1zZzsKKworICAgaWYgKE5VTEwgPT0gcE1zZykKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX1BBTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IE5VTEwgbWVzc2FnZSBwb2ludGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdQQUxfQVNTRVJUKDApOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgbXNnLnR5cGUgPSAwOyAvL1RoaXMgZmllbGQgaXMgbm90IHVzZWQgYmVjYXVzZSBWT1NTIGRvZXNuJ3QgY2hlY2sgaXQuCisgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgbXNnLmJvZHl2YWwgPSAwOworICAgbXNnLmJvZHlwdHIgPSBwTXNnOworICAgaWYoVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc190eF9tcV9zZXJpYWxpemUoVk9TX01RX0lEX1dESSwgJm1zZykpKQorICAgeworICAgICAgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgfQorICAgZWxzZQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBmYWlsIHRvIHBvc3QgbXNnICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwTXNnLT50eXBlKTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICB3cGFsUG9zdFJ4TXNnIC0gUG9zdCBhIG1lc3NhZ2UgdG8gUlggY29udGV4dCBzbyBpdCBjYW4gYmUgcHJvY2Vzc2VkIGluIHRoYXQgY29udGV4dC4KKyAgICBQYXJhbTogCisgICAgICAgIHBQYWxDb250ZXh0IC0gQSBQQUwgY29udGV4dAorICAgICAgICBwTXNnIC0gYSBwb2ludGVyIHRvIGNhbGxlZCBhbGxvY2F0ZWQgb3BhcXVlIG9iamVjdDsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxQb3N0UnhNc2codm9pZCAqcFBhbENvbnRleHQsIHdwdF9tc2cgKnBNc2cpCit7CisgICB3cHRfc3RhdHVzIHN0YXR1cyA9IGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFOworICAgdm9zX21zZ190IG1zZzsKKworICAgaWYgKE5VTEwgPT0gcE1zZykKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX1BBTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAiJXM6IE5VTEwgbWVzc2FnZSBwb2ludGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIFdQQUxfQVNTRVJUKDApOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgIH0KKworICAgbXNnLnR5cGUgPSAwOyAvL1RoaXMgZmllbGQgaXMgbm90IHVzZWQgYmVjYXVzZSBWT1NTIGRvZXNuJ3QgY2hlY2sgaXQuCisgICBtc2cucmVzZXJ2ZWQgPSAwOworICAgbXNnLmJvZHl2YWwgPSAwOworICAgbXNnLmJvZHlwdHIgPSBwTXNnOworICAgaWYoVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19yeF9tcV9zZXJpYWxpemUoVk9TX01RX0lEX1dESSwgJm1zZykpKQorICAgeworICAgICAgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgfQorICAgZWxzZQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBmYWlsIHRvIHBvc3QgbXNnICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwTXNnLT50eXBlKTsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30KKwpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvV1BBTC9zcmMvd2xhbl9xY3RfcGFsX3BhY2tldC5jIGIvQ09SRS9XREkvV1BBTC9zcmMvd2xhbl9xY3RfcGFsX3BhY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTFiOTEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9XUEFML3NyYy93bGFuX3FjdF9wYWxfcGFja2V0LmMKQEAgLTAsMCArMSw3NzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHdsYW5fcWN0X3BhbF9wYWNrZXQuYworICAKKyAgXGJyaWVmIEltcGxlbWVudGF0aW9uIGZvciBQQUwgcGFja2V0LiB3cHQgPSAoV2xhbiBQYWwgVHlwZSkgd3BhbCA9IChXbGFuIFBBTCkKKyAgICAgICAgICAgICAgIAorICAgRGVmaW5pdGlvbnMgZm9yIHBsYXRmb3JtIHdpdGggVk9TUyBwYWNrZXQgc3VwcG9ydCBhbmQgTEEuCisgIAorICAgQ29weXJpZ2h0IDIwMTAgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9wYWNrZXQuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfYXBpLmgiCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3RyYWNlLmgiCisjaW5jbHVkZSAidm9zX3BhY2tldC5oIgorI2luY2x1ZGUgInZvc190cmFjZS5oIgorI2luY2x1ZGUgInZvc19saXN0LmgiCisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlICJkbWEtbWFwcGluZy5oIgorCisvKlBlciBzcGVjIGRlZmluaXRpb24qLworI2RlZmluZSBXUEFMX0VUSEVSTkVUX1BBS0NFVF9IRUFERVJfU0laRSAgICAgMTQKKworLypQZXIgc3BlYyBkZWZpbml0aW9uIC0gbm90IGluY2x1ZGluZyBRT1MgZmllbGQqLworI2RlZmluZSBXUEFMXzgwMl8xMV9QQUNLRVRfSEVBREVSX1NJWkUgICAgMjQgCisKKy8qcCBpcyBhIHBvaW50ZXIgdG8gd3B0X3BhY2tldCovCisjZGVmaW5lIFdQQUxfVE9fVk9TX1BLVChwKSAoKHZvc19wa3RfdCAqKShwKSkKKworCit0eXBlZGVmIHN0cnVjdAoreworICB2b2lkKiAgICAgIHBQaHlBZGRyOworICB3cHRfdWludDMyIHVMZW47Cit9d3B0X2l0ZXJhdG9yX2luZm87CisKKy8qIFN0b3JhZ2UgZm9yIERYRSBDQiBmdW5jdGlvbiBwb2ludGVyICovCitzdGF0aWMgd3BhbFBhY2tldExvd1BhY2tldENCIHdwYWxQYWNrZXRBdmFpbGFibGVDQiA9IE5VTEw7CisKKy8qCisgICB3cGFsUGFja2V0SW5pdCBpcyBuby1vcCBmb3IgVk9TUy1zdXBwb3J0IHdwdF9wYWNrZXQKKyovCit3cHRfc3RhdHVzIHdwYWxQYWNrZXRJbml0KHZvaWQgKnBQYWxDb250ZXh0KQoreworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKgorICAgd3BhbFBhY2tldENsb3NlIGlzIG5vLW9wIGZvciBWT1NTLXN1cHBvcnQgd3B0X3BhY2tldAorKi8KK3dwdF9zdGF0dXMgd3BhbFBhY2tldENsb3NlKHZvaWQgKnBQYWxDb250ZXh0KQoreworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsUGFja2V0UlhMb3dSZXNvdXJjZUNCIJYgUlggUkFXIHBhY2tlciBDQiBmdW5jdGlvbgorICAgIFBhcmFtOiAKKyAgICAgICAgcFBhY2tldCCWIEF2YWlsYWJsZSBSWCBwYWNrZXQKKyAgICAgICAgdXNlckRhdGEgLSBQQUwgQ2xpZW50IENvbnRleHQsIERYRQorICAgIFJldHVybjoKKyAgICAgICAgU3RhdHVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworVk9TX1NUQVRVUyB3cGFsUGFja2V0UlhMb3dSZXNvdXJjZUNCKHZvc19wa3RfdCAqcFBhY2tldCwgdl9WT0lEX3QgKnVzZXJEYXRhKQoreworICAgVk9TX1NUQVRVUyAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgdm9pZCogICAgICAgIHBEYXRhICAgICA9IE5VTEw7CisKKyAgIGlmIChOVUxMID09IHBQYWNrZXQpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAiR2V0IG5ldyBSWCBQQUwgcGFja2V0IGZhaWwiKTsKKyAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKyAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcmVzZXJ2ZV9oZWFkX2Zhc3QoIHBQYWNrZXQsICZwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQS1RfU0laRV9CVUZGRVIgKTsKKyAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAiUHJlcGFyZSBSWCBwYWNrZXQgZm9yIERYRSBmYWlsIik7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIGlmKChOVUxMID09IHdwYWxQYWNrZXRBdmFpbGFibGVDQikgfHwgKE5VTEwgPT0gdXNlckRhdGEpKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAgIkludmFsaWQgQVJHIGZvciBuZXcgUlggcGFja2V0Iik7CisgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHdwYWxQYWNrZXRBdmFpbGFibGVDQiggKHdwdF9wYWNrZXQgKilwUGFja2V0LCB1c2VyRGF0YSApOworICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsUGFja2V0QWxsb2MgliBBbGxvY2F0ZSBhIHdwdF9wYWNrZXQgZnJvbSBQQUwuCisgICAgUGFyYW06IAorICAgICAgICBwa3RUeXBlIJYgc3BlY2lmeSB0aGUgdHlwZSBvZiB3cHRfcGFja2V0IHRvIGFsbG9jYXRlCisgICAgICAgIG5Qa3RTaXplIC0gcGFja2V0IHNpemUKKyAgICBSZXR1cm46CisgICAgICAgIEEgcG9pbnRlciB0byB0aGUgd3B0X3BhY2tldC4gTlVMTCBtZWFucyBmYWlsLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9wYWNrZXQgKiB3cGFsUGFja2V0QWxsb2Mod3B0X3BhY2tldF90eXBlIHBrdFR5cGUsIHdwdF91aW50MzIgblBrdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwYWxQYWNrZXRMb3dQYWNrZXRDQiByeExvd0NCLCB2b2lkICp1c3JEYXRhKQoreworICAgVk9TX1NUQVRVUyAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgd3B0X3BhY2tldCogIHBQa3QgICAgICA9IE5VTEw7CisgICB2b3NfcGt0X3QqICAgcFZvc1BrdCAgID0gTlVMTDsKKyAgIHZvaWQqICAgICAgICBwRGF0YSAgICAgPSBOVUxMOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworICAgLyogSW5pdGlhbGl6ZSBEWEUgQ0IgZnVuY3Rpb24gcG9pbnRlciBzdG9yYWdlICovCisgICB3cGFsUGFja2V0QXZhaWxhYmxlQ0IgPSBOVUxMOworICAgc3dpdGNoIChwa3RUeXBlKQorICAgeworICAgY2FzZSBlV0xBTl9QQUxfUEtUX1RZUEVfVFhfODAyXzExX01HTVQ6CisgICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X2dldF9wYWNrZXQoJnBWb3NQa3QsIFZPU19QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Qa3RTaXplLCAxLCBWT1NfRkFMU0UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCAvKm5vIGNhbGxiYWNrKi8pOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgZVdMQU5fUEFMX1BLVF9UWVBFX1JYX1JBVzoKKyAgICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfZ2V0X3BhY2tldCgmcFZvc1BrdCwgVk9TX1BLVF9UWVBFX1JYX1JBVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Qa3RTaXplLCAxLCBWT1NfRkFMU0UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BhbFBhY2tldFJYTG93UmVzb3VyY2VDQiwgdXNyRGF0YSk7CisKKyNpZm5kZWYgRkVBVFVSRV9SMzNECisgICAgICAvKiBSZXNlcnZlIHRoZSBlbnRpcmUgcmF3IHJ4IGJ1ZmZlciBmb3IgRFhFICovCisgICAgICBpZiggdm9zU3RhdHVzID09IFZPU19TVEFUVVNfU1VDQ0VTUyApCisgICAgICB7CisgICAgICAgIHZvc1N0YXR1cyA9ICB2b3NfcGt0X3Jlc2VydmVfaGVhZF9mYXN0KCBwVm9zUGt0LCAmcERhdGEsIG5Qa3RTaXplICk7IAorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB3cGFsUGFja2V0QXZhaWxhYmxlQ0IgPSByeExvd0NCOworICAgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBwYWNrZXQgOiAlZCAiLCAoaW50KXZvc1N0YXR1cyk7CisgICAgICB9CisjZW5kaWYgLyogRkVBVFVSRV9SMzNEICovCisgICAgICBicmVhazsKKworICAgZGVmYXVsdDoKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX1BBTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgICIgdHJ5IHRvIGFsbG9jYXRlIHVuc3VwcG9ydGVkIHBhY2tldCB0eXBlICglZClcbiIsIHBrdFR5cGUpOworICAgICAgYnJlYWs7CisgICB9CisKKyAgIGlmKFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQorICAgeworICAgICAgcFBrdCA9ICh3cHRfcGFja2V0ICopcFZvc1BrdDsKKyAgIH0KKworCisgICByZXR1cm4gcFBrdDsKK30vKndwYWxQYWNrZXRBbGxvYyovCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxQYWNrZXRGcmVlIJYgRnJlZSBhIHdwdF9wYWNrZXQgY2hhaW4gZm9yIG9uZSBwYXJ0aWN1bGFyIHR5cGUuCisgICAgRm9yIG91ciBsZWdhY3kgVU1BQywgaXQgaXMgbm90IG5lZWRlZCBiZWNhdXNlIHZvc19wYWNrZXQgY29udGFpbnMgcGFsX3BhY2tldC4KKyAgICBQYXJhbTogCisgICAgICAgIHBQa3QgliBwb2ludGVyIHRvIGEgd3B0X3BhY2tldAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2VzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFBhY2tldEZyZWUod3B0X3BhY2tldCAqcFBrdCkKK3sKKyAgIFZPU19TVEFUVVMgdm9zU3RhdHVzOworCisgICBpZihOVUxMICE9IHBQa3QtPnBJbnRlcm5hbERhdGEpCisgICB7CisgICAgICB3cGFsTWVtb3J5RnJlZShwUGt0LT5wSW50ZXJuYWxEYXRhKTsKKyAgIH0KKyAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcmV0dXJuX3BhY2tldChXUEFMX1RPX1ZPU19QS1QocFBrdCkpOworCisgICAvL1dpdGggVk9TUyBzdXBwb3J0LCB3ZSBjYW4gY2FzdCBiZXR3ZWVuIHdwdF9zdGF0dXMgYW5kIFZPU19TVEFUVVMKKyAgIHJldHVybiAod3B0X3N0YXR1cyl2b3NTdGF0dXM7Cit9Lyp3cGFsUGFja2V0RnJlZSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsUGFja2V0R2V0TGVuZ3RoIJYgR2V0IG51bWJlciBvZiBieXRlcyBpbiBhIHdwdF9wYWNrZXQuIEl0IGluY2x1ZGUgdGhlIAorICAgIGJ5dGVzIGluIGEgQkQgaWYgaXQgZXhpc3QuCisgICAgUGFyYW06IAorICAgICAgICBwUGt0IC0gcG9pbnRlciB0byBhIHBhY2tldCB0byBiZSBmcmVlZC4KKyAgICBSZXR1cm46CisgICAgICAgIExlbmd0aCBvZiB0aGUgZGF0YSBpbmNsdWRlIGxheWVyLTIgaGVhZGVycy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBmcmFtZQorICAgICAgICBpcyA4MDIuMywgdGhlIGxlbmd0aCBpbmNsdWRlcyB0aGUgZXRoZXJuZXQgaGVhZGVyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF91aW50MzIgd3BhbFBhY2tldEdldExlbmd0aCh3cHRfcGFja2V0ICpwUGt0KQoreworICAgdl9VMTZfdCBsZW4gPSAwLCBwa3RMZW4gPSAwOworCisgICAvLyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHBvaW50ZXJzCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBwUGt0KSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX1BBTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlcyA6IE5VTEwgcGFja2V0IHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworCisgICBpZiggV1BBTF9QQUNLRVRfR0VUX0JEX1BPSU5URVIocFBrdCkgKQorICAgeworICAgICAgbGVuID0gV1BBTF9QQUNLRVRfR0VUX0JEX0xFTkdUSChwUGt0KTsKKyAgIH0KKyAgIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aChXUEFMX1RPX1ZPU19QS1QocFBrdCksICZwa3RMZW4pKSApCisgICB7CisgICAgICBsZW4gKz0gcGt0TGVuOworICAgfQorICAgZWxzZQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyAgZmFpbGVkXG4iLAorICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgIH0KKworICAgcmV0dXJuICgod3B0X3VpbnQzMilsZW4pOworfS8qd3BhbFBhY2tldEdldExlbmd0aCovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsUGFja2V0UmF3VHJpbUhlYWQgliBNb3ZlIHRoZSBzdGFydGluZyBvZmZzZXQgYW5kIHJldHVybiB0aGUgaGVhZCBwb2ludGVyCisgICAgICAgICAgYmVmb3JlIHRoZSBtb3ZpbmcuIFRoZSBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggcmF3IHBhY2tldHMsCisgICAgICAgICAgd2hvc2UgYnVmZmVyIGlzIG9uZSBwaWVjZSBhbmQgYWxsb2NhdGVkIGJ5IFdMQU4gZHJpdmVyLiBUaGlzIGFsc28KKyAgICAgICAgICByZWR1Y2UgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0LgorICAgIFBhcmFtOiAKKyAgICAgICAgcFBrdCAtIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0LgorICAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIHRha2Ugb2ZmIHRoZSBoZWFkLgorICAgIFJldHVybjoKKyAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBidWZmZXIgaGVhZCBiZWZvcmUgdGhlIHRyaW1taW5nLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFBhY2tldFJhd1RyaW1IZWFkKHdwdF9wYWNrZXQgKnBQa3QsIHdwdF91aW50MzIgc2l6ZSkKK3sKKyAgIHdwdF9zdGF0dXMgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworCisgICAvLyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHBvaW50ZXJzCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBwUGt0KSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX1BBTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlcyA6IE5VTEwgcGFja2V0IHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgVk9TX0FTU0VSVCggKGVXTEFOX1BBTF9QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCA9PSBXUEFMX1BBQ0tFVF9HRVRfVFlQRShwUGt0KSkgfHwKKyAgICAgICAgICAgICAgIChlV0xBTl9QQUxfUEtUX1RZUEVfUlhfUkFXID09IFdQQUxfUEFDS0VUX0dFVF9UWVBFKHBQa3QpKSApOworCisgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfcGt0X3RyaW1faGVhZChXUEFMX1RPX1ZPU19QS1QocFBrdCksICh2X1NJWkVfdClzaXplKSkgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyAgSW52YWxpZCB0cmltKCVkKVxuIiwKKyAgICAgICAgIF9fRlVOQ1RJT05fXywgc2l6ZSk7CisgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7Cit9Lyp3cGFsUGFja2V0UmF3VHJpbUhlYWQqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxQYWNrZXRSYXdUcmltVGFpbCCWIHJlZHVjZSB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQuCisgICAgUGFyYW06IAorICAgICAgICBwUGt0IC0gcG9pbnRlciB0byBhIHdwdF9wYWNrZXQuCisgICAgICAgIHNpemUgliBudW1iZXIgb2YgYnl0ZXMgdG8gdGFrZSBvZiB0aGUgcGFja2V0IGxlbmd0aAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIJYgc3VjY2Vzcy4gT3RoZXJ3aXNlIGZhaWwuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsUGFja2V0UmF3VHJpbVRhaWwod3B0X3BhY2tldCAqcFBrdCwgd3B0X3VpbnQzMiBzaXplKQoreworICAgd3B0X3N0YXR1cyBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMKKyAgIGlmICh1bmxpa2VseShOVUxMID09IHBQa3QpKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzIDogTlVMTCBwYWNrZXQgcG9pbnRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBWT1NfQVNTRVJUKCAoZVdMQU5fUEFMX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01UID09IFdQQUxfUEFDS0VUX0dFVF9UWVBFKHBQa3QpKSB8fAorICAgICAgICAgICAgICAgKGVXTEFOX1BBTF9QS1RfVFlQRV9SWF9SQVcgPT0gV1BBTF9QQUNLRVRfR0VUX1RZUEUocFBrdCkpICk7CisgICBpZiggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfcGt0X3RyaW1fdGFpbChXUEFMX1RPX1ZPU19QS1QocFBrdCksICh2X1NJWkVfdClzaXplKSkgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyAgSW52YWxpZCB0cmltKCVkKVxuIiwKKyAgICAgICAgIF9fRlVOQ1RJT05fXywgc2l6ZSk7CisgICAgICBzdGF0dXMgPSBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHJldHVybiBzdGF0dXM7Cit9Lyp3cGFsUGFja2V0UmF3VHJpbVRhaWwqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbFBhY2tldEdldFJhd0J1ZiCWIFJldHVybiB0aGUgc3RhcnRpbmcgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhlIFJBVyBmbGF0IGJ1ZmZlcgorICAgIEl0IGlzIGlubGluZSBpbiBob3BlIG9mIGZhc3RlciBpbXBsZW1lbnRhdGlvbiBmb3IgY2VydGFpbiBwbGF0Zm9ybS4gRm9yIFdpbnhwLCBpdCAKKyAgICB3aWxsIGJlIHNsb3cuCisgICAgUGFyYW06IAorICAgICAgICBwUGt0IC0gcG9pbnRlciB0byBhIHdwdF9wYWNrZXQuCisgICAgUmV0dXJuOgorICAgICAgICBOVUxMIC0gZmFpbC4KKyAgICAgICAgT3RoZXJ3aXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydGluZyBvZiB0aGUgYnVmZmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3VpbnQ4ICp3cGFsUGFja2V0R2V0UmF3QnVmKHdwdF9wYWNrZXQgKnBQa3QpCit7CisgICB3cHRfdWludDggKnBSZXQgPSBOVUxMOworCisgICAvLyBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHBvaW50ZXJzCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBwUGt0KSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX1BBTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlcyA6IE5VTEwgcGFja2V0IHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIC8vU2luY2UgaXQgaXMgYSBmbGF0IGJ1ZmZlciwgYWxsIHdlIG5lZWQgaXMgdG8gZ2V0IG9uZSBieXRlIG9mIG9mZnNldCAwCisgICBpZiggKGVXTEFOX1BBTF9QS1RfVFlQRV9SWF9SQVcgPT0gV1BBTF9QQUNLRVRfR0VUX1RZUEUocFBrdCkpIHx8CisgICAgICAgKGVXTEFOX1BBTF9QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCA9PSBXUEFMX1BBQ0tFVF9HRVRfVFlQRShwUGt0KSkgKQorICAgeworICAgICAgdm9zX3BrdF9wZWVrX2RhdGEoV1BBTF9UT19WT1NfUEtUKHBQa3QpLCAwLCAodl9WT0lEX3QqKikmcFJldCwgMSk7CisgICAgICBXUEFMX0FTU0VSVChOVUxMICE9IHBSZXQpOworICAgfSAgICAgICAgICAgIAorCisgICByZXR1cm4gcFJldDsKK30vKndwYWxQYWNrZXRHZXRSYXdCdWYqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbFBhY2tldFNldFJ4TGVuZ3RoIJYgU2V0IHRoZSB2YWxpZCBkYXRhIGxlbmd0aCBvbiBhIFJYIHBhY2tldC4gVGhpcyBmdW5jdGlvbiBtdXN0IAorICAgIGJlIGNhbGxlZCBvbmNlIHBlciBSWCBwYWNrZXQgcGVyIHJlY2VpdmluZy4gSXQgaW5kaWNhdGVzIHRoZSBhdmFpbGFibGUgZGF0YSBsZW5ndGggZnJvbQorICAgIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgorICAgIFBhcmFtOiAKKyAgICAgICAgcFBrdCAtIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0LgorICAgIFJldHVybjoKKyAgICAgICAgTlVMTCAtIGZhaWwuCisgICAgICAgIE90aGVyd2lzZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnRpbmcgb2YgdGhlIGJ1ZmZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFBhY2tldFNldFJ4TGVuZ3RoKHdwdF9wYWNrZXQgKnBQa3QsIHdwdF91aW50MzIgbGVuKQoreworICAgLy8gVmFsaWRhdGUgdGhlIHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcFBrdCkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXMgOiBOVUxMIHBhY2tldCBwb2ludGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIC8qT25seSBhbGxvd2VkIGZvciBSWCBSYXcgcGFja2V0cyAqLworICAgaWYoIChlV0xBTl9QQUxfUEtUX1RZUEVfUlhfUkFXICE9IFdQQUxfUEFDS0VUX0dFVF9UWVBFKHBQa3QpKSkKKyAgIHsKKyAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICIlcyAgSW52YWxpZCBwYWNrZXQgdHlwZSglZClcbiIsICBfX0ZVTkNUSU9OX18sIAorICAgICAgICAgICAgICAgIFdQQUxfUEFDS0VUX0dFVF9UWVBFKHBQa3QpKTsKKyAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgaWYoVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19wa3Rfc2V0X3J4X2xlbmd0aChXUEFMX1RPX1ZPU19QS1QocFBrdCksIGxlbikpKQorICAgeworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9Cit9Lyp3cGFsUGFja2V0U2V0UnhMZW5ndGgqLworCisvKgorICBTZXQgb2YgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IHdpbGwgcHJlcGFyZSBwYWNrZXQgZm9yIERNQSB0cmFuc2ZlciwKKyAgYmFzZWQgb24gdGhlIHR5cGUgb2YgdHJhbnNmZXIgOiAtIHRvIGFuZCBmcm9tIHRoZSBkZXZpY2UKKyAgLSBmb2xsb3dpbmcgdGhlc2UgY2FsbHMgdGhlIHBhY2tldCB3aWxsIGJlIGxvY2tlZCBmb3IgRE1BIG9ubHksCisgIENQVSB3aWxsIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSBpdCA9PiB0aGUgcGFja2V0IG11c3QgYmUgZXhwbGljaXRseSByZXR1cm5lZCB0bworICB0aGUgQ1BVIG9uY2UgdGhlIERNQSB0cmFuc2ZlciBpcyBjb21wbGV0ZQorKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSB2b2lkKiBpdEdldE9TUGt0QWRkckZvckRldmljZSggd3B0X3BhY2tldCAqcFBhY2tldCApCit7CisgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gCisgICAgICAgIHZvc19wa3RfZ2V0X29zX3BhY2tldChXUEFMX1RPX1ZPU19QS1QocFBhY2tldCksICh2b2lkKiopJnNrYiwgVk9TX0ZBTFNFICkpCisgICB7CisgICAgIHJldHVybiBOVUxMOworICAgfQorICAgZWxzZQorICAgeworICAgICAvKk1hcCBza2IgZGF0YSBpbnRvIGRtYS1hYmxlIG1lbW9yeSAKKyAgICAgICAoY2hhbmdlcyB3aWxsIGJlIGNvbW1pdGVkIGZyb20gY2FjaGUpICovCisgICAgIHJldHVybiAodm9pZCopZG1hX21hcF9zaW5nbGUoIE5VTEwsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UgKTsKKyAgIH0KK30vKml0R2V0T1NQa3RBZGRyRm9yRGV2aWNlKi8KKworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHZvaWQqIGl0R2V0T1NQa3RBZGRyRnJvbURldmljZSggd3B0X3BhY2tldCAqcFBhY2tldCApCit7CisKKyAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSAKKyAgICAgICAgdm9zX3BrdF9nZXRfb3NfcGFja2V0KFdQQUxfVE9fVk9TX1BLVChwUGFja2V0KSwgKHZvaWQqKikmc2tiLCBWT1NfRkFMU0UgKSkKKyAgIHsKKyAgICAgcmV0dXJuIE5VTEw7CisgICB9CisgICBlbHNlCisgICB7CisgICAgIC8qTWFwIHNrYiBkYXRhIGludG8gZG1hLWFibGUgbWVtb3J5IAorICAgICAgIChjaGFuZ2VzIHdpbGwgYmUgY29tbWl0ZWQgZnJvbSBjYWNoZSkgKi8KKyAgICAgcmV0dXJuICh2b2lkKilkbWFfbWFwX3NpbmdsZSggTlVMTCwgc2tiLT5kYXRhLCBza2ItPmxlbiwgRE1BX0ZST01fREVWSUNFICk7CisgICB9Cit9LyppdEdldE9TUGt0QWRkckZyb21EZXZpY2UqLworCisvKgorICBTZXQgb2YgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IHdpbGwgcmV0dXJuIGEgRE1BLWVkIHBhY2tldCB0byB0aGUgQ1BVLAorICBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0cmFuc2ZlciA6IC0gdG8gYW5kIGZyb20gdGhlIGRldmljZQorKi8KK1dQVF9TVEFUSUMgV1BUX0lOTElORSB2b2lkIGl0UmV0dXJuT1NQa3RBZGRyRm9yRGV2aWNlKCB3cHRfcGFja2V0ICpwUGFja2V0LCAgdm9pZCogYWRkciwgd3B0X3VpbnQzMiBzaXplICkKK3sKKyAKKyAgIGRtYV91bm1hcF9zaW5nbGUoIE5VTEwsIChkbWFfYWRkcl90KWFkZHIsIHNpemUsIERNQV9UT19ERVZJQ0UgKTsKK30KKworV1BUX1NUQVRJQyBXUFRfSU5MSU5FIHZvaWQgaXRSZXR1cm5PU1BrdEFkZHJGcm9tRGV2aWNlKCB3cHRfcGFja2V0ICpwUGFja2V0LCB2b2lkKiBhZGRyLCB3cHRfdWludDMyIHNpemUgICkKK3sKKworICAgZG1hX3VubWFwX3NpbmdsZSggTlVMTCwgKGRtYV9hZGRyX3QpYWRkciwgc2l6ZSwgRE1BX0ZST01fREVWSUNFICk7IAorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbEl0ZXJhdG9ySW5pdCCWIEluaXRpYWxpemUgYW4gaW50ZXJhdG9yIGJ5IHVwZGF0aW5nIHBDdXIgdG8gZmlyc3QgaXRlbS4KKyAgICBQYXJhbTogCisgICAgICAgIHBJdGVyIJYgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgd3B0X2l0ZXJhdG9yCisgICAgICAgIHBQYWNrZXQgliBwb2ludGVyIHRvIGEgd3B0X3BhY2tldAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2VzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbEl0ZXJhdG9ySW5pdCh3cHRfaXRlcmF0b3IgKnBJdGVyLCB3cHRfcGFja2V0ICpwUGFja2V0KQoreworICAgd3B0X3N0YXR1cyAgICAgICAgIHN0YXR1cyAgICAgPSBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7CisgICB3cHRfaXRlcmF0b3JfaW5mbyogcEN1ckluZm8gICA9IE5VTEw7CisgICB3cHRfaXRlcmF0b3JfaW5mbyogcE5leHRJbmZvICA9IE5VTEw7CisgICB3cHRfaXRlcmF0b3JfaW5mbyogcFBrdEluZm8gICA9IE5VTEw7CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMKKyAgIGlmICh1bmxpa2VseSgoTlVMTCA9PSBwUGFja2V0KXx8KE5VTEw9PXBJdGVyKSkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXMgOiBOVUxMIGlucHV0IHBvaW50ZXJzICV4ICV4IiwgX19GVU5DVElPTl9fLCBwUGFja2V0LCBwSXRlcik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBwUGt0SW5mbyA9ICh3cHRfaXRlcmF0b3JfaW5mbyopcFBhY2tldC0+cEludGVybmFsRGF0YTsKKyAgIGlmICh1bmxpa2VseShOVUxMID09IHBQa3RJbmZvKSkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX1BBTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICIlcyA6IEludmFsaWQgUGFja2V0IEluZm8iLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLy8gaWYgdGhlcmUgaXMgTk8gQkQgb24gdGhpcyBmcmFtZSwgdGhlbiBpbml0aWFsaXplIHRoZSBuZXh0IHBvaW50ZXIgdG8KKyAgIC8vIHBvaW50IHRoZSBmaXJzdCBmcmFnbWVudC4KKyAgIGlmICggTlVMTCA9PSBXUEFMX1BBQ0tFVF9HRVRfQkRfUEhZUyhwUGFja2V0KSApCisgICB7CisgICAgIHBDdXJJbmZvICAgPSBwUGt0SW5mbzsKKyAgICAgcE5leHRJbmZvICAgICAgICAgICA9IE5VTEw7CisgICB9CisgICBlbHNlCisgICB7CisgICAgIC8qQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgY3VycmVudCBpbmZvKi8KKyAgICAgcEN1ckluZm8gPSB3cGFsTWVtb3J5QWxsb2NhdGUoIHNpemVvZih3cHRfaXRlcmF0b3JfaW5mbykgKTsKKworICAgICAvLyBWYWxpZGF0ZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24KKyAgICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcEN1ckluZm8pKQorICAgICB7CisgICAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX1BBTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIiVzIDogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgICB9CisKKyAgICAgcEN1ckluZm8tPnBQaHlBZGRyID0gV1BBTF9QQUNLRVRfR0VUX0JEX1BIWVMocFBhY2tldCk7CisgICAgIHBDdXJJbmZvLT51TGVuICAgICA9IFdQQUxfUEFDS0VUX0dFVF9CRF9MRU5HVEgocFBhY2tldCk7CisKKyAgICAgcE5leHRJbmZvICAgICAgICAgICA9IHBQa3RJbmZvOworICAgfSAgICAgIAorCisgICBwSXRlci0+cEN1ciAgICAgPSAodm9pZCopcEN1ckluZm87IAorICAgcEl0ZXItPnBOZXh0ICAgID0gKHZvaWQqKXBOZXh0SW5mbzsKKyAgIHBJdGVyLT5wQ29udGV4dCA9IE5VTEw7CisKKyAgIHJldHVybiBzdGF0dXM7Cit9Lyp3cGFsSXRlcmF0b3JJbml0Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsSXRlcmF0b3JOZXh0IJYgR2V0IHRoZSBhZGRyZXNzIGZvciB0aGUgbmV4dCBpdGVtCisgICAgUGFyYW06IAorICAgICAgICBwSXRlciCWIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHdwdF9pdGVyYXRvcgorICAgICAgICBwUGFja2V0IJYgcG9pbnRlciB0byBhIHdwdF9wYWNrZXQKKyAgICAgICAgcHBBZGRyIJYgQ2FsbGVyIGFsbG9jYXRlZCBwb2ludGVyIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgaXRlbS4KKyAgICAgICAgRm9yIERNQS1hYmxlIGRldmljZXMsIHRoaXMgaXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGl0ZW0uCisgICAgICAgIHBMZW4gliBUbyByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgaXRlbS4KKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxJdGVyYXRvck5leHQod3B0X2l0ZXJhdG9yICpwSXRlciwgd3B0X3BhY2tldCAqcFBhY2tldCwgdm9pZCAqKnBwQWRkciwgd3B0X3VpbnQzMiAqcExlbikKK3sKKyAgIHdwdF9pdGVyYXRvcl9pbmZvKiBwQ3VySW5mbyAgPSBOVUxMOworICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisgICAKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBTYW5pdHkgY2hlY2sKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYgKHVubGlrZWx5KCggTlVMTCA9PSBwSXRlciApfHwoIE5VTEwgPT0gcFBhY2tldCApIHx8IAorICAgICAgKCBOVUxMID09IHBwQWRkciApIHx8ICggTlVMTCA9PSBwTGVuICkpKQorICAgeworICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgIiVzICBJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgXG4iLCAgX19GVU5DVElPTl9fICk7CisgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHBDdXJJbmZvID0gKHdwdF9pdGVyYXRvcl9pbmZvKilwSXRlci0+cEN1cjsgCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgSWYgY3VycmVudCBwb2ludGVyIGlzIE5VTEwgLSB0aGVyZSBpcyBubyBkYXRhIGluIHRoZSBwYWNrZXQgLSByZXR1cm4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgaWYoIHBJdGVyLT5wQ3VyID09IE5VTEwgKQorICAgeworICAgICAgKnBwQWRkciA9IE5VTEw7IAorICAgICAgKnBMZW4gICA9IDA7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworICAgfQorCisgICAvKkFkZHJlc3MgYW5kIGxlbmd0aCBhcmUga2VwdCBpbiB0aGUgY3VycmVudCBmaWVsZCovCisgICAqcHBBZGRyID0gcEN1ckluZm8tPnBQaHlBZGRyOyAKKyAgICpwTGVuICAgPSBwQ3VySW5mby0+dUxlbjsKKyAgICAKKyAgIGlmKCBOVUxMID09IHBJdGVyLT5wTmV4dCApCisgICB7CisgICAgIC8qU2F2ZSB0aGUgaXRlcmF0b3IgZm9yIGNsZWFudXAqLworICAgICBwUGFja2V0LT5wSW50ZXJuYWxEYXRhID0gcEl0ZXItPnBDdXI7IAorICAgICBwSXRlci0+cEN1ciAgICAgICAgICAgID0gTlVMTDsgCisgICB9CisgICBlbHNlCisgICB7CisgICAgIC8qUmVsZWFzZSB0aGUgbWVtb3J5IHNhdmVkIGZvciBzdG9yaW5nIHRoZSBCRCBpbmZvcm1hdGlvbiovCisgICAgIHdwYWxNZW1vcnlGcmVlKHBDdXJJbmZvKTsgCisgIAorICAgICAvKkZvciBMQSAtIHRoZSBwYWNrZXQgaXMgcmVwcmVzZW50ZWQgYnkgbWF4aW11bSAyIGZpZWxkcyBvZiBkYXRhIAorICAgICAgIC0gQkQgYW5kIGFjdHVhbCBkYXRhIGZyb20gc2sgYnVmZiAqLworICAgICBwSXRlci0+cEN1ciAgICAgPSBwSXRlci0+cE5leHQ7CisgICAgIHBJdGVyLT5wTmV4dCAgICA9IE5VTEw7CisgICB9CisgICAKKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbExvY2tQYWNrZXRGb3JUcmFuc2ZlciCWIE1hcCB0aGUgZGF0YSBidWZmZXIgZnJvbSBkbWEgc28gdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGNvbW1pdGVkIGZyb20gY2FjaGUgYW5kIHRoZSBjcHUgcmVsaW5xdWlzaGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBidWZmZXIKKyAKKyAgICBQYXJhbTogCisgICAgICAgIHBQYWNrZXQgliBwb2ludGVyIHRvIGEgd3B0X3BhY2tldAorIAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2VzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbExvY2tQYWNrZXRGb3JUcmFuc2Zlciggd3B0X3BhY2tldCAqcFBhY2tldCkKK3sKKyAgIHZvaWQqICAgICAgICAgICAgICBwUGh5RGF0YSAgID0gTlVMTDsKKyAgIHdwdF9pdGVyYXRvcl9pbmZvKiBwSW5mbyAgICAgID0gTlVMTDsKKyAgIHZfVTE2X3QgICAgICAgICAgICB1TGVuRGF0YSAgID0gMDsKKworICAgLy8gVmFsaWRhdGUgdGhlIHBhcmFtZXRlciBwb2ludGVycworICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcFBhY2tldCkpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXMgOiBOVUxMIGlucHV0IHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgc3dpdGNoKFdQQUxfUEFDS0VUX0dFVF9UWVBFKHBQYWNrZXQpKQorICAgeworICAgICAgLyogRm9yIG1hbmFnZW1lbnQgZnJhbWVzLCBCRCBpcyBhbGxvY2F0ZWQgYnkgV0RJLCBoZWFkZXIgaXMgaW4gcmF3IGJ1ZmZlciwKKyAgICAgICAgIHJlc3Qgb2YgdGhlIGZyYW1lIGlzIGFsc28gaW4gcmF3IGJ1ZmZlciAqLworICAgY2FzZSBlV0xBTl9QQUxfUEtUX1RZUEVfVFhfODAyXzExX01HTVQ6CisgICAgICB7CisgICAgICAgICAvKlRYIFBhY2tldHMgbmVlZCB0byBiZSBETUEtZWQgdG8gdGhlIGRldmljZSwgcGVyZm9ybSBETUEgbWFwcGluZyAKKyAgICAgICAgICAgYWNjb3JkaW5nbHkgKi8KKyAgICAgICAgIHBQaHlEYXRhID0gKHZvaWQqKWl0R2V0T1NQa3RBZGRyRm9yRGV2aWNlKCBwUGFja2V0ICk7ICAgCisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgICAgIC8qIERhdGEgcGFja2V0cyAtIEJEIChhbGxvY2F0ZWQgYnkgV0RJKSwgaGVhZGVyIChpbiBWT1NTIGhlYWRlciksCisgICAgICAgICAgICByZXN0IG9mIHRoZSBwYWNrZXQgKERTTSBpdGVtcykgKi8KKyAgIGNhc2UgZVdMQU5fUEFMX1BLVF9UWVBFX1RYXzgwMl8xMV9EQVRBOgorICAgY2FzZSBlV0xBTl9QQUxfUEtUX1RZUEVfVFhfODAyXzNfREFUQToKKyAgICAgIHsKKyAgICAgICAgIC8qVFggUGFja2V0cyBuZWVkIHRvIGJlIERNQS1lZCB0byB0aGUgZGV2aWNlLCBwZXJmb3JtIERNQSBtYXBwaW5nIAorICAgICAgICAgICBhY2NvcmRpbmdseSAqLworICAgICAgICAgcFBoeURhdGEgPSAodm9pZCopaXRHZXRPU1BrdEFkZHJGb3JEZXZpY2UoIHBQYWNrZXQgKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBGb3IgUmF3IFJYLCBCRCArIGhlYWRlciArIHJlc3Qgb2YgdGhlIHBhY2tldCBpcyBhbGwgY29udGFpbmVkIGluIHRoZSByYXcKKyAgICAgICAgIGJ1ZmZlciAqLworICAgY2FzZSBlV0xBTl9QQUxfUEtUX1RZUEVfUlhfUkFXOgorICAgICAgeworICAgICAgICAgLypSWCBQYWNrZXRzIG5lZWQgdG8gYmUgRE1BLWVkIGZyb20gdGhlIGRldmljZSwgcGVyZm9ybSBETUEgbWFwcGluZyAKKyAgICAgICAgICAgYWNjb3JkaW5nbHkgKi8KKyAgICAgICAgIHBQaHlEYXRhID0gKHZvaWQqKWl0R2V0T1NQa3RBZGRyRnJvbURldmljZSggcFBhY2tldCApOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICIgV0xBTl9QQUw6ICVzOiBJbnZhbGlkIHBhY2tldCB0eXBlICVkISIsICBfX0ZVTkNUSU9OX18sIAorICAgICAgICAgICAgICAgICAgICBXUEFMX1BBQ0tFVF9HRVRfVFlQRShwUGFja2V0KSApOyAKKyAgICAgICAgIFdQQUxfQVNTRVJUKDApOyAKKyAgICAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIH0KKyAgIH0KKworICAgLypHZXQgcGFja2V0IGxlbmd0aCovCisgICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKFdQQUxfVE9fVk9TX1BLVChwUGFja2V0KSwmdUxlbkRhdGEpOworCisgICAgLypBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBjdXJyZW50IGluZm8qLworICAgcEluZm8gPSB3cGFsTWVtb3J5QWxsb2NhdGUoIHNpemVvZih3cHRfaXRlcmF0b3JfaW5mbykgKTsKKworICAgLy8gVmFsaWRhdGUgdGhlIG1lbW9yeSBhbGxvY2F0aW9uCisgICBpZiAodW5saWtlbHkoTlVMTCA9PSBwSW5mbykpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXMgOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorCisgICBwSW5mby0+cFBoeUFkZHIgPSBwUGh5RGF0YTsKKyAgIHBJbmZvLT51TGVuICAgICA9IHVMZW5EYXRhOworCisgICBwUGFja2V0LT5wSW50ZXJuYWxEYXRhID0gcEluZm87CisgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworfS8qd3BhbExvY2tQYWNrZXRGb3JUcmFuc2ZlciovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbFVubG9ja1BhY2tldCCWIFVubWFwIHRoZSBkYXRhIGJ1ZmZlciBmcm9tIGRtYSBzbyB0aGF0IGNwdSBjYW4gcmVnYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBvbiBpdAorICAgIFBhcmFtOiAKKyAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CisgCisgICAgUmV0dXJuOgorICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsVW5sb2NrUGFja2V0KCB3cHRfcGFja2V0ICpwUGFja2V0KQoreworCisgICB3cHRfaXRlcmF0b3JfaW5mbyogcEluZm87CisKKyAgIC8vIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMKKyAgIGlmICh1bmxpa2VseShOVUxMID09IHBQYWNrZXQpKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgIiVzIDogTlVMTCBpbnB1dCBwb2ludGVyIHBQYWNrZXQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgcEluZm8gID0gKHdwdF9pdGVyYXRvcl9pbmZvKilwUGFja2V0LT5wSW50ZXJuYWxEYXRhOworCisgICAvLyBWYWxpZGF0ZSBwSW5mbworICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gcEluZm8pKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwsCisgICAgICAgICAgICAgICAgIiVzIDogTlVMTCBpbnB1dCBwb2ludGVyIHBJbmZvIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHN3aXRjaChXUEFMX1BBQ0tFVF9HRVRfVFlQRShwUGFja2V0KSkKKyAgIHsKKyAgICAgIC8qIEZvciBtYW5hZ2VtZW50IGZyYW1lcywgQkQgaXMgYWxsb2NhdGVkIGJ5IFdESSwgaGVhZGVyIGlzIGluIHJhdyBidWZmZXIsCisgICAgICAgICByZXN0IG9mIHRoZSBmcmFtZSBpcyBhbHNvIGluIHJhdyBidWZmZXIgKi8KKyAgIGNhc2UgZVdMQU5fUEFMX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01UOgorICAgICAgeworICAgICAgICAgLypUWCBQYWNrZXRzIG5lZWQgdG8gYmUgRE1BLWVkIHRvIHRoZSBkZXZpY2UsIHBlcmZvcm0gRE1BIG1hcHBpbmcgCisgICAgICAgICAgIGFjY29yZGluZ2x5ICovCisgICAgICAgIGl0UmV0dXJuT1NQa3RBZGRyRm9yRGV2aWNlKHBQYWNrZXQsIHBJbmZvLT5wUGh5QWRkciwgcEluZm8tPnVMZW4pOyAgIAorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICAgICAvKiBEYXRhIHBhY2tldHMgLSBCRCAoYWxsb2NhdGVkIGJ5IFdESSksIGhlYWRlciAoaW4gVk9TUyBoZWFkZXIpLAorICAgICAgICAgICAgcmVzdCBvZiB0aGUgcGFja2V0IChEU00gaXRlbXMpICovCisgICBjYXNlIGVXTEFOX1BBTF9QS1RfVFlQRV9UWF84MDJfMTFfREFUQToKKyAgIGNhc2UgZVdMQU5fUEFMX1BLVF9UWVBFX1RYXzgwMl8zX0RBVEE6CisgICAgICB7CisgICAgICAgICAvKlRYIFBhY2tldHMgbmVlZCB0byBiZSBETUEtZWQgdG8gdGhlIGRldmljZSwgcGVyZm9ybSBETUEgbWFwcGluZyAKKyAgICAgICAgICAgYWNjb3JkaW5nbHkgKi8KKyAgICAgICAgIGl0UmV0dXJuT1NQa3RBZGRyRm9yRGV2aWNlKHBQYWNrZXQsIHBJbmZvLT5wUGh5QWRkciwgcEluZm8tPnVMZW4pOyAgIAorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEZvciBSYXcgUlgsIEJEICsgaGVhZGVyICsgcmVzdCBvZiB0aGUgcGFja2V0IGlzIGFsbCBjb250YWluZWQgaW4gdGhlIHJhdworICAgICAgICAgYnVmZmVyICovCisgICBjYXNlIGVXTEFOX1BBTF9QS1RfVFlQRV9SWF9SQVc6CisgICAgICB7CisgICAgICAgICAvKlJYIFBhY2tldHMgbmVlZCB0byBiZSBETUEtZWQgZnJvbSB0aGUgZGV2aWNlLCBwZXJmb3JtIERNQSBtYXBwaW5nIAorICAgICAgICAgICBhY2NvcmRpbmdseSAqLworICAgICAgICAgaXRSZXR1cm5PU1BrdEFkZHJGcm9tRGV2aWNlKHBQYWNrZXQsIHBJbmZvLT5wUGh5QWRkciwgcEluZm8tPnVMZW4pOyAgIAorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICAgICIgV0xBTl9QQUw6ICVzOiBJbnZhbGlkIHBhY2tldCB0eXBlICVkISIsICBfX0ZVTkNUSU9OX18sIAorICAgICAgICAgICAgICAgICAgICBXUEFMX1BBQ0tFVF9HRVRfVFlQRShwUGFja2V0KSApOyAKKyAgICAgICAgIFdQQUxfQVNTRVJUKDApOyAKKyAgICAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsKKyAgICAgIH0KKyAgIH0KKworICB3cGFsTWVtb3J5RnJlZShwSW5mbyk7CisgIHBQYWNrZXQtPnBJbnRlcm5hbERhdGEgPSBOVUxMOworICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworfS8qd3BhbFVubG9ja1BhY2tldCovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgd3BhbElzUGFja2V0TG9ja2VkIJYgIENoZWNrIHdoZXRoZXIgdGhlIFBhY2tldCBpcyBsb2NrZWQgZm9yIERNQS4KKyAgICBQYXJhbTogCisgICAgICAgIHBQYWNrZXQgliBwb2ludGVyIHRvIGEgd3B0X3BhY2tldAorIAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTCisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFCisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbElzUGFja2V0TG9ja2VkKCB3cHRfcGFja2V0ICpwUGFja2V0KQoreworCisgICB3cHRfaXRlcmF0b3JfaW5mbyogcEluZm87CisKKyAgIC8qIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXIgcG9pbnRlcnMgKi8KKyAgIGlmIChOVUxMID09IHBQYWNrZXQpCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXMgOiBOVUxMIGlucHV0IHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgLyogVmFsaWRhdGUgcEludGVybmFsRGF0YSAqLworICAgcEluZm8gID0gKHdwdF9pdGVyYXRvcl9pbmZvKilwUGFja2V0LT5wSW50ZXJuYWxEYXRhOworICAgcmV0dXJuIChOVUxMID09IHBJbmZvKT8gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkUgOiAKKyAgICAgICAgICAgICAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTOworfS8qd3BhbElzUGFja2V0TG9ja2VkKi8KKwpkaWZmIC0tZ2l0IGEvQ09SRS9XREkvV1BBTC9zcmMvd2xhbl9xY3RfcGFsX3N5bmMuYyBiL0NPUkUvV0RJL1dQQUwvc3JjL3dsYW5fcWN0X3BhbF9zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmODZmMQotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL1dQQUwvc3JjL3dsYW5fcWN0X3BhbF9zeW5jLmMKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKKyAqIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCisgKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisKKworLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgXGZpbGUgIHdsYW5fcWN0X3BhbF9zeW5jLmMKKyAgCisgIFxicmllZiBJbXBsZW1lbnRhdGlvbiB0cmFjZS9sb2dnaW5nIEFQSXMgUEFMIGV4cG9ydHMuIHdwdCA9IChXbGFuIFBhbCBUeXBlKSB3cGFsID0gKFdsYW4gUEFMKQorICAgICAgICAgICAgICAgCisgICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gV2luZG93cyBhbmQgd2l0aCBsZWdhY3kgVU1BQy4KKyAgCisgICBDb3B5cmlnaHQgMjAxMCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAKKyAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAid2xhbl9xY3RfcGFsX3N5bmMuaCIKKyNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHJhY2UuaCIKKworI2luY2x1ZGUgIndsYW5fcWN0X29zX3N0YXR1cy5oIgorCisvKioKK3dwYWxNdXRleEluaXQoKQorCitAYnJpZWYKKyAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhIG11dGV4IG9iamVjdAorCitAcGFyYW0gcE11dGV4OiBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2Ygd3B0X211dGV4CisKK0ByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgorCisqLword3B0X3N0YXR1cyB3cGFsTXV0ZXhJbml0KHdwdF9tdXRleCAqcE11dGV4KQoreworICAgIC8qIE5vdCBkb2luZyBzYW5pdHkgY2hlY2tzIHNpbmNlIFZPUyBkb2VzIHRoZW0gYW55d2F5cyAqLworCisgICBpZiggdm9zX2xvY2tfaW5pdCggKHZvc19sb2NrX3QqKXBNdXRleCAgKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAiIG11dGV4IGluaXQgZmFpbFxuIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQGJyaWVmIEludmFsaWRhdGUgYSBtdXRleCBvYmplY3QKKworICAgIFxwYXJhbSBwTXV0ZXggLSBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2Ygd3B0X211dGV4CisKKyAgICBccmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjZXNzLiBGYWlsIG90aGVyd2lzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxNdXRleERlbGV0ZSh3cHRfbXV0ZXggKnBNdXRleCkKK3sKKyAgICAvKiBOb3QgZG9pbmcgc2FuaXR5IGNoZWNrcyBzaW5jZSBWT1MgZG9lcyB0aGVtIGFueXdheXMgKi8KKworICAgaWYoIHZvc19sb2NrX2Rlc3Ryb3koICh2b3NfbG9ja190KilwTXV0ZXggICkgIT0gVk9TX1NUQVRVU19TVUNDRVNTICkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoZVdMQU5fTU9EVUxFX1BBTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAgIiBtdXRleCBkZWxldGUgZmFpbFxuIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQGJyaWVmIEFjcXVpcmUgYSBtdXRleCBvYmplY3QuIEl0IGlzIGJsb2NrZWQgdW50aWwgdGhlIG9iamVjdCBpcyBhY3F1aXJlZC4KKworICAgIFxwYXJhbSBwTXV0ZXggLSBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2Ygd3B0X211dGV4CisKKyAgICBccmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjZXNzLiBGYWlsIG90aGVyd2lzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxNdXRleEFjcXVpcmUod3B0X211dGV4ICpwTXV0ZXgpCit7CisgICAgLyogTm90IGRvaW5nIHNhbml0eSBjaGVja3Mgc2luY2UgVk9TIGRvZXMgdGhlbSBhbnl3YXlzICovCisKKyAgIGlmKCB2b3NfbG9ja19hY3F1aXJlKCAodm9zX2xvY2tfdCopcE11dGV4ICApICE9IFZPU19TVEFUVVNfU1VDQ0VTUyApCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICIgbXV0ZXggYWNxdWlyZSBmYWlsXG4iKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBAYnJpZWYgUmVsZWFzZSBhIGhlbGQgbXV0ZXggb2JqZWN0CisKKyAgICBccGFyYW0gcE11dGV4IC0gYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHdwdF9tdXRleAorCisgICAgXHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgaWYgc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsTXV0ZXhSZWxlYXNlKHdwdF9tdXRleCAqcE11dGV4KQoreworICAgIC8qIE5vdCBkb2luZyBzYW5pdHkgY2hlY2tzIHNpbmNlIFZPUyBkb2VzIHRoZW0gYW55d2F5cyAqLworCisgICBpZiggdm9zX2xvY2tfcmVsZWFzZSggKHZvc19sb2NrX3QqKXBNdXRleCApICE9IFZPU19TVEFUVVNfU1VDQ0VTUyApCisgICB7CisgICAgICBXUEFMX1RSQUNFKGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgCisgICAgICAgICAgICAgICAgICIgbXV0ZXggcmVsZWFzZVxuIik7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisgICB9CisKKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQGJyaWVmIEluaXRpYWxpemUgYW4gZXZlbnQgb2JqZWN0CisKKyAgICBccGFyYW0gcEV2ZW50IJYgYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHdwdF9ldmVudAorCisgICAgXHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgaWYgc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsRXZlbnRJbml0KHdwdF9ldmVudCAqcEV2ZW50KQoreworICAgLyogTm90IGRvaW5nIHNhbml0eSBjaGVja3Mgc2luY2UgVk9TIGRvZXMgdGhlbSBhbnl3YXlzICovCisKKyAgIGlmKCB2b3NfZXZlbnRfaW5pdCggKHZvc19ldmVudF90KilwRXZlbnQgKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAiIGNyZWF0ZSBldmVudCBmYWlsXG4iKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBAYnJpZWYgSW52YWxpZGF0ZSBhbiBldmVudCBvYmplY3QKKworICAgIFxwYXJhbSBwRXZlbnQgliBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2Ygd3B0X2V2ZW50CisKKyAgICBccmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjZXNzLiBGYWlsIG90aGVyd2lzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3dwdF9zdGF0dXMgd3BhbEV2ZW50RGVsZXRlKHdwdF9ldmVudCAqcEV2ZW50KQoreworICAgLyogTm90IGRvaW5nIHNhbml0eSBjaGVja3Mgc2luY2UgVk9TIGRvZXMgdGhlbSBhbnl3YXlzICovCisKKyAgIGlmKCB2b3NfZXZlbnRfZGVzdHJveSggKHZvc19ldmVudF90KilwRXZlbnQgKSAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MgKQorICAgeworICAgICAgV1BBTF9UUkFDRShlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsIAorICAgICAgICAgICAgICAgICAiIGRlbGV0ZSBldmVudCBmYWlsXG4iKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfRkFJTFVSRTsKKyAgIH0KKworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBAYnJpZWYgd3BhbEV2ZW50V2FpdCCWIFdhaXQgb24gYW4gZXZlbnQgb2JqZWN0CisKKyAgICBccGFyYW0KKyAgICAgICAgcEV2ZW50IJYgYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHdwdF9ldmVudAorICAgICAgICB0aW1lb3V0IC0gdGltZW91dCB2YWx1ZSBhdCB1bml0IG9mIG1pbGxpLXNlY29uZHMuIAorICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZiBtZWFucyBpbmZpbml0ZSB3YWl0CisKKyAgICAgXHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB0aGUgd2FpdCB3YXMgc2F0aXNpZmVkIGJ5IG9uZSBvZiB0aGUgZXZlbnRzCisgICAgICAgICAgICAgaW4gdGhlIGV2ZW50IGFycmF5IGJlaW5nIHNldC4gIFRoZSBpbmRleCBpbnRvIHRoZSBldmVudCBhcnJ5IAorICAgICAgICAgICAgIHRoYXQgc2F0aXNmaWVkIHRoZSB3YWl0IGNhbiBiZSBmb3VuZCBhdCAqcEV2ZW50SW5kZXguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgZVdMQU5fUEFMU1RBVFVTX0VfVElNRU9VVCAtIHRoZSB0aW1lb3V0IGludGVydmFsIGVsYXBzZWQgYmVmb3JlIGFueSBvZiAKKyAgICAgICAgICAgICB0aGUgZXZlbnRzIHdlcmUgc2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGluCisgICAgICAgICAgICAgdGhlIGV2ZW50IGFycmF5IHJlZmVycyB0byBhbiB1bmluaXRpYWxpemVkIGV2ZW50IG9iamVjdC4gIFRoZQorICAgICAgICAgICAgIGludmFsaWQgZXZlbnQgaXMgaWRlbnRpZmllZCBieSB0aGUgaW5kZXggaW4gKnBFdmVudEluZGV4LiAgTm90ZQorICAgICAgICAgICAgIHRoYXQgb25seSB0aGUgZmlyc3QgdW5pbml0aWFsaXplZCBldmVudCBpcyBkZXRlY3RlZCB3aGVuIHRoaXMgZXJyb3IKKyAgICAgICAgICAgICBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfRU1QVFkgLSB0aGUgZXZlbnRzIGFycmF5IGlzIGVtcHR5LiAgVGhpcyBjb25kaXRpb24KKyAgICAgICAgICAgICBpcyBkZXRlY3RlZCBieSBudW1FdmVudHMgYmVpbmcgMCBvbiBpbnB1dC4KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19FX0ZBVUxUIC0gZXZlbnQgb3IgcEV2ZW50SW5kZXggaXMgYW4gaW52YWxpZCBwb2ludGVyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbEV2ZW50V2FpdCh3cHRfZXZlbnQgKnBFdmVudCwgd3B0X3VpbnQzMiB0aW1lb3V0KQoreworICAgLyogTm90IGRvaW5nIHNhbml0eSBjaGVja3Mgc2luY2UgVk9TIGRvZXMgdGhlbSBhbnl3YXlzICovCisKKyAgIHdwdF9zdGF0dXMgc3RhdHVzID0gZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkU7CisgICBWT1NfU1RBVFVTICB2b3Nfc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CisKKyAgIC8qIEluIFZPUyB0aW1lb3V0ID0gMCBjb3JyZXNwb25kcyB0byBpbmZpbml0ZSB3YWl0ICovCisgICB0aW1lb3V0ID0gKCB0aW1lb3V0ID09IFdMQU5fUEFMX1dBSVRfSU5GSU5JVEUgPyAwIDogdGltZW91dCApOworCisgICB2b3Nfc3RhdHVzID0gdm9zX3dhaXRfc2luZ2xlX2V2ZW50KCAodm9zX2V2ZW50X3QqKXBFdmVudCwgdGltZW91dCApOworCisgICBzdGF0dXMgPSBXUEFMX1ZPU19UT19XUEFMX1NUQVRVUyggdm9zX3N0YXR1cyApOworCisgICByZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdwYWxFdmVudFNldCCWIFNldCBhbiBldmVudCBvYmplY3QgdG8gc2lnbmFsZWQgc3RhdGUKKyAgICBQYXJhbToKKyAgICAgICAgcEV2ZW50IJYgYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgb2JqZWN0IG9mIHdwdF9ldmVudAorICAgIFJldHVybjoKKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIJYgc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsRXZlbnRTZXQod3B0X2V2ZW50ICpwRXZlbnQpCit7CisgICAvKiBOb3QgZG9pbmcgc2FuaXR5IGNoZWNrcyBzaW5jZSBWT1MgZG9lcyB0aGVtIGFueXdheXMgKi8KKworICAgcmV0dXJuICggV1BBTF9WT1NfVE9fV1BBTF9TVEFUVVModm9zX2V2ZW50X3NldCggKHZvc19ldmVudF90KilwRXZlbnQgKSkgKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsRXZlbnRSZXNldCCWIFNldCBhbiBldmVudCBvYmplY3QgdG8gbm9uLXNpZ25hbGVkIHN0YXRlCisgICAgUGFyYW06CisgICAgICAgIHBFdmVudCCWIGEgcG9pbnRlciB0byBjYWxsZXIgYWxsb2NhdGVkIG9iamVjdCBvZiB3cHRfZXZlbnQKKyAgICBSZXR1cm46CisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyCWIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbEV2ZW50UmVzZXQod3B0X2V2ZW50ICpwRXZlbnQpCit7CisgICAvKiBOb3QgZG9pbmcgc2FuaXR5IGNoZWNrcyBzaW5jZSBWT1MgZG9lcyB0aGVtIGFueXdheXMgKi8KKworICAgcmV0dXJuICggV1BBTF9WT1NfVE9fV1BBTF9TVEFUVVModm9zX2V2ZW50X3Jlc2V0KCAodm9zX2V2ZW50X3QqKXBFdmVudCApKSApOworfQorCisKZGlmZiAtLWdpdCBhL0NPUkUvV0RJL1dQQUwvc3JjL3dsYW5fcWN0X3BhbF90aW1lci5jIGIvQ09SRS9XREkvV1BBTC9zcmMvd2xhbl9xY3RfcGFsX3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlZWNmNgotLS0gL2Rldi9udWxsCisrKyBiL0NPUkUvV0RJL1dQQUwvc3JjL3dsYW5fcWN0X3BhbF90aW1lci5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCisgKiBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworCisKKy8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFxmaWxlICB3bGFuX3FjdF9wYWxfdGltZXIuYworICAKKyAgXGJyaWVmIEltcGxlbWVudGF0aW9uIHRyYWNlL2xvZ2dpbmcgQVBJcyBQQUwgZXhwb3J0cy4gd3B0ID0gKFdsYW4gUGFsIFR5cGUpIHdwYWwgPSAoV2xhbiBQQUwpCisgICAgICAgICAgICAgICAKKyAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBXaW5kb3dzLgorICAKKyAgIENvcHlyaWdodCAyMDEwLTIwMTEgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90aW1lci5oIgorI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90cmFjZS5oIgorI2luY2x1ZGUgIndsYW5fcWN0X29zX3N0YXR1cy5oIgorI2luY2x1ZGUgInZvc190aHJlYWRzLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgXGJyaWVmIHdwYWxUaW1lckNiYWNrIC0gVk9TIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uCisKKyBccGFyYW0gcFVzZXJkYXRhIC0gQSBjb29raWUgdG8gZGF0YSBwYXNzZWQgYmFjayBpbiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCB3cGFsVGltZXJDYmFjayggdm9pZCAqIHVzZXJEYXRhICkKK3sKKyAgIHdwdF90aW1lciAqcFRpbWVyID0gKHdwdF90aW1lciAqKXVzZXJEYXRhOworCisgICBpZihOVUxMICE9IHBUaW1lci0+Y2FsbGJhY2spCisgICB7CisgICAgICBwVGltZXItPmNhbGxiYWNrKHBUaW1lci0+cFVzZXJEYXRhKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9XQVJOLCAiICVzIHBUaW1lciglZCkgY2FsbGJhY2sgYWZ0ZXIgZGVsZXRlZCBcbiIsCisgICAgICAgICBfX0ZVTkNUSU9OX18sICh3cHRfdWludDMyKXBUaW1lciApOworICAgfQorfS8qd3BhbFRpbWVyQ2JhY2sqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFxicmllZiB3cGFsVGltZXJJbml0IC0gaW5pdGlhbGl6ZSBhIHdwdF90aW1lciBvYmplY3QKKworIFxwYXJhbSBwVGltZXIgLSBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCB3cHRfdGltZXIgb2JqZWN0CisgXHBhcmFtIGNhbGxiYWNrIC0gQSBjYWxsYmFjayBmdW5jdGlvbgorIFxwYXJhbSBwVXNlckRhdGEgLSBBIGNvb2tpZSB0byBkYXRhIHBhc3NlZCBiYWNrIGluIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorCisgXHJldHVybiB3cHRfc3RhdHVzIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFRpbWVySW5pdCh3cHRfdGltZXIgKiBwVGltZXIsIHdwYWxfdGltZXJfY2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKnBVc2VyRGF0YSkKK3sKKyAgIC8qIFNhbml0eSBDaGVja3MgKi8KKyAgIGlmKCBwVGltZXIgPT0gTlVMTCB8fCBjYWxsYmFjayA9PSBOVUxMICkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgIiAlcyBXcm9uZyBwYXJhbSBwVGltZXIoJWQpIGNhbGxiYWNrKCVkKVxuIiwKKyAgICAgICAgIF9fRlVOQ1RJT05fXywgKHdwdF91aW50MzIpcFRpbWVyLCAod3B0X3VpbnQzMiljYWxsYmFjayApOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKworICAgaWYgKCB2b3NfdGltZXJfaW5pdCggJnBUaW1lci0+dGltZXIudGltZXJPYmosIFZPU19USU1FUl9UWVBFX1NXLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdwYWxUaW1lckNiYWNrLCAodm9pZCopcFRpbWVyICkgPT0gVk9TX1NUQVRVU19TVUNDRVNTICkKKyAgIHsKKyAgICAgIHBUaW1lci0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgIHBUaW1lci0+cFVzZXJEYXRhID0gcFVzZXJEYXRhOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgIH0KKworICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9GQUlMVVJFOworfS8qd3BhbFRpbWVySW5pdCovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcYnJpZWYgd3BhbFRpbWVyRGVsZXRlIC0gaW52YWxpZGF0ZSBhIHdwdF90aW1lciBvYmplY3QKKworICAgIFxwYXJhbSBwVGltZXIgYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgd3B0X3RpbWVyIG9iamVjdAorCisgICAgXHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgPz8gc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsVGltZXJEZWxldGUod3B0X3RpbWVyICpwVGltZXIpCit7CisgICB3cHRfc3RhdHVzIHN0YXR1czsKKworICAgLyogU2FuaXR5IENoZWNrcyAqLworICAgaWYoIHBUaW1lciA9PSBOVUxMICkKKyAgIHsKKyAgICAgIFdQQUxfVFJBQ0UoIGVXTEFOX01PRFVMRV9QQUwsIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUiwgIiAlcyBXcm9uZyBwYXJhbSBwVGltZXIoJWQpXG4iLAorICAgICAgICAgX19GVU5DVElPTl9fLCAod3B0X3VpbnQzMilwVGltZXIgKTsKKyAgICAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUw7CisgICB9CisKKyAgIHN0YXR1cyA9IFdQQUxfVk9TX1RPX1dQQUxfU1RBVFVTKCB2b3NfdGltZXJfZGVzdHJveSgmcFRpbWVyLT50aW1lci50aW1lck9iaikpOworCisgICBpZiggc3RhdHVzID09IGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyApCisgICB7CisgICAgICBwVGltZXItPmNhbGxiYWNrID0gTlVMTDsKKyAgICAgIHBUaW1lci0+cFVzZXJEYXRhID0gTlVMTDsKKyAgIH0KKworICAgcmV0dXJuIHN0YXR1czsKK30vKndwYWxUaW1lckRlbGV0ZSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsVGltZXJTdGFydCAtIHN0YXJ0IGEgd3B0X3RpbWVyIG9iamVjdCB3aXRoIGEgdGltZW91dCB2YWx1ZQorCisgICAgXHBhcmFtIHBUaW1lciAtIGEgcG9pbnRlciB0byBjYWxsZXIgYWxsb2NhdGVkIHdwdF90aW1lciBvYmplY3QKKyAgICBccGFyYW0gdGltZW91dCAtIHRpbWVvdXQgdmFsdWUgb2YgdGhlIHRpbWVyLiBJbiB1bml0IG9mIG1pbGxpLXNlY29uZHMKKworICAgIFxyZXR1cm4KKyAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLword3B0X3N0YXR1cyB3cGFsVGltZXJTdGFydCh3cHRfdGltZXIgKiBwVGltZXIsIHdwdF91aW50MzIgdGltZW91dCkKK3sKKyAgIC8qIFNhbml0eSBDaGVja3MgKi8KKyAgIGlmKCBwVGltZXIgPT0gTlVMTCApCisgICB7CisgICAgICBXUEFMX1RSQUNFKCBlV0xBTl9NT0RVTEVfUEFMLCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IsICIgJXMgV3JvbmcgcGFyYW0gcFRpbWVyKCVkKVxuIiwKKyAgICAgICAgIF9fRlVOQ1RJT05fXywgKHdwdF91aW50MzIpcFRpbWVyICk7CisgICAgICByZXR1cm4gZVdMQU5fUEFMX1NUQVRVU19FX0lOVkFMOworICAgfQorICAgcmV0dXJuICggV1BBTF9WT1NfVE9fV1BBTF9TVEFUVVMoIHZvc190aW1lcl9zdGFydCggJnBUaW1lci0+dGltZXIudGltZXJPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgKSApICk7Cit9Lyp3cGFsVGltZXJTdGFydCovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcYnJpZWYgd3BhbFRpbWVyU3RvcCAtIHN0b3AgYSB3cHRfdGltZXIgb2JqZWN0LiBTdG9wIGRvZXNuJ3QgZ3VhcmFudGVlIHRoZQorICAgICAgICAgICAgdGltZXIgaGFuZGxlciBpcyBub3QgY2FsbGVkIGlmIGl0IGlzIGFscmVhZHkgdGltZW91dC4KKworICAgIFxwYXJhbSBwVGltZXIgLSBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCB3cHRfdGltZXIgb2JqZWN0CisKKyAgICBccmV0dXJuCisgICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3dwdF9zdGF0dXMgd3BhbFRpbWVyU3RvcCh3cHRfdGltZXIgKiBwVGltZXIpCit7CisgICAvKiBTYW5pdHkgQ2hlY2tzICovCisgICBpZiggcFRpbWVyID09IE5VTEwgKQorICAgeworICAgICAgV1BBTF9UUkFDRSggZVdMQU5fTU9EVUxFX1BBTCwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SLCAiICVzIFdyb25nIHBhcmFtIHBUaW1lciglZClcbiIsCisgICAgICAgICBfX0ZVTkNUSU9OX18sICh3cHRfdWludDMyKXBUaW1lciApOworICAgICAgcmV0dXJuIGVXTEFOX1BBTF9TVEFUVVNfRV9JTlZBTDsKKyAgIH0KKyAgIHJldHVybiAoV1BBTF9WT1NfVE9fV1BBTF9TVEFUVVMoIHZvc190aW1lcl9zdG9wKCAmcFRpbWVyLT50aW1lci50aW1lck9iaiApKSk7Cit9Lyp3cGFsVGltZXJTdG9wKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB3cGFsU2xlZXAgLSBzbGVlcCBmb3IgYSBzcGVjaWZpZWQgaW50ZXJ2YWwKKyAgICBQYXJhbToKKyAgICAgICAgdGltZW91dCAtIGFtb3VudCBvZiB0aW1lIHRvIHNsZWVwLiBJbiB1bml0IG9mIG1pbGxpLXNlY29uZHMuCisgICAgUmV0dXJuOgorICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzLiBGYWlsIG90aGVyd2lzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit3cHRfc3RhdHVzIHdwYWxTbGVlcCh3cHRfdWludDMyIHRpbWVvdXQpCit7CisgICB2b3Nfc2xlZXAoIHRpbWVvdXQgKTsKKyAgIHJldHVybiBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9DT1JFL1dESS9XUEFML3NyYy93bGFuX3FjdF9wYWxfdHJhY2UuYyBiL0NPUkUvV0RJL1dQQUwvc3JjL3dsYW5fcWN0X3BhbF90cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTM5NDIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1JFL1dESS9XUEFML3NyYy93bGFuX3FjdF9wYWxfdHJhY2UuYwpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAorICogY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKworCisvKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBcZmlsZSAgd2xhbl9xY3RfcGFsX3RyYWNlLmMKKyAgCisgIFxicmllZiBJbXBsZW1lbnRhdGlvbiB0cmFjZS9sb2dnaW5nIEFQSXMgUEFMIGV4cG9ydHMuIHdwdCA9IChXbGFuIFBhbCBUeXBlKSB3cGFsID0gKFdsYW4gUEFMKQorICAgICAgICAgICAgICAgCisgICBEZWZpbml0aW9ucyBmb3IgTGludXgvQW5kcm9pZCBwbGF0Zm9ybQorICAKKyAgIENvcHlyaWdodCAyMDEwLTIwMTEgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgCisgICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90cmFjZS5oIgorI2luY2x1ZGUgImlfdm9zX3R5cGVzLmgiCisKKyNpZmRlZiBXTEFOX0RFQlVHCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBQcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFdQQUxfVFJBQ0VfQlVGRkVSX1NJWkUgKCA1MTIgKQorCisvLyBtYWNybyB0byBtYXAgd3BhbCB0cmFjZSBsZXZlbHMgaW50byB0aGUgYml0bWFzaworI2RlZmluZSBXUEFMX1RSQUNFX0xFVkVMX1RPX01PRFVMRV9CSVRNQVNLKCBfbGV2ZWwgKSAoICggMSA8PCAoX2xldmVsKSApICkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8vIFRyYWNlIGxldmVsIGZvciBhIG1vZHVsZSwgYXMgYSBiaXRtYXNrLiAgVGhlIGJpdHMgaW4gdGhpcyBtYXNrCisgICAvLyBhcmUgb3JkZXJlZCBieSB3cHRfdHJhY2VsZXZlbC4gIEZvciBleGFtcGxlLCBlYWNoIGJpdCByZXByZXNlbnRzCisgICAvLyBvbmUgb2YgdGhlIGJpdHMgaW4gd3B0X3RyYWNlbGV2ZWwgdGhhdCBtYXkgYmUgdHVybmVkIG9uIHRvIGhhdmUKKyAgIC8vIHRyYWNlcyBhdCB0aGF0IGxldmVsIGxvZ2dlZCwgaS5lLiBpZiBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IgaXMKKyAgIC8vID09IDIsIHRoZW4gaWYgYml0IDIgKGxvdyBvcmRlcikgaXMgdHVybmVkIE9OLCB0aGVuIEVSUk9SIHRyYWNlcworICAgLy8gd2lsbCBiZSBwcmludGVkIHRvIHRoZSB0cmFjZSBsb2cuCisgICAvLworICAgLy8gTm90ZSB0aGF0IGFsbCBiaXRzIHR1cm5lZCBPRkYgbWVhbnMgbm8gdHJhY2VzLgorICAgd3B0X3VpbnQxNiBtb2R1bGVUcmFjZUxldmVsOworCisgICAvLyAzIGNoYXJhY3RlciBzdHJpbmcgbmFtZSBmb3IgdGhlIG1vZHVsZQorICAgd3B0X3VpbnQ4IG1vZHVsZU5hbWVTdHJbIDQgXTsgICAvLyAzIGNoYXJzIHBsdXMgdGhlIE5VTEwKKworfSBtb2R1bGVUcmFjZUluZm87CisKKworLy8gQXJyYXkgb2Ygc3RhdGljIGRhdGEgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIHBlciBtb2R1bGUgdHJhY2UKKy8vIGluZm9ybWF0aW9uLiAgVGhpcyBpbmNsdWRlcyB0aGUgdHJhY2UgbGV2ZWwgZm9yIHRoZSBtb2R1bGUgYW5kCisvLyB0aGUgMyBjaGFyYWN0ZXIgJ25hbWUnIG9mIHRoZSBtb2R1bGUgZm9yIG1hcmtpbmcgdGhlIHRyYWNlIGxvZ3MuCittb2R1bGVUcmFjZUluZm8gZ1RyYWNlSW5mb1sgZVdMQU5fTU9EVUxFX0NPVU5UIF0gPQoreworICAgeyAoMTw8ZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMKXwoMTw8ZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SKSwgIkRBTCIgfSwgCisgICB7ICgxPDxlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwpfCgxPDxlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IpLCAiQ1RMIiB9LAorICAgeyAoMTw8ZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0ZBVEFMKXwoMTw8ZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0VSUk9SKSwgIkRBVCIgfSwgCisgICB7ICgxPDxlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwpfCgxPDxlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IpLCAiUEFMIiB9LCAKK307CisKKworLy8gdGhlIHRyYWNlIGxldmVsIHN0cmluZ3MgaW4gYW4gYXJyYXkuICB0aGVzZSBhcmUgb3JkZXJlZCBpbiB0aGUgc2FtZSBvcmRlcgorLy8gYXMgdGhlIHRyYWNlIGxldmVscyBhcmUgZGVmaW5lZCBpbiB0aGUgZW51bSAoc2VlIHdwdF90cmFjZWxldmVsKSBzbyB3ZQorLy8gY2FuIGluZGV4IGludG8gdGhpcyBhcnJheSB3aXRoIHRoZSBsZXZlbCBhbmQgZ2V0IHRoZSByaWdodCBzdHJpbmcuICBUaGUKKy8vIHRyYWNlIGxldmVscyBhcmUuLi4KKy8vIG5vbmUsIEZhdGFsLCBFcnJvciwgV2FybmluZywgSW5mbywgSW5mb0hpZ2gsIEluZm9NZWQsIEluZm9Mb3cKK3N0YXRpYyBjb25zdCBjaGFyICogVFJBQ0VfTEVWRUxfU1RSW10gPSB7CisgICAiICAiLCAiRiAiLCAiRSAiLCAiVyAiLCAiSSAiLCAiSUgiLCAiSU0iLCAiSUwiIH07CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEZ1bmN0aW9ucworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgd3BhbE91dHB1dCh3cHRfdHJhY2VsZXZlbCBsZXZlbCwgY2hhciAqc3RyQnVmZmVyKQoreworICAgc3dpdGNoKGxldmVsKQorICAgeworICAgZGVmYXVsdDoKKyAgICAgIHByaW50ayhLRVJOX0NSSVQgIiVzOiBVbmtub3duIHRyYWNlIGxldmVsIHBhc3NlZCBpbiFcbiIsIF9fRlVOQ1RJT05fXyk7IAorICAgICAgLy8gZmFsbCB0aHJ1IGFuZCB1c2UgRkFUQUwKKworICAgY2FzZSBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUw6CisgICAgICBwcmludGsoS0VSTl9DUklUICIlc1xuIiwgc3RyQnVmZmVyKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9FUlJPUjoKKyAgICAgIHByaW50ayhLRVJOX0VSUiAiJXNcbiIsIHN0ckJ1ZmZlcik7CisgICAgICBicmVhazsKKworICAgY2FzZSBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTjoKKyAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzXG4iLCBzdHJCdWZmZXIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk86CisgICAgICBwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgc3RyQnVmZmVyKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0hJR0g6CisgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzXG4iLCBzdHJCdWZmZXIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fTUVEOgorICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlc1xuIiwgc3RyQnVmZmVyKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVzoKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBzdHJCdWZmZXIpOworICAgICAgYnJlYWs7CisgICB9Cit9CisKK3ZvaWQgd3BhbFRyYWNlU2V0TGV2ZWwoIHdwdF9tb2R1bGVpZCBtb2R1bGUsIHdwdF90cmFjZWxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgd3B0X2Jvb2xlYW4gb24gKQoreworICAgLy8gTWFrZSBzdXJlIHRoZSBjYWxsZXIgaXMgcGFzc2luZyBpbiBhIHZhbGlkIExFVkVMIGFuZCBNT0RVTEUuCisgICBpZiAoIChlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfQ09VTlQgPD0gbGV2ZWwpIHx8CisgICAgICAgIChlV0xBTl9NT0RVTEVfQ09VTlQgPD0gbW9kdWxlKSApCisgICB7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmICggZVdMQU5fUEFMX1RSQUNFX0xFVkVMX05PTkUgPT0gbGV2ZWwgKQorICAgeworICAgICAgLy8gVHJlYXQgJ25vbmUnIGRpZmZlcmVudGx5LiAgTk9ORSBtZWFucyB3ZSBoYXZlIHRvIHR1cm4gb2ZmIGFsbAorICAgICAgLy8gdGhlIGJpdHMgaW4gdGhlIGJpdCBtYXNrIHNvIG5vbmUgb2YgdGhlIHRyYWNlcyBhcHBlYXIuCisgICAgICBnVHJhY2VJbmZvWyBtb2R1bGUgXS5tb2R1bGVUcmFjZUxldmVsID0gMDsKKyAgIH0KKyAgIGVsc2UgaWYgKCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfQUxMID09IGxldmVsICkKKyAgIHsKKyAgICAgIC8vIFRyZWF0ICdhbGwnIGRpZmZlcmVudGx5LiAgQUxMIG1lYW5zIHdlIGhhdmUgdG8gdHVybiBvbiBhbGwKKyAgICAgIC8vIHRoZSBiaXRzIGluIHRoZSBiaXQgbWFzayBzbyBhbGwgb2YgdGhlIHRyYWNlcyBhcHBlYXIuCisgICAgICBnVHJhY2VJbmZvWyBtb2R1bGUgXS5tb2R1bGVUcmFjZUxldmVsID0gMHhGRkZGOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLy8gV2UgYXJlIHR1cm5pbmcgYSBwYXJ0aWN1bGFyIHRyYWNlIGxldmVsIG9uIG9yIG9mZgorICAgICAgaWYgKG9uKQorICAgICAgeworICAgICAgICAgLy8gU2V0IHRoZSBkZXNpcmVkIGJpdCBpbiB0aGUgYml0IG1hc2sgZm9yIHRoZSBtb2R1bGUgdHJhY2UgbGV2ZWwuCisgICAgICAgICBnVHJhY2VJbmZvWyBtb2R1bGUgXS5tb2R1bGVUcmFjZUxldmVsIHw9CisgICAgICAgICAgICBXUEFMX1RSQUNFX0xFVkVMX1RPX01PRFVMRV9CSVRNQVNLKCBsZXZlbCApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLy8gQ2xlYXIgdGhlIGRlc2lyZWQgYml0IGluIHRoZSBiaXQgbWFzayBmb3IgdGhlIG1vZHVsZSB0cmFjZSBsZXZlbC4KKyAgICAgICAgIGdUcmFjZUluZm9bIG1vZHVsZSBdLm1vZHVsZVRyYWNlTGV2ZWwgJj0KKyAgICAgICAgICAgIH4oV1BBTF9UUkFDRV9MRVZFTF9UT19NT0RVTEVfQklUTUFTSyggbGV2ZWwgKSk7CisgICAgICB9CisgICB9Cit9CisKK3dwdF9ib29sZWFuIHdwYWxUcmFjZUNoZWNrTGV2ZWwoIHdwdF9tb2R1bGVpZCBtb2R1bGUsIHdwdF90cmFjZWxldmVsIGxldmVsICkKK3sKKyAgIHdwdF9ib29sZWFuIHRyYWNlT24gPSBlV0xBTl9QQUxfRkFMU0U7CisKKyAgIGlmICggKCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfTk9ORSA9PSBsZXZlbCApIHx8CisgICAgICAgICggbGV2ZWwgPj0gZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0NPVU5UICkpCisgICB7CisgICAgICB0cmFjZU9uID0gZVdMQU5fUEFMX0ZBTFNFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgdHJhY2VPbiA9ICggbGV2ZWwgJiBnVHJhY2VJbmZvWyBtb2R1bGUgXS5tb2R1bGVUcmFjZUxldmVsICkgPyBlV0xBTl9QQUxfVFJVRSA6IGVXTEFOX1BBTF9GQUxTRTsKKyAgIH0KKworICAgcmV0dXJuKCB0cmFjZU9uICk7Cit9CisKK3ZvaWQgd3BhbFRyYWNlRGlzcGxheSh2b2lkKQoreworICAgd3B0X21vZHVsZWlkIG1vZHVsZUlkOworCisgICBwcmludGsoS0VSTl9DUklUCisgICAgICAgICAgIiAgICAgMSlGQVRBTCAgMilFUlJPUiAgMylXQVJOICA0KUlORk8gICIKKyAgICAgICAgICAiNSlJTkZPX0ggIDYpSU5GT19NICA3KUlORk9fTFxuIik7IAorICAgZm9yIChtb2R1bGVJZCA9IDA7IG1vZHVsZUlkIDwgZVdMQU5fTU9EVUxFX0NPVU5UOyArK21vZHVsZUlkKQorICAgeworICAgICAgcHJpbnRrKEtFUk5fQ1JJVAorICAgICAgICAgICAgICIlMmQpJXMgICAgJXMgICAgICAgICVzICAgICAgICVzICAgICAgICIKKyAgICAgICAgICAgICAiJXMgICAgICAgICVzICAgICAgICAgJXMgICAgICAgICAlc1xuIiwKKyAgICAgICAgICAgICAoaW50KW1vZHVsZUlkLAorICAgICAgICAgICAgIGdUcmFjZUluZm9bbW9kdWxlSWRdLm1vZHVsZU5hbWVTdHIsCisgICAgICAgICAgICAgKGdUcmFjZUluZm9bbW9kdWxlSWRdLm1vZHVsZVRyYWNlTGV2ZWwgJgorICAgICAgICAgICAgICAoMSA8PCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRkFUQUwpKSA/ICJYIjoiICIsCisgICAgICAgICAgICAgKGdUcmFjZUluZm9bbW9kdWxlSWRdLm1vZHVsZVRyYWNlTGV2ZWwgJgorICAgICAgICAgICAgICAoMSA8PCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfRVJST1IpKSA/ICJYIjoiICIsCisgICAgICAgICAgICAgKGdUcmFjZUluZm9bbW9kdWxlSWRdLm1vZHVsZVRyYWNlTGV2ZWwgJgorICAgICAgICAgICAgICAoMSA8PCBlV0xBTl9QQUxfVFJBQ0VfTEVWRUxfV0FSTikpID8gIlgiOiIgIiwKKyAgICAgICAgICAgICAoZ1RyYWNlSW5mb1ttb2R1bGVJZF0ubW9kdWxlVHJhY2VMZXZlbCAmCisgICAgICAgICAgICAgICgxIDw8IGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPKSkgPyAiWCI6IiAiLAorICAgICAgICAgICAgIChnVHJhY2VJbmZvW21vZHVsZUlkXS5tb2R1bGVUcmFjZUxldmVsICYKKyAgICAgICAgICAgICAgKDEgPDwgZVdMQU5fUEFMX1RSQUNFX0xFVkVMX0lORk9fSElHSCkpID8gIlgiOiIgIiwKKyAgICAgICAgICAgICAoZ1RyYWNlSW5mb1ttb2R1bGVJZF0ubW9kdWxlVHJhY2VMZXZlbCAmCisgICAgICAgICAgICAgICgxIDw8IGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX01FRCkpID8gIlgiOiIgIiwKKyAgICAgICAgICAgICAoZ1RyYWNlSW5mb1ttb2R1bGVJZF0ubW9kdWxlVHJhY2VMZXZlbCAmCisgICAgICAgICAgICAgICgxIDw8IGVXTEFOX1BBTF9UUkFDRV9MRVZFTF9JTkZPX0xPVykpID8gIlgiOiIgIgorICAgICAgICAgKTsKKyAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBcYnJpZWYgd3BhbFRyYWNlKCkgLSBFeHRlcm5hbGx5IGNhbGxlZCB0cmFjZSBmdW5jdGlvbgorCisgIENoZWNrcyB0aGUgbGV2ZWwgb2Ygc2V2ZXJpdHkgYW5kIGFjY29yZGluZ2x5IHByaW50cyB0aGUgdHJhY2UgbWVzc2FnZXMKKworICBccGFyYW0gbW9kdWxlIC0gbW9kdWxlIGlkZW50aWZpZXIuICAgQSBtZW1iZXIgb2YgdGhlIHdwdF9tb2R1bGVpZAorICAgICAgICAgZW51bWVyYXRpb24gdGhhdCBpZGVudGlmaWVzIHRoZSBtb2R1bGUgaXNzdWluZyB0aGUgdHJhY2UgbWVzc2FnZS4KKworICBccGFyYW0gbGV2ZWwgLSB0cmFjZSBsZXZlbC4gICBBIG1lbWJlciBvZiB0aGUgd3B0X3RyYWNlbGV2ZWwKKyAgICAgICAgIGVudW1lcmF0aW9uIGluZGljYXRpbmcgdGhlIHNldmVyaXR5IG9mIHRoZSBjb25kaXRpb24gY2F1c2luZyB0aGUKKyAgICAgICAgIHRyYWNlIG1lc3NhZ2UgdG8gYmUgaXNzdWVkLiAgIE1vcmUgc2V2ZXJlIGNvbmRpdGlvbnMgYXJlIG1vcmUKKyAgICAgICAgIGxpa2VseSB0byBiZSBsb2dnZWQuCisKKyAgXHBhcmFtIHN0ckZvcm1hdCAtIGZvcm1hdCBzdHJpbmcuICBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuICBUaGlzIGZvcm1hdAorICAgICAgICAgc3RyaW5nIGNvbnRhaW5zIHByaW50Zi1saWtlIHJlcGxhY2VtZW50IHBhcmFtZXRlcnMsIHdoaWNoIGZvbGxvdworICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaW4gdGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QuCisKKyAgXHJldHVybiAgbm90aGluZworCisgIFxzYQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgd3BhbFRyYWNlKCB3cHRfbW9kdWxlaWQgbW9kdWxlLCB3cHRfdHJhY2VsZXZlbCBsZXZlbCwgY2hhciAqc3RyRm9ybWF0LCAuLi4gKQoreworICAgd3B0X3VpbnQ4IHN0ckJ1ZmZlclsgV1BBTF9UUkFDRV9CVUZGRVJfU0laRSBdOworICAgaW50IG47CisKKyAgIC8vIFByaW50IHRoZSB0cmFjZSBtZXNzYWdlIHdoZW4gdGhlIGRlc2lyZWQgbGV2ZWwgYml0IGlzIHNldCBpbiB0aGUgbW9kdWxlCisgICAvLyB0cmFjZWwgbGV2ZWwgbWFzay4KKyAgIGlmICggZ1RyYWNlSW5mb1sgbW9kdWxlIF0ubW9kdWxlVHJhY2VMZXZlbCAmIFdQQUxfVFJBQ0VfTEVWRUxfVE9fTU9EVUxFX0JJVE1BU0soIGxldmVsICkgKQorICAgeworICAgICAgdmFfbGlzdCB2YWw7CisgICAgICB2YV9zdGFydCh2YWwsIHN0ckZvcm1hdCk7CisKKyAgICAgIC8vIHByaW50IHRoZSBwcmVmaXggc3RyaW5nIGludG8gdGhlIHN0cmluZyBidWZmZXIuLi4KKyAgICAgIG4gPSBzbnByaW50ZihzdHJCdWZmZXIsIFdQQUxfVFJBQ0VfQlVGRkVSX1NJWkUsICJbJWQ6JWQ6JTJzOiUzc10gIiwKKyAgICAgICAgICAgICAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksCisgICAgICAgICAgICAgICAgICAgaW5faW50ZXJydXB0KCkgPyAwIDogY3VycmVudC0+cGlkLAorICAgICAgICAgICAgICAgICAgIChjaGFyICopIFRSQUNFX0xFVkVMX1NUUlsgbGV2ZWwgXSwKKyAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBnVHJhY2VJbmZvWyBtb2R1bGUgXS5tb2R1bGVOYW1lU3RyKTsKKworCisgICAgICAvLyBwcmludCB0aGUgZm9ybWF0dGVkIGxvZyBtZXNzYWdlIGFmdGVyIHRoZSBwcmVmaXggc3RyaW5nLgorICAgICAgLy8gbm90ZSB3ZSByZXNlcnZlIHNwYWNlIGZvciB0aGUgdGVybWluYXRpbmcgTlVMCisgICAgICB2c25wcmludGYoc3RyQnVmZmVyICsgbiwgV1BBTF9UUkFDRV9CVUZGRVJfU0laRSAtIG4gLSAxLCBzdHJGb3JtYXQsIHZhbCk7CisgICAgICB3cGFsT3V0cHV0KGxldmVsLCBzdHJCdWZmZXIpOworICAgICAgdmFfZW5kKHZhbCk7CisgICB9Cit9CisKKy8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgXGJyaWVmIFdQQUxfRFVNUCgpIC8gd3BhbER1bXAoKSAtIFRyYWNlIC8gbG9nZ2luZyBBUEkKKyAgIAorIFVzZXJzIHdpc2hpbmcgdG8gYWRkIHRyYWNpbmcgbWVtb3J5IGR1bXBzIHRvIHRoZWlyIGNvZGUgc2hvdWxkIHVzZSAKKyBXUEFMX0RVTVAuICBXUEFMX0RVTVAoKSB3aWxsIGNvbXBpbGUgaW50byBhIGNhbGwgdG8gd3BhbER1bXAoKSB3aGVuCisgdHJhY2luZyBpcyBlbmFibGVkLgorICAKKyBccGFyYW0gbW9kdWxlIC0gbW9kdWxlIGlkZW50aWZpZXIuICAgQSBtZW1iZXIgb2YgdGhlIHdwdF9tb2R1bGVpZAorICAgICAgICAgICAgICAgICBlbnVtZXJhdGlvbiB0aGF0IGlkZW50aWZpZXMgdGhlIG1vZHVsZSBwZXJmb3JtaW5nIHRoZSBkdW1wCisgICAgICAgICAKKyBccGFyYW0gbGV2ZWwgLSB0cmFjZSBsZXZlbC4gICBBIG1lbWJlciBvZiB0aGUgd3B0X3RyYWNlbGV2ZWwgCisgICAgICAgICAgICAgICAgZW51bWVyYXRpb24gaW5kaWNhdGluZyB0aGUgc2V2ZXJpdHkgb2YgdGhlIGNvbmRpdGlvbiBjYXVzaW5nIHRoZQorICAgICAgICAgICAgICAgIG1lbW9yeSB0byBiZSBkdW1wZWQuICAgTW9yZSBzZXZlcmUgY29uZGl0aW9ucyBhcmUgbW9yZSAKKyAgICAgICAgICAgICAgICBsaWtlbHkgdG8gYmUgbG9nZ2VkLgorICAgICAgICAgCisgXHBhcmFtIHBNZW1vcnkgLSBtZW1vcnkuICBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSB0byBiZSBkdW1wZWQKKworIFxwYXJhbSBsZW5ndGggLSBsZW5ndGguICBIb3cgbWFueSBieXRlcyBvZiBtZW1vcnkgdG8gYmUgZHVtcGVkCisgIAorICAgXHJldHVybiAgbm90aGluZworICAgIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBob3cgbWFueSBieXRlcyBkbyB3ZSBvdXRwdXQgcGVyIGxpbmUKKyNkZWZpbmUgQllURVNfUEVSX0xJTkUgMTYKKworLy8gZWFjaCBieXRlIHRha2VzIDIgY2hhcmFjdGVycyBwbHVzIGEgc3BhY2UsIHBsdXMgbmVlZCByb29tIGZvciBOVUwKKyNkZWZpbmUgQ0hBUlNfUEVSX0xJTkUgKChCWVRFU19QRVJfTElORSAqIDMpICsgMSkKKwordm9pZCB3cGFsRHVtcCggd3B0X21vZHVsZWlkIG1vZHVsZSwgd3B0X3RyYWNlbGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICB3cHRfdWludDggKnBNZW1vcnksIHdwdF91aW50MzIgbGVuZ3RoKQoreworICAgY2hhciBzdHJCdWZmZXJbQ0hBUlNfUEVSX0xJTkVdOworICAgaW50IG4sIG51bSwgb2Zmc2V0OworCisgICAvLyBEdW1wIHRoZSBtZW1vcnkgd2hlbiB0aGUgZGVzaXJlZCBsZXZlbCBiaXQgaXMgc2V0IGluIHRoZSBtb2R1bGUKKyAgIC8vIHRyYWNlbCBsZXZlbCBtYXNrLgorICAgaWYgKCBnVHJhY2VJbmZvWyBtb2R1bGUgXS5tb2R1bGVUcmFjZUxldmVsICYgV1BBTF9UUkFDRV9MRVZFTF9UT19NT0RVTEVfQklUTUFTSyggbGV2ZWwgKSApCisgICB7CisgICAgICBudW0gPSAwOworICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgIHdoaWxlIChsZW5ndGggPiAwKQorICAgICAgeworICAgICAgICAgbiA9IHNucHJpbnRmKHN0ckJ1ZmZlciArIG9mZnNldCwgQ0hBUlNfUEVSX0xJTkUgLSBvZmZzZXQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICIlMDJYICIsICpwTWVtb3J5KTsKKyAgICAgICAgIG9mZnNldCArPSBuOworICAgICAgICAgbnVtKys7CisgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgIHBNZW1vcnkrKzsKKyAgICAgICAgIGlmIChCWVRFU19QRVJfTElORSA9PSBudW0pCisgICAgICAgICB7CisgICAgICAgICAgICB3cGFsT3V0cHV0KGxldmVsLCBzdHJCdWZmZXIpOworICAgICAgICAgICAgbnVtID0gMDsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChvZmZzZXQgPiAwKQorICAgICAgeworICAgICAgICAgLy8gcGFydGlhbCBsaW5lIHJlbWFpbnMKKyAgICAgICAgIHdwYWxPdXRwdXQobGV2ZWwsIHN0ckJ1ZmZlcik7CisgICAgICB9CisgICB9Cit9CisjZW5kaWYgLy9XTEFOX0RFQlVHCg==